diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5bc8b0017..119d23484 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,7 +2,7 @@ `studio-go-runner` is an open source project. -It originated within Sentient Technologies and is now open for others to use. We hope that it offers value to those who engage with the project. We appreciate your help! +It originated within Sentient Technologies, maintained by Cognizant Evolutionary AI team, and is now open for others to use. We hope that it offers value to those who engage with the project. We appreciate your help! ## Filing issues (any) -// ^1.2.3 --> >=1.2.3 <2.0.0 -// ^1.2 --> >=1.2.0 <2.0.0 -// ^1 --> >=1.0.0 <2.0.0 -// ^0.2.3 --> >=0.2.3 <0.3.0 -// ^0.2 --> >=0.2.0 <0.3.0 -// ^0.0.3 --> >=0.0.3 <0.0.4 -// ^0.0 --> >=0.0.0 <0.1.0 -// ^0 --> >=0.0.0 <1.0.0 +// ^* --> (any) +// ^2, ^2.x, ^2.x.x --> >=2.0.0, <3.0.0 +// ^2.0, ^2.0.x --> >=2.0.0, <3.0.0 +// ^1.2, ^1.2.x --> >=1.2.0, <2.0.0 +// ^1.2.3 --> >=1.2.3, <2.0.0 +// ^1.2.0 --> >=1.2.0, <2.0.0 func constraintCaret(v *Version, c *constraint) bool { // If there is a pre-release on the version but the constraint isn't looking // for them assume that pre-releases are not compatible. See issue 21 for @@ -478,31 +382,23 @@ func constraintCaret(v *Version, c *constraint) bool { return false } - // This less than handles prereleases if v.LessThan(c.con) { return false } - // ^ when the major > 0 is >=x.y.z < x+1 - if c.con.Major() > 0 || c.minorDirty { - - // ^ has to be within a major range for > 0. Everything less than was - // filtered out with the LessThan call above. This filters out those - // that greater but not within the same major range. - return v.Major() == c.con.Major() - } - - // ^ when the major is 0 and minor > 0 is >=0.y.z < 0.y+1 - // If the con Minor is > 0 it is not dirty - if c.con.Minor() > 0 || c.patchDirty { - return v.Minor() == c.con.Minor() + if v.Major() != c.con.Major() { + return false } - // At this point the major is 0 and the minor is 0 and not dirty. The patch - // is not dirty so we need to check if they are equal. If they are not equal - return c.con.Patch() == v.Patch() + return true } +var constraintRangeRegex *regexp.Regexp + +const cvRegex string = `v?([0-9|x|X|\*]+)(\.[0-9|x|X|\*]+)?(\.[0-9|x|X|\*]+)?` + + `(-([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?` + + `(\+([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?` + func isX(x string) bool { switch x { case "x", "*", "X": diff --git a/vendor/github.com/Masterminds/semver/doc.go b/vendor/github.com/Masterminds/semver/doc.go index 34d78f220..6a6c24c6d 100644 --- a/vendor/github.com/Masterminds/semver/doc.go +++ b/vendor/github.com/Masterminds/semver/doc.go @@ -10,23 +10,14 @@ Specifically it provides the ability to: Parsing Semantic Versions -There are two functions that can parse semantic versions. The `StrictNewVersion` -function only parses valid version 2 semantic versions as outlined in the -specification. The `NewVersion` function attempts to coerce a version into a -semantic version and parse it. For example, if there is a leading v or a version -listed without all 3 parts (e.g. 1.2) it will attempt to coerce it into a valid -semantic version (e.g., 1.2.0). In both cases a `Version` object is returned -that can be sorted, compared, and used in constraints. - -When parsing a version an optional error can be returned if there is an issue -parsing the version. For example, +To parse a semantic version use the `NewVersion` function. For example, v, err := semver.NewVersion("1.2.3-beta.1+build345") -The version object has methods to get the parts of the version, compare it to -other versions, convert the version back into a string, and get the original -string. For more details please see the documentation -at https://godoc.org/github.com/Masterminds/semver. +If there is an error the version wasn't parseable. The version object has methods +to get the parts of the version, compare it to other versions, convert the +version back into a string, and get the original string. For more details +please see the documentation at https://godoc.org/github.com/Masterminds/semver. Sorting Semantic Versions @@ -46,44 +37,19 @@ For example, sort.Sort(semver.Collection(vs)) -Checking Version Constraints and Comparing Versions - -There are two methods for comparing versions. One uses comparison methods on -`Version` instances and the other is using Constraints. There are some important -differences to notes between these two methods of comparison. - -1. When two versions are compared using functions such as `Compare`, `LessThan`, - and others it will follow the specification and always include prereleases - within the comparison. It will provide an answer valid with the comparison - spec section at https://semver.org/#spec-item-11 -2. When constraint checking is used for checks or validation it will follow a - different set of rules that are common for ranges with tools like npm/js - and Rust/Cargo. This includes considering prereleases to be invalid if the - ranges does not include on. If you want to have it include pre-releases a - simple solution is to include `-0` in your range. -3. Constraint ranges can have some complex rules including the shorthard use of - ~ and ^. For more details on those see the options below. - -There are differences between the two methods or checking versions because the -comparison methods on `Version` follow the specification while comparison ranges -are not part of the specification. Different packages and tools have taken it -upon themselves to come up with range rules. This has resulted in differences. -For example, npm/js and Cargo/Rust follow similar patterns which PHP has a -different pattern for ^. The comparison features in this package follow the -npm/js and Cargo/Rust lead because applications using it have followed similar -patters with their versions. +Checking Version Constraints Checking a version against version constraints is one of the most featureful parts of the package. c, err := semver.NewConstraint(">= 1.2.3") if err != nil { - // Handle constraint not being parsable. + // Handle constraint not being parseable. } v, err := semver.NewVersion("1.3") if err != nil { - // Handle version not being parsable. + // Handle version not being parseable. } // Check if the version meets the constraints. The a variable will be true. a := c.Check(v) @@ -91,11 +57,10 @@ parts of the package. Basic Comparisons There are two elements to the comparisons. First, a comparison string is a list -of comma or space separated AND comparisons. These are then separated by || (OR) -comparisons. For example, `">= 1.2 < 3.0.0 || >= 4.2.3"` is looking for a +of comma separated and comparisons. These are then separated by || separated or +comparisons. For example, `">= 1.2, < 3.0.0 || >= 4.2.3"` is looking for a comparison that's greater than or equal to 1.2 and less than 3.0.0 or is -greater than or equal to 4.2.3. This can also be written as -`">= 1.2, < 3.0.0 || >= 4.2.3"` +greater than or equal to 4.2.3. The basic comparisons are: @@ -112,15 +77,15 @@ There are multiple methods to handle ranges and the first is hyphens ranges. These look like: * `1.2 - 1.4.5` which is equivalent to `>= 1.2, <= 1.4.5` - * `2.3.4 - 4.5` which is equivalent to `>= 2.3.4 <= 4.5` + * `2.3.4 - 4.5` which is equivalent to `>= 2.3.4, <= 4.5` Wildcards In Comparisons The `x`, `X`, and `*` characters can be used as a wildcard character. This works for all comparison operators. When used on the `=` operator it falls -back to the tilde operation. For example, +back to the pack level comparison (see tilde below). For example, - * `1.2.x` is equivalent to `>= 1.2.0 < 1.3.0` + * `1.2.x` is equivalent to `>= 1.2.0, < 1.3.0` * `>= 1.2.x` is equivalent to `>= 1.2.0` * `<= 2.x` is equivalent to `<= 3` * `*` is equivalent to `>= 0.0.0` @@ -131,54 +96,20 @@ The tilde (`~`) comparison operator is for patch level ranges when a minor version is specified and major level changes when the minor number is missing. For example, - * `~1.2.3` is equivalent to `>= 1.2.3 < 1.3.0` + * `~1.2.3` is equivalent to `>= 1.2.3, < 1.3.0` * `~1` is equivalent to `>= 1, < 2` - * `~2.3` is equivalent to `>= 2.3 < 2.4` - * `~1.2.x` is equivalent to `>= 1.2.0 < 1.3.0` - * `~1.x` is equivalent to `>= 1 < 2` + * `~2.3` is equivalent to `>= 2.3, < 2.4` + * `~1.2.x` is equivalent to `>= 1.2.0, < 1.3.0` + * `~1.x` is equivalent to `>= 1, < 2` Caret Range Comparisons (Major) -The caret (`^`) comparison operator is for major level changes once a stable -(1.0.0) release has occurred. Prior to a 1.0.0 release the minor versions acts -as the API stability level. This is useful when comparisons of API versions as a -major change is API breaking. For example, +The caret (`^`) comparison operator is for major level changes. This is useful +when comparisons of API versions as a major change is API breaking. For example, * `^1.2.3` is equivalent to `>= 1.2.3, < 2.0.0` * `^1.2.x` is equivalent to `>= 1.2.0, < 2.0.0` * `^2.3` is equivalent to `>= 2.3, < 3` * `^2.x` is equivalent to `>= 2.0.0, < 3` - * `^0.2.3` is equivalent to `>=0.2.3 <0.3.0` - * `^0.2` is equivalent to `>=0.2.0 <0.3.0` - * `^0.0.3` is equivalent to `>=0.0.3 <0.0.4` - * `^0.0` is equivalent to `>=0.0.0 <0.1.0` - * `^0` is equivalent to `>=0.0.0 <1.0.0` - -Validation - -In addition to testing a version against a constraint, a version can be validated -against a constraint. When validation fails a slice of errors containing why a -version didn't meet the constraint is returned. For example, - - c, err := semver.NewConstraint("<= 1.2.3, >= 1.4") - if err != nil { - // Handle constraint not being parseable. - } - - v, _ := semver.NewVersion("1.3") - if err != nil { - // Handle version not being parseable. - } - - // Validate a version against a constraint. - a, msgs := c.Validate(v) - // a is false - for _, m := range msgs { - fmt.Println(m) - - // Loops over the errors which would read - // "1.3 is greater than 1.2.3" - // "1.3 is less than 1.4" - } */ package semver diff --git a/vendor/github.com/Masterminds/semver/fuzz.go b/vendor/github.com/Masterminds/semver/fuzz.go deleted file mode 100644 index a242ad705..000000000 --- a/vendor/github.com/Masterminds/semver/fuzz.go +++ /dev/null @@ -1,22 +0,0 @@ -// +build gofuzz - -package semver - -func Fuzz(data []byte) int { - d := string(data) - - // Test NewVersion - _, _ = NewVersion(d) - - // Test StrictNewVersion - _, _ = StrictNewVersion(d) - - // Test NewConstraint - _, _ = NewConstraint(d) - - // The return value should be 0 normally, 1 if the priority in future tests - // should be increased, and -1 if future tests should skip passing in that - // data. We do not have a reason to change priority so 0 is always returned. - // There are example tests that do this. - return 0 -} diff --git a/vendor/github.com/Masterminds/semver/go.mod b/vendor/github.com/Masterminds/semver/go.mod deleted file mode 100644 index 658233c8f..000000000 --- a/vendor/github.com/Masterminds/semver/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/Masterminds/semver/v3 - -go 1.12 diff --git a/vendor/github.com/Masterminds/semver/version.go b/vendor/github.com/Masterminds/semver/version.go index 1bb95f263..400d4f934 100644 --- a/vendor/github.com/Masterminds/semver/version.go +++ b/vendor/github.com/Masterminds/semver/version.go @@ -13,23 +13,13 @@ import ( // The compiled version of the regex created at init() is cached here so it // only needs to be created once. var versionRegex *regexp.Regexp +var validPrereleaseRegex *regexp.Regexp var ( // ErrInvalidSemVer is returned a version is found to be invalid when // being parsed. ErrInvalidSemVer = errors.New("Invalid Semantic Version") - // ErrEmptyString is returned when an empty string is passed in for parsing. - ErrEmptyString = errors.New("Version string empty") - - // ErrInvalidCharacters is returned when invalid characters are found as - // part of a version - ErrInvalidCharacters = errors.New("Invalid characters in version") - - // ErrSegmentStartsZero is returned when a version segment starts with 0. - // This is invalid in SemVer. - ErrSegmentStartsZero = errors.New("Version segment starts with 0") - // ErrInvalidMetadata is returned when the metadata is an invalid format ErrInvalidMetadata = errors.New("Invalid Metadata string") @@ -37,121 +27,30 @@ var ( ErrInvalidPrerelease = errors.New("Invalid Prerelease string") ) -// semVerRegex is the regular expression used to parse a semantic version. -const semVerRegex string = `v?([0-9]+)(\.[0-9]+)?(\.[0-9]+)?` + +// SemVerRegex is the regular expression used to parse a semantic version. +const SemVerRegex string = `v?([0-9]+)(\.[0-9]+)?(\.[0-9]+)?` + `(-([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?` + `(\+([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?` +// ValidPrerelease is the regular expression which validates +// both prerelease and metadata values. +const ValidPrerelease string = `^([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*)$` + // Version represents a single semantic version. type Version struct { - major, minor, patch uint64 + major, minor, patch int64 pre string metadata string original string } func init() { - versionRegex = regexp.MustCompile("^" + semVerRegex + "$") -} - -const num string = "0123456789" -const allowed string = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-" + num - -// StrictNewVersion parses a given version and returns an instance of Version or -// an error if unable to parse the version. Only parses valid semantic versions. -// Performs checking that can find errors within the version. -// If you want to coerce a version, such as 1 or 1.2, and perse that as the 1.x -// releases of semver provided use the NewSemver() function. -func StrictNewVersion(v string) (*Version, error) { - // Parsing here does not use RegEx in order to increase performance and reduce - // allocations. - - if len(v) == 0 { - return nil, ErrEmptyString - } - - // Split the parts into [0]major, [1]minor, and [2]patch,prerelease,build - parts := strings.SplitN(v, ".", 3) - if len(parts) != 3 { - return nil, ErrInvalidSemVer - } - - sv := &Version{ - original: v, - } - - // check for prerelease or build metadata - var extra []string - if strings.ContainsAny(parts[2], "-+") { - // Start with the build metadata first as it needs to be on the right - extra = strings.SplitN(parts[2], "+", 2) - if len(extra) > 1 { - // build metadata found - sv.metadata = extra[1] - parts[2] = extra[0] - } - - extra = strings.SplitN(parts[2], "-", 2) - if len(extra) > 1 { - // prerelease found - sv.pre = extra[1] - parts[2] = extra[0] - } - } - - // Validate the number segments are valid. This includes only having positive - // numbers and no leading 0's. - for _, p := range parts { - if !containsOnly(p, num) { - return nil, ErrInvalidCharacters - } - - if len(p) > 1 && p[0] == '0' { - return nil, ErrSegmentStartsZero - } - } - - // Extract the major, minor, and patch elements onto the returned Version - var err error - sv.major, err = strconv.ParseUint(parts[0], 10, 64) - if err != nil { - return nil, err - } - - sv.minor, err = strconv.ParseUint(parts[1], 10, 64) - if err != nil { - return nil, err - } - - sv.patch, err = strconv.ParseUint(parts[2], 10, 64) - if err != nil { - return nil, err - } - - // No prerelease or build metadata found so returning now as a fastpath. - if sv.pre == "" && sv.metadata == "" { - return sv, nil - } - - if sv.pre != "" { - if err = validatePrerelease(sv.pre); err != nil { - return nil, err - } - } - - if sv.metadata != "" { - if err = validateMetadata(sv.metadata); err != nil { - return nil, err - } - } - - return sv, nil + versionRegex = regexp.MustCompile("^" + SemVerRegex + "$") + validPrereleaseRegex = regexp.MustCompile(ValidPrerelease) } // NewVersion parses a given version and returns an instance of Version or -// an error if unable to parse the version. If the version is SemVer-ish it -// attempts to convert it to SemVer. If you want to validate it was a strict -// semantic version at parse time see StrictNewVersion(). +// an error if unable to parse the version. func NewVersion(v string) (*Version, error) { m := versionRegex.FindStringSubmatch(v) if m == nil { @@ -164,45 +63,33 @@ func NewVersion(v string) (*Version, error) { original: v, } - var err error - sv.major, err = strconv.ParseUint(m[1], 10, 64) + var temp int64 + temp, err := strconv.ParseInt(m[1], 10, 64) if err != nil { return nil, fmt.Errorf("Error parsing version segment: %s", err) } + sv.major = temp if m[2] != "" { - sv.minor, err = strconv.ParseUint(strings.TrimPrefix(m[2], "."), 10, 64) + temp, err = strconv.ParseInt(strings.TrimPrefix(m[2], "."), 10, 64) if err != nil { return nil, fmt.Errorf("Error parsing version segment: %s", err) } + sv.minor = temp } else { sv.minor = 0 } if m[3] != "" { - sv.patch, err = strconv.ParseUint(strings.TrimPrefix(m[3], "."), 10, 64) + temp, err = strconv.ParseInt(strings.TrimPrefix(m[3], "."), 10, 64) if err != nil { return nil, fmt.Errorf("Error parsing version segment: %s", err) } + sv.patch = temp } else { sv.patch = 0 } - // Perform some basic due diligence on the extra parts to ensure they are - // valid. - - if sv.pre != "" { - if err = validatePrerelease(sv.pre); err != nil { - return nil, err - } - } - - if sv.metadata != "" { - if err = validateMetadata(sv.metadata); err != nil { - return nil, err - } - } - return sv, nil } @@ -220,7 +107,7 @@ func MustParse(v string) *Version { // See the Original() method to retrieve the original value. Semantic Versions // don't contain a leading v per the spec. Instead it's optional on // implementation. -func (v Version) String() string { +func (v *Version) String() string { var buf bytes.Buffer fmt.Fprintf(&buf, "%d.%d.%d", v.major, v.minor, v.patch) @@ -240,32 +127,32 @@ func (v *Version) Original() string { } // Major returns the major version. -func (v Version) Major() uint64 { +func (v *Version) Major() int64 { return v.major } // Minor returns the minor version. -func (v Version) Minor() uint64 { +func (v *Version) Minor() int64 { return v.minor } // Patch returns the patch version. -func (v Version) Patch() uint64 { +func (v *Version) Patch() int64 { return v.patch } // Prerelease returns the pre-release version. -func (v Version) Prerelease() string { +func (v *Version) Prerelease() string { return v.pre } // Metadata returns the metadata on the version. -func (v Version) Metadata() string { +func (v *Version) Metadata() string { return v.metadata } // originalVPrefix returns the original 'v' prefix if any. -func (v Version) originalVPrefix() string { +func (v *Version) originalVPrefix() string { // Note, only lowercase v is supported as a prefix by the parser. if v.original != "" && v.original[:1] == "v" { @@ -278,7 +165,7 @@ func (v Version) originalVPrefix() string { // If the current version does not have prerelease/metadata information, // it unsets metadata and prerelease values, increments patch number. // If the current version has any of prerelease or metadata information, -// it unsets both values and keeps current patch value +// it unsets both values and keeps curent patch value func (v Version) IncPatch() Version { vNext := v // according to http://semver.org/#spec-item-9 @@ -330,13 +217,11 @@ func (v Version) IncMajor() Version { } // SetPrerelease defines the prerelease value. -// Value must not include the required 'hyphen' prefix. +// Value must not include the required 'hypen' prefix. func (v Version) SetPrerelease(prerelease string) (Version, error) { vNext := v - if len(prerelease) > 0 { - if err := validatePrerelease(prerelease); err != nil { - return vNext, err - } + if len(prerelease) > 0 && !validPrereleaseRegex.MatchString(prerelease) { + return vNext, ErrInvalidPrerelease } vNext.pre = prerelease vNext.original = v.originalVPrefix() + "" + vNext.String() @@ -347,10 +232,8 @@ func (v Version) SetPrerelease(prerelease string) (Version, error) { // Value must not include the required 'plus' prefix. func (v Version) SetMetadata(metadata string) (Version, error) { vNext := v - if len(metadata) > 0 { - if err := validateMetadata(metadata); err != nil { - return vNext, err - } + if len(metadata) > 0 && !validPrereleaseRegex.MatchString(metadata) { + return vNext, ErrInvalidMetadata } vNext.metadata = metadata vNext.original = v.originalVPrefix() + "" + vNext.String() @@ -378,9 +261,7 @@ func (v *Version) Equal(o *Version) bool { // the version smaller, equal, or larger than the other version. // // Versions are compared by X.Y.Z. Build metadata is ignored. Prerelease is -// lower than the version without a prerelease. Compare always takes into account -// prereleases. If you want to work with ranges using typical range syntaxes that -// skip prereleases if the range is not looking for them use constraints. +// lower than the version without a prerelease. func (v *Version) Compare(o *Version) int { // Compare the major, minor, and patch version for differences. If a // difference is found return the comparison. @@ -427,15 +308,16 @@ func (v *Version) UnmarshalJSON(b []byte) error { v.pre = temp.pre v.metadata = temp.metadata v.original = temp.original + temp = nil return nil } // MarshalJSON implements JSON.Marshaler interface. -func (v Version) MarshalJSON() ([]byte, error) { +func (v *Version) MarshalJSON() ([]byte, error) { return json.Marshal(v.String()) } -func compareSegment(v, o uint64) int { +func compareSegment(v, o int64) int { if v < o { return -1 } @@ -541,43 +423,3 @@ func comparePrePart(s, o string) int { return -1 } - -// Like strings.ContainsAny but does an only instead of any. -func containsOnly(s string, comp string) bool { - return strings.IndexFunc(s, func(r rune) bool { - return !strings.ContainsRune(comp, r) - }) == -1 -} - -// From the spec, "Identifiers MUST comprise only -// ASCII alphanumerics and hyphen [0-9A-Za-z-]. Identifiers MUST NOT be empty. -// Numeric identifiers MUST NOT include leading zeroes.". These segments can -// be dot separated. -func validatePrerelease(p string) error { - eparts := strings.Split(p, ".") - for _, p := range eparts { - if containsOnly(p, num) { - if len(p) > 1 && p[0] == '0' { - return ErrSegmentStartsZero - } - } else if !containsOnly(p, allowed) { - return ErrInvalidPrerelease - } - } - - return nil -} - -// From the spec, "Build metadata MAY be denoted by -// appending a plus sign and a series of dot separated identifiers immediately -// following the patch or pre-release version. Identifiers MUST comprise only -// ASCII alphanumerics and hyphen [0-9A-Za-z-]. Identifiers MUST NOT be empty." -func validateMetadata(m string) error { - eparts := strings.Split(m, ".") - for _, p := range eparts { - if !containsOnly(p, allowed) { - return ErrInvalidMetadata - } - } - return nil -} diff --git a/vendor/github.com/Masterminds/semver/version_fuzz.go b/vendor/github.com/Masterminds/semver/version_fuzz.go new file mode 100644 index 000000000..b42bcd62b --- /dev/null +++ b/vendor/github.com/Masterminds/semver/version_fuzz.go @@ -0,0 +1,10 @@ +// +build gofuzz + +package semver + +func Fuzz(data []byte) int { + if _, err := NewVersion(string(data)); err != nil { + return 0 + } + return 1 +} diff --git a/vendor/github.com/Masterminds/sprig/.travis.yml b/vendor/github.com/Masterminds/sprig/.travis.yml index 482aa3cd0..b9da8b825 100644 --- a/vendor/github.com/Masterminds/sprig/.travis.yml +++ b/vendor/github.com/Masterminds/sprig/.travis.yml @@ -4,6 +4,8 @@ go: - 1.9.x - 1.10.x - 1.11.x + - 1.12.x + - 1.13.x - tip # Setting sudo access to false will let Travis CI use containers rather than diff --git a/vendor/github.com/Masterminds/sprig/CHANGELOG.md b/vendor/github.com/Masterminds/sprig/CHANGELOG.md index 445937138..6a79fbde4 100644 --- a/vendor/github.com/Masterminds/sprig/CHANGELOG.md +++ b/vendor/github.com/Masterminds/sprig/CHANGELOG.md @@ -1,5 +1,134 @@ # Changelog +## Release 2.22.0 (2019-10-02) + +### Added + +- #173: Added getHostByName function to resolve dns names to ips (thanks @fcgravalos) +- #195: Added deepCopy function for use with dicts + +### Changed + +- Updated merge and mergeOverwrite documentation to explain copying and how to + use deepCopy with it + +## Release 2.21.0 (2019-09-18) + +### Added + +- #122: Added encryptAES/decryptAES functions (thanks @n0madic) +- #128: Added toDecimal support (thanks @Dean-Coakley) +- #169: Added list contcat (thanks @astorath) +- #174: Added deepEqual function (thanks @bonifaido) +- #170: Added url parse and join functions (thanks @astorath) + +### Changed + +- #171: Updated glide config for Google UUID to v1 and to add ranges to semver and testify + +### Fixed + +- #172: Fix semver wildcard example (thanks @piepmatz) +- #175: Fix dateInZone doc example (thanks @s3than) + +## Release 2.20.0 (2019-06-18) + +### Added + +- #164: Adding function to get unix epoch for a time (@mattfarina) +- #166: Adding tests for date_in_zone (@mattfarina) + +### Changed + +- #144: Fix function comments based on best practices from Effective Go (@CodeLingoTeam) +- #150: Handles pointer type for time.Time in "htmlDate" (@mapreal19) +- #161, #157, #160, #153, #158, #156, #155, #159, #152 documentation updates (@badeadan) + +### Fixed + +## Release 2.19.0 (2019-03-02) + +IMPORTANT: This release reverts a change from 2.18.0 + +In the previous release (2.18), we prematurely merged a partial change to the crypto functions that led to creating two sets of crypto functions (I blame @technosophos -- since that's me). This release rolls back that change, and does what was originally intended: It alters the existing crypto functions to use secure random. + +We debated whether this classifies as a change worthy of major revision, but given the proximity to the last release, we have decided that treating 2.18 as a faulty release is the correct course of action. We apologize for any inconvenience. + +### Changed + +- Fix substr panic 35fb796 (Alexey igrychev) +- Remove extra period 1eb7729 (Matthew Lorimor) +- Make random string functions use crypto by default 6ceff26 (Matthew Lorimor) +- README edits/fixes/suggestions 08fe136 (Lauri Apple) + + +## Release 2.18.0 (2019-02-12) + +### Added + +- Added mergeOverwrite function +- cryptographic functions that use secure random (see fe1de12) + +### Changed + +- Improve documentation of regexMatch function, resolves #139 90b89ce (Jan Tagscherer) +- Handle has for nil list 9c10885 (Daniel Cohen) +- Document behaviour of mergeOverwrite fe0dbe9 (Lukas Rieder) +- doc: adds missing documentation. 4b871e6 (Fernandez Ludovic) +- Replace outdated goutils imports 01893d2 (Matthew Lorimor) +- Surface crypto secure random strings from goutils fe1de12 (Matthew Lorimor) +- Handle untyped nil values as paramters to string functions 2b2ec8f (Morten Torkildsen) + +### Fixed + +- Fix dict merge issue and provide mergeOverwrite .dst .src1 to overwrite from src -> dst 4c59c12 (Lukas Rieder) +- Fix substr var names and comments d581f80 (Dean Coakley) +- Fix substr documentation 2737203 (Dean Coakley) + +## Release 2.17.1 (2019-01-03) + +### Fixed + +The 2.17.0 release did not have a version pinned for xstrings, which caused compilation failures when xstrings < 1.2 was used. This adds the correct version string to glide.yaml. + +## Release 2.17.0 (2019-01-03) + +### Added + +- adds alder32sum function and test 6908fc2 (marshallford) +- Added kebabcase function ca331a1 (Ilyes512) + +### Changed + +- Update goutils to 1.1.0 4e1125d (Matt Butcher) + +### Fixed + +- Fix 'has' documentation e3f2a85 (dean-coakley) +- docs(dict): fix typo in pick example dc424f9 (Dustin Specker) +- fixes spelling errors... not sure how that happened 4cf188a (marshallford) + +## Release 2.16.0 (2018-08-13) + +### Added + +- add splitn function fccb0b0 (Helgi Þorbjörnsson) +- Add slice func df28ca7 (gongdo) +- Generate serial number a3bdffd (Cody Coons) +- Extract values of dict with values function df39312 (Lawrence Jones) + +### Changed + +- Modify panic message for list.slice ae38335 (gongdo) +- Minor improvement in code quality - Removed an unreachable piece of code at defaults.go#L26:6 - Resolve formatting issues. 5834241 (Abhishek Kashyap) +- Remove duplicated documentation 1d97af1 (Matthew Fisher) +- Test on go 1.11 49df809 (Helgi Þormar Þorbjörnsson) + +### Fixed + +- Fix file permissions c5f40b5 (gongdo) +- Fix example for buildCustomCert 7779e0d (Tin Lam) + ## Release 2.15.0 (2018-04-02) ### Added diff --git a/vendor/github.com/Masterminds/sprig/README.md b/vendor/github.com/Masterminds/sprig/README.md index 25bf3d4f4..b70569585 100644 --- a/vendor/github.com/Masterminds/sprig/README.md +++ b/vendor/github.com/Masterminds/sprig/README.md @@ -4,21 +4,22 @@ The Go language comes with a [built-in template language](http://golang.org/pkg/text/template/), but not -very many template functions. This library provides a group of commonly +very many template functions. Sprig is a library that provides more than 100 commonly used template functions. It is inspired by the template functions found in -[Twig](http://twig.sensiolabs.org/documentation) and also in various +[Twig](http://twig.sensiolabs.org/documentation) and in various JavaScript libraries, such as [underscore.js](http://underscorejs.org/). ## Usage -Template developers can read the [Sprig function documentation](http://masterminds.github.io/sprig/) to -learn about the >100 template functions available. +**Template developers**: Please use Sprig's [function documentation](http://masterminds.github.io/sprig/) for +detailed instructions and code snippets for the >100 template functions available. -For Go developers wishing to include Sprig as a library in their programs, -API documentation is available [at GoDoc.org](http://godoc.org/github.com/Masterminds/sprig), but -read on for standard usage. +**Go developers**: If you'd like to include Sprig as a library in your program, +our API documentation is available [at GoDoc.org](http://godoc.org/github.com/Masterminds/sprig). + +For standard usage, read on. ### Load the Sprig library @@ -40,31 +41,27 @@ tpl := template.Must( ``` -### Call the functions inside of templates +### Calling the functions inside of templates By convention, all functions are lowercase. This seems to follow the Go idiom for template functions (as opposed to template methods, which are -TitleCase). - - -Example: +TitleCase). For example, this: ``` {{ "hello!" | upper | repeat 5 }} ``` -Produces: +produces this: ``` HELLO!HELLO!HELLO!HELLO!HELLO! ``` -## Principles: +## Principles Driving Our Function Selection -The following principles were used in deciding on which functions to add, and -determining how to implement them. +We followed these principles to decide which functions to add and how to implement them: -- Template functions should be used to build layout. Therefore, the following +- Use template functions to build layout. The following types of operations are within the domain of template functions: - Formatting - Layout @@ -73,7 +70,7 @@ determining how to implement them. - Template functions should not return errors unless there is no way to print a sensible value. For example, converting a string to an integer should not produce an error if conversion fails. Instead, it should display a default - value that can be displayed. + value. - Simple math is necessary for grid layouts, pagers, and so on. Complex math (anything other than arithmetic) should be done outside of templates. - Template functions only deal with the data passed into them. They never retrieve diff --git a/vendor/github.com/Masterminds/sprig/crypto.go b/vendor/github.com/Masterminds/sprig/crypto.go index dc6579d6c..7a418ba88 100644 --- a/vendor/github.com/Masterminds/sprig/crypto.go +++ b/vendor/github.com/Masterminds/sprig/crypto.go @@ -2,6 +2,8 @@ package sprig import ( "bytes" + "crypto/aes" + "crypto/cipher" "crypto/dsa" "crypto/ecdsa" "crypto/elliptic" @@ -19,6 +21,8 @@ import ( "encoding/pem" "errors" "fmt" + "io" + "hash/adler32" "math/big" "net" "time" @@ -37,6 +41,11 @@ func sha1sum(input string) string { return hex.EncodeToString(hash[:]) } +func adler32sum(input string) string { + hash := adler32.Checksum([]byte(input)) + return fmt.Sprintf("%d", hash) +} + // uuidv4 provides a safe and secure UUID v4 implementation func uuidv4() string { return fmt.Sprintf("%s", uuid.New()) @@ -433,3 +442,61 @@ func getAlternateDNSStrs(alternateDNS []interface{}) ([]string, error) { } return alternateDNSStrs, nil } + +func encryptAES(password string, plaintext string) (string, error) { + if plaintext == "" { + return "", nil + } + + key := make([]byte, 32) + copy(key, []byte(password)) + block, err := aes.NewCipher(key) + if err != nil { + return "", err + } + + content := []byte(plaintext) + blockSize := block.BlockSize() + padding := blockSize - len(content)%blockSize + padtext := bytes.Repeat([]byte{byte(padding)}, padding) + content = append(content, padtext...) + + ciphertext := make([]byte, aes.BlockSize+len(content)) + + iv := ciphertext[:aes.BlockSize] + if _, err := io.ReadFull(rand.Reader, iv); err != nil { + return "", err + } + + mode := cipher.NewCBCEncrypter(block, iv) + mode.CryptBlocks(ciphertext[aes.BlockSize:], content) + + return base64.StdEncoding.EncodeToString(ciphertext), nil +} + +func decryptAES(password string, crypt64 string) (string, error) { + if crypt64 == "" { + return "", nil + } + + key := make([]byte, 32) + copy(key, []byte(password)) + + crypt, err := base64.StdEncoding.DecodeString(crypt64) + if err != nil { + return "", err + } + + block, err := aes.NewCipher(key) + if err != nil { + return "", err + } + + iv := crypt[:aes.BlockSize] + crypt = crypt[aes.BlockSize:] + decrypted := make([]byte, len(crypt)) + mode := cipher.NewCBCDecrypter(block, iv) + mode.CryptBlocks(decrypted, crypt) + + return string(decrypted[:len(decrypted)-int(decrypted[len(decrypted)-1])]), nil +} diff --git a/vendor/github.com/Masterminds/sprig/date.go b/vendor/github.com/Masterminds/sprig/date.go index 1c2c3653c..d1d6155d7 100644 --- a/vendor/github.com/Masterminds/sprig/date.go +++ b/vendor/github.com/Masterminds/sprig/date.go @@ -1,6 +1,7 @@ package sprig import ( + "strconv" "time" ) @@ -28,6 +29,8 @@ func dateInZone(fmt string, date interface{}, zone string) string { t = time.Now() case time.Time: t = date + case *time.Time: + t = *date case int64: t = time.Unix(date, 0) case int: @@ -74,3 +77,7 @@ func toDate(fmt, str string) time.Time { t, _ := time.ParseInLocation(fmt, str, time.Local) return t } + +func unixEpoch(date time.Time) string { + return strconv.FormatInt(date.Unix(), 10) +} diff --git a/vendor/github.com/Masterminds/sprig/dict.go b/vendor/github.com/Masterminds/sprig/dict.go index 3713e58a4..738405b43 100644 --- a/vendor/github.com/Masterminds/sprig/dict.go +++ b/vendor/github.com/Masterminds/sprig/dict.go @@ -1,6 +1,9 @@ package sprig -import "github.com/imdario/mergo" +import ( + "github.com/imdario/mergo" + "github.com/mitchellh/copystructure" +) func set(d map[string]interface{}, key string, value interface{}) map[string]interface{} { d[key] = value @@ -87,6 +90,16 @@ func merge(dst map[string]interface{}, srcs ...map[string]interface{}) interface return dst } +func mergeOverwrite(dst map[string]interface{}, srcs ...map[string]interface{}) interface{} { + for _, src := range srcs { + if err := mergo.MergeWithOverwrite(&dst, src); err != nil { + // Swallow errors inside of a template. + return "" + } + } + return dst +} + func values(dict map[string]interface{}) []interface{} { values := []interface{}{} for _, value := range dict { @@ -95,3 +108,12 @@ func values(dict map[string]interface{}) []interface{} { return values } + +func deepCopy(i interface{}) interface{} { + c, err := copystructure.Copy(i) + if err != nil { + panic("deepCopy error: " + err.Error()) + } + + return c +} diff --git a/vendor/github.com/Masterminds/sprig/functions.go b/vendor/github.com/Masterminds/sprig/functions.go index e985e969e..7b5b0af86 100644 --- a/vendor/github.com/Masterminds/sprig/functions.go +++ b/vendor/github.com/Masterminds/sprig/functions.go @@ -5,12 +5,13 @@ import ( "html/template" "os" "path" + "reflect" "strconv" "strings" ttemplate "text/template" "time" - util "github.com/aokoli/goutils" + util "github.com/Masterminds/goutils" "github.com/huandu/xstrings" ) @@ -24,7 +25,7 @@ func FuncMap() template.FuncMap { return HtmlFuncMap() } -// HermeticTextFuncMap returns a 'text/template'.FuncMap with only repeatable functions. +// HermeticTxtFuncMap returns a 'text/template'.FuncMap with only repeatable functions. func HermeticTxtFuncMap() ttemplate.FuncMap { r := TxtFuncMap() for _, name := range nonhermeticFunctions { @@ -42,7 +43,7 @@ func HermeticHtmlFuncMap() template.FuncMap { return r } -// TextFuncMap returns a 'text/template'.FuncMap +// TxtFuncMap returns a 'text/template'.FuncMap func TxtFuncMap() ttemplate.FuncMap { return ttemplate.FuncMap(GenericFuncMap()) } @@ -84,6 +85,9 @@ var nonhermeticFunctions = []string{ // OS "env", "expandenv", + + // Network + "getHostByName", } var genericMap = map[string]interface{}{ @@ -100,6 +104,7 @@ var genericMap = map[string]interface{}{ "dateModify": dateModify, "ago": dateAgo, "toDate": toDate, + "unixEpoch": unixEpoch, // Strings "abbrev": abbrev, @@ -129,28 +134,31 @@ var genericMap = map[string]interface{}{ "shuffle": xstrings.Shuffle, "snakecase": xstrings.ToSnakeCase, "camelcase": xstrings.ToCamelCase, + "kebabcase": xstrings.ToKebabCase, "wrap": func(l int, s string) string { return util.Wrap(s, l) }, "wrapWith": func(l int, sep, str string) string { return util.WrapCustom(str, l, sep, true) }, // Switch order so that "foobar" | contains "foo" - "contains": func(substr string, str string) bool { return strings.Contains(str, substr) }, - "hasPrefix": func(substr string, str string) bool { return strings.HasPrefix(str, substr) }, - "hasSuffix": func(substr string, str string) bool { return strings.HasSuffix(str, substr) }, - "quote": quote, - "squote": squote, - "cat": cat, - "indent": indent, - "nindent": nindent, - "replace": replace, - "plural": plural, - "sha1sum": sha1sum, - "sha256sum": sha256sum, - "toString": strval, + "contains": func(substr string, str string) bool { return strings.Contains(str, substr) }, + "hasPrefix": func(substr string, str string) bool { return strings.HasPrefix(str, substr) }, + "hasSuffix": func(substr string, str string) bool { return strings.HasSuffix(str, substr) }, + "quote": quote, + "squote": squote, + "cat": cat, + "indent": indent, + "nindent": nindent, + "replace": replace, + "plural": plural, + "sha1sum": sha1sum, + "sha256sum": sha256sum, + "adler32sum": adler32sum, + "toString": strval, // Wrap Atoi to stop errors. - "atoi": func(a string) int { i, _ := strconv.Atoi(a); return i }, - "int64": toInt64, - "int": toInt, - "float64": toFloat64, + "atoi": func(a string) int { i, _ := strconv.Atoi(a); return i }, + "int64": toInt64, + "int": toInt, + "float64": toFloat64, + "toDecimal": toDecimal, //"gt": func(a, b int) bool {return a > b}, //"gte": func(a, b int) bool {return a >= b}, @@ -203,6 +211,7 @@ var genericMap = map[string]interface{}{ "empty": empty, "coalesce": coalesce, "compact": compact, + "deepCopy": deepCopy, "toJson": toJson, "toPrettyJson": toPrettyJson, "ternary": ternary, @@ -213,11 +222,15 @@ var genericMap = map[string]interface{}{ "typeIsLike": typeIsLike, "kindOf": kindOf, "kindIs": kindIs, + "deepEqual": reflect.DeepEqual, // OS: "env": func(s string) string { return os.Getenv(s) }, "expandenv": func(s string) string { return os.ExpandEnv(s) }, + // Network: + "getHostByName": getHostByName, + // File Paths: "base": path.Base, "dir": path.Dir, @@ -232,18 +245,19 @@ var genericMap = map[string]interface{}{ "b32dec": base32decode, // Data Structures: - "tuple": list, // FIXME: with the addition of append/prepend these are no longer immutable. - "list": list, - "dict": dict, - "set": set, - "unset": unset, - "hasKey": hasKey, - "pluck": pluck, - "keys": keys, - "pick": pick, - "omit": omit, - "merge": merge, - "values": values, + "tuple": list, // FIXME: with the addition of append/prepend these are no longer immutable. + "list": list, + "dict": dict, + "set": set, + "unset": unset, + "hasKey": hasKey, + "pluck": pluck, + "keys": keys, + "pick": pick, + "omit": omit, + "merge": merge, + "mergeOverwrite": mergeOverwrite, + "values": values, "append": push, "push": push, "prepend": prepend, @@ -256,6 +270,7 @@ var genericMap = map[string]interface{}{ "without": without, "has": has, "slice": slice, + "concat": concat, // Crypto: "genPrivateKey": generatePrivateKey, @@ -264,6 +279,8 @@ var genericMap = map[string]interface{}{ "genCA": generateCertificateAuthority, "genSelfSignedCert": generateSelfSignedCertificate, "genSignedCert": generateSignedCertificate, + "encryptAES": encryptAES, + "decryptAES": decryptAES, // UUIDs: "uuidv4": uuidv4, @@ -282,4 +299,8 @@ var genericMap = map[string]interface{}{ "regexReplaceAll": regexReplaceAll, "regexReplaceAllLiteral": regexReplaceAllLiteral, "regexSplit": regexSplit, + + // URLs: + "urlParse": urlParse, + "urlJoin": urlJoin, } diff --git a/vendor/github.com/Masterminds/sprig/glide.lock b/vendor/github.com/Masterminds/sprig/glide.lock deleted file mode 100644 index 34afeb9c3..000000000 --- a/vendor/github.com/Masterminds/sprig/glide.lock +++ /dev/null @@ -1,33 +0,0 @@ -hash: 770b6a1132b743dadf6a0bb5fb8bf7083b1a5209f6d6c07826234ab2a97aade9 -updated: 2018-04-02T23:08:56.947456531+02:00 -imports: -- name: github.com/aokoli/goutils - version: 9c37978a95bd5c709a15883b6242714ea6709e64 -- name: github.com/google/uuid - version: 064e2069ce9c359c118179501254f67d7d37ba24 -- name: github.com/huandu/xstrings - version: 3959339b333561bf62a38b424fd41517c2c90f40 -- name: github.com/imdario/mergo - version: 7fe0c75c13abdee74b09fcacef5ea1c6bba6a874 -- name: github.com/Masterminds/goutils - version: 3391d3790d23d03408670993e957e8f408993c34 -- name: github.com/Masterminds/semver - version: 59c29afe1a994eacb71c833025ca7acf874bb1da -- name: github.com/stretchr/testify - version: e3a8ff8ce36581f87a15341206f205b1da467059 - subpackages: - - assert -- name: golang.org/x/crypto - version: d172538b2cfce0c13cee31e647d0367aa8cd2486 - subpackages: - - pbkdf2 - - scrypt -testImports: -- name: github.com/davecgh/go-spew - version: 5215b55f46b2b919f50a1df0eaa5886afe4e3b3d - subpackages: - - spew -- name: github.com/pmezard/go-difflib - version: d8ed2627bdf02c080bf22230dbb337003b7aba2d - subpackages: - - difflib diff --git a/vendor/github.com/Masterminds/sprig/glide.yaml b/vendor/github.com/Masterminds/sprig/glide.yaml index 772ba9134..f317d2b2b 100644 --- a/vendor/github.com/Masterminds/sprig/glide.yaml +++ b/vendor/github.com/Masterminds/sprig/glide.yaml @@ -3,13 +3,17 @@ import: - package: github.com/Masterminds/goutils version: ^1.0.0 - package: github.com/google/uuid - version: ^0.2 + version: ^1.0.0 - package: golang.org/x/crypto subpackages: - scrypt - package: github.com/Masterminds/semver - version: v1.2.2 + version: ^v1.2.2 - package: github.com/stretchr/testify + version: ^v1.2.2 - package: github.com/imdario/mergo - version: ~0.2.2 + version: ~0.3.7 - package: github.com/huandu/xstrings + version: ^1.2 +- package: github.com/mitchellh/copystructure + version: ^1.0.0 diff --git a/vendor/github.com/Masterminds/sprig/list.go b/vendor/github.com/Masterminds/sprig/list.go index 184c1ca13..c0381bbb6 100644 --- a/vendor/github.com/Masterminds/sprig/list.go +++ b/vendor/github.com/Masterminds/sprig/list.go @@ -239,6 +239,9 @@ func without(list interface{}, omit ...interface{}) []interface{} { } func has(needle interface{}, haystack interface{}) bool { + if haystack == nil { + return false + } tp := reflect.TypeOf(haystack).Kind() switch tp { case reflect.Slice, reflect.Array: @@ -289,3 +292,20 @@ func slice(list interface{}, indices ...interface{}) interface{} { panic(fmt.Sprintf("list should be type of slice or array but %s", tp)) } } + +func concat(lists ...interface{}) interface{} { + var res []interface{} + for _, list := range lists { + tp := reflect.TypeOf(list).Kind() + switch tp { + case reflect.Slice, reflect.Array: + l2 := reflect.ValueOf(list) + for i := 0; i < l2.Len(); i++ { + res = append(res, l2.Index(i).Interface()) + } + default: + panic(fmt.Sprintf("Cannot concat type %s as list", tp)) + } + } + return res +} diff --git a/vendor/github.com/Masterminds/sprig/network.go b/vendor/github.com/Masterminds/sprig/network.go new file mode 100644 index 000000000..d786cc736 --- /dev/null +++ b/vendor/github.com/Masterminds/sprig/network.go @@ -0,0 +1,12 @@ +package sprig + +import ( + "math/rand" + "net" +) + +func getHostByName(name string) string { + addrs, _ := net.LookupHost(name) + //TODO: add error handing when release v3 cames out + return addrs[rand.Intn(len(addrs))] +} diff --git a/vendor/github.com/Masterminds/sprig/numeric.go b/vendor/github.com/Masterminds/sprig/numeric.go index 4bd89bf7f..f4af4af2a 100644 --- a/vendor/github.com/Masterminds/sprig/numeric.go +++ b/vendor/github.com/Masterminds/sprig/numeric.go @@ -1,6 +1,7 @@ package sprig import ( + "fmt" "math" "reflect" "strconv" @@ -157,3 +158,12 @@ func round(a interface{}, p int, r_opt ...float64) float64 { } return round / pow } + +// converts unix octal to decimal +func toDecimal(v interface{}) int64 { + result, err := strconv.ParseInt(fmt.Sprint(v), 8, 64) + if err != nil { + return 0 + } + return result +} diff --git a/vendor/github.com/Masterminds/sprig/strings.go b/vendor/github.com/Masterminds/sprig/strings.go index 3a6967cfc..943fa3e8a 100644 --- a/vendor/github.com/Masterminds/sprig/strings.go +++ b/vendor/github.com/Masterminds/sprig/strings.go @@ -8,7 +8,7 @@ import ( "strconv" "strings" - util "github.com/aokoli/goutils" + util "github.com/Masterminds/goutils" ) func base64encode(v string) string { @@ -57,22 +57,22 @@ func initials(s string) string { func randAlphaNumeric(count int) string { // It is not possible, it appears, to actually generate an error here. - r, _ := util.RandomAlphaNumeric(count) + r, _ := util.CryptoRandomAlphaNumeric(count) return r } func randAlpha(count int) string { - r, _ := util.RandomAlphabetic(count) + r, _ := util.CryptoRandomAlphabetic(count) return r } func randAscii(count int) string { - r, _ := util.RandomAscii(count) + r, _ := util.CryptoRandomAscii(count) return r } func randNumeric(count int) string { - r, _ := util.RandomNumeric(count) + r, _ := util.CryptoRandomNumeric(count) return r } @@ -81,22 +81,27 @@ func untitle(str string) string { } func quote(str ...interface{}) string { - out := make([]string, len(str)) - for i, s := range str { - out[i] = fmt.Sprintf("%q", strval(s)) + out := make([]string, 0, len(str)) + for _, s := range str { + if s != nil { + out = append(out, fmt.Sprintf("%q", strval(s))) + } } return strings.Join(out, " ") } func squote(str ...interface{}) string { - out := make([]string, len(str)) - for i, s := range str { - out[i] = fmt.Sprintf("'%v'", s) + out := make([]string, 0, len(str)) + for _, s := range str { + if s != nil { + out = append(out, fmt.Sprintf("'%v'", s)) + } } return strings.Join(out, " ") } func cat(v ...interface{}) string { + v = removeNilElements(v) r := strings.TrimSpace(strings.Repeat("%v ", len(v))) return fmt.Sprintf(r, v...) } @@ -126,10 +131,11 @@ func strslice(v interface{}) []string { case []string: return v case []interface{}: - l := len(v) - b := make([]string, l) - for i := 0; i < l; i++ { - b[i] = strval(v[i]) + b := make([]string, 0, len(v)) + for _, s := range v { + if s != nil { + b = append(b, strval(s)) + } } return b default: @@ -137,15 +143,32 @@ func strslice(v interface{}) []string { switch val.Kind() { case reflect.Array, reflect.Slice: l := val.Len() - b := make([]string, l) + b := make([]string, 0, l) for i := 0; i < l; i++ { - b[i] = strval(val.Index(i).Interface()) + value := val.Index(i).Interface() + if value != nil { + b = append(b, strval(value)) + } } return b default: - return []string{strval(v)} + if v == nil { + return []string{} + } else { + return []string{strval(v)} + } + } + } +} + +func removeNilElements(v []interface{}) []interface{} { + newSlice := make([]interface{}, 0, len(v)) + for _, i := range v { + if i != nil { + newSlice = append(newSlice, i) } } + return newSlice } func strval(v interface{}) string { @@ -194,17 +217,17 @@ func splitn(sep string, n int, orig string) map[string]string { // substring creates a substring of the given string. // -// If start is < 0, this calls string[:length]. +// If start is < 0, this calls string[:end]. // -// If start is >= 0 and length < 0, this calls string[start:] +// If start is >= 0 and end < 0 or end bigger than s length, this calls string[start:] // -// Otherwise, this calls string[start, length]. -func substring(start, length int, s string) string { +// Otherwise, this calls string[start, end]. +func substring(start, end int, s string) string { if start < 0 { - return s[:length] + return s[:end] } - if length < 0 { + if end < 0 || end > len(s) { return s[start:] } - return s[start:length] + return s[start:end] } diff --git a/vendor/github.com/Masterminds/sprig/url.go b/vendor/github.com/Masterminds/sprig/url.go new file mode 100644 index 000000000..5f22d801f --- /dev/null +++ b/vendor/github.com/Masterminds/sprig/url.go @@ -0,0 +1,66 @@ +package sprig + +import ( + "fmt" + "net/url" + "reflect" +) + +func dictGetOrEmpty(dict map[string]interface{}, key string) string { + value, ok := dict[key]; if !ok { + return "" + } + tp := reflect.TypeOf(value).Kind() + if tp != reflect.String { + panic(fmt.Sprintf("unable to parse %s key, must be of type string, but %s found", key, tp.String())) + } + return reflect.ValueOf(value).String() +} + +// parses given URL to return dict object +func urlParse(v string) map[string]interface{} { + dict := map[string]interface{}{} + parsedUrl, err := url.Parse(v) + if err != nil { + panic(fmt.Sprintf("unable to parse url: %s", err)) + } + dict["scheme"] = parsedUrl.Scheme + dict["host"] = parsedUrl.Host + dict["hostname"] = parsedUrl.Hostname() + dict["path"] = parsedUrl.Path + dict["query"] = parsedUrl.RawQuery + dict["opaque"] = parsedUrl.Opaque + dict["fragment"] = parsedUrl.Fragment + if parsedUrl.User != nil { + dict["userinfo"] = parsedUrl.User.String() + } else { + dict["userinfo"] = "" + } + + return dict +} + +// join given dict to URL string +func urlJoin(d map[string]interface{}) string { + resUrl := url.URL{ + Scheme: dictGetOrEmpty(d, "scheme"), + Host: dictGetOrEmpty(d, "host"), + Path: dictGetOrEmpty(d, "path"), + RawQuery: dictGetOrEmpty(d, "query"), + Opaque: dictGetOrEmpty(d, "opaque"), + Fragment: dictGetOrEmpty(d, "fragment"), + + } + userinfo := dictGetOrEmpty(d, "userinfo") + var user *url.Userinfo = nil + if userinfo != "" { + tempUrl, err := url.Parse(fmt.Sprintf("proto://%s@host", userinfo)) + if err != nil { + panic(fmt.Sprintf("unable to parse userinfo in dict: %s", err)) + } + user = tempUrl.User + } + + resUrl.User = user + return resUrl.String() +} diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/LICENSE b/vendor/github.com/Microsoft/go-winio/archive/tar/LICENSE deleted file mode 100644 index 744875676..000000000 --- a/vendor/github.com/Microsoft/go-winio/archive/tar/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2012 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/Microsoft/go-winio/file.go b/vendor/github.com/Microsoft/go-winio/file.go index 4334ff1cb..0385e4108 100644 --- a/vendor/github.com/Microsoft/go-winio/file.go +++ b/vendor/github.com/Microsoft/go-winio/file.go @@ -16,6 +16,7 @@ import ( //sys createIoCompletionPort(file syscall.Handle, port syscall.Handle, key uintptr, threadCount uint32) (newport syscall.Handle, err error) = CreateIoCompletionPort //sys getQueuedCompletionStatus(port syscall.Handle, bytes *uint32, key *uintptr, o **ioOperation, timeout uint32) (err error) = GetQueuedCompletionStatus //sys setFileCompletionNotificationModes(h syscall.Handle, flags uint8) (err error) = SetFileCompletionNotificationModes +//sys wsaGetOverlappedResult(h syscall.Handle, o *syscall.Overlapped, bytes *uint32, wait bool, flags *uint32) (err error) = ws2_32.WSAGetOverlappedResult type atomicBool int32 @@ -79,6 +80,7 @@ type win32File struct { wg sync.WaitGroup wgLock sync.RWMutex closing atomicBool + socket bool readDeadline deadlineHandler writeDeadline deadlineHandler } @@ -109,7 +111,13 @@ func makeWin32File(h syscall.Handle) (*win32File, error) { } func MakeOpenFile(h syscall.Handle) (io.ReadWriteCloser, error) { - return makeWin32File(h) + // If we return the result of makeWin32File directly, it can result in an + // interface-wrapped nil, rather than a nil interface value. + f, err := makeWin32File(h) + if err != nil { + return nil, err + } + return f, nil } // closeHandle closes the resources associated with a Win32 handle @@ -190,6 +198,10 @@ func (f *win32File) asyncIo(c *ioOperation, d *deadlineHandler, bytes uint32, er if f.closing.isSet() { err = ErrFileClosed } + } else if err != nil && f.socket { + // err is from Win32. Query the overlapped structure to get the winsock error. + var bytes, flags uint32 + err = wsaGetOverlappedResult(f.handle, &c.o, &bytes, false, &flags) } case <-timeout: cancelIoEx(f.handle, &c.o) @@ -265,6 +277,10 @@ func (f *win32File) Flush() error { return syscall.FlushFileBuffers(f.handle) } +func (f *win32File) Fd() uintptr { + return uintptr(f.handle) +} + func (d *deadlineHandler) set(deadline time.Time) error { d.setLock.Lock() defer d.setLock.Unlock() diff --git a/vendor/github.com/Microsoft/go-winio/go.mod b/vendor/github.com/Microsoft/go-winio/go.mod new file mode 100644 index 000000000..b3846826b --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/go.mod @@ -0,0 +1,9 @@ +module github.com/Microsoft/go-winio + +go 1.12 + +require ( + github.com/pkg/errors v0.8.1 + github.com/sirupsen/logrus v1.4.1 + golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b +) diff --git a/vendor/github.com/Microsoft/go-winio/go.sum b/vendor/github.com/Microsoft/go-winio/go.sum new file mode 100644 index 000000000..babb4a70d --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/go.sum @@ -0,0 +1,16 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b h1:ag/x1USPSsqHud38I9BAC88qdNLDHHtQ4mlgQIZPPNA= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/Microsoft/go-winio/hvsock.go b/vendor/github.com/Microsoft/go-winio/hvsock.go new file mode 100644 index 000000000..dbfe790ee --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/hvsock.go @@ -0,0 +1,305 @@ +package winio + +import ( + "fmt" + "io" + "net" + "os" + "syscall" + "time" + "unsafe" + + "github.com/Microsoft/go-winio/pkg/guid" +) + +//sys bind(s syscall.Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socketError] = ws2_32.bind + +const ( + afHvSock = 34 // AF_HYPERV + + socketError = ^uintptr(0) +) + +// An HvsockAddr is an address for a AF_HYPERV socket. +type HvsockAddr struct { + VMID guid.GUID + ServiceID guid.GUID +} + +type rawHvsockAddr struct { + Family uint16 + _ uint16 + VMID guid.GUID + ServiceID guid.GUID +} + +// Network returns the address's network name, "hvsock". +func (addr *HvsockAddr) Network() string { + return "hvsock" +} + +func (addr *HvsockAddr) String() string { + return fmt.Sprintf("%s:%s", &addr.VMID, &addr.ServiceID) +} + +// VsockServiceID returns an hvsock service ID corresponding to the specified AF_VSOCK port. +func VsockServiceID(port uint32) guid.GUID { + g, _ := guid.FromString("00000000-facb-11e6-bd58-64006a7986d3") + g.Data1 = port + return g +} + +func (addr *HvsockAddr) raw() rawHvsockAddr { + return rawHvsockAddr{ + Family: afHvSock, + VMID: addr.VMID, + ServiceID: addr.ServiceID, + } +} + +func (addr *HvsockAddr) fromRaw(raw *rawHvsockAddr) { + addr.VMID = raw.VMID + addr.ServiceID = raw.ServiceID +} + +// HvsockListener is a socket listener for the AF_HYPERV address family. +type HvsockListener struct { + sock *win32File + addr HvsockAddr +} + +// HvsockConn is a connected socket of the AF_HYPERV address family. +type HvsockConn struct { + sock *win32File + local, remote HvsockAddr +} + +func newHvSocket() (*win32File, error) { + fd, err := syscall.Socket(afHvSock, syscall.SOCK_STREAM, 1) + if err != nil { + return nil, os.NewSyscallError("socket", err) + } + f, err := makeWin32File(fd) + if err != nil { + syscall.Close(fd) + return nil, err + } + f.socket = true + return f, nil +} + +// ListenHvsock listens for connections on the specified hvsock address. +func ListenHvsock(addr *HvsockAddr) (_ *HvsockListener, err error) { + l := &HvsockListener{addr: *addr} + sock, err := newHvSocket() + if err != nil { + return nil, l.opErr("listen", err) + } + sa := addr.raw() + err = bind(sock.handle, unsafe.Pointer(&sa), int32(unsafe.Sizeof(sa))) + if err != nil { + return nil, l.opErr("listen", os.NewSyscallError("socket", err)) + } + err = syscall.Listen(sock.handle, 16) + if err != nil { + return nil, l.opErr("listen", os.NewSyscallError("listen", err)) + } + return &HvsockListener{sock: sock, addr: *addr}, nil +} + +func (l *HvsockListener) opErr(op string, err error) error { + return &net.OpError{Op: op, Net: "hvsock", Addr: &l.addr, Err: err} +} + +// Addr returns the listener's network address. +func (l *HvsockListener) Addr() net.Addr { + return &l.addr +} + +// Accept waits for the next connection and returns it. +func (l *HvsockListener) Accept() (_ net.Conn, err error) { + sock, err := newHvSocket() + if err != nil { + return nil, l.opErr("accept", err) + } + defer func() { + if sock != nil { + sock.Close() + } + }() + c, err := l.sock.prepareIo() + if err != nil { + return nil, l.opErr("accept", err) + } + defer l.sock.wg.Done() + + // AcceptEx, per documentation, requires an extra 16 bytes per address. + const addrlen = uint32(16 + unsafe.Sizeof(rawHvsockAddr{})) + var addrbuf [addrlen * 2]byte + + var bytes uint32 + err = syscall.AcceptEx(l.sock.handle, sock.handle, &addrbuf[0], 0, addrlen, addrlen, &bytes, &c.o) + _, err = l.sock.asyncIo(c, nil, bytes, err) + if err != nil { + return nil, l.opErr("accept", os.NewSyscallError("acceptex", err)) + } + conn := &HvsockConn{ + sock: sock, + } + conn.local.fromRaw((*rawHvsockAddr)(unsafe.Pointer(&addrbuf[0]))) + conn.remote.fromRaw((*rawHvsockAddr)(unsafe.Pointer(&addrbuf[addrlen]))) + sock = nil + return conn, nil +} + +// Close closes the listener, causing any pending Accept calls to fail. +func (l *HvsockListener) Close() error { + return l.sock.Close() +} + +/* Need to finish ConnectEx handling +func DialHvsock(ctx context.Context, addr *HvsockAddr) (*HvsockConn, error) { + sock, err := newHvSocket() + if err != nil { + return nil, err + } + defer func() { + if sock != nil { + sock.Close() + } + }() + c, err := sock.prepareIo() + if err != nil { + return nil, err + } + defer sock.wg.Done() + var bytes uint32 + err = windows.ConnectEx(windows.Handle(sock.handle), sa, nil, 0, &bytes, &c.o) + _, err = sock.asyncIo(ctx, c, nil, bytes, err) + if err != nil { + return nil, err + } + conn := &HvsockConn{ + sock: sock, + remote: *addr, + } + sock = nil + return conn, nil +} +*/ + +func (conn *HvsockConn) opErr(op string, err error) error { + return &net.OpError{Op: op, Net: "hvsock", Source: &conn.local, Addr: &conn.remote, Err: err} +} + +func (conn *HvsockConn) Read(b []byte) (int, error) { + c, err := conn.sock.prepareIo() + if err != nil { + return 0, conn.opErr("read", err) + } + defer conn.sock.wg.Done() + buf := syscall.WSABuf{Buf: &b[0], Len: uint32(len(b))} + var flags, bytes uint32 + err = syscall.WSARecv(conn.sock.handle, &buf, 1, &bytes, &flags, &c.o, nil) + n, err := conn.sock.asyncIo(c, &conn.sock.readDeadline, bytes, err) + if err != nil { + if _, ok := err.(syscall.Errno); ok { + err = os.NewSyscallError("wsarecv", err) + } + return 0, conn.opErr("read", err) + } else if n == 0 { + err = io.EOF + } + return n, err +} + +func (conn *HvsockConn) Write(b []byte) (int, error) { + t := 0 + for len(b) != 0 { + n, err := conn.write(b) + if err != nil { + return t + n, err + } + t += n + b = b[n:] + } + return t, nil +} + +func (conn *HvsockConn) write(b []byte) (int, error) { + c, err := conn.sock.prepareIo() + if err != nil { + return 0, conn.opErr("write", err) + } + defer conn.sock.wg.Done() + buf := syscall.WSABuf{Buf: &b[0], Len: uint32(len(b))} + var bytes uint32 + err = syscall.WSASend(conn.sock.handle, &buf, 1, &bytes, 0, &c.o, nil) + n, err := conn.sock.asyncIo(c, &conn.sock.writeDeadline, bytes, err) + if err != nil { + if _, ok := err.(syscall.Errno); ok { + err = os.NewSyscallError("wsasend", err) + } + return 0, conn.opErr("write", err) + } + return n, err +} + +// Close closes the socket connection, failing any pending read or write calls. +func (conn *HvsockConn) Close() error { + return conn.sock.Close() +} + +func (conn *HvsockConn) shutdown(how int) error { + err := syscall.Shutdown(conn.sock.handle, syscall.SHUT_RD) + if err != nil { + return os.NewSyscallError("shutdown", err) + } + return nil +} + +// CloseRead shuts down the read end of the socket. +func (conn *HvsockConn) CloseRead() error { + err := conn.shutdown(syscall.SHUT_RD) + if err != nil { + return conn.opErr("close", err) + } + return nil +} + +// CloseWrite shuts down the write end of the socket, notifying the other endpoint that +// no more data will be written. +func (conn *HvsockConn) CloseWrite() error { + err := conn.shutdown(syscall.SHUT_WR) + if err != nil { + return conn.opErr("close", err) + } + return nil +} + +// LocalAddr returns the local address of the connection. +func (conn *HvsockConn) LocalAddr() net.Addr { + return &conn.local +} + +// RemoteAddr returns the remote address of the connection. +func (conn *HvsockConn) RemoteAddr() net.Addr { + return &conn.remote +} + +// SetDeadline implements the net.Conn SetDeadline method. +func (conn *HvsockConn) SetDeadline(t time.Time) error { + conn.SetReadDeadline(t) + conn.SetWriteDeadline(t) + return nil +} + +// SetReadDeadline implements the net.Conn SetReadDeadline method. +func (conn *HvsockConn) SetReadDeadline(t time.Time) error { + return conn.sock.SetReadDeadline(t) +} + +// SetWriteDeadline implements the net.Conn SetWriteDeadline method. +func (conn *HvsockConn) SetWriteDeadline(t time.Time) error { + return conn.sock.SetWriteDeadline(t) +} diff --git a/vendor/github.com/Microsoft/go-winio/pipe.go b/vendor/github.com/Microsoft/go-winio/pipe.go index d99eedb64..d6a46f6a2 100644 --- a/vendor/github.com/Microsoft/go-winio/pipe.go +++ b/vendor/github.com/Microsoft/go-winio/pipe.go @@ -3,10 +3,13 @@ package winio import ( + "context" "errors" + "fmt" "io" "net" "os" + "runtime" "syscall" "time" "unsafe" @@ -18,6 +21,48 @@ import ( //sys getNamedPipeInfo(pipe syscall.Handle, flags *uint32, outSize *uint32, inSize *uint32, maxInstances *uint32) (err error) = GetNamedPipeInfo //sys getNamedPipeHandleState(pipe syscall.Handle, state *uint32, curInstances *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32, userName *uint16, maxUserNameSize uint32) (err error) = GetNamedPipeHandleStateW //sys localAlloc(uFlags uint32, length uint32) (ptr uintptr) = LocalAlloc +//sys ntCreateNamedPipeFile(pipe *syscall.Handle, access uint32, oa *objectAttributes, iosb *ioStatusBlock, share uint32, disposition uint32, options uint32, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (status ntstatus) = ntdll.NtCreateNamedPipeFile +//sys rtlNtStatusToDosError(status ntstatus) (winerr error) = ntdll.RtlNtStatusToDosErrorNoTeb +//sys rtlDosPathNameToNtPathName(name *uint16, ntName *unicodeString, filePart uintptr, reserved uintptr) (status ntstatus) = ntdll.RtlDosPathNameToNtPathName_U +//sys rtlDefaultNpAcl(dacl *uintptr) (status ntstatus) = ntdll.RtlDefaultNpAcl + +type ioStatusBlock struct { + Status, Information uintptr +} + +type objectAttributes struct { + Length uintptr + RootDirectory uintptr + ObjectName *unicodeString + Attributes uintptr + SecurityDescriptor *securityDescriptor + SecurityQoS uintptr +} + +type unicodeString struct { + Length uint16 + MaximumLength uint16 + Buffer uintptr +} + +type securityDescriptor struct { + Revision byte + Sbz1 byte + Control uint16 + Owner uintptr + Group uintptr + Sacl uintptr + Dacl uintptr +} + +type ntstatus int32 + +func (status ntstatus) Err() error { + if status >= 0 { + return nil + } + return rtlNtStatusToDosError(status) +} const ( cERROR_PIPE_BUSY = syscall.Errno(231) @@ -25,21 +70,20 @@ const ( cERROR_PIPE_CONNECTED = syscall.Errno(535) cERROR_SEM_TIMEOUT = syscall.Errno(121) - cPIPE_ACCESS_DUPLEX = 0x3 - cFILE_FLAG_FIRST_PIPE_INSTANCE = 0x80000 - cSECURITY_SQOS_PRESENT = 0x100000 - cSECURITY_ANONYMOUS = 0 + cSECURITY_SQOS_PRESENT = 0x100000 + cSECURITY_ANONYMOUS = 0 - cPIPE_REJECT_REMOTE_CLIENTS = 0x8 + cPIPE_TYPE_MESSAGE = 4 - cPIPE_UNLIMITED_INSTANCES = 255 + cPIPE_READMODE_MESSAGE = 2 - cNMPWAIT_USE_DEFAULT_WAIT = 0 - cNMPWAIT_NOWAIT = 1 + cFILE_OPEN = 1 + cFILE_CREATE = 2 - cPIPE_TYPE_MESSAGE = 4 + cFILE_PIPE_MESSAGE_TYPE = 1 + cFILE_PIPE_REJECT_REMOTE_CLIENTS = 2 - cPIPE_READMODE_MESSAGE = 2 + cSE_DACL_PRESENT = 4 ) var ( @@ -137,9 +181,30 @@ func (s pipeAddress) String() string { return string(s) } +// tryDialPipe attempts to dial the pipe at `path` until `ctx` cancellation or timeout. +func tryDialPipe(ctx context.Context, path *string) (syscall.Handle, error) { + for { + select { + case <-ctx.Done(): + return syscall.Handle(0), ctx.Err() + default: + h, err := createFile(*path, syscall.GENERIC_READ|syscall.GENERIC_WRITE, 0, nil, syscall.OPEN_EXISTING, syscall.FILE_FLAG_OVERLAPPED|cSECURITY_SQOS_PRESENT|cSECURITY_ANONYMOUS, 0) + if err == nil { + return h, nil + } + if err != cERROR_PIPE_BUSY { + return h, &os.PathError{Err: err, Op: "open", Path: *path} + } + // Wait 10 msec and try again. This is a rather simplistic + // view, as we always try each 10 milliseconds. + time.Sleep(time.Millisecond * 10) + } + } +} + // DialPipe connects to a named pipe by path, timing out if the connection // takes longer than the specified duration. If timeout is nil, then we use -// a default timeout of 5 seconds. (We do not use WaitNamedPipe.) +// a default timeout of 2 seconds. (We do not use WaitNamedPipe.) func DialPipe(path string, timeout *time.Duration) (net.Conn, error) { var absTimeout time.Time if timeout != nil { @@ -147,23 +212,22 @@ func DialPipe(path string, timeout *time.Duration) (net.Conn, error) { } else { absTimeout = time.Now().Add(time.Second * 2) } + ctx, _ := context.WithDeadline(context.Background(), absTimeout) + conn, err := DialPipeContext(ctx, path) + if err == context.DeadlineExceeded { + return nil, ErrTimeout + } + return conn, err +} + +// DialPipeContext attempts to connect to a named pipe by `path` until `ctx` +// cancellation or timeout. +func DialPipeContext(ctx context.Context, path string) (net.Conn, error) { var err error var h syscall.Handle - for { - h, err = createFile(path, syscall.GENERIC_READ|syscall.GENERIC_WRITE, 0, nil, syscall.OPEN_EXISTING, syscall.FILE_FLAG_OVERLAPPED|cSECURITY_SQOS_PRESENT|cSECURITY_ANONYMOUS, 0) - if err != cERROR_PIPE_BUSY { - break - } - if time.Now().After(absTimeout) { - return nil, ErrTimeout - } - - // Wait 10 msec and try again. This is a rather simplistic - // view, as we always try each 10 milliseconds. - time.Sleep(time.Millisecond * 10) - } + h, err = tryDialPipe(ctx, &path) if err != nil { - return nil, &os.PathError{Op: "open", Path: path, Err: err} + return nil, err } var flags uint32 @@ -194,43 +258,87 @@ type acceptResponse struct { } type win32PipeListener struct { - firstHandle syscall.Handle - path string - securityDescriptor []byte - config PipeConfig - acceptCh chan (chan acceptResponse) - closeCh chan int - doneCh chan int + firstHandle syscall.Handle + path string + config PipeConfig + acceptCh chan (chan acceptResponse) + closeCh chan int + doneCh chan int } -func makeServerPipeHandle(path string, securityDescriptor []byte, c *PipeConfig, first bool) (syscall.Handle, error) { - var flags uint32 = cPIPE_ACCESS_DUPLEX | syscall.FILE_FLAG_OVERLAPPED +func makeServerPipeHandle(path string, sd []byte, c *PipeConfig, first bool) (syscall.Handle, error) { + path16, err := syscall.UTF16FromString(path) + if err != nil { + return 0, &os.PathError{Op: "open", Path: path, Err: err} + } + + var oa objectAttributes + oa.Length = unsafe.Sizeof(oa) + + var ntPath unicodeString + if err := rtlDosPathNameToNtPathName(&path16[0], &ntPath, 0, 0).Err(); err != nil { + return 0, &os.PathError{Op: "open", Path: path, Err: err} + } + defer localFree(ntPath.Buffer) + oa.ObjectName = &ntPath + + // The security descriptor is only needed for the first pipe. if first { - flags |= cFILE_FLAG_FIRST_PIPE_INSTANCE + if sd != nil { + len := uint32(len(sd)) + sdb := localAlloc(0, len) + defer localFree(sdb) + copy((*[0xffff]byte)(unsafe.Pointer(sdb))[:], sd) + oa.SecurityDescriptor = (*securityDescriptor)(unsafe.Pointer(sdb)) + } else { + // Construct the default named pipe security descriptor. + var dacl uintptr + if err := rtlDefaultNpAcl(&dacl).Err(); err != nil { + return 0, fmt.Errorf("getting default named pipe ACL: %s", err) + } + defer localFree(dacl) + + sdb := &securityDescriptor{ + Revision: 1, + Control: cSE_DACL_PRESENT, + Dacl: dacl, + } + oa.SecurityDescriptor = sdb + } } - var mode uint32 = cPIPE_REJECT_REMOTE_CLIENTS + typ := uint32(cFILE_PIPE_REJECT_REMOTE_CLIENTS) if c.MessageMode { - mode |= cPIPE_TYPE_MESSAGE + typ |= cFILE_PIPE_MESSAGE_TYPE } - sa := &syscall.SecurityAttributes{} - sa.Length = uint32(unsafe.Sizeof(*sa)) - if securityDescriptor != nil { - len := uint32(len(securityDescriptor)) - sa.SecurityDescriptor = localAlloc(0, len) - defer localFree(sa.SecurityDescriptor) - copy((*[0xffff]byte)(unsafe.Pointer(sa.SecurityDescriptor))[:], securityDescriptor) + disposition := uint32(cFILE_OPEN) + access := uint32(syscall.GENERIC_READ | syscall.GENERIC_WRITE | syscall.SYNCHRONIZE) + if first { + disposition = cFILE_CREATE + // By not asking for read or write access, the named pipe file system + // will put this pipe into an initially disconnected state, blocking + // client connections until the next call with first == false. + access = syscall.SYNCHRONIZE } - h, err := createNamedPipe(path, flags, mode, cPIPE_UNLIMITED_INSTANCES, uint32(c.OutputBufferSize), uint32(c.InputBufferSize), 0, sa) + + timeout := int64(-50 * 10000) // 50ms + + var ( + h syscall.Handle + iosb ioStatusBlock + ) + err = ntCreateNamedPipeFile(&h, access, &oa, &iosb, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE, disposition, 0, typ, 0, 0, 0xffffffff, uint32(c.InputBufferSize), uint32(c.OutputBufferSize), &timeout).Err() if err != nil { return 0, &os.PathError{Op: "open", Path: path, Err: err} } + + runtime.KeepAlive(ntPath) return h, nil } func (l *win32PipeListener) makeServerPipe() (*win32File, error) { - h, err := makeServerPipeHandle(l.path, l.securityDescriptor, &l.config, false) + h, err := makeServerPipeHandle(l.path, nil, &l.config, false) if err != nil { return nil, err } @@ -341,32 +449,13 @@ func ListenPipe(path string, c *PipeConfig) (net.Listener, error) { if err != nil { return nil, err } - // Create a client handle and connect it. This results in the pipe - // instance always existing, so that clients see ERROR_PIPE_BUSY - // rather than ERROR_FILE_NOT_FOUND. This ties the first instance - // up so that no other instances can be used. This would have been - // cleaner if the Win32 API matched CreateFile with ConnectNamedPipe - // instead of CreateNamedPipe. (Apparently created named pipes are - // considered to be in listening state regardless of whether any - // active calls to ConnectNamedPipe are outstanding.) - h2, err := createFile(path, 0, 0, nil, syscall.OPEN_EXISTING, cSECURITY_SQOS_PRESENT|cSECURITY_ANONYMOUS, 0) - if err != nil { - syscall.Close(h) - return nil, err - } - // Close the client handle. The server side of the instance will - // still be busy, leading to ERROR_PIPE_BUSY instead of - // ERROR_NOT_FOUND, as long as we don't close the server handle, - // or disconnect the client with DisconnectNamedPipe. - syscall.Close(h2) l := &win32PipeListener{ - firstHandle: h, - path: path, - securityDescriptor: sd, - config: *c, - acceptCh: make(chan (chan acceptResponse)), - closeCh: make(chan int), - doneCh: make(chan int), + firstHandle: h, + path: path, + config: *c, + acceptCh: make(chan (chan acceptResponse)), + closeCh: make(chan int), + doneCh: make(chan int), } go l.listenerRoutine() return l, nil diff --git a/vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go b/vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go new file mode 100644 index 000000000..586406577 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go @@ -0,0 +1,235 @@ +// Package guid provides a GUID type. The backing structure for a GUID is +// identical to that used by the golang.org/x/sys/windows GUID type. +// There are two main binary encodings used for a GUID, the big-endian encoding, +// and the Windows (mixed-endian) encoding. See here for details: +// https://en.wikipedia.org/wiki/Universally_unique_identifier#Encoding +package guid + +import ( + "crypto/rand" + "crypto/sha1" + "encoding" + "encoding/binary" + "fmt" + "strconv" + + "golang.org/x/sys/windows" +) + +// Variant specifies which GUID variant (or "type") of the GUID. It determines +// how the entirety of the rest of the GUID is interpreted. +type Variant uint8 + +// The variants specified by RFC 4122. +const ( + // VariantUnknown specifies a GUID variant which does not conform to one of + // the variant encodings specified in RFC 4122. + VariantUnknown Variant = iota + VariantNCS + VariantRFC4122 + VariantMicrosoft + VariantFuture +) + +// Version specifies how the bits in the GUID were generated. For instance, a +// version 4 GUID is randomly generated, and a version 5 is generated from the +// hash of an input string. +type Version uint8 + +var _ = (encoding.TextMarshaler)(GUID{}) +var _ = (encoding.TextUnmarshaler)(&GUID{}) + +// GUID represents a GUID/UUID. It has the same structure as +// golang.org/x/sys/windows.GUID so that it can be used with functions expecting +// that type. It is defined as its own type so that stringification and +// marshaling can be supported. The representation matches that used by native +// Windows code. +type GUID windows.GUID + +// NewV4 returns a new version 4 (pseudorandom) GUID, as defined by RFC 4122. +func NewV4() (GUID, error) { + var b [16]byte + if _, err := rand.Read(b[:]); err != nil { + return GUID{}, err + } + + g := FromArray(b) + g.setVersion(4) // Version 4 means randomly generated. + g.setVariant(VariantRFC4122) + + return g, nil +} + +// NewV5 returns a new version 5 (generated from a string via SHA-1 hashing) +// GUID, as defined by RFC 4122. The RFC is unclear on the encoding of the name, +// and the sample code treats it as a series of bytes, so we do the same here. +// +// Some implementations, such as those found on Windows, treat the name as a +// big-endian UTF16 stream of bytes. If that is desired, the string can be +// encoded as such before being passed to this function. +func NewV5(namespace GUID, name []byte) (GUID, error) { + b := sha1.New() + namespaceBytes := namespace.ToArray() + b.Write(namespaceBytes[:]) + b.Write(name) + + a := [16]byte{} + copy(a[:], b.Sum(nil)) + + g := FromArray(a) + g.setVersion(5) // Version 5 means generated from a string. + g.setVariant(VariantRFC4122) + + return g, nil +} + +func fromArray(b [16]byte, order binary.ByteOrder) GUID { + var g GUID + g.Data1 = order.Uint32(b[0:4]) + g.Data2 = order.Uint16(b[4:6]) + g.Data3 = order.Uint16(b[6:8]) + copy(g.Data4[:], b[8:16]) + return g +} + +func (g GUID) toArray(order binary.ByteOrder) [16]byte { + b := [16]byte{} + order.PutUint32(b[0:4], g.Data1) + order.PutUint16(b[4:6], g.Data2) + order.PutUint16(b[6:8], g.Data3) + copy(b[8:16], g.Data4[:]) + return b +} + +// FromArray constructs a GUID from a big-endian encoding array of 16 bytes. +func FromArray(b [16]byte) GUID { + return fromArray(b, binary.BigEndian) +} + +// ToArray returns an array of 16 bytes representing the GUID in big-endian +// encoding. +func (g GUID) ToArray() [16]byte { + return g.toArray(binary.BigEndian) +} + +// FromWindowsArray constructs a GUID from a Windows encoding array of bytes. +func FromWindowsArray(b [16]byte) GUID { + return fromArray(b, binary.LittleEndian) +} + +// ToWindowsArray returns an array of 16 bytes representing the GUID in Windows +// encoding. +func (g GUID) ToWindowsArray() [16]byte { + return g.toArray(binary.LittleEndian) +} + +func (g GUID) String() string { + return fmt.Sprintf( + "%08x-%04x-%04x-%04x-%012x", + g.Data1, + g.Data2, + g.Data3, + g.Data4[:2], + g.Data4[2:]) +} + +// FromString parses a string containing a GUID and returns the GUID. The only +// format currently supported is the `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` +// format. +func FromString(s string) (GUID, error) { + if len(s) != 36 { + return GUID{}, fmt.Errorf("invalid GUID %q", s) + } + if s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' { + return GUID{}, fmt.Errorf("invalid GUID %q", s) + } + + var g GUID + + data1, err := strconv.ParseUint(s[0:8], 16, 32) + if err != nil { + return GUID{}, fmt.Errorf("invalid GUID %q", s) + } + g.Data1 = uint32(data1) + + data2, err := strconv.ParseUint(s[9:13], 16, 16) + if err != nil { + return GUID{}, fmt.Errorf("invalid GUID %q", s) + } + g.Data2 = uint16(data2) + + data3, err := strconv.ParseUint(s[14:18], 16, 16) + if err != nil { + return GUID{}, fmt.Errorf("invalid GUID %q", s) + } + g.Data3 = uint16(data3) + + for i, x := range []int{19, 21, 24, 26, 28, 30, 32, 34} { + v, err := strconv.ParseUint(s[x:x+2], 16, 8) + if err != nil { + return GUID{}, fmt.Errorf("invalid GUID %q", s) + } + g.Data4[i] = uint8(v) + } + + return g, nil +} + +func (g *GUID) setVariant(v Variant) { + d := g.Data4[0] + switch v { + case VariantNCS: + d = (d & 0x7f) + case VariantRFC4122: + d = (d & 0x3f) | 0x80 + case VariantMicrosoft: + d = (d & 0x1f) | 0xc0 + case VariantFuture: + d = (d & 0x0f) | 0xe0 + case VariantUnknown: + fallthrough + default: + panic(fmt.Sprintf("invalid variant: %d", v)) + } + g.Data4[0] = d +} + +// Variant returns the GUID variant, as defined in RFC 4122. +func (g GUID) Variant() Variant { + b := g.Data4[0] + if b&0x80 == 0 { + return VariantNCS + } else if b&0xc0 == 0x80 { + return VariantRFC4122 + } else if b&0xe0 == 0xc0 { + return VariantMicrosoft + } else if b&0xe0 == 0xe0 { + return VariantFuture + } + return VariantUnknown +} + +func (g *GUID) setVersion(v Version) { + g.Data3 = (g.Data3 & 0x0fff) | (uint16(v) << 12) +} + +// Version returns the GUID version, as defined in RFC 4122. +func (g GUID) Version() Version { + return Version((g.Data3 & 0xF000) >> 12) +} + +// MarshalText returns the textual representation of the GUID. +func (g GUID) MarshalText() ([]byte, error) { + return []byte(g.String()), nil +} + +// UnmarshalText takes the textual representation of a GUID, and unmarhals it +// into this GUID. +func (g *GUID) UnmarshalText(text []byte) error { + g2, err := FromString(string(text)) + if err != nil { + return err + } + *g = g2 + return nil +} diff --git a/vendor/github.com/Microsoft/go-winio/syscall.go b/vendor/github.com/Microsoft/go-winio/syscall.go index 20d64cf41..5cb52bc74 100644 --- a/vendor/github.com/Microsoft/go-winio/syscall.go +++ b/vendor/github.com/Microsoft/go-winio/syscall.go @@ -1,3 +1,3 @@ package winio -//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go file.go pipe.go sd.go fileinfo.go privilege.go backup.go +//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go file.go pipe.go sd.go fileinfo.go privilege.go backup.go hvsock.go diff --git a/vendor/github.com/Microsoft/go-winio/zsyscall_windows.go b/vendor/github.com/Microsoft/go-winio/zsyscall_windows.go index 3f527639a..e26b01faf 100644 --- a/vendor/github.com/Microsoft/go-winio/zsyscall_windows.go +++ b/vendor/github.com/Microsoft/go-winio/zsyscall_windows.go @@ -1,4 +1,4 @@ -// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT +// Code generated by 'go generate'; DO NOT EDIT. package winio @@ -38,19 +38,25 @@ func errnoErr(e syscall.Errno) error { var ( modkernel32 = windows.NewLazySystemDLL("kernel32.dll") + modws2_32 = windows.NewLazySystemDLL("ws2_32.dll") + modntdll = windows.NewLazySystemDLL("ntdll.dll") modadvapi32 = windows.NewLazySystemDLL("advapi32.dll") procCancelIoEx = modkernel32.NewProc("CancelIoEx") procCreateIoCompletionPort = modkernel32.NewProc("CreateIoCompletionPort") procGetQueuedCompletionStatus = modkernel32.NewProc("GetQueuedCompletionStatus") procSetFileCompletionNotificationModes = modkernel32.NewProc("SetFileCompletionNotificationModes") + procWSAGetOverlappedResult = modws2_32.NewProc("WSAGetOverlappedResult") procConnectNamedPipe = modkernel32.NewProc("ConnectNamedPipe") procCreateNamedPipeW = modkernel32.NewProc("CreateNamedPipeW") procCreateFileW = modkernel32.NewProc("CreateFileW") - procWaitNamedPipeW = modkernel32.NewProc("WaitNamedPipeW") procGetNamedPipeInfo = modkernel32.NewProc("GetNamedPipeInfo") procGetNamedPipeHandleStateW = modkernel32.NewProc("GetNamedPipeHandleStateW") procLocalAlloc = modkernel32.NewProc("LocalAlloc") + procNtCreateNamedPipeFile = modntdll.NewProc("NtCreateNamedPipeFile") + procRtlNtStatusToDosErrorNoTeb = modntdll.NewProc("RtlNtStatusToDosErrorNoTeb") + procRtlDosPathNameToNtPathName_U = modntdll.NewProc("RtlDosPathNameToNtPathName_U") + procRtlDefaultNpAcl = modntdll.NewProc("RtlDefaultNpAcl") procLookupAccountNameW = modadvapi32.NewProc("LookupAccountNameW") procConvertSidToStringSidW = modadvapi32.NewProc("ConvertSidToStringSidW") procConvertStringSecurityDescriptorToSecurityDescriptorW = modadvapi32.NewProc("ConvertStringSecurityDescriptorToSecurityDescriptorW") @@ -69,6 +75,7 @@ var ( procLookupPrivilegeDisplayNameW = modadvapi32.NewProc("LookupPrivilegeDisplayNameW") procBackupRead = modkernel32.NewProc("BackupRead") procBackupWrite = modkernel32.NewProc("BackupWrite") + procbind = modws2_32.NewProc("bind") ) func cancelIoEx(file syscall.Handle, o *syscall.Overlapped) (err error) { @@ -120,6 +127,24 @@ func setFileCompletionNotificationModes(h syscall.Handle, flags uint8) (err erro return } +func wsaGetOverlappedResult(h syscall.Handle, o *syscall.Overlapped, bytes *uint32, wait bool, flags *uint32) (err error) { + var _p0 uint32 + if wait { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall6(procWSAGetOverlappedResult.Addr(), 5, uintptr(h), uintptr(unsafe.Pointer(o)), uintptr(unsafe.Pointer(bytes)), uintptr(_p0), uintptr(unsafe.Pointer(flags)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + func connectNamedPipe(pipe syscall.Handle, o *syscall.Overlapped) (err error) { r1, _, e1 := syscall.Syscall(procConnectNamedPipe.Addr(), 2, uintptr(pipe), uintptr(unsafe.Pointer(o)), 0) if r1 == 0 { @@ -176,27 +201,6 @@ func _createFile(name *uint16, access uint32, mode uint32, sa *syscall.SecurityA return } -func waitNamedPipe(name string, timeout uint32) (err error) { - var _p0 *uint16 - _p0, err = syscall.UTF16PtrFromString(name) - if err != nil { - return - } - return _waitNamedPipe(_p0, timeout) -} - -func _waitNamedPipe(name *uint16, timeout uint32) (err error) { - r1, _, e1 := syscall.Syscall(procWaitNamedPipeW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(timeout), 0) - if r1 == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - func getNamedPipeInfo(pipe syscall.Handle, flags *uint32, outSize *uint32, inSize *uint32, maxInstances *uint32) (err error) { r1, _, e1 := syscall.Syscall6(procGetNamedPipeInfo.Addr(), 5, uintptr(pipe), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(outSize)), uintptr(unsafe.Pointer(inSize)), uintptr(unsafe.Pointer(maxInstances)), 0) if r1 == 0 { @@ -227,6 +231,32 @@ func localAlloc(uFlags uint32, length uint32) (ptr uintptr) { return } +func ntCreateNamedPipeFile(pipe *syscall.Handle, access uint32, oa *objectAttributes, iosb *ioStatusBlock, share uint32, disposition uint32, options uint32, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (status ntstatus) { + r0, _, _ := syscall.Syscall15(procNtCreateNamedPipeFile.Addr(), 14, uintptr(unsafe.Pointer(pipe)), uintptr(access), uintptr(unsafe.Pointer(oa)), uintptr(unsafe.Pointer(iosb)), uintptr(share), uintptr(disposition), uintptr(options), uintptr(typ), uintptr(readMode), uintptr(completionMode), uintptr(maxInstances), uintptr(inboundQuota), uintptr(outputQuota), uintptr(unsafe.Pointer(timeout)), 0) + status = ntstatus(r0) + return +} + +func rtlNtStatusToDosError(status ntstatus) (winerr error) { + r0, _, _ := syscall.Syscall(procRtlNtStatusToDosErrorNoTeb.Addr(), 1, uintptr(status), 0, 0) + if r0 != 0 { + winerr = syscall.Errno(r0) + } + return +} + +func rtlDosPathNameToNtPathName(name *uint16, ntName *unicodeString, filePart uintptr, reserved uintptr) (status ntstatus) { + r0, _, _ := syscall.Syscall6(procRtlDosPathNameToNtPathName_U.Addr(), 4, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(ntName)), uintptr(filePart), uintptr(reserved), 0, 0) + status = ntstatus(r0) + return +} + +func rtlDefaultNpAcl(dacl *uintptr) (status ntstatus) { + r0, _, _ := syscall.Syscall(procRtlDefaultNpAcl.Addr(), 1, uintptr(unsafe.Pointer(dacl)), 0, 0) + status = ntstatus(r0) + return +} + func lookupAccountName(systemName *uint16, accountName string, sid *byte, sidSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) { var _p0 *uint16 _p0, err = syscall.UTF16PtrFromString(accountName) @@ -518,3 +548,15 @@ func backupWrite(h syscall.Handle, b []byte, bytesWritten *uint32, abort bool, p } return } + +func bind(s syscall.Handle, name unsafe.Pointer, namelen int32) (err error) { + r1, _, e1 := syscall.Syscall(procbind.Addr(), 3, uintptr(s), uintptr(name), uintptr(namelen)) + if r1 == socketError { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} diff --git a/vendor/github.com/StackExchange/wmi/swbemservices.go b/vendor/github.com/StackExchange/wmi/swbemservices.go index 9765a53f7..3ff875630 100644 --- a/vendor/github.com/StackExchange/wmi/swbemservices.go +++ b/vendor/github.com/StackExchange/wmi/swbemservices.go @@ -77,7 +77,7 @@ func (s *SWbemServices) process(initError chan error) { //fmt.Println("process: starting background thread initialization") //All OLE/WMI calls must happen on the same initialized thead, so lock this goroutine runtime.LockOSThread() - defer runtime.LockOSThread() + defer runtime.UnlockOSThread() err := ole.CoInitializeEx(0, ole.COINIT_MULTITHREADED) if err != nil { diff --git a/vendor/github.com/StackExchange/wmi/wmi.go b/vendor/github.com/StackExchange/wmi/wmi.go index a951b1258..eab18cbfe 100644 --- a/vendor/github.com/StackExchange/wmi/wmi.go +++ b/vendor/github.com/StackExchange/wmi/wmi.go @@ -285,6 +285,10 @@ func (c *Client) loadEntity(dst interface{}, src *ole.IDispatch) (errFieldMismat } defer prop.Clear() + if prop.VT == 0x1 { //VT_NULL + continue + } + switch val := prop.Value().(type) { case int8, int16, int32, int64, int: v := reflect.ValueOf(val).Int() @@ -383,7 +387,7 @@ func (c *Client) loadEntity(dst interface{}, src *ole.IDispatch) (errFieldMismat } f.Set(fArr) } - case reflect.Uint8: + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: safeArray := prop.ToArray() if safeArray != nil { arr := safeArray.ToValueArray() @@ -394,6 +398,17 @@ func (c *Client) loadEntity(dst interface{}, src *ole.IDispatch) (errFieldMismat } f.Set(fArr) } + case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: + safeArray := prop.ToArray() + if safeArray != nil { + arr := safeArray.ToValueArray() + fArr := reflect.MakeSlice(f.Type(), len(arr), len(arr)) + for i, v := range arr { + s := fArr.Index(i) + s.SetInt(reflect.ValueOf(v).Int()) + } + f.Set(fArr) + } default: return &ErrFieldMismatch{ StructType: of.Type(), diff --git a/vendor/github.com/aws/aws-sdk-go/NOTICE.txt b/vendor/github.com/aws/aws-sdk-go/NOTICE.txt index 5f14d1162..899129ecc 100644 --- a/vendor/github.com/aws/aws-sdk-go/NOTICE.txt +++ b/vendor/github.com/aws/aws-sdk-go/NOTICE.txt @@ -1,3 +1,3 @@ AWS SDK for Go -Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. +Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. Copyright 2014-2015 Stripe, Inc. diff --git a/vendor/github.com/aws/aws-sdk-go/aws/awserr/error.go b/vendor/github.com/aws/aws-sdk-go/aws/awserr/error.go index 56fdfc2bf..99849c0e1 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/awserr/error.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/awserr/error.go @@ -138,8 +138,27 @@ type RequestFailure interface { RequestID() string } -// NewRequestFailure returns a new request error wrapper for the given Error -// provided. +// NewRequestFailure returns a wrapped error with additional information for +// request status code, and service requestID. +// +// Should be used to wrap all request which involve service requests. Even if +// the request failed without a service response, but had an HTTP status code +// that may be meaningful. func NewRequestFailure(err Error, statusCode int, reqID string) RequestFailure { return newRequestError(err, statusCode, reqID) } + +// UnmarshalError provides the interface for the SDK failing to unmarshal data. +type UnmarshalError interface { + awsError + Bytes() []byte +} + +// NewUnmarshalError returns an initialized UnmarshalError error wrapper adding +// the bytes that fail to unmarshal to the error. +func NewUnmarshalError(err error, msg string, bytes []byte) UnmarshalError { + return &unmarshalError{ + awsError: New("UnmarshalError", msg, err), + bytes: bytes, + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/awserr/types.go b/vendor/github.com/aws/aws-sdk-go/aws/awserr/types.go index 0202a008f..9cf7eaf40 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/awserr/types.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/awserr/types.go @@ -1,6 +1,9 @@ package awserr -import "fmt" +import ( + "encoding/hex" + "fmt" +) // SprintError returns a string of the formatted error code. // @@ -119,6 +122,7 @@ type requestError struct { awsError statusCode int requestID string + bytes []byte } // newRequestError returns a wrapped error with additional information for @@ -170,6 +174,29 @@ func (r requestError) OrigErrs() []error { return []error{r.OrigErr()} } +type unmarshalError struct { + awsError + bytes []byte +} + +// Error returns the string representation of the error. +// Satisfies the error interface. +func (e unmarshalError) Error() string { + extra := hex.Dump(e.bytes) + return SprintError(e.Code(), e.Message(), extra, e.OrigErr()) +} + +// String returns the string representation of the error. +// Alias for Error to satisfy the stringer interface. +func (e unmarshalError) String() string { + return e.Error() +} + +// Bytes returns the bytes that failed to unmarshal. +func (e unmarshalError) Bytes() []byte { + return e.bytes +} + // An error list that satisfies the golang interface type errorList []error @@ -181,7 +208,7 @@ func (e errorList) Error() string { // How do we want to handle the array size being zero if size := len(e); size > 0 { for i := 0; i < size; i++ { - msg += fmt.Sprintf("%s", e[i].Error()) + msg += e[i].Error() // We check the next index to see if it is within the slice. // If it is, then we append a newline. We do this, because unit tests // could be broken with the additional '\n' diff --git a/vendor/github.com/aws/aws-sdk-go/aws/awsutil/equal.go b/vendor/github.com/aws/aws-sdk-go/aws/awsutil/equal.go index 59fa4a558..142a7a01c 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/awsutil/equal.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/awsutil/equal.go @@ -15,7 +15,7 @@ func DeepEqual(a, b interface{}) bool { rb := reflect.Indirect(reflect.ValueOf(b)) if raValid, rbValid := ra.IsValid(), rb.IsValid(); !raValid && !rbValid { - // If the elements are both nil, and of the same type the are equal + // If the elements are both nil, and of the same type they are equal // If they are of different types they are not equal return reflect.TypeOf(a) == reflect.TypeOf(b) } else if raValid != rbValid { diff --git a/vendor/github.com/aws/aws-sdk-go/aws/awsutil/path_value.go b/vendor/github.com/aws/aws-sdk-go/aws/awsutil/path_value.go index 11c52c389..a4eb6a7f4 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/awsutil/path_value.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/awsutil/path_value.go @@ -70,7 +70,7 @@ func rValuesAtPath(v interface{}, path string, createPath, caseSensitive, nilTer value = value.FieldByNameFunc(func(name string) bool { if c == name { return true - } else if !caseSensitive && strings.ToLower(name) == strings.ToLower(c) { + } else if !caseSensitive && strings.EqualFold(name, c) { return true } return false @@ -185,13 +185,12 @@ func ValuesAtPath(i interface{}, path string) ([]interface{}, error) { // SetValueAtPath sets a value at the case insensitive lexical path inside // of a structure. func SetValueAtPath(i interface{}, path string, v interface{}) { - if rvals := rValuesAtPath(i, path, true, false, v == nil); rvals != nil { - for _, rval := range rvals { - if rval.Kind() == reflect.Ptr && rval.IsNil() { - continue - } - setValue(rval, v) + rvals := rValuesAtPath(i, path, true, false, v == nil) + for _, rval := range rvals { + if rval.Kind() == reflect.Ptr && rval.IsNil() { + continue } + setValue(rval, v) } } diff --git a/vendor/github.com/aws/aws-sdk-go/aws/awsutil/string_value.go b/vendor/github.com/aws/aws-sdk-go/aws/awsutil/string_value.go index b6432f1a1..645df2450 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/awsutil/string_value.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/awsutil/string_value.go @@ -23,28 +23,27 @@ func stringValue(v reflect.Value, indent int, buf *bytes.Buffer) { case reflect.Struct: buf.WriteString("{\n") - names := []string{} for i := 0; i < v.Type().NumField(); i++ { - name := v.Type().Field(i).Name - f := v.Field(i) - if name[0:1] == strings.ToLower(name[0:1]) { + ft := v.Type().Field(i) + fv := v.Field(i) + + if ft.Name[0:1] == strings.ToLower(ft.Name[0:1]) { continue // ignore unexported fields } - if (f.Kind() == reflect.Ptr || f.Kind() == reflect.Slice) && f.IsNil() { + if (fv.Kind() == reflect.Ptr || fv.Kind() == reflect.Slice) && fv.IsNil() { continue // ignore unset fields } - names = append(names, name) - } - for i, n := range names { - val := v.FieldByName(n) buf.WriteString(strings.Repeat(" ", indent+2)) - buf.WriteString(n + ": ") - stringValue(val, indent+2, buf) + buf.WriteString(ft.Name + ": ") - if i < len(names)-1 { - buf.WriteString(",\n") + if tag := ft.Tag.Get("sensitive"); tag == "true" { + buf.WriteString("") + } else { + stringValue(fv, indent+2, buf) } + + buf.WriteString(",\n") } buf.WriteString("\n" + strings.Repeat(" ", indent) + "}") diff --git a/vendor/github.com/aws/aws-sdk-go/aws/client/client.go b/vendor/github.com/aws/aws-sdk-go/aws/client/client.go index 3271a18e8..03334d692 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/client/client.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/client/client.go @@ -12,13 +12,14 @@ import ( type Config struct { Config *aws.Config Handlers request.Handlers + PartitionID string Endpoint string SigningRegion string SigningName string // States that the signing name did not come from a modeled source but // was derived based on other data. Used by service client constructors - // to determine if the signin name can be overriden based on metadata the + // to determine if the signin name can be overridden based on metadata the // service has. SigningNameDerived bool } @@ -64,7 +65,7 @@ func New(cfg aws.Config, info metadata.ClientInfo, handlers request.Handlers, op default: maxRetries := aws.IntValue(cfg.MaxRetries) if cfg.MaxRetries == nil || maxRetries == aws.UseServiceDefaultRetries { - maxRetries = 3 + maxRetries = DefaultRetryerMaxNumRetries } svc.Retryer = DefaultRetryer{NumMaxRetries: maxRetries} } @@ -91,6 +92,6 @@ func (c *Client) AddDebugHandlers() { return } - c.Handlers.Send.PushFrontNamed(request.NamedHandler{Name: "awssdk.client.LogRequest", Fn: logRequest}) - c.Handlers.Send.PushBackNamed(request.NamedHandler{Name: "awssdk.client.LogResponse", Fn: logResponse}) + c.Handlers.Send.PushFrontNamed(LogHTTPRequestHandler) + c.Handlers.Send.PushBackNamed(LogHTTPResponseHandler) } diff --git a/vendor/github.com/aws/aws-sdk-go/aws/client/default_retryer.go b/vendor/github.com/aws/aws-sdk-go/aws/client/default_retryer.go index a397b0d04..9f6af19dd 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/client/default_retryer.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/client/default_retryer.go @@ -1,6 +1,7 @@ package client import ( + "math" "strconv" "time" @@ -9,82 +10,142 @@ import ( ) // DefaultRetryer implements basic retry logic using exponential backoff for -// most services. If you want to implement custom retry logic, implement the -// request.Retryer interface or create a structure type that composes this -// struct and override the specific methods. For example, to override only -// the MaxRetries method: +// most services. If you want to implement custom retry logic, you can implement the +// request.Retryer interface. // -// type retryer struct { -// client.DefaultRetryer -// } -// -// // This implementation always has 100 max retries -// func (d retryer) MaxRetries() int { return 100 } type DefaultRetryer struct { + // Num max Retries is the number of max retries that will be performed. + // By default, this is zero. NumMaxRetries int + + // MinRetryDelay is the minimum retry delay after which retry will be performed. + // If not set, the value is 0ns. + MinRetryDelay time.Duration + + // MinThrottleRetryDelay is the minimum retry delay when throttled. + // If not set, the value is 0ns. + MinThrottleDelay time.Duration + + // MaxRetryDelay is the maximum retry delay before which retry must be performed. + // If not set, the value is 0ns. + MaxRetryDelay time.Duration + + // MaxThrottleDelay is the maximum retry delay when throttled. + // If not set, the value is 0ns. + MaxThrottleDelay time.Duration } +const ( + // DefaultRetryerMaxNumRetries sets maximum number of retries + DefaultRetryerMaxNumRetries = 3 + + // DefaultRetryerMinRetryDelay sets minimum retry delay + DefaultRetryerMinRetryDelay = 30 * time.Millisecond + + // DefaultRetryerMinThrottleDelay sets minimum delay when throttled + DefaultRetryerMinThrottleDelay = 500 * time.Millisecond + + // DefaultRetryerMaxRetryDelay sets maximum retry delay + DefaultRetryerMaxRetryDelay = 300 * time.Second + + // DefaultRetryerMaxThrottleDelay sets maximum delay when throttled + DefaultRetryerMaxThrottleDelay = 300 * time.Second +) + // MaxRetries returns the number of maximum returns the service will use to make // an individual API request. func (d DefaultRetryer) MaxRetries() int { return d.NumMaxRetries } +// setRetryerDefaults sets the default values of the retryer if not set +func (d *DefaultRetryer) setRetryerDefaults() { + if d.MinRetryDelay == 0 { + d.MinRetryDelay = DefaultRetryerMinRetryDelay + } + if d.MaxRetryDelay == 0 { + d.MaxRetryDelay = DefaultRetryerMaxRetryDelay + } + if d.MinThrottleDelay == 0 { + d.MinThrottleDelay = DefaultRetryerMinThrottleDelay + } + if d.MaxThrottleDelay == 0 { + d.MaxThrottleDelay = DefaultRetryerMaxThrottleDelay + } +} + // RetryRules returns the delay duration before retrying this request again func (d DefaultRetryer) RetryRules(r *request.Request) time.Duration { - // Set the upper limit of delay in retrying at ~five minutes - minTime := 30 - throttle := d.shouldThrottle(r) - if throttle { - if delay, ok := getRetryDelay(r); ok { - return delay - } - minTime = 500 + // if number of max retries is zero, no retries will be performed. + if d.NumMaxRetries == 0 { + return 0 + } + + // Sets default value for retryer members + d.setRetryerDefaults() + + // minDelay is the minimum retryer delay + minDelay := d.MinRetryDelay + + var initialDelay time.Duration + + isThrottle := r.IsErrorThrottle() + if isThrottle { + if delay, ok := getRetryAfterDelay(r); ok { + initialDelay = delay + } + minDelay = d.MinThrottleDelay } retryCount := r.RetryCount - if throttle && retryCount > 8 { - retryCount = 8 - } else if retryCount > 13 { - retryCount = 13 + + // maxDelay the maximum retryer delay + maxDelay := d.MaxRetryDelay + + if isThrottle { + maxDelay = d.MaxThrottleDelay + } + + var delay time.Duration + + // Logic to cap the retry count based on the minDelay provided + actualRetryCount := int(math.Log2(float64(minDelay))) + 1 + if actualRetryCount < 63-retryCount { + delay = time.Duration(1< maxDelay { + delay = getJitterDelay(maxDelay / 2) + } + } else { + delay = getJitterDelay(maxDelay / 2) } + return delay + initialDelay +} - delay := (1 << uint(retryCount)) * (sdkrand.SeededRand.Intn(minTime) + minTime) - return time.Duration(delay) * time.Millisecond +// getJitterDelay returns a jittered delay for retry +func getJitterDelay(duration time.Duration) time.Duration { + return time.Duration(sdkrand.SeededRand.Int63n(int64(duration)) + int64(duration)) } // ShouldRetry returns true if the request should be retried. func (d DefaultRetryer) ShouldRetry(r *request.Request) bool { + + // ShouldRetry returns false if number of max retries is 0. + if d.NumMaxRetries == 0 { + return false + } + // If one of the other handlers already set the retry state // we don't want to override it based on the service's state if r.Retryable != nil { return *r.Retryable } - - if r.HTTPResponse.StatusCode >= 500 && r.HTTPResponse.StatusCode != 501 { - return true - } - return r.IsErrorRetryable() || d.shouldThrottle(r) -} - -// ShouldThrottle returns true if the request should be throttled. -func (d DefaultRetryer) shouldThrottle(r *request.Request) bool { - switch r.HTTPResponse.StatusCode { - case 429: - case 502: - case 503: - case 504: - default: - return r.IsErrorThrottle() - } - - return true + return r.IsErrorRetryable() || r.IsErrorThrottle() } // This will look in the Retry-After header, RFC 7231, for how long // it will wait before attempting another request -func getRetryDelay(r *request.Request) (time.Duration, bool) { +func getRetryAfterDelay(r *request.Request) (time.Duration, bool) { if !canUseRetryAfterHeader(r) { return 0, false } diff --git a/vendor/github.com/aws/aws-sdk-go/aws/client/logger.go b/vendor/github.com/aws/aws-sdk-go/aws/client/logger.go index e223c54cc..8958c32d4 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/client/logger.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/client/logger.go @@ -44,12 +44,22 @@ func (reader *teeReaderCloser) Close() error { return reader.Source.Close() } +// LogHTTPRequestHandler is a SDK request handler to log the HTTP request sent +// to a service. Will include the HTTP request body if the LogLevel of the +// request matches LogDebugWithHTTPBody. +var LogHTTPRequestHandler = request.NamedHandler{ + Name: "awssdk.client.LogRequest", + Fn: logRequest, +} + func logRequest(r *request.Request) { logBody := r.Config.LogLevel.Matches(aws.LogDebugWithHTTPBody) bodySeekable := aws.IsReaderSeekable(r.Body) - dumpedBody, err := httputil.DumpRequestOut(r.HTTPRequest, logBody) + + b, err := httputil.DumpRequestOut(r.HTTPRequest, logBody) if err != nil { - r.Config.Logger.Log(fmt.Sprintf(logReqErrMsg, r.ClientInfo.ServiceName, r.Operation.Name, err)) + r.Config.Logger.Log(fmt.Sprintf(logReqErrMsg, + r.ClientInfo.ServiceName, r.Operation.Name, err)) return } @@ -57,13 +67,38 @@ func logRequest(r *request.Request) { if !bodySeekable { r.SetReaderBody(aws.ReadSeekCloser(r.HTTPRequest.Body)) } - // Reset the request body because dumpRequest will re-wrap the r.HTTPRequest's - // Body as a NoOpCloser and will not be reset after read by the HTTP - // client reader. - r.ResetBody() + // Reset the request body because dumpRequest will re-wrap the + // r.HTTPRequest's Body as a NoOpCloser and will not be reset after + // read by the HTTP client reader. + if err := r.Error; err != nil { + r.Config.Logger.Log(fmt.Sprintf(logReqErrMsg, + r.ClientInfo.ServiceName, r.Operation.Name, err)) + return + } } - r.Config.Logger.Log(fmt.Sprintf(logReqMsg, r.ClientInfo.ServiceName, r.Operation.Name, string(dumpedBody))) + r.Config.Logger.Log(fmt.Sprintf(logReqMsg, + r.ClientInfo.ServiceName, r.Operation.Name, string(b))) +} + +// LogHTTPRequestHeaderHandler is a SDK request handler to log the HTTP request sent +// to a service. Will only log the HTTP request's headers. The request payload +// will not be read. +var LogHTTPRequestHeaderHandler = request.NamedHandler{ + Name: "awssdk.client.LogRequestHeader", + Fn: logRequestHeader, +} + +func logRequestHeader(r *request.Request) { + b, err := httputil.DumpRequestOut(r.HTTPRequest, false) + if err != nil { + r.Config.Logger.Log(fmt.Sprintf(logReqErrMsg, + r.ClientInfo.ServiceName, r.Operation.Name, err)) + return + } + + r.Config.Logger.Log(fmt.Sprintf(logReqMsg, + r.ClientInfo.ServiceName, r.Operation.Name, string(b))) } const logRespMsg = `DEBUG: Response %s/%s Details: @@ -76,27 +111,50 @@ const logRespErrMsg = `DEBUG ERROR: Response %s/%s: %s -----------------------------------------------------` +// LogHTTPResponseHandler is a SDK request handler to log the HTTP response +// received from a service. Will include the HTTP response body if the LogLevel +// of the request matches LogDebugWithHTTPBody. +var LogHTTPResponseHandler = request.NamedHandler{ + Name: "awssdk.client.LogResponse", + Fn: logResponse, +} + func logResponse(r *request.Request) { lw := &logWriter{r.Config.Logger, bytes.NewBuffer(nil)} - r.HTTPResponse.Body = &teeReaderCloser{ - Reader: io.TeeReader(r.HTTPResponse.Body, lw), - Source: r.HTTPResponse.Body, + + if r.HTTPResponse == nil { + lw.Logger.Log(fmt.Sprintf(logRespErrMsg, + r.ClientInfo.ServiceName, r.Operation.Name, "request's HTTPResponse is nil")) + return } - handlerFn := func(req *request.Request) { - body, err := httputil.DumpResponse(req.HTTPResponse, false) - if err != nil { - lw.Logger.Log(fmt.Sprintf(logRespErrMsg, req.ClientInfo.ServiceName, req.Operation.Name, err)) - return + logBody := r.Config.LogLevel.Matches(aws.LogDebugWithHTTPBody) + if logBody { + r.HTTPResponse.Body = &teeReaderCloser{ + Reader: io.TeeReader(r.HTTPResponse.Body, lw), + Source: r.HTTPResponse.Body, } + } - b, err := ioutil.ReadAll(lw.buf) + handlerFn := func(req *request.Request) { + b, err := httputil.DumpResponse(req.HTTPResponse, false) if err != nil { - lw.Logger.Log(fmt.Sprintf(logRespErrMsg, req.ClientInfo.ServiceName, req.Operation.Name, err)) + lw.Logger.Log(fmt.Sprintf(logRespErrMsg, + req.ClientInfo.ServiceName, req.Operation.Name, err)) return } - lw.Logger.Log(fmt.Sprintf(logRespMsg, req.ClientInfo.ServiceName, req.Operation.Name, string(body))) - if req.Config.LogLevel.Matches(aws.LogDebugWithHTTPBody) { + + lw.Logger.Log(fmt.Sprintf(logRespMsg, + req.ClientInfo.ServiceName, req.Operation.Name, string(b))) + + if logBody { + b, err := ioutil.ReadAll(lw.buf) + if err != nil { + lw.Logger.Log(fmt.Sprintf(logRespErrMsg, + req.ClientInfo.ServiceName, req.Operation.Name, err)) + return + } + lw.Logger.Log(string(b)) } } @@ -110,3 +168,27 @@ func logResponse(r *request.Request) { Name: handlerName, Fn: handlerFn, }) } + +// LogHTTPResponseHeaderHandler is a SDK request handler to log the HTTP +// response received from a service. Will only log the HTTP response's headers. +// The response payload will not be read. +var LogHTTPResponseHeaderHandler = request.NamedHandler{ + Name: "awssdk.client.LogResponseHeader", + Fn: logResponseHeader, +} + +func logResponseHeader(r *request.Request) { + if r.Config.Logger == nil { + return + } + + b, err := httputil.DumpResponse(r.HTTPResponse, false) + if err != nil { + r.Config.Logger.Log(fmt.Sprintf(logRespErrMsg, + r.ClientInfo.ServiceName, r.Operation.Name, err)) + return + } + + r.Config.Logger.Log(fmt.Sprintf(logRespMsg, + r.ClientInfo.ServiceName, r.Operation.Name, string(b))) +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/client/metadata/client_info.go b/vendor/github.com/aws/aws-sdk-go/aws/client/metadata/client_info.go index 4778056dd..0c48f72e0 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/client/metadata/client_info.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/client/metadata/client_info.go @@ -3,7 +3,9 @@ package metadata // ClientInfo wraps immutable data from the client.Client structure. type ClientInfo struct { ServiceName string + ServiceID string APIVersion string + PartitionID string Endpoint string SigningName string SigningRegion string diff --git a/vendor/github.com/aws/aws-sdk-go/aws/client/no_op_retryer.go b/vendor/github.com/aws/aws-sdk-go/aws/client/no_op_retryer.go new file mode 100644 index 000000000..881d575f0 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/client/no_op_retryer.go @@ -0,0 +1,28 @@ +package client + +import ( + "time" + + "github.com/aws/aws-sdk-go/aws/request" +) + +// NoOpRetryer provides a retryer that performs no retries. +// It should be used when we do not want retries to be performed. +type NoOpRetryer struct{} + +// MaxRetries returns the number of maximum returns the service will use to make +// an individual API; For NoOpRetryer the MaxRetries will always be zero. +func (d NoOpRetryer) MaxRetries() int { + return 0 +} + +// ShouldRetry will always return false for NoOpRetryer, as it should never retry. +func (d NoOpRetryer) ShouldRetry(_ *request.Request) bool { + return false +} + +// RetryRules returns the delay duration before retrying this request again; +// since NoOpRetryer does not retry, RetryRules always returns 0. +func (d NoOpRetryer) RetryRules(_ *request.Request) time.Duration { + return 0 +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/config.go b/vendor/github.com/aws/aws-sdk-go/aws/config.go index 5421b5d4e..2def23fa1 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/config.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/config.go @@ -18,9 +18,9 @@ const UseServiceDefaultRetries = -1 type RequestRetryer interface{} // A Config provides service configuration for service clients. By default, -// all clients will use the defaults.DefaultConfig tructure. +// all clients will use the defaults.DefaultConfig structure. // -// // Create Session with MaxRetry configuration to be shared by multiple +// // Create Session with MaxRetries configuration to be shared by multiple // // service clients. // sess := session.Must(session.NewSession(&aws.Config{ // MaxRetries: aws.Int(3), @@ -45,8 +45,8 @@ type Config struct { // that overrides the default generated endpoint for a client. Set this // to `""` to use the default generated endpoint. // - // @note You must still provide a `Region` value when specifying an - // endpoint for a client. + // Note: You must still provide a `Region` value when specifying an + // endpoint for a client. Endpoint *string // The resolver to use for looking up endpoints for AWS service clients @@ -65,8 +65,8 @@ type Config struct { // noted. A full list of regions is found in the "Regions and Endpoints" // document. // - // @see http://docs.aws.amazon.com/general/latest/gr/rande.html - // AWS Regions and Endpoints + // See http://docs.aws.amazon.com/general/latest/gr/rande.html for AWS + // Regions and Endpoints. Region *string // Set this to `true` to disable SSL when sending requests. Defaults @@ -120,9 +120,10 @@ type Config struct { // will use virtual hosted bucket addressing when possible // (`http://BUCKET.s3.amazonaws.com/KEY`). // - // @note This configuration option is specific to the Amazon S3 service. - // @see http://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html - // Amazon S3: Virtual Hosting of Buckets + // Note: This configuration option is specific to the Amazon S3 service. + // + // See http://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html + // for Amazon S3: Virtual Hosting of Buckets S3ForcePathStyle *bool // Set this to `true` to disable the SDK adding the `Expect: 100-Continue` @@ -160,6 +161,17 @@ type Config struct { // on GetObject API calls. S3DisableContentMD5Validation *bool + // Set this to `true` to have the S3 service client to use the region specified + // in the ARN, when an ARN is provided as an argument to a bucket parameter. + S3UseARNRegion *bool + + // Set this to `true` to enable the SDK to unmarshal API response header maps to + // normalized lower case map keys. + // + // For example S3's X-Amz-Meta prefixed header will be unmarshaled to lower case + // Metadata member's map keys. The value of the header in the map is unaffected. + LowerCaseHeaderMaps *bool + // Set this to `true` to disable the EC2Metadata client from overriding the // default http.Client's Timeout. This is helpful if you do not want the // EC2Metadata client to create a new http.Client. This options is only @@ -223,12 +235,40 @@ type Config struct { // Key: aws.String("//foo//bar//moo"), // }) DisableRestProtocolURICleaning *bool + + // EnableEndpointDiscovery will allow for endpoint discovery on operations that + // have the definition in its model. By default, endpoint discovery is off. + // + // Example: + // sess := session.Must(session.NewSession(&aws.Config{ + // EnableEndpointDiscovery: aws.Bool(true), + // })) + // + // svc := s3.New(sess) + // out, err := svc.GetObject(&s3.GetObjectInput { + // Bucket: aws.String("bucketname"), + // Key: aws.String("/foo/bar/moo"), + // }) + EnableEndpointDiscovery *bool + + // DisableEndpointHostPrefix will disable the SDK's behavior of prefixing + // request endpoint hosts with modeled information. + // + // Disabling this feature is useful when you want to use local endpoints + // for testing that do not support the modeled host prefix pattern. + DisableEndpointHostPrefix *bool + + // STSRegionalEndpoint will enable regional or legacy endpoint resolving + STSRegionalEndpoint endpoints.STSRegionalEndpoint + + // S3UsEast1RegionalEndpoint will enable regional or legacy endpoint resolving + S3UsEast1RegionalEndpoint endpoints.S3UsEast1RegionalEndpoint } // NewConfig returns a new Config pointer that can be chained with builder // methods to set multiple configuration values inline without using pointers. // -// // Create Session with MaxRetry configuration to be shared by multiple +// // Create Session with MaxRetries configuration to be shared by multiple // // service clients. // sess := session.Must(session.NewSession(aws.NewConfig(). // WithMaxRetries(3), @@ -356,6 +396,13 @@ func (c *Config) WithS3DisableContentMD5Validation(enable bool) *Config { } +// WithS3UseARNRegion sets a config S3UseARNRegion value and +// returning a Config pointer for chaining +func (c *Config) WithS3UseARNRegion(enable bool) *Config { + c.S3UseARNRegion = &enable + return c +} + // WithUseDualStack sets a config UseDualStack value returning a Config // pointer for chaining. func (c *Config) WithUseDualStack(enable bool) *Config { @@ -377,6 +424,19 @@ func (c *Config) WithSleepDelay(fn func(time.Duration)) *Config { return c } +// WithEndpointDiscovery will set whether or not to use endpoint discovery. +func (c *Config) WithEndpointDiscovery(t bool) *Config { + c.EnableEndpointDiscovery = &t + return c +} + +// WithDisableEndpointHostPrefix will set whether or not to use modeled host prefix +// when making requests. +func (c *Config) WithDisableEndpointHostPrefix(t bool) *Config { + c.DisableEndpointHostPrefix = &t + return c +} + // MergeIn merges the passed in configs into the existing config object. func (c *Config) MergeIn(cfgs ...*Config) { for _, other := range cfgs { @@ -384,6 +444,20 @@ func (c *Config) MergeIn(cfgs ...*Config) { } } +// WithSTSRegionalEndpoint will set whether or not to use regional endpoint flag +// when resolving the endpoint for a service +func (c *Config) WithSTSRegionalEndpoint(sre endpoints.STSRegionalEndpoint) *Config { + c.STSRegionalEndpoint = sre + return c +} + +// WithS3UsEast1RegionalEndpoint will set whether or not to use regional endpoint flag +// when resolving the endpoint for a service +func (c *Config) WithS3UsEast1RegionalEndpoint(sre endpoints.S3UsEast1RegionalEndpoint) *Config { + c.S3UsEast1RegionalEndpoint = sre + return c +} + func mergeInConfig(dst *Config, other *Config) { if other == nil { return @@ -457,6 +531,10 @@ func mergeInConfig(dst *Config, other *Config) { dst.S3DisableContentMD5Validation = other.S3DisableContentMD5Validation } + if other.S3UseARNRegion != nil { + dst.S3UseARNRegion = other.S3UseARNRegion + } + if other.UseDualStack != nil { dst.UseDualStack = other.UseDualStack } @@ -476,6 +554,22 @@ func mergeInConfig(dst *Config, other *Config) { if other.EnforceShouldRetryCheck != nil { dst.EnforceShouldRetryCheck = other.EnforceShouldRetryCheck } + + if other.EnableEndpointDiscovery != nil { + dst.EnableEndpointDiscovery = other.EnableEndpointDiscovery + } + + if other.DisableEndpointHostPrefix != nil { + dst.DisableEndpointHostPrefix = other.DisableEndpointHostPrefix + } + + if other.STSRegionalEndpoint != endpoints.UnsetSTSEndpoint { + dst.STSRegionalEndpoint = other.STSRegionalEndpoint + } + + if other.S3UsEast1RegionalEndpoint != endpoints.UnsetS3UsEast1Endpoint { + dst.S3UsEast1RegionalEndpoint = other.S3UsEast1RegionalEndpoint + } } // Copy will return a shallow copy of the Config object. If any additional diff --git a/vendor/github.com/aws/aws-sdk-go/aws/context.go b/vendor/github.com/aws/aws-sdk-go/aws/context.go deleted file mode 100644 index 79f426853..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/context.go +++ /dev/null @@ -1,71 +0,0 @@ -package aws - -import ( - "time" -) - -// Context is an copy of the Go v1.7 stdlib's context.Context interface. -// It is represented as a SDK interface to enable you to use the "WithContext" -// API methods with Go v1.6 and a Context type such as golang.org/x/net/context. -// -// See https://golang.org/pkg/context on how to use contexts. -type Context interface { - // Deadline returns the time when work done on behalf of this context - // should be canceled. Deadline returns ok==false when no deadline is - // set. Successive calls to Deadline return the same results. - Deadline() (deadline time.Time, ok bool) - - // Done returns a channel that's closed when work done on behalf of this - // context should be canceled. Done may return nil if this context can - // never be canceled. Successive calls to Done return the same value. - Done() <-chan struct{} - - // Err returns a non-nil error value after Done is closed. Err returns - // Canceled if the context was canceled or DeadlineExceeded if the - // context's deadline passed. No other values for Err are defined. - // After Done is closed, successive calls to Err return the same value. - Err() error - - // Value returns the value associated with this context for key, or nil - // if no value is associated with key. Successive calls to Value with - // the same key returns the same result. - // - // Use context values only for request-scoped data that transits - // processes and API boundaries, not for passing optional parameters to - // functions. - Value(key interface{}) interface{} -} - -// BackgroundContext returns a context that will never be canceled, has no -// values, and no deadline. This context is used by the SDK to provide -// backwards compatibility with non-context API operations and functionality. -// -// Go 1.6 and before: -// This context function is equivalent to context.Background in the Go stdlib. -// -// Go 1.7 and later: -// The context returned will be the value returned by context.Background() -// -// See https://golang.org/pkg/context for more information on Contexts. -func BackgroundContext() Context { - return backgroundCtx -} - -// SleepWithContext will wait for the timer duration to expire, or the context -// is canceled. Which ever happens first. If the context is canceled the Context's -// error will be returned. -// -// Expects Context to always return a non-nil error if the Done channel is closed. -func SleepWithContext(ctx Context, dur time.Duration) error { - t := time.NewTimer(dur) - defer t.Stop() - - select { - case <-t.C: - break - case <-ctx.Done(): - return ctx.Err() - } - - return nil -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/context_1_5.go b/vendor/github.com/aws/aws-sdk-go/aws/context_1_5.go new file mode 100644 index 000000000..2866f9a7f --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/context_1_5.go @@ -0,0 +1,37 @@ +// +build !go1.9 + +package aws + +import "time" + +// Context is an copy of the Go v1.7 stdlib's context.Context interface. +// It is represented as a SDK interface to enable you to use the "WithContext" +// API methods with Go v1.6 and a Context type such as golang.org/x/net/context. +// +// See https://golang.org/pkg/context on how to use contexts. +type Context interface { + // Deadline returns the time when work done on behalf of this context + // should be canceled. Deadline returns ok==false when no deadline is + // set. Successive calls to Deadline return the same results. + Deadline() (deadline time.Time, ok bool) + + // Done returns a channel that's closed when work done on behalf of this + // context should be canceled. Done may return nil if this context can + // never be canceled. Successive calls to Done return the same value. + Done() <-chan struct{} + + // Err returns a non-nil error value after Done is closed. Err returns + // Canceled if the context was canceled or DeadlineExceeded if the + // context's deadline passed. No other values for Err are defined. + // After Done is closed, successive calls to Err return the same value. + Err() error + + // Value returns the value associated with this context for key, or nil + // if no value is associated with key. Successive calls to Value with + // the same key returns the same result. + // + // Use context values only for request-scoped data that transits + // processes and API boundaries, not for passing optional parameters to + // functions. + Value(key interface{}) interface{} +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/context_1_6.go b/vendor/github.com/aws/aws-sdk-go/aws/context_1_6.go deleted file mode 100644 index 8fdda5303..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/context_1_6.go +++ /dev/null @@ -1,41 +0,0 @@ -// +build !go1.7 - -package aws - -import "time" - -// An emptyCtx is a copy of the Go 1.7 context.emptyCtx type. This is copied to -// provide a 1.6 and 1.5 safe version of context that is compatible with Go -// 1.7's Context. -// -// An emptyCtx is never canceled, has no values, and has no deadline. It is not -// struct{}, since vars of this type must have distinct addresses. -type emptyCtx int - -func (*emptyCtx) Deadline() (deadline time.Time, ok bool) { - return -} - -func (*emptyCtx) Done() <-chan struct{} { - return nil -} - -func (*emptyCtx) Err() error { - return nil -} - -func (*emptyCtx) Value(key interface{}) interface{} { - return nil -} - -func (e *emptyCtx) String() string { - switch e { - case backgroundCtx: - return "aws.BackgroundContext" - } - return "unknown empty Context" -} - -var ( - backgroundCtx = new(emptyCtx) -) diff --git a/vendor/github.com/aws/aws-sdk-go/aws/context_1_7.go b/vendor/github.com/aws/aws-sdk-go/aws/context_1_7.go deleted file mode 100644 index 064f75c92..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/context_1_7.go +++ /dev/null @@ -1,9 +0,0 @@ -// +build go1.7 - -package aws - -import "context" - -var ( - backgroundCtx = context.Background() -) diff --git a/vendor/github.com/aws/aws-sdk-go/aws/context_1_9.go b/vendor/github.com/aws/aws-sdk-go/aws/context_1_9.go new file mode 100644 index 000000000..3718b26e1 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/context_1_9.go @@ -0,0 +1,11 @@ +// +build go1.9 + +package aws + +import "context" + +// Context is an alias of the Go stdlib's context.Context interface. +// It can be used within the SDK's API operation "WithContext" methods. +// +// See https://golang.org/pkg/context on how to use contexts. +type Context = context.Context diff --git a/vendor/github.com/aws/aws-sdk-go/aws/context_background_1_5.go b/vendor/github.com/aws/aws-sdk-go/aws/context_background_1_5.go new file mode 100644 index 000000000..2f9446333 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/context_background_1_5.go @@ -0,0 +1,22 @@ +// +build !go1.7 + +package aws + +import ( + "github.com/aws/aws-sdk-go/internal/context" +) + +// BackgroundContext returns a context that will never be canceled, has no +// values, and no deadline. This context is used by the SDK to provide +// backwards compatibility with non-context API operations and functionality. +// +// Go 1.6 and before: +// This context function is equivalent to context.Background in the Go stdlib. +// +// Go 1.7 and later: +// The context returned will be the value returned by context.Background() +// +// See https://golang.org/pkg/context for more information on Contexts. +func BackgroundContext() Context { + return context.BackgroundCtx +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/context_background_1_7.go b/vendor/github.com/aws/aws-sdk-go/aws/context_background_1_7.go new file mode 100644 index 000000000..9c29f29af --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/context_background_1_7.go @@ -0,0 +1,20 @@ +// +build go1.7 + +package aws + +import "context" + +// BackgroundContext returns a context that will never be canceled, has no +// values, and no deadline. This context is used by the SDK to provide +// backwards compatibility with non-context API operations and functionality. +// +// Go 1.6 and before: +// This context function is equivalent to context.Background in the Go stdlib. +// +// Go 1.7 and later: +// The context returned will be the value returned by context.Background() +// +// See https://golang.org/pkg/context for more information on Contexts. +func BackgroundContext() Context { + return context.Background() +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/context_sleep.go b/vendor/github.com/aws/aws-sdk-go/aws/context_sleep.go new file mode 100644 index 000000000..304fd1561 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/context_sleep.go @@ -0,0 +1,24 @@ +package aws + +import ( + "time" +) + +// SleepWithContext will wait for the timer duration to expire, or the context +// is canceled. Which ever happens first. If the context is canceled the Context's +// error will be returned. +// +// Expects Context to always return a non-nil error if the Done channel is closed. +func SleepWithContext(ctx Context, dur time.Duration) error { + t := time.NewTimer(dur) + defer t.Stop() + + select { + case <-t.C: + break + case <-ctx.Done(): + return ctx.Err() + } + + return nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/convert_types.go b/vendor/github.com/aws/aws-sdk-go/aws/convert_types.go index ff5d58e06..4e076c183 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/convert_types.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/convert_types.go @@ -179,6 +179,242 @@ func IntValueMap(src map[string]*int) map[string]int { return dst } +// Uint returns a pointer to the uint value passed in. +func Uint(v uint) *uint { + return &v +} + +// UintValue returns the value of the uint pointer passed in or +// 0 if the pointer is nil. +func UintValue(v *uint) uint { + if v != nil { + return *v + } + return 0 +} + +// UintSlice converts a slice of uint values uinto a slice of +// uint pointers +func UintSlice(src []uint) []*uint { + dst := make([]*uint, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// UintValueSlice converts a slice of uint pointers uinto a slice of +// uint values +func UintValueSlice(src []*uint) []uint { + dst := make([]uint, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// UintMap converts a string map of uint values uinto a string +// map of uint pointers +func UintMap(src map[string]uint) map[string]*uint { + dst := make(map[string]*uint) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// UintValueMap converts a string map of uint pointers uinto a string +// map of uint values +func UintValueMap(src map[string]*uint) map[string]uint { + dst := make(map[string]uint) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Int8 returns a pointer to the int8 value passed in. +func Int8(v int8) *int8 { + return &v +} + +// Int8Value returns the value of the int8 pointer passed in or +// 0 if the pointer is nil. +func Int8Value(v *int8) int8 { + if v != nil { + return *v + } + return 0 +} + +// Int8Slice converts a slice of int8 values into a slice of +// int8 pointers +func Int8Slice(src []int8) []*int8 { + dst := make([]*int8, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// Int8ValueSlice converts a slice of int8 pointers into a slice of +// int8 values +func Int8ValueSlice(src []*int8) []int8 { + dst := make([]int8, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// Int8Map converts a string map of int8 values into a string +// map of int8 pointers +func Int8Map(src map[string]int8) map[string]*int8 { + dst := make(map[string]*int8) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// Int8ValueMap converts a string map of int8 pointers into a string +// map of int8 values +func Int8ValueMap(src map[string]*int8) map[string]int8 { + dst := make(map[string]int8) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Int16 returns a pointer to the int16 value passed in. +func Int16(v int16) *int16 { + return &v +} + +// Int16Value returns the value of the int16 pointer passed in or +// 0 if the pointer is nil. +func Int16Value(v *int16) int16 { + if v != nil { + return *v + } + return 0 +} + +// Int16Slice converts a slice of int16 values into a slice of +// int16 pointers +func Int16Slice(src []int16) []*int16 { + dst := make([]*int16, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// Int16ValueSlice converts a slice of int16 pointers into a slice of +// int16 values +func Int16ValueSlice(src []*int16) []int16 { + dst := make([]int16, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// Int16Map converts a string map of int16 values into a string +// map of int16 pointers +func Int16Map(src map[string]int16) map[string]*int16 { + dst := make(map[string]*int16) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// Int16ValueMap converts a string map of int16 pointers into a string +// map of int16 values +func Int16ValueMap(src map[string]*int16) map[string]int16 { + dst := make(map[string]int16) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Int32 returns a pointer to the int32 value passed in. +func Int32(v int32) *int32 { + return &v +} + +// Int32Value returns the value of the int32 pointer passed in or +// 0 if the pointer is nil. +func Int32Value(v *int32) int32 { + if v != nil { + return *v + } + return 0 +} + +// Int32Slice converts a slice of int32 values into a slice of +// int32 pointers +func Int32Slice(src []int32) []*int32 { + dst := make([]*int32, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// Int32ValueSlice converts a slice of int32 pointers into a slice of +// int32 values +func Int32ValueSlice(src []*int32) []int32 { + dst := make([]int32, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// Int32Map converts a string map of int32 values into a string +// map of int32 pointers +func Int32Map(src map[string]int32) map[string]*int32 { + dst := make(map[string]*int32) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// Int32ValueMap converts a string map of int32 pointers into a string +// map of int32 values +func Int32ValueMap(src map[string]*int32) map[string]int32 { + dst := make(map[string]int32) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + // Int64 returns a pointer to the int64 value passed in. func Int64(v int64) *int64 { return &v @@ -238,6 +474,301 @@ func Int64ValueMap(src map[string]*int64) map[string]int64 { return dst } +// Uint8 returns a pointer to the uint8 value passed in. +func Uint8(v uint8) *uint8 { + return &v +} + +// Uint8Value returns the value of the uint8 pointer passed in or +// 0 if the pointer is nil. +func Uint8Value(v *uint8) uint8 { + if v != nil { + return *v + } + return 0 +} + +// Uint8Slice converts a slice of uint8 values into a slice of +// uint8 pointers +func Uint8Slice(src []uint8) []*uint8 { + dst := make([]*uint8, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// Uint8ValueSlice converts a slice of uint8 pointers into a slice of +// uint8 values +func Uint8ValueSlice(src []*uint8) []uint8 { + dst := make([]uint8, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// Uint8Map converts a string map of uint8 values into a string +// map of uint8 pointers +func Uint8Map(src map[string]uint8) map[string]*uint8 { + dst := make(map[string]*uint8) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// Uint8ValueMap converts a string map of uint8 pointers into a string +// map of uint8 values +func Uint8ValueMap(src map[string]*uint8) map[string]uint8 { + dst := make(map[string]uint8) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Uint16 returns a pointer to the uint16 value passed in. +func Uint16(v uint16) *uint16 { + return &v +} + +// Uint16Value returns the value of the uint16 pointer passed in or +// 0 if the pointer is nil. +func Uint16Value(v *uint16) uint16 { + if v != nil { + return *v + } + return 0 +} + +// Uint16Slice converts a slice of uint16 values into a slice of +// uint16 pointers +func Uint16Slice(src []uint16) []*uint16 { + dst := make([]*uint16, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// Uint16ValueSlice converts a slice of uint16 pointers into a slice of +// uint16 values +func Uint16ValueSlice(src []*uint16) []uint16 { + dst := make([]uint16, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// Uint16Map converts a string map of uint16 values into a string +// map of uint16 pointers +func Uint16Map(src map[string]uint16) map[string]*uint16 { + dst := make(map[string]*uint16) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// Uint16ValueMap converts a string map of uint16 pointers into a string +// map of uint16 values +func Uint16ValueMap(src map[string]*uint16) map[string]uint16 { + dst := make(map[string]uint16) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Uint32 returns a pointer to the uint32 value passed in. +func Uint32(v uint32) *uint32 { + return &v +} + +// Uint32Value returns the value of the uint32 pointer passed in or +// 0 if the pointer is nil. +func Uint32Value(v *uint32) uint32 { + if v != nil { + return *v + } + return 0 +} + +// Uint32Slice converts a slice of uint32 values into a slice of +// uint32 pointers +func Uint32Slice(src []uint32) []*uint32 { + dst := make([]*uint32, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// Uint32ValueSlice converts a slice of uint32 pointers into a slice of +// uint32 values +func Uint32ValueSlice(src []*uint32) []uint32 { + dst := make([]uint32, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// Uint32Map converts a string map of uint32 values into a string +// map of uint32 pointers +func Uint32Map(src map[string]uint32) map[string]*uint32 { + dst := make(map[string]*uint32) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// Uint32ValueMap converts a string map of uint32 pointers into a string +// map of uint32 values +func Uint32ValueMap(src map[string]*uint32) map[string]uint32 { + dst := make(map[string]uint32) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Uint64 returns a pointer to the uint64 value passed in. +func Uint64(v uint64) *uint64 { + return &v +} + +// Uint64Value returns the value of the uint64 pointer passed in or +// 0 if the pointer is nil. +func Uint64Value(v *uint64) uint64 { + if v != nil { + return *v + } + return 0 +} + +// Uint64Slice converts a slice of uint64 values into a slice of +// uint64 pointers +func Uint64Slice(src []uint64) []*uint64 { + dst := make([]*uint64, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// Uint64ValueSlice converts a slice of uint64 pointers into a slice of +// uint64 values +func Uint64ValueSlice(src []*uint64) []uint64 { + dst := make([]uint64, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// Uint64Map converts a string map of uint64 values into a string +// map of uint64 pointers +func Uint64Map(src map[string]uint64) map[string]*uint64 { + dst := make(map[string]*uint64) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// Uint64ValueMap converts a string map of uint64 pointers into a string +// map of uint64 values +func Uint64ValueMap(src map[string]*uint64) map[string]uint64 { + dst := make(map[string]uint64) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Float32 returns a pointer to the float32 value passed in. +func Float32(v float32) *float32 { + return &v +} + +// Float32Value returns the value of the float32 pointer passed in or +// 0 if the pointer is nil. +func Float32Value(v *float32) float32 { + if v != nil { + return *v + } + return 0 +} + +// Float32Slice converts a slice of float32 values into a slice of +// float32 pointers +func Float32Slice(src []float32) []*float32 { + dst := make([]*float32, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// Float32ValueSlice converts a slice of float32 pointers into a slice of +// float32 values +func Float32ValueSlice(src []*float32) []float32 { + dst := make([]float32, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// Float32Map converts a string map of float32 values into a string +// map of float32 pointers +func Float32Map(src map[string]float32) map[string]*float32 { + dst := make(map[string]*float32) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// Float32ValueMap converts a string map of float32 pointers into a string +// map of float32 values +func Float32ValueMap(src map[string]*float32) map[string]float32 { + dst := make(map[string]float32) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + // Float64 returns a pointer to the float64 value passed in. func Float64(v float64) *float64 { return &v diff --git a/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/handlers.go b/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/handlers.go index cfcddf3dc..aa902d708 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/handlers.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/handlers.go @@ -72,9 +72,9 @@ var ValidateReqSigHandler = request.NamedHandler{ signedTime = r.LastSignedAt } - // 10 minutes to allow for some clock skew/delays in transmission. + // 5 minutes to allow for some clock skew/delays in transmission. // Would be improved with aws/aws-sdk-go#423 - if signedTime.Add(10 * time.Minute).After(time.Now()) { + if signedTime.Add(5 * time.Minute).After(time.Now()) { return } @@ -159,9 +159,9 @@ func handleSendError(r *request.Request, err error) { Body: ioutil.NopCloser(bytes.NewReader([]byte{})), } } - // Catch all other request errors. - r.Error = awserr.New("RequestError", "send request failed", err) - r.Retryable = aws.Bool(true) // network errors are retryable + // Catch all request errors, and let the default retrier determine + // if the error is retryable. + r.Error = awserr.New(request.ErrCodeRequestError, "send request failed", err) // Override the error with a context canceled error, if that was canceled. ctx := r.Context() @@ -184,37 +184,39 @@ var ValidateResponseHandler = request.NamedHandler{Name: "core.ValidateResponseH // AfterRetryHandler performs final checks to determine if the request should // be retried and how long to delay. -var AfterRetryHandler = request.NamedHandler{Name: "core.AfterRetryHandler", Fn: func(r *request.Request) { - // If one of the other handlers already set the retry state - // we don't want to override it based on the service's state - if r.Retryable == nil || aws.BoolValue(r.Config.EnforceShouldRetryCheck) { - r.Retryable = aws.Bool(r.ShouldRetry(r)) - } +var AfterRetryHandler = request.NamedHandler{ + Name: "core.AfterRetryHandler", + Fn: func(r *request.Request) { + // If one of the other handlers already set the retry state + // we don't want to override it based on the service's state + if r.Retryable == nil || aws.BoolValue(r.Config.EnforceShouldRetryCheck) { + r.Retryable = aws.Bool(r.ShouldRetry(r)) + } - if r.WillRetry() { - r.RetryDelay = r.RetryRules(r) + if r.WillRetry() { + r.RetryDelay = r.RetryRules(r) - if sleepFn := r.Config.SleepDelay; sleepFn != nil { - // Support SleepDelay for backwards compatibility and testing - sleepFn(r.RetryDelay) - } else if err := aws.SleepWithContext(r.Context(), r.RetryDelay); err != nil { - r.Error = awserr.New(request.CanceledErrorCode, - "request context canceled", err) - r.Retryable = aws.Bool(false) - return - } + if sleepFn := r.Config.SleepDelay; sleepFn != nil { + // Support SleepDelay for backwards compatibility and testing + sleepFn(r.RetryDelay) + } else if err := aws.SleepWithContext(r.Context(), r.RetryDelay); err != nil { + r.Error = awserr.New(request.CanceledErrorCode, + "request context canceled", err) + r.Retryable = aws.Bool(false) + return + } - // when the expired token exception occurs the credentials - // need to be expired locally so that the next request to - // get credentials will trigger a credentials refresh. - if r.IsErrorExpired() { - r.Config.Credentials.Expire() - } + // when the expired token exception occurs the credentials + // need to be expired locally so that the next request to + // get credentials will trigger a credentials refresh. + if r.IsErrorExpired() { + r.Config.Credentials.Expire() + } - r.RetryCount++ - r.Error = nil - } -}} + r.RetryCount++ + r.Error = nil + } + }} // ValidateEndpointHandler is a request handler to validate a request had the // appropriate Region and Endpoint set. Will set r.Error if the endpoint or diff --git a/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/user_agent.go b/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/user_agent.go index a15f496bc..ab69c7a6f 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/user_agent.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/user_agent.go @@ -17,7 +17,7 @@ var SDKVersionUserAgentHandler = request.NamedHandler{ } const execEnvVar = `AWS_EXECUTION_ENV` -const execEnvUAKey = `exec_env` +const execEnvUAKey = `exec-env` // AddHostExecEnvUserAgentHander is a request handler appending the SDK's // execution environment to the user agent. diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/chain_provider.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/chain_provider.go index f298d6596..3ad1e798d 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/credentials/chain_provider.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/credentials/chain_provider.go @@ -9,9 +9,7 @@ var ( // providers in the ChainProvider. // // This has been deprecated. For verbose error messaging set - // aws.Config.CredentialsChainVerboseErrors to true - // - // @readonly + // aws.Config.CredentialsChainVerboseErrors to true. ErrNoValidProvidersFoundInChain = awserr.New("NoCredentialProviders", `no valid providers in chain. Deprecated. For verbose messaging see aws.Config.CredentialsChainVerboseErrors`, diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/context_background_go1.5.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/context_background_go1.5.go new file mode 100644 index 000000000..5852b2648 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/credentials/context_background_go1.5.go @@ -0,0 +1,22 @@ +// +build !go1.7 + +package credentials + +import ( + "github.com/aws/aws-sdk-go/internal/context" +) + +// backgroundContext returns a context that will never be canceled, has no +// values, and no deadline. This context is used by the SDK to provide +// backwards compatibility with non-context API operations and functionality. +// +// Go 1.6 and before: +// This context function is equivalent to context.Background in the Go stdlib. +// +// Go 1.7 and later: +// The context returned will be the value returned by context.Background() +// +// See https://golang.org/pkg/context for more information on Contexts. +func backgroundContext() Context { + return context.BackgroundCtx +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/context_background_go1.7.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/context_background_go1.7.go new file mode 100644 index 000000000..388b21541 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/credentials/context_background_go1.7.go @@ -0,0 +1,20 @@ +// +build go1.7 + +package credentials + +import "context" + +// backgroundContext returns a context that will never be canceled, has no +// values, and no deadline. This context is used by the SDK to provide +// backwards compatibility with non-context API operations and functionality. +// +// Go 1.6 and before: +// This context function is equivalent to context.Background in the Go stdlib. +// +// Go 1.7 and later: +// The context returned will be the value returned by context.Background() +// +// See https://golang.org/pkg/context for more information on Contexts. +func backgroundContext() Context { + return context.Background() +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/context_go1.5.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/context_go1.5.go new file mode 100644 index 000000000..8152a864a --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/credentials/context_go1.5.go @@ -0,0 +1,39 @@ +// +build !go1.9 + +package credentials + +import "time" + +// Context is an copy of the Go v1.7 stdlib's context.Context interface. +// It is represented as a SDK interface to enable you to use the "WithContext" +// API methods with Go v1.6 and a Context type such as golang.org/x/net/context. +// +// This type, aws.Context, and context.Context are equivalent. +// +// See https://golang.org/pkg/context on how to use contexts. +type Context interface { + // Deadline returns the time when work done on behalf of this context + // should be canceled. Deadline returns ok==false when no deadline is + // set. Successive calls to Deadline return the same results. + Deadline() (deadline time.Time, ok bool) + + // Done returns a channel that's closed when work done on behalf of this + // context should be canceled. Done may return nil if this context can + // never be canceled. Successive calls to Done return the same value. + Done() <-chan struct{} + + // Err returns a non-nil error value after Done is closed. Err returns + // Canceled if the context was canceled or DeadlineExceeded if the + // context's deadline passed. No other values for Err are defined. + // After Done is closed, successive calls to Err return the same value. + Err() error + + // Value returns the value associated with this context for key, or nil + // if no value is associated with key. Successive calls to Value with + // the same key returns the same result. + // + // Use context values only for request-scoped data that transits + // processes and API boundaries, not for passing optional parameters to + // functions. + Value(key interface{}) interface{} +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/context_go1.9.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/context_go1.9.go new file mode 100644 index 000000000..4356edb3d --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/credentials/context_go1.9.go @@ -0,0 +1,13 @@ +// +build go1.9 + +package credentials + +import "context" + +// Context is an alias of the Go stdlib's context.Context interface. +// It can be used within the SDK's API operation "WithContext" methods. +// +// This type, aws.Context, and context.Context are equivalent. +// +// See https://golang.org/pkg/context on how to use contexts. +type Context = context.Context diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/credentials.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/credentials.go index 42416fc2f..c75d7bba0 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/credentials/credentials.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/credentials/credentials.go @@ -49,8 +49,12 @@ package credentials import ( - "sync" + "fmt" + "sync/atomic" "time" + + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/internal/sync/singleflight" ) // AnonymousCredentials is an empty Credential object that can be used as @@ -64,8 +68,6 @@ import ( // Credentials: credentials.AnonymousCredentials, // }))) // // Access public S3 buckets. -// -// @readonly var AnonymousCredentials = NewStaticCredentials("", "", "") // A Value is the AWS credentials value for individual credential fields. @@ -83,6 +85,12 @@ type Value struct { ProviderName string } +// HasKeys returns if the credentials Value has both AccessKeyID and +// SecretAccessKey value set. +func (v Value) HasKeys() bool { + return len(v.AccessKeyID) != 0 && len(v.SecretAccessKey) != 0 +} + // A Provider is the interface for any component which will provide credentials // Value. A provider is required to manage its own Expired state, and what to // be expired means. @@ -99,6 +107,14 @@ type Provider interface { IsExpired() bool } +// An Expirer is an interface that Providers can implement to expose the expiration +// time, if known. If the Provider cannot accurately provide this info, +// it should not implement this interface. +type Expirer interface { + // The time at which the credentials are no longer valid + ExpiresAt() time.Time +} + // An ErrorProvider is a stub credentials provider that always returns an error // this is used by the SDK when construction a known provider is not possible // due to an error. @@ -158,13 +174,19 @@ func (e *Expiry) SetExpiration(expiration time.Time, window time.Duration) { // IsExpired returns if the credentials are expired. func (e *Expiry) IsExpired() bool { - if e.CurrentTime == nil { - e.CurrentTime = time.Now + curTime := e.CurrentTime + if curTime == nil { + curTime = time.Now } - return e.expiration.Before(e.CurrentTime()) + return e.expiration.Before(curTime()) +} + +// ExpiresAt returns the expiration time of the credential +func (e *Expiry) ExpiresAt() time.Time { + return e.expiration } -// A Credentials provides synchronous safe retrieval of AWS credentials Value. +// A Credentials provides concurrency safe retrieval of AWS credentials Value. // Credentials will cache the credentials value until they expire. Once the value // expires the next Get will attempt to retrieve valid credentials. // @@ -176,19 +198,62 @@ func (e *Expiry) IsExpired() bool { // first instance of the credentials Value. All calls to Get() after that // will return the cached credentials Value until IsExpired() returns true. type Credentials struct { - creds Value - forceRefresh bool - m sync.Mutex + creds atomic.Value + sf singleflight.Group provider Provider } // NewCredentials returns a pointer to a new Credentials with the provider set. func NewCredentials(provider Provider) *Credentials { - return &Credentials{ - provider: provider, - forceRefresh: true, + c := &Credentials{ + provider: provider, } + c.creds.Store(Value{}) + return c +} + +// GetWithContext returns the credentials value, or error if the credentials +// Value failed to be retrieved. Will return early if the passed in context is +// canceled. +// +// Will return the cached credentials Value if it has not expired. If the +// credentials Value has expired the Provider's Retrieve() will be called +// to refresh the credentials. +// +// If Credentials.Expire() was called the credentials Value will be force +// expired, and the next call to Get() will cause them to be refreshed. +// +// Passed in Context is equivalent to aws.Context, and context.Context. +func (c *Credentials) GetWithContext(ctx Context) (Value, error) { + if curCreds := c.creds.Load(); !c.isExpired(curCreds) { + return curCreds.(Value), nil + } + + // Cannot pass context down to the actual retrieve, because the first + // context would cancel the whole group when there is not direct + // association of items in the group. + resCh := c.sf.DoChan("", c.singleRetrieve) + select { + case res := <-resCh: + return res.Val.(Value), res.Err + case <-ctx.Done(): + return Value{}, awserr.New("RequestCanceled", + "request context canceled", ctx.Err()) + } +} + +func (c *Credentials) singleRetrieve() (interface{}, error) { + if curCreds := c.creds.Load(); !c.isExpired(curCreds) { + return curCreds.(Value), nil + } + + creds, err := c.provider.Retrieve() + if err == nil { + c.creds.Store(creds) + } + + return creds, err } // Get returns the credentials value, or error if the credentials Value failed @@ -201,19 +266,7 @@ func NewCredentials(provider Provider) *Credentials { // If Credentials.Expire() was called the credentials Value will be force // expired, and the next call to Get() will cause them to be refreshed. func (c *Credentials) Get() (Value, error) { - c.m.Lock() - defer c.m.Unlock() - - if c.isExpired() { - creds, err := c.provider.Retrieve() - if err != nil { - return Value{}, err - } - c.creds = creds - c.forceRefresh = false - } - - return c.creds, nil + return c.GetWithContext(backgroundContext()) } // Expire expires the credentials and forces them to be retrieved on the @@ -222,10 +275,7 @@ func (c *Credentials) Get() (Value, error) { // This will override the Provider's expired state, and force Credentials // to call the Provider's Retrieve(). func (c *Credentials) Expire() { - c.m.Lock() - defer c.m.Unlock() - - c.forceRefresh = true + c.creds.Store(Value{}) } // IsExpired returns if the credentials are no longer valid, and need @@ -234,13 +284,27 @@ func (c *Credentials) Expire() { // If the Credentials were forced to be expired with Expire() this will // reflect that override. func (c *Credentials) IsExpired() bool { - c.m.Lock() - defer c.m.Unlock() - - return c.isExpired() + return c.isExpired(c.creds.Load()) } // isExpired helper method wrapping the definition of expired credentials. -func (c *Credentials) isExpired() bool { - return c.forceRefresh || c.provider.IsExpired() +func (c *Credentials) isExpired(creds interface{}) bool { + return creds == nil || creds.(Value) == Value{} || c.provider.IsExpired() +} + +// ExpiresAt provides access to the functionality of the Expirer interface of +// the underlying Provider, if it supports that interface. Otherwise, it returns +// an error. +func (c *Credentials) ExpiresAt() (time.Time, error) { + expirer, ok := c.provider.(Expirer) + if !ok { + return time.Time{}, awserr.New("ProviderNotExpirer", + fmt.Sprintf("provider %s does not support ExpiresAt()", c.creds.Load().(Value).ProviderName), + nil) + } + if c.creds.Load().(Value) == (Value{}) { + // set expiration time to the distant past + return time.Time{}, nil + } + return expirer.ExpiresAt(), nil } diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds/ec2_role_provider.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds/ec2_role_provider.go index c39749524..43d4ed386 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds/ec2_role_provider.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds/ec2_role_provider.go @@ -4,7 +4,6 @@ import ( "bufio" "encoding/json" "fmt" - "path" "strings" "time" @@ -12,6 +11,8 @@ import ( "github.com/aws/aws-sdk-go/aws/client" "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/ec2metadata" + "github.com/aws/aws-sdk-go/aws/request" + "github.com/aws/aws-sdk-go/internal/sdkuri" ) // ProviderName provides a name of EC2Role provider @@ -125,7 +126,7 @@ type ec2RoleCredRespBody struct { Message string } -const iamSecurityCredsPath = "/iam/security-credentials" +const iamSecurityCredsPath = "iam/security-credentials/" // requestCredList requests a list of credentials from the EC2 service. // If there are no credentials, or there is an error making or receiving the request @@ -142,7 +143,8 @@ func requestCredList(client *ec2metadata.EC2Metadata) ([]string, error) { } if err := s.Err(); err != nil { - return nil, awserr.New("SerializationError", "failed to read EC2 instance role from metadata service", err) + return nil, awserr.New(request.ErrCodeSerialization, + "failed to read EC2 instance role from metadata service", err) } return credsList, nil @@ -153,7 +155,7 @@ func requestCredList(client *ec2metadata.EC2Metadata) ([]string, error) { // If the credentials cannot be found, or there is an error reading the response // and error will be returned. func requestCred(client *ec2metadata.EC2Metadata, credsName string) (ec2RoleCredRespBody, error) { - resp, err := client.GetMetadata(path.Join(iamSecurityCredsPath, credsName)) + resp, err := client.GetMetadata(sdkuri.PathJoin(iamSecurityCredsPath, credsName)) if err != nil { return ec2RoleCredRespBody{}, awserr.New("EC2RoleRequestError", @@ -164,7 +166,7 @@ func requestCred(client *ec2metadata.EC2Metadata, credsName string) (ec2RoleCred respCreds := ec2RoleCredRespBody{} if err := json.NewDecoder(strings.NewReader(resp)).Decode(&respCreds); err != nil { return ec2RoleCredRespBody{}, - awserr.New("SerializationError", + awserr.New(request.ErrCodeSerialization, fmt.Sprintf("failed to decode %s EC2 instance role credentials", credsName), err) } diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/endpointcreds/provider.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/endpointcreds/provider.go index a4cec5c55..1a7af53a4 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/credentials/endpointcreds/provider.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/credentials/endpointcreds/provider.go @@ -39,6 +39,7 @@ import ( "github.com/aws/aws-sdk-go/aws/client/metadata" "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/request" + "github.com/aws/aws-sdk-go/private/protocol/json/jsonutil" ) // ProviderName is the name of the credentials provider. @@ -65,6 +66,10 @@ type Provider struct { // // If ExpiryWindow is 0 or less it will be ignored. ExpiryWindow time.Duration + + // Optional authorization token value if set will be used as the value of + // the Authorization header of the endpoint credential request. + AuthorizationToken string } // NewProviderClient returns a credentials Provider for retrieving AWS credentials @@ -93,8 +98,8 @@ func NewProviderClient(cfg aws.Config, handlers request.Handlers, endpoint strin return p } -// NewCredentialsClient returns a Credentials wrapper for retrieving credentials -// from an arbitrary endpoint concurrently. The client will request the +// NewCredentialsClient returns a pointer to a new Credentials object +// wrapping the endpoint credentials Provider. func NewCredentialsClient(cfg aws.Config, handlers request.Handlers, endpoint string, options ...func(*Provider)) *credentials.Credentials { return credentials.NewCredentials(NewProviderClient(cfg, handlers, endpoint, options...)) } @@ -152,6 +157,9 @@ func (p *Provider) getCredentials() (*getCredentialsOutput, error) { out := &getCredentialsOutput{} req := p.Client.NewRequest(op, nil, out) req.HTTPRequest.Header.Set("Accept", "application/json") + if authToken := p.AuthorizationToken; len(authToken) != 0 { + req.HTTPRequest.Header.Set("Authorization", authToken) + } return out, req.Send() } @@ -167,7 +175,7 @@ func unmarshalHandler(r *request.Request) { out := r.Data.(*getCredentialsOutput) if err := json.NewDecoder(r.HTTPResponse.Body).Decode(&out); err != nil { - r.Error = awserr.New("SerializationError", + r.Error = awserr.New(request.ErrCodeSerialization, "failed to decode endpoint credentials", err, ) @@ -178,11 +186,15 @@ func unmarshalError(r *request.Request) { defer r.HTTPResponse.Body.Close() var errOut errorOutput - if err := json.NewDecoder(r.HTTPResponse.Body).Decode(&errOut); err != nil { - r.Error = awserr.New("SerializationError", - "failed to decode endpoint credentials", - err, + err := jsonutil.UnmarshalJSONError(&errOut, r.HTTPResponse.Body) + if err != nil { + r.Error = awserr.NewRequestFailure( + awserr.New(request.ErrCodeSerialization, + "failed to decode error message", err), + r.HTTPResponse.StatusCode, + r.RequestID, ) + return } // Response body format is not consistent between metadata endpoints. diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/env_provider.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/env_provider.go index c14231a16..54c5cf733 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/credentials/env_provider.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/credentials/env_provider.go @@ -12,14 +12,10 @@ const EnvProviderName = "EnvProvider" var ( // ErrAccessKeyIDNotFound is returned when the AWS Access Key ID can't be // found in the process's environment. - // - // @readonly ErrAccessKeyIDNotFound = awserr.New("EnvAccessKeyNotFound", "AWS_ACCESS_KEY_ID or AWS_ACCESS_KEY not found in environment", nil) // ErrSecretAccessKeyNotFound is returned when the AWS Secret Access Key // can't be found in the process's environment. - // - // @readonly ErrSecretAccessKeyNotFound = awserr.New("EnvSecretNotFound", "AWS_SECRET_ACCESS_KEY or AWS_SECRET_KEY not found in environment", nil) ) diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/processcreds/provider.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/processcreds/provider.go new file mode 100644 index 000000000..e62483600 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/credentials/processcreds/provider.go @@ -0,0 +1,426 @@ +/* +Package processcreds is a credential Provider to retrieve `credential_process` +credentials. + +WARNING: The following describes a method of sourcing credentials from an external +process. This can potentially be dangerous, so proceed with caution. Other +credential providers should be preferred if at all possible. If using this +option, you should make sure that the config file is as locked down as possible +using security best practices for your operating system. + +You can use credentials from a `credential_process` in a variety of ways. + +One way is to setup your shared config file, located in the default +location, with the `credential_process` key and the command you want to be +called. You also need to set the AWS_SDK_LOAD_CONFIG environment variable +(e.g., `export AWS_SDK_LOAD_CONFIG=1`) to use the shared config file. + + [default] + credential_process = /command/to/call + +Creating a new session will use the credential process to retrieve credentials. +NOTE: If there are credentials in the profile you are using, the credential +process will not be used. + + // Initialize a session to load credentials. + sess, _ := session.NewSession(&aws.Config{ + Region: aws.String("us-east-1")}, + ) + + // Create S3 service client to use the credentials. + svc := s3.New(sess) + +Another way to use the `credential_process` method is by using +`credentials.NewCredentials()` and providing a command to be executed to +retrieve credentials: + + // Create credentials using the ProcessProvider. + creds := processcreds.NewCredentials("/path/to/command") + + // Create service client value configured for credentials. + svc := s3.New(sess, &aws.Config{Credentials: creds}) + +You can set a non-default timeout for the `credential_process` with another +constructor, `credentials.NewCredentialsTimeout()`, providing the timeout. To +set a one minute timeout: + + // Create credentials using the ProcessProvider. + creds := processcreds.NewCredentialsTimeout( + "/path/to/command", + time.Duration(500) * time.Millisecond) + +If you need more control, you can set any configurable options in the +credentials using one or more option functions. For example, you can set a two +minute timeout, a credential duration of 60 minutes, and a maximum stdout +buffer size of 2k. + + creds := processcreds.NewCredentials( + "/path/to/command", + func(opt *ProcessProvider) { + opt.Timeout = time.Duration(2) * time.Minute + opt.Duration = time.Duration(60) * time.Minute + opt.MaxBufSize = 2048 + }) + +You can also use your own `exec.Cmd`: + + // Create an exec.Cmd + myCommand := exec.Command("/path/to/command") + + // Create credentials using your exec.Cmd and custom timeout + creds := processcreds.NewCredentialsCommand( + myCommand, + func(opt *processcreds.ProcessProvider) { + opt.Timeout = time.Duration(1) * time.Second + }) +*/ +package processcreds + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "io/ioutil" + "os" + "os/exec" + "runtime" + "strings" + "time" + + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/internal/sdkio" +) + +const ( + // ProviderName is the name this credentials provider will label any + // returned credentials Value with. + ProviderName = `ProcessProvider` + + // ErrCodeProcessProviderParse error parsing process output + ErrCodeProcessProviderParse = "ProcessProviderParseError" + + // ErrCodeProcessProviderVersion version error in output + ErrCodeProcessProviderVersion = "ProcessProviderVersionError" + + // ErrCodeProcessProviderRequired required attribute missing in output + ErrCodeProcessProviderRequired = "ProcessProviderRequiredError" + + // ErrCodeProcessProviderExecution execution of command failed + ErrCodeProcessProviderExecution = "ProcessProviderExecutionError" + + // errMsgProcessProviderTimeout process took longer than allowed + errMsgProcessProviderTimeout = "credential process timed out" + + // errMsgProcessProviderProcess process error + errMsgProcessProviderProcess = "error in credential_process" + + // errMsgProcessProviderParse problem parsing output + errMsgProcessProviderParse = "parse failed of credential_process output" + + // errMsgProcessProviderVersion version error in output + errMsgProcessProviderVersion = "wrong version in process output (not 1)" + + // errMsgProcessProviderMissKey missing access key id in output + errMsgProcessProviderMissKey = "missing AccessKeyId in process output" + + // errMsgProcessProviderMissSecret missing secret acess key in output + errMsgProcessProviderMissSecret = "missing SecretAccessKey in process output" + + // errMsgProcessProviderPrepareCmd prepare of command failed + errMsgProcessProviderPrepareCmd = "failed to prepare command" + + // errMsgProcessProviderEmptyCmd command must not be empty + errMsgProcessProviderEmptyCmd = "command must not be empty" + + // errMsgProcessProviderPipe failed to initialize pipe + errMsgProcessProviderPipe = "failed to initialize pipe" + + // DefaultDuration is the default amount of time in minutes that the + // credentials will be valid for. + DefaultDuration = time.Duration(15) * time.Minute + + // DefaultBufSize limits buffer size from growing to an enormous + // amount due to a faulty process. + DefaultBufSize = int(8 * sdkio.KibiByte) + + // DefaultTimeout default limit on time a process can run. + DefaultTimeout = time.Duration(1) * time.Minute +) + +// ProcessProvider satisfies the credentials.Provider interface, and is a +// client to retrieve credentials from a process. +type ProcessProvider struct { + staticCreds bool + credentials.Expiry + originalCommand []string + + // Expiry duration of the credentials. Defaults to 15 minutes if not set. + Duration time.Duration + + // ExpiryWindow will allow the credentials to trigger refreshing prior to + // the credentials actually expiring. This is beneficial so race conditions + // with expiring credentials do not cause request to fail unexpectedly + // due to ExpiredTokenException exceptions. + // + // So a ExpiryWindow of 10s would cause calls to IsExpired() to return true + // 10 seconds before the credentials are actually expired. + // + // If ExpiryWindow is 0 or less it will be ignored. + ExpiryWindow time.Duration + + // A string representing an os command that should return a JSON with + // credential information. + command *exec.Cmd + + // MaxBufSize limits memory usage from growing to an enormous + // amount due to a faulty process. + MaxBufSize int + + // Timeout limits the time a process can run. + Timeout time.Duration +} + +// NewCredentials returns a pointer to a new Credentials object wrapping the +// ProcessProvider. The credentials will expire every 15 minutes by default. +func NewCredentials(command string, options ...func(*ProcessProvider)) *credentials.Credentials { + p := &ProcessProvider{ + command: exec.Command(command), + Duration: DefaultDuration, + Timeout: DefaultTimeout, + MaxBufSize: DefaultBufSize, + } + + for _, option := range options { + option(p) + } + + return credentials.NewCredentials(p) +} + +// NewCredentialsTimeout returns a pointer to a new Credentials object with +// the specified command and timeout, and default duration and max buffer size. +func NewCredentialsTimeout(command string, timeout time.Duration) *credentials.Credentials { + p := NewCredentials(command, func(opt *ProcessProvider) { + opt.Timeout = timeout + }) + + return p +} + +// NewCredentialsCommand returns a pointer to a new Credentials object with +// the specified command, and default timeout, duration and max buffer size. +func NewCredentialsCommand(command *exec.Cmd, options ...func(*ProcessProvider)) *credentials.Credentials { + p := &ProcessProvider{ + command: command, + Duration: DefaultDuration, + Timeout: DefaultTimeout, + MaxBufSize: DefaultBufSize, + } + + for _, option := range options { + option(p) + } + + return credentials.NewCredentials(p) +} + +type credentialProcessResponse struct { + Version int + AccessKeyID string `json:"AccessKeyId"` + SecretAccessKey string + SessionToken string + Expiration *time.Time +} + +// Retrieve executes the 'credential_process' and returns the credentials. +func (p *ProcessProvider) Retrieve() (credentials.Value, error) { + out, err := p.executeCredentialProcess() + if err != nil { + return credentials.Value{ProviderName: ProviderName}, err + } + + // Serialize and validate response + resp := &credentialProcessResponse{} + if err = json.Unmarshal(out, resp); err != nil { + return credentials.Value{ProviderName: ProviderName}, awserr.New( + ErrCodeProcessProviderParse, + fmt.Sprintf("%s: %s", errMsgProcessProviderParse, string(out)), + err) + } + + if resp.Version != 1 { + return credentials.Value{ProviderName: ProviderName}, awserr.New( + ErrCodeProcessProviderVersion, + errMsgProcessProviderVersion, + nil) + } + + if len(resp.AccessKeyID) == 0 { + return credentials.Value{ProviderName: ProviderName}, awserr.New( + ErrCodeProcessProviderRequired, + errMsgProcessProviderMissKey, + nil) + } + + if len(resp.SecretAccessKey) == 0 { + return credentials.Value{ProviderName: ProviderName}, awserr.New( + ErrCodeProcessProviderRequired, + errMsgProcessProviderMissSecret, + nil) + } + + // Handle expiration + p.staticCreds = resp.Expiration == nil + if resp.Expiration != nil { + p.SetExpiration(*resp.Expiration, p.ExpiryWindow) + } + + return credentials.Value{ + ProviderName: ProviderName, + AccessKeyID: resp.AccessKeyID, + SecretAccessKey: resp.SecretAccessKey, + SessionToken: resp.SessionToken, + }, nil +} + +// IsExpired returns true if the credentials retrieved are expired, or not yet +// retrieved. +func (p *ProcessProvider) IsExpired() bool { + if p.staticCreds { + return false + } + return p.Expiry.IsExpired() +} + +// prepareCommand prepares the command to be executed. +func (p *ProcessProvider) prepareCommand() error { + + var cmdArgs []string + if runtime.GOOS == "windows" { + cmdArgs = []string{"cmd.exe", "/C"} + } else { + cmdArgs = []string{"sh", "-c"} + } + + if len(p.originalCommand) == 0 { + p.originalCommand = make([]string, len(p.command.Args)) + copy(p.originalCommand, p.command.Args) + + // check for empty command because it succeeds + if len(strings.TrimSpace(p.originalCommand[0])) < 1 { + return awserr.New( + ErrCodeProcessProviderExecution, + fmt.Sprintf( + "%s: %s", + errMsgProcessProviderPrepareCmd, + errMsgProcessProviderEmptyCmd), + nil) + } + } + + cmdArgs = append(cmdArgs, p.originalCommand...) + p.command = exec.Command(cmdArgs[0], cmdArgs[1:]...) + p.command.Env = os.Environ() + + return nil +} + +// executeCredentialProcess starts the credential process on the OS and +// returns the results or an error. +func (p *ProcessProvider) executeCredentialProcess() ([]byte, error) { + + if err := p.prepareCommand(); err != nil { + return nil, err + } + + // Setup the pipes + outReadPipe, outWritePipe, err := os.Pipe() + if err != nil { + return nil, awserr.New( + ErrCodeProcessProviderExecution, + errMsgProcessProviderPipe, + err) + } + + p.command.Stderr = os.Stderr // display stderr on console for MFA + p.command.Stdout = outWritePipe // get creds json on process's stdout + p.command.Stdin = os.Stdin // enable stdin for MFA + + output := bytes.NewBuffer(make([]byte, 0, p.MaxBufSize)) + + stdoutCh := make(chan error, 1) + go readInput( + io.LimitReader(outReadPipe, int64(p.MaxBufSize)), + output, + stdoutCh) + + execCh := make(chan error, 1) + go executeCommand(*p.command, execCh) + + finished := false + var errors []error + for !finished { + select { + case readError := <-stdoutCh: + errors = appendError(errors, readError) + finished = true + case execError := <-execCh: + err := outWritePipe.Close() + errors = appendError(errors, err) + errors = appendError(errors, execError) + if errors != nil { + return output.Bytes(), awserr.NewBatchError( + ErrCodeProcessProviderExecution, + errMsgProcessProviderProcess, + errors) + } + case <-time.After(p.Timeout): + finished = true + return output.Bytes(), awserr.NewBatchError( + ErrCodeProcessProviderExecution, + errMsgProcessProviderTimeout, + errors) // errors can be nil + } + } + + out := output.Bytes() + + if runtime.GOOS == "windows" { + // windows adds slashes to quotes + out = []byte(strings.Replace(string(out), `\"`, `"`, -1)) + } + + return out, nil +} + +// appendError conveniently checks for nil before appending slice +func appendError(errors []error, err error) []error { + if err != nil { + return append(errors, err) + } + return errors +} + +func executeCommand(cmd exec.Cmd, exec chan error) { + // Start the command + err := cmd.Start() + if err == nil { + err = cmd.Wait() + } + + exec <- err +} + +func readInput(r io.Reader, w io.Writer, read chan error) { + tee := io.TeeReader(r, w) + + _, err := ioutil.ReadAll(tee) + + if err == io.EOF { + err = nil + } + + read <- err // will only arrive here when write end of pipe is closed +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/shared_credentials_provider.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/shared_credentials_provider.go index 51e21e0f3..e15514958 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/credentials/shared_credentials_provider.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/credentials/shared_credentials_provider.go @@ -4,9 +4,8 @@ import ( "fmt" "os" - "github.com/go-ini/ini" - "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/internal/ini" "github.com/aws/aws-sdk-go/internal/shareddefaults" ) @@ -77,36 +76,37 @@ func (p *SharedCredentialsProvider) IsExpired() bool { // The credentials retrieved from the profile will be returned or error. Error will be // returned if it fails to read from the file, or the data is invalid. func loadProfile(filename, profile string) (Value, error) { - config, err := ini.Load(filename) + config, err := ini.OpenFile(filename) if err != nil { return Value{ProviderName: SharedCredsProviderName}, awserr.New("SharedCredsLoad", "failed to load shared credentials file", err) } - iniProfile, err := config.GetSection(profile) - if err != nil { - return Value{ProviderName: SharedCredsProviderName}, awserr.New("SharedCredsLoad", "failed to get profile", err) + + iniProfile, ok := config.GetSection(profile) + if !ok { + return Value{ProviderName: SharedCredsProviderName}, awserr.New("SharedCredsLoad", "failed to get profile", nil) } - id, err := iniProfile.GetKey("aws_access_key_id") - if err != nil { + id := iniProfile.String("aws_access_key_id") + if len(id) == 0 { return Value{ProviderName: SharedCredsProviderName}, awserr.New("SharedCredsAccessKey", fmt.Sprintf("shared credentials %s in %s did not contain aws_access_key_id", profile, filename), - err) + nil) } - secret, err := iniProfile.GetKey("aws_secret_access_key") - if err != nil { + secret := iniProfile.String("aws_secret_access_key") + if len(secret) == 0 { return Value{ProviderName: SharedCredsProviderName}, awserr.New("SharedCredsSecret", fmt.Sprintf("shared credentials %s in %s did not contain aws_secret_access_key", profile, filename), nil) } // Default to empty string if not found - token := iniProfile.Key("aws_session_token") + token := iniProfile.String("aws_session_token") return Value{ - AccessKeyID: id.String(), - SecretAccessKey: secret.String(), - SessionToken: token.String(), + AccessKeyID: id, + SecretAccessKey: secret, + SessionToken: token, ProviderName: SharedCredsProviderName, }, nil } diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/static_provider.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/static_provider.go index 4f5dab3fc..531139e39 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/credentials/static_provider.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/credentials/static_provider.go @@ -9,8 +9,6 @@ const StaticProviderName = "StaticProvider" var ( // ErrStaticCredentialsEmpty is emitted when static credentials are empty. - // - // @readonly ErrStaticCredentialsEmpty = awserr.New("EmptyStaticCreds", "static credentials are empty", nil) ) diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/assume_role_provider.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/assume_role_provider.go index 4108e433e..9f37f44bc 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/assume_role_provider.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/assume_role_provider.go @@ -80,16 +80,18 @@ package stscreds import ( "fmt" + "os" "time" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/aws/client" "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/internal/sdkrand" "github.com/aws/aws-sdk-go/service/sts" ) -// StdinTokenProvider will prompt on stdout and read from stdin for a string value. +// StdinTokenProvider will prompt on stderr and read from stdin for a string value. // An error is returned if reading from stdin fails. // // Use this function go read MFA tokens from stdin. The function makes no attempt @@ -102,7 +104,7 @@ import ( // Will wait forever until something is provided on the stdin. func StdinTokenProvider() (string, error) { var v string - fmt.Printf("Assume Role MFA token code: ") + fmt.Fprintf(os.Stderr, "Assume Role MFA token code: ") _, err := fmt.Scanln(&v) return v, err @@ -142,6 +144,13 @@ type AssumeRoleProvider struct { // Session name, if you wish to reuse the credentials elsewhere. RoleSessionName string + // Optional, you can pass tag key-value pairs to your session. These tags are called session tags. + Tags []*sts.Tag + + // A list of keys for session tags that you want to set as transitive. + // If you set a tag key as transitive, the corresponding key and value passes to subsequent sessions in a role chain. + TransitiveTagKeys []*string + // Expiry duration of the STS credentials. Defaults to 15 minutes if not set. Duration time.Duration @@ -193,6 +202,18 @@ type AssumeRoleProvider struct { // // If ExpiryWindow is 0 or less it will be ignored. ExpiryWindow time.Duration + + // MaxJitterFrac reduces the effective Duration of each credential requested + // by a random percentage between 0 and MaxJitterFraction. MaxJitterFrac must + // have a value between 0 and 1. Any other value may lead to expected behavior. + // With a MaxJitterFrac value of 0, default) will no jitter will be used. + // + // For example, with a Duration of 30m and a MaxJitterFrac of 0.1, the + // AssumeRole call will be made with an arbitrary Duration between 27m and + // 30m. + // + // MaxJitterFrac should not be negative. + MaxJitterFrac float64 } // NewCredentials returns a pointer to a new Credentials object wrapping the @@ -244,7 +265,6 @@ func NewCredentialsWithClient(svc AssumeRoler, roleARN string, options ...func(* // Retrieve generates a new set of temporary credentials using STS. func (p *AssumeRoleProvider) Retrieve() (credentials.Value, error) { - // Apply defaults where parameters are not set. if p.RoleSessionName == "" { // Try to work out a role name that will hopefully end up unique. @@ -254,11 +274,14 @@ func (p *AssumeRoleProvider) Retrieve() (credentials.Value, error) { // Expire as often as AWS permits. p.Duration = DefaultDuration } + jitter := time.Duration(sdkrand.SeededRand.Float64() * p.MaxJitterFrac * float64(p.Duration)) input := &sts.AssumeRoleInput{ - DurationSeconds: aws.Int64(int64(p.Duration / time.Second)), - RoleArn: aws.String(p.RoleARN), - RoleSessionName: aws.String(p.RoleSessionName), - ExternalId: p.ExternalID, + DurationSeconds: aws.Int64(int64((p.Duration - jitter) / time.Second)), + RoleArn: aws.String(p.RoleARN), + RoleSessionName: aws.String(p.RoleSessionName), + ExternalId: p.ExternalID, + Tags: p.Tags, + TransitiveTagKeys: p.TransitiveTagKeys, } if p.Policy != nil { input.Policy = p.Policy diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/web_identity_provider.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/web_identity_provider.go new file mode 100644 index 000000000..b20b63394 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/web_identity_provider.go @@ -0,0 +1,100 @@ +package stscreds + +import ( + "fmt" + "io/ioutil" + "strconv" + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/client" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/service/sts" + "github.com/aws/aws-sdk-go/service/sts/stsiface" +) + +const ( + // ErrCodeWebIdentity will be used as an error code when constructing + // a new error to be returned during session creation or retrieval. + ErrCodeWebIdentity = "WebIdentityErr" + + // WebIdentityProviderName is the web identity provider name + WebIdentityProviderName = "WebIdentityCredentials" +) + +// now is used to return a time.Time object representing +// the current time. This can be used to easily test and +// compare test values. +var now = time.Now + +// WebIdentityRoleProvider is used to retrieve credentials using +// an OIDC token. +type WebIdentityRoleProvider struct { + credentials.Expiry + + client stsiface.STSAPI + ExpiryWindow time.Duration + + tokenFilePath string + roleARN string + roleSessionName string +} + +// NewWebIdentityCredentials will return a new set of credentials with a given +// configuration, role arn, and token file path. +func NewWebIdentityCredentials(c client.ConfigProvider, roleARN, roleSessionName, path string) *credentials.Credentials { + svc := sts.New(c) + p := NewWebIdentityRoleProvider(svc, roleARN, roleSessionName, path) + return credentials.NewCredentials(p) +} + +// NewWebIdentityRoleProvider will return a new WebIdentityRoleProvider with the +// provided stsiface.STSAPI +func NewWebIdentityRoleProvider(svc stsiface.STSAPI, roleARN, roleSessionName, path string) *WebIdentityRoleProvider { + return &WebIdentityRoleProvider{ + client: svc, + tokenFilePath: path, + roleARN: roleARN, + roleSessionName: roleSessionName, + } +} + +// Retrieve will attempt to assume a role from a token which is located at +// 'WebIdentityTokenFilePath' specified destination and if that is empty an +// error will be returned. +func (p *WebIdentityRoleProvider) Retrieve() (credentials.Value, error) { + b, err := ioutil.ReadFile(p.tokenFilePath) + if err != nil { + errMsg := fmt.Sprintf("unable to read file at %s", p.tokenFilePath) + return credentials.Value{}, awserr.New(ErrCodeWebIdentity, errMsg, err) + } + + sessionName := p.roleSessionName + if len(sessionName) == 0 { + // session name is used to uniquely identify a session. This simply + // uses unix time in nanoseconds to uniquely identify sessions. + sessionName = strconv.FormatInt(now().UnixNano(), 10) + } + req, resp := p.client.AssumeRoleWithWebIdentityRequest(&sts.AssumeRoleWithWebIdentityInput{ + RoleArn: &p.roleARN, + RoleSessionName: &sessionName, + WebIdentityToken: aws.String(string(b)), + }) + // InvalidIdentityToken error is a temporary error that can occur + // when assuming an Role with a JWT web identity token. + req.RetryErrorCodes = append(req.RetryErrorCodes, sts.ErrCodeInvalidIdentityTokenException) + if err := req.Send(); err != nil { + return credentials.Value{}, awserr.New(ErrCodeWebIdentity, "failed to retrieve credentials", err) + } + + p.SetExpiration(aws.TimeValue(resp.Credentials.Expiration), p.ExpiryWindow) + + value := credentials.Value{ + AccessKeyID: aws.StringValue(resp.Credentials.AccessKeyId), + SecretAccessKey: aws.StringValue(resp.Credentials.SecretAccessKey), + SessionToken: aws.StringValue(resp.Credentials.SessionToken), + ProviderName: WebIdentityProviderName, + } + return value, nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/csm/doc.go b/vendor/github.com/aws/aws-sdk-go/aws/csm/doc.go new file mode 100644 index 000000000..25a66d1dd --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/csm/doc.go @@ -0,0 +1,69 @@ +// Package csm provides the Client Side Monitoring (CSM) client which enables +// sending metrics via UDP connection to the CSM agent. This package provides +// control options, and configuration for the CSM client. The client can be +// controlled manually, or automatically via the SDK's Session configuration. +// +// Enabling CSM client via SDK's Session configuration +// +// The CSM client can be enabled automatically via SDK's Session configuration. +// The SDK's session configuration enables the CSM client if the AWS_CSM_PORT +// environment variable is set to a non-empty value. +// +// The configuration options for the CSM client via the SDK's session +// configuration are: +// +// * AWS_CSM_PORT= +// The port number the CSM agent will receive metrics on. +// +// * AWS_CSM_HOST= +// The hostname, or IP address the CSM agent will receive metrics on. +// Without port number. +// +// Manually enabling the CSM client +// +// The CSM client can be started, paused, and resumed manually. The Start +// function will enable the CSM client to publish metrics to the CSM agent. It +// is safe to call Start concurrently, but if Start is called additional times +// with different ClientID or address it will panic. +// +// r, err := csm.Start("clientID", ":31000") +// if err != nil { +// panic(fmt.Errorf("failed starting CSM: %v", err)) +// } +// +// When controlling the CSM client manually, you must also inject its request +// handlers into the SDK's Session configuration for the SDK's API clients to +// publish metrics. +// +// sess, err := session.NewSession(&aws.Config{}) +// if err != nil { +// panic(fmt.Errorf("failed loading session: %v", err)) +// } +// +// // Add CSM client's metric publishing request handlers to the SDK's +// // Session Configuration. +// r.InjectHandlers(&sess.Handlers) +// +// Controlling CSM client +// +// Once the CSM client has been enabled the Get function will return a Reporter +// value that you can use to pause and resume the metrics published to the CSM +// agent. If Get function is called before the reporter is enabled with the +// Start function or via SDK's Session configuration nil will be returned. +// +// The Pause method can be called to stop the CSM client publishing metrics to +// the CSM agent. The Continue method will resume metric publishing. +// +// // Get the CSM client Reporter. +// r := csm.Get() +// +// // Will pause monitoring +// r.Pause() +// resp, err = client.GetObject(&s3.GetObjectInput{ +// Bucket: aws.String("bucket"), +// Key: aws.String("key"), +// }) +// +// // Resume monitoring +// r.Continue() +package csm diff --git a/vendor/github.com/aws/aws-sdk-go/aws/csm/enable.go b/vendor/github.com/aws/aws-sdk-go/aws/csm/enable.go new file mode 100644 index 000000000..4b19e2800 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/csm/enable.go @@ -0,0 +1,89 @@ +package csm + +import ( + "fmt" + "strings" + "sync" +) + +var ( + lock sync.Mutex +) + +const ( + // DefaultPort is used when no port is specified. + DefaultPort = "31000" + + // DefaultHost is the host that will be used when none is specified. + DefaultHost = "127.0.0.1" +) + +// AddressWithDefaults returns a CSM address built from the host and port +// values. If the host or port is not set, default values will be used +// instead. If host is "localhost" it will be replaced with "127.0.0.1". +func AddressWithDefaults(host, port string) string { + if len(host) == 0 || strings.EqualFold(host, "localhost") { + host = DefaultHost + } + + if len(port) == 0 { + port = DefaultPort + } + + // Only IP6 host can contain a colon + if strings.Contains(host, ":") { + return "[" + host + "]:" + port + } + + return host + ":" + port +} + +// Start will start a long running go routine to capture +// client side metrics. Calling start multiple time will only +// start the metric listener once and will panic if a different +// client ID or port is passed in. +// +// r, err := csm.Start("clientID", "127.0.0.1:31000") +// if err != nil { +// panic(fmt.Errorf("expected no error, but received %v", err)) +// } +// sess := session.NewSession() +// r.InjectHandlers(sess.Handlers) +// +// svc := s3.New(sess) +// out, err := svc.GetObject(&s3.GetObjectInput{ +// Bucket: aws.String("bucket"), +// Key: aws.String("key"), +// }) +func Start(clientID string, url string) (*Reporter, error) { + lock.Lock() + defer lock.Unlock() + + if sender == nil { + sender = newReporter(clientID, url) + } else { + if sender.clientID != clientID { + panic(fmt.Errorf("inconsistent client IDs. %q was expected, but received %q", sender.clientID, clientID)) + } + + if sender.url != url { + panic(fmt.Errorf("inconsistent URLs. %q was expected, but received %q", sender.url, url)) + } + } + + if err := connect(url); err != nil { + sender = nil + return nil, err + } + + return sender, nil +} + +// Get will return a reporter if one exists, if one does not exist, nil will +// be returned. +func Get() *Reporter { + lock.Lock() + defer lock.Unlock() + + return sender +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/csm/metric.go b/vendor/github.com/aws/aws-sdk-go/aws/csm/metric.go new file mode 100644 index 000000000..5bacc791a --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/csm/metric.go @@ -0,0 +1,109 @@ +package csm + +import ( + "strconv" + "time" + + "github.com/aws/aws-sdk-go/aws" +) + +type metricTime time.Time + +func (t metricTime) MarshalJSON() ([]byte, error) { + ns := time.Duration(time.Time(t).UnixNano()) + return []byte(strconv.FormatInt(int64(ns/time.Millisecond), 10)), nil +} + +type metric struct { + ClientID *string `json:"ClientId,omitempty"` + API *string `json:"Api,omitempty"` + Service *string `json:"Service,omitempty"` + Timestamp *metricTime `json:"Timestamp,omitempty"` + Type *string `json:"Type,omitempty"` + Version *int `json:"Version,omitempty"` + + AttemptCount *int `json:"AttemptCount,omitempty"` + Latency *int `json:"Latency,omitempty"` + + Fqdn *string `json:"Fqdn,omitempty"` + UserAgent *string `json:"UserAgent,omitempty"` + AttemptLatency *int `json:"AttemptLatency,omitempty"` + + SessionToken *string `json:"SessionToken,omitempty"` + Region *string `json:"Region,omitempty"` + AccessKey *string `json:"AccessKey,omitempty"` + HTTPStatusCode *int `json:"HttpStatusCode,omitempty"` + XAmzID2 *string `json:"XAmzId2,omitempty"` + XAmzRequestID *string `json:"XAmznRequestId,omitempty"` + + AWSException *string `json:"AwsException,omitempty"` + AWSExceptionMessage *string `json:"AwsExceptionMessage,omitempty"` + SDKException *string `json:"SdkException,omitempty"` + SDKExceptionMessage *string `json:"SdkExceptionMessage,omitempty"` + + FinalHTTPStatusCode *int `json:"FinalHttpStatusCode,omitempty"` + FinalAWSException *string `json:"FinalAwsException,omitempty"` + FinalAWSExceptionMessage *string `json:"FinalAwsExceptionMessage,omitempty"` + FinalSDKException *string `json:"FinalSdkException,omitempty"` + FinalSDKExceptionMessage *string `json:"FinalSdkExceptionMessage,omitempty"` + + DestinationIP *string `json:"DestinationIp,omitempty"` + ConnectionReused *int `json:"ConnectionReused,omitempty"` + + AcquireConnectionLatency *int `json:"AcquireConnectionLatency,omitempty"` + ConnectLatency *int `json:"ConnectLatency,omitempty"` + RequestLatency *int `json:"RequestLatency,omitempty"` + DNSLatency *int `json:"DnsLatency,omitempty"` + TCPLatency *int `json:"TcpLatency,omitempty"` + SSLLatency *int `json:"SslLatency,omitempty"` + + MaxRetriesExceeded *int `json:"MaxRetriesExceeded,omitempty"` +} + +func (m *metric) TruncateFields() { + m.ClientID = truncateString(m.ClientID, 255) + m.UserAgent = truncateString(m.UserAgent, 256) + + m.AWSException = truncateString(m.AWSException, 128) + m.AWSExceptionMessage = truncateString(m.AWSExceptionMessage, 512) + + m.SDKException = truncateString(m.SDKException, 128) + m.SDKExceptionMessage = truncateString(m.SDKExceptionMessage, 512) + + m.FinalAWSException = truncateString(m.FinalAWSException, 128) + m.FinalAWSExceptionMessage = truncateString(m.FinalAWSExceptionMessage, 512) + + m.FinalSDKException = truncateString(m.FinalSDKException, 128) + m.FinalSDKExceptionMessage = truncateString(m.FinalSDKExceptionMessage, 512) +} + +func truncateString(v *string, l int) *string { + if v != nil && len(*v) > l { + nv := (*v)[:l] + return &nv + } + + return v +} + +func (m *metric) SetException(e metricException) { + switch te := e.(type) { + case awsException: + m.AWSException = aws.String(te.exception) + m.AWSExceptionMessage = aws.String(te.message) + case sdkException: + m.SDKException = aws.String(te.exception) + m.SDKExceptionMessage = aws.String(te.message) + } +} + +func (m *metric) SetFinalException(e metricException) { + switch te := e.(type) { + case awsException: + m.FinalAWSException = aws.String(te.exception) + m.FinalAWSExceptionMessage = aws.String(te.message) + case sdkException: + m.FinalSDKException = aws.String(te.exception) + m.FinalSDKExceptionMessage = aws.String(te.message) + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/csm/metric_chan.go b/vendor/github.com/aws/aws-sdk-go/aws/csm/metric_chan.go new file mode 100644 index 000000000..82a3e345e --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/csm/metric_chan.go @@ -0,0 +1,55 @@ +package csm + +import ( + "sync/atomic" +) + +const ( + runningEnum = iota + pausedEnum +) + +var ( + // MetricsChannelSize of metrics to hold in the channel + MetricsChannelSize = 100 +) + +type metricChan struct { + ch chan metric + paused *int64 +} + +func newMetricChan(size int) metricChan { + return metricChan{ + ch: make(chan metric, size), + paused: new(int64), + } +} + +func (ch *metricChan) Pause() { + atomic.StoreInt64(ch.paused, pausedEnum) +} + +func (ch *metricChan) Continue() { + atomic.StoreInt64(ch.paused, runningEnum) +} + +func (ch *metricChan) IsPaused() bool { + v := atomic.LoadInt64(ch.paused) + return v == pausedEnum +} + +// Push will push metrics to the metric channel if the channel +// is not paused +func (ch *metricChan) Push(m metric) bool { + if ch.IsPaused() { + return false + } + + select { + case ch.ch <- m: + return true + default: + return false + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/csm/metric_exception.go b/vendor/github.com/aws/aws-sdk-go/aws/csm/metric_exception.go new file mode 100644 index 000000000..54a99280c --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/csm/metric_exception.go @@ -0,0 +1,26 @@ +package csm + +type metricException interface { + Exception() string + Message() string +} + +type requestException struct { + exception string + message string +} + +func (e requestException) Exception() string { + return e.exception +} +func (e requestException) Message() string { + return e.message +} + +type awsException struct { + requestException +} + +type sdkException struct { + requestException +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/csm/reporter.go b/vendor/github.com/aws/aws-sdk-go/aws/csm/reporter.go new file mode 100644 index 000000000..835bcd49c --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/csm/reporter.go @@ -0,0 +1,264 @@ +package csm + +import ( + "encoding/json" + "net" + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/request" +) + +// Reporter will gather metrics of API requests made and +// send those metrics to the CSM endpoint. +type Reporter struct { + clientID string + url string + conn net.Conn + metricsCh metricChan + done chan struct{} +} + +var ( + sender *Reporter +) + +func connect(url string) error { + const network = "udp" + if err := sender.connect(network, url); err != nil { + return err + } + + if sender.done == nil { + sender.done = make(chan struct{}) + go sender.start() + } + + return nil +} + +func newReporter(clientID, url string) *Reporter { + return &Reporter{ + clientID: clientID, + url: url, + metricsCh: newMetricChan(MetricsChannelSize), + } +} + +func (rep *Reporter) sendAPICallAttemptMetric(r *request.Request) { + if rep == nil { + return + } + + now := time.Now() + creds, _ := r.Config.Credentials.Get() + + m := metric{ + ClientID: aws.String(rep.clientID), + API: aws.String(r.Operation.Name), + Service: aws.String(r.ClientInfo.ServiceID), + Timestamp: (*metricTime)(&now), + UserAgent: aws.String(r.HTTPRequest.Header.Get("User-Agent")), + Region: r.Config.Region, + Type: aws.String("ApiCallAttempt"), + Version: aws.Int(1), + + XAmzRequestID: aws.String(r.RequestID), + + AttemptLatency: aws.Int(int(now.Sub(r.AttemptTime).Nanoseconds() / int64(time.Millisecond))), + AccessKey: aws.String(creds.AccessKeyID), + } + + if r.HTTPResponse != nil { + m.HTTPStatusCode = aws.Int(r.HTTPResponse.StatusCode) + } + + if r.Error != nil { + if awserr, ok := r.Error.(awserr.Error); ok { + m.SetException(getMetricException(awserr)) + } + } + + m.TruncateFields() + rep.metricsCh.Push(m) +} + +func getMetricException(err awserr.Error) metricException { + msg := err.Error() + code := err.Code() + + switch code { + case request.ErrCodeRequestError, + request.ErrCodeSerialization, + request.CanceledErrorCode: + return sdkException{ + requestException{exception: code, message: msg}, + } + default: + return awsException{ + requestException{exception: code, message: msg}, + } + } +} + +func (rep *Reporter) sendAPICallMetric(r *request.Request) { + if rep == nil { + return + } + + now := time.Now() + m := metric{ + ClientID: aws.String(rep.clientID), + API: aws.String(r.Operation.Name), + Service: aws.String(r.ClientInfo.ServiceID), + Timestamp: (*metricTime)(&now), + UserAgent: aws.String(r.HTTPRequest.Header.Get("User-Agent")), + Type: aws.String("ApiCall"), + AttemptCount: aws.Int(r.RetryCount + 1), + Region: r.Config.Region, + Latency: aws.Int(int(time.Since(r.Time) / time.Millisecond)), + XAmzRequestID: aws.String(r.RequestID), + MaxRetriesExceeded: aws.Int(boolIntValue(r.RetryCount >= r.MaxRetries())), + } + + if r.HTTPResponse != nil { + m.FinalHTTPStatusCode = aws.Int(r.HTTPResponse.StatusCode) + } + + if r.Error != nil { + if awserr, ok := r.Error.(awserr.Error); ok { + m.SetFinalException(getMetricException(awserr)) + } + } + + m.TruncateFields() + + // TODO: Probably want to figure something out for logging dropped + // metrics + rep.metricsCh.Push(m) +} + +func (rep *Reporter) connect(network, url string) error { + if rep.conn != nil { + rep.conn.Close() + } + + conn, err := net.Dial(network, url) + if err != nil { + return awserr.New("UDPError", "Could not connect", err) + } + + rep.conn = conn + + return nil +} + +func (rep *Reporter) close() { + if rep.done != nil { + close(rep.done) + } + + rep.metricsCh.Pause() +} + +func (rep *Reporter) start() { + defer func() { + rep.metricsCh.Pause() + }() + + for { + select { + case <-rep.done: + rep.done = nil + return + case m := <-rep.metricsCh.ch: + // TODO: What to do with this error? Probably should just log + b, err := json.Marshal(m) + if err != nil { + continue + } + + rep.conn.Write(b) + } + } +} + +// Pause will pause the metric channel preventing any new metrics from being +// added. It is safe to call concurrently with other calls to Pause, but if +// called concurently with Continue can lead to unexpected state. +func (rep *Reporter) Pause() { + lock.Lock() + defer lock.Unlock() + + if rep == nil { + return + } + + rep.close() +} + +// Continue will reopen the metric channel and allow for monitoring to be +// resumed. It is safe to call concurrently with other calls to Continue, but +// if called concurently with Pause can lead to unexpected state. +func (rep *Reporter) Continue() { + lock.Lock() + defer lock.Unlock() + if rep == nil { + return + } + + if !rep.metricsCh.IsPaused() { + return + } + + rep.metricsCh.Continue() +} + +// Client side metric handler names +const ( + APICallMetricHandlerName = "awscsm.SendAPICallMetric" + APICallAttemptMetricHandlerName = "awscsm.SendAPICallAttemptMetric" +) + +// InjectHandlers will will enable client side metrics and inject the proper +// handlers to handle how metrics are sent. +// +// InjectHandlers is NOT safe to call concurrently. Calling InjectHandlers +// multiple times may lead to unexpected behavior, (e.g. duplicate metrics). +// +// // Start must be called in order to inject the correct handlers +// r, err := csm.Start("clientID", "127.0.0.1:8094") +// if err != nil { +// panic(fmt.Errorf("expected no error, but received %v", err)) +// } +// +// sess := session.NewSession() +// r.InjectHandlers(&sess.Handlers) +// +// // create a new service client with our client side metric session +// svc := s3.New(sess) +func (rep *Reporter) InjectHandlers(handlers *request.Handlers) { + if rep == nil { + return + } + + handlers.Complete.PushFrontNamed(request.NamedHandler{ + Name: APICallMetricHandlerName, + Fn: rep.sendAPICallMetric, + }) + + handlers.CompleteAttempt.PushFrontNamed(request.NamedHandler{ + Name: APICallAttemptMetricHandlerName, + Fn: rep.sendAPICallAttemptMetric, + }) +} + +// boolIntValue return 1 for true and 0 for false. +func boolIntValue(b bool) int { + if b { + return 1 + } + + return 0 +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/defaults/defaults.go b/vendor/github.com/aws/aws-sdk-go/aws/defaults/defaults.go index 3cf1036b6..23bb639e0 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/defaults/defaults.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/defaults/defaults.go @@ -24,6 +24,7 @@ import ( "github.com/aws/aws-sdk-go/aws/ec2metadata" "github.com/aws/aws-sdk-go/aws/endpoints" "github.com/aws/aws-sdk-go/aws/request" + "github.com/aws/aws-sdk-go/internal/shareddefaults" ) // A Defaults provides a collection of default values for SDK clients. @@ -92,17 +93,28 @@ func Handlers() request.Handlers { func CredChain(cfg *aws.Config, handlers request.Handlers) *credentials.Credentials { return credentials.NewCredentials(&credentials.ChainProvider{ VerboseErrors: aws.BoolValue(cfg.CredentialsChainVerboseErrors), - Providers: []credentials.Provider{ - &credentials.EnvProvider{}, - &credentials.SharedCredentialsProvider{Filename: "", Profile: ""}, - RemoteCredProvider(*cfg, handlers), - }, + Providers: CredProviders(cfg, handlers), }) } +// CredProviders returns the slice of providers used in +// the default credential chain. +// +// For applications that need to use some other provider (for example use +// different environment variables for legacy reasons) but still fall back +// on the default chain of providers. This allows that default chaint to be +// automatically updated +func CredProviders(cfg *aws.Config, handlers request.Handlers) []credentials.Provider { + return []credentials.Provider{ + &credentials.EnvProvider{}, + &credentials.SharedCredentialsProvider{Filename: "", Profile: ""}, + RemoteCredProvider(*cfg, handlers), + } +} + const ( - httpProviderEnvVar = "AWS_CONTAINER_CREDENTIALS_FULL_URI" - ecsCredsProviderEnvVar = "AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" + httpProviderAuthorizationEnvVar = "AWS_CONTAINER_AUTHORIZATION_TOKEN" + httpProviderEnvVar = "AWS_CONTAINER_CREDENTIALS_FULL_URI" ) // RemoteCredProvider returns a credentials provider for the default remote @@ -112,8 +124,8 @@ func RemoteCredProvider(cfg aws.Config, handlers request.Handlers) credentials.P return localHTTPCredProvider(cfg, handlers, u) } - if uri := os.Getenv(ecsCredsProviderEnvVar); len(uri) > 0 { - u := fmt.Sprintf("http://169.254.170.2%s", uri) + if uri := os.Getenv(shareddefaults.ECSCredsProviderEnvVar); len(uri) > 0 { + u := fmt.Sprintf("%s%s", shareddefaults.ECSContainerCredentialsURI, uri) return httpCredProvider(cfg, handlers, u) } @@ -176,6 +188,7 @@ func httpCredProvider(cfg aws.Config, handlers request.Handlers, u string) crede return endpointcreds.NewProviderClient(cfg, handlers, u, func(p *endpointcreds.Provider) { p.ExpiryWindow = 5 * time.Minute + p.AuthorizationToken = os.Getenv(httpProviderAuthorizationEnvVar) }, ) } diff --git a/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/api.go b/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/api.go index 984407a58..12897eef6 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/api.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/api.go @@ -4,28 +4,63 @@ import ( "encoding/json" "fmt" "net/http" - "path" + "strconv" "strings" "time" "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/aws/request" + "github.com/aws/aws-sdk-go/internal/sdkuri" ) +// getToken uses the duration to return a token for EC2 metadata service, +// or an error if the request failed. +func (c *EC2Metadata) getToken(duration time.Duration) (tokenOutput, error) { + op := &request.Operation{ + Name: "GetToken", + HTTPMethod: "PUT", + HTTPPath: "/api/token", + } + + var output tokenOutput + req := c.NewRequest(op, nil, &output) + + // remove the fetch token handler from the request handlers to avoid infinite recursion + req.Handlers.Sign.RemoveByName(fetchTokenHandlerName) + + // Swap the unmarshalMetadataHandler with unmarshalTokenHandler on this request. + req.Handlers.Unmarshal.Swap(unmarshalMetadataHandlerName, unmarshalTokenHandler) + + ttl := strconv.FormatInt(int64(duration/time.Second), 10) + req.HTTPRequest.Header.Set(ttlHeader, ttl) + + err := req.Send() + + // Errors with bad request status should be returned. + if err != nil { + err = awserr.NewRequestFailure( + awserr.New(req.HTTPResponse.Status, http.StatusText(req.HTTPResponse.StatusCode), err), + req.HTTPResponse.StatusCode, req.RequestID) + } + + return output, err +} + // GetMetadata uses the path provided to request information from the EC2 -// instance metdata service. The content will be returned as a string, or +// instance metadata service. The content will be returned as a string, or // error if the request failed. func (c *EC2Metadata) GetMetadata(p string) (string, error) { op := &request.Operation{ Name: "GetMetadata", HTTPMethod: "GET", - HTTPPath: path.Join("/", "meta-data", p), + HTTPPath: sdkuri.PathJoin("/meta-data", p), } - output := &metadataOutput{} + req := c.NewRequest(op, nil, output) - return output.Content, req.Send() + err := req.Send() + return output.Content, err } // GetUserData returns the userdata that was configured for the service. If @@ -35,18 +70,14 @@ func (c *EC2Metadata) GetUserData() (string, error) { op := &request.Operation{ Name: "GetUserData", HTTPMethod: "GET", - HTTPPath: path.Join("/", "user-data"), + HTTPPath: "/user-data", } output := &metadataOutput{} req := c.NewRequest(op, nil, output) - req.Handlers.UnmarshalError.PushBack(func(r *request.Request) { - if r.HTTPResponse.StatusCode == http.StatusNotFound { - r.Error = awserr.New("NotFoundError", "user-data not found", r.Error) - } - }) - return output.Content, req.Send() + err := req.Send() + return output.Content, err } // GetDynamicData uses the path provided to request information from the EC2 @@ -56,13 +87,14 @@ func (c *EC2Metadata) GetDynamicData(p string) (string, error) { op := &request.Operation{ Name: "GetDynamicData", HTTPMethod: "GET", - HTTPPath: path.Join("/", "dynamic", p), + HTTPPath: sdkuri.PathJoin("/dynamic", p), } output := &metadataOutput{} req := c.NewRequest(op, nil, output) - return output.Content, req.Send() + err := req.Send() + return output.Content, err } // GetInstanceIdentityDocument retrieves an identity document describing an @@ -79,7 +111,7 @@ func (c *EC2Metadata) GetInstanceIdentityDocument() (EC2InstanceIdentityDocument doc := EC2InstanceIdentityDocument{} if err := json.NewDecoder(strings.NewReader(resp)).Decode(&doc); err != nil { return EC2InstanceIdentityDocument{}, - awserr.New("SerializationError", + awserr.New(request.ErrCodeSerialization, "failed to decode EC2 instance identity document", err) } @@ -98,7 +130,7 @@ func (c *EC2Metadata) IAMInfo() (EC2IAMInfo, error) { info := EC2IAMInfo{} if err := json.NewDecoder(strings.NewReader(resp)).Decode(&info); err != nil { return EC2IAMInfo{}, - awserr.New("SerializationError", + awserr.New(request.ErrCodeSerialization, "failed to decode EC2 IAM info", err) } @@ -113,13 +145,17 @@ func (c *EC2Metadata) IAMInfo() (EC2IAMInfo, error) { // Region returns the region the instance is running in. func (c *EC2Metadata) Region() (string, error) { - resp, err := c.GetMetadata("placement/availability-zone") + ec2InstanceIdentityDocument, err := c.GetInstanceIdentityDocument() if err != nil { return "", err } - - // returns region without the suffix. Eg: us-west-2a becomes us-west-2 - return resp[:len(resp)-1], nil + // extract region from the ec2InstanceIdentityDocument + region := ec2InstanceIdentityDocument.Region + if len(region) == 0 { + return "", awserr.New("EC2MetadataError", "invalid region received for ec2metadata instance", nil) + } + // returns region + return region, nil } // Available returns if the application has access to the EC2 Metadata service. @@ -145,18 +181,19 @@ type EC2IAMInfo struct { // An EC2InstanceIdentityDocument provides the shape for unmarshaling // an instance identity document type EC2InstanceIdentityDocument struct { - DevpayProductCodes []string `json:"devpayProductCodes"` - AvailabilityZone string `json:"availabilityZone"` - PrivateIP string `json:"privateIp"` - Version string `json:"version"` - Region string `json:"region"` - InstanceID string `json:"instanceId"` - BillingProducts []string `json:"billingProducts"` - InstanceType string `json:"instanceType"` - AccountID string `json:"accountId"` - PendingTime time.Time `json:"pendingTime"` - ImageID string `json:"imageId"` - KernelID string `json:"kernelId"` - RamdiskID string `json:"ramdiskId"` - Architecture string `json:"architecture"` + DevpayProductCodes []string `json:"devpayProductCodes"` + MarketplaceProductCodes []string `json:"marketplaceProductCodes"` + AvailabilityZone string `json:"availabilityZone"` + PrivateIP string `json:"privateIp"` + Version string `json:"version"` + Region string `json:"region"` + InstanceID string `json:"instanceId"` + BillingProducts []string `json:"billingProducts"` + InstanceType string `json:"instanceType"` + AccountID string `json:"accountId"` + PendingTime time.Time `json:"pendingTime"` + ImageID string `json:"imageId"` + KernelID string `json:"kernelId"` + RamdiskID string `json:"ramdiskId"` + Architecture string `json:"architecture"` } diff --git a/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/service.go b/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/service.go index ef5f73292..b8b2940d7 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/service.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/service.go @@ -4,7 +4,7 @@ // This package's client can be disabled completely by setting the environment // variable "AWS_EC2_METADATA_DISABLED=true". This environment variable set to // true instructs the SDK to disable the EC2 Metadata client. The client cannot -// be used while the environemnt variable is set to true, (case insensitive). +// be used while the environment variable is set to true, (case insensitive). package ec2metadata import ( @@ -13,6 +13,7 @@ import ( "io" "net/http" "os" + "strconv" "strings" "time" @@ -24,9 +25,25 @@ import ( "github.com/aws/aws-sdk-go/aws/request" ) -// ServiceName is the name of the service. -const ServiceName = "ec2metadata" -const disableServiceEnvVar = "AWS_EC2_METADATA_DISABLED" +const ( + // ServiceName is the name of the service. + ServiceName = "ec2metadata" + disableServiceEnvVar = "AWS_EC2_METADATA_DISABLED" + + // Headers for Token and TTL + ttlHeader = "x-aws-ec2-metadata-token-ttl-seconds" + tokenHeader = "x-aws-ec2-metadata-token" + + // Named Handler constants + fetchTokenHandlerName = "FetchTokenHandler" + unmarshalMetadataHandlerName = "unmarshalMetadataHandler" + unmarshalTokenHandlerName = "unmarshalTokenHandler" + enableTokenProviderHandlerName = "enableTokenProviderHandler" + + // TTL constants + defaultTTL = 21600 * time.Second + ttlExpirationWindow = 30 * time.Second +) // A EC2Metadata is an EC2 Metadata service Client. type EC2Metadata struct { @@ -63,8 +80,10 @@ func NewClient(cfg aws.Config, handlers request.Handlers, endpoint, signingRegio // use a shorter timeout than default because the metadata // service is local if it is running, and to fail faster // if not running on an ec2 instance. - Timeout: 5 * time.Second, + Timeout: 1 * time.Second, } + // max number of retries on the client operation + cfg.MaxRetries = aws.Int(2) } svc := &EC2Metadata{ @@ -72,6 +91,7 @@ func NewClient(cfg aws.Config, handlers request.Handlers, endpoint, signingRegio cfg, metadata.ClientInfo{ ServiceName: ServiceName, + ServiceID: ServiceName, Endpoint: endpoint, APIVersion: "latest", }, @@ -79,18 +99,35 @@ func NewClient(cfg aws.Config, handlers request.Handlers, endpoint, signingRegio ), } - svc.Handlers.Unmarshal.PushBack(unmarshalHandler) + // token provider instance + tp := newTokenProvider(svc, defaultTTL) + + // NamedHandler for fetching token + svc.Handlers.Sign.PushBackNamed(request.NamedHandler{ + Name: fetchTokenHandlerName, + Fn: tp.fetchTokenHandler, + }) + // NamedHandler for enabling token provider + svc.Handlers.Complete.PushBackNamed(request.NamedHandler{ + Name: enableTokenProviderHandlerName, + Fn: tp.enableTokenProviderHandler, + }) + + svc.Handlers.Unmarshal.PushBackNamed(unmarshalHandler) svc.Handlers.UnmarshalError.PushBack(unmarshalError) svc.Handlers.Validate.Clear() svc.Handlers.Validate.PushBack(validateEndpointHandler) // Disable the EC2 Metadata service if the environment variable is set. - // This shortcirctes the service's functionality to always fail to send + // This short-circuits the service's functionality to always fail to send // requests. if strings.ToLower(os.Getenv(disableServiceEnvVar)) == "true" { svc.Handlers.Send.SwapNamed(request.NamedHandler{ Name: corehandlers.SendHandler.Name, Fn: func(r *request.Request) { + r.HTTPResponse = &http.Response{ + Header: http.Header{}, + } r.Error = awserr.New( request.CanceledErrorCode, "EC2 IMDS access disabled via "+disableServiceEnvVar+" env var", @@ -103,7 +140,6 @@ func NewClient(cfg aws.Config, handlers request.Handlers, endpoint, signingRegio for _, option := range opts { option(svc.Client) } - return svc } @@ -115,30 +151,74 @@ type metadataOutput struct { Content string } -func unmarshalHandler(r *request.Request) { - defer r.HTTPResponse.Body.Close() - b := &bytes.Buffer{} - if _, err := io.Copy(b, r.HTTPResponse.Body); err != nil { - r.Error = awserr.New("SerializationError", "unable to unmarshal EC2 metadata respose", err) - return - } +type tokenOutput struct { + Token string + TTL time.Duration +} - if data, ok := r.Data.(*metadataOutput); ok { - data.Content = b.String() - } +// unmarshal token handler is used to parse the response of a getToken operation +var unmarshalTokenHandler = request.NamedHandler{ + Name: unmarshalTokenHandlerName, + Fn: func(r *request.Request) { + defer r.HTTPResponse.Body.Close() + var b bytes.Buffer + if _, err := io.Copy(&b, r.HTTPResponse.Body); err != nil { + r.Error = awserr.NewRequestFailure(awserr.New(request.ErrCodeSerialization, + "unable to unmarshal EC2 metadata response", err), r.HTTPResponse.StatusCode, r.RequestID) + return + } + + v := r.HTTPResponse.Header.Get(ttlHeader) + data, ok := r.Data.(*tokenOutput) + if !ok { + return + } + + data.Token = b.String() + // TTL is in seconds + i, err := strconv.ParseInt(v, 10, 64) + if err != nil { + r.Error = awserr.NewRequestFailure(awserr.New(request.ParamFormatErrCode, + "unable to parse EC2 token TTL response", err), r.HTTPResponse.StatusCode, r.RequestID) + return + } + t := time.Duration(i) * time.Second + data.TTL = t + }, +} + +var unmarshalHandler = request.NamedHandler{ + Name: unmarshalMetadataHandlerName, + Fn: func(r *request.Request) { + defer r.HTTPResponse.Body.Close() + var b bytes.Buffer + if _, err := io.Copy(&b, r.HTTPResponse.Body); err != nil { + r.Error = awserr.NewRequestFailure(awserr.New(request.ErrCodeSerialization, + "unable to unmarshal EC2 metadata response", err), r.HTTPResponse.StatusCode, r.RequestID) + return + } + + if data, ok := r.Data.(*metadataOutput); ok { + data.Content = b.String() + } + }, } func unmarshalError(r *request.Request) { defer r.HTTPResponse.Body.Close() - b := &bytes.Buffer{} - if _, err := io.Copy(b, r.HTTPResponse.Body); err != nil { - r.Error = awserr.New("SerializationError", "unable to unmarshal EC2 metadata error respose", err) + var b bytes.Buffer + + if _, err := io.Copy(&b, r.HTTPResponse.Body); err != nil { + r.Error = awserr.NewRequestFailure( + awserr.New(request.ErrCodeSerialization, "unable to unmarshal EC2 metadata error response", err), + r.HTTPResponse.StatusCode, r.RequestID) return } // Response body format is not consistent between metadata endpoints. // Grab the error message as a string and include that as the source error - r.Error = awserr.New("EC2MetadataError", "failed to make EC2Metadata request", errors.New(b.String())) + r.Error = awserr.NewRequestFailure(awserr.New("EC2MetadataError", "failed to make EC2Metadata request", errors.New(b.String())), + r.HTTPResponse.StatusCode, r.RequestID) } func validateEndpointHandler(r *request.Request) { diff --git a/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/token_provider.go b/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/token_provider.go new file mode 100644 index 000000000..663372a91 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/token_provider.go @@ -0,0 +1,92 @@ +package ec2metadata + +import ( + "net/http" + "sync/atomic" + "time" + + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/request" +) + +// A tokenProvider struct provides access to EC2Metadata client +// and atomic instance of a token, along with configuredTTL for it. +// tokenProvider also provides an atomic flag to disable the +// fetch token operation. +// The disabled member will use 0 as false, and 1 as true. +type tokenProvider struct { + client *EC2Metadata + token atomic.Value + configuredTTL time.Duration + disabled uint32 +} + +// A ec2Token struct helps use of token in EC2 Metadata service ops +type ec2Token struct { + token string + credentials.Expiry +} + +// newTokenProvider provides a pointer to a tokenProvider instance +func newTokenProvider(c *EC2Metadata, duration time.Duration) *tokenProvider { + return &tokenProvider{client: c, configuredTTL: duration} +} + +// fetchTokenHandler fetches token for EC2Metadata service client by default. +func (t *tokenProvider) fetchTokenHandler(r *request.Request) { + + // short-circuits to insecure data flow if tokenProvider is disabled. + if v := atomic.LoadUint32(&t.disabled); v == 1 { + return + } + + if ec2Token, ok := t.token.Load().(ec2Token); ok && !ec2Token.IsExpired() { + r.HTTPRequest.Header.Set(tokenHeader, ec2Token.token) + return + } + + output, err := t.client.getToken(t.configuredTTL) + + if err != nil { + + // change the disabled flag on token provider to true, + // when error is request timeout error. + if requestFailureError, ok := err.(awserr.RequestFailure); ok { + switch requestFailureError.StatusCode() { + case http.StatusForbidden, http.StatusNotFound, http.StatusMethodNotAllowed: + atomic.StoreUint32(&t.disabled, 1) + case http.StatusBadRequest: + r.Error = requestFailureError + } + + // Check if request timed out while waiting for response + if e, ok := requestFailureError.OrigErr().(awserr.Error); ok { + if e.Code() == request.ErrCodeRequestError { + atomic.StoreUint32(&t.disabled, 1) + } + } + } + return + } + + newToken := ec2Token{ + token: output.Token, + } + newToken.SetExpiration(time.Now().Add(output.TTL), ttlExpirationWindow) + t.token.Store(newToken) + + // Inject token header to the request. + if ec2Token, ok := t.token.Load().(ec2Token); ok { + r.HTTPRequest.Header.Set(tokenHeader, ec2Token.token) + } +} + +// enableTokenProviderHandler enables the token provider +func (t *tokenProvider) enableTokenProviderHandler(r *request.Request) { + // If the error code status is 401, we enable the token provider + if e, ok := r.Error.(awserr.RequestFailure); ok && e != nil && + e.StatusCode() == http.StatusUnauthorized { + atomic.StoreUint32(&t.disabled, 0) + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/decode.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/decode.go index 74f72de07..343a2106f 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/decode.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/decode.go @@ -83,7 +83,10 @@ func decodeV3Endpoints(modelDef modelDefinition, opts DecodeModelOptions) (Resol p := &ps[i] custAddEC2Metadata(p) custAddS3DualStack(p) + custRegionalS3(p) custRmIotDataService(p) + custFixAppAutoscalingChina(p) + custFixAppAutoscalingUsGov(p) } return ps, nil @@ -94,7 +97,39 @@ func custAddS3DualStack(p *partition) { return } - s, ok := p.Services["s3"] + custAddDualstack(p, "s3") + custAddDualstack(p, "s3-control") +} + +func custRegionalS3(p *partition) { + if p.ID != "aws" { + return + } + + service, ok := p.Services["s3"] + if !ok { + return + } + + // If global endpoint already exists no customization needed. + if _, ok := service.Endpoints["aws-global"]; ok { + return + } + + service.PartitionEndpoint = "aws-global" + service.Endpoints["us-east-1"] = endpoint{} + service.Endpoints["aws-global"] = endpoint{ + Hostname: "s3.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + } + + p.Services["s3"] = service +} + +func custAddDualstack(p *partition, svcName string) { + s, ok := p.Services[svcName] if !ok { return } @@ -102,7 +137,7 @@ func custAddS3DualStack(p *partition) { s.Defaults.HasDualStack = boxedTrue s.Defaults.DualStackHostname = "{service}.dualstack.{region}.{dnsSuffix}" - p.Services["s3"] = s + p.Services[svcName] = s } func custAddEC2Metadata(p *partition) { @@ -122,6 +157,54 @@ func custRmIotDataService(p *partition) { delete(p.Services, "data.iot") } +func custFixAppAutoscalingChina(p *partition) { + if p.ID != "aws-cn" { + return + } + + const serviceName = "application-autoscaling" + s, ok := p.Services[serviceName] + if !ok { + return + } + + const expectHostname = `autoscaling.{region}.amazonaws.com` + if e, a := s.Defaults.Hostname, expectHostname; e != a { + fmt.Printf("custFixAppAutoscalingChina: ignoring customization, expected %s, got %s\n", e, a) + return + } + + s.Defaults.Hostname = expectHostname + ".cn" + p.Services[serviceName] = s +} + +func custFixAppAutoscalingUsGov(p *partition) { + if p.ID != "aws-us-gov" { + return + } + + const serviceName = "application-autoscaling" + s, ok := p.Services[serviceName] + if !ok { + return + } + + if a := s.Defaults.CredentialScope.Service; a != "" { + fmt.Printf("custFixAppAutoscalingUsGov: ignoring customization, expected empty credential scope service, got %s\n", a) + return + } + + if a := s.Defaults.Hostname; a != "" { + fmt.Printf("custFixAppAutoscalingUsGov: ignoring customization, expected empty hostname, got %s\n", a) + return + } + + s.Defaults.CredentialScope.Service = "application-autoscaling" + s.Defaults.Hostname = "autoscaling.{region}.amazonaws.com" + + p.Services[serviceName] = s +} + type decodeModelError struct { awsError } diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go index cef59d5cf..4c4254b14 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go @@ -11,10 +11,13 @@ const ( AwsPartitionID = "aws" // AWS Standard partition. AwsCnPartitionID = "aws-cn" // AWS China partition. AwsUsGovPartitionID = "aws-us-gov" // AWS GovCloud (US) partition. + AwsIsoPartitionID = "aws-iso" // AWS ISO (US) partition. + AwsIsoBPartitionID = "aws-iso-b" // AWS ISOB (US) partition. ) // AWS Standard partition's regions. const ( + ApEast1RegionID = "ap-east-1" // Asia Pacific (Hong Kong). ApNortheast1RegionID = "ap-northeast-1" // Asia Pacific (Tokyo). ApNortheast2RegionID = "ap-northeast-2" // Asia Pacific (Seoul). ApSouth1RegionID = "ap-south-1" // Asia Pacific (Mumbai). @@ -22,9 +25,11 @@ const ( ApSoutheast2RegionID = "ap-southeast-2" // Asia Pacific (Sydney). CaCentral1RegionID = "ca-central-1" // Canada (Central). EuCentral1RegionID = "eu-central-1" // EU (Frankfurt). + EuNorth1RegionID = "eu-north-1" // EU (Stockholm). EuWest1RegionID = "eu-west-1" // EU (Ireland). EuWest2RegionID = "eu-west-2" // EU (London). EuWest3RegionID = "eu-west-3" // EU (Paris). + MeSouth1RegionID = "me-south-1" // Middle East (Bahrain). SaEast1RegionID = "sa-east-1" // South America (Sao Paulo). UsEast1RegionID = "us-east-1" // US East (N. Virginia). UsEast2RegionID = "us-east-2" // US East (Ohio). @@ -40,139 +45,22 @@ const ( // AWS GovCloud (US) partition's regions. const ( + UsGovEast1RegionID = "us-gov-east-1" // AWS GovCloud (US-East). UsGovWest1RegionID = "us-gov-west-1" // AWS GovCloud (US). ) -// Service identifiers +// AWS ISO (US) partition's regions. const ( - A4bServiceID = "a4b" // A4b. - AcmServiceID = "acm" // Acm. - AcmPcaServiceID = "acm-pca" // AcmPca. - ApiPricingServiceID = "api.pricing" // ApiPricing. - ApigatewayServiceID = "apigateway" // Apigateway. - ApplicationAutoscalingServiceID = "application-autoscaling" // ApplicationAutoscaling. - Appstream2ServiceID = "appstream2" // Appstream2. - AthenaServiceID = "athena" // Athena. - AutoscalingServiceID = "autoscaling" // Autoscaling. - AutoscalingPlansServiceID = "autoscaling-plans" // AutoscalingPlans. - BatchServiceID = "batch" // Batch. - BudgetsServiceID = "budgets" // Budgets. - CeServiceID = "ce" // Ce. - Cloud9ServiceID = "cloud9" // Cloud9. - ClouddirectoryServiceID = "clouddirectory" // Clouddirectory. - CloudformationServiceID = "cloudformation" // Cloudformation. - CloudfrontServiceID = "cloudfront" // Cloudfront. - CloudhsmServiceID = "cloudhsm" // Cloudhsm. - Cloudhsmv2ServiceID = "cloudhsmv2" // Cloudhsmv2. - CloudsearchServiceID = "cloudsearch" // Cloudsearch. - CloudtrailServiceID = "cloudtrail" // Cloudtrail. - CodebuildServiceID = "codebuild" // Codebuild. - CodecommitServiceID = "codecommit" // Codecommit. - CodedeployServiceID = "codedeploy" // Codedeploy. - CodepipelineServiceID = "codepipeline" // Codepipeline. - CodestarServiceID = "codestar" // Codestar. - CognitoIdentityServiceID = "cognito-identity" // CognitoIdentity. - CognitoIdpServiceID = "cognito-idp" // CognitoIdp. - CognitoSyncServiceID = "cognito-sync" // CognitoSync. - ComprehendServiceID = "comprehend" // Comprehend. - ConfigServiceID = "config" // Config. - CurServiceID = "cur" // Cur. - DatapipelineServiceID = "datapipeline" // Datapipeline. - DaxServiceID = "dax" // Dax. - DevicefarmServiceID = "devicefarm" // Devicefarm. - DirectconnectServiceID = "directconnect" // Directconnect. - DiscoveryServiceID = "discovery" // Discovery. - DmsServiceID = "dms" // Dms. - DsServiceID = "ds" // Ds. - DynamodbServiceID = "dynamodb" // Dynamodb. - Ec2ServiceID = "ec2" // Ec2. - Ec2metadataServiceID = "ec2metadata" // Ec2metadata. - EcrServiceID = "ecr" // Ecr. - EcsServiceID = "ecs" // Ecs. - ElasticacheServiceID = "elasticache" // Elasticache. - ElasticbeanstalkServiceID = "elasticbeanstalk" // Elasticbeanstalk. - ElasticfilesystemServiceID = "elasticfilesystem" // Elasticfilesystem. - ElasticloadbalancingServiceID = "elasticloadbalancing" // Elasticloadbalancing. - ElasticmapreduceServiceID = "elasticmapreduce" // Elasticmapreduce. - ElastictranscoderServiceID = "elastictranscoder" // Elastictranscoder. - EmailServiceID = "email" // Email. - EntitlementMarketplaceServiceID = "entitlement.marketplace" // EntitlementMarketplace. - EsServiceID = "es" // Es. - EventsServiceID = "events" // Events. - FirehoseServiceID = "firehose" // Firehose. - FmsServiceID = "fms" // Fms. - GameliftServiceID = "gamelift" // Gamelift. - GlacierServiceID = "glacier" // Glacier. - GlueServiceID = "glue" // Glue. - GreengrassServiceID = "greengrass" // Greengrass. - GuarddutyServiceID = "guardduty" // Guardduty. - HealthServiceID = "health" // Health. - IamServiceID = "iam" // Iam. - ImportexportServiceID = "importexport" // Importexport. - InspectorServiceID = "inspector" // Inspector. - IotServiceID = "iot" // Iot. - KinesisServiceID = "kinesis" // Kinesis. - KinesisanalyticsServiceID = "kinesisanalytics" // Kinesisanalytics. - KinesisvideoServiceID = "kinesisvideo" // Kinesisvideo. - KmsServiceID = "kms" // Kms. - LambdaServiceID = "lambda" // Lambda. - LightsailServiceID = "lightsail" // Lightsail. - LogsServiceID = "logs" // Logs. - MachinelearningServiceID = "machinelearning" // Machinelearning. - MarketplacecommerceanalyticsServiceID = "marketplacecommerceanalytics" // Marketplacecommerceanalytics. - MediaconvertServiceID = "mediaconvert" // Mediaconvert. - MedialiveServiceID = "medialive" // Medialive. - MediapackageServiceID = "mediapackage" // Mediapackage. - MeteringMarketplaceServiceID = "metering.marketplace" // MeteringMarketplace. - MghServiceID = "mgh" // Mgh. - MobileanalyticsServiceID = "mobileanalytics" // Mobileanalytics. - ModelsLexServiceID = "models.lex" // ModelsLex. - MonitoringServiceID = "monitoring" // Monitoring. - MturkRequesterServiceID = "mturk-requester" // MturkRequester. - OpsworksServiceID = "opsworks" // Opsworks. - OpsworksCmServiceID = "opsworks-cm" // OpsworksCm. - OrganizationsServiceID = "organizations" // Organizations. - PinpointServiceID = "pinpoint" // Pinpoint. - PollyServiceID = "polly" // Polly. - RdsServiceID = "rds" // Rds. - RedshiftServiceID = "redshift" // Redshift. - RekognitionServiceID = "rekognition" // Rekognition. - ResourceGroupsServiceID = "resource-groups" // ResourceGroups. - Route53ServiceID = "route53" // Route53. - Route53domainsServiceID = "route53domains" // Route53domains. - RuntimeLexServiceID = "runtime.lex" // RuntimeLex. - RuntimeSagemakerServiceID = "runtime.sagemaker" // RuntimeSagemaker. - S3ServiceID = "s3" // S3. - SagemakerServiceID = "sagemaker" // Sagemaker. - SdbServiceID = "sdb" // Sdb. - SecretsmanagerServiceID = "secretsmanager" // Secretsmanager. - ServerlessrepoServiceID = "serverlessrepo" // Serverlessrepo. - ServicecatalogServiceID = "servicecatalog" // Servicecatalog. - ServicediscoveryServiceID = "servicediscovery" // Servicediscovery. - ShieldServiceID = "shield" // Shield. - SmsServiceID = "sms" // Sms. - SnowballServiceID = "snowball" // Snowball. - SnsServiceID = "sns" // Sns. - SqsServiceID = "sqs" // Sqs. - SsmServiceID = "ssm" // Ssm. - StatesServiceID = "states" // States. - StoragegatewayServiceID = "storagegateway" // Storagegateway. - StreamsDynamodbServiceID = "streams.dynamodb" // StreamsDynamodb. - StsServiceID = "sts" // Sts. - SupportServiceID = "support" // Support. - SwfServiceID = "swf" // Swf. - TaggingServiceID = "tagging" // Tagging. - TranslateServiceID = "translate" // Translate. - WafServiceID = "waf" // Waf. - WafRegionalServiceID = "waf-regional" // WafRegional. - WorkdocsServiceID = "workdocs" // Workdocs. - WorkmailServiceID = "workmail" // Workmail. - WorkspacesServiceID = "workspaces" // Workspaces. - XrayServiceID = "xray" // Xray. + UsIsoEast1RegionID = "us-iso-east-1" // US ISO East. +) + +// AWS ISOB (US) partition's regions. +const ( + UsIsobEast1RegionID = "us-isob-east-1" // US ISOB East (Ohio). ) // DefaultResolver returns an Endpoint resolver that will be able -// to resolve endpoints for: AWS Standard, AWS China, and AWS GovCloud (US). +// to resolve endpoints for: AWS Standard, AWS China, AWS GovCloud (US), AWS ISO (US), and AWS ISOB (US). // // Use DefaultPartitions() to get the list of the default partitions. func DefaultResolver() Resolver { @@ -180,7 +68,7 @@ func DefaultResolver() Resolver { } // DefaultPartitions returns a list of the partitions the SDK is bundled -// with. The available partitions are: AWS Standard, AWS China, and AWS GovCloud (US). +// with. The available partitions are: AWS Standard, AWS China, AWS GovCloud (US), AWS ISO (US), and AWS ISOB (US). // // partitions := endpoints.DefaultPartitions // for _, p := range partitions { @@ -194,6 +82,8 @@ var defaultPartitions = partitions{ awsPartition, awscnPartition, awsusgovPartition, + awsisoPartition, + awsisobPartition, } // AwsPartition returns the Resolver for AWS Standard. @@ -207,7 +97,7 @@ var awsPartition = partition{ DNSSuffix: "amazonaws.com", RegionRegex: regionRegex{ Regexp: func() *regexp.Regexp { - reg, _ := regexp.Compile("^(us|eu|ap|sa|ca)\\-\\w+\\-\\d+$") + reg, _ := regexp.Compile("^(us|eu|ap|sa|ca|me)\\-\\w+\\-\\d+$") return reg }(), }, @@ -217,6 +107,9 @@ var awsPartition = partition{ SignatureVersions: []string{"v4"}, }, Regions: regions{ + "ap-east-1": region{ + Description: "Asia Pacific (Hong Kong)", + }, "ap-northeast-1": region{ Description: "Asia Pacific (Tokyo)", }, @@ -238,6 +131,9 @@ var awsPartition = partition{ "eu-central-1": region{ Description: "EU (Frankfurt)", }, + "eu-north-1": region{ + Description: "EU (Stockholm)", + }, "eu-west-1": region{ Description: "EU (Ireland)", }, @@ -247,6 +143,9 @@ var awsPartition = partition{ "eu-west-3": region{ Description: "EU (Paris)", }, + "me-south-1": region{ + Description: "Middle East (Bahrain)", + }, "sa-east-1": region{ Description: "South America (Sao Paulo)", }, @@ -270,9 +169,10 @@ var awsPartition = partition{ "us-east-1": endpoint{}, }, }, - "acm": service{ + "access-analyzer": service{ Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, @@ -280,9 +180,11 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, @@ -290,12 +192,237 @@ var awsPartition = partition{ "us-west-2": endpoint{}, }, }, + "acm": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "ca-central-1-fips": endpoint{ + Hostname: "acm-fips.ca-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ca-central-1", + }, + }, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-1-fips": endpoint{ + Hostname: "acm-fips.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{}, + "us-east-2-fips": endpoint{ + Hostname: "acm-fips.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-1": endpoint{}, + "us-west-1-fips": endpoint{ + Hostname: "acm-fips.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "us-west-2": endpoint{}, + "us-west-2-fips": endpoint{ + Hostname: "acm-fips.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + }, + }, "acm-pca": service{ Defaults: endpoint{ Protocols: []string{"https"}, }, Endpoints: endpoints{ - "us-east-1": endpoint{}, + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "fips-ca-central-1": endpoint{ + Hostname: "acm-pca-fips.ca-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ca-central-1", + }, + }, + "fips-us-east-1": endpoint{ + Hostname: "acm-pca-fips.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "fips-us-east-2": endpoint{ + Hostname: "acm-pca-fips.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "fips-us-west-1": endpoint{ + Hostname: "acm-pca-fips.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "fips-us-west-2": endpoint{ + Hostname: "acm-pca-fips.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "api.ecr": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{ + Hostname: "api.ecr.ap-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-east-1", + }, + }, + "ap-northeast-1": endpoint{ + Hostname: "api.ecr.ap-northeast-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-northeast-1", + }, + }, + "ap-northeast-2": endpoint{ + Hostname: "api.ecr.ap-northeast-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-northeast-2", + }, + }, + "ap-south-1": endpoint{ + Hostname: "api.ecr.ap-south-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-south-1", + }, + }, + "ap-southeast-1": endpoint{ + Hostname: "api.ecr.ap-southeast-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-southeast-1", + }, + }, + "ap-southeast-2": endpoint{ + Hostname: "api.ecr.ap-southeast-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-southeast-2", + }, + }, + "ca-central-1": endpoint{ + Hostname: "api.ecr.ca-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ca-central-1", + }, + }, + "eu-central-1": endpoint{ + Hostname: "api.ecr.eu-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-central-1", + }, + }, + "eu-north-1": endpoint{ + Hostname: "api.ecr.eu-north-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-north-1", + }, + }, + "eu-west-1": endpoint{ + Hostname: "api.ecr.eu-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-1", + }, + }, + "eu-west-2": endpoint{ + Hostname: "api.ecr.eu-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-2", + }, + }, + "eu-west-3": endpoint{ + Hostname: "api.ecr.eu-west-3.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-3", + }, + }, + "me-south-1": endpoint{ + Hostname: "api.ecr.me-south-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "me-south-1", + }, + }, + "sa-east-1": endpoint{ + Hostname: "api.ecr.sa-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "sa-east-1", + }, + }, + "us-east-1": endpoint{ + Hostname: "api.ecr.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{ + Hostname: "api.ecr.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-1": endpoint{ + Hostname: "api.ecr.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "us-west-2": endpoint{ + Hostname: "api.ecr.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + }, + }, + "api.mediatailor": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-2": endpoint{}, }, }, "api.pricing": service{ @@ -309,9 +436,57 @@ var awsPartition = partition{ "us-east-1": endpoint{}, }, }, + "api.sagemaker": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-1-fips": endpoint{ + Hostname: "api-fips.sagemaker.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{}, + "us-east-2-fips": endpoint{ + Hostname: "api-fips.sagemaker.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-1": endpoint{}, + "us-west-1-fips": endpoint{ + Hostname: "api-fips.sagemaker.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "us-west-2": endpoint{}, + "us-west-2-fips": endpoint{ + Hostname: "api-fips.sagemaker.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + }, + }, "apigateway": service{ Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, @@ -319,9 +494,11 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, @@ -331,12 +508,31 @@ var awsPartition = partition{ }, "application-autoscaling": service{ Defaults: endpoint{ - Hostname: "autoscaling.{region}.amazonaws.com", Protocols: []string{"http", "https"}, - CredentialScope: credentialScope{ - Service: "application-autoscaling", - }, }, + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "appmesh": service{ + Endpoints: endpoints{ "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, @@ -345,9 +541,11 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, @@ -364,21 +562,57 @@ var awsPartition = partition{ }, Endpoints: endpoints{ "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "fips": endpoint{ + Hostname: "appstream2-fips.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + "us-east-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "appsync": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, "us-east-1": endpoint{}, + "us-east-2": endpoint{}, "us-west-2": endpoint{}, }, }, "athena": service{ Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, + "us-west-1": endpoint{}, "us-west-2": endpoint{}, }, }, @@ -387,6 +621,7 @@ var awsPartition = partition{ Protocols: []string{"http", "https"}, }, Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, @@ -394,9 +629,11 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, @@ -406,31 +643,64 @@ var awsPartition = partition{ }, "autoscaling-plans": service{ Defaults: endpoint{ - Hostname: "autoscaling.{region}.amazonaws.com", Protocols: []string{"http", "https"}, - CredentialScope: credentialScope{ - Service: "autoscaling-plans", - }, }, Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "backup": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, + "us-west-1": endpoint{}, "us-west-2": endpoint{}, }, }, "batch": service{ Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, "us-west-1": endpoint{}, @@ -463,11 +733,36 @@ var awsPartition = partition{ }, }, }, + "chime": service{ + PartitionEndpoint: "aws-global", + IsRegionalized: boxedFalse, + Defaults: endpoint{ + SSLCommonName: "service.chime.aws.amazon.com", + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "aws-global": endpoint{ + Hostname: "service.chime.aws.amazon.com", + Protocols: []string{"https"}, + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + }, + }, "cloud9": service{ Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, "us-west-2": endpoint{}, @@ -478,6 +773,7 @@ var awsPartition = partition{ Endpoints: endpoints{ "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, @@ -489,6 +785,7 @@ var awsPartition = partition{ "cloudformation": service{ Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, @@ -496,9 +793,11 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, @@ -542,13 +841,20 @@ var awsPartition = partition{ }, }, Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, "us-west-1": endpoint{}, @@ -573,6 +879,7 @@ var awsPartition = partition{ "cloudtrail": service{ Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, @@ -580,9 +887,11 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, @@ -593,6 +902,7 @@ var awsPartition = partition{ "codebuild": service{ Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, @@ -600,9 +910,11 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-1-fips": endpoint{ @@ -637,6 +949,7 @@ var awsPartition = partition{ "codecommit": service{ Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, @@ -644,18 +957,28 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "fips": endpoint{ + Hostname: "codecommit-fips.ca-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ca-central-1", + }, + }, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, }, }, "codedeploy": service{ Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, @@ -663,14 +986,40 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, "sa-east-1": endpoint{}, "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, + "us-east-1-fips": endpoint{ + Hostname: "codedeploy-fips.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{}, + "us-east-2-fips": endpoint{ + Hostname: "codedeploy-fips.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-1": endpoint{}, + "us-west-1-fips": endpoint{ + Hostname: "codedeploy-fips.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "us-west-2": endpoint{}, + "us-west-2-fips": endpoint{ + Hostname: "codedeploy-fips.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, }, }, "codepipeline": service{ @@ -683,6 +1032,7 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, @@ -718,6 +1068,7 @@ var awsPartition = partition{ "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, @@ -734,6 +1085,7 @@ var awsPartition = partition{ "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, @@ -762,15 +1114,6 @@ var awsPartition = partition{ Defaults: endpoint{ Protocols: []string{"https"}, }, - Endpoints: endpoints{ - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "config": service{ - Endpoints: endpoints{ "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, @@ -781,120 +1124,107 @@ var awsPartition = partition{ "eu-central-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, - "us-west-1": endpoint{}, "us-west-2": endpoint{}, }, }, - "cur": service{ - - Endpoints: endpoints{ - "us-east-1": endpoint{}, - }, - }, - "datapipeline": service{ + "comprehendmedical": service{ Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, "us-east-1": endpoint{}, + "us-east-2": endpoint{}, "us-west-2": endpoint{}, }, }, - "dax": service{ + "config": service{ Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, "sa-east-1": endpoint{}, "us-east-1": endpoint{}, + "us-east-2": endpoint{}, "us-west-1": endpoint{}, "us-west-2": endpoint{}, }, }, - "devicefarm": service{ - - Endpoints: endpoints{ - "us-west-2": endpoint{}, - }, - }, - "directconnect": service{ + "connect": service{ Endpoints: endpoints{ "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, "us-west-2": endpoint{}, }, }, - "discovery": service{ + "cur": service{ Endpoints: endpoints{ - "us-west-2": endpoint{}, + "us-east-1": endpoint{}, }, }, - "dms": service{ + "data.mediastore": service{ Endpoints: endpoints{ "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, "us-west-2": endpoint{}, }, }, - "ds": service{ + "dataexchange": service{ Endpoints: endpoints{ "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, - "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, "us-west-1": endpoint{}, "us-west-2": endpoint{}, }, }, - "dynamodb": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, + "datapipeline": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-2": endpoint{}, }, + }, + "datasync": service{ + Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, @@ -902,34 +1232,49 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, - "local": endpoint{ - Hostname: "localhost:8000", - Protocols: []string{"http"}, + "fips-us-east-1": endpoint{ + Hostname: "datasync-fips.us-east-1.amazonaws.com", CredentialScope: credentialScope{ Region: "us-east-1", }, }, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, + "fips-us-east-2": endpoint{ + Hostname: "datasync-fips.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "fips-us-west-1": endpoint{ + Hostname: "datasync-fips.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "fips-us-west-2": endpoint{ + Hostname: "datasync-fips.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, }, }, - "ec2": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - }, + "dax": service{ + Endpoints: endpoints{ "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, @@ -941,40 +1286,16 @@ var awsPartition = partition{ "us-west-2": endpoint{}, }, }, - "ec2metadata": service{ - PartitionEndpoint: "aws-global", - IsRegionalized: boxedFalse, - - Endpoints: endpoints{ - "aws-global": endpoint{ - Hostname: "169.254.169.254/latest", - Protocols: []string{"http"}, - }, - }, - }, - "ecr": service{ + "devicefarm": service{ Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, + "us-west-2": endpoint{}, }, }, - "ecs": service{ + "directconnect": service{ Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, @@ -982,9 +1303,11 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, @@ -992,29 +1315,17 @@ var awsPartition = partition{ "us-west-2": endpoint{}, }, }, - "elasticache": service{ + "discovery": service{ Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, + "eu-central-1": endpoint{}, + "us-west-2": endpoint{}, }, }, - "elasticbeanstalk": service{ + "dms": service{ Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, @@ -1022,9 +1333,11 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, @@ -1032,23 +1345,93 @@ var awsPartition = partition{ "us-west-2": endpoint{}, }, }, - "elasticfilesystem": service{ + "docdb": service{ Endpoints: endpoints{ - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, + "ap-northeast-1": endpoint{ + Hostname: "rds.ap-northeast-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-northeast-1", + }, + }, + "ap-northeast-2": endpoint{ + Hostname: "rds.ap-northeast-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-northeast-2", + }, + }, + "ap-south-1": endpoint{ + Hostname: "rds.ap-south-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-south-1", + }, + }, + "ap-southeast-1": endpoint{ + Hostname: "rds.ap-southeast-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-southeast-1", + }, + }, + "ap-southeast-2": endpoint{ + Hostname: "rds.ap-southeast-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-southeast-2", + }, + }, + "ca-central-1": endpoint{ + Hostname: "rds.ca-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ca-central-1", + }, + }, + "eu-central-1": endpoint{ + Hostname: "rds.eu-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-central-1", + }, + }, + "eu-west-1": endpoint{ + Hostname: "rds.eu-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-1", + }, + }, + "eu-west-2": endpoint{ + Hostname: "rds.eu-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-2", + }, + }, + "eu-west-3": endpoint{ + Hostname: "rds.eu-west-3.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-3", + }, + }, + "us-east-1": endpoint{ + Hostname: "rds.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{ + Hostname: "rds.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-2": endpoint{ + Hostname: "rds.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, }, }, - "elasticloadbalancing": service{ - Defaults: endpoint{ - Protocols: []string{"https"}, - }, + "ds": service{ + Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, @@ -1056,6 +1439,7 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, @@ -1066,67 +1450,108 @@ var awsPartition = partition{ "us-west-2": endpoint{}, }, }, - "elasticmapreduce": service{ + "dynamodb": service{ Defaults: endpoint{ - SSLCommonName: "{region}.{service}.{dnsSuffix}", - Protocols: []string{"http", "https"}, + Protocols: []string{"http", "https"}, }, Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, - "eu-central-1": endpoint{ - SSLCommonName: "{service}.{region}.{dnsSuffix}", + "ca-central-1-fips": endpoint{ + Hostname: "dynamodb-fips.ca-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ca-central-1", + }, }, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{ - SSLCommonName: "{service}.{region}.{dnsSuffix}", + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "local": endpoint{ + Hostname: "localhost:8000", + Protocols: []string{"http"}, + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-1-fips": endpoint{ + Hostname: "dynamodb-fips.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, }, "us-east-2": endpoint{}, + "us-east-2-fips": endpoint{ + Hostname: "dynamodb-fips.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, "us-west-1": endpoint{}, + "us-west-1-fips": endpoint{ + Hostname: "dynamodb-fips.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, "us-west-2": endpoint{}, + "us-west-2-fips": endpoint{ + Hostname: "dynamodb-fips.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, }, }, - "elastictranscoder": service{ - + "ec2": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + }, Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, "us-east-1": endpoint{}, + "us-east-2": endpoint{}, "us-west-1": endpoint{}, "us-west-2": endpoint{}, }, }, - "email": service{ + "ec2metadata": service{ + PartitionEndpoint: "aws-global", + IsRegionalized: boxedFalse, Endpoints: endpoints{ - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "entitlement.marketplace": service{ - Defaults: endpoint{ - CredentialScope: credentialScope{ - Service: "aws-marketplace", + "aws-global": endpoint{ + Hostname: "169.254.169.254/latest", + Protocols: []string{"http"}, }, }, - Endpoints: endpoints{ - "us-east-1": endpoint{}, - }, }, - "es": service{ + "ecs": service{ Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, @@ -1134,9 +1559,11 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, @@ -1144,9 +1571,39 @@ var awsPartition = partition{ "us-west-2": endpoint{}, }, }, - "events": service{ + "elasticache": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "fips": endpoint{ + Hostname: "elasticache-fips.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "elasticbeanstalk": service{ Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, @@ -1154,9 +1611,11 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, @@ -1164,32 +1623,35 @@ var awsPartition = partition{ "us-west-2": endpoint{}, }, }, - "firehose": service{ + "elasticfilesystem": service{ Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, "us-west-1": endpoint{}, "us-west-2": endpoint{}, }, }, - "fms": service{ + "elasticloadbalancing": service{ Defaults: endpoint{ Protocols: []string{"https"}, }, Endpoints: endpoints{ - "us-east-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "gamelift": service{ - - Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, @@ -1197,8 +1659,11 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, @@ -1206,58 +1671,103 @@ var awsPartition = partition{ "us-west-2": endpoint{}, }, }, - "glacier": service{ + "elasticmapreduce": service{ Defaults: endpoint{ - Protocols: []string{"http", "https"}, + SSLCommonName: "{region}.{service}.{dnsSuffix}", + Protocols: []string{"https"}, }, Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, + "eu-central-1": endpoint{ + SSLCommonName: "{service}.{region}.{dnsSuffix}", + }, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{ + SSLCommonName: "{service}.{region}.{dnsSuffix}", + }, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "elastictranscoder": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, "us-east-1": endpoint{}, - "us-east-2": endpoint{}, "us-west-1": endpoint{}, "us-west-2": endpoint{}, }, }, - "glue": service{ + "email": service{ Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, + "ap-south-1": endpoint{}, "ap-southeast-2": endpoint{}, "eu-central-1": endpoint{}, "eu-west-1": endpoint{}, "us-east-1": endpoint{}, - "us-east-2": endpoint{}, "us-west-2": endpoint{}, }, }, - "greengrass": service{ - IsRegionalized: boxedTrue, + "entitlement.marketplace": service{ Defaults: endpoint{ - Protocols: []string{"https"}, + CredentialScope: credentialScope{ + Service: "aws-marketplace", + }, + }, + Endpoints: endpoints{ + "us-east-1": endpoint{}, }, + }, + "es": service{ + Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, - "us-east-1": endpoint{}, - "us-west-2": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "fips": endpoint{ + Hostname: "es-fips.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, }, }, - "guardduty": service{ - IsRegionalized: boxedTrue, - Defaults: endpoint{ - Protocols: []string{"https"}, - }, + "events": service{ + Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, @@ -1265,9 +1775,11 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, @@ -1275,133 +1787,92 @@ var awsPartition = partition{ "us-west-2": endpoint{}, }, }, - "health": service{ - - Endpoints: endpoints{ - "us-east-1": endpoint{}, - }, - }, - "iam": service{ - PartitionEndpoint: "aws-global", - IsRegionalized: boxedFalse, - - Endpoints: endpoints{ - "aws-global": endpoint{ - Hostname: "iam.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - }, - }, - "importexport": service{ - PartitionEndpoint: "aws-global", - IsRegionalized: boxedFalse, - - Endpoints: endpoints{ - "aws-global": endpoint{ - Hostname: "importexport.amazonaws.com", - SignatureVersions: []string{"v2", "v4"}, - CredentialScope: credentialScope{ - Region: "us-east-1", - Service: "IngestionService", - }, - }, - }, - }, - "inspector": service{ + "firehose": service{ Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, "us-west-1": endpoint{}, "us-west-2": endpoint{}, }, }, - "iot": service{ + "fms": service{ Defaults: endpoint{ - CredentialScope: credentialScope{ - Service: "execute-api", - }, + Protocols: []string{"https"}, }, Endpoints: endpoints{ "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, + "us-west-1": endpoint{}, "us-west-2": endpoint{}, }, }, - "kinesis": service{ + "forecast": service{ Endpoints: endpoints{ "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, - "us-west-1": endpoint{}, "us-west-2": endpoint{}, }, }, - "kinesisanalytics": service{ - - Endpoints: endpoints{ - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "kinesisvideo": service{ + "forecastquery": service{ Endpoints: endpoints{ "ap-northeast-1": endpoint{}, - "eu-central-1": endpoint{}, + "ap-southeast-1": endpoint{}, "eu-west-1": endpoint{}, "us-east-1": endpoint{}, + "us-east-2": endpoint{}, "us-west-2": endpoint{}, }, }, - "kms": service{ + "fsx": service{ Endpoints: endpoints{ "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, "us-west-1": endpoint{}, "us-west-2": endpoint{}, }, }, - "lambda": service{ + "gamelift": service{ Endpoints: endpoints{ "ap-northeast-1": endpoint{}, @@ -1413,7 +1884,6 @@ var awsPartition = partition{ "eu-central-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, @@ -1421,24 +1891,35 @@ var awsPartition = partition{ "us-west-2": endpoint{}, }, }, - "lightsail": service{ - + "glacier": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + }, Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, + "us-west-1": endpoint{}, "us-west-2": endpoint{}, }, }, - "logs": service{ + "glue": service{ Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, @@ -1446,9 +1927,11 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, @@ -1456,71 +1939,41 @@ var awsPartition = partition{ "us-west-2": endpoint{}, }, }, - "machinelearning": service{ - - Endpoints: endpoints{ - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - }, - }, - "marketplacecommerceanalytics": service{ - - Endpoints: endpoints{ - "us-east-1": endpoint{}, + "greengrass": service{ + IsRegionalized: boxedTrue, + Defaults: endpoint{ + Protocols: []string{"https"}, }, - }, - "mediaconvert": service{ - Endpoints: endpoints{ "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, - "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "medialive": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, "us-west-2": endpoint{}, }, }, - "mediapackage": service{ + "groundstation": service{ Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-west-2": endpoint{}, + "eu-north-1": endpoint{}, + "me-south-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-2": endpoint{}, }, }, - "metering.marketplace": service{ + "guardduty": service{ + IsRegionalized: boxedTrue, Defaults: endpoint{ - CredentialScope: credentialScope{ - Service: "aws-marketplace", - }, + Protocols: []string{"https"}, }, Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, @@ -1528,74 +1981,101 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, "sa-east-1": endpoint{}, "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "mgh": service{ - - Endpoints: endpoints{ + "us-east-1-fips": endpoint{ + Hostname: "guardduty-fips.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{}, + "us-east-2-fips": endpoint{ + Hostname: "guardduty-fips.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-1": endpoint{}, + "us-west-1-fips": endpoint{ + Hostname: "guardduty-fips.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, "us-west-2": endpoint{}, + "us-west-2-fips": endpoint{ + Hostname: "guardduty-fips.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, }, }, - "mobileanalytics": service{ + "health": service{ Endpoints: endpoints{ "us-east-1": endpoint{}, }, }, - "models.lex": service{ - Defaults: endpoint{ - CredentialScope: credentialScope{ - Service: "lex", + "iam": service{ + PartitionEndpoint: "aws-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-global": endpoint{ + Hostname: "iam.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, }, }, + }, + "importexport": service{ + PartitionEndpoint: "aws-global", + IsRegionalized: boxedFalse, + Endpoints: endpoints{ - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, + "aws-global": endpoint{ + Hostname: "importexport.amazonaws.com", + SignatureVersions: []string{"v2", "v4"}, + CredentialScope: credentialScope{ + Region: "us-east-1", + Service: "IngestionService", + }, + }, }, }, - "monitoring": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - }, + "inspector": service{ + Endpoints: endpoints{ "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, "us-west-1": endpoint{}, "us-west-2": endpoint{}, }, }, - "mturk-requester": service{ - IsRegionalized: boxedFalse, - - Endpoints: endpoints{ - "sandbox": endpoint{ - Hostname: "mturk-requester-sandbox.us-east-1.amazonaws.com", + "iot": service{ + Defaults: endpoint{ + CredentialScope: credentialScope{ + Service: "execute-api", }, - "us-east-1": endpoint{}, }, - }, - "opsworks": service{ - Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, @@ -1603,9 +2083,11 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, @@ -1613,88 +2095,101 @@ var awsPartition = partition{ "us-west-2": endpoint{}, }, }, - "opsworks-cm": service{ + "iotanalytics": service{ Endpoints: endpoints{ "ap-northeast-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, "eu-central-1": endpoint{}, "eu-west-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, - "us-west-1": endpoint{}, "us-west-2": endpoint{}, }, }, - "organizations": service{ - PartitionEndpoint: "aws-global", - IsRegionalized: boxedFalse, - - Endpoints: endpoints{ - "aws-global": endpoint{ - Hostname: "organizations.us-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - }, - }, - "pinpoint": service{ - Defaults: endpoint{ - CredentialScope: credentialScope{ - Service: "mobiletargeting", - }, - }, - Endpoints: endpoints{ - "us-east-1": endpoint{}, - }, - }, - "polly": service{ + "iotevents": service{ Endpoints: endpoints{ "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, - "us-west-1": endpoint{}, "us-west-2": endpoint{}, }, }, - "rds": service{ + "ioteventsdata": service{ Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, + "ap-northeast-1": endpoint{ + Hostname: "data.iotevents.ap-northeast-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-northeast-1", + }, + }, + "ap-northeast-2": endpoint{ + Hostname: "data.iotevents.ap-northeast-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-northeast-2", + }, + }, + "ap-southeast-1": endpoint{ + Hostname: "data.iotevents.ap-southeast-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-southeast-1", + }, + }, + "ap-southeast-2": endpoint{ + Hostname: "data.iotevents.ap-southeast-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-southeast-2", + }, + }, + "eu-central-1": endpoint{ + Hostname: "data.iotevents.eu-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-central-1", + }, + }, + "eu-west-1": endpoint{ + Hostname: "data.iotevents.eu-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-1", + }, + }, + "eu-west-2": endpoint{ + Hostname: "data.iotevents.eu-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-2", + }, + }, "us-east-1": endpoint{ - SSLCommonName: "{service}.{dnsSuffix}", + Hostname: "data.iotevents.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{ + Hostname: "data.iotevents.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-2": endpoint{ + Hostname: "data.iotevents.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, }, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, }, }, - "redshift": service{ + "iotsecuredtunneling": service{ Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, @@ -1702,9 +2197,11 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, @@ -1712,20 +2209,25 @@ var awsPartition = partition{ "us-west-2": endpoint{}, }, }, - "rekognition": service{ - + "iotthingsgraph": service{ + Defaults: endpoint{ + CredentialScope: credentialScope{ + Service: "iotthingsgraph", + }, + }, Endpoints: endpoints{ "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, "ap-southeast-2": endpoint{}, "eu-west-1": endpoint{}, "us-east-1": endpoint{}, - "us-east-2": endpoint{}, "us-west-2": endpoint{}, }, }, - "resource-groups": service{ + "kafka": service{ Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, @@ -1733,8 +2235,11 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, @@ -1742,134 +2247,55 @@ var awsPartition = partition{ "us-west-2": endpoint{}, }, }, - "route53": service{ - PartitionEndpoint: "aws-global", - IsRegionalized: boxedFalse, - - Endpoints: endpoints{ - "aws-global": endpoint{ - Hostname: "route53.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - }, - }, - "route53domains": service{ - - Endpoints: endpoints{ - "us-east-1": endpoint{}, - }, - }, - "runtime.lex": service{ - Defaults: endpoint{ - CredentialScope: credentialScope{ - Service: "lex", - }, - }, - Endpoints: endpoints{ - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - }, - }, - "runtime.sagemaker": service{ - - Endpoints: endpoints{ - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "s3": service{ - PartitionEndpoint: "us-east-1", - IsRegionalized: boxedTrue, - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - SignatureVersions: []string{"s3v4"}, + "kinesis": service{ - HasDualStack: boxedTrue, - DualStackHostname: "{service}.dualstack.{region}.{dnsSuffix}", - }, Endpoints: endpoints{ - "ap-northeast-1": endpoint{ - Hostname: "s3.ap-northeast-1.amazonaws.com", - SignatureVersions: []string{"s3", "s3v4"}, - }, + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{ - Hostname: "s3.ap-southeast-1.amazonaws.com", - SignatureVersions: []string{"s3", "s3v4"}, - }, - "ap-southeast-2": endpoint{ - Hostname: "s3.ap-southeast-2.amazonaws.com", - SignatureVersions: []string{"s3", "s3v4"}, - }, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{ - Hostname: "s3.eu-west-1.amazonaws.com", - SignatureVersions: []string{"s3", "s3v4"}, - }, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "s3-external-1": endpoint{ - Hostname: "s3-external-1.amazonaws.com", - SignatureVersions: []string{"s3", "s3v4"}, - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - "sa-east-1": endpoint{ - Hostname: "s3.sa-east-1.amazonaws.com", - SignatureVersions: []string{"s3", "s3v4"}, - }, - "us-east-1": endpoint{ - Hostname: "s3.amazonaws.com", - SignatureVersions: []string{"s3", "s3v4"}, - }, - "us-east-2": endpoint{}, - "us-west-1": endpoint{ - Hostname: "s3.us-west-1.amazonaws.com", - SignatureVersions: []string{"s3", "s3v4"}, - }, - "us-west-2": endpoint{ - Hostname: "s3.us-west-2.amazonaws.com", - SignatureVersions: []string{"s3", "s3v4"}, - }, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, }, }, - "sagemaker": service{ + "kinesisanalytics": service{ Endpoints: endpoints{ - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "sdb": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - SignatureVersions: []string{"v2"}, - }, - Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, "sa-east-1": endpoint{}, - "us-east-1": endpoint{ - Hostname: "sdb.amazonaws.com", - }, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-2": endpoint{}, }, }, - "secretsmanager": service{ + "kinesisvideo": service{ Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, @@ -1879,65 +2305,17 @@ var awsPartition = partition{ "eu-central-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, - "us-west-1": endpoint{}, "us-west-2": endpoint{}, }, }, - "serverlessrepo": service{ - Defaults: endpoint{ - Protocols: []string{"https"}, - }, - Endpoints: endpoints{ - "ap-northeast-1": endpoint{ - Protocols: []string{"https"}, - }, - "ap-northeast-2": endpoint{ - Protocols: []string{"https"}, - }, - "ap-south-1": endpoint{ - Protocols: []string{"https"}, - }, - "ap-southeast-1": endpoint{ - Protocols: []string{"https"}, - }, - "ap-southeast-2": endpoint{ - Protocols: []string{"https"}, - }, - "ca-central-1": endpoint{ - Protocols: []string{"https"}, - }, - "eu-central-1": endpoint{ - Protocols: []string{"https"}, - }, - "eu-west-1": endpoint{ - Protocols: []string{"https"}, - }, - "eu-west-2": endpoint{ - Protocols: []string{"https"}, - }, - "sa-east-1": endpoint{ - Protocols: []string{"https"}, - }, - "us-east-1": endpoint{ - Protocols: []string{"https"}, - }, - "us-east-2": endpoint{ - Protocols: []string{"https"}, - }, - "us-west-1": endpoint{ - Protocols: []string{"https"}, - }, - "us-west-2": endpoint{ - Protocols: []string{"https"}, - }, - }, - }, - "servicecatalog": service{ + "kms": service{ Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, @@ -1945,9 +2323,11 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, @@ -1955,28 +2335,28 @@ var awsPartition = partition{ "us-west-2": endpoint{}, }, }, - "servicediscovery": service{ + "lakeformation": service{ Endpoints: endpoints{ - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "shield": service{ - IsRegionalized: boxedFalse, - Defaults: endpoint{ - SSLCommonName: "Shield.us-east-1.amazonaws.com", - Protocols: []string{"https"}, - }, - Endpoints: endpoints{ - "us-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, }, }, - "sms": service{ + "lambda": service{ Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, @@ -1984,27 +2364,34 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, "us-west-1": endpoint{}, "us-west-2": endpoint{}, }, }, - "snowball": service{ + "license-manager": service{ Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, @@ -2012,10 +2399,8 @@ var awsPartition = partition{ "us-west-2": endpoint{}, }, }, - "sns": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - }, + "lightsail": service{ + Endpoints: endpoints{ "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, @@ -2027,19 +2412,15 @@ var awsPartition = partition{ "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, - "us-west-1": endpoint{}, "us-west-2": endpoint{}, }, }, - "sqs": service{ - Defaults: endpoint{ - SSLCommonName: "{region}.queue.{dnsSuffix}", - Protocols: []string{"http", "https"}, - }, + "logs": service{ + Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, @@ -2047,28 +2428,48 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, "sa-east-1": endpoint{}, - "us-east-1": endpoint{ - SSLCommonName: "queue.{dnsSuffix}", - }, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, }, }, - "ssm": service{ + "machinelearning": service{ + + Endpoints: endpoints{ + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + }, + }, + "managedblockchain": service{ + + Endpoints: endpoints{ + "us-east-1": endpoint{}, + }, + }, + "marketplacecommerceanalytics": service{ Endpoints: endpoints{ + "us-east-1": endpoint{}, + }, + }, + "mediaconnect": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, @@ -2079,22 +2480,27 @@ var awsPartition = partition{ "us-west-2": endpoint{}, }, }, - "states": service{ + "mediaconvert": service{ Endpoints: endpoints{ "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, + "us-west-1": endpoint{}, "us-west-2": endpoint{}, }, }, - "storagegateway": service{ + "medialive": service{ Endpoints: endpoints{ "ap-northeast-1": endpoint{}, @@ -2102,115 +2508,107 @@ var awsPartition = partition{ "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, - "us-west-1": endpoint{}, "us-west-2": endpoint{}, }, }, - "streams.dynamodb": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - CredentialScope: credentialScope{ - Service: "dynamodb", - }, - }, + "mediapackage": service{ + Endpoints: endpoints{ "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, - "local": endpoint{ - Hostname: "localhost:8000", - Protocols: []string{"http"}, - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, }, }, - "sts": service{ - PartitionEndpoint: "aws-global", + "mediastore": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "metering.marketplace": service{ Defaults: endpoint{ - Hostname: "sts.amazonaws.com", CredentialScope: credentialScope{ - Region: "us-east-1", + Service: "aws-marketplace", }, }, Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{ - Hostname: "sts.ap-northeast-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "ap-northeast-2", - }, - }, + "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, "ap-southeast-1": endpoint{}, "ap-southeast-2": endpoint{}, - "aws-global": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, "sa-east-1": endpoint{}, "us-east-1": endpoint{}, - "us-east-1-fips": endpoint{ - Hostname: "sts-fips.us-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - "us-east-2": endpoint{}, - "us-east-2-fips": endpoint{ - Hostname: "sts-fips.us-east-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-2", - }, - }, - "us-west-1": endpoint{}, - "us-west-1-fips": endpoint{ - Hostname: "sts-fips.us-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-1", - }, - }, - "us-west-2": endpoint{}, - "us-west-2-fips": endpoint{ - Hostname: "sts-fips.us-west-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-2", - }, - }, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, }, }, - "support": service{ + "mgh": service{ Endpoints: endpoints{ - "us-east-1": endpoint{}, + "eu-central-1": endpoint{}, + "us-west-2": endpoint{}, }, }, - "swf": service{ + "mobileanalytics": service{ Endpoints: endpoints{ + "us-east-1": endpoint{}, + }, + }, + "models.lex": service{ + Defaults: endpoint{ + CredentialScope: credentialScope{ + Service: "lex", + }, + }, + Endpoints: endpoints{ + "ap-southeast-2": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "monitoring": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + }, + Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, @@ -2218,9 +2616,11 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, "sa-east-1": endpoint{}, "us-east-1": endpoint{}, "us-east-2": endpoint{}, @@ -2228,9 +2628,10 @@ var awsPartition = partition{ "us-west-2": endpoint{}, }, }, - "tagging": service{ + "mq": service{ Endpoints: endpoints{ + "ap-east-1": endpoint{}, "ap-northeast-1": endpoint{}, "ap-northeast-2": endpoint{}, "ap-south-1": endpoint{}, @@ -2238,121 +2639,3202 @@ var awsPartition = partition{ "ap-southeast-2": endpoint{}, "ca-central-1": endpoint{}, "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, "eu-west-1": endpoint{}, "eu-west-2": endpoint{}, "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, + "fips-us-east-1": endpoint{ + Hostname: "mq-fips.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "fips-us-east-2": endpoint{ + Hostname: "mq-fips.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "fips-us-west-1": endpoint{ + Hostname: "mq-fips.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "fips-us-west-2": endpoint{ + Hostname: "mq-fips.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, }, }, - "translate": service{ - Defaults: endpoint{ - Protocols: []string{"https"}, + "mturk-requester": service{ + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "sandbox": endpoint{ + Hostname: "mturk-requester-sandbox.us-east-1.amazonaws.com", + }, + "us-east-1": endpoint{}, + }, + }, + "neptune": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{ + Hostname: "rds.ap-northeast-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-northeast-1", + }, + }, + "ap-northeast-2": endpoint{ + Hostname: "rds.ap-northeast-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-northeast-2", + }, + }, + "ap-south-1": endpoint{ + Hostname: "rds.ap-south-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-south-1", + }, + }, + "ap-southeast-1": endpoint{ + Hostname: "rds.ap-southeast-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-southeast-1", + }, + }, + "ap-southeast-2": endpoint{ + Hostname: "rds.ap-southeast-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-southeast-2", + }, + }, + "ca-central-1": endpoint{ + Hostname: "rds.ca-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ca-central-1", + }, + }, + "eu-central-1": endpoint{ + Hostname: "rds.eu-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-central-1", + }, + }, + "eu-north-1": endpoint{ + Hostname: "rds.eu-north-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-north-1", + }, + }, + "eu-west-1": endpoint{ + Hostname: "rds.eu-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-1", + }, + }, + "eu-west-2": endpoint{ + Hostname: "rds.eu-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-2", + }, + }, + "me-south-1": endpoint{ + Hostname: "rds.me-south-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "me-south-1", + }, + }, + "us-east-1": endpoint{ + Hostname: "rds.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{ + Hostname: "rds.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-2": endpoint{ + Hostname: "rds.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + }, + }, + "oidc": service{ + + Endpoints: endpoints{ + "ap-southeast-1": endpoint{ + Hostname: "oidc.ap-southeast-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-southeast-1", + }, + }, + "ap-southeast-2": endpoint{ + Hostname: "oidc.ap-southeast-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-southeast-2", + }, + }, + "ca-central-1": endpoint{ + Hostname: "oidc.ca-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ca-central-1", + }, + }, + "eu-central-1": endpoint{ + Hostname: "oidc.eu-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-central-1", + }, + }, + "eu-west-1": endpoint{ + Hostname: "oidc.eu-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-1", + }, + }, + "eu-west-2": endpoint{ + Hostname: "oidc.eu-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-2", + }, + }, + "us-east-1": endpoint{ + Hostname: "oidc.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{ + Hostname: "oidc.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-2": endpoint{ + Hostname: "oidc.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + }, + }, + "opsworks": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "opsworks-cm": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "organizations": service{ + PartitionEndpoint: "aws-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-global": endpoint{ + Hostname: "organizations.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + }, + }, + "outposts": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "pinpoint": service{ + Defaults: endpoint{ + CredentialScope: credentialScope{ + Service: "mobiletargeting", + }, + }, + Endpoints: endpoints{ + "ap-south-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "fips-us-east-1": endpoint{ + Hostname: "pinpoint-fips.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "fips-us-west-2": endpoint{ + Hostname: "pinpoint-fips.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + "us-east-1": endpoint{ + Hostname: "pinpoint.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-west-2": endpoint{ + Hostname: "pinpoint.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + }, + }, + "polly": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "portal.sso": service{ + + Endpoints: endpoints{ + "ap-southeast-1": endpoint{ + Hostname: "portal.sso.ap-southeast-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-southeast-1", + }, + }, + "ap-southeast-2": endpoint{ + Hostname: "portal.sso.ap-southeast-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-southeast-2", + }, + }, + "ca-central-1": endpoint{ + Hostname: "portal.sso.ca-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ca-central-1", + }, + }, + "eu-central-1": endpoint{ + Hostname: "portal.sso.eu-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-central-1", + }, + }, + "eu-west-1": endpoint{ + Hostname: "portal.sso.eu-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-1", + }, + }, + "eu-west-2": endpoint{ + Hostname: "portal.sso.eu-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-2", + }, + }, + "us-east-1": endpoint{ + Hostname: "portal.sso.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{ + Hostname: "portal.sso.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-2": endpoint{ + Hostname: "portal.sso.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + }, + }, + "projects.iot1click": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "qldb": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "ram": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "rds": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{ + SSLCommonName: "{service}.{dnsSuffix}", + }, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "redshift": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "rekognition": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "resource-groups": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "fips-us-east-1": endpoint{ + Hostname: "resource-groups-fips.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "fips-us-east-2": endpoint{ + Hostname: "resource-groups-fips.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "fips-us-west-1": endpoint{ + Hostname: "resource-groups-fips.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "fips-us-west-2": endpoint{ + Hostname: "resource-groups-fips.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "robomaker": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "route53": service{ + PartitionEndpoint: "aws-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-global": endpoint{ + Hostname: "route53.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + }, + }, + "route53domains": service{ + + Endpoints: endpoints{ + "us-east-1": endpoint{}, + }, + }, + "route53resolver": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "runtime.lex": service{ + Defaults: endpoint{ + CredentialScope: credentialScope{ + Service: "lex", + }, + }, + Endpoints: endpoints{ + "ap-southeast-2": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "runtime.sagemaker": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-1-fips": endpoint{ + Hostname: "runtime-fips.sagemaker.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{}, + "us-east-2-fips": endpoint{ + Hostname: "runtime-fips.sagemaker.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-1": endpoint{}, + "us-west-1-fips": endpoint{ + Hostname: "runtime-fips.sagemaker.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "us-west-2": endpoint{}, + "us-west-2-fips": endpoint{ + Hostname: "runtime-fips.sagemaker.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + }, + }, + "s3": service{ + PartitionEndpoint: "aws-global", + IsRegionalized: boxedTrue, + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + SignatureVersions: []string{"s3v4"}, + + HasDualStack: boxedTrue, + DualStackHostname: "{service}.dualstack.{region}.{dnsSuffix}", + }, + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{ + Hostname: "s3.ap-northeast-1.amazonaws.com", + SignatureVersions: []string{"s3", "s3v4"}, + }, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{ + Hostname: "s3.ap-southeast-1.amazonaws.com", + SignatureVersions: []string{"s3", "s3v4"}, + }, + "ap-southeast-2": endpoint{ + Hostname: "s3.ap-southeast-2.amazonaws.com", + SignatureVersions: []string{"s3", "s3v4"}, + }, + "aws-global": endpoint{ + Hostname: "s3.amazonaws.com", + SignatureVersions: []string{"s3", "s3v4"}, + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{ + Hostname: "s3.eu-west-1.amazonaws.com", + SignatureVersions: []string{"s3", "s3v4"}, + }, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "s3-external-1": endpoint{ + Hostname: "s3-external-1.amazonaws.com", + SignatureVersions: []string{"s3", "s3v4"}, + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "sa-east-1": endpoint{ + Hostname: "s3.sa-east-1.amazonaws.com", + SignatureVersions: []string{"s3", "s3v4"}, + }, + "us-east-1": endpoint{ + Hostname: "s3.us-east-1.amazonaws.com", + SignatureVersions: []string{"s3", "s3v4"}, + }, + "us-east-2": endpoint{}, + "us-west-1": endpoint{ + Hostname: "s3.us-west-1.amazonaws.com", + SignatureVersions: []string{"s3", "s3v4"}, + }, + "us-west-2": endpoint{ + Hostname: "s3.us-west-2.amazonaws.com", + SignatureVersions: []string{"s3", "s3v4"}, + }, + }, + }, + "s3-control": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + SignatureVersions: []string{"s3v4"}, + + HasDualStack: boxedTrue, + DualStackHostname: "{service}.dualstack.{region}.{dnsSuffix}", + }, + Endpoints: endpoints{ + "ap-northeast-1": endpoint{ + Hostname: "s3-control.ap-northeast-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "ap-northeast-1", + }, + }, + "ap-northeast-2": endpoint{ + Hostname: "s3-control.ap-northeast-2.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "ap-northeast-2", + }, + }, + "ap-south-1": endpoint{ + Hostname: "s3-control.ap-south-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "ap-south-1", + }, + }, + "ap-southeast-1": endpoint{ + Hostname: "s3-control.ap-southeast-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "ap-southeast-1", + }, + }, + "ap-southeast-2": endpoint{ + Hostname: "s3-control.ap-southeast-2.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "ap-southeast-2", + }, + }, + "ca-central-1": endpoint{ + Hostname: "s3-control.ca-central-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "ca-central-1", + }, + }, + "eu-central-1": endpoint{ + Hostname: "s3-control.eu-central-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "eu-central-1", + }, + }, + "eu-north-1": endpoint{ + Hostname: "s3-control.eu-north-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "eu-north-1", + }, + }, + "eu-west-1": endpoint{ + Hostname: "s3-control.eu-west-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "eu-west-1", + }, + }, + "eu-west-2": endpoint{ + Hostname: "s3-control.eu-west-2.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "eu-west-2", + }, + }, + "eu-west-3": endpoint{ + Hostname: "s3-control.eu-west-3.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "eu-west-3", + }, + }, + "sa-east-1": endpoint{ + Hostname: "s3-control.sa-east-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "sa-east-1", + }, + }, + "us-east-1": endpoint{ + Hostname: "s3-control.us-east-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-1-fips": endpoint{ + Hostname: "s3-control-fips.us-east-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{ + Hostname: "s3-control.us-east-2.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-east-2-fips": endpoint{ + Hostname: "s3-control-fips.us-east-2.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-1": endpoint{ + Hostname: "s3-control.us-west-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "us-west-1-fips": endpoint{ + Hostname: "s3-control-fips.us-west-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "us-west-2": endpoint{ + Hostname: "s3-control.us-west-2.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + "us-west-2-fips": endpoint{ + Hostname: "s3-control-fips.us-west-2.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + }, + }, + "savingsplans": service{ + PartitionEndpoint: "aws-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-global": endpoint{ + Hostname: "savingsplans.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + }, + }, + "schemas": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "sdb": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + SignatureVersions: []string{"v2"}, + }, + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-west-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{ + Hostname: "sdb.amazonaws.com", + }, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "secretsmanager": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-1-fips": endpoint{ + Hostname: "secretsmanager-fips.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{}, + "us-east-2-fips": endpoint{ + Hostname: "secretsmanager-fips.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-1": endpoint{}, + "us-west-1-fips": endpoint{ + Hostname: "secretsmanager-fips.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "us-west-2": endpoint{}, + "us-west-2-fips": endpoint{ + Hostname: "secretsmanager-fips.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + }, + }, + "securityhub": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "serverlessrepo": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "ap-east-1": endpoint{ + Protocols: []string{"https"}, + }, + "ap-northeast-1": endpoint{ + Protocols: []string{"https"}, + }, + "ap-northeast-2": endpoint{ + Protocols: []string{"https"}, + }, + "ap-south-1": endpoint{ + Protocols: []string{"https"}, + }, + "ap-southeast-1": endpoint{ + Protocols: []string{"https"}, + }, + "ap-southeast-2": endpoint{ + Protocols: []string{"https"}, + }, + "ca-central-1": endpoint{ + Protocols: []string{"https"}, + }, + "eu-central-1": endpoint{ + Protocols: []string{"https"}, + }, + "eu-north-1": endpoint{ + Protocols: []string{"https"}, + }, + "eu-west-1": endpoint{ + Protocols: []string{"https"}, + }, + "eu-west-2": endpoint{ + Protocols: []string{"https"}, + }, + "eu-west-3": endpoint{ + Protocols: []string{"https"}, + }, + "me-south-1": endpoint{ + Protocols: []string{"https"}, + }, + "sa-east-1": endpoint{ + Protocols: []string{"https"}, + }, + "us-east-1": endpoint{ + Protocols: []string{"https"}, + }, + "us-east-2": endpoint{ + Protocols: []string{"https"}, + }, + "us-west-1": endpoint{ + Protocols: []string{"https"}, + }, + "us-west-2": endpoint{ + Protocols: []string{"https"}, + }, + }, + }, + "servicecatalog": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-1-fips": endpoint{ + Hostname: "servicecatalog-fips.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{}, + "us-east-2-fips": endpoint{ + Hostname: "servicecatalog-fips.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-1": endpoint{}, + "us-west-1-fips": endpoint{ + Hostname: "servicecatalog-fips.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "us-west-2": endpoint{}, + "us-west-2-fips": endpoint{ + Hostname: "servicecatalog-fips.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + }, + }, + "servicediscovery": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "session.qldb": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "shield": service{ + IsRegionalized: boxedFalse, + Defaults: endpoint{ + SSLCommonName: "shield.us-east-1.amazonaws.com", + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "us-east-1": endpoint{}, + }, + }, + "sms": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "snowball": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "sns": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + }, + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "sqs": service{ + Defaults: endpoint{ + SSLCommonName: "{region}.queue.{dnsSuffix}", + Protocols: []string{"http", "https"}, + }, + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "fips-us-east-1": endpoint{ + Hostname: "sqs-fips.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "fips-us-east-2": endpoint{ + Hostname: "sqs-fips.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "fips-us-west-1": endpoint{ + Hostname: "sqs-fips.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "fips-us-west-2": endpoint{ + Hostname: "sqs-fips.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{ + SSLCommonName: "queue.{dnsSuffix}", + }, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "ssm": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "states": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "storagegateway": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "streams.dynamodb": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + CredentialScope: credentialScope{ + Service: "dynamodb", + }, + }, + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "ca-central-1-fips": endpoint{ + Hostname: "dynamodb-fips.ca-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ca-central-1", + }, + }, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "local": endpoint{ + Hostname: "localhost:8000", + Protocols: []string{"http"}, + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-1-fips": endpoint{ + Hostname: "dynamodb-fips.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{}, + "us-east-2-fips": endpoint{ + Hostname: "dynamodb-fips.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-1": endpoint{}, + "us-west-1-fips": endpoint{ + Hostname: "dynamodb-fips.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "us-west-2": endpoint{}, + "us-west-2-fips": endpoint{ + Hostname: "dynamodb-fips.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + }, + }, + "sts": service{ + PartitionEndpoint: "aws-global", + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "aws-global": endpoint{ + Hostname: "sts.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-1-fips": endpoint{ + Hostname: "sts-fips.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{}, + "us-east-2-fips": endpoint{ + Hostname: "sts-fips.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-1": endpoint{}, + "us-west-1-fips": endpoint{ + Hostname: "sts-fips.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "us-west-2": endpoint{}, + "us-west-2-fips": endpoint{ + Hostname: "sts-fips.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + }, + }, + "support": service{ + PartitionEndpoint: "aws-global", + + Endpoints: endpoints{ + "aws-global": endpoint{ + Hostname: "support.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + }, + }, + "swf": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "tagging": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "transcribe": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "transcribestreaming": service{ + + Endpoints: endpoints{ + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "transfer": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "translate": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "us-east-1": endpoint{}, + "us-east-1-fips": endpoint{ + Hostname: "translate-fips.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{}, + "us-east-2-fips": endpoint{ + Hostname: "translate-fips.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + "us-west-2-fips": endpoint{ + Hostname: "translate-fips.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + }, + }, + "waf": service{ + PartitionEndpoint: "aws-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-global": endpoint{ + Hostname: "waf.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + }, + }, + "waf-regional": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "workdocs": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "workmail": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "workspaces": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "xray": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "me-south-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + }, +} + +// AwsCnPartition returns the Resolver for AWS China. +func AwsCnPartition() Partition { + return awscnPartition.Partition() +} + +var awscnPartition = partition{ + ID: "aws-cn", + Name: "AWS China", + DNSSuffix: "amazonaws.com.cn", + RegionRegex: regionRegex{ + Regexp: func() *regexp.Regexp { + reg, _ := regexp.Compile("^cn\\-\\w+\\-\\d+$") + return reg + }(), + }, + Defaults: endpoint{ + Hostname: "{service}.{region}.{dnsSuffix}", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + Regions: regions{ + "cn-north-1": region{ + Description: "China (Beijing)", + }, + "cn-northwest-1": region{ + Description: "China (Ningxia)", + }, + }, + Services: services{ + "api.ecr": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{ + Hostname: "api.ecr.cn-north-1.amazonaws.com.cn", + CredentialScope: credentialScope{ + Region: "cn-north-1", + }, + }, + "cn-northwest-1": endpoint{ + Hostname: "api.ecr.cn-northwest-1.amazonaws.com.cn", + CredentialScope: credentialScope{ + Region: "cn-northwest-1", + }, + }, + }, + }, + "apigateway": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "application-autoscaling": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "appsync": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + }, + }, + "athena": service{ + + Endpoints: endpoints{ + "cn-northwest-1": endpoint{}, + }, + }, + "autoscaling": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "backup": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "batch": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "cloudformation": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "cloudfront": service{ + PartitionEndpoint: "aws-cn-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-cn-global": endpoint{ + Hostname: "cloudfront.cn-northwest-1.amazonaws.com.cn", + Protocols: []string{"http", "https"}, + CredentialScope: credentialScope{ + Region: "cn-northwest-1", + }, + }, + }, + }, + "cloudtrail": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "codebuild": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "codedeploy": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "cognito-identity": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + }, + }, + "config": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "dax": service{ + + Endpoints: endpoints{ + "cn-northwest-1": endpoint{}, + }, + }, + "directconnect": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "dms": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "ds": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "dynamodb": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "ec2": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "ec2metadata": service{ + PartitionEndpoint: "aws-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-global": endpoint{ + Hostname: "169.254.169.254/latest", + Protocols: []string{"http"}, + }, + }, + }, + "ecs": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "elasticache": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "elasticbeanstalk": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "elasticfilesystem": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "elasticloadbalancing": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "elasticmapreduce": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "es": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "events": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "firehose": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "gamelift": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + }, + }, + "glacier": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "glue": service{ + + Endpoints: endpoints{ + "cn-northwest-1": endpoint{}, + }, + }, + "greengrass": service{ + IsRegionalized: boxedTrue, + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + }, + }, + "health": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "iam": service{ + PartitionEndpoint: "aws-cn-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-cn-global": endpoint{ + Hostname: "iam.cn-north-1.amazonaws.com.cn", + CredentialScope: credentialScope{ + Region: "cn-north-1", + }, + }, + }, + }, + "iot": service{ + Defaults: endpoint{ + CredentialScope: credentialScope{ + Service: "execute-api", + }, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "kinesis": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "kms": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "lambda": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "license-manager": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "logs": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "mediaconvert": service{ + + Endpoints: endpoints{ + "cn-northwest-1": endpoint{ + Hostname: "subscribe.mediaconvert.cn-northwest-1.amazonaws.com.cn", + CredentialScope: credentialScope{ + Region: "cn-northwest-1", + }, + }, + }, + }, + "monitoring": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "neptune": service{ + + Endpoints: endpoints{ + "cn-northwest-1": endpoint{ + Hostname: "rds.cn-northwest-1.amazonaws.com.cn", + CredentialScope: credentialScope{ + Region: "cn-northwest-1", + }, + }, + }, + }, + "polly": service{ + + Endpoints: endpoints{ + "cn-northwest-1": endpoint{}, + }, + }, + "rds": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "redshift": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "s3": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + SignatureVersions: []string{"s3v4"}, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "s3-control": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + SignatureVersions: []string{"s3v4"}, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{ + Hostname: "s3-control.cn-north-1.amazonaws.com.cn", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "cn-north-1", + }, + }, + "cn-northwest-1": endpoint{ + Hostname: "s3-control.cn-northwest-1.amazonaws.com.cn", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "cn-northwest-1", + }, + }, + }, + }, + "secretsmanager": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "serverlessrepo": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{ + Protocols: []string{"https"}, + }, + "cn-northwest-1": endpoint{ + Protocols: []string{"https"}, + }, + }, + }, + "sms": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "snowball": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + }, + }, + "sns": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "sqs": service{ + Defaults: endpoint{ + SSLCommonName: "{region}.queue.{dnsSuffix}", + Protocols: []string{"http", "https"}, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "ssm": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "states": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "storagegateway": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "streams.dynamodb": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + CredentialScope: credentialScope{ + Service: "dynamodb", + }, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "sts": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "support": service{ + PartitionEndpoint: "aws-cn-global", + + Endpoints: endpoints{ + "aws-cn-global": endpoint{ + Hostname: "support.cn-north-1.amazonaws.com.cn", + CredentialScope: credentialScope{ + Region: "cn-north-1", + }, + }, + }, + }, + "swf": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "tagging": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "transcribe": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{ + Hostname: "cn.transcribe.cn-north-1.amazonaws.com.cn", + CredentialScope: credentialScope{ + Region: "cn-north-1", + }, + }, + "cn-northwest-1": endpoint{ + Hostname: "cn.transcribe.cn-northwest-1.amazonaws.com.cn", + CredentialScope: credentialScope{ + Region: "cn-northwest-1", + }, + }, + }, + }, + "workspaces": service{ + + Endpoints: endpoints{ + "cn-northwest-1": endpoint{}, + }, + }, + "xray": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + }, +} + +// AwsUsGovPartition returns the Resolver for AWS GovCloud (US). +func AwsUsGovPartition() Partition { + return awsusgovPartition.Partition() +} + +var awsusgovPartition = partition{ + ID: "aws-us-gov", + Name: "AWS GovCloud (US)", + DNSSuffix: "amazonaws.com", + RegionRegex: regionRegex{ + Regexp: func() *regexp.Regexp { + reg, _ := regexp.Compile("^us\\-gov\\-\\w+\\-\\d+$") + return reg + }(), + }, + Defaults: endpoint{ + Hostname: "{service}.{region}.{dnsSuffix}", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + Regions: regions{ + "us-gov-east-1": region{ + Description: "AWS GovCloud (US-East)", + }, + "us-gov-west-1": region{ + Description: "AWS GovCloud (US)", + }, + }, + Services: services{ + "access-analyzer": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "acm": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "acm-pca": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "api.ecr": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{ + Hostname: "api.ecr.us-gov-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-east-1", + }, + }, + "us-gov-west-1": endpoint{ + Hostname: "api.ecr.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + }, + }, + "api.sagemaker": service{ + + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "apigateway": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "application-autoscaling": service{ + Defaults: endpoint{ + Hostname: "autoscaling.{region}.amazonaws.com", + Protocols: []string{"http", "https"}, + CredentialScope: credentialScope{ + Service: "application-autoscaling", + }, + }, + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "appstream2": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + CredentialScope: credentialScope{ + Service: "appstream", + }, + }, + Endpoints: endpoints{ + "fips": endpoint{ + Hostname: "appstream2-fips.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + "us-gov-west-1": endpoint{}, + }, + }, + "athena": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "autoscaling": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{ + Protocols: []string{"http", "https"}, + }, + }, + }, + "autoscaling-plans": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + }, + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "batch": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "clouddirectory": service{ + + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "cloudformation": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "cloudhsm": service{ + + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "cloudhsmv2": service{ + Defaults: endpoint{ + CredentialScope: credentialScope{ + Service: "cloudhsm", + }, + }, + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "cloudtrail": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "codebuild": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "codecommit": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "codedeploy": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-east-1-fips": endpoint{ + Hostname: "codedeploy-fips.us-gov-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-east-1", + }, + }, + "us-gov-west-1": endpoint{}, + "us-gov-west-1-fips": endpoint{ + Hostname: "codedeploy-fips.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + }, + }, + "comprehend": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "comprehendmedical": service{ + + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "config": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "datasync": service{ + + Endpoints: endpoints{ + "fips-us-gov-west-1": endpoint{ + Hostname: "datasync-fips.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "directconnect": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "dms": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "ds": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "dynamodb": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-east-1-fips": endpoint{ + Hostname: "dynamodb.us-gov-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-east-1", + }, + }, + "us-gov-west-1": endpoint{}, + "us-gov-west-1-fips": endpoint{ + Hostname: "dynamodb.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + }, + }, + "ec2": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "ec2metadata": service{ + PartitionEndpoint: "aws-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-global": endpoint{ + Hostname: "169.254.169.254/latest", + Protocols: []string{"http"}, + }, + }, + }, + "ecs": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "elasticache": service{ + + Endpoints: endpoints{ + "fips": endpoint{ + Hostname: "elasticache-fips.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "elasticbeanstalk": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "elasticfilesystem": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "elasticloadbalancing": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{ + Protocols: []string{"http", "https"}, + }, + }, + }, + "elasticmapreduce": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{ + Protocols: []string{"https"}, + }, + }, + }, + "es": service{ + + Endpoints: endpoints{ + "fips": endpoint{ + Hostname: "es-fips.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "events": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "firehose": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "glacier": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{ + Protocols: []string{"http", "https"}, + }, + }, + }, + "glue": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "greengrass": service{ + IsRegionalized: boxedTrue, + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "guardduty": service{ + IsRegionalized: boxedTrue, + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "health": service{ + + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "iam": service{ + PartitionEndpoint: "aws-us-gov-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-us-gov-global": endpoint{ + Hostname: "iam.us-gov.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + }, + }, + "inspector": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "iot": service{ + Defaults: endpoint{ + CredentialScope: credentialScope{ + Service: "execute-api", + }, + }, + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "kinesis": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "kms": service{ + + Endpoints: endpoints{ + "ProdFips": endpoint{ + Hostname: "kms-fips.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "lambda": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "license-manager": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "logs": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "mediaconvert": service{ + + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "metering.marketplace": service{ + Defaults: endpoint{ + CredentialScope: credentialScope{ + Service: "aws-marketplace", + }, + }, + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "monitoring": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "neptune": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{ + Hostname: "rds.us-gov-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-east-1", + }, + }, + "us-gov-west-1": endpoint{ + Hostname: "rds.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + }, + }, + "organizations": service{ + PartitionEndpoint: "aws-us-gov-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-us-gov-global": endpoint{ + Hostname: "organizations.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + }, + }, + "polly": service{ + + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "ram": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "rds": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "redshift": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "rekognition": service{ + + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "resource-groups": service{ + + Endpoints: endpoints{ + "fips-us-gov-east-1": endpoint{ + Hostname: "resource-groups.us-gov-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-east-1", + }, + }, + "fips-us-gov-west-1": endpoint{ + Hostname: "resource-groups.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "route53": service{ + PartitionEndpoint: "aws-us-gov-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-us-gov-global": endpoint{ + Hostname: "route53.us-gov.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + }, + }, + "route53resolver": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "runtime.sagemaker": service{ + + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "s3": service{ + Defaults: endpoint{ + SignatureVersions: []string{"s3", "s3v4"}, + }, + Endpoints: endpoints{ + "fips-us-gov-west-1": endpoint{ + Hostname: "s3-fips-us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + "us-gov-east-1": endpoint{ + Hostname: "s3.us-gov-east-1.amazonaws.com", + Protocols: []string{"http", "https"}, + }, + "us-gov-west-1": endpoint{ + Hostname: "s3.us-gov-west-1.amazonaws.com", + Protocols: []string{"http", "https"}, + }, + }, + }, + "s3-control": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + SignatureVersions: []string{"s3v4"}, + }, + Endpoints: endpoints{ + "us-gov-east-1": endpoint{ + Hostname: "s3-control.us-gov-east-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "us-gov-east-1", + }, + }, + "us-gov-east-1-fips": endpoint{ + Hostname: "s3-control-fips.us-gov-east-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "us-gov-east-1", + }, + }, + "us-gov-west-1": endpoint{ + Hostname: "s3-control.us-gov-west-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + "us-gov-west-1-fips": endpoint{ + Hostname: "s3-control-fips.us-gov-west-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + }, + }, + "secretsmanager": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-east-1-fips": endpoint{ + Hostname: "secretsmanager-fips.us-gov-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-east-1", + }, + }, + "us-gov-west-1": endpoint{}, + "us-gov-west-1-fips": endpoint{ + Hostname: "secretsmanager-fips.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + }, + }, + "serverlessrepo": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "us-gov-east-1": endpoint{ + Protocols: []string{"https"}, + }, + "us-gov-west-1": endpoint{ + Protocols: []string{"https"}, + }, + }, + }, + "servicecatalog": service{ + + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + "us-gov-west-1-fips": endpoint{ + Hostname: "servicecatalog-fips.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + }, + }, + "sms": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "snowball": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "sns": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{ + Protocols: []string{"http", "https"}, + }, + }, + }, + "sqs": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{ + SSLCommonName: "{region}.queue.{dnsSuffix}", + Protocols: []string{"http", "https"}, + }, + }, + }, + "ssm": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "states": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "storagegateway": service{ + + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "streams.dynamodb": service{ + Defaults: endpoint{ + CredentialScope: credentialScope{ + Service: "dynamodb", + }, + }, + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-east-1-fips": endpoint{ + Hostname: "dynamodb.us-gov-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-east-1", + }, + }, + "us-gov-west-1": endpoint{}, + "us-gov-west-1-fips": endpoint{ + Hostname: "dynamodb.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, }, + }, + "sts": service{ + Endpoints: endpoints{ - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-2": endpoint{}, + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, }, }, - "waf": service{ - PartitionEndpoint: "aws-global", - IsRegionalized: boxedFalse, + "support": service{ + PartitionEndpoint: "aws-us-gov-global", Endpoints: endpoints{ - "aws-global": endpoint{ - Hostname: "waf.amazonaws.com", + "aws-us-gov-global": endpoint{ + Hostname: "support.us-gov-west-1.amazonaws.com", CredentialScope: credentialScope{ - Region: "us-east-1", + Region: "us-gov-west-1", }, }, }, }, - "waf-regional": service{ + "swf": service{ Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, }, }, - "workdocs": service{ + "tagging": service{ Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-west-2": endpoint{}, + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, }, }, - "workmail": service{ + "transcribe": service{ Defaults: endpoint{ Protocols: []string{"https"}, }, Endpoints: endpoints{ - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-west-2": endpoint{}, + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, }, }, - "workspaces": service{ + "translate": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + "us-gov-west-1-fips": endpoint{ + Hostname: "translate-fips.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + }, + }, + "waf-regional": service{ Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-west-2": endpoint{}, + "us-gov-west-1": endpoint{}, }, }, - "xray": service{ + "workspaces": service{ Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, + "us-gov-west-1": endpoint{}, }, }, }, } -// AwsCnPartition returns the Resolver for AWS China. -func AwsCnPartition() Partition { - return awscnPartition.Partition() +// AwsIsoPartition returns the Resolver for AWS ISO (US). +func AwsIsoPartition() Partition { + return awsisoPartition.Partition() } -var awscnPartition = partition{ - ID: "aws-cn", - Name: "AWS China", - DNSSuffix: "amazonaws.com.cn", +var awsisoPartition = partition{ + ID: "aws-iso", + Name: "AWS ISO (US)", + DNSSuffix: "c2s.ic.gov", RegionRegex: regionRegex{ Regexp: func() *regexp.Regexp { - reg, _ := regexp.Compile("^cn\\-\\w+\\-\\d+$") + reg, _ := regexp.Compile("^us\\-iso\\-\\w+\\-\\d+$") return reg }(), }, @@ -2362,99 +5844,110 @@ var awscnPartition = partition{ SignatureVersions: []string{"v4"}, }, Regions: regions{ - "cn-north-1": region{ - Description: "China (Beijing)", - }, - "cn-northwest-1": region{ - Description: "China (Ningxia)", + "us-iso-east-1": region{ + Description: "US ISO East", }, }, Services: services{ + "api.ecr": service{ + + Endpoints: endpoints{ + "us-iso-east-1": endpoint{ + Hostname: "api.ecr.us-iso-east-1.c2s.ic.gov", + CredentialScope: credentialScope{ + Region: "us-iso-east-1", + }, + }, + }, + }, + "api.sagemaker": service{ + + Endpoints: endpoints{ + "us-iso-east-1": endpoint{}, + }, + }, "apigateway": service{ Endpoints: endpoints{ - "cn-north-1": endpoint{}, + "us-iso-east-1": endpoint{}, }, }, "application-autoscaling": service{ Defaults: endpoint{ - Hostname: "autoscaling.{region}.amazonaws.com", Protocols: []string{"http", "https"}, - CredentialScope: credentialScope{ - Service: "application-autoscaling", - }, }, Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, + "us-iso-east-1": endpoint{}, }, }, "autoscaling": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - }, + Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, + "us-iso-east-1": endpoint{ + Protocols: []string{"http", "https"}, + }, }, }, "cloudformation": service{ Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, + "us-iso-east-1": endpoint{}, }, }, "cloudtrail": service{ Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, + "us-iso-east-1": endpoint{}, }, }, "codedeploy": service{ Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, + "us-iso-east-1": endpoint{}, }, }, - "cognito-identity": service{ + "config": service{ Endpoints: endpoints{ - "cn-north-1": endpoint{}, + "us-iso-east-1": endpoint{}, }, }, - "config": service{ + "datapipeline": service{ Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, + "us-iso-east-1": endpoint{}, }, }, "directconnect": service{ Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, + "us-iso-east-1": endpoint{}, }, }, - "dynamodb": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, + "dms": service{ + + Endpoints: endpoints{ + "us-iso-east-1": endpoint{}, }, + }, + "ds": service{ + Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, + "us-iso-east-1": endpoint{}, }, }, - "ec2": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, + "dynamodb": service{ + + Endpoints: endpoints{ + "us-iso-east-1": endpoint{ + Protocols: []string{"http", "https"}, + }, }, + }, + "ec2": service{ + Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, + "us-iso-east-1": endpoint{}, }, }, "ec2metadata": service{ @@ -2468,191 +5961,171 @@ var awscnPartition = partition{ }, }, }, - "ecr": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - }, - }, "ecs": service{ Endpoints: endpoints{ - "cn-north-1": endpoint{}, + "us-iso-east-1": endpoint{}, }, }, "elasticache": service{ Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "elasticbeanstalk": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, + "us-iso-east-1": endpoint{}, }, }, "elasticloadbalancing": service{ - Defaults: endpoint{ - Protocols: []string{"https"}, - }, + Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, + "us-iso-east-1": endpoint{ + Protocols: []string{"http", "https"}, + }, }, }, "elasticmapreduce": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - }, - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "es": service{ Endpoints: endpoints{ - "cn-northwest-1": endpoint{}, + "us-iso-east-1": endpoint{ + Protocols: []string{"https"}, + }, }, }, "events": service{ Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, + "us-iso-east-1": endpoint{}, }, }, "glacier": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, + + Endpoints: endpoints{ + "us-iso-east-1": endpoint{ + Protocols: []string{"http", "https"}, + }, }, + }, + "health": service{ + Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, + "us-iso-east-1": endpoint{}, }, }, "iam": service{ - PartitionEndpoint: "aws-cn-global", + PartitionEndpoint: "aws-iso-global", IsRegionalized: boxedFalse, Endpoints: endpoints{ - "aws-cn-global": endpoint{ - Hostname: "iam.cn-north-1.amazonaws.com.cn", + "aws-iso-global": endpoint{ + Hostname: "iam.us-iso-east-1.c2s.ic.gov", CredentialScope: credentialScope{ - Region: "cn-north-1", + Region: "us-iso-east-1", }, }, }, }, - "iot": service{ - Defaults: endpoint{ - CredentialScope: credentialScope{ - Service: "execute-api", - }, - }, + "kinesis": service{ + Endpoints: endpoints{ - "cn-north-1": endpoint{}, + "us-iso-east-1": endpoint{}, }, }, - "kinesis": service{ + "kms": service{ Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, + "ProdFips": endpoint{ + Hostname: "kms-fips.us-iso-east-1.c2s.ic.gov", + CredentialScope: credentialScope{ + Region: "us-iso-east-1", + }, + }, + "us-iso-east-1": endpoint{}, }, }, "lambda": service{ Endpoints: endpoints{ - "cn-north-1": endpoint{}, + "us-iso-east-1": endpoint{}, }, }, "logs": service{ Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, + "us-iso-east-1": endpoint{}, }, }, "monitoring": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - }, + Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, + "us-iso-east-1": endpoint{}, }, }, "rds": service{ Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, + "us-iso-east-1": endpoint{}, + }, + }, + "redshift": service{ + + Endpoints: endpoints{ + "us-iso-east-1": endpoint{}, + }, + }, + "route53": service{ + PartitionEndpoint: "aws-iso-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-iso-global": endpoint{ + Hostname: "route53.c2s.ic.gov", + CredentialScope: credentialScope{ + Region: "us-iso-east-1", + }, + }, }, }, - "redshift": service{ + "runtime.sagemaker": service{ Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, + "us-iso-east-1": endpoint{}, }, }, "s3": service{ Defaults: endpoint{ - Protocols: []string{"http", "https"}, SignatureVersions: []string{"s3v4"}, }, Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "sms": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, + "us-iso-east-1": endpoint{ + Protocols: []string{"http", "https"}, + SignatureVersions: []string{"s3v4"}, + }, }, }, "snowball": service{ Endpoints: endpoints{ - "cn-north-1": endpoint{}, + "us-iso-east-1": endpoint{}, }, }, "sns": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - }, + Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, + "us-iso-east-1": endpoint{ + Protocols: []string{"http", "https"}, + }, }, }, "sqs": service{ - Defaults: endpoint{ - SSLCommonName: "{region}.queue.{dnsSuffix}", - Protocols: []string{"http", "https"}, - }, - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "ssm": service{ Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, + "us-iso-east-1": endpoint{ + Protocols: []string{"http", "https"}, + }, }, }, - "storagegateway": service{ + "states": service{ Endpoints: endpoints{ - "cn-north-1": endpoint{}, + "us-iso-east-1": endpoint{}, }, }, "streams.dynamodb": service{ @@ -2663,46 +6136,56 @@ var awscnPartition = partition{ }, }, Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, + "us-iso-east-1": endpoint{ + Protocols: []string{"http", "https"}, + }, }, }, "sts": service{ Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, + "us-iso-east-1": endpoint{}, + }, + }, + "support": service{ + PartitionEndpoint: "aws-iso-global", + + Endpoints: endpoints{ + "aws-iso-global": endpoint{ + Hostname: "support.us-iso-east-1.c2s.ic.gov", + CredentialScope: credentialScope{ + Region: "us-iso-east-1", + }, + }, }, }, "swf": service{ Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, + "us-iso-east-1": endpoint{}, }, }, - "tagging": service{ + "workspaces": service{ Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, + "us-iso-east-1": endpoint{}, }, }, }, } -// AwsUsGovPartition returns the Resolver for AWS GovCloud (US). -func AwsUsGovPartition() Partition { - return awsusgovPartition.Partition() +// AwsIsoBPartition returns the Resolver for AWS ISOB (US). +func AwsIsoBPartition() Partition { + return awsisobPartition.Partition() } -var awsusgovPartition = partition{ - ID: "aws-us-gov", - Name: "AWS GovCloud (US)", - DNSSuffix: "amazonaws.com", +var awsisobPartition = partition{ + ID: "aws-iso-b", + Name: "AWS ISOB (US)", + DNSSuffix: "sc2s.sgov.gov", RegionRegex: regionRegex{ Regexp: func() *regexp.Regexp { - reg, _ := regexp.Compile("^us\\-gov\\-\\w+\\-\\d+$") + reg, _ := regexp.Compile("^us\\-isob\\-\\w+\\-\\d+$") return reg }(), }, @@ -2712,89 +6195,71 @@ var awsusgovPartition = partition{ SignatureVersions: []string{"v4"}, }, Regions: regions{ - "us-gov-west-1": region{ - Description: "AWS GovCloud (US)", + "us-isob-east-1": region{ + Description: "US ISOB East (Ohio)", }, }, Services: services{ - "acm": service{ - - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, + "application-autoscaling": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, }, - }, - "apigateway": service{ - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, + "us-isob-east-1": endpoint{}, }, }, "autoscaling": service{ - - Endpoints: endpoints{ - "us-gov-west-1": endpoint{ - Protocols: []string{"http", "https"}, - }, + Defaults: endpoint{ + Protocols: []string{"http", "https"}, }, - }, - "cloudformation": service{ - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, + "us-isob-east-1": endpoint{}, }, }, - "cloudhsm": service{ + "cloudformation": service{ Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, + "us-isob-east-1": endpoint{}, }, }, "cloudtrail": service{ Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, - }, - }, - "codedeploy": service{ - - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, + "us-isob-east-1": endpoint{}, }, }, "config": service{ Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, + "us-isob-east-1": endpoint{}, }, }, "directconnect": service{ Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, + "us-isob-east-1": endpoint{}, }, }, "dms": service{ Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, + "us-isob-east-1": endpoint{}, }, }, "dynamodb": service{ - + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + }, Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, - "us-gov-west-1-fips": endpoint{ - Hostname: "dynamodb.us-gov-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-gov-west-1", - }, - }, + "us-isob-east-1": endpoint{}, }, }, "ec2": service{ - + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + }, Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, + "us-isob-east-1": endpoint{}, }, }, "ec2metadata": service{ @@ -2808,75 +6273,53 @@ var awsusgovPartition = partition{ }, }, }, - "ecr": service{ - - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, - }, - }, - "ecs": service{ - - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, - }, - }, "elasticache": service{ Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, - }, - }, - "elasticbeanstalk": service{ - - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, + "us-isob-east-1": endpoint{}, }, }, "elasticloadbalancing": service{ Endpoints: endpoints{ - "us-gov-west-1": endpoint{ - Protocols: []string{"http", "https"}, + "us-isob-east-1": endpoint{ + Protocols: []string{"https"}, }, }, }, "elasticmapreduce": service{ Endpoints: endpoints{ - "us-gov-west-1": endpoint{ - Protocols: []string{"http", "https"}, - }, + "us-isob-east-1": endpoint{}, }, }, - "es": service{ + "events": service{ Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, + "us-isob-east-1": endpoint{}, }, }, - "events": service{ + "glacier": service{ Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, + "us-isob-east-1": endpoint{}, }, }, - "glacier": service{ + "health": service{ Endpoints: endpoints{ - "us-gov-west-1": endpoint{ - Protocols: []string{"http", "https"}, - }, + "us-isob-east-1": endpoint{}, }, }, "iam": service{ - PartitionEndpoint: "aws-us-gov-global", + PartitionEndpoint: "aws-iso-b-global", IsRegionalized: boxedFalse, Endpoints: endpoints{ - "aws-us-gov-global": endpoint{ - Hostname: "iam.us-gov.amazonaws.com", + "aws-iso-b-global": endpoint{ + Hostname: "iam.us-isob-east-1.sc2s.sgov.gov", CredentialScope: credentialScope{ - Region: "us-gov-west-1", + Region: "us-isob-east-1", }, }, }, @@ -2884,151 +6327,116 @@ var awsusgovPartition = partition{ "kinesis": service{ Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, + "us-isob-east-1": endpoint{}, }, }, "kms": service{ Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, - }, - }, - "lambda": service{ - - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, + "ProdFips": endpoint{ + Hostname: "kms-fips.us-isob-east-1.sc2s.sgov.gov", + CredentialScope: credentialScope{ + Region: "us-isob-east-1", + }, + }, + "us-isob-east-1": endpoint{}, }, }, "logs": service{ Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, - }, - }, - "metering.marketplace": service{ - Defaults: endpoint{ - CredentialScope: credentialScope{ - Service: "aws-marketplace", - }, - }, - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, + "us-isob-east-1": endpoint{}, }, }, "monitoring": service{ Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, - }, - }, - "polly": service{ - - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, + "us-isob-east-1": endpoint{}, }, }, "rds": service{ Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, + "us-isob-east-1": endpoint{}, }, }, "redshift": service{ Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, - }, - }, - "rekognition": service{ - - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, + "us-isob-east-1": endpoint{}, }, }, "s3": service{ Defaults: endpoint{ - SignatureVersions: []string{"s3", "s3v4"}, - }, - Endpoints: endpoints{ - "fips-us-gov-west-1": endpoint{ - Hostname: "s3-fips-us-gov-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-gov-west-1", - }, - }, - "us-gov-west-1": endpoint{ - Hostname: "s3.us-gov-west-1.amazonaws.com", - Protocols: []string{"http", "https"}, - }, + Protocols: []string{"http", "https"}, + SignatureVersions: []string{"s3v4"}, }, - }, - "sms": service{ - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, + "us-isob-east-1": endpoint{}, }, }, "snowball": service{ Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, + "us-isob-east-1": endpoint{}, }, }, "sns": service{ - + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + }, Endpoints: endpoints{ - "us-gov-west-1": endpoint{ - Protocols: []string{"http", "https"}, - }, + "us-isob-east-1": endpoint{}, }, }, "sqs": service{ - + Defaults: endpoint{ + SSLCommonName: "{region}.queue.{dnsSuffix}", + Protocols: []string{"http", "https"}, + }, Endpoints: endpoints{ - "us-gov-west-1": endpoint{ - SSLCommonName: "{region}.queue.{dnsSuffix}", - Protocols: []string{"http", "https"}, - }, + "us-isob-east-1": endpoint{}, }, }, - "ssm": service{ + "states": service{ Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, + "us-isob-east-1": endpoint{}, }, }, "streams.dynamodb": service{ Defaults: endpoint{ + Protocols: []string{"http", "https"}, CredentialScope: credentialScope{ Service: "dynamodb", }, }, Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, - "us-gov-west-1-fips": endpoint{ - Hostname: "dynamodb.us-gov-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-gov-west-1", - }, - }, + "us-isob-east-1": endpoint{}, }, }, "sts": service{ Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, + "us-isob-east-1": endpoint{}, }, }, - "swf": service{ + "support": service{ + PartitionEndpoint: "aws-iso-b-global", Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, + "aws-iso-b-global": endpoint{ + Hostname: "support.us-isob-east-1.sc2s.sgov.gov", + CredentialScope: credentialScope{ + Region: "us-isob-east-1", + }, + }, }, }, - "tagging": service{ + "swf": service{ Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, + "us-isob-east-1": endpoint{}, }, }, }, diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/dep_service_ids.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/dep_service_ids.go new file mode 100644 index 000000000..ca8fc828e --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/dep_service_ids.go @@ -0,0 +1,141 @@ +package endpoints + +// Service identifiers +// +// Deprecated: Use client package's EndpointsID value instead of these +// ServiceIDs. These IDs are not maintained, and are out of date. +const ( + A4bServiceID = "a4b" // A4b. + AcmServiceID = "acm" // Acm. + AcmPcaServiceID = "acm-pca" // AcmPca. + ApiMediatailorServiceID = "api.mediatailor" // ApiMediatailor. + ApiPricingServiceID = "api.pricing" // ApiPricing. + ApiSagemakerServiceID = "api.sagemaker" // ApiSagemaker. + ApigatewayServiceID = "apigateway" // Apigateway. + ApplicationAutoscalingServiceID = "application-autoscaling" // ApplicationAutoscaling. + Appstream2ServiceID = "appstream2" // Appstream2. + AppsyncServiceID = "appsync" // Appsync. + AthenaServiceID = "athena" // Athena. + AutoscalingServiceID = "autoscaling" // Autoscaling. + AutoscalingPlansServiceID = "autoscaling-plans" // AutoscalingPlans. + BatchServiceID = "batch" // Batch. + BudgetsServiceID = "budgets" // Budgets. + CeServiceID = "ce" // Ce. + ChimeServiceID = "chime" // Chime. + Cloud9ServiceID = "cloud9" // Cloud9. + ClouddirectoryServiceID = "clouddirectory" // Clouddirectory. + CloudformationServiceID = "cloudformation" // Cloudformation. + CloudfrontServiceID = "cloudfront" // Cloudfront. + CloudhsmServiceID = "cloudhsm" // Cloudhsm. + Cloudhsmv2ServiceID = "cloudhsmv2" // Cloudhsmv2. + CloudsearchServiceID = "cloudsearch" // Cloudsearch. + CloudtrailServiceID = "cloudtrail" // Cloudtrail. + CodebuildServiceID = "codebuild" // Codebuild. + CodecommitServiceID = "codecommit" // Codecommit. + CodedeployServiceID = "codedeploy" // Codedeploy. + CodepipelineServiceID = "codepipeline" // Codepipeline. + CodestarServiceID = "codestar" // Codestar. + CognitoIdentityServiceID = "cognito-identity" // CognitoIdentity. + CognitoIdpServiceID = "cognito-idp" // CognitoIdp. + CognitoSyncServiceID = "cognito-sync" // CognitoSync. + ComprehendServiceID = "comprehend" // Comprehend. + ConfigServiceID = "config" // Config. + CurServiceID = "cur" // Cur. + DatapipelineServiceID = "datapipeline" // Datapipeline. + DaxServiceID = "dax" // Dax. + DevicefarmServiceID = "devicefarm" // Devicefarm. + DirectconnectServiceID = "directconnect" // Directconnect. + DiscoveryServiceID = "discovery" // Discovery. + DmsServiceID = "dms" // Dms. + DsServiceID = "ds" // Ds. + DynamodbServiceID = "dynamodb" // Dynamodb. + Ec2ServiceID = "ec2" // Ec2. + Ec2metadataServiceID = "ec2metadata" // Ec2metadata. + EcrServiceID = "ecr" // Ecr. + EcsServiceID = "ecs" // Ecs. + ElasticacheServiceID = "elasticache" // Elasticache. + ElasticbeanstalkServiceID = "elasticbeanstalk" // Elasticbeanstalk. + ElasticfilesystemServiceID = "elasticfilesystem" // Elasticfilesystem. + ElasticloadbalancingServiceID = "elasticloadbalancing" // Elasticloadbalancing. + ElasticmapreduceServiceID = "elasticmapreduce" // Elasticmapreduce. + ElastictranscoderServiceID = "elastictranscoder" // Elastictranscoder. + EmailServiceID = "email" // Email. + EntitlementMarketplaceServiceID = "entitlement.marketplace" // EntitlementMarketplace. + EsServiceID = "es" // Es. + EventsServiceID = "events" // Events. + FirehoseServiceID = "firehose" // Firehose. + FmsServiceID = "fms" // Fms. + GameliftServiceID = "gamelift" // Gamelift. + GlacierServiceID = "glacier" // Glacier. + GlueServiceID = "glue" // Glue. + GreengrassServiceID = "greengrass" // Greengrass. + GuarddutyServiceID = "guardduty" // Guardduty. + HealthServiceID = "health" // Health. + IamServiceID = "iam" // Iam. + ImportexportServiceID = "importexport" // Importexport. + InspectorServiceID = "inspector" // Inspector. + IotServiceID = "iot" // Iot. + IotanalyticsServiceID = "iotanalytics" // Iotanalytics. + KinesisServiceID = "kinesis" // Kinesis. + KinesisanalyticsServiceID = "kinesisanalytics" // Kinesisanalytics. + KinesisvideoServiceID = "kinesisvideo" // Kinesisvideo. + KmsServiceID = "kms" // Kms. + LambdaServiceID = "lambda" // Lambda. + LightsailServiceID = "lightsail" // Lightsail. + LogsServiceID = "logs" // Logs. + MachinelearningServiceID = "machinelearning" // Machinelearning. + MarketplacecommerceanalyticsServiceID = "marketplacecommerceanalytics" // Marketplacecommerceanalytics. + MediaconvertServiceID = "mediaconvert" // Mediaconvert. + MedialiveServiceID = "medialive" // Medialive. + MediapackageServiceID = "mediapackage" // Mediapackage. + MediastoreServiceID = "mediastore" // Mediastore. + MeteringMarketplaceServiceID = "metering.marketplace" // MeteringMarketplace. + MghServiceID = "mgh" // Mgh. + MobileanalyticsServiceID = "mobileanalytics" // Mobileanalytics. + ModelsLexServiceID = "models.lex" // ModelsLex. + MonitoringServiceID = "monitoring" // Monitoring. + MturkRequesterServiceID = "mturk-requester" // MturkRequester. + NeptuneServiceID = "neptune" // Neptune. + OpsworksServiceID = "opsworks" // Opsworks. + OpsworksCmServiceID = "opsworks-cm" // OpsworksCm. + OrganizationsServiceID = "organizations" // Organizations. + PinpointServiceID = "pinpoint" // Pinpoint. + PollyServiceID = "polly" // Polly. + RdsServiceID = "rds" // Rds. + RedshiftServiceID = "redshift" // Redshift. + RekognitionServiceID = "rekognition" // Rekognition. + ResourceGroupsServiceID = "resource-groups" // ResourceGroups. + Route53ServiceID = "route53" // Route53. + Route53domainsServiceID = "route53domains" // Route53domains. + RuntimeLexServiceID = "runtime.lex" // RuntimeLex. + RuntimeSagemakerServiceID = "runtime.sagemaker" // RuntimeSagemaker. + S3ServiceID = "s3" // S3. + S3ControlServiceID = "s3-control" // S3Control. + SagemakerServiceID = "api.sagemaker" // Sagemaker. + SdbServiceID = "sdb" // Sdb. + SecretsmanagerServiceID = "secretsmanager" // Secretsmanager. + ServerlessrepoServiceID = "serverlessrepo" // Serverlessrepo. + ServicecatalogServiceID = "servicecatalog" // Servicecatalog. + ServicediscoveryServiceID = "servicediscovery" // Servicediscovery. + ShieldServiceID = "shield" // Shield. + SmsServiceID = "sms" // Sms. + SnowballServiceID = "snowball" // Snowball. + SnsServiceID = "sns" // Sns. + SqsServiceID = "sqs" // Sqs. + SsmServiceID = "ssm" // Ssm. + StatesServiceID = "states" // States. + StoragegatewayServiceID = "storagegateway" // Storagegateway. + StreamsDynamodbServiceID = "streams.dynamodb" // StreamsDynamodb. + StsServiceID = "sts" // Sts. + SupportServiceID = "support" // Support. + SwfServiceID = "swf" // Swf. + TaggingServiceID = "tagging" // Tagging. + TransferServiceID = "transfer" // Transfer. + TranslateServiceID = "translate" // Translate. + WafServiceID = "waf" // Waf. + WafRegionalServiceID = "waf-regional" // WafRegional. + WorkdocsServiceID = "workdocs" // Workdocs. + WorkmailServiceID = "workmail" // Workmail. + WorkspacesServiceID = "workspaces" // Workspaces. + XrayServiceID = "xray" // Xray. +) diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/endpoints.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/endpoints.go index e29c09512..ca956e5f1 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/endpoints.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/endpoints.go @@ -3,6 +3,7 @@ package endpoints import ( "fmt" "regexp" + "strings" "github.com/aws/aws-sdk-go/aws/awserr" ) @@ -35,7 +36,7 @@ type Options struct { // // If resolving an endpoint on the partition list the provided region will // be used to determine which partition's domain name pattern to the service - // endpoint ID with. If both the service and region are unkonwn and resolving + // endpoint ID with. If both the service and region are unknown and resolving // the endpoint on partition list an UnknownEndpointError error will be returned. // // If resolving and endpoint on a partition specific resolver that partition's @@ -46,6 +47,108 @@ type Options struct { // // This option is ignored if StrictMatching is enabled. ResolveUnknownService bool + + // STS Regional Endpoint flag helps with resolving the STS endpoint + STSRegionalEndpoint STSRegionalEndpoint + + // S3 Regional Endpoint flag helps with resolving the S3 endpoint + S3UsEast1RegionalEndpoint S3UsEast1RegionalEndpoint +} + +// STSRegionalEndpoint is an enum for the states of the STS Regional Endpoint +// options. +type STSRegionalEndpoint int + +func (e STSRegionalEndpoint) String() string { + switch e { + case LegacySTSEndpoint: + return "legacy" + case RegionalSTSEndpoint: + return "regional" + case UnsetSTSEndpoint: + return "" + default: + return "unknown" + } +} + +const ( + + // UnsetSTSEndpoint represents that STS Regional Endpoint flag is not specified. + UnsetSTSEndpoint STSRegionalEndpoint = iota + + // LegacySTSEndpoint represents when STS Regional Endpoint flag is specified + // to use legacy endpoints. + LegacySTSEndpoint + + // RegionalSTSEndpoint represents when STS Regional Endpoint flag is specified + // to use regional endpoints. + RegionalSTSEndpoint +) + +// GetSTSRegionalEndpoint function returns the STSRegionalEndpointFlag based +// on the input string provided in env config or shared config by the user. +// +// `legacy`, `regional` are the only case-insensitive valid strings for +// resolving the STS regional Endpoint flag. +func GetSTSRegionalEndpoint(s string) (STSRegionalEndpoint, error) { + switch { + case strings.EqualFold(s, "legacy"): + return LegacySTSEndpoint, nil + case strings.EqualFold(s, "regional"): + return RegionalSTSEndpoint, nil + default: + return UnsetSTSEndpoint, fmt.Errorf("unable to resolve the value of STSRegionalEndpoint for %v", s) + } +} + +// S3UsEast1RegionalEndpoint is an enum for the states of the S3 us-east-1 +// Regional Endpoint options. +type S3UsEast1RegionalEndpoint int + +func (e S3UsEast1RegionalEndpoint) String() string { + switch e { + case LegacyS3UsEast1Endpoint: + return "legacy" + case RegionalS3UsEast1Endpoint: + return "regional" + case UnsetS3UsEast1Endpoint: + return "" + default: + return "unknown" + } +} + +const ( + + // UnsetS3UsEast1Endpoint represents that S3 Regional Endpoint flag is not + // specified. + UnsetS3UsEast1Endpoint S3UsEast1RegionalEndpoint = iota + + // LegacyS3UsEast1Endpoint represents when S3 Regional Endpoint flag is + // specified to use legacy endpoints. + LegacyS3UsEast1Endpoint + + // RegionalS3UsEast1Endpoint represents when S3 Regional Endpoint flag is + // specified to use regional endpoints. + RegionalS3UsEast1Endpoint +) + +// GetS3UsEast1RegionalEndpoint function returns the S3UsEast1RegionalEndpointFlag based +// on the input string provided in env config or shared config by the user. +// +// `legacy`, `regional` are the only case-insensitive valid strings for +// resolving the S3 regional Endpoint flag. +func GetS3UsEast1RegionalEndpoint(s string) (S3UsEast1RegionalEndpoint, error) { + switch { + case strings.EqualFold(s, "legacy"): + return LegacyS3UsEast1Endpoint, nil + case strings.EqualFold(s, "regional"): + return RegionalS3UsEast1Endpoint, nil + default: + return UnsetS3UsEast1Endpoint, + fmt.Errorf("unable to resolve the value of S3UsEast1RegionalEndpoint for %v", s) + } } // Set combines all of the option functions together. @@ -79,6 +182,12 @@ func ResolveUnknownServiceOption(o *Options) { o.ResolveUnknownService = true } +// STSRegionalEndpointOption enables the STS endpoint resolver behavior to resolve +// STS endpoint to their regional endpoint, instead of the global endpoint. +func STSRegionalEndpointOption(o *Options) { + o.STSRegionalEndpoint = RegionalSTSEndpoint +} + // A Resolver provides the interface for functionality to resolve endpoints. // The build in Partition and DefaultResolver return value satisfy this interface. type Resolver interface { @@ -170,10 +279,13 @@ func PartitionForRegion(ps []Partition, regionID string) (Partition, bool) { // A Partition provides the ability to enumerate the partition's regions // and services. type Partition struct { - id string - p *partition + id, dnsSuffix string + p *partition } +// DNSSuffix returns the base domain name of the partition. +func (p Partition) DNSSuffix() string { return p.dnsSuffix } + // ID returns the identifier of the partition. func (p Partition) ID() string { return p.id } @@ -191,7 +303,7 @@ func (p Partition) ID() string { return p.id } // require the provided service and region to be known by the partition. // If the endpoint cannot be strictly resolved an error will be returned. This // mode is useful to ensure the endpoint resolved is valid. Without -// StrictMatching enabled the endpoint returned my look valid but may not work. +// StrictMatching enabled the endpoint returned may look valid but may not work. // StrictMatching requires the SDK to be updated if you want to take advantage // of new regions and services expansions. // @@ -205,7 +317,7 @@ func (p Partition) EndpointFor(service, region string, opts ...func(*Options)) ( // Regions returns a map of Regions indexed by their ID. This is useful for // enumerating over the regions in a partition. func (p Partition) Regions() map[string]Region { - rs := map[string]Region{} + rs := make(map[string]Region, len(p.p.Regions)) for id, r := range p.p.Regions { rs[id] = Region{ id: id, @@ -220,7 +332,7 @@ func (p Partition) Regions() map[string]Region { // Services returns a map of Service indexed by their ID. This is useful for // enumerating over the services in a partition. func (p Partition) Services() map[string]Service { - ss := map[string]Service{} + ss := make(map[string]Service, len(p.p.Services)) for id := range p.p.Services { ss[id] = Service{ id: id, @@ -307,7 +419,7 @@ func (s Service) Regions() map[string]Region { // A region is the AWS region the service exists in. Whereas a Endpoint is // an URL that can be resolved to a instance of a service. func (s Service) Endpoints() map[string]Endpoint { - es := map[string]Endpoint{} + es := make(map[string]Endpoint, len(s.p.Services[s.id].Endpoints)) for id := range s.p.Services[s.id].Endpoints { es[id] = Endpoint{ id: id, @@ -347,6 +459,9 @@ type ResolvedEndpoint struct { // The endpoint URL URL string + // The endpoint partition + PartitionID string + // The region that should be used for signing requests. SigningRegion string diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/legacy_regions.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/legacy_regions.go new file mode 100644 index 000000000..df75e899a --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/legacy_regions.go @@ -0,0 +1,24 @@ +package endpoints + +var legacyGlobalRegions = map[string]map[string]struct{}{ + "sts": { + "ap-northeast-1": {}, + "ap-south-1": {}, + "ap-southeast-1": {}, + "ap-southeast-2": {}, + "ca-central-1": {}, + "eu-central-1": {}, + "eu-north-1": {}, + "eu-west-1": {}, + "eu-west-2": {}, + "eu-west-3": {}, + "sa-east-1": {}, + "us-east-1": {}, + "us-east-2": {}, + "us-west-1": {}, + "us-west-2": {}, + }, + "s3": { + "us-east-1": {}, + }, +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model.go index ff6f76db6..eb2ac83c9 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model.go @@ -54,8 +54,9 @@ type partition struct { func (p partition) Partition() Partition { return Partition{ - id: p.ID, - p: &p, + dnsSuffix: p.DNSSuffix, + id: p.ID, + p: &p, } } @@ -74,24 +75,56 @@ func (p partition) canResolveEndpoint(service, region string, strictMatch bool) return p.RegionRegex.MatchString(region) } +func allowLegacyEmptyRegion(service string) bool { + legacy := map[string]struct{}{ + "budgets": {}, + "ce": {}, + "chime": {}, + "cloudfront": {}, + "ec2metadata": {}, + "iam": {}, + "importexport": {}, + "organizations": {}, + "route53": {}, + "sts": {}, + "support": {}, + "waf": {}, + } + + _, allowed := legacy[service] + return allowed +} + func (p partition) EndpointFor(service, region string, opts ...func(*Options)) (resolved ResolvedEndpoint, err error) { var opt Options opt.Set(opts...) s, hasService := p.Services[service] - if !(hasService || opt.ResolveUnknownService) { + if len(service) == 0 || !(hasService || opt.ResolveUnknownService) { // Only return error if the resolver will not fallback to creating // endpoint based on service endpoint ID passed in. return resolved, NewUnknownServiceError(p.ID, service, serviceList(p.Services)) } + if len(region) == 0 && allowLegacyEmptyRegion(service) && len(s.PartitionEndpoint) != 0 { + region = s.PartitionEndpoint + } + + if (service == "sts" && opt.STSRegionalEndpoint != RegionalSTSEndpoint) || + (service == "s3" && opt.S3UsEast1RegionalEndpoint != RegionalS3UsEast1Endpoint) { + if _, ok := legacyGlobalRegions[service][region]; ok { + region = "aws-global" + } + } + e, hasEndpoint := s.endpointForRegion(region) - if !hasEndpoint && opt.StrictMatching { + if len(region) == 0 || (!hasEndpoint && opt.StrictMatching) { return resolved, NewUnknownEndpointError(p.ID, service, region, endpointList(s.Endpoints)) } defs := []endpoint{p.Defaults, s.Defaults} - return e.resolve(service, region, p.DNSSuffix, defs, opt), nil + + return e.resolve(service, p.ID, region, p.DNSSuffix, defs, opt), nil } func serviceList(ss services) []string { @@ -200,7 +233,7 @@ func getByPriority(s []string, p []string, def string) string { return s[0] } -func (e endpoint) resolve(service, region, dnsSuffix string, defs []endpoint, opts Options) ResolvedEndpoint { +func (e endpoint) resolve(service, partitionID, region, dnsSuffix string, defs []endpoint, opts Options) ResolvedEndpoint { var merged endpoint for _, def := range defs { merged.mergeIn(def) @@ -208,11 +241,23 @@ func (e endpoint) resolve(service, region, dnsSuffix string, defs []endpoint, op merged.mergeIn(e) e = merged - hostname := e.Hostname + signingRegion := e.CredentialScope.Region + if len(signingRegion) == 0 { + signingRegion = region + } + signingName := e.CredentialScope.Service + var signingNameDerived bool + if len(signingName) == 0 { + signingName = service + signingNameDerived = true + } + + hostname := e.Hostname // Offset the hostname for dualstack if enabled if opts.UseDualStack && e.HasDualStack == boxedTrue { hostname = e.DualStackHostname + region = signingRegion } u := strings.Replace(hostname, "{service}", service, 1) @@ -222,20 +267,9 @@ func (e endpoint) resolve(service, region, dnsSuffix string, defs []endpoint, op scheme := getEndpointScheme(e.Protocols, opts.DisableSSL) u = fmt.Sprintf("%s://%s", scheme, u) - signingRegion := e.CredentialScope.Region - if len(signingRegion) == 0 { - signingRegion = region - } - - signingName := e.CredentialScope.Service - var signingNameDerived bool - if len(signingName) == 0 { - signingName = service - signingNameDerived = true - } - return ResolvedEndpoint{ URL: u, + PartitionID: partitionID, SigningRegion: signingRegion, SigningName: signingName, SigningNameDerived: signingNameDerived, diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model_codegen.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model_codegen.go index 05e92df22..0fdfcc56e 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model_codegen.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model_codegen.go @@ -16,6 +16,10 @@ import ( type CodeGenOptions struct { // Options for how the model will be decoded. DecodeModelOptions DecodeModelOptions + + // Disables code generation of the service endpoint prefix IDs defined in + // the model. + DisableGenerateServiceIDs bool } // Set combines all of the option functions together @@ -39,8 +43,16 @@ func CodeGenModel(modelFile io.Reader, outFile io.Writer, optFns ...func(*CodeGe return err } + v := struct { + Resolver + CodeGenOptions + }{ + Resolver: resolver, + CodeGenOptions: opts, + } + tmpl := template.Must(template.New("tmpl").Funcs(funcMap).Parse(v3Tmpl)) - if err := tmpl.ExecuteTemplate(outFile, "defaults", resolver); err != nil { + if err := tmpl.ExecuteTemplate(outFile, "defaults", v); err != nil { return fmt.Errorf("failed to execute template, %v", err) } @@ -166,15 +178,17 @@ import ( "regexp" ) - {{ template "partition consts" . }} + {{ template "partition consts" $.Resolver }} - {{ range $_, $partition := . }} + {{ range $_, $partition := $.Resolver }} {{ template "partition region consts" $partition }} {{ end }} - {{ template "service consts" . }} + {{ if not $.DisableGenerateServiceIDs -}} + {{ template "service consts" $.Resolver }} + {{- end }} - {{ template "endpoint resolvers" . }} + {{ template "endpoint resolvers" $.Resolver }} {{- end }} {{ define "partition consts" }} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/errors.go b/vendor/github.com/aws/aws-sdk-go/aws/errors.go index 576636168..fa06f7a8f 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/errors.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/errors.go @@ -5,13 +5,9 @@ import "github.com/aws/aws-sdk-go/aws/awserr" var ( // ErrMissingRegion is an error that is returned if region configuration is // not found. - // - // @readonly ErrMissingRegion = awserr.New("MissingRegion", "could not find region configuration", nil) // ErrMissingEndpoint is an error that is returned if an endpoint cannot be // resolved for a service. - // - // @readonly ErrMissingEndpoint = awserr.New("MissingEndpoint", "'Endpoint' configuration is required for this service", nil) ) diff --git a/vendor/github.com/aws/aws-sdk-go/aws/logger.go b/vendor/github.com/aws/aws-sdk-go/aws/logger.go index 3babb5abd..6ed15b2ec 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/logger.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/logger.go @@ -71,6 +71,12 @@ const ( // LogDebugWithRequestErrors states the SDK should log when service requests fail // to build, send, validate, or unmarshal. LogDebugWithRequestErrors + + // LogDebugWithEventStreamBody states the SDK should log EventStream + // request and response bodys. This should be used to log the EventStream + // wire unmarshaled message content of requests and responses made while + // using the SDK Will also enable LogDebug. + LogDebugWithEventStreamBody ) // A Logger is a minimalistic interface for the SDK to log messages to. Should diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/connection_reset_error.go b/vendor/github.com/aws/aws-sdk-go/aws/request/connection_reset_error.go index 271da432c..d9b37f4d3 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/request/connection_reset_error.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/request/connection_reset_error.go @@ -1,18 +1,17 @@ -// +build !appengine,!plan9 - package request import ( - "net" - "os" - "syscall" + "strings" ) func isErrConnectionReset(err error) bool { - if opErr, ok := err.(*net.OpError); ok { - if sysErr, ok := opErr.Err.(*os.SyscallError); ok { - return sysErr.Err == syscall.ECONNRESET - } + if strings.Contains(err.Error(), "read: connection reset") { + return false + } + + if strings.Contains(err.Error(), "connection reset") || + strings.Contains(err.Error(), "broken pipe") { + return true } return false diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/connection_reset_error_other.go b/vendor/github.com/aws/aws-sdk-go/aws/request/connection_reset_error_other.go deleted file mode 100644 index daf9eca43..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/request/connection_reset_error_other.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build appengine plan9 - -package request - -import ( - "strings" -) - -func isErrConnectionReset(err error) bool { - return strings.Contains(err.Error(), "connection reset") -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/handlers.go b/vendor/github.com/aws/aws-sdk-go/aws/request/handlers.go index 802ac88ad..e819ab6c0 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/request/handlers.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/request/handlers.go @@ -10,49 +10,106 @@ import ( type Handlers struct { Validate HandlerList Build HandlerList + BuildStream HandlerList Sign HandlerList Send HandlerList ValidateResponse HandlerList Unmarshal HandlerList + UnmarshalStream HandlerList UnmarshalMeta HandlerList UnmarshalError HandlerList Retry HandlerList AfterRetry HandlerList + CompleteAttempt HandlerList Complete HandlerList } -// Copy returns of this handler's lists. +// Copy returns a copy of this handler's lists. func (h *Handlers) Copy() Handlers { return Handlers{ Validate: h.Validate.copy(), Build: h.Build.copy(), + BuildStream: h.BuildStream.copy(), Sign: h.Sign.copy(), Send: h.Send.copy(), ValidateResponse: h.ValidateResponse.copy(), Unmarshal: h.Unmarshal.copy(), + UnmarshalStream: h.UnmarshalStream.copy(), UnmarshalError: h.UnmarshalError.copy(), UnmarshalMeta: h.UnmarshalMeta.copy(), Retry: h.Retry.copy(), AfterRetry: h.AfterRetry.copy(), + CompleteAttempt: h.CompleteAttempt.copy(), Complete: h.Complete.copy(), } } -// Clear removes callback functions for all handlers +// Clear removes callback functions for all handlers. func (h *Handlers) Clear() { h.Validate.Clear() h.Build.Clear() + h.BuildStream.Clear() h.Send.Clear() h.Sign.Clear() h.Unmarshal.Clear() + h.UnmarshalStream.Clear() h.UnmarshalMeta.Clear() h.UnmarshalError.Clear() h.ValidateResponse.Clear() h.Retry.Clear() h.AfterRetry.Clear() + h.CompleteAttempt.Clear() h.Complete.Clear() } +// IsEmpty returns if there are no handlers in any of the handlerlists. +func (h *Handlers) IsEmpty() bool { + if h.Validate.Len() != 0 { + return false + } + if h.Build.Len() != 0 { + return false + } + if h.BuildStream.Len() != 0 { + return false + } + if h.Send.Len() != 0 { + return false + } + if h.Sign.Len() != 0 { + return false + } + if h.Unmarshal.Len() != 0 { + return false + } + if h.UnmarshalStream.Len() != 0 { + return false + } + if h.UnmarshalMeta.Len() != 0 { + return false + } + if h.UnmarshalError.Len() != 0 { + return false + } + if h.ValidateResponse.Len() != 0 { + return false + } + if h.Retry.Len() != 0 { + return false + } + if h.AfterRetry.Len() != 0 { + return false + } + if h.CompleteAttempt.Len() != 0 { + return false + } + if h.Complete.Len() != 0 { + return false + } + + return true +} + // A HandlerListRunItem represents an entry in the HandlerList which // is being run. type HandlerListRunItem struct { @@ -172,6 +229,21 @@ func (l *HandlerList) SwapNamed(n NamedHandler) (swapped bool) { return swapped } +// Swap will swap out all handlers matching the name passed in. The matched +// handlers will be swapped in. True is returned if the handlers were swapped. +func (l *HandlerList) Swap(name string, replace NamedHandler) bool { + var swapped bool + + for i := 0; i < len(l.list); i++ { + if l.list[i].Name == name { + l.list[i] = replace + swapped = true + } + } + + return swapped +} + // SetBackNamed will replace the named handler if it exists in the handler list. // If the handler does not exist the handler will be added to the end of the list. func (l *HandlerList) SetBackNamed(n NamedHandler) { @@ -254,3 +326,18 @@ func MakeAddToUserAgentFreeFormHandler(s string) func(*Request) { AddToUserAgent(r, s) } } + +// WithSetRequestHeaders updates the operation request's HTTP header to contain +// the header key value pairs provided. If the header key already exists in the +// request's HTTP header set, the existing value(s) will be replaced. +func WithSetRequestHeaders(h map[string]string) Option { + return withRequestHeader(h).SetRequestHeaders +} + +type withRequestHeader map[string]string + +func (h withRequestHeader) SetRequestHeaders(r *Request) { + for k, v := range h { + r.HTTPRequest.Header[k] = []string{v} + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/offset_reader.go b/vendor/github.com/aws/aws-sdk-go/aws/request/offset_reader.go index b0c2ef4fe..9370fa50c 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/request/offset_reader.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/request/offset_reader.go @@ -15,12 +15,15 @@ type offsetReader struct { closed bool } -func newOffsetReader(buf io.ReadSeeker, offset int64) *offsetReader { +func newOffsetReader(buf io.ReadSeeker, offset int64) (*offsetReader, error) { reader := &offsetReader{} - buf.Seek(offset, sdkio.SeekStart) + _, err := buf.Seek(offset, sdkio.SeekStart) + if err != nil { + return nil, err + } reader.buf = buf - return reader + return reader, nil } // Close will close the instance of the offset reader's access to @@ -54,7 +57,9 @@ func (o *offsetReader) Seek(offset int64, whence int) (int64, error) { // CloseAndCopy will return a new offsetReader with a copy of the old buffer // and close the old buffer. -func (o *offsetReader) CloseAndCopy(offset int64) *offsetReader { - o.Close() +func (o *offsetReader) CloseAndCopy(offset int64) (*offsetReader, error) { + if err := o.Close(); err != nil { + return nil, err + } return newOffsetReader(o.buf, offset) } diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/request.go b/vendor/github.com/aws/aws-sdk-go/aws/request/request.go index 69b7a01ad..d597c6ead 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/request/request.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/request/request.go @@ -4,7 +4,6 @@ import ( "bytes" "fmt" "io" - "net" "net/http" "net/url" "reflect" @@ -37,6 +36,10 @@ const ( // API request that was canceled. Requests given a aws.Context may // return this error when canceled. CanceledErrorCode = "RequestCanceled" + + // ErrCodeRequestError is an error preventing the SDK from continuing to + // process the request. + ErrCodeRequestError = "RequestError" ) // A Request is the service request to be made. @@ -46,11 +49,13 @@ type Request struct { Handlers Handlers Retryer + AttemptTime time.Time Time time.Time Operation *Operation HTTPRequest *http.Request HTTPResponse *http.Response Body io.ReadSeeker + streamingBody io.ReadCloser BodyStart int64 // offset from beginning of Body that the request body starts Params interface{} Error error @@ -64,6 +69,15 @@ type Request struct { LastSignedAt time.Time DisableFollowRedirects bool + // Additional API error codes that should be retried. IsErrorRetryable + // will consider these codes in addition to its built in cases. + RetryErrorCodes []string + + // Additional API error codes that should be retried with throttle backoff + // delay. IsErrorThrottle will consider these codes in addition to its + // built in cases. + ThrottleErrorCodes []string + // A value greater than 0 instructs the request to be signed as Presigned URL // You should not set this field directly. Instead use Request's // Presign or PresignRequest methods. @@ -90,8 +104,12 @@ type Operation struct { BeforePresignFn func(r *Request) error } -// New returns a new Request pointer for the service API -// operation and parameters. +// New returns a new Request pointer for the service API operation and +// parameters. +// +// A Retryer should be provided to direct how the request is retried. If +// Retryer is nil, a default no retry value will be used. You can use +// NoOpRetryer in the Client package to disable retry behavior directly. // // Params is any value of input parameters to be the request payload. // Data is pointer value to an object which the request's response @@ -99,6 +117,10 @@ type Operation struct { func New(cfg aws.Config, clientInfo metadata.ClientInfo, handlers Handlers, retryer Retryer, operation *Operation, params interface{}, data interface{}) *Request { + if retryer == nil { + retryer = noOpRetryer{} + } + method := operation.HTTPMethod if method == "" { method = "POST" @@ -113,8 +135,6 @@ func New(cfg aws.Config, clientInfo metadata.ClientInfo, handlers Handlers, err = awserr.New("InvalidEndpointURL", "invalid endpoint uri", err) } - SanitizeHostForHeader(httpReq) - r := &Request{ Config: cfg, ClientInfo: clientInfo, @@ -231,6 +251,10 @@ func (r *Request) WillRetry() bool { return r.Error != nil && aws.BoolValue(r.Retryable) && r.RetryCount < r.MaxRetries() } +func fmtAttemptCount(retryCount, maxRetries int) string { + return fmt.Sprintf("attempt %v/%v", retryCount, maxRetries) +} + // ParamsFilled returns if the request's parameters have been populated // and the parameters are valid. False is returned if no parameters are // provided or invalid. @@ -259,12 +283,32 @@ func (r *Request) SetStringBody(s string) { // SetReaderBody will set the request's body reader. func (r *Request) SetReaderBody(reader io.ReadSeeker) { r.Body = reader - r.BodyStart, _ = reader.Seek(0, sdkio.SeekCurrent) // Get the Bodies current offset. + + if aws.IsReaderSeekable(reader) { + var err error + // Get the Bodies current offset so retries will start from the same + // initial position. + r.BodyStart, err = reader.Seek(0, sdkio.SeekCurrent) + if err != nil { + r.Error = awserr.New(ErrCodeSerialization, + "failed to determine start of request body", err) + return + } + } r.ResetBody() } +// SetStreamingBody set the reader to be used for the request that will stream +// bytes to the server. Request's Body must not be set to any reader. +func (r *Request) SetStreamingBody(reader io.ReadCloser) { + r.streamingBody = reader + r.SetReaderBody(aws.ReadSeekCloser(reader)) +} + // Presign returns the request's signed URL. Error will be returned -// if the signing fails. +// if the signing fails. The expire parameter is only used for presigned Amazon +// S3 API requests. All other AWS services will use a fixed expiration +// time of 15 minutes. // // It is invalid to create a presigned URL with a expire duration 0 or less. An // error is returned if expire duration is 0 or less. @@ -281,7 +325,9 @@ func (r *Request) Presign(expire time.Duration) (string, error) { } // PresignRequest behaves just like presign, with the addition of returning a -// set of headers that were signed. +// set of headers that were signed. The expire parameter is only used for +// presigned Amazon S3 API requests. All other AWS services will use a fixed +// expiration time of 15 minutes. // // It is invalid to create a presigned URL with a expire duration 0 or less. An // error is returned if expire duration is 0 or less. @@ -326,16 +372,15 @@ func getPresignedURL(r *Request, expire time.Duration) (string, http.Header, err return r.HTTPRequest.URL.String(), r.SignedHeaderVals, nil } -func debugLogReqError(r *Request, stage string, retrying bool, err error) { +const ( + notRetrying = "not retrying" +) + +func debugLogReqError(r *Request, stage, retryStr string, err error) { if !r.Config.LogLevel.Matches(aws.LogDebugWithRequestErrors) { return } - retryStr := "not retrying" - if retrying { - retryStr = "will retry" - } - r.Config.Logger.Log(fmt.Sprintf("DEBUG: %s %s/%s failed, %s, error %v", stage, r.ClientInfo.ServiceName, r.Operation.Name, retryStr, err)) } @@ -354,12 +399,12 @@ func (r *Request) Build() error { if !r.built { r.Handlers.Validate.Run(r) if r.Error != nil { - debugLogReqError(r, "Validate Request", false, r.Error) + debugLogReqError(r, "Validate Request", notRetrying, r.Error) return r.Error } r.Handlers.Build.Run(r) if r.Error != nil { - debugLogReqError(r, "Build Request", false, r.Error) + debugLogReqError(r, "Build Request", notRetrying, r.Error) return r.Error } r.built = true @@ -368,27 +413,37 @@ func (r *Request) Build() error { return r.Error } -// Sign will sign the request returning error if errors are encountered. +// Sign will sign the request, returning error if errors are encountered. // -// Send will build the request prior to signing. All Sign Handlers will +// Sign will build the request prior to signing. All Sign Handlers will // be executed in the order they were set. func (r *Request) Sign() error { r.Build() if r.Error != nil { - debugLogReqError(r, "Build Request", false, r.Error) + debugLogReqError(r, "Build Request", notRetrying, r.Error) return r.Error } + SanitizeHostForHeader(r.HTTPRequest) + r.Handlers.Sign.Run(r) return r.Error } -func (r *Request) getNextRequestBody() (io.ReadCloser, error) { +func (r *Request) getNextRequestBody() (body io.ReadCloser, err error) { + if r.streamingBody != nil { + return r.streamingBody, nil + } + if r.safeBody != nil { r.safeBody.Close() } - r.safeBody = newOffsetReader(r.Body, r.BodyStart) + r.safeBody, err = newOffsetReader(r.Body, r.BodyStart) + if err != nil { + return nil, awserr.New(ErrCodeSerialization, + "failed to get next request body reader", err) + } // Go 1.8 tightened and clarified the rules code needs to use when building // requests with the http package. Go 1.8 removed the automatic detection @@ -405,10 +460,10 @@ func (r *Request) getNextRequestBody() (io.ReadCloser, error) { // Related golang/go#18257 l, err := aws.SeekerLen(r.Body) if err != nil { - return nil, awserr.New(ErrCodeSerialization, "failed to compute request body size", err) + return nil, awserr.New(ErrCodeSerialization, + "failed to compute request body size", err) } - var body io.ReadCloser if l == 0 { body = NoBody } else if l > 0 { @@ -440,7 +495,7 @@ func (r *Request) GetBody() io.ReadSeeker { return r.safeBody } -// Send will send the request returning error if errors are encountered. +// Send will send the request, returning error if errors are encountered. // // Send will sign the request prior to sending. All Send Handlers will // be executed in the order they were set. @@ -460,79 +515,90 @@ func (r *Request) Send() error { r.Handlers.Complete.Run(r) }() + if err := r.Error; err != nil { + return err + } + for { - if aws.BoolValue(r.Retryable) { - if r.Config.LogLevel.Matches(aws.LogDebugWithRequestRetries) { - r.Config.Logger.Log(fmt.Sprintf("DEBUG: Retrying Request %s/%s, attempt %d", - r.ClientInfo.ServiceName, r.Operation.Name, r.RetryCount)) - } - - // The previous http.Request will have a reference to the r.Body - // and the HTTP Client's Transport may still be reading from - // the request's body even though the Client's Do returned. - r.HTTPRequest = copyHTTPRequest(r.HTTPRequest, nil) - r.ResetBody() - - // Closing response body to ensure that no response body is leaked - // between retry attempts. - if r.HTTPResponse != nil && r.HTTPResponse.Body != nil { - r.HTTPResponse.Body.Close() - } - } + r.Error = nil + r.AttemptTime = time.Now() - r.Sign() - if r.Error != nil { - return r.Error + if err := r.Sign(); err != nil { + debugLogReqError(r, "Sign Request", notRetrying, err) + return err } - r.Retryable = nil - - r.Handlers.Send.Run(r) - if r.Error != nil { - if !shouldRetryCancel(r) { - return r.Error - } - - err := r.Error - r.Handlers.Retry.Run(r) - r.Handlers.AfterRetry.Run(r) - if r.Error != nil { - debugLogReqError(r, "Send Request", false, err) - return r.Error - } - debugLogReqError(r, "Send Request", true, err) - continue + if err := r.sendRequest(); err == nil { + return nil } - r.Handlers.UnmarshalMeta.Run(r) - r.Handlers.ValidateResponse.Run(r) - if r.Error != nil { - r.Handlers.UnmarshalError.Run(r) - err := r.Error - - r.Handlers.Retry.Run(r) - r.Handlers.AfterRetry.Run(r) - if r.Error != nil { - debugLogReqError(r, "Validate Response", false, err) - return r.Error - } - debugLogReqError(r, "Validate Response", true, err) - continue + r.Handlers.Retry.Run(r) + r.Handlers.AfterRetry.Run(r) + + if r.Error != nil || !aws.BoolValue(r.Retryable) { + return r.Error } - r.Handlers.Unmarshal.Run(r) - if r.Error != nil { - err := r.Error - r.Handlers.Retry.Run(r) - r.Handlers.AfterRetry.Run(r) - if r.Error != nil { - debugLogReqError(r, "Unmarshal Response", false, err) - return r.Error - } - debugLogReqError(r, "Unmarshal Response", true, err) - continue + if err := r.prepareRetry(); err != nil { + r.Error = err + return err } + } +} + +func (r *Request) prepareRetry() error { + if r.Config.LogLevel.Matches(aws.LogDebugWithRequestRetries) { + r.Config.Logger.Log(fmt.Sprintf("DEBUG: Retrying Request %s/%s, attempt %d", + r.ClientInfo.ServiceName, r.Operation.Name, r.RetryCount)) + } + + // The previous http.Request will have a reference to the r.Body + // and the HTTP Client's Transport may still be reading from + // the request's body even though the Client's Do returned. + r.HTTPRequest = copyHTTPRequest(r.HTTPRequest, nil) + r.ResetBody() + if err := r.Error; err != nil { + return awserr.New(ErrCodeSerialization, + "failed to prepare body for retry", err) + + } + + // Closing response body to ensure that no response body is leaked + // between retry attempts. + if r.HTTPResponse != nil && r.HTTPResponse.Body != nil { + r.HTTPResponse.Body.Close() + } + + return nil +} + +func (r *Request) sendRequest() (sendErr error) { + defer r.Handlers.CompleteAttempt.Run(r) + + r.Retryable = nil + r.Handlers.Send.Run(r) + if r.Error != nil { + debugLogReqError(r, "Send Request", + fmtAttemptCount(r.RetryCount, r.MaxRetries()), + r.Error) + return r.Error + } - break + r.Handlers.UnmarshalMeta.Run(r) + r.Handlers.ValidateResponse.Run(r) + if r.Error != nil { + r.Handlers.UnmarshalError.Run(r) + debugLogReqError(r, "Validate Response", + fmtAttemptCount(r.RetryCount, r.MaxRetries()), + r.Error) + return r.Error + } + + r.Handlers.Unmarshal.Run(r) + if r.Error != nil { + debugLogReqError(r, "Unmarshal Response", + fmtAttemptCount(r.RetryCount, r.MaxRetries()), + r.Error) + return r.Error } return nil @@ -558,32 +624,6 @@ func AddToUserAgent(r *Request, s string) { r.HTTPRequest.Header.Set("User-Agent", s) } -func shouldRetryCancel(r *Request) bool { - awsErr, ok := r.Error.(awserr.Error) - timeoutErr := false - errStr := r.Error.Error() - if ok { - if awsErr.Code() == CanceledErrorCode { - return false - } - err := awsErr.OrigErr() - netErr, netOK := err.(net.Error) - timeoutErr = netOK && netErr.Temporary() - if urlErr, ok := err.(*url.Error); !timeoutErr && ok { - errStr = urlErr.Err.Error() - } - } - - // There can be two types of canceled errors here. - // The first being a net.Error and the other being an error. - // If the request was timed out, we want to continue the retry - // process. Otherwise, return the canceled error. - return timeoutErr || - (errStr != "net/http: request canceled" && - errStr != "net/http: request canceled while waiting for connection") - -} - // SanitizeHostForHeader removes default port from host and updates request.Host func SanitizeHostForHeader(r *http.Request) { host := getHost(r) @@ -599,6 +639,10 @@ func getHost(r *http.Request) string { return r.Host } + if r.URL == nil { + return "" + } + return r.URL.Host } diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/request_1_7.go b/vendor/github.com/aws/aws-sdk-go/aws/request/request_1_7.go index 869b97a1a..e36e468b7 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/request/request_1_7.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/request/request_1_7.go @@ -21,7 +21,7 @@ func (noBody) WriteTo(io.Writer) (int64, error) { return 0, nil } var NoBody = noBody{} // ResetBody rewinds the request body back to its starting position, and -// set's the HTTP Request body reference. When the body is read prior +// sets the HTTP Request body reference. When the body is read prior // to being sent in the HTTP request it will need to be rewound. // // ResetBody will automatically be called by the SDK's build handler, but if diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/request_1_8.go b/vendor/github.com/aws/aws-sdk-go/aws/request/request_1_8.go index c32fc69bc..de1292f45 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/request/request_1_8.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/request/request_1_8.go @@ -4,6 +4,8 @@ package request import ( "net/http" + + "github.com/aws/aws-sdk-go/aws/awserr" ) // NoBody is a http.NoBody reader instructing Go HTTP client to not include @@ -11,7 +13,7 @@ import ( var NoBody = http.NoBody // ResetBody rewinds the request body back to its starting position, and -// set's the HTTP Request body reference. When the body is read prior +// sets the HTTP Request body reference. When the body is read prior // to being sent in the HTTP request it will need to be rewound. // // ResetBody will automatically be called by the SDK's build handler, but if @@ -24,7 +26,8 @@ var NoBody = http.NoBody func (r *Request) ResetBody() { body, err := r.getNextRequestBody() if err != nil { - r.Error = err + r.Error = awserr.New(ErrCodeSerialization, + "failed to reset request body", err) return } diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/request_pagination.go b/vendor/github.com/aws/aws-sdk-go/aws/request/request_pagination.go index 159518a75..64784e16f 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/request/request_pagination.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/request/request_pagination.go @@ -17,11 +17,13 @@ import ( // does the pagination between API operations, and Paginator defines the // configuration that will be used per page request. // -// cont := true -// for p.Next() && cont { +// for p.Next() { // data := p.Page().(*s3.ListObjectsOutput) // // process the page's data +// // ... +// // break out of loop to stop fetching additional pages // } +// // return p.Err() // // See service client API operation Pages methods for examples how the SDK will @@ -35,8 +37,12 @@ type Pagination struct { // NewRequest should always be built from the same API operations. It is // undefined if different API operations are returned on subsequent calls. NewRequest func() (*Request, error) + // EndPageOnSameToken, when enabled, will allow the paginator to stop on + // token that are the same as its previous tokens. + EndPageOnSameToken bool started bool + prevTokens []interface{} nextTokens []interface{} err error @@ -49,7 +55,15 @@ type Pagination struct { // // Will always return true if Next has not been called yet. func (p *Pagination) HasNextPage() bool { - return !(p.started && len(p.nextTokens) == 0) + if !p.started { + return true + } + + hasNextPage := len(p.nextTokens) != 0 + if p.EndPageOnSameToken { + return hasNextPage && !awsutil.DeepEqual(p.nextTokens, p.prevTokens) + } + return hasNextPage } // Err returns the error Pagination encountered when retrieving the next page. @@ -96,6 +110,7 @@ func (p *Pagination) Next() bool { return false } + p.prevTokens = p.nextTokens p.nextTokens = req.nextPageTokens() p.curPage = req.Data @@ -133,7 +148,7 @@ func (r *Request) nextPageTokens() []interface{} { return nil } case bool: - if v == false { + if !v { return nil } } diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/retryer.go b/vendor/github.com/aws/aws-sdk-go/aws/request/retryer.go index f35fef213..752ae47f8 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/request/retryer.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/request/retryer.go @@ -1,32 +1,81 @@ package request import ( + "net" + "net/url" + "strings" "time" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awserr" ) -// Retryer is an interface to control retry logic for a given service. -// The default implementation used by most services is the client.DefaultRetryer -// structure, which contains basic retry logic using exponential backoff. +// Retryer provides the interface drive the SDK's request retry behavior. The +// Retryer implementation is responsible for implementing exponential backoff, +// and determine if a request API error should be retried. +// +// client.DefaultRetryer is the SDK's default implementation of the Retryer. It +// uses the which uses the Request.IsErrorRetryable and Request.IsErrorThrottle +// methods to determine if the request is retried. type Retryer interface { + // RetryRules return the retry delay that should be used by the SDK before + // making another request attempt for the failed request. RetryRules(*Request) time.Duration + + // ShouldRetry returns if the failed request is retryable. + // + // Implementations may consider request attempt count when determining if a + // request is retryable, but the SDK will use MaxRetries to limit the + // number of attempts a request are made. ShouldRetry(*Request) bool + + // MaxRetries is the number of times a request may be retried before + // failing. MaxRetries() int } -// WithRetryer sets a config Retryer value to the given Config returning it -// for chaining. +// WithRetryer sets a Retryer value to the given Config returning the Config +// value for chaining. The value must not be nil. func WithRetryer(cfg *aws.Config, retryer Retryer) *aws.Config { + if retryer == nil { + if cfg.Logger != nil { + cfg.Logger.Log("ERROR: Request.WithRetryer called with nil retryer. Replacing with retry disabled Retryer.") + } + retryer = noOpRetryer{} + } cfg.Retryer = retryer return cfg + +} + +// noOpRetryer is a internal no op retryer used when a request is created +// without a retryer. +// +// Provides a retryer that performs no retries. +// It should be used when we do not want retries to be performed. +type noOpRetryer struct{} + +// MaxRetries returns the number of maximum returns the service will use to make +// an individual API; For NoOpRetryer the MaxRetries will always be zero. +func (d noOpRetryer) MaxRetries() int { + return 0 +} + +// ShouldRetry will always return false for NoOpRetryer, as it should never retry. +func (d noOpRetryer) ShouldRetry(_ *Request) bool { + return false +} + +// RetryRules returns the delay duration before retrying this request again; +// since NoOpRetryer does not retry, RetryRules always returns 0. +func (d noOpRetryer) RetryRules(_ *Request) time.Duration { + return 0 } // retryableCodes is a collection of service response codes which are retry-able // without any further action. var retryableCodes = map[string]struct{}{ - "RequestError": {}, + ErrCodeRequestError: {}, "RequestTimeout": {}, ErrCodeResponseTimeout: {}, "RequestTimeoutException": {}, // Glacier's flavor of RequestTimeout @@ -34,12 +83,16 @@ var retryableCodes = map[string]struct{}{ var throttleCodes = map[string]struct{}{ "ProvisionedThroughputExceededException": {}, + "ThrottledException": {}, // SNS, XRay, ResourceGroupsTagging API "Throttling": {}, "ThrottlingException": {}, "RequestLimitExceeded": {}, "RequestThrottled": {}, + "RequestThrottledException": {}, "TooManyRequestsException": {}, // Lambda functions "PriorRequestNotComplete": {}, // Route53 + "TransactionInProgressException": {}, + "EC2ThrottledException": {}, // EC2 } // credsExpiredCodes is a collection of error codes which signify the credentials @@ -74,10 +127,6 @@ var validParentCodes = map[string]struct{}{ ErrCodeRead: {}, } -type temporaryError interface { - Temporary() bool -} - func isNestedErrorRetryable(parentErr awserr.Error) bool { if parentErr == nil { return false @@ -96,8 +145,8 @@ func isNestedErrorRetryable(parentErr awserr.Error) bool { return isCodeRetryable(aerr.Code()) } - if t, ok := err.(temporaryError); ok { - return t.Temporary() + if t, ok := err.(temporary); ok { + return t.Temporary() || isErrConnectionReset(err) } return isErrConnectionReset(err) @@ -106,32 +155,90 @@ func isNestedErrorRetryable(parentErr awserr.Error) bool { // IsErrorRetryable returns whether the error is retryable, based on its Code. // Returns false if error is nil. func IsErrorRetryable(err error) bool { - if err != nil { - if aerr, ok := err.(awserr.Error); ok { - return isCodeRetryable(aerr.Code()) || isNestedErrorRetryable(aerr) + if err == nil { + return false + } + return shouldRetryError(err) +} + +type temporary interface { + Temporary() bool +} + +func shouldRetryError(origErr error) bool { + switch err := origErr.(type) { + case awserr.Error: + if err.Code() == CanceledErrorCode { + return false } + if isNestedErrorRetryable(err) { + return true + } + + origErr := err.OrigErr() + var shouldRetry bool + if origErr != nil { + shouldRetry = shouldRetryError(origErr) + if err.Code() == ErrCodeRequestError && !shouldRetry { + return false + } + } + if isCodeRetryable(err.Code()) { + return true + } + return shouldRetry + + case *url.Error: + if strings.Contains(err.Error(), "connection refused") { + // Refused connections should be retried as the service may not yet + // be running on the port. Go TCP dial considers refused + // connections as not temporary. + return true + } + // *url.Error only implements Temporary after golang 1.6 but since + // url.Error only wraps the error: + return shouldRetryError(err.Err) + + case temporary: + if netErr, ok := err.(*net.OpError); ok && netErr.Op == "dial" { + return true + } + // If the error is temporary, we want to allow continuation of the + // retry process + return err.Temporary() || isErrConnectionReset(origErr) + + case nil: + // `awserr.Error.OrigErr()` can be nil, meaning there was an error but + // because we don't know the cause, it is marked as retryable. See + // TestRequest4xxUnretryable for an example. + return true + + default: + switch err.Error() { + case "net/http: request canceled", + "net/http: request canceled while waiting for connection": + // known 1.5 error case when an http request is cancelled + return false + } + // here we don't know the error; so we allow a retry. + return true } - return false } // IsErrorThrottle returns whether the error is to be throttled based on its code. // Returns false if error is nil. func IsErrorThrottle(err error) bool { - if err != nil { - if aerr, ok := err.(awserr.Error); ok { - return isCodeThrottle(aerr.Code()) - } + if aerr, ok := err.(awserr.Error); ok && aerr != nil { + return isCodeThrottle(aerr.Code()) } return false } -// IsErrorExpiredCreds returns whether the error code is a credential expiry error. -// Returns false if error is nil. +// IsErrorExpiredCreds returns whether the error code is a credential expiry +// error. Returns false if error is nil. func IsErrorExpiredCreds(err error) bool { - if err != nil { - if aerr, ok := err.(awserr.Error); ok { - return isCodeExpiredCreds(aerr.Code()) - } + if aerr, ok := err.(awserr.Error); ok && aerr != nil { + return isCodeExpiredCreds(aerr.Code()) } return false } @@ -141,17 +248,58 @@ func IsErrorExpiredCreds(err error) bool { // // Alias for the utility function IsErrorRetryable func (r *Request) IsErrorRetryable() bool { + if isErrCode(r.Error, r.RetryErrorCodes) { + return true + } + + // HTTP response status code 501 should not be retried. + // 501 represents Not Implemented which means the request method is not + // supported by the server and cannot be handled. + if r.HTTPResponse != nil { + // HTTP response status code 500 represents internal server error and + // should be retried without any throttle. + if r.HTTPResponse.StatusCode == 500 { + return true + } + } return IsErrorRetryable(r.Error) } -// IsErrorThrottle returns whether the error is to be throttled based on its code. -// Returns false if the request has no Error set +// IsErrorThrottle returns whether the error is to be throttled based on its +// code. Returns false if the request has no Error set. // // Alias for the utility function IsErrorThrottle func (r *Request) IsErrorThrottle() bool { + if isErrCode(r.Error, r.ThrottleErrorCodes) { + return true + } + + if r.HTTPResponse != nil { + switch r.HTTPResponse.StatusCode { + case + 429, // error caused due to too many requests + 502, // Bad Gateway error should be throttled + 503, // caused when service is unavailable + 504: // error occurred due to gateway timeout + return true + } + } + return IsErrorThrottle(r.Error) } +func isErrCode(err error, codes []string) bool { + if aerr, ok := err.(awserr.Error); ok && aerr != nil { + for _, code := range codes { + if code == aerr.Code() { + return true + } + } + } + + return false +} + // IsErrorExpired returns whether the error code is a credential expiry error. // Returns false if the request has no Error set. // diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/validation.go b/vendor/github.com/aws/aws-sdk-go/aws/request/validation.go index 401246228..8630683f3 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/request/validation.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/request/validation.go @@ -17,6 +17,12 @@ const ( ParamMinValueErrCode = "ParamMinValueError" // ParamMinLenErrCode is the error code for fields without enough elements. ParamMinLenErrCode = "ParamMinLenError" + // ParamMaxLenErrCode is the error code for value being too long. + ParamMaxLenErrCode = "ParamMaxLenError" + + // ParamFormatErrCode is the error code for a field with invalid + // format or characters. + ParamFormatErrCode = "ParamFormatInvalidError" ) // Validator provides a way for types to perform validation logic on their @@ -232,3 +238,49 @@ func NewErrParamMinLen(field string, min int) *ErrParamMinLen { func (e *ErrParamMinLen) MinLen() int { return e.min } + +// An ErrParamMaxLen represents a maximum length parameter error. +type ErrParamMaxLen struct { + errInvalidParam + max int +} + +// NewErrParamMaxLen creates a new maximum length parameter error. +func NewErrParamMaxLen(field string, max int, value string) *ErrParamMaxLen { + return &ErrParamMaxLen{ + errInvalidParam: errInvalidParam{ + code: ParamMaxLenErrCode, + field: field, + msg: fmt.Sprintf("maximum size of %v, %v", max, value), + }, + max: max, + } +} + +// MaxLen returns the field's required minimum length. +func (e *ErrParamMaxLen) MaxLen() int { + return e.max +} + +// An ErrParamFormat represents a invalid format parameter error. +type ErrParamFormat struct { + errInvalidParam + format string +} + +// NewErrParamFormat creates a new invalid format parameter error. +func NewErrParamFormat(field string, format, value string) *ErrParamFormat { + return &ErrParamFormat{ + errInvalidParam: errInvalidParam{ + code: ParamFormatErrCode, + field: field, + msg: fmt.Sprintf("format %v, %v", format, value), + }, + format: format, + } +} + +// Format returns the field's required format. +func (e *ErrParamFormat) Format() string { + return e.format +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport.go b/vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport.go new file mode 100644 index 000000000..ea9ebb6f6 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport.go @@ -0,0 +1,26 @@ +// +build go1.7 + +package session + +import ( + "net" + "net/http" + "time" +) + +// Transport that should be used when a custom CA bundle is specified with the +// SDK. +func getCABundleTransport() *http.Transport { + return &http.Transport{ + Proxy: http.ProxyFromEnvironment, + DialContext: (&net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + DualStack: true, + }).DialContext, + MaxIdleConns: 100, + IdleConnTimeout: 90 * time.Second, + TLSHandshakeTimeout: 10 * time.Second, + ExpectContinueTimeout: 1 * time.Second, + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport_1_5.go b/vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport_1_5.go new file mode 100644 index 000000000..fec39dfc1 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport_1_5.go @@ -0,0 +1,22 @@ +// +build !go1.6,go1.5 + +package session + +import ( + "net" + "net/http" + "time" +) + +// Transport that should be used when a custom CA bundle is specified with the +// SDK. +func getCABundleTransport() *http.Transport { + return &http.Transport{ + Proxy: http.ProxyFromEnvironment, + Dial: (&net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + }).Dial, + TLSHandshakeTimeout: 10 * time.Second, + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport_1_6.go b/vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport_1_6.go new file mode 100644 index 000000000..1c5a5391e --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport_1_6.go @@ -0,0 +1,23 @@ +// +build !go1.7,go1.6 + +package session + +import ( + "net" + "net/http" + "time" +) + +// Transport that should be used when a custom CA bundle is specified with the +// SDK. +func getCABundleTransport() *http.Transport { + return &http.Transport{ + Proxy: http.ProxyFromEnvironment, + Dial: (&net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + }).Dial, + TLSHandshakeTimeout: 10 * time.Second, + ExpectContinueTimeout: 1 * time.Second, + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/session/credentials.go b/vendor/github.com/aws/aws-sdk-go/aws/session/credentials.go new file mode 100644 index 000000000..cc64e24f1 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/session/credentials.go @@ -0,0 +1,259 @@ +package session + +import ( + "fmt" + "os" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/credentials/processcreds" + "github.com/aws/aws-sdk-go/aws/credentials/stscreds" + "github.com/aws/aws-sdk-go/aws/defaults" + "github.com/aws/aws-sdk-go/aws/request" + "github.com/aws/aws-sdk-go/internal/shareddefaults" +) + +func resolveCredentials(cfg *aws.Config, + envCfg envConfig, sharedCfg sharedConfig, + handlers request.Handlers, + sessOpts Options, +) (*credentials.Credentials, error) { + + switch { + case len(sessOpts.Profile) != 0: + // User explicitly provided an Profile in the session's configuration + // so load that profile from shared config first. + // Github(aws/aws-sdk-go#2727) + return resolveCredsFromProfile(cfg, envCfg, sharedCfg, handlers, sessOpts) + + case envCfg.Creds.HasKeys(): + // Environment credentials + return credentials.NewStaticCredentialsFromCreds(envCfg.Creds), nil + + case len(envCfg.WebIdentityTokenFilePath) != 0: + // Web identity token from environment, RoleARN required to also be + // set. + return assumeWebIdentity(cfg, handlers, + envCfg.WebIdentityTokenFilePath, + envCfg.RoleARN, + envCfg.RoleSessionName, + ) + + default: + // Fallback to the "default" credential resolution chain. + return resolveCredsFromProfile(cfg, envCfg, sharedCfg, handlers, sessOpts) + } +} + +// WebIdentityEmptyRoleARNErr will occur if 'AWS_WEB_IDENTITY_TOKEN_FILE' was set but +// 'AWS_ROLE_ARN' was not set. +var WebIdentityEmptyRoleARNErr = awserr.New(stscreds.ErrCodeWebIdentity, "role ARN is not set", nil) + +// WebIdentityEmptyTokenFilePathErr will occur if 'AWS_ROLE_ARN' was set but +// 'AWS_WEB_IDENTITY_TOKEN_FILE' was not set. +var WebIdentityEmptyTokenFilePathErr = awserr.New(stscreds.ErrCodeWebIdentity, "token file path is not set", nil) + +func assumeWebIdentity(cfg *aws.Config, handlers request.Handlers, + filepath string, + roleARN, sessionName string, +) (*credentials.Credentials, error) { + + if len(filepath) == 0 { + return nil, WebIdentityEmptyTokenFilePathErr + } + + if len(roleARN) == 0 { + return nil, WebIdentityEmptyRoleARNErr + } + + creds := stscreds.NewWebIdentityCredentials( + &Session{ + Config: cfg, + Handlers: handlers.Copy(), + }, + roleARN, + sessionName, + filepath, + ) + + return creds, nil +} + +func resolveCredsFromProfile(cfg *aws.Config, + envCfg envConfig, sharedCfg sharedConfig, + handlers request.Handlers, + sessOpts Options, +) (creds *credentials.Credentials, err error) { + + switch { + case sharedCfg.SourceProfile != nil: + // Assume IAM role with credentials source from a different profile. + creds, err = resolveCredsFromProfile(cfg, envCfg, + *sharedCfg.SourceProfile, handlers, sessOpts, + ) + + case sharedCfg.Creds.HasKeys(): + // Static Credentials from Shared Config/Credentials file. + creds = credentials.NewStaticCredentialsFromCreds( + sharedCfg.Creds, + ) + + case len(sharedCfg.CredentialProcess) != 0: + // Get credentials from CredentialProcess + creds = processcreds.NewCredentials(sharedCfg.CredentialProcess) + + case len(sharedCfg.CredentialSource) != 0: + creds, err = resolveCredsFromSource(cfg, envCfg, + sharedCfg, handlers, sessOpts, + ) + + case len(sharedCfg.WebIdentityTokenFile) != 0: + // Credentials from Assume Web Identity token require an IAM Role, and + // that roll will be assumed. May be wrapped with another assume role + // via SourceProfile. + return assumeWebIdentity(cfg, handlers, + sharedCfg.WebIdentityTokenFile, + sharedCfg.RoleARN, + sharedCfg.RoleSessionName, + ) + + default: + // Fallback to default credentials provider, include mock errors for + // the credential chain so user can identify why credentials failed to + // be retrieved. + creds = credentials.NewCredentials(&credentials.ChainProvider{ + VerboseErrors: aws.BoolValue(cfg.CredentialsChainVerboseErrors), + Providers: []credentials.Provider{ + &credProviderError{ + Err: awserr.New("EnvAccessKeyNotFound", + "failed to find credentials in the environment.", nil), + }, + &credProviderError{ + Err: awserr.New("SharedCredsLoad", + fmt.Sprintf("failed to load profile, %s.", envCfg.Profile), nil), + }, + defaults.RemoteCredProvider(*cfg, handlers), + }, + }) + } + if err != nil { + return nil, err + } + + if len(sharedCfg.RoleARN) > 0 { + cfgCp := *cfg + cfgCp.Credentials = creds + return credsFromAssumeRole(cfgCp, handlers, sharedCfg, sessOpts) + } + + return creds, nil +} + +// valid credential source values +const ( + credSourceEc2Metadata = "Ec2InstanceMetadata" + credSourceEnvironment = "Environment" + credSourceECSContainer = "EcsContainer" +) + +func resolveCredsFromSource(cfg *aws.Config, + envCfg envConfig, sharedCfg sharedConfig, + handlers request.Handlers, + sessOpts Options, +) (creds *credentials.Credentials, err error) { + + switch sharedCfg.CredentialSource { + case credSourceEc2Metadata: + p := defaults.RemoteCredProvider(*cfg, handlers) + creds = credentials.NewCredentials(p) + + case credSourceEnvironment: + creds = credentials.NewStaticCredentialsFromCreds(envCfg.Creds) + + case credSourceECSContainer: + if len(os.Getenv(shareddefaults.ECSCredsProviderEnvVar)) == 0 { + return nil, ErrSharedConfigECSContainerEnvVarEmpty + } + + p := defaults.RemoteCredProvider(*cfg, handlers) + creds = credentials.NewCredentials(p) + + default: + return nil, ErrSharedConfigInvalidCredSource + } + + return creds, nil +} + +func credsFromAssumeRole(cfg aws.Config, + handlers request.Handlers, + sharedCfg sharedConfig, + sessOpts Options, +) (*credentials.Credentials, error) { + + if len(sharedCfg.MFASerial) != 0 && sessOpts.AssumeRoleTokenProvider == nil { + // AssumeRole Token provider is required if doing Assume Role + // with MFA. + return nil, AssumeRoleTokenProviderNotSetError{} + } + + return stscreds.NewCredentials( + &Session{ + Config: &cfg, + Handlers: handlers.Copy(), + }, + sharedCfg.RoleARN, + func(opt *stscreds.AssumeRoleProvider) { + opt.RoleSessionName = sharedCfg.RoleSessionName + opt.Duration = sessOpts.AssumeRoleDuration + + // Assume role with external ID + if len(sharedCfg.ExternalID) > 0 { + opt.ExternalID = aws.String(sharedCfg.ExternalID) + } + + // Assume role with MFA + if len(sharedCfg.MFASerial) > 0 { + opt.SerialNumber = aws.String(sharedCfg.MFASerial) + opt.TokenProvider = sessOpts.AssumeRoleTokenProvider + } + }, + ), nil +} + +// AssumeRoleTokenProviderNotSetError is an error returned when creating a +// session when the MFAToken option is not set when shared config is configured +// load assume a role with an MFA token. +type AssumeRoleTokenProviderNotSetError struct{} + +// Code is the short id of the error. +func (e AssumeRoleTokenProviderNotSetError) Code() string { + return "AssumeRoleTokenProviderNotSetError" +} + +// Message is the description of the error +func (e AssumeRoleTokenProviderNotSetError) Message() string { + return fmt.Sprintf("assume role with MFA enabled, but AssumeRoleTokenProvider session option not set.") +} + +// OrigErr is the underlying error that caused the failure. +func (e AssumeRoleTokenProviderNotSetError) OrigErr() error { + return nil +} + +// Error satisfies the error interface. +func (e AssumeRoleTokenProviderNotSetError) Error() string { + return awserr.SprintError(e.Code(), e.Message(), "", nil) +} + +type credProviderError struct { + Err error +} + +func (c credProviderError) Retrieve() (credentials.Value, error) { + return credentials.Value{}, c.Err +} +func (c credProviderError) IsExpired() bool { + return true +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/session/doc.go b/vendor/github.com/aws/aws-sdk-go/aws/session/doc.go index ea7b886f8..7ec66e7e5 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/session/doc.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/session/doc.go @@ -1,97 +1,93 @@ /* -Package session provides configuration for the SDK's service clients. - -Sessions can be shared across all service clients that share the same base -configuration. The Session is built from the SDK's default configuration and -request handlers. - -Sessions should be cached when possible, because creating a new Session will -load all configuration values from the environment, and config files each time -the Session is created. Sharing the Session value across all of your service -clients will ensure the configuration is loaded the fewest number of times possible. - -Concurrency +Package session provides configuration for the SDK's service clients. Sessions +can be shared across service clients that share the same base configuration. Sessions are safe to use concurrently as long as the Session is not being -modified. The SDK will not modify the Session once the Session has been created. -Creating service clients concurrently from a shared Session is safe. - -Sessions from Shared Config - -Sessions can be created using the method above that will only load the -additional config if the AWS_SDK_LOAD_CONFIG environment variable is set. -Alternatively you can explicitly create a Session with shared config enabled. -To do this you can use NewSessionWithOptions to configure how the Session will -be created. Using the NewSessionWithOptions with SharedConfigState set to -SharedConfigEnable will create the session as if the AWS_SDK_LOAD_CONFIG -environment variable was set. +modified. Sessions should be cached when possible, because creating a new +Session will load all configuration values from the environment, and config +files each time the Session is created. Sharing the Session value across all of +your service clients will ensure the configuration is loaded the fewest number +of times possible. -Creating Sessions - -When creating Sessions optional aws.Config values can be passed in that will -override the default, or loaded config values the Session is being created -with. This allows you to provide additional, or case based, configuration -as needed. +Sessions options from Shared Config By default NewSession will only load credentials from the shared credentials file (~/.aws/credentials). If the AWS_SDK_LOAD_CONFIG environment variable is set to a truthy value the Session will be created from the configuration values from the shared config (~/.aws/config) and shared credentials -(~/.aws/credentials) files. See the section Sessions from Shared Config for -more information. +(~/.aws/credentials) files. Using the NewSessionWithOptions with +SharedConfigState set to SharedConfigEnable will create the session as if the +AWS_SDK_LOAD_CONFIG environment variable was set. -Create a Session with the default config and request handlers. With credentials -region, and profile loaded from the environment and shared config automatically. -Requires the AWS_PROFILE to be set, or "default" is used. +Credential and config loading order - // Create Session - sess := session.Must(session.NewSession()) +The Session will attempt to load configuration and credentials from the +environment, configuration files, and other credential sources. The order +configuration is loaded in is: - // Create a Session with a custom region - sess := session.Must(session.NewSession(&aws.Config{ - Region: aws.String("us-east-1"), - })) + * Environment Variables + * Shared Credentials file + * Shared Configuration file (if SharedConfig is enabled) + * EC2 Instance Metadata (credentials only) - // Create a S3 client instance from a session - sess := session.Must(session.NewSession()) +The Environment variables for credentials will have precedence over shared +config even if SharedConfig is enabled. To override this behavior, and use +shared config credentials instead specify the session.Options.Profile, (e.g. +when using credential_source=Environment to assume a role). + + sess, err := session.NewSessionWithOptions(session.Options{ + Profile: "myProfile", + }) - svc := s3.New(sess) +Creating Sessions -Create Session With Option Overrides +Creating a Session without additional options will load credentials region, and +profile loaded from the environment and shared config automatically. See, +"Environment Variables" section for information on environment variables used +by Session. -In addition to NewSession, Sessions can be created using NewSessionWithOptions. -This func allows you to control and override how the Session will be created -through code instead of being driven by environment variables only. + // Create Session + sess, err := session.NewSession() -Use NewSessionWithOptions when you want to provide the config profile, or -override the shared config state (AWS_SDK_LOAD_CONFIG). + +When creating Sessions optional aws.Config values can be passed in that will +override the default, or loaded, config values the Session is being created +with. This allows you to provide additional, or case based, configuration +as needed. + + // Create a Session with a custom region + sess, err := session.NewSession(&aws.Config{ + Region: aws.String("us-west-2"), + }) + +Use NewSessionWithOptions to provide additional configuration driving how the +Session's configuration will be loaded. Such as, specifying shared config +profile, or override the shared config state, (AWS_SDK_LOAD_CONFIG). // Equivalent to session.NewSession() - sess := session.Must(session.NewSessionWithOptions(session.Options{ + sess, err := session.NewSessionWithOptions(session.Options{ // Options - })) + }) - // Specify profile to load for the session's config - sess := session.Must(session.NewSessionWithOptions(session.Options{ - Profile: "profile_name", - })) + sess, err := session.NewSessionWithOptions(session.Options{ + // Specify profile to load for the session's config + Profile: "profile_name", - // Specify profile for config and region for requests - sess := session.Must(session.NewSessionWithOptions(session.Options{ - Config: aws.Config{Region: aws.String("us-east-1")}, - Profile: "profile_name", - })) + // Provide SDK Config options, such as Region. + Config: aws.Config{ + Region: aws.String("us-west-2"), + }, - // Force enable Shared Config support - sess := session.Must(session.NewSessionWithOptions(session.Options{ + // Force enable Shared Config support SharedConfigState: session.SharedConfigEnable, - })) + }) Adding Handlers -You can add handlers to a session for processing HTTP requests. All service -clients that use the session inherit the handlers. For example, the following -handler logs every request and its payload made by a service client: +You can add handlers to a session to decorate API operation, (e.g. adding HTTP +headers). All clients that use the Session receive a copy of the Session's +handlers. For example, the following request handler added to the Session logs +every requests made. // Create a session, and add additional handlers for all service // clients created with the Session to inherit. Adds logging handler. @@ -99,22 +95,15 @@ handler logs every request and its payload made by a service client: sess.Handlers.Send.PushFront(func(r *request.Request) { // Log every request made and its payload - logger.Println("Request: %s/%s, Payload: %s", + logger.Printf("Request: %s/%s, Params: %s", r.ClientInfo.ServiceName, r.Operation, r.Params) }) -Deprecated "New" function - -The New session function has been deprecated because it does not provide good -way to return errors that occur when loading the configuration files and values. -Because of this, NewSession was created so errors can be retrieved when -creating a session fails. - Shared Config Fields -By default the SDK will only load the shared credentials file's (~/.aws/credentials) -credentials values, and all other config is provided by the environment variables, -SDK defaults, and user provided aws.Config values. +By default the SDK will only load the shared credentials file's +(~/.aws/credentials) credentials values, and all other config is provided by +the environment variables, SDK defaults, and user provided aws.Config values. If the AWS_SDK_LOAD_CONFIG environment variable is set, or SharedConfigEnable option is used to create the Session the full shared config values will be @@ -125,24 +114,31 @@ files have the same format. If both config files are present the configuration from both files will be read. The Session will be created from configuration values from the shared -credentials file (~/.aws/credentials) over those in the shared config file (~/.aws/config). +credentials file (~/.aws/credentials) over those in the shared config file +(~/.aws/config). -Credentials are the values the SDK should use for authenticating requests with -AWS Services. They arfrom a configuration file will need to include both -aws_access_key_id and aws_secret_access_key must be provided together in the -same file to be considered valid. The values will be ignored if not a complete -group. aws_session_token is an optional field that can be provided if both of -the other two fields are also provided. +Credentials are the values the SDK uses to authenticating requests with AWS +Services. When specified in a file, both aws_access_key_id and +aws_secret_access_key must be provided together in the same file to be +considered valid. They will be ignored if both are not present. +aws_session_token is an optional field that can be provided in addition to the +other two fields. aws_access_key_id = AKID aws_secret_access_key = SECRET aws_session_token = TOKEN -Assume Role values allow you to configure the SDK to assume an IAM role using -a set of credentials provided in a config file via the source_profile field. -Both "role_arn" and "source_profile" are required. The SDK supports assuming -a role with MFA token if the session option AssumeRoleTokenProvider -is set. + ; region only supported if SharedConfigEnabled. + region = us-east-1 + +Assume Role configuration + +The role_arn field allows you to configure the SDK to assume an IAM role using +a set of credentials from another source. Such as when paired with static +credentials, "profile_source", "credential_process", or "credential_source" +fields. If "role_arn" is provided, a source of credentials must also be +specified, such as "source_profile", "credential_source", or +"credential_process". role_arn = arn:aws:iam:::role/ source_profile = profile_with_creds @@ -150,40 +146,16 @@ is set. mfa_serial = role_session_name = session_name -Region is the region the SDK should use for looking up AWS service endpoints -and signing requests. - - region = us-east-1 - -Assume Role with MFA token -To create a session with support for assuming an IAM role with MFA set the -session option AssumeRoleTokenProvider to a function that will prompt for the -MFA token code when the SDK assumes the role and refreshes the role's credentials. -This allows you to configure the SDK via the shared config to assumea role -with MFA tokens. - -In order for the SDK to assume a role with MFA the SharedConfigState -session option must be set to SharedConfigEnable, or AWS_SDK_LOAD_CONFIG -environment variable set. - -The shared configuration instructs the SDK to assume an IAM role with MFA -when the mfa_serial configuration field is set in the shared config -(~/.aws/config) or shared credentials (~/.aws/credentials) file. - -If mfa_serial is set in the configuration, the SDK will assume the role, and -the AssumeRoleTokenProvider session option is not set an an error will -be returned when creating the session. +The SDK supports assuming a role with MFA token. If "mfa_serial" is set, you +must also set the Session Option.AssumeRoleTokenProvider. The Session will fail +to load if the AssumeRoleTokenProvider is not specified. sess := session.Must(session.NewSessionWithOptions(session.Options{ AssumeRoleTokenProvider: stscreds.StdinTokenProvider, })) - // Create service client value configured for credentials - // from assumed role. - svc := s3.New(sess) - -To setup assume role outside of a session see the stscrds.AssumeRoleProvider +To setup Assume Role outside of a session see the stscreds.AssumeRoleProvider documentation. Environment Variables diff --git a/vendor/github.com/aws/aws-sdk-go/aws/session/env_config.go b/vendor/github.com/aws/aws-sdk-go/aws/session/env_config.go index 12b452177..c1e0e9c95 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/session/env_config.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/session/env_config.go @@ -1,11 +1,15 @@ package session import ( + "fmt" "os" "strconv" + "strings" + "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/defaults" + "github.com/aws/aws-sdk-go/aws/endpoints" ) // EnvProviderName provides a name of the provider when config is loaded from environment. @@ -79,7 +83,7 @@ type envConfig struct { // AWS_CONFIG_FILE=$HOME/my_shared_config SharedConfigFile string - // Sets the path to a custom Credentials Authroity (CA) Bundle PEM file + // Sets the path to a custom Credentials Authority (CA) Bundle PEM file // that the SDK will use instead of the system's root CA bundle. // Only use this if you want to configure the SDK to use a custom set // of CAs. @@ -96,9 +100,69 @@ type envConfig struct { // // AWS_CA_BUNDLE=$HOME/my_custom_ca_bundle CustomCABundle string + + csmEnabled string + CSMEnabled *bool + CSMPort string + CSMHost string + CSMClientID string + + // Enables endpoint discovery via environment variables. + // + // AWS_ENABLE_ENDPOINT_DISCOVERY=true + EnableEndpointDiscovery *bool + enableEndpointDiscovery string + + // Specifies the WebIdentity token the SDK should use to assume a role + // with. + // + // AWS_WEB_IDENTITY_TOKEN_FILE=file_path + WebIdentityTokenFilePath string + + // Specifies the IAM role arn to use when assuming an role. + // + // AWS_ROLE_ARN=role_arn + RoleARN string + + // Specifies the IAM role session name to use when assuming a role. + // + // AWS_ROLE_SESSION_NAME=session_name + RoleSessionName string + + // Specifies the STS Regional Endpoint flag for the SDK to resolve the endpoint + // for a service. + // + // AWS_STS_REGIONAL_ENDPOINTS=regional + // This can take value as `regional` or `legacy` + STSRegionalEndpoint endpoints.STSRegionalEndpoint + + // Specifies the S3 Regional Endpoint flag for the SDK to resolve the + // endpoint for a service. + // + // AWS_S3_US_EAST_1_REGIONAL_ENDPOINT=regional + // This can take value as `regional` or `legacy` + S3UsEast1RegionalEndpoint endpoints.S3UsEast1RegionalEndpoint + + // Specifies if the S3 service should allow ARNs to direct the region + // the client's requests are sent to. + // + // AWS_S3_USE_ARN_REGION=true + S3UseARNRegion bool } var ( + csmEnabledEnvKey = []string{ + "AWS_CSM_ENABLED", + } + csmHostEnvKey = []string{ + "AWS_CSM_HOST", + } + csmPortEnvKey = []string{ + "AWS_CSM_PORT", + } + csmClientIDEnvKey = []string{ + "AWS_CSM_CLIENT_ID", + } credAccessEnvKey = []string{ "AWS_ACCESS_KEY_ID", "AWS_ACCESS_KEY", @@ -111,6 +175,10 @@ var ( "AWS_SESSION_TOKEN", } + enableEndpointDiscoveryEnvKey = []string{ + "AWS_ENABLE_ENDPOINT_DISCOVERY", + } + regionEnvKeys = []string{ "AWS_REGION", "AWS_DEFAULT_REGION", // Only read if AWS_SDK_LOAD_CONFIG is also set @@ -125,6 +193,24 @@ var ( sharedConfigFileEnvKey = []string{ "AWS_CONFIG_FILE", } + webIdentityTokenFilePathEnvKey = []string{ + "AWS_WEB_IDENTITY_TOKEN_FILE", + } + roleARNEnvKey = []string{ + "AWS_ROLE_ARN", + } + roleSessionNameEnvKey = []string{ + "AWS_ROLE_SESSION_NAME", + } + stsRegionalEndpointKey = []string{ + "AWS_STS_REGIONAL_ENDPOINTS", + } + s3UsEast1RegionalEndpoint = []string{ + "AWS_S3_US_EAST_1_REGIONAL_ENDPOINT", + } + s3UseARNRegionEnvKey = []string{ + "AWS_S3_USE_ARN_REGION", + } ) // loadEnvConfig retrieves the SDK's environment configuration. @@ -133,7 +219,7 @@ var ( // If the environment variable `AWS_SDK_LOAD_CONFIG` is set to a truthy value // the shared SDK config will be loaded in addition to the SDK's specific // configuration values. -func loadEnvConfig() envConfig { +func loadEnvConfig() (envConfig, error) { enableSharedConfig, _ := strconv.ParseBool(os.Getenv("AWS_SDK_LOAD_CONFIG")) return envConfigLoad(enableSharedConfig) } @@ -144,24 +230,42 @@ func loadEnvConfig() envConfig { // Loads the shared configuration in addition to the SDK's specific configuration. // This will load the same values as `loadEnvConfig` if the `AWS_SDK_LOAD_CONFIG` // environment variable is set. -func loadSharedEnvConfig() envConfig { +func loadSharedEnvConfig() (envConfig, error) { return envConfigLoad(true) } -func envConfigLoad(enableSharedConfig bool) envConfig { +func envConfigLoad(enableSharedConfig bool) (envConfig, error) { cfg := envConfig{} cfg.EnableSharedConfig = enableSharedConfig - setFromEnvVal(&cfg.Creds.AccessKeyID, credAccessEnvKey) - setFromEnvVal(&cfg.Creds.SecretAccessKey, credSecretEnvKey) - setFromEnvVal(&cfg.Creds.SessionToken, credSessionEnvKey) + // Static environment credentials + var creds credentials.Value + setFromEnvVal(&creds.AccessKeyID, credAccessEnvKey) + setFromEnvVal(&creds.SecretAccessKey, credSecretEnvKey) + setFromEnvVal(&creds.SessionToken, credSessionEnvKey) + if creds.HasKeys() { + // Require logical grouping of credentials + creds.ProviderName = EnvProviderName + cfg.Creds = creds + } + + // Role Metadata + setFromEnvVal(&cfg.RoleARN, roleARNEnvKey) + setFromEnvVal(&cfg.RoleSessionName, roleSessionNameEnvKey) + + // Web identity environment variables + setFromEnvVal(&cfg.WebIdentityTokenFilePath, webIdentityTokenFilePathEnvKey) - // Require logical grouping of credentials - if len(cfg.Creds.AccessKeyID) == 0 || len(cfg.Creds.SecretAccessKey) == 0 { - cfg.Creds = credentials.Value{} - } else { - cfg.Creds.ProviderName = EnvProviderName + // CSM environment variables + setFromEnvVal(&cfg.csmEnabled, csmEnabledEnvKey) + setFromEnvVal(&cfg.CSMHost, csmHostEnvKey) + setFromEnvVal(&cfg.CSMPort, csmPortEnvKey) + setFromEnvVal(&cfg.CSMClientID, csmClientIDEnvKey) + + if len(cfg.csmEnabled) != 0 { + v, _ := strconv.ParseBool(cfg.csmEnabled) + cfg.CSMEnabled = &v } regionKeys := regionEnvKeys @@ -174,6 +278,12 @@ func envConfigLoad(enableSharedConfig bool) envConfig { setFromEnvVal(&cfg.Region, regionKeys) setFromEnvVal(&cfg.Profile, profileKeys) + // endpoint discovery is in reference to it being enabled. + setFromEnvVal(&cfg.enableEndpointDiscovery, enableEndpointDiscoveryEnvKey) + if len(cfg.enableEndpointDiscovery) > 0 { + cfg.EnableEndpointDiscovery = aws.Bool(cfg.enableEndpointDiscovery != "false") + } + setFromEnvVal(&cfg.SharedCredentialsFile, sharedCredsFileEnvKey) setFromEnvVal(&cfg.SharedConfigFile, sharedConfigFileEnvKey) @@ -186,12 +296,48 @@ func envConfigLoad(enableSharedConfig bool) envConfig { cfg.CustomCABundle = os.Getenv("AWS_CA_BUNDLE") - return cfg + var err error + // STS Regional Endpoint variable + for _, k := range stsRegionalEndpointKey { + if v := os.Getenv(k); len(v) != 0 { + cfg.STSRegionalEndpoint, err = endpoints.GetSTSRegionalEndpoint(v) + if err != nil { + return cfg, fmt.Errorf("failed to load, %v from env config, %v", k, err) + } + } + } + + // S3 Regional Endpoint variable + for _, k := range s3UsEast1RegionalEndpoint { + if v := os.Getenv(k); len(v) != 0 { + cfg.S3UsEast1RegionalEndpoint, err = endpoints.GetS3UsEast1RegionalEndpoint(v) + if err != nil { + return cfg, fmt.Errorf("failed to load, %v from env config, %v", k, err) + } + } + } + + var s3UseARNRegion string + setFromEnvVal(&s3UseARNRegion, s3UseARNRegionEnvKey) + if len(s3UseARNRegion) != 0 { + switch { + case strings.EqualFold(s3UseARNRegion, "false"): + cfg.S3UseARNRegion = false + case strings.EqualFold(s3UseARNRegion, "true"): + cfg.S3UseARNRegion = true + default: + return envConfig{}, fmt.Errorf( + "invalid value for environment variable, %s=%s, need true or false", + s3UseARNRegionEnvKey[0], s3UseARNRegion) + } + } + + return cfg, nil } func setFromEnvVal(dst *string, keys []string) { for _, k := range keys { - if v := os.Getenv(k); len(v) > 0 { + if v := os.Getenv(k); len(v) != 0 { *dst = v break } diff --git a/vendor/github.com/aws/aws-sdk-go/aws/session/session.go b/vendor/github.com/aws/aws-sdk-go/aws/session/session.go index 259b5c0fe..0ff499605 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/session/session.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/session/session.go @@ -8,18 +8,36 @@ import ( "io/ioutil" "net/http" "os" + "time" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/aws/client" "github.com/aws/aws-sdk-go/aws/corehandlers" "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/credentials/stscreds" + "github.com/aws/aws-sdk-go/aws/csm" "github.com/aws/aws-sdk-go/aws/defaults" "github.com/aws/aws-sdk-go/aws/endpoints" "github.com/aws/aws-sdk-go/aws/request" ) +const ( + // ErrCodeSharedConfig represents an error that occurs in the shared + // configuration logic + ErrCodeSharedConfig = "SharedConfigErr" +) + +// ErrSharedConfigSourceCollision will be returned if a section contains both +// source_profile and credential_source +var ErrSharedConfigSourceCollision = awserr.New(ErrCodeSharedConfig, "only source profile or credential source can be specified, not both", nil) + +// ErrSharedConfigECSContainerEnvVarEmpty will be returned if the environment +// variables are empty and Environment was set as the credential source +var ErrSharedConfigECSContainerEnvVarEmpty = awserr.New(ErrCodeSharedConfig, "EcsContainer was specified as the credential_source, but 'AWS_CONTAINER_CREDENTIALS_RELATIVE_URI' was not set", nil) + +// ErrSharedConfigInvalidCredSource will be returned if an invalid credential source was provided +var ErrSharedConfigInvalidCredSource = awserr.New(ErrCodeSharedConfig, "credential source values must be EcsContainer, Ec2InstanceMetadata, or Environment", nil) + // A Session provides a central location to create service clients from and // store configurations and request handlers for those services. // @@ -55,7 +73,7 @@ type Session struct { // func is called instead of waiting to receive an error until a request is made. func New(cfgs ...*aws.Config) *Session { // load initial config from environment - envCfg := loadEnvConfig() + envCfg, envErr := loadEnvConfig() if envCfg.EnableSharedConfig { var cfg aws.Config @@ -75,16 +93,31 @@ func New(cfgs ...*aws.Config) *Session { // Session creation failed, need to report the error and prevent // any requests from succeeding. s = &Session{Config: defaults.Config()} - s.Config.MergeIn(cfgs...) - s.Config.Logger.Log("ERROR:", msg, "Error:", err) - s.Handlers.Validate.PushBack(func(r *request.Request) { - r.Error = err - }) + s.logDeprecatedNewSessionError(msg, err, cfgs) } + return s } - return deprecatedNewSession(cfgs...) + s := deprecatedNewSession(cfgs...) + if envErr != nil { + msg := "failed to load env config" + s.logDeprecatedNewSessionError(msg, envErr, cfgs) + } + + if csmCfg, err := loadCSMConfig(envCfg, []string{}); err != nil { + if l := s.Config.Logger; l != nil { + l.Log(fmt.Sprintf("ERROR: failed to load CSM configuration, %v", err)) + } + } else if csmCfg.Enabled { + err := enableCSM(&s.Handlers, csmCfg, s.Config.Logger) + if err != nil { + msg := "failed to enable CSM" + s.logDeprecatedNewSessionError(msg, err, cfgs) + } + } + + return s } // NewSession returns a new Session created from SDK defaults, config files, @@ -100,7 +133,7 @@ func New(cfgs ...*aws.Config) *Session { // to be built with retrieving credentials with AssumeRole set in the config. // // See the NewSessionWithOptions func for information on how to override or -// control through code how the Session will be created. Such as specifying the +// control through code how the Session will be created, such as specifying the // config profile, and controlling if shared config is enabled or not. func NewSession(cfgs ...*aws.Config) (*Session, error) { opts := Options{} @@ -184,6 +217,12 @@ type Options struct { // the config enables assume role wit MFA via the mfa_serial field. AssumeRoleTokenProvider func() (string, error) + // When the SDK's shared config is configured to assume a role this option + // may be provided to set the expiry duration of the STS credentials. + // Defaults to 15 minutes if not set as documented in the + // stscreds.AssumeRoleProvider. + AssumeRoleDuration time.Duration + // Reader for a custom Credentials Authority (CA) bundle in PEM format that // the SDK will use instead of the default system's root CA bundle. Use this // only if you want to replace the CA bundle the SDK uses for TLS requests. @@ -198,6 +237,12 @@ type Options struct { // to also enable this feature. CustomCABundle session option field has priority // over the AWS_CA_BUNDLE environment variable, and will be used if both are set. CustomCABundle io.Reader + + // The handlers that the session and all API clients will be created with. + // This must be a complete set of handlers. Use the defaults.Handlers() + // function to initialize this value before changing the handlers to be + // used by the SDK. + Handlers request.Handlers } // NewSessionWithOptions returns a new Session created from SDK defaults, config files, @@ -231,13 +276,20 @@ type Options struct { // })) func NewSessionWithOptions(opts Options) (*Session, error) { var envCfg envConfig + var err error if opts.SharedConfigState == SharedConfigEnable { - envCfg = loadSharedEnvConfig() + envCfg, err = loadSharedEnvConfig() + if err != nil { + return nil, fmt.Errorf("failed to load shared config, %v", err) + } } else { - envCfg = loadEnvConfig() + envCfg, err = loadEnvConfig() + if err != nil { + return nil, fmt.Errorf("failed to load environment config, %v", err) + } } - if len(opts.Profile) > 0 { + if len(opts.Profile) != 0 { envCfg.Profile = opts.Profile } @@ -300,18 +352,36 @@ func deprecatedNewSession(cfgs ...*aws.Config) *Session { } initHandlers(s) - return s } +func enableCSM(handlers *request.Handlers, cfg csmConfig, logger aws.Logger) error { + if logger != nil { + logger.Log("Enabling CSM") + } + + r, err := csm.Start(cfg.ClientID, csm.AddressWithDefaults(cfg.Host, cfg.Port)) + if err != nil { + return err + } + r.InjectHandlers(handlers) + + return nil +} + func newSession(opts Options, envCfg envConfig, cfgs ...*aws.Config) (*Session, error) { cfg := defaults.Config() - handlers := defaults.Handlers() + + handlers := opts.Handlers + if handlers.IsEmpty() { + handlers = defaults.Handlers() + } // Get a merged version of the user provided config to determine if // credentials were. userCfg := &aws.Config{} userCfg.MergeIn(cfgs...) + cfg.MergeIn(userCfg) // Ordered config files will be loaded in with later files overwriting // previous config file values. @@ -328,9 +398,17 @@ func newSession(opts Options, envCfg envConfig, cfgs ...*aws.Config) (*Session, } // Load additional config from file(s) - sharedCfg, err := loadSharedConfig(envCfg.Profile, cfgFiles) + sharedCfg, err := loadSharedConfig(envCfg.Profile, cfgFiles, envCfg.EnableSharedConfig) if err != nil { - return nil, err + if len(envCfg.Profile) == 0 && !envCfg.EnableSharedConfig && (envCfg.Creds.HasKeys() || userCfg.Credentials != nil) { + // Special case where the user has not explicitly specified an AWS_PROFILE, + // or session.Options.profile, shared config is not enabled, and the + // environment has credentials, allow the shared config file to fail to + // load since the user has already provided credentials, and nothing else + // is required to be read file. Github(aws/aws-sdk-go#2455) + } else if _, ok := err.(SharedConfigProfileNotExistsError); !ok { + return nil, err + } } if err := mergeConfigSrcs(cfg, userCfg, envCfg, sharedCfg, handlers, opts); err != nil { @@ -344,6 +422,17 @@ func newSession(opts Options, envCfg envConfig, cfgs ...*aws.Config) (*Session, initHandlers(s) + if csmCfg, err := loadCSMConfig(envCfg, cfgFiles); err != nil { + if l := s.Config.Logger; l != nil { + l.Log(fmt.Sprintf("ERROR: failed to load CSM configuration, %v", err)) + } + } else if csmCfg.Enabled { + err = enableCSM(&s.Handlers, csmCfg, s.Config.Logger) + if err != nil { + return nil, err + } + } + // Setup HTTP client with custom cert bundle if enabled if opts.CustomCABundle != nil { if err := loadCustomCABundle(s, opts.CustomCABundle); err != nil { @@ -354,6 +443,46 @@ func newSession(opts Options, envCfg envConfig, cfgs ...*aws.Config) (*Session, return s, nil } +type csmConfig struct { + Enabled bool + Host string + Port string + ClientID string +} + +var csmProfileName = "aws_csm" + +func loadCSMConfig(envCfg envConfig, cfgFiles []string) (csmConfig, error) { + if envCfg.CSMEnabled != nil { + if *envCfg.CSMEnabled { + return csmConfig{ + Enabled: true, + ClientID: envCfg.CSMClientID, + Host: envCfg.CSMHost, + Port: envCfg.CSMPort, + }, nil + } + return csmConfig{}, nil + } + + sharedCfg, err := loadSharedConfig(csmProfileName, cfgFiles, false) + if err != nil { + if _, ok := err.(SharedConfigProfileNotExistsError); !ok { + return csmConfig{}, err + } + } + if sharedCfg.CSMEnabled != nil && *sharedCfg.CSMEnabled == true { + return csmConfig{ + Enabled: true, + ClientID: sharedCfg.CSMClientID, + Host: sharedCfg.CSMHost, + Port: sharedCfg.CSMPort, + }, nil + } + + return csmConfig{}, nil +} + func loadCustomCABundle(s *Session, bundle io.Reader) error { var t *http.Transport switch v := s.Config.HTTPClient.Transport.(type) { @@ -366,7 +495,10 @@ func loadCustomCABundle(s *Session, bundle io.Reader) error { } } if t == nil { - t = &http.Transport{} + // Nil transport implies `http.DefaultTransport` should be used. Since + // the SDK cannot modify, nor copy the `DefaultTransport` specifying + // the values the next closest behavior. + t = getCABundleTransport() } p, err := loadCertPool(bundle) @@ -399,9 +531,11 @@ func loadCertPool(r io.Reader) (*x509.CertPool, error) { return p, nil } -func mergeConfigSrcs(cfg, userCfg *aws.Config, envCfg envConfig, sharedCfg sharedConfig, handlers request.Handlers, sessOpts Options) error { - // Merge in user provided configuration - cfg.MergeIn(userCfg) +func mergeConfigSrcs(cfg, userCfg *aws.Config, + envCfg envConfig, sharedCfg sharedConfig, + handlers request.Handlers, + sessOpts Options, +) error { // Region if not already set by user if len(aws.StringValue(cfg.Region)) == 0 { @@ -412,101 +546,67 @@ func mergeConfigSrcs(cfg, userCfg *aws.Config, envCfg envConfig, sharedCfg share } } - // Configure credentials if not already set - if cfg.Credentials == credentials.AnonymousCredentials && userCfg.Credentials == nil { - if len(envCfg.Creds.AccessKeyID) > 0 { - cfg.Credentials = credentials.NewStaticCredentialsFromCreds( - envCfg.Creds, - ) - } else if envCfg.EnableSharedConfig && len(sharedCfg.AssumeRole.RoleARN) > 0 && sharedCfg.AssumeRoleSource != nil { - cfgCp := *cfg - cfgCp.Credentials = credentials.NewStaticCredentialsFromCreds( - sharedCfg.AssumeRoleSource.Creds, - ) - if len(sharedCfg.AssumeRole.MFASerial) > 0 && sessOpts.AssumeRoleTokenProvider == nil { - // AssumeRole Token provider is required if doing Assume Role - // with MFA. - return AssumeRoleTokenProviderNotSetError{} - } - cfg.Credentials = stscreds.NewCredentials( - &Session{ - Config: &cfgCp, - Handlers: handlers.Copy(), - }, - sharedCfg.AssumeRole.RoleARN, - func(opt *stscreds.AssumeRoleProvider) { - opt.RoleSessionName = sharedCfg.AssumeRole.RoleSessionName - - // Assume role with external ID - if len(sharedCfg.AssumeRole.ExternalID) > 0 { - opt.ExternalID = aws.String(sharedCfg.AssumeRole.ExternalID) - } - - // Assume role with MFA - if len(sharedCfg.AssumeRole.MFASerial) > 0 { - opt.SerialNumber = aws.String(sharedCfg.AssumeRole.MFASerial) - opt.TokenProvider = sessOpts.AssumeRoleTokenProvider - } - }, - ) - } else if len(sharedCfg.Creds.AccessKeyID) > 0 { - cfg.Credentials = credentials.NewStaticCredentialsFromCreds( - sharedCfg.Creds, - ) - } else { - // Fallback to default credentials provider, include mock errors - // for the credential chain so user can identify why credentials - // failed to be retrieved. - cfg.Credentials = credentials.NewCredentials(&credentials.ChainProvider{ - VerboseErrors: aws.BoolValue(cfg.CredentialsChainVerboseErrors), - Providers: []credentials.Provider{ - &credProviderError{Err: awserr.New("EnvAccessKeyNotFound", "failed to find credentials in the environment.", nil)}, - &credProviderError{Err: awserr.New("SharedCredsLoad", fmt.Sprintf("failed to load profile, %s.", envCfg.Profile), nil)}, - defaults.RemoteCredProvider(*cfg, handlers), - }, - }) + if cfg.EnableEndpointDiscovery == nil { + if envCfg.EnableEndpointDiscovery != nil { + cfg.WithEndpointDiscovery(*envCfg.EnableEndpointDiscovery) + } else if envCfg.EnableSharedConfig && sharedCfg.EnableEndpointDiscovery != nil { + cfg.WithEndpointDiscovery(*sharedCfg.EnableEndpointDiscovery) } } - return nil -} - -// AssumeRoleTokenProviderNotSetError is an error returned when creating a session when the -// MFAToken option is not set when shared config is configured load assume a -// role with an MFA token. -type AssumeRoleTokenProviderNotSetError struct{} - -// Code is the short id of the error. -func (e AssumeRoleTokenProviderNotSetError) Code() string { - return "AssumeRoleTokenProviderNotSetError" -} + // Regional Endpoint flag for STS endpoint resolving + mergeSTSRegionalEndpointConfig(cfg, []endpoints.STSRegionalEndpoint{ + userCfg.STSRegionalEndpoint, + envCfg.STSRegionalEndpoint, + sharedCfg.STSRegionalEndpoint, + endpoints.LegacySTSEndpoint, + }) + + // Regional Endpoint flag for S3 endpoint resolving + mergeS3UsEast1RegionalEndpointConfig(cfg, []endpoints.S3UsEast1RegionalEndpoint{ + userCfg.S3UsEast1RegionalEndpoint, + envCfg.S3UsEast1RegionalEndpoint, + sharedCfg.S3UsEast1RegionalEndpoint, + endpoints.LegacyS3UsEast1Endpoint, + }) + + // Configure credentials if not already set by the user when creating the + // Session. + if cfg.Credentials == credentials.AnonymousCredentials && userCfg.Credentials == nil { + creds, err := resolveCredentials(cfg, envCfg, sharedCfg, handlers, sessOpts) + if err != nil { + return err + } + cfg.Credentials = creds + } -// Message is the description of the error -func (e AssumeRoleTokenProviderNotSetError) Message() string { - return fmt.Sprintf("assume role with MFA enabled, but AssumeRoleTokenProvider session option not set.") -} + cfg.S3UseARNRegion = userCfg.S3UseARNRegion + if cfg.S3UseARNRegion == nil { + cfg.S3UseARNRegion = &envCfg.S3UseARNRegion + } + if cfg.S3UseARNRegion == nil { + cfg.S3UseARNRegion = &sharedCfg.S3UseARNRegion + } -// OrigErr is the underlying error that caused the failure. -func (e AssumeRoleTokenProviderNotSetError) OrigErr() error { return nil } -// Error satisfies the error interface. -func (e AssumeRoleTokenProviderNotSetError) Error() string { - return awserr.SprintError(e.Code(), e.Message(), "", nil) -} - -type credProviderError struct { - Err error +func mergeSTSRegionalEndpointConfig(cfg *aws.Config, values []endpoints.STSRegionalEndpoint) { + for _, v := range values { + if v != endpoints.UnsetSTSEndpoint { + cfg.STSRegionalEndpoint = v + break + } + } } -var emptyCreds = credentials.Value{} - -func (c credProviderError) Retrieve() (credentials.Value, error) { - return credentials.Value{}, c.Err -} -func (c credProviderError) IsExpired() bool { - return true +func mergeS3UsEast1RegionalEndpointConfig(cfg *aws.Config, values []endpoints.S3UsEast1RegionalEndpoint) { + for _, v := range values { + if v != endpoints.UnsetS3UsEast1Endpoint { + cfg.S3UsEast1RegionalEndpoint = v + break + } + } } func initHandlers(s *Session) { @@ -517,7 +617,7 @@ func initHandlers(s *Session) { } } -// Copy creates and returns a copy of the current Session, coping the config +// Copy creates and returns a copy of the current Session, copying the config // and handlers. If any additional configs are provided they will be merged // on top of the Session's copied config. // @@ -537,47 +637,67 @@ func (s *Session) Copy(cfgs ...*aws.Config) *Session { // ClientConfig satisfies the client.ConfigProvider interface and is used to // configure the service client instances. Passing the Session to the service // client's constructor (New) will use this method to configure the client. -func (s *Session) ClientConfig(serviceName string, cfgs ...*aws.Config) client.Config { - // Backwards compatibility, the error will be eaten if user calls ClientConfig - // directly. All SDK services will use ClientconfigWithError. - cfg, _ := s.clientConfigWithErr(serviceName, cfgs...) - - return cfg -} - -func (s *Session) clientConfigWithErr(serviceName string, cfgs ...*aws.Config) (client.Config, error) { +func (s *Session) ClientConfig(service string, cfgs ...*aws.Config) client.Config { s = s.Copy(cfgs...) - var resolved endpoints.ResolvedEndpoint - var err error - region := aws.StringValue(s.Config.Region) - - if endpoint := aws.StringValue(s.Config.Endpoint); len(endpoint) != 0 { - resolved.URL = endpoints.AddScheme(endpoint, aws.BoolValue(s.Config.DisableSSL)) - resolved.SigningRegion = region - } else { - resolved, err = s.Config.EndpointResolver.EndpointFor( - serviceName, region, - func(opt *endpoints.Options) { - opt.DisableSSL = aws.BoolValue(s.Config.DisableSSL) - opt.UseDualStack = aws.BoolValue(s.Config.UseDualStack) - - // Support the condition where the service is modeled but its - // endpoint metadata is not available. - opt.ResolveUnknownService = true - }, - ) + resolved, err := s.resolveEndpoint(service, region, s.Config) + if err != nil { + s.Handlers.Validate.PushBack(func(r *request.Request) { + if len(r.ClientInfo.Endpoint) != 0 { + // Error occurred while resolving endpoint, but the request + // being invoked has had an endpoint specified after the client + // was created. + return + } + r.Error = err + }) } return client.Config{ Config: s.Config, Handlers: s.Handlers, + PartitionID: resolved.PartitionID, Endpoint: resolved.URL, SigningRegion: resolved.SigningRegion, SigningNameDerived: resolved.SigningNameDerived, SigningName: resolved.SigningName, - }, err + } +} + +func (s *Session) resolveEndpoint(service, region string, cfg *aws.Config) (endpoints.ResolvedEndpoint, error) { + + if ep := aws.StringValue(cfg.Endpoint); len(ep) != 0 { + return endpoints.ResolvedEndpoint{ + URL: endpoints.AddScheme(ep, aws.BoolValue(cfg.DisableSSL)), + SigningRegion: region, + }, nil + } + + resolved, err := cfg.EndpointResolver.EndpointFor(service, region, + func(opt *endpoints.Options) { + opt.DisableSSL = aws.BoolValue(cfg.DisableSSL) + opt.UseDualStack = aws.BoolValue(cfg.UseDualStack) + // Support for STSRegionalEndpoint where the STSRegionalEndpoint is + // provided in envConfig or sharedConfig with envConfig getting + // precedence. + opt.STSRegionalEndpoint = cfg.STSRegionalEndpoint + + // Support for S3UsEast1RegionalEndpoint where the S3UsEast1RegionalEndpoint is + // provided in envConfig or sharedConfig with envConfig getting + // precedence. + opt.S3UsEast1RegionalEndpoint = cfg.S3UsEast1RegionalEndpoint + + // Support the condition where the service is modeled but its + // endpoint metadata is not available. + opt.ResolveUnknownService = true + }, + ) + if err != nil { + return endpoints.ResolvedEndpoint{}, err + } + + return resolved, nil } // ClientConfigNoResolveEndpoint is the same as ClientConfig with the exception @@ -587,12 +707,9 @@ func (s *Session) ClientConfigNoResolveEndpoint(cfgs ...*aws.Config) client.Conf s = s.Copy(cfgs...) var resolved endpoints.ResolvedEndpoint - - region := aws.StringValue(s.Config.Region) - if ep := aws.StringValue(s.Config.Endpoint); len(ep) > 0 { resolved.URL = endpoints.AddScheme(ep, aws.BoolValue(s.Config.DisableSSL)) - resolved.SigningRegion = region + resolved.SigningRegion = aws.StringValue(s.Config.Region) } return client.Config{ @@ -604,3 +721,14 @@ func (s *Session) ClientConfigNoResolveEndpoint(cfgs ...*aws.Config) client.Conf SigningName: resolved.SigningName, } } + +// logDeprecatedNewSessionError function enables error handling for session +func (s *Session) logDeprecatedNewSessionError(msg string, err error, cfgs []*aws.Config) { + // Session creation failed, need to report the error and prevent + // any requests from succeeding. + s.Config.MergeIn(cfgs...) + s.Config.Logger.Log("ERROR:", msg, "Error:", err) + s.Handlers.Validate.PushBack(func(r *request.Request) { + r.Error = err + }) +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/session/shared_config.go b/vendor/github.com/aws/aws-sdk-go/aws/session/shared_config.go index 09c8e5bc7..a8ed88076 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/session/shared_config.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/session/shared_config.go @@ -2,11 +2,11 @@ package session import ( "fmt" - "io/ioutil" "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/go-ini/ini" + "github.com/aws/aws-sdk-go/aws/endpoints" + "github.com/aws/aws-sdk-go/internal/ini" ) const ( @@ -16,68 +16,125 @@ const ( sessionTokenKey = `aws_session_token` // optional // Assume Role Credentials group - roleArnKey = `role_arn` // group required - sourceProfileKey = `source_profile` // group required - externalIDKey = `external_id` // optional - mfaSerialKey = `mfa_serial` // optional - roleSessionNameKey = `role_session_name` // optional + roleArnKey = `role_arn` // group required + sourceProfileKey = `source_profile` // group required (or credential_source) + credentialSourceKey = `credential_source` // group required (or source_profile) + externalIDKey = `external_id` // optional + mfaSerialKey = `mfa_serial` // optional + roleSessionNameKey = `role_session_name` // optional + + // CSM options + csmEnabledKey = `csm_enabled` + csmHostKey = `csm_host` + csmPortKey = `csm_port` + csmClientIDKey = `csm_client_id` // Additional Config fields regionKey = `region` + // endpoint discovery group + enableEndpointDiscoveryKey = `endpoint_discovery_enabled` // optional + + // External Credential Process + credentialProcessKey = `credential_process` // optional + + // Web Identity Token File + webIdentityTokenFileKey = `web_identity_token_file` // optional + + // Additional config fields for regional or legacy endpoints + stsRegionalEndpointSharedKey = `sts_regional_endpoints` + + // Additional config fields for regional or legacy endpoints + s3UsEast1RegionalSharedKey = `s3_us_east_1_regional_endpoint` + // DefaultSharedConfigProfile is the default profile to be used when // loading configuration from the config files if another profile name // is not provided. DefaultSharedConfigProfile = `default` -) -type assumeRoleConfig struct { - RoleARN string - SourceProfile string - ExternalID string - MFASerial string - RoleSessionName string -} + // S3 ARN Region Usage + s3UseARNRegionKey = "s3_use_arn_region" +) // sharedConfig represents the configuration fields of the SDK config files. type sharedConfig struct { - // Credentials values from the config file. Both aws_access_key_id - // and aws_secret_access_key must be provided together in the same file - // to be considered valid. The values will be ignored if not a complete group. - // aws_session_token is an optional field that can be provided if both of the - // other two fields are also provided. + // Credentials values from the config file. Both aws_access_key_id and + // aws_secret_access_key must be provided together in the same file to be + // considered valid. The values will be ignored if not a complete group. + // aws_session_token is an optional field that can be provided if both of + // the other two fields are also provided. // // aws_access_key_id // aws_secret_access_key // aws_session_token Creds credentials.Value - AssumeRole assumeRoleConfig - AssumeRoleSource *sharedConfig + CredentialSource string + CredentialProcess string + WebIdentityTokenFile string - // Region is the region the SDK should use for looking up AWS service endpoints - // and signing requests. + RoleARN string + RoleSessionName string + ExternalID string + MFASerial string + + SourceProfileName string + SourceProfile *sharedConfig + + // Region is the region the SDK should use for looking up AWS service + // endpoints and signing requests. // // region Region string + + // EnableEndpointDiscovery can be enabled in the shared config by setting + // endpoint_discovery_enabled to true + // + // endpoint_discovery_enabled = true + EnableEndpointDiscovery *bool + + // CSM Options + CSMEnabled *bool + CSMHost string + CSMPort string + CSMClientID string + + // Specifies the Regional Endpoint flag for the SDK to resolve the endpoint for a service + // + // sts_regional_endpoints = regional + // This can take value as `LegacySTSEndpoint` or `RegionalSTSEndpoint` + STSRegionalEndpoint endpoints.STSRegionalEndpoint + + // Specifies the Regional Endpoint flag for the SDK to resolve the endpoint for a service + // + // s3_us_east_1_regional_endpoint = regional + // This can take value as `LegacyS3UsEast1Endpoint` or `RegionalS3UsEast1Endpoint` + S3UsEast1RegionalEndpoint endpoints.S3UsEast1RegionalEndpoint + + // Specifies if the S3 service should allow ARNs to direct the region + // the client's requests are sent to. + // + // s3_use_arn_region=true + S3UseARNRegion bool } type sharedConfigFile struct { Filename string - IniData *ini.File + IniData ini.Sections } -// loadSharedConfig retrieves the configuration from the list of files -// using the profile provided. The order the files are listed will determine +// loadSharedConfig retrieves the configuration from the list of files using +// the profile provided. The order the files are listed will determine // precedence. Values in subsequent files will overwrite values defined in // earlier files. // // For example, given two files A and B. Both define credentials. If the order -// of the files are A then B, B's credential values will be used instead of A's. +// of the files are A then B, B's credential values will be used instead of +// A's. // // See sharedConfig.setFromFile for information how the config files // will be loaded. -func loadSharedConfig(profile string, filenames []string) (sharedConfig, error) { +func loadSharedConfig(profile string, filenames []string, exOpts bool) (sharedConfig, error) { if len(profile) == 0 { profile = DefaultSharedConfigProfile } @@ -88,16 +145,11 @@ func loadSharedConfig(profile string, filenames []string) (sharedConfig, error) } cfg := sharedConfig{} - if err = cfg.setFromIniFiles(profile, files); err != nil { + profiles := map[string]struct{}{} + if err = cfg.setFromIniFiles(profiles, profile, files, exOpts); err != nil { return sharedConfig{}, err } - if len(cfg.AssumeRole.SourceProfile) > 0 { - if err := cfg.setAssumeRoleSource(profile, files); err != nil { - return sharedConfig{}, err - } - } - return cfg, nil } @@ -105,114 +157,278 @@ func loadSharedConfigIniFiles(filenames []string) ([]sharedConfigFile, error) { files := make([]sharedConfigFile, 0, len(filenames)) for _, filename := range filenames { - b, err := ioutil.ReadFile(filename) - if err != nil { + sections, err := ini.OpenFile(filename) + if aerr, ok := err.(awserr.Error); ok && aerr.Code() == ini.ErrCodeUnableToReadFile { // Skip files which can't be opened and read for whatever reason continue - } - - f, err := ini.Load(b) - if err != nil { + } else if err != nil { return nil, SharedConfigLoadError{Filename: filename, Err: err} } files = append(files, sharedConfigFile{ - Filename: filename, IniData: f, + Filename: filename, IniData: sections, }) } return files, nil } -func (cfg *sharedConfig) setAssumeRoleSource(origProfile string, files []sharedConfigFile) error { - var assumeRoleSrc sharedConfig +func (cfg *sharedConfig) setFromIniFiles(profiles map[string]struct{}, profile string, files []sharedConfigFile, exOpts bool) error { + // Trim files from the list that don't exist. + var skippedFiles int + var profileNotFoundErr error + for _, f := range files { + if err := cfg.setFromIniFile(profile, f, exOpts); err != nil { + if _, ok := err.(SharedConfigProfileNotExistsError); ok { + // Ignore profiles not defined in individual files. + profileNotFoundErr = err + skippedFiles++ + continue + } + return err + } + } + if skippedFiles == len(files) { + // If all files were skipped because the profile is not found, return + // the original profile not found error. + return profileNotFoundErr + } - // Multiple level assume role chains are not support - if cfg.AssumeRole.SourceProfile == origProfile { - assumeRoleSrc = *cfg - assumeRoleSrc.AssumeRole = assumeRoleConfig{} + if _, ok := profiles[profile]; ok { + // if this is the second instance of the profile the Assume Role + // options must be cleared because they are only valid for the + // first reference of a profile. The self linked instance of the + // profile only have credential provider options. + cfg.clearAssumeRoleOptions() } else { - err := assumeRoleSrc.setFromIniFiles(cfg.AssumeRole.SourceProfile, files) - if err != nil { + // First time a profile has been seen, It must either be a assume role + // or credentials. Assert if the credential type requires a role ARN, + // the ARN is also set. + if err := cfg.validateCredentialsRequireARN(profile); err != nil { return err } } + profiles[profile] = struct{}{} - if len(assumeRoleSrc.Creds.AccessKeyID) == 0 { - return SharedConfigAssumeRoleError{RoleARN: cfg.AssumeRole.RoleARN} + if err := cfg.validateCredentialType(); err != nil { + return err } - cfg.AssumeRoleSource = &assumeRoleSrc - - return nil -} + // Link source profiles for assume roles + if len(cfg.SourceProfileName) != 0 { + // Linked profile via source_profile ignore credential provider + // options, the source profile must provide the credentials. + cfg.clearCredentialOptions() -func (cfg *sharedConfig) setFromIniFiles(profile string, files []sharedConfigFile) error { - // Trim files from the list that don't exist. - for _, f := range files { - if err := cfg.setFromIniFile(profile, f); err != nil { + srcCfg := &sharedConfig{} + err := srcCfg.setFromIniFiles(profiles, cfg.SourceProfileName, files, exOpts) + if err != nil { + // SourceProfile that doesn't exist is an error in configuration. if _, ok := err.(SharedConfigProfileNotExistsError); ok { - // Ignore proviles missings - continue + err = SharedConfigAssumeRoleError{ + RoleARN: cfg.RoleARN, + SourceProfile: cfg.SourceProfileName, + } } return err } + + if !srcCfg.hasCredentials() { + return SharedConfigAssumeRoleError{ + RoleARN: cfg.RoleARN, + SourceProfile: cfg.SourceProfileName, + } + } + + cfg.SourceProfile = srcCfg } return nil } -// setFromFile loads the configuration from the file using -// the profile provided. A sharedConfig pointer type value is used so that -// multiple config file loadings can be chained. +// setFromFile loads the configuration from the file using the profile +// provided. A sharedConfig pointer type value is used so that multiple config +// file loadings can be chained. // // Only loads complete logically grouped values, and will not set fields in cfg -// for incomplete grouped values in the config. Such as credentials. For example -// if a config file only includes aws_access_key_id but no aws_secret_access_key -// the aws_access_key_id will be ignored. -func (cfg *sharedConfig) setFromIniFile(profile string, file sharedConfigFile) error { - section, err := file.IniData.GetSection(profile) - if err != nil { +// for incomplete grouped values in the config. Such as credentials. For +// example if a config file only includes aws_access_key_id but no +// aws_secret_access_key the aws_access_key_id will be ignored. +func (cfg *sharedConfig) setFromIniFile(profile string, file sharedConfigFile, exOpts bool) error { + section, ok := file.IniData.GetSection(profile) + if !ok { // Fallback to to alternate profile name: profile - section, err = file.IniData.GetSection(fmt.Sprintf("profile %s", profile)) - if err != nil { - return SharedConfigProfileNotExistsError{Profile: profile, Err: err} + section, ok = file.IniData.GetSection(fmt.Sprintf("profile %s", profile)) + if !ok { + return SharedConfigProfileNotExistsError{Profile: profile, Err: nil} } } - // Shared Credentials - akid := section.Key(accessKeyIDKey).String() - secret := section.Key(secretAccessKey).String() - if len(akid) > 0 && len(secret) > 0 { - cfg.Creds = credentials.Value{ - AccessKeyID: akid, - SecretAccessKey: secret, - SessionToken: section.Key(sessionTokenKey).String(), - ProviderName: fmt.Sprintf("SharedConfigCredentials: %s", file.Filename), + if exOpts { + // Assume Role Parameters + updateString(&cfg.RoleARN, section, roleArnKey) + updateString(&cfg.ExternalID, section, externalIDKey) + updateString(&cfg.MFASerial, section, mfaSerialKey) + updateString(&cfg.RoleSessionName, section, roleSessionNameKey) + updateString(&cfg.SourceProfileName, section, sourceProfileKey) + updateString(&cfg.CredentialSource, section, credentialSourceKey) + updateString(&cfg.Region, section, regionKey) + + if v := section.String(stsRegionalEndpointSharedKey); len(v) != 0 { + sre, err := endpoints.GetSTSRegionalEndpoint(v) + if err != nil { + return fmt.Errorf("failed to load %s from shared config, %s, %v", + stsRegionalEndpointSharedKey, file.Filename, err) + } + cfg.STSRegionalEndpoint = sre } + + if v := section.String(s3UsEast1RegionalSharedKey); len(v) != 0 { + sre, err := endpoints.GetS3UsEast1RegionalEndpoint(v) + if err != nil { + return fmt.Errorf("failed to load %s from shared config, %s, %v", + s3UsEast1RegionalSharedKey, file.Filename, err) + } + cfg.S3UsEast1RegionalEndpoint = sre + } + } + + updateString(&cfg.CredentialProcess, section, credentialProcessKey) + updateString(&cfg.WebIdentityTokenFile, section, webIdentityTokenFileKey) + + // Shared Credentials + creds := credentials.Value{ + AccessKeyID: section.String(accessKeyIDKey), + SecretAccessKey: section.String(secretAccessKey), + SessionToken: section.String(sessionTokenKey), + ProviderName: fmt.Sprintf("SharedConfigCredentials: %s", file.Filename), + } + if creds.HasKeys() { + cfg.Creds = creds + } + + // Endpoint discovery + updateBoolPtr(&cfg.EnableEndpointDiscovery, section, enableEndpointDiscoveryKey) + + // CSM options + updateBoolPtr(&cfg.CSMEnabled, section, csmEnabledKey) + updateString(&cfg.CSMHost, section, csmHostKey) + updateString(&cfg.CSMPort, section, csmPortKey) + updateString(&cfg.CSMClientID, section, csmClientIDKey) + + updateBool(&cfg.S3UseARNRegion, section, s3UseARNRegionKey) + + return nil +} + +func (cfg *sharedConfig) validateCredentialsRequireARN(profile string) error { + var credSource string + + switch { + case len(cfg.SourceProfileName) != 0: + credSource = sourceProfileKey + case len(cfg.CredentialSource) != 0: + credSource = credentialSourceKey + case len(cfg.WebIdentityTokenFile) != 0: + credSource = webIdentityTokenFileKey } - // Assume Role - roleArn := section.Key(roleArnKey).String() - srcProfile := section.Key(sourceProfileKey).String() - if len(roleArn) > 0 && len(srcProfile) > 0 { - cfg.AssumeRole = assumeRoleConfig{ - RoleARN: roleArn, - SourceProfile: srcProfile, - ExternalID: section.Key(externalIDKey).String(), - MFASerial: section.Key(mfaSerialKey).String(), - RoleSessionName: section.Key(roleSessionNameKey).String(), + if len(credSource) != 0 && len(cfg.RoleARN) == 0 { + return CredentialRequiresARNError{ + Type: credSource, + Profile: profile, } } - // Region - if v := section.Key(regionKey).String(); len(v) > 0 { - cfg.Region = v + return nil +} + +func (cfg *sharedConfig) validateCredentialType() error { + // Only one or no credential type can be defined. + if !oneOrNone( + len(cfg.SourceProfileName) != 0, + len(cfg.CredentialSource) != 0, + len(cfg.CredentialProcess) != 0, + len(cfg.WebIdentityTokenFile) != 0, + ) { + return ErrSharedConfigSourceCollision } return nil } +func (cfg *sharedConfig) hasCredentials() bool { + switch { + case len(cfg.SourceProfileName) != 0: + case len(cfg.CredentialSource) != 0: + case len(cfg.CredentialProcess) != 0: + case len(cfg.WebIdentityTokenFile) != 0: + case cfg.Creds.HasKeys(): + default: + return false + } + + return true +} + +func (cfg *sharedConfig) clearCredentialOptions() { + cfg.CredentialSource = "" + cfg.CredentialProcess = "" + cfg.WebIdentityTokenFile = "" + cfg.Creds = credentials.Value{} +} + +func (cfg *sharedConfig) clearAssumeRoleOptions() { + cfg.RoleARN = "" + cfg.ExternalID = "" + cfg.MFASerial = "" + cfg.RoleSessionName = "" + cfg.SourceProfileName = "" +} + +func oneOrNone(bs ...bool) bool { + var count int + + for _, b := range bs { + if b { + count++ + if count > 1 { + return false + } + } + } + + return true +} + +// updateString will only update the dst with the value in the section key, key +// is present in the section. +func updateString(dst *string, section ini.Section, key string) { + if !section.Has(key) { + return + } + *dst = section.String(key) +} + +// updateBool will only update the dst with the value in the section key, key +// is present in the section. +func updateBool(dst *bool, section ini.Section, key string) { + if !section.Has(key) { + return + } + *dst = section.Bool(key) +} + +// updateBoolPtr will only update the dst with the value in the section key, +// key is present in the section. +func updateBoolPtr(dst **bool, section ini.Section, key string) { + if !section.Has(key) { + return + } + *dst = new(bool) + **dst = section.Bool(key) +} + // SharedConfigLoadError is an error for the shared config file failed to load. type SharedConfigLoadError struct { Filename string @@ -270,7 +486,8 @@ func (e SharedConfigProfileNotExistsError) Error() string { // profile contains assume role information, but that information is invalid // or not complete. type SharedConfigAssumeRoleError struct { - RoleARN string + RoleARN string + SourceProfile string } // Code is the short id of the error. @@ -280,8 +497,10 @@ func (e SharedConfigAssumeRoleError) Code() string { // Message is the description of the error func (e SharedConfigAssumeRoleError) Message() string { - return fmt.Sprintf("failed to load assume role for %s, source profile has no shared credentials", - e.RoleARN) + return fmt.Sprintf( + "failed to load assume role for %s, source profile %s has no shared credentials", + e.RoleARN, e.SourceProfile, + ) } // OrigErr is the underlying error that caused the failure. @@ -293,3 +512,36 @@ func (e SharedConfigAssumeRoleError) OrigErr() error { func (e SharedConfigAssumeRoleError) Error() string { return awserr.SprintError(e.Code(), e.Message(), "", nil) } + +// CredentialRequiresARNError provides the error for shared config credentials +// that are incorrectly configured in the shared config or credentials file. +type CredentialRequiresARNError struct { + // type of credentials that were configured. + Type string + + // Profile name the credentials were in. + Profile string +} + +// Code is the short id of the error. +func (e CredentialRequiresARNError) Code() string { + return "CredentialRequiresARNError" +} + +// Message is the description of the error +func (e CredentialRequiresARNError) Message() string { + return fmt.Sprintf( + "credential type %s requires role_arn, profile %s", + e.Type, e.Profile, + ) +} + +// OrigErr is the underlying error that caused the failure. +func (e CredentialRequiresARNError) OrigErr() error { + return nil +} + +// Error satisfies the error interface. +func (e CredentialRequiresARNError) Error() string { + return awserr.SprintError(e.Code(), e.Message(), "", nil) +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/header_rules.go b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/header_rules.go index 244c86da0..07ea799fb 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/header_rules.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/header_rules.go @@ -1,8 +1,7 @@ package v4 import ( - "net/http" - "strings" + "github.com/aws/aws-sdk-go/internal/strings" ) // validator houses a set of rule needed for validation of a @@ -61,7 +60,7 @@ type patterns []string // been found func (p patterns) IsValid(value string) bool { for _, pattern := range p { - if strings.HasPrefix(http.CanonicalHeaderKey(value), pattern) { + if strings.HasPrefixFold(value, pattern) { return true } } diff --git a/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/request_context_go1.5.go b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/request_context_go1.5.go new file mode 100644 index 000000000..f35fc860b --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/request_context_go1.5.go @@ -0,0 +1,13 @@ +// +build !go1.7 + +package v4 + +import ( + "net/http" + + "github.com/aws/aws-sdk-go/aws" +) + +func requestContext(r *http.Request) aws.Context { + return aws.BackgroundContext() +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/request_context_go1.7.go b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/request_context_go1.7.go new file mode 100644 index 000000000..fed5c859c --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/request_context_go1.7.go @@ -0,0 +1,13 @@ +// +build go1.7 + +package v4 + +import ( + "net/http" + + "github.com/aws/aws-sdk-go/aws" +) + +func requestContext(r *http.Request) aws.Context { + return r.Context() +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/stream.go b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/stream.go new file mode 100644 index 000000000..02cbd97e2 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/stream.go @@ -0,0 +1,63 @@ +package v4 + +import ( + "encoding/hex" + "strings" + "time" + + "github.com/aws/aws-sdk-go/aws/credentials" +) + +type credentialValueProvider interface { + Get() (credentials.Value, error) +} + +// StreamSigner implements signing of event stream encoded payloads +type StreamSigner struct { + region string + service string + + credentials credentialValueProvider + + prevSig []byte +} + +// NewStreamSigner creates a SigV4 signer used to sign Event Stream encoded messages +func NewStreamSigner(region, service string, seedSignature []byte, credentials *credentials.Credentials) *StreamSigner { + return &StreamSigner{ + region: region, + service: service, + credentials: credentials, + prevSig: seedSignature, + } +} + +// GetSignature takes an event stream encoded headers and payload and returns a signature +func (s *StreamSigner) GetSignature(headers, payload []byte, date time.Time) ([]byte, error) { + credValue, err := s.credentials.Get() + if err != nil { + return nil, err + } + + sigKey := deriveSigningKey(s.region, s.service, credValue.SecretAccessKey, date) + + keyPath := buildSigningScope(s.region, s.service, date) + + stringToSign := buildEventStreamStringToSign(headers, payload, s.prevSig, keyPath, date) + + signature := hmacSHA256(sigKey, []byte(stringToSign)) + s.prevSig = signature + + return signature, nil +} + +func buildEventStreamStringToSign(headers, payload, prevSig []byte, scope string, date time.Time) string { + return strings.Join([]string{ + "AWS4-HMAC-SHA256-PAYLOAD", + formatTime(date), + scope, + hex.EncodeToString(prevSig), + hex.EncodeToString(hashSHA256(headers)), + hex.EncodeToString(hashSHA256(payload)), + }, "\n") +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go index 6e4637612..d71f7b3f4 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go @@ -76,9 +76,14 @@ import ( ) const ( + authorizationHeader = "Authorization" + authHeaderSignatureElem = "Signature=" + signatureQueryKey = "X-Amz-Signature" + authHeaderPrefix = "AWS4-HMAC-SHA256" timeFormat = "20060102T150405Z" shortTimeFormat = "20060102" + awsV4Request = "aws4_request" // emptyStringSHA256 is a SHA256 of an empty string emptyStringSHA256 = `e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855` @@ -87,9 +92,9 @@ const ( var ignoredHeaders = rules{ blacklist{ mapRule{ - "Authorization": struct{}{}, - "User-Agent": struct{}{}, - "X-Amzn-Trace-Id": struct{}{}, + authorizationHeader: struct{}{}, + "User-Agent": struct{}{}, + "X-Amzn-Trace-Id": struct{}{}, }, }, } @@ -98,25 +103,25 @@ var ignoredHeaders = rules{ var requiredSignedHeaders = rules{ whitelist{ mapRule{ - "Cache-Control": struct{}{}, - "Content-Disposition": struct{}{}, - "Content-Encoding": struct{}{}, - "Content-Language": struct{}{}, - "Content-Md5": struct{}{}, - "Content-Type": struct{}{}, - "Expires": struct{}{}, - "If-Match": struct{}{}, - "If-Modified-Since": struct{}{}, - "If-None-Match": struct{}{}, - "If-Unmodified-Since": struct{}{}, - "Range": struct{}{}, - "X-Amz-Acl": struct{}{}, - "X-Amz-Copy-Source": struct{}{}, - "X-Amz-Copy-Source-If-Match": struct{}{}, - "X-Amz-Copy-Source-If-Modified-Since": struct{}{}, - "X-Amz-Copy-Source-If-None-Match": struct{}{}, - "X-Amz-Copy-Source-If-Unmodified-Since": struct{}{}, - "X-Amz-Copy-Source-Range": struct{}{}, + "Cache-Control": struct{}{}, + "Content-Disposition": struct{}{}, + "Content-Encoding": struct{}{}, + "Content-Language": struct{}{}, + "Content-Md5": struct{}{}, + "Content-Type": struct{}{}, + "Expires": struct{}{}, + "If-Match": struct{}{}, + "If-Modified-Since": struct{}{}, + "If-None-Match": struct{}{}, + "If-Unmodified-Since": struct{}{}, + "Range": struct{}{}, + "X-Amz-Acl": struct{}{}, + "X-Amz-Copy-Source": struct{}{}, + "X-Amz-Copy-Source-If-Match": struct{}{}, + "X-Amz-Copy-Source-If-Modified-Since": struct{}{}, + "X-Amz-Copy-Source-If-None-Match": struct{}{}, + "X-Amz-Copy-Source-If-Unmodified-Since": struct{}{}, + "X-Amz-Copy-Source-Range": struct{}{}, "X-Amz-Copy-Source-Server-Side-Encryption-Customer-Algorithm": struct{}{}, "X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key": struct{}{}, "X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key-Md5": struct{}{}, @@ -134,7 +139,9 @@ var requiredSignedHeaders = rules{ "X-Amz-Server-Side-Encryption-Customer-Key": struct{}{}, "X-Amz-Server-Side-Encryption-Customer-Key-Md5": struct{}{}, "X-Amz-Storage-Class": struct{}{}, + "X-Amz-Tagging": struct{}{}, "X-Amz-Website-Redirect-Location": struct{}{}, + "X-Amz-Content-Sha256": struct{}{}, }, }, patterns{"X-Amz-Meta-"}, @@ -180,7 +187,7 @@ type Signer struct { // http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html DisableURIPathEscaping bool - // Disales the automatical setting of the HTTP request's Body field with the + // Disables the automatical setting of the HTTP request's Body field with the // io.ReadSeeker passed in to the signer. This is useful if you're using a // custom wrapper around the body for the io.ReadSeeker and want to preserve // the Body value on the Request.Body. @@ -227,11 +234,9 @@ type signingCtx struct { DisableURIPathEscaping bool - credValues credentials.Value - isPresign bool - formattedTime string - formattedShortTime string - unsignedPayload bool + credValues credentials.Value + isPresign bool + unsignedPayload bool bodyDigest string signedHeaders string @@ -335,7 +340,7 @@ func (v4 Signer) signWithBody(r *http.Request, body io.ReadSeeker, service, regi } var err error - ctx.credValues, err = v4.Credentials.Get() + ctx.credValues, err = v4.Credentials.GetWithContext(requestContext(r)) if err != nil { return http.Header{}, err } @@ -420,7 +425,7 @@ var SignRequestHandler = request.NamedHandler{ // If the credentials of the request's config are set to // credentials.AnonymousCredentials the request will not be signed. func SignSDKRequest(req *request.Request) { - signSDKRequestWithCurrTime(req, time.Now) + SignSDKRequestWithCurrentTime(req, time.Now) } // BuildNamedHandler will build a generic handler for signing. @@ -428,12 +433,15 @@ func BuildNamedHandler(name string, opts ...func(*Signer)) request.NamedHandler return request.NamedHandler{ Name: name, Fn: func(req *request.Request) { - signSDKRequestWithCurrTime(req, time.Now, opts...) + SignSDKRequestWithCurrentTime(req, time.Now, opts...) }, } } -func signSDKRequestWithCurrTime(req *request.Request, curTimeFn func() time.Time, opts ...func(*Signer)) { +// SignSDKRequestWithCurrentTime will sign the SDK's request using the time +// function passed in. Behaves the same as SignSDKRequest with the exception +// the request is signed with the value returned by the current time function. +func SignSDKRequestWithCurrentTime(req *request.Request, curTimeFn func() time.Time, opts ...func(*Signer)) { // If the request does not need to be signed ignore the signing of the // request if the AnonymousCredentials object is used. if req.Config.Credentials == credentials.AnonymousCredentials { @@ -469,13 +477,9 @@ func signSDKRequestWithCurrTime(req *request.Request, curTimeFn func() time.Time opt(v4) } - signingTime := req.Time - if !req.LastSignedAt.IsZero() { - signingTime = req.LastSignedAt - } - + curTime := curTimeFn() signedHeaders, err := v4.signWithBody(req.HTTPRequest, req.GetBody(), - name, region, req.ExpireTime, req.ExpireTime > 0, signingTime, + name, region, req.ExpireTime, req.ExpireTime > 0, curTime, ) if err != nil { req.Error = err @@ -484,7 +488,7 @@ func signSDKRequestWithCurrTime(req *request.Request, curTimeFn func() time.Time } req.SignedHeaderVals = signedHeaders - req.LastSignedAt = curTimeFn() + req.LastSignedAt = curTime } const logSignInfoMsg = `DEBUG: Request Signature: @@ -531,39 +535,56 @@ func (ctx *signingCtx) build(disableHeaderHoisting bool) error { ctx.buildSignature() // depends on string to sign if ctx.isPresign { - ctx.Request.URL.RawQuery += "&X-Amz-Signature=" + ctx.signature + ctx.Request.URL.RawQuery += "&" + signatureQueryKey + "=" + ctx.signature } else { parts := []string{ authHeaderPrefix + " Credential=" + ctx.credValues.AccessKeyID + "/" + ctx.credentialString, "SignedHeaders=" + ctx.signedHeaders, - "Signature=" + ctx.signature, + authHeaderSignatureElem + ctx.signature, } - ctx.Request.Header.Set("Authorization", strings.Join(parts, ", ")) + ctx.Request.Header.Set(authorizationHeader, strings.Join(parts, ", ")) } return nil } -func (ctx *signingCtx) buildTime() { - ctx.formattedTime = ctx.Time.UTC().Format(timeFormat) - ctx.formattedShortTime = ctx.Time.UTC().Format(shortTimeFormat) +// GetSignedRequestSignature attempts to extract the signature of the request. +// Returning an error if the request is unsigned, or unable to extract the +// signature. +func GetSignedRequestSignature(r *http.Request) ([]byte, error) { + + if auth := r.Header.Get(authorizationHeader); len(auth) != 0 { + ps := strings.Split(auth, ", ") + for _, p := range ps { + if idx := strings.Index(p, authHeaderSignatureElem); idx >= 0 { + sig := p[len(authHeaderSignatureElem):] + if len(sig) == 0 { + return nil, fmt.Errorf("invalid request signature authorization header") + } + return hex.DecodeString(sig) + } + } + } + if sig := r.URL.Query().Get("X-Amz-Signature"); len(sig) != 0 { + return hex.DecodeString(sig) + } + + return nil, fmt.Errorf("request not signed") +} + +func (ctx *signingCtx) buildTime() { if ctx.isPresign { duration := int64(ctx.ExpireTime / time.Second) - ctx.Query.Set("X-Amz-Date", ctx.formattedTime) + ctx.Query.Set("X-Amz-Date", formatTime(ctx.Time)) ctx.Query.Set("X-Amz-Expires", strconv.FormatInt(duration, 10)) } else { - ctx.Request.Header.Set("X-Amz-Date", ctx.formattedTime) + ctx.Request.Header.Set("X-Amz-Date", formatTime(ctx.Time)) } } func (ctx *signingCtx) buildCredentialString() { - ctx.credentialString = strings.Join([]string{ - ctx.formattedShortTime, - ctx.Region, - ctx.ServiceName, - "aws4_request", - }, "/") + ctx.credentialString = buildSigningScope(ctx.Region, ctx.ServiceName, ctx.Time) if ctx.isPresign { ctx.Query.Set("X-Amz-Credential", ctx.credValues.AccessKeyID+"/"+ctx.credentialString) @@ -587,8 +608,7 @@ func (ctx *signingCtx) buildCanonicalHeaders(r rule, header http.Header) { var headers []string headers = append(headers, "host") for k, v := range header { - canonicalKey := http.CanonicalHeaderKey(k) - if !r.IsValid(canonicalKey) { + if !r.IsValid(k) { continue // ignored header } if ctx.SignedHeaderVals == nil { @@ -652,36 +672,44 @@ func (ctx *signingCtx) buildCanonicalString() { func (ctx *signingCtx) buildStringToSign() { ctx.stringToSign = strings.Join([]string{ authHeaderPrefix, - ctx.formattedTime, + formatTime(ctx.Time), ctx.credentialString, - hex.EncodeToString(makeSha256([]byte(ctx.canonicalString))), + hex.EncodeToString(hashSHA256([]byte(ctx.canonicalString))), }, "\n") } func (ctx *signingCtx) buildSignature() { - secret := ctx.credValues.SecretAccessKey - date := makeHmac([]byte("AWS4"+secret), []byte(ctx.formattedShortTime)) - region := makeHmac(date, []byte(ctx.Region)) - service := makeHmac(region, []byte(ctx.ServiceName)) - credentials := makeHmac(service, []byte("aws4_request")) - signature := makeHmac(credentials, []byte(ctx.stringToSign)) + creds := deriveSigningKey(ctx.Region, ctx.ServiceName, ctx.credValues.SecretAccessKey, ctx.Time) + signature := hmacSHA256(creds, []byte(ctx.stringToSign)) ctx.signature = hex.EncodeToString(signature) } func (ctx *signingCtx) buildBodyDigest() error { hash := ctx.Request.Header.Get("X-Amz-Content-Sha256") if hash == "" { - if ctx.unsignedPayload || (ctx.isPresign && ctx.ServiceName == "s3") { + includeSHA256Header := ctx.unsignedPayload || + ctx.ServiceName == "s3" || + ctx.ServiceName == "glacier" + + s3Presign := ctx.isPresign && ctx.ServiceName == "s3" + + if ctx.unsignedPayload || s3Presign { hash = "UNSIGNED-PAYLOAD" + includeSHA256Header = !s3Presign } else if ctx.Body == nil { hash = emptyStringSHA256 } else { if !aws.IsReaderSeekable(ctx.Body) { return fmt.Errorf("cannot use unseekable request body %T, for signed request with body", ctx.Body) } - hash = hex.EncodeToString(makeSha256Reader(ctx.Body)) + hashBytes, err := makeSha256Reader(ctx.Body) + if err != nil { + return err + } + hash = hex.EncodeToString(hashBytes) } - if ctx.unsignedPayload || ctx.ServiceName == "s3" || ctx.ServiceName == "glacier" { + + if includeSHA256Header { ctx.Request.Header.Set("X-Amz-Content-Sha256", hash) } } @@ -713,31 +741,45 @@ func (ctx *signingCtx) removePresign() { ctx.Query.Del("X-Amz-SignedHeaders") } -func makeHmac(key []byte, data []byte) []byte { +func hmacSHA256(key []byte, data []byte) []byte { hash := hmac.New(sha256.New, key) hash.Write(data) return hash.Sum(nil) } -func makeSha256(data []byte) []byte { +func hashSHA256(data []byte) []byte { hash := sha256.New() hash.Write(data) return hash.Sum(nil) } -func makeSha256Reader(reader io.ReadSeeker) []byte { +func makeSha256Reader(reader io.ReadSeeker) (hashBytes []byte, err error) { hash := sha256.New() - start, _ := reader.Seek(0, sdkio.SeekCurrent) - defer reader.Seek(start, sdkio.SeekStart) + start, err := reader.Seek(0, sdkio.SeekCurrent) + if err != nil { + return nil, err + } + defer func() { + // ensure error is return if unable to seek back to start of payload. + _, err = reader.Seek(start, sdkio.SeekStart) + }() - io.Copy(hash, reader) - return hash.Sum(nil) + // Use CopyN to avoid allocating the 32KB buffer in io.Copy for bodies + // smaller than 32KB. Fall back to io.Copy if we fail to determine the size. + size, err := aws.SeekerLen(reader) + if err != nil { + io.Copy(hash, reader) + } else { + io.CopyN(hash, reader, size) + } + + return hash.Sum(nil), nil } const doubleSpace = " " // stripExcessSpaces will rewrite the passed in slice's string values to not -// contain muliple side-by-side spaces. +// contain multiple side-by-side spaces. func stripExcessSpaces(vals []string) { var j, k, l, m, spaces int for i, str := range vals { @@ -777,3 +819,28 @@ func stripExcessSpaces(vals []string) { vals[i] = string(buf[:m]) } } + +func buildSigningScope(region, service string, dt time.Time) string { + return strings.Join([]string{ + formatShortTime(dt), + region, + service, + awsV4Request, + }, "/") +} + +func deriveSigningKey(region, service, secretKey string, dt time.Time) []byte { + kDate := hmacSHA256([]byte("AWS4"+secretKey), []byte(formatShortTime(dt))) + kRegion := hmacSHA256(kDate, []byte(region)) + kService := hmacSHA256(kRegion, []byte(service)) + signingKey := hmacSHA256(kService, []byte(awsV4Request)) + return signingKey +} + +func formatShortTime(dt time.Time) string { + return dt.UTC().Format(shortTimeFormat) +} + +func formatTime(dt time.Time) string { + return dt.UTC().Format(timeFormat) +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/types.go b/vendor/github.com/aws/aws-sdk-go/aws/types.go index 8b6f23425..d542ef01b 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/types.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/types.go @@ -2,18 +2,24 @@ package aws import ( "io" + "strings" "sync" "github.com/aws/aws-sdk-go/internal/sdkio" ) -// ReadSeekCloser wraps a io.Reader returning a ReaderSeekerCloser. Should -// only be used with an io.Reader that is also an io.Seeker. Doing so may -// cause request signature errors, or request body's not sent for GET, HEAD -// and DELETE HTTP methods. +// ReadSeekCloser wraps a io.Reader returning a ReaderSeekerCloser. Allows the +// SDK to accept an io.Reader that is not also an io.Seeker for unsigned +// streaming payload API operations. // -// Deprecated: Should only be used with io.ReadSeeker. If using for -// S3 PutObject to stream content use s3manager.Uploader instead. +// A ReadSeekCloser wrapping an nonseekable io.Reader used in an API +// operation's input will prevent that operation being retried in the case of +// network errors, and cause operation requests to fail if the operation +// requires payload signing. +// +// Note: If using With S3 PutObject to stream an object upload The SDK's S3 +// Upload manager (s3manager.Uploader) provides support for streaming with the +// ability to retry network errors. func ReadSeekCloser(r io.Reader) ReaderSeekerCloser { return ReaderSeekerCloser{r} } @@ -43,7 +49,8 @@ func IsReaderSeekable(r io.Reader) bool { // Read reads from the reader up to size of p. The number of bytes read, and // error if it occurred will be returned. // -// If the reader is not an io.Reader zero bytes read, and nil error will be returned. +// If the reader is not an io.Reader zero bytes read, and nil error will be +// returned. // // Performs the same functionality as io.Reader Read func (r ReaderSeekerCloser) Read(p []byte) (int, error) { @@ -199,3 +206,36 @@ func (b *WriteAtBuffer) Bytes() []byte { defer b.m.Unlock() return b.buf } + +// MultiCloser is a utility to close multiple io.Closers within a single +// statement. +type MultiCloser []io.Closer + +// Close closes all of the io.Closers making up the MultiClosers. Any +// errors that occur while closing will be returned in the order they +// occur. +func (m MultiCloser) Close() error { + var errs errors + for _, c := range m { + err := c.Close() + if err != nil { + errs = append(errs, err) + } + } + if len(errs) != 0 { + return errs + } + + return nil +} + +type errors []error + +func (es errors) Error() string { + var parts []string + for _, e := range es { + parts = append(parts, e.Error()) + } + + return strings.Join(parts, "\n") +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/version.go b/vendor/github.com/aws/aws-sdk-go/aws/version.go index b69fc4ab4..a82d2f189 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/version.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/version.go @@ -5,4 +5,4 @@ package aws const SDKName = "aws-sdk-go" // SDKVersion is the version of this SDK -const SDKVersion = "1.13.36" +const SDKVersion = "1.29.11" diff --git a/vendor/github.com/aws/aws-sdk-go/internal/context/background_go1.5.go b/vendor/github.com/aws/aws-sdk-go/internal/context/background_go1.5.go new file mode 100644 index 000000000..876dcb3fd --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/context/background_go1.5.go @@ -0,0 +1,40 @@ +// +build !go1.7 + +package context + +import "time" + +// An emptyCtx is a copy of the Go 1.7 context.emptyCtx type. This is copied to +// provide a 1.6 and 1.5 safe version of context that is compatible with Go +// 1.7's Context. +// +// An emptyCtx is never canceled, has no values, and has no deadline. It is not +// struct{}, since vars of this type must have distinct addresses. +type emptyCtx int + +func (*emptyCtx) Deadline() (deadline time.Time, ok bool) { + return +} + +func (*emptyCtx) Done() <-chan struct{} { + return nil +} + +func (*emptyCtx) Err() error { + return nil +} + +func (*emptyCtx) Value(key interface{}) interface{} { + return nil +} + +func (e *emptyCtx) String() string { + switch e { + case BackgroundCtx: + return "aws.BackgroundContext" + } + return "unknown empty Context" +} + +// BackgroundCtx is the common base context. +var BackgroundCtx = new(emptyCtx) diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/ast.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/ast.go new file mode 100644 index 000000000..e83a99886 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/ast.go @@ -0,0 +1,120 @@ +package ini + +// ASTKind represents different states in the parse table +// and the type of AST that is being constructed +type ASTKind int + +// ASTKind* is used in the parse table to transition between +// the different states +const ( + ASTKindNone = ASTKind(iota) + ASTKindStart + ASTKindExpr + ASTKindEqualExpr + ASTKindStatement + ASTKindSkipStatement + ASTKindExprStatement + ASTKindSectionStatement + ASTKindNestedSectionStatement + ASTKindCompletedNestedSectionStatement + ASTKindCommentStatement + ASTKindCompletedSectionStatement +) + +func (k ASTKind) String() string { + switch k { + case ASTKindNone: + return "none" + case ASTKindStart: + return "start" + case ASTKindExpr: + return "expr" + case ASTKindStatement: + return "stmt" + case ASTKindSectionStatement: + return "section_stmt" + case ASTKindExprStatement: + return "expr_stmt" + case ASTKindCommentStatement: + return "comment" + case ASTKindNestedSectionStatement: + return "nested_section_stmt" + case ASTKindCompletedSectionStatement: + return "completed_stmt" + case ASTKindSkipStatement: + return "skip" + default: + return "" + } +} + +// AST interface allows us to determine what kind of node we +// are on and casting may not need to be necessary. +// +// The root is always the first node in Children +type AST struct { + Kind ASTKind + Root Token + RootToken bool + Children []AST +} + +func newAST(kind ASTKind, root AST, children ...AST) AST { + return AST{ + Kind: kind, + Children: append([]AST{root}, children...), + } +} + +func newASTWithRootToken(kind ASTKind, root Token, children ...AST) AST { + return AST{ + Kind: kind, + Root: root, + RootToken: true, + Children: children, + } +} + +// AppendChild will append to the list of children an AST has. +func (a *AST) AppendChild(child AST) { + a.Children = append(a.Children, child) +} + +// GetRoot will return the root AST which can be the first entry +// in the children list or a token. +func (a *AST) GetRoot() AST { + if a.RootToken { + return *a + } + + if len(a.Children) == 0 { + return AST{} + } + + return a.Children[0] +} + +// GetChildren will return the current AST's list of children +func (a *AST) GetChildren() []AST { + if len(a.Children) == 0 { + return []AST{} + } + + if a.RootToken { + return a.Children + } + + return a.Children[1:] +} + +// SetChildren will set and override all children of the AST. +func (a *AST) SetChildren(children []AST) { + if a.RootToken { + a.Children = children + } else { + a.Children = append(a.Children[:1], children...) + } +} + +// Start is used to indicate the starting state of the parse table. +var Start = newAST(ASTKindStart, AST{}) diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/comma_token.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/comma_token.go new file mode 100644 index 000000000..0895d53cb --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/comma_token.go @@ -0,0 +1,11 @@ +package ini + +var commaRunes = []rune(",") + +func isComma(b rune) bool { + return b == ',' +} + +func newCommaToken() Token { + return newToken(TokenComma, commaRunes, NoneType) +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/comment_token.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/comment_token.go new file mode 100644 index 000000000..0b76999ba --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/comment_token.go @@ -0,0 +1,35 @@ +package ini + +// isComment will return whether or not the next byte(s) is a +// comment. +func isComment(b []rune) bool { + if len(b) == 0 { + return false + } + + switch b[0] { + case ';': + return true + case '#': + return true + } + + return false +} + +// newCommentToken will create a comment token and +// return how many bytes were read. +func newCommentToken(b []rune) (Token, int, error) { + i := 0 + for ; i < len(b); i++ { + if b[i] == '\n' { + break + } + + if len(b)-i > 2 && b[i] == '\r' && b[i+1] == '\n' { + break + } + } + + return newToken(TokenComment, b[:i], NoneType), i, nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/doc.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/doc.go new file mode 100644 index 000000000..25ce0fe13 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/doc.go @@ -0,0 +1,29 @@ +// Package ini is an LL(1) parser for configuration files. +// +// Example: +// sections, err := ini.OpenFile("/path/to/file") +// if err != nil { +// panic(err) +// } +// +// profile := "foo" +// section, ok := sections.GetSection(profile) +// if !ok { +// fmt.Printf("section %q could not be found", profile) +// } +// +// Below is the BNF that describes this parser +// Grammar: +// stmt -> value stmt' +// stmt' -> epsilon | op stmt +// value -> number | string | boolean | quoted_string +// +// section -> [ section' +// section' -> value section_close +// section_close -> ] +// +// SkipState will skip (NL WS)+ +// +// comment -> # comment' | ; comment' +// comment' -> epsilon | value +package ini diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/empty_token.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/empty_token.go new file mode 100644 index 000000000..04345a54c --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/empty_token.go @@ -0,0 +1,4 @@ +package ini + +// emptyToken is used to satisfy the Token interface +var emptyToken = newToken(TokenNone, []rune{}, NoneType) diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/expression.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/expression.go new file mode 100644 index 000000000..91ba2a59d --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/expression.go @@ -0,0 +1,24 @@ +package ini + +// newExpression will return an expression AST. +// Expr represents an expression +// +// grammar: +// expr -> string | number +func newExpression(tok Token) AST { + return newASTWithRootToken(ASTKindExpr, tok) +} + +func newEqualExpr(left AST, tok Token) AST { + return newASTWithRootToken(ASTKindEqualExpr, tok, left) +} + +// EqualExprKey will return a LHS value in the equal expr +func EqualExprKey(ast AST) string { + children := ast.GetChildren() + if len(children) == 0 || ast.Kind != ASTKindEqualExpr { + return "" + } + + return string(children[0].Root.Raw()) +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/fuzz.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/fuzz.go new file mode 100644 index 000000000..8d462f77e --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/fuzz.go @@ -0,0 +1,17 @@ +// +build gofuzz + +package ini + +import ( + "bytes" +) + +func Fuzz(data []byte) int { + b := bytes.NewReader(data) + + if _, err := Parse(b); err != nil { + return 0 + } + + return 1 +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/ini.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/ini.go new file mode 100644 index 000000000..3b0ca7afe --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/ini.go @@ -0,0 +1,51 @@ +package ini + +import ( + "io" + "os" + + "github.com/aws/aws-sdk-go/aws/awserr" +) + +// OpenFile takes a path to a given file, and will open and parse +// that file. +func OpenFile(path string) (Sections, error) { + f, err := os.Open(path) + if err != nil { + return Sections{}, awserr.New(ErrCodeUnableToReadFile, "unable to open file", err) + } + defer f.Close() + + return Parse(f) +} + +// Parse will parse the given file using the shared config +// visitor. +func Parse(f io.Reader) (Sections, error) { + tree, err := ParseAST(f) + if err != nil { + return Sections{}, err + } + + v := NewDefaultVisitor() + if err = Walk(tree, v); err != nil { + return Sections{}, err + } + + return v.Sections, nil +} + +// ParseBytes will parse the given bytes and return the parsed sections. +func ParseBytes(b []byte) (Sections, error) { + tree, err := ParseASTBytes(b) + if err != nil { + return Sections{}, err + } + + v := NewDefaultVisitor() + if err = Walk(tree, v); err != nil { + return Sections{}, err + } + + return v.Sections, nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/ini_lexer.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/ini_lexer.go new file mode 100644 index 000000000..582c024ad --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/ini_lexer.go @@ -0,0 +1,165 @@ +package ini + +import ( + "bytes" + "io" + "io/ioutil" + + "github.com/aws/aws-sdk-go/aws/awserr" +) + +const ( + // ErrCodeUnableToReadFile is used when a file is failed to be + // opened or read from. + ErrCodeUnableToReadFile = "FailedRead" +) + +// TokenType represents the various different tokens types +type TokenType int + +func (t TokenType) String() string { + switch t { + case TokenNone: + return "none" + case TokenLit: + return "literal" + case TokenSep: + return "sep" + case TokenOp: + return "op" + case TokenWS: + return "ws" + case TokenNL: + return "newline" + case TokenComment: + return "comment" + case TokenComma: + return "comma" + default: + return "" + } +} + +// TokenType enums +const ( + TokenNone = TokenType(iota) + TokenLit + TokenSep + TokenComma + TokenOp + TokenWS + TokenNL + TokenComment +) + +type iniLexer struct{} + +// Tokenize will return a list of tokens during lexical analysis of the +// io.Reader. +func (l *iniLexer) Tokenize(r io.Reader) ([]Token, error) { + b, err := ioutil.ReadAll(r) + if err != nil { + return nil, awserr.New(ErrCodeUnableToReadFile, "unable to read file", err) + } + + return l.tokenize(b) +} + +func (l *iniLexer) tokenize(b []byte) ([]Token, error) { + runes := bytes.Runes(b) + var err error + n := 0 + tokenAmount := countTokens(runes) + tokens := make([]Token, tokenAmount) + count := 0 + + for len(runes) > 0 && count < tokenAmount { + switch { + case isWhitespace(runes[0]): + tokens[count], n, err = newWSToken(runes) + case isComma(runes[0]): + tokens[count], n = newCommaToken(), 1 + case isComment(runes): + tokens[count], n, err = newCommentToken(runes) + case isNewline(runes): + tokens[count], n, err = newNewlineToken(runes) + case isSep(runes): + tokens[count], n, err = newSepToken(runes) + case isOp(runes): + tokens[count], n, err = newOpToken(runes) + default: + tokens[count], n, err = newLitToken(runes) + } + + if err != nil { + return nil, err + } + + count++ + + runes = runes[n:] + } + + return tokens[:count], nil +} + +func countTokens(runes []rune) int { + count, n := 0, 0 + var err error + + for len(runes) > 0 { + switch { + case isWhitespace(runes[0]): + _, n, err = newWSToken(runes) + case isComma(runes[0]): + _, n = newCommaToken(), 1 + case isComment(runes): + _, n, err = newCommentToken(runes) + case isNewline(runes): + _, n, err = newNewlineToken(runes) + case isSep(runes): + _, n, err = newSepToken(runes) + case isOp(runes): + _, n, err = newOpToken(runes) + default: + _, n, err = newLitToken(runes) + } + + if err != nil { + return 0 + } + + count++ + runes = runes[n:] + } + + return count + 1 +} + +// Token indicates a metadata about a given value. +type Token struct { + t TokenType + ValueType ValueType + base int + raw []rune +} + +var emptyValue = Value{} + +func newToken(t TokenType, raw []rune, v ValueType) Token { + return Token{ + t: t, + raw: raw, + ValueType: v, + } +} + +// Raw return the raw runes that were consumed +func (tok Token) Raw() []rune { + return tok.raw +} + +// Type returns the token type +func (tok Token) Type() TokenType { + return tok.t +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/ini_parser.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/ini_parser.go new file mode 100644 index 000000000..cf9fad81e --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/ini_parser.go @@ -0,0 +1,356 @@ +package ini + +import ( + "fmt" + "io" +) + +// State enums for the parse table +const ( + InvalidState = iota + // stmt -> value stmt' + StatementState + // stmt' -> MarkComplete | op stmt + StatementPrimeState + // value -> number | string | boolean | quoted_string + ValueState + // section -> [ section' + OpenScopeState + // section' -> value section_close + SectionState + // section_close -> ] + CloseScopeState + // SkipState will skip (NL WS)+ + SkipState + // SkipTokenState will skip any token and push the previous + // state onto the stack. + SkipTokenState + // comment -> # comment' | ; comment' + // comment' -> MarkComplete | value + CommentState + // MarkComplete state will complete statements and move that + // to the completed AST list + MarkCompleteState + // TerminalState signifies that the tokens have been fully parsed + TerminalState +) + +// parseTable is a state machine to dictate the grammar above. +var parseTable = map[ASTKind]map[TokenType]int{ + ASTKindStart: map[TokenType]int{ + TokenLit: StatementState, + TokenSep: OpenScopeState, + TokenWS: SkipTokenState, + TokenNL: SkipTokenState, + TokenComment: CommentState, + TokenNone: TerminalState, + }, + ASTKindCommentStatement: map[TokenType]int{ + TokenLit: StatementState, + TokenSep: OpenScopeState, + TokenWS: SkipTokenState, + TokenNL: SkipTokenState, + TokenComment: CommentState, + TokenNone: MarkCompleteState, + }, + ASTKindExpr: map[TokenType]int{ + TokenOp: StatementPrimeState, + TokenLit: ValueState, + TokenSep: OpenScopeState, + TokenWS: ValueState, + TokenNL: SkipState, + TokenComment: CommentState, + TokenNone: MarkCompleteState, + }, + ASTKindEqualExpr: map[TokenType]int{ + TokenLit: ValueState, + TokenWS: SkipTokenState, + TokenNL: SkipState, + }, + ASTKindStatement: map[TokenType]int{ + TokenLit: SectionState, + TokenSep: CloseScopeState, + TokenWS: SkipTokenState, + TokenNL: SkipTokenState, + TokenComment: CommentState, + TokenNone: MarkCompleteState, + }, + ASTKindExprStatement: map[TokenType]int{ + TokenLit: ValueState, + TokenSep: OpenScopeState, + TokenOp: ValueState, + TokenWS: ValueState, + TokenNL: MarkCompleteState, + TokenComment: CommentState, + TokenNone: TerminalState, + TokenComma: SkipState, + }, + ASTKindSectionStatement: map[TokenType]int{ + TokenLit: SectionState, + TokenOp: SectionState, + TokenSep: CloseScopeState, + TokenWS: SectionState, + TokenNL: SkipTokenState, + }, + ASTKindCompletedSectionStatement: map[TokenType]int{ + TokenWS: SkipTokenState, + TokenNL: SkipTokenState, + TokenLit: StatementState, + TokenSep: OpenScopeState, + TokenComment: CommentState, + TokenNone: MarkCompleteState, + }, + ASTKindSkipStatement: map[TokenType]int{ + TokenLit: StatementState, + TokenSep: OpenScopeState, + TokenWS: SkipTokenState, + TokenNL: SkipTokenState, + TokenComment: CommentState, + TokenNone: TerminalState, + }, +} + +// ParseAST will parse input from an io.Reader using +// an LL(1) parser. +func ParseAST(r io.Reader) ([]AST, error) { + lexer := iniLexer{} + tokens, err := lexer.Tokenize(r) + if err != nil { + return []AST{}, err + } + + return parse(tokens) +} + +// ParseASTBytes will parse input from a byte slice using +// an LL(1) parser. +func ParseASTBytes(b []byte) ([]AST, error) { + lexer := iniLexer{} + tokens, err := lexer.tokenize(b) + if err != nil { + return []AST{}, err + } + + return parse(tokens) +} + +func parse(tokens []Token) ([]AST, error) { + start := Start + stack := newParseStack(3, len(tokens)) + + stack.Push(start) + s := newSkipper() + +loop: + for stack.Len() > 0 { + k := stack.Pop() + + var tok Token + if len(tokens) == 0 { + // this occurs when all the tokens have been processed + // but reduction of what's left on the stack needs to + // occur. + tok = emptyToken + } else { + tok = tokens[0] + } + + step := parseTable[k.Kind][tok.Type()] + if s.ShouldSkip(tok) { + // being in a skip state with no tokens will break out of + // the parse loop since there is nothing left to process. + if len(tokens) == 0 { + break loop + } + // if should skip is true, we skip the tokens until should skip is set to false. + step = SkipTokenState + } + + switch step { + case TerminalState: + // Finished parsing. Push what should be the last + // statement to the stack. If there is anything left + // on the stack, an error in parsing has occurred. + if k.Kind != ASTKindStart { + stack.MarkComplete(k) + } + break loop + case SkipTokenState: + // When skipping a token, the previous state was popped off the stack. + // To maintain the correct state, the previous state will be pushed + // onto the stack. + stack.Push(k) + case StatementState: + if k.Kind != ASTKindStart { + stack.MarkComplete(k) + } + expr := newExpression(tok) + stack.Push(expr) + case StatementPrimeState: + if tok.Type() != TokenOp { + stack.MarkComplete(k) + continue + } + + if k.Kind != ASTKindExpr { + return nil, NewParseError( + fmt.Sprintf("invalid expression: expected Expr type, but found %T type", k), + ) + } + + k = trimSpaces(k) + expr := newEqualExpr(k, tok) + stack.Push(expr) + case ValueState: + // ValueState requires the previous state to either be an equal expression + // or an expression statement. + // + // This grammar occurs when the RHS is a number, word, or quoted string. + // equal_expr -> lit op equal_expr' + // equal_expr' -> number | string | quoted_string + // quoted_string -> " quoted_string' + // quoted_string' -> string quoted_string_end + // quoted_string_end -> " + // + // otherwise + // expr_stmt -> equal_expr (expr_stmt')* + // expr_stmt' -> ws S | op S | MarkComplete + // S -> equal_expr' expr_stmt' + switch k.Kind { + case ASTKindEqualExpr: + // assigning a value to some key + k.AppendChild(newExpression(tok)) + stack.Push(newExprStatement(k)) + case ASTKindExpr: + k.Root.raw = append(k.Root.raw, tok.Raw()...) + stack.Push(k) + case ASTKindExprStatement: + root := k.GetRoot() + children := root.GetChildren() + if len(children) == 0 { + return nil, NewParseError( + fmt.Sprintf("invalid expression: AST contains no children %s", k.Kind), + ) + } + + rhs := children[len(children)-1] + + if rhs.Root.ValueType != QuotedStringType { + rhs.Root.ValueType = StringType + rhs.Root.raw = append(rhs.Root.raw, tok.Raw()...) + + } + + children[len(children)-1] = rhs + k.SetChildren(children) + + stack.Push(k) + } + case OpenScopeState: + if !runeCompare(tok.Raw(), openBrace) { + return nil, NewParseError("expected '['") + } + // If OpenScopeState is not at the start, we must mark the previous ast as complete + // + // for example: if previous ast was a skip statement; + // we should mark it as complete before we create a new statement + if k.Kind != ASTKindStart { + stack.MarkComplete(k) + } + + stmt := newStatement() + stack.Push(stmt) + case CloseScopeState: + if !runeCompare(tok.Raw(), closeBrace) { + return nil, NewParseError("expected ']'") + } + + k = trimSpaces(k) + stack.Push(newCompletedSectionStatement(k)) + case SectionState: + var stmt AST + + switch k.Kind { + case ASTKindStatement: + // If there are multiple literals inside of a scope declaration, + // then the current token's raw value will be appended to the Name. + // + // This handles cases like [ profile default ] + // + // k will represent a SectionStatement with the children representing + // the label of the section + stmt = newSectionStatement(tok) + case ASTKindSectionStatement: + k.Root.raw = append(k.Root.raw, tok.Raw()...) + stmt = k + default: + return nil, NewParseError( + fmt.Sprintf("invalid statement: expected statement: %v", k.Kind), + ) + } + + stack.Push(stmt) + case MarkCompleteState: + if k.Kind != ASTKindStart { + stack.MarkComplete(k) + } + + if stack.Len() == 0 { + stack.Push(start) + } + case SkipState: + stack.Push(newSkipStatement(k)) + s.Skip() + case CommentState: + if k.Kind == ASTKindStart { + stack.Push(k) + } else { + stack.MarkComplete(k) + } + + stmt := newCommentStatement(tok) + stack.Push(stmt) + default: + return nil, NewParseError( + fmt.Sprintf("invalid state with ASTKind %v and TokenType %v", + k, tok.Type())) + } + + if len(tokens) > 0 { + tokens = tokens[1:] + } + } + + // this occurs when a statement has not been completed + if stack.top > 1 { + return nil, NewParseError(fmt.Sprintf("incomplete ini expression")) + } + + // returns a sublist which excludes the start symbol + return stack.List(), nil +} + +// trimSpaces will trim spaces on the left and right hand side of +// the literal. +func trimSpaces(k AST) AST { + // trim left hand side of spaces + for i := 0; i < len(k.Root.raw); i++ { + if !isWhitespace(k.Root.raw[i]) { + break + } + + k.Root.raw = k.Root.raw[1:] + i-- + } + + // trim right hand side of spaces + for i := len(k.Root.raw) - 1; i >= 0; i-- { + if !isWhitespace(k.Root.raw[i]) { + break + } + + k.Root.raw = k.Root.raw[:len(k.Root.raw)-1] + } + + return k +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/literal_tokens.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/literal_tokens.go new file mode 100644 index 000000000..24df543d3 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/literal_tokens.go @@ -0,0 +1,324 @@ +package ini + +import ( + "fmt" + "strconv" + "strings" +) + +var ( + runesTrue = []rune("true") + runesFalse = []rune("false") +) + +var literalValues = [][]rune{ + runesTrue, + runesFalse, +} + +func isBoolValue(b []rune) bool { + for _, lv := range literalValues { + if isLitValue(lv, b) { + return true + } + } + return false +} + +func isLitValue(want, have []rune) bool { + if len(have) < len(want) { + return false + } + + for i := 0; i < len(want); i++ { + if want[i] != have[i] { + return false + } + } + + return true +} + +// isNumberValue will return whether not the leading characters in +// a byte slice is a number. A number is delimited by whitespace or +// the newline token. +// +// A number is defined to be in a binary, octal, decimal (int | float), hex format, +// or in scientific notation. +func isNumberValue(b []rune) bool { + negativeIndex := 0 + helper := numberHelper{} + needDigit := false + + for i := 0; i < len(b); i++ { + negativeIndex++ + + switch b[i] { + case '-': + if helper.IsNegative() || negativeIndex != 1 { + return false + } + helper.Determine(b[i]) + needDigit = true + continue + case 'e', 'E': + if err := helper.Determine(b[i]); err != nil { + return false + } + negativeIndex = 0 + needDigit = true + continue + case 'b': + if helper.numberFormat == hex { + break + } + fallthrough + case 'o', 'x': + needDigit = true + if i == 0 { + return false + } + + fallthrough + case '.': + if err := helper.Determine(b[i]); err != nil { + return false + } + needDigit = true + continue + } + + if i > 0 && (isNewline(b[i:]) || isWhitespace(b[i])) { + return !needDigit + } + + if !helper.CorrectByte(b[i]) { + return false + } + needDigit = false + } + + return !needDigit +} + +func isValid(b []rune) (bool, int, error) { + if len(b) == 0 { + // TODO: should probably return an error + return false, 0, nil + } + + return isValidRune(b[0]), 1, nil +} + +func isValidRune(r rune) bool { + return r != ':' && r != '=' && r != '[' && r != ']' && r != ' ' && r != '\n' +} + +// ValueType is an enum that will signify what type +// the Value is +type ValueType int + +func (v ValueType) String() string { + switch v { + case NoneType: + return "NONE" + case DecimalType: + return "FLOAT" + case IntegerType: + return "INT" + case StringType: + return "STRING" + case BoolType: + return "BOOL" + } + + return "" +} + +// ValueType enums +const ( + NoneType = ValueType(iota) + DecimalType + IntegerType + StringType + QuotedStringType + BoolType +) + +// Value is a union container +type Value struct { + Type ValueType + raw []rune + + integer int64 + decimal float64 + boolean bool + str string +} + +func newValue(t ValueType, base int, raw []rune) (Value, error) { + v := Value{ + Type: t, + raw: raw, + } + var err error + + switch t { + case DecimalType: + v.decimal, err = strconv.ParseFloat(string(raw), 64) + case IntegerType: + if base != 10 { + raw = raw[2:] + } + + v.integer, err = strconv.ParseInt(string(raw), base, 64) + case StringType: + v.str = string(raw) + case QuotedStringType: + v.str = string(raw[1 : len(raw)-1]) + case BoolType: + v.boolean = runeCompare(v.raw, runesTrue) + } + + // issue 2253 + // + // if the value trying to be parsed is too large, then we will use + // the 'StringType' and raw value instead. + if nerr, ok := err.(*strconv.NumError); ok && nerr.Err == strconv.ErrRange { + v.Type = StringType + v.str = string(raw) + err = nil + } + + return v, err +} + +// Append will append values and change the type to a string +// type. +func (v *Value) Append(tok Token) { + r := tok.Raw() + if v.Type != QuotedStringType { + v.Type = StringType + r = tok.raw[1 : len(tok.raw)-1] + } + if tok.Type() != TokenLit { + v.raw = append(v.raw, tok.Raw()...) + } else { + v.raw = append(v.raw, r...) + } +} + +func (v Value) String() string { + switch v.Type { + case DecimalType: + return fmt.Sprintf("decimal: %f", v.decimal) + case IntegerType: + return fmt.Sprintf("integer: %d", v.integer) + case StringType: + return fmt.Sprintf("string: %s", string(v.raw)) + case QuotedStringType: + return fmt.Sprintf("quoted string: %s", string(v.raw)) + case BoolType: + return fmt.Sprintf("bool: %t", v.boolean) + default: + return "union not set" + } +} + +func newLitToken(b []rune) (Token, int, error) { + n := 0 + var err error + + token := Token{} + if b[0] == '"' { + n, err = getStringValue(b) + if err != nil { + return token, n, err + } + + token = newToken(TokenLit, b[:n], QuotedStringType) + } else if isNumberValue(b) { + var base int + base, n, err = getNumericalValue(b) + if err != nil { + return token, 0, err + } + + value := b[:n] + vType := IntegerType + if contains(value, '.') || hasExponent(value) { + vType = DecimalType + } + token = newToken(TokenLit, value, vType) + token.base = base + } else if isBoolValue(b) { + n, err = getBoolValue(b) + + token = newToken(TokenLit, b[:n], BoolType) + } else { + n, err = getValue(b) + token = newToken(TokenLit, b[:n], StringType) + } + + return token, n, err +} + +// IntValue returns an integer value +func (v Value) IntValue() int64 { + return v.integer +} + +// FloatValue returns a float value +func (v Value) FloatValue() float64 { + return v.decimal +} + +// BoolValue returns a bool value +func (v Value) BoolValue() bool { + return v.boolean +} + +func isTrimmable(r rune) bool { + switch r { + case '\n', ' ': + return true + } + return false +} + +// StringValue returns the string value +func (v Value) StringValue() string { + switch v.Type { + case StringType: + return strings.TrimFunc(string(v.raw), isTrimmable) + case QuotedStringType: + // preserve all characters in the quotes + return string(removeEscapedCharacters(v.raw[1 : len(v.raw)-1])) + default: + return strings.TrimFunc(string(v.raw), isTrimmable) + } +} + +func contains(runes []rune, c rune) bool { + for i := 0; i < len(runes); i++ { + if runes[i] == c { + return true + } + } + + return false +} + +func runeCompare(v1 []rune, v2 []rune) bool { + if len(v1) != len(v2) { + return false + } + + for i := 0; i < len(v1); i++ { + if v1[i] != v2[i] { + return false + } + } + + return true +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/newline_token.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/newline_token.go new file mode 100644 index 000000000..e52ac399f --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/newline_token.go @@ -0,0 +1,30 @@ +package ini + +func isNewline(b []rune) bool { + if len(b) == 0 { + return false + } + + if b[0] == '\n' { + return true + } + + if len(b) < 2 { + return false + } + + return b[0] == '\r' && b[1] == '\n' +} + +func newNewlineToken(b []rune) (Token, int, error) { + i := 1 + if b[0] == '\r' && isNewline(b[1:]) { + i++ + } + + if !isNewline([]rune(b[:i])) { + return emptyToken, 0, NewParseError("invalid new line token") + } + + return newToken(TokenNL, b[:i], NoneType), i, nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/number_helper.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/number_helper.go new file mode 100644 index 000000000..a45c0bc56 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/number_helper.go @@ -0,0 +1,152 @@ +package ini + +import ( + "bytes" + "fmt" + "strconv" +) + +const ( + none = numberFormat(iota) + binary + octal + decimal + hex + exponent +) + +type numberFormat int + +// numberHelper is used to dictate what format a number is in +// and what to do for negative values. Since -1e-4 is a valid +// number, we cannot just simply check for duplicate negatives. +type numberHelper struct { + numberFormat numberFormat + + negative bool + negativeExponent bool +} + +func (b numberHelper) Exists() bool { + return b.numberFormat != none +} + +func (b numberHelper) IsNegative() bool { + return b.negative || b.negativeExponent +} + +func (b *numberHelper) Determine(c rune) error { + if b.Exists() { + return NewParseError(fmt.Sprintf("multiple number formats: 0%v", string(c))) + } + + switch c { + case 'b': + b.numberFormat = binary + case 'o': + b.numberFormat = octal + case 'x': + b.numberFormat = hex + case 'e', 'E': + b.numberFormat = exponent + case '-': + if b.numberFormat != exponent { + b.negative = true + } else { + b.negativeExponent = true + } + case '.': + b.numberFormat = decimal + default: + return NewParseError(fmt.Sprintf("invalid number character: %v", string(c))) + } + + return nil +} + +func (b numberHelper) CorrectByte(c rune) bool { + switch { + case b.numberFormat == binary: + if !isBinaryByte(c) { + return false + } + case b.numberFormat == octal: + if !isOctalByte(c) { + return false + } + case b.numberFormat == hex: + if !isHexByte(c) { + return false + } + case b.numberFormat == decimal: + if !isDigit(c) { + return false + } + case b.numberFormat == exponent: + if !isDigit(c) { + return false + } + case b.negativeExponent: + if !isDigit(c) { + return false + } + case b.negative: + if !isDigit(c) { + return false + } + default: + if !isDigit(c) { + return false + } + } + + return true +} + +func (b numberHelper) Base() int { + switch b.numberFormat { + case binary: + return 2 + case octal: + return 8 + case hex: + return 16 + default: + return 10 + } +} + +func (b numberHelper) String() string { + buf := bytes.Buffer{} + i := 0 + + switch b.numberFormat { + case binary: + i++ + buf.WriteString(strconv.Itoa(i) + ": binary format\n") + case octal: + i++ + buf.WriteString(strconv.Itoa(i) + ": octal format\n") + case hex: + i++ + buf.WriteString(strconv.Itoa(i) + ": hex format\n") + case exponent: + i++ + buf.WriteString(strconv.Itoa(i) + ": exponent format\n") + default: + i++ + buf.WriteString(strconv.Itoa(i) + ": integer format\n") + } + + if b.negative { + i++ + buf.WriteString(strconv.Itoa(i) + ": negative format\n") + } + + if b.negativeExponent { + i++ + buf.WriteString(strconv.Itoa(i) + ": negative exponent format\n") + } + + return buf.String() +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/op_tokens.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/op_tokens.go new file mode 100644 index 000000000..8a84c7cbe --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/op_tokens.go @@ -0,0 +1,39 @@ +package ini + +import ( + "fmt" +) + +var ( + equalOp = []rune("=") + equalColonOp = []rune(":") +) + +func isOp(b []rune) bool { + if len(b) == 0 { + return false + } + + switch b[0] { + case '=': + return true + case ':': + return true + default: + return false + } +} + +func newOpToken(b []rune) (Token, int, error) { + tok := Token{} + + switch b[0] { + case '=': + tok = newToken(TokenOp, equalOp, NoneType) + case ':': + tok = newToken(TokenOp, equalColonOp, NoneType) + default: + return tok, 0, NewParseError(fmt.Sprintf("unexpected op type, %v", b[0])) + } + return tok, 1, nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/parse_error.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/parse_error.go new file mode 100644 index 000000000..457287019 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/parse_error.go @@ -0,0 +1,43 @@ +package ini + +import "fmt" + +const ( + // ErrCodeParseError is returned when a parsing error + // has occurred. + ErrCodeParseError = "INIParseError" +) + +// ParseError is an error which is returned during any part of +// the parsing process. +type ParseError struct { + msg string +} + +// NewParseError will return a new ParseError where message +// is the description of the error. +func NewParseError(message string) *ParseError { + return &ParseError{ + msg: message, + } +} + +// Code will return the ErrCodeParseError +func (err *ParseError) Code() string { + return ErrCodeParseError +} + +// Message returns the error's message +func (err *ParseError) Message() string { + return err.msg +} + +// OrigError return nothing since there will never be any +// original error. +func (err *ParseError) OrigError() error { + return nil +} + +func (err *ParseError) Error() string { + return fmt.Sprintf("%s: %s", err.Code(), err.Message()) +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/parse_stack.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/parse_stack.go new file mode 100644 index 000000000..7f01cf7c7 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/parse_stack.go @@ -0,0 +1,60 @@ +package ini + +import ( + "bytes" + "fmt" +) + +// ParseStack is a stack that contains a container, the stack portion, +// and the list which is the list of ASTs that have been successfully +// parsed. +type ParseStack struct { + top int + container []AST + list []AST + index int +} + +func newParseStack(sizeContainer, sizeList int) ParseStack { + return ParseStack{ + container: make([]AST, sizeContainer), + list: make([]AST, sizeList), + } +} + +// Pop will return and truncate the last container element. +func (s *ParseStack) Pop() AST { + s.top-- + return s.container[s.top] +} + +// Push will add the new AST to the container +func (s *ParseStack) Push(ast AST) { + s.container[s.top] = ast + s.top++ +} + +// MarkComplete will append the AST to the list of completed statements +func (s *ParseStack) MarkComplete(ast AST) { + s.list[s.index] = ast + s.index++ +} + +// List will return the completed statements +func (s ParseStack) List() []AST { + return s.list[:s.index] +} + +// Len will return the length of the container +func (s *ParseStack) Len() int { + return s.top +} + +func (s ParseStack) String() string { + buf := bytes.Buffer{} + for i, node := range s.list { + buf.WriteString(fmt.Sprintf("%d: %v\n", i+1, node)) + } + + return buf.String() +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/sep_tokens.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/sep_tokens.go new file mode 100644 index 000000000..f82095ba2 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/sep_tokens.go @@ -0,0 +1,41 @@ +package ini + +import ( + "fmt" +) + +var ( + emptyRunes = []rune{} +) + +func isSep(b []rune) bool { + if len(b) == 0 { + return false + } + + switch b[0] { + case '[', ']': + return true + default: + return false + } +} + +var ( + openBrace = []rune("[") + closeBrace = []rune("]") +) + +func newSepToken(b []rune) (Token, int, error) { + tok := Token{} + + switch b[0] { + case '[': + tok = newToken(TokenSep, openBrace, NoneType) + case ']': + tok = newToken(TokenSep, closeBrace, NoneType) + default: + return tok, 0, NewParseError(fmt.Sprintf("unexpected sep type, %v", b[0])) + } + return tok, 1, nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/skipper.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/skipper.go new file mode 100644 index 000000000..da7a4049c --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/skipper.go @@ -0,0 +1,45 @@ +package ini + +// skipper is used to skip certain blocks of an ini file. +// Currently skipper is used to skip nested blocks of ini +// files. See example below +// +// [ foo ] +// nested = ; this section will be skipped +// a=b +// c=d +// bar=baz ; this will be included +type skipper struct { + shouldSkip bool + TokenSet bool + prevTok Token +} + +func newSkipper() skipper { + return skipper{ + prevTok: emptyToken, + } +} + +func (s *skipper) ShouldSkip(tok Token) bool { + // should skip state will be modified only if previous token was new line (NL); + // and the current token is not WhiteSpace (WS). + if s.shouldSkip && + s.prevTok.Type() == TokenNL && + tok.Type() != TokenWS { + s.Continue() + return false + } + s.prevTok = tok + return s.shouldSkip +} + +func (s *skipper) Skip() { + s.shouldSkip = true +} + +func (s *skipper) Continue() { + s.shouldSkip = false + // empty token is assigned as we return to default state, when should skip is false + s.prevTok = emptyToken +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/statement.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/statement.go new file mode 100644 index 000000000..18f3fe893 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/statement.go @@ -0,0 +1,35 @@ +package ini + +// Statement is an empty AST mostly used for transitioning states. +func newStatement() AST { + return newAST(ASTKindStatement, AST{}) +} + +// SectionStatement represents a section AST +func newSectionStatement(tok Token) AST { + return newASTWithRootToken(ASTKindSectionStatement, tok) +} + +// ExprStatement represents a completed expression AST +func newExprStatement(ast AST) AST { + return newAST(ASTKindExprStatement, ast) +} + +// CommentStatement represents a comment in the ini definition. +// +// grammar: +// comment -> #comment' | ;comment' +// comment' -> epsilon | value +func newCommentStatement(tok Token) AST { + return newAST(ASTKindCommentStatement, newExpression(tok)) +} + +// CompletedSectionStatement represents a completed section +func newCompletedSectionStatement(ast AST) AST { + return newAST(ASTKindCompletedSectionStatement, ast) +} + +// SkipStatement is used to skip whole statements +func newSkipStatement(ast AST) AST { + return newAST(ASTKindSkipStatement, ast) +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/value_util.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/value_util.go new file mode 100644 index 000000000..305999d29 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/value_util.go @@ -0,0 +1,284 @@ +package ini + +import ( + "fmt" +) + +// getStringValue will return a quoted string and the amount +// of bytes read +// +// an error will be returned if the string is not properly formatted +func getStringValue(b []rune) (int, error) { + if b[0] != '"' { + return 0, NewParseError("strings must start with '\"'") + } + + endQuote := false + i := 1 + + for ; i < len(b) && !endQuote; i++ { + if escaped := isEscaped(b[:i], b[i]); b[i] == '"' && !escaped { + endQuote = true + break + } else if escaped { + /*c, err := getEscapedByte(b[i]) + if err != nil { + return 0, err + } + + b[i-1] = c + b = append(b[:i], b[i+1:]...) + i--*/ + + continue + } + } + + if !endQuote { + return 0, NewParseError("missing '\"' in string value") + } + + return i + 1, nil +} + +// getBoolValue will return a boolean and the amount +// of bytes read +// +// an error will be returned if the boolean is not of a correct +// value +func getBoolValue(b []rune) (int, error) { + if len(b) < 4 { + return 0, NewParseError("invalid boolean value") + } + + n := 0 + for _, lv := range literalValues { + if len(lv) > len(b) { + continue + } + + if isLitValue(lv, b) { + n = len(lv) + } + } + + if n == 0 { + return 0, NewParseError("invalid boolean value") + } + + return n, nil +} + +// getNumericalValue will return a numerical string, the amount +// of bytes read, and the base of the number +// +// an error will be returned if the number is not of a correct +// value +func getNumericalValue(b []rune) (int, int, error) { + if !isDigit(b[0]) { + return 0, 0, NewParseError("invalid digit value") + } + + i := 0 + helper := numberHelper{} + +loop: + for negativeIndex := 0; i < len(b); i++ { + negativeIndex++ + + if !isDigit(b[i]) { + switch b[i] { + case '-': + if helper.IsNegative() || negativeIndex != 1 { + return 0, 0, NewParseError("parse error '-'") + } + + n := getNegativeNumber(b[i:]) + i += (n - 1) + helper.Determine(b[i]) + continue + case '.': + if err := helper.Determine(b[i]); err != nil { + return 0, 0, err + } + case 'e', 'E': + if err := helper.Determine(b[i]); err != nil { + return 0, 0, err + } + + negativeIndex = 0 + case 'b': + if helper.numberFormat == hex { + break + } + fallthrough + case 'o', 'x': + if i == 0 && b[i] != '0' { + return 0, 0, NewParseError("incorrect base format, expected leading '0'") + } + + if i != 1 { + return 0, 0, NewParseError(fmt.Sprintf("incorrect base format found %s at %d index", string(b[i]), i)) + } + + if err := helper.Determine(b[i]); err != nil { + return 0, 0, err + } + default: + if isWhitespace(b[i]) { + break loop + } + + if isNewline(b[i:]) { + break loop + } + + if !(helper.numberFormat == hex && isHexByte(b[i])) { + if i+2 < len(b) && !isNewline(b[i:i+2]) { + return 0, 0, NewParseError("invalid numerical character") + } else if !isNewline([]rune{b[i]}) { + return 0, 0, NewParseError("invalid numerical character") + } + + break loop + } + } + } + } + + return helper.Base(), i, nil +} + +// isDigit will return whether or not something is an integer +func isDigit(b rune) bool { + return b >= '0' && b <= '9' +} + +func hasExponent(v []rune) bool { + return contains(v, 'e') || contains(v, 'E') +} + +func isBinaryByte(b rune) bool { + switch b { + case '0', '1': + return true + default: + return false + } +} + +func isOctalByte(b rune) bool { + switch b { + case '0', '1', '2', '3', '4', '5', '6', '7': + return true + default: + return false + } +} + +func isHexByte(b rune) bool { + if isDigit(b) { + return true + } + return (b >= 'A' && b <= 'F') || + (b >= 'a' && b <= 'f') +} + +func getValue(b []rune) (int, error) { + i := 0 + + for i < len(b) { + if isNewline(b[i:]) { + break + } + + if isOp(b[i:]) { + break + } + + valid, n, err := isValid(b[i:]) + if err != nil { + return 0, err + } + + if !valid { + break + } + + i += n + } + + return i, nil +} + +// getNegativeNumber will return a negative number from a +// byte slice. This will iterate through all characters until +// a non-digit has been found. +func getNegativeNumber(b []rune) int { + if b[0] != '-' { + return 0 + } + + i := 1 + for ; i < len(b); i++ { + if !isDigit(b[i]) { + return i + } + } + + return i +} + +// isEscaped will return whether or not the character is an escaped +// character. +func isEscaped(value []rune, b rune) bool { + if len(value) == 0 { + return false + } + + switch b { + case '\'': // single quote + case '"': // quote + case 'n': // newline + case 't': // tab + case '\\': // backslash + default: + return false + } + + return value[len(value)-1] == '\\' +} + +func getEscapedByte(b rune) (rune, error) { + switch b { + case '\'': // single quote + return '\'', nil + case '"': // quote + return '"', nil + case 'n': // newline + return '\n', nil + case 't': // table + return '\t', nil + case '\\': // backslash + return '\\', nil + default: + return b, NewParseError(fmt.Sprintf("invalid escaped character %c", b)) + } +} + +func removeEscapedCharacters(b []rune) []rune { + for i := 0; i < len(b); i++ { + if isEscaped(b[:i], b[i]) { + c, err := getEscapedByte(b[i]) + if err != nil { + return b + } + + b[i-1] = c + b = append(b[:i], b[i+1:]...) + i-- + } + } + + return b +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/visitor.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/visitor.go new file mode 100644 index 000000000..94841c324 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/visitor.go @@ -0,0 +1,166 @@ +package ini + +import ( + "fmt" + "sort" +) + +// Visitor is an interface used by walkers that will +// traverse an array of ASTs. +type Visitor interface { + VisitExpr(AST) error + VisitStatement(AST) error +} + +// DefaultVisitor is used to visit statements and expressions +// and ensure that they are both of the correct format. +// In addition, upon visiting this will build sections and populate +// the Sections field which can be used to retrieve profile +// configuration. +type DefaultVisitor struct { + scope string + Sections Sections +} + +// NewDefaultVisitor return a DefaultVisitor +func NewDefaultVisitor() *DefaultVisitor { + return &DefaultVisitor{ + Sections: Sections{ + container: map[string]Section{}, + }, + } +} + +// VisitExpr visits expressions... +func (v *DefaultVisitor) VisitExpr(expr AST) error { + t := v.Sections.container[v.scope] + if t.values == nil { + t.values = values{} + } + + switch expr.Kind { + case ASTKindExprStatement: + opExpr := expr.GetRoot() + switch opExpr.Kind { + case ASTKindEqualExpr: + children := opExpr.GetChildren() + if len(children) <= 1 { + return NewParseError("unexpected token type") + } + + rhs := children[1] + + if rhs.Root.Type() != TokenLit { + return NewParseError("unexpected token type") + } + + key := EqualExprKey(opExpr) + v, err := newValue(rhs.Root.ValueType, rhs.Root.base, rhs.Root.Raw()) + if err != nil { + return err + } + + t.values[key] = v + default: + return NewParseError(fmt.Sprintf("unsupported expression %v", expr)) + } + default: + return NewParseError(fmt.Sprintf("unsupported expression %v", expr)) + } + + v.Sections.container[v.scope] = t + return nil +} + +// VisitStatement visits statements... +func (v *DefaultVisitor) VisitStatement(stmt AST) error { + switch stmt.Kind { + case ASTKindCompletedSectionStatement: + child := stmt.GetRoot() + if child.Kind != ASTKindSectionStatement { + return NewParseError(fmt.Sprintf("unsupported child statement: %T", child)) + } + + name := string(child.Root.Raw()) + v.Sections.container[name] = Section{} + v.scope = name + default: + return NewParseError(fmt.Sprintf("unsupported statement: %s", stmt.Kind)) + } + + return nil +} + +// Sections is a map of Section structures that represent +// a configuration. +type Sections struct { + container map[string]Section +} + +// GetSection will return section p. If section p does not exist, +// false will be returned in the second parameter. +func (t Sections) GetSection(p string) (Section, bool) { + v, ok := t.container[p] + return v, ok +} + +// values represents a map of union values. +type values map[string]Value + +// List will return a list of all sections that were successfully +// parsed. +func (t Sections) List() []string { + keys := make([]string, len(t.container)) + i := 0 + for k := range t.container { + keys[i] = k + i++ + } + + sort.Strings(keys) + return keys +} + +// Section contains a name and values. This represent +// a sectioned entry in a configuration file. +type Section struct { + Name string + values values +} + +// Has will return whether or not an entry exists in a given section +func (t Section) Has(k string) bool { + _, ok := t.values[k] + return ok +} + +// ValueType will returned what type the union is set to. If +// k was not found, the NoneType will be returned. +func (t Section) ValueType(k string) (ValueType, bool) { + v, ok := t.values[k] + return v.Type, ok +} + +// Bool returns a bool value at k +func (t Section) Bool(k string) bool { + return t.values[k].BoolValue() +} + +// Int returns an integer value at k +func (t Section) Int(k string) int64 { + return t.values[k].IntValue() +} + +// Float64 returns a float value at k +func (t Section) Float64(k string) float64 { + return t.values[k].FloatValue() +} + +// String returns the string value at k +func (t Section) String(k string) string { + _, ok := t.values[k] + if !ok { + return "" + } + return t.values[k].StringValue() +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/walker.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/walker.go new file mode 100644 index 000000000..99915f7f7 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/walker.go @@ -0,0 +1,25 @@ +package ini + +// Walk will traverse the AST using the v, the Visitor. +func Walk(tree []AST, v Visitor) error { + for _, node := range tree { + switch node.Kind { + case ASTKindExpr, + ASTKindExprStatement: + + if err := v.VisitExpr(node); err != nil { + return err + } + case ASTKindStatement, + ASTKindCompletedSectionStatement, + ASTKindNestedSectionStatement, + ASTKindCompletedNestedSectionStatement: + + if err := v.VisitStatement(node); err != nil { + return err + } + } + } + + return nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/ws_token.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/ws_token.go new file mode 100644 index 000000000..7ffb4ae06 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/ws_token.go @@ -0,0 +1,24 @@ +package ini + +import ( + "unicode" +) + +// isWhitespace will return whether or not the character is +// a whitespace character. +// +// Whitespace is defined as a space or tab. +func isWhitespace(c rune) bool { + return unicode.IsSpace(c) && c != '\n' && c != '\r' +} + +func newWSToken(b []rune) (Token, int, error) { + i := 0 + for ; i < len(b); i++ { + if !isWhitespace(b[i]) { + break + } + } + + return newToken(TokenWS, b[:i], NoneType), i, nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/sdkio/byte.go b/vendor/github.com/aws/aws-sdk-go/internal/sdkio/byte.go new file mode 100644 index 000000000..6c443988b --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/sdkio/byte.go @@ -0,0 +1,12 @@ +package sdkio + +const ( + // Byte is 8 bits + Byte int64 = 1 + // KibiByte (KiB) is 1024 Bytes + KibiByte = Byte * 1024 + // MebiByte (MiB) is 1024 KiB + MebiByte = KibiByte * 1024 + // GibiByte (GiB) is 1024 MiB + GibiByte = MebiByte * 1024 +) diff --git a/vendor/github.com/aws/aws-sdk-go/internal/sdkmath/floor.go b/vendor/github.com/aws/aws-sdk-go/internal/sdkmath/floor.go new file mode 100644 index 000000000..44898eed0 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/sdkmath/floor.go @@ -0,0 +1,15 @@ +// +build go1.10 + +package sdkmath + +import "math" + +// Round returns the nearest integer, rounding half away from zero. +// +// Special cases are: +// Round(±0) = ±0 +// Round(±Inf) = ±Inf +// Round(NaN) = NaN +func Round(x float64) float64 { + return math.Round(x) +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/sdkmath/floor_go1.9.go b/vendor/github.com/aws/aws-sdk-go/internal/sdkmath/floor_go1.9.go new file mode 100644 index 000000000..810ec7f08 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/sdkmath/floor_go1.9.go @@ -0,0 +1,56 @@ +// +build !go1.10 + +package sdkmath + +import "math" + +// Copied from the Go standard library's (Go 1.12) math/floor.go for use in +// Go version prior to Go 1.10. +const ( + uvone = 0x3FF0000000000000 + mask = 0x7FF + shift = 64 - 11 - 1 + bias = 1023 + signMask = 1 << 63 + fracMask = 1<= 0.5 { + // return t + Copysign(1, x) + // } + // return t + // } + bits := math.Float64bits(x) + e := uint(bits>>shift) & mask + if e < bias { + // Round abs(x) < 1 including denormals. + bits &= signMask // +-0 + if e == bias-1 { + bits |= uvone // +-1 + } + } else if e < bias+shift { + // Round any abs(x) >= 1 containing a fractional component [0,1). + // + // Numbers with larger exponents are returned unchanged since they + // must be either an integer, infinity, or NaN. + const half = 1 << (shift - 1) + e -= bias + bits += half >> e + bits &^= fracMask >> e + } + return math.Float64frombits(bits) +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/sdkrand/read.go b/vendor/github.com/aws/aws-sdk-go/internal/sdkrand/read.go new file mode 100644 index 000000000..f4651da2d --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/sdkrand/read.go @@ -0,0 +1,11 @@ +// +build go1.6 + +package sdkrand + +import "math/rand" + +// Read provides the stub for math.Rand.Read method support for go version's +// 1.6 and greater. +func Read(r *rand.Rand, p []byte) (int, error) { + return r.Read(p) +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/sdkrand/read_1_5.go b/vendor/github.com/aws/aws-sdk-go/internal/sdkrand/read_1_5.go new file mode 100644 index 000000000..b1d93a33d --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/sdkrand/read_1_5.go @@ -0,0 +1,24 @@ +// +build !go1.6 + +package sdkrand + +import "math/rand" + +// Read backfills Go 1.6's math.Rand.Reader for Go 1.5 +func Read(r *rand.Rand, p []byte) (n int, err error) { + // Copy of Go standard libraries math package's read function not added to + // standard library until Go 1.6. + var pos int8 + var val int64 + for n = 0; n < len(p); n++ { + if pos == 0 { + val = r.Int63() + pos = 7 + } + p[n] = byte(val) + val >>= 8 + pos-- + } + + return n, err +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/sdkuri/path.go b/vendor/github.com/aws/aws-sdk-go/internal/sdkuri/path.go new file mode 100644 index 000000000..38ea61afe --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/sdkuri/path.go @@ -0,0 +1,23 @@ +package sdkuri + +import ( + "path" + "strings" +) + +// PathJoin will join the elements of the path delimited by the "/" +// character. Similar to path.Join with the exception the trailing "/" +// character is preserved if present. +func PathJoin(elems ...string) string { + if len(elems) == 0 { + return "" + } + + hasTrailing := strings.HasSuffix(elems[len(elems)-1], "/") + str := path.Join(elems...) + if hasTrailing && str != "/" { + str += "/" + } + + return str +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/shareddefaults/ecs_container.go b/vendor/github.com/aws/aws-sdk-go/internal/shareddefaults/ecs_container.go new file mode 100644 index 000000000..7da8a49ce --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/shareddefaults/ecs_container.go @@ -0,0 +1,12 @@ +package shareddefaults + +const ( + // ECSCredsProviderEnvVar is an environmental variable key used to + // determine which path needs to be hit. + ECSCredsProviderEnvVar = "AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" +) + +// ECSContainerCredentialsURI is the endpoint to retrieve container +// credentials. This can be overridden to test to ensure the credential process +// is behaving correctly. +var ECSContainerCredentialsURI = "http://169.254.170.2" diff --git a/vendor/github.com/aws/aws-sdk-go/internal/strings/strings.go b/vendor/github.com/aws/aws-sdk-go/internal/strings/strings.go new file mode 100644 index 000000000..d008ae27c --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/strings/strings.go @@ -0,0 +1,11 @@ +package strings + +import ( + "strings" +) + +// HasPrefixFold tests whether the string s begins with prefix, interpreted as UTF-8 strings, +// under Unicode case-folding. +func HasPrefixFold(s, prefix string) bool { + return len(s) >= len(prefix) && strings.EqualFold(s[0:len(prefix)], prefix) +} diff --git a/vendor/golang.org/x/tools/LICENSE b/vendor/github.com/aws/aws-sdk-go/internal/sync/singleflight/LICENSE similarity index 100% rename from vendor/golang.org/x/tools/LICENSE rename to vendor/github.com/aws/aws-sdk-go/internal/sync/singleflight/LICENSE diff --git a/vendor/github.com/aws/aws-sdk-go/internal/sync/singleflight/singleflight.go b/vendor/github.com/aws/aws-sdk-go/internal/sync/singleflight/singleflight.go new file mode 100644 index 000000000..14ad0c589 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/sync/singleflight/singleflight.go @@ -0,0 +1,120 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package singleflight provides a duplicate function call suppression +// mechanism. +package singleflight + +import "sync" + +// call is an in-flight or completed singleflight.Do call +type call struct { + wg sync.WaitGroup + + // These fields are written once before the WaitGroup is done + // and are only read after the WaitGroup is done. + val interface{} + err error + + // forgotten indicates whether Forget was called with this call's key + // while the call was still in flight. + forgotten bool + + // These fields are read and written with the singleflight + // mutex held before the WaitGroup is done, and are read but + // not written after the WaitGroup is done. + dups int + chans []chan<- Result +} + +// Group represents a class of work and forms a namespace in +// which units of work can be executed with duplicate suppression. +type Group struct { + mu sync.Mutex // protects m + m map[string]*call // lazily initialized +} + +// Result holds the results of Do, so they can be passed +// on a channel. +type Result struct { + Val interface{} + Err error + Shared bool +} + +// Do executes and returns the results of the given function, making +// sure that only one execution is in-flight for a given key at a +// time. If a duplicate comes in, the duplicate caller waits for the +// original to complete and receives the same results. +// The return value shared indicates whether v was given to multiple callers. +func (g *Group) Do(key string, fn func() (interface{}, error)) (v interface{}, err error, shared bool) { + g.mu.Lock() + if g.m == nil { + g.m = make(map[string]*call) + } + if c, ok := g.m[key]; ok { + c.dups++ + g.mu.Unlock() + c.wg.Wait() + return c.val, c.err, true + } + c := new(call) + c.wg.Add(1) + g.m[key] = c + g.mu.Unlock() + + g.doCall(c, key, fn) + return c.val, c.err, c.dups > 0 +} + +// DoChan is like Do but returns a channel that will receive the +// results when they are ready. +func (g *Group) DoChan(key string, fn func() (interface{}, error)) <-chan Result { + ch := make(chan Result, 1) + g.mu.Lock() + if g.m == nil { + g.m = make(map[string]*call) + } + if c, ok := g.m[key]; ok { + c.dups++ + c.chans = append(c.chans, ch) + g.mu.Unlock() + return ch + } + c := &call{chans: []chan<- Result{ch}} + c.wg.Add(1) + g.m[key] = c + g.mu.Unlock() + + go g.doCall(c, key, fn) + + return ch +} + +// doCall handles the single call for a key. +func (g *Group) doCall(c *call, key string, fn func() (interface{}, error)) { + c.val, c.err = fn() + c.wg.Done() + + g.mu.Lock() + if !c.forgotten { + delete(g.m, key) + } + for _, ch := range c.chans { + ch <- Result{c.val, c.err, c.dups > 0} + } + g.mu.Unlock() +} + +// Forget tells the singleflight to forget about a key. Future calls +// to Do for this key will call the function rather than waiting for +// an earlier call to complete. +func (g *Group) Forget(key string) { + g.mu.Lock() + if c, ok := g.m[key]; ok { + c.forgotten = true + } + delete(g.m, key) + g.mu.Unlock() +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/host.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/host.go new file mode 100644 index 000000000..d7d42db0a --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/host.go @@ -0,0 +1,68 @@ +package protocol + +import ( + "strings" + + "github.com/aws/aws-sdk-go/aws/request" +) + +// ValidateEndpointHostHandler is a request handler that will validate the +// request endpoint's hosts is a valid RFC 3986 host. +var ValidateEndpointHostHandler = request.NamedHandler{ + Name: "awssdk.protocol.ValidateEndpointHostHandler", + Fn: func(r *request.Request) { + err := ValidateEndpointHost(r.Operation.Name, r.HTTPRequest.URL.Host) + if err != nil { + r.Error = err + } + }, +} + +// ValidateEndpointHost validates that the host string passed in is a valid RFC +// 3986 host. Returns error if the host is not valid. +func ValidateEndpointHost(opName, host string) error { + paramErrs := request.ErrInvalidParams{Context: opName} + labels := strings.Split(host, ".") + + for i, label := range labels { + if i == len(labels)-1 && len(label) == 0 { + // Allow trailing dot for FQDN hosts. + continue + } + + if !ValidHostLabel(label) { + paramErrs.Add(request.NewErrParamFormat( + "endpoint host label", "[a-zA-Z0-9-]{1,63}", label)) + } + } + + if len(host) > 255 { + paramErrs.Add(request.NewErrParamMaxLen( + "endpoint host", 255, host, + )) + } + + if paramErrs.Len() > 0 { + return paramErrs + } + return nil +} + +// ValidHostLabel returns if the label is a valid RFC 3986 host label. +func ValidHostLabel(label string) bool { + if l := len(label); l == 0 || l > 63 { + return false + } + for _, r := range label { + switch { + case r >= '0' && r <= '9': + case r >= 'A' && r <= 'Z': + case r >= 'a' && r <= 'z': + case r == '-': + default: + return false + } + } + + return true +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/host_prefix.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/host_prefix.go new file mode 100644 index 000000000..915b0fcaf --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/host_prefix.go @@ -0,0 +1,54 @@ +package protocol + +import ( + "strings" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/request" +) + +// HostPrefixHandlerName is the handler name for the host prefix request +// handler. +const HostPrefixHandlerName = "awssdk.endpoint.HostPrefixHandler" + +// NewHostPrefixHandler constructs a build handler +func NewHostPrefixHandler(prefix string, labelsFn func() map[string]string) request.NamedHandler { + builder := HostPrefixBuilder{ + Prefix: prefix, + LabelsFn: labelsFn, + } + + return request.NamedHandler{ + Name: HostPrefixHandlerName, + Fn: builder.Build, + } +} + +// HostPrefixBuilder provides the request handler to expand and prepend +// the host prefix into the operation's request endpoint host. +type HostPrefixBuilder struct { + Prefix string + LabelsFn func() map[string]string +} + +// Build updates the passed in Request with the HostPrefix template expanded. +func (h HostPrefixBuilder) Build(r *request.Request) { + if aws.BoolValue(r.Config.DisableEndpointHostPrefix) { + return + } + + var labels map[string]string + if h.LabelsFn != nil { + labels = h.LabelsFn() + } + + prefix := h.Prefix + for name, value := range labels { + prefix = strings.Replace(prefix, "{"+name+"}", value, -1) + } + + r.HTTPRequest.URL.Host = prefix + r.HTTPRequest.URL.Host + if len(r.HTTPRequest.Host) > 0 { + r.HTTPRequest.Host = prefix + r.HTTPRequest.Host + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/build.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/build.go index ec765ba25..864fb6704 100644 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/build.go +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/build.go @@ -216,7 +216,17 @@ func buildScalar(v reflect.Value, buf *bytes.Buffer, tag reflect.StructTag) erro default: switch converted := value.Interface().(type) { case time.Time: - buf.Write(strconv.AppendInt(scratch[:0], converted.UTC().Unix(), 10)) + format := tag.Get("timestampFormat") + if len(format) == 0 { + format = protocol.UnixTimeFormatName + } + + ts := protocol.FormatTime(format, converted) + if format != protocol.UnixTimeFormatName { + ts = `"` + ts + `"` + } + + buf.WriteString(ts) case []byte: if !value.IsNil() { buf.WriteByte('"') diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/unmarshal.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/unmarshal.go index 037e1e7be..5e9499699 100644 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/unmarshal.go +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/unmarshal.go @@ -1,39 +1,76 @@ package jsonutil import ( + "bytes" "encoding/base64" "encoding/json" "fmt" "io" - "io/ioutil" "reflect" + "strings" "time" "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/private/protocol" ) +// UnmarshalJSONError unmarshal's the reader's JSON document into the passed in +// type. The value to unmarshal the json document into must be a pointer to the +// type. +func UnmarshalJSONError(v interface{}, stream io.Reader) error { + var errBuf bytes.Buffer + body := io.TeeReader(stream, &errBuf) + + err := json.NewDecoder(body).Decode(v) + if err != nil { + msg := "failed decoding error message" + if err == io.EOF { + msg = "error message missing" + err = nil + } + return awserr.NewUnmarshalError(err, msg, errBuf.Bytes()) + } + + return nil +} + // UnmarshalJSON reads a stream and unmarshals the results in object v. func UnmarshalJSON(v interface{}, stream io.Reader) error { var out interface{} - b, err := ioutil.ReadAll(stream) - if err != nil { + err := json.NewDecoder(stream).Decode(&out) + if err == io.EOF { + return nil + } else if err != nil { return err } - if len(b) == 0 { - return nil - } + return unmarshaler{}.unmarshalAny(reflect.ValueOf(v), out, "") +} + +// UnmarshalJSONCaseInsensitive reads a stream and unmarshals the result into the +// object v. Ignores casing for structure members. +func UnmarshalJSONCaseInsensitive(v interface{}, stream io.Reader) error { + var out interface{} - if err := json.Unmarshal(b, &out); err != nil { + err := json.NewDecoder(stream).Decode(&out) + if err == io.EOF { + return nil + } else if err != nil { return err } - return unmarshalAny(reflect.ValueOf(v), out, "") + return unmarshaler{ + caseInsensitive: true, + }.unmarshalAny(reflect.ValueOf(v), out, "") +} + +type unmarshaler struct { + caseInsensitive bool } -func unmarshalAny(value reflect.Value, data interface{}, tag reflect.StructTag) error { +func (u unmarshaler) unmarshalAny(value reflect.Value, data interface{}, tag reflect.StructTag) error { vtype := value.Type() if vtype.Kind() == reflect.Ptr { vtype = vtype.Elem() // check kind of actual element type @@ -65,17 +102,17 @@ func unmarshalAny(value reflect.Value, data interface{}, tag reflect.StructTag) if field, ok := vtype.FieldByName("_"); ok { tag = field.Tag } - return unmarshalStruct(value, data, tag) + return u.unmarshalStruct(value, data, tag) case "list": - return unmarshalList(value, data, tag) + return u.unmarshalList(value, data, tag) case "map": - return unmarshalMap(value, data, tag) + return u.unmarshalMap(value, data, tag) default: - return unmarshalScalar(value, data, tag) + return u.unmarshalScalar(value, data, tag) } } -func unmarshalStruct(value reflect.Value, data interface{}, tag reflect.StructTag) error { +func (u unmarshaler) unmarshalStruct(value reflect.Value, data interface{}, tag reflect.StructTag) error { if data == nil { return nil } @@ -99,7 +136,7 @@ func unmarshalStruct(value reflect.Value, data interface{}, tag reflect.StructTa // unwrap any payloads if payload := tag.Get("payload"); payload != "" { field, _ := t.FieldByName(payload) - return unmarshalAny(value.FieldByName(payload), data, field.Tag) + return u.unmarshalAny(value.FieldByName(payload), data, field.Tag) } for i := 0; i < t.NumField(); i++ { @@ -113,9 +150,19 @@ func unmarshalStruct(value reflect.Value, data interface{}, tag reflect.StructTa if locName := field.Tag.Get("locationName"); locName != "" { name = locName } + if u.caseInsensitive { + if _, ok := mapData[name]; !ok { + // Fallback to uncased name search if the exact name didn't match. + for kn, v := range mapData { + if strings.EqualFold(kn, name) { + mapData[name] = v + } + } + } + } member := value.FieldByIndex(field.Index) - err := unmarshalAny(member, mapData[name], field.Tag) + err := u.unmarshalAny(member, mapData[name], field.Tag) if err != nil { return err } @@ -123,7 +170,7 @@ func unmarshalStruct(value reflect.Value, data interface{}, tag reflect.StructTa return nil } -func unmarshalList(value reflect.Value, data interface{}, tag reflect.StructTag) error { +func (u unmarshaler) unmarshalList(value reflect.Value, data interface{}, tag reflect.StructTag) error { if data == nil { return nil } @@ -138,7 +185,7 @@ func unmarshalList(value reflect.Value, data interface{}, tag reflect.StructTag) } for i, c := range listData { - err := unmarshalAny(value.Index(i), c, "") + err := u.unmarshalAny(value.Index(i), c, "") if err != nil { return err } @@ -147,7 +194,7 @@ func unmarshalList(value reflect.Value, data interface{}, tag reflect.StructTag) return nil } -func unmarshalMap(value reflect.Value, data interface{}, tag reflect.StructTag) error { +func (u unmarshaler) unmarshalMap(value reflect.Value, data interface{}, tag reflect.StructTag) error { if data == nil { return nil } @@ -164,17 +211,14 @@ func unmarshalMap(value reflect.Value, data interface{}, tag reflect.StructTag) kvalue := reflect.ValueOf(k) vvalue := reflect.New(value.Type().Elem()).Elem() - unmarshalAny(vvalue, v, "") + u.unmarshalAny(vvalue, v, "") value.SetMapIndex(kvalue, vvalue) } return nil } -func unmarshalScalar(value reflect.Value, data interface{}, tag reflect.StructTag) error { - errf := func() error { - return fmt.Errorf("unsupported value: %v (%s)", value.Interface(), value.Type()) - } +func (u unmarshaler) unmarshalScalar(value reflect.Value, data interface{}, tag reflect.StructTag) error { switch d := data.(type) { case nil: @@ -189,6 +233,17 @@ func unmarshalScalar(value reflect.Value, data interface{}, tag reflect.StructTa return err } value.Set(reflect.ValueOf(b)) + case *time.Time: + format := tag.Get("timestampFormat") + if len(format) == 0 { + format = protocol.ISO8601TimeFormatName + } + + t, err := protocol.ParseTime(format, d) + if err != nil { + return err + } + value.Set(reflect.ValueOf(&t)) case aws.JSONValue: // No need to use escaping as the value is a non-quoted string. v, err := protocol.DecodeJSONValue(d, protocol.NoEscape) @@ -197,7 +252,7 @@ func unmarshalScalar(value reflect.Value, data interface{}, tag reflect.StructTa } value.Set(reflect.ValueOf(v)) default: - return errf() + return fmt.Errorf("unsupported value: %v (%s)", value.Interface(), value.Type()) } case float64: switch value.Interface().(type) { @@ -207,17 +262,18 @@ func unmarshalScalar(value reflect.Value, data interface{}, tag reflect.StructTa case *float64: value.Set(reflect.ValueOf(&d)) case *time.Time: + // Time unmarshaled from a float64 can only be epoch seconds t := time.Unix(int64(d), 0).UTC() value.Set(reflect.ValueOf(&t)) default: - return errf() + return fmt.Errorf("unsupported value: %v (%s)", value.Interface(), value.Type()) } case bool: switch value.Interface().(type) { case *bool: value.Set(reflect.ValueOf(&d)) default: - return errf() + return fmt.Errorf("unsupported value: %v (%s)", value.Interface(), value.Type()) } default: return fmt.Errorf("unsupported JSON value (%v)", data) diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/jsonrpc/jsonrpc.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/jsonrpc/jsonrpc.go index 56af4dc44..a029217e4 100644 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/jsonrpc/jsonrpc.go +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/jsonrpc/jsonrpc.go @@ -2,14 +2,10 @@ // requests and responses. package jsonrpc -//go:generate go run -tags codegen ../../../models/protocol_tests/generate.go ../../../models/protocol_tests/input/json.json build_test.go -//go:generate go run -tags codegen ../../../models/protocol_tests/generate.go ../../../models/protocol_tests/output/json.json unmarshal_test.go +//go:generate go run -tags codegen ../../../private/model/cli/gen-protocol-tests ../../../models/protocol_tests/input/json.json build_test.go +//go:generate go run -tags codegen ../../../private/model/cli/gen-protocol-tests ../../../models/protocol_tests/output/json.json unmarshal_test.go import ( - "encoding/json" - "io/ioutil" - "strings" - "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/aws/request" "github.com/aws/aws-sdk-go/private/protocol/json/jsonutil" @@ -18,17 +14,26 @@ import ( var emptyJSON = []byte("{}") -// BuildHandler is a named request handler for building jsonrpc protocol requests -var BuildHandler = request.NamedHandler{Name: "awssdk.jsonrpc.Build", Fn: Build} - -// UnmarshalHandler is a named request handler for unmarshaling jsonrpc protocol requests -var UnmarshalHandler = request.NamedHandler{Name: "awssdk.jsonrpc.Unmarshal", Fn: Unmarshal} +// BuildHandler is a named request handler for building jsonrpc protocol +// requests +var BuildHandler = request.NamedHandler{ + Name: "awssdk.jsonrpc.Build", + Fn: Build, +} -// UnmarshalMetaHandler is a named request handler for unmarshaling jsonrpc protocol request metadata -var UnmarshalMetaHandler = request.NamedHandler{Name: "awssdk.jsonrpc.UnmarshalMeta", Fn: UnmarshalMeta} +// UnmarshalHandler is a named request handler for unmarshaling jsonrpc +// protocol requests +var UnmarshalHandler = request.NamedHandler{ + Name: "awssdk.jsonrpc.Unmarshal", + Fn: Unmarshal, +} -// UnmarshalErrorHandler is a named request handler for unmarshaling jsonrpc protocol request errors -var UnmarshalErrorHandler = request.NamedHandler{Name: "awssdk.jsonrpc.UnmarshalError", Fn: UnmarshalError} +// UnmarshalMetaHandler is a named request handler for unmarshaling jsonrpc +// protocol request metadata +var UnmarshalMetaHandler = request.NamedHandler{ + Name: "awssdk.jsonrpc.UnmarshalMeta", + Fn: UnmarshalMeta, +} // Build builds a JSON payload for a JSON RPC request. func Build(req *request.Request) { @@ -37,7 +42,7 @@ func Build(req *request.Request) { if req.ParamsFilled() { buf, err = jsonutil.BuildJSON(req.Params) if err != nil { - req.Error = awserr.New("SerializationError", "failed encoding JSON RPC request", err) + req.Error = awserr.New(request.ErrCodeSerialization, "failed encoding JSON RPC request", err) return } } else { @@ -52,9 +57,12 @@ func Build(req *request.Request) { target := req.ClientInfo.TargetPrefix + "." + req.Operation.Name req.HTTPRequest.Header.Add("X-Amz-Target", target) } - if req.ClientInfo.JSONVersion != "" { + + // Only set the content type if one is not already specified and an + // JSONVersion is specified. + if ct, v := req.HTTPRequest.Header.Get("Content-Type"), req.ClientInfo.JSONVersion; len(ct) == 0 && len(v) != 0 { jsonVersion := req.ClientInfo.JSONVersion - req.HTTPRequest.Header.Add("Content-Type", "application/x-amz-json-"+jsonVersion) + req.HTTPRequest.Header.Set("Content-Type", "application/x-amz-json-"+jsonVersion) } } @@ -64,7 +72,11 @@ func Unmarshal(req *request.Request) { if req.DataFilled() { err := jsonutil.UnmarshalJSON(req.Data, req.HTTPResponse.Body) if err != nil { - req.Error = awserr.New("SerializationError", "failed decoding JSON RPC response", err) + req.Error = awserr.NewRequestFailure( + awserr.New(request.ErrCodeSerialization, "failed decoding JSON RPC response", err), + req.HTTPResponse.StatusCode, + req.RequestID, + ) } } return @@ -74,38 +86,3 @@ func Unmarshal(req *request.Request) { func UnmarshalMeta(req *request.Request) { rest.UnmarshalMeta(req) } - -// UnmarshalError unmarshals an error response for a JSON RPC service. -func UnmarshalError(req *request.Request) { - defer req.HTTPResponse.Body.Close() - bodyBytes, err := ioutil.ReadAll(req.HTTPResponse.Body) - if err != nil { - req.Error = awserr.New("SerializationError", "failed reading JSON RPC error response", err) - return - } - if len(bodyBytes) == 0 { - req.Error = awserr.NewRequestFailure( - awserr.New("SerializationError", req.HTTPResponse.Status, nil), - req.HTTPResponse.StatusCode, - "", - ) - return - } - var jsonErr jsonErrorResponse - if err := json.Unmarshal(bodyBytes, &jsonErr); err != nil { - req.Error = awserr.New("SerializationError", "failed decoding JSON RPC error response", err) - return - } - - codes := strings.SplitN(jsonErr.Code, "#", 2) - req.Error = awserr.NewRequestFailure( - awserr.New(codes[len(codes)-1], jsonErr.Message, nil), - req.HTTPResponse.StatusCode, - req.RequestID, - ) -} - -type jsonErrorResponse struct { - Code string `json:"__type"` - Message string `json:"message"` -} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/jsonrpc/unmarshal_error.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/jsonrpc/unmarshal_error.go new file mode 100644 index 000000000..c0c52e2db --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/jsonrpc/unmarshal_error.go @@ -0,0 +1,107 @@ +package jsonrpc + +import ( + "bytes" + "io" + "io/ioutil" + "net/http" + "strings" + + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/request" + "github.com/aws/aws-sdk-go/private/protocol" + "github.com/aws/aws-sdk-go/private/protocol/json/jsonutil" +) + +// UnmarshalTypedError provides unmarshaling errors API response errors +// for both typed and untyped errors. +type UnmarshalTypedError struct { + exceptions map[string]func(protocol.ResponseMetadata) error +} + +// NewUnmarshalTypedError returns an UnmarshalTypedError initialized for the +// set of exception names to the error unmarshalers +func NewUnmarshalTypedError(exceptions map[string]func(protocol.ResponseMetadata) error) *UnmarshalTypedError { + return &UnmarshalTypedError{ + exceptions: exceptions, + } +} + +// UnmarshalError attempts to unmarshal the HTTP response error as a known +// error type. If unable to unmarshal the error type, the generic SDK error +// type will be used. +func (u *UnmarshalTypedError) UnmarshalError( + resp *http.Response, + respMeta protocol.ResponseMetadata, +) (error, error) { + + var buf bytes.Buffer + var jsonErr jsonErrorResponse + teeReader := io.TeeReader(resp.Body, &buf) + err := jsonutil.UnmarshalJSONError(&jsonErr, teeReader) + if err != nil { + return nil, err + } + body := ioutil.NopCloser(&buf) + + // Code may be separated by hash(#), with the last element being the code + // used by the SDK. + codeParts := strings.SplitN(jsonErr.Code, "#", 2) + code := codeParts[len(codeParts)-1] + msg := jsonErr.Message + + if fn, ok := u.exceptions[code]; ok { + // If exception code is know, use associated constructor to get a value + // for the exception that the JSON body can be unmarshaled into. + v := fn(respMeta) + err := jsonutil.UnmarshalJSONCaseInsensitive(v, body) + if err != nil { + return nil, err + } + + return v, nil + } + + // fallback to unmodeled generic exceptions + return awserr.NewRequestFailure( + awserr.New(code, msg, nil), + respMeta.StatusCode, + respMeta.RequestID, + ), nil +} + +// UnmarshalErrorHandler is a named request handler for unmarshaling jsonrpc +// protocol request errors +var UnmarshalErrorHandler = request.NamedHandler{ + Name: "awssdk.jsonrpc.UnmarshalError", + Fn: UnmarshalError, +} + +// UnmarshalError unmarshals an error response for a JSON RPC service. +func UnmarshalError(req *request.Request) { + defer req.HTTPResponse.Body.Close() + + var jsonErr jsonErrorResponse + err := jsonutil.UnmarshalJSONError(&jsonErr, req.HTTPResponse.Body) + if err != nil { + req.Error = awserr.NewRequestFailure( + awserr.New(request.ErrCodeSerialization, + "failed to unmarshal error message", err), + req.HTTPResponse.StatusCode, + req.RequestID, + ) + return + } + + codes := strings.SplitN(jsonErr.Code, "#", 2) + req.Error = awserr.NewRequestFailure( + awserr.New(codes[len(codes)-1], jsonErr.Message, nil), + req.HTTPResponse.StatusCode, + req.RequestID, + ) +} + +type jsonErrorResponse struct { + Code string `json:"__type"` + Message string `json:"message"` +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/payload.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/payload.go new file mode 100644 index 000000000..0ea0647a5 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/payload.go @@ -0,0 +1,81 @@ +package protocol + +import ( + "io" + "io/ioutil" + "net/http" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/client/metadata" + "github.com/aws/aws-sdk-go/aws/request" +) + +// PayloadUnmarshaler provides the interface for unmarshaling a payload's +// reader into a SDK shape. +type PayloadUnmarshaler interface { + UnmarshalPayload(io.Reader, interface{}) error +} + +// HandlerPayloadUnmarshal implements the PayloadUnmarshaler from a +// HandlerList. This provides the support for unmarshaling a payload reader to +// a shape without needing a SDK request first. +type HandlerPayloadUnmarshal struct { + Unmarshalers request.HandlerList +} + +// UnmarshalPayload unmarshals the io.Reader payload into the SDK shape using +// the Unmarshalers HandlerList provided. Returns an error if unable +// unmarshaling fails. +func (h HandlerPayloadUnmarshal) UnmarshalPayload(r io.Reader, v interface{}) error { + req := &request.Request{ + HTTPRequest: &http.Request{}, + HTTPResponse: &http.Response{ + StatusCode: 200, + Header: http.Header{}, + Body: ioutil.NopCloser(r), + }, + Data: v, + } + + h.Unmarshalers.Run(req) + + return req.Error +} + +// PayloadMarshaler provides the interface for marshaling a SDK shape into and +// io.Writer. +type PayloadMarshaler interface { + MarshalPayload(io.Writer, interface{}) error +} + +// HandlerPayloadMarshal implements the PayloadMarshaler from a HandlerList. +// This provides support for marshaling a SDK shape into an io.Writer without +// needing a SDK request first. +type HandlerPayloadMarshal struct { + Marshalers request.HandlerList +} + +// MarshalPayload marshals the SDK shape into the io.Writer using the +// Marshalers HandlerList provided. Returns an error if unable if marshal +// fails. +func (h HandlerPayloadMarshal) MarshalPayload(w io.Writer, v interface{}) error { + req := request.New( + aws.Config{}, + metadata.ClientInfo{}, + request.Handlers{}, + nil, + &request.Operation{HTTPMethod: "PUT"}, + v, + nil, + ) + + h.Marshalers.Run(req) + + if req.Error != nil { + return req.Error + } + + io.Copy(w, req.GetBody()) + + return nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/protocol.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/protocol.go new file mode 100644 index 000000000..9d521dcb9 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/protocol.go @@ -0,0 +1,49 @@ +package protocol + +import ( + "fmt" + "strings" + + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/request" +) + +// RequireHTTPMinProtocol request handler is used to enforce that +// the target endpoint supports the given major and minor HTTP protocol version. +type RequireHTTPMinProtocol struct { + Major, Minor int +} + +// Handler will mark the request.Request with an error if the +// target endpoint did not connect with the required HTTP protocol +// major and minor version. +func (p RequireHTTPMinProtocol) Handler(r *request.Request) { + if r.Error != nil || r.HTTPResponse == nil { + return + } + + if !strings.HasPrefix(r.HTTPResponse.Proto, "HTTP") { + r.Error = newMinHTTPProtoError(p.Major, p.Minor, r) + } + + if r.HTTPResponse.ProtoMajor < p.Major || r.HTTPResponse.ProtoMinor < p.Minor { + r.Error = newMinHTTPProtoError(p.Major, p.Minor, r) + } +} + +// ErrCodeMinimumHTTPProtocolError error code is returned when the target endpoint +// did not match the required HTTP major and minor protocol version. +const ErrCodeMinimumHTTPProtocolError = "MinimumHTTPProtocolError" + +func newMinHTTPProtoError(major, minor int, r *request.Request) error { + return awserr.NewRequestFailure( + awserr.New("MinimumHTTPProtocolError", + fmt.Sprintf( + "operation requires minimum HTTP protocol of HTTP/%d.%d, but was %s", + major, minor, r.HTTPResponse.Proto, + ), + nil, + ), + r.HTTPResponse.StatusCode, r.RequestID, + ) +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/query/build.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/query/build.go index 60e5b09d5..d40346a77 100644 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/query/build.go +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/query/build.go @@ -1,7 +1,7 @@ // Package query provides serialization of AWS query requests, and responses. package query -//go:generate go run -tags codegen ../../../models/protocol_tests/generate.go ../../../models/protocol_tests/input/query.json build_test.go +//go:generate go run -tags codegen ../../../private/model/cli/gen-protocol-tests ../../../models/protocol_tests/input/query.json build_test.go import ( "net/url" @@ -21,7 +21,7 @@ func Build(r *request.Request) { "Version": {r.ClientInfo.APIVersion}, } if err := queryutil.Parse(body, r.Params, false); err != nil { - r.Error = awserr.New("SerializationError", "failed encoding Query request", err) + r.Error = awserr.New(request.ErrCodeSerialization, "failed encoding Query request", err) return } diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/query/queryutil/queryutil.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/query/queryutil/queryutil.go index 5ce9cba32..75866d012 100644 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/query/queryutil/queryutil.go +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/query/queryutil/queryutil.go @@ -233,7 +233,12 @@ func (q *queryParser) parseScalar(v url.Values, r reflect.Value, name string, ta v.Set(name, strconv.FormatFloat(float64(value), 'f', -1, 32)) case time.Time: const ISO8601UTC = "2006-01-02T15:04:05Z" - v.Set(name, value.UTC().Format(ISO8601UTC)) + format := tag.Get("timestampFormat") + if len(format) == 0 { + format = protocol.ISO8601TimeFormatName + } + + v.Set(name, protocol.FormatTime(format, value)) default: return fmt.Errorf("unsupported value for param %s: %v (%s)", name, r.Interface(), r.Type().Name()) } diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal.go index e0f4d5a54..9231e95d1 100644 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal.go +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal.go @@ -1,6 +1,6 @@ package query -//go:generate go run -tags codegen ../../../models/protocol_tests/generate.go ../../../models/protocol_tests/output/query.json unmarshal_test.go +//go:generate go run -tags codegen ../../../private/model/cli/gen-protocol-tests ../../../models/protocol_tests/output/query.json unmarshal_test.go import ( "encoding/xml" @@ -23,7 +23,11 @@ func Unmarshal(r *request.Request) { decoder := xml.NewDecoder(r.HTTPResponse.Body) err := xmlutil.UnmarshalXML(r.Data, decoder, r.Operation.Name+"Result") if err != nil { - r.Error = awserr.New("SerializationError", "failed decoding Query response", err) + r.Error = awserr.NewRequestFailure( + awserr.New(request.ErrCodeSerialization, "failed decoding Query response", err), + r.HTTPResponse.StatusCode, + r.RequestID, + ) return } } diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal_error.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal_error.go index f21429617..831b0110c 100644 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal_error.go +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal_error.go @@ -2,65 +2,68 @@ package query import ( "encoding/xml" - "io/ioutil" + "fmt" "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/aws/request" + "github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil" ) +// UnmarshalErrorHandler is a name request handler to unmarshal request errors +var UnmarshalErrorHandler = request.NamedHandler{Name: "awssdk.query.UnmarshalError", Fn: UnmarshalError} + type xmlErrorResponse struct { - XMLName xml.Name `xml:"ErrorResponse"` - Code string `xml:"Error>Code"` - Message string `xml:"Error>Message"` - RequestID string `xml:"RequestId"` + Code string `xml:"Error>Code"` + Message string `xml:"Error>Message"` + RequestID string `xml:"RequestId"` } -type xmlServiceUnavailableResponse struct { - XMLName xml.Name `xml:"ServiceUnavailableException"` +type xmlResponseError struct { + xmlErrorResponse } -// UnmarshalErrorHandler is a name request handler to unmarshal request errors -var UnmarshalErrorHandler = request.NamedHandler{Name: "awssdk.query.UnmarshalError", Fn: UnmarshalError} +func (e *xmlResponseError) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + const svcUnavailableTagName = "ServiceUnavailableException" + const errorResponseTagName = "ErrorResponse" + + switch start.Name.Local { + case svcUnavailableTagName: + e.Code = svcUnavailableTagName + e.Message = "service is unavailable" + return d.Skip() + + case errorResponseTagName: + return d.DecodeElement(&e.xmlErrorResponse, &start) + + default: + return fmt.Errorf("unknown error response tag, %v", start) + } +} // UnmarshalError unmarshals an error response for an AWS Query service. func UnmarshalError(r *request.Request) { defer r.HTTPResponse.Body.Close() - bodyBytes, err := ioutil.ReadAll(r.HTTPResponse.Body) + var respErr xmlResponseError + err := xmlutil.UnmarshalXMLError(&respErr, r.HTTPResponse.Body) if err != nil { - r.Error = awserr.New("SerializationError", "failed to read from query HTTP response body", err) - return - } - - // First check for specific error - resp := xmlErrorResponse{} - decodeErr := xml.Unmarshal(bodyBytes, &resp) - if decodeErr == nil { - reqID := resp.RequestID - if reqID == "" { - reqID = r.RequestID - } r.Error = awserr.NewRequestFailure( - awserr.New(resp.Code, resp.Message, nil), + awserr.New(request.ErrCodeSerialization, + "failed to unmarshal error message", err), r.HTTPResponse.StatusCode, - reqID, + r.RequestID, ) return } - // Check for unhandled error - servUnavailResp := xmlServiceUnavailableResponse{} - unavailErr := xml.Unmarshal(bodyBytes, &servUnavailResp) - if unavailErr == nil { - r.Error = awserr.NewRequestFailure( - awserr.New("ServiceUnavailableException", "service is unavailable", nil), - r.HTTPResponse.StatusCode, - r.RequestID, - ) - return + reqID := respErr.RequestID + if len(reqID) == 0 { + reqID = r.RequestID } - // Failed to retrieve any error message from the response body - r.Error = awserr.New("SerializationError", - "failed to decode query XML error response", decodeErr) + r.Error = awserr.NewRequestFailure( + awserr.New(respErr.Code, respErr.Message, nil), + r.HTTPResponse.StatusCode, + reqID, + ) } diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/build.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/build.go index c405288d7..1301b149d 100644 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/build.go +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/build.go @@ -20,14 +20,13 @@ import ( "github.com/aws/aws-sdk-go/private/protocol" ) -// RFC822 returns an RFC822 formatted timestamp for AWS protocols -const RFC822 = "Mon, 2 Jan 2006 15:04:05 GMT" - // Whether the byte value can be sent without escaping in AWS URLs var noEscape [256]bool var errValueNotSet = fmt.Errorf("value not set") +var byteSliceType = reflect.TypeOf([]byte{}) + func init() { for i := 0; i < len(noEscape); i++ { // AWS expects every character except these to be escaped @@ -97,6 +96,14 @@ func buildLocationElements(r *request.Request, v reflect.Value, buildGETQuery bo continue } + // Support the ability to customize values to be marshaled as a + // blob even though they were modeled as a string. Required for S3 + // API operations like SSECustomerKey is modeled as stirng but + // required to be base64 encoded in request. + if field.Tag.Get("marshal-as") == "blob" { + m = m.Convert(byteSliceType) + } + var err error switch field.Tag.Get("location") { case "headers": // header maps @@ -140,7 +147,7 @@ func buildBody(r *request.Request, v reflect.Value) { case string: r.SetStringBody(reader) default: - r.Error = awserr.New("SerializationError", + r.Error = awserr.New(request.ErrCodeSerialization, "failed to encode REST request", fmt.Errorf("unknown payload type %s", payload.Type())) } @@ -155,9 +162,12 @@ func buildHeader(header *http.Header, v reflect.Value, name string, tag reflect. if err == errValueNotSet { return nil } else if err != nil { - return awserr.New("SerializationError", "failed to encode REST request", err) + return awserr.New(request.ErrCodeSerialization, "failed to encode REST request", err) } + name = strings.TrimSpace(name) + str = strings.TrimSpace(str) + header.Add(name, str) return nil @@ -170,11 +180,13 @@ func buildHeaderMap(header *http.Header, v reflect.Value, tag reflect.StructTag) if err == errValueNotSet { continue } else if err != nil { - return awserr.New("SerializationError", "failed to encode REST request", err) + return awserr.New(request.ErrCodeSerialization, "failed to encode REST request", err) } + keyStr := strings.TrimSpace(key.String()) + str = strings.TrimSpace(str) - header.Add(prefix+key.String(), str) + header.Add(prefix+keyStr, str) } return nil } @@ -184,7 +196,7 @@ func buildURI(u *url.URL, v reflect.Value, name string, tag reflect.StructTag) e if err == errValueNotSet { return nil } else if err != nil { - return awserr.New("SerializationError", "failed to encode REST request", err) + return awserr.New(request.ErrCodeSerialization, "failed to encode REST request", err) } u.Path = strings.Replace(u.Path, "{"+name+"}", value, -1) @@ -217,7 +229,7 @@ func buildQueryString(query url.Values, v reflect.Value, name string, tag reflec if err == errValueNotSet { return nil } else if err != nil { - return awserr.New("SerializationError", "failed to encode REST request", err) + return awserr.New(request.ErrCodeSerialization, "failed to encode REST request", err) } query.Set(name, str) } @@ -270,7 +282,14 @@ func convertType(v reflect.Value, tag reflect.StructTag) (str string, err error) case float64: str = strconv.FormatFloat(value, 'f', -1, 64) case time.Time: - str = value.UTC().Format(RFC822) + format := tag.Get("timestampFormat") + if len(format) == 0 { + format = protocol.RFC822TimeFormatName + if tag.Get("location") == "querystring" { + format = protocol.ISO8601TimeFormatName + } + } + str = protocol.FormatTime(format, value) case aws.JSONValue: if len(value) == 0 { return "", errValueNotSet diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/unmarshal.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/unmarshal.go index 823f045ee..92f8b4d9a 100644 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/unmarshal.go +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/unmarshal.go @@ -15,6 +15,7 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/aws/request" + awsStrings "github.com/aws/aws-sdk-go/internal/strings" "github.com/aws/aws-sdk-go/private/protocol" ) @@ -28,7 +29,9 @@ var UnmarshalMetaHandler = request.NamedHandler{Name: "awssdk.rest.UnmarshalMeta func Unmarshal(r *request.Request) { if r.DataFilled() { v := reflect.Indirect(reflect.ValueOf(r.Data)) - unmarshalBody(r, v) + if err := unmarshalBody(r, v); err != nil { + r.Error = err + } } } @@ -40,12 +43,21 @@ func UnmarshalMeta(r *request.Request) { r.RequestID = r.HTTPResponse.Header.Get("X-Amz-Request-Id") } if r.DataFilled() { - v := reflect.Indirect(reflect.ValueOf(r.Data)) - unmarshalLocationElements(r, v) + if err := UnmarshalResponse(r.HTTPResponse, r.Data, aws.BoolValue(r.Config.LowerCaseHeaderMaps)); err != nil { + r.Error = err + } } } -func unmarshalBody(r *request.Request, v reflect.Value) { +// UnmarshalResponse attempts to unmarshal the REST response headers to +// the data type passed in. The type must be a pointer. An error is returned +// with any error unmarshaling the response into the target datatype. +func UnmarshalResponse(resp *http.Response, data interface{}, lowerCaseHeaderMaps bool) error { + v := reflect.Indirect(reflect.ValueOf(data)) + return unmarshalLocationElements(resp, v, lowerCaseHeaderMaps) +} + +func unmarshalBody(r *request.Request, v reflect.Value) error { if field, ok := v.Type().FieldByName("_"); ok { if payloadName := field.Tag.Get("payload"); payloadName != "" { pfield, _ := v.Type().FieldByName(payloadName) @@ -57,35 +69,38 @@ func unmarshalBody(r *request.Request, v reflect.Value) { defer r.HTTPResponse.Body.Close() b, err := ioutil.ReadAll(r.HTTPResponse.Body) if err != nil { - r.Error = awserr.New("SerializationError", "failed to decode REST response", err) - } else { - payload.Set(reflect.ValueOf(b)) + return awserr.New(request.ErrCodeSerialization, "failed to decode REST response", err) } + + payload.Set(reflect.ValueOf(b)) + case *string: defer r.HTTPResponse.Body.Close() b, err := ioutil.ReadAll(r.HTTPResponse.Body) if err != nil { - r.Error = awserr.New("SerializationError", "failed to decode REST response", err) - } else { - str := string(b) - payload.Set(reflect.ValueOf(&str)) + return awserr.New(request.ErrCodeSerialization, "failed to decode REST response", err) } + + str := string(b) + payload.Set(reflect.ValueOf(&str)) + default: switch payload.Type().String() { case "io.ReadCloser": payload.Set(reflect.ValueOf(r.HTTPResponse.Body)) + case "io.ReadSeeker": b, err := ioutil.ReadAll(r.HTTPResponse.Body) if err != nil { - r.Error = awserr.New("SerializationError", + return awserr.New(request.ErrCodeSerialization, "failed to read response body", err) - return } payload.Set(reflect.ValueOf(ioutil.NopCloser(bytes.NewReader(b)))) + default: io.Copy(ioutil.Discard, r.HTTPResponse.Body) - defer r.HTTPResponse.Body.Close() - r.Error = awserr.New("SerializationError", + r.HTTPResponse.Body.Close() + return awserr.New(request.ErrCodeSerialization, "failed to decode REST response", fmt.Errorf("unknown payload type %s", payload.Type())) } @@ -94,9 +109,11 @@ func unmarshalBody(r *request.Request, v reflect.Value) { } } } + + return nil } -func unmarshalLocationElements(r *request.Request, v reflect.Value) { +func unmarshalLocationElements(resp *http.Response, v reflect.Value, lowerCaseHeaderMaps bool) error { for i := 0; i < v.NumField(); i++ { m, field := v.Field(i), v.Type().Field(i) if n := field.Name; n[0:1] == strings.ToLower(n[0:1]) { @@ -111,26 +128,25 @@ func unmarshalLocationElements(r *request.Request, v reflect.Value) { switch field.Tag.Get("location") { case "statusCode": - unmarshalStatusCode(m, r.HTTPResponse.StatusCode) + unmarshalStatusCode(m, resp.StatusCode) + case "header": - err := unmarshalHeader(m, r.HTTPResponse.Header.Get(name), field.Tag) + err := unmarshalHeader(m, resp.Header.Get(name), field.Tag) if err != nil { - r.Error = awserr.New("SerializationError", "failed to decode REST response", err) - break + return awserr.New(request.ErrCodeSerialization, "failed to decode REST response", err) } + case "headers": prefix := field.Tag.Get("locationName") - err := unmarshalHeaderMap(m, r.HTTPResponse.Header, prefix) + err := unmarshalHeaderMap(m, resp.Header, prefix, lowerCaseHeaderMaps) if err != nil { - r.Error = awserr.New("SerializationError", "failed to decode REST response", err) - break + awserr.New(request.ErrCodeSerialization, "failed to decode REST response", err) } } } - if r.Error != nil { - return - } } + + return nil } func unmarshalStatusCode(v reflect.Value, statusCode int) { @@ -145,29 +161,45 @@ func unmarshalStatusCode(v reflect.Value, statusCode int) { } } -func unmarshalHeaderMap(r reflect.Value, headers http.Header, prefix string) error { +func unmarshalHeaderMap(r reflect.Value, headers http.Header, prefix string, normalize bool) error { + if len(headers) == 0 { + return nil + } switch r.Interface().(type) { case map[string]*string: // we only support string map value types out := map[string]*string{} for k, v := range headers { - k = http.CanonicalHeaderKey(k) - if strings.HasPrefix(strings.ToLower(k), strings.ToLower(prefix)) { + if awsStrings.HasPrefixFold(k, prefix) { + if normalize == true { + k = strings.ToLower(k) + } else { + k = http.CanonicalHeaderKey(k) + } out[k[len(prefix):]] = &v[0] } } - r.Set(reflect.ValueOf(out)) + if len(out) != 0 { + r.Set(reflect.ValueOf(out)) + } + } return nil } func unmarshalHeader(v reflect.Value, header string, tag reflect.StructTag) error { - isJSONValue := tag.Get("type") == "jsonvalue" - if isJSONValue { + switch tag.Get("type") { + case "jsonvalue": if len(header) == 0 { return nil } - } else if !v.IsValid() || (header == "" && v.Elem().Kind() != reflect.String) { - return nil + case "blob": + if len(header) == 0 { + return nil + } + default: + if !v.IsValid() || (header == "" && v.Elem().Kind() != reflect.String) { + return nil + } } switch v.Interface().(type) { @@ -178,7 +210,7 @@ func unmarshalHeader(v reflect.Value, header string, tag reflect.StructTag) erro if err != nil { return err } - v.Set(reflect.ValueOf(&b)) + v.Set(reflect.ValueOf(b)) case *bool: b, err := strconv.ParseBool(header) if err != nil { @@ -198,7 +230,11 @@ func unmarshalHeader(v reflect.Value, header string, tag reflect.StructTag) erro } v.Set(reflect.ValueOf(&f)) case *time.Time: - t, err := time.Parse(RFC822, header) + format := tag.Get("timestampFormat") + if len(format) == 0 { + format = protocol.RFC822TimeFormatName + } + t, err := protocol.ParseTime(format, header) if err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/timestamp.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/timestamp.go new file mode 100644 index 000000000..05d4ff519 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/timestamp.go @@ -0,0 +1,84 @@ +package protocol + +import ( + "math" + "strconv" + "time" + + "github.com/aws/aws-sdk-go/internal/sdkmath" +) + +// Names of time formats supported by the SDK +const ( + RFC822TimeFormatName = "rfc822" + ISO8601TimeFormatName = "iso8601" + UnixTimeFormatName = "unixTimestamp" +) + +// Time formats supported by the SDK +// Output time is intended to not contain decimals +const ( + // RFC 7231#section-7.1.1.1 timetamp format. e.g Tue, 29 Apr 2014 18:30:38 GMT + RFC822TimeFormat = "Mon, 2 Jan 2006 15:04:05 GMT" + + // This format is used for output time without seconds precision + RFC822OutputTimeFormat = "Mon, 02 Jan 2006 15:04:05 GMT" + + // RFC3339 a subset of the ISO8601 timestamp format. e.g 2014-04-29T18:30:38Z + ISO8601TimeFormat = "2006-01-02T15:04:05.999999999Z" + + // This format is used for output time without seconds precision + ISO8601OutputTimeFormat = "2006-01-02T15:04:05Z" +) + +// IsKnownTimestampFormat returns if the timestamp format name +// is know to the SDK's protocols. +func IsKnownTimestampFormat(name string) bool { + switch name { + case RFC822TimeFormatName: + fallthrough + case ISO8601TimeFormatName: + fallthrough + case UnixTimeFormatName: + return true + default: + return false + } +} + +// FormatTime returns a string value of the time. +func FormatTime(name string, t time.Time) string { + t = t.UTC() + + switch name { + case RFC822TimeFormatName: + return t.Format(RFC822OutputTimeFormat) + case ISO8601TimeFormatName: + return t.Format(ISO8601OutputTimeFormat) + case UnixTimeFormatName: + return strconv.FormatInt(t.Unix(), 10) + default: + panic("unknown timestamp format name, " + name) + } +} + +// ParseTime attempts to parse the time given the format. Returns +// the time if it was able to be parsed, and fails otherwise. +func ParseTime(formatName, value string) (time.Time, error) { + switch formatName { + case RFC822TimeFormatName: + return time.Parse(RFC822TimeFormat, value) + case ISO8601TimeFormatName: + return time.Parse(ISO8601TimeFormat, value) + case UnixTimeFormatName: + v, err := strconv.ParseFloat(value, 64) + _, dec := math.Modf(v) + dec = sdkmath.Round(dec*1e3) / 1e3 //Rounds 0.1229999 to 0.123 + if err != nil { + return time.Time{}, err + } + return time.Unix(int64(v), int64(dec*(1e9))), nil + default: + panic("unknown timestamp format name, " + formatName) + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/unmarshal.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/unmarshal.go index da1a68111..f614ef898 100644 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/unmarshal.go +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/unmarshal.go @@ -19,3 +19,9 @@ func UnmarshalDiscardBody(r *request.Request) { io.Copy(ioutil.Discard, r.HTTPResponse.Body) r.HTTPResponse.Body.Close() } + +// ResponseMetadata provides the SDK response metadata attributes. +type ResponseMetadata struct { + StatusCode int + RequestID string +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/unmarshal_error.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/unmarshal_error.go new file mode 100644 index 000000000..cc857f136 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/unmarshal_error.go @@ -0,0 +1,65 @@ +package protocol + +import ( + "net/http" + + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/request" +) + +// UnmarshalErrorHandler provides unmarshaling errors API response errors for +// both typed and untyped errors. +type UnmarshalErrorHandler struct { + unmarshaler ErrorUnmarshaler +} + +// ErrorUnmarshaler is an abstract interface for concrete implementations to +// unmarshal protocol specific response errors. +type ErrorUnmarshaler interface { + UnmarshalError(*http.Response, ResponseMetadata) (error, error) +} + +// NewUnmarshalErrorHandler returns an UnmarshalErrorHandler +// initialized for the set of exception names to the error unmarshalers +func NewUnmarshalErrorHandler(unmarshaler ErrorUnmarshaler) *UnmarshalErrorHandler { + return &UnmarshalErrorHandler{ + unmarshaler: unmarshaler, + } +} + +// UnmarshalErrorHandlerName is the name of the named handler. +const UnmarshalErrorHandlerName = "awssdk.protocol.UnmarshalError" + +// NamedHandler returns a NamedHandler for the unmarshaler using the set of +// errors the unmarshaler was initialized for. +func (u *UnmarshalErrorHandler) NamedHandler() request.NamedHandler { + return request.NamedHandler{ + Name: UnmarshalErrorHandlerName, + Fn: u.UnmarshalError, + } +} + +// UnmarshalError will attempt to unmarshal the API response's error message +// into either a generic SDK error type, or a typed error corresponding to the +// errors exception name. +func (u *UnmarshalErrorHandler) UnmarshalError(r *request.Request) { + defer r.HTTPResponse.Body.Close() + + respMeta := ResponseMetadata{ + StatusCode: r.HTTPResponse.StatusCode, + RequestID: r.RequestID, + } + + v, err := u.unmarshaler.UnmarshalError(r.HTTPResponse, respMeta) + if err != nil { + r.Error = awserr.NewRequestFailure( + awserr.New(request.ErrCodeSerialization, + "failed to unmarshal response error", err), + respMeta.StatusCode, + respMeta.RequestID, + ) + return + } + + r.Error = v +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/build.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/build.go index 7091b456d..cf981fe95 100644 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/build.go +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/build.go @@ -13,9 +13,13 @@ import ( "github.com/aws/aws-sdk-go/private/protocol" ) -// BuildXML will serialize params into an xml.Encoder. -// Error will be returned if the serialization of any of the params or nested values fails. +// BuildXML will serialize params into an xml.Encoder. Error will be returned +// if the serialization of any of the params or nested values fails. func BuildXML(params interface{}, e *xml.Encoder) error { + return buildXML(params, e, false) +} + +func buildXML(params interface{}, e *xml.Encoder, sorted bool) error { b := xmlBuilder{encoder: e, namespaces: map[string]string{}} root := NewXMLElement(xml.Name{}) if err := b.buildValue(reflect.ValueOf(params), root, ""); err != nil { @@ -23,7 +27,7 @@ func BuildXML(params interface{}, e *xml.Encoder) error { } for _, c := range root.Children { for _, v := range c { - return StructToXML(e, v, false) + return StructToXML(e, v, sorted) } } return nil @@ -83,15 +87,13 @@ func (b *xmlBuilder) buildValue(value reflect.Value, current *XMLNode, tag refle } } -// buildStruct adds a struct and its fields to the current XMLNode. All fields any any nested +// buildStruct adds a struct and its fields to the current XMLNode. All fields and any nested // types are converted to XMLNodes also. func (b *xmlBuilder) buildStruct(value reflect.Value, current *XMLNode, tag reflect.StructTag) error { if !value.IsValid() { return nil } - fieldAdded := false - // unwrap payloads if payload := tag.Get("payload"); payload != "" { field, _ := value.Type().FieldByName(payload) @@ -119,6 +121,8 @@ func (b *xmlBuilder) buildStruct(value reflect.Value, current *XMLNode, tag refl child.Attr = append(child.Attr, ns) } + var payloadFields, nonPayloadFields int + t := value.Type() for i := 0; i < value.NumField(); i++ { member := elemOf(value.Field(i)) @@ -133,8 +137,10 @@ func (b *xmlBuilder) buildStruct(value reflect.Value, current *XMLNode, tag refl mTag := field.Tag if mTag.Get("location") != "" { // skip non-body members + nonPayloadFields++ continue } + payloadFields++ if protocol.CanSetIdempotencyToken(value.Field(i), field) { token := protocol.GetIdempotencyToken() @@ -149,11 +155,11 @@ func (b *xmlBuilder) buildStruct(value reflect.Value, current *XMLNode, tag refl if err := b.buildValue(member, child, mTag); err != nil { return err } - - fieldAdded = true } - if fieldAdded { // only append this child if we have one ore more valid members + // Only case where the child shape is not added is if the shape only contains + // non-payload fields, e.g headers/query. + if !(payloadFields == 0 && nonPayloadFields > 0) { current.AddChild(child) } @@ -278,8 +284,12 @@ func (b *xmlBuilder) buildScalar(value reflect.Value, current *XMLNode, tag refl case float32: str = strconv.FormatFloat(float64(converted), 'f', -1, 32) case time.Time: - const ISO8601UTC = "2006-01-02T15:04:05Z" - str = converted.UTC().Format(ISO8601UTC) + format := tag.Get("timestampFormat") + if len(format) == 0 { + format = protocol.ISO8601TimeFormatName + } + + str = protocol.FormatTime(format, converted) default: return fmt.Errorf("unsupported value for param %s: %v (%s)", tag.Get("locationName"), value.Interface(), value.Type().Name()) diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/sort.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/sort.go new file mode 100644 index 000000000..c1a511851 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/sort.go @@ -0,0 +1,32 @@ +package xmlutil + +import ( + "encoding/xml" + "strings" +) + +type xmlAttrSlice []xml.Attr + +func (x xmlAttrSlice) Len() int { + return len(x) +} + +func (x xmlAttrSlice) Less(i, j int) bool { + spaceI, spaceJ := x[i].Name.Space, x[j].Name.Space + localI, localJ := x[i].Name.Local, x[j].Name.Local + valueI, valueJ := x[i].Value, x[j].Value + + spaceCmp := strings.Compare(spaceI, spaceJ) + localCmp := strings.Compare(localI, localJ) + valueCmp := strings.Compare(valueI, valueJ) + + if spaceCmp == -1 || (spaceCmp == 0 && (localCmp == -1 || (localCmp == 0 && valueCmp == -1))) { + return true + } + + return false +} + +func (x xmlAttrSlice) Swap(i, j int) { + x[i], x[j] = x[j], x[i] +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/unmarshal.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/unmarshal.go index a6c25ba37..7108d3800 100644 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/unmarshal.go +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/unmarshal.go @@ -1,6 +1,7 @@ package xmlutil import ( + "bytes" "encoding/base64" "encoding/xml" "fmt" @@ -9,8 +10,28 @@ import ( "strconv" "strings" "time" + + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/private/protocol" ) +// UnmarshalXMLError unmarshals the XML error from the stream into the value +// type specified. The value must be a pointer. If the message fails to +// unmarshal, the message content will be included in the returned error as a +// awserr.UnmarshalError. +func UnmarshalXMLError(v interface{}, stream io.Reader) error { + var errBuf bytes.Buffer + body := io.TeeReader(stream, &errBuf) + + err := xml.NewDecoder(body).Decode(v) + if err != nil && err != io.EOF { + return awserr.NewUnmarshalError(err, + "failed to unmarshal error message", errBuf.Bytes()) + } + + return nil +} + // UnmarshalXML deserializes an xml.Decoder into the container v. V // needs to match the shape of the XML expected to be decoded. // If the shape doesn't match unmarshaling will fail. @@ -253,8 +274,12 @@ func parseScalar(r reflect.Value, node *XMLNode, tag reflect.StructTag) error { } r.Set(reflect.ValueOf(&v)) case *time.Time: - const ISO8601UTC = "2006-01-02T15:04:05Z" - t, err := time.Parse(ISO8601UTC, node.Text) + format := tag.Get("timestampFormat") + if len(format) == 0 { + format = protocol.ISO8601TimeFormatName + } + + t, err := protocol.ParseTime(format, node.Text) if err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/xml_to_struct.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/xml_to_struct.go index 3e970b629..42f71648e 100644 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/xml_to_struct.go +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/xml_to_struct.go @@ -29,6 +29,7 @@ func NewXMLElement(name xml.Name) *XMLNode { // AddChild adds child to the XMLNode. func (n *XMLNode) AddChild(child *XMLNode) { + child.parent = n if _, ok := n.Children[child.Name.Local]; !ok { n.Children[child.Name.Local] = []*XMLNode{} } @@ -118,7 +119,18 @@ func (n *XMLNode) findElem(name string) (string, bool) { // StructToXML writes an XMLNode to a xml.Encoder as tokens. func StructToXML(e *xml.Encoder, node *XMLNode, sorted bool) error { - e.EncodeToken(xml.StartElement{Name: node.Name, Attr: node.Attr}) + // Sort Attributes + attrs := node.Attr + if sorted { + sortedAttrs := make([]xml.Attr, len(attrs)) + for _, k := range node.Attr { + sortedAttrs = append(sortedAttrs, k) + } + sort.Sort(xmlAttrSlice(sortedAttrs)) + attrs = sortedAttrs + } + + e.EncodeToken(xml.StartElement{Name: node.Name, Attr: attrs}) if node.Text != "" { e.EncodeToken(xml.CharData([]byte(node.Text))) diff --git a/vendor/github.com/aws/aws-sdk-go/service/ecr/api.go b/vendor/github.com/aws/aws-sdk-go/service/ecr/api.go index d9bcf883b..2a5e6e3cd 100644 --- a/vendor/github.com/aws/aws-sdk-go/service/ecr/api.go +++ b/vendor/github.com/aws/aws-sdk-go/service/ecr/api.go @@ -3,11 +3,14 @@ package ecr import ( + "fmt" "time" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awsutil" "github.com/aws/aws-sdk-go/aws/request" + "github.com/aws/aws-sdk-go/private/protocol" + "github.com/aws/aws-sdk-go/private/protocol/jsonrpc" ) const opBatchCheckLayerAvailability = "BatchCheckLayerAvailability" @@ -15,7 +18,7 @@ const opBatchCheckLayerAvailability = "BatchCheckLayerAvailability" // BatchCheckLayerAvailabilityRequest generates a "aws/request.Request" representing the // client's request for the BatchCheckLayerAvailability operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -54,8 +57,13 @@ func (c *ECR) BatchCheckLayerAvailabilityRequest(input *BatchCheckLayerAvailabil // BatchCheckLayerAvailability API operation for Amazon EC2 Container Registry. // -// Check the availability of multiple image layers in a specified registry and -// repository. +// Checks the availability of one or more image layers in a repository. +// +// When an image is pushed to a repository, each image layer is checked to verify +// if it has been uploaded before. If it is, then the image layer is skipped. +// +// When an image is pulled from a repository, each image layer is checked once +// to verify it is available to be pulled. // // This operation is used by the Amazon ECR proxy, and it is not intended for // general use by customers for pulling and pushing images. In most cases, you @@ -68,16 +76,16 @@ func (c *ECR) BatchCheckLayerAvailabilityRequest(input *BatchCheckLayerAvailabil // See the AWS API reference guide for Amazon EC2 Container Registry's // API operation BatchCheckLayerAvailability for usage and error information. // -// Returned Error Codes: -// * ErrCodeRepositoryNotFoundException "RepositoryNotFoundException" +// Returned Error Types: +// * RepositoryNotFoundException // The specified repository could not be found. Check the spelling of the specified // repository and ensure that you are performing operations on the correct registry. // -// * ErrCodeInvalidParameterException "InvalidParameterException" +// * InvalidParameterException // The specified parameter is invalid. Review the available parameters for the // API request. // -// * ErrCodeServerException "ServerException" +// * ServerException // These errors are usually caused by a server-side issue. // // See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/BatchCheckLayerAvailability @@ -107,7 +115,7 @@ const opBatchDeleteImage = "BatchDeleteImage" // BatchDeleteImageRequest generates a "aws/request.Request" representing the // client's request for the BatchDeleteImage operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -146,8 +154,8 @@ func (c *ECR) BatchDeleteImageRequest(input *BatchDeleteImageInput) (req *reques // BatchDeleteImage API operation for Amazon EC2 Container Registry. // -// Deletes a list of specified images within a specified repository. Images -// are specified with either imageTag or imageDigest. +// Deletes a list of specified images within a repository. Images are specified +// with either an imageTag or imageDigest. // // You can remove a tag from an image by specifying the image's tag in your // request. When you remove the last tag from an image, the image is deleted @@ -163,15 +171,15 @@ func (c *ECR) BatchDeleteImageRequest(input *BatchDeleteImageInput) (req *reques // See the AWS API reference guide for Amazon EC2 Container Registry's // API operation BatchDeleteImage for usage and error information. // -// Returned Error Codes: -// * ErrCodeServerException "ServerException" +// Returned Error Types: +// * ServerException // These errors are usually caused by a server-side issue. // -// * ErrCodeInvalidParameterException "InvalidParameterException" +// * InvalidParameterException // The specified parameter is invalid. Review the available parameters for the // API request. // -// * ErrCodeRepositoryNotFoundException "RepositoryNotFoundException" +// * RepositoryNotFoundException // The specified repository could not be found. Check the spelling of the specified // repository and ensure that you are performing operations on the correct registry. // @@ -202,7 +210,7 @@ const opBatchGetImage = "BatchGetImage" // BatchGetImageRequest generates a "aws/request.Request" representing the // client's request for the BatchGetImage operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -241,8 +249,11 @@ func (c *ECR) BatchGetImageRequest(input *BatchGetImageInput) (req *request.Requ // BatchGetImage API operation for Amazon EC2 Container Registry. // -// Gets detailed information for specified images within a specified repository. -// Images are specified with either imageTag or imageDigest. +// Gets detailed information for an image. Images are specified with either +// an imageTag or imageDigest. +// +// When an image is pulled, the BatchGetImage API is called once to retrieve +// the image manifest. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -251,15 +262,15 @@ func (c *ECR) BatchGetImageRequest(input *BatchGetImageInput) (req *request.Requ // See the AWS API reference guide for Amazon EC2 Container Registry's // API operation BatchGetImage for usage and error information. // -// Returned Error Codes: -// * ErrCodeServerException "ServerException" +// Returned Error Types: +// * ServerException // These errors are usually caused by a server-side issue. // -// * ErrCodeInvalidParameterException "InvalidParameterException" +// * InvalidParameterException // The specified parameter is invalid. Review the available parameters for the // API request. // -// * ErrCodeRepositoryNotFoundException "RepositoryNotFoundException" +// * RepositoryNotFoundException // The specified repository could not be found. Check the spelling of the specified // repository and ensure that you are performing operations on the correct registry. // @@ -290,7 +301,7 @@ const opCompleteLayerUpload = "CompleteLayerUpload" // CompleteLayerUploadRequest generates a "aws/request.Request" representing the // client's request for the CompleteLayerUpload operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -333,6 +344,9 @@ func (c *ECR) CompleteLayerUploadRequest(input *CompleteLayerUploadInput) (req * // registry, repository name, and upload ID. You can optionally provide a sha256 // digest of the image layer for data validation purposes. // +// When an image is pushed, the CompleteLayerUpload API is called once per each +// new image layer to verify that the upload has completed. +// // This operation is used by the Amazon ECR proxy, and it is not intended for // general use by customers for pulling and pushing images. In most cases, you // should use the docker CLI to pull, tag, and push images. @@ -344,33 +358,33 @@ func (c *ECR) CompleteLayerUploadRequest(input *CompleteLayerUploadInput) (req * // See the AWS API reference guide for Amazon EC2 Container Registry's // API operation CompleteLayerUpload for usage and error information. // -// Returned Error Codes: -// * ErrCodeServerException "ServerException" +// Returned Error Types: +// * ServerException // These errors are usually caused by a server-side issue. // -// * ErrCodeInvalidParameterException "InvalidParameterException" +// * InvalidParameterException // The specified parameter is invalid. Review the available parameters for the // API request. // -// * ErrCodeRepositoryNotFoundException "RepositoryNotFoundException" +// * RepositoryNotFoundException // The specified repository could not be found. Check the spelling of the specified // repository and ensure that you are performing operations on the correct registry. // -// * ErrCodeUploadNotFoundException "UploadNotFoundException" +// * UploadNotFoundException // The upload could not be found, or the specified upload id is not valid for // this repository. // -// * ErrCodeInvalidLayerException "InvalidLayerException" +// * InvalidLayerException // The layer digest calculation performed by Amazon ECR upon receipt of the // image layer does not match the digest specified. // -// * ErrCodeLayerPartTooSmallException "LayerPartTooSmallException" +// * LayerPartTooSmallException // Layer parts must be at least 5 MiB in size. // -// * ErrCodeLayerAlreadyExistsException "LayerAlreadyExistsException" +// * LayerAlreadyExistsException // The image layer already exists in the associated repository. // -// * ErrCodeEmptyUploadException "EmptyUploadException" +// * EmptyUploadException // The specified layer upload does not contain any layer parts. // // See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/CompleteLayerUpload @@ -400,7 +414,7 @@ const opCreateRepository = "CreateRepository" // CreateRepositoryRequest generates a "aws/request.Request" representing the // client's request for the CreateRepository operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -439,7 +453,8 @@ func (c *ECR) CreateRepositoryRequest(input *CreateRepositoryInput) (req *reques // CreateRepository API operation for Amazon EC2 Container Registry. // -// Creates an image repository. +// Creates a repository. For more information, see Amazon ECR Repositories (https://docs.aws.amazon.com/AmazonECR/latest/userguide/Repositories.html) +// in the Amazon Elastic Container Registry User Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -448,21 +463,30 @@ func (c *ECR) CreateRepositoryRequest(input *CreateRepositoryInput) (req *reques // See the AWS API reference guide for Amazon EC2 Container Registry's // API operation CreateRepository for usage and error information. // -// Returned Error Codes: -// * ErrCodeServerException "ServerException" +// Returned Error Types: +// * ServerException // These errors are usually caused by a server-side issue. // -// * ErrCodeInvalidParameterException "InvalidParameterException" +// * InvalidParameterException // The specified parameter is invalid. Review the available parameters for the // API request. // -// * ErrCodeRepositoryAlreadyExistsException "RepositoryAlreadyExistsException" +// * InvalidTagParameterException +// An invalid parameter has been specified. Tag keys can have a maximum character +// length of 128 characters, and tag values can have a maximum length of 256 +// characters. +// +// * TooManyTagsException +// The list of tags on the repository is over the limit. The maximum number +// of tags that can be applied to a repository is 50. +// +// * RepositoryAlreadyExistsException // The specified repository already exists in the specified registry. // -// * ErrCodeLimitExceededException "LimitExceededException" +// * LimitExceededException // The operation did not succeed because it would have exceeded a service limit // for your account. For more information, see Amazon ECR Default Service Limits -// (http://docs.aws.amazon.com/AmazonECR/latest/userguide/service_limits.html) +// (https://docs.aws.amazon.com/AmazonECR/latest/userguide/service_limits.html) // in the Amazon Elastic Container Registry User Guide. // // See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/CreateRepository @@ -492,7 +516,7 @@ const opDeleteLifecyclePolicy = "DeleteLifecyclePolicy" // DeleteLifecyclePolicyRequest generates a "aws/request.Request" representing the // client's request for the DeleteLifecyclePolicy operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -531,7 +555,7 @@ func (c *ECR) DeleteLifecyclePolicyRequest(input *DeleteLifecyclePolicyInput) (r // DeleteLifecyclePolicy API operation for Amazon EC2 Container Registry. // -// Deletes the specified lifecycle policy. +// Deletes the lifecycle policy associated with the specified repository. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -540,19 +564,19 @@ func (c *ECR) DeleteLifecyclePolicyRequest(input *DeleteLifecyclePolicyInput) (r // See the AWS API reference guide for Amazon EC2 Container Registry's // API operation DeleteLifecyclePolicy for usage and error information. // -// Returned Error Codes: -// * ErrCodeServerException "ServerException" +// Returned Error Types: +// * ServerException // These errors are usually caused by a server-side issue. // -// * ErrCodeInvalidParameterException "InvalidParameterException" +// * InvalidParameterException // The specified parameter is invalid. Review the available parameters for the // API request. // -// * ErrCodeRepositoryNotFoundException "RepositoryNotFoundException" +// * RepositoryNotFoundException // The specified repository could not be found. Check the spelling of the specified // repository and ensure that you are performing operations on the correct registry. // -// * ErrCodeLifecyclePolicyNotFoundException "LifecyclePolicyNotFoundException" +// * LifecyclePolicyNotFoundException // The lifecycle policy could not be found, and no policy is set to the repository. // // See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/DeleteLifecyclePolicy @@ -582,7 +606,7 @@ const opDeleteRepository = "DeleteRepository" // DeleteRepositoryRequest generates a "aws/request.Request" representing the // client's request for the DeleteRepository operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -621,8 +645,9 @@ func (c *ECR) DeleteRepositoryRequest(input *DeleteRepositoryInput) (req *reques // DeleteRepository API operation for Amazon EC2 Container Registry. // -// Deletes an existing image repository. If a repository contains images, you -// must use the force option to delete it. +// Deletes a repository. If the repository contains images, you must either +// delete all images in the repository or use the force option to delete the +// repository. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -631,19 +656,19 @@ func (c *ECR) DeleteRepositoryRequest(input *DeleteRepositoryInput) (req *reques // See the AWS API reference guide for Amazon EC2 Container Registry's // API operation DeleteRepository for usage and error information. // -// Returned Error Codes: -// * ErrCodeServerException "ServerException" +// Returned Error Types: +// * ServerException // These errors are usually caused by a server-side issue. // -// * ErrCodeInvalidParameterException "InvalidParameterException" +// * InvalidParameterException // The specified parameter is invalid. Review the available parameters for the // API request. // -// * ErrCodeRepositoryNotFoundException "RepositoryNotFoundException" +// * RepositoryNotFoundException // The specified repository could not be found. Check the spelling of the specified // repository and ensure that you are performing operations on the correct registry. // -// * ErrCodeRepositoryNotEmptyException "RepositoryNotEmptyException" +// * RepositoryNotEmptyException // The specified repository contains images. To delete a repository that contains // images, you must force the deletion with the force parameter. // @@ -674,7 +699,7 @@ const opDeleteRepositoryPolicy = "DeleteRepositoryPolicy" // DeleteRepositoryPolicyRequest generates a "aws/request.Request" representing the // client's request for the DeleteRepositoryPolicy operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -713,7 +738,7 @@ func (c *ECR) DeleteRepositoryPolicyRequest(input *DeleteRepositoryPolicyInput) // DeleteRepositoryPolicy API operation for Amazon EC2 Container Registry. // -// Deletes the repository policy from a specified repository. +// Deletes the repository policy associated with the specified repository. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -722,19 +747,19 @@ func (c *ECR) DeleteRepositoryPolicyRequest(input *DeleteRepositoryPolicyInput) // See the AWS API reference guide for Amazon EC2 Container Registry's // API operation DeleteRepositoryPolicy for usage and error information. // -// Returned Error Codes: -// * ErrCodeServerException "ServerException" +// Returned Error Types: +// * ServerException // These errors are usually caused by a server-side issue. // -// * ErrCodeInvalidParameterException "InvalidParameterException" +// * InvalidParameterException // The specified parameter is invalid. Review the available parameters for the // API request. // -// * ErrCodeRepositoryNotFoundException "RepositoryNotFoundException" +// * RepositoryNotFoundException // The specified repository could not be found. Check the spelling of the specified // repository and ensure that you are performing operations on the correct registry. // -// * ErrCodeRepositoryPolicyNotFoundException "RepositoryPolicyNotFoundException" +// * RepositoryPolicyNotFoundException // The specified repository and registry combination does not have an associated // repository policy. // @@ -760,12 +785,164 @@ func (c *ECR) DeleteRepositoryPolicyWithContext(ctx aws.Context, input *DeleteRe return out, req.Send() } +const opDescribeImageScanFindings = "DescribeImageScanFindings" + +// DescribeImageScanFindingsRequest generates a "aws/request.Request" representing the +// client's request for the DescribeImageScanFindings operation. The "output" return +// value will be populated with the request's response once the request completes +// successfully. +// +// Use "Send" method on the returned Request to send the API call to the service. +// the "output" return value is not valid until after Send returns without error. +// +// See DescribeImageScanFindings for more information on using the DescribeImageScanFindings +// API call, and error handling. +// +// This method is useful when you want to inject custom logic or configuration +// into the SDK's request lifecycle. Such as custom headers, or retry logic. +// +// +// // Example sending a request using the DescribeImageScanFindingsRequest method. +// req, resp := client.DescribeImageScanFindingsRequest(params) +// +// err := req.Send() +// if err == nil { // resp is now filled +// fmt.Println(resp) +// } +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/DescribeImageScanFindings +func (c *ECR) DescribeImageScanFindingsRequest(input *DescribeImageScanFindingsInput) (req *request.Request, output *DescribeImageScanFindingsOutput) { + op := &request.Operation{ + Name: opDescribeImageScanFindings, + HTTPMethod: "POST", + HTTPPath: "/", + Paginator: &request.Paginator{ + InputTokens: []string{"nextToken"}, + OutputTokens: []string{"nextToken"}, + LimitToken: "maxResults", + TruncationToken: "", + }, + } + + if input == nil { + input = &DescribeImageScanFindingsInput{} + } + + output = &DescribeImageScanFindingsOutput{} + req = c.newRequest(op, input, output) + return +} + +// DescribeImageScanFindings API operation for Amazon EC2 Container Registry. +// +// Returns the scan findings for the specified image. +// +// Returns awserr.Error for service API and SDK errors. Use runtime type assertions +// with awserr.Error's Code and Message methods to get detailed information about +// the error. +// +// See the AWS API reference guide for Amazon EC2 Container Registry's +// API operation DescribeImageScanFindings for usage and error information. +// +// Returned Error Types: +// * ServerException +// These errors are usually caused by a server-side issue. +// +// * InvalidParameterException +// The specified parameter is invalid. Review the available parameters for the +// API request. +// +// * RepositoryNotFoundException +// The specified repository could not be found. Check the spelling of the specified +// repository and ensure that you are performing operations on the correct registry. +// +// * ImageNotFoundException +// The image requested does not exist in the specified repository. +// +// * ScanNotFoundException +// The specified image scan could not be found. Ensure that image scanning is +// enabled on the repository and try again. +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/DescribeImageScanFindings +func (c *ECR) DescribeImageScanFindings(input *DescribeImageScanFindingsInput) (*DescribeImageScanFindingsOutput, error) { + req, out := c.DescribeImageScanFindingsRequest(input) + return out, req.Send() +} + +// DescribeImageScanFindingsWithContext is the same as DescribeImageScanFindings with the addition of +// the ability to pass a context and additional request options. +// +// See DescribeImageScanFindings for details on how to use this API operation. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *ECR) DescribeImageScanFindingsWithContext(ctx aws.Context, input *DescribeImageScanFindingsInput, opts ...request.Option) (*DescribeImageScanFindingsOutput, error) { + req, out := c.DescribeImageScanFindingsRequest(input) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return out, req.Send() +} + +// DescribeImageScanFindingsPages iterates over the pages of a DescribeImageScanFindings operation, +// calling the "fn" function with the response data for each page. To stop +// iterating, return false from the fn function. +// +// See DescribeImageScanFindings method for more information on how to use this operation. +// +// Note: This operation can generate multiple requests to a service. +// +// // Example iterating over at most 3 pages of a DescribeImageScanFindings operation. +// pageNum := 0 +// err := client.DescribeImageScanFindingsPages(params, +// func(page *ecr.DescribeImageScanFindingsOutput, lastPage bool) bool { +// pageNum++ +// fmt.Println(page) +// return pageNum <= 3 +// }) +// +func (c *ECR) DescribeImageScanFindingsPages(input *DescribeImageScanFindingsInput, fn func(*DescribeImageScanFindingsOutput, bool) bool) error { + return c.DescribeImageScanFindingsPagesWithContext(aws.BackgroundContext(), input, fn) +} + +// DescribeImageScanFindingsPagesWithContext same as DescribeImageScanFindingsPages except +// it takes a Context and allows setting request options on the pages. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *ECR) DescribeImageScanFindingsPagesWithContext(ctx aws.Context, input *DescribeImageScanFindingsInput, fn func(*DescribeImageScanFindingsOutput, bool) bool, opts ...request.Option) error { + p := request.Pagination{ + NewRequest: func() (*request.Request, error) { + var inCpy *DescribeImageScanFindingsInput + if input != nil { + tmp := *input + inCpy = &tmp + } + req, _ := c.DescribeImageScanFindingsRequest(inCpy) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return req, nil + }, + } + + for p.Next() { + if !fn(p.Page().(*DescribeImageScanFindingsOutput), !p.HasNextPage()) { + break + } + } + + return p.Err() +} + const opDescribeImages = "DescribeImages" // DescribeImagesRequest generates a "aws/request.Request" representing the // client's request for the DescribeImages operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -810,8 +987,7 @@ func (c *ECR) DescribeImagesRequest(input *DescribeImagesInput) (req *request.Re // DescribeImages API operation for Amazon EC2 Container Registry. // -// Returns metadata about the images in a repository, including image size, -// image tags, and creation date. +// Returns metadata about the images in a repository. // // Beginning with Docker version 1.9, the Docker client compresses image layers // before pushing them to a V2 Docker registry. The output of the docker images @@ -825,19 +1001,19 @@ func (c *ECR) DescribeImagesRequest(input *DescribeImagesInput) (req *request.Re // See the AWS API reference guide for Amazon EC2 Container Registry's // API operation DescribeImages for usage and error information. // -// Returned Error Codes: -// * ErrCodeServerException "ServerException" +// Returned Error Types: +// * ServerException // These errors are usually caused by a server-side issue. // -// * ErrCodeInvalidParameterException "InvalidParameterException" +// * InvalidParameterException // The specified parameter is invalid. Review the available parameters for the // API request. // -// * ErrCodeRepositoryNotFoundException "RepositoryNotFoundException" +// * RepositoryNotFoundException // The specified repository could not be found. Check the spelling of the specified // repository and ensure that you are performing operations on the correct registry. // -// * ErrCodeImageNotFoundException "ImageNotFoundException" +// * ImageNotFoundException // The image requested does not exist in the specified repository. // // See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/DescribeImages @@ -873,7 +1049,7 @@ func (c *ECR) DescribeImagesWithContext(ctx aws.Context, input *DescribeImagesIn // // Example iterating over at most 3 pages of a DescribeImages operation. // pageNum := 0 // err := client.DescribeImagesPages(params, -// func(page *DescribeImagesOutput, lastPage bool) bool { +// func(page *ecr.DescribeImagesOutput, lastPage bool) bool { // pageNum++ // fmt.Println(page) // return pageNum <= 3 @@ -905,10 +1081,12 @@ func (c *ECR) DescribeImagesPagesWithContext(ctx aws.Context, input *DescribeIma }, } - cont := true - for p.Next() && cont { - cont = fn(p.Page().(*DescribeImagesOutput), !p.HasNextPage()) + for p.Next() { + if !fn(p.Page().(*DescribeImagesOutput), !p.HasNextPage()) { + break + } } + return p.Err() } @@ -917,7 +1095,7 @@ const opDescribeRepositories = "DescribeRepositories" // DescribeRepositoriesRequest generates a "aws/request.Request" representing the // client's request for the DescribeRepositories operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -971,15 +1149,15 @@ func (c *ECR) DescribeRepositoriesRequest(input *DescribeRepositoriesInput) (req // See the AWS API reference guide for Amazon EC2 Container Registry's // API operation DescribeRepositories for usage and error information. // -// Returned Error Codes: -// * ErrCodeServerException "ServerException" +// Returned Error Types: +// * ServerException // These errors are usually caused by a server-side issue. // -// * ErrCodeInvalidParameterException "InvalidParameterException" +// * InvalidParameterException // The specified parameter is invalid. Review the available parameters for the // API request. // -// * ErrCodeRepositoryNotFoundException "RepositoryNotFoundException" +// * RepositoryNotFoundException // The specified repository could not be found. Check the spelling of the specified // repository and ensure that you are performing operations on the correct registry. // @@ -1016,7 +1194,7 @@ func (c *ECR) DescribeRepositoriesWithContext(ctx aws.Context, input *DescribeRe // // Example iterating over at most 3 pages of a DescribeRepositories operation. // pageNum := 0 // err := client.DescribeRepositoriesPages(params, -// func(page *DescribeRepositoriesOutput, lastPage bool) bool { +// func(page *ecr.DescribeRepositoriesOutput, lastPage bool) bool { // pageNum++ // fmt.Println(page) // return pageNum <= 3 @@ -1048,10 +1226,12 @@ func (c *ECR) DescribeRepositoriesPagesWithContext(ctx aws.Context, input *Descr }, } - cont := true - for p.Next() && cont { - cont = fn(p.Page().(*DescribeRepositoriesOutput), !p.HasNextPage()) + for p.Next() { + if !fn(p.Page().(*DescribeRepositoriesOutput), !p.HasNextPage()) { + break + } } + return p.Err() } @@ -1060,7 +1240,7 @@ const opGetAuthorizationToken = "GetAuthorizationToken" // GetAuthorizationTokenRequest generates a "aws/request.Request" representing the // client's request for the GetAuthorizationToken operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -1099,14 +1279,16 @@ func (c *ECR) GetAuthorizationTokenRequest(input *GetAuthorizationTokenInput) (r // GetAuthorizationToken API operation for Amazon EC2 Container Registry. // -// Retrieves a token that is valid for a specified registry for 12 hours. This -// command allows you to use the docker CLI to push and pull images with Amazon -// ECR. If you do not specify a registry, the default registry is assumed. +// Retrieves an authorization token. An authorization token represents your +// IAM authentication credentials and can be used to access any Amazon ECR registry +// that your IAM principal has access to. The authorization token is valid for +// 12 hours. // -// The authorizationToken returned for each registry specified is a base64 encoded -// string that can be decoded and used in a docker login command to authenticate -// to a registry. The AWS CLI offers an aws ecr get-login command that simplifies -// the login process. +// The authorizationToken returned is a base64 encoded string that can be decoded +// and used in a docker login command to authenticate to a registry. The AWS +// CLI offers an get-login-password command that simplifies the login process. +// For more information, see Registry Authentication (https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html#registry_auth) +// in the Amazon Elastic Container Registry User Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -1115,11 +1297,11 @@ func (c *ECR) GetAuthorizationTokenRequest(input *GetAuthorizationTokenInput) (r // See the AWS API reference guide for Amazon EC2 Container Registry's // API operation GetAuthorizationToken for usage and error information. // -// Returned Error Codes: -// * ErrCodeServerException "ServerException" +// Returned Error Types: +// * ServerException // These errors are usually caused by a server-side issue. // -// * ErrCodeInvalidParameterException "InvalidParameterException" +// * InvalidParameterException // The specified parameter is invalid. Review the available parameters for the // API request. // @@ -1150,7 +1332,7 @@ const opGetDownloadUrlForLayer = "GetDownloadUrlForLayer" // GetDownloadUrlForLayerRequest generates a "aws/request.Request" representing the // client's request for the GetDownloadUrlForLayer operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -1192,6 +1374,9 @@ func (c *ECR) GetDownloadUrlForLayerRequest(input *GetDownloadUrlForLayerInput) // Retrieves the pre-signed Amazon S3 download URL corresponding to an image // layer. You can only get URLs for image layers that are referenced in an image. // +// When an image is pulled, the GetDownloadUrlForLayer API is called once per +// image layer. +// // This operation is used by the Amazon ECR proxy, and it is not intended for // general use by customers for pulling and pushing images. In most cases, you // should use the docker CLI to pull, tag, and push images. @@ -1203,23 +1388,23 @@ func (c *ECR) GetDownloadUrlForLayerRequest(input *GetDownloadUrlForLayerInput) // See the AWS API reference guide for Amazon EC2 Container Registry's // API operation GetDownloadUrlForLayer for usage and error information. // -// Returned Error Codes: -// * ErrCodeServerException "ServerException" +// Returned Error Types: +// * ServerException // These errors are usually caused by a server-side issue. // -// * ErrCodeInvalidParameterException "InvalidParameterException" +// * InvalidParameterException // The specified parameter is invalid. Review the available parameters for the // API request. // -// * ErrCodeLayersNotFoundException "LayersNotFoundException" +// * LayersNotFoundException // The specified layers could not be found, or the specified layer is not valid // for this repository. // -// * ErrCodeLayerInaccessibleException "LayerInaccessibleException" +// * LayerInaccessibleException // The specified layer is not available because it is not associated with an // image. Unassociated image layers may be cleaned up at any time. // -// * ErrCodeRepositoryNotFoundException "RepositoryNotFoundException" +// * RepositoryNotFoundException // The specified repository could not be found. Check the spelling of the specified // repository and ensure that you are performing operations on the correct registry. // @@ -1250,7 +1435,7 @@ const opGetLifecyclePolicy = "GetLifecyclePolicy" // GetLifecyclePolicyRequest generates a "aws/request.Request" representing the // client's request for the GetLifecyclePolicy operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -1289,7 +1474,7 @@ func (c *ECR) GetLifecyclePolicyRequest(input *GetLifecyclePolicyInput) (req *re // GetLifecyclePolicy API operation for Amazon EC2 Container Registry. // -// Retrieves the specified lifecycle policy. +// Retrieves the lifecycle policy for the specified repository. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -1298,19 +1483,19 @@ func (c *ECR) GetLifecyclePolicyRequest(input *GetLifecyclePolicyInput) (req *re // See the AWS API reference guide for Amazon EC2 Container Registry's // API operation GetLifecyclePolicy for usage and error information. // -// Returned Error Codes: -// * ErrCodeServerException "ServerException" +// Returned Error Types: +// * ServerException // These errors are usually caused by a server-side issue. // -// * ErrCodeInvalidParameterException "InvalidParameterException" +// * InvalidParameterException // The specified parameter is invalid. Review the available parameters for the // API request. // -// * ErrCodeRepositoryNotFoundException "RepositoryNotFoundException" +// * RepositoryNotFoundException // The specified repository could not be found. Check the spelling of the specified // repository and ensure that you are performing operations on the correct registry. // -// * ErrCodeLifecyclePolicyNotFoundException "LifecyclePolicyNotFoundException" +// * LifecyclePolicyNotFoundException // The lifecycle policy could not be found, and no policy is set to the repository. // // See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/GetLifecyclePolicy @@ -1340,7 +1525,7 @@ const opGetLifecyclePolicyPreview = "GetLifecyclePolicyPreview" // GetLifecyclePolicyPreviewRequest generates a "aws/request.Request" representing the // client's request for the GetLifecyclePolicyPreview operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -1366,6 +1551,12 @@ func (c *ECR) GetLifecyclePolicyPreviewRequest(input *GetLifecyclePolicyPreviewI Name: opGetLifecyclePolicyPreview, HTTPMethod: "POST", HTTPPath: "/", + Paginator: &request.Paginator{ + InputTokens: []string{"nextToken"}, + OutputTokens: []string{"nextToken"}, + LimitToken: "maxResults", + TruncationToken: "", + }, } if input == nil { @@ -1379,7 +1570,8 @@ func (c *ECR) GetLifecyclePolicyPreviewRequest(input *GetLifecyclePolicyPreviewI // GetLifecyclePolicyPreview API operation for Amazon EC2 Container Registry. // -// Retrieves the results of the specified lifecycle policy preview request. +// Retrieves the results of the lifecycle policy preview request for the specified +// repository. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -1388,19 +1580,19 @@ func (c *ECR) GetLifecyclePolicyPreviewRequest(input *GetLifecyclePolicyPreviewI // See the AWS API reference guide for Amazon EC2 Container Registry's // API operation GetLifecyclePolicyPreview for usage and error information. // -// Returned Error Codes: -// * ErrCodeServerException "ServerException" +// Returned Error Types: +// * ServerException // These errors are usually caused by a server-side issue. // -// * ErrCodeInvalidParameterException "InvalidParameterException" +// * InvalidParameterException // The specified parameter is invalid. Review the available parameters for the // API request. // -// * ErrCodeRepositoryNotFoundException "RepositoryNotFoundException" +// * RepositoryNotFoundException // The specified repository could not be found. Check the spelling of the specified // repository and ensure that you are performing operations on the correct registry. // -// * ErrCodeLifecyclePolicyPreviewNotFoundException "LifecyclePolicyPreviewNotFoundException" +// * LifecyclePolicyPreviewNotFoundException // There is no dry run for this repository. // // See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/GetLifecyclePolicyPreview @@ -1425,12 +1617,64 @@ func (c *ECR) GetLifecyclePolicyPreviewWithContext(ctx aws.Context, input *GetLi return out, req.Send() } +// GetLifecyclePolicyPreviewPages iterates over the pages of a GetLifecyclePolicyPreview operation, +// calling the "fn" function with the response data for each page. To stop +// iterating, return false from the fn function. +// +// See GetLifecyclePolicyPreview method for more information on how to use this operation. +// +// Note: This operation can generate multiple requests to a service. +// +// // Example iterating over at most 3 pages of a GetLifecyclePolicyPreview operation. +// pageNum := 0 +// err := client.GetLifecyclePolicyPreviewPages(params, +// func(page *ecr.GetLifecyclePolicyPreviewOutput, lastPage bool) bool { +// pageNum++ +// fmt.Println(page) +// return pageNum <= 3 +// }) +// +func (c *ECR) GetLifecyclePolicyPreviewPages(input *GetLifecyclePolicyPreviewInput, fn func(*GetLifecyclePolicyPreviewOutput, bool) bool) error { + return c.GetLifecyclePolicyPreviewPagesWithContext(aws.BackgroundContext(), input, fn) +} + +// GetLifecyclePolicyPreviewPagesWithContext same as GetLifecyclePolicyPreviewPages except +// it takes a Context and allows setting request options on the pages. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *ECR) GetLifecyclePolicyPreviewPagesWithContext(ctx aws.Context, input *GetLifecyclePolicyPreviewInput, fn func(*GetLifecyclePolicyPreviewOutput, bool) bool, opts ...request.Option) error { + p := request.Pagination{ + NewRequest: func() (*request.Request, error) { + var inCpy *GetLifecyclePolicyPreviewInput + if input != nil { + tmp := *input + inCpy = &tmp + } + req, _ := c.GetLifecyclePolicyPreviewRequest(inCpy) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return req, nil + }, + } + + for p.Next() { + if !fn(p.Page().(*GetLifecyclePolicyPreviewOutput), !p.HasNextPage()) { + break + } + } + + return p.Err() +} + const opGetRepositoryPolicy = "GetRepositoryPolicy" // GetRepositoryPolicyRequest generates a "aws/request.Request" representing the // client's request for the GetRepositoryPolicy operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -1469,7 +1713,7 @@ func (c *ECR) GetRepositoryPolicyRequest(input *GetRepositoryPolicyInput) (req * // GetRepositoryPolicy API operation for Amazon EC2 Container Registry. // -// Retrieves the repository policy for a specified repository. +// Retrieves the repository policy for the specified repository. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -1478,19 +1722,19 @@ func (c *ECR) GetRepositoryPolicyRequest(input *GetRepositoryPolicyInput) (req * // See the AWS API reference guide for Amazon EC2 Container Registry's // API operation GetRepositoryPolicy for usage and error information. // -// Returned Error Codes: -// * ErrCodeServerException "ServerException" +// Returned Error Types: +// * ServerException // These errors are usually caused by a server-side issue. // -// * ErrCodeInvalidParameterException "InvalidParameterException" +// * InvalidParameterException // The specified parameter is invalid. Review the available parameters for the // API request. // -// * ErrCodeRepositoryNotFoundException "RepositoryNotFoundException" +// * RepositoryNotFoundException // The specified repository could not be found. Check the spelling of the specified // repository and ensure that you are performing operations on the correct registry. // -// * ErrCodeRepositoryPolicyNotFoundException "RepositoryPolicyNotFoundException" +// * RepositoryPolicyNotFoundException // The specified repository and registry combination does not have an associated // repository policy. // @@ -1521,7 +1765,7 @@ const opInitiateLayerUpload = "InitiateLayerUpload" // InitiateLayerUploadRequest generates a "aws/request.Request" representing the // client's request for the InitiateLayerUpload operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -1560,7 +1804,11 @@ func (c *ECR) InitiateLayerUploadRequest(input *InitiateLayerUploadInput) (req * // InitiateLayerUpload API operation for Amazon EC2 Container Registry. // -// Notify Amazon ECR that you intend to upload an image layer. +// Notifies Amazon ECR that you intend to upload an image layer. +// +// When an image is pushed, the InitiateLayerUpload API is called once per image +// layer that has not already been uploaded. Whether an image layer has been +// uploaded before is determined by the BatchCheckLayerAvailability API action. // // This operation is used by the Amazon ECR proxy, and it is not intended for // general use by customers for pulling and pushing images. In most cases, you @@ -1573,15 +1821,15 @@ func (c *ECR) InitiateLayerUploadRequest(input *InitiateLayerUploadInput) (req * // See the AWS API reference guide for Amazon EC2 Container Registry's // API operation InitiateLayerUpload for usage and error information. // -// Returned Error Codes: -// * ErrCodeServerException "ServerException" +// Returned Error Types: +// * ServerException // These errors are usually caused by a server-side issue. // -// * ErrCodeInvalidParameterException "InvalidParameterException" +// * InvalidParameterException // The specified parameter is invalid. Review the available parameters for the // API request. // -// * ErrCodeRepositoryNotFoundException "RepositoryNotFoundException" +// * RepositoryNotFoundException // The specified repository could not be found. Check the spelling of the specified // repository and ensure that you are performing operations on the correct registry. // @@ -1612,7 +1860,7 @@ const opListImages = "ListImages" // ListImagesRequest generates a "aws/request.Request" representing the // client's request for the ListImages operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -1657,13 +1905,14 @@ func (c *ECR) ListImagesRequest(input *ListImagesInput) (req *request.Request, o // ListImages API operation for Amazon EC2 Container Registry. // -// Lists all the image IDs for a given repository. +// Lists all the image IDs for the specified repository. // -// You can filter images based on whether or not they are tagged by setting -// the tagStatus parameter to TAGGED or UNTAGGED. For example, you can filter -// your results to return only UNTAGGED images and then pipe that result to -// a BatchDeleteImage operation to delete them. Or, you can filter your results -// to return only TAGGED images to list all of the tags in your repository. +// You can filter images based on whether or not they are tagged by using the +// tagStatus filter and specifying either TAGGED, UNTAGGED or ANY. For example, +// you can filter your results to return only UNTAGGED images and then pipe +// that result to a BatchDeleteImage operation to delete them. Or, you can filter +// your results to return only TAGGED images to list all of the tags in your +// repository. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -1672,15 +1921,15 @@ func (c *ECR) ListImagesRequest(input *ListImagesInput) (req *request.Request, o // See the AWS API reference guide for Amazon EC2 Container Registry's // API operation ListImages for usage and error information. // -// Returned Error Codes: -// * ErrCodeServerException "ServerException" +// Returned Error Types: +// * ServerException // These errors are usually caused by a server-side issue. // -// * ErrCodeInvalidParameterException "InvalidParameterException" +// * InvalidParameterException // The specified parameter is invalid. Review the available parameters for the // API request. // -// * ErrCodeRepositoryNotFoundException "RepositoryNotFoundException" +// * RepositoryNotFoundException // The specified repository could not be found. Check the spelling of the specified // repository and ensure that you are performing operations on the correct registry. // @@ -1717,7 +1966,7 @@ func (c *ECR) ListImagesWithContext(ctx aws.Context, input *ListImagesInput, opt // // Example iterating over at most 3 pages of a ListImages operation. // pageNum := 0 // err := client.ListImagesPages(params, -// func(page *ListImagesOutput, lastPage bool) bool { +// func(page *ecr.ListImagesOutput, lastPage bool) bool { // pageNum++ // fmt.Println(page) // return pageNum <= 3 @@ -1749,19 +1998,108 @@ func (c *ECR) ListImagesPagesWithContext(ctx aws.Context, input *ListImagesInput }, } - cont := true - for p.Next() && cont { - cont = fn(p.Page().(*ListImagesOutput), !p.HasNextPage()) + for p.Next() { + if !fn(p.Page().(*ListImagesOutput), !p.HasNextPage()) { + break + } } + return p.Err() } +const opListTagsForResource = "ListTagsForResource" + +// ListTagsForResourceRequest generates a "aws/request.Request" representing the +// client's request for the ListTagsForResource operation. The "output" return +// value will be populated with the request's response once the request completes +// successfully. +// +// Use "Send" method on the returned Request to send the API call to the service. +// the "output" return value is not valid until after Send returns without error. +// +// See ListTagsForResource for more information on using the ListTagsForResource +// API call, and error handling. +// +// This method is useful when you want to inject custom logic or configuration +// into the SDK's request lifecycle. Such as custom headers, or retry logic. +// +// +// // Example sending a request using the ListTagsForResourceRequest method. +// req, resp := client.ListTagsForResourceRequest(params) +// +// err := req.Send() +// if err == nil { // resp is now filled +// fmt.Println(resp) +// } +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/ListTagsForResource +func (c *ECR) ListTagsForResourceRequest(input *ListTagsForResourceInput) (req *request.Request, output *ListTagsForResourceOutput) { + op := &request.Operation{ + Name: opListTagsForResource, + HTTPMethod: "POST", + HTTPPath: "/", + } + + if input == nil { + input = &ListTagsForResourceInput{} + } + + output = &ListTagsForResourceOutput{} + req = c.newRequest(op, input, output) + return +} + +// ListTagsForResource API operation for Amazon EC2 Container Registry. +// +// List the tags for an Amazon ECR resource. +// +// Returns awserr.Error for service API and SDK errors. Use runtime type assertions +// with awserr.Error's Code and Message methods to get detailed information about +// the error. +// +// See the AWS API reference guide for Amazon EC2 Container Registry's +// API operation ListTagsForResource for usage and error information. +// +// Returned Error Types: +// * InvalidParameterException +// The specified parameter is invalid. Review the available parameters for the +// API request. +// +// * RepositoryNotFoundException +// The specified repository could not be found. Check the spelling of the specified +// repository and ensure that you are performing operations on the correct registry. +// +// * ServerException +// These errors are usually caused by a server-side issue. +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/ListTagsForResource +func (c *ECR) ListTagsForResource(input *ListTagsForResourceInput) (*ListTagsForResourceOutput, error) { + req, out := c.ListTagsForResourceRequest(input) + return out, req.Send() +} + +// ListTagsForResourceWithContext is the same as ListTagsForResource with the addition of +// the ability to pass a context and additional request options. +// +// See ListTagsForResource for details on how to use this API operation. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *ECR) ListTagsForResourceWithContext(ctx aws.Context, input *ListTagsForResourceInput, opts ...request.Option) (*ListTagsForResourceOutput, error) { + req, out := c.ListTagsForResourceRequest(input) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return out, req.Send() +} + const opPutImage = "PutImage" // PutImageRequest generates a "aws/request.Request" representing the // client's request for the PutImage operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -1802,6 +2140,10 @@ func (c *ECR) PutImageRequest(input *PutImageInput) (req *request.Request, outpu // // Creates or updates the image manifest and tags associated with an image. // +// When an image is pushed and all new image layers have been uploaded, the +// PutImage API is called once to create or update the image manifest and tags +// associated with the image. +// // This operation is used by the Amazon ECR proxy, and it is not intended for // general use by customers for pulling and pushing images. In most cases, you // should use the docker CLI to pull, tag, and push images. @@ -1813,32 +2155,36 @@ func (c *ECR) PutImageRequest(input *PutImageInput) (req *request.Request, outpu // See the AWS API reference guide for Amazon EC2 Container Registry's // API operation PutImage for usage and error information. // -// Returned Error Codes: -// * ErrCodeServerException "ServerException" +// Returned Error Types: +// * ServerException // These errors are usually caused by a server-side issue. // -// * ErrCodeInvalidParameterException "InvalidParameterException" +// * InvalidParameterException // The specified parameter is invalid. Review the available parameters for the // API request. // -// * ErrCodeRepositoryNotFoundException "RepositoryNotFoundException" +// * RepositoryNotFoundException // The specified repository could not be found. Check the spelling of the specified // repository and ensure that you are performing operations on the correct registry. // -// * ErrCodeImageAlreadyExistsException "ImageAlreadyExistsException" +// * ImageAlreadyExistsException // The specified image has already been pushed, and there were no changes to // the manifest or image tag after the last push. // -// * ErrCodeLayersNotFoundException "LayersNotFoundException" +// * LayersNotFoundException // The specified layers could not be found, or the specified layer is not valid // for this repository. // -// * ErrCodeLimitExceededException "LimitExceededException" +// * LimitExceededException // The operation did not succeed because it would have exceeded a service limit // for your account. For more information, see Amazon ECR Default Service Limits -// (http://docs.aws.amazon.com/AmazonECR/latest/userguide/service_limits.html) +// (https://docs.aws.amazon.com/AmazonECR/latest/userguide/service_limits.html) // in the Amazon Elastic Container Registry User Guide. // +// * ImageTagAlreadyExistsException +// The specified image is tagged with a tag that already exists. The repository +// is configured for tag immutability. +// // See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/PutImage func (c *ECR) PutImage(input *PutImageInput) (*PutImageOutput, error) { req, out := c.PutImageRequest(input) @@ -1861,121 +2207,297 @@ func (c *ECR) PutImageWithContext(ctx aws.Context, input *PutImageInput, opts .. return out, req.Send() } -const opPutLifecyclePolicy = "PutLifecyclePolicy" +const opPutImageScanningConfiguration = "PutImageScanningConfiguration" -// PutLifecyclePolicyRequest generates a "aws/request.Request" representing the -// client's request for the PutLifecyclePolicy operation. The "output" return +// PutImageScanningConfigurationRequest generates a "aws/request.Request" representing the +// client's request for the PutImageScanningConfiguration operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. // -// See PutLifecyclePolicy for more information on using the PutLifecyclePolicy +// See PutImageScanningConfiguration for more information on using the PutImageScanningConfiguration // API call, and error handling. // // This method is useful when you want to inject custom logic or configuration // into the SDK's request lifecycle. Such as custom headers, or retry logic. // // -// // Example sending a request using the PutLifecyclePolicyRequest method. -// req, resp := client.PutLifecyclePolicyRequest(params) +// // Example sending a request using the PutImageScanningConfigurationRequest method. +// req, resp := client.PutImageScanningConfigurationRequest(params) // // err := req.Send() // if err == nil { // resp is now filled // fmt.Println(resp) // } // -// See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/PutLifecyclePolicy -func (c *ECR) PutLifecyclePolicyRequest(input *PutLifecyclePolicyInput) (req *request.Request, output *PutLifecyclePolicyOutput) { +// See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/PutImageScanningConfiguration +func (c *ECR) PutImageScanningConfigurationRequest(input *PutImageScanningConfigurationInput) (req *request.Request, output *PutImageScanningConfigurationOutput) { op := &request.Operation{ - Name: opPutLifecyclePolicy, + Name: opPutImageScanningConfiguration, HTTPMethod: "POST", HTTPPath: "/", } if input == nil { - input = &PutLifecyclePolicyInput{} + input = &PutImageScanningConfigurationInput{} } - output = &PutLifecyclePolicyOutput{} + output = &PutImageScanningConfigurationOutput{} req = c.newRequest(op, input, output) return } -// PutLifecyclePolicy API operation for Amazon EC2 Container Registry. +// PutImageScanningConfiguration API operation for Amazon EC2 Container Registry. // -// Creates or updates a lifecycle policy. For information about lifecycle policy -// syntax, see Lifecycle Policy Template (http://docs.aws.amazon.com/AmazonECR/latest/userguide/LifecyclePolicies.html). +// Updates the image scanning configuration for the specified repository. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about // the error. // // See the AWS API reference guide for Amazon EC2 Container Registry's -// API operation PutLifecyclePolicy for usage and error information. +// API operation PutImageScanningConfiguration for usage and error information. // -// Returned Error Codes: -// * ErrCodeServerException "ServerException" +// Returned Error Types: +// * ServerException // These errors are usually caused by a server-side issue. // -// * ErrCodeInvalidParameterException "InvalidParameterException" +// * InvalidParameterException // The specified parameter is invalid. Review the available parameters for the // API request. // -// * ErrCodeRepositoryNotFoundException "RepositoryNotFoundException" +// * RepositoryNotFoundException // The specified repository could not be found. Check the spelling of the specified // repository and ensure that you are performing operations on the correct registry. // -// See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/PutLifecyclePolicy -func (c *ECR) PutLifecyclePolicy(input *PutLifecyclePolicyInput) (*PutLifecyclePolicyOutput, error) { - req, out := c.PutLifecyclePolicyRequest(input) +// See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/PutImageScanningConfiguration +func (c *ECR) PutImageScanningConfiguration(input *PutImageScanningConfigurationInput) (*PutImageScanningConfigurationOutput, error) { + req, out := c.PutImageScanningConfigurationRequest(input) return out, req.Send() } -// PutLifecyclePolicyWithContext is the same as PutLifecyclePolicy with the addition of +// PutImageScanningConfigurationWithContext is the same as PutImageScanningConfiguration with the addition of // the ability to pass a context and additional request options. // -// See PutLifecyclePolicy for details on how to use this API operation. +// See PutImageScanningConfiguration for details on how to use this API operation. // // The context must be non-nil and will be used for request cancellation. If // the context is nil a panic will occur. In the future the SDK may create // sub-contexts for http.Requests. See https://golang.org/pkg/context/ // for more information on using Contexts. -func (c *ECR) PutLifecyclePolicyWithContext(ctx aws.Context, input *PutLifecyclePolicyInput, opts ...request.Option) (*PutLifecyclePolicyOutput, error) { - req, out := c.PutLifecyclePolicyRequest(input) +func (c *ECR) PutImageScanningConfigurationWithContext(ctx aws.Context, input *PutImageScanningConfigurationInput, opts ...request.Option) (*PutImageScanningConfigurationOutput, error) { + req, out := c.PutImageScanningConfigurationRequest(input) req.SetContext(ctx) req.ApplyOptions(opts...) return out, req.Send() } -const opSetRepositoryPolicy = "SetRepositoryPolicy" +const opPutImageTagMutability = "PutImageTagMutability" -// SetRepositoryPolicyRequest generates a "aws/request.Request" representing the -// client's request for the SetRepositoryPolicy operation. The "output" return +// PutImageTagMutabilityRequest generates a "aws/request.Request" representing the +// client's request for the PutImageTagMutability operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. // -// See SetRepositoryPolicy for more information on using the SetRepositoryPolicy +// See PutImageTagMutability for more information on using the PutImageTagMutability // API call, and error handling. // // This method is useful when you want to inject custom logic or configuration // into the SDK's request lifecycle. Such as custom headers, or retry logic. // // -// // Example sending a request using the SetRepositoryPolicyRequest method. -// req, resp := client.SetRepositoryPolicyRequest(params) +// // Example sending a request using the PutImageTagMutabilityRequest method. +// req, resp := client.PutImageTagMutabilityRequest(params) // // err := req.Send() // if err == nil { // resp is now filled // fmt.Println(resp) // } // -// See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/SetRepositoryPolicy -func (c *ECR) SetRepositoryPolicyRequest(input *SetRepositoryPolicyInput) (req *request.Request, output *SetRepositoryPolicyOutput) { +// See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/PutImageTagMutability +func (c *ECR) PutImageTagMutabilityRequest(input *PutImageTagMutabilityInput) (req *request.Request, output *PutImageTagMutabilityOutput) { + op := &request.Operation{ + Name: opPutImageTagMutability, + HTTPMethod: "POST", + HTTPPath: "/", + } + + if input == nil { + input = &PutImageTagMutabilityInput{} + } + + output = &PutImageTagMutabilityOutput{} + req = c.newRequest(op, input, output) + return +} + +// PutImageTagMutability API operation for Amazon EC2 Container Registry. +// +// Updates the image tag mutability settings for the specified repository. For +// more information, see Image Tag Mutability (https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-tag-mutability.html) +// in the Amazon Elastic Container Registry User Guide. +// +// Returns awserr.Error for service API and SDK errors. Use runtime type assertions +// with awserr.Error's Code and Message methods to get detailed information about +// the error. +// +// See the AWS API reference guide for Amazon EC2 Container Registry's +// API operation PutImageTagMutability for usage and error information. +// +// Returned Error Types: +// * ServerException +// These errors are usually caused by a server-side issue. +// +// * InvalidParameterException +// The specified parameter is invalid. Review the available parameters for the +// API request. +// +// * RepositoryNotFoundException +// The specified repository could not be found. Check the spelling of the specified +// repository and ensure that you are performing operations on the correct registry. +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/PutImageTagMutability +func (c *ECR) PutImageTagMutability(input *PutImageTagMutabilityInput) (*PutImageTagMutabilityOutput, error) { + req, out := c.PutImageTagMutabilityRequest(input) + return out, req.Send() +} + +// PutImageTagMutabilityWithContext is the same as PutImageTagMutability with the addition of +// the ability to pass a context and additional request options. +// +// See PutImageTagMutability for details on how to use this API operation. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *ECR) PutImageTagMutabilityWithContext(ctx aws.Context, input *PutImageTagMutabilityInput, opts ...request.Option) (*PutImageTagMutabilityOutput, error) { + req, out := c.PutImageTagMutabilityRequest(input) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return out, req.Send() +} + +const opPutLifecyclePolicy = "PutLifecyclePolicy" + +// PutLifecyclePolicyRequest generates a "aws/request.Request" representing the +// client's request for the PutLifecyclePolicy operation. The "output" return +// value will be populated with the request's response once the request completes +// successfully. +// +// Use "Send" method on the returned Request to send the API call to the service. +// the "output" return value is not valid until after Send returns without error. +// +// See PutLifecyclePolicy for more information on using the PutLifecyclePolicy +// API call, and error handling. +// +// This method is useful when you want to inject custom logic or configuration +// into the SDK's request lifecycle. Such as custom headers, or retry logic. +// +// +// // Example sending a request using the PutLifecyclePolicyRequest method. +// req, resp := client.PutLifecyclePolicyRequest(params) +// +// err := req.Send() +// if err == nil { // resp is now filled +// fmt.Println(resp) +// } +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/PutLifecyclePolicy +func (c *ECR) PutLifecyclePolicyRequest(input *PutLifecyclePolicyInput) (req *request.Request, output *PutLifecyclePolicyOutput) { + op := &request.Operation{ + Name: opPutLifecyclePolicy, + HTTPMethod: "POST", + HTTPPath: "/", + } + + if input == nil { + input = &PutLifecyclePolicyInput{} + } + + output = &PutLifecyclePolicyOutput{} + req = c.newRequest(op, input, output) + return +} + +// PutLifecyclePolicy API operation for Amazon EC2 Container Registry. +// +// Creates or updates the lifecycle policy for the specified repository. For +// more information, see Lifecycle Policy Template (https://docs.aws.amazon.com/AmazonECR/latest/userguide/LifecyclePolicies.html). +// +// Returns awserr.Error for service API and SDK errors. Use runtime type assertions +// with awserr.Error's Code and Message methods to get detailed information about +// the error. +// +// See the AWS API reference guide for Amazon EC2 Container Registry's +// API operation PutLifecyclePolicy for usage and error information. +// +// Returned Error Types: +// * ServerException +// These errors are usually caused by a server-side issue. +// +// * InvalidParameterException +// The specified parameter is invalid. Review the available parameters for the +// API request. +// +// * RepositoryNotFoundException +// The specified repository could not be found. Check the spelling of the specified +// repository and ensure that you are performing operations on the correct registry. +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/PutLifecyclePolicy +func (c *ECR) PutLifecyclePolicy(input *PutLifecyclePolicyInput) (*PutLifecyclePolicyOutput, error) { + req, out := c.PutLifecyclePolicyRequest(input) + return out, req.Send() +} + +// PutLifecyclePolicyWithContext is the same as PutLifecyclePolicy with the addition of +// the ability to pass a context and additional request options. +// +// See PutLifecyclePolicy for details on how to use this API operation. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *ECR) PutLifecyclePolicyWithContext(ctx aws.Context, input *PutLifecyclePolicyInput, opts ...request.Option) (*PutLifecyclePolicyOutput, error) { + req, out := c.PutLifecyclePolicyRequest(input) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return out, req.Send() +} + +const opSetRepositoryPolicy = "SetRepositoryPolicy" + +// SetRepositoryPolicyRequest generates a "aws/request.Request" representing the +// client's request for the SetRepositoryPolicy operation. The "output" return +// value will be populated with the request's response once the request completes +// successfully. +// +// Use "Send" method on the returned Request to send the API call to the service. +// the "output" return value is not valid until after Send returns without error. +// +// See SetRepositoryPolicy for more information on using the SetRepositoryPolicy +// API call, and error handling. +// +// This method is useful when you want to inject custom logic or configuration +// into the SDK's request lifecycle. Such as custom headers, or retry logic. +// +// +// // Example sending a request using the SetRepositoryPolicyRequest method. +// req, resp := client.SetRepositoryPolicyRequest(params) +// +// err := req.Send() +// if err == nil { // resp is now filled +// fmt.Println(resp) +// } +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/SetRepositoryPolicy +func (c *ECR) SetRepositoryPolicyRequest(input *SetRepositoryPolicyInput) (req *request.Request, output *SetRepositoryPolicyOutput) { op := &request.Operation{ Name: opSetRepositoryPolicy, HTTPMethod: "POST", @@ -1993,7 +2515,9 @@ func (c *ECR) SetRepositoryPolicyRequest(input *SetRepositoryPolicyInput) (req * // SetRepositoryPolicy API operation for Amazon EC2 Container Registry. // -// Applies a repository policy on a specified repository to control access permissions. +// Applies a repository policy to the specified repository to control access +// permissions. For more information, see Amazon ECR Repository Policies (https://docs.aws.amazon.com/AmazonECR/latest/userguide/RepositoryPolicies.html) +// in the Amazon Elastic Container Registry User Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -2002,15 +2526,15 @@ func (c *ECR) SetRepositoryPolicyRequest(input *SetRepositoryPolicyInput) (req * // See the AWS API reference guide for Amazon EC2 Container Registry's // API operation SetRepositoryPolicy for usage and error information. // -// Returned Error Codes: -// * ErrCodeServerException "ServerException" +// Returned Error Types: +// * ServerException // These errors are usually caused by a server-side issue. // -// * ErrCodeInvalidParameterException "InvalidParameterException" +// * InvalidParameterException // The specified parameter is invalid. Review the available parameters for the // API request. // -// * ErrCodeRepositoryNotFoundException "RepositoryNotFoundException" +// * RepositoryNotFoundException // The specified repository could not be found. Check the spelling of the specified // repository and ensure that you are performing operations on the correct registry. // @@ -2036,12 +2560,105 @@ func (c *ECR) SetRepositoryPolicyWithContext(ctx aws.Context, input *SetReposito return out, req.Send() } +const opStartImageScan = "StartImageScan" + +// StartImageScanRequest generates a "aws/request.Request" representing the +// client's request for the StartImageScan operation. The "output" return +// value will be populated with the request's response once the request completes +// successfully. +// +// Use "Send" method on the returned Request to send the API call to the service. +// the "output" return value is not valid until after Send returns without error. +// +// See StartImageScan for more information on using the StartImageScan +// API call, and error handling. +// +// This method is useful when you want to inject custom logic or configuration +// into the SDK's request lifecycle. Such as custom headers, or retry logic. +// +// +// // Example sending a request using the StartImageScanRequest method. +// req, resp := client.StartImageScanRequest(params) +// +// err := req.Send() +// if err == nil { // resp is now filled +// fmt.Println(resp) +// } +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/StartImageScan +func (c *ECR) StartImageScanRequest(input *StartImageScanInput) (req *request.Request, output *StartImageScanOutput) { + op := &request.Operation{ + Name: opStartImageScan, + HTTPMethod: "POST", + HTTPPath: "/", + } + + if input == nil { + input = &StartImageScanInput{} + } + + output = &StartImageScanOutput{} + req = c.newRequest(op, input, output) + return +} + +// StartImageScan API operation for Amazon EC2 Container Registry. +// +// Starts an image vulnerability scan. An image scan can only be started once +// per day on an individual image. This limit includes if an image was scanned +// on initial push. For more information, see Image Scanning (https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-scanning.html) +// in the Amazon Elastic Container Registry User Guide. +// +// Returns awserr.Error for service API and SDK errors. Use runtime type assertions +// with awserr.Error's Code and Message methods to get detailed information about +// the error. +// +// See the AWS API reference guide for Amazon EC2 Container Registry's +// API operation StartImageScan for usage and error information. +// +// Returned Error Types: +// * ServerException +// These errors are usually caused by a server-side issue. +// +// * InvalidParameterException +// The specified parameter is invalid. Review the available parameters for the +// API request. +// +// * RepositoryNotFoundException +// The specified repository could not be found. Check the spelling of the specified +// repository and ensure that you are performing operations on the correct registry. +// +// * ImageNotFoundException +// The image requested does not exist in the specified repository. +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/StartImageScan +func (c *ECR) StartImageScan(input *StartImageScanInput) (*StartImageScanOutput, error) { + req, out := c.StartImageScanRequest(input) + return out, req.Send() +} + +// StartImageScanWithContext is the same as StartImageScan with the addition of +// the ability to pass a context and additional request options. +// +// See StartImageScan for details on how to use this API operation. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *ECR) StartImageScanWithContext(ctx aws.Context, input *StartImageScanInput, opts ...request.Option) (*StartImageScanOutput, error) { + req, out := c.StartImageScanRequest(input) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return out, req.Send() +} + const opStartLifecyclePolicyPreview = "StartLifecyclePolicyPreview" // StartLifecyclePolicyPreviewRequest generates a "aws/request.Request" representing the // client's request for the StartLifecyclePolicyPreview operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -2080,8 +2697,9 @@ func (c *ECR) StartLifecyclePolicyPreviewRequest(input *StartLifecyclePolicyPrev // StartLifecyclePolicyPreview API operation for Amazon EC2 Container Registry. // -// Starts a preview of the specified lifecycle policy. This allows you to see -// the results before creating the lifecycle policy. +// Starts a preview of a lifecycle policy for the specified repository. This +// allows you to see the results before associating the lifecycle policy with +// the repository. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -2090,22 +2708,22 @@ func (c *ECR) StartLifecyclePolicyPreviewRequest(input *StartLifecyclePolicyPrev // See the AWS API reference guide for Amazon EC2 Container Registry's // API operation StartLifecyclePolicyPreview for usage and error information. // -// Returned Error Codes: -// * ErrCodeServerException "ServerException" +// Returned Error Types: +// * ServerException // These errors are usually caused by a server-side issue. // -// * ErrCodeInvalidParameterException "InvalidParameterException" +// * InvalidParameterException // The specified parameter is invalid. Review the available parameters for the // API request. // -// * ErrCodeRepositoryNotFoundException "RepositoryNotFoundException" +// * RepositoryNotFoundException // The specified repository could not be found. Check the spelling of the specified // repository and ensure that you are performing operations on the correct registry. // -// * ErrCodeLifecyclePolicyNotFoundException "LifecyclePolicyNotFoundException" +// * LifecyclePolicyNotFoundException // The lifecycle policy could not be found, and no policy is set to the repository. // -// * ErrCodeLifecyclePolicyPreviewInProgressException "LifecyclePolicyPreviewInProgressException" +// * LifecyclePolicyPreviewInProgressException // The previous lifecycle policy preview request has not completed. Please try // again later. // @@ -2131,123 +2749,357 @@ func (c *ECR) StartLifecyclePolicyPreviewWithContext(ctx aws.Context, input *Sta return out, req.Send() } -const opUploadLayerPart = "UploadLayerPart" +const opTagResource = "TagResource" -// UploadLayerPartRequest generates a "aws/request.Request" representing the -// client's request for the UploadLayerPart operation. The "output" return +// TagResourceRequest generates a "aws/request.Request" representing the +// client's request for the TagResource operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. // -// See UploadLayerPart for more information on using the UploadLayerPart +// See TagResource for more information on using the TagResource // API call, and error handling. // // This method is useful when you want to inject custom logic or configuration // into the SDK's request lifecycle. Such as custom headers, or retry logic. // // -// // Example sending a request using the UploadLayerPartRequest method. -// req, resp := client.UploadLayerPartRequest(params) +// // Example sending a request using the TagResourceRequest method. +// req, resp := client.TagResourceRequest(params) // // err := req.Send() // if err == nil { // resp is now filled // fmt.Println(resp) // } // -// See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/UploadLayerPart -func (c *ECR) UploadLayerPartRequest(input *UploadLayerPartInput) (req *request.Request, output *UploadLayerPartOutput) { +// See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/TagResource +func (c *ECR) TagResourceRequest(input *TagResourceInput) (req *request.Request, output *TagResourceOutput) { op := &request.Operation{ - Name: opUploadLayerPart, + Name: opTagResource, HTTPMethod: "POST", HTTPPath: "/", } if input == nil { - input = &UploadLayerPartInput{} + input = &TagResourceInput{} } - output = &UploadLayerPartOutput{} + output = &TagResourceOutput{} req = c.newRequest(op, input, output) + req.Handlers.Unmarshal.Swap(jsonrpc.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler) return } -// UploadLayerPart API operation for Amazon EC2 Container Registry. -// -// Uploads an image layer part to Amazon ECR. +// TagResource API operation for Amazon EC2 Container Registry. // -// This operation is used by the Amazon ECR proxy, and it is not intended for -// general use by customers for pulling and pushing images. In most cases, you -// should use the docker CLI to pull, tag, and push images. +// Adds specified tags to a resource with the specified ARN. Existing tags on +// a resource are not changed if they are not specified in the request parameters. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about // the error. // // See the AWS API reference guide for Amazon EC2 Container Registry's -// API operation UploadLayerPart for usage and error information. -// -// Returned Error Codes: -// * ErrCodeServerException "ServerException" -// These errors are usually caused by a server-side issue. +// API operation TagResource for usage and error information. // -// * ErrCodeInvalidParameterException "InvalidParameterException" +// Returned Error Types: +// * InvalidParameterException // The specified parameter is invalid. Review the available parameters for the // API request. // -// * ErrCodeInvalidLayerPartException "InvalidLayerPartException" -// The layer part size is not valid, or the first byte specified is not consecutive -// to the last byte of a previous layer part upload. +// * InvalidTagParameterException +// An invalid parameter has been specified. Tag keys can have a maximum character +// length of 128 characters, and tag values can have a maximum length of 256 +// characters. +// +// * TooManyTagsException +// The list of tags on the repository is over the limit. The maximum number +// of tags that can be applied to a repository is 50. // -// * ErrCodeRepositoryNotFoundException "RepositoryNotFoundException" +// * RepositoryNotFoundException // The specified repository could not be found. Check the spelling of the specified // repository and ensure that you are performing operations on the correct registry. // -// * ErrCodeUploadNotFoundException "UploadNotFoundException" -// The upload could not be found, or the specified upload id is not valid for -// this repository. -// -// * ErrCodeLimitExceededException "LimitExceededException" -// The operation did not succeed because it would have exceeded a service limit -// for your account. For more information, see Amazon ECR Default Service Limits -// (http://docs.aws.amazon.com/AmazonECR/latest/userguide/service_limits.html) -// in the Amazon Elastic Container Registry User Guide. +// * ServerException +// These errors are usually caused by a server-side issue. // -// See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/UploadLayerPart -func (c *ECR) UploadLayerPart(input *UploadLayerPartInput) (*UploadLayerPartOutput, error) { - req, out := c.UploadLayerPartRequest(input) +// See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/TagResource +func (c *ECR) TagResource(input *TagResourceInput) (*TagResourceOutput, error) { + req, out := c.TagResourceRequest(input) return out, req.Send() } -// UploadLayerPartWithContext is the same as UploadLayerPart with the addition of +// TagResourceWithContext is the same as TagResource with the addition of // the ability to pass a context and additional request options. // -// See UploadLayerPart for details on how to use this API operation. +// See TagResource for details on how to use this API operation. // // The context must be non-nil and will be used for request cancellation. If // the context is nil a panic will occur. In the future the SDK may create // sub-contexts for http.Requests. See https://golang.org/pkg/context/ // for more information on using Contexts. -func (c *ECR) UploadLayerPartWithContext(ctx aws.Context, input *UploadLayerPartInput, opts ...request.Option) (*UploadLayerPartOutput, error) { - req, out := c.UploadLayerPartRequest(input) +func (c *ECR) TagResourceWithContext(ctx aws.Context, input *TagResourceInput, opts ...request.Option) (*TagResourceOutput, error) { + req, out := c.TagResourceRequest(input) req.SetContext(ctx) req.ApplyOptions(opts...) return out, req.Send() } -// An object representing authorization data for an Amazon ECR registry. -type AuthorizationData struct { - _ struct{} `type:"structure"` +const opUntagResource = "UntagResource" - // A base64-encoded string that contains authorization data for the specified - // Amazon ECR registry. When the string is decoded, it is presented in the format - // user:password for private registry authentication using docker login. +// UntagResourceRequest generates a "aws/request.Request" representing the +// client's request for the UntagResource operation. The "output" return +// value will be populated with the request's response once the request completes +// successfully. +// +// Use "Send" method on the returned Request to send the API call to the service. +// the "output" return value is not valid until after Send returns without error. +// +// See UntagResource for more information on using the UntagResource +// API call, and error handling. +// +// This method is useful when you want to inject custom logic or configuration +// into the SDK's request lifecycle. Such as custom headers, or retry logic. +// +// +// // Example sending a request using the UntagResourceRequest method. +// req, resp := client.UntagResourceRequest(params) +// +// err := req.Send() +// if err == nil { // resp is now filled +// fmt.Println(resp) +// } +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/UntagResource +func (c *ECR) UntagResourceRequest(input *UntagResourceInput) (req *request.Request, output *UntagResourceOutput) { + op := &request.Operation{ + Name: opUntagResource, + HTTPMethod: "POST", + HTTPPath: "/", + } + + if input == nil { + input = &UntagResourceInput{} + } + + output = &UntagResourceOutput{} + req = c.newRequest(op, input, output) + req.Handlers.Unmarshal.Swap(jsonrpc.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler) + return +} + +// UntagResource API operation for Amazon EC2 Container Registry. +// +// Deletes specified tags from a resource. +// +// Returns awserr.Error for service API and SDK errors. Use runtime type assertions +// with awserr.Error's Code and Message methods to get detailed information about +// the error. +// +// See the AWS API reference guide for Amazon EC2 Container Registry's +// API operation UntagResource for usage and error information. +// +// Returned Error Types: +// * InvalidParameterException +// The specified parameter is invalid. Review the available parameters for the +// API request. +// +// * InvalidTagParameterException +// An invalid parameter has been specified. Tag keys can have a maximum character +// length of 128 characters, and tag values can have a maximum length of 256 +// characters. +// +// * TooManyTagsException +// The list of tags on the repository is over the limit. The maximum number +// of tags that can be applied to a repository is 50. +// +// * RepositoryNotFoundException +// The specified repository could not be found. Check the spelling of the specified +// repository and ensure that you are performing operations on the correct registry. +// +// * ServerException +// These errors are usually caused by a server-side issue. +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/UntagResource +func (c *ECR) UntagResource(input *UntagResourceInput) (*UntagResourceOutput, error) { + req, out := c.UntagResourceRequest(input) + return out, req.Send() +} + +// UntagResourceWithContext is the same as UntagResource with the addition of +// the ability to pass a context and additional request options. +// +// See UntagResource for details on how to use this API operation. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *ECR) UntagResourceWithContext(ctx aws.Context, input *UntagResourceInput, opts ...request.Option) (*UntagResourceOutput, error) { + req, out := c.UntagResourceRequest(input) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return out, req.Send() +} + +const opUploadLayerPart = "UploadLayerPart" + +// UploadLayerPartRequest generates a "aws/request.Request" representing the +// client's request for the UploadLayerPart operation. The "output" return +// value will be populated with the request's response once the request completes +// successfully. +// +// Use "Send" method on the returned Request to send the API call to the service. +// the "output" return value is not valid until after Send returns without error. +// +// See UploadLayerPart for more information on using the UploadLayerPart +// API call, and error handling. +// +// This method is useful when you want to inject custom logic or configuration +// into the SDK's request lifecycle. Such as custom headers, or retry logic. +// +// +// // Example sending a request using the UploadLayerPartRequest method. +// req, resp := client.UploadLayerPartRequest(params) +// +// err := req.Send() +// if err == nil { // resp is now filled +// fmt.Println(resp) +// } +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/UploadLayerPart +func (c *ECR) UploadLayerPartRequest(input *UploadLayerPartInput) (req *request.Request, output *UploadLayerPartOutput) { + op := &request.Operation{ + Name: opUploadLayerPart, + HTTPMethod: "POST", + HTTPPath: "/", + } + + if input == nil { + input = &UploadLayerPartInput{} + } + + output = &UploadLayerPartOutput{} + req = c.newRequest(op, input, output) + return +} + +// UploadLayerPart API operation for Amazon EC2 Container Registry. +// +// Uploads an image layer part to Amazon ECR. +// +// When an image is pushed, each new image layer is uploaded in parts. The maximum +// size of each image layer part can be 20971520 bytes (or about 20MB). The +// UploadLayerPart API is called once per each new image layer part. +// +// This operation is used by the Amazon ECR proxy, and it is not intended for +// general use by customers for pulling and pushing images. In most cases, you +// should use the docker CLI to pull, tag, and push images. +// +// Returns awserr.Error for service API and SDK errors. Use runtime type assertions +// with awserr.Error's Code and Message methods to get detailed information about +// the error. +// +// See the AWS API reference guide for Amazon EC2 Container Registry's +// API operation UploadLayerPart for usage and error information. +// +// Returned Error Types: +// * ServerException +// These errors are usually caused by a server-side issue. +// +// * InvalidParameterException +// The specified parameter is invalid. Review the available parameters for the +// API request. +// +// * InvalidLayerPartException +// The layer part size is not valid, or the first byte specified is not consecutive +// to the last byte of a previous layer part upload. +// +// * RepositoryNotFoundException +// The specified repository could not be found. Check the spelling of the specified +// repository and ensure that you are performing operations on the correct registry. +// +// * UploadNotFoundException +// The upload could not be found, or the specified upload id is not valid for +// this repository. +// +// * LimitExceededException +// The operation did not succeed because it would have exceeded a service limit +// for your account. For more information, see Amazon ECR Default Service Limits +// (https://docs.aws.amazon.com/AmazonECR/latest/userguide/service_limits.html) +// in the Amazon Elastic Container Registry User Guide. +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/ecr-2015-09-21/UploadLayerPart +func (c *ECR) UploadLayerPart(input *UploadLayerPartInput) (*UploadLayerPartOutput, error) { + req, out := c.UploadLayerPartRequest(input) + return out, req.Send() +} + +// UploadLayerPartWithContext is the same as UploadLayerPart with the addition of +// the ability to pass a context and additional request options. +// +// See UploadLayerPart for details on how to use this API operation. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *ECR) UploadLayerPartWithContext(ctx aws.Context, input *UploadLayerPartInput, opts ...request.Option) (*UploadLayerPartOutput, error) { + req, out := c.UploadLayerPartRequest(input) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return out, req.Send() +} + +// This data type is used in the ImageScanFinding data type. +type Attribute struct { + _ struct{} `type:"structure"` + + // The attribute key. + // + // Key is a required field + Key *string `locationName:"key" min:"1" type:"string" required:"true"` + + // The value assigned to the attribute key. + Value *string `locationName:"value" min:"1" type:"string"` +} + +// String returns the string representation +func (s Attribute) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s Attribute) GoString() string { + return s.String() +} + +// SetKey sets the Key field's value. +func (s *Attribute) SetKey(v string) *Attribute { + s.Key = &v + return s +} + +// SetValue sets the Value field's value. +func (s *Attribute) SetValue(v string) *Attribute { + s.Value = &v + return s +} + +// An object representing authorization data for an Amazon ECR registry. +type AuthorizationData struct { + _ struct{} `type:"structure"` + + // A base64-encoded string that contains authorization data for the specified + // Amazon ECR registry. When the string is decoded, it is presented in the format + // user:password for private registry authentication using docker login. AuthorizationToken *string `locationName:"authorizationToken" type:"string"` // The Unix time in seconds and milliseconds when the authorization token expires. // Authorization tokens are valid for 12 hours. - ExpiresAt *time.Time `locationName:"expiresAt" type:"timestamp" timestampFormat:"unix"` + ExpiresAt *time.Time `locationName:"expiresAt" type:"timestamp"` // The registry URL to use for this authorization token in a docker login command. // The Amazon ECR registry URL format is https://aws_account_id.dkr.ecr.region.amazonaws.com. @@ -2430,6 +3282,16 @@ func (s *BatchDeleteImageInput) Validate() error { if s.RepositoryName != nil && len(*s.RepositoryName) < 2 { invalidParams.Add(request.NewErrParamMinLen("RepositoryName", 2)) } + if s.ImageIds != nil { + for i, v := range s.ImageIds { + if v == nil { + continue + } + if err := v.Validate(); err != nil { + invalidParams.AddNested(fmt.Sprintf("%s[%v]", "ImageIds", i), err.(request.ErrInvalidParams)) + } + } + } if invalidParams.Len() > 0 { return invalidParams @@ -2540,6 +3402,16 @@ func (s *BatchGetImageInput) Validate() error { if s.RepositoryName != nil && len(*s.RepositoryName) < 2 { invalidParams.Add(request.NewErrParamMinLen("RepositoryName", 2)) } + if s.ImageIds != nil { + for i, v := range s.ImageIds { + if v == nil { + continue + } + if err := v.Validate(); err != nil { + invalidParams.AddNested(fmt.Sprintf("%s[%v]", "ImageIds", i), err.(request.ErrInvalidParams)) + } + } + } if invalidParams.Len() > 0 { return invalidParams @@ -2739,12 +3611,29 @@ func (s *CompleteLayerUploadOutput) SetUploadId(v string) *CompleteLayerUploadOu type CreateRepositoryInput struct { _ struct{} `type:"structure"` + // The image scanning configuration for the repository. This setting determines + // whether images are scanned for known vulnerabilities after being pushed to + // the repository. + ImageScanningConfiguration *ImageScanningConfiguration `locationName:"imageScanningConfiguration" type:"structure"` + + // The tag mutability setting for the repository. If this parameter is omitted, + // the default setting of MUTABLE will be used which will allow image tags to + // be overwritten. If IMMUTABLE is specified, all image tags within the repository + // will be immutable which will prevent them from being overwritten. + ImageTagMutability *string `locationName:"imageTagMutability" type:"string" enum:"ImageTagMutability"` + // The name to use for the repository. The repository name may be specified // on its own (such as nginx-web-app) or it can be prepended with a namespace // to group the repository into a category (such as project-a/nginx-web-app). // // RepositoryName is a required field RepositoryName *string `locationName:"repositoryName" min:"2" type:"string" required:"true"` + + // The metadata that you apply to the repository to help you categorize and + // organize them. Each tag consists of a key and an optional value, both of + // which you define. Tag keys can have a maximum character length of 128 characters, + // and tag values can have a maximum length of 256 characters. + Tags []*Tag `locationName:"tags" type:"list"` } // String returns the string representation @@ -2773,12 +3662,30 @@ func (s *CreateRepositoryInput) Validate() error { return nil } +// SetImageScanningConfiguration sets the ImageScanningConfiguration field's value. +func (s *CreateRepositoryInput) SetImageScanningConfiguration(v *ImageScanningConfiguration) *CreateRepositoryInput { + s.ImageScanningConfiguration = v + return s +} + +// SetImageTagMutability sets the ImageTagMutability field's value. +func (s *CreateRepositoryInput) SetImageTagMutability(v string) *CreateRepositoryInput { + s.ImageTagMutability = &v + return s +} + // SetRepositoryName sets the RepositoryName field's value. func (s *CreateRepositoryInput) SetRepositoryName(v string) *CreateRepositoryInput { s.RepositoryName = &v return s } +// SetTags sets the Tags field's value. +func (s *CreateRepositoryInput) SetTags(v []*Tag) *CreateRepositoryInput { + s.Tags = v + return s +} + type CreateRepositoryOutput struct { _ struct{} `type:"structure"` @@ -2857,7 +3764,7 @@ type DeleteLifecyclePolicyOutput struct { _ struct{} `type:"structure"` // The time stamp of the last time that the lifecycle policy was run. - LastEvaluatedAt *time.Time `locationName:"lastEvaluatedAt" type:"timestamp" timestampFormat:"unix"` + LastEvaluatedAt *time.Time `locationName:"lastEvaluatedAt" type:"timestamp"` // The JSON lifecycle policy text. LifecyclePolicyText *string `locationName:"lifecyclePolicyText" min:"100" type:"string"` @@ -3080,35 +3987,209 @@ func (s *DeleteRepositoryPolicyOutput) SetRepositoryName(v string) *DeleteReposi return s } -// An object representing a filter on a DescribeImages operation. -type DescribeImagesFilter struct { +type DescribeImageScanFindingsInput struct { _ struct{} `type:"structure"` - // The tag status with which to filter your DescribeImages results. You can - // filter results based on whether they are TAGGED or UNTAGGED. - TagStatus *string `locationName:"tagStatus" type:"string" enum:"TagStatus"` + // An object with identifying information for an Amazon ECR image. + // + // ImageId is a required field + ImageId *ImageIdentifier `locationName:"imageId" type:"structure" required:"true"` + + // The maximum number of image scan results returned by DescribeImageScanFindings + // in paginated output. When this parameter is used, DescribeImageScanFindings + // only returns maxResults results in a single page along with a nextToken response + // element. The remaining results of the initial request can be seen by sending + // another DescribeImageScanFindings request with the returned nextToken value. + // This value can be between 1 and 1000. If this parameter is not used, then + // DescribeImageScanFindings returns up to 100 results and a nextToken value, + // if applicable. + MaxResults *int64 `locationName:"maxResults" min:"1" type:"integer"` + + // The nextToken value returned from a previous paginated DescribeImageScanFindings + // request where maxResults was used and the results exceeded the value of that + // parameter. Pagination continues from the end of the previous results that + // returned the nextToken value. This value is null when there are no more results + // to return. + NextToken *string `locationName:"nextToken" type:"string"` + + // The AWS account ID associated with the registry that contains the repository + // in which to describe the image scan findings for. If you do not specify a + // registry, the default registry is assumed. + RegistryId *string `locationName:"registryId" type:"string"` + + // The repository for the image for which to describe the scan findings. + // + // RepositoryName is a required field + RepositoryName *string `locationName:"repositoryName" min:"2" type:"string" required:"true"` } // String returns the string representation -func (s DescribeImagesFilter) String() string { +func (s DescribeImageScanFindingsInput) String() string { return awsutil.Prettify(s) } // GoString returns the string representation -func (s DescribeImagesFilter) GoString() string { +func (s DescribeImageScanFindingsInput) GoString() string { return s.String() } -// SetTagStatus sets the TagStatus field's value. -func (s *DescribeImagesFilter) SetTagStatus(v string) *DescribeImagesFilter { - s.TagStatus = &v - return s +// Validate inspects the fields of the type to determine if they are valid. +func (s *DescribeImageScanFindingsInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "DescribeImageScanFindingsInput"} + if s.ImageId == nil { + invalidParams.Add(request.NewErrParamRequired("ImageId")) + } + if s.MaxResults != nil && *s.MaxResults < 1 { + invalidParams.Add(request.NewErrParamMinValue("MaxResults", 1)) + } + if s.RepositoryName == nil { + invalidParams.Add(request.NewErrParamRequired("RepositoryName")) + } + if s.RepositoryName != nil && len(*s.RepositoryName) < 2 { + invalidParams.Add(request.NewErrParamMinLen("RepositoryName", 2)) + } + if s.ImageId != nil { + if err := s.ImageId.Validate(); err != nil { + invalidParams.AddNested("ImageId", err.(request.ErrInvalidParams)) + } + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil } -type DescribeImagesInput struct { - _ struct{} `type:"structure"` +// SetImageId sets the ImageId field's value. +func (s *DescribeImageScanFindingsInput) SetImageId(v *ImageIdentifier) *DescribeImageScanFindingsInput { + s.ImageId = v + return s +} - // The filter key and value with which to filter your DescribeImages results. +// SetMaxResults sets the MaxResults field's value. +func (s *DescribeImageScanFindingsInput) SetMaxResults(v int64) *DescribeImageScanFindingsInput { + s.MaxResults = &v + return s +} + +// SetNextToken sets the NextToken field's value. +func (s *DescribeImageScanFindingsInput) SetNextToken(v string) *DescribeImageScanFindingsInput { + s.NextToken = &v + return s +} + +// SetRegistryId sets the RegistryId field's value. +func (s *DescribeImageScanFindingsInput) SetRegistryId(v string) *DescribeImageScanFindingsInput { + s.RegistryId = &v + return s +} + +// SetRepositoryName sets the RepositoryName field's value. +func (s *DescribeImageScanFindingsInput) SetRepositoryName(v string) *DescribeImageScanFindingsInput { + s.RepositoryName = &v + return s +} + +type DescribeImageScanFindingsOutput struct { + _ struct{} `type:"structure"` + + // An object with identifying information for an Amazon ECR image. + ImageId *ImageIdentifier `locationName:"imageId" type:"structure"` + + // The information contained in the image scan findings. + ImageScanFindings *ImageScanFindings `locationName:"imageScanFindings" type:"structure"` + + // The current state of the scan. + ImageScanStatus *ImageScanStatus `locationName:"imageScanStatus" type:"structure"` + + // The nextToken value to include in a future DescribeImageScanFindings request. + // When the results of a DescribeImageScanFindings request exceed maxResults, + // this value can be used to retrieve the next page of results. This value is + // null when there are no more results to return. + NextToken *string `locationName:"nextToken" type:"string"` + + // The registry ID associated with the request. + RegistryId *string `locationName:"registryId" type:"string"` + + // The repository name associated with the request. + RepositoryName *string `locationName:"repositoryName" min:"2" type:"string"` +} + +// String returns the string representation +func (s DescribeImageScanFindingsOutput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s DescribeImageScanFindingsOutput) GoString() string { + return s.String() +} + +// SetImageId sets the ImageId field's value. +func (s *DescribeImageScanFindingsOutput) SetImageId(v *ImageIdentifier) *DescribeImageScanFindingsOutput { + s.ImageId = v + return s +} + +// SetImageScanFindings sets the ImageScanFindings field's value. +func (s *DescribeImageScanFindingsOutput) SetImageScanFindings(v *ImageScanFindings) *DescribeImageScanFindingsOutput { + s.ImageScanFindings = v + return s +} + +// SetImageScanStatus sets the ImageScanStatus field's value. +func (s *DescribeImageScanFindingsOutput) SetImageScanStatus(v *ImageScanStatus) *DescribeImageScanFindingsOutput { + s.ImageScanStatus = v + return s +} + +// SetNextToken sets the NextToken field's value. +func (s *DescribeImageScanFindingsOutput) SetNextToken(v string) *DescribeImageScanFindingsOutput { + s.NextToken = &v + return s +} + +// SetRegistryId sets the RegistryId field's value. +func (s *DescribeImageScanFindingsOutput) SetRegistryId(v string) *DescribeImageScanFindingsOutput { + s.RegistryId = &v + return s +} + +// SetRepositoryName sets the RepositoryName field's value. +func (s *DescribeImageScanFindingsOutput) SetRepositoryName(v string) *DescribeImageScanFindingsOutput { + s.RepositoryName = &v + return s +} + +// An object representing a filter on a DescribeImages operation. +type DescribeImagesFilter struct { + _ struct{} `type:"structure"` + + // The tag status with which to filter your DescribeImages results. You can + // filter results based on whether they are TAGGED or UNTAGGED. + TagStatus *string `locationName:"tagStatus" type:"string" enum:"TagStatus"` +} + +// String returns the string representation +func (s DescribeImagesFilter) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s DescribeImagesFilter) GoString() string { + return s.String() +} + +// SetTagStatus sets the TagStatus field's value. +func (s *DescribeImagesFilter) SetTagStatus(v string) *DescribeImagesFilter { + s.TagStatus = &v + return s +} + +type DescribeImagesInput struct { + _ struct{} `type:"structure"` + + // The filter key and value with which to filter your DescribeImages results. Filter *DescribeImagesFilter `locationName:"filter" type:"structure"` // The list of image IDs for the requested repository. @@ -3119,7 +4200,7 @@ type DescribeImagesInput struct { // results in a single page along with a nextToken response element. The remaining // results of the initial request can be seen by sending another DescribeImages // request with the returned nextToken value. This value can be between 1 and - // 100. If this parameter is not used, then DescribeImages returns up to 100 + // 1000. If this parameter is not used, then DescribeImages returns up to 100 // results and a nextToken value, if applicable. This option cannot be used // when you specify images with imageIds. MaxResults *int64 `locationName:"maxResults" min:"1" type:"integer"` @@ -3136,8 +4217,7 @@ type DescribeImagesInput struct { // registry is assumed. RegistryId *string `locationName:"registryId" type:"string"` - // A list of repositories to describe. If this parameter is omitted, then all - // repositories in a registry are described. + // The repository that contains the images to describe. // // RepositoryName is a required field RepositoryName *string `locationName:"repositoryName" min:"2" type:"string" required:"true"` @@ -3168,6 +4248,16 @@ func (s *DescribeImagesInput) Validate() error { if s.RepositoryName != nil && len(*s.RepositoryName) < 2 { invalidParams.Add(request.NewErrParamMinLen("RepositoryName", 2)) } + if s.ImageIds != nil { + for i, v := range s.ImageIds { + if v == nil { + continue + } + if err := v.Validate(); err != nil { + invalidParams.AddNested(fmt.Sprintf("%s[%v]", "ImageIds", i), err.(request.ErrInvalidParams)) + } + } + } if invalidParams.Len() > 0 { return invalidParams @@ -3254,7 +4344,7 @@ type DescribeRepositoriesInput struct { // returns maxResults results in a single page along with a nextToken response // element. The remaining results of the initial request can be seen by sending // another DescribeRepositories request with the returned nextToken value. This - // value can be between 1 and 100. If this parameter is not used, then DescribeRepositories + // value can be between 1 and 1000. If this parameter is not used, then DescribeRepositories // returns up to 100 results and a nextToken value, if applicable. This option // cannot be used when you specify repositories with repositoryNames. MaxResults *int64 `locationName:"maxResults" min:"1" type:"integer"` @@ -3365,11 +4455,68 @@ func (s *DescribeRepositoriesOutput) SetRepositories(v []*Repository) *DescribeR return s } +// The specified layer upload does not contain any layer parts. +type EmptyUploadException struct { + _ struct{} `type:"structure"` + respMetadata protocol.ResponseMetadata + + // The error message associated with the exception. + Message_ *string `locationName:"message" type:"string"` +} + +// String returns the string representation +func (s EmptyUploadException) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s EmptyUploadException) GoString() string { + return s.String() +} + +func newErrorEmptyUploadException(v protocol.ResponseMetadata) error { + return &EmptyUploadException{ + respMetadata: v, + } +} + +// Code returns the exception type name. +func (s EmptyUploadException) Code() string { + return "EmptyUploadException" +} + +// Message returns the exception's message. +func (s EmptyUploadException) Message() string { + if s.Message_ != nil { + return *s.Message_ + } + return "" +} + +// OrigErr always returns nil, satisfies awserr.Error interface. +func (s EmptyUploadException) OrigErr() error { + return nil +} + +func (s EmptyUploadException) Error() string { + return fmt.Sprintf("%s: %s", s.Code(), s.Message()) +} + +// Status code returns the HTTP status code for the request's response error. +func (s EmptyUploadException) StatusCode() int { + return s.respMetadata.StatusCode +} + +// RequestID returns the service's response RequestID for request. +func (s EmptyUploadException) RequestID() string { + return s.respMetadata.RequestID +} + type GetAuthorizationTokenInput struct { _ struct{} `type:"structure"` // A list of AWS account IDs that are associated with the registries for which - // to get authorization tokens. If you do not specify a registry, the default + // to get AuthorizationData objects. If you do not specify a registry, the default // registry is assumed. RegistryIds []*string `locationName:"registryIds" min:"1" type:"list"` } @@ -3579,7 +4726,7 @@ type GetLifecyclePolicyOutput struct { _ struct{} `type:"structure"` // The time stamp of the last time that the lifecycle policy was run. - LastEvaluatedAt *time.Time `locationName:"lastEvaluatedAt" type:"timestamp" timestampFormat:"unix"` + LastEvaluatedAt *time.Time `locationName:"lastEvaluatedAt" type:"timestamp"` // The JSON lifecycle policy text. LifecyclePolicyText *string `locationName:"lifecyclePolicyText" min:"100" type:"string"` @@ -3636,22 +4783,21 @@ type GetLifecyclePolicyPreviewInput struct { ImageIds []*ImageIdentifier `locationName:"imageIds" min:"1" type:"list"` // The maximum number of repository results returned by GetLifecyclePolicyPreviewRequest - // in
 paginated output. When this parameter is used, GetLifecyclePolicyPreviewRequest - // only returns
 maxResults results in a single page along with a nextToken - // response element. The remaining results of the initial request can be seen - // by sending
 another GetLifecyclePolicyPreviewRequest request with the returned - // nextToken
 value. This value can be between 1 and 100. If this
 parameter - // is not used, then GetLifecyclePolicyPreviewRequest returns up to
 100 results - // and a nextToken value, if
 applicable. This option cannot be used when you - // specify images with imageIds. + // in paginated output. When this parameter is used, GetLifecyclePolicyPreviewRequest + // only returns maxResults results in a single page along with a nextToken response + // element. The remaining results of the initial request can be seen by sending + // another GetLifecyclePolicyPreviewRequest request with the returned nextToken + // value. This value can be between 1 and 1000. If this parameter is not used, + // then GetLifecyclePolicyPreviewRequest returns up to 100 results and a nextToken + // value, if applicable. This option cannot be used when you specify images + // with imageIds. MaxResults *int64 `locationName:"maxResults" min:"1" type:"integer"` - // The nextToken value returned from a previous paginated
 GetLifecyclePolicyPreviewRequest - // request where maxResults was used and the
 results exceeded the value of - // that parameter. Pagination continues from the end of the
 previous results - // that returned the nextToken value. This value is
 null when there are no - // more results to return. This option cannot be used when you specify images - // with imageIds. + // The nextToken value returned from a previous paginated GetLifecyclePolicyPreviewRequest + // request where maxResults was used and the results exceeded the value of that + // parameter. Pagination continues from the end of the previous results that + // returned the nextToken value. This value is null when there are no more results + // to return. This option cannot be used when you specify images with imageIds. NextToken *string `locationName:"nextToken" type:"string"` // The AWS account ID associated with the registry that contains the repository. @@ -3689,6 +4835,16 @@ func (s *GetLifecyclePolicyPreviewInput) Validate() error { if s.RepositoryName != nil && len(*s.RepositoryName) < 2 { invalidParams.Add(request.NewErrParamMinLen("RepositoryName", 2)) } + if s.ImageIds != nil { + for i, v := range s.ImageIds { + if v == nil { + continue + } + if err := v.Validate(); err != nil { + invalidParams.AddNested(fmt.Sprintf("%s[%v]", "ImageIds", i), err.(request.ErrInvalidParams)) + } + } + } if invalidParams.Len() > 0 { return invalidParams @@ -3912,7 +5068,7 @@ type Image struct { ImageId *ImageIdentifier `locationName:"imageId" type:"structure"` // The image manifest associated with the image. - ImageManifest *string `locationName:"imageManifest" type:"string"` + ImageManifest *string `locationName:"imageManifest" min:"1" type:"string"` // The AWS account ID associated with the registry containing the image. RegistryId *string `locationName:"registryId" type:"string"` @@ -3955,6 +5111,64 @@ func (s *Image) SetRepositoryName(v string) *Image { return s } +// The specified image has already been pushed, and there were no changes to +// the manifest or image tag after the last push. +type ImageAlreadyExistsException struct { + _ struct{} `type:"structure"` + respMetadata protocol.ResponseMetadata + + // The error message associated with the exception. + Message_ *string `locationName:"message" type:"string"` +} + +// String returns the string representation +func (s ImageAlreadyExistsException) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s ImageAlreadyExistsException) GoString() string { + return s.String() +} + +func newErrorImageAlreadyExistsException(v protocol.ResponseMetadata) error { + return &ImageAlreadyExistsException{ + respMetadata: v, + } +} + +// Code returns the exception type name. +func (s ImageAlreadyExistsException) Code() string { + return "ImageAlreadyExistsException" +} + +// Message returns the exception's message. +func (s ImageAlreadyExistsException) Message() string { + if s.Message_ != nil { + return *s.Message_ + } + return "" +} + +// OrigErr always returns nil, satisfies awserr.Error interface. +func (s ImageAlreadyExistsException) OrigErr() error { + return nil +} + +func (s ImageAlreadyExistsException) Error() string { + return fmt.Sprintf("%s: %s", s.Code(), s.Message()) +} + +// Status code returns the HTTP status code for the request's response error. +func (s ImageAlreadyExistsException) StatusCode() int { + return s.respMetadata.StatusCode +} + +// RequestID returns the service's response RequestID for request. +func (s ImageAlreadyExistsException) RequestID() string { + return s.respMetadata.RequestID +} + // An object that describes an image returned by a DescribeImages operation. type ImageDetail struct { _ struct{} `type:"structure"` @@ -3964,7 +5178,13 @@ type ImageDetail struct { // The date and time, expressed in standard JavaScript date format, at which // the current image was pushed to the repository. - ImagePushedAt *time.Time `locationName:"imagePushedAt" type:"timestamp" timestampFormat:"unix"` + ImagePushedAt *time.Time `locationName:"imagePushedAt" type:"timestamp"` + + // A summary of the last completed image scan. + ImageScanFindingsSummary *ImageScanFindingsSummary `locationName:"imageScanFindingsSummary" type:"structure"` + + // The current state of the scan. + ImageScanStatus *ImageScanStatus `locationName:"imageScanStatus" type:"structure"` // The size, in bytes, of the image in the repository. // @@ -4006,6 +5226,18 @@ func (s *ImageDetail) SetImagePushedAt(v time.Time) *ImageDetail { return s } +// SetImageScanFindingsSummary sets the ImageScanFindingsSummary field's value. +func (s *ImageDetail) SetImageScanFindingsSummary(v *ImageScanFindingsSummary) *ImageDetail { + s.ImageScanFindingsSummary = v + return s +} + +// SetImageScanStatus sets the ImageScanStatus field's value. +func (s *ImageDetail) SetImageScanStatus(v *ImageScanStatus) *ImageDetail { + s.ImageScanStatus = v + return s +} + // SetImageSizeInBytes sets the ImageSizeInBytes field's value. func (s *ImageDetail) SetImageSizeInBytes(v int64) *ImageDetail { s.ImageSizeInBytes = &v @@ -4080,7 +5312,7 @@ type ImageIdentifier struct { ImageDigest *string `locationName:"imageDigest" type:"string"` // The tag used for the image. - ImageTag *string `locationName:"imageTag" type:"string"` + ImageTag *string `locationName:"imageTag" min:"1" type:"string"` } // String returns the string representation @@ -4093,6 +5325,19 @@ func (s ImageIdentifier) GoString() string { return s.String() } +// Validate inspects the fields of the type to determine if they are valid. +func (s *ImageIdentifier) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "ImageIdentifier"} + if s.ImageTag != nil && len(*s.ImageTag) < 1 { + invalidParams.Add(request.NewErrParamMinLen("ImageTag", 1)) + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + // SetImageDigest sets the ImageDigest field's value. func (s *ImageIdentifier) SetImageDigest(v string) *ImageIdentifier { s.ImageDigest = &v @@ -4105,394 +5350,359 @@ func (s *ImageIdentifier) SetImageTag(v string) *ImageIdentifier { return s } -type InitiateLayerUploadInput struct { - _ struct{} `type:"structure"` - - // The AWS account ID associated with the registry to which you intend to upload - // layers. If you do not specify a registry, the default registry is assumed. - RegistryId *string `locationName:"registryId" type:"string"` +// The image requested does not exist in the specified repository. +type ImageNotFoundException struct { + _ struct{} `type:"structure"` + respMetadata protocol.ResponseMetadata - // The name of the repository to which you intend to upload layers. - // - // RepositoryName is a required field - RepositoryName *string `locationName:"repositoryName" min:"2" type:"string" required:"true"` + Message_ *string `locationName:"message" type:"string"` } // String returns the string representation -func (s InitiateLayerUploadInput) String() string { +func (s ImageNotFoundException) String() string { return awsutil.Prettify(s) } // GoString returns the string representation -func (s InitiateLayerUploadInput) GoString() string { +func (s ImageNotFoundException) GoString() string { return s.String() } -// Validate inspects the fields of the type to determine if they are valid. -func (s *InitiateLayerUploadInput) Validate() error { - invalidParams := request.ErrInvalidParams{Context: "InitiateLayerUploadInput"} - if s.RepositoryName == nil { - invalidParams.Add(request.NewErrParamRequired("RepositoryName")) - } - if s.RepositoryName != nil && len(*s.RepositoryName) < 2 { - invalidParams.Add(request.NewErrParamMinLen("RepositoryName", 2)) +func newErrorImageNotFoundException(v protocol.ResponseMetadata) error { + return &ImageNotFoundException{ + respMetadata: v, } +} - if invalidParams.Len() > 0 { - return invalidParams +// Code returns the exception type name. +func (s ImageNotFoundException) Code() string { + return "ImageNotFoundException" +} + +// Message returns the exception's message. +func (s ImageNotFoundException) Message() string { + if s.Message_ != nil { + return *s.Message_ } + return "" +} + +// OrigErr always returns nil, satisfies awserr.Error interface. +func (s ImageNotFoundException) OrigErr() error { return nil } -// SetRegistryId sets the RegistryId field's value. -func (s *InitiateLayerUploadInput) SetRegistryId(v string) *InitiateLayerUploadInput { - s.RegistryId = &v - return s +func (s ImageNotFoundException) Error() string { + return fmt.Sprintf("%s: %s", s.Code(), s.Message()) } -// SetRepositoryName sets the RepositoryName field's value. -func (s *InitiateLayerUploadInput) SetRepositoryName(v string) *InitiateLayerUploadInput { - s.RepositoryName = &v - return s +// Status code returns the HTTP status code for the request's response error. +func (s ImageNotFoundException) StatusCode() int { + return s.respMetadata.StatusCode } -type InitiateLayerUploadOutput struct { +// RequestID returns the service's response RequestID for request. +func (s ImageNotFoundException) RequestID() string { + return s.respMetadata.RequestID +} + +// Contains information about an image scan finding. +type ImageScanFinding struct { _ struct{} `type:"structure"` - // The size, in bytes, that Amazon ECR expects future layer part uploads to - // be. - PartSize *int64 `locationName:"partSize" type:"long"` + // A collection of attributes of the host from which the finding is generated. + Attributes []*Attribute `locationName:"attributes" type:"list"` - // The upload ID for the layer upload. This parameter is passed to further UploadLayerPart - // and CompleteLayerUpload operations. - UploadId *string `locationName:"uploadId" type:"string"` + // The description of the finding. + Description *string `locationName:"description" type:"string"` + + // The name associated with the finding, usually a CVE number. + Name *string `locationName:"name" type:"string"` + + // The finding severity. + Severity *string `locationName:"severity" type:"string" enum:"FindingSeverity"` + + // A link containing additional details about the security vulnerability. + Uri *string `locationName:"uri" type:"string"` } // String returns the string representation -func (s InitiateLayerUploadOutput) String() string { +func (s ImageScanFinding) String() string { return awsutil.Prettify(s) } // GoString returns the string representation -func (s InitiateLayerUploadOutput) GoString() string { +func (s ImageScanFinding) GoString() string { return s.String() } -// SetPartSize sets the PartSize field's value. -func (s *InitiateLayerUploadOutput) SetPartSize(v int64) *InitiateLayerUploadOutput { - s.PartSize = &v +// SetAttributes sets the Attributes field's value. +func (s *ImageScanFinding) SetAttributes(v []*Attribute) *ImageScanFinding { + s.Attributes = v return s } -// SetUploadId sets the UploadId field's value. -func (s *InitiateLayerUploadOutput) SetUploadId(v string) *InitiateLayerUploadOutput { - s.UploadId = &v +// SetDescription sets the Description field's value. +func (s *ImageScanFinding) SetDescription(v string) *ImageScanFinding { + s.Description = &v return s } -// An object representing an Amazon ECR image layer. -type Layer struct { - _ struct{} `type:"structure"` +// SetName sets the Name field's value. +func (s *ImageScanFinding) SetName(v string) *ImageScanFinding { + s.Name = &v + return s +} - // The availability status of the image layer. - LayerAvailability *string `locationName:"layerAvailability" type:"string" enum:"LayerAvailability"` +// SetSeverity sets the Severity field's value. +func (s *ImageScanFinding) SetSeverity(v string) *ImageScanFinding { + s.Severity = &v + return s +} - // The sha256 digest of the image layer. - LayerDigest *string `locationName:"layerDigest" type:"string"` +// SetUri sets the Uri field's value. +func (s *ImageScanFinding) SetUri(v string) *ImageScanFinding { + s.Uri = &v + return s +} - // The size, in bytes, of the image layer. - LayerSize *int64 `locationName:"layerSize" type:"long"` +// The details of an image scan. +type ImageScanFindings struct { + _ struct{} `type:"structure"` - // The media type of the layer, such as application/vnd.docker.image.rootfs.diff.tar.gzip - // or application/vnd.oci.image.layer.v1.tar+gzip. - MediaType *string `locationName:"mediaType" type:"string"` + // The image vulnerability counts, sorted by severity. + FindingSeverityCounts map[string]*int64 `locationName:"findingSeverityCounts" type:"map"` + + // The findings from the image scan. + Findings []*ImageScanFinding `locationName:"findings" type:"list"` + + // The time of the last completed image scan. + ImageScanCompletedAt *time.Time `locationName:"imageScanCompletedAt" type:"timestamp"` + + // The time when the vulnerability data was last scanned. + VulnerabilitySourceUpdatedAt *time.Time `locationName:"vulnerabilitySourceUpdatedAt" type:"timestamp"` } // String returns the string representation -func (s Layer) String() string { +func (s ImageScanFindings) String() string { return awsutil.Prettify(s) } // GoString returns the string representation -func (s Layer) GoString() string { +func (s ImageScanFindings) GoString() string { return s.String() } -// SetLayerAvailability sets the LayerAvailability field's value. -func (s *Layer) SetLayerAvailability(v string) *Layer { - s.LayerAvailability = &v +// SetFindingSeverityCounts sets the FindingSeverityCounts field's value. +func (s *ImageScanFindings) SetFindingSeverityCounts(v map[string]*int64) *ImageScanFindings { + s.FindingSeverityCounts = v return s } -// SetLayerDigest sets the LayerDigest field's value. -func (s *Layer) SetLayerDigest(v string) *Layer { - s.LayerDigest = &v +// SetFindings sets the Findings field's value. +func (s *ImageScanFindings) SetFindings(v []*ImageScanFinding) *ImageScanFindings { + s.Findings = v return s } -// SetLayerSize sets the LayerSize field's value. -func (s *Layer) SetLayerSize(v int64) *Layer { - s.LayerSize = &v +// SetImageScanCompletedAt sets the ImageScanCompletedAt field's value. +func (s *ImageScanFindings) SetImageScanCompletedAt(v time.Time) *ImageScanFindings { + s.ImageScanCompletedAt = &v return s } -// SetMediaType sets the MediaType field's value. -func (s *Layer) SetMediaType(v string) *Layer { - s.MediaType = &v +// SetVulnerabilitySourceUpdatedAt sets the VulnerabilitySourceUpdatedAt field's value. +func (s *ImageScanFindings) SetVulnerabilitySourceUpdatedAt(v time.Time) *ImageScanFindings { + s.VulnerabilitySourceUpdatedAt = &v return s } -// An object representing an Amazon ECR image layer failure. -type LayerFailure struct { +// A summary of the last completed image scan. +type ImageScanFindingsSummary struct { _ struct{} `type:"structure"` - // The failure code associated with the failure. - FailureCode *string `locationName:"failureCode" type:"string" enum:"LayerFailureCode"` + // The image vulnerability counts, sorted by severity. + FindingSeverityCounts map[string]*int64 `locationName:"findingSeverityCounts" type:"map"` - // The reason for the failure. - FailureReason *string `locationName:"failureReason" type:"string"` + // The time of the last completed image scan. + ImageScanCompletedAt *time.Time `locationName:"imageScanCompletedAt" type:"timestamp"` - // The layer digest associated with the failure. - LayerDigest *string `locationName:"layerDigest" type:"string"` + // The time when the vulnerability data was last scanned. + VulnerabilitySourceUpdatedAt *time.Time `locationName:"vulnerabilitySourceUpdatedAt" type:"timestamp"` } // String returns the string representation -func (s LayerFailure) String() string { +func (s ImageScanFindingsSummary) String() string { return awsutil.Prettify(s) } // GoString returns the string representation -func (s LayerFailure) GoString() string { +func (s ImageScanFindingsSummary) GoString() string { return s.String() } -// SetFailureCode sets the FailureCode field's value. -func (s *LayerFailure) SetFailureCode(v string) *LayerFailure { - s.FailureCode = &v - return s -} - -// SetFailureReason sets the FailureReason field's value. -func (s *LayerFailure) SetFailureReason(v string) *LayerFailure { - s.FailureReason = &v +// SetFindingSeverityCounts sets the FindingSeverityCounts field's value. +func (s *ImageScanFindingsSummary) SetFindingSeverityCounts(v map[string]*int64) *ImageScanFindingsSummary { + s.FindingSeverityCounts = v return s } -// SetLayerDigest sets the LayerDigest field's value. -func (s *LayerFailure) SetLayerDigest(v string) *LayerFailure { - s.LayerDigest = &v +// SetImageScanCompletedAt sets the ImageScanCompletedAt field's value. +func (s *ImageScanFindingsSummary) SetImageScanCompletedAt(v time.Time) *ImageScanFindingsSummary { + s.ImageScanCompletedAt = &v return s } -// The filter for the lifecycle policy preview. -type LifecyclePolicyPreviewFilter struct { - _ struct{} `type:"structure"` - - // The tag status of the image. - TagStatus *string `locationName:"tagStatus" type:"string" enum:"TagStatus"` -} - -// String returns the string representation -func (s LifecyclePolicyPreviewFilter) String() string { - return awsutil.Prettify(s) -} - -// GoString returns the string representation -func (s LifecyclePolicyPreviewFilter) GoString() string { - return s.String() -} - -// SetTagStatus sets the TagStatus field's value. -func (s *LifecyclePolicyPreviewFilter) SetTagStatus(v string) *LifecyclePolicyPreviewFilter { - s.TagStatus = &v +// SetVulnerabilitySourceUpdatedAt sets the VulnerabilitySourceUpdatedAt field's value. +func (s *ImageScanFindingsSummary) SetVulnerabilitySourceUpdatedAt(v time.Time) *ImageScanFindingsSummary { + s.VulnerabilitySourceUpdatedAt = &v return s } -// The result of the lifecycle policy preview. -type LifecyclePolicyPreviewResult struct { +// The current status of an image scan. +type ImageScanStatus struct { _ struct{} `type:"structure"` - // The type of action to be taken. - Action *LifecyclePolicyRuleAction `locationName:"action" type:"structure"` - - // The priority of the applied rule. - AppliedRulePriority *int64 `locationName:"appliedRulePriority" min:"1" type:"integer"` - - // The sha256 digest of the image manifest. - ImageDigest *string `locationName:"imageDigest" type:"string"` - - // The date and time, expressed in standard JavaScript date format, at which - // the current image was pushed to the repository. - ImagePushedAt *time.Time `locationName:"imagePushedAt" type:"timestamp" timestampFormat:"unix"` + // The description of the image scan status. + Description *string `locationName:"description" type:"string"` - // The list of tags associated with this image. - ImageTags []*string `locationName:"imageTags" type:"list"` + // The current state of an image scan. + Status *string `locationName:"status" type:"string" enum:"ScanStatus"` } // String returns the string representation -func (s LifecyclePolicyPreviewResult) String() string { +func (s ImageScanStatus) String() string { return awsutil.Prettify(s) } // GoString returns the string representation -func (s LifecyclePolicyPreviewResult) GoString() string { +func (s ImageScanStatus) GoString() string { return s.String() } -// SetAction sets the Action field's value. -func (s *LifecyclePolicyPreviewResult) SetAction(v *LifecyclePolicyRuleAction) *LifecyclePolicyPreviewResult { - s.Action = v - return s -} - -// SetAppliedRulePriority sets the AppliedRulePriority field's value. -func (s *LifecyclePolicyPreviewResult) SetAppliedRulePriority(v int64) *LifecyclePolicyPreviewResult { - s.AppliedRulePriority = &v - return s -} - -// SetImageDigest sets the ImageDigest field's value. -func (s *LifecyclePolicyPreviewResult) SetImageDigest(v string) *LifecyclePolicyPreviewResult { - s.ImageDigest = &v - return s -} - -// SetImagePushedAt sets the ImagePushedAt field's value. -func (s *LifecyclePolicyPreviewResult) SetImagePushedAt(v time.Time) *LifecyclePolicyPreviewResult { - s.ImagePushedAt = &v +// SetDescription sets the Description field's value. +func (s *ImageScanStatus) SetDescription(v string) *ImageScanStatus { + s.Description = &v return s } -// SetImageTags sets the ImageTags field's value. -func (s *LifecyclePolicyPreviewResult) SetImageTags(v []*string) *LifecyclePolicyPreviewResult { - s.ImageTags = v +// SetStatus sets the Status field's value. +func (s *ImageScanStatus) SetStatus(v string) *ImageScanStatus { + s.Status = &v return s } -// The summary of the lifecycle policy preview request. -type LifecyclePolicyPreviewSummary struct { +// The image scanning configuration for a repository. +type ImageScanningConfiguration struct { _ struct{} `type:"structure"` - // The number of expiring images. - ExpiringImageTotalCount *int64 `locationName:"expiringImageTotalCount" type:"integer"` + // The setting that determines whether images are scanned after being pushed + // to a repository. If set to true, images will be scanned after being pushed. + // If this parameter is not specified, it will default to false and images will + // not be scanned unless a scan is manually started with the StartImageScan + // API. + ScanOnPush *bool `locationName:"scanOnPush" type:"boolean"` } // String returns the string representation -func (s LifecyclePolicyPreviewSummary) String() string { +func (s ImageScanningConfiguration) String() string { return awsutil.Prettify(s) } // GoString returns the string representation -func (s LifecyclePolicyPreviewSummary) GoString() string { +func (s ImageScanningConfiguration) GoString() string { return s.String() } -// SetExpiringImageTotalCount sets the ExpiringImageTotalCount field's value. -func (s *LifecyclePolicyPreviewSummary) SetExpiringImageTotalCount(v int64) *LifecyclePolicyPreviewSummary { - s.ExpiringImageTotalCount = &v +// SetScanOnPush sets the ScanOnPush field's value. +func (s *ImageScanningConfiguration) SetScanOnPush(v bool) *ImageScanningConfiguration { + s.ScanOnPush = &v return s } -// The type of action to be taken. -type LifecyclePolicyRuleAction struct { - _ struct{} `type:"structure"` +// The specified image is tagged with a tag that already exists. The repository +// is configured for tag immutability. +type ImageTagAlreadyExistsException struct { + _ struct{} `type:"structure"` + respMetadata protocol.ResponseMetadata - // The type of action to be taken. - Type *string `locationName:"type" type:"string" enum:"ImageActionType"` + Message_ *string `locationName:"message" type:"string"` } // String returns the string representation -func (s LifecyclePolicyRuleAction) String() string { +func (s ImageTagAlreadyExistsException) String() string { return awsutil.Prettify(s) } // GoString returns the string representation -func (s LifecyclePolicyRuleAction) GoString() string { +func (s ImageTagAlreadyExistsException) GoString() string { return s.String() } -// SetType sets the Type field's value. -func (s *LifecyclePolicyRuleAction) SetType(v string) *LifecyclePolicyRuleAction { - s.Type = &v - return s +func newErrorImageTagAlreadyExistsException(v protocol.ResponseMetadata) error { + return &ImageTagAlreadyExistsException{ + respMetadata: v, + } } -// An object representing a filter on a ListImages operation. -type ListImagesFilter struct { - _ struct{} `type:"structure"` - - // The tag status with which to filter your ListImages results. You can filter - // results based on whether they are TAGGED or UNTAGGED. - TagStatus *string `locationName:"tagStatus" type:"string" enum:"TagStatus"` +// Code returns the exception type name. +func (s ImageTagAlreadyExistsException) Code() string { + return "ImageTagAlreadyExistsException" } -// String returns the string representation -func (s ListImagesFilter) String() string { - return awsutil.Prettify(s) +// Message returns the exception's message. +func (s ImageTagAlreadyExistsException) Message() string { + if s.Message_ != nil { + return *s.Message_ + } + return "" } -// GoString returns the string representation -func (s ListImagesFilter) GoString() string { - return s.String() +// OrigErr always returns nil, satisfies awserr.Error interface. +func (s ImageTagAlreadyExistsException) OrigErr() error { + return nil } -// SetTagStatus sets the TagStatus field's value. -func (s *ListImagesFilter) SetTagStatus(v string) *ListImagesFilter { - s.TagStatus = &v - return s +func (s ImageTagAlreadyExistsException) Error() string { + return fmt.Sprintf("%s: %s", s.Code(), s.Message()) } -type ListImagesInput struct { - _ struct{} `type:"structure"` - - // The filter key and value with which to filter your ListImages results. - Filter *ListImagesFilter `locationName:"filter" type:"structure"` +// Status code returns the HTTP status code for the request's response error. +func (s ImageTagAlreadyExistsException) StatusCode() int { + return s.respMetadata.StatusCode +} - // The maximum number of image results returned by ListImages in paginated output. - // When this parameter is used, ListImages only returns maxResults results in - // a single page along with a nextToken response element. The remaining results - // of the initial request can be seen by sending another ListImages request - // with the returned nextToken value. This value can be between 1 and 100. If - // this parameter is not used, then ListImages returns up to 100 results and - // a nextToken value, if applicable. - MaxResults *int64 `locationName:"maxResults" min:"1" type:"integer"` +// RequestID returns the service's response RequestID for request. +func (s ImageTagAlreadyExistsException) RequestID() string { + return s.respMetadata.RequestID +} - // The nextToken value returned from a previous paginated ListImages request - // where maxResults was used and the results exceeded the value of that parameter. - // Pagination continues from the end of the previous results that returned the - // nextToken value. This value is null when there are no more results to return. - // - // This token should be treated as an opaque identifier that is only used to - // retrieve the next items in a list and not for other programmatic purposes. - NextToken *string `locationName:"nextToken" type:"string"` +type InitiateLayerUploadInput struct { + _ struct{} `type:"structure"` - // The AWS account ID associated with the registry that contains the repository - // in which to list images. If you do not specify a registry, the default registry - // is assumed. + // The AWS account ID associated with the registry to which you intend to upload + // layers. If you do not specify a registry, the default registry is assumed. RegistryId *string `locationName:"registryId" type:"string"` - // The repository with image IDs to be listed. + // The name of the repository to which you intend to upload layers. // // RepositoryName is a required field RepositoryName *string `locationName:"repositoryName" min:"2" type:"string" required:"true"` } // String returns the string representation -func (s ListImagesInput) String() string { +func (s InitiateLayerUploadInput) String() string { return awsutil.Prettify(s) } // GoString returns the string representation -func (s ListImagesInput) GoString() string { +func (s InitiateLayerUploadInput) GoString() string { return s.String() } // Validate inspects the fields of the type to determine if they are valid. -func (s *ListImagesInput) Validate() error { - invalidParams := request.ErrInvalidParams{Context: "ListImagesInput"} - if s.MaxResults != nil && *s.MaxResults < 1 { - invalidParams.Add(request.NewErrParamMinValue("MaxResults", 1)) - } +func (s *InitiateLayerUploadInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "InitiateLayerUploadInput"} if s.RepositoryName == nil { invalidParams.Add(request.NewErrParamRequired("RepositoryName")) } @@ -4506,381 +5716,2212 @@ func (s *ListImagesInput) Validate() error { return nil } -// SetFilter sets the Filter field's value. -func (s *ListImagesInput) SetFilter(v *ListImagesFilter) *ListImagesInput { - s.Filter = v - return s -} - -// SetMaxResults sets the MaxResults field's value. -func (s *ListImagesInput) SetMaxResults(v int64) *ListImagesInput { - s.MaxResults = &v - return s -} - -// SetNextToken sets the NextToken field's value. -func (s *ListImagesInput) SetNextToken(v string) *ListImagesInput { - s.NextToken = &v - return s -} - // SetRegistryId sets the RegistryId field's value. -func (s *ListImagesInput) SetRegistryId(v string) *ListImagesInput { +func (s *InitiateLayerUploadInput) SetRegistryId(v string) *InitiateLayerUploadInput { s.RegistryId = &v return s } // SetRepositoryName sets the RepositoryName field's value. -func (s *ListImagesInput) SetRepositoryName(v string) *ListImagesInput { +func (s *InitiateLayerUploadInput) SetRepositoryName(v string) *InitiateLayerUploadInput { s.RepositoryName = &v return s } -type ListImagesOutput struct { +type InitiateLayerUploadOutput struct { _ struct{} `type:"structure"` - // The list of image IDs for the requested repository. - ImageIds []*ImageIdentifier `locationName:"imageIds" min:"1" type:"list"` + // The size, in bytes, that Amazon ECR expects future layer part uploads to + // be. + PartSize *int64 `locationName:"partSize" type:"long"` - // The nextToken value to include in a future ListImages request. When the results - // of a ListImages request exceed maxResults, this value can be used to retrieve - // the next page of results. This value is null when there are no more results - // to return. - NextToken *string `locationName:"nextToken" type:"string"` + // The upload ID for the layer upload. This parameter is passed to further UploadLayerPart + // and CompleteLayerUpload operations. + UploadId *string `locationName:"uploadId" type:"string"` } // String returns the string representation -func (s ListImagesOutput) String() string { +func (s InitiateLayerUploadOutput) String() string { return awsutil.Prettify(s) } // GoString returns the string representation -func (s ListImagesOutput) GoString() string { +func (s InitiateLayerUploadOutput) GoString() string { return s.String() } -// SetImageIds sets the ImageIds field's value. -func (s *ListImagesOutput) SetImageIds(v []*ImageIdentifier) *ListImagesOutput { - s.ImageIds = v +// SetPartSize sets the PartSize field's value. +func (s *InitiateLayerUploadOutput) SetPartSize(v int64) *InitiateLayerUploadOutput { + s.PartSize = &v return s } -// SetNextToken sets the NextToken field's value. -func (s *ListImagesOutput) SetNextToken(v string) *ListImagesOutput { - s.NextToken = &v +// SetUploadId sets the UploadId field's value. +func (s *InitiateLayerUploadOutput) SetUploadId(v string) *InitiateLayerUploadOutput { + s.UploadId = &v return s } -type PutImageInput struct { - _ struct{} `type:"structure"` +// The layer digest calculation performed by Amazon ECR upon receipt of the +// image layer does not match the digest specified. +type InvalidLayerException struct { + _ struct{} `type:"structure"` + respMetadata protocol.ResponseMetadata - // The image manifest corresponding to the image to be uploaded. - // - // ImageManifest is a required field - ImageManifest *string `locationName:"imageManifest" type:"string" required:"true"` + // The error message associated with the exception. + Message_ *string `locationName:"message" type:"string"` +} - // The tag to associate with the image. This parameter is required for images - // that use the Docker Image Manifest V2 Schema 2 or OCI formats. - ImageTag *string `locationName:"imageTag" type:"string"` +// String returns the string representation +func (s InvalidLayerException) String() string { + return awsutil.Prettify(s) +} - // The AWS account ID associated with the registry that contains the repository - // in which to put the image. If you do not specify a registry, the default - // registry is assumed. +// GoString returns the string representation +func (s InvalidLayerException) GoString() string { + return s.String() +} + +func newErrorInvalidLayerException(v protocol.ResponseMetadata) error { + return &InvalidLayerException{ + respMetadata: v, + } +} + +// Code returns the exception type name. +func (s InvalidLayerException) Code() string { + return "InvalidLayerException" +} + +// Message returns the exception's message. +func (s InvalidLayerException) Message() string { + if s.Message_ != nil { + return *s.Message_ + } + return "" +} + +// OrigErr always returns nil, satisfies awserr.Error interface. +func (s InvalidLayerException) OrigErr() error { + return nil +} + +func (s InvalidLayerException) Error() string { + return fmt.Sprintf("%s: %s", s.Code(), s.Message()) +} + +// Status code returns the HTTP status code for the request's response error. +func (s InvalidLayerException) StatusCode() int { + return s.respMetadata.StatusCode +} + +// RequestID returns the service's response RequestID for request. +func (s InvalidLayerException) RequestID() string { + return s.respMetadata.RequestID +} + +// The layer part size is not valid, or the first byte specified is not consecutive +// to the last byte of a previous layer part upload. +type InvalidLayerPartException struct { + _ struct{} `type:"structure"` + respMetadata protocol.ResponseMetadata + + // The last valid byte received from the layer part upload that is associated + // with the exception. + LastValidByteReceived *int64 `locationName:"lastValidByteReceived" type:"long"` + + // The error message associated with the exception. + Message_ *string `locationName:"message" type:"string"` + + // The registry ID associated with the exception. + RegistryId *string `locationName:"registryId" type:"string"` + + // The repository name associated with the exception. + RepositoryName *string `locationName:"repositoryName" min:"2" type:"string"` + + // The upload ID associated with the exception. + UploadId *string `locationName:"uploadId" type:"string"` +} + +// String returns the string representation +func (s InvalidLayerPartException) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s InvalidLayerPartException) GoString() string { + return s.String() +} + +func newErrorInvalidLayerPartException(v protocol.ResponseMetadata) error { + return &InvalidLayerPartException{ + respMetadata: v, + } +} + +// Code returns the exception type name. +func (s InvalidLayerPartException) Code() string { + return "InvalidLayerPartException" +} + +// Message returns the exception's message. +func (s InvalidLayerPartException) Message() string { + if s.Message_ != nil { + return *s.Message_ + } + return "" +} + +// OrigErr always returns nil, satisfies awserr.Error interface. +func (s InvalidLayerPartException) OrigErr() error { + return nil +} + +func (s InvalidLayerPartException) Error() string { + return fmt.Sprintf("%s: %s\n%s", s.Code(), s.Message(), s.String()) +} + +// Status code returns the HTTP status code for the request's response error. +func (s InvalidLayerPartException) StatusCode() int { + return s.respMetadata.StatusCode +} + +// RequestID returns the service's response RequestID for request. +func (s InvalidLayerPartException) RequestID() string { + return s.respMetadata.RequestID +} + +// The specified parameter is invalid. Review the available parameters for the +// API request. +type InvalidParameterException struct { + _ struct{} `type:"structure"` + respMetadata protocol.ResponseMetadata + + // The error message associated with the exception. + Message_ *string `locationName:"message" type:"string"` +} + +// String returns the string representation +func (s InvalidParameterException) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s InvalidParameterException) GoString() string { + return s.String() +} + +func newErrorInvalidParameterException(v protocol.ResponseMetadata) error { + return &InvalidParameterException{ + respMetadata: v, + } +} + +// Code returns the exception type name. +func (s InvalidParameterException) Code() string { + return "InvalidParameterException" +} + +// Message returns the exception's message. +func (s InvalidParameterException) Message() string { + if s.Message_ != nil { + return *s.Message_ + } + return "" +} + +// OrigErr always returns nil, satisfies awserr.Error interface. +func (s InvalidParameterException) OrigErr() error { + return nil +} + +func (s InvalidParameterException) Error() string { + return fmt.Sprintf("%s: %s", s.Code(), s.Message()) +} + +// Status code returns the HTTP status code for the request's response error. +func (s InvalidParameterException) StatusCode() int { + return s.respMetadata.StatusCode +} + +// RequestID returns the service's response RequestID for request. +func (s InvalidParameterException) RequestID() string { + return s.respMetadata.RequestID +} + +// An invalid parameter has been specified. Tag keys can have a maximum character +// length of 128 characters, and tag values can have a maximum length of 256 +// characters. +type InvalidTagParameterException struct { + _ struct{} `type:"structure"` + respMetadata protocol.ResponseMetadata + + Message_ *string `locationName:"message" type:"string"` +} + +// String returns the string representation +func (s InvalidTagParameterException) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s InvalidTagParameterException) GoString() string { + return s.String() +} + +func newErrorInvalidTagParameterException(v protocol.ResponseMetadata) error { + return &InvalidTagParameterException{ + respMetadata: v, + } +} + +// Code returns the exception type name. +func (s InvalidTagParameterException) Code() string { + return "InvalidTagParameterException" +} + +// Message returns the exception's message. +func (s InvalidTagParameterException) Message() string { + if s.Message_ != nil { + return *s.Message_ + } + return "" +} + +// OrigErr always returns nil, satisfies awserr.Error interface. +func (s InvalidTagParameterException) OrigErr() error { + return nil +} + +func (s InvalidTagParameterException) Error() string { + return fmt.Sprintf("%s: %s", s.Code(), s.Message()) +} + +// Status code returns the HTTP status code for the request's response error. +func (s InvalidTagParameterException) StatusCode() int { + return s.respMetadata.StatusCode +} + +// RequestID returns the service's response RequestID for request. +func (s InvalidTagParameterException) RequestID() string { + return s.respMetadata.RequestID +} + +// An object representing an Amazon ECR image layer. +type Layer struct { + _ struct{} `type:"structure"` + + // The availability status of the image layer. + LayerAvailability *string `locationName:"layerAvailability" type:"string" enum:"LayerAvailability"` + + // The sha256 digest of the image layer. + LayerDigest *string `locationName:"layerDigest" type:"string"` + + // The size, in bytes, of the image layer. + LayerSize *int64 `locationName:"layerSize" type:"long"` + + // The media type of the layer, such as application/vnd.docker.image.rootfs.diff.tar.gzip + // or application/vnd.oci.image.layer.v1.tar+gzip. + MediaType *string `locationName:"mediaType" type:"string"` +} + +// String returns the string representation +func (s Layer) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s Layer) GoString() string { + return s.String() +} + +// SetLayerAvailability sets the LayerAvailability field's value. +func (s *Layer) SetLayerAvailability(v string) *Layer { + s.LayerAvailability = &v + return s +} + +// SetLayerDigest sets the LayerDigest field's value. +func (s *Layer) SetLayerDigest(v string) *Layer { + s.LayerDigest = &v + return s +} + +// SetLayerSize sets the LayerSize field's value. +func (s *Layer) SetLayerSize(v int64) *Layer { + s.LayerSize = &v + return s +} + +// SetMediaType sets the MediaType field's value. +func (s *Layer) SetMediaType(v string) *Layer { + s.MediaType = &v + return s +} + +// The image layer already exists in the associated repository. +type LayerAlreadyExistsException struct { + _ struct{} `type:"structure"` + respMetadata protocol.ResponseMetadata + + // The error message associated with the exception. + Message_ *string `locationName:"message" type:"string"` +} + +// String returns the string representation +func (s LayerAlreadyExistsException) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s LayerAlreadyExistsException) GoString() string { + return s.String() +} + +func newErrorLayerAlreadyExistsException(v protocol.ResponseMetadata) error { + return &LayerAlreadyExistsException{ + respMetadata: v, + } +} + +// Code returns the exception type name. +func (s LayerAlreadyExistsException) Code() string { + return "LayerAlreadyExistsException" +} + +// Message returns the exception's message. +func (s LayerAlreadyExistsException) Message() string { + if s.Message_ != nil { + return *s.Message_ + } + return "" +} + +// OrigErr always returns nil, satisfies awserr.Error interface. +func (s LayerAlreadyExistsException) OrigErr() error { + return nil +} + +func (s LayerAlreadyExistsException) Error() string { + return fmt.Sprintf("%s: %s", s.Code(), s.Message()) +} + +// Status code returns the HTTP status code for the request's response error. +func (s LayerAlreadyExistsException) StatusCode() int { + return s.respMetadata.StatusCode +} + +// RequestID returns the service's response RequestID for request. +func (s LayerAlreadyExistsException) RequestID() string { + return s.respMetadata.RequestID +} + +// An object representing an Amazon ECR image layer failure. +type LayerFailure struct { + _ struct{} `type:"structure"` + + // The failure code associated with the failure. + FailureCode *string `locationName:"failureCode" type:"string" enum:"LayerFailureCode"` + + // The reason for the failure. + FailureReason *string `locationName:"failureReason" type:"string"` + + // The layer digest associated with the failure. + LayerDigest *string `locationName:"layerDigest" type:"string"` +} + +// String returns the string representation +func (s LayerFailure) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s LayerFailure) GoString() string { + return s.String() +} + +// SetFailureCode sets the FailureCode field's value. +func (s *LayerFailure) SetFailureCode(v string) *LayerFailure { + s.FailureCode = &v + return s +} + +// SetFailureReason sets the FailureReason field's value. +func (s *LayerFailure) SetFailureReason(v string) *LayerFailure { + s.FailureReason = &v + return s +} + +// SetLayerDigest sets the LayerDigest field's value. +func (s *LayerFailure) SetLayerDigest(v string) *LayerFailure { + s.LayerDigest = &v + return s +} + +// The specified layer is not available because it is not associated with an +// image. Unassociated image layers may be cleaned up at any time. +type LayerInaccessibleException struct { + _ struct{} `type:"structure"` + respMetadata protocol.ResponseMetadata + + // The error message associated with the exception. + Message_ *string `locationName:"message" type:"string"` +} + +// String returns the string representation +func (s LayerInaccessibleException) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s LayerInaccessibleException) GoString() string { + return s.String() +} + +func newErrorLayerInaccessibleException(v protocol.ResponseMetadata) error { + return &LayerInaccessibleException{ + respMetadata: v, + } +} + +// Code returns the exception type name. +func (s LayerInaccessibleException) Code() string { + return "LayerInaccessibleException" +} + +// Message returns the exception's message. +func (s LayerInaccessibleException) Message() string { + if s.Message_ != nil { + return *s.Message_ + } + return "" +} + +// OrigErr always returns nil, satisfies awserr.Error interface. +func (s LayerInaccessibleException) OrigErr() error { + return nil +} + +func (s LayerInaccessibleException) Error() string { + return fmt.Sprintf("%s: %s", s.Code(), s.Message()) +} + +// Status code returns the HTTP status code for the request's response error. +func (s LayerInaccessibleException) StatusCode() int { + return s.respMetadata.StatusCode +} + +// RequestID returns the service's response RequestID for request. +func (s LayerInaccessibleException) RequestID() string { + return s.respMetadata.RequestID +} + +// Layer parts must be at least 5 MiB in size. +type LayerPartTooSmallException struct { + _ struct{} `type:"structure"` + respMetadata protocol.ResponseMetadata + + // The error message associated with the exception. + Message_ *string `locationName:"message" type:"string"` +} + +// String returns the string representation +func (s LayerPartTooSmallException) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s LayerPartTooSmallException) GoString() string { + return s.String() +} + +func newErrorLayerPartTooSmallException(v protocol.ResponseMetadata) error { + return &LayerPartTooSmallException{ + respMetadata: v, + } +} + +// Code returns the exception type name. +func (s LayerPartTooSmallException) Code() string { + return "LayerPartTooSmallException" +} + +// Message returns the exception's message. +func (s LayerPartTooSmallException) Message() string { + if s.Message_ != nil { + return *s.Message_ + } + return "" +} + +// OrigErr always returns nil, satisfies awserr.Error interface. +func (s LayerPartTooSmallException) OrigErr() error { + return nil +} + +func (s LayerPartTooSmallException) Error() string { + return fmt.Sprintf("%s: %s", s.Code(), s.Message()) +} + +// Status code returns the HTTP status code for the request's response error. +func (s LayerPartTooSmallException) StatusCode() int { + return s.respMetadata.StatusCode +} + +// RequestID returns the service's response RequestID for request. +func (s LayerPartTooSmallException) RequestID() string { + return s.respMetadata.RequestID +} + +// The specified layers could not be found, or the specified layer is not valid +// for this repository. +type LayersNotFoundException struct { + _ struct{} `type:"structure"` + respMetadata protocol.ResponseMetadata + + // The error message associated with the exception. + Message_ *string `locationName:"message" type:"string"` +} + +// String returns the string representation +func (s LayersNotFoundException) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s LayersNotFoundException) GoString() string { + return s.String() +} + +func newErrorLayersNotFoundException(v protocol.ResponseMetadata) error { + return &LayersNotFoundException{ + respMetadata: v, + } +} + +// Code returns the exception type name. +func (s LayersNotFoundException) Code() string { + return "LayersNotFoundException" +} + +// Message returns the exception's message. +func (s LayersNotFoundException) Message() string { + if s.Message_ != nil { + return *s.Message_ + } + return "" +} + +// OrigErr always returns nil, satisfies awserr.Error interface. +func (s LayersNotFoundException) OrigErr() error { + return nil +} + +func (s LayersNotFoundException) Error() string { + return fmt.Sprintf("%s: %s", s.Code(), s.Message()) +} + +// Status code returns the HTTP status code for the request's response error. +func (s LayersNotFoundException) StatusCode() int { + return s.respMetadata.StatusCode +} + +// RequestID returns the service's response RequestID for request. +func (s LayersNotFoundException) RequestID() string { + return s.respMetadata.RequestID +} + +// The lifecycle policy could not be found, and no policy is set to the repository. +type LifecyclePolicyNotFoundException struct { + _ struct{} `type:"structure"` + respMetadata protocol.ResponseMetadata + + Message_ *string `locationName:"message" type:"string"` +} + +// String returns the string representation +func (s LifecyclePolicyNotFoundException) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s LifecyclePolicyNotFoundException) GoString() string { + return s.String() +} + +func newErrorLifecyclePolicyNotFoundException(v protocol.ResponseMetadata) error { + return &LifecyclePolicyNotFoundException{ + respMetadata: v, + } +} + +// Code returns the exception type name. +func (s LifecyclePolicyNotFoundException) Code() string { + return "LifecyclePolicyNotFoundException" +} + +// Message returns the exception's message. +func (s LifecyclePolicyNotFoundException) Message() string { + if s.Message_ != nil { + return *s.Message_ + } + return "" +} + +// OrigErr always returns nil, satisfies awserr.Error interface. +func (s LifecyclePolicyNotFoundException) OrigErr() error { + return nil +} + +func (s LifecyclePolicyNotFoundException) Error() string { + return fmt.Sprintf("%s: %s", s.Code(), s.Message()) +} + +// Status code returns the HTTP status code for the request's response error. +func (s LifecyclePolicyNotFoundException) StatusCode() int { + return s.respMetadata.StatusCode +} + +// RequestID returns the service's response RequestID for request. +func (s LifecyclePolicyNotFoundException) RequestID() string { + return s.respMetadata.RequestID +} + +// The filter for the lifecycle policy preview. +type LifecyclePolicyPreviewFilter struct { + _ struct{} `type:"structure"` + + // The tag status of the image. + TagStatus *string `locationName:"tagStatus" type:"string" enum:"TagStatus"` +} + +// String returns the string representation +func (s LifecyclePolicyPreviewFilter) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s LifecyclePolicyPreviewFilter) GoString() string { + return s.String() +} + +// SetTagStatus sets the TagStatus field's value. +func (s *LifecyclePolicyPreviewFilter) SetTagStatus(v string) *LifecyclePolicyPreviewFilter { + s.TagStatus = &v + return s +} + +// The previous lifecycle policy preview request has not completed. Please try +// again later. +type LifecyclePolicyPreviewInProgressException struct { + _ struct{} `type:"structure"` + respMetadata protocol.ResponseMetadata + + Message_ *string `locationName:"message" type:"string"` +} + +// String returns the string representation +func (s LifecyclePolicyPreviewInProgressException) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s LifecyclePolicyPreviewInProgressException) GoString() string { + return s.String() +} + +func newErrorLifecyclePolicyPreviewInProgressException(v protocol.ResponseMetadata) error { + return &LifecyclePolicyPreviewInProgressException{ + respMetadata: v, + } +} + +// Code returns the exception type name. +func (s LifecyclePolicyPreviewInProgressException) Code() string { + return "LifecyclePolicyPreviewInProgressException" +} + +// Message returns the exception's message. +func (s LifecyclePolicyPreviewInProgressException) Message() string { + if s.Message_ != nil { + return *s.Message_ + } + return "" +} + +// OrigErr always returns nil, satisfies awserr.Error interface. +func (s LifecyclePolicyPreviewInProgressException) OrigErr() error { + return nil +} + +func (s LifecyclePolicyPreviewInProgressException) Error() string { + return fmt.Sprintf("%s: %s", s.Code(), s.Message()) +} + +// Status code returns the HTTP status code for the request's response error. +func (s LifecyclePolicyPreviewInProgressException) StatusCode() int { + return s.respMetadata.StatusCode +} + +// RequestID returns the service's response RequestID for request. +func (s LifecyclePolicyPreviewInProgressException) RequestID() string { + return s.respMetadata.RequestID +} + +// There is no dry run for this repository. +type LifecyclePolicyPreviewNotFoundException struct { + _ struct{} `type:"structure"` + respMetadata protocol.ResponseMetadata + + Message_ *string `locationName:"message" type:"string"` +} + +// String returns the string representation +func (s LifecyclePolicyPreviewNotFoundException) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s LifecyclePolicyPreviewNotFoundException) GoString() string { + return s.String() +} + +func newErrorLifecyclePolicyPreviewNotFoundException(v protocol.ResponseMetadata) error { + return &LifecyclePolicyPreviewNotFoundException{ + respMetadata: v, + } +} + +// Code returns the exception type name. +func (s LifecyclePolicyPreviewNotFoundException) Code() string { + return "LifecyclePolicyPreviewNotFoundException" +} + +// Message returns the exception's message. +func (s LifecyclePolicyPreviewNotFoundException) Message() string { + if s.Message_ != nil { + return *s.Message_ + } + return "" +} + +// OrigErr always returns nil, satisfies awserr.Error interface. +func (s LifecyclePolicyPreviewNotFoundException) OrigErr() error { + return nil +} + +func (s LifecyclePolicyPreviewNotFoundException) Error() string { + return fmt.Sprintf("%s: %s", s.Code(), s.Message()) +} + +// Status code returns the HTTP status code for the request's response error. +func (s LifecyclePolicyPreviewNotFoundException) StatusCode() int { + return s.respMetadata.StatusCode +} + +// RequestID returns the service's response RequestID for request. +func (s LifecyclePolicyPreviewNotFoundException) RequestID() string { + return s.respMetadata.RequestID +} + +// The result of the lifecycle policy preview. +type LifecyclePolicyPreviewResult struct { + _ struct{} `type:"structure"` + + // The type of action to be taken. + Action *LifecyclePolicyRuleAction `locationName:"action" type:"structure"` + + // The priority of the applied rule. + AppliedRulePriority *int64 `locationName:"appliedRulePriority" min:"1" type:"integer"` + + // The sha256 digest of the image manifest. + ImageDigest *string `locationName:"imageDigest" type:"string"` + + // The date and time, expressed in standard JavaScript date format, at which + // the current image was pushed to the repository. + ImagePushedAt *time.Time `locationName:"imagePushedAt" type:"timestamp"` + + // The list of tags associated with this image. + ImageTags []*string `locationName:"imageTags" type:"list"` +} + +// String returns the string representation +func (s LifecyclePolicyPreviewResult) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s LifecyclePolicyPreviewResult) GoString() string { + return s.String() +} + +// SetAction sets the Action field's value. +func (s *LifecyclePolicyPreviewResult) SetAction(v *LifecyclePolicyRuleAction) *LifecyclePolicyPreviewResult { + s.Action = v + return s +} + +// SetAppliedRulePriority sets the AppliedRulePriority field's value. +func (s *LifecyclePolicyPreviewResult) SetAppliedRulePriority(v int64) *LifecyclePolicyPreviewResult { + s.AppliedRulePriority = &v + return s +} + +// SetImageDigest sets the ImageDigest field's value. +func (s *LifecyclePolicyPreviewResult) SetImageDigest(v string) *LifecyclePolicyPreviewResult { + s.ImageDigest = &v + return s +} + +// SetImagePushedAt sets the ImagePushedAt field's value. +func (s *LifecyclePolicyPreviewResult) SetImagePushedAt(v time.Time) *LifecyclePolicyPreviewResult { + s.ImagePushedAt = &v + return s +} + +// SetImageTags sets the ImageTags field's value. +func (s *LifecyclePolicyPreviewResult) SetImageTags(v []*string) *LifecyclePolicyPreviewResult { + s.ImageTags = v + return s +} + +// The summary of the lifecycle policy preview request. +type LifecyclePolicyPreviewSummary struct { + _ struct{} `type:"structure"` + + // The number of expiring images. + ExpiringImageTotalCount *int64 `locationName:"expiringImageTotalCount" type:"integer"` +} + +// String returns the string representation +func (s LifecyclePolicyPreviewSummary) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s LifecyclePolicyPreviewSummary) GoString() string { + return s.String() +} + +// SetExpiringImageTotalCount sets the ExpiringImageTotalCount field's value. +func (s *LifecyclePolicyPreviewSummary) SetExpiringImageTotalCount(v int64) *LifecyclePolicyPreviewSummary { + s.ExpiringImageTotalCount = &v + return s +} + +// The type of action to be taken. +type LifecyclePolicyRuleAction struct { + _ struct{} `type:"structure"` + + // The type of action to be taken. + Type *string `locationName:"type" type:"string" enum:"ImageActionType"` +} + +// String returns the string representation +func (s LifecyclePolicyRuleAction) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s LifecyclePolicyRuleAction) GoString() string { + return s.String() +} + +// SetType sets the Type field's value. +func (s *LifecyclePolicyRuleAction) SetType(v string) *LifecyclePolicyRuleAction { + s.Type = &v + return s +} + +// The operation did not succeed because it would have exceeded a service limit +// for your account. For more information, see Amazon ECR Default Service Limits +// (https://docs.aws.amazon.com/AmazonECR/latest/userguide/service_limits.html) +// in the Amazon Elastic Container Registry User Guide. +type LimitExceededException struct { + _ struct{} `type:"structure"` + respMetadata protocol.ResponseMetadata + + // The error message associated with the exception. + Message_ *string `locationName:"message" type:"string"` +} + +// String returns the string representation +func (s LimitExceededException) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s LimitExceededException) GoString() string { + return s.String() +} + +func newErrorLimitExceededException(v protocol.ResponseMetadata) error { + return &LimitExceededException{ + respMetadata: v, + } +} + +// Code returns the exception type name. +func (s LimitExceededException) Code() string { + return "LimitExceededException" +} + +// Message returns the exception's message. +func (s LimitExceededException) Message() string { + if s.Message_ != nil { + return *s.Message_ + } + return "" +} + +// OrigErr always returns nil, satisfies awserr.Error interface. +func (s LimitExceededException) OrigErr() error { + return nil +} + +func (s LimitExceededException) Error() string { + return fmt.Sprintf("%s: %s", s.Code(), s.Message()) +} + +// Status code returns the HTTP status code for the request's response error. +func (s LimitExceededException) StatusCode() int { + return s.respMetadata.StatusCode +} + +// RequestID returns the service's response RequestID for request. +func (s LimitExceededException) RequestID() string { + return s.respMetadata.RequestID +} + +// An object representing a filter on a ListImages operation. +type ListImagesFilter struct { + _ struct{} `type:"structure"` + + // The tag status with which to filter your ListImages results. You can filter + // results based on whether they are TAGGED or UNTAGGED. + TagStatus *string `locationName:"tagStatus" type:"string" enum:"TagStatus"` +} + +// String returns the string representation +func (s ListImagesFilter) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s ListImagesFilter) GoString() string { + return s.String() +} + +// SetTagStatus sets the TagStatus field's value. +func (s *ListImagesFilter) SetTagStatus(v string) *ListImagesFilter { + s.TagStatus = &v + return s +} + +type ListImagesInput struct { + _ struct{} `type:"structure"` + + // The filter key and value with which to filter your ListImages results. + Filter *ListImagesFilter `locationName:"filter" type:"structure"` + + // The maximum number of image results returned by ListImages in paginated output. + // When this parameter is used, ListImages only returns maxResults results in + // a single page along with a nextToken response element. The remaining results + // of the initial request can be seen by sending another ListImages request + // with the returned nextToken value. This value can be between 1 and 1000. + // If this parameter is not used, then ListImages returns up to 100 results + // and a nextToken value, if applicable. + MaxResults *int64 `locationName:"maxResults" min:"1" type:"integer"` + + // The nextToken value returned from a previous paginated ListImages request + // where maxResults was used and the results exceeded the value of that parameter. + // Pagination continues from the end of the previous results that returned the + // nextToken value. This value is null when there are no more results to return. + // + // This token should be treated as an opaque identifier that is only used to + // retrieve the next items in a list and not for other programmatic purposes. + NextToken *string `locationName:"nextToken" type:"string"` + + // The AWS account ID associated with the registry that contains the repository + // in which to list images. If you do not specify a registry, the default registry + // is assumed. + RegistryId *string `locationName:"registryId" type:"string"` + + // The repository with image IDs to be listed. + // + // RepositoryName is a required field + RepositoryName *string `locationName:"repositoryName" min:"2" type:"string" required:"true"` +} + +// String returns the string representation +func (s ListImagesInput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s ListImagesInput) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *ListImagesInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "ListImagesInput"} + if s.MaxResults != nil && *s.MaxResults < 1 { + invalidParams.Add(request.NewErrParamMinValue("MaxResults", 1)) + } + if s.RepositoryName == nil { + invalidParams.Add(request.NewErrParamRequired("RepositoryName")) + } + if s.RepositoryName != nil && len(*s.RepositoryName) < 2 { + invalidParams.Add(request.NewErrParamMinLen("RepositoryName", 2)) + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetFilter sets the Filter field's value. +func (s *ListImagesInput) SetFilter(v *ListImagesFilter) *ListImagesInput { + s.Filter = v + return s +} + +// SetMaxResults sets the MaxResults field's value. +func (s *ListImagesInput) SetMaxResults(v int64) *ListImagesInput { + s.MaxResults = &v + return s +} + +// SetNextToken sets the NextToken field's value. +func (s *ListImagesInput) SetNextToken(v string) *ListImagesInput { + s.NextToken = &v + return s +} + +// SetRegistryId sets the RegistryId field's value. +func (s *ListImagesInput) SetRegistryId(v string) *ListImagesInput { + s.RegistryId = &v + return s +} + +// SetRepositoryName sets the RepositoryName field's value. +func (s *ListImagesInput) SetRepositoryName(v string) *ListImagesInput { + s.RepositoryName = &v + return s +} + +type ListImagesOutput struct { + _ struct{} `type:"structure"` + + // The list of image IDs for the requested repository. + ImageIds []*ImageIdentifier `locationName:"imageIds" min:"1" type:"list"` + + // The nextToken value to include in a future ListImages request. When the results + // of a ListImages request exceed maxResults, this value can be used to retrieve + // the next page of results. This value is null when there are no more results + // to return. + NextToken *string `locationName:"nextToken" type:"string"` +} + +// String returns the string representation +func (s ListImagesOutput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s ListImagesOutput) GoString() string { + return s.String() +} + +// SetImageIds sets the ImageIds field's value. +func (s *ListImagesOutput) SetImageIds(v []*ImageIdentifier) *ListImagesOutput { + s.ImageIds = v + return s +} + +// SetNextToken sets the NextToken field's value. +func (s *ListImagesOutput) SetNextToken(v string) *ListImagesOutput { + s.NextToken = &v + return s +} + +type ListTagsForResourceInput struct { + _ struct{} `type:"structure"` + + // The Amazon Resource Name (ARN) that identifies the resource for which to + // list the tags. Currently, the only supported resource is an Amazon ECR repository. + // + // ResourceArn is a required field + ResourceArn *string `locationName:"resourceArn" type:"string" required:"true"` +} + +// String returns the string representation +func (s ListTagsForResourceInput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s ListTagsForResourceInput) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *ListTagsForResourceInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "ListTagsForResourceInput"} + if s.ResourceArn == nil { + invalidParams.Add(request.NewErrParamRequired("ResourceArn")) + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetResourceArn sets the ResourceArn field's value. +func (s *ListTagsForResourceInput) SetResourceArn(v string) *ListTagsForResourceInput { + s.ResourceArn = &v + return s +} + +type ListTagsForResourceOutput struct { + _ struct{} `type:"structure"` + + // The tags for the resource. + Tags []*Tag `locationName:"tags" type:"list"` +} + +// String returns the string representation +func (s ListTagsForResourceOutput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s ListTagsForResourceOutput) GoString() string { + return s.String() +} + +// SetTags sets the Tags field's value. +func (s *ListTagsForResourceOutput) SetTags(v []*Tag) *ListTagsForResourceOutput { + s.Tags = v + return s +} + +type PutImageInput struct { + _ struct{} `type:"structure"` + + // The image manifest corresponding to the image to be uploaded. + // + // ImageManifest is a required field + ImageManifest *string `locationName:"imageManifest" min:"1" type:"string" required:"true"` + + // The tag to associate with the image. This parameter is required for images + // that use the Docker Image Manifest V2 Schema 2 or OCI formats. + ImageTag *string `locationName:"imageTag" min:"1" type:"string"` + + // The AWS account ID associated with the registry that contains the repository + // in which to put the image. If you do not specify a registry, the default + // registry is assumed. + RegistryId *string `locationName:"registryId" type:"string"` + + // The name of the repository in which to put the image. + // + // RepositoryName is a required field + RepositoryName *string `locationName:"repositoryName" min:"2" type:"string" required:"true"` +} + +// String returns the string representation +func (s PutImageInput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s PutImageInput) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *PutImageInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "PutImageInput"} + if s.ImageManifest == nil { + invalidParams.Add(request.NewErrParamRequired("ImageManifest")) + } + if s.ImageManifest != nil && len(*s.ImageManifest) < 1 { + invalidParams.Add(request.NewErrParamMinLen("ImageManifest", 1)) + } + if s.ImageTag != nil && len(*s.ImageTag) < 1 { + invalidParams.Add(request.NewErrParamMinLen("ImageTag", 1)) + } + if s.RepositoryName == nil { + invalidParams.Add(request.NewErrParamRequired("RepositoryName")) + } + if s.RepositoryName != nil && len(*s.RepositoryName) < 2 { + invalidParams.Add(request.NewErrParamMinLen("RepositoryName", 2)) + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetImageManifest sets the ImageManifest field's value. +func (s *PutImageInput) SetImageManifest(v string) *PutImageInput { + s.ImageManifest = &v + return s +} + +// SetImageTag sets the ImageTag field's value. +func (s *PutImageInput) SetImageTag(v string) *PutImageInput { + s.ImageTag = &v + return s +} + +// SetRegistryId sets the RegistryId field's value. +func (s *PutImageInput) SetRegistryId(v string) *PutImageInput { + s.RegistryId = &v + return s +} + +// SetRepositoryName sets the RepositoryName field's value. +func (s *PutImageInput) SetRepositoryName(v string) *PutImageInput { + s.RepositoryName = &v + return s +} + +type PutImageOutput struct { + _ struct{} `type:"structure"` + + // Details of the image uploaded. + Image *Image `locationName:"image" type:"structure"` +} + +// String returns the string representation +func (s PutImageOutput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s PutImageOutput) GoString() string { + return s.String() +} + +// SetImage sets the Image field's value. +func (s *PutImageOutput) SetImage(v *Image) *PutImageOutput { + s.Image = v + return s +} + +type PutImageScanningConfigurationInput struct { + _ struct{} `type:"structure"` + + // The image scanning configuration for the repository. This setting determines + // whether images are scanned for known vulnerabilities after being pushed to + // the repository. + // + // ImageScanningConfiguration is a required field + ImageScanningConfiguration *ImageScanningConfiguration `locationName:"imageScanningConfiguration" type:"structure" required:"true"` + + // The AWS account ID associated with the registry that contains the repository + // in which to update the image scanning configuration setting. If you do not + // specify a registry, the default registry is assumed. + RegistryId *string `locationName:"registryId" type:"string"` + + // The name of the repository in which to update the image scanning configuration + // setting. + // + // RepositoryName is a required field + RepositoryName *string `locationName:"repositoryName" min:"2" type:"string" required:"true"` +} + +// String returns the string representation +func (s PutImageScanningConfigurationInput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s PutImageScanningConfigurationInput) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *PutImageScanningConfigurationInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "PutImageScanningConfigurationInput"} + if s.ImageScanningConfiguration == nil { + invalidParams.Add(request.NewErrParamRequired("ImageScanningConfiguration")) + } + if s.RepositoryName == nil { + invalidParams.Add(request.NewErrParamRequired("RepositoryName")) + } + if s.RepositoryName != nil && len(*s.RepositoryName) < 2 { + invalidParams.Add(request.NewErrParamMinLen("RepositoryName", 2)) + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetImageScanningConfiguration sets the ImageScanningConfiguration field's value. +func (s *PutImageScanningConfigurationInput) SetImageScanningConfiguration(v *ImageScanningConfiguration) *PutImageScanningConfigurationInput { + s.ImageScanningConfiguration = v + return s +} + +// SetRegistryId sets the RegistryId field's value. +func (s *PutImageScanningConfigurationInput) SetRegistryId(v string) *PutImageScanningConfigurationInput { + s.RegistryId = &v + return s +} + +// SetRepositoryName sets the RepositoryName field's value. +func (s *PutImageScanningConfigurationInput) SetRepositoryName(v string) *PutImageScanningConfigurationInput { + s.RepositoryName = &v + return s +} + +type PutImageScanningConfigurationOutput struct { + _ struct{} `type:"structure"` + + // The image scanning configuration setting for the repository. + ImageScanningConfiguration *ImageScanningConfiguration `locationName:"imageScanningConfiguration" type:"structure"` + + // The registry ID associated with the request. + RegistryId *string `locationName:"registryId" type:"string"` + + // The repository name associated with the request. + RepositoryName *string `locationName:"repositoryName" min:"2" type:"string"` +} + +// String returns the string representation +func (s PutImageScanningConfigurationOutput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s PutImageScanningConfigurationOutput) GoString() string { + return s.String() +} + +// SetImageScanningConfiguration sets the ImageScanningConfiguration field's value. +func (s *PutImageScanningConfigurationOutput) SetImageScanningConfiguration(v *ImageScanningConfiguration) *PutImageScanningConfigurationOutput { + s.ImageScanningConfiguration = v + return s +} + +// SetRegistryId sets the RegistryId field's value. +func (s *PutImageScanningConfigurationOutput) SetRegistryId(v string) *PutImageScanningConfigurationOutput { + s.RegistryId = &v + return s +} + +// SetRepositoryName sets the RepositoryName field's value. +func (s *PutImageScanningConfigurationOutput) SetRepositoryName(v string) *PutImageScanningConfigurationOutput { + s.RepositoryName = &v + return s +} + +type PutImageTagMutabilityInput struct { + _ struct{} `type:"structure"` + + // The tag mutability setting for the repository. If MUTABLE is specified, image + // tags can be overwritten. If IMMUTABLE is specified, all image tags within + // the repository will be immutable which will prevent them from being overwritten. + // + // ImageTagMutability is a required field + ImageTagMutability *string `locationName:"imageTagMutability" type:"string" required:"true" enum:"ImageTagMutability"` + + // The AWS account ID associated with the registry that contains the repository + // in which to update the image tag mutability settings. If you do not specify + // a registry, the default registry is assumed. + RegistryId *string `locationName:"registryId" type:"string"` + + // The name of the repository in which to update the image tag mutability settings. + // + // RepositoryName is a required field + RepositoryName *string `locationName:"repositoryName" min:"2" type:"string" required:"true"` +} + +// String returns the string representation +func (s PutImageTagMutabilityInput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s PutImageTagMutabilityInput) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *PutImageTagMutabilityInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "PutImageTagMutabilityInput"} + if s.ImageTagMutability == nil { + invalidParams.Add(request.NewErrParamRequired("ImageTagMutability")) + } + if s.RepositoryName == nil { + invalidParams.Add(request.NewErrParamRequired("RepositoryName")) + } + if s.RepositoryName != nil && len(*s.RepositoryName) < 2 { + invalidParams.Add(request.NewErrParamMinLen("RepositoryName", 2)) + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetImageTagMutability sets the ImageTagMutability field's value. +func (s *PutImageTagMutabilityInput) SetImageTagMutability(v string) *PutImageTagMutabilityInput { + s.ImageTagMutability = &v + return s +} + +// SetRegistryId sets the RegistryId field's value. +func (s *PutImageTagMutabilityInput) SetRegistryId(v string) *PutImageTagMutabilityInput { + s.RegistryId = &v + return s +} + +// SetRepositoryName sets the RepositoryName field's value. +func (s *PutImageTagMutabilityInput) SetRepositoryName(v string) *PutImageTagMutabilityInput { + s.RepositoryName = &v + return s +} + +type PutImageTagMutabilityOutput struct { + _ struct{} `type:"structure"` + + // The image tag mutability setting for the repository. + ImageTagMutability *string `locationName:"imageTagMutability" type:"string" enum:"ImageTagMutability"` + + // The registry ID associated with the request. + RegistryId *string `locationName:"registryId" type:"string"` + + // The repository name associated with the request. + RepositoryName *string `locationName:"repositoryName" min:"2" type:"string"` +} + +// String returns the string representation +func (s PutImageTagMutabilityOutput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s PutImageTagMutabilityOutput) GoString() string { + return s.String() +} + +// SetImageTagMutability sets the ImageTagMutability field's value. +func (s *PutImageTagMutabilityOutput) SetImageTagMutability(v string) *PutImageTagMutabilityOutput { + s.ImageTagMutability = &v + return s +} + +// SetRegistryId sets the RegistryId field's value. +func (s *PutImageTagMutabilityOutput) SetRegistryId(v string) *PutImageTagMutabilityOutput { + s.RegistryId = &v + return s +} + +// SetRepositoryName sets the RepositoryName field's value. +func (s *PutImageTagMutabilityOutput) SetRepositoryName(v string) *PutImageTagMutabilityOutput { + s.RepositoryName = &v + return s +} + +type PutLifecyclePolicyInput struct { + _ struct{} `type:"structure"` + + // The JSON repository policy text to apply to the repository. + // + // LifecyclePolicyText is a required field + LifecyclePolicyText *string `locationName:"lifecyclePolicyText" min:"100" type:"string" required:"true"` + + // The AWS account ID associated with the registry that contains the repository. + // If you do not specify a registry, the default registry is assumed. + RegistryId *string `locationName:"registryId" type:"string"` + + // The name of the repository to receive the policy. + // + // RepositoryName is a required field + RepositoryName *string `locationName:"repositoryName" min:"2" type:"string" required:"true"` +} + +// String returns the string representation +func (s PutLifecyclePolicyInput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s PutLifecyclePolicyInput) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *PutLifecyclePolicyInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "PutLifecyclePolicyInput"} + if s.LifecyclePolicyText == nil { + invalidParams.Add(request.NewErrParamRequired("LifecyclePolicyText")) + } + if s.LifecyclePolicyText != nil && len(*s.LifecyclePolicyText) < 100 { + invalidParams.Add(request.NewErrParamMinLen("LifecyclePolicyText", 100)) + } + if s.RepositoryName == nil { + invalidParams.Add(request.NewErrParamRequired("RepositoryName")) + } + if s.RepositoryName != nil && len(*s.RepositoryName) < 2 { + invalidParams.Add(request.NewErrParamMinLen("RepositoryName", 2)) + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetLifecyclePolicyText sets the LifecyclePolicyText field's value. +func (s *PutLifecyclePolicyInput) SetLifecyclePolicyText(v string) *PutLifecyclePolicyInput { + s.LifecyclePolicyText = &v + return s +} + +// SetRegistryId sets the RegistryId field's value. +func (s *PutLifecyclePolicyInput) SetRegistryId(v string) *PutLifecyclePolicyInput { + s.RegistryId = &v + return s +} + +// SetRepositoryName sets the RepositoryName field's value. +func (s *PutLifecyclePolicyInput) SetRepositoryName(v string) *PutLifecyclePolicyInput { + s.RepositoryName = &v + return s +} + +type PutLifecyclePolicyOutput struct { + _ struct{} `type:"structure"` + + // The JSON repository policy text. + LifecyclePolicyText *string `locationName:"lifecyclePolicyText" min:"100" type:"string"` + + // The registry ID associated with the request. + RegistryId *string `locationName:"registryId" type:"string"` + + // The repository name associated with the request. + RepositoryName *string `locationName:"repositoryName" min:"2" type:"string"` +} + +// String returns the string representation +func (s PutLifecyclePolicyOutput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s PutLifecyclePolicyOutput) GoString() string { + return s.String() +} + +// SetLifecyclePolicyText sets the LifecyclePolicyText field's value. +func (s *PutLifecyclePolicyOutput) SetLifecyclePolicyText(v string) *PutLifecyclePolicyOutput { + s.LifecyclePolicyText = &v + return s +} + +// SetRegistryId sets the RegistryId field's value. +func (s *PutLifecyclePolicyOutput) SetRegistryId(v string) *PutLifecyclePolicyOutput { + s.RegistryId = &v + return s +} + +// SetRepositoryName sets the RepositoryName field's value. +func (s *PutLifecyclePolicyOutput) SetRepositoryName(v string) *PutLifecyclePolicyOutput { + s.RepositoryName = &v + return s +} + +// An object representing a repository. +type Repository struct { + _ struct{} `type:"structure"` + + // The date and time, in JavaScript date format, when the repository was created. + CreatedAt *time.Time `locationName:"createdAt" type:"timestamp"` + + // The image scanning configuration for a repository. + ImageScanningConfiguration *ImageScanningConfiguration `locationName:"imageScanningConfiguration" type:"structure"` + + // The tag mutability setting for the repository. + ImageTagMutability *string `locationName:"imageTagMutability" type:"string" enum:"ImageTagMutability"` + + // The AWS account ID associated with the registry that contains the repository. RegistryId *string `locationName:"registryId" type:"string"` - // The name of the repository in which to put the image. - // - // RepositoryName is a required field - RepositoryName *string `locationName:"repositoryName" min:"2" type:"string" required:"true"` + // The Amazon Resource Name (ARN) that identifies the repository. The ARN contains + // the arn:aws:ecr namespace, followed by the region of the repository, AWS + // account ID of the repository owner, repository namespace, and repository + // name. For example, arn:aws:ecr:region:012345678910:repository/test. + RepositoryArn *string `locationName:"repositoryArn" type:"string"` + + // The name of the repository. + RepositoryName *string `locationName:"repositoryName" min:"2" type:"string"` + + // The URI for the repository. You can use this URI for Docker push or pull + // operations. + RepositoryUri *string `locationName:"repositoryUri" type:"string"` +} + +// String returns the string representation +func (s Repository) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s Repository) GoString() string { + return s.String() +} + +// SetCreatedAt sets the CreatedAt field's value. +func (s *Repository) SetCreatedAt(v time.Time) *Repository { + s.CreatedAt = &v + return s +} + +// SetImageScanningConfiguration sets the ImageScanningConfiguration field's value. +func (s *Repository) SetImageScanningConfiguration(v *ImageScanningConfiguration) *Repository { + s.ImageScanningConfiguration = v + return s +} + +// SetImageTagMutability sets the ImageTagMutability field's value. +func (s *Repository) SetImageTagMutability(v string) *Repository { + s.ImageTagMutability = &v + return s +} + +// SetRegistryId sets the RegistryId field's value. +func (s *Repository) SetRegistryId(v string) *Repository { + s.RegistryId = &v + return s +} + +// SetRepositoryArn sets the RepositoryArn field's value. +func (s *Repository) SetRepositoryArn(v string) *Repository { + s.RepositoryArn = &v + return s +} + +// SetRepositoryName sets the RepositoryName field's value. +func (s *Repository) SetRepositoryName(v string) *Repository { + s.RepositoryName = &v + return s +} + +// SetRepositoryUri sets the RepositoryUri field's value. +func (s *Repository) SetRepositoryUri(v string) *Repository { + s.RepositoryUri = &v + return s +} + +// The specified repository already exists in the specified registry. +type RepositoryAlreadyExistsException struct { + _ struct{} `type:"structure"` + respMetadata protocol.ResponseMetadata + + // The error message associated with the exception. + Message_ *string `locationName:"message" type:"string"` +} + +// String returns the string representation +func (s RepositoryAlreadyExistsException) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s RepositoryAlreadyExistsException) GoString() string { + return s.String() +} + +func newErrorRepositoryAlreadyExistsException(v protocol.ResponseMetadata) error { + return &RepositoryAlreadyExistsException{ + respMetadata: v, + } +} + +// Code returns the exception type name. +func (s RepositoryAlreadyExistsException) Code() string { + return "RepositoryAlreadyExistsException" +} + +// Message returns the exception's message. +func (s RepositoryAlreadyExistsException) Message() string { + if s.Message_ != nil { + return *s.Message_ + } + return "" +} + +// OrigErr always returns nil, satisfies awserr.Error interface. +func (s RepositoryAlreadyExistsException) OrigErr() error { + return nil +} + +func (s RepositoryAlreadyExistsException) Error() string { + return fmt.Sprintf("%s: %s", s.Code(), s.Message()) +} + +// Status code returns the HTTP status code for the request's response error. +func (s RepositoryAlreadyExistsException) StatusCode() int { + return s.respMetadata.StatusCode +} + +// RequestID returns the service's response RequestID for request. +func (s RepositoryAlreadyExistsException) RequestID() string { + return s.respMetadata.RequestID +} + +// The specified repository contains images. To delete a repository that contains +// images, you must force the deletion with the force parameter. +type RepositoryNotEmptyException struct { + _ struct{} `type:"structure"` + respMetadata protocol.ResponseMetadata + + // The error message associated with the exception. + Message_ *string `locationName:"message" type:"string"` } // String returns the string representation -func (s PutImageInput) String() string { +func (s RepositoryNotEmptyException) String() string { return awsutil.Prettify(s) } // GoString returns the string representation -func (s PutImageInput) GoString() string { +func (s RepositoryNotEmptyException) GoString() string { return s.String() } -// Validate inspects the fields of the type to determine if they are valid. -func (s *PutImageInput) Validate() error { - invalidParams := request.ErrInvalidParams{Context: "PutImageInput"} - if s.ImageManifest == nil { - invalidParams.Add(request.NewErrParamRequired("ImageManifest")) +func newErrorRepositoryNotEmptyException(v protocol.ResponseMetadata) error { + return &RepositoryNotEmptyException{ + respMetadata: v, } - if s.RepositoryName == nil { - invalidParams.Add(request.NewErrParamRequired("RepositoryName")) +} + +// Code returns the exception type name. +func (s RepositoryNotEmptyException) Code() string { + return "RepositoryNotEmptyException" +} + +// Message returns the exception's message. +func (s RepositoryNotEmptyException) Message() string { + if s.Message_ != nil { + return *s.Message_ } - if s.RepositoryName != nil && len(*s.RepositoryName) < 2 { - invalidParams.Add(request.NewErrParamMinLen("RepositoryName", 2)) + return "" +} + +// OrigErr always returns nil, satisfies awserr.Error interface. +func (s RepositoryNotEmptyException) OrigErr() error { + return nil +} + +func (s RepositoryNotEmptyException) Error() string { + return fmt.Sprintf("%s: %s", s.Code(), s.Message()) +} + +// Status code returns the HTTP status code for the request's response error. +func (s RepositoryNotEmptyException) StatusCode() int { + return s.respMetadata.StatusCode +} + +// RequestID returns the service's response RequestID for request. +func (s RepositoryNotEmptyException) RequestID() string { + return s.respMetadata.RequestID +} + +// The specified repository could not be found. Check the spelling of the specified +// repository and ensure that you are performing operations on the correct registry. +type RepositoryNotFoundException struct { + _ struct{} `type:"structure"` + respMetadata protocol.ResponseMetadata + + // The error message associated with the exception. + Message_ *string `locationName:"message" type:"string"` +} + +// String returns the string representation +func (s RepositoryNotFoundException) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s RepositoryNotFoundException) GoString() string { + return s.String() +} + +func newErrorRepositoryNotFoundException(v protocol.ResponseMetadata) error { + return &RepositoryNotFoundException{ + respMetadata: v, } +} - if invalidParams.Len() > 0 { - return invalidParams +// Code returns the exception type name. +func (s RepositoryNotFoundException) Code() string { + return "RepositoryNotFoundException" +} + +// Message returns the exception's message. +func (s RepositoryNotFoundException) Message() string { + if s.Message_ != nil { + return *s.Message_ } - return nil + return "" } -// SetImageManifest sets the ImageManifest field's value. -func (s *PutImageInput) SetImageManifest(v string) *PutImageInput { - s.ImageManifest = &v - return s +// OrigErr always returns nil, satisfies awserr.Error interface. +func (s RepositoryNotFoundException) OrigErr() error { + return nil } -// SetImageTag sets the ImageTag field's value. -func (s *PutImageInput) SetImageTag(v string) *PutImageInput { - s.ImageTag = &v - return s +func (s RepositoryNotFoundException) Error() string { + return fmt.Sprintf("%s: %s", s.Code(), s.Message()) } -// SetRegistryId sets the RegistryId field's value. -func (s *PutImageInput) SetRegistryId(v string) *PutImageInput { - s.RegistryId = &v - return s +// Status code returns the HTTP status code for the request's response error. +func (s RepositoryNotFoundException) StatusCode() int { + return s.respMetadata.StatusCode } -// SetRepositoryName sets the RepositoryName field's value. -func (s *PutImageInput) SetRepositoryName(v string) *PutImageInput { - s.RepositoryName = &v - return s +// RequestID returns the service's response RequestID for request. +func (s RepositoryNotFoundException) RequestID() string { + return s.respMetadata.RequestID } -type PutImageOutput struct { - _ struct{} `type:"structure"` +// The specified repository and registry combination does not have an associated +// repository policy. +type RepositoryPolicyNotFoundException struct { + _ struct{} `type:"structure"` + respMetadata protocol.ResponseMetadata - // Details of the image uploaded. - Image *Image `locationName:"image" type:"structure"` + // The error message associated with the exception. + Message_ *string `locationName:"message" type:"string"` } // String returns the string representation -func (s PutImageOutput) String() string { +func (s RepositoryPolicyNotFoundException) String() string { return awsutil.Prettify(s) } // GoString returns the string representation -func (s PutImageOutput) GoString() string { +func (s RepositoryPolicyNotFoundException) GoString() string { return s.String() } -// SetImage sets the Image field's value. -func (s *PutImageOutput) SetImage(v *Image) *PutImageOutput { - s.Image = v - return s +func newErrorRepositoryPolicyNotFoundException(v protocol.ResponseMetadata) error { + return &RepositoryPolicyNotFoundException{ + respMetadata: v, + } } -type PutLifecyclePolicyInput struct { - _ struct{} `type:"structure"` +// Code returns the exception type name. +func (s RepositoryPolicyNotFoundException) Code() string { + return "RepositoryPolicyNotFoundException" +} - // The JSON repository policy text to apply to the repository. - // - // LifecyclePolicyText is a required field - LifecyclePolicyText *string `locationName:"lifecyclePolicyText" min:"100" type:"string" required:"true"` +// Message returns the exception's message. +func (s RepositoryPolicyNotFoundException) Message() string { + if s.Message_ != nil { + return *s.Message_ + } + return "" +} - // The AWS account ID associated with the registry that contains the repository. - // If you do
 not specify a registry, the default registry is assumed. - RegistryId *string `locationName:"registryId" type:"string"` +// OrigErr always returns nil, satisfies awserr.Error interface. +func (s RepositoryPolicyNotFoundException) OrigErr() error { + return nil +} - // The name of the repository to receive the policy. - // - // RepositoryName is a required field - RepositoryName *string `locationName:"repositoryName" min:"2" type:"string" required:"true"` +func (s RepositoryPolicyNotFoundException) Error() string { + return fmt.Sprintf("%s: %s", s.Code(), s.Message()) +} + +// Status code returns the HTTP status code for the request's response error. +func (s RepositoryPolicyNotFoundException) StatusCode() int { + return s.respMetadata.StatusCode +} + +// RequestID returns the service's response RequestID for request. +func (s RepositoryPolicyNotFoundException) RequestID() string { + return s.respMetadata.RequestID +} + +// The specified image scan could not be found. Ensure that image scanning is +// enabled on the repository and try again. +type ScanNotFoundException struct { + _ struct{} `type:"structure"` + respMetadata protocol.ResponseMetadata + + Message_ *string `locationName:"message" type:"string"` } // String returns the string representation -func (s PutLifecyclePolicyInput) String() string { +func (s ScanNotFoundException) String() string { return awsutil.Prettify(s) } // GoString returns the string representation -func (s PutLifecyclePolicyInput) GoString() string { +func (s ScanNotFoundException) GoString() string { return s.String() } -// Validate inspects the fields of the type to determine if they are valid. -func (s *PutLifecyclePolicyInput) Validate() error { - invalidParams := request.ErrInvalidParams{Context: "PutLifecyclePolicyInput"} - if s.LifecyclePolicyText == nil { - invalidParams.Add(request.NewErrParamRequired("LifecyclePolicyText")) - } - if s.LifecyclePolicyText != nil && len(*s.LifecyclePolicyText) < 100 { - invalidParams.Add(request.NewErrParamMinLen("LifecyclePolicyText", 100)) +func newErrorScanNotFoundException(v protocol.ResponseMetadata) error { + return &ScanNotFoundException{ + respMetadata: v, } - if s.RepositoryName == nil { - invalidParams.Add(request.NewErrParamRequired("RepositoryName")) +} + +// Code returns the exception type name. +func (s ScanNotFoundException) Code() string { + return "ScanNotFoundException" +} + +// Message returns the exception's message. +func (s ScanNotFoundException) Message() string { + if s.Message_ != nil { + return *s.Message_ } - if s.RepositoryName != nil && len(*s.RepositoryName) < 2 { - invalidParams.Add(request.NewErrParamMinLen("RepositoryName", 2)) + return "" +} + +// OrigErr always returns nil, satisfies awserr.Error interface. +func (s ScanNotFoundException) OrigErr() error { + return nil +} + +func (s ScanNotFoundException) Error() string { + return fmt.Sprintf("%s: %s", s.Code(), s.Message()) +} + +// Status code returns the HTTP status code for the request's response error. +func (s ScanNotFoundException) StatusCode() int { + return s.respMetadata.StatusCode +} + +// RequestID returns the service's response RequestID for request. +func (s ScanNotFoundException) RequestID() string { + return s.respMetadata.RequestID +} + +// These errors are usually caused by a server-side issue. +type ServerException struct { + _ struct{} `type:"structure"` + respMetadata protocol.ResponseMetadata + + // The error message associated with the exception. + Message_ *string `locationName:"message" type:"string"` +} + +// String returns the string representation +func (s ServerException) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s ServerException) GoString() string { + return s.String() +} + +func newErrorServerException(v protocol.ResponseMetadata) error { + return &ServerException{ + respMetadata: v, } +} - if invalidParams.Len() > 0 { - return invalidParams +// Code returns the exception type name. +func (s ServerException) Code() string { + return "ServerException" +} + +// Message returns the exception's message. +func (s ServerException) Message() string { + if s.Message_ != nil { + return *s.Message_ } + return "" +} + +// OrigErr always returns nil, satisfies awserr.Error interface. +func (s ServerException) OrigErr() error { return nil } -// SetLifecyclePolicyText sets the LifecyclePolicyText field's value. -func (s *PutLifecyclePolicyInput) SetLifecyclePolicyText(v string) *PutLifecyclePolicyInput { - s.LifecyclePolicyText = &v - return s +func (s ServerException) Error() string { + return fmt.Sprintf("%s: %s", s.Code(), s.Message()) } -// SetRegistryId sets the RegistryId field's value. -func (s *PutLifecyclePolicyInput) SetRegistryId(v string) *PutLifecyclePolicyInput { - s.RegistryId = &v - return s +// Status code returns the HTTP status code for the request's response error. +func (s ServerException) StatusCode() int { + return s.respMetadata.StatusCode } -// SetRepositoryName sets the RepositoryName field's value. -func (s *PutLifecyclePolicyInput) SetRepositoryName(v string) *PutLifecyclePolicyInput { - s.RepositoryName = &v - return s +// RequestID returns the service's response RequestID for request. +func (s ServerException) RequestID() string { + return s.respMetadata.RequestID } -type PutLifecyclePolicyOutput struct { +type SetRepositoryPolicyInput struct { _ struct{} `type:"structure"` - // The JSON repository policy text. - LifecyclePolicyText *string `locationName:"lifecyclePolicyText" min:"100" type:"string"` + // If the policy you are attempting to set on a repository policy would prevent + // you from setting another policy in the future, you must force the SetRepositoryPolicy + // operation. This is intended to prevent accidental repository lock outs. + Force *bool `locationName:"force" type:"boolean"` - // The registry ID associated with the request. + // The JSON repository policy text to apply to the repository. For more information, + // see Amazon ECR Repository Policy Examples (https://docs.aws.amazon.com/AmazonECR/latest/userguide/RepositoryPolicyExamples.html) + // in the Amazon Elastic Container Registry User Guide. + // + // PolicyText is a required field + PolicyText *string `locationName:"policyText" type:"string" required:"true"` + + // The AWS account ID associated with the registry that contains the repository. + // If you do not specify a registry, the default registry is assumed. RegistryId *string `locationName:"registryId" type:"string"` - // The repository name associated with the request. - RepositoryName *string `locationName:"repositoryName" min:"2" type:"string"` + // The name of the repository to receive the policy. + // + // RepositoryName is a required field + RepositoryName *string `locationName:"repositoryName" min:"2" type:"string" required:"true"` } // String returns the string representation -func (s PutLifecyclePolicyOutput) String() string { +func (s SetRepositoryPolicyInput) String() string { return awsutil.Prettify(s) } // GoString returns the string representation -func (s PutLifecyclePolicyOutput) GoString() string { +func (s SetRepositoryPolicyInput) GoString() string { return s.String() } -// SetLifecyclePolicyText sets the LifecyclePolicyText field's value. -func (s *PutLifecyclePolicyOutput) SetLifecyclePolicyText(v string) *PutLifecyclePolicyOutput { - s.LifecyclePolicyText = &v +// Validate inspects the fields of the type to determine if they are valid. +func (s *SetRepositoryPolicyInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "SetRepositoryPolicyInput"} + if s.PolicyText == nil { + invalidParams.Add(request.NewErrParamRequired("PolicyText")) + } + if s.RepositoryName == nil { + invalidParams.Add(request.NewErrParamRequired("RepositoryName")) + } + if s.RepositoryName != nil && len(*s.RepositoryName) < 2 { + invalidParams.Add(request.NewErrParamMinLen("RepositoryName", 2)) + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetForce sets the Force field's value. +func (s *SetRepositoryPolicyInput) SetForce(v bool) *SetRepositoryPolicyInput { + s.Force = &v + return s +} + +// SetPolicyText sets the PolicyText field's value. +func (s *SetRepositoryPolicyInput) SetPolicyText(v string) *SetRepositoryPolicyInput { + s.PolicyText = &v return s } // SetRegistryId sets the RegistryId field's value. -func (s *PutLifecyclePolicyOutput) SetRegistryId(v string) *PutLifecyclePolicyOutput { +func (s *SetRepositoryPolicyInput) SetRegistryId(v string) *SetRepositoryPolicyInput { s.RegistryId = &v return s } // SetRepositoryName sets the RepositoryName field's value. -func (s *PutLifecyclePolicyOutput) SetRepositoryName(v string) *PutLifecyclePolicyOutput { +func (s *SetRepositoryPolicyInput) SetRepositoryName(v string) *SetRepositoryPolicyInput { s.RepositoryName = &v return s } -// An object representing a repository. -type Repository struct { +type SetRepositoryPolicyOutput struct { _ struct{} `type:"structure"` - // The date and time, in JavaScript date format, when the repository was created. - CreatedAt *time.Time `locationName:"createdAt" type:"timestamp" timestampFormat:"unix"` + // The JSON repository policy text applied to the repository. + PolicyText *string `locationName:"policyText" type:"string"` - // The AWS account ID associated with the registry that contains the repository. + // The registry ID associated with the request. RegistryId *string `locationName:"registryId" type:"string"` - - // The Amazon Resource Name (ARN) that identifies the repository. The ARN contains - // the arn:aws:ecr namespace, followed by the region of the repository, AWS - // account ID of the repository owner, repository namespace, and repository - // name. For example, arn:aws:ecr:region:012345678910:repository/test. - RepositoryArn *string `locationName:"repositoryArn" type:"string"` - - // The name of the repository. - RepositoryName *string `locationName:"repositoryName" min:"2" type:"string"` - - // The URI for the repository. You can use this URI for Docker push or pull - // operations. - RepositoryUri *string `locationName:"repositoryUri" type:"string"` + + // The repository name associated with the request. + RepositoryName *string `locationName:"repositoryName" min:"2" type:"string"` } // String returns the string representation -func (s Repository) String() string { +func (s SetRepositoryPolicyOutput) String() string { return awsutil.Prettify(s) } // GoString returns the string representation -func (s Repository) GoString() string { +func (s SetRepositoryPolicyOutput) GoString() string { return s.String() } -// SetCreatedAt sets the CreatedAt field's value. -func (s *Repository) SetCreatedAt(v time.Time) *Repository { - s.CreatedAt = &v +// SetPolicyText sets the PolicyText field's value. +func (s *SetRepositoryPolicyOutput) SetPolicyText(v string) *SetRepositoryPolicyOutput { + s.PolicyText = &v return s } // SetRegistryId sets the RegistryId field's value. -func (s *Repository) SetRegistryId(v string) *Repository { +func (s *SetRepositoryPolicyOutput) SetRegistryId(v string) *SetRepositoryPolicyOutput { s.RegistryId = &v return s } -// SetRepositoryArn sets the RepositoryArn field's value. -func (s *Repository) SetRepositoryArn(v string) *Repository { - s.RepositoryArn = &v - return s -} - // SetRepositoryName sets the RepositoryName field's value. -func (s *Repository) SetRepositoryName(v string) *Repository { +func (s *SetRepositoryPolicyOutput) SetRepositoryName(v string) *SetRepositoryPolicyOutput { s.RepositoryName = &v return s } -// SetRepositoryUri sets the RepositoryUri field's value. -func (s *Repository) SetRepositoryUri(v string) *Repository { - s.RepositoryUri = &v - return s -} - -type SetRepositoryPolicyInput struct { +type StartImageScanInput struct { _ struct{} `type:"structure"` - // If the policy you are attempting to set on a repository policy would prevent - // you from setting another policy in the future, you must force the SetRepositoryPolicy - // operation. This is intended to prevent accidental repository lock outs. - Force *bool `locationName:"force" type:"boolean"` - - // The JSON repository policy text to apply to the repository. + // An object with identifying information for an Amazon ECR image. // - // PolicyText is a required field - PolicyText *string `locationName:"policyText" type:"string" required:"true"` + // ImageId is a required field + ImageId *ImageIdentifier `locationName:"imageId" type:"structure" required:"true"` - // The AWS account ID associated with the registry that contains the repository. - // If you do not specify a registry, the default registry is assumed. + // The AWS account ID associated with the registry that contains the repository + // in which to start an image scan request. If you do not specify a registry, + // the default registry is assumed. RegistryId *string `locationName:"registryId" type:"string"` - // The name of the repository to receive the policy. + // The name of the repository that contains the images to scan. // // RepositoryName is a required field RepositoryName *string `locationName:"repositoryName" min:"2" type:"string" required:"true"` } // String returns the string representation -func (s SetRepositoryPolicyInput) String() string { +func (s StartImageScanInput) String() string { return awsutil.Prettify(s) } // GoString returns the string representation -func (s SetRepositoryPolicyInput) GoString() string { +func (s StartImageScanInput) GoString() string { return s.String() } // Validate inspects the fields of the type to determine if they are valid. -func (s *SetRepositoryPolicyInput) Validate() error { - invalidParams := request.ErrInvalidParams{Context: "SetRepositoryPolicyInput"} - if s.PolicyText == nil { - invalidParams.Add(request.NewErrParamRequired("PolicyText")) +func (s *StartImageScanInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "StartImageScanInput"} + if s.ImageId == nil { + invalidParams.Add(request.NewErrParamRequired("ImageId")) } if s.RepositoryName == nil { invalidParams.Add(request.NewErrParamRequired("RepositoryName")) @@ -4888,6 +7929,11 @@ func (s *SetRepositoryPolicyInput) Validate() error { if s.RepositoryName != nil && len(*s.RepositoryName) < 2 { invalidParams.Add(request.NewErrParamMinLen("RepositoryName", 2)) } + if s.ImageId != nil { + if err := s.ImageId.Validate(); err != nil { + invalidParams.AddNested("ImageId", err.(request.ErrInvalidParams)) + } + } if invalidParams.Len() > 0 { return invalidParams @@ -4895,35 +7941,32 @@ func (s *SetRepositoryPolicyInput) Validate() error { return nil } -// SetForce sets the Force field's value. -func (s *SetRepositoryPolicyInput) SetForce(v bool) *SetRepositoryPolicyInput { - s.Force = &v - return s -} - -// SetPolicyText sets the PolicyText field's value. -func (s *SetRepositoryPolicyInput) SetPolicyText(v string) *SetRepositoryPolicyInput { - s.PolicyText = &v +// SetImageId sets the ImageId field's value. +func (s *StartImageScanInput) SetImageId(v *ImageIdentifier) *StartImageScanInput { + s.ImageId = v return s } // SetRegistryId sets the RegistryId field's value. -func (s *SetRepositoryPolicyInput) SetRegistryId(v string) *SetRepositoryPolicyInput { +func (s *StartImageScanInput) SetRegistryId(v string) *StartImageScanInput { s.RegistryId = &v return s } // SetRepositoryName sets the RepositoryName field's value. -func (s *SetRepositoryPolicyInput) SetRepositoryName(v string) *SetRepositoryPolicyInput { +func (s *StartImageScanInput) SetRepositoryName(v string) *StartImageScanInput { s.RepositoryName = &v return s } -type SetRepositoryPolicyOutput struct { +type StartImageScanOutput struct { _ struct{} `type:"structure"` - // The JSON repository policy text applied to the repository. - PolicyText *string `locationName:"policyText" type:"string"` + // An object with identifying information for an Amazon ECR image. + ImageId *ImageIdentifier `locationName:"imageId" type:"structure"` + + // The current state of the scan. + ImageScanStatus *ImageScanStatus `locationName:"imageScanStatus" type:"structure"` // The registry ID associated with the request. RegistryId *string `locationName:"registryId" type:"string"` @@ -4933,29 +7976,35 @@ type SetRepositoryPolicyOutput struct { } // String returns the string representation -func (s SetRepositoryPolicyOutput) String() string { +func (s StartImageScanOutput) String() string { return awsutil.Prettify(s) } // GoString returns the string representation -func (s SetRepositoryPolicyOutput) GoString() string { +func (s StartImageScanOutput) GoString() string { return s.String() } -// SetPolicyText sets the PolicyText field's value. -func (s *SetRepositoryPolicyOutput) SetPolicyText(v string) *SetRepositoryPolicyOutput { - s.PolicyText = &v +// SetImageId sets the ImageId field's value. +func (s *StartImageScanOutput) SetImageId(v *ImageIdentifier) *StartImageScanOutput { + s.ImageId = v + return s +} + +// SetImageScanStatus sets the ImageScanStatus field's value. +func (s *StartImageScanOutput) SetImageScanStatus(v *ImageScanStatus) *StartImageScanOutput { + s.ImageScanStatus = v return s } // SetRegistryId sets the RegistryId field's value. -func (s *SetRepositoryPolicyOutput) SetRegistryId(v string) *SetRepositoryPolicyOutput { +func (s *StartImageScanOutput) SetRegistryId(v string) *StartImageScanOutput { s.RegistryId = &v return s } // SetRepositoryName sets the RepositoryName field's value. -func (s *SetRepositoryPolicyOutput) SetRepositoryName(v string) *SetRepositoryPolicyOutput { +func (s *StartImageScanOutput) SetRepositoryName(v string) *StartImageScanOutput { s.RepositoryName = &v return s } @@ -5074,6 +8123,237 @@ func (s *StartLifecyclePolicyPreviewOutput) SetStatus(v string) *StartLifecycleP return s } +// The metadata that you apply to a resource to help you categorize and organize +// them. Each tag consists of a key and an optional value, both of which you +// define. Tag keys can have a maximum character length of 128 characters, and +// tag values can have a maximum length of 256 characters. +type Tag struct { + _ struct{} `type:"structure"` + + // One part of a key-value pair that make up a tag. A key is a general label + // that acts like a category for more specific tag values. + Key *string `type:"string"` + + // The optional part of a key-value pair that make up a tag. A value acts as + // a descriptor within a tag category (key). + Value *string `type:"string"` +} + +// String returns the string representation +func (s Tag) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s Tag) GoString() string { + return s.String() +} + +// SetKey sets the Key field's value. +func (s *Tag) SetKey(v string) *Tag { + s.Key = &v + return s +} + +// SetValue sets the Value field's value. +func (s *Tag) SetValue(v string) *Tag { + s.Value = &v + return s +} + +type TagResourceInput struct { + _ struct{} `type:"structure"` + + // The Amazon Resource Name (ARN) of the the resource to which to add tags. + // Currently, the only supported resource is an Amazon ECR repository. + // + // ResourceArn is a required field + ResourceArn *string `locationName:"resourceArn" type:"string" required:"true"` + + // The tags to add to the resource. A tag is an array of key-value pairs. Tag + // keys can have a maximum character length of 128 characters, and tag values + // can have a maximum length of 256 characters. + // + // Tags is a required field + Tags []*Tag `locationName:"tags" type:"list" required:"true"` +} + +// String returns the string representation +func (s TagResourceInput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s TagResourceInput) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *TagResourceInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "TagResourceInput"} + if s.ResourceArn == nil { + invalidParams.Add(request.NewErrParamRequired("ResourceArn")) + } + if s.Tags == nil { + invalidParams.Add(request.NewErrParamRequired("Tags")) + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetResourceArn sets the ResourceArn field's value. +func (s *TagResourceInput) SetResourceArn(v string) *TagResourceInput { + s.ResourceArn = &v + return s +} + +// SetTags sets the Tags field's value. +func (s *TagResourceInput) SetTags(v []*Tag) *TagResourceInput { + s.Tags = v + return s +} + +type TagResourceOutput struct { + _ struct{} `type:"structure"` +} + +// String returns the string representation +func (s TagResourceOutput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s TagResourceOutput) GoString() string { + return s.String() +} + +// The list of tags on the repository is over the limit. The maximum number +// of tags that can be applied to a repository is 50. +type TooManyTagsException struct { + _ struct{} `type:"structure"` + respMetadata protocol.ResponseMetadata + + Message_ *string `locationName:"message" type:"string"` +} + +// String returns the string representation +func (s TooManyTagsException) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s TooManyTagsException) GoString() string { + return s.String() +} + +func newErrorTooManyTagsException(v protocol.ResponseMetadata) error { + return &TooManyTagsException{ + respMetadata: v, + } +} + +// Code returns the exception type name. +func (s TooManyTagsException) Code() string { + return "TooManyTagsException" +} + +// Message returns the exception's message. +func (s TooManyTagsException) Message() string { + if s.Message_ != nil { + return *s.Message_ + } + return "" +} + +// OrigErr always returns nil, satisfies awserr.Error interface. +func (s TooManyTagsException) OrigErr() error { + return nil +} + +func (s TooManyTagsException) Error() string { + return fmt.Sprintf("%s: %s", s.Code(), s.Message()) +} + +// Status code returns the HTTP status code for the request's response error. +func (s TooManyTagsException) StatusCode() int { + return s.respMetadata.StatusCode +} + +// RequestID returns the service's response RequestID for request. +func (s TooManyTagsException) RequestID() string { + return s.respMetadata.RequestID +} + +type UntagResourceInput struct { + _ struct{} `type:"structure"` + + // The Amazon Resource Name (ARN) of the resource from which to remove tags. + // Currently, the only supported resource is an Amazon ECR repository. + // + // ResourceArn is a required field + ResourceArn *string `locationName:"resourceArn" type:"string" required:"true"` + + // The keys of the tags to be removed. + // + // TagKeys is a required field + TagKeys []*string `locationName:"tagKeys" type:"list" required:"true"` +} + +// String returns the string representation +func (s UntagResourceInput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s UntagResourceInput) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *UntagResourceInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "UntagResourceInput"} + if s.ResourceArn == nil { + invalidParams.Add(request.NewErrParamRequired("ResourceArn")) + } + if s.TagKeys == nil { + invalidParams.Add(request.NewErrParamRequired("TagKeys")) + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetResourceArn sets the ResourceArn field's value. +func (s *UntagResourceInput) SetResourceArn(v string) *UntagResourceInput { + s.ResourceArn = &v + return s +} + +// SetTagKeys sets the TagKeys field's value. +func (s *UntagResourceInput) SetTagKeys(v []*string) *UntagResourceInput { + s.TagKeys = v + return s +} + +type UntagResourceOutput struct { + _ struct{} `type:"structure"` +} + +// String returns the string representation +func (s UntagResourceOutput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s UntagResourceOutput) GoString() string { + return s.String() +} + type UploadLayerPartInput struct { _ struct{} `type:"structure"` @@ -5234,6 +8514,84 @@ func (s *UploadLayerPartOutput) SetUploadId(v string) *UploadLayerPartOutput { return s } +// The upload could not be found, or the specified upload id is not valid for +// this repository. +type UploadNotFoundException struct { + _ struct{} `type:"structure"` + respMetadata protocol.ResponseMetadata + + // The error message associated with the exception. + Message_ *string `locationName:"message" type:"string"` +} + +// String returns the string representation +func (s UploadNotFoundException) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s UploadNotFoundException) GoString() string { + return s.String() +} + +func newErrorUploadNotFoundException(v protocol.ResponseMetadata) error { + return &UploadNotFoundException{ + respMetadata: v, + } +} + +// Code returns the exception type name. +func (s UploadNotFoundException) Code() string { + return "UploadNotFoundException" +} + +// Message returns the exception's message. +func (s UploadNotFoundException) Message() string { + if s.Message_ != nil { + return *s.Message_ + } + return "" +} + +// OrigErr always returns nil, satisfies awserr.Error interface. +func (s UploadNotFoundException) OrigErr() error { + return nil +} + +func (s UploadNotFoundException) Error() string { + return fmt.Sprintf("%s: %s", s.Code(), s.Message()) +} + +// Status code returns the HTTP status code for the request's response error. +func (s UploadNotFoundException) StatusCode() int { + return s.respMetadata.StatusCode +} + +// RequestID returns the service's response RequestID for request. +func (s UploadNotFoundException) RequestID() string { + return s.respMetadata.RequestID +} + +const ( + // FindingSeverityInformational is a FindingSeverity enum value + FindingSeverityInformational = "INFORMATIONAL" + + // FindingSeverityLow is a FindingSeverity enum value + FindingSeverityLow = "LOW" + + // FindingSeverityMedium is a FindingSeverity enum value + FindingSeverityMedium = "MEDIUM" + + // FindingSeverityHigh is a FindingSeverity enum value + FindingSeverityHigh = "HIGH" + + // FindingSeverityCritical is a FindingSeverity enum value + FindingSeverityCritical = "CRITICAL" + + // FindingSeverityUndefined is a FindingSeverity enum value + FindingSeverityUndefined = "UNDEFINED" +) + const ( // ImageActionTypeExpire is a ImageActionType enum value ImageActionTypeExpire = "EXPIRE" @@ -5256,6 +8614,14 @@ const ( ImageFailureCodeMissingDigestAndTag = "MissingDigestAndTag" ) +const ( + // ImageTagMutabilityMutable is a ImageTagMutability enum value + ImageTagMutabilityMutable = "MUTABLE" + + // ImageTagMutabilityImmutable is a ImageTagMutability enum value + ImageTagMutabilityImmutable = "IMMUTABLE" +) + const ( // LayerAvailabilityAvailable is a LayerAvailability enum value LayerAvailabilityAvailable = "AVAILABLE" @@ -5286,10 +8652,24 @@ const ( LifecyclePolicyPreviewStatusFailed = "FAILED" ) +const ( + // ScanStatusInProgress is a ScanStatus enum value + ScanStatusInProgress = "IN_PROGRESS" + + // ScanStatusComplete is a ScanStatus enum value + ScanStatusComplete = "COMPLETE" + + // ScanStatusFailed is a ScanStatus enum value + ScanStatusFailed = "FAILED" +) + const ( // TagStatusTagged is a TagStatus enum value TagStatusTagged = "TAGGED" // TagStatusUntagged is a TagStatus enum value TagStatusUntagged = "UNTAGGED" + + // TagStatusAny is a TagStatus enum value + TagStatusAny = "ANY" ) diff --git a/vendor/github.com/aws/aws-sdk-go/service/ecr/errors.go b/vendor/github.com/aws/aws-sdk-go/service/ecr/errors.go index 09e0595de..732d865bf 100644 --- a/vendor/github.com/aws/aws-sdk-go/service/ecr/errors.go +++ b/vendor/github.com/aws/aws-sdk-go/service/ecr/errors.go @@ -2,6 +2,10 @@ package ecr +import ( + "github.com/aws/aws-sdk-go/private/protocol" +) + const ( // ErrCodeEmptyUploadException for service response error code @@ -23,6 +27,13 @@ const ( // The image requested does not exist in the specified repository. ErrCodeImageNotFoundException = "ImageNotFoundException" + // ErrCodeImageTagAlreadyExistsException for service response error code + // "ImageTagAlreadyExistsException". + // + // The specified image is tagged with a tag that already exists. The repository + // is configured for tag immutability. + ErrCodeImageTagAlreadyExistsException = "ImageTagAlreadyExistsException" + // ErrCodeInvalidLayerException for service response error code // "InvalidLayerException". // @@ -44,6 +55,14 @@ const ( // API request. ErrCodeInvalidParameterException = "InvalidParameterException" + // ErrCodeInvalidTagParameterException for service response error code + // "InvalidTagParameterException". + // + // An invalid parameter has been specified. Tag keys can have a maximum character + // length of 128 characters, and tag values can have a maximum length of 256 + // characters. + ErrCodeInvalidTagParameterException = "InvalidTagParameterException" + // ErrCodeLayerAlreadyExistsException for service response error code // "LayerAlreadyExistsException". // @@ -94,7 +113,7 @@ const ( // // The operation did not succeed because it would have exceeded a service limit // for your account. For more information, see Amazon ECR Default Service Limits - // (http://docs.aws.amazon.com/AmazonECR/latest/userguide/service_limits.html) + // (https://docs.aws.amazon.com/AmazonECR/latest/userguide/service_limits.html) // in the Amazon Elastic Container Registry User Guide. ErrCodeLimitExceededException = "LimitExceededException" @@ -125,12 +144,26 @@ const ( // repository policy. ErrCodeRepositoryPolicyNotFoundException = "RepositoryPolicyNotFoundException" + // ErrCodeScanNotFoundException for service response error code + // "ScanNotFoundException". + // + // The specified image scan could not be found. Ensure that image scanning is + // enabled on the repository and try again. + ErrCodeScanNotFoundException = "ScanNotFoundException" + // ErrCodeServerException for service response error code // "ServerException". // // These errors are usually caused by a server-side issue. ErrCodeServerException = "ServerException" + // ErrCodeTooManyTagsException for service response error code + // "TooManyTagsException". + // + // The list of tags on the repository is over the limit. The maximum number + // of tags that can be applied to a repository is 50. + ErrCodeTooManyTagsException = "TooManyTagsException" + // ErrCodeUploadNotFoundException for service response error code // "UploadNotFoundException". // @@ -138,3 +171,30 @@ const ( // this repository. ErrCodeUploadNotFoundException = "UploadNotFoundException" ) + +var exceptionFromCode = map[string]func(protocol.ResponseMetadata) error{ + "EmptyUploadException": newErrorEmptyUploadException, + "ImageAlreadyExistsException": newErrorImageAlreadyExistsException, + "ImageNotFoundException": newErrorImageNotFoundException, + "ImageTagAlreadyExistsException": newErrorImageTagAlreadyExistsException, + "InvalidLayerException": newErrorInvalidLayerException, + "InvalidLayerPartException": newErrorInvalidLayerPartException, + "InvalidParameterException": newErrorInvalidParameterException, + "InvalidTagParameterException": newErrorInvalidTagParameterException, + "LayerAlreadyExistsException": newErrorLayerAlreadyExistsException, + "LayerInaccessibleException": newErrorLayerInaccessibleException, + "LayerPartTooSmallException": newErrorLayerPartTooSmallException, + "LayersNotFoundException": newErrorLayersNotFoundException, + "LifecyclePolicyNotFoundException": newErrorLifecyclePolicyNotFoundException, + "LifecyclePolicyPreviewInProgressException": newErrorLifecyclePolicyPreviewInProgressException, + "LifecyclePolicyPreviewNotFoundException": newErrorLifecyclePolicyPreviewNotFoundException, + "LimitExceededException": newErrorLimitExceededException, + "RepositoryAlreadyExistsException": newErrorRepositoryAlreadyExistsException, + "RepositoryNotEmptyException": newErrorRepositoryNotEmptyException, + "RepositoryNotFoundException": newErrorRepositoryNotFoundException, + "RepositoryPolicyNotFoundException": newErrorRepositoryPolicyNotFoundException, + "ScanNotFoundException": newErrorScanNotFoundException, + "ServerException": newErrorServerException, + "TooManyTagsException": newErrorTooManyTagsException, + "UploadNotFoundException": newErrorUploadNotFoundException, +} diff --git a/vendor/github.com/aws/aws-sdk-go/service/ecr/service.go b/vendor/github.com/aws/aws-sdk-go/service/ecr/service.go index 95de12e25..c4392395c 100644 --- a/vendor/github.com/aws/aws-sdk-go/service/ecr/service.go +++ b/vendor/github.com/aws/aws-sdk-go/service/ecr/service.go @@ -8,6 +8,7 @@ import ( "github.com/aws/aws-sdk-go/aws/client/metadata" "github.com/aws/aws-sdk-go/aws/request" "github.com/aws/aws-sdk-go/aws/signer/v4" + "github.com/aws/aws-sdk-go/private/protocol" "github.com/aws/aws-sdk-go/private/protocol/jsonrpc" ) @@ -29,8 +30,9 @@ var initRequest func(*request.Request) // Service information constants const ( - ServiceName = "ecr" // Service endpoint prefix API calls made to. - EndpointsID = ServiceName // Service ID for Regions and Endpoints metadata. + ServiceName = "ecr" // Name of service. + EndpointsID = "api.ecr" // ID to lookup a service endpoint with. + ServiceID = "ECR" // ServiceID is a unique identifier of a specific service. ) // New creates a new instance of the ECR client with a session. @@ -38,6 +40,8 @@ const ( // aws.Config parameter to add your extra config. // // Example: +// mySession := session.Must(session.NewSession()) +// // // Create a ECR client from just a session. // svc := ecr.New(mySession) // @@ -45,18 +49,23 @@ const ( // svc := ecr.New(mySession, aws.NewConfig().WithRegion("us-west-2")) func New(p client.ConfigProvider, cfgs ...*aws.Config) *ECR { c := p.ClientConfig(EndpointsID, cfgs...) - return newClient(*c.Config, c.Handlers, c.Endpoint, c.SigningRegion, c.SigningName) + if c.SigningNameDerived || len(c.SigningName) == 0 { + c.SigningName = "ecr" + } + return newClient(*c.Config, c.Handlers, c.PartitionID, c.Endpoint, c.SigningRegion, c.SigningName) } // newClient creates, initializes and returns a new service client instance. -func newClient(cfg aws.Config, handlers request.Handlers, endpoint, signingRegion, signingName string) *ECR { +func newClient(cfg aws.Config, handlers request.Handlers, partitionID, endpoint, signingRegion, signingName string) *ECR { svc := &ECR{ Client: client.New( cfg, metadata.ClientInfo{ ServiceName: ServiceName, + ServiceID: ServiceID, SigningName: signingName, SigningRegion: signingRegion, + PartitionID: partitionID, Endpoint: endpoint, APIVersion: "2015-09-21", JSONVersion: "1.1", @@ -71,7 +80,9 @@ func newClient(cfg aws.Config, handlers request.Handlers, endpoint, signingRegio svc.Handlers.Build.PushBackNamed(jsonrpc.BuildHandler) svc.Handlers.Unmarshal.PushBackNamed(jsonrpc.UnmarshalHandler) svc.Handlers.UnmarshalMeta.PushBackNamed(jsonrpc.UnmarshalMetaHandler) - svc.Handlers.UnmarshalError.PushBackNamed(jsonrpc.UnmarshalErrorHandler) + svc.Handlers.UnmarshalError.PushBackNamed( + protocol.NewUnmarshalErrorHandler(jsonrpc.NewUnmarshalTypedError(exceptionFromCode)).NamedHandler(), + ) // Run custom client initialization if present if initClient != nil { diff --git a/vendor/github.com/aws/aws-sdk-go/service/ecr/waiters.go b/vendor/github.com/aws/aws-sdk-go/service/ecr/waiters.go new file mode 100644 index 000000000..4b6f88e4e --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/service/ecr/waiters.go @@ -0,0 +1,112 @@ +// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT. + +package ecr + +import ( + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/request" +) + +// WaitUntilImageScanComplete uses the Amazon ECR API operation +// DescribeImageScanFindings to wait for a condition to be met before returning. +// If the condition is not met within the max attempt window, an error will +// be returned. +func (c *ECR) WaitUntilImageScanComplete(input *DescribeImageScanFindingsInput) error { + return c.WaitUntilImageScanCompleteWithContext(aws.BackgroundContext(), input) +} + +// WaitUntilImageScanCompleteWithContext is an extended version of WaitUntilImageScanComplete. +// With the support for passing in a context and options to configure the +// Waiter and the underlying request options. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *ECR) WaitUntilImageScanCompleteWithContext(ctx aws.Context, input *DescribeImageScanFindingsInput, opts ...request.WaiterOption) error { + w := request.Waiter{ + Name: "WaitUntilImageScanComplete", + MaxAttempts: 60, + Delay: request.ConstantWaiterDelay(5 * time.Second), + Acceptors: []request.WaiterAcceptor{ + { + State: request.SuccessWaiterState, + Matcher: request.PathWaiterMatch, Argument: "imageScanStatus.status", + Expected: "COMPLETE", + }, + { + State: request.FailureWaiterState, + Matcher: request.PathWaiterMatch, Argument: "imageScanStatus.status", + Expected: "FAILED", + }, + }, + Logger: c.Config.Logger, + NewRequest: func(opts []request.Option) (*request.Request, error) { + var inCpy *DescribeImageScanFindingsInput + if input != nil { + tmp := *input + inCpy = &tmp + } + req, _ := c.DescribeImageScanFindingsRequest(inCpy) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return req, nil + }, + } + w.ApplyOptions(opts...) + + return w.WaitWithContext(ctx) +} + +// WaitUntilLifecyclePolicyPreviewComplete uses the Amazon ECR API operation +// GetLifecyclePolicyPreview to wait for a condition to be met before returning. +// If the condition is not met within the max attempt window, an error will +// be returned. +func (c *ECR) WaitUntilLifecyclePolicyPreviewComplete(input *GetLifecyclePolicyPreviewInput) error { + return c.WaitUntilLifecyclePolicyPreviewCompleteWithContext(aws.BackgroundContext(), input) +} + +// WaitUntilLifecyclePolicyPreviewCompleteWithContext is an extended version of WaitUntilLifecyclePolicyPreviewComplete. +// With the support for passing in a context and options to configure the +// Waiter and the underlying request options. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *ECR) WaitUntilLifecyclePolicyPreviewCompleteWithContext(ctx aws.Context, input *GetLifecyclePolicyPreviewInput, opts ...request.WaiterOption) error { + w := request.Waiter{ + Name: "WaitUntilLifecyclePolicyPreviewComplete", + MaxAttempts: 20, + Delay: request.ConstantWaiterDelay(5 * time.Second), + Acceptors: []request.WaiterAcceptor{ + { + State: request.SuccessWaiterState, + Matcher: request.PathWaiterMatch, Argument: "status", + Expected: "COMPLETE", + }, + { + State: request.FailureWaiterState, + Matcher: request.PathWaiterMatch, Argument: "status", + Expected: "FAILED", + }, + }, + Logger: c.Config.Logger, + NewRequest: func(opts []request.Option) (*request.Request, error) { + var inCpy *GetLifecyclePolicyPreviewInput + if input != nil { + tmp := *input + inCpy = &tmp + } + req, _ := c.GetLifecyclePolicyPreviewRequest(inCpy) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return req, nil + }, + } + w.ApplyOptions(opts...) + + return w.WaitWithContext(ctx) +} diff --git a/vendor/github.com/aws/aws-sdk-go/service/sqs/api.go b/vendor/github.com/aws/aws-sdk-go/service/sqs/api.go index 1b42a7dd6..bc087b5b6 100644 --- a/vendor/github.com/aws/aws-sdk-go/service/sqs/api.go +++ b/vendor/github.com/aws/aws-sdk-go/service/sqs/api.go @@ -17,7 +17,7 @@ const opAddPermission = "AddPermission" // AddPermissionRequest generates a "aws/request.Request" representing the // client's request for the AddPermission operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -51,33 +51,43 @@ func (c *SQS) AddPermissionRequest(input *AddPermissionInput) (req *request.Requ output = &AddPermissionOutput{} req = c.newRequest(op, input, output) - req.Handlers.Unmarshal.Remove(query.UnmarshalHandler) - req.Handlers.Unmarshal.PushBackNamed(protocol.UnmarshalDiscardBodyHandler) + req.Handlers.Unmarshal.Swap(query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler) return } // AddPermission API operation for Amazon Simple Queue Service. // -// Adds a permission to a queue for a specific principal (http://docs.aws.amazon.com/general/latest/gr/glos-chap.html#P). +// Adds a permission to a queue for a specific principal (https://docs.aws.amazon.com/general/latest/gr/glos-chap.html#P). // This allows sharing access to the queue. // // When you create a queue, you have full control access rights for the queue. // Only you, the owner of the queue, can grant or deny permissions to the queue. -// For more information about these permissions, see Shared Queues (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/acp-overview.html) +// For more information about these permissions, see Allow Developers to Write +// Messages to a Shared Queue (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-writing-an-sqs-policy.html#write-messages-to-shared-queue) // in the Amazon Simple Queue Service Developer Guide. // -// AddPermission writes an Amazon-SQS-generated policy. If you want to write -// your own policy, use SetQueueAttributes to upload your policy. For more information -// about writing your own policy, see Using The Access Policy Language (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/AccessPolicyLanguage.html) -// in the Amazon Simple Queue Service Developer Guide. +// * AddPermission generates a policy for you. You can use SetQueueAttributes +// to upload your policy. For more information, see Using Custom Policies +// with the Amazon SQS Access Policy Language (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-creating-custom-policies.html) +// in the Amazon Simple Queue Service Developer Guide. +// +// * An Amazon SQS policy can have a maximum of 7 actions. +// +// * To remove the ability to change queue permissions, you must deny permission +// to the AddPermission, RemovePermission, and SetQueueAttributes actions +// in your IAM policy. // // Some actions take lists of parameters. These lists are specified using the // param.n notation. Values of n are integers starting from 1. For example, // a parameter list with two elements looks like this: // -// &Attribute.1=this +// &Attribute.1=first +// +// &Attribute.2=second // -// &Attribute.2=that +// Cross-account permissions don't apply to this action. For more information, +// see Grant Cross-Account Permissions to a Role and a User Name (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-customer-managed-policy-examples.html#grant-cross-account-permissions-to-role-and-user-name) +// in the Amazon Simple Queue Service Developer Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -88,10 +98,10 @@ func (c *SQS) AddPermissionRequest(input *AddPermissionInput) (req *request.Requ // // Returned Error Codes: // * ErrCodeOverLimit "OverLimit" -// The action that you requested would violate a limit. For example, ReceiveMessage -// returns this error if the maximum number of inflight messages is reached. -// AddPermission returns this error if the maximum number of permissions for -// the queue is reached. +// The specified action violates a limit. For example, ReceiveMessage returns +// this error if the maximum number of inflight messages is reached and AddPermission +// returns this error if the maximum number of permissions for the queue is +// reached. // // See also, https://docs.aws.amazon.com/goto/WebAPI/sqs-2012-11-05/AddPermission func (c *SQS) AddPermission(input *AddPermissionInput) (*AddPermissionOutput, error) { @@ -120,7 +130,7 @@ const opChangeMessageVisibility = "ChangeMessageVisibility" // ChangeMessageVisibilityRequest generates a "aws/request.Request" representing the // client's request for the ChangeMessageVisibility operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -154,38 +164,53 @@ func (c *SQS) ChangeMessageVisibilityRequest(input *ChangeMessageVisibilityInput output = &ChangeMessageVisibilityOutput{} req = c.newRequest(op, input, output) - req.Handlers.Unmarshal.Remove(query.UnmarshalHandler) - req.Handlers.Unmarshal.PushBackNamed(protocol.UnmarshalDiscardBodyHandler) + req.Handlers.Unmarshal.Swap(query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler) return } // ChangeMessageVisibility API operation for Amazon Simple Queue Service. // // Changes the visibility timeout of a specified message in a queue to a new -// value. The maximum allowed timeout value is 12 hours. Thus, you can't extend -// the timeout of a message in an existing queue to more than a total visibility -// timeout of 12 hours. For more information, see Visibility Timeout (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html) +// value. The default visibility timeout for a message is 30 seconds. The minimum +// is 0 seconds. The maximum is 12 hours. For more information, see Visibility +// Timeout (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html) // in the Amazon Simple Queue Service Developer Guide. // // For example, you have a message with a visibility timeout of 5 minutes. After -// 3 minutes, you call ChangeMessageVisiblity with a timeout of 10 minutes. -// At that time, the timeout for the message is extended by 10 minutes beyond -// the time of the ChangeMessageVisibility action. This results in a total visibility -// timeout of 13 minutes. You can continue to call the ChangeMessageVisibility -// to extend the visibility timeout to a maximum of 12 hours. If you try to -// extend the visibility timeout beyond 12 hours, your request is rejected. +// 3 minutes, you call ChangeMessageVisibility with a timeout of 10 minutes. +// You can continue to call ChangeMessageVisibility to extend the visibility +// timeout to the maximum allowed time. If you try to extend the visibility +// timeout beyond the maximum, your request is rejected. +// +// An Amazon SQS message has three basic states: +// +// Sent to a queue by a producer. +// +// Received from the queue by a consumer. +// +// Deleted from the queue. // -// A message is considered to be in flight after it's received from a queue -// by a consumer, but not yet deleted from the queue. +// A message is considered to be stored after it is sent to a queue by a producer, +// but not yet received from the queue by a consumer (that is, between states +// 1 and 2). There is no limit to the number of stored messages. A message is +// considered to be in flight after it is received from a queue by a consumer, +// but not yet deleted from the queue (that is, between states 2 and 3). There +// is a limit to the number of inflight messages. // -// For standard queues, there can be a maximum of 120,000 inflight messages -// per queue. If you reach this limit, Amazon SQS returns the OverLimit error -// message. To avoid reaching the limit, you should delete messages from the -// queue after they're processed. You can also increase the number of queues -// you use to process your messages. +// Limits that apply to inflight messages are unrelated to the unlimited number +// of stored messages. // -// For FIFO queues, there can be a maximum of 20,000 inflight messages per queue. -// If you reach this limit, Amazon SQS returns no error messages. +// For most standard queues (depending on queue traffic and message backlog), +// there can be a maximum of approximately 120,000 inflight messages (received +// from a queue by a consumer, but not yet deleted from the queue). If you reach +// this limit, Amazon SQS returns the OverLimit error message. To avoid reaching +// the limit, you should delete messages from the queue after they're processed. +// You can also increase the number of queues you use to process your messages. +// To request a limit increase, file a support request (https://console.aws.amazon.com/support/home#/case/create?issueType=service-limit-increase&limitType=service-code-sqs). +// +// For FIFO queues, there can be a maximum of 20,000 inflight messages (received +// from a queue by a consumer, but not yet deleted from the queue). If you reach +// this limit, Amazon SQS returns no error messages. // // If you attempt to set the VisibilityTimeout to a value greater than the maximum // time left, Amazon SQS returns an error. Amazon SQS doesn't automatically @@ -207,10 +232,10 @@ func (c *SQS) ChangeMessageVisibilityRequest(input *ChangeMessageVisibilityInput // // Returned Error Codes: // * ErrCodeMessageNotInflight "AWS.SimpleQueueService.MessageNotInflight" -// The message referred to isn't in flight. +// The specified message isn't in flight. // // * ErrCodeReceiptHandleIsInvalid "ReceiptHandleIsInvalid" -// The receipt handle provided isn't valid. +// The specified receipt handle isn't valid. // // See also, https://docs.aws.amazon.com/goto/WebAPI/sqs-2012-11-05/ChangeMessageVisibility func (c *SQS) ChangeMessageVisibility(input *ChangeMessageVisibilityInput) (*ChangeMessageVisibilityOutput, error) { @@ -239,7 +264,7 @@ const opChangeMessageVisibilityBatch = "ChangeMessageVisibilityBatch" // ChangeMessageVisibilityBatchRequest generates a "aws/request.Request" representing the // client's request for the ChangeMessageVisibilityBatch operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -291,9 +316,9 @@ func (c *SQS) ChangeMessageVisibilityBatchRequest(input *ChangeMessageVisibility // param.n notation. Values of n are integers starting from 1. For example, // a parameter list with two elements looks like this: // -// &Attribute.1=this +// &Attribute.1=first // -// &Attribute.2=that +// &Attribute.2=second // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -342,7 +367,7 @@ const opCreateQueue = "CreateQueue" // CreateQueueRequest generates a "aws/request.Request" representing the // client's request for the CreateQueue operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -385,13 +410,11 @@ func (c *SQS) CreateQueueRequest(input *CreateQueueInput) (req *request.Request, // in the request. Keep the following caveats in mind: // // * If you don't specify the FifoQueue attribute, Amazon SQS creates a standard -// queue. -// -// You can't change the queue type after you create it and you can't convert -// an existing standard queue into a FIFO queue. You must either create a -// new FIFO queue for your application or delete your existing standard queue -// and recreate it as a FIFO queue. For more information, see Moving From -// a Standard Queue to a FIFO Queue (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html#FIFO-queues-moving) +// queue. You can't change the queue type after you create it and you can't +// convert an existing standard queue into a FIFO queue. You must either +// create a new FIFO queue for your application or delete your existing standard +// queue and recreate it as a FIFO queue. For more information, see Moving +// From a Standard Queue to a FIFO Queue (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html#FIFO-queues-moving) // in the Amazon Simple Queue Service Developer Guide. // // * If you don't provide a value for an attribute, the queue is created @@ -401,7 +424,7 @@ func (c *SQS) CreateQueueRequest(input *CreateQueueInput) (req *request.Request, // a queue with the same name. // // To successfully create a new queue, you must provide a queue name that adheres -// to the limits related to queues (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/limits-queues.html) +// to the limits related to queues (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/limits-queues.html) // and is unique within the scope of your queues. // // To get the queue URL, use the GetQueueUrl action. GetQueueUrl requires only @@ -418,9 +441,13 @@ func (c *SQS) CreateQueueRequest(input *CreateQueueInput) (req *request.Request, // param.n notation. Values of n are integers starting from 1. For example, // a parameter list with two elements looks like this: // -// &Attribute.1=this +// &Attribute.1=first // -// &Attribute.2=that +// &Attribute.2=second +// +// Cross-account permissions don't apply to this action. For more information, +// see Grant Cross-Account Permissions to a Role and a User Name (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-customer-managed-policy-examples.html#grant-cross-account-permissions-to-role-and-user-name) +// in the Amazon Simple Queue Service Developer Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -432,10 +459,10 @@ func (c *SQS) CreateQueueRequest(input *CreateQueueInput) (req *request.Request, // Returned Error Codes: // * ErrCodeQueueDeletedRecently "AWS.SimpleQueueService.QueueDeletedRecently" // You must wait 60 seconds after deleting a queue before you can create another -// one with the same name. +// queue with the same name. // // * ErrCodeQueueNameExists "QueueAlreadyExists" -// A queue already exists with this name. Amazon SQS returns this error only +// A queue with this name already exists. Amazon SQS returns this error only // if the request includes attributes whose values differ from those of the // existing queue. // @@ -466,7 +493,7 @@ const opDeleteMessage = "DeleteMessage" // DeleteMessageRequest generates a "aws/request.Request" representing the // client's request for the DeleteMessage operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -500,33 +527,32 @@ func (c *SQS) DeleteMessageRequest(input *DeleteMessageInput) (req *request.Requ output = &DeleteMessageOutput{} req = c.newRequest(op, input, output) - req.Handlers.Unmarshal.Remove(query.UnmarshalHandler) - req.Handlers.Unmarshal.PushBackNamed(protocol.UnmarshalDiscardBodyHandler) + req.Handlers.Unmarshal.Swap(query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler) return } // DeleteMessage API operation for Amazon Simple Queue Service. // -// Deletes the specified message from the specified queue. You specify the message -// by using the message's receipt handle and not the MessageId you receive when -// you send the message. Even if the message is locked by another reader due -// to the visibility timeout setting, it is still deleted from the queue. If -// you leave a message in the queue for longer than the queue's configured retention -// period, Amazon SQS automatically deletes the message. +// Deletes the specified message from the specified queue. To select the message +// to delete, use the ReceiptHandle of the message (not the MessageId which +// you receive when you send the message). Amazon SQS can delete a message from +// a queue even if a visibility timeout setting causes the message to be locked +// by another consumer. Amazon SQS automatically deletes messages left in a +// queue longer than the retention period configured for the queue. // -// The receipt handle is associated with a specific instance of receiving the -// message. If you receive a message more than once, the receipt handle you -// get each time you receive the message is different. If you don't provide -// the most recently received receipt handle for the message when you use the -// DeleteMessage action, the request succeeds, but the message might not be -// deleted. +// The ReceiptHandle is associated with a specific instance of receiving a message. +// If you receive a message more than once, the ReceiptHandle is different each +// time you receive a message. When you use the DeleteMessage action, you must +// provide the most recently received ReceiptHandle for the message (otherwise, +// the request succeeds, but the message might not be deleted). // // For standard queues, it is possible to receive a message even after you delete -// it. This might happen on rare occasions if one of the servers storing a copy -// of the message is unavailable when you send the request to delete the message. -// The copy remains on the server and might be returned to you on a subsequent -// receive request. You should ensure that your application is idempotent, so -// that receiving a message more than once does not cause issues. +// it. This might happen on rare occasions if one of the servers which stores +// a copy of the message is unavailable when you send the request to delete +// the message. The copy remains on the server and might be returned to you +// during a subsequent receive request. You should ensure that your application +// is idempotent, so that receiving a message more than once does not cause +// issues. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -537,10 +563,10 @@ func (c *SQS) DeleteMessageRequest(input *DeleteMessageInput) (req *request.Requ // // Returned Error Codes: // * ErrCodeInvalidIdFormat "InvalidIdFormat" -// The receipt handle isn't valid for the current version. +// The specified receipt handle isn't valid for the current version. // // * ErrCodeReceiptHandleIsInvalid "ReceiptHandleIsInvalid" -// The receipt handle provided isn't valid. +// The specified receipt handle isn't valid. // // See also, https://docs.aws.amazon.com/goto/WebAPI/sqs-2012-11-05/DeleteMessage func (c *SQS) DeleteMessage(input *DeleteMessageInput) (*DeleteMessageOutput, error) { @@ -569,7 +595,7 @@ const opDeleteMessageBatch = "DeleteMessageBatch" // DeleteMessageBatchRequest generates a "aws/request.Request" representing the // client's request for the DeleteMessageBatch operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -620,9 +646,9 @@ func (c *SQS) DeleteMessageBatchRequest(input *DeleteMessageBatchInput) (req *re // param.n notation. Values of n are integers starting from 1. For example, // a parameter list with two elements looks like this: // -// &Attribute.1=this +// &Attribute.1=first // -// &Attribute.2=that +// &Attribute.2=second // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -671,7 +697,7 @@ const opDeleteQueue = "DeleteQueue" // DeleteQueueRequest generates a "aws/request.Request" representing the // client's request for the DeleteQueue operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -705,8 +731,7 @@ func (c *SQS) DeleteQueueRequest(input *DeleteQueueInput) (req *request.Request, output = &DeleteQueueOutput{} req = c.newRequest(op, input, output) - req.Handlers.Unmarshal.Remove(query.UnmarshalHandler) - req.Handlers.Unmarshal.PushBackNamed(protocol.UnmarshalDiscardBodyHandler) + req.Handlers.Unmarshal.Swap(query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler) return } @@ -726,6 +751,10 @@ func (c *SQS) DeleteQueueRequest(input *DeleteQueueInput) (req *request.Request, // When you delete a queue, you must wait at least 60 seconds before creating // a queue with the same name. // +// Cross-account permissions don't apply to this action. For more information, +// see Grant Cross-Account Permissions to a Role and a User Name (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-customer-managed-policy-examples.html#grant-cross-account-permissions-to-role-and-user-name) +// in the Amazon Simple Queue Service Developer Guide. +// // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about // the error. @@ -759,7 +788,7 @@ const opGetQueueAttributes = "GetQueueAttributes" // GetQueueAttributesRequest generates a "aws/request.Request" representing the // client's request for the GetQueueAttributes operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -800,16 +829,16 @@ func (c *SQS) GetQueueAttributesRequest(input *GetQueueAttributesInput) (req *re // // Gets attributes for the specified queue. // -// To determine whether a queue is FIFO (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html), +// To determine whether a queue is FIFO (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html), // you can check whether QueueName ends with the .fifo suffix. // // Some actions take lists of parameters. These lists are specified using the // param.n notation. Values of n are integers starting from 1. For example, // a parameter list with two elements looks like this: // -// &Attribute.1=this +// &Attribute.1=first // -// &Attribute.2=that +// &Attribute.2=second // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -820,7 +849,7 @@ func (c *SQS) GetQueueAttributesRequest(input *GetQueueAttributesInput) (req *re // // Returned Error Codes: // * ErrCodeInvalidAttributeName "InvalidAttributeName" -// The attribute referred to doesn't exist. +// The specified attribute doesn't exist. // // See also, https://docs.aws.amazon.com/goto/WebAPI/sqs-2012-11-05/GetQueueAttributes func (c *SQS) GetQueueAttributes(input *GetQueueAttributesInput) (*GetQueueAttributesOutput, error) { @@ -849,7 +878,7 @@ const opGetQueueUrl = "GetQueueUrl" // GetQueueUrlRequest generates a "aws/request.Request" representing the // client's request for the GetQueueUrl operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -888,13 +917,13 @@ func (c *SQS) GetQueueUrlRequest(input *GetQueueUrlInput) (req *request.Request, // GetQueueUrl API operation for Amazon Simple Queue Service. // -// Returns the URL of an existing queue. This action provides a simple way to -// retrieve the URL of an Amazon SQS queue. +// Returns the URL of an existing Amazon SQS queue. // // To access a queue that belongs to another AWS account, use the QueueOwnerAWSAccountId // parameter to specify the account ID of the queue's owner. The queue's owner // must grant you permission to access the queue. For more information about -// shared queue access, see AddPermission or see Shared Queues (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/acp-overview.html) +// shared queue access, see AddPermission or see Allow Developers to Write Messages +// to a Shared Queue (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-writing-an-sqs-policy.html#write-messages-to-shared-queue) // in the Amazon Simple Queue Service Developer Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions @@ -906,7 +935,7 @@ func (c *SQS) GetQueueUrlRequest(input *GetQueueUrlInput) (req *request.Request, // // Returned Error Codes: // * ErrCodeQueueDoesNotExist "AWS.SimpleQueueService.NonExistentQueue" -// The queue referred to doesn't exist. +// The specified queue doesn't exist. // // See also, https://docs.aws.amazon.com/goto/WebAPI/sqs-2012-11-05/GetQueueUrl func (c *SQS) GetQueueUrl(input *GetQueueUrlInput) (*GetQueueUrlOutput, error) { @@ -935,7 +964,7 @@ const opListDeadLetterSourceQueues = "ListDeadLetterSourceQueues" // ListDeadLetterSourceQueuesRequest generates a "aws/request.Request" representing the // client's request for the ListDeadLetterSourceQueues operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -978,7 +1007,7 @@ func (c *SQS) ListDeadLetterSourceQueuesRequest(input *ListDeadLetterSourceQueue // configured with a dead-letter queue. // // For more information about using dead-letter queues, see Using Amazon SQS -// Dead-Letter Queues (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html) +// Dead-Letter Queues (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html) // in the Amazon Simple Queue Service Developer Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions @@ -990,7 +1019,7 @@ func (c *SQS) ListDeadLetterSourceQueuesRequest(input *ListDeadLetterSourceQueue // // Returned Error Codes: // * ErrCodeQueueDoesNotExist "AWS.SimpleQueueService.NonExistentQueue" -// The queue referred to doesn't exist. +// The specified queue doesn't exist. // // See also, https://docs.aws.amazon.com/goto/WebAPI/sqs-2012-11-05/ListDeadLetterSourceQueues func (c *SQS) ListDeadLetterSourceQueues(input *ListDeadLetterSourceQueuesInput) (*ListDeadLetterSourceQueuesOutput, error) { @@ -1019,7 +1048,7 @@ const opListQueueTags = "ListQueueTags" // ListQueueTagsRequest generates a "aws/request.Request" representing the // client's request for the ListQueueTags operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -1059,25 +1088,11 @@ func (c *SQS) ListQueueTagsRequest(input *ListQueueTagsInput) (req *request.Requ // ListQueueTags API operation for Amazon Simple Queue Service. // // List all cost allocation tags added to the specified Amazon SQS queue. For -// an overview, see Tagging Amazon SQS Queues (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-tagging-queues.html) +// an overview, see Tagging Your Amazon SQS Queues (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-queue-tags.html) // in the Amazon Simple Queue Service Developer Guide. // -// When you use queue tags, keep the following guidelines in mind: -// -// * Adding more than 50 tags to a queue isn't recommended. -// -// * Tags don't have any semantic meaning. Amazon SQS interprets tags as -// character strings. -// -// * Tags are case-sensitive. -// -// * A new tag with a key identical to that of an existing tag overwrites -// the existing tag. -// -// * Tagging API actions are limited to 5 TPS per AWS account. If your application -// requires a higher throughput, file a technical support request (https://console.aws.amazon.com/support/home#/case/create?issueType=technical). -// -// For a full list of tag restrictions, see Limits Related to Queues (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/limits-queues.html) +// Cross-account permissions don't apply to this action. For more information, +// see Grant Cross-Account Permissions to a Role and a User Name (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-customer-managed-policy-examples.html#grant-cross-account-permissions-to-role-and-user-name) // in the Amazon Simple Queue Service Developer Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions @@ -1113,7 +1128,7 @@ const opListQueues = "ListQueues" // ListQueuesRequest generates a "aws/request.Request" representing the // client's request for the ListQueues operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -1156,6 +1171,10 @@ func (c *SQS) ListQueuesRequest(input *ListQueuesInput) (req *request.Request, o // is 1,000. If you specify a value for the optional QueueNamePrefix parameter, // only queues with a name that begins with the specified value are returned. // +// Cross-account permissions don't apply to this action. For more information, +// see Grant Cross-Account Permissions to a Role and a User Name (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-customer-managed-policy-examples.html#grant-cross-account-permissions-to-role-and-user-name) +// in the Amazon Simple Queue Service Developer Guide. +// // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about // the error. @@ -1189,7 +1208,7 @@ const opPurgeQueue = "PurgeQueue" // PurgeQueueRequest generates a "aws/request.Request" representing the // client's request for the PurgeQueue operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -1223,8 +1242,7 @@ func (c *SQS) PurgeQueueRequest(input *PurgeQueueInput) (req *request.Request, o output = &PurgeQueueOutput{} req = c.newRequest(op, input, output) - req.Handlers.Unmarshal.Remove(query.UnmarshalHandler) - req.Handlers.Unmarshal.PushBackNamed(protocol.UnmarshalDiscardBodyHandler) + req.Handlers.Unmarshal.Swap(query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler) return } @@ -1232,14 +1250,17 @@ func (c *SQS) PurgeQueueRequest(input *PurgeQueueInput) (req *request.Request, o // // Deletes the messages in a queue specified by the QueueURL parameter. // -// When you use the PurgeQueue action, you can't retrieve a message deleted +// When you use the PurgeQueue action, you can't retrieve any messages deleted // from a queue. // -// When you purge a queue, the message deletion process takes up to 60 seconds. -// All messages sent to the queue before calling the PurgeQueue action are deleted. -// Messages sent to the queue while it is being purged might be deleted. While -// the queue is being purged, messages sent to the queue before PurgeQueue is -// called might be received, but are deleted within the next minute. +// The message deletion process takes up to 60 seconds. We recommend waiting +// for 60 seconds regardless of your queue's size. +// +// Messages sent to the queue before you call PurgeQueue might be received but +// are deleted within the next minute. +// +// Messages sent to the queue after you call PurgeQueue might be deleted while +// the queue is being purged. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -1250,7 +1271,7 @@ func (c *SQS) PurgeQueueRequest(input *PurgeQueueInput) (req *request.Request, o // // Returned Error Codes: // * ErrCodeQueueDoesNotExist "AWS.SimpleQueueService.NonExistentQueue" -// The queue referred to doesn't exist. +// The specified queue doesn't exist. // // * ErrCodePurgeQueueInProgress "AWS.SimpleQueueService.PurgeQueueInProgress" // Indicates that the specified queue previously received a PurgeQueue request @@ -1284,7 +1305,7 @@ const opReceiveMessage = "ReceiveMessage" // ReceiveMessageRequest generates a "aws/request.Request" representing the // client's request for the ReceiveMessage operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -1325,7 +1346,7 @@ func (c *SQS) ReceiveMessageRequest(input *ReceiveMessageInput) (req *request.Re // // Retrieves one or more messages (up to 10), from the specified queue. Using // the WaitTimeSeconds parameter enables long-poll support. For more information, -// see Amazon SQS Long Polling (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-long-polling.html) +// see Amazon SQS Long Polling (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-long-polling.html) // in the Amazon Simple Queue Service Developer Guide. // // Short poll is the default behavior where a weighted random set of machines @@ -1352,14 +1373,14 @@ func (c *SQS) ReceiveMessageRequest(input *ReceiveMessageInput) (req *request.Re // * An MD5 digest of the message attributes. // // The receipt handle is the identifier you must provide when deleting the message. -// For more information, see Queue and Message Identifiers (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-queue-message-identifiers.html) +// For more information, see Queue and Message Identifiers (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-queue-message-identifiers.html) // in the Amazon Simple Queue Service Developer Guide. // // You can provide the VisibilityTimeout parameter in your request. The parameter // is applied to the messages that Amazon SQS returns in the response. If you // don't include the parameter, the overall visibility timeout for the queue // is used for the returned messages. For more information, see Visibility Timeout -// (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html) +// (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html) // in the Amazon Simple Queue Service Developer Guide. // // A message that isn't deleted or a message whose visibility isn't extended @@ -1380,10 +1401,10 @@ func (c *SQS) ReceiveMessageRequest(input *ReceiveMessageInput) (req *request.Re // // Returned Error Codes: // * ErrCodeOverLimit "OverLimit" -// The action that you requested would violate a limit. For example, ReceiveMessage -// returns this error if the maximum number of inflight messages is reached. -// AddPermission returns this error if the maximum number of permissions for -// the queue is reached. +// The specified action violates a limit. For example, ReceiveMessage returns +// this error if the maximum number of inflight messages is reached and AddPermission +// returns this error if the maximum number of permissions for the queue is +// reached. // // See also, https://docs.aws.amazon.com/goto/WebAPI/sqs-2012-11-05/ReceiveMessage func (c *SQS) ReceiveMessage(input *ReceiveMessageInput) (*ReceiveMessageOutput, error) { @@ -1412,7 +1433,7 @@ const opRemovePermission = "RemovePermission" // RemovePermissionRequest generates a "aws/request.Request" representing the // client's request for the RemovePermission operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -1446,15 +1467,24 @@ func (c *SQS) RemovePermissionRequest(input *RemovePermissionInput) (req *reques output = &RemovePermissionOutput{} req = c.newRequest(op, input, output) - req.Handlers.Unmarshal.Remove(query.UnmarshalHandler) - req.Handlers.Unmarshal.PushBackNamed(protocol.UnmarshalDiscardBodyHandler) + req.Handlers.Unmarshal.Swap(query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler) return } // RemovePermission API operation for Amazon Simple Queue Service. // // Revokes any permissions in the queue policy that matches the specified Label -// parameter. Only the owner of the queue can remove permissions. +// parameter. +// +// * Only the owner of a queue can remove permissions from it. +// +// * Cross-account permissions don't apply to this action. For more information, +// see Grant Cross-Account Permissions to a Role and a User Name (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-customer-managed-policy-examples.html#grant-cross-account-permissions-to-role-and-user-name) +// in the Amazon Simple Queue Service Developer Guide. +// +// * To remove the ability to change queue permissions, you must deny permission +// to the AddPermission, RemovePermission, and SetQueueAttributes actions +// in your IAM policy. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -1489,7 +1519,7 @@ const opSendMessage = "SendMessage" // SendMessageRequest generates a "aws/request.Request" representing the // client's request for the SendMessage operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -1579,7 +1609,7 @@ const opSendMessageBatch = "SendMessageBatch" // SendMessageBatchRequest generates a "aws/request.Request" representing the // client's request for the SendMessageBatch operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -1646,9 +1676,9 @@ func (c *SQS) SendMessageBatchRequest(input *SendMessageBatchInput) (req *reques // param.n notation. Values of n are integers starting from 1. For example, // a parameter list with two elements looks like this: // -// &Attribute.1=this +// &Attribute.1=first // -// &Attribute.2=that +// &Attribute.2=second // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -1703,7 +1733,7 @@ const opSetQueueAttributes = "SetQueueAttributes" // SetQueueAttributesRequest generates a "aws/request.Request" representing the // client's request for the SetQueueAttributes operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -1737,8 +1767,7 @@ func (c *SQS) SetQueueAttributesRequest(input *SetQueueAttributesInput) (req *re output = &SetQueueAttributesOutput{} req = c.newRequest(op, input, output) - req.Handlers.Unmarshal.Remove(query.UnmarshalHandler) - req.Handlers.Unmarshal.PushBackNamed(protocol.UnmarshalDiscardBodyHandler) + req.Handlers.Unmarshal.Swap(query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler) return } @@ -1749,9 +1778,17 @@ func (c *SQS) SetQueueAttributesRequest(input *SetQueueAttributesInput) (req *re // to propagate throughout the Amazon SQS system. Changes made to the MessageRetentionPeriod // attribute can take up to 15 minutes. // -// In the future, new attributes might be added. If you write code that calls -// this action, we recommend that you structure your code so that it can handle -// new attributes gracefully. +// * In the future, new attributes might be added. If you write code that +// calls this action, we recommend that you structure your code so that it +// can handle new attributes gracefully. +// +// * Cross-account permissions don't apply to this action. For more information, +// see Grant Cross-Account Permissions to a Role and a User Name (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-customer-managed-policy-examples.html#grant-cross-account-permissions-to-role-and-user-name) +// in the Amazon Simple Queue Service Developer Guide. +// +// * To remove the ability to change queue permissions, you must deny permission +// to the AddPermission, RemovePermission, and SetQueueAttributes actions +// in your IAM policy. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -1762,7 +1799,7 @@ func (c *SQS) SetQueueAttributesRequest(input *SetQueueAttributesInput) (req *re // // Returned Error Codes: // * ErrCodeInvalidAttributeName "InvalidAttributeName" -// The attribute referred to doesn't exist. +// The specified attribute doesn't exist. // // See also, https://docs.aws.amazon.com/goto/WebAPI/sqs-2012-11-05/SetQueueAttributes func (c *SQS) SetQueueAttributes(input *SetQueueAttributesInput) (*SetQueueAttributesOutput, error) { @@ -1791,7 +1828,7 @@ const opTagQueue = "TagQueue" // TagQueueRequest generates a "aws/request.Request" representing the // client's request for the TagQueue operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -1825,15 +1862,14 @@ func (c *SQS) TagQueueRequest(input *TagQueueInput) (req *request.Request, outpu output = &TagQueueOutput{} req = c.newRequest(op, input, output) - req.Handlers.Unmarshal.Remove(query.UnmarshalHandler) - req.Handlers.Unmarshal.PushBackNamed(protocol.UnmarshalDiscardBodyHandler) + req.Handlers.Unmarshal.Swap(query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler) return } // TagQueue API operation for Amazon Simple Queue Service. // // Add cost allocation tags to the specified Amazon SQS queue. For an overview, -// see Tagging Amazon SQS Queues (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-tagging-queues.html) +// see Tagging Your Amazon SQS Queues (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-queue-tags.html) // in the Amazon Simple Queue Service Developer Guide. // // When you use queue tags, keep the following guidelines in mind: @@ -1848,10 +1884,11 @@ func (c *SQS) TagQueueRequest(input *TagQueueInput) (req *request.Request, outpu // * A new tag with a key identical to that of an existing tag overwrites // the existing tag. // -// * Tagging API actions are limited to 5 TPS per AWS account. If your application -// requires a higher throughput, file a technical support request (https://console.aws.amazon.com/support/home#/case/create?issueType=technical). +// For a full list of tag restrictions, see Limits Related to Queues (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-limits.html#limits-queues) +// in the Amazon Simple Queue Service Developer Guide. // -// For a full list of tag restrictions, see Limits Related to Queues (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/limits-queues.html) +// Cross-account permissions don't apply to this action. For more information, +// see Grant Cross-Account Permissions to a Role and a User Name (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-customer-managed-policy-examples.html#grant-cross-account-permissions-to-role-and-user-name) // in the Amazon Simple Queue Service Developer Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions @@ -1887,7 +1924,7 @@ const opUntagQueue = "UntagQueue" // UntagQueueRequest generates a "aws/request.Request" representing the // client's request for the UntagQueue operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -1921,33 +1958,18 @@ func (c *SQS) UntagQueueRequest(input *UntagQueueInput) (req *request.Request, o output = &UntagQueueOutput{} req = c.newRequest(op, input, output) - req.Handlers.Unmarshal.Remove(query.UnmarshalHandler) - req.Handlers.Unmarshal.PushBackNamed(protocol.UnmarshalDiscardBodyHandler) + req.Handlers.Unmarshal.Swap(query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler) return } // UntagQueue API operation for Amazon Simple Queue Service. // // Remove cost allocation tags from the specified Amazon SQS queue. For an overview, -// see Tagging Amazon SQS Queues (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-tagging-queues.html) +// see Tagging Your Amazon SQS Queues (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-queue-tags.html) // in the Amazon Simple Queue Service Developer Guide. // -// When you use queue tags, keep the following guidelines in mind: -// -// * Adding more than 50 tags to a queue isn't recommended. -// -// * Tags don't have any semantic meaning. Amazon SQS interprets tags as -// character strings. -// -// * Tags are case-sensitive. -// -// * A new tag with a key identical to that of an existing tag overwrites -// the existing tag. -// -// * Tagging API actions are limited to 5 TPS per AWS account. If your application -// requires a higher throughput, file a technical support request (https://console.aws.amazon.com/support/home#/case/create?issueType=technical). -// -// For a full list of tag restrictions, see Limits Related to Queues (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/limits-queues.html) +// Cross-account permissions don't apply to this action. For more information, +// see Grant Cross-Account Permissions to a Role and a User Name (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-customer-managed-policy-examples.html#grant-cross-account-permissions-to-role-and-user-name) // in the Amazon Simple Queue Service Developer Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions @@ -1981,33 +2003,20 @@ func (c *SQS) UntagQueueWithContext(ctx aws.Context, input *UntagQueueInput, opt type AddPermissionInput struct { _ struct{} `type:"structure"` - // The AWS account number of the principal (http://docs.aws.amazon.com/general/latest/gr/glos-chap.html#P) + // The AWS account number of the principal (https://docs.aws.amazon.com/general/latest/gr/glos-chap.html#P) // who is given permission. The principal must have an AWS account, but does // not need to be signed up for Amazon SQS. For information about locating the - // AWS account identification, see Your AWS Identifiers (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/AWSCredentials.html) + // AWS account identification, see Your AWS Identifiers (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-making-api-requests.html#sqs-api-request-authentication) // in the Amazon Simple Queue Service Developer Guide. // // AWSAccountIds is a required field AWSAccountIds []*string `locationNameList:"AWSAccountId" type:"list" flattened:"true" required:"true"` - // The action the client wants to allow for the specified principal. The following - // values are valid: + // The action the client wants to allow for the specified principal. Valid values: + // the name of any action or *. // - // * * - // - // * ChangeMessageVisibility - // - // * DeleteMessage - // - // * GetQueueAttributes - // - // * GetQueueUrl - // - // * ReceiveMessage - // - // * SendMessage - // - // For more information about these actions, see Understanding Permissions (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/acp-overview.html#PermissionTypes) + // For more information about these actions, see Overview of Managing Access + // Permissions to Your Amazon Simple Queue Service Resource (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-overview-of-managing-access.html) // in the Amazon Simple Queue Service Developer Guide. // // Specifying SendMessage, DeleteMessage, or ChangeMessageVisibility for ActionName.n @@ -2026,7 +2035,7 @@ type AddPermissionInput struct { // The URL of the Amazon SQS queue to which permissions are added. // - // Queue URLs are case-sensitive. + // Queue URLs and names are case-sensitive. // // QueueUrl is a required field QueueUrl *string `type:"string" required:"true"` @@ -2102,8 +2111,8 @@ func (s AddPermissionOutput) GoString() string { return s.String() } -// This is used in the responses of batch API to give a detailed description -// of the result of an action on each entry in the request. +// Gives a detailed description of the result of an action on each entry in +// the request. type BatchResultErrorEntry struct { _ struct{} `type:"structure"` @@ -2120,7 +2129,7 @@ type BatchResultErrorEntry struct { // A message explaining why the action failed on this entry. Message *string `type:"string"` - // Specifies whether the error happened due to the sender's fault. + // Specifies whether the error happened due to the producer. // // SenderFault is a required field SenderFault *bool `type:"boolean" required:"true"` @@ -2171,7 +2180,7 @@ type ChangeMessageVisibilityBatchInput struct { // The URL of the Amazon SQS queue whose messages' visibility is changed. // - // Queue URLs are case-sensitive. + // Queue URLs and names are case-sensitive. // // QueueUrl is a required field QueueUrl *string `type:"string" required:"true"` @@ -2272,7 +2281,7 @@ func (s *ChangeMessageVisibilityBatchOutput) SetSuccessful(v []*ChangeMessageVis // // &ChangeMessageVisibilityBatchRequestEntry.1.Id=change_visibility_msg_2 // -// &ChangeMessageVisibilityBatchRequestEntry.1.ReceiptHandle=Your_Receipt_Handle +// &ChangeMessageVisibilityBatchRequestEntry.1.ReceiptHandle=your_receipt_handle // // &ChangeMessageVisibilityBatchRequestEntry.1.VisibilityTimeout=45 type ChangeMessageVisibilityBatchRequestEntry struct { @@ -2370,7 +2379,7 @@ type ChangeMessageVisibilityInput struct { // The URL of the Amazon SQS queue whose message's visibility is changed. // - // Queue URLs are case-sensitive. + // Queue URLs and names are case-sensitive. // // QueueUrl is a required field QueueUrl *string `type:"string" required:"true"` @@ -2459,117 +2468,90 @@ type CreateQueueInput struct { // // * DelaySeconds - The length of time, in seconds, for which the delivery // of all messages in the queue is delayed. Valid values: An integer from - // 0 to 900 seconds (15 minutes). The default is 0 (zero). + // 0 to 900 seconds (15 minutes). Default: 0. // // * MaximumMessageSize - The limit of how many bytes a message can contain // before Amazon SQS rejects it. Valid values: An integer from 1,024 bytes - // (1 KiB) to 262,144 bytes (256 KiB). The default is 262,144 (256 KiB). - // + // (1 KiB) to 262,144 bytes (256 KiB). Default: 262,144 (256 KiB). // // * MessageRetentionPeriod - The length of time, in seconds, for which Amazon // SQS retains a message. Valid values: An integer from 60 seconds (1 minute) - // to 1,209,600 seconds (14 days). The default is 345,600 (4 days). + // to 1,209,600 seconds (14 days). Default: 345,600 (4 days). // // * Policy - The queue's policy. A valid AWS policy. For more information - // about policy structure, see Overview of AWS IAM Policies (http://docs.aws.amazon.com/IAM/latest/UserGuide/PoliciesOverview.html) + // about policy structure, see Overview of AWS IAM Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/PoliciesOverview.html) // in the Amazon IAM User Guide. // // * ReceiveMessageWaitTimeSeconds - The length of time, in seconds, for // which a ReceiveMessage action waits for a message to arrive. Valid values: - // An integer from 0 to 20 (seconds). The default is 0 (zero). + // An integer from 0 to 20 (seconds). Default: 0. // // * RedrivePolicy - The string that includes the parameters for the dead-letter // queue functionality of the source queue. For more information about the // redrive policy and dead-letter queues, see Using Amazon SQS Dead-Letter - // Queues (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html) - // in the Amazon Simple Queue Service Developer Guide. - // - // deadLetterTargetArn - The Amazon Resource Name (ARN) of the dead-letter queue - // to which Amazon SQS moves messages after the value of maxReceiveCount - // is exceeded. - // - // maxReceiveCount - The number of times a message is delivered to the source - // queue before being moved to the dead-letter queue. - // - // The dead-letter queue of a FIFO queue must also be a FIFO queue. Similarly, - // the dead-letter queue of a standard queue must also be a standard queue. - // - // * VisibilityTimeout - The visibility timeout for the queue. Valid values: - // An integer from 0 to 43,200 (12 hours). The default is 30. For more information - // about the visibility timeout, see Visibility Timeout (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html) + // Queues (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html) + // in the Amazon Simple Queue Service Developer Guide. deadLetterTargetArn + // - The Amazon Resource Name (ARN) of the dead-letter queue to which Amazon + // SQS moves messages after the value of maxReceiveCount is exceeded. maxReceiveCount + // - The number of times a message is delivered to the source queue before + // being moved to the dead-letter queue. When the ReceiveCount for a message + // exceeds the maxReceiveCount for a queue, Amazon SQS moves the message + // to the dead-letter-queue. The dead-letter queue of a FIFO queue must also + // be a FIFO queue. Similarly, the dead-letter queue of a standard queue + // must also be a standard queue. + // + // * VisibilityTimeout - The visibility timeout for the queue, in seconds. + // Valid values: An integer from 0 to 43,200 (12 hours). Default: 30. For + // more information about the visibility timeout, see Visibility Timeout + // (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html) // in the Amazon Simple Queue Service Developer Guide. // - // The following attributes apply only to server-side-encryption (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-server-side-encryption.html): + // The following attributes apply only to server-side-encryption (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-server-side-encryption.html): // // * KmsMasterKeyId - The ID of an AWS-managed customer master key (CMK) - // for Amazon SQS or a custom CMK. For more information, see Key Terms (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-server-side-encryption.html#sqs-sse-key-terms). + // for Amazon SQS or a custom CMK. For more information, see Key Terms (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-server-side-encryption.html#sqs-sse-key-terms). // While the alias of the AWS-managed CMK for Amazon SQS is always alias/aws/sqs, - // the alias of a custom CMK can, for example, be alias/MyAlias. For more - // examples, see KeyId (http://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html#API_DescribeKey_RequestParameters) + // the alias of a custom CMK can, for example, be alias/MyAlias . For more + // examples, see KeyId (https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html#API_DescribeKey_RequestParameters) // in the AWS Key Management Service API Reference. // // * KmsDataKeyReusePeriodSeconds - The length of time, in seconds, for which - // Amazon SQS can reuse a data key (http://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#data-keys) + // Amazon SQS can reuse a data key (https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#data-keys) // to encrypt or decrypt messages before calling AWS KMS again. An integer // representing seconds, between 60 seconds (1 minute) and 86,400 seconds - // (24 hours). The default is 300 (5 minutes). A shorter time period provides - // better security but results in more calls to KMS which might incur charges - // after Free Tier. For more information, see How Does the Data Key Reuse - // Period Work? (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-server-side-encryption.html#sqs-how-does-the-data-key-reuse-period-work). - // - // - // The following attributes apply only to FIFO (first-in-first-out) queues (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html): - // - // * FifoQueue - Designates a queue as FIFO. Valid values: true, false. You - // can provide this attribute only during queue creation. You can't change - // it for an existing queue. When you set this attribute, you must also provide - // the MessageGroupId for your messages explicitly. - // - // For more information, see FIFO Queue Logic (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html#FIFO-queues-understanding-logic) + // (24 hours). Default: 300 (5 minutes). A shorter time period provides better + // security but results in more calls to KMS which might incur charges after + // Free Tier. For more information, see How Does the Data Key Reuse Period + // Work? (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-server-side-encryption.html#sqs-how-does-the-data-key-reuse-period-work). + // + // The following attributes apply only to FIFO (first-in-first-out) queues (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html): + // + // * FifoQueue - Designates a queue as FIFO. Valid values: true, false. If + // you don't specify the FifoQueue attribute, Amazon SQS creates a standard + // queue. You can provide this attribute only during queue creation. You + // can't change it for an existing queue. When you set this attribute, you + // must also provide the MessageGroupId for your messages explicitly. For + // more information, see FIFO Queue Logic (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html#FIFO-queues-understanding-logic) // in the Amazon Simple Queue Service Developer Guide. // // * ContentBasedDeduplication - Enables content-based deduplication. Valid // values: true, false. For more information, see Exactly-Once Processing - // (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html#FIFO-queues-exactly-once-processing) - // in the Amazon Simple Queue Service Developer Guide. - // - // Every message must have a unique MessageDeduplicationId, - // - // You may provide a MessageDeduplicationId explicitly. - // - // If you aren't able to provide a MessageDeduplicationId and you enable ContentBasedDeduplication - // for your queue, Amazon SQS uses a SHA-256 hash to generate the MessageDeduplicationId - // using the body of the message (but not the attributes of the message). - // - // - // If you don't provide a MessageDeduplicationId and the queue doesn't have - // ContentBasedDeduplication set, the action fails with an error. - // - // If the queue has ContentBasedDeduplication set, your MessageDeduplicationId - // overrides the generated one. - // - // When ContentBasedDeduplication is in effect, messages with identical content - // sent within the deduplication interval are treated as duplicates and only - // one copy of the message is delivered. - // - // If you send one message with ContentBasedDeduplication enabled and then another - // message with a MessageDeduplicationId that is the same as the one generated - // for the first MessageDeduplicationId, the two messages are treated as - // duplicates and only one copy of the message is delivered. - // - // Any other valid special request parameters (such as the following) are ignored: - // - // * ApproximateNumberOfMessages - // - // * ApproximateNumberOfMessagesDelayed - // - // * ApproximateNumberOfMessagesNotVisible - // - // * CreatedTimestamp - // - // * LastModifiedTimestamp - // - // * QueueArn + // (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html#FIFO-queues-exactly-once-processing) + // in the Amazon Simple Queue Service Developer Guide. Every message must + // have a unique MessageDeduplicationId, You may provide a MessageDeduplicationId + // explicitly. If you aren't able to provide a MessageDeduplicationId and + // you enable ContentBasedDeduplication for your queue, Amazon SQS uses a + // SHA-256 hash to generate the MessageDeduplicationId using the body of + // the message (but not the attributes of the message). If you don't provide + // a MessageDeduplicationId and the queue doesn't have ContentBasedDeduplication + // set, the action fails with an error. If the queue has ContentBasedDeduplication + // set, your MessageDeduplicationId overrides the generated one. When ContentBasedDeduplication + // is in effect, messages with identical content sent within the deduplication + // interval are treated as duplicates and only one copy of the message is + // delivered. If you send one message with ContentBasedDeduplication enabled + // and then another message with a MessageDeduplicationId that is the same + // as the one generated for the first MessageDeduplicationId, the two messages + // are treated as duplicates and only one copy of the message is delivered. Attributes map[string]*string `locationName:"Attribute" locationNameKey:"Name" locationNameValue:"Value" type:"map" flattened:"true"` // The name of the new queue. The following limits apply to this name: @@ -2581,10 +2563,37 @@ type CreateQueueInput struct { // // * A FIFO queue name must end with the .fifo suffix. // - // Queue names are case-sensitive. + // Queue URLs and names are case-sensitive. // // QueueName is a required field QueueName *string `type:"string" required:"true"` + + // Add cost allocation tags to the specified Amazon SQS queue. For an overview, + // see Tagging Your Amazon SQS Queues (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-queue-tags.html) + // in the Amazon Simple Queue Service Developer Guide. + // + // When you use queue tags, keep the following guidelines in mind: + // + // * Adding more than 50 tags to a queue isn't recommended. + // + // * Tags don't have any semantic meaning. Amazon SQS interprets tags as + // character strings. + // + // * Tags are case-sensitive. + // + // * A new tag with a key identical to that of an existing tag overwrites + // the existing tag. + // + // For a full list of tag restrictions, see Limits Related to Queues (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-limits.html#limits-queues) + // in the Amazon Simple Queue Service Developer Guide. + // + // To be able to tag a queue on creation, you must have the sqs:CreateQueue + // and sqs:TagQueue permissions. + // + // Cross-account permissions don't apply to this action. For more information, + // see Grant Cross-Account Permissions to a Role and a User Name (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-customer-managed-policy-examples.html#grant-cross-account-permissions-to-role-and-user-name) + // in the Amazon Simple Queue Service Developer Guide. + Tags map[string]*string `locationName:"Tag" locationNameKey:"Key" locationNameValue:"Value" type:"map" flattened:"true"` } // String returns the string representation @@ -2622,6 +2631,12 @@ func (s *CreateQueueInput) SetQueueName(v string) *CreateQueueInput { return s } +// SetTags sets the Tags field's value. +func (s *CreateQueueInput) SetTags(v map[string]*string) *CreateQueueInput { + s.Tags = v + return s +} + // Returns the QueueUrl attribute of the created queue. type CreateQueueOutput struct { _ struct{} `type:"structure"` @@ -2656,7 +2671,7 @@ type DeleteMessageBatchInput struct { // The URL of the Amazon SQS queue from which messages are deleted. // - // Queue URLs are case-sensitive. + // Queue URLs and names are case-sensitive. // // QueueUrl is a required field QueueUrl *string `type:"string" required:"true"` @@ -2836,7 +2851,7 @@ type DeleteMessageInput struct { // The URL of the Amazon SQS queue from which messages are deleted. // - // Queue URLs are case-sensitive. + // Queue URLs and names are case-sensitive. // // QueueUrl is a required field QueueUrl *string `type:"string" required:"true"` @@ -2904,7 +2919,7 @@ type DeleteQueueInput struct { // The URL of the Amazon SQS queue to delete. // - // Queue URLs are case-sensitive. + // Queue URLs and names are case-sensitive. // // QueueUrl is a required field QueueUrl *string `type:"string" required:"true"` @@ -2966,18 +2981,18 @@ type GetQueueAttributesInput struct { // // * All - Returns all values. // - // * ApproximateNumberOfMessages - Returns the approximate number of visible - // messages in a queue. For more information, see Resources Required to Process - // Messages (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-resources-required-process-messages.html) - // in the Amazon Simple Queue Service Developer Guide. + // * ApproximateNumberOfMessages - Returns the approximate number of messages + // available for retrieval from the queue. // // * ApproximateNumberOfMessagesDelayed - Returns the approximate number - // of messages that are waiting to be added to the queue. + // of messages in the queue that are delayed and not available for reading + // immediately. This can happen when the queue is configured as a delay queue + // or when a message has been sent with a delay parameter. // // * ApproximateNumberOfMessagesNotVisible - Returns the approximate number - // of messages that have not timed-out and aren't deleted. For more information, - // see Resources Required to Process Messages (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-resources-required-process-messages.html) - // in the Amazon Simple Queue Service Developer Guide. + // of messages that are in flight. Messages are considered to be in flight + // if they have been sent to a client but have not yet been deleted or have + // not yet reached the end of their visibility window. // // * CreatedTimestamp - Returns the time when the queue was created in seconds // (epoch time (http://en.wikipedia.org/wiki/Unix_time)). @@ -3003,52 +3018,48 @@ type GetQueueAttributesInput struct { // * RedrivePolicy - Returns the string that includes the parameters for // dead-letter queue functionality of the source queue. For more information // about the redrive policy and dead-letter queues, see Using Amazon SQS - // Dead-Letter Queues (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html) - // in the Amazon Simple Queue Service Developer Guide. - // - // deadLetterTargetArn - The Amazon Resource Name (ARN) of the dead-letter queue - // to which Amazon SQS moves messages after the value of maxReceiveCount - // is exceeded. - // - // maxReceiveCount - The number of times a message is delivered to the source - // queue before being moved to the dead-letter queue. + // Dead-Letter Queues (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html) + // in the Amazon Simple Queue Service Developer Guide. deadLetterTargetArn + // - The Amazon Resource Name (ARN) of the dead-letter queue to which Amazon + // SQS moves messages after the value of maxReceiveCount is exceeded. maxReceiveCount + // - The number of times a message is delivered to the source queue before + // being moved to the dead-letter queue. When the ReceiveCount for a message + // exceeds the maxReceiveCount for a queue, Amazon SQS moves the message + // to the dead-letter-queue. // // * VisibilityTimeout - Returns the visibility timeout for the queue. For // more information about the visibility timeout, see Visibility Timeout - // (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html) + // (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html) // in the Amazon Simple Queue Service Developer Guide. // - // The following attributes apply only to server-side-encryption (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-server-side-encryption.html): + // The following attributes apply only to server-side-encryption (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-server-side-encryption.html): // // * KmsMasterKeyId - Returns the ID of an AWS-managed customer master key // (CMK) for Amazon SQS or a custom CMK. For more information, see Key Terms - // (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-server-side-encryption.html#sqs-sse-key-terms). - // + // (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-server-side-encryption.html#sqs-sse-key-terms). // // * KmsDataKeyReusePeriodSeconds - Returns the length of time, in seconds, // for which Amazon SQS can reuse a data key to encrypt or decrypt messages // before calling AWS KMS again. For more information, see How Does the Data - // Key Reuse Period Work? (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-server-side-encryption.html#sqs-how-does-the-data-key-reuse-period-work). + // Key Reuse Period Work? (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-server-side-encryption.html#sqs-how-does-the-data-key-reuse-period-work). // - // - // The following attributes apply only to FIFO (first-in-first-out) queues (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html): + // The following attributes apply only to FIFO (first-in-first-out) queues (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html): // // * FifoQueue - Returns whether the queue is FIFO. For more information, - // see FIFO Queue Logic (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html#FIFO-queues-understanding-logic) - // in the Amazon Simple Queue Service Developer Guide. - // - // To determine whether a queue is FIFO (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html), + // see FIFO Queue Logic (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html#FIFO-queues-understanding-logic) + // in the Amazon Simple Queue Service Developer Guide. To determine whether + // a queue is FIFO (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html), // you can check whether QueueName ends with the .fifo suffix. // // * ContentBasedDeduplication - Returns whether content-based deduplication // is enabled for the queue. For more information, see Exactly-Once Processing - // (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html#FIFO-queues-exactly-once-processing) + // (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html#FIFO-queues-exactly-once-processing) // in the Amazon Simple Queue Service Developer Guide. AttributeNames []*string `locationNameList:"AttributeName" type:"list" flattened:"true"` // The URL of the Amazon SQS queue whose attribute information is retrieved. // - // Queue URLs are case-sensitive. + // Queue URLs and names are case-sensitive. // // QueueUrl is a required field QueueUrl *string `type:"string" required:"true"` @@ -3119,7 +3130,7 @@ type GetQueueUrlInput struct { // The name of the queue whose URL must be fetched. Maximum 80 characters. Valid // values: alphanumeric characters, hyphens (-), and underscores (_). // - // Queue names are case-sensitive. + // Queue URLs and names are case-sensitive. // // QueueName is a required field QueueName *string `type:"string" required:"true"` @@ -3163,7 +3174,7 @@ func (s *GetQueueUrlInput) SetQueueOwnerAWSAccountId(v string) *GetQueueUrlInput return s } -// For more information, see Responses (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/UnderstandingResponses.html) +// For more information, see Interpreting Responses (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-api-responses.html) // in the Amazon Simple Queue Service Developer Guide. type GetQueueUrlOutput struct { _ struct{} `type:"structure"` @@ -3193,7 +3204,7 @@ type ListDeadLetterSourceQueuesInput struct { // The URL of a dead-letter queue. // - // Queue URLs are case-sensitive. + // Queue URLs and names are case-sensitive. // // QueueUrl is a required field QueueUrl *string `type:"string" required:"true"` @@ -3322,7 +3333,7 @@ type ListQueuesInput struct { // A string to use for filtering the list results. Only those queues whose name // begins with the specified string are returned. // - // Queue names are case-sensitive. + // Queue URLs and names are case-sensitive. QueueNamePrefix *string `type:"string"` } @@ -3370,8 +3381,24 @@ func (s *ListQueuesOutput) SetQueueUrls(v []*string) *ListQueuesOutput { type Message struct { _ struct{} `type:"structure"` - // SenderId, SentTimestamp, ApproximateReceiveCount, and/or ApproximateFirstReceiveTimestamp. - // SentTimestamp and ApproximateFirstReceiveTimestamp are each returned as an + // A map of the attributes requested in ReceiveMessage to their respective values. + // Supported attributes: + // + // * ApproximateReceiveCount + // + // * ApproximateFirstReceiveTimestamp + // + // * MessageDeduplicationId + // + // * MessageGroupId + // + // * SenderId + // + // * SentTimestamp + // + // * SequenceNumber + // + // ApproximateFirstReceiveTimestamp and SentTimestamp are each returned as an // integer representing the epoch time (http://en.wikipedia.org/wiki/Unix_time) // in milliseconds. Attributes map[string]*string `locationName:"Attribute" locationNameKey:"Name" locationNameValue:"Value" type:"map" flattened:"true"` @@ -3389,7 +3416,7 @@ type Message struct { MD5OfMessageAttributes *string `type:"string"` // Each message attribute consists of a Name, Type, and Value. For more information, - // see Message Attribute Items and Validation (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-attributes.html#message-attributes-items-validation) + // see Amazon SQS Message Attributes (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-attributes.html) // in the Amazon Simple Queue Service Developer Guide. MessageAttributes map[string]*MessageAttributeValue `locationName:"MessageAttribute" locationNameKey:"Name" locationNameValue:"Value" type:"map" flattened:"true"` @@ -3477,8 +3504,8 @@ type MessageAttributeValue struct { // Amazon SQS supports the following logical data types: String, Number, and // Binary. For the Number data type, you must use StringValue. // - // You can also append custom labels. For more information, see Message Attribute - // Data Types and Validation (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-attributes.html#message-attributes-data-types-validation) + // You can also append custom labels. For more information, see Amazon SQS Message + // Attributes (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-attributes.html) // in the Amazon Simple Queue Service Developer Guide. // // DataType is a required field @@ -3545,12 +3572,100 @@ func (s *MessageAttributeValue) SetStringValue(v string) *MessageAttributeValue return s } +// The user-specified message system attribute value. For string data types, +// the Value attribute has the same restrictions on the content as the message +// body. For more information, see SendMessage. +// +// Name, type, value and the message body must not be empty or null. +type MessageSystemAttributeValue struct { + _ struct{} `type:"structure"` + + // Not implemented. Reserved for future use. + BinaryListValues [][]byte `locationName:"BinaryListValue" locationNameList:"BinaryListValue" type:"list" flattened:"true"` + + // Binary type attributes can store any binary data, such as compressed data, + // encrypted data, or images. + // + // BinaryValue is automatically base64 encoded/decoded by the SDK. + BinaryValue []byte `type:"blob"` + + // Amazon SQS supports the following logical data types: String, Number, and + // Binary. For the Number data type, you must use StringValue. + // + // You can also append custom labels. For more information, see Amazon SQS Message + // Attributes (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-attributes.html) + // in the Amazon Simple Queue Service Developer Guide. + // + // DataType is a required field + DataType *string `type:"string" required:"true"` + + // Not implemented. Reserved for future use. + StringListValues []*string `locationName:"StringListValue" locationNameList:"StringListValue" type:"list" flattened:"true"` + + // Strings are Unicode with UTF-8 binary encoding. For a list of code values, + // see ASCII Printable Characters (http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters). + StringValue *string `type:"string"` +} + +// String returns the string representation +func (s MessageSystemAttributeValue) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s MessageSystemAttributeValue) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *MessageSystemAttributeValue) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "MessageSystemAttributeValue"} + if s.DataType == nil { + invalidParams.Add(request.NewErrParamRequired("DataType")) + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetBinaryListValues sets the BinaryListValues field's value. +func (s *MessageSystemAttributeValue) SetBinaryListValues(v [][]byte) *MessageSystemAttributeValue { + s.BinaryListValues = v + return s +} + +// SetBinaryValue sets the BinaryValue field's value. +func (s *MessageSystemAttributeValue) SetBinaryValue(v []byte) *MessageSystemAttributeValue { + s.BinaryValue = v + return s +} + +// SetDataType sets the DataType field's value. +func (s *MessageSystemAttributeValue) SetDataType(v string) *MessageSystemAttributeValue { + s.DataType = &v + return s +} + +// SetStringListValues sets the StringListValues field's value. +func (s *MessageSystemAttributeValue) SetStringListValues(v []*string) *MessageSystemAttributeValue { + s.StringListValues = v + return s +} + +// SetStringValue sets the StringValue field's value. +func (s *MessageSystemAttributeValue) SetStringValue(v string) *MessageSystemAttributeValue { + s.StringValue = &v + return s +} + type PurgeQueueInput struct { _ struct{} `type:"structure"` // The URL of the queue from which the PurgeQueue action deletes messages. // - // Queue URLs are case-sensitive. + // Queue URLs and names are case-sensitive. // // QueueUrl is a required field QueueUrl *string `type:"string" required:"true"` @@ -3614,60 +3729,27 @@ type ReceiveMessageInput struct { // * ApproximateReceiveCount - Returns the number of times a message has // been received from the queue but not deleted. // - // * SenderId + // * AWSTraceHeader - Returns the AWS X-Ray trace header string. // - // For an IAM user, returns the IAM user ID, for example ABCDEFGHI1JKLMNOPQ23R. - // - // For an IAM role, returns the IAM role ID, for example ABCDE1F2GH3I4JK5LMNOP:i-a123b456. + // * SenderId For an IAM user, returns the IAM user ID, for example ABCDEFGHI1JKLMNOPQ23R. + // For an IAM role, returns the IAM role ID, for example ABCDE1F2GH3I4JK5LMNOP:i-a123b456. // // * SentTimestamp - Returns the time the message was sent to the queue (epoch // time (http://en.wikipedia.org/wiki/Unix_time) in milliseconds). // - // * MessageDeduplicationId - Returns the value provided by the sender that - // calls the SendMessage action. + // * MessageDeduplicationId - Returns the value provided by the producer + // that calls the SendMessage action. // - // * MessageGroupId - Returns the value provided by the sender that calls + // * MessageGroupId - Returns the value provided by the producer that calls // the SendMessage action. Messages with the same MessageGroupId are returned // in sequence. // // * SequenceNumber - Returns the value provided by Amazon SQS. - // - // Any other valid special request parameters (such as the following) are ignored: - // - // * ApproximateNumberOfMessages - // - // * ApproximateNumberOfMessagesDelayed - // - // * ApproximateNumberOfMessagesNotVisible - // - // * CreatedTimestamp - // - // * ContentBasedDeduplication - // - // * DelaySeconds - // - // * FifoQueue - // - // * LastModifiedTimestamp - // - // * MaximumMessageSize - // - // * MessageRetentionPeriod - // - // * Policy - // - // * QueueArn, - // - // * ReceiveMessageWaitTimeSeconds - // - // * RedrivePolicy - // - // * VisibilityTimeout AttributeNames []*string `locationNameList:"AttributeName" type:"list" flattened:"true"` // The maximum number of messages to return. Amazon SQS never returns more messages - // than this value (however, fewer messages might be returned). Valid values - // are 1 to 10. Default is 1. + // than this value (however, fewer messages might be returned). Valid values: + // 1 to 10. Default: 1. MaxNumberOfMessages *int64 `type:"integer"` // The name of the message attribute, where N is the index. @@ -3694,7 +3776,7 @@ type ReceiveMessageInput struct { // The URL of the Amazon SQS queue from which messages are received. // - // Queue URLs are case-sensitive. + // Queue URLs and names are case-sensitive. // // QueueUrl is a required field QueueUrl *string `type:"string" required:"true"` @@ -3723,19 +3805,16 @@ type ReceiveMessageInput struct { // * During a visibility timeout, subsequent calls with the same ReceiveRequestAttemptId // return the same messages and receipt handles. If a retry occurs within // the deduplication interval, it resets the visibility timeout. For more - // information, see Visibility Timeout (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html) - // in the Amazon Simple Queue Service Developer Guide. - // - // If a caller of the ReceiveMessage action is still processing messages when - // the visibility timeout expires and messages become visible, another worker - // reading from the same queue can receive the same messages and therefore - // process duplicates. Also, if a reader whose message processing time is - // longer than the visibility timeout tries to delete the processed messages, - // the action fails with an error. - // - // To mitigate this effect, ensure that your application observes a safe threshold - // before the visibility timeout expires and extend the visibility timeout - // as necessary. + // information, see Visibility Timeout (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html) + // in the Amazon Simple Queue Service Developer Guide. If a caller of the + // ReceiveMessage action still processes messages when the visibility timeout + // expires and messages become visible, another worker consuming from the + // same queue can receive the same messages and therefore process duplicates. + // Also, if a consumer whose message processing time is longer than the visibility + // timeout tries to delete the processed messages, the action fails with + // an error. To mitigate this effect, ensure that your application observes + // a safe threshold before the visibility timeout expires and extend the + // visibility timeout as necessary. // // * While messages with a particular MessageGroupId are invisible, no more // messages belonging to the same MessageGroupId are returned until the visibility @@ -3750,7 +3829,7 @@ type ReceiveMessageInput struct { // can contain alphanumeric characters (a-z, A-Z, 0-9) and punctuation (!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~). // // For best practices of using ReceiveRequestAttemptId, see Using the ReceiveRequestAttemptId - // Request Parameter (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queue-recommendations.html#using-receiverequestattemptid-request-parameter) + // Request Parameter (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-receiverequestattemptid-request-parameter.html) // in the Amazon Simple Queue Service Developer Guide. ReceiveRequestAttemptId *string `type:"string"` @@ -3865,7 +3944,7 @@ type RemovePermissionInput struct { // The URL of the Amazon SQS queue from which permissions are removed. // - // Queue URLs are case-sensitive. + // Queue URLs and names are case-sensitive. // // QueueUrl is a required field QueueUrl *string `type:"string" required:"true"` @@ -3933,7 +4012,7 @@ type SendMessageBatchInput struct { // The URL of the Amazon SQS queue to which batched messages are sent. // - // Queue URLs are case-sensitive. + // Queue URLs and names are case-sensitive. // // QueueUrl is a required field QueueUrl *string `type:"string" required:"true"` @@ -4044,11 +4123,14 @@ type SendMessageBatchRequestEntry struct { // // The Ids of a batch request need to be unique within a request // + // This identifier can have up to 80 characters. The following characters are + // accepted: alphanumeric characters, hyphens(-), and underscores (_). + // // Id is a required field Id *string `type:"string" required:"true"` // Each message attribute consists of a Name, Type, and Value. For more information, - // see Message Attribute Items and Validation (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-attributes.html#message-attributes-items-validation) + // see Amazon SQS Message Attributes (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-attributes.html) // in the Amazon Simple Queue Service Developer Guide. MessageAttributes map[string]*MessageAttributeValue `locationName:"MessageAttribute" locationNameKey:"Name" locationNameValue:"Value" type:"map" flattened:"true"` @@ -4062,24 +4144,17 @@ type SendMessageBatchRequestEntry struct { // The token used for deduplication of messages within a 5-minute minimum deduplication // interval. If a message with a particular MessageDeduplicationId is sent successfully, // subsequent messages with the same MessageDeduplicationId are accepted successfully - // but aren't delivered. For more information, see Exactly-Once Processing - // (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html#FIFO-queues-exactly-once-processing) + // but aren't delivered. For more information, see Exactly-Once Processing (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html#FIFO-queues-exactly-once-processing) // in the Amazon Simple Queue Service Developer Guide. // - // * Every message must have a unique MessageDeduplicationId, - // - // You may provide a MessageDeduplicationId explicitly. - // - // If you aren't able to provide a MessageDeduplicationId and you enable ContentBasedDeduplication - // for your queue, Amazon SQS uses a SHA-256 hash to generate the MessageDeduplicationId - // using the body of the message (but not the attributes of the message). - // - // - // If you don't provide a MessageDeduplicationId and the queue doesn't have - // ContentBasedDeduplication set, the action fails with an error. - // - // If the queue has ContentBasedDeduplication set, your MessageDeduplicationId - // overrides the generated one. + // * Every message must have a unique MessageDeduplicationId, You may provide + // a MessageDeduplicationId explicitly. If you aren't able to provide a MessageDeduplicationId + // and you enable ContentBasedDeduplication for your queue, Amazon SQS uses + // a SHA-256 hash to generate the MessageDeduplicationId using the body of + // the message (but not the attributes of the message). If you don't provide + // a MessageDeduplicationId and the queue doesn't have ContentBasedDeduplication + // set, the action fails with an error. If the queue has ContentBasedDeduplication + // set, your MessageDeduplicationId overrides the generated one. // // * When ContentBasedDeduplication is in effect, messages with identical // content sent within the deduplication interval are treated as duplicates @@ -4090,18 +4165,21 @@ type SendMessageBatchRequestEntry struct { // one generated for the first MessageDeduplicationId, the two messages are // treated as duplicates and only one copy of the message is delivered. // - // The MessageDeduplicationId is available to the recipient of the message (this + // The MessageDeduplicationId is available to the consumer of the message (this // can be useful for troubleshooting delivery issues). // // If a message is sent successfully but the acknowledgement is lost and the // message is resent with the same MessageDeduplicationId after the deduplication // interval, Amazon SQS can't detect duplicate messages. // + // Amazon SQS continues to keep track of the message deduplication ID even after + // the message is received and deleted. + // // The length of MessageDeduplicationId is 128 characters. MessageDeduplicationId // can contain alphanumeric characters (a-z, A-Z, 0-9) and punctuation (!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~). // // For best practices of using MessageDeduplicationId, see Using the MessageDeduplicationId - // Property (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queue-recommendations.html#using-messagededuplicationid-property) + // Property (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-messagededuplicationid-property.html) // in the Amazon Simple Queue Service Developer Guide. MessageDeduplicationId *string `type:"string"` @@ -4112,8 +4190,8 @@ type SendMessageBatchRequestEntry struct { // (however, messages in different message groups might be processed out of // order). To interleave multiple ordered streams within a single queue, use // MessageGroupId values (for example, session data for multiple users). In - // this scenario, multiple readers can process the queue, but the session data - // of each user is processed in a FIFO fashion. + // this scenario, multiple consumers can process the queue, but the session + // data of each user is processed in a FIFO fashion. // // * You must associate a non-empty MessageGroupId with a message. If you // don't provide a MessageGroupId, the action fails. @@ -4122,16 +4200,27 @@ type SendMessageBatchRequestEntry struct { // For each MessageGroupId, the messages are sorted by time sent. The caller // can't specify a MessageGroupId. // - // The length of MessageGroupId is 128 characters. Valid values are alphanumeric + // The length of MessageGroupId is 128 characters. Valid values: alphanumeric // characters and punctuation (!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~). // // For best practices of using MessageGroupId, see Using the MessageGroupId - // Property (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queue-recommendations.html#using-messagegroupid-property) + // Property (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-messagegroupid-property.html) // in the Amazon Simple Queue Service Developer Guide. // // MessageGroupId is required for FIFO queues. You can't use it for Standard // queues. MessageGroupId *string `type:"string"` + + // The message system attribute to send Each message system attribute consists + // of a Name, Type, and Value. + // + // * Currently, the only supported message system attribute is AWSTraceHeader. + // Its type must be String and its value must be a correctly formatted AWS + // X-Ray trace string. + // + // * The size of a message system attribute doesn't count towards the total + // size of a message. + MessageSystemAttributes map[string]*MessageSystemAttributeValue `locationName:"MessageSystemAttribute" locationNameKey:"Name" locationNameValue:"Value" type:"map" flattened:"true"` } // String returns the string representation @@ -4163,6 +4252,16 @@ func (s *SendMessageBatchRequestEntry) Validate() error { } } } + if s.MessageSystemAttributes != nil { + for i, v := range s.MessageSystemAttributes { + if v == nil { + continue + } + if err := v.Validate(); err != nil { + invalidParams.AddNested(fmt.Sprintf("%s[%v]", "MessageSystemAttributes", i), err.(request.ErrInvalidParams)) + } + } + } if invalidParams.Len() > 0 { return invalidParams @@ -4206,6 +4305,12 @@ func (s *SendMessageBatchRequestEntry) SetMessageGroupId(v string) *SendMessageB return s } +// SetMessageSystemAttributes sets the MessageSystemAttributes field's value. +func (s *SendMessageBatchRequestEntry) SetMessageSystemAttributes(v map[string]*MessageSystemAttributeValue) *SendMessageBatchRequestEntry { + s.MessageSystemAttributes = v + return s +} + // Encloses a MessageId for a successfully-enqueued message in a SendMessageBatch. type SendMessageBatchResultEntry struct { _ struct{} `type:"structure"` @@ -4229,6 +4334,12 @@ type SendMessageBatchResultEntry struct { // MD5OfMessageBody is a required field MD5OfMessageBody *string `type:"string" required:"true"` + // An MD5 digest of the non-URL-encoded message system attribute string. You + // can use this attribute to verify that Amazon SQS received the message correctly. + // Amazon SQS URL-decodes the message before creating the MD5 digest. For information + // about MD5, see RFC1321 (https://www.ietf.org/rfc/rfc1321.txt). + MD5OfMessageSystemAttributes *string `type:"string"` + // An identifier for the message. // // MessageId is a required field @@ -4271,6 +4382,12 @@ func (s *SendMessageBatchResultEntry) SetMD5OfMessageBody(v string) *SendMessage return s } +// SetMD5OfMessageSystemAttributes sets the MD5OfMessageSystemAttributes field's value. +func (s *SendMessageBatchResultEntry) SetMD5OfMessageSystemAttributes(v string) *SendMessageBatchResultEntry { + s.MD5OfMessageSystemAttributes = &v + return s +} + // SetMessageId sets the MessageId field's value. func (s *SendMessageBatchResultEntry) SetMessageId(v string) *SendMessageBatchResultEntry { s.MessageId = &v @@ -4296,7 +4413,7 @@ type SendMessageInput struct { DelaySeconds *int64 `type:"integer"` // Each message attribute consists of a Name, Type, and Value. For more information, - // see Message Attribute Items and Validation (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-attributes.html#message-attributes-items-validation) + // see Amazon SQS Message Attributes (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-attributes.html) // in the Amazon Simple Queue Service Developer Guide. MessageAttributes map[string]*MessageAttributeValue `locationName:"MessageAttribute" locationNameKey:"Name" locationNameValue:"Value" type:"map" flattened:"true"` @@ -4318,24 +4435,18 @@ type SendMessageInput struct { // The token used for deduplication of sent messages. If a message with a particular // MessageDeduplicationId is sent successfully, any messages sent with the same // MessageDeduplicationId are accepted successfully but aren't delivered during - // the 5-minute deduplication interval. For more information, see Exactly-Once - // Processing (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html#FIFO-queues-exactly-once-processing) + // the 5-minute deduplication interval. For more information, see Exactly-Once + // Processing (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html#FIFO-queues-exactly-once-processing) // in the Amazon Simple Queue Service Developer Guide. // - // * Every message must have a unique MessageDeduplicationId, - // - // You may provide a MessageDeduplicationId explicitly. - // - // If you aren't able to provide a MessageDeduplicationId and you enable ContentBasedDeduplication - // for your queue, Amazon SQS uses a SHA-256 hash to generate the MessageDeduplicationId - // using the body of the message (but not the attributes of the message). - // - // - // If you don't provide a MessageDeduplicationId and the queue doesn't have - // ContentBasedDeduplication set, the action fails with an error. - // - // If the queue has ContentBasedDeduplication set, your MessageDeduplicationId - // overrides the generated one. + // * Every message must have a unique MessageDeduplicationId, You may provide + // a MessageDeduplicationId explicitly. If you aren't able to provide a MessageDeduplicationId + // and you enable ContentBasedDeduplication for your queue, Amazon SQS uses + // a SHA-256 hash to generate the MessageDeduplicationId using the body of + // the message (but not the attributes of the message). If you don't provide + // a MessageDeduplicationId and the queue doesn't have ContentBasedDeduplication + // set, the action fails with an error. If the queue has ContentBasedDeduplication + // set, your MessageDeduplicationId overrides the generated one. // // * When ContentBasedDeduplication is in effect, messages with identical // content sent within the deduplication interval are treated as duplicates @@ -4346,18 +4457,21 @@ type SendMessageInput struct { // one generated for the first MessageDeduplicationId, the two messages are // treated as duplicates and only one copy of the message is delivered. // - // The MessageDeduplicationId is available to the recipient of the message (this + // The MessageDeduplicationId is available to the consumer of the message (this // can be useful for troubleshooting delivery issues). // // If a message is sent successfully but the acknowledgement is lost and the // message is resent with the same MessageDeduplicationId after the deduplication // interval, Amazon SQS can't detect duplicate messages. // + // Amazon SQS continues to keep track of the message deduplication ID even after + // the message is received and deleted. + // // The length of MessageDeduplicationId is 128 characters. MessageDeduplicationId // can contain alphanumeric characters (a-z, A-Z, 0-9) and punctuation (!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~). // // For best practices of using MessageDeduplicationId, see Using the MessageDeduplicationId - // Property (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queue-recommendations.html#using-messagededuplicationid-property) + // Property (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-messagededuplicationid-property.html) // in the Amazon Simple Queue Service Developer Guide. MessageDeduplicationId *string `type:"string"` @@ -4368,8 +4482,8 @@ type SendMessageInput struct { // (however, messages in different message groups might be processed out of // order). To interleave multiple ordered streams within a single queue, use // MessageGroupId values (for example, session data for multiple users). In - // this scenario, multiple readers can process the queue, but the session data - // of each user is processed in a FIFO fashion. + // this scenario, multiple consumers can process the queue, but the session + // data of each user is processed in a FIFO fashion. // // * You must associate a non-empty MessageGroupId with a message. If you // don't provide a MessageGroupId, the action fails. @@ -4378,20 +4492,31 @@ type SendMessageInput struct { // For each MessageGroupId, the messages are sorted by time sent. The caller // can't specify a MessageGroupId. // - // The length of MessageGroupId is 128 characters. Valid values are alphanumeric + // The length of MessageGroupId is 128 characters. Valid values: alphanumeric // characters and punctuation (!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~). // // For best practices of using MessageGroupId, see Using the MessageGroupId - // Property (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queue-recommendations.html#using-messagegroupid-property) + // Property (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-messagegroupid-property.html) // in the Amazon Simple Queue Service Developer Guide. // // MessageGroupId is required for FIFO queues. You can't use it for Standard // queues. MessageGroupId *string `type:"string"` + // The message system attribute to send. Each message system attribute consists + // of a Name, Type, and Value. + // + // * Currently, the only supported message system attribute is AWSTraceHeader. + // Its type must be String and its value must be a correctly formatted AWS + // X-Ray trace string. + // + // * The size of a message system attribute doesn't count towards the total + // size of a message. + MessageSystemAttributes map[string]*MessageSystemAttributeValue `locationName:"MessageSystemAttribute" locationNameKey:"Name" locationNameValue:"Value" type:"map" flattened:"true"` + // The URL of the Amazon SQS queue to which a message is sent. // - // Queue URLs are case-sensitive. + // Queue URLs and names are case-sensitive. // // QueueUrl is a required field QueueUrl *string `type:"string" required:"true"` @@ -4426,6 +4551,16 @@ func (s *SendMessageInput) Validate() error { } } } + if s.MessageSystemAttributes != nil { + for i, v := range s.MessageSystemAttributes { + if v == nil { + continue + } + if err := v.Validate(); err != nil { + invalidParams.AddNested(fmt.Sprintf("%s[%v]", "MessageSystemAttributes", i), err.(request.ErrInvalidParams)) + } + } + } if invalidParams.Len() > 0 { return invalidParams @@ -4463,6 +4598,12 @@ func (s *SendMessageInput) SetMessageGroupId(v string) *SendMessageInput { return s } +// SetMessageSystemAttributes sets the MessageSystemAttributes field's value. +func (s *SendMessageInput) SetMessageSystemAttributes(v map[string]*MessageSystemAttributeValue) *SendMessageInput { + s.MessageSystemAttributes = v + return s +} + // SetQueueUrl sets the QueueUrl field's value. func (s *SendMessageInput) SetQueueUrl(v string) *SendMessageInput { s.QueueUrl = &v @@ -4485,8 +4626,13 @@ type SendMessageOutput struct { // about MD5, see RFC1321 (https://www.ietf.org/rfc/rfc1321.txt). MD5OfMessageBody *string `type:"string"` + // An MD5 digest of the non-URL-encoded message system attribute string. You + // can use this attribute to verify that Amazon SQS received the message correctly. + // Amazon SQS URL-decodes the message before creating the MD5 digest. + MD5OfMessageSystemAttributes *string `type:"string"` + // An attribute containing the MessageId of the message sent to the queue. For - // more information, see Queue and Message Identifiers (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-queue-message-identifiers.html) + // more information, see Queue and Message Identifiers (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-queue-message-identifiers.html) // in the Amazon Simple Queue Service Developer Guide. MessageId *string `type:"string"` @@ -4521,6 +4667,12 @@ func (s *SendMessageOutput) SetMD5OfMessageBody(v string) *SendMessageOutput { return s } +// SetMD5OfMessageSystemAttributes sets the MD5OfMessageSystemAttributes field's value. +func (s *SendMessageOutput) SetMD5OfMessageSystemAttributes(v string) *SendMessageOutput { + s.MD5OfMessageSystemAttributes = &v + return s +} + // SetMessageId sets the MessageId field's value. func (s *SendMessageOutput) SetMessageId(v string) *SendMessageOutput { s.MessageId = &v @@ -4543,117 +4695,89 @@ type SetQueueAttributesInput struct { // // * DelaySeconds - The length of time, in seconds, for which the delivery // of all messages in the queue is delayed. Valid values: An integer from - // 0 to 900 (15 minutes). The default is 0 (zero). + // 0 to 900 (15 minutes). Default: 0. // // * MaximumMessageSize - The limit of how many bytes a message can contain // before Amazon SQS rejects it. Valid values: An integer from 1,024 bytes - // (1 KiB) up to 262,144 bytes (256 KiB). The default is 262,144 (256 KiB). - // + // (1 KiB) up to 262,144 bytes (256 KiB). Default: 262,144 (256 KiB). // // * MessageRetentionPeriod - The length of time, in seconds, for which Amazon // SQS retains a message. Valid values: An integer representing seconds, - // from 60 (1 minute) to 1,209,600 (14 days). The default is 345,600 (4 days). - // + // from 60 (1 minute) to 1,209,600 (14 days). Default: 345,600 (4 days). // // * Policy - The queue's policy. A valid AWS policy. For more information - // about policy structure, see Overview of AWS IAM Policies (http://docs.aws.amazon.com/IAM/latest/UserGuide/PoliciesOverview.html) + // about policy structure, see Overview of AWS IAM Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/PoliciesOverview.html) // in the Amazon IAM User Guide. // // * ReceiveMessageWaitTimeSeconds - The length of time, in seconds, for // which a ReceiveMessage action waits for a message to arrive. Valid values: - // an integer from 0 to 20 (seconds). The default is 0. + // an integer from 0 to 20 (seconds). Default: 0. // // * RedrivePolicy - The string that includes the parameters for the dead-letter // queue functionality of the source queue. For more information about the // redrive policy and dead-letter queues, see Using Amazon SQS Dead-Letter - // Queues (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html) - // in the Amazon Simple Queue Service Developer Guide. - // - // deadLetterTargetArn - The Amazon Resource Name (ARN) of the dead-letter queue - // to which Amazon SQS moves messages after the value of maxReceiveCount - // is exceeded. - // - // maxReceiveCount - The number of times a message is delivered to the source - // queue before being moved to the dead-letter queue. - // - // The dead-letter queue of a FIFO queue must also be a FIFO queue. Similarly, - // the dead-letter queue of a standard queue must also be a standard queue. - // - // * VisibilityTimeout - The visibility timeout for the queue. Valid values: - // an integer from 0 to 43,200 (12 hours). The default is 30. For more information - // about the visibility timeout, see Visibility Timeout (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html) + // Queues (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html) + // in the Amazon Simple Queue Service Developer Guide. deadLetterTargetArn + // - The Amazon Resource Name (ARN) of the dead-letter queue to which Amazon + // SQS moves messages after the value of maxReceiveCount is exceeded. maxReceiveCount + // - The number of times a message is delivered to the source queue before + // being moved to the dead-letter queue. When the ReceiveCount for a message + // exceeds the maxReceiveCount for a queue, Amazon SQS moves the message + // to the dead-letter-queue. The dead-letter queue of a FIFO queue must also + // be a FIFO queue. Similarly, the dead-letter queue of a standard queue + // must also be a standard queue. + // + // * VisibilityTimeout - The visibility timeout for the queue, in seconds. + // Valid values: an integer from 0 to 43,200 (12 hours). Default: 30. For + // more information about the visibility timeout, see Visibility Timeout + // (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html) // in the Amazon Simple Queue Service Developer Guide. // - // The following attributes apply only to server-side-encryption (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-server-side-encryption.html): + // The following attributes apply only to server-side-encryption (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-server-side-encryption.html): // // * KmsMasterKeyId - The ID of an AWS-managed customer master key (CMK) - // for Amazon SQS or a custom CMK. For more information, see Key Terms (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-server-side-encryption.html#sqs-sse-key-terms). + // for Amazon SQS or a custom CMK. For more information, see Key Terms (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-server-side-encryption.html#sqs-sse-key-terms). // While the alias of the AWS-managed CMK for Amazon SQS is always alias/aws/sqs, - // the alias of a custom CMK can, for example, be alias/MyAlias. For more - // examples, see KeyId (http://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html#API_DescribeKey_RequestParameters) + // the alias of a custom CMK can, for example, be alias/MyAlias . For more + // examples, see KeyId (https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html#API_DescribeKey_RequestParameters) // in the AWS Key Management Service API Reference. // // * KmsDataKeyReusePeriodSeconds - The length of time, in seconds, for which - // Amazon SQS can reuse a data key (http://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#data-keys) + // Amazon SQS can reuse a data key (https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#data-keys) // to encrypt or decrypt messages before calling AWS KMS again. An integer // representing seconds, between 60 seconds (1 minute) and 86,400 seconds - // (24 hours). The default is 300 (5 minutes). A shorter time period provides - // better security but results in more calls to KMS which might incur charges - // after Free Tier. For more information, see How Does the Data Key Reuse - // Period Work? (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-server-side-encryption.html#sqs-how-does-the-data-key-reuse-period-work). - // + // (24 hours). Default: 300 (5 minutes). A shorter time period provides better + // security but results in more calls to KMS which might incur charges after + // Free Tier. For more information, see How Does the Data Key Reuse Period + // Work? (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-server-side-encryption.html#sqs-how-does-the-data-key-reuse-period-work). // // The following attribute applies only to FIFO (first-in-first-out) queues - // (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html): + // (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html): // // * ContentBasedDeduplication - Enables content-based deduplication. For - // more information, see Exactly-Once Processing (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html#FIFO-queues-exactly-once-processing) - // in the Amazon Simple Queue Service Developer Guide. - // - // Every message must have a unique MessageDeduplicationId, - // - // You may provide a MessageDeduplicationId explicitly. - // - // If you aren't able to provide a MessageDeduplicationId and you enable ContentBasedDeduplication - // for your queue, Amazon SQS uses a SHA-256 hash to generate the MessageDeduplicationId - // using the body of the message (but not the attributes of the message). - // - // - // If you don't provide a MessageDeduplicationId and the queue doesn't have - // ContentBasedDeduplication set, the action fails with an error. - // - // If the queue has ContentBasedDeduplication set, your MessageDeduplicationId - // overrides the generated one. - // - // When ContentBasedDeduplication is in effect, messages with identical content - // sent within the deduplication interval are treated as duplicates and only - // one copy of the message is delivered. - // - // If you send one message with ContentBasedDeduplication enabled and then another - // message with a MessageDeduplicationId that is the same as the one generated - // for the first MessageDeduplicationId, the two messages are treated as - // duplicates and only one copy of the message is delivered. - // - // Any other valid special request parameters (such as the following) are ignored: - // - // * ApproximateNumberOfMessages - // - // * ApproximateNumberOfMessagesDelayed - // - // * ApproximateNumberOfMessagesNotVisible - // - // * CreatedTimestamp - // - // * LastModifiedTimestamp - // - // * QueueArn + // more information, see Exactly-Once Processing (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html#FIFO-queues-exactly-once-processing) + // in the Amazon Simple Queue Service Developer Guide. Every message must + // have a unique MessageDeduplicationId, You may provide a MessageDeduplicationId + // explicitly. If you aren't able to provide a MessageDeduplicationId and + // you enable ContentBasedDeduplication for your queue, Amazon SQS uses a + // SHA-256 hash to generate the MessageDeduplicationId using the body of + // the message (but not the attributes of the message). If you don't provide + // a MessageDeduplicationId and the queue doesn't have ContentBasedDeduplication + // set, the action fails with an error. If the queue has ContentBasedDeduplication + // set, your MessageDeduplicationId overrides the generated one. When ContentBasedDeduplication + // is in effect, messages with identical content sent within the deduplication + // interval are treated as duplicates and only one copy of the message is + // delivered. If you send one message with ContentBasedDeduplication enabled + // and then another message with a MessageDeduplicationId that is the same + // as the one generated for the first MessageDeduplicationId, the two messages + // are treated as duplicates and only one copy of the message is delivered. // // Attributes is a required field Attributes map[string]*string `locationName:"Attribute" locationNameKey:"Name" locationNameValue:"Value" type:"map" flattened:"true" required:"true"` // The URL of the Amazon SQS queue whose attributes are set. // - // Queue URLs are case-sensitive. + // Queue URLs and names are case-sensitive. // // QueueUrl is a required field QueueUrl *string `type:"string" required:"true"` @@ -4864,6 +4988,14 @@ const ( // MessageSystemAttributeNameMessageGroupId is a MessageSystemAttributeName enum value MessageSystemAttributeNameMessageGroupId = "MessageGroupId" + + // MessageSystemAttributeNameAwstraceHeader is a MessageSystemAttributeName enum value + MessageSystemAttributeNameAwstraceHeader = "AWSTraceHeader" +) + +const ( + // MessageSystemAttributeNameForSendsAwstraceHeader is a MessageSystemAttributeNameForSends enum value + MessageSystemAttributeNameForSendsAwstraceHeader = "AWSTraceHeader" ) const ( diff --git a/vendor/github.com/aws/aws-sdk-go/service/sqs/checksums.go b/vendor/github.com/aws/aws-sdk-go/service/sqs/checksums.go index 5dd17c4d9..e85e89a81 100644 --- a/vendor/github.com/aws/aws-sdk-go/service/sqs/checksums.go +++ b/vendor/github.com/aws/aws-sdk-go/service/sqs/checksums.go @@ -54,9 +54,8 @@ func verifySendMessageBatch(r *request.Request) { in := r.Params.(*SendMessageBatchInput) for _, entry := range in.Entries { - if e := entries[*entry.Id]; e != nil { - err := checksumsMatch(entry.MessageBody, e.MD5OfMessageBody) - if err != nil { + if e, ok := entries[*entry.Id]; ok { + if err := checksumsMatch(entry.MessageBody, e.MD5OfMessageBody); err != nil { ids = append(ids, *e.MessageId) } } diff --git a/vendor/github.com/aws/aws-sdk-go/service/sqs/doc.go b/vendor/github.com/aws/aws-sdk-go/service/sqs/doc.go index 7f0c5799f..3a3f55f09 100644 --- a/vendor/github.com/aws/aws-sdk-go/service/sqs/doc.go +++ b/vendor/github.com/aws/aws-sdk-go/service/sqs/doc.go @@ -10,11 +10,6 @@ // Amazon SQS moves data between distributed application components and helps // you decouple these components. // -// Standard queues (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/standard-queues.html) -// are available in all regions. FIFO queues (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html) -// are available in the US East (N. Virginia), US East (Ohio), US West (Oregon), -// and EU (Ireland) regions. -// // You can use AWS SDKs (http://aws.amazon.com/tools/#sdk) to access Amazon // SQS using your favorite programming language. The SDKs perform tasks such // as the following automatically: @@ -29,17 +24,13 @@ // // * Amazon SQS Product Page (http://aws.amazon.com/sqs/) // -// * Amazon Simple Queue Service Developer Guide -// -// Making API Requests (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/MakingRequestsArticle.html) -// -// Using Amazon SQS Message Attributes (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-attributes.html) -// -// Using Amazon SQS Dead-Letter Queues (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html) +// * Amazon Simple Queue Service Developer Guide Making API Requests (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-making-api-requests.html) +// Amazon SQS Message Attributes (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-attributes.html) +// Amazon SQS Dead-Letter Queues (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html) // -// * Amazon Web Services General Reference +// * Amazon SQS in the AWS CLI Command Reference (http://docs.aws.amazon.com/cli/latest/reference/sqs/index.html) // -// Regions and Endpoints (http://docs.aws.amazon.com/general/latest/gr/rande.html#sqs_region) +// * Amazon Web Services General Reference Regions and Endpoints (https://docs.aws.amazon.com/general/latest/gr/rande.html#sqs_region) // // See https://docs.aws.amazon.com/goto/WebAPI/sqs-2012-11-05 for more information on this service. // diff --git a/vendor/github.com/aws/aws-sdk-go/service/sqs/errors.go b/vendor/github.com/aws/aws-sdk-go/service/sqs/errors.go index 722867d32..89eb40d7f 100644 --- a/vendor/github.com/aws/aws-sdk-go/service/sqs/errors.go +++ b/vendor/github.com/aws/aws-sdk-go/service/sqs/errors.go @@ -25,7 +25,7 @@ const ( // ErrCodeInvalidAttributeName for service response error code // "InvalidAttributeName". // - // The attribute referred to doesn't exist. + // The specified attribute doesn't exist. ErrCodeInvalidAttributeName = "InvalidAttributeName" // ErrCodeInvalidBatchEntryId for service response error code @@ -37,7 +37,7 @@ const ( // ErrCodeInvalidIdFormat for service response error code // "InvalidIdFormat". // - // The receipt handle isn't valid for the current version. + // The specified receipt handle isn't valid for the current version. ErrCodeInvalidIdFormat = "InvalidIdFormat" // ErrCodeInvalidMessageContents for service response error code @@ -49,16 +49,16 @@ const ( // ErrCodeMessageNotInflight for service response error code // "AWS.SimpleQueueService.MessageNotInflight". // - // The message referred to isn't in flight. + // The specified message isn't in flight. ErrCodeMessageNotInflight = "AWS.SimpleQueueService.MessageNotInflight" // ErrCodeOverLimit for service response error code // "OverLimit". // - // The action that you requested would violate a limit. For example, ReceiveMessage - // returns this error if the maximum number of inflight messages is reached. - // AddPermission returns this error if the maximum number of permissions for - // the queue is reached. + // The specified action violates a limit. For example, ReceiveMessage returns + // this error if the maximum number of inflight messages is reached and AddPermission + // returns this error if the maximum number of permissions for the queue is + // reached. ErrCodeOverLimit = "OverLimit" // ErrCodePurgeQueueInProgress for service response error code @@ -73,19 +73,19 @@ const ( // "AWS.SimpleQueueService.QueueDeletedRecently". // // You must wait 60 seconds after deleting a queue before you can create another - // one with the same name. + // queue with the same name. ErrCodeQueueDeletedRecently = "AWS.SimpleQueueService.QueueDeletedRecently" // ErrCodeQueueDoesNotExist for service response error code // "AWS.SimpleQueueService.NonExistentQueue". // - // The queue referred to doesn't exist. + // The specified queue doesn't exist. ErrCodeQueueDoesNotExist = "AWS.SimpleQueueService.NonExistentQueue" // ErrCodeQueueNameExists for service response error code // "QueueAlreadyExists". // - // A queue already exists with this name. Amazon SQS returns this error only + // A queue with this name already exists. Amazon SQS returns this error only // if the request includes attributes whose values differ from those of the // existing queue. ErrCodeQueueNameExists = "QueueAlreadyExists" @@ -93,7 +93,7 @@ const ( // ErrCodeReceiptHandleIsInvalid for service response error code // "ReceiptHandleIsInvalid". // - // The receipt handle provided isn't valid. + // The specified receipt handle isn't valid. ErrCodeReceiptHandleIsInvalid = "ReceiptHandleIsInvalid" // ErrCodeTooManyEntriesInBatchRequest for service response error code diff --git a/vendor/github.com/aws/aws-sdk-go/service/sqs/service.go b/vendor/github.com/aws/aws-sdk-go/service/sqs/service.go index 50b5f4b80..f4f614207 100644 --- a/vendor/github.com/aws/aws-sdk-go/service/sqs/service.go +++ b/vendor/github.com/aws/aws-sdk-go/service/sqs/service.go @@ -29,8 +29,9 @@ var initRequest func(*request.Request) // Service information constants const ( - ServiceName = "sqs" // Service endpoint prefix API calls made to. - EndpointsID = ServiceName // Service ID for Regions and Endpoints metadata. + ServiceName = "sqs" // Name of service. + EndpointsID = ServiceName // ID to lookup a service endpoint with. + ServiceID = "SQS" // ServiceID is a unique identifier of a specific service. ) // New creates a new instance of the SQS client with a session. @@ -38,6 +39,8 @@ const ( // aws.Config parameter to add your extra config. // // Example: +// mySession := session.Must(session.NewSession()) +// // // Create a SQS client from just a session. // svc := sqs.New(mySession) // @@ -45,18 +48,20 @@ const ( // svc := sqs.New(mySession, aws.NewConfig().WithRegion("us-west-2")) func New(p client.ConfigProvider, cfgs ...*aws.Config) *SQS { c := p.ClientConfig(EndpointsID, cfgs...) - return newClient(*c.Config, c.Handlers, c.Endpoint, c.SigningRegion, c.SigningName) + return newClient(*c.Config, c.Handlers, c.PartitionID, c.Endpoint, c.SigningRegion, c.SigningName) } // newClient creates, initializes and returns a new service client instance. -func newClient(cfg aws.Config, handlers request.Handlers, endpoint, signingRegion, signingName string) *SQS { +func newClient(cfg aws.Config, handlers request.Handlers, partitionID, endpoint, signingRegion, signingName string) *SQS { svc := &SQS{ Client: client.New( cfg, metadata.ClientInfo{ ServiceName: ServiceName, + ServiceID: ServiceID, SigningName: signingName, SigningRegion: signingRegion, + PartitionID: partitionID, Endpoint: endpoint, APIVersion: "2012-11-05", }, diff --git a/vendor/github.com/aws/aws-sdk-go/service/sts/api.go b/vendor/github.com/aws/aws-sdk-go/service/sts/api.go index b46da12ca..7f60d4aa1 100644 --- a/vendor/github.com/aws/aws-sdk-go/service/sts/api.go +++ b/vendor/github.com/aws/aws-sdk-go/service/sts/api.go @@ -3,10 +3,12 @@ package sts import ( + "fmt" "time" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awsutil" + "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/request" ) @@ -15,7 +17,7 @@ const opAssumeRole = "AssumeRole" // AssumeRoleRequest generates a "aws/request.Request" representing the // client's request for the AssumeRole operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -54,39 +56,29 @@ func (c *STS) AssumeRoleRequest(input *AssumeRoleInput) (req *request.Request, o // AssumeRole API operation for AWS Security Token Service. // -// Returns a set of temporary security credentials (consisting of an access -// key ID, a secret access key, and a security token) that you can use to access -// AWS resources that you might not normally have access to. Typically, you -// use AssumeRole for cross-account access or federation. For a comparison of -// AssumeRole with the other APIs that produce temporary credentials, see Requesting -// Temporary Security Credentials (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) -// and Comparing the AWS STS APIs (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) +// Returns a set of temporary security credentials that you can use to access +// AWS resources that you might not normally have access to. These temporary +// credentials consist of an access key ID, a secret access key, and a security +// token. Typically, you use AssumeRole within your account or for cross-account +// access. For a comparison of AssumeRole with other API operations that produce +// temporary credentials, see Requesting Temporary Security Credentials (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) +// and Comparing the AWS STS API operations (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) // in the IAM User Guide. // -// Important: You cannot call AssumeRole by using AWS root account credentials; -// access is denied. You must use credentials for an IAM user or an IAM role -// to call AssumeRole. +// You cannot use AWS account root user credentials to call AssumeRole. You +// must use credentials for an IAM user or an IAM role to call AssumeRole. // // For cross-account access, imagine that you own multiple accounts and need // to access resources in each account. You could create long-term credentials // in each account to access those resources. However, managing all those credentials // and remembering which one can access which account can be time consuming. -// Instead, you can create one set of long-term credentials in one account and -// then use temporary security credentials to access all the other accounts +// Instead, you can create one set of long-term credentials in one account. +// Then use temporary security credentials to access all the other accounts // by assuming roles in those accounts. For more information about roles, see -// IAM Roles (Delegation and Federation) (http://docs.aws.amazon.com/IAM/latest/UserGuide/roles-toplevel.html) +// IAM Roles (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) // in the IAM User Guide. // -// For federation, you can, for example, grant single sign-on access to the -// AWS Management Console. If you already have an identity and authentication -// system in your corporate network, you don't have to recreate user identities -// in AWS in order to grant those user identities access to AWS. Instead, after -// a user has been authenticated, you call AssumeRole (and specify the role -// with the appropriate permissions) to get temporary security credentials for -// that user. With those temporary security credentials, you construct a sign-in -// URL that users can use to access the console. For more information, see Common -// Scenarios for Temporary Credentials (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html#sts-introduction) -// in the IAM User Guide. +// Session Duration // // By default, the temporary security credentials created by AssumeRole last // for one hour. However, you can use the optional DurationSeconds parameter @@ -94,69 +86,93 @@ func (c *STS) AssumeRoleRequest(input *AssumeRoleInput) (req *request.Request, o // seconds (15 minutes) up to the maximum session duration setting for the role. // This setting can have a value from 1 hour to 12 hours. To learn how to view // the maximum value for your role, see View the Maximum Session Duration Setting -// for a Role (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) +// for a Role (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) // in the IAM User Guide. The maximum session duration limit applies when you -// use the AssumeRole* API operations or the assume-role* CLI operations but -// does not apply when you use those operations to create a console URL. For -// more information, see Using IAM Roles (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html) +// use the AssumeRole* API operations or the assume-role* CLI commands. However +// the limit does not apply when you use those operations to create a console +// URL. For more information, see Using IAM Roles (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html) // in the IAM User Guide. // +// Permissions +// // The temporary security credentials created by AssumeRole can be used to make -// API calls to any AWS service with the following exception: you cannot call -// the STS service's GetFederationToken or GetSessionToken APIs. -// -// Optionally, you can pass an IAM access policy to this operation. If you choose -// not to pass a policy, the temporary security credentials that are returned -// by the operation have the permissions that are defined in the access policy -// of the role that is being assumed. If you pass a policy to this operation, -// the temporary security credentials that are returned by the operation have -// the permissions that are allowed by both the access policy of the role that -// is being assumed, and the policy that you pass. This gives you a way to further -// restrict the permissions for the resulting temporary security credentials. -// You cannot use the passed policy to grant permissions that are in excess -// of those allowed by the access policy of the role that is being assumed. -// For more information, see Permissions for AssumeRole, AssumeRoleWithSAML, -// and AssumeRoleWithWebIdentity (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_assumerole.html) +// API calls to any AWS service with the following exception: You cannot call +// the AWS STS GetFederationToken or GetSessionToken API operations. +// +// (Optional) You can pass inline or managed session policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) +// to this operation. You can pass a single JSON policy document to use as an +// inline session policy. You can also specify up to 10 managed policies to +// use as managed session policies. The plain text that you use for both inline +// and managed session policies can't exceed 2,048 characters. Passing policies +// to this operation returns new temporary credentials. The resulting session's +// permissions are the intersection of the role's identity-based policy and +// the session policies. You can use the role's temporary credentials in subsequent +// AWS API calls to access resources in the account that owns the role. You +// cannot use session policies to grant more permissions than those allowed +// by the identity-based policy of the role that is being assumed. For more +// information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) // in the IAM User Guide. // -// To assume a role, your AWS account must be trusted by the role. The trust -// relationship is defined in the role's trust policy when the role is created. -// That trust policy states which accounts are allowed to delegate access to -// this account's role. -// -// The user who wants to access the role must also have permissions delegated -// from the role's administrator. If the user is in a different account than -// the role, then the user's administrator must attach a policy that allows -// the user to call AssumeRole on the ARN of the role in the other account. -// If the user is in the same account as the role, then you can either attach -// a policy to the user (identical to the previous different account user), -// or you can add the user as a principal directly in the role's trust policy. -// In this case, the trust policy acts as the only resource-based policy in -// IAM, and users in the same account as the role do not need explicit permission -// to assume the role. For more information about trust policies and resource-based -// policies, see IAM Policies (http://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html) +// To assume a role from a different account, your AWS account must be trusted +// by the role. The trust relationship is defined in the role's trust policy +// when the role is created. That trust policy states which accounts are allowed +// to delegate that access to users in the account. +// +// A user who wants to access a role in a different account must also have permissions +// that are delegated from the user account administrator. The administrator +// must attach a policy that allows the user to call AssumeRole for the ARN +// of the role in the other account. If the user is in the same account as the +// role, then you can do either of the following: +// +// * Attach a policy to the user (identical to the previous user in a different +// account). +// +// * Add the user as a principal directly in the role's trust policy. +// +// In this case, the trust policy acts as an IAM resource-based policy. Users +// in the same account as the role do not need explicit permission to assume +// the role. For more information about trust policies and resource-based policies, +// see IAM Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html) +// in the IAM User Guide. +// +// Tags +// +// (Optional) You can pass tag key-value pairs to your session. These tags are +// called session tags. For more information about session tags, see Passing +// Session Tags in STS (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) +// in the IAM User Guide. +// +// An administrator must grant you the permissions necessary to pass session +// tags. The administrator can also create granular permissions to allow you +// to pass only specific session tags. For more information, see Tutorial: Using +// Tags for Attribute-Based Access Control (https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html) +// in the IAM User Guide. +// +// You can set the session tags as transitive. Transitive tags persist during +// role chaining. For more information, see Chaining Roles with Session Tags +// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_role-chaining) // in the IAM User Guide. // // Using MFA with AssumeRole // -// You can optionally include multi-factor authentication (MFA) information -// when you call AssumeRole. This is useful for cross-account scenarios in which -// you want to make sure that the user who is assuming the role has been authenticated -// using an AWS MFA device. In that scenario, the trust policy of the role being -// assumed includes a condition that tests for MFA authentication; if the caller -// does not include valid MFA information, the request to assume the role is -// denied. The condition in a trust policy that tests for MFA authentication -// might look like the following example. +// (Optional) You can include multi-factor authentication (MFA) information +// when you call AssumeRole. This is useful for cross-account scenarios to ensure +// that the user that assumes the role has been authenticated with an AWS MFA +// device. In that scenario, the trust policy of the role being assumed includes +// a condition that tests for MFA authentication. If the caller does not include +// valid MFA information, the request to assume the role is denied. The condition +// in a trust policy that tests for MFA authentication might look like the following +// example. // // "Condition": {"Bool": {"aws:MultiFactorAuthPresent": true}} // -// For more information, see Configuring MFA-Protected API Access (http://docs.aws.amazon.com/IAM/latest/UserGuide/MFAProtectedAPI.html) +// For more information, see Configuring MFA-Protected API Access (https://docs.aws.amazon.com/IAM/latest/UserGuide/MFAProtectedAPI.html) // in the IAM User Guide guide. // // To use MFA with AssumeRole, you pass values for the SerialNumber and TokenCode // parameters. The SerialNumber value identifies the user's hardware or virtual // MFA device. The TokenCode is the time-based one-time password (TOTP) that -// the MFA devices produces. +// the MFA device produces. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -171,15 +187,24 @@ func (c *STS) AssumeRoleRequest(input *AssumeRoleInput) (req *request.Request, o // message describes the specific error. // // * ErrCodePackedPolicyTooLargeException "PackedPolicyTooLarge" -// The request was rejected because the policy document was too large. The error -// message describes how big the policy document is, in packed form, as a percentage -// of what the API allows. +// The request was rejected because the total packed size of the session policies +// and session tags combined was too large. An AWS conversion compresses the +// session policy document, session policy ARNs, and session tags into a packed +// binary format that has a separate limit. The error message indicates by percentage +// how close the policies and tags are to the upper size limit. For more information, +// see Passing Session Tags in STS (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) +// in the IAM User Guide. +// +// You could receive this error even though you meet other defined session policy +// and session tag limits. For more information, see IAM and STS Entity Character +// Limits (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) +// in the IAM User Guide. // // * ErrCodeRegionDisabledException "RegionDisabledException" // STS is not activated in the requested region for the account that is being // asked to generate credentials. The account administrator must use the IAM // console to activate STS in that region. For more information, see Activating -// and Deactivating AWS STS in an AWS Region (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) +// and Deactivating AWS STS in an AWS Region (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) // in the IAM User Guide. // // See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRole @@ -209,7 +234,7 @@ const opAssumeRoleWithSAML = "AssumeRoleWithSAML" // AssumeRoleWithSAMLRequest generates a "aws/request.Request" representing the // client's request for the AssumeRoleWithSAML operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -243,6 +268,7 @@ func (c *STS) AssumeRoleWithSAMLRequest(input *AssumeRoleWithSAMLInput) (req *re output = &AssumeRoleWithSAMLOutput{} req = c.newRequest(op, input, output) + req.Config.Credentials = credentials.AnonymousCredentials return } @@ -252,15 +278,17 @@ func (c *STS) AssumeRoleWithSAMLRequest(input *AssumeRoleWithSAMLInput) (req *re // via a SAML authentication response. This operation provides a mechanism for // tying an enterprise identity store or directory to role-based AWS access // without user-specific credentials or configuration. For a comparison of AssumeRoleWithSAML -// with the other APIs that produce temporary credentials, see Requesting Temporary -// Security Credentials (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) -// and Comparing the AWS STS APIs (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) +// with the other API operations that produce temporary credentials, see Requesting +// Temporary Security Credentials (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) +// and Comparing the AWS STS API operations (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) // in the IAM User Guide. // // The temporary security credentials returned by this operation consist of // an access key ID, a secret access key, and a security token. Applications // can use these temporary security credentials to sign calls to AWS services. // +// Session Duration +// // By default, the temporary security credentials created by AssumeRoleWithSAML // last for one hour. However, you can use the optional DurationSeconds parameter // to specify the duration of your session. Your role session lasts for the @@ -269,38 +297,33 @@ func (c *STS) AssumeRoleWithSAMLRequest(input *AssumeRoleWithSAMLInput) (req *re // a DurationSeconds value from 900 seconds (15 minutes) up to the maximum session // duration setting for the role. This setting can have a value from 1 hour // to 12 hours. To learn how to view the maximum value for your role, see View -// the Maximum Session Duration Setting for a Role (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) +// the Maximum Session Duration Setting for a Role (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) // in the IAM User Guide. The maximum session duration limit applies when you -// use the AssumeRole* API operations or the assume-role* CLI operations but -// does not apply when you use those operations to create a console URL. For -// more information, see Using IAM Roles (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html) +// use the AssumeRole* API operations or the assume-role* CLI commands. However +// the limit does not apply when you use those operations to create a console +// URL. For more information, see Using IAM Roles (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html) // in the IAM User Guide. // +// Permissions +// // The temporary security credentials created by AssumeRoleWithSAML can be used // to make API calls to any AWS service with the following exception: you cannot -// call the STS service's GetFederationToken or GetSessionToken APIs. -// -// Optionally, you can pass an IAM access policy to this operation. If you choose -// not to pass a policy, the temporary security credentials that are returned -// by the operation have the permissions that are defined in the access policy -// of the role that is being assumed. If you pass a policy to this operation, -// the temporary security credentials that are returned by the operation have -// the permissions that are allowed by the intersection of both the access policy -// of the role that is being assumed, and the policy that you pass. This means -// that both policies must grant the permission for the action to be allowed. -// This gives you a way to further restrict the permissions for the resulting -// temporary security credentials. You cannot use the passed policy to grant -// permissions that are in excess of those allowed by the access policy of the -// role that is being assumed. For more information, see Permissions for AssumeRole, -// AssumeRoleWithSAML, and AssumeRoleWithWebIdentity (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_assumerole.html) +// call the STS GetFederationToken or GetSessionToken API operations. +// +// (Optional) You can pass inline or managed session policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) +// to this operation. You can pass a single JSON policy document to use as an +// inline session policy. You can also specify up to 10 managed policies to +// use as managed session policies. The plain text that you use for both inline +// and managed session policies can't exceed 2,048 characters. Passing policies +// to this operation returns new temporary credentials. The resulting session's +// permissions are the intersection of the role's identity-based policy and +// the session policies. You can use the role's temporary credentials in subsequent +// AWS API calls to access resources in the account that owns the role. You +// cannot use session policies to grant more permissions than those allowed +// by the identity-based policy of the role that is being assumed. For more +// information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) // in the IAM User Guide. // -// Before your application can call AssumeRoleWithSAML, you must configure your -// SAML identity provider (IdP) to issue the claims required by AWS. Additionally, -// you must use AWS Identity and Access Management (IAM) to create a SAML provider -// entity in your AWS account that represents your identity provider, and create -// an IAM role that specifies this SAML provider in its trust policy. -// // Calling AssumeRoleWithSAML does not require the use of AWS security credentials. // The identity of the caller is validated by using keys in the metadata document // that is uploaded for the SAML provider entity for your identity provider. @@ -308,21 +331,63 @@ func (c *STS) AssumeRoleWithSAMLRequest(input *AssumeRoleWithSAMLInput) (req *re // Calling AssumeRoleWithSAML can result in an entry in your AWS CloudTrail // logs. The entry includes the value in the NameID element of the SAML assertion. // We recommend that you use a NameIDType that is not associated with any personally -// identifiable information (PII). For example, you could instead use the Persistent -// Identifier (urn:oasis:names:tc:SAML:2.0:nameid-format:persistent). +// identifiable information (PII). For example, you could instead use the persistent +// identifier (urn:oasis:names:tc:SAML:2.0:nameid-format:persistent). +// +// Tags +// +// (Optional) You can configure your IdP to pass attributes into your SAML assertion +// as session tags. Each session tag consists of a key name and an associated +// value. For more information about session tags, see Passing Session Tags +// in STS (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) +// in the IAM User Guide. +// +// You can pass up to 50 session tags. The plain text session tag keys can’t +// exceed 128 characters and the values can’t exceed 256 characters. For these +// and additional limits, see IAM and STS Character Limits (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html#reference_iam-limits-entity-length) +// in the IAM User Guide. +// +// An AWS conversion compresses the passed session policies and session tags +// into a packed binary format that has a separate limit. Your request can fail +// for this limit even if your plain text meets the other requirements. The +// PackedPolicySize response element indicates by percentage how close the policies +// and tags for your request are to the upper size limit. +// +// You can pass a session tag with the same key as a tag that is attached to +// the role. When you do, session tags override the role's tags with the same +// key. +// +// An administrator must grant you the permissions necessary to pass session +// tags. The administrator can also create granular permissions to allow you +// to pass only specific session tags. For more information, see Tutorial: Using +// Tags for Attribute-Based Access Control (https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html) +// in the IAM User Guide. +// +// You can set the session tags as transitive. Transitive tags persist during +// role chaining. For more information, see Chaining Roles with Session Tags +// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_role-chaining) +// in the IAM User Guide. +// +// SAML Configuration +// +// Before your application can call AssumeRoleWithSAML, you must configure your +// SAML identity provider (IdP) to issue the claims required by AWS. Additionally, +// you must use AWS Identity and Access Management (IAM) to create a SAML provider +// entity in your AWS account that represents your identity provider. You must +// also create an IAM role that specifies this SAML provider in its trust policy. // // For more information, see the following resources: // -// * About SAML 2.0-based Federation (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_saml.html) +// * About SAML 2.0-based Federation (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_saml.html) // in the IAM User Guide. // -// * Creating SAML Identity Providers (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml.html) +// * Creating SAML Identity Providers (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml.html) // in the IAM User Guide. // -// * Configuring a Relying Party and Claims (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml_relying-party.html) +// * Configuring a Relying Party and Claims (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml_relying-party.html) // in the IAM User Guide. // -// * Creating a Role for SAML 2.0 Federation (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_saml.html) +// * Creating a Role for SAML 2.0 Federation (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_saml.html) // in the IAM User Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions @@ -338,9 +403,18 @@ func (c *STS) AssumeRoleWithSAMLRequest(input *AssumeRoleWithSAMLInput) (req *re // message describes the specific error. // // * ErrCodePackedPolicyTooLargeException "PackedPolicyTooLarge" -// The request was rejected because the policy document was too large. The error -// message describes how big the policy document is, in packed form, as a percentage -// of what the API allows. +// The request was rejected because the total packed size of the session policies +// and session tags combined was too large. An AWS conversion compresses the +// session policy document, session policy ARNs, and session tags into a packed +// binary format that has a separate limit. The error message indicates by percentage +// how close the policies and tags are to the upper size limit. For more information, +// see Passing Session Tags in STS (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) +// in the IAM User Guide. +// +// You could receive this error even though you meet other defined session policy +// and session tag limits. For more information, see IAM and STS Entity Character +// Limits (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) +// in the IAM User Guide. // // * ErrCodeIDPRejectedClaimException "IDPRejectedClaim" // The identity provider (IdP) reported that authentication failed. This might @@ -361,7 +435,7 @@ func (c *STS) AssumeRoleWithSAMLRequest(input *AssumeRoleWithSAMLInput) (req *re // STS is not activated in the requested region for the account that is being // asked to generate credentials. The account administrator must use the IAM // console to activate STS in that region. For more information, see Activating -// and Deactivating AWS STS in an AWS Region (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) +// and Deactivating AWS STS in an AWS Region (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) // in the IAM User Guide. // // See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithSAML @@ -391,7 +465,7 @@ const opAssumeRoleWithWebIdentity = "AssumeRoleWithWebIdentity" // AssumeRoleWithWebIdentityRequest generates a "aws/request.Request" representing the // client's request for the AssumeRoleWithWebIdentity operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -425,41 +499,44 @@ func (c *STS) AssumeRoleWithWebIdentityRequest(input *AssumeRoleWithWebIdentityI output = &AssumeRoleWithWebIdentityOutput{} req = c.newRequest(op, input, output) + req.Config.Credentials = credentials.AnonymousCredentials return } // AssumeRoleWithWebIdentity API operation for AWS Security Token Service. // // Returns a set of temporary security credentials for users who have been authenticated -// in a mobile or web application with a web identity provider, such as Amazon -// Cognito, Login with Amazon, Facebook, Google, or any OpenID Connect-compatible -// identity provider. +// in a mobile or web application with a web identity provider. Example providers +// include Amazon Cognito, Login with Amazon, Facebook, Google, or any OpenID +// Connect-compatible identity provider. // // For mobile applications, we recommend that you use Amazon Cognito. You can -// use Amazon Cognito with the AWS SDK for iOS (http://aws.amazon.com/sdkforios/) -// and the AWS SDK for Android (http://aws.amazon.com/sdkforandroid/) to uniquely -// identify a user and supply the user with a consistent identity throughout -// the lifetime of an application. -// -// To learn more about Amazon Cognito, see Amazon Cognito Overview (http://docs.aws.amazon.com/mobile/sdkforandroid/developerguide/cognito-auth.html#d0e840) -// in the AWS SDK for Android Developer Guide guide and Amazon Cognito Overview -// (http://docs.aws.amazon.com/mobile/sdkforios/developerguide/cognito-auth.html#d0e664) +// use Amazon Cognito with the AWS SDK for iOS Developer Guide (http://aws.amazon.com/sdkforios/) +// and the AWS SDK for Android Developer Guide (http://aws.amazon.com/sdkforandroid/) +// to uniquely identify a user. You can also supply the user with a consistent +// identity throughout the lifetime of an application. +// +// To learn more about Amazon Cognito, see Amazon Cognito Overview (https://docs.aws.amazon.com/mobile/sdkforandroid/developerguide/cognito-auth.html#d0e840) +// in AWS SDK for Android Developer Guide and Amazon Cognito Overview (https://docs.aws.amazon.com/mobile/sdkforios/developerguide/cognito-auth.html#d0e664) // in the AWS SDK for iOS Developer Guide. // // Calling AssumeRoleWithWebIdentity does not require the use of AWS security // credentials. Therefore, you can distribute an application (for example, on // mobile devices) that requests temporary security credentials without including -// long-term AWS credentials in the application, and without deploying server-based -// proxy services that use long-term AWS credentials. Instead, the identity -// of the caller is validated by using a token from the web identity provider. -// For a comparison of AssumeRoleWithWebIdentity with the other APIs that produce -// temporary credentials, see Requesting Temporary Security Credentials (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) -// and Comparing the AWS STS APIs (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) +// long-term AWS credentials in the application. You also don't need to deploy +// server-based proxy services that use long-term AWS credentials. Instead, +// the identity of the caller is validated by using a token from the web identity +// provider. For a comparison of AssumeRoleWithWebIdentity with the other API +// operations that produce temporary credentials, see Requesting Temporary Security +// Credentials (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) +// and Comparing the AWS STS API operations (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) // in the IAM User Guide. // // The temporary security credentials returned by this API consist of an access // key ID, a secret access key, and a security token. Applications can use these -// temporary security credentials to sign calls to AWS service APIs. +// temporary security credentials to sign calls to AWS service API operations. +// +// Session Duration // // By default, the temporary security credentials created by AssumeRoleWithWebIdentity // last for one hour. However, you can use the optional DurationSeconds parameter @@ -467,31 +544,69 @@ func (c *STS) AssumeRoleWithWebIdentityRequest(input *AssumeRoleWithWebIdentityI // seconds (15 minutes) up to the maximum session duration setting for the role. // This setting can have a value from 1 hour to 12 hours. To learn how to view // the maximum value for your role, see View the Maximum Session Duration Setting -// for a Role (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) +// for a Role (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) // in the IAM User Guide. The maximum session duration limit applies when you -// use the AssumeRole* API operations or the assume-role* CLI operations but -// does not apply when you use those operations to create a console URL. For -// more information, see Using IAM Roles (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html) +// use the AssumeRole* API operations or the assume-role* CLI commands. However +// the limit does not apply when you use those operations to create a console +// URL. For more information, see Using IAM Roles (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html) // in the IAM User Guide. // +// Permissions +// // The temporary security credentials created by AssumeRoleWithWebIdentity can // be used to make API calls to any AWS service with the following exception: -// you cannot call the STS service's GetFederationToken or GetSessionToken APIs. -// -// Optionally, you can pass an IAM access policy to this operation. If you choose -// not to pass a policy, the temporary security credentials that are returned -// by the operation have the permissions that are defined in the access policy -// of the role that is being assumed. If you pass a policy to this operation, -// the temporary security credentials that are returned by the operation have -// the permissions that are allowed by both the access policy of the role that -// is being assumed, and the policy that you pass. This gives you a way to further -// restrict the permissions for the resulting temporary security credentials. -// You cannot use the passed policy to grant permissions that are in excess -// of those allowed by the access policy of the role that is being assumed. -// For more information, see Permissions for AssumeRole, AssumeRoleWithSAML, -// and AssumeRoleWithWebIdentity (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_assumerole.html) +// you cannot call the STS GetFederationToken or GetSessionToken API operations. +// +// (Optional) You can pass inline or managed session policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) +// to this operation. You can pass a single JSON policy document to use as an +// inline session policy. You can also specify up to 10 managed policies to +// use as managed session policies. The plain text that you use for both inline +// and managed session policies can't exceed 2,048 characters. Passing policies +// to this operation returns new temporary credentials. The resulting session's +// permissions are the intersection of the role's identity-based policy and +// the session policies. You can use the role's temporary credentials in subsequent +// AWS API calls to access resources in the account that owns the role. You +// cannot use session policies to grant more permissions than those allowed +// by the identity-based policy of the role that is being assumed. For more +// information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) // in the IAM User Guide. // +// Tags +// +// (Optional) You can configure your IdP to pass attributes into your web identity +// token as session tags. Each session tag consists of a key name and an associated +// value. For more information about session tags, see Passing Session Tags +// in STS (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) +// in the IAM User Guide. +// +// You can pass up to 50 session tags. The plain text session tag keys can’t +// exceed 128 characters and the values can’t exceed 256 characters. For these +// and additional limits, see IAM and STS Character Limits (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html#reference_iam-limits-entity-length) +// in the IAM User Guide. +// +// An AWS conversion compresses the passed session policies and session tags +// into a packed binary format that has a separate limit. Your request can fail +// for this limit even if your plain text meets the other requirements. The +// PackedPolicySize response element indicates by percentage how close the policies +// and tags for your request are to the upper size limit. +// +// You can pass a session tag with the same key as a tag that is attached to +// the role. When you do, the session tag overrides the role tag with the same +// key. +// +// An administrator must grant you the permissions necessary to pass session +// tags. The administrator can also create granular permissions to allow you +// to pass only specific session tags. For more information, see Tutorial: Using +// Tags for Attribute-Based Access Control (https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html) +// in the IAM User Guide. +// +// You can set the session tags as transitive. Transitive tags persist during +// role chaining. For more information, see Chaining Roles with Session Tags +// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_role-chaining) +// in the IAM User Guide. +// +// Identities +// // Before your application can call AssumeRoleWithWebIdentity, you must have // an identity token from a supported identity provider and create a role that // the application can assume. The role that your application assumes must trust @@ -508,21 +623,19 @@ func (c *STS) AssumeRoleWithWebIdentityRequest(input *AssumeRoleWithWebIdentityI // For more information about how to use web identity federation and the AssumeRoleWithWebIdentity // API, see the following resources: // -// * Using Web Identity Federation APIs for Mobile Apps (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc_manual.html) -// and Federation Through a Web-based Identity Provider (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_assumerolewithwebidentity). -// -// -// * Web Identity Federation Playground (https://web-identity-federation-playground.s3.amazonaws.com/index.html). -// This interactive website lets you walk through the process of authenticating -// via Login with Amazon, Facebook, or Google, getting temporary security -// credentials, and then using those credentials to make a request to AWS. +// * Using Web Identity Federation API Operations for Mobile Apps (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc_manual.html) +// and Federation Through a Web-based Identity Provider (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_assumerolewithwebidentity). // +// * Web Identity Federation Playground (https://web-identity-federation-playground.s3.amazonaws.com/index.html). +// Walk through the process of authenticating through Login with Amazon, +// Facebook, or Google, getting temporary security credentials, and then +// using those credentials to make a request to AWS. // -// * AWS SDK for iOS (http://aws.amazon.com/sdkforios/) and AWS SDK for Android -// (http://aws.amazon.com/sdkforandroid/). These toolkits contain sample -// apps that show how to invoke the identity providers, and then how to use -// the information from these providers to get and use temporary security -// credentials. +// * AWS SDK for iOS Developer Guide (http://aws.amazon.com/sdkforios/) and +// AWS SDK for Android Developer Guide (http://aws.amazon.com/sdkforandroid/). +// These toolkits contain sample apps that show how to invoke the identity +// providers. The toolkits then show how to use the information from these +// providers to get and use temporary security credentials. // // * Web Identity Federation with Mobile Applications (http://aws.amazon.com/articles/web-identity-federation-with-mobile-applications). // This article discusses web identity federation and shows an example of @@ -542,9 +655,18 @@ func (c *STS) AssumeRoleWithWebIdentityRequest(input *AssumeRoleWithWebIdentityI // message describes the specific error. // // * ErrCodePackedPolicyTooLargeException "PackedPolicyTooLarge" -// The request was rejected because the policy document was too large. The error -// message describes how big the policy document is, in packed form, as a percentage -// of what the API allows. +// The request was rejected because the total packed size of the session policies +// and session tags combined was too large. An AWS conversion compresses the +// session policy document, session policy ARNs, and session tags into a packed +// binary format that has a separate limit. The error message indicates by percentage +// how close the policies and tags are to the upper size limit. For more information, +// see Passing Session Tags in STS (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) +// in the IAM User Guide. +// +// You could receive this error even though you meet other defined session policy +// and session tag limits. For more information, see IAM and STS Entity Character +// Limits (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) +// in the IAM User Guide. // // * ErrCodeIDPRejectedClaimException "IDPRejectedClaim" // The identity provider (IdP) reported that authentication failed. This might @@ -554,11 +676,11 @@ func (c *STS) AssumeRoleWithWebIdentityRequest(input *AssumeRoleWithWebIdentityI // can also mean that the claim has expired or has been explicitly revoked. // // * ErrCodeIDPCommunicationErrorException "IDPCommunicationError" -// The request could not be fulfilled because the non-AWS identity provider -// (IDP) that was asked to verify the incoming identity token could not be reached. -// This is often a transient error caused by network conditions. Retry the request +// The request could not be fulfilled because the identity provider (IDP) that +// was asked to verify the incoming identity token could not be reached. This +// is often a transient error caused by network conditions. Retry the request // a limited number of times so that you don't exceed the request rate. If the -// error persists, the non-AWS identity provider might be down or not responding. +// error persists, the identity provider might be down or not responding. // // * ErrCodeInvalidIdentityTokenException "InvalidIdentityToken" // The web identity token that was passed could not be validated by AWS. Get @@ -572,7 +694,7 @@ func (c *STS) AssumeRoleWithWebIdentityRequest(input *AssumeRoleWithWebIdentityI // STS is not activated in the requested region for the account that is being // asked to generate credentials. The account administrator must use the IAM // console to activate STS in that region. For more information, see Activating -// and Deactivating AWS STS in an AWS Region (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) +// and Deactivating AWS STS in an AWS Region (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) // in the IAM User Guide. // // See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithWebIdentity @@ -602,7 +724,7 @@ const opDecodeAuthorizationMessage = "DecodeAuthorizationMessage" // DecodeAuthorizationMessageRequest generates a "aws/request.Request" representing the // client's request for the DecodeAuthorizationMessage operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -644,17 +766,17 @@ func (c *STS) DecodeAuthorizationMessageRequest(input *DecodeAuthorizationMessag // Decodes additional information about the authorization status of a request // from an encoded message returned in response to an AWS request. // -// For example, if a user is not authorized to perform an action that he or -// she has requested, the request returns a Client.UnauthorizedOperation response -// (an HTTP 403 response). Some AWS actions additionally return an encoded message -// that can provide details about this authorization failure. +// For example, if a user is not authorized to perform an operation that he +// or she has requested, the request returns a Client.UnauthorizedOperation +// response (an HTTP 403 response). Some AWS operations additionally return +// an encoded message that can provide details about this authorization failure. // -// Only certain AWS actions return an encoded authorization message. The documentation -// for an individual action indicates whether that action returns an encoded -// message in addition to returning an HTTP code. +// Only certain AWS operations return an encoded authorization message. The +// documentation for an individual operation indicates whether that operation +// returns an encoded message in addition to returning an HTTP code. // // The message is encoded because the details of the authorization status can -// constitute privileged information that the user who requested the action +// constitute privileged information that the user who requested the operation // should not see. To decode an authorization status message, a user must be // granted permissions via an IAM policy to request the DecodeAuthorizationMessage // (sts:DecodeAuthorizationMessage) action. @@ -663,7 +785,7 @@ func (c *STS) DecodeAuthorizationMessageRequest(input *DecodeAuthorizationMessag // // * Whether the request was denied due to an explicit deny or due to the // absence of an explicit allow. For more information, see Determining Whether -// a Request is Allowed or Denied (http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#policy-eval-denyallow) +// a Request is Allowed or Denied (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#policy-eval-denyallow) // in the IAM User Guide. // // * The principal who made the request. @@ -709,12 +831,109 @@ func (c *STS) DecodeAuthorizationMessageWithContext(ctx aws.Context, input *Deco return out, req.Send() } +const opGetAccessKeyInfo = "GetAccessKeyInfo" + +// GetAccessKeyInfoRequest generates a "aws/request.Request" representing the +// client's request for the GetAccessKeyInfo operation. The "output" return +// value will be populated with the request's response once the request completes +// successfully. +// +// Use "Send" method on the returned Request to send the API call to the service. +// the "output" return value is not valid until after Send returns without error. +// +// See GetAccessKeyInfo for more information on using the GetAccessKeyInfo +// API call, and error handling. +// +// This method is useful when you want to inject custom logic or configuration +// into the SDK's request lifecycle. Such as custom headers, or retry logic. +// +// +// // Example sending a request using the GetAccessKeyInfoRequest method. +// req, resp := client.GetAccessKeyInfoRequest(params) +// +// err := req.Send() +// if err == nil { // resp is now filled +// fmt.Println(resp) +// } +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetAccessKeyInfo +func (c *STS) GetAccessKeyInfoRequest(input *GetAccessKeyInfoInput) (req *request.Request, output *GetAccessKeyInfoOutput) { + op := &request.Operation{ + Name: opGetAccessKeyInfo, + HTTPMethod: "POST", + HTTPPath: "/", + } + + if input == nil { + input = &GetAccessKeyInfoInput{} + } + + output = &GetAccessKeyInfoOutput{} + req = c.newRequest(op, input, output) + return +} + +// GetAccessKeyInfo API operation for AWS Security Token Service. +// +// Returns the account identifier for the specified access key ID. +// +// Access keys consist of two parts: an access key ID (for example, AKIAIOSFODNN7EXAMPLE) +// and a secret access key (for example, wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY). +// For more information about access keys, see Managing Access Keys for IAM +// Users (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html) +// in the IAM User Guide. +// +// When you pass an access key ID to this operation, it returns the ID of the +// AWS account to which the keys belong. Access key IDs beginning with AKIA +// are long-term credentials for an IAM user or the AWS account root user. Access +// key IDs beginning with ASIA are temporary credentials that are created using +// STS operations. If the account in the response belongs to you, you can sign +// in as the root user and review your root user access keys. Then, you can +// pull a credentials report (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_getting-report.html) +// to learn which IAM user owns the keys. To learn who requested the temporary +// credentials for an ASIA access key, view the STS events in your CloudTrail +// logs (https://docs.aws.amazon.com/IAM/latest/UserGuide/cloudtrail-integration.html) +// in the IAM User Guide. +// +// This operation does not indicate the state of the access key. The key might +// be active, inactive, or deleted. Active keys might not have permissions to +// perform an operation. Providing a deleted access key might return an error +// that the key doesn't exist. +// +// Returns awserr.Error for service API and SDK errors. Use runtime type assertions +// with awserr.Error's Code and Message methods to get detailed information about +// the error. +// +// See the AWS API reference guide for AWS Security Token Service's +// API operation GetAccessKeyInfo for usage and error information. +// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetAccessKeyInfo +func (c *STS) GetAccessKeyInfo(input *GetAccessKeyInfoInput) (*GetAccessKeyInfoOutput, error) { + req, out := c.GetAccessKeyInfoRequest(input) + return out, req.Send() +} + +// GetAccessKeyInfoWithContext is the same as GetAccessKeyInfo with the addition of +// the ability to pass a context and additional request options. +// +// See GetAccessKeyInfo for details on how to use this API operation. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *STS) GetAccessKeyInfoWithContext(ctx aws.Context, input *GetAccessKeyInfoInput, opts ...request.Option) (*GetAccessKeyInfoOutput, error) { + req, out := c.GetAccessKeyInfoRequest(input) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return out, req.Send() +} + const opGetCallerIdentity = "GetCallerIdentity" // GetCallerIdentityRequest generates a "aws/request.Request" representing the // client's request for the GetCallerIdentity operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -753,8 +972,16 @@ func (c *STS) GetCallerIdentityRequest(input *GetCallerIdentityInput) (req *requ // GetCallerIdentity API operation for AWS Security Token Service. // -// Returns details about the IAM identity whose credentials are used to call -// the API. +// Returns details about the IAM user or role whose credentials are used to +// call the operation. +// +// No permissions are required to perform this operation. If an administrator +// adds a policy to your IAM user or role that explicitly denies access to the +// sts:GetCallerIdentity action, you can still perform this operation. Permissions +// are not required because the same information is returned when an IAM user +// or role is denied access. To view an example response, see I Am Not Authorized +// to Perform: iam:DeleteVirtualMFADevice (https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_general.html#troubleshoot_general_access-denied-delete-mfa) +// in the IAM User Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -789,7 +1016,7 @@ const opGetFederationToken = "GetFederationToken" // GetFederationTokenRequest generates a "aws/request.Request" representing the // client's request for the GetFederationToken operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -831,81 +1058,92 @@ func (c *STS) GetFederationTokenRequest(input *GetFederationTokenInput) (req *re // Returns a set of temporary security credentials (consisting of an access // key ID, a secret access key, and a security token) for a federated user. // A typical use is in a proxy application that gets temporary security credentials -// on behalf of distributed applications inside a corporate network. Because -// you must call the GetFederationToken action using the long-term security -// credentials of an IAM user, this call is appropriate in contexts where those +// on behalf of distributed applications inside a corporate network. You must +// call the GetFederationToken operation using the long-term security credentials +// of an IAM user. As a result, this call is appropriate in contexts where those // credentials can be safely stored, usually in a server-based application. -// For a comparison of GetFederationToken with the other APIs that produce temporary -// credentials, see Requesting Temporary Security Credentials (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) -// and Comparing the AWS STS APIs (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) +// For a comparison of GetFederationToken with the other API operations that +// produce temporary credentials, see Requesting Temporary Security Credentials +// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) +// and Comparing the AWS STS API operations (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) // in the IAM User Guide. // -// If you are creating a mobile-based or browser-based app that can authenticate +// You can create a mobile-based or browser-based app that can authenticate // users using a web identity provider like Login with Amazon, Facebook, Google, -// or an OpenID Connect-compatible identity provider, we recommend that you -// use Amazon Cognito (http://aws.amazon.com/cognito/) or AssumeRoleWithWebIdentity. +// or an OpenID Connect-compatible identity provider. In this case, we recommend +// that you use Amazon Cognito (http://aws.amazon.com/cognito/) or AssumeRoleWithWebIdentity. // For more information, see Federation Through a Web-based Identity Provider -// (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_assumerolewithwebidentity). -// -// The GetFederationToken action must be called by using the long-term AWS security -// credentials of an IAM user. You can also call GetFederationToken using the -// security credentials of an AWS root account, but we do not recommended it. -// Instead, we recommend that you create an IAM user for the purpose of the -// proxy application and then attach a policy to the IAM user that limits federated -// users to only the actions and resources that they need access to. For more -// information, see IAM Best Practices (http://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html) +// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_assumerolewithwebidentity) // in the IAM User Guide. // -// The temporary security credentials that are obtained by using the long-term -// credentials of an IAM user are valid for the specified duration, from 900 -// seconds (15 minutes) up to a maximium of 129600 seconds (36 hours). The default -// is 43200 seconds (12 hours). Temporary credentials that are obtained by using -// AWS root account credentials have a maximum duration of 3600 seconds (1 hour). -// -// The temporary security credentials created by GetFederationToken can be used -// to make API calls to any AWS service with the following exceptions: +// You can also call GetFederationToken using the security credentials of an +// AWS account root user, but we do not recommend it. Instead, we recommend +// that you create an IAM user for the purpose of the proxy application. Then +// attach a policy to the IAM user that limits federated users to only the actions +// and resources that they need to access. For more information, see IAM Best +// Practices (https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html) +// in the IAM User Guide. // -// * You cannot use these credentials to call any IAM APIs. +// Session duration // -// * You cannot call any STS APIs except GetCallerIdentity. +// The temporary credentials are valid for the specified duration, from 900 +// seconds (15 minutes) up to a maximum of 129,600 seconds (36 hours). The default +// session duration is 43,200 seconds (12 hours). Temporary credentials that +// are obtained by using AWS account root user credentials have a maximum duration +// of 3,600 seconds (1 hour). // // Permissions // -// The permissions for the temporary security credentials returned by GetFederationToken -// are determined by a combination of the following: -// -// * The policy or policies that are attached to the IAM user whose credentials -// are used to call GetFederationToken. -// -// * The policy that is passed as a parameter in the call. -// -// The passed policy is attached to the temporary security credentials that -// result from the GetFederationToken API call--that is, to the federated user. -// When the federated user makes an AWS request, AWS evaluates the policy attached -// to the federated user in combination with the policy or policies attached -// to the IAM user whose credentials were used to call GetFederationToken. AWS -// allows the federated user's request only when both the federated user and -// the IAM user are explicitly allowed to perform the requested action. The -// passed policy cannot grant more permissions than those that are defined in -// the IAM user policy. -// -// A typical use case is that the permissions of the IAM user whose credentials -// are used to call GetFederationToken are designed to allow access to all the -// actions and resources that any federated user will need. Then, for individual -// users, you pass a policy to the operation that scopes down the permissions -// to a level that's appropriate to that individual user, using a policy that -// allows only a subset of permissions that are granted to the IAM user. -// -// If you do not pass a policy, the resulting temporary security credentials -// have no effective permissions. The only exception is when the temporary security -// credentials are used to access a resource that has a resource-based policy -// that specifically allows the federated user to access the resource. -// -// For more information about how permissions work, see Permissions for GetFederationToken -// (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_getfederationtoken.html). -// For information about using GetFederationToken to create temporary security -// credentials, see GetFederationToken—Federation Through a Custom Identity -// Broker (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_getfederationtoken). +// You can use the temporary credentials created by GetFederationToken in any +// AWS service except the following: +// +// * You cannot call any IAM operations using the AWS CLI or the AWS API. +// +// * You cannot call any STS operations except GetCallerIdentity. +// +// You must pass an inline or managed session policy (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) +// to this operation. You can pass a single JSON policy document to use as an +// inline session policy. You can also specify up to 10 managed policies to +// use as managed session policies. The plain text that you use for both inline +// and managed session policies can't exceed 2,048 characters. +// +// Though the session policy parameters are optional, if you do not pass a policy, +// then the resulting federated user session has no permissions. When you pass +// session policies, the session permissions are the intersection of the IAM +// user policies and the session policies that you pass. This gives you a way +// to further restrict the permissions for a federated user. You cannot use +// session policies to grant more permissions than those that are defined in +// the permissions policy of the IAM user. For more information, see Session +// Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) +// in the IAM User Guide. For information about using GetFederationToken to +// create temporary security credentials, see GetFederationToken—Federation +// Through a Custom Identity Broker (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_getfederationtoken). +// +// You can use the credentials to access a resource that has a resource-based +// policy. If that policy specifically references the federated user session +// in the Principal element of the policy, the session has the permissions allowed +// by the policy. These permissions are granted in addition to the permissions +// granted by the session policies. +// +// Tags +// +// (Optional) You can pass tag key-value pairs to your session. These are called +// session tags. For more information about session tags, see Passing Session +// Tags in STS (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) +// in the IAM User Guide. +// +// An administrator must grant you the permissions necessary to pass session +// tags. The administrator can also create granular permissions to allow you +// to pass only specific session tags. For more information, see Tutorial: Using +// Tags for Attribute-Based Access Control (https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html) +// in the IAM User Guide. +// +// Tag key–value pairs are not case sensitive, but case is preserved. This +// means that you cannot have separate Department and department tag keys. Assume +// that the user that you are federating has the Department=Marketing tag and +// you pass the department=engineering session tag. Department and department +// are not saved as separate tags, and the session tag passed in the request +// takes precedence over the user tag. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -920,15 +1158,24 @@ func (c *STS) GetFederationTokenRequest(input *GetFederationTokenInput) (req *re // message describes the specific error. // // * ErrCodePackedPolicyTooLargeException "PackedPolicyTooLarge" -// The request was rejected because the policy document was too large. The error -// message describes how big the policy document is, in packed form, as a percentage -// of what the API allows. +// The request was rejected because the total packed size of the session policies +// and session tags combined was too large. An AWS conversion compresses the +// session policy document, session policy ARNs, and session tags into a packed +// binary format that has a separate limit. The error message indicates by percentage +// how close the policies and tags are to the upper size limit. For more information, +// see Passing Session Tags in STS (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) +// in the IAM User Guide. +// +// You could receive this error even though you meet other defined session policy +// and session tag limits. For more information, see IAM and STS Entity Character +// Limits (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) +// in the IAM User Guide. // // * ErrCodeRegionDisabledException "RegionDisabledException" // STS is not activated in the requested region for the account that is being // asked to generate credentials. The account administrator must use the IAM // console to activate STS in that region. For more information, see Activating -// and Deactivating AWS STS in an AWS Region (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) +// and Deactivating AWS STS in an AWS Region (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) // in the IAM User Guide. // // See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetFederationToken @@ -958,7 +1205,7 @@ const opGetSessionToken = "GetSessionToken" // GetSessionTokenRequest generates a "aws/request.Request" representing the // client's request for the GetSessionToken operation. The "output" return // value will be populated with the request's response once the request completes -// successfuly. +// successfully. // // Use "Send" method on the returned Request to send the API call to the service. // the "output" return value is not valid until after Send returns without error. @@ -1000,48 +1247,51 @@ func (c *STS) GetSessionTokenRequest(input *GetSessionTokenInput) (req *request. // Returns a set of temporary credentials for an AWS account or IAM user. The // credentials consist of an access key ID, a secret access key, and a security // token. Typically, you use GetSessionToken if you want to use MFA to protect -// programmatic calls to specific AWS APIs like Amazon EC2 StopInstances. MFA-enabled -// IAM users would need to call GetSessionToken and submit an MFA code that -// is associated with their MFA device. Using the temporary security credentials -// that are returned from the call, IAM users can then make programmatic calls -// to APIs that require MFA authentication. If you do not supply a correct MFA -// code, then the API returns an access denied error. For a comparison of GetSessionToken -// with the other APIs that produce temporary credentials, see Requesting Temporary -// Security Credentials (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) -// and Comparing the AWS STS APIs (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) +// programmatic calls to specific AWS API operations like Amazon EC2 StopInstances. +// MFA-enabled IAM users would need to call GetSessionToken and submit an MFA +// code that is associated with their MFA device. Using the temporary security +// credentials that are returned from the call, IAM users can then make programmatic +// calls to API operations that require MFA authentication. If you do not supply +// a correct MFA code, then the API returns an access denied error. For a comparison +// of GetSessionToken with the other API operations that produce temporary credentials, +// see Requesting Temporary Security Credentials (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) +// and Comparing the AWS STS API operations (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) // in the IAM User Guide. // -// The GetSessionToken action must be called by using the long-term AWS security -// credentials of the AWS account or an IAM user. Credentials that are created -// by IAM users are valid for the duration that you specify, from 900 seconds -// (15 minutes) up to a maximum of 129600 seconds (36 hours), with a default -// of 43200 seconds (12 hours); credentials that are created by using account -// credentials can range from 900 seconds (15 minutes) up to a maximum of 3600 -// seconds (1 hour), with a default of 1 hour. +// Session Duration +// +// The GetSessionToken operation must be called by using the long-term AWS security +// credentials of the AWS account root user or an IAM user. Credentials that +// are created by IAM users are valid for the duration that you specify. This +// duration can range from 900 seconds (15 minutes) up to a maximum of 129,600 +// seconds (36 hours), with a default of 43,200 seconds (12 hours). Credentials +// based on account credentials can range from 900 seconds (15 minutes) up to +// 3,600 seconds (1 hour), with a default of 1 hour. +// +// Permissions // // The temporary security credentials created by GetSessionToken can be used // to make API calls to any AWS service with the following exceptions: // -// * You cannot call any IAM APIs unless MFA authentication information is -// included in the request. +// * You cannot call any IAM API operations unless MFA authentication information +// is included in the request. // -// * You cannot call any STS API exceptAssumeRole or GetCallerIdentity. +// * You cannot call any STS API except AssumeRole or GetCallerIdentity. // -// We recommend that you do not call GetSessionToken with root account credentials. -// Instead, follow our best practices (http://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#create-iam-users) +// We recommend that you do not call GetSessionToken with AWS account root user +// credentials. Instead, follow our best practices (https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#create-iam-users) // by creating one or more IAM users, giving them the necessary permissions, // and using IAM users for everyday interaction with AWS. // -// The permissions associated with the temporary security credentials returned -// by GetSessionToken are based on the permissions associated with account or -// IAM user whose credentials are used to call the action. If GetSessionToken -// is called using root account credentials, the temporary credentials have -// root account permissions. Similarly, if GetSessionToken is called using the -// credentials of an IAM user, the temporary credentials have the same permissions -// as the IAM user. +// The credentials that are returned by GetSessionToken are based on permissions +// associated with the user whose credentials were used to call the operation. +// If GetSessionToken is called using AWS account root user credentials, the +// temporary credentials have root user permissions. Similarly, if GetSessionToken +// is called using the credentials of an IAM user, the temporary credentials +// have the same permissions as the IAM user. // // For more information about using GetSessionToken to create temporary credentials, -// go to Temporary Credentials for Users in Untrusted Environments (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_getsessiontoken) +// go to Temporary Credentials for Users in Untrusted Environments (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_getsessiontoken) // in the IAM User Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions @@ -1056,7 +1306,7 @@ func (c *STS) GetSessionTokenRequest(input *GetSessionTokenInput) (req *request. // STS is not activated in the requested region for the account that is being // asked to generate credentials. The account administrator must use the IAM // console to activate STS in that region. For more information, see Activating -// and Deactivating AWS STS in an AWS Region (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) +// and Deactivating AWS STS in an AWS Region (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) // in the IAM User Guide. // // See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetSessionToken @@ -1091,7 +1341,7 @@ type AssumeRoleInput struct { // a session duration of 12 hours, but your administrator set the maximum session // duration to 6 hours, your operation fails. To learn how to view the maximum // value for your role, see View the Maximum Session Duration Setting for a - // Role (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) + // Role (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) // in the IAM User Guide. // // By default, the value is set to 3600 seconds. @@ -1101,51 +1351,77 @@ type AssumeRoleInput struct { // to the federation endpoint for a console sign-in token takes a SessionDuration // parameter that specifies the maximum length of the console session. For more // information, see Creating a URL that Enables Federated Users to Access the - // AWS Management Console (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html) + // AWS Management Console (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html) // in the IAM User Guide. DurationSeconds *int64 `min:"900" type:"integer"` - // A unique identifier that is used by third parties when assuming roles in - // their customers' accounts. For each role that the third party can assume, - // they should instruct their customers to ensure the role's trust policy checks - // for the external ID that the third party generated. Each time the third party - // assumes the role, they should pass the customer's external ID. The external - // ID is useful in order to help third parties bind a role to the customer who - // created it. For more information about the external ID, see How to Use an - // External ID When Granting Access to Your AWS Resources to a Third Party (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html) + // A unique identifier that might be required when you assume a role in another + // account. If the administrator of the account to which the role belongs provided + // you with an external ID, then provide that value in the ExternalId parameter. + // This value can be any string, such as a passphrase or account number. A cross-account + // role is usually set up to trust everyone in an account. Therefore, the administrator + // of the trusting account might send an external ID to the administrator of + // the trusted account. That way, only someone with the ID can assume the role, + // rather than everyone in the account. For more information about the external + // ID, see How to Use an External ID When Granting Access to Your AWS Resources + // to a Third Party (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html) // in the IAM User Guide. // - // The regex used to validated this parameter is a string of characters consisting + // The regex used to validate this parameter is a string of characters consisting // of upper- and lower-case alphanumeric characters with no spaces. You can // also include underscores or any of the following characters: =,.@:/- ExternalId *string `min:"2" type:"string"` - // An IAM policy in JSON format. - // - // This parameter is optional. If you pass a policy, the temporary security - // credentials that are returned by the operation have the permissions that - // are allowed by both (the intersection of) the access policy of the role that - // is being assumed, and the policy that you pass. This gives you a way to further - // restrict the permissions for the resulting temporary security credentials. - // You cannot use the passed policy to grant permissions that are in excess - // of those allowed by the access policy of the role that is being assumed. - // For more information, see Permissions for AssumeRole, AssumeRoleWithSAML, - // and AssumeRoleWithWebIdentity (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_assumerole.html) + // An IAM policy in JSON format that you want to use as an inline session policy. + // + // This parameter is optional. Passing policies to this operation returns new + // temporary credentials. The resulting session's permissions are the intersection + // of the role's identity-based policy and the session policies. You can use + // the role's temporary credentials in subsequent AWS API calls to access resources + // in the account that owns the role. You cannot use session policies to grant + // more permissions than those allowed by the identity-based policy of the role + // that is being assumed. For more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) // in the IAM User Guide. // - // The format for this parameter, as described by its regex pattern, is a string - // of characters up to 2048 characters in length. The characters can be any - // ASCII character from the space character to the end of the valid character - // list (\u0020-\u00FF). It can also include the tab (\u0009), linefeed (\u000A), + // The plain text that you use for both inline and managed session policies + // can't exceed 2,048 characters. The JSON policy characters can be any ASCII + // character from the space character to the end of the valid character list + // (\u0020 through \u00FF). It can also include the tab (\u0009), linefeed (\u000A), // and carriage return (\u000D) characters. // - // The policy plain text must be 2048 bytes or shorter. However, an internal - // conversion compresses it into a packed binary format with a separate limit. - // The PackedPolicySize response element indicates by percentage how close to - // the upper size limit the policy is, with 100% equaling the maximum allowed - // size. + // An AWS conversion compresses the passed session policies and session tags + // into a packed binary format that has a separate limit. Your request can fail + // for this limit even if your plain text meets the other requirements. The + // PackedPolicySize response element indicates by percentage how close the policies + // and tags for your request are to the upper size limit. Policy *string `min:"1" type:"string"` + // The Amazon Resource Names (ARNs) of the IAM managed policies that you want + // to use as managed session policies. The policies must exist in the same account + // as the role. + // + // This parameter is optional. You can provide up to 10 managed policy ARNs. + // However, the plain text that you use for both inline and managed session + // policies can't exceed 2,048 characters. For more information about ARNs, + // see Amazon Resource Names (ARNs) and AWS Service Namespaces (https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) + // in the AWS General Reference. + // + // An AWS conversion compresses the passed session policies and session tags + // into a packed binary format that has a separate limit. Your request can fail + // for this limit even if your plain text meets the other requirements. The + // PackedPolicySize response element indicates by percentage how close the policies + // and tags for your request are to the upper size limit. + // + // Passing policies to this operation returns new temporary credentials. The + // resulting session's permissions are the intersection of the role's identity-based + // policy and the session policies. You can use the role's temporary credentials + // in subsequent AWS API calls to access resources in the account that owns + // the role. You cannot use session policies to grant more permissions than + // those allowed by the identity-based policy of the role that is being assumed. + // For more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) + // in the IAM User Guide. + PolicyArns []*PolicyDescriptorType `type:"list"` + // The Amazon Resource Name (ARN) of the role to assume. // // RoleArn is a required field @@ -1158,8 +1434,8 @@ type AssumeRoleInput struct { // scenarios, the role session name is visible to, and can be logged by the // account that owns the role. The role session name is also used in the ARN // of the assumed role principal. This means that subsequent cross-account API - // requests using the temporary security credentials will expose the role session - // name to the external account in their CloudTrail logs. + // requests that use the temporary security credentials will expose the role + // session name to the external account in their AWS CloudTrail logs. // // The regex used to validate this parameter is a string of characters consisting // of upper- and lower-case alphanumeric characters with no spaces. You can @@ -1179,6 +1455,41 @@ type AssumeRoleInput struct { // also include underscores or any of the following characters: =,.@- SerialNumber *string `min:"9" type:"string"` + // A list of session tags that you want to pass. Each session tag consists of + // a key name and an associated value. For more information about session tags, + // see Tagging AWS STS Sessions (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) + // in the IAM User Guide. + // + // This parameter is optional. You can pass up to 50 session tags. The plain + // text session tag keys can’t exceed 128 characters, and the values can’t + // exceed 256 characters. For these and additional limits, see IAM and STS Character + // Limits (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html#reference_iam-limits-entity-length) + // in the IAM User Guide. + // + // An AWS conversion compresses the passed session policies and session tags + // into a packed binary format that has a separate limit. Your request can fail + // for this limit even if your plain text meets the other requirements. The + // PackedPolicySize response element indicates by percentage how close the policies + // and tags for your request are to the upper size limit. + // + // You can pass a session tag with the same key as a tag that is already attached + // to the role. When you do, session tags override a role tag with the same + // key. + // + // Tag key–value pairs are not case sensitive, but case is preserved. This + // means that you cannot have separate Department and department tag keys. Assume + // that the role has the Department=Marketing tag and you pass the department=engineering + // session tag. Department and department are not saved as separate tags, and + // the session tag passed in the request takes precedence over the role tag. + // + // Additionally, if you used temporary credentials to perform this operation, + // the new session inherits any transitive session tags from the calling session. + // If you pass a session tag with the same key as an inherited tag, the operation + // fails. To view the inherited tags for a session, see the AWS CloudTrail logs. + // For more information, see Viewing Session Tags in CloudTrail (https://docs.aws.amazon.com/IAM/latest/UserGuide/session-tags.html#id_session-tags_ctlogs) + // in the IAM User Guide. + Tags []*Tag `type:"list"` + // The value provided by the MFA device, if the trust policy of the role being // assumed requires MFA (that is, if the policy includes a condition that tests // for MFA). If the role being assumed requires MFA and if the TokenCode value @@ -1187,6 +1498,19 @@ type AssumeRoleInput struct { // The format for this parameter, as described by its regex pattern, is a sequence // of six numeric digits. TokenCode *string `min:"6" type:"string"` + + // A list of keys for session tags that you want to set as transitive. If you + // set a tag key as transitive, the corresponding key and value passes to subsequent + // sessions in a role chain. For more information, see Chaining Roles with Session + // Tags (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_role-chaining) + // in the IAM User Guide. + // + // This parameter is optional. When you set session tags as transitive, the + // session policy and session tags packed binary limit is not affected. + // + // If you choose not to specify a transitive tag key, then no tags are passed + // from this session to any subsequent sessions. + TransitiveTagKeys []*string `type:"list"` } // String returns the string representation @@ -1229,6 +1553,26 @@ func (s *AssumeRoleInput) Validate() error { if s.TokenCode != nil && len(*s.TokenCode) < 6 { invalidParams.Add(request.NewErrParamMinLen("TokenCode", 6)) } + if s.PolicyArns != nil { + for i, v := range s.PolicyArns { + if v == nil { + continue + } + if err := v.Validate(); err != nil { + invalidParams.AddNested(fmt.Sprintf("%s[%v]", "PolicyArns", i), err.(request.ErrInvalidParams)) + } + } + } + if s.Tags != nil { + for i, v := range s.Tags { + if v == nil { + continue + } + if err := v.Validate(); err != nil { + invalidParams.AddNested(fmt.Sprintf("%s[%v]", "Tags", i), err.(request.ErrInvalidParams)) + } + } + } if invalidParams.Len() > 0 { return invalidParams @@ -1254,6 +1598,12 @@ func (s *AssumeRoleInput) SetPolicy(v string) *AssumeRoleInput { return s } +// SetPolicyArns sets the PolicyArns field's value. +func (s *AssumeRoleInput) SetPolicyArns(v []*PolicyDescriptorType) *AssumeRoleInput { + s.PolicyArns = v + return s +} + // SetRoleArn sets the RoleArn field's value. func (s *AssumeRoleInput) SetRoleArn(v string) *AssumeRoleInput { s.RoleArn = &v @@ -1272,12 +1622,24 @@ func (s *AssumeRoleInput) SetSerialNumber(v string) *AssumeRoleInput { return s } +// SetTags sets the Tags field's value. +func (s *AssumeRoleInput) SetTags(v []*Tag) *AssumeRoleInput { + s.Tags = v + return s +} + // SetTokenCode sets the TokenCode field's value. func (s *AssumeRoleInput) SetTokenCode(v string) *AssumeRoleInput { s.TokenCode = &v return s } +// SetTransitiveTagKeys sets the TransitiveTagKeys field's value. +func (s *AssumeRoleInput) SetTransitiveTagKeys(v []*string) *AssumeRoleInput { + s.TransitiveTagKeys = v + return s +} + // Contains the response to a successful AssumeRole request, including temporary // AWS credentials that can be used to make AWS requests. type AssumeRoleOutput struct { @@ -1293,15 +1655,14 @@ type AssumeRoleOutput struct { // The temporary security credentials, which include an access key ID, a secret // access key, and a security (or session) token. // - // Note: The size of the security token that STS APIs return is not fixed. We - // strongly recommend that you make no assumptions about the maximum size. As - // of this writing, the typical size is less than 4096 bytes, but that can vary. - // Also, future updates to AWS might require larger sizes. + // The size of the security token that STS API operations return is not fixed. + // We strongly recommend that you make no assumptions about the maximum size. Credentials *Credentials `type:"structure"` - // A percentage value that indicates the size of the policy in packed form. - // The service rejects any policy with a packed size greater than 100 percent, - // which means the policy exceeded the allowed space. + // A percentage value that indicates the packed size of the session policies + // and session tags combined passed in the request. The request fails if the + // packed size is greater than 100 percent, which means the policies and tags + // exceeded the allowed space. PackedPolicySize *int64 `type:"integer"` } @@ -1346,7 +1707,7 @@ type AssumeRoleWithSAMLInput struct { // specify a session duration of 12 hours, but your administrator set the maximum // session duration to 6 hours, your operation fails. To learn how to view the // maximum value for your role, see View the Maximum Session Duration Setting - // for a Role (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) + // for a Role (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) // in the IAM User Guide. // // By default, the value is set to 3600 seconds. @@ -1356,36 +1717,60 @@ type AssumeRoleWithSAMLInput struct { // to the federation endpoint for a console sign-in token takes a SessionDuration // parameter that specifies the maximum length of the console session. For more // information, see Creating a URL that Enables Federated Users to Access the - // AWS Management Console (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html) + // AWS Management Console (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html) // in the IAM User Guide. DurationSeconds *int64 `min:"900" type:"integer"` - // An IAM policy in JSON format. - // - // The policy parameter is optional. If you pass a policy, the temporary security - // credentials that are returned by the operation have the permissions that - // are allowed by both the access policy of the role that is being assumed, - // and the policy that you pass. This gives you a way to further restrict the - // permissions for the resulting temporary security credentials. You cannot - // use the passed policy to grant permissions that are in excess of those allowed - // by the access policy of the role that is being assumed. For more information, - // Permissions for AssumeRole, AssumeRoleWithSAML, and AssumeRoleWithWebIdentity - // (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_assumerole.html) + // An IAM policy in JSON format that you want to use as an inline session policy. + // + // This parameter is optional. Passing policies to this operation returns new + // temporary credentials. The resulting session's permissions are the intersection + // of the role's identity-based policy and the session policies. You can use + // the role's temporary credentials in subsequent AWS API calls to access resources + // in the account that owns the role. You cannot use session policies to grant + // more permissions than those allowed by the identity-based policy of the role + // that is being assumed. For more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) // in the IAM User Guide. // - // The format for this parameter, as described by its regex pattern, is a string - // of characters up to 2048 characters in length. The characters can be any - // ASCII character from the space character to the end of the valid character - // list (\u0020-\u00FF). It can also include the tab (\u0009), linefeed (\u000A), + // The plain text that you use for both inline and managed session policies + // can't exceed 2,048 characters. The JSON policy characters can be any ASCII + // character from the space character to the end of the valid character list + // (\u0020 through \u00FF). It can also include the tab (\u0009), linefeed (\u000A), // and carriage return (\u000D) characters. // - // The policy plain text must be 2048 bytes or shorter. However, an internal - // conversion compresses it into a packed binary format with a separate limit. - // The PackedPolicySize response element indicates by percentage how close to - // the upper size limit the policy is, with 100% equaling the maximum allowed - // size. + // An AWS conversion compresses the passed session policies and session tags + // into a packed binary format that has a separate limit. Your request can fail + // for this limit even if your plain text meets the other requirements. The + // PackedPolicySize response element indicates by percentage how close the policies + // and tags for your request are to the upper size limit. Policy *string `min:"1" type:"string"` + // The Amazon Resource Names (ARNs) of the IAM managed policies that you want + // to use as managed session policies. The policies must exist in the same account + // as the role. + // + // This parameter is optional. You can provide up to 10 managed policy ARNs. + // However, the plain text that you use for both inline and managed session + // policies can't exceed 2,048 characters. For more information about ARNs, + // see Amazon Resource Names (ARNs) and AWS Service Namespaces (https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) + // in the AWS General Reference. + // + // An AWS conversion compresses the passed session policies and session tags + // into a packed binary format that has a separate limit. Your request can fail + // for this limit even if your plain text meets the other requirements. The + // PackedPolicySize response element indicates by percentage how close the policies + // and tags for your request are to the upper size limit. + // + // Passing policies to this operation returns new temporary credentials. The + // resulting session's permissions are the intersection of the role's identity-based + // policy and the session policies. You can use the role's temporary credentials + // in subsequent AWS API calls to access resources in the account that owns + // the role. You cannot use session policies to grant more permissions than + // those allowed by the identity-based policy of the role that is being assumed. + // For more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) + // in the IAM User Guide. + PolicyArns []*PolicyDescriptorType `type:"list"` + // The Amazon Resource Name (ARN) of the SAML provider in IAM that describes // the IdP. // @@ -1399,8 +1784,8 @@ type AssumeRoleWithSAMLInput struct { // The base-64 encoded SAML authentication response provided by the IdP. // - // For more information, see Configuring a Relying Party and Adding Claims (http://docs.aws.amazon.com/IAM/latest/UserGuide/create-role-saml-IdP-tasks.html) - // in the Using IAM guide. + // For more information, see Configuring a Relying Party and Adding Claims (https://docs.aws.amazon.com/IAM/latest/UserGuide/create-role-saml-IdP-tasks.html) + // in the IAM User Guide. // // SAMLAssertion is a required field SAMLAssertion *string `min:"4" type:"string" required:"true"` @@ -1443,6 +1828,16 @@ func (s *AssumeRoleWithSAMLInput) Validate() error { if s.SAMLAssertion != nil && len(*s.SAMLAssertion) < 4 { invalidParams.Add(request.NewErrParamMinLen("SAMLAssertion", 4)) } + if s.PolicyArns != nil { + for i, v := range s.PolicyArns { + if v == nil { + continue + } + if err := v.Validate(); err != nil { + invalidParams.AddNested(fmt.Sprintf("%s[%v]", "PolicyArns", i), err.(request.ErrInvalidParams)) + } + } + } if invalidParams.Len() > 0 { return invalidParams @@ -1462,6 +1857,12 @@ func (s *AssumeRoleWithSAMLInput) SetPolicy(v string) *AssumeRoleWithSAMLInput { return s } +// SetPolicyArns sets the PolicyArns field's value. +func (s *AssumeRoleWithSAMLInput) SetPolicyArns(v []*PolicyDescriptorType) *AssumeRoleWithSAMLInput { + s.PolicyArns = v + return s +} + // SetPrincipalArn sets the PrincipalArn field's value. func (s *AssumeRoleWithSAMLInput) SetPrincipalArn(v string) *AssumeRoleWithSAMLInput { s.PrincipalArn = &v @@ -1496,10 +1897,8 @@ type AssumeRoleWithSAMLOutput struct { // The temporary security credentials, which include an access key ID, a secret // access key, and a security (or session) token. // - // Note: The size of the security token that STS APIs return is not fixed. We - // strongly recommend that you make no assumptions about the maximum size. As - // of this writing, the typical size is less than 4096 bytes, but that can vary. - // Also, future updates to AWS might require larger sizes. + // The size of the security token that STS API operations return is not fixed. + // We strongly recommend that you make no assumptions about the maximum size. Credentials *Credentials `type:"structure"` // The value of the Issuer element of the SAML assertion. @@ -1516,9 +1915,10 @@ type AssumeRoleWithSAMLOutput struct { // ) ) NameQualifier *string `type:"string"` - // A percentage value that indicates the size of the policy in packed form. - // The service rejects any policy with a packed size greater than 100 percent, - // which means the policy exceeded the allowed space. + // A percentage value that indicates the packed size of the session policies + // and session tags combined passed in the request. The request fails if the + // packed size is greater than 100 percent, which means the policies and tags + // exceeded the allowed space. PackedPolicySize *int64 `type:"integer"` // The value of the NameID element in the Subject element of the SAML assertion. @@ -1603,7 +2003,7 @@ type AssumeRoleWithWebIdentityInput struct { // a session duration of 12 hours, but your administrator set the maximum session // duration to 6 hours, your operation fails. To learn how to view the maximum // value for your role, see View the Maximum Session Duration Setting for a - // Role (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) + // Role (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) // in the IAM User Guide. // // By default, the value is set to 3600 seconds. @@ -1613,35 +2013,60 @@ type AssumeRoleWithWebIdentityInput struct { // to the federation endpoint for a console sign-in token takes a SessionDuration // parameter that specifies the maximum length of the console session. For more // information, see Creating a URL that Enables Federated Users to Access the - // AWS Management Console (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html) + // AWS Management Console (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html) // in the IAM User Guide. DurationSeconds *int64 `min:"900" type:"integer"` - // An IAM policy in JSON format. + // An IAM policy in JSON format that you want to use as an inline session policy. // - // The policy parameter is optional. If you pass a policy, the temporary security - // credentials that are returned by the operation have the permissions that - // are allowed by both the access policy of the role that is being assumed, - // and the policy that you pass. This gives you a way to further restrict the - // permissions for the resulting temporary security credentials. You cannot - // use the passed policy to grant permissions that are in excess of those allowed - // by the access policy of the role that is being assumed. For more information, - // see Permissions for AssumeRoleWithWebIdentity (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_assumerole.html) + // This parameter is optional. Passing policies to this operation returns new + // temporary credentials. The resulting session's permissions are the intersection + // of the role's identity-based policy and the session policies. You can use + // the role's temporary credentials in subsequent AWS API calls to access resources + // in the account that owns the role. You cannot use session policies to grant + // more permissions than those allowed by the identity-based policy of the role + // that is being assumed. For more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) // in the IAM User Guide. // - // The format for this parameter, as described by its regex pattern, is a string - // of characters up to 2048 characters in length. The characters can be any - // ASCII character from the space character to the end of the valid character - // list (\u0020-\u00FF). It can also include the tab (\u0009), linefeed (\u000A), + // The plain text that you use for both inline and managed session policies + // can't exceed 2,048 characters. The JSON policy characters can be any ASCII + // character from the space character to the end of the valid character list + // (\u0020 through \u00FF). It can also include the tab (\u0009), linefeed (\u000A), // and carriage return (\u000D) characters. // - // The policy plain text must be 2048 bytes or shorter. However, an internal - // conversion compresses it into a packed binary format with a separate limit. - // The PackedPolicySize response element indicates by percentage how close to - // the upper size limit the policy is, with 100% equaling the maximum allowed - // size. + // An AWS conversion compresses the passed session policies and session tags + // into a packed binary format that has a separate limit. Your request can fail + // for this limit even if your plain text meets the other requirements. The + // PackedPolicySize response element indicates by percentage how close the policies + // and tags for your request are to the upper size limit. Policy *string `min:"1" type:"string"` + // The Amazon Resource Names (ARNs) of the IAM managed policies that you want + // to use as managed session policies. The policies must exist in the same account + // as the role. + // + // This parameter is optional. You can provide up to 10 managed policy ARNs. + // However, the plain text that you use for both inline and managed session + // policies can't exceed 2,048 characters. For more information about ARNs, + // see Amazon Resource Names (ARNs) and AWS Service Namespaces (https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) + // in the AWS General Reference. + // + // An AWS conversion compresses the passed session policies and session tags + // into a packed binary format that has a separate limit. Your request can fail + // for this limit even if your plain text meets the other requirements. The + // PackedPolicySize response element indicates by percentage how close the policies + // and tags for your request are to the upper size limit. + // + // Passing policies to this operation returns new temporary credentials. The + // resulting session's permissions are the intersection of the role's identity-based + // policy and the session policies. You can use the role's temporary credentials + // in subsequent AWS API calls to access resources in the account that owns + // the role. You cannot use session policies to grant more permissions than + // those allowed by the identity-based policy of the role that is being assumed. + // For more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) + // in the IAM User Guide. + PolicyArns []*PolicyDescriptorType `type:"list"` + // The fully qualified host component of the domain name of the identity provider. // // Specify this value only for OAuth 2.0 access tokens. Currently www.amazon.com @@ -1718,6 +2143,16 @@ func (s *AssumeRoleWithWebIdentityInput) Validate() error { if s.WebIdentityToken != nil && len(*s.WebIdentityToken) < 4 { invalidParams.Add(request.NewErrParamMinLen("WebIdentityToken", 4)) } + if s.PolicyArns != nil { + for i, v := range s.PolicyArns { + if v == nil { + continue + } + if err := v.Validate(); err != nil { + invalidParams.AddNested(fmt.Sprintf("%s[%v]", "PolicyArns", i), err.(request.ErrInvalidParams)) + } + } + } if invalidParams.Len() > 0 { return invalidParams @@ -1737,6 +2172,12 @@ func (s *AssumeRoleWithWebIdentityInput) SetPolicy(v string) *AssumeRoleWithWebI return s } +// SetPolicyArns sets the PolicyArns field's value. +func (s *AssumeRoleWithWebIdentityInput) SetPolicyArns(v []*PolicyDescriptorType) *AssumeRoleWithWebIdentityInput { + s.PolicyArns = v + return s +} + // SetProviderId sets the ProviderId field's value. func (s *AssumeRoleWithWebIdentityInput) SetProviderId(v string) *AssumeRoleWithWebIdentityInput { s.ProviderId = &v @@ -1781,19 +2222,18 @@ type AssumeRoleWithWebIdentityOutput struct { // The temporary security credentials, which include an access key ID, a secret // access key, and a security token. // - // Note: The size of the security token that STS APIs return is not fixed. We - // strongly recommend that you make no assumptions about the maximum size. As - // of this writing, the typical size is less than 4096 bytes, but that can vary. - // Also, future updates to AWS might require larger sizes. + // The size of the security token that STS API operations return is not fixed. + // We strongly recommend that you make no assumptions about the maximum size. Credentials *Credentials `type:"structure"` - // A percentage value that indicates the size of the policy in packed form. - // The service rejects any policy with a packed size greater than 100 percent, - // which means the policy exceeded the allowed space. + // A percentage value that indicates the packed size of the session policies + // and session tags combined passed in the request. The request fails if the + // packed size is greater than 100 percent, which means the policies and tags + // exceeded the allowed space. PackedPolicySize *int64 `type:"integer"` // The issuing authority of the web identity token presented. For OpenID Connect - // ID Tokens this contains the value of the iss field. For OAuth 2.0 access + // ID tokens, this contains the value of the iss field. For OAuth 2.0 access // tokens, this contains the value of the ProviderId parameter that was passed // in the AssumeRoleWithWebIdentity request. Provider *string `type:"string"` @@ -1860,8 +2300,8 @@ type AssumedRoleUser struct { // The ARN of the temporary security credentials that are returned from the // AssumeRole action. For more information about ARNs and how to use them in - // policies, see IAM Identifiers (http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html) - // in Using IAM. + // policies, see IAM Identifiers (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html) + // in the IAM User Guide. // // Arn is a required field Arn *string `min:"20" type:"string" required:"true"` @@ -1908,7 +2348,7 @@ type Credentials struct { // The date on which the current credentials expire. // // Expiration is a required field - Expiration *time.Time `type:"timestamp" timestampFormat:"iso8601" required:"true"` + Expiration *time.Time `type:"timestamp" required:"true"` // The secret access key that can be used to sign requests. // @@ -2028,8 +2468,8 @@ type FederatedUser struct { // The ARN that specifies the federated user that is associated with the credentials. // For more information about ARNs and how to use them in policies, see IAM - // Identifiers (http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html) - // in Using IAM. + // Identifiers (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html) + // in the IAM User Guide. // // Arn is a required field Arn *string `min:"20" type:"string" required:"true"` @@ -2063,6 +2503,73 @@ func (s *FederatedUser) SetFederatedUserId(v string) *FederatedUser { return s } +type GetAccessKeyInfoInput struct { + _ struct{} `type:"structure"` + + // The identifier of an access key. + // + // This parameter allows (through its regex pattern) a string of characters + // that can consist of any upper- or lowercase letter or digit. + // + // AccessKeyId is a required field + AccessKeyId *string `min:"16" type:"string" required:"true"` +} + +// String returns the string representation +func (s GetAccessKeyInfoInput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s GetAccessKeyInfoInput) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *GetAccessKeyInfoInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "GetAccessKeyInfoInput"} + if s.AccessKeyId == nil { + invalidParams.Add(request.NewErrParamRequired("AccessKeyId")) + } + if s.AccessKeyId != nil && len(*s.AccessKeyId) < 16 { + invalidParams.Add(request.NewErrParamMinLen("AccessKeyId", 16)) + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetAccessKeyId sets the AccessKeyId field's value. +func (s *GetAccessKeyInfoInput) SetAccessKeyId(v string) *GetAccessKeyInfoInput { + s.AccessKeyId = &v + return s +} + +type GetAccessKeyInfoOutput struct { + _ struct{} `type:"structure"` + + // The number used to identify the AWS account. + Account *string `type:"string"` +} + +// String returns the string representation +func (s GetAccessKeyInfoOutput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s GetAccessKeyInfoOutput) GoString() string { + return s.String() +} + +// SetAccount sets the Account field's value. +func (s *GetAccessKeyInfoOutput) SetAccount(v string) *GetAccessKeyInfoOutput { + s.Account = &v + return s +} + type GetCallerIdentityInput struct { _ struct{} `type:"structure"` } @@ -2090,8 +2597,8 @@ type GetCallerIdentityOutput struct { Arn *string `min:"20" type:"string"` // The unique identifier of the calling entity. The exact value depends on the - // type of entity making the call. The values returned are those listed in the - // aws:userid column in the Principal table (http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_variables.html#principaltable) + // type of entity that is making the call. The values returned are those listed + // in the aws:userid column in the Principal table (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_variables.html#principaltable) // found on the Policy Variables reference page in the IAM User Guide. UserId *string `type:"string"` } @@ -2128,12 +2635,11 @@ type GetFederationTokenInput struct { _ struct{} `type:"structure"` // The duration, in seconds, that the session should last. Acceptable durations - // for federation sessions range from 900 seconds (15 minutes) to 129600 seconds - // (36 hours), with 43200 seconds (12 hours) as the default. Sessions obtained - // using AWS account (root) credentials are restricted to a maximum of 3600 + // for federation sessions range from 900 seconds (15 minutes) to 129,600 seconds + // (36 hours), with 43,200 seconds (12 hours) as the default. Sessions obtained + // using AWS account root user credentials are restricted to a maximum of 3,600 // seconds (one hour). If the specified duration is longer than one hour, the - // session obtained by using AWS account (root) credentials defaults to one - // hour. + // session obtained by using root user credentials defaults to one hour. DurationSeconds *int64 `min:"900" type:"integer"` // The name of the federated user. The name is used as an identifier for the @@ -2148,36 +2654,107 @@ type GetFederationTokenInput struct { // Name is a required field Name *string `min:"2" type:"string" required:"true"` - // An IAM policy in JSON format that is passed with the GetFederationToken call - // and evaluated along with the policy or policies that are attached to the - // IAM user whose credentials are used to call GetFederationToken. The passed - // policy is used to scope down the permissions that are available to the IAM - // user, by allowing only a subset of the permissions that are granted to the - // IAM user. The passed policy cannot grant more permissions than those granted - // to the IAM user. The final permissions for the federated user are the most - // restrictive set based on the intersection of the passed policy and the IAM - // user policy. - // - // If you do not pass a policy, the resulting temporary security credentials - // have no effective permissions. The only exception is when the temporary security - // credentials are used to access a resource that has a resource-based policy - // that specifically allows the federated user to access the resource. - // - // The format for this parameter, as described by its regex pattern, is a string - // of characters up to 2048 characters in length. The characters can be any - // ASCII character from the space character to the end of the valid character - // list (\u0020-\u00FF). It can also include the tab (\u0009), linefeed (\u000A), - // and carriage return (\u000D) characters. + // An IAM policy in JSON format that you want to use as an inline session policy. + // + // You must pass an inline or managed session policy (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) + // to this operation. You can pass a single JSON policy document to use as an + // inline session policy. You can also specify up to 10 managed policies to + // use as managed session policies. + // + // This parameter is optional. However, if you do not pass any session policies, + // then the resulting federated user session has no permissions. + // + // When you pass session policies, the session permissions are the intersection + // of the IAM user policies and the session policies that you pass. This gives + // you a way to further restrict the permissions for a federated user. You cannot + // use session policies to grant more permissions than those that are defined + // in the permissions policy of the IAM user. For more information, see Session + // Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) + // in the IAM User Guide. + // + // The resulting credentials can be used to access a resource that has a resource-based + // policy. If that policy specifically references the federated user session + // in the Principal element of the policy, the session has the permissions allowed + // by the policy. These permissions are granted in addition to the permissions + // that are granted by the session policies. // - // The policy plain text must be 2048 bytes or shorter. However, an internal - // conversion compresses it into a packed binary format with a separate limit. - // The PackedPolicySize response element indicates by percentage how close to - // the upper size limit the policy is, with 100% equaling the maximum allowed - // size. + // The plain text that you use for both inline and managed session policies + // can't exceed 2,048 characters. The JSON policy characters can be any ASCII + // character from the space character to the end of the valid character list + // (\u0020 through \u00FF). It can also include the tab (\u0009), linefeed (\u000A), + // and carriage return (\u000D) characters. // - // For more information about how permissions work, see Permissions for GetFederationToken - // (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_getfederationtoken.html). + // An AWS conversion compresses the passed session policies and session tags + // into a packed binary format that has a separate limit. Your request can fail + // for this limit even if your plain text meets the other requirements. The + // PackedPolicySize response element indicates by percentage how close the policies + // and tags for your request are to the upper size limit. Policy *string `min:"1" type:"string"` + + // The Amazon Resource Names (ARNs) of the IAM managed policies that you want + // to use as a managed session policy. The policies must exist in the same account + // as the IAM user that is requesting federated access. + // + // You must pass an inline or managed session policy (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) + // to this operation. You can pass a single JSON policy document to use as an + // inline session policy. You can also specify up to 10 managed policies to + // use as managed session policies. The plain text that you use for both inline + // and managed session policies can't exceed 2,048 characters. You can provide + // up to 10 managed policy ARNs. For more information about ARNs, see Amazon + // Resource Names (ARNs) and AWS Service Namespaces (https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) + // in the AWS General Reference. + // + // This parameter is optional. However, if you do not pass any session policies, + // then the resulting federated user session has no permissions. + // + // When you pass session policies, the session permissions are the intersection + // of the IAM user policies and the session policies that you pass. This gives + // you a way to further restrict the permissions for a federated user. You cannot + // use session policies to grant more permissions than those that are defined + // in the permissions policy of the IAM user. For more information, see Session + // Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) + // in the IAM User Guide. + // + // The resulting credentials can be used to access a resource that has a resource-based + // policy. If that policy specifically references the federated user session + // in the Principal element of the policy, the session has the permissions allowed + // by the policy. These permissions are granted in addition to the permissions + // that are granted by the session policies. + // + // An AWS conversion compresses the passed session policies and session tags + // into a packed binary format that has a separate limit. Your request can fail + // for this limit even if your plain text meets the other requirements. The + // PackedPolicySize response element indicates by percentage how close the policies + // and tags for your request are to the upper size limit. + PolicyArns []*PolicyDescriptorType `type:"list"` + + // A list of session tags. Each session tag consists of a key name and an associated + // value. For more information about session tags, see Passing Session Tags + // in STS (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) + // in the IAM User Guide. + // + // This parameter is optional. You can pass up to 50 session tags. The plain + // text session tag keys can’t exceed 128 characters and the values can’t + // exceed 256 characters. For these and additional limits, see IAM and STS Character + // Limits (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html#reference_iam-limits-entity-length) + // in the IAM User Guide. + // + // An AWS conversion compresses the passed session policies and session tags + // into a packed binary format that has a separate limit. Your request can fail + // for this limit even if your plain text meets the other requirements. The + // PackedPolicySize response element indicates by percentage how close the policies + // and tags for your request are to the upper size limit. + // + // You can pass a session tag with the same key as a tag that is already attached + // to the user you are federating. When you do, session tags override a user + // tag with the same key. + // + // Tag key–value pairs are not case sensitive, but case is preserved. This + // means that you cannot have separate Department and department tag keys. Assume + // that the role has the Department=Marketing tag and you pass the department=engineering + // session tag. Department and department are not saved as separate tags, and + // the session tag passed in the request takes precedence over the role tag. + Tags []*Tag `type:"list"` } // String returns the string representation @@ -2205,6 +2782,26 @@ func (s *GetFederationTokenInput) Validate() error { if s.Policy != nil && len(*s.Policy) < 1 { invalidParams.Add(request.NewErrParamMinLen("Policy", 1)) } + if s.PolicyArns != nil { + for i, v := range s.PolicyArns { + if v == nil { + continue + } + if err := v.Validate(); err != nil { + invalidParams.AddNested(fmt.Sprintf("%s[%v]", "PolicyArns", i), err.(request.ErrInvalidParams)) + } + } + } + if s.Tags != nil { + for i, v := range s.Tags { + if v == nil { + continue + } + if err := v.Validate(); err != nil { + invalidParams.AddNested(fmt.Sprintf("%s[%v]", "Tags", i), err.(request.ErrInvalidParams)) + } + } + } if invalidParams.Len() > 0 { return invalidParams @@ -2230,6 +2827,18 @@ func (s *GetFederationTokenInput) SetPolicy(v string) *GetFederationTokenInput { return s } +// SetPolicyArns sets the PolicyArns field's value. +func (s *GetFederationTokenInput) SetPolicyArns(v []*PolicyDescriptorType) *GetFederationTokenInput { + s.PolicyArns = v + return s +} + +// SetTags sets the Tags field's value. +func (s *GetFederationTokenInput) SetTags(v []*Tag) *GetFederationTokenInput { + s.Tags = v + return s +} + // Contains the response to a successful GetFederationToken request, including // temporary AWS credentials that can be used to make AWS requests. type GetFederationTokenOutput struct { @@ -2238,10 +2847,8 @@ type GetFederationTokenOutput struct { // The temporary security credentials, which include an access key ID, a secret // access key, and a security (or session) token. // - // Note: The size of the security token that STS APIs return is not fixed. We - // strongly recommend that you make no assumptions about the maximum size. As - // of this writing, the typical size is less than 4096 bytes, but that can vary. - // Also, future updates to AWS might require larger sizes. + // The size of the security token that STS API operations return is not fixed. + // We strongly recommend that you make no assumptions about the maximum size. Credentials *Credentials `type:"structure"` // Identifiers for the federated user associated with the credentials (such @@ -2250,9 +2857,10 @@ type GetFederationTokenOutput struct { // an Amazon S3 bucket policy. FederatedUser *FederatedUser `type:"structure"` - // A percentage value indicating the size of the policy in packed form. The - // service rejects policies for which the packed size is greater than 100 percent - // of the allowed value. + // A percentage value that indicates the packed size of the session policies + // and session tags combined passed in the request. The request fails if the + // packed size is greater than 100 percent, which means the policies and tags + // exceeded the allowed space. PackedPolicySize *int64 `type:"integer"` } @@ -2288,11 +2896,11 @@ type GetSessionTokenInput struct { _ struct{} `type:"structure"` // The duration, in seconds, that the credentials should remain valid. Acceptable - // durations for IAM user sessions range from 900 seconds (15 minutes) to 129600 - // seconds (36 hours), with 43200 seconds (12 hours) as the default. Sessions - // for AWS account owners are restricted to a maximum of 3600 seconds (one hour). - // If the duration is longer than one hour, the session for AWS account owners - // defaults to one hour. + // durations for IAM user sessions range from 900 seconds (15 minutes) to 129,600 + // seconds (36 hours), with 43,200 seconds (12 hours) as the default. Sessions + // for AWS account owners are restricted to a maximum of 3,600 seconds (one + // hour). If the duration is longer than one hour, the session for AWS account + // owners defaults to one hour. DurationSeconds *int64 `min:"900" type:"integer"` // The identification number of the MFA device that is associated with the IAM @@ -2303,16 +2911,16 @@ type GetSessionTokenInput struct { // You can find the device for an IAM user by going to the AWS Management Console // and viewing the user's security credentials. // - // The regex used to validated this parameter is a string of characters consisting + // The regex used to validate this parameter is a string of characters consisting // of upper- and lower-case alphanumeric characters with no spaces. You can // also include underscores or any of the following characters: =,.@:/- SerialNumber *string `min:"9" type:"string"` // The value provided by the MFA device, if MFA is required. If any policy requires // the IAM user to submit an MFA code, specify this value. If MFA authentication - // is required, and the user does not provide a code when requesting a set of - // temporary security credentials, the user will receive an "access denied" - // response when requesting resources that require MFA authentication. + // is required, the user must provide a code when requesting a set of temporary + // security credentials. A user who fails to provide the code receives an "access + // denied" response when requesting resources that require MFA authentication. // // The format for this parameter, as described by its regex pattern, is a sequence // of six numeric digits. @@ -2374,10 +2982,8 @@ type GetSessionTokenOutput struct { // The temporary security credentials, which include an access key ID, a secret // access key, and a security (or session) token. // - // Note: The size of the security token that STS APIs return is not fixed. We - // strongly recommend that you make no assumptions about the maximum size. As - // of this writing, the typical size is less than 4096 bytes, but that can vary. - // Also, future updates to AWS might require larger sizes. + // The size of the security token that STS API operations return is not fixed. + // We strongly recommend that you make no assumptions about the maximum size. Credentials *Credentials `type:"structure"` } @@ -2396,3 +3002,114 @@ func (s *GetSessionTokenOutput) SetCredentials(v *Credentials) *GetSessionTokenO s.Credentials = v return s } + +// A reference to the IAM managed policy that is passed as a session policy +// for a role session or a federated user session. +type PolicyDescriptorType struct { + _ struct{} `type:"structure"` + + // The Amazon Resource Name (ARN) of the IAM managed policy to use as a session + // policy for the role. For more information about ARNs, see Amazon Resource + // Names (ARNs) and AWS Service Namespaces (https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) + // in the AWS General Reference. + Arn *string `locationName:"arn" min:"20" type:"string"` +} + +// String returns the string representation +func (s PolicyDescriptorType) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s PolicyDescriptorType) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *PolicyDescriptorType) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "PolicyDescriptorType"} + if s.Arn != nil && len(*s.Arn) < 20 { + invalidParams.Add(request.NewErrParamMinLen("Arn", 20)) + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetArn sets the Arn field's value. +func (s *PolicyDescriptorType) SetArn(v string) *PolicyDescriptorType { + s.Arn = &v + return s +} + +// You can pass custom key-value pair attributes when you assume a role or federate +// a user. These are called session tags. You can then use the session tags +// to control access to resources. For more information, see Tagging AWS STS +// Sessions (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) +// in the IAM User Guide. +type Tag struct { + _ struct{} `type:"structure"` + + // The key for a session tag. + // + // You can pass up to 50 session tags. The plain text session tag keys can’t + // exceed 128 characters. For these and additional limits, see IAM and STS Character + // Limits (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html#reference_iam-limits-entity-length) + // in the IAM User Guide. + // + // Key is a required field + Key *string `min:"1" type:"string" required:"true"` + + // The value for a session tag. + // + // You can pass up to 50 session tags. The plain text session tag values can’t + // exceed 256 characters. For these and additional limits, see IAM and STS Character + // Limits (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html#reference_iam-limits-entity-length) + // in the IAM User Guide. + // + // Value is a required field + Value *string `type:"string" required:"true"` +} + +// String returns the string representation +func (s Tag) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s Tag) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *Tag) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "Tag"} + if s.Key == nil { + invalidParams.Add(request.NewErrParamRequired("Key")) + } + if s.Key != nil && len(*s.Key) < 1 { + invalidParams.Add(request.NewErrParamMinLen("Key", 1)) + } + if s.Value == nil { + invalidParams.Add(request.NewErrParamRequired("Value")) + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetKey sets the Key field's value. +func (s *Tag) SetKey(v string) *Tag { + s.Key = &v + return s +} + +// SetValue sets the Value field's value. +func (s *Tag) SetValue(v string) *Tag { + s.Value = &v + return s +} diff --git a/vendor/github.com/aws/aws-sdk-go/service/sts/customizations.go b/vendor/github.com/aws/aws-sdk-go/service/sts/customizations.go index 4010cc7fa..d5307fcaa 100644 --- a/vendor/github.com/aws/aws-sdk-go/service/sts/customizations.go +++ b/vendor/github.com/aws/aws-sdk-go/service/sts/customizations.go @@ -3,10 +3,9 @@ package sts import "github.com/aws/aws-sdk-go/aws/request" func init() { - initRequest = func(r *request.Request) { - switch r.Operation.Name { - case opAssumeRoleWithSAML, opAssumeRoleWithWebIdentity: - r.Handlers.Sign.Clear() // these operations are unsigned - } - } + initRequest = customizeRequest +} + +func customizeRequest(r *request.Request) { + r.RetryErrorCodes = append(r.RetryErrorCodes, ErrCodeIDPCommunicationErrorException) } diff --git a/vendor/github.com/aws/aws-sdk-go/service/sts/doc.go b/vendor/github.com/aws/aws-sdk-go/service/sts/doc.go index ef681ab0c..fcb720dca 100644 --- a/vendor/github.com/aws/aws-sdk-go/service/sts/doc.go +++ b/vendor/github.com/aws/aws-sdk-go/service/sts/doc.go @@ -7,22 +7,14 @@ // request temporary, limited-privilege credentials for AWS Identity and Access // Management (IAM) users or for users that you authenticate (federated users). // This guide provides descriptions of the STS API. For more detailed information -// about using this service, go to Temporary Security Credentials (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html). -// -// As an alternative to using the API, you can use one of the AWS SDKs, which -// consist of libraries and sample code for various programming languages and -// platforms (Java, Ruby, .NET, iOS, Android, etc.). The SDKs provide a convenient -// way to create programmatic access to STS. For example, the SDKs take care -// of cryptographically signing requests, managing errors, and retrying requests -// automatically. For information about the AWS SDKs, including how to download -// and install them, see the Tools for Amazon Web Services page (http://aws.amazon.com/tools/). +// about using this service, go to Temporary Security Credentials (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html). // // For information about setting up signatures and authorization through the -// API, go to Signing AWS API Requests (http://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html) +// API, go to Signing AWS API Requests (https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html) // in the AWS General Reference. For general information about the Query API, -// go to Making Query Requests (http://docs.aws.amazon.com/IAM/latest/UserGuide/IAM_UsingQueryAPI.html) +// go to Making Query Requests (https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM_UsingQueryAPI.html) // in Using IAM. For information about using security tokens with other AWS -// products, go to AWS Services That Work with IAM (http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html) +// products, go to AWS Services That Work with IAM (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html) // in the IAM User Guide. // // If you're new to AWS and need additional technical information about a specific @@ -31,14 +23,38 @@ // // Endpoints // -// The AWS Security Token Service (STS) has a default endpoint of https://sts.amazonaws.com -// that maps to the US East (N. Virginia) region. Additional regions are available -// and are activated by default. For more information, see Activating and Deactivating -// AWS STS in an AWS Region (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) +// By default, AWS Security Token Service (STS) is available as a global service, +// and all AWS STS requests go to a single endpoint at https://sts.amazonaws.com. +// Global requests map to the US East (N. Virginia) region. AWS recommends using +// Regional AWS STS endpoints instead of the global endpoint to reduce latency, +// build in redundancy, and increase session token validity. For more information, +// see Managing AWS STS in an AWS Region (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) +// in the IAM User Guide. +// +// Most AWS Regions are enabled for operations in all AWS services by default. +// Those Regions are automatically activated for use with AWS STS. Some Regions, +// such as Asia Pacific (Hong Kong), must be manually enabled. To learn more +// about enabling and disabling AWS Regions, see Managing AWS Regions (https://docs.aws.amazon.com/general/latest/gr/rande-manage.html) +// in the AWS General Reference. When you enable these AWS Regions, they are +// automatically activated for use with AWS STS. You cannot activate the STS +// endpoint for a Region that is disabled. Tokens that are valid in all AWS +// Regions are longer than tokens that are valid in Regions that are enabled +// by default. Changing this setting might affect existing systems where you +// temporarily store tokens. For more information, see Managing Global Endpoint +// Session Tokens (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html#sts-regions-manage-tokens) // in the IAM User Guide. // -// For information about STS endpoints, see Regions and Endpoints (http://docs.aws.amazon.com/general/latest/gr/rande.html#sts_region) -// in the AWS General Reference. +// After you activate a Region for use with AWS STS, you can direct AWS STS +// API calls to that Region. AWS STS recommends that you provide both the Region +// and endpoint when you make calls to a Regional endpoint. You can provide +// the Region alone for manually enabled Regions, such as Asia Pacific (Hong +// Kong). In this case, the calls are directed to the STS Regional endpoint. +// However, if you provide the Region alone for Regions enabled by default, +// the calls are directed to the global endpoint of https://sts.amazonaws.com. +// +// To view the list of AWS STS endpoints and whether they are active by default, +// see Writing Code to Use AWS STS Regions (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html#id_credentials_temp_enable-regions_writing_code) +// in the IAM User Guide. // // Recording API requests // @@ -46,8 +62,28 @@ // your AWS account and delivers log files to an Amazon S3 bucket. By using // information collected by CloudTrail, you can determine what requests were // successfully made to STS, who made the request, when it was made, and so -// on. To learn more about CloudTrail, including how to turn it on and find -// your log files, see the AWS CloudTrail User Guide (http://docs.aws.amazon.com/awscloudtrail/latest/userguide/what_is_cloud_trail_top_level.html). +// on. +// +// If you activate AWS STS endpoints in Regions other than the default global +// endpoint, then you must also turn on CloudTrail logging in those Regions. +// This is necessary to record any AWS STS API calls that are made in those +// Regions. For more information, see Turning On CloudTrail in Additional Regions +// (https://docs.aws.amazon.com/awscloudtrail/latest/userguide/aggregating_logs_regions_turn_on_ct.html) +// in the AWS CloudTrail User Guide. +// +// AWS Security Token Service (STS) is a global service with a single endpoint +// at https://sts.amazonaws.com. Calls to this endpoint are logged as calls +// to a global service. However, because this endpoint is physically located +// in the US East (N. Virginia) Region, your logs list us-east-1 as the event +// Region. CloudTrail does not write these logs to the US East (Ohio) Region +// unless you choose to include global service logs in that Region. CloudTrail +// writes calls to all Regional endpoints to their respective Regions. For example, +// calls to sts.us-east-2.amazonaws.com are published to the US East (Ohio) +// Region and calls to sts.eu-central-1.amazonaws.com are published to the EU +// (Frankfurt) Region. +// +// To learn more about CloudTrail, including how to turn it on and find your +// log files, see the AWS CloudTrail User Guide (https://docs.aws.amazon.com/awscloudtrail/latest/userguide/what_is_cloud_trail_top_level.html). // // See https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15 for more information on this service. // diff --git a/vendor/github.com/aws/aws-sdk-go/service/sts/errors.go b/vendor/github.com/aws/aws-sdk-go/service/sts/errors.go index e24884ef3..a233f542e 100644 --- a/vendor/github.com/aws/aws-sdk-go/service/sts/errors.go +++ b/vendor/github.com/aws/aws-sdk-go/service/sts/errors.go @@ -14,11 +14,11 @@ const ( // ErrCodeIDPCommunicationErrorException for service response error code // "IDPCommunicationError". // - // The request could not be fulfilled because the non-AWS identity provider - // (IDP) that was asked to verify the incoming identity token could not be reached. - // This is often a transient error caused by network conditions. Retry the request + // The request could not be fulfilled because the identity provider (IDP) that + // was asked to verify the incoming identity token could not be reached. This + // is often a transient error caused by network conditions. Retry the request // a limited number of times so that you don't exceed the request rate. If the - // error persists, the non-AWS identity provider might be down or not responding. + // error persists, the identity provider might be down or not responding. ErrCodeIDPCommunicationErrorException = "IDPCommunicationError" // ErrCodeIDPRejectedClaimException for service response error code @@ -56,9 +56,18 @@ const ( // ErrCodePackedPolicyTooLargeException for service response error code // "PackedPolicyTooLarge". // - // The request was rejected because the policy document was too large. The error - // message describes how big the policy document is, in packed form, as a percentage - // of what the API allows. + // The request was rejected because the total packed size of the session policies + // and session tags combined was too large. An AWS conversion compresses the + // session policy document, session policy ARNs, and session tags into a packed + // binary format that has a separate limit. The error message indicates by percentage + // how close the policies and tags are to the upper size limit. For more information, + // see Passing Session Tags in STS (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) + // in the IAM User Guide. + // + // You could receive this error even though you meet other defined session policy + // and session tag limits. For more information, see IAM and STS Entity Character + // Limits (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) + // in the IAM User Guide. ErrCodePackedPolicyTooLargeException = "PackedPolicyTooLarge" // ErrCodeRegionDisabledException for service response error code @@ -67,7 +76,7 @@ const ( // STS is not activated in the requested region for the account that is being // asked to generate credentials. The account administrator must use the IAM // console to activate STS in that region. For more information, see Activating - // and Deactivating AWS STS in an AWS Region (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) + // and Deactivating AWS STS in an AWS Region (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) // in the IAM User Guide. ErrCodeRegionDisabledException = "RegionDisabledException" ) diff --git a/vendor/github.com/aws/aws-sdk-go/service/sts/service.go b/vendor/github.com/aws/aws-sdk-go/service/sts/service.go index 1ee5839e0..d34a68553 100644 --- a/vendor/github.com/aws/aws-sdk-go/service/sts/service.go +++ b/vendor/github.com/aws/aws-sdk-go/service/sts/service.go @@ -29,8 +29,9 @@ var initRequest func(*request.Request) // Service information constants const ( - ServiceName = "sts" // Service endpoint prefix API calls made to. - EndpointsID = ServiceName // Service ID for Regions and Endpoints metadata. + ServiceName = "sts" // Name of service. + EndpointsID = ServiceName // ID to lookup a service endpoint with. + ServiceID = "STS" // ServiceID is a unique identifier of a specific service. ) // New creates a new instance of the STS client with a session. @@ -38,6 +39,8 @@ const ( // aws.Config parameter to add your extra config. // // Example: +// mySession := session.Must(session.NewSession()) +// // // Create a STS client from just a session. // svc := sts.New(mySession) // @@ -45,18 +48,20 @@ const ( // svc := sts.New(mySession, aws.NewConfig().WithRegion("us-west-2")) func New(p client.ConfigProvider, cfgs ...*aws.Config) *STS { c := p.ClientConfig(EndpointsID, cfgs...) - return newClient(*c.Config, c.Handlers, c.Endpoint, c.SigningRegion, c.SigningName) + return newClient(*c.Config, c.Handlers, c.PartitionID, c.Endpoint, c.SigningRegion, c.SigningName) } // newClient creates, initializes and returns a new service client instance. -func newClient(cfg aws.Config, handlers request.Handlers, endpoint, signingRegion, signingName string) *STS { +func newClient(cfg aws.Config, handlers request.Handlers, partitionID, endpoint, signingRegion, signingName string) *STS { svc := &STS{ Client: client.New( cfg, metadata.ClientInfo{ ServiceName: ServiceName, + ServiceID: ServiceID, SigningName: signingName, SigningRegion: signingRegion, + PartitionID: partitionID, Endpoint: endpoint, APIVersion: "2011-06-15", }, diff --git a/vendor/github.com/aws/aws-sdk-go/service/sts/stsiface/interface.go b/vendor/github.com/aws/aws-sdk-go/service/sts/stsiface/interface.go new file mode 100644 index 000000000..e2e1d6efe --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/service/sts/stsiface/interface.go @@ -0,0 +1,96 @@ +// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT. + +// Package stsiface provides an interface to enable mocking the AWS Security Token Service service client +// for testing your code. +// +// It is important to note that this interface will have breaking changes +// when the service model is updated and adds new API operations, paginators, +// and waiters. +package stsiface + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/request" + "github.com/aws/aws-sdk-go/service/sts" +) + +// STSAPI provides an interface to enable mocking the +// sts.STS service client's API operation, +// paginators, and waiters. This make unit testing your code that calls out +// to the SDK's service client's calls easier. +// +// The best way to use this interface is so the SDK's service client's calls +// can be stubbed out for unit testing your code with the SDK without needing +// to inject custom request handlers into the SDK's request pipeline. +// +// // myFunc uses an SDK service client to make a request to +// // AWS Security Token Service. +// func myFunc(svc stsiface.STSAPI) bool { +// // Make svc.AssumeRole request +// } +// +// func main() { +// sess := session.New() +// svc := sts.New(sess) +// +// myFunc(svc) +// } +// +// In your _test.go file: +// +// // Define a mock struct to be used in your unit tests of myFunc. +// type mockSTSClient struct { +// stsiface.STSAPI +// } +// func (m *mockSTSClient) AssumeRole(input *sts.AssumeRoleInput) (*sts.AssumeRoleOutput, error) { +// // mock response/functionality +// } +// +// func TestMyFunc(t *testing.T) { +// // Setup Test +// mockSvc := &mockSTSClient{} +// +// myfunc(mockSvc) +// +// // Verify myFunc's functionality +// } +// +// It is important to note that this interface will have breaking changes +// when the service model is updated and adds new API operations, paginators, +// and waiters. Its suggested to use the pattern above for testing, or using +// tooling to generate mocks to satisfy the interfaces. +type STSAPI interface { + AssumeRole(*sts.AssumeRoleInput) (*sts.AssumeRoleOutput, error) + AssumeRoleWithContext(aws.Context, *sts.AssumeRoleInput, ...request.Option) (*sts.AssumeRoleOutput, error) + AssumeRoleRequest(*sts.AssumeRoleInput) (*request.Request, *sts.AssumeRoleOutput) + + AssumeRoleWithSAML(*sts.AssumeRoleWithSAMLInput) (*sts.AssumeRoleWithSAMLOutput, error) + AssumeRoleWithSAMLWithContext(aws.Context, *sts.AssumeRoleWithSAMLInput, ...request.Option) (*sts.AssumeRoleWithSAMLOutput, error) + AssumeRoleWithSAMLRequest(*sts.AssumeRoleWithSAMLInput) (*request.Request, *sts.AssumeRoleWithSAMLOutput) + + AssumeRoleWithWebIdentity(*sts.AssumeRoleWithWebIdentityInput) (*sts.AssumeRoleWithWebIdentityOutput, error) + AssumeRoleWithWebIdentityWithContext(aws.Context, *sts.AssumeRoleWithWebIdentityInput, ...request.Option) (*sts.AssumeRoleWithWebIdentityOutput, error) + AssumeRoleWithWebIdentityRequest(*sts.AssumeRoleWithWebIdentityInput) (*request.Request, *sts.AssumeRoleWithWebIdentityOutput) + + DecodeAuthorizationMessage(*sts.DecodeAuthorizationMessageInput) (*sts.DecodeAuthorizationMessageOutput, error) + DecodeAuthorizationMessageWithContext(aws.Context, *sts.DecodeAuthorizationMessageInput, ...request.Option) (*sts.DecodeAuthorizationMessageOutput, error) + DecodeAuthorizationMessageRequest(*sts.DecodeAuthorizationMessageInput) (*request.Request, *sts.DecodeAuthorizationMessageOutput) + + GetAccessKeyInfo(*sts.GetAccessKeyInfoInput) (*sts.GetAccessKeyInfoOutput, error) + GetAccessKeyInfoWithContext(aws.Context, *sts.GetAccessKeyInfoInput, ...request.Option) (*sts.GetAccessKeyInfoOutput, error) + GetAccessKeyInfoRequest(*sts.GetAccessKeyInfoInput) (*request.Request, *sts.GetAccessKeyInfoOutput) + + GetCallerIdentity(*sts.GetCallerIdentityInput) (*sts.GetCallerIdentityOutput, error) + GetCallerIdentityWithContext(aws.Context, *sts.GetCallerIdentityInput, ...request.Option) (*sts.GetCallerIdentityOutput, error) + GetCallerIdentityRequest(*sts.GetCallerIdentityInput) (*request.Request, *sts.GetCallerIdentityOutput) + + GetFederationToken(*sts.GetFederationTokenInput) (*sts.GetFederationTokenOutput, error) + GetFederationTokenWithContext(aws.Context, *sts.GetFederationTokenInput, ...request.Option) (*sts.GetFederationTokenOutput, error) + GetFederationTokenRequest(*sts.GetFederationTokenInput) (*request.Request, *sts.GetFederationTokenOutput) + + GetSessionToken(*sts.GetSessionTokenInput) (*sts.GetSessionTokenOutput, error) + GetSessionTokenWithContext(aws.Context, *sts.GetSessionTokenInput, ...request.Option) (*sts.GetSessionTokenOutput, error) + GetSessionTokenRequest(*sts.GetSessionTokenInput) (*request.Request, *sts.GetSessionTokenOutput) +} + +var _ STSAPI = (*sts.STS)(nil) diff --git a/vendor/github.com/davecgh/go-spew/LICENSE b/vendor/github.com/davecgh/go-spew/LICENSE index c83641619..bc52e96f2 100644 --- a/vendor/github.com/davecgh/go-spew/LICENSE +++ b/vendor/github.com/davecgh/go-spew/LICENSE @@ -2,7 +2,7 @@ ISC License Copyright (c) 2012-2016 Dave Collins -Permission to use, copy, modify, and distribute this software for any +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. diff --git a/vendor/github.com/davecgh/go-spew/spew/bypass.go b/vendor/github.com/davecgh/go-spew/spew/bypass.go index 8a4a6589a..792994785 100644 --- a/vendor/github.com/davecgh/go-spew/spew/bypass.go +++ b/vendor/github.com/davecgh/go-spew/spew/bypass.go @@ -16,7 +16,9 @@ // when the code is not running on Google App Engine, compiled by GopherJS, and // "-tags safe" is not added to the go build command line. The "disableunsafe" // tag is deprecated and thus should not be used. -// +build !js,!appengine,!safe,!disableunsafe +// Go versions prior to 1.4 are disabled because they use a different layout +// for interfaces which make the implementation of unsafeReflectValue more complex. +// +build !js,!appengine,!safe,!disableunsafe,go1.4 package spew @@ -34,80 +36,49 @@ const ( ptrSize = unsafe.Sizeof((*byte)(nil)) ) +type flag uintptr + var ( - // offsetPtr, offsetScalar, and offsetFlag are the offsets for the - // internal reflect.Value fields. These values are valid before golang - // commit ecccf07e7f9d which changed the format. The are also valid - // after commit 82f48826c6c7 which changed the format again to mirror - // the original format. Code in the init function updates these offsets - // as necessary. - offsetPtr = uintptr(ptrSize) - offsetScalar = uintptr(0) - offsetFlag = uintptr(ptrSize * 2) - - // flagKindWidth and flagKindShift indicate various bits that the - // reflect package uses internally to track kind information. - // - // flagRO indicates whether or not the value field of a reflect.Value is - // read-only. - // - // flagIndir indicates whether the value field of a reflect.Value is - // the actual data or a pointer to the data. - // - // These values are valid before golang commit 90a7c3c86944 which - // changed their positions. Code in the init function updates these - // flags as necessary. - flagKindWidth = uintptr(5) - flagKindShift = uintptr(flagKindWidth - 1) - flagRO = uintptr(1 << 0) - flagIndir = uintptr(1 << 1) + // flagRO indicates whether the value field of a reflect.Value + // is read-only. + flagRO flag + + // flagAddr indicates whether the address of the reflect.Value's + // value may be taken. + flagAddr flag ) -func init() { - // Older versions of reflect.Value stored small integers directly in the - // ptr field (which is named val in the older versions). Versions - // between commits ecccf07e7f9d and 82f48826c6c7 added a new field named - // scalar for this purpose which unfortunately came before the flag - // field, so the offset of the flag field is different for those - // versions. - // - // This code constructs a new reflect.Value from a known small integer - // and checks if the size of the reflect.Value struct indicates it has - // the scalar field. When it does, the offsets are updated accordingly. - vv := reflect.ValueOf(0xf00) - if unsafe.Sizeof(vv) == (ptrSize * 4) { - offsetScalar = ptrSize * 2 - offsetFlag = ptrSize * 3 - } +// flagKindMask holds the bits that make up the kind +// part of the flags field. In all the supported versions, +// it is in the lower 5 bits. +const flagKindMask = flag(0x1f) - // Commit 90a7c3c86944 changed the flag positions such that the low - // order bits are the kind. This code extracts the kind from the flags - // field and ensures it's the correct type. When it's not, the flag - // order has been changed to the newer format, so the flags are updated - // accordingly. - upf := unsafe.Pointer(uintptr(unsafe.Pointer(&vv)) + offsetFlag) - upfv := *(*uintptr)(upf) - flagKindMask := uintptr((1<>flagKindShift != uintptr(reflect.Int) { - flagKindShift = 0 - flagRO = 1 << 5 - flagIndir = 1 << 6 - - // Commit adf9b30e5594 modified the flags to separate the - // flagRO flag into two bits which specifies whether or not the - // field is embedded. This causes flagIndir to move over a bit - // and means that flagRO is the combination of either of the - // original flagRO bit and the new bit. - // - // This code detects the change by extracting what used to be - // the indirect bit to ensure it's set. When it's not, the flag - // order has been changed to the newer format, so the flags are - // updated accordingly. - if upfv&flagIndir == 0 { - flagRO = 3 << 5 - flagIndir = 1 << 7 - } +// Different versions of Go have used different +// bit layouts for the flags type. This table +// records the known combinations. +var okFlags = []struct { + ro, addr flag +}{{ + // From Go 1.4 to 1.5 + ro: 1 << 5, + addr: 1 << 7, +}, { + // Up to Go tip. + ro: 1<<5 | 1<<6, + addr: 1 << 8, +}} + +var flagValOffset = func() uintptr { + field, ok := reflect.TypeOf(reflect.Value{}).FieldByName("flag") + if !ok { + panic("reflect.Value has no flag field") } + return field.Offset +}() + +// flagField returns a pointer to the flag field of a reflect.Value. +func flagField(v *reflect.Value) *flag { + return (*flag)(unsafe.Pointer(uintptr(unsafe.Pointer(v)) + flagValOffset)) } // unsafeReflectValue converts the passed reflect.Value into a one that bypasses @@ -119,34 +90,56 @@ func init() { // This allows us to check for implementations of the Stringer and error // interfaces to be used for pretty printing ordinarily unaddressable and // inaccessible values such as unexported struct fields. -func unsafeReflectValue(v reflect.Value) (rv reflect.Value) { - indirects := 1 - vt := v.Type() - upv := unsafe.Pointer(uintptr(unsafe.Pointer(&v)) + offsetPtr) - rvf := *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&v)) + offsetFlag)) - if rvf&flagIndir != 0 { - vt = reflect.PtrTo(v.Type()) - indirects++ - } else if offsetScalar != 0 { - // The value is in the scalar field when it's not one of the - // reference types. - switch vt.Kind() { - case reflect.Uintptr: - case reflect.Chan: - case reflect.Func: - case reflect.Map: - case reflect.Ptr: - case reflect.UnsafePointer: - default: - upv = unsafe.Pointer(uintptr(unsafe.Pointer(&v)) + - offsetScalar) - } +func unsafeReflectValue(v reflect.Value) reflect.Value { + if !v.IsValid() || (v.CanInterface() && v.CanAddr()) { + return v } + flagFieldPtr := flagField(&v) + *flagFieldPtr &^= flagRO + *flagFieldPtr |= flagAddr + return v +} - pv := reflect.NewAt(vt, upv) - rv = pv - for i := 0; i < indirects; i++ { - rv = rv.Elem() +// Sanity checks against future reflect package changes +// to the type or semantics of the Value.flag field. +func init() { + field, ok := reflect.TypeOf(reflect.Value{}).FieldByName("flag") + if !ok { + panic("reflect.Value has no flag field") + } + if field.Type.Kind() != reflect.TypeOf(flag(0)).Kind() { + panic("reflect.Value flag field has changed kind") + } + type t0 int + var t struct { + A t0 + // t0 will have flagEmbedRO set. + t0 + // a will have flagStickyRO set + a t0 + } + vA := reflect.ValueOf(t).FieldByName("A") + va := reflect.ValueOf(t).FieldByName("a") + vt0 := reflect.ValueOf(t).FieldByName("t0") + + // Infer flagRO from the difference between the flags + // for the (otherwise identical) fields in t. + flagPublic := *flagField(&vA) + flagWithRO := *flagField(&va) | *flagField(&vt0) + flagRO = flagPublic ^ flagWithRO + + // Infer flagAddr from the difference between a value + // taken from a pointer and not. + vPtrA := reflect.ValueOf(&t).Elem().FieldByName("A") + flagNoPtr := *flagField(&vA) + flagPtr := *flagField(&vPtrA) + flagAddr = flagNoPtr ^ flagPtr + + // Check that the inferred flags tally with one of the known versions. + for _, f := range okFlags { + if flagRO == f.ro && flagAddr == f.addr { + return + } } - return rv + panic("reflect.Value read-only flag has changed semantics") } diff --git a/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go b/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go index 1fe3cf3d5..205c28d68 100644 --- a/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go +++ b/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go @@ -16,7 +16,7 @@ // when the code is running on Google App Engine, compiled by GopherJS, or // "-tags safe" is added to the go build command line. The "disableunsafe" // tag is deprecated and thus should not be used. -// +build js appengine safe disableunsafe +// +build js appengine safe disableunsafe !go1.4 package spew diff --git a/vendor/github.com/davecgh/go-spew/spew/common.go b/vendor/github.com/davecgh/go-spew/spew/common.go index 7c519ff47..1be8ce945 100644 --- a/vendor/github.com/davecgh/go-spew/spew/common.go +++ b/vendor/github.com/davecgh/go-spew/spew/common.go @@ -180,7 +180,7 @@ func printComplex(w io.Writer, c complex128, floatPrecision int) { w.Write(closeParenBytes) } -// printHexPtr outputs a uintptr formatted as hexidecimal with a leading '0x' +// printHexPtr outputs a uintptr formatted as hexadecimal with a leading '0x' // prefix to Writer w. func printHexPtr(w io.Writer, p uintptr) { // Null pointer. diff --git a/vendor/github.com/davecgh/go-spew/spew/dump.go b/vendor/github.com/davecgh/go-spew/spew/dump.go index df1d582a7..f78d89fc1 100644 --- a/vendor/github.com/davecgh/go-spew/spew/dump.go +++ b/vendor/github.com/davecgh/go-spew/spew/dump.go @@ -35,16 +35,16 @@ var ( // cCharRE is a regular expression that matches a cgo char. // It is used to detect character arrays to hexdump them. - cCharRE = regexp.MustCompile("^.*\\._Ctype_char$") + cCharRE = regexp.MustCompile(`^.*\._Ctype_char$`) // cUnsignedCharRE is a regular expression that matches a cgo unsigned // char. It is used to detect unsigned character arrays to hexdump // them. - cUnsignedCharRE = regexp.MustCompile("^.*\\._Ctype_unsignedchar$") + cUnsignedCharRE = regexp.MustCompile(`^.*\._Ctype_unsignedchar$`) // cUint8tCharRE is a regular expression that matches a cgo uint8_t. // It is used to detect uint8_t arrays to hexdump them. - cUint8tCharRE = regexp.MustCompile("^.*\\._Ctype_uint8_t$") + cUint8tCharRE = regexp.MustCompile(`^.*\._Ctype_uint8_t$`) ) // dumpState contains information about the state of a dump operation. @@ -143,10 +143,10 @@ func (d *dumpState) dumpPtr(v reflect.Value) { // Display dereferenced value. d.w.Write(openParenBytes) switch { - case nilFound == true: + case nilFound: d.w.Write(nilAngleBytes) - case cycleFound == true: + case cycleFound: d.w.Write(circularBytes) default: diff --git a/vendor/github.com/davecgh/go-spew/spew/format.go b/vendor/github.com/davecgh/go-spew/spew/format.go index c49875bac..b04edb7d7 100644 --- a/vendor/github.com/davecgh/go-spew/spew/format.go +++ b/vendor/github.com/davecgh/go-spew/spew/format.go @@ -182,10 +182,10 @@ func (f *formatState) formatPtr(v reflect.Value) { // Display dereferenced value. switch { - case nilFound == true: + case nilFound: f.fs.Write(nilAngleBytes) - case cycleFound == true: + case cycleFound: f.fs.Write(circularShortBytes) default: diff --git a/vendor/github.com/docker/distribution/AUTHORS b/vendor/github.com/docker/distribution/AUTHORS deleted file mode 100644 index aaf029871..000000000 --- a/vendor/github.com/docker/distribution/AUTHORS +++ /dev/null @@ -1,182 +0,0 @@ -Aaron Lehmann -Aaron Schlesinger -Aaron Vinson -Adam Duke -Adam Enger -Adrian Mouat -Ahmet Alp Balkan -Alex Chan -Alex Elman -Alexey Gladkov -allencloud -amitshukla -Amy Lindburg -Andrew Hsu -Andrew Meredith -Andrew T Nguyen -Andrey Kostov -Andy Goldstein -Anis Elleuch -Antonio Mercado -Antonio Murdaca -Anton Tiurin -Anusha Ragunathan -a-palchikov -Arien Holthuizen -Arnaud Porterie -Arthur Baars -Asuka Suzuki -Avi Miller -Ayose Cazorla -BadZen -Ben Bodenmiller -Ben Firshman -bin liu -Brian Bland -burnettk -Carson A -Cezar Sa Espinola -Charles Smith -Chris Dillon -cuiwei13 -cyli -Daisuke Fujita -Daniel Huhn -Darren Shepherd -Dave Trombley -Dave Tucker -David Lawrence -davidli -David Verhasselt -David Xia -Dejan Golja -Derek McGowan -Diogo Mónica -DJ Enriquez -Donald Huang -Doug Davis -Edgar Lee -Eric Yang -Fabio Berchtold -Fabio Huser -farmerworking -Felix Yan -Florentin Raud -Frank Chen -Frederick F. Kautz IV -gabriell nascimento -Gleb Schukin -harche -Henri Gomez -Hua Wang -Hu Keping -HuKeping -Ian Babrou -igayoso -Jack Griffin -James Findley -Jason Freidman -Jason Heiss -Jeff Nickoloff -Jess Frazelle -Jessie Frazelle -jhaohai -Jianqing Wang -Jihoon Chung -Joao Fernandes -John Mulhausen -John Starks -Jonathan Boulle -Jon Johnson -Jon Poler -Jordan Liggitt -Josh Chorlton -Josh Hawn -Julien Fernandez -Keerthan Mala -Kelsey Hightower -Kenneth Lim -Kenny Leung -Ke Xu -liuchang0812 -Liu Hua -Li Yi -Lloyd Ramey -Louis Kottmann -Luke Carpenter -Marcus Martins -Mary Anthony -Matt Bentley -Matt Duch -Matthew Green -Matt Moore -Matt Robenolt -Michael Prokop -Michal Minar -Michal Minář -Mike Brown -Miquel Sabaté -Misty Stanley-Jones -Morgan Bauer -moxiegirl -Nathan Sullivan -nevermosby -Nghia Tran -Nikita Tarasov -Noah Treuhaft -Nuutti Kotivuori -Oilbeater -Olivier Gambier -Olivier Jacques -Omer Cohen -Patrick Devine -Phil Estes -Philip Misiowiec -Pierre-Yves Ritschard -Qiao Anran -Randy Barlow -Richard Scothern -Rodolfo Carvalho -Rusty Conover -Sean Boran -Sebastiaan van Stijn -Sebastien Coavoux -Serge Dubrouski -Sharif Nassar -Shawn Falkner-Horine -Shreyas Karnik -Simon Thulbourn -spacexnice -Spencer Rinehart -Stan Hu -Stefan Majewsky -Stefan Weil -Stephen J Day -Sungho Moon -Sven Dowideit -Sylvain Baubeau -Ted Reed -tgic -Thomas Sjögren -Tianon Gravi -Tibor Vass -Tonis Tiigi -Tony Holdstock-Brown -Trevor Pounds -Troels Thomsen -Victoria Bialas -Victor Vieux -Vincent Batts -Vincent Demeester -Vincent Giersch -weiyuan.yl -W. Trevor King -xg.song -xiekeyang -Yann ROBERT -yaoyao.xyy -yixi zhang -yuexiao-wang -yuzou -zhouhaibing089 -姜继忠 diff --git a/vendor/github.com/docker/distribution/digest/digest.go b/vendor/github.com/docker/distribution/digest/digest.go deleted file mode 100644 index 31d821bba..000000000 --- a/vendor/github.com/docker/distribution/digest/digest.go +++ /dev/null @@ -1,139 +0,0 @@ -package digest - -import ( - "fmt" - "hash" - "io" - "regexp" - "strings" -) - -const ( - // DigestSha256EmptyTar is the canonical sha256 digest of empty data - DigestSha256EmptyTar = "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" -) - -// Digest allows simple protection of hex formatted digest strings, prefixed -// by their algorithm. Strings of type Digest have some guarantee of being in -// the correct format and it provides quick access to the components of a -// digest string. -// -// The following is an example of the contents of Digest types: -// -// sha256:7173b809ca12ec5dee4506cd86be934c4596dd234ee82c0662eac04a8c2c71dc -// -// This allows to abstract the digest behind this type and work only in those -// terms. -type Digest string - -// NewDigest returns a Digest from alg and a hash.Hash object. -func NewDigest(alg Algorithm, h hash.Hash) Digest { - return NewDigestFromBytes(alg, h.Sum(nil)) -} - -// NewDigestFromBytes returns a new digest from the byte contents of p. -// Typically, this can come from hash.Hash.Sum(...) or xxx.SumXXX(...) -// functions. This is also useful for rebuilding digests from binary -// serializations. -func NewDigestFromBytes(alg Algorithm, p []byte) Digest { - return Digest(fmt.Sprintf("%s:%x", alg, p)) -} - -// NewDigestFromHex returns a Digest from alg and a the hex encoded digest. -func NewDigestFromHex(alg, hex string) Digest { - return Digest(fmt.Sprintf("%s:%s", alg, hex)) -} - -// DigestRegexp matches valid digest types. -var DigestRegexp = regexp.MustCompile(`[a-zA-Z0-9-_+.]+:[a-fA-F0-9]+`) - -// DigestRegexpAnchored matches valid digest types, anchored to the start and end of the match. -var DigestRegexpAnchored = regexp.MustCompile(`^` + DigestRegexp.String() + `$`) - -var ( - // ErrDigestInvalidFormat returned when digest format invalid. - ErrDigestInvalidFormat = fmt.Errorf("invalid checksum digest format") - - // ErrDigestInvalidLength returned when digest has invalid length. - ErrDigestInvalidLength = fmt.Errorf("invalid checksum digest length") - - // ErrDigestUnsupported returned when the digest algorithm is unsupported. - ErrDigestUnsupported = fmt.Errorf("unsupported digest algorithm") -) - -// ParseDigest parses s and returns the validated digest object. An error will -// be returned if the format is invalid. -func ParseDigest(s string) (Digest, error) { - d := Digest(s) - - return d, d.Validate() -} - -// FromReader returns the most valid digest for the underlying content using -// the canonical digest algorithm. -func FromReader(rd io.Reader) (Digest, error) { - return Canonical.FromReader(rd) -} - -// FromBytes digests the input and returns a Digest. -func FromBytes(p []byte) Digest { - return Canonical.FromBytes(p) -} - -// Validate checks that the contents of d is a valid digest, returning an -// error if not. -func (d Digest) Validate() error { - s := string(d) - - if !DigestRegexpAnchored.MatchString(s) { - return ErrDigestInvalidFormat - } - - i := strings.Index(s, ":") - if i < 0 { - return ErrDigestInvalidFormat - } - - // case: "sha256:" with no hex. - if i+1 == len(s) { - return ErrDigestInvalidFormat - } - - switch algorithm := Algorithm(s[:i]); algorithm { - case SHA256, SHA384, SHA512: - if algorithm.Size()*2 != len(s[i+1:]) { - return ErrDigestInvalidLength - } - break - default: - return ErrDigestUnsupported - } - - return nil -} - -// Algorithm returns the algorithm portion of the digest. This will panic if -// the underlying digest is not in a valid format. -func (d Digest) Algorithm() Algorithm { - return Algorithm(d[:d.sepIndex()]) -} - -// Hex returns the hex digest portion of the digest. This will panic if the -// underlying digest is not in a valid format. -func (d Digest) Hex() string { - return string(d[d.sepIndex()+1:]) -} - -func (d Digest) String() string { - return string(d) -} - -func (d Digest) sepIndex() int { - i := strings.Index(string(d), ":") - - if i < 0 { - panic("could not find ':' in digest: " + d) - } - - return i -} diff --git a/vendor/github.com/docker/distribution/digest/digester.go b/vendor/github.com/docker/distribution/digest/digester.go deleted file mode 100644 index f3105a45b..000000000 --- a/vendor/github.com/docker/distribution/digest/digester.go +++ /dev/null @@ -1,155 +0,0 @@ -package digest - -import ( - "crypto" - "fmt" - "hash" - "io" -) - -// Algorithm identifies and implementation of a digester by an identifier. -// Note the that this defines both the hash algorithm used and the string -// encoding. -type Algorithm string - -// supported digest types -const ( - SHA256 Algorithm = "sha256" // sha256 with hex encoding - SHA384 Algorithm = "sha384" // sha384 with hex encoding - SHA512 Algorithm = "sha512" // sha512 with hex encoding - - // Canonical is the primary digest algorithm used with the distribution - // project. Other digests may be used but this one is the primary storage - // digest. - Canonical = SHA256 -) - -var ( - // TODO(stevvooe): Follow the pattern of the standard crypto package for - // registration of digests. Effectively, we are a registerable set and - // common symbol access. - - // algorithms maps values to hash.Hash implementations. Other algorithms - // may be available but they cannot be calculated by the digest package. - algorithms = map[Algorithm]crypto.Hash{ - SHA256: crypto.SHA256, - SHA384: crypto.SHA384, - SHA512: crypto.SHA512, - } -) - -// Available returns true if the digest type is available for use. If this -// returns false, New and Hash will return nil. -func (a Algorithm) Available() bool { - h, ok := algorithms[a] - if !ok { - return false - } - - // check availability of the hash, as well - return h.Available() -} - -func (a Algorithm) String() string { - return string(a) -} - -// Size returns number of bytes returned by the hash. -func (a Algorithm) Size() int { - h, ok := algorithms[a] - if !ok { - return 0 - } - return h.Size() -} - -// Set implemented to allow use of Algorithm as a command line flag. -func (a *Algorithm) Set(value string) error { - if value == "" { - *a = Canonical - } else { - // just do a type conversion, support is queried with Available. - *a = Algorithm(value) - } - - return nil -} - -// New returns a new digester for the specified algorithm. If the algorithm -// does not have a digester implementation, nil will be returned. This can be -// checked by calling Available before calling New. -func (a Algorithm) New() Digester { - return &digester{ - alg: a, - hash: a.Hash(), - } -} - -// Hash returns a new hash as used by the algorithm. If not available, the -// method will panic. Check Algorithm.Available() before calling. -func (a Algorithm) Hash() hash.Hash { - if !a.Available() { - // NOTE(stevvooe): A missing hash is usually a programming error that - // must be resolved at compile time. We don't import in the digest - // package to allow users to choose their hash implementation (such as - // when using stevvooe/resumable or a hardware accelerated package). - // - // Applications that may want to resolve the hash at runtime should - // call Algorithm.Available before call Algorithm.Hash(). - panic(fmt.Sprintf("%v not available (make sure it is imported)", a)) - } - - return algorithms[a].New() -} - -// FromReader returns the digest of the reader using the algorithm. -func (a Algorithm) FromReader(rd io.Reader) (Digest, error) { - digester := a.New() - - if _, err := io.Copy(digester.Hash(), rd); err != nil { - return "", err - } - - return digester.Digest(), nil -} - -// FromBytes digests the input and returns a Digest. -func (a Algorithm) FromBytes(p []byte) Digest { - digester := a.New() - - if _, err := digester.Hash().Write(p); err != nil { - // Writes to a Hash should never fail. None of the existing - // hash implementations in the stdlib or hashes vendored - // here can return errors from Write. Having a panic in this - // condition instead of having FromBytes return an error value - // avoids unnecessary error handling paths in all callers. - panic("write to hash function returned error: " + err.Error()) - } - - return digester.Digest() -} - -// TODO(stevvooe): Allow resolution of verifiers using the digest type and -// this registration system. - -// Digester calculates the digest of written data. Writes should go directly -// to the return value of Hash, while calling Digest will return the current -// value of the digest. -type Digester interface { - Hash() hash.Hash // provides direct access to underlying hash instance. - Digest() Digest -} - -// digester provides a simple digester definition that embeds a hasher. -type digester struct { - alg Algorithm - hash hash.Hash -} - -func (d *digester) Hash() hash.Hash { - return d.hash -} - -func (d *digester) Digest() Digest { - return NewDigest(d.alg, d.hash) -} diff --git a/vendor/github.com/docker/distribution/digest/doc.go b/vendor/github.com/docker/distribution/digest/doc.go deleted file mode 100644 index f64b0db32..000000000 --- a/vendor/github.com/docker/distribution/digest/doc.go +++ /dev/null @@ -1,42 +0,0 @@ -// Package digest provides a generalized type to opaquely represent message -// digests and their operations within the registry. The Digest type is -// designed to serve as a flexible identifier in a content-addressable system. -// More importantly, it provides tools and wrappers to work with -// hash.Hash-based digests with little effort. -// -// Basics -// -// The format of a digest is simply a string with two parts, dubbed the -// "algorithm" and the "digest", separated by a colon: -// -// : -// -// An example of a sha256 digest representation follows: -// -// sha256:7173b809ca12ec5dee4506cd86be934c4596dd234ee82c0662eac04a8c2c71dc -// -// In this case, the string "sha256" is the algorithm and the hex bytes are -// the "digest". -// -// Because the Digest type is simply a string, once a valid Digest is -// obtained, comparisons are cheap, quick and simple to express with the -// standard equality operator. -// -// Verification -// -// The main benefit of using the Digest type is simple verification against a -// given digest. The Verifier interface, modeled after the stdlib hash.Hash -// interface, provides a common write sink for digest verification. After -// writing is complete, calling the Verifier.Verified method will indicate -// whether or not the stream of bytes matches the target digest. -// -// Missing Features -// -// In addition to the above, we intend to add the following features to this -// package: -// -// 1. A Digester type that supports write sink digest calculation. -// -// 2. Suspend and resume of ongoing digest calculations to support efficient digest verification in the registry. -// -package digest diff --git a/vendor/github.com/docker/distribution/digest/set.go b/vendor/github.com/docker/distribution/digest/set.go deleted file mode 100644 index 4b9313c1a..000000000 --- a/vendor/github.com/docker/distribution/digest/set.go +++ /dev/null @@ -1,245 +0,0 @@ -package digest - -import ( - "errors" - "sort" - "strings" - "sync" -) - -var ( - // ErrDigestNotFound is used when a matching digest - // could not be found in a set. - ErrDigestNotFound = errors.New("digest not found") - - // ErrDigestAmbiguous is used when multiple digests - // are found in a set. None of the matching digests - // should be considered valid matches. - ErrDigestAmbiguous = errors.New("ambiguous digest string") -) - -// Set is used to hold a unique set of digests which -// may be easily referenced by easily referenced by a string -// representation of the digest as well as short representation. -// The uniqueness of the short representation is based on other -// digests in the set. If digests are omitted from this set, -// collisions in a larger set may not be detected, therefore it -// is important to always do short representation lookups on -// the complete set of digests. To mitigate collisions, an -// appropriately long short code should be used. -type Set struct { - mutex sync.RWMutex - entries digestEntries -} - -// NewSet creates an empty set of digests -// which may have digests added. -func NewSet() *Set { - return &Set{ - entries: digestEntries{}, - } -} - -// checkShortMatch checks whether two digests match as either whole -// values or short values. This function does not test equality, -// rather whether the second value could match against the first -// value. -func checkShortMatch(alg Algorithm, hex, shortAlg, shortHex string) bool { - if len(hex) == len(shortHex) { - if hex != shortHex { - return false - } - if len(shortAlg) > 0 && string(alg) != shortAlg { - return false - } - } else if !strings.HasPrefix(hex, shortHex) { - return false - } else if len(shortAlg) > 0 && string(alg) != shortAlg { - return false - } - return true -} - -// Lookup looks for a digest matching the given string representation. -// If no digests could be found ErrDigestNotFound will be returned -// with an empty digest value. If multiple matches are found -// ErrDigestAmbiguous will be returned with an empty digest value. -func (dst *Set) Lookup(d string) (Digest, error) { - dst.mutex.RLock() - defer dst.mutex.RUnlock() - if len(dst.entries) == 0 { - return "", ErrDigestNotFound - } - var ( - searchFunc func(int) bool - alg Algorithm - hex string - ) - dgst, err := ParseDigest(d) - if err == ErrDigestInvalidFormat { - hex = d - searchFunc = func(i int) bool { - return dst.entries[i].val >= d - } - } else { - hex = dgst.Hex() - alg = dgst.Algorithm() - searchFunc = func(i int) bool { - if dst.entries[i].val == hex { - return dst.entries[i].alg >= alg - } - return dst.entries[i].val >= hex - } - } - idx := sort.Search(len(dst.entries), searchFunc) - if idx == len(dst.entries) || !checkShortMatch(dst.entries[idx].alg, dst.entries[idx].val, string(alg), hex) { - return "", ErrDigestNotFound - } - if dst.entries[idx].alg == alg && dst.entries[idx].val == hex { - return dst.entries[idx].digest, nil - } - if idx+1 < len(dst.entries) && checkShortMatch(dst.entries[idx+1].alg, dst.entries[idx+1].val, string(alg), hex) { - return "", ErrDigestAmbiguous - } - - return dst.entries[idx].digest, nil -} - -// Add adds the given digest to the set. An error will be returned -// if the given digest is invalid. If the digest already exists in the -// set, this operation will be a no-op. -func (dst *Set) Add(d Digest) error { - if err := d.Validate(); err != nil { - return err - } - dst.mutex.Lock() - defer dst.mutex.Unlock() - entry := &digestEntry{alg: d.Algorithm(), val: d.Hex(), digest: d} - searchFunc := func(i int) bool { - if dst.entries[i].val == entry.val { - return dst.entries[i].alg >= entry.alg - } - return dst.entries[i].val >= entry.val - } - idx := sort.Search(len(dst.entries), searchFunc) - if idx == len(dst.entries) { - dst.entries = append(dst.entries, entry) - return nil - } else if dst.entries[idx].digest == d { - return nil - } - - entries := append(dst.entries, nil) - copy(entries[idx+1:], entries[idx:len(entries)-1]) - entries[idx] = entry - dst.entries = entries - return nil -} - -// Remove removes the given digest from the set. An err will be -// returned if the given digest is invalid. If the digest does -// not exist in the set, this operation will be a no-op. -func (dst *Set) Remove(d Digest) error { - if err := d.Validate(); err != nil { - return err - } - dst.mutex.Lock() - defer dst.mutex.Unlock() - entry := &digestEntry{alg: d.Algorithm(), val: d.Hex(), digest: d} - searchFunc := func(i int) bool { - if dst.entries[i].val == entry.val { - return dst.entries[i].alg >= entry.alg - } - return dst.entries[i].val >= entry.val - } - idx := sort.Search(len(dst.entries), searchFunc) - // Not found if idx is after or value at idx is not digest - if idx == len(dst.entries) || dst.entries[idx].digest != d { - return nil - } - - entries := dst.entries - copy(entries[idx:], entries[idx+1:]) - entries = entries[:len(entries)-1] - dst.entries = entries - - return nil -} - -// All returns all the digests in the set -func (dst *Set) All() []Digest { - dst.mutex.RLock() - defer dst.mutex.RUnlock() - retValues := make([]Digest, len(dst.entries)) - for i := range dst.entries { - retValues[i] = dst.entries[i].digest - } - - return retValues -} - -// ShortCodeTable returns a map of Digest to unique short codes. The -// length represents the minimum value, the maximum length may be the -// entire value of digest if uniqueness cannot be achieved without the -// full value. This function will attempt to make short codes as short -// as possible to be unique. -func ShortCodeTable(dst *Set, length int) map[Digest]string { - dst.mutex.RLock() - defer dst.mutex.RUnlock() - m := make(map[Digest]string, len(dst.entries)) - l := length - resetIdx := 0 - for i := 0; i < len(dst.entries); i++ { - var short string - extended := true - for extended { - extended = false - if len(dst.entries[i].val) <= l { - short = dst.entries[i].digest.String() - } else { - short = dst.entries[i].val[:l] - for j := i + 1; j < len(dst.entries); j++ { - if checkShortMatch(dst.entries[j].alg, dst.entries[j].val, "", short) { - if j > resetIdx { - resetIdx = j - } - extended = true - } else { - break - } - } - if extended { - l++ - } - } - } - m[dst.entries[i].digest] = short - if i >= resetIdx { - l = length - } - } - return m -} - -type digestEntry struct { - alg Algorithm - val string - digest Digest -} - -type digestEntries []*digestEntry - -func (d digestEntries) Len() int { - return len(d) -} - -func (d digestEntries) Less(i, j int) bool { - if d[i].val != d[j].val { - return d[i].val < d[j].val - } - return d[i].alg < d[j].alg -} - -func (d digestEntries) Swap(i, j int) { - d[i], d[j] = d[j], d[i] -} diff --git a/vendor/github.com/docker/distribution/digest/verifiers.go b/vendor/github.com/docker/distribution/digest/verifiers.go deleted file mode 100644 index 9af3be134..000000000 --- a/vendor/github.com/docker/distribution/digest/verifiers.go +++ /dev/null @@ -1,44 +0,0 @@ -package digest - -import ( - "hash" - "io" -) - -// Verifier presents a general verification interface to be used with message -// digests and other byte stream verifications. Users instantiate a Verifier -// from one of the various methods, write the data under test to it then check -// the result with the Verified method. -type Verifier interface { - io.Writer - - // Verified will return true if the content written to Verifier matches - // the digest. - Verified() bool -} - -// NewDigestVerifier returns a verifier that compares the written bytes -// against a passed in digest. -func NewDigestVerifier(d Digest) (Verifier, error) { - if err := d.Validate(); err != nil { - return nil, err - } - - return hashVerifier{ - hash: d.Algorithm().Hash(), - digest: d, - }, nil -} - -type hashVerifier struct { - digest Digest - hash hash.Hash -} - -func (hv hashVerifier) Write(p []byte) (n int, err error) { - return hv.hash.Write(p) -} - -func (hv hashVerifier) Verified() bool { - return hv.digest == NewDigest(hv.digest.Algorithm(), hv.hash) -} diff --git a/vendor/github.com/docker/distribution/digestset/set.go b/vendor/github.com/docker/distribution/digestset/set.go new file mode 100644 index 000000000..71327dca7 --- /dev/null +++ b/vendor/github.com/docker/distribution/digestset/set.go @@ -0,0 +1,247 @@ +package digestset + +import ( + "errors" + "sort" + "strings" + "sync" + + digest "github.com/opencontainers/go-digest" +) + +var ( + // ErrDigestNotFound is used when a matching digest + // could not be found in a set. + ErrDigestNotFound = errors.New("digest not found") + + // ErrDigestAmbiguous is used when multiple digests + // are found in a set. None of the matching digests + // should be considered valid matches. + ErrDigestAmbiguous = errors.New("ambiguous digest string") +) + +// Set is used to hold a unique set of digests which +// may be easily referenced by easily referenced by a string +// representation of the digest as well as short representation. +// The uniqueness of the short representation is based on other +// digests in the set. If digests are omitted from this set, +// collisions in a larger set may not be detected, therefore it +// is important to always do short representation lookups on +// the complete set of digests. To mitigate collisions, an +// appropriately long short code should be used. +type Set struct { + mutex sync.RWMutex + entries digestEntries +} + +// NewSet creates an empty set of digests +// which may have digests added. +func NewSet() *Set { + return &Set{ + entries: digestEntries{}, + } +} + +// checkShortMatch checks whether two digests match as either whole +// values or short values. This function does not test equality, +// rather whether the second value could match against the first +// value. +func checkShortMatch(alg digest.Algorithm, hex, shortAlg, shortHex string) bool { + if len(hex) == len(shortHex) { + if hex != shortHex { + return false + } + if len(shortAlg) > 0 && string(alg) != shortAlg { + return false + } + } else if !strings.HasPrefix(hex, shortHex) { + return false + } else if len(shortAlg) > 0 && string(alg) != shortAlg { + return false + } + return true +} + +// Lookup looks for a digest matching the given string representation. +// If no digests could be found ErrDigestNotFound will be returned +// with an empty digest value. If multiple matches are found +// ErrDigestAmbiguous will be returned with an empty digest value. +func (dst *Set) Lookup(d string) (digest.Digest, error) { + dst.mutex.RLock() + defer dst.mutex.RUnlock() + if len(dst.entries) == 0 { + return "", ErrDigestNotFound + } + var ( + searchFunc func(int) bool + alg digest.Algorithm + hex string + ) + dgst, err := digest.Parse(d) + if err == digest.ErrDigestInvalidFormat { + hex = d + searchFunc = func(i int) bool { + return dst.entries[i].val >= d + } + } else { + hex = dgst.Hex() + alg = dgst.Algorithm() + searchFunc = func(i int) bool { + if dst.entries[i].val == hex { + return dst.entries[i].alg >= alg + } + return dst.entries[i].val >= hex + } + } + idx := sort.Search(len(dst.entries), searchFunc) + if idx == len(dst.entries) || !checkShortMatch(dst.entries[idx].alg, dst.entries[idx].val, string(alg), hex) { + return "", ErrDigestNotFound + } + if dst.entries[idx].alg == alg && dst.entries[idx].val == hex { + return dst.entries[idx].digest, nil + } + if idx+1 < len(dst.entries) && checkShortMatch(dst.entries[idx+1].alg, dst.entries[idx+1].val, string(alg), hex) { + return "", ErrDigestAmbiguous + } + + return dst.entries[idx].digest, nil +} + +// Add adds the given digest to the set. An error will be returned +// if the given digest is invalid. If the digest already exists in the +// set, this operation will be a no-op. +func (dst *Set) Add(d digest.Digest) error { + if err := d.Validate(); err != nil { + return err + } + dst.mutex.Lock() + defer dst.mutex.Unlock() + entry := &digestEntry{alg: d.Algorithm(), val: d.Hex(), digest: d} + searchFunc := func(i int) bool { + if dst.entries[i].val == entry.val { + return dst.entries[i].alg >= entry.alg + } + return dst.entries[i].val >= entry.val + } + idx := sort.Search(len(dst.entries), searchFunc) + if idx == len(dst.entries) { + dst.entries = append(dst.entries, entry) + return nil + } else if dst.entries[idx].digest == d { + return nil + } + + entries := append(dst.entries, nil) + copy(entries[idx+1:], entries[idx:len(entries)-1]) + entries[idx] = entry + dst.entries = entries + return nil +} + +// Remove removes the given digest from the set. An err will be +// returned if the given digest is invalid. If the digest does +// not exist in the set, this operation will be a no-op. +func (dst *Set) Remove(d digest.Digest) error { + if err := d.Validate(); err != nil { + return err + } + dst.mutex.Lock() + defer dst.mutex.Unlock() + entry := &digestEntry{alg: d.Algorithm(), val: d.Hex(), digest: d} + searchFunc := func(i int) bool { + if dst.entries[i].val == entry.val { + return dst.entries[i].alg >= entry.alg + } + return dst.entries[i].val >= entry.val + } + idx := sort.Search(len(dst.entries), searchFunc) + // Not found if idx is after or value at idx is not digest + if idx == len(dst.entries) || dst.entries[idx].digest != d { + return nil + } + + entries := dst.entries + copy(entries[idx:], entries[idx+1:]) + entries = entries[:len(entries)-1] + dst.entries = entries + + return nil +} + +// All returns all the digests in the set +func (dst *Set) All() []digest.Digest { + dst.mutex.RLock() + defer dst.mutex.RUnlock() + retValues := make([]digest.Digest, len(dst.entries)) + for i := range dst.entries { + retValues[i] = dst.entries[i].digest + } + + return retValues +} + +// ShortCodeTable returns a map of Digest to unique short codes. The +// length represents the minimum value, the maximum length may be the +// entire value of digest if uniqueness cannot be achieved without the +// full value. This function will attempt to make short codes as short +// as possible to be unique. +func ShortCodeTable(dst *Set, length int) map[digest.Digest]string { + dst.mutex.RLock() + defer dst.mutex.RUnlock() + m := make(map[digest.Digest]string, len(dst.entries)) + l := length + resetIdx := 0 + for i := 0; i < len(dst.entries); i++ { + var short string + extended := true + for extended { + extended = false + if len(dst.entries[i].val) <= l { + short = dst.entries[i].digest.String() + } else { + short = dst.entries[i].val[:l] + for j := i + 1; j < len(dst.entries); j++ { + if checkShortMatch(dst.entries[j].alg, dst.entries[j].val, "", short) { + if j > resetIdx { + resetIdx = j + } + extended = true + } else { + break + } + } + if extended { + l++ + } + } + } + m[dst.entries[i].digest] = short + if i >= resetIdx { + l = length + } + } + return m +} + +type digestEntry struct { + alg digest.Algorithm + val string + digest digest.Digest +} + +type digestEntries []*digestEntry + +func (d digestEntries) Len() int { + return len(d) +} + +func (d digestEntries) Less(i, j int) bool { + if d[i].val != d[j].val { + return d[i].val < d[j].val + } + return d[i].alg < d[j].alg +} + +func (d digestEntries) Swap(i, j int) { + d[i], d[j] = d[j], d[i] +} diff --git a/vendor/github.com/docker/distribution/reference/helpers.go b/vendor/github.com/docker/distribution/reference/helpers.go new file mode 100644 index 000000000..978df7eab --- /dev/null +++ b/vendor/github.com/docker/distribution/reference/helpers.go @@ -0,0 +1,42 @@ +package reference + +import "path" + +// IsNameOnly returns true if reference only contains a repo name. +func IsNameOnly(ref Named) bool { + if _, ok := ref.(NamedTagged); ok { + return false + } + if _, ok := ref.(Canonical); ok { + return false + } + return true +} + +// FamiliarName returns the familiar name string +// for the given named, familiarizing if needed. +func FamiliarName(ref Named) string { + if nn, ok := ref.(normalizedNamed); ok { + return nn.Familiar().Name() + } + return ref.Name() +} + +// FamiliarString returns the familiar string representation +// for the given reference, familiarizing if needed. +func FamiliarString(ref Reference) string { + if nn, ok := ref.(normalizedNamed); ok { + return nn.Familiar().String() + } + return ref.String() +} + +// FamiliarMatch reports whether ref matches the specified pattern. +// See https://godoc.org/path#Match for supported patterns. +func FamiliarMatch(pattern string, ref Reference) (bool, error) { + matched, err := path.Match(pattern, FamiliarString(ref)) + if namedRef, isNamed := ref.(Named); isNamed && !matched { + matched, _ = path.Match(pattern, FamiliarName(namedRef)) + } + return matched, err +} diff --git a/vendor/github.com/docker/distribution/reference/normalize.go b/vendor/github.com/docker/distribution/reference/normalize.go new file mode 100644 index 000000000..2d71fc5e9 --- /dev/null +++ b/vendor/github.com/docker/distribution/reference/normalize.go @@ -0,0 +1,170 @@ +package reference + +import ( + "errors" + "fmt" + "strings" + + "github.com/docker/distribution/digestset" + "github.com/opencontainers/go-digest" +) + +var ( + legacyDefaultDomain = "index.docker.io" + defaultDomain = "docker.io" + officialRepoName = "library" + defaultTag = "latest" +) + +// normalizedNamed represents a name which has been +// normalized and has a familiar form. A familiar name +// is what is used in Docker UI. An example normalized +// name is "docker.io/library/ubuntu" and corresponding +// familiar name of "ubuntu". +type normalizedNamed interface { + Named + Familiar() Named +} + +// ParseNormalizedNamed parses a string into a named reference +// transforming a familiar name from Docker UI to a fully +// qualified reference. If the value may be an identifier +// use ParseAnyReference. +func ParseNormalizedNamed(s string) (Named, error) { + if ok := anchoredIdentifierRegexp.MatchString(s); ok { + return nil, fmt.Errorf("invalid repository name (%s), cannot specify 64-byte hexadecimal strings", s) + } + domain, remainder := splitDockerDomain(s) + var remoteName string + if tagSep := strings.IndexRune(remainder, ':'); tagSep > -1 { + remoteName = remainder[:tagSep] + } else { + remoteName = remainder + } + if strings.ToLower(remoteName) != remoteName { + return nil, errors.New("invalid reference format: repository name must be lowercase") + } + + ref, err := Parse(domain + "/" + remainder) + if err != nil { + return nil, err + } + named, isNamed := ref.(Named) + if !isNamed { + return nil, fmt.Errorf("reference %s has no name", ref.String()) + } + return named, nil +} + +// splitDockerDomain splits a repository name to domain and remotename string. +// If no valid domain is found, the default domain is used. Repository name +// needs to be already validated before. +func splitDockerDomain(name string) (domain, remainder string) { + i := strings.IndexRune(name, '/') + if i == -1 || (!strings.ContainsAny(name[:i], ".:") && name[:i] != "localhost") { + domain, remainder = defaultDomain, name + } else { + domain, remainder = name[:i], name[i+1:] + } + if domain == legacyDefaultDomain { + domain = defaultDomain + } + if domain == defaultDomain && !strings.ContainsRune(remainder, '/') { + remainder = officialRepoName + "/" + remainder + } + return +} + +// familiarizeName returns a shortened version of the name familiar +// to to the Docker UI. Familiar names have the default domain +// "docker.io" and "library/" repository prefix removed. +// For example, "docker.io/library/redis" will have the familiar +// name "redis" and "docker.io/dmcgowan/myapp" will be "dmcgowan/myapp". +// Returns a familiarized named only reference. +func familiarizeName(named namedRepository) repository { + repo := repository{ + domain: named.Domain(), + path: named.Path(), + } + + if repo.domain == defaultDomain { + repo.domain = "" + // Handle official repositories which have the pattern "library/" + if split := strings.Split(repo.path, "/"); len(split) == 2 && split[0] == officialRepoName { + repo.path = split[1] + } + } + return repo +} + +func (r reference) Familiar() Named { + return reference{ + namedRepository: familiarizeName(r.namedRepository), + tag: r.tag, + digest: r.digest, + } +} + +func (r repository) Familiar() Named { + return familiarizeName(r) +} + +func (t taggedReference) Familiar() Named { + return taggedReference{ + namedRepository: familiarizeName(t.namedRepository), + tag: t.tag, + } +} + +func (c canonicalReference) Familiar() Named { + return canonicalReference{ + namedRepository: familiarizeName(c.namedRepository), + digest: c.digest, + } +} + +// TagNameOnly adds the default tag "latest" to a reference if it only has +// a repo name. +func TagNameOnly(ref Named) Named { + if IsNameOnly(ref) { + namedTagged, err := WithTag(ref, defaultTag) + if err != nil { + // Default tag must be valid, to create a NamedTagged + // type with non-validated input the WithTag function + // should be used instead + panic(err) + } + return namedTagged + } + return ref +} + +// ParseAnyReference parses a reference string as a possible identifier, +// full digest, or familiar name. +func ParseAnyReference(ref string) (Reference, error) { + if ok := anchoredIdentifierRegexp.MatchString(ref); ok { + return digestReference("sha256:" + ref), nil + } + if dgst, err := digest.Parse(ref); err == nil { + return digestReference(dgst), nil + } + + return ParseNormalizedNamed(ref) +} + +// ParseAnyReferenceWithSet parses a reference string as a possible short +// identifier to be matched in a digest set, a full digest, or familiar name. +func ParseAnyReferenceWithSet(ref string, ds *digestset.Set) (Reference, error) { + if ok := anchoredShortIdentifierRegexp.MatchString(ref); ok { + dgst, err := ds.Lookup(ref) + if err == nil { + return digestReference(dgst), nil + } + } else { + if dgst, err := digest.Parse(ref); err == nil { + return digestReference(dgst), nil + } + } + + return ParseNormalizedNamed(ref) +} diff --git a/vendor/github.com/docker/distribution/reference/reference.go b/vendor/github.com/docker/distribution/reference/reference.go index 02786628e..2f66cca87 100644 --- a/vendor/github.com/docker/distribution/reference/reference.go +++ b/vendor/github.com/docker/distribution/reference/reference.go @@ -4,30 +4,32 @@ // Grammar // // reference := name [ ":" tag ] [ "@" digest ] -// name := [hostname '/'] component ['/' component]* -// hostname := hostcomponent ['.' hostcomponent]* [':' port-number] -// hostcomponent := /([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])/ +// name := [domain '/'] path-component ['/' path-component]* +// domain := domain-component ['.' domain-component]* [':' port-number] +// domain-component := /([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])/ // port-number := /[0-9]+/ -// component := alpha-numeric [separator alpha-numeric]* +// path-component := alpha-numeric [separator alpha-numeric]* // alpha-numeric := /[a-z0-9]+/ // separator := /[_.]|__|[-]*/ // // tag := /[\w][\w.-]{0,127}/ // // digest := digest-algorithm ":" digest-hex -// digest-algorithm := digest-algorithm-component [ digest-algorithm-separator digest-algorithm-component ] +// digest-algorithm := digest-algorithm-component [ digest-algorithm-separator digest-algorithm-component ]* // digest-algorithm-separator := /[+.-_]/ // digest-algorithm-component := /[A-Za-z][A-Za-z0-9]*/ // digest-hex := /[0-9a-fA-F]{32,}/ ; At least 128 bit digest value +// +// identifier := /[a-f0-9]{64}/ +// short-identifier := /[a-f0-9]{6,64}/ package reference import ( "errors" "fmt" - "path" "strings" - "github.com/docker/distribution/digest" + "github.com/opencontainers/go-digest" ) const ( @@ -53,6 +55,9 @@ var ( // ErrNameTooLong is returned when a repository name is longer than NameTotalLengthMax. ErrNameTooLong = fmt.Errorf("repository name must not be more than %v characters", NameTotalLengthMax) + + // ErrNameNotCanonical is returned when a name is not canonical. + ErrNameNotCanonical = errors.New("repository name must be canonical") ) // Reference is an opaque object reference identifier that may include @@ -126,23 +131,56 @@ type Digested interface { } // Canonical reference is an object with a fully unique -// name including a name with hostname and digest +// name including a name with domain and digest type Canonical interface { Named Digest() digest.Digest } +// namedRepository is a reference to a repository with a name. +// A namedRepository has both domain and path components. +type namedRepository interface { + Named + Domain() string + Path() string +} + +// Domain returns the domain part of the Named reference +func Domain(named Named) string { + if r, ok := named.(namedRepository); ok { + return r.Domain() + } + domain, _ := splitDomain(named.Name()) + return domain +} + +// Path returns the name without the domain part of the Named reference +func Path(named Named) (name string) { + if r, ok := named.(namedRepository); ok { + return r.Path() + } + _, path := splitDomain(named.Name()) + return path +} + +func splitDomain(name string) (string, string) { + match := anchoredNameRegexp.FindStringSubmatch(name) + if len(match) != 3 { + return "", name + } + return match[1], match[2] +} + // SplitHostname splits a named reference into a // hostname and name string. If no valid hostname is // found, the hostname is empty and the full value // is returned as name +// DEPRECATED: Use Domain or Path func SplitHostname(named Named) (string, string) { - name := named.Name() - match := anchoredNameRegexp.FindStringSubmatch(name) - if len(match) != 3 { - return "", name + if r, ok := named.(namedRepository); ok { + return r.Domain(), r.Path() } - return match[1], match[2] + return splitDomain(named.Name()) } // Parse parses s and returns a syntactically valid Reference. @@ -164,13 +202,24 @@ func Parse(s string) (Reference, error) { return nil, ErrNameTooLong } + var repo repository + + nameMatch := anchoredNameRegexp.FindStringSubmatch(matches[1]) + if nameMatch != nil && len(nameMatch) == 3 { + repo.domain = nameMatch[1] + repo.path = nameMatch[2] + } else { + repo.domain = "" + repo.path = matches[1] + } + ref := reference{ - name: matches[1], - tag: matches[2], + namedRepository: repo, + tag: matches[2], } if matches[3] != "" { var err error - ref.digest, err = digest.ParseDigest(matches[3]) + ref.digest, err = digest.Parse(matches[3]) if err != nil { return nil, err } @@ -185,18 +234,17 @@ func Parse(s string) (Reference, error) { } // ParseNamed parses s and returns a syntactically valid reference implementing -// the Named interface. The reference must have a name, otherwise an error is -// returned. +// the Named interface. The reference must have a name and be in the canonical +// form, otherwise an error is returned. // If an error was encountered it is returned, along with a nil Reference. // NOTE: ParseNamed will not handle short digests. func ParseNamed(s string) (Named, error) { - ref, err := Parse(s) + named, err := ParseNormalizedNamed(s) if err != nil { return nil, err } - named, isNamed := ref.(Named) - if !isNamed { - return nil, fmt.Errorf("reference %s has no name", ref.String()) + if named.String() != s { + return nil, ErrNameNotCanonical } return named, nil } @@ -207,10 +255,15 @@ func WithName(name string) (Named, error) { if len(name) > NameTotalLengthMax { return nil, ErrNameTooLong } - if !anchoredNameRegexp.MatchString(name) { + + match := anchoredNameRegexp.FindStringSubmatch(name) + if match == nil || len(match) != 3 { return nil, ErrReferenceInvalidFormat } - return repository(name), nil + return repository{ + domain: match[1], + path: match[2], + }, nil } // WithTag combines the name from "name" and the tag from "tag" to form a @@ -219,16 +272,23 @@ func WithTag(name Named, tag string) (NamedTagged, error) { if !anchoredTagRegexp.MatchString(tag) { return nil, ErrTagInvalidFormat } + var repo repository + if r, ok := name.(namedRepository); ok { + repo.domain = r.Domain() + repo.path = r.Path() + } else { + repo.path = name.Name() + } if canonical, ok := name.(Canonical); ok { return reference{ - name: name.Name(), - tag: tag, - digest: canonical.Digest(), + namedRepository: repo, + tag: tag, + digest: canonical.Digest(), }, nil } return taggedReference{ - name: name.Name(), - tag: tag, + namedRepository: repo, + tag: tag, }, nil } @@ -238,36 +298,37 @@ func WithDigest(name Named, digest digest.Digest) (Canonical, error) { if !anchoredDigestRegexp.MatchString(digest.String()) { return nil, ErrDigestInvalidFormat } + var repo repository + if r, ok := name.(namedRepository); ok { + repo.domain = r.Domain() + repo.path = r.Path() + } else { + repo.path = name.Name() + } if tagged, ok := name.(Tagged); ok { return reference{ - name: name.Name(), - tag: tagged.Tag(), - digest: digest, + namedRepository: repo, + tag: tagged.Tag(), + digest: digest, }, nil } return canonicalReference{ - name: name.Name(), - digest: digest, + namedRepository: repo, + digest: digest, }, nil } -// Match reports whether ref matches the specified pattern. -// See https://godoc.org/path#Match for supported patterns. -func Match(pattern string, ref Reference) (bool, error) { - matched, err := path.Match(pattern, ref.String()) - if namedRef, isNamed := ref.(Named); isNamed && !matched { - matched, _ = path.Match(pattern, namedRef.Name()) - } - return matched, err -} - // TrimNamed removes any tag or digest from the named reference. func TrimNamed(ref Named) Named { - return repository(ref.Name()) + domain, path := SplitHostname(ref) + return repository{ + domain: domain, + path: path, + } } func getBestReferenceType(ref reference) Reference { - if ref.name == "" { + if ref.Name() == "" { // Allow digest only references if ref.digest != "" { return digestReference(ref.digest) @@ -277,16 +338,16 @@ func getBestReferenceType(ref reference) Reference { if ref.tag == "" { if ref.digest != "" { return canonicalReference{ - name: ref.name, - digest: ref.digest, + namedRepository: ref.namedRepository, + digest: ref.digest, } } - return repository(ref.name) + return ref.namedRepository } if ref.digest == "" { return taggedReference{ - name: ref.name, - tag: ref.tag, + namedRepository: ref.namedRepository, + tag: ref.tag, } } @@ -294,17 +355,13 @@ func getBestReferenceType(ref reference) Reference { } type reference struct { - name string + namedRepository tag string digest digest.Digest } func (r reference) String() string { - return r.name + ":" + r.tag + "@" + r.digest.String() -} - -func (r reference) Name() string { - return r.name + return r.Name() + ":" + r.tag + "@" + r.digest.String() } func (r reference) Tag() string { @@ -315,20 +372,34 @@ func (r reference) Digest() digest.Digest { return r.digest } -type repository string +type repository struct { + domain string + path string +} func (r repository) String() string { - return string(r) + return r.Name() } func (r repository) Name() string { - return string(r) + if r.domain == "" { + return r.path + } + return r.domain + "/" + r.path +} + +func (r repository) Domain() string { + return r.domain +} + +func (r repository) Path() string { + return r.path } type digestReference digest.Digest func (d digestReference) String() string { - return d.String() + return digest.Digest(d).String() } func (d digestReference) Digest() digest.Digest { @@ -336,16 +407,12 @@ func (d digestReference) Digest() digest.Digest { } type taggedReference struct { - name string - tag string + namedRepository + tag string } func (t taggedReference) String() string { - return t.name + ":" + t.tag -} - -func (t taggedReference) Name() string { - return t.name + return t.Name() + ":" + t.tag } func (t taggedReference) Tag() string { @@ -353,16 +420,12 @@ func (t taggedReference) Tag() string { } type canonicalReference struct { - name string + namedRepository digest digest.Digest } func (c canonicalReference) String() string { - return c.name + "@" + c.digest.String() -} - -func (c canonicalReference) Name() string { - return c.name + return c.Name() + "@" + c.digest.String() } func (c canonicalReference) Digest() digest.Digest { diff --git a/vendor/github.com/docker/distribution/reference/regexp.go b/vendor/github.com/docker/distribution/reference/regexp.go index 9a7d366bc..786034932 100644 --- a/vendor/github.com/docker/distribution/reference/regexp.go +++ b/vendor/github.com/docker/distribution/reference/regexp.go @@ -19,18 +19,18 @@ var ( alphaNumericRegexp, optional(repeated(separatorRegexp, alphaNumericRegexp))) - // hostnameComponentRegexp restricts the registry hostname component of a - // repository name to start with a component as defined by hostnameRegexp + // domainComponentRegexp restricts the registry domain component of a + // repository name to start with a component as defined by DomainRegexp // and followed by an optional port. - hostnameComponentRegexp = match(`(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])`) + domainComponentRegexp = match(`(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])`) - // hostnameRegexp defines the structure of potential hostname components + // DomainRegexp defines the structure of potential domain components // that may be part of image names. This is purposely a subset of what is // allowed by DNS to ensure backwards compatibility with Docker image // names. - hostnameRegexp = expression( - hostnameComponentRegexp, - optional(repeated(literal(`.`), hostnameComponentRegexp)), + DomainRegexp = expression( + domainComponentRegexp, + optional(repeated(literal(`.`), domainComponentRegexp)), optional(literal(`:`), match(`[0-9]+`))) // TagRegexp matches valid tag names. From docker/docker:graph/tags.go. @@ -48,17 +48,17 @@ var ( anchoredDigestRegexp = anchored(DigestRegexp) // NameRegexp is the format for the name component of references. The - // regexp has capturing groups for the hostname and name part omitting + // regexp has capturing groups for the domain and name part omitting // the separating forward slash from either. NameRegexp = expression( - optional(hostnameRegexp, literal(`/`)), + optional(DomainRegexp, literal(`/`)), nameComponentRegexp, optional(repeated(literal(`/`), nameComponentRegexp))) // anchoredNameRegexp is used to parse a name value, capturing the - // hostname and trailing components. + // domain and trailing components. anchoredNameRegexp = anchored( - optional(capture(hostnameRegexp), literal(`/`)), + optional(capture(DomainRegexp), literal(`/`)), capture(nameComponentRegexp, optional(repeated(literal(`/`), nameComponentRegexp)))) @@ -68,6 +68,25 @@ var ( ReferenceRegexp = anchored(capture(NameRegexp), optional(literal(":"), capture(TagRegexp)), optional(literal("@"), capture(DigestRegexp))) + + // IdentifierRegexp is the format for string identifier used as a + // content addressable identifier using sha256. These identifiers + // are like digests without the algorithm, since sha256 is used. + IdentifierRegexp = match(`([a-f0-9]{64})`) + + // ShortIdentifierRegexp is the format used to represent a prefix + // of an identifier. A prefix may be used to match a sha256 identifier + // within a list of trusted identifiers. + ShortIdentifierRegexp = match(`([a-f0-9]{6,64})`) + + // anchoredIdentifierRegexp is used to check or match an + // identifier value, anchored at start and end of string. + anchoredIdentifierRegexp = anchored(IdentifierRegexp) + + // anchoredShortIdentifierRegexp is used to check if a value + // is a possible identifier prefix, anchored at start and end + // of string. + anchoredShortIdentifierRegexp = anchored(ShortIdentifierRegexp) ) // match compiles the string to a regular expression. diff --git a/vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/LICENSE b/vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/LICENSE deleted file mode 100644 index d511905c1..000000000 --- a/vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/LICENSE +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/LICENSE b/vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/LICENSE deleted file mode 100644 index d511905c1..000000000 --- a/vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/LICENSE +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/LICENSE b/vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/LICENSE deleted file mode 100644 index 5b6e7c66c..000000000 --- a/vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/LICENSE +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/vendor/github.com/docker/docker/contrib/syntax/vim/LICENSE b/vendor/github.com/docker/docker/contrib/syntax/vim/LICENSE deleted file mode 100644 index e67cdabd2..000000000 --- a/vendor/github.com/docker/docker/contrib/syntax/vim/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2013 Honza Pokorny -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/docker/docker/docs/static_files/contributors.png b/vendor/github.com/docker/docker/docs/static_files/contributors.png deleted file mode 100644 index 63c0a0c09..000000000 Binary files a/vendor/github.com/docker/docker/docs/static_files/contributors.png and /dev/null differ diff --git a/vendor/github.com/docker/docker/hack/generate-authors.sh b/vendor/github.com/docker/docker/hack/generate-authors.sh deleted file mode 100755 index e78a97f96..000000000 --- a/vendor/github.com/docker/docker/hack/generate-authors.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -set -e - -cd "$(dirname "$(readlink -f "$BASH_SOURCE")")/.." - -# see also ".mailmap" for how email addresses and names are deduplicated - -{ - cat <<-'EOH' - # This file lists all individuals having contributed content to the repository. - # For how it is generated, see `hack/generate-authors.sh`. - EOH - echo - git log --format='%aN <%aE>' | LC_ALL=C.UTF-8 sort -uf -} > AUTHORS diff --git a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.default b/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.default deleted file mode 120000 index 4278533d6..000000000 --- a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.default +++ /dev/null @@ -1 +0,0 @@ -../../../contrib/init/sysvinit-debian/docker.default \ No newline at end of file diff --git a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.init b/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.init deleted file mode 120000 index 8cb89d30d..000000000 --- a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.init +++ /dev/null @@ -1 +0,0 @@ -../../../contrib/init/sysvinit-debian/docker \ No newline at end of file diff --git a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.upstart b/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.upstart deleted file mode 120000 index 7e1b64a3e..000000000 --- a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.upstart +++ /dev/null @@ -1 +0,0 @@ -../../../contrib/init/upstart/docker.conf \ No newline at end of file diff --git a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.udev b/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.udev deleted file mode 120000 index 914a36195..000000000 --- a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.udev +++ /dev/null @@ -1 +0,0 @@ -../../../contrib/udev/80-docker.rules \ No newline at end of file diff --git a/vendor/github.com/docker/docker/pkg/symlink/LICENSE.APACHE b/vendor/github.com/docker/docker/pkg/symlink/LICENSE.APACHE deleted file mode 100644 index 34c4ea7c5..000000000 --- a/vendor/github.com/docker/docker/pkg/symlink/LICENSE.APACHE +++ /dev/null @@ -1,191 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - Copyright 2014-2016 Docker, Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/docker/docker/pkg/symlink/LICENSE.BSD b/vendor/github.com/docker/docker/pkg/symlink/LICENSE.BSD deleted file mode 100644 index 9b4f4a294..000000000 --- a/vendor/github.com/docker/docker/pkg/symlink/LICENSE.BSD +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2014-2016 The Docker & Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/docker/docker/project/CONTRIBUTORS.md b/vendor/github.com/docker/docker/project/CONTRIBUTORS.md deleted file mode 120000 index 44fcc6343..000000000 --- a/vendor/github.com/docker/docker/project/CONTRIBUTORS.md +++ /dev/null @@ -1 +0,0 @@ -../CONTRIBUTING.md \ No newline at end of file diff --git a/vendor/github.com/docker/go-units/MAINTAINERS b/vendor/github.com/docker/go-units/MAINTAINERS index 9b3b6b101..4aac7c741 100644 --- a/vendor/github.com/docker/go-units/MAINTAINERS +++ b/vendor/github.com/docker/go-units/MAINTAINERS @@ -27,7 +27,7 @@ [people.akihirosuda] Name = "Akihiro Suda" - Email = "suda.akihiro@lab.ntt.co.jp" + Email = "akihiro.suda.cz@hco.ntt.co.jp" GitHub = "AkihiroSuda" [people.dnephin] diff --git a/vendor/github.com/docker/go-units/circle.yml b/vendor/github.com/docker/go-units/circle.yml index 9043b3547..af9d60552 100644 --- a/vendor/github.com/docker/go-units/circle.yml +++ b/vendor/github.com/docker/go-units/circle.yml @@ -1,7 +1,7 @@ dependencies: post: # install golint - - go get github.com/golang/lint/golint + - go get golang.org/x/lint/golint test: pre: diff --git a/vendor/github.com/docker/go-units/duration.go b/vendor/github.com/docker/go-units/duration.go index ba02af26d..48dd8744d 100644 --- a/vendor/github.com/docker/go-units/duration.go +++ b/vendor/github.com/docker/go-units/duration.go @@ -18,7 +18,7 @@ func HumanDuration(d time.Duration) string { return fmt.Sprintf("%d seconds", seconds) } else if minutes := int(d.Minutes()); minutes == 1 { return "About a minute" - } else if minutes < 46 { + } else if minutes < 60 { return fmt.Sprintf("%d minutes", minutes) } else if hours := int(d.Hours() + 0.5); hours == 1 { return "About an hour" diff --git a/vendor/github.com/docker/go-units/ulimit.go b/vendor/github.com/docker/go-units/ulimit.go index 5ac7fd825..fca0400cc 100644 --- a/vendor/github.com/docker/go-units/ulimit.go +++ b/vendor/github.com/docker/go-units/ulimit.go @@ -96,8 +96,13 @@ func ParseUlimit(val string) (*Ulimit, error) { return nil, fmt.Errorf("too many limit value arguments - %s, can only have up to two, `soft[:hard]`", parts[1]) } - if soft > *hard { - return nil, fmt.Errorf("ulimit soft limit must be less than or equal to hard limit: %d > %d", soft, *hard) + if *hard != -1 { + if soft == -1 { + return nil, fmt.Errorf("ulimit soft limit must be less than or equal to hard limit: soft: -1 (unlimited), hard: %d", *hard) + } + if soft > *hard { + return nil, fmt.Errorf("ulimit soft limit must be less than or equal to hard limit: %d > %d", soft, *hard) + } } return &Ulimit{Name: parts[0], Soft: soft, Hard: *hard}, nil diff --git a/vendor/github.com/dsnet/compress/bzip2/internal/sais/sais_gen.go b/vendor/github.com/dsnet/compress/bzip2/internal/sais/sais_gen.go deleted file mode 100644 index 26bf628e1..000000000 --- a/vendor/github.com/dsnet/compress/bzip2/internal/sais/sais_gen.go +++ /dev/null @@ -1,703 +0,0 @@ -// Copyright 2017, Joe Tsai. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -// +build ignore - -package main - -import ( - "bytes" - "go/format" - "io/ioutil" - "log" - "os" - "text/template" -) - -func main() { - if len(os.Args) != 3 { - log.Fatalf("Usage: %s GO_TYPE OUTPUT_FILE", os.Args[0]) - } - typ := os.Args[1] - path := os.Args[2] - - b := new(bytes.Buffer) - t := template.Must(template.New("source").Parse(source)) - if err := t.Execute(b, struct { - Type, GeneratedMessage string - }{typ, "// Code generated by sais_gen.go. DO NOT EDIT."}); err != nil { - log.Fatalf("Template.Execute error: %v", err) - } - out, err := format.Source(bytes.TrimSpace(b.Bytes())) - if err != nil { - log.Fatalf("format.Source error: %v", err) - } - if err := ioutil.WriteFile(path, out, 0644); err != nil { - log.Fatalf("ioutil.WriteFile error: %v", err) - } -} - -const source = ` -// Copyright 2015, Joe Tsai. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -{{.GeneratedMessage}} - -// ==================================================== -// Copyright (c) 2008-2010 Yuta Mori All Rights Reserved. -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. -// ==================================================== - -package sais - -func getCounts_{{.Type}}(T []{{.Type}}, C []int, n, k int) { - var i int - for i = 0; i < k; i++ { - C[i] = 0 - } - for i = 0; i < n; i++ { - C[T[i]]++ - } -} - -func getBuckets_{{.Type}}(C, B []int, k int, end bool) { - var i, sum int - if end { - for i = 0; i < k; i++ { - sum += C[i] - B[i] = sum - } - } else { - for i = 0; i < k; i++ { - sum += C[i] - B[i] = sum - C[i] - } - } -} - -func sortLMS1_{{.Type}}(T []{{.Type}}, SA, C, B []int, n, k int) { - var b, i, j int - var c0, c1 int - - // Compute SAl. - if &C[0] == &B[0] { - getCounts_{{.Type}}(T, C, n, k) - } - getBuckets_{{.Type}}(C, B, k, false) // Find starts of buckets - j = n - 1 - c1 = int(T[j]) - b = B[c1] - j-- - if int(T[j]) < c1 { - SA[b] = ^j - } else { - SA[b] = j - } - b++ - for i = 0; i < n; i++ { - if j = SA[i]; j > 0 { - if c0 = int(T[j]); c0 != c1 { - B[c1] = b - c1 = c0 - b = B[c1] - } - j-- - if int(T[j]) < c1 { - SA[b] = ^j - } else { - SA[b] = j - } - b++ - SA[i] = 0 - } else if j < 0 { - SA[i] = ^j - } - } - - // Compute SAs. - if &C[0] == &B[0] { - getCounts_{{.Type}}(T, C, n, k) - } - getBuckets_{{.Type}}(C, B, k, true) // Find ends of buckets - c1 = 0 - b = B[c1] - for i = n - 1; i >= 0; i-- { - if j = SA[i]; j > 0 { - if c0 = int(T[j]); c0 != c1 { - B[c1] = b - c1 = c0 - b = B[c1] - } - j-- - b-- - if int(T[j]) > c1 { - SA[b] = ^(j + 1) - } else { - SA[b] = j - } - SA[i] = 0 - } - } -} - -func postProcLMS1_{{.Type}}(T []{{.Type}}, SA []int, n, m int) int { - var i, j, p, q, plen, qlen, name int - var c0, c1 int - var diff bool - - // Compact all the sorted substrings into the first m items of SA. - // 2*m must be not larger than n (provable). - for i = 0; SA[i] < 0; i++ { - SA[i] = ^SA[i] - } - if i < m { - for j, i = i, i+1; ; i++ { - if p = SA[i]; p < 0 { - SA[j] = ^p - j++ - SA[i] = 0 - if j == m { - break - } - } - } - } - - // Store the length of all substrings. - i = n - 1 - j = n - 1 - c0 = int(T[n-1]) - for { - c1 = c0 - if i--; i < 0 { - break - } - if c0 = int(T[i]); c0 < c1 { - break - } - } - for i >= 0 { - for { - c1 = c0 - if i--; i < 0 { - break - } - if c0 = int(T[i]); c0 > c1 { - break - } - } - if i >= 0 { - SA[m+((i+1)>>1)] = j - i - j = i + 1 - for { - c1 = c0 - if i--; i < 0 { - break - } - if c0 = int(T[i]); c0 < c1 { - break - } - } - } - } - - // Find the lexicographic names of all substrings. - name = 0 - qlen = 0 - for i, q = 0, n; i < m; i++ { - p = SA[i] - plen = SA[m+(p>>1)] - diff = true - if (plen == qlen) && ((q + plen) < n) { - for j = 0; (j < plen) && (T[p+j] == T[q+j]); j++ { - } - if j == plen { - diff = false - } - } - if diff { - name++ - q = p - qlen = plen - } - SA[m+(p>>1)] = name - } - return name -} - -func sortLMS2_{{.Type}}(T []{{.Type}}, SA, C, B, D []int, n, k int) { - var b, i, j, t, d int - var c0, c1 int - - // Compute SAl. - getBuckets_{{.Type}}(C, B, k, false) // Find starts of buckets - j = n - 1 - c1 = int(T[j]) - b = B[c1] - j-- - if int(T[j]) < c1 { - t = 1 - } else { - t = 0 - } - j += n - if t&1 > 0 { - SA[b] = ^j - } else { - SA[b] = j - } - b++ - for i, d = 0, 0; i < n; i++ { - if j = SA[i]; j > 0 { - if n <= j { - d += 1 - j -= n - } - if c0 = int(T[j]); c0 != c1 { - B[c1] = b - c1 = c0 - b = B[c1] - } - j-- - t = int(c0) << 1 - if int(T[j]) < c1 { - t |= 1 - } - if D[t] != d { - j += n - D[t] = d - } - if t&1 > 0 { - SA[b] = ^j - } else { - SA[b] = j - } - b++ - SA[i] = 0 - } else if j < 0 { - SA[i] = ^j - } - } - for i = n - 1; 0 <= i; i-- { - if SA[i] > 0 { - if SA[i] < n { - SA[i] += n - for j = i - 1; SA[j] < n; j-- { - } - SA[j] -= n - i = j - } - } - } - - // Compute SAs. - getBuckets_{{.Type}}(C, B, k, true) // Find ends of buckets - c1 = 0 - b = B[c1] - for i, d = n-1, d+1; i >= 0; i-- { - if j = SA[i]; j > 0 { - if n <= j { - d += 1 - j -= n - } - if c0 = int(T[j]); c0 != c1 { - B[c1] = b - c1 = c0 - b = B[c1] - } - j-- - t = int(c0) << 1 - if int(T[j]) > c1 { - t |= 1 - } - if D[t] != d { - j += n - D[t] = d - } - b-- - if t&1 > 0 { - SA[b] = ^(j + 1) - } else { - SA[b] = j - } - SA[i] = 0 - } - } -} - -func postProcLMS2_{{.Type}}(SA []int, n, m int) int { - var i, j, d, name int - - // Compact all the sorted LMS substrings into the first m items of SA. - name = 0 - for i = 0; SA[i] < 0; i++ { - j = ^SA[i] - if n <= j { - name += 1 - } - SA[i] = j - } - if i < m { - for d, i = i, i+1; ; i++ { - if j = SA[i]; j < 0 { - j = ^j - if n <= j { - name += 1 - } - SA[d] = j - d++ - SA[i] = 0 - if d == m { - break - } - } - } - } - if name < m { - // Store the lexicographic names. - for i, d = m-1, name+1; 0 <= i; i-- { - if j = SA[i]; n <= j { - j -= n - d-- - } - SA[m+(j>>1)] = d - } - } else { - // Unset flags. - for i = 0; i < m; i++ { - if j = SA[i]; n <= j { - j -= n - SA[i] = j - } - } - } - return name -} - -func induceSA_{{.Type}}(T []{{.Type}}, SA, C, B []int, n, k int) { - var b, i, j int - var c0, c1 int - - // Compute SAl. - if &C[0] == &B[0] { - getCounts_{{.Type}}(T, C, n, k) - } - getBuckets_{{.Type}}(C, B, k, false) // Find starts of buckets - j = n - 1 - c1 = int(T[j]) - b = B[c1] - if j > 0 && int(T[j-1]) < c1 { - SA[b] = ^j - } else { - SA[b] = j - } - b++ - for i = 0; i < n; i++ { - j = SA[i] - SA[i] = ^j - if j > 0 { - j-- - if c0 = int(T[j]); c0 != c1 { - B[c1] = b - c1 = c0 - b = B[c1] - } - if j > 0 && int(T[j-1]) < c1 { - SA[b] = ^j - } else { - SA[b] = j - } - b++ - } - } - - // Compute SAs. - if &C[0] == &B[0] { - getCounts_{{.Type}}(T, C, n, k) - } - getBuckets_{{.Type}}(C, B, k, true) // Find ends of buckets - c1 = 0 - b = B[c1] - for i = n - 1; i >= 0; i-- { - if j = SA[i]; j > 0 { - j-- - if c0 = int(T[j]); c0 != c1 { - B[c1] = b - c1 = c0 - b = B[c1] - } - b-- - if (j == 0) || (int(T[j-1]) > c1) { - SA[b] = ^j - } else { - SA[b] = j - } - } else { - SA[i] = ^j - } - } -} - -func computeSA_{{.Type}}(T []{{.Type}}, SA []int, fs, n, k int) { - const ( - minBucketSize = 512 - sortLMS2Limit = 0x3fffffff - ) - - var C, B, D, RA []int - var bo int // Offset of B relative to SA - var b, i, j, m, p, q, name, newfs int - var c0, c1 int - var flags uint - - if k <= minBucketSize { - C = make([]int, k) - if k <= fs { - bo = n + fs - k - B = SA[bo:] - flags = 1 - } else { - B = make([]int, k) - flags = 3 - } - } else if k <= fs { - C = SA[n+fs-k:] - if k <= fs-k { - bo = n + fs - 2*k - B = SA[bo:] - flags = 0 - } else if k <= 4*minBucketSize { - B = make([]int, k) - flags = 2 - } else { - B = C - flags = 8 - } - } else { - C = make([]int, k) - B = C - flags = 4 | 8 - } - if n <= sortLMS2Limit && 2 <= (n/k) { - if flags&1 > 0 { - if 2*k <= fs-k { - flags |= 32 - } else { - flags |= 16 - } - } else if flags == 0 && 2*k <= (fs-2*k) { - flags |= 32 - } - } - - // Stage 1: Reduce the problem by at least 1/2. - // Sort all the LMS-substrings. - getCounts_{{.Type}}(T, C, n, k) - getBuckets_{{.Type}}(C, B, k, true) // Find ends of buckets - for i = 0; i < n; i++ { - SA[i] = 0 - } - b = -1 - i = n - 1 - j = n - m = 0 - c0 = int(T[n-1]) - for { - c1 = c0 - if i--; i < 0 { - break - } - if c0 = int(T[i]); c0 < c1 { - break - } - } - for i >= 0 { - for { - c1 = c0 - if i--; i < 0 { - break - } - if c0 = int(T[i]); c0 > c1 { - break - } - } - if i >= 0 { - if b >= 0 { - SA[b] = j - } - B[c1]-- - b = B[c1] - j = i - m++ - for { - c1 = c0 - if i--; i < 0 { - break - } - if c0 = int(T[i]); c0 < c1 { - break - } - } - } - } - - if m > 1 { - if flags&(16|32) > 0 { - if flags&16 > 0 { - D = make([]int, 2*k) - } else { - D = SA[bo-2*k:] - } - B[T[j+1]]++ - for i, j = 0, 0; i < k; i++ { - j += C[i] - if B[i] != j { - SA[B[i]] += n - } - D[i] = 0 - D[i+k] = 0 - } - sortLMS2_{{.Type}}(T, SA, C, B, D, n, k) - name = postProcLMS2_{{.Type}}(SA, n, m) - } else { - sortLMS1_{{.Type}}(T, SA, C, B, n, k) - name = postProcLMS1_{{.Type}}(T, SA, n, m) - } - } else if m == 1 { - SA[b] = j + 1 - name = 1 - } else { - name = 0 - } - - // Stage 2: Solve the reduced problem. - // Recurse if names are not yet unique. - if name < m { - newfs = n + fs - 2*m - if flags&(1|4|8) == 0 { - if k+name <= newfs { - newfs -= k - } else { - flags |= 8 - } - } - RA = SA[m+newfs:] - for i, j = m+(n>>1)-1, m-1; m <= i; i-- { - if SA[i] != 0 { - RA[j] = SA[i] - 1 - j-- - } - } - computeSA_int(RA, SA, newfs, m, name) - - i = n - 1 - j = m - 1 - c0 = int(T[n-1]) - for { - c1 = c0 - if i--; i < 0 { - break - } - if c0 = int(T[i]); c0 < c1 { - break - } - } - for i >= 0 { - for { - c1 = c0 - if i--; i < 0 { - break - } - if c0 = int(T[i]); c0 > c1 { - break - } - } - if i >= 0 { - RA[j] = i + 1 - j-- - for { - c1 = c0 - if i--; i < 0 { - break - } - if c0 = int(T[i]); c0 < c1 { - break - } - } - } - } - for i = 0; i < m; i++ { - SA[i] = RA[SA[i]] - } - if flags&4 > 0 { - B = make([]int, k) - C = B - } - if flags&2 > 0 { - B = make([]int, k) - } - } - - // Stage 3: Induce the result for the original problem. - if flags&8 > 0 { - getCounts_{{.Type}}(T, C, n, k) - } - // Put all left-most S characters into their buckets. - if m > 1 { - getBuckets_{{.Type}}(C, B, k, true) // Find ends of buckets - i = m - 1 - j = n - p = SA[m-1] - c1 = int(T[p]) - for { - c0 = c1 - q = B[c0] - for q < j { - j-- - SA[j] = 0 - } - for { - j-- - SA[j] = p - if i--; i < 0 { - break - } - p = SA[i] - if c1 = int(T[p]); c1 != c0 { - break - } - } - if i < 0 { - break - } - } - for j > 0 { - j-- - SA[j] = 0 - } - } - induceSA_{{.Type}}(T, SA, C, B, n, k) -} -` diff --git a/vendor/github.com/dsnet/compress/zbench.sh b/vendor/github.com/dsnet/compress/zbench.sh old mode 100755 new mode 100644 diff --git a/vendor/github.com/dsnet/compress/zfuzz.sh b/vendor/github.com/dsnet/compress/zfuzz.sh old mode 100755 new mode 100644 diff --git a/vendor/github.com/dsnet/compress/zprof.sh b/vendor/github.com/dsnet/compress/zprof.sh old mode 100755 new mode 100644 diff --git a/vendor/github.com/dsnet/compress/ztest.sh b/vendor/github.com/dsnet/compress/ztest.sh old mode 100755 new mode 100644 diff --git a/vendor/github.com/karlmutch/basex/LICENSE b/vendor/github.com/eknkc/basex/LICENSE similarity index 100% rename from vendor/github.com/karlmutch/basex/LICENSE rename to vendor/github.com/eknkc/basex/LICENSE diff --git a/vendor/github.com/karlmutch/basex/README.md b/vendor/github.com/eknkc/basex/README.md similarity index 100% rename from vendor/github.com/karlmutch/basex/README.md rename to vendor/github.com/eknkc/basex/README.md diff --git a/vendor/github.com/karlmutch/basex/basex.go b/vendor/github.com/eknkc/basex/basex.go similarity index 100% rename from vendor/github.com/karlmutch/basex/basex.go rename to vendor/github.com/eknkc/basex/basex.go diff --git a/vendor/github.com/karlmutch/basex/go.mod b/vendor/github.com/eknkc/basex/go.mod similarity index 100% rename from vendor/github.com/karlmutch/basex/go.mod rename to vendor/github.com/eknkc/basex/go.mod diff --git a/vendor/gopkg.in/src-d/go-license-detector.v2/LICENSE.md b/vendor/github.com/go-enry/go-license-detector/v4/LICENSE.md similarity index 100% rename from vendor/gopkg.in/src-d/go-license-detector.v2/LICENSE.md rename to vendor/github.com/go-enry/go-license-detector/v4/LICENSE.md diff --git a/vendor/github.com/go-enry/go-license-detector/v4/licensedb/analysis.go b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/analysis.go new file mode 100644 index 000000000..67363f3b2 --- /dev/null +++ b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/analysis.go @@ -0,0 +1,78 @@ +package licensedb + +import ( + "fmt" + "net/url" + "os" + "sort" + "sync" + + "github.com/go-enry/go-license-detector/v4/licensedb/filer" +) + +// Analyse runs license analysis on each item in `args` +func Analyse(args ...string) []Result { + nargs := len(args) + results := make([]Result, nargs) + var wg sync.WaitGroup + wg.Add(nargs) + for i, arg := range args { + go func(i int, arg string) { + defer wg.Done() + matches, err := process(arg) + res := Result{Arg: arg, Matches: matches} + if err != nil { + res.ErrStr = err.Error() + } + results[i] = res + }(i, arg) + } + wg.Wait() + + return results +} + +// Result gathers license detection results for a project path +type Result struct { + Arg string `json:"project,omitempty"` + Matches []Match `json:"matches,omitempty"` + ErrStr string `json:"error,omitempty"` +} + +// Match describes the level of confidence for the detected License +type Match struct { + License string `json:"license"` + Confidence float32 `json:"confidence"` +} + +func process(arg string) ([]Match, error) { + newFiler := filer.FromDirectory + if _, err := os.Stat(arg); err != nil { + if !os.IsNotExist(err) { + return nil, err + } + + if _, err := url.Parse(arg); err == nil { + newFiler = filer.FromGitURL + } else { + return nil, fmt.Errorf("arg should be a valid path or a URL") + } + } + + resolvedFiler, err := newFiler(arg) + if err != nil { + return nil, err + } + + ls, err := Detect(resolvedFiler) + if err != nil { + return nil, err + } + + var matches []Match + for k, v := range ls { + matches = append(matches, Match{k, v.Confidence}) + } + sort.Slice(matches, func(i, j int) bool { return matches[i].Confidence > matches[j].Confidence }) + return matches, nil +} diff --git a/vendor/github.com/go-enry/go-license-detector/v4/licensedb/api/api.go b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/api/api.go new file mode 100644 index 000000000..f466afb66 --- /dev/null +++ b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/api/api.go @@ -0,0 +1,8 @@ +package api + +// Match is a detection result of a license with a confidence (0.0 - 1.0) +// and a mapping of files to confidence. +type Match struct { + Files map[string]float32 + Confidence float32 +} diff --git a/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/dataset.projects.gz b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/dataset.projects.gz similarity index 100% rename from vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/dataset.projects.gz rename to vendor/github.com/go-enry/go-license-detector/v4/licensedb/dataset.projects.gz diff --git a/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/dataset.zip b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/dataset.zip similarity index 100% rename from vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/dataset.zip rename to vendor/github.com/go-enry/go-license-detector/v4/licensedb/dataset.zip diff --git a/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/filer/filer.go b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/filer/filer.go similarity index 78% rename from vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/filer/filer.go rename to vendor/github.com/go-enry/go-license-detector/v4/licensedb/filer/filer.go index 907bf1de6..b34fbfd37 100644 --- a/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/filer/filer.go +++ b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/filer/filer.go @@ -5,20 +5,16 @@ import ( "bytes" "io/ioutil" "os" + xpath "path" "path/filepath" "strings" + git "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/filemode" + "github.com/go-git/go-git/v5/plumbing/object" + "github.com/go-git/go-git/v5/storage/memory" "github.com/pkg/errors" - sivafs "gopkg.in/src-d/go-billy-siva.v4" - "gopkg.in/src-d/go-billy.v4/memfs" - "gopkg.in/src-d/go-billy.v4/osfs" - git "gopkg.in/src-d/go-git.v4" - "gopkg.in/src-d/go-git.v4/plumbing" - "gopkg.in/src-d/go-git.v4/plumbing/filemode" - "gopkg.in/src-d/go-git.v4/plumbing/object" - "gopkg.in/src-d/go-git.v4/plumbing/storer" - "gopkg.in/src-d/go-git.v4/storage/filesystem" - "gopkg.in/src-d/go-git.v4/storage/memory" ) // File represents a file in the virtual file system: every node is either a regular file @@ -36,6 +32,9 @@ type Filer interface { ReadDir(path string) ([]File, error) // Close frees all the resources allocated by this Filer. Close() + // PathsAreAlwaysSlash indicates whether the path separator is platform-independent ("/") or + // OS-specific. + PathsAreAlwaysSlash() bool } type localFiler struct { @@ -99,6 +98,10 @@ func (filer *localFiler) ReadDir(path string) ([]File, error) { func (filer *localFiler) Close() {} +func (filer *localFiler) PathsAreAlwaysSlash() bool { + return false +} + type gitFiler struct { root *object.Tree } @@ -109,10 +112,11 @@ func FromGitURL(url string) (Filer, error) { if err != nil { return nil, errors.Wrapf(err, "could not clone repo from %s", url) } - return fromGit(repo, "") + return FromGit(repo, "") } -func fromGit(repo *git.Repository, headRef plumbing.ReferenceName) (Filer, error) { +// FromGit returns a Filer that allows accessing all the files in a Git repository +func FromGit(repo *git.Repository, headRef plumbing.ReferenceName) (Filer, error) { var head *plumbing.Reference var err error if headRef == "" { @@ -199,37 +203,8 @@ func (filer *gitFiler) Close() { filer.root = nil } -// FromSiva returns a Filer that allows accessing all the files in a Git repository contained in a Siva file. -// See https://github.com/src-d/go-siva and https://github.com/src-d/go-billy-siva -func FromSiva(path string) (Filer, error) { - localFs := osfs.New(filepath.Dir(path)) - tmpFs := memfs.New() - basePath := filepath.Base(path) - fs, err := sivafs.NewFilesystem(localFs, basePath, tmpFs) - if err != nil { - return nil, errors.Wrapf(err, "unable to create a Siva filesystem from %s", path) - } - sivaStorage, err := filesystem.NewStorage(fs) - if err != nil { - return nil, errors.Wrapf(err, "unable to create a new storage backend for Siva file %s", path) - } - repo, err := git.Open(sivaStorage, tmpFs) - if err != nil { - return nil, errors.Wrapf(err, "unable to open the Git repository from Siva file %s", path) - } - refs, err := repo.References() - if err != nil { - return nil, errors.Wrapf(err, "unable to list Git references from Siva file %s", path) - } - var head plumbing.ReferenceName - refs.ForEach(func(ref *plumbing.Reference) error { - if strings.HasPrefix(ref.Name().String(), "refs/heads/HEAD/") { - head = ref.Name() - return storer.ErrStop - } - return nil - }) - return fromGit(repo, head) +func (filer *gitFiler) PathsAreAlwaysSlash() bool { + return true } type zipNode struct { @@ -269,7 +244,7 @@ func FromZIP(path string) (Filer, error) { } func (filer *zipFiler) ReadFile(path string) ([]byte, error) { - parts := strings.Split(path, string(filepath.Separator)) + parts := strings.Split(path, string("/")) node := filer.tree for _, part := range parts { if part == "" { @@ -293,7 +268,7 @@ func (filer *zipFiler) ReadFile(path string) ([]byte, error) { } func (filer *zipFiler) ReadDir(path string) ([]File, error) { - parts := strings.Split(path, string(filepath.Separator)) + parts := strings.Split(path, string("/")) node := filer.tree for _, part := range parts { if part == "" { @@ -321,6 +296,10 @@ func (filer *zipFiler) Close() { filer.arch.Close() } +func (filer *zipFiler) PathsAreAlwaysSlash() bool { + return true +} + type nestedFiler struct { origin Filer offset string @@ -332,13 +311,29 @@ func NestFiler(filer Filer, prefix string) Filer { } func (filer *nestedFiler) ReadFile(path string) ([]byte, error) { - return filer.origin.ReadFile(filepath.Join(filer.offset, path)) + var fullPath string + if filer.origin.PathsAreAlwaysSlash() { + fullPath = xpath.Join(filer.offset, path) + } else { + fullPath = filepath.Join(filer.offset, path) + } + return filer.origin.ReadFile(fullPath) } func (filer *nestedFiler) ReadDir(path string) ([]File, error) { - return filer.origin.ReadDir(filepath.Join(filer.offset, path)) + var fullPath string + if filer.origin.PathsAreAlwaysSlash() { + fullPath = xpath.Join(filer.offset, path) + } else { + fullPath = filepath.Join(filer.offset, path) + } + return filer.origin.ReadDir(fullPath) } func (filer *nestedFiler) Close() { filer.origin.Close() } + +func (filer *nestedFiler) PathsAreAlwaysSlash() bool { + return filer.origin.PathsAreAlwaysSlash() +} diff --git a/vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/assets/bindata.go b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/assets/bindata.go new file mode 100644 index 000000000..77a6cb129 --- /dev/null +++ b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/assets/bindata.go @@ -0,0 +1,281 @@ +// Code generated by go-bindata. +// sources: +// licenses.tar +// urls.csv +// names.csv +// DO NOT EDIT! + +package assets + +import ( + "bytes" + "compress/gzip" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "strings" + "time" +) + +func bindataRead(data []byte, name string) ([]byte, error) { + gz, err := gzip.NewReader(bytes.NewBuffer(data)) + if err != nil { + return nil, fmt.Errorf("Read %q: %v", name, err) + } + + var buf bytes.Buffer + _, err = io.Copy(&buf, gz) + clErr := gz.Close() + + if err != nil { + return nil, fmt.Errorf("Read %q: %v", name, err) + } + if clErr != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +type asset struct { + bytes []byte + info os.FileInfo +} + +type bindataFileInfo struct { + name string + size int64 + mode os.FileMode + modTime time.Time +} + +func (fi bindataFileInfo) Name() string { + return fi.name +} +func (fi bindataFileInfo) Size() int64 { + return fi.size +} +func (fi bindataFileInfo) Mode() os.FileMode { + return fi.mode +} +func (fi bindataFileInfo) ModTime() time.Time { + return fi.modTime +} +func (fi bindataFileInfo) IsDir() bool { + return false +} +func (fi bindataFileInfo) Sys() interface{} { + return nil +} + +var _licensesTar = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\xeb\x73\xdb\x48\x92\x07\xd8\x9f\xeb\xaf\xa8\x63\xc4\x45\x8b\x11\x10\x2d\xf9\x39\xdd\xbd\x31\x71\xb4\x44\xdb\xbc\x91\x49\x2d\x49\xb5\xc7\xb7\xb1\x1f\x8a\x40\x51\xac\x31\x88\xe2\xa2\x00\xc9\xdc\xbf\xfe\xa2\x32\xb3\x5e\x20\x28\xbb\x67\xa7\x67\x6f\x6f\x5b\x1f\x66\xda\x12\x09\xd4\x23\x2b\x2b\x1f\xbf\xfc\xe5\xe8\xd9\x0f\xbf\xfb\xcf\xc5\xc5\xc5\xc5\x9b\x37\xaf\xec\xff\x5f\xbe\x79\x75\x11\xff\xbf\xfb\xf9\xe1\xf2\xc5\xeb\xe7\x17\x17\x2f\xdf\x5c\xbe\xba\xfc\xe1\xe2\xf2\xf2\xe2\xf5\xcb\x1f\xf8\xab\xdf\x7f\x68\x3f\xfc\xd0\x9a\x46\xd4\x9c\xff\x50\x8a\x4d\xad\xbe\x98\x93\x9f\xfb\xd6\xdf\xff\x87\xfe\x8c\x9e\x2d\x97\x1f\xce\xcd\x56\xd7\xcd\xa8\xf9\xda\xfc\x2e\xef\xb0\x1b\xfc\xfa\xf5\xcb\x93\xfb\xff\xea\xe2\x55\x67\xff\x5f\xbc\xbc\x7c\xf3\x03\xbf\xf8\x5d\x46\xd3\xf9\xf9\x5f\xbe\xff\x63\xc3\x37\xa2\xe6\xc2\xf0\x29\x17\x3b\x9e\xeb\x2a\x97\x75\x25\x8b\x8c\x37\x5b\xc9\x73\x5d\x48\x3e\xe5\x5b\xf1\x20\xf9\x63\xad\x9a\x46\x56\x7c\xa3\x6b\xde\x6c\x95\xe1\x46\x6f\x9a\x47\x51\x4b\x9e\x8b\x8a\xaf\x25\x6b\x8d\x2c\xf8\xa6\x96\xb2\x3c\xc0\x87\x44\x75\xe0\xfb\xb6\xde\x6b\x23\x47\x7c\x5c\x1d\x78\x21\x6b\xf5\x20\x0b\xfe\x20\x6b\xa3\x74\x65\xb8\xde\x74\x9e\xb4\x6b\x4d\x63\x1f\x95\x97\x52\xd4\xe5\x81\xef\x44\xfd\x45\x16\x76\x74\xa6\xcd\xb7\x19\x17\x55\xc1\xd5\x06\x86\xe6\x1e\xf6\xa8\xeb\x2f\x5c\x19\xae\xaa\x5c\xef\xf6\xa2\x51\xeb\x52\xf2\x47\xd5\x6c\xe1\x53\xfb\x5a\x37\x3a\xd7\x25\x2b\xa4\xc9\x6b\xb5\x6f\x94\xae\xb8\xaa\xe0\x6f\x8b\x77\x57\x7c\xa3\x4a\x99\x71\xd5\xb8\x37\xf3\x5c\x94\xa5\x2c\xf8\xfa\xc0\x05\xaf\xc4\x4e\x72\xdd\x6c\xa5\x9d\xb0\xa8\xf8\xc0\x98\xed\x80\xe9\x9a\x0f\x96\x32\x6f\x6b\xc9\x97\x5b\x59\x96\x83\x11\xfb\xef\xde\xc4\xff\xc2\xcf\xe8\xd9\xf8\xfd\xed\xcd\xf9\x8b\xd1\xc5\xb9\xae\xcf\x4b\xd1\xc8\xfa\x1f\xae\x07\x9e\x3c\xff\x97\x17\xcf\x2f\x9f\x77\xcf\xff\xcb\x17\x6f\x9e\xff\x71\xfe\xff\x19\x3f\xef\x67\x77\x7c\xfc\xee\xdd\x64\x31\xe7\xef\x27\xb3\xc9\x62\x7c\xc3\x6f\xef\xde\xde\x4c\xaf\xf8\xcd\xf4\x6a\x32\x5b\x4e\x18\xfb\x15\x8f\x2b\x7f\x91\xf1\xcb\x9f\xf8\x4c\x3f\xc8\xdd\x5a\xd6\xfc\xf9\xc5\xc5\x1b\xc6\xae\xf4\xfe\x50\xab\xfb\x6d\xc3\xcf\xae\x86\xf0\x3b\xfe\xae\x96\x92\x2f\xdd\x91\x7e\xa7\xdb\xaa\x10\xf6\xdc\x65\x7c\x5a\xe5\x23\xfe\x2f\xdb\xa6\xd9\x9b\x9f\x9f\x3d\xdb\x98\xcd\x48\xd7\xf7\xcf\xfe\xcc\xd8\xe4\x41\xd6\x07\x5d\x49\x7b\x90\xf7\xb2\xde\x59\x4d\x53\xf0\x46\xf3\x5c\xef\x0f\x70\xea\x0b\x65\x9a\x5a\xad\xdb\x46\x5a\xf5\xb1\x16\x8d\xb2\xca\x6a\xaf\x64\xd0\x22\xa5\xca\x65\x65\x24\x2b\x74\xde\xee\x64\xd5\x64\x7c\xdd\x36\x3c\xdf\x8a\xea\x5e\x55\xf7\xf6\x90\x2b\xc3\x2b\xdd\x70\x51\x96\xfa\x51\x16\x23\xc6\x6e\x6b\x29\x76\xeb\x52\x32\xb6\xda\x4a\x0e\x6b\xb1\xd9\xc8\x5a\xf3\xf7\xb2\x92\xb5\x28\xf9\x6d\xbb\x2e\x55\xce\x6f\xf0\xd1\xf6\x01\x02\x54\x5c\x06\x23\x2b\xe5\xa6\x71\xaf\x05\x95\xe7\x14\x19\xb3\x43\x46\xcd\xf1\x45\x55\x05\x8c\xd1\x2a\x2a\x93\x71\xb3\x97\xb9\xda\x28\xab\x67\xac\x46\x34\xea\xbe\xc2\xa9\xca\xca\x58\x9d\x92\x6b\xbd\x97\x35\x2c\x18\xa8\x31\x86\x7a\x78\xb7\x6b\x2b\xd5\x1c\x9c\xee\xca\x85\x91\xf6\xa1\x95\x6c\x40\x01\x1a\x59\x3f\xc8\xf0\xfe\x11\x4e\x88\x86\x66\x60\x6c\x3b\x6d\x9a\xa0\x69\xc3\x00\xf7\xb5\xc8\x1b\x3b\x1e\x1c\x21\xb7\x7f\x8d\xc7\xd5\x88\x2f\x92\x89\x47\x71\xe0\x07\xdd\xd6\x30\xfb\x42\xef\xec\x5f\xcc\xd6\x3d\x09\x16\x59\xc2\xc8\xe0\x21\x23\xfe\xf6\x60\xef\x92\xa6\x16\xa6\xc9\xb8\xfd\x1e\xad\x28\x4b\x57\x14\x5f\xa7\xaa\x46\x56\x05\xbe\xee\xbe\x15\xb5\xa8\x1a\x29\xbf\xf9\x3a\x26\xca\x32\xb9\x4b\x84\x55\xf7\xf7\xb5\xd8\x9d\x9f\x37\x9a\xef\xc4\x17\xc9\x61\x49\x55\xc3\x6b\xb9\x13\xaa\x32\xf0\xb8\xb0\x08\x70\x4b\x95\x25\x57\x8d\xb1\xb7\x57\x6d\x46\x8c\x7d\xda\xca\x8a\x3f\x4a\xbb\x4f\xe2\x8b\x7d\x6a\xf2\x95\xcc\xfe\xc9\x7e\xb5\x96\x1b\x59\xd7\x56\xae\x1a\xed\x06\x99\x81\x74\xed\x6b\x95\xcb\x11\x9f\xb7\x35\xeb\x97\xa2\xe3\x25\x0e\x43\x6d\xb6\xa2\xb1\x13\xc7\x2b\xd7\xae\x27\x3d\x9b\x35\x3a\x3e\x03\x41\xf4\xd3\x19\x9d\xd1\xf2\xd4\xf7\x92\x2e\x6a\xb9\xb3\x37\xa6\x7d\xe4\xa3\x32\xdb\x61\x06\xaf\x60\xf6\xdf\xb5\xcc\xa5\x7a\xb0\x5f\x6e\xeb\x9c\xee\x7a\x5d\xc3\x6d\x7e\x2f\x1b\x38\x2f\xf4\x45\x51\xd9\x7f\x66\x61\x74\xf6\x33\xb4\x09\x76\x8c\xfe\xf5\xba\xe6\xad\x91\x7c\xaf\x64\x8e\xa3\xb3\x0f\xa9\x78\x25\x1f\x71\x9c\xb4\x3f\x06\x6f\x72\xff\xb8\x2f\x95\x7e\xb4\xff\xc1\xec\x73\x0b\x6d\x47\x6d\xec\xec\x55\x75\x6f\xb7\xe4\x5a\x3e\xc8\xd2\x9e\x0a\x83\x5f\xb1\xaf\x88\x44\xea\x68\x79\xed\xa5\x2f\xf3\x06\x05\x08\x94\x93\x21\x8b\xe0\x51\x33\xd3\xc8\xbd\xf9\x99\x9f\x5d\x0e\xb9\x30\x46\xd6\x0d\x9c\x64\x54\x61\x1a\x0f\x57\xd8\x6c\x3b\xca\xb3\xe7\x43\xae\xad\x56\x80\xa1\x82\xa6\xa1\x37\xb1\xc7\xad\xca\xb7\xfc\x5e\x3d\x48\x03\x7f\x2c\xe5\xbd\x28\x51\x81\x19\x50\x99\xa4\xc1\xb2\x78\xeb\x44\x55\x3c\x83\xe3\x58\xa8\xcd\x21\x79\xdf\x88\xb1\x31\x37\x32\xd7\x55\x21\xea\x03\x5f\xcb\x4a\x6e\x54\x63\x97\xb1\x90\x1b\x59\x15\x56\xda\xac\xb8\x82\xa8\xfe\xe8\x8f\x86\xa2\x65\x51\xbb\x7d\x6d\x95\xb3\xac\x1a\xc3\x77\xa2\x90\x4c\x55\x5c\x94\x8d\xac\x2b\x81\x6a\x33\xb2\xba\xfc\x5e\x64\x64\x50\x1d\xbc\x3c\x3c\xaa\x42\x9a\x7d\x2d\x45\x61\xdf\x94\xf1\xb5\xcc\xf5\x4e\x32\xf1\x20\x54\x29\xac\x75\x65\x05\x0b\x75\x47\x11\xed\x8c\x06\x13\xac\xde\xeb\x5a\x34\x72\xc4\x3f\x0a\xb0\xf8\xfc\xdf\xbb\xa2\xca\xac\xbc\x6c\xa5\xa8\x1b\x69\x4f\x81\x5d\x69\x59\xe5\xba\xad\xc5\x3d\xda\x5f\x76\x8c\xb5\x34\x6d\xd9\xd8\x79\x47\x6a\x71\xc4\x3f\xe8\x47\xf9\x20\xeb\x8c\xb4\x21\x73\xda\xd0\xcb\x21\x98\xa2\xba\xea\xa8\x47\x93\xe1\xf6\xe1\x53\xf9\x4e\x1c\xf8\x46\xa8\x12\x77\x69\x27\xb9\x58\xeb\xb6\x19\xf9\xab\xe0\xc4\x1d\x80\xf7\x93\x5d\xe1\x2f\xb0\x21\xb8\x93\x2a\xd8\xb5\x30\x97\x52\x36\x76\xdc\x70\x3c\xf6\xf8\x00\x91\xe7\xd2\x18\x7b\x24\xec\x67\x9c\xca\xb6\x82\xa9\xdb\x86\xdb\x09\xf1\x5a\x96\x52\x18\xbc\xad\x4c\x72\x30\x1b\x1d\x3d\x6a\xf4\x1b\xee\x2b\xaf\x67\x92\x8b\x27\xdc\x37\x56\x74\x32\x2b\x29\xd6\xc2\x86\x7b\xc5\xa0\xed\xef\xa7\x15\x0f\x03\x65\xc1\xf0\x20\x0c\x8d\xe6\xc9\x0d\x35\x62\x53\xab\x6e\xff\xa3\x55\xb5\x34\xf0\x27\xdc\x38\x2b\x33\x56\x45\x77\x6e\xac\x46\x5b\x41\x7c\x50\x85\xa4\xa3\x10\xe9\xa2\x0d\x4b\xc6\xe1\x96\xb7\x6e\xab\x0a\x14\xef\x56\xd6\xfe\xfd\x70\x26\x50\xb4\x45\x43\x0f\x1f\xf1\x95\xfd\xc8\x46\xd7\x32\x63\xb4\x09\x2d\x4a\xca\xf1\xae\x65\xb8\x2b\xf8\xb1\xf2\x40\xbb\x05\xde\x04\x3e\x2d\xa3\x83\x6e\x05\x2e\xdd\x51\x1a\x42\x3a\x76\xde\x37\x76\x7b\xc2\x2b\xae\xcb\x42\xd6\xee\x72\xce\x9c\xcb\x61\x3f\xff\xf4\x6e\x5a\xb9\x82\x37\x9b\x2d\x1c\x11\x86\x1f\xcf\xf8\xa3\x30\xc9\x7d\x22\x72\xeb\x0b\xd9\xcf\x71\xa3\x76\xaa\x14\x35\xbf\xd7\xa2\x34\x76\x41\xac\xab\x64\xad\x98\x42\xd9\x2f\xcb\xca\x1b\x30\x19\x03\xdb\xc8\x2f\x33\x4d\xc1\x0d\xe9\xf6\x06\xed\x29\xfa\xf7\x56\x18\x92\x56\x7b\x78\x41\xc3\x87\x2f\xb2\xf4\x8b\x1c\xf5\xa4\x3b\x38\xb5\xc4\x37\xda\x3d\x6c\xab\x42\xd6\x89\xf9\x46\xb2\xbd\xaf\x65\xae\xec\x25\x20\xeb\x9d\xc1\x4b\x5f\x57\x85\x6a\x40\x83\x59\x05\x64\xf5\xaa\xaa\xee\x23\xd5\xea\x8e\x1e\x2e\x7a\x0e\xba\x82\x6d\xb4\x35\xf6\xec\x43\x27\x8b\x8f\x4b\x3e\x9e\x5d\xf3\xab\xf9\xec\x7a\xba\x9a\xce\x67\x4b\xc6\x38\xe7\x17\x23\x7e\x2d\x37\xaa\xc2\x67\x8f\xe0\x77\x83\x55\xa4\xe6\x07\x78\xd9\xc3\x3e\xbb\x39\xbe\x70\xcb\xf3\xcd\x33\x38\x62\x6c\xe0\x8d\xe4\x01\x17\xa5\xd1\x7c\x27\x45\x65\xc2\xbd\x73\x5e\xaa\x2f\x92\x97\xe2\x91\x14\xb9\xd8\xef\xf1\x88\xf6\x5a\x90\x0c\x0e\xaa\x75\x89\xe5\x4e\xd9\x45\x69\x73\x7b\xb8\x76\xc2\x7c\xb1\xa3\x1f\xd8\xd5\xbb\x45\xdd\x1e\x8f\xdc\xaa\x63\xff\x46\x38\xb9\x70\x0c\x69\xd5\x8b\x78\x27\xfc\xc8\x27\x22\xdf\xba\x4f\xa0\xf1\x5b\x14\xb5\x34\x06\x5d\xf2\xc1\x41\xb7\x83\x11\x1f\xd0\xc7\xa5\x19\xc0\xf2\x0f\xec\xce\xed\x95\xbd\x85\x06\xa0\x63\xd7\xd6\xc0\x2b\xd4\x83\x2a\x5a\x51\x1a\xeb\x3f\xeb\xfa\x5e\x54\xea\x3f\x85\x5b\xf1\x95\xe6\x03\xbc\x0f\x07\x5c\xe0\xb8\x70\x89\x9c\x07\xb0\xa9\xf5\xce\x1a\x17\xa2\x10\x7b\xb0\xdf\xed\x3f\xf6\xa2\x6e\xdc\x36\x60\x14\xa0\x62\x82\x6f\x84\xd9\x82\x96\x00\x15\x84\x57\x87\xbb\xdf\xc3\xcd\x9c\xc5\x7e\x3d\x9c\x54\xd4\xe6\x56\x35\x54\x5c\x7e\x15\x79\xc3\xec\xf7\x40\x85\x44\xd7\x90\x8b\x36\xd0\x99\x15\x34\xee\xe8\x88\x0f\xdc\x90\xa4\xa8\x4b\x65\x15\xbc\xae\xbf\xd8\x49\xd3\xc4\x06\x6b\x81\x97\xd3\xe0\xe8\x53\x70\xff\x0f\x72\xfd\x20\x6b\x0a\x6c\x0c\x68\x1d\xa4\xa2\xd1\x4a\xde\x56\xfe\x8d\xb4\xcb\x3c\x3c\xdc\x3d\x1b\x94\x14\xfd\x99\xd6\x77\x5f\xeb\xbd\xb8\x17\x8d\x3c\x5e\xe2\x02\xa4\x03\xcc\x2d\xb4\x93\x54\x83\xd7\x82\xbf\x9c\xa2\x85\x63\x8f\xba\x2d\x0b\x34\x59\xad\xcd\x53\xa8\x5a\xe6\x4d\x79\xb0\xa3\x70\xb6\x8b\x2a\x0f\xbc\x54\xde\x56\x50\xd5\xc6\x6e\x04\x58\x26\x24\x67\x56\xc4\x55\x6e\x3f\xc1\xc2\xf6\x94\xe2\x31\xe3\xf2\x6b\x2e\xf7\x0d\x97\x5f\x65\xde\x36\xe4\xb7\x81\x66\xb6\x2a\xad\x6d\xa4\x95\x1e\x32\x9e\xf0\xfa\xdd\xd7\xea\x41\xa0\x49\x7c\x18\xd9\x49\xc3\x34\x31\xce\x93\x97\x6d\x21\xcd\x09\x5d\x71\x06\x73\xd5\xe1\x0a\x8e\x15\xc7\x30\x63\xee\x82\xef\x5e\x75\xa8\xfc\x29\x18\x55\x71\x63\x4d\x87\x5c\xb7\x55\x53\x83\x49\x0e\x3b\x65\x5d\xaa\x07\xd5\xd8\x5f\x08\xc3\x1e\x65\x59\xd2\x36\xe4\xba\x7a\x90\x5d\x31\xb7\x67\xd3\x9e\x72\x2b\x3a\xfb\x68\x02\xa0\x0d\x64\x65\x5f\xee\x1e\x6c\x85\x5e\x49\xc3\x9c\xd7\xa0\x6b\x6f\xb7\xa1\x4f\x30\xe2\x1f\x25\xb9\x54\xe0\xd8\x91\x1b\xc9\x05\x5c\x91\xbc\xd9\xd6\xba\xbd\xdf\x46\xeb\xc9\xe8\x46\xc6\xdd\xe6\x95\xe6\x4d\x2d\x2a\x63\x0d\x5e\xb8\x28\xd1\x80\x25\xd7\x19\x87\xaf\xaa\x7b\xbc\xc9\xfc\x5b\x1e\xf0\x06\xc6\x5f\x6c\x44\x2e\xed\x52\xef\x4b\x71\x30\x7c\x30\xde\xdb\x39\xd5\xca\x6e\xd2\x0d\x58\xc8\x33\xdd\xa8\xdc\xea\x0b\x5c\x51\x26\xbf\x36\x56\x34\xd0\x8a\x6d\xc2\xbe\x09\x7c\x5f\x65\x95\x09\xde\x7e\xb5\xde\xa9\x4a\x56\x56\xde\x1e\x14\xde\xce\x1b\x29\x1a\x67\xc8\x30\x6b\xd6\xfb\x37\x8b\xca\xca\x99\x7f\x77\x10\xb4\x0a\xde\x1f\xcc\xfb\x46\x96\xa5\xf1\x66\x04\x3e\x09\xad\x0b\x98\x36\x7f\x14\xb5\xf5\x49\x0f\xce\xa5\xc2\xbd\x3b\x23\x51\x25\xb1\x88\x27\x41\x5f\x50\xe8\xeb\x31\xb2\x70\x0a\xf2\xbe\xbc\x4a\x35\xa0\x1f\x71\x4d\xc3\x73\x8f\x35\x31\x8e\x74\xab\x1f\xed\xb6\x3f\x28\xf9\x48\xdb\xe2\x43\x1f\x4e\x63\xf3\x29\xea\x9e\xb0\x0d\xfb\x5a\x1a\x70\x08\x04\x2f\x95\x01\x7d\x09\x73\xb4\xf6\x9a\xa8\x0a\x54\xc7\x10\x16\x35\x19\x77\x37\x8b\xe0\x3b\x59\xb5\x19\x3a\xd4\xb8\xe0\x5c\x35\xd6\x93\x44\x65\x09\x4f\xda\x49\xd9\x18\x7c\x7d\x5e\xab\x46\xd6\x68\xdf\x70\xce\x2f\x47\x7c\x89\xb6\xd0\x95\x2e\xdc\x85\x3e\x88\xcc\xa3\x01\x7a\xde\x89\x1a\xc2\x3b\xdf\x3a\xd5\xb2\xb0\x7f\xde\x25\xaa\x1d\x02\x18\x70\x1e\x59\x7c\x4a\xd1\xed\x68\x46\x7c\x30\x5f\xff\xcd\xba\x7c\xf8\xf4\x70\xaa\x2a\x5d\x9d\xd3\x8b\xdd\x33\x45\xa4\x6b\x97\x8d\xb0\xfa\xaa\xe0\x53\xb7\x60\xe1\xcb\xd1\x22\xe2\x39\x44\x1d\xac\xe0\x6f\x7a\xb3\x51\xb9\x12\x25\x37\xf4\x04\x56\x58\x1b\xc2\x45\x8e\x6b\x99\xeb\xfb\x4a\xfd\xa7\xb5\x9e\xe9\x03\x86\xaf\x75\x71\xc8\xb8\xf6\x6e\x8b\x0f\xe2\xf8\x17\x19\x67\xa4\xcb\x82\xe1\x0a\xc1\x71\xcf\x5b\x6b\xc1\x91\xbf\xb6\xb3\x3a\xa9\x14\xd5\x7d\x2b\xee\xa5\x35\x5a\x69\x78\xca\x80\xe3\x56\x1e\xd0\xf9\x11\x3b\x5d\xdd\x47\xfe\x17\xb3\x93\x06\x75\x4a\x6a\xc5\x3d\xc2\x6d\xcf\xf2\x60\xec\x0e\xdf\xa8\x75\x2d\xac\x22\x1b\xf8\xbb\xd0\x2a\xe2\x60\x30\xd0\xe1\xf4\x37\x46\x7c\x93\x32\xbf\x5f\x20\x44\x8f\x5b\x5d\x4a\x12\xf9\x33\x31\xa4\x28\xbd\xfd\x76\xe1\x96\xa0\xd2\xf5\x4e\x94\x7e\x6f\xf6\x22\xff\x22\xee\xed\x2e\x0b\xfe\x51\xfc\x4d\xd7\xfc\x4a\xef\xf6\xba\xf2\xd1\x3c\xb4\x24\x49\x19\x05\x03\x40\x34\xc7\x1f\x87\xc3\xbd\x1e\x32\xb0\xde\x0d\xd7\x95\x73\x7b\x60\x2e\xe4\x07\xf8\x01\x53\xc6\xa0\xef\x41\x1a\xbc\x14\xb5\xdb\x97\x70\x83\x31\xc1\x8f\xc5\x06\x04\x14\x07\x67\x25\xc7\x7d\x96\xee\xa1\x1e\x7f\x09\x2f\x11\xf0\xbb\x22\xb7\xc1\xae\xc3\x88\x8f\xf9\xa0\x33\x88\x01\xc9\x8c\x3d\x6b\xba\x6a\xe4\xd7\x26\x73\x72\xca\x77\xf0\x51\x6b\x95\x55\x8d\x12\x25\xcb\xdd\x97\xf8\xd9\x17\x59\x57\xb2\xb4\x8a\xbd\x2a\xf4\x23\x37\xb0\xc5\xb8\x32\x46\x73\x5d\x0d\xdd\x12\x38\xdf\x90\x7c\x35\x2b\x27\xf8\x61\x76\xa6\xac\x14\x1c\x86\xf6\x0e\xc6\xf9\xa1\xae\x4b\x85\xa2\x6e\xad\xfa\x00\x89\xb5\xaf\x57\xa5\xac\x51\x0c\xd1\xbd\x2b\xda\x5c\x7a\xd9\xc0\xcf\x55\x5c\x87\x13\x8b\x27\x60\x5f\xcb\x26\xfa\x5e\xdd\x56\xf6\x68\x93\x78\x5e\xe9\xba\x96\x66\xaf\x31\x0a\x82\xea\x25\x51\x23\x2a\x7d\x22\x48\x14\x2d\x51\x59\x46\xfe\x19\x83\x3f\x57\x52\xba\x78\x23\x58\xed\x8d\xb4\x2b\x6c\x1a\x51\x96\x24\x39\x98\xc1\xea\xce\x74\x08\xc3\x02\xaf\x16\x5e\x86\x4f\x83\x60\x96\x8e\x43\x3a\x38\x51\x94\x76\x58\x4d\x48\x3e\x91\x41\x5b\x35\xb5\xb6\x43\xd2\xd6\xa7\xf3\x86\xc2\x88\x85\xb0\x46\xc3\x0b\x2d\x51\xc8\xdd\x79\x73\x4f\xfd\xd1\xf0\xee\x51\x85\x15\xc5\x79\x94\xe7\x94\x71\x63\x8d\xd6\xa5\x89\xfe\x60\x5d\xda\x10\xc1\x89\x83\x71\x4e\x6e\x5d\xdc\x24\xb2\x30\x55\x65\x4d\x3f\xbb\x96\x18\xcb\x48\x47\x1c\x9d\x48\xfb\xe5\xf4\x48\xe2\x68\x47\xfc\x9d\x15\xce\xaf\xc2\x9e\x88\x8c\x27\xbb\xc8\xe8\x92\xf0\xd7\x7d\x64\x3c\x78\x87\x0c\x32\x74\xd6\x88\x32\x3a\xb7\xb7\x78\x81\x27\xd5\xe9\x74\xf8\xe3\x46\xd7\x91\x74\x61\x64\x51\x76\xcf\x15\x86\x8f\x0b\x5e\xba\x55\xc3\xb4\xc2\xa1\x12\x3b\x8a\x89\x94\xaa\xfa\x22\x0b\x66\xda\xb5\x5f\x19\x50\x08\xc1\xbf\x30\xa7\xa3\xf7\x14\xf1\x08\x77\xe8\xfa\xc0\x54\xd5\xa8\x9d\xb5\x3c\x0a\xd1\x08\x17\x21\xc1\x8b\x0b\x02\xad\x24\x08\x9b\x52\x3f\xf2\xb5\x6c\x1e\xa5\xac\x50\x2a\xe0\x16\x8d\xc7\x11\x45\xeb\x45\xdd\x98\x64\x85\xf1\x80\xf4\x9d\x0f\x90\xf2\x44\x88\xbc\x99\xef\xe2\xa8\xb5\x81\x58\x6e\x2d\xdd\x31\x60\xa2\x6d\xf4\x4e\x34\x34\x45\x74\xbc\x8e\xdf\xdc\xf7\x3a\xbc\xfc\x4f\x0e\x26\x3d\xab\x5d\xad\xe7\xa3\x98\x46\xec\xfc\xc4\x38\xe7\xcf\x47\xfc\xad\x30\x2a\xe7\xb7\xde\x05\xb1\x1e\xe3\xb8\x2c\x5d\x64\xf7\x1e\xd2\x05\x7d\x0e\x2c\x48\xa5\xfb\xb3\x33\xdd\x1a\x89\x57\x8d\xb7\x06\x19\x45\x7d\x6f\x5d\x3c\xd4\x2e\x36\x64\x25\xea\x5a\x3e\x68\x70\x52\x5c\x8c\x8a\x24\xab\x01\x41\x8c\x02\x12\x90\xbb\x96\x10\x3b\x8c\x5e\x2f\xbf\x5a\x27\x47\x59\x63\x55\x6c\x36\xaa\xde\x19\x0c\x49\xb7\x55\xa9\x76\xca\x3e\x22\x0d\x15\x3b\xd5\x12\x0e\xa0\xf7\xe1\x60\x59\x75\xdb\xec\xdb\x06\xf7\xc4\x05\xc1\xac\x5c\x05\x7f\x11\x5c\x53\xfa\x37\x84\x50\xa3\x60\x35\x5c\x80\x94\x3c\xc7\x27\x61\x44\xab\x82\x58\x23\x5c\x2b\xf6\xb6\xcb\x75\x65\x1a\xd5\xb4\x0d\xd9\xdf\xe1\xe1\x14\x3d\x72\xcf\x13\xf9\x97\x4a\x3f\x96\xb2\xb8\x97\x26\x09\xb5\xeb\x0d\xdf\x08\x85\x99\x00\x1f\x29\xb6\xc7\xe3\x41\x94\x78\x33\x9b\xb0\x9e\xeb\x28\x2a\xc1\x4a\xf1\x38\x62\xec\xb3\x6e\xc1\x2e\xb6\xfe\x4d\x06\x8b\x42\xa6\x3f\xfa\xaf\xc9\x98\x4c\x48\x22\x14\x3a\xf2\x50\xbc\xeb\xca\xa2\x5d\x32\x9a\x97\xd6\x2a\x12\x34\x5e\x97\xb9\x83\x11\x3e\x2a\x23\x7d\x9a\x48\x01\xcc\x21\x97\x23\xee\x06\x83\x8f\x65\x9d\x77\x53\x88\xc6\x78\xe9\x32\xda\x0a\x0b\xaa\x60\xbb\x10\x5b\xf1\x40\xa1\xca\x1d\xfa\x6b\x89\xf5\xca\xe4\xd7\xbc\x6c\x8d\x7a\x70\x90\x89\x83\x6e\x41\x99\xbb\x90\x28\xa6\x6d\x9a\x2d\xdf\x88\x5c\x95\xa8\x74\xed\xe7\x42\x08\xd4\xbe\x87\xe2\x42\x91\x8c\xba\x34\x8d\xde\xed\xcb\x43\x40\x43\x60\x30\xad\xe3\x34\xd8\xc9\x7a\xb7\x0e\x2e\x4b\xab\xb3\x6a\x6b\x4a\x04\xa3\x26\x5d\x60\x50\x5b\x7e\xdb\xac\x5c\x68\xc8\xd7\xb4\x3e\x2a\x9e\x8c\xd1\x6f\x19\xc3\x65\xa3\x99\x22\xe6\xa2\xd0\x76\x5f\xe2\x85\xd0\x15\x6e\xcf\x5a\x6e\x45\xb9\xc9\xe8\x60\xc3\xaf\x30\xd8\xa0\x74\xc5\x28\x22\x68\x47\x02\x91\x5b\x9c\x1a\xcc\x7c\x5f\xeb\xad\x5a\x43\x0c\x43\xee\xf0\xb4\x38\x57\x1e\x63\x60\x94\x39\x83\x27\xfa\x59\xc8\x82\xb9\x79\xdb\xe3\x61\x28\x22\xad\x20\x28\x8f\xdb\xb5\x55\x7b\x5c\xcb\x83\x6e\x47\x8c\x5d\xf9\x45\xa3\x98\x46\x75\x20\x61\xcf\x55\x9d\xb7\x3b\x6b\xf9\x5b\x9b\x3e\xc9\x69\x5b\x01\xb1\x36\x3a\x29\x2b\x19\x69\x11\x46\x7a\x65\x2d\x4b\xfd\x38\xe2\x4b\xb0\x10\x29\x4e\x9a\x66\xae\x7f\xe1\x06\x97\x81\x5f\x5e\x80\x58\x41\x56\xa1\xad\x2a\x99\x4b\x63\x44\x7d\x40\xdd\xf9\x62\x64\x95\x5a\x63\x3f\x5a\xdd\xf3\x3b\xcc\x1a\xa1\x07\xbe\xc0\xa3\xfa\xce\x2e\xce\xb8\x6a\xd4\xf9\x15\x0c\xf9\xc1\xda\x90\xba\xe2\x37\x70\x10\x67\x3a\x55\x2e\x66\x6b\xa5\x63\x6d\xaf\x67\xb9\xb3\xda\x8b\x2e\x7b\x6b\x26\x6d\x36\x12\xc3\x00\x8d\xcc\xb7\x95\x2e\xf5\x3d\xa4\x94\x77\x52\x98\xb6\x96\x2c\xac\x50\x88\xfc\xf0\x52\x3c\xf2\x4d\x5b\x6e\x54\x59\x82\xcc\xac\x4b\x75\x4f\x6e\x1d\x7d\xde\x3a\x3f\xa5\xe4\x97\x97\xee\xde\xf9\x34\xbd\x9d\x47\x11\xa3\xa6\x96\xa2\x39\x70\x51\xe8\x7d\x83\x81\xaf\xe7\x17\xfc\x5a\xe6\x88\x50\xb8\xfc\xe9\xa7\xd7\x70\x9c\x5c\x10\x1c\x42\xac\x4e\x3c\xac\x05\x02\xd1\x13\xd3\xd4\x0a\x97\x28\x4f\x16\x41\x6f\xf0\x32\xa7\x39\xf8\xe4\x30\x9e\x2c\xf0\xd9\x53\x05\x99\x51\xb6\xd4\x2e\x83\x9d\x2a\xa5\x03\xf5\x23\xe6\x39\x36\xba\x5e\xab\x22\x7d\x09\xb3\xf3\xea\x5b\x31\xd3\x09\x2b\x60\x76\x26\x19\x9f\x32\xb4\xec\x98\x0c\x90\x5f\x65\x9d\x2b\x90\x16\x52\xc4\x3d\x37\x22\x88\xaf\xbd\x9b\xad\xa1\xec\x53\x37\xf1\x14\x44\x55\x30\x8c\xeb\x99\xbc\x14\x6a\x07\x33\x81\x04\x7d\x43\xd7\x14\x5c\x5e\x3c\xa0\x14\x5c\x3c\xce\x9b\x36\xc1\x38\x61\x14\x4c\x10\x98\x76\x94\x95\xd5\xaa\xe0\x34\x8a\x7b\xab\x68\x9b\xd8\xac\x05\x73\x24\xc3\x63\x89\x18\xb3\xba\x70\xf1\xae\x1f\x19\x2e\x26\xcd\xec\xc4\x6a\xf2\x93\xab\x89\x07\xe2\xe5\x88\x87\x43\xfb\xab\x83\x91\x5c\x61\xdc\x2c\x5c\x3c\xb4\xb9\xbd\x38\x13\x6f\x27\xfc\x98\xe6\xe7\xf0\x4e\x71\xb1\x38\xa6\x1a\xf0\xd8\xec\xda\xed\x64\xa1\xda\x5d\xc6\xfb\xd4\x73\x65\xf6\x2a\x6f\x75\x6b\x4a\x44\xb9\x44\xe1\xaa\xf2\xe0\x72\x3d\xd6\x40\x91\xc2\x6e\x3f\x82\x61\x9e\x0c\x6a\xfd\xc2\xbf\x48\xb9\xb7\x1b\x26\x72\x8c\x94\xe3\xef\x0d\x58\x2d\x68\xc5\x83\x4d\x1b\x9b\x49\xf6\xcd\x14\x2c\x71\x16\xc9\x83\x4f\xbd\x14\xe4\xae\x8b\x3c\xd7\xb5\x33\xbf\x49\x0b\xbf\x09\xb9\x0a\x07\x17\x3c\x3d\x00\x5a\x3f\xb1\x36\xb2\xca\x31\x0b\x57\x1d\x7c\x6c\xed\x17\x50\xe9\xf7\x70\x76\xac\x71\xe7\x93\x08\x27\x62\x5d\x5c\xc0\x5d\xee\xef\xb6\x10\xed\xf6\xdb\x88\x30\x08\x80\x21\xd6\x2a\x07\x63\xa4\xd2\xf4\xdf\xf6\x0e\x0a\x8b\x1a\x6f\x09\x58\x0f\x76\x2c\x07\xdd\x32\xfb\x1c\x4c\xfe\x9b\x76\xbf\xd7\x56\xdf\xd5\x21\x1c\x48\x40\x03\x70\x53\xc0\xba\xdd\x48\xb2\x82\x5f\xc5\x92\xf6\xd1\xb9\x53\x64\x09\x13\xa0\xaa\x47\xe4\x7a\xc2\xf8\xc1\x2e\x25\x13\xe3\x28\xfe\xe5\x1c\x6c\x45\xa6\x61\xf2\x25\x8a\xb3\xb8\x00\x4b\x2c\xb2\xe1\x0e\xf2\x76\x81\xdb\xd7\x97\x7d\xe2\x4a\xa9\x2b\x49\x09\x98\x0d\xc1\x34\xc2\x05\xf6\x33\x63\x62\x08\x96\x2a\x06\xf6\xec\xf5\x9e\x8b\xba\x3e\x44\x61\xc4\x8e\x34\x86\xa7\x07\x9f\x13\x63\x37\xec\x5e\x3d\xa0\x81\x5b\xcb\x52\x3e\x88\xaa\xb1\x6e\x94\x5d\xde\xf5\xdf\xf5\x0e\x84\x7f\xf9\x94\x25\x4c\x9e\xf5\x1e\x83\xd8\xae\x07\xe1\xc7\x85\x72\x57\xee\x1b\xb2\x83\xc9\xe3\x83\xa4\x06\x0d\xde\x30\x04\x2d\x84\x3f\x58\x4f\x87\xbe\xf7\xd2\xee\xd5\xe0\xc4\xe1\x18\x8c\x18\xcb\x87\x68\x6d\xda\x29\x39\xd3\x14\x6e\x80\xaa\x51\xb5\xf7\x6e\xa3\xc0\x5a\x8f\x7e\xc7\x44\x9f\xae\x24\x7b\xdc\x22\xaa\x01\xdc\x6a\xcd\xf7\xda\x18\x69\x5c\x62\x17\x8f\x54\x6a\xd0\xf3\x47\x85\x81\x12\xcc\x98\xe3\xc9\xce\xf0\x98\x31\x4c\x21\xa4\xd7\xb7\x5f\x10\xbb\x4c\xb0\x60\xa2\x44\x51\xca\x9c\x42\x80\x81\xc6\x17\x42\x06\xa7\x9c\x30\x57\xe8\x52\x66\xd6\xfb\x14\x75\x51\x4a\x03\x32\xb8\xd5\x8f\x88\x47\xb1\x4e\x15\x06\x04\x65\xd1\x19\x2a\x64\xe2\x99\x3d\xcc\x89\x03\x15\xaf\x9a\x73\x34\x83\x55\xf6\x28\x0e\x18\x44\x4c\xc3\x2b\x0f\xa2\x54\x56\xb2\x30\xaf\x1a\x3d\x90\xd0\x4f\x80\xc4\x32\x72\x2f\x6a\xd4\xca\xa4\xe2\x0b\x0c\x4e\x15\x43\x17\x73\x87\x17\x6e\x85\x79\x22\x29\x62\x32\xd4\x39\x68\xf8\x62\x9a\x82\x47\xe9\x11\x96\xa4\x47\x7e\xb1\x4b\x41\x01\xa1\xe4\xea\x39\x7a\x4b\x14\x40\x06\x59\x2f\x34\xe4\xf2\x7b\xde\x90\x26\x60\xe8\xb2\x85\x91\xfb\x58\x01\xb8\x29\x60\x3a\x83\x69\x0e\x81\x72\x0c\xea\xf9\xeb\xbd\xe3\x74\x62\x1e\x0d\xd6\xd8\xad\x13\x25\xc7\x0a\xb9\x97\x55\x61\x0f\x02\xf9\x28\x69\xb4\x08\x51\x3e\xaa\xe6\x15\xa6\x70\xc0\xd6\x49\x40\x4a\x47\xb6\x49\x88\x37\x31\x74\x46\x76\x6b\x08\xbb\xbb\xbc\xa5\x0b\xbf\xa0\x85\xb0\xe3\x82\x97\xf6\x16\xa8\x23\xb8\x13\x58\x2c\x90\x52\x7c\xd0\x65\xbb\x03\xa0\x89\xe0\xa6\xd1\xb5\xb8\x87\x4b\x22\xc9\x12\xba\xeb\x3b\x4a\xfa\x56\x7c\x20\xee\xef\xad\xd4\x36\x72\xe0\xf6\x26\x5a\x22\x90\x71\x44\x3a\x04\xf8\x92\xbb\xa6\xdd\xdc\x5d\x98\x13\xad\x29\xb8\x18\x11\x4d\xa2\x6b\x1e\xdb\x3a\x4c\x1f\x3d\xdf\xd9\x4a\x7c\x2d\x0f\x1a\x96\x84\xa2\x54\x21\xcd\x4e\x0e\x2a\xfa\x1d\x23\x3e\xad\xc0\xbd\x42\x7b\xb3\x1b\x32\xa8\xc0\xa6\x70\x13\x0a\x47\x23\x17\x2d\xa2\xf0\x52\xf5\x42\x17\x3e\xa8\xba\x9e\xc8\x90\x7f\x10\x5e\x84\xaf\xe3\x8b\x70\xa6\xab\x73\xba\x03\xdf\xe9\x7a\xd7\x7b\x01\x76\xc7\x76\x14\xd4\x3d\x7d\x6d\x19\xf6\x12\x44\xe4\xd5\xc9\xdb\x2b\x4a\xb5\xed\x44\xbe\x55\x95\x3c\xaf\xa5\x28\x40\x9d\xf5\xc6\x26\x7b\x5e\x96\x26\xe6\xec\x08\x2b\x19\x6e\xc3\x47\x71\xa0\x7b\xf0\x2a\xbc\x2b\x0d\x75\xc3\x4d\x2e\x77\x6b\x5d\x60\x88\x15\xf2\x6c\xdb\x83\x01\x83\x15\x2f\xf3\x86\x9f\xf9\xd8\x31\x8b\xfe\xda\x23\x99\xc3\x8c\xe0\x3e\xa2\x52\x01\x38\xd7\x1f\x81\x53\x5f\x65\xc1\x40\xf2\x8b\xb6\xc6\xb8\x96\x7b\x32\x3e\x8c\xe7\xad\x69\xf4\x0e\x33\xf8\x58\xcf\x11\xa1\x9a\x51\xcf\x20\xee\x13\xef\xe1\xff\xb6\x39\x0a\x5f\x8e\x02\xd6\x59\xc6\x41\x8b\x43\x24\x58\x34\xdc\xde\xf1\xf6\x44\xd4\x52\xf2\x83\x14\x35\x06\x50\xfd\x47\xac\x7e\x88\x02\x41\xce\xc0\xdb\xe3\x85\x03\xb2\x5c\xd3\x4a\xc8\x9a\x39\xc3\x0f\x43\x3c\x18\x5f\x80\xe1\xef\x74\x21\x4b\xb8\xea\xee\xc9\xe3\xb3\x92\x60\xef\x5d\xba\x6c\x1d\xfe\x2d\xac\x0c\xa3\x24\x22\xa0\x4f\x23\xb3\xf6\xa9\x90\xa9\xcf\x5e\xf8\x4d\x40\x08\x1a\x8d\xc2\x25\xff\x4e\x84\xfd\x08\xd6\xf6\x1d\xfb\xcd\x9e\xdc\xef\x8c\x2c\x5c\xb4\x9e\x2b\xcd\x77\x1a\x73\xee\x14\xac\xa9\xa5\x30\x1a\x53\x6b\xb9\x36\x8d\xd5\x33\xee\x5d\xd6\x93\xf1\x49\x04\x9f\xc4\x22\x95\xe0\x6d\x52\x90\x98\xb3\xe7\xc3\x08\x54\x47\xa6\xb9\x64\xfd\x8b\x63\x6d\xdd\x23\x3c\xa1\xb0\xe6\x1f\x99\xfe\x68\x53\x91\x8c\x46\xba\x31\xf5\xe7\x62\xc1\x25\xa4\x44\xbc\x31\x24\x67\x0c\x85\xa4\x03\x57\xec\x0d\x83\xa3\xa9\xe2\x80\xb7\x70\x3f\x1b\x17\xb9\x81\x34\x24\xd3\x79\x2e\x0c\xd8\x4b\xe4\xf7\x55\xba\xca\xf5\x6e\x67\x1d\x78\xfb\x3b\xbc\xe9\x5c\xc0\x36\xf2\x2b\x8b\x23\x81\x42\x77\xac\xc5\xbc\x23\x9d\x85\xae\xb3\xd6\xae\x9d\xa9\xf6\x7a\x8d\x26\xcb\x89\x73\xbb\x26\x67\x07\xec\x6e\xdc\x06\x5a\x65\x4c\x75\x40\x78\x6a\x5f\x8a\x5c\xf2\xb3\x7b\xeb\xfd\x03\x7c\x00\x05\x03\x97\x7c\x48\x43\x87\xc5\x0a\x31\xdf\x0e\x52\xb2\x6f\xd9\x18\x79\x2a\x18\xff\x17\x07\x8f\x54\xf1\xbf\xc4\x17\xe3\x06\x6f\xda\x1a\x23\x6d\xb8\xd1\x60\x38\x3b\x0b\x86\x91\x01\x1e\xfb\x90\x91\x34\xf5\x1f\xb5\x8e\x37\x19\x65\xf7\x3c\xa8\x02\xdf\x1f\x3f\x29\xd1\x79\xe6\x48\x18\xb3\xe3\xd7\xb9\x7b\x85\x70\x71\x78\x36\x3d\x12\x93\x64\xf8\x0c\x63\x2b\x78\x98\x41\x41\xd9\x05\x0e\xf1\x90\xc3\x10\x21\x2a\xa4\x99\x4c\xbc\xd0\x04\x75\x8a\x02\xc6\xd1\x65\x08\x7e\x96\xb0\xde\x87\xaa\x38\xd4\xd8\x85\x88\xaa\x61\x95\xfc\xea\x63\x42\xf1\xcc\x8c\x80\x27\x3e\x3a\xb8\xed\x46\x51\x86\xad\x5f\xfa\x17\xde\x9a\xb7\x4a\xe0\x31\xc0\x71\xf9\x56\x9b\xc6\x9c\xfc\x66\x46\x82\x6e\x07\xe8\x62\x81\x71\x65\x0c\x8b\xdc\xb8\x14\x8b\x1e\xa9\xf3\x90\xd7\x35\x56\x3c\x31\x1b\x6b\x12\x9f\xcc\x5a\x1d\xf2\xe4\x11\x68\x21\x80\xb6\x97\xb2\x3e\x6f\xf4\xb9\xfd\x7f\x84\x43\x79\xdc\x60\xb2\x98\xaa\xb2\x6a\x8d\x91\x19\x24\xad\x4d\x46\xcb\xd4\x79\xac\x3d\x14\xbd\x72\x17\x63\x10\xac\x51\xbb\x96\xa8\x15\x37\xa0\xcc\x69\x37\x28\x85\xeb\x81\xe4\x91\x8e\x73\xce\x69\x74\xc6\x0b\xaa\x23\xb0\x96\x38\xe8\x7c\x5d\xc7\x71\xb9\x68\x58\x99\xbd\xad\x4c\x9a\x2a\x55\x06\x83\xf1\x05\x14\x73\xea\x1d\x3b\x7d\x64\xac\xc4\x27\xb9\xe8\x43\x16\xdc\x88\xb5\x4c\xc0\x1e\x5e\xe3\xb3\x23\x9d\xeb\xd1\x38\x77\xd6\x59\xba\xc5\x7b\x6d\x00\x03\x89\x6f\xcb\x41\xae\x2b\xd3\xee\xd0\x94\x87\x8f\x64\xe4\x0c\x04\xb8\x4f\x23\xaa\x7b\xb5\x2e\x25\xdb\xcb\xda\x80\x3f\x6a\x3d\x1f\x59\x37\x87\x18\x39\x52\xef\x40\xf1\xfa\xfb\xce\x7d\x38\xe3\x1b\xb1\x53\x25\x80\x74\xf8\x56\xb7\x46\x6e\x75\x59\x30\x4a\xe7\x98\x70\x43\xb9\x2c\xaa\x4f\x00\xc3\xa5\x59\x16\x84\x76\x74\x55\x10\x88\x41\xb4\x36\x33\x2f\x1e\x25\x04\xb9\x47\x6c\x5a\xf1\x42\x5a\x63\x52\x55\x74\xaa\x10\x30\xe8\xcd\x0a\x45\xb8\xb7\x64\xae\x19\x2f\x74\xbb\x6e\x36\x6d\x89\x10\x7d\x8c\xc5\xb3\x35\x60\x53\x75\xf9\x80\x8b\xbc\x11\x0f\x08\xb3\x07\x63\x40\x58\xc5\xf8\xae\x07\x46\x04\xaf\xf1\x37\x0a\x58\x53\xe1\x03\x50\x08\x95\xf1\x41\xb2\x4c\x09\x90\x98\x37\x87\x3d\xd8\x10\x1a\x61\x64\xba\x0a\x68\x1a\xd1\xf0\xbc\x14\xe8\xc8\xbb\xa1\xb3\xd4\xbf\x77\x19\xd4\x36\x54\xa2\x84\xd1\x81\xbf\x8c\x73\x80\x63\x21\xa0\xe2\xcd\x03\x4f\x58\xf7\xa3\x22\x6f\x5a\x37\x4a\xdc\x20\xf9\x75\x2f\x73\x34\xe1\x40\x94\xf7\x18\x20\x6f\x34\x16\xb3\x50\xe5\x8b\x1d\xd8\x88\x8d\x9f\x5e\xf4\x4e\x60\xc2\x6d\x55\xf4\x08\xf0\xc4\xed\xd9\x6b\x84\x07\xdf\xd0\x2d\x6e\xaf\xe1\xa2\xb5\xa6\x2c\xae\x54\xa5\xab\x73\xff\x02\x1c\x6d\x5b\xc1\xa3\xe1\xf6\xb6\xbf\xe1\xb5\x24\xb8\x1e\xcc\x15\xee\x7f\x2b\x60\x10\xee\xc3\x28\x93\x24\x00\x5f\x54\xc4\x83\x53\x61\x83\x29\xc2\x57\x50\xec\xa6\xa0\x98\xe0\xbf\x1d\x4a\x26\x3e\x5d\xd1\x91\xd9\xc9\x66\xab\x0b\xbc\x25\x72\x59\xb4\xb5\x34\x19\x13\x6d\xb3\xd5\x35\x21\xb4\xf9\x17\x79\xc0\xb5\x45\x3d\xa7\xc2\xb3\x9d\x5e\x2d\xb0\xfc\x07\x06\x80\xa5\x3c\x00\x9b\x09\x05\x10\x2c\xad\xd3\xeb\x3a\x79\x20\x38\xc9\x00\xc9\xee\x38\x2a\xfe\xd0\x1b\x66\x3d\xeb\x53\x86\x97\x4c\x46\x07\x71\x16\xd3\x6e\x36\x0a\x2f\xee\xa8\xe4\x05\x56\x38\xd7\x55\xa3\xaa\xd6\xaa\x81\xb6\x02\xed\x49\x26\x69\x52\xbb\xd1\xb9\xe5\x55\x05\xda\x57\x18\x00\x2c\x3e\xc8\xaa\xb1\x4e\x95\x8b\xf2\xe0\xb4\x10\xa2\x02\x99\xbe\xb5\x44\x3f\x3a\x49\x91\x58\xb1\x59\x4b\x59\x41\x99\xd6\x88\xb1\xe9\x26\xc9\x2a\x55\x47\x0a\x32\x8e\xf5\x39\x45\x4f\x5e\x96\x7d\x19\x66\xb9\x22\x6c\x0a\xa4\x6e\x5b\x23\xc9\xf5\x8a\x97\x36\x20\x64\x22\x2b\x3c\xcf\x5b\xeb\x25\x99\x90\xd3\xc3\x6b\x0f\x11\xc4\x2c\x3e\x83\x9c\x6a\xe5\x36\x71\x4c\xd1\x3e\x32\x12\xcb\x64\x2b\x95\xf1\x88\xe2\x5a\x16\x8c\xee\x34\x6f\x9c\x11\xc8\x68\x2f\x9b\x56\x35\x00\x23\xa7\x58\xba\xf5\x56\x11\xae\x71\xd6\x1b\x21\x64\xd1\x08\xc1\x03\xda\x8a\x5a\xe4\x8d\xac\xd5\x7f\x12\xd4\xf6\xc4\xc5\x85\xf3\x4e\x20\x23\xcc\x2d\xaa\xe3\x01\xe8\xf1\xa9\x4f\x1d\xb0\x11\x7f\xdb\x36\xae\xb2\xcc\x9b\x19\xcc\xc7\x51\x30\x62\xa2\x36\xbc\xa2\xfb\xcc\x6e\x75\x45\x04\x09\x91\x55\xc7\x6b\xd9\x00\xfa\x00\xb3\x24\xd6\x7c\x3b\x44\xe7\x8a\xf5\x0a\x24\x25\x09\x92\x05\x07\xec\x9a\xc7\x5c\x25\xb1\x49\x10\x3a\x7a\xa0\x2c\xec\xbe\x2e\xe6\x1f\x87\x84\x21\x8a\x03\xd7\x91\xa3\x73\x6a\xde\xc7\x18\x35\x91\x2c\x00\x61\xdd\xec\x01\x8b\x1f\xe7\xfc\x69\x6b\x14\x02\x0a\xdb\xa5\x53\x40\x88\xdb\x7d\x21\x1a\x42\x39\x50\x36\x04\x6c\xdd\x70\x62\xfc\x2a\xd4\x61\x22\xa1\x5e\x90\x84\x2a\x73\x72\x74\x2c\x8d\x15\x05\x21\x55\xc3\x9f\x7e\xe8\x88\x8f\xbd\xd7\x12\x4c\x7b\xb2\xdc\x0b\x69\x45\x83\x3d\x6e\x65\x75\x94\x95\xe1\xaa\x31\xb2\xdc\x78\x1c\x85\x4b\xee\x15\x56\x89\x49\x44\x03\xc1\x1d\xd5\xf8\xea\x38\x97\x0a\xde\x4a\xff\x22\x5d\xf3\x07\xa5\x4b\x58\x0d\x98\x5b\x5b\x12\x68\xcd\x91\x5a\xb8\x42\xa8\x18\x57\x26\xf2\x5a\x1b\xcc\x43\xd0\x83\x00\xa9\xf0\xc4\x29\x40\x7d\x70\x72\x93\x9d\xbd\x1b\xb9\x95\x8c\xdc\xa4\x48\x17\xb9\x63\x63\x3f\xc3\xf1\xcb\x3e\x32\xe1\x4b\xea\x5c\x61\xbe\x2c\xb0\x4e\x19\xca\xdb\x8f\xe1\xb2\x27\xb0\xb2\x7d\xa8\x31\x72\x37\xe1\xed\x24\x7a\xac\xd2\xa8\x09\xad\xf1\x27\x8c\x79\xb4\x7e\xb0\xae\xed\x25\x06\xcb\xd5\x56\x7b\x91\x7f\x81\x1c\x74\x2d\x45\x41\x60\x15\x72\x9b\x30\x66\xf9\x66\xc4\xc7\x21\xa3\xb1\x92\x18\xa9\x1c\x44\xbf\x0b\x59\x02\x33\x80\x88\x6e\x04\x3f\xb1\xf2\x5d\xd2\x21\x3a\x15\x37\x64\xeb\x83\xc3\xa4\x60\x11\x01\x96\xb5\x01\xd8\xae\x92\x98\x51\xaf\x11\x1b\x8e\xd8\x2c\x4a\x48\x25\x03\x8b\x06\x81\xbe\x91\xa0\xac\x0d\xe5\x67\x1c\x80\x00\xd3\x47\x2e\x77\xe0\x41\x1c\x80\x9d\xc0\x4a\xae\x66\xeb\x3c\xed\x03\x7b\xc4\xea\x91\x18\xa6\x1d\x47\x93\x7a\x8a\x1d\x7c\xb2\x06\x03\x6c\x47\x05\x3e\xa5\x78\x04\x1f\x5a\xf4\x0e\x9d\xd4\xa3\x83\x67\xc7\x00\x52\x9f\xc4\xc4\xb0\x9b\xa8\x1b\x46\xa7\x0f\x4c\xf7\x28\x27\xe3\x14\xb9\x76\xf5\xb9\xf8\x6c\x4c\xf7\xf4\x2c\x02\xe1\xbc\xd8\xbd\xb5\x43\xaa\xe3\xa8\x99\x2f\x09\xc2\x8b\xc7\xcd\xba\x7f\x06\x27\x70\x21\x18\x42\xea\x43\x88\xd8\x49\x08\x2a\x4f\xc7\xda\x0b\x3b\x20\x8d\x31\x44\x76\x62\x99\x28\xb5\x2b\x1a\x2a\xc8\xb1\xfa\x0d\x6c\xa4\xea\xe0\x17\x4d\x35\x23\x7e\x16\x24\x84\xc5\xdf\xa7\x95\x73\x61\xd3\x00\x59\xa5\x14\x8c\x7e\xa4\x51\x88\x12\xfc\x35\x59\x63\x94\x00\xbc\x0d\xab\xe6\x98\xcf\xd2\x06\x88\xf3\x68\xe8\x01\x72\x14\x9d\xe9\x1f\xbc\xd5\x10\xa4\x0c\x33\x4c\xaa\x32\x0a\x6d\x80\x6e\x4d\x97\x28\x45\x9d\x41\xfa\xcd\xd1\x12\x40\x9c\xb5\x0f\xfd\x10\x4d\x15\x80\x4b\x8d\xdd\x40\x28\xbd\x70\xb8\x2f\x47\x76\xa1\x1f\x54\x28\x6f\x8d\x25\x1b\x4b\x4c\x08\x01\x06\x19\x83\x02\x8c\x95\x53\x3b\x08\xc8\x78\xb2\x93\xc3\x0d\x14\x12\x3d\x5b\x28\xf3\xf5\x35\xc9\x1e\x5d\x36\xfc\x2e\x0d\x41\xa1\x28\xfb\x27\x4c\x27\x5c\x13\x1e\x07\x9c\x46\x07\x40\xd0\x35\xe6\x8f\xa0\x26\x44\x39\x9b\xc1\x07\x94\x1c\x80\x37\x7e\x8b\xb3\x74\x0c\xbf\x7c\x05\xca\xf3\xf2\x75\xf7\xdd\xbf\x70\x5d\x43\x78\x7f\xe1\x6b\x28\xc1\x2f\xa9\x1f\x7c\x06\xd0\xd7\xa9\xc4\x81\x5f\x4c\x5b\x79\xb8\x47\x4d\xcb\xc3\x44\xe3\x03\xfa\xc6\x5b\xfb\x01\x6c\x57\x3b\x90\xc2\xc9\x3c\xa5\xcb\x64\xa2\xd8\x60\x6a\xcb\x9a\x16\x02\x7d\x68\xd5\xe0\x88\xf3\xa1\x3d\xe0\x0e\xdc\xc5\x77\xca\x78\x87\x2a\x41\x26\xe9\x5a\xdd\xab\xca\x3b\xac\x41\x32\x01\x0e\x46\x53\x46\x95\xda\xf5\x3f\x4c\x40\x85\xb9\xf1\xaf\xa5\xa3\xa9\x52\x55\xbc\x1a\x8f\x50\x82\x66\xc2\x6e\x30\xbf\x17\x38\x00\xe1\xd9\x4b\x70\xf8\xc5\x90\xdf\xb8\xcd\x6c\xb0\x16\x0d\xc3\x13\x70\xfd\xd9\x8d\x75\x91\x08\x60\x7e\x11\x3b\xfc\x0f\x4c\x7a\xeb\x3a\x5a\x71\x9f\x34\x74\x83\xc4\x17\xc8\x21\xbf\x96\x79\x89\x8b\xd6\x68\x84\x46\x77\xc0\x62\xb5\x28\xa4\x9d\x0e\x82\xf3\xc8\x89\x80\x20\xfd\x4e\xe2\x5f\xf1\xcd\x19\xf3\x1f\x45\xdf\x90\xcc\x39\x58\x0b\x83\xef\xdb\xc4\x12\xa4\xaa\x42\xee\xaa\x04\x25\x16\x46\x0e\xe6\x11\x0e\xfd\x68\x5b\xf8\xfa\xc0\xa2\xdc\x0a\x6a\x58\x93\x4c\x8f\x9f\x79\x0c\x5a\x67\xab\x54\x33\xc4\x93\x84\x64\x34\x10\x2d\x60\xc2\x98\x76\x47\x77\x2e\x0c\x23\x32\xb6\x3b\x56\xa4\xe3\x31\x8b\x3e\x43\x57\x1e\x22\x5f\x7a\x9f\xe9\x4b\x62\xd5\x0e\x71\xc0\x04\xeb\xef\x9f\x30\xa1\xd9\x51\x3f\x75\x20\x58\x5d\x60\x05\x5c\xb3\xb9\xae\x8c\x2a\x40\x23\x0d\x5c\x1c\xdc\xa3\x18\xad\x45\x02\xf6\x19\x9d\x29\xeb\xe8\xbb\x3c\x8b\xc7\x8c\xfa\x90\xb6\xbb\x0f\x53\xf4\x1a\x62\x70\x70\xe6\x2c\xdc\x2d\x99\x3b\x73\x10\xe9\x86\x93\xd9\x07\xb1\x39\x75\xa7\xb2\x28\xc4\x2e\xd0\xaf\x73\x16\xa2\xe0\x3d\xf3\x08\x9a\x96\x2e\x47\x5c\x79\x59\xef\x46\xd6\x5f\x16\x1e\xed\xe1\xcc\xca\x78\x78\x3d\xcf\x03\x5b\xa0\x87\x83\x80\x61\x29\x46\x02\xe5\x4d\x6f\x06\x7f\x67\x17\xc5\xf1\x7d\x15\x84\xd0\x4d\x9c\xd1\x55\x10\xe9\xf5\x50\xf3\xc9\x03\x3b\x55\x9a\xa3\x06\x94\xd6\xf1\xa8\x83\x1b\x69\xda\xfa\x01\xe8\x7a\xac\xf6\x89\x39\x14\xe2\xf1\x87\x58\x02\x0c\x16\xad\xd2\xa3\x21\x77\x12\x44\xb1\x25\x9f\x05\x64\x36\xdc\xe8\x99\xcb\xcb\x78\x14\x56\x5c\x7a\x93\x71\x81\xd5\x10\xb0\xfe\x0e\x01\xd0\x15\xda\x40\x6a\x80\xce\xbf\x3d\x0a\xf4\x75\xf0\xf2\x48\x96\x54\x55\x80\x72\xe8\xcd\x35\xc4\x76\x2d\x19\xe4\xe3\x23\xd4\x51\x74\x72\x74\xf7\x2c\x65\xce\x02\x22\x94\x75\x04\x8c\x43\x50\x44\x64\x4e\x3a\x23\xc9\x53\x74\x58\xfd\xd6\x38\x6b\x39\x58\xec\xbf\x90\xab\x6e\xa5\x33\xce\x30\x30\xb4\x69\xc9\xdd\x7f\x14\x84\xc7\xfe\xd3\x08\x9c\x09\x55\x61\xd8\x20\x80\x1f\x90\x36\xca\xd5\x37\x04\x72\xa0\xce\xb6\x51\xbd\x31\x0c\xc1\xde\x6b\xa6\x3c\x78\x21\x62\x3d\xfc\x0d\x40\xba\x28\x9a\x46\xee\xf6\x4d\x54\xe4\x80\xbe\xf8\xd1\xcb\xf0\xf4\x3e\x68\x55\x20\x48\x0b\xe0\x60\x69\x35\x50\x43\xa3\x97\x49\xbd\x47\x0f\x0c\x2d\xce\xec\x83\x7d\xda\x44\x44\x23\xc7\x25\x3b\x32\x84\x41\xc4\x7d\x2d\xf6\xdb\x44\x5d\x5d\x0e\x47\x2c\xaa\x8d\xa3\x50\x99\x14\x06\x91\xa2\xe8\x24\xf7\x9a\x74\x0d\x99\xe5\xa1\xd4\x03\x32\x1a\x49\x3c\xbc\x6b\xb0\x21\x4a\x10\x82\x00\xe8\xa8\x0e\x83\xd1\x88\xb9\x59\x0a\xdb\x8a\xca\x2e\x7a\xa3\xca\x5e\xbb\x2f\x29\xfe\xa9\x0a\x2b\xc8\xe9\x12\xa6\x35\x28\xb8\xe4\x67\xeb\x21\xc8\xb0\xc0\x12\xf7\x2c\x60\x8b\x3a\x0f\xdf\x08\x55\xc2\xc1\xb6\x47\x67\x43\x49\x42\xfc\xac\x5f\x0e\xab\x86\xe0\xd6\x8e\x6c\x12\x0c\xfb\xee\x6b\x85\x35\xad\xaf\x2f\x78\x01\x56\xca\xa6\x71\xd5\x08\xd2\x18\x27\x9d\x1f\x75\x2d\x35\xac\xf9\xd1\x12\xf2\xdf\xb2\x84\xd1\x8c\xd8\xa9\x09\xc1\x3c\x94\x34\xbd\x33\xe1\xa7\x66\x92\x21\x80\x53\xa1\x35\xb0\x51\xb5\x69\x78\xa3\x76\x32\x38\x0e\xfe\x46\x23\x1d\xa3\x37\xa7\xe5\x85\x9d\xb9\xdb\x1e\x2b\x3d\x53\x8f\x2b\x1e\xae\xc7\x07\xf3\xbc\xa5\x64\x5f\x78\x2a\xac\xae\x55\x74\x2f\x92\xd5\x25\x94\x44\x2e\xd5\xde\x6b\x4a\x1c\xd4\x88\xb1\x48\x2d\xf8\xca\x94\xe3\xd3\xe5\x4e\x84\xbf\x12\xc2\x79\x6c\x22\xb6\x3f\xc0\x5e\x20\x6c\x1e\x2c\xa6\x74\x21\x1c\xf8\xc1\xbf\x00\xa6\x69\xe7\xd2\xc7\x00\x33\x4d\x07\x03\x8f\x82\x88\x99\x7f\x75\x41\x00\x86\x26\xde\xe7\x68\xfb\x33\xaa\x1d\x02\xb8\xde\x7f\xb4\xa2\x04\xff\x51\x7b\xd6\x8a\x4a\x3e\xa6\x3c\x85\x3e\xdf\xef\x2f\xd6\x14\x7f\x7b\x79\x81\xda\xf4\x27\x8c\xcf\xed\xa1\xca\xc6\x7a\x0a\x64\x6c\x52\x52\xef\x03\x56\x5e\x25\xe0\x7e\x87\xbd\x8b\xb3\x16\x22\x47\x12\x87\x4e\x45\x94\xae\x0b\x84\x7b\xb8\x71\x62\x45\x13\x79\xf6\x2c\x8d\x50\x58\x4d\x9b\xab\xb2\x14\x08\x43\xf6\xfc\x1d\xc7\xb9\x0e\x08\xb4\x83\x3d\x4c\xe9\x01\x61\x18\x26\x9e\xe4\x7f\xb4\x0e\x16\xff\x8d\x1c\x74\x3c\x2a\x0a\x34\x94\xea\x8b\xb4\xba\x3d\x58\x0b\xce\xb9\x17\x7e\x89\x22\xda\xb4\x4a\x63\xfe\x32\xe1\xc0\x89\xe1\xb5\x56\x3f\x1b\x70\xf8\x53\x80\x6d\xef\x25\x05\x90\xe9\xb4\x4c\x50\x52\x9d\x30\x3a\x7c\xc8\xfe\x12\x95\xed\x90\x0e\xa7\x82\xb2\x9e\x1d\x88\x99\xbb\xec\xe9\x0f\x7c\x2f\x58\x1c\x87\x2b\x0c\xb8\xb1\x63\xe7\x9c\xec\x08\xba\xa4\xc2\x02\x1c\xb9\xd8\x48\x7d\x03\x10\x57\xce\xc1\x2c\x1e\xbb\xeb\x8e\x3e\x43\x96\xf3\xb5\x7e\xac\x4c\x53\x4b\xb1\xe3\x0b\x8f\x29\x19\x31\xe4\x47\xf2\x0a\xe7\x44\x4d\x50\x9a\xec\x48\x2f\x54\xda\x46\x2b\x03\x89\x7a\x4d\x9c\x44\xef\x35\x64\x54\x24\x9a\x85\xa5\x8f\xeb\x22\x91\x79\x04\x40\xd6\xa6\xc5\x14\x01\x98\x5b\xf1\xb2\xa6\xa7\xc0\xec\xad\x2b\xe1\x60\x14\xbe\x3a\x07\xeb\x06\x95\x5d\x33\xb4\x65\xa3\x42\x9c\xc8\x62\x0c\x04\x57\xe3\x8a\x0f\x64\xd5\x80\x7b\x14\x72\x32\x03\x34\xed\xe3\x2c\x8d\xcf\x03\xe1\x5b\xb0\x90\x10\x2b\xc8\x62\x4e\xa8\xcc\xda\xe4\x51\x5a\xd5\x9e\x13\x6b\x8c\x18\x23\x11\x68\xaa\x2b\x32\xca\xda\x35\xa0\xba\x30\xc8\x93\x3e\x03\x44\x54\xd6\xf7\x68\xe2\xc7\x84\x53\xd6\xfb\x79\xfa\x98\x22\x70\xd7\xa1\x9f\x2a\x7e\x3c\xb9\x8c\x01\x92\x1b\x13\x37\xb0\xcc\xd6\x86\x8f\xa6\x6a\x35\xaf\xdb\xde\x2e\xa4\x0c\xc0\x1e\xa5\x09\x1f\x60\x8f\x5b\xd1\x00\x03\xa0\x57\x85\x0e\x41\x8f\x19\x10\x4c\x92\x1f\x7e\xb4\x97\xb7\x2c\xa0\xcc\x0f\xe3\x26\x90\x75\x94\xa6\xe1\x5b\x51\xa0\x27\xd0\x96\x50\x3b\x11\x63\x57\xf7\xb5\x7c\x50\xba\x35\xc1\xc0\xca\xf8\xbe\x6c\xed\xb8\xa8\x8e\xae\x5b\x20\x70\x12\xb8\x94\x90\xb2\x38\x51\x3d\x31\x26\x6f\xbf\xc4\x7f\xdf\x0a\xc3\x54\xd3\x21\x1a\xa5\xb2\x34\x7f\xbb\xcb\xcd\x46\xd7\x8d\xe9\x98\xc8\xe4\x4e\x5b\x85\xd3\xe7\xf7\xba\x5c\x18\x15\xc2\xf9\xb1\x12\x8e\xda\x19\x9d\xf6\x8e\x87\x6a\xec\x7e\xd2\xb3\x94\xb0\xe0\xd0\xf3\x7a\xe6\x8f\xaa\x94\x19\xaf\xf5\x41\x94\x94\xbc\xd2\x11\x26\x0d\x8f\x54\x34\x94\xbe\x72\x75\x76\xcc\xf2\x93\xbc\xb1\x52\x0d\x44\xc3\x4a\xd5\x50\x69\x64\x64\x5a\x5b\xa9\xaa\xb5\x31\xe7\x10\x17\x44\x37\xb6\x05\xc4\x26\xd4\xed\x41\x2a\xa6\x14\x8f\xa6\x55\xcd\xd0\x9e\x1f\x79\xef\x3d\xf5\xc8\x28\xa7\x0f\x07\x3d\x5d\x84\xe4\x44\x86\x57\x51\xc6\x0d\xa2\x57\xb2\x00\x0f\x04\x9c\xa8\x28\xf1\x18\xda\x95\xa9\x7d\xdc\x2a\xd0\x92\xa1\xf1\x1f\xe0\x47\x50\x31\x61\x55\xed\xe5\x88\xdf\xc2\xeb\x8d\xe3\x3c\xab\x30\x44\xa8\xeb\x81\xc3\x62\x74\x2c\x44\x7b\x9e\x7c\xb8\x15\x00\xf0\x3d\xbb\xd7\xb9\x97\x23\x66\xb4\x84\xbe\xc4\xfd\x59\x19\x2c\xb5\x1a\x85\x82\x22\x28\x62\x76\xa4\x78\x2c\x80\xfe\x29\x5f\xee\x46\xf9\xa3\x49\x06\xed\xc9\xdf\xa8\x5a\x22\xf9\x9c\xa7\x66\x49\x96\x9c\x12\x47\x56\xaf\x25\xbf\xe6\xfa\x91\x10\x45\xa4\x1f\xcb\x10\x51\x88\x1e\x9c\x05\xe4\x50\x59\x4b\x51\x1c\xb8\xc8\xc9\xa8\xb1\x87\x4c\xd6\x12\xcd\x4e\xf7\xdb\xcc\x5d\x0f\x56\x3d\x40\xa2\x8e\x76\xdb\x1b\xd7\x3b\x51\x55\xd6\x38\x08\xb5\xca\xc7\x50\xe2\x4d\x47\x30\x40\x4f\xa3\x6c\x78\x16\x81\xce\x92\x60\x0e\x86\xae\x7a\x97\x28\xa6\xa9\x86\x21\xf1\xb5\x64\x61\x48\x90\x0c\x12\x0e\x92\x13\x59\x46\xee\xd8\xf7\xd5\x9b\x46\xef\x76\x68\x13\x3c\xcc\x71\xd4\x14\xe6\x13\xd8\x45\x32\xda\x45\x5d\x0e\x02\x0d\x49\xc0\x38\x34\x1a\xb5\x86\xdb\x21\xe3\x4a\xb2\xa1\xaa\x0a\xb8\x77\xec\x9a\x61\x44\xce\xc0\x47\x3c\x82\x34\x8e\x07\xb8\x37\xb3\x70\x65\x4e\xb0\xf6\x30\x2c\x17\xda\x5c\x18\xba\x81\xd0\x85\x2f\x89\xcf\xac\x64\x96\xc5\xa3\x2a\x82\xba\x39\x47\x06\x17\x18\x96\xd7\x47\x49\x51\x79\x24\x81\x27\x04\x30\x73\xd4\xd3\x19\x42\xa3\xec\x46\x66\x84\x73\x0e\xc7\x1b\xcf\x76\x60\x20\x41\x9e\x84\x27\x8c\x10\xe9\xb8\x24\xc0\x11\x39\x21\x15\x23\xc6\xa6\x2e\x00\x53\x96\xfa\x11\x75\x07\xce\x89\xae\x28\x08\x2e\x0d\xd2\xd0\x01\x2a\x87\xea\xe0\x02\x20\x5c\xdc\xd7\x12\xd1\x06\x94\x09\x57\x0d\x06\xd7\xa8\x74\x8a\x17\xb2\xd2\xe4\xa8\x20\x3d\x37\xc0\x80\x80\xdc\x01\x9c\x58\x78\xfa\x99\x27\x3e\xab\xdc\x93\x59\xd7\xf0\x05\x92\xf4\xe8\x3b\xf0\xbe\x07\x59\x09\x2c\x38\x04\xc8\x29\x6f\x29\x62\x8f\x1f\x89\x79\x0f\x87\x23\xa0\xff\x83\x5d\x1e\x10\x60\xbb\x13\x17\xc1\x40\x1d\x5a\x14\x9e\x9b\x91\xa8\xc1\x11\xdf\x7d\x62\xb6\x27\xe7\x15\x17\x59\xc3\x73\x8f\xa1\x46\x1d\x63\xf5\x4b\x05\x7b\x01\xa6\x69\x89\x06\x77\x75\x34\x50\x8f\x20\xea\x07\x16\x24\x94\x9c\x04\x81\x49\xf1\xba\x18\xcd\xf7\xe4\xd8\x56\x96\xad\xac\xf8\x82\xdd\xe2\xdb\x75\x37\x81\xc7\x30\x30\xf6\xba\x97\xb0\x4e\x4d\x80\xbf\x99\x21\xe1\x9f\x72\xfb\x62\x1c\xc1\x47\x8a\x30\xf2\x19\x70\xa7\xcc\x15\x41\x9d\x80\x12\x35\x1a\x42\x8a\x3a\xbc\x3c\xa0\x44\xeb\x1a\x49\xf1\x35\x2f\xe4\xbe\x56\x0f\xd2\x3a\x54\x35\x20\x43\x68\x89\x22\x86\x6f\xdc\xa2\x44\x1c\x7c\xa3\x95\x28\xd4\xe2\x08\xb4\xd8\xd9\x0b\xff\x86\xec\xef\xd2\x45\x7e\x29\x99\x95\x9c\xaf\x8d\xa4\x40\x2b\xe9\x14\x56\xc6\x4e\x92\x77\x7f\x02\xa4\x7e\xc4\x07\x7f\xe9\x0a\x8b\x23\xcf\xf3\xe1\x17\x4a\x8e\x78\xa2\x18\xa2\x15\xb5\x37\x82\x73\xf5\xbb\xa2\x45\xac\x1c\x2e\x1e\xdf\x74\x8a\x00\x81\xd3\x9c\xe8\x36\xd1\xe8\x72\x81\x15\x1c\x17\xd6\xc6\xf5\x95\x0f\xf2\xf4\x9b\x78\x13\xba\x23\x9a\xc0\x2e\x54\x61\xd5\xe5\x06\x09\x4c\x71\x7c\x21\x6f\x49\x0f\xe8\x30\xf5\xa3\xed\xca\x40\x1c\x4a\x25\x1f\x64\x00\x44\xc0\x99\xcb\xec\x2d\x64\x5a\x81\xc8\x2a\x34\x93\x73\x5d\x55\x32\x61\xe8\xb4\x77\x6a\x29\x13\x37\xc2\x1e\x17\xdc\x66\xd0\x6b\x2c\x2e\x52\x8f\x7c\x61\xa8\xdd\xd8\xd7\x3a\x6f\x9d\x6b\xf5\x20\x0f\xe4\xf4\x66\x47\xa7\x1c\x2a\xed\xad\x26\x62\x7d\x3a\x08\xac\x81\x18\x9a\x0b\xc8\x54\xeb\xa8\xf4\x6d\x88\x37\xca\x08\xdb\xbd\xf3\x50\x5b\x3f\x36\x7f\x55\xf8\x4c\x85\x9d\xab\xa3\x9c\x8b\x3d\xa3\x64\x98\xac\x71\xe0\xaa\xce\x18\xed\x1a\xe0\xbd\x6c\x6f\x83\xc4\xa1\x46\x41\xa6\xc8\x4e\x42\x23\xc0\xfa\x44\x02\xe2\xdc\x90\x4e\xf6\x25\xf7\x60\xa3\x8e\xbb\xaf\x54\x86\x0f\x0a\x65\xf2\x5a\xc1\x65\xa2\xeb\x03\x14\x7e\xf6\x11\xb5\x45\xc9\x37\x93\xeb\xbd\x0c\xb7\x20\x62\xb2\x33\xcf\x40\x62\xba\xee\x4a\x46\xa8\x65\x0f\xf8\x09\x2c\x00\x68\x11\xe0\x27\x19\x7a\xc0\x31\x4c\x28\xf8\x39\xdc\x43\x81\x12\xae\xb2\xd3\x2c\x59\xa3\xc4\xc7\x3a\x51\x87\x49\x39\xa5\x5a\xfa\x1b\x0a\x2a\xcd\x63\xd9\x24\x38\x57\x82\x68\x74\x09\x3e\x5a\x8f\xb5\xb5\x1a\x09\xc4\x19\xca\xfc\x20\x18\xe6\x3a\x2e\xe0\xf8\xc0\x54\x47\xc0\x89\xbd\xff\xf6\xe2\xe0\x40\x89\x49\xb2\xa0\x39\xa4\x54\x09\x84\x4a\x72\x11\x54\x62\xaa\xb3\xd2\xc5\x52\x8d\x12\x8e\x41\xf4\xbe\xa3\x67\xa3\x49\x96\x39\xf6\x6c\x5c\x66\x16\x87\x56\xd1\x76\x75\xc1\xb8\x23\xf1\x72\xa1\xd5\x0c\xaa\x7c\x62\xe9\xe9\x9a\x6e\x40\x8f\x79\xac\x12\xd2\x4a\xb5\xe4\xd9\x1e\xc4\x8a\x40\x1a\x76\x86\x28\x36\x25\xb1\xf7\x83\x73\xce\xb5\x71\xc4\xc0\x43\xbc\x99\xd6\x43\xbe\xaf\x15\x95\x78\xe2\x6d\x5c\xa4\xaf\xa6\x9a\x32\x77\x3e\x09\x62\x6e\x08\xee\xef\x8a\x90\x8d\x53\x87\x58\x4d\x74\x74\x7a\x29\x4d\x02\x9b\x28\x21\x20\x50\x60\x31\x04\xc9\x67\xd0\x69\xdc\x17\x56\xa6\x67\xee\x51\x78\x6f\x39\x0b\x51\xf5\xe7\x7f\xe2\x1f\x45\x9d\x6f\xa1\xd7\x10\x62\x7d\xb6\x9e\xd7\x34\x0a\xee\x79\x9c\x1b\x10\x9a\xd5\xad\xcf\xdd\x91\xf3\x1c\x43\x67\x80\xe2\x66\xb7\x2f\x95\x2c\xfc\x8e\x44\x3d\x2e\x36\x3e\x22\x93\x30\x59\x13\x4a\xe1\x10\xd9\xc5\x6b\x19\x59\x21\x8d\x8e\xc2\xea\x51\xfe\xd2\x4d\x13\x38\x96\xac\x37\xfc\x7c\xc4\x67\x9a\x2f\xdb\xba\x96\xf0\x59\xbd\xe1\x73\xa0\x15\xfb\x11\x7a\x29\x15\x7a\x87\x76\x5b\x87\x70\x0e\xe3\x11\x05\xf1\x65\xf1\x33\xe7\x10\x02\xa5\x5a\x0b\x54\x25\x98\xab\x70\x56\xa3\x9f\x93\x1d\xeb\x90\xf9\xfd\xab\x45\xa1\xf2\xc6\x99\xee\xee\x15\x7d\xd9\xb4\x83\x73\xe4\xe4\xd7\xbc\x25\x4d\xec\x8b\x84\x4e\x7f\x17\x22\x6e\xd4\x37\xe6\xb4\x92\xb1\x56\x14\x10\x5b\xbb\xd2\x2d\xa3\x76\x6d\xd9\x88\x4a\x22\x41\x0e\xe2\xe5\x8e\x48\xa2\x7a\x39\x3c\x60\x9a\xd6\x86\x6f\x90\x12\x24\xfa\x1a\x19\x7b\x47\xee\x25\x05\x5e\x18\x8b\x46\xa8\x1a\x2e\x80\xa7\xa3\x13\x16\x72\xfa\xd0\xae\x2c\x68\xa5\x90\xe7\x76\x95\x6b\x70\x28\xc1\xc4\x2d\x4b\x99\x37\x5c\x38\xd7\x0d\x0e\x9d\xaf\x5f\xf4\x6a\x29\x3a\xaf\x8d\xb6\xca\x65\x17\xdb\xe9\x11\x9f\x3b\x46\x94\xc1\x45\xa6\xa6\x4c\x18\xf4\xf3\xcb\xb6\xd6\x60\xf6\xe9\xa4\x7b\x42\xda\xb7\x86\x5c\x6e\xcc\x24\x6c\x6a\x7b\x80\x11\x21\xe9\x10\x63\xa9\xba\x0c\xdc\x3a\x56\x5c\x5f\x8c\xf8\x42\xee\x74\x23\xf9\x8c\xec\xec\x69\x20\x1b\xff\x85\xdf\x99\xa8\xff\xde\xe9\x3e\x2a\x7f\x2f\x4c\x8f\x96\x3e\x02\x22\xba\x75\x01\xf3\xfa\xb8\x62\x04\xb1\x0c\x11\x71\x38\x7a\xb8\xbe\x91\x4e\x60\xd2\x08\xf4\xf7\xac\x86\x09\x96\x87\x1e\xbe\x74\x0f\xd0\x3e\x53\x74\xcf\xb8\x37\xf9\x7a\x4c\xf0\xd7\x22\x06\xf6\x21\x13\x15\xd7\xf0\x47\xec\xe2\x15\x65\x70\x4e\xba\x16\xba\xf3\xf4\xb5\x4b\xf6\x43\xde\xe3\x9b\xf5\xb4\xdf\x51\x1f\xed\xbd\x28\x06\x26\x9f\x63\xaa\x0e\xd5\xef\xa2\x3e\x04\xf2\x2e\xaa\x28\x15\x9e\xcf\xc2\x97\x6f\x53\xf7\x22\xa8\x7b\xee\x77\x09\x51\x19\xc7\x54\xb6\xa7\xeb\xdd\x29\xff\xea\x39\x03\xd7\x87\xfe\xae\x1b\x27\x9a\xa4\x04\x93\xc3\x37\x23\x2a\xbc\xf1\xed\x8a\x4f\x42\xd0\xc1\x87\x1b\xfe\x5e\x79\xf4\x2e\x40\x12\x30\x60\xa5\xaa\xbe\xd0\x8d\xb9\x56\x95\x3c\xca\x92\x39\x93\xbf\xaf\x09\x47\x77\xba\xec\x89\xe9\x52\x7d\x21\x79\x0e\x81\x0e\x25\x50\xe1\xc6\xac\x17\x2c\xed\x64\x81\x71\xcf\x53\xf8\xd3\xb2\x4c\xea\x37\x12\xa6\x2f\x00\x63\xfb\x92\xca\xe3\xcb\xdf\xe1\xae\xc3\x54\x7d\xd1\x05\xd8\xb7\x9e\xb5\x05\x6c\xf4\x9d\x50\x55\x82\xc5\xfe\x0d\x1b\x4e\x4a\xe9\xa5\x55\x4a\x0f\xca\x2e\xe2\xaf\xdd\xf6\xa2\x37\x49\x67\x99\x53\xed\x09\x11\xc5\x8c\x94\x6b\xbc\xa6\x67\x51\xb3\xae\xa8\xbd\x8d\x89\x37\xe5\xe9\x7e\x3d\xa8\xd2\xd5\x0e\xaf\x08\xb5\x93\x23\xbe\xb4\x9a\x21\x79\x9a\x5d\x02\xb6\x96\x9e\xa3\x50\x55\xdc\xec\x55\xad\xbc\xb5\xeb\x4a\x02\x93\x78\xaa\x1d\x2b\x02\x4b\xed\x17\x0a\xd9\x50\x1f\x2b\x6a\xd0\xc2\xec\x2b\xf6\xb5\x5e\x97\x72\x47\x86\x1b\xf4\x75\xf5\x49\x4b\xb7\xc0\xca\x10\x07\x2c\x18\xa8\x56\x30\x5a\x65\xc0\x9e\x72\x9f\xa8\xda\xdd\x5a\xd6\x47\x88\x41\x07\x00\x76\xa5\x07\x1e\x30\x8e\x9f\x4f\x2a\xf6\xfc\x0e\x3e\xbd\x5c\x03\x4a\x18\x40\x13\xd2\xd0\x4e\x05\x2c\x27\x32\xbf\x9a\x2c\x6d\x8e\x47\xe8\x79\xab\x9d\xa2\x30\x22\x89\x34\xeb\x74\x0d\xa2\xa8\x8e\x03\xe4\x1d\x0f\xb4\x76\x9c\x74\xc9\x08\x42\xcb\x25\x17\x86\x3f\x25\x41\x47\x8b\x14\xb0\x7b\xb0\x5a\x87\xd0\x5d\x89\xe1\xdb\xbf\x7b\x71\x42\x26\x2a\xdf\x6a\x97\x04\x73\xcf\x82\x40\x67\xdc\x18\xea\xe9\x51\x82\x2d\xd9\xbb\x97\x64\x9b\x5b\xc9\xf9\x7a\x80\xfc\x5c\x21\x73\x65\x7d\x5a\x38\xbc\x9b\x16\x58\x9a\xa2\x83\xc0\xbe\x6f\x67\xb1\x41\x30\x54\x6d\x64\x9e\x43\xe5\x2b\x64\x33\xf1\x83\x1e\x43\x08\x50\xbc\x24\x63\x1f\x1a\x52\xc5\xf8\x92\x28\x13\x44\x55\x04\xb4\x2e\xf0\x74\xb7\x30\x2e\xc6\x14\xec\x97\x1b\xd8\x59\x67\xe3\xfb\x99\xd8\x85\x85\x9c\x29\x21\x27\x1d\xae\x10\xc8\xa0\x1c\x3b\x43\x5c\xf2\xe1\xb1\x14\xac\xd2\xc9\x17\x22\xf3\xb4\x63\xa3\x03\x7b\x1a\x0c\xdb\x15\x1c\x25\xf9\x2d\x00\x82\x50\x67\x3a\x4f\x4e\x6b\xe7\xe4\x7a\x4c\x82\x80\x43\x4a\x2f\x12\x4e\xd2\x7e\xaf\x46\xbe\x3e\x00\x85\xea\x13\x55\x08\x58\x9d\xf7\x61\xb2\x98\xf0\xe9\x92\xcf\xe6\xfc\xd3\x78\xb1\x18\xcf\x56\x9f\xf9\xbb\xf9\x82\xaf\x3e\x4c\xf8\xed\x62\xfe\x7e\x31\xfe\x98\xf1\xd5\x1c\xfe\x3d\xf9\xeb\x6a\x32\x5b\xf1\xdb\xc9\xe2\xe3\x74\xb5\x9a\x5c\xf3\xb7\x9f\xf9\xf8\xf6\xf6\x66\x7a\x35\x7e\x7b\x33\x61\x37\xe3\x4f\x23\x3e\xf9\xeb\xd5\xe4\x76\xc5\x3f\x7d\x98\xcc\xf8\xdc\x3e\xfd\xd3\x74\x39\xe1\xcb\xd5\xd8\x7e\x7e\x3a\xe3\x9f\x16\xd3\xd5\x74\xf6\x1e\x9e\x77\x35\xbf\xfd\xbc\x98\xbe\xff\xb0\xe2\x1f\xe6\x37\xd7\x93\x05\x74\xe0\x7a\x36\x5f\x30\xf8\x22\xbf\x1d\x2f\x56\xd3\xc9\xd2\x0e\xe3\xd7\xe9\xf5\x24\x1e\x12\x1f\x8c\x97\x7c\xba\x1c\xf0\x4f\xd3\xd5\x87\xf9\xdd\x2a\x8c\x7d\xfe\x8e\x8f\x67\x9f\xf9\x5f\xa6\xb3\xeb\x8c\x4f\xa6\xf6\x41\x6c\xf2\xd7\xdb\xc5\x64\xb9\x9c\x5c\xf3\xf9\x82\x4f\x3f\xde\xde\x4c\x27\xd7\x19\x9f\xce\xae\x6e\xee\xae\xa7\xb3\xf7\x19\x7f\x7b\xb7\xe2\xb3\xf9\x8a\xdf\x4c\x3f\x4e\xed\x38\x57\xf3\x0c\xde\x46\x9f\x75\x4f\x9f\x4e\x96\x6c\xfe\x8e\x7f\x9c\x2c\xae\x3e\x8c\x67\xab\xf1\xdb\xe9\xcd\x74\xf5\x19\xda\x86\xbd\x9b\xae\x66\x93\xe5\x12\x96\x6e\x8c\x23\xbf\xba\xbb\x19\x2f\xf8\xed\xdd\xe2\x76\xbe\x9c\x8c\x70\x01\x67\xab\xe9\x62\xc2\x17\xd3\xe5\x5f\xf8\x78\xc9\x68\x59\xff\xf5\x6e\xec\x9f\x73\x3b\x59\xbc\x9b\x2f\x3e\x8e\x67\x57\x13\x3b\x95\x78\xca\xd3\x25\xcc\x96\x7f\x9e\xdf\x8d\xf8\xf2\xc3\xfc\xee\xe6\x3a\xfe\x3b\xb3\xcb\x34\xe1\xd7\x93\x77\x93\xab\xd5\xf4\xd7\x49\x66\x3f\xc8\xc7\xcb\xe5\xdd\xc7\x09\xad\xf6\x72\x05\xcb\x73\x73\xc3\x67\x93\xab\xc9\x72\x39\x5e\x7c\xe6\xcb\xc9\xe2\xd7\xe9\x15\xac\xc2\x62\x72\x3b\x9e\x2e\xf8\x7c\xc1\xae\xe6\x8b\x85\x7d\xca\x7c\x46\x22\xf4\x7a\x84\xd5\x07\x3e\xa7\x76\xe3\x20\xef\x56\x61\xcc\xac\xf4\x4c\x7e\xb5\xb2\x71\x37\xbb\xb1\xcb\xb0\x98\xfc\xeb\xdd\x74\xd1\x95\x10\x7e\x33\xfe\x64\xb7\x60\xfc\x7e\x31\x81\x55\x8e\x05\xe2\xd3\xf4\xe6\x86\xd9\xad\xeb\x4a\x45\x06\x5f\x99\x7d\xe6\x41\x2a\x3e\xf3\x4f\x1f\xe6\xfc\xe3\xfc\x7a\xfa\xce\x0a\x08\x4a\x0d\xbf\x9a\xcf\x7e\x9d\x7c\x5e\x26\x8b\x32\x5e\x46\xe2\x3a\x7e\x3b\xb7\xeb\xf2\x76\xc2\x6f\xa6\x30\x9e\xd5\x1c\x16\xc9\x6e\xda\xf5\xf8\xe3\xf8\xfd\x64\x19\x89\x05\xbc\x93\xda\x1e\x67\x7c\x79\x3b\xb9\x9a\x8e\x6f\x32\x36\x9d\x5d\x4d\xaf\x27\xb3\xd5\xf8\x86\xe3\x3b\x97\x93\x7f\xbd\xb3\x1b\x3b\xbe\x71\x0f\xe1\xe3\xc5\x74\x69\x9f\x60\x25\x93\x76\xf1\x6e\x39\x01\xe9\x9b\x39\xa9\x59\xcd\x99\xfd\x5d\xbc\xc3\x67\xe1\xdd\xc7\x12\xc9\x6f\xe6\xcb\xa5\x7d\xda\xf5\x78\x35\xe6\x30\xe2\xd5\x98\xbf\x9d\xd8\x4f\x2f\x26\xb3\xeb\xc9\x62\x72\xcd\xa6\xb3\xf1\xd5\xd5\xdd\x62\xbc\x82\x97\xd9\x6f\x4c\x96\x7c\x79\xb7\x5c\x8d\xa7\x33\xdc\x0d\x3b\x5f\x38\xde\xd3\xc5\xb5\x3f\x61\x20\xb4\xef\xc6\xd3\x9b\xbb\x85\x13\x3b\xe6\x06\xb5\x9a\xf3\xf9\xed\x04\x1e\x09\xe2\x17\xed\x04\x7e\x62\x39\xcc\x60\xf3\xf9\xf4\x1d\x5f\xde\x5d\x7d\xa0\x6d\xb3\x0f\x85\xcf\x31\xdc\xb1\x0f\xe3\x25\x7f\x3b\x99\xcc\xf8\xf8\xfa\xd7\x29\x9c\x45\x12\xef\xf9\x72\x39\xa5\x35\x99\xd3\x13\x68\x1d\x49\xf8\xde\x8c\xd0\x87\xdc\xd7\x32\x08\xe0\xf2\xa8\x50\x29\x5c\x5d\x45\xa2\xed\x7c\x3d\x14\x74\xde\x4c\xa4\x38\x14\x6e\x78\xb8\x3d\xe2\xb5\x31\x14\x61\x2d\x2f\x34\x80\x4a\x9d\x8b\x92\x4a\x98\x90\x56\x99\x30\xf2\xa4\x7f\xb1\x4a\x8e\x80\xe6\xd6\x3c\x94\x8f\xe8\x08\xb5\xe0\xf1\x01\x1d\x07\x9a\xc8\xf4\x24\xf1\x48\x11\x22\x6d\x1a\x9e\x97\x1a\x2b\x7f\xf7\xf6\xe6\x83\xae\x10\xd8\x9f\x6a\x6d\x74\xd9\x36\x12\x59\xa3\xd1\x00\xb1\x76\xb7\x7a\x50\x25\x0b\x63\xef\x09\x0d\x26\x05\x92\x0e\x92\x9c\x54\x86\x85\x92\x14\x96\x2c\x44\x28\x6d\xef\x02\x93\x3c\x2e\xa2\xe2\xb5\x6c\xda\x3a\xa6\xb5\xe5\x93\x99\xdd\xd0\x13\x7d\x14\x3f\xe8\x47\xbb\x48\x63\x58\x00\xc4\xff\xad\x5c\xf1\xc1\x67\x7b\x95\xcd\xe4\xa3\x7b\xbc\xf1\x49\x48\x6a\x4f\x44\xfd\x23\xf7\x71\x03\x86\xa8\xef\x30\x25\xd9\x68\x8c\xf7\x50\xb6\x6a\x5d\x7a\x8d\x29\x3c\xd6\x9a\xa3\xd6\x6c\x98\x5c\x33\x0d\x12\x49\x69\x2e\xf2\x2d\x24\x65\x3c\x5c\x98\x12\xab\x40\x99\x1b\x37\xa5\x45\x43\x47\xba\x76\xe4\xd8\x1b\x23\x6d\xde\xeb\x9a\x5d\xfb\x14\xa5\x09\x25\x09\x2b\x42\x14\x66\x5c\x34\x8d\xa0\x90\x72\x30\x4d\x5d\x69\x9c\xb7\xec\x09\x3d\x3a\x05\xaf\xc8\x88\x8d\x1d\xb2\x1d\x2e\x7c\xd9\x67\x53\x1a\x64\x4c\xc1\x3a\x1c\x80\x9d\x45\x35\x18\xd8\x78\xc6\x34\x81\x82\xbd\x3c\xa0\x3d\x45\x21\xf1\x88\xf9\xd1\x73\x2d\x23\x47\x87\x7d\x12\x3c\xc2\x6c\x21\x20\x84\x29\xbb\x40\x9f\x27\xf9\x20\x0f\x9d\x2b\x4b\x74\x63\x0b\x2e\xd8\x5e\x43\x70\x03\x03\x55\x8e\xee\x68\xd3\x7a\x3a\x5b\x3b\x9b\x8d\x35\x38\x47\x8c\xfd\x8b\x5d\x47\xf8\xae\x23\xca\x8b\xa6\xfe\xa3\x81\x6a\x32\x7c\x2c\x5f\xd7\x4a\x6e\xb8\x2a\xa4\xe0\x8e\x39\x8a\x12\x2c\xa3\x3f\x77\x3b\xcd\xff\xcb\x41\x8a\xfa\xcf\xfc\x5f\xe0\xeb\xda\x55\x62\xfe\x99\x61\x07\x8e\x7d\x00\xf8\x24\xfb\xfb\xb3\xef\x5e\x9d\xec\xaa\x6a\x3a\x5d\x99\x55\xe3\xf1\x59\x89\x7f\xfc\x3d\xc6\xae\x30\xfd\xb6\x38\xeb\x6d\x89\x4f\x4e\xc9\x91\xc3\x7b\x13\x95\x9e\x9c\xa5\xc5\xc2\xc3\x63\x2f\x69\x74\x3c\xef\x30\x3d\x5f\xeb\xb2\xd5\x7b\xe9\x2b\xb5\xc0\xf5\x46\xa3\x7c\xd3\x96\xe8\x55\x92\xa9\x05\x77\xb4\x33\xb7\x7e\x89\x3b\x14\xe3\x73\x28\x54\x1e\x29\x9b\xcd\x91\xc5\xa4\x6b\x67\x30\xb1\xd3\x06\xd3\x52\xca\xef\x5c\xd4\x0d\xe5\xba\x18\xba\xba\x0e\x19\x18\x0b\xae\x47\xb8\xa7\x3a\xed\x3b\x36\x2c\x30\x1c\x37\xd1\x22\x82\x37\x57\xe9\x26\xe3\x46\x4a\xfe\x2f\xdb\xa6\xd9\x9b\x9f\x9f\x3d\x7b\x7c\x7c\x1c\xdd\x57\xed\x48\xd7\xf7\xcf\x1c\x18\xe8\xd9\x9f\xa1\x88\xcf\x80\x2b\x90\x30\xd0\xe8\x0a\xd9\x4a\x90\x0a\x43\x60\x53\x72\x2b\x15\xb2\x94\x79\x53\xeb\x4a\xe5\x08\xa0\x11\x7b\x59\xf3\x9d\x50\xa5\x87\x68\x44\x3c\x8c\xb9\x08\xad\x16\x51\xfb\x63\xe4\xf2\x3b\xa2\x94\x98\x31\xa6\x75\x42\x06\xef\xb4\xd9\xbc\x6a\xdc\xcd\x88\xf7\xc7\xc1\x55\x7d\x22\xdb\x13\x02\x34\x1d\xd7\xfd\x88\xf5\x84\xc1\xeb\x58\xec\x04\x7f\x94\x6b\x97\xed\x40\x11\x57\x4d\xdc\xda\x09\x63\xd5\x54\xd0\xcb\x04\x1f\xb8\x5e\x5e\x10\x31\xc3\x52\x39\x29\x0a\x13\x86\x00\x69\xc6\x7c\x0b\x20\x7c\x97\x08\x2b\x1c\x44\x1c\x5b\xef\x88\xea\xc0\xa0\xde\x36\x44\xc3\x89\xd4\x93\xa8\xe5\xa0\xd7\x53\xe0\xd9\xb3\x77\xae\x8f\xbe\xd8\x53\xb0\x96\x4d\x43\xb0\xa7\x50\xaf\xeb\xda\x2f\xfd\x02\x12\xe0\xeb\x0f\x5e\x84\x32\x05\x97\x23\xeb\xd0\xcb\x7d\xee\x2c\xb9\x5d\x44\x58\x28\xb9\xdb\x97\xfa\x20\x6b\x17\x3b\x8e\x9a\xe5\xb9\xf6\x7e\xb2\x1e\x02\xb2\xd9\xfa\x7e\x65\xc6\xb0\xfd\x1a\xe4\x20\x8d\xba\xaf\x90\x07\xcd\x29\xc2\x60\x05\x0d\x02\x9e\x22\x6a\xeb\x1e\xfa\x81\xf0\x77\xba\x66\x08\x6e\x48\xa5\xd3\x4a\xbc\x6f\x2f\x19\xc2\x7c\x50\xb2\x84\x1e\xa7\x3f\x44\xd0\x02\xfa\xbb\xce\xc2\x0f\x7f\xfc\xfc\x4f\xf9\x19\x3d\xbb\x79\x7f\x7b\x73\xfe\x62\x74\x71\xae\xeb\x73\xb8\x54\x46\xcd\xd7\xe6\x1f\xfa\x8e\x8b\x8b\x8b\x8b\xd7\xaf\x5f\xda\xff\xbf\x7c\xf3\xea\x22\xfe\x7f\xfb\x9f\xaf\x5f\x5e\xbc\xf9\xe1\xf2\xc5\xeb\xe7\x17\x17\x2f\xdf\x5c\xbe\xba\xfc\xe1\xe2\xf2\xe5\xcb\xcb\x97\x3f\xf0\x8b\x7f\xe8\x28\x4e\xfc\xb4\xd6\xb2\xe2\xfc\x87\x52\x6c\x6a\xf5\xc5\x9c\xfc\xdc\xb7\xfe\xfe\x3f\xf4\xc7\x9e\x6c\xeb\xcf\x4f\x16\xce\x11\xe6\xb7\x77\x6f\x6f\xa6\x57\xfc\x66\x7a\x35\x99\x2d\x27\x8c\xfd\xea\x6c\x93\x8c\x3f\xff\x89\xff\xdf\x6d\x25\x21\xf7\xde\xb5\xc8\xec\xef\x4e\x06\x1d\x33\x3e\xad\xf2\x51\xd0\x1c\x1b\xb3\x01\xad\xf1\x67\xc6\x26\xce\xd8\x4e\xfa\x24\x39\x9a\x55\x54\xdc\xde\x52\xeb\xed\xc9\x12\x9a\xc7\xb3\x50\x5d\x6d\xed\x19\xb0\xd4\xa9\x87\x74\xda\x41\xc9\x19\x4c\x3d\x41\xea\x1b\x69\x8c\xac\x4f\xe7\x5b\x7c\x5a\xc9\x9c\x0e\x35\xeb\xcd\x6f\x49\x61\x64\x11\x23\x48\x88\x32\x9f\xa0\x52\x29\x95\x09\x4d\xa2\x5c\x03\xfb\xa8\x14\xfa\xa8\x97\x3d\xe7\x9c\xb1\xb1\x41\xce\x1c\x7b\x65\xaa\x2a\xe3\x83\xe6\xb7\x34\xb8\x4f\x97\x84\x75\x47\xef\xf8\xe4\x06\x30\xc5\xdb\x9b\x6f\x3e\x2f\x5d\x06\x96\x64\x72\x60\xb8\xd0\xc4\x9e\x38\x45\x53\xee\xc9\x24\x87\x76\x8a\x6a\x20\xe9\x49\x2b\x2a\x70\x4b\xa3\xc6\x8b\x82\x5f\xb9\x04\xd4\x27\xba\x7f\x7d\xf7\xde\xb0\xac\xb8\x6e\x15\xf4\xaf\x76\xdf\xf6\xf8\x63\x4f\x4c\x46\xed\xb7\x08\x73\x98\x74\x0d\x8e\x7b\xdc\x35\x5b\xc9\x3c\x47\xea\x51\x23\xdb\x08\x40\x12\xc3\x99\xe8\x0b\x23\xda\x53\xa8\xf8\x30\xed\x1a\x08\x36\x89\xc8\x1f\xb8\x36\xa3\xd6\xc3\xd1\xd7\xc0\x09\xc0\x46\x5d\x22\xa2\x8e\xa4\x52\xa9\xe3\x61\xb2\xf4\xeb\xf1\x22\xf0\x41\xb2\x60\x54\xa2\x01\x6b\x40\xcd\x67\xa8\x91\x9f\xfd\x90\x07\xd7\x54\xd4\x73\x2d\x5e\x7e\xe6\x63\x17\x7e\x72\xab\x94\x01\xb4\x73\x22\xdd\x64\xa2\x1c\x22\xa6\x8f\x71\x3c\x0c\x36\xf0\x51\x10\xe8\x09\x88\xb6\x8d\x8e\x8b\x36\x06\x37\xd0\xd6\xd3\x65\x05\x07\xd1\xbc\xa0\xb1\xec\x47\x55\xa9\x9d\x28\x7b\x13\xd2\x8e\x3a\x33\x15\x97\xd0\xb0\xba\xb7\x42\xca\x19\x62\xc9\x97\xb2\x08\x79\x64\xe5\xa7\xdb\x9c\x94\x8a\x64\x7c\x72\x31\x7d\x23\xa2\x66\x23\xde\x0f\x55\x71\x65\xa8\xe0\x38\x03\x13\x38\x11\x9c\x68\xc1\xb1\xb0\x1c\x84\xcc\x09\x55\xbc\x1c\xdd\xd5\x48\x57\x21\x3e\x37\x57\x51\xdf\xee\x53\xeb\xd1\xe9\x89\xfb\x4c\xd7\x47\x13\xed\x0e\x2f\xea\x91\x6b\xd7\x05\x3a\xa5\x02\x2e\xaf\x81\x60\x95\xb7\xc1\x1d\xb3\x33\x74\x3f\x94\x28\x75\x2e\xdb\x97\x0e\xc7\x57\xa5\x25\xaf\x59\xb7\x0d\x0b\x5b\x60\xff\xdc\xed\xa2\x1b\xca\xde\xa2\xa7\xf9\x86\xe6\x13\x47\xfa\x60\xd5\x10\x45\x26\x3b\x4a\xed\xf6\xe6\x9b\xfd\x2c\x92\x4a\x66\xc3\x5f\xc0\x54\x5f\xf6\x72\x3f\xe9\xb6\x21\x32\xe8\xb5\xbd\x45\xa1\x4c\xe7\xf4\x6b\xb1\x53\x6a\x4f\xcb\xa9\xa8\xd7\xd4\x34\x41\xce\xa4\x5e\xb2\xd7\x4d\xa2\x42\xa6\xbf\x08\x4b\x93\x3b\xdc\x94\x70\x18\x90\x03\x8b\x55\xb2\xe3\x4e\x85\x6c\x99\xdd\x3f\x02\xc5\xb7\x7b\x0c\x13\xac\x0f\x1d\x25\xe0\xbb\xcf\x82\xd4\x30\xf7\x50\x7e\x16\xd5\x23\x63\x31\x86\xa8\xef\x91\xda\x65\x2f\x8c\x95\x6f\x4f\xb7\xe8\xbf\x03\x48\x8f\x07\xfd\x45\x16\x43\x02\x0c\x1f\x8e\x77\x20\xcc\xb3\x8b\x0e\x42\x6e\xad\x3e\xd2\x97\xe3\x0e\x22\xe0\x38\x0b\x7e\xaf\x75\xc1\x37\xc2\xea\x23\x2c\x53\xec\x50\x94\xfb\x9e\x5b\xc0\x0d\xdb\x9d\x7a\x44\xe7\x82\x78\x0a\x88\x9c\xa5\x0b\x98\xa5\xcb\x62\x1a\xeb\xa4\x12\x27\x3c\x39\x6b\xd4\x50\xc1\x70\x5f\x38\x1a\x78\x7a\x8c\x6f\x40\xea\x68\xee\x88\x04\x08\xe2\x3c\x44\xed\x15\x0a\x2c\x48\x88\xb0\x63\x2a\xaf\x42\x37\x93\x93\x64\x6e\x1d\xda\x84\x2e\xe5\x20\x11\x26\xf8\x1e\x94\xd4\x9a\xdf\x2a\x10\x6b\x05\x3a\x72\x6c\x2b\xa5\xae\xc2\x1f\xce\xac\x53\xf5\x1f\xa4\xb0\x63\x7b\xa7\x4a\x28\xdc\x5f\x75\xf8\xc2\x7d\x1f\xff\x74\x61\x77\x40\x15\xed\x8d\xb3\xc0\x1e\x40\x38\xa8\x2d\x3c\x95\x61\xc8\xd4\x31\x53\x46\x64\x83\xfe\x3e\xea\x9c\x60\xc0\x72\x25\x0c\xf1\xb8\x72\x60\xf6\x45\x89\x5a\xa0\x32\x4d\x84\xc6\x97\xbf\x26\x50\x24\x3f\x2e\xba\xfb\xa9\x15\x30\x6b\x34\xaf\xda\x9d\xac\xb1\x43\x8a\xa8\xc5\x4e\x36\xd0\x0f\x11\x8e\x94\x69\xea\x36\x87\xec\x7b\x29\x0e\xba\x6d\x88\x41\x2a\xc7\xa2\x5a\x62\xe0\xda\x61\xf3\xd6\xbc\xd6\x26\x63\xaa\x82\xa0\xab\x93\x2d\x42\x01\xca\xdd\x1e\x19\x45\xcf\xa0\x77\x4a\xcd\x37\xf2\x11\x12\xe2\x15\x96\xb4\x95\xb2\xba\x6f\xb6\x43\x47\xda\x00\x58\x42\x87\x9c\xf7\x71\x6c\x3c\x34\xef\xd5\x83\x3c\x6a\xba\x86\x42\x14\x1a\xeb\xf5\xf4\xd8\xf0\x6c\x47\xb4\xe2\x4c\x91\x6d\x6a\x2f\xb5\x86\x8c\xc9\xf4\x23\xdc\x35\x54\x6a\xa9\xa9\xf3\x89\x66\x27\xd8\x94\x66\x4c\xf9\x8d\x63\x72\xff\x9e\xf6\x1e\x24\xfd\x01\x23\xd9\xe5\x69\x8a\x3a\x47\x46\xf7\x42\x6f\xeb\xa2\xf4\x1e\x8a\xe4\x84\xa7\x72\x42\xd2\xd1\x88\x2f\x40\xc4\x78\x0f\xb0\xdd\x8c\xc5\x01\x7c\x82\xd9\xba\xf2\xe6\xde\x82\xc7\x8e\xcd\xe0\x17\x8b\x20\xd9\x48\xef\x7b\x7c\x3f\xda\x99\xd6\x12\xa8\x68\xb9\xb4\xee\x91\x0c\x15\xbd\x85\x5c\xb7\xf7\xe0\x31\x21\xc7\x5d\xa2\xff\x99\x43\xbd\x5a\x0b\xab\xd0\xb8\xcb\xff\x75\xd9\x38\x36\x75\xfe\x89\xd2\x91\xbe\xfc\x37\xc8\x07\x8b\xe4\x23\x1f\x12\xcd\x7e\xcf\x54\x28\xd0\x69\x8e\x1a\x75\x1a\x5e\x60\xad\x0e\x52\xa5\x47\xb6\x90\x24\x34\x75\xfa\x79\x6f\x3d\xf9\x59\xef\x34\x5a\x32\xc6\x11\xc9\x18\x68\x0f\xf8\x28\x81\x2a\x01\xc8\x98\x21\x90\x99\x4b\x46\x5d\x3e\x02\xb1\x60\x1d\x5a\x76\xc6\x15\x06\xdf\x79\x1a\x38\xe7\xc5\x90\x5f\xeb\xa8\xf5\x55\x22\x01\x17\x49\x7b\x8d\xa7\x2c\xec\x6f\x16\xfa\x31\xd1\xdb\x6c\xa4\x6b\x99\x06\xe2\x61\x6e\x5a\xd5\xb8\x52\xc3\xb8\xc6\x03\x35\x36\xa2\x8f\x20\xcc\x90\x25\x8b\x51\x4b\x07\xd5\x04\x0b\x93\xa2\xd1\x89\x15\xe9\xe4\xa3\x4b\x6a\x1f\x0e\x60\x6c\x5a\x47\xad\x39\x63\x22\xfb\x8e\x5b\x40\xdd\x9c\xa8\x78\x2f\xd0\x6a\x46\xe6\xde\xeb\xee\xee\x6c\x12\xc6\xba\x13\xad\xf8\x2f\x87\x80\xc4\x16\x61\x3d\xcc\x56\xd8\x53\x51\x92\xfc\xec\x64\xbe\x15\x95\x32\x3b\x78\x9e\x73\xd7\x8e\xfd\xb3\x31\xf3\x4f\x08\x5f\x51\x06\xf6\x1e\x56\xf3\xcc\x5a\x50\xd6\x98\x13\x0d\xb6\xb0\x57\x3b\xd9\x6f\x5e\x32\x57\xab\xee\x30\x8d\xe4\x93\xd8\x3d\xf8\xd1\x84\xdc\x85\x01\xd3\x1c\x37\xef\x6c\x3d\xc4\x28\x3d\x19\x40\xd4\xd1\xa3\x3c\xb0\xce\x6e\x9c\xf2\x1c\x03\x20\x98\x3c\xde\x73\x50\x00\x0d\x94\x7f\xba\xe9\xb2\x23\xb7\x48\x02\x99\xe8\x93\x04\xe8\xe8\xc9\xc7\x6d\x9a\x10\x58\x9f\xd4\x83\x38\xae\x21\x96\x50\xa0\x03\x3e\x3c\x04\xe2\x53\x86\xa3\xee\x86\x47\xed\xa0\xf0\xd4\xb2\x98\x7e\xf9\xe8\x61\xd6\xb0\x70\x81\xff\x53\x7d\x19\x4e\x0b\x71\xaa\xc3\x62\xf7\xde\x9d\x10\xd7\xdf\x5d\x3a\x99\xe9\x1c\x93\x6f\x6f\x4c\xb2\xd4\xfc\x8c\x1c\x13\x88\xa1\xa0\x8f\xf5\xb2\xb8\x40\x23\xf8\x24\x2d\x39\xa0\xfa\x45\xa2\xcb\x9f\xd4\x33\xa2\x2a\xd8\xd3\x2a\xc4\x17\xa9\x24\xe3\xb8\x8c\x09\x11\x43\xe7\xaf\xd3\x03\x73\xbc\x9b\xbf\xe1\x40\xb3\xef\x38\xd0\xc3\xd0\x56\x98\xf6\xc7\x3b\xae\x91\x29\x82\x24\xcc\xee\x84\x87\x1e\x50\xa1\x28\xb0\xaf\xc3\xb0\x3b\x29\x46\x15\x40\xf8\x03\xbd\xef\x41\xa1\x12\xac\xdc\x3d\xd0\xd9\x2a\x71\xc7\xcf\x27\x5e\x06\x95\x34\xd1\x32\x93\xd1\x4a\xf4\x43\x27\x1b\xd6\x51\x2c\xd5\x1b\xdf\xc2\xe3\xc5\x99\x7b\xd9\x69\xdb\x2a\x8b\xc8\xa5\xa0\x10\xa6\xdf\x40\x49\xad\x00\x8f\x47\x2f\xe3\x68\x53\xaa\xc2\xb0\x2f\x59\x77\xed\x42\x50\xaf\xad\xd2\x5e\xa4\xa1\x78\xe0\x78\x85\xb2\xe3\x16\x14\x92\xf5\xde\x7f\x68\xb3\x3c\x61\x4e\xf5\x0e\xdf\xf3\xa5\xa3\x43\x18\xc2\x75\xac\x6f\xdf\x33\xd2\x0c\xfb\x52\xf8\x9e\x44\x5d\xf6\x4d\xb7\x5c\x48\x91\xea\xf7\xc3\xf9\x62\xc9\x02\xf9\xc6\x9f\xfd\x80\xfc\xef\x88\xb2\xff\x0e\x48\xfd\xa7\xa3\xfa\xff\x7f\x44\xea\x7b\x3b\x11\xb2\xe2\x2c\xe2\xf6\x3d\x06\x7c\x7f\x0f\x78\xff\xc9\x24\x00\x1f\x38\xa2\xe4\xbf\x03\xbc\xcf\x7a\xc0\xfb\xfc\x69\xf0\x7e\x40\xd8\x24\xe8\xfd\x63\x64\xcc\x6f\xc0\xc5\x77\x16\x8e\x1d\x93\x22\x3f\x01\xe8\xe7\xc7\x80\xfe\x6f\x64\x4d\x4e\x03\xfa\xbf\x79\x4e\x5c\xc6\x84\xff\xbd\xc8\xff\x54\x36\xf8\x93\xb2\xd1\x53\x0c\x00\x97\x00\x3b\x2e\x07\xf8\xce\x1c\x1a\x56\x83\x51\x7f\x71\xe0\xc6\x3f\x55\x0e\xc0\x8f\xcb\x01\xa2\x65\xa2\x84\x21\xd4\x04\xf0\xa4\x65\x15\xdc\xa8\xa7\x0b\x03\xba\xbe\xd4\xff\x62\xc4\xc2\xe8\xd9\xaf\xf3\xe5\x6a\x31\xff\xf8\x0f\xcf\xfa\x87\x9f\xa7\xf3\xff\x17\xaf\xde\xbc\xbe\xec\xe4\xff\x5f\x5c\x5c\xbc\xf9\x23\xff\xff\xcf\xf8\xa1\xdd\xef\xc3\xdb\xcd\xf7\xb2\x72\xe6\x73\x94\xea\xcf\x29\xd5\xef\xbe\xf9\x41\x97\xd6\x50\x35\x19\x9b\x56\xb9\xcb\xab\x1f\xfd\x11\xf3\xff\x67\xf4\x7b\x68\x67\x11\xba\x3c\x9f\xf9\x1e\x99\x2e\xce\x20\x10\xe8\xa8\x28\xaf\x77\xd4\x12\x48\xdb\xb1\xf9\xdc\x12\x34\x40\x6a\x88\x32\xcc\xe9\x10\xea\x47\xb0\x3e\xb8\xc1\x8c\xd8\x15\x61\xf0\xdc\xe8\x02\x2d\xfb\xff\xf5\xa0\x4d\x53\xeb\xdd\x28\xd7\x3b\xea\xe2\x98\xc0\xa4\x9c\x25\xe7\x38\xe3\x23\xfe\x02\xc3\xcf\xe4\xe8\x7e\xc4\x43\xc7\x35\x8e\x6d\x2c\x64\x03\x2a\x36\xb2\x7f\x87\x23\xc6\xee\x42\xae\xa1\x0c\x95\xf5\xca\xa4\x2b\x42\x5c\xe5\xde\x85\x72\x51\x90\x6e\xe7\x08\x08\x8f\x1c\x77\x3e\xa0\xaf\x43\x70\xa7\xc8\x62\x2c\x68\x16\xb5\x63\x72\x4d\x35\xe2\x8c\x82\x2c\x58\x0f\x2f\xbd\xbf\x9f\x3b\x14\x04\x3b\xd9\xfc\xcc\xd8\xe5\x28\xe4\x9b\xfc\x10\xec\x9f\x63\x0c\x2a\xf5\xc4\x0b\xd9\xc0\xa3\xed\x06\x1f\x0d\x3e\x16\x95\xd2\x6e\x1c\x67\x81\x21\x5e\x19\xaa\xa4\xed\x7d\x80\xa7\x40\x00\x02\x5f\x5c\x29\xd6\xd7\x1a\x62\xc8\xc5\x31\x0b\x79\xd8\x91\x5f\x18\x7b\x3e\xb2\x8e\x84\xfb\x22\x86\x8a\xa2\xd1\x67\xe9\x9b\x33\xd7\x00\x0f\x48\x82\xcf\xc1\x92\x94\x25\x91\xc1\x13\x12\xd0\xee\x47\x29\x45\x5d\x5a\x0b\x65\x2d\xa9\x6b\x99\xf5\xd8\x5c\x4a\x9e\x68\x87\xd0\x8a\xa0\x26\x25\x81\x9a\x0c\x90\xd2\x19\x43\x4e\xc8\x32\xe2\x9b\x6c\xc4\xfd\x30\xa2\xf0\x4e\x0d\x92\x5f\x18\x7b\x31\x42\x2c\x65\xe6\xa6\x03\x59\x05\xb7\x35\x90\x3d\xf0\xec\x6e\x10\x84\x41\x3a\x8d\x0e\x27\x68\x8d\xd8\x01\x88\x4d\x26\xa2\x1a\xad\x35\x8f\xd7\x1a\x7c\x03\xcf\xed\xeb\x5b\x30\xd5\xca\x00\xe2\xa2\xd1\x0c\x83\xd8\xee\x15\xc4\x42\x17\xc9\x62\x20\xed\x4d\x5f\xf9\x0b\x63\x2f\x47\xae\x91\xb8\xd3\x4b\x3b\x51\x09\x22\xe6\x88\xcf\xee\x59\x68\x66\x1e\x96\x17\xba\xc1\x27\x85\x98\xd9\x71\xbc\x15\x6b\x49\x40\x1e\x86\x81\x4d\x04\x7b\xf4\x61\x3c\x1a\xd8\xe7\x3b\xc5\x90\x9d\x71\xbe\x1a\x79\x65\x63\xcf\x24\xa4\x10\x93\xa8\xba\x53\x68\xc9\x92\x06\x0a\x9f\x98\x03\x97\x39\xc7\x03\x10\xff\x3d\xcd\x4e\xba\xcf\xa1\xe6\x68\xf4\xde\x84\xe5\x0f\x89\xd7\xc2\xf9\x3c\x56\x0b\xc9\x4e\xf4\xa5\x03\x42\xe6\x9e\x51\x2b\xb3\xe3\x0f\x45\x8a\x3b\x3a\x65\x5e\x72\x1d\x66\x34\xf3\x19\xef\x50\x3f\x89\x21\x26\xcf\xee\xfa\x0b\x63\xaf\x47\x9d\x87\xab\x24\x99\x88\xc7\xb2\x74\x51\x91\xcc\x79\x84\xa9\x8a\x20\x66\x64\xe6\x38\x7d\xd0\xab\x88\x6e\x13\x17\xf1\x76\x1a\x58\x14\x11\xc2\x29\x2d\x9f\xa7\xcf\xb0\x58\xcd\xf5\xc4\xb3\x31\x83\xd8\xf3\x0a\xb5\x09\x4c\xe4\x6b\xf4\xda\x59\xcf\xe7\x1c\x83\x26\x12\x25\x61\x30\x14\xa0\x6c\x58\xa5\x74\x74\x79\x10\xfa\x89\xa5\x8b\x05\xf7\xe8\xb1\xaa\x0b\x47\xb6\xe7\x83\xb8\x3a\x24\xc0\x2c\x74\x1c\x89\x6f\xbf\x5f\x18\x7b\x33\xe2\x95\x8e\x95\xb6\x0a\xca\xb5\xd1\xdf\x90\x32\xdf\xe0\xa8\x3c\x38\x69\x63\xdf\x3e\x21\x38\x48\xe4\x49\x8f\x2e\x5b\x97\x5c\x75\xe4\x44\xbe\xc6\xab\x96\xa5\x14\x94\x46\x32\x1e\xa7\xb3\x13\x54\xe7\xd1\xc7\x5d\x13\xee\x82\x3f\x8d\x60\x00\xae\xd4\x24\x3e\xd0\xd4\xe9\xda\x65\xa8\xa0\xc5\x63\xa3\x5c\x5b\x96\xa8\x73\x13\x3a\xd8\xa0\x40\x75\x3a\x15\x17\x3e\x71\x7a\xca\x95\x5b\x38\x70\x39\x71\x1f\xf9\xa6\x24\x49\xa7\x33\x30\xb6\x82\x8a\x3b\x32\x97\x06\xc2\x70\x65\x06\x20\xc1\x8c\xb9\x91\x5f\x4f\x97\x57\x37\xe3\xe9\xc7\x25\x54\x8a\x86\xd2\xd7\x8c\x53\x1d\x6d\x52\x45\x0b\x35\x81\x8b\xc9\xfb\xf1\xe2\x1a\xcb\x84\xa7\x4b\xb6\x9c\xbf\x5b\x7d\x1a\x2f\x26\x71\x31\xa5\x2b\xd4\x85\x82\xc6\xf1\x6a\x3a\x9f\xc1\xe3\x8f\x2b\x6c\xf9\x71\x85\x2d\xfb\x9e\x0a\xdb\x0c\xca\xce\xe2\x5a\xd4\xe5\x07\xfb\x06\x37\x2d\x5f\xf5\x89\x25\x27\xb3\xcf\xbe\xa4\x93\x4f\x67\xd7\xd3\xc5\xe4\x6a\x75\xba\xa0\x93\xbe\xe1\xfe\xf9\xe9\xc3\x78\xb5\x9c\x4f\x7e\x9d\x2c\xd8\x62\xb2\xbc\xbb\x81\x02\xd6\x77\xf6\x2d\xae\x48\xf3\xce\x0e\xc8\x55\x6a\xde\x2e\xe6\xef\xa6\xab\x65\xc6\x3f\x7d\x98\x40\xe5\xe4\x74\xc6\xc7\x33\x3e\x86\x0a\x5b\xfb\xe9\xab\xf9\x6c\xb5\x18\x5f\xad\x32\xb6\x9a\x2f\x56\x71\x1d\xe8\x6c\xf2\xfe\x66\xfa\x7e\x32\xbb\x9a\x0c\xed\x93\x96\xab\xc5\xf4\x6a\x05\x13\x81\x95\xc9\xba\xa5\xa6\x50\x62\x6a\x9f\x37\xc3\xfa\x5d\x06\xfb\x13\x15\xa0\x1e\x15\x18\x4f\x97\xdc\xed\xd7\x91\xa7\x3b\x7a\xb6\xfc\x70\x73\x7e\x31\x7a\x75\xf9\xfb\x39\x80\x4f\xfb\x7f\xcf\x5f\xbf\x78\xfe\xb2\xe3\xff\x3d\x7f\xfd\xf2\xc5\x1f\xfe\xdf\x3f\xe3\x67\x09\x95\xbc\xb7\xe3\x6b\xfe\x61\xbc\xb8\xb6\x22\xe2\x80\xdf\xde\x90\xb4\xc2\x41\x9a\x26\xa2\x43\xc4\x48\xb2\xab\x6b\xf5\xc0\x43\x91\x87\xe2\x35\x9f\x09\x7d\x3e\xba\xc0\x4b\x0c\x31\x2f\x0c\xaa\x60\x1f\x90\xaa\x5a\x56\x85\xae\x4d\x08\x5e\xd1\x23\xe2\xb8\xdc\x38\x09\xc4\x57\xba\x3a\xf7\xc9\xab\xce\x0b\x9f\x8f\x2e\x1c\xd9\x04\xd4\x1f\x5a\x0f\x6f\xdb\x34\x7b\xaa\x55\x11\xf0\xe9\xb4\x5c\x85\x66\x7b\xfe\x7c\x74\x31\x02\x9c\x74\xd3\x99\x28\xe4\x2a\x80\x9b\xad\x29\x0f\x7c\xbe\x9c\x42\x6d\xdb\xf2\x1d\x77\xb3\xc8\x78\x28\xd8\xb3\x4a\x1f\x5b\x8c\x41\x28\xf2\x53\x0f\xbb\x4f\x27\xd9\xd1\xa4\xb1\xd0\xe8\x59\x12\xdb\xad\xae\x25\x8b\x5a\xb5\x1e\x3d\xec\xa9\x45\xb7\x0e\x11\xc1\x8c\x8d\xf6\xe3\x1d\xba\x7b\xe3\x26\x4c\xb2\xe7\xb1\xfd\xb4\x40\xc4\x16\x18\x00\xbb\x2c\x2f\x81\x22\xf7\x0d\x62\xa7\xf9\x59\x2f\x11\x85\x92\xd6\xe7\xa2\x60\x30\x94\x17\x53\xea\x0c\x02\xc3\x00\xdd\x18\xf5\x96\x16\xc3\x65\x00\xaa\x76\x31\xb9\x5d\xcc\xaf\xef\x40\xe7\xe1\x4d\x70\x3d\xb5\xca\xf2\xed\x1d\x68\x41\xc2\x69\xf6\xc3\xdf\x07\x1e\xe9\x8e\x86\xfc\x4e\x8a\xea\x74\xac\x99\x3c\xf9\xcc\x03\x4d\x83\x31\x5d\x44\x37\x37\x13\x09\xf4\x3a\x94\xab\xfb\x72\xbc\x9f\x02\xe5\x78\x17\x3f\xe1\xc7\xa4\xeb\xa3\x41\x2d\x90\xc8\x53\x3f\x56\x48\x5e\x4c\xdd\x27\x8e\x9b\x8d\xe2\x07\x19\x7e\xd0\xe5\xb9\xc1\xf2\x72\xb1\xf4\x1e\x68\x3d\x76\xd6\x9c\xc0\x33\x8f\x5e\xdd\x56\x91\x18\x12\x27\x9a\x7b\xbd\x3d\x4e\xbe\x51\x21\xfc\xd2\xd3\xff\x10\x89\x7a\xe6\xfa\x13\x12\x6f\x3d\x5f\xa3\x81\x67\x7f\xeb\xec\xac\xdd\x4e\x57\xbe\xf5\x07\xa5\xb0\x44\x43\x2f\xc1\xfa\x42\xf0\x0b\xbf\x8f\xb4\x1d\xb1\xc7\x67\x6a\x48\x88\xa8\x47\xeb\xca\x21\xda\x05\x7b\xf2\xe3\x7f\xc3\x41\x0a\x54\xce\x04\x87\x41\x27\x23\x72\x1c\x9d\xb1\x8e\x83\xf1\x14\xfb\x6c\x7d\xf0\xbd\x1e\x13\x0e\x45\xac\xce\x55\x6a\x88\x7b\x65\xb6\x6a\x0f\x5c\x44\x6a\x83\x26\x5f\x0e\xe4\xe2\xaf\x2e\xfe\xcf\xa1\xe3\x6a\x75\x58\x3a\xdd\x36\x9e\x66\x0c\x70\x19\xc6\x3d\x4b\x0d\x89\x16\x1a\x3a\x58\x27\xcf\x8d\xc6\x16\x6f\xe8\x67\xdd\x0e\xa0\x03\xa6\xfd\xaf\x7a\x30\x8c\xf7\x14\x90\xfe\xd0\x22\xa5\x45\xf7\x3c\xde\x7d\x47\x3d\x8b\xdd\x86\x42\x33\x69\x67\xbb\x1f\xe3\xa7\xfc\x3b\x51\xf2\xdc\xfa\x07\xdf\xd9\xf1\x2f\x3a\x57\x95\xfa\xfd\x78\x8c\x77\x21\xa1\x8a\x91\x42\x89\x6e\x7d\x6b\x79\xaf\x0c\x52\x84\x42\x87\xee\xf0\xef\xa1\x75\x58\x77\xca\x1e\xce\x36\x6f\xa0\x6b\xd9\x5e\x03\x5f\xdb\x81\x9f\xed\x84\xf9\x32\x74\xb4\xb7\x70\x3a\x45\x23\xec\xbd\xc4\xe8\x77\x67\xf6\xce\x09\xa8\x6f\x6a\x39\x01\x1f\x5d\xf9\xee\xa5\xc3\x78\x5e\x11\xee\x7f\xd7\x3d\x1b\x7b\xc0\x53\xd5\x2e\xb4\x81\xfd\x82\xc1\xf1\x3d\xe9\x18\xdb\xf7\x47\x20\x4f\x64\x57\x8e\x82\x48\x95\x6c\xa0\xa0\xc7\x64\x7c\xad\x45\x5d\x38\x74\x67\xc6\xaf\xc6\xd7\xae\x47\x62\xe2\xc0\xb2\xb8\xa2\x35\xd7\xd5\x46\xdd\xb7\xd8\x3f\x1e\x3f\x1e\x4f\x06\x81\xb7\xc7\x93\x81\x06\x2a\xf6\x77\xc1\x9d\x85\x04\x28\xc1\x7b\x72\x51\x52\xa3\x1e\x17\x45\xb1\x47\x09\x7e\x53\x46\x0d\x73\x42\xb9\xc3\x2e\x46\xf1\xf7\x4c\x19\x59\x63\xed\xe6\x86\xfa\x80\x8c\xdf\x43\x72\xc8\x7e\xa4\x13\x4a\x43\xc8\x2c\xc5\x3d\xc2\xfb\xb6\xa2\x2e\xc0\xcb\x21\x19\xb2\x1e\x0d\xa4\xd1\x29\x00\xd2\x68\x52\x4d\x3b\x59\x28\xc1\x9b\xc3\x5e\xc6\x7b\x81\xf8\x1f\xf8\x5b\x83\xa3\x26\x9e\x46\x61\xf8\xfa\xd0\x48\x3b\x28\x93\xb1\x77\xb7\xef\xc7\x7c\xad\x1a\xe4\x3b\x37\x56\xa3\x35\x9e\x2a\xfa\x84\x28\xda\x3b\x0d\x84\x11\xb9\xa4\x13\x81\xc2\x7a\x99\x8e\x24\x61\x47\x12\x47\x5a\x60\x8f\x77\x68\xe7\xa1\xaa\x78\x65\xbd\xba\x61\x84\xa2\xc6\xe5\xee\x78\x79\xe1\xd2\x0e\x76\x85\xf1\x7d\xb0\x10\x81\xef\x6e\x15\x8c\x6e\xb1\x88\x26\xd1\x77\x7a\xb7\x9a\x1a\x98\x27\x64\x91\xb4\x1f\x3a\x83\xb6\x08\x50\xf3\xcd\xb1\x3e\x1e\xe3\xc3\x84\x5d\x1b\xef\xf7\xb2\x2a\xd4\x57\x34\x00\x92\xd9\x5f\xcb\x5a\x3d\x88\x46\x3d\x48\x44\xcd\x0e\xba\x62\x88\x6c\x81\xc7\x73\xd7\x35\x8f\x27\xec\x87\xeb\xf1\x0b\x67\x80\x56\xad\x21\x6b\x69\x85\x17\x2f\x00\x0f\x70\x0d\x3d\xc4\x21\xf4\x58\xa8\x46\x03\xe8\x1a\xd0\x02\x88\x66\x85\xd8\x80\x3b\xb2\xb2\x14\x6b\x5d\xbb\x7f\xf9\x00\x55\x1a\x88\xf0\xdd\xa4\x33\x0c\xc8\x3e\x6e\x75\x09\x27\x91\xf9\x00\xe8\xf1\xce\x22\x73\x6c\xef\x95\xe6\x37\x2b\x2c\x13\xd4\x33\x11\x9d\x4c\xca\x2a\x0e\xbf\x87\x65\x40\x54\x3f\xf5\x2b\x05\xa0\x63\xad\x77\xae\xdd\x95\x35\xc6\x01\xbb\x78\xa6\x6b\xb6\x56\x58\x38\x52\x89\x9d\x84\x2b\x68\xbf\x3d\x18\x22\x04\x27\x3e\x19\x4f\x47\xdf\xc8\xda\x21\xec\x3c\xb0\xc4\x43\xe6\x0c\xd3\x9b\x2c\x5d\xe1\xee\xd6\xda\xbf\xd6\x52\x6f\xe2\xed\xbf\x72\x8d\x3f\x00\x0b\xd0\xd9\x7a\x3a\xc6\xba\xee\x3d\x0e\xe1\xdc\x5a\x11\xeb\xa6\x3d\x9c\x85\xe2\x47\x63\x1f\x98\x6e\x96\x15\xe6\xc2\x59\x74\xae\x2e\xc1\x7e\xde\x2a\xb3\x53\x83\xcf\x12\xb4\x60\xd5\x50\xcf\x4f\x6e\xda\x75\xa8\x4b\xf5\x96\xfe\x46\xd7\x0c\xc6\x69\x22\xe0\x17\x0c\x29\xb1\xcf\x82\x21\x87\x95\x30\xa7\x2f\x64\x16\x99\x78\xf6\xaa\x80\xb7\x5a\x69\x5f\xcb\xad\x08\x6d\x23\xe2\xc7\x9e\x16\x2f\x96\x58\x4c\x7e\x06\xee\xce\xf6\x97\x80\xde\x44\x64\x14\x19\x56\xd8\x62\x7a\xc1\x45\x9c\x28\xc1\x46\xe8\x3e\x13\x31\xb1\xfb\xa5\xb0\x22\xd4\x44\x27\x04\xd6\xd6\x3c\x7d\x2f\xb0\xe4\xb9\x76\x9a\x11\x29\xc6\x4e\xa8\x12\xbb\xda\xc3\xed\x18\x27\x8e\x9c\xf1\x88\x28\x51\x0c\xf4\x32\x65\x4c\x0b\x9d\x13\x72\x0c\x45\xe3\xdf\x42\x24\x1d\xad\x3c\x6f\x91\xc6\x6b\x9a\xfa\x6f\x9e\x34\xd0\x15\xd1\x20\x57\x7d\xde\x1a\x2a\x9d\x2c\xb8\xda\x81\x0a\x24\x13\xfb\x93\x27\x3c\x0d\x96\x46\xba\x62\x4e\xa6\x72\x5d\x99\xbd\xca\x5b\xa4\xb3\xa6\xa6\xf1\xb1\x3d\x49\x67\xc2\xf5\x27\xb6\xeb\x0f\x4b\xd7\x63\xed\x0b\xc3\x07\x33\xdd\x00\xe8\x3c\x1c\xb2\xd1\xa0\xef\xf4\x75\x5c\x0c\xbf\x69\xee\xe0\x3c\x61\x21\xfa\x75\x02\xfa\xa0\x2d\x54\xd2\xc4\x2f\xe4\x5b\x7b\x7d\x4a\x59\x05\x0c\xc9\xfa\x90\xbe\xc1\xb4\x6b\xe4\xd8\x86\x8e\xe8\x51\x29\x4c\xdc\xa6\x9c\x6a\xed\x9e\x8f\xf8\x7b\x68\xec\x00\xfc\x73\xc4\x1d\xbe\x8c\x9b\x19\x9e\x70\xd9\x8e\x60\xe3\x50\x66\x10\xad\x00\x54\x3e\xaf\x1d\xa7\x3f\xd1\x52\x71\x61\xed\xde\xbd\x6c\x5a\x2b\xf1\x51\x97\xa5\xb4\xff\x12\xab\xf4\xb9\x63\x4c\x8e\xfb\x2f\x65\x5c\xd5\xb5\x7c\xd0\x58\xfb\x74\xdc\x85\x89\xce\x29\x80\xcb\x09\x48\x9b\xb1\x7d\x6d\xf5\xb6\x3c\x56\x41\x7a\xd3\x17\x1e\xef\xc6\xc6\xb3\xa8\x09\x15\x82\xe3\xa3\xea\xf8\x44\x25\x82\x71\x73\xf4\x96\x53\x57\x2c\x3e\x0a\x92\x22\x9e\x4f\x3f\x76\xd2\xc3\xa3\x8d\x2b\x6b\xa2\xe9\x15\xaa\x20\x4a\x78\x65\xac\x7f\xfb\x22\xda\x43\xb4\xb8\xff\xc7\x6d\xe5\x59\xe8\xb4\x1d\x77\x0b\x0f\x2d\x78\x87\xdd\xfe\x0d\xbe\x93\x16\xa0\xdb\x30\x69\xd4\x62\xcb\xb4\x0d\xd6\x17\x40\xde\x8d\xfe\x17\x7b\x6a\x65\x69\x53\x2d\xe6\x9a\x63\x46\x5a\x05\x91\x98\xb0\x93\xee\x4d\x2e\x88\x12\xe0\xe0\x56\x49\x25\x8d\xbd\x68\x54\x30\x95\x35\x81\x68\xe3\xf5\xf3\x4a\xd1\xc1\xc4\x15\x9c\xcc\xa8\x21\x1c\x92\xdd\xc5\x07\xfd\xcc\x0c\xa1\x81\xbf\xa4\x7b\x0c\x21\xa0\x71\x3d\xd2\xf1\x17\x82\x21\x81\xf5\x30\x9a\x4c\x32\x3b\x20\x76\xf4\x59\xbb\xd8\xee\x92\x02\x2c\xde\x67\xe8\xe5\x6a\x1a\xd5\x58\xd9\xf6\xcd\x21\x7c\x27\x44\xea\x6e\x05\x81\x36\x8a\x51\x9c\x6a\x8e\xc8\xbf\xaf\x39\x22\xf3\x88\x07\x18\x30\xd5\xf4\x54\x71\xae\x3b\xaa\xe4\xeb\xa8\x2f\x6c\x34\x01\x83\x35\x51\x08\x22\x6a\x7e\x76\xe8\x6b\x0c\xe6\xda\x11\x3c\xd1\x26\x1d\x25\xbc\xa7\xc3\x3b\xe1\xd8\xc8\xb0\x21\x1d\x1f\x9a\x42\x0b\x9f\x15\x2e\xec\x3f\x49\x8c\xdc\xfa\x31\x65\xc0\x65\x2c\x46\x90\x4e\x5f\xc8\x38\xb6\x15\xca\x20\xbd\xea\xea\x52\x71\xa4\x95\x43\xb4\x60\xec\x94\x65\x05\x2b\x6e\x8d\x34\x59\xa8\x76\x47\xc5\xa6\xba\xf6\xd9\xae\x6e\xa9\x71\x05\xd5\x6b\xfd\xde\x40\xa7\x36\x17\x46\x2a\xe5\x69\xa8\x0a\x42\x54\x3e\x3b\x18\x3f\x90\xd0\x85\xe4\x6f\x68\x11\xd4\x99\xcb\xb1\xf2\x8c\x9b\x3f\x87\x5d\xf8\x05\x93\x6b\xcf\xa3\x57\x60\xa8\x29\x18\xa5\xd6\x49\xb1\xde\x39\x86\xa1\x6a\x6c\x13\x9d\xa0\xb9\x51\xd3\xb8\x06\x9d\x00\xe8\x47\x9e\x41\x4c\x3c\xc3\xb7\xe9\x45\x2f\xa2\x17\x21\x1c\xc1\x97\x1c\x27\x9e\x23\x82\x25\x7b\x36\x84\xd6\x2c\xca\xcb\x32\x20\x9d\x74\x51\x9c\x8c\x24\x31\xb3\xf6\x14\x46\x49\x50\x57\x89\x26\x1c\x05\x37\x6c\x5f\x6e\x8f\xef\x4e\x20\xe1\x5d\xe6\x03\xd4\x55\x9e\x05\x11\xea\xe3\xb4\xeb\x1d\x8e\x6d\x64\x34\x9d\x84\xba\x71\xa1\xb2\xee\x04\x68\x15\x5e\x7a\xbc\xee\x27\x6c\xee\x45\xdd\x1b\x05\x1f\xcc\xe6\xab\xe9\xd5\x64\xc0\x1b\xf9\xb5\x41\x82\x43\x61\x92\xfa\xe8\x58\xd2\xa9\x6a\xfc\x7b\x97\x0a\x97\xdd\x79\x65\x02\x5a\xca\x81\xa2\x8d\xdb\x82\xf7\xad\x93\xaf\xca\x74\x7a\x03\x8e\x23\x0e\x15\x06\x79\xb4\x50\xec\x3b\x17\x8a\x9f\x58\x28\xec\x0b\x47\x74\x8e\xac\xaf\x54\x0f\xeb\x45\xcc\xcf\x6e\x48\xc2\x8d\x27\xac\x5c\x8c\x6d\xa0\x55\x3c\xbd\x31\x91\x46\xec\xc4\x30\x3a\x21\x1e\xb5\x09\xb4\x23\x40\xbf\x17\xae\x8a\xe3\xa7\x42\xb3\x53\x37\x40\x32\x8c\xa2\xe8\x11\x59\xc7\x5d\x1f\x1a\x5e\x02\xfd\xbd\xac\x02\x7a\x90\x35\x2e\x38\xf4\x77\x3a\xc7\xfe\x4e\x6e\x7d\x2b\x5d\xef\xb0\xc9\xf4\x7e\x2f\x45\x8d\x94\x24\x71\x13\x4b\xfb\xfc\x68\xa7\xe0\xee\xec\x80\x04\x45\x19\x39\x60\x15\x31\xa8\xd1\x9e\x85\x5e\x25\x2c\x69\xc4\x6d\xd5\xab\x28\x0a\x24\x48\xd5\x8f\x55\xaf\xdc\xd0\xcc\xbb\xcb\xc2\xfa\x8e\x31\x52\x19\x42\xf9\x0e\xf0\xbf\x02\x85\x42\x51\xc8\xaa\x68\x3d\x91\x68\xb2\xc3\x74\x76\x19\x1e\xd4\x54\xad\x62\x70\x2c\x50\x00\xf4\x0a\x35\xf6\xf3\x89\xbb\x2c\x31\x61\xa2\x76\xed\x71\x0e\xa2\x7f\xce\x21\x76\x1c\x50\xdf\x44\x1a\xdb\xc1\x81\x38\x30\x93\x2b\xc3\x3a\xc5\xd3\xee\x6d\xb2\x1e\xeb\x92\x9d\xc8\xed\xc0\x03\x52\x50\xc6\xe7\x1e\x06\x0c\x74\xfa\x31\xc2\x6d\x8d\x98\xe3\x1b\x22\x8a\x0b\xf9\xe5\x84\x27\x7d\x4f\x42\x29\xb9\x7f\xbc\x53\x88\xdd\xd8\x43\xeb\xf5\xa4\xd3\x52\xc7\x3e\x0d\xa1\xfa\x57\x60\x6d\x3b\x44\x8e\xde\x24\x86\x8c\x19\xf1\x3b\xa4\x0c\xb6\x7b\x22\xbf\xee\x01\xa6\xe2\x89\x63\xa3\x04\x87\xa8\x0e\xac\x63\x02\xf5\x07\x46\xf0\x3c\x9c\x08\x86\x7c\x46\x28\x7e\x38\x01\xba\x0e\x90\xba\x6e\xca\xf1\x1b\xfe\x80\xc7\x8a\x01\xa1\x7e\x90\x01\xca\x57\xc6\x58\x9e\x11\xef\xb6\x74\x01\xed\xbc\xd6\x0f\xe0\x18\xa0\xa3\x83\x94\x58\x0c\x87\x63\xda\xbd\xac\x8d\x2c\x02\x2e\xea\x90\x26\x43\x61\xeb\x21\xf2\xd6\x04\x97\x2f\x74\xd8\x3a\xe8\x96\x59\x19\x05\x37\x80\x8a\x2d\x09\xfb\xea\x27\x5e\xcb\x7b\x81\xb4\xd2\xa9\x65\x4e\x39\xcb\xd7\xa3\x28\x39\x81\x4d\x75\xbc\xbd\xe7\xeb\x4f\xa8\x2d\x71\xd2\xa3\xd6\x65\xb7\xe0\xd2\x86\x98\x9f\xc9\x98\xbf\xc1\x4d\xe6\x21\xd1\xf4\x4f\x6c\x1f\x69\xa5\x11\x3f\x9c\x66\x9f\xad\xd6\x0d\x6e\x90\xaf\x62\x45\xfe\x1d\xdf\xa8\x1d\xf6\xca\xf7\x0a\x22\xf8\x73\x21\x4d\x5e\xab\xb5\x5b\x6f\x42\xb2\x76\x42\x76\xac\xcb\xe2\x43\x0a\x97\x1f\xeb\xdb\x11\x40\xcc\x4e\x34\x38\x70\x82\x1c\x23\xe9\x22\x46\x92\x52\x3c\x82\x2e\xb4\x3b\x04\x41\xa7\x10\x57\xc9\xa2\x9c\xbd\x63\x40\xf5\x23\x3c\xf3\x0c\xc9\xb1\xe7\xe4\x3f\xa7\x1a\x93\x1c\x0b\x33\xc4\x16\x0f\xbe\x6b\xc1\xdb\xf1\x72\xba\xcc\xba\xcd\x0b\x88\x89\x3d\x4a\x6f\x63\x33\x03\x86\xcd\x0c\xa8\xc8\xc9\x35\x37\xc6\xce\xea\x25\xe0\x8f\xbd\x63\xe3\xe5\x3f\x22\x3a\xcf\x30\x96\xee\x53\xed\x4c\x77\x11\x6d\xab\xe9\xea\x66\x92\xf1\xd9\x7c\x76\x3e\x9d\xbd\x5b\x4c\x67\xef\x27\x1f\x27\xb3\x55\xd6\xc5\x61\x65\x11\x71\x2f\x7f\x37\x5f\xb0\x7e\xe2\xde\xcf\xd4\x0c\xd2\xe8\x52\x42\xfb\x57\xb3\xd7\x15\x36\xd4\x45\x1a\x09\x74\x42\xfc\x89\xdb\x23\x48\xcf\x5a\x95\x12\xb9\xcb\x5a\xe3\xcb\x88\x93\x4e\x90\x69\x54\xd7\x98\x76\x87\x76\x74\xad\x0c\xa8\x57\xa3\x73\xe5\xbd\x2f\xbc\x25\xe2\x26\xfb\x31\x4f\x4d\x5f\xab\x4b\xf6\xa7\xd3\x6d\x0e\xf8\xd4\x5e\x6c\x9e\xb6\xc7\x61\x21\x2a\x4d\xac\xf0\xcd\x56\xea\x3a\xca\x0a\x83\x15\x56\x37\xb1\xd3\x59\xc9\xfb\x52\xdd\xcb\x2a\x97\xc3\xcc\xa7\x8c\xb3\x4e\xce\xb8\x3d\x12\x58\xd6\x11\x58\x0f\xfa\x2e\x64\xa9\xd6\x18\x94\xc7\x9e\xad\xda\x98\xf2\xe0\x5f\xd3\x70\x91\x37\x66\x78\x5a\xc0\xa9\xd2\xaa\x3a\x24\x52\xbc\x96\xc0\x06\x8f\xd5\x14\x76\x2b\x61\xcf\xc4\x4e\xdc\x27\x21\x5b\x50\xb0\x2e\x7f\x1e\x32\xe9\x80\x4b\x14\x25\x7c\x10\x30\xd5\x14\x2d\xf6\xbd\xf4\xa0\xd3\x38\x3d\x8e\x54\x26\xcb\xb7\xc2\x2e\x85\xac\xb9\xa8\x31\xe1\x4c\x0c\x15\xae\xdf\x49\xe2\xd6\xda\xf5\x6a\xbd\x26\x68\xf1\x37\xaa\xa2\x8d\x62\x91\xae\xc3\xb3\xfa\x64\xf6\xd1\x8d\x04\x58\x0e\x34\x36\x1f\xbd\xd7\xba\x78\x54\x65\x99\x31\xec\x8d\xd6\xe8\xfd\x1e\x5a\xb3\x7a\x0a\x82\x8d\x50\x65\x5b\xe3\x35\x20\x4a\xc7\xa2\x83\x68\x86\xaa\x0b\x86\xc8\xf5\x6e\x67\x65\x50\x94\xcc\xcf\x1b\x5f\x06\x6d\x37\x81\x38\x5b\x6d\x8e\x03\x31\x3e\x78\x2a\x0a\x2c\x62\xf5\xcc\x2e\xc6\x28\x9a\xac\xcb\xfb\xd3\x83\x47\x8c\xfd\x34\xe2\x63\x80\xd5\xdb\x09\x7f\x8a\x08\xff\x23\x16\xc8\x48\xaa\x3f\x6d\xad\xc9\x7a\xe2\x98\x3d\x9d\x0c\xf9\x9c\x96\x28\x36\x1a\xc3\x59\x99\xa3\xc1\x87\x6e\xdd\x7c\x23\x91\x6b\x83\xa5\x95\x7a\xd4\x0d\x2f\xf3\x34\xe1\x20\x44\x72\x57\x01\xb4\x22\xc2\x80\xbb\xbe\x04\x51\xef\x1c\x46\xd8\x6d\xca\xe3\x1f\xf7\xb4\x8e\x7b\x4b\xba\x56\x3c\xe0\xee\xf8\x85\x21\xde\xa6\xd0\xf6\xd1\x17\xc9\x03\x8a\xa3\x42\xd0\x9a\x37\x43\x29\x1b\x80\x44\x0b\xf8\x6b\xab\xdc\x82\x6a\x83\x31\x66\xc4\xa4\xc7\x42\x42\x26\x04\x12\xa2\x9d\x8d\x18\x1b\x14\x06\xb2\x7c\xab\x48\x5a\x83\xcd\x21\xc3\xce\xa2\x05\x46\x71\xb7\xba\xec\xb9\x6f\xb6\xa2\xde\x81\xb2\x70\x56\x67\xdc\x12\x02\x40\x69\x3e\xa3\x41\xa1\x3f\x61\x8c\xac\xc1\x59\xc3\xe8\x58\x76\x2c\x75\x40\xe5\x60\x6f\x70\x1e\x1a\xe5\xba\x55\x73\x96\xad\xdf\x34\x16\xe5\xd1\x44\x19\xde\xef\xfa\x41\xf0\xfe\x7e\x10\xe3\xdb\xdb\xc9\xec\x7a\xfa\xd7\x9f\xf9\x87\x98\x56\x3a\xc1\xd6\x61\x7f\x54\x4c\xff\x41\xeb\x84\x6f\x7c\xe6\x44\x53\x85\xb5\x56\xa5\xac\x81\xd6\x8a\xfc\x92\x2c\xb0\x4c\x6e\x94\x2c\x0b\xc3\x65\x05\x40\x45\x30\x0e\xd6\xb5\xc8\xbf\xc8\xc6\xf0\xc1\xbf\xfd\xfb\xc0\x5a\xe4\xd6\x07\xa6\xfb\xe4\xe0\xc4\x81\x8a\x45\xac\x0f\xc3\x22\x2f\x6f\xc4\xcf\xae\x75\xf5\x63\x93\xb4\x32\x74\x0f\xfc\x3f\x86\xd4\x4e\xef\x6b\xc3\x43\xcd\x8f\x7f\xb5\xaa\x58\xe7\x2e\x44\xbd\x51\x35\xdc\x1c\xaa\x46\x7c\xf5\x55\xa9\xe0\x63\xe2\x3b\x47\xfc\x93\x44\xc2\x25\x60\xdf\xd8\x49\xe2\x3f\x62\x02\x3f\x85\x1b\x6f\xa2\x36\x0a\x68\x7c\x79\x38\xa1\xcb\x62\xad\x65\x48\xf5\x13\x58\x13\x0a\xf6\x07\xfb\x5a\x01\xeb\xac\xd5\x7f\x03\x28\xcc\x39\x45\x3e\x24\x85\x51\xb2\xf6\x75\x34\x11\x27\x0e\x7a\x1f\xce\xaf\x66\xc4\xd6\x6e\x75\x55\xa8\x1b\xfc\xb7\xc3\xe1\x70\xf8\x77\xfe\x6f\x0e\x45\x1f\x5e\x01\x09\xad\x7f\x8f\x4a\x0c\x91\xa1\xaa\x84\x6b\xde\xa1\x7b\x6a\xc9\x7a\x30\x8a\x4b\xe8\x9d\xb5\x17\x05\xff\xe0\xd0\x21\xde\x4d\xf8\x35\x82\xaf\xf2\xb3\x06\xa9\x40\x11\x05\x38\xfc\x85\x1d\xa2\x9e\xd7\x78\x99\x50\x38\xd4\x19\xbd\xd0\x72\xc5\x5a\x5f\xa0\xcf\x22\x5a\x9c\x8e\x33\xab\xd7\x8d\x50\x15\xeb\xf2\xdd\x90\x63\xe0\xe1\xa7\xc6\x8d\x34\x45\x9f\x7a\xf0\x75\xd7\x8c\x65\x4f\x9b\xb1\x3c\xb9\xe5\x7d\xf7\x6c\x8f\x91\x41\x5f\x99\x8a\x21\x7a\x0b\x54\x52\xfc\x67\xfc\x89\xa7\x0c\x59\xf6\x0d\x43\x96\x7f\xc3\x90\x0d\x3d\x1f\x1c\x7b\xe0\x11\x97\x7e\x29\xaa\xfb\x56\xdc\x4b\x62\xf7\xed\x80\xd3\x3a\x2d\x7e\x4c\x44\xa0\xe1\x8d\xbc\xff\x6e\x4c\xf5\xff\xa4\x9f\xd1\xb3\xab\xeb\x9b\xf1\xf9\x2d\xad\xf0\x83\x3c\xbf\x1c\x5d\xfc\x83\x4b\x01\xbe\x81\xff\x7f\x79\xf9\xfa\x55\x97\xff\xfd\xcd\xeb\x8b\x3f\xf0\xff\xff\x8c\x9f\x2b\x5f\x3c\x7d\x2d\x1a\xe1\x55\xc2\xd8\x47\x34\xce\x79\x90\x0d\x7e\xee\xb5\xea\xe5\xe8\x82\x50\xe4\xca\x71\x21\xff\x86\x07\x65\xf1\x73\xf8\xd9\xc0\x7f\x6a\x30\x1c\x31\xf8\x7e\x8c\x33\x23\x2f\x25\xd2\x5c\xe1\xa9\xeb\x43\xc2\x43\x08\xdf\x25\xde\xae\xda\x8c\x18\x18\x72\xb1\x83\x18\x1a\xf9\xc7\xc0\xd1\x58\xc1\x78\xf4\x2b\xc0\xd9\xa3\xa4\x1e\x3e\x2c\x32\x72\xc1\x09\xf0\x23\x41\xd6\x5b\x4f\xd6\xfb\xad\x78\x16\xf3\x73\x20\xb6\x1b\x44\xfd\x36\x14\xee\x87\x49\x25\xb3\x71\x08\x0b\x4a\xb9\x10\xf4\x14\x3e\x12\x90\x80\xa2\x2a\x42\x64\xd8\xb5\x98\x86\xcf\xc3\x07\x13\xb0\xc9\x51\x03\xab\xee\x48\xb1\xa9\xd9\x5a\x3a\x1a\x71\xd3\x6e\x36\x2a\x57\x90\x68\x26\x2e\x6a\x42\x9e\x3a\xc3\x25\x94\xcc\x6f\x3a\x1b\x05\x3e\x0b\x76\x53\x2b\x0f\x19\x4b\x66\x76\x66\x86\xf0\x6a\x3b\x66\xbc\xa8\x6f\x45\xdd\x28\x69\x06\x43\xb2\x9b\x85\x21\x83\xcf\xfc\x0c\x00\x17\x47\xc0\x9c\x02\xfe\x19\xbb\x1c\x5d\xf2\xc1\xb8\xf0\x20\x27\x00\x51\x39\x6a\x7d\x5c\x02\x1f\x37\x00\x3b\x0f\x18\xaa\x77\x52\x57\x92\xcb\xd2\xc8\x1f\x0d\x7c\x28\x0b\xc8\x58\xeb\x4e\xc3\xa7\x07\xce\xbb\x32\xa3\x81\xf7\xb4\x8c\x0b\xf1\x3b\x7b\x70\x01\xdf\xb3\x96\xcf\xe5\xe8\x39\xd0\xa6\xef\xdb\xc6\x25\x08\xee\x8c\x74\x03\x43\x51\xaa\x44\x79\x30\xca\xd8\x49\x63\xc1\x80\x77\x77\x37\xe4\x89\xd2\x57\x59\x21\x1f\x20\xe0\x9e\x74\xf0\x0f\x4e\x94\x3a\x6a\x9e\x67\xa7\x31\xe2\x6f\xb1\x47\xbc\xde\x78\xfc\xa6\x15\x10\xef\x20\x53\xf0\xa8\x6f\x98\x3e\x9f\x46\x36\x6b\x19\x91\x8f\x62\x05\x7e\x3c\x3c\x98\x49\x83\xc8\x61\x99\x6f\x2b\xf5\x1f\xad\xcc\xba\x28\xaa\xa4\x5d\xb4\x9f\xbb\x4b\x53\xc2\xa1\xaf\x58\xa1\xee\x55\x23\x4a\x4c\x1c\x41\xff\x21\xcc\xf3\x24\x45\xdd\x62\xad\x5b\xda\x4e\x17\x29\xd9\x8b\xa6\x91\x35\x74\xf7\xaf\x65\x55\x98\x8c\xe5\xba\x76\x00\x16\x88\x6a\x10\x17\x26\xfc\xb7\x09\x47\xdf\xa5\x35\x24\x6e\xda\x0b\x3e\xb0\xcf\x1d\x44\xac\xe6\x49\x39\x79\x08\x35\x78\x03\x16\x0e\x9e\x8a\x69\x01\x21\x37\x20\x0c\x57\x3e\x16\x60\x9d\x02\x08\x09\x95\xa5\xe7\x78\xa5\xfa\x04\x44\x5e\x95\x21\xb0\xc4\x73\x2a\xf7\xd1\x35\xbf\x17\xe0\x8c\xa3\x39\xd8\xd1\x07\xe0\x12\x3a\xa0\x16\xd5\x6a\xe8\x0a\x12\x9c\xe8\x9e\x66\x01\x72\x11\x99\xd1\x3d\xb4\x07\xb1\x2a\xba\x1c\xbd\xc4\x25\xf0\x2f\x8a\x11\x83\x93\x63\x9c\x45\x75\x70\x6d\x8d\x24\x77\x78\x07\x91\x37\xba\xf6\xa1\x8b\xc9\x51\xfd\x4a\xa3\x91\x70\xc4\x90\x8e\x4b\x20\x8e\xd1\x77\x86\xa8\x0c\xe9\xb3\xd2\xa0\xde\xe8\xbd\x08\xb0\x48\xd6\xb5\x1b\x5c\x80\xea\xc3\xd6\x1f\x30\xa9\x57\x7c\x30\xa9\xb6\x56\x6d\x17\xbc\xbb\xc1\x80\x50\x6b\xdc\xa9\x09\x59\x5f\x37\x44\x4f\x3a\xab\x0c\xb3\x72\xaf\x29\x54\x73\x26\x86\xf8\xb6\xa0\x0e\x28\x6e\x71\xb6\x1e\x12\x25\x46\x54\xc4\x0c\x0f\xff\xec\x18\xb0\x1c\x5e\x8e\x9d\xdc\x87\xd7\x76\xc8\x58\xa5\x13\x36\xa0\x12\x4d\x5b\x23\x21\xb7\x21\xd6\xab\xfa\x5e\x54\xc4\x7b\x44\x77\xc7\x57\x65\x9a\xd8\x32\x2e\xc5\xa3\x8f\xee\xff\xad\xad\x95\x29\xb0\xa8\x1e\xbc\x88\xa8\x2f\x3b\x3d\x0a\x4a\xda\x12\xaa\x3f\x1f\xea\x62\xae\xee\x87\xff\x97\xeb\x7e\x58\x5c\xf7\x73\x1a\x24\xfd\x64\xdd\x8f\x00\xd8\x37\x4b\xea\x7e\xc2\xc9\xc2\x7f\xfd\xb6\xda\x1f\xd6\xa9\xfd\xe1\xa7\x6b\x7f\xec\x26\x43\x7e\x23\xae\xd1\x81\x1e\x5b\xc0\x60\x0f\x55\x40\xac\x53\x05\x74\xaa\xfa\x07\x2e\x22\x99\xb7\x35\xf1\x03\x9e\xe5\xf8\xec\x50\x0a\xc4\x4e\x95\x02\x41\x7e\xfc\xac\x18\x52\x6e\x0b\xa3\x43\x18\x71\xd1\xaa\x6a\x92\x99\x78\x6b\x85\xb9\xe0\x1a\x6a\xe9\x9d\xf8\x9b\xae\x15\x76\xf2\xc3\x05\xd2\x35\xa9\x66\x3a\x89\x20\x91\x6f\xf8\x00\xa4\xfa\x10\xdd\xaf\x85\x2c\x65\x23\x33\x2e\x6b\x61\x20\x80\x5a\xdb\xaf\x63\x64\xff\x9c\x88\x02\xfa\x2e\xd5\x41\x72\x3e\x46\x83\xce\x79\x79\xe2\x5e\xfd\x13\x1f\xd0\xc9\x8c\x86\x81\xe4\xfc\x65\x89\xa0\xad\xce\x89\x8e\xd4\x15\x9c\x57\xa7\x09\x40\x9d\x0c\x23\xf3\xc9\x81\x94\x90\xbc\x93\x9a\x81\x42\xa6\x0b\x52\x3e\xf6\x6a\x4c\x30\xcd\x2e\x19\x0d\xd1\x72\x8a\x00\x54\x1e\x65\x4f\x95\x28\xb0\x14\x3b\xdd\x48\xe2\x6b\x47\x61\x8f\xf1\xd7\x13\x92\x39\xa7\x64\xdc\x7c\xbc\x45\x9b\xf0\x1f\x75\x20\xbb\x8f\x5b\xed\xca\x54\x49\x0f\x7b\x36\x09\x07\x2b\x87\x1a\xc2\x7b\xc0\x3f\x0b\x44\x31\x39\x1d\x8d\x41\x05\x32\x5f\x1d\xd9\x07\xe2\xf1\xab\xf8\x11\x3f\xba\x3b\x65\xc4\xc6\xb4\xfc\xae\x23\x8e\xce\xf3\xb6\x36\x68\xb0\x02\xf1\x4d\xac\x3a\xc1\x0c\xb1\x9b\xf6\x13\x1f\xa0\x4e\x96\x03\xfb\x4e\xf7\x0f\x13\x6d\x21\xa8\x45\x08\x87\x13\xd1\x21\xac\x96\xd3\x9c\x19\xf6\xd5\x2d\x61\x36\xae\xf1\x21\x3c\xfa\xf2\xc2\x3e\x0e\xe4\x23\xd6\xea\xba\x6d\x72\xbd\x23\x9b\xa9\x6d\xf6\x6d\x13\x01\x7a\x30\x6a\x83\x96\x31\x88\x44\x62\x02\xb1\x3b\xb4\x58\xd0\x88\xa2\x67\xf7\x14\x65\x84\xc3\x2e\xb8\xfd\xa7\xaa\xd4\xce\x3a\x2e\x48\xcc\xee\xe8\x27\xdd\x0d\x97\x74\xaf\x49\xed\x2d\x5f\xda\x82\x13\xba\xe4\x83\x65\xab\x90\x3e\x4f\xa1\x49\x6a\xff\xca\xd3\xaa\x3b\xbc\xd3\xe3\x5e\x47\x31\x84\x2b\x1c\x36\x34\xff\x51\xed\x3d\x48\xfe\xd3\xeb\x67\x3f\x3d\x9b\x5c\x39\x5d\x34\x69\x6b\xbd\x97\xa2\xe2\xb7\xa2\x2e\x95\xd8\xb9\xe4\x97\xa7\x03\x6e\xab\x5c\x95\xf6\x9f\x97\x97\xec\xa3\xa8\xf3\x2d\xbf\xfc\xe9\xa7\xd7\x2e\x88\x88\xa9\xb1\x7d\xad\x1b\xa7\x55\x37\xbe\x0c\x0f\xf9\xc8\xed\x23\x8b\x40\xd0\x69\xda\x3c\x87\x56\x2e\x19\x8b\xc8\xca\xa9\xa8\xf4\x3f\x5a\xf5\x20\x4a\x3b\x04\xef\x9c\x1d\x10\x03\xab\x7c\xe5\x54\x49\x8b\xf4\x9c\x0f\x22\x83\x1a\xf3\x89\xdd\xd3\x8e\x22\x04\x41\x32\xbb\x34\x18\x2d\x6b\xda\x02\xff\xcb\x77\x71\xce\x98\x28\xc4\x1e\x83\x69\x60\x98\xfe\x27\xfc\xa7\x7c\x10\x65\x2b\xf0\xd7\xa1\xd8\xef\x78\xf3\x00\x55\x36\x74\x51\x2f\x6b\xaa\xed\x44\xbe\x85\x96\x0a\xba\xe6\xdb\x76\x27\x08\x3b\x22\xba\xb0\xd9\xb5\x6e\xb6\x38\x9b\x17\x1c\xeb\x38\x7d\x19\xe7\xb1\xd1\x05\xc2\xeb\xce\x0d\x3f\x69\x09\x8d\x12\x0f\xe9\xf9\x08\xa5\x06\xf6\xf4\x26\x44\xd5\xef\xa8\x96\x3b\x58\x62\x8c\x3d\x1f\x5d\x76\x11\xda\xb1\x37\x28\x01\x7e\xd9\x6c\x01\x43\x9e\xb6\xa2\x89\xdf\x9f\xc1\xd0\x58\xec\xdc\xc5\x80\x6d\xfb\x6f\x0f\xd9\x3e\x89\xd3\x8e\xe1\xd8\x2c\x82\x63\xc7\xb5\x67\x6e\x0c\xaf\xa8\x06\x94\x37\xfa\x67\x30\x09\xec\xdc\xec\x18\x7e\xf1\x04\xe2\x6e\x8a\xa4\x8e\x9e\x8f\x9e\xf3\x15\x4e\x30\x66\xd2\xf6\xea\x96\x6c\x91\x5c\x83\xc3\xea\x8c\x7a\xa8\x4e\x71\x2d\xc4\x02\x03\x0e\x73\xb7\x0c\x86\x2c\xec\x39\x40\xdb\x9d\xfe\x11\x55\xe8\x45\xc7\xb3\xef\x7c\xb3\x85\x3b\xd1\x3e\x39\x26\x1e\x33\x7e\xe4\x2b\x6f\xda\x1a\xfe\x0a\xb7\x39\xac\xa7\xc7\x6b\xd1\xf0\xd9\xf7\x0d\xdd\x0e\x99\xf6\xc6\x07\xd7\xdd\xde\xa0\x6c\x88\xea\xa0\x2b\xc9\xac\x6f\x0c\x17\xcd\xb7\xc5\x0f\x82\x01\x4e\xba\xa2\x8b\x22\x8b\xa9\x97\xfe\x4e\xd1\x82\xad\x7b\x41\xbd\x98\x5c\xd4\xc1\x24\x91\x1c\x0f\x9e\xa6\xd8\x73\x79\x70\x01\x1d\x2b\x62\x91\xbb\x0c\x8e\x58\x2b\x4a\x86\x7c\xf2\xcd\x21\xf2\x91\x7c\x0c\x08\x60\x4a\x2e\x93\xe3\x42\xd8\xc9\xf9\x7a\x01\x5d\x97\x7c\x6c\xa7\x72\x55\x11\xef\xf1\x09\xae\x1c\xe7\xc5\xe8\xd2\x41\xda\x13\xc7\xc7\xfe\x82\xd6\xd4\xbe\x2c\x71\x51\x7e\x66\x8c\x3c\x0c\x24\x11\xd6\xdc\x68\x5a\x72\x11\xe8\x9b\x08\xa8\x46\x9d\x45\x8e\x91\xd1\x0e\xed\x6c\xb7\x31\xd9\x41\x2f\xed\xee\x12\xa4\x90\xd5\xd7\xa6\xef\x4c\x37\x11\x01\x52\x1a\xbe\x72\x8a\x5d\xf0\xed\x61\x2f\x6b\x28\x3e\x0c\x05\x94\xb2\xd9\xea\x22\x20\x86\xac\xa0\x7d\x91\x58\xb9\x40\x63\xed\xa4\x4e\xfa\x07\x40\xa0\x5f\x7b\x96\x7b\x40\xd6\x38\x0d\x00\x58\x13\xcc\xd6\x2a\xea\x64\x31\x7b\x90\xd7\x29\xbe\xd6\x3b\x66\x01\x76\xad\x4d\x0a\xbc\xb6\x46\xf9\x37\x36\x31\x0b\xc3\x83\x4a\xb8\xfa\x01\xad\xd2\xbc\x96\x85\x6a\xa8\xc2\xd6\xe3\xfd\x1c\xb3\x55\xe7\x80\x13\xf9\xb4\xa7\x9a\xeb\xfd\x72\x84\x78\xae\x0e\x47\x2d\x7a\x9c\xfe\xf6\xea\x4d\x1e\xd0\x2d\xb4\x27\x0c\x4d\x4a\x13\xa6\xbc\x08\xfc\xbf\x3f\x33\xbc\xd1\xdd\xda\x40\x55\x69\x23\x0a\x50\xa7\x9d\xd4\x5f\x5f\xcc\xf5\xcc\x0c\x7f\x81\x5b\xcf\xc9\x02\x58\xb3\x6e\x07\xa2\x21\xa1\xc7\xb9\xb7\x66\x28\xc6\x8d\xa8\x75\x3e\x54\x10\x3d\xf7\x52\xff\x5f\x01\x7b\x42\x81\xe6\xf7\x81\x3d\xc9\xd4\x8d\x04\x26\x01\x7b\x46\xd7\xb6\x57\xf7\xf6\x5d\xa9\x88\xf5\x82\x3f\x9d\x70\xf5\x2a\x45\xe6\x5e\xed\x29\xdc\x51\x81\xff\x3d\xd8\xcf\xa8\x8d\xe6\x8b\xd1\x0b\xaf\xc4\x7b\x02\xc9\x84\x45\x38\x9a\x72\x64\xe1\x12\xa2\x17\xdb\x0d\x32\xe1\x4b\x74\xff\x66\x5d\xca\xa8\x50\xd7\x7a\x1a\x0f\xaa\x6e\x5a\xe9\xb0\xf5\x3e\xe6\x66\xff\xea\xb6\xde\xdd\x2e\xbd\xc1\x0e\xac\x56\xf3\xaf\xa6\x0c\xa8\xcb\x21\x42\xc0\x3e\x62\x05\x04\x42\x68\xdd\x02\xc5\x09\xc3\xe2\x65\x5a\x16\xe3\x08\xa3\x9d\x46\x70\x13\x86\x15\x79\x89\x48\xca\xf0\x56\xb5\xc3\x40\x83\xbd\x15\x02\x4c\xa4\x43\x3b\x68\x3c\x1a\xe4\x0e\x51\x48\x9d\xcd\x0b\x7e\x69\x74\x27\xbc\x1c\x1d\x9d\x89\x1f\xf9\x22\x2a\x8d\x85\x58\xf5\xcb\xd1\x25\x9f\xf4\x45\xf9\xe9\x73\xa6\x63\x94\xf8\x4f\x6c\x85\xf1\x29\x8d\x48\xb5\x4a\x96\x43\x0e\xd8\xde\xda\xc6\xf7\x77\xff\xd9\x05\x49\xc8\x46\x89\x82\x69\x50\x72\x15\xc7\x1a\x23\x48\x3d\x43\x7d\x63\x3f\x81\xae\x12\x95\xd9\x3b\x96\x50\x2f\x8e\xce\xf2\xf2\x1a\xd1\xbf\x2a\x6c\x35\x4b\xd5\x78\xb0\xc8\x82\x1e\x09\xc6\x8b\x87\xb8\x3e\x28\x5d\x22\xf0\xcd\x6a\x01\xf5\x20\xf2\x03\x5a\x36\xd5\x06\xf5\x90\xe8\xa0\x86\xf0\x8d\xd8\x55\xcb\x15\x05\x74\xc4\x20\xda\xa4\x57\x23\xbe\xa2\x4a\x29\xbb\x97\xec\xd5\xe8\x92\x8f\xcb\xd2\x5f\xa8\x64\x0d\xf4\x0a\x2c\x50\x30\xfa\x3a\xab\xcc\x25\x2f\xe8\x4b\x56\x2a\xfd\x75\x10\x8b\x4d\xbc\x3a\xae\xf1\xbc\xb5\x72\xa9\x0c\xd8\x97\x0a\x11\x64\xc8\xe5\xef\xcb\x03\xdb\x50\xd3\x00\x50\x07\x87\xb0\xfa\x4f\x02\xa6\xd3\x03\x06\xa5\x02\x9a\x11\x9b\x15\x55\x83\x39\x94\x1b\x94\x56\x44\xb0\xde\xbd\xac\x95\x46\x1f\x10\x9a\xf9\x00\xb9\xec\x5a\x12\x37\xac\x78\x14\xc8\x64\x03\xcf\xa8\x74\x15\x80\x12\xae\x70\xef\xe9\xf5\x8b\x96\xee\xb3\x6e\x99\xc7\x46\xe5\x12\xbc\x5c\xbb\x76\xfb\x26\xeb\x53\x98\xc1\x2b\xf7\xa8\x2f\xcc\xe5\xa4\xd8\x31\x82\x8c\x3e\x9d\xdf\x3b\x9c\xce\x2a\xa2\x12\x23\xb2\xc6\xbe\x98\xb0\x2c\x42\xc0\x19\xeb\x4a\x82\x2c\xe1\xde\x5a\x43\x44\x55\xad\xa4\x5a\xdc\xfa\x41\x3d\x20\x2c\xff\xf9\x71\x6d\xe3\x71\x51\x63\x7f\xb0\xff\xe0\xf2\x54\xf6\x96\x61\xc7\x96\xdc\xc9\xf2\xc7\xb4\xdc\x31\x69\x02\x02\x77\x1d\x8b\x3b\x6f\x22\x94\x8c\x23\x92\x0c\xc2\x5c\x75\x48\xb1\x1e\x59\x85\x55\xbc\xd6\x7b\xeb\x52\x43\x79\x3b\x4b\x8b\x17\x79\xf7\x4c\xf8\x7d\x75\x46\xd4\xc9\x83\xc6\xbe\xb7\xa0\x91\x47\x05\x8d\xd1\x41\x7f\x7d\x02\x3a\xae\xa4\x21\xa7\xb8\x17\x0e\xcc\xd8\x6b\xab\xa0\xff\x7a\x35\xb9\x5d\xf1\xf1\xd2\x31\x63\xde\x7c\xe6\xcb\xc9\x8a\xbf\x9b\x2f\x56\x1f\xf8\x74\x86\xec\x8a\xe3\xf7\x8b\x09\xe1\xa9\x57\x1f\x26\x48\x0a\x19\x31\x3c\x4e\x66\x1f\xc6\xb3\xab\xc9\x35\xb3\x7f\x18\xf2\xe9\x92\xdf\x2e\xe6\xbf\x4e\xaf\x27\xd7\x7c\x0e\x34\x91\xbf\x1d\x34\xce\x02\xd6\x66\x32\x05\xc2\xc9\x63\xe6\xce\x40\xcd\x99\xf5\x70\x73\x66\x00\xd7\x09\xaf\x60\x47\x70\x9e\xef\xc5\x8c\xdb\x57\x26\xd4\x9d\xac\x07\x32\x6e\x97\xf3\x39\x9f\xd1\x60\x3f\xcf\xef\xf8\xcc\x33\x6e\xae\xc6\x6e\x41\x16\x4b\xa2\xf4\xfc\x30\xfe\x75\x02\x7f\xf5\x3c\x98\xdc\x71\x7a\x22\x91\x67\xc6\x1c\xa5\x27\x50\x90\x4e\xaf\x27\xb3\xd5\xf8\x26\x0b\x8c\x9f\x93\xbf\x4e\x3e\xde\xde\x8c\x17\x9f\xb3\xd3\x9c\x9f\x61\x8f\x58\x0f\x79\xe9\xcd\x7c\xb9\x72\xc4\x9e\xc3\x8c\x7f\x98\x7f\x9a\xfc\x3a\x59\xf0\xab\xf1\xdd\x72\x72\x0d\x88\x47\xd8\xbd\xcf\x76\xcf\xe7\x8b\xcf\x76\xc9\x02\x6b\x27\x8b\x88\x40\x3d\xf7\x67\x0f\xb9\xe7\x7c\xc1\x4f\x13\x82\xda\xbf\xce\xed\x53\x3e\x4d\x97\x93\x21\x73\x44\xa0\xd3\x19\xed\xdd\x67\xc7\x09\x1a\xb1\x7f\xc6\xa4\x78\xee\x4f\x8e\xa5\xd4\xfe\xf7\xe4\xaf\x93\xc5\xd5\x74\x39\x61\x04\xd8\x5a\x4c\xdf\x7f\x58\x2d\xf9\x7b\x2b\x06\x93\x6b\xfe\x61\xb2\x98\xdc\xcd\xae\x27\x8b\x0c\x28\x56\xf9\xf4\x1d\x1f\x5f\xff\x3a\xb5\x33\xa6\x87\xdd\xce\x97\xcb\xa9\xdb\xf9\x77\x7c\x79\x77\xf5\x81\xd1\x82\xa6\x07\xef\xcd\x88\x7f\x54\x26\x97\x65\x29\x2a\xa9\x5b\xc3\xd8\x9b\xd1\x65\x0c\x86\x85\x68\x77\x83\xec\x84\x50\x47\x80\x17\x47\x82\xb8\xed\xde\x7a\xae\x73\x08\xe2\xe2\x30\xb3\x05\x7f\xc0\xaa\x1a\x9f\x00\x3c\x36\xd7\xdc\xd5\xd1\x6d\x39\x1d\x3d\x8d\xcc\x0c\xea\xb9\x1a\x82\x9a\x99\xcb\xcd\x1c\x5c\xab\x24\x5d\x37\xa0\x4f\x47\x29\xb8\xd7\x1a\x1f\xb1\x45\x66\x1a\xb9\x37\x64\x91\xa9\x1e\xad\xbe\x69\xcb\x8d\x2a\x81\xe8\x24\x99\x36\xb5\xcc\x89\x26\xde\x29\x11\x38\x9a\xf4\xe9\xf9\x06\xef\x6e\x2b\x6b\x09\x6a\x16\x0a\x6a\x9e\x7b\x17\xa1\x6b\xac\x76\xf2\xd4\x48\xf9\x98\x24\xaa\x05\x06\x15\xac\xdf\x4f\xb7\xb7\xb5\x2b\x70\x9e\xb2\x46\xba\xbd\xc8\xd7\x43\x4a\x4c\xba\x74\x21\xa6\x85\xa5\xd1\xb5\x28\xdd\xcd\x61\xed\x00\x34\xe5\x0f\x88\x85\x26\x3f\x15\x86\xfa\xa2\x6b\xbb\x5b\x23\xd0\x9a\xa1\x95\x76\xdf\xc7\xa4\x80\x2c\xec\xca\xb5\x7b\x4d\x05\xf5\x3e\x49\x2a\x29\x11\x12\xae\x39\x3b\x3c\x82\x99\x38\x7a\x6f\x85\xc2\x47\x71\x72\xfb\x6f\x93\x51\x11\x17\xb0\xe4\x43\xe8\x1a\xfa\xed\x42\x3c\xc0\xee\xe9\x3d\x94\x6c\xbd\x01\xef\xe2\xd8\x13\xe6\x2e\x04\xe0\xc6\x09\x43\xf9\x6a\xdf\xe0\xb7\x28\x91\x39\x16\x07\xd2\x6b\xde\xb5\x75\x29\x3d\x15\x2c\x12\x58\x2e\x77\x8d\xf6\x07\x83\xc9\xd8\x08\x10\xfe\x6f\xde\xba\x18\xc3\x20\x06\xbf\xd2\x05\x9e\x40\x08\xed\x3c\x60\x4a\x9e\xa2\xbd\x33\x9b\xc8\x16\x08\x73\xeb\x99\x0a\xb6\xa6\x15\x4d\xd8\xe3\x57\xb0\x82\xdf\x44\x91\x59\x47\xf4\xbe\xd6\xed\x9e\x86\xbe\xc2\x86\x82\xed\xd7\x88\x31\x96\x11\xc6\xc4\x34\xf2\xd1\x1e\x8f\x63\x83\xf8\x6c\xb0\xc4\xbf\x0d\x86\x23\x3e\xa3\x3e\xa6\xa9\x6c\xd0\x07\xd8\x96\x20\xd1\xde\xd1\xa1\xaa\x40\xed\x1b\x2f\xf5\xf4\x1c\x4b\x91\x4f\x71\x1f\x2f\xe6\x0c\xff\xef\x6c\xe6\xe5\xe2\x20\x7d\x36\x13\x3b\x3e\xd9\xfd\xfc\xad\xb2\xcb\x9b\x15\x56\x02\x3f\x0f\xa9\x29\x28\x90\x70\x4c\x5b\xe5\x21\xe8\x0d\x6f\x26\x22\x3b\xe3\xd1\x0b\xb0\x68\xc0\xb1\xfc\xf8\x99\x1e\xf5\xa5\xa2\x25\xfd\x03\xa0\xfb\xff\xa1\x9f\xd1\xb3\xab\x76\x2d\x7f\xc7\xe6\x4f\xdf\xee\xff\xf4\xfc\xe2\xe5\x11\xff\xf7\xab\x8b\x3f\xf8\xbf\xff\x29\x3f\x76\xf7\xf9\xbd\xd8\xb9\x5e\xe0\x29\x3f\xe9\xf3\x0b\x5e\xc8\x9c\x3f\xbf\xb8\x78\xe1\x5a\x28\x8c\xe2\x5e\x50\x57\xd0\x0b\xea\xf2\xdc\x7e\x80\x7d\xd2\x50\x39\xf7\x20\x2a\x3e\xd7\x75\xb3\x93\xb5\x31\xb2\xb7\x49\x81\x0f\x8e\xfe\x28\xcc\xb9\x32\x3f\x86\x9a\x56\x40\x93\x1d\x55\x0d\xf8\x6a\xa4\x11\x8b\x6b\x34\x31\x0c\xb3\x95\x2e\x1e\x69\xd5\xea\x56\x96\x85\xab\x6e\x74\xd1\x5b\x57\x93\xe7\x4a\x0f\x3d\xed\x01\x41\x2d\x9b\x78\x7c\x23\xc6\x6e\x4f\x75\xb2\x20\x0f\xdc\xd7\x1f\xc6\xd3\x72\x2f\x23\x00\x53\x5c\x47\x19\xca\x03\x93\x6e\x50\x99\x4f\xb2\x95\x76\xdd\x94\x2b\x7c\x89\xc8\x46\x54\xc3\x37\xb5\x94\xd6\xe6\xea\x64\xcf\x42\xa4\x3f\x8e\x56\x22\xd3\xcd\xaa\x53\x74\x1d\x0f\x13\x52\x13\x14\xe1\xdd\x29\xe3\xa3\x8d\xb2\xf8\x25\x34\xba\x85\x20\x91\x75\x98\x11\xa3\x05\x9d\x8d\xad\x61\x12\x95\x73\x8b\x32\xac\x58\xdc\x38\x37\x7d\x1b\xc4\x1d\x28\xf4\x9e\x31\x51\x71\x91\x7f\xa9\xf4\x63\x29\x8b\x7b\xea\xd4\x83\xa0\x2f\x2a\x43\x4f\x5b\xb5\x3c\xba\xc4\x9b\xd8\xef\x6b\x49\x65\xbf\xc8\x22\xcf\xa2\x40\x71\x81\xbc\x71\xe3\x12\x09\x84\x49\x7e\x43\x2b\x2c\x3b\xa1\xb5\xe4\xd0\xdd\x34\xd0\xee\x09\x64\x7f\xa5\x16\x39\x61\x51\x58\xba\x28\xc0\x0e\x2b\xd3\x4a\xf6\x78\xea\xe0\xf0\xbc\xa0\x2a\x7d\xaa\x95\x8a\xfa\x82\xd4\x72\xe7\x78\xee\x05\x8d\x0f\x84\x0f\x6e\x4c\x1c\x68\xc2\xba\xc4\x58\x94\xe7\x20\x62\x75\x5f\x18\xd3\x68\x6e\x4f\xeb\xcf\xc0\x7d\xb3\xec\x4e\x33\xbc\x74\x50\x4b\x17\x6f\x1f\xf8\x7c\xe1\x71\xc6\xc4\xd1\x28\xec\x0e\x31\x01\x44\x5f\x97\x91\xff\x6e\x1d\xf5\xc7\xcf\xef\xf7\x33\x7a\x36\xae\x1b\x6b\x82\xe6\xbf\x43\xe1\x0f\xfd\x3c\x7d\xff\x5f\x5e\xbe\xb8\x78\xd3\xed\xff\xf8\xe6\xe2\xd5\x1f\xf7\xff\x3f\xe3\xc7\xde\x15\x4e\x02\x7c\x4d\x1e\xbb\xad\xa5\xd8\xad\x4b\x89\x95\x29\x2a\x22\xe6\x88\x7a\x19\x00\x94\x5f\x13\x65\x4c\x27\x35\x19\xb9\x15\x5c\xf0\x5b\x91\x7f\x11\xf7\x92\x75\xda\x12\x12\x21\x13\x25\xb9\x82\x59\xf1\x01\x6a\x25\xf9\x4e\x28\xc8\xe5\x1b\x28\xd1\xe0\x46\xee\xd6\x25\x15\x97\x33\xe1\x86\xec\x10\xc5\xfa\x81\xbc\x92\x42\x3e\xc8\x52\xef\x77\x11\x95\xc8\x1e\x5f\x9f\xd9\xf1\x94\xe0\x79\x39\x85\x0e\x7d\xf1\x58\xfa\xb1\xd4\xdb\x6b\xcd\x11\xf1\x1d\x46\x0e\xf0\xb3\x70\xc1\xed\x74\x2d\xcf\x75\x7d\x5e\x4a\x63\x58\x60\x43\xd9\x08\xb3\x85\xe0\xd1\xbe\x6c\xbb\x3e\x64\x1a\x27\x4a\x69\x86\x46\x8c\x45\x45\x2d\x3f\x33\x36\xa0\xb7\x0d\x38\x30\xd0\x9b\x00\xce\x2a\xcb\x80\xba\x43\xfc\x43\x5c\xc8\x49\x6e\x57\x77\x61\x89\x36\xd4\x57\xfd\x1b\x1e\xb2\xd0\xc7\x0f\x74\x09\x42\x5f\xa2\x22\xbf\x36\xad\x28\x93\x21\x8f\x18\x1b\x2c\x1b\x51\x15\xd6\xdb\xfe\xd5\xf5\x7e\x0e\x83\xa5\x36\xee\x7e\xd1\xa0\x29\xb9\x75\xac\xf1\xc6\x92\x55\xd4\x68\x51\xd7\xcc\xd3\x22\x84\x8c\x18\xa0\x41\x75\x5d\xa4\xc5\xb8\x8f\x98\xc7\xf4\x50\xc5\x74\x9e\x23\xe0\xc0\x4d\x7f\x37\xb0\x42\xfb\xb8\xd5\x40\x08\xa6\xb0\x6c\xda\x11\x99\xc7\x25\xc9\x11\x56\x0b\x61\x04\x91\x80\x8c\x5c\xcf\x05\x05\xdd\x93\x5d\xc7\xf9\x1f\x21\xe3\xaa\x2a\x00\x09\x62\x85\x0a\x61\x0e\x53\xc0\x01\x88\x9e\x32\x6e\x35\xec\xd3\x16\x41\x12\xdc\x57\x36\x52\xd2\x58\x45\x03\x83\xb5\x06\x56\x2e\x2a\xfe\xb7\xd6\x34\x10\x7f\xc0\x31\xaf\x05\x15\xd1\x00\xd6\x98\xe5\xda\x34\x19\x2f\xda\x50\xaf\x83\x34\x0d\x26\xc3\x4c\x1e\x50\xa4\x68\x20\x72\xaf\x1e\x74\x09\xdd\x6b\x20\x41\xa5\x39\x54\xb7\x7f\xb6\xa6\x1e\x35\x98\xc3\xbe\x69\x44\x52\xd2\x68\xff\xe6\xd0\xf0\xfc\x48\xb2\xc0\x3c\x0b\xcc\xa4\x92\xca\x84\x9c\x11\x4c\x5d\x5a\x1b\x5e\x22\x75\x84\xb1\x87\xc7\xda\x63\x04\xc0\x23\x5b\x4d\x50\x35\x99\x94\xa3\x21\x63\x83\x77\x60\x01\xf3\xb1\xc3\x40\x07\x90\xaf\xb0\x56\x1b\xf0\x4f\x28\x43\x13\x2d\x7c\x31\x9a\x6a\xe4\x8e\xab\xc6\x48\x28\x84\xd9\x5a\xe1\x65\x50\x4c\xe3\x5a\xfb\x6d\x24\xf4\xa2\xc1\x65\xb0\x32\xb0\x15\x55\x51\x3a\xd5\x60\xbf\x3e\xe2\xd3\x06\xab\xef\xa3\x37\x06\xbe\x48\xa7\x38\xe0\x4d\xc8\x95\x99\xda\xee\x21\x56\x02\xb5\xf6\x91\x7e\x84\xc0\x5d\xd4\x76\x7b\x14\x28\x2a\x5d\x9b\x48\x20\x7c\x81\x38\xeb\xa3\x38\x20\x2d\x77\xa3\x76\x1d\xda\x4d\x93\x12\x3e\x62\x94\x05\x0f\x22\xfb\x35\x8e\xf9\x04\x81\xf3\xbe\x56\xe4\x38\x74\xf1\x2a\x56\xd8\x9c\x10\x01\x80\xc9\xf7\x2d\x71\x16\x70\x97\x21\xc0\x38\xc2\x1e\xc7\xcf\x53\xf8\x9c\x9b\x19\x05\x72\x4c\x71\x20\x96\x87\x75\x7b\xcf\x37\xea\xab\x15\xcc\xbd\xae\x1b\x57\xb7\x00\xbf\x0a\xbc\xb8\x1d\x4e\x77\x22\xfc\x67\x9e\x73\x92\xba\x16\x5f\x6b\x60\xc4\xd7\x75\x60\xa3\x3c\x52\x06\x7c\xec\x17\x20\x52\x2b\x8c\x54\x93\x5d\x62\x62\x00\x6b\x28\x40\x17\xf0\x2f\xc9\xb2\x3a\xfd\x36\x0a\x44\x9c\xe2\x10\x21\x76\x28\x3c\x08\x4c\x12\x01\xd7\x16\x2d\x3f\x05\x71\x1f\x81\xdd\xd9\x91\x20\xfa\x55\x57\x95\x91\x35\xb5\x5d\x4f\x08\x42\xed\xf7\x20\x0d\xeb\xf0\x69\x40\x56\xe0\x48\x43\xb7\xfa\xd1\x91\x1d\x56\xc0\x6d\x10\x50\x6c\xa2\x21\x7a\x49\x48\x84\x1f\x6f\xb3\xf6\x1c\x91\x7c\x3e\x9b\x1c\x71\x44\xfe\xcc\x98\x18\x22\x51\x24\x4e\xaa\xdb\x83\xb3\x7f\x23\xa2\x05\xa1\x4a\x86\x1d\xc7\x83\xcc\xfc\x41\xce\xa2\x06\x1c\x7c\xaf\x0d\xf2\xb6\x08\x55\x1c\xb7\x48\xbd\x33\xb2\x92\x0d\x95\xbc\x05\x98\x38\x73\x74\xb2\xba\xf6\x9d\x74\xa1\x9e\x25\x6d\x05\x00\x97\xb4\xf8\x1b\x80\x5f\x81\x9a\x82\x1b\xe5\xf2\xc7\xc2\xf0\x4d\xb3\x1f\xb5\xed\xa8\x92\x4d\xc6\x88\xa5\xdf\xc3\xe8\xfa\x0c\x13\xa0\x5f\xc0\x0a\x80\xd3\x2b\xd2\x7f\x0c\x65\xa4\xf6\x11\x19\xba\x1e\x7a\x32\x23\x2f\x97\x4e\x54\x40\x93\x12\xc1\x06\x09\x14\xf5\x3b\x3d\x2e\xfd\x1a\x31\x96\x0f\x79\x2d\x89\x08\xe4\x00\x80\x6a\xe3\x84\x16\xb3\x18\x58\xc8\x62\xb4\x47\x73\xfa\x3a\x9b\x5c\x57\x9b\x52\xe5\xc4\xaf\xe3\xbe\xc6\xa2\xaf\x65\x64\xcd\x81\x8e\x06\x9d\xb8\x0e\x70\xd3\x44\xb8\xb8\x08\x0c\x79\x3b\x51\x59\x63\x61\x6f\xad\x3f\xe4\x10\x41\xc4\x48\xdf\xc8\xc8\x06\xa1\x1e\xc9\xce\xca\x34\x20\xdb\xaa\x21\x0f\x16\xab\x9f\xd9\x89\x13\x89\x4b\x5a\x0c\x51\xe8\x50\x85\x24\x50\xbf\xa4\x6f\xb7\xb7\x23\x7a\x2c\x87\x97\xe1\x6c\x77\x4c\xbf\x7d\xad\xef\x6b\x11\xb5\x46\x8b\x0e\x36\x36\xb8\xc1\x36\x05\x90\x1c\x71\x73\x63\x7d\xc4\xc5\xdf\x7f\xfc\xa2\x21\x88\xa3\x79\xbb\xef\xc4\x7b\x8c\x50\xe8\x75\x0d\x76\x28\xb6\x11\x72\x15\x7d\x48\x8e\xa3\x80\xae\x93\x30\x6e\x67\x24\xb3\xd1\x6e\xc1\xf0\xfd\x39\x1b\x62\xfd\x8a\xbd\x3c\xa1\x26\xb7\xe9\x15\xf1\x11\x63\xeb\x21\x18\x6a\xbb\xbd\x95\x40\x2c\xb7\x8b\x56\xdf\x2f\x38\xd5\x47\x9c\x7b\xf6\x5c\xba\xc7\xd2\x33\xc2\x02\x27\x4f\xd7\x40\xce\xe3\xf7\x3c\x29\xed\xee\x9d\xaa\xc6\xda\x34\xb3\xd7\x58\x78\x77\x74\x40\x13\x61\x8f\x9c\x84\x93\x8f\x4e\xfe\x40\x7c\x8b\x80\xc5\xea\x88\xb0\x7b\x90\x8b\xc1\xe4\xd8\x03\x2f\x5a\x6d\x03\xfd\x6c\xa2\xf5\x7e\x72\xbb\x9e\xda\x8b\xdf\xe5\x30\xbc\x1a\x45\x54\x60\xc4\xfa\x55\xf7\xda\xac\x21\xe6\x7a\x04\xb0\x8d\x4d\xde\xee\xd3\xaa\x03\x7c\xf9\x10\x12\x95\x1b\x28\x15\x02\x06\xb1\xa3\xaf\xfb\xc1\x58\x23\xb5\x4b\x43\xd6\x39\x93\x60\xff\x45\x68\xb1\x43\xdf\xa1\x0e\x5f\x60\xf6\x76\xbe\xbf\xaf\xe5\xbd\x6f\x84\x83\x0b\x77\x86\x9c\x6c\xd0\x38\xc7\x45\x73\x87\x41\x17\x44\x04\xd3\x02\xad\xdb\x9a\xf5\x7f\xc5\xc7\x46\x93\x15\xea\x55\x0c\xd0\xe4\x99\x3a\x0a\x4b\x96\xcc\x0b\x4c\x67\x17\x36\x75\x34\x5e\xfa\xb1\x22\xfe\x50\x6b\x19\x02\x0b\x54\x8f\x26\x40\x46\x04\x85\xb1\x4d\x55\xed\x5b\xd7\x03\x88\x78\xde\xe1\xf7\x58\x30\x17\x0c\xad\x93\x4a\xcf\x0d\xb3\xb5\x4e\x6f\x43\xbd\x85\x36\xd6\x90\x0a\xc6\xaf\xb7\x15\x59\xe7\xdb\xe8\x2f\xac\x25\x30\x40\x43\xad\xba\xde\x81\xb3\x13\xa0\xa8\xd6\x70\x08\x7d\xcc\xd7\x40\x39\x59\x44\x0b\x5a\x1e\xf0\xcc\xd1\x5f\xfd\xde\x15\x11\x53\x5c\xb8\x72\xdf\x8c\xf8\x15\xc7\x1e\x9d\x25\x37\xed\xba\xd6\xd6\x39\x89\xd7\x64\x0d\xa6\x1b\xad\x5a\xf5\x05\x8c\x44\xf0\x65\xa2\x39\x23\x2f\xc6\x11\x4c\x3a\x22\xe3\x4e\x5e\xfa\x27\xdc\x90\x50\x3d\xd1\x1b\xeb\x48\x7b\x49\x37\xda\x35\x46\xa5\x9d\xd9\xe9\x46\x32\xda\x70\x93\x74\xbe\xea\x84\xdc\xbb\xed\xa3\x9f\xea\x1e\xfd\xd3\x08\xf1\x6b\xb7\xe3\xab\xbf\x8c\xdf\x4f\x12\x64\x9a\xc3\xa4\x8d\x67\xd7\x1e\x3d\x36\x9e\x7d\xee\xc3\x99\x45\x0d\xa4\xd9\x37\x30\x67\xab\x0f\x93\x6f\x34\x84\x76\xd0\xa2\xf1\xec\x9a\x7d\xab\x21\x34\x2e\xec\xa4\x2a\xfe\x08\x51\xff\xbd\x3f\xa3\x67\x6f\x97\xd7\xe7\x2f\xce\xaf\x20\xd9\x70\x3e\xdf\xcb\xea\xfc\xe3\xed\xf4\x1f\x1a\x08\xfe\x46\xfe\xf7\xc5\xcb\xcb\x6e\xfc\xf7\xd5\xe5\x8b\xd7\x7f\xc4\x7f\xff\x19\x3f\x69\xdb\x0f\xa4\xbd\x45\x16\x67\x32\xc9\xec\x6f\xd6\xaa\x82\xeb\x43\xd7\x3b\xf3\x74\xeb\x8e\x8c\x59\x1d\x14\xf0\x5e\xe9\xbd\xd6\x9c\x68\xd0\x81\x1d\xba\x64\xf3\x33\x63\xe7\x9d\x46\x24\x70\xe3\xc4\xdd\xbf\xa2\xb6\x17\xc4\x78\xa0\x1f\x8e\x09\x0b\x33\x2c\x3c\x28\x95\x69\x90\x4c\xa7\x8a\x18\x3a\x3a\xe3\x08\x91\x8a\x51\xdf\xfb\x55\x15\xcf\xdf\xbd\xdf\x35\x45\x79\x62\x08\x8c\x98\x2c\x7f\xd3\x10\xe0\xf3\x11\xa1\x3b\x65\xeb\x18\xcd\x36\xcd\x90\x52\xe5\x1d\x85\x4a\x1c\xdd\x5f\x58\x74\x6f\xd3\x75\x92\x8c\xe7\x7c\x46\xd5\x35\x4d\xe7\x62\x0a\x93\xd8\xc2\xc5\x04\xcd\x11\x22\x77\x91\x8a\x7c\xa2\xa6\x36\xc6\x45\xf5\x4f\xdf\x5b\xfc\x37\xdc\x5b\xec\x7b\xee\xad\x55\xef\x48\x9d\xfb\x09\x20\x35\x28\x81\x11\x95\x2f\xef\x8b\x82\x65\x20\x46\x3e\xf2\xe2\xeb\x4d\x5c\x53\x9e\xa8\x15\x4f\x16\x57\xec\x92\x61\x7b\x5c\x41\xca\x5d\x05\x29\x0b\xc8\x37\xa0\xc3\xc4\x2e\xd9\xd2\xb8\x86\x12\xdd\x01\xbb\x5d\xef\x30\xbb\x22\xd0\x80\xf9\x38\x23\x58\xb5\x48\xef\xca\xd7\x10\x84\x6f\x7c\x99\x40\xf8\xd0\x1a\xfd\xa0\xf0\xe2\x83\x6b\x51\xe1\x5b\x0d\xf9\x6a\x33\x1a\x57\xff\x2c\x08\xbf\x67\x97\xd9\xda\x06\xcb\xf9\xbb\x15\xb4\x85\x8f\x8d\x83\xb7\x00\x7a\xe6\x57\xf3\xdb\xcf\x80\x1f\xe6\x1f\xa0\x8d\xbc\xe7\x81\x45\x04\xf2\x7c\xb1\x74\x66\x04\xb3\x7f\xf8\xb6\xf9\x10\x43\xd6\xdf\xde\xad\xf8\x6c\x4e\xe6\xc3\xe4\x9a\xaf\xe6\x60\x3e\xb0\xa7\xcd\x87\x71\x30\x1f\xf8\xb7\xcc\x07\x66\xa7\x75\x3d\x5d\x5e\xdd\x8c\xa7\x1f\x27\xd7\x23\x3e\x9d\xf1\xd9\x1c\x70\xcf\x2b\xc2\xa1\xa7\xb3\x9c\x7f\x9a\x4d\x16\x04\x27\x0f\x53\x7c\x3b\x01\x40\xf7\xcd\x84\x75\x20\xea\xfc\xef\x87\xa8\xb3\x63\x88\x7a\xff\x8a\xdc\x2e\xe6\x57\x77\x0b\x00\xe6\x23\x1a\xfb\xed\x72\x35\x5d\xdd\xad\x26\xfc\xfd\x7c\x7e\x6d\xd7\x99\x2d\x27\x8b\x5f\xa7\x57\x93\xe5\x2f\xfc\x66\xbe\x84\xc5\x82\x7e\xea\xd7\xe3\xd5\x18\x5e\x4c\x10\xf7\x5f\xec\x7f\xbf\xbd\x5b\x4e\x61\xcd\xa6\xb3\xd5\x64\xb1\xb8\xbb\xb5\x66\xdb\xd0\x61\xdf\xd9\xf7\x61\xdf\xf9\xf7\x61\xdf\xd9\x6f\xc0\xbe\xf3\x27\xb1\xef\x0c\xb0\xef\xef\x78\x22\xb0\xbf\x05\xc0\x4e\x15\x01\xff\x0b\xa1\x0e\xa3\x67\x57\x57\xe7\x6f\x3f\x9f\xcf\xae\xce\x97\xe3\xf3\xe7\xbf\x0b\x04\xe0\x69\xfb\xef\xc5\xab\x17\x2f\x2e\xbb\xf9\xff\x57\xcf\xff\xc0\xff\xfd\x53\x7e\xae\x6a\x89\xd4\xef\x57\xc0\xd0\x65\xf8\x38\x94\x98\x9f\xcf\x74\x75\xe5\x3d\xed\xf3\xe5\x56\xd4\x72\x5c\xaa\x2f\x92\x3f\x1f\x5d\xf0\xab\xc5\x64\xbc\x9a\xfe\x6a\xf5\xe3\xc7\x8f\xf3\xd9\x92\x5d\xcd\x17\xb7\xf3\x05\xd6\xce\x4c\x97\xa0\xa9\xc6\xfc\x66\xfc\x89\xbf\x9b\x2e\x3e\x82\xce\xb8\x9e\x4f\xf0\xf7\x74\x91\xf0\x9b\xc9\xfb\xf1\x0d\x77\x0a\x6a\x94\x14\xaf\x30\x77\xa0\x6f\xa6\x57\x93\xd9\x72\x12\xbe\x0d\x6f\x9e\xf0\xf1\x8c\x8f\x57\xab\xf9\x62\x36\xf9\x7c\x7e\x75\x33\xb5\x1a\x70\x31\xb9\x81\xf7\x2f\x3f\x4c\x6f\x47\x7e\x84\x8c\x46\xe8\x5e\xbb\xc4\xe7\x4e\x67\xef\xe6\x8b\x8f\x38\x5e\x5f\x87\x75\xee\xeb\xb0\x46\x47\x33\xe4\x1f\xc7\x7f\x99\x2c\xd9\x6c\x1e\xdf\x3d\x8b\xc9\xfb\xf1\x02\x74\x17\xf8\xb6\xd1\x33\xdd\x6d\x99\xe1\xdc\xe9\x9e\x59\x06\x0d\x08\xf7\x85\x53\xf4\x8b\xc9\xf2\xee\x66\x65\x9f\xf3\x6e\x31\xff\xc8\xa7\xab\xa5\x55\xd3\x23\xc6\x3c\x28\xc3\x3e\xff\xd3\x7c\xf1\x17\x7e\x36\x5e\xf2\xeb\xc9\xbb\xe9\xcc\xde\xc4\x93\x9b\xf9\xa7\xb4\xa6\x0c\xca\x77\x60\x34\xc8\xcd\xee\xd6\xf1\x68\xc3\x6e\xef\xde\xde\x4c\xaf\xfc\xfa\x9e\x0d\xae\xae\x6e\x6f\x06\x56\xf1\x0e\xe8\x77\x83\xe1\x88\xfb\xd7\xe2\x3b\x56\x93\xab\x15\x5a\x00\xe1\x5e\x1c\xcf\xae\x9f\xcd\x17\x0c\xd4\x35\x1f\xdf\xde\xde\x4c\xaf\xec\x7d\x68\x37\x7f\x04\xea\xda\xeb\x67\x7a\x14\x7e\x72\xf5\xc1\x6e\xe1\x92\x8f\xef\x56\x1f\xe6\x8b\xe9\xff\x13\x8d\x7d\xba\x64\x6e\x58\x70\x35\xba\x37\x59\x71\xc2\x71\x7c\x98\xbe\xb5\x97\xe0\x88\xb1\xb7\x9f\x5d\x51\x93\x5d\xbd\xa8\xa6\x69\x35\x0f\x6f\xf4\xab\xf3\x61\x62\xaf\x86\xcf\xf3\x3b\x3e\xbe\xc2\xda\x3e\x6b\x99\xbc\x5f\x4c\x26\x7c\x35\x67\x6f\x27\xfc\xed\xfc\x6e\xe6\x2d\x9c\x74\x05\x69\x48\xb8\x26\xf8\x8f\xf9\x02\x4b\xa7\x96\xf0\x48\xfb\x7b\x7c\x39\xb3\x17\xdf\x18\xb6\xc8\xbe\x91\xae\xc2\xe5\xf4\x7a\x42\x27\x64\xfe\xce\x7e\x63\x41\xa3\x18\xc3\x8d\x47\x97\x51\x1f\xa5\x3e\xc6\x73\xbb\x7c\xa7\x62\xc4\x07\x57\xbe\x56\x87\x63\xb3\x79\x22\x0e\x22\xce\x7c\x97\xe4\x12\x54\xd4\x0b\x64\x0b\xd0\x2d\x39\xe3\xa2\x6a\xb6\xba\xd4\xf7\x50\x58\x2d\xab\xfc\x90\x97\x7a\x2f\x0b\x05\x35\x52\x11\x5f\x15\x75\xd8\x03\xd3\x5f\x56\x8d\xaa\x25\x16\xa3\xb4\x55\x68\x6f\x08\xf9\x0d\xe8\x3f\x86\x11\x6b\x41\x25\x0c\xd6\x1a\x76\x5d\x32\xa2\x7e\x39\x59\x60\xd6\x85\xac\x9f\x4b\x18\x51\xb1\x91\xdc\xcb\xaa\xb0\x26\xeb\xa3\xeb\x5a\xdb\x6c\xe5\xce\xc8\x12\xba\x4a\x03\xc3\xb9\x01\x40\x90\x0b\xd0\x89\xa8\x66\x09\x39\x18\x46\x7c\x8c\xb4\x05\x8e\xa9\xd0\xf3\xf8\x0a\xde\x59\x33\x0f\x79\xe8\x04\xf4\x44\xb7\x37\x06\x3f\x13\xc4\x48\xe8\x08\x82\x87\xdd\x7e\xd1\x47\x0d\xab\x46\x8c\xad\x47\xbc\xdb\x0a\x3f\xdd\x26\x2a\xc9\x85\xc2\xa5\x26\xea\x40\x99\xfe\x42\x54\x05\x55\x30\xed\x6b\x79\x0e\x74\x1e\x76\xed\x1e\xb1\xdd\x5d\xd8\x68\x68\x24\x5b\x12\xeb\xce\xae\x45\x2e\xba\x28\xd8\x9f\xf1\xa2\x16\x3b\xd1\x50\xe6\x30\x63\x1b\x44\x01\x88\xd2\xfd\x86\xef\x34\x86\xa5\x55\xde\xb4\xb5\x87\x99\x42\x1f\x6e\xc0\x28\x13\x95\xaf\xdd\x8a\x26\x65\xd7\x60\x62\x5d\x2b\x84\xf7\xc2\x1e\x17\xb2\x32\xe2\xff\x65\xef\x5d\x96\xdb\x48\xd2\x74\xc1\xbd\x3f\x85\x0f\x36\x22\xcd\x82\x48\x51\x79\xab\x94\xda\xda\x1a\x22\x41\x09\x75\x28\x82\x0d\x90\xa9\xd2\x1c\x3b\x66\xed\x40\x38\x80\x48\x05\xc2\x91\x71\x21\x12\xf9\x04\x53\xdb\x99\x17\xa8\xdd\xb4\x7a\xcc\xce\x6a\x36\x63\xb3\x2b\xda\x79\xaf\x31\xff\x2f\x7e\x89\x08\x52\x54\x56\x57\xf5\xb1\x9e\xca\x45\x15\x45\x02\x11\x7e\xf9\xfd\xf7\xff\xfa\x7d\x75\xc8\x9d\x82\x53\x00\x67\xba\x2b\x65\xe4\x4c\x96\x7a\xa9\xaa\x1a\xe8\xab\x8a\xca\x7e\x14\x4b\x83\x24\xe0\x74\xd9\x9f\x09\x12\x0a\xa9\x6c\xfb\xf7\x59\x86\xfb\x2c\xbe\x6c\x9f\x7b\x48\xc0\xe3\x3d\x65\xbc\x4a\x75\x67\xb2\x94\x29\x4f\x52\xd3\x2c\x6a\x66\xed\xf5\x07\x07\xca\x5c\x68\x1b\x10\x3f\x34\xe3\x0c\x2e\xac\xa7\x08\xd6\x13\xfc\xd4\x43\xb1\xdc\x94\xc6\x81\x7a\x9a\x88\xe7\x12\x0a\x79\xd2\x13\x47\xce\x4c\xa7\x6d\x0b\x8c\xe4\x02\x20\x67\xe5\xd1\x00\x9e\x91\x15\xeb\xc1\xb1\x83\x1a\xf8\xc2\x09\x8b\x96\x10\x2f\x87\x4c\xa0\x60\xca\x18\x1e\x37\x64\x0f\xd7\x01\x56\x99\xc1\x84\xad\x1b\xbb\x07\x24\x0d\x7a\x93\xa2\x77\x50\xca\x6a\x28\x07\x53\x2e\x34\x19\x41\x6d\xff\x67\x5f\xb8\xdf\x98\xa0\x54\xcd\x11\x8a\xeb\xa1\x1c\x84\xc7\x2d\x8a\x71\x40\xf2\x8a\x91\x4d\x02\x4c\x13\x18\x77\xc4\x33\x01\xe3\x6d\xf3\xbe\x0e\x85\x58\x0d\x09\xb6\x8d\xc1\xda\xfa\x07\x47\x68\x1d\x50\xad\xdf\x81\x45\xe0\xfb\xdd\xce\x80\x6b\xe2\x7c\x1f\x3d\xc3\x60\xa4\xed\x9e\xae\x80\xbf\x81\x5a\x41\xa1\x73\x51\xd6\x46\xd4\x8e\x7a\xd5\x94\x92\x1f\xeb\x8a\x8d\xb8\xbd\x22\x20\x8f\x73\x69\x1e\x47\x88\x56\x1b\x07\x31\x22\x1e\x1c\xb2\x4c\x75\xb5\xcb\x20\x27\xcd\x03\xa6\xe1\x62\x98\x66\xed\x24\x46\xcb\x31\x62\x70\x47\x08\x8d\x3e\xfe\xb5\xc9\xd6\x9b\x93\x5c\xdf\xe9\xdc\x73\xea\x39\x5c\x66\xa9\x2a\x81\x08\x66\x3d\xec\xf2\x76\xbd\x97\x1e\x06\x47\xcb\x3a\xab\xf3\xce\x79\x7d\x19\x9a\xb5\x89\xb8\x02\xc8\x0a\xb2\x6b\x13\xe9\x0d\x5b\xac\x54\xba\x50\x19\x36\x10\x23\x96\x17\xb0\x08\x32\x27\x7a\xc4\x4e\x93\x61\x08\xa5\x20\x90\xfa\x52\x03\xc5\x3b\x62\x6b\x27\x22\x40\x92\x89\xf0\x28\xc2\x2e\x94\x95\x7d\x15\x40\x14\xad\xb2\xb2\xaa\x65\xa5\x90\xd4\x85\xb9\x91\x1c\xcf\x85\xa0\x8b\xc0\x41\xe4\xc9\x30\xd8\xa4\xdb\x74\x2a\x6d\xc0\x39\x26\x10\x41\x10\xdf\x56\x2f\x31\x96\x32\xf1\x4e\x01\x72\xd9\x6f\xa3\x6a\x77\x5b\x23\x62\x8a\xf6\x0e\xd8\x5f\x4c\xbd\xde\x82\xfe\x73\x3c\xee\xf2\x88\x2b\x2f\xd3\xa6\x8c\x54\x61\x30\x01\x37\xc5\xe3\x90\x34\xc8\x41\xfe\xd7\x1e\xe8\x9f\x08\x78\x98\xc5\x9e\xd0\x93\xe0\x16\x7f\x09\xa6\x54\x48\xd4\x2f\xfd\x21\xc2\x72\x1f\xe6\xfd\x0e\x55\x71\x4d\x9d\xa3\x25\x22\x81\xb6\x6e\x1b\xdf\xe0\xd3\x7d\x2a\xe6\x5e\x03\x32\x71\x92\xde\x96\x61\x52\xbd\x72\x65\x42\x30\x3c\xd4\x70\xd4\x27\xc4\xcf\xec\x30\xe6\x82\xae\xae\x4d\x1f\x59\x77\x29\x77\x1b\x53\x18\xbc\x70\xec\x06\x26\x8e\x51\x17\xda\x35\x97\xf9\x21\x71\x38\xb0\xee\x37\x82\x30\x54\xa2\xdf\xda\xa3\x88\x67\x19\x92\xde\x0c\xdc\xae\x9a\x34\x33\x68\x82\x38\x6e\xca\x98\xa4\x19\xc0\x72\xbb\xd3\xef\x99\x7a\xfa\x3f\xd5\x34\x7a\xd6\xf9\xc6\x45\xff\x49\xc6\xc8\x7c\xf1\xf0\x4c\x59\x01\x90\x05\x88\x04\x6c\xdf\x8f\x30\xf1\x95\x43\x65\x2e\xcc\x5e\x7e\x2c\xcc\xbe\xb0\xfa\xc2\x1e\x1b\x04\xdb\x49\x35\x30\xc2\x61\xe8\x38\x7a\x45\x48\x3d\x15\x17\x94\x83\x05\x18\x55\xca\xd8\x75\xb6\xc6\x32\x82\xf2\x63\x72\x9e\x49\xff\x0f\x0f\x9f\x13\x07\xde\xd7\x1a\xf4\x50\x8c\x72\xd7\xb1\x0f\x80\xc3\x6d\x90\xc5\x58\x3f\x97\x9a\xe1\x25\xa9\x11\x3e\x24\xb2\x14\x3d\x5c\x7d\xc1\x28\xfa\x30\x21\x2b\xf9\xcd\x91\x46\xae\x88\x6f\x8e\x56\xc7\x4c\x5c\xef\xfb\xdf\x70\xb9\x58\x0f\xf0\x98\x22\x50\x49\x5c\xcb\x2c\x04\x88\xdc\xaa\x54\x8b\xca\xeb\x3b\x47\x31\xe4\x6b\xe8\x1f\x6c\xb7\x53\x7d\x75\x62\x89\x97\x2e\x12\xcb\xe0\x37\x24\x80\x89\xeb\x20\xc7\x8f\x81\xd8\xe5\x00\x18\x8e\xdc\x07\xce\x0d\x28\xf2\x43\x7f\x5b\x77\xa8\x79\x19\xe2\x29\xa4\x27\xf7\xc8\x8a\x09\xc3\xa4\xdd\x16\x19\x3c\x7d\xa6\x29\x19\x32\x21\x48\x3f\xb4\xc8\x93\x1e\xc3\x42\xdf\xe9\xf2\x20\xf0\x41\xd1\xb9\x8b\xec\xd2\x36\x13\xf5\xc3\x0b\x20\x1e\x5f\x00\x5e\x9f\xa8\xca\x07\x4d\x32\xea\x08\x35\x84\xfa\x48\x46\x59\xa0\x5f\xd0\x1b\x80\x6e\xca\xf0\xf2\x7d\xd8\x72\xa2\x55\xf1\x25\xdd\xcf\x22\x36\xd1\x40\x1c\x59\x96\x3c\x86\x46\x34\xbe\x0a\xe6\x81\xb7\x8f\xb3\x3e\xdd\x7e\x7c\xd4\x7a\x67\xaf\x0b\x65\x2d\x81\x3c\x8f\x19\xf0\xa1\x4d\x42\x72\x8d\x89\x63\x0e\x2b\xdc\x81\xf0\xc9\x41\x6b\x81\x7a\x96\xd7\x78\x04\x5f\x28\x7d\xe2\xd1\xc5\xf7\x4b\x8a\xde\x05\xac\xf6\x72\x53\x98\xdc\xac\x09\xd9\x5c\x55\x4d\x49\x53\x10\xdc\x84\x43\x88\xdd\x48\xb1\xdd\x76\x5b\x14\xc3\xaa\x5b\xc5\xdf\xe6\x73\x7c\xc0\xc4\x0e\x51\x14\xbc\x22\x84\xdb\x5f\xbb\x36\x98\x07\xee\xd3\xae\x9b\x8f\xe5\x46\xd4\xc3\x44\x59\x3f\x46\x1b\xec\xb9\x7c\xa5\x82\x82\x1e\x57\x6f\x8a\x13\x81\x82\x32\x22\xfb\xb1\x8a\x43\x56\x7d\x86\x52\xdb\x55\x60\xcc\x2f\xbc\xc0\xfb\x86\x06\xae\x3e\xb3\xed\x71\x8f\xa8\x53\xa5\x2c\x4a\x1d\x64\x15\xc2\xcf\x5c\xe4\x3a\x11\xd8\x6d\x1a\xd6\xc0\xb7\xe6\x63\x8d\x50\x4d\x25\x88\xae\x2f\xc7\xbd\x83\x0e\x03\x7b\x5e\x02\x3d\xaf\x84\xe9\x9f\x75\x55\xdb\xfb\x28\x9a\x48\xd7\x91\xec\x9f\x88\xf8\xa2\x89\xc8\xf6\x44\x5a\xef\x10\x5f\x36\x11\xd9\x3b\x11\x88\xca\xfc\x75\x54\x77\xd7\xbb\x7e\xa2\x0e\x97\xd6\xd3\x2b\x1d\x80\x46\xaf\x9f\xe7\xba\x49\xda\x9e\x15\x72\x37\x86\xcf\x03\x50\x5e\x0e\xf0\x0b\x0e\xf0\x67\xfc\x83\x57\x58\xc4\xe4\x01\xbd\x76\x4f\x7e\xbe\x38\xd2\xc3\xf5\xf0\xe9\xf9\x82\xdf\xab\x9d\x2a\x8e\x87\x9d\x5b\x4a\x2a\xf1\x97\xdd\x52\x81\xbb\x84\x03\xa3\x12\x02\x6f\x55\x3b\xef\x14\x9a\xba\x5d\x0b\x19\xdc\x6c\xf2\x81\x9b\x4d\xab\x2e\xbf\xff\x17\xdc\x72\xbd\xb2\x22\x7e\xeb\x2d\xe7\xc0\xfa\xdc\x78\x04\x53\xf5\xfe\xed\x6e\xbc\x96\x91\xf1\xc0\xa5\x26\xbe\xf4\x52\x93\x0f\x5f\x6a\xe2\xdf\xe5\x5c\xf2\x9f\x45\x8f\x2a\x79\xd2\xfd\x26\x3b\xf7\x9b\xf8\x8d\xf7\x5b\x67\x3b\x02\xa0\xa6\x07\xef\xb7\xf6\x90\x7b\x7c\xa7\xee\x7d\x22\x7e\xeb\x55\xd7\xab\x70\x7f\xe3\xad\x07\x8e\x68\x28\xe0\x4e\xd4\xba\x34\x7c\x2d\xbc\xc8\xae\xcd\x2e\x62\x72\x16\xe2\x4a\x91\xbb\x32\xdb\xaa\x32\xcb\x0f\x3e\x14\xb3\xc2\x3b\x00\x89\x6c\xe0\x91\x00\x03\x15\xb0\x74\xab\xf4\x4e\x15\x35\xb5\x39\x00\x4a\x55\xad\xe5\xd6\x14\xba\x56\x25\x72\x9b\x71\xd4\x1a\xed\x0e\xfd\x0b\xf6\x53\x45\x7b\xbe\x72\xf1\x14\x17\x83\xd0\x29\x46\xe3\x23\xa7\xd2\x51\x9a\x65\xb9\x3e\xa9\x36\xaa\xa4\x96\x50\xdf\x22\xe5\xc0\x8f\x45\xab\xef\xcc\x20\x6f\xef\x53\xe7\x25\xc3\x79\x89\x47\xe7\x15\xf5\xa2\x68\x84\x65\x29\x8c\xdc\xa9\xc3\x36\x80\x51\xe6\xaf\x8a\xf0\xab\x48\x8d\x5b\x14\xb4\x3d\x4e\xc2\xc3\x45\xea\xac\xc8\x10\xbc\x79\x02\x0a\xf9\x6b\x79\x4a\x98\x5f\xe8\xf0\x99\x9b\xb2\x13\x5c\x48\x62\x3d\x26\x02\x3d\xd6\xed\x6c\xe4\xd8\x38\x27\x61\xb0\x2d\xb3\xc7\xc4\x20\xa4\x76\x11\xf4\x46\xd0\xf9\xc0\x3e\x35\x44\x53\x27\xfe\x3f\x64\xc7\xaa\xb3\x3c\xfb\x95\xb8\x84\x96\xa6\xb8\xd3\x07\xd7\x76\xa2\xb6\x5a\x1c\xd9\xa9\x57\xba\x49\x4d\x71\xd8\xca\x6c\x15\x44\xbe\x1c\x9b\x54\x7b\x10\xd9\xca\x95\xb3\xbf\xf2\x21\x51\x11\xa9\xab\xe8\x23\x91\x21\x16\x40\xf5\x47\x36\x59\x70\x2f\x8b\x9e\x7b\x19\xba\xa0\x55\xc1\x24\x46\xce\x16\xe3\xbb\xb8\x22\x61\x0e\x3a\x44\x89\x04\xcc\xd9\x8d\x48\x80\x0c\xa6\xdc\xed\x6c\x12\xea\x2d\x77\x97\xf4\x30\x53\x1b\xbe\xf7\x5b\x54\xdd\xd1\xae\xbd\xa2\x58\x31\x3e\x42\x11\x15\x68\xd7\x76\x55\x8c\xb5\x1f\xf2\x7f\xd7\x9e\x94\x31\x4a\xc3\xf4\xa8\x66\x30\x89\x12\x39\xb8\xb0\x96\xe9\x26\x4c\xc4\x31\x19\x10\x7c\x6c\x71\xe8\x18\xa7\xc8\xfc\x32\x5f\x96\x5a\x17\x10\xc7\x72\x20\xbd\xae\xe5\xb6\xfd\x55\x32\xd0\x07\xcc\x17\x40\x43\xa7\x10\x54\xb6\x25\xda\x4b\xba\x21\x8a\x43\x04\x38\x00\x4a\xf4\x95\x6f\xe0\x13\x1b\xee\x90\x41\xc5\xfa\x99\xa5\xea\x39\x53\x89\x84\x54\x1c\x90\x20\x35\x5b\x6c\xac\xa5\x21\x41\x06\x4a\xed\x76\x5a\x95\x94\x1c\xf3\x79\x40\x68\xe2\x2a\x91\xbc\xd4\xa7\x60\xe8\x8b\xf8\x1d\x84\x74\x0e\xaf\x58\xd7\x32\x87\x94\x30\xd4\x28\x4b\x98\x3e\x8f\x3d\x58\xe0\x83\x5d\xaa\x49\x7b\xe6\xb9\xbf\x20\x93\xf7\x52\x88\x6c\x28\xaf\x51\x1f\xc1\x23\x66\x10\xe0\xb6\x62\x7f\x0b\x56\xff\xeb\x5c\x15\x1f\x35\x9f\x0b\x6b\xe6\xb8\x13\x42\xa1\xb1\x2a\x0e\xef\x0b\x17\xda\xa3\xbc\xb6\xe7\x71\x0b\xb1\x38\xed\x3e\xdc\x65\x0a\xb3\xfb\xee\xed\x1c\x42\x33\xcb\x4c\xd7\x07\x36\xd4\xe7\x67\xa3\xeb\x44\xbe\x7e\x37\x49\xe4\x7c\x3c\x1f\x9d\x1d\x73\x1c\x3e\x0b\x74\x1c\xea\xd9\xe8\x69\x4e\xfb\xb2\xee\x15\xe1\x5f\xf1\xe1\x7b\xbd\x58\xaa\xaa\x3e\x96\x2d\x2d\x83\xe5\xa6\xc1\xc7\x7b\x6f\x6c\xf1\x65\x37\xdb\x67\x6e\x6c\x21\xb2\x6c\x28\xdf\x69\x7b\x1b\xc1\x4e\xcd\x3c\x10\xf8\xbc\x56\x75\x53\x9b\xf2\xe0\x77\xe8\xdf\x7f\x2b\x40\x42\x5c\xba\x67\xad\x0b\x84\xc0\x4c\x75\x95\xad\x0b\xab\xfa\x04\x52\xae\xe1\xd2\xbd\x05\x56\x92\x0b\xf3\x8b\x1c\xc1\x47\x3b\xdb\x02\xf5\xc8\x81\x73\x12\xb8\xdf\x71\x6c\xe2\x68\xb0\x04\x18\x14\xf2\x1f\x07\xc7\x2d\xe4\x92\xa4\x6d\xb5\x01\x3a\x43\x5e\xd9\xe5\x60\xdf\x89\x73\xa8\x8b\x83\x3c\xfd\x5e\xde\xce\xcf\x3c\xd7\xee\xe9\xb7\xbc\xbb\xb7\xf3\xa0\x83\x69\xb4\xac\xa1\x7b\x11\xd6\xcc\x13\x78\x65\x05\xd5\x2a\x84\x84\x93\xd5\x71\x42\xe8\xf6\x5d\x0a\x0e\x54\x18\xe1\x04\x22\x61\x11\xbf\xd1\x0c\xfa\xac\xb0\xac\x86\xf2\x3d\x4a\xaf\xbd\x79\x3f\x27\x2b\x8f\x68\x0b\xd1\xa7\x2d\x3a\x05\x13\x9f\x11\x36\x4f\x21\xf0\xe5\xe7\xfe\x24\x3e\xf7\x28\x5f\x62\x6e\x47\x30\x26\xdb\xec\xb1\x33\xcf\x76\xea\xc3\xa7\x3b\xb4\x21\x9e\x20\x4c\xf2\x31\x61\xfa\x46\x7c\x91\x30\xc9\x47\x85\x49\x3c\x32\x85\xbf\x81\x8f\x00\xb7\xc9\xb7\xc3\x36\xc7\x47\xd2\x86\x9a\xf7\x38\xf4\x42\xdc\x5e\x5d\x42\x1d\x3c\x97\x38\xcb\x77\xb7\x37\xb7\xa3\xcb\xcb\x0f\x58\x8c\x76\x2e\x6f\xa6\x5c\x84\x06\x95\xeb\xe3\xb9\x9c\x5c\xc9\xf7\xb3\xc9\x0d\xd4\x82\xbb\xea\xb3\xe9\xc5\xc5\x78\x36\xf7\xc5\x81\x50\xc2\x08\xc5\x63\x50\xad\x28\xaf\xa6\x72\x36\xbe\x9e\x8d\xe7\xe3\x2b\x6c\xc2\x83\xda\xfb\xb8\x78\x9e\xc1\xe4\xe5\xd9\xf4\xea\x6c\x3c\xbb\x9a\x5c\xbd\x71\x0f\x4c\xb8\x64\x3f\xe1\x82\xfd\x44\xce\x6f\x46\x37\xb7\x37\x50\xf7\x1d\x14\x69\x27\x9f\x01\x9c\x17\xf1\x4b\x09\x5e\xbe\xd5\xf7\x97\x7c\xb6\x6a\x1f\x10\xe9\x23\x40\x7a\x41\xd0\xe6\xa3\xd7\xf3\x31\xd5\xd1\x5d\x8e\x6e\xa0\x22\x9e\x86\x27\xcf\xc7\x17\xe3\xb3\x9b\x79\x22\x47\x67\x67\xb7\xb3\xd1\x19\x21\xaf\xdb\xc5\x85\xa5\xc1\x6f\xd1\x03\xc4\xf4\x42\x8e\x67\xb3\xe9\x6c\xee\x4b\xd9\xa7\x33\x28\x3d\x3d\x9f\xcc\xcf\xa6\x3f\x8e\x67\xa3\xd7\x97\xe3\xa1\x9c\x4f\xdf\x8d\xe5\xef\x6f\x67\x93\xf9\xf9\xe4\x0c\xd7\xf6\x7c\x8a\x85\xaf\x97\x97\xd3\xf7\x50\x9a\x3e\xfe\xc3\xd9\xe5\xed\x9c\x2a\xfe\xfa\x5a\x1e\xe6\x53\xac\xfa\xf3\x1f\x7c\x37\xfa\x80\x0f\xb9\xbe\xbe\xfc\x60\xe5\xe0\xc3\xf4\x16\x1b\x7b\x43\xae\x82\xc2\x73\x15\x0c\x99\xa7\x80\x2a\x1e\xc7\x7f\xb8\xc1\x6a\xd8\x7f\xbe\x9d\xcc\xb0\x58\x33\xae\xca\x4c\x44\xd8\xea\xf0\x7e\x72\x79\xe9\x05\xca\xb5\x33\xd0\x9b\xb9\xd2\x1f\x6b\x75\xa9\xde\x9f\x3b\x1d\xb8\x97\x41\x84\x0d\x0e\x51\x27\x43\x22\xaf\x6f\xaf\x26\x50\x77\x3a\x9d\xf9\x96\x07\x57\xf7\xca\x85\xfd\xae\x9a\x3f\x2e\xfd\x74\xc8\xf6\xbe\x7a\xd4\x17\xf6\xbb\x31\xbf\x1d\xcd\xe5\xeb\xf1\xf8\xea\x91\x52\x7f\x11\x97\xfa\x53\x41\xe5\xf7\x2d\x16\x18\x45\x50\x8e\x51\xc4\xea\x91\x98\x58\x8b\x0a\x26\xee\x83\x16\x0e\x88\x9c\x18\x34\x88\x72\xc4\x31\x9d\xf5\x67\x0a\x9c\x9a\xaf\x5c\x09\x51\xa6\x2b\xaa\x0f\x0a\x98\xa3\x9f\xe4\xe8\x7a\x76\xb7\x80\x8f\xc7\x45\x88\x9d\xd1\xef\x0a\xe3\xe0\x0d\x08\x97\xe0\xa8\xf4\xdc\xf4\x82\x7e\x3e\xb8\xad\xfd\x8d\x54\x89\x60\xa8\xb2\xd4\x00\x03\x93\x15\x72\xd5\xe4\xb9\xf4\xf4\x30\x1c\x2c\x30\x95\xcb\xd2\x56\x43\x9f\xdd\x3d\x4d\xe4\x8b\x44\x7c\x9b\xc8\xef\x12\xf9\x3d\x86\x1b\x7f\x87\x43\x23\x02\x15\x17\x11\x0d\x38\x34\xbb\xb5\x96\xad\xd2\x15\x0c\xaa\xf5\x15\xb0\xa0\x57\xdb\x4e\x17\x53\x38\x44\xc4\x75\x28\xf2\xa9\x75\x28\xec\x3b\xd9\xe5\x07\x74\xf1\xda\x4e\x9a\xf9\x9e\x85\x1b\xd1\x43\xa6\x80\xb3\x36\x09\x70\xb7\x5d\x3f\xe7\x90\x3c\x45\xcc\x7d\x46\x64\x34\xb5\xd9\xb5\xc1\xc6\x38\x72\x81\x65\x48\x75\xb6\xd5\x81\xe3\xc7\x32\x80\x71\x5b\x84\xf2\x5e\x6e\xa4\x63\x8c\x74\x92\x81\x48\xf6\x35\x22\xc1\xa7\xa5\xda\xc7\x91\xcc\xa3\xb0\xba\x53\x44\xb9\x05\xc6\x73\x83\x40\x4e\x56\x45\xa0\x62\x0b\x9d\xc8\x36\x23\x7d\xeb\x68\xb0\xb8\x1e\x53\x3d\x4d\x9c\x12\x09\xa9\x76\x58\xe0\x56\x86\x3b\x57\xf5\x6a\x65\x25\x81\x62\x0b\x5e\x90\x85\x2f\x00\x82\xcd\x40\x6d\xf0\xbb\x0e\x63\x85\x22\xf4\x76\x47\x6c\x1c\x14\xa3\x3c\x31\x83\x8a\x59\x98\xb8\x34\x28\x89\xab\xed\xb8\x50\xd2\xc4\xb1\xf9\x80\xe6\x31\x4c\x75\x52\x2e\xa0\x52\x5b\x2e\xa4\x6c\x95\x65\x11\x62\x7d\x5b\xae\x29\xb2\xda\xad\xe3\xc3\x53\xf3\x1b\xe7\xd9\x8d\xa2\x88\x2f\x9f\x57\x1c\xe3\xf8\x6b\x4c\x70\x09\xc1\x47\xe4\x12\x33\x77\x59\xd5\xa3\x3c\xb0\x9c\xef\x4e\xe5\x59\x8a\x40\xf7\xba\x00\x41\x0a\x08\x5c\x63\xe6\x91\x44\x66\x75\x40\x5c\xa7\x50\xd6\xec\xc8\xe0\x21\xc8\xcd\x2e\xdd\x53\xb0\xbb\x93\xa3\xde\xa0\x22\x81\xd9\x69\x25\x3e\x53\xd7\xc1\x8d\xd6\x8e\xf7\x15\x4f\x26\x95\xa6\x70\x33\x27\x25\x5b\x84\xf2\x3c\x0e\x70\x92\xfd\x7c\x71\xa8\x50\x5d\x8d\x25\xd5\x2e\x3a\x89\x31\x1b\x0e\x01\xba\x0a\x21\x11\x55\x16\xf9\x07\xe1\x1a\xc1\xf9\xf2\x4b\x84\x11\xde\x2b\x03\x33\xa1\xee\xdf\x07\x16\xda\x0d\x24\xb5\x23\x4d\x91\x4f\x04\x1f\x58\x18\xba\x2c\x05\x31\xfa\xe1\x28\xc3\xe0\x20\x7c\xba\x24\x52\x09\x20\xfd\x73\xcf\xcb\x0a\x68\x18\x46\x6a\x97\x54\x5a\x7f\x5b\xa7\x22\x58\xa8\x03\x85\x21\x19\x2c\x10\xe1\xae\x7a\x9f\x8a\xd5\xc3\x91\x35\x10\x16\x97\x83\x87\x02\xbd\x10\x9e\x55\x5f\x2e\x74\xbd\xd7\xba\x88\xf6\x05\xc2\x9c\xbe\x3a\xd7\x9f\x63\x47\xb9\x6b\x2f\x1c\xc8\x33\xd8\x67\x95\xd0\xc0\x0c\xe2\xc6\x77\x46\x95\xf8\x57\x54\x58\x56\x1a\xf9\x19\xed\x02\x60\xff\x0a\xd0\xdb\x2e\x1b\x8a\xef\xf1\xa1\xd9\x10\xc6\x64\x01\x7e\x2a\x35\x11\x07\x20\xd4\x6e\x13\x29\x15\x46\x08\x7e\x5a\x95\x1c\x55\x24\x60\x47\xe2\x44\x64\x73\xa3\xb5\x72\x01\xbe\x89\x6b\x19\x61\xb1\x06\x09\x6c\xe0\xa2\xe5\x6e\x6f\x37\x5d\x76\x12\xa3\x9a\x5f\xfb\x78\x21\x3a\x9d\x6b\x44\x82\xaf\xfc\x46\x77\x8f\x92\x95\x66\x48\x74\x30\xa2\x3c\x00\x6c\x56\x80\x07\x2a\x1e\xc8\x6b\x40\x31\x8f\xec\xbc\x2e\xec\x25\x20\xc0\x79\x52\x40\xa6\x14\xd8\x43\x6e\x87\x41\x16\x20\xb2\xaa\xd6\x1b\x6d\x10\x48\x20\x02\xa6\xf7\x63\x08\xc9\x89\xb8\x23\xde\x57\x01\xc3\x97\x10\x1b\x27\x4f\x70\x63\xed\x0f\x59\xb1\x84\x78\x35\xd6\x9c\x83\xf8\x02\x13\x47\xa6\xf2\x36\xf6\x7d\x6b\x8e\xbc\x46\x39\x1b\x9f\x2d\x6b\x85\x6a\xdf\x4a\xbd\x36\xf0\xaf\xbd\x91\x47\x2f\x8e\x5d\x1a\xbd\x4a\x44\xb6\xea\xae\x0c\x12\x54\x72\x75\x1d\x93\xc6\x02\xce\x25\xa4\x11\x49\x7d\xbb\x3d\xf5\x19\x66\xe1\x14\x2a\xd8\xa1\xca\x57\x1b\x02\x24\x64\x48\xd3\xb9\x72\xdf\x1f\x0a\x11\x33\x42\xbb\xe2\xbd\xa0\x7b\x83\xea\xc4\x03\x6a\x5c\x0a\x19\x38\x74\x00\x8a\xd9\x08\x77\x2c\xbd\x39\x72\x76\x76\x7d\x99\xc8\x82\x30\x13\x70\x5f\x61\xfb\x19\xb9\xaf\x2e\x55\xaa\xb7\xaa\xfc\x28\x07\xed\xd5\x18\x08\xda\x6c\x68\xd8\xb0\xda\xcc\x7d\xd6\x94\x32\x37\x6b\x63\x87\xd7\x23\x5d\xfe\x70\x44\x48\x08\x22\x60\x3a\x6d\x7f\x6b\x28\x47\xc8\x7a\x44\xe8\x1b\x0d\x5b\x48\xa8\x1a\x5b\x76\x78\xe7\x04\x3d\xb3\x6f\x2b\x4e\x96\x4d\x09\x40\xf1\x7e\xa0\x4d\xa5\xd6\x5a\xae\x9b\x2c\xd5\x79\x56\x10\xaf\x3f\xe5\x19\x1c\xcb\x8b\x30\xd8\x20\xb6\xd7\x0b\x40\x57\x6c\x81\x40\xa6\x5a\x2a\x06\x7e\xc4\x1a\x21\xaa\xc5\xa1\xac\xb3\x35\x3c\xec\xce\x64\x5b\xdd\x77\xb8\x1d\x74\x34\x24\xea\xec\x65\x51\xcb\x4d\x5d\xef\x5e\x7e\xf5\xd5\x92\x3e\xbb\xa4\x45\x30\xe5\xfa\xab\xff\x1f\x76\x72\xff\xb6\xff\x86\x5f\x5d\xbe\xb9\xbe\x3c\x79\x31\x3c\x3d\x31\x45\x7e\xf8\xab\x00\xc0\x3f\xde\xff\xfd\xdd\x8b\x6f\xbe\xeb\xe0\xbf\x7f\xf7\xed\xf7\x7f\xef\xff\xfe\x5b\xfc\xf7\xe6\xea\x56\x5e\x8e\xe7\xf3\xf1\x4c\xbe\x19\x5f\x8d\x67\xa3\x4b\x19\xb7\x05\x0b\x87\x8f\xf8\x62\x78\x9a\xc8\x0b\xbd\x28\x1b\x55\x1e\xe4\xe9\x0f\x3f\xfc\x20\x44\xcc\x05\x73\xfa\xc3\x0f\xa7\x09\xfc\x05\xb0\x5e\xe5\x9c\xc1\x5d\x3c\x37\x57\x22\x27\xc5\x72\x28\xc4\xb7\xa7\xf2\xa2\x54\xc5\xc7\x3c\x2b\xe4\xbc\x2e\xb5\xae\x13\x79\x91\xad\xea\x8d\xbc\xc8\x8d\x29\x13\xf9\xda\x54\xb5\xfd\xf8\xbb\x91\x7c\xfe\xe2\xf4\xf4\xf9\xc9\xe9\xd7\xcf\x4f\xe5\xed\x7c\x24\xc4\xf8\x4e\x97\x40\xc4\x92\x55\x81\xb2\x83\x90\xf9\xee\xd0\x46\x6b\xef\x05\x4e\x0e\x80\x75\x18\x51\x07\x8b\x43\x21\x4a\x0e\xad\x3e\xb5\xb3\x27\xf2\xdc\xec\xa1\x60\xf0\xbf\x82\x49\x43\xe4\x62\xd8\xaf\x43\x3e\x7a\xda\x26\xd8\xba\xd4\x55\xa5\x4b\xf9\xe6\xfa\xd2\x63\x48\x03\x6b\x35\x3b\x2f\xc2\x91\xc9\xf1\x57\x60\x27\x08\xa8\x8f\xe0\x74\x9d\xe9\xc2\x4f\x7f\x91\xc8\x0d\xd6\x3c\x7a\x4e\x2f\x41\x7d\xb6\x2f\x86\xa7\xc3\xff\xd6\x86\xee\x77\x31\x9c\x15\x34\xa9\x54\xb5\x07\xdc\x01\x0c\x42\x8d\x26\xb2\xe3\x2e\x04\xac\x69\x00\x13\x5c\x95\x5a\xa7\x56\x31\x1b\x7b\x23\x97\x1a\x91\x2d\xb1\xc0\x23\xab\x87\xf2\xf5\x01\xcb\xa2\x54\x85\x3c\xb0\x30\xfe\x37\x68\x9b\xb4\xc6\x8f\x3d\x08\x41\xa7\x94\x58\x37\x0a\x7c\x36\xdd\xff\x2e\x19\xbc\xcb\xfe\xcd\x0d\xfa\xe4\xc4\x7b\x24\x98\x6a\x11\x21\xaf\x10\x7c\x16\x8c\xab\x3c\x87\xbb\x08\xf0\xfd\x99\x81\x28\xe7\xd5\x0c\x37\xa8\x77\xc0\x49\x58\x82\x85\xe4\x03\x68\x6b\xe5\x07\xe1\xb3\x78\x7e\x29\x09\x18\xbe\x3a\x39\xa9\x0f\x3b\x6a\xb3\x40\xcc\xc5\xcc\xfe\x92\x36\xf8\xa1\x23\x21\x3c\xdc\x35\x13\x19\xed\x37\x46\xa6\xda\x5a\x75\xcc\x41\x60\x97\xfc\x03\x41\xc0\xe3\xbf\x65\x6d\x0c\x0a\xed\xde\x2e\xc7\x7a\xad\xab\x1a\xa0\x9f\x51\x32\x01\x8a\x5e\x2e\x55\xa9\x57\x8d\x1d\x0f\x22\xd2\x73\x2e\x29\x6a\x63\x23\xab\x09\x32\x54\x56\xfa\x68\x51\x44\xbc\x28\x2c\xf8\x0b\x5d\xd7\xba\x94\x55\x5d\xaa\x5a\xaf\x0f\x6e\x80\x44\xb9\x68\xbd\x9e\x65\x93\xab\x12\x8a\x07\x12\xac\x63\xf0\xdd\x6b\xbb\x5c\x15\x64\xc2\x41\xe7\xd5\x50\x88\xf7\x1b\x5d\xc0\x1c\x76\x5a\x41\x2b\x66\xb4\xe5\x89\xfd\x93\x5d\x30\x28\x03\x29\xc9\x80\x63\x89\x31\x2b\xec\x9e\xc3\xa6\xc9\x6c\xa9\x87\x62\xda\x3c\xb4\xad\x55\x47\xe6\x43\x51\x22\xdc\x4d\x0e\x80\xf2\x2b\x44\x7f\x07\x52\x6b\x94\xf2\x88\x44\xb6\x5c\x07\x28\xa4\x95\x2e\xef\x00\xba\x1b\xca\x9e\xc4\x3e\xab\x36\xc7\xaf\xfc\xab\x28\x90\x1b\xe1\x52\x59\x03\x5e\x15\x00\xeb\x6a\x55\x10\xd6\x4b\xed\x55\x61\xff\xe9\xbf\x2a\xec\x67\xe8\x80\x40\xa8\xc4\x1d\x6a\xc2\x6f\xdb\x65\xd6\x87\x47\xb8\x2e\xbb\x35\x85\xde\xe3\x80\x19\xc8\xf3\x15\xc5\xd2\x14\xca\x0c\x1e\x50\x8e\x0a\xf0\x00\xed\x5b\x52\xb0\x96\x91\xd9\xa9\x58\xc3\x61\x32\x4c\x8d\x8a\xa7\x17\x2d\x74\xd8\xa7\x42\x07\xeb\x1a\xd1\xe8\x23\x0e\xb9\x29\x17\x59\xa0\x9d\x4d\x59\xc1\xf2\xea\x02\x51\x37\xf1\x45\x9e\xd1\x13\x08\x45\x3f\xe2\x9f\x8c\xdd\xa7\x52\xb3\x4d\xee\x3e\x07\x8e\x73\x15\xbf\x4d\x70\xe1\x0d\xb1\x8a\x97\x80\x16\xd7\x61\x58\xb5\xfb\x04\x98\xeb\xed\xaa\x34\xbf\xcb\x02\xdd\x09\xd4\xca\x58\x5b\x05\x08\xb2\x08\xf2\x0e\x85\x24\x17\x00\xf4\xac\xb6\xbb\x5c\x27\x8f\x3d\x4a\x06\x8f\xf2\x49\xdd\x75\xa9\xea\x0c\x26\xbb\xb2\x6e\xa3\x5c\x69\x9d\x78\x22\x2e\x57\x68\xe6\xeb\x75\x41\xb7\x05\x29\x09\x58\xd8\xbd\x96\x6b\x2b\xb7\x07\xeb\x78\x73\x65\x9b\x68\x49\x77\xbd\xd1\x87\x04\xb5\x06\x4b\x5e\x20\x6d\x75\x0c\x90\xe6\x6a\xf5\xf2\xac\xf8\x28\xb8\xa2\x26\x0d\x8a\xd0\xdd\x54\xdc\x68\x19\x80\x0d\xfc\x0c\x6d\x5d\x00\x8c\xc3\x23\xec\x2c\xba\x5d\x1e\xd6\xac\x4a\x10\x89\x9c\x69\x4c\xed\x40\x4a\xeb\x5f\x7c\x94\x80\x16\xdf\x7e\x11\xb1\xd0\x6f\x15\x10\x6c\xa0\xf0\x57\x4c\x87\xe6\x3e\x43\xc9\xf6\xed\x2e\xcb\xf1\x1a\xb7\x3e\x51\xea\xc7\x58\x6d\xcc\x1e\x9f\x4f\x52\x0d\x61\x37\x84\x44\x3f\x88\x8f\x05\xfe\x35\x2b\x3d\x0a\xda\x7b\xdd\x27\xee\xdc\x76\x5f\xef\xcd\x49\x55\xeb\x9d\xdc\xea\x7a\x63\xd2\x97\xf2\xe8\xf4\xd8\x6e\x87\x4f\x07\x84\x6b\x05\xaa\xde\x7a\xd0\x7b\x4d\xc5\xde\x28\xf6\xe1\xed\x84\x80\x08\x6b\x20\x66\x81\x0d\x80\xc8\x41\xd0\xad\x4d\x86\x4e\x22\x42\x54\x70\x44\x02\x24\xb9\x0c\x5e\x19\x9f\x57\xc8\x42\x05\xc7\x0f\x0e\x2d\x68\x17\x3e\xb4\x19\xf0\x77\x1e\x10\xc3\xda\xed\x0e\xd7\x87\x0a\x17\x36\x61\x57\x1b\x94\x0a\xbf\x4b\x8e\xf2\xca\x24\x58\xf7\xe3\xf7\x24\xab\x7c\xcc\x67\x71\x80\xfb\xd4\x14\x5a\x00\x8f\x3d\x74\x64\xaa\x0a\x4b\xdd\x92\xb6\xa8\x57\x1b\xa0\x80\xa3\x5d\xb1\x72\xee\xa4\x05\xd4\x34\x5a\x68\x22\x8a\x20\x07\x50\x15\xde\xb7\x77\x7f\xc5\x0b\xf6\x59\x25\x4b\xbd\x6b\x6a\x15\x67\x38\x16\x5a\x60\x0c\x17\x07\xba\x2b\xcd\x22\xd7\x5b\x0e\x7c\xc1\x66\x62\x39\x2e\x03\x25\x2f\x28\xdd\x61\xc5\xe4\x02\x59\x53\x93\xd0\x2a\xa8\x61\x16\x58\xca\x8f\xc1\x43\x58\xea\x8d\x75\x58\x7d\xd9\x25\x54\x8a\x63\x21\x09\x00\x61\x97\x1a\x90\x7e\xad\x9a\x1e\xca\xf7\xc8\x72\xd3\x73\x59\x29\xc9\xf8\xe7\x4b\x55\x40\x71\x35\x8c\x1d\x39\x9b\xc3\x4e\x00\x01\x56\x10\x96\xf1\x85\x77\x00\x0c\x7f\x61\x55\x23\xc4\x4b\xbd\x06\xbd\xf3\xa1\x75\x6c\xe0\xa1\xa9\x10\x70\x21\x94\xaa\x43\x08\x19\x2f\xe7\x0c\x8a\xdd\xa5\xcb\x1f\xd1\x87\x9d\x75\x01\xaf\xa0\x92\x0b\xd5\x32\x94\x05\x0b\x09\xd3\xf4\xf5\x95\xce\x63\x4e\x27\xba\xf1\x65\xab\xc7\xc3\xc7\x6d\x86\x42\xbc\xb3\x76\xae\x35\x47\xbd\x0d\xe1\xa3\x6a\x60\xce\x39\xe3\x2c\x01\xe6\x18\x73\x07\xe5\xd6\x14\x27\xf6\x76\xd0\xd5\xad\xe8\xb7\x24\x28\xba\x19\x59\x94\x60\xbf\x3f\x6a\x55\x8a\xc0\xaa\xe4\x4b\x29\x30\x27\x83\x41\x41\xbd\x63\x25\x7f\x6e\xb2\x5a\x07\xd4\x7d\xae\x3e\x9f\x87\xf8\xe0\xf0\xde\x6b\xcf\xc6\xe8\xf6\xd2\x6a\x7b\x7a\xad\x7b\x17\x94\xd6\x94\xa9\x2e\xad\x26\x45\x67\x0a\x54\x3e\x06\xff\x30\x4f\xeb\x3f\x5a\x1b\x68\xd6\x8f\x2c\x09\xb6\xe0\x94\x93\x2b\x78\x27\x60\x67\x93\x92\xec\xdc\x7a\x40\x5b\xb2\xe4\x42\xa6\xa6\x42\x01\x04\xdb\x3f\x15\xee\xd3\x54\x55\xb4\x88\x92\xbd\x1a\xa2\x90\xf6\x15\x56\x2f\xe6\x07\x34\x1b\xf1\x01\xf8\x61\x2a\x39\x4f\xa4\x12\x9e\xe4\x4a\xb6\x09\x6c\x9c\xce\xba\xe9\x31\x7d\x5b\xeb\x89\x2a\xd0\x0a\xbc\xc0\x25\xa2\x4c\x04\x2f\x14\xb4\x77\x91\xd6\xa3\x9c\x40\x38\xee\x95\xfd\x02\xc0\xa6\x96\x19\x60\xb4\xb2\xf9\x98\x9a\x2d\xf6\x7d\x3c\x2a\x37\x92\xdf\x09\x20\x03\xb9\xfa\xc5\x3f\x67\x05\xd5\xcf\x34\x08\x6a\x45\xe8\xb9\xa3\xf1\x16\x5b\xa2\xe5\x90\x85\x9d\x5f\x5a\x0e\xf0\xdd\x83\x87\x5e\xbe\xd0\x4b\x45\x0e\x07\x54\x64\xdb\x8f\x83\xac\xd0\x95\x42\xd5\xd1\x56\xa7\x3a\x37\x8e\x39\xb4\x3f\xb3\xac\xd6\x35\x16\xe0\x1a\x93\xe5\x50\x31\x36\x50\x64\x5a\x13\xa3\x9b\xd5\x61\x97\xd0\x7e\x63\xf5\x64\x58\xe3\x77\x47\xd5\xbe\x1a\x88\xa6\xba\x02\x4a\x16\x62\x9a\x55\xee\x4b\xd4\x16\xbf\x61\x16\x36\xab\xc7\x38\x98\xfb\x99\xc3\x85\xae\x34\x42\xb6\xd2\xc9\x08\xf8\x05\x02\xdf\x92\x57\x99\x27\x27\x82\xb7\x67\x85\x3b\x8a\xe4\x5a\xca\x65\x56\x2e\x9b\xad\xbd\x22\x96\xba\x6a\xdb\x95\xa6\x90\xa5\x1d\xb1\x59\x2e\x55\xe5\x4a\x17\x3c\x97\x95\x72\x8f\x61\x13\x5c\x17\x4b\xd3\x94\xc4\x67\x27\xf6\x76\x00\xb5\x24\x46\x02\x57\xcf\xae\x5a\x0a\xe1\xe0\xaf\xcd\xcc\xaa\xe3\xa5\xd9\x02\x8e\x52\xaa\x4f\x56\x6a\x89\x64\x7f\x40\x33\x31\xb4\x56\x85\x5a\x6e\x32\x7d\x87\x5a\x26\xe9\x2a\x06\xa7\xd3\x29\x82\xe2\x79\x73\x43\x8b\x01\xa4\x5a\xac\x4a\x22\x0f\x87\x8a\xf3\x8c\x1b\xdb\x22\xf3\x02\xe5\x8f\x33\xc3\xf2\x27\xb3\x90\xca\xda\x61\xa9\xbd\xf0\x00\x7d\x98\x87\x20\x82\x9d\x99\x10\x66\x0b\x7a\xa3\xce\x96\xc9\xb3\xba\xc6\x8c\xcd\xda\x4e\x7f\x71\xc0\xa4\x81\xcb\x79\x04\xef\x15\xe4\x6f\x7a\x89\xb4\xe7\x1d\x56\x2a\x90\x9a\x47\x8f\xf0\x50\x88\x09\x97\x30\xda\x81\x54\x49\xcb\xa0\x03\x9a\xc1\xd0\x79\x76\xc6\x53\xd1\x5d\x58\xa1\x0b\x62\x79\x91\x6b\xa8\xb0\x2c\x03\xac\x35\xa2\x77\x73\xcf\x44\xaa\xb5\x85\x49\x0f\x1d\xa7\x15\xaa\x59\x85\x93\xb1\xee\x88\xf8\x5a\x3b\x73\x81\xa9\xbe\xe1\x48\x1a\x8e\xd8\x62\xcb\x10\x00\x80\x87\x83\xb0\x8f\x01\x48\x36\x78\x98\x3d\xc9\x98\x88\xa9\x0e\x55\x0d\xec\x0e\x95\xdc\xeb\x3c\x87\xc6\xb6\xba\x92\x77\xaa\xcc\x54\x51\x27\x82\x5e\xff\x15\xf2\xfb\xb7\xbf\x37\x14\x62\x94\x23\xaf\xdb\xe7\x37\xc0\x6e\x39\x28\x0f\x52\x5b\xc1\x8d\x00\xd6\xd1\x33\x41\xca\x2b\x71\x8a\x4e\x17\x91\xeb\x04\x9f\xc3\x33\xc3\xf7\x1c\xb7\xa0\x85\x97\x9d\x3d\x6c\xbc\x58\x1b\x4a\x74\xb1\x5e\xe4\x62\x32\xa8\x13\xb6\x9f\x56\x39\xd4\xf9\x34\x05\xd5\xc9\xd3\x73\xf9\x3e\x64\xab\x59\xb4\x83\x8b\xde\xb4\xc7\xe6\x56\x44\xf0\xe8\xab\x94\x58\x11\x93\x21\x94\x1e\x77\x90\xde\x43\xac\x10\x81\x10\x17\x43\x79\xad\xac\xf5\x6f\x10\x82\xc9\xde\x66\x9c\x27\x0c\x09\x6c\x5c\xa6\x5b\xc9\x41\x00\x60\x87\x61\x1e\xbe\xc1\x07\xc8\x09\x47\x9f\x80\x29\x36\x95\xae\x42\x05\x30\xc0\xfb\x17\x02\x0f\xa5\x6f\x42\x86\x5b\xac\xc3\xf6\x16\x9a\x11\x56\x6d\xe3\x2f\x15\x84\xa3\xbc\xfd\xc8\x26\x40\xdb\x7d\xcc\x0a\x01\x86\x0e\x2d\xb9\x5d\xbd\x1e\x9c\x45\xa8\x6c\x3c\x9b\x5e\x7f\x80\x2a\xd6\x10\x8f\x14\x6b\x6a\xa7\xe7\x93\x8b\xc9\x19\x14\xb4\x0a\xf1\xbc\x95\xe5\x76\xdd\x9c\x61\xfc\x10\xb9\x9e\x49\x73\x04\xa1\x04\x46\xf2\x83\x3d\x17\xe8\xf5\xb9\x05\x50\xdc\xde\x04\xc4\x6b\xce\x34\x6d\x63\x88\xfb\xe7\xa0\x63\x93\xfd\xaa\x53\x81\xf9\xc9\x4a\x1d\x28\x8e\x4d\x57\x44\xc8\x0c\xfa\x60\x2b\x7a\x74\x86\xda\x01\xc0\x23\x0c\x63\xab\x3c\xd7\xa9\x1c\x84\xc9\xf5\xc1\x31\xd5\x0f\xd1\x9d\x07\xe7\x4d\xa5\x69\xa9\xc1\xb5\x53\x95\x18\x1c\x4c\x33\xb0\x47\x56\x0e\x9c\x74\x30\x02\x62\x4c\x3b\xea\x19\xd5\x9b\x62\xe9\x00\xf3\xad\x77\x9b\xaa\x1a\x90\xc6\x76\x60\x26\x56\x06\x42\xe9\x86\xbc\x86\x3b\x5d\x58\xa7\x11\x22\xaf\x81\xed\xe9\xf9\xd6\xbd\xbe\x3a\xc2\xc5\x06\x37\xc2\x6c\xa9\x33\x0e\x48\x87\xc2\x37\xc2\xeb\x8e\x21\xd8\x68\xca\x6d\x48\xfc\x44\x07\x6f\x40\xe7\x70\x90\x60\x28\x33\x09\x18\x4f\x5d\x1d\x5d\xdf\xce\xc3\x71\xc0\x31\x6c\x54\x25\x80\xea\xb4\x77\x77\xf8\x54\xdb\x6b\xb2\x7b\xcc\x58\x0f\xf0\x42\x62\x7a\x5a\x04\x7f\xe1\x8e\xc8\xc0\x0c\xde\xfb\x42\xc2\x08\x1c\xec\xa5\xd3\x66\xf6\x96\x57\x07\x6b\x3d\xc3\x67\x49\x24\xf9\x62\x0c\x9f\x0c\xcc\x8d\xb4\x6b\x59\x9d\xd0\x00\x7c\xc6\x85\x38\x22\xda\x90\x44\xb8\x99\x2e\x44\x97\x42\x28\xd9\x8e\x63\x65\xca\xbd\x2a\x53\x2c\xd3\xb7\x6b\x48\x6d\xfd\xaa\x58\x37\xc0\xfb\x74\xf4\x56\x97\x3a\x2b\x20\x10\x94\x84\xdd\x75\x22\x73\xb8\x48\xbe\xae\x24\xa8\x9b\x60\x6c\x38\x5d\x6e\xe5\x20\x1c\xce\x00\x18\x46\xe7\x3e\xee\x35\x20\x37\x15\xe6\xee\xa1\xea\x76\x18\x7d\x26\xa0\x53\x56\xc4\x7b\x6e\x03\xa6\xa0\x54\x3c\xd1\xda\x40\xf8\xe9\x02\x9e\xe7\x74\x97\x0b\x8e\x45\xa4\x16\x78\x12\x28\xb2\x17\xfe\x85\xb2\x19\x62\x6b\xd2\xc6\x5e\xf9\x99\x87\x6a\x20\x62\x61\x28\xd8\xf1\x5d\x95\x59\x51\xeb\x72\xa5\x96\x1a\x71\x4a\x33\xf2\x40\x80\xd4\xcc\x7e\x1e\xe4\x83\xc9\xa1\x98\xb3\x81\x1b\xdc\x31\x70\xe6\xc8\x25\x80\x76\x4c\xe5\x51\x07\x63\xe0\x53\x8c\xec\x3d\x8a\xa1\x54\x43\x59\x05\x55\x3c\xf1\xba\xa1\x42\xa7\x9a\x9d\x6f\x2c\xd2\xf2\x1a\xe5\x15\x86\x79\xc0\xda\x6a\xea\x2a\x4b\x81\xcb\x4b\x56\x4b\xb3\xd3\x84\x05\x83\xcc\x57\x65\x53\x50\xfc\x82\x55\x29\x5e\x9f\xa1\xb0\x66\xdc\x48\x8a\x01\x0e\xe6\x2b\x44\x92\x2b\xf4\xaa\x89\x07\x34\x70\x61\x79\x60\xec\xdc\x31\xef\x05\xc4\x74\x7c\x25\x58\x8c\xe0\x1a\x9f\x4c\x79\x14\x40\xd9\x72\x34\x39\x68\x25\x0d\xac\x2a\x25\x6b\x63\xa0\x72\xd5\x55\xb0\x65\xf5\xf1\x50\xbe\x77\x09\x1b\x3a\x9d\x65\x63\x77\xd6\x3e\x13\xb0\x8f\x38\x22\xe6\x9e\x05\xb6\x0b\x52\x81\x2a\x2e\x1f\x09\xcc\x15\x77\x01\x87\x9f\x8f\xd9\x67\x9f\x9c\x45\x75\x0f\x79\x56\xb5\xc5\x1a\xfd\x50\x55\x45\x79\x0e\xab\x23\xb8\x89\x9f\x78\x3b\xbb\xbc\x67\x76\x65\x77\xd9\xb2\x41\xf4\x4b\x55\xa4\x42\xed\x76\xa5\xd9\x95\x56\xbc\xf3\x03\xd7\x9b\xd8\x95\x46\x3a\x54\x1c\xad\x0c\x3e\xd5\x6d\x12\xa6\xd9\x74\x61\x94\x0e\xaf\x3a\x38\x16\x35\x50\xfe\x3d\x11\xa0\x89\xca\xb9\xab\x30\x80\xe7\x1f\xdd\x5a\x44\x15\x13\xc2\xba\x27\x01\xfd\x99\xeb\x86\xf6\xd6\x5d\x87\x73\xcf\x53\xdc\x69\xb9\xdb\x1c\x08\xd8\x17\xcf\x01\x22\xe5\x52\x86\x0c\xdf\x84\x52\x7e\x30\x0d\x50\xb4\x28\x8a\x5f\x9b\x1d\x9d\x66\x3b\x2b\x17\xcf\x65\xbb\x18\x95\xa5\x6b\xe5\x47\x65\xb8\xd2\x3a\xe6\xf0\xed\x92\xdc\x96\xfd\x92\xc1\x37\x50\x7c\x53\x88\x7a\xd3\x80\x6d\xba\xc5\xc1\x3e\x78\x80\x12\xb2\x67\xbb\x02\xd9\x83\x75\xc7\x37\x6b\x8f\x71\xe3\xda\xce\xb8\xf4\xbe\x2b\x77\x44\xf3\xac\xeb\x80\xee\xb8\x0a\x39\x9b\x5f\x72\xcf\xb0\x3a\x06\xfd\xe3\xeb\x18\xe1\xaa\x00\x44\x1b\xac\x6f\x43\x7f\xbc\x75\xf1\x23\x39\xa6\x43\x1d\xc0\xa0\x0a\x16\x12\x58\xbd\xee\x9e\x66\xb5\x31\x74\x84\xb6\x09\x80\x2b\x47\xf6\xeb\xb2\x76\x9e\xe4\x97\x1f\xc3\x2e\x46\x6a\x8f\x01\xc9\x23\x7e\x0a\x49\x33\x7b\xde\x8f\x9e\x59\x78\xa3\xa1\x4d\xe5\xea\xe0\x90\x65\x9b\x84\xd0\xde\xcb\x79\x2e\x22\x7e\x9b\xcf\x21\x1b\x0d\x85\x48\x8f\xa1\xfc\x5a\xae\xd4\x12\xcb\xa0\x99\x71\x94\xa7\xcd\xf2\x12\x98\x50\xce\x1c\x43\x63\x03\xe1\x7a\xcd\x4a\x80\x19\x88\x63\x0c\x69\xfb\x50\x07\xb4\xad\xbd\x96\xd6\xe3\xf7\x27\x14\x2e\x83\x1b\x4b\x01\x72\xaf\x2a\xd7\x50\x08\xc2\xf9\x88\xfd\x86\x0a\x79\xfd\x98\x91\x2e\xfc\xa3\xbd\x3f\x6a\xfb\x57\x97\x55\xda\xaa\x8f\x5a\x28\xb9\x36\x26\x95\x2b\x05\xd8\x42\xab\x95\x29\x6b\x0c\xc4\x38\x3f\x32\xe1\x69\xeb\x3b\x70\x12\xe2\x11\x3b\xc0\x03\x98\xd5\x01\x3b\xe8\xc3\x35\xa8\x3d\x12\x83\x1b\x13\xd2\x55\xa3\x6f\xcc\x91\x63\x2a\xcd\xf7\xe4\xf1\x82\x99\x09\xed\x1d\xc6\x45\x91\x58\x81\x5e\x81\xed\x91\x15\xeb\x55\x93\x0f\x85\x38\x8a\xa2\x4e\xc1\x16\xc0\x15\xc5\x36\x2c\x58\x0c\xdb\x1d\x9c\xc3\x9f\x1b\x48\xce\x1b\x53\x63\xe1\xa7\xe2\x17\x08\xbe\xb2\x30\x22\x9a\x1f\xc0\xc9\x3f\x61\xf4\xf4\xf8\x66\x84\x49\x05\x8b\x41\xe5\xd0\x98\x63\x98\x37\x8b\x0a\x0f\xb0\x78\x91\x72\xf7\x48\xe5\x13\x0e\xc1\xf7\x4e\x9c\x44\x74\x16\x0e\x8d\x1d\x36\x33\xf8\xcf\x82\x1d\x47\x54\x8b\x2a\x7f\xc9\x81\xdc\x47\xb6\x06\x6e\x32\xb0\xa3\xfc\xec\x5b\x4f\xc4\x7d\xe9\x5b\x25\x6b\x71\x72\xca\x1a\x66\x42\xe8\x5a\xf0\x60\x2e\xc8\x8f\x74\x0b\xac\x2a\x61\xda\x4f\x56\xae\xa0\x16\xda\x10\x2a\xee\x9d\x62\x6e\x27\xfc\x06\x19\x57\x2d\xbe\xad\xb6\x5e\x55\x05\x76\x03\x30\xe2\x87\x08\xb0\x67\xc2\xfd\x81\x5a\x7a\x46\xe8\xef\x45\xe4\xaf\xf1\xb0\x04\xe5\xd6\x88\xd9\x50\x63\xd3\x4d\x95\x38\xa2\x50\x3f\x4d\x2b\x84\x6e\xf8\x7b\x3e\x4f\x31\xdb\xf2\x16\xc1\x9f\xc3\x57\x0f\xe5\x6b\x2c\x64\xe9\xfb\x3c\x86\x06\xdd\x53\x23\x5a\x56\x58\x41\x72\xb4\xb3\xea\xf1\x6b\xa7\x6e\x53\x17\xb3\x7e\x04\x65\x49\x32\xc3\x55\x2d\x0f\xb4\x6e\xec\x61\x86\x3e\xaa\x56\x79\xc4\x20\xe7\x27\x57\xd8\x73\x91\x72\x1e\x9b\xb2\x07\xf0\x1a\x6e\x77\x6a\x40\x1d\x82\xb1\x03\x2d\x17\x90\x9f\xdd\x21\xf0\xfe\xda\xfa\x4b\x14\x14\xdf\x6f\x8c\xdc\xdb\x6b\x5c\x40\x5d\xc2\xcd\xa6\xa9\x92\xa0\x8e\xad\xde\x50\x0d\x96\xe7\x28\xad\x7c\x19\x38\x12\x91\xf9\xd2\x0b\xb0\x74\x2b\x34\x19\x18\x01\xbc\x36\xe4\xba\x52\x95\xbe\x3b\xd8\x48\x9a\xfa\x4a\x96\xca\x4e\x2e\x09\x5f\x85\x0e\xa5\xc3\x12\xaf\xc3\x06\x37\xf6\x3a\xfa\x16\x3b\xcc\xdc\x94\x11\xb7\x03\xe2\x2b\x85\x55\x45\xde\x62\x9a\x14\xae\x77\x21\x91\x5b\xe8\xa7\x20\x42\x58\x7a\x2c\xfb\x94\x7b\xee\x8e\xe8\x35\xdb\xdb\xb6\x18\x34\xb7\x51\x2e\xeb\x41\xa1\x39\x46\x9e\xf9\x3b\x93\x37\x5b\x0a\xae\x57\xb5\x29\xd5\x5a\x0b\xd3\x42\x3b\x20\x34\x20\xa7\x55\x16\x25\x7b\x2c\xc1\xe8\xfc\xa5\x0a\x4e\x4f\xbb\x1b\x0e\x41\xbb\xd9\x20\x33\x3b\x44\xae\xc5\xd3\x15\xcb\x64\x9c\xd1\x7c\x20\x40\x2a\xac\xab\xa7\x55\xda\xb1\x4e\xe1\x26\x5e\x67\x77\xba\x08\xac\x57\xbf\xe6\xf2\xc6\x60\x89\x50\x56\xf9\x4a\x10\x81\x88\x74\x4f\xb7\xa6\x5b\xa5\x20\x21\xe2\x8f\x78\xc2\xe0\xa3\x02\xc9\x70\x22\xa6\x65\x87\x1c\x81\x11\x52\xe8\x7d\x00\x32\x01\x26\x80\xfb\xfe\x97\x2c\x19\x5c\x77\xd0\x0b\x13\x59\x04\x56\xad\x62\x7a\x9a\x78\x10\x1c\x9c\x05\x8d\x8c\xab\xba\xb2\x6a\x33\x3c\x96\xe7\xa0\x18\xb1\x58\x27\x80\xc5\xa1\x4a\xcb\x82\xec\x50\x5a\xc3\xa1\x10\x53\xac\xff\xb4\x1e\x2a\x7d\xa6\xc2\xf2\x7a\xb8\xa2\xfd\x4e\xf1\xd9\xcf\xca\x52\xc3\x08\xec\x1d\x88\xde\x03\x40\xda\xed\x0e\x89\xa8\xcc\x53\x27\x1b\x45\x34\xa1\x21\x77\x51\x71\xca\x06\x0c\x7f\xd0\xf7\xad\x40\x13\x0d\x8c\x6e\x1f\x7a\x2b\x97\x63\x92\x1f\x92\x41\x14\x62\xd5\xe4\x5e\xa5\x73\xc1\x03\xc8\x9b\x27\x55\xe6\x0a\xb9\x48\x00\x05\xb1\xbf\xb4\x63\xf2\xd8\x09\xe4\x6d\xef\x6f\x1e\xf7\x6f\xdb\x87\x3d\x88\x6d\x95\x91\x2e\x5a\x09\x7b\xf7\xe3\xd9\x64\xaf\xe2\xc5\xf1\xa3\xdc\xff\x18\x32\xea\xda\xc8\xc2\xf7\x3d\xc3\x70\x5e\x50\xa7\x72\x8f\x6f\xe2\xa8\xee\xb3\xa0\x2c\xc2\xb9\xdc\x11\xaf\xbd\x78\x88\x5b\xdf\x0e\x8c\xab\x8b\xd8\xe8\x79\x3c\x26\xfc\xd0\x00\x41\xcf\x91\x0e\x5b\x36\x55\x6d\x08\x5c\x03\x0c\x2c\x20\x6e\x77\x35\xb9\x45\xad\x4b\xe7\x7f\x4c\x56\x1d\x35\x1f\x2e\x1a\xcb\xf1\xe2\x80\xce\x29\xf8\x86\x88\xb8\xc8\xc2\x40\xe5\x28\x01\x92\x0e\xc4\xc7\xe9\xf0\xb9\x6f\x05\xc8\x21\xad\x07\x74\xc2\x6b\x6c\x18\x41\xb3\x29\x3c\x4c\x56\xaa\xce\x2a\x84\x2c\xdb\x44\x46\x5a\x0b\x8c\xbe\xf5\xac\x04\xac\x7a\x89\x19\xa9\x96\x83\xe4\x83\x5d\xdb\x9d\x86\xf0\x79\xcf\x80\x7c\x1c\x00\x0f\xa5\x5f\x1a\xa4\xe0\x1f\xc5\x42\xee\x72\x05\x85\x89\x25\xb4\xed\x70\x47\x86\xcd\xa2\xa9\x45\x56\x45\x45\xb0\x7b\x87\x83\x19\x9e\x82\xc5\x41\x2e\x34\xd2\xf4\x6e\x77\x99\x1d\x32\xd5\x1a\x70\x68\xdd\xfa\xf1\x90\x57\x85\xf9\xf4\x67\x79\x2e\x5d\x96\x67\x8e\xf1\x35\x2c\xcc\xc8\xec\xb1\x37\xcc\x50\x44\x55\x5c\xaa\x13\xa6\x6e\x8f\x9d\x9c\x5b\x74\x0b\x80\x64\xbe\x72\xc1\xc1\xf0\x9e\x6c\x33\xd7\xb8\xe4\x3c\x97\x4a\x3c\x3e\xd8\xee\x5a\x20\x8e\x8d\xf5\x12\x45\x70\xac\x59\xd5\x28\xd9\x2d\x33\x71\xba\x24\x28\x9f\x70\x1b\x46\x7b\x53\x89\xf8\xc3\xc7\x09\x19\x50\x78\x25\x3d\x25\x6f\xe6\x47\x23\xb0\x3a\x9b\xd6\x26\xaa\x68\x0a\xc1\x25\x58\x65\x7d\x87\xdd\xef\x64\x9d\xc3\xa1\x0d\x8f\xa6\x60\x3c\xa6\x38\xeb\x41\x75\x3e\x8f\x2e\x1e\xfc\x86\xb9\x88\xf9\xc0\x6e\xb4\xb2\xca\x65\x95\xd1\xb2\xd9\xd1\x86\x8a\x3d\xb2\xbb\x43\x9d\xc0\xd1\xae\x7d\xc0\x0d\xd5\x11\x94\xd6\x3a\x86\xe7\xb0\x73\xe0\x51\xd8\xc2\xb8\x2a\xb5\x74\x94\x0d\x80\x3e\x68\x57\xe9\x0f\xdd\xc3\x10\x5e\x2a\x6a\xf6\x09\x31\x23\x82\x6e\x53\x70\x16\xb8\x51\xcf\x4d\x03\x2a\x85\x85\xfb\x46\x56\xb9\xd6\xc7\xb8\xee\xa8\xde\x94\xba\xda\x98\x3c\xf5\x35\xe3\x18\xd8\xa0\xe1\x30\x19\x90\xb5\x9d\xa1\xf7\x80\x98\xc7\x0e\x32\x57\x7b\xd4\xa8\x18\xb8\x2e\xc2\x5a\x5b\xdc\x03\x88\x5b\x17\xcd\x56\x97\x10\x26\xb4\x2e\xd4\x56\xd7\xba\xb4\xbe\x98\xaa\xad\x71\x5a\x36\xc8\xee\x95\xab\x83\x3d\x46\x70\x83\x2b\xea\x4a\xa1\x50\x42\xb5\x05\xf6\x0a\xb5\x2c\x4d\x15\xfc\x22\x2b\xf2\xac\x08\xf3\x65\x47\xd6\x1f\x80\xde\x40\x50\x13\xba\xaa\x44\x56\xc8\x5c\x17\xeb\x7a\x73\xec\xdc\xc3\x28\xf8\x1d\x0e\xd8\x1a\x01\x45\x18\x9e\x8f\x3c\x1b\xe1\x10\xb0\xea\xb0\xf0\xab\x23\x07\x43\x79\x34\xf6\xf2\x1a\x67\xae\xac\xc1\x01\x2f\xc4\xc8\x34\x64\x4e\xf8\x1c\xb6\x0f\x2d\x22\x8e\x80\x03\x6f\x95\x4c\xeb\xb6\xff\xce\x3a\xf0\x53\xee\x6c\x4c\x22\xd1\x78\x5c\x1b\x90\x81\x1c\xe1\x8d\x8b\x47\x25\xfe\x91\x50\xe6\x77\xd8\xec\x19\x1c\x50\x11\x4d\xd8\x85\x02\xf2\xca\xf4\x4e\xc3\x57\xe3\x99\x92\x1d\x44\x4c\xb8\xa0\x64\x0b\xc4\xc6\xca\x0f\x5d\x7d\x88\xc2\x8c\x90\x44\x23\x08\x9e\x21\x1d\x5b\x50\x2a\xe0\x4c\x07\x0a\xb8\xf2\xcc\xa9\x13\x0a\x92\xf4\x7c\xa3\xb0\x4a\x11\x4f\xd5\xc7\x58\x7e\x06\xe4\x37\xe4\x90\x05\x53\x7f\x40\xbb\x26\x5d\x93\x8f\x97\x88\x56\x99\x57\x18\xa3\xda\x1b\x03\x34\xf2\x8e\x27\xdc\xd5\x81\xe0\xe7\xa8\x54\x32\x4a\x69\xb5\xb3\x82\x60\xa4\x81\x7d\x04\xe5\x71\x66\x0f\xad\x3b\x02\x6b\xd4\xad\x49\x6e\xfd\xfd\x75\x56\x68\xb4\x5a\x40\x09\xeb\x45\xb3\x86\x06\xb4\x6e\x80\x9b\x33\x02\xae\x31\xa0\x1d\x21\x26\x54\x73\x97\x15\x89\x62\xba\xad\x3c\x91\xc8\x28\xfb\x07\xb4\x8e\xae\x19\x24\x5a\x66\x8e\xe0\x40\x21\xd1\x23\xb7\x8a\x1f\x16\x85\xc7\xfa\x13\x1d\x10\xbc\x72\x03\x4a\x1b\x34\xd5\x40\x7e\x21\xc6\x86\xf8\xbf\x95\xe8\x00\xf0\x06\x2d\x06\x21\xf9\x4d\x27\xcb\xc3\x6b\xee\xc6\xbf\x35\x08\xb8\x13\xd7\x18\xa9\x80\x3b\x00\x65\x9c\xbd\x6f\x28\xf1\x09\x80\x66\xbb\x81\x6c\x2c\x70\x77\xc3\x49\x89\x00\x8a\xb3\x05\xd8\x23\xf3\x52\x08\x75\x2c\x47\xce\x68\x77\x73\xfe\x8c\xe9\x2e\x1f\x30\xdd\x45\xa4\x18\x7c\xd2\xd0\x01\x05\x50\x98\x97\x9b\x22\xe4\x5e\x97\xda\xed\xae\x7b\x3b\x96\x3d\x88\x87\x6d\xff\x7e\x73\xff\x18\xf2\x58\x5d\x3d\x17\xd9\x42\xad\x12\x28\x7f\xe8\xba\x53\xee\x4c\xf2\xb1\xb3\x0f\x1b\x17\xaa\x47\xaa\x1e\x88\xec\xee\xb0\xd2\xdf\x6e\x21\x74\x47\x05\xad\x10\xa1\x3c\xc3\x4d\xc4\x6d\x26\xa1\x1a\x71\x21\xd7\x60\x56\x5e\xab\x88\xbe\x64\xc5\x50\x1e\x4d\x6a\xbc\xbb\x00\xad\xc3\x98\xb4\x55\x2e\x06\xac\x84\xb4\x29\xb8\x08\x98\x3f\x16\x10\xe1\x72\x44\xae\x94\xbc\xc9\xda\x51\x28\xea\x4b\x60\x3c\x16\xeb\x63\x59\xfb\x87\xa0\x26\xb8\xcf\x05\xef\x90\x30\x5c\x1d\xd4\xdd\xb9\x31\x07\xaf\xb3\x17\xd8\xe2\x18\x18\xee\x94\xac\x9a\x0c\x27\x8b\xd5\xd7\x2e\xc6\xbf\x45\xfc\xd4\x6a\x1b\x15\x19\xb7\x37\x78\x28\x47\xc2\x3d\xc1\x7f\xc5\xde\xb6\x05\xa9\xd8\xa3\xd3\x63\xdc\x57\x55\x63\xa9\x5b\xb6\x8d\x53\xa1\xbe\xd0\x52\xe5\x56\x28\x0e\x92\xd0\x4d\x38\xc0\x46\xe5\xc5\x14\x4c\x2f\x5d\xdd\x60\x68\x2d\x53\xd5\x81\x7b\x94\x37\x4d\x20\x40\x50\x47\xc6\x32\xde\x05\xd0\x87\x13\x64\x4f\xac\x30\xec\x74\xc9\x17\xde\xc3\xf5\x77\xae\x96\x23\xf3\x15\x84\x5c\x2a\x01\x13\x07\xa9\x05\x6f\x8e\x8a\xd4\x3a\x4f\x22\xe6\x40\x28\xd4\x38\x01\x3d\x51\x43\x7c\xc6\xad\x6f\x10\x9d\xaa\x03\x05\xa2\xc8\x47\xb6\x9f\xc3\x8c\xde\x43\x6a\x46\xb9\x30\x2d\xb8\xc5\x09\x81\xf6\x40\x42\x97\xd1\x93\xad\xf9\xa9\xe5\x41\xab\xb2\x4a\x44\x6d\x7c\xbb\x19\x44\xd1\x51\x1b\xda\xd1\x93\x35\x5f\xc5\x5d\x17\x3e\x2d\x23\xbf\x53\x09\x5f\xf4\xd8\xc6\x46\xd9\xc2\xc2\x60\x3d\xa8\xab\x08\x5f\x9a\xaa\xc6\x2a\xd5\x92\xd3\xbf\x48\x52\x10\x38\x1f\x2e\x5d\xd8\x1b\x80\x27\xf5\xf3\x9b\x23\x05\x98\xf7\x7e\x3c\x42\x80\x61\x0e\x3f\x59\xbf\x00\x0e\x70\x17\x56\x08\x1e\x39\x14\x42\x1f\xcb\x1f\x75\xe9\xe2\x7d\x4e\x26\x20\x40\x48\x32\xed\x50\xfb\x22\xd1\xaf\xc2\xd5\x35\x04\xc2\xe6\xda\x50\xf9\xbb\x70\x18\x60\x9d\xe0\xb1\x8a\xe3\x68\x50\x5a\x54\x44\x82\x1d\x84\x2c\xe2\x5a\xa5\x47\x9d\x36\x08\xda\x3a\x3e\x16\x40\xa6\xa9\x91\xf9\x0d\x00\xea\xb1\x3e\x00\x8b\xe7\x0a\xad\x19\x3f\x95\x29\x08\xf9\xfa\x0c\xbc\x51\x58\xfe\xac\x0e\x0a\xe3\xe1\xe2\xe5\x22\x75\x67\x2e\x26\x2d\x01\x43\xef\x27\xb8\x9a\x04\xd4\xb3\x5b\x2d\x18\x0c\x0f\xd9\x38\x7d\xa8\xaf\xdc\x82\x43\x10\xde\x68\x47\x59\xc1\xf5\x68\x74\x57\x98\x52\x2c\x30\xca\x69\x97\xe5\xd8\x1f\xb5\xad\xfa\xc9\x60\x03\x81\x29\x20\x15\x77\x44\x7a\xb5\x4c\xe4\x47\x5d\x16\x3a\x27\x5f\xc8\x5e\xf6\x8c\x70\x2d\xda\xe5\xc8\xd2\x84\x5c\xc6\xc1\x25\x52\x36\x45\xe5\xd0\xed\x29\x72\x43\xaf\x22\x43\x5a\x70\x7c\x2f\x73\x68\xc0\xfc\x6d\xeb\xe3\x61\x05\xe7\x46\xed\x76\xda\xe9\x03\x8f\xa2\xb7\xc5\x10\x6c\x51\x97\x2a\xcd\x96\x75\x8c\x8c\x16\xb5\xe0\x9a\x95\x63\x8f\x36\xbb\x32\x43\x1c\x5b\xdf\xdd\x03\x4f\xa6\x2c\x9d\x5b\x52\x15\x69\x97\x6e\x09\x36\x85\x75\xfc\xfb\x31\xbd\xa1\x8a\x8a\x43\xe1\xf6\x71\xf6\x32\x5a\x18\x5c\x6e\x5f\x06\xed\xad\xf9\x35\xf8\x21\x48\xf0\x21\xdb\x11\x96\x38\xc9\x37\x14\xe2\x7b\x1f\xca\xc5\x80\x1d\x5f\x59\x94\x14\x77\x93\x81\x86\xe8\x47\xaa\xb3\xaa\x2c\xd5\x27\x8b\xc3\x89\xfd\x7f\x78\xb9\xac\xb2\x62\x9d\xeb\x20\xcf\x8d\x23\x43\x59\xe1\xcc\x5d\xe7\x65\x41\x19\x9b\x5c\x1c\x44\x17\x75\xaa\x5d\xb7\x12\x74\x2a\xb9\xbb\x24\x8e\xfa\x82\x8a\xa1\xb4\xa7\x78\x50\x0f\xf6\xce\x0a\x2a\xdb\x56\x41\x36\xa9\x3b\x62\x6b\xfc\x7b\x6c\x1e\x07\xa1\x41\xd5\x03\x9d\xf0\xb3\x6f\x01\xdf\x9b\x47\x4c\xdc\xf6\x9c\xf8\x1e\x0a\x6f\x7a\x50\x9b\xdd\x82\x71\x67\x2e\x36\x45\x5c\xc0\xed\x13\x22\xdd\x59\x50\xf1\x75\x8f\x3d\x2b\x7a\x0b\x52\xda\x4e\x29\x56\xe4\xbc\x79\xd8\x93\xea\x9d\x14\x3d\x6a\xa5\x96\xd4\xf2\x48\x71\x2c\x91\xd5\x9f\xcd\x2a\x43\xfa\xf6\x97\x5d\x4e\x9e\x2a\xe1\x85\x1b\xb9\xca\xe8\x48\xb8\xe3\x66\x4d\xce\x60\x2d\x42\x45\xee\x96\x70\x28\xc4\xef\x62\x7a\x1d\x4c\xfb\xa0\xe5\x9b\x04\x9c\x84\x18\xf9\x84\x49\x25\x32\x0c\xf5\x45\x89\x0f\x41\x9c\xea\x11\x7a\x97\x93\x86\x1e\x54\x45\x08\x40\xa8\xba\xd6\xdb\x5d\x1d\xc8\x53\x6d\xc4\x5f\x36\x10\xbb\x8e\x77\x26\x43\x79\x14\x48\x1e\x11\xe2\xea\x06\x78\xbb\x61\x47\x76\xdf\x08\xdd\xf5\x43\x91\xf8\x1e\x14\x5d\x4c\x5f\xc1\x70\x18\xc9\x00\x6e\xaf\x43\x2f\x94\xa4\xb3\xca\xc5\x67\x90\x72\x2b\xe3\x2c\x40\x44\x4f\xa4\x54\xc0\x83\xd8\xb8\x43\x21\x7e\x18\x3a\x62\x98\x80\xb0\x09\x82\xf4\xd6\x4a\xd9\xd5\xed\xa4\x69\x66\x7d\x58\x67\x2e\x40\x81\x0a\x42\x1e\x46\x57\x6f\x41\xf4\xd5\xd0\x71\x4d\x94\xcc\xf6\x4b\x71\xc3\x0f\x39\x4c\x9d\x5d\x11\x41\x29\x5f\x56\x57\x9d\x1c\x1f\xb7\xd7\x29\x3e\x5b\x25\x9c\xa7\x4d\xb6\x60\x02\xd5\x5c\xed\x19\x02\x83\xab\x40\xba\xb3\x89\x2a\x7e\x16\x5c\x62\x48\x54\x49\x1d\x40\x5b\x16\x59\x46\x9d\x7d\x38\x2b\x8f\xde\x3a\xd3\x84\xa3\xc0\xe0\xeb\x19\xbd\x3f\x22\xb5\xab\x21\x9d\x6d\x9d\x7c\x88\x86\x12\x8e\xcc\x97\xf4\xd6\xe0\x88\xdd\xf0\xdb\xf5\xf8\x41\xfd\x82\x04\xc4\xb4\xa1\x10\xa7\xcf\x43\xf8\x55\x2c\x99\x7d\x2c\x39\xf9\xf8\x84\xb1\xc8\xc2\x83\xad\x46\x47\x87\xc4\xbe\x0a\x30\x58\x83\xae\x62\xd7\x1b\x8b\xc8\x7a\x82\xa1\x06\x22\x12\x09\x77\x84\x65\x8c\x38\xe0\xae\xd5\x08\x7e\x99\x7b\x18\x44\xbc\x7a\xb1\xe2\x0a\xf8\xee\x18\xe4\x34\x36\x5d\x0a\x59\x7f\x39\x6b\x5d\x56\xb4\xcf\x13\x01\x80\x50\x22\x1c\xc1\x4b\xed\x1e\x05\xc8\x78\x18\xdc\x0a\x72\x77\x74\x15\x44\x19\xa5\xd3\xd3\xa1\x9c\xac\xc8\xa8\x75\x80\x8b\x4b\xee\xa9\x34\x4d\x59\xcb\x9f\x9a\x74\x8d\x5c\x5a\x50\x09\x11\x14\xa1\x50\x83\x7c\x56\xac\xac\xe7\x42\x38\x97\xa5\x43\x85\x34\x34\x7f\xe8\x4b\x3d\x6a\x31\x24\xf3\x77\xab\xaa\xd1\xd5\x71\x12\xa1\xe2\x96\x9a\x16\x12\x2a\x63\xac\x18\x1d\x71\x88\x17\xd8\xa5\xec\xa8\xa0\x05\x2a\xc0\x13\x8d\x60\xfa\x8e\x03\xba\x3b\xb0\xe6\xe0\xfc\x3f\x46\xf8\x0e\x31\x63\x3a\xd4\xfa\x97\xa5\x35\xf4\x00\x82\x88\x45\x2a\xfa\xae\xe8\x44\x03\x03\x1b\x31\xb4\x91\xb8\xb3\x07\x33\xb1\xd6\x50\xdb\x36\x79\x8d\x98\xcc\x39\x96\x1d\x8b\x10\x0c\xb2\x47\x4d\xc3\xe9\x75\x8b\xb9\xd3\x65\x8d\xf7\x7b\xf0\x35\x4a\x4b\xa8\x4a\xc4\x7b\x78\xe8\x65\xd5\x8d\x6d\x2c\xa8\x12\xc6\xde\x8e\x10\xfb\x45\x89\x16\xf8\xc1\x1e\x00\x2c\x20\x8b\x83\x01\xe3\x90\xf9\x3e\x3c\xe5\xdd\x5c\xad\x58\x1c\xa8\x82\xc6\x1e\x0d\x7b\x6f\x71\x1d\x3d\x55\x5a\xbb\xf8\xbc\x41\x6e\x10\xfa\x57\xbd\x29\x21\xf3\x75\x30\x8d\x4f\xbc\x60\x17\x03\x81\x7b\x59\x51\xc8\x53\xb7\xba\x60\x99\xbb\x18\x70\x78\xd5\xc1\xc7\x16\x14\x6c\x5a\x95\xf6\xde\xe2\x9a\x2f\xf4\xf0\x1e\x19\x3e\x66\xa7\x3a\xa9\xe8\xa0\xea\x2c\xab\xe4\x46\xe7\xe9\x67\x31\x97\x8b\x83\x08\x51\xa5\x82\x36\x69\xf4\x1e\x17\x2a\xf7\xaa\x5c\x87\x8f\x0f\x20\xc7\xb0\x34\x0a\xab\x12\xc3\x4f\xf9\xda\xca\xde\x2f\x78\xe6\x91\x76\x7b\xf6\x24\x2a\xac\x0b\x90\x46\xdb\x95\x75\x59\x01\x11\x46\x02\x31\xe2\x43\x1f\x20\x65\x40\xe5\xba\xf7\xcc\x74\x59\x1f\xa8\x46\x0e\x8a\xf2\x18\x09\x89\x2b\xf2\x3c\xb6\xf4\xca\xb7\x99\xe1\x27\x5f\x89\xe8\xe5\xdc\x7f\x5a\xd9\xd9\x05\x23\xe4\x5a\x7f\xba\x4b\xed\xa4\xd7\x65\x80\x4d\x0d\x2d\xd4\xbe\xfd\x3e\xdc\x63\xf2\x75\x5d\x11\x65\xc8\x32\xb6\x60\xf2\xfd\xa0\xf3\x1d\x08\xe4\xec\x7a\xbd\x83\xf9\x62\x5b\x30\x18\x2b\x10\xc0\x01\x2c\x5b\xd3\x60\xae\x8e\x5f\xe2\x00\xc3\xf7\x59\xaa\x65\xc9\x94\x82\x3c\x20\x11\xba\xf9\x2c\xec\xa0\xb7\x68\x70\x19\x06\x78\x51\x26\x8a\x10\x51\x24\x8c\x91\x52\xbd\xac\xc0\x2f\xbd\xa2\xdc\x62\xb3\x73\xac\x01\xd0\x50\xf9\x55\x6a\x0a\x5c\x7e\x82\x63\xcb\x56\x12\x6e\x4a\x59\x6d\x40\x62\xac\x39\x88\x98\x64\x22\xd2\x60\xb4\x78\x3c\x3e\xaf\x8a\x68\x90\xd8\x19\xeb\xda\x25\x49\x09\xa2\xfa\xc6\x28\x10\x66\xa0\xb8\x5a\xea\x01\xa9\x86\xaa\x31\x3b\x50\xfb\x96\x9c\x61\x7b\xf6\x14\x19\x59\xe8\x3c\xd3\x77\x8e\x48\x52\x89\xd6\x55\x85\x77\x6a\x55\xf7\x14\xec\x9f\xbe\x70\xe9\x9a\x76\x1f\xd7\x57\x31\xbf\x77\x60\xb4\xfb\x0c\x6e\x00\x70\x20\x00\xf7\x10\x42\x0c\x14\x90\x59\x38\xc9\xb7\x0b\xb9\x38\x44\x6c\x91\x2e\x2c\x4a\xec\x0c\xce\x28\x71\x1f\x12\xd4\xfb\x6a\x55\x22\x04\x00\xe2\x86\xa6\x9e\xcb\x00\x12\x8f\x69\x8a\xd1\x05\x2b\x02\x59\x2d\xd7\xda\xac\x4b\xb5\xdb\x58\xbb\x28\xf6\xb0\x83\xbe\x41\xa0\x65\x4a\x3d\x16\x8a\x9b\x8a\x4f\x3a\x44\x5f\x45\xd6\x08\x02\xa4\xc4\xc6\x31\xec\x5e\xd8\x1a\xa8\xa4\xe1\x85\x40\xb5\xd1\x54\xf4\x02\xe0\xd5\x2e\xe8\x24\x13\x4e\x81\xaf\xf4\x0c\xd9\x5e\x39\xbc\xe3\x11\xa1\x2b\x2b\x92\x1c\xea\xa5\x0c\x02\x77\xfb\xb7\xf7\xf4\x6b\xac\x3a\x78\x08\x88\x10\x43\x2a\xd4\x5f\x55\xea\xbb\xac\x42\x50\x76\xbb\xe1\x85\xde\x73\x4c\xda\xe1\xa2\x3d\xde\x71\xdf\x85\xf5\xc5\x22\xa0\xe8\x49\xf6\xf8\x88\x85\xb6\x37\x7c\x96\x23\xa6\x78\xb5\xcb\xca\xcc\xc1\x23\x71\x2a\xc0\xc1\x3a\x2d\x9a\x9a\x52\xe8\x10\xc8\x05\x08\x9d\x5a\x65\xd0\x49\x4f\x1d\xc7\xc2\xbe\xc2\xa1\x37\x61\x31\xf3\x52\x97\x90\x41\x05\x33\x3b\x88\xc2\x63\xbd\xa4\x82\x6d\xcc\x8a\x75\x93\x55\xe0\x2a\xf1\x27\x10\x57\xc1\x1d\x05\x67\xe2\x32\xab\xa5\x50\xad\x8f\x76\xea\x67\x51\x55\x06\xd5\x93\x74\xd3\x0e\x00\x41\x24\xe4\xfb\x1e\x24\x22\x02\x20\x74\x8d\x5a\x12\x5b\xf3\x59\x5f\xf7\x3a\x23\x74\xb4\xb8\x0b\xc0\x51\x88\x97\x7c\x4d\x44\xaf\xf2\xa8\xcd\xdc\x59\xfe\x90\x4c\xf0\xd4\x45\xd4\x5f\xe8\x71\xe5\x0f\x81\x23\x11\xaf\x84\xcf\xf9\x2f\x37\x86\xad\x7b\x1e\x17\xa4\x2b\x9f\x3e\x08\x21\x4e\xbf\x71\x06\x23\x97\x87\x06\xc7\x02\x8c\xf5\x4e\x1d\x07\x64\x7e\x02\x44\x19\x87\x9f\x81\x95\xf9\xd1\xc9\x6d\xdb\xd1\x45\x4f\x52\x06\x8a\xfa\xcb\xac\xd6\xf1\x1d\x21\x08\xa6\xd0\xda\xef\xde\xa5\x46\xe3\xd0\x5d\x04\xee\xc6\x0c\x75\x5d\xdf\xb4\x45\x88\x95\x1b\xbd\xed\xa1\xd5\x79\x05\xe0\x99\x66\xab\xed\x21\xab\xf0\x4a\x70\x01\xf6\x4a\x70\x65\xd1\x50\x4e\x9b\x12\xae\xb1\xca\xa1\x9e\x2d\x08\xd5\xdb\x0d\xa5\xde\x1b\xb9\x36\x90\x8c\x58\xe1\xd9\x2b\xef\x42\x4c\x14\x51\xd5\xaa\x6e\x10\x83\x27\xcf\x83\x58\x00\xfc\x8a\xb1\x5c\x63\x3c\x4a\xb4\x38\xb6\xc6\x19\x1c\xc4\x81\x4c\x85\x10\x74\x95\xb8\xaf\x10\xbe\x7d\x7e\x40\x4e\x96\xab\x29\xb3\x65\x7d\x10\xe2\xf4\xdb\xa1\x7c\x3d\x3e\x1b\xdd\xce\xc7\xc0\xef\x74\x39\x79\x3d\x1b\xcd\x3e\xc8\xc9\x9c\xe1\x8a\xcf\xe5\xc5\x6c\x0c\x74\x51\x67\x6f\x47\xb3\x37\xe3\xc4\x7e\x6e\x36\xb6\x9f\x08\x9e\x24\x2f\xa6\x33\x11\x3c\x20\x69\x31\x67\x5d\x8f\x67\xef\x26\x37\x37\x7d\xd4\x59\x8e\x6b\xeb\xfd\xdb\xf1\x95\x27\x3f\x13\xf3\x9b\x91\xfd\xbc\xe7\x68\x83\xe7\x9d\x4d\xaf\x3f\xcc\x26\x6f\xde\xde\xc8\xb7\xd3\xcb\xf3\xf1\x0c\xe0\x26\xbe\x72\xb4\x64\xcc\xec\x76\x3d\x9b\xfe\x38\x39\x8f\xe6\x24\x06\xa3\xb9\x9c\xcc\x07\x8e\x49\xcd\x8d\x3d\x20\x6c\x4b\xe4\x78\x02\x0f\x22\x8e\xb6\xf1\xb9\x9c\xce\x3c\x4f\x9b\xe7\x63\x13\xaf\x6f\x6f\x80\x53\x0c\xf8\xd8\x80\x5d\x0e\x56\xa6\x87\x91\xcc\x3e\x9f\x49\xd9\x46\xc8\x9d\x05\xd0\x17\xc4\xcb\x26\x1e\xe2\x65\x1b\xe2\x02\x5e\xdd\x4c\x66\x63\x39\x9b\xcc\xff\x8b\x1c\xcd\x79\x59\xff\xf9\x76\xe4\x9e\x73\x3d\x9e\x5d\x4c\x67\xef\x46\x44\xb4\xd6\xda\x46\x3b\x5b\xe0\x3b\x93\xf3\xb7\xd3\xdb\xcb\xf3\xe8\xef\x76\x99\xc6\xc4\xe5\x36\xf9\x71\x9c\x00\x3d\xd9\x68\x3e\xbf\x7d\x37\x16\xb8\xda\x73\x20\x11\x1b\x5d\x5e\xca\xab\xf1\xd9\x78\x3e\xb7\xdf\x9a\x8f\x67\x3f\x4e\xce\x00\xcf\x63\x36\xbe\x1e\x4d\x80\xcc\xed\x6c\x3a\x9b\x8d\x81\xb3\xcd\x2a\x97\xef\x86\x32\x24\x44\x23\x6e\xbe\x87\xf9\xd3\xec\x13\x3c\x4d\x9f\xdf\x73\x01\x54\x6a\x76\x77\xda\x1b\x0f\x7c\x73\xf6\x0f\x7e\xe3\x3f\xc8\xf7\x6f\xa7\x40\xf6\x06\xa8\x22\x1f\x58\x34\x66\x63\x07\x3b\x32\x0e\x85\xd4\xae\xa7\x17\xcc\xd1\xeb\xa9\x5d\x81\x0e\x5b\x9b\xdd\x1e\xa2\x38\x0b\x04\xc0\xbe\x5a\x10\xc0\x77\xe2\x58\xdb\xa4\x67\x6d\xc3\x35\x09\x78\xdb\x1e\x26\x68\x03\x42\x36\x61\xe5\xec\x8a\xe5\xe3\x66\x2a\xdb\x47\xf2\xc8\xbf\xbb\x2b\x7b\xf2\x72\x3a\x07\x41\x3b\x1f\xdd\x8c\x04\x8c\xf8\x66\x24\x5f\x8f\xed\xa7\x67\xe3\xab\xf3\xf1\x0c\x8e\x12\x92\xf5\xdd\x00\x11\x9c\xfd\xc6\x78\x2e\xe7\xb7\xf3\x9b\xd1\xe4\x0a\x37\x05\xd8\xe9\x66\xf2\xe6\xed\x64\x76\xce\x67\x49\x80\x78\x5e\x8c\x26\x97\xb7\x33\x47\x1b\xc7\x83\xba\x99\xca\xe9\xf5\x18\x1e\x09\x82\xe6\x37\x64\x3e\xbd\xb8\x79\x3f\x9a\x8d\x8f\x3d\xbb\xdc\xfc\xf6\xec\xad\xc0\xdd\x93\xd1\x89\xfd\xf0\x14\xbe\x39\xd9\xe1\x9b\x1b\x5f\xe1\xe7\x7a\x50\x67\xa0\x46\xd9\xea\xf9\x11\x38\x9d\x18\x50\xbd\x81\x7b\x1e\x39\x45\x4a\x79\xa5\xf7\x74\xb1\x59\xb3\x43\x30\x93\x3a\x62\xa3\x61\x53\x8b\x4f\x26\x51\xdf\x37\x03\x07\x93\xfd\x4f\xd7\x23\x62\x46\x05\x68\x60\xa2\xf1\x4c\x4c\xe8\xc1\x01\xae\x23\xd4\x97\x6c\x35\xb2\xa6\x10\x96\x4c\xac\xdd\xc1\xd4\xd0\x8c\xc6\xbe\x54\x85\x88\xe2\x96\x1e\xc5\xdb\x63\x57\x43\x70\x15\x3c\x00\xb4\x93\xed\x73\x5b\x61\x10\x30\xe0\x45\x08\xcf\x7a\x64\xca\x44\x42\x4f\x51\xa1\x10\xe0\x32\xe9\xef\x39\x7e\x10\x72\xce\x71\x88\x21\x1e\xaa\xeb\x93\xe2\x57\x24\x52\xd5\xb5\xa2\xe4\xad\x37\xb7\x5c\xe7\x52\x84\x32\x0b\x90\xee\xd6\x27\x53\x2b\x5d\x01\x57\xab\xff\xf2\x96\x3f\x5b\xd5\x54\xdf\x0c\xf5\x78\x94\x83\xc6\x02\x68\x83\x48\xec\x21\x5e\x27\x52\xbf\x8b\xda\x53\xc1\xa2\xe5\x17\x63\x09\xc0\xa3\xe0\x19\x84\x8c\x8a\x55\x02\xbe\x9c\x43\xcb\x81\xb3\x2f\x06\x02\x6a\x74\xd1\xd1\xdc\x19\xf0\xab\xa0\xdc\xdf\xb1\xd4\x42\x02\x82\x12\x5e\x59\x25\x57\xd6\xa2\x18\x0a\xf1\x0f\x50\xbb\x03\x5f\x0e\x6b\x42\x72\x87\xf5\x50\xa8\x2d\x07\xd8\x64\x96\x6a\x85\xcd\x87\x88\x19\x07\x70\x12\xf2\x1f\xdb\xcc\x00\xff\x00\x55\x26\xf2\x1f\xe5\x3f\xe0\xb7\xad\xfd\x80\x6c\xf5\xff\xe8\xd0\xd9\x9d\x1b\x19\x09\xd9\x2b\xd7\x53\x15\xc9\x16\x5a\xd1\x01\xe6\x6d\x56\x7b\xc1\x89\x45\xe2\xb3\xc0\x9c\xd0\x26\xda\x67\x8b\x8a\x5e\x6b\xcb\xc3\xdc\x30\x2d\x82\x8c\x58\x8a\x34\xe4\x92\x8e\x62\xbc\x85\x63\xd1\x31\xc2\x87\xdd\x99\x87\xa1\x0d\xf2\xe5\x36\x66\xa7\x1d\x22\x1f\x1b\x6d\xd8\x31\x85\xce\x10\xd9\x07\xc2\xea\x32\xb6\x11\x5e\xb9\xb2\x74\xaa\x85\x47\x3e\x78\xe8\x28\x66\xc4\x07\xb3\xea\x5c\xf3\xa6\x7c\xc2\x2d\x3f\xd7\xfa\x89\xcb\x8a\x9c\x03\xa5\x16\xe8\xa1\x71\x01\x6b\x28\xbb\xfd\x55\x31\x4f\xd9\xb2\xdc\x14\x6b\xe1\x63\xf3\xb4\x88\xaf\xac\x37\x5c\x98\xfa\x89\xa6\x33\xb2\x51\x24\xf2\xdb\x53\xf1\x1b\xd9\x28\x00\xf2\x18\x82\x0b\x08\x9f\x8e\x70\x44\xa6\x90\x1b\x54\xe8\x44\x58\x03\x42\xbc\x38\x20\xad\x62\x69\x8a\x6c\x49\xd0\xc7\x3b\x80\xb4\xce\xf2\x78\x6d\xa0\x4a\x7a\xad\x49\x82\xf4\x76\x97\x9b\x83\x2e\xe5\x11\x77\x0e\xba\xae\x70\x72\x69\xb6\xba\x3c\x96\x88\x66\x5e\xca\xca\xfa\x5b\x39\x50\x33\xa9\x02\x10\xbf\x21\x2b\x28\x55\xa0\x1c\x02\x34\x94\x41\x40\x9b\xe4\xeb\xda\x1c\x07\xdc\x50\xbe\xd5\x25\xb4\x97\x28\x59\x41\xa4\xfb\x15\xaa\x62\xf8\x8a\x3d\xcc\xd5\x4b\x3b\xf6\x83\x49\x0f\x85\xe6\x05\xb5\x3a\x66\x71\x70\x6f\x41\x6c\xa3\x90\x22\xb3\xd6\x10\x78\xca\x0a\x11\x41\xac\xff\xcb\x45\x69\x16\xcf\xe4\x91\xc7\x1a\x80\xc1\xed\x09\xe2\xf5\x63\x61\x16\xd5\xb1\xa3\x42\x12\x8b\x83\xfc\xbd\x1d\x81\x9c\xa9\x22\x35\x5b\xf9\x56\x2d\x3f\xea\x12\x74\x18\xd6\x7d\x35\x25\xe8\x9a\x9b\x83\x3c\x33\xa6\x90\xff\x28\x13\x79\x2a\x47\xbb\x32\xcb\xe5\xe9\x0f\x3f\x3c\x17\x82\xfe\x92\xc8\xeb\x52\x57\x19\xa3\x11\xfc\x98\x2d\x81\x40\x43\xd5\xcf\x1c\x2c\x13\xe2\x46\x82\x03\xff\xbf\xfc\xe7\x61\x17\x1a\x7e\x75\x76\x76\xf2\xfa\xc3\xc9\x7c\x74\xf2\x62\xf8\xfc\xaf\x42\xff\xf3\x19\xfe\x9f\xaf\xbf\x7e\xf1\x7d\x87\xff\xe7\xc5\xd7\xdf\xfc\x9d\xff\xe7\x6f\xf1\x5f\x87\x68\x6b\x54\x3b\x4b\xec\x64\xbe\x51\xa5\x1e\xe5\xd9\x47\x2d\x5f\x0c\x9f\xcb\xb3\xd9\x78\x04\x44\xce\x67\xd3\x77\xef\xa6\x57\x73\xeb\x44\x5d\x4f\x67\x00\x86\x28\x27\x73\x01\x9c\xd5\xe0\x1e\x5d\x4c\x66\xef\xc0\xc4\x3d\x9f\x02\x05\xf9\x8d\xf3\x70\x91\x45\x1a\x5d\xb2\xf1\x7c\x18\x23\x2c\x12\xff\xb3\xa3\x1e\x72\xdf\x86\x37\x8f\xe5\xe8\x4a\x8e\x6e\x6e\xa6\xb3\xab\xf1\x87\x93\xb3\xcb\x09\x72\x5c\x5f\x22\xab\xf9\xdb\xc9\xf5\xb0\x3b\x42\x7a\xed\x5c\xc0\x73\x27\x57\xe0\x79\xe2\xbb\xae\xec\xe3\x06\x40\x97\x3e\x90\xaf\x47\xf3\xc9\xbc\xe7\xfb\x8e\x43\xdd\xfb\xc7\x62\x36\x7e\x33\x9a\x9d\xb3\x87\x1f\x3e\x93\xde\x76\x9e\xe0\xdc\x27\xf3\xb3\xcb\xd1\xe4\xdd\x1c\x3c\x34\xbc\x61\x03\xef\x4c\xce\xc6\xf3\xdb\x4b\xf0\x1a\x2f\x66\xd3\x77\x72\x72\x33\xb7\x4e\xd4\x50\xb0\xad\x2a\x3c\xa9\xfb\xd1\x68\x6e\xdd\x5e\xf4\x7b\xc6\x97\xd3\xf7\xc7\xd6\x57\xe6\xd7\xc9\x5b\xeb\x31\xc1\x68\xd0\xb9\xe0\x75\x6c\x4f\x47\xc4\xd4\x4e\xf2\x68\x70\x76\x76\x7d\x39\xb0\xde\xcd\x80\x7e\x37\x38\x1e\x3a\xa2\x6d\x7a\xc7\xcd\xf8\x8c\x22\x21\xde\xa9\x45\x57\x55\xa0\x4f\xd4\x0e\x90\x58\x4b\xa4\xc5\xd9\x4d\xde\xd3\xcd\x5b\xbb\x85\x73\x39\xba\xbd\x79\x3b\x9d\x4d\xfe\xd7\x60\xec\x31\xed\xb7\x7f\x93\x15\x27\x1c\xc7\xdb\xc9\x6b\xeb\x3e\x0e\x85\x78\xfd\x41\x8e\xff\x30\x9e\x9d\xa1\x63\x6a\x5f\x07\x9f\x75\xe1\x06\x78\xa3\x5b\x9d\xb7\xe3\x19\x87\x0a\xce\x20\x72\x63\x37\x07\xbc\x77\x79\x33\x15\xaf\xc7\xf2\xf5\xf4\xf6\xea\x9c\xc9\xf6\xe3\x15\xa4\x21\x0d\xc9\x8b\x24\xba\xf1\x37\x56\x14\xe6\xf0\x48\xfb\x7b\x7c\xb9\x38\x9b\x5e\x91\x6b\x8a\x11\xa7\x2b\x70\xa8\x27\xe7\x63\x3a\x21\xd3\x0b\xfb\x8d\x19\x8d\x62\x44\x9c\xf3\xe0\x23\xf6\xf9\x84\x18\xfe\x3a\x1d\xca\x73\x5f\xb9\x0f\x84\xc4\x83\x16\xc7\xb7\x07\xd2\xc4\xee\x5a\x2c\x31\x04\xeb\x40\x97\x99\x49\xa1\xfd\x0f\x0a\x06\xac\x63\x58\x6f\x4c\x6e\xd6\x07\x69\x4a\xa1\x8b\xe5\x61\x99\x9b\x9d\x4e\x33\x05\x4d\xb9\xbe\x7e\x15\xc9\x10\x91\xd0\x0f\x53\xbe\x88\xd9\xd4\x14\xae\xa1\xc0\x5a\x3b\x49\x68\x87\xa9\x20\x04\xce\x84\x21\x41\x56\x2f\xf1\xa0\x79\x50\x41\xca\xa0\x2e\x88\x33\xe8\xc0\x66\x44\x2f\xbe\x0c\xc4\x12\xab\x4a\x6f\x17\x39\xe6\x88\x4c\x80\x1b\x7a\xa7\x19\x1d\x67\x14\x34\x3b\x05\x64\xad\x42\xb5\x79\xd1\x23\xf6\xce\x00\xf5\xa6\xc3\x66\x2c\x8f\x54\x25\x5d\xdf\xa5\xce\xcd\xfe\x58\x38\x08\x36\x4c\xa9\xf6\xe1\x5d\x2d\x86\x72\xd0\x7a\x52\xbc\x4d\x54\xbb\x03\x44\x88\x75\x40\x15\x1d\xff\x42\x15\xa9\xab\xd9\xd5\x27\x40\x15\x01\x85\x83\x76\x89\xc2\x8d\x0e\xa0\x30\x13\xb9\x6d\x08\x18\xae\x84\xdc\x29\x92\x9b\xa5\xa5\xb2\xb6\xe9\xaf\xf8\x19\xb1\xc2\xca\x1a\x95\xf3\x6f\xe4\xd6\x20\x6c\x56\x86\x3d\xa1\x01\x8d\x46\x43\x9c\x2a\xd6\xb3\x5e\xdb\xad\xa8\x5d\xe5\x37\x3e\x4c\x2d\xca\x0c\x6b\x5d\xb0\x1e\x45\x17\x15\x3d\x34\xaa\x68\x81\x22\xc6\xae\x94\x51\x57\x6f\xa9\x97\xaa\xaa\x13\x81\x38\x76\x40\x44\x84\xdf\x4f\xd5\x0e\x6a\x53\xa9\x3a\x91\x80\xc1\x7b\xf7\xb9\x4b\xb4\xfd\xf4\x7d\x6e\x6d\x6a\x77\x4f\x2f\xe8\x03\xea\xce\x64\x29\x17\x1c\xa4\xa6\x59\xd4\x49\xe0\x53\xbf\x77\x6d\xa0\xbc\x0d\x50\xed\x5d\x65\x0c\x26\x01\xeb\x29\x82\xf5\x84\x60\xc1\xa1\x58\x6e\xac\x5b\xf0\x6b\xd4\x49\xc8\xa7\xb0\xce\xb6\x3a\x3d\x01\x02\x51\xc7\x4c\xab\xe4\xd6\xdc\x01\xa3\xeb\x56\xad\xb5\x3c\x1a\xc0\x33\xb2\x62\x3d\x38\x76\x6e\xe2\x17\x4e\xb8\xdd\x37\xbf\x1c\xca\x01\x93\xac\x0e\x02\x30\x54\x4f\xfb\x2f\x99\xf5\x9f\x3a\x1f\x98\xf0\x3b\x66\xac\xaf\x37\xcc\xe3\xdd\x3d\x28\x08\xa9\x97\x0e\xe5\x60\xca\x89\xde\x11\x04\x06\x3e\xfb\x42\xe8\xad\x82\x50\x56\xea\x5e\x88\x9c\xcd\x83\xf0\xb8\xd5\x61\xa7\x20\x94\x95\x30\xb6\x00\x91\xad\x6d\xb2\x1d\x8e\xbb\x8b\x81\x21\xba\xe3\x5d\x0d\xe5\xe0\x83\x69\xdc\x61\x2e\xfa\x07\x47\xd5\x69\x10\xdd\x7a\xa8\x3a\x95\x6a\x51\x5d\x93\xf7\x5d\x86\xe5\x4d\x77\x99\xc9\xdd\xac\x7a\xd7\xad\x4d\xf8\x2c\x78\xfe\x70\x62\xf8\xb1\xce\xb7\xa6\x6a\xde\xb0\xde\x33\x00\x04\x23\x12\xde\x10\xa5\xe9\xc1\x21\xcb\x54\x57\xbb\x0c\xa0\x2c\x79\xc0\x34\x5c\x8c\x67\xac\x9d\xc4\x68\x39\xc6\xc2\x90\x2a\xdc\x08\x1f\x59\xdb\x64\xeb\xcd\x49\xae\xef\x74\xee\xd2\x87\x8a\x2c\x4f\x7b\x8e\x2b\x51\x81\xab\x8c\xf1\x98\x88\xfd\x99\x4b\x39\x5d\x84\xa4\xce\xea\xbc\x73\x5e\x5f\x86\x86\x6c\x22\xbc\x25\x8b\x40\x96\x17\x2a\x2b\xa1\x01\x6e\x46\x24\x62\x57\x54\x23\x4b\x6c\x32\x6e\x50\xad\x7a\x8b\x52\xa7\xcd\x12\x6a\x20\xb7\x59\x9d\x20\x17\x37\x31\xed\x00\xc7\x2f\x91\x15\x23\xd9\x32\xae\xf2\xca\xbe\x0a\x48\xea\x90\x98\xaf\x52\xb9\x27\xc7\x0d\x52\xf9\x95\x27\xc9\x83\x00\xe0\x9d\x67\x42\x5b\xc5\x52\x2c\xcd\xbe\xd0\x65\x1f\x8a\xb3\x7b\xae\xf0\x4c\xf5\xf6\xf7\x15\xa2\x45\xf1\xd6\xbc\x29\x55\x51\x0f\xe5\x3c\x2a\xd4\xec\xcf\x2b\x77\x2a\xfe\x78\x2f\x04\xb9\xf8\x54\x4f\x0c\x75\x96\xf6\x68\xe5\xe9\x3e\x4b\x75\x12\x15\xba\x21\x39\x84\x9b\x17\x50\x0d\xec\x34\x30\x7e\x1f\xad\x0c\x86\xec\xd2\xa6\x8c\x74\x5f\x30\x01\x37\xc5\x63\xcf\x5c\xe2\xa5\x35\xac\xfe\xcc\x0a\xe1\xef\x4e\x04\xcc\xe4\x6b\xfb\x25\xd8\x4e\xb0\x85\xdc\xf4\xe9\x4f\x4d\x2b\x9b\x1c\xe8\xde\x9a\x3a\x7c\x31\x92\xd5\xbe\x5e\x08\x25\xa1\xf7\xa9\x50\x9a\xe1\x1f\xea\xc4\xb5\x65\x89\x54\xaf\x58\x09\x2e\x60\x78\xa8\xd2\x88\xc8\x8c\x9f\xd9\xd2\xdd\xf6\x3b\xcb\xa1\xec\x67\x26\x2c\xe5\x6e\x63\x0a\x83\x37\x8c\xdd\xc0\x84\x5b\xab\x29\xb8\x9f\x1f\x12\xee\xbf\xf3\xbf\x11\x01\x70\xa4\xfb\x2d\xd4\x61\xc3\xe1\x85\xba\xd6\x34\x5b\x67\x35\x90\x68\xa5\x99\x41\x9b\xc3\xd5\x8f\xfb\x15\xa3\x8a\x19\xd1\x33\xfd\x9e\xa9\xa7\xff\x53\x4d\xa3\xbd\xce\xee\x82\x42\xae\x8c\x27\xdc\xff\xfb\xc7\xee\xff\x97\x42\x64\x43\x79\x8d\xc3\x83\x47\xcc\xe0\x94\xd8\x09\xdf\xc2\x69\x7e\x9d\xab\xe2\xa3\xae\x1d\x63\x65\x40\xd7\xbf\x57\x90\x66\x8f\x34\x84\x08\xb0\xf4\x60\x69\x3d\xa8\x83\xbf\x96\xb0\x42\xf4\x2e\x53\xe8\x11\xb8\x77\xd3\x99\xa9\xcc\x32\xd3\xf5\x41\x1c\xe9\xe1\x7a\x28\x47\xf3\xb3\xd1\x75\x22\x5f\xbf\x9b\x24\x72\x3e\x9e\x8f\xce\x8e\xf9\x28\x33\x63\xa2\xcf\x12\x45\x4f\x33\x25\xff\x96\xd6\x57\x84\x7f\xc5\x87\xef\xf5\xc2\x1a\x79\xc7\xa1\x7d\x33\x14\x22\xcb\x86\xf2\x1d\xf6\x0e\xdb\x05\x9b\x79\xc6\xf7\x79\xad\xea\xa6\x36\xe5\xc1\x2f\xd4\xbf\xf7\x8a\xc0\x36\xb5\xd6\x02\x41\xbf\x5c\xe7\xa8\x5a\xeb\xa2\xa6\x29\xbc\x05\x6c\xde\x0b\xf3\x8b\x1c\xad\xad\xff\xd4\x59\x1e\xa8\x73\xf4\x92\x8b\x89\x2f\x3c\xd3\xae\x79\x14\x1d\x8b\x01\xf4\x8c\xb9\xea\x9f\xe3\x56\xab\x58\xd2\x2a\xa4\xc7\xfe\xe7\xbc\x32\xd0\xb5\x87\x16\x04\xdb\x3f\x8b\x83\x3c\xfd\x5e\xde\xce\xcf\x3c\xd2\xf1\xe9\xb7\xbc\xca\xb7\x73\xe9\x93\x31\xa3\x65\x0d\x3d\x04\xb0\x68\xbe\x09\x36\x2b\xc8\xcf\xf8\xa9\x29\xb3\x8a\x1a\xf9\xaa\x63\x34\x78\xde\xe3\xb6\xd9\x1b\xed\x73\x7b\xf3\xc8\x21\x11\x7d\x46\x72\xc7\xbb\x78\x74\x73\x1d\x74\xa4\xf8\x72\x71\x3f\x69\x6d\x31\x6e\xe7\xdc\xbe\x7f\x4c\x68\xd7\xc7\x89\x78\x50\xd4\x59\x69\x3c\x4d\xa8\xdd\xde\x89\x07\xf7\x4e\x3e\xb6\x77\xdf\xf4\xed\x9d\x78\x70\xef\xe4\x03\x7b\x77\xe3\x7a\x99\x69\xf2\xe4\x6b\xf1\xd5\x09\x4a\x19\x00\x7e\x74\x9a\x61\xbf\x2f\xe6\x30\x2a\xb7\xae\x85\xd9\x03\xff\x22\x94\x92\x01\xed\x0a\xb0\x70\xa6\x58\x1d\x48\x48\xfc\xe1\x2b\x42\x84\x0e\x77\x16\x89\xba\xb0\x03\xd9\xad\x88\x87\x4b\x2f\x37\x05\x35\xa8\xb8\xc4\xc3\xc3\x77\x3c\x4d\xb7\x33\xe8\xa1\x18\xe5\x39\x7f\x0c\x3b\x12\xb8\x8d\x8d\xdb\x42\x22\x63\xb2\xd4\x9c\xa7\xc0\x42\x27\x20\xf9\xfe\x66\x28\x67\x41\xeb\x09\xce\x90\xf7\x8c\x1f\x93\x15\x6e\xb3\xbe\xa6\xe9\x67\x61\xd7\xdc\x56\xa5\x5a\x04\xc7\xd7\x0e\x92\x9b\x38\x28\xbf\xe8\x4d\xe1\xb0\xd3\x05\xad\x94\x0f\x1d\x98\xa0\xc4\x5f\x66\x74\x0b\x06\xbf\x21\x99\x4c\xbc\x0e\x86\x8f\x81\xc0\xe6\x07\xd6\xc3\x41\x98\xa1\xc8\x0f\x9f\xc3\xec\x46\xc3\xe6\x43\x0b\x77\x45\xb8\x34\x5d\xc2\xac\xd1\xb7\x45\x06\x4f\x9f\x69\xca\x71\x4f\x08\x9e\x18\x3d\xfe\xa4\xc7\x71\x81\x8a\x01\xc1\xb8\xf1\xa1\xb2\x0c\xfd\xde\x0f\x51\xdf\xef\x63\x0b\x20\x1e\x5f\x00\x5e\x9f\xb8\xe5\x08\x71\x00\x4c\x19\xf6\x1e\x91\xd3\x17\x98\x33\x18\x6d\x80\x74\x57\x68\xeb\x3f\xec\x99\xd1\xaa\x7c\x61\xa7\x12\x6c\x46\x3c\x3e\xdf\x34\x19\x5c\x95\x6e\x3f\xda\xa4\x05\x4f\x26\x2c\xe0\x8a\xee\x2e\x15\x02\xe8\xef\x0f\xbd\xbd\x2f\x4f\x92\x3e\xf1\xe8\xe2\xfb\x25\x75\x7d\xbd\x70\xea\x4d\x6e\xd6\x70\xeb\x6f\xb5\xaa\x1a\x86\xf5\x16\x0c\x0d\x4c\xe0\x0c\x71\xc5\x39\x87\x45\x94\xdc\xaa\xa2\x00\xe5\xdf\x47\x1b\xda\xeb\xc2\x7b\x8e\xa6\x50\x77\x05\xe5\xb9\x8f\x98\xef\xdd\x30\x22\x66\xe0\x11\xc1\x82\xeb\x62\xa9\x6b\xb3\xcf\xd6\x97\x0a\x9a\x85\x63\x3b\x80\x90\xe1\xb0\x44\x07\xba\x22\xaa\x3e\xbf\xac\x0f\x4c\xc9\xdb\x16\x7d\x43\x83\x50\x22\x43\x23\x01\x1c\x46\x11\x68\x3f\x16\xa5\xc4\x13\xd1\xc2\xf2\x51\xcf\x06\xa0\x49\x88\x52\x6f\xed\xf2\xb8\x68\x41\x67\x3e\xc5\x21\x00\x53\x02\x8e\xee\xe5\xc6\xbf\x83\x0e\x03\x47\x76\x04\x46\x76\xa0\x6d\x0e\xf8\xfe\xaa\x1a\x2a\xdf\xc3\x89\x74\x03\x55\xfd\x13\x11\x5f\x34\x11\xd9\x9e\x48\xeb\x1d\xe2\xcb\x26\x22\x7b\x27\x02\x51\xdf\xbf\x8e\xea\xee\x46\xef\x9e\xa8\xc3\xe3\x8a\x93\xce\x61\x70\x67\x05\x9a\xca\xdb\x91\x1b\x44\xaf\x09\x9f\x07\xc8\xb8\x9c\x32\x14\x9c\x32\xcc\xf8\x07\xaf\xb0\x42\x7c\xd2\x27\x3f\x9f\x5d\x90\x87\x33\x90\xbf\x57\x3b\x55\x1c\x0f\x3b\xf7\x92\xec\xdc\x4b\xe2\xcb\xee\xa5\x36\x30\x7b\x84\x74\x23\xa8\x11\x01\xe3\x5d\x95\x2e\x90\xaf\xd9\xdf\x65\xf2\x81\xbb\x0c\xea\xb5\xda\xa2\xf6\xf4\x7b\xed\x89\xd2\xf1\xc4\x7b\x8d\x9b\x68\xdb\x3e\x2e\x2a\xdc\xbf\xec\x8e\x93\xc1\x1d\x27\x1e\xbb\xe3\x5a\x66\xc5\xe7\xaf\x31\xf1\xa4\x6b\x4c\x3e\xed\x1a\x13\xbf\x79\xad\xa3\x6b\xcc\xaf\xa0\x78\xf2\x8d\x26\x3f\x7b\xa3\x89\x27\xde\x68\x9d\xed\xe8\xbb\xd1\x44\xeb\x46\x6b\xab\x8f\x9e\xe0\xcc\x23\x97\x9b\xf8\xc2\xcb\xad\xf7\x95\x84\x75\xf3\xa5\xf7\x1c\x44\xba\xb8\xda\xf5\xaf\x64\x0f\xa3\xd7\xde\x39\x18\xa6\xec\x44\xac\x92\x58\x76\x45\x20\xbb\x1d\xd8\x42\xe7\x42\x72\x2a\xcf\xd7\x52\xb6\x2e\x12\x7b\xf7\xa5\x59\x2d\x1c\x13\x87\x2b\x5c\x23\x94\x6d\x53\x52\x00\x8b\xdb\xd9\x01\x96\xe9\x57\xeb\x3d\x2c\xb8\x78\x94\xbb\x2b\x0a\xb5\xd5\x80\x8b\xb0\xab\x74\x93\x9a\xe2\xb0\x85\xce\x64\x17\x4e\x75\x8e\x6a\x7b\x10\xd9\xca\xf1\xe9\xbc\xf2\x81\x75\x11\x19\x5d\xd1\x47\xa2\xeb\xd6\xb3\x88\xc4\x37\x6f\xe0\x23\x88\x1e\x5d\x8c\x6d\xd3\x50\xa6\x66\x4f\x89\xbb\x71\x5d\x87\x15\xf7\x2e\x7a\x86\x3b\xc7\xce\x40\xd6\x01\x22\x2b\xc1\x85\x7d\x3b\x9b\x84\x86\xd8\x2a\x86\x73\x8c\xc0\x22\x0d\xeb\x7a\xc8\xa1\xf9\xda\xbd\x68\xd7\x5e\x51\xc6\x01\x1f\xa1\x98\x34\xb9\x63\xa1\x28\xda\x41\xe6\x66\x71\xc0\x0f\x3d\x56\x6b\xdf\xd9\x80\x8b\x2f\x91\x83\x0b\x6b\x7f\x6c\xc2\x74\x2e\xc3\x4d\xc1\xc7\x16\x87\x8e\x09\x32\xb0\x13\x19\xcc\x97\xa5\xd6\x05\x04\x47\x1d\x26\x84\x6b\x9c\x6c\x7f\x95\xcc\xb0\xc1\x31\x35\xe4\xd1\xd0\x29\x36\x10\x76\xf4\x12\x59\x5b\x20\x96\xa8\x9e\x5e\x39\x58\x98\x44\x6c\x3c\xf3\xb5\xaa\x3f\xbb\x54\x3d\x67\x2a\x81\x6e\x7a\xb9\xcd\x8a\x6c\xdb\x6c\x91\xf5\x88\x86\x84\xd0\x2f\xc0\xb0\x40\x21\xd6\x80\x20\xc1\x6c\x77\xaa\x84\x41\x05\x89\x3c\xfa\x22\x7e\x07\x31\x27\x42\xb5\xea\x4a\xa5\x55\x15\x60\xfe\x30\x44\xcb\x23\x0f\x16\xf8\x60\x8c\x07\x7f\x3b\x94\x33\x4d\x8d\x89\x0c\x25\xf0\xde\xdd\x3e\x20\x32\xe7\xde\xc3\x12\xd4\x4d\xe2\x5a\x85\x82\xce\x11\xaa\x39\xe1\x36\x20\xdf\x48\x92\xf8\x62\x93\xe9\xc5\xc5\x78\x36\xb7\x9f\x13\x50\xd7\x02\x15\x4b\x48\x46\xcb\xc5\x49\xb3\xf1\xf5\x6c\x3c\x1f\x5f\xdd\x60\x29\x94\x9c\xce\x5a\xfd\x3c\xdc\x2f\x24\xcf\xa6\x57\x67\xe3\xd9\xd5\xe4\xea\x0d\x14\x17\xbd\x1b\xdd\x8c\x67\x93\xd1\xe5\x3c\xe1\x0e\xa2\xc4\x77\x0f\xcd\x6f\x46\x37\xb7\x37\xd3\xd9\x07\xd7\xfd\x60\x47\x1f\x76\x15\xb9\xda\x63\xe8\xec\x80\x97\x27\xad\x37\xdf\x4c\x6e\x2e\xc7\x89\xab\x34\xa6\xe6\x88\x84\xeb\x8c\x65\xbb\xce\x58\x50\x9d\x71\x22\xaf\xa6\x57\x93\xab\x8b\xd9\xe4\xea\xcd\xf8\xdd\xf8\xea\x26\xc1\x4e\x8f\xb1\x1c\xbd\x9e\x8f\xa9\x76\xe6\x72\x04\xdd\x5a\xae\x39\x03\x3b\x83\xe6\x89\xc4\xc6\x91\xb3\x0f\x89\xa0\x2f\xe1\xfa\xe0\xb7\x82\x07\x8c\x67\xb3\xe9\x6c\x9e\xc8\xf7\x6f\xc7\xf0\x80\xe9\x0c\xca\xcd\xce\x27\xf3\xb3\xe9\x8f\xe3\xd9\xe8\xf5\xe5\x78\x28\xe7\xd3\x77\x63\xf9\xfb\xdb\xd9\x64\x7e\x3e\x39\xc3\x76\x8d\xf3\x29\x7c\x6e\x74\x79\x39\x7d\x4f\x7d\x63\x67\x97\xb7\x73\xaa\xf2\xe9\xf6\x54\x25\x72\x3e\xc5\x4a\x1f\xff\xc1\x77\xa3\x0f\xf6\x21\x62\x74\x7d\x7d\xf9\x81\xba\x77\x10\x52\xf9\xd2\xb7\xf7\x9a\x42\x5e\x66\x6a\x01\x18\x7c\xae\xf3\x2c\xee\x55\x7b\xb8\x4b\x29\x11\x61\x53\x13\xb4\x26\x39\xa9\xea\xf4\x0d\x41\x3d\xdc\x07\xaa\xcf\xbb\x79\x3b\xb6\xfb\x7e\x41\x3d\x4b\xdc\x2f\x24\x7c\xbf\x50\x12\x77\x0b\x25\xf2\xfa\xf6\x6a\x02\xb5\x66\xd3\x99\x1c\xff\x61\xfc\xee\xfa\x72\x34\xfb\xf0\x70\x13\x51\x5c\xee\x45\x4d\x45\x61\xc5\x98\xef\xc3\x71\x63\x7e\x42\xd7\x8d\xe8\x74\xdd\xd8\x03\xfb\xfd\x10\x9a\x69\xb2\x02\xab\xb3\x85\x6a\xf1\x36\x33\x28\xc4\x43\x56\x2b\x2a\x22\x8f\x3a\x15\x41\xea\x08\x70\x4f\xad\x62\x5a\x94\x60\xf0\x2f\x0e\x70\x4d\x93\xda\x7f\xc8\x7b\x77\xf1\xea\xca\x95\x0d\xf4\xe3\x53\x3d\xc5\x2c\x41\xab\xeb\x43\x84\x58\x25\x9c\xd7\xe6\x54\xb4\x2b\x86\xf9\x0c\x76\x95\x03\xfd\x02\xb5\xe8\x43\xeb\x80\x54\xc1\x43\x7d\x18\xc9\x8a\x0d\x56\xeb\x7e\xe4\x2e\x91\xe5\xd1\x85\x13\xf9\x22\x11\xdf\x26\xf2\xbb\x44\x7e\x8f\x0e\xc1\xef\x08\x73\xbd\x29\xef\xec\x9c\xd8\x67\xa1\x0d\xeb\xaf\xaf\x6a\x65\xaf\x31\x90\xd3\x97\xc3\x4e\xa8\xb8\x3d\x0e\xe1\x52\x41\xb7\x88\x53\xd1\xf2\xa9\xa9\x68\xbe\xe9\xec\xf2\x1f\x43\xf9\x80\x9d\x74\x55\x2b\x24\x61\x71\x23\x0a\x32\x1a\x14\x64\xae\xe2\xd0\x78\xa9\xed\x8d\xa4\xdb\x35\x33\x4c\xb5\x5e\x0b\xe7\x54\xa3\x20\x81\x45\x53\xd5\x66\xd7\x05\xc5\x42\x3b\x13\x2b\x11\xea\x6c\xab\x83\x6b\x9a\x65\x40\x38\xd2\x3c\xa4\x77\x60\xde\x6d\x27\x19\x30\x44\x68\x13\xca\xea\x4d\x5a\xaa\x7d\xec\x6b\x1c\x85\x15\x5d\x22\xf2\xf7\x37\xaa\x92\x0b\xad\xb1\xea\xcb\xe3\x53\x12\xf8\x44\xe2\x16\xfe\x81\xa0\x85\xeb\xd0\x4a\x7a\x80\x68\x90\x4b\xaf\xa8\xb3\xa2\xd1\x4e\xe0\x00\x28\x06\xfb\xa2\xa0\x93\xca\x61\x6c\x3a\x41\x16\xbe\x06\x80\x11\xff\xa4\x94\xbf\x1b\xca\x77\x59\xb5\xd4\x79\x8e\x88\x42\xa0\x0f\x3c\xfc\x56\xec\x9f\x3f\xc1\x1d\x74\x3e\x44\xbb\x3a\x20\x89\x2b\x6c\xb8\x38\xca\xc4\xde\x73\xd0\x40\x1f\x86\x1f\xc9\x5b\x07\x5e\x9a\xde\xca\x0c\x55\xf5\xca\x35\xf6\x0b\xf6\x81\xe1\xc1\xa9\xf9\x8d\xf3\xec\xda\xbc\xe2\xcb\xe7\x15\x5b\xa4\x7f\x8d\x09\xa2\xab\x08\x29\x58\x2b\xf9\x55\x8f\xf2\x20\x16\xcf\x47\x11\x87\xdc\x79\x17\xb9\xda\x03\x8f\x56\xb5\xa1\xf0\x84\x54\x28\x6b\x76\x64\x1e\x89\x87\xb1\xc4\x34\x5d\xd5\x1e\x5c\xc5\xaa\x48\x20\xea\x5f\xb5\x1b\xd3\xda\xb9\x16\xee\xd8\x62\x00\x34\xc4\xd3\xe3\x74\x11\xa3\x91\x51\x38\x44\x38\x00\x2f\x2a\x03\xf5\xf3\xc5\xa1\x42\x45\x25\x96\x51\x3a\x5f\x12\x2d\x6c\x76\xd8\x5c\xa2\x4d\x44\x09\x3a\xff\x20\x5c\x23\x38\x5f\x7e\x89\x86\x50\xb2\x71\x65\x90\x4b\xdd\x94\x8f\x2c\xb4\x1b\x48\x6a\x47\x9a\x62\x46\x17\x1f\x58\x18\xba\x2c\x11\x91\x86\xf7\x35\x74\xe5\xe0\xd3\x25\xa1\x77\x00\x04\x88\x7b\x5e\x56\x38\x8e\x6c\xc0\xe5\x45\xc8\xc3\x60\xa1\x0e\xe4\x34\x22\x0a\x35\x41\x89\xf6\x3f\x15\x2b\x06\x23\x6b\x20\x2c\x28\xad\x3d\x27\xa3\x87\x4c\x5b\xe8\x7a\xaf\xa9\xad\x2e\x44\x89\x13\xbe\x22\xcf\x9f\x63\x47\xa3\x6b\x2f\x1c\x02\x39\x24\x44\x3a\xc6\x8d\xc7\x3b\xa3\x0a\x50\xd9\x2a\x41\xf0\xca\x81\x8f\xd1\x2e\xfa\xf3\xaf\xf0\x68\x1c\x99\x7b\x8f\x77\xa4\xed\xaa\x09\xaa\x80\x5d\x40\xba\x1d\xc8\x72\x0f\x8e\x29\x51\xe5\x7e\x13\x29\x58\x05\x80\x39\xe8\x77\x91\x0f\xb8\x34\xdb\x6d\x53\x50\xe2\x56\xb0\xb9\xd1\x5a\x39\x0e\xb9\x2d\x42\x06\xd3\x80\x1f\x67\xdb\xc0\x45\xcb\x68\x35\x6e\xba\x22\xea\x9f\xa4\x3a\x3f\xfb\x78\x21\x3a\xfd\x29\x8e\xdb\xcd\x6d\x74\xf7\x28\x59\x69\x06\x5e\x2c\xd7\xec\xb8\xdf\xa8\xba\x32\x70\x03\x66\x00\xf6\x51\xb8\x8b\xaf\xf6\xb5\xc8\x43\xd9\x79\x5d\x58\x3f\x9c\x67\x1c\x9a\x01\xfb\xae\x14\x88\xe1\x65\x87\x41\x16\x20\x50\xd3\xd8\xc7\x19\xea\x5c\x43\x2c\xed\xad\x02\x56\x06\x37\x86\x24\x24\x6f\xc0\xf5\x11\x21\xa6\x4f\x71\x60\x14\x8c\x84\x21\xb3\xe1\x2b\x10\x5d\xc0\x3a\x53\x87\xe4\x54\x67\x2a\x77\xaf\xa0\xc2\xc3\xd6\x1c\x79\x8d\x72\x36\x3e\x5b\xd6\x0a\xe5\xa3\x4b\xbd\x36\xf0\xaf\xbd\x01\x6c\x7c\x0e\x74\x57\xd0\x4a\xd8\x59\x99\x4d\x84\x13\xcb\xa4\xb4\x3a\x75\x54\x47\x55\xbc\xa7\x3e\x06\x2c\x9c\x42\x25\x94\x73\x97\xb4\x07\xb8\x90\x00\xd8\xcf\xac\xdc\xf7\x87\x42\x8c\xb1\x02\xdc\xb7\x2b\x62\x42\x3d\xa8\xd8\xa6\xda\x50\x04\xe4\x0a\xcb\x37\x1c\xa8\x32\x95\x9e\x08\x77\x2c\xbd\x39\x72\x76\x76\x7d\x99\xc8\x82\xda\x7b\x71\x5f\x61\xfb\x99\x4b\xa1\x2e\x55\xaa\xb7\xaa\xfc\x28\x07\xed\xd5\x18\x08\xda\x6c\x28\xd2\xb6\xda\xcc\x7d\xd6\x94\x32\x37\x6b\x63\x87\xd7\x23\x5d\xfe\x70\xec\xca\x8c\xc8\xff\x6b\x5d\xb0\x5e\xec\xfb\x16\xe2\xee\x7a\x9c\xa9\x86\x2d\x24\x54\x8d\x2d\x3b\xbc\x73\x82\x9e\xd9\xb7\x15\x27\xcb\xa6\x2c\x01\x56\xde\x0d\xb4\xa9\xd4\x9a\xf0\x60\x80\xc9\x09\xd2\x5b\x14\x15\x72\xed\xd1\xc2\x60\x53\xc8\x5e\x2f\xaa\xac\xd6\x11\x7c\x24\x46\x75\xd5\x9d\xca\x72\xbc\x4d\xad\x63\x44\xf9\xb1\x1e\x38\xa8\x9e\xc3\x4d\x6f\xa3\xa6\x59\xe4\x1e\xdf\xd4\xf5\xee\xe5\x57\x5f\x2d\xe9\xb3\x4b\x5a\x04\x53\xae\xbf\x1a\xfe\xe7\xe9\xc3\xfc\x8f\xfa\x6f\xf8\xd5\xf9\xfc\xfc\xfa\xaf\xd3\xf7\xc9\xff\x3d\xde\xff\xf9\xfc\x9b\xaf\x5f\x7c\xd3\xea\xff\x7c\xf1\xf5\x77\x2f\xfe\xde\xff\xf9\xb7\xf8\xcf\x37\xda\x5d\x4d\x6f\x26\x17\x93\x33\xec\x55\x3b\x3a\x3b\x0e\x7a\xf0\xec\xce\xc8\xdb\xab\xc9\x8f\xe3\xd9\x9c\xa0\x4d\xce\xde\x4e\xce\x46\x6f\xa6\x04\x61\xc0\xc4\x94\x90\x91\x33\x11\x03\x20\x81\x4d\x06\xe6\x75\x54\xb1\xee\xaa\xdb\x6f\x0b\xab\xcc\xc5\x1c\x68\x09\xa1\x48\x36\xc0\xa6\x76\x94\xad\x0e\x6e\x38\xab\x62\x90\x29\x40\xa6\x36\x4b\x60\xf0\x47\x1b\x05\xe0\x45\x7d\x89\xba\x75\x82\xdb\x18\xfb\x68\x4b\x10\xfc\x45\xa9\x6b\x05\x5d\x5e\xd0\xeb\x8d\x50\x87\x70\xaf\xe7\xb9\xf0\x45\xc9\x31\x23\x17\x24\xdc\x6e\x8b\x0c\xf2\xeb\x68\xf6\x9f\x6d\xb2\xa5\x5a\x1b\x6f\x83\xb4\xcc\x38\xa1\x9c\xab\x84\xc4\x39\xe8\x30\xc0\xcb\x76\xba\x8c\x1c\x88\x70\x92\xae\xb6\x14\x6f\xbb\xa1\x9c\x20\x8b\x22\x4f\x69\xa0\xac\x6d\x34\x08\x90\x1f\xa8\xeb\x03\x53\xc1\x11\xf6\x43\xb4\xbc\x6e\x9d\x44\xe0\x61\x41\xbf\x82\xab\x3f\xb7\x2b\xa7\x77\x00\x06\xda\x02\xff\x0e\xea\xdf\x43\xa8\x5c\x83\xd5\xa4\x08\x93\xe8\x89\x70\xb2\xaa\x07\xce\xb1\x67\x0b\xe8\x86\x83\xab\x1b\x37\xb3\xd4\x55\x93\xd7\xae\xa7\xc2\x2e\xa8\x2a\x97\x1b\xb6\x56\xd3\x20\xd3\x12\x2e\x1a\xc1\x29\x2c\x01\x0a\x02\xab\x74\x50\x44\x1c\xac\xa6\xc3\x67\x53\x15\x85\xfb\xa1\x44\xef\xa5\x10\xf3\x1a\xb0\x33\x7e\x3f\x94\xaf\xad\x01\x52\xc8\x77\xaa\xde\x68\x08\xfb\xa1\xa1\x72\xc6\x7c\x44\xf3\x65\x06\x05\x01\xe7\x19\x79\x42\xa3\x72\x6d\xad\x2f\x79\xa5\xd0\xbe\x16\x97\x6a\x61\x4a\x05\xc5\xb2\xfc\xb7\xc9\xa5\xfc\xee\xf9\x37\x5f\xff\x20\xc4\x87\xac\x38\x34\xf2\x83\x96\xe7\x76\x8d\xeb\x2d\x5d\xfb\xef\x54\xa1\xb0\x7b\xcf\xbd\xc0\xbe\x75\x1c\x30\xc6\xcd\x6b\x65\x3d\xb3\x34\x10\x41\xc1\xbf\x4b\xe4\xd9\x48\xde\x0e\xe7\xc3\x91\x10\x76\x35\xe1\x16\x46\xa3\x0a\x72\x1c\x58\x81\xc1\x4e\x38\x2f\x03\x5d\xc0\x08\x26\xcc\xb1\x1b\x3b\xfb\x7f\xda\x2e\xab\xa1\x2a\xf2\xe1\xda\xdc\x59\x5b\xe7\x60\x07\x7d\x72\xd0\xff\x54\xd1\xfb\x86\x3a\x6d\x84\x68\xcf\x5c\x06\x33\x07\x53\x3b\xa0\xcd\xa0\x08\x1a\x11\x91\x9a\x95\x9c\xe4\x79\x56\x18\xe0\x16\x4b\xc5\x24\x55\x1b\x03\xe4\xb0\x66\x4f\x9c\x97\x37\x4e\x4d\x48\x54\x13\xf2\x8d\xb9\xd3\x65\x81\x6e\xb0\x3b\x41\x41\x91\x65\xb0\x2e\xc1\xd1\x44\x35\x14\x39\xae\x4c\x61\xb2\x0c\xb2\xed\xf1\x76\x8c\x0b\x5d\xae\x0f\x43\x21\xb8\xad\x7b\x3c\x13\xd8\x55\x7e\x3d\x9b\xbe\x99\x8d\xde\xc9\xf7\x23\xfb\xf3\xf8\x7a\x34\x1b\x9f\x43\x93\xf3\x95\x1c\x9d\x9d\x4d\x6f\xaf\x20\xe4\x0d\xb9\x9b\xf9\xf5\xf4\x6a\x3e\xe5\x60\xfd\x95\x1c\xbd\x19\x5f\x9d\x59\x7d\x0a\xd9\x98\xdb\x2b\x80\xc7\x02\x24\xb9\xb9\x7c\x33\xfd\x71\x3c\xbb\x7a\x37\xbe\xba\x19\xca\x2b\x82\x79\x7b\xec\x53\xf2\x0a\xa3\xf5\x82\x1e\x0a\xb8\x77\xd3\x8b\x04\x7e\x4f\x5f\xec\x2a\xf0\x84\xbf\x46\xc1\xf4\xc9\x4c\x8e\xdf\x5d\x5f\x4e\x3f\x8c\x11\x4a\x6b\x7a\x71\x31\x39\x1b\xcf\xe6\x09\x65\x9b\x42\x94\x19\x97\x34\x8a\x40\xe7\xec\xe3\x00\x92\x6d\xee\x13\x0a\xc2\x77\xc0\x03\xc0\x19\xac\xc3\x24\xe8\x89\x87\xc4\x0e\x27\x6d\xe4\xd9\xf4\xdd\xf5\xe5\xf8\x66\x7c\x05\x09\xa9\xe9\x4c\xde\xce\xc7\x17\xb7\x97\x00\x4c\x43\xd9\xac\xa0\xed\x3e\x91\xa3\xeb\xeb\xd1\x6c\x74\x73\x3b\x4f\xec\x66\x9c\xdf\x9e\x61\xb6\xe8\x7a\x36\x3d\xb3\xa3\x83\x1d\x9b\xce\x69\x70\x2e\x59\x36\x17\x37\x6f\x47\x37\xdc\x77\x2f\xdf\x03\xdc\xdc\xd5\xf4\x46\x72\xda\x49\x5e\xcf\x26\x3f\x8e\x6e\xc6\x97\x1f\xe4\xf4\xfd\xd5\xf8\x9c\x1a\xbd\x87\x72\x36\xbe\x18\xcf\x20\x87\x64\xd7\x78\x72\x25\x6f\xa6\xc2\xe5\x49\x2e\x26\x67\xd0\x6f\x3f\x9e\x9d\x4d\x46\x97\x7e\x40\x34\x1a\x18\x03\xe1\x1f\x40\xfe\x6f\x36\x3a\x1f\xcb\xab\xd1\xbb\x71\x82\x3f\xbf\x1b\xcd\xfe\x4b\x22\xde\x8d\xae\x6e\x2f\x46\x67\x37\xb7\x33\xc2\x8e\x0b\x12\x70\x0e\x16\x81\x31\xee\x26\x97\x1f\x20\x1d\x73\x33\xb9\xb9\x45\xb4\x34\xbb\x1b\x1f\x60\x6a\xe3\xab\xf3\xe9\x6c\x8e\x29\x34\x31\x1b\xc3\xc8\xae\xce\x69\xe1\xa6\x33\x79\x31\xfa\x71\x3a\x03\x94\xb6\x0f\x8f\x8b\x17\x89\x09\x4a\x97\x20\xe9\xc2\xc6\xf8\x1f\x27\xe3\xf7\x90\x91\x9c\x5e\x4f\xae\x30\x03\x79\x41\x3d\xfe\xf3\x00\x9a\x90\x16\x8b\x92\x67\xc1\xe0\x11\x3c\x11\x37\xe7\xe2\x72\x7c\x76\x23\x6f\xde\x4e\x7d\x3a\xe8\x69\x43\x62\x81\xff\xbb\x53\xf0\x25\xff\x0d\xbf\xba\x1c\x5d\x9e\x9c\x0e\xbf\xfe\x2b\xba\x00\x8f\xdb\xff\xa7\xdf\x7f\xff\xbc\x8d\xff\xf2\xe2\xdb\x6f\x9f\xff\xdd\xfe\xff\x5b\xfc\x07\xe1\x95\xa5\x96\xa3\xb2\x06\x78\x41\x2d\x4f\x87\x5f\xcb\xa3\xcb\xd1\xa5\xfd\xe1\x58\x88\xeb\xf2\xfe\x93\xda\x2e\x9a\x5c\xff\xf9\x4f\x2f\x85\x18\xdd\xe9\xa5\xcc\x95\xec\x7c\x2f\x91\xf9\x33\xd5\xd4\xa6\xcc\x2a\xc2\xce\x06\x7e\xd4\xa2\xb8\xff\x64\xcd\x46\xec\xeb\x2b\x13\xfb\x63\x9a\xad\x56\xc0\xd3\xa9\x6b\xfb\x4f\xdf\xf1\x8f\x2c\x4f\x68\xf3\xe4\xba\x92\xff\xe3\xff\x68\xee\x4a\x5d\xc9\x54\x15\x95\xcc\xb5\x0b\x7e\xa6\xf6\x77\xa5\x41\x36\x1a\x7c\xaf\x6e\xca\xa1\x10\x97\x26\x2b\x64\xfa\x2c\x5b\x17\xa6\xb4\x9e\x86\xfb\x5c\xd2\x3b\x66\x78\x49\xa9\x97\xa6\x28\xd4\xfd\x7f\xaf\xa5\xc6\xd7\x5a\x97\xe5\xfe\x5f\xd7\x7a\x28\xc6\x79\xae\x25\x10\x86\xda\xf1\x35\xb9\x7d\x19\x96\x3a\x2e\xe1\xf7\x3b\x5d\x6e\x75\x5d\xab\xa2\x96\xf7\x7f\x92\xb5\x35\xbb\x9b\x42\x2e\x37\x6a\xd9\x14\x76\x68\x2b\x95\x95\xd6\xed\xc1\xd8\x8a\x58\xda\xb5\xac\xb3\x15\x4c\xc0\x23\x28\xd0\x2c\x74\xb5\x2b\xb3\xda\x1a\x6a\x79\x65\xff\x57\x56\x26\xc3\x95\x68\x4a\xb9\xd6\x45\xa9\x71\x80\x0d\x42\x29\x68\x91\x3e\x23\x1b\x1f\x9b\xaf\xe7\x59\x02\x63\xbd\xff\xd7\x75\xae\xe5\xfa\xfe\x53\x71\xff\xa9\x54\x39\xee\x4c\x80\x7c\x9f\x36\xb8\x28\x32\xa5\x85\x83\xa4\x4b\x93\xc1\x1c\xa0\xfc\x53\x67\x45\x5a\x6a\x91\x3f\x53\xcb\xe5\xfd\xbf\x5a\xc3\xf8\x17\xbf\x17\x7e\xa8\xfd\x8b\x9a\x48\xd5\x90\x35\x95\x81\x58\xd8\x65\xb8\xb3\x72\xa1\x87\xe2\xf2\x19\x74\x53\x7b\x01\x61\x99\xb1\x7b\xff\x0c\xaa\xda\x48\x7c\x52\xd8\x9a\x0a\x0b\xc6\x2a\x99\x3e\x6b\x0a\x4d\x83\xf8\xf3\x9f\x5e\x49\xbb\x94\xba\x14\xa9\x96\x85\x69\xee\x74\x4e\x84\xdf\x9c\x3b\xb2\x02\x87\x8b\x6d\x0a\xb9\x03\xce\x1f\xeb\x03\x41\xf5\x2f\x6c\x31\x40\x5f\x5a\x4b\xf4\xfe\x53\xfc\xe9\xa1\xb8\xec\x93\x14\xdc\x69\x3b\xde\x3b\x93\x95\xf2\x27\xd3\x64\x55\x05\x41\xb6\x34\x10\x54\x90\x00\x90\x17\x90\x29\xf8\x48\x2d\x72\x2f\xae\x24\x61\xc4\x44\xa3\xa2\x11\x80\xd4\x0c\xf9\x88\x69\x99\xde\x7f\x02\x70\xcf\x1d\x1e\x88\xb4\x91\x45\xb3\xbd\xff\x54\x66\x3f\x37\xb0\xa7\x59\x71\x47\x2b\x99\xc2\xaa\x96\x85\x06\x11\xb6\x03\x82\x1a\xd4\x4c\xe7\x95\x80\x13\x65\xe5\xdf\x3a\xe5\x26\x55\x3d\x53\x96\xc6\xca\xef\xa7\x3b\x93\x37\xf7\x9f\xfe\xfc\xa7\x97\x7c\x08\xfa\xc4\x53\x54\xcf\xcc\x6a\x05\x91\x43\x84\x57\xcb\xb1\x5a\xcc\xca\x4e\xae\x90\x25\x83\x81\x48\xec\xaf\x9e\xdd\x7f\xc2\xe6\x3a\x3b\x32\x2b\x47\xee\xb4\x33\xa9\xf5\x18\xf6\x0e\xd8\x22\xee\xff\x0d\x32\x53\x20\x2e\x6a\x11\x3d\xd8\x8e\xd5\xcb\xc6\x33\x5e\x70\x4c\x4b\x68\x3c\x2f\xb8\x82\x62\xa7\x1b\xfb\x2a\x00\x24\xb1\x76\xbe\xdd\xfd\xfc\x99\xba\x53\x45\xad\xd6\xa0\x8b\x6a\xd3\x54\x43\x21\xce\x9e\x59\x11\xb4\x0f\x57\x59\x05\x02\x69\xdd\xf4\xcc\x4e\x09\xa6\xdc\x23\x07\x76\x75\x00\xcc\xba\x01\x31\xd0\x35\x2a\x8b\x4f\x6b\x5d\x8a\xe5\x23\x87\xba\xd2\xb9\x29\x68\x5d\xb3\x62\x99\xed\xac\x48\x34\xe0\x04\xe7\x7a\x55\xc3\xa2\x67\x0b\x5d\xd6\xf7\x9f\xac\xa8\x5b\x6d\x91\x08\xd6\x9a\x81\xd2\x84\x75\x0d\x75\x26\xe9\x5a\x82\xd4\x63\x06\xc6\xd4\x1e\x78\x60\x79\x44\xf7\xd9\x75\x50\x5a\xff\xe5\xfe\x93\xc3\x13\x02\x95\x7e\x65\x9a\xca\x0a\x5b\x65\xd5\x66\x51\xc9\x9d\x2a\xe5\x9f\xff\xaf\x3f\xff\x89\x0f\xdb\x9f\xff\x5f\x7b\xa4\x41\xc9\xe5\xb4\xf0\x12\x1e\x80\xba\x25\x10\xff\xa5\x29\xaa\xfb\x4f\x90\x95\xd0\x55\x22\xec\x9e\xb8\x6f\xd0\x4e\xc9\x1a\xcf\xaa\xfd\x5b\x8a\x23\xb1\x5f\xcc\x4e\xd4\xae\xbc\xff\x57\x1c\xd0\x65\xeb\x3b\x76\x75\x26\xb9\xac\x9e\xa9\x35\x68\x2d\xaf\x09\xe4\xcf\x4d\x06\x01\xef\x52\x17\x69\x77\x74\x52\x65\x45\x95\xc1\x38\xec\xc9\xb4\xe7\x42\xb7\xb9\x46\x76\xa6\xaa\xed\xa1\xd2\x50\xaa\x7d\x94\x6b\x17\xa3\x68\x7e\x09\x27\xc4\x67\x97\x62\x41\xc7\x43\x89\x97\x43\x55\xc3\x41\xb2\xb7\x1c\xc8\x3b\xbe\x1b\x22\x24\xc1\xdd\xc4\x43\x82\x01\xdb\x05\x5e\xea\xba\xa6\xdc\xf6\x52\x0b\x5a\x89\x5a\xb6\xd4\x98\x13\x1b\x7b\x29\xe4\xbd\xe3\xaf\x0c\x9c\x98\xac\x06\x56\x9a\xcb\xf6\x12\xd8\xb5\x03\x39\x3f\xb9\xff\xd3\x89\x75\xeb\x83\x1d\xa1\x61\xdb\xe1\xb8\x71\x6b\xc0\x88\x77\x1f\x12\xbc\x6d\xa9\x29\x78\x74\x10\x0a\xbb\x03\x9d\xf1\x6f\x75\xc9\xa9\xbe\xfb\x4f\x1a\x45\xc7\xce\x10\xa9\xcb\x37\x76\x54\x76\x50\x0f\x89\x48\xcf\xe0\x3a\xf3\xb3\xda\x0c\xd7\xb0\xe2\xc5\xab\x33\x7b\x80\x8a\x5a\xa0\x6a\xf0\xc7\x20\xed\x91\x37\x5d\xd8\xd5\xb1\x7a\x98\x12\x1c\xb1\xf1\x10\x23\x19\x85\xe7\x0c\x55\x69\xcc\xf0\x0f\x12\x4d\x37\xe6\xea\xfe\x5f\x4b\x50\x12\xb4\x89\x43\x21\xa6\x4e\x70\x8e\xf8\xde\x02\x2e\x37\x7f\x8b\xf9\x01\x1e\xc3\xe4\x37\xca\x3e\x52\xff\xa2\xb7\xbb\x1c\x6c\x85\x54\x81\x0a\x08\x76\xc0\x09\x33\x10\x37\xf9\xd5\x73\x83\xf1\xeb\xb3\x2b\xef\x3f\x61\xd6\xae\xc6\x10\x8f\x55\x9b\xab\xfb\x4f\xd8\xd5\x64\x15\xa1\xa0\x73\xa0\x96\x75\xe3\xf4\x69\x95\xa0\xf6\xb0\x5f\x77\x05\xad\x1c\xf2\x6c\xa2\x25\xaa\x64\x93\xfb\xe3\x32\x04\x98\xdf\x0c\x84\xec\xc6\x3e\x38\xfa\x2c\x9c\x54\x1f\xf0\x53\x8d\xac\x34\x5d\xcd\xa1\xf0\x13\xce\xd9\x89\x9c\xbe\xfe\xfd\xf8\xc6\x3e\x32\xfc\x2b\x60\x17\x37\x25\x70\xc0\xc3\x7e\xd0\x51\x29\x3f\x7b\x54\xee\x4c\x53\x89\x9d\x35\x0e\x7e\x85\xeb\x3a\x34\x2e\x83\xf5\xc5\xd7\xbf\x18\xca\xcb\x67\xf7\x7f\xbc\x19\x5f\x9d\xdf\x8e\xe5\xf9\x58\x5e\x8e\xe4\xef\xa7\xb7\x93\xf9\x7c\x74\x75\x36\x76\x83\x22\xd9\xb2\x87\xbe\x32\xcd\x36\xab\xb4\x9d\x56\x6c\x4d\x25\xa0\x28\xf8\xdc\x77\xce\x3a\x8e\x2b\x2b\x52\x7b\x8d\x4b\x1e\x2c\x9c\xe2\x3b\x53\xb9\x5b\xa0\xa2\x7b\x4b\x39\xc3\x39\x57\xce\x70\x86\x37\x38\x7e\xf2\xd2\xa1\x54\xbc\x18\x9e\xda\x81\x5f\x4e\x5e\x8f\x67\x37\xf7\x7f\xb4\xf3\x38\x9b\x5e\x4f\xc6\x33\x79\x34\xbd\xb5\xff\x9a\x8d\x29\x1c\x31\x99\x5e\x1d\x0f\x85\xf8\xd1\xaa\x7e\x65\x57\x08\xe4\x98\x2f\x20\xb6\xd6\x69\xe4\x34\x6b\x18\x90\x1d\x7d\x02\x23\x55\xdb\x0c\xc4\x03\x24\xca\x8a\x60\xa9\xc5\x4e\x97\x95\x29\x0a\x9d\xd0\xc4\xd8\x8c\x85\xe1\x62\x97\x37\xc8\x3b\x00\xda\xde\x7f\xd2\xc1\xc8\x5f\xb4\x47\x7e\x3e\xb9\xb8\xb8\x9d\xdb\xb1\x4f\xae\x6e\xc6\xb3\xeb\x99\xdd\x9e\x19\x60\xf8\xcf\xee\xff\x38\x1f\x5f\xc1\xbf\x18\x3f\x72\x3c\x73\xf3\xa1\x3d\x77\x8b\x15\xfb\x14\x4c\x9e\xa6\xc1\x3b\x20\xb5\x94\x84\x4a\xcc\x34\xb2\xb0\xca\xc0\x4e\x21\x98\x80\x86\xd6\x07\x53\xd6\x38\xb9\xe8\x2f\x79\xa6\x1b\xb0\x77\xea\xcc\x6a\x44\x63\x2d\x6f\xdd\xfc\x62\x1f\xb5\x2e\x55\xdd\x64\x75\x22\xaa\x0c\x16\x8f\x9d\x18\xfd\x6b\xeb\x4e\x72\x82\xdc\x64\xd6\x54\xd1\x78\x17\x9e\x0e\xe5\x4f\x06\xcc\x71\x89\x17\x12\x8c\x3e\x96\x28\xbc\x77\x20\x01\x6f\x07\x45\x74\x97\x3f\x37\x10\xe4\xbc\xff\xb4\xcc\xaa\xfb\x4f\x58\x66\x71\xff\xff\x58\x43\xab\x2e\xed\x0a\x05\xaa\xeb\xcf\x7f\x7a\x05\xa8\x48\xee\x6b\x56\xa8\x75\x55\x67\x85\xaa\x15\xaa\x65\x59\x98\x2d\x59\xa9\xf6\x1d\x24\xdd\x69\x78\x5b\x26\xf2\x80\x77\x71\x56\x89\x5c\xcb\xbb\xfb\xff\xdb\xae\x05\x4f\x1b\xa4\x8c\x57\xd9\x9d\x3e\x78\xf3\xd7\x8f\xbc\xd9\x0e\x39\xcb\x41\xf6\x4a\x95\xd5\x12\xcd\xef\xc0\x2f\xf1\x97\xf5\x11\x6a\xca\xe6\x17\xa1\xeb\xaf\x62\x65\x69\xaf\xeb\xcb\xe0\x22\x89\xc6\x8d\x0f\x37\x50\x4a\xf5\x2c\xcb\xab\xf0\xf6\x2a\xea\x44\xe0\xf0\x9d\x9b\x72\xff\xa7\x40\xb4\x9e\x39\xf5\x46\x3e\x6a\x25\xb7\xf7\xff\xb6\x8d\x77\x14\x15\x35\x8b\x5e\x20\xf3\x5f\xb7\x65\x1e\x88\x20\x26\xe3\xd9\x63\x47\x93\x4f\x7d\x2c\xcd\x55\xdf\x42\x58\x3d\x11\xad\x82\xe8\xf3\xa4\x1f\x93\xbd\x25\xaa\x27\x2b\x46\x77\x8d\xae\x50\xd4\xe0\x06\xce\x35\x1c\x5a\x5d\xc8\x25\x20\x24\x06\x17\x27\xda\xce\x30\x34\x7f\xae\x3a\x32\xf6\x73\xf3\x2c\xeb\x37\xea\xdc\x77\xa4\xb6\x7b\x92\x39\xa2\x02\x50\x82\x84\xea\x9c\x6a\xe1\x54\x20\xde\xce\x2c\x4b\x6e\x77\x22\xed\x15\x5d\x9d\x8a\xa2\x18\xb0\x57\xee\x1c\x99\x06\xff\x80\x1a\x8d\x6d\x33\x4f\x04\x04\x2f\xf8\xe6\xb7\x4b\x92\x8c\x25\xc9\x9a\x2f\x7e\x33\x7f\xb3\x24\x7d\x3d\x94\xe7\xb3\xe9\xe4\x66\x2e\xcf\xa6\x57\x57\xe3\x3f\x40\xd1\xfb\x25\xde\xf1\x56\x34\xac\x23\x0a\x8c\x94\xba\x01\xd9\x0d\xcc\x1f\xbe\xa4\x80\x48\xc2\xfd\xfa\xce\x64\x55\x56\x54\x12\xac\xbe\xcc\xfa\x98\x62\xa7\x2a\x57\x16\x07\xc8\x63\xd2\x2c\xaa\x5a\x2d\x73\xd4\x4a\xfe\xd2\x02\xbb\xe8\x53\xe9\x8c\xc1\xf6\x4d\x8f\x2e\x97\x5d\xa6\x9f\x1b\x93\x01\x2d\x33\x59\x3f\xe4\x4a\xb4\x0d\x11\x1e\x02\xd9\x9a\x74\xeb\xa2\x20\x2a\xd1\xd9\xbf\xa6\xf0\xff\xf4\x1b\x37\x94\xe7\x1a\x57\x13\xfd\x66\xeb\xb0\x95\x1d\x93\xd1\xee\x87\xfd\xfe\x42\x01\xd0\x1d\x07\xaf\x80\xbc\x1f\x9f\x96\x71\x4f\x16\xbe\x88\xc1\x54\x33\x4d\x6b\x55\x4b\xbb\x50\x10\xf4\x11\x6e\x81\xd0\x48\x8d\x02\x06\xde\x4a\xad\xdd\x2d\xc9\xce\x50\xef\xb2\x49\x29\xad\xdc\x3d\x93\x93\xab\x9b\xfb\x3f\xbe\x21\x40\x59\x6b\xa6\x3c\xfb\x1f\xff\xfb\xed\x8f\xb3\x31\xd0\x5a\x00\x2f\x42\x6b\x72\xd1\x19\x80\x09\x4a\x5d\x20\x8e\xaa\xbd\xe5\x68\x41\x69\x90\x97\xa3\x4b\x9c\x86\xaa\xaa\xa6\xd4\xa5\x08\xa2\x5d\x10\x55\x78\xf2\x3e\xcf\x33\x3f\xc7\x02\xf7\x3c\xb7\xb2\x0f\xcd\xaf\x40\xaa\x95\x15\xe9\xfd\xa7\x9d\x2e\x52\xb5\xf5\x26\x19\x0f\x0d\x70\x65\xcb\xaa\xb5\x59\x82\x9e\x44\xda\xc0\x6a\x90\xfb\x3f\xf9\xe3\x81\xa7\xc3\x3d\x03\x2f\xe7\xce\xfc\x62\x21\x09\x4e\xb7\xeb\xed\x3a\x9b\x4d\x6e\xee\xff\xb7\xd9\x78\x8e\xf6\xd3\xbb\xeb\x11\xb5\x2d\xdd\xff\x11\x3f\x73\x1b\x08\x19\xf8\x7f\x9e\x2a\x8c\x15\x8b\x7d\x53\x95\x59\xfd\x5b\xe9\x86\x02\x19\x55\xc6\x5a\x15\x36\x5d\x2d\x97\xa6\x64\x17\xd1\x87\x4d\xc3\x50\x69\x60\xee\x39\x45\x91\xba\xe3\x2f\x02\x41\x0a\xee\x5e\x3e\xe4\x2b\x7b\x86\xf3\x66\x59\x22\x3f\x17\x98\xa5\x15\x60\x56\x5a\x53\xad\x8a\x09\x96\x7f\x6e\xb4\x58\xb2\x67\xfe\x8c\x5a\xc7\x5b\xf7\x04\x7d\x6f\x59\x66\xb5\x75\x7d\xd0\x86\xa2\xa9\x63\x1c\x8b\x75\x3c\xcc\x6f\xad\xa0\x21\x0e\x4c\xbf\x9d\xaa\x75\x59\x64\x2d\xd7\x86\x0c\x65\x7f\x97\x3b\x5a\x40\x55\x78\x27\x23\x9c\xa6\xfc\xb9\x81\x22\x71\x5d\xb3\x09\x10\x0a\x04\xbc\x1e\xef\xd6\xaf\x69\x10\x41\x70\x97\x76\xe5\xfe\xd3\x5a\xd1\x86\x04\xfb\x76\x04\x76\xd2\xae\x34\x4b\x3b\xc8\x63\xd6\xf4\xf0\x0c\x5a\x0d\xd6\xbd\x51\x05\x08\x79\xde\xb2\x82\x18\x13\x0d\x92\xe2\xb6\x81\xae\x12\x7d\x77\x8d\x2e\x96\x86\x0f\xa5\xff\x43\x79\xff\x69\x67\x8a\x54\x15\x18\x2e\x7b\x64\xb5\xc5\xce\x54\xe0\x28\xa8\x92\x26\x87\xe2\xf9\xdd\x50\xfe\x38\x9d\xf3\xa5\x60\x8d\xe7\xcb\xcb\xf1\xd9\xcd\xed\xf8\x12\x6e\x06\x5c\x86\xe2\x99\x02\x65\x15\x3b\x57\x85\x95\x30\x6b\xdc\xb7\x6f\x88\x0a\x4c\xff\x1a\xef\x51\xe7\x9d\x8b\x22\x0b\x3f\x0d\x25\xa7\xbf\xe8\x6a\x28\xc7\x05\xd0\x97\x56\x18\x00\xc5\xa1\xe3\xd7\xd0\x80\xca\x9f\x61\xb8\x31\xd2\x52\x22\xf6\xdc\xf9\xba\x04\xae\x76\xfd\x6b\x70\x90\x52\x08\x41\x5a\x33\xb0\xf9\x85\xa5\x32\xb8\x2f\xc3\xe3\x54\x89\xfe\x91\x63\xbc\x90\x05\x9e\x4c\x54\x0c\x83\x5a\x21\xc5\xb3\xf9\x90\x76\x3b\x6b\xbf\xc4\xaa\xb8\xa2\x2e\xd5\xfd\x7f\x87\x7e\x52\xbb\xae\x10\xff\xaf\x2a\x05\x6b\xe0\x9c\xce\x60\xb1\xec\x45\x07\xdd\x22\x8d\xce\x2b\xd7\xa6\x66\x37\x8e\xd2\xe3\x23\xd2\x39\xb4\x69\xa1\x09\x88\xee\x6c\xeb\x1e\x81\x29\x21\xc4\x6b\x20\x12\xf2\xa8\xeb\xd6\x25\x82\x35\x4b\xe2\xf4\xca\x31\x16\x09\xc1\x33\xac\x48\x50\x0e\x23\x57\xed\x58\xb5\x7d\x4c\x85\x91\xce\x9d\x3d\x9d\xf6\x00\x54\xae\xb1\xe6\x72\x24\xcf\x6f\x67\xf7\x7f\x64\x1f\x1a\x7a\xf7\x02\x07\x9a\xa5\x1c\x03\x76\x7a\xb5\xb2\x72\x67\xcf\x31\x6e\x11\x11\xf3\xb3\x58\x54\xc0\x72\x5d\x31\x7c\x62\x65\x4d\x2f\x38\x71\xa2\x3f\xa1\x94\xa0\x25\x13\x5a\x55\x81\xf5\x07\xc6\x0b\x5e\xdc\xc1\x6b\x6a\xb5\xc4\x28\x55\x6f\xd8\x21\x6d\xec\x1d\x07\xbe\x37\xfe\xd4\x67\x3e\x21\xfb\x93\x3d\x8a\x20\xda\x1c\x57\x98\x93\x58\x15\x3a\xf0\xf9\xac\x6c\xe4\xd4\x6d\xa7\xbb\xc1\x10\x12\xfa\x9d\x2e\x53\xfd\xab\xeb\x33\xfc\xb9\xc1\x32\xf9\x20\x91\xf0\x73\xf3\x0c\x94\xd3\x1d\xb1\x27\x43\x34\x8a\x2e\x5e\x50\x22\xeb\x6c\xab\x01\x11\x0e\x03\x0d\xaa\x01\xa7\x15\x3e\x7e\xff\x6f\xa0\xb2\xf0\x66\x2c\xb4\x7b\xe5\x56\xa3\xec\xa6\x7e\xc0\xa5\xf8\xfc\x60\x0b\xcd\x2e\xb7\xfd\x32\x3e\xcc\xfa\x0b\x2a\x37\x59\x19\xdb\x0d\x82\x87\x1d\x8c\x58\x4a\xf9\xc3\x50\x5e\xda\xeb\x76\x72\x71\x71\xff\xc7\x99\xf5\xec\xe7\x12\x4a\x55\xa6\x57\xf3\xcf\x09\x12\x38\x86\xed\x48\x24\x2c\x40\x93\x67\xf6\x15\x58\x1d\xa4\x0b\x79\xd7\x80\xed\x55\x99\x42\xaa\xed\xfd\xa7\x3c\x33\x25\xa1\xa1\xdb\xe3\x52\x05\x46\x3d\x44\x81\xad\xf9\x0c\x16\x7e\x23\xb7\x76\x7a\x70\x86\xcf\x28\x60\x2f\x47\xb5\x15\xa7\x54\x1f\xdb\x75\xac\x38\x0c\xa9\xe3\x84\x94\xbb\xcf\x30\x71\x63\x6a\xab\x51\x22\xdf\xae\x36\xcd\x4f\xc6\xbe\xc5\xae\xc9\xc6\x64\xbf\x48\xab\x48\xfc\xb6\xd6\x98\xc3\x48\x5b\x07\x81\xfe\xd4\xd8\xdb\x11\xbc\x05\x4f\x43\x4b\x89\x0b\x6b\x7f\xe0\xc0\x28\x12\xe3\x3c\x32\xd4\xaa\xa4\xe8\xa8\xad\xe3\xe7\xc6\x2e\x9a\x69\x04\x98\x5d\x49\xef\x26\x46\xef\x47\x7f\x2d\x0d\xe7\xd8\x0a\x0c\x4a\x29\x4f\x9f\xe3\xbe\xce\xa7\xb7\xf3\x13\xda\x40\x76\x4e\xec\xe0\x4e\x68\x13\x41\x84\x20\x02\xb6\x53\x4e\xb3\x3a\xe5\x6b\xcd\x07\x8e\x6b\x0e\x29\xcc\xc8\x71\x26\xab\xbb\x05\x7b\x58\x72\x01\x29\xcf\x55\xb6\x64\x3b\xc9\xdb\xab\x6d\xb9\x93\x95\x2e\xad\x4e\x85\x23\x8d\xc5\x6e\xb0\xbf\xaa\xf9\x45\x78\xd7\xae\x13\x4d\xa6\x79\x9d\xda\x79\x59\x77\xeb\x66\xfc\x87\x1b\xec\x0d\x3f\x9f\xfc\xf3\x6d\x57\x3a\xad\x75\x52\xde\x7f\x4a\xb3\x35\x78\xb3\x45\x14\x8f\x75\x91\xc3\x55\xa9\x8a\xfb\xff\x53\x65\x90\x62\x40\x4b\xf5\xcc\x70\x72\xcf\x4a\xd4\x6b\x5d\x82\x12\xc9\x31\xaf\xd0\x09\x39\xfe\x05\x25\x2f\xc3\xaf\xa6\x3b\x5d\xcc\xe7\x97\xff\x71\xf5\x1f\x2f\x5e\x7c\xdf\xae\xff\xfe\xfa\xf4\xf4\xbb\xbf\xd7\x7f\xfc\x2d\xfe\xa3\xdd\x77\x2d\x5c\x01\x6d\xdf\xf2\x58\x9e\xfe\xf0\xc3\xef\x4e\x5e\x3c\x7f\xfe\x3b\xa8\xbd\xe4\xcf\x5e\x97\xe6\x27\xbd\xac\x87\x32\x80\xdb\x0c\x10\x34\x67\xba\xcd\x18\x0f\xc5\xb9\x59\xc1\x2c\x88\xf6\x37\x0b\x64\x69\xb4\x4a\xb3\x4a\xb0\xe6\xd2\x94\xae\x76\x39\xb4\xb1\x13\xa1\x28\xff\x8e\xed\x2e\xed\x22\xee\x10\x4a\xb3\xc5\xe2\xbc\xd5\x35\x3a\x5c\xf1\x90\x2a\xe4\x1b\x86\xb1\x2c\x8d\xb5\x17\x1a\x7b\x4e\xa1\xf8\x38\xe8\x25\x6f\x57\x28\x27\x82\xba\xa8\x90\x30\x3f\x7c\x17\xe1\x07\xf8\x81\x78\x68\x2a\xc4\x9b\x6f\x0f\x20\x2b\xc2\x15\xe0\x01\x84\x10\xe2\xff\x9e\x63\xe0\x52\xdb\xb8\x40\x9e\xf8\x13\x09\x4c\x95\xea\xf5\x83\x8a\x72\x57\x08\x1b\x0e\x1d\x81\xe4\xed\xc6\xab\xf4\x4e\x97\x35\x02\xdd\xfb\x6f\x6f\x51\x6b\x41\xa5\xb6\x86\x48\x5d\x8c\x75\x15\xd6\x5c\xdb\x59\x0b\x06\xf5\x8e\xc7\xae\x96\x1f\x0b\xb3\xcf\x35\xd2\x8a\xbc\x94\x03\x6e\x33\x48\x9b\xa5\x43\x7d\x0b\x1e\x45\x3c\xa8\xbe\x0d\xb4\x25\xab\x50\x3e\x4f\x52\x18\xfe\xf9\xc6\x98\xfc\x63\x56\x0f\xe5\x11\xb5\x19\xed\xf7\xfb\xa1\xd9\xe9\xa2\xaa\x72\x68\x31\x3a\x1e\x80\x23\x78\xc3\x5c\x77\x72\xd0\xfa\xea\x00\xd9\xdc\x5b\xef\x1b\xe0\x96\x52\xe3\x60\x53\x61\x29\xb5\x2e\x52\x53\x56\x5a\x60\xdb\xec\xd6\xd4\x9a\xa7\x54\x61\x65\xbd\x4e\x19\x3f\x2b\xaa\x4d\xa7\x53\x11\x75\x88\x85\x54\xe3\xc0\x4d\xd2\xfd\x7d\x22\x77\x88\x2d\xc0\x24\x84\x34\xb1\x13\xeb\x77\xfe\x53\x30\xcb\xa1\x10\xdf\x0e\xed\xd0\x3f\x3b\x94\xa0\xc3\x73\xa9\xf2\x5c\xfb\x99\x0f\x64\x61\xac\x18\x1d\x84\xff\x8d\x6f\x21\x45\xac\x09\x5c\xc1\xcf\x4d\xc7\xe1\x53\xe1\x63\x04\xab\x1b\xc0\x46\xe9\x39\xc9\xaa\xa0\x53\xe4\x1b\x2c\x3b\x27\xfa\x41\xc9\x12\x4f\x96\x2c\xf9\x59\xc9\x12\x3d\x92\xf5\xa8\x60\x41\xf9\x38\x33\x0f\x47\x8c\x5e\x54\x8c\xeb\xde\x35\x9b\xfe\x7e\x7c\x76\x23\xff\xe5\x5f\x80\x14\xfc\xd9\x33\xe4\xb0\xba\xfa\xe0\xab\x6b\x85\xaf\xc1\x8e\x80\x67\x02\xb4\x9e\xa7\x73\x80\x8b\xc7\x39\xc0\x3b\xa8\x3d\xcc\x0e\x2a\xed\x3c\x5c\x81\xfc\xf9\x50\x4e\xae\x84\x03\xa0\x99\xbf\x1d\x5d\x5e\xf6\x4e\xcb\x0e\x1d\xe3\xd7\xc8\x05\x37\x9d\xcd\x03\x80\x1a\x46\xa1\x39\x9f\xcc\xc6\x67\x37\x89\x98\x5c\xd1\x4f\x32\x84\xa3\x71\x9c\xd6\x0e\x7c\x26\x79\x98\xd3\xfa\xe8\x33\xcc\xe8\xd7\xb3\xe9\xd9\xed\x6c\x8c\x45\xc6\x17\x72\x7e\xfb\x9a\x6b\xab\xdf\x4c\xa7\xe7\xf3\xa0\x84\x7b\xfe\xca\x71\x59\xdf\xce\xc7\x89\x38\x1f\xdd\x8c\xb8\xf8\xfc\x62\x72\x33\x7f\x65\x7f\x7e\x7d\x3b\x9f\xc0\xba\x41\x26\x73\x76\x7b\x0d\xf9\x57\xf9\x76\xfa\x7e\xfc\xe3\x78\x26\x81\xcf\xfe\x1c\x0b\xa8\x11\x85\x07\xf1\x77\xec\x2e\xb8\xc2\x79\x0f\x52\x84\xc4\x62\x37\xb3\x91\x5d\x82\xf9\xcd\x6c\x72\x76\x13\x7e\x6c\x3a\x93\x37\xd3\xd9\x4d\x48\xc0\x7d\x35\x7e\x73\x39\x79\x33\x06\xc6\xf5\xa0\x92\xfc\xd8\xc1\xf2\x4c\xae\xa8\xb0\xff\x43\x8b\xe6\xdb\x11\xa1\xb1\x94\x3a\x58\x1e\xf1\x64\xea\xeb\xa1\x6f\x12\x8b\xcf\xd8\xb2\x3c\xec\x6a\xb3\x2e\xd5\x6e\x93\x2d\x03\x75\x47\x1a\x61\x71\x90\xe3\x32\x5b\xca\x0f\xa6\x29\xd6\xf2\x48\xab\xc3\x3f\xc1\x37\xec\x07\x87\x4b\xb3\x3d\x1e\x3e\xf0\xdc\xbe\x27\xdd\x64\x5b\xf9\xb6\x49\xad\xf3\x77\x54\xff\xb4\xe9\x3c\xc9\xe1\xaa\xcd\xe7\x97\x5a\x1d\xfa\xec\xa1\x33\xb0\x87\xbe\x3d\xb1\x46\xd1\x67\x46\x26\x44\xbf\x69\x84\xe3\x55\xcb\x8f\x6a\x0d\x0d\x4f\xaa\xb0\xef\xf3\x98\x6b\xc4\xef\xf4\x25\x0b\xa0\x3b\xdf\x56\x95\x7b\x42\x65\x24\xb6\x9b\x59\xbf\x07\x54\xa4\xbd\xd3\xaf\x74\x5d\x2d\xd5\x4e\x57\xf6\xe5\x3d\x2c\xc4\xc0\xbf\xbc\xe2\x36\xa1\x72\x99\xa9\x9c\x50\x1b\x8a\x93\xe0\x57\x0d\x32\x27\xfb\xf6\x2e\x2d\x1e\xb4\xc4\xd4\x46\x2b\xc4\x82\xc1\xbb\xb4\xff\x83\xc8\xca\x6d\xa8\xe5\x2e\xd5\x48\x49\xed\x38\x79\x42\xcd\x9f\x40\xb7\x33\xda\x7f\xb3\xb3\x6f\x12\x39\x9b\x8f\x12\x99\x6f\x54\xb5\x49\xe4\xb9\x55\x7c\xba\x5e\x0e\x13\xb0\xef\x5e\x01\xfc\xc1\x4f\x0d\x51\x64\xdb\x15\xb7\xbf\xc6\x91\xd8\x7f\x45\x76\x11\xcb\x91\x33\x80\x5a\x6f\x16\x99\x75\xbf\xef\x74\xe9\xaf\x04\x40\xb7\xf5\xa6\x1a\x82\x7c\x84\x7c\x65\x35\x10\x39\xe7\xa9\x06\x64\x1c\x2f\x8b\xa2\x57\x16\x03\xee\x6c\x04\x10\xa9\x02\x39\x78\x46\x3d\x77\x0c\x5a\x67\x6f\xbf\xb3\x0e\xf4\x24\xe3\xf0\x99\x54\x0b\x04\x9b\x60\x12\x78\x44\x42\x46\xd8\xe5\xba\x25\x8e\x0d\x53\x02\xf0\x99\x4a\x42\x01\xc4\x66\x3a\xb1\xd0\x80\x63\x59\x38\xbe\x26\x30\xf2\xb1\xd9\x9f\x38\xbd\xe9\x02\xdf\xa9\xd2\xb3\x17\xb1\x7c\x35\x44\x1b\x90\x55\x62\xa9\x0a\xea\x59\x27\x00\x82\x2d\xb6\x62\xd5\xfa\x17\xc0\x89\xd8\xea\x0a\x2a\xb6\x54\xed\x1a\x4c\x81\x55\xbd\xd9\x41\x53\x63\xd1\xb2\x67\x8f\x4c\x01\xa4\xe5\xa6\xe4\x27\x1c\xf7\x18\xb3\x34\xdd\xff\x14\x7e\x4a\xc7\x3b\x90\xce\x3b\x10\x7f\xf7\x50\xfe\x56\x1e\x8a\x46\x43\xf2\x21\x4b\xf2\x2f\xbd\xe5\x06\xc8\xe3\xb1\x37\x65\x2a\x9f\x45\x0f\x7b\x26\xe9\x04\x41\x44\xd2\xca\x63\x46\xb0\x43\xa6\xc9\x0a\x5d\x79\x2c\x5e\x3e\x7c\x0b\x9d\x15\x6b\x01\xc7\x9c\xb5\x42\x3c\x3c\x86\xaf\x78\x79\x72\x8c\x5c\x18\x84\xbc\xeb\x70\xb6\x8b\x83\x7c\x9f\x15\xa9\xd9\x57\x0c\x39\xb3\x44\xd9\x04\x64\xb0\xb0\x3f\x18\xdb\xa8\x57\xc7\x1e\xee\x5e\xed\x76\x15\x45\xdb\x4c\x79\x90\x47\x61\x53\x82\x7d\xc6\x31\xbc\x2a\xc6\xf5\x2e\xba\x0b\xfd\x39\x8b\xfd\xc9\xb7\xfe\xe7\x2c\xf0\xf1\x6c\x72\x26\x3f\x4c\x6f\xaf\xde\x3c\x6c\x78\x07\xad\x8f\xe2\x2f\x36\xbb\x65\xd7\xec\x16\xbf\xd1\xec\x96\x5d\xb3\x5b\x60\x47\x1e\x59\xc5\x4f\xb0\xb4\xe5\xe3\x96\xb6\xf8\x42\x4b\xbb\x77\x21\x02\x4b\x5b\x7c\x91\xa5\x2d\x1f\xb5\xb4\xc5\x97\x59\xda\xf2\xf3\x96\xb6\xf8\x42\x4b\x5b\x3e\x66\x69\x8b\x2f\xb1\xb4\x1f\x81\xbb\x94\xd3\x0b\xd1\xb6\xb4\x83\x1c\x56\xc8\x27\x05\xb9\x2e\x30\x4c\x3c\x92\x00\xf4\xd7\xe7\xf9\x21\xc0\x6c\xe1\x34\x82\x29\x45\x70\x96\x59\x31\xc2\x49\x5f\xaa\x82\x43\x00\xd0\xd9\x91\x0e\x65\x36\xd4\xc3\xee\x27\x2a\x6b\x99\x5a\xa5\x83\x35\xf3\x08\xfd\xb5\x83\x1e\x29\x80\x59\x2b\x50\xb1\x47\x43\xe4\xb1\xff\x57\x8f\x90\x64\x55\xc7\x9b\xab\x5b\x79\x0d\xe3\x15\xd4\x93\x31\xfc\x6f\x7f\xef\xf3\xfc\x77\xf8\x6f\xf8\xd5\x9b\xeb\xcb\x93\xaf\x87\xcf\x4f\x4c\x91\x1f\xfe\x03\xf8\xff\x4f\x9f\x7f\xfd\xe2\x9b\xef\xda\xf1\xff\x6f\xbf\xfe\x3b\xfe\xcb\xdf\xe4\x3f\x7b\xb0\xde\x8c\xaf\xc6\xb3\xd1\xa5\x8c\xd9\xe1\x85\xf8\x91\x74\xc1\xd7\x89\x7c\xf1\x83\xfc\x7d\x53\x68\xf9\xe2\xf9\xf3\xef\x43\xff\xe4\xcf\x9f\xe0\x57\xf2\xc2\xba\x8c\x73\xbe\x81\x2f\xac\xdb\x46\x4d\x60\x93\x62\x39\x94\xff\xb0\xa9\xeb\x5d\xf5\xf2\xab\xaf\x56\xd5\x0a\xa2\x5f\xff\x28\xc4\xf8\x4e\x97\x07\x53\x80\xe3\xe1\xad\xe6\x10\xec\x25\x40\x14\xb9\xd3\xe5\x42\xd5\xd9\xd6\xb5\x25\xac\x22\x48\x33\xc1\x76\x23\x72\x16\x80\x5e\x02\x36\xd7\xda\xe1\xc5\x59\xbb\x0d\x7c\xf0\xeb\x52\xab\xed\x22\xd7\xa8\x2b\x61\xfe\x88\xb5\x46\x0a\x26\x04\x8a\x54\x12\xe9\x4b\xb9\x4f\xcb\x81\x51\xae\x80\xc9\xd9\xe3\xcf\x10\x7b\xde\xc7\xac\x00\xae\x4a\x04\x47\x09\xd5\x71\x45\x7c\x00\x5b\x03\xbd\x03\x01\x72\x0d\xf3\x7b\x23\x66\x7e\x8e\x5f\x95\x18\x7a\x44\x68\x43\xc0\x8b\x51\x1f\xb5\x50\x7b\x75\xb0\x36\x52\x09\xc3\x4a\xad\x71\x67\x64\xb5\xe1\x27\x51\xa3\x5d\x4d\x34\x94\xd5\x50\xbe\x3e\x50\x27\x26\xd0\xe3\xc4\xd3\x15\xdd\xe9\x86\x4c\xb7\xeb\x06\xea\xb7\xb4\xfe\xfc\x0b\xad\xbb\xee\xd2\xc0\xe0\xc1\x91\xbb\x76\x72\xe2\xa1\x25\x4b\x70\xd7\xd9\x9f\x85\x10\x43\x8c\x6d\x93\xe7\x00\xe2\xd3\x54\xba\xac\x86\xe2\x3d\x51\x07\x3c\x2c\x58\x8c\xca\xf6\xc8\x0e\xf2\x82\x5b\x67\xc8\x4e\x82\x5f\xf8\x4a\x22\x46\x3c\x30\x64\xa8\xbc\x32\xc8\xd1\xc6\xd0\xf2\xc0\xe1\x49\xb8\xbc\x84\x44\x6b\x17\x7e\x71\xb0\x03\x14\x04\x0a\x8f\x24\x23\xd6\x00\xc7\xb0\x45\x06\x0e\x36\xac\x15\xcd\xbe\x4a\x64\x6d\xcc\x50\x88\xf7\x1b\x5d\xc8\x3d\x70\xca\x28\x60\x9e\x8e\x66\x9f\xd8\x3f\xd9\xc9\x01\x5f\x41\x49\xd8\x75\xb4\xde\x09\x91\x43\x67\x4b\x3d\x94\xd3\xa6\x14\xfd\x33\xed\xca\x8b\x5f\x75\x70\x3f\xad\x61\xcd\xa0\xcf\xfc\x6c\xd1\x4f\xbc\xda\x1a\x9e\x3c\xa2\x9d\x2e\xd7\x9a\xa1\xf7\x80\x51\xc2\x3e\x72\x9f\x55\x9b\x63\x84\xfe\x17\x07\x68\x15\x02\xd0\xea\xc8\x69\x35\x25\xac\xd2\x5a\xd7\x70\x1c\xe9\x8b\xaa\xb0\xff\x4c\xfc\xe8\xec\x67\x50\x9e\x44\x84\x48\x43\xae\xd9\x2e\xd3\x4b\x1c\x5d\x06\xd8\xcb\x85\xde\xe3\x38\xfd\x62\xa3\x7f\x49\x8f\xb3\x3e\x83\xfd\x01\x82\x0c\x29\xe0\x2d\x81\xbc\x64\xc5\x1a\xce\xa5\x61\x60\x2a\xdc\x32\x0c\xd5\xc1\x56\x14\x1a\x57\x70\x57\x6a\x28\x3c\x46\x24\x23\xf4\xa5\x52\x5d\x00\xcf\x86\x7d\x03\x3e\x11\xbf\x08\xe8\x7f\xd5\x47\xf7\x27\x63\x97\xbe\xd4\x0e\x5a\xb0\x24\x96\x69\x40\xff\x5c\x19\xa8\xd7\xe4\x1d\x59\xea\x12\x1c\x7a\xaa\xb3\xc2\xea\xbe\x4c\x57\x22\x6b\x93\x9e\x44\xca\x2f\x14\x20\x24\xef\x00\xe7\x09\xf1\xb1\xb2\xfa\x65\xf7\x79\x80\xd2\x44\xe8\xa1\x5e\x0a\xec\xd3\x70\x8a\x43\x01\x79\x24\xfd\x8b\xc2\x72\xec\xc7\xde\x8f\xa1\x27\x5e\x7c\x4f\xc3\x09\x95\xba\xd6\x9f\x16\x70\xa6\xe5\x4a\xd3\x54\xc1\xab\xdb\xa9\x0a\x21\x87\x5a\x50\xc1\x01\x47\x14\x8d\xaa\xf2\x3b\xc9\x40\xe8\x01\xfb\x5d\x4b\xb8\xeb\x8d\x3e\xc0\x59\x4b\x9c\x00\x06\x42\x87\x4b\xe5\xe4\x71\x28\x47\x45\x2a\xdc\x90\xaa\x8d\xd9\xa3\x48\x93\x84\x80\x89\x5c\xc1\x00\x0f\x28\x45\x98\xbb\xa2\x2d\x14\xe2\x9c\x12\x42\x25\x8d\x31\xd2\x43\xd7\x97\x7d\x72\x45\x81\x8a\xbd\x91\x55\xad\x77\xd5\x4b\x79\x74\x7a\x2c\x55\x55\xe9\xb2\x16\x01\xab\x77\xd1\xda\x56\x2b\xd0\x47\x2f\x8e\x89\xd2\x09\x65\x2e\x40\x5b\x5d\x67\x77\x2c\x70\x80\x3b\x2a\x76\x1d\xcc\xb4\x24\xdc\x3d\x8a\xa6\x38\x11\xa1\xfd\x86\xf8\x89\x9b\xd3\x33\x0c\x2e\xa2\x8e\x7b\xc6\x93\x01\x85\x0b\x93\xbc\xbe\x94\xcb\x5c\xab\x32\x3f\x48\xfd\xcb\x2e\x27\x82\x2f\x55\x8b\x9a\x00\xd5\x23\xd8\x55\xd4\x17\x59\x4b\xdf\x23\x4d\xec\xc2\xd4\x1b\xd4\xf6\xf1\x3b\x45\xa5\x3e\x6a\xff\x36\x82\x11\x67\x60\x5a\x86\x95\x75\xf7\x0d\x90\x09\x95\x1f\x35\x44\x44\xc9\x21\x49\x70\x03\x71\x54\x19\x28\xe4\x45\xae\xb7\x31\x9a\xab\xa3\x9b\x4f\xa5\x2e\x4b\x03\x50\xe0\x14\x7e\xc6\x91\x58\x39\xf7\x2c\xf7\xf4\xbe\xa1\x10\x73\xb3\x85\x15\x83\x40\x6b\x5b\xef\x5a\x0d\x81\xb3\x62\xa6\x27\xe0\x16\xaf\x6a\x7b\xbf\x99\x52\x96\x4d\xe1\x26\x11\x5d\x9a\x91\xd2\xcb\x8a\x2a\x43\x0e\xd5\x6d\x22\x55\x5e\x6f\x4c\xb3\xc6\x48\xd7\x56\x15\xcd\x4a\x2d\xeb\x06\xf0\x2d\x50\xb7\x55\x86\x32\x21\x76\xa1\xed\x05\x09\x11\x34\xeb\xd7\x65\x45\x50\xe3\xec\xa2\x65\x2a\xdb\xe2\xdc\x70\x6f\x8b\x35\x6f\x43\x70\x31\x04\xb6\x84\xdf\x36\x6b\xcd\x54\x87\xaa\x46\x14\x34\xb9\x53\x75\xad\xcb\xc2\xeb\x83\x05\x04\xd1\x96\xcb\xa6\xe4\x08\xb4\x50\xa5\x56\xf4\x32\x4c\x2e\xaf\x4c\x48\xd6\x5b\x39\xb0\xb9\xfd\x26\x5b\x6e\xc0\x16\xb4\x6a\xa1\xd2\xf9\x81\x28\x5f\xd0\x86\x83\x6b\xbc\x29\xa8\x72\x13\x7a\x3a\x02\x65\xba\xd7\xa8\x4b\xfd\x4e\xd8\xe5\x70\xbe\xec\xca\x49\x13\xe8\x75\xb3\xc9\x16\x59\x4d\xac\x6e\x60\x76\xf1\xcd\x66\x2a\x9f\x91\x87\xd8\x17\x43\x62\xa3\xf8\xa8\x32\xab\x80\xb6\xaa\xaa\x15\x00\xef\xc2\x12\x13\x18\x7e\x6a\xc0\xb4\x81\xc1\x00\xb2\xae\x2c\xb5\x4a\x89\xc6\xd6\xda\x55\x14\x6e\x77\xb0\x63\xa0\x05\xed\x1b\xe9\x9b\x08\x6c\x6f\x77\xb6\x23\x18\x6f\xae\x2f\x01\x8d\xd5\xde\x4d\x7c\x3b\xa1\x96\x69\x69\x72\xb2\x9e\xc4\x45\x56\xd8\xd1\x25\xc4\x4f\xc7\xe1\xf3\xcc\x1e\x23\xe0\x59\xb4\x8b\x04\x45\xb1\xaa\xa8\x91\x21\xdd\x09\xdf\xce\xfe\xd9\xce\x1f\x41\xd6\x04\x81\xe8\x39\x2b\x9a\x3f\x80\xb0\x7f\xc4\x16\x47\x1a\x04\x8b\xe8\x28\x92\x0e\xd1\x6b\xbe\xc6\x0b\x86\x34\x3e\x21\x04\x43\x68\xbd\x68\x6a\x40\x09\xb4\x46\x3b\x08\x8c\x61\x36\x81\xd4\xc0\x42\x5a\x03\x03\x8e\xe4\x9d\xc9\x30\x7a\x4c\x78\xc8\x32\xb5\xf2\x59\xe2\x29\xe7\x01\xa1\x49\x07\xeb\xa3\x22\xeb\x40\x2e\x61\x0a\x70\x6f\x64\x35\xf1\x05\x64\x77\x1a\xc8\xaa\xcc\xae\xcc\x74\xad\xca\xc3\x50\xde\x18\xc1\xd7\xbe\xdd\x2c\xaf\x85\xb0\x21\x86\x94\x10\xbf\xce\x07\x42\xb8\xc0\x23\xb8\xf2\xe9\xcd\xa2\x30\xc5\x89\x1d\x0a\x39\x03\x24\xdd\xbd\x44\x15\x94\x73\xdb\x1d\x80\x09\xbb\x93\x9c\x08\x93\x0d\x94\x69\xb3\x0f\x1d\xcf\xde\x21\x1d\xd0\xd9\xf4\xea\x7c\x82\xfc\x34\x42\x4a\xf9\x7c\x28\xcf\xb5\x43\x7a\xc0\xca\xc5\x41\x08\xd7\x3d\x40\x8b\x13\xf6\x91\x8f\xca\xd7\x4e\xe2\x1e\xb4\xaa\x87\x42\x0c\x9c\x03\x38\x40\xf3\x19\xc9\xc9\xdc\x55\x76\x02\x84\x8d\x80\xee\x89\x7c\x13\x9c\xd8\xeb\xf3\x92\x12\xa4\x7c\x52\x95\xac\xf4\x36\x03\x28\x9a\x65\x0d\xa5\x24\x15\xb8\x50\x03\xbb\x6c\xd7\xb8\x9a\xe1\x90\x11\x95\x9c\xde\x08\xb1\xab\x7d\x84\xb7\xde\x47\x10\x00\xec\x07\xf4\x09\x74\xf0\xd2\xb4\xd4\x55\x85\xb7\xc7\xe0\x60\x9a\xc1\x50\x0e\xe8\xe3\xba\xa2\xda\x1e\x6f\xa7\x0c\x1c\x4b\x56\xcc\x89\x62\xca\xb5\x2a\xb2\x5f\x19\xd2\xc4\x9a\x97\x03\xbc\x67\x07\x52\xe1\xb8\x70\x89\xd8\xbd\x05\x6b\xd2\x5a\x48\xa9\xda\x21\x7d\x9c\x41\xc8\x69\x5e\xff\x3d\xb2\x85\x09\x25\x57\xaa\xda\x64\x04\xa4\x9c\x95\x98\x3d\x62\x93\x21\xac\xf5\xc1\xb5\xad\x37\xaa\xa0\x8b\x02\xcc\x51\xa8\x8f\xb1\x36\xdd\x12\x4d\x0d\x54\xe2\x1e\x4e\x73\x4f\x54\xec\x54\xcd\xa3\x68\xdc\xc1\x15\x3b\xe0\x21\xd9\x5b\x3f\x23\xf7\x08\x0c\x5e\xfc\xf2\x80\x19\xc7\x06\x9d\x4f\x0d\x85\x18\xc9\x01\x27\x4b\xed\x6f\x06\xb4\x0e\x04\xb2\x0d\x14\x69\x85\x7b\x23\xed\xb2\xf4\x0f\x77\x6c\x66\xf6\x2e\xa1\x3f\xd3\xfa\xda\x83\xab\xd6\xaa\xd6\xdd\x25\x4e\x41\x3a\xc0\xd8\xc7\x5b\x2f\xc3\x3c\x6c\xe2\x6b\x8f\xfc\xc2\x89\xbd\xd7\x0d\x68\xef\x96\x7a\x59\x23\x8b\x7c\xa5\xad\x3c\xaa\x32\xcb\x0f\x8c\xfe\x8e\xf7\xd7\xca\x6e\x04\x96\x0c\x77\x38\x23\x22\x7c\xdb\x84\xf3\xc0\xfa\x17\xbd\x44\xaa\x96\x0c\x4c\x3d\x25\x59\xff\x39\x58\x59\x70\x2d\xac\x51\x9d\xdd\x29\xb4\xb6\x0f\x43\x3b\x69\x98\x66\x90\x99\xae\x1e\x50\x12\x47\x8f\xa5\x27\x8f\x13\x41\x22\xe1\x83\xbd\x11\x46\x7a\xc2\x5c\x77\x95\x81\x6c\x76\x53\xd4\x25\x58\xfb\x8e\x8d\xe2\x0e\x71\x3b\x55\x25\xf6\x3a\xcf\x69\x1b\x90\x7c\xb0\xb5\x07\xf6\x6c\xda\x53\x4e\x37\xbf\x9b\x00\x68\x03\x0d\x54\x72\xfc\x60\x22\x50\x70\x24\x14\x40\x7c\x80\x46\x3c\x75\xb9\xca\x77\x60\x06\x14\xb5\x2e\x55\x00\xda\xaf\xe0\xb2\xb3\xf7\x19\x18\x47\x7e\x3d\x45\xa1\xeb\x3d\xd0\xaf\xc0\xe7\x0a\x43\x68\x39\x48\x13\xaa\xc8\x30\xa6\xb8\x90\xe3\x4e\xb4\xb2\x5a\xf8\xb7\xdc\x69\x7c\x3c\xfc\x62\xa5\x96\x9a\x79\x26\x2b\x39\x18\x39\x6c\x1d\x2d\x2f\x01\xf1\xff\x0a\xd3\xee\x03\x5a\x51\x41\x14\x1b\x48\x89\x17\xe4\xa8\x14\xbe\xaf\xc8\xf8\x9a\x74\x24\x74\xf9\x41\x5a\xb3\x00\x24\x0c\xb3\x92\x78\xb5\x59\x4f\xc1\xbd\x19\x83\x0d\xee\xdd\xdd\xf4\x2f\x7b\x0c\xb5\xce\x73\x74\xaa\x68\x8d\x1e\x37\xd0\x49\xdd\x1c\x71\xc9\x42\x44\xec\x08\x93\xd8\x07\xf4\x76\xa5\x16\x9c\x81\x25\xdf\xdf\xa9\x54\x44\x70\xc7\x35\xf5\xcf\xed\x6a\x62\x1c\xe9\xc6\xec\xed\xb6\xdf\x65\x7a\xef\x09\x7c\xbb\x2c\xd7\xf6\x39\x7e\x1b\x08\x4c\xb9\x02\x7a\x19\xcc\x31\x63\xb3\xb7\xd9\x6e\x55\x91\xa2\x3a\xde\x11\x88\x09\xdf\x2c\x4a\x6e\x75\xd1\x24\xe8\xb1\x12\xeb\x5f\x56\xeb\x2d\xa7\x9d\xe1\x49\x5b\xad\x6b\x42\x29\x5e\x96\x59\xad\x4b\x4c\x26\x4b\x29\x4f\x87\x72\x8e\x1e\xe4\x99\xf5\x20\xf1\x26\x1f\x04\x4e\xe5\x00\x43\x58\x91\x1a\xc2\xcb\x7e\xa5\x4b\xab\xfb\xb8\xb8\xc1\xad\x09\x84\xa6\xe0\x3c\x8a\xb8\xa1\xd0\xba\x0b\xf5\x50\x0e\xa6\xc8\x6e\x85\x4f\xf7\xa7\xca\x9a\x13\xf4\x62\x5f\x30\xe1\x75\xed\xdc\x1a\x9e\xaa\x4c\xe5\x84\x17\xcc\x7f\x39\x58\x44\x3c\x87\xa8\x83\xb1\x0c\xc9\xac\x56\x19\xd8\x55\x15\x3d\x41\xa4\xd6\x78\xc0\x1a\x17\x05\x7d\x94\xeb\x22\xfb\x55\xa7\xee\x03\x95\x5c\x98\xf4\x90\x48\x03\x74\x16\x58\x8f\xa0\x98\x86\x81\x5e\x54\x79\x5e\x12\x0a\x08\x20\x7c\x4f\x93\x2b\x17\x26\xdb\x5a\x9d\x94\xab\x62\xdd\xa8\xb5\x4e\xa4\x29\x68\x78\x99\x75\xd7\x52\x6b\xa2\x61\xbe\x7a\x6b\x8a\x75\xe0\xa8\x0a\x3b\x69\x50\xa7\xa4\x56\xf8\x11\xbc\x3d\x73\x70\x54\x00\xb6\x4b\x59\x45\x36\x70\x77\xa1\x55\xc4\xde\x60\x08\x52\xdb\x70\x63\x84\x37\xa9\x70\xfb\x05\x42\xb4\xdf\x18\xa4\x34\x55\xb5\x3c\x52\xc7\x18\x32\xa5\x62\x21\x5a\x82\xc2\x94\x5b\x95\xbb\xbd\xc1\x6a\x13\xbb\xcb\x4a\xbe\x53\x3f\x01\x75\xdb\x76\x67\x0a\x17\xaa\x76\x6e\x0f\xc4\xf9\x9c\x01\xa0\xea\xee\xc7\xe1\x70\x2f\x8e\x05\xb1\x88\x01\x03\x38\x14\x15\x23\xb6\xba\x67\x1a\xdd\x3b\x52\xe2\xfe\x07\x21\x87\x98\x2b\x1b\x13\x4a\x76\xc5\x06\x04\x14\x07\x67\x25\x27\x2e\x31\xb3\x22\xd3\x7f\x89\x08\x5f\x3d\x43\x05\x5c\xe5\x76\x28\x47\x72\xd0\x1a\xc4\x20\x71\x55\x5d\xd0\xca\xf4\x4b\x9d\xb0\x9c\xca\x2d\x7c\x94\xc0\xd8\x54\x0e\x7e\x02\x7c\x49\x1e\x7d\xd4\x65\xa1\x73\xab\xd8\x8b\xd4\xec\xc9\x17\xc5\x95\xa9\x8c\x34\x85\xe3\xb6\x75\xb5\x09\x88\x08\x6d\xe5\x04\x3f\x2c\x8e\x90\x6f\xf6\xd8\xde\xc1\x38\x3f\xd4\x75\xb1\x50\x94\x8d\x55\x1f\x20\xb1\xd8\xf8\xaf\x4b\x67\xe4\x53\x0d\x8c\x93\x0d\xfc\x5c\x01\x5d\xb4\x74\x62\x19\xc6\x40\xd7\xc1\xf7\xac\xeb\x9f\xd5\x2c\x9e\x67\xa6\xc4\x08\x1d\xe4\x38\x51\xbd\x44\x6a\x24\x8b\x9f\x88\x55\x38\xb8\x44\x79\x1e\x44\xb5\xb0\x52\xce\x7b\x86\xe8\x66\xd5\x3a\xe1\xb0\x03\x49\x0e\xa6\x7d\xdb\x33\x3d\x86\x61\x01\x3b\x17\xbc\x0c\x9f\x46\xa0\xee\x0e\x6d\x9f\x27\xea\x93\xb2\xd5\xb2\xcc\x76\x35\xd7\x16\x02\xb3\x35\x7a\x6f\xde\x50\x18\x8a\xb7\x4c\x3c\x98\xd5\x9e\x96\x97\xcf\x1b\x3f\xf5\x59\x25\xdb\x47\x15\x56\xb4\xed\x2e\xd6\xc6\x20\x57\x22\xfd\x21\x4a\x5b\x47\xa1\x60\x96\xdb\x92\x1c\xb3\xc0\xc2\xcc\x0a\xa6\x34\x43\x96\xbe\x78\xc4\xc1\x89\xe4\xf2\x98\xb6\x4d\x8e\xb1\x2b\x17\x23\x8d\x76\x51\xd0\x25\xe1\xae\xfb\xc0\x78\x70\x9e\x98\x5c\x65\xd0\x5d\x18\xf3\x19\xf3\xa1\xc1\x3f\xae\x4c\x19\x48\x17\xd7\x4d\xb5\xce\x15\xe6\x61\x52\xaa\xed\x61\xe2\xd9\xf4\x50\xa8\x2d\x65\xf5\xf3\xac\xf8\xa8\x53\x51\x35\x0b\xb7\x32\xae\x16\x8d\xed\x7e\x3e\x28\xf0\x85\x30\x90\x45\x71\x37\x7f\x87\x2e\x0e\x22\x2b\xea\x6c\x6b\x2d\x8f\x54\xd5\x2a\xa6\x84\x22\x4e\x22\x10\x84\x55\x6e\xf6\x01\x49\x96\xc1\x98\x89\x1b\x83\x4f\x97\x45\x05\x82\x74\x89\xdd\x00\xb3\x78\xf7\x6c\x60\x5c\x3e\x14\x20\x67\xe2\x73\x18\xb6\x04\x97\x5c\x96\x9a\x8f\x80\x88\x88\x3a\xc9\xe9\xea\xbe\xb9\xef\x75\x78\xf1\x3f\x38\x98\xf8\x9c\xb6\x35\x1e\xc6\x59\x54\x8d\x21\x6d\x9a\x18\xa2\x8c\xbd\x56\x55\xb6\x0c\xe8\x17\xac\xb7\x18\xd4\x0a\xb7\x49\x12\x43\x92\xd2\xd2\x73\xe0\xb1\xd9\x86\x24\x6c\x2b\x6f\x09\x0a\x0a\x22\x5f\x73\x60\x1e\x22\xab\xd6\xee\x2b\x4b\x7d\x67\x90\xc4\x32\xa8\x4c\xd4\xcc\x8f\xd8\xad\x48\xa4\x98\x22\xbf\x5e\xff\x62\x1d\x9c\xcc\x1a\xaa\x6a\xb5\xca\xca\x6d\x85\x11\xee\xa6\x70\x3c\x4c\x51\xf8\x99\xd5\x8a\x3f\x7c\xce\x7f\x83\x65\x35\x4d\xbd\x6b\x88\x16\xa8\x6c\x8a\x02\x7d\x9f\xd0\x57\x94\xed\x42\x5b\x3f\x1a\x01\x97\x1f\x55\xbb\xe1\x93\x12\xaa\x4a\x25\x20\x02\x04\xdc\x09\xa9\xdc\xe2\x87\xc7\xcc\x65\x22\x28\x32\xab\xa2\xc8\xbd\x59\x01\x9e\x0b\x5e\xaf\x5c\x8a\x68\x8f\xc6\x9d\xca\xf1\x56\x0e\xea\x11\x17\x41\x44\x42\xe4\x6a\x3f\x14\x98\xb3\x50\x07\xf0\x6d\x12\x58\x14\x32\xfb\xd1\x77\x8d\xc6\x14\x24\x3d\x52\x13\x78\x27\xce\x6d\x15\x21\x54\x93\x27\xd6\x80\xf1\x72\x66\xda\xb3\x31\x71\xae\x35\x2b\x90\x2a\x13\x33\x96\xde\x40\x17\xad\x77\x1b\x97\xea\x22\xe9\xaa\x8c\x15\x16\xcf\xae\xb5\x51\x77\x54\x8f\xb3\x45\x5f\x2d\xb2\x5c\x3d\xc8\x68\x8e\x7e\xc5\xc1\x34\x89\x63\x08\x4c\x35\x25\x0c\x63\x0e\x88\x15\x86\xc4\x0b\x7c\xae\x7d\x0f\xc5\x84\xe2\xea\x59\x48\x10\x1a\xa8\x26\x72\x51\xec\x5e\x2a\x45\x24\xc0\x62\x3a\x7c\x7b\x51\x72\xe1\xa7\xf0\x06\x4d\xbc\xc0\xa0\xb2\xdc\xb6\x59\xb9\xc0\x20\x64\x53\xb9\x18\x4a\x38\x46\xb7\x65\x02\x97\x8d\x66\x8a\xd9\x24\x08\xc6\xcb\x70\x21\x4c\x81\xdb\xb3\xd0\x1b\x95\xaf\x12\x3a\xd8\xf0\x2b\x0c\x34\x50\x9d\x2b\x8f\x24\x91\xae\x4e\x0b\x63\x8d\x14\xad\xc6\x55\x87\xd3\xc2\x6e\x3c\xc6\xbf\x28\x21\x07\x4f\x74\xb3\xd0\xa9\x70\x04\x3c\xa6\xa9\x39\x99\x90\x95\xd4\x44\x6c\x0a\x60\x4b\x87\xb5\x3c\x20\xcf\x9e\x5b\x34\x2e\xce\x72\x44\xeb\x59\xb9\x6c\xb6\xd6\xea\x87\xc2\xf2\xb0\x58\xc3\x0a\x88\xb5\xcf\x5d\xd0\xd3\xcb\xa7\x20\xbd\xb2\xd0\xb9\xd9\x03\x59\xaf\x63\xdb\x6f\x95\x64\xbc\x92\x15\xf1\xd4\x9d\x3e\x27\xd6\x9c\xac\x96\x4d\xe1\xf8\x29\x1d\xcc\xd5\xb5\x4f\x58\xdc\x62\xc2\x02\xbd\xef\x19\x1e\xd5\x0b\xbb\x38\xa3\xa2\xce\x4e\xce\x60\xc8\x8c\x8e\x7c\x09\x07\xf1\xca\xc4\xca\xa5\xcd\x4e\xc9\x17\xbd\x35\x91\x38\x3c\x8c\x90\x85\x00\xf1\xb4\x84\x7a\x74\x55\x35\xa5\x16\x7e\x85\x02\x66\xe0\x5c\xed\xe5\xaa\xc9\x57\x59\x9e\x83\xcc\x04\x2c\x76\xf4\x79\x42\x4d\x3b\x3d\xe5\x7b\xe7\xfd\xe4\x7a\x1a\x44\x8b\xea\x52\xab\xfa\x20\x55\x6a\x76\x35\x06\xbd\x5e\x3c\x97\xe7\x7a\xa9\xb7\x0b\x5d\xca\xd3\x1f\x7e\xf8\x0e\x8e\x53\x95\x6d\xb3\x1c\xfa\xe2\xf7\x95\x13\x0f\x6b\x7d\x20\xc5\x30\x62\xfa\x14\x6b\xda\x37\x5e\x04\xce\xd1\xd0\x1c\x2a\x2e\x4b\xc0\x93\x05\xfe\x7a\xac\x20\x13\xca\xd3\x33\x1f\x33\x52\x1b\xee\xcc\x5e\x83\xf7\xb0\x32\xe5\x22\x4b\xe3\x97\x00\x8d\x63\xdf\x8a\x55\xad\x90\x02\x72\xfc\x47\xe3\xcb\x2a\x5a\x76\x50\xa3\x02\x61\xa7\x40\x5a\x48\x11\xf7\xdc\x88\x7d\x84\x98\xf1\x14\x14\xa5\x7a\xb9\xd0\x1c\x66\xe2\x11\xc8\x6b\x83\x24\x82\xec\x25\xa0\x19\x13\x21\xbe\x06\xc6\x89\xa0\x40\x82\xc2\xbc\x0c\x92\xa2\x82\xc3\xa8\xd6\x56\xd1\xd6\xa1\x49\x0b\xe6\x48\x82\xc7\x12\x93\xa0\x65\xca\xb1\xae\x67\x02\x17\x93\x66\xf6\xc0\x6a\xca\x07\x57\xd3\x01\x82\xf9\x43\xfb\x23\xd7\x47\x9d\x31\x32\x5c\xac\xeb\xfb\x0b\xa8\x9c\x9d\xf0\xac\x8a\x6c\x18\xbc\x53\x38\x0e\x27\xb2\x3a\x61\x1a\xd0\xad\x4e\xb3\x66\xdb\x66\xd2\x22\x21\xaa\x76\xd9\xb2\xc1\x2c\x2a\x98\x1d\x3e\x54\x95\x1f\x98\x41\xd0\x1a\x28\xc0\x92\x4e\x55\x5e\x8f\x06\xb4\x5e\xc9\x8f\x5a\xef\xec\x86\xa9\x25\x46\xc9\xb9\xbf\xc5\x6a\x17\xb4\xe0\x99\xc8\x2b\xe4\x72\xe7\x40\x09\x5b\x24\x9e\x18\x3c\x25\x57\x1d\x01\x7e\xc8\xf4\x26\x2d\xfc\xbd\xcf\x53\x70\xef\xcc\xc3\x03\x60\x6a\xf0\x45\x85\x70\x4e\xd8\x86\xca\x71\xb5\x57\xa0\xd2\xd7\x19\xb3\x5b\xfa\x42\x87\xfe\x38\x97\x54\x70\x97\xbb\xbb\xcd\x47\xba\xdd\x36\x62\x01\x0e\x52\x1b\x67\x4b\x30\x46\x0a\x43\x3f\xdb\x3b\xc8\x2f\x6a\xb8\x25\x60\x3d\xd8\xb1\x1c\x4c\x23\xec\x73\xb0\x96\x80\x90\x4c\x21\x56\xcc\xa1\x40\x9f\xea\x97\xae\x76\xc3\x63\xa2\x39\x49\x7b\xc7\xae\x14\x59\xc2\x3f\xfa\xc4\x78\x4b\xe4\x7a\x42\xf8\xde\x2e\x25\x13\xa3\x13\xfb\x62\xe7\x3a\xab\x7d\xf7\x82\xfb\x52\xab\x53\x28\x14\xd9\x1e\x56\x71\xde\xd7\x6f\xfa\xc4\x95\xd2\x56\x9a\x92\x2f\x2b\x2a\xff\xf0\x17\xd8\x4b\x21\xd4\xb1\xbc\x61\x57\x09\xae\xf7\xa5\x2a\x31\x99\x4a\x21\xc4\x96\x34\xfa\xa7\x7b\x7f\x13\xe3\x36\x82\x6a\x35\x14\x94\x95\xdd\x01\x26\x96\x02\xd4\xa1\xc5\x6f\x7a\x07\xe6\xc4\x5d\x89\x1a\x4c\x5e\xf4\x1e\x83\xd0\xae\x07\xe1\xc7\x85\xe2\x2b\xf7\x7b\xb2\x83\xc9\xdb\x83\x84\x06\x0d\xbe\x12\x58\xa3\xe3\xff\x60\x3d\x1d\xfa\xde\x37\x76\xaf\x06\x0f\x1c\x8e\xc1\x50\x88\xe5\xb1\x74\xe5\x3a\x9e\x26\xde\x91\x29\x93\x7a\x0e\x82\x6a\x3d\xfa\x1d\x93\x7c\xa6\xd0\x62\xbf\xb1\xb7\xf7\x16\x5d\x6a\x03\x80\x6f\xba\x0a\xb9\xbb\x30\xb1\xd5\xa6\x8c\xaf\xb9\x42\x00\x4f\x76\x82\xc7\x4c\x60\xfa\x20\xbe\xbe\xdd\x82\x84\xb4\xc8\x20\x4a\x09\x2b\x04\x18\x68\x78\x21\x24\x70\xca\xb9\x70\x11\x5c\xca\xc4\x7a\x9f\xaa\x4c\x81\xc7\xda\x9a\xcc\x58\x3f\x74\x90\x98\x58\x87\xd6\xb3\xb4\x35\x54\xab\x26\x2a\x61\x0f\x73\xe4\x40\x85\xab\xc6\x8e\x66\x50\xa3\xa8\x0e\x94\x36\x8f\x42\x2b\xc0\xd9\x6d\x3d\x5f\x2c\x5c\x08\x58\xfe\x56\xbe\xe2\xac\xd2\x3b\x55\xa2\x56\xe6\xe2\x2a\x0c\x4c\xa5\xc7\x1c\x6f\x87\x17\x6e\x54\xf5\x48\x42\xa4\x4a\x50\xe7\xa0\xe1\x4b\x3d\x52\x41\x6a\x44\x44\xa9\x91\x57\x76\x29\x28\x18\x14\x5d\x3d\x9d\xb7\x04\xc1\x63\xaa\x04\x80\xf6\xcd\x9e\x37\xc4\xc9\x17\xba\x6c\x61\xe4\x2e\x56\x00\x6e\x0a\x98\xce\x54\x27\x23\x46\x31\x92\xe7\xaa\xed\x74\x62\x0e\x0d\xd6\x98\xd7\x89\x12\x63\xa9\xde\xe9\x22\xb5\x07\x81\x7c\x94\x38\x52\x84\xbd\xa0\x80\x72\x00\xe9\x1b\xb0\x75\xa2\x2a\x8e\x8e\x6d\xe2\x63\x4d\x02\x9d\x91\xed\x02\x42\xee\x9c\xb3\xe4\xd0\x0b\x5a\x08\x5b\xa9\x64\x6e\x6f\x81\xd2\xd7\xdd\x65\x60\xb1\x40\x3a\xf1\xce\xe4\xcd\xd6\xca\xa7\x50\xb2\xaa\x4d\xa9\xd6\x70\x49\x44\x19\x42\xbe\xbe\x83\x84\x6f\x21\x07\x6a\xbd\xb6\x52\x5b\xeb\x01\xef\x4d\xb0\x44\x82\xd9\x35\x7d\xce\xd8\x5f\xd3\x3c\x77\x0e\x71\xa2\x35\x05\x17\x23\x16\x3f\x99\x52\x86\xb6\x8e\x30\x9d\xe7\xb3\xad\x24\x17\xfa\x60\x60\x49\x28\x42\xe5\x53\xec\xe4\xa0\xa2\xdf\x31\x94\x93\x02\xdc\x2b\xb4\x37\xdb\x21\x83\x02\x6c\x0a\x9e\x90\x3f\x1a\x4b\x85\x75\x7a\x2d\xf5\x42\x17\x3e\xa8\xba\x9e\xc8\x90\x7b\x90\x43\x56\xf4\x17\xe1\x95\xf9\xff\xd8\x7b\xb7\xe5\xb6\x91\x2c\x5d\xb8\xaf\xf3\x29\x32\x74\xf1\x17\xb9\x03\xa2\x25\xb9\xec\xea\x2a\x4f\x74\x04\x4d\xd1\x36\xa7\x65\x51\x43\x52\xe5\xf2\xdc\xec\x0d\x12\x49\x11\x6d\x10\xe0\x00\xa0\x58\x9c\x37\xda\xaf\xb1\x9f\xec\x8f\x5c\x87\xcc\x95\x00\x28\xbb\xaa\xab\xaa\x7b\x66\xac\x88\x8e\x2e\x4b\x38\x24\xf2\xb8\x0e\xdf\xfa\xbe\xfc\x9c\xce\xc0\x37\x45\xb9\xed\x3c\x00\x9b\x6d\x6b\x05\x74\x4f\x1f\x5b\x95\xfa\x16\xa6\xc8\x8b\x93\xa7\x97\x48\xb3\x6d\xe3\xd5\x26\xcd\xcd\x79\x69\xe2\x04\xb6\xb3\xce\xb8\x64\xc7\xcb\xc2\xa4\x9c\x6d\x61\x6e\xfc\x69\x78\x88\x8f\x74\x0e\x8e\xfc\xbb\xc2\x30\x37\x9c\xe4\x66\xbb\x2c\x12\x0c\xaf\x42\x8e\x6d\x73\xac\xc0\x60\xe5\x1a\xbd\x9e\x8b\x1b\x2b\xf1\xd7\x8e\x99\xd9\x8f\xc0\x32\xdb\xee\xe2\x3c\xf5\xe5\xd5\xdd\x11\xb8\xf4\x67\x54\xa3\x06\x6a\x3e\x8c\x6b\xf1\x93\xf1\x61\x7a\xb5\xaf\xea\x62\x8b\xd9\x7b\x98\xa1\x01\x6a\x1f\xf6\x19\x84\xb9\xe1\x39\xfc\x0f\xfb\xc6\xd8\x95\x2c\x82\x75\x16\x69\xd8\xc5\x21\x0a\x1c\xd7\xda\x9e\xf1\x35\xc0\xb6\x8c\x3e\x9a\xb8\xc4\x38\xaf\xbb\x44\x96\xe0\xdb\xa9\x41\x06\xde\x0e\x0f\x1c\x98\xcb\x25\xf5\x84\x29\x15\x1b\x7e\x18\xe2\xc1\xf8\x02\x34\x7f\x5b\x24\x26\x83\xa3\xee\x81\x3c\x3e\x3b\x13\xec\xb9\x4b\x87\xad\xa9\x9a\x3d\xa3\x28\x81\x08\x60\x56\x61\xd6\x3e\x15\x32\x75\x99\x0b\x37\x08\x90\x2f\xe7\x56\x70\xe2\xef\x44\xd8\x2f\xd2\x5f\x3a\xde\xea\xc9\xf1\x8e\xc8\xc2\x45\xeb\x39\x2f\xf4\xb6\xc0\x7c\x3b\x05\x6b\x4a\x13\x57\x05\xa6\xd5\x56\x54\x3e\xc0\xef\xca\x8e\x22\x81\xe0\x12\x58\xb4\x25\x38\x9b\x14\x66\x4c\xef\xaa\x2f\x30\xa0\x64\x9a\x1b\xd5\xdd\x39\xd6\xd6\x8d\x35\x21\x17\x34\xa4\xf8\x4a\x1d\x5b\xf3\x8f\x4c\x7f\xb4\xa9\x68\x8e\x8a\xbd\x31\xf4\xe7\xe4\xc4\x25\x94\x84\x1c\x18\x56\x97\xc7\x49\x82\xe6\xf6\x23\x05\x87\xba\xc3\xe0\x68\xaa\xc4\x59\x6d\xca\x1c\x6b\x01\xe1\x9f\x10\xb9\x81\x14\xa4\x2a\x56\xab\xb8\x02\x7b\x89\xfc\xbe\xbc\xc8\x3d\x4b\x44\x46\xfe\x07\x07\x6c\x25\xa2\xbb\x35\xa1\xd0\x1d\x43\x56\x03\x5e\x0b\x4d\x67\x6d\xbf\x64\x53\xed\xe5\x12\x4d\x96\x13\xeb\x76\x49\xce\x0e\x16\x6b\xc3\x30\x50\x2f\x63\x9a\x03\xc2\x53\xbb\x2c\x5e\x19\xdd\x43\xd8\xba\x2a\x4a\x9a\x18\xd8\xe5\x7d\x6a\x3a\x74\x96\x8f\xf9\x8a\x41\x3d\xd5\x6d\x8a\xb5\x6d\x21\xfe\x0f\xb5\xe3\xa5\x83\xf0\xc2\x2f\xf1\xc5\x38\xc0\xeb\x7d\x89\x91\x36\x1c\x68\x30\x9c\xd9\x82\x51\x64\x80\x07\x60\x79\x3f\x9b\xba\x97\x5a\xc3\x9b\x14\x99\x3d\x07\xa8\xc0\xf7\xcb\x27\x05\x7b\x5e\xd5\x9a\x8c\x51\xfb\x75\x7c\xae\x10\x26\x0e\xd7\x66\x6a\x7b\x0b\x82\x3c\x38\x87\x7b\x52\x93\x17\x36\x28\xdb\xc1\x3e\x1e\x72\xec\x23\x3c\x85\x76\xa6\x4a\x76\x34\xc1\x9c\x44\xc0\x58\x1c\x86\xe0\x67\xc5\xd6\xfb\x48\x73\xc4\xa4\xfb\x88\x6a\xa5\x72\xf3\xb3\x8b\x09\xc9\x2f\xab\x62\x78\x22\x42\x8b\xad\x5d\x95\x52\x76\xad\x7b\xf6\xcf\x9c\x35\x6f\x37\x01\xb0\x4d\xe8\xbb\x36\x45\x45\x75\x0b\x5d\x77\x46\x34\xd1\x6d\x03\x39\x16\xc8\x1c\x60\x10\x43\x14\x6e\x9c\xc8\x62\x86\xdb\xb9\xcf\xe9\x56\x76\x7a\x62\x26\xb6\x0a\x7c\x32\x6b\x75\x98\x93\x4b\x60\x0f\x01\xb4\x9d\x31\xe5\x79\x5d\x9c\xdb\xff\x47\x28\x94\xe7\x07\x93\x9d\x99\x02\x45\x0c\xa7\xe6\x8c\xb5\xc9\xa8\x9b\x1a\x8f\x45\xf1\xeb\x8e\x79\x27\xf1\x07\xd6\xa8\x05\xba\x01\x5c\x3f\x54\xc5\xb6\x31\x9c\xbe\x25\xc0\x40\xb0\xc7\xb1\x73\x2a\xd6\x78\x02\x26\x3b\x5a\xe2\xb0\xe7\x17\xa5\x8c\xcb\x89\x66\x45\xf6\xb4\xaa\xc2\x34\x69\x5a\x61\x30\x3e\x21\x36\x33\x75\x7a\xc9\xd8\x19\x1f\xe4\xa1\x8f\x91\x77\x23\x96\x26\x00\x7a\xb8\x1d\x5f\xb5\xf6\x5c\x87\xc4\xb9\xb7\xce\x12\x51\xaa\x9d\x41\x43\xe4\x69\x79\xb6\x2a\xf2\x6a\xbf\x45\x53\x1e\x2e\x61\x04\xbc\x87\xfa\xd4\x71\xfe\x90\x2e\x33\x56\xd5\x41\x5b\x63\x67\xca\xfa\x28\x51\x23\xe5\x16\x36\x5e\x77\xde\xf1\xc5\x91\x5e\xc7\xdb\x34\x03\x80\x8e\xde\x14\xfb\xca\x6c\x8a\x2c\x51\x94\xce\xa9\xfc\x09\xc5\x59\x54\x97\xfc\x85\x43\x33\x4b\x08\xe9\xb8\x2a\xca\x1d\x11\xe5\xa2\xf3\x1d\xeb\xe4\x60\x20\xc8\x3d\x50\x93\x5c\x27\xc6\x1a\x93\x69\x4e\xab\x0a\xc1\x82\x9e\x9d\x81\x30\x6f\xc1\xb7\x46\x3a\x29\xf6\xcb\x7a\xbd\xcf\x00\x31\x54\x61\x2c\x5e\x01\x39\x4d\x55\x64\x8f\xd8\xc9\xa0\x02\x88\xc9\xcd\x47\x63\xbd\x19\x4c\xbd\x37\x21\x44\xf0\x1a\x77\xa2\x80\x35\xe5\x2f\x50\xc8\x0a\x7d\x16\x74\x53\x00\x22\xd6\xf5\x71\x07\x36\x04\xd1\x1d\x15\xb9\x47\xd2\xc4\xb5\x5e\x65\x71\x55\x89\xfa\x85\x48\x85\xfe\x3d\x67\x50\xf7\x95\x24\xbd\xa1\xd6\x81\xbf\xec\xe9\x70\xec\x39\x90\x0a\xd0\x89\x6a\x5e\x8a\xa2\x5c\xd8\x4a\x1c\x20\xf3\xf3\xce\xac\xd0\x84\x83\xa9\xbc\x73\xaa\xec\x50\x33\x41\x38\x73\xdb\xb0\x81\x1a\x3e\xdd\xe9\x8d\xc0\x04\x0f\x95\x78\x04\x78\xe2\xa2\xb8\x41\xf9\x53\xdc\x1e\xc3\xc9\xde\x9a\xb2\xd8\x53\xc8\x04\x45\x2f\xc0\xd6\xee\x73\x78\x34\x9c\xde\xf6\x37\x40\x16\x03\x50\x3d\xf8\x56\x38\xff\xed\x04\x83\x70\x1f\x46\x99\x0c\x81\xf7\x5c\xd7\xf1\xa7\xa8\xb3\x09\x42\x57\x70\xda\x4d\x72\x27\xf1\xc6\x08\x19\xb9\xba\xc4\x92\xd9\x9a\x7a\x53\x24\x78\x4a\xac\x4c\xb2\x2f\x4d\x15\x51\xc1\x26\xa1\xb3\xf5\x27\x73\xc4\xbe\xc5\x7d\x2e\xf5\xcf\xe6\x7d\x35\x91\x25\x3b\x76\xaf\x43\xc8\x8c\xe9\xae\xdb\x69\x3b\x79\x30\x71\x82\x06\x92\xdd\xd1\x44\x56\x5b\x5f\xdd\x7a\xd6\xa7\x0c\x2f\x13\xb4\x0e\xcb\xd5\xf6\xeb\x75\x8a\x07\x37\x1e\x24\x0e\xd1\xa1\x56\x45\x5e\xa7\xf9\xde\x6e\x03\xfb\x7c\xc5\x14\x37\xd4\xb5\xee\xd5\x8d\x53\x3e\xcd\x61\xf7\x8d\xa1\xee\x05\x0a\x1f\xac\x53\xc5\x51\x1e\xfc\x2c\x84\xa7\x40\xa6\x6f\x69\xd0\x8f\x0e\x52\x24\x76\xda\x2c\x8d\xc9\xf5\x36\x06\x70\x24\x51\xc6\xb0\x13\x9c\xb7\x36\x48\x19\xeb\xe3\x8d\x9e\xbc\x2c\xfb\x32\xcc\x72\x09\x5c\x8a\xf2\x14\x8b\x51\x63\xec\x3d\x3a\x46\x58\xe1\x58\x80\x14\x57\x3e\xa7\x87\xc7\x1e\xa2\x87\x95\x5c\x83\x9a\x4a\xef\xd6\x32\xa6\x28\xea\x57\xec\x25\xc1\x50\xa6\x95\x43\x13\x97\x26\x51\xcd\x4a\x46\x02\x18\xed\x4c\xbd\x4f\x6b\x80\x90\x53\x2c\xdd\x7a\xab\x08\xd7\xe8\x75\x46\x08\x95\x68\x21\x78\x40\x9b\xb8\x8c\x57\xb5\x29\xd3\xff\x24\x98\xed\x89\x83\x0b\xbf\x3b\x80\x8c\x28\xee\x54\x98\x32\x4b\xd3\xe5\x53\x9f\x5a\x60\x03\xfd\x7a\x4f\x19\x15\x61\x66\x28\x17\x47\xa1\x62\xe7\xb5\xce\xe9\x3c\x3b\x82\x5c\x1a\xa6\x43\x85\x55\x47\x34\x55\x44\x0b\x06\x35\xa8\x47\xb1\xae\x54\xe7\x84\xa4\x24\x41\xd0\xe1\x80\x5b\x73\x78\xab\x20\x36\x09\x93\x8e\x1e\x68\x12\x3b\xae\xb3\xe9\xfb\x3e\x61\x88\x64\xe0\x5a\x38\x3a\xa7\xbe\xbb\x8d\x4f\x8b\x83\x0e\x20\x9c\x9b\x5d\x60\xf2\x71\xec\x4f\x5b\xa3\x10\x10\xd8\x9c\x4e\x81\x49\xbc\xdf\x25\x71\x4d\x28\x07\xca\x86\x80\xad\xeb\x57\x8c\xeb\x85\xd2\x7f\x08\x0f\x91\x9b\x54\x11\xcf\xa3\xf6\x6c\xcc\x29\x08\x99\xd6\xfa\xe9\x87\x0e\xf4\xd0\x79\x2d\xde\xb4\x27\xcb\x3d\x31\x76\x6a\xa8\xc3\xc6\xe4\xad\xac\x8c\x4e\xeb\xca\x64\x6b\x87\xa3\xe0\xe4\x5e\x62\x37\x31\x83\x68\x20\x38\xa3\xc0\x14\xe2\x3c\x2a\x07\xfa\xf8\x45\x45\xa9\x1f\xd3\x22\x83\xde\x80\x6f\xdb\x67\x04\x58\xdb\x95\x45\x5d\xac\x8a\xac\x72\x8c\x83\x1e\x53\x16\xaf\xca\xa2\xc2\x3c\x04\x3d\x08\x90\x0a\x4f\xac\x02\xdc\x0f\x4e\x0e\x32\xdb\xbb\xc2\xad\x54\x9e\xe5\xaf\xb9\x6c\x80\x09\x0f\x6f\x76\x91\x09\xb4\x5a\xb3\xa3\x63\x2a\x33\x09\x56\xc8\xdb\xc7\xa8\x36\x54\xf6\x04\x4e\xb6\x0b\x35\x46\xee\x26\x31\xad\xc1\xd4\x53\x79\xe1\x0a\xde\x76\x71\x55\x01\x09\x58\x51\xda\x43\x0c\x79\x67\xf3\x5d\xbc\xfa\x04\x39\xe8\xd2\xc4\x09\x81\x55\xc8\x6d\x72\xa2\x22\x43\x9f\xd1\x58\x18\x8c\x54\x9e\x89\xdf\xf9\x2c\x41\x75\x06\x11\x5d\x01\x3f\xb1\xf3\x9b\x54\x57\x4e\xc6\x0d\xd5\xf2\xc8\x98\x14\x2c\x20\xc0\x5a\x36\x00\xdb\x21\x1d\x1f\x84\x57\xa0\x74\x5f\xaa\x99\x05\x0d\x13\x8d\x40\xdf\x28\xa6\xac\x0d\xe5\x67\x18\x40\x80\xe9\x23\xce\x1d\x38\x10\x07\x60\x27\xb0\x8a\xcb\x17\xcb\x1e\xd5\x01\x2b\x47\x24\x44\x5b\x46\x93\x3a\x0a\x1d\x5c\xb2\x06\x03\x6c\xad\xe2\x9e\x2c\x3e\x80\x0f\x1d\x77\x36\x9d\xb6\x47\x86\x66\x4b\xf0\xa8\x4b\x62\x52\x09\x61\x59\x2b\x5a\x7d\x60\xba\x8b\x9c\x0c\x6f\xe4\x50\x8c\xea\x9f\x8d\xe9\x9e\x8e\x4e\x20\x9c\x97\x7a\xb0\x76\x48\xde\x8e\x9a\xb9\x72\x20\x3c\x78\xf8\xab\xbb\xbf\xe0\x04\x2e\x04\x43\x48\x5d\x08\x11\xfb\x11\x31\x55\xbb\x63\xdd\x05\x51\x4c\xda\x13\x41\x9d\xe8\x26\x4a\xed\xc6\x35\x15\xe3\xd8\xfd\x0d\x6c\xa4\xfc\xe8\x3a\x0d\x58\xb9\xfd\x0c\x51\xf2\x7e\xea\x39\x0e\x9b\x7a\xb8\x2a\xa5\x60\x8a\x03\xb5\x22\xce\xc0\x5f\x23\x8a\x05\xf4\x36\xec\x36\xa7\x04\x59\x82\x03\x9f\xf6\x1d\x40\x8e\xa2\x33\xdd\x8d\xb7\x3b\x04\x6d\x86\x11\x26\x55\x15\x85\x36\x60\x6f\x0d\xbb\x28\x44\x9d\x41\xfa\x8d\xb9\x09\x20\xce\xda\x85\x7e\x50\x92\xda\x5b\xdd\x16\xb5\x1d\x40\x28\xbb\x60\xdc\x17\x73\xc6\x70\x29\x71\x2b\x92\x8f\xe5\x25\x84\x00\x83\x8c\x41\x02\xc6\xca\xa9\x11\x04\x54\x3c\xd9\xc9\xfe\x04\xf2\x89\x1e\x24\x2f\xad\xd8\x2f\x72\xe8\xb2\xfe\x17\xed\x10\x14\x8a\xb2\x7f\xc2\x74\xc2\x35\xe1\x71\xc0\x69\x64\x00\x42\x51\x62\xfe\x08\xea\x41\x52\xb6\x19\x5c\x40\x89\x01\xbc\xf2\x2d\x6c\xe9\x54\xfa\xf2\x05\x6c\x9e\x97\x2f\x9b\xef\x7e\xa5\x8b\x12\xc2\xfb\x33\x57\x3f\xb9\x43\x46\x5e\x97\x01\x74\x35\x2a\x32\xf0\x8b\x69\x2b\x07\xf7\x28\xa9\x7b\x94\x60\x3d\xad\x9c\xb5\xef\xc1\x76\x8e\xc9\xf2\x64\x9e\x92\x33\x99\x38\x6d\x30\xb5\x05\x04\xed\xe8\x43\xa7\x35\xb6\x78\xd5\xb7\x0b\x9c\xc1\x5d\x7a\x9b\x56\xce\xa1\x0a\x90\x49\x28\x1b\xe9\x1c\x56\x3f\x33\x01\x0e\x46\x9f\xac\x4e\x90\x27\x38\x54\x18\xb7\xdf\xb3\x29\x00\x23\x89\xeb\x8d\x03\x94\x9f\x55\x7e\x34\x94\x1b\x0b\xa7\x5b\x49\x4f\xc5\xe6\x27\x7d\x7d\xc3\x83\x59\x63\x1d\x1a\x86\x27\xe0\xf8\xb3\x03\xcb\x91\x08\xdb\x08\x24\x86\x2f\xd6\x94\xf4\x06\xf2\x05\xee\x71\x97\x34\xe4\x46\xe2\x0b\x4c\x5f\x5f\x9b\x55\x86\x9d\x56\x17\x08\x8d\x6e\x80\xc5\xca\x38\x31\xf6\x73\x10\x9c\xe7\x49\x3e\xa1\xc2\x11\xfe\x8a\x6f\x8e\x94\xbb\x14\x7d\x43\x32\xe7\xa0\x2f\x2a\x7c\xdf\x5a\xce\xa0\x34\x4f\xcc\x36\x0f\x50\x62\xbe\xe5\x82\xcc\xa2\x35\x2c\x7a\x79\x54\x22\xb7\x82\x3b\x6c\x15\x7c\x1e\x30\x69\x76\x0e\x55\x5a\xf7\x71\x25\x21\xa7\x13\x44\x0b\x54\x5c\x55\xfb\xed\xce\xd1\xc5\xfa\x85\xd3\x74\x4d\x22\x47\xfc\x27\xae\xa1\x23\x8f\x34\x02\xba\x9e\xe9\xca\x61\x49\x06\xaf\x60\x48\x7f\xe7\x07\x13\x9a\x1d\xf7\xa7\x06\x04\xab\x09\xac\x80\x63\x76\x55\x00\xd5\x85\xdd\x91\xce\x38\x0e\x2e\x95\x09\xcf\xc0\x3e\xa3\x35\x65\x1d\x7d\xce\xb3\x38\xcc\xa8\x0b\x69\xf3\x79\x18\xa2\xd7\x10\x83\x83\x5f\xae\xfc\xd9\x12\xf1\x9a\x83\x48\x37\xac\xcc\x2e\x88\xcd\xa9\x33\x55\x89\x10\x7b\x8c\x7e\x1d\x5b\x88\xb1\xee\xf8\x0e\xbf\xd3\xd2\xe1\x88\x3d\x6f\xca\xed\xc0\xfa\xcb\xb1\x43\x7b\xb0\x59\x29\x9b\xd7\xf1\x3c\xb0\x05\x30\x21\x0e\x38\x20\xc6\xd6\x2a\x2c\xc3\x08\xa0\xbc\xe1\xc9\xe0\xce\xec\x24\x69\x9f\x57\x7e\x12\xf2\x87\xb3\x9e\x86\xd8\xd7\x7d\xbd\xa7\xf6\xb4\x6b\x1d\x6c\xc7\xed\x56\x7b\x37\xb2\xda\x97\x8f\x40\x14\x65\x77\x1f\xd1\x7e\x2d\xdb\xef\x63\x09\xd0\x58\xb4\x4a\x5b\x4d\x6e\x24\x88\xa4\x25\x2f\xa9\x87\xec\x89\x1e\x71\x5e\xc6\xa1\xb0\x64\xd9\x4d\xa4\x63\xac\x86\x80\xfe\x67\x04\x40\x73\xd2\x7a\x42\x03\xe5\x08\x3c\xe8\x76\xf0\xf2\x68\x2e\xa5\x79\x02\x9b\x43\x67\xae\x41\xda\xb5\x64\x90\x0f\x5b\xa8\x23\xb1\x72\x8a\xe6\x5a\x8a\xd8\x02\x22\x94\xb5\x00\xc6\x21\x28\x42\x98\x93\x6c\x24\x65\x2e\x87\x5a\xf2\x6d\x71\x25\x2c\xf6\x57\xe4\xaa\xdb\xd9\x29\x33\x0c\x0a\x6d\x5a\x72\xf7\x0f\xf1\xd1\x89\xfd\x2d\x20\xf0\x1b\x13\xe9\x32\xdb\x4e\x48\x58\xc6\xf5\x0d\x9e\x70\xa8\x31\x6c\x54\x6b\x0c\x4d\xb0\xe7\x5a\x85\x5c\x1c\x30\x89\x54\x07\x77\x83\x1e\xe6\xd6\xd0\xac\xcd\x76\x57\x8b\x22\x07\xf4\xc5\x5b\x2f\xc3\xd5\xfb\x58\xa4\x09\x82\xb4\x00\x0e\x16\x56\x03\xd5\xd4\x7a\x13\xd4\x7b\x74\xc0\xd0\x64\x66\x1f\xec\x53\xf0\x16\x1c\xab\x5f\xb3\x64\xc7\xf8\x30\x48\x0c\xb4\xca\xc1\x76\x75\xd9\x1f\x28\x51\x17\x47\xa1\x32\x50\x69\xb1\xae\x0c\x3a\xc9\x9d\x26\x5d\x4d\x66\xb9\x2f\xf5\x80\x8c\x46\x10\x0f\x6f\x1a\x6c\x88\x12\x84\x20\x00\x3a\xaa\x7d\x6f\x34\x62\x6e\x96\xc2\xb6\x71\x6e\x3b\xbd\x4e\xb3\x4e\xbb\x2f\x28\xfe\xc9\x13\x3b\x91\xc3\x2e\x0c\x6b\x50\xb0\xcb\x7b\xcb\x3e\xcc\xe1\x18\xcb\xdb\x23\x8f\x2d\x6a\x3c\x7c\x1d\xa7\xc8\x03\x64\x97\xce\x9a\x92\x84\x78\xad\xeb\x0e\x05\x04\x35\x5b\x23\x6d\x12\x0c\xfb\xa2\x8a\x4c\x5d\xe8\x97\x17\x3a\x01\x2b\x65\x5d\x73\x35\x82\xa9\x2a\x9e\x9d\xef\x8b\xd2\x14\xd0\xe7\xad\x2e\xd4\xbf\xa4\x0b\xc5\x17\xa9\x53\x1f\x04\xdf\x91\x9a\xaa\xf3\x4b\xf4\xa9\x2f\x21\xe2\xf4\x14\xad\x81\x75\x5a\x56\xb5\xae\xd3\xad\xf1\x8e\x83\x3b\xd1\x68\x8f\x29\xd6\xa7\xe7\x8b\xea\xf1\x69\x8f\x55\x9e\xa1\xc7\x25\x9b\xeb\xf0\xc1\x7a\xb5\xa7\x64\x9f\x7f\x2a\xf4\xae\xdd\xe8\x9e\x07\xbd\x4b\x28\x89\x95\x49\x77\x6e\xa7\xc4\x46\x0d\x94\x12\xdb\x82\xab\x4c\x69\xaf\x2e\x5e\x11\xee\x48\xf0\xeb\xb1\x16\xa4\x99\x80\xbd\x40\xd8\x3c\x58\x4c\x61\x47\x30\xf8\xc1\xbd\x00\x3e\xf3\x08\x1a\xcf\x6d\xf6\x97\x49\xd8\x18\x78\x14\x44\xcc\xdc\xab\x13\x02\x30\xd4\x72\x9c\xc5\xf0\x47\x54\x3b\x04\x70\xbd\xff\xd8\xc7\x19\xf8\x8f\x85\x63\xac\xc8\xcd\x21\xa4\xfb\x74\xf9\x7e\x77\xb0\x86\xf8\xdb\xcb\x0b\xa7\x80\x39\x44\x6a\xab\x7c\x65\xac\xa7\x40\xc6\x26\x25\xf5\xde\x61\xe5\x55\x00\xee\x67\xec\x9d\xcc\x5a\x20\x3d\x56\xab\x22\xaa\x28\x13\x84\x7b\x08\x7a\x3c\x28\x45\x83\xc9\xa0\xc2\x08\x85\xdd\x69\x57\x69\x96\xc5\x08\x43\x76\xdc\x1d\xed\x5c\x07\x04\xda\xc1\x1e\xa6\xf4\x40\x5c\x29\x4c\x3c\x99\xff\xd8\x33\x2c\xfe\x33\x39\x68\xd9\x2a\x0a\x34\x64\xe9\x27\x63\xf7\x76\x6f\x2d\xb0\x73\x1f\xbb\x2e\x1a\x68\xb7\x87\xe6\x05\xe6\x2f\x03\xfe\x1b\x09\xaf\xb5\xfb\x73\x05\x0e\x7f\x08\xb0\xed\x3c\xa4\x00\x32\x1d\x96\x09\x1a\xaa\x11\x46\x87\x0f\x99\x5f\x44\xd9\x0e\xd3\x24\x62\x41\x59\xc7\x08\x04\x4c\x65\xcb\xa3\xe0\x7a\xc1\xe2\x38\xec\x61\xc0\x8d\xb5\x9d\x73\xb2\x23\xe8\x90\xf2\x1d\xd0\x72\xb1\x91\xf6\x06\x20\xae\x24\xbd\x39\xe4\xe3\x8e\xae\x21\xcb\xf9\xba\x38\xe4\x55\x5d\x9a\x78\xab\x67\x0e\x53\x32\x50\xc8\x8d\xe4\x36\x9c\x13\x35\x41\x61\xb2\x23\x3c\x50\x69\x18\xed\x1c\x08\xb6\xd7\xc0\x49\x74\x5e\x43\x44\x45\xa2\x91\xef\x7a\x59\x17\x89\xac\x23\x00\xb2\xae\xf6\x98\x22\x00\x73\x4b\x76\x6b\xb8\x0a\x88\xed\x92\x60\x14\xae\x3a\x07\xeb\x06\x53\xdb\x67\x68\xcb\x8a\x42\x1c\x61\x31\x7a\x72\xab\x61\xae\xcf\x4c\x5e\x83\x7b\xe4\x73\x32\x67\x68\xda\xcb\x2c\x8d\xcb\x03\x91\xa2\x07\x14\x12\x62\x05\x99\xe4\x83\x8a\xac\x4d\x1e\x72\xc6\x41\x62\xb1\xaa\x0c\x02\x4d\x8b\x9c\x8c\xb2\xfd\x12\x50\x5d\x18\xe4\x09\x9f\x01\x53\xd4\x94\x0f\x68\xe2\x4b\xb2\x29\xeb\xfd\x3c\xbd\x4c\x11\xb8\xcb\xe8\xa7\x5c\xb7\x3f\x2e\x52\x80\xe4\xc6\xc4\x4d\x5d\x90\x0d\x2f\x3e\xd5\xee\xbc\x3c\xbc\x4d\x48\x19\x80\x3d\xb2\xca\x5f\xa0\x0e\x9b\xb8\x06\x15\x36\xb7\x15\x32\x82\x1e\x33\x20\x98\x24\x3f\x7e\x03\x5c\x7f\x09\x94\xf9\x61\xdc\x04\xb2\x8e\xa6\xaa\xf5\x26\x4e\xd0\x13\xd8\x67\x50\x3b\x21\xb1\xab\x8e\x92\xd1\x19\x58\x91\xde\x65\xa0\x69\x4b\x75\x74\xcd\x02\x81\x93\xc0\xa5\x80\x90\x85\xa7\xea\x89\x36\x39\xfb\x45\xfe\x7d\x13\x57\x2a\xad\x1b\x14\xb7\x54\x96\xe6\x4e\x77\xb3\x5e\x17\x65\x5d\x35\x4c\x64\x72\xa7\x41\xbc\xae\xc3\xef\xe5\x5c\x18\x15\xc2\xb9\xb6\x12\x8e\x9a\x8d\x4e\x7b\xc6\x43\x35\x76\x37\xe1\x59\x48\x56\x70\xec\x78\xbd\x72\x4b\xd5\x98\x48\x97\xc5\x31\xce\x28\x79\x55\x08\x4c\x1a\x2e\x29\xd1\x94\xae\x72\x75\xd5\x66\xf8\x09\xde\x98\xa7\x35\x44\xc3\xb2\xb4\xa6\xd2\x48\x61\x5a\xdb\x59\x55\x16\x55\x75\x0e\x71\x41\x74\x63\xf7\x80\xd8\x84\xba\x3d\x48\xc5\x64\xf1\xa1\xda\xa7\x75\xdf\xae\x1f\xf3\xe0\x3c\x75\x61\x94\xd3\xc5\x7e\x9f\x4e\x7c\x72\x22\xc2\xa3\x28\xd2\x15\xa2\x57\x22\x0f\x0f\x04\x9c\x68\x9c\x11\x93\xee\x16\x30\x46\x14\xb7\xf2\x94\x64\x68\xfc\x7b\xf8\x11\x54\x4c\x90\x1a\xf0\x1d\x51\x26\x12\xdf\x19\xe9\xcc\x17\xe5\x19\x63\x31\x1a\x16\xa2\x5d\x4f\x2e\xdc\x0a\x00\xf8\x8e\xd1\x6b\x9c\xcb\x82\x15\x2d\xa0\x2e\xb9\xf3\xdc\x8e\x50\x6a\x35\xf0\x05\x45\x50\xc4\xcc\x84\x78\xca\x83\xfe\x29\x5f\xce\xad\xfc\xa6\x0a\x1a\xed\x88\xdf\xa8\x5a\x22\xb8\xce\xd1\xb2\x04\x5d\x4e\x89\x23\xbb\xaf\x05\xbf\xd6\xc5\x81\x10\x45\xb4\x3f\x66\x3e\xa2\x20\x1e\xec\xf9\x83\xe3\x0c\x49\x33\xe3\x15\x19\x35\x76\x91\x99\xd2\xa0\xd9\xc9\xbf\x8d\xf8\x78\x20\x3d\x2a\x37\xda\xce\xb8\xde\xc6\x79\x6e\x8d\x03\x5f\xab\xdc\x86\x12\xaf\x1b\x13\x03\xf6\x69\x9c\x1b\x8e\x45\xa0\xd1\x25\x98\x83\xa1\xa3\x9e\x13\xc5\xf4\xa9\xbe\x49\x7a\x69\x94\x6f\x12\x24\x83\x62\x86\xe4\x08\xcb\x88\x97\x7d\x57\xbd\xa9\x78\x37\xa3\x4d\x70\x31\xcb\xa8\x29\x4a\x93\x39\x66\x91\x88\x46\xb1\xc8\xce\x3c\x05\x89\xc7\x38\xd4\x05\xee\x1a\x3c\x42\x15\x97\x64\xa3\x5c\x58\x4c\x7d\x86\x11\xb9\x0a\x2e\x71\x08\x52\x19\x0f\xe0\x37\x2b\x7f\x64\x8e\xb1\xf6\xd0\x77\x17\xda\x5c\x18\xba\x81\xd0\x85\x2b\x89\x8f\xec\xcc\xcc\x92\x43\x9a\xf8\xed\xe6\x1c\xd9\x5b\xa0\x59\x6e\x3f\x0a\x8a\xca\xc5\x0c\x3c\x31\x01\x23\x26\x3d\x8f\x10\x1a\x65\x07\x32\x22\x9c\xb3\x5f\xde\xb8\xb6\x3d\xed\x3e\xf2\x24\x3c\x61\x84\x18\xe6\x92\x00\x47\xe4\xc4\xac\x18\x28\x35\x69\xca\x8c\x22\x5e\xdf\x1d\x51\x10\x5c\x3a\x0b\x43\x07\xb8\x39\xe4\x47\x0e\x80\xe8\xf8\xa1\x34\x88\x36\xa0\x4c\x78\x5a\x63\x70\x8d\x4a\xa7\x74\x62\xf2\x82\x1c\x95\x88\x25\xdd\xd0\xd0\x31\xe0\xc4\xc2\xd3\x7b\x8e\xf4\x2c\xe7\x27\xab\xa6\xe1\x4b\xa4\xb7\xee\x1e\x78\xdf\xa3\xc9\x63\x2c\x38\x44\x02\x73\x0a\xd8\xe3\x15\x92\xf2\xb0\x3f\x00\xe6\x3f\x18\xe4\x33\x47\x05\x1e\x7c\x1b\xc6\xe9\xd0\xa0\x70\xb4\x8c\x44\xdb\x8d\xf0\xee\x13\x1f\x7b\xf2\xb3\x64\x8d\x35\x3c\xb7\x8d\x34\x6a\xd8\xaa\x9f\x72\x18\x0a\xb0\x4c\x33\xb4\xb7\xf3\x56\x43\x1d\x80\xa8\x1b\x57\x10\xb0\x71\x12\x02\x26\x84\xeb\x62\x30\xdf\xf1\x6d\xdb\xa9\x0c\xda\x6b\x5c\xaf\x9b\x7c\xbe\xec\xc6\x53\x18\x3a\x74\x81\x7b\x89\x6a\x94\x04\xb8\x83\x19\xf2\xfd\xf6\x4a\x80\x75\xa4\x3e\x8c\xe0\x02\x45\x18\xf8\xf4\xb0\x53\xc5\x35\x50\x27\x90\x44\xa8\x0f\x58\x15\xfe\xe5\x1e\x24\x5a\x96\x48\x07\x5d\xe8\xc4\xec\xca\xf4\xd1\x58\x7f\xaa\x04\x60\x08\x75\xd1\xd2\xe4\x66\x9d\xd6\x1e\x06\x19\x4c\x07\x47\x04\x2e\x22\x2d\xcc\x9d\xa5\x7a\xcf\xdd\x1b\xa2\x5f\xb5\x15\xb9\xae\x54\x92\x6c\xb9\xd5\x08\x70\x91\x9c\xf3\xe3\x01\xf5\x03\x7d\xf6\xd7\xe6\x5c\x39\x53\x38\x6d\x5d\xf0\x05\x53\x23\xda\xd1\xc4\x10\xa1\xa8\x3d\x0f\xd8\xd1\x6f\xce\x2c\xe2\xe4\x90\x58\xe1\x56\xe4\x9a\x88\x36\xd1\xe4\xe2\xb0\x0a\xb6\x0b\x2b\xe3\xba\x8a\x07\x55\x78\x27\x1e\x3a\xbc\x42\x03\xd0\x45\x9a\xd8\xcd\x72\x8d\xd4\xa5\xcc\x5b\xcc\x59\x4b\x7a\x80\x0a\x15\x22\xd0\x72\xc5\xd9\x90\xa5\xe6\xd1\x78\x38\x04\x2c\xb9\xc8\x9e\x41\xd5\x3e\x46\x5c\x15\x1a\xc9\xab\x22\xcf\x4d\xc0\xcd\x69\x4f\xd4\xcc\x04\x4e\x84\x5d\x2d\x38\xca\xb0\xab\x29\x59\xa2\x2e\x3c\x61\xa8\xdc\xd8\x95\xc5\x6a\xcf\x8e\xd5\xa3\x39\x92\xcb\x1b\xb5\x16\x39\xd4\xd9\xdb\x8d\x48\x75\x6d\x41\x60\x0b\x48\x60\x2e\xe0\x52\xad\x9b\xd2\x20\x73\x21\x37\x86\x4c\x32\x1a\xad\xad\x03\xda\xba\xb6\xb9\x83\xc2\xe5\x29\xec\xb7\x7a\x21\x3c\xef\x17\x05\xcd\x54\x35\x43\xab\x1a\x6d\xb4\x7d\x80\xa7\xb2\x3d\x0b\x02\x77\x1a\xe7\x31\xc5\x75\x02\x12\x01\xd5\xf1\x0a\x2c\x27\x85\x64\xb2\x2b\xb8\x07\x0b\x75\xd8\x7c\x65\x5a\xe9\xb3\x24\xad\x56\x65\x0a\x47\x49\x51\x1e\xa1\xec\xb3\x8b\xa2\x4d\xa4\xde\xaa\x55\xb1\x33\xfe\x0c\x44\x44\x76\xe4\xf8\x47\xaa\xa6\xb3\x12\x11\x66\xd9\xc1\x7d\x3c\x07\x00\xda\x03\x78\xa5\x42\xff\x57\x82\x84\xbc\x97\xa3\x1d\x10\x28\x60\x29\x3b\xcd\x91\x35\x08\x3c\xac\x13\x55\x98\x94\x51\x2a\x8d\x3b\xa0\xa0\xce\x5c\xce\x4d\x02\x73\x05\x78\x46\x4e\xef\x51\x7f\x2c\xad\xcd\x48\x10\x4e\x5f\xe4\x07\xa1\x30\x96\x6f\xc0\xf6\x81\xa1\x8e\x70\x13\x7b\xfc\xed\xe2\x23\x43\x12\x83\x54\x41\x7d\x0c\x89\x12\x08\x93\xc4\xf1\x53\xe2\xa8\xb3\xb3\x4b\xf9\xfc\x5e\x1d\x70\xc4\x89\xf7\xb5\x9e\x8d\x06\x59\xe4\x74\x6e\xd6\x1e\x80\x4e\x81\x55\xdc\x44\x38\x14\xd7\x9a\x5e\x1c\x58\x8d\xa0\xc6\x47\xce\x9e\xa6\xe1\x06\xc4\x98\xed\x2d\x21\xac\x53\x0b\x9e\xed\x20\xac\x08\xa3\x51\x3d\xc4\xb0\xa5\x40\x27\x9b\xb8\x28\x52\x51\x31\x25\x70\x1f\x0f\xa6\x65\x5f\xef\xca\x94\x0a\x3c\xf1\x30\x4e\xc2\x57\x53\x45\x19\xaf\x4f\x27\x42\x80\x26\x07\x97\x20\x57\xbc\x1d\xe6\x42\x59\x55\x6e\x32\x98\x24\x81\x41\x34\x10\x0e\x48\xb0\x14\x82\xe6\xa7\xdf\xd3\xb4\x2b\xab\x0c\xd7\xdc\x21\x76\xbe\x72\xe4\x63\xea\x57\x7f\xd6\xef\xe3\x72\xb5\x01\x09\x2d\x44\xfa\x6c\x1c\xa3\xa9\x08\xed\x39\x94\x1b\xd0\x99\x95\x7b\x97\xb9\x23\xd7\x59\x02\x67\x80\xe0\x66\x0b\x34\xf8\x6e\x44\x9c\xcd\x90\x98\xb5\x8b\xc7\x04\x1c\xd6\x84\x51\x38\x0a\xab\x78\x69\x84\x11\x82\xca\x46\x2d\x34\x9c\xfb\x4c\x60\x58\xb2\xbe\xf0\xd5\x40\xdf\x16\x7a\xee\xc4\x6f\x8a\xb5\x9e\x02\xa9\xd8\x37\xa0\xe4\x94\x14\x5b\x34\xdb\x1a\x74\x73\x18\x8d\x48\x88\x2d\x4b\xf7\xd8\x1d\x04\x42\xb5\x3d\x10\x95\x60\xa6\x82\x8d\x46\xf7\x4d\xb6\xad\x7d\xe5\xc6\xaf\x8c\x93\x94\x54\x11\xc4\x2b\xba\x72\x69\x47\x76\xe3\xcc\xcf\xab\x3d\xed\xc4\xae\x44\xe8\xf4\xbd\x4e\x11\x95\xc8\xff\xbb\x37\x19\xd0\xdd\x56\xa2\x70\xab\x4a\xb7\xfb\xac\x8e\x59\x64\x04\xd1\x72\x2d\x8a\xa8\x4e\x06\x0f\x54\x97\xd8\x99\xb2\x46\x42\x10\x71\x1b\xd9\x7a\x2d\xe7\xf2\xd8\xde\x05\xd3\x5a\xc7\x40\xd2\x31\xe8\x14\xf9\x81\x8e\x85\x4d\xc9\x27\xb9\xb9\x6c\x8d\xa1\x6d\x2b\xeb\xbe\xaf\x6a\x1d\xb3\xdf\x06\xb8\x7c\x57\xbc\xe8\x76\x25\xb1\x5c\xeb\xc2\xee\x2d\x5b\x69\xa5\x37\xb0\x90\x06\x8b\x48\x49\xd8\x8c\x74\x1a\xb8\xd7\x40\x22\x86\x9e\xe4\xf4\x12\x42\x60\x19\xf9\xdb\x98\x46\x58\x97\x71\x9a\x2b\x84\x47\x32\x5c\x2c\xdc\x2d\x3d\xb1\x8e\x9d\xad\xcf\x07\xfa\xbe\x12\xc2\x28\x6f\x6f\xef\xf5\xd0\xba\x8c\xc5\x69\xed\x83\x5f\x05\xc7\x73\xc6\x55\xe0\x88\xa9\x2c\xcd\x3f\xd1\x5e\xb4\x4c\x73\xd3\xca\x3e\xb0\x31\xd5\x25\x6c\xd0\x54\x6c\x50\x9f\x6d\x3c\x97\x6f\x91\x69\xe6\xd9\x26\x3c\xcb\x28\x23\x92\x88\xfa\x45\x8a\x04\x60\x58\xe9\x14\xbc\x2f\xcb\x02\x78\xbc\x24\x52\x42\xd0\x8d\xab\x58\x6b\xef\xae\x0c\x6b\x65\xa0\x73\xdb\xc2\x97\x23\x73\x42\x01\x2d\xf2\x29\xb5\xe7\x80\xed\x59\x99\x12\xf1\x74\x82\x37\xde\x3b\x5a\xe4\x55\x29\xc4\x05\x84\xb4\x4f\xb6\x5b\x08\xbc\x8d\xf5\x4c\x34\x5b\xbe\x1d\xe8\x99\x79\x4c\xed\x10\xfc\x18\xe8\xb3\x04\xe9\x83\xc5\x13\xa2\x75\x88\x2d\x45\x22\x2c\x5d\xd2\xb3\x48\x96\x29\x37\x07\xdd\x90\x7d\x51\x4f\x49\xdb\xc1\x22\x4b\xb7\xb8\x68\xd3\xad\x19\xe8\xb9\xf5\xac\x83\xc7\xc0\xd7\x59\x9f\x0e\x29\xe3\x80\x9c\x79\x97\x96\xa9\x33\x3f\xb8\x42\x2b\x08\x6f\xd9\x46\x22\xce\x0f\x34\xd6\x4d\x1d\xa7\x19\x0c\x2a\x6a\x65\xd8\x57\x28\x27\x89\x83\x76\xb0\xed\x6c\x97\x43\xe2\x99\x99\x56\x2c\x14\x0f\x16\x52\x9a\x3f\xec\xd3\x0a\x0e\x38\xbe\x22\xdf\x6f\x97\xa6\x6c\x01\xb8\x18\x8f\xc9\x48\x70\x87\xdf\xc5\xeb\x83\x02\x2a\x37\x3b\x4e\xf4\xd3\x19\x21\xbf\xb2\xb8\xf6\x8b\xe6\xcc\x89\xff\x01\xdb\x7a\x14\xca\xe3\x11\x8a\xb9\x58\x07\xe1\x1c\xb1\x05\x49\x1a\x4e\x72\xaf\x19\x18\xd5\x6e\x61\xc9\xdc\x60\x41\x0b\x78\x16\xf8\x70\xe8\xa9\x39\xd3\xea\x1d\x8f\xa1\x82\x6e\xb2\x67\x0f\x3d\x54\xe1\xdb\x3f\xdf\x2b\x3e\x15\xb0\xda\x14\x9c\x85\xe0\x96\x99\x47\x7b\xdc\x70\xf3\xf4\xe7\x9a\x07\xc7\x79\xe7\xe8\x91\x79\x64\xf7\xc5\x9f\x8f\xa8\x55\x65\x56\xa9\x75\x2b\x60\x2f\x40\xa9\x23\x39\xe7\xd5\x67\xc6\x92\xd4\xce\xf7\x95\x8b\x00\xc3\xa3\xbf\xe1\xaa\x0c\x8f\xde\x02\x10\x54\x90\x2b\x8d\x7d\xcf\x8b\xcc\xbe\x88\xc1\xf3\x21\x87\x1d\x02\x4f\xe7\x6e\x65\xff\xde\x1f\x1e\x37\x30\x96\x6c\x5f\xb9\x4f\xb0\x3d\x0a\xd9\x2a\xc2\xac\x31\xa2\x0b\x68\x78\xb8\x2e\x5e\x82\xed\x5d\x16\x5b\xe5\x45\x70\x83\x30\x0d\x1a\xf6\x11\xf0\x56\x41\xb3\xb9\xd4\x23\xc8\x2c\x40\x0a\x1e\x77\x6e\x4f\x0b\x6a\xbf\x89\x75\x25\x61\x4a\x43\x32\x45\x4c\x47\xda\xe1\x5e\x0c\x1c\x32\x1b\xa7\xd1\x07\xc2\x66\xdb\x7d\xed\xdd\x18\x15\xd2\x6f\xa7\xac\x58\xfe\x11\x04\xc3\x41\x92\x7a\x36\x7d\x3b\x1b\xbe\x8f\xf4\x62\x0a\xff\x1e\xff\xb4\x18\xdf\x2e\xf4\xdd\x78\xf6\x7e\xb2\x58\xa0\x9a\xfa\xf0\xee\xee\x66\x32\x1a\xbe\xbe\x19\xab\x9b\xe1\x87\x81\x1e\xff\x34\x1a\xdf\x2d\xf4\x87\x77\xe3\x5b\x2f\x94\xad\xe7\x8b\xa1\xbd\x7e\x72\xab\x3f\xcc\x26\x8b\xc9\xed\x5b\x78\xde\x68\x7a\xf7\x71\x36\x79\xfb\x6e\xa1\xdf\x4d\x6f\xae\xc7\x33\x10\x3c\x7a\x36\x9d\x29\xb8\x11\x15\xd1\xc7\x4e\xbc\x5d\x36\x49\x9f\x81\x70\xfb\x99\xfe\x30\x59\xbc\x9b\xde\x2f\x7c\xdb\xa7\x6f\x40\x00\xfc\xaf\x93\xdb\xeb\x48\x8f\x27\xf6\x41\x8a\x44\xdd\xc7\xd7\x42\xd6\xfd\x57\x6a\xb9\xab\xb6\x96\xbb\xfe\x12\x2d\xf7\x01\x76\xe0\xed\x62\x32\x1b\xeb\xd9\x64\xfe\x57\x3d\x9c\x2b\xea\xd6\x7f\xbb\x1f\xba\xe7\xdc\x8d\x67\x6f\xa6\xb3\xf7\x43\x90\x1a\x7f\x13\x7c\xf2\x64\x0e\x5f\xab\x3f\x4e\xef\x07\x7a\xfe\x6e\x7a\x7f\x73\x2d\xff\xae\x6c\x37\x8d\xf5\xf5\xf8\xcd\x78\xb4\x98\xfc\x38\x8e\xec\x85\x7a\x38\x9f\xdf\xbf\x1f\x53\x6f\xcf\x41\x99\x7c\x78\x73\xa3\x6f\xc7\xa3\xf1\x7c\x3e\x9c\x7d\x24\x19\x76\xe8\x85\xd9\xf8\x6e\x38\x99\xe9\xe9\x4c\x8d\xa6\xb3\x99\x7d\xca\xf4\x96\xa6\xd0\xcb\x01\xe2\xbe\x5d\x36\xe3\x86\xc1\xc6\x76\xa7\x10\xb2\xf4\xf7\xb7\x37\xb6\x1b\x66\xe3\x7f\xbb\x9f\xcc\x9a\x33\x44\xdf\x0c\x3f\xd8\x21\x18\xbe\x9d\x8d\xa1\x97\xe5\x84\xf8\x30\xb9\xb9\x51\x76\xe8\x9a\xb3\x02\x14\xd9\xed\x1f\xfc\xac\xf8\xa8\x3f\xbc\x9b\xea\xf7\xd3\xeb\xc9\x1b\x3b\x41\x70\xd6\xe8\xd1\xf4\xf6\xc7\xf1\xc7\x79\xd0\x29\xc3\xb9\x98\xae\xc3\xd7\x53\xdb\x2f\x5e\x19\x7f\x31\x85\x4e\xb2\x83\x46\xca\xf6\x62\x5a\xc0\x3b\x49\x44\x59\xc8\xe3\x7b\xcd\xfc\xd3\xf2\xf8\x2c\x0b\xdf\xd4\x82\x9f\xe9\xc9\x2d\xcf\x9a\xc5\x54\xd9\xdf\xc9\x11\x16\x8a\xf3\xed\x19\xe9\x64\xf2\xaf\x87\x8b\xa1\x86\x16\x2f\x86\xfa\xf5\xd8\x5e\x3d\x1b\xdf\x5e\x8f\x67\xe3\x6b\x35\xb9\x1d\x8e\x46\xf7\xb3\xe1\x02\x5e\x66\xef\x18\xcf\xf5\xfc\x7e\xbe\x18\x4e\x6e\x71\x34\xec\xf7\xc2\xf2\x9e\xcc\xae\xdd\x0a\x83\x49\xfb\x66\x38\xb9\xb9\x9f\xf1\xb4\x53\xdc\xa8\xc5\x54\x4f\xef\xc6\xf0\x48\x98\x7e\x62\x24\xf0\x8a\x79\xdf\x6b\xda\x83\x6a\x3d\x0e\x9b\x53\xca\x57\x38\x62\xef\x86\x73\xfd\x7a\x3c\xbe\x7d\x5a\xf7\x5e\x0b\xdd\xfb\x39\x4d\xbe\xef\x06\x28\x60\xb1\x2b\x8d\x9f\x80\xf3\x56\x89\x88\x3f\xb3\x92\x60\xb7\x73\x95\x28\xf6\xb2\x2c\x98\xc5\x1e\x32\xef\x80\xce\x88\x94\x45\x37\x50\x2d\x0d\xd9\x3a\x59\xb1\x8a\x33\x2a\x1e\x41\x42\x5b\x42\x27\xd3\xfe\x8b\xf5\x49\x04\xf1\xb5\x26\xa0\x39\x60\x94\x73\x5f\xd6\x4c\x84\x80\xf6\x28\x3d\x29\x3e\xb0\xf2\x65\x55\xeb\x55\x56\x60\xcd\xe5\xce\x9e\x7c\xc0\xc5\x8f\xaa\x40\xcb\xaa\xc8\xf6\xb5\x41\xbe\x5e\x34\x39\xac\x49\x9e\x3e\xa6\x99\xf2\x6d\xef\x08\xcb\x04\xee\x18\x83\x41\x83\x9a\x1c\x5f\x0c\xa0\x82\x8e\xf0\x45\xc5\x4d\x48\x88\xcb\x48\xe7\xba\x34\xf5\xbe\x94\x84\xa2\x7a\x7c\x6b\x07\xf4\x84\x6c\xdd\xbb\xe2\x60\x3b\x69\x08\x1d\x80\xc8\xab\x05\xc3\xbe\x3f\xda\xa3\xec\xd6\x1c\xf8\xf1\x95\xcb\xff\x90\x28\x0c\x98\xf5\x07\xcf\x8d\xc7\x00\x04\xd2\x1a\xa6\xfc\x06\xb5\xf1\x01\x0a\x06\xab\x1a\xa0\x22\xc0\xb2\xb1\xaf\x5a\x82\x58\x98\xd7\xa8\x6a\xa4\xf0\x29\x74\xbc\xda\x40\x40\xdc\x01\x35\x0b\x27\x29\x18\x08\x9c\x52\x51\xae\x61\x85\x73\x54\x25\x08\xa5\x58\x59\x61\xd3\x65\x87\x2a\x0f\x06\x5f\x10\x96\x2b\xd2\x71\x5d\xc7\x14\xce\xf3\xc6\x28\x17\x25\x39\x23\x9e\x70\x7b\x13\x08\x50\x56\xf1\xda\x36\xd9\x36\x17\x6e\x76\x91\xec\x1a\xb9\x2a\xb0\x02\x02\x00\x3f\x02\xfd\x8e\x72\x1f\x55\xa8\x8d\x08\xf6\x14\x85\x23\x05\xe7\x9e\x63\xb9\x45\x76\x04\xfb\x24\x78\x04\x09\x45\x62\xba\xc4\x13\x97\x19\x7d\xb6\xf2\x7a\x81\x19\x3a\xba\x89\x8e\xd5\xae\x00\xe7\x0c\xa3\x04\x4c\x34\xb3\xde\x3b\x22\x51\xd0\x33\xb5\x96\xe6\x40\xa9\x7f\xb1\xfd\x08\xf7\x32\x45\x99\xf8\xf4\x6f\x2a\xa8\xe3\xc1\xc7\xea\x65\x99\x9a\xb5\x4e\x13\x14\x1e\x3d\x50\x31\x87\x35\x9b\x07\x7f\x91\xda\xf5\xbd\x51\x5f\xff\xcb\xd1\xc4\xe5\x5f\xf4\xbf\xc0\xed\x05\xd7\xc0\xfd\x45\xa1\xf6\x81\x90\xcd\x0c\xc6\xf7\x07\xa7\x58\x1d\x8c\x6a\x5a\xb7\x34\x76\x1d\x32\x26\x70\x9d\x9f\xb4\x72\xe3\x4a\x3f\x6d\x7d\x2b\xa9\x82\x4e\xfe\x47\x4b\xbf\xf1\x46\xa0\xfd\x7b\x61\x7d\x66\xdf\xbb\x23\xca\xdb\x7f\xcd\x0f\xf6\xdf\xe5\xca\x0b\x36\xc5\xce\xb8\xe2\x18\xf6\x2d\xf7\x95\x59\xef\x33\xf4\x1c\xc9\xc6\x82\xc3\x99\xed\xac\x57\xae\xfc\xd4\x3c\x52\x0e\x84\xe2\x93\x62\x97\x59\xb7\x4c\xa5\xa2\x64\x4b\x49\x9d\xb6\x94\xe6\xe6\x0b\x25\xe0\x41\xa4\xd7\xfa\xb1\x8c\xc2\x92\x53\xd5\xa1\x89\xc3\x5d\xec\xa9\x21\x72\xc5\x3f\xaa\x16\xdd\x06\xae\x5a\x5e\xd4\x91\xae\x8c\xd1\xff\xb2\xa9\xeb\x5d\xf5\xc3\xb3\x67\x87\xc3\x61\xf0\x90\xef\x07\x45\xf9\xf0\x8c\x11\x17\xcf\xfe\x02\x95\x52\x15\x58\xfd\x01\xcd\x47\x91\x23\x25\x04\xf2\x0d\xc4\x28\x24\x6d\xe7\x81\xc9\xcc\xaa\x2e\x8b\x3c\x5d\x21\x4a\x21\xde\x99\x52\x6f\xe3\x34\xf3\xc7\xd9\x4e\xba\x88\x04\x6a\xce\x64\x04\x24\x72\xfb\x15\xc9\x6f\xc4\xb6\x27\x4a\x66\x19\x06\xe8\x2d\x7e\x12\x70\x01\xa4\x35\x6e\x18\x15\xf1\x6a\x4a\x9a\xd6\x6d\x91\x98\x1f\x94\xfa\x17\x7a\xe7\x5f\xf4\xaf\x59\x58\xc8\xe9\x0b\x07\xd1\xf0\xf5\x7c\x7a\x73\xbf\x18\xdf\x7c\x94\x1e\xc6\x2b\x18\x40\x1a\x3b\x5d\x1f\x77\x46\xff\x1f\x90\xec\x3e\x7c\xc3\x73\xb6\xb9\x38\xfd\xc6\x6f\x3d\xa7\x83\xc9\x56\xc5\x96\xe2\x83\xe1\x5a\xc5\x9d\x97\x62\x0b\xc2\xa7\x7f\x25\xdf\xb3\xfa\x46\xb6\x80\xe2\x3b\x9b\xe3\xae\xa8\x37\x06\x32\x75\x4e\x78\xce\x35\x0c\xde\xef\xee\xa6\x99\xc6\x3a\xe3\xb2\xe2\x57\x05\x5c\xa3\x27\x22\x8e\x7a\xba\x06\xeb\xc0\x25\x94\xfd\x9e\xe7\xde\xbc\x85\xaa\xe1\xa5\xf1\x5e\xe6\x2b\x3a\x72\xdf\xde\x4f\x3c\xa1\x2e\x51\xfa\x43\x7b\xf6\xe0\xf5\xeb\xb3\x78\x69\x97\xe6\xb2\xf8\xf9\x2c\x5c\x19\x80\xe8\x7c\x30\xb4\x71\x98\xed\x2e\x2b\x8e\xa6\x84\x3a\x61\x7c\x08\x6b\xa2\xb1\x8a\x9b\x29\xfb\x00\x62\xb5\xce\x66\x16\x29\x54\xd9\x82\x84\x53\x95\x3e\xe4\x48\x79\xc5\x13\xc4\x9b\x5d\x67\x3e\x79\xee\x28\x6d\xd7\xda\x4b\x3f\xe8\x37\x45\xa9\x30\x93\x1d\xae\x11\x94\xe7\x25\x15\x41\x1f\x72\x84\xea\x14\x74\x71\x6b\xaf\xc9\xfe\xa5\x0b\x72\xf1\xf4\xb2\x77\x91\x17\x44\x95\x49\x72\x2c\xd4\x61\x77\x83\xa3\x90\xa6\xda\x4b\x0b\x3b\x6d\x2a\xce\x1f\x94\x72\xaf\x8d\x75\xb5\x5f\x96\xc5\xbe\x4e\xe1\x90\x23\xf6\x31\x8a\xd1\x28\x2e\x91\xb4\x73\x16\xba\x02\xb7\x5c\x40\xf2\x60\x43\xb2\x34\xff\x84\x85\xcd\xfe\x85\x94\xa5\xa9\x29\x10\x88\xa6\x9e\xa2\x87\x53\x50\x09\x57\xcf\x81\xd3\xff\x07\xca\xe9\x27\x45\x14\xa8\xda\xdf\x98\xaa\x32\x65\xa3\x57\x94\x8f\x2a\x57\xb5\x89\x93\x76\xa2\xe4\xf5\xbe\xc6\x32\x96\x48\xef\x80\xa8\x1c\x30\x2b\xdd\xc3\xa0\x1c\x14\xed\xd9\x61\x73\x3c\xcf\x8b\xfa\x3c\x7b\xd8\x65\x83\x4d\xbd\xcd\xfe\x32\x50\x7f\xfa\xfa\xf3\x3b\xfd\x0c\x9e\xfd\x74\x79\x39\xa8\x7f\xae\x7f\xc7\x77\x5c\x5c\x5c\x5c\xbc\x7c\xf9\xad\xfd\xff\xcb\xef\x5e\x5c\xc8\xff\xb7\x3f\x57\xdf\x7e\x77\xf9\xa7\xcb\xe7\x2f\xaf\x2e\x2e\xbe\xfd\xee\xf2\xc5\xe5\x9f\x2e\x2e\xaf\xae\x2e\xae\xfe\xa4\x2f\x7e\xc7\x36\xb9\x9f\xbd\x3d\xe1\xb4\xfe\x53\x16\xaf\xcb\xf4\x53\x75\xf2\xba\xcf\xfd\xfd\xbf\xe8\xcf\x4f\x97\x97\x6e\x7f\x0b\x4f\xf0\xcb\xef\xbf\x7f\xa9\x7f\xd2\xa3\x22\xaf\x8a\xb2\x4e\xf7\x5b\xa5\xee\x04\x9f\x7c\x05\xb8\xdc\xe5\xd1\xe7\xb5\xe1\x14\x76\xd0\x37\x87\x35\x40\x42\x42\x5d\x2c\x99\xe1\x40\x56\x1d\x59\x7f\x85\x83\xca\x60\xbd\x7b\x59\x3c\xae\x2d\xc6\x2d\x1f\x85\xf1\x7a\xe0\x4d\xb0\x21\x7c\xd6\x8f\x10\x91\x16\x67\x5c\xd8\xeb\x22\xd4\x9e\xf3\x44\xd4\x60\x7b\xb4\x39\xff\x59\x78\xf9\x02\x5d\xcf\xb0\x1f\x84\xf4\xa1\x31\x1f\x41\xfd\x85\x89\xd8\x38\x17\xda\xcb\x20\x92\xb7\x94\x80\xc2\x67\x04\x25\x56\x21\xea\x61\x1e\x98\x28\x7e\xff\xc6\x2e\xaa\x5c\xba\x34\xf8\x12\x6b\xdf\xec\xcb\x1c\x93\x05\xb5\xf3\x0c\x83\xaa\x18\xe9\x1d\x06\x12\x16\x0b\x57\xd2\xdb\xd4\x56\xf1\xb9\x54\x91\x93\xe4\x42\x78\x06\x1c\x08\xea\x1c\x05\x01\x05\x57\x6f\x27\x0a\x5a\x18\x14\xdf\xfa\x4c\x8c\x1a\xeb\xf9\xf4\xcd\xe2\xc3\x10\x83\xc7\x14\xa1\xbd\xe6\xb0\x6c\xf4\xb9\xb8\x2c\x06\x64\xf5\x74\xa6\xda\xe1\xd8\xae\xd8\x97\x7d\xa1\x0f\xc2\xea\x76\x10\x36\xfa\xac\x5f\x01\x51\x89\xdb\xe9\xed\xe4\xf6\xcd\x6c\x72\xfb\x76\xfc\x7e\x7c\xbb\x18\x68\x19\xbb\x9c\xbf\x1b\xde\xdc\xc0\xab\x7e\x82\xb8\xde\x74\xb6\x98\xdc\xbf\x57\x3e\x5c\xf8\x86\x02\x91\xa3\x9b\xe1\xe4\x7d\xe4\xa2\x7d\x1c\xe8\x82\xcb\xa8\x35\x1f\xde\x8d\xe1\x57\x93\x5b\x3d\xbc\xd5\x43\x88\xa5\xaa\xe9\x1b\xfb\xdc\xc5\x6c\x38\x5a\x44\x7a\x31\x9d\x2d\xdc\xad\x1f\x26\xf3\x71\xe4\xc2\x86\x6f\x66\xd3\xf7\x11\x07\x0f\x21\x68\x68\xef\xbb\xc5\x88\x2c\x74\x6d\x38\x02\x14\xae\xa7\x10\x23\xb6\xe5\x7a\x3c\xbc\x99\xdc\xbe\x9d\xdb\x9b\xe5\xc5\x03\xa5\xc6\xae\x46\x9b\xb0\x31\x82\x44\x89\x25\xa7\x01\xd1\x15\x7b\x98\x9d\xdc\x31\x68\x22\x51\x80\x0c\x78\x8e\xac\x23\x91\x3c\x9a\xb2\x4e\xb9\xdc\xbf\x59\xcb\xbd\x2d\x28\xe6\x80\x90\xed\x7d\x08\x60\x89\xb3\x34\x7f\xa8\x14\xb7\xa2\xb5\xde\xb1\x1c\x98\x6b\xde\x43\xea\x47\x57\xe2\x23\xdb\x38\x50\xea\x27\xfd\x01\xf5\x64\x89\xff\x95\x2b\xbd\x88\x3c\xa4\x58\x07\x37\x44\x7a\x92\xaf\xfe\xdb\x98\x24\x83\x67\xd3\xd1\xcd\xe8\xfc\x6a\x70\xf1\xfb\x19\x01\x4f\x9f\xff\x57\x2f\x5e\x5e\xbc\x6c\x9e\xff\x2f\x5f\x3c\xff\x7a\xfe\xff\x11\x3f\x76\xf4\xf5\xcc\x54\x06\x80\x68\x0d\x87\xe7\x6a\x70\x81\xe5\xdc\x95\xfe\xff\xec\x0a\xe0\xa4\xf7\x74\xad\xef\x2b\xa3\xd4\xfb\xf8\x18\xe9\xab\x8b\x8b\x2b\x61\x3a\xfc\xbf\xff\x0b\xbf\x19\x68\x78\xf2\x34\x87\x98\xdd\x88\xa4\xf9\x99\x5a\x59\x8f\x00\x47\x87\x4b\x49\x0f\xb3\x4c\x91\x86\xdf\x0c\x98\x99\x4c\xa2\xd4\xdd\xcd\x78\x38\x1f\xeb\xd9\x78\x78\xad\x17\xef\x26\x73\x7d\x3d\x1d\xdd\xdb\xad\x58\x8f\x86\xb3\xf1\x9b\xfb\x9b\x9b\x8f\x03\xfd\xfa\xa3\xbe\x9e\x7e\xb8\xbd\x99\x0e\xe1\x3c\x98\xce\xf4\xfd\xdc\xe7\x0c\xaf\xc7\xfa\xf5\x70\x3e\x56\x94\xf5\xe1\x07\x0c\x61\x73\x1c\x8e\x46\xd3\xf7\x77\xc3\xdb\x8f\x78\xfd\x64\xae\x6f\x26\xa3\xf1\xed\x7c\xac\x7b\xf6\xee\x33\xea\x03\x6b\x63\x40\x7a\xec\xed\x6c\x3c\xe6\x3c\xdc\x9b\xe9\xcd\xcd\xf4\x03\xdc\xd8\x11\xc6\xc6\x7c\x85\x7f\xe0\x40\xa9\x39\x63\x53\x06\x18\xc6\xc6\xaf\x55\x6a\x1e\x1c\xe2\x01\xcc\xe9\x33\xf0\x35\xea\x5e\x64\x83\x2d\xd6\xca\x0d\x21\x9a\x48\x53\xae\xb7\x1d\x89\x62\xb4\xbe\x8f\xd7\x02\xc5\xf6\x7f\xec\x99\x68\x86\x0b\x5a\x7a\x84\xf1\x82\xf0\xaf\x72\x09\x82\xae\xa7\x61\x2b\xce\xc4\x6f\xaa\xb3\x7e\x60\x13\x76\x96\xff\x28\x51\xfe\x93\x17\xe7\xce\x56\xa4\x5a\x5a\xa4\xde\xf2\x00\x6e\xa2\xde\x8d\xf4\xae\x34\x20\x69\x91\x98\x32\x7d\x04\x21\x02\xd2\xdf\x04\x50\x78\x9e\x08\x6b\x4c\xf7\x20\xe2\xe1\x05\x09\xcc\xcf\xfc\xcf\x7e\xe4\x58\x26\x91\xd8\xb8\x2d\x58\x20\x18\xb2\x83\xc2\x65\xa0\x69\x74\x7d\x85\xa1\xd9\xae\x7e\xd1\xac\x09\xf5\x3e\x10\x47\x0d\x7a\x56\xd6\xe1\x9d\x51\x3a\xe3\xac\x2f\xe6\xc9\xd5\x40\x5f\xbb\xba\xae\x0a\xaa\x0a\xe5\xe3\xce\xd8\xea\x13\xb5\x7f\x80\x0b\x20\x04\x01\x01\xf3\x13\x93\x99\xf0\xe0\x93\xc5\x4c\x50\x79\x9a\x7a\x45\x2b\x47\x9f\xc4\x02\x7a\xe6\x40\x99\x01\x01\x8e\xad\x02\x8a\xbe\x7a\x63\xbc\xa8\x2f\x25\x63\x20\xc0\x18\x07\x5f\xdf\x1c\x1f\xf9\x36\x3f\x36\xca\xc3\xb2\xe5\xac\x1a\x9c\x01\xf0\x2c\x10\x52\x69\xb4\x98\xf9\x3a\x5d\x2a\x45\x85\x30\x35\x87\x7c\x77\xe6\x3f\x62\x0a\xd3\x9c\x93\x83\xfa\x39\x09\x95\x42\x57\x8f\x18\x19\xf7\xa1\x28\x3f\x9d\x85\xf5\xd3\x08\x0f\x43\xe0\x1f\xa0\x80\xcd\x03\xc5\x7f\x40\x47\x2e\xd4\x0f\xe2\xce\x91\xa2\x52\xa8\xc2\x30\xd4\xc1\x4b\x98\xce\x07\xb9\x2b\x91\xb3\xb8\x62\xbd\xdd\xed\x3e\xab\xd3\x5d\x06\xe1\x42\xc4\xc4\x95\x1a\x99\xf5\x3d\xce\x83\xaf\x81\x14\x49\x85\xac\xe9\x89\xe1\xcc\x98\x75\xa3\xc4\xec\x7a\x0e\x30\x0f\xdf\x9d\x9e\x1e\x00\xf6\x7a\xc8\xa5\x0e\x07\x2e\xde\x33\x93\x64\x40\xc2\x26\x74\x51\x3a\xe2\x70\x28\x1e\xf2\xf4\x3f\x09\x76\x7e\x4e\x24\xc0\x24\xa2\x5c\x86\xbf\x15\x8c\x50\xbd\xca\x18\xec\xfb\x3e\x41\xcb\x4f\x0e\x33\xeb\x9f\xad\xc9\xe1\xb1\x43\x9c\xa5\x95\x53\x99\x55\x30\x0f\x20\x3e\xb7\xaf\x3f\x5b\x58\x2d\xcb\x6c\x3e\x53\x64\x6d\x37\xb5\x34\xb7\x73\xc3\x1a\x86\xc1\x1e\x88\x44\x63\x9e\xe8\x9c\x33\x2d\x72\xfa\xf7\xaa\x3e\xcc\x6b\xd2\x02\xc5\x2d\x43\xad\x4a\xe3\xff\x9a\x27\x8e\x8c\x14\xf2\x8d\x8c\xdc\x71\xd5\x46\x76\xb3\x0c\x00\xfd\x9b\x18\x97\x22\x96\x4b\x8b\x3a\xea\xe5\x1e\xfb\x80\x55\xb9\x01\xea\x5d\x1b\xd8\x7c\xf6\x52\x43\x00\xeb\x26\xfb\xa4\x08\x8c\xd9\x69\xfb\x52\xd5\x68\x3b\xf2\x2c\x34\x3e\x12\x0e\x11\x6e\x65\xb0\xd3\xf9\xd2\x53\x20\x5e\x30\xb5\x51\x1c\xbe\xa7\x4d\xa7\x35\x41\xbc\x7d\x7f\x62\x96\x88\xb0\x80\x17\xef\xe3\x4d\xa8\xd5\x84\x46\x55\x39\x73\x97\x36\xe4\x7a\x99\xc7\x8d\x11\xe5\xcc\x1b\xdd\xdc\x54\x64\x1e\x8c\x9d\x0c\x2a\xee\x23\xc5\x32\xdc\x58\x2b\x5c\xf5\x5e\x27\x48\x05\xfc\x10\x30\x65\x21\x86\xd1\xe4\xe5\xe3\x3c\x06\x63\xad\x04\x04\xeb\xd9\x09\x28\x8d\x6b\x9c\x93\x89\xcc\x8e\x82\x56\x12\xba\x08\x92\xcf\x5f\xb2\x9e\xec\x42\xfa\x41\x29\x67\xe4\xe8\xc5\xbb\xe1\xa2\x89\x27\x72\x7e\xfb\x70\x7e\x3e\x99\x3f\xed\xb5\xab\x1e\xa2\xa9\x84\xf3\xce\xf8\xa8\xfe\x00\xec\xae\x99\xb5\xd6\x6e\x3e\x46\x68\xc4\xbc\x1f\xfe\x75\x2c\x61\x65\x93\xf1\x1c\x20\x46\xb3\xf1\x9c\xad\xb5\xb9\x9a\xce\xf4\xdb\xfb\xa1\xfd\xf3\xd8\xfe\xf9\xe4\x1b\x22\x30\xc6\xae\x27\x73\x70\xbd\xe7\x80\x61\x02\xa4\x88\x78\xb8\x6a\x3c\x5c\x37\x1e\x2e\xf0\x5e\xfc\x9d\x10\x61\x80\xab\x03\xbc\x97\x7a\x32\xd4\xd0\xc6\x7b\xdd\x7e\xec\x88\x37\x44\x7a\x38\xd7\x8b\xe9\x0f\xaa\x37\xec\xa3\x79\x79\x7f\x0b\x0e\x3c\x82\xbd\xa6\xb3\x66\x30\xc2\xbe\xca\x21\xee\xec\x33\x11\xdf\x34\xa2\xf6\x0d\xf5\x68\xfa\xfe\xf5\xe4\xd6\x36\x6f\x3a\xfb\x2b\x82\xa2\xf4\xf0\xed\xdb\xd9\xf8\x2d\x80\x73\xa6\xb3\xbf\xbe\xb2\xbf\xed\xbd\xc6\xf7\xcd\xc6\xf3\xfb\x9b\xc5\x9c\xc7\xf0\x6e\x36\xfd\xd7\xf1\x68\xa1\xef\x6f\xaf\xc7\xb3\xc5\xf0\xaf\xe3\x5b\xb4\xaa\x55\x80\xf4\x7b\xea\xbd\xfa\xe4\x7b\x29\x8e\xa2\x9a\x71\x14\x88\x76\x4c\x5e\xdf\x2f\xa6\xb3\xb9\x6e\xc7\x51\xae\x27\xb3\xf1\x68\x61\x47\xc6\xff\x17\x83\xab\x22\xc5\x88\x2b\x3d\xfe\x69\xfc\xfe\xee\x66\x38\xfb\x18\x35\xe0\x56\x01\x2e\x8c\xa3\x31\xbd\x36\xae\x4f\x49\x5c\xdf\xdd\x6c\x3a\xba\x9f\xb9\x1e\x9f\xdf\xbf\x9e\x2f\x26\x8b\xfb\xc5\x58\xbf\x9d\x4e\xaf\x61\xd6\x20\x26\x6e\x3c\x7f\xe5\x30\x57\xf7\x76\x3c\xaf\x87\x8b\x61\x64\xa7\xec\xdd\x6c\xfa\x66\xb2\x98\x43\x6f\xbf\xb6\x9d\x68\x67\xc2\xe4\x76\x31\x9e\xcd\xee\xef\x6c\xaf\xf5\xf5\xbb\xe9\x87\xf1\x8f\xe3\x99\x1e\x0d\xef\xe7\x76\x7d\xdd\x5e\x6b\xeb\x9d\xdc\x7e\xb4\xfd\x32\x9d\xd9\x95\xa5\xba\xc3\x45\x3e\x42\x34\x5f\xcc\x26\xa3\x85\x8c\x2a\x4d\x67\x18\x36\x12\x40\xb1\xdb\xf1\xdb\x9b\xc9\xdb\xf1\xed\x68\xac\x64\x30\xa9\xef\x82\x49\x13\x7c\xed\x87\xe1\xc7\x16\x1c\xed\x4d\x88\xf2\x64\x10\x17\x01\xb4\xd4\x17\x00\xb4\xc0\x89\x7a\x37\x9e\x8d\x5f\xdb\x37\x4c\x7e\x1c\xfb\xf8\xd8\x5c\xc2\xea\x94\xd8\x48\xf4\xf0\xed\x70\x72\x3b\x5f\x84\xb3\xe3\xc3\xbb\xc9\xe8\x9d\x7e\x3f\xfc\x48\xf3\x16\x82\x60\xf6\xf1\xb3\x8e\xb6\x22\x30\xec\xf5\x20\x30\x62\x28\x37\x7a\xdd\xd8\x1b\xf1\x0c\x21\xf9\xc4\xc4\x78\x78\x51\xb7\xe5\xea\xd8\xe1\x31\x6c\xeb\x04\x25\x1c\x3b\xd2\x2a\xce\xd1\x1a\x6e\x78\x02\x66\xf0\x30\x90\xe4\xef\xa4\xee\xd0\x6d\xb3\xba\xda\x84\x7d\x05\x85\xb1\xfe\xd8\xd0\x93\xdc\xd1\x6b\x47\x01\x9e\x07\xcc\xed\xb8\x8e\x9f\x34\xef\x83\x13\xf3\x58\xec\x95\xf8\x4c\x14\x22\x16\xe5\x70\x4d\xec\xd1\x0f\x4a\x9d\x89\x6c\xc1\xaa\x6f\x7d\xfe\x8b\x73\x7b\xf2\x56\xa6\xac\xb1\x2c\x69\x05\x55\x60\x35\x88\x16\xf6\x9f\x0c\x07\xa8\x20\x1c\xe0\xd8\x19\xa4\x6b\x5a\x69\x88\x13\xb0\x45\x59\x52\x9c\x00\xab\x52\xd8\xad\x41\x0c\x79\x5a\xc1\x87\x83\xbc\x30\x2a\x30\x24\xed\x72\x09\x46\xd6\x84\x6e\xb4\x8b\x84\x44\xa0\x5f\x25\x62\xec\x4f\xc6\x49\xa8\x1c\x44\x5f\x0d\x2e\xc8\xff\x76\xd1\x83\x57\x2e\x8d\x4b\x3a\xa9\xda\x35\x90\x29\x30\x01\x95\xc7\x1c\x55\x1e\x95\x17\xd0\x5c\x41\x6d\x1e\x64\x50\x74\xac\xb8\x63\x25\x5a\xc5\x41\x53\x6a\xbd\xa9\xeb\xdd\x0f\xcf\x9e\xed\xf6\x65\x36\x28\x56\xd9\x0a\x12\xac\xf6\x3f\x9e\x95\xd4\xfe\x67\xd3\xd9\xdd\xcd\xb3\x81\x47\x14\x49\x23\xc7\xd3\x15\xdc\xf8\x8a\x61\x79\x01\x38\x74\x0e\x57\xbd\x8c\xab\xb4\x72\x07\xa5\xea\x0e\xe3\x13\x4a\x89\x89\x2e\x90\x65\x27\x4b\xed\xf8\x31\x86\xe7\x26\x60\x0a\xf0\x25\xbf\x2a\x8b\xf3\x87\x7d\xfc\x60\x88\x92\x16\xfc\x1e\x9c\x04\x21\x4c\xb3\x6a\xb7\x9c\xd4\x0b\x1d\x2c\x8f\xf8\x04\x60\x95\x3d\x16\xd9\x3e\x87\x4c\xb9\x9b\x65\x84\xe1\x47\xed\xc0\x2d\x54\x52\x3a\x9d\x45\xf0\x1b\x96\x66\x13\x03\xe3\x81\x0a\xa6\x03\x32\xb3\x74\xa1\x14\x82\xcb\x5c\x1a\xdc\xba\x3c\x34\x48\x87\xc3\xc1\x8f\x91\x1b\x9e\x01\x58\xa2\x22\xba\x80\x62\x3d\xff\xfb\xc9\x1f\x8d\x6b\x61\x02\x34\x4b\x99\xbe\x46\xd7\xcf\x94\x5c\x2d\xfe\xc5\x8f\xd3\x03\x7d\xc7\x19\x9d\x15\xe9\x2a\x2c\x8f\x27\x2e\x57\xd6\xb3\x09\x13\x87\x9f\x69\xa4\x5d\xc5\x8d\x68\xdf\x40\x3a\x55\xbd\xaa\xff\x83\x7a\xfa\x53\xfd\xd3\xce\x60\x7f\x1f\x7d\xd1\xfe\x7e\x5b\xe4\xe7\xdb\xdf\x7e\x8f\x67\x99\x69\x15\xba\x41\xb8\xcd\x0b\x75\x9b\x5f\xb2\xcd\x2b\xc1\xb1\xc7\x34\x5a\x76\x4f\xe6\xc2\xfc\x70\x4f\xf6\xa4\xc5\xb6\xbd\x82\x77\x9e\x6a\x95\xaa\x5d\xba\xda\x17\xfb\x0a\x20\xc5\x9c\x19\xfc\xa3\xf7\xef\xee\xed\xfb\x0c\xa8\x73\xfc\x31\x06\x2b\x5f\xe8\xa2\x78\x29\x16\x4a\x44\x36\x44\x2d\x29\xcc\x21\x46\x5a\xd1\xfe\xe1\x7e\x67\x97\x26\x30\x40\x0b\xa9\x53\xf9\x8a\x96\x84\xd3\x7e\x47\x5a\x60\xa6\x22\x8a\xaf\xeb\xce\xf9\x15\x46\x70\xe4\x6c\x53\x4a\xfe\x0b\x46\x3b\xb8\x18\x8b\x7a\x1a\x19\xdc\x13\x13\x23\x4f\x14\x77\x02\x6c\x4d\x81\x5e\x62\xab\xed\xbf\xda\x25\x95\xee\xe8\x89\xe0\x94\x3c\x03\x62\x57\xf9\x26\x56\x14\xd1\x54\xfb\xdf\x90\xe4\xe8\xa2\x83\xb6\xc5\xc7\xa2\x5e\xdb\xfb\x9e\x0f\x46\x94\xa7\xee\xc5\x95\x9c\xc3\x7d\xcf\xb5\x0d\xcc\x41\x72\xa8\x2b\x62\x6b\x1c\x3a\xb9\x6f\x0c\xd8\x31\x7c\x31\x8c\x33\xda\x8d\x3f\x72\x2e\xbc\x8b\xdc\xd9\x59\x07\x48\x4e\x57\xc4\x0b\x38\x2d\xe4\x0a\x62\x1d\x75\x14\x18\x6e\xe8\xf6\x37\x34\xb1\x80\x76\x10\xb7\x4d\x0c\xaf\xea\xb0\x5d\x3a\x94\x8b\x0f\x24\x8e\x8d\xa0\xf1\xb2\xbd\xe3\x82\xc2\xca\x95\x1b\x34\x48\x01\x42\xf6\xcb\x75\x51\x2e\xd3\x24\x31\x14\xea\x65\x16\x33\xd9\x06\xf5\x01\x8a\x78\x1d\x6d\xaa\xec\x9c\x20\xbb\xdb\x6e\x78\x5a\xe9\x06\x07\xa7\xf2\xac\xdc\x19\x80\x11\x10\x34\x28\x9f\xb9\x04\x0e\x0b\xd0\x30\x4b\x1c\xf5\x64\xf8\xe0\x28\x78\x96\xac\xc9\xb4\x67\xaf\xe0\xbe\x71\xb6\x2b\xc4\x7c\x5c\x34\x3b\x7c\x1a\x2e\x55\x9e\x57\xdf\x0e\xdc\x38\xbd\x05\x7a\x18\xd5\x64\x4f\x23\x6a\x38\xe0\xc9\xc7\x57\x75\x04\xb3\x96\x47\xdc\xf8\xfc\x9e\x46\x0b\xd3\x54\x6a\x63\x4a\x03\x26\x07\xd5\x8f\xca\xd4\x07\x5b\x8c\xf6\x3e\x98\xb7\x8d\x9b\xb5\x27\x42\xe9\xca\x8c\x48\x62\xb4\x30\x39\x22\xa1\x26\xa7\x92\x25\x0a\x71\x2b\x20\xda\x1c\x61\x16\xc0\x78\x18\x4b\x9c\xc4\xbb\x3a\xd2\xac\x84\x8d\x65\xc8\x91\x36\xf9\xc6\xda\x9f\x11\xc7\x8c\x23\x47\x46\xa5\x28\xb2\x14\x7d\x61\x8e\x85\x01\x30\x68\x3b\x88\x8c\x0d\xf2\xd3\x28\xc7\x73\xd2\xd1\xdf\x20\xa5\xd5\xbc\xc3\x76\x56\x69\x8a\x75\xdf\x73\xfd\x3b\x53\x59\xd5\xbe\x4a\x84\xd6\xa7\x9b\x02\x04\x3f\x60\xad\x81\x3a\xe4\xa5\x0e\x2a\xd8\xd7\xc4\xef\x88\xe4\x47\x22\x56\xfe\x22\xa0\xb9\x07\x17\x81\x72\x77\x0b\x44\x41\x88\x21\x74\x63\xd1\x23\x0a\x50\x6b\xc3\xba\xfd\x1d\x27\x46\x9b\x70\x5c\x98\x3e\x7d\x75\x82\xa2\xbe\x72\xda\x1d\x4c\xde\x0a\x28\x7c\x62\xd4\xac\xa8\xde\x88\xaa\xdc\xd7\xa4\xdf\xc8\x21\x5f\xe5\x42\xbe\x01\xe7\x47\x67\x23\x69\xa5\xf5\x1d\xdd\x1a\x4c\x5e\xd1\x44\x15\x3b\x98\x0f\xbd\x9e\x45\x74\x80\xd7\x6d\xe5\x6b\x82\x81\x50\x83\x4a\xc7\xc1\xbf\x39\xb6\xe9\x76\xa3\x80\x90\xbb\xc7\xb1\xeb\x26\x3d\x46\xbf\x43\x10\x80\x06\xd7\xb3\x86\x87\x5d\x47\xa5\x4c\x8e\xd6\x1c\x9a\xb7\x2c\xad\x9b\xec\x15\x45\x52\xdb\x29\xbd\xe7\x17\x7d\xe4\x36\x2f\xd6\x7a\x69\x56\x05\xa8\x12\xc5\x80\x2a\x71\xd4\xe6\xb9\xf7\xd0\xd0\x90\x11\xec\x89\x2e\x4f\x40\x2a\x50\xb8\xcf\xef\x4a\x03\x67\x0e\xbe\x59\xce\x3d\xf0\xc0\x4b\x43\x91\x78\x41\x68\x84\xd5\x5f\x81\x34\x46\x1d\x48\x2c\xf0\xa4\x7c\x39\x40\x56\x15\xce\xd7\x50\x4e\x86\x5d\xa7\x26\xd4\xab\xf2\x1c\xe1\x70\xc6\x86\x4c\xb0\x7b\xaa\xff\x76\x80\x17\x4e\x0e\x3a\xe6\x5c\xe1\x84\xf3\xf1\x89\x88\x6d\x09\xb5\x01\xfe\x11\xaf\x9b\xc1\x0a\x1b\x4a\xa6\xf2\xf0\xcc\x02\xaa\x11\xa2\xf9\x43\x35\x14\xda\xab\x20\x0f\xb0\xac\x60\xbc\x90\x0a\x83\xbf\x83\x13\x04\x4a\x22\x9c\x69\xd6\x10\x66\xad\x81\x50\x92\xd5\xda\x76\xbc\x78\x0f\xad\x9a\x67\x0a\xad\x2b\x38\x59\x68\x9f\xf1\xf8\x37\xb0\xb8\x02\xff\x1c\x83\xeb\xf7\x83\xf9\x80\xc8\x24\x9f\x99\x9f\x81\x53\xb2\x34\x0f\x7b\xa6\x13\x12\x24\x7d\x32\xf1\x44\x72\xa2\xf6\xde\x6b\x63\x5f\xc8\xa5\xea\x23\xcc\x3e\x63\xc8\xe2\x60\x80\x1d\x9a\x9e\x40\xd4\x0d\xa4\x56\xe4\x73\xd7\x26\x7c\x36\xb2\x4c\x41\x1d\x00\x9a\x23\x60\x1a\x39\x5e\x5c\x0c\x1d\x90\x3e\x32\x7d\x2d\x51\x8d\xb4\x89\x6e\x5b\xfd\xa1\x02\xdf\x23\x16\x44\x27\x68\x9d\x30\x85\x2e\x18\x94\x70\x62\x91\x04\x2a\xe5\xd7\xf7\x39\xb7\xd5\x24\xea\xa9\xdc\x3b\x07\xb9\x1a\x5a\xa2\x44\x3b\xd7\xc5\xa1\x1a\x13\x3f\xd0\xdf\xf6\xc9\x03\xf3\x02\x55\xa6\xae\x49\x91\x4c\xe6\xb6\xbe\x60\x4b\xa4\x6f\x27\xe7\x25\x26\xb3\x80\x4b\x67\xba\x39\x8b\x14\x71\x16\xfd\x52\x0a\x22\x58\xde\xe2\x02\x12\x15\x68\xb0\x11\x75\x44\x86\x4e\x73\x11\xf9\xe3\x59\x05\x84\x0c\x05\xc8\x22\x16\x4d\x12\x22\x66\xd9\xf9\x02\x32\x22\xd5\xb0\x63\x7c\xbb\xc3\xbd\xe4\x84\x1b\x4d\xcc\x43\x50\xcc\x21\x99\x87\x5a\x94\x7d\x58\x9b\x22\x4a\x2c\x02\x86\x58\x51\xc0\x23\x24\x46\x9d\xc1\x89\xbc\xea\x98\xda\x17\x84\xe5\x0c\x5a\x75\x42\x56\x70\x3c\xba\x7f\x11\x27\x8c\x02\x6e\x33\x4f\x41\x04\x04\x1b\x21\x0d\x51\x8b\xbc\xaf\xc9\x46\xe4\x2a\x8f\x94\xa3\x25\x92\xe2\x0c\xc4\x4f\xa4\x43\x7e\xa2\x27\x32\x74\xfe\x1c\xcd\x4c\x5c\x12\xb5\xbb\x4c\x02\x23\xdd\x75\xd7\x6e\x13\xcc\xfc\x98\x1f\xa8\x3c\x9b\x25\xf1\x2c\x4b\x9f\xee\x08\xd5\x3f\xc0\xe1\x5c\x16\xdb\x1d\x2a\x5f\x24\x98\x14\x76\xbd\xec\x79\x60\x60\x8e\xa5\x55\xb5\xa7\x8e\x00\xdc\x07\xf0\x14\x3a\xe6\xf3\xaa\x36\x3b\x26\x1b\x83\x20\x8a\x1b\x1b\x3b\x61\x82\xe2\x3b\xd5\x98\x2f\xf0\xe0\x81\x1e\xe6\x4c\x55\x45\xcc\xfa\x32\xbc\xd1\x78\x93\x7f\x91\xef\xff\x5d\x51\x11\x2d\x9a\xb6\x6b\x64\x9f\xaf\x68\xa5\xe7\xcd\x87\x1d\xcc\x52\x2f\xf7\x59\x66\xea\x34\xd7\xcb\x22\x2e\x13\x4a\x08\xbb\xdd\xae\xcd\x7b\x84\x80\x24\xb3\xc5\xf1\x5d\x1a\x5d\x59\xdf\x0a\xcd\x74\xd6\xa5\x4e\x73\xa0\xce\x4c\xeb\xa3\x02\xc1\x56\x22\xb6\xe5\x4c\x2e\x9d\xb5\x7e\x4b\x75\x90\x59\x12\xd6\xa5\x60\x69\x9c\x96\x74\xae\x6e\x11\x46\xaf\x44\xbb\xd0\xe2\xc0\x3b\x1d\x0d\x53\x9a\x63\x2d\x2d\xf1\xe8\x5a\x1b\x1d\x1e\x38\xd0\x93\x1c\xe1\xdb\x69\x8d\x0b\x89\x6d\x4b\xdf\x88\x8d\xc9\xec\xb6\x9d\xc5\x07\xa8\xed\x84\x73\xc0\x9f\x8a\xee\x66\xa8\x99\x94\xb4\x57\x8a\x8f\x2b\x22\x5a\x2e\xcd\x1a\x40\x4f\x74\xc6\x38\x30\x55\x9a\xd7\xc2\x56\x60\x1a\x42\xfb\x16\x6b\x87\x22\x6d\x14\x31\x20\x32\x3a\xdd\x8e\x32\x6e\x4c\xc8\x36\xb7\x38\x81\x4b\xeb\x08\xf5\x23\xd1\x0d\x12\xd8\xb6\x96\xab\x7d\x55\xbc\x45\xa6\xcd\x4c\xf2\x59\x39\xaf\x5e\x02\xdf\x9b\x54\x3c\x87\x3c\x2b\x62\x60\x03\x60\xd5\x21\x25\x34\x60\x40\x30\xb8\xa8\x6a\xcc\x53\xb4\x34\x49\x48\x27\xd6\xf3\x5d\x7a\x25\x2c\x94\x9b\x51\x88\x3c\x61\x56\xea\xc7\x34\x21\xa2\x1a\x38\x0a\xf2\xc2\x55\xd2\x7a\x9c\x4d\x53\x72\xa1\xfb\xd4\xa3\x59\x27\x6d\x33\x72\x68\x44\xcc\x1f\x4f\x30\xc4\x70\x90\x8f\xc7\x8e\x4e\x5b\x26\xcd\x11\xf3\x2d\x4d\x7d\x30\x26\x57\x72\x60\x05\x1d\x17\x44\xdf\x28\x98\xb0\x8d\x6b\xdb\x69\x64\x74\x81\xf6\x31\x9d\x23\x4b\xa3\x79\x4c\x30\x49\xc2\x2c\x49\x0e\xd8\xed\x89\x00\x83\x39\xd4\xe8\x67\x37\x65\x85\x8e\x9f\x22\x74\x25\x31\x29\xb6\x5d\x4a\x78\x5e\x16\x1f\x7c\x3d\x03\x94\xc1\x17\x6b\x3d\xdd\xa4\x85\x5b\xd8\xf7\x79\x6a\x87\x08\xfe\x08\x97\x0e\xb7\xa6\x4c\x57\x71\xd4\xa1\xb7\xbb\x2b\xd3\x7c\x95\xee\x32\x86\x66\xe5\xeb\x2c\x5d\x61\x20\x0c\x66\xf3\x3f\x0e\xff\x3b\x78\xf6\xef\x77\x37\xbf\x2f\xfc\xfb\x73\xf5\x5f\xdf\x3e\xbf\x78\xd1\xc4\x7f\xbf\xf8\xee\xf2\x2b\xfe\xfb\x8f\xf8\xf9\xf7\x62\x67\x9a\xe9\xcc\xde\xbf\xdf\xdd\xf4\x83\xa4\x66\x90\x46\xb3\x7b\x43\x98\x3c\xb0\x0f\x51\x23\xae\x85\x2d\x72\xdd\xab\xb7\x08\x36\x1e\x7d\x36\x03\x80\xcf\xe6\x0d\x93\x45\xec\xd5\xca\x94\x35\x2a\xa0\x5a\x57\x68\x67\x58\x2e\x1d\x58\x2e\x00\xfc\x96\x55\x05\xaa\x77\x25\xa6\x4a\x1f\x72\x16\x34\x7c\x7b\x77\x03\xbb\x56\x5c\xc3\x91\xb1\x44\x2e\xc3\x93\x8c\x7c\xbd\x37\xf3\x37\xfd\x81\x52\xb3\xc0\xb6\x44\xb7\x05\x21\xa2\x22\xa9\xbe\x4c\x73\xeb\x78\x02\xf4\x30\x22\x50\x67\xe9\x96\xbb\xd4\x71\x88\x20\x2f\xe6\xd5\x27\x3a\xe4\x31\x3b\x0a\xb6\xc0\xa0\xd8\x9a\xfa\x07\xa5\x2e\x07\x3a\x6c\x52\xd5\x94\x8c\x27\x9d\x78\x97\xa3\xef\x2e\xf3\x22\x55\xb9\x2c\x45\x54\xa1\x34\xdc\x79\x23\xf3\x2d\xf1\x75\xd9\x03\xa5\xae\x3a\x5b\x20\xba\x80\x5b\x80\xac\xba\xe6\xb7\x6f\x04\x7b\xf2\x41\x25\xa0\xa2\xe8\x22\x9a\xbc\x2c\xab\x56\xf9\x1e\x76\x5b\xb8\x6c\xfb\x40\xa9\xe7\x98\x88\x80\x5a\x25\x98\xf5\xad\x09\xeb\xf0\xa3\x5c\xac\x04\x3a\x04\x49\x51\x62\x09\x12\xd7\x26\x31\x8b\xb0\x82\x38\xa5\x03\x17\x04\x4b\xa4\xbb\x1c\x49\x54\xda\xc1\x3d\xcd\x66\x0c\x94\xfa\x96\xd2\x25\xac\x64\x14\x78\x54\xf2\x0d\x28\x7a\x08\x73\xb4\x76\xd1\x41\x8a\x6f\x43\x6a\x02\xdc\x49\xc7\x46\x57\xcb\x87\xda\xbb\xe6\x28\x71\x0c\x0a\xc7\xba\x57\x6d\xa1\x7a\x7f\xe1\x64\x90\xb1\x47\x8a\x75\x6b\x6d\x23\x65\x2a\x9e\x8c\x5b\x64\xf8\x7e\x24\x46\x64\xa1\x3b\x2a\x0e\xe8\x5e\x23\xdd\xfd\x9f\xc5\xce\x0c\x56\xc5\xf6\xd9\x7b\xfb\x1e\xbb\xf6\x5e\xa0\xa2\x3e\xe1\xd1\x69\x15\x90\x00\xb2\x90\x70\xf5\xf2\x05\x4e\x1d\xd9\xa5\xaf\x56\x71\x89\x45\xf6\x08\x87\x54\x1c\xf8\x0a\x24\x7d\xc1\xbb\x03\x3b\x30\x11\xc9\x2f\x9e\x81\x09\x1d\xf2\x10\x79\x82\xab\x06\x90\xc7\xa3\xc9\xa8\x14\xd4\x74\x74\x16\x33\xbe\xfe\xa8\xff\x7d\x7a\x37\xd6\xa3\xe9\xec\x6e\x3a\xc3\xfa\x92\xff\xf3\x7f\x00\x20\xf1\xcd\x37\x00\xe9\x1a\xde\x7e\xd4\x8e\x5c\x4e\x79\xb8\x62\x80\x79\xfc\x43\x79\xe6\xb4\xfd\x08\xc6\x49\x8e\xaf\x07\x7a\x72\xab\x1a\x05\x8e\xad\x6f\xb2\xed\x5e\xcc\xbf\x10\xac\xa7\x3a\xc1\x7a\xba\x0b\xac\x77\x92\x1e\x4d\x40\xf4\x54\x57\x97\xfc\x6a\x88\x9e\x02\x88\x9e\xfe\x6d\x20\x7a\x76\x08\xfe\x29\x20\x7a\x62\x7e\x3a\x90\x9e\xfa\x62\x16\xb5\x06\x5a\x46\x4b\xb4\x4c\x80\x91\x51\x8c\x91\x69\x6d\xa3\x68\xc3\x3f\x01\x9c\xe9\xd8\xf2\xe6\xcc\xce\x1e\x28\xeb\xdb\x06\x10\xb8\x9f\xcf\x37\xe2\x1b\x03\x2e\xe7\x55\x69\x92\xb4\x46\x1c\xd5\x7f\x9b\x5a\xcc\x7f\xc4\xcf\xe0\x59\x62\x76\xa5\x59\x59\xf3\xe9\x7f\xbf\xbd\xbb\x39\x7f\x3e\xb8\x38\xb7\xa7\xd7\x79\xbc\xaf\x0b\xeb\xa9\x9c\x3b\x89\xe8\x5f\xeb\x22\x7c\xc6\xfe\x7f\xfe\xe2\xe2\x22\xb4\xff\xaf\x2e\x5f\x5c\x7c\xfb\xd5\xfe\xff\x23\x7e\x08\xf0\x63\xad\xe6\xc7\xe7\xba\x36\x3f\xd7\xe0\x8f\x2b\x35\xbc\x5f\x4c\x47\xd3\x5b\x28\x44\x7f\x33\x79\x7b\x3f\x1b\xeb\xf9\x68\x36\xb9\x5b\x10\x71\xeb\x64\x7a\xab\x14\xfb\x08\xcf\x07\x17\x91\xbe\xfc\xb3\x1e\xee\x1f\xec\x49\x7d\x75\x71\xf1\xbd\x64\x5a\xc3\x9a\xd0\xef\x4f\x5a\xe1\x04\x1c\xfa\x0b\x59\x09\xeb\x6a\x0d\x78\xb8\x7f\x51\x6a\xcc\x14\x7a\xcc\x53\x50\x53\x4d\x0b\x60\x1f\x1b\x75\x65\x8f\xa6\x5c\xc6\x75\xba\x0d\xa2\x35\xde\xb9\x50\x5e\xad\x7e\x89\x45\x1c\xf9\x03\x6a\xbd\x39\x69\x27\x6b\x83\x9a\x84\x63\x21\x63\x9e\xf8\x58\x5f\x27\x09\x7a\x85\x25\x17\x0a\xfa\x7e\xd7\x41\x1f\xa6\x9a\xec\xcb\x9e\xad\xad\x77\xf6\xf6\xee\xe6\xf1\xf9\x59\x1f\xfc\x1a\x89\x80\x20\x3e\x49\x5f\x81\xb7\x34\x71\x59\x29\x27\x30\x0f\x82\xf6\x0e\x3e\xd2\xe2\x01\xe6\x2a\x29\xe0\xe5\x93\x46\x10\xff\x56\xa5\x95\x8c\x8a\x68\x68\x87\x60\x36\xc3\xae\x73\x5d\xc0\xc1\x50\x32\x30\xb9\x6b\x83\x2e\xc2\x58\x59\x71\x68\xc5\xb4\x87\xb4\x95\x7c\x03\x14\x5e\xe9\x2a\xce\x14\xf1\x8f\x51\xaa\x41\x52\xe3\xc9\xc2\xac\xd5\xa6\xb0\xdf\x2a\x0a\x7a\x44\x02\xb0\x8f\x88\x8f\x8b\xa0\x56\x72\x00\xc8\x36\xb4\x48\x47\x45\x82\x22\x6b\x02\xf2\x05\x29\x46\x8f\x1c\x0b\x98\xa1\x45\x4b\xa1\xaf\x14\x89\x37\x0a\x42\xfe\x2e\xcd\x19\x75\x76\x5b\x94\x5b\xc8\x3a\x83\x40\x33\xbf\x18\x51\x62\x5d\x0f\x47\x69\x29\x54\x4b\xa4\x6a\x41\x7b\x98\x51\xbb\x15\x00\x34\x19\x6d\xe8\x79\xa8\x01\x50\x0e\xf3\x1e\x9c\x07\x14\xe2\x49\x6c\xef\x0c\xcc\x00\xf5\xe0\xdc\x1f\xd2\x7c\x07\xec\x4b\x99\xe9\x23\x17\x95\xfd\xe5\x36\xcd\x53\x6c\xa7\x5d\x29\x45\x05\x55\x65\xf9\x79\x62\x96\xfb\x87\x07\x2e\x69\xb4\xbf\xa9\xcb\x18\xa4\x73\x71\x90\xb0\x9b\xcf\x26\xb9\xc9\xd2\x87\x94\xa1\x93\x67\x18\x06\xf0\x3d\xed\x14\x72\x6c\x43\xba\x7a\x84\x48\x5a\x07\x08\xc8\x81\x0e\xf1\x0b\xca\x53\xcb\x10\x0f\x59\x5b\x2e\x41\x0a\x36\xe3\xec\x11\x7d\x1a\x21\xbd\x60\x4a\x40\x04\xa1\x88\x4b\xc9\x00\x4f\x33\x81\xea\xe6\x26\x04\xdd\xc1\xf4\x17\xf0\xa8\x74\x1d\x4a\x35\xf3\x7b\x50\xb5\x2a\xe6\xa4\x79\xa3\x53\x78\x0e\xf3\x88\x61\x79\x20\xd1\x0b\x42\x8a\x00\xc8\xe8\xb8\x77\x94\xe8\x1d\x07\x40\x72\xce\x8d\x23\xe5\x77\x82\x6e\x8f\x45\x9a\x34\xd7\x1d\x25\x5e\x95\x57\x6b\x08\xf5\xab\x43\x8d\x3c\x18\xa3\xee\x4b\xbd\xa7\xa5\x30\x2b\xdf\x5a\xe1\xdd\x91\xd2\xca\x58\x7f\xde\x4b\x1d\x4a\x74\xdf\x77\xca\x75\x2d\x0c\x3e\xca\xc3\x7c\x30\xf1\x27\x93\x93\x1c\xb5\x5b\x14\xf6\xb8\xc8\xcc\xba\xa6\x9d\x86\xc4\x67\x5c\x96\xa4\xd1\x18\xaf\x55\xb5\x45\xde\xb7\xa3\x7e\xa0\x7a\xd5\x9d\xfd\x3e\x62\xac\xa5\x2d\xcf\x57\x15\xca\x20\xd6\x3e\xc7\x14\x4b\xb8\x8d\xda\x36\x74\x69\x50\x78\x39\x1d\xdf\xe8\xff\xfa\xa6\xe7\xe0\xd9\xeb\xf9\xf5\xf9\xf3\xf3\x51\x66\xe7\xf4\xef\x13\x04\xfe\x1c\xff\xd7\x77\x97\x0d\xfb\xef\xf2\xf9\xcb\x8b\xef\xbe\xda\x7f\x7f\xc4\x4f\x18\xc8\x65\xd6\xce\xe2\x90\x9b\xf2\x2f\xdd\x01\xdb\xff\x12\xb1\xd2\x62\xfd\x5b\xc6\x4a\xff\x19\x42\xa5\x7f\x6c\xa4\xf4\x96\xd0\xdd\x4d\x76\xa7\x96\x9d\x99\x17\xfe\x22\x67\xc8\x48\xdc\xbf\x22\xf4\xf8\x17\x04\x54\xf5\xe7\x03\xaa\x4a\x68\xb9\x75\x47\x56\x07\x9f\x09\xd4\x9d\x94\x93\x08\xc3\x5a\x54\xde\xa4\x1a\xc1\x3b\xfd\xab\x43\x77\xaa\x7d\xdb\x17\x95\x0c\x77\x84\xee\x54\x3b\x74\xd7\xc5\x4d\xd6\xfc\x4a\x0a\xb3\xc9\xd0\x9d\xfa\x25\x75\xb6\x5f\x14\xba\x53\x4f\x54\xd7\xfe\xc2\xd0\x9d\x7a\xaa\xba\xf6\x97\x85\xee\xd4\x13\xd5\xb5\xbf\x3c\x74\xa7\x9e\x0c\xdd\xe9\x5f\x10\xba\x53\x4f\x86\xee\xbe\x5c\x00\xe1\xd7\xdb\x21\xad\xf8\xcf\x15\xc7\x7f\xd6\x45\x5e\xff\xfd\xb1\x9f\x3f\x7d\xfe\xfc\xbf\xbc\x7c\xf9\x5d\x23\xfe\x73\xf1\xf2\xdb\xaf\xfc\x9f\x7f\xc8\x8f\x8c\xff\x5c\xf9\x62\x02\x1f\x07\x7a\x53\xe4\xb5\xb7\xbb\x89\x03\x85\xa5\xda\xdc\xf4\x70\x42\x82\x04\xfa\x8f\xdd\x51\x44\x8e\xec\x1e\x30\x29\x50\xfa\x5a\xe4\x35\xe4\xfd\x94\xd9\x2e\x4d\xe2\x7f\xa9\x01\x1f\x05\x48\x60\x6b\x05\x04\xa4\x92\x7c\x09\xc9\x6e\xfa\x93\x8e\x6a\x48\xe0\x8f\xce\x27\x58\x1e\xed\x31\x64\xb2\xb5\xc8\x19\x79\xa7\xc7\xb5\x0c\x31\x5b\x61\x21\xce\x13\x9a\x6b\x14\x1f\x37\x6d\x1f\x84\xf5\xd9\x09\xeb\x85\xa5\x77\x47\xe5\x84\xba\x2b\x04\x69\x1d\x83\x96\x23\x6b\x77\xbb\x05\x1d\x0c\xd4\xaa\x09\xf8\x24\x7d\x01\xd1\x9f\x8c\xc2\x74\xea\xd7\x41\x4b\x89\xda\xc5\x29\x5a\x39\x0e\x1d\x0e\x86\x1d\x45\x31\x11\xeb\x3e\x26\x9a\xd9\x46\xdd\x7b\x49\x32\xf3\x90\x56\x1b\xfc\xa3\xaa\x0a\xae\x30\x69\xbe\xd3\x63\x84\x58\x3b\x56\xc8\x4d\xfd\xa3\xa7\xfd\xd7\x1f\xfa\x39\xbd\xff\xbf\x1d\x8d\x7e\x9b\xed\xff\xb3\xfb\xff\xc5\xf3\xcb\xe6\xfe\x7f\xf5\xe2\xe5\xd7\xfd\xff\x8f\xf8\xf9\xec\xfe\xff\x76\x34\xd2\x37\xc4\x2f\x2f\x8e\x01\x51\xb5\xeb\x74\x68\xbc\xb0\x1d\xfb\x23\x4f\x49\x10\x32\x2c\x47\x75\xc1\x72\x1e\xd2\x47\x82\x3a\xee\x73\x66\xb2\x0a\x83\x81\xa0\x9d\xca\x10\xc5\x34\xf3\xf1\x32\x47\x2c\x0d\xb1\x6f\x38\x30\x84\xa6\x67\x25\xb9\xd8\xb8\xd8\xd3\xf1\x31\x07\x68\x8b\xa2\x32\xaa\x75\x67\x41\xd4\x62\x12\x6b\x4d\x25\x43\xae\x2e\x71\x2f\x02\xe4\x90\xa0\xd4\xbd\x85\x3d\x59\xba\x55\x05\x82\x3a\x8e\x84\x85\x0c\xd2\xdc\x83\xba\x77\x66\x55\x57\xa8\xe8\xc0\xe8\x79\x05\x0a\xc6\x70\x70\x04\xbe\xb4\x8c\xfb\x37\x78\x11\x41\xf2\x69\x63\x72\x62\x07\xcb\x3f\x91\x8a\xb5\x8a\x9d\xfe\x2c\x16\x10\xc6\xcb\xaf\x39\xd5\xff\x31\x3f\x83\x67\xef\x27\x8b\x73\x41\xc9\xfc\x3b\x84\x00\x3f\x17\xff\x7b\xfe\xb2\xc9\xff\xfb\xed\xcb\xaf\xfc\xff\x7f\xcc\x4f\x48\xdd\x01\x2c\x10\x57\x17\x17\x7f\xd6\xa3\xb8\xac\x6a\x93\xeb\x77\x71\x5a\xff\x67\x66\xca\x48\xbf\x35\xc5\x7a\xad\xdf\xc5\x65\x99\x56\x14\xf5\x7b\x8c\xcb\xb4\xd8\x37\xe2\x3d\xad\x27\x7e\x8b\x4f\xfc\x6b\xba\xd5\x1f\x0a\x93\x25\xa6\xac\xbe\x4a\x09\x7c\x95\x12\x38\xf1\x39\x69\x5d\x35\xc6\x0b\x41\x45\xe5\x27\x03\xde\xdb\xff\x47\x75\xe9\x40\x83\xc8\x31\xcd\x08\x40\xfd\xf1\x8a\xf9\x32\xc1\xed\xf0\xe0\x7f\xc8\xa4\x77\x85\x48\x23\x11\x16\x85\x12\x37\x66\x0a\xda\xc5\xab\x4f\xf1\x03\x6b\x18\x37\xa8\xe6\xe3\x0a\xa2\x99\xff\x03\xe4\x0d\x86\xf7\x8b\x77\xd3\xd9\xfc\xbf\x9d\xb2\xc1\x3f\x7a\xd7\xfd\xe7\xf9\xe1\xfa\x8f\xdf\x53\x03\xe8\x73\xf5\x1f\x17\x57\x5f\xeb\x3f\xfe\x51\x3f\x5f\x52\xff\x71\xa9\x87\x1d\x7b\xbe\x90\x7f\x85\x10\x5c\xe6\x68\x71\x38\xbc\x06\x78\x90\xc4\xe4\x35\xcb\xc1\xb7\xf3\x47\x15\x63\xad\x9a\x05\x20\xfa\x57\x15\x80\xa8\xae\x02\x10\xfd\x3f\xa5\x00\x24\x00\xc8\xfe\x83\xeb\x40\x3a\xdb\xa2\xbc\x68\xcc\x3f\x43\x39\xc8\x2d\xe7\x2c\x3b\x67\xe6\x1f\x5f\x0e\x12\x34\x43\xf9\x05\xf2\x4f\x57\x13\x52\x6f\x8c\x6a\xaf\xe4\x53\x85\x21\xcb\x63\x57\x59\x88\x1b\x97\xae\x2f\xfe\xef\x50\x11\xd2\x9d\x68\xfe\x6f\x50\x16\xd2\xfd\x61\xbf\x05\x69\xf3\x97\xd4\x81\x74\xf5\x81\xfa\x3b\xa9\x9a\x65\x32\x59\xfd\x5d\x54\xcd\x1d\xf6\xaf\xfa\x7b\xea\x40\xc2\x64\xb2\xfa\x3b\xea\x40\x1a\xc9\x64\xf5\x7b\x24\x93\xbf\xfe\xfc\x97\xfb\x39\x9d\xff\xf9\xe3\xea\x3f\x2e\x9f\x5f\x7d\xad\xff\xf8\x07\xfd\x7c\x36\xff\xe3\xf0\xb9\x5f\x80\x01\x78\xd2\xd0\xc6\x94\x4e\x57\x3a\x47\x51\x3d\x47\x40\x30\x08\x51\x1f\x4e\x73\x43\x31\xda\x3a\x7d\x00\x26\xb7\x55\x99\xee\x6a\x8a\xcc\xd8\x77\x00\xb3\x08\x03\xc2\x5d\x7b\x91\x6c\x2c\x37\x26\x21\x86\x4c\x27\x0a\xfd\x85\x42\xfc\x0a\x92\x25\x7b\x96\x29\xf4\xe6\x63\xfe\x80\x18\x73\x6a\x48\xc4\xc2\xf6\xc5\xfe\x61\xd3\xd2\xc2\xb4\x3d\xa9\x24\xcc\x39\xde\xed\x4c\xcc\xb6\xec\x16\x2d\xbb\x27\x34\xa7\x7b\x6f\xad\x2f\x06\x48\x03\xac\xd6\x80\xe0\x19\x5a\xbb\x82\x21\x93\x0d\x5f\x47\x43\x45\x04\x2d\xe8\x75\xb9\x97\xef\x1c\xb1\xd0\x08\x65\xcf\x5b\xed\x75\x97\x92\xa7\x01\x33\x01\x79\x6e\xac\x93\xe5\x98\x6e\x56\x88\x5c\xef\xa5\x58\xaa\x6f\x1f\xb5\x8a\x41\x35\x2b\x31\x3b\x93\x43\x64\x94\x22\xa1\x50\x8b\xd0\xf7\xd0\x8d\x36\x78\x7f\xa0\x3f\x18\xd0\xc4\x22\x36\x47\x08\xcd\x26\x71\x1d\x9f\xb9\xf6\x31\x8b\x6c\x55\x3f\xd9\x52\x51\xb3\x88\x4c\x63\x79\x5d\xe9\x5d\xb6\xaf\x44\x6e\x8b\x68\x7f\x6d\x47\x25\x66\x05\x9c\x2a\x88\x51\xa1\x07\x03\x75\xbe\xeb\x97\xba\xa0\x06\x2b\xd2\x4b\xc1\x68\xa2\xfd\x58\xd7\x6c\x8d\xcd\x76\x2f\x44\xb2\x94\xe6\xfb\x8c\x3e\x83\x72\x0b\xfb\x5d\xca\x7f\x97\xfb\x8e\x1c\x30\x24\x14\x17\x15\x04\x7c\x7c\x93\x6f\x93\xab\xe8\x70\x05\x1a\x58\xb9\xd9\x5c\x91\x1c\xd1\xb5\xab\x5b\xd4\x16\x51\xa2\xb4\x0a\xe0\xf7\xa5\x01\x72\xf2\x44\x7d\xc6\x61\x1e\xe8\x0f\x5c\x8e\x80\x52\x5f\x61\x0d\x56\xdc\xaa\x5f\x50\x41\x95\x46\x17\x4e\xe5\xc9\x76\x3b\x69\xf7\xba\x50\x9d\xf5\x11\xcc\x99\x17\xe9\xff\x85\xa4\x8f\xff\xab\xbb\x8e\x02\x82\x06\x90\xa7\x2e\x6a\x03\xc2\xb5\xbc\xef\x34\xfb\x53\x57\x85\x47\xbc\xc2\xb4\x82\xc9\x72\x88\xab\xce\xf1\x40\xd5\x01\x5f\xf4\xe1\x3c\x0b\x7b\xb2\xb0\x6c\xd0\x40\xf7\x26\x9c\xd2\x3d\x14\x65\x52\x45\x82\xa2\xb2\x64\x7a\xa2\x6d\xf1\x68\x2a\x55\xb8\x59\x00\x2f\x77\xbe\x61\x7b\x22\x30\x18\x4a\xfe\x72\xd0\x77\x12\xf3\x32\x20\xa1\xec\xe7\x63\x6d\x0c\x7f\xbf\xf0\xa4\x08\xc2\x03\xba\x6f\x18\xdf\x71\x39\x95\x8e\xc1\x51\x3c\x38\x1e\xd9\xd3\xec\xed\xaf\x46\xe4\x7f\x8d\x9f\xc1\xb3\xd1\xe8\xfc\xf5\xc7\xf3\xf9\xf0\xfc\xf9\xef\x45\x02\xf4\xb4\xfd\xf7\xe2\xf2\xea\xdb\xe7\xcd\xfa\x8f\xab\xab\xaf\xf8\x9f\x3f\xe4\x67\x04\x32\x74\x8f\xc0\xe9\xbf\xb5\x5b\xca\xd0\x57\xe1\x9f\xcf\x37\x71\x69\x86\x59\xfa\xc9\xe8\xe7\x83\x0b\x7d\x9f\xdb\x3d\xc6\x24\x7a\x34\x1b\x0f\x17\x93\x1f\xc7\x7a\x34\x7d\xff\x7e\x7a\x3b\x97\x24\x11\x6a\x32\x07\xf7\x7c\xa8\x6f\x86\x1f\xf4\x9b\xc9\xec\x3d\x2a\x72\x4d\xc7\xf8\x7b\x0a\x91\xe8\x9b\xf1\xdb\xe1\x8d\xf3\xca\x07\xfa\x7a\x32\x47\x64\x3a\x10\x4d\xa0\x17\xab\x58\x92\xd5\xdd\x0d\x6f\x1e\x43\x3e\x69\xb1\x98\xce\x6e\xc7\x1f\xcf\x47\x37\x13\xeb\xf6\xcf\xc6\x37\xa8\xe6\xf5\x6e\x72\x37\x68\xb5\x50\xd1\x6b\xe7\xe8\x1d\x4f\x6e\xdf\x4c\x67\xef\x89\xd4\x02\xd2\x53\x67\x20\x6c\x76\xa6\x5f\x0f\xe7\x93\x79\xfb\xfe\x2e\x91\x32\x35\x1b\xbf\x1d\x82\x94\x19\xc6\x60\xc4\x33\x39\x0e\xd4\x54\x23\x73\x6e\xbf\x94\x3c\x22\x1d\xa3\xc9\xed\x5b\x05\x52\x46\x93\xc5\xdc\xba\xf2\x03\xc5\xb0\x4f\xcc\x33\x82\xa6\x56\x6f\x38\xd7\xd7\xe3\x37\x20\xb2\xf5\x7a\x7c\x33\xfd\xd0\x0f\xc2\x4e\x20\xd9\x05\xad\x41\x61\x5a\x8e\x06\xb4\xbb\xe3\xfe\xf5\xcd\x64\xe4\x25\x6f\xcf\x46\xa3\xbb\x9b\x33\x3d\x9d\xe9\x33\xfa\xdd\x59\x7f\xa0\xdd\x6b\xf1\x1d\x8b\xf1\x68\x81\xb1\x2d\x1f\xfe\x41\x6d\x5d\x85\x09\xb7\xe1\xdd\xdd\xcd\x64\x04\x41\xa0\x9b\xe1\x87\x01\xc4\x28\x84\x26\x13\xaa\x82\xc1\x95\x8b\x77\x76\x08\xe7\x94\x60\x9c\xfc\xbb\x68\xbb\x18\x76\x88\x07\xf1\x9b\xec\x74\xc2\x76\xbc\x9b\xbc\x9e\x2c\xc6\xd7\x03\xa5\x5e\x7f\xd4\xe3\x9f\xc6\xb3\x11\x46\x45\xec\xeb\xe0\xda\xb9\x4b\x95\xda\x37\xba\xde\x79\x37\x9e\x8d\x49\xcd\x77\x34\x1a\xdf\x2d\x30\x04\x87\x9a\x77\x53\xf5\x7a\xac\x5f\x4f\xef\x6f\x5d\xec\x2e\xec\x41\xd6\xf2\xe5\x27\x8f\x7f\x5a\xd8\x59\x17\x08\x07\xbf\x1f\x7e\xd4\xaf\x41\xcb\x6c\x3e\xb9\x1e\xcf\xc6\xd7\x6a\x31\xb5\xbf\x18\xca\x94\xe7\xbb\x31\x5d\x3f\x9d\xe9\xb7\x76\x26\xcd\xa1\x45\xa0\xc3\x86\x6d\xb7\x17\x0f\x61\x84\x6d\x83\x29\xf3\x09\x4f\x1c\x72\x0a\x15\xd4\xae\xf0\x23\x86\x10\x25\xa2\x00\x4e\x97\x1c\xb1\x2b\xbb\x0d\x14\x65\xe3\x81\x3e\x1b\x26\xf1\xae\x26\x41\x59\x2a\x49\xc6\x2a\x67\x64\x68\x07\x1d\x0c\x7b\xd2\x23\x57\x7f\x51\x86\xbf\xf1\x9c\xf8\x6a\x57\x9a\x73\x20\xbb\x06\x3c\x44\x51\x7e\xaa\x88\xdf\x36\x26\x25\xf5\xbc\xca\x28\xdf\x1e\xbb\x77\x46\x4d\x9e\xf7\x48\x83\x02\x22\x72\xf1\x2a\x10\x35\xad\xd2\x95\xa7\x37\x05\x64\x78\xec\xbc\x95\x58\x67\xa9\xfd\x45\x09\x8c\xae\x71\x59\xdb\xf7\xaf\xe8\x49\x45\xa9\x77\x9b\x22\x47\xd6\x53\xfb\x0f\x53\x82\x30\x4f\x4e\x89\x1c\x2f\x52\x99\xe6\x66\x1b\xd7\x05\x94\xae\xa6\x2b\xd1\xbe\x2a\xa4\x03\x06\x5e\xd1\x34\x17\x2a\x30\x52\x1b\xa3\x34\xab\xb8\xaa\x99\xaa\xbf\x28\xb7\x26\x81\x46\xc0\xe3\x4c\x22\xe0\x22\xe8\x45\x28\x48\x9c\xb0\x68\x6a\xbc\xcc\x8e\xcd\xe2\x27\xcf\x96\x19\xb1\x50\x14\x7a\xbc\x38\x44\x4d\x3f\x4f\xc5\x7a\x44\x0a\xc3\x45\x8e\x04\x96\x94\xba\x00\x97\x28\x81\x48\x7c\x9c\x6b\x3f\xe6\x8e\xb2\xb9\x51\xd3\xef\xc1\xe6\x6f\xe8\x82\xf8\xb1\x48\xb1\xe8\xb7\x58\xeb\xa4\xd8\x2f\xeb\x48\x1f\x80\x12\xd4\x75\x03\x54\xca\xc3\x78\xc5\x19\x0d\x81\xe8\x72\x25\x87\x83\x44\x5e\x8e\xf9\x6a\x53\x16\x39\x6b\xf3\x93\xb5\x8d\x0f\xcb\x81\xb7\x33\x39\x47\x12\x5b\xf8\x9e\x7a\x03\xae\xc5\x63\x9a\x3f\xa8\x74\x1b\x3f\x18\xdd\x3b\x83\x67\xa4\xf9\xc3\x59\x1f\x3f\xf8\xef\xf9\x58\xa5\x96\x03\x7d\xe6\xbb\xd0\xaf\x88\x95\xef\xd6\x62\x7d\x7a\xce\xf9\x29\xaf\x4c\xbe\x3a\xae\xb2\x62\x67\x92\x34\xae\x48\x70\xad\xde\x14\x59\xf1\x90\x5a\x07\x39\x9c\x8e\x55\xe4\xbb\x06\xa5\x7d\xcb\x22\x4e\xec\x6c\xaa\x22\xe5\xe6\x3e\x69\x5d\x97\x4d\xee\x4c\x96\x4d\x8d\x73\xba\xc4\x73\xe6\x38\xcd\xf1\xde\xba\x8f\x02\xb9\x91\x82\xc9\x1b\xa1\x8e\x5c\x5c\xf9\x6e\xaf\x0c\x7f\x22\x92\xd3\xbb\x65\x48\x17\xa4\xa5\xd3\x58\x8b\xc4\xac\x53\x81\xb2\x2c\x2b\xda\x56\x91\x6e\xaf\x93\xb4\x92\x08\x20\x70\xb6\x90\x07\x19\x38\xb8\xf5\x3e\x67\x07\x02\x57\x86\xe0\xa1\x28\x72\x48\x6c\x81\xbc\x56\x43\x56\x08\x5f\x06\xd2\x77\xae\x51\x10\x9e\xa1\x74\x93\xc2\xa5\x8e\x11\x09\x48\x3a\x41\x1f\x51\xec\xa5\x32\xd9\xa3\xed\x7e\x6a\x69\xf1\x60\x70\x9b\x29\x8d\x8e\xab\xca\x6c\x97\x19\x21\x64\xc5\x24\x78\x34\xea\xb0\x29\x32\x50\x70\xee\x5c\x87\xfa\x17\xaf\x43\xd5\x8b\x2b\x94\x7f\x61\x21\xe3\x7e\x73\xb6\xb6\x98\x87\x07\x4a\xad\xec\x74\x6d\x1a\x6f\x23\x9f\xf7\x66\x05\x3a\x37\x8f\x5d\x6c\x8f\x68\x1a\x68\xa6\xc4\xb5\x22\xda\x95\x15\x3d\x6d\x85\x0f\x03\x0a\x16\x9f\x48\xf7\xc4\xb2\xf6\x7e\x97\xa6\x07\x0a\xe5\x47\xcc\xf2\x71\x73\x14\x37\x07\x2e\xb2\x03\x62\xaa\x0a\x5d\xce\xec\xa8\xcd\x7f\xec\xd3\xc7\x38\xa3\x02\x9c\x90\x90\xd7\x6d\x93\x11\x70\x86\x23\x63\xc5\x7e\x1b\xa9\xa5\xe1\x5c\x5f\xec\xf8\xb7\x7f\xd0\xbd\xb4\xef\x85\xc9\x31\xac\x47\xad\x7b\x24\x9d\xa7\x78\xeb\x3a\x31\x82\x9e\xb0\xfb\x87\xe7\x42\xd6\xe4\xd2\x73\xb4\x6d\x9c\xc9\x92\x7f\xdf\xb2\x57\x28\xd1\xdc\x4b\xd3\xbe\x36\x3f\xef\x00\x7e\x96\x1d\x29\xbd\x8f\x4c\xd8\x25\xf5\x10\xd1\x1a\x04\xe7\xc8\x9a\x26\x1e\x0a\x38\x21\xb1\x41\xe6\xf5\xca\xfd\x27\x75\xe9\x5c\xa0\xd6\x54\x73\xa4\xff\xb6\x2f\xd3\x2a\x21\x00\xba\xe7\x2d\x66\x4e\x86\x78\x6b\x54\xeb\xa3\xe2\xaa\x39\x89\x92\x81\x3e\x73\x52\x55\x6e\xae\xd4\x05\x85\x76\x5c\x4b\x19\xe1\x8f\xb1\xc9\x80\xca\x19\xd9\x74\x77\xa9\xa9\x94\xdc\xc3\x8b\x52\x4c\x71\xe4\xee\xf7\x64\xdb\x11\xb3\xae\xeb\x2a\x46\xdd\x28\xda\xc7\x48\xa4\xc1\x3e\x09\x4a\xd0\xab\x4d\xba\x1b\x28\x65\x06\x4e\x51\xd1\x7d\x8d\x6b\x6c\x80\x16\xd8\xa4\x0f\x9b\xf3\xcc\x3c\x9a\xcc\xb3\xb4\x93\x43\x63\xd7\x66\xa5\x70\xa7\xc3\xf9\x8a\x8f\x24\xc9\xfe\x34\x4f\x52\xc8\x82\x30\xcc\xa0\x4e\xeb\xcc\x34\x27\xc2\x0f\xd2\x3f\x8a\x94\x77\x90\x06\x4a\xad\x5d\x2b\x8b\x52\xb6\xce\x73\xa1\x45\x92\x17\x2d\x62\x2d\x97\xa2\xc4\xff\x4a\x79\x71\x15\xeb\xb5\x29\x7b\x55\x5f\xb9\xde\xf4\xca\x86\xa1\x4a\x98\x1f\xc9\x87\x81\x3e\x73\x74\xd8\xc3\x7d\xbd\x71\x6d\x88\xf8\x83\x56\x31\xe9\x19\x3c\x65\x38\xd5\x1b\xbb\xab\x7f\x79\x83\x0f\x9b\xc2\x89\x04\xca\xc1\x4f\xd7\x3a\x2f\xc4\x93\xdc\x4d\x47\xa0\xb1\x59\x1a\x8f\x0c\x4a\x22\x3f\xb9\xaa\x8d\x29\x5f\xd1\x78\xf8\x02\x93\x5e\xda\x57\xad\x8f\x90\x26\x1d\x42\x4e\xea\xa2\xb4\xa7\x70\x9a\x3f\x18\xfb\x1f\x60\x8e\xa4\xd0\x03\x60\xbd\x94\x88\x2f\x61\xa1\x2f\x02\xca\xda\x0f\x88\x57\x35\xde\x07\xb5\x6c\xe9\x23\xca\x26\x41\x9a\x3f\xd2\xbb\x2c\xb6\x47\x54\x04\x54\xda\xe5\xae\x34\x5e\x8e\xe4\x90\x56\x46\x51\x3b\x9e\xb0\x0c\xe0\xdb\x91\xda\x9b\xf7\x83\x75\x91\x7d\xca\x8a\xd2\xbc\xc2\x3d\x05\x3f\x4e\x89\x8f\x63\x93\x00\xbb\x06\x91\x35\x25\xed\xa6\x54\x6c\x03\xe7\x77\x49\xda\x3f\xd4\xb7\xf6\x6b\xd6\x69\x59\xd5\x6a\x9d\xfe\x6c\x1c\xf3\x51\x9e\x54\xed\x4e\x73\xcb\x0e\x2f\xf0\x7b\x9c\x6b\x10\xf4\xb6\x5d\x8c\xc2\x26\xa1\xd5\xff\x10\x3b\xd3\x0d\x11\x4d\x76\xe9\xda\xcd\x10\xfe\xee\xae\x1f\x28\xb5\x19\xe8\x33\xd4\x65\xf3\x4b\xc2\xf5\x15\xa1\x77\x82\xfe\xc2\xf9\x1f\x28\x91\xc2\xac\x57\x4d\xfa\xfd\x27\x31\xd8\x44\x68\x9f\xec\x57\x4c\x5e\x23\x5f\x1c\xa9\x6a\x95\xe2\xfc\x5b\x91\xcd\x43\x2d\x48\x8a\x6d\x6c\x47\xfb\xb0\x89\x6b\x08\xc8\x93\x85\x4f\x28\x13\xe8\x36\x18\x6f\xe2\x3a\xf0\x03\xab\x7c\x7b\x92\xf4\x21\xad\x63\xe0\xde\xdf\x4a\x57\x68\x59\x14\xd6\x32\x8e\xb7\xbb\x4d\x66\x6a\xa1\x2a\x76\x28\x53\x6b\xb9\xbc\xb2\x8b\xd3\x9a\x53\xa5\x89\x14\xe9\x2c\x44\xba\x32\xe5\x16\xc7\xda\x1b\x83\xce\x72\xb3\x27\x5c\x1e\xdb\x3b\xec\xcd\x49\x19\x83\x06\x12\x64\xac\xe8\xbf\x8b\x73\x32\xcc\x95\xbd\xd1\x5e\xb5\xda\x14\xa5\x71\x2e\xcf\x81\x96\x2c\x68\x38\xda\xb3\x94\xa5\x24\x93\xfd\x76\xa9\xab\x4d\x71\x78\x25\x8c\x7b\x6b\x11\x14\x55\x8a\xcc\x4a\x0d\x00\x1c\x04\xb6\xe1\x05\x0d\xaf\x0a\x4d\xa5\x42\x48\xe0\xc5\x15\x4a\x05\xd4\xc4\x3e\x54\x29\xea\x48\x12\xa9\xb1\x63\xb7\x32\x95\x35\x9f\xe3\xac\x78\x28\xf6\x08\xea\x91\xcf\x3d\xbe\x62\x67\xc8\xba\x25\x65\x7c\x80\x05\xbc\x8b\xd3\xdc\x76\x65\xa4\xe2\x72\xb5\x49\x6b\xea\x4d\x5d\xad\xf6\xd9\x0e\xff\xd3\xe4\x0f\x65\xfc\x48\x79\xbd\xcc\xb6\xdd\x3f\x6f\xb7\x29\x5a\xcd\x56\x4f\x34\x5b\x7f\x49\xb3\xfd\x43\x8f\xaf\x94\x6f\x33\xa6\x64\x60\xee\xd9\xc5\xa7\xd3\x2c\xdb\x57\x75\xe9\x90\xe9\x3b\xd8\x7c\xf2\x48\x57\x9f\x4c\xbd\x82\x9e\xae\x37\xa5\x31\xe7\x49\xba\xb5\x96\x46\x91\xd3\x98\x92\xda\xc7\x23\x1c\xd4\x0f\x34\xb2\xc7\x48\xd7\xc5\xce\xfd\xb7\xec\x0d\x70\x24\xec\xfc\x5f\xc1\xa4\x11\x9b\x82\x6d\x9e\x5b\xbc\xaf\xe4\x46\x04\xc3\x0a\xa5\x76\xce\x61\x83\xb4\x03\x99\x06\xa4\xd6\x80\x5c\x7a\xbb\xb2\xa8\xe1\x94\x55\xa4\xd9\x43\x08\x2f\xb0\x25\x70\x12\x82\x55\x03\x6d\xa7\xb7\x73\x07\x3e\xc6\x65\x6a\xf0\x90\x59\xa5\xe5\x6a\x5f\xb9\x0b\x4a\xd5\xf5\x2e\xa8\x58\x76\xdc\x5e\xd2\xc8\x3e\xbd\x23\x0f\x94\x4a\x07\xfa\xec\x63\xb1\x77\xe6\x71\xae\x3b\xcf\x2a\xf3\xb3\x29\x57\x50\x17\xc5\x3c\x38\x1d\xe2\x38\x76\xd3\xb5\x06\x31\xe8\xd6\x94\xe6\x31\x45\x7d\x1d\xe2\x19\x4b\x4e\x9f\xdb\xba\x21\xc1\xa6\x82\x68\x0b\x3f\xd6\x11\x88\xb1\x7c\x72\x17\x6e\xd0\xd9\x32\xa8\x03\x68\x1b\x6d\xd4\xc9\x26\xeb\xc4\x54\xbb\xb4\x46\x31\x27\x6c\x30\x35\x17\xc1\x91\x7f\x1b\xe8\xb3\x3b\x92\xff\xd3\x77\xd8\xff\xc2\x3a\xe4\x23\x8f\xec\xc1\xd2\xac\x52\x61\xeb\xca\x00\x11\xa6\xd8\xb6\xdb\x7d\x0e\xc6\x55\xcb\x90\xb4\xae\x78\xfb\x29\x11\x8b\x40\xe1\x1b\x11\x6c\x69\x97\x55\x24\xf6\xd8\xe5\x51\x1f\x52\x9c\xcb\xf6\xff\x21\x97\xe6\xaf\xc7\x67\xf2\x3e\x2c\xfd\xed\x57\x6c\xdf\xaa\x53\xf6\xed\x07\xf6\x12\x71\xe3\xd6\x87\x98\x88\xd3\xb6\x66\xbb\x14\x12\x62\x74\xf9\x36\x3e\xaa\x78\x05\xab\x1e\xf3\xc0\x78\x3f\x2b\xfd\x65\x31\xc5\x9c\xc0\xa3\xc1\x7f\xfa\xb9\x96\x1d\xed\x6e\x5c\x99\x9c\x80\xca\xdb\x57\x4a\x74\xb0\xeb\xca\xb0\x81\x27\x7a\xc7\x01\x17\x7d\x8f\x13\xba\x42\xdc\xcb\x6d\x17\x3d\x22\x07\x4d\x56\x36\x2d\x8f\x8d\x7e\x54\x72\xa7\x00\x20\x00\x6f\x15\xf0\xea\xd2\xf8\x7f\xbb\x96\x07\x6d\x75\xcf\x56\x55\xfa\x60\xc7\x99\x6d\x93\x52\x43\x50\xa7\x1a\x28\xf5\x69\xa0\xcf\x66\x0c\x26\x6e\xba\x24\x61\xd5\xd0\x13\x2f\x70\x84\x41\xc2\x24\x58\x1e\xf1\x7d\xf6\x75\x8f\x69\x65\x57\x7a\x69\x56\x45\x69\xaf\xf7\x9d\x47\x8a\x73\x6b\xbd\x4e\x7f\xf6\x05\x48\x0c\x6f\xb6\x6d\xe7\x3f\x9c\xec\x38\x96\x8d\x45\x93\x8b\x37\xc3\xa6\xf1\xe5\x03\x94\xf6\xac\x15\x16\x83\x3f\xe9\xc1\x59\x29\x8b\xdc\xce\x32\x94\xa0\x05\x3c\xf6\x9b\x38\x2d\xf5\xb5\x89\x41\xe4\x15\xf5\x28\x07\xfa\xb6\xa8\x37\x14\x60\xac\x1b\x4a\x2e\x20\xb7\x93\xb0\x0a\x95\xed\xd7\x08\x4d\x25\x88\x30\x71\x5d\x1b\xab\xae\x56\x58\x7e\x47\xf2\x63\x42\x82\x8f\x65\xd7\x4b\xdc\x10\xe1\x02\xa1\xbf\xae\xc0\xcc\xa5\x2c\xb1\xc0\xe7\x38\x28\x36\x0a\x53\xda\x3d\x3a\x77\xf1\x91\x26\x08\x98\xbb\xcb\x4e\x5c\xdc\xb7\xfc\x9f\xb2\xf8\x20\xa2\xc1\xf6\xf0\x5c\xa1\x04\x6a\x7c\xa8\x10\xd1\x1d\x48\xbe\x0e\xf4\xbc\x4b\x61\x99\xe4\x5f\x4e\x0a\xb3\xf1\x4e\xaa\x64\x51\x62\x85\xd2\x85\xfa\xa4\x46\x6b\xa8\xe5\x2a\x04\xf0\x7a\xeb\xa2\x84\x7d\x3d\xd9\x97\x41\xa8\x53\x7c\x80\xfb\xc4\x7e\x43\xce\x15\xb6\x71\x51\x4e\xa8\xd3\xdc\x3b\x85\x71\x45\x32\x41\x18\x35\xfa\x01\x82\xfa\x75\xa1\x67\x01\x12\x9f\x84\x76\x0b\x3b\x3d\x89\x76\x5b\xc6\x6d\xf3\xba\x08\x22\x6c\x3e\x78\x45\x45\x75\x9d\x0f\xb4\xef\x16\xcf\x73\x3e\xb3\xb8\xfb\x15\x44\x54\xeb\xc2\x31\xc2\xe4\x89\x78\xd0\x50\x84\x47\xc2\xd2\x08\x3b\x09\x61\xdf\x15\xe1\x03\xb1\xeb\x93\x52\x25\x27\x14\x28\x9c\x4e\xab\x23\x02\x15\xb2\xaa\x53\x82\x6c\x95\x99\xb8\xcc\x8e\x2a\x8b\x97\x26\xb3\xee\xdd\x36\x2e\xe1\x48\x92\xce\x1c\x3b\xa5\xb4\xdf\x23\x2a\xa3\xd2\x07\x53\x92\x16\x24\x43\x98\xc8\xd3\x26\x51\xe5\x37\xa2\x32\x3f\x4c\x78\x90\x9a\x1c\x48\x49\x96\x9f\x4c\xa2\xcf\x16\x32\x78\x02\x06\x10\xe0\x4a\xe8\x16\x93\x28\x58\x56\xe3\xfc\x21\x23\x92\x95\xf9\x2e\xce\xd3\x6a\x13\x9d\xa1\xcd\x14\x54\xfb\xe3\xd3\x39\x74\xd1\xf1\x70\xe5\x02\x75\x1c\x5f\x1d\x9c\xbd\x82\xe0\x61\x5d\x78\xc9\x72\x1c\x9d\xe6\x81\x2f\x67\x89\xeb\xfe\xd6\xb8\x2b\x39\xe6\xe0\x42\x42\xbe\x49\x6b\x9d\x7c\xd1\x4b\xc4\x4c\x18\xf0\x9d\x4f\xe6\x1e\x7e\x00\xe3\xed\xb6\xc8\xcf\x0f\x71\xfa\x48\x52\xfe\xdb\xdd\x3e\xab\x8a\xf2\xe8\x76\x80\xf9\x6a\x63\xb6\xa6\x02\xb1\x33\x34\x33\x64\xc4\xac\x72\x11\x6a\x15\x14\x41\x50\x98\x97\xd6\x36\x06\x64\x30\x50\x05\xd3\xb2\x8e\xeb\x7d\x5d\xa0\x41\xb9\xf2\xef\x74\x81\x3f\x55\xc1\x5b\x59\x8f\x71\x69\xb4\x6d\x22\x07\x38\x9c\x89\x46\x54\x8a\x15\x19\xb3\x2c\xaa\xd5\x6c\x85\x82\x65\xe0\x9b\xe2\x24\x80\x79\x5f\x58\x1e\x61\x57\x62\xde\x64\xdc\x21\x58\x4c\xb6\x6d\xf4\xbd\x52\x2a\x4d\x07\xfa\xc3\x6f\xd0\x6b\x10\xad\xf8\xad\x7a\x4d\x63\xaf\x29\x8a\x0b\x75\x76\x19\xfc\xf2\x73\x1d\xa6\xc3\x0e\x53\x7f\x77\x87\xd1\x74\x4e\x6d\xb7\xfd\x58\x64\xfb\x1c\x74\x67\x5b\x9d\xb5\x38\xd1\xd2\xd3\x1d\x14\xa9\xc3\x06\xb3\x0d\x81\x25\x58\x94\x2e\x58\x67\x1e\x5d\x09\x5d\xd0\x11\x98\x68\x03\x3b\x94\xf5\x4f\x33\x92\xd8\x53\x55\xb1\x02\xd7\x09\xf7\xd1\x64\x9b\xe6\x69\x55\x5b\x7b\xf5\xd1\xb5\xbd\xd9\xe9\x55\xa4\x1f\xd3\x18\xef\xa0\xdb\x23\x38\xd8\xd5\xdf\xd3\x71\x03\x59\x2d\x4e\x57\x53\x18\x85\x1f\x89\x01\xbe\x2c\x83\x9d\x3b\x86\xad\x01\x6c\xa3\x1a\xb4\xfb\xa1\x6b\xf2\xe2\xa0\x3f\xe5\xc5\x21\xb7\x86\x85\x3d\x8c\x51\x63\x2f\x01\xc1\xf2\x04\xbb\x3d\x78\x05\x2b\xd4\x06\x7d\x0f\x66\x23\x4c\x0c\xb9\x73\x56\xe0\x99\x96\xd6\x26\x58\x6d\x72\xd2\x8c\xce\x8d\xb5\xa2\x6d\x37\x9d\x3c\x7d\xb9\xce\xac\xd9\xe8\x81\x12\xb6\x06\x67\xde\xfe\xdc\x5b\xf7\x23\xd4\xc4\x74\x52\xc5\x42\xe3\x4f\xc8\x46\xfb\x48\x74\x69\xd8\xee\x10\x84\xab\xdf\x0e\xf4\x4c\xb0\xc4\xe0\xa7\x67\x52\x4b\x30\x4c\xf9\x3d\xa7\x7e\x49\xa5\xa4\xa0\x3d\xbf\x94\x28\xf5\xb7\xad\x67\x2c\x36\x61\x3e\x7d\x1c\x5d\x92\xd2\xa0\x61\xf1\x91\x80\x9b\x62\x3f\x2f\xca\x27\xce\x0c\xd0\x36\x6c\xc7\xad\x55\x28\x60\xfb\x91\x01\x88\x5e\x5d\x18\x10\x99\xc5\x3a\xd2\x74\x02\xdc\xe7\x29\x3c\x79\x66\x08\xe8\x3b\xe1\xc0\x71\xa9\x7a\xf7\xb3\x09\x64\xcb\xa2\x0e\xbf\xda\x3c\x9a\xf2\xc8\x8f\xf3\x0d\xb3\xaf\xec\xfe\x08\x45\x1f\xe1\x3f\x16\x82\x0b\xeb\x35\x4a\x53\xa3\xe0\x2f\x5a\x20\xf8\x35\x02\x0c\xc1\xc4\xda\x68\x49\xdb\xed\xb1\xdb\xe3\xe7\x63\x4d\x12\x5b\x0b\xce\xfb\xa0\xa5\xd2\x95\xef\x58\x77\x60\x8b\xc0\x5b\xf9\xe6\xce\x34\x81\x69\xf4\x76\x7c\x84\x2a\x40\x4f\x33\xe1\x5e\x28\x86\xe3\x93\x31\x3b\x6b\x1c\xc6\x2b\x50\x45\x70\x42\xe2\xf4\x42\xdb\x23\x94\xbc\x73\x69\x26\x32\x16\x6b\x2c\xb5\xe4\x9a\xcd\x62\xad\x0f\x90\x4f\xc6\x6c\xc1\xd3\xe3\xa2\x9e\x9e\x5c\x04\x3d\x3e\x3d\x80\x72\x16\x2a\x34\x7c\xe5\x48\x8a\x01\xc4\xf4\x1f\x44\xcc\xec\x06\x00\xb9\xf9\x55\x6c\x77\xa3\xb8\xda\x97\x26\x18\x5b\xd5\x1a\x5b\x39\x7c\xf1\x89\xc1\x03\x33\xce\xbe\xfd\x37\x1f\xc5\x85\xed\x75\x5e\xea\xdf\xf6\xe2\xbe\xc4\x76\x3f\x65\xa1\xcb\xd4\x34\xd2\xfe\xc1\x00\x3a\x1a\x43\x22\x3d\x6f\x58\xf2\x3a\x06\x2d\x70\x17\x69\x42\x8b\x10\xe9\x15\xb1\x16\x00\x2c\x63\xda\x59\x54\xe0\x6b\x35\xf3\x54\x7a\xb2\x86\x3e\x71\x2c\x91\xb2\x41\x80\x2e\x22\xf4\xb1\x3b\x82\xdc\xce\xc8\x53\x33\x6a\x44\x1c\x77\x65\xbc\xaa\xd1\x8f\x8a\x48\x4e\xde\xb7\xd5\x3f\x1e\x1e\x86\xaa\x41\x3a\x16\x82\xf8\xcb\xa3\xf6\x5d\xb9\xea\x47\xfc\x47\x83\xaa\xad\x8d\xf6\xe6\x81\x57\xd2\x6c\xb0\xfe\xb5\x0d\x56\xae\xc1\x02\xb1\xf2\xab\x1a\x0c\x4e\xd7\x17\x6e\xd5\x21\x40\xa6\x6b\xbf\x56\xc5\x1a\x93\xec\xa1\x55\x04\x29\xab\x58\x5b\x77\xa5\x94\xfa\x16\xed\x2d\xd8\x65\x28\x38\x54\x7a\x2a\x17\xfd\x8a\xf2\x4e\x5f\x9a\xe9\xee\x21\x3f\x35\x9e\x26\xe0\x17\x61\x6b\xf8\xef\xd4\xaa\xbe\x97\x65\x47\x8c\x40\xa3\x3d\x32\x37\x1e\x9c\x4c\xba\x67\x06\x0f\x83\xe8\x49\x34\xec\xbc\xdf\xb7\xcd\x7e\xec\x6a\xb5\x6a\x23\x31\x1c\x89\xa6\xdc\x76\xc5\x00\x60\xdf\x83\x2f\xbe\xa6\x5c\x15\x22\x2e\x94\x6d\x61\x5a\xe4\xb8\x88\xed\x0b\x65\x09\x74\x01\xfa\x07\xae\xb7\xc5\xba\xf3\xb0\x02\x7e\xb5\x7a\xf2\xd5\xc1\xed\xa2\xfe\xc4\x21\x3f\x64\x3b\x54\x2f\xed\x13\x20\xa2\x28\x69\xf0\x90\x52\x69\xe8\xe3\x1a\x8c\x41\xf9\x6c\x83\x19\x3a\xd0\xbe\x97\x55\x1d\xb2\x63\x07\x37\x80\x97\xc0\xfe\x41\xf7\x26\x7d\x38\x42\x3e\x67\x4d\xcc\x26\x6c\x2f\x74\xbe\xce\x9f\x50\x8a\x4f\x28\xc0\x17\x89\xde\xfa\xfc\xf9\xf3\x4a\xf7\x26\xd8\x1c\x3e\x7b\xd4\x67\xad\x08\xf1\x82\xf6\x79\x23\x0f\x02\xd5\xd1\xea\x2f\xb4\x2a\xe4\x3b\x7e\xa3\x53\xa9\xdd\x98\x57\xaa\x37\x71\x5f\xff\x4b\x6c\x89\xae\x87\xa9\xbf\xd7\xaa\x88\x3d\xee\x8c\x21\x04\xbf\x78\x28\x7f\xec\x23\x71\x62\x78\xb5\x3a\x65\xfe\x4a\xdc\xcb\x2f\x33\x3f\x54\xd3\xfc\x78\x72\x52\x3c\x69\x84\x28\x89\x7d\xec\x30\x45\xba\x1c\xb9\x13\x83\xae\xbe\x60\xd0\x89\x1b\xd9\x9f\x4c\xcb\x96\x55\x22\x10\x6f\x5f\x6c\x9b\xe8\xcf\xd8\x26\xaa\x61\x9b\x88\x8f\x3e\x69\xa1\xe8\xb6\x85\x22\xbf\x48\x05\x10\x3b\x3a\xff\xaf\x05\x3f\xdb\xd3\x5e\x0f\x46\x1c\x86\x21\x8a\x38\x08\xaa\x7a\xbb\x80\x0a\xc0\x62\x3e\xbf\x3d\xaa\x0e\xda\xbb\xdb\x97\xd5\x3e\xce\x03\x97\xd2\x9a\x7b\x91\x5c\x51\xcc\xa5\x16\x90\xbd\x54\x0e\x40\xe8\x80\xda\x14\x64\x8d\x64\x6c\x94\x3a\x02\x63\xa7\xba\x28\x15\xe6\x50\x3e\x12\x17\xf4\xbe\x4e\xb3\xf4\x3f\xd3\xfc\x81\x6d\x80\x50\x0a\xa2\x81\x36\xd2\xbd\xa2\xd4\xbb\xca\xec\x93\x22\x3f\x6e\x23\x95\xae\x45\x84\xbb\x8f\xc2\x4c\x98\xef\x76\xb4\x76\x69\xf7\x83\xe8\xaf\x2e\x0e\xef\xe8\x7d\x74\x9c\x13\x76\x07\xa4\x7c\x8a\xd2\x09\xcc\xd3\x69\x1d\xeb\x6a\x57\x60\x98\x84\x01\x99\x8e\x64\x2f\xcd\x1f\x14\x26\x75\x23\xfd\xb7\x62\x5f\xe6\x71\x86\x38\x4b\x21\x3b\xa9\x7b\x67\xe2\xc0\xd7\x77\xf8\xf4\x33\x80\xc3\x70\x73\xbe\xa9\xba\xf8\x6c\x78\x2e\x55\xc8\xa0\x02\x38\xde\xa3\x96\x04\xe0\xd0\xe3\x04\xc8\x92\x5d\x89\x25\x79\xf6\x83\x94\xff\x20\xb2\xb1\xea\x10\x86\xc6\xb6\xb7\xef\x4a\x36\x9b\x42\x0b\xd3\xbd\xf0\xa8\x02\x63\x93\xce\x3f\xe0\x6a\x8f\xf3\x63\x84\xab\xdd\x19\xac\x24\xad\x81\x2b\x76\x69\x24\x81\xa2\xdd\x61\x45\x72\x9a\x26\x2e\x34\xdd\x1e\xa8\x62\x95\x8a\xdd\xbc\x45\x19\x55\x94\x22\x54\x9a\xe6\x18\x3a\x91\xe0\xec\x0f\x88\x4f\xc9\x13\xb2\x72\xa8\x9a\xd7\xd1\xc5\xb8\xf8\x46\x6f\xd9\x8f\x9a\x18\xa5\xd0\x38\xb7\x47\x3f\x1a\xcf\x1c\xd2\x67\xe4\x94\xa8\x9a\x76\x68\xf3\x70\x7b\xa2\xd9\x74\xf6\xa6\x34\xf9\x6a\x13\x84\xf3\x1b\x89\xc7\xc6\xd4\xc5\x18\xfd\xd9\x7c\x55\x1a\x93\xef\xb2\xf8\xa8\xb0\x92\x02\xc0\x3b\x74\xe5\x89\x5b\xa1\xdc\xc6\x7e\x0d\x36\x5a\x9a\xfb\xb5\xd8\x59\x95\xb5\xf9\x39\x96\x96\x6e\x77\x68\xbe\xd2\x16\x9a\x1f\x83\xb9\x16\xe7\xb9\x29\x5f\xb9\xf4\x4a\xc4\x34\xf5\x11\x89\xdb\x35\x01\x75\xd2\x19\x28\x83\xed\x58\x62\x71\x71\xd4\xa9\x99\x80\x6f\xc6\x8a\x76\x5c\xf1\xfc\x07\x58\x58\xb0\x33\xe5\xbe\x6a\x3e\x86\x2f\xad\x3a\xac\x91\xe0\x7d\xf4\xc0\x0a\x48\x8e\xa1\xbc\x17\x36\x79\xbc\xab\x32\x4e\xfb\x95\x51\x82\xf4\xa5\xb6\x95\x99\x81\x5c\x74\xe5\x79\x7f\x08\xe1\xab\x9c\x60\x2c\x4d\xb5\x26\x92\xdc\x37\xef\xe9\xba\x07\x30\x31\xe3\x23\xb9\x4b\x74\x8e\x7e\x66\xd0\xba\x8a\x0f\xc4\xae\xc3\x23\x41\x9f\x51\x99\x5a\x03\xcb\x34\x84\xf0\x00\x93\xb7\x0c\x80\x28\x1f\x8b\x7d\x79\x1a\x8d\x42\x07\x8c\xb7\x39\x18\xac\x8c\x20\x44\xfe\x57\x5c\x01\xef\x03\x1a\xa4\x24\xa0\xd6\x48\xcc\x46\x8a\x76\xd3\x6a\x93\xee\x10\x13\x03\xe4\x57\x00\x0f\xa3\x88\x61\x73\x01\x04\x98\x5a\xbb\x8b\x8b\xfd\x54\xd1\x7e\xda\x46\x03\x17\x78\xca\xa2\xd3\x5c\x36\x57\x68\xe4\xf0\x65\xe0\xbe\x11\xb6\x3f\x52\x0e\x0e\x73\x8a\x54\xab\xfb\xa0\xfa\xa2\x36\x22\x36\x1a\x29\x2f\x80\x80\xce\x65\x08\x81\xc1\x0a\x26\x1e\x61\xf6\xb8\x2b\xdc\x53\xed\x83\x5d\xbc\x3b\xc0\x89\x12\x17\xdc\xf2\xd8\xc8\x5e\xc3\x8e\x6c\x7b\xc0\x25\x48\xa3\xcf\x98\xa5\x3e\x0b\x4c\x42\x4d\x5e\xf2\x02\x5f\xcf\x4b\xe6\x33\xd6\x88\x77\x99\xec\x6c\x49\xd2\xaa\x2e\xca\x3a\xd2\x5b\x7b\xf6\xc3\xd0\x10\x05\x87\x9d\xc0\xf1\x27\x5e\x36\x89\x29\x8b\x87\x18\x72\x3a\xb1\x83\x57\x72\xb1\x8e\x92\x51\x28\xcc\x16\x1d\x38\x09\xba\x2b\xcd\xdf\xf6\x49\x0a\x05\xe5\x74\x59\x63\x74\xbe\xa9\xf4\xa6\xc8\xb1\x17\x4b\xb3\xdb\xd7\x04\x49\xf2\x63\x66\xfb\x9f\x9c\x87\xb4\x3b\x4b\x05\xfb\xb7\xfe\xd7\x78\x17\xe7\x7d\x51\x8b\x22\x33\x1a\x4a\xa6\x32\x3a\x43\xe8\xd6\x82\x6d\xc6\x34\x7a\xed\xcc\x82\xe8\xdb\xbe\x72\xdf\x99\x18\xb3\x75\x54\x19\x31\xf7\x2b\xc2\xfa\xb0\x6b\xf1\xbf\x03\xe6\xf6\xb2\xd5\xbb\x8a\x7a\xf7\x17\x74\x1b\x61\x55\xf6\x7c\x0c\xca\x99\xa9\x60\xbb\x86\x04\x95\x7d\x1b\x28\xde\xc2\x36\xd0\x85\xcf\xf7\xdb\x97\x0b\x60\xad\xf7\x59\x66\xcd\x54\x34\x33\xc2\x09\x5d\x87\x88\x06\xa4\xcc\x8f\x33\x9c\xdd\x40\x9c\x07\xbf\x27\x2f\xc4\x5b\x28\x7e\x44\xfc\xb6\x46\xbb\xda\xd3\x43\xf1\xc4\x30\x58\xef\x21\x80\x05\x62\x62\xf9\xc5\x00\xd6\x97\xa9\x98\x3b\xb0\x8a\xf4\x07\xef\x45\xda\x9e\x93\xe4\x6e\xf7\xb7\x37\x40\xcd\xcb\xec\x5b\xfa\xfd\xfd\xe2\x7e\x78\x73\xf3\x11\x4b\x46\x81\x8e\x97\x4a\x45\x81\x46\x6d\x0c\x3c\xb3\x1f\x66\x93\x05\xd0\x94\xb9\x22\xcf\xe9\x9b\x37\xe3\xd9\xdc\x97\xf0\x42\xa1\x31\xd4\x68\xba\x9a\xe2\xd9\xf8\x6e\x36\x9e\x8f\x6f\x17\x58\xc1\xac\xa7\xb3\x06\xc9\x2f\x33\x06\xeb\xd1\xf4\x76\x34\x9e\xdd\x4e\x6e\xdf\xba\x07\x3a\x16\xe1\x48\x3b\x0e\xe1\xf9\x62\xb8\xb8\x5f\x00\x25\x59\xc0\xae\x2b\x68\xd4\x98\x98\x18\x68\xd4\xe0\xbd\x91\x0a\x5f\xba\x98\x2c\x6e\xc6\x91\x63\x91\x9b\x34\x08\x86\x4f\x52\xc8\x45\x4d\x76\x61\x14\xcc\x7a\x37\xd6\xc3\xd7\xf3\x31\x95\xab\xde\x0c\xa1\x7e\x56\x70\xf5\xbe\x19\x8f\x16\xf3\x48\x0f\x47\xa3\xfb\xd9\x70\x44\xc4\x68\xb6\x73\xa1\x6b\xf0\x2e\x7a\x80\x9a\xbe\xd1\xe3\xd9\x6c\x3a\x9b\x7b\x96\xe1\xe9\x0c\x0a\xc4\xaf\x27\xf3\xd1\xf4\xc7\xf1\x6c\xf8\xfa\x66\x3c\xd0\xf3\xe9\xfb\xb1\xfe\xd7\xfb\xd9\x64\x7e\x3d\x19\x61\xdf\x5e\x4f\xb1\x3c\xfd\xe6\x66\xfa\x01\x88\xd0\xc6\x3f\x8d\x6e\xee\xe7\x54\x75\xde\xc5\xbf\x37\x9f\x62\x71\xad\xbf\xf0\xfd\xf0\x23\x3e\xe4\xee\xee\xe6\xa3\x9d\x07\x1f\xa7\xf7\x03\xa5\x5e\x0e\xf4\x8d\x47\x9b\x15\xd6\x67\x20\x1f\x7d\x40\xa2\xd9\x8d\xea\xe1\xd9\xf8\xdf\xee\x27\x33\x2c\xa9\x0e\x6b\xa7\x23\x25\x09\x99\x3f\x4c\x6e\x6e\xfc\x84\xf2\x4c\x7b\xf8\x66\x26\xa1\xc3\x8a\x7a\xa2\xa2\x63\x12\x3e\xa6\xd9\x53\x52\xc8\x2d\x20\xd9\x8b\xf4\xdd\xfd\xed\x04\xaa\xc3\xa7\x33\xcf\xc6\xe7\xaa\xd3\x99\x73\xce\x11\xcd\x85\x05\xda\x01\xf1\x9c\x9b\x91\xc4\x39\xe7\xda\xfc\x6e\x38\xd7\xaf\xc7\xe3\xdb\x27\x24\xcd\x54\xc8\x42\x47\x75\xcb\xdf\x0d\xf4\xc2\xee\x33\xb8\xa1\x40\x26\x72\x21\xf7\x81\x00\xb5\xe7\x43\x19\x1b\x53\x1a\xdc\x45\x60\xcf\xab\xe9\x11\xc6\x1a\x79\x05\xa0\xe2\x41\x7f\x17\x22\xf8\xf6\x5c\x58\x96\x10\xe5\x0b\xf3\xdc\xa7\x72\x18\xbe\x24\x46\x96\xc2\x10\x0c\xf8\xd1\x78\xc0\xee\xe9\x83\xd7\xc7\x64\xba\x2c\x38\x67\xa8\xbb\xfa\x41\xae\x68\x4b\x4b\x1f\x8e\x75\x1f\x25\xd8\x65\xc1\x38\x17\x35\x3b\x4a\xd6\xea\x94\x66\x1b\xa7\x70\x56\xdb\x9d\x1c\x23\xb1\xa9\x14\xf3\xb5\x47\x29\x3f\x7e\xc0\xfb\x6f\xa5\x2f\x23\x7d\x15\xa9\x17\x91\x7e\x19\xe9\xef\x90\xa3\xf5\xcf\xd8\xb4\x6a\x5f\x3e\xa6\x8f\x3e\x9a\x49\xc3\xd4\x51\x9f\xb4\x6c\xa1\xf1\xd0\xbe\xed\xc2\xe4\x45\x32\xec\x1c\x0c\xa9\x4e\x2b\x15\x42\xeb\x30\x32\xf8\x05\xd0\x3a\xf6\xf3\xac\x59\xd2\x07\xb4\xa4\xfd\xe8\xaa\x8e\x81\xab\x4a\xb9\x16\x45\x27\x70\x3a\xee\xbc\x21\xa2\x24\x6f\xe3\xe0\x08\x26\x29\x54\xad\xe4\xb5\x0f\xb2\xe3\xf4\x01\x7f\xb8\xaa\x8b\x5d\x48\x21\xe6\xa3\x33\x88\x79\xab\xd3\xad\xe9\x70\xd6\x54\x08\x8a\x33\xad\xca\x52\x68\x22\xd4\x56\xa4\xf5\x26\x29\xe3\x43\xe3\x9c\x94\x45\xec\x2a\xa8\x01\xe5\x68\x13\x84\xb4\x52\x91\x62\x02\xb3\x25\x6a\xe1\x3b\x1a\x0b\x82\x03\x65\xfd\xc8\xf3\xff\xfb\x28\x3a\xf9\x7e\x69\xbe\x37\x6e\xc2\xad\x0b\xe6\x51\xa6\xea\x4b\x8a\x23\xf8\x89\xac\x3c\xa6\x11\x06\x03\xf7\x80\x3f\x0f\xf4\xfb\xb4\x5a\x99\x2c\x8b\x73\x53\xec\x91\xbd\x60\x6c\xd7\xab\xed\xb4\x2f\xcc\x07\xfb\xf8\x9c\x74\x6d\x55\x68\xb9\xdb\x21\x74\x01\x4b\x1f\x06\x8d\x25\x2c\x53\x20\x1c\x7c\x3e\x09\xb3\x18\x0d\x68\x69\x5c\x75\x4e\xe4\xba\x38\xb1\xf0\x71\x99\xfc\xa2\x0f\x6b\x04\x3d\x1a\x5f\xa2\x3e\xff\x25\x61\x5c\xa2\xf5\x49\x8d\x95\xa9\x7e\xc5\x27\xad\x1c\x97\xaf\x4b\xd7\xb4\xac\x39\xc0\x28\x83\x76\x1e\x8a\x00\x9a\x1c\xe6\x8a\xa8\x92\xf5\x4b\x5a\xa1\xc3\xc4\xfa\x0e\x60\xc5\xe2\x74\xb2\x2d\x83\x87\xb8\x22\x45\x7a\x4a\x23\x2b\x62\x77\x41\xc8\xb5\xad\x9b\xa1\x6d\x89\x03\xb6\x5f\xce\x8e\xe7\x7a\x5f\x22\xe8\x78\xc5\x40\x72\x70\xe7\x29\xfa\xc8\x48\x08\x47\x6e\x1c\x39\x11\x7a\xfa\x5e\x27\x45\x51\x1a\xaa\x75\xe1\xd8\x2b\x05\x55\x28\x72\xe7\x10\x48\x2a\x40\x2e\xf9\x07\x61\x1f\xc1\x12\xf2\x5d\x84\xce\xea\x6d\x01\x5f\x42\xf5\x00\x27\x3a\xda\x35\x84\x3c\x14\x04\xdb\x91\xf0\x3f\x9d\x82\x6a\x55\xe4\x95\xe1\x71\x95\xb1\x3e\xb8\xba\x44\x1c\x1f\x5c\x22\xe5\x3d\x9c\x3f\x0c\x42\x1a\xc0\x15\xa8\x44\x47\x1d\x99\x38\x10\x24\x5d\x88\x97\xbb\xfb\xa9\x58\xf1\x1b\x1c\xf3\x4d\x46\x43\xe4\x0e\x10\x74\xd2\x4b\x53\x1f\x8c\xc9\x83\x71\x81\xa8\xa5\xaf\xae\xf1\x2b\x97\xa6\x2f\x9e\x29\x10\x77\xb3\xcf\x02\xf9\x43\x9c\x6e\x7c\x2c\x54\x91\x7f\x45\x85\x58\xf9\xc0\x81\x68\x16\xf0\xf8\x57\xc0\xd6\x4c\x01\x55\x7e\x8f\x8f\xb4\xda\x5e\x53\x04\x11\x5d\x42\x49\x02\x55\x31\x70\xc9\x2b\xc8\xd8\x73\x72\x93\x8a\x4f\xe2\xa3\x20\x8f\xc4\x78\x8d\x2c\xf3\x60\x8b\xa2\xd1\x73\x1c\x09\x5a\x0a\x92\x6c\x19\x4f\xd9\xee\xe1\x2c\xe5\xf0\x89\xfb\x5c\x15\xc0\x4e\xc8\xb3\xb4\x8f\x87\x42\xe7\xc5\x09\x18\xa0\x67\x70\x6f\x10\x55\x40\x64\xd8\xe4\x2b\x7b\xb4\x35\x2a\x14\x14\xc0\xab\x93\x32\x5e\xc3\x63\x38\xeb\xe0\x4e\x9c\x14\xf2\x63\x6e\xfd\xbe\x36\x65\x6e\xf4\xa8\xc8\x1f\x31\x1d\xed\xa2\x6b\x77\xbe\x72\xa0\x58\xeb\x1b\x51\x62\xaa\x87\x5c\xfd\x85\xa5\x39\x3d\xeb\xee\x6e\xb1\x24\xa2\xb0\x3e\xff\xae\x46\x44\xe5\xd5\x9f\x23\x7d\xf9\xfd\x77\xdf\xf7\xd1\x04\x99\x15\x5b\xa3\xc4\x9b\x8a\xb5\xbe\xfc\xfe\xe5\x25\xfe\xf1\xc3\xe4\x6e\xaa\xbd\xd8\xd1\xa2\x34\x31\x6e\x32\x97\xdf\x7f\xff\x52\x5c\x72\x27\x2a\x6d\xe0\x84\xb8\xf3\x74\x1f\xe1\x4d\xae\xef\xee\x73\xbb\x22\xaa\x38\x13\xcf\x17\xcd\xe8\x01\xe4\x03\x50\x90\xaa\xc8\xf5\xbf\xee\xb3\xa3\xbe\xfa\x16\x5a\x7e\x89\x61\xe4\xca\x8d\x0e\x2c\xc6\x70\x28\x20\x90\x43\x27\x30\x19\x45\xd6\xa6\x79\x8c\xf3\x5a\x05\x60\x8b\x80\xc5\xe3\x26\xb0\x6a\xec\x62\xa9\x8a\x3d\x99\x44\x4b\xc3\xdb\x51\x02\xcc\xff\x25\x9a\x54\x9c\x06\x28\xed\x02\x29\x90\x13\x54\xcc\x6a\x1a\x4f\x17\xc5\x16\x26\x9c\x35\x44\x6b\xec\x1b\x7f\x03\xc7\x49\x4f\x84\x19\xe0\x98\x81\x99\x67\x17\x6f\x5c\xda\xef\x4e\x91\xc0\xbd\x6b\xa6\xaa\x4e\x23\x31\x8b\x0f\x9e\x1b\x48\x2c\x46\x01\xe0\x6c\xc3\x5e\x95\x3b\x33\xb0\x60\xac\x75\x1b\xf2\xa7\x8a\x90\x90\xa4\x42\x11\x9d\xfb\x4a\x35\x4f\x45\x88\xe1\x06\xd5\x3b\x22\x01\xcc\xa7\x30\x85\xf9\x82\x90\x70\x78\x5e\x0e\x94\x6a\xe1\x6a\x6e\x21\x29\xd3\xf1\x07\x7a\x6d\xec\xb7\xed\xf6\xc1\xb8\x85\x3a\x8b\xbc\xe0\x34\xfc\x11\xea\xa5\xab\x02\x4c\xd6\x13\x35\x3e\x08\x31\x6c\xbd\x4e\x72\xa4\x64\x29\x27\x26\x31\x1e\x0c\xa8\x2d\xca\xf6\xe1\x9e\x87\xd5\xee\xf5\xc6\x14\xa8\x3e\x01\xbf\x4c\x62\x28\x1e\x13\x6d\xe8\x10\xe8\x52\x8d\xe2\x70\x02\x96\x44\xcc\x70\x09\xb7\x40\xb2\x08\x2b\x40\xe1\x30\xfa\x8f\x3d\xf2\x96\xb8\x57\x50\xf1\x53\xe3\x1b\xb9\x8f\x1c\xde\xa6\xe1\x5e\x10\x6e\xa5\x34\x0f\x05\xfc\xeb\x50\xe8\xde\x55\x5f\xc3\x29\x0b\x1c\x40\x2a\x5d\xb7\x7b\xc6\x1a\xe8\x1e\xbf\xeb\xf9\x12\x38\xd2\x1b\x90\x97\x10\x46\x1a\x77\x61\xe5\xcc\x23\x70\x1c\x05\x04\x19\x4a\xce\x51\xe0\x97\x17\x21\xdf\x3f\x50\x8a\x02\xde\xbc\xa3\x3a\xaa\x66\x9f\xb7\xa0\x5a\x13\xf8\x8a\x46\x2d\x67\x2c\xaa\xfe\xbc\x1e\x8c\xf4\x1f\x46\xa3\xbb\x9b\xa8\xfd\x9d\x2e\x7d\x88\x19\x98\xf4\x3f\x8d\x4b\xd4\x2d\x8f\x14\xe0\x56\x34\x0b\xc8\x33\x67\x4d\x8a\x36\x07\xce\x19\xe7\xe0\x21\x1e\x6d\x57\x8d\xbb\xb6\x28\x75\x56\x3c\x14\xf6\x74\xe8\x98\x85\xfe\x48\x0c\x13\x0a\x6c\xea\x74\xdc\x35\x50\xc3\xfc\x28\x44\x5e\xf6\xec\xfa\xa0\x41\xd4\x74\xb0\x9b\xb7\x7f\x63\xdf\x96\x9f\xaf\xf6\x25\xf8\x8d\xbe\xa1\xfb\x2a\x7e\x30\xfa\x61\x9f\x26\x26\x4b\x73\xca\x98\x50\x42\x81\x69\x32\xe0\xe4\x4a\xeb\x4a\x1f\xcc\xb2\x4a\x1b\x75\x4c\xaa\xc9\x34\xb3\x2b\x72\x87\x32\x40\xb4\x84\x75\x30\xec\x08\xa6\xdb\xa7\x99\xbe\x70\x4b\xf2\x6d\x93\xc2\xa7\x6e\xe0\xb0\x1a\xd8\x67\xe9\x84\xf9\xdf\xea\x69\xfa\x0e\xc0\xe4\xad\x90\x81\x48\x3f\xc1\x40\xf4\x95\x48\xf6\x77\xfd\x19\x3c\xbb\x5d\xdc\xfd\x8e\xda\x5f\x7f\xfa\x02\xfd\xe7\xe7\x97\x97\x4d\xfd\xaf\xab\x97\x5f\xf5\x3f\xff\x90\x9f\xdb\xc5\x9d\x8f\x15\xdd\x2e\xee\xfa\xc2\xe4\xec\xad\xfa\xba\xe7\xfe\xf9\x0e\xd5\x79\x6e\xe3\xad\xe9\xeb\xde\x1b\xbb\x89\x7c\x7b\x0e\x65\xcb\xe7\x47\x13\x97\xfd\xf3\xde\xa2\x50\xc1\x6f\x02\x95\xcf\x6e\x21\xcc\x06\x7b\x78\x5b\xc5\xb3\x25\x07\xa9\x9a\xba\x46\x4d\x12\x92\xb5\x31\x5d\x92\xa2\x6d\x01\x2e\x88\x30\xa9\xb6\xb0\x19\xa2\x0f\xb8\x3e\xc9\xf1\xb1\xd3\x9d\xcb\xa2\x55\xb2\x8c\x37\xaa\x27\x54\x30\xbd\xdf\x56\xed\x77\x40\xd4\x9d\x3f\x34\x95\x28\xdd\x1b\xea\x8d\x51\x80\x0e\xea\x39\xe9\x25\x93\x60\xb7\x4b\x35\x2a\x20\x48\x72\xb2\xbd\x9e\xf4\x20\xad\xe1\x48\x22\x89\x54\x25\xf5\xa2\x44\x88\xb4\x25\x4d\x45\xce\xea\x2a\xf2\x99\x74\x38\x06\xfd\xc7\x0c\x54\xbb\x41\xce\x0e\x6c\x3a\xc6\xf1\xd2\x25\xec\xf7\x69\xcd\x21\x98\x60\x7c\x9b\x23\x09\xca\x6e\xa9\xa8\x07\x3e\x8b\xad\x31\x7a\xe6\x9a\xc8\x09\x7f\x02\x2d\x80\x27\x4b\xe6\xe7\xd7\x53\xe2\x57\xfe\x0c\x9e\xdd\xdc\xfc\xf8\xfe\x37\x12\xfa\x3f\xf1\xf3\xb9\xfd\xff\xc5\x8b\xab\xa6\xfe\xf3\xf3\xef\xbe\xf2\x7f\xff\x21\x3f\x76\xf4\xbd\xb4\x8b\x07\xeb\xee\xe2\xd5\xc6\xe8\xab\xc1\x85\x3b\x1d\x50\xf6\x25\x97\x7a\x2f\xe9\x1a\x91\x03\xd6\x28\xdc\x67\x60\xfc\xa1\x9a\x01\xf0\x04\xd9\x5d\x09\xfe\x29\x44\x0b\xa3\x86\xe0\x88\xd4\xd5\xb5\xff\x33\xdb\xa5\x49\x12\xc7\xbb\x99\xeb\x29\x86\x2e\x98\x71\x0b\x85\x57\xe4\xf3\x58\x50\xa2\x34\xe2\x1c\xc1\x5c\x09\x3f\x4b\xe8\x66\xe0\x5f\xe4\x43\x79\x73\xc1\xba\x04\xf6\x17\x69\x87\x97\x2c\x11\x2e\x1d\x86\x18\x5c\x84\x38\xe7\x89\xfe\xb6\x97\xf4\xdb\x66\xef\xc4\xd3\xd7\x01\xba\x07\x94\xe6\x48\x66\x1f\x70\x90\xf9\x27\xea\x26\x24\xc6\xd8\x76\x74\x08\x86\x48\xf9\x5f\x9e\xb7\xb3\xe5\x57\xbd\xbd\xbb\x79\xbc\xd2\xbd\xb3\x11\xbe\x20\xd1\x5e\xd6\x1a\x0f\x51\x2c\x14\xde\x97\xa4\xb7\xb8\xdd\x19\x08\x37\x07\xd1\x9e\xc4\x60\xb0\xcd\x8b\x1e\x1b\xbd\x8b\xa9\x64\x89\xe3\xc9\x3d\x07\xca\xa0\x10\x59\x9a\x27\x66\x9b\xa7\x32\x50\xe3\x2f\xfa\xbe\xef\x51\x2d\x73\xcf\xa1\x2b\xc3\x49\xab\x22\x5f\x67\xe9\xaa\xae\x4e\x75\xbb\xfb\x3e\x39\xd4\x75\x59\xc4\x80\x9f\xa7\xb2\x90\x5d\x59\x40\x08\x16\x7f\xb3\xda\x14\x05\x66\x38\x12\x63\xb6\x1c\xe3\x0e\x78\x1e\xa0\x88\x3c\xa1\x89\x42\x4d\xeb\x55\xcd\x71\x44\x20\x3a\x40\xfd\x30\x50\x93\x96\x9e\xb5\x16\x3c\xe9\x9c\x4b\x59\x1a\x31\xe0\xd6\x48\xfc\xb3\x1e\x50\x81\xfe\xd7\xf0\xed\xdd\xcd\xf9\xe5\x6f\x2e\x03\xf1\xf4\xfe\xff\xfc\xe5\x77\x97\x17\x8d\xfd\xff\xc5\xc5\xf3\xe7\x5f\xf7\xff\x3f\xe2\x67\xf8\xe6\xcd\x78\x36\xd5\x6f\xc7\xb7\xe3\xd9\xf0\x46\x87\xba\x00\x4a\xb1\x08\xf0\x65\xa4\xdf\xc7\xe5\x6a\xa3\xaf\x2e\x2e\xae\x94\xd0\xf8\xff\x7f\xff\x17\x7e\xa5\x87\xeb\xb5\x29\x0b\x3d\xc9\x57\x03\xa5\x5e\x5c\x5e\xe8\xc5\x26\x2d\x13\x3d\xaf\x4b\x63\x6a\x7d\xae\xe7\x10\x8b\xbd\xba\x7a\x11\xe9\x79\x9c\xeb\x37\x65\x9c\xaf\xd2\x6a\x55\x44\x7a\x34\xd4\xdf\x7f\x7b\x79\xf1\x5d\xa4\xef\xe7\xc3\x86\x1a\x30\xb2\x1d\x34\x85\x7c\x3e\x2b\xdd\x25\x10\xfa\xbd\x51\x5f\x5f\x7e\xff\xe7\xef\x23\x7d\xf9\xfd\xf7\x97\x27\x55\x8d\x22\x68\x39\xd6\x5d\xf0\x46\x94\x86\xc6\x2f\x6f\x60\x57\x76\xbf\xf7\xfc\xc7\x09\x45\x66\x41\xed\x94\xa1\xab\x5e\x91\xd5\xfe\x12\x89\xf3\xf6\xb5\x29\x75\x6e\x6a\x22\xa0\x1b\x3f\x9a\xf2\x58\xe4\xf0\x8d\x3e\x82\xc4\x8a\x44\x0d\xbf\xe8\xd1\x94\xcb\xb8\x4e\xb7\x01\xff\x95\xef\x27\xc5\xae\x04\x6e\x58\x40\x5b\x03\x54\x50\x8e\x21\x2f\xce\xb2\xe2\x00\xf5\xa1\x77\xa5\x89\xb7\xcb\xcc\x20\x45\x83\x03\x93\xac\x81\x00\xa8\xaa\x85\xf7\xd5\x10\xfd\x82\xb4\x41\x7c\x88\x8f\x78\xa8\xaf\x4b\x63\x92\x62\x0b\xe0\x86\x8d\xb5\xe6\x21\x53\x8c\x32\x46\x69\x3d\xd0\xaf\x8f\x88\xae\x46\x5a\x7c\x6b\x52\xe0\x0c\x39\x31\x62\x82\xa5\xca\xba\x2c\x0f\xfb\x18\x1c\x37\xd3\xfd\x32\x2d\x5e\x06\x64\x55\xdc\xea\xf3\x73\x9f\x38\x2d\xb1\xb2\xcd\x7d\x50\xca\xc4\x56\x84\x4d\xb7\xae\xe5\xbe\x02\xe5\x5a\x98\x74\x8d\x16\x89\xf2\x25\xdb\x31\x20\x63\x05\x9f\xf0\x4d\xc3\x45\x05\x43\x85\x8b\x3d\x48\x61\x4d\x1f\x20\x87\xc1\x88\xf7\x55\xb1\xdd\xa6\x24\xb3\x0b\xd1\xe3\x7a\xa0\x7b\x73\x50\x99\x82\xbb\xa8\x6f\x64\x53\x85\x7a\x2e\x4f\xf6\x9b\x74\x09\x19\xad\xb0\x0b\x95\xa7\x43\xad\x6a\x13\x27\x03\x2c\xbd\x5b\xc5\x39\x09\x67\xe1\x8b\xa1\x1f\xa9\x75\x55\xa4\xeb\xa2\x18\x28\x05\xf5\xf4\x07\x63\x9d\xbf\x18\x28\x29\x83\xce\x8c\xec\x9f\x6c\x73\x20\x79\x57\x52\xcc\x97\xc6\x22\x22\xba\xc3\x74\xc5\x25\xe9\xa7\x47\x56\x4e\x23\x37\x38\x5e\x27\xcb\xd1\x75\xd3\xa3\x55\xa8\x71\xec\xe7\x7c\xd0\x3a\xdd\xa3\x49\x50\x3e\x18\x8a\x58\x5b\xe7\x92\x0a\x70\xd0\xe4\x52\x87\xb4\xda\xf4\x23\xff\x2a\x82\x66\x05\x3a\xda\x45\x09\x9d\xf5\x60\x90\x52\x12\x6d\xb5\x43\x0c\x0c\x93\xfe\x56\xa0\xa7\xa1\x29\x17\x4c\xab\x02\x57\xfd\x2e\x35\x44\xa5\x97\x42\x5a\x2d\x37\x07\x6c\x2f\xf7\xf9\x2b\xe7\xe1\x2b\xfb\x82\x4f\x79\x71\x40\xab\x30\xce\x75\x52\x68\x56\xbe\x4b\xf3\x07\x10\x45\x2f\x98\x09\x0d\x47\x0e\xc3\xf7\x30\x22\xa0\x69\xc8\x3d\x29\x89\x3a\xb0\xad\xeb\xa2\x5c\x02\x46\x00\x76\x97\xba\x50\x89\xc9\x8f\xac\xf7\xec\x13\x83\x88\x4b\x8a\xab\x4f\xf8\xa7\xc2\x8e\x49\x69\x9c\x49\x59\x12\xab\x1c\x25\x13\xc5\x5b\x94\xe3\xaa\x82\xdd\x8a\xc4\xff\x30\xc5\x57\xa5\xe0\xe8\x33\x5b\x91\x7d\x32\xf5\x67\xd7\x78\x06\xcb\x33\x22\xd6\x68\x30\xf2\x10\x74\x9e\xd6\x03\xa5\x02\x6e\xad\x27\x1e\xc6\x64\x8d\xd4\xdd\x91\xa3\x91\x79\x28\xe3\x1a\x8a\xc4\x31\xde\xa0\xd7\xc6\x88\x72\x64\x10\xc3\x0e\x30\x32\x95\x26\x45\x3f\xee\xa9\x60\x9e\x0e\x3c\x62\xbe\x31\x93\xeb\x8d\x01\xca\xd5\x22\x72\xb3\x4c\xcc\x2c\xfc\x54\x37\xe9\x06\x7a\x98\x27\x30\xad\xe0\x51\xd5\x06\xb5\x29\xb7\x3c\x0d\x20\xc9\x5a\xc1\xac\x38\xe2\x54\xc1\x03\x89\x86\x45\xa9\x0f\xa6\x6b\x7e\xd0\xd9\x75\x28\x90\xf7\xec\x07\xdd\xbb\xec\x8b\x40\x55\xd8\xdf\x50\x67\x75\xd5\xa7\xd2\x64\x9c\x20\xe2\xec\xc5\xd4\x2f\xaa\x76\x42\xd9\x3a\x64\xde\x76\x41\x44\xaf\xa9\xda\xc9\x6a\xec\x42\xb8\xb3\x72\x06\xb0\x1a\x66\x55\x11\xc1\xc4\x00\xb0\x65\xcc\xc8\x75\x4f\xf9\x87\x46\xf5\xbe\xc4\x89\x7e\xa0\xe2\x47\x64\x7e\xa4\x89\x06\x0b\xc8\xf0\xe1\xe9\xd1\x1a\xde\x6b\x29\x29\x73\xea\x73\x93\x6e\x77\x08\x36\x90\x81\x9e\xac\x5b\x27\x84\x33\x36\x80\x2c\x72\x6b\xec\x4b\x4c\x46\x40\xd3\x5d\x5c\x61\x39\x97\x6f\x9e\x3d\x44\xfc\xd4\xb1\x3b\x17\x8d\x56\x5c\x43\x3a\x12\x47\x10\x76\x38\x3a\x8a\xeb\x40\xda\xa5\x2a\x3c\xed\xdd\xae\x2c\x96\x99\xd9\xc2\x49\x88\x65\x20\x80\xa0\x81\x23\x42\xe4\x49\x4b\xb3\x06\x36\x29\x02\x6b\x79\x26\x7e\x3c\x6c\xbe\x11\xf8\x7f\x3b\x53\xde\xd8\x3f\x66\x10\x6b\x3d\x06\x3b\x92\x6d\x50\xbd\x01\x66\x0b\xbb\x37\x03\xc4\x26\xce\xeb\xec\x88\xdf\x4e\x7d\x82\x2e\x60\x35\xd0\x1f\x0c\xec\xa6\xb0\x6b\x3c\x16\x29\x4b\xa4\xe7\x0f\xac\x61\x20\x3c\x70\xaa\xf2\x8a\xc3\xf7\xc1\x17\x48\xc2\x2b\x55\x2c\x51\x84\x14\xdd\x4c\x36\x46\x00\x21\x42\x00\x85\x6d\xfc\xc9\x51\x9e\xd3\x63\xb0\x4c\xc1\xd4\x71\x79\x1c\x68\xd8\x27\x81\x2c\x0b\x12\x55\x30\x30\xd0\xdb\x60\xca\xa5\x35\xf2\xfe\x89\x3e\xc6\x57\xc1\xaa\x5b\x1a\xef\x4c\xc3\xac\xa4\x59\xf5\x4d\xa5\xa0\xdd\xfb\xca\xd5\x49\xb8\xeb\x62\xb0\xa5\x88\xe0\xca\x3a\x4e\x69\x75\x82\x58\x72\x8d\x32\x8e\x47\xa4\x95\x97\x21\x58\x27\x6d\xeb\xa0\x3b\xc0\x68\x60\x1f\xda\xa1\xdf\x04\x50\xee\xd1\xf4\xee\x23\xc0\xf6\x03\x99\x34\x28\x22\x98\x5e\x4f\xde\x4c\x46\x28\x0d\xa5\x2e\x9a\xf0\x68\x6f\xc4\xd0\x0c\x83\x2e\x0c\xa9\xc4\x71\xa5\x3b\x92\x8c\x98\x03\xda\xc0\x55\xeb\x2c\x90\xa6\xe0\xbf\xae\xe2\x23\x19\x99\x94\xd2\xf3\xfb\xc0\x69\xee\xf6\x27\xad\x40\xc4\x15\x9d\xdd\x61\x2b\xcf\x22\x92\xad\x41\xfb\x83\x3f\x42\x31\x24\x8e\xbf\x84\xb4\xa3\xf2\x44\xc7\xfa\x4c\xe8\x57\xd1\xfa\xe0\xa7\x11\x43\x2c\xd5\x4b\x89\xbf\x28\x46\x11\x84\x72\x54\xba\x83\x7e\xf4\x07\x17\x85\xb1\x07\x66\x6c\x17\x15\x5e\x4b\x9d\xc7\x48\xe2\x3b\xdf\x3a\x29\x13\x0a\x06\x05\x35\xc0\x99\xf4\x94\xba\x08\xe9\xc9\xa8\x34\xcd\x9f\xb5\x2e\x22\x86\xe3\x96\xc5\xf9\xc3\x3e\x7e\x30\x03\xdd\x7b\x67\x4a\x93\xe6\xc0\x8d\x16\x85\xd4\x98\x42\x72\xa7\x03\x03\xc1\x32\x17\xa6\xdc\xea\x33\xf9\xf2\xb3\x41\x1f\x41\xa8\x34\xe9\xd1\x0d\x43\x32\x7a\xbb\x02\x2a\x7d\x76\x2c\xf6\x67\x76\x43\x5f\xd5\xe9\x23\x1e\xf7\x42\x88\xe8\xcb\x26\x3d\xe1\xed\x6a\x36\x74\x15\x17\x4d\x3a\x46\x18\xd8\x39\xc1\xc2\xda\xd7\x55\x0a\xab\xb9\xd2\xd5\xaa\xd8\xd1\x3c\x89\x57\x10\xce\x2a\xf7\x79\xce\x5b\x04\x8f\x68\xca\xe5\xc8\x68\xb6\x50\xcd\x39\x6e\x97\x28\xf1\xea\x28\x03\xee\xfc\x66\xc8\x26\x37\x06\x7c\x80\xde\x5f\xb1\xec\x91\x40\x20\x86\x2a\x69\xe1\x2c\xd3\x3d\x29\x37\x54\xac\xed\x5e\x04\x35\x82\xc6\xe4\x98\x94\x5f\x1e\xbb\x5a\xdc\x07\x6e\x2b\xee\x43\x9c\x61\xe5\xde\x90\x98\x32\xf0\x41\xf0\x69\xe2\x3e\x32\x29\xa0\x4e\xf1\xd2\x13\xfe\x7c\xb1\xeb\xe8\x1e\x02\xbe\x8c\xb3\x4a\x54\x5c\x05\x56\xb2\x9d\xae\x0d\x82\xd5\x30\x8d\x86\x51\xcd\xbc\xda\xa5\xab\x3d\x92\x9e\xc3\x32\xf4\x95\x64\xd9\x51\x11\x60\xc1\x7e\x02\x29\x35\x41\x23\xe5\x55\xed\x52\x71\xfa\x88\x36\xdf\xc7\xf1\x95\x6a\xf2\x89\xd4\x20\x8d\x7b\x8a\x9f\x4c\x77\xf0\x93\xc5\xcb\xca\x80\x2c\x19\x02\xa7\xdc\xa3\xe1\x9a\x07\x2e\x68\xe0\xea\x7d\x67\x17\x86\x5d\xe7\xc9\x65\x1a\x3c\x68\x5e\xba\x4a\x5c\x3d\x50\xae\x2e\x97\x5c\x16\xb0\x44\x7d\x69\xf0\xe6\x88\xfa\x0a\x34\xab\x59\x0a\x07\xbc\xae\x98\x0c\xad\x98\x6d\xc6\xf8\xa8\x63\x32\xfc\x8a\x1d\x6d\x2e\xf6\x9b\x9d\xc5\x23\x4c\xaa\x14\x42\xf6\xe4\x2b\xb3\x05\x8c\x3c\xd2\xdc\x22\x32\xd7\x28\x76\xbf\x23\xa6\xce\x8e\xe9\xc2\xd8\x9a\x70\x4b\x53\xf5\x66\x0f\xe7\xdd\x16\x1b\x7b\x72\x75\x44\xac\x16\xd4\x9a\xa5\x1d\x04\x8d\xb4\xb3\x77\x95\x1f\x38\x69\x33\x2e\xd9\x68\xcf\xca\x38\xab\x0a\xbd\x35\x06\xa6\x88\xf2\xb5\xe3\xee\x7c\xfe\x41\xa9\x58\x90\xd4\xb0\xbc\x94\x40\xc9\xae\xd3\x0c\x4f\xce\x55\x5c\x96\x47\x51\x52\xce\x93\xad\xaa\x09\x08\xc5\x3e\x1d\xf6\x32\xb1\x14\xc1\xdd\xbc\xeb\x24\x71\xed\x70\x7a\x78\xd5\x40\xa9\x65\xeb\xfd\x30\x1b\x1d\x9d\x60\xc3\xd5\xe1\x0c\x6f\xb5\x89\x5c\xf9\x2b\x88\x91\x59\xdf\x06\xac\xa8\x52\x50\x5d\x61\x4d\x47\x4b\x54\xb0\x39\x90\xf6\x1e\xb0\x99\x8b\x75\x84\xe0\x44\x0f\xdc\x82\xd4\x0e\xbe\x21\xb6\x5f\xcd\x33\xd7\x9e\x43\xb0\xee\xd2\x32\x71\x60\xeb\xcf\x54\x89\x0c\x94\x5a\xf5\x19\xa1\xe9\xba\x98\x4f\xf1\xbc\x28\xb7\xc0\xf1\x54\x9a\x38\xc1\x70\x09\x98\xf4\x20\xb9\xe3\x22\xfd\x40\xc2\x53\xee\xf3\x48\x1d\xc3\x6e\x4b\x51\x90\x30\x77\x8a\xdb\xbc\xc3\xae\x41\x31\x0f\x4a\xa2\xdc\x83\xc0\xac\xe3\x92\x7b\x08\xec\x94\x49\x9a\xc7\xa5\xdd\x07\xc0\x81\xd3\xbb\x32\xcd\x6b\xd2\xfc\x07\xf5\x1f\xbb\x5b\xe5\x79\xb1\xcf\x57\x86\xb4\x51\x3c\x1d\xb5\xdc\xc7\x3a\xc0\x04\x60\x95\xd0\x3f\x4e\x3b\x28\x3d\x6b\x7d\x66\x80\x20\x8d\x8f\xc1\x94\xa2\x99\x0d\x2a\x04\x78\x71\xdf\x23\x05\x20\x7a\xd5\xce\x7e\x49\x63\xd9\x31\xf8\x04\x93\x9f\x8e\x43\x93\x65\x82\x15\xa3\xd4\xe0\x85\x16\xfa\x31\x35\x87\xc6\xee\xe6\x33\x5b\x3d\x97\x2c\xfc\x81\x09\x5c\xdc\x11\x8a\xb0\xc4\x34\x18\x37\x88\x48\x3a\xa0\x98\x1b\x68\xe8\x63\x34\xe5\x1a\xbd\x1b\xe1\x3e\x74\xfa\x88\x4d\x03\x46\xa0\xc4\x8d\x98\x6a\x3c\x68\xd0\x57\x2a\x71\x73\xce\xed\xda\xc1\x11\x97\x50\x8c\x54\x62\x6c\xb9\xf1\xb8\x87\x63\x1f\x13\xa1\xb1\x6a\x87\x72\x29\xc1\xe6\xe8\x48\x38\x48\x2d\x5f\x12\x31\xb5\x7e\xe9\x7b\x26\x7f\x50\xcd\x33\x02\x98\xc0\xed\xf1\x43\x8e\x1d\x20\x45\xf6\x90\x5c\x03\xe8\x2f\xc2\xf7\x48\x69\xc9\xf9\xe0\x30\x55\xe0\xd9\xad\xa3\x1d\x72\x9a\xa6\x36\x1d\x19\x53\x2e\xf9\x27\xc6\x44\x8c\x1c\xc5\x2b\x80\x69\xa8\xd3\xb2\xee\x1d\xe7\xc1\xd3\xbb\x3d\xc6\x37\xf0\x74\x8a\x73\x29\xfe\x27\x3f\x8f\x43\xb2\xd8\xd9\xa2\x8f\x70\x0c\xa0\x29\x6c\xf6\x38\x6e\xe9\xf6\x50\x88\x5e\x4a\xb7\xc0\xd1\x5b\x9b\xb0\xbf\x96\x47\xfd\x6e\xb1\xb8\x63\x92\xac\xae\x0e\x72\x59\xec\xf6\xb7\x8b\x0a\x7d\xe9\x29\xa0\x37\x08\x61\x32\x98\x92\xc4\x28\x08\xc1\x57\xae\xf3\x71\xa5\x17\x44\x4a\x46\x1b\x2b\x80\xd6\x19\xd9\x0b\x68\xed\x8a\xd3\xcc\xcc\xe1\x87\x77\x90\xb1\x7c\x6a\x3f\xa7\x93\x15\x19\xb4\x05\xff\x8f\xd0\xc3\x91\x86\x29\x54\x05\x10\x91\x46\xb7\x28\x26\x50\xaf\x84\x55\xa9\x0c\xc7\x82\xfd\x3d\xd2\x49\x81\x99\x05\xff\x99\x45\x65\xb4\x6b\x3e\xec\xc7\x8d\x13\x0c\x22\x5c\x20\xc2\x27\x5f\x3d\xd0\xaf\xf7\xf5\xa9\xeb\xb1\x16\xcd\x3d\x55\x32\x5b\x60\x0f\x92\x38\x53\x5a\x3d\x6d\x78\xd4\x1b\xd3\x89\x83\xc2\xe3\x8d\xc2\x01\xaa\xc8\xdb\x27\x98\x4f\x06\x63\x4c\xdf\x47\xc0\xd0\xc7\x27\x87\x8c\x7c\xa5\x0a\x4b\xb9\x12\xa7\x55\x84\x85\x4a\xf0\x1a\x76\x42\x50\x14\x0a\x63\x60\x79\x42\xcc\x75\xf0\x59\xa5\x79\x88\xcb\x04\x0a\xae\xac\xc9\xbb\x29\xf4\xc1\x1a\x72\x0a\x22\xa1\x8b\xcd\xbe\x8a\x44\x4e\x07\xd3\xef\xb5\xe3\x7c\x83\xe8\xb7\xc3\xa3\x83\xe9\x2c\x82\xbd\xe0\xc8\x54\x68\x34\xb2\x30\x50\x5d\x50\x00\x80\x10\x5f\xd8\x58\x0c\x00\x1d\x8b\xfd\x2b\x5d\xc6\xf6\xe3\x22\xf9\x2a\xf4\x7d\xdb\xdc\x81\x18\x0e\xcc\xeb\xb2\xc8\x3a\x3b\x5b\xac\x19\x68\x0d\xeb\xa9\xd2\xf4\x83\x51\x53\xe1\xa8\x35\x61\x14\x5b\x28\xd3\x7a\x78\xb0\xbd\xc4\x8f\x65\x87\xf8\xc0\x45\x57\x9d\x47\x86\xe3\xaf\x72\x6e\x1a\x7b\xdd\x4f\x4c\x9a\x3e\xd4\x1c\x00\x79\xfa\x96\x28\x92\x48\xd8\x45\xa1\x6d\xe0\xbf\x8f\x28\xd4\xdc\x31\xb7\x2c\xf9\x5c\x15\xad\xf3\x16\x12\x38\xb1\x1d\x16\xd2\xf3\xa7\x5d\xb9\xe6\x07\x34\xdb\x9e\x02\xa7\x9c\xa0\xce\x50\x57\x40\x5d\x56\x20\xdc\x85\x93\x1d\xe6\x67\xb3\xda\xa3\x16\x17\x20\x60\x4e\x1b\xd8\x95\xb5\xb0\xf3\x44\x5f\x11\x56\xf2\x84\x99\x9d\x14\x92\xb6\xd4\xd1\x73\xa2\x85\x3d\x5c\x81\x86\x6c\x0e\x79\x28\x81\xf1\xa0\x8d\x37\xac\x0e\xda\xc6\xab\x4d\x9a\x9b\x73\x6b\x06\xa2\x7c\x87\x38\xb8\x68\xa5\x73\xe8\xee\x89\x68\xd3\xe9\x4f\xc0\x21\xc5\xe1\x52\xab\x7d\x55\x17\xdb\xb8\x4c\x91\xca\x09\x83\x80\x3e\x18\x6c\x4f\x21\xb4\xd5\x5f\xe9\xa2\x8c\xc0\x5e\x6f\x7f\x4d\xec\x56\x0f\x1c\x72\x11\x95\x68\x22\xb3\x1c\x11\x52\x81\x6a\x9b\x3e\x02\xa9\x95\x5d\x27\xf6\x8c\x87\xd2\x16\x6f\x42\x1f\x23\x72\xce\xc8\xc6\xce\x0b\xd4\x63\x81\x88\x0a\x39\x66\x70\x90\x3a\x4f\x11\xf5\x67\xc9\xeb\x52\xd4\x51\x72\x56\x46\x74\x44\x42\x3f\xb7\x7a\x56\x32\x65\x06\x83\xa0\x02\x63\x01\xeb\x95\x7e\x6d\x5f\x2b\xee\x6b\xfd\x4b\xfb\x7a\x75\x6a\xe6\x48\xde\xb8\xc0\x90\x8b\x1d\x78\x0d\xad\x8d\x20\x89\xa8\xc2\x79\x16\x64\x62\x7a\x10\x31\x05\x75\xf9\x1c\x37\x28\xf8\x27\x24\xcc\x31\x16\xb4\x86\x28\x70\x6e\xdd\x12\xbb\xed\xc5\x99\x6a\x85\xb6\x38\x66\x14\x34\x49\x1a\xe2\x4f\xad\x43\xe5\x90\x68\x9a\x2d\x62\x9a\x4c\x69\x4e\x05\x75\x44\x80\xb7\x5f\xf2\x16\xbf\xa4\x0a\xf9\x3e\x86\xa2\xa5\x01\xb3\xf6\x7b\x83\x97\xdc\xdc\x61\x12\x97\xd0\x66\xee\xf8\x03\xaa\xf2\xa2\xa4\x38\xbb\x0a\x83\x90\xd6\x18\xae\xb1\x3a\x04\x80\x7f\x6e\xdf\xc0\x90\x6b\xa7\xf5\x44\x7a\x7a\x59\xa6\xea\xae\x66\x65\x99\xb5\x85\xf6\xd6\x37\x4e\xbd\xb7\x1a\xe9\x5d\xb6\xaf\xb0\x02\xd6\xb3\x0e\xc2\xac\x58\xc7\x2b\xa3\x40\x1e\x1b\xb5\x60\xc1\xaf\xa6\xeb\x71\x2f\x2d\xd3\x1d\x66\xf2\x13\x79\x06\x49\xad\x42\x64\x8a\xab\xea\x38\x23\x8a\x2a\xfa\x7a\xff\x45\x03\xfd\x8e\x39\x37\xc0\x38\xa3\x9a\x30\x09\x76\x6c\x7e\x8e\x58\x13\x0a\x52\xb2\x58\xab\x47\xc4\xc3\xf9\x11\xd5\xb8\x38\x9a\xe7\x1c\x1f\xb9\x94\x7a\x69\xce\xe1\x60\x7a\x72\x51\xaa\x25\x3a\xa3\x76\x94\xfa\x7e\xda\x6f\xe3\xbf\x91\x7c\x4a\x91\x83\x79\xd9\x23\xf4\x60\x19\xe9\x4f\xa6\xcc\x4d\x86\xd6\x45\x65\xf7\x62\xc6\xb1\xa9\x62\x67\x4a\x8c\x51\x54\xc7\xaa\x36\x5b\x8c\x23\x72\x49\xa7\x18\xd0\x72\x6f\x07\x81\xf9\x18\x90\x33\x9b\x5e\x45\x6e\x9d\x8a\x69\x39\xa6\x4e\x87\xc5\x75\x9e\x52\x93\x75\xeb\xc0\x17\x4f\xb7\x56\x92\x98\xfb\x29\x29\x61\x2f\x8f\x38\xcd\xc1\x91\x26\x01\xbd\x02\x69\x97\x49\x3c\xcf\x51\x7f\x26\x28\x9c\x47\x76\xa9\xbb\x4b\xb8\x13\xee\x01\xb8\xb3\xd9\xaf\x0f\x26\x1f\x1b\xcc\x28\x09\x0e\x2a\x7c\xab\x62\x4f\x54\xe4\xdd\x08\x79\x71\xf4\x18\x74\xca\xc0\xf1\x08\xe3\x1e\x3e\x8c\xbd\xdd\x99\x2c\x13\x18\x1e\xf1\x10\x1f\x13\x84\x55\x21\x3a\x03\xd5\x3d\x24\x65\x5f\x58\x20\xe1\x65\x1a\x22\x2d\xad\x8e\xd0\x1a\xc0\x69\xaa\x82\x7a\x41\x77\x58\x77\xb0\x32\xe8\xa1\x5d\x69\x75\x6d\xb6\x3b\xa9\x9e\xe9\x32\xba\xf4\x76\x25\x44\x22\x4e\xbf\x3c\xad\xf4\x63\x91\x26\xcc\x98\x90\x65\x21\xc9\x8e\xa7\xf7\x50\xc7\x27\x99\x0b\xc5\x1a\x74\x15\xfc\x2d\x4a\x1d\x0c\x4b\xa2\x6e\x1d\x41\x22\xd8\x5b\xed\xd2\xb9\xfc\x42\x02\x1d\x55\x15\x1a\x86\x28\xae\x3c\x21\xeb\x93\x94\x39\x03\xa5\x5e\x0c\x1c\x55\x6e\x33\x1e\x61\x27\xe3\xae\x6e\xb8\x0f\x55\x9a\xaf\x8c\x07\xbc\x00\x43\x00\xd2\x24\xd8\x4d\xd6\x7d\x7b\x4e\x3a\x7e\x90\x75\x26\xf1\x39\x88\x04\x05\x99\x77\xcf\xcb\x17\x8e\x8a\x12\x9e\x39\xd4\xce\x84\xae\xaa\x43\x74\xc4\xec\x50\xa1\x40\xdf\x26\x5d\xb2\x10\x0c\x94\x40\x23\x7a\x86\x5d\xbc\xf6\xd7\x10\x69\xc2\xba\x28\x0d\xd0\x53\x62\x73\xa8\x0e\xa5\xc5\x73\xc3\xae\x3b\x93\xd1\x9c\x36\xb9\x31\x3a\xe1\x04\xcd\x60\xc2\xe0\xeb\xb9\x2a\x31\x60\x0e\xa8\xc1\xf8\xac\x0a\x4a\xff\x11\xa8\xeb\x97\xa4\x63\xb1\xc5\xae\xf9\xcd\xec\x9d\x70\x4e\xd0\xc2\x46\x9a\x2f\xcf\xd1\x82\xe7\xfd\x53\x46\xfa\xd3\xdf\xab\xea\x90\x9f\x25\x58\x39\x34\xeb\x2b\x41\xdb\xe2\xf6\x31\x97\xf6\xcf\x98\xdd\xaf\x03\x8f\xa1\x43\x2c\x06\xb7\x2b\x64\xc2\x3e\x91\xc0\x1e\x34\x89\x44\x99\xbc\x9c\xc9\x50\x02\xe8\x51\x91\x37\x50\x34\xdf\x78\xaa\x71\x42\xfa\x74\x50\x74\xa5\x79\x73\x0d\x11\x8a\x08\x7d\x13\x62\x15\xb0\x83\xe4\x57\x1e\x25\x0a\xc5\x16\xdc\xc8\xf4\x0c\x94\xfa\x6e\xa0\x27\x5c\x9b\xe0\xea\xb8\x57\x86\x15\xb3\xf6\x65\xad\xff\xb6\x4f\x1e\x20\x98\x8b\x56\x89\x70\x29\x09\x22\x90\xe6\x6b\x7b\xc6\x10\x19\x46\xe9\x8a\xcd\x25\xa9\xb3\xee\x21\x38\x00\xcb\xa4\xeb\xc2\xdd\x5b\x55\x7b\x53\x21\x83\xb1\x63\x03\x2a\x0d\xf5\x22\xf8\xb9\x76\xe2\xf4\x18\xa3\xb4\x3c\x32\x3c\xbf\x44\x12\x0d\xc7\x6b\x22\x51\xeb\x42\xcd\xa2\x8c\x13\xd6\x19\x7a\x4a\xcb\x12\x52\xa8\xb4\x8a\xcd\xcf\xab\x7d\x85\x13\xd6\x4d\xa2\xe0\x5e\xd5\x92\x6a\x21\x78\x1a\x53\x83\x72\xae\xa6\x20\x5b\xbb\x8a\xeb\xb4\x5a\x1f\x75\x95\x6e\xf7\x59\x8d\xdc\x4c\x19\xa6\x91\x94\xac\x31\xef\xd8\x97\x61\xb9\x7a\xd0\xa4\x29\x6b\x4c\xad\x88\xdb\xe8\xac\x8f\x2b\x15\x8e\xe1\x51\xcc\xca\x13\xeb\x8e\x40\x1a\xba\x89\x1d\x8b\x55\x88\x34\x21\x62\x52\x00\x32\x02\x04\x37\x10\xf5\x94\xeb\xba\x1d\xfa\xb4\xd3\x10\xb3\x20\x50\x84\xb8\x29\x5c\xd6\x94\x32\x67\x49\x5a\x9a\x15\x11\xef\xda\x0d\x8d\xfe\xc5\xe1\xcb\x63\xb1\x77\x51\x36\xa3\xb0\x90\x00\xb1\xb5\xa4\xea\xc8\xbd\x0b\x05\x87\x69\xdd\x41\xb2\xc5\x6c\xa3\x10\xf6\x5c\x97\xf6\xa0\xe2\x08\x0e\x86\x70\x9f\x68\x3e\xda\x6c\x8d\x5c\x5e\x10\x43\x82\x1a\x4a\x50\x97\x7c\x9a\x98\x29\x3f\x42\x6d\x7e\xba\xda\x67\x31\x69\x76\x6f\x2b\xd8\xae\xd1\x66\x5e\xc6\x99\xdf\xbb\x8d\x7c\xbc\x0c\xba\x63\x18\x11\x14\xa3\xc5\x45\x22\x03\xd5\x79\xbd\x13\x64\x93\xaf\xad\xec\xb7\x05\x51\x32\xc1\x5f\xd0\x0c\x93\xa5\x39\xe8\x91\x12\x06\x92\xd7\xbc\x80\x0a\x41\x22\xd2\x61\x7b\xed\x4c\x25\xa6\x0d\x8c\xb0\x31\x90\x92\xc3\x6b\x9e\x7f\x6a\xed\x59\xdb\xf0\x4a\x62\xf7\xe0\x97\x6f\x88\xbe\xa1\xb2\x5f\x27\x5a\xc8\xa9\x5b\x3a\x3b\xed\x47\x3f\x94\x82\xbf\xca\x4e\x4d\xe5\x3c\xe7\x60\x88\xd1\xc8\x8f\xb4\x0b\x89\x4a\x86\x70\xaf\xe6\xcc\xb3\x9f\xc8\xe1\x6d\x87\xbd\x87\x0f\x36\xc5\x2e\x93\xf0\x29\xa0\xc8\x28\xf6\x95\xe0\xc9\x16\x35\x62\x87\x34\x31\xba\x84\xbc\xb2\x80\xbc\x2b\xe9\xe0\xf0\x64\x47\x7d\x41\x74\x41\x90\x2a\x18\x69\x11\x8a\x5c\x72\xbc\x13\x67\x89\x9f\x8d\x71\xad\xf0\xa6\x57\x14\xf6\xdc\xef\x5c\x0a\x1f\xc0\x6e\xcf\x12\x20\xbd\x85\x4a\x9f\x15\x40\x44\xd6\x7a\x83\xf2\xf6\x1b\x98\x32\xd6\xfe\x43\xdc\xb2\x0a\x76\x30\x57\x53\xe5\x75\x2a\x71\x8c\xa9\x91\x98\xb7\x73\x00\x18\xda\x04\x71\xfb\x56\xa4\x0d\x5b\xa4\x2b\x54\x3a\x0c\x17\x8d\x9c\xa5\x80\x5c\xb4\x0d\xb5\x6f\xc9\x8e\x04\x46\x3b\x90\x4f\xb8\x34\x59\x6a\x1e\x3d\x4f\xb0\x6a\x1c\x55\x78\xa0\x56\x75\x07\x9d\xe2\x9f\x1d\xdb\x4d\x33\x12\xf1\xac\x08\x08\xb4\x85\x91\xee\xd1\x30\x40\x4e\x81\x78\x4a\x05\x4e\x50\x69\x37\x2c\xcf\x24\x4d\x33\x9f\x54\x0c\x5c\x52\x53\xba\xe4\x44\xd2\xe8\xac\x10\x5f\x71\x41\xe8\x30\xbb\x23\x82\x9b\x55\x05\xed\xe8\x38\x0b\x00\xcd\x90\x24\x18\x62\x40\x82\x72\xfd\x60\xec\xe5\xbb\x0d\xa8\xa2\x04\x9f\x28\x10\x4c\x58\xc4\x85\x0b\xa5\xa8\xc8\x9f\x2b\x81\x61\x9c\x61\x95\xc1\xad\x48\x1e\x49\x95\x16\x5c\xd5\x65\x4f\xf5\x6d\x01\x16\x06\x77\x04\x6e\x1b\xfb\x8a\xab\xc4\x12\xd0\x43\xc5\x95\x1c\x57\xc4\x8e\x2c\x60\xf7\x4e\xc9\x84\xc9\xf1\x3c\xcf\x4c\x65\x67\x24\x07\x08\x29\x43\xb8\x2c\x92\x8e\xbc\xaa\xfa\x7e\x20\x8b\x68\xa0\x57\x18\x3a\x43\x64\x4f\x3c\xbc\xb9\x39\x70\x4e\xca\x93\xe9\x07\xb8\x3a\xd5\xc0\xe0\x77\x50\x7e\xcc\xed\xe7\x04\x4f\x62\xe6\x92\x2a\xdd\xa6\x19\x55\xab\xef\xd2\x32\x75\x9a\x6e\x54\xe1\xcd\x77\x60\xb1\x89\x6d\x27\x72\x5f\xda\x1b\x12\x53\xc7\x29\x90\x54\x13\x60\x0c\x5e\xe1\x80\xad\x45\x69\xe7\xf8\xca\x94\x80\x4c\x05\x2b\x9a\x93\x6b\x29\xa7\x3e\x91\x2e\x3b\xcd\x1f\xf6\xa8\xda\xe1\xae\xc8\xf7\xdb\xa5\x29\x07\xcd\x84\xae\x93\xad\x50\x71\xe3\xd2\x16\xfb\x1d\xf1\x80\x7b\x4c\x24\x1d\xab\x67\xc0\x2c\x24\xe5\xcc\xce\x10\x63\xe0\x2a\x13\x1c\xca\x46\xa8\x4f\xd5\xa7\x24\xc5\x69\x21\x71\x02\x8f\x1e\x09\xe7\x08\x1e\x0a\xa1\x72\x9a\x67\x74\x59\x1e\x69\x1c\xa9\x1c\xa9\xf1\xa5\x9c\x5e\x50\xf8\xc9\x47\xfd\xb9\x0f\xf6\x25\x93\x54\x12\x69\x5f\xce\xb7\x00\x55\xd3\xc9\x77\x7b\xb8\x12\x84\xf8\x7d\x49\x65\xe0\xec\x34\x53\xa4\xde\x04\x0d\xf1\x07\xf2\xbd\x34\x61\x4f\x55\x62\x7d\x53\x3d\x55\xd8\xc5\x7d\xf9\xdc\xae\xdb\x4d\xfa\x00\xd9\x29\xe1\xbc\xcb\x0e\x0f\xea\xc4\xee\x6e\x3c\xaf\x57\x27\xb3\x65\xb5\x5f\x02\xfc\x39\x05\xcf\x4b\x04\x96\x5c\x6a\xb3\x51\x74\x35\x50\xea\xf2\xc2\x99\xc9\x0c\x8d\x96\x2a\xeb\xd6\x2c\x6a\x21\xa8\x50\x71\x1d\x26\x48\x50\x1e\xa2\x30\xbb\x18\x6c\x58\x0d\xef\xc1\x51\xcc\x22\x47\x83\x09\xcf\x42\x2e\xe7\x58\x17\xa5\x12\x75\x6b\x60\x04\x7b\xb6\x07\xb6\x0c\xe4\xa6\xde\x18\x7a\xf1\xf4\x7d\xf5\x4a\x1d\x0c\x00\xe1\xed\xae\x51\xe1\x81\x26\x44\xfe\x19\x59\x3f\xd0\xd3\x7d\x09\x87\x70\xe5\xd8\x69\x97\x44\x61\xc4\x08\x62\x55\x1f\x0a\xfd\x50\x00\x6d\xf2\x1a\x37\x93\xf2\xd1\x91\x63\x01\x32\xbf\x8e\xeb\x3d\x22\xc7\xb3\x4c\x84\x2e\xe0\x57\x5c\x07\xe6\x2d\x0d\x88\xbb\x83\xc1\xb4\x2d\x9c\xbd\x54\x6d\xe2\x92\x59\x28\x4b\xd3\xac\xc7\x73\x6a\x72\xc8\x2c\x7b\x3b\x65\xa6\xef\x8f\x4a\x5d\x5e\x0e\xf4\xeb\xf1\x68\x78\x3f\x1f\x13\xf1\xf8\xf4\xed\x6c\xf8\x5e\x4f\xe6\x5c\x0f\x79\xad\xdf\xcc\xc6\x40\x75\x3d\x7a\x37\x9c\xbd\x1d\x47\xf6\xba\xd9\xd8\x5e\x21\x9e\xa4\xdf\x4c\x67\x4a\x3c\x20\x6a\xb0\x7e\xdf\x8d\x67\xef\x27\x8b\x45\x17\xed\xb7\xe3\x09\xff\xf0\x6e\x7c\xeb\x89\xdb\xd5\x7c\x31\xb4\xd7\x7b\x7e\x79\x78\xde\x68\x7a\xf7\x71\x36\x79\xfb\x6e\xa1\xdf\x4d\x6f\xae\xc7\x33\x40\x8e\x3f\x73\x94\xea\xcc\x4a\x7f\x37\x9b\xfe\x38\xb9\x0e\xbe\x49\x9d\x0d\xe7\x7a\x32\x3f\x73\x2c\xf0\xae\xed\x82\x6c\x3e\xd2\xe3\x09\x3c\x88\xf8\xe5\xc7\xd7\x7a\x3a\xf3\x1c\xf3\x9e\x4b\x5e\xbd\xbe\x5f\x00\x1f\x3a\x70\xc9\x03\x33\x3e\xf4\x4c\x07\x9b\xba\x7d\x3e\x13\xca\x0f\x91\xf7\x1b\x50\xec\xc4\x29\xaf\x4e\x71\xca\x0f\xb0\x03\x6f\x17\x93\xd9\x58\xcf\x26\xf3\xbf\xea\xe1\x9c\xbb\xf5\xdf\xee\x87\xee\x39\x77\xe3\xd9\x9b\xe9\xec\xfd\x90\x48\xe2\x1b\xc3\x68\xbf\x16\xb8\xda\xf5\xfc\xdd\xf4\xfe\xe6\x3a\xf8\xbb\xed\xa6\x31\xf1\xd0\x4f\x7e\x1c\x47\x40\xad\x3e\x9c\xcf\xef\xdf\x8f\x15\xf6\xf6\x1c\x08\xd0\x87\x37\x37\xfa\x76\x3c\x1a\xcf\xe7\xc3\xd9\x47\x3d\x1f\xcf\x7e\x9c\x8c\x00\x9a\x3f\x1b\xdf\x0d\x27\x40\x44\x3f\x9a\xce\x66\x63\xe0\x9b\xb7\x9b\xc4\xd5\x40\x4b\x32\x77\xd2\x15\x38\xcd\xfd\x6e\x9f\xe0\x25\x06\xfc\x98\x2b\xa0\x81\xb7\xa3\xd3\x1c\x78\xe0\xca\xb7\x7f\xf0\x03\xff\x51\x7f\x78\x37\x05\xa2\x7a\x28\x10\xf8\xc8\x53\x63\x36\x76\x15\x04\x63\x39\x49\x6d\x7f\xfa\x89\x39\x7c\x3d\xb5\x3d\xd0\x62\x9a\xb7\xc3\x43\xf4\xec\x62\x02\xd8\x57\x2b\xaa\x20\x8e\x1c\xe3\xbc\xf6\x8c\xf3\xd8\x27\x82\x73\xfe\x34\xb9\x3c\x90\xc9\x2b\x3b\xcf\x6e\x79\x7e\x2c\xa6\xba\xb9\x24\x7b\xfe\xdd\xed\xb9\xa7\x6f\xa6\x73\x98\x68\xd7\xc3\xc5\x50\x41\x8b\x17\x43\xfd\x7a\x6c\xaf\x9e\x8d\x6f\xaf\xc7\x33\x58\x4a\x28\x34\xb0\x00\x12\x7b\x7b\xc7\x78\xae\xe7\xf7\xf3\xc5\x70\x72\x8b\x83\x02\xcc\xfa\x33\xbd\x78\x37\x99\x5d\xf3\x5a\x52\x30\x3d\xdf\x0c\x27\x37\xf7\x33\x47\x79\xcf\x8d\x5a\x4c\xf5\xf4\x6e\x0c\x8f\x84\x89\x26\x06\x04\xaf\x98\xf7\x3d\x33\xfe\xfc\x7e\xf4\x4e\xe1\xe8\xe9\x60\xc5\x7e\xfc\x12\xae\x7c\xdd\xe2\xca\xff\xb5\xf5\xdf\x83\x67\x3f\xd9\x93\xf8\xcf\x2f\xcf\x2f\x07\x97\xbf\x13\x0f\xd8\x67\xf8\x5f\xbe\x7d\x71\xd9\xe4\x7f\x79\xfe\xfc\xf2\x6b\xfd\xff\x1f\xf2\x43\xa3\xef\x39\xc0\xd8\x78\xba\x1c\x5c\x06\x5c\x60\x50\x47\xff\xfd\xb7\xe7\x57\x17\x17\x2f\xa1\xfc\x82\xef\xbc\x2b\x8b\xbf\x99\x55\xcd\x66\xe3\xd0\x73\x4d\x0a\x05\x7b\x41\x04\xd6\xc1\xcd\x05\xc7\x7a\xb1\x26\xec\x43\xe4\xaa\x95\x4c\x59\x59\x33\x6e\x49\xa5\x35\x84\x49\x75\xb5\x44\x41\x15\xb6\xc8\x1b\x07\xc4\x5a\x04\xc4\x46\x6d\x5a\xcf\x8b\x12\x61\xd0\x20\xce\x98\x55\x76\xde\x24\xc4\x12\xe1\xed\x0e\x36\x51\xe9\xe5\xf9\xe0\xb6\xea\x66\x39\xdb\x1a\xf8\x2c\x87\xde\x4e\x84\x9c\xa4\x4c\xf0\x91\x7f\x57\x99\x2c\x53\x21\xfe\x7e\x1e\x54\x6d\xd6\x05\xc7\x2b\xb1\x8b\x10\xc9\xb5\xa1\xa0\xee\x5c\x16\xbc\xef\xcb\x1c\xec\x7b\x91\x2a\x69\xe8\x60\x7a\x87\x26\x00\xc7\x5f\x0e\xf4\x2c\x88\x7f\x62\x91\xad\xcc\xf4\xef\x2b\xdb\x4b\x54\x95\xc9\x82\x0e\x4d\x08\x34\x11\x48\x66\x69\x45\xe4\x33\x0d\x0c\x72\xd0\x02\x5f\xf2\x81\x05\x0a\xcd\x16\xa4\xb9\x16\xe9\x71\x6e\x01\x69\x66\xfd\x9a\x46\x3c\xd9\x06\x76\xd8\x43\xfe\x39\x1a\x24\x34\xe1\xb7\xd6\x93\x4b\xad\x49\xeb\xd2\xad\x2e\x65\xdf\xc0\xe2\xe4\x8e\xed\xd7\xa7\xa0\xc1\x84\x45\x22\xff\xca\x49\xd2\x51\xd3\x23\x17\xa7\x6b\x14\xc3\x08\x04\x0c\x62\xc6\x16\x80\x33\x4c\xce\x01\x04\x1c\x4e\xfe\xa0\x00\x8c\x02\x4a\x61\xbb\x58\x0b\xd2\xf6\xa5\x62\xf8\x42\xd8\x23\xf1\xea\x53\x5e\x1c\x32\xf3\xff\xb3\xf7\x3e\xcd\x6d\x1c\x5b\xbe\xe0\x3e\x3f\x45\x06\x5f\xcc\x98\x8c\x28\x42\x24\x25\xd9\x57\x56\x47\x4f\x40\x24\x28\xe1\x5e\x8a\x60\x03\xa0\xd5\xf6\x8b\x17\xaf\x13\x40\x02\xc8\xcb\x42\x16\x5e\x65\x15\x21\x2a\x66\x31\x8b\xf9\x08\x13\xb3\x7a\x11\xbd\x71\xc4\xfb\x06\x77\xe5\xd5\xd3\x37\x99\x4f\x32\x91\xe7\x9c\xfc\x57\x55\x20\x65\x5f\xdb\xdd\x3d\x63\x2e\xee\xb5\xc8\xaa\xac\xcc\x93\x99\xe7\xff\xf9\x1d\x0c\x98\x7c\xcb\x0f\xa6\x64\xe1\x2d\xea\x79\x15\xcc\xaa\xe0\x93\x94\xf7\x32\x2f\xb6\x58\xd3\xb5\x8f\x55\xf0\x43\x02\xfd\xdc\xed\x76\xbd\x8f\x4b\x78\x00\x00\x3f\x8f\x3c\xee\x9f\xf7\x3a\x16\xa5\x39\xc8\x58\x8b\x7a\xbc\x4d\x3d\x08\x0c\x1d\x23\x56\x6c\x3a\x6d\xd3\xe3\x7d\x4a\xf1\x91\xf9\x03\x1d\x88\xf4\x91\x06\xc4\x7a\x95\x94\x06\x43\x12\x44\x96\x6c\x21\x75\x60\x58\xb0\xbc\x98\x7b\x7f\x0f\xb9\x11\xeb\xf9\xfa\xd1\xc9\x40\xd8\x3f\xf4\x97\xa3\x44\x18\x87\x08\x8d\xbe\x6b\xe5\x5c\xe8\xae\x57\xe8\x3e\x5a\xb2\xd0\x0a\x61\x3f\x3a\x60\x12\xe6\x47\x9b\xc9\x65\xd8\xe6\x32\xa3\x62\x57\xe6\x12\x9c\x45\xae\xf4\xca\xf8\xd9\xb4\xb8\x63\x8a\x91\xeb\x80\x7b\xa3\x7e\xc3\xd3\xb5\x64\x7b\x44\xc4\xf4\xdd\x70\xc2\x27\xa3\xcb\xe9\x87\x3e\x1a\x4f\x64\xa1\x5c\xf0\x7f\xf9\x17\xb0\x4b\xbe\xfa\x0a\x94\x79\xab\x40\x75\xd9\x1e\x71\x77\x26\x16\xb5\xb4\xfa\xbb\xcd\x10\xf6\x54\x6b\x2b\x6e\x27\x7c\x31\x9c\x9c\x5f\xf5\x87\xef\x07\x17\xa9\x62\x3f\x79\x67\x4d\x03\xfb\xc1\x7f\xb6\x66\xe2\x9f\xbe\x66\x37\xe3\xd1\x9f\x07\xe7\x53\x50\x85\x61\xfe\xd3\x89\xd5\x83\x51\xfd\x1e\x8d\x27\x91\x82\xed\xfa\x35\x5d\x0c\xc7\xf4\x46\xf8\x2f\xdf\xb8\x89\x79\xdd\xda\xb7\x69\xca\xf6\xeb\xd6\x87\x8f\x93\xc6\xce\xee\xfc\x76\x0c\x1d\xba\x50\x9f\x7c\x33\x99\x0e\xa7\xb7\xd3\x01\x7f\x3b\x1a\x5d\x40\x17\x32\xb4\x6e\x06\x93\xd7\x5e\xa7\xbe\x9d\x0c\x32\x50\xa8\xe1\xc3\x37\xe3\xd1\xe5\x70\x3a\x79\x6d\xf5\xe2\x37\xb7\x93\x21\x10\x6f\x78\x3d\x1d\x8c\xc7\xb7\x37\xd6\xfe\x39\xe2\xef\x46\x1f\x06\xdf\x0d\xc6\x1c\xec\xea\x0b\xd8\x57\xea\x57\x45\x9d\xaa\x46\x97\x40\x03\x6a\x2e\x46\xed\xbc\xd8\xf0\x1a\x29\xd5\xb7\x24\xb0\x06\xcb\xf9\x34\x7e\xcc\x2a\xe6\xa3\xf1\x34\x36\x04\xae\x07\x6f\xaf\x86\x6f\xb1\x53\x58\xd4\xf4\xec\x88\x39\x1b\x63\x88\x9f\xfd\xd0\xff\xbe\x61\x6e\xb8\xb6\x56\xfe\x4c\x06\x35\x3d\x55\xc1\xd9\x7e\x15\xfc\xdf\x2b\xbe\xd7\x53\x3f\xbd\x67\xfd\x45\x31\x93\xc7\x6f\xf3\x87\xed\xfa\xdf\x46\xff\x7f\x7e\xf2\xcd\xcb\xa6\xfe\xff\xcd\xd9\xcb\x3f\xf4\xff\xdf\xe3\x27\x45\xfb\x3d\x7d\xf5\xea\x9b\xec\xf4\xd5\xab\x3f\x65\x67\x27\x27\x67\xf6\x7f\xbe\xe1\x70\x3e\xf8\x04\xe2\x62\xc6\x72\x70\xdf\xb7\xfd\x37\x52\xeb\xdb\xea\x7b\x03\x3c\xf8\x29\x3d\x9a\x45\x7a\x74\xa3\x8e\xb5\x0b\x73\xd7\x2b\xd3\x04\xb4\x81\x9a\xb2\x93\xf2\x59\x9a\xf5\xfe\x2d\x63\xc7\xfc\xba\x48\x6a\x55\x33\x2e\x17\xaa\x8a\xc5\x2c\x66\x13\xa7\xbd\xd0\xdc\xa7\xa3\xec\xe2\xd7\x76\xa6\x76\xc0\xe9\x5e\xcd\x95\x3f\x82\x2a\x1c\x35\xdf\x41\x2d\x8f\xa5\x98\xc5\x5d\x6b\xfe\xad\x6c\xb1\xf6\xa6\xc1\xab\x80\xe8\xee\x12\xef\x8a\x9d\x6e\xe5\xa3\xf9\x5c\x14\x57\x69\xdf\xa6\xd7\xcf\xdb\x7c\x87\x9c\x00\x9b\x0f\xcb\x6f\x7c\xf1\xcb\x76\x3d\x2d\x29\x66\x7e\x20\x57\xc2\xe5\x8b\x10\x29\x28\x86\x09\xe8\x33\x19\x48\x63\x0f\x43\x12\x89\x88\xd6\x64\xed\x64\xb8\x56\x89\xe2\x16\xba\x5f\x84\xb6\x17\x2e\xeb\x28\x2f\xb0\x26\x08\xb0\x4e\x6a\x49\x5d\x9e\x96\x76\xfe\x08\x6c\xe4\x52\x4c\xe2\x36\x16\x51\x6f\x8b\xa4\x9b\x45\x16\x0e\xaa\x0b\xf6\x51\x7f\x8b\x8c\xf9\x94\x24\x9f\xae\x56\x94\x15\x3f\x7c\xd4\x00\xd6\x72\x95\xab\x15\x86\xad\x4b\x4e\x1d\x4a\x72\xd7\xfc\xf2\x28\x63\x98\xb2\x34\x0f\xe9\x4c\x84\x26\x54\x94\x10\x69\xc1\x2c\xe1\x55\x59\xd4\x7a\x61\x38\xe4\xda\xaa\x25\x31\x9e\x08\x69\x8f\x3a\xde\x94\x7c\x2d\x16\x2e\x01\xcb\x01\xee\xd0\x59\xdf\x16\x86\x30\xa8\x1e\x3c\x26\x14\x2d\x0d\xed\x24\x1c\xd4\x9b\x6d\x8c\xf2\x1f\x71\xab\x21\x82\xce\x9d\x6f\x7c\x26\x8c\xb2\x56\x03\x6e\x14\xc1\x63\xbb\x1c\x6e\x4a\xfe\xb0\xbb\x47\x29\xb7\x19\x83\xf0\x45\x55\x94\x0f\x59\x07\x44\x35\x66\x93\xe6\x49\xeb\x8c\xc6\x64\x22\x37\x83\xef\x61\x1b\xe5\x96\xb9\x20\x37\xc4\x4f\xa1\x5a\x06\x6b\x26\x3c\xba\x76\x51\xf2\xa5\xaa\xb4\x34\x86\x4a\x00\x42\x5e\x0e\xf3\x09\x26\x50\xc9\x70\x1c\x27\xb7\xb9\xa8\x64\x54\x8c\x12\x3c\x38\x2b\x51\xfa\x06\x26\x30\x5d\xe6\xa7\xfb\x1f\x55\xe5\xf9\xe3\x27\xfa\xe9\x3d\x3b\x3f\x3f\x7e\xf3\xfd\xf1\xf5\xf9\xf1\xa4\x7f\x7c\xd6\x7b\xf9\x1b\xe8\x80\x4f\xe0\xbf\xbe\xfc\xba\x85\xff\xfd\xfc\xe5\xf3\x3f\xf0\xbf\x7f\x97\x9f\x56\x7b\x96\xa8\x19\xfe\xf1\x75\xa1\xcf\x7d\xcd\xd3\xf1\x64\x2d\x4a\xd9\xcf\xd5\x9d\xe4\x67\xbd\x97\xfc\x7c\x3c\xe8\x43\xd7\xe0\xf3\xd1\xfb\xf7\xa3\xeb\x09\x3b\x1f\x8d\x6f\x46\x63\x00\xa2\xc2\x88\xe8\x94\xf7\x21\x9e\x75\x39\x1c\xbf\x07\xc3\xef\x62\x34\xc0\xdf\xbb\x90\x24\xb6\x2c\x76\x56\x66\x2f\x41\xb7\x62\xce\x2a\x73\xcd\x86\xfd\xdb\xf0\xe5\x01\xef\x5f\xf3\xfe\x74\x3a\x1a\x5f\x0f\xbe\x3f\x3e\xbf\x1a\x62\x43\xe5\x2b\x6c\xa1\xfd\x6e\x78\xd3\xf3\x33\x64\x34\x43\xf7\xd9\x09\x8e\x3b\xbc\x86\x50\x21\xcc\x17\x4c\x52\xcb\xf9\x8f\x2d\xe7\x7f\xd3\x9f\x0c\x27\xbd\xd6\x0a\xb1\x61\x37\x0b\xa1\xde\xe1\x60\xc2\xc7\x83\xb7\xfd\xf1\x85\x0b\xc9\xc6\x63\x3a\xaf\x46\x86\x6b\x27\xaf\xc1\x24\x98\xb1\x2c\x0a\xa7\xf1\xf1\x60\x72\x7b\x05\xa1\xdd\xcb\xf1\xe8\x3d\xb8\x0a\x6e\x27\x83\x1e\x73\x79\x46\x2c\x74\x10\x3f\xec\x4f\xf8\xc5\xe0\x12\x03\x55\x83\xab\xd1\x87\xa3\xc4\x89\x72\x7b\x7d\x31\xc0\xbe\xcc\x08\x27\xe6\xe8\xd8\xda\xb0\x14\xec\x97\x1f\x1e\x9c\x9f\xdf\x5c\x1d\x58\xeb\xf9\x80\x7e\x77\x70\xd4\xf3\x5d\x9d\xe9\x1b\xd3\xc1\x39\x85\xae\x43\x14\x12\x63\x8b\x0c\x83\x58\xcd\x88\xb6\xb5\xb9\x1b\x0d\xa2\x29\xdc\x35\x7d\x67\xb7\x70\xc2\xfb\xb7\xd3\x77\xa3\xf1\xf0\x87\x68\xee\x69\x8f\xe9\xf0\x25\x7b\x9c\x70\x1e\xef\x86\x6f\x86\xd3\xc1\x45\x8f\xb1\x37\xdf\xf3\xc1\x3f\x0f\xc6\xe7\x68\xe5\xdb\xcf\xc1\xb3\x3e\x3e\x0c\x5f\xf4\xd4\x79\x37\x18\xbb\xd8\xee\x39\x84\xda\xc1\xd3\xf4\x76\x3c\x18\xf0\xe9\x88\xbd\x19\xf0\x37\xa3\xdb\xeb\x0b\xd7\xd9\x3d\xa5\x20\x4d\x09\x69\xe2\x7b\x5b\xbf\xb5\x47\x61\x02\x43\xda\xdf\xe3\xc7\xd9\xf9\xe8\x9a\x62\x89\x98\x22\x00\xfe\x8c\xc9\xf0\x62\x40\x37\x64\x74\x69\xdf\x18\xd3\x2c\xfa\xd4\xe0\x1c\x3c\x0a\x5d\x28\x70\x98\xaf\x70\xda\xe3\x17\xbe\x14\x0e\xfb\xe0\x1e\x9c\x87\x52\xea\x0f\x45\x79\xe7\x70\xce\x04\x15\xe9\x61\x41\xa1\xfd\xf7\x56\x96\xaa\x58\x00\xc8\x10\xe4\xa7\x5b\x45\xb8\x5a\x53\x6f\xc5\x92\x49\x3d\x7f\x98\x83\xdb\x56\x89\x2c\xed\xfd\x87\x2d\xbd\xb0\xdd\x94\xc7\x3f\x57\x9a\xd7\x3a\x80\xe5\x14\xe5\x26\xc3\x3a\x27\x46\x75\xb1\x21\x27\xc9\x79\xb6\xa3\x24\xd2\x2c\x00\x6a\x41\x79\x9a\x43\x04\x40\x37\xb9\x47\x2a\x60\x9d\xe0\x04\x10\xf3\x31\x46\x6e\x66\xb9\x07\x46\x4b\x4a\xca\x11\x5a\xa1\x1f\x61\xe9\x44\x0d\x44\x59\xe8\x00\x4c\x34\x4b\x7a\xd0\x45\x90\x09\x82\x5f\x04\xe3\x01\x1e\x3c\x14\x86\x43\x31\xa2\x5c\x20\x38\xdd\x11\xf3\x08\x4e\xa8\x61\xb5\x1b\x86\x43\x57\xdf\x83\xc6\x48\xe9\x36\x91\xb6\x0d\x6d\xba\xaa\xa8\x57\x71\xfa\x0b\x6b\x2c\xba\x4c\x64\x79\x2c\x3f\x62\x9a\x9c\xb3\x6a\xc2\x46\x47\x20\x70\xe0\xd7\x47\x5c\xa9\x12\x52\x75\x11\x61\x65\x51\x8a\x8d\xa8\xc8\x5f\x9b\xb1\x25\x86\xb9\x44\xee\x7e\xc3\x37\x05\x28\xf6\x5b\x35\xaf\xea\x52\x86\x8c\x3f\x03\xcd\x4a\x4b\x49\x3d\x1e\xed\x56\x84\x08\x0c\x0e\x26\x66\xa5\x42\x2f\x37\x96\x3f\x48\x6d\x68\xd0\xa4\x80\x02\x9c\xe7\xed\x53\x46\x50\x82\xa5\x9c\x0b\x53\x65\x0c\x61\xb0\xa0\x65\x2e\xbe\xbf\x10\x5b\x30\x53\x31\x07\x89\x70\x1d\xbb\xf7\x99\xc7\xfb\xcc\x7e\xde\x3e\x37\x36\xb5\xbd\xa7\x8f\x74\x4c\xe3\x3b\x80\xf8\x09\x17\x07\x40\xcc\x69\x1b\xa0\xac\xd2\x60\x29\x2b\x24\x66\xd5\x7a\xc1\x22\x7a\x82\x01\xfa\xa0\xe7\xeb\xb2\xd0\xce\x9f\x4e\xb6\x8d\xbb\x85\x95\xda\xc8\xc5\x31\xda\x12\xae\xbf\xa2\xe0\x9b\xe2\x1e\x90\xa5\xad\xad\xc3\x0f\x0f\x60\x0c\xa5\x57\x07\x47\x3e\x19\xeb\x67\x2e\x98\xb5\xfb\x38\x1f\xb8\x56\x81\x07\x51\x61\x71\x00\xf4\xf4\xdd\xf0\x1f\x70\x2f\x5c\x3b\xed\xb4\x51\x3a\x64\x82\x75\x76\xd6\x07\x16\xc7\x39\x5f\xf4\xf8\xc1\xc8\x25\x16\xf7\x21\xb4\xf0\xe4\x07\x77\x6b\xe7\x6c\x58\xf8\x0f\x62\x1f\xe1\x83\xf8\xba\x55\x31\x90\xa5\x2f\x65\x06\x0b\x08\xd1\x53\xd7\x6a\x8b\xf3\x7e\x04\xc3\x32\xcc\x77\xd9\xe3\x07\xdf\x17\xb5\xbf\xcc\xba\x7b\x72\x54\x09\x65\x2f\xeb\xde\xea\x47\x86\xb5\x8e\x86\x60\xb5\xe5\xbd\xc2\x6a\x9a\x7b\x55\xe4\x7e\x55\x9d\x74\x6b\x36\xa0\x60\x6e\xfd\x70\x63\xdc\xb0\xbe\x82\xd2\x75\x51\x8a\xfc\x49\xbe\x1e\xc8\xb7\x92\x8c\x21\x3e\xf6\x4e\x99\x2f\xa4\xd9\x2a\x00\x44\x74\x13\xa6\xe9\xa2\xa3\x69\xe5\x4f\x8c\xe4\x03\xac\x43\x30\xf1\x46\x84\x08\xe3\x5a\xad\xd6\xc7\xb9\xbc\x97\x79\x08\x7a\x92\x1e\x6a\xef\xb1\x61\x06\x1a\xdf\x63\x2a\x61\xd2\x91\xd8\x95\x0a\xfa\xe0\x6a\xa5\xaa\xbc\x75\x5f\xbf\x8d\xd5\xda\x8c\x5d\xc7\xb5\xfc\x19\x0f\x8a\x2d\x46\x9d\x2f\x85\x2a\xf9\xad\x91\x7c\x4c\x20\xd8\xd7\x54\x92\xe9\xa2\x61\x79\x1b\xb4\x9e\x52\x63\xeb\xb9\xcc\xd0\x66\xc7\x12\x55\xd7\xae\x35\xea\xcf\x4a\x1d\x44\x91\xe8\x4b\xfb\x29\xf0\x6e\x2d\x55\x69\x2a\x88\xc5\x45\x4e\x12\xef\x62\x31\x0e\x1a\x05\x52\xd2\x8d\xbd\xb6\x0e\xda\x65\x99\x1e\x6a\x5e\xec\xb4\x2c\xbb\xc0\x4b\xfd\xb8\x71\xeb\xdb\x5c\xec\x0c\x46\x91\xdd\x4e\xbd\x2d\x85\xae\x7a\x7c\x92\x66\x09\x74\x26\x3a\xb7\xd2\x8d\xdd\xd6\xb0\xd8\xab\x68\xb0\xc4\xcf\xde\xb4\x7c\xb1\x53\x0b\x99\x25\x65\x56\x19\x38\x24\xfc\xba\x32\x7b\x30\xb7\x12\x9a\x52\x1f\x2e\x8b\x12\x5d\x6f\x75\x99\xb0\xc2\xae\xde\xbd\x47\x71\x6b\x7b\x5f\x7b\x18\x15\x1e\x2a\xcd\x82\x28\x45\xf4\x3e\x27\xc5\xbf\x05\x55\xaa\x2a\x1a\xc9\x04\x78\x89\x1a\x59\xbd\x11\x2b\xae\x08\xf8\xa4\x44\xac\x8e\x86\xb4\x09\x9e\xc6\xf6\xa8\x50\x19\x10\xb9\xd2\xdd\xe9\x6d\x28\x26\xe6\xb5\xe3\x89\xb3\x5e\xe4\x4e\xc5\xdc\x56\x37\x66\x83\x95\xdb\x77\xe6\x3d\xde\x8d\xa1\x5f\xf2\xed\xba\xd0\x05\x0a\x1c\xbb\x81\x99\x07\xb9\xc3\xe2\xa0\xfc\x21\x73\xb0\x22\xe1\x37\x90\xa6\xd0\xfc\x2d\x94\xfd\xc2\x5d\x86\xaa\x4a\xe8\xfb\x07\x28\xd4\x0b\x55\x34\x40\xca\x02\xc5\x9c\x7b\xab\x63\xf9\x1d\x4b\x5f\xfc\xbb\x5a\x46\x07\x9d\x83\xdf\x9e\xce\x18\xa9\x2f\xee\xf8\x2d\x5c\x17\x41\x00\x23\xf3\xf9\x0a\xa2\x32\x1e\x9e\x5e\x17\x3b\xf0\x60\x42\x7d\x80\xbd\x36\x80\xe4\xcb\x17\x58\xf2\xd1\xe3\xad\x4f\xc4\x39\x1a\x1e\x79\x89\xb0\xe8\x5b\x20\x9a\x02\x33\xc7\x2b\x39\x5f\x6b\x72\x5e\x6a\x39\x97\xc6\x88\xf2\x61\xff\x3d\x71\xc9\x2d\xcd\x49\xf7\xe2\xec\x2e\xac\x29\x75\x68\x03\xae\xaa\x37\xe1\xcf\xa5\x74\xe1\x05\x97\x0a\xf6\xa4\x8b\xd3\xcf\xc2\x48\x68\x65\x50\xad\xed\x7c\xa2\xde\x5b\xd2\x75\xdd\x5a\x1e\x61\x12\xc5\x38\x2a\x43\x46\x72\x39\x3e\xe0\xe6\x14\x06\xe0\xcf\x89\x96\x2a\x46\x4a\xd8\x88\x85\x64\x51\x56\x94\x1d\xdf\x4d\x8a\xc0\xaf\x83\xa8\x8a\xab\x9e\x91\x6d\xb8\x42\x89\x38\x20\xe1\x4f\x17\x1d\xcb\xe8\x37\x74\x00\xb3\xd0\xb1\x11\x1e\x83\x63\x97\x3f\x30\x77\x3e\x83\x19\xa0\xf3\x87\x7d\xe8\x9a\x69\x53\x6e\x0f\x26\x4a\x47\x84\x79\x0c\x47\xf8\x58\x85\x9d\xe5\x61\xf4\xb1\xa4\x4c\xae\xa1\xeb\x2a\x0d\x1a\x79\xd6\xa1\x58\x00\x3c\x19\x73\x11\x8d\xe8\xde\x25\x7a\xe9\xf7\x09\x72\xdb\x63\x04\x60\x8f\x13\xc0\xd1\x27\x05\xc5\x40\x48\x1f\xf4\xaa\xbb\x42\x16\x52\xca\x22\xfe\x82\xd6\x40\x5e\xe1\xa3\x49\xaf\xf4\x6e\xcd\x89\xa8\x12\x55\xad\xb3\xa8\x6a\x9d\xef\xa9\x5a\x87\xcd\x48\xe7\x17\x01\x65\x04\xed\xd3\xef\x47\x13\xb1\xf8\xe7\xa1\x15\x87\xd4\x2f\x16\x70\x90\x95\x34\xe9\x0c\x7e\xe6\xe9\x63\x8f\x12\x3f\x90\x14\xad\x0b\xa0\xf6\x7c\xad\x8b\xbc\x58\x81\x19\xb3\x91\xc2\xd4\x25\x2d\x81\x39\xcc\x1d\xc2\x60\x49\x2b\x10\x9d\xd9\x22\xf8\x46\x68\x0d\xf9\x6b\x51\xcd\xa7\xcf\x4b\xeb\x54\xb1\x79\xdf\x15\xc2\xc7\x8c\x30\x2a\xe0\x7a\x44\x9e\xb6\xcd\x7c\x2c\x58\xa3\x40\x9c\x4c\x50\x44\xbb\x84\x2f\x17\x80\xc9\x67\xf5\xb4\xa0\x38\x10\xc6\x29\x56\x6c\x42\x91\xac\xe9\x52\x94\x9a\xa6\x02\x1f\x2e\xb1\x2b\x0f\x08\xf0\xae\xa9\x81\xa9\x4f\x81\x5d\x44\xbf\xd1\x11\x2b\x75\x47\x29\x73\x9f\x01\x94\xc1\xca\x95\xf0\x5a\x4d\x28\x63\x84\xe5\xe9\xb5\xf9\xd6\x7a\xf4\x83\x9d\xc0\x42\x41\xca\x99\xc7\x2b\x99\x3d\xf0\x79\x0e\x38\xba\x2f\x0e\x17\x47\x99\x55\xb7\x09\x45\x13\x2a\x1f\xe3\x89\xb7\x0d\xc7\x27\x26\xce\xbe\x64\xe2\xbc\x39\xf1\xa6\x71\x1a\x26\xce\x1e\x9f\x38\x0f\x13\x07\xaf\xcb\x6f\xc3\x9a\xdb\xd6\xf3\x17\xf2\xe8\xb4\xf0\xaf\x75\xd8\xfd\x5d\x80\xec\xc2\xa6\xe5\x84\xe5\x6d\xf1\x78\x10\xe3\x73\x0e\x7c\xe6\x1c\xf8\xca\xfd\x47\x60\x48\x22\xc2\x85\xfe\xe2\xf1\xd9\xa1\xec\xad\x7a\x5f\x1e\x0f\xf8\xb3\xd8\x0a\x7d\xd4\x6b\x49\x21\xa8\x6b\xfe\x7b\xa4\x50\x13\x63\x93\xb9\x8a\x4f\xaf\x35\x7b\xeb\x13\x22\xf1\xbe\xdf\x3e\x02\x6b\xee\x91\x5c\x52\xcc\xd7\xac\xb9\x8f\x5f\x2e\xc5\x3a\xcf\x0a\xfb\xa5\x52\xcc\xc1\xa7\x84\xf9\xa0\x05\xf1\xbb\x4a\xb4\x86\x12\xb1\x47\x68\xb1\x9f\x2b\xb4\xf8\x7e\xa1\xc5\x7e\x95\x7b\xe9\xfe\xcc\xba\x58\xc7\x97\xc8\x2f\xde\x92\x5f\xec\x17\xca\xaf\xd6\x76\x04\xf9\xc5\xf6\xca\xaf\x16\xb7\x6b\xdb\x46\x6d\x79\xc1\x7e\xa9\x28\xeb\xfa\x24\xfb\x85\x52\x0d\x0c\xcd\xf8\x80\xfb\xa3\x06\x7e\xde\xce\xe3\x56\x15\xf0\x46\x5b\x27\x67\xae\xd3\x04\x52\xd9\x01\xe7\x6d\x4b\x45\xb0\x91\xde\xd5\x02\xa8\xbb\x25\x01\xac\xc0\x90\x3b\x51\x2e\x78\x04\xcf\x28\x16\xf7\x42\x57\x62\x45\x79\x32\x76\xad\x92\x6f\x0a\x0d\x4d\x83\x10\xaa\x8d\xbc\xd2\x94\x3d\xef\x1a\x24\xc4\x7b\xee\xc1\x7d\x59\x5c\x2c\x4b\x88\x50\x91\xd1\xe8\x4c\xc6\xa5\xca\xe5\xb1\x2b\x3f\x4d\x12\xae\x7d\x96\x0f\x4b\xdd\xb0\x48\xef\x2f\x5f\x17\x8f\xd7\xc5\x1e\x5d\x57\x92\xc0\x14\x10\xe7\xb7\xe2\x21\x4e\xf9\x70\xaf\xb2\xf8\x55\x40\x87\x28\xb4\xa6\xed\xf1\x27\x3c\x26\x52\x8b\x22\x3d\xb0\xd6\x87\xcd\xfe\x6c\xbf\xae\x25\x84\xf1\x83\xa6\x1d\x6e\x7f\xdf\x74\x1e\x64\x29\x1f\x63\x11\x1f\x6b\x66\xd8\x19\xef\xfb\x76\x41\x16\x47\xba\x2c\x20\x69\xfb\x5a\x6b\x82\x8e\x2d\x4a\xda\x7f\x87\x5e\x55\x57\x2a\x57\x9f\x94\x5e\x7d\xcb\x0f\xd5\x51\x92\xb5\x6f\xff\xbb\xe1\xce\x06\x64\xb0\xad\x91\xf5\xa2\xd0\x0f\x9b\x8c\xa9\x65\xe4\xd2\x3a\xe2\x6a\xc9\x4d\x0d\x4c\x62\xe1\x8b\x82\x0e\x95\x3a\x72\x80\xfb\xcd\xd1\xe8\x11\xaf\x74\x79\xd8\x44\x0f\x8f\x8c\x59\x3d\x45\xe9\x31\xb3\x50\xb8\x0b\x0e\x78\x5b\x90\x3e\x46\x61\x13\x9f\x61\x07\x18\x74\xe0\xbf\xce\xd8\x5f\x8b\xba\xd4\x22\x3f\x22\x58\xdb\x08\x52\x43\xfb\xaf\x7e\x65\xda\x65\x37\x81\x6f\x50\x5f\x46\x86\x90\x22\x31\x86\x16\x50\x17\x88\x99\x16\x3b\x78\x1c\xbe\x78\xde\xaf\x83\x8f\x97\x25\xfc\x39\x50\xec\x75\x43\xd3\x0c\x68\xe8\xa9\xd2\x19\x29\x22\xac\x43\x11\x09\x95\x31\xc0\x89\xbc\x26\xee\xe1\x26\x1c\x6a\x4b\xa8\x3b\xf3\xf8\x8e\xa4\x18\x23\x9a\x26\xac\xe3\x76\x3c\x8c\x19\xb5\x17\x9e\x1d\x09\x9f\x85\x53\x74\x20\x9c\x13\xa1\xdd\xc6\xc7\xf4\x75\x5c\x4f\x34\x17\x86\xa0\xcd\x5a\xca\xb9\x70\x0a\x3f\x61\xcc\x7b\x8c\xbb\x0e\x01\xd7\x25\x8b\xe0\x98\x64\xfc\xe0\xb2\x94\x7a\xbe\x4e\xda\x4b\x11\xc4\x28\x3c\x36\x7b\x68\x9e\xc9\xec\xc0\x2e\xe4\x60\x32\x2f\xa5\xd4\xe0\x98\xf3\x09\x85\x1e\x33\xa6\xf9\x2a\xa3\x58\xcf\x11\xa1\x93\xd0\xd4\xc9\xa7\x16\x63\x19\x91\xa8\x88\x0f\x10\x48\x8d\xd7\x9e\xeb\x65\x6c\xed\x00\x15\x5d\xaf\x94\x47\x49\xd5\xc1\x44\x32\xc0\x11\xe3\x1b\xa5\xd5\xa6\xde\x60\xaf\x0a\x9a\x12\xa2\x5c\x62\xa5\x10\x46\xfb\x42\x60\x13\x50\x52\x4b\x98\x54\x14\x53\x72\x76\x17\xbc\x63\x18\xed\x9e\xd7\x29\x3c\x54\xb4\x30\x51\xa3\x19\x87\x46\xf9\xc8\xc0\x0c\x07\xf6\xb1\x33\x89\x80\x0f\x7f\x67\x68\xf2\x5b\xc6\x54\x8f\xdf\x20\x03\x86\x21\xc6\xe0\xb1\xb7\xc7\xfe\x16\xcc\x9c\x37\xb9\xd0\x77\xd2\xdd\x0b\xab\xd7\xf9\x1b\x42\xbe\x3e\x93\xc6\x2b\x58\x84\x12\x0f\x64\x0e\x1d\x3a\xe3\x96\x80\x90\x35\xab\x04\xa6\x2b\xf8\xaf\x3b\x9f\x60\x31\x57\xb2\x7a\x70\x96\xc9\xe4\xbc\x7f\x93\xf1\x37\xef\x87\x19\x9f\x0c\x26\xfd\xf3\x23\x17\x58\x50\x11\x53\x27\xcc\xab\x78\x34\x2f\x6e\x9c\xb0\x61\xf1\x5f\x71\xf0\x9d\x9c\xcd\x85\xa9\x8e\x78\x83\xcb\xc0\x61\x8a\x1f\xef\x54\x51\xd8\xcf\x13\xe5\x4f\xa8\x28\x8c\x29\xd5\xe3\xef\xa5\x15\xbf\xb0\x53\x63\x8a\x24\xe9\x05\x9f\xb8\x9c\xd3\xb0\x43\xbf\xfe\x56\xc0\x09\xf1\xf1\xab\x95\xd4\x73\x44\x1e\xf5\xe8\xbc\xcc\xfe\xb2\x22\xd2\xbd\x83\x76\x49\x97\xc5\x47\xde\x87\x47\x5b\xdb\x02\xd9\xcd\x91\x35\x16\xf9\x17\x52\x67\xcb\xe1\x01\x76\xd5\x76\xa0\x3c\x47\x0d\x44\xfc\x56\x2d\x2b\x74\x04\xc9\x8d\x25\x87\x33\x16\x5d\x50\x78\xf6\xc0\x4f\xbf\xe1\xb7\x93\xf3\xd0\x3d\xea\xf4\xa5\xdb\xdd\xdb\x49\x54\xea\xdc\x9f\x57\x20\x9f\x81\x66\x01\x07\x46\x69\x4a\xbe\xf8\x6b\x5d\x2a\xb3\x20\x17\xf0\x11\xc8\x89\xef\x8b\xba\x6c\xa1\xed\x21\xc3\x88\x17\x90\x1c\x16\xf6\x0b\xf5\xbe\x27\x0f\xcb\xb2\xc7\x3f\xe0\xe9\xb5\x22\xfc\xa9\xb3\xf2\x08\xb7\x60\x5d\xdc\xa2\x95\x01\xf2\xc4\x61\xc3\x63\xc3\x7e\xd1\xbd\x3f\x4e\xef\x3d\x9e\x2f\x36\xb1\x33\x18\x90\x32\xfa\xd8\x9d\x77\x8a\xf9\xfe\xdb\x1d\xeb\x10\x5f\x70\x98\xf8\x63\x87\xe9\x05\xfb\x59\x87\x89\x3f\x7a\x98\xd8\x23\x4b\xf8\x1d\x8c\x22\x90\x26\x2f\x7b\x7c\xec\xca\x1b\x1c\x24\xe7\x87\x90\xcc\x6e\x4f\xd4\x45\x70\x4d\x33\xc2\x35\xf1\x85\x77\xfc\xfd\xed\xf4\xb6\x7f\x75\xf5\x7d\x04\x66\x42\x59\x75\x0e\x99\x26\x60\x9b\x64\x21\x9d\x6e\x74\x79\x39\x18\x4f\x42\xb6\x23\xe4\x64\x62\xab\xd3\xfe\x5f\x20\x03\x94\x8f\x07\x37\xe3\xc1\x64\x70\x3d\xc5\x64\x4f\x3e\x1a\x37\x6a\x3b\x1d\x84\x0d\x3f\x1f\x5d\x9f\x0f\xc6\xd7\xc3\xeb\xb7\x7e\xc0\xcc\xd5\x94\x66\x01\xcb\x66\x32\xed\x4f\x6f\xa7\x50\x8d\x18\x95\x0e\xc6\x18\x37\x1e\x29\x07\x2a\x28\xe1\xbb\x19\x4b\x3f\x3a\x1d\x4e\xaf\x06\x99\xaf\x2b\x1d\xba\x5a\xc5\xa7\x8a\x4a\x33\x7e\x3d\xba\x1e\x5e\x5f\x8e\x87\xd7\x6f\xa1\x1a\x33\x63\x23\xcc\xdf\xec\xbf\x99\x0c\x28\x31\xf0\xaa\x0f\xd8\x41\x1e\x2a\x04\x71\x6a\x26\x19\x47\x18\x93\x73\xaa\x89\x04\x38\x92\x81\x7f\x8b\x06\x60\xa3\x4b\x3e\x18\x8f\x47\xe3\x89\x2f\xb0\xb4\x4f\x5f\x8f\xa6\x90\x96\x3a\xfa\x6e\x30\xee\xbf\xb9\x1a\xf4\xf8\x64\xf4\x7e\xc0\xff\x7c\x3b\x1e\x4e\x2e\x86\xe7\x48\xdb\x8b\x11\x66\xf2\x5e\x5d\x8d\x3e\x40\x0d\xe4\xe0\x9f\xcf\xaf\x6e\x27\x94\xc2\xd8\x51\x91\xcb\x27\x23\x4c\x63\x0c\x0f\xbe\xef\x7f\x8f\x83\xdc\xdc\x5c\x7d\x4f\x58\x32\x08\xa4\x7c\x15\x8a\x48\x0a\x6b\x4a\x50\x29\x83\xc7\x41\x4a\x91\x93\xf6\x63\xe6\x64\x2c\xae\xc4\x05\xa0\x1c\x7f\xa0\x5a\x28\x36\x54\x7f\x8a\xc9\xc7\x54\x85\xea\xea\x6f\x5d\x85\x2d\x8b\xca\x6e\xd3\xfa\xda\x8c\xdf\xdc\x5e\x0f\x21\x91\x76\x34\x0e\x85\xb8\xfb\x21\x6d\xd2\x5c\xd6\xa4\xe6\xd4\x9f\x48\x2a\x37\xf5\x73\xfe\x02\x0c\x18\xd6\xc2\x80\xb1\x97\xf6\x9b\x1e\x9f\x12\xac\xb9\x2a\x34\xc4\x27\xa7\x2d\x17\xdd\x23\x4e\x40\x54\x6d\x3d\x32\x7a\x0a\x48\xcd\xc0\xd7\x6f\xc5\xf7\xac\x84\xf6\x45\xb3\x07\x10\xde\xc4\xf8\xf6\x85\x3e\x3c\x9b\x37\x3e\x27\x4a\x49\xc3\xda\xe0\xee\x5f\x62\xd9\xa3\x13\xeb\xfb\x04\xee\x9d\x79\x97\xb8\x57\xfa\xbf\x10\xf8\x3d\x78\x49\xa8\x4d\xa0\x9f\x2a\x8b\xa6\xba\x1f\x06\xde\x79\x47\x0a\xe3\xc3\xce\xa6\x17\xf5\x43\xc9\xf8\x59\xc6\x5e\x66\xfc\xeb\x8c\x7f\x83\xfe\xd5\x3f\xe1\xd4\x4c\x5d\xde\xbb\x46\xa3\x55\xd8\xb0\xee\xe4\xd1\x46\x2e\x0e\x7a\x11\xbb\x32\x72\xd0\xaa\x6d\xc6\xbf\xc9\xff\xc3\xd2\xc4\x1a\xfe\xa5\x89\x35\xce\x76\xb2\xe4\x3f\x82\x64\x28\xbb\x68\x68\xba\xee\xac\x49\x6a\xc3\xd9\xad\x0a\x78\x6d\xb3\x94\xd6\xc6\x91\xcd\x84\x40\x0f\x6b\xc7\x7c\xc4\x02\x0f\x12\xd8\xc8\xa6\x2a\xb6\x6d\x44\x79\x74\xd5\x60\x5e\x55\xa5\x36\x32\x32\xfc\xdc\x19\x60\xbe\xe7\x37\x6c\x2d\x24\x90\x79\x6c\x3a\x88\xd9\xda\x29\x02\x72\x8a\xaa\xd6\x8b\x52\xec\x52\xd7\xed\x61\x9c\xae\xca\x92\x60\x8a\xab\x49\xcb\xa8\xcb\x66\x0c\xfd\x3f\x93\x99\x27\xfc\x13\x3d\x31\x8f\xb2\x0e\x50\x67\x05\xe7\x4b\x57\x4a\xd7\xd2\x1f\x38\x00\x5d\xc6\x66\x61\xd8\x16\xdd\x75\xea\x08\x1d\x0c\x42\x46\x13\xf6\x85\x01\x6e\xf0\xa7\x1e\x7f\xaf\xcc\x5c\xe6\x39\xa2\x73\x03\x3f\x08\xe0\xf5\xdf\x77\x37\x18\x7d\x22\x24\x8c\x61\xa7\x34\xd7\x29\x4b\xd3\x07\x5d\xe6\x67\x91\x06\x23\x22\x1c\xfb\x38\x76\x5b\x04\x4c\x0d\xd6\x99\x67\x26\x4c\xe7\xb9\x26\x57\x72\x47\x27\x09\xb8\x35\xbf\x70\x9d\x6d\x2f\x0a\xfb\xf9\xeb\x4a\x7d\x1c\xbf\xc5\x02\x11\x1e\x94\x9a\xba\xdf\x2b\xd3\xc1\x3c\x30\x3f\xf1\x71\xf4\x6e\x7f\xdf\x59\x2e\x76\xd0\x5d\x2e\x94\xa4\x0a\x3c\x6b\x76\x66\x01\xd6\xda\x81\xf2\x4b\x11\xca\x2c\x91\x18\x96\x45\x2e\x20\xde\xc3\x9e\x48\x54\x71\x25\xa4\xae\x93\x80\xa0\x96\x46\x98\x6b\xd3\x80\xf5\x67\x1e\x0c\x9f\x72\xdc\xc3\x7a\x7d\x01\x34\x74\xa2\xd8\x84\x1c\x22\xf2\xd9\x38\x17\xa0\x4f\x79\x62\x49\xaa\x54\x18\x08\x69\x04\xf7\x2b\x90\x08\x5d\xda\xd7\x05\xb6\x48\xc7\x82\xdb\x3d\x84\xf6\x13\x59\xd8\x99\x2e\xf8\x4e\x60\x4b\x2a\xbd\xe0\xba\x20\x61\x89\xe8\xce\x6e\x5f\x63\xe7\x20\x3c\x5d\x52\x93\x3e\x40\xd8\x8d\x2a\xbb\x01\x63\xc5\x01\x5a\x52\xbf\x90\x88\x50\x0f\xe4\x86\xc4\x72\xed\x45\xd4\x44\xaa\x35\x2a\xa6\x43\x27\xda\x40\x9c\x2d\x5f\x85\x6e\x85\xa1\xfd\xc0\x4c\x56\x3b\x49\xfd\x48\x7d\x53\x16\x55\xad\x59\x48\x37\x0e\xf7\xd8\x37\x0e\xb6\x02\x87\x3a\x84\x50\x6b\x07\x3c\x6e\x4e\x66\x98\xa8\xc3\x81\xc1\x3c\xd9\xc4\xce\x68\x66\x34\x87\x4f\x00\xdf\xf6\xe1\x5f\xfc\x4e\x70\xcd\x5a\xaa\x31\x4a\xef\x9f\x81\x9d\x3a\x7b\xc0\xa6\x52\xd4\x43\xd0\x5a\x52\x6e\x13\x29\xf6\x97\x62\xfe\x40\xa6\x41\xb1\xd9\xd4\x9a\x52\xe8\x98\x53\x37\x1a\x94\x73\x11\xaf\x59\xdc\xdb\x93\x8e\x35\x9c\xc0\x1a\x04\xad\x07\xc8\x71\xcb\x75\x46\x62\x92\xc4\x6c\x87\x67\xac\x55\x8a\x47\x35\xe6\x22\x6c\x74\xfb\x2a\xd9\xd3\x9c\xf6\x12\xde\xad\x45\x65\x0a\x90\x80\x7b\x02\x39\x90\x9d\xc4\x5b\x9f\x8b\x8b\x23\x42\x29\x3a\xe8\x77\x88\xe0\x4b\xce\x78\xa4\x12\x16\x70\x57\x6b\x59\x94\xa1\x4a\x9d\x4a\xad\xa3\x39\x74\x40\xa7\xb1\x18\x20\x5b\x3f\x38\x4c\xd6\xa8\x58\x3d\x54\xb0\xfb\xe3\xeb\x4a\xd7\xfd\x27\x28\x8d\xba\xb1\x46\x47\x23\x87\xd1\xdb\xd4\x56\x28\x99\xaf\x94\xab\x02\xfe\xb5\x2b\xf8\xe1\xd9\x91\xcf\x1b\x30\x10\x8a\x69\x51\x66\x9d\x34\x56\x72\xed\x5a\xa1\x79\x30\xc4\x4d\x89\x7d\xfb\x3d\x0d\x21\x75\xe6\x19\x2a\xe8\xa1\x22\xa4\x4f\x02\x78\x6d\xd4\x24\xa3\x58\xfa\xf7\x7b\x8c\x11\x32\x94\x53\xd3\x5c\x36\x62\x54\x8e\x42\x89\xef\x51\x35\x39\xb9\x0c\x5c\x97\x69\xe7\xb3\x09\xfd\xbc\x83\x3a\x72\x7e\x7e\x73\x95\x71\x4d\x40\xd5\xb8\xaf\xb0\xfd\xae\x09\x7a\x55\x8a\x85\xdc\x88\xf2\x8e\x1f\x34\xa9\x71\xc0\x68\xb3\xa1\x02\xc5\x72\x33\xff\x6c\x51\xf2\xbc\x58\x15\x76\x7a\x1d\xa7\x2b\x5c\x8e\x04\x3c\xca\xf1\xc5\xae\xb7\xb0\x51\x55\x00\x6d\xaf\x9d\x86\x84\xac\xb1\xa1\x87\xb7\x6e\xd0\x57\xf6\x6b\xfa\x78\x5e\x97\x25\x00\x49\xf8\x89\xd6\x46\xac\x08\x9d\x38\x57\x1a\x4a\xca\x7c\xee\xae\x87\xc4\x66\x05\x56\xbc\xed\xe4\xcc\xa8\x4a\xa6\x21\x5d\x08\x92\x8b\x7b\xa1\x72\x94\xa6\xd6\x30\x72\xbd\x87\xdb\x68\xeb\x1d\x97\x9b\xbe\x06\x79\x39\xe0\xb0\xb1\x7a\x25\x22\xa2\xcd\xe9\xd9\x39\x11\xa1\x28\x57\xcf\x7e\xab\x62\xfb\xde\xb3\xd1\xc5\xf9\xf1\x9b\x87\xe3\xd3\xde\xc9\x6f\x04\xff\xf3\x44\xfd\xf7\x8b\xaf\x3b\xf0\x3f\x4f\x4f\xfe\xa8\xff\xfe\x5d\x7e\xfe\xd3\x7f\x62\x6c\x74\x71\x1e\xa7\x79\x05\x0b\x08\x8f\xc6\x11\xff\x4f\xf6\xa9\x9b\x52\x8a\x8d\x55\x14\x21\x93\x65\xb4\x95\x9a\x5f\x88\x4a\x74\x15\x8e\xc7\x0a\x68\x50\x8d\x83\x56\xe1\xc3\x24\x55\x81\x50\x38\xae\xcb\x7a\x01\xf0\x33\xf9\x03\xa0\x78\xcb\x00\xa0\x69\x99\x25\xb2\x26\x65\xe0\xab\x33\x6b\x47\x3a\x7f\x6d\xa1\xf3\x07\xd7\xa3\x20\x0e\x4e\x27\xed\xb8\x8d\xac\xb8\xe5\x3f\x51\xe2\xc9\x8b\x1e\x63\x6e\x30\x03\xcd\xb3\x29\x4b\x8e\x0b\x6c\x6e\x72\x2f\x4a\xf0\x3b\x5b\x99\xfd\xb0\xc5\xd2\x4e\x07\x53\x73\xa8\x10\x30\x05\x2b\x05\xee\x95\xa9\x45\xee\xb1\x31\x5c\x2f\x46\xc0\x33\x81\xb6\x64\x11\x6c\xe0\x82\x3e\x89\x1d\x5f\xa9\x3f\xd1\x91\x6f\xdf\x18\xcb\x2f\xec\x0b\xb4\x2a\xee\x65\xa9\x4d\xec\xb7\x81\xa8\x02\x04\x6c\xfd\x60\xa8\x6c\x56\xe4\xba\xd6\xd4\xc1\x63\x99\x3c\xc5\x62\x97\x7b\xd0\x9c\x90\x1b\x55\xae\xa3\x9b\x07\xb3\xf7\x24\x0f\xd6\xcd\x0a\x5d\xf7\xc0\x6e\x5d\x72\x81\xef\x4d\x46\xd2\xca\x7d\xbd\xc7\xd8\xc4\x23\xc7\x37\xa7\x25\x22\x3a\x38\x67\x84\xdb\x58\x07\xb6\x48\xfd\xcc\x21\x86\x82\x6a\x2f\x25\x0e\x84\x0a\x04\x6a\x33\xe1\xbc\x1c\x87\xae\x0a\xd6\xf9\xb7\x1d\xf2\x8c\xc9\x62\x39\x85\xee\x01\xcc\x35\xc8\xbc\x3b\x7c\xee\x6b\xb4\x9e\xc1\x5c\x7c\x2b\x1e\x7b\x96\x22\xba\xc7\x41\x79\xdc\x58\x07\x5e\x64\xc2\x36\x3e\x50\x62\x08\xc1\xd6\x84\x96\xc9\x96\xd4\xe8\x94\x82\xae\x41\xa6\xce\x2b\xd7\x56\x9e\xd0\x81\x40\x25\xc6\x56\x31\xc9\x7a\x67\xb8\x3b\x8b\x02\x41\x39\x2b\x75\x8f\xde\x29\xec\x1a\x09\x34\x42\x1b\x2a\x31\x14\x8f\xe1\x07\x6f\xad\xd7\x50\x3a\xea\x98\x11\x8b\xca\xaa\x7b\x9d\x7f\xb4\x97\xd7\x12\x16\x2b\x21\xcc\xb7\x54\x8f\x7e\x12\x17\xa4\x83\x08\x17\x5b\x6b\x50\xc3\x9a\x3f\x14\xe5\xc2\x30\x16\x97\xa8\xbb\x93\x78\xc0\x8f\xf9\x7b\xaa\x04\x8c\xef\x74\xbb\xaa\x3c\xea\xf9\xce\x42\x95\x37\x1a\x61\x71\x4f\xfb\x85\xbf\xc9\x49\xb5\x38\xe9\x43\xee\xe0\x26\xa5\xe3\xec\xe7\x96\x8e\xa7\x89\x78\x7e\xd2\x56\x25\x61\x4f\x94\x15\xbb\x87\x7b\x40\x0f\x7d\x2f\x1f\x2c\x09\xfa\x06\x9b\x78\xcc\x32\xca\x27\xba\x35\x4e\x4b\x8d\x6e\x76\xd7\x38\xf6\xd8\xb2\xf8\xb9\xb4\x37\x7e\xd7\x34\xc9\xbe\xd9\x09\xaa\xcf\x95\x90\x3a\x61\x67\x70\x03\xe8\x5e\xde\x3a\x06\x8b\x2c\x69\x66\xd6\xe0\x23\xe8\x03\xea\x5a\x1d\xc7\xb5\x59\xcd\xdc\xe7\xbb\xb8\x44\x60\x68\x1e\x24\xe6\x71\xd5\x32\x40\xd6\xfa\x2e\x4c\x18\x72\xab\x64\xc9\xb5\xac\x76\xae\x82\x15\xd5\x21\xbd\x82\xa4\x09\xa4\x8f\xe0\x37\x58\xfc\xb6\xa0\xd0\x1d\x46\x2a\x35\x55\x6c\x2d\x31\xeb\x54\x24\x4d\xae\xa3\xb9\xb3\xce\xb9\xf3\x62\x3e\xaf\x4b\x43\x1b\x54\x61\xb5\x2a\x62\xb3\xa5\xfc\x34\x3a\xaf\xbe\xd7\x96\xef\x2d\x92\xb6\xa8\xce\x58\x7c\x44\xa9\x52\xbf\x85\x1e\xec\x0e\xa0\x03\x33\x88\xa7\x9b\x76\xb1\x63\x8f\x71\x77\x6a\x1c\x37\x93\x7c\x29\xe6\x60\x7e\x02\x17\xf3\x6d\x2c\x1d\x6f\x24\xc9\xc5\x22\xc9\xc5\x83\xe4\xaa\xe4\xc7\x2a\xf3\xb5\xe9\x40\x8e\xf8\xd2\xf6\x1b\x57\xd0\xaf\xe1\x10\xf3\x4e\x89\x0f\x3a\xbc\x01\x4a\x73\xc1\xb6\x5a\xa2\x52\x73\x4c\x9d\xab\xd6\x84\x44\x61\x0f\xa3\xab\xe3\xf5\xb1\x60\xcc\xc3\x85\x2e\x90\xb3\x07\xf4\xdc\x96\x85\x56\xf3\x88\x72\xf6\xb2\xb0\x3d\x85\xda\x1d\x4e\x74\xbf\x04\x7e\x01\x01\x52\x75\x1f\x71\x20\xff\x2b\xfe\xea\xeb\x67\xaf\x9e\x0d\xce\x1d\x61\x07\x75\x59\x6c\xa5\xd0\xfc\x46\x94\xb9\x12\x60\xbf\x53\xd3\x11\x5c\x6c\xad\xe7\x2a\xb7\xff\x3c\x3d\xe5\xef\x45\x39\x5f\xf3\xd3\x57\xaf\xbe\x76\xfe\x3e\x34\x91\x23\x21\x52\x2c\x03\x97\xca\xa0\x36\x6f\x83\xc1\xdb\x02\x10\x83\xe7\x52\x2e\xa0\x72\x21\xcc\x16\xa2\xf7\x61\xa6\x01\x58\xbd\xce\x2b\x5f\x44\x0c\x73\x59\x8b\xad\xbd\x38\xc3\xe1\x90\x1f\x1e\x98\x5a\xa1\x59\xad\xcc\xc1\x11\x0b\x75\x7d\xc9\x69\x09\xcb\x3e\x8c\xa6\x82\x58\xea\x78\x8f\xa0\x59\x25\xe6\xba\x02\x94\x07\x38\x98\xcd\x91\xeb\xc4\x9f\x1c\xfa\xc1\xc7\xca\xdd\x6d\x3b\xc4\x58\x1e\x43\x4a\xa4\x49\xc2\x0b\xd8\xca\x0f\x98\xc7\x24\xf4\xdb\x61\x8e\x6d\xc5\x27\x08\x4c\xb2\x9d\xcc\x73\xc0\xb4\xd0\x0f\x1e\xa9\xce\xd9\xcf\xde\xf6\x52\xae\xf5\x68\x2e\xef\x85\xae\x58\x1c\x52\xa7\xa3\xe1\xa3\xf4\x27\xbd\x17\x40\xdf\xf6\xed\x0f\x44\x0e\x9a\x49\x13\x96\x23\x55\xb6\xdc\xf2\xb1\x93\x7f\x8c\xb9\x01\x28\x15\xee\xbf\x63\xdc\x8d\x14\x35\x32\xc1\xc3\x08\x88\x91\xac\x83\xd9\x02\x37\x8b\x48\xc6\xbb\x48\x46\x2e\x2a\x37\x2f\x28\x77\x62\xe4\x44\x0a\x45\x96\x99\xdf\x2a\x4c\x53\xf6\x3b\xe5\x04\x4f\xf7\x26\xc1\x17\x59\xe3\x8b\x78\xb9\xb5\xdc\x25\xe2\x2d\x1c\x85\x58\xca\x4b\xb0\xe3\x85\xa6\xae\xa6\x95\xdc\x6c\x8b\x12\xca\x50\x63\x96\x9d\xe7\x5f\x76\x3c\xb0\x4e\x33\xd4\xa9\xd6\x1b\xe7\xeb\xa3\xbc\x6c\xef\xce\x83\x32\x0c\xc6\x1c\x12\x41\x43\xf1\x68\x1b\x27\xb0\xb5\x06\xdb\x6e\x06\xe3\xa5\x58\xfa\x24\xb4\x7a\xbe\x66\x22\x4e\x76\x85\x4c\x88\xe4\xc6\x1a\x6a\x70\x9a\xd8\x3c\x5e\x17\x0d\xb3\x29\xca\x94\x42\x28\x87\x5b\xe8\x19\x7e\xf0\x36\xa3\x6b\xa2\x74\x1c\xe0\x10\xf1\x69\xd6\xa2\xaa\x4b\x74\xa5\x11\x47\x22\x2c\x4f\x4b\x67\xd7\x8c\xce\x35\x12\xf0\x75\x07\xac\x28\xe3\x32\x04\x18\x3a\x96\xb9\xf6\x0b\x04\xbc\xe2\x95\x6e\xa1\x51\xb6\x24\x46\x51\x87\x68\x61\x28\x5a\x8e\x9a\x8c\xac\xfe\x92\x33\xd8\x3c\x09\xec\x10\xf3\x86\x8c\x04\x06\xec\x45\xc4\x7f\xab\x65\xf9\x70\xe4\x38\x64\x22\xb3\x1f\x53\xa8\x62\x65\xf4\x29\x8d\x0a\x88\x42\x91\x24\x4b\x0f\x82\xb6\x28\x68\x1f\x03\x28\xbd\xd0\xe4\x47\xa5\x1d\x84\x7c\x31\x57\x75\x62\x45\x1c\x38\xe2\x18\xa0\x08\xc0\xd3\x2f\x4f\xfe\x17\x04\x72\x40\x40\x92\xd2\xc7\x46\x8a\x1d\xa6\x0e\x63\x9e\x0f\x05\xb6\x23\x5b\xc0\xed\x85\x87\xdc\x74\x8e\x57\x02\x27\xf1\xba\x08\x99\x1e\x42\x57\x47\x76\x19\x29\xbf\x0e\x8b\x71\x37\x08\x45\xfd\x1d\x28\x5f\x9e\xf3\xa6\x8e\x47\xbc\xbb\xec\xe9\x1d\x73\x8b\x69\x26\xcc\x51\x6f\x77\x0e\xf5\xe2\xda\xce\x3c\x03\x9b\x4f\xe7\x4a\x47\x65\x60\x76\x3a\x28\xe3\xa3\xea\x7c\xbb\x86\xe8\xbb\xe1\xfc\x47\x7d\xdd\x40\x52\x38\x05\xe1\xbf\xd5\x02\xc1\x59\x0a\x7b\x54\x84\x03\xd0\x04\x1d\x74\xe6\xd2\x27\x8a\x25\xf0\x01\x2c\x12\x29\xe5\x16\xb3\xbf\xc0\xc2\xf3\x0a\x4d\x2c\xf9\x62\x76\x2a\x82\x91\x62\x1a\xcc\xcc\xb4\x28\x02\x51\x88\x4d\x51\x6b\x1f\xee\x78\x6a\x54\xc1\x9e\x14\x07\x8c\x1d\xdc\x92\xd2\xd6\x34\x33\xc8\x86\xd4\x56\xd7\xaa\x7c\xad\x4d\xd4\x21\x34\xee\xfb\x69\x77\xb5\xc9\xdf\x42\x0e\x5f\x1a\xef\x24\x5e\x1c\x8b\xb6\xd7\xa9\xb4\xec\xc0\x8f\x8d\xc3\xfb\x59\xe8\xd2\xde\x2c\x14\x49\x7f\x49\xf5\x24\x70\x4a\xb0\x68\x43\x6e\xb1\xf6\xa6\x85\x31\xdc\x10\xa8\x89\x6a\x11\x3a\xd7\x27\x8e\x92\xe0\x0f\xde\x8b\x9d\x50\x83\xa7\x02\x45\xa0\xcf\x61\xb0\xe3\xc1\x59\x45\x13\xc0\xee\x01\x00\x04\x05\x76\x4c\x3c\xfe\x4b\x30\x81\x78\x37\x26\x10\xfb\xf9\x98\x40\x8d\xf5\x07\x5c\x20\xf6\x8b\x71\x81\xda\xd3\x66\x5f\x88\x0b\xc4\x39\x7a\x06\xbc\x57\x4c\xe9\x55\x8d\x1d\x47\x03\xb4\xc5\x36\x07\xa1\x65\x77\xf6\x5e\xcd\x11\x82\x4c\xe0\xcb\x67\xbd\x13\xfe\x01\xa3\x1c\x49\x2c\xd3\x3e\x42\x0f\x9c\xf6\xf8\x15\xc8\x3a\xca\x97\x68\x01\x30\xa7\xd1\x3c\x45\xfe\x0c\xce\xb9\xb0\xc6\x7f\x24\xf5\x3b\x33\x62\xc0\xd7\x26\xd5\x6a\x3d\x2b\xea\x32\x6c\x61\x8c\xd6\x92\x0c\x92\x08\x71\xb8\x41\x70\x29\xdc\xe3\xf3\x1e\xef\xef\xd1\x15\x7c\x04\x16\x0a\x8d\x28\x79\x2b\x0a\x14\x9d\xf5\xce\x68\xa5\xb4\x1d\xe4\x08\x6a\x05\x7a\xef\x9d\x32\x91\xc7\x4f\x37\x6c\x82\x8c\xf9\x68\x1d\x62\x5b\xf8\x44\x56\x8c\xc4\xc4\x2c\xa1\x8b\x00\xcd\xf1\x7a\x64\x3d\xbb\xde\xc0\x3e\x14\xe5\x4d\x07\xcb\x25\x22\xcc\x2c\xe9\x8a\x91\x5b\x57\x76\x56\x57\xa1\x82\x66\xee\x3d\x78\xd1\x8c\x9c\x4b\x34\x52\x4e\x83\xb8\x6b\x1a\xee\x3d\x3e\x91\xd2\xd9\x05\xec\xac\xf7\x02\xbc\x97\xd8\xbe\xd6\x44\xeb\x06\xe0\x24\xf0\x03\x1b\xbf\x15\x49\xce\x2e\xce\x0c\x34\xc9\x3b\x89\x7e\x68\x98\xdd\xb7\xe9\xa6\x5b\xb6\x00\x2a\x98\x99\xaf\xe5\x46\x44\x3d\xba\xe1\x06\x54\x65\x0d\x48\x7b\xa9\xbd\x80\xc6\x66\xb9\x12\xba\x61\x47\xa5\x86\xc8\xdc\x2a\x9a\xb9\x29\x92\xfb\xe3\xbf\x0c\x30\x67\x58\x71\x52\x91\xbd\xb4\x90\x1f\x5d\x29\x15\x78\x08\xa4\xae\x4a\x34\xc3\x8b\xba\xda\xd6\x15\x37\x6b\x29\x2b\xf3\xda\x1f\xb8\x4b\x25\xf3\x05\x78\x4b\x41\xe7\xf4\x14\x36\x55\x51\x86\x32\x6c\xf7\xc9\xd7\x90\x7e\xd3\x90\x18\xad\x5f\x60\xd1\x3c\x64\x68\x2c\x3a\x84\x5e\xdb\x88\x64\x8f\x1a\x91\x7b\x2c\xa2\xe6\x47\x81\x56\xdb\x6d\xfe\xc0\x00\x66\x7c\xb7\xc6\xe4\x06\x5f\x20\xd9\x71\x9e\xc2\x91\xe9\x1c\x2c\x37\x05\xc3\x6e\xf4\x6e\xb0\x70\x02\x45\x29\x09\xdc\x60\x11\x15\xdf\x7a\xf5\xd2\xda\x08\xa5\xe4\x1e\xdc\xcc\xb2\x84\xd4\x6f\xe2\x7d\x75\x3b\x70\xed\xa0\x37\x2d\xea\x51\xdf\xc5\x9d\x88\xb5\xcc\xc1\x17\x87\x06\x07\x19\x86\x26\x35\x49\x1e\x63\x2d\x18\xd2\x07\x3f\x0c\x6b\x79\xa4\x86\x9a\x97\xb2\xaa\x4b\x8d\x5e\x6e\x70\x0d\xdb\x73\x8f\x2d\xc5\x1b\x08\x61\x50\x69\xa6\x29\x95\x07\x0b\xac\x85\xb1\x07\x2d\x4f\xfa\x1d\x25\x20\x80\x67\xbd\xe7\x8e\xc6\x91\x73\xbb\xd7\x4e\x67\xf5\x1c\x01\x77\x00\x2e\x1f\xb9\x10\x5d\x63\x5d\xdf\x0f\x09\xd2\x32\x50\x85\x2d\x4a\x56\x6c\x65\xd9\x79\xa7\xf0\xf4\x76\x7f\x05\xab\x39\x30\x17\x82\x5c\x70\x2d\xae\x53\x94\x8d\xe1\xdc\x6e\x3c\x35\xa4\x8f\x4f\x98\x66\x51\x61\x4a\x7e\x06\xec\x6a\x4c\xf8\x8f\x60\x20\x54\x45\x62\x92\xb7\x59\x70\xc4\x62\x15\xf4\xf1\xa0\xea\x3d\xff\x56\xbb\x01\x55\x60\x5d\x2e\x52\xed\x23\x0c\x71\x54\x22\x46\x74\x8a\x7a\x97\x21\x7d\xb2\x66\x1c\x25\x73\x91\x16\x8c\xba\x80\x2a\x84\xba\xb7\x1b\xcd\x65\x44\xb2\x47\x28\x45\xc2\xe6\x30\x32\xaf\x5a\xcc\xa5\x8c\xa5\xe8\x11\x53\x09\x34\xe3\xbe\x65\xef\x73\xbb\x72\xb5\xc4\x63\x54\x68\x26\x22\xc7\xcc\x92\x7c\xa9\x0d\xe7\x67\x13\x46\xc9\xdf\xdd\xe8\x94\x3a\x91\x48\x11\xa5\xb0\x3d\x14\x56\x44\xf9\x80\x1e\xdd\x28\x87\xb9\xd8\xe9\x00\x96\xeb\x32\x8e\xd1\xa5\xac\x25\xb3\x9a\x54\x1e\xf2\x08\x81\x62\xa0\xe8\xe7\x79\xa3\x1c\xdf\x9f\x5b\xfc\x1e\x5e\xbb\xe7\xbd\x13\x47\x3f\x4a\x41\x64\xec\x79\xef\xf4\x97\x61\x01\x26\xdc\x04\x81\x00\x19\xe5\x13\x7d\x39\x16\x20\x25\xb8\x5a\xfe\x76\x68\xe5\x6c\x00\x5a\x61\xce\xa7\xf7\x2a\x01\xfe\xbb\x35\x0d\xf1\xd7\x95\xe9\x9c\x72\x4e\xf6\xa8\x27\x07\xee\x4f\xd0\x76\xe5\x47\xfb\x9a\xaa\xa0\xf4\x06\xa5\x6d\x54\x62\x53\x3b\x91\xbc\x28\x08\x0f\x81\x20\x50\xac\x15\x0d\x32\xb4\x58\x72\xab\x91\x88\xfb\xa2\x2e\x7b\x7c\x9a\x62\xe2\x14\xe4\xf4\x26\xa4\x42\xe7\xd1\x4c\x14\x0e\x20\xac\xf9\x72\xc0\x39\xb6\x17\x70\xce\xc7\x56\xc2\xe9\x5f\xd6\x56\x09\xc1\xc3\x30\x6d\x57\x09\xc0\x79\x4a\xc2\xd6\xa8\x25\xfe\x1d\xbe\xdf\x58\x6c\x7b\x6e\x14\xeb\xd1\x98\x38\x83\xc3\x74\x78\x6d\xc2\xb3\xf3\xf4\xd9\x0e\x77\x0d\x41\x0a\xc6\x4f\x05\x2f\x24\xb2\x23\xf2\x4f\xc6\x88\xc6\x26\x75\x2c\xba\xca\x5d\xfd\xc0\x10\xbc\x00\x30\x8c\x69\x69\x4a\xc3\x7a\xe2\xa4\x37\x3a\x6e\x5d\x53\x07\x62\x18\xca\xef\x63\xfb\xe6\x8c\xd2\xdc\x6a\x1f\x49\xdf\xc6\x24\x4b\x31\x0b\xe8\x0a\xb9\xd4\x58\x97\xd7\xf4\xd6\x38\x8e\xeb\xea\xc8\x58\xea\xbd\xd9\xb3\x48\xfe\x25\x8b\x64\xfb\x17\x99\xac\x71\xdf\xbe\x38\xee\x73\xc6\xcf\xdb\x35\x77\xa0\x30\x3f\x5e\xa9\x88\xa7\xf0\xba\xd0\xc7\x3b\xa1\xee\x49\x1b\xda\x3f\xd0\x50\x53\xc5\x46\xa2\xc8\x7b\x30\x6a\x56\xc5\x45\x0b\x14\xed\x8a\xaa\x0c\x7d\xb8\x52\x3f\x70\xdf\xf2\x05\x13\x15\x1b\xdf\xb4\xa4\xc1\xaf\x5a\x55\x91\x02\xc4\x98\x1b\xdc\xe0\x8f\x8f\xd5\x4e\x46\xb3\xc0\x22\xf4\x76\x35\xad\xb7\xc9\xd3\x82\x9c\xc6\xf5\x6d\x3b\x18\x50\xd7\xf9\xf0\x2b\x10\x0d\xee\xef\xaf\x45\x34\xfa\x2a\xa3\xfc\x8f\x4e\x8a\xc1\x2f\x9f\xa2\x17\x4f\xe9\xc5\xfe\x6e\x7a\xd9\x9b\x91\x81\x36\xf7\x5d\x91\xd7\x1a\x2a\x27\x5b\xa4\x9a\xee\x99\xe7\x7e\xf2\x84\xb6\x4b\x8d\x9a\x58\xdf\x70\xd4\x5a\x2b\x55\xc8\xed\xf4\xc3\x63\x05\xbf\x74\x48\xfb\x21\x97\xc1\x1e\x3d\x2a\x9b\xc5\x42\x98\xc5\x46\x69\x65\x2a\x59\x1a\x7e\xdf\x98\x7b\x20\xb9\xc9\xa0\x0a\x17\xde\xa0\xd7\x33\x2c\xca\xfe\x7b\xc8\x06\x00\xc3\xcf\x83\x44\x69\x16\x03\x35\xe2\x1b\xc1\x99\x06\x9a\x46\xb6\xaf\x12\x08\x42\xc9\x2d\x9f\x74\x62\x1e\xab\xa8\x0b\x35\xbf\xc6\x8e\xa7\xce\x71\x14\x2b\xb8\x6c\x26\xf9\xa6\xce\x2b\xb5\xcd\xe5\xb1\xf3\x52\xf8\x5c\x9e\xef\x93\xb4\x9d\xb5\xe4\xf3\x75\xa1\x90\xff\x60\xc8\x42\x50\x67\x59\x75\x2f\x99\xaf\x32\x43\xcd\x23\xf5\x39\x04\x45\x2a\x0e\x49\x66\xa8\xa0\x35\x72\x9b\xd8\xd3\xe8\xaa\x51\x87\x6d\xce\xf9\x8b\xde\x89\xd5\x41\x23\x8d\xec\xd6\x48\xc6\x5e\xf4\x4e\xbb\x84\x79\x07\x2a\xaa\x1d\x32\x85\x45\x8d\x6b\xa2\xa1\x2e\x19\x52\x6e\x1f\x7c\x50\xa1\xda\xd3\x40\x9a\x0c\x3f\xa7\x3c\x41\x07\x5d\x2b\x69\xad\xd4\x8f\x1e\x6b\x42\xe0\x51\x60\x15\x21\x07\x97\x42\xe5\x90\x12\x08\xe3\x43\x4a\x0f\xc2\xfa\x44\x19\xc0\x3e\xfb\x80\x6a\x2c\xac\x46\x5e\x61\x5d\x14\xf6\xd8\x3d\xb3\xbb\xae\xe6\xc0\xc1\x70\x58\x17\xb0\xa1\x4c\x95\x56\x6c\xa8\x5b\x8e\x01\x60\xe6\xcf\x4a\xb7\x01\x7e\xa5\x3d\x0e\x51\xec\x60\xbc\x28\xec\xa9\xfa\x12\xd0\x40\x64\xd0\x43\x87\xa4\x17\x25\xb4\xa4\x98\x6f\x76\xd1\x8f\xa1\xea\x1d\xde\x8e\x87\x47\xac\x65\x4b\xda\x57\x3b\x43\x61\x41\x7f\x81\x38\x68\x33\x75\xa0\x28\x59\x97\xac\x8f\xd4\x06\xaf\xbb\x26\x8d\x01\x11\x9a\xfa\x2f\x31\xb2\x5c\xd3\xab\x98\xaa\xdf\x1e\xa3\x89\xb2\x1b\x1b\xb0\xa9\xac\x51\x13\x41\xca\x12\x22\x51\xa9\xca\x55\x50\x78\xc5\xba\x2a\xf8\x96\x72\xd0\x7d\xcd\x9e\x1b\x15\xfc\x2d\xa1\x63\x1a\xc0\x79\xb1\x45\x0d\x2f\x29\xf0\x75\x79\x1f\x5d\xb2\xb1\x89\xd7\x2d\x19\xcc\xb7\x85\x3e\x74\x31\x63\x11\xd1\x05\x02\x78\x45\xf9\x70\x44\xc9\x4b\x98\x02\xbb\x73\x29\x3c\xe8\x4e\xb4\x1f\xcf\x8b\x02\xc1\xc8\x00\xe6\xe5\x45\xef\x39\x1d\x69\xf8\x1d\xf2\x1f\x72\xdb\x1d\x7a\x0b\xd4\x69\xb9\x54\x37\xd4\x99\x35\xc5\x3a\x91\xe3\x08\x85\x28\x49\x93\x3d\xeb\xf1\x77\xae\xb0\x56\x21\xc4\x97\xbf\x45\xd6\xe0\x12\xac\x91\x8e\xd5\xc6\x80\xf4\xed\x2c\x3b\x3c\x1b\xe9\xac\x22\xbc\xa6\xb9\xc8\xed\x5e\x50\xc9\x14\xa4\xa6\xd9\xf3\x12\x47\xc9\x6b\x83\x32\x4b\xee\x4c\x46\xfe\x2a\x09\x3e\x09\x4c\x35\xc3\x70\x93\xab\xd3\x0c\xe9\xfb\xf2\x23\xe6\xb6\x90\x0e\x9c\xcc\x80\x0b\xe8\x74\x0d\xc3\x13\x41\xf9\x4e\x18\x86\xbd\x2f\xbb\x3c\x79\xd9\xbe\x78\xf2\x3e\x8e\xc1\xf6\x70\x0c\x74\x7e\x88\x8a\xce\x6e\x54\x5f\xd0\x25\x53\xc1\xf2\x02\x33\x8c\xa8\x8b\xaa\x47\xe0\xc7\x95\xfc\x48\x58\x45\xd6\x14\x33\xcb\x07\xb7\x0b\x69\x56\xcc\x8b\xde\xf3\x6f\x19\x18\x5f\x80\x10\x9a\x60\x4e\xd9\xa5\x5e\xf4\xa7\xfd\x37\xfd\xc9\x80\x5f\xf7\xdf\x0f\x82\xe3\xba\x59\x02\xe1\xbb\x7b\xec\xc9\x27\xef\x31\x96\x8e\x64\xd6\xee\xb0\x97\x12\x1a\xba\x47\x67\x22\x06\x4f\x4b\x1d\xa6\x7c\xfd\xb0\x95\x65\xae\xf4\x9d\xb3\x60\xfc\x3d\x6b\x3c\xdf\xe3\x07\x7b\xa6\x72\xe0\xbe\x4d\xfe\x1f\x16\x8d\xea\xce\xc4\xed\x78\x18\x0a\xdb\x3f\x56\x9d\x90\xbe\xfe\x25\x43\x75\x6e\x15\x73\xbc\x06\x2f\x01\x7d\x26\x0d\x6c\x09\x88\x43\x7f\xac\x42\xe9\x24\xb1\xa2\xdb\xf1\xf0\x2b\xe3\x69\xc0\x50\x28\xd3\xd6\xda\x9b\xff\x82\x3e\x4e\x76\x25\x76\x2e\x7d\x14\x88\x3a\x90\x22\xa9\x86\x65\xc1\x7a\x6c\x6a\x4c\x89\xa9\xfe\x94\x7f\x3d\x73\xa5\x61\x5d\xd2\x00\xfb\x98\x16\x5a\x72\x99\x27\xd9\xa7\xfb\x8a\x85\xc9\xe9\xb1\xb7\xa8\x36\x88\x9f\x28\x9b\x7e\x4f\x3d\x6d\x9a\x17\xe3\x61\xfa\x90\xdb\x01\xe8\x1d\x08\x84\xa5\xaf\x67\x45\xfd\xc5\xd7\x13\xcd\xe2\x7e\x98\x8a\xc2\xd6\x0d\x5d\x65\x56\x57\x9e\xf6\x54\x37\x1a\xbb\x27\xe1\x22\xdb\xbf\x83\xda\x88\xce\xcb\x18\xe1\x35\xec\x8d\x9b\x9d\x29\x72\xcb\xf3\x9b\x13\x44\xa4\xc6\x08\xd6\xbf\x89\x60\xc6\x22\x55\x76\x11\xb4\xf3\xd2\x67\x48\x11\xc7\xc4\xf9\x38\x90\x18\x40\xbf\x8c\xcf\x0e\xa2\xd2\xc2\x7e\xba\xca\xdc\x18\xed\x9e\xfb\x16\x24\x8f\xe2\xc9\xda\xcf\x2e\x97\xaa\xdc\xc8\x05\xeb\x64\x5b\x00\x2d\x73\xc2\xdf\x17\xa5\x8f\x43\x32\xf6\xb2\x77\x9a\xfc\x86\xdc\xe5\x86\x58\x14\xc5\x2f\x37\xd1\x13\xb1\x92\x12\x53\xbd\xb0\xba\x7c\x54\xa3\x47\xc5\x79\x08\x99\xd6\x95\xc8\x5c\x15\xbc\x08\xfe\x4d\x2b\x36\x37\xce\xd6\x62\x28\x8e\x83\xdc\xd8\x96\xf2\xaf\xf5\x42\x51\x27\x0f\x1c\xf3\x2b\xc3\xd7\x85\xb6\x74\xa5\xbe\x1c\x75\xd5\x91\xe0\xc7\x16\xb2\x2c\x56\x02\xcc\x5e\xff\x11\x74\x5c\x5c\x16\x0d\x1c\x20\x2c\x8a\x01\x25\x9b\x8a\x78\x97\x8d\xa5\x37\xcd\x4b\x91\xe7\x2c\x7e\xa2\x01\x5a\xe8\x8d\x97\xa6\x22\x47\x37\x6b\x59\xe7\xb9\x34\x15\x39\x22\x3d\x0f\x73\x89\x3a\xd0\x3c\x66\xc9\xf7\xfa\x24\x3b\xb2\x2c\x49\x71\x5d\xee\x59\x41\xe3\x0d\xbb\xfb\xa2\x99\xc8\x99\x7c\x82\x35\x54\xb9\x88\x04\x10\x7f\xc2\xbf\x5a\x96\x63\x8c\x2c\x2b\xba\x33\xd1\x07\x5b\xe1\x3c\x88\x88\x06\xf2\x71\xea\xe8\x6b\x8d\x8a\x84\x90\x5d\x14\xe2\x0d\x0a\xb1\x5f\x42\x21\x1f\xa6\x6b\xef\x3f\xc4\x0a\x9a\x67\xa0\x4c\xa3\x77\xe9\x7a\x61\xce\xec\x11\xe2\xda\xd5\xce\xb2\xf8\x2a\xd8\x43\x51\x4a\x88\xd8\x61\x6c\x21\x5e\x37\xc6\x25\x5c\x44\x4f\x40\x1e\x49\x2b\x2a\xdf\x63\xec\x06\xad\x78\xed\x4d\x6b\x53\x6c\x9a\x3e\x22\x72\x86\x63\xa5\x97\xf3\xc7\xef\x39\xd9\x8c\x4c\xee\x64\x0f\xec\x4c\x4d\x85\xb0\x29\x33\xa3\x4c\x47\x70\xd6\xee\x5b\xfb\xd3\xc8\x6d\xbe\xee\x9d\x60\x4f\xa7\x85\x14\x39\xf8\x46\xfd\x5b\xd8\x46\x0e\xe3\xf8\x10\xff\x6e\xd5\x17\x41\xfe\x88\x5c\x30\xf6\x35\x98\xd1\x9d\xb1\x47\xcc\x31\xe9\x62\xfd\xc8\x01\xbc\x0c\xb4\x0b\x89\xb2\x12\xf2\x07\x06\xb7\x92\xb0\x18\xd2\x78\xae\x3d\x52\xb1\xd6\x5b\x47\x6d\xe8\x3a\x0c\xb5\x8e\xbc\x2a\xe7\x9c\x77\x4b\x6c\xc9\xd1\x31\xc1\xbb\xb8\x94\x8f\x24\xe9\x6c\x19\xa2\x64\xe0\x00\x82\xc8\x4c\x48\xc5\x0f\x5e\xec\x65\x04\x27\xe6\x9a\x20\x66\xf1\x50\xf0\x40\xe8\x8e\xc8\x54\x9e\xd7\xa6\x2a\x23\x54\x53\x6b\xbb\x53\x3a\xb2\x99\x2b\x64\xdd\x73\xf0\x6e\x88\x72\xbe\xc6\xad\x79\x2c\x21\x8e\x2d\x03\xa6\xa3\x91\xf3\xba\x74\xd9\x7c\xda\xfb\xbd\x4a\xd4\x4e\xe0\xaa\x2d\x14\xa0\xea\x6d\xcb\x62\x2e\x17\x18\xf0\x98\xf5\x1a\x47\x24\x74\xe6\x4a\xd2\xb4\x21\x7b\x06\x64\xf4\xbc\x58\x69\x88\xb8\x44\x89\x6c\x10\x18\x21\x72\x33\xe8\x1b\x95\xb6\xd9\x4e\x2c\x5d\xca\xfb\x6e\xf5\xe2\xfa\xba\x77\xf6\xc5\x07\xad\x58\xda\xb7\x96\x75\x1e\x2a\x28\x89\x4e\xc0\x5d\x3c\x95\x64\x9a\x85\xc8\x3b\xb3\x10\x33\x2e\xef\x45\x5e\x83\xbd\x45\xe9\x91\x40\x34\xf0\x44\x32\x4c\x92\xa4\x5f\x64\x01\xc8\xd1\x6d\x6c\x77\xcd\xff\xdc\x9b\xa1\x9d\xfa\xca\x61\xe4\x5f\x4a\xee\x5e\x2b\xae\x9e\x71\x13\x12\x76\xf8\x59\xef\xc5\x11\x58\x3b\xec\x57\xc9\xca\x44\x7a\xb4\xb2\xdb\x41\x6c\xa2\xe1\xfb\xf3\xb2\x33\xbf\x20\x09\xd6\xc1\x75\x9d\x3c\x86\xa9\xf7\x0d\xb9\xee\x02\x97\x33\x01\x65\x83\x84\xb3\x97\x83\x07\xc2\x70\x65\x0e\x12\x84\x15\xd4\xb8\x11\x19\xc2\x45\x69\xee\x94\x5e\x64\x94\x72\xec\x9b\xd7\xbb\x76\xf5\x78\xdc\xa9\x45\xdd\xcc\xf9\xea\x65\xc6\xe7\xb5\xa9\x8a\x4d\xc6\xe7\x45\x5d\x1a\x00\x5f\xf6\x57\xc5\xde\xe0\xd2\x2a\x9e\x50\x56\xdf\x6b\x61\x25\xb7\x9a\xe6\x6b\x4c\x36\x82\xc2\x58\xfc\x2c\x8b\xba\xe4\x23\xe4\x43\x1c\x57\x56\x55\x4e\xa1\xe1\xf8\x42\x81\xbd\x5f\x97\x62\xee\xe3\x08\xb9\xac\xa4\x86\x56\xfc\x15\x76\x85\x30\x92\xf0\x5e\xc5\x8c\xfe\x73\xc9\x65\x59\x16\xa5\xc9\xf6\xb6\xca\x77\x27\x3a\x6b\xf6\xd7\x07\x17\xa0\x57\x05\x7b\x7c\xf2\x84\xa4\x8b\x42\x13\x74\xe4\x70\xad\x51\x37\x84\x8c\xb9\x82\xdf\xf0\xa0\xd3\xc6\x7d\xae\x00\xa2\x83\x00\x9a\xd3\x49\x02\x98\xb7\x04\x98\x0e\x98\x1b\x63\x7f\x4a\xe3\xf4\x00\xd1\xe1\xfe\x1a\x90\x4e\x28\x06\x45\x71\xe9\x05\x82\x4d\xfb\x4e\x57\x00\x01\x64\xd5\x99\x38\xbc\x80\xd5\x23\x82\x8c\x11\xe4\xc5\xc1\x49\x4c\x23\x19\x74\x61\x87\x2f\x2e\x01\x0b\xc2\x40\x29\x2b\x42\x76\x84\x9b\x64\xcf\xe7\x5a\x6a\xf8\xc7\x5c\xd4\xe4\x87\x21\x39\x49\x71\xc8\xda\x74\x39\x3d\x42\x9c\x24\xd8\x38\xf8\x82\x13\xb1\x99\x1b\x1e\x21\x93\x71\x74\x1a\x73\x29\xa0\xd6\x36\xa0\xd9\xb4\xc0\x58\x8a\xd2\x2e\x97\x6c\x8f\x64\xef\xc2\xca\x92\xf2\x1a\x9e\x96\xd7\xb0\xaa\x40\x0f\x72\x07\x94\x49\x96\x02\x99\x64\x7c\x5b\x6b\x55\x41\x96\x03\x88\x0d\xb9\xd9\xe6\xa2\xf4\x18\x2a\xcc\x15\x55\x58\x2a\x42\xf9\x89\xbc\x97\xba\x96\x98\x52\x03\xbd\x9b\xd5\x5c\x6d\x1d\x88\xdd\x52\xb9\xe4\x99\xbc\x30\x15\x9f\xd5\x46\xd9\xd3\x8d\x4b\x61\x61\x29\xae\xf7\x04\x64\xbf\xa9\xc6\xf2\x1d\xae\x99\x2f\x5a\x26\xfa\xa0\xb6\x8b\x07\xcd\x01\xdb\xd2\x34\x7b\xf6\xe4\x9d\x59\x45\x3f\x50\xa8\xeb\xa0\xb9\xd3\xa5\x28\x57\xd2\xb7\x7c\xa3\x4a\x45\x04\xf6\xb5\x66\x29\x5b\x2a\x2d\x34\x08\x68\x58\x7a\x8a\xe6\x8e\xef\x87\x7d\xdd\x96\x90\x5c\xa7\xe5\x2a\x57\x2b\xbc\xe2\xfb\xf7\x17\xaf\xd1\xab\xde\x49\x8c\x91\x68\x17\x09\x56\xf1\xfe\xd6\xac\xec\x55\xef\x14\xf2\x5f\x1f\x81\x3d\x7c\x3c\x1d\xa6\x81\xa3\xe8\x71\xdb\x4c\x47\xd6\xb6\xda\x40\xf2\x46\x25\x5d\xf2\x72\xcc\xd0\xc9\x81\x47\x6c\xc1\x9a\x0e\xac\x3b\x26\x9e\xf9\x22\x94\x36\xce\xe2\x1e\x8f\x0f\xfb\xa2\x9c\xca\x4e\x67\xa7\x69\x79\x3b\xd9\x93\xe5\xc8\x1d\x40\x8e\x29\x0c\x9e\x83\x6f\x64\x5f\x00\xdf\x88\x8f\xd4\x0e\xf4\x6c\x1f\x4e\x63\x94\x57\x06\x8b\x6d\x22\xae\x35\x1d\xa3\x7f\x6a\xbb\xfd\x22\x70\x47\x76\x06\xb0\x8e\x7f\xca\xf8\x2b\xd8\xa4\xd3\x93\x9f\x0b\xee\xf8\x0a\xef\x4e\xec\x9e\x52\xda\x1d\xb3\xc7\x60\x35\x9b\xd1\x70\x57\x81\x1e\x90\x3b\xdb\x67\x1a\xe2\x07\xaf\x7a\xcf\xf9\x6d\x13\x3d\xb0\xb1\xee\x57\xbd\xd3\xac\x85\x24\xd7\x00\xa5\xeb\x6a\xcd\x1a\xe9\xb2\x7b\xf2\xc1\xed\xf7\x5f\xf0\xb1\x54\x1a\x6a\x49\x9d\x5e\xec\x7c\x3e\xd4\x3f\x64\x2e\x05\xf5\x90\xe9\xa2\x44\x7a\xd3\xda\x21\x44\x88\xce\x3c\xd8\xd5\xc3\x21\x78\xa4\xba\x42\x39\xf4\x38\x9a\xce\x02\x2d\xa6\x1b\x07\x11\x86\xc5\xc8\x56\xaf\x0c\x82\x35\x24\x09\xc5\x3b\x5b\xeb\x4a\x01\x1a\x16\xff\xfa\xa4\xb2\xcc\xf1\x81\x43\x1f\x4f\x06\xf5\x22\x8e\x3e\xb8\x1a\x74\x8d\xdc\xb8\x71\xf2\x07\xc7\xb2\xd2\x57\x79\xc7\xab\x0e\x36\xce\x6b\x21\x71\xb4\xc4\xb2\x06\xf0\x78\x35\x14\xc3\xd7\x56\x7b\x67\xf3\xf4\x93\x6a\xc9\xbf\xe0\x55\x47\x78\x5f\xbd\x81\xc7\x82\x51\xda\x3a\xf6\x2c\xf6\x10\x8b\x29\x93\x71\xed\x2c\x96\xe1\xed\x16\x57\xf4\x70\xef\xee\x83\xa1\x07\xd5\xbc\xa6\x80\x54\x78\x1b\x61\xa3\xaa\x82\x3f\x3f\xb1\x64\x32\x44\x27\xd8\x6a\xf8\xec\xd6\x73\x7c\xef\x34\x7f\xd5\x7b\xd9\x89\x01\xf6\xb3\x11\x4b\xd9\xde\x24\x85\x2f\x43\x2d\xed\xc8\x55\x60\xa9\x87\x7e\x0c\x1f\x6b\x56\x22\x3d\xfd\x39\xfb\xad\xad\x43\x62\x6d\xd6\xd4\x25\x43\x79\xae\xfa\xff\x5d\xc4\xd3\xd3\x93\xde\x09\x7f\x8b\x88\x72\x8c\x9d\x9e\xf4\x4e\xbf\x08\x26\x73\x2d\xf3\xd0\x8e\xa9\x1b\x31\x33\x43\x40\x59\x08\x6b\xfe\x5d\xe8\x98\x3c\x74\xc0\x7f\x4a\x69\xb0\xcb\xb7\xd7\x1e\x5f\xb7\x47\xa3\xb5\x0a\xd6\xc2\xa0\x6c\x81\x59\x2e\xf6\x39\x31\x3d\xae\x1a\x6a\x67\x3d\x20\xd8\x59\xb3\x34\x0a\xd5\xaf\x2f\x45\x86\x74\x45\x67\x2c\x6d\xe7\x9b\x60\x11\x77\x94\x56\x0c\x2b\x17\x04\x44\xfb\x50\x8a\x32\x57\xae\x8f\x79\xc0\x8d\x0c\x60\xa0\x86\x7f\x21\x6e\x64\x24\x7b\x4e\x4f\x7a\xcf\x63\x71\xfb\xa5\xa2\xd6\x27\x9d\x38\xad\x56\x83\x49\x0a\xf8\x55\xa5\x0c\x0c\x7c\x7f\x4b\x3e\xac\x4b\x80\xc8\x1f\x59\xe1\x41\x95\x6c\x68\xa8\xa7\x27\xbd\x17\xfc\xdc\x27\x18\xd9\x7d\x49\x77\xa4\x02\xc8\x47\xba\x16\x4a\x93\x7a\x88\x7b\x8f\x50\x51\x9e\x91\xb3\x5c\xec\xcc\xe3\x8e\xe9\x38\x81\x2f\x7c\x02\x4f\x27\x84\xa4\x6a\xe4\x85\x0c\xd6\x8d\xe7\x09\x04\x35\x44\xe0\xec\xc6\x88\xd2\x0a\x48\x40\xc8\x5b\x76\xe7\x82\x75\x55\xa9\x80\xcb\xbc\xab\x72\xfe\xb1\x28\x40\x54\x37\x16\x10\x3d\xc9\x61\x6d\xf7\x66\x7f\x0a\x9a\x4b\x9b\x6e\xbd\x07\xab\x8c\x72\xa2\x92\x3b\x65\xb7\xab\x5c\x60\xc5\xf5\x46\xca\x47\x1a\x2f\xfe\x56\xf8\x7c\xbf\xf5\x4f\xef\xd9\x3f\x55\xc7\x57\x6f\x6f\xae\x8e\xbd\xe3\xf2\xf8\xb4\x77\xfa\xab\x42\x01\x3e\x8e\xff\x77\x72\x76\xf6\xfc\xb4\x81\xff\xf7\xf2\xec\xf9\x8b\x3f\xf0\xff\x7e\x8f\x9f\xe9\x5a\xf2\x7f\xaa\x20\xef\xda\x72\xa5\x7f\xaa\xb8\x3d\x0c\x21\x68\xe0\x5b\xd7\x9c\xf6\x4e\x19\xeb\x63\x05\x59\x84\xa6\x1b\x8a\x85\x89\xdd\xbe\xbd\xbe\xe5\x57\xd2\x18\x59\x3a\x31\x4c\xb9\x42\x9e\xb9\xb8\x11\xcf\xd0\xca\x90\x2e\xfa\x3a\x2f\x16\xd2\x63\x0d\x08\x7e\x10\x10\xb8\x6a\x23\x1d\xc2\xea\xac\x14\xe5\xc3\x01\x05\x52\x3c\x3a\x45\xc8\x03\xc4\x0e\xc4\x7c\x2d\x85\xbd\xb6\x4b\x95\xcb\xd0\x49\x32\x32\x66\x69\xa0\xae\x0e\xc1\xd4\x72\x2b\x9a\x13\x71\x13\x77\xed\x41\xdf\xc4\x0c\xd0\xa4\xcb\xa2\xa0\x1c\x3f\xd7\xff\x2f\x9a\x83\x69\x7c\x17\x55\x65\x94\x26\x52\x7b\x04\xe1\x50\x14\x0c\xdd\xfe\x2a\x28\xdc\x8a\x3a\x81\xfa\x55\xa6\x2e\x14\x5d\x6f\x64\x09\x68\x4a\x5b\x51\x8a\x8d\xac\x64\x69\xa8\xf2\xca\x27\xad\xf1\x5c\x3c\x14\x75\xe5\x93\xa4\xc0\x05\xba\x11\xf3\xb2\x80\x40\x3a\x20\x2c\x2c\x6b\xed\xe2\xcf\x56\x49\x03\x87\x54\xe5\x2b\x10\x70\x56\xea\x08\x2d\x34\x48\x03\xed\xe8\x7e\xea\x4c\xc8\xaf\xdd\x8a\x7f\xd6\x79\xe8\x31\xf6\xbe\x28\x25\x96\x99\x38\xb0\x3c\x72\x84\x92\x4b\x8e\x8e\x25\xe0\xb6\x79\x9c\x38\x37\x44\x4a\xe5\xc6\xee\xe0\xc6\xc6\x89\x14\x3c\x82\x28\xbb\x2f\x72\x84\x3b\x83\xe4\xd6\xf4\x3c\xc5\x3b\xe7\x01\xba\xfc\xc7\xe9\x2f\x5f\x99\x74\xc7\x63\x84\xef\xee\x8d\xf3\xa7\xa5\x6b\x03\x5f\x87\x73\xd0\xbd\x93\xaf\xa3\x2d\xf1\x7b\x1a\xef\xd5\xfd\x11\x37\x1b\xa8\x05\xa2\x6d\xf6\x3b\x4a\x89\x9a\x8d\x4d\x2f\x96\x7c\xa9\xee\x25\x07\x44\x5c\x44\x8b\x31\x20\x8e\x73\xa9\x57\xd5\xba\xc7\xd8\x25\x66\x85\x6c\x8a\x52\x66\x1e\xe0\x30\x4a\x20\x44\x87\x5e\xd8\xae\xbd\x8c\xe2\xc9\xad\xfb\x8f\x2a\x4e\xff\xc3\xfd\xf4\x9e\x2d\xac\x0e\x3d\xb7\xfc\xe5\xbf\xee\x3e\x7e\x50\x7a\x51\xec\xcc\xaf\x8b\x04\xfc\x94\xfc\x7f\xfe\xf5\xf3\x86\xfc\xff\xfa\xe4\xec\xec\x0f\xf9\xff\x7b\xfc\x60\x9f\xa5\xe1\xe8\x9a\x5f\x8f\xa6\xc3\xf3\x01\x63\xa7\x3d\x84\x8b\xa1\x10\x46\xe0\xb9\x28\xac\x43\x08\x7b\x5d\xe4\xd6\x36\xf3\x9a\x70\x4e\x1c\x72\x65\x99\x48\xb8\xef\x58\x74\x13\x38\x41\x6d\x82\x38\x84\x2c\xc8\x76\xe9\xb1\x73\xbb\xd0\x53\x6e\x60\x41\x58\xe6\xf3\xc4\xd1\xe0\x0f\xad\x67\xd1\x57\xf8\x50\x86\xac\x08\xfa\xd8\x62\xb0\xd3\xf1\x9a\xe7\xbd\xd3\x24\x34\x30\xc7\x18\xcc\x21\x22\xb4\x96\xbc\x80\xf5\x1e\x61\x10\x2d\x6e\xd9\xcf\xd3\xb7\x20\xa3\xd7\xc3\x85\x93\x29\xd7\x49\xa0\xe8\xcb\xcd\x31\x3c\x24\x09\x63\x67\xbe\x1b\x35\x49\x39\x65\x52\xdc\x58\xc8\x47\xb0\x1f\xc8\x2c\x97\xbe\x73\x00\xc9\x8d\xb6\x88\x54\x20\x8b\x4b\xd9\x69\x57\x45\x33\x53\x1a\x0a\x1d\x23\xcd\x86\xa6\x05\x53\xa4\xc6\xd6\xae\x4b\x6b\xc2\x8c\xd9\xf3\xe0\x9b\x2d\xb6\x0f\xa4\xaa\x59\xd1\x88\xb2\x2e\x7c\x7b\x8f\x0b\x08\xf5\x00\xe7\x97\x89\x15\x80\xb9\xef\x59\x0f\x9a\x02\x6d\x61\x97\xaa\x00\x59\xe9\x84\xd7\x1a\xaa\x20\x58\xee\x84\xbd\x88\x21\xdd\xe6\x74\x04\x2b\xea\x89\x14\x68\xda\x86\x0c\xc0\x5d\x5b\x48\xe6\x69\x2d\x16\xe1\x30\xee\xc4\x03\x14\xea\x42\x88\x85\x6f\x94\xc9\xa5\x70\x49\x87\x85\x86\x33\x40\x63\x40\xac\x1c\xbb\x1d\xd7\xf3\x35\x0b\x28\xb6\x96\x46\xa4\xcf\xd4\xa6\xe2\x0b\x99\xcb\x4a\x36\x35\x1a\xf2\x97\x02\x55\xa9\x75\x24\x54\x0e\x2f\x9e\x15\x25\x13\x8b\xbf\xda\x37\x2b\xdf\x24\xa6\x51\x6e\xe3\xb2\xeb\xe7\xd4\x96\x31\x7f\x80\x84\x61\xb7\x69\xbb\x52\x55\xb2\x9d\x43\xea\x4f\x88\x2f\x55\xf2\xc4\xc4\x38\x5b\xa4\xea\xfa\xc8\x2b\xf9\xc0\x55\xd5\xa5\x92\x39\x92\xc2\x8b\xc9\xf7\x42\x73\xf0\x82\xa1\x0b\xd2\xac\xe1\x70\x77\x11\x46\xfe\x96\x74\xf9\xb7\x66\xb9\xff\xae\x7e\x7a\xcf\x2e\x8e\x2f\x27\x57\xbf\x25\xfc\xff\x13\xf2\xff\xf9\xd7\x67\x67\x2f\x1a\xf2\xff\xec\x9b\xe7\x2f\xff\x90\xff\xbf\xc7\xcf\x85\xac\x2b\x33\x5f\x4b\x7e\x59\x4a\x25\xf9\xa4\x58\x56\x50\xfd\x72\xa5\x3e\x49\xfd\x89\xb1\xc3\xf9\x11\x7f\x4f\x85\xa3\xaa\xde\xf0\xe5\xe7\x9f\x4a\xfe\x41\x19\x23\xb5\x99\xaf\xc5\xb2\xb2\xfc\x9e\x5f\x16\xa5\x99\xaf\x6b\xbd\xe2\xd7\x45\xb9\x28\xd7\x52\xe9\xe3\x0f\xd2\x54\x4b\x91\x4b\xcd\xed\xc6\xf2\x41\x69\x2a\x99\xe7\x15\xbb\x2f\x34\xef\x7f\x94\x39\x7f\x2f\xab\x4f\x2b\x74\xf1\xf2\xa9\xca\x73\xfe\x67\x21\x57\xd6\xf0\x1b\x12\xde\x36\x7e\x6c\x2c\xe7\xeb\xca\x2c\x4b\xb1\x92\x9a\x5b\xd1\x02\x33\x85\x8c\x5a\x06\x5d\x08\x26\x58\xed\xe6\xa7\x7e\xcc\x0f\x5d\x27\x8d\xdd\x6e\xd7\x53\xcb\xb2\x30\xa6\xb7\x90\xfc\x88\xf7\x18\xbb\x29\x3f\xff\x28\x36\x33\x99\x33\xe6\xdf\x50\xa6\xe2\x1b\xb9\x2e\xb9\xc8\x0d\x97\x4a\xf3\x0f\xaa\xac\x70\x79\x66\x55\x57\x3d\x3e\x51\xf8\xd0\x42\x39\x3c\x38\xa0\xd9\xdb\xb2\xd6\x8b\x5c\xac\x24\xb3\xf3\x1a\x86\xba\x19\xb3\x92\x46\xe6\x39\x0e\xd1\xe3\x17\xca\xd2\x57\xac\x24\xcc\x7f\x2a\x55\xbe\x16\x33\xfc\x47\x3f\xcf\x57\x72\x23\x95\x5e\x4b\x60\xb9\x15\x5b\x48\xb3\x93\x76\xad\x96\x50\x33\x69\x0a\x2b\x4f\x65\xc9\xdf\xc8\x85\xac\xab\x5a\xaf\x7a\xfc\x9d\x2c\xef\x3e\xff\x6d\xb3\xc9\xd5\x7c\xcd\x73\xd8\x29\x25\xcb\x0a\xea\x98\x56\xa5\xd8\x6c\x24\xdf\xc9\x72\x21\x35\xd3\x75\xc9\xd5\x86\x8f\x50\xe6\x9f\x93\xcc\xaf\x4a\x25\x67\x52\x67\x30\x83\xeb\xba\xfa\x24\x4b\xbe\x10\xe5\x92\x2f\x84\xf1\x63\xf0\x9d\x5c\xa0\xe6\xf3\xf9\x47\x3b\x05\xcd\x74\x31\x5f\xf3\x9d\x54\x95\x2c\x57\xf6\xfd\x1e\xbf\x10\x86\x4e\x0a\xe0\x5b\xe5\xf1\xfe\x78\xea\x1e\x9a\x07\x5d\xe8\x87\x0d\x3f\x88\xb6\xcb\x13\xff\xe0\x88\xaf\xe4\xee\xf3\x8f\xeb\xb2\xe2\xc3\xb5\xb6\x7b\x2c\x56\xb0\xfe\x7a\xb3\x14\xf6\x9c\x2d\xf0\x70\x5a\x02\x49\x6d\x57\x73\xbb\x59\x09\x6b\xa3\x2b\x2b\x31\x36\x7e\xc2\x3d\x66\xe9\xfc\xf8\x81\xe6\xcb\x22\x5f\xc1\x3e\x1a\xb9\x49\xa6\x8e\x9b\xec\xa6\xc2\xdc\x54\x0c\x9e\xbf\x2c\x25\x8d\x8a\x67\x57\xf2\x0f\x52\x19\xc9\x3f\xd5\x5c\x5b\x5a\xea\x1e\x1f\x18\x38\x2e\x30\x08\x5b\x49\xab\x18\x54\xb2\x39\x88\x16\xf3\x35\x1f\xae\x4b\xa9\xf9\x77\x05\xde\x8e\x5a\xdb\x85\x7f\xaa\x23\xaa\x43\x05\xb8\xff\x67\x25\x4b\x56\x2c\xe0\xd2\xc4\xbf\xb3\x17\x70\x43\xef\xdd\x2b\x99\x2f\x3f\xff\x98\x57\x6a\x65\xb7\x18\x7f\x39\x2b\x91\x7a\xf6\xae\x7d\xfe\xdb\x72\x29\x75\x05\x87\xe7\x53\xbd\xfa\xfc\xa3\x5e\xd9\xff\x66\x9f\xac\x8e\x39\x5f\xc3\xbe\x5a\xfa\xe0\xca\xdd\x51\x82\x60\x58\xb5\x92\x39\xbe\x28\x95\x5e\xd9\x09\xd4\x1b\xab\xb8\x7e\x01\xe1\xed\x24\x94\x5e\x48\xbc\x44\x78\xa9\xa5\xd2\x30\x44\x8d\x10\x35\x12\x44\xb4\x61\x76\x63\x6f\x96\xf6\x33\x15\x1c\x52\x25\x61\x9f\x7f\xd8\xc9\xf9\x9d\xfd\x97\x86\xdf\x0a\xc3\x97\xf0\xa5\x1f\x54\x79\x57\xe7\x4a\x96\xc0\x1f\x02\x81\x21\xe6\xcf\x60\x5c\x20\x60\x58\xb6\xa5\xc4\x65\x51\x56\x52\x57\x3b\x35\xbf\x0b\x64\x37\x6a\xbe\x96\xa5\xee\xf1\x0f\x52\x6b\x38\x10\xf1\x8e\xb1\x88\x90\xb0\x09\x7b\x28\x49\x64\xb4\x73\xd4\x9a\x6f\x3e\xff\x64\xcf\x09\x8c\xf6\x57\xb9\x90\x1b\xbc\x76\x0b\x61\x98\x3f\x0a\xf6\xaa\xe3\x89\x93\xe5\xda\xee\x5d\x66\x09\x2c\xf9\x5f\x8a\xad\x9d\x83\xdd\x8d\xd2\x11\x72\xa3\xaa\x5c\xc9\xa5\x2c\x71\x37\xed\xd6\xfc\x50\xaf\x4a\xb5\x5c\x32\x51\x2f\xe1\xdf\xc4\x11\xe1\xba\xcb\x72\xf3\xf9\x6f\x30\x2d\x38\x98\x76\x54\xbc\xc2\xd2\xd1\x98\xcf\x64\x65\x5f\xaf\xda\x34\x61\x09\x3d\x7b\xfc\xf3\xff\x69\x0f\x1c\x92\x4b\x84\x9b\x87\x7b\x64\x17\x18\x53\xa4\x41\x2d\xd6\x45\x21\x47\x1c\xb8\x0b\x76\xea\x6f\xa4\xa9\xd4\x66\x83\x9f\x48\x17\x6e\x77\x9b\x5b\xd6\x30\x93\x9a\xe1\xa1\xfc\xb2\xa3\xa7\xd5\x66\x53\x71\x20\x8e\x92\x81\xa5\x6a\xde\xb7\x1c\xdb\x2d\x08\xd6\xba\xa0\x91\x90\xb6\xb2\x2e\x8b\xed\xe7\x1f\x15\xfe\x06\xcf\x2c\x1f\x7f\xfe\x69\x7e\x67\x0f\x4a\x24\x17\x3e\xed\xa4\x32\xdb\x52\xcc\xd7\x6a\xc5\xe1\xbe\xe7\x95\xac\x18\xec\x8f\xb0\xc7\x59\x40\x32\x1f\x6d\x0f\x14\xa7\x62\xe2\x08\xc8\xc7\xef\x88\x23\x73\x51\x9b\x95\x2c\xe1\x80\x56\x18\xce\x86\xff\xf9\x9f\xff\x83\xc7\x6d\x36\xa4\x76\xa5\xe4\x8c\x5d\x14\x77\xa1\xba\xfa\x5b\x10\x34\x6f\xa4\x99\xaf\x4b\xa9\x66\x35\x40\xa1\x1a\xde\xaf\x97\x33\x51\xc3\x6d\x78\x06\xc7\x16\x52\x7d\xaa\xb2\xbe\xab\x6a\xfc\x87\xdb\x47\x05\xa4\x60\xc9\x83\x97\xb5\xbe\xc3\x99\xaa\xea\xf3\x8f\x55\xf3\x8e\x65\xbc\xd6\x62\xb6\xb6\x1b\xab\x56\x7c\x21\xee\xa1\xee\x69\xc6\x8d\xa5\xcc\xc6\x31\x7b\x38\x89\x30\xe4\x8a\xa8\x5f\xf1\xfb\xa2\x5c\x49\x5d\x6c\x36\x52\xf3\x9d\x2a\x09\xc3\x00\x56\x85\xfb\x86\xcb\xf9\xb4\x23\xf2\x2f\x3c\xc3\xb6\x27\x00\xd5\x06\xbc\x33\x2b\xbb\xe2\xbc\xb0\x07\x49\x5a\x62\x4a\xa5\x67\xc2\xae\xc4\xde\x15\x66\xdf\x1b\xea\xb5\xc8\x2b\x58\xcf\xc1\x85\xdf\xe2\xa6\xa0\xc2\xd1\x0f\xf8\xec\xd3\xae\x07\x17\xbf\xaf\x57\x72\x56\x54\x7c\xad\x64\xf9\xa9\x6e\x4d\x50\xcb\xf5\x46\x96\xdf\xf2\x3f\xcb\x85\xe4\x5a\x54\x9f\x7f\x2a\xe1\x9e\xe1\x4a\x21\x6e\x59\xa1\xa2\x80\xa9\x78\xc4\xca\x94\x3f\x98\x42\x3b\x0a\xb0\xb5\xa8\xa2\xf1\x1d\x79\x71\x6c\x83\xb0\x38\x95\x2c\xb7\xe1\xc2\x09\x03\x5c\x63\xe1\x0f\xa6\xd2\x56\xa9\x28\xf7\xdc\x25\x96\xde\x25\x7f\x37\xab\xc7\x39\xd9\x4a\xda\x9b\x0a\x9d\x2b\xe0\xe4\x9a\x78\x96\xf8\xff\x91\x6e\x81\x3b\xb6\x11\x66\xbe\x56\x5a\xea\x5c\x9a\x19\xb4\x71\xfa\xfc\xd3\x4c\x96\x46\x56\x9f\x2a\x89\x92\x2a\x65\x2b\x61\xc4\xcf\xff\xb7\x9f\xc6\xb7\xfc\x1a\x98\x93\x86\xba\x3a\x60\x87\xa0\x0e\xd9\x15\xd9\x53\x88\x24\x95\xfa\xae\x94\xca\x70\x7f\x6d\x90\xb9\x6e\x65\x69\x3e\xff\x4d\x83\x58\xc3\x93\x5c\x97\x96\x28\x56\x5a\xd4\x2b\xb9\xfe\xfc\xb7\x52\xad\xee\xac\xc6\xf5\xa9\x86\xa1\x93\xed\x72\x83\x23\x69\xec\x9f\x37\x31\x81\xa4\x66\xd3\xf2\xf3\x8f\x56\x75\xdd\xa8\x4a\x2a\x2d\x34\x29\x4a\xb3\x5a\xb7\xa9\x14\xad\xa9\x43\x48\x20\xc9\xe2\xd1\xad\x36\x61\x35\x2c\xd4\x10\x63\x71\xa6\x34\xab\xf5\xdd\xe7\xbf\x95\x50\x74\x6c\x25\x15\x50\xd3\x6a\x08\xc6\x73\x35\x38\x19\x6f\xec\x25\xa8\xec\x99\x07\xb9\xb6\xe1\x17\xc5\x4e\xe7\x85\x00\xaf\xc6\x85\xa8\xa4\xd6\x12\x34\x95\x30\xcd\xe4\x10\x7d\xcb\x2f\x64\x49\xf7\x40\x49\x7e\x5b\xae\xe1\xca\x01\x3d\x0c\xb4\xc3\xb1\xec\x79\x88\x0f\x03\xc5\x45\x6d\xec\x25\x54\xf2\xf3\xbf\x12\x8d\xac\x5e\x59\xeb\x95\x29\x51\x8b\x10\xba\xa1\xac\xf9\x2f\x47\xd2\x0a\xa9\x01\x6a\xff\x7b\x30\x30\xa4\xe6\xfe\x14\x29\x1d\x33\x2a\x64\xb7\x76\xb9\xa5\x65\xb8\xd6\xb4\x90\xec\xd1\xc3\xf5\x9d\xd7\xa9\xe8\xca\x0e\x4a\x94\x84\xb5\x5e\x65\xfc\x2f\x9f\x7f\x2a\xed\x7c\x81\xaf\xbc\x91\xa2\x9c\x49\x55\x39\x16\x1a\xb1\xbb\x98\xd6\x0c\xb7\x2a\x11\x99\xe9\x07\x49\x00\x3e\xbe\xcb\xe9\x96\x7e\x97\xa8\x70\x96\x82\xa6\xb2\x22\x07\xc0\x79\xa3\x7d\xb6\xd2\x04\xb6\xb2\xc2\xc3\x48\xc7\x55\x81\x3c\xb1\xaa\x16\x31\x40\xfe\x4e\x94\x0b\xcb\xdf\xe2\x99\x15\x79\x6e\x2a\x4b\x0d\x65\x8f\x71\xba\x03\xe9\x2f\xec\x80\x10\xd4\xb2\x9b\x62\x0f\xc3\xc0\xab\xaa\x70\x40\x2c\x63\x49\xe8\x35\x93\x56\x0b\x26\x15\xcb\x2a\xa5\x46\x00\x8f\x47\x75\xdd\x1e\xc7\x92\x7f\xfe\xef\xc4\x10\x1c\xc1\xad\xc9\x27\x72\xcc\xf3\x63\x80\x51\xb6\x20\x82\x68\xfe\x97\x42\x2f\xd5\x8a\xd2\x4c\xcd\x42\x54\xce\xfc\xf3\x9c\xfb\xf8\x83\x2c\xef\x3e\xc9\x1a\x14\x5e\x53\x80\x6e\x04\xfc\x8e\xd1\xe4\x67\x52\x7f\xfe\x5b\xa5\x56\x7e\x56\x1a\x78\x8b\x70\xc6\x17\x5f\xc9\x99\xd5\x44\xed\x09\x9e\xaf\xf9\xe1\xa7\xde\x9b\x1e\x9f\x50\x72\xcb\xf1\x5f\x8a\xcd\x56\xe5\xb2\x3c\x42\x5e\x02\x94\xb0\x9a\x5c\xb9\xb1\xfa\x5d\xee\x64\xd2\xe7\x9f\xac\x2e\x0f\x5a\x8a\xb2\x22\xc7\x0a\x79\x59\x71\x31\x2b\xad\x00\x2e\xb9\x51\x7a\x91\x4a\xf5\x53\x52\xb1\x19\x3b\x3c\x3d\x42\x75\xf3\xf3\x4f\xe5\x92\x0c\x8f\xc4\xda\xe8\x50\xf7\xdb\xba\x7e\xd0\xb8\xd8\x23\x8a\xbe\xd3\xf2\x19\x3b\x3c\x7b\xe4\xab\xc1\x04\x41\x5d\x48\x57\x66\x6b\xef\xb2\xd4\x8b\xd8\x1e\xb1\xa7\xcd\xa0\x56\xf2\xd8\x84\x1e\xb3\x3c\xbc\xd9\xf1\xd6\x59\x4a\x60\x08\x83\xce\x64\x4f\xd7\x5f\x02\x22\x7f\x83\x23\x16\xce\x9e\x96\x1a\x84\xb4\x95\x88\xa0\x6e\x91\x82\xe7\xed\xe1\x70\x2d\x0f\x9f\xe3\x9a\x65\x49\xec\xd1\x9b\x23\x32\x35\x71\xd2\xad\x3a\x0b\x16\x09\x9f\x49\xb5\xf1\x4a\x1b\xee\x5d\xa7\xbd\xd0\xd4\x80\x9f\xb4\x17\x8c\x54\x0c\xc1\x63\x1a\xfb\x5d\x24\x96\x78\xe5\x19\xbf\x91\x8a\xe3\x0b\x28\xc4\x62\x4a\x59\xdd\xa7\x4d\x87\xa7\x98\x44\xc3\x68\xb1\x6a\x5c\x30\x38\xbe\x85\xe8\x90\xb5\xa8\xec\xeb\x1b\x59\xde\x45\x4a\x1e\x72\x0b\xaf\x3b\x46\x6a\x01\xea\x3d\xa4\x7f\x1b\xef\x5b\x5a\x2b\x6d\xd5\x66\xa9\x5f\x43\xe4\xe3\x17\x0e\x0b\xba\x45\x2c\xa5\x52\x9b\x85\xf7\x6b\x73\x57\xeb\x65\xc5\xc1\x6e\x78\x0d\xa1\x0c\x54\x26\x90\xa3\x49\xcd\x07\x9b\xed\xd2\xee\x05\x88\xb2\x1a\xb7\x67\x27\xd6\xa5\xd5\xef\xac\xe8\xd1\xfc\x1d\x4e\xb5\xbd\x06\xd0\xf0\x95\xf4\xb7\x5d\x60\x37\x42\xfe\x0f\xb1\x07\x6a\x71\xbc\x34\x79\x6f\x21\xf9\x3f\x72\x8f\x56\xf9\xa2\x07\x9f\xbe\x8f\x19\xb1\xe6\x53\xf9\xb1\x6a\x58\x3d\xc0\xc1\x3a\x26\x45\x5e\x07\xba\xc5\x70\xfe\x66\x52\x71\x74\x44\x05\x66\xda\xb6\x88\x91\x8e\x70\x86\xfd\xef\x2b\x51\x56\xf4\xc1\xe3\xa0\xfe\xc3\x11\x17\x2b\x33\x93\xd6\x2e\x27\xab\x4f\xaf\xe4\x27\xa9\x56\x15\xb9\x05\xd2\xf3\xe2\x56\x77\xda\x4b\xc8\x94\xb9\xdf\x9f\x01\xed\xf7\x92\x13\x0c\x76\xda\xa0\xf4\x21\x77\x70\x83\xef\x80\x34\x15\xd4\x2b\xac\xdd\x6c\x90\xcb\x54\xf8\x54\xa0\x20\xb3\xe2\x08\xb7\xd1\xad\xd7\xaa\x91\x42\x2f\x2a\x60\x1c\x6e\x6e\xf6\x78\x2c\x45\x9e\x9b\xd6\x1a\x2d\x8d\x9f\x37\x38\xa5\x92\x9c\x14\x9c\x06\x85\x51\xb2\x58\x46\x14\x18\x06\x4c\xfd\x4d\xa0\x22\x0b\x16\x93\x77\x15\x28\x49\xaf\xaa\xa6\xdd\x0b\x86\x92\x91\x6b\xb8\x8e\x20\x42\x0e\x5f\x1c\x59\xd9\x67\x59\xf3\x04\x2f\x68\xa2\x5b\xa1\xef\x20\x31\x0d\x03\xbb\xb3\x54\xb3\x86\x77\x6d\x0c\xc9\xc8\xc6\x83\x31\x9f\xdf\x28\xcb\x0e\xe1\xf2\x87\x0d\x97\x06\xf8\xce\x42\x6a\x9a\x37\xba\x61\xde\x3b\x36\x61\x4d\x48\xbb\xe0\x74\x5c\xef\x0f\xb3\x1b\xba\x2a\xd1\x75\x11\x6c\x7b\xa7\x5d\xa4\x2f\x01\x45\x82\x03\x2d\x65\xc9\xcf\x49\x87\x92\xfb\x58\x73\xca\x31\x83\x9c\x02\x8e\xfd\x5d\x97\x08\x6b\xec\xa5\xdb\x6d\x4b\x64\x6b\x87\xd0\xe9\x02\xd3\x2a\x6c\xe6\x1e\xcb\xea\x4b\x79\x7e\x61\x65\x86\xe1\x17\xd0\x0d\x9b\x81\x5d\x17\x4d\x2d\x52\x02\xcc\x4a\x1a\xb1\xa9\xba\xce\x38\x39\x1e\xad\x26\xa9\xb5\x17\xed\x1f\x54\xb9\x48\x05\x92\x33\x68\x40\x66\x26\x12\x13\xad\x9c\xa6\xbc\xe0\x77\x20\x50\x94\x2c\xab\x8c\xad\x54\x4e\x8e\x8c\xa6\x50\x0e\x73\x23\x07\xba\xec\xd2\x10\x1a\x9a\x34\x4b\xcf\x11\xb4\x8f\x02\xc5\x36\x2c\xd9\x54\xd8\x46\x25\x07\xed\x41\x81\x11\x4f\xde\xc7\x95\xd4\x8e\x6f\x82\x57\x8b\x44\x9d\x49\xdf\x06\xde\x84\x73\x8a\x5e\xe0\x42\x7f\xaa\xe1\x42\x65\x7c\x67\x19\x27\x44\xb0\x01\x38\x6b\x05\xc0\x0c\xec\xbb\xa2\xb4\x06\x0d\x2a\xa8\x52\xa3\x6c\x92\xe5\xf2\xf3\x4f\x79\x5e\xa1\x14\x6c\xaa\xc9\x96\xb2\x81\x5a\xb1\xcc\xc5\xbb\xf6\x57\xb9\x93\x2a\x27\x59\xbd\x92\x1a\xdb\x27\x5b\x55\x96\xdd\x17\xe5\x5a\x80\xe5\x68\xa4\xa2\x3b\x75\x07\x54\x7c\x13\x31\x2a\x8e\xed\x32\x70\x83\xa6\x30\x96\xd4\x64\xe3\x45\xa2\x10\xf4\x71\xab\x63\xbb\xef\xdf\x45\x1b\xf5\xf9\xa7\x19\x29\xd5\xa0\xd2\xa5\x7a\x76\x14\xbf\x90\xda\x0d\x06\x2c\x3f\x7c\x93\xaf\x95\x06\x2f\x15\x12\xaf\x70\x22\x27\xa5\x84\x69\x1d\x24\xc3\x90\xb9\x75\x30\x14\x20\x0f\x26\x3f\x5c\xa0\x49\x9d\x32\xb3\x88\xa8\x38\x05\x20\x27\x9e\x43\xbb\xbd\x46\x69\x6d\xc5\x28\x27\x3e\x8f\x44\x64\xb8\xb1\x25\xf7\xdf\xdd\x37\x2a\x38\x9f\x32\x20\xc8\xa7\x9d\x28\x2d\x51\x31\xf2\x61\x37\x5d\x69\x89\x4a\xbf\x1d\x20\x58\xbe\x91\x5e\xc9\x3f\xd8\x93\x9b\x1b\x7e\xd0\x9c\xc8\x41\x38\x67\xf6\x30\x66\x9c\x5c\x14\xcc\xd8\x23\x4c\x5e\x9a\x92\xf7\xeb\xe5\x52\x18\x83\x92\xa4\x04\x67\x6c\x61\x59\x86\x35\x55\xc4\x7c\x0d\xfe\x0d\xd9\xe3\x3f\xd4\xc0\x78\xba\xff\xac\x19\x3a\x35\xdc\x51\x75\xce\x11\xf2\x38\xb5\x58\x40\x74\x36\x55\x65\xef\xea\x2a\x97\x6a\xbe\x06\xbd\x82\x35\x3c\x7e\x9c\xcc\x5b\x99\xeb\x8c\x8c\xbb\x86\x6a\xff\x18\x9f\x63\xc1\xd8\x78\xbe\x4f\x4d\xf6\x6e\x96\x06\x5f\x3a\x8e\xb8\x08\x6f\x45\x3d\xd8\x71\x6a\x5b\xee\xe1\x60\x3f\x6f\x9e\xc8\x88\x1c\x9f\x2f\xe3\xac\x95\x66\xda\xea\xe1\xdb\x9b\xab\xa3\x28\xfa\x46\xe7\x68\x21\xca\x25\x4b\x96\x07\x47\xb5\x53\x74\xe0\x27\x6e\xae\xf8\x0a\x6d\x66\x2f\x62\xc9\x86\x95\x18\x0b\x59\x74\xad\xcb\x72\xf1\x83\x46\xa7\xab\x03\x50\x9b\x95\xd6\xd2\x8f\x3c\x53\xf9\x42\x56\x3d\x7e\x21\x66\x52\x31\x53\xe4\x39\x69\x2f\xa4\x5e\xb5\xf5\x72\xbb\xdf\xf6\xeb\x18\xd9\x45\xc7\x19\x6e\x4e\xa4\x91\x01\x97\xb1\xe3\x93\x5f\xcf\x69\x4a\x7c\x34\xf3\x6a\xe8\x0f\xb4\x3b\xde\x5d\x10\x4f\x39\x4c\x98\xa5\x13\xb6\xfa\x47\x25\xd7\x95\x3d\x6b\x75\x69\x39\x5f\xc5\xc3\x85\xf9\x01\xca\xe0\xf8\x19\x9f\x1d\xb9\x37\x5c\xb4\x2a\x78\x3b\x59\x2e\xea\x4a\x56\xdf\xf2\x03\x8f\x43\x09\x05\xe3\x88\x86\xe1\xb3\xca\x21\x19\x25\x24\x4d\x39\x04\x19\xb3\xce\x28\x65\x5c\x87\xb2\x68\xc2\x3c\x77\xb9\x6a\x86\xca\xe0\x60\x31\x31\x22\x24\x6d\x8f\xc3\x8c\x81\x77\xa0\xbd\x4c\xb1\xcc\xa8\x88\xc6\xe3\x77\x00\x1e\x28\x42\xed\x89\x0a\x7a\xcf\xac\x45\xb9\x42\xdc\xbc\x3c\x4f\xe1\xe7\x9e\xec\xfc\x78\x00\x1e\x26\x4b\xc0\x3b\x90\x79\xb3\x95\x2c\x6b\xab\xbb\xf8\xe8\x9d\x3d\x7f\x91\x51\xb2\x34\xcb\x5e\x51\xae\x9e\xb9\xaa\xea\x67\xab\x6d\x4e\xaa\x65\xf7\x2d\xf5\x46\x66\x24\xda\xb5\xf7\x44\xec\xbb\x63\x8f\x46\x7d\x26\xaa\x65\xe8\xa5\x27\xcd\xf9\x8c\xa2\xb8\x13\x13\xf5\x12\x1c\xef\x28\xc3\xdc\xfd\xb8\x10\x55\xbd\x81\x23\xe1\x9f\x85\xec\x36\x89\xf1\x4c\x59\x86\x31\xad\xf8\xb0\x36\xa6\xd5\x94\x58\x0e\x41\x5c\xab\x07\xe4\xf3\xb5\x4c\x02\x5c\x49\x80\xa2\x26\x2a\x2e\xc0\x07\x6d\x47\x5d\x04\x6b\x15\xd8\x2c\x6b\x59\xa2\xfc\x31\x4b\x94\xbc\xe2\xb8\x14\x3c\xc3\x1c\x34\xac\x28\x9e\xc2\x42\x3c\x05\x5c\x16\x40\x1b\xa7\x3d\xd0\x47\xee\x71\x0e\x56\x30\x7f\xaa\x97\x9f\x7f\x5a\xd9\xd1\xfa\x78\xe9\xf0\x15\xe3\xef\xba\x61\x0d\x6a\x93\xbe\x08\xa3\x03\x9b\x92\xe8\x19\x80\xa4\xc0\x3b\xec\x4f\x99\x23\xa8\x8e\xa5\xe6\x0e\xb4\x23\xdc\x63\x74\x9d\x2e\xd1\xe9\x95\xb1\xd8\xeb\x06\xfb\x16\x45\x18\x2c\x63\x7c\x5c\x19\x46\x8f\xf9\xe1\xcb\xd4\xc8\xb2\x32\x00\xd5\x62\x1d\xb9\x1f\xa3\x98\x31\xae\x4e\x2a\xbd\x84\x83\xc5\x13\x97\xb3\x61\x42\xa7\x67\x75\x9f\x9a\x6f\x75\x2d\x3e\x40\xcf\x8f\x7d\x23\x17\xe4\xc8\x3d\xfc\x3a\xba\x0c\x02\xd9\x75\xd7\x88\x8d\xf1\xa4\x72\x4a\x93\xe1\x93\xf9\xba\xae\x3e\xc1\x84\x98\xcb\x2e\xa1\x9d\x83\x5f\x72\x4b\xd5\x12\xce\x43\xe2\xdd\xb5\xcf\xdd\x80\x77\x17\x29\xf7\x56\xce\x4a\xbb\x43\xc6\xb2\x33\x59\x66\xcc\x0b\x1e\xda\x3e\xa2\x7c\xf4\x3d\xa4\x59\xac\x88\xdb\xe3\x9b\x78\x96\x22\xa3\xa8\x19\x6a\x80\x5b\x75\xbb\x59\x0a\xbd\xc2\x98\x4a\xac\x2d\xa2\x3e\x63\x2f\x5c\x70\x9e\x89\x9a\x0c\xca\x92\xc2\x63\xde\x5d\x81\xb1\xf5\x60\x9b\x44\x36\xdc\x8b\x27\x6d\xb8\x34\x7b\xe5\x31\x6f\x5b\x77\xae\x0b\x31\xa6\x8e\x60\xfc\xa7\xda\x7c\xfe\xb1\xfa\xe4\x72\x1f\x30\x32\x8b\xbe\x3e\x4b\x28\xb0\x30\x57\xb2\x94\xf6\x58\xc8\xd8\x9c\x77\x1a\x22\xd8\x01\x1d\x5e\x9c\xc4\x7b\x1e\x79\x82\x1f\x37\x05\x19\x32\x17\x94\x9d\x2e\x74\xe0\xfc\x0b\xd1\xa2\x4c\xf0\x07\xb9\x90\x76\xf2\xfd\xa6\x2f\x2a\xf8\xd9\xb2\x48\xb1\x69\x2a\xed\x2d\x81\x01\x62\x04\xe2\xf6\x56\x33\x7f\x62\x95\x76\x22\xa8\x7f\x59\xdd\x0d\xce\x5d\x30\x35\xe2\x20\x05\xce\x80\xbd\x91\x62\xbe\xae\x9c\xca\xfb\x3f\xff\x87\x27\xfa\xf3\x84\x75\xe8\xd8\xbb\xd5\x16\x48\xe9\x5e\x7f\x49\x32\x06\xdb\xb3\xff\xfc\x67\xed\x7f\x9b\x18\xec\x97\x6d\x39\x6a\x58\x02\x37\x3d\xec\x29\x7b\x72\x4f\xb9\xdf\x53\xe7\x9b\xfa\x3d\xbc\x41\x60\xad\xcc\x80\x68\x92\x9f\xc2\xe4\xcf\x1e\x73\x11\xb1\xc7\x5c\x44\xfc\x67\xba\x88\xd8\x63\x2e\x22\xbe\xc7\x45\xf4\xd2\xfb\x30\xcd\x7c\x9d\xd7\xc6\x20\xff\x78\xaf\x9a\x5e\x56\x10\x51\xf8\x6d\xfb\xd9\xbf\xa2\x01\xe8\x74\x6e\xea\xd8\xaa\xb4\xcf\x08\xb0\xbb\xd4\x9f\xd1\xa0\x24\x87\xe8\x53\xd2\x44\x3e\xe9\x6e\x1f\xe1\x1e\x3f\x92\x25\xc8\xbe\xe4\x84\xdc\x39\x48\x2b\x2f\x57\x9f\x0a\xe0\xf8\x3c\x00\xe7\x7a\x10\xda\x0a\x70\x74\x85\xae\xa4\xd5\xdb\xe9\x86\x7e\x07\xe9\x9b\xa5\x5a\x56\x52\xb3\x99\xd7\xa3\xcd\x4a\x6e\x3e\xff\xf8\xf9\x5f\x23\xab\xaf\x58\x6b\x89\xfe\x2a\xe0\x43\x25\xef\x6b\x2d\xd6\x9b\x66\x8e\xd2\x4c\x5a\x33\x08\x12\xf2\xac\x50\x02\x09\x41\x19\x73\x95\x0b\x28\x0e\x92\xe4\x9a\x5b\x4d\x28\xa9\xf8\x67\xcd\x37\x52\x81\x47\x97\x36\x81\xe2\xd3\x45\xb9\xd0\xa8\x9d\xa5\x31\xef\xd8\x7b\xc3\xdf\xc8\x65\xbd\xd2\xca\x18\x89\xae\x9a\xd4\x1a\x9b\xe5\x02\xf8\xdc\xa7\x9a\xa3\xf2\xc7\x4d\xb1\xa3\xbc\x8c\x28\xb6\x69\x95\x0f\xcf\xcc\x52\x4f\x09\x6b\x85\x68\x31\x2f\xf1\x9d\xa8\xb7\xd5\x31\x2c\xa2\x0f\xe1\x50\x63\xb6\x12\x82\xba\xde\xed\x8f\x3e\x70\x3b\x21\xfa\x94\x74\x5a\xf5\x04\x1e\xb4\x54\xbf\x2b\xb6\x4a\xc6\x6f\x3c\xc7\x28\xfc\xa5\x5c\xe7\x56\x55\x00\x37\x02\x7c\xf6\x35\xe4\xf8\xdb\xbf\x45\xd1\x64\x1c\x0e\x34\x00\xd8\x3d\xb5\xb2\x3a\x46\x61\x75\x0c\xf4\x10\xfa\x58\xb3\x76\xf9\x65\x8d\x80\x79\x08\x91\xdd\xe5\x9f\x7f\xb4\xa7\x65\xb8\x2e\xa5\xb5\xe7\xe8\x60\x40\x4a\x41\x38\xfe\xc9\xde\x67\x00\x70\xba\x71\xec\x9a\x75\x18\xe2\xd9\x93\xbc\x3a\x8a\x3d\xba\x78\x15\x2c\x8b\x61\xa6\x65\x3b\xd0\x98\x46\x82\xda\x47\x38\xdc\x44\x6f\x21\xdf\x17\xda\x5e\x61\x51\x7d\xe2\x67\xc1\xad\x55\xf5\x78\x7f\xe6\xf2\x43\x7f\x90\xaa\xda\xd6\xfa\xae\x72\xc9\xbf\xc1\x48\xb6\xba\x1c\xd0\xd8\xa7\xba\x29\xbd\xc0\x08\x3e\x23\x46\x10\xa7\x2e\xb5\x92\x74\x3a\xb3\x97\x1a\xf7\x0b\xd8\x0a\xfb\xa1\x5e\x09\xbd\x4a\x6e\x1b\x6d\x0c\x46\xdb\x55\xd7\xf0\xee\x02\x62\xa8\x40\xc9\x16\x57\xe3\x71\x0a\x53\x67\x30\x34\xe8\x73\x8e\x03\x2f\x54\x29\xef\xaa\x3d\x69\x47\x94\x5b\x78\x6b\x19\x94\xd7\x4d\xed\x0c\x51\xf1\xff\xef\x33\x24\x0a\x71\x7e\x46\x1f\xb1\x74\x7d\x94\x83\x7f\xcd\xdf\x48\x69\x65\xa0\x13\x19\xf4\xa2\x5d\xf7\x0f\xf5\x4e\x2d\x24\xf8\x4e\xed\x95\x45\xde\x0e\x99\x1d\xdf\xc9\x32\xa7\xec\x02\x7b\x74\x41\x9f\xda\xa2\xfc\x26\x87\x6e\x73\x71\x1c\x2c\x99\x90\x0f\xc4\x1c\x60\x1b\xee\x60\x34\x09\x1c\x70\x1f\x91\x88\x29\x5f\x04\x3a\xa2\x05\x53\xee\x73\xc5\x8d\x3b\xd3\x63\x42\x46\x28\x6b\xca\xea\x59\x2e\xd5\x2c\x8a\x77\xd7\x7a\x26\x4b\x98\x7c\x4a\xb9\x6f\xf8\x3b\xb1\xac\x5c\x82\xc5\x5b\x4c\x6c\xce\x2d\x57\xf5\xb4\xba\x04\xde\x66\x0d\x1f\xf0\x8e\x93\x55\x9b\xce\x9b\xaf\xc5\x32\x39\x19\x3e\xf2\xa6\xeb\xd2\x79\xaa\x98\x51\x92\xff\x45\x6a\x5d\x69\x45\x79\x69\x96\x28\x74\x46\x60\xee\x55\xe5\xcf\x37\x2a\x5f\xd4\x67\x02\x2c\x98\x88\x6a\x6e\xd2\xc0\x77\x91\xe5\xc1\x02\x9c\xf3\x95\xbf\x87\x50\x6d\xde\x10\xa9\xe4\x5b\x05\x57\x11\xf3\x92\x4f\xd4\x9f\xff\x15\xe8\x37\x6b\xec\xf6\x2a\x72\xa3\xc6\x19\x83\x56\x2e\xb8\x5b\x8b\xe4\x77\x39\xb6\x8d\x0b\x66\xf7\xce\x45\x0f\xec\xb9\x37\x05\xf8\x0f\x92\xec\x43\x3c\xd8\xf2\xa3\x32\x15\x46\x50\xfc\xbc\x12\xe9\x3b\xb6\x1a\x66\x94\x3b\xe4\x36\xf0\x4f\xa8\x51\x58\xbd\x19\x94\x3a\x32\x85\x71\xeb\x2e\x62\x66\x84\x3a\x2a\x18\x40\x98\x8d\xf3\x49\x49\xa8\xc6\x48\xd7\xc2\xbb\xd7\xd2\x63\x2e\x8d\x15\x27\x1c\x05\x1d\xb8\x0f\x03\xc3\x2c\x3a\x86\xa3\x49\x45\x1b\xe8\x55\x00\xab\x52\x7c\xfe\xd1\x72\xcf\x49\x12\xdc\xa4\x12\x81\xb5\x54\x55\x16\x2f\x2c\x23\x5b\x46\x53\xf2\x3d\x08\xa7\x96\x6d\xed\x6e\x03\x5c\x9e\x2b\x3a\xce\xa8\xba\xf7\xb5\xd9\x96\xf5\x7c\xcd\xd1\xe8\x44\xaf\x8c\xda\x78\x47\xe4\xba\xab\x6a\x80\xe3\xb9\xcf\xa2\x65\xce\xac\x3e\x3b\xf3\x29\x6e\x79\x65\x20\x37\x9c\xd2\xdb\x22\x6f\x07\xca\x38\xcb\x8a\x28\x8d\xff\x49\x2e\x63\x4f\xc0\x1d\xba\x94\x28\x75\xc0\x71\x42\xd0\xfe\xc8\xd9\xd1\xf1\x1e\x25\x6a\x4b\x05\x96\x14\x28\x00\xc1\xe9\x3a\x8c\x73\xd2\xe2\xa0\xa5\xd7\x99\x81\xff\xe6\x3e\xcc\xd0\xca\xa1\xf1\xb7\x2b\xa2\xa8\x54\x9a\x75\x7a\x45\x9e\x37\x8e\xdf\xbd\x5f\xb6\x8c\xf6\xba\x51\xed\x20\x9c\x2f\x87\x3c\x47\x9f\x6a\xac\x21\x61\x03\x03\x5b\xe0\x54\x7f\xc8\x9f\xb2\x5c\x58\x83\x22\xac\x16\xe8\x9d\xdb\xb4\xed\xbf\xae\x94\xa6\x58\x19\x16\x4e\x1d\x70\xf9\xee\x5e\x19\x07\x9f\x36\xcd\x06\x29\x4b\xf9\xa1\x52\x5b\x29\x06\x3a\x41\x28\xf3\x29\x19\x3a\x55\x36\xe2\xf3\xbf\x82\xf8\x6d\xfa\x6a\xda\x2f\x5b\x0e\x08\xc7\x17\xca\xa2\xaa\x4f\xf7\x45\x59\xfa\x63\xc1\xfe\x2a\x57\x94\xeb\xd7\x2f\x2b\x50\x76\xd6\x2a\x52\x76\xe0\xa5\x1d\xb0\x45\x94\xa9\x5b\x61\xcc\xae\x28\x2b\xd0\x14\x3e\xff\x04\x69\xb4\xa4\x15\x84\x5b\x66\x99\xba\x4f\x91\xf0\xca\x8e\x26\xb3\x7c\xa8\xab\x52\x68\xe7\x8b\x73\xd9\x6f\x26\x2e\x66\x6a\x2c\x92\xd9\xed\x46\xf7\x69\xc2\x95\x5e\x51\x92\x4a\x50\x0b\xda\xfc\x48\x39\x2d\x1f\x8d\x99\x92\x12\xc8\x56\x39\xd2\x93\x4f\x28\x77\x53\xcc\x56\x12\x6c\x82\x1e\x7f\x63\x77\x9a\x5d\xe2\x09\xa5\x4c\x07\x8e\x51\xa9\x58\xbb\x82\xd2\x1a\x58\x03\x58\x42\x98\xf7\x99\xa1\xc6\x64\x17\x4e\xfc\x85\x66\x76\x2f\xcb\x1d\x70\x32\x2b\xc0\xa1\x44\x02\x31\xbf\xe0\x54\xf1\xf0\x31\xb8\x6b\xf9\x4c\x86\x1a\x2b\x14\xb6\x3d\x3e\xc0\x4a\x27\x0c\xd9\x59\x73\xb6\x98\xaf\x51\xc7\x31\xf3\xb5\x92\x0b\x09\x01\x7c\x57\x1a\x16\x5e\xb7\x64\x5c\x49\xf0\x80\x78\xdf\x32\xe8\xf0\xee\x9b\x0c\x6d\xc0\x37\x56\x74\x53\x39\x81\xd3\x71\x0c\xff\x41\xc9\x1c\x5c\xfe\x58\xf3\x62\xe2\x4c\x09\xb1\x41\x0f\xb4\x8e\x93\x8f\x99\x82\xb3\x77\x67\xef\x28\x9f\x95\x4a\xaf\x9c\x75\x78\xe1\xdf\x2c\x05\xee\xda\x53\xf9\xef\xe8\xf9\xa1\xb8\x60\xa4\xd5\x7e\x50\xe5\x1d\x48\x35\x59\xa7\x19\x13\x71\xaa\xd2\x5f\x4a\xb1\xac\xb8\x91\x68\x2d\x9a\xc2\x5e\x3d\x20\x6f\x62\x42\x81\x50\xfd\x54\x6f\xea\x6a\x26\x4a\x70\xfe\xf2\xeb\xbd\xa3\x92\x3f\x0a\xd3\x80\x4a\xef\x09\x31\xf6\x52\x77\x65\x59\x31\x17\x0c\x84\x98\xa2\xdd\x10\xe0\xe4\xce\xab\xad\xeb\xcd\xa6\x5d\x10\x84\x35\x7a\xf1\xd2\x40\x4b\x75\x11\x31\x60\x7e\xe4\x50\xb5\x2c\x26\xa6\x0c\x27\xc2\x90\x36\x30\x41\x19\xc6\xd1\x75\xf0\x5d\xf2\x19\x7b\x47\xbd\x96\xe4\x63\x0b\x74\xd4\xde\x06\x9d\x80\x04\xf4\x4c\xae\x65\xbe\x94\x1c\xcb\xe1\x80\x8d\xfb\xd8\x46\x34\x3b\x22\x50\x48\x71\xbf\x87\x6a\xb2\xb5\x33\x86\xa3\x82\x1a\x27\x46\xbc\x68\xee\x4e\x6d\x8a\x6e\xf2\x6f\x95\x7a\x1a\x67\xc1\x9e\xf0\xbe\xf7\x4c\x90\xb3\x00\xfe\xd6\x6f\x46\x26\x97\x54\x40\x46\x27\xd8\x39\x16\xf0\xed\x5a\xaf\x7a\x8c\xf5\x41\xca\x7f\xcb\x3f\x80\xcd\xe3\x58\x04\x89\x43\x19\xa5\x90\x7f\xd1\x5d\xf8\xdf\x18\xbb\xdd\x44\xb9\xbe\x96\xa0\x7b\xec\x5e\x90\x59\x51\xad\x55\x86\x6c\x4a\x6e\xb6\xcb\x62\x9d\x53\x64\x39\x58\xc3\xf6\x90\x3a\x8f\xc5\xa6\x99\x10\x17\x0d\xe9\x62\x58\x08\x2d\x75\x70\xee\xc1\x25\x0e\xcf\x8f\xf8\xd9\xc9\x7f\xfe\xeb\x5f\xff\x0b\xff\xcf\xd7\x62\x83\x56\x7c\xa2\xd8\x99\xff\x82\xe5\x51\x26\xce\x8a\x81\xcb\x8d\x47\x25\x2c\xcb\xf9\x79\xda\x05\x58\x31\x8d\xd8\x1e\x7e\x91\x06\xaf\x71\x6f\x23\x45\x10\xbe\xd8\x0a\x3f\xfa\x9c\xc8\xa6\xe3\xb9\x77\xf0\x47\x81\xfe\xef\xf8\xd3\x7b\x36\xba\xbc\xfa\xd5\x11\xff\xd2\x9f\xc7\xeb\xff\x4f\x4f\x9e\x9f\xb4\xea\xff\x5f\xbe\x38\xf9\xa3\xfe\xff\xf7\xf8\x89\x18\xca\xfc\x88\xff\xc3\x42\x54\xd2\xfc\x63\xc6\xff\x21\xfc\xfe\x1d\xa0\xd8\xfc\x23\x3f\xfc\x87\xdb\xf1\xd5\xff\x2e\x37\x42\xe5\xff\x78\x94\x31\x6c\x88\x37\xa6\x06\xc4\xfc\xb2\xd0\x15\x07\x3e\xf4\x0f\xed\xdf\xfd\x23\x21\x98\xc2\x2f\xa2\xaa\x7b\x9f\x0b\xc1\x42\x7a\xc3\x64\x78\xc5\xa1\x4e\x1c\x1e\xf6\xe8\x9d\xdf\x05\x18\xc2\x1e\x63\xd3\x75\x78\x19\xfa\x01\x58\x5d\x7b\x61\x0d\xb7\x62\x47\x3d\x84\x21\x29\xab\x88\xfa\x53\xc2\x7c\x05\xbf\xec\xff\x13\x17\xd5\xb7\x8e\x17\x99\x79\xa9\xb6\x95\xe9\x19\x95\x43\x3a\xc4\xe8\xf2\x8a\xc1\x14\x6e\x06\xd7\xfc\x72\x74\x3d\xe5\x57\xc3\xf3\xc1\xf5\x64\x00\xe5\x3c\x6e\x0a\xfc\x98\x9f\x7d\xcd\x2f\xe5\xac\xac\x45\xf9\xc0\xcf\x4e\x4e\xbe\x61\xec\x66\x3c\xe8\xbf\x7f\x73\x35\xb0\xd3\x93\x7c\x55\x58\xfd\x9a\xc0\x6f\x5a\x0b\xe2\x87\xa3\xcb\xab\x23\xc0\x4f\x03\xb4\x68\xb5\x81\x3e\xa7\x7c\x57\x94\xf9\x62\xa7\x20\x8b\xee\x5e\xe6\xc5\x76\x23\x35\x80\x5a\xcf\x8b\x3c\x17\xb3\x82\xba\x18\x2d\xed\x50\xdb\xb2\xf8\xab\x9c\x03\xc0\x4d\xc1\x4d\xbd\xdd\x16\x98\x6c\x82\x7f\xc5\xc6\x3b\x85\xe6\x72\xb9\x2c\xa8\xd9\x8f\x98\x8b\x85\xdc\xa8\x39\x34\xd9\xca\x95\x5e\xd5\xca\x54\x6a\xce\xa9\x1b\x24\x74\x24\x41\xec\xbf\xc2\x41\xe7\x71\x61\x2d\x32\x84\x22\x2e\xb6\x60\x9f\x89\x8d\x84\x24\x1a\xdf\x2f\xdf\x7e\x0f\x9b\xe5\xcc\x00\x86\xb8\xa4\x6e\x3c\x6a\x43\xdd\x19\x28\x7b\x46\xcb\xd2\xac\xd5\x16\x77\x82\x9a\x57\x22\xb1\x46\x97\x57\xd8\x34\xc5\x44\x50\x2e\x72\xc1\x71\x64\xc4\x65\xae\xa1\x23\xb7\xa9\xea\x05\xb4\xa9\xf1\xe8\x3a\xd8\x74\x2f\x42\x20\x62\x76\xc2\xf9\x03\xf6\xce\xd0\x2b\x6a\x00\xf8\xe0\xc1\xea\x4c\x91\x3b\x7c\xdc\x8d\x91\xf9\xbd\x6b\xd9\x0e\x1f\x6b\x74\x15\x64\x8d\x0c\x2b\x93\x71\x6a\x4a\x3f\xab\xf5\x22\xb7\x13\x91\x9b\x99\x5c\x2c\xec\x7f\x25\xb3\x20\x84\x1a\xfc\x9a\x5d\x31\xf4\x55\x34\xee\xf0\xa7\xc8\x84\xd8\x31\x99\xae\x8d\x16\x1b\xe9\xfb\x89\x72\xd7\xe8\xa2\x39\x91\x1e\xf3\x73\x46\xf8\x27\xff\x77\x93\xb9\x56\x2b\x30\x59\xc2\x2c\x26\x4c\xad\x45\xd4\x6c\x0c\x1b\x2e\x55\x0f\x5b\x68\xe7\x93\xbb\x06\x07\xd3\xd0\x92\x14\x90\x9e\x97\x45\x19\x36\x02\x91\xa8\x63\x80\xdd\xbc\xd1\xa5\x8a\x79\x10\x20\xfb\x0d\x87\x6e\x85\xe7\xd1\x7e\xde\x23\x9c\xe3\x98\x08\xfe\x04\x9d\xb7\xfc\x02\xac\xde\x32\xb8\x1c\x5e\x0f\xa7\xc3\xd1\xf5\x84\xb1\x83\x84\x71\x1c\x60\xef\xe7\x00\xbb\x24\x2b\xc4\x2e\xcc\xa5\x09\xcb\x24\x34\xae\x26\x1f\x3b\x34\x47\xac\x63\xf2\x00\xc4\x9d\x4b\x51\x42\xdf\xf3\xf2\x0e\xd3\xb3\x4c\x6d\x2d\x4e\x60\x36\x04\x38\x0a\x5d\x5c\xa9\xbd\x36\xc2\x3a\xb1\x59\xad\xf2\x05\x27\x3e\x82\x5b\x11\xb7\xbc\xee\x31\x76\xd0\xe6\x88\xf1\x1a\x2c\x99\x70\xcf\xa9\x5f\x52\xf8\x38\x21\xdc\x27\xb0\x62\xcc\x77\x4e\x38\x34\x47\x76\xf4\x51\xa9\x56\x4a\x8b\xdc\xf1\xc8\x26\x7d\xe6\xd4\x7b\x03\xe1\xcb\x52\x1e\x3c\x2f\x36\x5b\x6b\x70\x55\xd0\x33\x35\x3e\xbe\xfb\xe9\x67\xbf\xf9\xde\xdd\xbe\x8e\x6f\xc2\xb6\x87\xd3\xea\x5a\x92\x8a\x05\x82\xef\x17\x19\xe2\x3c\x51\xeb\x28\x06\x6d\xb8\x54\x85\x28\xf9\xff\xcf\xff\xf1\x7f\xf9\x5c\x3b\x4c\xbb\xc3\x04\x39\xfb\x7b\x38\xb2\x4b\x5a\x92\x9f\xb6\xe3\xb0\x44\x04\xc7\xa5\x33\xfb\xc9\xb9\xb5\x05\xec\xb0\x98\xd8\x6c\xa8\x5d\x90\x65\x94\xee\x10\xa6\xe4\x00\x74\x31\x2d\x77\x5c\xea\x7b\x55\x16\x9a\x70\xd9\x0e\xfa\xd0\x31\xb1\xbd\x48\xa3\x56\xda\x5e\x33\x69\x3f\x23\xed\x7f\xb9\x0a\x6d\xfb\xdf\xe8\x5c\x99\x8b\x1c\xf1\xb7\x4a\xbb\x5a\xbc\x73\x5b\x8c\x28\xef\xd6\x05\x64\x14\x3a\x9a\xd3\x86\x25\x73\xea\x31\x76\x33\x18\xbf\x1f\x4e\x26\xc3\xd1\x35\xff\x5f\xf9\xf9\xe8\xfa\xc2\xdd\x8b\x9b\x00\xaa\x09\x18\xf6\xa5\x9c\x3d\x38\x2c\xeb\x0c\xf9\xb6\x15\x1d\x90\x56\x98\xb9\x59\xd3\xb7\xb1\x9b\x35\x76\x66\xb3\x67\xcb\x01\xe2\x25\x1f\x87\x97\x00\x74\xce\xf2\xdd\x07\x87\x3d\xb7\x91\x30\x20\x70\x3e\x87\x41\x97\xb2\x3f\xea\xe3\x28\xf3\x3c\x65\xd4\xb5\xf6\xff\x04\x99\xed\xf7\xaf\xf1\xd9\xa8\xe1\x46\xb5\x96\x2c\xb4\xb4\x0e\xd8\x5e\xdf\x32\x76\x7a\xc4\xaf\x09\xda\xaf\xbd\x97\xda\x75\x33\x58\x42\xfb\x76\xa5\x17\xea\x5e\x2d\x6a\x91\x47\xa7\x07\x8a\x8a\xfd\xd1\x29\x4a\xde\x3c\xd7\x00\x92\x8b\x72\x8d\xa4\x86\xaa\x8c\xcc\x97\x3d\xc6\xce\x8e\xfc\x9b\xbc\xeb\xcd\xce\x95\xb9\xd1\xbc\xf4\x48\x25\x57\x53\x66\xf0\x58\x66\x34\xe1\x6c\x01\x3f\x9e\xe0\xf8\x28\x2b\xd5\x77\xb6\x60\x01\x85\xd0\x41\xa0\xb9\xbe\x0b\x31\x9f\x37\xd2\x89\x33\xe2\x6d\x0b\x07\x95\x88\xcd\x15\xf4\xe2\x58\xe4\x85\x96\x0c\x80\x1a\x09\xc7\x6e\x5d\x6f\x84\x3e\x2e\xa5\x58\x80\x5e\x85\xa0\xb7\x86\xae\x2b\xcc\x60\xbb\x2d\x8b\x6d\xa9\x10\x98\x19\xb0\x00\xfc\xe3\x6c\x23\x2b\x01\x80\xb6\x4b\x25\xf3\x05\x42\xf6\xfb\x7e\xd8\xa5\x03\x29\x44\x66\x9e\x48\xf0\xc2\x48\xf7\x0e\xce\x99\x49\x61\x54\xfe\x00\xcd\xdf\x03\xc3\xaa\x8d\x2c\x7b\x8c\x3d\x3f\xe2\xd7\x45\x6b\x53\xf6\xef\x49\x4d\x0d\xb3\xdb\xac\x1a\x25\x06\x60\xe1\xca\x8f\xdb\x5c\xcd\x55\x05\xf7\xb9\x92\x3a\x46\xb5\x8d\x3a\xe4\x78\x20\xc8\x12\x3b\x39\x03\xdf\xf3\x8c\x94\x21\x23\x25\xb9\x12\x35\x58\xe6\x85\xce\x1f\x7c\x83\x2e\xe2\x05\xdb\x52\x6d\x80\x20\x76\x3a\xd0\x14\x5d\x18\xea\x6c\x87\xfd\xc6\xfc\xa2\xad\xd4\x7c\x71\x04\xd2\x5b\xe3\xb4\x43\xe7\xa6\x16\x0f\x77\x98\x8b\xc8\xd8\xa2\x67\x13\xca\x30\xec\x29\x41\x1a\x84\x6b\xd4\xb6\x2d\x8b\x4d\x51\xd9\xfb\xaf\x17\x45\x49\x9d\x94\x16\xf7\xb2\xac\x14\xe5\x58\x37\xc9\x9e\x11\x9c\x1f\x83\x7e\x5f\x77\xba\xd8\xe5\x72\xb1\x92\x44\x25\xed\x1b\x96\x3c\x31\x67\x3c\xc2\xd1\xa4\x19\x74\x3e\x42\x08\x6a\x55\x3e\xb6\x3d\x3d\xc6\x5e\x22\x6d\x1a\x8c\xc6\xb3\x23\x68\xf7\xe1\xfe\x95\x75\x09\xa1\x0c\x53\xc9\x67\x32\x91\x93\xd8\x18\x23\x7f\xe8\x50\x89\x50\x97\xf6\x0d\x43\x66\xb2\x8d\x93\xc9\xa2\xce\xa2\x7f\x9f\xfe\xc5\xda\xb8\x96\x4f\xe8\x5f\x4d\x31\x33\xb5\x62\xe6\xba\x6f\x65\x4b\xc3\xc2\x9a\xc9\x79\x61\xf5\x13\x5d\xe7\xd8\xa9\x0d\xa0\x30\xd5\x32\x16\xc9\xd8\xac\x3e\xee\xc1\x4e\x0a\xec\x06\x42\xfa\x17\xc3\xc9\xf9\x55\x7f\xf8\x7e\x30\x66\x6c\xfa\x6e\x80\xa6\xd5\x64\x74\x39\xfd\xd0\x1f\x0f\xf8\x70\xc2\x6f\xc6\xa3\xef\x86\x17\x83\x0b\x7e\xd0\x9f\xf0\xe1\xe4\x20\xe3\x1f\x86\xd3\x77\xa3\xdb\x29\xff\xd0\x1f\x8f\xfb\xd7\xd3\xef\xf9\xe8\x92\xf7\xaf\xbf\xe7\x7f\x19\x5e\x5f\x64\x7c\xf0\xcf\x37\xe3\xc1\x64\xc2\x46\x63\x3e\x7c\x7f\x73\x35\x1c\x5c\x64\x7c\x78\x7d\x7e\x75\x7b\x31\xbc\x7e\xcb\xdf\xdc\x4e\xf9\xf5\xc8\x1a\x6f\xef\x87\xd3\xc1\x05\x9f\x8e\xe0\x55\x1a\x6a\x38\x98\xd8\xc1\xde\x0f\xc6\xe7\xef\xfa\xd7\xd3\xfe\x9b\xe1\xd5\x70\xfa\x7d\xc6\x2e\x87\xd3\xeb\xc1\x64\xc2\x2f\x47\x63\xde\xe7\x37\xfd\xf1\x74\x78\x7e\x7b\xd5\x1f\xf3\x9b\xdb\xf1\xcd\x68\x32\xe0\xfd\xeb\x0b\x7e\x3d\xba\x1e\x5e\x5f\x8e\x87\xd7\x6f\x07\xef\x07\xd7\x53\x3b\xd0\xf9\xe8\xe6\xfb\xf1\xf0\xed\xbb\x69\xc6\x6f\xfa\xd3\xc1\xf5\x34\x63\xd3\x71\xff\x62\xf0\xbe\x3f\xfe\x4b\xc6\x47\x63\x3e\x9a\xbe\x1b\x8c\x39\x3c\xd2\xe3\xc3\x6b\x7e\x3d\xe2\x83\xef\xec\xcb\x93\x77\xfd\xab\x2b\x6e\x09\xe2\xc7\xe0\xef\x46\x57\x17\x83\x31\x7f\x33\xe0\x57\xc3\xbe\xb5\x27\x61\x3a\xd7\xdf\x73\x20\x60\xc6\x2f\xfa\xef\xfb\x6f\xed\x0a\xdc\xb8\xf6\x31\x5c\x41\x44\x01\xfb\xc2\xdb\xc1\xf5\x60\xdc\xbf\xca\xf8\xe4\x66\x70\x3e\xec\x5f\x65\x6c\x78\x7d\x31\x1c\x0f\xce\xa7\xf0\xe4\xf0\x62\x70\x3d\xb5\x7f\x1e\x8d\xad\x5a\x31\x19\xfc\xd3\xed\xe0\x7a\x3a\xec\x5f\xb9\x4f\x64\xfc\xc3\xbb\x01\x7c\x62\x78\xcd\xfb\xd7\xbc\x7f\x0e\x48\xc1\xb0\xe2\xeb\xe9\xb8\x7f\x6e\x17\x3a\x1a\x4f\xfd\x54\x3e\x0c\x27\x83\x8c\xf7\xc7\xc3\x89\x9d\xc2\xe5\x78\xf4\x3e\xe3\x76\x0b\x47\x97\xb0\xc6\xdb\xc9\xc0\x3e\x3a\xbc\xa6\xf9\xda\x6d\xb1\xbf\x73\x07\x82\xf9\x03\x31\x1a\xc3\xdb\xb4\xc0\x8b\x41\xff\x6a\x78\xfd\x76\x62\xa7\xd1\x3a\x3c\x7f\x00\x7a\xfe\x3d\x3f\xbd\x67\xa3\xab\x8b\xfe\xcd\xf1\x59\xef\x4f\xff\x46\xf8\x9f\x27\x2f\xce\xce\xbe\x69\xe1\x7f\x7e\xf3\xf5\x1f\xfe\xbf\xdf\xe3\x67\x4a\xde\x29\x7b\x08\x1a\x15\x6e\xc1\xe3\x75\xd6\xfb\x53\xc6\x4f\xbf\xe1\xfd\x7a\x65\x85\xd9\xd9\xc9\xc9\x73\xc6\xc6\x32\xe9\x35\x06\xda\x7d\xd4\xa2\xdc\x7b\x3a\xa0\xd3\xaf\x31\xc5\x5c\x81\xfc\x49\x8c\x63\x7e\x78\x10\x70\x20\x33\x74\x29\x92\x4c\x2f\xea\x2a\x01\x10\xce\x40\xa0\x84\x96\x55\xa9\x2e\x8c\xfe\x84\xb6\x91\xc0\x40\xbf\x93\x54\xb3\x9b\x4e\xd9\x60\xcf\x78\xb4\xe5\x8b\x72\x83\x92\x9a\x3a\xe2\x07\xfd\xd9\x9b\xdb\x68\xdc\xa3\x3a\x6d\x32\x48\x8b\xef\x18\xd0\x29\xb0\xd1\x80\xdb\xb2\x58\xd4\x73\xd9\xd9\x06\x29\x1a\x9e\xc5\xc3\x3b\xd9\x6e\xa8\x6f\xb8\x5b\x50\xe6\xb5\xa0\xb0\xdc\x85\xef\x18\x4d\x1a\x38\x4b\x89\x4c\x56\x05\xaa\x19\xae\x15\x85\x09\x14\xf4\x5d\x3c\xe2\xc5\x64\xbe\x93\xc4\xf3\xf6\x3a\xb1\xa6\x0e\xad\x0e\x2e\x20\xf8\x27\x2a\xb5\x49\x80\xb9\x63\x60\xf3\xe4\x94\x5d\x16\xb5\x5e\x10\x46\x89\x78\xe0\xa5\xbc\x57\x46\xa6\xee\x18\xac\xa7\x53\x1b\xb0\xc8\xed\xff\xf7\xf8\x00\xfb\xa0\x61\xf3\x33\xa6\x10\x73\x1c\x5d\x98\x6b\x6a\xf1\xeb\x51\xd6\x75\xbd\x99\x59\x0d\xfb\xfb\x00\x9b\x8e\xe3\x7b\x95\x3f\x6a\xe9\xc2\x02\x7e\x3d\x7e\xdc\x7d\x04\x55\xc2\x16\x98\x39\x98\x64\xf5\x8c\x3a\xf9\x46\x4f\x2f\x59\xe4\xbb\xb4\x8b\x7e\x37\x9c\x74\xab\x38\x6f\xbe\x07\x31\x36\xba\x19\x5c\x23\x45\x46\xb7\xd7\x17\xa0\x78\x81\x86\x31\x9c\x4e\x50\xc0\x0e\xdf\xdc\x4e\x47\xe3\x09\xfb\x97\x7f\x01\x9d\xe8\xab\xaf\xe0\xcf\x56\xb2\x93\xf6\x33\xb8\xe0\x41\xff\x89\xb4\x9b\x48\x11\xc8\x9a\xba\x10\x9b\x8e\x32\xf8\x7c\xfb\xb5\x0e\xa5\x08\xbe\xb8\x4f\x2f\x62\x5e\x2f\x1a\x0f\xb8\xd7\xf0\x2e\xf6\xa9\x38\x1d\xeb\xcd\x5a\x8b\xcd\xac\x46\x67\x9f\xee\xdf\x4e\xdf\x8d\xc6\x87\x93\x23\xd0\x2e\x3e\x5c\x0f\xf0\xbf\x51\x93\xf0\x64\xf5\x5a\x12\x77\x5a\x52\x50\x70\xe8\xbf\x58\xac\xea\x38\x4d\x88\x0f\xfe\x79\xf0\xfe\xe6\xaa\x3f\xfe\x7e\xbf\xfa\xc3\x0f\xdb\x54\x64\x41\xa3\xcc\xec\x86\x9e\xdf\x8e\xbd\x1a\x38\xb9\x7d\x33\x99\x0e\xa7\xb7\xd3\x01\x7f\x3b\x1a\x5d\x80\x86\x36\x19\x8c\xbf\x1b\x9e\x0f\x26\xaf\xf9\xd5\x68\x02\x04\xbe\xb5\x2a\xd2\x45\x7f\xda\x87\x95\xde\x8c\x47\x97\xc3\xe9\xe4\xb5\x7d\xf6\xcd\xed\x64\x08\x74\x1e\x5e\x4f\x07\xe3\xf1\x2d\xf4\x65\x38\xe2\xef\x46\x1f\x06\xdf\x0d\xc6\xfc\xbc\x7f\x6b\x37\xdc\x6e\x08\x1c\x14\x38\x44\xa3\xb1\xd5\x8b\x59\xa4\x02\x46\x2a\x9b\xd7\xd2\xf8\x64\x3a\x1e\x9e\x4f\x63\x4d\xd1\x52\xd9\xaa\x6e\x61\x8d\xfc\x7a\xf0\xf6\x6a\xf8\x76\x70\x7d\x3e\x60\xb1\x42\x77\xe4\x15\xba\xe1\x35\x69\xd1\xdf\xb7\xb4\x3a\xfb\x9f\xd1\x71\xcf\x60\xf3\xf9\xf0\x92\xf5\x2f\xbe\x1b\xc2\x39\xc5\x87\x6f\x46\x93\xc9\x90\x8e\x16\x90\xec\xfc\x1d\x91\x9b\xd8\x04\x7a\x42\x9d\x51\x01\x96\x9e\xeb\x93\xd8\xec\xab\x10\x5b\x56\x60\x9c\x2a\xed\x0d\x51\xa5\x57\x49\xbb\xf6\xc8\x70\x45\xa7\xb1\xb0\x06\x5d\x8d\xd6\x2b\x72\x46\xea\x67\xef\x81\xff\x3d\xb3\x20\x71\xc4\x5c\x3b\xfb\x2c\x18\x98\xd0\x91\x34\x32\x33\xf9\x54\x55\xb9\xc4\x7e\x7f\x6e\xba\xad\xf1\xc0\xaa\x66\xa2\xc2\x32\x5f\xb5\x01\xb7\x35\x98\x75\xc0\x89\x5b\x0b\xed\x31\xe6\x99\xa7\x32\x5c\xf0\x52\xae\x00\x90\xdb\x4a\xbf\x52\x2c\xe4\x46\x94\x77\x71\xa8\xa9\xc1\x66\x7b\x8c\x05\x73\xfa\xf4\xd5\xab\x57\xc7\x56\x82\xf3\x3d\x4c\x39\xb3\xdc\x7e\x57\x14\x0b\x7e\xae\xaa\x87\x8c\x9f\x8b\x5c\x2d\x8b\x52\x2b\x91\xf1\xdb\x49\xbf\xc7\xfa\x79\xee\x7a\xf5\x39\x6f\x09\xf6\x96\x0d\xfd\x7d\x40\x0e\x34\x9a\x52\xc4\x42\x02\x1d\x7f\x2c\x11\x13\x91\x07\xe5\x0f\x95\xfe\x77\xfb\xe9\x3d\xbb\x50\x2b\x35\xae\x73\x79\x7c\x39\x9a\x4c\x42\x17\xc0\x5f\xd1\x1a\x78\x42\xff\xff\xfa\xe4\xe5\xcb\x66\xff\x9f\xd3\x93\xe7\x7f\xe8\xff\xbf\xc7\x8f\xdb\x7d\x3e\x29\x72\x54\xee\xbe\x32\xdc\x9e\x04\x1f\xa9\x0e\xad\x00\xa7\xbe\x67\xed\x79\x50\xb0\x19\xc2\x7d\x05\x78\x62\x82\xdc\x3c\x88\xba\xc4\x7f\x00\xa8\x87\x8d\x14\xda\x72\xaf\x46\x24\x13\x1a\xb7\x2c\xec\xeb\x8f\xf6\x0b\xe5\xb9\xd8\x65\xa0\x56\xc7\x4e\xb7\x16\xf0\x02\xc4\xa9\x35\x70\xf5\x4d\x51\x4a\x5c\x4a\x1f\xc7\x8b\x67\xd7\xfc\x7d\x98\x5e\x1a\xee\x26\xfb\x20\x58\x33\xe1\x95\xc4\x9b\x17\x05\x2c\x42\x57\x79\xab\xbe\xbb\xb6\x46\x92\x1b\x0a\xc2\x41\x96\x02\xc7\x0e\xb2\x34\x11\x47\xeb\x2b\x65\xaa\xde\x41\x34\xc3\x6b\x30\x07\xc2\xe4\xc8\x99\x0f\x8d\x72\x41\xe9\x6d\xef\x1f\x48\xc1\x48\x13\x97\xfc\x3c\x57\x12\x52\x0f\x66\xa5\x28\x2d\xeb\xb5\x36\x07\x7a\x01\x5d\x57\xbc\x47\x1f\xa7\x98\x45\xbb\xc9\x4f\xe7\xe1\x29\xca\x3d\xe7\x87\x28\x3f\xd4\x0b\xb9\x85\xdc\xc4\x2a\x39\x18\x10\x95\x8b\xe2\x26\x8d\xf3\x43\x81\x72\x72\x2a\xee\x05\xde\x00\x4d\x41\xe8\xb8\xb9\xf9\x0c\xdc\x92\x46\x2d\x40\x60\xaa\xe8\xf3\x18\xa3\xda\x8a\xd2\xe1\x91\xb8\xd3\x41\xa3\x05\xba\x3b\xfa\x74\xae\xb8\x45\x30\x98\x6a\x30\x8f\xa2\x9d\xc4\xf1\xcf\x7a\xbc\x8f\xbf\x4d\x8e\x13\x66\x7c\xc8\x92\x1f\x1e\x3c\x14\xf5\x81\xa5\xa4\xfd\x8f\xf2\xe0\xa8\xd9\xa2\x52\xb4\xa8\x93\x9a\xc3\xd0\xc3\x88\xec\xc4\xe6\x93\xd0\xc7\xd6\x6a\x1e\x44\xe7\x3d\xb1\x35\x0f\xe4\x67\x8d\xa8\x62\x26\x31\xa6\xf1\xf6\xe6\x0a\xce\x57\x9e\xbb\x36\xcb\x86\x9a\x07\xa5\x5b\x60\x1f\xf0\x1b\x7a\x18\x52\x2a\x92\x96\x40\xde\xd9\xef\xde\xf4\x41\x28\xba\x31\xcd\xa9\x1f\x36\x8d\x7e\x48\xfd\xa1\x49\x77\x34\x76\x6a\x1e\x35\x73\xf4\x3a\x42\x22\x9c\x76\x7c\x21\x6a\x08\x89\xb1\x7e\x0f\x19\xe3\x73\x52\x82\x49\x68\x89\x41\x39\x14\x6b\xa1\xe3\x95\xf8\xcf\x3c\x47\xfa\x45\x5b\xd7\x9a\xd3\xaf\xc8\x3a\x0e\x62\x78\xc9\x27\xbf\xab\x74\xd2\x0b\xac\x28\xb9\xfc\x28\xe7\x75\x05\x7c\x17\xfc\x17\xde\x31\x00\xed\x3e\x65\xd5\x8c\x69\x35\x83\x7b\x8e\x5b\xe2\x78\x34\x75\xb1\x91\x7c\x23\x17\xaa\xde\x50\x04\xd8\x91\x0f\xfe\x02\x6b\xf0\x59\x18\xae\x5f\x1b\x85\xb5\x1e\x9f\x9e\xf1\xab\x7d\xd9\xe3\x56\x29\xc5\x0e\x66\x9e\x4f\x88\xd5\xaa\x94\x2b\x70\x3a\xf9\x85\x44\xf8\x3c\x5d\x07\xac\xb0\xd7\x95\x26\x5b\x94\xfc\xbe\xc8\xeb\x0d\xb8\xb4\x4c\x55\x40\xff\x96\x84\xff\x44\xd9\x38\x8d\x93\x9c\xb5\x47\x2e\x5b\xa2\x28\x0a\x0f\xfd\x5d\xdc\xea\x79\xaf\x4b\x0a\x50\x3a\x91\xc1\xbb\x8a\xea\xba\x9d\xb9\xfc\xb8\x2d\xa5\x31\xf9\x43\xda\xf4\x5a\x86\xae\xdf\x49\x4f\x7a\x68\xdb\x15\x71\x8b\xc7\xc2\x3c\xd0\x69\x8d\x8c\x9d\x3d\x2a\x44\xfb\x8e\x5a\x56\x55\x94\xd8\x30\xac\x41\xb4\x1e\x63\xad\x23\xce\x7c\x6f\x6e\x48\x36\x24\x0f\xe5\xa1\x39\x7a\x16\x4c\x9c\x0b\x51\x49\xc6\xc6\xd4\x44\x70\x00\x49\x3d\xe7\xd6\x2a\x84\x40\x9f\x0f\x6e\xb2\x3e\xa5\xc3\xf1\x4b\x2b\xf2\xdd\xb8\x67\xbd\x13\xc6\xfa\x5b\x28\x50\x89\x52\x9d\xf1\x8f\xa7\xbd\x93\x67\xa7\xbd\xd3\x67\xf4\xd0\x36\x97\xce\x69\x4a\x08\x10\xe9\x28\xd6\x12\xad\xd4\xdc\x1f\xf0\x4b\x2b\xae\x6e\x64\x99\xf3\x97\xbd\x3f\xd9\x27\xde\x4c\x2e\xfc\x1f\x0f\xfe\x5c\xe7\x0f\xfc\xec\x0c\x4c\xb4\x03\x6b\xb3\x6d\x36\x85\xe6\x17\x21\x11\x10\xfb\xa5\xc7\x5e\x57\x9f\x4e\x78\x7e\x71\x71\x75\x64\xa7\xe7\xdf\x6b\xc0\x95\xc1\x9f\x06\xf3\x5c\x6d\x8d\xec\xfc\x5b\xdc\x7e\xcf\x4a\x1e\x6c\xda\x7b\xb0\x17\xfe\xec\x0a\xf0\xcf\xce\x7a\x27\xcf\xce\x7a\xa7\xcf\x9e\xdb\x21\xfe\x2c\x66\x33\x59\xf2\xb8\x2b\x53\xf2\x89\xf7\xc3\x69\x78\xbf\x6f\x22\x26\x07\x8d\x9a\xdf\x0f\xa7\xc7\x0e\xcf\xaa\xfa\x58\x1d\xf1\x63\xc6\xde\x17\x9f\x54\x9e\x8b\xd6\xd7\xdf\xdf\xe0\x72\x9f\x41\x5f\x6a\xfa\x62\x63\xb3\x60\x0f\xec\x9f\x26\x93\x2b\x4f\xe5\x43\x72\x32\x53\xe6\xc6\x64\x72\x25\xc5\x83\xfb\xeb\x11\x3f\xb0\xa6\xf1\x01\x3f\x3c\x38\x7d\xf5\xea\x4f\x07\x47\x8c\xdd\xbc\xbb\xf1\x03\x3e\xef\x9d\xd8\x85\x9e\x32\x76\xf3\x50\xad\x0b\x1d\x06\x3d\xbf\x1e\x0f\x39\xfd\xf2\xca\x8d\x75\xec\x9f\xf3\x53\x8b\x7c\x9f\x61\x96\xb0\x84\x49\x2e\xe5\xf6\x61\x2e\x42\x8a\xe8\x01\x9d\x83\x5b\xad\xc0\xb1\x59\x81\x06\x32\xcc\x73\xa5\x0b\x65\x9e\x5d\x9f\x4f\xfa\x9d\xa4\x3e\x66\xec\xc3\xf3\xf3\x30\xcc\xd9\xc9\xc9\xe9\x01\x63\xff\x7c\x7a\xda\xfa\xdd\x0f\xb9\x9a\x3d\xcb\xd5\x6c\xab\x57\xf1\xeb\x3f\x14\xdb\xd6\x19\xb1\xc4\xfc\xb7\x36\x56\xfe\xf8\xf9\xd5\x7f\x7a\xcf\xae\x7e\x78\xdf\xff\x4d\xcc\x7e\xff\xf3\x84\xfd\x7f\x7a\xd2\xea\xff\xff\xe2\xf9\xcb\x6f\xfe\xb0\xff\x7f\x8f\x9f\x61\xef\x6b\x3e\x69\x76\xfa\x05\x95\xde\x9e\x0b\x50\xfc\xac\xba\x00\xc1\x9a\x62\x61\x55\x0c\xf8\xbd\x7f\x94\xb1\xe1\xaa\x28\xf9\x8d\xb8\xcf\x8b\x7b\x90\x4f\xfd\x8d\x2a\xf9\xe4\x93\xbc\x93\xf9\x43\x96\x78\x71\x5d\xe3\xdb\x3d\x03\xdb\x8f\x5e\x4f\x86\x93\x2c\xd2\x51\xa8\xd3\xa8\x55\x12\x20\x4f\x5e\x54\x6a\x2e\xf2\x1c\x24\xd4\xe2\x41\x8b\x0d\xfd\x33\x57\xfa\x8e\xba\x95\x5a\x65\xf1\x10\x33\xc9\xc0\x42\xd6\x62\x23\x8f\x9c\x46\x89\x79\x65\xa1\xa9\xfb\x13\x53\xf1\x91\x48\xd2\xd1\xad\x6e\x0a\x5f\xb1\xdf\x83\x1c\xc6\x85\x74\x43\x27\xdd\x6e\x53\x19\x9c\x37\x3a\xdd\x9f\xf6\x4e\x7a\xbc\xaf\x1f\x9a\x1d\x59\x43\x9f\x64\xc8\xf5\xf9\x99\x93\x8d\xd2\xbe\xc1\xcb\x9c\xa4\x50\x3e\x36\xbd\x66\x23\x7e\x3b\xbd\x3f\x78\xfd\xff\x3f\x7e\x7a\xcf\x2e\xc5\xee\x4e\x9a\xe3\x71\xad\x2b\xb5\x91\xbf\x85\x24\x78\xaa\xff\xfb\xcb\x93\x93\xa6\xff\xf7\xc5\x1f\xfc\xff\xf7\xf9\xb9\x52\xfa\x0e\x5d\x81\x51\x07\xf7\xfd\x7c\x36\x94\xee\x10\xf7\x31\x1c\x8a\x23\xee\x5c\x22\xf9\x66\x06\x7e\x5c\x70\x99\x44\xbd\xc4\xc3\xe0\x3d\x3e\x5d\xd7\xd4\x94\xbb\xcb\xe0\xec\xe8\x17\xde\xe4\x53\xf3\xe2\xde\xf5\x7e\x87\xe2\x80\x79\x40\x38\xff\x55\x7a\xd7\x5b\x69\xb3\x4d\xe2\x59\x20\x5e\x92\x07\x81\x10\xb1\x75\xee\xc8\x81\x71\x46\xcc\xf7\xd0\x91\xcb\x22\xe3\xa5\x5c\x89\x72\x01\x89\xc4\xbe\xb1\x3d\x2e\x28\xe6\xcd\x46\x76\x0d\xeb\xcb\xb2\xba\x22\x6b\x15\x24\x8c\x9a\x3a\x07\xf9\x14\x79\x49\xa2\x2c\x07\xdf\xee\x1b\xbb\x79\x37\x73\xc9\xc1\x61\x98\x9b\x02\xbc\x83\xe0\x66\xc7\xf4\x72\x92\x73\xed\x19\x3d\xbd\x81\x6e\x71\xf0\x4f\xe1\xde\xb3\x72\xaf\x63\x38\x8c\x6b\xd2\x7f\x43\x55\x99\xfd\x4d\xcb\xd3\x6b\xc5\x7a\xf7\xa1\xa2\xe6\xe2\xd4\x0f\x3f\xed\x65\xee\xba\xe7\xcb\x8f\x95\x74\x59\xf0\x49\xdb\x72\x20\x4c\xa3\xc5\xbf\x7f\x7b\x56\x13\x79\xc8\xd1\x51\xcc\x72\x85\x5e\xa5\xaa\xe0\x8b\x82\x9b\x22\x6a\x6d\xce\x43\x6b\x73\xfa\x63\xb6\xa7\xdd\xbb\xcf\xfb\xc1\x95\xc5\x53\xe8\xf1\x3e\xa9\x01\x70\xe7\xd4\x92\x6e\x1c\xea\x03\x4a\x9b\x4a\xe8\x0a\xb2\xeb\x2b\xb9\xd9\xe6\xa2\x92\xa0\x3b\xd4\x06\xd2\xed\xcb\x82\x72\xf1\x73\xa5\x25\x5f\xd6\x7a\x8e\xdb\x42\x7a\x84\x32\x30\x4e\x46\x4e\x17\x50\x28\xac\xf1\xed\xff\xc2\xa9\x38\xf0\x8e\xab\x2a\xbe\xef\xf8\xf5\xfd\xc7\x3b\x0c\xe0\x9d\x3c\xbe\x5c\x82\xf0\xb7\xf7\x1e\x54\xac\xf0\x83\x7b\x1d\xf2\xe7\xf7\x73\x00\xca\x9d\xef\xe8\xe9\x4f\x1a\x10\x57\xfa\x5e\xe4\x6a\x21\x2a\x19\x55\xba\xa1\x97\xcd\xf0\xdd\xfa\x81\x7a\xcc\x07\x7f\xa2\x9d\xf7\x06\x58\xc3\xcf\x9a\xc8\x7f\x78\x35\xa9\xf7\x6c\x21\xb7\xa5\x9c\xdb\x03\xfd\x5f\xfb\x6f\x6f\xae\x8e\x9f\xff\xea\x9d\xe0\x1f\x95\xff\xa7\x27\x67\xa7\x67\xcd\xf8\xef\xcb\x93\xb3\x3f\xe4\xff\xef\xf2\x63\xcf\x76\xff\xf2\x72\x30\x1e\xb9\x6c\x71\x7e\x73\xfb\xe6\x6a\x78\xde\xae\x7b\x7e\x9e\xf1\xd3\x57\xfc\xba\xb8\x97\x9b\x99\x2c\xa9\xe8\xb9\x09\x48\x71\xf2\x0d\x7a\x53\x3b\x3c\x5e\x19\x1f\xea\x79\x8f\xff\xc3\xba\xaa\xb6\xe6\xdb\x67\xcf\x1c\x02\xfd\x3f\x32\x36\xb8\x97\xe5\x43\xa1\x41\x0c\x84\x14\xcf\x2f\x4e\x24\x69\x16\x42\x60\x42\x09\xb2\x6e\x5f\x03\x08\xed\xd5\xd1\xf7\x9c\xe7\xc5\x4e\x2e\xa0\x19\xbc\x14\x9b\x59\x2e\x31\xf5\x08\x68\xb1\x5c\xca\xb2\xd8\xa7\x79\x28\x17\x20\xc6\x4a\xb8\x5c\x2e\xab\x90\xb3\x08\x85\x5b\xe4\x5b\x86\xf8\x31\x30\x9d\x3b\xa5\x17\x30\x47\x2a\x1f\x76\x49\x44\xc0\xda\xa9\x82\x10\x96\x2a\xb5\xa9\xa1\x22\xb3\xd8\x4a\xec\x75\x88\x65\xc3\x14\x7f\x81\x02\xed\x07\x17\x10\x9a\x0b\x94\xac\x5a\x56\xa0\x6a\x81\xaf\x3f\x7c\x9f\x72\xa9\x1c\xb6\x3f\xcc\x6d\x53\x98\x2a\xcd\xca\xa5\x5a\xc4\x52\xcc\x2b\xac\x52\x84\x48\x86\xfd\x6b\x3c\xaf\x4a\xdc\x49\x26\x76\xe2\x01\x65\x94\x5d\xfd\xc2\x4a\x92\x02\x4b\xbd\x51\xfa\x5b\x22\x23\x7f\xc7\xc0\x04\x7f\x83\x55\x69\xa5\x30\x55\xc6\xed\x7b\x44\x51\x96\x52\x14\x3f\xa7\xb4\x15\xcc\xf8\xb9\x55\x2d\x20\x2e\x21\x9f\xfc\x1c\x13\x79\xee\x44\x26\x66\x66\xba\xea\xcb\xe3\xe3\xaa\xb0\x4a\xa9\x35\x82\xed\xf0\x15\xe5\x57\x19\x0c\xee\x7b\x22\x58\xb2\xd8\x41\x54\x65\x98\x2b\xa1\xfa\xb0\x06\x28\x12\xbb\x4f\x02\x92\xaa\x92\x57\x32\xfb\x27\xfb\x2a\x54\x82\x96\x14\xab\xa2\x49\x66\x70\xba\xb6\xa5\x9a\xcb\x1e\x1f\xd5\x25\xeb\x3e\x45\x6d\x12\x87\xa9\x7a\x65\x6c\x2d\xee\x91\x9e\x34\x36\xb3\xfa\x44\xb8\x03\xe1\xe8\xa7\x2b\x3a\x24\xf2\x94\x2b\xe9\xe2\xb2\x1b\xab\x40\xd8\x21\xad\x5a\x72\x84\xbd\x2d\x98\xfd\x77\x29\xe7\xd2\xaa\xbb\x49\xd0\xae\x84\xe8\xf9\x4a\x56\x70\x5f\xe8\x45\xa1\xed\x3f\xb3\x30\x3b\xfb\x0c\x6d\x02\x44\xf2\xdc\xe7\x49\x0b\xd9\x2a\x39\xc7\xd9\x29\x48\x7f\xd3\x72\x87\xf3\xa4\xfd\xf1\x59\xcc\x34\xdc\x9d\x2e\x76\xf6\x3f\x98\x1d\x77\x51\xb8\x70\xd4\x5a\xe9\x15\xd4\x82\xbb\xc0\x38\x05\xf7\x20\x6b\x2f\x1c\xa9\x16\x79\xb7\x65\x51\xc9\x79\x85\x07\x88\x42\x5f\x18\x01\xdc\x15\xcc\x54\x72\x6b\xbe\xe5\x87\xa7\x47\x5c\x18\x23\xa1\xa7\x87\x63\x61\x2e\x64\xe9\x37\xdb\xce\xf2\xf0\xec\x88\x17\xd0\x75\x04\xbc\x50\x51\xd3\x0d\x86\x8a\xaa\xb5\x19\x0c\xfc\x31\x97\x2b\x91\x37\x4c\x07\xac\x98\x8d\x63\xf7\x98\x8d\xed\x35\x55\x19\xdf\xda\x3e\x37\xd2\xaa\xd2\xd6\xc4\x98\x49\x2d\x97\x0a\xf2\xbf\x17\x72\x29\x31\xe4\x6a\x8f\x2b\x1c\xd5\xaf\xfc\xd5\x50\x44\x16\x82\x5b\xc0\x54\xf5\x8d\x58\x40\xf7\x53\x91\x63\xaf\x71\x99\xdc\x14\xac\x2c\xa4\x50\xa5\x5a\x22\x3e\x82\x3b\x0f\x3b\xb5\x90\x66\x5b\x4a\xb1\xc0\xd2\x5f\xac\xfe\x62\x01\x49\x63\x19\xa5\x4c\x86\x9d\x29\xb8\xd2\xf3\xa2\xdc\x16\xa5\xa8\x64\x8f\xbf\xc7\x0a\x69\xff\xf7\xe6\x51\x85\xcc\xfc\xb5\x14\x65\x25\x35\x15\x07\x4b\x3d\x2f\xea\x52\xac\x82\xe6\x15\x94\xc5\x88\x2d\xf6\xf8\x3b\xe7\xe7\xa2\x74\x77\xc7\x0d\xfd\x39\xac\xc9\x46\x48\xd9\xa3\xcb\xaa\xc7\x51\xc1\x24\x58\x0a\x95\xe3\x2e\x6d\x20\xb6\x59\x57\x3d\x2f\x0a\xf6\xc8\x00\x94\x4f\x91\xd1\xeb\x4b\x08\x9d\x05\x01\x0a\xb4\xac\xec\xbc\xe1\x7a\x6c\x71\x00\x31\x9f\x5b\xdb\x4f\x55\x18\x66\x26\x96\xed\x3c\x8c\xa0\xb6\x22\x7a\x01\x4a\x2b\x93\x5c\xcc\xaa\x88\x86\xea\xfd\x0c\x79\xe5\xf9\x4c\x22\x78\x82\xbc\xb1\x47\x27\xb3\x27\x05\xf3\x80\x84\x91\x64\x9c\xfb\x65\xc5\xd3\x70\x95\x80\xe1\x30\x78\x90\x01\x92\x50\x3d\x36\xac\x5c\xf9\x22\x16\x24\xe3\xc6\xd9\x33\xb3\x84\xea\xfa\x44\x62\x45\x48\x23\x78\x15\x22\x5e\x84\x09\xf5\x2d\xf2\x96\xb5\xd6\x54\xc3\x58\xfa\xef\xc3\x9d\xf0\xb6\x26\x0e\x0e\x29\x1e\xa5\x5c\x16\xa5\xcc\x18\x6d\x02\x95\xa8\xb4\x77\x2d\xc3\x5d\xc1\xc7\xf2\x07\xda\x2d\x05\x59\x0d\x30\x5a\x46\x17\xdd\x1e\xb8\x74\x47\x1d\x0e\x45\x32\x77\xde\x35\x77\x00\x28\xe3\xe0\x7b\x08\x45\xa2\x76\x47\x24\x55\xb6\x3e\xba\x9b\xf6\x5c\x51\x8b\x22\xb8\x22\x0c\x1f\xcf\xf8\x4e\x98\x44\x9e\x88\x39\x24\x6c\x58\x33\xd4\xa8\x8d\xca\x45\x89\x70\x34\x64\x37\x81\x16\xb3\x80\x4e\x4a\xd6\xfe\x74\x13\x61\xa0\x1b\x35\xed\x60\x37\xa5\x9b\x2b\xd4\xa7\xe8\xdf\x6b\x11\x61\x6d\x20\x66\x42\x78\x91\xa5\x2f\x92\x41\xef\x2e\x4e\x29\xf1\x8b\x0a\xa1\x89\x1b\x75\xac\x74\xb6\xad\x4d\xa2\xf6\xe4\x24\x00\x03\xb2\x7c\x15\x20\x24\x5a\x55\x48\xb1\x53\x9d\x90\x03\xa8\xba\x75\x02\xc9\xf3\x31\x82\x02\xe7\xfc\xa4\x2b\x79\x71\x1a\xb1\xf9\x18\xf6\xc1\xad\xf1\x79\xec\xa6\x7a\x74\xd7\x7a\x8c\x05\xd4\xb6\x03\xe7\x64\x11\xda\x04\xb9\x73\x9c\xab\x3b\xc9\x73\xb1\x73\xc9\x2b\x2e\x37\xa2\x53\x83\x64\x08\x0c\x62\xb8\x91\x1b\x65\x89\x52\xcf\xed\xe5\xda\x08\x03\x09\x21\x07\xd3\x90\x86\xd2\x04\xac\xf0\x5f\x44\x40\xa4\xce\xb4\xa6\xa8\xa7\x14\x1b\xa0\x0b\x08\xfe\x85\xca\xef\x02\xfb\x4f\x00\x40\x09\x24\xa9\xf5\xf8\x01\x3d\x2e\xcd\x01\x90\xff\xc0\xee\xdc\x56\x59\x29\x74\xe0\x52\x07\x03\xf8\x82\x81\xac\xfc\x72\x25\xb4\xfa\xe4\x13\x32\xa7\x05\x3f\x40\x79\x78\xc0\x05\xce\x0b\x49\xe4\x2c\x00\xe7\xfc\x11\x0b\xb1\xa5\xe4\xb5\x92\xea\xb3\x97\x5e\xeb\xe4\x4a\x33\xc1\x97\xc2\xac\x81\x4b\x00\x0b\x42\xd1\xe1\xe4\x7b\x90\xcc\x59\x33\x71\x8b\xb8\x39\xd4\xf7\x70\xf9\x51\xcc\x2b\x80\x50\x70\xd5\xd8\x4e\x0c\xe1\x77\x8c\xbb\xb3\x82\xe6\x1d\x5d\xf1\x03\x37\x25\x29\xca\x5c\x59\x06\x5f\x94\x77\x76\xd1\xb4\xb0\x03\xe7\xc0\x3a\x68\x3d\x05\xf2\xff\xc0\x39\x1f\x76\x51\x6e\x64\x04\x72\x11\x21\x68\xc4\xcd\xc6\x5a\x1e\x57\xe9\xb0\x06\x89\xbe\xdb\xb2\xd8\x8a\x95\xa8\x64\x9b\xc4\x0b\x38\x1d\xa0\x6e\x91\x5f\xb3\x42\xb1\xe0\x85\x53\x44\x38\xb6\x2b\xea\x7c\x81\x2a\x2b\x76\x50\x2b\xe5\xbc\x42\x4f\xb1\xd3\x5d\x14\x44\xe4\xbc\xae\xa0\xf4\xd2\x6e\x04\x7a\xbb\x9a\x19\xbe\xac\x91\xe1\x8b\x4e\x1d\xf2\xcd\x90\xdd\x56\x60\x46\xeb\x66\x5b\x23\x8a\x0a\x29\x4f\x28\x7e\xb7\xd4\x4f\x0e\xb6\xcb\x2e\x1a\x96\x89\x6d\x49\x21\x87\xcf\xec\xe1\x15\x87\x8f\x95\x1b\x1e\x65\xcc\x09\xf8\xa6\xa8\x43\xe6\x4f\x30\x63\x9a\x1b\xab\x3a\xcc\x8b\x5a\x57\x90\xfb\x89\xe7\xca\x9a\x54\xf7\x00\xa8\xc5\x85\x61\x3b\x99\xe7\xb4\x0d\xf3\x42\xdf\xcb\xe6\x31\xb7\x77\xd3\xde\x72\x7b\x74\xb6\xd1\x02\x10\xe6\x43\xdb\x8f\xbb\x81\xa9\x1f\x1c\x73\x56\x43\x51\x7a\xbd\x0d\x6d\x82\x1e\x7f\x2f\xc9\xa4\x02\xc3\x8e\xcc\x48\x2e\x40\x44\xf2\x6a\x5d\x16\xf5\x6a\x1d\xd1\x93\x91\x44\xc6\xdd\xe6\xba\xe0\x55\x29\xb4\xb1\x0a\x2f\x08\x4a\x54\x60\xc9\x74\xc6\xe9\x2b\x82\xda\x0c\x5f\xb9\x47\x09\x8c\xbf\x58\x8a\x39\x64\x0b\x6f\x73\xf1\x60\xf8\x41\x3f\x82\x03\xb9\x02\x0d\x19\x73\x61\xcd\x81\x83\x77\x01\xc7\x6c\x45\x5a\x6c\x15\xf6\x4d\xe0\xf7\xb4\x72\xb9\x4f\xdb\xb2\xd8\x28\x2d\x75\x05\xb0\x1f\x28\x9d\x97\x52\x54\x4e\x91\x01\x28\x62\xff\x65\xa1\x13\x28\x92\x26\x24\x4a\x50\xef\x2b\x99\xe7\xc6\xab\x11\x38\x12\x6a\x17\xb0\x6c\xbe\x13\xa5\xb5\x49\x1f\x7c\xaa\x2b\xec\xdd\x21\x1d\x55\x3a\x16\xf1\x22\xe8\x05\x85\xb6\x1e\x73\xbe\x76\xb2\xbe\x3c\x4b\xc5\xd4\x6a\xa4\x69\x18\xb7\xcd\x89\x71\xa6\xeb\x62\x67\xb7\xfd\x5e\xc9\x5d\x92\xe0\x1d\x71\x6c\x3e\x44\xde\x13\xb6\x81\xa0\x42\x0c\xa4\x96\x62\x31\x29\xac\xd1\xea\x6b\x42\x2f\x90\x1d\x6f\xa9\xb4\xd4\x49\x16\xc1\x37\x52\xd7\x19\x1a\xd4\x48\x70\xae\x2a\xb9\x71\xde\x07\x18\x69\x23\x65\x65\x28\x07\x17\xe0\x8d\x7c\x8a\xf7\x69\x2f\x6e\x0e\x45\x02\xfd\x20\x52\x8f\x0e\xd0\xf2\x4e\xd8\x10\xca\x7c\x6b\x54\x03\xee\x5b\xb9\x49\x58\x3b\x38\x30\xe0\x3e\xb2\x34\x66\x6e\xcd\x8e\xaa\xc7\x0f\x46\x21\x55\xf4\x20\xba\x55\xba\xd0\xc7\x71\x89\x2f\x9c\xe8\xc0\x6b\x27\x95\xb0\xfc\x6a\x81\xa8\xc2\x96\x60\xe1\xe5\x88\x88\x78\x0f\x91\x07\x2b\xf8\x5b\xb1\x5c\x2a\x88\x30\x19\x1a\x81\xb9\x0a\x06\x28\x44\x2d\xe5\xbc\x58\x69\xf5\xc9\x6a\xcf\xf4\x80\xe1\xb3\x62\xf1\x90\xf1\xc2\x9b\x2d\xde\x89\xe3\x3f\x14\x21\x80\x31\xa4\x10\x5c\xf7\x79\x6d\x35\x38\x87\x2c\x65\x79\x52\x2e\xf4\xaa\x16\x2b\x99\x41\xad\x03\xde\x1b\x03\x86\x5b\xfe\x80\xc6\x8f\xd8\x14\x80\x12\xec\xec\x2f\x66\x17\xed\xab\xdb\xec\x19\xa4\x21\xdc\xf6\x4c\xb0\xcb\x9f\x4f\x62\x3f\xf0\xb2\xd0\x3b\xc9\x49\xc8\xfa\xc4\x68\x90\x18\xb1\x24\x65\x7e\xbf\x42\x6f\x4b\x3a\xf2\x87\xe2\xc8\x4e\xb1\x99\xe1\xad\xb1\xbd\xb3\xdb\x9b\xad\x98\xdf\x89\x95\xdd\x65\xc1\xdf\x8b\xbf\x16\x25\x3f\x77\x58\x4d\xa8\x7d\x26\xa1\xa1\xa0\x00\x88\xaa\xfd\x38\x5c\xee\xd9\x11\xa3\x34\x58\x00\xd7\x01\xb3\x07\x43\x63\x46\x26\x07\x8c\x32\x84\xbb\x06\x2a\xc0\x4a\x51\x9b\x6d\x0e\x12\x8c\x09\xde\x3e\x36\x70\x40\x71\x72\xf6\xe4\xb8\x67\x5d\x5f\xab\x7d\x42\x84\x85\x0a\x74\x30\x1b\x2c\x1d\x7a\xbc\xcf\x0f\x1a\x93\x38\xc8\x7c\x15\xe1\xbc\xd0\x95\xfc\x58\x65\xbe\x34\x61\x03\x8f\x5a\xad\x4c\x57\x4a\xe4\xcc\xa3\x5b\xf1\xc3\x3b\x59\x6a\x99\x5b\xc6\xae\x17\xc5\x8e\x63\x23\x47\xa4\x8c\x29\x78\xa1\x7d\x02\xbe\xb3\x0d\xc9\x56\xb3\xe7\x04\x1f\x66\x87\x88\xf2\x72\xc4\x0b\x42\x7b\x6c\x46\x4e\x80\x7a\x65\x6d\xd9\x07\x9c\x58\x8a\x27\x95\x31\x5c\xd0\xa2\x9e\x4b\x7f\x36\xf0\xb9\x34\xf7\x1c\x6e\xc0\xb6\x94\x55\xf4\x5e\x59\x6b\x7b\xb5\xe9\x78\x9e\x27\x89\xe7\xc8\x5e\x12\x36\xd2\xc8\x66\xc7\xfa\x7b\x24\x11\x34\x53\x75\xf6\x19\x83\x3f\x6b\x29\x9d\xbf\x11\xb4\xf6\x4a\x66\x18\x58\xcb\x73\x3a\x39\x4b\x9c\x65\x63\xa5\x47\x30\xad\x90\x9b\x8e\xa3\x51\x6c\x36\x72\xe9\xe0\x42\x43\xdd\x83\x83\x07\xac\x08\xf0\xad\xc8\x09\xd1\x2a\x28\x0a\x3d\x16\xdc\x1a\x55\xbb\x10\xc1\x8d\xfa\x95\xe1\xcd\xab\x0a\x14\xc5\x75\xe4\xc7\xdb\xba\xdc\x16\x46\xb2\xaa\x28\x72\x13\xfd\xc1\x9a\xb4\xc1\x83\x13\x3b\xe3\xdc\xb9\x75\x7e\x93\x48\xc3\x54\x80\xa1\x04\x6d\x5a\xc0\x97\x91\xce\x38\xba\x91\x2e\x38\xda\xd4\xc9\x7b\xfc\x12\x12\xf7\x85\xbd\x11\x19\x4f\x76\xd1\x35\xcd\xf3\xe2\x3e\x52\x1e\xbc\x41\xe6\x91\xc0\x3c\x80\x04\xdc\xd4\x18\x82\xd1\xee\x75\x74\xba\x5c\xdd\x4b\xe3\x5e\x39\x60\xd2\xdc\x57\xe9\x40\x58\xa1\x91\x43\x26\x17\xcc\xd4\x33\x4f\x19\x8f\x2d\xe1\xf4\xfe\xbd\xde\x7b\xf2\x78\x04\x19\x3a\x7b\x60\x4a\x57\x6a\x63\x35\x0f\xc0\x3b\x23\x0f\x09\x15\xfb\x80\x05\x8b\x07\x61\x99\x17\x3b\x3e\x93\xd5\x4e\x42\xf2\xbc\xdd\x3c\x2b\x45\xe3\x79\x44\xde\x7a\x51\x06\xd0\x43\x12\x64\x53\xc8\xe8\x6a\xdf\x0f\x38\xe5\xcd\x6a\x16\x54\xf3\x9d\x1f\xb5\x34\x54\x2d\xe5\xae\x81\xef\x7b\x84\x4b\x44\xc3\xab\xfd\xe5\xae\xcf\xa1\xf0\xdf\x3b\x99\xf4\xae\x36\xb9\x9e\xf7\x62\x42\x55\x08\x2d\x0c\xeb\x74\xde\x08\xa3\xe6\x51\x81\xb1\xb5\x18\xfb\xa1\xa8\xc1\x95\x31\xb4\xd5\x26\x38\x95\xee\xcf\x4e\x75\xab\x24\x8a\x9a\x80\xa7\x59\xe8\xb4\x74\x03\xea\x97\xac\xee\x57\x96\xf2\xbe\xc0\x32\xc4\x28\x5b\x42\x62\xe8\x7e\xd1\x2c\x82\x00\x9c\xab\xd8\x6f\xe0\xf1\xc8\xec\xd5\x5b\x2e\x55\xb9\x31\xe8\x92\xae\x75\xae\x36\x0a\x40\x4c\x12\x57\xb1\x63\x2d\xe1\x02\x7a\x1b\x0e\xc8\x5a\xd4\xd5\xb6\xa6\x7c\x01\xe7\x04\x13\x3c\xb6\x17\x11\x0b\x39\x0a\x5e\x47\xce\x6a\x10\x80\xe8\xeb\xa5\x91\xd0\xa3\xa5\xc1\xd7\x08\x62\xc5\x4a\xbb\x39\x74\x82\xa9\xea\x8a\xf4\xef\x30\x38\x79\x8f\xdc\x78\x11\x90\x9b\x49\x5c\xed\xc5\x92\x2f\x85\x2a\xd3\xe2\x7a\x7b\x3d\xee\x45\x8e\x92\x39\xc2\x1e\x99\x45\x5e\x09\x96\x8b\x5d\x8f\x31\x87\xda\x61\xed\x9b\x0c\x88\x42\xaa\x3f\xda\xaf\xc9\x9c\x4c\xd4\xca\xbb\x88\x2c\x14\x6f\xba\xb2\x68\x97\x4c\xe1\xe1\x04\x29\x89\x93\x32\x54\x3c\x48\x80\x0b\x13\x29\x48\x81\x9d\xcb\x00\x21\x82\xc3\xb2\xc6\xb7\xc9\x45\x13\x6a\xe0\x4c\x61\x0f\x0b\xb2\x60\x4b\x88\xb5\xb8\x27\x57\xe5\x06\xed\xb5\x44\x7b\x65\xf2\xe3\x3c\xaf\x8d\xba\x87\x52\x56\x4c\xc8\x00\x66\xee\x5c\xa2\x18\xb6\xa9\xd6\x7c\x29\xe6\x2a\x47\xa6\x6b\x9f\x0b\x2e\x50\xfb\x1d\xf2\x0b\xb5\x33\x7a\xc0\x0b\xf8\x10\xaa\x9f\xa2\x3c\xa3\xe8\x98\x02\xda\x0d\x99\x75\x20\x2c\x1d\x44\x0c\x0b\x4a\x4d\x4a\x60\x60\x5b\x7e\xdb\xec\xb9\x28\x20\x5e\x53\x7b\xaf\x78\x32\x47\xbf\x65\x0c\xc9\x46\x2b\xc5\xd2\x27\x48\x92\xe1\x31\x21\x0a\x8d\xdb\x33\x93\x6b\x91\x2f\x33\xba\xd8\xf0\x2b\x74\x36\xa8\x42\x33\xf2\x08\xda\x99\x80\xe7\x16\x97\x06\x2b\xdf\x96\xc5\x5a\xcd\xc0\x87\x21\x37\x78\x5b\x9c\x29\x8f\x3e\x30\x8a\x9c\x51\xba\x30\xad\x42\x2e\x98\x5b\xb7\xbd\x1e\x86\x3c\xd2\x0a\x9c\xf2\xb8\x5d\x1e\xbb\xfa\xa1\xa8\x01\x53\xc1\x11\xad\x09\xa9\x3c\x57\xe5\xbc\xde\x58\xcd\x7f\x8e\x09\x72\x21\xa6\x6d\x0f\x48\x04\x16\x18\x97\x52\x31\xe2\x2b\x50\xe4\xd7\xe3\x13\xd0\x10\xc9\x4f\x9a\x46\xae\x5f\xfb\x82\xc0\xd3\x13\x38\x56\x10\x55\xa8\xb5\x96\x73\x69\x8c\x28\x1f\x7c\x61\xd8\x0d\x86\xc2\xec\x10\xb7\x18\x35\x42\x0b\x9c\xf0\x1b\xa0\x1e\xa9\xaf\x2b\x75\x7c\x0e\x53\xbe\xb7\x3a\x64\xa1\xf9\x15\x5c\xc4\xeb\x22\x65\x2e\x88\x06\x39\xb3\xe2\x59\x6e\xe4\xc2\x0b\x7b\x01\x20\xe3\x12\xdd\x00\x00\x7a\x5b\xe4\xc5\x0a\x42\xca\x1b\x29\x4c\x5d\x4a\x16\x28\x14\xd5\x76\xe7\x62\xc7\x97\x75\xbe\x54\x39\xe0\x6e\x50\x62\x15\x5c\x55\x7a\xde\x1a\x3f\xb9\xe4\xa7\xa7\x4e\xee\x7c\x18\xde\x8c\x22\x8f\x51\x55\x4a\x51\x3d\x70\xb1\x28\xb6\x15\x3a\xbe\xce\x4e\xf8\x85\x9c\x63\x86\xc2\xe9\xab\x57\x5f\xc3\x75\x72\x4e\x70\x70\xb1\xba\xe3\x41\x08\x21\x1e\x80\x53\xaf\x68\xdf\x1c\x11\x8a\x25\x0a\x73\x5a\x83\x0f\x0e\xe3\xcd\x02\x9b\x3d\x65\x90\x19\x45\x4b\x2d\x19\xec\x52\x29\x1c\x58\xec\x30\xce\xb1\x2c\xca\x99\x5a\xa4\x1f\x01\xf0\xa1\x2e\x8a\x99\x86\x5b\x01\xa3\x33\xc9\xfc\x94\x21\xb2\x63\x30\x40\x7e\x94\xe5\x1c\x80\x4f\x1c\x23\xee\x90\x88\x70\x7c\xa9\x72\x37\x84\x6e\xe2\x25\x08\xbd\x60\xe8\xd7\x43\x50\x29\x58\x09\x04\xe8\x2b\x9f\x0c\xb9\x51\x15\x0f\x59\x0a\xce\x1f\xe7\x55\x9b\xa0\x9c\x30\x72\x26\x08\x0c\x3b\x4a\x6d\xb9\x2a\x18\x8d\x62\x65\x19\x6d\x15\xab\xb5\xa0\x8e\x64\x78\x2d\x81\x9d\xaa\x72\xe1\xfc\x5d\x5f\x31\x24\x26\xad\x6c\x0f\x35\xf9\x5e\x6a\xe2\x85\x78\xd1\xe3\xe1\xd2\x7e\xe7\xd2\x48\xce\xd1\x6f\x16\x04\x0f\x6d\x6e\x67\x9e\x89\xd7\x13\xbe\x4a\xe3\x73\x28\x53\x9c\x2f\x8e\xa9\x0a\x2c\x36\x4b\x3b\x2c\x27\xed\x4a\xb8\xb4\xa2\x76\xab\xe6\x75\x51\x9b\x1c\xb3\x5c\x22\x77\x55\xfe\xe0\x62\x3d\x56\x41\x09\x58\xbf\x4f\x38\xb5\x5e\xf3\x3b\x29\xb7\x76\xc3\xc4\x1c\x3d\xe5\x84\x28\xe6\x8a\xfe\x59\x28\x9d\x8e\xe3\x4a\xce\x59\xe2\x34\x92\x7b\x1f\x7a\x59\x90\xb9\x2e\xe6\xf3\xa2\x74\xea\x37\x71\xe1\x6f\x42\xac\x02\x4f\xd2\xe2\x91\x09\xf8\x0a\x52\x23\xf5\x5c\x3a\x28\x2d\xe7\x5b\x7b\x0d\x2c\x1d\xf2\x6f\xb1\xba\xdc\x05\x11\xf6\xf8\xba\xb8\x00\x59\xde\xac\xec\x8d\xb7\x11\xd3\x20\x00\xf3\xba\x54\x73\x50\x46\x74\x41\xff\xed\x33\x5c\x61\xec\x78\x4b\x40\x7b\xb0\x73\x79\x28\x6a\x66\xc7\xc1\xe0\xbf\x6b\xb0\x60\x45\xa2\x73\x07\x52\xa2\x81\xab\x98\x11\x7c\x29\x49\x0b\x7e\x19\x9f\x34\x0f\x87\x4b\x9a\xb0\x43\x88\x6e\x1f\xb9\x0e\x37\x7e\xd0\x4b\x49\xc5\x68\xf9\xbf\x9c\x81\xad\xaa\x16\x1c\x82\x77\x35\x39\x07\x4b\x7c\x64\x3b\xb0\xcd\xdc\xbe\xbe\x78\x34\x3f\x38\xaa\x07\x36\x32\x45\x0d\x10\x08\xb2\x8b\x8e\x3d\x00\x89\x13\x65\xf9\x10\xb9\x11\x1b\xa7\x31\x8c\x1e\x6c\x4e\xf4\xdd\xb0\x95\xba\x47\x05\xb7\x94\xb9\xbc\x17\xba\xb2\x66\x94\x25\xef\xec\x17\x7d\x03\xd3\xbf\xd2\x2e\x08\xac\xf3\x1a\xc4\x7a\x3d\x1c\x7e\x24\x94\x13\xb9\xdf\x78\xe4\xe6\x00\xd1\x4b\x93\x37\xac\x6a\x60\xf7\x5a\x4b\x87\xde\x7b\x61\xf7\xea\x60\xcf\xe5\x38\xe8\x31\x36\x3f\x42\x6d\xd3\x2e\xc9\x67\x86\x5b\x09\x00\x60\x27\x01\x2b\xc5\x3b\xd6\x3a\xf8\x3b\x06\xfa\x0a\x2d\x19\x62\xcb\x6f\xd0\xac\x2e\xf8\xb6\x30\x86\xca\x86\xbc\x57\x3f\x55\xe8\xf9\x4e\xa1\xa3\x04\x23\xe6\x78\xb3\x33\xbc\x66\xcc\x83\x91\x47\xe2\xdb\x13\xc4\x57\x2d\x89\x1c\x8f\x52\xe6\x18\x02\xe6\xe7\x47\x02\x01\x71\xe1\x29\xe7\x0a\x4d\xca\x66\x62\xfc\xba\xd8\x71\xdf\xaf\x03\x1d\x82\x72\xd1\x98\x2a\x44\xe2\x99\xbd\xcc\x8d\x34\xfd\x40\x35\x67\x68\x06\xad\x6c\x27\x28\x9b\x3b\x75\xaf\xb8\x44\x61\x8c\xab\xc6\x88\xde\xcb\x90\x89\xe5\xea\xee\x73\x9f\x26\xb3\x40\xe7\xd4\xe2\xc8\xf9\xdc\xe1\x83\x6b\x61\x1e\x09\x8a\x98\x0c\x79\x0e\x2a\xbe\x18\xa6\xe0\x51\x78\x84\x25\xe1\x91\xd7\xa1\x9e\x4b\xa5\x38\x19\xcd\xaf\x44\x0e\x64\x38\xeb\x8b\x02\x62\xf9\x1d\x5f\x48\x03\x30\x24\x6c\x61\xe6\xde\x57\x00\x66\x0a\xa8\xce\x98\xdc\xce\x58\x9f\x9c\x7a\x5e\xbc\x37\x8c\xce\x28\x49\xdc\xe3\x13\x60\x70\x2c\xa4\xf9\x93\x8d\x92\x7a\x8b\x30\xcb\x47\x95\x5c\xff\xbf\xec\xbd\xdb\x76\xdb\x48\x96\x36\xd8\xd7\xf1\x14\x31\x5c\xbd\x26\xc5\x35\x10\x2d\xc9\x87\x4c\xdb\xbd\x7a\x35\x4d\x41\x36\xab\x28\x52\x4d\x52\x76\x79\x6e\xea\x0f\x12\x41\x09\x6d\x10\x60\x03\xa0\x64\xf6\xd5\x3c\xc4\x3c\xe1\x3c\xc9\xac\xd8\x87\x38\x00\xa0\xec\xcc\xaa\xcc\x9e\x9e\xb2\x2e\xaa\x9c\x12\x09\xc4\x39\xf6\xe1\xdb\xdf\x87\x29\x1c\xb0\x75\x02\x90\x52\xcb\x36\x71\xf1\x26\x81\xce\x08\x17\x9c\x50\xde\x92\xc3\x2f\x68\x21\x6c\xa5\x92\x99\xb9\x05\x4a\x0f\xee\x04\x16\x0b\xa4\x14\x2d\xbf\x83\x50\x96\xe1\xa1\x28\xc3\x2c\x21\x5f\xdf\x5e\xd2\x37\x97\x3d\xcb\x2d\xd1\xe3\xb9\xf1\x86\x08\xd6\x38\x22\x1d\x1c\x7c\x89\xaf\xe9\x40\xd7\xc5\x5a\x53\x70\x31\x22\x9a\xa4\x28\xa5\x6f\xeb\x88\xa2\xf5\x7c\xb6\x95\xe4\x4a\x1f\x0a\x18\x12\x8a\x52\x79\x1a\x07\xe8\x69\xa1\xdf\x31\x90\xe3\x1c\xdc\x2b\xb4\x37\x9b\x21\x83\x1c\x6c\x0a\xee\x90\xdb\x1a\x8c\xd9\x6f\x1c\x2f\x74\xe1\xc3\x51\xd7\x11\x19\xb2\x0f\xc2\x8b\xf0\x95\x7f\x11\x4e\x8b\xfc\x94\xee\xc0\xab\xa2\xdc\x76\x5e\x80\xcd\xb6\xb5\x82\xba\xc7\xaf\xad\x4a\xbc\x80\x25\xf2\xf2\xe8\xed\xe5\xa5\xda\x5a\xdc\x25\x9d\xb1\xc9\x8e\x97\x85\x89\x39\xd3\xc2\x5c\xbb\xdb\xf0\x51\x1d\xe8\x1e\x1c\xb9\x77\x85\xa1\x6e\xb8\xc9\xf5\x76\x55\x24\x18\x62\x85\x3c\xdb\xfd\xa1\x02\x83\x15\x2f\xf3\xda\xe3\xcc\x11\xde\x5f\x3b\x56\x66\x3f\x22\xb8\x8f\xca\x53\x5f\xb6\xa5\x2b\x02\x97\x7e\xd5\x89\x80\x95\x9f\xec\x4b\x8c\x6b\xf1\x93\x89\xf4\x64\xbd\xaf\xea\x62\x8b\x19\xfc\x7d\x45\x61\x33\x0b\xab\x83\x73\x06\x71\x9f\x78\x0f\xff\xb7\xf5\x51\x59\x0a\x46\xb0\xce\x22\x09\xa7\x38\x44\x82\x55\x2d\xcd\x1d\x6f\x76\x44\xa9\xb5\x3c\x68\x45\x04\x92\xf6\x23\xbe\xae\x04\xd0\x8f\xa0\x81\xb7\xc3\x0b\xa7\x44\x9d\x18\x1c\x09\x5d\x0a\x36\xfc\x30\xc4\x83\xf1\x05\x68\xfe\xb6\x48\x74\x06\x57\xdd\x1d\x79\x7c\x66\x25\x98\x7b\x97\x2e\x5b\xc6\xbf\xb9\x91\x11\x94\x44\x04\xf4\x69\x48\xba\x75\x34\x64\x6a\xb3\x17\x76\x12\x10\x82\x46\xad\xe0\xe4\xdf\x91\xb0\x1f\xc1\xda\xbe\x63\xbe\xc5\x93\xf3\x1d\x91\x85\x8b\xd6\x73\x5e\x20\xbb\x1a\xc0\x67\x30\xf6\xc7\x0c\x36\xe6\xa4\xaa\x40\xb2\x8c\xdf\x85\x65\xdc\x94\x44\xb0\x49\x2c\x3a\x12\xac\x4d\x0a\x2b\xe6\xe4\xa2\xef\x81\xea\xc8\x34\xd7\xa2\x7b\x70\x8c\xad\xdb\xc2\x13\x2a\x63\xfe\x91\xe9\x8f\x36\x15\xad\xd1\x40\xff\xc5\xf7\xe7\xfc\x85\x4b\x48\x09\x7f\x62\x68\x9d\x09\x5c\x24\x0d\xb8\x62\x67\x18\x1c\x4d\x15\x06\xde\xc2\xfd\x5c\x71\xe4\x06\xd2\x90\xa2\x58\xaf\x55\xc5\xe5\x5d\xc8\xfa\x9c\xaf\x8b\xed\xd6\x38\xf0\xe6\x77\x11\xd1\xd8\x61\xc0\xd6\xf3\x2b\x93\xd6\x82\x42\x77\x6c\x8f\x79\x47\xda\x0b\x4d\x67\x6d\xbf\x62\x53\xed\xd5\x0a\x4d\x96\x23\xfb\x76\x45\xce\x0e\xd8\xdd\x38\x0d\x34\xca\x98\xea\x80\xf0\x14\x70\xcf\xc9\x93\x3b\xe3\xfd\x03\x7c\x00\x17\x06\x0e\x79\x9f\x9a\x0e\x83\xe5\x62\xbe\x0d\xa4\x64\xd7\xb0\x89\xd4\xe3\x8b\x7a\x54\x07\x8b\x54\xb1\xbf\xc4\x17\xe3\x04\x6f\xf6\x25\x46\xda\x70\xa2\xc1\x70\x66\x0b\x46\x90\x01\xee\xfb\x90\xde\x6a\xea\xde\x6a\x0d\x6f\xd2\xcb\xee\x59\x50\x05\xbe\xdf\x7f\x52\x70\xe6\x55\xad\xc5\x18\xb5\x5f\xc7\xf7\x0a\xe1\xe2\x70\x6f\x5a\x24\x26\xad\xe1\x13\x8c\xad\xe0\x66\x26\x7e\x24\xe5\xc5\x43\x0e\x7d\x84\xa8\xd0\xc9\x54\xf9\x03\x4d\x50\x27\x2f\x60\xec\x5d\x86\x58\x08\x99\x22\x2f\x1d\xc8\x9d\xb9\x88\x6a\x25\x72\xfd\xb5\xee\x62\xde\xaa\x14\x3c\xf1\x91\xe1\xb6\x9b\x94\x32\x6c\xdd\xab\x7f\x6e\xad\x79\x73\x08\x3c\x3a\x38\xae\xbc\x2f\xaa\xba\x3a\xfa\xcd\x88\x16\x3a\x10\xe1\x06\x45\x96\x88\x54\x16\x9e\x1b\x17\x62\xd1\xbd\xe3\xdc\xe5\x75\x2b\xb3\x3c\x31\x1b\x5b\x05\x3e\x99\xb1\x3a\xf4\xd1\x2d\x80\xf2\x28\x3b\xad\xcb\xd3\xba\x38\x35\xff\x8f\x70\x28\x8b\x1b\x0c\x06\x33\xcd\xcd\xb1\x66\x45\xbd\x8c\x4d\x46\xc3\xd4\x78\x2c\x92\x66\x76\xac\x3b\x1f\x83\x60\x8c\xda\x95\xc6\x53\x71\x83\xec\xbe\x38\x1b\x94\xc2\xb5\x40\x72\xef\x8c\x63\xe7\xd4\xdb\xe3\x09\xd5\x11\x18\x4b\x1c\xce\x7c\xe4\xe1\xeb\x38\xef\x22\x73\x5b\x55\x61\xaa\x14\xeb\x2a\x11\xa4\x61\x36\xbf\x38\xbe\x65\xcc\x8a\x0f\x72\xd1\x87\xc8\xb9\x11\xbe\xa6\x94\x9f\x61\x10\xad\x33\xd7\xa2\x71\x6e\x8d\xb3\x74\x83\xf7\x5a\x0f\x1a\xe2\xdf\x96\xbd\x75\x91\x57\xfb\x2d\x9a\xf2\xf0\x91\x88\x9c\x01\x07\xf7\xa9\x55\x7e\x97\xae\x32\x2d\x50\xe4\x0c\x6d\x8d\x9d\x2e\xeb\x83\x8f\x1c\x29\xb7\x70\xf0\xda\xfb\x8e\x3f\x1c\xc9\x8d\xda\xa6\x19\x80\x74\xe4\x7d\xb1\xaf\xf4\x7d\x91\x25\x82\xd2\x39\x95\xbb\xa1\x38\x8b\x6a\x13\xc0\xac\xd9\x85\x68\x47\xae\x82\x40\x0c\x22\xd0\xfa\x25\x8f\x1a\x82\xdc\x03\x31\xce\x65\xa2\x8d\x31\x89\xe2\x6b\x8f\xf7\x1a\x01\x83\xd6\xac\x48\x09\xf7\x16\xf4\x35\x92\x49\xb1\x5f\xd5\x9b\x7d\x86\x10\x7d\xe2\x90\x06\x5d\xc7\xaa\xc8\x48\x64\x73\xa3\x1e\x10\x66\x0f\xc6\x80\x32\x07\xe3\x55\x07\x8c\x08\x5e\x63\x6f\x14\xb0\xa6\xdc\x07\xa0\x10\x2a\x92\xbd\x60\x98\x02\x20\xb1\xac\x0f\x3b\xb0\x21\x0a\x84\x91\x15\xb9\x43\xd3\xa8\x5a\xae\x33\x85\x8e\x3c\x37\x5d\xb4\x0b\xdf\xab\x5a\xd5\x7b\x57\x89\xe2\x5a\x07\xfe\x32\xf6\x01\xb6\x05\xa8\x2e\x3a\xe0\x89\x68\x7e\x54\xad\xeb\x3d\xb7\x12\x27\x48\x7f\x45\x56\xca\xa2\xc4\xa5\xbc\xc3\x00\x39\xeb\xd8\x51\xe5\x8b\x69\xd8\x40\x0c\x9f\x1e\xf4\x46\x60\x82\xa7\xca\x7b\x04\x78\xe2\x20\x60\xa8\x2c\xf8\x86\x6e\x71\x73\x0d\x27\x7b\x63\xca\xe2\x48\xe5\x45\x7e\x6a\x5f\x80\xad\x25\x55\x31\xb8\xbd\xcd\x6f\x40\x2a\x02\xe0\x7a\xd0\x57\xb8\xff\xcd\x02\x83\x70\x1f\x46\x99\x34\x01\xf8\xbc\x22\x1e\xec\x8a\xe8\x8d\x11\xbe\x82\xcb\x6e\x9c\xa3\xe4\x21\x00\x92\xf1\x82\xf6\x77\x97\xb7\x65\xb6\xba\xbe\x2f\x12\xbc\x25\xd6\x3a\xd9\x97\xba\x8a\x04\x32\xf6\x10\x42\x5b\x7e\xd1\x07\x1c\x5b\x3c\xe7\x52\xf7\x6c\x3e\x57\x13\x2c\xff\x81\x06\x60\x29\x0f\xc0\x66\x5c\x01\x84\x08\xeb\xf4\x9a\x4e\x1e\x2c\x9c\xa0\x81\x64\x77\xb4\x8a\x3f\x8a\x8d\x30\x9e\xf5\x31\xc3\x4b\x07\xad\x83\x38\x4b\xb5\xdf\x6c\x52\xbc\xb8\xbd\x92\x17\x18\xe1\x75\x91\xd7\x69\xbe\x37\xc7\x00\x95\xc9\x93\x49\x1a\xd4\x6e\x34\x6e\xf9\x34\x87\xd3\x57\x55\x00\x58\x7c\x40\x1d\xb6\x82\xa3\x3c\xd8\x2d\x84\xa8\x40\xa6\x6f\xa5\xd1\x8f\x0e\x52\x24\x66\xd9\xac\xb4\xce\xa1\x4c\x6b\x20\x04\xf1\x07\xb0\x13\x9c\xb7\x0e\x48\x3f\xd6\xc7\x07\x3d\x79\x59\xe6\x65\x98\xe5\xf2\xb0\x29\x90\xba\xdd\x57\x9a\x5c\x2f\x7f\x68\x1d\x42\xc6\xb3\xc2\xd7\xeb\x7d\x09\x7a\x7b\x36\xa7\x87\xd7\x1e\x22\x88\x85\xbf\x07\x25\xd5\xca\x6d\xfc\x98\x62\xa0\xfe\xa2\xc3\xa9\x4c\x2b\x8b\x28\x2e\x9d\x64\x9d\x35\xce\x08\x64\xb4\xd3\xf5\x1e\x28\xee\xd8\xa0\x04\x6f\x15\xe1\x1a\x27\x9d\x11\x42\xe1\xb5\x10\x3c\xa0\x7b\x55\xaa\x75\xad\xcb\xf4\xbf\x08\x6a\x7b\xe4\xe2\xc2\x7e\x07\x90\x11\xc1\x83\x4a\x12\x6f\x5d\x3e\xf5\xb1\x0d\x36\x90\xef\xf6\x35\x57\x96\x59\x33\xa3\xa9\xc7\x96\x6e\x64\x4e\xf7\x99\x99\x6a\x56\xa7\xf4\xac\x3a\x92\x9e\x61\x15\x47\x63\xbe\x1d\xbc\x7d\x25\x3a\x17\x24\x25\x09\x82\x01\x07\xec\x9a\xc5\x5c\x05\xb1\x49\x58\x74\xf4\x40\x9d\x98\x79\x9d\xcf\xae\xfb\x84\x21\xf2\x03\xd7\x9e\xa3\x73\xac\xdf\x1d\x64\xb9\xc1\x00\x10\xd6\xcd\x6c\x30\xff\x71\xec\x4f\x1b\xa3\x10\x50\xd8\x9c\x4e\x81\x45\xbc\xdf\x81\x04\xb9\x8f\x16\x02\x5b\xd7\xed\x18\x4f\xb0\xcf\x76\xc4\xd5\x0b\xd2\xa2\x8a\x78\x1d\xb5\x57\x63\x4e\x41\xc8\xb4\x96\x4f\x3f\x74\x20\x87\xd6\x6b\x71\xa6\x3d\x93\x61\x6b\xb3\x34\xc4\x23\x12\x9e\x36\xb6\x37\x91\x5e\x30\x9e\x80\x93\x7b\x89\x39\xc4\x34\xa2\x81\xe0\x8e\xaa\x6d\x75\x1c\xa7\x82\xef\xb5\x7d\x51\x51\xca\x87\xb4\x40\x76\x0f\xe8\x1b\xd0\xcb\x10\x14\xa6\x2e\xd6\x45\xc6\x85\x50\x3e\xae\x0c\xf8\x3f\x30\x0f\x41\x0f\x02\xa4\xc2\x13\xbb\x00\xcf\x83\xa3\x93\xcc\xf6\xae\xe7\x56\x0a\x72\x93\xbc\xb3\x88\xb7\x0d\xf0\x5d\xe3\x97\x6d\x64\xc2\x96\xd4\x71\x61\xbe\x4e\xb0\x4e\x99\x54\xb1\x9b\x70\xd9\x23\x58\xd9\x2e\xd4\x58\x3f\xe0\xd0\x85\xa5\x27\xf2\xc2\xd2\xff\xec\x54\x55\x3d\x1a\x3f\xb8\x28\xcd\x25\x06\xc3\xb5\xcf\x77\x6a\xfd\x05\x72\xd0\xa5\x56\x09\x81\x55\xc8\x6d\xc2\x98\xe5\xcf\x3e\x01\x0b\xb2\xde\x83\x08\xb0\xfb\x9d\xcb\x12\x54\x3d\x14\x71\x77\xf0\x13\xb3\xbe\x33\xda\x44\xc7\xe2\x86\x62\x75\x60\x4c\x8a\x25\x31\x21\x5f\xdb\x27\xaf\x27\xe9\x5a\x9f\x8d\xb7\xbb\x11\xc2\x91\x1e\xbb\xfc\x0c\x03\x08\x30\x7d\xc4\xb9\x03\x0b\xe2\xa8\x49\x10\x12\xc5\x55\xc9\xd3\x3e\x88\x47\xac\x1e\xf1\x61\xda\x7e\x34\xa9\xa3\xd8\xc1\x26\x6b\x30\xc0\xd6\x2a\xf0\xc9\xd4\x23\xb2\x08\x77\x36\x9d\x8e\x47\x86\x67\xfb\x00\x52\x9b\xc4\xc4\xb0\x9b\x2a\x6b\x41\xbb\x0f\x4c\x77\x2f\x27\xc3\x07\x79\xc1\xf5\xb9\x15\x89\xf7\xae\xf6\x75\xd7\x20\x10\xce\x4b\xdc\x19\x3b\x24\x6f\x47\xcd\x6c\x49\x10\x5e\x3c\xdc\xeb\xee\x1e\x1c\xc1\x85\x60\x08\xa9\x0b\x21\x62\x3a\xa1\xa8\x3c\x1d\x6b\x2f\x4c\x83\x0a\x8c\x21\x8a\x23\xc3\x44\xa9\x5d\x55\x53\x41\x8e\x39\xdf\xc0\x46\xca\x0f\x76\xd0\xd2\x7a\x20\x4f\xdc\x0a\x11\xfe\xf7\x69\xe4\x38\x6c\xea\x20\xab\x94\x82\x29\x1e\xa9\x15\x2a\x03\x7f\x4d\x97\x18\x25\x00\x6f\xc3\x1c\x73\x22\xe0\x57\x22\xbf\xad\x6f\x01\x72\x14\x9d\xe9\x6e\x3c\x48\x7d\xe1\x61\x18\x61\x52\x55\x50\x68\x03\xce\xd6\x70\x88\x42\xd4\x19\xa4\xdf\x98\x96\x00\xe2\xac\x5d\xe8\x07\x11\x48\xbd\x4e\x8b\xda\x4c\x20\x94\x5e\x30\xee\x8b\xc9\x2e\x0a\x2b\xd7\xd5\x58\xd9\x58\x62\x42\x08\x30\xc8\x18\x24\x60\xac\x1c\x9b\x41\x40\xc6\x93\x9d\xec\x8b\xfe\x76\x52\x8c\xa9\xda\xa2\xcb\xfa\xdf\x75\x42\x50\x28\xca\xfc\x09\xd3\x09\x97\x84\xc7\x01\xa7\x91\x01\x08\x45\x89\xf9\x23\xa8\x09\x49\xd9\x66\xb0\x01\x25\x5f\x20\x83\xdf\xc2\x96\x4e\x25\xcf\x5f\xc2\xe1\x79\xfe\xaa\xf9\xee\xb7\xb2\x28\x21\xbc\x3f\xb7\x35\x94\x3b\xa4\x13\xb7\x19\x40\xa7\x54\xef\x05\x7e\x31\x6d\x65\xe1\x1e\x25\x0d\x8f\x50\x75\x28\x91\x87\x74\x60\x16\x6c\x67\x75\xa3\x8f\xe6\x29\x39\x93\x89\xcb\x06\x53\x5b\x24\xaf\x80\x15\x82\xd8\xe2\x75\xdf\x6c\x70\x06\x77\xc9\x6d\x5a\x59\x87\x2a\x40\x26\x21\xf9\xb3\x23\x26\xb3\x2b\x13\xe0\x60\xd4\x65\xc1\xa4\x65\x81\xff\x51\x39\x54\x18\xb7\x7f\xa5\xe5\x56\x95\xc8\x92\xe6\x8f\xc6\x23\x94\xa0\x55\x6e\x36\x84\x9d\x0b\xcb\x3e\x4d\x4f\xc5\xe6\x27\x7d\x39\xe1\xc9\xac\xb1\x16\x0d\xc3\x13\x70\xfd\x99\x89\xe5\x48\x04\x30\xbf\xb0\x4e\x16\x26\xbd\x8b\xd2\x1b\x71\x9b\x34\xe4\x46\xe2\x0b\x74\x5f\x5e\xea\x75\x86\x83\x56\x17\x08\x8d\x6e\x80\xc5\xac\x9c\x14\x80\xf3\xc8\x89\x80\x20\xfd\x56\xe3\x5f\xf1\xcd\x91\xb0\x1f\x45\xdf\x90\xcc\x39\x18\x8b\x0a\xdf\xb7\xf1\x57\x50\x9a\x27\x7a\x9b\x07\x28\x31\xd7\x72\x30\x8f\x7c\x96\x58\x7f\x81\xac\x0e\xc2\xcb\xad\xe0\x09\x5b\x05\xdd\x03\xbe\xd7\xce\xa9\x4a\xeb\x3e\x8b\x6a\xe5\x75\x89\xd1\x02\xa1\xaa\x6a\xbf\xdd\x59\xb2\x3a\xb7\x71\x9a\xae\x09\x25\x3d\xf2\x83\xff\x19\xba\xf2\x2a\x7d\xf4\x99\xb6\x24\x36\xdd\x22\x0e\x98\x60\xfd\xdd\x1d\x26\x34\x3b\x9e\x4f\x0d\x08\x56\x13\x58\x01\xd7\xac\x27\x0f\xd0\xe3\x38\xb8\x27\x23\x5e\xf5\x04\x6b\xaa\x9b\x21\xd2\x8a\x9d\x5a\x87\x19\xb5\x21\x6d\x2b\xd9\x51\x85\x59\x86\xb4\xa6\x2a\x9d\x83\x70\x77\x4b\xe4\x74\xe6\xad\x10\x4d\x07\xc4\xe6\xd8\x9d\x2a\xbc\x10\xbb\x42\xbf\x8e\x2d\x44\x25\x3b\xfa\xe1\x4e\x5a\xba\x1c\x71\xe4\x75\xb9\x1d\x18\x7f\xd9\x49\x65\x38\x89\x6b\xd7\xbc\x8e\xe7\x81\x2d\xd0\xc1\x41\x20\xb0\x14\x23\x80\xf2\x86\x37\x83\xbd\xb3\x93\xa4\x7d\x5f\xb9\x45\xc8\x1d\x17\x74\x15\x78\xe7\xba\xab\xf9\x94\x8e\x9d\xaa\x43\xc1\xb4\xdd\x6a\xe7\x46\x56\xfb\xf2\x01\xe8\x7a\xf6\x20\x84\xe9\xb0\xc1\x7e\xfb\x5d\x2c\x01\x1a\x8b\x56\x69\xab\xc9\x8d\x04\x91\x6f\xc9\x47\x0e\x99\x0d\x37\x7a\xc4\x79\x19\x8b\xc2\xf2\x4b\x6f\x22\xa9\x3c\x22\x43\x46\x00\x34\x17\xad\x23\x35\x40\xe7\x1f\x95\xfc\x33\xcd\x25\x63\xb4\x96\xd2\x3c\x81\xc3\xa1\x33\xd7\xe0\xdb\xb5\x64\x90\x0f\x5b\xa8\x23\x6f\xe7\x14\xcd\xbd\x14\xb1\x05\x44\x28\x6b\x0f\x18\x87\xa0\x08\xcf\x9c\x64\x23\xc9\x52\x74\x98\xf3\xad\x66\x6b\xd9\x59\xec\x6f\xc9\x55\x37\xab\xd3\xcf\x30\x08\xb4\x69\xc9\xdd\x7f\x54\x84\xc7\xfe\x65\x00\xce\x04\x53\x95\x3a\xf0\x03\xd2\x46\x71\x7d\x83\x23\x07\x6a\x4c\x1b\xd5\x1b\x43\x13\x2c\x41\x36\x2d\x22\xd1\xc1\xdf\x00\x14\xd3\xaa\xae\xf5\x76\x57\xb7\x94\x10\x5b\x2f\xc3\xdd\xfb\x50\xa4\x09\x82\xb4\x00\x0e\x16\x56\x03\xd5\xd4\x7a\x1d\xd4\x7b\x74\xc0\xd0\xfc\xcc\x3e\xd8\xa7\xb5\x47\x34\xd2\x2e\xd9\xd1\x2e\x0c\xa2\xee\x4a\xb5\xbb\x0f\x8e\xab\xf3\xfe\x40\x78\xb5\x71\x14\x2a\x03\x6d\x0f\x60\x00\x03\x27\xb9\xd3\xa4\xab\xc9\x2c\x2f\x03\x61\x59\x11\xc4\xc3\x9b\x06\x1b\xa2\x04\x21\x08\x80\x8e\x6a\xdf\x19\x8d\x98\x9b\xa5\xb0\xad\xca\xcd\xa0\xd7\x69\xd6\x69\xf7\x05\xc5\x3f\x79\x62\x16\x72\x38\x84\x61\x0d\x0a\x0e\xf9\xc9\xaa\x0f\x6b\x58\x61\x89\x7b\xe4\xb0\x45\x8d\x87\x6f\x54\x9a\xc1\xc6\x36\x5b\x67\x43\x49\x42\xfc\xac\x1d\x0e\x73\x0c\xc1\xad\xed\xd9\x24\xa4\xb4\x05\xaa\x95\x75\x21\x5f\x9d\xc9\x04\xac\x94\x4d\xcd\xd5\x08\xba\xaa\x78\x75\x5e\x17\xa5\x2e\x60\xcc\x5b\x43\x28\x7f\xcd\x10\x7a\x3d\x12\xc7\x3a\x04\xfd\x48\x75\xd5\xd9\x13\x79\xac\x27\x11\x02\x38\x53\xb4\x06\x36\x69\x59\xd5\xa8\x1a\x6c\x1d\x07\x7b\xa3\xd1\x19\x53\x6c\x8e\xaf\x17\x71\xc2\xb7\x3d\x56\x7a\x86\x1e\x97\xdf\x5c\x8b\x0f\x96\xeb\x3d\x25\xfb\xdc\x53\x61\x74\xcd\x41\xf7\x3c\x18\x5d\x42\x49\xac\x75\xba\xb3\x27\x65\xce\x9a\x60\xde\xb1\x60\x2b\x53\xda\xbb\x8b\x77\x84\xbd\x12\xdc\x7e\xac\x3d\xb6\x3f\xc0\x5e\x20\x6c\x1e\x2c\xa6\x70\x20\x18\xfc\x60\x5f\xc0\xf4\xb3\x9d\x0c\x30\xe3\xb0\x31\xf0\x28\x88\x98\xd9\x57\x27\xac\x8a\xed\xcf\xb3\x37\xfd\x11\xd5\x0e\x01\x5c\xef\x3f\xf7\x2a\x03\xff\xb1\xb0\xac\x15\xb9\x7e\x0c\x79\x0a\x6d\xbe\xdf\x5e\xac\x21\xfe\xf6\xfc\x0c\x4f\xd3\xd7\x18\x9f\xdb\x41\x95\x8d\xf1\x14\xc8\xd8\xa4\xa4\xde\x07\xac\xbc\x0a\xc0\xfd\x8c\xbd\xf3\xb3\x16\x6a\x8d\x24\x0e\x8d\x8a\xa8\xa2\x4c\x10\xee\xc1\xed\xc4\x8a\x26\xf2\xec\x45\x18\xa1\x30\x27\xed\x3a\xcd\x32\x85\x30\x64\xcb\xdf\xd1\xce\x75\x40\xa0\x1d\xec\x61\x4a\x0f\xa8\x4a\x60\xe2\x09\xe4\xa4\xd7\x94\xdf\x79\x32\x07\xed\xb7\x8a\x02\x0d\x59\xfa\x45\x9b\xb3\xdd\x59\x0b\xec\xdc\x2b\x3b\x44\x1e\x6d\x5a\x5e\x60\xfe\x32\xe0\xc0\xf1\xe1\xb5\xe6\x7c\xae\x44\x9b\x07\xbb\xf3\x92\x02\xc8\x74\x58\x26\xa8\xa9\x4e\x18\x1d\x3e\x64\x7f\xf1\xca\x76\xd2\x80\x2e\xb9\x63\x06\x7c\xe6\x2e\xb3\xfb\x1d\xdf\x0b\x16\xc7\xe1\x08\x03\x6e\xac\xed\x9c\x93\x1d\x41\x97\x94\x1b\x80\x96\x8b\x6d\xf9\x9b\x91\xb5\xe2\x6c\x20\x87\x7c\xdd\xd1\x67\xc8\x72\xbe\x2c\x1e\xf3\xaa\x2e\xb5\xda\xca\xb9\xc5\x94\x0c\x04\xf2\x23\xd9\x03\xe7\x48\x4d\x50\x98\xec\x08\x2f\x54\x9a\x46\xb3\x06\x42\xe9\x73\xdf\x49\xb4\x5e\x43\x44\x45\xa2\x91\x1b\x7a\xbf\x2e\x12\x99\x47\x00\x64\x1d\x68\x3f\xf8\xc3\x1a\xee\x82\x6a\x67\x5c\x09\x86\x51\xd8\xea\x1c\xac\x1b\x4c\xcd\x98\xa1\x2d\xeb\x15\xe2\x78\x16\xa3\x23\xb8\x1a\xe6\xb2\xa7\xf3\x1a\xdc\x23\x97\x93\xe9\xa1\x69\xef\x67\x69\x6c\x1e\x88\xe4\x06\xa1\x90\x10\x2b\xc8\x7c\x4e\xa8\xc8\xd8\xe4\x5e\x5a\xd5\xec\x13\x63\x8c\x54\x95\x46\xa0\x69\x91\x93\x51\xb6\x5f\x01\xaa\x0b\x83\x3c\xe1\x33\x60\x89\xea\xf2\x0e\x4d\x7c\x9f\x70\xca\x78\x3f\x4f\x6f\x53\x04\xee\x32\xfa\x29\x97\xed\xce\x45\x02\x90\xdc\x98\xb8\x81\x61\x36\x36\xbc\xd7\x55\x73\xf2\xf2\xf4\x36\x21\x65\x00\xf6\xc8\x2a\xf7\x01\xf1\x78\xaf\x6a\x60\x00\xb4\x47\x21\x23\xe8\x31\x03\x82\x49\xf2\xc3\x4f\xe6\xf2\xd6\x09\x94\xf9\x61\xdc\x04\xb2\x8e\xba\xaa\xe5\xbd\x4a\xd0\x13\xd8\x67\x50\x3b\xe1\x63\x57\x77\xa5\x7e\x48\x8b\x7d\xe5\x0c\xac\x48\xee\xb2\x3d\x48\x49\x63\x1d\x5d\xb3\x40\xe0\x28\x70\x29\x20\x65\xe1\xa5\x7a\xa4\x4d\xd6\x7e\xf1\xff\x7e\xaf\x2a\x91\xd6\x0d\xa2\x51\x2a\x4b\xb3\xb7\xbb\xde\x6c\x8a\xb2\xae\x1a\x26\x32\xb9\xd3\xe6\xc0\xe9\xf2\x7b\x39\x17\x46\x85\x70\xb6\xad\x84\xa3\x66\xa3\xd3\xdc\xf1\x50\x8d\xdd\x4d\x7a\x16\x12\x16\x1c\x3a\x5e\x2f\xec\x56\xd5\x3a\x92\x65\x71\x50\x19\x25\xaf\x0a\x0f\x93\x86\x5b\xca\x6b\x4a\x57\xb9\xba\x68\xb3\xfc\x04\x6f\xcc\x53\xe4\x79\xcf\xd2\x9a\x4a\x23\x7d\x31\x4d\x25\x21\xd9\x73\x0a\x71\x41\x74\x63\xf7\x80\xd8\x84\xba\x3d\x48\xc5\x64\xea\xb1\xda\xa7\x75\xdf\xec\x1f\x7d\x67\x3d\x75\xcf\x28\xa7\x0f\xbb\x73\x3a\x71\xc9\x89\x08\xaf\xa2\x48\x56\x88\x5e\x89\x1c\x3c\x10\x70\xa2\x8a\x78\xe4\xcd\xc8\x94\x36\x6e\xe5\x68\xc9\xd0\xf8\x77\xf0\x23\xa8\x98\x30\x47\xed\xf9\x40\xde\xc0\xeb\x2b\xe6\x3c\xcb\x31\x44\x58\x94\x3d\xc6\x62\x34\x2c\x44\xb3\x9f\x6c\xb8\x15\x00\xf0\x1d\xb3\xd7\xb8\x97\x3d\x66\xb4\x80\xbe\xc4\xea\x8d\x56\x58\x6a\x35\x70\x05\x45\x50\xc4\xcc\xa4\x78\xc2\x81\xfe\x29\x5f\xce\xad\xfc\xa9\x0a\x1a\x6d\xc9\xdf\xa8\x5a\x22\xf8\x9c\xa5\x66\x09\x86\x9c\x12\x47\x20\x94\xea\xff\x5a\x16\x8f\x84\x28\xa2\xf3\x31\x73\x11\x05\xef\xc1\x91\x43\x0e\x65\xa5\x56\xc9\x41\xaa\x35\x19\x35\x66\x93\xe9\x52\xa3\xd9\xc9\xbf\x8d\xf8\x7a\x30\xc7\x03\x24\xea\x68\xb6\xad\x71\xbd\x55\x79\x6e\x8c\x03\x57\xab\xdc\x86\x12\x6f\x1a\x0b\x03\xce\x69\x5c\x1b\x96\x45\xa0\x31\x24\x98\x83\xa1\xab\x9e\x13\xc5\xd4\x55\xd7\x24\xb9\xd2\xc2\x35\x09\x92\x41\x8a\x21\x39\x9e\x65\xc4\xdb\xbe\xab\xde\xd4\x7b\xb7\xb0\x42\x0a\x57\x10\x3f\x75\x51\x53\x54\x9c\xb7\xec\x22\x11\xcd\x62\x91\xf5\x1c\x0d\x89\xc3\x38\xd4\x05\x9e\x1a\x3c\x43\x15\x97\x64\x6b\x52\x59\xc6\x31\xc3\x88\x5c\x05\x1f\xb1\x08\x52\x3f\x1e\xc0\x6f\x16\xee\xca\x8c\xb1\xf6\xd0\x0d\x17\xda\x5c\x18\xba\x81\xd0\x85\x2d\x89\x8f\xcc\xca\xcc\x92\xc7\x34\x71\xc7\xcd\x29\x32\xb8\x40\xb3\xec\x79\x14\x14\x95\x7b\x2b\xf0\xc8\x02\x8c\x98\x7a\x3a\x42\x68\x94\x99\xc8\x88\x70\xce\x6e\x7b\xe3\xde\x76\x0c\x24\xc8\x93\xf0\x84\x11\xa2\x99\x4b\x02\x1c\x91\x23\xab\x62\x20\xc4\x98\x03\x30\x2c\x3f\x8c\x78\x7d\x7b\x45\x41\x70\xa9\x17\x86\x0e\xf0\x70\xc8\x0f\x1c\x00\x91\xea\xae\xd4\x88\x36\xa0\x4c\x78\x5a\x63\x70\x8d\x85\x20\x12\x9d\x17\xe4\xa8\x20\x3d\x37\xc0\x80\x80\xdc\x01\x9c\x58\x78\xfa\x89\x25\x3e\xcb\xf9\xc9\xa2\x69\xf8\x02\x49\xba\xf7\x1d\x78\xdf\x83\xce\x15\x16\x1c\x02\xe4\x54\xee\x29\x62\x8f\x1f\xf1\x79\x0f\xfb\x03\xa0\xff\x83\x59\xee\x11\x60\xbb\x11\x17\xc1\x40\x1d\x5a\x14\x96\x9b\x91\xa8\xc1\x11\xdf\x7d\xa4\xb7\x47\xfb\xe5\x17\x59\xc3\x73\xdb\x50\xa3\x86\xb1\xfa\x25\x87\xb9\x00\xd3\x14\xa5\x78\x91\x15\x37\x68\xa8\x45\x10\x75\x03\x0b\x02\x4a\x4e\x82\xc0\x84\x78\x5d\x8c\xe6\x5b\x72\x6c\xb3\x96\xcd\x5a\xb1\x05\xbb\xc9\xb7\xeb\x6e\x1c\x8f\xa1\x63\xec\xe5\x97\x88\x46\x4d\x80\xbd\x99\x21\xe1\x1f\x72\xfb\x62\x1c\xc1\x46\x8a\x30\xf2\xe9\x70\xa7\xc2\x09\x97\x74\xf6\x15\x85\x4b\xaa\xc2\xbd\xdc\xa1\x44\xcb\x12\x49\xf1\x0b\x99\xe8\x5d\x99\x3e\x68\xe3\x50\x95\x80\x0c\xa1\x21\xf2\x18\xbe\x71\x8a\x82\xe5\x80\xce\x70\x5a\xf9\xa1\x16\x26\xd0\x12\x27\xcf\xed\x1b\xa2\xdf\x74\x16\xd9\xa1\x14\x66\xe5\xb0\x32\x8e\x3d\x53\x44\xe6\x3b\x49\xd6\xfd\x71\x90\xfa\x81\xec\xfd\xb9\xb9\x58\x98\x3c\xcf\x86\x5f\x28\x39\x62\x89\x62\x88\x56\xd4\xdc\x08\xec\xea\x37\x97\x16\xb1\x72\x70\x3c\xbe\x6e\x14\x01\x0a\x52\xb7\xdf\xe7\x75\x79\x88\xac\x72\xb0\x6d\x17\xd6\xc6\x75\x95\x0f\xca\xf0\x9b\x78\x13\xf2\x16\x0d\x60\x17\x69\x62\x8e\xcb\x0d\x12\x98\x62\xfb\x5c\xde\x92\x1e\xd0\x60\xea\x47\xdb\x55\xc0\x72\xc8\x52\xfd\xa0\x1d\x20\x02\xf6\x5c\x64\x6e\xa1\x6a\xaf\x10\x59\x85\x66\xf2\xba\xc8\x73\x1d\x30\x74\x9a\x3b\x35\xd3\x81\x1b\x61\xb6\x0b\x4e\x33\x9c\x6b\xc2\x2f\x52\xf7\x7c\x61\xa8\xdd\xd8\x95\xc5\x7a\xcf\xae\xd5\x83\x3e\x90\xd3\x1b\xb5\x76\x39\x54\xda\x9b\x93\x48\x74\x9d\x41\x60\x0d\xf8\xd0\x5c\x40\xa6\x1a\x47\xa5\x6b\x42\xac\x51\x46\xd8\xee\xad\x85\xda\xda\xb6\xd9\xab\xc2\x66\x2a\x58\xa2\x6b\x93\xae\x03\xcf\x28\x68\xa6\xa8\x19\x5c\xd5\x68\xa3\x19\x03\xbc\x97\xcd\x6d\x10\x38\xd4\xb8\x90\x29\xb2\x13\xd0\x08\x88\xae\x25\x01\x71\x6e\x48\x27\xdb\x92\x7b\xb0\x51\x87\xcd\x57\xa6\x95\xec\x25\x69\xb5\x2e\x53\xb8\x4c\x8a\xf2\x00\x85\x9f\x5d\x44\x6d\x5e\xf2\xad\x5a\x17\x3b\xed\x6e\x41\xc4\x64\x47\x96\x81\xa4\x6a\xba\x2b\x11\xa1\x96\x2d\xe0\xc7\xb1\x00\xa0\x45\x80\x9f\x14\xe8\x01\xfb\x30\x21\xe7\xe7\x38\xfd\xf3\x80\xab\xec\x38\x4b\xd6\x20\xf0\xb1\x8e\xd4\x61\x6e\xac\x04\x96\x72\x3e\xaf\xb9\x91\xdc\xda\x24\x38\x57\x80\x68\xe4\x04\x1f\x8d\xc7\xca\x58\x8d\x04\xe2\x74\x65\x7e\x10\x0c\x63\xc5\x05\x6c\x1f\x98\xea\x08\x38\x31\xf7\xdf\x4e\x1d\x18\x94\x18\x24\x0b\xea\x43\x48\x95\x40\xa8\x24\x8e\xa0\x12\x53\x9d\x59\x5d\x22\x3c\x51\xdc\x36\xf0\xde\xd7\x7a\x36\x9a\x64\x11\xb3\x67\xe3\x30\x0b\x3f\xb4\x8a\xb6\x2b\x07\xe3\x5a\xcb\x8b\x43\xab\x11\x54\xf9\xf8\xab\xa7\x69\xba\x01\x3d\x66\xfb\x48\x08\x2b\xd5\x82\x67\x5b\x10\x2b\x02\x69\xc4\x09\xa2\xd8\x52\x8d\xda\x0f\xec\x9c\x17\x15\x13\x03\xf7\xf1\x66\x5a\xf5\xe5\xae\x4c\xa9\xc4\x13\x6f\xe3\x24\x7c\x35\xd5\x94\xf1\xfe\x24\x88\x79\x45\x70\x7f\x2e\x42\xae\xf8\x38\xc4\x6a\xa2\xd6\xee\xa5\x34\x09\x4c\xa2\x86\x80\x40\x82\xc5\x10\xb4\x3e\xdd\x99\x26\x6d\x61\x65\xb8\xe7\x1e\x95\xf5\x96\x23\x17\x55\xbf\xf8\x45\x5e\xab\x72\x7d\x0f\x5a\x43\x88\xf5\xb9\xb7\xbc\xa6\x5e\x70\xcf\xe2\xdc\x80\xd0\xac\xdc\xdb\xdc\x1d\x39\xcf\x3e\x74\x06\x28\x6e\xb6\xbb\x2c\xd5\x89\x9d\x11\x4f\xe3\x62\x63\x23\x32\x01\x93\x35\xa1\x14\x0e\x9e\x5d\xbc\xd2\x9e\x15\x42\xe2\xf6\x4d\x3c\x9c\xed\x26\x70\x2c\x19\x6f\xf8\x62\x20\xa7\x85\x5c\xec\xcb\x52\xc3\x67\x8b\x8d\x9c\x01\xad\xd8\x4f\xa0\xa5\x94\x14\x5b\xb4\xdb\x1a\x84\x73\x18\x8f\x48\x88\x2f\x4b\x9e\xb0\x43\x08\x94\x6a\x7b\xa0\x2a\xc1\x5c\x05\x5b\x8d\xb6\x4f\xa6\xad\x7d\x61\xe7\xaf\x54\x49\xba\xae\xd9\x74\x0f\x64\xfc\x1a\xd9\xb4\x03\x3b\x72\xfa\xeb\x7a\x4f\x27\xb1\x2d\x12\x3a\xfe\x5d\x2b\x90\xb7\x56\xf9\xf1\x43\xc6\x58\x51\x40\x6c\xcd\xa5\x5b\x55\xba\xdd\x67\xb5\xca\x35\x12\xe4\x20\x5e\xae\x45\x12\xd5\xc9\xe1\x01\xdd\x34\x36\x7c\x8d\x94\x20\xde\xd7\xc8\xd8\x6b\xb9\x97\x14\x78\x11\xc2\x6b\x61\x5a\x4b\x05\x3c\x1d\x8d\xb0\x10\x9f\x87\x66\x64\xe1\x54\x72\x79\x6e\xae\x5c\x83\x4d\x09\x26\x6e\x96\xe9\x75\x2d\x15\xbb\x6e\xb0\xe9\x6c\xfd\xa2\x3d\x96\xbc\xfd\x5a\x17\xe6\x70\xd9\xfa\x76\xba\xc7\xe7\x8e\x11\x65\x70\x91\x49\x94\x09\x83\x7e\x76\xd8\x56\x05\x98\x7d\x45\xa0\x9e\x10\xea\xd6\x90\xcb\x8d\x99\x84\x4d\x69\x36\x30\x22\x24\x19\x31\x16\x1e\x97\x8e\x5b\xc7\x2c\xd7\xe7\x03\x39\xd7\xdb\xa2\xd6\x72\x4a\x76\xf6\xd8\x91\x8d\xbf\x95\xb7\x16\xbc\xf6\x0d\xe9\xbc\xdf\x06\xd3\x4b\x1b\x42\x8f\x0e\x26\x0a\xe6\x75\xbb\x62\x04\xb1\x0c\x1e\x71\x38\x7a\xb8\x56\x48\xc7\x31\x69\x38\xfa\x7b\x51\x42\x07\xb3\x43\x07\x5f\xba\x05\x68\x9f\xa4\x9b\x50\x39\xd2\xd6\x63\x82\xbf\xe6\x31\xb0\xf7\x85\xca\x65\x01\x7f\x44\x15\x2f\x2f\x83\x73\xd4\xb5\x28\x1a\x4f\x5f\x71\xb2\x1f\xf2\x1e\xdf\xac\xa7\xfd\x8e\xfa\x68\xeb\x45\x09\x30\xf9\x98\xa9\xda\x55\xbf\xab\xf2\xe0\xc8\xbb\xa8\xa2\x54\x59\x3e\x0b\x5b\xbe\x4d\xea\x45\x50\xf7\xdc\xed\x12\xe2\x61\xec\x53\xd9\x1e\xaf\x77\xa7\xfc\xab\xe5\x0c\x5c\x1d\xba\x55\x37\x8e\x88\xa4\x38\x93\xc3\x8a\x11\x25\xd6\xf8\xe6\xe2\x13\x17\x74\xb0\xe1\x86\xdf\xba\x1e\xad\x0b\x10\x04\x0c\x04\x08\x68\xe2\x8d\xb9\x4a\x73\xdd\xca\x92\xb1\xc9\xdf\x25\xc2\xd1\xec\xae\x78\xa2\xbb\x54\x5f\x48\x9e\x43\xa0\xbf\xeb\x69\xc6\xda\x33\x24\x54\xb2\xc0\xb8\xe7\x31\xfc\x69\x96\x05\xf5\x1b\x01\xd3\x17\x80\xb1\x6d\x49\x65\xfb\xf2\x67\xdc\xb5\xeb\xaa\x2d\xba\x00\xfb\xd6\xb2\xb6\x80\x8d\xbe\x55\x69\x1e\x60\xb1\x7f\xc5\x84\xd3\xa1\xf4\xc2\x1c\x4a\x0f\xa9\x19\xc4\x8f\x81\xd0\x55\x90\xa8\x32\xdd\x3d\x26\x4f\x88\x28\x66\xa4\x5c\x93\x25\x3d\x8b\xc4\xba\x3c\x79\x9b\xca\x9f\x94\xa7\xf5\x7a\xf0\x48\x4f\xb7\x78\x45\xa4\x5b\x3d\x90\x0b\x73\x32\x04\x4f\x33\x43\x20\x56\xda\x72\x14\xa6\xb9\xac\x76\x69\x99\x5a\x6b\x97\x4b\x02\x83\x78\xaa\x69\x2b\x02\x4b\xcd\x17\x12\x5d\x93\x8e\x15\x09\xb4\x08\xf3\x8a\x5d\x59\xac\x32\xbd\x25\xc3\x2d\x5f\xeb\x32\xb7\x49\x4b\x1e\xe0\xb4\x22\x0e\x58\x30\x50\xcd\xc2\xd8\xa7\x15\xd8\x53\xfc\x89\x7c\xbf\x5d\xe9\xb2\x85\x18\x64\x00\x30\x97\x1e\x58\xc0\x38\x7e\x3e\xa8\xd8\xb3\x33\xf8\xf4\x70\xf5\x28\x61\x90\xa9\xda\x6d\x82\x1e\x5a\x4e\x64\x7e\xd5\x51\x28\x8e\x47\xe8\x79\x73\x3a\x79\x61\x44\x5a\xd2\xa2\xa1\x1a\x44\x51\x1d\x06\xe4\xb5\x1b\x5a\x32\x27\x5d\xd0\x02\x27\xb9\xc4\x61\xf8\x63\x2b\xa8\x35\x48\x0e\xbb\x07\xa3\x75\x70\xea\x4a\x02\xdf\xfe\xdd\x83\xe3\x32\x51\xeb\xfb\x82\x93\x60\xfc\x2c\x08\x74\xfa\xc2\x50\x4f\xb7\x12\x6c\xc9\xce\xb9\x24\xdb\xdc\xac\x9c\xaf\x07\xc8\xcf\x25\x7a\x9d\x26\xac\xc8\xbc\xd9\x03\x4b\x93\xb7\x11\xc4\xf7\xcd\xac\x79\x12\x55\x6d\x44\x96\x43\xe5\x2b\x64\x33\xf1\x83\x16\x43\x08\x50\xbc\x20\x63\xef\x04\xa9\x7c\x7c\x89\x97\x09\xa2\x2a\x02\x1a\x17\x78\x3a\x0f\x0c\xc7\x98\x9c\xfd\x32\x81\x99\x65\x1b\xdf\xf6\xc4\x0c\xac\x95\xfe\xf6\xf0\x8b\x40\x06\xc5\xec\x0c\x7e\xc9\x87\xc5\x52\x88\xbc\x08\xbe\xe0\x99\xa7\x0d\x1b\x1d\xd8\xd3\xa0\xd9\x5c\x70\x14\xe4\xb7\x00\x08\x42\xca\x74\x9e\x56\x77\x51\xb1\xc6\x24\x2c\x70\x48\xe9\x79\x8b\x93\x4e\xbf\x97\x03\x5b\x1f\x80\x8b\xea\x13\x55\x08\x98\x33\xef\x43\x3c\x8f\xe5\x78\x21\xa7\x33\xf9\x69\x38\x9f\x0f\xa7\xcb\xcf\xf2\x6a\x36\x97\xcb\x0f\xb1\xbc\x99\xcf\xde\xcf\x87\xd7\x91\x5c\xce\xe0\xbf\xe3\xbf\x2c\xe3\xe9\x52\xde\xc4\xf3\xeb\xf1\x72\x19\x5f\xca\x77\x9f\xe5\xf0\xe6\x66\x32\x1e\x0d\xdf\x4d\x62\x31\x19\x7e\x1a\xc8\xf8\x2f\xa3\xf8\x66\x29\x3f\x7d\x88\xa7\x72\x66\x9e\xfe\x69\xbc\x88\xe5\x62\x39\x34\x9f\x1f\x4f\xe5\xa7\xf9\x78\x39\x9e\xbe\x87\xe7\x8d\x66\x37\x9f\xe7\xe3\xf7\x1f\x96\xf2\xc3\x6c\x72\x19\xcf\x41\x81\xeb\xd9\x6c\x2e\xe0\x8b\xf2\x66\x38\x5f\x8e\xe3\x85\x69\xc6\xc7\xf1\x65\xec\x37\x49\xf6\x86\x0b\x39\x5e\xf4\xe4\xa7\xf1\xf2\xc3\xec\x76\xe9\xda\x3e\xbb\x92\xc3\xe9\x67\xf9\xe7\xf1\xf4\x32\x92\xf1\xd8\x3c\x48\xc4\x7f\xb9\x99\xc7\x8b\x45\x7c\x29\x67\x73\x39\xbe\xbe\x99\x8c\xe3\xcb\x48\x8e\xa7\xa3\xc9\xed\xe5\x78\xfa\x3e\x92\xef\x6e\x97\x72\x3a\x5b\xca\xc9\xf8\x7a\x6c\xda\xb9\x9c\x45\xf0\x36\xfa\x2c\x3f\x7d\x1c\x2f\xc4\xec\x4a\x5e\xc7\xf3\xd1\x87\xe1\x74\x39\x7c\x37\x9e\x8c\x97\x9f\x41\x36\xec\x6a\xbc\x9c\xc6\x8b\x05\x0c\xdd\x10\x5b\x3e\xba\x9d\x0c\xe7\xf2\xe6\x76\x7e\x33\x5b\xc4\x03\x1c\xc0\xe9\x72\x3c\x8f\xe5\x7c\xbc\xf8\xb3\x1c\x2e\x04\x0d\xeb\xbf\xdf\x0e\xed\x73\x6e\xe2\xf9\xd5\x6c\x7e\x3d\x9c\x8e\x62\xd3\x15\xbf\xcb\xe3\x05\xf4\x56\x7e\x9e\xdd\x0e\xe4\xe2\xc3\xec\x76\x72\xe9\xff\x5d\x98\x61\x8a\xe5\x65\x7c\x15\x8f\x96\xe3\x8f\x71\x64\x3e\x28\x87\x8b\xc5\xed\x75\x4c\xa3\xbd\x58\xc2\xf0\x4c\x26\x72\x1a\x8f\xe2\xc5\x62\x38\xff\x2c\x17\xf1\xfc\xe3\x78\x04\xa3\x30\x8f\x6f\x86\xe3\xb9\x9c\xcd\xc5\x68\x36\x9f\x9b\xa7\xcc\xa6\xb4\x84\x5e\x0d\xb0\xfa\xc0\xe6\xd4\x26\x0c\x79\x37\x07\xc6\xd4\xac\x9e\xf8\xa3\x59\x1b\xb7\xd3\x89\x19\x86\x79\xfc\xef\xb7\xe3\x79\x73\x85\xc8\xc9\xf0\x93\x99\x82\xe1\xfb\x79\x0c\xa3\xec\x2f\x88\x4f\xe3\xc9\x44\x98\xa9\x6b\xae\x8a\x08\xbe\x32\xfd\x2c\xdd\xaa\xf8\x2c\x3f\x7d\x98\xc9\xeb\xd9\xe5\xf8\xca\x2c\x10\x5c\x35\x72\x34\x9b\x7e\x8c\x3f\x2f\x82\x41\x19\x2e\xbc\xe5\x3a\x7c\x37\x33\xe3\xf2\x2e\x96\x93\x31\xb4\x67\x39\x83\x41\x32\x93\x76\x39\xbc\x1e\xbe\x8f\x17\xde\xb2\x80\x77\x92\xec\x71\x24\x17\x37\xf1\x68\x3c\x9c\x44\x62\x3c\x1d\x8d\x2f\xe3\xe9\x72\x38\x91\xf8\xce\x45\xfc\xef\xb7\x66\x62\x87\x13\x7e\x88\x1c\xce\xc7\x0b\xf3\x04\xb3\x32\x69\x16\x6f\x17\x31\xac\xbe\x29\xaf\x9a\xe5\x4c\x98\xdf\xf9\x33\x7c\xe2\xde\xdd\x5e\x91\x72\x32\x5b\x2c\xcc\xd3\x2e\x87\xcb\xa1\x84\x16\x2f\x87\xf2\x5d\x6c\x3e\x3d\x8f\xa7\x97\xf1\x3c\xbe\x14\xe3\xe9\x70\x34\xba\x9d\x0f\x97\xf0\x32\xf3\x8d\x78\x21\x17\xb7\x8b\xe5\x70\x3c\xc5\xd9\x30\xfd\x85\xed\x3d\x9e\x5f\xda\x1d\x06\x8b\xf6\x6a\x38\x9e\xdc\xce\x79\xd9\x09\x6e\xd4\x72\x26\x67\x37\x31\x3c\x12\x96\x9f\x37\x13\xf8\x89\x45\x3f\x82\xc9\x97\xe3\x2b\xb9\xb8\x1d\x7d\xa0\x69\x33\x0f\x85\xcf\x09\x9c\xb1\x0f\xc3\x85\x7c\x17\xc7\x53\x39\xbc\xfc\x38\x86\xbd\x48\xcb\x7b\xb6\x58\x8c\x69\x4c\x66\xf4\x04\x1a\x47\x5a\x7c\x3f\x0f\xd0\x87\xdc\x95\xda\x2d\xc0\x45\xab\x50\xc9\x5d\x5d\x49\x70\xda\xd9\x7a\x28\x94\xae\xf7\x57\xb1\x2b\xdc\xb0\x70\x7b\xc4\x6b\x63\x28\xc2\x58\x5e\x68\x00\x65\xc5\x5a\x65\x54\xc2\x84\xb4\xca\x84\x91\xa7\xf3\x17\xab\xe4\x08\x68\x6e\xcc\x43\xfd\x88\x8e\xd0\x1e\x3c\x3e\xa0\xe3\x40\x13\x99\x9e\xa4\x1e\x29\x42\x54\x54\xb5\x5c\x67\x05\x56\xfe\xee\xcc\xcd\x07\xaa\x10\xa8\x4f\xb5\xaa\x8a\x6c\x5f\x6b\x64\x8d\x46\x03\xc4\xd8\xdd\xe9\x43\x9a\x09\xd7\xf6\x8e\xd0\x60\x50\x20\xc9\x90\xe4\xa0\x32\xcc\x95\xa4\x88\x60\x20\x5c\x69\x7b\x13\x98\x64\x71\x11\xb9\x2c\x75\xbd\x2f\x7d\x5a\x5b\x19\x4f\xcd\x84\x1e\xd1\x51\xfc\x50\x3c\x9a\x41\x1a\xc2\x00\x20\xfe\x6f\xc9\xc5\x07\x9f\xcd\x55\x36\xd5\x8f\xfc\xf8\xca\x26\x21\x49\x9e\x88\xf4\x23\x77\xbe\x00\x83\xa7\x3b\x4c\x49\x36\x6a\xe3\x1d\x94\xad\x1a\x97\xbe\xc0\x14\x9e\xd8\x57\x2d\x69\x36\x4c\xae\x55\x35\x12\x49\x15\x52\xad\xef\x21\x29\x63\xe1\xc2\x94\x58\x05\xca\x5c\x5f\x94\x16\x0d\x1d\xcd\x72\xe4\xa8\x8d\x11\x8a\xf7\xb2\xd8\xb5\x4d\x51\x56\xae\x24\x61\x49\x88\xc2\x48\xaa\xba\x56\x14\x52\x76\xa6\x29\x97\xc6\x59\xcb\x9e\xd0\xa3\x63\xf0\x8a\x2a\xb5\x31\x4d\x36\xcd\x85\x2f\xdb\x6c\x4a\x8d\x8c\x29\x58\x87\x03\xb0\x33\xaf\x06\x03\x85\x67\xaa\xda\x51\xb0\x67\x07\xb4\xa7\x28\x24\xee\x31\x3f\x5a\xae\x65\xe4\xe8\x30\x4f\x82\x47\x54\xf7\x10\x10\xc2\x94\x9d\xa3\xcf\xd3\xb2\xb7\x76\xca\x95\x19\xba\xb1\x89\x54\x62\x57\x40\x70\x03\x03\x55\x4c\x77\xb4\xd9\x5b\x3a\x5b\xd3\x9b\x8d\x31\x38\x07\x42\xfc\x8b\x19\x47\xf8\x2e\x13\xe5\x79\x5d\xff\xa9\x82\x6a\x32\x7c\xac\x5c\x95\xa9\xde\xc8\x34\xd1\x4a\x32\x73\x14\x25\x58\x06\xff\xda\x54\x9a\xff\x97\x83\x56\xe5\xbf\xca\x7f\x81\xaf\x17\x5c\x89\xf9\xaf\x02\x15\x38\x76\x0e\xe0\x13\xcc\xef\x1b\xab\x5e\x1d\xcc\x6a\x5a\x37\x54\x99\xd3\xda\xe2\xb3\x02\xff\xf8\x7b\x8c\x5d\x55\x75\xdb\xe2\xa2\x53\x12\x9f\x9c\x92\x96\xc3\x3b\xf1\x4a\x4f\x4e\xc2\x62\xe1\x7e\xdb\x4b\x1a\xb4\xfb\xed\xba\x67\x6b\x5d\xee\x8b\x9d\xb6\x95\x5a\xe0\x7a\xa3\x51\xbe\xd9\x67\xe8\x55\x92\xa9\x05\x77\x34\x9b\x5b\x6f\x7d\x85\x62\x7c\x0e\x85\xca\xbd\xc3\x66\xd3\xb2\x98\x8a\x92\x0d\x26\x71\xdc\x60\x5a\x68\xfd\x9d\x83\xba\xa1\x5c\x97\x40\x57\x97\x91\x81\xfe\xc2\xb5\x08\xf7\xf0\x4c\xfb\x8e\x09\x73\x0c\xc7\xb5\x37\x88\xe0\xcd\xe5\x45\x1d\xc9\x4a\x6b\xf9\x2f\xf7\x75\xbd\xab\xde\x3c\x7b\xf6\xf8\xf8\x38\xb8\xcb\xf7\x83\xa2\xbc\x7b\xc6\x60\xa0\x67\xff\x0a\x45\x7c\x15\xb8\x02\x01\x03\x4d\x91\x23\x5b\x09\x52\x61\x28\x14\x25\x37\xab\x42\x67\x7a\x5d\x97\x45\x9e\xae\x11\x40\xa3\x76\xba\x94\x5b\x95\x66\x16\xa2\xe1\xf1\x30\xae\x95\x93\x5a\xc4\xd3\x1f\x23\x97\xdf\x11\xa5\xc4\x8c\x31\x8d\x13\x32\x78\x87\x62\xf3\x69\xcd\x37\x23\xde\x1f\x07\xae\xfa\x44\xb6\x27\x04\x68\x32\xd7\xfd\x40\x74\x84\xc1\x4b\x7f\xd9\x29\xf9\xa8\x57\x9c\xed\xc0\x25\x9e\xd6\xbe\xb4\x13\xc6\xaa\xa9\xa0\x57\x28\xd9\x63\x2d\x2f\x88\x98\x61\xa9\x9c\x56\x49\xe5\x9a\x00\x69\xc6\xf5\x3d\x80\xf0\x39\x11\x96\x30\x44\x1c\xa5\x77\x54\x7e\x10\x50\x6f\xeb\xa2\xe1\x44\xea\x49\xd4\x72\xa0\xf5\xe4\x78\xf6\xcc\x9d\x6b\xa3\x2f\x66\x17\xac\x74\x5d\x13\xec\xc9\xd5\xeb\xb2\xfc\xd2\x5b\x58\x01\xb6\xfe\xe0\xb9\x2b\x53\xe0\x1c\x59\x83\x5e\xee\x73\x63\xc8\xcd\x20\xc2\x40\xe9\xed\x2e\x2b\x0e\xba\xe4\xd8\xb1\x27\x96\xc7\xf2\x7e\xba\xec\x03\xb2\xd9\xf8\x7e\x59\x24\x50\x7e\x0d\x72\x90\x55\x7a\x97\x23\x0f\x1a\x1f\x84\xce\x0a\xea\x39\x3c\x85\x27\xeb\xee\xf4\x40\xe4\x55\x51\x0a\x04\x37\x84\xab\xd3\xac\x78\x2b\x2f\xe9\xc2\x7c\x50\xb2\x84\x1e\xa7\xdd\x44\x20\x01\xfd\x5d\x7b\xe1\x9f\x7e\xfc\xfc\x4f\xf9\x19\x3c\xfb\x54\xed\xd3\x9d\x1a\xd4\x5f\xeb\xdf\xeb\x1d\x67\x67\x67\x67\xaf\x5e\xbd\x30\xff\x7f\xfe\xf3\xcb\x33\xff\xff\xcd\xcf\xf9\xd9\xc5\xd9\x3f\x9d\x3f\x7f\x75\x71\x76\xf6\xe2\xe7\xf3\x97\xe7\xff\x74\x76\xfe\xfc\xec\xd5\xab\x7f\x92\x67\xbf\x57\x83\xfc\x9f\xbd\xb1\xac\xa4\xfc\xa7\x4c\x6d\xca\xf4\x4b\x75\xf4\x73\xdf\xfa\xfb\xff\xd0\x1f\x30\x1b\xc0\x08\x7c\x54\xac\x77\xb0\x3a\xc8\x51\xa6\x95\xbc\x1a\xc8\xb9\x06\xe9\x4c\x79\x71\x76\xf6\xcb\xb3\xf3\xf3\x67\xcf\xcf\x9c\xf7\xe1\x25\x3c\x8a\x8d\xbc\xd4\x2a\x17\xef\xf7\x3a\x47\x50\xb2\xb9\xd3\xd0\x4a\xac\x6c\x15\x0a\xbe\x06\x0e\xed\xc4\xc3\xe8\xf8\x05\xc5\x03\x21\x6e\xad\x3a\x1a\x27\x99\xcc\xc3\x3c\x7b\x8d\x5e\x08\xe6\x2b\x5d\x08\xa8\x03\x18\x08\x2d\xa9\x4a\x30\x29\x28\x7f\x82\xd1\x88\x9c\x22\x1c\x90\x32\xc7\x9a\x13\xc3\xdd\x2f\x6a\x71\xd8\x45\x84\xdc\xae\x0a\xf7\x3e\x34\xa0\x7c\x8d\x35\x97\x6a\xe1\x77\x97\xda\x58\xab\x88\x36\x17\x5d\x45\x93\x9f\x14\xc4\xde\xeb\x22\x97\x0b\xb0\xe0\x6f\xf3\x14\x5e\x5a\x93\x10\xb9\xad\x09\xe2\x40\x22\xa6\x22\x36\x05\x20\xd4\x2a\xf9\x27\x95\xeb\x5c\xcb\x4f\x30\xf0\xf8\x15\x04\x7b\x1c\xac\xfd\x71\xa2\xc0\x96\x35\x13\x0a\x8a\xac\x66\xde\x24\xcf\xdb\x8f\xa3\xfb\x1f\xed\x67\xf0\x6c\xa1\xf3\x04\x0c\xcf\xdf\xed\x06\xf8\xc6\xf9\xff\xf3\x8b\x9f\x5f\x34\xcf\xff\xe7\x3f\xbf\xfc\x71\xfe\xff\x11\x3f\x8b\x78\x7a\x79\x3d\x1c\x4f\xe4\x64\x3c\x8a\xa7\x8b\x18\xce\x0c\x17\xb1\xb0\xb0\x50\x0b\x24\xf1\x41\x48\xa8\x10\x43\x40\x2f\xd5\x3c\x3a\xdb\xb8\x23\x1f\x4e\x59\xac\x6a\x05\x39\x60\xc8\x92\xf2\x22\x8c\xe4\x38\x5f\x0f\x22\xf1\xea\xc5\xcf\x2f\xe5\xe8\xbe\x4c\xab\x3a\xd5\x72\xf8\xa0\x23\xb9\x04\x64\xde\x55\x56\x14\x65\x24\xe3\xad\x2e\x0f\x0f\x69\x06\xa2\xb2\x43\xf9\xfa\xc5\xab\xb3\x5f\x22\x79\xbb\x18\x82\xc3\x1c\xf8\x57\xc2\x3c\x57\x3a\x06\x8e\x7f\xab\x78\xc1\xaf\x01\x58\xc5\x6e\xe0\x92\xb8\x96\x6e\x8d\xd7\xed\x5f\x0c\xd0\xed\x79\xd8\x37\xaf\x0a\xab\x79\x5d\x00\xa9\x2a\x5f\x19\xc6\x9f\xd0\x25\xb8\xa5\x58\x54\xee\x48\xec\xcc\x53\x57\x69\x6e\xce\x66\x63\x91\x37\xae\x2f\xbe\x49\xbc\x5b\x4e\xb8\x69\xf1\x26\x21\xad\xe4\x56\xd7\x6f\x84\x38\x1f\x34\x1a\x59\xd9\x72\x6b\x55\xc9\xde\xa6\xd4\xda\x38\x93\x3d\x33\x40\xbd\xd9\x4e\xe7\x8c\xba\xe0\xb8\x44\x8f\x42\x5a\x45\x6e\xeb\xa8\xbc\xac\x2a\x8d\xce\x89\xea\xb7\x5e\x83\x2e\x58\xa2\x43\x62\x6a\x12\x27\xc1\xab\x30\x10\x07\xc0\x3a\x22\x2c\xee\xc6\x2c\x6d\xa2\x33\x73\xd1\x1d\x06\x42\x9c\xac\xba\x5f\xd0\x12\x80\xf0\x9d\x7c\x4f\x6e\x9e\xe6\x5f\xe5\xc2\xd7\x6f\x6d\xb1\xf7\x1f\xff\x3e\xb8\xbf\x3b\x34\x5a\xac\x80\x84\x50\x8c\x8f\x6b\x34\x5f\x06\xcd\xc7\xfc\x7e\xd9\x68\x3e\x20\x90\x40\x00\x80\x71\x5f\x02\x00\xd2\x7e\x15\xd3\x31\xe3\xa3\xd9\x3a\x47\xf7\x6d\x6b\x63\x85\xad\x98\xa7\x5d\x4a\xaa\xfc\x99\x5f\xd1\x88\xd1\x51\x57\x08\xd5\x78\x13\x79\xe1\x62\xe4\xe9\xe7\xd7\xa4\x3a\x93\xe9\xda\xca\xcf\x98\xb1\xc4\x20\x7b\xfe\x05\x45\xa0\x3c\x46\x46\x20\xed\xc0\xbd\x25\x3d\x02\x90\x2c\x0b\x35\xcb\x06\x42\x5c\xb4\xd7\x6a\xb1\x09\xfa\x49\x94\x8e\x1e\xb6\x34\xd4\xb9\xa3\x6e\xea\x83\x50\xbb\x9d\x46\xdc\x04\xec\x95\x60\x2a\x53\x22\x40\xb5\xdc\x4b\x9a\x23\xf8\xcc\x81\xeb\x5c\xe8\x67\x2e\x71\x10\xc6\xcb\x2b\x0d\xd5\x0a\xf5\x3d\xf1\xe3\x12\x45\xc9\x2b\x12\xea\x14\xe2\x79\xbb\x37\x69\xee\xef\x6d\xee\x0d\x29\xb5\x11\x00\x8a\x3b\x84\x24\x67\xd4\x4e\xf1\x6b\xda\x29\xbf\xa3\x9d\x82\xda\x69\xa5\xe0\x98\x80\xc8\x9e\x6d\xcf\xec\xf1\xec\x56\xb5\x4d\x96\x58\x6b\xdf\xef\x1f\x86\x81\x9a\x4b\x8a\x3a\x1c\xac\xab\x1a\xb5\xdb\xc3\xae\xfa\x6c\xe2\xe1\xb9\x96\xa9\xfc\x6e\xaf\xee\xf4\x1b\x48\x0b\x79\x5f\x3c\x59\xf7\xe5\xf9\xeb\xd7\xbf\x9c\x5e\x9c\x9d\x9f\x35\x6e\x0b\xe9\x89\x41\x23\x4d\x9d\x4e\x06\x3d\x21\x5e\x0c\xe4\x94\xc2\xab\x80\xa0\xa7\x48\x71\xe3\xcb\x39\x93\xc4\x5a\x53\xdb\x7c\x68\x64\x0e\xce\xa2\xcc\x53\x65\x3e\x20\x2c\xd9\x1a\x66\x81\xbc\x82\x36\x4b\xac\xc8\x7a\x4e\x3a\x4f\x8a\x12\xf1\xc3\xbb\xb2\x00\x98\xa4\x45\x50\xd3\x55\xc0\x44\x70\x69\xe5\x42\x7c\x1c\x64\xf5\x60\xd7\x69\x51\x5a\x26\x22\x8f\xde\x10\x6e\x68\xe8\x4c\x8f\x77\x5b\x4f\x70\xa5\x3d\x91\xb7\xb5\xba\x29\xc4\x4b\x1a\xa7\xae\xb3\xa9\xa9\x13\xec\x5f\x2f\x04\x60\xa0\x40\xb6\x1b\x25\x11\x8e\x52\xe1\x28\x23\xf5\x76\xa5\xc1\xbf\x63\x89\x81\x94\x64\x16\xfd\x35\xd0\xb0\x25\x00\xaa\xd1\xb4\x1f\x4a\x08\xa6\xe3\xea\xe0\xbb\xa7\xb9\x24\x7e\xf9\x25\x32\x0b\xe3\x39\x8c\xca\x5c\xdf\xb9\x12\xa7\xe3\x53\x3a\x10\x5d\x2b\xa6\xeb\xea\xb1\xbc\xd6\xc7\xaf\xed\x88\xe4\xcf\x4a\x3b\x85\xc1\xb1\x2e\x40\x54\xc8\x5e\xeb\x1d\x9c\x5f\x5d\x97\x3a\xe9\x89\x9b\x3e\xa7\xed\xeb\xb0\xa1\xe3\xd8\x3c\x2a\x29\xbf\xd9\x38\x30\x89\x2b\x27\x4b\xf1\x02\xf3\x5f\x46\x47\x8c\x6b\x89\x3b\x6c\xcc\xa8\xa4\x1d\x4d\xf8\xf6\xf9\xf6\xf7\x6c\x45\xe7\xd1\x25\x7e\xe3\xd1\x65\x3a\x94\xf6\x3b\x8f\x86\xc6\xa2\xe1\xa3\xc1\xee\xfe\x46\x31\x6b\x25\x7e\xfd\xde\x97\xc7\xf7\xbe\xf8\xf6\xde\x17\xe2\x95\x8f\xf4\x79\x76\x04\xb1\xf1\x46\x2e\x3f\x8c\x17\x72\x31\xbb\x5a\x7e\x1a\x22\xf8\x87\x10\x36\x00\x10\x60\x9b\x1f\x90\x0e\x03\xce\xe5\x2e\xe7\xe3\x77\xb7\xcb\xd9\x7c\x61\x91\x37\xe6\x0f\xc3\xe9\x67\x49\xe0\x1a\x0f\x5a\xe3\xc1\x65\x7c\x94\x8d\xf8\x7e\x94\x8d\x7c\x1a\x65\x73\x34\x69\x24\x4d\x7f\x2e\xc7\x8b\xd1\x64\x38\xbe\x8e\x2f\x07\xd2\x87\xa6\x2c\x3e\x0c\x27\x13\xd7\x3d\xd3\xb2\x41\x24\x4c\x03\xe6\xf1\xfb\x78\xba\x5c\x58\xa8\xc6\x74\xfc\x31\x9e\x2f\x08\x90\x30\x1a\x4e\xc6\x57\xb3\xf9\x74\x3c\x24\xbc\x87\x1b\x0a\x07\x24\xb9\x9a\xcd\x21\x2f\x76\x39\x9e\xc7\xa3\xa5\x79\xb6\xfb\x17\xc3\x45\x1c\x86\x44\xc6\x7f\x89\xaf\x6f\x26\xc3\xf9\xe7\xe8\x28\x86\x44\x9c\x7c\x03\x9f\x74\x33\x9f\x8d\x6e\xe7\xf1\xb5\xe9\x1a\xe0\x26\xde\x2d\x96\xe3\xe5\xed\x32\x96\xef\x67\xb3\x4b\x98\x0f\xc4\xf6\xc4\x8b\xb7\x82\xb1\x23\xb7\x8b\x38\x02\xe0\x08\xbc\xf8\x66\x3e\xbb\x1a\x2f\x17\x6f\xcd\xbf\xdf\xdd\x2e\xc6\x80\x60\x1a\x4f\x97\xf1\x7c\x7e\x7b\xb3\x1c\xcf\xa6\x7d\xf9\x61\xf6\x29\xfe\x18\xcf\xe5\x68\x78\xbb\x88\xcd\x84\x5f\x8a\xd9\x14\xe6\x7d\xf9\x21\x9e\xcd\x61\x84\xcc\x18\xc0\x1c\x45\xf2\xd3\x87\x18\xa0\x21\xe3\x29\x8e\xd4\xd0\x0c\xc1\x62\x39\x1f\x8f\x96\xfe\xc7\x66\x73\xb9\x9c\xcd\x97\x5e\x1f\xe5\x34\x7e\x3f\x19\xbf\x8f\x01\xf7\x34\x77\xc8\xb1\xbe\xc5\xd2\x8c\xf1\xb5\x9f\x86\x9f\x5b\xb0\x9a\x2b\x58\xd1\x82\x57\xb4\x83\xa3\xfc\x0a\xa8\x89\xfc\x67\x40\x08\xa7\x45\xfe\x46\xfe\x32\x38\x7f\x25\xfe\x39\x92\x13\x55\xd5\xc4\x39\x9f\xc8\x7f\xbe\x54\xb5\x7e\x23\x8d\x89\xf1\xec\xfc\xec\xd9\xc5\x4b\x79\xf1\xfc\xcd\xf9\xf9\x9b\xf3\xd7\xf2\x9f\x23\x79\xc9\x34\x93\xe7\xcf\x5f\xff\xf2\xe2\x97\xc1\xf9\xff\x2f\x62\x65\x83\x67\xc3\xb2\x36\x5e\xf6\xfa\xf4\x62\x70\xf6\xfb\xc4\x80\x9e\x8e\xff\x5c\x9c\x9f\x3d\x3f\x6f\xc6\x7f\x7e\x3e\x3b\xff\x11\xff\xf9\x23\x7e\x8c\xd9\xc4\x2b\xc0\x66\xc4\x2f\x06\x67\x01\xde\x62\xdd\x97\x17\x67\x67\x67\xa7\x17\x67\x67\xaf\x22\xb0\xb4\x6e\x74\x99\x85\x98\xe2\x98\x31\x33\x41\x18\x83\xd5\xd2\x30\xff\x6a\x01\x17\x9d\xd2\xea\xce\x65\x15\x8e\x24\x75\xb5\xaf\x11\x70\x83\x14\x23\x96\x50\x00\xe5\xf4\x06\x42\xdc\x94\x5a\x6d\x57\x99\x26\x04\x04\xbb\x4f\xba\xaa\x15\x82\x30\x2a\x8f\x46\xc0\xaf\xf6\x54\x04\xfc\x0a\x00\x22\xf2\x06\x05\x87\xf9\x66\x87\xf6\x25\x91\x0d\xe8\x44\x3e\xae\x22\x62\xef\xc9\x07\x93\x24\x2c\x43\x83\x14\x10\x95\xb0\x96\x9e\x1b\xd0\x0f\x18\xf1\x67\x29\xb6\x0a\x4b\xae\x15\x4f\x83\x25\xc6\x7a\x20\xfb\x84\x70\x52\x0c\x90\x86\x27\x52\x43\x4d\x67\x8c\x1b\x5e\xa7\x59\x06\xca\xeb\xb6\x66\x8b\xfe\xee\xa8\x17\x54\x25\x8b\x9d\xf6\x0d\x59\x11\xf4\xdd\x23\xc9\x53\x19\x64\xd3\x83\x79\x04\xdc\x80\x57\xb7\x09\x15\xb0\x59\x76\x90\xc5\xbe\xae\xd2\x44\xb7\x27\x91\x69\x90\xad\x21\xd6\x1a\x01\xc0\x77\xe3\x34\x50\x7b\x2d\x86\x3e\xa8\x4a\x11\x8e\x3d\xd7\x52\x0d\xa6\xb5\x83\x1d\xed\x19\xf9\x0d\x94\x75\x65\xb1\xa3\x32\x3a\x68\x33\x83\xdb\xf0\x05\x01\x20\x82\x93\x22\x9d\x8d\x33\x6b\xb6\xd2\xfa\x4b\x20\xd1\xe7\x68\x77\xbd\xa1\x18\x08\x71\x69\x39\x65\x2a\xf0\x5d\x85\xe8\x35\x1f\xe8\xc7\x55\x9c\x1a\xe5\x49\x05\xf9\x7e\x9f\xa1\xcc\xfc\x0a\x32\x45\xac\xf5\xd9\xb4\xa2\x6d\xb2\x9f\x65\x0d\x68\xec\xdc\x9b\x3d\x3a\x25\x27\xf5\xe4\xd5\x64\xdf\x2b\xcf\x92\x25\x57\x4d\xb6\x8c\x69\x2e\x97\xe2\xa1\x73\xc4\xc1\x80\xce\x3f\x3a\xaf\x40\x53\xc6\x6a\x52\xb6\x55\x9f\x8b\x7d\x0f\x06\xb5\x77\x28\xf6\x61\xc3\x40\x80\xcd\xab\xa8\xce\xd2\x2f\x1e\x3f\x88\xdb\x5c\x91\xe3\x1d\x14\x5e\xc3\xec\x2b\xe8\xbf\xc3\x08\x16\xd4\x5f\x72\x99\x08\x24\x0a\x7d\x6c\x94\x15\xcc\x0d\xbb\x10\x51\x5c\xb2\x4c\x1f\x40\xc3\xd3\x11\x39\x7b\x0f\x64\x0f\x64\xe3\x93\x1a\x0f\xe4\x30\x5c\xd2\x82\xf4\x8d\x2b\x72\x7a\x3c\xc7\x63\xc1\x25\x77\x1f\xb9\xb8\x07\xf0\x96\xd7\x5c\xc3\xf8\xd1\x47\xf9\x0b\xd1\xbb\xb4\x0d\xef\x59\x2e\xd7\x82\xf9\xef\x42\x28\x27\x6d\x7f\x10\x35\xf8\x42\x87\xa7\xe3\x3d\x11\x56\x28\x5e\xea\x8c\x60\x66\x1c\x69\x53\x95\x66\x4a\xbc\xed\x0e\x6a\xe0\xca\x06\xb3\x5e\x5d\xe0\x42\xa9\x78\xef\x0b\x5b\xb1\xd0\xfd\x95\x76\x07\x8a\x52\x5e\x69\xed\x2f\x82\x8d\xf6\xf6\xb0\xc7\xa1\x76\xe9\x13\x05\xc0\x01\xc3\xe3\x5a\x94\x5e\xf7\x43\x99\x5e\xf7\x29\x44\x10\x39\xa1\xea\x03\xc0\x2d\x6d\x65\x8e\x79\xbf\xdb\xd4\x62\xa3\xbd\x05\xdb\x9c\x9d\x46\xdc\xca\xbe\x01\x89\x20\xcc\x96\x42\xe1\x43\x4f\x50\x08\xa5\x04\x55\x25\x1a\x32\x43\x10\xdd\xcf\x51\x23\xc0\x63\x0a\x2e\xf5\x7f\xee\x75\xf5\xc4\xb2\xb4\x6d\x6b\x2e\x11\x7f\xc9\xbb\xed\xba\x09\x54\x8e\x10\xb8\x4a\x82\x3f\x50\xa3\x8a\xbf\xa9\x50\xf4\x05\xeb\xba\x7f\x43\x5b\x66\x9c\x95\x9e\x30\x4b\x13\xb7\x25\xad\xda\xc6\x85\xaa\xdc\x94\xfa\x5e\x3a\x8f\xb6\xf8\x18\x16\x8e\xf9\x87\x0f\x38\xe0\x50\x27\x5f\xfb\x65\x5b\xaa\x32\xfd\xa4\x2b\xdb\x0e\xf2\xea\x20\x3a\x4c\x15\x4b\xfc\x0d\xc5\x4c\x6e\xae\x09\x85\x86\xe1\x0c\x3b\x94\x5e\x9c\x25\x6a\x44\x4e\x7d\x68\xd9\xba\xc8\x37\xe9\xdd\x9e\x84\x9c\xf0\x90\xb1\xc5\x47\xad\xc3\x79\xbb\x4b\x33\x9d\xb4\xde\xb5\xa6\x3f\xc8\xd5\xa1\xd6\xf8\xc6\x40\xab\x13\x03\x2e\x4c\xcc\x4f\x25\xee\xf0\x0c\x0f\x6a\x50\x16\xe6\x91\x66\x5e\x41\xa2\x11\x09\x37\x1d\xe0\x8b\x98\x64\x33\xd5\xce\x2f\xc0\xa3\x8c\x41\xe5\x60\x1d\xa6\x0b\xb7\x54\x55\x1f\x64\xc4\x3e\x51\xa8\xeb\xd2\x8b\xac\x08\x71\x72\xde\xb7\x04\xa3\x81\xe9\xc0\x14\x4a\xcd\x0d\x85\x63\x07\x80\x6e\x1b\x69\xe3\x85\x2d\x6c\x19\x27\x57\x05\x53\xac\xd9\xd3\xe6\xf1\xb4\x02\xda\x82\xef\x64\x2a\xb8\xb5\x06\x37\x46\xc7\xd1\x7a\xe3\xab\xec\x14\x65\x33\x04\xc8\x83\xd4\x68\xbb\x10\x27\x17\x4e\xfd\xe6\xf2\x1b\xb6\xad\xf6\x4a\x9c\xb7\xcd\x47\x86\x2b\xde\x3b\xba\xd2\x9c\x24\x1a\x41\xab\xbb\xb3\xdf\x74\x99\xa0\x1a\xb3\x2c\x60\x41\x48\x25\x1b\xe7\x6c\xe7\xf8\xec\x11\xa3\x89\x1c\x84\x81\x34\x0a\x6a\x64\x93\xb2\x8e\xcd\xb7\xe4\x89\x54\x55\x55\xac\x53\x70\x96\x5d\x74\xce\xdc\x78\x84\x6f\x04\x92\x13\x8d\x2d\x83\x03\xa6\x31\x18\x70\x15\xc2\x95\x74\x68\x08\xc7\xf1\xae\x08\x06\xc8\x6d\x9d\x93\xe7\x6e\xac\x19\xa1\x78\x90\xab\xfd\x1d\xc8\x04\x56\x11\xb0\x4c\x72\x22\x84\x4e\xb5\xc8\x91\xd6\x85\x09\x28\x81\xc9\x4a\xc7\x49\xc6\x3c\xa6\xad\x13\x4e\x2e\x03\x20\x8f\xb5\xb9\x8d\xb1\x0d\x26\xb7\x58\x05\x7a\x1c\xdd\x77\x3a\x8e\x1c\x0e\x08\x03\x4e\x03\x86\x5e\x2d\xf9\x08\xf5\x18\x02\x2f\x1b\x8b\xb0\xb9\x72\xab\xe6\x55\xaf\x2a\xde\xc9\xe2\xe4\x45\xe7\xd2\x84\x39\x6a\x3e\xc7\x7d\x4f\x9e\x34\x57\x13\x0a\xea\xb7\x57\x13\xab\xb7\xf9\x61\xef\x23\x73\xd8\x7c\x5d\x5f\xb4\x97\x22\x48\x51\x7b\x02\x71\x80\x45\x4d\x6b\x32\xbb\x2b\x37\x41\xad\xb1\x15\x36\xcf\x88\xae\xa2\x59\x54\x0c\x1f\xab\x0b\x77\x64\x73\x39\x7f\x5e\xe4\xa7\x96\xe7\x60\xa3\x55\x0d\x7a\xa7\x24\x57\x6a\x16\x43\x05\x9c\x96\xdb\x22\xd9\x67\xbc\x82\x3a\x8f\x16\x5b\x26\x31\x9b\xc6\xb2\x99\x2d\xa7\x5c\x05\x78\x1f\x5d\x63\xd0\x96\xb8\xeb\xf2\x8c\xba\x8e\x88\xc8\x63\xc6\x6b\x5e\xbb\x91\xac\x0a\xf9\x94\xb7\x79\xe0\xfd\xe6\x33\x65\xd0\x9e\xe0\x6b\xb1\x39\xc2\x94\x16\xf1\x95\x53\x53\x5f\x2a\x90\x0d\xbf\x56\x17\xad\x85\x45\x22\xa9\xe0\xc8\x80\x66\x2f\x7d\x9f\x48\x78\xca\x7d\x9e\xb3\xcf\xda\x7a\xb9\x1c\xe7\xb6\xba\x36\x0a\x86\xd2\x9e\x99\xa4\x3c\xa8\x40\x48\x04\x92\xe0\x44\x00\xe1\x7c\x36\xbb\x7c\xfc\x38\x7f\x57\x47\xd7\x7d\x4a\xd3\x7b\x7a\x43\x47\x38\x9c\x5b\xfd\x65\x6f\xb3\x71\xa1\x1e\xfd\x7c\xb0\x04\xc8\x9a\xc6\x9a\x13\x63\x27\xe0\xcf\x49\xda\xef\x9c\x69\x50\x57\x82\xbc\x8c\xe3\x0d\xc7\xb2\x6a\x92\xb7\xa9\x9d\x1c\x00\xca\xa8\x94\x5a\x67\x07\x72\xa7\x3c\xde\x4e\x3f\x70\xd1\x79\x3d\x12\x17\xbd\x45\x18\x38\xf7\xb7\x29\xed\xc2\x2b\x19\xe8\xf1\xed\x2a\xb4\x8d\xe0\xea\x0c\xc6\x39\x00\x5e\xbe\x72\xcb\xb5\xe3\x7a\x6c\x4e\x35\x9d\xe7\x1b\x4b\x11\xd2\x48\xaa\xa4\x75\x84\x62\x5c\xc0\x7e\x05\x1d\x76\x83\x4c\xf4\x7d\x3e\x77\x33\xa6\xd9\x98\x8c\xcd\xd8\x5d\xbe\x45\x83\x47\x5d\xc5\x24\xbd\x14\x6d\x6a\x1e\xca\xf6\xc8\xbb\x2a\xbc\x22\xa1\x96\x9d\x53\xb4\x37\x48\x25\xf8\xe0\xf4\x56\x8c\x38\x79\xd9\x79\x70\x07\x27\xeb\xf1\xd7\x78\x4f\x14\x2c\xaa\xdf\x3e\xbd\x2c\x09\x2f\x63\x3b\x52\x20\xc8\x72\x24\xda\x54\x09\x70\xa7\xfd\x27\x1d\xdd\x37\x88\x79\x09\x9e\xc1\x6a\xa0\x28\x08\x49\x33\x5c\xa7\x5b\xe7\x27\x06\x29\x39\x0a\xf9\x54\x61\x4b\x22\x49\x44\xd5\xc0\xa0\x81\x61\x2e\x26\xa1\x5b\xab\xb2\x04\x31\x79\x48\x99\x9b\xf7\xfb\x0f\x34\xcb\x60\x5d\x6c\xcd\xe3\xa0\x05\xbe\xa6\x11\xc1\x7f\x72\xfd\xd8\xec\xb6\x48\xf4\x16\x16\x58\x49\xe2\x32\xcc\xd1\xd4\x6a\x2b\x05\x99\xe0\x41\xd8\xc5\xf0\x51\xa5\xc0\x07\x04\x66\xa4\xa5\x05\x4c\xcb\xfa\xd0\x10\x06\xe1\xf6\x2a\x08\x41\xda\x3d\xe1\x3f\x15\xf2\xc8\xb6\x3f\x96\xae\x94\x8c\xdc\x4d\x51\x6e\x74\x5a\x33\x4d\xdd\x11\xfd\x90\xcc\xda\x16\x27\xaf\x3a\x97\x59\x3b\xf2\x60\xf6\x4d\x78\xad\xb7\x57\x6d\xd4\x75\xa3\x7b\x88\x02\xaa\xe3\x95\x2f\x98\xe6\xbd\xda\x79\x96\x4f\xb0\xba\x44\x87\x79\x3e\xbc\xbb\x2b\x35\xca\x3d\x98\xb9\x99\xa4\xf9\x97\x46\x8c\x53\x88\x93\x9f\x3d\xf3\x90\x3e\xaf\x03\xe3\xe8\xe4\x89\xa8\x8b\xbf\x3d\xf9\xb0\x21\xd9\x38\x8e\x1b\xc0\x43\xd0\x06\xf6\xc6\x2b\x84\x79\xf3\x8b\x7d\xd5\x5c\xd1\x74\x47\x98\xe3\xd6\x3b\x49\x37\x5a\xb7\x9c\xc5\xce\x73\x48\x78\x68\x73\x04\x61\x79\x8f\x40\xdf\x85\x18\xe8\x8b\xed\xae\xc8\x1d\x6d\xa9\x0e\xda\x16\x3c\xa9\x8b\x02\x88\xcf\xc8\xe0\x5c\xdf\x93\x1f\xd8\x38\x01\x45\x30\xa0\x5d\xe7\x1c\x78\xe7\x81\x9e\x6c\xd0\x1c\xb3\x1a\x7f\x39\xe2\x37\x42\x49\x98\x7d\xa0\x79\x7b\x73\xea\x2a\x7f\x9a\xe0\x4e\x40\x3e\xdb\xed\x8a\xac\x71\xdf\x95\x92\x99\x19\xfb\x92\x08\xe1\x69\x9b\x14\x8f\x18\x75\xab\x0b\xb9\xda\xa7\x59\x82\x34\x58\xa7\x2a\x2b\x72\x2d\x08\xe3\x00\x90\x42\xf4\xc9\x03\x1a\x20\xaf\xcc\xad\x62\xdb\xc8\x51\x5c\xd9\xc0\x85\xca\x13\xd1\xb9\x6a\xbe\xe9\xca\xda\x0f\x5a\x6b\x4a\x7f\x35\x3e\xb0\x50\x24\x32\xe8\x15\xd6\x85\x41\xa9\x81\x10\xe3\x5a\x6f\x2b\xb9\x64\x3a\xd0\x69\x51\xcb\x91\x73\x55\x6e\xac\xd0\x7b\x73\xc6\x84\x38\x79\xdd\x97\x9f\xe0\x82\x3d\xf9\x86\x7d\x4d\x86\x32\x46\x94\xd6\x65\xba\xab\xab\x3e\x95\xbd\xeb\x52\x67\x07\x41\xcc\xc2\x18\x86\xd4\x3e\x37\xaf\x1d\x1e\xdc\x19\x11\x85\x99\xb6\x95\xce\x1e\x8c\xe9\xed\x98\x97\x79\x9b\x63\x1d\x78\x47\x78\x34\x34\x13\xd1\xcf\x82\xe6\xb3\xd4\x89\xe7\xa2\xed\x54\xe9\xc8\x60\xed\xea\x00\xc1\x6e\xf2\xd4\xe8\x3b\x0d\x0f\xad\x73\x8b\x0c\x84\xb0\x45\xa5\x4c\x11\x56\x09\x71\x72\x7e\xd6\x07\xf1\xb5\x23\x30\xcf\x27\xe3\x0b\x9d\xb6\x42\x97\xae\x62\x33\xb2\x36\x90\xef\x0e\x2c\xd8\x10\x08\xe6\xf8\x54\xab\x22\x18\x7a\xb8\x4f\x3d\xf9\x1d\x0b\x19\xbd\xc4\xd3\xca\xb5\x1f\xe3\x4e\x49\xb0\x8a\x85\x1f\x68\x3c\x22\xe8\xe3\xdd\x39\xe7\xe7\x7d\x39\x3e\xe6\x2e\xd8\x20\x65\x60\xd2\x75\x5c\x48\xc6\xbc\x63\x69\x33\x20\xc1\x75\x1a\x46\xc0\xb4\xca\x26\x42\xae\x1f\xb4\xb9\xbf\x81\x18\xc1\x17\x7c\xf2\x5d\x19\xd3\x96\xd6\x9d\x43\xf2\x37\x4e\xeb\xe6\x08\x81\xb6\xdf\xb5\x8b\xbe\x0c\xd2\x8f\x76\xbf\x22\x4f\x31\x70\x14\x79\xb2\x02\x74\x9a\x1e\x1c\x64\x2f\x62\x01\x55\x81\xff\x05\x7f\x30\xfe\x0a\x8c\x7b\x56\xdc\x15\xd2\xca\xb2\xb4\xc2\xb0\x27\xe7\xcf\x1b\xef\x0f\xc4\x0c\x8e\xab\x09\x18\x33\xf9\xb4\xd8\x9c\xd2\xad\xd4\x20\xa5\xb5\xf2\x00\x50\x5f\x6d\x06\x9e\x94\x02\x2c\x9a\x1a\x24\x03\xe8\x7f\xbb\x84\x02\x04\x0b\xfe\x04\xbb\xad\x69\x06\x34\xd5\x48\xb8\x1b\x60\xb8\x37\x83\xcf\x82\xdc\x59\x4b\x73\xcc\x45\xae\x29\x84\xd4\x3d\x55\x8b\xe0\x3e\x25\xb3\xcd\x98\x54\x69\x6d\xd6\xaf\xed\xeb\x37\x95\x55\x64\x43\x59\xa5\x6f\x79\xf5\x5d\x52\x8d\xe5\x55\x9c\xe7\xc3\x9d\x05\xfa\x59\x78\x25\x0b\xc3\x5a\x6d\x0f\xbc\xde\x0f\x5d\x72\x01\x68\xe2\x89\xee\x08\x3a\x11\xcb\x22\xa9\xa2\xd3\x80\x23\xb8\x6d\x62\xb5\xa0\xe0\x20\x74\x1d\x14\x54\x82\x97\x60\x28\xfa\xe4\xfc\x45\xff\x08\x6b\xd4\x1b\x60\x8d\x92\x37\xc3\xd1\x9f\x87\xef\x5b\xf0\xb1\x2e\x5e\xa7\x27\x41\x64\x82\x29\x9c\xbe\x09\x26\x1b\x7c\x3f\x5a\x2c\x12\xdf\x22\x64\x02\x10\xd2\x74\x36\x3d\x1d\x4f\xaf\xe6\xe3\xe9\x7b\x04\x52\x85\xf8\x31\xe2\xbd\x12\x5d\xbc\x57\x9f\x67\xb7\x73\x39\x99\x8d\x86\x13\x09\xbc\x57\x1d\xc4\x47\x93\xe1\xa7\x48\x4e\x67\xad\xe1\x10\x21\x8e\x0c\x98\x8f\x42\x2c\x99\xfc\x36\x96\xac\x89\x1b\x13\x4d\xee\xa1\x6f\xe0\xa5\xec\x04\xb6\xd0\x52\xe2\x9b\x68\xa9\x1f\x85\x80\xff\x20\x3f\x83\x67\xf3\x24\xad\xd6\xbf\x67\xf9\xf7\xb7\xea\xff\x2e\xce\xcf\x9b\xf8\xaf\x0b\xf3\xf1\x1f\xf8\xaf\x3f\xe0\x07\x66\x5f\x9e\xf8\xc4\x27\x7d\x28\x05\x27\xcc\x11\x5e\xa5\x8b\x7d\x2e\xaf\x53\x73\x27\x1e\x2a\xe3\x55\x50\xed\x04\x50\xc7\x3b\xc4\x35\xe4\x9e\xf6\x39\x3b\x33\x1a\x13\x7a\x4d\xc8\xbb\xb1\x52\xf4\x9d\xc6\xaf\x5a\xc7\xd0\xf8\xa5\xe6\x36\x53\x3b\x0d\xf9\x2e\x25\x28\x6b\x82\x7a\x03\x6c\xfc\x58\x9c\xd6\xce\x51\x55\x3d\xde\x17\x19\x62\xae\x55\x59\x0f\xe4\x2d\xf0\x86\x20\xe6\x62\x67\x7c\x37\x41\x01\x4f\xec\x2a\xbb\x5c\x4c\x81\x4c\xb8\xf3\x03\x7c\x83\xc2\x86\x01\x35\xd0\x40\x88\xb9\xb9\x30\x82\x6b\x10\x2e\x37\x64\x4b\x73\xb4\x8a\x74\x51\x31\x39\xa1\xc7\x33\x67\x0e\xdb\x90\x61\xf0\x32\x5e\x8c\xdf\x4f\x23\x7b\xab\x8d\x7f\x05\xd3\x20\xd2\xe5\xe1\x25\x20\xae\xe6\xb3\x6b\x39\x94\xa3\xd9\xed\x1c\x0f\xfe\xcb\x78\x38\x01\x48\xf1\xed\xc2\x5c\xde\xb3\xb9\x5c\xce\x87\x97\xb1\xbc\x99\x0f\x47\xcb\xf1\x28\x36\xfd\x81\x91\x48\x9b\x58\xf9\xbc\xb0\x28\x0a\x4e\xf0\x40\x62\x27\x3f\x78\xbc\x96\x6c\x66\xd0\xac\x88\x23\x4b\xc3\x98\x75\x15\x20\x5e\x28\x6d\x0f\x86\xe3\xba\x28\x4b\xd6\x19\x0f\x35\xbc\x4a\xa9\xf3\x7b\x95\xaf\x19\x4f\xb5\xb8\x9d\xca\xeb\xf1\x68\x3e\x5b\x7c\x5e\x2c\xe3\x6b\x84\x99\x0f\x08\xe1\xfd\x61\xf8\x31\x36\xe3\x6e\xf1\xc6\x38\x13\xf3\x78\x71\x13\x8f\x96\xcc\x65\xe9\x5f\xfb\x66\xc8\xed\x25\xbd\x88\x68\x48\x16\xf1\x68\x1e\x2f\x17\xcc\x3e\x78\x33\x5c\x02\x48\xfc\xdd\x67\x89\x33\x6e\x7f\x3f\x5f\x4a\xa0\xd1\x9c\x5d\xa1\x70\x55\x5e\x48\x4c\x6a\x40\x3a\xef\xc8\x10\xac\x34\x14\x67\x39\xd1\x23\x99\x15\x50\x26\xf1\xa0\xf3\x3d\xc4\xf0\x77\x65\xb1\x49\x51\x59\x01\xdd\x18\xa8\x00\x50\xc6\x98\xce\xc9\x56\x24\x74\x01\xb2\xd4\x83\x86\x57\xa2\xb6\x0a\xb2\x9b\xc0\xc7\x94\x6e\xcc\xeb\x85\x75\x9f\x54\x82\xc4\xc5\xac\xdf\x02\x24\x69\x98\x16\x2d\x36\x14\x2a\xc5\x07\x98\x41\xee\x6c\xb8\x10\x17\x2f\x5f\x9e\xc9\xf7\xaa\x5c\xa7\x4a\x0e\xa1\xb5\x42\x5c\x1b\x0b\x58\xa5\xb9\xfc\x98\xea\xc7\xc8\x2f\xfd\x79\xfd\xe2\xec\xc5\xf3\x1f\xf6\xc2\xff\xcc\x9f\xc1\xb3\xd9\xe4\x72\x78\x73\x7a\x31\x38\xff\xdd\x6c\x80\x6f\xdc\xff\x2f\x2e\x5e\x36\xeb\xff\x2f\x7e\x7e\xf5\xf3\x8f\xfb\xff\x8f\xf8\x59\xde\x6b\x39\xdb\xe9\xdc\x2c\x82\x06\x31\x9a\xb0\x39\xd6\x8b\xc1\x79\x24\x2f\x5e\xcb\x2b\xbd\x2a\xf7\xaa\x3c\x00\x1a\xdc\x0b\x44\x9c\xbf\x7e\xfd\xfa\xd4\xfc\x0e\xc1\xe1\xf6\x79\x1e\xd1\x9d\x98\xeb\xe4\xb1\x28\x12\x39\x4a\xeb\x83\x7f\x7c\xc0\x3d\x85\xb5\x89\x73\xcc\x58\xcc\x5d\x45\xde\x91\x6a\x3c\x8e\xc0\x58\x6b\xa0\x89\x4d\x09\x80\x5a\x27\x3d\x5b\xe1\xde\x8f\xc4\x93\xd5\x7a\xf2\xb7\x54\xeb\x09\x57\xad\xd7\x51\x83\xff\x44\xb1\x9e\x83\xf5\x5a\xfe\xeb\x8a\xd5\xd4\xd3\xb5\x39\xa1\x9b\x0f\xa3\x4a\xf2\xaa\xb0\xba\x3b\x7e\x56\x3a\xad\x6c\xcf\xbb\x6b\xac\xff\x27\x57\xed\x3d\xf7\x0b\x5f\x79\x85\xf5\xb0\x0f\x08\xbb\xfc\x8d\x25\xb8\x8b\x66\x09\xee\xb1\xea\x3b\xbe\x53\x3b\x96\x37\x16\x44\xb7\xbf\x12\xc9\x5d\x06\xa9\x40\x06\x9a\x6f\xec\x57\xfe\xad\xd8\xe9\x3c\x4b\xd4\x6e\x50\x94\x77\x03\xa8\x56\xbe\x39\x5e\x2b\x68\x1b\xc9\xc8\xa9\x95\x66\x65\x5a\x6f\x30\x72\x84\x56\x09\xef\x57\xae\x3a\x1e\x4b\x97\xb1\x96\xf1\xd7\x76\x55\xf8\x24\xf7\xb6\xff\xed\xa2\xe3\xa3\xc3\x23\x5e\x0e\xe4\xe5\x5e\xcb\x75\xa9\x93\xb4\x66\xf8\xbd\x25\xdf\x65\x14\x94\x3d\x88\xca\x02\x62\xef\x27\xf7\x75\xbd\x23\xa2\x39\x7f\xbc\x9e\xf5\xb1\x14\xf2\xc8\x69\x03\xa3\x84\x12\x0e\x61\x46\xab\x43\x91\x21\x56\xeb\x7b\x51\x52\x61\x18\x13\x67\x92\x0e\x02\x53\x4d\x34\xb5\x10\x38\xd5\x68\x71\x8d\x3c\x3b\x44\x1a\xda\x99\x4d\xb3\xef\x00\x27\xa9\x25\x6f\x69\xec\xc3\x6a\xbf\x22\x43\xcf\x16\x51\xf0\xb7\x80\xc8\xfd\x89\x9a\x4e\x63\xf0\xce\x6e\xe2\x29\x8e\xc4\xec\x76\x7a\x39\x5c\x8e\xa1\x8e\xaf\x11\x97\xfb\x5f\xff\x6b\xb8\x10\xe3\xc5\x4f\x3f\x35\xcb\x3b\x03\xee\xf4\x23\x05\x9e\x5d\x65\x8a\xe2\x37\x15\x78\x1e\x75\x6e\xc4\xb7\x0b\x3c\x8f\xf5\xd5\x34\x7f\xb9\x08\xba\x2b\x7e\x6d\xd0\xed\x7b\x0a\x38\x6d\x20\xee\x6f\x2f\xe0\x14\xb6\x80\x53\xfe\xad\x05\x9c\xc2\x15\x70\xca\xbf\xbd\x80\x53\x50\x01\xa7\xfc\x9b\x0b\x38\x85\x57\xc0\x29\xff\x86\x02\xce\x1f\x21\xc9\xdf\xe3\x67\xf0\x6c\x34\x3a\x7d\xf7\xf9\xf4\xf9\xef\x55\xfc\xf9\x4d\xfb\xff\xc5\x8b\xf3\x17\x6d\xfb\xff\xe2\x87\xfd\xff\x87\xfc\x8c\x4a\x0d\xf5\x4d\x72\x54\x6c\xb7\xc6\xa2\x1b\xd6\xce\xde\x7e\x3e\x38\x93\xb7\xf9\xae\x28\x8d\x31\x3c\x9a\xc7\xc3\xe5\xf8\x63\x2c\x47\xb3\xeb\xeb\xd9\xd4\x9c\xb3\xf3\x9b\xd9\x1c\x8f\xde\xf1\x42\x98\xc3\x6f\x08\xfa\x0f\x57\xe3\xf9\x35\x1c\x43\x97\xb3\x78\x01\x87\x22\xeb\x7b\x4c\xe2\xf7\xc3\x89\x2d\x5a\x1f\x98\x73\x1e\x8f\x6a\x38\xbe\xe9\x8c\x20\x26\x32\x61\xbf\x0d\x6f\x8e\xe5\x70\x2a\x87\xcb\xe5\x6c\x3e\x8d\x3f\x9f\x8e\x26\x63\x73\xa8\xce\xe3\x09\xbc\x7f\xf1\x61\x7c\x33\x68\xb7\x90\x5e\xbb\xc0\xab\x73\x3c\x05\xdd\x0d\x7c\x97\x39\xa9\x64\x6f\xb8\x38\x1d\x2f\x7a\xf2\xdd\x70\x31\x5e\x74\x7c\xff\x7a\xf8\xe7\x78\x11\x06\xf8\xc4\x3c\x7e\x3f\x9c\xdb\xa0\x9e\xff\x4c\xbe\x8e\x23\xec\x3b\x5d\x61\x0b\x2f\x4a\xe5\xa9\x50\xc8\x79\xbc\xb8\x9d\x2c\x6d\x04\xcf\x5c\x5c\xb7\x8b\xd8\xf1\x91\x61\x0a\xee\xd3\x6c\xfe\x67\x79\x32\x5c\xc8\xcb\xf8\x0a\xf5\x1d\xe2\xc9\xec\x53\x3f\xb8\xfd\x6f\xa7\x97\x31\xaa\xb9\x20\x37\x3f\x8f\x63\xb3\x3b\xe2\xe6\xf6\xdd\x64\x3c\xb2\x4c\x6f\x27\xbd\xd1\xe8\x66\xd2\x33\x67\x79\x8f\x7e\xd7\xeb\x63\x06\x0e\x5e\x8b\xef\x58\xc6\x23\xca\x87\xb9\x24\x57\xa0\xe1\x12\x8a\x7f\x0c\xe0\x06\xf0\x72\x50\xf0\x28\xfc\xe4\xf2\x83\x99\xc2\x85\x1c\xde\x2e\x3f\xcc\xe6\xe3\xff\xd3\x6b\xfb\x78\x21\xb8\x59\x70\xdb\xf2\x9b\xcc\x72\xc2\x76\x7c\x18\xbf\x33\xf7\xea\x40\x88\x77\xc6\x64\x89\xe7\x23\xbc\x73\xcc\xeb\x30\xaa\xc7\x71\x3f\x78\xa3\x1d\x9d\x0f\xf1\x9c\x85\x52\x46\xa0\x5b\x03\x66\xcf\xfb\x79\x1c\xcb\xe5\xcc\x98\x07\xef\x8c\x01\xc1\x26\x54\x38\x82\xd4\xa4\x41\x43\x1d\xc7\xff\x9b\xbc\x1e\x7e\x96\xef\x62\x30\x10\xc6\xa8\xd0\xb1\x9c\x99\x5f\x0c\xbd\xdb\xd5\x7c\x17\x3f\x3f\x9b\xcb\xf7\x66\x25\x2d\xa0\x45\xc0\x4c\x81\x6d\x37\x1f\x46\x05\x0f\x94\xeb\x99\xda\x27\xc2\xe2\x12\xb3\x2b\xcc\x47\x62\x27\x58\x3c\x06\xae\xc7\x2e\x45\x06\xd2\xd5\x18\xc8\xa0\x2e\x55\x0d\x64\x6f\x98\xa8\x1d\xba\x62\xb6\xf8\x0e\x01\x51\xa8\xa4\xbb\xdf\x51\x7c\xf7\x13\x29\x8d\x87\xbf\x71\xe9\x7d\xb1\x2b\xf5\xa9\xfe\x8a\xc6\x32\x41\xaf\xa4\xd5\xd1\xf7\xcb\x8c\x22\xa9\xec\x3b\x23\xaf\xa4\x92\x45\xea\x5c\x1d\xad\x28\x36\xc6\xa1\x4b\xd7\x2e\x22\xaa\xb2\x5a\x97\xca\xba\xd2\x4a\x66\xa9\xf9\x05\x82\xb2\x6c\xc5\x34\xcb\xa2\xcb\xdd\x7d\x91\x43\x62\x00\x8a\x03\x75\x09\xa5\x4f\x39\xd1\xf6\x58\x50\xc4\x3a\xcd\xf5\x56\xd5\x05\x10\x64\xa5\x6b\xaf\x7d\x55\x50\x5d\x05\x6e\xb2\x80\x14\x03\xeb\x03\xc3\x20\x50\xa5\x59\xa9\xd7\xaa\xaa\x23\x57\x64\x45\xf5\x7e\xf0\x38\x9d\x38\x0e\x34\x2a\xe4\xe1\x62\xad\x75\x71\x97\xa7\xff\xa5\x56\xd9\xa1\xe9\xe9\xb9\x02\x9c\x48\xea\xaf\x84\xa2\x01\x49\x2e\x98\x22\x56\x6c\x65\x40\x81\x50\x72\xe4\xaa\x51\x21\x16\xcd\xbe\xa1\x03\x3c\xa9\x5c\xba\x39\x77\x34\xe1\x54\x4c\xc5\x05\xd6\x93\x26\x59\x9c\x7a\x28\xd2\x84\x45\xb8\x92\x62\xbf\xaa\x23\x4f\xec\xe1\x13\x89\xfb\x2b\x9c\x2f\x95\xd1\x14\x78\x43\x2e\xfc\xe9\x40\xf0\x7e\x75\xc8\xd7\xf7\x65\xc1\x55\xa1\xec\x31\x7e\x22\x75\x76\xe3\x90\x25\xa7\xa5\xa6\xd2\x02\x52\x48\xdc\x16\x0f\x69\x7e\x27\xd2\x2d\xc0\x38\x7b\xf0\x8c\x34\xbf\xeb\xf5\x6d\x2d\xcd\x6f\xee\xac\x10\xab\x81\xec\xb9\x21\x74\x3b\x22\xac\x1a\x3e\xba\xe6\xdc\x92\x17\x3a\x5f\x1f\xd6\x90\x30\x4b\x15\x15\x4b\xe5\xf5\x7d\x91\x15\x77\xa9\xae\x70\x6d\xba\xb1\xa9\x22\x37\x34\xb0\xe4\x56\x65\xa1\x12\xb3\x9a\xb0\xfe\xc4\xc3\x33\x02\x19\x3c\x41\xd1\xb6\x0a\x58\xea\x3d\xc8\x13\x7e\x24\x4b\x2b\x92\x79\x60\xac\xed\xf9\xc9\xa6\x4f\xbc\x6f\xa8\x69\x02\xf0\x3a\xe4\x61\xb4\xb9\x34\xed\xd5\x31\x07\x4a\xde\x01\xd1\x99\x06\x0d\x6c\xb7\xea\x44\x9a\xd7\x1a\x46\x67\xaf\x32\xac\xde\x43\xb8\x76\x7b\x9f\xa4\x21\xf2\x33\xad\x2b\xaa\x58\x47\x49\x9b\x7d\x6e\x79\x32\x61\x67\x80\x10\x03\x01\x3a\x7d\x79\x73\x56\xca\x75\x91\xac\x08\xb9\xfe\x6c\xa3\xa0\x00\x58\xef\x54\xa9\x6a\x2d\x70\xab\x27\x7a\xa7\xf3\x04\x72\x34\x30\x46\x18\x01\xb1\xe8\x42\x6a\x69\x71\x87\x9a\xc9\xc8\x35\x56\xe9\xed\x2a\x63\x9d\x6a\xb7\x08\x1e\xb4\x80\x1c\xe3\x40\x0e\xbb\xf7\xa1\xfc\xd5\xfb\x50\x9c\x40\x8a\x75\x03\x0c\xa8\x10\x74\xeb\x37\x57\x6b\x97\x7e\xe5\x7a\x20\x3b\x6a\xc0\x2d\x39\x43\xb3\xaa\x88\xd4\xf5\x82\xc2\x3e\x4c\x28\x41\x31\x9e\xbf\xfd\x8a\xd2\x6b\x5d\x04\x67\xf8\x6e\x57\x16\xbb\x32\x05\x01\x7f\x16\x98\xa8\x54\xe6\xf1\x04\x30\xba\x0b\x04\xe9\x1f\x73\x5d\x56\xf7\xe9\x6e\x20\x44\x32\x90\x3d\x6c\x74\x71\x84\xf5\x20\xf2\xfe\x6d\x66\x33\xaf\x53\x14\x2d\x82\x7f\x59\x29\x42\x00\x9a\x9d\x54\x7d\x61\xdb\xd9\x11\x39\x69\x8c\x91\x1e\x48\x57\x91\x3c\x04\x9e\x6c\x6a\x43\xd4\x2e\x71\x7f\xe2\x36\xa9\xef\xcd\x52\xff\xfe\x06\x3f\xde\x17\x54\xcb\x9a\x04\xc3\x9a\x6e\x64\x5e\x78\x4f\xb2\x5f\x3a\xb0\x2e\x62\x6a\x96\x29\x95\x8b\xdb\x69\xab\xee\x75\xf9\x96\xc5\xd9\x19\xdc\x2a\x4f\xd2\xbe\x68\x75\xc2\xbf\xe7\xe0\xe8\x5e\xd7\x45\x69\x8e\xa6\x34\xbf\xd3\xe6\x1f\x70\x46\xa7\x30\x02\x70\xa4\x97\x58\xd9\x26\x08\xdd\x0e\xec\x0b\xd8\x01\xb5\xae\xf1\x7b\x11\x93\x9a\x9a\x7f\x40\x40\x37\x92\xbb\x0c\x4a\xc8\x22\x04\x1d\xef\x4a\x1d\x2a\x8a\x0b\x6a\xc7\x13\xc7\x25\xf4\xfd\xeb\xae\xd4\x95\xc5\x50\x6f\x8a\xec\x4b\x56\x94\xfa\xad\x84\x82\x26\x66\xbc\x70\x9d\xe3\x73\x12\x87\x06\x63\xd5\xa5\x5c\x69\x2e\x02\x20\xf2\x88\xa2\x64\xf1\x2e\x1c\x5b\xd3\x9b\x4d\x5a\x56\xb5\x80\x0a\x51\xae\xe6\xce\x93\xaa\x3d\x68\x2e\xff\x0a\x1f\x80\x61\x8f\x24\xf2\xc4\x79\xa3\x6d\x96\xb9\x77\x50\xd3\xbe\x72\x2c\x07\x94\x26\x30\x9b\xc2\x56\x61\xd9\xcf\x0f\x84\xd8\x0c\x64\xcf\xac\x0a\x7f\x4b\xd8\xb1\xa2\xb8\x78\x30\x5e\xb8\xfe\xad\x2e\xb0\x5d\xf5\xa2\x29\xd6\xeb\x2c\x0d\x8e\xec\x7a\x24\xa1\x80\x52\xc4\xd0\xb2\x57\xff\xce\x2f\x8e\x44\xb5\x4e\x71\xfd\xad\xe9\x22\xa0\x16\x24\xc5\x56\x99\xd9\x7e\xbc\x57\x35\x48\x8c\x92\xd9\x63\xbe\xbd\x25\xbe\x10\xae\xd7\x82\xa3\xdd\x4e\xac\xf0\xd9\x91\xef\xd2\x5a\x65\xf0\x41\xdf\x3e\x5c\x15\x85\x31\x17\xd4\x76\x77\x9f\x69\x0f\x35\x0a\xc1\xe8\x34\xbf\x7b\x6b\x36\xa7\xb9\x63\x4a\x1d\x09\x52\xb5\x05\x8c\xec\x96\x94\x5a\xed\x0d\x69\xaf\x33\xb5\xd5\x32\x87\x8a\x4e\xf3\xe5\xa4\x54\x5b\x55\xa3\x29\xc9\xff\x2e\x4e\xc9\x5a\x11\xe6\x8b\xe6\x53\xeb\xfb\xa2\xd4\xd6\x0e\x7c\xa4\x2d\xab\xcd\xfa\xae\x55\x9a\x6f\x11\x97\x29\x93\xfd\x76\x25\xab\xfb\xe2\xf1\xad\x67\xf1\x40\x95\x45\x05\xfb\xb2\x95\x55\x7a\x2c\x4a\x58\x47\x2d\x53\x13\xef\x8f\x82\x39\x88\xf0\xda\x01\xe9\xdf\x9a\x38\xa2\x2b\x41\x03\xc9\xd1\x67\xa0\x52\xa9\x8c\x4d\xa1\xb2\xe2\xae\xd8\xc3\x81\x1f\x3c\xf7\xf0\x96\x2d\x44\x63\xab\x95\xea\x11\x36\xf0\x4e\xa5\x50\xf8\x1a\x09\x90\xcf\xa9\x69\x34\x65\xb5\xde\x67\x3b\xfc\xa7\xce\xef\x4a\xf5\x40\x30\xf1\xcc\xb4\xdd\x3d\x6f\x77\x5f\xb4\x9a\x2d\x9e\x68\xb6\xfc\x9e\x66\xbb\x87\x1e\xde\x0a\xd7\x66\xd4\xf8\x85\xb5\x67\x36\x9f\x4c\xb3\x6c\x5f\xd5\x25\x5d\x46\x5b\xb5\x83\xc3\x27\x8f\x64\xf5\x45\xd7\x6b\x18\x69\x20\x67\x3e\x4d\xd2\xad\xce\x2b\xd0\x5e\x85\x39\x95\x68\x3d\x3e\xa0\xda\x18\xcd\x2c\xc8\xe7\xec\xec\xbf\xfd\xd1\x40\xa9\x9d\x54\xe7\x6b\x58\x34\xde\xa1\x60\x9a\x67\x37\xef\x5b\xff\x20\x7a\x4b\xd4\x28\xa9\x2b\x81\x4d\x54\xad\xf8\xd2\x85\x8a\x87\x9a\xb8\xaa\x76\x65\x61\xde\xa4\x13\xa1\xb8\x82\x14\x12\x6b\x70\x4b\xe3\x22\x84\x7a\x7d\x68\x3b\xbd\xdd\x66\x1d\x54\x99\x6a\xbc\x64\xd6\x69\xb9\xde\x57\xf6\x03\xa5\xe8\x7a\x97\x31\x39\xec\x61\x1c\x58\x1e\xc7\x4f\xe4\x81\x10\x77\x03\x89\xd4\x3c\x4c\xc5\x22\x3b\xef\x2a\xfd\x55\x97\xeb\x14\xaa\x8d\xda\x95\x65\x1c\xb3\x30\x87\x2e\xf3\xa0\xec\x4a\xfd\x90\x16\xfb\x2a\x3b\xc8\x87\xb4\xc8\xec\xbd\x78\x4c\x6e\x3c\xc0\x84\x8b\xc0\x05\xe5\xc7\x5a\x89\x2f\x5a\x6a\x7e\xc6\xca\x7a\x50\x6c\x78\x40\x26\x10\x1b\xad\xc5\xd1\x26\xcb\x44\x57\xbb\x14\x6a\xdf\xb8\xc1\xd4\x5c\x4c\xba\xdc\x0f\x64\x0f\xd3\xe2\xd9\x41\xde\xe0\xf8\x7b\x76\x17\x5f\x79\x64\x69\x95\x7a\x9d\xd6\xce\x5b\xf5\xbd\x66\x01\x74\x46\xdb\xed\x3e\x47\xd2\x85\xa6\x89\x66\xfc\x93\xf6\x53\x22\xe4\x32\xb7\x32\xfc\x25\x6f\x2b\xaf\xf2\xdd\x7c\xe4\x31\xc5\xb5\x6c\xfe\x1f\x2a\x1e\xdc\xe7\xf1\x99\x7c\x0e\xfb\x4e\xc8\x5b\xb6\x1c\xc5\x31\xcb\xf1\x13\x9b\xce\x78\x70\xa3\x9c\x22\x56\xf7\x6c\x57\xc0\xff\xb3\xf1\x3f\xbe\x55\x07\x81\x1c\x43\x54\xcf\x89\xdf\xa7\x52\x8e\x5d\xa6\xc8\x11\x47\x91\x69\xf8\x4f\xb7\xd6\x32\xd0\xb6\xae\x74\xce\x85\x40\x6f\x85\x37\xc0\x76\x28\xc3\x06\x1e\x19\x1d\x9b\x97\x76\x23\x6e\x4e\xe9\xf0\xbb\xdc\x76\x6f\x44\xfc\x49\x8b\x64\x30\xc2\xe1\x38\x0a\xff\xa4\x80\xda\x31\x3e\x2a\xa8\xbe\xd9\xfd\xb7\x6d\x79\xd0\x56\xc7\x8f\x5e\xa5\x77\x66\x9e\xd9\x36\x29\x65\xca\xf0\xac\x74\x20\x7b\x73\x4e\xcf\x37\x8d\xfd\x90\x5d\xe4\x89\x17\x58\x7a\x59\xcf\x24\x80\xfa\x99\x3d\xd6\x65\x3d\xa4\x95\xd9\xe9\xa5\x26\xb1\x53\x37\x78\x08\x01\x00\xd6\xac\xaf\x4e\x09\x81\x01\x03\x40\x97\x44\x7f\x38\x3a\x70\x55\x5d\x94\x40\x43\xb5\xc1\x1b\x01\x0f\xc3\xa6\xf1\xe5\xa2\x36\xe6\xae\xf5\x2c\x06\x77\xd3\x7b\x7a\x79\x48\x87\x82\x08\x87\x2b\x95\x96\xf2\x52\x2b\x60\x13\x40\xfc\xc8\x40\x4e\x8b\xfa\x9e\xa2\x2e\xa1\x95\x84\x3a\x74\x39\x69\x0f\x95\xda\x8c\x6b\x84\xa6\x12\xb8\xdd\x8c\x5c\x85\x61\xdc\x1b\x17\x0c\x08\xf2\x60\xfd\x3a\x4c\x44\x61\x6b\x6b\x55\x89\x07\x22\x7c\xc0\x0d\x6f\x25\xc0\xcc\x5d\xeb\x9d\x57\x19\x48\xa0\x55\x04\x39\x6c\x90\x6e\xab\x4b\xd3\xd5\xbd\x87\x86\xcb\x2c\x5c\x3c\xb7\xdc\x9f\x32\xf5\xe8\x85\xc8\xb0\x0a\xd1\xec\xde\x4c\x3d\x56\x88\x95\xe0\x3e\xbf\x2f\x55\x5e\x0f\xe4\xa2\xab\x98\xad\x21\xe7\xd1\x38\x92\x23\x7b\x92\x8a\x7b\x5d\xea\xd5\x01\x6b\x99\x2a\x2c\xd5\xf4\xab\x88\xca\xe2\xa0\xb2\xfa\x70\x6a\x06\x2b\x6a\x56\x1b\xed\x74\xb9\xd3\x10\x2a\x38\xd9\x14\x28\xa8\x99\x10\x51\x12\x2f\x1a\xaf\x03\xb6\x8b\x7d\xe9\x55\x21\xf1\x31\xee\x56\xa5\x99\x49\xe7\x14\xaa\x0a\x11\x34\x09\x86\x3c\xde\x40\xa4\xb3\x2e\xe4\x3c\xc0\xb6\xe0\xda\xac\x0b\xb3\x3c\x8b\x72\x57\x94\x5c\x23\x4c\xf1\xa7\xba\x08\xc2\x0e\xce\xa3\xaf\x90\x0c\xae\xf3\x81\x54\xdd\xca\xcf\xb3\x15\xae\xde\xb7\xdf\x42\x98\xa9\x2e\x7c\xa6\x23\xf7\xa0\xa1\x17\x7b\x0c\xf1\x46\x88\x08\x58\xdf\xfb\x8e\xb9\x77\xea\x53\xf9\x98\x25\x73\x0a\xc8\x82\x22\x59\xab\x2f\xba\xf2\x95\x37\xaa\x5a\xef\xd0\x74\x44\xb6\x15\x91\xa9\x95\xce\x8c\x7b\xb7\x55\x25\x5c\x49\xbe\x33\xc7\x4e\x29\x9d\xf7\x44\xa9\x83\xea\x5d\xc0\xb0\x40\x2b\x89\xe3\x0a\xc2\x0c\x06\x46\x0f\xad\x3c\x64\x10\x05\x26\x59\x46\x20\x68\x28\xbf\xe8\x44\xf6\x02\x41\x2b\x30\x80\x1e\x55\x65\xbf\xc2\x18\x9d\x38\xbf\x33\xce\xb0\x79\xdf\x62\xa7\xf2\xb4\xba\x8f\x7a\x68\x33\x05\x00\x62\x7c\xba\xb9\x4d\xa0\x2b\xed\x87\x3b\x88\xac\x95\xff\xea\xbd\x85\x88\x4a\x5d\x04\x35\xf0\x79\x22\x9b\x17\xbe\xbf\x4a\xec\xf0\xb7\xe6\x5d\xf8\x73\x0e\x2e\x24\x53\x79\x24\xdf\xf5\x12\x6f\x25\x0c\xf8\x9b\x4f\x06\x64\xdf\xc0\x15\x31\x2d\xf2\xd3\x47\x95\x3e\xc0\x24\x8f\x8a\xed\x6e\x9f\x55\x45\x79\xb0\x27\xc0\x62\x7d\xaf\xb7\xba\x82\x22\x59\x34\x33\xfe\x63\x5f\xa6\x55\x92\xae\x2d\x28\x0c\xac\x7a\x11\x14\x28\x52\xec\x8b\xf6\x36\x06\x64\x48\x63\x34\x47\x7d\x61\xac\x5d\x2b\xb0\xda\x9c\xde\xe9\x88\xf4\x2a\x78\x2b\xa9\x6c\x9b\x59\x07\x81\x6b\x0a\x70\x58\x13\x8d\xc8\xf7\x2b\x32\x66\xe9\xd0\x68\xb5\x42\xc0\x36\x70\x4d\x61\x3c\xb5\x3d\x17\x56\x07\x38\x95\xe8\x3c\xa1\x13\x02\x8e\x2b\xcf\x79\x76\x47\xdb\x5b\x21\xd2\x74\x20\x3f\xfd\x1d\x46\x0d\xa2\x15\x7f\xaf\x51\x93\x38\x6a\x82\xe2\x42\x9d\x43\x06\xbf\xfc\xd6\x80\xc9\x70\xc0\xc4\xdf\x3c\x60\xb4\x9c\x53\x33\x6c\x1f\x8b\x6c\x9f\xd7\xaa\x6b\xb0\x96\x47\x5a\x7a\x7c\x80\x22\xf1\x78\x8f\x21\xd8\xc0\x12\x2c\x4a\x1b\xac\x63\xf6\x20\x42\x60\xda\xc7\x63\xf6\x01\xec\x50\xa6\xab\xc4\xed\x67\x56\x5f\xb1\x06\xd7\x09\xcf\xd1\x64\x9b\xe6\x69\x05\x52\x84\x0f\xb6\xed\xcd\x41\xaf\x22\xf9\x90\x2a\x2a\x9c\xc4\xaf\x47\x70\xb1\x8b\xbf\x65\xe0\x40\x98\x99\x61\x95\xf4\x69\x0a\xa3\xf0\x23\x31\xc0\x97\x65\x58\xf6\x42\xca\xab\xe5\x56\x01\xc1\x2e\x0e\x4d\x5e\x3c\xca\x2f\x79\xf1\x98\x1b\xc3\xc2\x5c\xc6\xc8\x1c\x92\x00\xc2\x8d\x28\x1c\x82\x57\xf8\x34\x04\x76\xec\x49\xf8\x77\x7d\xdf\x60\x43\x53\x58\x27\x5f\xeb\xf5\x3d\x90\x06\x66\x07\x27\x1c\x7b\xfc\xf6\x65\x04\x67\xb3\xd1\x03\xe1\xd9\x1a\x9c\x8e\xf8\xe5\x64\xd3\x8f\xa0\x93\xf4\x7d\xa2\x32\x30\x4e\x5c\x76\xb0\xe3\xb7\x3a\xb8\xe9\x55\xa5\x66\xbb\xc3\x93\xe8\x78\x31\x90\x73\xc7\x95\x40\x2b\x8e\x2d\x05\x7e\x8c\x97\x07\x79\x4e\xe3\x92\x56\xde\xeb\xa0\x84\xdc\x2b\xef\x47\x2e\x0d\x24\x35\xa0\xba\x61\x87\x67\xf5\xa8\x19\x2a\x34\x2c\x3a\x88\x53\x8a\xf2\x89\x3b\x03\xc8\x3e\xdb\x71\x6b\x11\xac\x13\x7c\xea\xbe\xf2\x39\xf1\x08\xd9\x8b\xf4\x14\x28\x4d\x01\x4f\x9e\x6b\x42\x14\x8f\x39\x70\x5c\x8a\x93\xdb\xf9\x18\x52\x08\x51\x87\x5f\x0d\x7a\xf6\x01\x7d\x15\x34\xcc\xbc\xb2\xbb\x13\x82\x3a\xe1\x3a\x0b\xc1\x05\x28\xfb\x06\x0f\x05\xd2\x69\x60\x81\x60\x6f\xbc\x0c\x31\xec\x20\x6b\x49\x9b\xe3\xb1\xdb\xe3\xe7\x6b\xcd\x55\xa7\x60\xa5\xfd\x3a\xdd\xa5\x2e\x09\x65\x9d\x3e\xeb\xca\x77\xec\xbb\xba\xe0\xb7\xf2\x97\x3b\xd3\x04\xba\x31\xda\xea\x20\x88\xe8\xc1\x91\x68\xe1\x0b\xbd\xe9\xf8\xa2\xf5\xce\x18\x87\x6a\x0d\xac\xe3\x4e\xc3\x1f\x5f\x48\x85\xf0\x7e\x5a\x51\x92\xb1\x58\x07\xb2\x4d\xd2\xe9\xef\x5b\x6a\x81\xe3\xf3\x22\x9e\x5e\x5c\x03\xf9\xe9\x5e\xe7\x4f\x4c\xa0\xbf\x0a\x05\x1a\xbe\xfe\x4c\x7a\x13\xa8\x37\x1b\xcc\x71\xe1\x01\x00\x09\xcb\xb5\x32\xa7\x91\xaa\xf6\xa5\x0e\xe6\x56\xb4\xe6\xd6\x9f\x3e\x75\x64\xf2\xc0\x8c\x33\x6f\xff\xbb\xcf\xe2\xd2\x8c\xba\xa5\x17\x3a\x51\x7d\x0a\x24\x5a\x86\xde\x63\x16\xba\x9f\xaf\x43\x62\x13\x98\x40\xcb\xda\x40\x7c\x0f\x0d\x4b\x5e\x2a\x28\x7a\xb3\x91\x26\xb4\x08\x81\x3a\x44\x22\x37\x09\x58\xc6\x74\xb2\x88\x4e\xe2\x10\xdb\xf6\xf1\x06\xc6\x84\x7d\x82\xa0\x41\x00\xb9\x60\xaa\x6f\xbe\x82\xec\xc9\xc8\x4b\x33\x6a\x44\x1c\x77\xa5\x5a\xd7\xe8\x47\x45\x20\x0d\xff\x10\x50\x5b\xf2\xe3\xe1\x61\x84\xc3\x56\x1e\x35\xc6\xea\xe0\x98\x9a\x4e\x56\xfd\x88\xff\x08\x1c\xc0\xad\xf6\xe6\x81\x57\xd2\x6c\xb0\xfc\xad\x0d\x16\xb6\xc1\x5e\x1a\xff\x37\x35\x18\x9c\x2e\x6a\xf4\x65\x48\x20\xfe\xc4\x51\x8d\x66\xd2\x30\xc4\x83\x04\x9e\xa0\xeb\x0c\xea\x5e\xc2\xb2\x87\x97\x3a\x0e\x13\x58\x06\xbb\x7d\x59\xed\x55\x1e\xdc\x83\x66\x8d\x46\xfe\x91\x02\xea\x78\x6d\x6d\x3b\x4e\x05\x5b\xc8\x0d\x79\x86\x91\xef\xd0\xd1\x60\x12\x3b\x6c\x51\x0a\x0c\xfc\x30\x93\xd2\xbe\x4e\xb3\xf4\xbf\xd2\xfc\xee\x8d\xe5\x11\xf4\xf9\x0f\x1b\x29\x52\x79\x52\x94\x72\x57\xe9\x7d\x52\xe4\x87\x2d\xea\xce\x5b\xb7\xbc\x2f\xd3\x0d\x94\x86\x66\xa9\xa7\x7a\x90\x76\x3f\x88\xfe\x6a\x83\x07\x89\xae\xd2\xbb\x1c\x17\x8d\x47\xc3\xcd\x05\xbb\x66\xb7\x9e\xe8\xc1\xdd\xc0\xf8\x8b\xd5\xae\x40\xdb\x8e\x53\xeb\x11\x27\x43\x8d\x55\x87\x91\xe8\x48\xfe\x47\xb1\x2f\x73\x95\x61\xc6\x5c\x79\x78\xc5\x93\x9e\x8f\x5e\xbc\xc1\xa7\xf7\x20\x87\xc7\xcd\xf9\xa9\x6a\x51\xdb\x46\x6e\x8b\x12\x07\x0b\x69\x48\x62\x6b\xbd\x11\xa7\x2c\xb2\x3f\x94\x60\x4f\x41\x87\x84\xeb\x10\xe5\x32\x61\xf7\xa7\x75\xa6\x43\xa0\x8b\x1b\xca\xb7\x94\x63\x0c\xb7\x85\x7d\xe1\x41\x04\x3b\x04\x4c\x80\xf9\x18\xd8\x76\x54\x7e\x88\xf0\xb4\xb4\xbb\x8c\xd4\xa3\xf0\xf0\x5b\x69\xbf\x1e\xca\x5c\x36\x5e\x44\x9d\x16\x2e\x34\xfd\x76\x3e\x96\xde\xb1\x67\xaf\xb3\x76\x11\x10\xa6\x88\xd8\xbf\x4b\x73\xc7\x2a\xed\xaf\x56\x4c\x59\x9f\xa4\x0f\xfd\x88\x39\xef\xb1\x4e\xd6\x23\x82\x7b\x0e\xbb\xb5\x91\x58\x0d\x4f\x14\x60\x60\x81\x1d\xcf\x71\x08\x4e\xf7\x7a\x0c\x52\x16\x37\x14\x1c\x17\x82\x56\x53\xef\xaa\xd4\xb9\x71\xd0\xda\x84\xd7\x1c\x2d\x6d\x2c\x5d\x0c\x2c\xf4\x16\xeb\x52\xeb\x7c\x97\xa9\x83\x40\x4c\x1c\x64\x1c\xe9\x93\x47\xbe\x0a\xc0\xc9\x7b\x5b\xdf\xe2\x9f\x51\x58\xbf\x43\x67\xef\x0b\x79\xb2\xea\xb3\x07\x90\x6e\x77\x19\x00\x6e\xe8\x52\xca\x0f\xc1\x62\x53\x79\xae\xcb\xb7\x36\x28\x14\xc9\xfb\xe2\x51\x43\x46\x1e\x98\x2c\x5b\x30\x00\xef\xc4\x0c\x0e\x2d\x24\x52\x94\xc6\x09\xda\xee\xb7\x44\xfc\x8e\xed\x04\xa8\x0a\x96\x08\xe1\x96\xe7\x3f\xc0\xce\x82\xa3\x29\x77\xe4\xfb\x28\x3a\x6e\xaf\xe1\x63\xef\xa3\x07\x56\x91\x00\x9a\x42\x14\xa3\x64\x93\xa0\xe2\x31\xaa\x2c\xb6\x81\x7a\xea\x28\x75\x15\x44\xc2\xb6\x69\x6e\x56\x0e\xca\x7c\x0a\xfe\x12\xaf\xb5\x26\x28\xc8\x35\xef\x69\x08\x9b\xb1\xad\x80\x84\x1a\x8c\x72\x32\xf9\xbe\x31\x6b\x5d\x38\x32\xef\xd8\xe1\x99\xa0\x6e\x54\xba\x96\x50\x36\x0f\x8e\x07\x20\x09\x56\x41\xfa\xec\x73\x37\x3b\x23\x87\x5d\x45\xc3\x50\x63\x3e\x7e\x84\x4e\xf0\x7f\xa9\xaa\xd2\x65\x4d\xc6\x38\xd1\x61\x37\xc2\xc9\x91\xa0\xe3\xb4\xba\x4f\x77\x98\xc9\x83\xba\x38\x48\x6a\x93\x9f\xd3\xdc\x01\x9e\xff\x85\xc7\xb8\x77\xa0\x0a\x3a\x50\xdb\xe8\xa0\x02\xaf\x59\xbc\xea\xcb\xe6\x16\x8d\x02\xce\x48\x86\x69\x45\xc2\x26\xf1\xbe\x55\x84\xf6\x1b\xda\x88\x58\xa9\x18\x21\x94\xaa\xf2\xe2\x9a\xa0\x4a\x0d\x0b\x8f\x90\x06\x3c\x14\xf6\xa9\x28\x28\x40\x7b\x34\x40\xb7\x50\x59\xe8\xea\xd0\x88\xb9\xc3\x91\x6c\x46\xc0\x86\x75\xa3\x6f\xd8\xe5\x2e\x76\x4d\xbc\x94\xab\x03\x5b\x92\xf8\x7a\xde\x32\xdf\x30\x47\x70\x3d\x73\x0d\x64\x92\x56\x75\x51\xd6\x91\xdc\x9a\xcb\x1f\xa6\x86\xb8\x2f\xcc\x02\x06\x2d\x1c\x64\x34\xd5\x65\x71\xa7\x20\x12\xa5\x2c\x28\x84\x71\x97\xc2\xb7\x9d\x31\xc6\xf5\xc8\xa1\xdb\x5d\xa9\xff\x63\x9f\xa4\xeb\x54\x65\x4d\xe6\x72\x9a\x9d\x9f\x2a\x79\x5f\xe4\x38\x8a\xa5\xde\xed\x6b\x4a\xa4\xba\x39\x33\xe3\x6f\xd9\x12\x3b\x63\x6b\x70\x80\xcb\x3f\xa9\x9d\xca\xfb\x1e\xac\xd0\x8f\xc3\x08\x3f\x00\xd3\xe9\xf8\x9b\x73\xb6\xe9\x72\x9e\xb4\xe3\x21\xde\xd8\xf6\x85\xed\x67\xa2\xf5\x16\x3d\x12\x20\x1c\xa4\x71\x45\x30\x02\x0e\x6d\x27\x85\x45\x73\x74\x05\x8d\xee\xaf\x18\x36\xca\xb0\xed\xf9\x1e\xf4\x57\xa6\x80\xe3\x1a\xc2\x6a\xe6\x6d\x40\xb5\x07\xc7\x40\x17\x5e\xcf\x1d\x5f\xd6\xec\xde\xec\xb3\xcc\xd8\xa9\x68\x67\x84\x0b\xba\x91\x87\xc9\xe1\xf5\x2a\xc3\xd5\x0d\x35\xb5\xf0\x7b\x72\xe3\x9c\x89\xe2\x66\xc4\x1d\x6b\x74\xaa\x3d\x3d\x15\x4f\x4c\x03\x13\x4d\xda\xbd\x87\xe1\xf0\x97\x03\xd8\x5f\xba\xe2\x5a\xe2\x2a\x62\xc6\xb2\xd4\x71\xb3\x92\xbb\x2d\x04\xd1\x75\xd9\x32\x35\x79\x7d\xbb\xbc\x1d\x4e\x26\x9f\x11\xfd\x0f\xd4\x5f\x84\xfa\x87\x2a\xc4\x78\x21\xc7\x53\xf9\x69\x3e\x5e\x42\x3d\x9f\xc5\xeb\xcf\xae\xae\xe2\xf9\xc2\x55\x63\x40\xcd\x08\xc0\xed\x6d\x79\xc8\x3c\xbe\x99\xc7\x8b\x78\xba\xc4\x62\x14\x39\x9b\x1f\xa3\x84\x19\xcd\xa6\xa3\x78\x3e\x1d\x4f\xdf\xdb\x07\x46\x5c\x80\x19\x71\x15\x65\x24\x17\xcb\xe1\xf2\x76\x09\xb5\x7b\x5e\xa1\x5d\x50\x89\xc9\x9c\x6a\x50\x6f\x08\xef\x8d\x44\xf8\xd2\xe5\x78\x39\x89\x5b\x0c\x33\xd1\x77\xd0\xcb\x4c\x67\x53\x9f\x3c\x05\x8b\x01\x3f\xc4\x72\xf8\x6e\x11\x53\xe5\xc1\x04\xb8\x52\x6c\xf3\xe4\x65\x7c\x15\x8f\x96\x8b\x48\x0e\x47\xa3\xdb\xf9\x70\x44\x12\x90\x66\x70\x61\x68\xf0\x5b\xf4\x00\x31\xbb\x92\xf1\x7c\x3e\x9b\x2f\x5c\x39\x22\x70\xb5\x2d\xa1\x6c\x66\xf6\x31\x9e\x0f\xdf\x4d\xe2\x81\x5c\xcc\xae\x63\xf9\xa7\xdb\xf9\x78\x71\x39\x1e\xe1\xd8\x5e\xce\xe0\x73\xc3\xc9\x64\xf6\x89\xa8\xdb\x46\x93\xdb\x05\x15\x10\x75\x95\xaf\x2e\x66\x58\x27\xe1\x3e\x78\x3d\xfc\x8c\x0f\xb9\xb9\x99\x7c\x36\xeb\xe0\xf3\xec\x16\x0b\x8a\x7d\x41\xd5\xdc\x09\xaa\x0e\xcc\x97\xe3\x9b\x65\xa3\x10\xc4\xa7\x82\x0b\xcb\x60\x22\xe1\x97\xad\x02\xfd\x9b\x5d\x50\xae\x24\x15\xdf\xcc\xd5\x9a\x58\x1c\x45\x35\x9b\x5c\xad\xca\xf5\xa8\xc2\x2f\x52\x0d\xaa\x51\x23\x79\x73\x3b\x1d\x43\xa1\xcf\x6c\xee\xca\x56\x65\x93\x2d\xce\x56\x64\x86\xb5\x36\x0d\xca\x38\x5a\x91\x54\x9c\x69\xdb\xfc\x61\xb8\x90\xef\xe2\x78\xfa\x44\xb9\xa6\x68\xea\x6d\xc2\xa6\xfd\x79\x20\x97\xc4\x50\x08\xd4\xb2\x0a\xa3\x36\x32\x88\x95\xb5\x63\x41\xf7\xba\xd4\x24\xd6\x97\x06\x24\x87\x6a\x5f\x17\x80\xe5\x03\xe5\x7b\x88\x3b\x80\x12\x48\x09\x80\xf0\x30\x3a\x7f\x2c\xf2\xe2\x80\xbc\x3e\x80\x97\xc0\x4b\x0f\x8e\xab\xfe\x89\x8b\xd7\x05\xb5\xba\x2c\x38\x6b\xa8\x5b\x28\x38\x3c\x17\x31\xf5\x14\x6b\xac\x5c\xa7\x3c\xa2\x89\x0a\xb9\xd4\x6d\x03\x85\x8f\x30\x2e\xf5\x56\xa5\x70\x57\x83\xe8\x1d\xd2\x94\xfa\x4a\x6c\x85\xd3\xb9\xaf\x06\x7c\xfe\x56\xf2\x3c\x92\x17\x91\x78\x19\xc9\x57\x91\xfc\x19\x19\xaf\x7e\x21\x0d\x93\x7d\xf9\x90\x3e\xb8\x48\x2e\x4d\x53\x07\xaa\x7a\xd5\xc2\x10\xa0\x7d\xdb\x85\x24\x88\x08\x60\x1a\x46\xe5\xa1\x76\x24\xad\x44\x08\x08\x90\xdf\x0b\x08\x60\x47\xcf\x98\x25\x7d\xc0\x78\x98\x4e\x03\x59\x33\xd3\xda\x42\x8b\xa2\x23\xd9\x45\x7b\xdf\x94\x1a\x29\x19\xea\x10\x52\x6e\xe5\x22\x42\x05\x7e\xa2\x86\xae\xea\x62\x17\xf0\xe8\x7a\xe1\x19\xc7\x52\xdf\xe1\xac\x89\x30\x95\xaf\x5b\x45\x02\xd0\x44\x40\x84\xa6\xf5\x7d\x52\xaa\xc7\xc6\x3d\x19\xa8\x3d\x05\x62\x0f\x1c\x6e\x42\xf1\xb6\x90\xe4\x76\xa5\xa3\x56\x56\xaa\xa9\xa9\x48\xaf\xe8\x33\x07\x5a\x90\x35\x20\xdf\x2f\xcd\xf7\xda\x2e\xb8\x4d\xc1\x02\xe8\x18\x34\xe6\x40\x82\x5b\xc8\xc2\x21\x31\x60\x32\xf0\x0c\xf8\x65\x20\xaf\xd3\x6a\xad\xb3\x4c\xe5\xba\xd8\x63\x21\x5a\x6c\xf6\x2b\x50\x31\x7c\x5f\x14\xdb\x05\xe8\x7c\xd7\x56\x84\x96\xfb\xc6\x97\x67\x73\x71\x64\xe5\x83\x49\xbc\xbc\x8c\xc3\x0d\x23\xac\xba\x01\x88\x51\x55\xe7\x42\xae\x8b\x23\x1b\x1f\xb7\xc9\xaf\xea\x58\x23\xea\xd1\xe8\x89\xf8\x76\x4f\xc2\xc0\x44\xab\x4b\x4d\x99\xfd\xdf\xd0\xa5\x35\x84\x51\x09\x44\xce\x14\x16\x4d\xfc\x79\xc5\xda\x04\xc8\x6e\xa1\x73\x58\x2b\xb0\x83\xf1\xa1\x6e\x4b\x0b\x74\x98\x6a\xe2\xaf\x05\x2b\x16\x97\x93\x69\x19\x3c\xc4\x96\x56\xd0\x53\x1a\x19\x22\x73\x0a\xa2\x46\x8e\x38\x7a\xcc\x47\x01\x85\x1d\x4b\x39\x90\x3d\x4e\xf6\x2e\x87\x1f\x39\x7f\x03\xae\x09\xb2\xef\x62\x58\xcf\xf6\x17\x9b\x0a\x25\x7f\x84\xd0\xe5\xe0\x2b\x05\x55\x28\x74\x67\xf3\xa6\x22\xc8\xb7\xba\x07\x91\x22\x86\xd9\x42\x6e\x88\xb0\x62\x66\x5a\x40\x4f\x24\xab\x1a\x76\x0e\xb4\x6d\x08\x79\x28\x08\x11\x20\xd2\x20\xba\x05\x05\xf0\xc5\xf1\xbc\xfa\xc1\x3e\xf8\x74\x49\xfc\xc3\xe6\x23\xee\x79\x9e\x3f\x0c\x5c\xee\xe9\x5d\xae\x13\xe1\x0d\xd4\x81\xbc\x21\xe4\x4d\x24\x9e\x9e\xee\xa7\x36\xae\x78\xbf\x60\xb1\x76\xa2\xa5\x76\xb4\xe5\x4a\xd7\x8f\x5a\xe7\xc1\x9c\x74\x49\x45\xc0\x12\xa7\xa5\x9b\x40\x72\x18\x82\x6e\xe6\x59\xc0\xd9\x8e\x4b\x8d\xaf\x84\x2a\x72\xaf\xa8\xc8\x1d\xf5\x9d\x87\xe0\x15\x81\xd3\x0b\xc7\x32\x45\x53\xf1\xde\x1a\x78\x61\x56\xbb\x6a\x57\x5a\xae\x00\x44\x49\xb8\x4b\x2e\xd2\x51\x99\xb0\x13\x48\x8e\x2e\xc9\x96\x11\x13\x0f\xc6\x6a\x3c\x60\xaa\xb5\x26\xb0\x7c\x29\x18\x3d\x8f\xf0\xc7\x2a\x1b\xfa\xf1\x94\xed\x1e\xee\x52\x0e\x9f\xb8\x51\xa5\xdd\xe1\x07\x4b\xe8\x15\x1b\xd2\x35\xeb\x00\x2f\x58\x3e\xcc\x66\xcd\x21\x84\x86\x75\xbe\x36\x57\x5b\x03\x57\x89\xea\x91\x49\xa9\x36\xf0\x18\x4e\x3b\xd8\x1b\x27\x85\xa4\xa2\xdd\xbf\xef\x74\x99\x6b\x39\x2a\xf2\x07\xb3\x10\xbc\xe8\xda\x8d\xc3\x3b\x16\x1b\x39\xf1\x0a\x63\x1c\x05\x36\xa9\x12\x18\x77\x77\x8b\x40\xce\xc2\xf8\xfc\xbb\x1a\x71\x20\x17\xbf\x44\xf2\xfc\xf5\xcf\xaf\xfb\x68\x82\xcc\x8b\xad\x16\xde\x9b\x8a\x8d\x3c\x7f\xfd\xea\x1c\xff\xf8\x69\x7c\x33\xf3\x38\xcc\x96\xa5\x56\x78\xc8\x9c\xbf\x7e\xfd\xca\xfb\xc8\x8d\x87\x0f\x86\x1b\xe2\xc6\x55\x6e\x86\x5f\xb2\x63\x77\x9b\x9b\x1d\x51\xa9\xcc\x7b\xbe\xd7\x8c\x13\x48\x54\x01\x76\x43\x14\xb9\xfc\xd3\x3e\x3b\xc8\x8b\x17\xd0\xf2\x73\x8c\x23\x57\x76\x76\x50\xaa\x33\x98\x0a\x08\xe4\xd0\x0d\x4c\x46\x91\xb1\x69\x1e\x54\x5e\x0b\x3f\x90\x12\x16\x64\x4e\x02\xab\xc6\x6c\x98\xaa\xd8\x93\x49\xb4\xd2\x7c\x1c\x25\xa4\xef\x0b\x26\x15\xe7\x01\x4a\xb3\x49\x0a\xd8\x54\xd2\x5b\xd9\x34\x9f\x36\x8a\xed\x99\x70\x20\xbf\x8c\x63\xe3\xbe\xc0\x71\xd2\x23\x61\x06\xab\xfc\x6c\xf5\xd9\xaa\x7d\x5a\x43\x24\xb1\x6b\xa5\x8a\x4e\x23\x31\x53\x8f\xae\xcc\xdb\x6d\x48\x1f\x76\xd2\x06\xeb\x08\x27\xa0\x06\x30\xf7\xd6\xd7\xcc\x68\x05\x21\xa1\xa6\x9e\x89\xc5\x95\x35\x6f\x45\x14\x39\xf4\x31\xc7\x5e\xee\x9c\x6f\x61\x0a\xf3\x05\x21\xe1\xf0\xbe\x1c\x08\xd1\x22\xea\x98\x42\x56\xa6\xe3\x0f\x2c\x91\xee\x8e\xed\xf6\xc5\xb8\x05\x74\x68\x5e\x30\x24\xe1\x00\x55\x5e\x55\x01\x26\xeb\x11\x64\x32\x02\x23\x5a\xaf\xf3\xcb\x5d\x89\xef\x94\xcc\x89\xa2\x14\x8e\x21\x9f\x1c\x35\xac\xd1\xab\xef\x75\x81\x2c\x74\xf0\x4b\x62\x24\xf5\xda\x10\x3d\x8d\x5f\x37\x5f\xba\x43\xe1\x8d\xc8\x27\x4d\x5d\x43\xb6\x08\xeb\x56\x3a\x59\x53\x19\xb2\xdd\xe8\x23\x8f\x91\xd5\xbf\x68\xb8\x17\x84\x09\x2a\xf5\x5d\x01\xff\xf5\x58\xc8\x93\x8b\xbe\x84\x5b\x16\xca\xb9\x45\xba\x69\x8f\x8c\x31\xd0\x1d\xea\xc8\x55\x79\x72\xa4\x97\x8c\x31\x7b\x42\x5b\xa7\x37\x12\xd6\x3c\x02\xc7\xd1\x03\x4e\x41\xa1\x9c\x25\xe3\x85\x4d\xc8\xdf\x1f\x08\x41\x01\x6f\x3e\x51\x19\xd4\xe4\xe5\x2d\x08\x21\x0b\xbd\x68\x54\xa0\x28\xaf\x56\xc1\x49\xae\xfb\xfe\xc3\x68\x74\x33\x89\xda\xfd\xb4\xf9\x43\xcc\xc0\xa4\xff\xa5\x6d\xa6\x6e\x75\xa0\x00\xb7\xa0\x55\x40\x9e\xb9\x25\x8d\xeb\x35\x9f\xd6\xe3\x24\x3c\xc4\xa3\xcd\xae\x71\x04\x73\x28\x84\x61\x6e\x87\x8e\x55\xe8\xae\xc4\x30\xa1\xc0\xa6\x4e\xc7\xb7\x06\x62\x88\xea\xe3\x14\x07\xdd\xb3\xeb\x83\x06\x51\xd3\xc1\x6e\x7e\xfd\x27\xf3\xb6\xfc\x94\x04\x89\x85\x6b\xe8\xbe\x52\x77\x5a\xde\xed\xd3\x44\x67\x69\x4e\x19\x13\x4a\x28\x70\x71\x2f\xdc\x5c\x69\x5d\xc9\x47\xbd\xaa\xd2\x06\xfa\xba\xa9\x50\x0a\x71\x0e\x86\x19\x74\x90\xd8\x3d\x91\xf1\xc2\x23\xc9\xb5\xcd\xc3\xb3\xb9\x89\xc3\x1a\x26\x9b\xa5\x0b\xec\xff\xd6\x50\x53\x47\x88\xd2\x50\x43\x39\x0f\xf1\xf4\xad\xe9\xb3\x6b\x1a\xdf\xa2\xbc\x7b\xf6\x83\xb7\xeb\xff\xcb\x3f\x83\x67\xb3\xab\xc9\xe9\xf9\xef\xc8\xfe\xf5\x4d\xfe\xdf\x9f\x5f\x9c\xb7\xf8\xbf\x5e\xbe\xf8\xc1\xff\xf5\x87\xfc\x2c\xc6\x13\xe0\x52\x94\x57\xb3\xe9\xd2\x52\x6f\x59\xe6\xdf\xf3\xc1\x99\x3c\x95\x17\x17\x72\x5a\x3c\x90\x89\x7d\x76\xf6\x52\x88\x9b\x79\x3c\xbc\x7e\x37\x89\x11\xde\x7c\x57\x40\x2c\xd5\xf1\x7f\xca\xab\x22\xaf\x5d\x0c\x6b\x76\x35\xe9\x23\xc6\xb8\x90\x55\x9d\x6e\xf7\xe6\x64\x77\x15\x44\xac\x35\xc0\x14\x40\xeb\xa2\xd8\x01\xe9\xcf\x83\xb9\x74\x01\x28\x06\x74\xa0\x15\x64\xa2\x98\xa2\x1e\xaf\xe4\xbc\xb6\x14\x24\xc6\x26\x2e\x4a\x14\x68\x52\x6b\x73\xde\xa5\x6b\x81\xd8\x5e\xa0\xf3\x34\xfe\x03\xb9\x5d\x94\xc6\x46\x9c\x26\x4b\x39\xaa\x5c\x16\xa6\xed\x9b\x52\x6d\xf5\x23\x61\x4b\xd0\x80\x36\xef\x41\xf1\xea\x15\xf8\xe0\x25\xf9\xdc\xe9\xd6\x7c\x19\xed\x40\x73\x7c\x12\x05\x86\x27\x4a\x57\x11\x02\x7c\x76\x35\x41\x19\xd1\x20\x00\x93\xe0\x93\xc9\xaa\xdc\x57\xc6\xbb\xaa\xea\x7d\x02\x30\xab\xad\x2f\x7c\xe7\x2b\xb5\x26\x82\xe5\x4d\x2b\x09\x94\x29\x68\x48\x1c\x9c\x74\x59\x91\x25\xa1\x9c\x1a\x7a\x7c\xf0\x32\xdf\xb4\x52\xf9\x41\x34\x08\x99\x40\x79\x0d\xca\x0f\x56\xfb\x3c\xc9\x4c\x43\x40\x4d\x0f\x82\x9a\x41\x2b\xd0\x37\x31\xaf\x42\xa6\x9e\xfc\x20\x7c\x79\x86\x16\x73\x72\x5e\x13\xfb\xac\xb9\x9b\x1a\x2f\x45\x55\x4f\x28\x32\x42\x3c\xbb\xc0\x81\x01\xb5\x34\xfb\xd9\xca\xc3\xc0\xb8\xca\x12\x0a\xe8\xb2\xa1\xe2\xd8\x9b\xea\xc3\xce\x5c\x84\xc2\x09\x75\x01\x8b\x1a\x32\x64\x09\xd1\x83\x45\x6a\xb9\xa1\xd1\xc5\xad\x58\x90\x0a\xea\x54\x9d\x30\xba\xaf\xed\x2c\xa5\x3c\xc5\xfe\x80\xd2\x3f\xfd\x02\x6a\xc0\xfd\x5f\x78\xb4\xcf\xf4\x1b\x12\x18\x44\x9d\x3c\xfe\x5a\xc0\x8e\x2c\x7a\xcc\x7e\x8d\x5b\x68\xaa\xb6\x41\xcb\x4c\x53\x82\x66\x23\x10\x4d\x55\xb2\xd2\x58\x39\xbb\x07\xf9\x0b\x95\x27\xc2\x0d\x04\x0e\xbb\xf9\x90\x8d\x6a\x60\x05\x41\x88\xf3\xb2\x2c\xd4\x03\x21\x7a\x4d\xa5\xc5\x66\x2b\x42\x86\xa4\xb0\x4d\x9e\xfe\xa4\xaa\x84\xbf\x64\x9a\x6a\x5e\x4e\xc3\xac\xd7\x94\x61\x6b\x4e\x88\xb7\x64\x60\xec\x2b\x47\x89\x9c\x80\xa1\x69\xfc\x36\x30\x6b\x23\x91\xe8\x4c\x03\xf5\x01\xb1\x27\x39\x96\xa0\xff\xe7\xff\xfa\xbf\x79\xb3\x4a\x2c\xc2\x44\xf9\x90\xd3\x53\x16\x4f\xc5\xce\xd9\x0e\x34\x25\x2e\xad\x18\xf1\x8a\x84\xe6\xa1\x00\x94\x0a\x36\x10\x37\x68\x8e\x27\x76\x1a\x82\x81\x11\x40\x2b\x94\xeb\x47\xa9\xf3\x87\xb4\x2c\x72\x1e\x6c\xa6\xa9\x69\xf6\x18\xc2\x70\x25\xf0\x34\xa4\xb9\x36\xff\x22\xdd\x93\x2d\xc0\xc0\xb8\x62\x03\x6c\x5d\x08\xc1\x05\x94\x2e\x48\x49\xc3\x10\x29\x17\xb4\x0c\xda\x34\x10\x02\x54\xaf\x16\x90\x19\xfd\xdf\x3d\x0e\x39\x21\x6e\x1c\x16\x27\xad\xa4\x5f\x05\x6a\x0e\x03\xa8\x8d\x35\xc7\x35\x29\xa9\xb0\x92\x1b\xf1\xb1\xac\x6a\x95\xe6\x24\xa6\x56\xec\x0e\x8c\xd8\x08\x5e\x1e\x91\x16\x1e\x9e\x7a\x87\x88\x15\xaa\x35\x3c\x10\xce\x1d\xa7\x3f\xe8\x1f\x3e\x58\x91\x59\xe9\x2c\x0b\x8f\x49\x47\x29\xd5\x28\x90\x6e\xbc\x36\x14\x77\x14\x5d\xb4\xee\x6f\x84\x38\xef\xcb\xa9\xa7\x1b\xdb\xd8\x78\x9c\x99\x41\xf6\x13\x8f\x34\xc1\xad\x1e\x88\x95\x59\x0d\xf7\x2e\x65\xc7\x88\xcd\x69\x3e\xb3\xd1\x37\x1c\x08\x71\xd1\xff\x86\xae\x6a\x57\xcf\xf8\x69\xf6\xec\x0e\xef\x8d\xd6\x89\x6d\x77\x51\x53\x28\x9a\xf8\xb5\x76\x07\x66\x9a\xaf\xbc\xa4\x5f\x13\x41\xeb\x12\x48\x99\x83\xe6\x03\xd4\x8f\x08\x8e\x38\x5c\x42\x83\x89\x59\x22\x56\x59\x95\xb5\xfe\x5a\x0b\x38\x39\x23\x79\xbf\xdf\xaa\xfc\xb4\xd4\x2a\x01\xc7\xe7\x5e\xab\x04\x78\x06\x2c\x9b\xbc\x07\x73\x91\x5b\xb5\xbe\x4f\x73\xed\x3e\xbe\xd5\xb5\x32\xe7\xb0\xd8\xa4\x3a\x4b\x2a\x2b\xba\xac\xbf\xc2\x6e\x67\xf2\xfb\x34\xc3\xe3\xd0\x5d\x9e\xc6\x3b\xa6\xef\x50\x9b\xb5\xaa\x52\xa0\xae\xd0\x8f\x2e\x10\x6e\x0e\xd7\x81\x10\xcf\xfb\x72\x5a\xb4\xa5\x29\x8f\x4e\x08\xe3\x0c\xdb\x67\xfb\x49\xd5\x8f\x44\xc7\x79\x64\x41\xba\x0c\xf9\xeb\xc2\xc7\xa5\x95\x5f\x39\x65\xd6\x71\xeb\x5c\xc5\x58\xb2\xef\xf3\x79\x15\x12\x10\x56\xe0\xb8\x6e\x05\xb5\xfa\x36\xa4\x25\x5a\x1b\x06\x99\x7b\xec\x55\xbe\xd5\xf9\x9e\x2e\x1f\xcb\xdd\x03\x7f\x48\x34\x5e\x70\x10\xda\x85\x21\x8d\x3c\xda\x18\xe6\xe8\xb7\xe9\xd6\x94\xab\xb0\xf1\x42\x35\xbe\xad\x35\x9c\x5e\xf4\x2d\xe7\xff\x49\xd5\x3f\x26\x80\xc9\x95\x44\x78\x88\x7a\x1f\x0c\xcf\xde\x20\x70\xcf\xcd\x20\x7d\x80\xc8\xd7\x0c\x50\xc9\x83\x2e\xeb\x94\xea\x63\x9a\xb3\xcc\xc4\x8c\x70\x96\xaf\xbf\xe4\xc5\x63\xa6\x93\x3b\xc2\x91\x7a\x1c\x75\x4f\x35\x98\xe3\xc4\xb6\xc5\x82\xa8\x83\x08\x22\xf0\xc4\xa4\x0f\x84\x78\x89\xa3\xd2\x98\x20\x7b\xee\x41\x02\x8e\xff\x2b\xea\xba\xec\x22\x16\x68\x0f\xae\x66\x56\xfa\x77\xbb\x98\x43\x85\x36\x01\x11\x7c\x3c\x34\xb6\x3c\x23\x6b\x69\xae\x93\x29\xd2\x96\x8a\x40\x95\x14\x65\xce\x2b\x99\xef\x33\x24\xa2\x7b\x28\xd2\x84\xe0\xec\x36\xf7\x4f\x27\x8c\xcb\xc2\x92\x51\xbb\xd5\xe6\xaa\xb4\xcc\xf0\x73\x24\xc8\x05\xb7\xa5\x93\x14\x9f\x04\x28\x1d\x52\x8a\x30\x41\x9f\x7d\x40\x96\x05\x5f\x09\xc7\x7d\xef\xc1\xac\x3a\x58\xdd\x89\xe1\xfc\x6f\x52\xa6\x04\xf4\x58\x03\x64\x25\x7d\x85\xaa\x88\xb4\xa8\x22\x01\x42\x55\xd7\xc3\xf9\x9f\x23\x87\xb5\x82\x8f\x1c\x23\xc6\x6f\x29\x73\x5a\xb8\x91\x60\x4c\x11\x0c\x60\x64\x01\x42\xf6\xb9\x1e\x49\xbc\x1b\x01\xf3\x85\xf7\xf1\x34\x9e\xfb\xec\xf8\xe2\xfb\x14\x2b\xf9\x15\x01\xe9\xfc\x70\x2a\x87\x23\x26\x7c\xb6\x1c\xb9\x02\xc8\xe6\x43\xb4\x1b\x23\x97\xae\xe6\xb3\xeb\xa8\x25\x71\x69\x1e\xc6\xc4\xca\xcb\x19\xfc\x8e\x17\x84\xb0\x0b\x62\x36\x87\x6f\x5b\x90\x1a\x48\xa3\x01\xd0\xaf\xb5\x78\xfe\x31\xe3\x54\x83\x67\x89\xde\x95\x7a\xad\x6a\x9d\xfc\x75\xf2\xfe\x66\x72\xfa\x7c\x70\xf6\x7f\xfc\x7d\x83\x41\x4f\xc7\x7f\xce\x5f\xbd\x38\xfb\xb9\x11\xff\x79\x79\x7e\xf1\x43\xff\xf1\x0f\xf9\x79\x3f\xbd\x95\x93\x78\xb1\x88\xe7\xbc\xcb\x65\x48\x13\xee\x62\x41\xcf\x41\x03\xea\x4f\xfb\x5c\xcb\x8b\xb3\xb3\x9f\x85\x67\x6d\x9c\x8c\xfa\xf0\x3b\x79\x65\x7c\x02\x6b\xfb\x78\xfa\x4f\x28\x89\xf7\x2f\xf7\x75\xbd\xab\xde\x3c\x7b\xb6\xa9\x36\x10\x1c\xfe\x57\x21\xe2\x07\x5d\x1e\x8c\x19\x98\x56\xa1\xfa\x3f\x58\x9f\x81\x5c\x3a\xa8\xef\xaf\x54\x9d\x6e\x03\xeb\xde\xdd\x30\x82\xbd\x69\x2c\xea\xb4\xfe\x99\x23\x48\x83\x18\x0c\x94\x07\xc2\xcd\xf4\x10\x9a\x6e\x30\x1a\xba\xaa\x74\x29\xad\xae\x7b\xa0\x89\xe5\x57\x92\x56\x0e\x53\xd5\x44\x0e\x15\x1b\xfb\xe4\xe7\xfe\xb3\xbb\x1f\x1a\x61\x41\x18\x95\x02\xb1\xad\xe9\xa5\x21\xdd\xf5\x6f\xb9\x7e\x81\xe8\x06\xe1\x55\x67\x03\x39\x74\x9f\xf5\x08\xbf\x2d\x8b\x88\x10\xc3\x0a\x4d\x1e\xe3\xc3\xa5\x79\x24\x7b\x7e\x90\xdf\xf7\x3b\x3b\x9b\x1d\x0e\x89\x68\xb6\x9e\xcd\x99\x1e\x74\xf1\x66\xf2\xcd\xe7\x85\xc3\xe0\xd1\x31\x73\x73\x7b\x48\x24\xb1\x2a\x55\x79\x08\xbc\x62\xb9\x2e\x1e\x80\xd3\x0e\xe2\x73\x2d\x49\x7c\xdb\x24\x47\x91\x2c\x54\x2e\x87\x98\x4c\x65\x98\xbe\x92\xa3\x62\xbb\x02\xea\x5d\x2e\x10\x66\x2a\x5e\x6f\x58\x71\xdc\x72\xd9\xf3\xbe\xdd\x03\xd6\x89\xfc\xe0\xd1\x00\x63\x26\x75\xcf\x69\x5c\xe4\x46\xdd\xa8\xb5\x17\x03\x23\xe3\x9c\xfa\x83\x4b\x13\x2d\xe2\x16\x6b\x9f\x2d\x38\xab\xdd\x00\x30\x89\x3b\xb8\xd2\xd5\x7e\xb5\xce\x54\x05\x14\xa0\x4a\xc2\x3f\x5d\xe3\x0f\xfe\xd7\x40\xcb\x08\x93\xd6\x8a\xf8\x3a\x37\x64\xe4\x75\x36\x53\x84\x5f\xf7\x07\x41\xf6\x82\x01\xc3\x51\x20\xce\x42\xac\x77\x81\x97\xaf\xe1\x43\x96\x4d\x32\xff\x42\xef\xf2\x06\x50\xd8\x6c\xb2\xed\xdc\x92\x51\x3f\xeb\x7d\xa6\xca\xe6\x8e\xe4\xce\xc0\xf7\x1c\x9a\x81\xdb\x23\x3e\x31\x6f\x10\x44\x81\x4c\xbb\x40\x1d\x0d\xa5\xb1\x60\x51\x4e\xd2\xfc\x8b\x17\x55\xf2\xfa\x65\xde\xdc\xbb\x4e\xf3\x74\x0b\x48\x0d\x1f\xe6\xb0\x80\xd8\x5d\x0f\x33\xd4\x8d\xe5\xe2\xc8\x5b\x83\xef\x08\xfc\x8e\x4d\xbe\x06\x5f\x8a\x90\xac\xc5\x12\x37\xf9\x92\x70\xe6\x0b\x3b\x2c\x2f\x61\xa7\x5e\x84\x6f\x34\x0b\x2d\xf2\x19\x1d\x53\xe3\xfc\x15\x99\x27\x5a\x17\x2c\x1c\x6f\xc0\x31\x50\x02\x8b\x8c\x17\x95\x3f\x1c\xcd\xd1\x08\x47\xc1\xdf\x37\xa3\x22\xf9\xe6\x78\x14\x58\xf8\x0e\xbd\xa2\xda\xac\x66\x47\x9b\xcd\x0b\x83\xd1\x18\x44\x85\x40\x4e\x0d\xa0\x3f\x41\xf1\xae\x4a\xe6\x5a\x33\x73\x9a\xc7\x40\xd7\x1e\x69\x57\xf2\x1e\xbc\x66\xb5\xaf\x85\x9b\x02\x88\xe8\x81\xe6\x29\x2d\x30\x2f\x52\x14\x3c\xcd\xea\x28\xc4\x4c\xe7\xe6\x97\x73\x87\x87\xda\xcd\x64\x20\x6c\xf1\xde\xba\xc8\x1f\xf4\xa1\x79\x60\xa1\xd3\x54\x31\x30\xfb\x39\x74\xf5\x45\x27\x19\x66\xb1\xaf\x05\x92\x1c\x5b\x90\x59\x75\xfc\xb5\x52\xca\x8b\x01\x62\x8c\xa0\x52\xb6\x15\x2d\x1a\x08\x31\xde\xc8\x83\x69\x1d\x56\x84\xa9\x80\x77\xc2\x9e\x4d\x50\xaf\x98\xe6\xe6\x93\x65\xc8\x13\x13\x49\x25\x37\x6a\x8d\xd3\xe2\x1f\xc9\x9b\x7d\xbe\xe6\xa3\x95\x89\x50\x57\xda\x16\x39\x23\x3c\x2e\x58\x4b\x70\x70\x02\xbf\x1e\x04\xdf\xe8\xa1\xf2\xc4\x23\xb6\x07\x0e\x7d\xa9\xca\x3b\xb8\xce\xe5\x4e\x01\xb1\xec\xe3\x3d\xc1\x04\xed\x77\x10\x79\x5a\x7c\xd1\x49\x9f\xea\x4d\x0f\xed\x19\x70\xfd\xb4\x5e\x32\x1d\x33\x6f\x84\x50\xfd\x2e\x0c\x7f\x23\x1c\x86\x0f\xfd\xa2\xa5\x92\x77\x45\x91\xc8\x8d\x02\xfe\x0e\x48\x38\x61\x79\x54\xb5\x2f\xb5\xc0\x8d\x1a\x10\x17\x35\xba\x6e\x53\xee\x30\x3c\x44\x36\xd3\x18\xc0\x28\x1c\x96\xaa\x4e\xb3\x4c\x62\x4a\x8c\xd3\x56\x44\xa0\x58\x39\x72\x66\xce\xde\xa7\x75\x65\xf1\x1e\x08\x95\xad\x80\x18\x20\xcd\xef\x36\xfb\x2c\x92\x45\x29\xc4\xaa\xef\x81\x3a\x68\x11\x45\xac\x01\x9d\xdb\xe2\xcd\x23\x16\x48\x63\xb5\xfa\x40\x2c\xa6\xf0\x30\x43\x8e\xab\xf2\xf9\x40\xce\x30\xd4\x6a\x0e\x10\x63\x05\x92\xf9\x04\xab\x94\xe4\x1f\x71\xcf\xf2\x51\xff\x01\x62\x7e\xf2\x2a\xcd\x34\x67\xcf\xf0\x60\xb1\xa7\xc8\x96\xee\x5a\x7f\x60\xb7\xc0\x4d\xee\x88\xfd\xb6\xc1\xb3\x15\x45\x12\x21\xcc\x48\xc5\x87\x41\x5d\xb2\xbb\x8f\x1a\x3b\x18\x02\x5f\xfe\xfb\x69\xe4\x98\x87\x1b\x36\xca\xfa\xbe\x00\x22\x81\x60\xd1\x44\xcc\x90\x10\xb0\x8f\xd8\x76\xd1\xdd\x4f\x18\x1d\x51\x17\x32\xdf\x6f\x75\x09\xf1\xfc\x9d\x2a\xd5\x56\xd7\x40\xd4\x0e\x5b\xaa\xaa\xcb\x3d\x12\x16\x67\xea\x50\xec\x29\x33\x86\x5c\xab\xc0\xf5\x6e\x8e\xda\x2d\xb0\x48\xa9\x75\x59\x00\x3d\x6c\x96\xe6\x6e\x6d\x11\xab\xa7\xde\xee\x32\x30\x5d\x4f\x6a\x0d\xeb\x6d\xa3\x1f\x35\x5c\xd6\x1a\x48\x9d\x32\x9d\xdf\xd5\xf7\xfd\x08\x16\x7c\x52\xc8\x55\x51\xdf\x8b\x8e\x14\x98\xea\xcb\xf7\xe9\x83\xf6\xea\xb4\x29\x12\x8c\xbc\x36\x36\x78\x4c\x5f\xf5\xc7\xcf\x63\xf2\x82\x11\x17\x29\xd9\xa6\xa0\x10\x41\xc6\x64\xf8\x11\xcc\xb5\xa2\x88\x38\x66\x0a\xe9\x50\x6d\xd8\x7d\x03\x58\xda\xc3\xf5\xba\xd8\xee\xa0\x26\xa3\xf1\x6a\x52\x14\xf1\x5b\x46\xab\xbf\x15\xc1\xf6\x95\x54\xa5\x94\x2f\x06\xe1\xbd\x50\x75\x1d\xf5\xe1\x3d\xe4\xad\x13\x19\xae\x13\x5a\x1d\xb5\xfa\x02\xd2\x97\x28\x41\x11\x09\xcb\xc4\x93\x1d\xcc\xd0\x23\x21\x03\xc1\x05\xc3\x4a\x53\xd6\xf6\x0e\x6c\x06\x3b\x58\x14\xb0\xd7\x89\xb0\x5c\x94\x81\xb5\x0b\xd9\x64\x73\xfe\x69\x9b\x57\xa2\x1c\x96\x4c\xf4\x6a\x7f\x07\x1e\x53\x9b\x27\x0c\x30\x6e\x66\x59\x80\x85\x95\x14\x38\xcb\x7f\xfb\xda\x68\x9b\x3a\x7f\xe0\xea\x08\x5f\xfe\x2b\xd6\x87\xf0\xd6\xc7\xba\x0f\x00\xac\xe6\x02\x80\x76\x26\x69\xb5\xcb\xd4\xa1\xea\x20\x79\x49\xf6\x30\xee\xfa\xab\x5e\xef\x7d\x5b\x08\xc9\x91\x5a\xf4\x1b\x6c\x3d\xd9\x5e\x6f\x0b\xb4\x64\x2a\xcd\x8f\x04\x9c\xd9\xa3\xce\x32\xe4\xd8\xb7\xb1\x7d\x81\x62\xf2\x1e\x85\x86\xcf\xf2\xe1\xd9\x3e\xdf\xb9\x1b\xa4\x94\x49\x5f\x5e\x12\x5f\x6a\x7b\x05\x9c\xf5\xc9\x14\x81\xbf\x3c\x65\x61\x7f\x4b\xcf\x83\x98\x57\x9b\xb6\x76\xcb\x32\x45\x22\x09\xb8\x1a\xaa\x7d\x5a\xb3\xea\x7e\x44\x49\x41\x77\x62\xc3\xa4\x60\x98\x21\x0a\x06\xa3\xd4\xe8\xbe\x68\x2c\x15\x30\xee\x4b\xd3\x8a\x74\x8a\x44\xa4\x5a\xd3\xf2\x55\x7c\xd3\x9a\xd2\x0b\x40\xf2\xea\xbe\xd3\x74\x0b\x28\xdb\xc2\xdc\x11\x36\x3f\xef\x99\x7b\xaf\x9a\xb3\xb3\x41\x74\x2b\x99\x7a\x5d\xc3\x3a\x80\xdc\xe5\xad\xd9\x0f\x6e\x3c\x08\xb7\x92\xd1\xfa\xd9\xea\xf5\xbd\xca\xd3\x6a\x0b\xcf\x63\x77\xad\xed\x9f\x0d\x85\x7d\x82\xfb\x4a\x5a\xc1\xdc\xc3\x68\x9e\x18\x0b\xca\x18\x73\xaa\x96\xe5\x1e\x65\x9c\xba\xcd\x4b\xa1\xb2\x52\xab\xe4\x20\xa9\x10\x83\x7d\x12\x33\x07\x40\xcc\xb3\xdd\xed\x6b\x33\x0c\x60\x9a\xe3\xe4\x9d\xac\x48\xe8\x89\x0c\x20\x33\xa6\x3b\x5d\x66\x07\xd1\x98\x8d\x63\x9e\x23\x5f\xf6\xd6\xe3\x3d\x85\x03\xa0\x4e\x81\x82\x9f\xba\x2b\x5a\x6e\x91\xee\xcb\x1b\x02\x06\x8d\xf3\xaa\x56\x19\x51\xc8\x8c\x1d\xf1\x0d\x7a\xf2\xc0\x24\x42\x47\x23\x12\x08\x78\xee\xbc\xb6\x55\x79\xc2\x43\x1a\x51\x95\xa7\x63\xd0\x09\xfc\x82\xd6\x84\xe3\x40\xc0\x7b\x28\x5f\x4d\xe5\x46\x48\x56\xd9\x7c\x98\x31\x2c\x7c\xfe\xc6\x14\x9b\x8f\x55\x47\x70\xd8\xe8\x27\x16\x71\x78\x86\xf9\xee\x3d\xef\x10\x72\xf0\x71\x8f\xf0\x99\xd2\xf2\xf1\x9f\x9a\x98\x60\xa8\xe5\x09\x39\x26\x10\x43\x41\x1f\xeb\x45\x72\x86\x46\xf0\xb1\xa1\x27\x25\xf4\xe0\x2c\x7f\xf2\x9c\x51\x79\x22\x9e\x3e\x42\xa0\xfe\xa0\xd5\x8e\x73\x34\x85\xe0\x75\x3c\x7d\x4f\x36\xac\x41\x06\xf3\x3d\x1b\x5a\x7c\xc7\x86\xee\x33\x05\x82\x9d\x1f\xeb\xb8\x7a\xa6\x08\x72\xea\xf3\x0e\x27\x0f\xc2\xaa\x29\x81\x6c\x87\x2f\xf6\x17\xc6\x99\x64\x95\x26\x5a\xac\xf0\xff\xf1\x40\xad\xd2\xfc\x2e\x73\x0f\xb4\x72\x59\x0e\xdf\xf6\xd4\xcb\x80\x5d\xd1\x1b\x66\x32\x5a\x29\x9f\x77\xe4\x96\x8e\xb8\x64\xd1\x1a\xdf\x8a\x02\x4b\x3a\x11\xfc\xb2\xe3\xb6\x55\xc4\x5b\x91\x8c\xd7\x23\x06\x4a\x68\x05\xf0\xf3\x6d\x67\x3a\x0c\x01\xa8\xa9\x6c\x8d\x9d\x0b\xea\xed\x73\xfb\x14\x0b\xae\x38\x36\x42\x11\xf5\xcf\x07\xd7\x77\xb3\x64\xa2\xcd\xf2\x84\x39\xd5\xd9\x7c\xbc\xe4\xac\x43\xe8\xc2\x75\xa2\x6b\xde\x23\x3a\x19\x76\x19\x01\x76\x48\xe6\xaf\x90\x9b\x94\x2e\x5f\xbb\xd1\xcc\x9f\x5d\x4f\x05\xfb\x62\xc1\x00\xa1\x8d\xf0\x6a\x20\xe7\x58\xe3\xd4\x42\xac\x7c\x33\xca\x4e\x5e\xdf\xb1\x64\x02\x2e\x75\xc4\xd1\x73\x21\x15\xc7\x9b\x72\xfd\xc8\xe7\x8d\x0d\xa6\x7d\x3b\xaa\xdf\x01\xa9\x5f\x98\xa5\x17\x3c\xcd\xdc\x42\x62\xa5\x25\xea\xde\x40\x3a\xbd\xda\xa5\x65\x6a\xeb\x13\xf9\x56\x7b\xb0\x10\xb1\x3d\x96\xfe\x21\xd8\x01\x84\x84\x74\xad\x52\x20\x81\x21\x4d\x23\x61\x5e\xb1\x2b\x8b\x55\xa6\xb1\xd8\x7c\x5d\xe4\x6b\x5d\x42\xc0\x06\x2a\x89\xf9\xf0\x4c\x2b\xd2\xca\x57\xbe\x42\xbd\x99\x8f\xa6\x3a\xfd\x38\xbc\xff\x54\x65\xf6\x83\xb0\xa4\x06\x69\xed\x53\xc5\xa1\xba\xe4\x1a\xe5\x8e\xe8\x11\xed\x23\xfb\x9b\x49\x00\xd9\x23\x34\x94\xf1\x2e\x6d\x10\xb7\xe7\xa3\x4d\x8c\xc1\x65\x36\x26\x53\x21\xf0\x19\x5b\x6c\x3c\xf8\x55\x7d\x4c\x9c\x80\x90\x43\xd0\x1e\xb3\xb8\x6d\x15\x85\x6d\x29\xd4\x03\xb7\x9a\xe0\x7d\x92\xe2\xdb\xc7\x56\x55\x73\xe0\x04\x0e\x9c\xf4\x07\xce\x45\x6f\x60\x04\x41\xa5\x27\x18\xfd\x5f\x91\x35\xb1\x71\xaa\xfb\x82\xb9\x58\xbf\x37\x1b\x65\x99\x66\x31\xf2\xf3\xdd\x3d\x84\x18\x60\x7b\x6d\xc8\x27\xd7\xc6\xae\x2c\xbe\xa2\x54\x5d\xa2\xd7\xe6\x66\x20\x56\x6a\xb1\xd9\x43\x40\xe2\xe1\xd7\xee\x6e\xaa\x6c\x32\x4b\x83\x48\x0c\x05\xbc\xe3\xa7\x8a\x6b\x91\x2c\x10\x15\xa1\xdc\x6b\xbd\xab\xb9\xa8\xc5\x1f\x26\x4a\x18\x2a\xe4\x89\xa3\xda\x23\x34\x41\xcc\x8d\x7a\x40\xae\x22\x1a\x5f\xe8\x0d\x7f\xb3\xe1\x4b\xfd\x63\xa6\xfe\xe1\x67\xf0\xec\xeb\x6e\xf7\x3b\xd6\x7e\xfc\xd3\xb7\xeb\x3f\x5e\xbc\x7a\xd9\xaa\xff\x78\xf1\xe2\xe5\x8f\xfc\xff\x1f\xf1\xc3\x4c\x40\x57\x44\x05\x14\x7f\xad\x4b\xbd\xd5\xff\x9b\x9c\xa8\x95\xbc\xd9\x67\xd9\x8d\x2a\xcd\x56\xf6\x72\xfd\x6b\xc8\xf5\x5f\x40\xe2\x6e\x59\xee\xab\x5a\x43\x00\x41\x8c\xf3\x24\x55\xb9\xe2\xea\x67\xa0\x4d\x1a\xba\xca\x45\x8f\xc5\x7d\xee\x40\xa9\xac\x2a\xb4\x87\xdc\x3a\xa7\x8b\xcc\x6f\x18\xac\x59\x94\xdb\x8a\x82\xd3\x9e\xc0\x9e\x1f\x9a\x8a\x04\x94\x1c\x58\xec\x40\x57\xf1\x41\x1b\xdf\x0b\x86\xe8\x56\xd7\x88\xf3\x85\x86\x06\xcd\x42\x42\x58\x2f\x7d\x05\x3e\x40\xa9\xe1\xa2\xec\xc0\xc2\x92\x59\x86\x94\x24\x59\x5a\xe1\xe1\x45\x94\x99\xf4\x15\xcb\xd6\xe1\x3d\x37\xe2\x48\x0b\x7e\xc3\x6f\x60\x9e\xa0\x5e\x8e\x23\x11\x77\x4a\xbf\x7e\x78\xe6\x2d\xa0\x85\xbb\xba\x90\xe6\xfe\x38\x72\x17\x7c\x11\x9b\xe3\xbd\x38\xda\x28\xf9\x5d\x8d\xe2\x3e\x87\x05\x0e\x64\xa6\x91\x78\x00\xc5\xc2\x3d\xe5\x1b\x6b\xd4\xfa\xfd\x78\x0b\x90\xdb\x61\x7e\x08\x1f\xe6\x70\xc5\x68\x71\x77\xf4\x3f\x60\xd4\x0f\x56\x82\xf0\xc0\x9b\xe6\x89\x6f\x00\x75\x80\x92\x7d\xc9\x7e\x5d\xbb\x32\x72\x5b\x68\x40\x65\x4a\xee\xa2\x6d\xaf\x78\xbb\x7f\xc4\x44\xad\xb0\x2e\x93\xb9\x47\x7c\x17\x7d\x87\x14\x44\x0f\x69\x95\xda\xda\xc9\xc7\xc7\xc7\x81\xc6\x6f\x0f\x52\x7c\xf0\x40\x27\xfb\x67\x3d\x21\x86\x59\xad\xcb\x5c\x61\x6c\x98\xd6\x8b\x6b\x3e\x5c\x94\x21\xc3\x04\xd8\xe3\xdc\x6c\x44\x94\xa3\xe2\x2b\x98\xf6\xc6\x68\x00\xcf\xaa\xbe\x4f\xcb\xe4\x14\x2b\x73\xc3\xe7\x19\x2b\xa7\xdc\x82\x16\x04\x3e\x35\x44\xe3\xca\x5e\xd8\xf5\xb4\xaa\x0f\x3d\x58\x1a\x1d\x7f\x08\xce\x94\x1e\xde\xfe\xa2\x81\xc3\xf5\xe0\xb7\x04\xc9\xe5\x79\xa8\x9a\x1a\xe9\xa9\x37\x23\x9c\x28\x3d\x4a\x21\x0a\xdf\xe9\x3a\x98\xae\x3a\x3f\x1f\x09\x9a\x19\x2a\x6e\xfd\xd6\xdc\x20\x1a\xf7\xe6\x3b\x5a\xca\x28\x5a\x73\xce\x75\x0e\x9e\x19\x56\x91\x17\xa8\xb2\xda\x3d\xbc\xfe\xf4\xa6\x58\xd5\xe3\xb8\x55\x8f\x0d\x01\x67\x6f\xba\x06\xa1\x63\xfd\xd2\x46\x04\x6e\x80\x52\xab\xaa\xda\x97\xa8\x8c\x07\x76\x1a\xae\x2b\x77\x24\xda\x6d\x6b\x0d\xe3\x34\xdf\x94\x69\x4e\x78\xe8\x9d\x82\x30\x55\x20\xa9\xef\xab\x87\x0b\x8c\xe5\xd5\x96\xfb\x80\x0c\x3c\x92\x7c\x03\xba\xef\xce\x56\xf2\xe1\x83\x60\x9c\x8c\x69\xfa\x04\x95\xa0\x38\xbe\x24\x88\xac\xe0\x27\x57\x25\xf2\x5d\x10\x5b\x8b\xff\x0e\xe7\xd2\x73\xf3\xb9\x14\x31\xd0\x3a\x6f\xb5\xb6\x0c\x28\x2a\xe9\x2a\x8d\xe5\xed\xf4\x32\x9e\x2f\x96\xc3\xe9\xe5\x42\x2e\x3f\x0c\x9f\xc6\x27\xc3\xcd\xfb\xe9\xc3\x78\xf4\x41\x4e\x67\x1e\xb0\x58\x0c\x17\x72\x39\x93\xa3\xe1\x0d\x82\x5c\xc7\x88\xd4\x65\x7a\x45\x69\x1e\x77\x3d\xbc\x8c\x07\x72\x3c\xbd\x1c\x0f\xa7\x43\x79\x3b\x1d\x7f\x8c\xe7\x8b\xf1\xf2\xb3\x7c\x3f\xfe\x88\xcc\x94\xfe\xf3\x8e\x33\x56\xb6\x5b\x79\x35\x8f\x81\x12\xb0\x89\x50\x5e\x7e\x18\xcf\x2f\xc5\xcd\x70\xbe\xfc\xcc\x10\x65\x1f\xb5\x6c\xa1\xc4\x37\xf3\xd9\xcd\x7c\x1c\x2f\x87\xf3\xcf\x08\x57\x5e\x74\xb6\x13\xda\x23\x82\x76\x1e\x69\x0b\xa0\x78\x7b\xef\x6e\xdf\x2f\x7a\x91\xec\x7d\x1c\xcf\x6f\x17\x31\xfc\x73\x39\x9f\xfd\x69\x38\x95\x1f\x66\x73\xf8\x85\xe8\x2d\xe7\xc3\x1b\x79\x39\x9b\xcd\xe1\xcf\x9f\x66\xf3\x6b\xf3\x0f\xdb\xb2\x0f\xc3\xf9\xf5\xd5\xed\x44\x8e\x66\x66\xec\xec\x9c\x0d\x17\x8b\xdb\x6b\x78\x7b\x2c\xe3\xe9\x72\x3c\x8f\xc5\x7c\xbc\xf8\xb3\xc4\x59\x00\xaa\xc3\x78\x7e\x35\x9b\x5f\x0f\x89\xca\xd2\xb6\x70\x38\xbd\x7c\x66\x26\x66\xb1\x98\x8d\xc6\xc3\x65\x6c\x46\x79\x19\xcf\xc7\xc3\xc9\x22\x02\xa0\xf7\x72\x26\x9a\xdf\x37\xbf\xfe\x38\x9c\x8c\x2f\xc7\x08\x47\x1f\x4f\xe1\x4f\x30\x17\x08\xc3\x34\xcf\xb9\x05\xf4\xf3\xef\x8b\x4f\x1e\x3c\x7b\x57\x94\x6b\xbd\xff\xfa\xdf\x57\xff\x7d\x7e\x71\xf1\xbc\x61\xff\x3f\xbf\x78\x7e\xf1\xc3\xfe\xff\x23\x7e\x9c\x5d\x7f\xfe\xfa\xf5\x73\x79\x65\x4e\xfb\xb4\x92\xb4\x28\x5c\x64\x99\x2a\x8e\xa1\x56\x8f\x0b\xf2\xc8\x96\xf3\xe0\xb9\x41\x4a\x18\xaa\xac\xd8\x28\xdc\xa9\xf5\x17\x75\xa7\x45\x5b\x9f\x9c\x11\x80\xf0\x77\xd6\x0c\xa8\x5a\x71\x5b\x7c\xde\x1b\x21\xe6\xf1\xf0\xf2\x3a\x16\x82\xb3\x38\x70\xf2\x3f\x9b\x65\xc9\x65\xaa\x40\x43\xb4\xfd\x97\x6b\xf5\x35\x7d\xe2\xaf\xe9\xba\x2c\x9e\xfa\x73\xfe\xd4\x97\xf7\x59\x9d\xee\x32\x3d\x2c\xcb\xe2\xb1\x12\x22\xc1\x4f\x3e\xb3\xdf\xe0\x5f\x04\x6d\xb0\xbf\x0c\x5e\xed\x7e\x9b\x77\x7c\xb4\xf1\xa2\x7d\xa5\xcb\x53\xa0\x18\xa9\xf8\x65\x7f\xbd\x2e\x12\xfd\xd7\xe4\xaf\xf1\x76\x97\x15\x69\xf7\x47\xe6\x5a\x25\x7f\xbd\xd6\x42\xcc\x8c\x55\xbf\x2f\x21\x79\x6c\x6b\xea\xd3\x4a\xde\xed\x15\xd4\x94\xe9\x84\x85\x71\x34\x79\x31\xa4\x16\x50\xd7\x7a\xbb\x43\xdd\xac\xca\x4c\x15\xa6\x7b\x38\x84\x39\x90\x23\xa4\x43\x91\x7a\xab\xd2\x8c\xc3\x9c\x6f\x84\xd8\xd0\xd2\x4a\x8c\xe5\x87\xcb\x4b\xaa\x5a\xee\xd7\x59\xb1\x7f\x30\x3e\x15\xfc\x41\xff\x03\xc7\x62\xfe\x3b\x7e\x06\xcf\x86\x49\xb1\xd2\xa7\x17\x67\x67\xaf\x7e\xaf\x2b\xe0\x1b\xe7\xff\xf3\xe7\xaf\xce\x5a\xe7\xff\xc5\xab\x1f\xe7\xff\x1f\xf1\x03\xb3\x4f\x58\xd8\xca\x83\xe7\xe9\xe4\xa4\xec\x73\xf2\x14\x10\x16\x1c\xbd\x1d\x5a\x86\x41\x7b\x77\x50\x48\xe8\x95\x38\xfe\xb4\x63\xa1\xa0\x1b\xf4\xb7\x4a\xad\x08\x71\xf2\xf4\x2b\xd7\xaa\xd4\x9b\xbd\x71\x4b\x57\x7a\x53\x40\x3d\x29\xa5\x0d\x84\xe7\x97\x0c\xc4\x13\x2d\x61\x19\xe3\xba\x40\x34\x93\x53\x28\x8e\x7c\x51\xe3\x50\xc6\x58\xe4\xc5\x29\xd7\xb9\x87\x72\xc7\x69\x59\xea\x87\xa2\xc5\x43\xc7\x51\x7e\x40\x96\x58\x51\x88\x5d\xa9\x77\xaa\xd4\x2d\xce\x0d\x50\xf9\xdb\x31\x39\x2c\x61\x86\xbc\xdf\x10\xdc\x33\x6a\x96\xc3\x00\x7b\x9d\xef\x90\x21\x5d\xe0\xfa\xbe\x4d\xb0\xe1\x82\x6b\xc6\x6d\x69\xe2\x29\xd9\x91\x06\xe6\x0b\x4f\x43\x89\xd0\x0b\x10\x12\xa0\xac\x1c\xfa\xff\xc7\xc7\xb7\x27\xad\x1e\xc5\x93\x0e\xbe\x38\xe6\xe0\x87\x2e\xe6\xb7\xfc\x5b\xca\x7e\x03\xef\x25\xa2\x1d\x12\xbd\xcd\xc1\x3e\xb9\x2f\xb2\x44\xde\xab\x72\x9b\xb1\x24\x7c\xa2\x37\x3a\x4f\xe4\xf1\xc6\x0b\x52\x2f\x4b\xa4\xba\x53\x69\x5e\x21\x75\x73\x56\x54\x00\xc4\xdc\x2a\x33\xff\xe4\x4f\x16\x25\xc8\x6d\xef\xd3\x06\xa5\x4a\x5d\x17\x65\xae\x0f\x3f\x55\x62\xa3\x5d\x32\x3c\xad\x08\x58\x54\xed\x33\x2a\x73\x3e\x58\xad\x94\x32\x88\x76\xd9\x84\x6a\xb0\xa0\x97\x1f\xc6\x0b\xb9\x98\xdd\xce\x47\x31\xf8\x2e\x9d\xbe\xa4\xf1\x2b\x7a\x9f\xc6\xcb\x0f\x72\x38\x99\xc8\xab\xe1\xed\x64\xe9\x57\xc0\x0e\xa7\x9f\xe5\x32\x1e\x7d\x98\x8e\x47\xc3\x89\x58\xdc\xde\xdc\x50\xd1\xa5\xf9\x03\x15\xc2\xc6\x97\xd2\x95\xc2\x06\x3c\xfa\x9e\xf8\x40\xa3\x2c\x56\x2c\x67\x11\xf8\x48\xed\xaf\x75\xd4\xc7\x42\x2b\x8f\x95\xc8\x0a\x5b\x22\x3b\x8f\xa5\x2d\xf6\xbd\x1c\xc8\xe1\x64\x81\x2f\x41\xa7\xd0\xf9\x8c\xe0\x40\x4d\x67\xd3\xd3\x40\xb2\x00\xd5\x0f\xc4\x6c\x2e\xff\xfd\x76\x1c\x2f\x65\x3c\xfd\xd3\xec\xb3\xf9\x4b\x57\xdd\xec\xf5\x70\x34\x9f\x5d\xc7\x97\xe3\x21\xf4\x7d\xb9\x90\x66\x6c\x26\xe3\x78\xbe\xe8\x28\x9f\x75\x95\xaf\x5d\x35\xb0\x5c\x22\xeb\x98\xf8\xdb\x75\xb1\x82\x4b\x6f\x4f\x8e\x8f\xa9\x34\x63\x7a\x33\x9f\x8d\x6e\xe7\xd6\xfb\x5e\xdc\xbe\x5b\x2c\xc7\xcb\xdb\x65\x2c\xdf\xcf\x66\x97\x0b\x39\x9b\x8b\x45\x3c\xff\x38\x1e\xc5\x8b\xb7\x72\x32\x5b\xc0\x70\xdf\x2e\xe2\x48\x5e\x0e\x97\x43\x78\xf1\xcd\x7c\x76\x35\x5e\x2e\xde\x9a\x7f\xbf\x33\x1e\xa5\x19\xf5\xf1\x74\x19\xcf\xe7\xb7\x37\xc6\xe1\xec\xcb\x0f\xb3\x4f\xf1\xc7\x78\x2e\x46\xc3\x5b\x33\xfd\x66\x7a\x48\x92\x80\xc4\x08\x66\x57\x7e\x6d\xb0\x57\xcb\x6b\xcb\x77\xe5\x62\x39\x1f\x8f\x96\xde\xc7\x40\x33\xc2\x2c\x2f\xd7\x47\x39\x8d\xdf\x4f\xc6\xef\x51\x0c\xc2\xab\xf4\xed\xdb\x4a\xdf\xf1\x94\xca\xab\x3f\x7b\xe5\xbe\xc2\xca\x13\x84\x3b\xc0\xc9\x14\x1c\x17\x25\x90\xa1\x28\xc1\x0f\xe3\xb2\xf9\x33\x78\xf6\xef\xf7\xfb\x2c\xfb\x5d\x33\x80\xdf\xb0\xff\x2e\x5e\x3c\x6f\xfa\xff\x17\x3f\x9f\xff\xa8\xff\xfd\x43\x7e\x60\xf6\xa3\x46\x7a\xef\xfc\xf5\xeb\xe7\xc6\x23\x78\x8e\x37\xfe\x94\x59\x7a\x17\xeb\x54\xe7\x94\x9e\x5b\xb2\x5a\xec\x01\x68\x4d\x54\xb9\xbe\x97\x23\x9d\xd7\x40\x03\x52\xa2\xa4\xba\x65\x6b\x4d\xe4\xc7\xb4\xda\xab\x8c\xd3\xf3\xc5\x46\xbe\xd7\xc5\x56\xd7\x65\xba\x96\x0b\xae\x6d\xa8\xe4\x89\x79\x1d\xfd\xe5\x40\x8f\xeb\xfb\x81\xdf\x62\x23\xaf\xd3\x3c\xd7\x55\x51\x2b\x21\xc0\xc5\x7c\x23\xff\xd3\xf4\xe1\xdf\xe0\x7f\x07\x45\x79\x47\xa5\xbd\x2e\xff\xc1\x89\x1c\xe8\x2b\xde\xbd\x1d\xef\x19\xd0\xdf\x53\x0f\xab\x8d\x8a\x06\x79\xe1\x04\x0d\xdc\x87\x80\xfe\xc8\xbe\x84\x99\x32\x56\x9a\x98\x8f\x74\x02\x7a\xe2\xf7\x75\xbd\xc3\x57\x3e\x3e\x3e\x0e\x6c\x1b\x07\x62\x5c\xf3\xe7\x29\xb4\x02\x48\x6c\x8f\xf6\x2d\x6a\xf3\xbe\x79\x68\xe9\x23\x8c\x45\x58\xac\x36\xec\x14\x15\xa5\xe4\x1f\x69\x88\x40\x7a\x83\x94\xc7\x37\x54\x6a\x73\x31\x90\x43\x0f\xf4\x96\x56\xc8\x9c\x03\x35\x33\x44\x19\x12\x70\x80\x28\x20\xd0\xb1\x70\x37\x87\x25\x87\x41\x12\xb6\x72\xca\xef\xc4\x5b\x7c\xb0\x9d\x14\xfa\x92\xfd\x2c\xc0\x83\xdc\x18\x00\x22\xca\x7c\xc2\xac\x19\x5b\x0c\x68\x33\x88\x3e\xe1\x1c\x1a\x93\x24\x2c\x86\x19\x3f\x3c\xdb\x84\x78\x6e\xc1\x9d\x54\xfd\x46\xcb\xfe\xd0\x16\xdd\x26\x70\xdd\x5d\xfa\xc0\x78\x24\x5f\x35\x15\xc9\xad\x04\xd9\xe3\xfc\x89\x20\x19\x8d\xd9\x4b\x85\xcc\xd5\xe1\x5f\xac\xd8\x0d\xc8\x67\x99\x7d\x22\x5a\x75\x16\x28\x72\x0e\xf2\xce\x81\xde\x48\x13\x4d\xeb\xc6\x39\x7a\x62\x38\x44\x7b\x38\x3a\x00\xad\xd4\x67\x9b\x2e\xef\x4a\x53\x8b\xe6\xea\x6e\x6c\x0c\x21\x5e\x32\x1b\x7f\x1a\x32\x4b\xdb\xd6\xd9\xd0\x92\x69\xfa\x26\xad\x73\x63\x96\x9b\xc3\x82\xda\x85\x48\x45\x5b\x8f\x5c\x15\x99\xd9\x17\x3d\x55\xc9\xb4\xea\x0d\xe4\xbb\xfd\x9d\xf1\xa5\x90\xe2\xb1\x94\x9b\xf4\xab\xb6\x64\xb4\x80\xbb\xab\x0b\x3c\x0a\xfe\xba\xda\xdf\xb9\xe3\xe0\x2d\x78\x87\x9c\x88\x07\xed\xc7\xd2\xa6\xe3\xcc\x26\x40\x34\xe4\xd6\xb2\x28\x26\xba\x4a\xcb\x7f\x94\x38\xd4\xe0\x59\x7a\xb1\x3b\xbd\xdb\x65\xa7\xff\xa1\x1e\xd4\xa9\xe6\x32\xd7\xbf\xa7\x41\xf0\xad\xf8\xff\xd9\xab\x97\x8d\xfb\xff\xd5\xd9\x8f\xfb\xff\x8f\xf9\x19\xe7\xb6\xcc\x13\x55\x04\x99\x4e\x5d\xda\xa5\x10\xc9\xbf\xfc\xe5\x2f\x7f\x01\xf4\x69\xe5\xe7\xd6\xeb\x42\xda\x2a\x99\x35\xf1\x0b\xd4\x84\xa0\x30\xc7\xb4\xc3\x72\x20\x63\x9b\xae\x55\x79\x90\x7f\x52\x0f\xaa\xa9\x19\xe0\x33\x25\x2c\xf6\x39\x88\x1e\xe1\x91\xf1\x80\x71\x03\xae\x6b\xea\xb7\x22\x20\x19\x16\x13\x20\x22\x59\x31\xe8\xc5\xaf\xf3\xae\x1f\x0b\x4f\xce\xbf\x58\x51\x55\xd2\x71\x3a\x0e\xbe\x15\x49\x1a\xa4\xb2\x62\xb8\x96\x1c\x32\xa1\xb8\x86\x57\xaf\xfc\x1d\xdd\x6c\xde\x41\x30\x56\xe6\x6e\x75\x58\x50\xa8\xeb\xa0\x40\x98\xf6\x2b\xce\x21\x56\xd0\x80\x87\xe2\x57\x57\x7b\xbc\x37\x19\x56\x4f\xe4\xf0\xc4\xb2\x56\xc8\xaa\xb0\xef\xa5\xa2\xc2\xc7\xb4\xba\xb7\x7f\x8c\x24\x70\x65\xea\xe6\x3b\x1d\x04\xd3\xc5\x2a\x1e\xb8\x38\xe6\xbf\x7b\xd1\xfe\xf8\xf9\xbb\xfd\x0c\x9e\x8d\xa6\xf3\xf1\xe9\x9f\x0e\xf5\xfd\xdf\xf7\xd0\xf7\x7e\xbe\xc5\xff\xfd\xf2\xbc\xc9\xff\xf4\xfc\xd5\x8b\xe7\x3f\xce\xff\x3f\xe2\x47\x88\x73\x16\x1c\x22\x24\x28\xa8\xa3\x42\xc4\x29\xad\x02\x69\xa6\x11\x57\xee\x13\x80\xda\xba\x85\xec\xff\x89\x71\x9e\xd6\xa9\x65\x6a\x56\x0f\xc4\xff\x52\x6c\x36\x40\x12\x5a\xcb\xf3\x5f\x5e\xbf\x94\x37\xa5\xae\xea\x22\x97\x9f\xee\xd3\x5a\xcb\xcb\x32\x7d\xd0\x91\x79\x46\x6d\xae\x9a\x8f\x43\x79\x71\x76\xfe\xfa\x5c\x9c\xf4\xcc\xc2\xec\xf5\x9d\xd5\xec\x74\x1b\x8d\x05\x37\x2b\xef\x54\x4e\xfe\xa4\x3c\xe9\xd1\xd9\xad\x7b\x7d\xaa\x8a\x67\x25\x2b\x48\x10\x88\x3f\xdd\xc0\x02\xb7\x47\xe8\xf9\xe0\x7c\xf0\x35\x8c\x89\xfb\x38\x49\xae\x28\xf6\x34\xf4\x1b\x30\x46\x0f\xb2\x88\x9c\x4a\xf2\xa4\x67\xa9\xa4\xfb\x58\x02\x03\x0e\x55\x43\x35\xb1\xb3\xb8\xa1\xc9\xff\x31\x74\x42\x64\x66\x10\x88\x79\x57\x50\xe2\x82\xbb\x0a\xce\x8a\x9f\xa4\x80\xff\x04\xb9\xfb\x8d\x2e\xd5\x2a\x6b\xe5\x2a\x20\xbd\x71\xfa\x98\x26\x5a\x78\x32\x72\x5e\x7e\x42\xe5\x2a\x3b\xfc\x97\x8e\x64\xad\xab\x3a\xe2\xb4\x83\x97\xe8\xdf\x65\x5c\x7a\xb3\xce\x0e\xc7\xf3\x19\x91\x77\x45\x47\x8e\x20\x14\x6a\x22\x99\x0c\xd5\x16\x28\x20\x09\x6c\xc1\xd2\x58\xfe\xc3\x6c\x25\xcd\x11\x11\x7c\x18\x9e\x9f\x3a\x06\x0e\xde\x89\x7f\x64\x8e\x5a\x80\xb1\x92\x4f\x1c\xc9\x74\xa0\x07\x91\xec\xb5\xe2\x1e\xaf\x4e\xcf\x5f\xbf\x7e\x7d\x74\xad\x0b\x1b\xeb\xf0\xd6\xfa\x5b\x70\xb8\xe7\x98\xdb\x62\x8e\xd7\x1e\xd2\xf2\x14\xa0\x31\x46\x2e\x13\x21\x33\x2d\x69\xa7\x68\x74\x5d\xb6\xbb\xce\x43\x0c\xb6\x11\xcf\xfc\xa0\x05\x09\x4d\x73\x99\xa5\x1a\x94\x4f\x8f\x0d\x49\xe4\x16\x8e\x31\x35\x2c\x2b\x36\x96\x9b\x7b\x25\x38\xc6\xe5\x3f\x29\xb6\x69\x6d\x0b\xc6\xff\x73\x5f\xd4\xba\xea\x1f\x9f\x06\x44\x93\xea\xaf\xb5\x48\x2b\x5e\x26\x08\xc4\xc6\x92\xb5\xec\xd0\xec\x7b\x73\xd6\x3b\xba\x2e\xba\xba\xfe\x46\xf6\x78\x2f\x9f\x7c\xf4\x37\x73\xdf\x1c\x57\x0d\xd9\x14\xc7\xf2\x2c\x8e\xee\xbd\x34\x3f\x3a\x62\x74\x30\xba\x45\x85\xce\xa6\xc8\x0a\xa0\x4b\xe4\x32\xba\x71\x6e\xa6\x42\xd7\x2e\x17\xe9\x8d\xe6\x3e\x4f\xff\x73\xaf\x61\x2b\x55\x69\x05\x70\x48\x2b\x04\x54\x8a\x93\x2f\x79\xf1\x88\x64\x37\xf2\x5e\xe5\x49\xa6\xfb\x6f\xe0\x90\x1c\x5c\x5c\x3c\x3b\x3f\x3b\x7b\x85\xe0\x18\x5f\x0b\x0e\xd8\x17\x7c\x3f\x1c\x33\x56\x58\x42\x83\x6a\xa2\x25\xb7\xec\x93\x5e\x75\x36\xea\x76\x3e\x79\xc3\xd0\xd6\xfb\x24\x1b\xe0\xab\x07\xb9\xae\x9f\x05\x2f\xef\x61\xe4\xc4\xa7\xb3\xb1\x6b\x88\x26\xc7\xb4\xbc\xb1\xfb\x6d\xc5\xb5\x45\x55\xc2\x2c\x3b\xde\x3c\x11\x2c\x04\x42\x87\x42\xb9\xa2\x39\x24\x74\xb1\x21\xf1\x46\x4e\xd3\x02\xf1\x0e\x44\x55\x1a\x2f\xb2\x33\x2d\x42\x2d\xa3\xf6\xe9\x0c\x51\x99\xdc\xb5\x9e\xb8\xcc\x59\x8c\xbe\x60\x5d\x24\x2d\x68\x39\xa2\xb2\x21\x97\xe8\xab\x60\x29\x3f\xa4\x15\x16\x8f\xab\x43\x44\x11\x22\xa8\x84\x0a\x38\x86\xa8\xe4\x15\x95\x7c\xea\x82\x17\x99\x47\xbb\xfe\x62\x10\xee\x48\x86\x07\xc3\x91\x6f\x05\x7b\x50\x81\xd6\xfc\x17\x01\x7e\x9d\x77\xc3\x1b\xa1\x28\x85\xf9\x0e\xb5\xd4\x49\xfd\x54\x7c\xc2\x3f\x85\xae\x2e\x4a\x58\x34\x10\x21\xb4\x62\x52\x5a\x47\x82\xe6\x05\x30\xe2\xa8\xe1\xd5\x68\x2f\x1f\xe4\xf0\x2e\x6e\x4b\x87\x76\x18\x7f\xe9\xa7\xaa\xe3\x68\xf7\x4a\x93\x8f\x2c\x97\xf0\xc8\xb4\x25\xf7\x4c\x6e\x02\x17\x14\x9f\x09\xa7\xf8\x8c\xbf\xb6\x7f\x22\xd0\x95\xd2\xff\xb9\x4f\x1f\x54\x86\x44\x16\x2f\x07\x38\xd4\x70\x6e\xd8\x42\x76\x77\x40\xd9\x63\xa4\x2e\x5c\xc7\x21\x9c\x6d\xf3\xad\x2b\x55\xa5\xd5\x00\x46\xff\x3b\xd5\xe0\x2d\xe1\xb0\x97\x65\x1d\xc8\x77\x94\xf3\xba\x12\xf1\x5f\x86\xd7\x37\x93\xb8\x91\x0e\x44\x7d\x77\x19\xbe\x67\x38\xbd\xb4\x19\xd2\x05\xe4\xcd\xc2\x37\x0b\xf7\xe2\xcf\x5d\x69\xd8\xd9\x3c\xcc\xc2\x4e\x3f\x77\x51\x15\x43\x5d\xd0\x70\x29\x1a\x3a\xe1\x16\xfe\x0a\xda\xe6\xa6\xa1\x9c\x7e\xa5\xc4\xe1\x78\x7e\x29\x11\x27\x4c\xf8\x5f\xd0\x57\x87\x1e\x60\xd2\xd5\x7c\x27\x90\x42\xb7\x58\x5c\x8b\xd5\xbd\x5d\xc4\xf3\x45\xeb\x8d\x57\xb3\xb9\x30\xef\xe8\xc8\xba\x1e\x65\x20\x36\x7f\x80\xfc\xe8\x70\x21\x87\x72\x1e\x2f\x6e\x27\x4b\xcc\x95\x8e\xa7\xef\x23\x71\x3d\xbb\x1c\x5f\x7d\x06\x95\xf4\xb9\x19\xd3\xe5\x7c\xfc\xee\x76\x69\xfe\xdb\x7f\x73\xc4\xa9\xf2\xcb\x78\x3e\xfe\x38\x04\xc9\x75\x48\x48\xcf\xae\x6c\x2e\x52\x3c\x91\x8b\xa4\xcf\x92\xac\xfd\x62\x39\x5c\xc6\x6d\x3d\x7b\x6f\xc2\x05\xe8\xb9\x7b\xea\xf6\x36\xbb\x2a\x17\x33\x12\xe4\x9f\x7d\xf4\xd2\xe4\xf3\xb6\xb2\x3d\x0f\xea\x40\x88\x9f\x1b\xca\xa2\xcd\x7b\xcd\x17\x24\x5f\x1d\x70\xaa\x4e\xd2\xbe\x4c\xb7\x5b\x9d\x18\x23\x38\x3b\xa0\x10\x19\x81\x30\xd8\xb0\x82\x0b\x08\x3e\x4d\xf0\x7d\x4b\x71\xe5\x54\xd9\x6b\x77\x8b\x69\xcb\x8b\x65\x8f\x4d\xb8\x10\xe8\xc3\x69\xc5\xb5\x29\xe6\x12\xa9\x3d\x9d\x17\x73\x74\xed\xcc\xf9\x5b\x6a\xd3\x20\x9d\xbc\x35\x5b\xfa\x24\x4d\xfb\xb2\x4a\xbf\xd6\x07\x79\xf2\xea\xac\x2f\x12\x75\xa8\xbc\xab\xae\xd5\xc6\x60\x33\x6f\xa4\x72\xad\xc5\xc7\xc2\x8e\xc7\xb6\x00\xe3\x91\xbb\x32\x30\xe0\x6d\xdf\x8e\xcd\xa4\x56\xb3\xd0\x00\x18\x43\xa6\x31\xa7\x89\x02\xd8\x4e\x5a\x24\x03\x21\x7e\x39\x3a\xf4\x56\x80\xd7\xe7\x32\x05\xf7\xc3\x58\x15\xbb\x52\x53\x65\x95\x1f\x90\x62\xa6\xce\x4c\x3d\xf2\x9d\xb3\xa8\x29\xe1\xf0\x31\x2d\xef\xd2\x3c\x55\x3e\xe1\xe4\xba\xc8\x37\x59\xba\x86\x4a\x2e\xf3\x1d\x27\xc9\x39\x10\xd3\xa2\x86\x22\x72\xc6\xe9\x76\xb4\xcc\x29\x5f\x82\xd2\x92\x76\xea\x7c\xe6\x11\xf7\xe9\x0e\xc6\xf1\x4e\xe7\xeb\x43\x24\x3c\x15\x24\xc8\x4b\xfc\x47\x91\x42\x45\x7c\x0e\x53\xcd\xee\x24\xcc\x84\xe9\xa5\x67\xd1\xbe\x1e\xc8\x77\x07\xb9\xce\xd2\x35\x9c\xc5\x64\xc2\xf4\x86\xa3\x51\x7c\xb3\xec\x99\x73\xbf\x06\x49\x13\xc8\x30\xd0\x6d\x8d\x09\xa2\xd5\x81\x39\x4e\x40\xf2\xc5\x58\xf9\xc6\xe7\xf3\xcb\x33\x3c\x33\xc8\x5d\x25\xce\x91\xb2\x66\x80\xaf\xe9\x5b\x3f\xc1\xee\xdb\xed\xae\xfd\x0f\x8c\x8c\x0d\x9e\x8d\x2e\x2f\x7f\x67\x01\xb8\xa7\xe3\x3f\x2f\xce\xce\x9f\x37\xe3\x3f\x17\xaf\x9e\xff\x88\xff\xff\x21\x3f\xa3\xd9\xf5\xf5\x6c\x2a\x2f\xe3\x8f\xf1\x64\x76\x03\x61\x1f\xb2\x2b\xe8\x0e\x9c\x4d\x6d\x64\xe8\xc4\x2c\x95\x7e\x20\x0e\xc7\x19\xe7\x90\x75\xda\x38\x64\xc6\xb7\x26\x35\x8c\xa2\xec\x11\x49\x2c\x9e\xf0\x41\x1c\x87\x2a\xb0\x90\x36\x12\xce\x17\xa6\xc1\xa0\xf8\x81\x55\xc1\xb7\x3a\x6f\xc5\x86\xf8\x4d\xc9\xc6\x86\x37\x5e\x84\x6f\x74\x2a\x52\x8e\x9e\xd6\x4b\x12\x58\xb1\x3a\xce\x74\x3a\x9f\x1c\x81\x86\xc1\x0b\x30\xda\xbf\x42\x8e\x3f\xf7\x8a\x13\x54\xae\xf0\x42\x54\xd7\x6d\xd3\x7f\xe5\xd1\xb1\x10\xc5\xb1\xf7\x0c\x68\xfa\x73\x68\x3a\xb2\xe1\x38\x39\x32\x6c\xf7\x89\xea\x1f\x69\x28\x5c\x7e\xab\x7e\xf8\x4e\x30\xdb\x4f\xd6\xfd\xae\xfe\x62\x41\x06\xb1\x03\xfe\xbf\xec\xfd\x5d\x73\xdb\x48\x96\x2e\x0a\xdf\xe7\xaf\xc8\xd0\xc4\x1b\x16\xdf\x80\x50\x96\x6c\xd7\xe7\xc4\x8e\xa0\x25\xda\x66\xb7\x4c\x6a\x48\xaa\xaa\xbd\xef\x92\x64\x52\x42\x1b\x04\x38\x00\x28\x99\xf3\x6b\xf6\xdd\x89\xfd\x13\xce\xed\x9e\x3f\x76\x22\xd7\x47\xe6\x4a\x00\x94\x54\xd5\xd3\x33\x73\xe2\x74\x5d\x74\x57\xd9\x20\x90\x9f\x2b\x57\xae\xf5\xac\xe7\x71\xd6\xb0\xf3\x4e\xf4\xd7\xdb\xcf\xa9\xf8\x0b\xee\xa8\x40\x12\x3f\x53\x5b\x71\x1b\xf1\x74\x84\x74\x89\x83\xae\xbd\x4d\xf5\xc9\x08\x38\xa7\xdc\xb9\x7a\x12\x71\x27\xc7\x1d\xe6\x38\x00\x52\xca\x84\xc4\x0a\xe2\x81\xd5\x25\xa2\x20\xcf\xd3\x77\xa9\x3e\xc1\xd8\x4b\xae\xaf\xa8\x20\xb7\x92\x2f\x3e\xbe\xbc\x36\x59\x55\x33\x61\x37\xf7\x5d\xf5\xf8\xfb\x5d\x3a\x58\xf8\xf2\xf7\xa9\x3e\xb9\x36\xd5\x9d\xad\x88\x05\x1b\xbf\x49\x8c\x4a\xc8\x4d\x4d\xcc\x38\x75\xb7\x7b\x82\xe4\x59\xd1\x08\xe1\x70\x43\x3a\x09\x84\xa9\x23\x36\xf3\x23\x84\x78\x9e\x80\xef\x3c\xfd\xc1\xb5\x87\x19\xdc\xb9\xff\x50\x60\xe1\xb9\xfa\xce\xd3\x1f\xfd\x43\x72\x02\x28\x36\xdb\xb0\x0a\xbc\x3b\xfa\x20\xba\x98\x70\x9c\x72\x6b\xbe\x65\xdb\xfd\x56\x13\xd3\xd8\xae\xac\xe1\xce\x9b\x28\x62\xff\xd0\x04\x15\x00\xd2\x1c\x56\x02\xa7\x69\x81\x37\xb1\xf2\x1a\x4a\x30\xe7\x07\x6d\x56\x48\x84\x96\xb0\xbc\x9e\x12\x39\x35\x02\x86\x7b\x5a\x24\xbc\xb5\x43\x0f\x7e\x4a\xf5\x49\xb4\x02\xe5\x64\x4b\xb4\xb8\xdb\x84\x61\xad\x09\x9e\x58\xe6\x70\x52\x92\x04\x6a\x98\x42\x41\x79\xe0\x83\x45\x68\x6e\x4d\xf1\x94\x90\x16\xd5\x0d\x27\xc9\x7c\x41\x71\x19\x53\x23\x2b\x9f\x18\x2c\x1a\xd2\x8c\xd3\x28\x05\xf8\xf4\x6e\x83\xeb\xb8\x7d\xc8\xca\x7d\x1d\xef\xe2\x5f\x94\x7a\x8f\xcd\x2b\xec\xa3\x68\xa2\x97\xe2\xf2\x01\x93\x63\x66\x4c\xbe\x3b\xda\xbf\xbf\x00\x01\xf0\x65\xdf\xdb\xb3\x3a\x12\x8b\x8b\xdc\xa7\xb6\x1e\xf1\xb3\xac\x55\xe7\xe9\xf9\xeb\x54\x9f\x74\x1a\xf6\x3b\x27\x8f\x29\x01\x83\xb2\x64\xe0\x90\xcd\x6a\x0f\x54\x81\x4b\x41\xa4\x02\xd9\x6d\x8e\x3b\x92\x6e\xb0\x20\xf9\x12\x10\xdc\x7e\x03\xc3\x60\xc2\x5f\x00\xb4\xfb\xb4\x1e\x24\xba\x28\x1f\x75\xf9\x58\xe0\x38\xb8\xd5\x88\x82\x89\x7e\x11\xab\x8e\x3e\xb9\x28\x69\x4b\xf4\xd6\x36\xf7\xe5\x1a\x02\xa6\x2b\x5b\x13\x69\xb3\xd9\xed\x4c\x65\x9a\x7d\x4d\x10\xf2\x84\x23\xde\xf4\xf5\xb0\x4f\x35\xeb\xec\xd1\x09\x71\xee\x4e\x37\x31\x5c\xed\xd3\x01\xf5\x96\x3b\xa3\xa6\xe3\x51\xcb\x0a\x12\xe2\x8a\x22\x54\xda\x6b\x28\x32\xdd\xe2\xb1\xac\x87\x94\xbd\xf7\x8a\x55\x70\x0b\x5a\xb1\x75\x3e\x77\x67\xd9\x97\x72\x7f\x02\x39\x7c\xf7\x6f\xd5\xc9\xc0\x8f\x73\xcb\x36\x1b\x52\x83\x27\x1b\x6d\xbf\xd9\x6a\x05\xea\xec\x64\x0e\x14\x8a\xa1\x53\xc4\x76\xbb\xcb\x0f\x9e\xa1\x52\x98\x0e\x5e\x81\x49\x3c\xe7\x50\xe1\x2f\xde\x9f\xd9\x3a\x51\xd8\x34\x8f\x3d\x73\x33\x4f\x1f\x67\xf3\x5d\x34\x55\x99\xbb\x99\xa9\xf9\x3f\x72\xb0\xc8\x70\xdc\x66\xac\xce\x8f\xe3\xad\xe8\x09\x6c\xd2\x97\x72\x8f\x1f\x25\xf6\xed\xb0\x2b\xd6\xde\x39\x4a\xf4\x09\xfd\xa6\x35\x83\x6a\x57\x3e\xba\xae\x22\x51\x2b\x46\xc0\xf0\xdf\xc1\x22\xaf\x0c\x07\xdb\x88\xc9\x15\xa3\x64\x5b\x53\x98\x3b\x4f\x94\x04\x33\x81\xdd\x09\x66\x7a\x89\x7c\xc0\x95\xc1\xb7\xfa\x1d\xed\xdd\x07\xb7\xc8\x2b\xbe\xc5\x6d\xcb\xca\xe2\xb1\xbb\xc9\x36\x0d\x5c\x60\x57\xb6\x68\xd4\xe9\xbb\xd7\xff\x3f\x2f\x67\x56\xee\x1b\xaf\x8b\x0f\x9c\xa2\xa8\x7b\x69\x0b\xbb\xc9\x00\x39\x12\xbd\x52\xb4\xca\xf3\xd4\xf3\xc5\xe9\x23\x24\xb4\xfc\x91\x76\x91\x9e\x63\xbc\xbb\x73\xbe\xe3\x93\xa9\x52\x97\x7c\x0b\x73\x1b\x7d\x57\x16\x6e\xd4\xab\x8e\x50\xbb\xe7\xe7\x4f\xcf\x51\xd1\x83\xea\x62\x44\x26\x2e\xab\xd6\x24\x49\xdf\x5f\xe2\xcf\x3b\xb4\xe9\x6d\x8e\x94\xc2\xac\x5d\x1b\x94\x11\xc9\xb5\x76\xda\x2d\xca\xd2\x71\x69\xd0\xcf\x4a\x9d\x7a\xea\xf9\x27\x69\x06\x24\x2d\x7e\x60\x54\xf0\x61\xde\x81\xb0\x1b\x6a\x79\xe8\xb6\x36\x88\x6c\x8a\x4c\x1f\xd7\xf0\x86\x5a\x23\x2e\x31\xaa\x21\x86\x8e\xcc\xee\xed\x6a\xa3\xbe\x93\xe6\x54\xca\x57\x90\x67\x33\xe8\x10\xf6\xb4\x9d\x48\x4a\x29\x9a\x40\xc2\x6e\xb4\x70\xae\x7e\x01\x07\x41\x9d\x7a\xa6\xfa\xc8\x72\x7b\x9a\x06\xef\x2b\x61\x00\x37\xa1\x6b\x3e\xc4\xb4\x21\x1a\xe0\x5e\xdc\x71\xf5\x12\x4e\x2a\x24\x84\x36\x35\x6e\xce\xf6\xc8\xfa\x6f\x56\xc0\x7f\x03\x2f\xa0\xd4\x25\x90\xf7\x6d\xdc\x4b\x4d\x6e\xb9\xe9\x2a\x1c\x8e\x6e\x0c\xcb\xda\x1e\x3f\x8c\x7b\x87\x28\x55\xca\x39\xea\x8b\xa0\x06\x1d\xe4\x1c\xb3\x82\xd7\x70\xed\x76\x85\x5b\x28\xde\x38\x57\x56\x7b\xa6\x70\x8e\x92\xac\x4d\x63\x55\x77\x99\xa2\xc3\x1b\x66\xb0\x6e\x1f\xea\x5f\x49\xc4\xa8\xd3\x64\x15\x45\xbf\x8d\xcc\x02\x3c\x47\xd9\xec\xfa\xb5\x1e\xe8\x49\xd9\xb8\xa9\xf7\x96\x82\xf7\xa4\xeb\x8e\xeb\xc6\xb2\xc4\x8c\x35\x2f\x69\xcf\x1a\xe4\x47\xe1\x67\x7d\x7a\x3e\x20\x6e\x54\x3e\xf3\xbf\x94\x7b\x06\x2c\xf9\x6a\xb1\x23\x57\xa3\x8b\x01\xcc\x99\x64\xf4\xa8\x15\x18\x52\xb7\x6a\x7e\x86\xd0\x66\x3b\x5d\x73\xfc\x5a\xe8\x43\x8d\xad\x8b\x95\x3a\x3a\xe9\x82\x23\xb5\x16\x5e\xd9\xda\x42\xae\x45\x18\x3d\x14\xee\xf0\xb7\xca\xff\x32\x53\x07\x97\x3a\xd9\x92\x8e\x95\xd3\x91\x95\x53\xff\x95\x56\x4e\xb6\xf3\x0f\x9a\x37\x30\x31\x2d\xf3\x16\x5f\xfb\x31\x1e\x81\xdc\xbd\xfb\xd6\xe0\xf4\x9b\x3d\xc5\x3c\x95\x90\x26\x12\x6a\xc4\x90\x29\x4a\xe4\xa2\x68\x1b\xc4\xee\x9d\x51\xfd\x3d\x8d\x64\xd2\xb2\x92\x4f\x84\x2e\x64\xb7\x59\xc1\x17\xb2\xf7\xd4\x3e\xc8\xf9\x85\x50\x03\xf4\x31\x6b\x6a\xf9\x3b\x1f\x33\x3a\x6d\x89\x1d\x91\xfb\xe8\x7f\x3d\x10\xc6\x19\x85\xa1\xc1\x0e\xb7\x6c\xb0\x12\x76\x5b\x32\x8a\xb5\xcc\x31\x58\x90\xd6\x9c\x1e\xeb\x99\xea\x9d\xd0\x5f\xd0\xee\x5e\xf4\x06\x54\x8e\xbf\x58\xc9\x21\xeb\x1b\x0f\xfd\xe2\xf1\x78\xf9\x31\x71\xc1\xc7\x84\xfb\xd7\x23\x27\x85\x82\xc2\x04\xd9\x90\x17\x9f\x11\x71\x6f\xa3\xd4\x7b\x74\x3e\x3c\x6b\xff\x2f\x7e\xb7\xfd\xc7\xe2\x12\x3e\x03\x22\x13\x05\xda\x6d\x39\x64\x49\xfc\x81\xd0\x33\xce\xbf\xb8\x39\x54\x9d\xf3\x40\x77\xce\x83\x70\xcc\xc5\x97\xa4\x72\xd3\xb7\x9c\x8f\x1e\x0b\x4f\x2f\x8f\xe8\x55\x7d\xe7\xc4\x29\x02\x71\xe5\xce\x3f\xd2\xb1\x41\x28\xaf\xa0\x93\xe5\x17\x08\x01\xbe\x79\x81\x4d\xe8\x0b\xc1\x21\x25\x60\x6d\x91\x6e\x55\xbd\xac\x0f\x5e\xea\xe7\x4a\x96\x31\x4f\x11\x89\x1c\x29\x11\xbe\x71\x2e\xfe\x10\xd7\x0e\xaa\x1b\x95\x1b\x19\x07\x48\x95\x1a\x16\x3d\x2d\x0b\x87\x7f\xb0\xd7\x9d\x75\x2a\x02\x14\x59\x21\xa2\x09\x2a\x70\x1f\x32\x7a\xa6\x15\xcf\xc8\x8a\x28\x18\xe1\x31\x80\xf0\x59\xf1\x37\xe2\x4d\xad\x52\x28\x60\xe7\x7f\xce\x33\x0a\x30\x74\x56\xfa\x30\x71\xb9\x95\x14\x00\x03\x72\xdf\x43\xc4\x41\xde\x69\xa3\x5f\x17\x30\x5c\x21\x96\xf9\xf2\x91\x8a\xda\x04\xef\xf4\xe4\x69\xa8\x31\x58\xf8\xb3\xaf\xbb\x58\xda\x01\x1b\x03\x39\xb4\xfb\xf2\x11\x0b\x69\x56\xa6\x20\x98\x92\x3a\xfa\x8a\x4e\x97\x00\xc3\x82\x05\x52\xa8\x39\x81\x44\xfa\x78\xe1\x6d\xee\x81\xc4\x4d\x19\xbd\xb5\xeb\x6c\xbf\xd5\xab\x7d\xdd\x94\x5b\x53\x65\xc8\x4d\x84\xfa\x70\x7e\x1b\xd9\x6f\xa0\x00\x6a\xc5\xf2\xbb\x48\x3b\xb9\x83\x45\xc7\xb8\xf9\xd5\x46\x09\x4f\xf4\x31\x30\x44\x00\x7f\xec\xc3\x64\x60\x64\x39\x70\xab\x9e\x0c\xdc\xc2\x2f\x9d\x8b\x82\x24\xe1\xfe\x1b\x4b\x9b\x67\xf6\xc1\xa2\x7b\x17\x9f\xc2\x34\x95\x55\x28\xc8\xe2\x1c\xc8\x69\x3d\xe0\x83\xef\x0b\x17\xcd\xd5\xfb\x8d\xbb\x80\xbb\x97\x93\x4f\xc5\x51\x5d\xb0\xfc\xed\x10\x6b\x57\x1d\x87\xc7\xe8\x4d\xaa\x67\xa4\x5a\xe1\xcc\x38\xb9\xab\xed\xb5\x1b\x6a\xe5\x38\x21\x50\x6e\x7a\x3a\x41\xb1\x3a\xc6\xbc\xd1\x6d\xb9\xee\xd8\x33\x5a\xca\xf2\xb7\x41\x8b\x8b\xf2\xee\xe5\x03\xc2\xc5\xf2\xc6\xf2\xa1\xc0\x80\x4e\xd5\xe3\x33\xfa\xca\x47\xaf\x88\x14\xf2\xf4\xdd\x04\x44\x42\x48\x34\xc5\xbf\x2a\x37\x74\x28\xd1\x95\x12\x51\x8a\x24\x6e\xff\x60\x11\x28\x49\x75\x82\x92\x33\x83\x48\x08\xa5\x8d\x27\xba\xe9\xce\x0d\x4d\x0c\xfa\xdb\x34\x96\x29\xdd\x48\x51\xd7\x85\x5b\x51\x42\xe7\x01\x0a\x3d\xc0\x25\x72\x27\xda\x76\xc7\x04\xe2\xb4\xf2\x0a\x6a\xc0\x93\xdb\x0d\x6d\x19\xa2\xaf\xdc\x80\xd6\xc4\x4f\x01\x82\x53\x38\x3f\x42\xd9\x2d\xaa\x3d\x11\x96\x0a\x7b\xa6\x82\xd1\x78\xc5\x8b\xcf\x79\x50\x60\x10\x85\xa4\x1a\x51\x71\x97\xd8\x78\xca\x9b\x95\x1a\x99\x55\xb4\xd1\x1b\x0b\xcd\x4a\x7c\xf1\x60\xc2\xd4\x54\x09\x13\x7b\x60\x41\xa1\xa7\x7c\xe4\x7a\x17\x5c\x6a\xa4\x48\x54\x41\x20\x4b\x34\x0a\x8f\xef\x78\x38\x52\xfd\x89\x31\xac\x5c\x7e\x03\x15\x31\x68\xca\xf9\xbe\x55\x3e\x16\x7a\x69\xef\x4d\xbe\x89\x94\x34\xf1\x8f\xb4\xe7\xd6\x6c\xdf\xbc\x69\xb9\xc8\x33\x32\x18\x5a\x67\x81\x55\xd6\xb8\x73\xb6\xcc\xf7\x80\xab\x59\xe5\xd6\x54\x34\x19\x1e\x7d\xf8\xd2\x31\x50\x61\x0c\x20\x28\xee\xc6\x16\x37\x38\xdc\xd9\x9c\xab\x8e\x43\x0d\xa6\x42\x20\x1f\x23\xbe\x14\x8d\xb2\x26\xed\x9e\x80\x36\x04\x9c\x44\x91\xd7\xc8\x74\xff\x7e\x1e\xb2\x62\xb5\xaf\xaa\xa0\x76\xdb\x3b\x26\x9d\x5b\x14\xe9\x54\x01\x29\x4a\xb9\x79\xb2\xcb\x2a\x9a\x76\x5c\xe9\xae\x43\xd0\x5d\xb1\x91\xde\xb5\xdc\x90\x72\x23\xcf\x29\xa1\x87\xc9\xab\xb2\x75\x05\xec\xc9\x42\xf4\xe6\x2b\x5b\x87\xbd\xea\xd9\x19\x3d\xfe\x80\xf1\x8e\x2e\x5b\x4b\xd6\x2d\xa1\xd0\xbc\x39\x28\x32\x57\xf4\x23\x14\x8f\xf0\x95\x58\x4f\xa9\x54\x7e\xa1\x3a\x30\xbc\x90\x51\x9c\x20\x48\xee\xf6\x9e\x4b\xb1\xa4\x1a\x37\x8e\x09\xf2\x5b\x83\xa1\x3c\xcf\xab\xa0\x81\x83\xbc\x47\xb0\xcb\x58\xe0\x4c\x3b\xef\x55\xcd\xe6\xc0\xe3\xbf\x5b\x06\xc8\x7b\xed\xf4\x5c\x6d\x81\xb5\xd5\x5d\x99\x8a\xd6\x01\x3a\xde\xb4\x1d\x9b\x5e\xe7\xa7\xc7\x31\xc1\x89\x30\x62\x2c\x3d\x41\x53\xb4\x2b\x75\xb4\x2b\x55\x6b\x57\xe2\xf8\xe1\x3c\x91\xa4\x47\x67\x4a\x60\xfc\x7b\x77\x20\x52\x1e\x1f\x8e\x1b\x8c\x8e\xb1\x38\xba\x55\x55\xff\x3b\xfe\xc0\x56\x3d\xf2\xa6\x17\x6c\x55\x6f\xa6\xfc\x4e\x54\xed\x9d\xf8\x7d\x2a\xa3\x15\x91\x64\x22\x01\xc9\xe4\xdf\xc7\x0a\xd2\x9d\xed\x26\xae\x49\x50\x8e\xfe\xe2\x8c\x79\x97\x33\xcb\x46\x9f\x35\xb5\xf2\x42\x47\x84\x8a\x06\xcc\x3b\x6b\x0f\x99\xee\x2a\xa9\xf7\x95\xa5\x75\x1e\xe8\xb1\xf8\xbb\x4a\xae\x84\xcd\x3e\xdf\x64\x90\x42\x0a\xb2\xd0\xad\x63\x88\xf5\x25\xdb\x2a\x39\x6d\xbf\xec\xad\xbb\x3a\x4d\xec\xa3\x34\x61\xf3\x7d\xa1\x81\x43\x12\x15\xd3\x6a\x92\xd9\xcf\xea\x28\x1f\xcf\x9b\xba\x6e\xec\xa3\xa9\xd6\x9e\xab\xa2\x25\xa1\xa3\x8e\x4a\xe8\x88\xc1\xec\x51\xca\x89\x64\x6a\x80\x23\x72\x69\xd5\x0b\xb5\x6a\x46\xe1\x9e\xcb\x96\x2c\x04\x35\xf4\xdb\xf4\x8d\xdb\x36\x78\xa8\xc7\xb5\xb6\xed\x3e\xdd\x93\x4b\xe9\xe1\x0c\xb2\xc8\xb6\x3b\x94\x17\xa9\x1e\x41\x68\xc4\x75\xb0\x35\xa8\xbc\x48\x4d\xfe\x88\xc2\x8d\x45\x93\x15\x7b\xeb\xc3\x8c\x4f\x5e\xac\xfa\xa6\x58\xf5\x24\xce\xe5\x5a\xb5\x5d\x85\x34\xec\x1c\x3e\x1d\xee\x1d\x21\xdd\x1d\xe4\x7c\x7a\xd7\x14\x4b\xd9\x74\x77\x76\xc8\x7d\x92\x77\xcc\x38\xfa\x6e\x00\x7b\x57\x95\xf7\xd9\x32\x83\x2a\xa0\x8c\x4e\x1f\x54\xa4\x8e\x2e\xbe\x62\x08\x54\x2f\x4c\x00\x2d\x05\x23\x41\x8e\xf4\x55\x6c\xb1\xf0\x76\x85\x2b\xf5\xc8\xb0\xf6\xe1\x11\x8e\x0d\xab\x7a\xd9\xb0\xea\x67\x86\x75\xea\xd3\xa7\x62\x95\xd4\xa5\x70\x6c\xff\x1e\x2b\xe4\x45\x03\x18\x64\x80\x3c\x3c\x38\xde\x22\x62\xf5\xbf\x49\x7b\x05\xc2\x81\x74\x84\x7d\x08\x53\x1c\x39\x61\xdc\x03\x8f\x06\xe9\x36\xbc\x1d\x77\x36\x43\xf8\x0e\x0a\x3c\x9b\x9e\x2c\x4a\xfb\x00\x20\xe5\x8f\x63\x62\x81\xc2\x9a\x66\x70\xf8\xff\x0c\x09\xf3\xca\x02\x27\x8b\xec\x24\x72\xe5\xc0\x0d\x11\xe1\xc9\x24\x7d\x5a\x33\xa0\x09\xf8\xf5\x69\xc8\xda\xc6\x83\xc3\x6d\x0d\x14\xc8\xdb\xae\x3b\x84\xa7\x7d\x1d\x8e\x7b\x6e\x16\x07\x88\x97\x83\xf6\x34\x67\x8d\x74\xea\xe5\xcb\x3c\x8a\x07\xfd\xc6\xa7\xfd\x89\x94\x75\xff\x04\xc8\x7f\xfa\xc1\xd7\x75\xa4\x4a\x5d\x4e\x7f\x1d\xcd\x46\x57\xfd\x24\xf3\x40\x45\x8f\xcc\x69\x8c\xe2\x04\x6a\x37\x5f\xc1\xf2\x7e\x38\x1f\xcf\x3d\x43\xa0\x92\xf5\x22\xc3\xc9\x17\xfd\xe7\xf1\xe4\x2a\xd1\xa3\x31\x94\x63\xf4\x31\x04\x46\xb4\x80\xcc\x33\x28\x6a\x56\x54\x9b\xd9\x7d\xf1\x69\xa4\xfb\x9a\xcc\x8c\xf3\x57\xa3\x0f\xa3\xcb\xc5\x3c\x11\xe5\x2a\xd7\xa3\x44\x7f\x18\x2f\x54\x9b\x2b\x50\xd6\xa8\x08\x02\xc0\xf1\xe4\x63\x2a\x78\xdc\x75\x8b\xc7\xfd\x5f\x6e\x87\xd7\xe3\xc5\x17\xe0\xc3\x6f\x71\xba\x1f\x6b\x1b\x30\x2a\x7e\x99\xde\xa6\x7a\xfe\x69\x7a\x7b\x7d\x05\x43\xd3\x7e\x50\xb9\x41\x1f\x51\xfb\xc7\xbf\x8e\x98\xcc\x6e\x36\x9a\xdf\x00\x4b\xe0\x97\xe9\xad\x3e\x9d\x4c\x71\x08\xc6\x93\x31\xd6\xa7\x20\xf0\xd6\xcd\x2a\xd6\x96\x40\xe5\x8b\x02\x62\xbd\xf1\xfb\xdb\xc5\x74\x36\x20\x6e\x7a\x6a\xdd\x7c\xc1\x73\x33\x19\x5d\x8e\xe6\xf3\xe1\xec\x8b\x46\x0e\x40\x98\x82\xd9\xe8\x66\x38\x9e\x61\x1d\xcc\x6c\xe6\x5a\x32\x9d\xa4\x48\x1e\xd9\xbf\x82\xa0\x5e\x06\x49\x05\xe7\x6e\x61\xb8\x09\xc6\xd2\x19\x37\xd0\x9e\x77\x8f\x56\x4f\xaa\x26\x53\x2e\x03\xea\x1b\x04\x37\x5a\xc3\xdb\xc5\xa7\xe9\x6c\xfc\x3f\x47\x57\xfa\xd3\x68\x36\xc2\x25\x38\xfa\xcb\xe5\xe8\x66\x21\xd7\x63\x68\x8e\x17\x0c\x5c\x8c\x66\x9f\xc7\x93\x21\xb6\x59\x7d\x9f\x9e\xb7\xca\x26\x3c\x7f\x12\x5e\x15\x38\x0d\xe2\x23\x0d\xe8\x7d\xf8\x32\x16\x6d\xf6\x4d\xb9\x35\x4d\xb6\x82\x23\x13\x2d\x88\xde\x90\x00\x1f\x22\x8a\x88\xa4\x04\x4c\x2d\x15\x72\xbb\xaf\xf8\x87\x9c\xa7\xd7\x2d\xf4\x50\x6f\x5e\x6b\x28\x34\x29\x37\x7a\x69\x57\x25\x30\x41\x19\x4c\xf1\xa2\x89\xc1\xc7\x53\xd4\x90\x25\xfd\x40\xb7\xd1\x13\xf2\x55\x41\xbf\xa3\xd9\x57\x36\x51\x31\x2f\x17\xa5\x6c\xf4\xd2\x1e\x4a\xea\x2e\x77\xa8\x2f\xfe\x82\x55\x1a\xf5\xbe\x7a\xc8\x80\x84\xe9\x7b\xe7\xda\xd0\x45\xc9\xd4\xb5\xad\x40\xc2\x0d\x63\x63\x32\xf5\x81\x59\x5f\xb0\x7c\x04\x63\x5b\xdb\x55\x6e\x2a\xd3\x94\xd5\x41\xff\x75\x8f\x32\x30\xca\x60\x76\x69\xe0\xe9\x50\xfb\x43\x1d\x71\x66\xb4\xd7\xf3\x50\xf1\x0d\xc7\xbf\xf0\xf1\xbe\xdc\xca\xd6\x62\x02\x0c\x1a\x97\xd5\x68\xc7\x2b\xac\x3e\x31\xb5\x3e\xb9\x01\x14\x75\xb6\x33\x45\x73\x32\x50\x26\xcf\xed\x1d\x02\x59\xc9\xc6\x8a\xbf\x17\xf0\x8b\xad\x35\x05\xe3\x5d\xfb\x92\x70\x50\x54\xa2\xda\xbf\x07\xd5\xcc\x28\x44\x59\x1d\x4b\xf5\xa3\x60\x66\xfc\x7b\x45\x5e\x78\x67\x24\x06\x04\xe2\xca\x0f\x12\xe7\x05\x25\xd2\x38\x3f\x12\x92\x88\x85\xab\x8a\x20\xb3\x58\x06\x14\xaf\xfe\x23\x2f\x6b\x4a\x8c\x2e\xd3\x2d\x4d\x34\x2c\x39\x72\xe9\x3b\xcd\x8e\x3a\x8d\x78\xe7\x6f\x75\x70\xe0\x41\xbc\x62\x90\x18\x21\x27\xe1\x2b\x1c\xa9\xbe\x48\x2f\xfa\xd7\x6f\x02\x00\x07\xf5\x3d\x6d\x2a\x59\xb3\x25\x27\x24\x6c\xec\x5d\x55\x42\x29\x14\x8a\xe5\xc3\xc0\x44\x5b\x9d\x56\x83\xfd\xb6\xcb\x2a\xbf\x6f\x60\x1c\xf0\x1b\xfc\x09\x2c\xd0\x4a\xf4\xbe\x00\x8a\xe0\x6c\xc3\x01\x62\xf1\xac\xc2\x87\xd0\xef\xc9\x9a\xfb\x75\x65\x1e\x29\x72\x03\xab\x14\x0c\x08\x95\x66\xb1\xb3\xd1\xbb\x0c\x69\xc5\xab\xf6\x7c\x70\x4e\x7d\x5f\x64\x20\x5d\x09\x8e\x28\xe2\x08\xeb\x3d\x39\x5a\xc6\x33\x1f\x1b\x5f\xa0\xe5\x3e\xac\xc4\x7b\x60\xf7\xb7\xeb\xb5\xdd\x78\x0b\xf3\xd1\x9a\x9c\xef\xd3\x73\xf7\xa5\xef\xd3\x0b\x4e\xc8\xba\xe9\xb4\xc5\x1a\xb4\x03\x42\xc2\x19\xf6\x17\x24\x19\x96\xd6\x16\xfa\xc1\xe4\xd9\x3a\x3f\xf8\x25\x48\x71\x0e\x8e\x91\xb3\xf7\x4b\x10\x12\xf8\x26\x95\x55\xb8\xf1\x11\xcd\x11\xe6\xa7\x93\xdc\x0e\x0b\xb8\xf5\xd2\x81\x8a\x8c\x9e\x7c\x21\x9e\x24\x3f\xa4\xc2\x03\x89\xea\x26\x53\xa5\xf0\x04\x9a\x4c\xf5\xe5\x78\x76\x79\xfb\x79\xbe\x70\x87\xff\x1c\x8a\x5e\xfc\x5f\x5d\x8f\x3e\x0e\xaf\x89\xfc\x36\xf0\xdd\xb6\xd8\x6c\x55\x60\xb3\x1d\x24\x82\x09\x57\x32\xdb\x26\x54\xeb\xfa\x65\x7a\x9b\xf4\x1f\xfb\x89\x3b\x46\x15\x96\xbb\x8a\x43\x3f\x94\x9a\x72\x21\xce\x14\x4e\xed\xf6\x79\xeb\x9f\x63\xc2\x62\x45\x07\x33\xf3\xde\x82\xb7\x34\x9a\x27\x71\xa9\x2d\xd4\xfa\x8e\x66\xf3\xe9\xc4\x97\xfe\x06\x36\x63\x66\x30\x56\xb2\xc0\xf6\x78\x61\x2d\x39\x02\x9f\x86\xae\xfb\x40\x0b\xfc\xa4\x3f\xc8\xbf\xfb\x80\x15\xb9\x0b\x26\x28\x4e\x3c\x7f\xf1\xc7\xe9\xf4\xea\xb7\xf1\xf5\x75\xa2\x7f\x9b\xce\xfe\xac\xe7\x8b\xe9\xcd\xcd\xf0\xe3\xc8\x8d\xf1\xe7\x9b\x5b\xf7\x89\x0f\xc3\xf1\xf5\xed\x0c\xd8\x9d\x3f\x0f\xaf\x3f\xdc\x4e\x2e\xb1\x3e\x9a\xba\xe2\xe6\xd2\x8d\x3a\x8f\xea\x67\xe7\x4a\xf6\x14\x03\x43\x35\x36\x95\xed\xfa\xc1\xfa\x42\x53\xf6\x69\xf8\xeb\x48\xbf\x1f\xb9\xbf\x05\x71\x9e\x97\xd0\x0b\xcf\x53\x70\x6d\xd4\x91\xd5\x27\x0a\x9f\x45\x7d\x2e\xff\xa5\x1b\x90\xab\xd1\x70\xf1\x09\x58\x9b\x61\x72\x86\xd7\x6a\x3c\xf9\xd3\xed\xec\x0b\x55\x2c\x8f\x27\x1f\x51\x08\x29\xb4\xf6\xd5\x5c\xb2\x2a\x93\x8b\x3b\xfa\xcb\x02\x0a\xb9\xdc\x92\xb8\x84\x39\xbf\x1e\xfe\xe6\xfc\xd3\x4f\xe3\xf7\xc8\x6e\x7d\xf9\x49\x4c\x0a\x15\x24\xff\xe9\x76\x36\x9e\x5f\x8d\x2f\xb1\x6a\xbd\x53\x97\x2c\x2a\x91\x67\xad\x1e\x86\x85\x72\x74\x9d\x24\x58\xb2\x3c\x9e\x8b\xf7\xb8\x79\x12\xd5\xce\x9d\xda\x65\xe7\x71\xc3\x86\xfe\x31\xd5\xb7\xe9\x3c\xd5\x1f\xdd\xea\x9f\x40\x91\xda\xc8\xed\xd7\xf9\x68\x36\xa7\x04\x6e\x37\xd9\xe5\x4e\xef\x93\x55\xb9\xdd\xda\x0a\x50\xc9\x59\x63\xb7\xc9\x09\xb2\x3c\x1a\x3c\x4c\x34\x83\xb3\x31\xec\xf4\xf6\x47\x75\x99\x7e\x48\x67\xa9\x3b\xb4\x5e\x9f\xeb\xd3\xe9\xaa\x49\xf5\xf9\x4f\x3f\xbd\x1b\x24\x2c\x4c\x43\x68\x29\xf9\xe2\x0e\xda\xfe\x44\x9f\x1a\x62\xde\x6c\x7f\xc5\x34\xfa\xed\x8f\x9a\xbe\xf2\x7f\xfe\x2f\x7d\xf1\xee\x22\xbd\xb8\xf8\xe1\xec\x87\xd7\xe7\x6f\x4f\xcd\xe0\xf4\x7c\x80\x10\x9e\xbe\xf7\x87\x1a\x88\x08\x95\x0f\x5d\x12\x91\x58\xc8\x4d\xd4\xdc\x23\xfe\xd6\xf9\x45\x7a\x71\x7e\xa1\x4f\xe7\x76\xd7\xa4\x0a\xfa\x04\xb0\x43\x26\x25\x81\x53\xac\xf3\xb8\x6b\x4a\xf8\xc3\x8b\x8b\x1f\xd2\x1f\x2e\x5e\x5f\x9c\x9d\x73\x22\x3e\xfc\xd1\x5b\x75\xfa\xa7\x7d\x61\x79\xb4\x9c\x7d\xc6\x29\x83\x10\x2d\x9c\x57\xa3\x62\xad\x6f\x6b\x77\x8d\xa6\x2a\x8a\x63\x41\xde\x22\x3f\xa8\xe6\xbe\xac\x7b\x72\x02\x54\x17\x84\xd7\x82\xf6\x07\x88\x81\x67\x95\x03\x5a\x1e\x48\x66\x81\x15\x47\x31\xa3\x48\xbd\xdf\xd9\xaa\xb6\x6b\x5b\x27\x42\x03\xee\xc3\x70\x96\xe8\x2b\xf8\x5f\x8f\xa5\xa1\x77\x20\x61\x06\x3a\xf0\x08\xec\x22\x3d\x1b\x5b\xcb\x0f\x87\x14\x47\xb7\xf2\xa2\xb7\x1c\x45\x6b\xfd\x53\xaa\x3f\x8f\xe7\x97\xa3\xeb\xeb\xe1\x64\x34\xbd\xc5\x75\x2c\x1c\x23\x8f\x14\xf0\xb5\x8b\x3b\x80\xbd\x86\xf3\x9f\x94\xc2\x01\x86\x4f\x78\xcf\xad\x69\x1a\x82\xa7\x97\x9b\x54\x8d\x31\x76\x14\xba\xd0\xf6\xbe\x32\x77\xe9\xc9\xd7\x54\xf9\xbc\x2f\x6c\xb1\x29\xab\x95\x45\xee\x28\x58\x53\xfe\xb7\xca\xd7\x83\x57\x76\x53\x56\x5b\xc6\xbc\x90\xc7\x43\x75\x62\x85\x5d\xd9\xba\x06\x0d\xfa\xd2\xc7\x41\xc4\x5b\x71\xe6\x54\x7c\x7b\x69\x55\xbf\xb7\x4a\xdb\xff\xba\xaf\xb2\x7a\x9d\x61\x44\x98\xd5\xa9\xb1\x26\x9e\x43\x98\xbd\xf9\xfd\x1e\x18\x76\x08\xf3\x88\x26\x8b\x24\x77\x6e\x1e\xa1\xe6\xdf\x14\x87\x24\x28\x21\xfa\xc0\xce\x40\x16\xd5\xc3\xe8\xc8\xb6\xbd\xaa\x7d\xa1\xfd\x59\xb9\x39\xcb\xcd\xa3\x12\x85\xf6\x50\x6f\x95\x67\x0d\xe7\x69\xb1\x7e\xde\xdd\x49\xca\xbe\x0b\xdd\xd2\xc6\x18\x5e\xab\xa2\x61\xf0\x05\x67\xfb\xaa\xa9\x35\xf3\x11\x51\xc7\xa3\x27\xdd\xb2\x7f\xb0\xc5\xde\x86\xa1\x53\x62\xe8\xfa\xa1\x11\x3d\x81\x3b\x9f\x44\xcc\x4b\xc0\x43\x00\x46\x4e\x39\xb7\xd7\xd9\x10\x4a\xb4\xe9\x55\x59\x47\x6a\x18\x49\x6f\x71\x14\x34\x1b\x9f\xa5\xb8\x1d\xa3\x7d\x14\xab\x67\xd4\xaf\x34\xa8\x67\x40\x4a\xeb\xdb\x0e\x3c\x43\xac\x0d\x31\x31\x48\xc2\x35\xe9\xb6\xc8\x5c\xf7\x27\x84\x02\xb8\x2c\x0b\xe7\xfa\x02\x38\xbb\xc0\xbb\x89\x61\x1a\xcf\xc6\xf3\x35\x79\x4e\x73\x93\xc3\xa5\xfd\x63\x59\xae\x6b\x0d\x1c\x98\x6e\xe3\xd5\xf9\x81\x26\x1b\xb4\x6b\x8a\x83\x82\x25\x59\xe9\xca\xde\xed\x73\x02\xba\x42\xe4\xce\xaf\x93\x10\xe8\x33\xc5\xdd\xde\xdc\x11\xbf\x84\x2f\xbf\xe1\x99\x75\xcb\xb5\x6e\xaa\xbd\x0d\x22\x23\x80\xe1\xaf\xb0\xc4\x0c\x1f\x83\x1c\xeb\x6e\xc7\x1b\xac\x8d\x23\xa2\x9c\xa0\xb3\x48\x3e\xc3\x08\x96\xbf\x3b\x23\x31\x5e\x5c\x8c\x17\x70\x46\x40\x7f\xcb\xaa\xd1\x66\xbd\xcd\x0a\xe7\x64\x23\xac\x3d\x74\xb3\xd6\xa7\x1c\x77\xa1\x47\xb9\xec\x29\x37\x8f\x3c\x81\x7e\x4c\x22\x05\xcf\x55\xb9\x77\x17\x43\x5b\x0f\xd4\x23\xc7\x96\x9f\x0f\x90\x87\x58\x78\x1f\x8a\x05\xad\xe7\xf9\xeb\x14\x02\x6b\xd3\x89\x77\xc5\x9c\xff\x84\x5c\x38\xa9\x52\xc3\x40\x5d\xd8\x1f\xc5\x6e\x85\x02\x18\xfe\x4e\x38\xf9\x5a\x8e\xa3\x12\x22\xa2\x90\x4b\x04\x1d\x98\x1a\x44\x5d\x60\x8d\xf7\xdf\xc0\x13\xed\xd6\x7d\xb9\x01\xe8\xef\xbe\xc9\x24\xf9\x3d\x1d\x18\xdd\xb3\xc1\x47\xd8\x7d\xd2\x17\x8b\x8b\xdd\xd4\x75\x43\x2a\x40\x72\x27\xef\xde\x4d\x29\x87\x16\x4c\x94\xef\x08\xc1\x65\x00\x98\x6e\xff\x75\x9f\x61\x7a\x9c\x18\x8c\x98\x06\x84\x42\x60\x70\x76\x36\xb6\x58\x63\x82\xa7\x8f\x0a\xc4\xad\x61\xa0\x8f\xc3\x72\xde\xb5\x90\x9b\xf5\x99\xe6\xff\x17\xf2\x61\xfc\x7f\xed\x9f\xf4\xbb\xcb\xd1\xe5\xf8\xfa\xfa\xec\x22\x3d\xff\xaf\xd1\x7f\x7b\x77\xf1\xee\x6d\x47\xff\xed\xf5\xf7\xff\xe0\xff\xf8\x4f\xf9\xe7\xd2\xba\xd9\xc7\xec\x8b\x0f\xe2\x77\xa8\x60\x03\xe7\xc7\x45\x7a\x0e\xd5\x66\x6b\x7d\xf1\xfa\xfc\xcd\xd9\xeb\xef\xcf\x2e\xce\x09\x24\x4a\x0e\x6c\x60\x10\x82\x2b\xd8\x07\x67\xc7\xbc\x0b\xe6\xd3\x75\xfe\x21\x2e\xe5\x46\x38\x05\xa1\x4b\xd4\x3a\xab\x57\xfb\x1a\xe3\xe6\x6c\xc8\x81\x90\x35\xe8\xe9\x97\x15\x18\xcf\x52\xdb\x02\xf0\x18\x7d\x27\x5d\xf3\x58\x2a\x88\xab\xef\xaa\xac\x58\x65\xbb\xdc\xd6\xfa\x6e\x9f\xad\x31\xa5\x5d\xe3\x99\x8b\x7c\x00\xff\x7f\xac\x84\x70\x76\xbb\xef\x4d\xf2\x05\xe0\xab\x72\x3c\xb9\xad\xdc\xe5\xfa\xeb\xb1\x48\x3f\x13\x19\xad\x6b\x66\x24\xf9\xbf\xac\x4a\xb3\x6e\x47\x72\x31\x7d\x5c\xd5\x89\x6b\x4d\x6d\x57\x65\xb1\xce\x89\x61\xd0\xe6\xd6\x7b\x7e\x46\xb4\xc0\x79\xac\xee\x93\xc5\xea\x1e\xff\x1d\x1a\x8c\x8e\x09\xc8\x29\x38\x67\x03\x74\xe7\x8b\x26\x41\x36\x52\xe3\x0e\xb7\x3b\x53\xad\xeb\xc8\xd3\x06\x59\x05\x26\x9e\xea\x56\x69\x81\x6b\xcc\x07\xe7\xae\x2a\x1b\x6a\x0f\xd3\x74\x95\x98\x20\x75\x17\x09\xf8\x08\xcd\x93\xfb\xc5\x7d\x99\xaf\x01\x5e\x8a\xde\x9a\xeb\x57\xb9\xcd\x56\x0c\x48\x2e\x1f\xc4\x75\x89\x6e\xf3\xfc\x73\xc6\xde\xc1\x22\xfd\x3f\xff\x77\x58\x3e\x95\xfd\x99\x28\x76\x2f\xcb\xad\x3b\x7a\x4c\x95\x99\x46\xff\xfb\xff\xd2\xf9\xab\x7f\xff\xdf\x85\xad\xee\x32\xab\x4d\x53\x6e\xb3\x7f\xdd\x5b\x6d\x1b\x6d\xf6\xdf\x34\xff\x45\x8d\x48\x35\x64\x4f\xad\xf5\x99\xbe\x1c\x0d\x13\x6d\x88\x3d\x52\xd5\x80\xa1\xce\x36\xd9\x2a\xd1\x8d\x5d\xdd\x17\xd9\xca\xe4\x34\x34\xeb\xbd\x9b\x6d\x20\x0b\x23\x1e\x58\x5b\xbb\x83\x34\xab\xef\x91\x63\x95\x98\x35\xdc\xe2\xa2\x25\x63\x72\xb5\xcb\x0d\x12\xd0\x2e\xf7\x75\x06\xaa\x17\xa6\xd1\x17\xef\x74\xb5\xb7\xfa\xda\x2e\x73\x53\xac\x12\xa0\x59\xdb\xbb\x23\xf9\xda\xea\x9b\xb2\x30\x45\xa3\xaf\x12\xfd\xc3\xbb\xd7\xe7\xef\xf4\x8d\xf3\x35\x12\x54\xe7\xb5\x4c\x2e\x7c\x69\x8b\xa6\x12\xea\x3c\x6b\x37\x99\x7a\x66\x57\xf7\xb6\x5a\xdd\x5b\x54\xeb\x71\xfd\x70\x43\x70\xa6\x2f\x27\xb3\x79\xe8\xa5\x0e\xbd\x84\x30\x7e\xc3\x72\x3e\xd0\xd9\x17\x74\x4a\xf7\x76\xea\x8d\xeb\x93\xfa\x9c\xad\xee\x6d\x7e\x36\x2c\xee\xac\xeb\xc1\x0f\x3f\xbd\xc5\x1e\xe8\x95\x5d\xdb\x6f\xfa\xfc\xfb\x76\x57\xc6\xe4\x4c\x44\x9d\x09\x3d\x01\x2f\x0e\x56\x71\xc3\xf3\x69\x0b\x3d\xa4\x90\x3f\x76\x6f\x5c\x54\x99\x49\xd4\x91\xfe\xe9\xdf\xdd\xbf\xfe\x49\xbb\x2a\x9d\x39\x71\x8e\x90\xfe\xb5\xcc\xf7\x2b\x6b\xf6\x89\x9e\x95\xab\x7f\xdd\xdb\x02\xae\x35\x89\x7e\x7f\xa3\xcf\x5f\xbf\x4b\xf4\x0f\x3f\x9e\xbf\x7b\xe3\x26\xf3\xf2\xde\xd6\x85\x39\x28\xe8\xbc\xe8\xf9\x4d\x65\xcd\xd6\x4d\x38\xe8\x1f\x23\x69\x80\xbf\xa1\x3f\x67\x36\x33\x81\xee\x07\xa3\xa1\xfa\xd0\x4f\x6d\x05\x21\xd8\x4d\x3e\x34\x11\x5f\xba\xb3\x9a\x3f\xa3\xc4\x55\x70\x53\x99\xad\x05\x1f\x14\x3c\x7b\x5d\xee\xac\x27\xcd\x8e\x4c\xdf\xb6\x5c\xdb\x9c\xb6\xaf\x60\x72\xe0\xfe\x60\xcb\x90\x55\xc1\xc3\xda\xa1\xac\x75\x65\x2b\x40\xbb\x4a\x20\xb7\xf3\xb8\xb1\x57\x75\x49\x55\x25\x3b\x12\x0d\xc5\xd7\xd5\x0d\xf0\x68\xb0\x32\x83\x40\xc7\x88\xee\x12\xac\x65\x5c\x60\xf0\x6e\x6d\x43\x2e\x28\x98\xe5\xa6\xa5\x37\xd9\xca\x31\x83\xab\xbb\x3b\x70\x45\xa9\xea\x8c\xa8\xc8\x81\x08\x90\x47\x82\xcd\xd7\x84\xa3\x42\x64\x1b\xc4\x4b\x90\xbe\x02\xef\xc3\x76\xad\xbc\x4a\x0e\x7f\x97\x67\xe7\x15\x1f\x76\x78\x00\xa0\x11\x6d\xdb\x50\x6a\x65\x82\x5b\xf8\x1e\x5c\x7e\x20\x3f\xf7\x15\xb8\x60\x45\xdd\x77\x21\x7b\x43\x5f\x95\x1e\xba\x1a\x13\xcc\x96\x52\x58\x09\xf5\xbe\xfe\x1a\xd1\x9f\x43\xb3\xf3\xd2\xac\x65\x05\x29\x8e\x09\x31\xad\x7f\x57\x56\x6a\x8d\x57\x13\x2a\x98\xe0\x7a\x5c\x3e\x2a\xfd\xc2\xa3\xb1\x82\x1c\x13\xfc\x37\x04\x13\x7d\x60\xc6\xfd\xf9\xab\x5a\x99\xa6\xc1\x6b\x7c\xa2\x11\x4d\xe8\xf6\x67\xbc\x2f\x70\x19\x08\xec\x74\xc0\xde\xc0\x19\xbe\x22\x21\x0c\x05\xb7\x4e\x7f\x98\x93\x9f\x41\x67\x17\xd0\x7b\xd1\x9d\x0f\xa8\xbb\x61\x59\xad\xf9\x96\x15\x82\x10\x15\xa8\x9f\xad\xd5\xae\x2a\x37\x16\x9c\x13\x93\x7b\x2e\xa5\xac\x38\x5b\xdb\x1d\xf0\x39\x51\x08\xf0\x6b\x51\x3e\xe6\x76\x7d\x67\x53\x0e\x7b\x62\x92\xb8\x42\xe5\x5a\x34\x18\xe6\xce\xae\x55\x53\xc2\xd0\x92\xa1\xa2\x78\x40\x0d\x57\x34\x5f\x24\x17\x0d\x60\x7c\x86\x67\x55\x04\x44\x55\xc8\xc1\xcb\x6c\x85\xb6\x70\xa6\x8e\xa7\xc0\xae\xf6\x55\x78\x63\x56\x69\x42\x8e\x7a\x8e\x77\xd3\x18\x0a\x07\xa2\x5f\x05\xb0\xd0\x04\x99\x41\xee\x50\x2f\x05\x9c\x92\x12\x81\x5b\xc5\xda\x99\x04\xe0\xe9\xcd\x1a\x8e\x40\xd5\x66\x6b\x5b\x84\x89\xfc\xe1\xb4\xed\x24\xc6\x22\x68\xbe\x84\x1b\x07\xc3\x63\xda\x04\xd2\x1d\x55\xa2\x8a\xb2\x51\x70\x8a\xb3\x50\x1a\x4c\x66\x51\x0a\x72\x4b\x2c\x80\xa5\x7a\xe5\x35\x5d\x65\x11\x23\x86\x98\x91\x4d\x55\x6e\xd3\x8e\xd7\x0a\xa0\x3e\x8e\xbc\x40\x2c\x83\x6c\x0c\x0f\xbe\x5b\x1d\xb8\xe0\x3a\x1b\x53\xb5\x36\xa6\x5e\xdb\x15\xc6\x86\x4a\x67\xa3\xb6\x59\xc3\x0b\x5c\x33\x07\x58\x53\xd2\xb9\x13\x38\x39\xd5\x87\x2a\xb0\x66\xd5\x5f\xed\x5a\xff\xeb\xde\xd6\x54\x92\x6e\x0a\x18\x2e\x20\xa9\x24\xf6\x07\xd0\x57\x70\x4e\xc9\xa3\x5d\xd6\x59\x63\x63\xb7\x49\xf9\xcc\xea\xc6\x6c\xb3\xfc\xa0\x4f\x89\xf9\xfb\xf1\xf1\x31\x5d\xd9\x55\x96\xe7\x69\x56\x6c\xca\xef\xb2\x62\x6d\xbf\xa5\xb6\x48\xef\x9b\x6d\x3e\xf0\xb8\xf1\x10\xd2\x5d\xe5\xa6\x92\x3a\x65\x5a\xeb\x61\xd5\x64\xab\xdc\xea\x73\x7d\xa6\xaf\x46\x1f\x20\xbd\x39\x9d\xcc\x95\xfa\x40\xc1\xb6\xf6\xb9\x26\xe8\xe8\x21\x24\xd4\x44\xc4\xe4\x14\x7b\xc3\x9e\x96\xdb\xad\xf5\xf5\x0b\x46\xaf\xcc\x2e\x6b\x4c\xae\x73\xdb\x34\x48\x3c\x6f\x0f\x14\x99\x00\xdb\x16\xbf\x89\x20\x1f\x3f\x33\xe8\x51\x29\xff\xe5\x9f\x25\x59\x5a\xe7\x64\x4d\xbc\xf8\x03\x73\x9e\xf5\x60\x2f\x91\x12\xd4\x14\x85\xfd\x26\xa8\x1c\x94\xf0\xfb\x03\xcb\x95\xd0\x21\x84\xd7\x4e\x31\xac\xcb\xac\x57\x6e\xd3\xf5\xd5\x9e\x02\x85\x4f\x25\x6b\xb0\x12\xbc\xb2\xc8\xdc\x4f\xc2\xea\x68\x61\x30\x03\xa9\xe9\x6a\x65\x77\x98\x3d\x50\x82\xa1\xd4\xb7\x95\xc3\x49\x7d\x6d\x9e\xb7\xda\xdc\x66\xea\xa2\xa1\x39\x88\x0e\xa9\xb8\xf5\xfa\xf7\xb7\x1e\x37\x36\xdc\xc2\x54\xbf\xe8\xe1\x71\xf1\x8c\x88\x84\xd5\x77\xd1\x83\x5c\x9f\xec\x63\xe0\x68\x38\x38\x17\x2f\xb7\xa6\x6e\x00\x72\xee\x43\x6b\x7e\xb9\xd3\x24\xfb\xc1\xe0\xf7\xb9\x45\x28\xdf\xf9\xaa\x06\x46\xda\x6a\x4f\x38\x0b\x18\x33\x52\xc5\xca\x81\x1f\x90\xeb\x49\x15\x79\x22\x70\xfc\x50\xcd\xa5\xf7\x79\x3c\x86\xdd\xb6\xc2\x9f\xd0\x0e\xb1\x90\x64\xbf\x58\xc7\x04\x58\x1c\x09\xda\x0c\x99\x06\x5f\x69\xe3\x4e\xa8\x2c\x97\x21\x74\x15\x97\x60\xf3\x17\x3e\x81\x6d\x93\x2f\x47\x6b\x77\x5a\x0f\x8e\x78\x22\x78\x9b\x93\x28\xa2\x9e\x86\xe3\xff\x07\x45\x87\x9e\x39\x71\x2e\x80\xfb\x0a\x8b\xc8\xc0\x5a\x26\x58\x76\xdf\x4c\xe3\xff\x8b\x58\xa8\x9f\x19\x49\xe0\x0c\xef\x42\x8c\xfa\x0b\xe6\xf9\x9a\x1c\x28\xd9\x40\x1c\x11\x2e\x15\xa5\x30\x77\xcc\x6a\x26\x39\xcd\xdc\x36\x90\x21\xd9\x96\xf4\x41\x58\xd9\x7d\x7d\x92\xcd\xfa\x59\x70\xd5\xd1\x79\xb4\x8d\xf9\x43\x56\x65\x45\xcc\x60\x75\xa2\x41\x04\x26\xf7\xd4\x22\x6b\xb3\x6b\xb8\xa4\x38\xd4\x78\x6c\xf6\xc5\x8a\x35\x30\x1a\x7b\x57\x51\x0e\x89\x9c\xb0\xb9\x70\xd6\xc4\x57\xa3\x98\xb9\x22\x59\x36\xa8\x0d\x0a\xcf\x50\x82\x25\xd7\x9f\xcb\xf5\x3e\x8f\x0c\x24\xfe\x49\x98\x9c\xda\x22\x75\x19\x2c\xbf\x9a\x16\x6d\xa4\xdf\x96\x55\x2d\x12\x3a\x38\xe8\xc1\xa9\xb1\xb5\xaa\xf7\x3b\x96\x58\x73\x6b\xde\xf7\x48\xaa\x1a\x64\x11\x97\xa3\xc6\xcc\xb2\x28\xd1\x3a\xb2\xbd\x46\xdf\xa2\x5e\xf4\xcc\x00\x75\x2f\x81\x64\x4d\x47\xc4\x3e\x30\xca\xd6\x25\xe7\x86\xb2\x9a\x7e\xe4\xdd\x7d\x3f\xcc\xd5\x1e\xd0\x9f\xb5\x05\x8e\x40\xab\x29\xd1\xac\xeb\x9d\x59\x59\x62\x8e\x51\x6e\xb5\xae\x90\xe7\x1a\x4f\x7e\x58\x7f\x6c\xfb\x0f\x9a\x5e\x14\x59\xf9\x97\xf5\x22\x61\xd9\x06\x8c\x43\x45\x4d\xa3\xf6\x2b\xf8\x04\x84\x77\x2c\xd4\xd7\xd9\xc8\xdf\x8b\x1a\x2c\x5a\x00\x42\x7b\x37\xd7\x72\x17\x3d\xa1\xbd\xc7\xf0\xff\x0b\xde\x62\xe1\xf0\x55\x5e\x0d\xc8\xd4\xc1\x33\xe4\x19\x8c\x2f\x06\x1f\x9c\x7f\x84\xeb\x65\x5c\xac\x5a\xad\x19\xba\xb9\x2f\xfb\x1a\xc5\x7f\xf3\x74\xdb\xde\x70\xa5\x78\xd7\x31\xf8\x9b\xda\x36\xba\x8d\x5b\x34\xda\x57\xe5\xce\x9a\x42\xdf\x16\xee\xe1\x23\xad\x39\x47\x0c\xdf\xef\x19\x2b\xff\x62\x0a\x9e\xc5\x76\x0f\xff\x1f\x80\x85\xb6\xc6\xf6\xe0\xac\xc7\xee\x05\x2d\x60\xb6\x92\xf8\x82\xc5\xbd\xad\x6d\xe4\xc6\x91\x7f\x8f\x34\x2b\x25\x96\x75\xba\xdb\x23\x30\x21\xc3\xb9\x98\xef\xdd\x58\x3b\xcf\x21\xf6\x29\x2f\xf4\x19\x23\xfc\x31\xac\x10\xf9\x92\x36\x0e\x34\xbb\x3f\xc0\x68\x48\xa4\x36\x40\x90\x43\xd1\x70\x20\xb5\x68\x0b\x67\x49\xd1\x2c\xd4\x9e\x29\xab\x7c\xfd\x98\xad\xbb\x15\xb1\x01\xce\x59\xab\xa8\x56\x95\x9b\xfd\x4e\xff\xf3\x3f\xd5\xab\x72\x67\xff\x07\x65\xd3\x30\xad\xcb\xbf\x7f\xbc\x2f\x73\xf4\x64\xbc\xa6\xb0\x8f\xa6\xaa\x56\x30\x21\x8a\x90\x9a\xac\x9d\x04\xe5\x2f\xbe\xd1\x67\x1a\x69\xf2\x87\x93\xcb\x91\x52\x6f\xd2\x73\x29\x1b\x64\x3b\xf9\x3b\x53\xf7\x1e\xac\x7d\xee\x95\xea\x38\xee\x18\xb5\x01\xeb\xb3\x82\x3a\x52\xa4\x8a\x41\xff\x1b\xc8\x84\xf8\x3f\x82\x5b\xff\xe0\xee\xa5\x3f\x2b\x75\x9a\x0d\x38\x88\xf0\xd4\x21\x03\x5b\x00\xcc\xaa\x59\xba\xcb\xe6\xf2\xa0\xd7\xe5\x63\xc1\xbf\x74\x26\x56\x19\xb8\xca\x35\x96\x24\x8f\x58\x08\x40\x3e\xa3\x8d\xde\xdd\x1f\x6a\x88\xf8\x21\x5f\xc8\x2f\xae\x09\xc4\xd6\x83\x6d\xc5\x52\x46\x39\x58\x14\xbc\x22\x14\x76\xcc\x4f\xdc\xa9\x38\x00\x6d\xe9\x0b\x3d\x75\x76\x59\x10\xb5\x88\x5b\x8e\x60\x00\xf6\xa0\x8b\x18\xfc\x61\x81\xff\xc0\xac\x1a\x5b\x65\x75\x93\xad\x6a\xe5\xe9\x5e\x04\x5f\x21\x06\x97\x30\x7c\x13\xca\xe4\x89\x40\x01\xfa\x63\x56\x9d\x90\x86\x62\x3e\x07\xb4\xea\x22\x88\x41\xf1\xa9\x7b\x53\x23\xa4\x37\x14\x92\xc7\xdb\x45\x33\x6e\x57\x41\xfa\x05\x96\x0b\x64\x46\x4c\xab\x54\xdb\x2f\xc6\xf4\x5c\xff\xf3\x3f\xe1\x83\x59\x71\xe7\x37\x01\xc1\x8b\xd1\x6a\xa8\x8e\x10\xd3\xca\x47\x4b\x6a\x9f\x53\xb8\x87\x30\x07\xc5\x45\x60\xb8\xeb\xa6\x2c\xdd\xe5\x2c\x5e\xff\x6f\xf5\x99\x1e\x7d\xe0\xb2\x9b\xab\xe1\x62\x04\xd0\xc2\xc5\x68\xf6\x59\x14\xcf\xb6\x1e\x41\x93\xd2\x95\xbb\x58\x95\xdb\x23\x04\x8b\xf2\x96\xe2\xf7\x0d\xb1\x1d\x04\xb3\xf8\xd2\x61\x91\xc5\xa8\xd4\xd4\xbe\x06\x85\xba\x10\xc0\x50\x79\x33\xe2\xfc\xcb\xca\x92\xb3\xc9\xd6\x44\x58\x92\xe7\xdc\xf3\x7e\x4b\xf2\x4e\x9f\xe9\xf9\xe5\xf4\x06\xea\x7b\x50\xb7\x47\x7f\x9c\x0d\x27\x8b\xd1\x15\x36\xcf\x5b\xd5\x98\x1b\xb0\xb5\x68\xd0\xed\xa5\x0b\x68\xd2\x32\x06\xc4\xed\xdb\x69\x89\x0f\x38\x90\x11\x80\x90\x1d\xd4\xe2\x94\xe1\xf6\xd7\xb3\xc1\xca\x02\xe5\x63\x4c\x9d\xd5\x31\x27\x70\xeb\xa2\xd8\x46\x11\x82\x5d\x4e\x95\x7a\x6f\xeb\x0c\x20\x81\xd9\x26\x3e\x39\xca\xc7\x82\xb4\x08\xb6\x78\x63\x2b\x1f\x0b\x49\x30\x42\x25\x1a\xb5\x1f\xf7\xe2\x0e\x39\xcd\xab\x88\xb5\x4b\x78\xa5\xf1\xbe\xd6\x48\x7b\x93\x01\x2b\xcf\x76\x57\x16\xee\x65\x49\xd4\x06\xa4\x40\x6e\x80\x84\x0d\x4a\x30\x4a\x46\xd3\xf5\x99\x25\x5c\x8c\x75\x68\x18\xe3\x8b\x42\x58\xd8\xaf\xd4\x9a\x83\xb8\xf6\xdb\x2e\x2f\xb1\xca\x97\x79\xcd\x0f\x6d\xfb\xcc\x05\xc5\xf2\xd5\x95\x55\x7c\x6c\x42\x10\x2e\x1a\x3a\xd1\xec\xa6\x0c\xf1\x19\xfe\x81\xfb\xbc\x73\x56\x56\x55\xb6\xb4\x2c\xcf\x27\x13\x00\x5d\x16\x08\xe7\x16\xdf\x55\x66\x77\xef\x37\xce\xbb\xf4\x1c\xd7\x28\x0a\x39\x8d\xe4\x0a\xb5\x08\x00\x86\x00\x7a\xf6\x6f\x3e\xb7\xda\x32\xab\x0c\x4e\x43\x7a\x04\x06\xa8\xb9\x93\x9d\xa2\x72\x9b\xcc\xe6\x6b\xac\xc1\x0d\xb0\xb3\x84\x19\xfd\xa8\x1a\x5a\x9e\xf2\x01\x9f\xe8\x3d\x7e\xe5\xe6\xb6\x72\x07\xca\xcf\x20\xb6\xba\xb3\xd5\xd6\x14\xcc\x55\x64\xb7\xbb\xb2\x72\x77\x17\x8e\x7c\xfa\x0c\x45\x77\x21\xb5\x4e\x4b\x25\x4f\x4b\xca\x4f\xca\x0d\x44\x1e\xd5\x45\x1a\xe2\xf6\x44\x87\x09\xff\x5e\xed\x8b\xc2\xf3\x40\x36\x65\xd5\x39\x93\xcb\x22\x3e\x93\xdd\x01\x0a\xe7\x1d\x5e\x6e\x73\xca\xdf\x97\xba\x5c\xc2\x19\x9c\xe8\xba\xd9\xaf\x0f\xd8\xad\x1a\x8f\x21\x8c\x0d\x03\x72\x93\x83\x1a\x6b\x8b\x05\x1b\x58\x70\x95\xad\xad\xe1\xf8\x88\xcf\xb0\x2f\xed\x7d\x06\xf1\x35\xff\x75\x86\x1b\xb9\x2f\xda\x3c\x10\x2e\xb4\xbc\x22\x08\xe5\xa2\xe1\xc4\x10\x6e\x37\x2c\xb6\x32\x55\x95\xd9\x5a\xf3\xbc\xd3\x07\xfa\x86\x48\xf9\x21\x82\x75\xcb\xba\xe7\x34\x5e\x00\xf0\xf3\xdd\x6b\x65\xd5\xc5\xd1\x8d\x87\x99\xca\x6a\x1e\x36\xc4\x4f\x99\xaa\x3a\x40\x23\xa4\x2f\xc1\x0b\xfb\x02\x6a\x57\x17\xd7\xa8\xc3\xbb\x98\x82\xe8\x5b\xa8\x0f\xc1\x10\xeb\x22\x4a\xf8\x99\xaf\x71\x20\xa3\x0e\xa5\xfe\x51\x66\x90\x43\x03\x96\xe2\x02\x89\x06\x67\xe2\x0e\x15\xff\x10\x80\x77\x24\xc8\xd0\xbe\x18\x26\x71\xb2\x2c\xd2\x92\x55\x21\xcf\x02\x68\xd9\x38\xbf\x7f\x7c\x93\xb6\x1b\x10\x77\xa9\xd5\x00\x15\xd3\xdf\x64\x8d\xa4\x76\x07\xc3\x96\xad\xb2\x86\xbd\x2e\xff\x0c\x91\x5b\xc1\x77\x79\x11\x45\xd1\x16\x4e\xf6\x43\xfe\xa8\x0e\x0e\x00\xc3\x6e\x59\x88\x26\x28\x9d\xf0\xc4\xbd\x09\x16\x49\x4a\xe8\x40\x96\x2d\x28\xc0\x24\x62\xd0\xca\x4d\x9c\x47\xed\x9f\x35\xba\xc2\xf9\x95\xd8\x90\x26\xd5\x76\xbb\x2f\xa0\x95\xf1\xd6\xa5\x71\xa2\x7c\x0d\xa7\xc4\xfb\x36\x34\xa6\x0e\x7b\xdd\xef\xce\xe4\x6e\x4d\xf5\xd5\x36\x09\xe7\x54\xb2\xbe\xbc\xaa\xda\x58\x64\x52\xdb\x54\x28\xb0\x86\xdc\x5e\x49\x74\x6e\xae\xca\x5d\x66\xbb\xc7\x21\xb5\x02\x3e\xdf\xb3\x50\x36\xfb\x0a\x73\x39\xd1\x82\x11\xa9\xd8\xf8\xb5\x3e\xac\x0b\xa7\xe8\xb6\x1d\x0a\xf6\xdc\xc8\x38\x2f\x16\x7c\xba\xb2\x5a\x0b\xb7\xbc\xf7\x3e\x74\xcc\x8b\xd0\xfc\xcf\xbb\x14\x48\x2e\x23\x05\xa5\xe9\x07\x29\x98\x88\x45\x51\xa0\x39\x38\xbe\xc4\xda\x97\x67\x76\x85\xcc\xe0\x57\xfb\xa3\x03\x98\x45\x72\x39\xa0\x92\x2d\x92\x0d\xc8\x7f\x1c\x6f\x19\xb0\x9f\xd1\xfa\xc3\xc4\xa9\xad\xbd\xce\x82\xa2\x3b\x2a\x67\xd5\x3a\xb7\x6f\xd8\x2c\x38\x7c\xdb\x9d\x29\x30\x92\xfe\xb3\x18\x11\x94\x88\x32\x47\x6e\x48\x70\x42\x1d\xbd\x1a\x89\x63\xb9\xdc\xb4\xc3\x10\x65\xf5\xaa\xd6\x32\x83\xae\x02\xc9\xd1\x11\x47\xbc\xd6\x3f\x42\x83\x7f\x4a\x94\xe2\xb4\x61\xc2\x71\x2c\x2c\x99\x84\x81\xc1\xda\x86\x7b\x1b\x8d\x60\x67\xbc\xeb\x08\x0b\xb0\x4e\x54\x1c\x22\x71\x2e\x6f\x2d\x2e\x13\x31\xea\x60\xb3\xcf\xf3\x28\xb3\xd2\x7a\x3d\x52\xdf\x52\x8d\x2a\x6c\x2e\x0e\x5a\x37\xf7\x6e\x73\x1d\xac\x09\x94\x14\x5d\x20\x5a\x1c\x83\xf4\xde\x8a\xb8\x47\x79\xc0\xba\x09\x4c\x83\x50\x9a\x53\x67\xb4\x14\xea\xa6\x87\x7a\x54\x05\x84\xba\xfd\xb6\xb2\x14\x3c\x90\x0f\x63\x12\x99\x7c\xbd\xf6\xde\xb8\xe8\xee\x0d\xdc\x0a\x92\x4b\x01\xb9\x48\xa2\xd1\x44\x26\x62\x13\x9d\x08\xdd\x13\xe9\xe8\xbe\xe5\x5b\x44\xdf\x30\x85\x73\xaa\x93\x31\xe2\x1b\xa1\x90\x92\xe6\x64\x4f\x7b\x4f\xc8\x20\xc9\xb3\xe7\x5c\x2f\xef\x78\xc4\x46\xe9\xc5\xe9\xd5\x8a\x36\x73\x89\x4d\x58\xfd\x63\x33\xf7\x6f\xe6\x27\xf7\xb1\x1c\xbc\x88\x6b\xb4\x55\x34\xd8\xda\xd0\xce\xdd\x35\xc8\x0a\x53\x37\xc6\x2b\xa2\xc7\xf9\xc7\x27\x77\xb8\x00\x17\xa9\xa3\x1f\xfe\xe3\x5b\xfd\xe8\x3b\x13\xfd\x07\xf6\xbc\x92\xdb\x58\xc2\xa2\xfe\xb6\x3d\xff\xa6\xbb\xe7\x47\x7f\x59\x8c\x66\x93\xe1\xb5\xdb\xfc\xb7\xd7\xa3\x79\xdf\x96\x47\x76\x6f\xc4\xe1\xb8\xeb\x80\x6e\xe5\x64\x9e\xd8\xee\xdd\xb0\xe5\xba\x8c\x8b\x6a\x60\xb7\xf4\xbc\xd0\x78\x4c\x8a\x58\x08\x8a\x19\x04\x7d\x7e\xa6\x03\x1c\x68\xf7\xf9\x6d\x0a\x05\xcb\xc3\x05\x17\xa8\x00\x8b\x0c\xd6\x24\x13\xc0\x7a\xde\xb2\x12\x2b\x53\x08\x76\xdd\x48\xe9\x2a\xae\x06\x6b\x6d\x61\xf0\xad\x90\xe3\xea\xa1\xc5\x22\x47\xd9\x97\x44\xc7\x89\x0f\x46\x1e\x8c\x6e\x6f\xae\x79\xd7\x7c\x7e\xda\x61\x4a\xba\x44\x7a\x90\x88\x83\x38\x14\xb4\xb5\x9f\x85\x4b\x41\x76\xa8\x45\x5a\xf5\x82\x66\xb5\x4d\xa8\x1c\x9c\x56\x73\x75\x9f\x7f\x07\x55\x6e\x7e\x0c\xd5\xcb\xc6\x50\xbf\x70\x0c\x55\x7b\x0c\xff\xd8\xd8\x40\xe6\x4c\xfd\xa1\xb1\x11\x51\xbb\xef\xf5\x99\x1e\x4f\x16\xa3\xeb\xeb\xd1\xe5\xe2\x76\x78\xad\x6f\x66\xd3\x9b\xd1\x6c\xf1\x85\x57\xe4\xf7\xe9\xb9\x9e\xfe\x0a\xc4\x3b\x81\x82\x20\x9c\xb5\x0b\x9f\xd8\xc6\x90\xd7\x93\x81\xc3\x4e\x5e\x1f\x2a\x1b\xf1\xe6\xa0\xf6\x21\x3b\xd3\x7e\xae\xb5\x88\x7b\xd1\xfa\x7d\x1b\x59\x92\xb5\x35\xa1\xa1\xce\x34\x00\x28\xbe\x73\x9c\x66\x4d\x8d\x45\x53\x48\xd7\x0b\x13\x0b\xd6\x4b\x2d\x6d\x74\x05\x17\xe8\x8a\xde\x78\xe1\x31\x8f\x01\xae\x8b\x3d\xf0\x06\x31\x8c\x32\xfc\xc5\x06\xb7\x33\x20\x40\x56\x44\xf1\xdd\x6a\x9f\x63\x75\x38\x58\x7d\xc5\x80\x5c\x11\xe6\xf4\xad\xd9\x73\x40\xa5\x2f\xcc\xfc\x36\xbd\xd0\xff\xfc\x4f\xae\x3b\x22\xc2\xfc\x7d\x7a\x11\xa6\xbf\x27\x88\xe0\xb7\x18\x80\x15\xd0\xde\x76\x3c\x2d\xba\x35\x83\xb6\x97\xf6\x82\x8f\xa1\x54\x40\xb5\x05\x5d\x68\xc5\x64\x75\xfc\x1e\x13\x8a\xe1\x97\x87\x56\xf1\xad\x68\xf1\x9b\xd0\xe2\xee\x49\xf1\x44\xa3\x3b\x67\xc4\xdf\xd2\xf0\xf6\xab\x9e\x6a\x3b\x78\x2c\xee\x96\x4a\x75\x7b\x4c\x09\xe8\x56\xd7\x61\x87\xb5\xa0\x71\xd1\x0b\x1e\xa9\x08\xc2\x46\x70\x94\x58\x68\x62\x28\xde\xea\x3f\x4d\xc7\x93\x05\x92\xba\xcd\x71\xda\xf0\xef\x16\x71\xde\x8a\xeb\x56\xc3\xea\xc3\x88\x23\x05\x8e\x11\xfa\x98\x84\x28\x2f\xeb\x0f\x12\xc7\x7e\xd2\x19\x9a\x50\xfe\x41\x9c\xe8\xca\x34\x8d\x59\xdd\x77\x31\x02\xbf\x80\xe3\x27\x03\x40\x78\xbe\xd2\xef\xe8\x4b\x44\x03\x0f\xf9\x38\xfa\x24\x9d\x3d\xd1\x85\x56\x75\xa1\x59\x65\xe5\x5e\xd5\x3e\x12\xba\xc1\xf1\x67\x98\x95\x5e\x30\xf9\x45\x2b\x08\xba\x91\x56\x87\x4c\x70\x5c\x38\x8a\x39\x38\xd5\x80\x66\x4d\x17\xf6\xf6\x90\xd5\x67\xff\xfe\xbf\xce\x1e\xb2\x1a\x26\xb9\x6e\xcc\x66\xe3\x35\x50\x39\xde\x52\xef\x2b\x1b\x10\x60\x2a\x54\x35\x31\xb1\x10\xc7\x3a\x9f\xd4\x50\xea\x6b\xac\x94\xa2\xa9\xe3\x73\xe3\x07\x7d\xa6\x67\xa3\xeb\xe1\xc2\xdd\xbc\x80\x42\xce\x6d\xae\x1f\xd2\x73\x7d\x0b\x46\xb7\x28\xf5\x2a\xab\x56\xfb\x6d\x0d\x29\x3f\x8e\xac\xc6\x17\x06\x88\xda\xdb\x38\xfa\xdf\x94\x7c\x33\x51\xa2\x80\xa6\xae\x33\x7c\x11\x4a\x17\x42\x81\x29\xfc\xa7\x47\xea\xb4\x73\xec\xa9\x52\x9e\xa3\x3d\xfa\x40\x2b\x98\x8a\x54\xf8\xb0\x65\x79\xaf\xf1\x3b\xb1\x68\xfc\x98\x8c\x3b\xd1\x66\x74\x9b\xe8\x65\x85\xe0\x09\xd1\xd8\x24\x9c\x25\x91\x01\x16\x9e\x21\x22\xff\xc0\x25\xd4\x53\xbe\x7e\x84\xa4\x92\x6b\x2b\x84\x44\xdd\x74\x8a\x37\x33\x34\xab\x77\xc4\xfc\x10\xe1\x14\x00\x83\xb3\x64\x43\x27\x54\x79\xea\xa6\xef\x42\xcf\xb3\x6d\x96\x9b\x2a\x3f\xe0\x3a\x7b\x66\xd8\x30\xd5\x91\x73\x5e\x28\x61\xb5\xae\xa6\x56\x75\x99\xdb\x56\x05\x71\xa2\x8d\xc8\x3f\x0b\x43\x06\x37\xad\x25\xe0\x0f\x21\x88\x06\x30\x81\xac\xa9\x6d\xbe\x81\xd3\x8b\x22\xc2\x4f\x85\x29\x78\xd0\x8f\xdc\x67\xc8\x87\xea\x9b\x4b\x11\xdb\x65\x03\x8c\xd0\xeb\x54\xcf\xdd\x38\xb7\x32\xe6\x90\xfe\x77\xa3\x9e\x99\x5c\x1d\x43\x95\x42\xc2\x5b\xa6\x7d\x3a\xd4\x0c\x00\x25\xe9\x99\x77\x45\xf8\xa8\xb5\xaf\x5d\x8c\x96\x40\x0c\x9d\xb1\xad\x1c\xec\x8f\xfa\x2c\xb0\x02\x29\xf5\x63\x7a\xae\xe7\x4f\x39\xae\xfe\x77\xe9\x45\x12\x5f\x9f\x7c\x7b\x79\xd2\x9d\x5d\x41\xd2\x32\xe7\x7e\xd9\xa2\x46\x4f\x62\xe3\x89\xbb\x40\x7c\x34\x2f\x6b\x67\xaa\xe0\x16\xe4\x85\x45\x00\x2c\xd7\xc1\xb6\xa9\x36\x29\xb8\xde\x18\xf8\x57\xec\xb1\x4c\x5e\x55\x36\xb7\x0f\xc6\xab\xdc\x96\x55\x22\xdd\x41\x34\x17\x59\x71\xa7\xac\x33\x1b\xc5\xca\x8a\xe0\xfa\x8f\xe9\x85\x5e\xc4\x71\x02\x41\x66\x5e\x7b\x58\x04\xa3\x29\xca\xed\x36\x6b\x30\x45\x04\x60\xcf\x50\x66\xaf\xe2\x40\x47\xb8\xd4\x2e\x6d\x60\x45\x6f\xf5\x29\x93\x91\x7b\x94\x89\x72\x23\xa4\xd6\xfb\x18\x38\xf2\xca\x5d\xfb\x1b\xe3\xb3\x76\xce\xd7\xdb\x98\x2c\xdf\x63\xac\x99\x98\xc0\x31\x2b\x16\x32\x9d\x09\xc8\x47\xa9\xa0\xfb\xba\x2a\x0b\xc2\x70\x01\x75\xb7\x9b\x8b\x70\x07\x8c\x41\x8b\x7e\xa2\xd7\x7b\x2b\x6a\x67\x94\x6b\x00\xca\xdd\x19\x81\xcd\x89\xef\x71\xa7\x59\x96\x0d\x3a\x55\x1d\xa8\xa9\x22\x1a\xa0\x5c\x03\x80\x52\x4e\xe8\xd7\x37\xcc\x70\x67\x25\x5b\x46\xa0\xa4\x90\xb9\x84\x9d\x5d\xed\x8b\xcc\x54\x90\xad\xf4\x95\x74\xd0\xad\xd3\x2c\xb5\x29\xfe\x6b\xb9\x81\xf8\x41\xe2\xff\x6b\x57\x95\x9b\xac\xa9\x13\xce\xb0\x15\x77\xf0\x57\xf8\x80\xbb\xdc\xa3\xf0\x0f\xa9\x96\x40\x29\x30\x3c\xbc\x2b\xab\x66\x0f\x02\x19\xab\xb2\x6e\x12\x4f\x1d\xb7\xaf\x96\x30\x16\x4d\x29\xca\xf9\x56\x4d\xf6\x00\xc2\xc0\x03\x15\x43\x0f\x10\x55\x01\xda\xcd\xd6\x2d\x4a\x44\x73\x03\xdb\x41\xcc\xd9\xe1\x67\xc0\xb9\x83\x52\x6a\x91\x8d\x85\xa0\x49\xe8\x99\xd8\x78\x0d\xd2\x91\x29\xb3\xab\x2a\x2e\x41\x89\x77\x2d\x6f\xc6\x18\x81\xc7\xe6\xe0\x27\x7d\xe6\x39\x5e\x95\xfa\xa9\x0d\x09\xeb\x02\x6e\xe0\x3a\xda\x53\x34\x09\x47\x51\xdd\x98\xc6\x9e\x95\x9b\xb3\xe6\xde\x9e\x99\xaa\x51\x3e\xb1\x1a\xae\x33\xa6\x8e\x88\xc1\xd7\xe8\xfe\x11\x54\x17\x17\x03\x57\x54\xec\x6b\x04\x06\x2c\x2d\xa4\x8a\xb1\xc8\xc8\xdd\xbb\xc1\xe4\x27\xba\x28\x03\x60\x0e\x69\x90\x70\x1d\xfb\x17\xac\xed\xc6\xae\x1a\x7e\xc7\xda\x36\x70\x13\x74\x0b\x55\x75\x8b\xd9\xc4\x0e\xf5\x35\x65\x01\xf9\xb4\xae\xcc\xa3\x0f\x24\xb7\xeb\xde\xd4\x8b\xea\xde\xb4\xa8\x7b\xc3\x02\xc1\xb8\xf0\xcd\x9b\x4b\xbc\xc6\x12\x4f\x4b\xa8\x35\xeb\xe0\xb2\xda\x8e\xae\xe0\x5e\x8a\xe9\x5d\x60\xc8\x30\x9f\xdf\x9b\xc3\x83\xf8\x4b\xb7\x90\x8c\xa0\x06\x28\x90\xda\xd4\x51\xf9\x18\x16\x6a\xdc\x95\x25\xa0\x20\xbf\x22\x2e\x84\x75\xb8\x21\x8c\x0e\xae\xa9\xa7\x5d\xcd\x1a\xb1\x86\x51\xa8\x1a\x19\x52\x00\xac\x82\xa9\xc2\x9d\xad\x6a\x82\x65\x93\xcf\x9a\x01\x2c\xfc\xa7\x96\x65\x67\x58\x51\x20\xbf\x82\x1b\x02\x34\x66\x63\xb2\xe6\x3e\x91\x27\xbd\xf0\x65\x10\x39\xe9\xeb\x30\x8e\xa1\x9d\xf4\x69\xc0\x96\x67\x1d\x9b\x46\xc8\xa4\xe7\x50\x9d\x03\x68\xf8\x9b\x97\xec\xa7\x38\xf8\xe1\x7c\x09\xbb\xf6\x45\x2f\x11\x74\x2c\x28\x25\x8b\xc2\x02\x32\xae\x80\xa8\x30\xab\xac\x11\x6e\x4c\x24\x87\x60\xbc\xf1\x58\x93\xc6\x61\x30\x03\x10\x10\x70\x03\x78\x06\x03\xf8\x3f\x34\x07\xca\x65\x3a\x5a\x7e\x9a\xbf\xa1\x10\xae\x41\xe8\x24\x26\xa3\x7b\x30\xf9\x9e\x6a\x79\xa0\xa4\xcf\xed\xd6\xda\x6c\x20\x5f\x51\x94\x0f\x06\x41\x73\x55\x38\xee\x91\xe5\x38\x55\x6a\x8e\xd0\x98\x15\xd5\x0f\xca\x59\xf7\xaa\x32\xf4\xed\xfe\x01\x04\xc7\x0e\xb1\x9f\xc5\x41\xdb\xaa\xc2\xda\x58\x5c\x0e\x10\x4c\xe1\x4a\x44\xee\x8e\xf3\xad\xab\x6a\xbf\x43\xf7\x2d\x7a\x74\x89\x65\x30\xa6\x01\x86\x1f\x1f\x82\x12\xa6\xa2\x7c\x44\x9e\x9c\x5d\x70\x17\x82\x9a\x7e\xb1\xc9\xee\x28\x10\x83\xd6\x8a\x61\x1e\xf0\xf2\xad\xb5\x4d\xfb\x75\x72\x8b\xc1\x02\x7a\x1b\xaf\x7c\x3f\x06\xb4\x65\xc2\xc1\xca\xb3\x9f\x1f\x8e\x8f\x4f\x10\xe6\xf1\x57\x5d\x50\xac\x11\x7a\x96\x4f\xdc\x1c\x65\xa2\x46\x19\xcf\x3c\x2c\x65\x8b\xc3\xa2\x8c\x7f\x0a\xf7\x2b\xac\x68\x6d\x4f\x6a\x56\x23\x69\x52\x44\x5e\x2c\xee\x2c\xe5\xa3\x87\xcb\x84\x6d\x54\x51\xd9\xf8\xde\x8b\xcc\xb0\x23\x11\x4e\xe3\x8e\x8e\x67\x14\xb5\x17\x47\x75\x56\xc8\xfb\x33\xb9\x47\x49\x04\x6a\x69\x17\x74\xf7\xdc\x4a\x52\x3d\x71\x57\xd0\xe6\xde\xe6\xd6\xb9\x20\xf5\x7d\xb9\xcf\xd7\x9e\x1e\xcf\xb7\x2a\xfe\x76\x9f\x9b\xd0\x1a\x21\x34\x9b\x7c\xec\x67\x0d\x73\x91\xd3\xa1\x0b\x4d\xa3\x6a\xa2\x6f\x60\x33\x09\x86\x0e\xb1\x22\xbb\x41\x36\xb0\x79\xeb\x0a\xdb\xf3\x1b\x7f\x63\xc5\x2b\x11\xd4\x8d\xa2\xb0\xcd\xd9\xf2\x70\xe6\xfe\x9f\xd0\x93\xf2\xb6\xd2\xf1\xd7\x3b\xd7\x16\x15\x13\x14\x6f\xed\xb6\xac\x4c\xb1\xde\x03\x48\x93\x52\x4e\x28\xfe\x9a\xb6\x96\x3a\xaf\x0c\x8e\x82\xa8\x78\x65\xb4\xb0\x54\x62\x13\x89\xf8\x32\x28\x40\x74\x67\xaa\x0c\x15\xf5\x59\x4d\x75\xe3\xad\xf7\xd9\x6f\xc0\x79\x49\x1e\x05\xc0\x9b\xdb\xe7\x05\xbd\x3c\xae\xd6\x42\x0d\xa4\xa3\x6f\x32\x41\x78\xb0\x55\x1b\xfb\x5a\x9f\x49\x6a\x7b\xa5\xce\x5f\xa7\xe7\x1d\x9a\x66\xc3\x14\xf3\x6d\xef\x9e\xae\xa2\x12\x1e\xe9\x31\x63\x12\x71\x00\x51\x95\x43\xcc\x84\x2d\x38\xb3\x5b\xe9\x30\x67\x1a\x9a\x83\x3e\x7d\xf3\x7a\x80\xac\xdb\x00\x64\x21\xf1\xc3\xe0\x1d\xd5\x84\xf1\x6b\xda\xb5\x1f\x08\xce\xde\x1a\x22\x4f\xf5\x29\xd0\x14\xba\x77\xa1\x87\x51\x84\xb6\x6e\x97\x6b\x70\xb3\x82\x03\xac\xf3\xb2\xb8\xb3\x95\xdb\xc2\x21\x55\xae\x58\x52\x85\x82\xf5\xb8\x7a\x64\xe6\xbc\x47\xce\x0f\xe1\x9c\x92\xba\x1a\x6f\xb3\xa8\x1a\xcd\x60\xd9\x5e\x42\xea\x4e\x3e\x3c\x42\x61\x03\xef\x35\x5f\x5b\x15\x8e\x4a\x56\x71\x2d\x05\x8c\x97\x90\x66\x7e\x69\x8a\x43\x4b\x14\x99\x5f\x34\xe7\xfa\x2c\x26\x08\xe5\xa0\xef\xf9\x79\x7a\xae\x47\x7f\xb9\xbc\x9d\x03\xb3\xef\xe8\xd7\xd1\x64\x31\x57\x6a\x42\xe7\xc6\x0d\x18\x7b\xef\x30\xba\x5d\x95\x77\xb0\xd5\x6b\x0b\xa2\xe8\xce\xcb\x0e\x37\x54\xba\x33\xaa\x38\xa3\x1f\xd9\x56\x96\xb9\x84\x77\xc2\xdd\x24\xac\x5f\x44\x25\x6f\xcd\x5f\xed\x1e\x2f\x99\xee\x82\xa5\x80\x59\x71\x8d\x27\x88\xb3\xea\xb5\x33\x75\xe0\x25\x12\xc1\x28\xc6\xd4\x29\x7d\xce\x50\x69\x02\x23\xcb\xf3\xdb\x57\x45\x40\xd6\xa7\xca\x56\xa4\x82\xd8\xb8\xff\xf6\x38\x38\x18\xcf\xc2\x36\xce\x73\xad\x13\xfe\x37\x00\x0f\xe7\x07\x67\xe2\x3c\x0e\x5d\x19\xfd\x90\x55\x7b\xb8\x12\x98\xd5\xd7\x04\x3f\x46\xc4\x91\x6e\x0f\xde\x05\x7e\x57\x5a\x8f\xce\x69\x4d\xd0\xa1\x31\xb9\x5b\x87\xa6\x6e\x80\xae\xe9\xd1\x34\xb6\x22\xaf\x37\xd1\xd6\x54\xcd\xfd\xbf\xee\xcd\x57\xf7\xf4\x26\x73\x83\x01\x18\xeb\x1a\xef\xfb\x6e\xf5\x7e\x25\x6a\xcb\xdc\x2c\x21\x7b\x59\x59\x77\x59\x7d\x34\x55\xa2\x6c\xb3\x72\x5b\xe8\xdc\x6d\xa1\xe2\xe0\xe7\x67\x79\xd0\x72\x82\x13\x10\xc4\x15\x90\xba\x72\xb5\x32\xf4\x01\x50\x8a\x7b\x28\xbf\x5a\xf7\x80\xf2\x0f\x6c\xda\xb1\x23\x5c\x76\x7c\x53\xdd\xf7\x87\x7c\x97\x18\x2f\xaf\x76\x95\x85\x6b\x5a\x4d\x90\x02\xa3\x1f\x4d\xe6\xcc\x25\x59\x2b\x78\x08\xae\x72\xb4\x02\xc9\x6a\x79\xf0\x20\x35\x09\xa2\x9e\xbe\x11\xa7\xf5\x40\x14\xd1\xe5\x07\xec\x39\xba\xd6\x61\x0f\xae\x5c\x53\x72\xa6\x9a\x04\x5e\x9e\x3a\x76\x0d\xec\x43\x56\xba\xa9\xe4\x9f\x00\x25\x88\x75\xc3\xa5\x98\x37\x1f\xc2\x04\x26\x4f\xa2\x43\x8e\xa3\x18\x68\xd0\x1e\x3c\x4b\x86\x33\xff\x54\x6d\x96\xf0\x6e\xa5\x93\x1d\x4b\x78\x31\xb5\x1b\x2e\x54\x21\xb5\xc3\xaf\x87\x8e\xf2\xfb\x25\x55\x2f\x0c\x00\xbe\x3b\x55\x93\x52\x87\x12\x56\x9f\x99\x61\x7e\xd3\x27\x70\x88\x34\x7b\x81\x54\x54\x60\x50\xea\xde\x3e\xb2\xc6\x01\xd8\x5f\x88\x8b\x65\x05\xa8\x0a\xf0\xad\xb5\xce\xee\x0a\x2f\x0a\x98\x55\x7a\xbd\xcf\x0f\x12\xb5\xe4\x2f\x65\xc8\x9b\x85\x73\xf5\x36\x3e\xc7\x08\x73\x23\xd6\xe5\x91\x65\xa7\x1f\x2d\x5a\x1d\xe6\xcc\xf5\x34\x0f\x50\x52\x06\x63\xb1\xd9\xbb\xab\x83\xcc\xb3\x19\x8c\x91\xe5\xf6\x2e\x83\xf2\x66\x52\xe1\x4d\x70\x54\xbb\x7f\xab\x40\xa3\x97\xfd\x2c\xfb\x60\xb2\x3c\x44\x80\x79\x60\xf0\xaf\xbd\x36\x57\xe0\xbb\x30\x5b\x5b\xac\x31\x8e\x58\x97\x74\x1d\x92\xaa\x31\x47\x3e\x0a\x4d\x4a\xf5\xd0\x5d\x48\xd8\x63\xe6\xce\xa3\x2b\x46\xc7\x49\x38\x33\x65\xc4\x3e\x2b\xe0\x98\xa1\xdb\xba\x69\xb3\x37\xdb\x56\x52\x58\xa1\xdc\x95\xa9\x81\x90\xd6\x34\x75\x89\x87\x60\xfb\x4e\x1e\x1f\x6b\x10\xe3\xa4\x52\xc4\x12\x37\x39\x7c\x35\x15\xa7\xcc\x3b\x7d\x3d\x9c\x7c\xbc\x1d\x7e\xec\xd4\x4a\x65\xc4\x9c\x87\xe7\x1c\xe0\xb8\x88\x83\xce\x8d\xed\xa8\xb8\x03\x59\x41\xf7\xef\xf0\x77\x1e\x4f\x01\x17\x15\x2a\x41\xdc\x37\xf7\x90\x0b\x6c\x1d\x7b\x17\xfa\x4c\x4f\x46\xbf\xe9\x5f\x47\x33\x48\x75\x32\xe9\xbe\xa0\x22\x3c\xbf\x48\xcf\xc1\x36\x62\x54\xa1\x07\x5b\xb7\x27\xea\x9f\x36\x2a\x43\x66\x19\x5b\x68\xbd\xf3\x8b\xf4\x42\xcf\xb9\x46\xc1\x53\x0a\xde\xa3\x8a\x18\x3a\xee\x8f\x04\x0f\xee\x62\x8b\x32\x5f\x03\x44\xa1\x2c\x77\x5e\x72\x42\x44\xf2\x4b\x34\x5d\x72\x3b\x2f\x80\xf7\x78\x5f\xea\x40\x72\x45\xe1\x08\x85\x07\x73\x56\xae\xc9\xa1\x63\xd1\xc6\xfd\x6e\x0d\xe0\xf4\x5e\xc1\xc6\x68\x91\x78\xdd\x22\x25\x92\x15\x2c\xc0\x88\x05\xbb\x3d\x0c\x27\xe8\x4b\x52\x4d\xb7\xfb\x42\x56\xd7\x7b\x5b\x23\x6d\x11\x18\x7b\x80\x8d\x47\xa5\xcd\x38\x8e\x6f\x60\x72\xbc\xdb\xdc\xa5\xf2\x30\xe4\x97\xb7\x70\x2f\x31\x05\x0f\xb0\xc0\x2f\x65\xd3\xf2\x43\xcf\xbb\xbc\xb9\x3e\xfa\x32\x40\xd6\xf5\x55\x46\x3f\x09\x07\xf2\x71\x9f\xf4\x4d\xfa\x56\xff\xf3\x3f\x71\xb0\x00\x6e\x28\x8c\xad\xf0\xab\xf6\x8d\x3e\x23\x71\x82\xf1\xe4\xa3\xbe\x1e\xfe\x06\x05\x88\x52\x50\x41\xa9\x73\x2e\xcb\x8d\x96\x8d\xe4\x60\x0b\x3c\x8e\x78\x61\xf2\xa7\x13\x73\x01\xdb\x62\x6d\xcd\x43\x59\xb9\x45\x51\x5b\xfb\x15\x9c\xac\x2d\xd9\x46\x50\xad\x15\xfa\xe3\xce\x3f\xf1\xe7\x21\x39\xce\xbb\x7d\xc3\x2e\x31\x4c\x6f\x95\xd5\x56\xad\xf7\xbe\xf6\xa7\x27\x6d\x10\x6d\x92\x37\xe9\x85\xfe\x60\xb2\x1c\x8f\x8c\x9e\x6f\x33\x73\xdc\x63\xa9\x4f\x2f\x06\x7a\x5b\x16\xcd\x7d\xed\x36\x15\x47\xab\xb3\x4a\x94\x0d\x23\xa3\x24\x1d\x4c\x76\x6b\xab\x3b\x5b\xac\x0e\x51\xe0\xdd\xad\x20\x6f\x91\x13\xc6\xe3\xf4\x77\x2c\xa2\xa8\xf7\xb2\x51\x64\xea\x01\x87\x02\x74\xe9\x74\xd0\x4b\x9a\x74\x56\xe5\xc2\x33\x6b\x9d\xe5\xd9\x9d\x5b\x2a\xe0\xc9\xa4\xfa\x9c\x98\x94\x34\xdc\x67\x31\x4d\x7d\x69\x4f\xcd\x40\x5f\x9e\x16\x55\x3d\xd0\xe3\xd3\xa2\xca\xcc\x40\x5f\x9f\x96\x77\xd9\x2a\xb3\xb9\xfb\xd7\x6c\x59\xd9\xc1\x7f\x7b\x02\xe4\xf4\xbb\xcf\xe3\xc5\x99\x2d\x0a\xf3\xf7\x62\xff\x7d\x8e\xff\xf7\xf5\x9b\x8b\xd7\x6f\xdb\xfc\xbf\xe7\x3f\xfc\x83\xff\xf7\x3f\xe5\x9f\xcb\x72\x77\x40\x1f\xfd\xf4\x72\xa0\x2f\x5e\xbf\x7e\xad\x2f\x4d\x55\x3b\x8f\xf9\x93\xc9\x9a\x7f\xcb\x89\x2f\xfd\xc1\x54\xe0\x62\xaf\x24\xdd\xf8\xa9\xbb\xdd\xa3\xdc\xdf\x7c\xa0\xd4\x8d\xbb\x48\x63\x8d\x5c\x56\x47\x15\xc2\x76\x9d\x74\x0a\x82\xc8\x4c\xd1\x21\x5e\x2e\x43\x95\xfc\xaa\xdc\x1d\x3c\x80\xb7\x16\xd8\x00\x49\x48\x18\x93\xc2\x20\x71\x0c\x28\xcf\x9d\xf0\xc9\x73\x32\x48\x10\x07\x60\x72\x95\xb5\x93\x55\x14\x21\xe6\xfa\x78\xb0\x01\x21\x37\xd0\x55\x2d\x90\x09\x02\x8e\x49\x48\x62\xc8\x44\x83\xf9\x4a\x42\xa5\x56\x38\xab\xe0\xa8\xf1\xc4\x90\x0c\x2c\xb1\x79\xae\xfa\xeb\x78\x7c\x59\xff\xce\x0d\x68\xe3\xb3\x27\xc0\x19\xd5\xca\xc0\x53\x61\x54\x81\xca\xaf\xae\xbb\xa5\xae\xcb\xce\xe1\x16\xca\xaf\xc3\x15\xe2\x67\xe2\xda\x5d\x96\x0f\xc8\x5e\x80\xeb\x80\x22\x40\xe8\x25\x3b\xc7\x26\xcc\x2a\xfd\x95\x37\xb3\x04\xc7\x75\x5e\xa0\xc2\xfc\x64\x6f\x59\x12\x13\xaa\x5d\xb6\xbe\x81\x89\x65\xcf\xcd\x83\x55\x6a\xf9\x41\xf1\xd4\x3a\x37\xd1\xa7\x55\xd0\x31\xd8\xd7\x90\xab\x47\xff\x21\x90\xea\xf8\x45\xe2\xe3\x56\xa8\x80\xb3\x51\x45\x44\xbc\xac\x3b\xab\x8a\xef\x42\x41\x74\x80\x9b\x41\x22\x33\x5c\x8f\xa7\xe2\xa6\x00\xad\x10\xdd\xc8\x3b\xfd\x4a\xf4\x67\x53\xec\x4d\x5e\x27\x44\xda\x92\x11\xc1\xe7\x67\xa8\xa0\xcb\x8a\x3b\xdf\xc7\xda\xab\xa6\x45\xeb\xd9\x17\x76\xe0\xad\x08\x45\x5c\x20\x65\x27\xf8\x24\xa2\x9e\xa4\xb1\x7c\x4c\x10\xea\x97\x54\x86\xbe\xdb\x30\x74\x79\x56\x7c\xad\x43\x6d\xc6\xb2\x32\x50\x19\xeb\x53\x49\x8c\x42\xf5\xbf\x3a\x85\x12\x88\x15\x0b\xd4\xad\x0f\x05\x78\x00\x79\x7e\x18\x24\x7a\xb9\x6f\x22\x45\x98\x5a\xe8\x48\xc3\xfb\x52\xa5\x6e\x72\x6b\x9c\xbb\x69\x49\x06\x79\x7a\xf3\x65\x3c\xf9\x98\xde\x5c\x0f\xc7\x13\xae\x81\xc8\x4d\x56\x9c\x59\xba\x43\xd8\x6f\xbb\xdc\xb4\xa4\x2f\x49\xf4\x05\x57\xd5\x2b\x52\x2a\x00\x6c\xe0\xa7\x51\xbf\x0a\x2e\x89\xdd\x06\x41\xb2\x23\x32\xb7\xa8\x6f\xab\xa7\x33\xd5\x55\xb7\xd5\xef\x6f\x17\x20\x4f\x05\x8a\x55\xa3\x2b\xd6\xda\x12\xfa\xb6\xd3\x0f\x42\xb4\x16\xe0\x3b\xa0\x5b\x3b\x19\xcd\xe7\xc7\xb5\x6b\x9d\xa3\x38\x99\x4e\x48\xbb\x16\xae\x38\xa9\x1e\x4f\xf4\x64\x8a\xa1\x3d\x12\x0d\x83\x3b\x10\x5a\x5a\x15\xa4\xdc\x58\xbc\x0d\x74\x2f\x12\xa9\x6f\xc6\x75\x06\xbe\x21\xac\x62\x07\xaa\xb4\x7a\x88\x4e\x29\x28\xca\xb1\x70\x1d\xe8\xdb\xc5\xea\x75\xc3\xd9\x78\xce\xa2\x63\x89\x76\x23\x37\xfd\x00\xe2\xbf\x13\xf7\xbb\x09\xca\xcb\xc2\xa8\xc6\x83\x3f\x45\xe4\xee\x2d\x6a\xf3\x62\x5b\xae\x46\xc3\xeb\xf1\xe4\xe3\xdc\xfd\x58\x3e\xfc\x0f\x91\x88\xff\xca\x7f\xd2\xef\x86\x1f\x6f\xae\xcf\xce\xd3\xd7\x67\x6e\xf3\xfe\x5d\x9c\xc0\xa7\xfd\xbf\x37\xdf\xff\x70\xde\xd1\x7f\xf8\xfe\xcd\xc5\x3f\xfc\xbf\xff\x8c\x7f\x86\x1f\x3e\x8c\x66\x53\xfd\x71\x34\x19\xcd\x86\xd7\xfa\xe6\xf6\xfd\xf5\xf8\x92\xeb\x93\x82\xec\xc3\xb9\x3b\xd2\xaa\xd5\xbd\xf3\x10\x2f\x94\x0a\x27\xde\xff\xf9\xdf\xf0\x47\x5c\xa7\x82\x84\x66\xef\xce\x5f\xbb\xc3\xb3\x5a\xeb\x79\x53\x59\xdb\xe8\x33\x3d\xdf\x67\x8d\xd5\x17\x17\xef\x12\x3d\x37\x05\x92\xa0\x67\xf5\xaa\x4c\xf4\xe5\x50\xff\xf4\xf6\xfc\xf5\x0f\x89\xbe\x9d\x0f\x89\x8d\x37\x0f\xfa\x64\xc7\xa4\xe1\x9f\x64\x91\xf3\xde\x8c\x72\x5e\xed\xf9\x4f\x3f\xfe\x94\xe8\xf3\x9f\x7e\x3a\x3f\xca\xc4\x96\x40\xcb\xd1\x15\xe0\x64\x4d\x56\x09\xdf\x27\x55\x24\x9a\xaa\x2f\x4e\xd7\x83\xe0\x67\x20\xb1\x30\x04\x06\x1f\x6c\xc5\x09\xca\x90\x39\x7f\x80\x78\x87\xe7\x84\xa6\x84\x44\xaa\xd4\xe8\xc1\x56\x87\xb2\x80\x3e\xa2\x9f\xd7\xf0\x8b\x76\x87\x76\xe0\xea\xc1\x56\x4b\xd3\x00\x6e\x33\x8a\x60\x31\x61\x3b\x3b\x0f\x78\x0a\xaf\xee\x4d\x71\x87\x84\xf6\x2c\xdd\x0b\xa5\xc8\x78\x04\x13\xeb\x3c\x3a\x7f\x81\x1b\x18\x02\xb6\x75\x23\xfc\x6d\x77\x13\xb6\x14\x14\x76\x67\x3a\x30\x33\x3c\x9a\x83\x3e\x94\x7b\xac\xef\x5f\x3b\x67\xb4\x74\xfe\x60\x85\xe7\x31\x7c\xd9\xea\xac\x49\xf5\xfb\x03\x29\x5f\xd5\x84\xc2\x7a\x9a\x5b\x4f\x28\x0e\x39\x2f\xf6\x6e\x6f\xe0\xde\x60\xfb\x3f\xa6\xc5\xc7\xe0\x5e\xc1\xad\x3e\x3b\x63\x0e\x89\x7a\x4f\x92\xce\x75\x07\x42\x42\x69\x03\xa2\xc9\xaa\x6a\xf2\xf4\x5a\x2d\x82\xb0\xb3\x25\x1e\xd6\x1a\x32\x59\xd8\x85\x57\xad\x4b\x09\x63\xf4\x38\xd6\x0b\x2c\xaf\x98\xf3\xe4\x50\x1f\x42\x52\x91\x84\xc6\x79\x7f\x6e\x80\x4e\xe7\xe5\x96\x19\x1c\x69\x6c\x64\x53\x57\xa4\x7b\x45\x81\x09\xb7\xd8\xaf\xc1\x45\x3b\xb4\x86\xd0\x8b\xe9\x65\x45\xdd\x58\xb3\x4e\x07\x20\x20\xb5\x32\x05\xf9\x7e\xf8\x61\x18\x47\x6a\x1d\x24\x89\xca\x94\x4a\x2e\x1f\x41\x1b\xce\x00\xc3\x7f\x34\x98\x89\xfb\x2b\x04\xab\x6d\x6c\x55\x51\x21\x2f\xcd\x45\x42\x98\xc5\x6c\xc5\xa2\x7e\xc7\x67\x56\x2e\x23\x3f\x39\xe8\x83\x1e\xca\xbd\xa0\x6f\xc6\x57\xab\x63\xb4\x0e\x51\xeb\x50\x96\x0c\x6f\x93\x04\x16\x74\xbe\x2a\x02\xe5\x75\xb6\x71\xaf\x56\x8f\x59\x7d\x3f\x48\xc2\xa7\x2a\xbb\xb2\xd9\x43\x5c\xda\x5a\x56\x30\x58\x77\x16\x71\x65\xf0\x43\xfd\x08\x0a\xe0\x4d\xf8\xa9\x72\xcf\xd0\x92\x8b\x96\x15\x4a\x15\xe8\x5d\x66\x57\x96\x70\xe3\xee\x6e\x00\x0c\xab\x15\x10\xa8\xe1\x98\xff\xe2\x69\xca\x95\xfb\x80\xbb\x4c\xc0\x97\xdc\x7b\xd7\xe0\x32\x43\x94\x3e\x2b\xee\x00\xfe\x57\x72\x44\x19\x67\x8e\x89\xfe\x1f\xad\x2e\xac\x18\x49\x71\x81\xa5\xc0\xde\xa6\xac\x96\x19\x90\xe7\x38\xeb\xd2\x94\x6a\x6d\x0b\xd8\xb3\xf4\x09\xc6\x3a\x40\xee\xdb\xd4\x5f\xf1\xaf\x4a\x37\x27\x95\xf5\x31\x55\x7c\x8a\xe3\xc3\xf2\x2b\xca\x33\xc8\x80\xb5\x22\xf5\x86\xa8\x48\x20\x23\x83\xe2\xde\x4c\xe3\xd9\x37\x9f\xd1\xf6\x84\x6c\x34\x3d\x4c\xc9\x7e\xe0\x79\xfb\x00\xf8\x48\xb3\xdd\x01\x85\xf4\xf1\x97\x51\x36\x99\x87\xdb\x27\x00\xf5\x5d\x65\x9a\xcc\xf5\x97\xf8\x14\x80\xa0\x04\xbe\xe2\x2e\x93\x77\x19\x47\xdb\xed\x2a\xdb\x65\x48\x6d\x15\xa3\x08\xa3\x75\x0a\xf2\x7b\x28\xd9\xdf\x5a\xc9\xcd\xbd\x05\x5e\xfc\x32\xf1\xab\x4c\xac\xac\x26\xae\xa7\x4e\xf5\xb0\x58\xc3\xb2\x82\x57\xd5\xf7\xe5\xa3\x7b\x64\xcb\xcb\x00\x32\x7e\xc0\xbb\x6a\x0f\xb8\x54\x88\xe7\x1f\xa7\x45\xa9\xdf\x6c\xdf\xfa\xa0\xb3\xeb\xb1\xd4\x75\x63\x77\xf5\xcf\xfa\xf4\x7c\x20\xae\xf6\xf1\x78\x03\x0c\xfc\x62\xa0\xb0\x0c\x04\x17\x88\x38\x7b\x11\xab\x7a\x07\x12\x39\xee\x2f\x09\x14\x1d\xa2\x01\x5e\x1a\x23\x4c\x07\xd7\xb0\x88\xd2\x4a\xc1\xfc\x33\xcc\xeb\x12\x0b\x19\x21\x25\x81\xc6\xf1\x55\x2d\xe5\x84\x40\x4f\x60\x5f\xe1\x42\x7f\x24\x6c\x11\x0c\x34\x2f\x34\xd8\x40\x96\x0f\xcf\x00\x33\x0a\xa8\x4b\xb4\x9f\x45\x19\xc8\x04\xbc\x75\x88\x0c\x48\xaa\xc7\x9b\xce\x09\x21\x93\x35\x75\xb9\xb5\xee\x23\x36\x27\xa5\x83\x9d\xa9\x6b\x80\x4f\x85\xe6\x21\x7a\x96\x97\x8e\xb3\x5c\x34\x5b\xa6\x81\x74\x1c\xce\x20\x58\x38\xa1\xa2\x4f\xb4\xdc\x79\xc2\xdc\xba\x7c\xc5\x5f\xe6\x76\x0b\x27\x21\xa9\x20\xb8\x3b\x38\x1c\x11\x35\xc2\x16\xdd\x0b\x2a\xbb\xc9\x01\xd2\x56\x44\xef\xe2\xc3\xe6\x95\xae\xec\x6e\x4f\x7c\xcf\x6e\x03\xb9\xbf\x64\x70\xbf\xb4\x48\x58\x19\x59\x59\xd3\x58\x67\x9b\x21\xc5\x6d\x20\xcd\xb2\x14\x91\x02\xe2\x7b\x4b\xf5\x6f\x16\xac\x29\x58\x8d\x87\x32\xc3\x1c\xea\xda\x00\x66\x07\xba\x20\x50\x74\x94\xde\x32\xf1\xf7\xa0\x07\x81\x2c\x3b\x3f\x28\x8c\xfa\xd1\x37\xbc\x33\x02\xf0\x54\x4c\x8e\xba\xb9\xf7\xc9\x09\x7a\xcd\xae\x2a\x77\x55\x66\x1b\x53\x1d\x52\x0d\x76\x12\x72\xcf\x00\xfc\x86\x89\x81\xd1\xc6\x0c\x77\xa3\x57\xb9\x35\x95\x18\x63\xfc\x14\x07\x92\xe8\x93\x04\xc3\xa6\x55\xf5\xaa\x56\xd0\x6e\x52\x00\x76\x63\xee\x9f\x33\xe0\x4b\x11\x3e\x7b\xe7\x66\xbe\x7e\xa2\x7c\xd8\xed\x0f\x66\x15\x8b\xd9\xa5\x22\x0c\x22\x46\xe7\xdc\x4b\x47\xb3\xcf\xa8\x45\x7f\x39\x9d\x5c\xa1\x96\x02\x0a\x5b\x62\xa4\x24\x89\x69\x14\xdc\x83\x31\x8d\xd0\x6b\xf2\x65\x7a\x9c\x18\x5a\x61\x30\x84\x5e\xe7\x18\xd5\x25\x61\xa7\x53\x60\xa9\x0e\xb2\xba\x80\xb4\xf0\x1e\x48\x30\x23\x24\x79\x51\x03\x4b\x1a\x57\x0a\x2d\xfb\x32\x7d\x1e\xbd\x10\xf8\x18\x9e\xf2\x02\x31\xed\x75\x72\x83\xad\x3c\x49\xf4\xd2\xe6\xe5\x63\x82\xfe\x07\x77\x42\x31\xf0\x92\x7b\xe2\xfa\x80\xd6\xcc\xe8\x13\xe8\xd0\xd2\xe0\x36\xc5\xdc\x0f\xbd\x8d\x78\xf2\x28\x66\x27\xfe\x86\x8b\x3f\x80\xc1\x1b\x33\xf8\xf0\x16\xec\x42\xe8\x76\x6e\x1e\x7f\x0e\x72\x75\xa5\xeb\x3f\x14\xc3\xb9\x67\x43\x54\x4e\x89\x37\x63\xee\x71\x57\x56\x1c\xbf\xca\x02\x7b\x96\x77\xe9\x09\xf9\xdd\xa2\x5a\xa3\xe2\x4d\x7f\xd6\x12\x33\xbb\x29\x70\xde\x58\x62\x36\xd5\xa7\x9f\x02\x0d\x55\x44\xfc\xae\x43\xf0\x72\xcd\x01\x6d\x25\x02\xda\x14\x12\x07\x56\xcd\x13\xf9\xf1\x93\x74\xa0\x47\xce\x40\xe7\x92\xbd\x86\x74\xaf\xa1\x3c\xea\xe4\x50\xee\x4f\x9c\x41\xf7\x15\x34\x12\x8f\xfe\xb2\x45\x8f\x99\xbd\xb2\x61\x47\xd7\x47\x1b\x69\x2d\xfc\xa2\x3d\xa3\x39\xc3\xc6\x00\x74\xbe\x2a\x77\xb4\x4e\x0c\xc2\x7a\x89\xa4\x2f\x9a\x51\x32\xb5\x81\xfd\x36\xa0\x3e\xca\x7d\xb3\xdb\x37\xa1\x7a\xe6\x26\x18\x43\x76\xb9\x21\x8a\x99\x01\x7e\x09\xa4\xa5\xc1\x29\x90\x82\xa7\xfa\xe8\x2a\xd3\xa7\x59\xb1\xb6\x3b\xe7\x47\x21\x2a\x4e\x60\x03\x15\x98\xa4\xe5\xa1\xaf\xc5\x83\x54\xff\x46\xfe\x8a\x5f\x61\xd5\xde\x5d\xc0\xdc\xbb\xa0\x2c\x99\x4f\x13\xdf\xc9\x75\x89\x20\x1c\x54\x04\x76\x7b\xf0\xc5\x57\x47\xff\x12\xb8\xcb\x04\x7e\x1a\x53\x47\x5e\x72\xd6\x84\x12\x71\x62\x8b\x8b\x19\x87\xc0\x7f\x2d\x8b\x7a\x97\xad\xf6\xe5\x1e\xaa\xc0\xdc\x36\xdc\xa1\x89\x36\x8d\xcd\x0f\x8a\x01\x0b\x65\x81\xc7\x3e\x35\x52\x3e\xd5\x9f\x7d\x60\x98\x30\x96\xed\xf3\x61\xfe\x8b\xfa\x6a\xed\xce\xed\x06\x37\xff\xec\xaa\x51\xe0\x9d\x0f\x22\xaa\x6b\xed\x28\xeb\x52\x68\xda\x2c\xa1\xa2\x48\x11\xc2\xdc\xbf\x1a\x9e\x01\x8f\x30\x5c\xe8\x84\x5f\x18\x0f\x5d\xc4\x81\x24\x34\xcd\x4d\x5e\x52\x06\x49\x3e\x9d\x2a\xe5\x67\x09\xaf\x2c\xe0\x89\x86\x2a\x27\x26\xaa\xa6\x55\xed\xa9\x55\x43\x4a\x0c\xd7\x30\xf8\x8c\x06\x94\x4a\xc0\xf1\x2b\x77\x64\x5c\x5c\x9f\xbd\xc7\x23\x5c\x2a\x77\x96\x7e\xe3\xbb\x32\x7b\xc0\xc8\x0b\xca\x2d\x22\x77\x0d\xde\x87\x7d\xaa\xfa\x97\x0b\x27\x2b\x62\x93\xa6\x9a\x7b\xd4\x62\xdb\x12\x32\xf0\xd8\xee\x60\x2c\x5d\x77\x95\x62\x99\xb5\xb4\x80\x8a\x2c\x7b\x1f\x73\x0a\x87\x62\xce\x35\xd1\x4a\x77\x57\xa5\xc9\xeb\x12\xeb\x30\x4c\x9e\x13\x74\xb4\xb6\x71\xf6\xcb\xe0\x4d\x19\x7c\x81\x00\x92\xf2\x1e\x20\xe6\x14\x3d\x57\xe7\xae\x2a\xb7\x19\xf0\xb6\xf2\x62\x0b\x84\x50\x74\xa7\xc3\x51\xe6\xfa\xe2\x9c\x80\x85\x8d\xa0\x8f\x84\x02\x4b\x78\x2a\x55\x6a\xd9\xf9\x3e\xac\x46\xd7\x69\xdf\x8f\x58\x29\x3b\xd0\x40\x82\x91\x28\x08\xc2\x55\x56\x8a\x0a\x7a\xc2\x29\x8e\xe5\xde\x1d\x55\x8a\xf6\x44\xba\xdf\x34\x8c\x04\x05\x28\x98\x0a\xbe\x4e\x00\x89\xa1\xb6\x16\xad\x5c\x77\x0e\xc1\xbe\x93\xec\x89\xbd\x04\x37\x61\x5b\xa4\x4a\xad\x06\xc4\x22\x1c\x86\x98\x4f\xf1\xa2\xac\xb6\x90\x55\xaa\xac\x59\x63\xb8\x04\x5c\x7a\x40\x95\x42\x9d\xa6\x65\x32\xd7\x6a\x5f\x24\xea\x10\x0f\x5b\xc6\x6a\x52\x75\x63\x2a\x77\x56\xb2\x85\xdd\x70\x05\xbf\x78\x11\x52\xa3\x17\xd4\x90\xba\x51\x80\xea\x32\x95\xb3\x03\x28\x6c\xb6\xab\x32\xc4\x0d\x11\x17\x2c\x58\xab\xa2\x28\xf7\xc5\x8a\x70\x3b\x3e\x51\x1c\xdb\x31\xd5\x6b\xc7\x4c\x44\x40\xda\x7b\x41\x39\x75\xde\x67\x0e\x98\x68\x73\x88\x96\x14\x57\x87\x84\xa2\xfb\x41\x90\x3b\x43\x0e\x77\xb7\x83\x3b\x22\x8f\x3c\xb2\x30\x2d\xaa\xbd\xf8\xe9\x38\xb4\x41\x49\x04\xb4\xf8\xe0\x16\x5a\xea\x87\xcc\x3e\xb6\xac\x9b\xf7\xd0\xd4\xe9\xe8\x1b\x70\x98\x97\xc5\xcf\x4c\x98\xed\x8f\x50\x28\xf6\xe7\x50\x1e\x0f\xf7\x72\xdf\x84\x6c\xa4\x9f\x68\x18\x63\x74\xe5\x5a\xa3\x9b\xa0\x1d\x3a\x7e\xc4\xfa\xc3\x9d\xe4\x92\x78\xc6\x54\xeb\x45\xe9\x40\xa9\xb5\x5f\x73\xde\x6a\x47\x47\x1c\xcb\xc9\x79\xb5\x73\x40\x2a\x63\xe3\xd1\x86\xe3\x18\x37\xf7\x20\x51\xa8\xba\xa1\x5c\xcc\x6e\x6f\x3c\x93\x09\x07\xa9\xe5\x47\xf0\xee\x05\x43\xec\x47\xa6\xb8\x53\xed\x33\x02\x4a\x68\x39\xb5\x6d\xa3\x6a\x66\x60\x56\x01\x15\xb8\x98\x8b\xb8\x21\x69\x16\x78\x77\xe7\x68\x07\xb0\xaa\x6d\x6c\xac\x3d\xec\x37\x0f\x8e\xe2\xb6\x7c\xa0\xa5\xb9\x31\x2b\x80\xb7\x29\xb0\x16\x30\x0b\xc7\x62\xef\x37\xb1\xfb\x7d\xdc\xda\x63\x7c\x03\x4f\x27\x12\x9e\x7f\x30\x39\x38\x47\xa2\x7b\x9b\xc0\xf9\x5e\xd5\x72\x8c\x70\x0e\xa0\x29\xec\xf6\xd0\x54\xf4\x44\xd5\xe5\x28\x65\x5b\xe7\xb1\x40\x90\x4a\x8e\xd7\xf2\xa0\x3f\x2d\x16\x37\x4c\x34\xd3\x37\x40\xee\xef\x8e\xf4\x9d\x6f\x4d\xad\x9b\x02\xde\x06\x21\x4c\x16\x6a\xfc\x42\xe2\x3d\xb2\x78\xb8\x64\xbc\x61\x05\x62\x75\x64\xc5\xd9\x40\xa5\x86\xaa\xad\x24\x8b\x37\x0d\xfd\x82\x9c\xe5\x63\xf6\x9c\x4e\x56\x14\x07\x44\x34\xb0\x59\xe6\x07\xc5\x04\xbd\x70\x7f\x08\x8e\x29\xc0\xbd\x19\x0a\x0a\xb5\x12\xb4\x7c\xb7\xb5\xcd\x1f\x2c\x16\x0e\x17\xd1\xce\x4f\x14\xc3\x38\xc0\xbe\x27\x1d\x3e\x3d\xd4\x55\xf2\xcd\x07\x7b\xdc\x3a\xc1\x20\xc2\x05\xba\x29\xf2\xd3\xa9\x7e\xbf\x6f\x8e\x3d\x8f\xe0\x4e\xff\x56\x53\x7b\x52\x09\x1a\x41\xaa\xa9\x86\x4c\xd1\x13\x4b\xb1\x39\x42\xfd\x89\xc7\x1b\x85\x03\x54\x59\x74\x4f\xb0\x08\xa0\x5b\x5b\x11\x01\xc3\x3b\x3e\x5d\xc8\x3c\xad\xbe\xfd\xe6\x4c\x09\x55\x07\x31\x07\x1c\x7c\x86\x2f\x21\x7b\xc4\x18\x1b\xc2\x4b\x43\xd8\x01\xbb\x85\xc5\x65\x00\x87\x74\x2e\xef\x7d\xa9\x1f\x9d\x23\xa7\x32\xa4\x3e\xda\x43\x71\xb6\x0c\x24\x21\xf6\x21\xc0\x5a\x58\x95\x9b\x79\x3e\x42\xb0\x17\x2e\x32\x35\x3a\x8d\x2a\x88\xdb\x62\x00\x80\x6a\x24\xb0\xb1\x18\x00\x3a\x94\xfb\x5f\x74\x65\x5c\xe7\x12\xf9\x29\xbc\xfb\xb2\x48\x4a\xac\x3a\x0c\x09\x9f\x32\xef\x1d\x6c\xb1\x67\xa0\x35\x50\x8a\xca\x3b\xa8\xc6\x59\x53\xf1\xac\xa1\x38\x2d\xe3\x83\x00\x61\x65\xb5\xb9\xbb\x73\xa3\xe4\x09\xa7\x0b\x11\xc8\x00\x26\x8f\xbe\x23\x03\xd0\xcf\xd1\x35\x8d\x6f\xdd\x4f\x2c\x9a\x01\xd6\x49\x3e\x94\xf9\x7e\x4b\x15\x7e\xc4\xfb\xae\x64\x19\x1a\x88\x1f\xc3\xed\x28\x1c\x73\xcb\xaa\xa5\xd0\x15\x3b\xb2\x70\x89\xed\xf1\x90\xde\x3c\x7d\x95\x6b\x77\xa0\xdd\x76\xe7\x06\xe1\x47\xc8\x41\x56\x17\x03\x50\xca\x97\xd4\xa7\x15\x89\x77\x71\x59\xd8\xf6\x09\x07\xbb\x76\x1e\x76\xb1\xd6\x17\xe8\x67\xab\x23\x6e\xf6\xba\x94\xec\x89\x1e\x6a\x86\x1e\xf6\x90\x98\x64\x0f\xa1\xc0\x95\x24\x08\xc1\xf0\x82\x6c\x5d\xbd\x2b\x91\x33\x68\x6b\x56\xf7\x59\x61\xcf\x9c\x1b\x48\xc0\xe2\x70\x70\xd1\x4e\xe7\xd0\xdd\x53\x12\x91\x47\xbb\x80\x53\x8a\xd3\xa5\x90\x43\xc4\x54\x59\x7e\x40\xbc\x18\xb8\x8b\x81\x3f\xb2\xb1\x15\xfa\xea\xbf\xe8\xb2\x4a\xc0\x5f\xef\xf6\xc6\xf8\xdd\x03\x87\x5c\x42\x45\x82\x70\xa2\xf5\x90\xb8\x82\x83\xe9\xce\x78\xd5\xaa\xcf\x4e\xe8\x72\x46\x3e\x76\x51\x22\x16\x19\x22\x2a\x74\x31\x43\xb2\x55\xbe\x29\xe6\x07\x86\x6b\x3b\x5f\xa2\x47\x92\x3b\xa1\x23\x12\xc6\xb9\x33\xb2\x92\xbf\x37\x9a\x04\x15\x39\x0b\x44\xb0\xf1\x07\xc7\x5a\xf1\x58\xeb\xdf\x3b\xd6\xab\x63\x2b\x27\x63\x21\xf8\x96\x8f\x45\x95\x1b\xcd\xbd\x0d\xbc\x56\x22\x31\x11\xaf\xb3\x28\x13\x73\x0a\x11\x53\x10\x13\x2e\xd0\x40\xc1\x7f\x42\xc2\x1c\x63\x41\x1b\x88\x02\x17\x81\x06\x41\x75\x42\x5b\x1c\x33\x8a\x9a\x24\x1d\xf1\xa7\xf6\xa1\x82\x7d\x88\x35\x45\xe4\x11\xd3\x62\xca\x0a\xa2\xa5\xc7\xbf\x9d\xef\x97\x6c\xe2\x97\x38\xc8\xce\xc9\x5d\xb4\xb8\x7a\x37\xc1\x36\x04\x31\xb9\x9d\xc7\xc4\xc3\xc7\xf8\xf8\x73\x0f\x6d\x50\xf8\xc1\xcd\x7d\x47\xef\x21\x6b\x52\xfd\x01\xab\x37\x85\xdd\xc0\x90\x6b\xaf\xf7\xe4\x05\x51\x55\xd3\xd7\x2c\xd4\x94\xd8\x83\xcc\x63\xb8\xad\x26\x7a\x97\xef\xa9\x1c\x3c\x40\x7c\x61\x55\x6c\xcc\xca\x2a\x60\x5d\xcc\x02\xd2\x97\x9e\x47\x5b\x5a\x65\x3b\xcc\xe4\xaf\xe5\x19\x24\x45\x4e\x51\xce\xa1\x6e\x4c\x8e\x7f\xe0\x4b\x49\x7d\x8f\x64\xf5\x30\xe8\x52\xee\x2c\xd0\x5d\x58\xbe\xec\x24\xed\x0c\x5e\xc4\x0e\x0c\x29\x59\x64\x5f\x20\xf6\xde\xe2\x00\xa9\x5c\x1f\xcd\xf3\x17\x1f\xb9\x95\x4e\x03\x86\x94\xde\x5c\x56\x8a\xf5\x5b\xcb\x6a\x3b\x08\xcb\x7e\x6b\xfe\x8a\x4a\x44\x24\x13\xa4\x4f\xb1\x83\xae\xc5\x5f\x6d\x55\x58\x2a\x6c\xab\x9d\x2d\x66\x75\x56\x15\xd8\x93\x50\xe6\x1b\xe3\x88\x4c\xa5\x2a\x26\xb4\xda\x17\x40\xfc\x06\xae\x07\xb4\xd9\x7f\x8a\xae\x75\x2a\x50\x82\xd7\xed\xc1\x53\x6a\xbc\xe9\x1c\xf8\xe2\xed\x2d\xee\x72\xc6\xdc\x2e\x0f\x81\x0d\xcf\x13\x67\xc3\x1d\x9a\xe5\xdb\x10\x38\x00\x8b\x01\x92\x11\xe4\x97\xfa\x5f\x89\xeb\x44\x60\xde\x86\x17\x00\xf1\x8d\x5c\x7c\xec\x30\x63\x6d\xa7\x7b\x99\x86\x42\x26\xf0\x29\xfb\x3c\xc3\xe8\xe8\xb1\x78\x29\x83\x8b\x47\x4b\x35\xc2\x87\xb1\xb7\x3b\x9b\xe7\x02\xc3\x23\x5e\x12\x62\x82\xa4\x74\xe4\x07\x23\x55\xea\x6d\x38\xf5\xf1\x45\x12\x55\x2e\x91\xe3\xdd\xe2\x77\xf6\x06\x70\x99\x2a\x23\xf9\xb8\xfc\x61\x1d\xe8\xcf\x42\x9e\x65\xe8\x76\x5a\xd3\xd8\xed\xae\x41\x17\xe5\x11\xf2\x58\x65\xfc\x75\x15\xbe\xfe\xc4\xc7\xb3\x5a\x3f\x94\x19\x85\xd8\x21\xc7\x77\x84\x82\x40\xc9\x4c\x75\x5f\xab\xfc\x1e\xe4\xc1\x75\x1e\x30\x64\xf3\xbc\x49\xc5\xb0\x24\x68\xd5\x30\x24\x82\x6f\xab\x3d\xaf\x0c\x49\x53\xc6\x98\x64\x95\xa0\x06\xf0\x24\x04\xaa\x46\xfa\x01\x20\x9a\x87\xf4\x12\x35\x40\xc8\xaf\xed\x89\x80\x0b\x4b\xfa\x53\xa5\xde\xe1\xbc\xf1\x02\x90\xf1\x08\x94\x3e\x6b\x5d\x1f\xea\xac\x58\xd9\x00\x78\x71\xbf\x41\x58\x0c\xc0\x81\x7c\xdf\x9d\x43\x0b\x6b\x3b\xaf\x2d\xeb\xab\x41\x24\x28\xca\xbc\x1f\xe3\x43\x50\xe2\x66\x8e\x3c\x21\xd1\x55\xd5\x23\x3a\x0c\x5f\xa8\x10\xa0\x7d\x9f\x2d\x33\x52\x10\xcb\xcd\x23\xa3\x67\xf8\x8a\xd7\xed\x4d\x44\xfb\xb2\x3c\x08\x46\xac\xc8\x35\x6e\xa5\x65\x4e\x29\xea\x78\xdc\xe5\xc6\xe8\x04\x4b\xef\xa0\xe3\x23\x44\x07\x5b\x57\x32\x51\xef\xc0\xfc\x32\xfe\x82\xfa\xc2\x74\x6c\x4b\xf5\xac\x9d\xbd\x13\x97\x13\xf4\xb0\x53\xa5\xbe\x4f\x31\x3d\x06\xd2\x91\x78\xde\x3f\xe5\xa4\x3f\xdd\x5f\x15\x61\x4f\x5a\x3b\x87\x56\xbd\x3b\x90\xbc\x0c\x29\xdb\x31\x9f\xf6\xcf\x59\x2a\xae\x07\x8f\xa1\x63\x2c\x06\xb7\x2b\x2e\x0e\x39\x92\xc0\x4e\x95\xb4\x4a\xd9\x16\xa4\x57\x01\x43\x40\x3a\x3c\x11\xf4\x88\x2b\x64\x7c\xb6\xe4\x95\xbf\x23\x32\xd2\xa7\x47\x43\x33\x2b\xda\x7b\x28\xa6\x37\x43\xad\x3b\x2c\x5b\xe1\x9d\x47\x89\x42\x61\x82\x5b\x99\x1e\x20\x41\xd5\xe3\x0d\x1d\xe5\x9e\x77\x8f\x69\x5a\x56\xe5\xbe\x6a\xf4\x5f\xf7\x54\x53\x82\x5e\x89\xb8\x52\x12\x44\x40\x12\x0c\x29\xe2\xa3\x93\x69\x21\xa8\xb8\x3e\x45\x70\x80\xe7\x9f\xe4\xdf\x42\xad\xec\x20\x91\x0b\x10\xfc\x5c\x18\x45\xb8\xe7\xba\x85\x73\xca\x18\xa5\xe5\x81\x5a\xc5\x4c\x6b\xb2\x7a\xd5\xdb\xe7\x01\x9f\xcc\x45\x53\x99\x75\x06\x72\x9f\xce\xb3\x8d\xa5\xf0\xa5\xc9\x81\x14\x2a\xed\x62\xfb\x6d\xb5\xaf\x71\xc1\x0a\x25\x78\xf1\x5b\x15\x6f\xf0\xf1\x86\xe1\x69\x10\x78\x12\xb9\x1a\xae\x92\xae\x4d\x93\xd5\x9b\x83\xae\xb3\xed\x3e\x6f\x4c\x61\x31\x05\x08\x11\x06\xc9\x56\xd3\x63\x97\x0d\xcb\xbb\x31\x3d\x5c\x83\xa9\x95\x88\x19\x13\xce\x7a\x53\xab\x78\x0e\x0f\x62\x55\x1e\xd9\x77\x04\xd2\xd0\x6d\xec\x98\x51\x31\xd2\x44\x3f\x02\x93\x13\x00\x19\xb1\xd4\xaa\x2a\x0f\x26\x6f\x0e\x67\x80\xff\xe8\xa7\x85\x62\x63\xb6\x3c\x50\x16\xa4\xac\x2d\xd5\x6e\x63\xd6\x94\x32\x67\x47\xa8\xa8\x39\x7c\x79\x28\xf7\x3e\xca\x66\x15\x5c\x1f\x08\x5b\xeb\x96\x42\xbe\xf6\xa3\x8b\xa2\xc9\x4d\x28\xc8\xba\x8e\x1a\x0f\xfa\x89\xba\xb2\x9b\x0a\x28\x05\x28\x82\x83\x21\xdc\x27\x9a\x8f\x3e\x5b\x2b\x97\x17\xc5\x90\xa0\x84\x2f\x5f\x33\x33\x00\xca\x2c\x90\xf8\x24\x78\x75\x54\xcc\x5d\x1c\x94\xe0\xd1\x93\xec\x21\xe8\x33\x2f\x4d\x2e\xeb\x89\xc5\xeb\x65\xd0\x1d\xc3\x88\xa6\x58\x2b\xf9\x90\xc8\x40\xf5\x3e\xef\x2e\x55\xb0\x82\x22\xd2\x12\xd7\xb7\x28\x4a\x16\x09\x47\xc7\x61\xb2\xac\x00\xb2\x72\xc2\x40\x46\xe4\x69\x84\x7c\x52\x3e\xc6\xd7\x22\x4d\x23\x0e\x2b\x04\x52\x72\x78\x2d\xe2\x6e\x00\x49\xee\xd5\x3d\x3d\xf9\x8b\x8a\x3e\x7e\x6f\xe8\x02\x53\xe6\x51\x0b\x83\x98\xa8\x0f\xbb\xdd\x55\x82\xbb\xd1\x2d\x4d\x55\x77\xaa\xeb\x41\x12\x00\x9c\xfc\x44\xfb\x90\x68\xb6\x25\x6a\x11\x3c\xda\x49\x07\x8e\x57\xff\x0e\x82\xec\x30\x60\x9f\xb1\x14\xb3\xdc\xe5\x12\x3e\x05\xcc\xb0\x51\xd5\xa7\x54\xe1\x03\x79\x6c\x90\x0e\x94\x90\x77\x25\x2f\x38\xbc\xd8\x91\x26\x1a\xaf\x20\x00\x16\x25\x5e\xa4\x92\x24\xe4\x6a\xd8\x95\x82\x6c\x99\xa3\xdf\x0a\x7f\xf4\x0b\x85\x3d\xf7\x3b\x9f\xc2\x07\xb0\xdb\x77\xeb\xb2\xc0\xf1\x47\x6a\x33\xb7\xc9\xe1\x6c\xd4\xf5\x3d\x2c\x19\xe7\xff\x11\xaf\x5d\x64\xc1\x7c\x19\x1c\xe5\x12\xbc\x29\xa2\x46\x62\xde\x2e\x17\xda\x23\xe1\x10\x54\x68\x85\xef\xcb\x6c\x85\xb2\x0f\xf1\xa6\x91\xab\x94\x48\x45\x4a\xf8\x4a\x7e\x20\x30\xda\x23\xdd\x09\x97\x36\xcf\xec\x03\x3e\xb9\xb4\xda\xa8\xd6\x51\x85\x07\x6a\xdd\x74\x93\x70\xea\x47\x56\x64\xed\x80\x6c\xbe\x2b\x2b\x49\x93\x26\x9c\x74\xa1\x05\x9d\x15\x8c\xa7\x54\x70\x09\x82\xba\x3f\xba\x89\x2e\xfd\xca\x27\x49\x6d\x9f\xd4\x94\x57\x72\xd2\xa9\xf5\x5e\x48\xa8\xb8\x20\x74\x98\xb3\x88\x44\xd5\x23\xdb\xd1\x73\x16\x10\xd1\x44\x24\xd9\x78\x67\x4b\x10\x7b\x05\x1e\xbc\xa8\x8b\x02\xc1\x04\x02\xee\xa4\x25\x5e\xd6\x74\x9f\xab\x80\xa4\x89\x61\x95\xb1\xb4\x62\xad\x42\xa5\x05\x06\x6c\x20\xa9\x63\xb6\x25\x78\x18\x3c\x10\x68\x36\xf6\x35\x7d\x00\x79\x65\x69\x27\x1b\x3c\x56\x05\xde\x23\x2b\x56\x65\xb5\x2b\x2b\x2f\x15\x19\x29\xc9\xba\x15\xc9\x01\x42\xca\x10\x2e\xcb\x75\x4f\x5e\x55\xfd\x94\xca\x22\x1a\x18\x15\x86\xce\x54\xf6\x21\x83\x84\x3c\x4e\x6f\x2f\xdf\x47\x84\xab\x53\x2d\x0c\x3e\x1e\xf8\x20\x75\x5e\xc2\xff\x13\x6f\x60\xf4\x26\xe6\xc5\xac\x91\x8b\x06\x04\xc8\x76\x59\x95\x31\xd3\x19\x31\xf1\x7a\x8a\x10\x2c\x36\x71\xed\x5c\x67\x10\x71\xcb\x0a\xbd\xb6\x8d\xc9\x72\x30\xd0\x82\x3a\xc4\x03\x5b\xcb\x4a\x11\x15\x92\x33\xd2\xe0\x45\x73\x72\x2d\xb0\xf5\xc1\xa4\x65\xc5\xdd\x3e\xab\xe1\x22\xc4\x4f\x30\x65\x49\x2b\xa1\xcb\x92\xbb\xce\x4f\x88\x1f\x6d\x0f\x32\xd9\x45\x81\x89\xa4\x63\xf5\x04\x18\xe3\x80\xc4\x8b\xde\x70\x82\x18\x03\x5f\x99\xe0\x51\x36\xa2\x92\xba\x39\x46\xcd\x44\x1b\x89\x13\x78\xf4\x4a\x85\x62\xa3\x9d\x4f\xf1\x2c\xa3\x89\xc6\x79\xa4\x72\xa4\x56\x4f\x39\xbd\xa0\xb0\xcb\x07\xfd\x5c\x87\x13\xef\x2c\x91\x1a\x89\xfb\x38\xff\xc4\xdd\x36\xd5\xd1\x6f\x07\xb8\x12\x84\xf8\x59\xcd\xa4\x8c\x2f\x3b\xed\x14\x69\x70\x41\x63\xfc\x81\xfc\x2e\x2d\xd8\x63\x95\x58\xaf\xea\xa7\x0a\xbb\x78\x2c\xdf\xb8\x7d\x7b\x9f\xdd\x41\x76\x4a\x5c\xde\xe5\x80\xb7\xf4\x94\x84\xb2\x6a\xaf\xae\xe7\x7e\x09\xf0\xe7\x0c\x6e\x5e\x22\xb0\xe4\x53\x9b\xad\xa2\x2b\x24\x3a\x64\x37\x99\xa1\xd1\xc2\x1a\xc0\xfd\xa4\x83\xa0\x02\x18\x27\x9e\x35\x51\x79\x88\xc2\xec\x62\x4b\xbe\x2f\xba\x3d\xe0\x36\x03\x88\x84\x33\x29\x36\x3e\x0b\xb9\x9c\x63\x53\x56\x4a\xd4\xad\x81\x13\xec\x0f\x3c\xef\x19\x48\xa3\xde\x9a\x7a\xf1\xf6\x7d\xfd\x8b\x7a\xb4\x00\x84\x77\x56\xa3\xc6\x03\xcd\x07\x45\x6b\x8f\xac\x4f\xf5\x74\x5f\xc1\x21\x5c\x23\x0d\x0c\x9a\x92\xbb\x3d\x44\xa0\x88\xe9\xb8\x79\x2c\xf5\x5d\x69\x72\x62\x78\x07\xaa\x23\xde\x48\x88\xcc\x6f\x4c\xb3\x47\xe4\x38\x90\x14\x72\xe8\x02\x05\xba\xa8\x0e\x2c\x78\x1a\x10\x77\x07\x87\x69\x5b\x7a\x7f\xa9\xbe\x37\x55\xe0\xe1\x6e\xd7\xe3\x79\xae\x7b\x24\xf0\x99\x4c\x05\x47\xfa\xf9\x79\xaa\xdf\x8f\x2e\x87\xb7\xf3\x11\x14\x28\xdf\xcc\xa6\x1f\x67\xc3\xcf\x7a\x3c\xe7\x7a\xc8\x2b\xfd\x61\x36\x02\x6d\xfc\xcb\x4f\xc3\xd9\xc7\x51\xe2\x9e\xc3\x5a\x73\xf1\x26\xfd\x61\x3a\x53\xe2\x05\x09\x97\x8a\x8f\xfe\xb2\x18\x4d\x16\xfa\x66\x34\xfb\x3c\x5e\x2c\x46\x57\xfa\xfd\x17\x3d\xbc\xb9\xb9\x1e\x5f\x42\x31\xf7\xf5\xf0\xb7\x54\x8f\xfe\x72\x39\xba\x59\xe8\xdf\x3e\x8d\x26\xa1\x10\x5b\xcd\x17\x20\xd2\x32\x9e\xe8\xdf\x66\xe3\xc5\x78\xf2\x91\xa4\x9c\x6e\xbe\xa0\xdc\xf0\xa7\xe9\xf5\xd5\x68\x06\xc8\xf1\xef\x7c\xc1\x35\x14\x9b\x8f\x7c\x19\xbc\xec\x93\xa2\x8a\xf8\xe7\x0a\xe2\xc7\xf0\x22\xaa\x8b\x1f\x5d\x41\xe9\x77\xa7\x32\x3e\x51\xdd\xd2\xf8\x04\xa5\xc6\xf0\xd9\xa7\x6b\xe4\x01\xc5\xfe\x5c\x99\x7c\x8a\x03\x38\x59\x8c\x67\x23\x3d\x1b\xcf\xff\xac\x87\x73\x1e\xd6\x7f\xb9\x1d\xfa\xf7\xdc\x8c\x66\x1f\xa6\xb3\xcf\xc3\xc9\xe5\x48\x11\x73\x98\x98\x46\x50\xe0\xfb\x32\xbd\x4d\xf5\xfc\xd3\xf4\xf6\xfa\x2a\xfa\x7b\x37\x4c\x23\x7d\x35\xfa\x30\xba\x5c\x8c\x7f\x1d\x25\xee\x41\x3d\x9c\xcf\x6f\x3f\x8f\x14\x8e\xf6\x1c\xca\xdf\x87\xd7\xd7\x7a\x32\xba\x1c\xcd\xe7\xc3\xd9\x17\xd2\xcd\x01\x68\xfe\x6c\x74\x33\x1c\xcf\x34\xa0\xf5\x67\x33\xac\x8d\x47\x46\xac\xa8\x9e\xff\x76\x72\x3d\x9a\xcf\xf5\x6c\xf4\x2f\xb7\xe3\x59\xdf\x22\x70\x6f\x00\xba\x33\xe0\x18\x08\x73\xae\x7e\x1b\x5f\x5f\x63\xb9\x7f\x6b\xe2\x13\x4d\x3c\x00\x61\xe2\xbf\xe8\xdf\x3e\x4d\xf5\xe7\xe1\x17\x2c\x10\xf8\xc2\x4b\x63\x36\xf2\x15\x04\x23\xb9\x48\xdd\x78\x86\x85\x39\x7c\x3f\x75\x23\x10\x88\x06\x16\x53\x18\x0e\x37\x3d\x44\x32\x20\xa9\x11\x86\x93\x2f\x8a\x2a\x88\x13\x3d\xbf\x19\x5d\x8e\xdd\xbf\x8c\x27\x97\xe3\xab\xd1\x64\x31\xbc\xc6\x31\x99\xcc\x47\xff\x72\xeb\xa6\x70\x78\xed\x99\x0a\x98\x60\x80\xa8\x05\x88\x34\x40\x01\xc5\x00\xaf\x8f\xc5\x54\xb7\xb7\xe4\xe9\x93\xb4\x0c\xd7\xd3\x39\x2c\xb4\xab\xe1\x62\xa8\xa0\xc5\x8b\xa1\x7e\x3f\x72\x4f\xcf\x46\x93\xab\xd1\x0c\xb6\xd2\xf0\xf2\xf2\x76\x36\x5c\x00\x43\x81\xfb\xc5\x68\xae\xe7\xb7\xf3\xc5\x70\x3c\xc1\x49\x71\xfd\x05\x1e\x83\xf1\xec\x8a\xf7\x92\x82\xe5\xf9\x61\x38\xbe\xbe\x9d\x8d\x74\x6b\x81\x2d\xa6\x7a\x7a\x33\x82\x57\xc2\x42\x13\x13\x82\x4f\xcc\x07\x09\xac\x01\x3d\xfe\xa0\xe7\xb7\x97\x9f\x14\xce\x9e\x8e\x76\xec\x17\xfd\x69\x38\xd7\xef\x47\xa3\x89\x1e\x5e\xfd\x3a\x86\x5d\x47\xdf\x99\xce\xe7\xac\x25\x39\xc5\x37\xf0\x38\xfe\x71\x0e\x85\xf4\xbb\xcb\xcb\xb3\xf7\x5f\xce\x26\x97\x67\x17\xe9\xeb\xbf\x0f\x07\xd4\x33\xf5\xff\x17\x17\xdf\x77\xea\xff\x2f\x2e\x5e\xff\xa3\xfe\xff\x3f\xe3\x9f\x4b\xd0\xb2\x7f\xb0\xfa\xb2\xdc\x6e\xdd\x89\x3e\x6c\xbc\xff\x71\x36\x29\x8b\xcb\x40\xfd\x7f\x91\xbe\xd6\x97\xb3\xd1\xd0\x59\x47\x7d\x39\xfd\xfc\x79\x3a\x99\x3b\x53\x77\x33\x9d\x61\xf5\x11\x1c\x83\x0b\x3d\x04\x23\xf6\x61\x3c\xfb\x0c\x26\xf9\x6a\x3a\xc2\x3f\xe7\x73\xe8\x7a\xf4\x71\x78\xed\x05\xc7\xba\xca\xb0\x8b\x4f\xe3\xb9\xa2\x13\x37\xfc\x1a\xbe\x3c\x02\xee\x92\xc5\x62\x3a\x9b\x8c\xbe\x9c\x5d\x5e\x8f\x9d\x41\x05\x09\xb3\xf1\x74\x32\xff\x34\xbe\x49\x3b\x2d\x54\xf4\xd9\x39\xbc\x57\x8f\x27\x70\x3e\xe0\xb7\x80\x0a\xe5\x64\x38\x3f\x73\x47\xe1\xfb\xe1\x7c\x3c\xef\xfe\x5e\x7f\x1e\xfe\x79\x24\xcf\x77\x67\x06\x66\xa3\x8f\xc3\xd9\x15\x9f\xc3\xf2\x9d\xcc\x39\x93\x60\xdf\xc7\x73\xa0\x66\x99\x07\x26\x16\x69\x43\xf5\x6c\x34\xbf\xbd\x06\xdb\xfe\x61\x36\xfd\xac\xc7\x8b\xb9\x33\x75\xa9\xe2\xcb\x25\x72\xda\xfc\x36\x9d\xfd\x59\x9f\x0e\xe7\xee\x70\x42\xeb\x34\xba\x9e\xfe\x36\x88\x28\x6e\x6e\x9d\x5d\x83\xd6\x60\x0d\x19\x8d\x63\xcf\x70\x44\x0c\x0f\xfa\xf4\xe4\xf2\xf2\xe6\xfa\xc4\xd9\xa0\x13\xfa\xb3\x93\x01\x9e\xb6\xf0\x59\xfc\xc6\x62\x74\x49\xfe\x4a\x38\x7a\xf0\x40\x51\x68\xb9\xda\x6e\x8c\xb3\x7d\xc0\xfe\xf2\x21\xbc\x0a\x9f\x5c\x7c\x72\x53\x38\x27\x32\x9b\xf1\xff\x14\x6d\x17\xd3\x4e\x25\x6f\xf8\x25\xb7\x9c\xb0\x1d\x9f\xc6\xef\x9d\x91\x4f\x95\x7a\xff\x45\x8f\xfe\x32\x9a\x5d\xe2\xf1\xe1\x3e\x07\xcf\x7a\xa7\x00\xbe\xe8\x47\xc7\x79\x69\x74\xa0\x5f\x82\x7f\xe5\x26\x07\xce\x58\xbd\x98\xaa\xf7\x23\xfd\x7e\x7a\x3b\x81\xfe\x75\x47\x90\x9a\x84\x63\x82\xff\x31\x9d\xe9\x8f\x6e\x29\xcc\xe1\x95\xee\xcf\xf1\xe3\xea\x72\x3a\xa1\x03\x04\xfd\x42\xa0\xc9\x99\x8f\xaf\x46\xb3\x21\xaf\xee\x2f\xd3\xdb\x19\xb5\xc2\x79\x29\xde\x92\xf7\x95\xfe\xa1\x93\x7a\x9e\xea\x2b\x8f\x7f\xa8\x95\x32\xa9\x3e\xb9\x0c\xf8\xb9\xdf\xca\xea\x2b\x17\xb7\x19\x42\x66\x30\xb3\xb6\x11\xdc\xa1\x98\x94\x48\xb4\x29\x9a\xfb\x32\x2f\xef\x0e\xee\x36\x6e\x8b\xd5\x61\x05\xf2\xca\x99\x49\xb0\xa0\x80\xd1\x01\xee\xbd\xee\x4f\xb2\xa6\x0e\x74\xc7\x59\x21\xb5\x76\x51\x84\x1c\x92\xdb\x4c\xdf\x1b\x2e\xa2\x14\x98\x95\x91\xc3\x24\x54\x51\x01\x26\x81\x61\xa0\x88\xcf\xf0\xf0\x54\xd5\x8b\x48\x05\xba\x85\xba\xb6\xdb\x65\xee\xab\xe1\x22\x1c\x21\xe2\x69\x87\xa2\x80\x42\xb2\x36\x1b\xdd\x1a\xb3\x90\x1b\x5e\xa2\x38\x13\xe1\x64\x8d\xbe\x0a\x39\x53\x78\xf0\x54\xea\x7e\xda\xbc\x7c\x1c\x78\x35\x79\x8a\xdb\x76\x52\x2f\xa9\x52\xcb\x54\x9f\xb4\xde\x14\x4f\x13\x65\x04\x41\x27\xcf\x0f\x78\x59\xb5\xfe\xc0\x14\x6b\xc5\xe1\x67\x7b\x06\x8a\x03\x80\x8b\x46\x82\xf3\x30\xd1\xa2\xf2\x2f\xd1\xdb\x3d\x15\x13\x55\x10\x9f\x45\x58\xfd\xba\x32\x5b\xd3\x64\xff\x86\xcf\xa8\x0d\xa6\xee\x4c\xce\x7f\xa2\xdd\x2d\xaa\x2c\xf4\x2e\x5b\x01\xef\x72\x20\x4a\x75\x97\x73\x5d\xd9\x15\xf2\xdf\xba\xa9\x68\xbc\xc6\x11\xbe\xcc\x2c\xab\x0c\xf3\x69\x98\xf3\x62\x95\xaa\x24\xd6\x0e\x01\xe8\x51\x77\x95\x51\xfd\x68\x65\x57\xa6\x6e\x12\x2c\x7a\x74\x8f\xda\x35\xfe\x7e\x6d\x76\x50\xc3\x87\x17\x4f\x2a\xe6\xed\x9f\x67\x2d\xe7\x59\xfd\xbe\x79\x6e\x4d\x6a\x77\x4e\x3f\xd0\x03\x50\xff\xcc\x49\x8d\x75\xb9\x5f\x36\x2c\xfc\x19\x36\x0e\x30\xd7\xd0\x34\x00\x96\x06\x05\xd6\x21\x36\xed\xc6\x53\x89\xf1\x84\x7b\xeb\xa1\x58\xdd\x57\x65\x41\xb3\xc1\x61\x03\xde\x85\xee\xfa\xbd\x3e\x43\x9d\x16\xe2\x59\x05\x6a\x9c\x07\xa0\x13\x01\xb9\xa5\xd3\x13\x78\x47\x56\xdc\x9d\x0c\x84\xc8\xcd\xef\xea\xb0\x6a\x2d\xe2\x55\xaa\x4f\x58\x5d\xe2\x44\xa0\xc9\x42\x15\x37\x20\xd9\x8a\x06\x55\x28\x0d\x41\xfd\xeb\xd0\x76\x0f\x17\x54\xbd\xa8\x6a\x4f\x38\xbd\x4e\xf5\xc9\x94\xa3\xc9\x43\x88\x68\x3c\xfb\xc1\xc7\xfb\x52\xaf\xa0\x80\x7d\xed\x3f\x98\x2a\x65\x53\x7d\x22\xb7\x5b\x23\xab\x97\x3d\x7e\x0d\xc2\x0c\x58\x32\x7f\x9f\xed\xb0\xdd\x4f\x14\x2e\x87\xf6\x6e\x52\x7d\xf2\xa5\xdc\xfb\xcd\x5c\xf4\x37\x8e\xd2\xdf\x6e\xb3\x1e\x85\xbc\x28\x04\xb8\xd4\xc4\xa5\x82\x34\xf6\xf9\x41\x3f\x64\x65\xee\x7b\xd5\x3b\x6e\xb8\x02\x58\xdd\xa6\x29\x15\xf7\x1f\x76\x0c\xbf\xd6\xc3\x66\x58\x49\x4a\x80\x48\x3a\xfa\x71\x11\xae\xfb\x68\x93\xf5\xda\xd6\xbb\x0c\xaa\x60\x3d\xef\x3e\x36\x17\x55\x8b\x2f\x52\xfd\xc1\x64\x95\xbe\xad\xad\x9e\x11\x89\xc8\x84\x20\x2d\x59\x11\x53\x4c\xb4\xb2\x25\x95\x5d\xef\x57\x36\xc1\x00\x3a\x42\x7c\x28\x65\x01\x26\x84\x9a\xc4\x12\x41\xd0\xfe\x8d\xfb\x14\x90\x71\x6e\xb2\xaa\x6e\x74\x6d\x08\x6e\x46\xa0\x7c\x8e\xc4\xd7\x0c\x2d\x87\x90\x7e\xed\x76\x40\xac\x99\x1b\x2a\xb7\x50\x28\xba\xa7\xf8\xdb\xbf\x57\xc5\xca\xcf\x35\x22\xb7\x79\x7c\x3e\x56\xa6\x68\xd2\xb6\x66\xe7\x31\x91\xd1\x38\x5c\xcb\x53\xa1\x24\x79\x6a\x8d\x10\x09\xb7\x68\xf3\xf5\x63\xb6\xb6\x49\x94\xa6\x4e\x74\x51\x16\x67\xbe\x5f\x89\x9b\xe3\x9d\x05\x95\xa7\x53\x96\x5d\xf5\xa2\xe1\x2c\x57\x10\x3a\xe0\xbb\x38\xf0\xd3\x22\xd6\x81\x16\xc0\x8d\xac\x50\xe1\x54\xc2\xea\x47\x3e\x10\x7f\x06\xaf\x24\x92\x7f\x0e\xeb\xb1\x15\x15\x15\x56\xad\x29\x23\xad\x80\x96\xe1\xf6\xd2\xca\x3d\x6f\x85\xcc\x4a\x78\xe9\x9a\x73\x2b\xad\x33\xbe\xfe\x85\xcd\xcb\x12\x9a\x87\xc6\x22\xd2\xe8\xb3\x6d\xab\xe8\x7e\xb3\x4a\x75\x3f\x07\x51\xa5\x77\xf7\x65\x51\xa2\xed\x76\x13\x98\xf8\x22\x41\xe6\x0d\x4d\x18\x96\x1d\xfe\x04\x22\x95\xed\x3f\x05\xd8\x14\x58\x10\x40\xa5\xac\xb3\xbb\xac\x01\x16\x8f\x75\x56\xb6\x8a\xbc\xc2\x88\x51\xc2\x4b\xf5\x74\xbf\xa7\xeb\xeb\xff\x56\xdd\xe8\x19\xe7\xc0\x3f\x4b\x6b\x8c\x3c\x01\x5e\x7e\xd0\x31\x94\x33\x5c\x67\x06\xe6\x0d\xd1\xdf\xb5\xa7\xf7\x29\xca\x47\xa0\x5c\x81\xfc\x8a\xdb\x36\xc0\x84\xa0\xd7\x98\x32\x23\xa6\x00\xf9\x09\x86\xe8\x46\x95\x2b\xc4\xe5\xd3\x29\x42\x36\x18\x79\xf7\xfa\x5a\xf9\x41\xe8\x43\x1c\xdd\x27\x64\x7e\x3a\x8d\x4e\xd5\x30\xcf\xf9\x31\xc4\xe4\x30\x5a\x93\x51\x51\x4b\x21\xd7\x0c\x84\xb6\x2c\x88\x88\x72\x91\x82\xa4\x58\x2d\xf7\x8d\x6e\xc1\x8f\x44\x2b\x22\x15\x43\x0f\xd0\x7f\x7b\xba\xc6\xfa\xd1\xb7\xa7\x76\x80\xd8\xd3\x99\x80\x71\xa5\x82\x13\x4e\x4a\x19\x71\xc1\xf5\x1b\x1a\xca\x4c\x02\x4d\x01\x2a\x20\x44\x91\x40\xd8\x86\xda\x44\xdc\x21\x21\x69\x26\x41\x63\x68\x35\x38\xcf\x24\xf9\x92\xfd\xe2\xa2\x55\x29\xfe\x84\xd6\x5f\xe2\xcb\xa1\xf1\x31\x58\x75\xf9\x41\xf1\xf2\x0c\x0e\x75\xc1\x8a\xf8\x4f\x95\x76\xb9\x36\xfb\x5a\x6c\x5a\x21\xca\x97\xc0\xc2\xc7\xdc\xaf\x6f\x8b\x0c\xde\x3e\xb3\x04\xec\x1d\x53\xe9\x1e\xfa\xb6\x49\xcf\x11\x0d\xd5\x5d\x8a\xab\xea\xc5\xb6\x8b\x3c\xbc\x2f\x51\xe1\xdb\x53\x03\xa0\x9e\x1e\x00\x1e\x9f\x18\x53\x8c\x15\x11\x65\x25\x61\x7c\xe4\xde\x08\xf3\x82\x7e\x75\xde\xe0\xa3\xfe\xec\x3d\xee\x83\xd0\xa8\x08\xd0\x9f\x12\xa0\x3f\x7d\x04\xf4\x07\x93\x11\xb7\x4f\xe0\x8c\x83\x1f\xe7\xe7\xa3\x4d\xf8\xf0\xfb\xc8\x1e\x02\x8d\x84\x0a\x34\x12\x99\xad\xe3\x16\xfc\xce\xd5\xa7\x9e\x1c\xfc\x30\xa4\x9e\xbe\x19\x2c\x88\xbb\x76\xc3\x85\xc0\x2b\xfe\x03\xc6\x85\x4b\x16\x08\xc2\x1e\x03\x38\xf8\x02\x60\xf4\xd6\x14\x05\x64\xd9\x05\x64\x26\x16\x16\x6b\x3b\xab\x42\xbc\x41\xd8\x41\x91\xff\x7e\xe2\x38\xed\x5e\x98\x31\xdf\x0f\xef\xf7\x85\x6e\x04\x7a\xee\x3b\x7b\xb5\x81\x92\x46\x10\xec\x0c\x1d\xc1\x12\x71\x04\xbc\x48\xc3\x11\xfb\x49\x6d\xa7\x5b\x8f\x37\x48\x6a\x08\xe7\x77\x5f\xd3\xe0\xd2\x4c\x75\xf6\x58\x3c\x20\x85\xef\x79\x29\x25\xfc\x19\x28\xd2\x6c\x18\x01\xe5\x1c\xa1\x44\x51\x29\xb4\xf7\x8b\x3b\xfd\x01\xa1\x9d\x0d\x2a\xc2\x20\x63\xde\xea\x5e\x08\xfb\xe3\x66\xe0\x3b\x8c\xc2\x3b\x4c\x82\x9a\x81\x50\x94\x0c\x40\x12\xd9\x91\xee\x95\xac\xbf\x23\xea\x77\x75\x44\xb7\x3b\xd2\xfa\x86\xfa\x7d\x1d\xd1\xbd\x1d\x81\xf8\x86\xdc\x40\x7e\xe3\xc3\x6d\xbf\x77\xf3\x37\x25\xfc\xa2\x7b\x9e\x28\x26\x99\xc1\x15\xce\x35\x33\xbb\x2a\xa3\x8a\x31\x7f\x4b\xd8\x60\xfb\x10\x4d\x09\xaf\x7c\x34\xd5\x5a\x08\xd4\x2a\xb3\x7e\x30\x45\xe3\xee\xc3\x20\x36\xec\x3a\x6e\xf5\xb6\x2c\x80\x2f\x2c\x52\xd0\xc6\x3d\xe1\xb9\x51\xe4\x7e\xf3\x75\xbd\x4a\xe6\xc9\x09\x0c\x2e\xfc\x1d\xf6\x76\x36\x59\x6e\xcf\x38\xf3\x2c\x21\xbb\x41\x86\x49\xc5\x97\x71\x56\x5d\x7a\x69\xbf\xb4\xec\x97\x7a\xb2\x5f\x11\x1d\x4a\x20\x9b\xd8\x99\xc3\x96\xa5\x26\xdd\x58\xd3\x4f\x55\x24\x2a\x0e\xb2\x85\x45\x41\xd3\xe3\xad\x8b\x1c\xa4\xce\x88\x60\x98\x60\xdc\xa6\x66\xfc\x8f\x3d\xc5\x31\x8a\xd4\x76\x21\xdd\x9f\xb7\xfd\xde\x44\x47\x07\x87\x12\x07\x47\x9b\x9e\xa3\xf6\x11\x10\x0e\xb5\x05\x3e\xc8\xd6\xf2\x77\x3b\x76\x9d\x35\xca\xd7\xd6\x7b\xf4\x05\x15\x38\xba\x4b\x0c\x2c\x0b\xc6\xb3\xef\x9b\x2c\xcf\xfe\x0d\xc8\x9f\x80\x0a\xf7\xc1\x1e\x18\xa3\x50\x98\xad\x85\x62\x88\x5d\x6d\xf7\xeb\xb2\x38\x6c\x01\x9d\xec\x2f\x65\x5c\xbf\xd5\x69\x44\xb6\xf1\x32\xd2\xbf\xa0\xb9\xcc\x9a\xdc\xaa\xe8\xa8\x88\x1e\x89\x8c\x44\xe0\x05\x88\xed\x85\xf0\x6c\x54\x8f\x67\x83\xd0\xe9\xe2\x40\xac\x33\x41\xbe\x96\x81\x57\x8c\x5f\x0c\x95\x7b\xbe\xd2\x89\x6c\x1a\xd6\x95\x81\x99\xb9\x9d\x8d\xe5\xf1\xe1\x0f\xef\x1e\x12\xa8\x92\x6b\x75\x20\xc6\x25\xea\x3e\xe5\xac\xfd\x42\xd1\x63\x7c\x85\xa9\x09\xe4\xdf\xb1\xab\x86\x66\x90\xd9\x16\x7c\xb5\x47\xcf\x59\xdb\x63\x34\xf5\xa9\x4d\xef\xd2\x44\x9f\x90\x48\x93\x24\x5a\xa3\x62\x3b\x78\x6c\x79\xe8\x18\xce\x13\xd7\x91\x93\xf9\xaa\xb2\xb6\x80\x2b\x96\xaf\x04\xf1\xe8\xc9\xf6\x4f\xe9\xf0\x38\x19\x10\x4e\x8f\x9a\xce\x0a\xc7\x02\xd5\x4b\x96\x53\x2c\x4b\x34\xa2\xbf\x78\x23\x90\xa8\x7b\x2e\x2d\x62\xd6\xa0\x27\x87\xaa\x67\x4f\x25\x80\xa8\xd7\xdb\xac\xc8\xb6\xfb\x2d\xb2\xb6\x50\x93\xb0\xde\x6b\xb7\x43\x5c\x2b\x14\xe8\xfb\x68\x2f\xd4\x0b\x56\x28\xdc\x17\x02\x6d\xf4\x43\xfc\x4d\xad\x68\xf6\xbc\x7b\xe3\x8b\xa6\x4d\x2d\x28\x97\xb8\x2e\xeb\x89\x17\x2b\x7c\xb1\x0c\x28\xfe\x07\xc4\x6b\x7f\x56\x2a\x4b\xf5\x8d\xd0\xc5\x9a\x41\xec\xc5\x2d\xfb\x5b\xb8\x55\xbc\xcf\x4d\xf1\xd5\xf2\xbe\x70\x7e\xa5\xdf\x21\x74\x6b\xab\xe3\xc8\x93\x12\x7c\x09\x30\xcc\x81\xab\x56\x92\x63\xba\x79\x78\x70\xf7\xc7\x48\x95\x8b\x6f\x77\xe5\x2a\xb3\xcd\x41\xc1\xaa\xd4\xc3\xf9\xe5\xf0\x26\xd1\xef\x3f\x8f\x13\x3d\x1f\xcd\x87\x97\x03\x0e\x11\x65\xc2\xc6\x11\xfa\x3b\xd2\xf8\x62\xeb\xcb\xb6\x57\xc9\xbf\xc5\x97\x3f\xda\xe5\xca\xd4\xcd\x40\xb7\xac\x0c\xca\xce\x8b\xc7\x7b\x4f\x6c\xf5\xfb\x4e\xb6\x67\x4e\x6c\xa5\xb2\x2c\xd5\x9f\xad\x3b\x8d\x60\xa6\x66\x14\x13\x2c\xd6\x7a\xde\x98\x66\xdf\x94\xd5\x21\xcc\xd0\x7f\xfc\x54\xc0\x0a\xf1\x91\x48\x94\x2b\x73\xbd\xf3\x75\xaa\xca\xfd\x61\x43\x43\xf7\x09\x88\xc3\x3e\x94\xdf\xf4\x10\x1e\xed\x4c\x0b\xa0\xee\xc5\x95\x50\xb8\x86\xb1\xdf\x7c\x7a\x82\xfc\xf2\x0c\x4f\x1d\xb4\xb8\x21\x3a\x82\x3f\xc0\x8d\x93\xd7\x6e\x38\x98\x24\x9e\x23\xe5\xcb\x83\x3e\xff\x41\xdf\xce\x2f\x03\x8f\xda\xf9\x3b\x9e\xdd\xdb\xb9\x90\xb3\x19\xae\x1a\xa8\x61\x83\x31\x0b\x88\xc8\xac\xa0\x8c\x94\x94\x50\xab\x07\x70\x4e\x7c\x29\xf7\x55\xa7\xee\x04\x0d\x86\xec\x40\xb4\x58\xd4\x1f\x74\x83\x9e\x5b\x2c\xbf\xe1\xca\x75\xa7\xee\x73\xeb\xe4\x59\x4b\xa1\x62\x4b\xd1\x49\x89\x3d\xb3\xd0\x74\x67\xa1\xa9\x17\xef\xf9\xb3\x78\xcf\xd3\xda\x9a\xbb\x16\x8c\xc8\x2f\x1b\x24\xea\xe8\x7e\x67\x1f\xf5\x65\x3b\x3b\x69\xc9\x5b\xf7\x2c\x24\xfd\xd4\x42\x7a\xdb\xb7\x90\xd4\xd1\x85\xa4\x9f\x5e\x48\xc7\xbb\xa0\xfe\xe0\xfd\xa0\x77\x01\xa9\x63\xd6\x46\x6b\xfd\x2e\xd5\x33\x21\x7c\x0b\x59\xec\xdf\x7c\x10\x01\x56\xd4\x55\x88\x30\x28\x42\xf7\x79\xe8\xa6\xfe\x7c\xbb\xb8\x1d\x5e\x5f\x7f\x11\x90\x3e\x82\x19\x30\x3e\x33\x20\xfc\x92\x80\x2f\x98\x7e\xf8\x30\x9a\xcd\x03\xfc\x03\x40\x2a\x48\xf8\xcb\x78\x94\xd9\xe8\x66\x36\x9a\x8f\x26\x0b\x44\xbf\xe8\xe9\xac\x05\xb4\x64\x20\xa7\xbe\x9c\x4e\x2e\x51\x9b\xd2\xbf\xd0\xab\x1d\x25\x01\xd1\x39\x5f\x0c\x17\xb7\x8b\xe9\xec\x4b\x4b\x05\x28\x20\x3d\x3d\x5e\x14\xd0\x76\xf0\xdd\x44\xc5\x1f\x5d\x8c\x17\xd7\xa3\xc4\x83\x3c\xc7\x2d\x21\x24\x7d\x0c\xe1\x99\xb4\x55\x90\x12\x45\x2a\x42\xc3\xf7\xf3\x11\x21\x25\xae\x87\x80\xa0\x15\x9a\x42\x1f\x46\x97\x8b\x79\xa2\x11\xcc\x77\xf9\x25\x61\xe9\x21\x1c\x1a\xfc\x15\xbd\x40\x4d\x3f\xe8\xd1\x6c\x36\x9d\xcd\x83\x1a\xd2\x74\x06\xe0\xa2\xab\xf1\xfc\x72\xfa\xeb\x68\x36\x7c\x7f\x3d\x4a\xf5\x7c\xfa\x79\x14\x89\x77\xce\xf5\xd5\x14\xa1\x4d\xd7\xd7\xd3\xdf\xdc\xfb\xd5\xe8\x2f\x97\xd7\xb7\x73\xc2\x74\x74\x71\xae\x89\x9e\x4f\x11\xd7\x11\x1e\xfc\x3c\xfc\x82\x2f\xb9\xb9\xb9\xfe\x42\x88\x4a\x2c\x27\xbe\x0e\x15\x23\x65\xa1\xaf\x33\x83\x32\xa3\x1e\x0d\x1c\xe3\x87\x8f\x23\x47\x13\x25\x81\xa6\x00\x17\xf5\x0b\xaa\x83\xe5\x04\xf4\xd3\x17\x42\x63\x2d\x3e\x8d\xdc\xbc\xb3\x9e\x14\x63\x38\x55\xc0\x70\x26\x31\x82\x33\xd1\x37\xb7\x93\x31\x20\x8b\xa6\x33\x3d\xfa\xcb\xe8\xf3\xcd\xf5\x70\xf6\xe5\x38\xb0\x33\x06\xf7\x78\x75\xa8\x80\x0f\x0a\xd8\x48\xdf\xe6\x17\x20\x21\x55\x07\x09\xe9\x36\xed\x0f\xa9\x5e\x04\x55\x7f\x08\x33\x2f\x3a\xe1\xc1\x27\xa2\x93\xe8\xd6\x7a\x7e\x80\xb8\x2c\x5b\x41\x88\xc6\x1d\xdd\xcb\x0a\x48\xbc\x96\x07\x38\xb8\xc9\xf0\x1d\x8b\x60\x79\x33\x5f\xfb\x24\x71\x66\x6b\xd5\xa5\x38\x78\xc9\x25\x17\x83\x3b\x5f\x22\xd2\x03\xe5\xa3\xd9\xde\xe1\x7f\x21\xfd\x41\x08\x18\x10\x59\xa6\x6f\xaa\x12\x4d\x3d\x4e\x86\xc0\x81\x82\xb2\x0e\x8a\x32\xa9\x60\x05\x4a\xf4\x45\xa2\xde\x25\xfa\xfb\x44\xff\x80\xb1\xf6\x1f\xb1\x69\xf5\xbe\x7a\x60\xba\xdd\x26\x4c\x58\x3f\x9a\xa6\x95\x51\xc5\x60\x66\x5f\x5e\x35\xa1\x32\xac\x38\x8d\x41\xa1\x10\x15\xa7\x47\xf5\x4b\xd3\xa3\x7c\x6f\x72\xc3\x3f\x80\x94\xb6\xeb\x34\x48\x0f\xf0\x4d\x92\xc8\x68\xfb\x5d\x01\xef\x00\x54\x16\x45\xf0\x5a\x08\x09\x5f\xdc\xa1\x7c\x24\x1c\x17\x12\xdc\x8f\xeb\xa6\xdc\x75\x79\x15\x30\x6a\x81\xd9\xf1\x26\xdb\x5a\x71\xe9\xe3\x35\xa0\x3c\xf3\x3d\x4c\xad\xcd\x7d\x68\x87\x56\x06\xe9\x4d\x97\x30\x87\xeb\xca\x3c\xc6\x11\xe4\x53\x89\xdf\x09\x4d\x73\x2f\x65\x0d\xa4\x84\xb8\x66\x25\x01\xc6\xd2\x26\x7e\xe0\x9f\x61\x86\x1d\x24\x3d\xa5\xcd\x19\xac\xaf\xa2\xc9\x8a\xbd\xf5\x0b\x0e\x4a\x8f\x91\x32\x0f\xc5\x01\x98\xaf\x26\xf0\x78\x84\xbc\x34\xb2\x23\x81\x35\xf8\x31\xd5\x9f\xb3\x7a\x65\xf3\x1c\x6b\xd4\xc1\x1e\x04\x0a\x87\x2f\xfd\x34\xbb\xcf\x44\xf6\x81\x63\xa9\x95\xb1\x4e\x62\x3c\x05\x43\x61\xca\x38\x4b\x22\xd8\x1c\x64\x08\x9e\x32\x31\xb5\xd9\x32\x54\xa6\x85\x16\x30\x75\xef\xba\xa6\xa8\x6a\x0f\x9f\x0a\xec\x9a\x3f\xd8\xcf\x6e\x04\x45\xfd\xfe\x7e\xc5\xf1\x8d\xbf\x47\x07\x31\xf0\x48\xd2\x06\x52\x26\x5f\x2c\x26\x40\x99\x3c\x5d\xc3\xee\xf7\xbb\xca\xcd\x23\x70\x2c\x06\xf9\x7c\x83\x6b\xcd\xb5\x2c\x14\x77\x33\x35\x85\xa5\xa3\x3a\x94\xeb\x3a\x13\xb9\x06\x04\xa4\x7a\x26\xdf\xc8\x22\xb3\xcc\xa7\x61\x88\xd8\x0b\x53\xa6\x2d\x72\x0b\x65\x82\xa0\x3b\x0b\x20\x50\x7f\xa5\xea\x35\x80\xe6\x7c\x64\x12\xe3\x35\x1c\xfe\xf3\x89\x6b\x15\x25\xbc\xc3\x8b\x70\x8c\x60\x7f\x85\x21\x4a\x01\x46\x30\x29\x51\x28\x00\x7c\xe6\x63\x03\xed\x1b\x42\x1a\xff\x8f\x06\x89\xd9\x8a\xb5\x2e\x4a\x3a\x2c\xb1\xc6\x99\xe7\x55\x06\x06\xe1\xe9\x8a\xa8\x2a\xa1\xce\x54\xe8\xcc\x42\x49\x1a\x97\x75\x11\x6b\x8e\x18\xa8\x03\x85\x20\x91\x3c\x6f\x2d\xa8\xd4\x3a\x6f\x45\x7c\x58\xe4\x0d\x48\xf8\x60\x13\x38\x3b\x03\x09\xc7\xd2\x36\x8f\x96\x58\x79\x3d\x35\x51\xd6\xdc\xab\x80\xbf\x0a\xfb\xd8\xd3\x67\xbb\x03\x87\x78\x72\x88\xe0\x44\xc8\xd5\x64\xc5\x5d\x2d\x78\x3e\x6a\x44\x3b\x45\xf7\x8c\x36\xc4\x2b\x7c\x02\xec\x36\x45\x5f\xf9\x3b\x21\x2c\xeb\x46\x4d\x11\xde\x71\x09\xf7\xd4\xe5\x01\xa9\xd5\x88\x49\xd3\xdd\xa4\x82\xd8\x7d\x50\x83\xc7\x28\x1e\x45\x14\xdd\x95\x69\x5f\x78\x85\x12\x72\x37\x5a\x23\xc7\xc9\x9f\xa5\x64\xb8\xa5\x65\x0d\x2b\x70\x0f\x07\x2d\x17\x40\xfb\xee\x72\xc4\x3a\x40\x1d\x30\xff\x9e\x2a\xd5\x29\x48\x60\x05\xbb\x30\xd1\xdd\xad\xe4\x56\x73\xcc\xa8\xfd\x78\x6f\x9a\xba\x84\x13\xf0\x48\x4e\x03\x92\xcc\xba\xf3\x39\x89\x16\xcd\x33\x0e\xf4\x83\x7f\x87\x75\xac\xd8\x0c\xf2\x00\x51\x14\xa9\xb9\xb7\x65\x75\xf0\x11\x9d\xb5\xd9\x9a\x3b\x60\xaf\xe2\x36\xf4\x68\x4b\x4b\x29\x0e\xf7\x23\xaa\x4c\x4c\x98\x7a\x0e\x7e\x02\xb1\x6a\x44\x15\x7a\x6e\x80\xc6\xdd\x62\xf9\x13\x04\x86\x6b\xf5\x91\xc7\x88\x2b\x55\xdb\xde\x0a\x61\x32\x2a\x7b\x57\xc2\x7f\x91\x5a\x3f\xec\xcb\x62\x65\xeb\x44\x65\x9b\xee\xc8\xdc\x47\xf4\x62\x4c\x5a\x0c\x14\xda\x90\xd4\x25\xf3\xed\xe7\xd4\x7b\xd3\x89\xf2\x06\x15\xfc\x50\x13\x40\x30\x50\xc2\x29\xa8\x62\xca\x8d\xff\x7d\xaa\x14\x52\x8d\xfb\x80\x06\x83\x4a\x04\x3e\x97\x98\xa2\x48\x9a\x4e\x44\x3d\x98\x6b\x9d\x63\x36\x81\xd5\x3e\xb8\x23\x97\x97\x37\xd7\x89\x2e\xa8\x5c\x1b\xe7\x15\xa6\x9f\xa5\x00\x9a\xca\xac\xed\xd6\x54\x5f\xf5\x49\x7b\x34\x4e\x58\x35\x06\x20\xb9\xce\x9a\xf9\x67\xcb\x4a\xe7\xe5\x5d\xe9\x9a\xd7\xb3\xba\xc2\xe6\xd8\x55\x59\x59\xf1\xde\x60\xbb\xd8\xf7\x2b\xa4\x6b\x0b\xd4\x05\x7b\xf6\x90\xd0\x34\xb6\xfc\xf0\xce\x0e\x7a\xe5\xbe\x56\x9c\xad\x40\xdf\xad\x11\x0d\xdd\xd7\xe6\x8e\x6a\x74\xf3\xac\x00\x8c\xbd\x47\x60\xf9\xc2\x70\x55\x62\x09\xc0\xa3\x5d\xd6\x59\x63\xe3\xec\x66\x4b\x3a\x1b\x2e\x46\xcc\xc0\xdd\xe5\x1c\xe8\xd9\xdc\xf4\x35\xe0\x81\x84\x80\x8d\xf3\x2b\x9b\x66\xf7\xf3\x77\xdf\xad\xe8\xd9\x15\x0d\x42\x59\xdd\x7d\xf7\x0f\xad\xe0\xff\xe8\x7f\xd2\xef\xde\x67\xcd\xa2\x84\xa5\x71\x76\x9e\x9e\xff\x3d\x2a\x00\x9f\xae\xff\xfb\xfe\xfb\xd7\xef\xde\xb5\xea\xff\xde\x5e\xfc\x43\xff\xf7\x3f\xe7\x9f\x30\xfb\x7a\xba\xb3\x85\x9e\x63\xf6\xd7\xd7\x9f\x79\x01\xe0\xf4\x9c\xa8\x6e\x9e\xfe\x85\x3e\x75\xa6\x8d\x6a\x06\xec\xc9\xa0\x8d\x36\x0a\xbf\x56\xab\x3c\x63\x2e\x7a\x36\xa2\x52\x33\x7e\xbd\x5f\x21\x39\xe7\xa3\xcd\x73\xa8\x71\x29\x0e\x7a\xbf\x5b\x03\xcf\x0a\x30\xd6\x42\xd4\x17\x82\xc1\x74\xa7\x0e\xa4\xf9\x41\x24\xf4\x44\xb4\xf7\x86\xde\x7a\x42\x4c\x6a\x11\x81\x12\x04\xb4\x55\x78\x9a\x38\x38\x4e\x43\xfd\xc3\x00\x0d\x71\xf7\x85\xc1\xe7\xdb\xed\xab\x7a\x8f\xb2\x85\xaa\x7d\x09\x31\xfc\x1f\x6b\xfe\x5d\xda\xf9\x93\xa4\x5d\x71\x95\x40\xc8\x02\x29\xa1\x30\xe4\x7e\x9b\xce\xd3\x18\x98\xde\x72\xca\xfc\xc9\x5c\x8b\x4b\x37\x85\xb5\xee\xb3\xd5\xbd\x62\x52\x10\xc0\xcd\x3f\x41\x19\xd8\x69\x6e\xac\x1e\x9c\xd5\x9a\xff\xb3\x8d\xe4\x5f\xdb\x7a\x55\x65\x4b\x0b\xdd\x01\x45\x7f\x3d\x42\x45\xff\x84\x00\x10\x50\x61\x04\xce\xfc\xaa\xdc\xd9\x4e\x95\x45\xa0\xc3\x6c\xda\xdf\x09\xce\x60\x87\x91\xc3\x39\xdb\x0a\x5d\x32\x8a\x10\xf4\xdc\x05\x85\x3c\x17\x40\x43\x77\x5d\xd2\xff\xb0\xfe\xf1\xee\xd2\xc4\xad\x60\xd2\xa7\x70\x7f\xd8\xe2\x1a\xf7\xbe\xa5\xdc\x18\xa1\x76\x0f\x91\x0a\xb1\x28\x0f\x5c\x12\xff\x64\x96\x4b\x5b\xf5\x6e\xa7\xf3\xf4\x35\x6d\xa9\x3f\x4d\xe7\xd7\x27\x03\x26\xf7\x0a\x02\xd4\x3b\xe7\xcb\xe3\xe2\x95\x2f\x18\xbb\x6f\xc2\x01\x9a\x4a\xf8\xef\x8a\xe1\xbf\x9b\xc1\x69\x96\x65\x83\x80\x12\x73\xef\x47\xff\x0c\xc4\xca\xd6\x36\xb7\x08\xf4\x8a\xfa\x4a\x01\x26\xbc\x36\xfc\x1c\xa9\x8f\x91\x5c\x22\xea\x67\x3d\x9a\x83\x1c\x48\xb1\xc0\x4d\x4e\x98\x7f\x62\x67\x24\x9a\x61\x14\xe3\xf2\xf4\xfe\x82\xa4\xab\x4d\x89\x42\x42\x7b\x9e\x39\x05\xbb\x50\xbb\xe5\xe2\x3c\x63\x1f\x47\x43\x20\x0b\x94\x9f\x70\xc1\x44\x28\x0d\xd9\xa0\xac\x1d\xc7\xac\xb0\x70\xe5\x7d\xd9\xdc\xf3\xf8\x5d\x96\x6b\x8a\x35\x05\x1e\xe3\x36\xe9\x52\xdf\xee\x65\x74\xf6\xe7\x88\x49\x9b\xf9\x8e\x7d\xc9\xcc\x25\xd7\x45\x96\x15\xd7\x36\x7a\x37\x8a\xa4\x73\x01\x06\x0a\xf4\xe4\x1c\x2f\x39\xe9\x7c\xf0\x44\x9f\x44\x1f\x72\x7f\x20\x5f\x7d\x82\xfc\x46\xa2\x4f\x27\x0a\x85\xbd\xb1\x9c\x91\x82\x9a\xbc\xed\x06\x5e\x83\x00\x5a\x44\x1c\xe8\x1c\x2e\xf8\xdc\x26\x07\x3f\x32\xc1\xa4\x52\x06\x82\xc9\x98\xcc\xee\x84\xb4\x61\xca\x40\x05\x7b\xe1\x35\x08\xdb\x0f\x9d\xe0\x5e\x81\x86\xaa\x6e\x43\xdf\x82\xc6\x38\x92\xc3\xf2\x9d\xa6\xdd\x18\xe1\xec\x8b\x1b\x6f\x3b\x1a\x03\x06\x11\xee\xa6\x41\x27\x34\xee\x2b\x5a\xcc\xaf\xf6\x58\xa7\x39\xa1\x50\x48\x96\x39\xe0\x9b\x29\x1f\x6c\x55\x04\x20\xfc\xf1\x56\x00\xc7\x58\x20\x52\x14\x1a\x57\x44\x22\x67\xa3\x95\xc9\x22\x35\x71\x3b\xc3\x1a\x62\x92\x21\xd4\xbc\x75\x9b\x8b\x65\xe7\x44\xe4\xc9\xf0\xbe\x08\x6c\xc6\x6e\x23\xd7\x36\xcf\x13\x66\xfd\x5d\x97\x05\xdf\xcd\xa4\xe7\x1f\xc8\x2e\x05\x7a\x70\x13\xb3\xda\xcb\xed\xd2\x3d\xfc\x12\xdf\x8c\x1d\x6a\x5e\x99\xfe\x5d\x8a\x43\xae\x24\x3c\xd5\x4d\x90\x58\xe5\x6d\xfd\x37\x8c\x74\xf7\x6c\x5b\x32\x1e\xc8\x43\x0d\xef\xc1\xcf\x88\x77\xbd\x72\x7b\xb5\xb1\x95\xbb\x64\x47\x63\xdb\x8f\x11\x50\x84\x11\x88\x81\x76\xf0\xfe\x6e\x03\xfa\xc7\x21\xd0\x7a\x51\xf3\xf4\x1f\x69\x5e\x22\x79\x51\xd5\xdf\x34\x83\xad\xe1\x13\x54\x60\x7c\x2f\xee\x74\xc1\x63\x59\xf0\x66\xce\x48\x71\x11\x0c\xc0\x83\x9b\x14\x44\xdc\x6c\xc3\x9e\x13\xe2\x8b\x51\xb4\xa4\xc0\x5f\xc4\x21\x22\xbf\xd3\x21\xf0\xc2\x49\x52\xb6\x0c\xa0\x01\x1c\xae\xfd\xbd\xa3\x5c\xbc\x22\x39\x25\x64\xf2\x44\xbc\x05\x48\xc8\xc1\x16\x87\xf0\x4e\x56\xfc\x75\x5f\x21\xa8\x07\x63\x2c\x98\xa2\x25\x78\x6b\xab\x50\xa1\xf3\x95\xb2\xea\xd8\x3a\x49\xc2\xe6\x76\xa0\xda\x58\x02\x69\xf8\xae\xc3\xa0\x83\x1c\x16\xe4\x52\x36\x51\x6f\xb3\x62\x6d\xb7\x05\x45\x9d\x7d\xb7\x65\xd4\x44\xb1\xbc\x3f\x8a\x6c\xd8\x8a\x6a\x1b\x88\xb5\x32\x48\xe4\x27\x2f\xd9\xda\xea\xe8\xc2\x68\xd9\x20\xe6\x59\xc6\xa9\xac\x6b\x5b\x45\x12\xcb\x44\x8f\x6a\xee\x4c\x56\xd4\xad\xd5\x80\x75\xcc\x21\x68\xc3\xe3\xa8\xbc\x6d\x08\x62\xf0\x94\x64\xf5\x25\x2b\xad\xc3\x37\x89\xf4\xcf\x8f\xbc\xaf\x97\x82\xb8\x9f\xa4\xbe\xb3\xdc\xc5\x4f\xe2\x62\x3a\xdc\xa6\x8f\xdd\xc2\xb6\x40\xa4\xa0\x56\x9c\xe9\x3b\x6e\xf8\x3d\x84\x12\x65\xb4\xe0\xad\x9d\xf3\xf2\xaf\xfb\x1a\xe8\xfd\x99\xd0\xb9\x9d\x60\xe9\x71\xd5\x87\x41\xd0\x24\x3f\x84\x45\xd8\xee\x40\xe7\x53\x9e\xd6\x97\x6c\xf0\x74\x3e\x3e\x63\x27\x33\xf2\x30\xa5\x2e\x01\xfd\x48\x6a\x73\xfb\x3c\x0e\x1f\x55\xc4\x98\x4a\x2b\x46\xb1\xde\xa5\x7f\x2c\x28\x08\xc7\x01\x5e\x9f\xcd\x0e\xaa\x8f\x9c\x19\x6c\x4a\xbd\xd9\xe7\x9b\x8c\xd4\x46\x22\xfd\xb5\xf6\x30\x9f\x86\x10\x6c\x6b\x42\xe4\x6a\xa4\xb8\x17\xa7\x74\xc5\x72\x1f\xd0\x1e\x00\x0d\x30\xe4\x4c\xae\x7d\xdf\x3a\xa3\xe8\x79\x09\xb2\xba\x15\xed\xee\x75\x17\x31\x22\x0b\x92\xa1\x42\x4a\x3a\x76\x22\x53\xa5\x26\x1d\xe6\xcf\x56\x30\x5e\x46\xee\xba\x11\xb8\x18\xde\x8f\x94\x1d\x6d\x32\xd1\x9e\x03\x4a\x5a\x07\xa1\x50\xe5\x29\x21\x79\x3a\x14\x30\x06\xda\x28\x89\x87\x5b\x96\x0b\xbf\x5b\xcc\x8c\x9e\x9e\x94\x8c\x4b\xfb\xcb\x98\xbc\x7e\x34\xb5\x5f\xe8\xf9\x21\xce\xaf\x60\x7c\x59\x0b\x84\xb3\xed\xa1\x47\x15\x6c\xad\xb8\xd9\x48\x38\x18\x28\x0d\xfd\xce\xeb\xa3\x55\xed\x8c\x05\x45\x1a\x20\xfb\x14\x8e\x26\x28\x39\xc5\x15\x88\xc9\x7d\xfa\xb9\x78\x65\xd7\xdf\x9b\x16\xf9\x21\x76\x6d\x98\x12\x3a\x80\x05\xb1\xea\x42\x8e\x15\x65\x4e\xc9\x14\x44\x22\x83\x6d\xab\xd7\xbe\xbb\x55\x16\x6e\xa9\x65\xe1\x85\xeb\x83\xae\x0e\x09\x24\x20\x29\x30\x7e\xc4\x5d\xa7\x4b\xfe\x62\x74\x6b\x78\x24\xda\x72\x94\xe7\xc6\xca\xfb\x7d\x2d\x55\xb6\xe5\x8b\xdd\x33\x95\xdd\x21\x66\x70\x53\x56\x8a\xe4\xac\x8a\x07\x5b\x64\x50\x82\x04\xf8\xef\x8f\x79\x89\x65\xb5\x74\x82\xdb\x62\xdd\x9a\x85\xc0\x8b\x04\xe8\x9e\x1a\x6e\x9f\x50\x6e\x1f\xf2\x06\x56\x7f\x70\xab\xde\x27\x11\x5e\x58\x87\xaf\xfa\xeb\xf0\x75\x5c\x87\x7f\x08\x75\xf8\x67\xcf\x16\xe2\x2b\x6f\x1f\x23\x68\xae\x17\xfc\x82\x80\x09\xc0\x07\xf6\x98\x90\x43\x6e\x71\x3c\x36\xc1\xa3\x5c\x97\x94\xa8\x11\x82\x6a\xa9\xbe\xad\xa1\xc4\x8b\xaa\xd7\x83\x52\x4c\x28\xb2\xe1\xda\x1a\xe1\xac\xb4\x94\xe4\x4c\x71\x68\x5d\x50\x05\xa6\xd3\x48\x87\x13\x32\xbe\x6c\xed\xbc\x50\x70\x56\x20\x2d\x3d\x9a\x47\x75\x49\x8a\x56\x10\xa4\x93\x8e\xef\x8e\xe5\x17\x99\x12\xb7\x70\x0f\x08\x06\xa1\xa5\xa9\xb3\x9a\x7e\xea\x46\xc5\x99\xca\xb6\x2d\x45\x1c\x03\x82\xed\x99\x73\x7d\xe3\x39\xaa\x8b\x12\x88\x19\x42\xe5\x77\xf9\xe8\x96\x28\x29\x1e\x56\x25\x48\xf2\x2c\xe3\xfb\x02\x27\xc0\x13\x0c\x81\xa1\x53\x84\x35\xb2\xe0\x00\x9b\xdc\x1d\x3b\x4c\x83\x9e\x30\xef\x72\xf0\x9d\xdd\x58\x13\x61\x4a\x3c\x8c\xbd\xa3\xe5\x9c\xe1\xba\xcc\x6d\xd8\xa9\x74\x4f\x88\xb0\x39\x0a\x15\x1b\x9d\xa3\x1c\x55\x98\x63\x55\x07\x11\xd4\xbf\xa8\xd5\xea\xd9\x56\xeb\x67\x5b\x1d\x7b\xb2\x8a\x0f\x35\xf8\x3b\x0c\x96\x74\x36\x5e\x53\xb6\x5e\x0b\x3b\x51\x8c\x7b\xda\x0a\x56\x10\x83\x8a\x92\xb9\x69\x70\xe1\x00\x51\x9f\x5b\xb2\x4b\x5e\xb9\x09\x19\x7a\xb1\x6c\xa1\x6e\xaa\x3d\xd2\x14\x95\x1b\x7d\x9a\x0d\xb4\x81\xe3\x53\x89\xf8\x50\xdf\x95\xb3\xac\xf4\x69\xe6\x9e\x2e\x0e\x60\x9c\xdd\x6f\x82\xaa\x06\x08\x67\x73\x8e\x57\xf5\x1e\x86\xa9\xfe\x04\xba\x25\xb8\xd6\xb2\xb6\xaf\xd2\xf8\x68\x46\xfb\x87\x27\x0a\x33\xa0\x5e\x21\x2c\xcf\x43\x34\xa8\x15\x59\x61\x75\x45\xf6\xc4\x7d\x41\xab\x1c\x4c\xf5\x87\x18\x46\xde\x1f\xba\x34\xfb\x24\xec\x88\x07\x9f\xa8\xce\x7c\x7b\x6a\x06\xc8\xef\x91\xa0\x5a\xe9\xce\x56\x35\x52\x18\xf5\x10\xf0\x94\x82\xec\xcb\x7a\xfd\x53\xcc\xe2\xc1\x97\x92\x96\x15\x72\xc7\x45\xd4\x73\x7d\x6a\xa2\xe8\xd5\xc9\x80\xec\xaf\xfa\x23\xf6\x57\x1f\xb5\xbf\xea\xbf\xb7\xfd\x85\xfb\xf7\x3f\x4c\xf0\x3f\x4c\xf0\xd3\x26\xf8\x4d\xaa\x47\xb8\xd6\xbd\xad\x6d\x51\x10\xb5\x69\x97\x8e\xe0\xb4\xdc\x54\xc0\x06\x93\x2c\x4b\x4d\x19\x80\x02\x75\x12\xf2\x4d\x75\xc2\xd3\x9e\xe0\x03\xba\xb6\xab\xca\xa2\x58\x84\x5b\xd6\x25\x15\xb5\xf4\xed\x2d\x81\xee\xe8\x09\xe3\x31\xbd\x9b\x84\x99\x28\x42\x73\xb2\x58\xd4\xc4\x4b\x2c\x09\x0e\x29\x06\x0a\x7a\x3e\xc1\x16\xb5\x95\x38\x00\x14\xca\x80\xad\x6d\x30\xb2\x98\xe8\x78\xe2\x37\x1c\x92\x59\x95\xdb\x65\xe6\x23\x26\x08\xef\xeb\xdc\x0f\xe0\x4e\x45\x52\x22\x9c\xc0\x00\xcf\xbe\x5a\xbb\x7f\xc7\x64\x04\xe2\x89\x7d\xc3\xd9\x56\x86\x01\x7f\x76\xa4\x1e\x6c\x81\x95\xbe\xab\x7b\x8d\xbf\x40\x19\x55\xd4\xab\x68\x45\xcb\xc5\xe1\xf5\xec\x92\x00\x81\x8f\x5d\x65\x59\xcf\x8a\xa4\xe1\xc2\x1d\x05\xc6\xc9\x97\xe5\xb6\xc1\xcb\x74\x0a\xd1\x60\x46\x88\xfb\x43\x18\x77\x11\xcc\xf5\x3b\x03\xd5\x8c\x10\x1f\x14\x2e\x40\x3e\xb3\x37\x24\xbb\x86\x34\x66\xfe\x84\x53\x32\x57\x72\x3c\x2d\x03\x5a\x0e\xe8\xca\x8b\x38\x3f\xf2\xf6\x23\xdc\x2b\x51\x47\xa1\x39\x5a\x40\x73\xb8\xe1\x60\x00\x30\x26\xd5\xbf\x4b\xd4\x93\xbb\x44\xff\xbe\x5d\xa2\x9e\xd9\x25\xba\xb5\x4b\x8e\x57\xb3\x29\x19\xfe\x07\x3c\x55\x07\x0e\xf6\x92\xd1\x72\xbd\x27\x11\x6c\xa8\x68\x8e\x06\xe2\xb9\xc5\x4b\x00\xc3\x75\x09\xd5\x04\x85\xd9\xda\x44\x61\xc1\x16\x80\xe8\xb2\xdc\xee\x4c\x73\x9f\x68\xb3\x7e\xb0\x55\x93\xd5\x84\x7a\xcd\xb3\xe2\x6b\xc8\x0c\x44\xfc\x15\xa8\x19\x28\x28\x24\x54\xf8\x0c\x90\x30\x21\x0e\x1c\x85\x36\x2b\x3d\x15\x80\xb3\x19\x28\xae\xbb\x41\xb8\x12\x69\xc6\x14\x4e\xfa\x61\xec\x28\x2d\x5a\xa1\xc0\x2f\x9d\xfc\xcb\xdf\x67\x99\x76\xd2\x51\xca\xcf\x07\xa5\xd7\xb0\x46\x00\x13\xc3\x28\x20\x56\xf8\xba\x50\x98\x70\xff\x37\xb2\x62\xd4\x54\x56\xb5\xf3\x53\xfd\x3c\x3f\x3e\x4c\x95\xc4\x6b\x87\xe8\x26\xbc\xda\x38\xe2\x23\x8e\x38\xb3\xcf\xb6\x95\x03\x58\x52\x58\xf7\x25\xec\x4d\x08\xc5\xdf\xec\x25\x69\x69\xe7\x19\x1f\xb7\x89\x04\xd2\xf5\x0f\x69\x87\xf6\x49\x1b\xa1\x8d\xdd\xcb\xe6\xc4\x7f\x0f\x27\x40\x37\x51\x18\xda\x4f\xa9\x54\x98\x4a\x40\x11\x94\x4f\x33\x31\xb9\xff\x88\x92\x7c\xc7\xb2\x48\xc7\x72\x0f\x3d\xcb\xa4\x9f\xcf\x49\x54\xb8\x1c\x1b\xb1\x1e\x72\x27\xf2\x0d\x04\x89\xd3\xa7\x28\x36\x6b\x0e\x42\x00\x59\xc2\x8d\xd7\xe5\x6a\x4f\xe4\x23\xa8\xdc\x8b\xf5\x32\xe1\x01\x7a\x33\xe3\x46\xd6\xf1\x35\x64\x3d\x40\x07\x74\x88\xe9\x4d\x8f\xb8\x97\xc9\x88\x30\x8f\x90\x2f\xf5\x99\xd0\xb0\x64\x31\x0f\x42\x12\xf9\x4f\x81\xf3\x7b\x72\xad\x47\x93\xbe\x5d\x4f\x3e\x38\x16\x62\xaf\x05\xe7\x9b\x4b\x20\x98\x1d\xae\xbd\x66\xe0\x36\xdc\xd2\x4e\x0e\xdc\xb9\x47\x4d\x47\xa8\x50\xc7\xe2\xf8\x7a\x1b\xb4\x4e\x14\xe6\x7b\x42\xba\x3f\x40\x2b\xec\x83\xcd\xcb\x1d\x4c\x0d\x01\xbe\x9b\x83\x0f\xc7\x42\xb1\x50\x55\x16\xd9\x0a\xe9\x2e\x36\x48\xa1\xb5\x36\x8d\xd1\xa7\xa6\xd0\x27\xa3\xf0\x80\xb4\x9e\x5c\xa0\x5f\x6f\x81\x4a\xbc\x35\x9a\x94\x2b\x54\x62\xdd\x3d\xbb\x94\xfb\x06\x15\x27\x1b\x0b\x2e\x54\x0c\x9e\x30\xb5\x17\x04\xfa\x23\xa3\xa9\xb2\xba\x05\x0b\x73\x9f\x0e\xb8\x88\xae\x4a\x69\xbd\xaf\xbc\xd8\x77\x6b\xf5\xf8\x7e\x62\x4b\x65\x8e\x9e\xbd\x38\xf7\x8b\x67\x87\x52\x67\xb5\x02\xc8\x9b\xc9\x0a\x8e\xd3\x89\x68\xa2\xa7\xbd\x58\xa5\x7a\x2c\xdd\x8a\x1b\x76\x2b\x3e\x9b\xa6\xb1\x95\xbb\xca\x65\x00\x18\xab\xd6\xfa\x06\xee\xc1\x97\x70\xa1\xf3\x99\x3c\x70\xc1\xbe\x16\xe5\x63\x6e\xd7\x77\x7c\x04\xc9\xca\x9e\xe8\xbb\xaf\x6a\xd5\xef\xc5\x78\x27\x57\x96\x85\xf5\xd1\x25\x06\xe6\x43\xd5\xa3\x5d\x15\x1b\xe6\xc6\x7e\x6b\x30\x66\xe3\xa1\x56\x72\x69\x49\xa4\x90\x02\x6a\x9c\xb5\x3e\x81\x02\xd7\x13\x92\x83\x23\xfb\x42\x9c\xc0\x70\xdb\xe3\x90\x35\x06\x05\x50\x07\x5f\xfc\x75\x56\xa8\x7a\xbf\xd9\x64\x2b\x00\x2b\xb2\xbe\x19\x0e\x4a\x28\x7d\x02\xc7\xc8\x0d\x9a\x7e\xbc\x77\xae\x6f\xc9\x90\x66\x3f\xac\xe5\x12\xa0\x07\xe0\xb1\x87\xd1\xc5\xfb\xb2\x87\x97\x74\x91\x27\x61\xb5\x98\xd8\x3c\xaa\x60\x1e\x97\x24\x9b\x8c\x4e\xfc\xae\x2a\xb7\xbb\x26\x3f\x48\xe1\x5f\x2c\xf2\x85\x81\x23\x42\x4d\x62\x02\xe5\x2f\x8b\x0d\xd4\x84\x7b\x3c\xe0\xf3\xe0\xa5\x8d\x6b\x1d\x5d\x6b\x1a\xbb\xab\xf5\x29\x33\x8f\x17\x25\x91\xe9\x20\x12\x6d\x57\x65\x50\x50\x6f\x32\xd0\x5d\xcc\xb3\x1a\x9d\xde\xc2\x3e\xd6\x77\x55\xb9\xdf\xd5\x03\xc9\x43\xb4\x32\xf9\x6a\x4f\x00\x7a\x90\xdf\xc4\x1a\xbb\x96\xa4\xea\xba\xff\xae\xe5\x85\xbf\x61\x3a\x0a\xfb\x28\x06\xd6\xe3\xe3\x70\xdc\x01\xe1\x95\x65\x69\xe4\x88\x0e\x6f\xc6\x7e\xd9\xb7\x0d\x8e\x3c\xc7\x84\x1b\x48\xd1\x94\x2d\xd6\x5c\x90\x16\xa2\x3e\x3d\x19\xde\x8c\x89\x93\xa3\x67\x0b\x05\x4d\xe1\x50\x7b\xcb\xf0\xd3\x30\x16\x2a\x8a\x39\x78\x8e\x1f\x7c\x74\x78\x33\x16\x1b\x02\x24\xd9\x02\x8f\x29\x80\x2f\x03\x3b\x12\xf1\xf4\x86\x39\x87\xae\x67\x1d\x1e\x03\x34\x68\xbe\xe8\x08\x3e\x94\x88\xeb\x05\x10\x27\x96\x6d\x54\xeb\xdb\xd3\xd5\x00\xe2\xad\x58\xec\x0a\x19\x7a\xd4\xb1\x7c\x0a\x3c\xd5\x82\x45\xa1\x44\xb0\xd7\x8e\xa4\x18\x61\x4d\x7b\x91\x4c\x3d\x8c\xa2\xd8\x7b\x21\x32\x81\xd1\x8a\x60\x43\x14\xd2\x6b\xb1\x1b\x1b\x55\x08\xae\x5d\xbf\xc9\x02\x4d\x90\xf5\x4b\xf8\x0a\xeb\x3d\xce\xad\x6d\x3b\xbc\x74\x45\x41\xb7\x05\x6b\xa0\x40\x84\x1d\x81\x46\x42\xd0\xbf\xcf\x5b\xe8\x1f\x03\xef\x00\xab\x3f\xe0\xac\x03\x09\xc9\x03\xd9\x0a\xb6\x03\x7d\xce\x99\x4c\x66\x77\xef\xff\xbd\x1d\xb7\x4c\xb8\x45\x31\x70\x0c\x20\x8c\xbe\xc1\xcd\x5f\x0f\x09\x7f\x8a\x83\x77\x32\x70\x83\x03\xd1\x60\x30\x27\x74\x84\xf6\x0c\x00\x38\xc9\xa0\x22\x2f\xb0\xc5\xfd\x07\x6e\x10\x9b\xa6\x28\x68\x1c\x17\xf6\xde\xa5\x32\xeb\x35\x6e\x56\x77\x6b\x44\x00\xa9\xdc\xd0\x14\x47\xc1\x96\xc2\x4b\x33\xaf\x03\xbc\x2b\x6b\x3c\xb1\x21\xc9\xdf\xa8\xf0\x20\xa6\x1f\x85\x86\x71\xe4\xad\xb8\x4e\xae\x11\x6a\x90\x35\x75\xc8\x3b\x90\x78\xb3\xeb\x60\x74\x48\x81\x5d\x94\x2f\xce\x4b\x8e\x6e\x07\xb1\x06\x77\x1b\x79\x70\x6b\x38\xbe\xf7\x0e\x14\x51\x68\xb9\x6b\x62\x15\x04\x9e\xf3\xec\x2b\x45\x2e\xf3\xb2\xfc\x1a\x40\x5a\x86\x26\xae\x27\x29\xaf\xc0\xd3\xc6\x15\xc5\xc8\x3f\x80\xd3\x01\x0c\x88\x91\x47\x49\xc0\x1d\xbd\x0c\x66\x24\xe9\xba\xc3\xe2\xeb\xf3\xe1\x7a\xee\x06\x20\xd5\x0f\xa8\x6b\x12\x40\x47\xf8\xcc\xd2\xde\x9b\x9c\xb2\x03\x40\x56\xcb\x7f\xa4\xdb\x55\x82\xdd\x60\x82\x60\x89\x85\x03\x34\x6b\x48\x63\x37\x2e\x7b\x7f\x71\x7f\x85\x6e\xb9\x5b\x38\x2c\x0a\x80\x1e\x20\x42\x97\x93\x60\xe6\xa3\xab\x7a\xc9\xaf\xdc\xb4\xb2\xfa\x00\x22\x86\x7b\xa3\x5c\xab\x0c\x99\x0b\x43\x9d\x15\x50\xa2\xe5\xef\xe2\xfc\x02\xc5\xd3\x2d\x7f\x4e\xcb\xa8\xde\xe7\x10\x97\x7a\x79\x07\xf1\xce\x03\x1e\x89\xeb\x1c\x96\xc3\x5e\xb5\x08\x9b\x46\xc1\x63\xa6\x02\x90\xba\x8f\xa8\xb9\xeb\x39\x1f\x4b\x3f\x78\x80\x50\x3f\x28\x28\x14\xa1\x32\x06\x12\xef\xc4\x21\xae\xd8\x8d\x28\x7a\xcc\xa7\x3b\x8d\xc2\x79\x01\xaa\xe9\x19\x49\x27\x48\x40\x90\xbb\xba\x08\x20\xbc\x19\x78\xf5\x67\x20\xc5\xc6\x4b\x4f\x4b\x32\x38\xc1\x6c\x21\xc6\x97\x42\x74\xa0\xa8\x77\xd9\x6a\x5f\xee\x6b\x55\xf8\x8d\x8e\x39\x85\xf6\x65\x3d\xf1\xa5\x2d\xd1\x59\x42\x69\xba\x1c\x84\x60\x4d\xee\x31\x9d\x35\xc4\xbb\x8f\x5d\x25\x9e\x8d\x00\x64\xc2\x5f\x54\xcf\x72\x5e\x07\xf0\x91\xa1\x13\xc5\x8b\xdc\xde\x97\x8f\x74\x16\xd9\xca\x06\x25\x5c\xc2\x5a\xd1\xe0\xb6\xea\x36\x63\x7f\xd4\xfd\x1a\x0b\x0c\xbc\x73\x9b\x35\xaa\xb5\x37\xb1\x61\x34\xea\x98\x45\xe9\x06\x8e\x21\xc5\xdb\xb3\x0d\xb1\xc4\xf9\xf0\xa4\x75\x80\x35\xfb\xe4\x36\x0d\xbb\xec\x8f\x6c\x53\xf9\xed\xf6\x16\x55\xad\x2d\x1a\x3a\x2c\x37\xdf\xa6\xbb\xf9\x3a\xc9\xb7\x60\xdd\x8f\xa0\xe9\x91\x9b\x52\xb5\x12\x14\x20\xdb\x0a\xa3\x92\xe7\x47\x97\x8c\xc8\x57\xac\x00\xe4\x16\x67\x2a\xe1\x98\xec\x7c\x0f\xa9\x19\xb1\x40\xab\x0d\x17\xe4\x0d\x0e\x17\x12\x4b\x9c\x7a\x4c\x07\x8a\x79\xe6\x32\xac\xee\x27\x11\x7b\x00\x2e\xf2\x4b\xce\xa3\xef\x94\x44\xdf\xf5\xb6\x4f\x82\xef\x9e\x0a\x97\xf5\x05\x6f\x6c\x65\x9b\x32\x55\xea\xce\xdd\x15\x5a\x00\xd8\x17\x98\xc9\xbe\xa3\xb0\x4e\xba\x29\xca\xee\x24\xb7\x6b\xb4\x9f\x24\xb5\x08\xec\x6c\x45\x53\x99\xea\x90\xb8\xd5\x28\xf9\x61\x30\x39\x09\xff\xe2\x93\x35\x22\x23\xdd\xe6\x29\x56\x74\xef\x15\xd7\xcd\xa2\x5b\x00\x96\xb4\x03\x33\x3d\x3d\x51\x3e\xe7\x8a\x08\xef\x75\x07\x4c\x65\x56\xe2\xfe\x5b\xac\xdb\x39\x06\x5f\x81\xe0\xd9\x66\x60\x73\xf9\x54\xfa\x06\xc3\xbd\xd6\xfe\x11\x80\xbb\xda\xf4\xc6\x54\xff\x48\x89\x82\x6a\x97\x28\x74\x2c\x51\x07\xbd\xff\x4c\xa1\x42\x28\x98\x70\x47\xda\xdf\x54\x0d\xa0\x3c\xd0\xa5\xb2\x51\xbd\x36\x3d\xdd\x5d\x7e\x1f\x80\x0f\xa6\x5f\xcd\x2c\x51\xf1\xa1\xfe\xdc\x39\xc4\xc5\xe9\xc4\x03\xc2\xd1\x10\xe7\x0e\xab\xde\x06\xa3\x68\x91\xfb\x55\x68\x6b\xf8\xbd\x39\xda\x6e\x20\x2a\xc0\xa3\xbc\xff\x38\x8c\x58\x29\x82\xcb\x09\x4b\x28\x8a\x62\x05\x55\x69\x5f\x56\xe6\x63\x85\xce\x30\xfa\x5c\xfe\xb1\x2f\xa1\xf1\xe5\x2f\xb1\x10\x9e\x62\x3f\xe7\x99\xaf\x6a\xf9\x55\xfc\x1e\x11\x7f\x10\x7c\xdb\x14\x6b\x75\xba\x1c\xe0\x92\x39\xfa\x2b\xed\x2e\x48\x11\x10\x27\x0c\xdd\x83\xc9\xf7\x36\xd1\x9b\x7d\xc1\xba\x6f\xce\xdd\x75\x0b\x18\x8a\x31\xdb\xd8\xf9\xe0\xc7\x3f\xc5\x8d\x19\x81\x29\xd4\x1f\xab\x7b\x39\xb6\xd2\xd5\x4b\x56\x3a\x71\x4f\x85\x65\x83\xe5\xa1\x3d\x0b\x86\x18\x9a\xf8\xf6\x0a\xc8\x7c\x83\x70\x6b\xbb\xdd\xe5\x22\x81\x1a\xd5\xd2\x10\xc8\xa3\xd7\x16\xa9\xbf\xc9\x16\xf5\x17\xdb\x0c\x7d\x52\xc4\x4d\x7b\x37\xdd\xc6\x9b\x2e\xd0\x77\xd0\xbd\xa9\x7d\x78\xa8\xe3\x44\x3d\x9d\xc3\xe3\xf0\x54\xb5\x08\x77\xf6\x3f\xda\x0c\x77\xcb\x49\xde\xa5\x7a\x5c\xb0\x9f\xd5\x94\x70\x00\xe7\x07\x7d\x85\xd7\x6f\x24\x6e\x85\x29\x98\xd9\xbb\x3d\x29\x8e\x85\x5b\x3e\x64\xd4\x7c\x54\x5e\x11\x5c\x67\x85\xef\xf0\x42\x1c\x4f\xb1\xf4\x75\x18\x77\xc8\x83\x52\x4f\x79\x50\x14\x1c\xa8\xb1\x75\x89\xfe\xeb\x7e\x9d\x01\xd3\x68\x59\x01\x36\x1d\x52\x6f\xdc\xdc\x44\x71\xd4\x00\x2f\xad\x68\xe8\x43\x0b\x8f\x37\x8d\x39\x9d\xcc\x37\xc1\xe9\xa4\xb8\xc7\x74\x51\x59\x65\x14\xd0\xa9\xc3\x58\x85\x8f\x13\x65\x33\x41\x3a\xd0\x0f\x45\x68\xe1\xfa\x9e\xb2\x72\x65\x5c\x5a\x13\xbc\x78\x1f\x72\x6a\x98\x88\x25\x0a\xd9\x59\x06\x77\xd8\x03\x11\x66\xa5\x0a\x98\xcb\xe5\xc5\x02\x7a\xbc\x0c\x30\x15\x5f\x7d\x1a\xa2\xd3\x47\x13\x80\x28\x3e\xd5\x79\x03\x4e\x6b\x9e\x47\xb7\xb6\xba\x27\x2a\x05\x60\x29\x10\x8f\x44\xa9\x3c\xaf\x9b\x81\x83\x41\xc8\xbb\xbe\x51\x23\xbe\xad\xbe\x8e\x84\xe0\x64\x7e\x50\x98\x1a\x20\x47\x55\xe6\x06\x00\xc9\xb5\xce\x0a\x53\x1d\x74\xfd\x95\xea\x0f\x80\x56\xb7\x01\x55\x4f\x1f\x51\x66\x1e\x7d\xe7\x0a\x34\x92\x2c\x4a\x03\xad\xf9\xf7\x4f\x22\x12\xda\x0c\x97\x81\x76\x01\x67\x86\x43\x8e\x32\xaa\x20\x2f\x3a\xf7\xee\xba\xd2\x34\x66\x75\x4f\xd7\xbb\x10\xc3\xf2\x91\x40\x2e\x3e\xcf\x62\xb5\x18\x85\x66\xd3\x07\x5f\x3d\x36\xc3\x93\x71\x4a\xef\x78\x11\xc7\x67\x4d\xaa\x27\xf6\x51\x84\x19\xbc\x17\xb5\x65\x35\xb2\xfa\xbe\xa7\x94\xa5\x42\x81\x2f\x3e\x96\x0b\xfb\xa8\x8e\x14\x6f\x10\x0f\x9e\x27\x04\x88\x3f\x37\x2d\x56\x3d\x9b\xda\xa7\x0f\x42\x35\x0d\xa6\x8d\xa3\x40\x61\xbf\x1f\x14\x8e\x0f\x93\x3f\x9a\x43\x1d\x95\x2b\xed\x6b\x08\x52\xf5\xe6\xa0\x4d\x13\xc2\x06\xb1\xa3\xe8\x03\x59\x6c\x7d\x97\x2d\x56\x44\x25\x58\x11\xe9\x6a\xe5\x46\x09\x77\x30\x0b\x4c\x42\x87\x2a\xfb\x50\x7e\x45\x74\x66\xb0\xd1\x81\x41\x31\xf5\xd5\x6f\x90\x64\x08\x45\x3e\xae\xe1\x42\x27\xa6\xb7\xc6\xda\xf7\x05\xdb\xbb\x24\xc2\x2a\x9f\x02\x3d\x65\xc9\x32\xbc\xdb\x64\xa5\x1f\xc2\x41\xbb\x24\x28\x8c\xbb\xb8\x66\xa7\x6a\x42\x21\xc8\x50\x2b\x76\xbc\x78\x46\xe4\xbf\x08\x1b\x1d\x40\x0f\x4d\xa9\x3a\xfd\xe0\xe0\xf3\x31\xa2\xc1\x2e\x2f\x6b\x8f\x4a\x51\x8c\x74\x01\x90\x58\x70\x42\xa9\xb3\x6d\xb6\x8b\x44\xc4\xfc\x29\x4e\x0a\xb8\x97\xac\xc0\x33\x04\x92\xae\x50\xe8\x93\xd1\xa9\x44\xee\x1f\x60\xe9\x98\x12\x23\xaf\xac\x59\x1f\xfa\x1c\xad\x6e\x87\x44\x2e\xa9\xb2\x10\x4b\x87\x8c\x0c\xaf\x2e\xbe\xa1\x87\xe8\xf9\xaa\x2c\x36\x7b\x77\x6b\xcc\x0f\xba\xce\xb6\x99\x5b\xfd\xfd\x4c\x6c\x1c\x8a\x55\x71\x28\x16\x7c\x3b\x4f\x20\xce\x58\xfb\x17\x04\x80\x9c\x4b\xa0\xea\x52\x17\x66\x4b\x65\xc3\x55\x40\x76\x4b\x3f\xad\x03\xc8\x7b\x06\x87\x96\x2a\xf5\x63\x2a\xb8\xbb\xdd\xe3\x44\xec\x7d\x48\x59\xf5\xfb\x4a\xdf\xcc\xa6\x57\xb7\x97\x8b\x5e\xb1\xf5\xa0\x0e\xae\x50\x4b\x7e\x38\x77\xcf\x81\x92\x7c\xe0\xca\x26\x56\xe8\x2f\x92\x92\x3b\xd1\xa3\x31\x10\x50\x13\x0b\xb7\x9e\xce\x3c\x0f\xb7\x7a\x9a\x6f\x5b\x92\x7c\x2f\x3e\x0d\x17\x42\x97\x3c\x6e\xee\x87\xd9\x08\x38\xaf\x3d\x49\x36\x73\x72\x0f\xdf\x5f\x8f\x80\x90\xfb\x28\x19\x37\xf2\x62\x4f\xce\x88\x8f\x7b\x3c\xf9\x98\x02\x73\xf8\x68\xb2\x18\xcf\x46\x7a\x36\x9e\xff\xd9\xf5\x95\x78\xa9\xff\xe5\x76\x08\xca\xf6\xc3\xc9\x95\xbe\x19\xcd\x40\x0c\x9f\xa8\xb7\xfb\xda\xa6\xc6\x73\xe8\x17\xf0\x5f\xeb\xf9\xa7\xe9\xed\xf5\x55\xb7\x03\x6e\xb0\x47\xd4\xf6\xf1\xaf\xa0\xa5\x0e\x2a\xef\xa3\xf9\xcd\xe8\x72\x81\x62\xee\xa7\xc3\xc9\x95\x9a\x4c\x17\xb1\x34\x3b\x71\x58\x23\x43\xf8\xe5\x74\xb2\x98\x8d\xdf\xdf\x2e\xa6\xb3\x81\x1e\xce\xe7\xb7\x9f\x47\xf0\xf4\xe5\x74\xbe\xe0\x09\x99\x8c\x2e\x47\xf3\xf9\x70\xf6\x45\xcd\x47\xb3\x5f\xc7\x97\x30\xf2\xb3\xd1\xcd\x70\x3c\x43\x21\xfa\xd9\x6c\x04\x3c\xe0\x29\xce\x39\xab\xfa\x8f\x66\xee\x0d\x7e\x7a\x2f\xa7\x93\xf9\x62\xbc\xb8\x5d\x8c\xe6\x7a\x38\x51\xa3\xf9\x1c\xa9\xb2\x61\x7c\xbb\x72\xf2\x93\x29\x33\x60\xf7\x4d\x9e\x90\xc7\xff\x34\x9a\x8d\x60\xc5\x29\xa2\x03\x17\xcb\x2f\x34\x05\xcf\xda\x9f\x22\xe2\x6b\x82\x31\x72\xa1\xb3\xfc\x2b\x7d\xbb\x2b\x0b\xfd\x1e\x6a\xab\xc9\x75\x90\xb5\x0a\x5d\x7c\x86\x7a\x19\x39\x36\x57\x6d\x6f\x00\x26\x51\xf6\x3b\xb7\xec\x30\x80\x34\x26\x3f\xb8\xaf\xe8\x80\xa1\x82\x6f\xf7\x13\x48\x04\x14\xfa\xf4\xfc\xf5\x40\xaf\xdd\x51\x5a\x6e\xf4\xd2\x3a\x3b\x00\xb0\x83\xcc\xae\xb9\xb6\x36\x50\x71\xcb\x48\xcc\x91\xb0\x86\xbf\x19\xc1\x39\x5b\x42\xa2\x69\x6d\xf3\x0c\xa4\x1a\x1f\x32\xa3\xed\x96\x5a\x45\x30\x35\x40\x73\xe6\x59\x2d\x30\x54\xaf\x7e\xfb\x34\x1d\xcf\x5f\x01\x1a\x6a\x29\x4a\x3e\x2b\x7b\xe7\x5c\x51\x03\xa1\x63\x00\x73\x31\x73\x1e\xa7\x1b\xfa\x12\xbc\x48\x68\x55\x7d\xb5\xcd\xd1\xc0\x1b\x4a\x6b\x1e\x10\xd0\x07\x03\x8f\xad\xe4\xe6\x89\xd7\xb2\x1a\x89\x24\x4e\x6d\xc5\xa8\x12\x2a\x47\x0a\xdc\xa7\x32\xd5\x8e\xa3\xbb\xa2\x1b\xd6\x10\x98\xba\x97\x01\xbc\x70\xa4\xc8\xde\x83\x1a\x3c\xbd\x82\x47\xe6\xc3\xb7\x9e\x63\xfb\xe6\x8b\x66\x5d\x7a\xf8\x16\x5c\x28\xa4\xff\x84\xeb\xc9\x3e\x73\x5b\x4a\xdd\xc0\x51\x45\x93\x42\x5c\x03\xae\x8c\xac\x22\xee\xa9\x44\xc2\xc7\x20\x28\x80\xce\xd3\xd2\x1e\xca\x22\xe8\x6e\xb7\x9a\x18\x28\xd6\xa3\x1e\xa1\x87\xd9\xd9\x5d\x43\xe0\x44\xa0\x9f\xdf\x20\x02\x64\x5c\x6c\xdc\x4d\x8b\x44\x19\xc9\x61\xc8\x90\xab\xc9\x5d\xac\x1a\x4a\xa9\xa8\xe5\x81\x38\x15\x30\xee\x48\x00\x92\x4c\xfc\x9c\x00\x4a\xa7\x50\xf1\x04\xb7\xfe\xb5\x5d\xe5\xa6\x32\x90\x4f\xfe\xeb\x1e\xf5\xf8\x89\x56\xb8\x1e\x28\x66\x62\x88\xce\xc4\xe8\x0e\x70\x2a\xff\x2a\xca\x36\xd2\x4f\x01\xdc\x74\x28\xf7\x0a\x2e\x6b\x98\x83\x2e\x98\xb8\x98\x3d\x7f\xc2\x7a\xf1\x1e\xaf\xf5\x0c\xf0\x72\x6b\x5b\x34\x03\x77\x57\xb3\x77\x3e\xc1\xd5\x59\x42\x98\x0f\x47\x62\x8e\xac\xf0\xff\xc5\xdd\xae\x05\xc1\x04\x25\xe0\x61\x4b\x14\x6b\x41\x2a\xaa\x84\x96\x2e\x34\x31\x7c\x9f\xc1\xe2\x11\x08\xb8\xd6\xe7\xee\x73\x17\xfd\x7c\xc6\x2a\x18\xba\x5d\x55\x86\x90\x1c\x12\x87\xd5\xd9\xb7\xe6\xa0\x4f\xbf\x67\xfb\x24\x85\x1b\xc5\x67\x25\x82\x42\xdd\xd8\x2a\x2b\xd7\x27\x03\x66\x3f\x66\x43\xe7\x06\x84\x2e\x5d\xf8\x08\x34\x95\x90\xa3\x18\x24\x17\xfb\xf9\x34\x1b\x38\x8b\xb0\x33\x07\xf9\x21\x43\x94\xbb\x39\xe5\xbb\xc0\xd9\x15\x78\x2b\x0e\x5f\x7b\x3c\xfa\xce\xd4\x8d\x33\x2e\x04\x9f\x26\x78\x7a\xc7\x85\x64\xfe\xaa\xd6\x78\x86\x82\x4a\xcf\x1e\x4f\x8e\x24\xaf\x63\x5a\xa4\xed\xc0\x4a\x17\x4b\x4b\x2b\xec\xff\x61\xef\x5f\x97\xdb\x38\xd6\x74\x41\xf8\xfb\x9d\x57\x91\x81\xf8\x66\x9b\xd8\x51\x84\x08\x52\xb6\x96\xa5\x89\x1d\x1b\x22\x21\x09\xdd\x14\xc0\x06\x40\x7b\xa9\x3b\x56\xec\x9d\x40\x25\xc8\x5a\x2a\x54\xa1\x2b\x0b\xa4\xd1\xbf\xe6\x1e\xe6\x2a\xe6\x36\xe6\x52\xe6\x4a\x26\xf2\x3d\xe4\xa1\xaa\x40\x52\x5e\x5e\xee\xd9\xdd\xe6\x0f\x87\x4c\x02\x55\x79\xce\xf7\xf0\xbc\xcf\xd3\x78\xc1\x40\x4c\x36\x3c\x40\x46\x65\x69\x63\x80\x54\x28\x7c\xc6\x7d\x03\x95\x6a\x12\x3b\x04\x7b\x0e\xb7\x8b\x40\x0e\xe6\xba\x31\x42\x29\x4e\x64\x30\xb2\x0d\x02\x6e\x47\x3e\x1b\x77\x89\xed\x6e\xee\x78\x91\x74\x83\x1a\xfd\x76\x3b\xb6\xf6\x54\x91\x8a\xf3\x63\x74\x24\xae\x1a\xfe\x97\x5d\xe6\x45\x0a\xda\x43\x81\x2e\xca\xdc\x8f\xc6\x4f\x2a\xdf\xeb\x76\x90\xa0\x41\xd7\x72\xfc\x5c\x71\xc7\x45\xb8\xba\x3a\x37\xaf\x7c\xe9\xe6\x15\x01\x3b\x0c\x02\x5d\x50\x18\x8a\x8b\xee\x2a\x6d\xca\xfc\x41\xa7\x1e\x29\xb3\x3a\x44\x81\x57\x5d\xd7\x08\x8a\xeb\x0b\xf4\x1e\xe9\x26\xa2\xf3\x93\x06\xa7\xab\x4b\x7e\xf6\xe8\xd8\xc0\xab\x9a\x47\x4b\x3c\xf0\x68\xd5\x9e\xbb\x22\x9a\x45\x18\xf1\x60\x28\xba\x66\x51\x9e\xd3\x91\xb1\xd2\x00\x98\x2c\x50\xe2\x5e\xad\xd7\xe5\x1e\xd5\x8e\x52\x8d\x13\xcb\x10\x53\xb5\x85\xbf\x58\x3f\x98\x1b\x80\x63\x44\x52\x9d\xce\x25\x73\x2c\xec\x73\x5d\x57\xa5\x42\x25\x10\x1f\xd2\x08\x6d\x3e\x39\x09\x09\x91\x6c\x97\x82\x7b\x09\xe3\x0e\xae\xd9\x3f\x9e\xa8\xbe\x7d\xfb\x8f\x27\x2b\x87\xe8\xb3\x07\xa9\x2e\x52\x84\x20\x39\x9b\xd0\x11\x95\x87\xf7\x0d\x0f\x94\x08\x89\x71\xca\xca\x10\xa7\xa7\xd1\x79\xae\x2b\xd3\x67\xb9\x08\xa2\x16\x44\x9e\xf9\x58\xf3\x1c\x52\xe2\x98\x90\x0d\x1e\x14\x08\xb2\xf8\xf9\x0e\x7a\x13\x9b\x15\x75\x64\xf8\x0e\xcf\x62\x5d\x9d\x4d\xa8\xab\x83\x16\xf4\x74\x26\x2f\x27\xf3\xcb\xdb\xcf\x8b\xa5\xf5\x57\x50\x5e\xc9\xfd\x29\x14\xc6\x49\x04\x0b\x06\x2d\x67\xf3\xa5\x3c\x71\x1e\x9a\x9c\x8e\x3f\x5e\x4f\x3e\x8e\xa7\x97\xe3\x7e\x82\xce\xc6\xc8\x7a\x27\xb1\x80\xd2\xe2\xd3\xe8\xfa\x3a\x72\x52\x12\x61\x1d\x8f\xc0\x39\x49\xd8\x6d\xb9\x9a\x2c\xf8\x77\x5d\xbe\x81\xfb\xdc\xe2\xf6\xc6\xba\x8b\xf6\x43\xf0\x2c\xd6\xc1\x21\x55\xa9\x24\x16\xfc\xb1\x9f\xb8\x19\xcf\x17\xb3\xa9\xd3\xf8\x99\x4c\xaf\x26\x73\x70\xa5\x58\xed\x47\x06\x6a\x3f\x02\x1c\x9f\x40\xf0\xc7\x29\xfb\x90\xd3\x74\xf9\x69\x64\xbb\x3a\x9e\x3f\x23\x0f\xc5\xdf\x13\xf6\xbd\xd7\xb3\x05\x3c\xe0\xe3\x6c\x76\xf5\xf3\xe4\xfa\x3a\x41\x71\xab\xc5\x72\x76\x73\x33\xfa\x38\xb6\x23\xf8\xf9\xe6\xd6\x3e\xf4\xc3\x68\x72\x7d\x3b\x07\x47\xf4\xf3\xe8\xfa\xc3\xed\xf4\x12\x9f\x86\x8d\x17\x76\xa6\xec\x98\xb2\x93\xf7\xd9\xfa\xb6\x51\x2b\xf1\x65\x76\x20\x58\x56\xc8\x0d\xcf\x17\x9a\x90\x4f\xa3\x9f\xc6\x02\xf4\x85\x26\x53\xeb\xb4\x76\x0a\x0c\xc9\xa6\xc0\x10\xbb\x71\xdc\x43\x9c\xa5\x11\xc9\x11\xe1\x93\x23\x99\x27\xf7\x47\x18\xfa\xab\xf1\x68\xf9\xc9\x36\x0f\xa7\x63\x74\x2d\x27\xd3\x7f\xb8\x9d\x83\x67\x7b\x7b\xbd\xb4\x6b\xea\xc3\x7c\xf6\x19\xde\x29\xa0\xb5\x8b\x60\x91\x35\xa4\xa0\x62\xf9\x27\xbb\x46\x3e\x4d\xde\x4f\x96\x0b\x6c\xb1\x6f\xe3\x40\xbc\x40\xd3\x2a\x90\xaa\xb2\xa3\x17\x75\xd0\xaf\x8c\xa3\x0b\x03\x24\xaf\x60\x6c\xfc\x73\xec\x34\x05\x0f\x6a\x2a\x60\x09\x54\xc0\x1a\x0e\x07\x74\xb4\x9a\x8c\x92\x3f\xd6\x3e\xe1\xba\x84\x91\x71\x02\x0c\x11\xa6\x2e\xa6\xd0\x04\x71\x09\x2a\xec\x37\xad\x12\x0d\x26\x23\x2b\xd2\x26\x75\x7e\x72\xe4\xda\x4a\x44\xb9\x87\xe3\x33\xab\x0d\x69\xf9\xba\x93\x84\x2e\xf9\x8e\x40\x61\x50\xf0\x55\x97\xc8\x35\x07\xe0\x97\xa3\x0d\x6f\x70\x8a\xc1\xc5\x57\xc5\x63\x81\x15\xfb\xfa\x5f\xf7\x19\xa2\x04\xa0\x60\xdf\x97\xf2\x92\x9d\x1d\x32\xf0\xb2\x0a\x44\x2b\x07\xcf\xae\x1e\x32\x6e\x6c\x33\xc3\xe1\x48\x07\x6f\xb2\xd3\x71\x3e\x40\x92\xe1\x8f\x50\x1c\x08\x37\xd1\xb8\x48\xe5\xad\x01\x66\xb9\xe5\x31\xe4\x59\xa8\xb2\x97\xd5\x7a\x9b\x20\x61\x99\xc2\xa2\xe0\x80\xcc\xd3\xde\x84\xaf\xff\x24\x2f\x07\x1f\x06\xf3\x81\x3c\x1f\x0c\xcf\x86\xf2\x64\xb6\xae\x07\x72\xf8\xe3\x8f\xdf\xf7\x13\x86\xee\x00\x48\x65\x13\x8a\x7b\xbb\xac\x89\x0b\x81\x22\x90\xce\xbd\xb7\xfd\x81\x08\x77\x97\xb0\x90\x2c\x0b\xd0\xa0\xc9\xdb\x68\xd1\xf0\x7c\x70\x3e\x3c\x97\x27\x0b\xbd\xe3\x36\x41\xe1\x40\x24\xba\xef\x3e\x2e\xe8\xe3\x40\xab\xeb\x7b\x75\xfe\x66\xf0\xe6\xfc\xec\xfc\x74\xe8\xfc\x7e\xf7\xab\xd7\xf2\xe4\x1f\xf6\x85\xe6\xde\xda\x89\x6a\x8c\xb7\x70\xe3\x2d\xd5\x1a\x15\xf6\x8f\x20\xb7\x90\x43\xaa\x34\x5e\x19\x56\x03\x1d\x63\x7d\xcf\xd5\xc0\x42\x0c\x2f\x1a\x02\x48\x8d\x5c\x91\x2b\x01\xa0\xb2\x18\xeb\x62\xeb\x3a\x14\x40\x59\x97\xc5\x5a\x57\x05\x17\xee\x31\xa1\xc6\x16\x4a\x8a\x24\x51\x12\xbc\x48\x89\xe7\x5e\xe7\x24\x10\x25\x22\x25\x9e\x17\xa8\xda\x60\x5f\x23\xf6\x86\xb6\xa4\x4d\x56\x47\xe2\x35\x71\x47\xdd\x33\xc3\xb2\xd7\x4b\x95\x67\x9b\xb2\x2a\x32\x25\x73\xf5\x18\xf0\xc2\x89\x13\xcd\x29\xc3\xf0\x9d\x41\x16\x01\xc5\x82\x48\x1c\xdb\x31\x23\xbb\xb4\x4a\x3f\x91\xce\x56\x12\xf6\x18\x59\x97\xc5\x26\xcf\xd6\xf5\x69\xb9\x39\x8d\xdf\x85\x07\x87\x2f\xe8\x0e\x30\x51\x54\x8b\x10\x84\x06\x62\xf6\xc4\x20\x72\x07\xc6\x6b\x09\xe0\x2e\x3c\x09\x83\x41\x6c\x9c\x87\xa5\xa9\x4d\x50\xd7\x2b\xba\xea\x7a\xd7\xe5\xbe\xaa\xe9\xa3\x68\xd1\x39\xef\x42\xd5\x75\x59\x15\xfa\x60\x24\xb0\x59\x22\x4f\xf2\x0e\x8c\xc1\x81\x58\xfa\x02\xd3\x10\xb1\x70\x5b\x40\x9e\x75\x4a\x89\xe3\x4b\x20\x00\xab\x49\xf4\x10\xce\x44\xb5\xae\xbd\x7c\xe9\xa4\x20\xfe\xc2\xb2\x50\xb9\x58\x28\x2c\x36\xf8\x58\x96\x29\x68\xc2\xf8\xb1\xc2\x31\xd6\x29\x56\x1f\xdb\x71\xed\xce\x7a\x7b\xde\x6a\x58\xc4\xb9\x2a\xee\xf6\xea\x8e\x44\xb0\xd7\xf4\x7e\x3f\x64\x70\x5c\x56\x7b\x9d\x46\x14\x96\x69\x85\xa5\x51\x5e\xd7\x3f\xa0\x60\x8b\x32\x46\xc3\xd7\x83\x90\xfb\xbb\x04\x49\x53\x3b\x9b\xcb\xd6\x85\x41\x27\x04\xb2\x0f\xc4\x79\x21\xd0\x88\x15\x59\x21\xf7\xbb\x1d\xd6\xf1\xe6\xe5\xa3\xae\x00\xbe\x92\x90\xe2\xbc\x2a\x02\xc9\x3e\x8c\xea\x10\x09\x3a\xb2\xf4\x50\xd5\x9d\x5d\x16\x14\x21\x21\xda\x3c\x3a\x3c\x77\xf9\x81\x85\x69\x42\xac\x28\x47\xd6\x92\x67\xab\xad\x9b\x09\x2d\x99\x19\xb3\x77\x99\xb4\xa0\xd6\xfa\x83\x6d\xbf\x6f\x5a\xa6\x89\x1d\x95\xf2\xf9\x10\xde\x11\xd4\x6a\xc7\xca\x54\x95\xb9\x49\x10\x62\x15\xb0\xc9\xc0\x6f\xf0\x05\xa8\x10\xc2\x7f\x86\x7e\x40\x60\x42\x6d\x36\x59\x0e\x82\xf4\x02\x7f\x07\x55\x9c\x9d\x11\x61\xcf\x57\x97\xb8\xe7\xe0\xe0\x9e\x64\x88\x2e\xdb\xd9\x61\x67\x63\x41\x04\xa6\x02\x80\xa0\x80\x44\x16\x17\x08\xfc\x92\xb0\x91\x5b\x55\x28\xf2\x40\x59\x06\x19\x7b\xe7\xa7\x76\x75\xf0\x6b\x2f\xcc\xc9\xfa\xd0\x4a\xf9\x58\x68\x94\x4e\x2f\x37\x72\x93\x6d\x6a\xd0\x82\x59\x43\x5c\xe9\xfb\xb3\xff\xad\xcf\x05\x19\x1c\x0a\x2f\xf7\xb5\xc3\x01\x99\x7b\x55\xd9\x41\xc6\x67\x65\x7d\xb9\xd2\x85\xde\x10\x3e\x25\x7c\x6e\xd0\x36\x58\x93\xa2\xab\xd0\x55\xa5\x0f\xb8\x8c\xc0\x7e\x70\xa3\xcb\xeb\xec\x29\x68\x0d\xe2\x37\x5c\x32\x9b\x2e\x2b\x92\xe0\xcd\x72\x6d\x2d\xb2\x90\x17\x1f\xc6\x62\xe5\x8b\x5d\x1f\xd5\xa1\xc5\xe5\xa8\x2a\xdd\x94\xbd\xe6\x22\x77\x84\x01\xec\xeb\x1c\xbe\xef\x6f\xc2\xef\x07\x8e\x67\x10\xe3\xda\x6c\x92\xc4\x3c\x95\x0e\x74\xc3\x11\x6d\x36\x12\xa0\xf0\xa5\xbe\x57\x85\x28\x0b\xed\x56\x76\x17\x70\xd9\x31\x1e\xda\x97\x27\x58\x76\xb9\xbb\x57\x2b\x0d\x21\x1e\x06\x07\x6d\x4a\x44\x01\x84\x6c\x88\x2e\x91\xa0\xa0\xc4\x1e\xea\xa7\x8f\xbc\x88\x79\x66\x11\xd2\xc6\x5c\xe9\x6c\x6e\x79\x62\x46\xfb\x7f\xe6\xbe\x7c\x84\x38\xd7\x4e\x55\xba\xa8\xef\x35\x9c\xd5\x21\xc8\xee\x2d\x8a\x05\x7e\x03\xcb\x97\x6c\xb0\x7c\x89\x17\xb0\x7c\x0d\xac\x61\xe5\xbb\x74\xde\x17\xa2\x99\x59\x7f\x2b\x97\xce\x6c\x54\xc6\x0d\x7e\x5b\xc9\x01\xe7\x0e\x4f\x01\x6b\x42\x89\x86\x2e\x46\xf4\xa6\xe1\xc9\xaa\xdf\x77\x14\x92\x6f\xe5\x0b\xd4\x4c\xe8\x09\x38\x90\x3b\x55\xa9\xbb\x4a\xed\xee\x83\x08\xa9\x7f\x9e\x33\xcc\xde\x7e\x8b\x48\x48\xe3\xd2\x58\x1e\xa7\x8f\x0b\xce\xc8\xe3\xcc\x71\x5d\x44\x71\xa2\x49\x27\xf7\x6c\xa7\x50\x26\x3d\x98\x1f\x29\x9d\xe7\xf5\x56\xb6\x15\x52\x9e\x1d\xa2\xa8\x91\x38\x3e\xbf\x9a\xef\x4f\x44\x7c\x7f\xa1\x1e\x84\x4b\x26\x88\x5f\x43\xf7\xd7\x59\xc3\x26\x5a\x4b\x55\x4a\x8a\xbb\xbe\x85\x8d\xd9\x2c\x9c\x8c\xe0\x52\x8d\xf5\xf7\xfa\x44\xdb\xf5\x17\x80\xd2\xf0\x19\x3b\x97\x35\x81\xea\xe7\x0d\xdc\x1b\x80\xc6\xdf\xbe\x48\x70\x41\x04\x85\x3c\x79\x6e\xbf\xb4\x0f\x78\x84\x11\xcd\x85\xb0\xd6\x5d\xbe\xc7\x0e\x2b\x63\xca\x35\x9e\xdd\xbe\x8a\xd9\xdf\x81\x90\xde\x31\x89\x44\xc4\x1b\x6d\x40\x42\x71\xdb\x9b\xd1\xda\x0c\x59\xee\x2b\x99\xac\x75\xa4\xf2\xdc\x59\x7b\x11\x5a\x5c\x38\x06\x3a\xb4\x4c\xa8\x26\xc3\x95\x76\xb1\xdb\x66\xfd\x71\x00\x14\x06\xd6\x56\x5c\x56\xda\x59\x05\xde\xda\xe4\xaa\x8f\xd3\xf4\xa5\xdc\xd3\x1e\xef\x70\x3f\xdd\xc7\x5f\xb7\x53\x87\xe3\x3f\x43\x10\x45\x8e\x04\xec\x47\x0a\xb3\x03\x0f\x22\x95\x5f\x3b\xa1\xc4\xdf\xb8\x0e\x96\x51\x2a\x54\x84\xd2\x0a\x14\xb4\x99\x80\x00\xa8\x95\xa6\x94\xda\xb4\x07\xbc\x3f\x01\x71\x6d\xc2\x17\x49\x12\xe8\x10\x7d\xae\xf0\x80\x49\xcf\xac\xfb\x16\x3b\x0d\xa8\xe8\xb0\x26\x07\x3a\xd9\x71\xe1\x3e\xa3\x1f\x15\xc8\x47\x61\x12\x8c\x0f\x05\x5f\xd4\x84\xf0\xa2\xdd\x81\xf1\x52\xee\x75\x88\xd5\xce\x88\x4b\x0d\x58\x0e\xd7\x6d\x56\x1c\xa4\x5a\x24\x4f\xad\xad\x86\x17\x01\x01\xdd\x3b\x89\x8c\x21\x64\xfa\xf1\xd0\x33\x2f\x41\xf7\xf8\xf8\x38\x58\x65\xd6\xd5\xb1\x1d\x1c\xac\xcb\xed\x2b\x3a\xc4\x5f\x0d\xec\x46\x6e\x0a\xd4\x44\xea\x82\xe1\x45\x15\x7c\x00\xa3\x39\x08\x14\x82\x48\x8e\x8b\x9a\x8a\x6e\xa0\x10\x8d\x00\x73\x4a\x21\x75\x50\x9e\x59\x7f\x67\xa1\x63\x6e\x68\x76\x9d\x48\x1b\x74\x2d\x9c\x8f\x83\x0e\xaf\xf7\x00\x60\xdb\x86\x30\xde\x56\xbb\x07\xa2\xa5\x85\xf5\x87\xf8\xde\x7f\xbc\x9f\xc1\xab\xcb\xf1\x7c\x7a\x3a\xfb\x74\xfd\xf7\x52\xff\x7b\x4e\xff\x6f\xf8\xe6\xcd\xd9\xeb\x86\xfe\xdf\xc5\xc5\xd9\x1f\xfa\x7f\xbf\xcb\x8f\x9d\x7d\x39\xfb\x74\x2d\x1f\x40\xe1\xef\xfc\x6c\x38\x3c\x3d\x7b\x73\x7a\xf6\x27\x79\x2a\xed\xdf\x12\xf9\x51\x17\xfa\x41\x25\x72\xf1\x98\xd5\xff\xa6\xab\x5c\x15\xa9\x10\xf8\x35\x7b\xe0\x7f\x22\x66\x4b\x3c\x37\xd6\x9a\x1e\x14\x0a\xc5\x61\xf8\x13\xce\xf5\x27\xbe\x77\xd2\xe3\xb6\xf4\xfa\x0e\x59\x3d\x1c\x0c\x31\xaf\x3e\xab\xee\x54\x41\x21\x78\xf1\x98\x99\x7b\xcd\xa1\x73\xa3\x29\x53\x9e\xd5\xc6\xf1\x6c\x12\x06\xca\xc8\x13\x65\x02\x2c\x71\x59\x84\x47\x7b\x79\xff\x58\x81\xac\x68\x5f\x28\x23\x1f\xb3\x54\xe7\x07\xa8\x6d\x75\x45\x15\xf6\x94\x74\x34\x5a\xa0\x36\x51\x9a\x1a\x22\x0e\x79\xae\x56\x25\x25\xe4\xd5\xb6\x2c\xee\x48\x78\x56\x54\xda\x68\x55\x81\x42\x5b\xd4\x14\x17\x3b\x77\x23\x0e\x11\x0d\xbe\xac\xcb\x0d\xfc\x01\x62\x58\xd6\xb5\xcc\x8c\x78\xd4\xf9\xba\xdc\x3a\xf0\x75\x1d\x7c\x17\xae\xc6\x80\xc3\x17\xd9\xac\x8a\xfc\x90\xb8\x3b\x20\xe2\x42\x2a\x37\xd2\x8e\xbe\xbd\xf7\xe3\xc1\xa7\x61\xc2\xd0\x19\x31\x2b\x7a\xe2\x26\xa3\xab\x07\x60\xce\x19\x86\xa1\x2c\x23\xc4\x24\x74\xc6\xd6\x44\x99\xe6\x78\x92\xc9\x99\x86\x84\x6f\xfc\x87\xad\x56\xf6\x12\x32\x6f\x85\xe8\xd1\x77\x89\x04\x3c\x5c\x1e\x9f\xae\x07\x42\xf4\xae\xc2\xc0\x3d\x7f\xca\xac\xef\x35\x62\x19\xd3\x4c\x41\xe9\x5b\xc2\x7d\x48\xe4\x3a\xab\xd6\xfb\x0c\xac\x28\xfe\xe7\xaa\x54\x55\x2a\x72\x75\x28\xf7\xb5\x49\x98\x1c\xcd\x3a\xe0\x69\xa5\x1e\x51\x84\x7b\x63\x0d\xbb\xf5\xbd\xaa\xe8\x5a\x74\x95\x1e\x90\x53\xfe\x85\x14\xcd\xb0\x24\x4d\xff\xb2\xcb\x55\x81\x08\x2b\x57\x63\x86\x61\x5a\x08\x49\xe6\xd9\x3a\xab\x3d\x21\x27\x54\x11\x40\xc7\x1b\x42\xb9\x0e\xfe\x7f\x8c\xab\x7b\x8d\x6a\x86\x32\x1a\x05\x66\x48\x0c\xa8\x2d\xf7\xdb\x50\x74\x8e\xf1\xf5\xac\x94\x4c\x80\x39\xc8\x88\xa0\xba\x08\xc6\x71\x63\x9d\xf1\xb2\x90\x3b\xb5\x83\x70\x44\x96\x93\x9d\xee\x98\x7c\x99\x3f\xb3\xe7\x1c\x51\x9c\x09\xc6\x25\x15\x24\x55\xc9\x5f\x73\xce\x94\xb2\x33\xf3\x00\xa6\xf3\x3e\xcb\x6b\x09\xf0\x71\x60\xc6\x88\xfb\x44\xeb\xd5\xad\xe5\xe8\xaf\x03\x5e\x28\x46\xbb\x95\x02\xce\x9c\xaa\xf7\x15\x06\x3b\x31\x9e\x48\x41\x8b\x56\xa8\x33\x48\xd2\x09\x1e\x58\xf7\xcc\xb2\x7a\xc9\x33\xd1\x5f\x84\xf8\x07\x0a\x8f\x62\x4b\x4d\xdc\x52\x88\x6f\xf9\x9a\x87\x3c\x54\x50\xf7\x98\x49\x52\xa7\x56\x45\xfa\x4a\x22\x7f\x2a\x19\x86\x86\xc3\x57\xfb\xbc\xb6\x33\x19\x8f\x51\xb3\xc4\xe2\x29\x96\x77\xe8\xe0\x88\xcd\x38\x64\xd5\x24\x10\x11\xf0\x0e\x42\xf5\xcc\x4a\xbb\x42\x81\x92\x02\xc1\x30\x55\xf6\xdc\xb5\xb3\x0d\x0c\xff\x54\x6d\x44\xc4\x21\xe2\x7c\x30\x0c\x62\xd7\x6b\x36\x2a\xb1\xe5\x4e\x4b\x14\x52\xaa\xdb\xa8\xb6\x37\x92\x92\xe7\x02\x2c\x3f\x12\xb1\xc0\x23\xd7\xf4\x37\xd2\x76\x84\xc9\xdc\xaa\x62\xbf\x51\x6b\x56\x0f\x15\xcd\xaf\x72\xc5\x3d\x68\x03\x06\x8b\xc1\xc5\x1c\x1d\xe8\xa4\x99\xbc\x5d\xeb\x24\xf4\x2f\xb5\xcc\xaa\x4a\x3f\x94\x6b\x80\xcd\x61\x85\x23\xf4\xd4\x74\xcf\x01\x68\x22\x9c\xc7\xe3\x93\x45\x08\xa2\xa8\x42\xdc\xe5\x9c\x63\xa7\x1e\xaf\x1c\x82\xe6\x62\x62\x01\xd8\xee\x1f\xb3\x34\x56\xee\x0b\xea\x41\xb3\x02\xd5\xb5\xc3\xc4\x2c\xcd\xba\xb1\x07\xa3\x70\x19\xa2\xb5\x0e\xe2\xae\xc8\xa1\x65\xf6\xab\x53\xfa\x1b\x76\xe1\x22\xee\x82\xab\xd1\x75\x59\x0e\x4e\xac\xda\xc3\xa2\xda\xe2\xbf\xb8\xfa\x38\x2f\x15\x96\xf5\xd5\x25\x7b\xfd\x5b\x38\xef\xf0\x20\x60\x8c\x32\x9d\x62\x1c\xd6\x5b\x97\xc5\x5f\xa9\x28\xd9\xbb\x6c\xf1\xfc\x8b\xe3\x27\x04\x56\x8e\xd7\xf7\xc1\xd4\x2f\xef\x1d\x90\x31\x2a\x97\x0e\x9a\x2c\xb8\xc9\x99\x69\x7a\xb4\x61\x7e\x8f\x46\xe1\xc8\x84\x5f\x58\x0f\xfd\x45\x2b\x5e\x3e\xbd\xe2\x45\xab\xc7\xf6\xe1\xc3\x78\x46\x71\x51\x7c\xd5\x7a\x67\x07\x58\xad\x6b\xe6\xf1\x23\x0b\x02\xb6\x88\x67\x10\x67\xef\xdf\xae\x27\x4a\x55\x61\x34\xc0\x9e\x66\x10\x71\x8a\xc3\x8f\x6b\x02\xfe\x97\x6c\x3d\x04\x65\x31\xc4\x2e\x94\x69\xe2\x94\xcd\x4c\xab\x86\x33\x3e\xb5\xe5\x27\x6e\x6f\x83\x54\x97\xa9\xed\xb3\x42\x44\x54\xba\xf8\xd2\xc6\xbc\x26\x84\x00\xc7\x5a\x6d\x5c\x35\xc9\x91\x65\x90\x60\xcb\x30\x7d\x7d\xec\xd8\x8d\x4f\x5c\x98\xc1\xf3\xf6\xb6\x09\x64\x91\x83\x67\x3d\x35\x8b\x70\x6e\xae\x54\x9d\x6d\x05\xf1\x2a\x76\x9f\x62\x8d\x7b\xbb\x95\xbb\x08\xb8\x50\xc8\x85\x47\x2a\x36\x43\xd1\xaa\x8b\xc1\x10\x1a\x7d\xd1\x6e\x74\x50\xec\xd6\xda\x1e\x70\x2b\x23\x67\x0a\x4f\x00\x4a\x25\x47\x4f\x78\x71\x5f\x8f\xef\x45\x71\x52\x13\xc7\x47\xe6\xe9\x7f\x31\xdb\x1f\x09\xb2\x68\x2c\x2e\x5c\xe9\x75\xb9\x0d\xff\x50\x56\x00\x87\x78\x54\x07\x23\xe2\x02\xc8\x7b\x5a\x4f\x6f\x99\xe6\x54\x0d\xa2\xd2\x92\x60\x84\xde\x01\x18\xdf\x27\xe4\x8e\x1c\x1b\x90\xb4\xab\x2a\x80\x2b\x6c\xb3\x82\xab\x1e\xec\x16\x09\x39\x98\xe2\x3b\xe1\x5e\x05\x94\x12\x1d\x13\xec\x8e\xaf\x14\xa0\xbb\x60\x4c\xd6\x2a\xcb\x9d\x5e\x40\x14\xd1\x7d\x07\x98\xdd\x30\x79\x7f\xa4\xad\x2f\xbb\xfe\xd9\xbe\x81\x9d\x43\x44\x72\xee\x2c\x4b\xa4\x92\xc0\x36\xd5\xcd\xf7\xbc\x06\x2e\x04\x36\x2f\x21\x7b\x2b\x56\x07\xb0\xc7\xdf\xc1\x11\x22\xd2\x81\x34\xba\x48\x65\x1c\x33\x3b\x3e\xb8\x76\xf3\xf3\xac\x9a\x20\x99\x1b\xcb\xc3\xec\xc0\xea\xee\xda\x2d\xf8\x95\x47\xdb\x0b\x7e\x49\x12\xaa\xc1\x53\x38\x14\xcd\x72\x77\xaf\x3e\xde\x97\x30\x49\x76\x2f\x69\x43\x26\x30\x33\x10\xbc\xa4\xe9\x82\x0b\x66\xdd\xfa\x53\x64\x22\x02\x12\x09\x0f\xde\xee\x5b\x0a\xb6\xe6\x6b\xbf\x35\xd7\x3a\xc8\xd9\xf8\xbb\xa4\x64\x0d\x41\x52\x4f\x41\xb0\x42\x66\xfd\x4a\x9d\xb2\x33\x23\x5c\xe6\x11\x00\x33\x0d\xf3\xa1\xa9\x37\x1b\x31\x87\x02\x0c\xc6\xd3\xcc\x8b\x06\x22\xbd\x6d\xf7\xe0\x85\x09\x3a\xec\x6e\x51\xf8\xfd\xf4\xda\x21\x22\x04\xa6\x56\x41\x82\xcf\xb9\x17\xcf\x4c\xa2\x37\x97\x9b\xe3\x1c\x08\xde\x44\x15\x5b\x20\xec\xfc\x39\x36\xf3\x5a\x16\x22\xdf\xf5\xf6\xc3\xc3\x8e\xc3\x30\xf8\x7a\x74\xe6\xbb\x2f\x72\x69\x76\x74\xca\xc4\x7b\x3d\xb2\xcd\x4b\x0c\xf5\x47\x45\xfd\x60\x5b\xf8\x07\x86\x8b\xab\xed\xe2\x1c\xb9\xb5\x80\xc7\x2f\xdc\xa4\x8c\xc8\x60\x39\x79\xe1\x67\xc2\x76\xb6\x71\x5d\xc1\x45\xfc\x90\xc5\xf4\xb9\x41\x29\x83\xaf\x25\x0b\xf6\x46\x56\xa4\x70\xca\xa7\x80\x49\x7a\xcc\xcc\x7d\xb8\x49\x5a\x74\xb2\x6a\xc5\xaa\x18\xf5\x61\xa7\x13\xf9\xaf\x7b\x85\x69\x61\x04\x53\x82\x53\xb4\x11\xc4\x07\xd6\x98\x1f\xd9\x3a\x3d\x4f\xee\x55\xda\x0f\x27\x28\x45\xde\x0f\xae\xbc\xa5\xc0\xb4\x73\x3a\xbe\x1f\x0c\xc3\x7a\xcb\xff\xe7\xff\xf8\x3f\x3b\xdc\x62\x22\x62\x3f\x76\x1a\x51\x49\x1a\x4c\xb4\xe8\xd9\x11\x20\x5d\x74\x24\x07\x6f\xc6\xd5\x03\x73\x27\x09\xa5\x0f\x1a\xce\xb5\xa8\xcb\xa4\xe3\x2b\xb6\xfb\x5b\x5d\xad\xef\x55\x51\x53\x2f\x12\x2c\xd9\xa8\x33\x63\xfb\x5c\x56\x07\x3b\x86\xf8\x07\xa8\x80\xcc\xea\x42\x1b\x43\x64\x32\x01\xbd\x00\xa1\x54\x5c\x21\x79\x15\xd8\x65\x60\x78\x71\x41\x4d\xa7\xb5\xf1\x8c\xcd\x6c\xfb\xee\x52\x68\xcb\xd0\x37\xb1\x07\x88\xb5\x1f\x1b\x71\x02\xe1\x48\xdb\x1a\x4b\xf8\xd8\xd2\x8e\x5f\x92\xa0\x2f\x41\x3c\x4f\x40\xde\xc7\x15\x1a\x51\x51\x97\x33\x68\x63\xe5\x14\xcf\xc6\x14\x4a\xcc\xc2\x07\x31\x6d\x8e\x51\x08\x59\x65\xe6\x2b\x5d\x0f\xce\x2d\x8d\x46\x9b\xd4\xb9\x98\xc7\x48\xb9\xdc\x9b\x2b\xdd\x68\xa6\x8d\xb4\x63\x26\x8d\x4b\x4b\xc1\x51\xea\x34\x94\x0f\x32\x33\x40\x99\x65\x0c\x25\x38\x39\x28\xd2\xb2\xb7\x95\xbf\xc8\x5d\xe8\xee\x8e\x95\xf5\x3c\x52\x46\x3c\x77\x7c\xbb\xb6\x52\x13\x8c\xab\xe0\xf7\x2e\xdc\xda\x0e\xb9\x40\x02\xcb\xfd\x16\x40\x64\x3b\xb5\xce\x48\xfe\xfd\xfc\x18\xa6\xdd\x6d\x3a\xb7\x42\xf0\x46\x80\xf8\x5e\x51\x06\xd4\x88\x1b\xe7\xd9\x26\xc2\xc3\xa3\xc0\x94\x55\x39\xec\x25\x48\x44\xda\x7f\x83\xa6\x0e\x44\x4a\xe0\x4f\xfa\x17\xe0\x60\xaa\x0e\x89\xdc\xed\x8b\x0c\x62\x6f\x3c\xe3\x82\x11\xdb\x9c\x50\xbd\x57\x95\x5a\xa3\xfc\xde\x93\xba\x24\xbb\xaa\x5c\xef\xab\x00\x7e\xb5\x22\xfc\xb3\xb8\x03\x14\x21\x94\x14\x55\xe0\x99\x26\x32\x2f\x0d\xbc\x01\x56\x0c\x48\x1c\x00\x38\xa9\xdc\x64\x35\xe2\xa7\x56\x7b\x93\xd9\x7d\x8a\x19\xf3\x6a\xbf\xc3\x5d\x46\xd2\xb3\x68\x70\xa6\x18\x2a\x44\x33\xbf\xbe\xd7\x76\xaf\x93\xdd\x60\x9b\x1c\x12\xef\xd6\x65\x55\x87\x9a\xc4\x85\xbe\xcb\xb3\x3b\x3b\xa1\xfd\x84\x4f\xd3\x90\x87\x37\x82\x86\x11\x76\x9d\x1d\x8a\x47\x10\xde\x20\xea\x67\xef\x70\x36\xce\x83\x63\xa7\xa3\xe7\x35\x83\xbe\x1f\xbb\x3c\x1d\x91\x97\xc3\x1d\xb0\x7e\x01\xc0\xc2\xb4\x53\x6b\xc5\xf0\xb9\x13\xe9\x40\xf6\x1c\x9c\x42\x1f\xc8\x89\xdd\x5a\x71\x5f\xe6\x69\xb4\xbd\x4e\x4c\x5f\x6e\x2a\xda\x7b\xf7\xaa\xda\x42\xa9\xa4\xc3\xb7\xb8\x81\x49\x10\x9f\x9a\xb8\x37\x88\x16\x20\x35\x64\x3a\xa5\x3a\x00\x64\xaa\x21\x1e\x36\x3a\xe7\xa3\xe1\x03\x8c\xf8\x1e\xb2\xa0\x3f\x0c\x20\x05\x52\xa9\xdc\xfe\x1b\xad\x8d\x67\x6d\x2a\x99\x96\xb0\xe7\x32\x70\x51\xc0\xc4\x63\x9a\x75\xe2\xa8\x20\x39\x8d\x8a\xa2\x34\xbc\x48\x9f\x10\x53\x68\x22\x40\xb0\x71\xe7\x5d\x51\x02\xe6\xc3\xa0\xd3\x3c\x56\x4b\x0a\x58\xb0\x0a\xb5\x85\x49\x59\x57\x65\x71\xd8\x9a\x44\x64\xb4\xd3\x2a\x99\x97\x77\x25\x47\x4f\x31\x6c\x53\x37\xf4\xfc\xbf\x16\xe5\x63\x91\x48\x63\x8f\x01\xeb\xa4\x96\x72\xa3\x80\x98\x98\x15\x1f\x44\xa3\xfe\xdf\x9b\x32\x90\x6e\x40\xc0\xb7\xae\xb6\x59\x0d\x83\x68\x88\x78\x89\x9b\xea\x90\xb8\xb0\x1a\x55\x2e\xbc\x1c\x41\x56\xd8\x83\x07\x2b\xdc\xcc\xfe\xee\x4e\x1b\x1c\xd7\xaf\x19\x8a\x06\xeb\x22\x2d\x2b\x14\x8e\x6a\x85\xde\x6c\xe3\x6b\x23\x30\xb8\x5b\xe8\xfc\x19\x57\xa6\x79\x8b\xd1\xff\xf3\x9b\xc0\x00\x58\xbb\x92\xed\x8e\x37\x49\xff\x26\x8a\x95\xec\x2a\x14\xaa\x0b\xc2\x9d\x47\x8c\xe4\xb2\x0a\x04\xdd\x7f\x18\x5c\x60\x82\x24\x24\x46\xda\xef\x52\x30\xa3\xbb\x55\xc1\xd7\x9a\xe6\xae\xd2\xc8\xaa\x4c\x41\x60\x41\x49\xad\x50\x05\x5d\x99\x48\xa3\x1b\xed\x1d\x62\x65\xc1\xd2\x45\x95\xe5\x3c\xcb\x68\x25\x06\x53\x1d\xe3\xc3\x91\xd3\xc9\xb5\x89\xf9\x20\x7d\x22\x8e\x48\x12\xf7\x45\xf6\xaf\x7b\xcf\x13\x88\x9c\x89\xd0\xd5\xd7\x71\x1c\x92\x54\x28\x5c\x55\x2c\x7c\x3f\xdb\x42\x72\xa2\xd6\x54\xbc\x9f\x60\x29\x2f\xcb\xb6\xa1\x3b\x1f\x29\x9e\x65\xc5\x43\x99\x3f\xb8\x1b\x41\x11\xc4\x3d\xdb\xc4\x67\xd2\x06\x5c\xf6\x36\x79\x9c\xa0\x72\xa0\x2e\x2f\x1c\x56\x46\xf3\x41\x5c\xd8\x6f\x28\xa3\x40\x95\xf2\x04\x71\xf2\x6e\x6b\xeb\xf0\x0e\xaf\x77\xc6\x2a\x7d\x2f\x1d\x65\x83\xa3\x43\x80\xb0\x2c\x0c\xd8\xf7\x4c\x70\xe6\xfd\x78\xcf\xef\x44\x95\xce\xce\xb2\x01\x6c\xfd\x9d\x2b\x37\x51\x79\x94\x5f\x4d\xa0\x50\x37\xcd\xcc\x6e\x5f\xb7\x39\xf1\xa2\xd5\x85\x03\x8a\xae\xc6\x33\x4f\xc5\xa8\x36\x10\x31\x3c\x64\x55\x1d\x94\xdb\x42\x15\xc9\x77\xa6\xe3\xfb\x40\xc8\x66\x12\xe0\x5a\x83\xe2\x5f\xf0\x17\xb3\xa8\x32\x40\x55\xab\xac\xae\x28\xee\x08\xa5\x07\xfe\x17\x60\x02\x68\x6d\x8f\x7e\xe3\xcf\x13\x70\xa9\xc9\x96\xdd\xe5\x0a\x36\x89\xae\x90\xeb\xf8\xe9\x3e\xa0\xff\x04\x55\x36\xaa\x8e\xde\x96\x4b\xf5\xa8\xaa\xd4\x5b\x91\x1b\x90\xb6\xb0\x6b\x64\x95\x21\x16\x1b\x16\x67\x50\x59\x9e\xa0\x47\x86\x01\xb3\x56\xe9\x87\x35\xbf\x8b\x72\x5f\xac\x51\x11\x8a\xf5\x8a\x00\x7b\x96\xe3\x41\x89\x3b\xf7\x6f\x83\xe5\x0c\x5e\x8d\x76\x6a\x7d\xaf\xff\x7e\xe8\x8f\xe7\xf0\x1f\x67\xaf\xdf\x9c\x9f\xb7\xf0\x1f\xc3\xb3\x3f\xf0\x1f\xbf\xc7\x0f\xce\xbe\x43\x90\x0d\x07\x43\xc8\x69\x60\x4a\xe1\x64\xdd\x97\xe7\x67\x67\x67\xb0\xd0\xe9\x93\x0e\xf5\xf6\xa1\xdc\x17\xa9\x67\x88\xf1\xfa\x23\x0e\x35\x30\xd7\x91\xf1\xa8\xb0\xa8\x1c\x6d\x05\x40\x09\xd2\xee\xb0\x9e\x9c\x5d\xdf\x86\x02\xa8\x94\xd1\xb1\x07\x76\x94\x56\x81\x9a\x04\x6f\x30\xc4\x11\xe2\x18\x68\x10\x44\x47\xed\x97\xb6\xba\x7e\x0b\x28\x86\xb8\x49\xc4\x92\x0e\x6d\x81\x6c\x10\x71\xc2\xb8\xbb\x12\x4a\xe2\x5b\x90\xca\x44\x50\xd5\x15\x22\x59\xc3\x77\x91\x75\xeb\x1b\xe2\xfd\x43\x54\x4d\x6f\x36\x20\x2b\xc2\x11\xe0\x06\x90\xb8\xf4\x6f\xde\x06\xb6\x40\xd2\x66\xc8\xd3\xa9\x14\x7b\x29\x02\x3f\xbe\x3e\xaa\x1d\x4b\x64\x5e\xe0\x09\xa8\x8b\xf4\x14\xc8\x02\xe2\xfc\x4d\xcc\xd1\x89\x09\x8e\x58\x5b\x81\x2b\xe7\x6c\xa7\x85\x97\x33\x0a\x9b\xee\xb9\xc2\xed\x83\xdf\x0a\xd1\x5b\x12\x81\x13\x96\x9d\x72\x7c\xb5\xa9\x68\xe7\x03\x8b\xc7\x97\xad\x38\x09\xb0\x40\x0a\x3e\x86\x68\x20\x39\xe8\x09\x31\x62\x9a\xa5\xfc\x40\x05\x50\x71\x5b\x30\xc3\xea\x90\xc0\x75\x28\xab\x97\xd5\x46\xe7\x1b\xea\x60\x2a\x9c\x76\x0f\x58\xbc\xe0\x78\x9c\x62\x7d\x5e\xfc\x48\xeb\xa6\x57\x5b\xa4\x26\x81\x07\x63\x30\x74\x49\x86\xba\xec\x61\x5f\x30\x76\xd5\x3b\xde\xb1\x1e\x2e\x23\xa4\x7c\x64\xf0\xb6\x20\x9b\x98\xdc\xda\x6d\x89\x84\x36\x18\xa6\x8b\x2a\x6f\x30\x00\xcc\x8f\x75\x0c\xe8\xa1\x24\xae\x80\x5d\x08\xd5\xc3\x58\x50\xc5\x36\x97\xff\x7d\x22\x77\xa0\xb8\xe9\x82\xe6\x38\xc2\xff\xdd\x0f\xb4\xc4\xc8\xdf\xcd\x0b\x1a\xc1\x38\xe1\x95\x96\x6b\x05\x05\x60\x6e\x2c\xfe\x45\xff\x32\x90\xbd\x7f\x50\x5f\x55\x55\xab\xa4\x27\xe8\x0f\x49\xcf\x76\x94\x07\xe9\x12\x2a\xc4\x4c\xd2\xfb\x8b\x1d\x62\x78\x5c\xfc\x00\xe7\x0c\xfd\xc5\xcf\xa9\x60\xbe\xa8\x6d\x20\x22\x19\x2b\x03\xfb\xee\xb2\x31\xf3\xc4\x29\x29\x04\x54\xc7\x2f\x66\x1f\x96\x3f\x8f\xe6\xe3\x88\x51\xf0\xbb\xef\x00\x11\xfc\xdd\x77\x50\x32\x3f\x9a\x7e\x61\x62\xc0\xf1\x55\x40\x0d\x18\x50\xff\x45\x2c\x81\xef\x6f\x97\x50\x57\x0f\x01\x9c\xf1\x95\x5c\xce\x12\x28\xe8\x6f\x7f\x4d\xce\x3e\x04\x34\x80\x13\xa6\xed\x13\x1f\x26\xcb\xe9\x78\xb1\x38\x4e\x08\x68\x1b\xec\xe2\xb0\x57\x03\x39\x99\xca\xe9\x0c\xa8\x15\x96\x01\xbd\xc5\xe8\x66\x74\xf9\x69\x2c\x5c\x17\x3f\xcc\x6e\xa7\x57\x14\x51\x9a\xcb\xc9\x72\x11\x52\x5e\x2c\x02\x8a\x8a\x0f\x8e\xfd\x02\x29\x29\x1c\x39\x85\x08\x38\x29\x3c\x51\xc5\xf8\xcf\xe3\xcf\x37\xd7\xa3\xf9\x97\x44\x1e\xe5\xa9\x38\x69\x0f\x90\x08\x07\xe8\x66\x3e\xbb\xbc\x9d\x8f\x3f\xdb\x1e\x00\xc7\xc3\x7b\x62\xef\x03\x76\x0a\x60\x90\x40\x3a\xc0\xf1\xe2\x9d\x23\xae\xb8\x5d\x8c\x13\x79\x35\x5a\x8e\x80\x20\xe3\x66\x3e\xfb\x30\x59\x2e\xde\xd9\xcf\xbe\xbf\x5d\x4c\x60\x08\x27\xd3\xe5\x78\x3e\xbf\xbd\xb1\xbd\xee\xcb\x4f\xb3\x9f\xc7\x3f\x8d\xe7\xf2\x72\x74\x6b\xe7\xd2\xce\xee\x0c\x99\x0c\x91\x59\x44\xce\x3e\x08\x17\x69\x4b\x24\xd3\x8c\x4c\xa6\x01\x99\xc8\x62\x39\x9f\x5c\x2e\x65\xf0\xb1\xd9\x53\x44\x24\x22\x24\x1f\xe9\xcb\xd1\x7c\xb2\xb0\x1f\x20\x02\xc5\x9f\x47\x5f\xe4\xec\x76\xc9\x4c\x17\x44\x41\x18\xad\x4c\x47\x99\x21\x46\x57\x3f\x4d\x16\x2f\xa1\xc5\xb0\x8b\x3b\xda\xb1\x54\xc2\x0f\x37\xec\x43\x99\xef\x0b\x88\xd7\x46\x45\x07\x8e\x54\x6a\x6b\x0d\x5c\x5f\xc1\x0a\x52\xb8\xb1\x02\xd4\x53\xb6\xc7\x07\xd6\xa3\x0a\x93\x16\x64\x69\xe3\xf7\x44\xc7\xf7\xdc\xf1\x04\x89\x89\xce\x7b\x60\x20\x6f\x22\xa1\x91\xa0\x7b\x60\x89\xac\x94\x61\xf6\x28\x4a\x94\x93\xa4\x75\x20\xfc\x8e\x0a\x77\xd6\x85\xa4\x13\x83\x2c\x95\x29\x79\x2f\xf2\x52\x5b\x87\x03\x62\xff\x8b\xfd\x4e\x57\x08\xd7\xb3\x57\x5f\xc0\xf5\x6c\x12\x79\x5b\x64\xe0\x25\x63\x4c\x6d\x92\xe7\x59\x51\x66\xf6\xf7\xd5\x4a\x15\xea\xf4\xf2\x5e\x6d\x77\x2a\xbb\xfb\x66\x6f\x60\xf0\x2a\xcf\x56\xbb\xe2\xee\xf4\x7c\x70\xf6\xef\x64\xff\x5f\x9c\x9d\x5d\xb4\xec\xff\x37\xc3\x3f\xec\xff\xdf\xe3\xe7\x66\xfa\x51\xce\x5d\xc8\xed\x3a\x5b\x55\x76\x9f\xb2\x3b\xc0\x81\x99\x73\x79\xfa\xb2\x1f\x80\x67\xfc\xd7\x86\x0b\x31\xfc\xf1\xc7\xef\x4f\xcf\xcf\x86\x7f\x02\x53\xa6\xfb\x8d\xa3\x7d\x7d\x5f\x82\x3a\x6d\xc7\x03\xe0\xbb\x97\xa5\xd9\x66\x85\x5c\x56\xfb\x5a\x1d\xfb\xd8\xd9\xd9\xe9\xf9\xd9\xd9\x79\x62\xff\xf9\x1a\xfe\xfb\x03\xbe\xf8\x63\xae\x8b\x42\xce\x15\x50\xaa\x9f\xde\xe8\xfb\xca\xc0\x8d\xdc\xdd\xda\x1f\x4e\x87\x3f\xfe\xf8\x46\x8e\x8a\xb4\xd2\xca\xc8\xab\x2c\xbf\x03\xfb\xfd\x58\xdf\xec\x57\xe4\xc7\xfd\x41\x8e\xab\x6c\x2d\x17\xeb\x7b\x95\x17\xaa\x4e\xe4\xc7\xaa\xdc\xef\xe4\xeb\x73\x2a\x9f\x81\x3c\x95\x37\x12\x0d\x68\xb5\x41\xfa\x90\x92\x92\xde\xcc\x70\x89\x24\xca\x79\x7c\xcd\x8a\x34\x09\x72\x95\x82\x12\x8f\xc9\x73\x39\x10\x7b\xd8\x3c\x9d\x9c\x14\x94\x7f\x94\xc7\xf2\x8f\x89\x04\x29\x5d\x16\xe8\x2b\x4e\xb3\x98\xc3\xd2\xc5\x62\x09\xb7\x08\x40\x75\x0f\x6c\x87\x2a\x73\x8e\x9b\x96\x85\x8e\x64\x8a\x22\xbb\x39\x41\xad\x43\x28\x1a\x64\xdd\x2d\x97\xfb\xa9\x9c\xbe\x94\x8b\xfc\x53\x09\x3d\x61\x08\x29\xc3\x02\x79\x95\x28\x5b\x22\x38\x5b\x62\x0d\xcb\x44\x22\xad\x0f\x86\xeb\xe0\x8b\x85\x6e\x60\x0f\x7d\x7b\x7c\x5e\x24\xc8\x46\x69\x95\x43\x3c\xa9\x61\xf5\x27\xf2\x9b\xf3\x21\x03\x21\x6e\xbc\x05\x99\x19\x0e\x06\x71\x5e\x01\x91\xff\x0c\x46\x43\x88\x57\xb3\xbe\x3a\xbe\x98\x00\xd8\xe8\xf4\xb1\x58\x89\x89\x07\xd3\x4d\x28\xaf\x14\x90\xef\x68\xc0\xd0\x9c\xf3\x25\xc2\x62\x7a\x74\x9f\xed\x02\xc6\x4b\xad\x75\x25\x46\x3e\xc7\x36\x33\x2e\xe1\xa1\xd3\x77\x9e\x6d\x1c\x8a\xfd\x80\x5e\xd0\x55\x25\x3f\x56\x25\x81\xca\x9c\x20\x2c\x3f\xd3\xd1\x15\xba\xba\x40\xbf\x7b\x40\xb3\x93\x33\x51\x40\x42\x1a\x79\x67\x2e\xd4\xce\x5a\x33\xa1\x6b\xea\x84\x35\xd5\x6e\x57\x69\x2c\x84\xc5\x78\x77\x06\x92\x7e\x2e\xac\x8d\x3e\x3b\xb8\x82\x3a\xe5\x48\x81\x0b\x6b\xb3\x0c\xc4\x2e\x57\x59\x91\x1f\x90\xc0\x37\x65\x8a\xa1\x80\x0f\x1d\x47\x45\xc4\xa3\xe2\x8b\x03\xba\xfb\x4e\xfe\x75\x66\x82\xcd\x44\xe5\xc6\x81\x3b\x54\xe9\x6d\xf9\x80\x75\xf9\x8a\x9a\xe9\x92\x64\xd4\x5e\xd0\x2f\x89\x7a\x10\xfb\xf1\xff\xde\x57\xd0\x1f\x3f\xff\x8e\x3f\x83\x57\x13\x7b\x12\x7d\x56\x77\xd9\xfa\xeb\xdf\xc9\x00\x7c\xda\xfe\xbb\x38\x3b\x3f\x3b\x6b\xda\x7f\x6f\xbe\xff\xe1\x0f\xfb\xef\xf7\xf8\x79\xaf\x37\xd6\x77\x7a\xd4\xf2\x4e\xbb\x2b\x00\x64\xf6\x63\x32\xd4\x44\xe6\xba\x36\xf2\xaf\x18\x9f\x7c\xc8\xf4\xa3\x7c\xe4\xb0\xab\xe3\xed\x56\x07\xb8\x15\x0d\x88\x97\x63\x96\xec\xad\x10\x13\x40\xaa\x97\x8f\x28\x38\x54\x97\x6f\x85\xf8\xaf\x90\xdb\xcf\x0f\x32\x2d\x1f\x8b\xbc\x54\xa9\x0b\x0e\x07\xab\x31\xb8\x59\x81\xe7\xa4\xcc\x35\x5d\xda\xd6\x46\xc1\x5b\x0d\x73\xab\x2a\x07\xf1\xcb\x1d\xfa\x91\x10\xb7\xcb\xa9\x2a\xc1\x31\xc3\x31\xe5\xcf\x3b\x32\xe3\x8e\xbd\x0c\x9f\xbf\xfe\xca\x56\x47\x1c\xae\x75\xb7\x16\xc2\x17\xf9\x61\x79\x56\x7c\x75\xc4\x05\x4a\xe6\x64\xd4\xb2\xe8\xad\x97\xb1\xa5\xa1\x8a\xbe\x07\x91\xe7\xa3\x1f\x3d\xfa\xd8\x90\xf9\x8b\x9f\xb7\xd5\xd5\x1d\x85\xb2\x91\x7a\x16\x29\x08\x9f\x6d\x07\xe0\x48\x53\x66\xce\xbd\x23\x00\x51\x49\xfc\x05\xb6\x79\x06\xa3\xea\xae\xa5\x5d\x6f\x47\xd0\x45\xf8\xa4\x9d\xbd\xdb\xd7\x14\xfd\x9a\x00\x31\xdd\x2a\x4b\xa3\x85\x10\x04\x85\x09\x08\x96\x69\x84\x66\x05\xb3\x73\x4a\xd7\x23\x70\xc9\xb7\x23\x93\xe5\x4e\x57\x42\xd5\x6e\x9e\xde\xd9\x07\xb3\x1e\x08\x96\x43\x58\x33\x14\x62\xc2\xe1\x9c\x2f\xea\x7d\x9a\x95\xf2\xfa\xfa\x32\x44\xd2\xa0\x16\x31\xdc\xb7\x50\xc6\x27\x08\x1a\x48\x7f\x39\xf2\x00\x0a\xaf\x1a\xa4\xd5\x0e\x57\xcd\xdf\xb5\x35\xa1\x6a\x3a\xe4\x2f\x8f\x2c\x69\x80\x43\xbb\x79\x20\xfb\x26\x9a\x88\x46\xa5\x46\xbc\xfd\xb9\x45\x71\x08\xdf\xe9\xaf\x00\xc8\x84\xd8\xea\x30\x22\x2f\xba\x1a\x02\x23\xc1\x12\xfa\x28\x0e\x13\xcc\x9a\x5d\x70\x47\xc6\xc3\x79\x03\xe1\x66\x14\xe1\x0b\x3b\x3b\x8e\x9d\x75\x00\x38\xea\x75\x57\xa7\xd1\x90\x47\x73\x69\xf3\xc4\x40\x52\x60\xbf\xac\xd8\x31\x8b\x00\xfd\x82\xc7\x03\xa0\x71\x10\xde\x02\xd9\xf8\xe4\x99\xe1\x53\xc6\xe8\xed\x2a\x6f\x0e\x61\x56\xc3\x80\x99\xfd\x6a\x9b\x81\x30\x1f\x30\xe0\x07\x42\xa9\x5f\x5d\xa5\x86\x6b\xe1\x4a\xad\xbf\xf2\x2f\xdb\x83\x29\xec\x60\x9e\xd8\x6d\x73\x77\x8f\x8e\xc8\x46\xeb\x14\xbe\x93\x19\xa9\x8b\x75\xb9\xaf\xd4\x9d\x4e\xfb\x50\x42\xb8\xd1\x8f\xac\x80\x99\xab\x2a\x60\xa2\xa1\x16\xbe\xa5\x7d\x1f\xbe\x27\x33\x7c\xb4\xfb\x6a\x57\xde\xa8\x28\x2d\x08\x7d\xe2\x9e\x77\xcd\x5e\x69\x4d\xfb\xab\x9f\xae\xac\x81\xcc\x3a\x10\xb0\xcc\x3b\xa5\x44\xe2\x75\xea\x1e\xbe\x56\x85\xbc\xcb\x1e\x02\x64\x0d\xea\x63\xda\x2d\x65\x57\x13\x60\xcb\x00\x00\x98\xe7\x4e\x90\x2b\x28\xb1\x20\x1c\x77\xd8\xae\x80\x89\xbc\x51\x0d\x43\x22\xcf\x47\x8f\x59\xf0\x2d\x60\x71\x14\x1a\xdd\xba\x50\x03\xb7\xbe\x0f\xf1\xfa\x9d\x0b\x8f\x4f\xd8\x68\x47\x1a\xa4\xcd\xa9\x33\x1e\x63\xf8\xf3\xc7\x9b\x6b\xf9\xd3\x05\x07\x2b\x1e\xef\x75\x21\xf5\x2f\xe0\x11\x92\xa7\xd1\x7d\xc3\xd2\x9d\x9e\xd5\x86\x3e\x6e\xe7\xdc\x18\xcf\xda\x25\xc4\xd2\xa1\x5e\x2e\x7d\xb6\xd1\x8e\xe5\xad\xed\xe1\x5c\x7b\x08\x38\xba\x3e\xa1\x5a\x32\xc6\x3e\x00\x04\x93\x1f\x1c\x22\x02\x00\xb0\x10\xf8\x81\x78\xc5\xc3\x91\xfa\x96\x0d\x02\xa0\x13\x97\x18\x65\x90\x4a\xbb\x30\x20\xec\x1c\x3a\xb2\x6f\x03\xf7\x69\xf8\xe3\x8f\x3f\x9e\x9e\x9f\x0d\x2f\x8e\x6c\x8d\x44\x2a\x08\x70\x20\xec\x53\x96\x21\xf2\x23\xd5\x84\x9a\xa7\x1a\x0b\x60\xd7\x73\xe7\xc2\x56\xdd\xe1\x2f\x72\x3a\x9b\x9a\x9b\x00\x27\x24\xae\xa3\xf7\xac\x3b\x84\x4d\xd9\x6a\x55\x1c\x2f\xf3\xe9\x1e\x86\x56\x7d\x84\x50\x9e\xe9\x68\x75\x08\x29\xea\x99\x88\xf6\x47\x4f\x7b\x48\x6e\xb1\x6b\x89\x03\xf7\xba\xa6\xac\xe3\x48\x4e\x40\x0b\x47\x33\xf7\x6f\x3e\xd7\xea\x3e\x2b\xf0\xb3\x5c\x2c\x08\x06\x05\xaf\x3f\xcf\x2f\x73\x0d\x98\xa8\x31\x3e\xad\xf1\xda\x7d\x11\x24\xd5\xd4\x1a\xbe\xad\x7d\xdd\x81\x62\xa9\x60\x47\x24\x29\x42\xbe\xc8\x44\x52\x0e\x22\xe4\x8b\xb4\x77\x48\xa5\x8f\x73\x46\x62\x73\x89\x03\x51\xb0\xea\xed\xdf\x4a\x15\x09\xc1\xba\xdf\x84\x2a\x52\xae\x0e\xe2\x37\xa2\x8a\xe4\x72\xb4\xbf\x99\x2a\x52\x80\x5c\xe0\x49\x59\xc9\x2f\xe5\xbe\xea\x87\xb3\xd8\x62\x25\x8d\xa6\x3b\xa8\xcd\xf6\x49\xd4\x48\xba\xa5\x41\xa7\x4a\xc4\x52\x80\x92\x68\xac\x95\x17\x12\xa8\x3d\x43\x94\xe0\x36\x73\x00\x08\x49\x1a\x81\x23\xfc\x13\x97\xe9\x14\x9b\xec\x6e\x5f\x91\xa0\x6d\x96\x43\x45\xe9\x0c\x63\x69\xcd\x66\x3a\x08\x97\xab\xf0\xc7\x30\x4d\x40\x48\x81\x98\x60\x9f\xc1\xaa\x04\xfc\x26\x60\x55\x93\xc1\x18\x84\xa0\xe6\x23\xac\x0f\x20\x46\x5a\x42\x7b\x04\x76\x06\x51\x9f\xf6\x23\x4d\x56\x6c\xec\x8f\x8b\x6c\xd5\xa5\x0c\xd8\x1f\xa0\xf0\xc7\x76\xee\x67\xeb\x4c\x34\x06\x1f\x1c\x0c\xdb\x3a\x0c\xe0\xdf\x67\xbb\x28\x30\xbb\xe0\x18\x94\x0c\x46\x26\x11\x5d\x7c\x18\xe1\xe9\x00\x85\x51\xae\x50\xc9\x2e\x07\xd5\x82\xc0\x38\xf9\xc3\xb0\x16\xb9\xac\x02\x15\xd3\xd2\xb7\xf0\x04\x38\xe9\x14\x38\xa6\x59\x80\x6d\xc9\x38\x51\xb8\xd3\x45\x9a\xfd\x22\x80\xe6\xcd\x9a\x3f\x2d\xb5\xc7\xc6\x6c\x3e\x82\x9a\xf4\xb3\x3d\x75\x8d\xc4\x6c\x61\x59\xc0\x66\x09\xa1\x0e\x78\x66\xc0\xd0\x42\x35\x50\x19\xe2\xad\x75\x9a\xd5\x25\x90\x8c\x30\xdc\xcf\xd8\x8b\xaf\x28\x6b\x5e\xd3\xda\x13\xd1\xe0\xe6\xa5\x89\x8b\xa8\x03\x5d\xd8\x11\x0b\xce\xd0\x99\xb6\xd3\x2e\x5c\xdc\xb1\x3d\x8f\x5e\xf9\xfb\xa8\x2e\x7c\x53\x5e\xdb\x04\xf8\x73\x36\xed\x1e\xe1\xf7\x54\x76\x8e\xf9\x51\x80\x3f\x03\x79\x1b\x46\xe4\xed\x3a\xab\x34\x14\x16\x16\x5f\xed\x00\x09\x6b\x21\xd8\x59\x2f\xd4\x56\xf7\xbd\xcc\x0b\x51\x15\x32\x2b\x71\x30\x6c\xad\xe9\xe2\x42\xe7\x80\xe1\xd4\xd3\x8a\x47\xb3\xd8\x5c\xbd\x7e\x63\x45\x81\xd9\x88\xeb\x38\x78\x73\xcb\x0b\x80\x35\x18\xd2\x5b\x42\xdf\xe1\xf3\x65\xd5\x1e\xb1\x9a\xa3\xf4\xbe\xb4\xbe\x46\x5e\x6c\xb0\x95\xd0\xfa\xa7\x6d\xed\x2e\xe9\x4d\x49\xd5\x2f\x98\x39\x00\xac\x0a\xbe\xa2\x79\x15\xfb\x6b\xdb\x6e\xa2\x27\xcf\x64\x7f\xa1\x0b\x28\x81\x00\xb7\xa3\x95\x8b\x6f\x3c\xf9\x89\x55\x12\xdc\x94\xa2\xe7\xfa\x11\x52\xae\x30\xaa\x55\xe7\x7a\x5d\x57\x65\x91\xad\x13\x2c\xa5\xc7\xf0\x0d\x27\xcd\x23\x3a\x05\x61\x74\x51\x37\xe5\xec\x18\x6b\x1f\x96\xac\x3d\xc4\xa5\x1f\xed\x53\x52\xc4\x34\x0d\x65\x11\xb4\x43\x6e\x55\x96\xa3\xc6\x0d\x94\x97\x84\x28\x41\xbe\xf5\xcd\xc1\xd4\x7a\x8b\x45\x2d\x02\x8a\xa6\xed\x21\xbe\x46\xd3\x10\xff\xe6\x19\x84\xf1\x7e\x77\x96\x48\x38\xac\x49\xd4\x15\xa7\x8d\xee\xca\xff\x36\x80\xe0\xdb\x1b\xc3\x36\x73\xb6\x85\xf3\x8b\x56\x28\xea\xda\xdb\xee\x79\x65\x9e\x78\xc4\x78\x65\xad\xcb\xc2\xec\xb2\xf5\xbe\xdc\x1b\x9f\xae\x88\x84\x80\x9d\x74\x60\xda\xa1\x88\xd5\x34\xef\x94\x91\x53\x50\xdb\x0f\x77\x58\x4c\x29\x1c\xee\xb7\x48\x03\x23\x86\x7c\xb4\x96\xa2\x1b\x1e\xbb\xdd\x40\x75\x2e\x7e\x8b\x17\x68\xa6\xba\xd5\x58\x6a\xab\xc5\xc5\x13\xc9\x55\x3b\xc1\x35\x1c\x3b\x4c\xf2\x7c\xe4\xa2\x3b\xef\x2e\x38\xda\xc8\x45\x9c\x21\x7b\xbe\x08\xdf\x1e\x8d\x50\x30\x1c\x29\x6c\x07\xc9\x3d\x38\x17\x40\x2b\xc4\x9a\x3f\x3b\x5d\xef\xed\x92\x77\x5c\x2f\x09\xb8\x21\x30\x9d\x26\x7b\xd0\x89\x28\xca\x53\xf4\x9e\x13\x96\x39\x3b\xb5\x1e\x46\x12\xb0\xd4\x84\x3b\xd3\x71\x0a\x94\x1e\x4c\x9a\x50\xdd\x89\x6e\x5f\x6d\x76\x09\x22\x84\x25\x47\xdc\x7f\xae\x0e\xc1\x6f\xa8\x64\x32\x09\x44\x20\x9b\x59\x48\x11\x1d\x89\x60\x21\xb6\xde\x72\xec\x8e\xc4\x4c\x97\x1b\x7f\x12\x4a\xfc\x35\x83\xef\xc9\xc6\x7f\xff\xc1\xa7\x88\x67\x30\xf2\x5b\xf5\x55\x27\x3e\x14\x94\x80\xf3\x26\xca\x0d\x51\xaf\x18\x9d\xe7\x09\xfd\x37\xdb\x5a\x97\x3b\x20\x1a\x43\x55\x6e\xaa\x12\x0b\x76\x79\x20\x9b\xc6\x51\x77\x56\x7a\xf7\xf2\x18\x9e\x5d\x80\xeb\xdd\xf0\xb3\xd0\x4e\x16\xf1\x0b\x07\x87\x0f\x29\xc1\x44\x02\x59\x20\xdb\x96\x7a\xe9\xcc\x70\x07\x9e\x98\xbe\x54\x39\x88\x71\xc3\xd5\xb2\x2e\xb7\x2b\xaf\x96\x29\xba\xbf\xe0\xa2\x14\xb0\x54\x9c\x26\x7d\xdc\x20\xfe\x2c\xe4\x51\xe9\xd2\x00\x1d\x40\xd4\x4f\x60\x0d\x1b\x37\xe0\x4e\x97\xcf\x45\xca\x8b\x03\xfb\x8a\x41\x81\xa5\x92\xeb\xaa\x34\xe6\x14\xd3\xcf\x90\x1c\xd8\x5b\x83\x82\xe4\xe7\x0a\x20\xc8\x78\x34\xfb\xac\xa5\x52\xe9\x1a\x1c\x0b\x66\x12\xc8\xf9\xe8\xb9\x12\x08\xee\x18\xef\x0c\x7a\x0c\x5c\x59\x1d\xba\xb4\xea\x50\xa0\x2e\xd4\xca\x6b\xe9\xd1\xd1\xf2\x6d\xeb\x0f\x51\x09\x31\x9b\x1b\x4d\x01\x4b\xe5\x58\x1a\x80\x9f\x84\x96\x91\x1b\x3f\xe2\xdd\x4d\x11\x76\x1c\x23\xd5\x3d\x77\xae\x47\xa7\x37\x80\x08\x31\xf5\x0d\x0d\x58\xfb\xb0\xf1\x14\x40\x11\x19\xce\x53\xc8\x7f\xbe\x62\x8f\x1a\xd9\x71\x29\x00\xb4\x54\xeb\xe3\x35\x01\x6f\x41\x17\xf9\x0b\x83\x12\xee\x58\x94\x96\x08\x10\x99\xe4\xa1\xd9\x97\xf6\x91\x86\x4e\x49\x53\xfe\x82\x18\x53\x56\xc1\x2b\xd0\xe9\x8f\x38\x0a\x90\x8f\xef\xa5\x34\x34\xf6\x49\x18\x01\x26\x74\xbf\xfd\x36\xbd\x68\x1d\xbc\x08\x8b\x17\x12\xf6\x6b\x42\xaf\x99\x22\xd6\x1d\x13\x42\x63\xe6\xe7\x32\x11\x11\xb7\x54\xe2\x25\x57\x99\x60\x0a\xcf\xaa\x30\x7a\xcf\xcd\x76\xfc\xed\xf8\x6e\xc1\xef\xf6\x87\x98\x37\x53\xf0\xac\x8a\xa8\xa9\xa8\x70\x76\xa7\x2b\xac\xc2\x28\x1d\xa9\x20\x5b\xde\xcd\x0e\x78\x82\x9a\x49\x30\x5d\x01\xf5\x4a\x6f\x3a\x5b\x4e\x2e\xc7\x3d\xcc\x6b\x22\x93\xb5\x71\x25\xf9\xd6\x6c\x8c\xea\x12\x84\xd3\x95\x7d\xc9\x50\xe1\xb0\xfb\xe4\x49\xa5\x55\xea\x6e\x63\x6e\x72\xd7\x38\x79\x7e\x76\xd6\x37\xb5\xdb\x11\x9b\x4a\xfc\xd7\x8d\x81\x12\x2f\x1c\x28\x79\x64\xa0\x30\x0d\x51\xcb\x5c\x2b\x53\x83\x80\x05\x7d\xd0\xef\x11\x28\x87\x33\x6f\xb9\x49\x8a\xdb\xe3\x47\x2e\xe4\xb2\xa6\x51\x3c\x3e\x31\xc1\x89\x18\xad\xc4\xaa\x19\x80\xc8\x36\x9e\xa1\x43\x41\xd0\xdf\x73\xec\xb4\x9e\x0a\xfc\x46\xdc\x40\x32\x57\x82\xd8\x06\x59\xab\x4d\x47\x8b\xcb\x31\xe4\xf1\x72\x0c\x1e\xdf\x66\x19\x86\x0c\x29\xd1\xb9\xb7\xc1\x4c\x81\x81\x8f\x2e\x99\x0b\xe0\x04\x29\x67\xbc\x9a\xe1\xb4\xc4\x39\xf3\x64\x5d\xa2\x45\x4d\xae\xd2\x14\x62\x69\x40\xd6\xda\xb5\x6e\xa8\xe7\xcd\x61\x11\x5d\xdb\x18\x6e\xe8\x3b\x93\x21\x6b\xba\x02\xa9\x20\x95\xa6\xba\x48\xf7\x5b\x36\xa8\xa2\x19\xa6\xbd\x2b\x70\xa3\xc6\xc7\x2a\x8a\xb2\x92\x63\xab\xf2\xee\x45\x0d\xb1\x89\x48\x3e\x49\x30\x67\xd6\xa1\x1d\x01\xee\xec\xb4\x37\x63\x21\xe1\xb9\x25\x77\x0f\xfe\x1e\x3b\xda\x00\xb0\x52\x07\x6e\xa7\x08\x1a\x07\x49\x9a\x66\x2a\xfd\x5b\xb2\x0b\x1d\xd4\x07\xed\x16\x80\x2b\xc7\xc9\xc9\x6e\xab\x57\x19\xe1\xe2\x2d\x6e\x3c\xe1\x49\x2f\x88\xe5\xc7\x17\x10\x1b\x86\x22\x62\x08\x22\xd7\xcc\xf5\x87\xa8\x67\x1b\x7a\x29\x58\x6b\xb3\xb0\xf6\x94\xab\x57\xb9\x8c\x24\x00\xe4\x2d\xca\x51\x93\x10\x59\xc4\x64\x1b\x71\x4f\x14\x07\xd1\xb0\x81\xba\xe3\x15\xcd\x18\x85\x0c\x63\x14\x20\x7b\x55\x06\x5b\x20\xd4\x2c\xfc\x16\xba\xd3\x00\xce\x28\x54\x20\x2c\xa2\x72\xce\xe4\x55\x21\x6b\xa3\xf5\x58\xed\xc7\x5d\xd8\xdb\x95\xd8\x59\xb3\x3f\x54\x54\x14\xac\x2e\xbb\xd3\x95\xd1\xb8\x83\x02\x96\x3d\x97\x26\x84\xa9\xc7\x82\x7e\xdd\xd6\xcb\x05\xe5\x07\x97\x12\x46\xdd\x02\xae\x89\x73\x1d\xaf\xf4\x9d\xaa\x30\x08\xdf\xb4\x84\x0d\x32\x50\x2c\x1d\xb1\x63\x43\xd2\xce\x25\xb7\x91\x34\x26\x28\x48\x0a\x68\xa3\x91\x48\x07\xc9\x1e\x84\xe7\x88\x4c\x98\xfe\x44\xd2\xff\x62\x69\x18\x00\x26\xe1\xc3\xb1\x32\x82\x3d\x76\xb5\xab\x31\x77\x95\xff\x1b\xe8\x80\x57\x86\xb3\x73\xb5\x37\x75\xb9\x05\xa8\x0a\x42\x07\x90\x52\x79\x15\xc7\xd4\x64\x23\x92\x26\x78\x2f\xf0\xc7\xe8\xc4\x95\xed\x03\x77\x20\xc4\x9b\x81\xbc\x8a\xb8\x77\x98\x41\xca\x2d\x64\x6e\x21\x04\xbe\x22\xd1\x3e\x38\x0c\xb1\x24\xbe\x2e\x85\x0f\x74\x24\x7e\x4a\x02\xbd\x38\x6a\xe1\x09\xc0\x5b\x9a\x7e\xa5\xfb\x5c\x56\x9b\x68\x5b\x98\x7e\x24\xf5\xf0\x7e\xb4\x98\x2c\xbc\x40\x6e\x58\x91\x05\x05\x4c\x57\x13\x14\x65\x45\xe9\x07\xf1\x8c\xf4\xc3\xb3\xb0\x6f\x44\x8f\x38\xd6\xce\x68\x0f\xd8\xc1\x5a\x4e\x96\xd7\xe3\x44\x4e\x67\xd3\xd3\xc9\xf4\xc3\x7c\x32\xfd\x08\x85\x50\x49\xb3\x38\x0c\xd6\x44\x50\x1c\x26\xba\x8a\xc3\x48\xf5\x14\x52\x27\xb9\xce\x0f\x2d\xdd\xb0\x96\xec\xf5\x0e\x49\x9c\xac\x51\xa9\x0d\xdc\xa8\x08\x30\x82\xa5\xd4\xc2\x87\xfb\x50\xab\x31\xfb\xad\x26\x5a\x24\x03\x87\xab\xd3\xb1\x81\x1d\x65\xcf\x55\x41\xa9\x25\xb0\x6e\x82\xdc\x52\x97\x5c\xab\x10\x7f\x7a\x42\x25\x7a\x12\xb0\x8c\x00\x3e\x0d\x1e\x50\x94\x44\xe6\x80\xfc\x3e\x91\x48\xdf\x53\xa4\x3e\x01\x46\x3d\x4e\xde\xed\x5b\xcb\x55\x34\x96\xab\xd3\x43\x4f\x75\x9e\xad\xc0\xcc\x41\x6a\x7a\xeb\xd0\xe6\x07\xf7\x1a\xe0\x78\x32\xfd\xe3\xcb\x9b\x88\x85\x63\x81\x28\x8f\xba\x67\xc7\x12\xe6\x8c\x19\x7b\x7c\xd2\x0c\x11\x38\x98\xc8\x7c\x86\xde\x09\x17\x9c\x67\x78\x92\x31\x87\x93\xf0\x1c\x4e\x0c\xce\x87\xbc\x04\x01\x29\x9a\x32\x67\x76\xbc\xf6\xee\x1c\x20\x34\x7e\x56\x30\x49\x5c\x70\xd2\xe1\x4e\x7d\x32\x35\xc6\x2d\xd9\x00\xc9\x0d\x92\x3e\xdd\x95\x65\xfa\x98\xe5\x79\x22\x20\x21\x60\xea\x72\xb7\x53\x77\x80\xbc\x67\xf6\x74\x95\xe5\xc4\x88\xb4\x55\xf9\x86\xf8\x8a\x1d\x1d\x4c\x9c\x93\x0e\x14\x6b\x83\xfa\x05\xfb\x32\x6d\xfa\xbe\x4e\xa0\x15\x87\x71\x41\xcd\xe3\x15\x04\xa2\xc1\xa8\x34\x10\xe2\xc7\x81\x1c\x01\x3f\xb5\xed\xb0\xe3\xd1\x2b\x2b\x39\xf2\x57\x61\xb0\xaa\x7f\xbe\xb7\x16\xeb\x91\x6d\x26\xba\xbc\x5c\x97\xa1\x60\x73\x6d\x7d\x5f\x96\x18\xe3\x82\x68\x16\xe5\x0f\x21\x44\x26\x95\xdc\x68\xd8\xf5\x89\x40\xd6\x6c\x66\x5a\x33\xfb\x1d\x06\xb9\x3c\x07\x56\x56\xa4\x7a\x5b\x20\x43\x5e\xab\xbe\x43\x96\xab\x9c\x22\x13\x86\x4b\xd4\x89\x63\x60\xdd\xd0\xe2\x8d\xf5\x9b\x3e\x21\x23\x17\x7a\x3b\x6e\x60\x60\xd0\x82\x47\x26\xde\xf8\x5c\xd7\x68\xa1\x97\x85\x37\x42\x29\x38\x4f\x74\x5e\xf0\x6b\x7b\xb8\x35\xb4\x99\xc1\x66\x90\x65\x21\x7c\x8a\xc4\xc7\x11\x82\x99\xa5\xc8\x9e\x7d\x49\xb6\x89\x35\xa2\x69\x0c\x36\x87\x44\xa6\x7a\xa3\x8b\x14\x81\x2d\x40\x88\xd5\x8e\x62\x3a\x22\x2c\x5a\x77\x7e\xb4\xb2\x62\xbd\xaf\x2a\x9f\x60\xc0\xc8\x9f\x50\xc6\xe8\xaa\xf6\x22\xa6\x49\x7b\xd5\xad\x0e\x74\x7f\xdb\xe6\x03\x7a\xd1\x8f\x9a\xb3\x6b\x79\xd2\x44\x90\xdc\x52\x79\xa0\x1b\x6d\x87\xdd\xf6\x67\x84\x44\xe1\x01\xa7\x44\x5d\xe2\x53\x61\x7d\x89\x65\xc9\x5c\xe2\x0d\x2c\x52\xf3\xe3\x98\x60\xc5\x64\x6e\xc3\x4b\x5d\x95\x59\xae\xab\x5d\xae\x6a\xf6\x89\x03\xea\xdd\x4d\xa6\xf3\x14\xc0\x6c\x79\x69\xf0\xf6\x5f\x55\x6a\xfd\x55\xd7\x46\xf6\xfe\xe5\x2f\x3d\x6b\x72\x5b\x2f\x97\xae\x8c\x03\xcf\x38\x6b\x64\x81\x58\x6f\x50\x4a\x7a\x92\x96\xc5\x77\x75\x84\x14\xe4\xe7\xf5\xd1\x33\x04\xd7\xc9\xdc\x73\x51\x89\x7b\x33\x9a\xbc\x22\xb8\xed\xf0\x64\x28\x6a\x69\x0e\x45\xad\x7e\x71\x8c\x7f\xe0\x44\xe2\x2b\x07\xf2\x67\xa2\x47\xae\x34\x7e\x9a\x65\x33\xe1\x53\x02\xa7\xd6\x18\xa4\x04\x88\xf4\x2a\x70\x06\x39\x6d\xb4\xd2\x3e\x31\x5e\x7a\xea\x27\xd9\xdb\x55\xd6\x62\x4f\x85\x3d\xe1\x7a\x8e\x62\xbb\x99\x5c\xb7\x4d\xd3\xca\x64\xba\xe2\x91\xe1\x3c\x99\x73\xea\x9d\xe3\x2c\x54\xb5\xbe\xcf\x1e\x48\x4f\x92\x1f\xf4\x2f\x87\xc3\xe1\xf0\x17\xf9\x2f\xd0\x50\xe0\xa8\x88\x12\x87\x7f\x09\xa4\x13\xbd\xc1\xdf\xb5\x22\x40\x38\x8c\x65\x20\x7a\xfd\x77\x0e\x3d\xc8\x34\x67\x90\x78\x81\x31\xfc\x55\x3a\x60\xb2\x53\x07\x4c\xa8\x5a\x88\xa0\x32\x18\xa8\xd1\xb6\x58\x27\x51\x56\x77\xaf\x70\xd0\x59\x10\x6c\xb0\xbb\xdf\x09\xf1\x6d\x96\xa7\x8c\xae\xe6\x0e\x35\x31\xf1\x42\x35\xb1\x1e\xd8\x98\xbd\x27\x8d\x4c\xd1\x32\x32\x7f\xb5\xbe\x98\x60\x7d\x31\xd9\xa1\x2f\x16\x5a\x5c\x2f\x10\x19\xfb\xf7\xae\x7f\xf8\xcf\xfe\x33\x78\x35\xba\x59\xfc\x1d\xb5\xbf\xfe\x7f\xcf\xd6\xff\xbc\xfe\xe1\x87\x1f\xde\x34\xea\x7f\xce\xdf\x9c\xbd\xfe\xa3\xfe\xe7\xf7\xf8\x19\xdd\xdc\x5c\x8f\xe5\xcd\xed\xfb\xeb\xc9\xa5\x5c\xcc\x6e\xe7\x97\x63\x79\x3d\xb9\x1c\x4f\x17\x63\x11\xa9\x37\x9e\xca\xd1\xae\xca\x72\x39\xfc\x31\x01\x1c\xad\xbc\x41\xfe\x84\x4a\xab\x34\xb6\xd6\xd7\xaa\xd2\x9b\x3d\xe0\x7c\xb1\xb8\x88\x8b\x7c\xec\xcd\x1a\x55\x71\x0e\x84\x78\x7f\x08\xff\x4c\x65\x40\x68\x91\x86\x65\xad\x70\xe4\xdb\xd3\x11\x0e\x4f\xd2\xbe\x5f\x69\xb9\x2a\xf7\x05\x47\x7c\x45\xa7\xf0\xb4\xab\x21\xa5\xd8\xab\xbd\x3f\x31\x48\xe9\x4c\xb0\xba\x29\x5a\xed\x93\xf8\x44\x12\x41\xdf\x75\xd5\x4a\x4e\xaa\x52\x87\x7d\x19\x3a\xa6\xd0\x77\x11\xcc\x37\x8e\xd8\x70\xbe\x96\x03\xf6\xa8\x93\xe2\x0d\x60\x6b\xf7\x08\xcc\x8b\x5a\x5b\x0a\xc8\x6b\xc0\x07\x61\xb9\xdd\x1e\xfc\xba\xd7\xf7\x09\x7a\xdb\x9f\x7d\x01\x6a\x1f\x0d\x39\x93\xcc\x08\x7c\xc8\x0d\x32\x54\xc4\xf2\x9c\x14\x0e\xb7\xaf\xf2\x7a\xb8\x6c\x00\x90\x91\xb4\x3a\x50\x33\x42\xfb\x08\xa9\x3b\x7d\xcb\xc1\x6b\x52\x46\xf6\x66\x8c\x96\xba\x2c\x53\x22\x2a\x0a\xd3\x58\x32\xab\x63\xc5\x15\xd1\x1a\x7b\xf9\x54\x7b\x1f\x42\x39\xd1\xb2\x0a\x30\x1e\x0e\x9e\x45\xce\x4a\x1f\x11\x84\x35\x73\x21\x02\x7c\xce\x91\x0b\x65\x28\xab\x86\x52\x48\xdc\xc1\x13\x6f\x62\x0c\xe4\xc8\x88\x2e\xd9\x69\x28\x83\x1e\xca\xde\x08\x08\x27\x75\x2a\x1b\x1d\x26\xa9\x00\x48\xc5\x43\x6e\xcb\x5d\x95\xbb\x80\x4b\x84\xbf\x24\x40\x27\x16\xad\xbb\x3c\xd7\x77\x3a\x0d\xf2\xee\xc8\x2c\xc2\x39\x9d\xc3\x77\xe6\x49\x6e\x58\x41\xe8\xe6\x00\x3d\x70\xef\xc5\x5a\x91\xeb\x12\x12\xdd\x90\x79\x0d\xea\xf7\x6d\x87\xce\x65\x6f\xe4\xcd\x14\x02\x60\xcc\xe1\xb9\xd8\xa5\xb7\xf2\x44\xf5\x39\x84\x0b\x6a\x2c\x08\x44\xa0\x95\x81\x26\x24\x44\x20\xcb\xca\x7a\xa8\xd8\xa6\x04\x10\xd1\x04\x41\xb0\x96\x29\x29\x1e\x38\x4c\x54\x51\x82\x41\x64\x1f\xa5\x36\x10\x0c\x58\xa3\xe1\x94\x60\x85\x94\x58\x1d\xa4\x63\xc8\x45\x93\x09\xdf\x68\xd7\x15\x00\x9e\x09\xf4\x8d\xd9\x1c\xec\xeb\x16\xe8\x24\x63\x49\x66\x7b\x3a\x44\x33\x85\x78\x29\x0f\x99\xe8\x96\x52\x88\x22\xf4\x9a\x99\x92\x1b\xa8\x97\xe8\xb9\x01\xd3\xa8\x1f\xe3\x77\xd8\xde\x55\xd7\x08\x52\xe4\x4c\x04\x03\x28\x7f\x8b\x01\x14\xae\xc4\xac\x31\x80\xf0\xc2\xe7\x87\x2f\x23\xa7\x37\x92\x1b\x4e\x44\xad\xbe\xea\xc2\xe3\x3e\xd0\xce\x76\xb8\x0f\x30\xb4\xa3\xf1\x80\xe5\x75\x21\x7b\x97\xf6\x1d\x3a\x8d\x76\x49\x6b\xf0\x92\xc6\xdb\xc8\x31\x71\xcf\x17\xc1\xd6\xc1\xd1\x66\x24\xd9\xe7\x16\x58\xe0\x15\x39\xc8\x44\x5c\x9a\x3d\x68\xbf\x03\x3d\x34\x74\x38\x78\x2d\x7b\x57\x7a\x97\x97\x07\xd7\x2a\x9a\x76\x8f\x75\x6a\x14\xfc\x84\x5d\xa1\x23\xbb\xbe\x57\x05\xc4\xc1\x61\xc8\xb8\x02\x55\x3a\x29\x48\xf4\xd2\x80\x98\x0e\xbc\xbf\x93\xf9\x7f\xb9\xea\x27\x24\x9d\x4d\x69\xea\x8e\x28\xae\x08\x23\x4b\xee\xa9\x7b\xd3\xc9\xcb\x1d\x35\x8b\x5c\x34\x68\x0e\xf3\x96\x0b\x40\x49\x06\x15\x2d\xe4\x2b\xd9\x76\xcf\xff\xcb\x15\xf6\x3a\x10\x58\xf1\x88\x15\x8e\xf5\xf9\x31\xb1\x77\xc0\x73\x6d\xf0\x49\x1e\x24\x43\x67\xba\xed\x03\x23\x3f\x38\x15\xbc\x55\x45\x01\xf4\x2a\xc3\xc1\xf7\xb2\x77\xad\xaa\x3b\x8d\xc1\x02\x87\x14\xc5\xfb\x85\x2f\x2a\xbb\x1e\xb4\x69\xcc\x43\xd5\x9a\x5e\x80\xe3\x20\x60\x13\xf2\x23\xe0\xa1\xf8\xf4\x70\xb7\xb1\x60\x1b\xf1\x83\xec\x45\xeb\xa9\xe7\xe1\xc2\x81\xa6\x51\xe2\x24\xeb\x09\xc5\x4c\x8b\x0e\x41\x1a\xf6\x03\xa2\x8e\x44\xec\xe9\xef\x4e\xc8\xbe\x39\x60\x03\xf9\xf3\x3d\x60\x5d\x51\x95\xac\xd2\x60\x7a\x40\x92\x5d\x09\xa3\x2b\xc2\xd6\x90\x34\xbb\x8a\xd6\xbc\xcc\x0c\x1e\xd1\x8d\x46\xca\x40\x59\xdf\x27\x77\x43\x71\xef\xb6\x8c\x7e\xd8\xa6\x77\xdc\x6a\x7b\x78\x45\x22\xfa\x8e\x0e\x25\x16\x89\x40\x3f\x9f\x62\xa6\x6c\x20\xb8\x34\xae\x79\x42\x7b\x9f\x5e\x2b\xdc\xa9\xf1\xa6\x65\x4d\x50\x95\x8d\xea\x87\x80\x02\x27\xb5\xde\x6d\x49\x49\x65\x44\x40\xc3\xd5\xa8\x3b\x70\x77\x7f\x3b\x37\xd0\xc4\x81\x13\x9a\x25\x54\x76\x47\xee\x6d\x70\x99\xf7\xbb\xbb\x4a\xa5\x68\xd5\x85\xc6\x91\x61\xeb\xc8\xb4\x5f\x2d\x8e\xbf\x5a\x71\xd0\xc7\x45\x84\x3d\x3f\x30\x47\x63\x02\xdb\x4c\x10\xe5\x08\xdf\x2f\xf7\x5a\xa5\xa4\xf8\x79\x62\xfa\xae\x66\xc7\xb6\xc3\xdf\x45\x90\x88\xc3\x33\x9f\x50\xcd\x58\x32\x22\x60\x9d\xc0\x17\xc2\x21\x86\x00\xe6\xaf\x19\x48\x98\xcc\x3f\xc9\x5e\xf0\xb0\xf0\x06\xb8\xdf\x6f\x55\xe1\x51\x33\x0e\xa9\x74\xc4\x30\x66\x28\xb3\xd9\x67\x4e\xff\xbd\xb3\xda\xc7\x57\xde\x3a\x00\x60\x9e\xdb\x8f\xec\x73\xc8\xd6\x09\x5e\x85\xd6\xc8\xdf\xe3\x5a\x0c\xd2\x49\xae\xd6\x20\x40\xb1\xf3\xde\xc3\xc8\x8f\x71\xcc\x9a\x8c\x07\xc7\x11\xf4\x92\x34\x59\x61\x6a\x95\x07\x05\x3c\x45\x28\x5c\x7f\x12\x0c\x7e\x1f\x06\xe9\x47\xd9\xfb\x52\xee\x91\xb8\xd2\x1e\xdd\x1e\x29\xdf\x80\x4a\x2b\xca\x40\xe9\x56\x2d\x15\x19\x83\x1d\xb3\x00\x30\xfd\xe0\x6b\x40\x40\xdd\x7c\x9f\x07\x4d\x39\x08\xa5\xf0\xfe\x41\x55\xe6\x26\x21\x1c\x79\xa3\xb0\x2e\x33\xc7\xeb\xea\x20\x6f\x40\xd0\x55\xd1\xa3\xbf\x34\x77\x73\xb3\x66\x4e\x3e\x57\x33\x27\x5e\x5a\x33\x27\x9f\xa8\x99\x5b\x05\x25\x73\xe2\xd9\x92\x39\xd9\x5d\x32\x07\x00\xd8\x8e\x5a\x39\xd1\xaa\x95\x3b\x1f\xc8\x1b\x47\x5f\x7c\x6b\xb4\x79\x17\x96\xd2\xfe\x17\x39\x0f\x08\x97\x5e\x04\x7c\x6e\x22\x0f\x13\xda\x85\x31\xda\x19\x86\x1f\x29\xf2\x41\x57\xa5\xf0\x10\x50\xb0\x06\x21\xda\x2f\x22\x1f\x1e\xc1\x4a\xe4\xed\x76\x18\x6a\x0a\xe1\xd2\xa7\x88\x97\x8e\x51\xd1\x45\x59\x9c\x0a\x07\x9f\xf6\x35\xd0\xb1\xa1\x5d\x6e\xb0\xad\xdf\x19\x79\xcc\xf7\xa0\xce\x52\xd4\xd8\x08\x30\x54\xf9\x3c\x6e\x34\xa8\x2e\xad\x93\x1e\xa5\x09\xde\xa2\x64\x2d\xc7\x7a\x5b\x4c\x5a\x4d\xfc\x6a\xe3\x89\x0d\x40\xaa\x68\xd8\x98\x94\xea\x7e\xb9\xd5\xe7\xe1\x3f\x1e\xaa\x45\xd8\x41\x4c\xf4\xc0\x71\x51\xac\xad\x8f\x69\x77\x05\xd1\x50\xb3\x60\x33\xba\x20\xf6\x17\x88\xcc\x24\x73\x20\xb6\x87\xe3\x48\xbe\x2a\x52\xd1\xd6\x4c\x0a\x84\x41\x03\x66\x68\xe3\x26\x84\x32\x02\x4d\x72\xe3\xc8\x67\xc5\x1b\xaa\xa9\x45\xca\x4f\x6e\x7c\x43\x7a\x2f\x37\xd2\x1d\xe5\x28\xcb\x3b\x21\xd0\x37\x6a\xf3\x4f\x04\x2b\x12\xa6\x23\xd6\x0c\x6d\x58\x00\xa1\x05\x41\x0b\x38\xac\xdd\x6c\x41\xe3\x8a\xd4\xad\x0d\x08\x0c\x01\x30\x1f\xc3\xdf\x25\x82\x75\x39\xa2\x54\xb4\xaf\x43\x72\xda\x6b\xfc\x0a\x33\xa5\xb5\xd2\xd6\x35\xb0\x03\x30\x9e\xf8\x3b\x26\x49\xb7\xfb\x13\xce\xcb\x10\x51\x13\x48\xa1\xc0\x51\xca\xba\x0f\x3f\x10\xc0\xf5\x64\xdd\xc7\xac\x86\xae\x35\xe1\x09\xd5\x7a\xbd\xaf\x80\xa3\xda\x75\x16\x66\xe2\x73\x7c\x13\x32\x63\x84\xab\x45\x10\x4c\x12\x0e\x87\x40\xb9\xc1\x05\x08\x9d\xfc\x1c\x09\xd9\xba\x7a\x20\xf8\x74\x24\x1d\xd9\x58\x12\xcc\xd3\x96\x26\x1e\xca\x9c\x1f\x82\x59\x45\x3b\x53\x55\xd5\xc1\xa5\x63\xc3\x34\x1b\x27\x69\x9a\xfb\x0c\x26\x72\x8f\x54\xa8\xd8\x0a\x8a\x4f\x65\x85\x1c\xff\x72\x9f\xad\xb2\x5a\x8e\xdc\x1e\x42\xdb\x74\xd3\x69\xb1\x01\x98\xab\xd1\x43\x22\x9c\x94\x52\x9e\x0f\xce\xdd\x72\x40\x8f\x30\xb2\x84\x3b\x31\xe6\x4f\xec\x5e\x94\x7b\x3b\x48\x26\x44\x8c\xe1\x37\x3c\xb5\xf6\x7c\x6a\xeb\x6b\x44\xb6\x2d\xc3\x4d\x23\xb3\x1c\x77\x0c\x10\x80\xd8\x17\xc0\x01\x84\x8d\xd6\x69\x63\xf2\x7d\x90\xd0\x19\x6b\x1e\x47\x0f\x2f\x00\x93\xeb\x21\x53\x61\xf5\x5b\xe4\xd9\x9d\xe8\xc1\xdd\xc0\x5f\x07\xc8\x2f\x27\x1f\xf5\x4a\x9a\xac\xd6\x7d\x9f\xd6\xe9\x8e\xc0\x72\x35\x56\x78\x99\xb1\x6b\x4d\x37\x94\xd1\xe0\x87\xd6\x60\xc1\xd2\xe0\x88\x0b\x09\xc5\xb8\x89\xf3\xf2\x5b\xd0\xbe\x23\x78\x84\xe6\xfe\x19\x08\x8f\xc3\x0f\xb4\x53\x88\xb4\xa6\xe5\x49\x3c\x35\x9a\x6e\x10\x91\xa0\x32\x26\x28\xa1\x65\xd3\x9c\x2d\x38\x07\x1e\x75\xfe\xa0\xe5\xc9\xf0\xbc\x2f\xb7\x65\x51\xdf\x7b\x9c\xbc\xe0\x3d\x88\x62\x31\x39\x3d\x06\xaf\x0c\x30\xbe\x00\xac\x9c\xe1\xbb\x74\xf5\x0e\x4f\x02\xc2\x11\x74\x2c\xd5\xd0\x99\x8b\x5b\xcf\x84\xcb\x60\x10\xe0\xe6\xc3\x0b\x02\xe6\xec\x1e\x13\xf8\x94\x13\xc5\xf0\x65\xfc\xfd\xd5\xc1\x6e\x30\x28\x8b\x2c\xf7\x35\xcf\xab\x3d\xb4\x30\xb4\x1f\x73\x30\x6f\x20\x36\x6f\x9d\x98\x90\x5e\x79\x97\xeb\xc1\xba\xdc\xbe\xc2\x75\x89\x65\x95\xaf\x22\xcb\x7d\x70\x5f\x6f\xf3\x44\x64\x1b\x3f\xda\x7c\x02\xa6\x4f\xf6\x3b\x2b\x42\x87\x26\x09\x8d\x6d\x74\x2b\x8a\xfc\xc0\x0e\x81\x16\xaa\x55\x72\xe1\xaa\x26\xd0\x07\x07\xae\x9f\x30\x22\xc2\x2a\x3d\xad\xfa\x79\x11\xc5\xb8\x1b\xcb\xa9\xb5\x1c\x32\xd3\x59\xf9\x1e\xd0\xd9\x34\xaf\xbd\x06\xb3\xb5\x9d\x28\x07\x64\x0f\xa6\xac\x79\x49\x61\x61\x1d\x2c\x67\xa8\xae\x33\x00\x69\x03\xf0\x4c\xaa\x9d\xfe\x14\xed\x2f\x13\x49\x11\xd6\x65\x12\xee\x53\x57\x7a\x24\x8e\x96\x1e\xd1\xb9\x67\xff\x18\x5a\x9f\x71\xcc\x16\x4f\xc3\x40\x78\x8d\x08\x57\x7c\xb1\x5d\x64\x4b\x0a\x67\x3b\xe2\xfb\xa0\x2b\x4f\x5a\x8b\x25\x55\xe3\x77\x04\xca\xf9\xee\xc5\xc0\x28\x17\x62\xb1\x17\x83\x7b\xa2\x15\xf3\xf5\xac\xab\x11\x4b\x59\x2a\x68\xfd\xb5\x63\xa4\x3c\xe5\x80\xb5\x40\x51\x5d\xc7\x8b\x06\xd7\x3c\x5b\xbd\x3c\xb4\x22\x3a\xad\x0c\xdc\x09\xf6\x1b\xe7\x83\x73\x5e\xf6\xab\xe7\xc6\x15\x24\x89\xf6\x2b\x93\xa5\x99\xaa\x3a\x87\xd5\x57\x37\x8a\xd8\x5a\x77\x15\x90\xf8\xa0\xa0\xa2\xf1\x45\x83\x2f\x5e\x36\xf8\xf2\xf9\xc1\x17\x1d\x83\x4f\x78\xe9\x84\x83\x13\x49\x50\x9d\xca\x45\xa9\x64\xcc\x03\x3a\x2a\xe0\x7b\x12\x27\xf6\x84\x76\x43\xf4\x8a\x0a\xc4\xc3\x51\xea\x47\x51\xde\x86\x37\xd0\x15\xfd\x0e\x02\x97\x89\x63\xd3\xd9\xee\xf3\x3a\x03\xbe\xc3\x8c\x0e\xd2\x86\x4c\xca\xeb\x81\x0c\x82\x9a\xc6\xa3\x4f\x90\xb7\x4d\xaa\xf0\xcf\xbe\x94\xb2\x19\x8b\x43\x39\x60\x06\x18\x7e\x4b\x54\xb3\x4b\xc0\x1d\x5f\x89\x8c\x1e\xb0\xf7\x4d\x56\xdc\xe5\x8e\x30\x17\x4e\x0a\x6f\x14\xb2\x71\x93\x78\xbb\x07\x6e\x4f\xb3\xaf\x98\x01\xcb\x6b\xd7\xb7\xce\x30\xa8\x8e\xd9\xe7\xf6\xea\xa0\xb2\x80\xae\x2b\xb2\x4b\xa5\x1e\x8a\x16\xae\x03\x04\x49\x59\xb4\xea\x83\xbd\xec\x99\x8f\x91\xf9\x1a\x08\x67\x69\x25\xa2\x60\x52\x13\x2a\xab\xe4\x1c\x4b\x17\xbc\xda\x36\x39\xe0\xa2\xf1\x5e\x75\x56\x0c\xe2\x55\xc1\xd0\xc4\x70\x8a\xa9\x4e\x12\xd9\xe6\x02\xab\xa5\x59\xcf\x09\x26\x00\x3e\x1b\x2e\x7a\x8a\x08\xda\x6f\xe3\x26\xcf\x0a\x5c\xb4\x25\x16\x5e\xad\x2b\x4d\x6b\xea\x87\x41\x88\xee\x04\x66\xae\xc1\xd3\xf0\xcc\xba\x6c\x23\x34\x3d\x14\x53\x38\x74\xa6\xc3\x64\x02\x64\xb5\x0b\x8c\x29\x23\xbd\xa0\x16\x24\x53\x78\x1e\x6d\x2f\x29\xde\xb0\xf8\x74\x4a\x83\x29\x4f\x7a\xcd\x7e\xf4\x80\xef\x03\x13\x4c\x02\x22\x2f\x71\x41\x66\x1c\x33\x77\x60\x4f\xee\x7c\x5a\x4a\x53\x1e\xc3\x73\x0a\xba\xea\x8e\xe3\x39\x59\xea\x37\xa2\xbd\x80\x69\x09\x8a\x2c\xf1\xbe\x15\x91\x73\xf7\x9d\x09\x8a\x3e\xd0\x3b\x64\xec\x64\xb3\x87\x98\xa8\x85\xe2\x24\x3e\xfd\xa0\xe8\x2d\x70\x4a\xe9\xa8\x3f\x8e\x12\x95\x0e\x24\x4a\x6b\x33\x40\x86\x8a\xa3\xc8\x50\x0f\x0c\x95\x4d\x60\x28\x3d\x27\x02\x83\x5a\x17\xb8\xb3\x07\x58\x7f\xf1\x53\xa4\x39\x19\xc0\xeb\xfc\x32\x66\x99\x4a\x4e\xbf\xd3\xd2\x29\x02\x75\xc8\xd6\x71\xd1\x4a\xd1\x0f\xe4\xd8\x9e\x44\xec\x7d\xb2\x9a\xe4\x5d\xf6\xa0\xa9\x02\xd0\x1a\x5f\xfb\xcc\xdc\x5b\x33\xb4\x21\x26\x29\x67\xc5\xba\x19\x8b\x70\x51\x75\x2f\x48\xc9\xdc\x7d\x01\xfd\x7d\x44\xf8\x12\xc6\xd8\xdc\x3e\x0b\x9c\x09\x28\x74\x39\x42\x23\xa8\x1c\x3a\x61\xe0\x41\xc7\xb9\x29\x83\x8d\x6a\xbf\x0e\x23\x1d\x37\xb4\xe3\x71\xb8\xaa\x18\xf6\x20\x22\x97\x3c\x18\x44\xdf\x33\x3e\xbe\x06\x72\x4a\xdb\xca\xe5\x2c\xdd\xda\x81\x88\x0f\x1a\x48\xe0\x19\x35\xcb\x9c\x02\x10\x63\x5d\x36\x9c\x0d\x22\x1f\x3d\x56\x5d\x31\x9d\x31\x0e\xf1\x0b\x48\xea\xdc\xde\xdc\xcc\xe6\x4b\x04\xce\xc6\x9d\xe5\x21\xb5\xa6\x6c\x07\xe1\xaf\xd8\x55\xfa\x94\xb2\x62\xd6\x26\xa9\xb5\x01\xda\x76\xbb\x9c\xca\x5a\x22\xe2\x08\x7f\x89\x19\x97\x67\xde\x21\x74\x55\x95\x95\x4b\x49\xed\xf3\x94\xc2\xcc\x04\xf5\x77\x98\x7d\xb8\xd2\x55\xad\x12\x57\x6f\x88\xd0\x5a\x0a\xc5\xd8\x63\xca\x37\x1b\x23\x32\xeb\x4c\xd3\x79\x1c\xe8\x3a\x06\x94\x8f\x70\x0c\xe1\xde\xb6\x6f\xf7\xec\x8f\x4d\x94\x42\xf7\xbd\x08\x41\x78\x0c\x42\xd0\x31\x06\x26\xa6\x57\x40\x1f\xc8\xe5\xa7\xb1\x98\xcd\x27\x1f\x27\xd3\xd1\xb5\xbc\x9c\x5d\xc5\x72\x53\x0c\x18\x1d\x4d\xaf\x9a\x68\xd1\x2f\x89\xbc\xbd\xf9\x38\x1f\x5d\x61\x69\x12\xcd\x97\x08\x20\xa3\x28\x51\x05\xb8\x31\xf7\xaf\xef\x16\x84\x1a\x9b\xcd\x4f\x16\x7d\x79\xf2\x61\x36\x47\xc5\x20\xac\x10\x02\xc8\xe9\x62\x7c\x09\xf0\x53\xf1\x27\xf8\xde\x8f\xc9\x33\x0f\x19\xcd\xc7\xf2\x72\x76\x7d\x6d\xbf\xf6\xd3\xf8\xfa\x8b\x9c\x8f\x3f\x8c\xe7\x73\x90\x6f\x92\xa3\x85\xec\xc1\x97\x7a\x7d\x41\x52\x59\xd7\x5f\x9c\x42\x95\x1c\x5d\x5f\x87\xf0\xd7\xd1\xf4\xea\x55\x54\x67\x95\xb0\xbe\x56\xa0\xae\x95\x48\xaf\x18\x25\xbe\x41\x52\xab\xf5\xf0\x0e\x91\x2d\x61\x87\x72\xb4\x9c\x2c\x3e\x8c\x2e\x97\xb3\xf9\x17\xf9\x4f\xb7\x23\x16\xdf\x92\xcf\x8b\x6f\x4d\xaf\xe4\x74\x36\x0d\x2b\xb5\x04\x8a\x36\xcd\xaf\xe0\xf3\x5f\xe4\x7c\xf2\xf1\xd3\x72\x31\xa0\x21\xbd\x9a\x8d\x17\xd0\x7c\x6a\xa6\x5c\x7e\x1a\x2d\xa1\xfd\x1f\x6e\xa7\x38\x0b\xa0\x2f\x35\x9a\x4c\xc7\x57\x62\x32\x85\x3f\xc5\xcb\xe5\xe7\xc9\xf5\xb5\xfc\x3c\x1e\x2f\xe5\x97\xd9\xed\x5c\xce\xc7\xff\x74\x3b\x41\xb5\xac\x05\xea\x4f\xf1\x13\x67\x37\xe3\x39\x8b\xc6\x8b\x23\xcf\x79\x3f\x96\xb7\x53\x27\x8c\x85\x9a\x66\xe3\xf9\x7c\x36\x3f\x95\x1f\xe6\xe3\xb1\x7f\xe0\xd5\xf8\xc3\xf8\x72\xb9\x90\x93\xe9\x13\x8f\xba\x9c\xcd\xe7\xe3\xcb\xe5\xf8\x0a\x4e\x97\xd9\x7c\x74\x6d\xbf\xff\xf3\x7c\xb2\x5c\x8e\xa7\x72\x32\xfd\x30\x9b\x7f\x76\xa2\x63\xa3\xab\x9f\x26\x97\x63\xf1\x71\xf2\xd3\x78\x2a\xdf\x7f\xa1\x01\x02\xb9\x31\x5e\x7f\xb7\xcb\x4f\xb3\xf9\xe4\x9f\xc7\x57\x72\x3e\xb6\x8b\x62\x3c\x5d\x8e\xec\x92\x23\x61\xb3\xcb\xf9\x78\xb4\x1c\xcb\x91\xdb\x21\x76\x32\x03\x35\xad\xc9\xd4\x7e\x62\x31\x86\xd1\x58\x5c\xce\x6e\xbc\xa2\x16\x7f\x83\x2a\xe4\x22\xd2\x57\x24\x16\x89\x37\xbc\xdd\xd7\xc8\x9d\x56\xeb\x22\x25\x63\x99\x6a\x28\x21\xf9\xb4\xf3\x7e\xbb\x2c\xf6\x48\xa1\xbc\x51\x6b\x7b\xd1\x67\xda\x24\x42\x65\xd5\xba\x52\x9b\x5a\x16\xea\x81\xec\xb5\x24\x26\x83\xf2\xac\x55\xf6\x6c\xc9\x2a\x59\x57\x6a\xb3\xc9\xd6\x9e\xcb\x52\xad\xef\xb3\x42\x1b\x28\x1c\xc3\xdc\x9f\xa2\xe4\x9b\x2b\x82\xda\x74\x04\xf8\xf1\x08\xcd\x01\x0e\x5a\xca\x54\xab\xfa\x3e\x71\xfc\xec\x22\x2b\xfe\xba\xaf\x30\x57\x68\xac\xc1\xa6\xe5\xee\xfe\x60\x80\xf8\x10\x18\x45\x1f\xb2\xaa\x64\xc5\x5d\x27\x8e\x22\xa5\xfc\x71\x10\xd4\x2e\x09\xf1\xe3\x60\x28\x27\xb1\xfc\xcc\x26\x3a\x21\x49\xd9\x85\x0b\xb4\x14\x5a\x40\xf6\xa4\xde\x6a\xb2\xe6\x93\x8e\x71\x5f\xe9\x75\xb9\xa5\x6a\xcf\xe7\x41\x73\x89\xb7\x70\x12\xa9\x6a\x61\x6d\xf4\x12\x0a\x30\x08\x85\x51\xd7\x7a\xbb\x83\xab\x74\x57\x95\x6b\xe7\x24\xa1\xa9\xec\x21\x66\x91\x87\x0a\x66\x20\x50\x37\x92\x55\xc1\x38\x58\x2d\xbb\xd1\x86\xef\x20\x7f\x19\xdc\xd5\xad\x8f\x61\xec\xdb\x94\x21\xf6\xb2\x28\x29\x8e\xc8\x3d\xca\x8a\xbb\x77\x90\x0c\x5d\xf7\xa5\xd9\x9b\x9d\x2e\xa8\x3e\xdd\x8b\xce\x03\x71\x51\x47\x4c\xe4\xb8\xf7\x7c\xbc\xd5\xf6\xe6\xce\x72\xa1\x48\x20\x99\x4b\x43\x23\x35\x74\xa2\xe4\xf1\x01\x4b\x16\xea\x2e\x2b\x19\x69\x33\xab\x74\x9b\x15\xf6\xad\xc8\xf3\xa0\xee\x74\xb1\x3e\x30\x06\x45\x83\xb3\xf5\xd7\x7d\x95\x99\x34\x5b\xbb\xac\x3c\x0e\x78\x9e\x6d\x6a\x9e\x6e\xdb\x67\x30\xa2\x54\x10\x89\x46\x26\xc8\x81\x5c\xec\xc1\x09\x76\x9f\x71\xe0\x3c\x67\x87\xfa\xcc\xaa\x13\x24\xcf\x0f\x88\xde\xa4\x58\x8f\xd8\x95\x60\xa2\xe2\x92\x62\xf6\x4a\x42\x8a\xe0\xd7\xbd\x62\x1d\x78\x83\x14\x5b\x77\x9c\x80\x00\x35\xd8\x90\xee\x93\xde\x86\x70\x9b\x38\xcb\x7f\xbb\xe3\x6c\x55\xd7\xf8\xa2\xde\x0c\xb0\x51\x89\x6c\xe3\xe1\x9b\x4c\xcc\x6c\x2d\x3c\x5f\x50\x0c\x79\x79\x75\xf0\x6a\xe9\x1b\xe4\xcc\xa6\x00\x52\x82\xf4\x62\x66\xbf\xd5\xa2\x83\xcb\x20\x92\xee\x8d\xa0\x63\x47\x69\x0e\x78\xc5\x34\xad\x20\x1a\x14\x3b\xde\x76\xde\x9a\xd3\xe6\xa7\x84\xb2\x0b\x47\x36\xc2\xca\x1e\x13\x38\x11\xbf\x7e\x16\x20\xf0\xff\xdc\x2c\x4c\x78\x6c\x69\x43\x99\xe6\x8e\x3a\xd6\x53\xa6\x20\x68\xc0\x8e\x3d\x35\x82\xa3\xd5\xa0\xc1\xc7\xb4\x23\xc4\xcf\xd8\x20\xc4\x93\xa8\x99\x75\x89\xeb\x90\x12\xf4\xb2\xb0\x14\xae\x79\xcc\x88\x36\xa4\x35\xd4\xfd\x72\x4a\x10\x88\xd2\xd0\xb6\x83\x98\xec\x2b\xf4\x5d\x59\x67\x18\x0a\xdf\x80\x9b\x47\x27\x1d\xc7\x5e\x3d\xb4\x28\xc0\x03\xc2\xb1\x7e\x8e\x96\x16\x1b\x12\x5e\xec\x72\x20\x6f\xa7\x57\xe3\xb9\xbd\xe9\x2f\x27\xf3\xcb\xdb\xcf\x8b\xe5\x68\x7a\x39\x5e\xd0\xe5\x8c\x57\xb8\x13\x12\x15\x2c\x24\xda\x29\x1b\xca\xaa\xa2\xc7\x45\x43\x59\x2c\x73\x76\x0b\x16\xd6\xcc\x1a\x3e\xd7\xa3\xa5\xfd\xd5\x72\x86\x77\x3a\x55\x47\xd8\xbf\x81\x65\x74\x8b\xff\x9e\x4c\x59\x4f\x75\x39\x83\xdf\x85\xf6\x8b\xb0\xf6\x4b\x22\xa9\x6d\xd6\xa0\xb6\xdd\x5c\x7e\x1a\xcf\xc7\xb3\x0f\x5e\xf5\x13\x7b\x3a\xf2\xd2\xa0\x81\x08\xa8\x33\xcf\xc5\x71\xe5\xcf\x3e\xa8\x9a\x5e\xdd\x5a\x0b\xca\x0d\xa0\x0c\xe5\x40\x9d\xb4\x27\x0e\x9c\xf8\x34\x5a\xc8\xf7\xe3\xf1\x54\xbe\x58\xe9\x73\x41\xd6\xe8\xd2\xfa\x0d\x76\x2e\xa0\x0d\xd6\xdd\xf8\x30\x9a\x5c\xdf\xce\xc1\xf8\x19\x2f\x16\x34\xb0\x6c\xc2\x92\xff\x60\x2d\xc8\xab\x2f\x71\x69\x3d\xae\x6d\x0e\x8b\xd7\x65\xad\x72\xe1\xa3\x17\x41\x49\xba\xfd\x18\xd7\x53\x77\x70\x9f\xe9\x5f\xd6\x9a\xd8\xb1\xd4\xb6\xdc\xe3\xa1\x05\x88\x1e\x91\x96\x79\xae\x2a\x23\x4f\xfe\xff\xdf\x9f\x0d\xce\xce\x00\x6e\x75\xf6\x72\x56\x0d\x24\x1c\x08\x6e\x43\xcf\xaa\x01\xdf\x16\x65\x15\x72\x6c\x48\xaa\xd0\x48\xe8\x1f\xae\x82\xc3\xfe\xe6\xb3\x5a\xcb\xd9\x42\xfe\x39\xfc\xb7\x5c\xe8\xea\x41\x57\x3d\x49\xb1\x1b\xf2\xd0\xdd\xf3\x65\xe3\xf9\xf6\x6a\xc2\x7d\xe8\xb2\x00\x27\xeb\x12\x82\xee\xd9\x83\xbd\x7c\xf0\xbd\xe2\xb3\xfd\x72\xaf\x4f\x41\x2d\xfa\x24\xfc\x92\xdd\x58\x82\xb0\xc9\x17\x88\x43\x0b\x47\xec\x15\x1f\x0f\x41\x38\x21\x02\x31\xac\x0e\x04\x82\x93\x74\x48\xf9\x8a\x4c\x81\x05\x0f\x10\xdc\x21\x12\x1b\x37\xfd\x01\x4e\xd8\x0d\x80\xdc\x1b\x28\x32\xdc\x67\xa9\xce\x01\xfc\x8b\x86\xa9\xaa\x34\x5c\xad\xfa\x78\x9a\x11\x6e\xb6\x57\xfe\x9b\x9b\xb2\xba\xa8\x52\xca\x3e\x41\xa6\xd1\xae\x85\xe1\x40\xce\x18\xb6\xc5\xe1\x2b\xc4\xdf\x18\x68\x28\x87\x8a\x41\x08\x91\xba\x55\x6b\x7b\xfc\x4a\x82\xe8\x10\x97\xcd\x0b\xe0\xe9\xce\xa8\x69\xb0\xc0\xba\x2a\x14\x9a\xbb\x08\x82\x4c\x68\x71\x0c\xc6\xe1\x34\x46\xcf\x84\xbb\x91\x98\x97\xd4\xbe\x2e\xb7\xaa\xb6\xb6\x35\xf2\xf1\x00\x03\x38\x81\x6e\x3a\x82\x74\xd6\x84\xed\x0a\x33\x27\x41\x7c\x8a\xcd\x3c\xdb\x00\xd1\xd5\x80\x2e\x14\x2b\x76\xd0\xd3\x30\x61\x2c\x89\x96\x51\x69\xb4\xaf\xd1\x10\xcd\xfb\x8e\x44\xba\xa9\x01\xb6\x63\x41\x23\xea\x7b\xbd\x95\xb8\x84\x06\x6e\xe1\x84\x48\xab\xdf\xc0\x1c\x89\xc0\x44\xe1\xe8\x36\xca\xab\x82\x60\x97\x94\x72\x78\x3e\x80\x00\x29\xd9\x5b\x76\x69\x9d\x0f\x86\xd1\xaf\x1a\xc5\x60\x84\xc3\xa1\xd3\x25\x0c\x8e\xe3\x88\xc2\xab\x1d\x83\x23\x25\x59\xe3\x19\x66\x73\x8d\x0b\xb7\x7d\x52\x81\x72\xe5\xd6\x6d\x63\x52\x78\x16\x50\x61\x74\x13\xe1\x83\x5b\xe9\x22\xf7\x9d\x3d\xf3\x8d\xae\x2a\xc8\x07\x51\x69\xc1\xc5\x99\x4c\xd5\x01\x62\x63\xe0\x3b\x01\x3f\x08\x8a\x1e\x6f\xc2\xcf\x33\xb8\x2b\xb0\x8c\xc9\x97\xc5\xc3\x9f\x2d\xfe\xac\x5a\xef\xb7\x98\x64\x32\x4c\x17\x14\x67\x70\x86\x17\x83\xef\x4f\x56\xfd\x77\xa2\xac\x10\x01\xf1\x6d\xa3\x00\xab\x1c\x2a\x11\xb2\xad\x96\xe9\x9e\x81\x84\x30\x0a\x6d\x4a\x29\x2c\xbd\x07\xd8\x3e\xc8\x4f\x00\x9e\xa1\xea\xe2\xeb\x8c\x03\xe8\x38\xe5\xe7\x72\x4c\xf6\xe4\x26\x9e\x7c\x30\xcf\x03\x8b\x3c\x69\x90\x41\x04\xc3\x64\xea\x72\x07\xb7\xc1\x66\x5f\xc1\x11\xfb\xb7\x2d\xea\x2e\x1c\x11\x9f\x5c\xa9\xb5\x23\xcb\x43\x03\x5a\xd8\xfa\xb4\xa3\x89\xcd\x0a\xa4\x4d\xd8\x01\xa3\x89\x21\x05\x0b\x0a\x20\x0c\xe4\x08\x90\x56\x2b\x97\xe6\x22\xab\x3c\x4e\x66\xc2\x01\x7e\xaf\x1e\xb4\xc0\x48\x3c\x24\x8a\x73\xaf\x7d\x8a\x42\xfb\xf6\xab\x81\xff\xc2\x94\x5c\xd5\x03\x53\x76\xc6\xde\xa3\x88\x8f\xb8\x9b\xaa\x24\xd2\x7c\x7c\x5f\xe2\xa9\x6c\x0b\x55\xef\x2b\x9d\x30\x6d\x03\x31\xd3\x67\x05\x3b\x02\x2b\x7d\x28\x8b\xd4\x95\x27\x46\x0e\x6a\xcb\x2e\xa7\x06\x3d\xc3\x36\xee\x32\xfc\x17\x89\xfc\x3e\x91\x7f\x4a\xe4\x8f\x89\x1c\x9e\x25\x72\x38\x4c\x24\x2c\x1a\x3b\x1d\xc3\x8b\x81\x9c\x52\x4d\x3e\x5e\x83\xec\x67\x3a\x8e\x1e\x94\xee\x80\x4f\x6c\x50\xe4\xce\x7a\x42\xcc\xa4\x18\xe6\xef\x62\xd6\x1d\x69\xca\xaa\x66\xe0\x6a\xc0\xb7\x03\x4b\x83\x3b\xc9\xa5\xb7\xd7\x81\xf0\xd7\x7a\x5d\x56\xa9\xa7\x52\xb0\x77\x05\x9c\xe5\x94\x59\xf4\xe3\xd3\x01\x5f\xc1\xb6\x7b\xad\x36\xfd\xd7\x7d\x4a\x8e\x57\x40\xb9\x8a\xb4\x10\x95\x9d\x07\x9d\x5a\x0f\x5e\x84\x43\x40\x87\xeb\xc5\x40\x7e\xce\xcc\x5a\xe7\xb9\x2a\x74\xb9\x37\x76\xaf\x5d\x0c\x86\xf2\xa3\x0b\x09\xc8\x71\x01\xc0\xea\x8a\x82\xff\x2d\xdc\x8d\xec\x05\x92\x80\x59\xad\xb7\x3d\xe9\xe5\x72\xec\xba\xfe\x30\x9a\xcb\xf3\xc1\xf0\x6c\x38\x08\x1f\xeb\xc8\x19\xb0\xbf\xeb\x7b\x94\xec\x48\x55\xad\xf8\xe8\xa6\x53\x2d\xba\x37\x18\xfc\x18\xd4\x83\x72\xba\x94\x18\xd2\xb2\xfc\x10\x00\x0b\x71\x9f\x90\x98\x7c\xdc\xae\x78\x61\xc3\x1d\xe2\x59\xd6\x82\x3e\x05\x7a\x6d\x8d\x76\x82\xfd\xc0\xfa\xf5\x0d\x09\x8c\xe6\x0c\xdb\x51\xb0\x2b\x72\x38\x94\x27\x4b\xf7\x98\x2b\x55\x2b\x34\x26\xe1\x6f\xe7\xf2\x84\x0d\x5b\xa7\xb0\x0f\x7f\x46\x69\xc6\x2b\x6d\xe7\x8e\x83\x07\x57\x7a\x43\x79\xa9\x6a\x7d\xaf\x8c\x36\x89\xbc\x82\xb1\xfe\xfe\x7c\x70\x7e\xfe\xe6\xf4\xcd\xd9\xf0\xfb\xe0\x5d\xc2\xbe\x4b\x9e\x9e\x5a\xd3\x99\xbb\x36\xa9\xf5\xd6\xe0\xfb\xcf\xcf\xdf\x0c\xde\x9c\x9f\x9d\x9f\x5e\xc8\x93\xb9\x1b\xff\xe0\xb3\xdc\x30\xc9\x0d\xb3\x26\x7a\xeb\x97\xf2\x2a\x84\x71\xf5\x81\x47\xa9\x04\x22\xbe\xdc\x5a\x45\x79\x2e\x6f\x07\x8b\x41\x63\x7d\x09\x58\x5f\x5c\x69\xd9\x86\x68\x74\xcc\xb6\x87\x37\x12\x84\x00\x16\xee\xb9\x9c\x6b\x2c\x0e\x61\x65\x9d\x1b\x32\x4b\x63\x1b\x21\xb4\x3e\xbc\xfb\xaf\x0c\xa6\xde\x90\x98\x4b\x62\xe8\x2b\x81\xfd\x42\x86\x6c\x22\xff\x5a\x66\x50\x19\x5d\xd4\x44\x5d\xe5\x77\x1c\xd7\xd9\x60\x45\x08\x17\xbe\x64\x40\x65\x54\x3f\xda\x13\x99\x0b\x45\xe1\x5a\xf3\x99\x69\xd7\x1a\x57\xf8\xc5\xeb\x16\xeb\x2c\x42\x46\x34\x97\xfc\x82\x83\x17\xc0\x15\x7c\x57\x21\xb8\x1c\xb9\xa1\x82\xb2\x0c\x1c\x99\x0b\x39\xf1\x71\x05\x79\xe5\x2d\x3b\xa0\x6f\xec\x0c\x90\x40\xb3\xb2\xed\x4e\x65\x95\x8b\xba\xb9\x7c\x26\xcd\x55\xe2\x21\x4d\x64\x2d\x12\x3d\x3b\x61\x20\xe9\x97\x48\x5c\x59\x27\x28\x90\x50\x53\xce\x5a\x84\xd1\x4d\xbb\x4c\xcb\xbc\xbc\x3b\x04\x94\x89\x94\x49\x24\x5c\x92\xc7\x80\x95\x95\x34\xd9\x36\xcb\x95\x8f\x4a\x1b\xa1\x4c\xcc\x02\xc7\x01\x4b\x2a\x98\x69\x60\xa0\x43\x6c\x49\x12\xbf\x5d\xc4\x6f\xa7\xf4\x32\x83\x9a\x5d\x37\x7d\xe8\x16\xfb\x14\x95\xb4\xe2\xa0\xbf\x96\x3f\xab\xec\x41\x57\x50\x93\x82\x55\x8a\x60\xb2\x7c\xa0\xa0\xbf\x83\xc1\x80\xbb\xb8\x29\xab\xb5\x66\x02\x03\xbc\x64\x9b\xec\x09\xd1\xc2\x4d\xb5\x3d\xd9\xa5\x92\x8f\xf0\x12\x70\xcd\xf7\xb0\x2c\xe9\x59\x5b\x67\x0d\xaa\x3a\x5a\xaa\xc2\xbd\x60\x20\x47\xc5\x81\x59\x74\x2a\x7d\xb7\xa7\xd2\x2a\xb4\x25\x02\xc6\x46\xd6\xa5\x65\x76\x1a\x8c\xe4\x53\x19\x90\xe8\x88\xa5\xb1\x09\x07\x90\xf8\x0a\x4b\xa9\x5d\xeb\x89\xae\xaa\x65\xef\x5b\x83\x54\x2e\xf4\x83\xae\x1c\x07\x96\x35\xce\x27\x1b\xc7\xce\x45\x48\x0a\x17\xbd\x3e\x16\x97\x16\x9b\xac\x48\x4d\xf7\x68\x46\xee\x54\x2b\x0f\x8c\x2c\x18\xfb\x82\x06\x11\xe2\xb7\x58\x5e\xd2\x78\x90\x6e\x5d\xc9\xf4\x15\x77\xed\x6c\xd5\x2f\xd9\x76\xbf\x65\xa4\x22\xf3\xf8\xac\x72\x2d\x4c\x09\x45\x21\x25\x1b\x47\x60\xbe\xaf\xcb\xa2\xdc\x66\x6b\x2a\x7d\x22\x08\x60\x16\x31\x76\x92\x9b\x9d\x78\x37\x07\xcc\xac\x54\x57\xdd\x86\x82\x4b\x7d\x64\x05\xe4\xf3\x25\xaf\xb2\x94\xde\x3c\x80\x94\x47\x83\xc2\x55\x60\xd5\x4f\xa5\xef\x4a\x60\x52\xca\x36\x4d\xd2\xa5\x5d\x55\x42\xa1\x80\x09\x6b\x35\x10\x3e\x0e\x7e\x02\x62\x07\x68\x9f\x33\x63\x03\x78\x15\xe8\x32\x65\xcc\x47\xed\x41\x9a\x8c\x64\xb9\xc0\x13\x00\x9c\x19\xcc\x27\xb8\xa9\x70\x7c\x7d\x64\xca\x40\x97\xed\xad\xc0\x4f\x49\x3a\x8f\x30\xef\x01\x04\xc4\xfd\x94\x1e\xc2\x8a\x83\xe0\x23\xd6\x5b\xe7\x41\x83\x92\x54\xd3\x8d\x39\x26\x9e\xb0\x86\x95\x2f\x80\xfe\xdc\xd3\x09\x3c\x6d\xd7\xc3\x8a\xff\x41\x5e\x65\xc6\xde\xa2\x72\xae\x59\xed\x90\xf6\xa5\x17\x12\x70\xe0\xb0\x94\x3e\x5b\xb9\xcf\x4a\xba\x5e\x44\x74\xbd\x20\xae\x9a\x02\x5a\x1d\x06\x76\xad\xbe\x12\x21\x09\xdb\x59\xd3\x12\x9c\xa2\x82\x54\x26\xd7\x60\xc4\x5e\xaa\x3c\xdb\x94\x55\x91\x29\x7f\x5f\xf9\x77\x10\xa6\x0a\x78\x29\xfd\xad\xc5\x19\xca\x78\x43\x32\x2c\xfa\x41\xe3\x72\x44\x34\x34\x72\x21\x83\x7b\xac\x53\x5d\xa9\x1c\x37\xb6\xf1\x94\x68\xaa\x76\x0d\x8a\x0a\x3b\xda\xe1\x97\xe5\xbd\xe6\x65\x1a\xa6\x40\x6e\x0b\x70\x17\xa6\x14\x56\xb9\x2c\x8b\x07\x24\x57\x96\x65\x81\xac\x7d\x6a\x5d\x1b\xa7\x11\x34\xc1\xaa\x33\xc2\x66\x2d\x14\x56\xbf\x7c\x2c\xcb\xd4\x80\xa2\xab\x43\x9f\x20\x95\x3c\x68\x3b\x0c\x2f\x06\x6f\x40\x67\xa7\xd2\x72\xc4\x90\xb5\x77\x64\xe5\xd8\x39\xb8\x56\x8f\x0d\x13\x24\x54\xb2\xc0\x35\x6e\xbf\x2d\x3c\xe0\x8d\x8d\x86\x60\xd7\x77\x16\xb6\x34\x58\x26\x08\xe6\x09\x2f\x13\xad\x5c\x47\x13\xdc\x9a\xab\x47\xd3\x18\xa7\x45\x0d\x15\xd8\x7c\xbe\x2c\x90\xac\x7a\x23\xc2\x95\x40\x15\x56\x30\x39\xab\x12\xbc\x8b\x60\xa5\xc0\x01\xb1\x2e\x8b\x35\x75\x7e\x5d\x16\x9b\x1c\x8e\x07\x6b\x1d\xa9\xc7\x81\x10\x3f\x87\x4c\x1d\x32\x2f\xd7\x9e\x60\x5b\xe3\x39\x4b\x14\x97\xff\xb4\xd7\x2b\xbd\x4e\xe4\xa5\x2a\x54\xaa\x92\xb8\x1c\x51\xae\x73\xb5\xf7\x7a\x2d\x6f\x61\x05\xf0\x58\xf9\xb5\xb9\xc9\xc0\x78\xc0\x2b\x8c\x68\xa3\x2b\x0d\xf2\xcd\x5c\x7b\x14\x2e\x24\xc1\xb0\xfa\x66\x65\x82\x81\x5b\x17\xee\x32\x68\xeb\xb8\xb8\xcb\x33\x73\x3f\x90\xd7\xda\xb8\xd7\x96\x45\x2d\xf5\x2f\xd9\x9d\x96\xff\xba\xd7\x02\xe0\xbf\x68\xd2\xe1\x65\x59\x4b\xd0\x84\xdf\x1b\x99\x6b\x13\x3c\x79\x5d\x16\x85\xfe\x45\x1b\x69\xca\x0c\x90\xb4\x3a\xcd\xac\x9b\x09\xb2\x09\x77\xb9\xca\xcc\x40\x8c\xff\xfc\x69\xf2\x7e\xb2\x94\xa3\x81\x10\xbd\x1b\xe6\x66\xf0\xec\x80\x27\xeb\x3e\xeb\xb1\x9e\x9d\x75\x33\x1d\x8d\xf2\x9c\xb1\xfd\x73\x6d\x74\xf5\x60\x97\x2f\xac\xcb\x90\xb3\xc0\xb4\x39\x41\xec\xc1\xdc\x02\xe5\x37\x3e\x65\x04\x8b\xa4\x72\x04\x97\x4f\xc1\x46\xa9\xd2\x53\x7c\x44\x84\x80\x04\x4e\xa0\x06\x4b\xe1\x20\x2a\x2e\x64\x96\x42\xf9\x3c\x4b\xa1\x97\x04\x20\x86\xad\xa7\x48\x0a\x5f\x54\x5e\x23\xb0\x86\x54\xa5\xf6\xb0\x27\x4e\xae\x80\x64\x8b\x08\xb5\xdb\x60\x39\x5e\x5a\x5d\xd4\x84\x6d\x2e\x3f\xd9\x24\x2f\x8c\xb9\x09\x57\xca\x64\xa6\xc5\x4d\xf8\x25\xe6\x22\x1c\x4f\x20\x0f\xd6\x81\xcd\x12\x1e\x74\xf6\x69\x3c\x1f\xbf\xf7\x58\xaf\x05\x80\xbd\x20\x43\xe5\x41\x59\x01\x96\xcb\xbd\xd2\x27\x18\xed\xd3\xbe\x44\xf4\x88\x2d\xc0\x56\xf2\x3c\x2a\x6b\x36\x07\xfe\x6c\x11\xc2\xb2\xdc\xa4\x99\x6e\xea\x44\xf9\x14\x75\x22\x95\x39\x3f\xcf\x9a\xd8\xfb\xed\x68\x13\x07\xaf\xb6\xd9\xe6\x14\x17\xa4\xbd\xca\xff\x1e\x24\x80\x4f\xf3\xff\x9d\x0d\xcf\xce\x87\x0d\xfe\xbf\xd7\x17\x3f\xfc\xf0\x07\xff\xdf\xef\xf1\x33\x82\xda\x0f\xa4\xf0\x96\x6e\x19\x24\x8e\x62\x35\x3e\xb8\x02\xd9\x1c\x85\x12\xea\xee\x6c\xc8\xb3\x95\x75\xfe\x5d\xa4\xaf\xf2\x5c\x06\x03\xb9\x08\x6c\x6a\x30\xd0\x29\x08\x01\x12\x48\x58\x5c\x52\x03\x3f\x6e\xad\xb7\x40\xeb\x6b\x98\x62\x6f\xab\xd6\x55\x89\xb5\x19\x45\x9e\x15\xda\xfb\xd0\x9c\x48\xa2\xb6\x81\x7f\xc4\x32\xf1\x59\x1e\xb5\x1a\x36\x54\xf1\xd5\x1e\x7f\x18\xa1\x09\xde\x8e\x18\x2d\xe2\xf7\x0a\x4a\x06\x93\xe0\x01\x2e\x1d\xbc\x3a\x70\x59\xa0\x67\xa4\xf0\x8a\xbe\x41\xbd\x21\xfa\x65\x6b\x32\xc1\xc9\x7e\xf9\x38\xbd\x65\x82\x40\xbe\x4f\xe2\x88\x9e\x1b\x7f\xff\xc6\x7b\xac\x6f\x90\x59\xf1\xa0\xf2\x2c\x45\xfb\xd3\x2b\x55\x59\xff\xd2\xc8\xc7\xfb\x03\x51\x2b\xf8\x82\x47\xdb\xee\x2d\xdc\xb4\xdf\xd4\x90\x3f\x08\x59\xff\x73\xfd\x0c\x5e\x7d\x5e\x9c\xce\xaf\xff\x7e\xe4\xaf\xcf\x9f\xff\xdf\xbf\x39\xbf\x68\xf2\xbf\xbe\xfe\xe3\xfc\xff\x7d\x7e\x3e\x67\xf6\x7c\x2d\x37\xb5\x9c\xeb\x75\xb6\xab\xca\x35\xa8\x05\x10\xf1\xf6\x67\x73\x3a\xbf\xee\x0b\x34\xba\x5d\x05\x17\x18\x2c\x26\x8c\x35\xa8\xb5\x3d\x75\x55\x81\xd4\x0e\xcc\x88\xca\xcc\xab\x4d\xaa\xd4\x44\x1c\x1c\xed\x0c\x9e\xb2\x79\x37\x57\xab\xfb\x48\x50\x8c\x4a\x7f\xa2\x67\x8a\x80\x7e\x55\x4a\x39\x1c\x84\xc4\xab\x68\xd3\x22\xea\xa0\xe7\xe1\xab\x3d\xff\x3f\x70\xd7\xf5\x64\x2f\xf5\x92\x07\x50\x3a\x92\x20\x75\x69\x2f\x4c\xa0\xf6\x04\xf8\x62\x2e\xae\xbb\xd5\xaa\x60\xb5\x20\x7b\x31\xa2\x99\x06\x09\x83\x40\x88\x15\x1c\xc8\x91\xec\xad\x03\x69\x98\x1e\x33\x66\x3a\x6d\x69\xcf\x73\xcb\x7a\x12\x4e\x3f\xda\x51\xca\x19\xce\xfc\x05\x5d\x0e\x1f\x5c\x56\xf0\x5c\x08\x22\x42\x4c\x83\x64\xe2\x9c\x45\x0e\x1a\x35\x32\x6c\x48\x80\xda\xe0\x52\x6b\xeb\xad\x39\x5a\x76\xe2\x9b\xec\x21\xf3\x6e\xa8\x5c\xf9\x9d\x69\x28\x8c\x12\xbd\x8b\x4a\x89\xa1\x09\xca\xef\x44\xf3\x85\x38\x4b\xa1\xda\x2e\xfa\x77\x42\x9c\x8c\xfa\x81\x73\x08\x7f\x3e\xed\x66\x40\xe2\xc8\x61\xde\xcd\xd3\xc6\xb2\xa8\x01\xe1\x46\xd3\xa0\x06\x09\x72\xcc\xe9\x5f\x90\x4e\x6f\xd0\x35\xe6\xa4\x80\x35\xda\x94\x82\x0d\x44\x62\xc3\x32\xea\x67\xa4\x77\x5b\x03\xef\xb5\x78\x9b\x2b\x4f\x92\x22\x61\xfc\xe9\x06\xba\xba\x35\x8f\xb8\x6a\xda\x0f\x73\xcc\x2f\x58\xa5\x35\x10\xe2\xe4\x7d\x9f\x2b\x68\xff\x97\x1b\x64\x1e\x5a\x5c\xb5\x76\x10\xf2\xc6\x4a\xed\x92\xdd\x45\x30\x10\xea\xec\x22\x3d\x88\xf5\xc5\x8c\xb2\x26\x5e\xa0\xbb\xfb\x2a\xd6\xc1\xce\x0c\x6b\x6f\x37\x07\x5b\x50\xe0\xc7\x59\xbe\xac\xe7\xdf\x98\x45\x97\x12\xf3\x3a\x69\xb2\xb1\x7d\xa5\x94\x17\x83\x90\x02\xcc\x0e\x62\x50\xee\x8c\xdb\x22\x38\x98\x91\xc6\xe1\x14\xb8\xdc\x00\x1a\x62\xad\xbc\x43\xac\x47\x19\x53\x2c\x02\x50\xd7\x5a\xca\xd1\xd1\x21\x4f\xec\xf4\x04\x92\xe6\x65\x25\x57\x59\x41\x35\x09\x5b\x55\xf7\xc9\x03\xd8\x9b\x9a\x13\x2b\x41\x19\x2e\x3d\xcb\x7f\x9d\x45\xee\xd1\xdc\xf6\xfa\x8d\x0d\x2e\x27\xb7\x9a\x30\x63\xc3\xab\x08\x02\xdf\x78\xab\xf8\xc7\xf8\xf8\x89\xa3\x61\x0d\xad\x76\x0e\xd6\x60\x24\x32\x3f\x40\xe0\x5a\x94\x8f\x05\xb1\x3e\x7a\xb1\x45\xae\xcd\x73\x23\x11\xcf\x1e\x15\x7e\x12\x94\x04\x57\x24\xc2\xce\x68\xb7\x4c\x4b\x8f\x13\xe5\x9b\xf1\x54\x46\x37\x62\x03\x2e\x6a\x1f\x11\xc3\x45\x41\xf2\xc8\xaf\x7e\xf3\x1d\x00\x39\x13\x99\x97\x77\x65\xe2\xd0\x9d\x88\x44\x15\xe2\xe4\xb2\xcf\x17\xe1\xaa\x42\xb4\x7a\x78\xd8\x46\x3a\xc7\xe1\x9e\x02\x1e\xdf\x90\x23\x18\xee\x59\xfa\x0e\x84\xf7\x63\x45\xe7\x98\x5e\xbd\x6a\x4a\x58\x7b\xb0\x76\xf0\x12\xc1\x81\x5c\x1e\x3f\x40\xb7\x47\x50\x2c\xdb\x83\x2b\xd7\x83\x88\x37\x23\xac\xd3\x69\xb7\x20\x54\xb0\x95\xb1\x00\xad\xf8\x06\x01\x5a\xb7\x36\x38\x98\xd9\xde\x78\x27\xe3\x6f\x6c\x9f\x6c\xec\x17\xa4\x80\x60\x6d\xbf\xa0\xe6\x3c\xc0\x41\xf2\x38\xae\x0e\x32\x52\xa1\xe6\xba\xd1\xae\xad\x21\xbc\x26\x4d\xac\xbe\xfc\xcd\xad\x75\x74\x9e\x76\x61\x04\x34\x9f\xae\xe5\x28\x80\x52\xe4\xdc\x7c\xae\x80\xf6\x28\x4b\xc5\x98\x5d\x0a\xe6\x8b\xc8\x56\x13\xe2\xe4\x43\x1f\x82\xd8\xfe\xb5\xc1\x89\xdc\x53\xe6\x34\x33\x83\x1e\x6c\xe3\x95\x56\xc4\x85\x96\x99\xaf\xd2\xc9\xbd\x65\xb5\x97\x56\xe5\xad\x21\x40\x8d\xb9\x28\x1d\x2d\x83\x97\xb1\x4b\xe4\xdd\x5e\x01\x3c\x4c\x9b\xa4\xa9\xeb\xc8\xa7\x05\x1c\xfc\x9e\x73\xc1\x6e\x3b\xb3\xdf\x7a\xa2\x02\xec\x26\x8c\x70\x0e\x67\x2a\x64\x15\xf0\x40\x8a\xa6\x8d\x54\x02\xd0\xf8\x1a\xc8\x25\x1a\x5f\x61\x76\x34\xe0\x6a\x6b\x3c\x2f\x89\x4f\xff\xb2\x32\x9c\x80\x81\x3f\x10\xcd\x84\xf0\x5d\xb3\x63\xb2\xd5\x95\x7d\x59\xad\x98\x8b\x60\x93\xd5\x85\x13\x7b\x0a\x2b\xd3\x59\xe2\x07\x71\xdd\xae\x30\x83\x08\xdd\xbf\xc9\xfe\x1f\xbc\x9a\xed\x74\xf1\x0f\x57\xff\x78\xaa\x8c\xd1\xdb\x55\x7e\xf0\xc1\xc0\xd3\xe1\xe0\xec\xb7\x70\x0c\x9f\xf1\xff\xce\xdf\x0c\x5f\x37\xfc\xbf\x37\xc3\x37\x67\x7f\xf8\x7f\xbf\xc7\x0f\xcd\xbe\x1c\xd1\xec\x13\x9d\x8a\x3d\x54\x20\x21\x40\x7f\x0e\xcf\xbe\x36\xf5\xef\xac\x52\xeb\x5c\xcb\xd1\x56\x57\xd9\x5a\xb1\x4e\x05\xfe\xb6\x2f\x55\x2d\xcb\x9d\x2e\xfe\x9a\x7e\x1d\xfc\x55\x3d\xa8\x41\xa1\x6b\x79\xd2\xe3\x27\x03\x1f\x70\xbf\xa9\x6b\xd4\xc9\xa3\xf0\x54\xe0\x4a\xfe\xef\x41\x1a\xe4\xae\xd8\x83\x44\x93\x3d\x61\x73\xbd\xa9\x5f\xdd\xed\x72\xc0\xfa\xff\x37\x47\x22\x71\x8e\x47\xdf\x49\xef\xe3\xcd\xf5\x79\xaf\x1f\xea\x87\x85\x09\xbb\xca\x53\x6c\x03\x7e\xae\x19\x28\x45\x23\x0e\xfe\x73\x9d\x15\x5f\x5d\x4e\x25\xec\x1d\x2a\x60\x20\x9e\xc0\xda\x8a\x87\x42\x6d\x03\xd0\xb2\x0c\x28\x7d\xa0\xe4\xf1\xab\xbb\x27\x56\x28\x0f\x0e\xb4\x40\xc0\x05\x5e\x16\x7c\x46\x41\xb0\xd5\x9e\x9e\x7b\x3a\x6c\x8e\x29\xe5\xda\xfe\x11\xc5\xbf\xfd\x18\xb2\x2a\x04\xa4\xfa\xd8\x83\x63\x61\x60\x9a\x59\x7b\x26\xa3\x69\x14\x0b\xcc\x42\x54\xb5\xdd\x61\x64\x5e\x27\x61\x72\xe8\x98\xbb\x16\xfc\x6a\x01\x42\xb5\x34\xc3\x64\xaa\x4f\x63\x35\x97\x0a\x55\x70\xf8\x43\x89\x28\x9c\x4f\xcf\xcf\xce\xde\x9c\x9e\x7d\x7f\x7a\xf6\x27\x98\x5a\x79\xd2\xbb\x62\xb2\xca\x34\x58\xc5\x9f\xf1\xe3\xc8\x2a\x73\x24\xd2\x8b\xfa\xbb\x40\x9f\xd2\x60\xab\x89\x56\xdf\x53\xcf\xf7\x24\x3b\xf6\x56\xef\xa8\x86\xed\x0c\x13\xe3\x32\xb7\x53\xd4\xe4\x97\x7c\xee\x7d\x11\xf9\x48\x57\xae\x9c\xc1\xd7\x54\x46\x40\xf7\x9b\x3e\xc8\x47\x1d\xb3\xcf\xe0\x74\x0c\xec\x12\xb0\xc6\x5e\x22\x33\xa8\xac\x28\x1f\xdd\x55\x48\x09\x76\x0f\xe9\x66\xea\x59\xfb\xc5\xef\x0c\x2e\xb1\x68\x01\xd8\x36\xed\xb3\x3c\x6d\x50\x5e\x63\x1d\x25\x73\x4c\x23\x18\x26\xd4\x45\xf1\x95\xd1\x6b\x87\x37\xa7\xd5\x82\xd5\xe5\x20\x78\x4f\xee\x88\x1f\x3b\x90\x82\x09\x3f\x7c\xaf\x02\x78\x6b\xf0\x39\xb7\xc7\x2f\x73\x65\xcc\x4e\xd5\xf7\x7e\xad\xf7\x9d\x8d\xe5\x09\xc5\x54\xea\xd0\x51\xdc\x3d\x64\x16\x84\x97\x15\xfa\x91\x77\x17\x31\x8b\x98\x3a\x63\x64\x19\xef\x5d\xfb\xc6\x27\xe7\x31\xc3\xb5\x65\x1f\xe6\x8f\x80\xb4\x5d\x67\xe2\x73\x03\x98\x84\x08\x42\x0e\xf7\x65\x9e\xea\xea\xd7\x85\xee\x07\xaf\x2e\xaf\x27\x8b\x9b\xe0\xd2\x3f\xff\x6d\x2e\xfd\xe0\xe7\xb9\xf8\xef\xf9\xf0\xbc\x99\xff\x7b\xf3\xc7\xfd\xff\xfb\xfc\x2c\xf6\xdb\xad\xaa\x0e\x6f\x29\xc6\xcb\xa4\xfb\x99\x89\xd3\x7b\xa8\xb9\xb8\x06\xa6\xfe\x28\x10\xc5\xa1\x13\xda\x34\xc7\x28\x90\x9e\xbc\xba\xfd\x9d\xac\x4c\x4c\x5c\x64\xbf\xf8\xc1\xb6\xc3\x21\xb6\x3f\x94\xfb\x22\x85\x8b\xeb\x1d\xe4\xd8\x21\xe2\xf0\x71\x7a\x7b\xfa\xf1\xe6\x7a\xd0\xee\x44\x68\x53\xb0\x38\x42\xb9\xd3\x8e\x10\x81\xc1\x90\x7b\xa3\x37\xfb\x1c\x55\x81\x18\x2f\x10\x60\x04\xbe\xbc\x73\x79\x4d\x10\xef\x0d\x8c\x78\xc7\xa1\x66\x3b\xda\x00\x11\x34\xc4\xb3\x3b\x61\x04\x5e\x65\xf1\x89\x11\xda\x30\x09\x7d\x6a\x9d\xe3\xdc\x0c\x04\xe0\xe7\xa8\x78\x85\x30\x42\x6b\x9d\x3d\x00\xc4\x36\xc4\x89\x3c\xf1\xd0\x20\x4e\x53\x07\xc3\xf6\xce\x1e\x49\x45\x59\x27\xa0\x4d\xe9\x04\xd2\x8e\x4d\x03\x5a\x7b\x89\xfc\x7e\x28\x3f\x54\xaa\xf8\x9a\x67\x85\x5c\xd4\x95\xd6\x75\x22\x3f\x64\x9b\xfa\x5e\x7e\xc8\xcb\xb2\x4a\xe4\xfb\xd2\xd4\xf6\xe3\x9f\x47\xf2\xec\x7c\x38\x3c\x3b\x1d\x5e\x9c\x0d\x13\x79\xbb\x18\x0d\x84\x98\x96\x50\xdc\x86\x75\x0d\xee\x60\x83\xb8\xca\x74\xb6\x24\xfb\x65\x6f\xbc\xa8\x08\x47\x9c\xf7\x10\x57\x83\x33\x8c\x50\x3c\x4e\x95\x54\xee\xd4\xfa\x2b\x94\xbf\xc0\xb5\xc1\x3a\x23\xf6\xa3\x08\x12\x05\xef\x95\x7c\x60\x60\x26\x87\x82\x2f\xeb\xe1\x01\x91\xbb\x39\x6c\x57\x65\x6e\xdc\xf3\xbf\x63\x32\x65\xff\x60\x8c\xb0\x03\x8e\x48\x8e\x6e\x26\xc8\xea\xe5\x6e\x9e\xd5\x41\x6e\x43\x39\x60\x50\x46\xb8\xce\xcc\xae\xc1\x1f\x60\xe4\x49\xa1\xb6\x9a\x34\x71\xdd\xc3\x2f\x67\x9f\x3f\xcf\xa6\xa7\xd8\xde\xe0\x7f\x4e\x6f\x17\xe3\x79\x22\xff\x71\xfc\xe5\xe7\xd9\xfc\x2a\x91\x97\xd7\xb3\x45\x22\x3f\xce\x47\x5f\x12\x39\xfe\xf3\xb2\x9f\xc8\x6c\xa0\x07\x74\xb1\x58\xef\xbe\xf8\xae\x96\x10\x23\x2b\x79\xa4\x98\xac\x1e\x2f\xf6\x47\x58\x45\x4c\x74\x4b\x43\xfa\x92\x86\x0f\xe4\xac\x92\xab\xff\xa0\xc3\x48\x05\x33\x5b\xdf\x15\x54\x7b\xc6\x11\x64\x1c\x4f\x12\xf6\xaf\x73\xf1\xb9\x70\x94\x53\xf4\x81\x2d\x17\x7a\x54\x1c\x7a\xf9\x78\x73\x0d\x11\x17\x55\x67\x01\x01\xab\x47\xa7\xf1\xd4\xc8\xbb\x4a\x5b\x03\x04\x18\xee\xb0\x5a\xf5\xe8\xa0\x34\x56\xc3\xb1\x75\xd0\x29\x85\xa6\x99\x82\xe8\x8e\xe8\xa4\x61\x38\x62\x6e\x1d\x98\xab\x88\x5b\xfc\x9b\x9a\x47\x04\x2b\xf1\xd6\x46\x69\xb3\xba\x09\x5b\x80\x4a\xcd\x5e\xaf\xd7\xa3\x8a\x74\xf0\x8c\xec\xff\x4b\x2f\xd5\x47\x27\xde\xcd\xb5\xaf\xa2\xc3\x64\x5b\x56\xb9\x90\x18\x19\x71\x30\x2e\xde\x34\x67\x78\x7e\x96\x53\x96\x63\x6b\xdf\x1b\x24\x39\xb9\xdf\x76\x11\xdd\x4c\xae\xc7\xa7\x1f\x26\xd7\x63\x90\x6b\x76\xb2\x06\xa6\xa3\x2f\x06\x9a\x1c\x10\x65\xb8\x66\xd3\x29\x8e\x9c\x74\x6d\xaf\x61\xab\xb7\x65\x75\x90\xa0\x3b\x4c\x61\xef\x3b\x38\xc9\x6b\x3f\x24\xae\x4d\x8b\xd1\x4f\xe3\xc9\x74\xb2\xfc\x3c\xfe\x0c\x87\x9b\xbd\xdb\x54\xf8\x05\x98\x60\x08\xe9\xfa\xc3\xb2\xd9\x28\x74\x62\x62\x47\x84\x52\xb5\x98\xde\x85\x61\x71\x34\xd9\x06\xc3\xf2\x1b\x9f\xe8\x89\x6e\x9d\x9b\xeb\xc0\xab\x8e\x92\x0d\x74\x0a\xcb\x53\xb9\xab\xf4\x3a\x33\xbc\x67\x21\xaf\x8a\x7f\x62\x9b\x00\xda\x60\x7b\xc2\x4c\x05\xe8\x57\x40\xc1\x42\x38\x3e\xa7\x49\xf8\x9a\xb2\x31\xd9\xdc\xae\x78\x6a\x68\x81\x43\xa6\xee\xc8\x63\x4f\x1a\x41\x5f\xc7\xe7\x6f\x37\x79\x24\xc4\x57\x77\x8c\xa6\x35\x50\xd4\xaa\x7c\xd0\x54\xbe\xaf\xb8\xbf\x91\x66\x37\xf1\xae\x1f\x6d\x03\xe7\x2c\x20\xe6\xfa\xa1\xac\x74\x76\x57\x40\xd8\x0f\xf6\x93\xf7\x94\x20\x2e\x50\x7c\xe5\x03\x06\xc7\x11\x38\x0c\x15\x96\xf9\xd5\x25\xfd\x92\xa9\x8b\x29\x14\x01\x5f\x83\x78\x2c\x5e\x95\xfa\x17\xbd\xdd\xd5\x4e\x2c\x33\xba\x93\x07\x72\x62\xb7\x0d\xa5\x05\x40\x27\xe5\x5e\x17\x91\x9d\xc5\x9c\x65\xbe\x15\x09\x46\xf6\x57\xc7\x10\xa4\x60\xbb\xfd\x7b\x5b\xc2\xff\x39\x7f\x06\xaf\x16\x93\x05\x08\x40\x9f\xff\xdd\x30\x40\x4f\xfb\x7f\x17\x67\x67\x6f\x9a\xf1\xdf\x8b\xb3\xf3\x3f\xf4\x9f\x7f\x97\x1f\x21\x16\xb7\x53\x39\x99\x5e\xdd\x2e\x96\xf3\x2f\x12\x08\x7d\x46\xf3\xab\xc5\x13\x5a\xd0\xe7\x04\xb5\x39\x93\x57\xe3\x0f\xf6\xce\x01\x52\x4f\xc0\xc0\x07\x15\xb8\xb7\x46\x93\xc4\x57\x4c\xad\x11\x66\xd9\x29\xd6\xd9\xe2\x94\x11\xde\x9e\xa8\x4b\xa9\x1a\x64\x51\xc3\xc1\x39\x56\xc2\x50\xda\x93\x5b\xe6\x35\xe5\x42\x4d\xd2\x2e\xae\x42\x57\x90\x26\xba\x99\x59\xb0\x80\xce\xe7\x5b\x82\xb7\x91\xa0\xe9\xd8\x4b\xa5\x5c\x85\xdd\xfb\xac\xd7\xf7\xaa\xc8\xcc\xd6\x49\x57\x6e\xdd\x6f\xf0\x2e\x86\x4a\x33\xc0\x35\x71\x61\x77\x90\x40\x0b\x45\x42\x89\xb5\xb1\x3e\x38\xec\x78\xa0\xcf\x52\x57\xaa\x30\x1b\xb4\xae\x52\x55\x2b\x27\x63\x33\x1c\xbc\x96\x63\x1f\x71\xc3\x56\x34\x38\x26\x43\xf9\x4d\x4f\xde\x13\x0b\x47\x0c\x07\xdf\xcb\x89\x13\x24\x81\x56\xe9\x2a\x18\xe2\x58\x90\x8e\x84\xe8\x02\x69\x42\xa4\x14\xe6\x47\x08\xff\x08\xea\x72\x28\x92\x41\x94\x1d\x44\x98\x0e\xb6\x8d\x53\xf6\x21\x45\xce\x90\x21\xff\x29\x51\xd0\x06\x35\xd1\x6f\xa6\x0a\xca\x83\xfb\xc6\x79\xcf\x3c\x14\x99\x2f\x8c\x21\xa5\x43\xfc\x44\x30\xfc\xf7\xea\x81\x97\xb9\x2b\x49\x06\xa4\x40\x72\xac\xf6\xb2\xc4\xc2\xcb\x44\xb0\x8c\x1d\x45\x84\x81\xbb\x84\x56\x34\xcb\xc5\x20\xe6\x20\x12\xc3\x86\x25\xc6\x4a\xca\x24\x22\x2b\xac\xe5\x42\x5f\xf5\x9c\xed\x0f\xfa\xe0\xb8\xd8\x49\x83\xb0\xb1\x25\x48\x81\xf0\x79\x59\xd1\x40\xea\xb4\xac\x44\x24\x73\x4a\x86\x78\x07\x77\x14\xd1\x1b\x57\xfa\x21\x2b\xf7\xa6\x21\xcd\x24\x47\xd1\x2f\x44\x66\xde\x0a\x31\xc2\x6a\xc3\x67\x5b\xf3\xb4\xc8\x69\x4c\x0c\x48\x25\x9c\x1d\x4d\x10\xe2\x3d\xbe\xcf\x09\x9f\x1e\x57\x30\xed\xec\xde\xd1\xe7\x0e\x07\xc3\xb3\x26\x39\x35\x8c\x75\x43\x3e\xc6\xa9\xa9\xba\x43\x62\xed\xf9\x53\xb2\x80\x2b\x47\x7c\xe3\xce\xb2\x5b\xb4\xad\xd5\x3c\x1c\x32\x3c\xec\x12\x81\x7d\x7e\x01\x84\x18\x94\x13\xd3\x4f\x50\x7d\x9a\x05\x3d\xba\x34\xa8\x3d\xec\xa1\x43\xdd\x58\x6e\x75\x7d\x5f\xa2\x5c\xd8\x5a\x1b\xca\xa0\xa8\xdd\x4e\x55\xaa\xde\x1b\x02\x16\x26\x74\x5c\x11\x00\x24\xdc\x5c\x2c\x85\x42\x87\xf2\xf0\x3c\xea\xba\x3f\xaa\x76\xe0\x9e\x55\x68\x99\x6e\xbb\x67\xca\xab\x88\x8a\x6f\x52\x11\x95\x4f\xaa\x88\x8a\xa7\x54\x44\xed\x8e\x8d\x85\x44\xe5\x4b\x84\x44\x05\x0a\x89\xfa\x33\x3e\x38\x9d\x86\x17\x72\x51\xab\x22\x55\x55\x6a\x82\x01\x30\xee\x77\xc1\x01\x1d\xc8\xa7\xbd\xc7\xf1\x7b\x0d\x18\x8a\x13\x12\x34\xec\xff\x6d\xe2\xa3\x09\xa5\x22\xa3\xf2\xe9\xe0\x08\xe2\x83\x36\x69\xf1\x7e\x29\x26\x06\x38\xc2\xbf\x2f\x33\x63\xf6\x6d\x91\xbc\xc1\xb0\x5b\xe2\xd4\xf6\x89\x53\x4e\xc2\xcb\x9a\xca\xbf\x59\xd6\xd4\xfa\xee\xf8\x4a\x82\x63\xf8\x7b\xc3\x4f\x76\xe2\x69\x95\x8f\xcb\x9d\x8a\x17\xc8\x9d\xca\x17\xc9\x9d\x8a\x97\xcb\x9d\x02\xe2\xa4\x04\x66\x62\x55\x74\x09\x9f\x8a\x6f\x16\x3c\x95\x2d\xc1\x53\x00\xfb\x9e\xb1\x2d\x09\x24\xde\xce\xa0\x04\x62\x34\x6f\x22\x04\x56\x06\x82\x83\xbb\xff\xd6\x52\x36\x95\x4a\x3c\x2d\x45\xda\xa1\x44\x1a\xe7\xd6\x02\x5d\x72\xaf\x5c\x24\x9c\x72\x11\x9e\x43\x6f\x79\x97\x41\xba\xff\x44\xf5\x09\x84\xfa\x94\xd8\xd1\x49\x60\x5d\xd1\xf1\x15\x42\xfd\xfa\xc1\x61\x66\x27\xae\xdd\xd9\xa7\xe5\xa8\x1a\x3a\x48\x3e\x3d\x2b\x3a\xd2\xcf\xf1\x71\x77\xd2\x61\x19\xf5\x9b\x8a\xa7\x4d\xf5\x23\x56\xd5\x0f\x6b\xc0\x02\xbb\x2c\x10\xab\xc2\xb1\xb9\x21\x24\x22\x5d\x24\x2d\xf4\x21\x9e\xb7\x09\x61\xc1\x80\x18\x9c\xb4\xe5\x36\x4d\xb5\xd1\x0e\x58\x2f\x8e\xcc\xce\xae\x74\x90\x6e\x43\x80\x2f\xc8\x50\x35\x40\xbe\xc4\xeb\xd0\x09\xee\x7d\xe1\xd0\x0c\x90\x71\xae\xee\x50\x44\x73\x4c\x34\x81\xa6\xe3\x09\xd1\x24\x81\x6a\x7a\xa5\x5b\xda\xbb\x28\xf9\xd7\x9e\xef\x4d\x56\x99\x18\xb1\xff\x9c\x1c\x88\x68\xd8\xa9\x27\x69\x8b\x1e\x23\x6a\x98\x6d\xd0\xaa\x7c\x80\xad\xd1\xc4\x7b\x66\xae\x4f\x6f\xe5\xb0\x2f\x90\x5a\x8c\x83\x4b\xa0\x9e\xaa\x01\xb7\xd8\xcd\x03\xfa\x4e\x9e\xf7\xa5\xd1\x70\x7b\x77\x7c\x46\xe0\x67\xca\x4a\x5e\xf4\x91\x60\x27\xc0\xac\x19\x3c\xf1\xec\xca\x78\x2b\x33\x1c\xe7\xf0\x1a\xee\x16\x1c\xb5\x0f\xa1\x0f\x3f\xe7\xf0\x85\x40\x9b\x18\xb7\xfd\x90\xad\xb5\x09\x2d\x95\x36\x71\x5b\x97\x60\xe8\x85\xf5\x7e\x27\x8b\xe5\x7c\xf2\xfe\x16\x29\x8b\xdf\x5f\x4f\x3e\x8e\xc8\x15\xbe\x18\x0c\x59\x29\x8d\x9b\x14\xf1\x3e\x84\x76\x4a\x20\xe0\xd2\x96\x2a\x59\x69\x11\x46\xcc\x22\x84\xe9\x31\xb1\xaf\x8e\x2b\xb4\xc5\xcc\xe3\x52\x11\xad\x4b\x34\xd0\xc5\x45\x75\xd3\xa7\x44\x79\x45\x87\x28\x6f\xd3\x04\x8d\x65\x77\x07\x4f\x49\xee\x0a\x8f\xc2\x2e\xd1\x47\xed\x1a\x28\xaf\xbc\xdb\xa0\x73\xa9\x3d\xa3\x86\x3d\x51\x8f\x29\xe3\xb4\x54\x79\x65\x53\x94\x97\x34\x13\x73\x9f\x7c\x15\xf6\x7a\xdb\x06\xcc\x36\x5d\xf1\x07\xb4\x20\xd0\x2d\xb1\x43\xbb\x63\xfd\x29\xa0\xb2\x09\xd8\x6f\x7d\xca\x95\x06\x1e\x57\x45\x83\xd1\x15\xec\x93\x2f\xae\x76\x83\xf5\x4b\x03\x0a\xcf\x3c\x17\xa1\xee\x1a\xd0\x8c\xd9\x73\x9b\xce\x57\x6f\x0a\x02\xeb\x85\xe7\x36\x2c\x0b\x2d\xef\xf7\x45\x6a\x4d\xe2\xfa\x51\x17\xf5\x41\x9e\x0c\xcf\xcf\xfa\x02\x18\x3d\x89\x20\x00\xf3\xcb\xd9\xee\x58\x77\x81\xc3\xb9\x76\x3c\x9e\x0e\xb4\x14\x8b\xa3\x11\x06\x7f\xab\x75\x8d\xa6\x41\xd8\xe0\x06\xf9\x25\x6b\x45\x91\xb7\x78\x92\xf5\x61\x0d\xd8\x3d\x8a\x96\xaf\x3b\x54\x7c\xcf\x76\x55\x59\x97\xeb\x32\x0f\xe0\x55\xf0\xa9\x36\x41\x7b\x5b\xcf\x0f\xa9\x33\x82\x94\xe5\x4b\xbe\x04\x76\x94\x3d\x76\x3a\x9e\x17\xeb\xea\x12\xd2\x9a\x60\x61\xa8\xd5\xcb\x8a\x60\xae\x4f\x24\xef\xdd\xdd\x02\xd1\xa2\xb1\x88\xe3\x62\x2d\x31\x4d\x7f\x34\x40\x26\x85\x20\x81\x51\x7d\x17\xec\x2c\xb6\x92\x10\xe3\x01\xcc\x0c\x9e\xc2\x26\xb3\x16\xcc\xc9\xc5\x59\xdf\x11\xbc\xe2\x22\x86\xbb\x09\x39\x07\x75\xbc\x21\xda\x43\x11\xaa\xd3\xa1\xe6\xea\xf3\x4b\xc5\x97\x29\xc9\x70\xd5\xd4\x0d\x75\x41\xb7\xca\x1b\xf7\x6e\xb0\x98\x44\x83\xeb\x36\x5e\x32\xc7\x1e\x16\x7a\x43\x48\xce\x47\x4e\xf3\x14\xeb\x0a\x02\xfd\xb7\x6f\xd3\xa3\x16\xed\x53\x11\xb0\x66\xac\xc7\xe1\xe3\x3d\xb8\x0b\x68\xa7\xf8\xc7\x86\xd8\x6f\x11\xad\x30\x28\x4e\x47\x0c\x20\x10\x38\x73\xd0\x05\x92\x61\x45\xfb\x18\x8f\x1f\x2c\x14\x92\xd9\x80\xc6\x33\xfc\x89\x48\x41\x73\xfd\x60\x2d\x70\x74\x3e\xca\xea\xd0\x27\xa9\x59\x85\x09\x34\xc4\x0b\x00\x23\xe9\x57\x48\xdd\x95\x22\x2f\xcb\xaf\x68\x72\xc1\x63\xe8\x1d\xd0\x4d\x7f\x84\xa5\xa4\xea\x87\x7e\x47\x38\xfb\x27\xa6\xef\xa8\xeb\x54\x4a\xfa\x23\x85\x5d\xc3\xd0\xa2\xf0\xf8\xa1\x88\x19\x75\x22\x62\x0a\xf6\x41\x43\xd7\x73\x01\xe9\xe9\x70\xbe\x1a\xd4\xa6\xc5\xa1\x21\x13\xcf\xc1\xd6\x70\x9c\xa1\xf7\x02\x4d\x20\x7c\x5f\xc7\xf5\x51\x56\x81\x27\x44\xbf\x0b\x69\xad\xd8\xdc\xa3\x50\xcb\xdf\x20\xd6\x28\xdb\x62\x8d\xe2\xa8\x58\xa3\xd3\x52\x94\x1d\x5a\x8a\x30\xce\xb1\xaa\xbb\xf8\x35\xba\x8a\xdd\xba\x89\xa2\xee\x72\xe1\x06\x0d\x0d\xd1\xac\x96\x6a\x05\xf4\x60\x76\x2d\xa1\xa4\x11\xb2\xc9\xf3\x69\xf9\x6b\x54\x2a\xed\xd6\x8a\x25\x16\x65\x2c\xb1\x28\x8e\x4a\x2c\xca\xce\x66\x3b\x52\xbf\xb6\xb0\xa2\x58\x1d\xfb\x4e\x40\xb2\x6b\x87\xf7\xa9\x19\x8c\x3a\x22\xbc\xbe\x39\x74\x02\x8e\xa4\x8b\x38\xd5\x50\x6e\xc2\x40\x3f\x6b\x31\x7a\x03\x2b\x70\x00\xe3\xe4\x4a\x16\x46\x8f\x60\x38\x68\xad\x3b\x91\x6c\x06\xa5\x46\x47\xa5\x97\xad\x37\xf2\x02\x35\x8a\xe1\x9c\x04\x97\x0c\x38\x9c\xb7\x48\x73\xca\x50\xdc\x56\xc2\x85\xe8\xc8\xbd\x4d\x49\x9b\x98\xd4\xb3\x85\xbb\x18\x8e\xd8\xc7\x6d\xb3\xfe\x5b\xa4\xb4\xd1\xc8\xa2\x57\x72\x3e\x7a\x5d\x16\x66\x97\xad\xf7\xe5\xde\xe4\x5c\xa6\xc5\x94\x50\x87\xf0\xa4\x8c\xc6\xac\xac\xb8\x89\x2c\x62\x99\x74\x2b\x83\x23\x10\x21\xb7\x7f\xa9\x54\x2e\x59\x51\xeb\xb9\xa3\x24\x66\xc3\x6b\x74\xba\x6b\x86\x61\xa7\x75\x4f\xea\x43\x20\xd2\xd9\xb1\xdd\x5d\xa0\xda\x9d\x5d\x22\x2a\x94\xf2\xf5\x60\xfc\xfd\xf5\x7d\x09\x0e\x37\x1a\xa8\xa1\x68\x23\x2e\x5a\xcf\xf7\x4f\x65\xa7\x21\x87\x65\x8c\x2d\x61\x4a\xb5\x6e\x22\xac\x63\xc9\x18\xba\x53\x1a\x01\x8e\x67\x7a\xcf\xbd\xf1\xad\xe3\x60\xc9\x8b\x4e\xa3\x3a\xa8\x10\xc5\x8e\xe3\x83\x02\x88\x84\x23\x64\x6b\x89\xbb\xf2\xc9\x43\x0c\x32\x4f\x9c\x8a\x8d\x33\x49\xfc\xfa\x33\xa9\xf1\x22\x71\xf4\x4c\x72\xa7\x6c\xd7\x91\xf3\xfa\x57\x2b\x57\xc7\x47\x4e\xb3\xce\xe5\x6f\x91\xae\x16\xe1\x3b\x8f\x49\x57\x93\x19\xb2\x56\xe6\x37\xd5\xac\x6e\xe6\x4b\xa4\x94\xaf\x07\x67\xb1\xf6\xcf\xe5\xec\xf3\xcd\xf5\x17\x79\x75\x3b\xb6\xff\xb7\x58\x8e\x96\xb7\xcb\x31\x2a\x09\x7d\xbc\xbd\x86\x10\x81\x10\xce\xfc\x03\xcf\x17\x8d\xbf\x0d\x46\xde\x3b\x94\x1a\x9a\x41\xf3\x0e\x27\x3c\xe0\x59\x04\x90\x1e\x41\x95\x3a\x4f\x4d\xb2\x18\xed\xb1\x0b\xe2\xea\xc0\xc8\x6e\x17\x49\x59\x41\xe4\x3e\x66\xd7\x8d\x2c\x49\xd4\xb7\x6b\x1a\xd7\xdd\xed\x7a\x3a\xb7\xf9\xce\x45\xc8\xdc\x41\x88\xe1\x35\x4f\x21\xc0\xac\x8e\x76\xc9\x08\x40\x2f\x2a\x62\x81\x5d\xa0\x13\xe5\x31\x54\x7c\x9e\x87\x27\xb8\xfd\xea\xf5\xf8\xe3\xe8\x9a\xec\xe4\x30\x51\xc6\x11\x8f\x0b\x62\xdd\x6f\x7d\xdf\xe5\x2b\x42\xf4\x82\xe9\x08\x70\x0c\x04\x09\x90\xc7\xe0\x49\xa6\x9c\xc5\xf5\x4d\x43\x1d\x8f\x6c\xc2\xbe\xa0\xeb\x86\xe0\x66\x98\xfd\x66\x93\xad\x33\x4c\xe5\x22\xe6\x9b\x56\xa1\xf2\xd7\x85\x6d\x0c\xb0\x95\xab\xea\x20\xcd\x57\x10\x0a\x81\x5a\x20\x08\x7f\xd4\x54\xd1\x0b\x61\x40\x99\xd5\xb8\x5a\xbf\x1f\x9c\x01\x8b\xde\xe4\xd2\x29\x6d\x85\xa2\x56\x84\xc0\x76\x9b\x00\xa9\x2a\x71\x45\x62\x59\x8f\x2b\x24\xea\x8a\xcd\xdb\xdd\x58\xd7\x6a\x7d\x8f\x32\x4c\xa2\xcb\x33\x22\xf3\x96\xaf\xcb\x86\x7f\x1b\x79\x64\x7e\x92\x86\xd8\xfa\x1f\x06\x67\xf2\xa7\xf1\x7c\xc1\x22\xab\xcb\x4f\x41\x3e\xe1\x87\xc1\x50\x4e\xf5\x63\x60\x09\x2d\xf6\xc5\x4b\x45\xa8\x1b\xb4\x8a\xe2\x6f\xd3\xa0\x96\x0d\x0d\x6a\xdb\xb8\x50\x12\x24\x6e\xe6\x37\x09\x54\x8b\xb6\x40\x75\xa3\xed\xde\x64\x57\xf9\xa3\xf5\xe0\x8f\xc9\x54\x8b\xfa\xa8\x4c\xb5\xfc\x15\x32\xd5\xf1\xe3\x62\x99\xea\x23\x4d\x8d\x8b\x3d\x16\xfb\x82\x35\xaa\x45\x88\x4b\xd9\x17\xac\x50\x2d\x5f\xaa\x50\xdd\x71\x4e\xbf\xc1\x88\x2d\x50\x46\x8e\xe7\x76\xf5\x38\x39\xd7\x27\x84\x92\x51\x91\x2d\xd6\x7d\x9b\x82\x74\xec\xc2\x7e\xee\xfd\x68\x31\x59\xb4\x49\x2d\xc5\x13\xa4\x96\x28\x7e\xdb\x21\x39\xdc\xc5\x53\x19\x70\x54\x0a\x2f\xb8\xdb\x6c\xed\x87\xf9\x18\x04\xd6\x48\x3c\x37\x09\xca\x50\xae\xc7\x40\x64\xd9\xaa\x3e\x11\x0d\x12\x4b\xe2\xb0\x9c\x4c\x3f\x82\x74\xb4\x1c\x4f\x97\x93\xf9\x58\xce\x27\x8b\x7f\xb4\x5d\x05\xed\xbb\x71\x24\x5a\x7c\x33\x9e\x83\xce\xee\xf4\x72\x2c\x68\x2b\xb6\x1a\x66\x7b\x24\xbf\xcc\x6e\x07\x72\xf1\x69\x76\x7b\x7d\x05\x83\x12\x7f\xca\x8e\xf4\x98\x5a\x3e\xf9\x69\x2c\x48\x57\x77\x3e\x5e\xdc\x8c\x2f\x97\x89\xfd\xb6\x3c\x99\xce\xb0\xe7\x00\x36\x1b\x5d\xcb\xab\xf1\x4f\xe3\xeb\xd9\xcd\x78\xde\x97\xa3\xc5\xe2\xf6\x33\x8a\xed\x5d\xce\x16\x4b\xa6\x13\x9d\x8e\x2f\xc7\x8b\xc5\x68\xfe\x45\x2c\xc6\xf3\x9f\x26\x97\x30\xc0\xf3\xf1\xcd\x68\x32\x47\xf1\x3f\x50\x10\x9e\xcc\xa6\x03\x9c\xdc\xee\x95\x01\x22\x81\xcb\x89\xbd\xc0\x17\x72\x34\x15\x81\xac\xdd\x68\xbe\x6c\x1e\x9e\xa0\x46\x7c\xeb\xb5\xee\x5a\xc3\xe1\x85\x86\xc5\xa7\xf1\x7c\x8c\x6b\x6b\xfc\xe7\xcb\xf1\xcd\x32\x5c\x68\xbe\x2d\xb8\x72\xff\x34\x38\x93\xcb\xf1\xfc\xf3\x64\x4a\xc6\xc3\x9f\x20\x73\xfa\xeb\x55\xa4\x62\xba\x0e\xf1\x84\x4a\x14\xee\x2d\x84\x07\xbd\x44\x16\x4a\x74\xc8\x42\x49\x27\x0b\x65\x9b\x88\x1f\x3f\xaa\x11\xd4\x30\x1b\x59\xe5\xad\x2d\x0f\xf4\x9c\x12\x50\xc3\x67\x78\x81\x12\x10\x91\x8f\x74\xea\x00\xb9\x83\xe6\x98\xce\x4d\xd4\x9c\x81\xfc\xd3\xe0\x3c\x0e\x8f\x87\x0a\x3b\x8e\x77\x8b\xee\x37\x98\x4f\xca\xca\xd9\xa7\xe8\x22\xc5\x38\x9b\xab\xff\x60\x9a\x6d\x23\x4f\x90\x46\xc2\x0e\xab\x33\x4c\xca\xca\x50\x18\xd9\xe8\x3c\xd7\x95\xe9\x0b\xaf\xae\x84\xd7\x08\x70\x47\x06\xa3\x47\x7e\x09\x79\x0f\xc1\x93\x82\x35\x03\x02\x4c\xe2\x49\x01\xa6\x3a\x94\xb6\x72\x84\xcf\xf2\x14\xce\xec\x49\x91\xee\x4d\x5d\x1d\x7c\xe8\x55\xc4\xec\xc9\x42\xf4\x96\x0d\xa0\x56\xc0\xd9\xd9\x26\x62\xee\x7e\x28\xd9\x62\xa2\x41\xc9\x2c\x87\x83\x73\xa4\x64\xa6\x3f\xf4\xdf\x41\xd4\x47\xfc\x0a\x46\xe6\x80\x77\x57\xf4\xf8\x66\x7c\x8e\x95\xf9\xae\xca\x52\x5d\xdc\x65\x85\x1e\x98\x7d\x81\x65\x04\x58\xcf\x4e\x0f\xbb\xaf\xb7\xb9\x7d\xe0\xe2\x65\xec\xca\x8d\x62\x46\x24\x57\xc6\x5b\x08\xa9\x95\xc5\xd3\xd4\xca\x94\x55\x61\x56\x95\xb2\x12\x82\x2a\x18\x7d\x05\xe2\xb7\x93\x15\x37\x69\xbf\x44\x17\x59\x31\xce\x73\x2b\x72\xf3\xb1\xca\x52\x39\xc6\x21\xe2\x0f\xb5\x8d\xca\x23\x71\x9f\xb7\x42\xd8\xf5\x80\xf4\x85\xac\x68\x3e\x29\xd6\xf0\x24\x47\x37\xce\x71\xe7\xd5\xe1\xad\xec\xfe\x38\x2c\xb4\x80\x95\xfc\xb2\x2f\xcf\xcf\xce\x86\xed\x4f\x0b\x7e\x78\x17\x2b\xb9\xfd\x7d\x10\xa4\x3e\x31\xfd\xb7\xf2\x7f\x3c\xfb\xd3\x13\x8e\x25\xfd\xbd\xdd\x34\x6e\x9f\x88\xe1\xe0\x8c\xf3\x0f\xb8\xef\x37\xa8\x33\x03\xdb\xc1\x7d\x0e\x23\x5a\xd5\xb3\x9f\x83\x90\x04\x59\x60\xa7\xbe\x46\x05\xd2\x5f\x95\x66\x95\x29\xa9\xea\xb7\xe1\x9c\x78\xd8\xd8\x40\x88\x73\xeb\x37\xb8\x94\x4e\xf4\x4e\x92\x32\xe8\xfe\xa3\xdc\xed\x2b\xb3\x57\x28\xb7\xc0\xe7\x1d\x44\x0f\xc3\x17\xdb\xd9\x3c\xb7\xe6\xbb\x82\x0b\xc3\x8b\x1e\x18\xa7\xef\x5e\x6e\x90\x63\x27\xf6\x17\x9e\x4a\x14\xb9\xb4\x0b\x75\x83\x72\x22\x8e\x67\x0a\x89\x7d\x08\x21\x08\x91\x03\xcc\x38\xb0\x5c\x7a\x30\x14\x89\xf0\xbb\x39\xe9\xdc\xd9\x24\xcf\x49\x3a\x3f\x05\xf6\x63\xed\xfb\xe1\x8a\x84\xf6\x06\x34\x18\xce\x01\xc3\xee\x4e\x1a\x84\xc8\xfc\x86\x9d\x35\x8e\xe1\x09\xea\xe8\xec\xe3\x93\x80\x99\xd1\xe3\xcd\xf2\x43\xe2\xea\xbc\x9a\xba\xd6\xed\x87\x42\x8a\x1b\x5b\xfd\xad\x44\x43\x7f\xfc\xfc\x7f\xf2\x67\xf0\xea\x9f\x75\x91\xfe\x1d\x48\x1f\x82\x9f\x67\xf8\x1f\x5e\xff\x70\xf1\x43\xab\xfe\xe7\xe2\xe2\x8f\xfa\x9f\xdf\xe3\xc7\x9e\xdd\x76\x05\xf0\xa1\xef\x82\x08\x8e\x94\x61\x70\x76\x76\x44\xb6\xe3\x1c\xbf\xb9\x64\x3d\xb2\x4c\x1b\x71\x5d\xa7\x68\xdc\xbb\x54\x06\x0b\x77\x08\x21\xe6\x3a\xaa\x05\x52\x68\xe8\x06\xdc\x7a\xf6\x37\x01\x0f\xa5\x49\x5a\x98\xc4\x48\xf1\x14\x64\x0c\x1d\x13\x5b\x9b\x40\x27\xa0\x72\x0a\x38\x36\x2b\x2d\xb7\xba\x7e\x6b\x6f\x59\x19\xb7\x08\x6c\xd0\x88\xea\x2a\x20\x24\x04\x78\x91\xb5\xd2\x03\x82\x02\x0c\x70\x25\x4c\x8c\x67\xa8\x88\x38\xe2\xf3\x8c\x1b\x92\x66\x06\x4e\x63\x88\x0a\x9d\xb7\x1b\x90\x15\xe1\x00\x70\x03\x98\xb7\xe8\xb7\x6e\x03\x87\x49\xa3\xa4\x95\x08\xd9\x50\xe5\x56\xd5\xba\xca\x54\x1e\x30\xea\x38\xbb\x38\xa2\x28\x14\xe2\x82\x52\x6c\xa8\x81\x6e\xd7\x06\xd1\x28\x07\x0b\xac\x87\x5d\x22\x55\xb8\xe3\xf2\xe3\xa2\x29\x3f\x1e\x64\x5a\x1c\x82\xcf\xab\x8a\x66\xf6\x9b\x9e\x9a\x0a\x3e\x7b\x64\x71\x7e\xb0\xab\xa9\xb2\x4b\xa6\x08\xbe\x92\xc8\x1d\x0a\x77\x40\x32\x6b\xed\xd2\x43\xff\xfd\xdf\x74\x91\x0e\xd6\xe5\x76\x20\xc4\xeb\x41\xfb\x99\x12\x9e\xf9\x8d\x51\xc6\xfc\xef\x13\x65\x84\x40\x22\xd7\xcc\xaf\x9f\x8e\x23\xca\xe3\x71\x44\x86\x49\x8b\xc3\xcb\xe2\x88\xcd\x14\x40\x47\x1c\x51\x1c\x8b\x23\x46\xad\xed\x78\x5a\x77\x18\x51\x34\x58\xba\xa2\x30\xe2\x91\x29\x9a\x12\x0e\xc2\x07\x16\xed\x07\x45\xfb\x83\xdf\x1a\x6b\xa4\x2e\x08\xe8\x02\x3b\x1c\x6d\x39\xf4\x81\x10\xdf\x77\x9e\x37\xae\x16\xef\xf1\x5e\xd5\xa6\x04\xb5\x87\xe6\xb9\xe3\xf7\xae\x5a\x7f\x2d\xca\xc7\x5c\xa7\x77\x76\xbf\xbe\xb5\x5e\x13\x52\xb7\x80\x01\x1b\x70\x6b\x45\xc7\x7a\x02\x48\xaf\xfc\x10\x64\xcb\x63\xe1\x20\x5e\xe5\x3d\x21\x7e\xc0\xf3\x5b\xa5\x0f\xba\xaa\xb1\xb0\xc3\x9f\x01\x5b\xb4\x67\x01\x67\xa7\x21\x70\xe2\x94\x3a\xd8\x7d\x77\xbb\x13\xf0\x37\x84\x53\x7f\xba\x17\xb2\xd7\xbc\x86\x88\x7f\x28\x6c\xb1\x38\xda\x62\x88\x9a\x2d\x66\x1f\x96\x3f\x8f\xe6\x71\xf8\xf6\xfd\x17\xf9\xcf\xe3\xe9\x95\x5c\x8e\x2f\x3f\x4d\x67\xd7\xb3\x8f\x93\xf1\x42\x5e\x2f\xaf\x06\xf2\x7f\xfe\x4f\xf0\x9d\xbf\xfb\x0e\x82\x99\xd6\x4d\x76\xf1\x59\xe1\xe3\xb3\xdd\x8a\x42\x89\x7c\x7f\xbb\x04\x5e\x1a\x08\xd5\x8e\xaf\xe4\x72\x96\x60\x80\xb2\xf5\x35\xd1\x96\x16\x82\x37\x3e\xab\x2e\x64\xbb\xe2\x22\x81\x57\x03\x39\x99\x8a\xe9\x4c\x8e\x7f\x1a\x4f\x97\x72\xf1\x69\x74\x7d\x7d\xac\x67\xef\xc7\xf2\x7a\x32\x7a\x7f\x3d\xc6\x67\x4f\xbf\xc8\xab\xc9\x1c\x62\xa9\x93\x29\xfd\x4b\x4c\xa6\x97\x93\xab\xf1\x74\x39\xba\x4e\xe4\xe2\x66\x7c\x39\xb1\xff\x18\xff\x79\xfc\xf9\xe6\x7a\x34\xff\x92\x60\x88\x74\xba\x18\xff\xd3\x2d\xc5\x3b\xaf\x46\x9f\x47\x1f\xc7\x0b\x79\xd2\x1e\x04\x11\x0e\xc2\xcd\x7c\x76\x79\x3b\x07\x29\x24\x39\xfb\x20\x17\xb7\xef\x29\x7e\x2a\x3f\xce\x66\x57\xa0\xe8\x84\x01\xd9\xf1\xe2\x9d\xbc\x9e\x2d\x20\x8d\x73\xbb\x18\x27\xf2\x6a\xb4\x1c\x25\x76\xe8\x6f\xe6\xb3\x0f\x93\xe5\xe2\x9d\xfd\xec\xfb\xdb\xc5\x04\x86\x69\x32\x5d\x8e\xe7\xf3\xdb\x9b\xe5\x64\x36\xed\xcb\x4f\xb3\x9f\xc7\x3f\x8d\xe7\xf2\x72\x74\xbb\x18\x5f\xc1\x78\xce\x30\x6e\xbc\xfc\x34\x9e\xcd\xbf\xc8\xd9\x07\x61\xc7\x80\x94\x9c\x7e\xfe\x34\x86\x08\xfc\x64\x6a\x7b\xb5\x9c\x8f\xec\x60\x2c\x96\xf3\xc9\xe5\x52\x06\x1f\x9b\xcd\xe5\x72\x36\x5f\x06\x7d\x94\xd3\xf1\xc7\xeb\xc9\xc7\x31\xc4\xb8\xe7\x72\x66\x9f\xf2\xf3\x64\x31\xee\xcb\xd1\x7c\xb2\xb0\x1f\xa0\x70\xf5\xcf\xa3\x2f\x72\x76\xbb\xe4\x9c\x14\x05\x81\xa3\x75\x99\xc0\xdc\xc9\xc9\x07\x31\xba\xfa\x69\x02\x69\x00\xfc\xf0\xcd\x6c\xb1\x98\xd0\xca\x80\x21\xbb\xfc\x44\xc3\xfd\x7b\x78\x58\x83\x57\x1f\x6f\xae\x4f\x2f\x06\x67\xa7\x44\x02\x71\x8a\xf6\xcf\x6f\x29\x09\xf5\xbc\xfe\x53\x8b\xff\xf5\xf5\x0f\xdf\xff\x61\xff\xff\x1e\x3f\x41\x50\x27\xb0\x9f\x88\x33\x11\x59\x5c\x9c\x7d\x70\xe1\x88\x5e\xde\x00\x82\x21\x20\x4b\x84\x93\xff\x06\x89\x55\x9c\x88\x05\x5f\xee\x48\x86\xb2\x3a\x38\x9e\x11\xa4\x67\x21\xa4\x08\x8b\x32\xfd\x0b\x44\x5f\xca\x0d\x93\x9b\xfe\x05\x4a\x71\x14\x59\xfc\x3a\x8d\xcd\x14\x55\xf3\xe7\xfa\x49\x58\xd8\x8b\xbc\x2c\x1d\xc4\x41\x70\xd7\x36\xdf\xf1\x9d\xe3\xb8\xfc\x8b\x4c\x02\x93\xa2\xac\x7c\x38\x9a\x7a\x15\x70\xbb\xab\xce\x31\xc3\xfa\xcd\x07\x7d\xa0\xe0\x0c\xe3\xd1\x6d\xef\x07\xf2\xb2\xac\x2a\x6d\x76\x25\x95\xe4\x38\xc0\x1d\xa9\x1f\x98\x10\x81\xb7\x71\xf0\x95\xa0\xac\x05\x23\xef\x8c\x9d\xab\x1b\x94\x3a\x1c\xb1\xc5\xee\x77\xf4\xf4\x2f\x68\x6b\x33\xc9\x97\x22\xee\x1a\xa7\x53\xe0\x67\xea\x8f\xb8\xce\x7f\xa6\x9f\xc1\xab\xf9\x7e\x75\xf8\xbb\xca\x3f\x3d\x1b\xff\x69\xf3\xbf\x9c\x7f\xff\xfd\x1f\xf1\x9f\xdf\xe5\x07\xa2\x20\x9c\xd3\xa2\x22\x95\x14\x1c\x4e\xa9\x1e\xd5\xc1\x1e\xba\x2b\x55\x67\x5b\x52\x8c\xf6\x4a\x03\xd1\x79\x55\x07\x24\x26\xa2\x43\x01\xb0\x09\xfc\x04\x29\x03\x07\xca\x0f\x80\x6a\x4e\x11\xc9\xc5\x37\x04\xcb\x3a\x40\xba\xc2\x95\xd6\x07\x41\x0c\xcc\x4f\xf8\x4e\xe0\x8d\x04\xf1\xec\x30\x37\x17\x8a\x23\xd8\xdb\xe9\x11\xaa\x67\x9b\xcd\x12\x69\x69\x5d\xa3\x5c\x2b\x53\xcb\xd9\x74\xec\xc8\xdf\xd8\x77\x79\x2b\x84\xea\x93\x16\x35\xbc\x23\xe6\x0b\x20\x87\x8d\xa8\x36\xaf\x4a\x48\x27\x37\x49\x6f\xe0\xfc\xde\x02\xa5\x66\x7e\x10\x23\xf6\x70\x08\x10\x66\x7d\xf6\x83\xdc\x95\xe0\xeb\x4b\xa3\xb2\x54\xb6\x38\x09\x6e\x8d\x2e\x34\xe9\xe4\x4b\xfd\xaf\xfb\xec\x41\xe5\xba\xa8\xc5\x56\xa7\xd9\x1e\x6f\xe0\xd5\x01\x69\x9c\x99\x7a\x44\xed\xeb\x7b\xac\x9f\xe0\x4b\xe4\x78\xf3\x63\x8d\x9a\x55\xdf\x49\x78\xb9\xcb\xd8\x57\x51\x16\x04\x16\x60\xf1\xf0\x75\x59\xed\xca\xca\x0b\x81\x57\x77\xaa\xc8\xfe\x8d\xb9\xc6\xd7\x7d\x49\x02\x0f\xc5\x29\x27\x98\x30\xe2\x95\x01\x51\x67\xf0\x5b\x88\x23\x51\x04\x30\x2b\xb0\xb6\x05\x9d\xe6\x82\x2a\x32\xea\x52\xde\x51\x32\xa4\x25\xa5\xd5\x0c\x4e\x49\x29\xd3\x3e\x0e\xbe\xd3\x26\x0f\x42\x91\x55\xa5\x5c\x31\xaa\x8b\x6f\xe1\x90\x61\x64\xab\x03\x56\xdf\x5c\x55\xa1\xcc\x46\x2c\xa8\xe3\x17\x9a\xf0\xeb\xff\x45\x0b\xad\xf1\x3a\x37\x52\x98\x77\x45\xc9\x4d\xe4\x06\x6c\x29\xaa\xd4\xe5\x1d\x92\xc7\x00\x5b\x41\x34\x82\x27\x34\xcf\x5b\x55\x40\xe1\xba\xba\x83\x16\xfb\x85\xd4\x77\x83\x2c\x3b\x06\x59\x34\xc6\x76\xd5\x8f\x29\x02\xe3\xb1\x75\xc3\xb9\x55\xeb\xfb\xac\xd0\xa7\x95\x56\x29\xc4\x20\x98\xad\x6f\xd3\x5c\x74\xff\x6b\xae\x92\xd7\xad\x43\x08\xc9\x3b\xbc\xc9\x16\x52\xc5\x04\x2b\xa7\x2e\x03\xba\x55\x77\x8e\x9e\x10\x54\x16\x60\xd5\x44\xab\xd5\x1f\xc8\xf7\xfb\x9a\x78\x38\x49\x3d\xb5\x3d\xe2\x9c\x6c\xa4\x30\x27\xd7\xa7\x60\x43\x13\x97\xe1\x44\x48\x2d\x27\x26\x39\xf8\xc6\xac\xf7\x48\x36\x48\x46\xb1\xa1\x66\x97\x86\xdf\x4b\x61\xe5\x0c\x0f\xd9\x38\xc6\x9e\x38\xf9\x63\x00\x57\x00\x08\x17\xe3\x5f\x20\x17\x43\xac\x27\xed\x25\x6c\xf6\x3b\xe4\x54\x06\x6d\x80\xdd\xbe\x26\x76\x1f\x0a\x7f\xc3\xef\xcb\x7d\xbd\xdb\xd7\xa2\x2d\xe4\xc4\x9a\x81\x21\xb6\x49\x6e\xec\xdd\xe2\xe3\x8a\x3e\x6a\xde\xdc\x2d\x62\xb5\xaf\xe5\x4a\x03\x25\x32\xc0\x5c\xcb\x2d\x44\xe2\x3c\x81\x26\x52\x5f\x02\x58\x18\x2a\xb3\xa5\x29\xf3\x34\x98\x9a\xfc\xe0\xfe\x2a\x56\x5a\xaa\xbb\xbb\x4a\xdf\xc1\x37\x7d\xbd\x6f\xb0\xc4\x7f\x18\xc8\xe3\x71\x2b\x16\xcd\x1e\x4d\xaf\x22\x3a\xea\xb6\x30\x76\x18\xa1\x12\xcf\x80\x09\xbb\x23\x54\x1d\xe2\xd7\xf6\xbd\xe2\x59\xe2\xea\x3f\xfc\x84\xff\x00\x3f\x83\x57\xa9\xde\x55\x1a\x54\x38\xfe\x07\x85\x82\x7e\x6b\x6f\xe0\x49\xfb\x7f\x78\x76\x71\xfe\xba\x99\xff\x7d\xfd\xe6\x8f\xfc\xef\xef\xf3\x03\x31\x9e\xf1\x74\x3c\x1f\x5d\xcb\x9b\xdb\xf7\xd7\x93\xcb\x36\xe5\xe3\x45\x22\xcf\x7f\x94\xff\xb0\x2f\xb4\x3c\x3f\x3b\x7b\x23\x84\x4f\x07\xff\xdf\xff\x17\xfc\xea\x19\x76\x78\x14\xe7\x31\x6f\x5f\xbd\xda\x98\x0d\x28\xf3\xfc\x37\x21\xc6\x0f\xba\x3a\x94\x18\xeb\xf7\x49\xdc\x23\x0a\x2a\x9d\x6e\x48\x20\x9b\xc6\x09\x4c\x64\xf0\x07\x68\x0f\xc5\x96\xa8\xc4\x1a\x4c\x61\x48\x43\xdf\x54\x5a\x6d\x57\xb9\x46\x75\xd8\x27\xf8\xf1\x33\x43\x22\xe7\x89\x64\x21\xa1\x90\x13\xc2\xdf\x3c\xaa\x48\x09\xb0\xfe\x35\x2b\x52\x68\x1c\xa8\x40\x0e\xf0\x15\x0e\xe3\x8a\x2c\xfe\xa6\x8e\xbe\x49\xb7\x3e\x11\xd9\xa8\x9c\x04\x24\x11\x1f\x65\xb2\xbb\x02\x07\xa5\x56\x5f\xb5\x00\x8f\x0c\x8c\x6c\xdb\xac\xd4\xde\x80\x25\x72\x32\x21\xdb\x96\x47\x34\xe1\xfb\xe5\x7b\xa6\x83\x32\x35\x86\xb7\x82\xee\x8a\x76\x77\xb3\xa2\xd6\x05\x51\x22\x3b\xa9\xb5\xe7\x5f\xa8\xf2\x5c\x84\x29\x4e\xc5\x14\xcb\xa7\xa7\xcc\x7c\x00\x45\x57\x19\xe3\x6b\x1b\xe2\x12\x8e\x58\x39\x43\x2e\x34\xeb\xd1\xfd\x8c\x35\xec\x4f\x2c\x2c\x76\x49\x9e\x95\x4d\x30\xb5\x28\x37\xd2\x76\xc2\xab\x59\x64\xb5\x2b\x6e\x81\xd4\x64\x64\x81\x01\xb1\xa4\xa3\x48\x81\x75\x66\x07\x1e\x75\x57\x04\x5a\x51\x54\x0c\xb7\x56\x05\x3c\x08\x94\x2f\xea\x92\x74\x14\x89\x60\xda\x9a\xe0\xe5\x40\x88\x9f\xef\x75\x21\x1f\x01\x4e\xa9\x40\xfd\x2e\xea\x7d\x62\xff\x84\xfc\xf0\x1b\x5d\x55\x54\xf6\x49\xe3\x9d\x90\xe4\x0d\x14\xd3\xcf\xf6\x95\xe8\xee\x69\x7b\xbd\x84\xa5\x6e\xe4\x70\x38\xf9\x62\x7a\xb6\x35\x8c\x83\x2d\xe6\x77\x56\x3c\x39\x27\x34\xd3\xd5\x9d\x0b\x33\x6e\x65\x86\xd1\xdf\xc7\xcc\xdc\xf7\x13\xaf\x35\x49\x22\x14\x4d\x69\x51\x3b\x4a\xd6\x04\xb7\xdb\x91\xbe\xa8\x8a\x1a\x88\xf5\xbc\x42\xad\x2a\x68\x3d\xc5\x4a\xa5\x94\x5d\xdc\x65\x7a\xad\x49\x1d\xd7\xda\xbc\xc0\xc7\x68\xdb\xe9\x07\xdb\xd1\xe4\xdb\xc7\x7d\x2d\xca\x47\xf0\xe7\xed\x73\xd3\x92\x0d\xdb\xfb\xac\xb8\x83\x7d\x09\xfa\x02\xb5\x75\xd7\x60\xca\x10\xad\x02\x53\x51\x68\x1c\xc1\x5d\x45\xd0\x6d\xbb\x26\x0c\x42\x0a\x52\x8d\x12\xd7\xf6\x0d\xf8\x44\xe2\xbc\x03\x5e\xac\xaf\xee\x4f\xa5\x1d\xfa\x4a\x3b\xbb\x13\x3f\x05\xe6\x6f\x05\xf4\x2a\x89\x9f\x11\xd6\xc9\xc2\xf0\xb0\xc9\xa0\x90\x33\xd3\x46\x64\x2d\xc9\xc7\x66\x0c\x26\x10\x8d\xce\xa2\x70\x7c\x56\xbf\x6d\x3f\x0f\xaa\xae\xa8\x4a\xd0\xaf\x02\xa8\x22\x83\x2e\x92\xc1\xaf\x7f\x51\xdb\x1d\x88\xe3\x3e\xf1\x7e\x0a\x50\xef\x38\xe2\xcf\x3c\xa5\x77\xd6\xf1\x07\x74\x31\xc6\xb6\x37\x3a\x94\xf6\xdc\x29\x03\x7e\x19\x01\xba\x83\xc2\x67\xc7\x59\x42\xad\x0a\xa4\x8b\x59\xd8\x64\x20\x3a\xeb\x38\xc9\x8f\x81\xbd\x96\xb8\x05\x18\x2c\xba\x46\xa8\x7c\x20\x47\x45\x2a\x5c\x93\x0c\xb0\xaf\xdb\x25\x1d\xb8\x3e\xe8\x21\xe9\x03\xae\x22\xf4\x72\x68\x0a\x85\xaf\xa4\xa5\x36\x46\xe7\xd0\xcd\x75\xd7\xba\x22\x0f\xe0\xb1\x94\xa6\xd6\x3b\xf3\x56\x9e\x0c\xfb\x52\x19\xa3\xab\x5a\x04\x2e\x49\xd1\x98\x56\x28\x90\x3c\xef\x13\x4d\x12\xae\xb9\xa0\xe6\xe0\x2e\x7b\xe0\x05\x07\xa4\x87\xa2\x99\x8c\xd8\x21\x4f\x9c\x17\x0c\x8d\x95\x7a\x02\x07\x2f\x75\x7d\xfa\x0e\xe3\x6c\x78\xc6\x7d\xc7\x9d\x81\x03\xb7\x46\xa6\x76\x2c\x8a\xce\x0f\x52\xff\xb2\xcb\xe1\x30\x87\xed\x0f\x54\x69\x78\xdb\x7a\x49\x1c\x3c\x2f\x9a\x62\x42\x88\xc1\x59\x95\x35\x6a\x25\x34\xde\x29\x0c\x30\xbd\xf1\xdb\x08\xe5\x4a\x83\xdd\x4c\x06\x19\xeb\x88\x6d\x55\xf5\x15\x9d\x43\x3c\x40\x52\xe7\xe2\x0a\x9c\xbb\x5d\x55\xae\x72\xbd\x35\x08\xa8\x21\xec\x11\x4b\xc7\xea\x54\xea\xaa\x2a\x0b\x8d\x1c\x00\xf6\x26\xc0\x96\xd8\x75\xee\xe8\x5b\xf9\x7d\x03\x21\x16\xd6\xf9\x26\xe6\xb0\xd6\xb9\x6b\x4f\x08\xec\x15\xb0\x3c\x1b\x64\x10\x45\xfe\x4e\x28\xff\xdc\x17\xae\x13\xa2\x89\x0b\x0a\x42\x02\x26\xc3\x90\x81\x75\x39\xf3\xfa\x1e\xe8\xfa\x39\x62\xb3\x51\x40\xf2\x82\x4b\x1c\x78\x39\x06\x58\xb7\x69\x07\xda\x5e\x90\x00\xe5\xca\x91\xd0\xc0\xcb\x89\xf8\x80\x45\xb6\xc5\xbe\xe1\xdc\x16\x77\x3c\x0d\xc1\xc5\x10\xd8\x12\x7e\xda\xc0\x7b\x07\x3c\xbc\x75\xb0\xe5\x4e\xd5\xb5\xae\x0a\x7f\x1e\xac\x00\x07\xb2\x5e\xef\x2b\x8e\x4b\x08\x55\x69\x45\x2f\x43\x38\xd7\x86\xc0\xc7\x48\x28\x6a\x1c\xc7\xa1\x23\xb4\xf5\x92\x10\x18\x7f\x42\x1b\x0e\xae\xf1\x7d\x81\xcc\xd9\x40\x7b\x1a\x1e\xa6\x8f\x1a\xcf\x52\x3f\x13\x76\x38\x1a\xb8\x26\xbb\x9a\x50\x03\x10\x6a\x51\x05\x22\xbf\x91\x3f\x90\x56\x2a\x08\xd2\x51\x4b\x01\x8d\x0d\xfd\x72\xcb\x47\x55\x99\x71\x3c\xc7\x75\x46\x43\x8c\xc7\xa7\x48\x21\xd6\x8b\x77\x08\x16\xdd\x56\x5a\xa5\xb0\xa0\xa0\x26\x38\x75\x2a\x4b\x58\x89\x84\xa7\x60\x09\xf2\xd1\x68\x14\x65\x05\xf1\xb6\xb5\x16\x06\x68\x69\xa8\x50\xb1\x82\x4f\x99\xc6\x49\x4e\xd6\x93\xf8\x90\x11\xf3\x12\x92\xb3\x05\x8a\x58\xf5\x3d\x40\x94\x0a\x00\x5d\x15\xd0\x91\x1c\x6c\x1b\xb7\xf8\x48\x41\x7a\x20\x17\xb5\xaa\xb5\x11\xa4\x32\xe5\xac\xe8\x50\x6c\x9d\x63\xfc\x11\x73\x39\xe3\x3a\x01\x4c\xe9\xc2\xc4\xcc\x7f\x7e\x4a\x74\xa9\x82\x99\x8d\x0d\x1a\xed\xb0\x60\x4a\x16\x1e\x4e\x4b\x18\x48\x6b\x60\xc0\x96\x7c\x28\xb3\xd4\xd7\xa4\xa8\x5c\xa6\x76\x7d\x22\x37\x83\xe0\x06\x29\x0a\x1f\x01\x69\x7c\x68\x1d\x90\x7c\x20\x33\x3c\x38\x3e\xc6\x1c\x86\x66\x57\x65\xba\x46\x39\xcd\x52\xf0\xb5\x6f\x27\xcb\x9f\x42\xca\x98\xbd\x3b\x84\xf8\x75\xa4\x10\x1c\xe0\x18\x83\x2b\x9f\xde\x2c\x8a\xb2\x00\x32\x52\x72\x06\x58\x00\xa4\x53\xae\x13\x29\x17\x21\x9a\x96\xc8\x16\x54\x36\x8c\xd4\x0b\x0c\x13\xdb\x87\x8e\xe7\x9f\x17\x10\x28\xba\x9c\x4d\xaf\x98\x8c\x5f\x4a\x79\x36\x90\x57\x8e\x87\x96\x68\x0b\x7b\x61\xd9\x60\x0f\x2d\x4e\x98\x47\x9f\xe2\x7f\x56\x37\x6c\x00\xb5\x2e\x74\x69\xf5\xd0\x7c\x46\x72\x5b\x77\x95\x9d\xe6\xd9\x57\x8d\xc2\xca\xc8\x9d\x01\x16\x72\x5d\xca\x2e\x2f\x29\x11\x9c\xf5\x30\x7a\x9b\xd9\xd1\xd8\xaf\x6b\x60\xbb\x35\xe0\x42\x01\x36\x8c\x92\xf0\x61\x93\x11\x61\x40\x6f\x84\x70\x32\xd8\xed\x4e\x69\xb4\x0b\x82\x07\xe8\x4a\x16\xb1\x04\x07\x2f\x4d\x2b\x6d\x28\x33\xde\x3b\x94\xfb\xde\x40\xf6\xae\x59\xe5\x92\xe0\xab\xde\x4e\xe9\x71\xec\x2f\x38\xc1\x44\x23\xc9\x41\xe6\x65\x0f\xef\xd9\x1e\x13\xd5\x13\x1d\x33\xb9\xb7\x60\x4d\x82\xc2\xa4\xda\xd5\x92\xee\x86\x30\x3a\x0c\xdf\x01\x8a\xae\x8d\x32\xf7\x76\x6a\xf0\x22\xc4\x40\x2b\x9b\x0c\x21\x7e\x35\x40\x36\xd6\x8e\x5d\x15\x01\x86\xd6\xa6\x5b\xa3\xa9\xc1\x35\x43\x21\x3a\x01\xca\x3a\x14\x10\x5d\x28\x6a\x77\x70\xc5\xf6\xb8\x49\xf6\xd6\xcf\xc8\x3d\x02\x83\x17\xbf\xdc\x63\x69\xda\x5e\xeb\x53\x03\x21\x46\xb2\x17\x82\x0b\x7a\x34\x0e\x01\x23\xfc\xbe\x70\x6f\x64\xa8\x85\x7f\x78\x20\x7b\xab\x05\xfd\x99\xc6\xd7\x6e\x5c\x75\xa7\x6a\xdd\x1e\xe2\x14\x56\x07\x18\xfb\x94\x18\x40\xd6\xb9\xc4\x23\x86\xfd\xc0\x89\x47\x7f\x36\xa0\xbd\xeb\xab\x64\x8c\xb6\xeb\x51\x55\x59\x8e\x1c\x2b\xc4\xd2\x11\x72\x97\x32\xa0\xd6\x13\x4f\xfa\xe9\xc9\xd5\x63\xc2\xa5\x85\x28\x83\x4a\x41\x89\xb2\x20\x21\x78\x60\x76\x77\x46\x19\x69\xfd\x57\xd9\x83\x22\x7d\x78\xa8\x5c\x85\x6e\x02\xa7\x15\xc3\x3b\xbb\x0f\x89\x93\xa7\xc0\xf2\xfd\x44\xb0\xb4\x70\x48\x22\x08\x47\x15\xec\x6f\xe2\x68\x2a\x30\xb9\xb0\x2e\xf7\x45\x0d\xd9\x16\x5c\x57\xf6\x9a\x7c\x00\x3f\x42\x2a\x23\x1e\x75\x9e\xd3\x34\x20\xe6\xa5\x31\x07\x76\x6f\xda\x5d\x4e\x37\xbf\xeb\x00\x9c\x06\xba\xb0\x2f\xe7\x07\x13\x77\xa1\x60\x9f\x15\x28\x32\xd0\x88\x47\x77\x63\x20\x3f\x6b\xcc\x92\x68\xb8\xac\x39\xa3\x44\x64\x74\xac\x65\xe4\xc7\x53\x14\xba\x46\xc8\x11\x7c\xae\x28\x23\xb5\x0c\x45\x86\x31\xc5\x85\xb0\xf9\x59\x71\x67\xd7\x6a\xe1\xdf\xf2\x40\x62\x51\x01\x83\x3b\x22\x59\x8d\xec\x8d\x76\x78\x69\xd8\x49\xba\x06\xba\x71\xa2\x08\xec\xd1\x88\x0a\x22\x01\x61\x95\x49\x37\x6f\x8a\x6a\xc2\x32\xbe\x26\x77\x55\xb9\xcd\x0a\xe4\xf9\xb0\x66\x01\xac\x30\x04\xd6\xe2\xd5\x66\x3d\x05\xf7\x66\x0c\x36\xb8\x77\xb7\x6a\x00\x9c\xc7\x50\xeb\x3c\x47\xa7\x8a\xc6\xe8\x69\x03\x9d\x8e\x9b\x13\xdd\xc5\x64\x42\x0a\x5c\x4e\xa9\x5e\x55\x00\xce\x87\x6c\x26\xf9\xfe\x81\x50\x30\xf1\x41\x31\x0c\x0a\x9e\xdb\x3e\x89\xb1\xa5\xf7\xe5\xa3\x9d\xf6\x87\x4c\x3f\x1e\x21\x98\x05\x1b\xac\xbe\xd7\xc1\x34\xec\x2a\x6d\xf0\xb2\x77\x69\x29\xe8\xe3\xba\xdc\x6e\x55\x91\xe2\x71\xbc\xe3\x34\x94\x23\x35\xdc\xea\x62\x9f\xa0\xc7\x8a\x03\x2e\xb3\x5a\x6f\x39\x7b\x06\x4f\xda\x6a\x5d\x93\xa2\xc7\xba\xca\x6a\x5d\xb9\x94\xe0\x70\xd0\x50\x47\xb1\x67\x68\x2f\x70\x2a\x7b\x04\xe5\x0a\x8f\xa1\xa3\xca\x03\xf0\xa1\xa7\x05\x07\x06\xb2\x37\xf3\xc9\xe4\x5e\xb0\xab\x3a\xc0\x62\x2a\x38\x6b\xb9\x54\x4f\x4e\x78\xc0\x7a\x21\x8f\x3f\x0f\x22\xee\x43\x27\x8f\xa7\xac\x8d\x4c\x6c\xee\x9c\x58\x15\x5c\x9d\xb9\x3a\x20\xe9\x4c\x79\x57\x64\xff\xa6\xd3\x40\x4d\x60\x55\xa6\x40\x93\xef\xf8\x3d\xd7\x0a\xad\x3e\xf7\x22\xc3\x25\xc4\x3a\xa5\x80\x40\x50\x76\x40\x16\x12\x94\x4a\x72\x81\x71\x02\x20\x7d\x96\x33\x7b\xcc\x52\x6b\xa2\x21\x72\x6d\x5b\x16\x77\x81\xa3\x2a\x6c\xa7\xe1\x38\xa5\x63\x85\x1f\xc1\xd3\xb3\x00\x47\x45\x5e\x43\x86\x31\xb3\x9b\x93\xef\x42\x47\x14\x46\x97\x2c\xd1\xd1\xd1\x8d\x11\xde\xa4\xc2\xcd\x17\x2c\x22\x10\x4f\xa7\x25\x7f\xa2\xfa\x18\x32\x8d\x09\x87\x8a\xb2\xda\xaa\xdc\xcd\x0d\xaa\x40\xda\x59\x56\xf2\xb3\xfa\x6b\x09\xfa\x95\xbb\xb2\x70\xa1\x6a\xe7\xf6\x84\x1a\xa5\xf0\x82\xd6\xc7\x89\x2f\x49\x40\x41\x95\x57\x6c\xc4\xe3\x34\x14\x2a\x44\x61\x1c\xf4\xf6\xba\x1e\x44\x28\x10\xae\xf5\x14\x4a\xb6\x97\x0d\x2c\x50\xe2\x5f\x28\x9a\xcc\xb8\x99\x39\x76\x89\x08\x5f\xcb\xc5\xb8\xc4\xed\x40\x8e\x64\xaf\xd1\x88\x5e\xe2\xf8\x5b\xa1\xfe\xff\x97\x3a\xf1\x8a\x49\xf0\x51\x6b\x95\x81\x8f\x05\x7e\x02\x7c\x49\x9e\x7c\xd5\x55\xa1\x73\x7b\xb0\x17\x69\xf9\x48\xbe\x28\xd5\xde\x96\xb2\x2c\xfa\xce\x93\xe6\xca\x75\xbb\x56\x90\x4b\x0f\x3f\x2c\x4e\x32\x28\xb9\x20\x80\x03\x93\x19\x35\x17\x45\xb5\x2f\x50\xa2\x43\xb1\x90\x60\xe5\x8c\x7c\xca\x46\xbb\xb5\x41\x78\xd7\x08\xfe\x01\x3b\x60\x57\xe9\x3a\xf8\x1e\xa8\x77\xd6\xbc\x3c\xbb\x00\xa1\xd1\x31\xd2\x00\x94\x60\x39\x18\x0e\x11\x69\x10\xe2\x40\x63\xe1\x89\xf7\x0c\x39\x63\x9d\x70\xd8\x81\x56\xce\x86\xc0\x42\x71\x4f\xfb\xd0\x2c\xc0\x46\xc0\xcb\xf0\x69\x4c\x5a\xec\x2b\x5f\xb0\xa3\x9e\x26\x9d\x93\xf8\x81\x6a\x09\x7a\x6f\xde\x50\x18\x08\x47\x22\x9a\x91\x96\x2f\xca\x24\x7a\x3c\x84\x7d\xea\x77\x46\x36\xb7\x2a\x8c\x68\xd3\x5d\xac\xcb\x32\x37\xc1\x1f\xa2\x6a\x96\x28\x14\x2c\x3d\x6f\xc8\x1e\x3d\x01\x67\x61\x66\x05\x0b\x26\x20\xe1\x64\xdc\xe2\x60\x47\x32\x2c\xa2\x69\x93\x63\xec\xca\xc5\x48\xa3\x59\x64\x7e\x0b\x77\xdd\x1f\x97\x7f\x09\x91\x6c\xa1\x1c\x2c\xfe\x71\x53\x56\xc1\xea\xe2\x02\xbe\x26\xde\x17\xf2\x30\x0c\xa1\x60\x4c\x10\x49\x3a\xc2\xf0\xa0\x1a\xa4\x30\xfb\x55\x2c\x9a\xec\xfd\x0b\x77\x3e\xe3\x17\xc2\x40\x16\xc5\xdd\x42\x4c\x9a\xc8\x8a\x3a\xdb\x02\x41\xb3\xaa\x15\x0b\x94\xad\x03\xa6\x4b\x5c\x08\x9b\xbc\x7c\x94\x2b\x5d\x3f\x6a\xcd\x3e\x7d\xd8\x06\x9f\x2e\x73\x68\x65\x37\xba\xb8\x39\x3a\xc1\xd2\x10\x97\x0f\x17\x90\x33\xf1\x39\x0c\x5b\x19\x52\x28\xe7\x2d\x20\x1a\x60\x10\x70\xba\xda\x6f\xee\x7a\x1d\x5e\xfc\x47\x1b\x13\xef\xd3\xe6\x89\x87\x71\x16\x55\x63\x48\x9b\x3a\x06\x5a\x28\xf2\xbd\x32\xd9\x5a\xde\x38\xf7\xc3\x7a\x8b\x41\xb9\x2c\x13\xb4\xb4\x4d\x26\x58\x91\xfc\x67\x36\xdb\x40\x11\x17\xca\x3d\x19\x2d\x49\x41\x64\x07\xc5\x67\x92\x87\xac\xaa\xf4\x43\x89\x45\x6b\x01\xe8\x11\xc9\x57\x75\xda\x51\x20\x3b\x88\xb9\xe0\xf4\x2f\xd6\xc1\xc9\x40\x5b\x6c\xb3\xc9\xaa\xad\xc1\x08\xf7\xbe\x60\xa5\x84\x38\xfc\xcc\xc7\x8a\xdf\x7c\xce\x7f\x83\x61\x45\x1c\x0f\xce\x49\xb5\x2f\x0a\xf4\x7d\x42\x5f\x11\xd9\x06\x02\x20\x7f\xc0\x2d\x18\xb2\xd4\xe2\x93\x12\xaa\x92\xcc\x6a\xc3\x94\x32\x09\x46\xb8\xb2\x1a\xa4\x34\xe2\x87\x0f\x22\x06\x25\xe1\x0b\xd2\xb4\x89\x22\xf7\xe5\x46\x6e\x54\x46\x15\x6e\x5c\x13\xeb\x71\x72\x10\x95\x0b\x95\xaa\xfd\x4c\xe4\xea\x31\xa0\x79\x46\xf9\x12\x3b\x28\x64\xf6\xa3\xef\x1a\xb5\x29\x48\x7a\x10\x98\x09\x2d\x69\xe7\xb6\x8a\x60\x96\x4c\x29\x01\xac\xa4\xa8\xbd\x8e\xa6\xd5\x01\x4d\x39\xd7\x9a\x01\xa9\xf5\x3a\x20\x8e\xc5\xc7\x8a\xc6\xbb\x4b\x97\xea\x62\xfa\x97\xd2\x2e\x16\x3c\x7e\xed\x40\x78\x1d\xbb\x2d\xfa\x6a\x91\xe5\x2a\x9c\xd0\x4e\x8e\x7e\xc5\xa1\xdc\x27\x84\xde\xb2\xc3\x43\x09\xc3\xfa\x5e\x6e\xd4\x9a\x72\x52\xf0\x39\x9e\x7d\x3c\x29\x28\x26\xd4\xc6\x0b\xbf\x88\x74\x12\x19\x7c\xc8\xa5\x43\xad\x2e\xaa\x5d\x14\xde\xa0\x89\x07\x98\x14\xb7\x9c\xbe\xed\x92\x82\x90\x7b\xe3\x62\x28\x61\x1b\xdd\x94\x09\x1c\x36\xea\x29\x11\xc3\x03\x49\x76\x38\x10\x25\xa1\x62\x99\x27\x1b\x37\x36\xfc\xca\x69\x3b\x09\x0a\x03\xda\x96\x24\x10\xec\x80\xae\x61\xac\x91\xa2\xd5\x38\xea\xb0\x5b\xd8\x8d\xc7\xf8\x17\x25\xe4\x1c\xdc\x19\x7a\xa1\x53\xc1\xfd\x06\xfd\x26\x4a\x26\x64\x15\x51\x0b\x97\x05\xb0\x94\xc3\x58\x1e\xca\xfd\x40\x88\x4b\x37\x68\x14\xcf\x70\xd9\xf0\x75\x56\xad\xf7\x5b\x54\xf6\x33\x31\x58\xc3\x2e\x90\x48\x91\xc4\xaf\x4f\x41\xe7\xca\x4a\xe7\xe5\xe3\x40\x2e\x98\xea\x2b\x90\x19\x26\x48\xc6\x3b\x57\x55\x34\x3c\x83\x65\x65\xb0\xb2\xb8\xd0\x6b\x6d\x8c\xaa\x0e\xac\xb8\x62\x0f\x35\x4e\x58\xdc\x62\xc2\x02\xbd\x6f\x62\xe3\xf9\x60\x07\x67\x54\xd4\xd9\xe9\x25\x34\x99\xb8\x57\xe4\x35\x6c\xc4\x69\x19\x1f\x2e\x58\x4f\xb3\xb2\x57\xb3\xde\xea\xd4\x6b\x1a\x15\x81\x5c\x4f\xed\xaa\x83\xd7\x0a\x24\xbc\xcc\xbe\xd2\xc2\x8f\x50\x50\x09\x9c\xab\x47\x26\x8c\x85\x35\x13\x50\xb0\xd3\xe7\xad\xe3\x93\x6b\x39\x1c\xf2\xbd\xf3\xf3\xe4\x66\x16\x44\x8b\xea\x4a\xab\xfa\x20\x55\x5a\xee\x88\xe1\xe9\xfc\x4c\x5e\xe9\xb5\x06\x19\xf5\xe1\x8f\x3f\xfe\x80\xa2\x71\x44\x32\x03\xe1\x55\x5e\x1e\xd6\xfa\x08\xc4\x50\x20\x4a\x18\x0d\x02\xe7\x68\xa8\x0f\x86\x61\x09\xb8\xb3\xc0\x5f\x57\x8d\x82\x2d\xcc\xd3\x33\xbd\x1a\xea\xaa\x81\x6e\x19\xe0\x13\xca\x6a\x95\xa5\xf1\x4b\xa0\x2c\xbb\x6b\xc4\x4c\x23\xa4\x80\xa5\xdf\x51\xfb\x32\x43\xc3\x0e\xc7\xa8\x68\xa9\xca\x75\xdd\x88\x4d\xe2\xdb\x66\x25\x13\xdc\x7e\x82\x72\xd8\x50\x2c\x00\x3d\x01\x94\x4b\x4d\xd7\x14\x5c\x5e\xec\x25\x90\xcc\x5a\x87\xf2\x10\xc4\x3c\x29\x90\xf0\xff\xb2\xf7\xae\xcd\x8d\x64\xe7\x99\xa0\x3e\x9f\x5f\x71\x16\x11\xb3\x24\x62\xb3\xb2\x8b\xac\x4b\x5f\x4a\xa1\x09\x14\x89\xaa\x82\x44\x02\x34\x00\x76\x89\xde\x70\xd8\x09\xe0\x80\x4c\x55\x22\x13\xce\x4c\x90\x05\x7d\x92\x3c\x92\xdd\xb2\x35\x96\xbd\xe3\x91\x37\x64\xc9\xbb\x8e\xf5\xcc\x2a\x26\xbc\x92\x27\xec\xd5\x4a\xb2\x3c\xfe\x31\xee\xaa\x96\x3f\xe9\x2f\x6c\x9c\xf7\x72\x2e\x99\x09\x92\x55\x7d\x91\xd4\x62\x45\x48\x5d\x45\xe6\xe5\xe4\xb9\xbe\x97\xe7\x7d\x9e\x08\xf3\x32\x2a\xd5\xbb\x2a\x38\x8c\xd1\xa9\xde\x68\x4b\xd7\xa4\x05\x73\x24\xc0\x65\x89\x49\x50\xab\xd3\xb1\x25\xb0\x33\xe9\xcb\x36\xf4\xa6\xdc\xd8\x9b\x4c\x3c\x2c\xed\xa2\x7d\x97\xf1\x51\x7b\x18\x33\x73\x95\xe5\x61\x70\x37\xd4\x71\xd0\x91\xbc\x55\x78\x36\x0c\x9e\x29\x1c\x87\x13\x28\x80\x08\x7d\xc7\xf5\x05\x4d\xdb\xb3\xcb\xa4\x4e\x52\x8e\x1c\xaa\x4a\x0c\x3d\x82\x36\x50\x80\x30\x90\x50\x5e\x97\x06\xb4\x1e\xc8\x67\x4a\x2d\xf5\x80\x45\x53\x8c\x92\x73\x31\x48\x85\x32\xbe\xc2\x85\xc8\x81\x12\xb6\x48\xce\x4d\xbe\x65\xc6\xec\xee\xd3\x69\x96\xb3\xe9\x4d\xbb\xf0\x9b\x36\x4f\x51\x12\xeb\xf0\xe6\x06\x50\xff\x45\x93\x02\x84\x5b\xa8\x8e\x9f\xe3\x6a\x0f\x84\xad\xa2\xd1\xc6\x9d\x05\x3a\x34\xc7\xb9\x80\x21\xfc\xd4\x9e\x6d\x36\xd2\x6d\x65\x22\x50\x0e\x02\xd4\x52\x63\x94\xb8\x4f\x33\xfa\xbb\x3e\x83\x6c\xa7\xba\x43\x02\xd6\x83\x6e\xcb\x3a\x5b\x01\xf5\x1d\x62\x09\x48\x7e\x00\x62\xc5\x1c\x0a\xb4\xa9\x7e\x69\xb0\x1b\x4c\x1a\xec\xcc\xb4\x43\x76\xa5\xc8\x12\x7e\xd7\x26\xc6\x2b\x53\xae\x21\x84\xef\x95\x88\x96\x15\x95\xaf\xc2\x75\xae\xe3\xd2\x6a\x88\x99\x9b\x0c\x1b\x02\x55\x49\x3a\x53\xb6\x81\x3b\x82\xc7\xf5\x6e\xd3\x74\xa5\xb4\x95\x2a\x9d\xea\xa3\xc2\x3d\xc0\xb0\xfc\x62\xcc\xae\x12\x52\x86\x45\x39\x26\x53\x29\x84\x58\x99\x8d\xf6\xe9\xd6\xdf\xc4\xb8\x8d\x20\xac\x86\x2b\xae\x12\x95\x0a\x4b\x27\x5e\xe3\x1d\x98\x13\xf7\x55\xbc\x44\xe3\x32\x70\xed\x7a\x98\xfc\xd8\x51\xa6\x90\x97\xec\x60\x87\x4b\x8c\x1b\x5f\x88\xd2\x27\x19\x03\x4f\x87\xee\xbb\xab\xc7\xaa\xb5\x61\x71\xb4\xb0\x82\xc3\xc0\x75\xd8\x34\x85\x13\x20\x2d\xe3\xdc\x78\xb6\x4e\x50\xad\x61\x7f\xc7\x24\x5f\x96\x2a\x71\x71\x06\xbc\xa4\xe8\x52\x67\xc0\x21\xae\x0a\xce\xed\xe3\x92\xf2\x0d\x7a\x62\x3c\x65\x84\x00\xae\xec\x00\x97\x99\x30\xb4\xea\xce\xf1\x6d\x3a\xc4\xad\xee\x85\xa9\x64\x44\x9a\xa1\xa1\xee\x81\x10\xa0\x82\x14\x01\x17\xc1\xa5\x0c\xb4\xf7\x19\xe5\xb3\x04\x38\x16\xe7\x92\xd0\x45\x58\x66\x81\xc1\x40\x35\xab\x34\x55\x6f\x13\x85\xd0\x8b\xd9\x73\xa0\xdc\x5e\x63\x47\xd3\xc1\x28\x46\x6b\x4a\x9b\x7b\xa1\x15\x20\xfa\xd4\x9e\x2f\x02\x17\xec\x03\x09\xcc\x05\x28\x09\x56\xe9\x4b\xd6\x06\x5c\x85\x81\xa9\x59\x9b\xe3\xed\xf0\xc2\xb3\xa8\xb8\x24\x21\x52\x04\xb8\xe7\xa0\xe1\x4b\x34\x1f\x4e\x6a\x44\x78\xa9\x91\x07\xba\x2b\x28\x18\xe4\x1d\x3d\xb5\xb7\x38\xc1\x63\x42\x02\x08\xfd\x6d\x0d\x6f\xf0\x93\x2f\x74\xd8\x42\xcb\x4d\xac\xc0\x16\xdb\x11\x4e\x46\x74\x3c\x75\x5d\x9a\x3e\x8e\x5d\xe8\x2a\x05\xb2\x9a\x21\x26\xc6\x2c\x73\x22\xf9\x28\x7e\xa4\xa8\x42\x28\x8b\xb6\x8e\x87\xe2\xa8\xd9\x26\x36\xd6\x24\xd0\x19\x01\x15\xf3\x99\xc9\x59\x72\xe8\x05\x2d\x84\x85\x8c\x64\x82\xda\x07\x4b\x67\x47\xd4\x5e\x69\x2a\x23\x79\x9e\x25\x2b\x28\xf9\x16\x91\x2c\xca\x2c\xa7\x9a\x2e\x2f\x43\xc8\xc7\xb7\x93\xf0\x4d\x65\xcb\x94\xaa\xb4\x78\x6c\x9c\x2e\x12\x48\x1f\x5f\x38\x39\x63\x7b\x4c\xbb\xac\x86\xd6\x9a\x82\x83\x11\xc1\x4f\x46\x90\x97\x71\x92\xb5\xe7\xb3\xad\xc4\x4c\xbb\x17\x1c\xa1\x72\x54\x87\xd1\xd3\x42\xbf\x23\x94\xbd\x14\xdc\x2b\x92\x42\xae\x84\x0c\x80\x16\xd5\x7c\x90\x5d\x1a\x2c\xa9\x5b\xd9\x5e\xe8\xc0\x87\xad\xae\x21\x32\x64\x1e\xc4\xfc\xf3\xce\x41\xd8\xcf\xd2\x5b\x74\x06\x3e\xca\xb0\x5e\xaa\x76\x00\x56\xdb\x56\x0b\xe8\x6e\x3e\xb6\x0a\x71\x17\xa6\xc8\xbd\x8d\xa7\x97\x93\x66\xab\x55\xd6\x35\xc6\x25\xaf\x50\x8e\xc4\xd9\x94\x2a\x7b\x1a\x5e\x44\x6b\x3a\x07\xf7\xec\xbb\xfc\x30\x37\x9c\xe4\x6a\x31\xc9\x66\x18\x5e\x85\x1c\xdb\xd9\xba\x00\x83\x95\x69\x89\xb6\x4d\xdc\x58\x38\xbf\x6d\x98\x99\xed\xc0\x14\x12\xc6\x96\xbe\xa1\x39\x02\x17\x3f\x57\x33\x01\x33\x7f\xb6\xca\x31\xae\xc5\x4f\xc6\x87\x91\x58\x1d\x66\xef\x61\x86\x7a\xa8\x7d\xd8\x67\x10\xe6\x86\xe7\xf0\x2f\xed\x1b\x23\xc3\x47\x46\x12\x60\xb0\x8b\x43\x14\xd8\x54\x88\x96\x67\xb9\x52\x72\xad\x22\x22\x7b\x36\x97\xe8\xfd\xc1\x09\x04\xb1\x81\xb7\xc4\x03\x27\x47\x61\x32\x2b\xdb\x47\x86\x9f\x91\x69\xe2\xe6\x2f\xb2\x99\x4a\xe0\xa8\x3b\x25\x8f\x4f\xcf\x04\x7d\xee\xd2\x61\x4b\xa4\x52\x4e\xcf\x08\x16\x6a\xdc\x69\x57\x68\x90\x37\x87\x4c\x4d\xe6\xc2\x56\xcd\x96\x67\x86\xec\xcd\x24\xfe\x36\x84\xfd\x02\x79\xdd\xf1\x16\x97\x8e\x77\x40\x16\x2e\x5a\xcf\x69\xe6\x08\x61\x63\xec\x4f\x45\x45\x86\x69\xb5\x29\x95\x0f\xf0\xbb\x92\xb5\x93\x40\x30\x09\x2c\xda\x12\x8c\x4d\x8a\x72\xdb\xbb\x6d\x07\x03\x4a\xa6\xb9\x12\xcd\x9d\xa3\x6d\xdd\x48\x12\x72\x41\x42\x8a\x2f\x97\x91\x36\xff\xc8\xf4\x47\x9b\x8a\xe6\xa8\xb3\x37\xfa\xfe\x9c\x3b\x71\x09\x25\xe1\x0e\x0c\x17\x84\xe2\x24\x41\x73\xfb\x9c\x82\x43\xcd\x61\x70\x34\x55\x40\x6e\x35\x8d\xf0\x7c\x2e\x38\x72\x03\x29\x48\x91\x4d\xa7\x51\x41\x4a\x8f\x24\x03\x97\xd6\xab\x22\x39\x60\xeb\x22\xba\x6b\x13\x0a\xdd\xb1\x15\xe6\x1c\x69\x2d\x54\x9d\xb5\xd5\x84\x4d\xb5\xfb\x13\x34\x59\x36\xac\xdb\x09\x39\x3b\xc8\x37\x06\xc3\x40\xbd\x8c\x69\x0e\x08\x4f\x61\x1d\xff\x36\xc2\xd6\x45\x46\x8a\x4a\xd4\xe5\x6d\x57\x4f\xda\xc6\x7c\x9d\x41\xdd\xd4\x6d\x82\xeb\xe8\x21\xfe\x0f\xf4\x67\xb9\x81\xf0\xc2\x0f\xf1\xc5\x38\xc0\xf3\x55\x8e\x91\x36\x1c\x68\x30\x9c\xd9\x82\x61\x85\x57\x0f\x2c\x6f\x67\x53\xf3\x52\xab\x78\x93\x4e\x66\xcf\x00\x2a\xf0\xfd\xee\x93\xbc\x3d\xaf\xa8\x4d\xc6\xa0\xfe\x3a\x3e\x57\x08\x13\x87\x6b\xd3\xe8\x6b\xd1\x1c\xde\xc6\xd8\x0a\x2e\xe6\x35\x91\xce\xbb\xb2\xeb\x6d\x84\xa7\xd0\xce\x54\xb8\x1d\xcd\x95\xc5\x36\x60\xec\x1c\x86\xc8\x4e\x18\xa3\xf4\x18\x0a\x75\x99\x88\x6a\x21\x52\xf5\xdc\xc4\x84\xdc\x2f\x2b\x22\x78\xa2\x29\x6d\x9f\xc7\x94\x5d\x6b\x9e\xfd\x43\x63\xcd\xeb\x4d\x00\x6c\x13\xfa\xae\xb3\xac\xa0\xba\x85\xa6\x3b\x03\x9a\xe8\x48\xff\x80\xb1\x40\xa6\xba\x84\x18\xa2\xe3\xc6\x39\x59\x4c\x7f\x3b\xb7\x39\xdd\x42\x4f\x4f\xcc\xc4\x16\x3e\xf1\x73\x28\x84\xda\xb8\x04\x50\x59\x7d\xa9\x54\x7e\xab\xcc\x6e\xe9\xff\x22\x14\xca\x72\x5e\xba\x9d\x19\xa7\x7a\x5b\xe3\xd4\x9c\xd2\x36\x19\x75\x53\xe5\xb1\x7a\x51\x34\xce\x3b\x17\x7f\xa0\x8d\xda\x89\xc2\x5d\x11\xc5\xd0\x68\x34\x28\x7d\x4b\x80\x01\x6f\x8f\x63\xe7\xd4\x59\xe3\x33\x30\xd9\xd1\x12\x87\x3d\x1f\xa9\xdd\x1b\xf6\xbb\x40\x9f\x56\x85\x9f\x26\x8d\x0b\x0c\xc6\xcf\x88\x3f\x54\x6c\x5e\x32\x7a\xc6\x7b\x79\xe8\x75\x60\xdd\x88\x8a\xb2\x94\xd9\xf1\x45\x6d\xcf\x35\x48\x9c\x63\xed\x2c\x1d\xe1\xb9\xd6\x82\x86\xb8\xa7\x65\x6b\x9a\xa5\xc5\x6a\xa1\xb8\xb6\xbd\x6c\x19\x41\x3d\x03\xf5\x29\xa3\xf4\x34\x9e\x24\x4a\x2c\x55\x5e\x20\xdb\x14\xa8\x60\x94\x6b\x17\x35\x92\x2f\x60\xe3\x35\xe7\x1d\x5f\x1c\xc8\x79\xb4\x88\x13\x00\xe8\xc8\xb3\x6c\x55\xa8\xb3\x2c\x99\x09\x4a\xe7\x14\xf6\x84\xe2\x2c\xaa\x49\xfe\xc2\xa1\x99\xcc\x08\xe9\xe8\xd2\x79\x20\x53\x81\x9c\x5d\xa0\x50\x7f\x28\x7a\xa9\x9c\x29\x54\x81\xa0\x55\x85\x60\x41\x4b\x48\x49\x98\x37\xef\x5b\x03\x39\xcb\x56\x93\x72\xbe\x4a\x00\x31\x54\x60\x2c\x5e\x80\x14\x62\x91\x25\xe7\xd8\xc9\xf3\xe8\x3c\xcb\x31\xb9\x79\xae\xb4\x37\x83\xa9\xf7\x2a\x84\x08\x5e\x63\x4e\x14\xb0\xa6\x1c\xb5\x5c\xed\x5a\x04\xb2\xe5\x75\x93\x07\x22\x96\xe5\x7a\x09\x36\x04\x72\x92\x2d\xb2\xd4\x22\x69\x22\x60\x4e\x2f\x0a\xa7\x7e\x21\x10\xbe\x7f\xcf\x19\xd4\x95\xf9\x97\xd3\x3a\xf0\x97\x33\x23\x61\xa0\xcf\x81\xd8\x01\x9d\x88\xea\xa5\xd1\xb4\x5c\x71\x2b\x71\x80\xd4\xf3\xa5\x9a\xa2\x09\x07\x53\x79\x89\x01\x72\xae\x99\x28\x2d\x77\x7d\x28\x3a\x97\x77\x7a\x25\x30\xc1\x43\xe5\x3c\x02\x3c\x71\xa7\xb8\x41\xd8\x53\x1c\x74\x4a\x57\xda\x94\xc5\x9e\x4a\xb3\xf4\x96\x79\x01\xb6\x76\x95\xc2\xa3\xe1\xf4\xd6\x3f\x01\xd6\x62\x80\xea\xc1\xb7\xc2\xf9\xaf\x27\x18\x84\xfb\x30\xca\xa4\x08\xbc\x67\xba\x8e\x3f\x45\xb4\x7a\x08\x5d\xc1\x69\xd7\x83\x8d\x09\xfe\xce\x08\x19\x77\x75\x39\x4b\x66\xa1\xca\xb3\x6c\x86\xa7\xc4\x54\xcd\x56\xb9\x2a\x02\x2a\xd8\x24\x74\xb6\x7c\xa6\xd6\xd8\xb7\xb8\xcf\xc5\xf6\xd9\xbc\xaf\xce\xdc\x92\x1d\xbd\xd7\x21\x64\x46\x35\xd7\xed\xd4\x9d\x3c\x98\x38\x5e\x03\xc9\xee\x68\x60\xb2\x13\xda\xb3\xde\x64\x78\x29\xaf\x75\x58\xae\x06\xc2\x70\xca\x1e\x24\x06\xd1\x21\x98\x9e\x77\x26\xe7\xab\x74\xca\x2c\xad\xd4\xb5\xe6\xd5\x95\x53\x3e\x4e\x61\xf7\x8d\xa0\xee\x05\x0a\x1f\xb4\x53\xc5\x51\x1e\xfc\x2c\x84\xa7\x40\xa6\x6f\xa2\xd0\x8f\xf6\x52\x24\x86\x64\x78\x11\x01\x38\x92\x98\x01\xd9\x09\x4e\x6b\x1b\xa4\x1b\xeb\xe3\x8d\x9e\xbc\x2c\xfd\x32\xcc\x72\x39\xb8\x14\x48\xdd\x22\x51\x78\x50\x19\xfb\xc0\x11\x09\x34\x56\x38\x16\x20\x45\x85\xcd\xe9\xe1\xb1\x87\xe8\x61\xe1\xae\x41\x69\xd8\x40\x9c\x98\xa2\x53\xbf\xa2\x2f\xf1\x86\x32\x2e\x0c\x9a\x38\x57\x33\x51\xad\x64\x24\x80\xd1\x52\x95\x2b\xd2\xf4\xa5\x58\xba\xf6\x56\x11\xae\xb1\xdd\x18\x21\x14\x4e\x0b\xc1\x03\x3a\x8b\xf2\x68\x5a\xaa\x3c\xfe\x32\xc1\x6c\x37\x1c\x5c\xf8\xdd\x1e\x64\x44\x70\xa7\xb2\x9c\x60\x83\x4f\xbd\x69\x81\x21\xbf\x4c\x59\x89\x09\x0b\x13\x47\xa1\x62\xe7\xb9\x4c\xe9\x3c\xd3\x43\x9d\x12\xe1\xa3\x63\xd5\x11\x7b\x71\x41\x59\x12\x14\x27\xb5\xeb\x4a\x34\x4e\x48\x4a\x12\x78\x1d\x0e\xb8\x35\x83\xb7\xf2\x62\x93\x30\xe9\xe8\x81\x28\xeb\x38\x1c\x1c\xb6\x09\x43\xe4\x06\xae\x1d\x47\x67\xd3\x77\xd7\xf1\x69\x91\xd7\x01\x84\x73\x63\xfe\x6b\x7e\x1c\xfb\xd3\xda\x28\x44\x55\x5c\x23\xf1\xac\xe7\xec\x72\x16\x95\x84\x72\xa0\x6c\x08\xd8\xba\x76\xc5\x98\x5e\xc8\xed\x87\xf0\x10\x99\x49\x15\xf0\x3c\xaa\xcf\xc6\x94\x82\x90\x71\x29\x2f\x7f\x68\x28\x3b\xc6\x6b\xb1\xa6\x3d\x59\xee\x33\xa5\xa7\x86\xb8\x38\x53\x69\x2d\x2b\x23\xe3\xb2\x50\xc9\xdc\xe0\x28\x38\xb9\x37\xd3\x9b\x98\x4a\x58\x93\x93\xa2\x03\x9c\x47\xe5\x40\x1f\xbf\x28\xcb\xe5\x79\x9c\x25\xd0\x1b\xf0\x6d\x2b\xe6\x10\x5a\xe6\x59\x99\x4d\xb3\x84\xab\x9f\x5c\x4c\x59\x34\xcd\xb3\x02\xf3\x10\xf4\x20\x40\x2a\x5c\xb2\x0a\x70\x3f\xd8\x38\xc8\x6c\xef\x3a\x6e\xa5\x70\xd8\x79\x2a\xcb\x06\xe4\x9d\xf0\x66\x13\x99\x40\xab\x35\xb1\xaa\xf1\x6a\x86\x15\xf2\x40\xb2\x55\x87\xca\x6e\xc0\xc9\x36\xa1\xc6\xc8\xdd\x24\xee\x6f\x98\x7a\x22\xcd\x4c\xc1\xdb\x32\x2a\x8a\x0b\xed\x07\x67\xb9\x3e\xc4\xa0\xbb\x56\xe9\x32\x9a\x3e\x83\x1c\x74\xae\xa2\x99\xe1\x56\x5d\x52\x45\x03\xe8\x1e\xba\xc2\x3d\x63\x62\x76\x6a\x35\xf2\xbe\x16\x2d\x88\xe8\x3a\xf0\x13\x60\x64\xa2\x45\xb4\x51\xe8\x75\xb2\x66\x4c\x8a\x21\x0d\x26\x5f\xdb\x55\x9e\x87\xd2\xfd\xc2\x49\x48\x79\x0d\x73\x1a\x81\xbe\x51\x44\x59\x1b\x4b\xb4\xee\xa4\x8f\x38\x77\x60\x40\x1c\x25\xf1\xae\x03\xaf\x29\x7b\xda\x6b\x71\x81\x95\x23\x2e\x44\xdb\x8d\x26\x35\x14\x3a\x98\x64\x0d\x06\xd8\x6a\xc5\x3d\x49\x74\x81\x32\x3d\x8d\x4d\xa7\xed\x91\xa1\xd9\x2e\x78\xd4\x24\x31\xa9\x84\x30\x2f\x05\xad\x3e\x30\xdd\x9d\x9c\x0c\x6f\xe4\x50\x8c\x6a\x9f\x8d\xe9\x9e\x86\x4e\x20\x9c\x97\xf0\x05\x95\x2b\x38\x09\x24\x64\xd4\x07\x0f\x7f\x75\xf3\x17\x6c\xc0\x85\x60\x08\xa9\x09\x21\x02\x02\x01\x54\xed\x8e\x75\x17\xba\x41\x19\xc6\x10\xc5\x86\x6e\xa2\xd4\x6e\x54\x52\x31\x4e\x46\x42\xda\x90\xde\xa6\x4e\x8b\xcb\x50\x6e\xdb\x19\x22\xdc\xfb\xa9\xe7\x38\x6c\x6a\xe1\xaa\x94\x82\xc9\x2e\xa8\x15\x28\xba\xce\x14\x0b\xe8\x6d\xe8\x6d\x4e\x78\xdc\xc5\xe4\xb7\xb5\x0d\x40\x8e\xa2\x33\xcd\x8d\xd7\x3b\x04\x6d\x86\x01\x26\x55\x05\x85\x36\x60\x6f\xf5\xbb\xc8\x47\x9d\x41\xfa\x8d\xb9\x09\x20\xce\xda\x84\x7e\x70\x3e\x15\x80\x4b\xa5\x1e\x40\x28\xbb\x60\xdc\x17\x73\xc6\x70\x29\x71\x2d\x92\x8f\xe5\x25\x84\x00\x23\xce\x62\xd1\xd0\x3c\x1e\x41\x40\xc5\x93\x9d\x6c\x4f\x20\x9b\xe8\xd1\xbe\xa3\xca\x8d\xc0\x83\x41\x97\xb5\xaf\xb5\x43\x38\x62\x92\x98\x4e\xd8\x27\x3c\x0e\x38\x8d\x0c\x40\xc8\x72\xcc\x1f\x41\x3d\x88\x11\x34\x37\x01\x25\x06\xf0\xba\x6f\x61\x4b\xa7\x90\x3b\xf7\x60\xf3\xdc\xb9\x5f\x7d\xf7\x03\x90\xba\x9b\xb4\x49\x4f\x0d\x02\x22\x28\x4a\x63\x32\x80\xa6\x46\xc5\x0d\xfc\x62\xda\xca\xc0\x3d\x72\xea\x1e\xc1\xb4\x01\x96\x2e\x33\x2a\x6d\x57\x67\x46\x52\x65\x63\x9e\x92\x33\x99\x38\x6d\x30\xb5\xe5\x10\x58\xc7\x25\xb6\x78\xda\xd6\x0b\x9c\xc1\x5d\x72\x11\x17\xc6\xa1\xf2\x90\x49\x48\x69\x68\x1c\x56\x3b\x33\x01\x0e\x46\x9f\x2c\x36\x90\x27\x18\x54\x18\xb7\xdf\xb2\x29\x00\x23\x89\xe9\x0d\x10\x00\x89\x1c\x71\x7f\x4b\xc0\x67\x38\x15\xe9\xa9\xd8\xfc\x59\x5b\x1e\xf0\x60\x96\x58\x87\x86\xe1\x09\x38\xfe\xf4\xc0\x72\x24\x42\x37\x02\x25\x63\x80\xad\xda\xd0\x6f\x73\x8f\x9b\xa4\x21\x37\x12\x5f\xa0\xda\x72\x5f\x4d\x13\xec\xb4\x32\x23\x7a\x6e\x1f\x2c\x96\x47\x33\xa5\x3f\x07\xc1\x79\x56\xa7\x02\x2a\x1c\xe1\xb7\x44\x1f\x29\xcc\xa5\xe8\x1b\x92\x39\x07\x7d\x51\xe0\xfb\xe6\xee\x0c\x62\x5d\x7e\x07\x25\x66\x5b\xee\x90\x59\xd4\x86\x45\x4e\xd6\xc2\xc9\xad\xe0\x0e\x5b\x78\x9f\x07\xb4\xe7\x8d\x43\x15\x97\x6d\x5c\x49\xc8\xe9\x04\xd1\x02\x11\x15\xc5\x6a\xb1\x34\x6a\x22\x76\xe1\x54\x5d\x13\x4a\x7a\xa4\x6b\xf7\x1a\x3a\xf2\x48\xf7\xa6\xe9\x99\xa6\x1c\x16\x94\xea\xc9\x46\xd7\x7f\x69\xfc\x60\x42\xb3\xe3\xfe\x54\x81\x60\x55\x81\x15\x70\xcc\x4e\x33\xa0\xba\xd0\x3b\x52\x8b\xe3\xe0\x0e\x71\x70\xd1\x12\xc4\x2d\x0b\x5d\xa4\x22\x76\x6a\x2d\x66\xd4\x84\xb4\xf9\x3c\xf4\xd1\x6b\x88\xc1\xc1\x2f\x17\xf6\x6c\x31\xa4\xf1\x10\xe9\x46\x9d\xf2\x06\x88\xcd\xa6\x33\x55\x38\x21\xf6\x08\xfd\x3a\xb6\x10\x23\xd9\xf0\x1d\x76\xa7\xa5\xc3\x11\x7b\x5e\xe5\x8b\x50\xfb\xcb\x91\x41\x7b\xb0\x59\xe9\x36\xaf\xe1\x79\x60\x0b\x60\x42\x1c\x70\x40\x8c\xad\x15\x58\x86\xe1\x41\x79\xfd\x93\xc1\x9c\xd9\xb3\x59\xfd\xbc\xb2\x93\x90\x3f\x5c\x54\x29\xf4\xdd\x7a\x4f\x69\x69\xd7\x1a\xc4\xb7\xea\xad\xb6\x6e\x24\x2b\xc8\xc2\xee\xe3\xb4\x5f\xba\xed\xb7\xb1\x04\x68\x2c\x5a\xa5\xb5\x26\x57\x12\x44\xae\x25\xef\x52\x0f\xe9\x13\x3d\xe0\xbc\x8c\x41\x61\xb9\x65\x37\x81\x8c\xb0\x1a\x62\xc1\x8a\xbd\x67\x0d\x93\xd6\x12\x1a\x08\x43\xe0\x41\xb7\x13\x9b\x3f\x69\xde\xcf\x60\x73\x68\xcc\x35\xb8\x76\x2d\x19\xe4\x9d\x1a\xea\xc8\x59\x39\x59\x75\x2d\x05\x86\x83\x14\x51\xd6\x0e\x30\x0e\x41\x11\x8e\x39\xc9\x46\x52\x62\x72\xa8\x39\xdf\x16\x15\x8e\xc5\xfe\x80\x5c\x75\x3d\x3b\x3d\x69\x49\xb4\x69\xc9\xdd\xbf\x88\xd6\xac\x4a\x0d\xce\x04\xcb\xff\x5a\xf0\x03\x12\x96\x71\x7d\x83\x25\x1c\xaa\x0c\x1b\xd5\x1a\x43\x13\x40\x92\x16\xb9\x38\x90\x24\xb9\x81\xbb\x41\x76\x52\x6d\x68\x96\x6a\xb1\x2c\x9d\x22\x07\xf4\xc5\x6b\x2f\xc3\xd5\x7b\x9e\xc5\x33\x04\x69\x01\x1c\xcc\xaf\x06\xb2\x72\xd8\x6e\xbd\x47\x03\x0c\xcd\xcd\xec\x83\x7d\x0a\xde\x82\x61\xf5\xab\x96\xec\x28\x1b\x06\x89\x4e\xf3\x68\x79\xe6\x6d\x57\x3b\xed\x50\x38\x75\x71\x14\x2a\x03\xe5\x31\xed\xca\xa0\x93\xdc\x68\xd2\xb1\x7a\xa9\x2d\xf5\x80\x8c\x86\x17\x0f\xaf\x1a\x6c\x88\x12\x84\x20\x00\x3a\xaa\x6d\x6b\x34\x62\x6e\x96\xc2\xb6\x51\xaa\x3b\xbd\x8c\x93\x46\xbb\xcf\x2b\xfe\x49\x67\x7a\x22\xfb\x5d\xe8\xd7\xa0\x60\x97\x6f\x4f\xda\x30\x87\x23\x2c\x6f\x0f\x2c\xb6\xa8\xf2\xf0\x79\x14\x23\x0f\x90\x5e\x3a\x73\x4a\x12\xe2\xb5\xa6\x3b\x04\x10\xd4\x2c\x94\x6b\x93\x60\xd8\x17\xb5\xdf\xca\x4c\xde\x27\xe9\xf1\x68\x5e\x72\x35\x82\x2a\x0a\x9e\x9d\x87\x59\xae\x32\xe8\xf3\x5a\x17\xca\x57\xe9\x42\xe7\x8b\xc4\xa6\x0f\x82\xef\x88\x55\xd1\xf8\x25\x72\xd3\x97\x90\x82\x5f\x8c\xd6\xc0\x3c\xce\x8b\x12\xb5\xe1\x8c\xe3\x60\x4e\x34\xda\x63\xb2\xf9\xe6\xf9\x22\xb6\xf9\xb4\xc7\x2a\x4f\xdf\xe3\x72\x9b\x6b\xf0\xc1\x28\xea\xee\x37\xd6\x88\x80\xdf\xf1\x7a\x97\x50\x12\x53\x15\x2f\xcd\x4e\x89\x8d\x0a\x85\x18\xfb\x42\xec\x1b\x56\x17\xaf\x08\x73\x24\xd8\xf5\x58\x3a\xa4\x99\x80\xbd\x40\xd8\x3c\x58\x4c\x7e\x47\x30\xf8\xc1\xbc\x00\x3e\x53\x7f\x4b\x13\xfb\x4b\xcf\x6f\x8c\x95\x47\x37\xaf\x9e\x11\x80\xa1\x74\xc7\xd9\x19\xfe\x80\x6a\x87\x00\xae\xf7\xfb\xab\x28\x01\xff\x31\x33\x8c\x15\xa9\xba\xf0\xe9\x3e\x4d\xbe\xdf\x1c\xac\x3e\xfe\x76\xe7\x36\xee\xa6\x6f\x63\x7c\x6e\x09\x55\x36\xda\x53\x60\xf9\x67\x4c\xc3\x3d\xc1\xca\x2b\x0f\xdc\xcf\xd8\x3b\x37\x6b\x81\xf4\x58\xb5\x8a\xa8\x2c\x9f\x21\xdc\xc3\xa1\xc7\x83\x52\x34\x98\x0c\xc2\x8f\x50\xe8\x9d\x76\x1a\x27\x49\x84\x30\x64\xc3\xdd\x51\xcf\x75\x40\xa0\x1d\xec\x61\x4a\x0f\x44\x85\xc0\xc4\x13\xc8\xf5\x4d\x29\xbf\x73\x69\x0e\xda\x6d\x15\x05\x1a\x92\xf8\x99\xd2\x7b\xbb\xb5\x16\xd8\xb9\x8f\x4c\x17\x85\xd2\xec\xa1\x69\x86\xf9\x4b\x8f\xff\xc6\x85\xd7\xea\xfd\xb9\x00\x87\xdf\x07\xd8\x36\x1e\x52\x15\xd9\x22\x48\xc3\x50\x8d\x30\x3a\x7c\xc8\xfc\xe2\x94\xed\x30\x4d\x22\xd1\x8f\xd7\x47\xc0\x63\x2a\x9b\xac\x1d\xae\x17\x2c\x8e\xc3\x1e\x06\xdc\x58\xdd\x39\x27\x3b\x82\x0e\x29\xdb\x01\x35\x17\x1b\x69\x6f\x00\xe2\x2a\x25\x98\xc5\x1d\x3e\xee\xe8\x1a\xb2\x9c\xf7\xb3\x8b\xb4\x28\x73\x15\x2d\xe4\xd0\x60\x4a\x42\x81\xdc\x48\x66\xc3\xd9\x50\x13\xe4\x27\x3b\xfc\x03\x95\x86\x51\xcf\x01\x6f\x7b\xf5\x9c\x44\xe3\x35\x04\x54\x24\x1a\xb8\x5c\xf9\x76\x48\x90\x75\x04\x40\xd6\xc5\x0a\x53\x04\x60\x6e\xb9\xdd\xea\xaf\x02\x62\xbb\x24\x18\x85\xa9\xce\x71\x04\xfd\xd1\x96\x75\x0a\x71\x1c\x8b\xd1\x92\x5b\x75\x52\xd9\x52\x69\x09\xee\x91\xcd\xc9\xb4\xd0\xb4\x77\xb3\x34\x26\x0f\x44\xe4\xf7\x50\x48\x88\x15\x64\x2e\x1f\x54\xa0\x6d\x72\x9f\x33\x0e\x12\x8b\x45\xa1\x10\x68\x9a\xa5\x64\x94\xad\x26\x80\xea\xc2\x20\x8f\xff\x0c\x98\xa2\x2a\x3f\x45\x13\xdf\x25\x9b\xd2\xde\xcf\xe5\xcb\x14\x81\xbb\x8c\x7e\x4a\x65\xfd\xe3\x02\x01\x48\x6e\x4c\xdc\x94\xac\x0e\xe0\x7c\xaa\xde\x79\x79\x78\xab\x90\x32\x00\x7b\x24\x85\xbd\x40\x5c\x9c\x45\x25\x90\xe7\x9b\xad\x90\x11\xf4\x98\x01\xc1\x24\xf9\x7a\x0b\xb8\xfe\x66\x50\xe6\x87\x71\x13\xc8\x3a\xaa\xa2\x94\x67\xd1\x0c\x3d\x81\x55\x02\xb5\x13\x2e\x76\xd5\x50\x32\x1a\x03\x2b\x90\xcb\x64\xa5\xdb\x65\x24\x3b\xfd\x02\x81\x8d\xc0\x25\x8f\x90\x85\xa7\xea\x86\x36\x19\xfb\xc5\xfd\xfd\x59\x54\x88\xb8\xac\x50\xdc\x52\x59\x9a\x39\xdd\xd5\x7c\x9e\xe5\x65\x51\x31\x91\xc9\x9d\x06\xf5\xcf\x06\xbf\x97\x73\x61\x54\x08\x67\xda\x4a\x38\x6a\x36\x3a\xf5\x19\x0f\xd5\xd8\xcd\x84\x67\x3e\x59\xc1\xba\xe1\xf5\xc2\x2c\x55\xa5\x02\x99\x67\xeb\x28\xa1\xe4\x55\xe6\x60\xd2\x70\x49\x39\x4d\x69\x2a\x57\x17\x75\x86\x1f\xef\x8d\x69\x5c\x42\x34\x2c\x89\x4b\x2a\x8d\x74\x4c\x6b\x3d\xab\xf2\xac\x28\x6e\x41\x5c\x10\xdd\xd8\x15\x20\x36\xa1\x6e\x0f\x52\x31\x49\x74\x51\xac\xe2\xb2\xad\xd7\x8f\x3a\x35\x9e\xba\x63\x94\xd3\xc5\x76\x9f\x9e\xd9\xe4\x44\x80\x47\x51\x20\x0b\x44\xaf\x04\x16\x1e\x08\x38\xd1\x28\x21\x26\xdd\x05\x60\x8c\x28\x6e\x65\x29\xc9\xd0\xf8\xb7\xf0\x23\xa8\x98\xd0\x5b\xed\x4e\x28\x8f\x88\x32\x91\xf8\xce\x52\x0c\x11\x66\x79\x8b\xb1\x18\x15\x0b\x51\xaf\x27\x13\x6e\x05\x00\x7c\xc3\xe8\x55\xce\x65\x87\x15\xcd\xa3\x2e\x39\xb2\xdc\x8e\x50\x6a\x15\xda\x82\x22\x28\x62\x66\x42\x3c\x61\x41\xff\x94\x2f\xe7\x56\x6e\x15\x5e\xa3\x0d\xf1\x1b\x55\x4b\x78\xd7\x19\x5a\x16\xaf\xcb\x29\x71\xa4\xf7\x35\xef\xc7\x32\xbb\x20\x44\x11\xed\x8f\x89\x8d\x28\x38\x0f\xb6\xfc\xc1\x51\x82\xa4\x99\xd1\x94\x8c\x1a\xbd\xc8\x54\xae\xd0\xec\xe4\x9f\x06\x7c\x3c\xe8\xed\x01\x12\x75\x34\xda\xc6\xb8\x5e\x44\x69\xaa\x8d\x03\x5b\xab\x5c\x87\x12\xcf\x2b\x13\x03\xf6\x69\x9c\x1b\x86\x45\xa0\xd2\x25\x98\x83\xa1\xa3\x9e\x13\xc5\xf4\xa9\xb6\x49\x72\xa2\x84\x6d\x12\x24\x83\x22\x86\xe4\x38\x96\x11\x2f\xfb\xa6\x7a\x53\xe7\xdd\xc2\x88\x29\x3f\x82\xf8\xa9\x8d\x9a\xc2\xf7\x58\x66\x91\x80\x46\x31\x4b\x5a\xbe\x10\x30\x6f\x8b\xb8\x6b\xf0\x08\x15\x5c\x92\x8d\x22\x32\x11\xf5\x19\x46\xe4\x0a\xb8\xc4\x20\x48\xdd\x78\x00\xbf\x59\xd8\x23\xb3\x8b\xb5\x87\xb6\xbb\xd0\xe6\xc2\xd0\x0d\x84\x2e\x4c\x49\x7c\xa0\x67\x66\x32\xbb\x88\x67\x76\xbb\xb9\x85\xec\x2d\xd0\x2c\xb3\x1f\x79\x45\xe5\xce\x0c\xdc\x30\x01\x03\x26\x3d\x0f\x10\x1a\xa5\x07\x32\x20\x9c\xb3\x5d\xde\xb8\xb6\x2d\xed\x3e\xf2\x24\x5c\x62\x84\x28\xe6\x92\x00\x47\x64\xc3\xac\x08\x85\xe8\x55\x75\x9a\x11\xaf\x6f\x8e\x28\x08\x2e\xb5\xfc\xd0\x01\x6e\x0e\xe9\x9a\x03\x20\x32\x3a\xcd\x15\xa2\x0d\x28\x13\x1e\x97\x18\x5c\xa3\xd2\x29\x39\x53\x69\x46\x8e\x0a\x12\xc3\x03\x0c\x08\xc8\x1d\xc0\x89\x85\xa7\x6f\x1b\xd2\xb3\x94\x9f\x2c\xaa\x86\x2f\x91\xde\x9a\x7b\xe0\x7d\xe7\x2a\x8d\xb0\xe0\x10\x09\xcc\x29\x60\x8f\x57\xb8\x94\x87\xed\x10\x98\xff\x60\x90\x5b\x86\x0a\xdc\xfb\x36\x8c\xd3\xa1\x41\x61\x68\x19\x89\xb6\x1b\xe1\xdd\x1b\x3e\x76\xe3\x67\xb9\x35\xd6\xf0\xdc\x3a\xd2\xa8\x62\xab\x3e\x4b\x61\x28\xc0\x32\x4d\xd0\xde\x4e\x6b\x0d\x35\x00\xa2\x66\x5c\x81\xc7\xc6\x49\x08\x18\x1f\xae\x8b\xc1\x7c\xc3\xb7\xad\xa7\xb2\x9e\x2a\xa6\x5e\x77\x76\x75\xd9\x8d\xa5\x30\x34\xe8\x02\xab\x7a\x5d\x29\x09\x30\x07\x33\xe4\xfb\xf5\x95\x00\xeb\x88\x6d\x18\xc1\x04\x8a\x30\xf0\x69\x61\xa7\x82\x6b\xa0\x36\x20\x89\xca\x0c\x55\x8d\xec\xcb\x2d\x48\x14\x85\xaf\x90\xe0\x7a\x99\xc7\xe7\x4a\xfb\x53\x39\x00\x43\xa8\x8b\x26\x2a\x55\xf3\xb8\xb4\x30\x48\x6f\x3a\x18\x22\x70\x27\xd2\xc2\xdc\x59\x62\xfb\x8e\x79\x43\xf0\x5a\x5b\x91\xe9\x4a\xe1\x92\x2d\xd7\x1a\x01\x2e\x92\x71\x7e\x2c\xa0\x3e\x94\xad\x2f\x54\xe7\x4a\x4b\xe0\xb4\x35\xc1\x17\x4c\x8d\x48\x43\x13\x43\x84\xa2\xfa\x3c\xb0\xe2\xab\xfe\xcc\x22\x4e\x0e\x17\x2b\x5c\x8b\x5c\x13\xd1\x26\x9a\x5c\x1c\x56\xc1\x76\x61\x65\x5c\x53\xf1\xa0\xf0\xef\xc4\x43\x87\x57\xa8\x07\xba\x88\x67\x7a\xb3\x9c\x23\x75\x29\xf3\x16\x73\xd6\x92\x1e\x20\x7c\x85\x08\xb4\x5c\x71\x36\x24\xb1\x3a\x57\x16\x0e\x01\x4b\x2e\xd0\x67\x50\xb1\x8a\x52\x56\xe7\x42\x40\x74\xaa\x3c\x6e\x4e\x7d\xa2\x26\xca\x73\x22\xf4\x6a\xb1\x02\x6a\x81\x70\x4b\xd4\x1d\x4f\x18\x2a\x37\x96\x79\x36\x5d\xb1\x63\x75\xae\xd6\xe4\xf2\x06\xb5\x45\x0e\x75\xf6\x7a\x23\x12\x4d\x5b\x10\xd8\x02\x2e\x30\x17\x70\xa9\xda\x4d\xa9\x90\xb9\x90\x1b\x43\x26\x19\x8d\xd6\xc2\x00\x6d\x4d\xdb\xcc\x41\x61\xf2\x14\xfa\x5b\x99\x6c\xce\xf5\x8b\xbc\x66\x8a\x92\xa1\x55\x95\x36\xea\x3e\xc0\x53\x59\x9f\x05\x9e\x3b\x8d\xf3\x98\xe2\x3a\x1e\x89\x80\x68\x78\x05\x96\x93\x42\x32\xd9\x14\xdc\x83\x85\xda\xa9\xbe\x32\x2e\x64\x6b\x16\x17\xd3\x3c\x86\xa3\x24\xcb\xd7\x50\xf6\xd9\x44\xd1\xe6\xa4\xde\x8a\x69\xb6\x54\xf6\x0c\x44\x44\x76\x60\xf8\x47\x8a\xaa\xb3\x12\x10\x66\xd9\xc0\x7d\x2c\x07\x00\xda\x03\x78\xa5\x40\xff\xd7\x05\x09\x59\x2f\x47\x1a\x20\x90\xc7\x52\xb6\x99\x23\x2b\xf4\x3c\xac\x0d\x55\x98\x94\x51\xca\x95\x39\xa0\xa0\xce\xdc\x9d\x9b\x04\xe6\xf2\xf0\x8c\x9c\xde\xa3\xfe\x98\x68\x9b\x91\x20\x9c\xb6\xc8\x0f\x42\x61\x2c\xdf\x80\xed\x03\x43\x1d\xe1\x26\xfa\xf8\x5b\x46\x6b\x86\x24\x7a\xa9\x82\x72\xed\x13\x25\x10\x26\x89\xe3\xa7\xc4\x51\xa7\x67\x97\xb0\xf9\xbd\xd2\xe3\x88\x73\xde\x57\x7b\x36\x1a\x64\x81\xd1\xb9\x99\x5b\x00\x3a\x05\x56\x71\x13\xe1\x50\x5c\x6d\x7a\x71\x60\x35\x80\x1a\x1f\x77\xf6\x54\x0d\x37\x20\xc6\xac\x6f\x09\x7e\x9d\x9a\xf7\x6c\x03\x61\x45\x18\x8d\xd8\x46\x0c\x5b\x0c\x74\xb2\x33\x13\x45\xca\x0a\xa6\x04\x6e\xe3\xc1\x34\x69\xcb\x65\x1e\x53\x81\x27\x1e\xc6\x33\xff\xd5\x54\x51\xc6\xeb\xd3\x88\x10\xa0\xc9\xc1\x25\xc8\x05\x6f\x87\x58\x4b\x54\x5b\xbd\x94\x24\x81\x41\x54\x10\x0e\x98\x61\x29\x04\xcd\x4f\xbb\xa7\x49\x53\x56\xe9\xaf\xb9\x8b\xc8\xf8\xca\x81\x8d\xa9\xef\xbe\x25\x0f\xa3\x7c\x7a\x06\x12\x5a\x88\xf4\x39\x33\x8c\xa6\x4e\x68\xcf\xa0\xdc\x80\xce\x2c\x5f\x99\xcc\x1d\xb9\xce\x2e\x70\x06\x08\x6e\x16\x40\x83\x6f\x46\xc4\xd8\x0c\x33\x35\x37\xf1\x18\x8f\xc3\x9a\x30\x0a\x6b\xc7\x2a\x9e\x28\xc7\x08\x41\x65\xa3\x1a\x1a\xce\x7c\x26\x30\x2c\x69\x5f\x78\x37\x94\xfd\x4c\x8e\x8c\xf8\x4d\x36\x97\x03\x20\x15\xdb\x02\x25\xa7\x59\xb6\x40\xb3\xad\x42\x37\x87\xd1\x88\x19\xb1\x65\xc9\x6d\x76\x07\x81\x50\x6d\x05\x44\x25\x98\xa9\x60\xa3\xd1\x93\xd4\x6d\x0b\x33\x7e\x79\x34\x8b\x49\x15\xc1\x79\x45\x53\x2e\x6d\xcd\x6e\x9c\x7a\x3e\x5d\xd1\x4e\x6c\x4a\x84\x36\xdf\x0b\xf1\x36\xd2\x2b\xda\xbc\xc9\x68\x23\x0a\x28\xad\xb9\x70\xab\x88\x17\xab\xa4\x8c\x58\x64\x04\xd1\x72\x35\x8a\xa8\x46\x06\x0f\x54\x97\x58\xaa\xbc\x44\x42\x10\xe7\x36\xb2\xf5\x6a\xce\xe5\xba\xbe\x0b\xc6\xa5\x8c\x80\xa4\x23\x6c\x14\xf9\x81\x8e\x85\x4d\xc9\x26\xb9\xb9\x6c\x8d\xa1\x6d\x53\xed\xbe\x4f\x4b\x19\xb1\xdf\x06\xb8\x7c\x53\xbc\x68\x76\x25\x67\xb9\x92\x92\xa6\x6b\xa5\x57\xb0\x90\x28\x20\x2c\x48\xd8\x8c\x74\x1a\xb8\xd7\x40\x22\x86\x9e\x64\xf4\x12\x7c\x60\x19\xf9\xdb\x98\x46\x98\xe7\x51\x9c\x0a\x84\x47\x32\x5c\xcc\xdf\x2d\x2d\xb1\x8e\x9e\xad\x77\x42\x79\x5c\x38\xc2\x28\x8f\xfb\xc7\xb2\xa3\x5d\xc6\x6c\xb3\xf6\xc1\x6b\xc1\xf1\x8c\x71\xe5\x39\x62\x22\x89\xd3\x67\xb4\x17\x4d\xe2\x54\xd5\xb2\x0f\x6c\x4c\x35\x09\x1b\x54\x15\x1b\xc4\x95\x8d\xe7\xf2\x2d\x32\xcd\x2c\xdb\x84\x65\x19\x65\x44\x12\x51\xbf\xb8\x22\x01\x18\x56\xda\x04\xef\x4b\x12\x0f\x1e\xef\x12\x29\x21\xe8\xc6\x54\xac\xd5\x77\x57\x86\xb5\x32\xd0\xb9\x6e\xe1\xbb\x23\xb3\x41\x01\x2d\xb0\x29\xb5\x3b\x80\xed\x99\xaa\x1c\xf1\x74\x0e\x6f\xbc\x75\xb4\xc8\xab\x12\x88\x0b\xf0\x69\x9f\x74\xb7\x10\x78\x1b\xeb\x99\x68\xb6\xdc\x0d\xe5\x50\x9d\xc7\x7a\x08\xde\xf5\xf4\x59\xbc\xf4\xc1\xf8\x12\xd1\x3a\xc4\x96\x22\x11\x96\xcc\xe9\x59\x24\xcb\x94\xaa\x0b\x59\x91\x7d\x11\x97\x49\xdb\xc1\x22\x8b\x17\xb8\x68\xe3\x85\x0a\xe5\x48\x7b\xd6\xde\x63\xe0\xeb\xb4\x4f\x87\x94\x71\x40\xce\xbc\x8c\xf3\xd8\x98\x1f\x5c\xa1\xe5\x85\xb7\x50\xe5\x1a\x22\x27\x31\xd4\xf7\x45\x71\x02\x83\x8a\x5a\x19\xfa\x15\xc2\x48\xe2\xa0\x1d\xac\x3b\xdb\xe4\x90\x78\x66\xc6\x05\x51\x72\x82\xc5\xa0\x27\xd2\x2a\x2e\xe0\x80\xe3\x2b\xd2\xd5\x62\xa2\xf2\x1a\x80\x8b\xf1\x98\x8c\x04\x37\xf8\x5d\xbc\xde\x2b\xa0\x32\xb3\x63\x43\x3f\xb5\x08\xf9\x95\x44\xa5\x5d\x34\x2d\x23\xfe\x07\x6c\xeb\x81\x2f\x8f\x47\x28\xe6\x6c\xee\x85\x73\x9c\x2d\xc8\xa5\xe1\x24\xf7\x9a\x81\x51\xf5\x16\xe6\xcc\x0d\xe6\xb5\x80\x67\x81\x0d\x87\x6e\x9a\x33\xb5\xde\xb1\x18\x2a\xe8\x26\x7d\xf6\xd0\x43\x05\xbe\xfd\xea\x5e\xb1\xa9\x80\xe9\x59\xc6\x59\x08\x6e\x99\x3a\xd7\xc7\x0d\x37\x4f\x5e\xd5\x3c\x38\xce\x1b\x47\x8f\xcc\x23\xbd\x2f\x3e\x5f\xa3\x56\x95\x9a\xc6\xda\xad\x80\xbd\x00\xa5\x8e\xdc\x39\x2f\xae\x18\x4b\xfd\x08\xc2\xcb\x07\x86\xbd\xe2\x39\xe4\x91\xf0\x42\x83\xde\x02\x10\x94\x97\x2b\x8d\x6c\xcf\x3b\x99\x7d\x27\x06\xcf\x87\x1c\x76\x08\x3c\x9d\xbb\x95\xfd\x7b\x7b\x78\x1c\xc0\x58\xb2\x7d\x65\x3e\x41\xf7\x28\x64\xab\x08\xb3\xc6\x88\x2e\xa0\xe1\xe1\xba\x78\x17\x6c\x6f\xb2\xd8\x22\xcd\xbc\x1b\x1c\xd3\xa0\x62\x1f\x01\x6f\x15\x4a\xf9\x67\x0d\x68\x15\x48\xc1\xe3\xce\x6d\x69\x41\xf5\x37\xb1\xae\x24\x4c\x69\x48\xa6\x38\xd3\x91\x76\xb8\x7b\xa1\x41\x66\xe3\x34\x7a\x4a\xd8\x6c\xbd\xaf\x3d\xe9\xa2\x48\x75\x7f\xc0\xe2\xd1\x27\xa0\x0d\x3d\x7e\xd2\x95\x47\xc3\xc1\xe3\x61\xe7\x30\x90\xe3\x01\xfc\xbb\xfb\xc5\x71\xb7\x3f\x96\x47\xdd\xe1\x61\x6f\x3c\xee\xee\xcb\x87\x27\xb2\x73\x74\x74\xd0\xdb\xeb\x3c\x3c\xe8\x8a\x83\xce\xd3\x50\x76\xbf\xb8\xd7\x3d\x1a\xcb\xa7\x4f\xba\x7d\x39\xd0\x4f\x7f\xda\x1b\x75\xe5\x68\xdc\xd1\xd7\xf7\xfa\xf2\xe9\xb0\x37\xee\xf5\x1f\xc3\xf3\xf6\x06\x47\x27\xc3\xde\xe3\x27\x63\xf9\x64\x70\xb0\xdf\x1d\x82\xe0\xd1\x1b\x83\xa1\x80\x1b\x51\x9c\xba\x6b\xf4\xb3\xdd\x26\x19\x29\x6d\x16\xc4\x36\x6d\x1f\x3c\x02\x49\xed\x2f\xf4\xfa\xfb\x81\xec\xf6\xf4\x83\x04\xe9\x6b\x77\xf7\x1d\x85\xed\x40\x3a\xb2\xda\x0f\x8f\xc7\xb2\x3f\x20\x59\xed\xee\xbe\x1c\x0f\x36\xc9\x6a\x8b\x66\x59\x6d\x79\xa5\xac\x36\x76\x60\x7f\xdc\x1b\x76\xe5\xb0\x37\xfa\x82\xec\x8c\x04\x75\xeb\x6f\x1d\x77\xcc\x73\x8e\xba\xc3\x47\x83\xe1\x61\xa7\xbf\xd7\xd5\x9f\xe2\x7e\x72\x6f\x04\x5f\x2b\x4f\x06\xc7\xa1\x1c\x3d\x19\x1c\x1f\xec\xbb\xbf\x17\xba\x9b\xba\x72\xbf\xfb\xa8\xbb\x37\xee\xbd\xdb\x0d\xf4\x85\xb2\x33\x1a\x1d\x1f\x76\xa9\xb7\x47\x63\xe8\x9e\x83\x03\xd9\xef\xee\x75\x47\xa3\xce\xf0\x44\x8e\xba\xc3\x77\x7b\x7b\xd0\x0b\xc3\xee\x51\xa7\x37\x94\x83\xa1\xd8\x1b\x0c\x87\xfa\x29\x83\x3e\x4d\xa1\xfb\x21\xe2\xbe\x4d\x36\xe3\x80\xc1\xc6\x7a\xa7\xe8\xeb\xd9\xd3\x7d\x57\xcf\x8d\xe3\xfe\x81\xee\x86\x61\xf7\xb7\x8e\x7b\xc3\xea\x0c\x91\x07\x9d\xa7\x7a\x08\x3a\x8f\x87\x5d\xe8\x65\x77\x42\x3c\xed\x1d\x1c\x08\x3d\x74\xd5\x59\x11\xc0\x2d\xfd\x13\x69\x67\xc5\x89\x7c\xfa\x64\x20\x0f\x07\xfb\xbd\x47\x7a\x82\xe0\xac\x91\x7b\x83\xfe\xbb\xdd\x93\x91\xd7\x29\x9d\x91\x33\x5d\x3b\x0f\x07\xba\x5f\x1e\x76\xe5\x41\x0f\xda\x33\x1e\x40\x27\xe9\x41\xdb\xef\x1c\x76\x1e\x77\x47\xce\xb4\x80\x77\x92\x88\x72\x20\x47\x47\xdd\xbd\x5e\xe7\x00\xd4\xd8\x7b\xfb\xdd\xfe\xb8\x73\x20\xf1\x9d\xa3\xee\x6f\x1d\xeb\x81\xed\x1c\xf0\x43\x64\x67\xd8\x1b\xe9\x27\xe8\x99\x49\xa3\x78\x3c\xea\xc2\xec\xeb\xf3\xac\x19\x0f\x84\xfe\x99\x3b\xc2\xdb\xf6\xdd\xf5\x19\x29\x0f\x06\x23\x50\x75\xdf\xef\x8c\x3b\x12\x5a\x3c\xee\xc8\x87\x5d\x7d\xf5\xb0\xdb\xdf\xef\x0e\xbb\xfb\xa2\xd7\xef\xec\xed\x1d\x0f\x3b\x63\x78\x99\xbe\xa3\x3b\x92\xa3\xe3\xd1\xb8\xd3\xeb\xe3\x68\xe8\xef\x85\xe5\xdd\x1b\xee\x9b\x15\x06\x93\xf6\x51\xa7\x77\x70\x3c\xe4\x69\x27\xb8\x51\xe3\x81\x1c\x1c\x75\xe1\x91\x30\xfd\x9c\x91\xc0\x2b\x46\xed\x00\x06\x5f\xf6\x1e\xc9\xd1\xf1\xde\x13\x1a\x36\xfd\x50\xb8\x4e\xe0\x88\x3d\xe9\x8c\xe4\xc3\x6e\xb7\x2f\x3b\xfb\xef\xf6\x60\x2d\xd2\xf4\x1e\x8c\x46\x3d\xea\x93\x01\x3d\x81\xfa\x91\x26\xdf\x9b\x21\x0a\x58\x2c\x73\x65\x27\xe0\xa8\x56\x22\x62\xcf\xac\x99\xb7\xdb\x99\x4a\x14\x7d\x59\xe2\xcd\x62\x0b\x99\x37\x40\x67\x44\xca\xa2\x1b\x28\x26\x8a\x6c\x9d\x24\x9b\x46\x09\x15\x8f\x20\xa1\x2d\xa1\x93\x69\xff\xc5\xfa\x24\x82\xf8\x6a\x13\x50\x5d\x60\x94\x73\x95\x97\x4c\x84\x80\xf6\x28\x3d\x29\xba\x60\xe5\xcb\xa2\x94\xd3\x24\xc3\x9a\xcb\xa5\x3e\xf9\x80\x8b\x1f\x55\x81\x26\x45\x96\xac\x4a\x85\x7c\xbd\x68\x72\x68\x93\x3c\x3e\x8f\x13\x61\xdb\xde\x10\x96\xf1\xdc\x31\x06\x83\x7a\x35\x39\xb6\x18\x40\x78\x1d\x61\x8b\x8a\xab\x90\x10\x93\x91\x4e\x65\xae\xca\x55\xee\x12\x8a\xca\x6e\x5f\x0f\xe8\x06\xd9\xba\x27\xd9\x85\xee\xa4\x0e\x74\x00\x22\xaf\xc6\x0c\xfb\x3e\xd1\x47\x59\x5f\x5d\xf0\xe3\x0b\x93\xff\x21\x51\x18\x30\xeb\x2f\x2c\x37\x1e\x03\x10\x48\x6b\x98\xf2\x1b\xd4\xc6\x53\x28\x18\x2c\x4a\x80\x8a\x00\xcb\xc6\xaa\xa8\x09\x62\x61\x5e\xa3\x28\x91\xc2\x27\x93\xd1\xf4\x0c\x02\xe2\x06\xa8\x99\x19\x49\x41\x4f\xe0\x94\x8a\x72\x15\x2b\x9c\xa3\x2a\x81\x2f\xc5\xca\x0a\x9b\x26\x3b\x54\x58\x30\xf8\x98\xb0\x5c\x81\x8c\xca\x32\xa2\x70\x9e\x35\x46\xb9\x28\xc9\x18\xf1\x84\xdb\xeb\x41\x80\xb2\x88\xe6\xba\xc9\xba\xb9\x70\xb3\x89\x64\x97\xc8\x55\x81\x15\x10\x00\xf8\x71\xd0\xef\x28\xf7\x51\xf8\xda\x88\x60\x4f\x51\x38\xd2\xe1\xdc\x33\x2c\xb7\xc8\x8e\xa0\x9f\x04\x8f\x20\xa1\x48\x4c\x97\x58\xe2\x32\x25\x5b\x53\xab\x17\x98\xa0\xa3\x3b\x93\x91\x58\x66\xe0\x9c\x61\x94\x80\x89\x66\xe6\x2b\x43\x24\x0a\x7a\xa6\xda\xd2\x0c\x85\xf8\xac\xee\x47\xb8\x97\x29\xca\x9c\x4f\xdf\x2a\xa0\x8e\x07\x1f\x2b\x27\x79\xac\xe6\x32\x9e\xa1\xf0\xe8\x05\x15\x73\x68\xb3\x39\xfc\x9c\xab\x5d\xbf\xbd\xd7\x96\x9f\x5d\xab\x28\xff\x9c\xfc\x2c\xdc\x9e\x71\x0d\xdc\xe7\x04\x6a\x1f\x38\xb2\x99\xde\xf8\xbe\x63\x14\xab\xbd\x51\x8d\xcb\x9a\xc6\xae\x41\xc6\x78\xae\xf3\xa5\x56\x6e\x54\xc8\xcb\xad\x6f\xe1\xaa\xa0\x93\xff\x51\xd3\x6f\x3c\x70\xd0\xfe\xdb\x7e\x7d\x66\xdb\xba\x23\xc2\xda\x7f\xd5\x0f\xb6\xdf\x65\xca\x0b\xce\xb2\xa5\x32\xc5\x31\xec\x5b\xae\x0a\x35\x5f\x25\xe8\x39\x92\x8d\x05\x87\x33\xdb\x59\x0f\x4c\xf9\xa9\x3a\xa7\x1c\x08\xc5\x27\x9d\x5d\x66\x5e\x33\x95\xb2\x9c\x2d\x25\xb1\xd9\x52\x1a\xa9\x6b\x4a\xc0\x83\x48\xaf\xf6\x63\x19\x85\xe5\x4e\x55\x83\x26\xf6\x77\xb1\xcb\x86\xc8\x14\xff\x88\xd2\xe9\x36\x70\xd5\xd2\xac\x0c\x64\xa1\x94\xfc\xec\x59\x59\x2e\x8b\x77\xde\x78\xe3\xe2\xe2\x22\x3c\x4d\x57\x61\x96\x9f\xbe\xc1\x88\x8b\x37\x3e\x07\x95\x52\x05\x58\xfd\x1e\xcd\x47\x96\x22\x25\x04\xf2\x0d\x44\x28\x24\xad\xe7\x81\x4a\xd4\xb4\xcc\xb3\x34\x9e\x22\x4a\x21\x5a\xaa\x5c\x2e\xa2\x38\xb1\xc7\xd9\xd2\x75\x11\x09\xd4\x9c\xb8\x11\x90\xc0\xec\x57\x24\xbf\x11\xe9\x9e\xc8\x99\x65\x18\xa0\xb7\xf8\x49\xc0\x05\x10\x97\xb8\x61\x14\xc4\xab\xe9\xd2\xb4\x2e\xb2\x99\x7a\x47\x88\xcf\xd2\x3b\x3f\x27\x5f\x67\x61\x21\xa7\x2f\x1c\x44\x9d\x87\xa3\xc1\xc1\xf1\xb8\x7b\x70\xe2\x7a\x18\x0f\x60\x00\x69\xec\x64\xb9\x5e\x2a\xf9\x7b\x20\xd9\x7d\xb1\xc5\x73\xb6\xba\x38\xed\xc6\xaf\x3d\xa7\x0b\x95\x4c\xb3\x05\xc5\x07\xfd\xb5\x8a\x3b\x2f\xc5\x16\x1c\x9f\xfe\x81\xfb\x9e\xe9\x96\xdb\x02\x8a\xef\x9c\xad\x97\x59\x79\xa6\x20\x53\x67\x84\xe7\x4c\xc3\xe0\xfd\xe6\x6e\x9a\x69\xac\x33\xee\x56\xfc\x0a\x8f\x6b\x74\x43\xc4\x51\x0e\xe6\x60\x1d\x98\x84\xb2\xdd\xf3\xcc\x9b\x17\x50\x35\x3c\x51\xd6\xcb\x7c\x40\x47\xee\xe3\xe3\x9e\x25\xd4\x25\x4a\x7f\x68\xcf\x0a\xbc\x7e\xd9\x8a\x26\x7a\x69\x4e\xb2\xe7\x2d\x7f\x65\x00\xa2\xf3\x54\xd1\xc6\xa1\x16\xcb\x24\x5b\xab\x1c\xea\x84\xf1\x21\xac\x89\xc6\x2a\x6e\x2a\x6f\x03\x88\x55\x3b\x9b\x49\x20\x50\x65\x0b\x12\x4e\x45\x7c\x9a\x22\xe5\x15\x4f\x10\x6b\x76\xb5\x6c\xf2\xdc\x50\xda\xce\xa5\x95\x7e\x90\x8f\xb2\x5c\x60\x26\xdb\x5f\x23\x28\xcf\x4b\x2a\x82\x36\xe4\x08\xd5\x29\xe8\xe2\x96\x56\x93\xfd\xba\x0b\x72\x7c\xf9\xb2\x37\x91\x17\x44\x95\xb9\xe4\x58\xa8\xc3\x6e\x06\x47\x20\x4d\xb5\x95\x16\x36\xda\x54\x9c\x3f\xc8\xdd\xbd\x36\x92\xc5\x6a\x92\x67\xab\x32\x86\x43\x8e\xd8\xc7\x28\x46\x23\xb8\x44\x52\xcf\x59\xe8\x0a\xdc\x72\x01\xc9\x83\x0d\x49\xe2\xf4\x19\x16\x36\xdb\x17\x52\x96\xa6\xa4\x40\x20\x9a\x7a\x82\x1e\x4e\x41\x25\x5c\x3d\x17\x9c\xfe\xbf\xa0\x9c\xfe\x2c\x0b\x3c\x55\xfb\x03\x55\x14\x2a\xaf\xf4\x8a\xb0\x51\xe5\xa2\x54\xd1\xac\x9e\x28\x79\xb8\x2a\xb1\x8c\x25\x90\x4b\x20\x2a\x07\xcc\x4a\xf3\x30\x08\x03\x45\x7b\xe3\xe2\x6c\x7d\x2b\xcd\xca\x5b\xc9\xe9\x32\x09\xcf\xca\x45\xf2\xb9\x50\x7c\xe6\xe6\xcf\xc7\xf4\x27\x7c\xe3\x8b\xa3\x67\x51\x19\x96\xcf\xcb\x8f\xed\x1d\xb7\x6f\xdf\xbe\x7d\xff\xfe\x5d\xfd\xdf\x9d\x37\xef\xdd\x76\xff\xab\xff\xec\xdc\xbe\x73\xff\x33\x3b\x77\xee\xef\xde\xbe\x7d\xf7\xcd\x9d\x7b\x3b\x9f\xb9\xbd\xb3\x7b\xff\xde\x9b\x9f\x91\xb7\x3f\xb6\x16\x39\x7f\x56\xfa\x84\x93\xf2\x33\x49\x34\xcf\xe3\x67\xc5\xc6\xeb\xae\xfa\xfd\xaf\xe9\x9f\x4b\xed\xdc\x07\x1b\xed\x5c\x7d\x59\xb2\x0e\x85\x38\x2e\x14\xe5\x16\xd1\xc2\xbc\x48\x65\x1e\x17\xcf\xa0\x98\x14\xe5\x66\x9d\xd3\x3c\x14\x62\xa8\x3c\x4a\xe4\x6c\xde\x50\xea\xee\x69\x0c\x35\x14\x16\xb3\x23\x24\xea\xa2\x65\xef\xb0\x5e\x6b\x27\x71\x44\x9d\xe4\xff\xec\x26\xde\xd8\x7d\x02\x86\x64\xa4\x82\x50\x33\x16\x68\x8b\xda\x72\x90\x26\x6b\xf2\xce\x0a\x5b\x5d\x85\x58\x48\x52\xf3\x04\xbc\x12\xa1\xc4\xe1\xcd\xc8\x7c\x26\x25\x50\x05\xec\x86\x93\x36\x39\x63\xc0\x4b\xca\x9e\xd4\x0c\x80\x16\x89\xf6\x8a\xf0\xf1\x33\xdf\x7f\x1b\x3b\x26\x1c\x54\x1d\x6a\xe3\x09\xe8\xd8\xa0\x28\xcf\x4b\x9a\xe8\x0b\xc8\x70\x00\x22\xf1\xe7\xe1\x3a\xfc\x72\x40\x7e\xd4\xf3\x70\xcd\xa9\x36\x3f\x53\x22\x4c\x1d\x0e\xbf\x47\x1f\x98\x5f\x26\x0d\xd8\x28\x9f\xc4\xa5\x3e\x1e\x90\x66\xee\xf9\xcd\xbe\xfb\xe9\xff\x13\xbe\xf1\xdb\xf1\x62\x92\x47\xb7\x76\xc2\x3b\x1f\xd7\x21\x70\xf9\xfe\xbf\xbb\x73\xe7\xcd\x37\x2b\xfb\xff\x9d\x3b\xf7\x77\x6f\xf6\xff\x4f\xe2\x0f\x8e\x7e\x2d\x3f\x48\x09\x6e\xb9\x13\xde\x91\xdb\xbf\x7d\x74\xd0\x26\x67\xab\xf1\x72\xb9\x0d\x86\x5f\xab\xc3\xe8\x9c\x56\x1b\xad\x5a\x0c\x83\x5a\xd0\x0e\xea\x79\xa8\x62\x9a\xc7\x13\xd2\x97\xc1\xa8\x88\x0b\x5d\x7b\xf7\x10\xbd\xb8\x5e\x3a\x0d\x03\x19\xc9\x7d\x95\x44\x17\x48\x15\x62\x99\x68\x49\x8a\x10\x74\x57\xf2\x38\x9d\xc6\xcb\x28\x11\xc8\xda\x94\xcd\x2d\x38\x2f\x2a\xe5\x9d\xbb\xb7\x77\xe4\x93\x38\x49\x40\x66\xbc\x73\xae\xd2\x95\x0a\xe4\x51\x94\x64\xb2\x93\x94\x59\x20\xf7\xa2\x24\x9e\x67\x79\x1a\x47\xf2\xed\xbb\x77\x6e\xdf\x95\xdb\x2d\x6c\x42\xab\x8d\xf0\x00\xc3\xf5\xc7\xd9\x4f\x42\x43\x9d\xc7\x11\xe0\x89\x93\x0c\xab\xd5\x2c\x76\x6a\xbb\xc5\xb1\x9a\x56\x3b\x94\x0f\xd7\x58\x60\x02\xdf\x3b\x32\x5e\x2a\x82\xe9\x52\x97\xcb\x9d\x14\x7a\xb1\x3e\x6f\xbb\x75\x92\xad\x5a\x6d\x07\x9a\xe3\x12\x1f\x41\x8f\x9b\x0e\xc7\x0a\x04\x76\x14\xbc\x4a\x92\xc5\x0a\x70\xcb\x20\x28\x54\x10\xe7\xde\x6a\x49\x28\x43\x8b\xaa\x71\x95\xfb\x14\x40\x9a\xcb\x33\x14\xef\x0b\x3c\xf4\x2c\xb6\x26\x2a\xe8\x14\x2e\xcc\x81\xfb\x18\x50\xac\xd9\xdc\x89\x03\x70\x1d\x93\xd8\x09\x77\xe4\x2d\x39\x72\xeb\x38\x9b\xdf\x6d\x9c\x08\xf3\x65\x01\xcd\x07\xa8\x02\x9a\xac\x05\x55\x96\x60\x3c\x38\x70\xc4\x0a\x59\x8a\xc7\x40\x54\x4d\x7d\x2e\x17\x15\xc6\x29\x83\x5c\xbc\x81\x10\x91\x57\x87\x12\x54\xeb\x55\xf4\x3f\xb9\xd4\x13\x99\xa1\x2c\xbe\x18\x31\xff\x18\xed\x0b\x58\x29\x3a\x10\x44\x18\x8b\xfe\xa9\x63\x38\xb9\xef\x85\xdf\x1d\xba\xf2\x57\x58\xe0\x83\xf1\x67\x53\xe4\x23\xaa\xdd\x01\x18\xa1\x33\x42\xe3\x07\x26\x69\x0c\xff\xd0\xf3\x67\x92\xc7\xb3\x53\x8f\xc2\xc4\xc4\x0d\x01\x4c\x39\x59\x43\xdd\x2c\xac\xcf\x96\xfb\xfe\x07\x2d\x2b\xd1\x03\x55\x89\x71\xa2\xb0\xc4\x76\x56\xeb\x34\x41\xca\x3c\x2c\xae\x42\xc8\x49\x97\xbe\xcd\xfb\x56\x2e\x9d\xf0\xdf\x18\xb6\xf4\xd4\xd8\x95\xb7\xb4\x37\xca\xc5\xbc\xfe\x8a\x88\x50\xcb\x30\x4b\x49\x40\x93\xcb\x5b\xed\x4e\xc0\x0b\x4f\xe0\xb2\x09\x30\x4f\xe0\x00\xe7\x4d\x23\x88\x0f\xe1\xd0\x23\xb7\x04\xc6\x63\x9e\x96\x70\x2b\x6e\x2d\xb0\x58\x09\x1e\x80\x10\xe1\x49\x9c\xce\x48\xb9\xd0\x7f\x3d\xd7\xd3\x66\x95\xa9\x0b\x82\x95\x58\xcf\x2b\x08\xce\x8a\x2e\x7b\xc1\x2e\x79\x9c\x5e\xf6\xc0\xd8\x74\x2e\x33\x24\xb9\xa6\xb3\x98\x37\x55\x83\xb9\x3b\x82\xde\xbb\x6f\x99\x39\x75\x69\x37\x9c\xa0\x46\xa2\x31\xf0\xeb\xe4\x94\x51\x19\x88\x13\x5f\xe6\x14\x0a\xdb\x36\x15\xb7\x78\x33\x76\x66\xb5\xc0\x08\x5a\x2e\x50\x57\x3d\x51\xc4\x7b\x57\xbf\x0f\x63\x16\x27\x28\x94\x6a\x3f\x3b\x94\x4f\x7d\xd5\x47\xf1\x7a\x1f\x73\x59\x93\x2b\xa8\x30\x58\x2e\x35\x3d\x07\x07\x94\xc8\x17\xd2\x4e\xe5\xca\x52\x8a\xca\xc2\x09\x65\x2f\x65\x05\xaf\x2c\x9f\x15\x01\x06\x5a\x79\xf2\x7b\x48\x72\x6f\x73\x70\x4b\x6c\x9d\xbe\xd5\x37\xb6\x00\x8b\x68\x9a\x78\x96\xa9\xa2\xa5\x3f\x8a\x9a\x13\xa7\x7e\xea\x81\x2a\x88\x4f\x4c\xe5\x81\x09\xa2\x6d\xda\x94\xbd\x9e\x60\xbe\x65\xda\x05\x91\xa1\x03\x86\xa9\xb2\x99\x55\x81\x92\xe4\xaa\xa8\xd3\x0c\x6a\x2e\xcd\x77\x7b\xcd\x17\xd5\xe6\x07\x5e\x95\x7f\xe1\x1f\x21\x5f\x5a\xe5\x71\x31\x23\x46\x2c\x0b\xbf\xc4\xae\x1a\xb1\xa2\x1b\x33\xeb\x93\x2b\x87\xfa\xf9\xb3\xb8\x58\x82\x2c\xb4\x83\xbc\xb5\x73\x8f\x4a\xa1\xf0\x6d\xa2\xe9\x6d\xd9\x5c\xce\xd5\x0c\xe2\x61\xcc\xa7\xc4\x49\xdc\x6c\x2e\xd3\x0c\x40\xb1\xa9\x63\x5c\xc0\x82\xbc\xfb\xfa\x0b\x92\x0e\x17\xb4\x34\x1c\xa9\x7e\x9e\xcf\x66\x85\x41\xe4\x96\x6d\x16\x47\x35\x04\xb1\xa4\x9e\x74\x89\xd9\xce\xb3\xbc\xb2\x2d\x36\xad\x19\xe9\x71\x9e\x5d\xb1\x7c\x43\x08\xa6\x56\x7d\xfd\xea\x77\xfb\x53\xbc\xf1\x2b\x51\x19\x86\x5a\xc0\x8c\xa9\x78\xea\x5b\xcd\x6b\x9a\x81\xd3\xb3\x0c\x48\x98\xfd\x98\x01\x4f\x20\x7a\x3c\x71\x41\x6c\xd0\x91\x76\x76\xef\x5e\x6a\x4e\x57\xa7\x7b\x21\x81\xc2\xf9\xf6\x64\x8d\x1e\xbe\x30\x85\xe8\xc6\x38\xb0\x5b\x03\x65\xfe\x61\xa7\xdf\xf4\xf1\x64\x1a\x43\xf8\x9e\xa9\x15\xbd\x19\x09\xf7\x90\x90\x06\x1d\xe1\x7a\x38\x94\x21\xac\x99\xac\xcd\x8a\xc1\x25\x1a\xa1\x7e\x9c\x48\xaa\xd1\x6b\xa6\x19\x70\x27\x07\xbc\xb2\x2e\xba\xcb\x7b\x0a\x8a\xda\xc0\x5c\xa8\x4c\x1d\x53\x8d\x63\xde\xdf\xbc\xa2\x2c\x45\x0f\x2f\x74\x67\x7e\x51\x55\x8a\xd7\x21\xce\x73\xe1\x63\x0b\xe3\x38\xc0\x5e\xc1\xab\x5b\xbb\xad\x7a\x65\xdd\x93\xb7\x50\xaa\xc8\xbe\xd2\x7c\x30\xaa\xd2\x9d\x18\xea\x1f\x88\x71\xdb\xc5\x05\xec\x6d\xa6\xd6\xc8\xc2\xc7\x4f\x38\xa0\x05\xc9\x8e\xed\x38\x54\x21\x6f\x25\xb6\x02\x9c\x4e\x6e\x52\x66\xf5\xc4\x49\x84\x67\xea\xf1\x16\xe6\x4d\xf9\xb6\x63\xc0\xe2\x8c\xd1\xdf\x8a\x18\x44\x8e\x48\xc9\x11\x72\x8c\x0b\xc1\x96\x70\xa4\x3f\xcb\xc1\x08\x7a\x42\x4e\x6a\x7a\x96\x42\x5e\xca\xd1\x78\x65\x1e\x72\xdc\xc2\x61\x6b\x3e\xd3\x56\x09\x17\x9a\xd8\x3e\x33\x7b\x24\xbd\x0b\x2a\x71\x4b\x94\x7d\xcc\xbc\x09\xce\xc7\x33\x57\xc1\x92\x6e\x8c\x22\x73\xb4\xb2\xd8\x8d\x86\x77\x2f\x2d\x15\x94\x11\x68\xeb\xee\x88\xf5\x4c\x50\xc1\x5b\x88\x3b\xe0\x28\x74\x91\x1a\x8e\x33\x43\xfc\x46\xcb\x13\xe7\x57\x80\xb9\xa6\x3e\xcf\x0b\xed\x72\x68\xd3\x9d\x26\x5d\x60\xa9\x48\x90\x4a\x7d\xa2\xa2\x1c\x05\xcd\xdd\x39\x0c\xa4\xb9\x6b\x19\xe5\x31\xf2\x26\xb1\x58\xba\xa8\xd9\x76\x86\xb0\xc0\x34\x0a\xa8\x7d\x20\xb3\x3d\xe5\xd4\xfc\xf3\xb3\x68\x55\xd0\xdf\x8b\x32\x5b\x2e\x55\x22\x5c\x3f\x11\xa3\x94\xdc\x42\x87\x0a\x23\xc1\xa4\xad\xe9\x27\xa3\xfb\xc2\xd7\x02\x07\x2f\xcf\xa8\x4d\xfd\xd2\xb0\x83\xa0\x13\x25\x9d\xa0\xe7\x1d\xb4\xbf\x53\x96\x93\x5f\x37\x6d\xd3\x64\xda\x7b\xeb\x13\x22\xc3\x00\xa2\xb1\x9b\xa3\x40\xd2\x7f\x98\xef\xb9\x22\x29\xdf\xc0\x73\xcf\xcc\x60\x05\x54\x3c\x14\x58\x9a\x56\xdc\xb9\x1c\x82\x5d\x61\x90\x2e\x5c\x08\xe8\x73\x79\xbb\x1e\x86\x63\xa0\xa1\x56\x66\x81\x55\x3e\xd1\x72\xa9\x10\xfa\xee\xdb\x61\x98\x3b\x76\x69\x12\xaa\xb4\xc0\x4e\x43\x4c\xcc\x38\x4e\x45\xe9\x28\x10\x5b\xda\x58\x28\xc2\xca\x4e\x33\x6a\xab\x7a\x1e\x17\x25\xdb\xf8\x51\x45\x39\xb5\xba\x3f\xc0\x30\xdc\xe1\x0d\xac\xb6\x5f\xa3\x95\xa6\xfb\xd8\x0a\x86\xaf\x08\xb4\xcd\x44\x3a\x69\xb4\x50\x01\x34\x00\x68\x2c\x5c\x3a\x5b\x22\x5a\x34\x14\x5d\x36\xbb\x8a\x1e\xec\x42\x1b\x77\xb0\x9a\x79\x4f\xbd\x13\xee\x1a\x89\xf1\x46\x3c\x70\xac\x0a\x00\x04\xcb\xd1\xe0\xd1\xf8\x69\x07\x71\xc1\x04\xbe\xdd\x37\x88\xdb\x4e\x7f\xff\x52\xd4\x6d\x28\xdf\x3d\xd4\x37\x8b\xc3\xce\x17\xba\x2e\xae\xb8\xd7\x1d\x05\xf2\xe9\x93\x2e\x60\x07\x09\x92\x1b\x58\x38\xee\x60\x08\x28\xe1\xe3\xf1\x60\x78\x22\x87\xdd\xc7\x9d\x21\x00\x21\x07\x43\x39\xec\x1e\x74\xc6\xbd\xfe\x63\xc6\xcb\x72\xf3\x42\x04\x65\x3e\xea\xed\x75\x0e\x0e\x4e\x02\x7a\xaf\xdc\x1f\xc0\x6b\x4d\xeb\xe4\xf8\x49\x67\xec\xdd\x88\x58\xd3\x87\x5d\xd9\x1d\x0e\x07\x43\xf9\x68\xd8\x05\xb8\xa4\xfe\x29\x03\x70\x65\xaf\x2f\x3b\x7d\x79\xdc\xef\xf5\xc7\xdd\xe1\xf0\xf8\x68\xdc\xdd\x97\x87\x9d\x7e\xbf\x3b\x0c\x19\x0e\xfd\x78\xd8\xed\x8c\xbb\xa3\xb1\x20\x5c\x74\xe7\xe0\x60\xf0\x14\x51\x96\x07\x9d\xa7\xa6\x3d\x6e\x23\xe5\x7e\x6f\xb4\x77\xd0\xe9\x1d\x8e\x00\x86\x7b\x2d\x7c\x71\x70\x25\xb8\x58\x6e\x33\xfe\x92\x5e\xf9\xa4\xb3\x0f\x58\x4b\xd1\xeb\xeb\x8f\x41\xb0\x25\x20\x2b\xe9\x8e\x76\x00\xe3\xd8\x1f\xf4\x7b\xfd\x47\xc3\x5e\xff\x71\xf7\x50\x7f\x01\x00\x3c\x87\x5d\xdd\xe2\xb1\xac\xf4\x76\x00\xf8\x1f\xc4\xdc\xee\x75\x00\xd9\x27\x01\x3d\x3e\x1e\x98\x39\x51\xbd\x17\x40\xaf\x08\xf3\x7c\x34\x18\x76\x1f\x0f\x7a\xfd\xc7\x46\x7c\x7c\x03\xa0\xd8\xc7\x13\xc3\x98\xd0\x57\x59\xdc\xee\x23\x42\x04\xef\xf7\x86\xdd\xbd\x71\x20\x7b\x7d\xfb\x37\x46\xe7\x3a\x90\xdd\xee\x17\xbb\x87\x47\x07\x9d\xe1\x49\xb0\x19\xb2\xeb\xcc\x60\x17\x87\xcb\x33\x1d\x70\xb8\xf0\xd5\x82\x71\xb8\x47\xc3\xc1\xa3\xde\x78\x14\x18\x60\xee\xf1\xa8\x1b\xc8\x87\xc7\xa3\x1e\x0c\x96\x99\x38\xbd\x41\x3f\xf0\xc0\xbb\x01\x43\xb1\xc5\xde\xe0\xdd\xee\xb0\xad\xe7\xda\xde\xa0\xdf\x47\xc4\x35\x76\xa4\xfe\x40\x1f\x44\xec\x2c\x04\xee\xde\x47\xc7\xc3\x7e\x6f\xf4\xa4\xd7\x7f\x1c\x08\x0f\x38\x3e\x74\x7b\xde\xcc\x7a\x0f\x46\x0d\x08\xeb\x91\x7c\xac\xe7\x5d\x77\x5f\xea\x81\x3c\xee\xef\x77\x87\x81\xe0\x25\xda\x39\x38\xe8\x3e\xee\xee\xcb\xce\x48\x76\xe4\xc3\x61\xb7\xb3\xf7\x44\x3f\x72\x6f\xd0\x1f\x0f\x3b\x7b\x63\x40\x11\x0f\x86\xe3\xde\xe0\x78\x04\x68\xcf\x63\xea\x7f\xea\xb9\x7e\xf7\xf1\x41\xef\x71\xb7\xbf\x07\x33\x67\x5f\xd6\xa6\xe8\x6b\xc2\x81\xef\x23\x43\x2d\x1c\x2a\x0e\x27\xa5\x10\xf7\xc1\xca\x18\x57\xc3\x0d\x6e\x0d\x5b\x9c\x32\x7a\xd7\x12\xa4\x4a\x22\x48\xb5\x64\x91\x2a\xca\x93\x18\xaa\x65\x2c\x21\x02\x9c\xba\xbc\x93\xde\x0f\xf5\xdb\xe8\x84\x05\x1c\xe5\xb9\xa2\xbd\x9c\xe4\x50\x2e\x0f\x9d\x90\x15\xa6\x8d\x12\xf3\xda\x7a\xe8\xf7\x3e\x1c\x1e\xda\x96\xa8\x91\xd2\xea\x03\x9f\x18\x27\xa1\x88\xd8\x92\x6c\x7a\x31\x60\xee\x9a\x06\x2f\xc8\x65\xf3\x64\xcc\x5f\x9c\xba\x71\x47\x38\x88\xe8\x68\xc2\x93\x7f\xa1\x66\xfa\x88\xf0\xb4\x4f\xe8\x53\x22\xa8\x16\x86\x28\xd7\xef\xb3\x44\x52\x93\xb9\x02\x9f\xa5\xdd\xe5\x0a\x9b\x68\x2d\x48\x84\x68\x51\x52\xa1\xe1\x7c\x2a\x06\x02\x0a\x52\xbc\xd0\xa6\x6e\xe5\x6c\xa7\xe6\x6e\xdb\x23\x6f\xa7\x1d\xb8\x77\xce\x1c\x85\x02\xb7\xbe\x1a\x3f\x63\xab\x70\x50\xd5\xdb\x06\x61\x4e\x8a\xcd\xed\xc0\x6b\xb5\x79\xc9\x7d\x40\x48\x1d\xc6\xc5\x54\x25\x09\xd6\x02\x9b\x5f\x8a\x37\xdb\xec\x5c\x38\xad\x80\xcf\x63\xae\xec\xf2\xb2\x9e\x30\x62\x2f\xde\xe3\x29\x6b\x63\xfb\xcb\xb0\x8a\x97\x56\x47\xc4\x29\xaa\xf6\x99\x32\x2e\x2a\x91\x36\x30\xb0\x28\x02\xb3\x88\xca\x92\x4b\xcd\x7c\x33\x13\xa2\xa4\x4b\x95\x17\x6a\x46\xb1\x16\xc3\xd8\xe7\xa9\xfb\x14\x81\xf0\x15\x0d\x0a\x0a\xe7\x73\xc4\x88\x88\xe5\xf9\xc9\x85\x01\xbb\x66\x14\x75\x21\x66\xeb\x40\x4e\x54\x79\xa1\x14\x9a\x66\x1b\x1a\x2f\x8b\x28\x9e\x55\x5a\x8f\x19\x77\x36\xf2\x8b\xb3\x78\x59\xe9\x01\x61\x97\x4f\xcc\x45\xd1\x73\x4f\x09\x9e\x59\xf3\x81\xd0\xd2\x54\x27\xd7\xe7\xa7\xa8\x56\xef\x83\xe9\x4c\x4c\x8f\xd1\xa9\x4a\xa7\xeb\x00\xde\x9a\xaa\x5c\x37\x24\x90\x5f\xca\x62\x28\xcc\x4c\xa1\x4a\x8e\x62\x44\x18\xe9\x66\xeb\x93\xd2\x6b\x45\x91\x4d\x63\xe2\x16\xc6\x8e\x70\xbf\x01\xd5\x6a\xc8\xbf\x0c\x6c\x58\x0f\x98\x77\x6c\xcc\xac\xee\x0a\x32\xf8\x9a\x82\x61\x71\x0a\x14\x30\x50\x24\x10\x5d\xcc\x57\x09\xae\x5c\xe2\x69\x62\x96\x00\xa4\xb3\x22\xbb\xbe\xa1\x2b\xbc\x6e\x70\xa9\x7e\x6a\x35\x0e\x02\xf7\xdf\x95\x91\x8c\x8a\xd3\xd2\xcc\x51\x7f\x8b\x82\xc2\x57\x6a\x5f\xf5\x33\xfd\xaf\x34\x05\xb1\x0a\x0b\x90\x0d\xe9\x23\x6a\xe8\x40\xa4\x06\x4b\x33\xdc\xf0\x67\x3a\x73\xd6\x24\xcb\xfe\xd7\x6a\x9e\x27\xac\x19\x04\xa0\x78\xdb\x2d\x1c\x31\x99\xaf\x92\x44\x15\x25\x33\x7b\x18\x84\x8b\x98\xac\x81\x40\xa1\xf1\x40\x9a\x90\x6e\xf5\x32\x57\xcc\x4e\xec\xf7\x1f\xd4\x96\x40\x91\x23\xc1\x91\x15\xd0\x24\x1a\x2f\x0e\x02\x93\xd9\xdc\xcd\x72\x72\x04\xf7\x38\x8d\xf5\x33\xe1\x12\xb8\xa1\xb3\x50\x79\x3c\x8d\x02\x46\x6c\x0b\x2b\x18\x34\xcd\xd2\x79\x12\x4f\xa1\xfb\xf5\xfe\x4d\x49\xd7\x44\xcf\x2f\xbd\x88\x8e\xc3\x3e\x69\xe3\xa7\x8c\xd0\xdc\xa3\xa5\x01\x44\xc8\xd0\x30\xa8\xcd\xc1\x0d\x2c\x4a\xe4\x28\x4a\xa0\x65\x8f\xb3\x6c\x46\x95\x2f\x8e\xc2\x5c\x43\x36\xa5\xe3\x84\x6d\x85\xf6\xd1\x61\x6f\x5e\x35\x4c\x09\x3d\x19\xb2\xe4\xdc\xee\xd7\x66\xfd\x60\x72\xb0\x58\x4d\x8a\x78\x16\x47\xb9\x5e\xe3\x86\x5d\xe3\xb2\xe0\x32\x43\x6d\xae\x0e\xf9\x0a\xdb\xd3\xd8\x91\x12\x52\xce\x12\xe3\x80\x71\x2a\x47\x51\x5a\x46\x72\x2f\x89\xf2\x48\xee\x65\x2b\xd0\x8a\x73\xc2\xc4\xb2\xcf\x41\x0b\xd6\x87\x8a\x0a\x14\x66\x0d\xfc\xa8\x4f\x61\xd5\xdb\xf4\x46\x50\xb2\xf8\x59\xa5\x2b\x88\x07\x42\x4c\x94\x2b\x5c\x48\x61\xb5\x00\x05\x49\xb3\x84\xdd\x7c\xbd\x69\x58\x36\xc6\xf3\x2c\x59\xa5\x80\x26\xcd\x80\x8b\xc3\x93\x77\x4b\xa2\x0b\x37\x68\x31\x59\x43\x62\x24\x9b\x03\xd5\x1e\xf8\xcf\xc0\x70\x1b\x00\x6f\xad\xa2\x6a\xd5\xb4\xc8\x92\x98\x6b\x17\x78\x9a\xe1\xa1\x1d\xdb\x1d\x1d\xc9\x2c\x70\xb1\xbb\x41\x4d\xf0\x78\x57\xf9\x32\xcb\x51\xbd\x40\xf7\x0b\x1a\x4a\xd4\x07\xd0\xb4\xdc\x7c\xa8\x29\x3d\xa0\x2c\x1b\x3e\xd4\x0c\xf8\x79\xa6\x57\xeb\x04\x99\x49\x33\x54\x18\xb0\x05\x54\xa4\x4b\xcf\x47\x71\x7d\x92\x51\x69\xb7\xf1\xc1\xc9\xa6\x00\xdd\x1d\xb4\x80\x5c\x4d\x46\x67\x44\xac\xbc\x9c\xfe\x5e\x0a\x0f\x4f\x94\x2d\xbd\x09\xe5\xa3\x28\x4e\x56\xfa\xb3\x53\x75\x0a\xa4\x1b\x80\x41\x4f\xf4\x80\xaf\x85\xc3\x5b\xc4\x34\x79\x15\xbb\xa7\xb1\xb1\x20\x15\x52\x6b\xa3\xa0\xc0\x75\x19\x2f\x54\x60\xed\x29\x6f\xa3\xd6\xa3\xaf\xe7\x99\xbe\x85\xda\x1a\x39\x3d\x05\xbd\x4b\xbd\x20\xea\x4c\xef\xbe\x6d\x60\xde\x40\x41\x25\x3d\x69\x1c\xe3\x0d\xb6\x50\x22\x3a\x02\x7a\x23\x9e\x9c\x7e\x6e\xb9\xfa\x6d\xcb\x5c\x7d\x69\x35\x03\x11\x17\xa7\x31\x96\xf9\xb2\x44\xea\xc1\x09\x52\xa4\x94\xc4\xe7\x7d\x03\x70\xfb\x4c\xf8\xc6\xb2\x58\x95\x71\x52\x7c\x8c\x08\xe0\x2b\xf0\xbf\x77\xee\xbc\x79\xaf\x86\xff\xba\x7b\xfb\x06\xff\xf5\x49\xfc\x39\x1a\xc9\xe3\x92\xc4\xf5\xe5\x11\xe0\x5b\x15\x9c\xe8\xb0\xfa\xe3\x12\x56\x0b\x66\x48\x78\xe1\x2d\xe9\xaa\x24\x2e\x20\x41\xa3\x80\x50\x20\x77\x39\xf1\xb7\xf7\xda\x72\xe7\xed\xb7\x77\x6e\xed\xbc\xfd\xf6\x3d\xd9\x49\x4f\x57\x85\xfc\x7c\x28\xf7\x42\xb9\xbf\x3a\x3d\x8d\xd2\x50\x88\x83\xde\x5e\xb7\x3f\xea\xca\xc3\xe8\x99\xd2\xcf\x0f\x17\xc5\xd4\xfe\x23\x2d\xed\xdf\xb3\x62\x57\x08\xf3\xaf\x55\x1a\x3f\x97\xc3\x6e\x67\xff\xb0\x0b\x56\x49\x7c\x1a\x9e\x51\x6a\x68\x19\x2e\x16\x85\x10\x6a\x59\xcc\xe7\x71\x19\x4e\x25\xff\x6d\x01\x54\xa8\x60\x8d\xe4\xaa\xa8\xfe\x73\x99\x08\x31\x8f\x9f\xcf\x92\x22\x5f\xe2\x2f\xed\xbf\x96\x89\xfe\xc7\x7c\x61\x7f\x01\x7f\xa7\x5b\x16\xd1\xd4\xfe\x02\xff\x81\x37\x2c\x8b\x59\x5c\xda\x5f\xf1\x3f\xe9\xb6\x65\xb1\x74\x7f\xb7\x34\xb7\x61\x7e\xcb\xfe\xce\xfc\x9b\x6e\x2c\x9d\xfb\x4a\x7b\xdb\xc5\xfc\xc2\xfe\x1c\xff\x41\x37\x5c\x38\x37\x5c\x38\x37\xb8\xd7\xf3\xe5\xa7\xaa\x8c\xe6\x0b\x89\xff\x81\xdf\x52\x74\x9c\xbb\xcc\xf9\xa7\xbe\x7e\x11\x3d\x53\xa5\x7a\x0e\x5c\x67\xd3\xb3\x44\x9d\x87\x67\x72\x59\x4c\xb2\xec\x59\x38\xe5\xbf\x2c\xa2\x54\x88\x65\xa1\xf2\x3c\xcb\xe1\xa7\xf8\x37\x7d\x21\x58\x05\xf0\x5c\xfe\xbb\x7e\xe8\xb2\x48\x57\x4b\xb8\x52\xff\x17\x7f\x9b\xab\x22\xfe\xb2\x82\x1f\xd2\x5f\xe9\xb1\x05\x94\xc4\xc1\x2f\xe8\xaf\x78\x83\xf6\xf9\xf0\xa7\xfa\x2f\x67\xfa\xd2\x32\x5b\x16\xf0\x23\xf8\x0b\x5e\xa6\xb7\x3d\xf8\x19\xfc\xe5\x4c\x88\xe2\x2c\xbb\x98\x9e\x45\x39\x14\x02\xad\xd9\xbc\x02\xe8\xce\x8c\x45\xa1\x67\x46\x45\x8d\xb0\x37\x2e\x87\xb9\x97\xee\x26\xfd\x69\xd4\x63\x9a\x67\xf9\xad\x65\x9e\xcd\xe3\x92\x49\xe8\xda\x36\x4d\xfd\x8e\x10\x3b\x6d\x58\x74\x06\x9e\xed\xe6\x1e\x32\xaf\xb8\xaf\x70\x61\xe5\x46\x4a\x90\xf3\x1f\xf4\x70\x41\x75\xa8\xac\xcf\xc5\x19\xa9\x73\x95\x5a\x1a\x7b\x7a\x1c\x04\x98\x18\x83\x4f\xf7\x11\xf4\x5c\x46\x85\x70\xf1\x5c\x56\xa0\x7d\xb7\xd2\x5e\x37\x9b\xdb\xd0\x5e\x93\x90\x87\xf2\x02\x4b\x8f\xbb\x8d\xc9\x09\xc0\x32\x39\x8c\xf9\x5e\x3f\x4e\xb3\xa2\x2c\xda\x2c\xfe\x6f\xe9\xae\x21\x8c\xd3\x7c\x8f\x80\x7b\xb0\xea\x0b\x8a\x98\xd2\xd5\xa6\x9a\xae\x2c\x97\x07\x51\x9e\xaf\xe5\xd3\x28\x49\xb6\x0a\xd9\xc9\xcb\xb8\xb0\x9a\x19\x4a\x6c\x9b\xb6\xdb\x7a\x79\x95\x27\xf2\xae\x7c\x16\x97\x6d\xf4\x7e\x1e\x1f\x1d\xc0\xfc\xa8\xde\xac\x47\x05\xd2\x1a\x27\x64\xe2\x60\xec\x2e\x61\x65\x4a\x23\x36\xbb\x50\x90\x71\x86\xf9\x05\xd4\x7e\xc0\xce\x66\xbc\x38\x22\x6d\x32\xc2\xe5\xa0\x6e\x25\xc0\x21\x9e\x61\x16\xaf\x4d\xd5\xf2\xde\xa8\x9a\x96\xb7\xa2\xe2\x56\x5c\xb4\xc0\xb7\x70\x4b\xfb\x4f\x57\x11\xc4\x09\x79\xcc\xe2\x5c\xcc\xe3\x12\x90\xb3\x73\xc7\xe4\x22\xbe\xde\x32\x2a\x9e\xb9\x83\x89\xe4\x69\x78\x67\x51\x99\x9f\x04\x0e\x49\xd6\xa2\x5a\x19\x12\x0a\xf1\x30\x2a\x90\xca\x33\x90\x3d\x39\xcb\xd2\xad\x52\x2e\x62\x02\x21\x01\xcd\x60\xa1\xfc\x19\x54\x64\x12\xa0\x27\xa4\xec\x17\x4d\x0d\x0b\xaf\x03\xd3\x23\x2e\xd8\x18\x58\xd6\xb2\x65\x42\x64\x4e\x34\x43\x0b\x9a\xf7\x6b\xaa\x72\x3b\x53\x8b\x1b\xeb\x0f\xec\xbf\x51\xa2\xd4\x72\x3d\xfd\x18\x6b\xc0\x2e\xb7\xff\x76\x76\xee\xed\xee\x56\xed\xbf\x7b\x37\xf5\x5f\x9f\xcc\x1f\xbd\x7d\x99\x19\x60\xf6\x2d\xa7\x96\x7b\x0a\x96\xdc\x6d\x6d\xc9\xbd\xed\x5c\x69\x13\xe9\x16\xc3\x20\x1c\x5c\x41\xa5\xce\x8b\x4e\x4f\x07\x58\xa6\x7f\x32\x89\xd3\x28\x07\xea\xd6\x45\x41\xc1\x92\xcc\x3a\xed\xae\x2e\x42\x00\x68\x87\x6b\x55\x85\x55\xb9\x45\xb1\x2a\xec\x96\xf4\x5b\x84\xda\xb7\xce\xa9\x45\xb2\xeb\x86\x01\x96\xe8\x5d\x4c\x47\x20\x02\x00\xa3\x9a\x42\x9b\xbe\x70\x8c\xf9\x51\x42\xbf\x1d\xb6\xca\x39\x6c\x7a\x7f\x9c\xba\xdf\xcf\xef\x27\xd0\xc4\x65\x4d\xe0\x43\xe4\x95\x9a\xc0\x06\x82\x67\x11\xb0\x99\x80\xd0\x1d\x96\x28\x73\x8e\x6b\x73\xe4\x79\x10\xdc\x0d\x5f\x03\xa0\x71\xf3\x29\x13\xe5\x30\xc4\x40\xbc\xa9\x91\xe5\x40\x64\x13\x94\xe6\x66\x38\x61\x05\x77\x08\x6f\xdf\x7f\x68\x8b\x2f\x38\x0e\xc4\x0f\x5f\xbb\xa4\xcb\x88\xc3\x5b\x15\x14\x32\x76\xee\xc3\x83\xba\x36\xe0\x94\x51\x98\xd4\x90\x25\xc2\x87\x2e\xe6\x1e\x1f\x2e\x34\x2c\xcd\xb0\x1a\x9b\x14\xc7\x14\x18\x2a\x3e\x1d\x74\x96\x82\x32\x91\x88\x24\xea\x36\x24\xa8\xb2\x63\x54\xfe\x27\x8a\x0a\x29\xdd\xfa\x4a\x78\x01\x86\x4f\x1c\xf3\xc6\x91\xcd\x07\x02\x57\x70\x61\xd4\x94\x2e\xd7\x9e\x51\xd0\xdc\x87\xa4\xbe\x70\x56\xef\xd9\x28\x49\xc4\x22\x9b\xad\xb4\xa1\x11\xdb\xd4\x10\xf0\xc8\xd4\xa8\xc0\xab\x37\xf3\x8d\x59\x8e\xde\x21\xf6\x7c\xb9\x5e\x12\x49\xb7\x19\x1e\x2c\x42\x89\xbe\x44\x94\xcb\x59\xea\xd2\x7a\x52\x40\x51\x8f\xe0\xba\x28\xd5\xc2\x28\xdb\x08\x24\x9d\xf1\x3e\x50\xe6\x2b\x20\x99\x1c\x3f\xe9\x8d\x9a\x91\x27\x0f\x4f\xe4\xe8\xa0\xdb\x3d\x3a\xd9\xeb\x8c\xed\x15\xbf\xf7\x7b\x00\x48\xd9\xda\x02\xf4\x41\xa7\x7f\xc2\x98\x12\x61\x49\xde\x3c\xe8\xc9\x47\xc5\xf7\x76\x35\x1e\x03\x60\x06\xfd\x41\xff\x96\x0b\xae\x08\x04\x80\x53\x08\xff\xd1\xdd\x0f\xa5\x8b\x73\x18\x3d\xe9\x1c\x1c\x34\x7d\xe6\x46\xd0\x83\xb8\x1c\xf4\x20\xaf\x03\x7a\xb0\x40\x87\x40\x34\xf5\xc9\xd1\x70\xb0\x77\x3c\x44\x6c\x08\x24\xe3\x1f\x8e\xc6\xbd\xf1\xf1\xb8\x2b\x1f\x0f\x06\xfb\xc0\x1b\x86\xfc\x71\xdd\xd1\x03\x0f\x06\x21\x10\xe7\x30\x18\x32\x4a\xe2\x81\xfe\x7b\x23\x36\xa2\x2d\x9f\x0c\x9e\x76\xdf\xed\x0e\xe5\x5e\xe7\x78\xd4\xdd\x87\xe1\x1c\xf4\xe1\x53\xc7\x4f\xba\x83\xe1\x89\x1e\x03\xdd\x07\xd4\xfb\x8c\x4f\x40\xd4\x04\x60\x11\x02\x39\x1a\x0f\x7b\x7b\x63\xf7\x32\x82\x27\xb8\x60\x0e\x0b\x49\x10\x4c\x4e\xf6\xb4\x37\xea\xb6\x0d\xd4\xa2\x87\xaf\xd5\x96\x7d\x95\xba\x4d\xff\xd5\x99\xa0\x86\xf2\x4c\x5c\x1b\xbf\x10\x36\x9c\xbf\x81\xfe\xff\x3b\xf0\xff\x77\x03\x01\x61\x15\xbd\xa1\x0d\xd5\xa9\xbb\x9e\x8e\xd3\x18\x0a\x7e\x91\x53\xc7\xcd\x2a\xd8\x53\x5a\xde\x9c\xd2\xbf\x31\xa7\x74\x9f\xce\x37\xfd\x4b\x66\xe2\xa9\xcc\x93\x34\xb3\xbf\x2e\x64\x5d\xe4\x08\xd2\x4c\x82\x68\x57\x31\xe5\x30\xcb\x72\xf4\x9c\x97\x79\xb6\xc8\x4a\x65\x79\xf5\x67\x2a\x07\x26\x25\x8b\x60\x37\xe7\x36\x27\x7b\x1c\x32\x7e\x37\xe3\x63\xeb\xf3\xaf\xda\xe1\xf5\xda\x19\x76\x1f\x77\xfb\x63\xc3\x1f\x37\x1e\xf6\x1e\x1e\x8f\x07\xc3\x51\x7d\xaf\x67\x4a\x4f\xf9\xa1\xf7\x7a\x61\x6f\x93\xaf\xc9\xed\x29\x2b\x1b\xbb\xa8\x6f\xec\xee\xd7\xe1\x6e\x6c\x3f\xee\x1a\xb0\x36\xf1\x51\xec\xf0\xdc\x13\xe2\x23\xd9\xe1\x11\xc9\x26\x3e\x9a\x1d\x5e\x0e\x1e\x89\x4f\xe7\x0e\x7f\x0f\xf6\xf6\xfb\xb0\xab\x1f\xe5\xaa\x00\xe5\x1e\x10\xd2\x7e\xa4\xa0\xd2\x56\xaf\xcd\x27\x51\x7e\x1e\xe5\x33\x67\xfd\xde\xec\xec\x37\x3b\xfb\xa7\x65\x67\x7f\xd2\x19\xbe\xdb\x19\xe2\xaa\xef\x8d\x47\x9f\xb2\x9d\x9d\xbf\x4e\x37\xb7\xfa\x71\x37\x3b\xfb\xa7\x66\x67\xff\x35\x0b\x2a\x87\x6f\xcc\xd4\x32\x57\xd3\xa8\x54\xb3\xdf\x7d\x7c\x74\x70\x6b\x27\xbc\xfd\xbf\x7c\xc4\x91\xe0\x2b\xf8\x5f\xde\xbc\xbf\x53\xe5\xff\xba\x77\x7b\xe7\x86\xff\xe5\x13\xf9\x03\x74\x87\x48\x5d\x2e\x8f\x8e\x1f\x1e\xf4\xf6\x24\x65\xe6\x85\x30\x24\x30\x81\x7c\xa4\x26\xf9\x4a\x9f\x95\x3b\x6f\xbf\xf5\x76\x95\x44\x57\xff\x6c\xa3\x40\x04\x12\xb9\xc8\x7b\x3b\xf2\x51\x1e\xa5\xcf\x92\x38\x95\xa3\x32\x90\x8f\xe2\x79\x79\x26\x1f\x25\x59\x96\x07\xe2\x61\x56\x94\xfa\xca\xc3\x8e\xbc\xbd\xbb\xb3\x73\xfb\xd6\xce\x9d\xdb\x3b\xf2\x78\xd4\x11\xa2\xcb\x1c\xca\x1e\x29\x18\x51\x6f\x54\xf9\x35\xce\x55\x3e\x89\xca\x78\xe1\x89\x8d\xd9\x84\x9b\xe0\xc3\x17\xd9\x6a\x81\x45\x03\x59\x64\x0c\x41\x85\x3e\xb8\xc1\x7e\x3a\xca\x55\xb4\x98\x24\x0a\x49\x21\xb9\x26\xcb\x82\x91\x91\xb9\xac\x28\xed\x31\x68\xd9\xb0\x4b\x2c\xad\x7a\xa6\xd4\x12\x2a\xbf\x80\x87\xa6\x3c\x53\x62\xa1\xf2\x29\x15\xd8\xa1\x98\x19\xdd\x01\x1c\x31\x08\x25\x2e\xca\x40\x66\xab\x2a\xd9\xa2\x4d\x28\x16\x92\xd3\x7e\xa2\xcc\x9c\x04\x1e\xe4\xd8\xe6\x28\xb1\x05\x70\xe7\x33\x0e\x96\x12\x59\x88\x47\xec\x76\xeb\x96\x95\x63\xcd\x31\x89\x56\x38\x5c\x1d\x70\x2d\x85\x08\xc1\x6a\x80\xaf\xa0\x5c\xe7\x06\x4a\x5c\x14\x54\xe1\x5a\xf9\x4d\xb3\x61\xab\xf0\x23\xb9\xac\x47\xc7\x02\x4a\xc0\x49\x76\xa1\x7b\x47\x60\x56\xaf\x20\x6d\x58\x2c\x7a\xc3\xd1\x42\xe5\xff\x69\x94\xa2\x49\x8b\x95\xa2\x2e\xa7\x26\x08\xdd\x65\xa1\x10\x4f\xcf\x54\x2a\x2f\x40\x5a\x28\x7a\x06\x35\xfb\x3e\x53\xec\x05\x8a\x5b\xe6\x8a\x65\xfc\xcb\x8c\x3b\x11\x05\x76\x97\x79\x3c\x55\xa1\x1c\x39\xfa\x83\x81\xd8\xcc\xd6\x0a\xc4\xc9\x0a\xe1\x9a\xd2\xed\x62\xe9\x6b\x6c\x82\x95\x88\xef\x11\xcc\x67\x1d\x01\x7c\x12\x25\xa8\x9d\x09\x5c\x69\xb1\x79\x0e\x2b\xf5\x39\x36\xb4\xf0\x75\xe8\x99\xaa\x15\xe9\xcf\x9d\x5b\xf5\x35\x4c\x21\xe3\x8e\x7c\x86\xbc\x29\xcb\x58\x4d\x15\xe9\x1d\x6b\xb3\x35\x55\x17\xd8\x0a\xee\xdd\x07\xb6\xc2\x5c\x3f\xee\x59\x4a\x79\x5b\x90\x78\xc9\x28\x1d\x0c\x15\xc6\x44\x66\xbe\xcc\xb3\x52\x4d\x29\x11\xcc\x35\xac\x17\x4a\xa6\xca\xe9\x26\x4f\xfd\x1e\x1e\x3e\xcf\xf2\x09\xe0\xa9\x49\x62\x57\xcc\x54\x8a\x32\x61\xf8\x0a\x0b\x66\xd4\xd3\xa8\x78\xc6\x1a\x2e\x85\x91\x9f\xb3\x7c\x17\x21\x25\xc8\xdd\xb7\x08\xc0\x89\x62\x15\x4e\x66\x44\x86\x50\x18\xb7\x88\x27\x8c\x8a\xa2\xd9\xc5\xfd\xe9\xec\x37\x66\x94\xbc\x15\x84\xd2\x97\x78\xb1\x21\x02\x0f\x45\xa3\xee\x5a\xd3\xc3\x80\x0e\x16\x35\x95\x99\x13\x97\x01\xb9\xa7\x79\x54\xc6\x85\xc0\x1a\x66\x64\xd4\x0f\xac\xd4\xaf\xa1\x45\x77\x0a\xfb\xa1\xe8\xa7\xa2\xa8\xc9\xd3\x10\xd6\x91\xb0\xac\x06\x76\xa2\x96\x67\x0a\xb8\x7b\xb3\xc0\xcc\x33\x67\x6e\x55\x92\x09\xa1\xec\x20\xe1\x32\x3e\xaa\x54\xf8\xca\x05\x22\x0a\xb8\xff\x85\x78\xaa\x9a\x26\x02\xf9\x38\x17\x99\x2c\x4a\xb5\x2c\xde\x91\xdb\x3b\x6d\xc7\xe7\xf2\x3b\x56\xcf\xbb\xed\xdd\x36\xe9\x7a\xe3\x4c\x70\x4a\x66\x11\x1d\xa1\xbb\x01\x81\x02\x58\x20\xe1\x8b\x5f\x23\x65\x93\xed\x77\xe1\x53\xb6\xbb\xef\x23\x8a\xee\x00\x3a\x1b\x68\xee\x71\x4f\xda\x2a\xf8\x43\xd8\xb5\xce\x56\x39\xce\x68\xa6\xd0\x85\xfe\xe4\x19\x05\xd5\xda\x46\x0c\xc0\xd6\xb8\x14\xa6\xb3\x99\x22\xc9\xa2\x33\x8c\x60\xb2\xb7\xfe\x43\xd9\x9b\xd7\x76\x6b\x03\xde\x21\xf1\x7b\xfd\x12\x95\x90\x82\xe0\x32\x2a\x50\x38\xc8\x36\x0f\x70\xc0\x56\x4c\x56\x9f\x54\x69\x46\x2a\x13\x17\x3c\xfa\xb8\x4f\xd1\xb1\xe8\x02\x29\x02\x59\xb0\xf0\x65\x0a\xb4\xc6\xa8\x03\x16\xa7\x25\x7a\xce\x50\xcf\x00\xfb\x79\x61\xb1\xbe\xb9\x9a\x23\x8a\x39\xf5\x9e\x45\xfd\x59\x6c\x69\xc7\x7b\x45\x55\x40\xc4\xc3\xac\x8d\xd2\xb8\xd8\xc0\x48\x33\x27\xe9\x23\x60\x92\xa9\x05\x3a\xdc\xc0\x85\x40\x67\x3c\x14\x62\xb3\xa5\x23\x9b\xc4\x28\xc0\x13\xdb\x1b\x1c\x9d\x80\xdf\xb4\xdf\x1b\xa1\xb7\xd6\x1b\xf4\xa1\x48\xd1\x2d\x6f\x15\xe2\x36\x55\x6f\xf0\x31\xe0\x40\x9e\xad\xd0\x18\xf5\x17\x1c\x71\xc6\xe9\x47\x99\x3f\x98\xb7\x9c\x80\x83\x74\x21\xd0\xb1\x03\xa1\x9d\x11\x01\xa8\x69\x3d\x15\xd1\x9a\xcc\x17\xae\x04\x70\x38\xfb\x1b\x85\x07\xe2\x62\x23\xcd\xb8\xee\xf3\x16\x49\x6b\xb4\x02\xa6\x7e\x83\x93\xb1\x60\x9a\x25\xc4\x56\xdb\x4f\xb0\xca\x81\x91\x6c\xc1\x97\x78\x1a\xb6\xfc\x34\xca\x41\xda\x88\x85\x38\xb2\xcf\x00\x0c\x38\xa9\xc0\x96\x5c\x83\xe3\x88\x88\xc0\x3e\xe7\x10\x6b\xe8\x93\xcc\x8a\x1e\x80\xb9\x27\x28\x68\xe5\x0d\x7c\x11\x4a\x50\xa3\x63\x9e\x22\x60\x3c\x43\x05\x3b\x04\x59\xb5\xd6\xd9\xaa\x05\xdc\x21\x92\x55\x83\xaf\x6d\x53\x9a\xe6\x81\x3d\x63\x0f\x60\x02\x28\xf1\x9e\xa9\xdb\x4a\x89\xf1\x85\x9a\xc5\xab\x45\x95\x9a\x86\x74\x31\x8b\x65\x3c\x5d\xa1\x32\x28\x74\xa6\xa5\x88\x4f\xd6\x2c\xc5\xa6\x3b\x15\xf6\x20\x6a\xa4\x7b\x55\x2d\x46\xc5\x1f\xd1\x20\x6e\xf3\x40\x80\x5d\x1a\xa3\xb6\x00\x1f\x0f\x1e\xd1\x02\x0c\xba\xa9\xc0\xd9\x64\xf0\xa5\x33\x36\xf6\xa2\x49\xa1\x58\x66\x0d\x10\xfd\xae\x3c\x08\xda\x36\xc6\xc6\x73\x8e\x26\xbf\x27\x45\xe4\x33\x09\x5d\x29\xbd\xe0\xde\xec\x0c\x21\x00\x0b\x05\x1c\x8d\x96\x5b\xfe\x6c\x0d\x88\x33\x19\x61\x05\x93\x29\x84\x81\x02\x3c\x78\x6f\x28\xc4\xae\x7d\x0a\x1d\x06\x24\xe0\xbe\x24\xb9\xef\x86\xf1\x37\x95\x09\xde\x04\x15\xb8\x5d\xd5\x27\x13\x2c\xa0\x45\x9d\xd7\xcb\xaf\x02\x3e\x8a\xf2\xe8\x34\x8f\x96\x67\x72\x47\x40\x0c\xb2\x69\xda\x00\xcd\xd3\x2c\xf3\x03\x8e\xef\x08\x11\xb5\xa5\xd5\xf9\x37\x47\x03\x71\xdc\x64\x72\x0a\x60\x47\x60\x83\x04\x35\x59\x1e\xf8\xa2\xc4\x3c\xbc\x9d\x96\xc8\x50\x8c\x74\x17\x70\x37\x87\x37\x67\x54\x52\x66\x99\x08\x61\xa4\x85\x98\xb8\xaf\xa6\xc2\x8d\xb9\x5d\xe0\xe6\xd1\x4e\x87\x00\x87\x1d\xcc\x6f\xb2\x4f\xb9\x1e\x49\xd8\x7a\x24\xbf\x68\xb5\xda\xf1\xfa\x02\x38\x41\xb3\xb9\xd9\x18\x2a\x91\x6c\xe1\xf5\x78\x40\x15\x2c\x46\x4f\x35\xd2\xbd\xc0\x88\x54\x12\x5b\xb7\xda\xd9\x6e\x19\x8f\x12\xd7\xd9\x4b\x19\xd5\x6a\x3f\xd8\x51\x5a\xd4\xd6\x3e\xc8\xd5\x9b\x93\xde\x31\x25\x8c\x62\x7d\x5e\x6f\x44\x20\x2b\x2a\x2e\xa1\x10\xd3\x36\x8b\x43\x9a\x81\xe6\xdd\x39\xcd\xf2\x05\x00\x31\x72\x15\xcd\x1c\xa9\x08\x47\xc2\x23\x59\x23\x09\x5b\xbe\x4a\x51\x8c\x1f\xcc\x37\x1c\xc1\xb8\x24\x86\x36\xd0\xff\x50\x33\x7d\x11\x6c\xcd\x7a\x49\x15\x58\x6f\x69\xb5\x40\x28\xb3\x00\x86\x49\x0c\xc8\x55\xcc\x5c\x80\x83\xbc\x2a\x56\x51\x22\x2f\x22\x14\x83\x58\xe6\x31\x56\xec\x10\x74\x19\x76\xb2\x34\xcd\x56\xe9\x94\x4b\xf7\x0c\x0d\x8e\xb7\xc7\x89\xc6\x3d\xce\x1c\x95\x9b\x2d\xa9\x6d\x6d\xbc\x25\xa0\x10\x1b\xad\x79\x8a\xc3\xf7\x32\x67\x92\xd5\xbb\x6a\x5b\xcf\x06\x1d\x77\x3d\x72\x1e\xf7\xb9\x83\x4b\xb5\x47\x6c\xe1\xe2\x73\xa8\x0a\x4f\x25\x09\x1f\x65\xc0\xfe\x42\x32\x15\xc0\x42\xdb\xbc\xd5\x89\x9a\xd6\xf0\xac\x5d\xd9\xd7\xe4\x2b\xef\x6b\x46\x0d\x05\xaa\x09\xfd\x29\x84\x84\x62\xb2\x69\x26\xc6\xa9\x54\xcf\x39\x72\x60\xc4\xbb\x84\x38\x54\x50\x30\x7e\x9a\x53\xb5\x1d\x2e\x70\xdc\xda\xdd\xba\x68\xab\x5e\xec\xae\xd9\x6d\xaa\x42\x83\x64\x42\xa4\xa7\x4e\x5b\x68\x9b\x0d\x0a\x0d\x49\x27\x46\x16\x65\x96\x47\xa7\x8a\xe6\x88\xb5\xec\xf0\x04\xb5\xc8\xa4\x49\xce\xfd\x6b\x2d\x29\x61\x77\xd3\x62\x9a\x2d\x1d\x74\x32\x4b\x6b\xdd\xb9\xfc\xb4\xaf\xb6\xd6\x31\x3d\x72\xa7\xd9\xda\xe5\xd3\x4b\x04\x5f\x67\xf7\xeb\x5d\x90\xbe\x77\x88\xeb\x80\xe8\xc0\x81\x31\x65\xf9\xa2\x61\xc7\x17\xe6\x09\x85\xdc\x81\x26\xed\x52\xf2\x69\xf3\xbe\xaf\xad\x7c\x43\x00\xef\x6d\xff\x16\x7a\x15\x97\x76\x0c\x1c\xbe\xbe\x1c\x5d\x5c\x58\x64\x8b\x68\x7a\x16\xa7\xea\x96\xde\x26\xa0\x89\x8e\x39\xc3\xa5\xce\x8c\x55\xab\x99\x97\x1b\x8e\xad\xca\x47\x3c\x90\x59\x1e\xc0\xe9\x50\x6f\x59\x64\xd2\x44\x30\x17\x03\x2a\xa1\x86\x29\x67\x15\xc4\xb4\x0b\xb4\x56\x51\x8e\x7b\xb7\xb6\x28\x04\x22\xcb\x78\x7f\x5c\xa3\x9b\xc4\x1b\x2f\xce\x58\xc6\xdc\xd1\xd2\xe1\x45\xd3\x04\xd3\x6b\xbb\x7c\xa4\xb5\x2e\x71\x69\xb1\xfc\xde\x73\x3b\x8b\x8e\x15\xa7\x93\xc4\xab\x77\xd2\x74\xd3\xf0\xb9\xe0\x49\xc7\xc4\x04\x4b\xd6\xd3\x4f\xf3\x1a\xe8\xb1\xec\x91\x93\x80\x80\x4b\x35\x0b\xe5\x36\xf8\x2c\x51\x42\x55\xd9\xe8\xef\x51\x08\x14\xd9\x5d\x11\xe7\x98\xea\xd3\x43\xe5\xd3\x38\x4a\x44\xcd\xd9\x82\xeb\x28\x9a\x61\x1a\xe5\xee\x92\x97\x2d\x08\xa4\x32\x00\x22\xc3\xb0\x2d\xc4\xa8\x8a\x50\xc4\x7d\xc4\x42\x18\x97\x18\xa9\xc3\x2a\x9c\x05\x8f\x09\x5c\x04\xa0\xc4\x08\x64\x70\xbc\xe3\x5e\x80\xc4\x33\x95\x8f\xbc\x1a\x68\x92\x8d\x63\xd7\xc2\xe7\xa8\x68\x03\x70\xf2\x81\x9c\xac\xca\x00\x55\x91\x58\xcb\x1c\x27\x24\x84\xc1\xe3\x12\xe3\x5d\x0e\xaa\x52\x6c\x42\x55\xe2\xba\xd3\xfe\x3d\x04\x0a\xa2\x7c\x46\xb2\x40\x56\x56\xd9\xc3\x57\x1a\x1c\xa5\xa8\xe0\x28\xe5\x26\x1c\x65\x40\x44\x78\xf6\x05\x67\x2a\xd2\xb3\x95\x6a\xfd\x72\x61\x2b\x6d\x0a\x8f\x22\xd1\x79\x71\x54\xd6\x10\x9c\xa1\x10\x77\xed\x16\x8b\xfc\xc5\x2e\x47\x76\x01\x67\x1c\x92\xcc\xfb\x76\xa0\x29\xda\x76\x9d\x02\x5a\xd0\x50\x13\xc3\x2c\x77\x66\x4f\x74\x6a\x8c\x37\x79\xb5\x9d\x54\x1f\x7a\xa5\x5a\x2c\x4b\x61\xf9\xd9\x6b\xcc\xdd\xaf\xd8\xaa\xb8\x80\xda\xf1\xc0\x16\x34\x47\xab\x32\xd3\xab\x13\xc1\xaf\x96\x65\xc7\x0d\x74\x11\x6d\x9b\x7b\xc4\x38\xa4\xbe\xa6\xc9\x2c\x09\x6d\x99\x4c\xce\xb2\x8a\x50\x1d\xba\x22\x81\x43\xaa\x89\xcf\x16\xfc\x0b\xc8\xd2\x43\x29\xcd\x55\x5d\x64\x63\x34\x1c\x98\x8e\x8d\xb0\x75\x21\x1c\xae\x23\xa7\x06\xc7\x94\x58\xc7\x20\x90\xb2\x88\x62\x30\x18\x40\xb9\xd1\x32\xac\x86\x42\xdc\xa3\xc4\x46\x2d\x50\x83\xa4\x3a\xd8\xfb\x55\x87\x7f\xdb\x0d\x0a\x70\x3c\x41\x38\x57\xb4\x31\x1a\x9b\xce\xf4\x12\xa7\x2e\xf6\xc5\xbe\xbd\xa0\x60\x69\xc5\x34\x91\x83\x50\x68\x13\xa4\x29\xac\x04\x9c\x43\x18\x35\x00\x65\x7d\xdc\xd2\x2e\xb3\x0e\xaa\xcd\x74\xaf\x68\x63\xa2\xc0\x38\xbc\x95\x39\x42\x83\x59\x38\x34\xb6\x86\x8d\xc4\xc4\xc7\xf0\x37\x59\x2e\x1a\x02\x97\xd2\x0f\x5a\x1a\xf9\x75\x8f\xc5\x62\x43\x00\x2d\x14\xee\x0a\x45\x75\x71\xc4\xef\xaf\x72\x72\xd3\x9d\x60\x3c\x7d\x97\x75\xdd\xb7\x98\x2a\x56\x71\xec\x9b\xa6\xa1\x4b\x3b\x15\xa7\xa1\x10\x6f\x62\x60\x69\x53\x3a\x08\x9a\xc0\x01\x8e\x5c\x9d\xc7\x85\xad\x41\x4c\xd5\x45\x5d\x1c\x7e\x83\xc8\x23\x74\x5c\x8c\x32\x7f\xfa\xbf\xc4\x09\xe3\x3d\xc2\x70\xbf\xc4\x8b\x38\x41\x46\x48\xaa\xab\x33\x3a\xaa\xc0\x45\xc4\x77\x60\x92\x50\x37\x10\x69\x79\xf5\x14\x47\x19\x40\x70\x12\x31\x94\xa4\x5f\x21\x4c\x10\x14\x29\x2e\xa6\x2a\x87\xb9\x04\x13\x89\xf5\x77\xe2\x82\x04\x82\x23\x18\xc2\x38\x3d\x5d\xc5\xc5\x99\x9e\xfb\xbe\xae\x4f\x4d\xee\xdf\xc8\xe9\x8b\xa8\x2a\x01\x44\xc7\x9f\x1f\xfd\x76\x02\x8e\xa8\x47\x2a\x5b\x46\xee\x93\x1f\xd0\x42\x7f\xcf\xa4\xa2\x8c\x3b\xe0\x40\x97\xca\x4d\x6c\xe0\x4c\xc2\x34\xf7\x45\xf2\x89\x0d\xa3\xfa\xaa\x2b\xb4\x4c\x9d\xb9\xc0\x5f\x6e\x82\x83\xc6\xd2\xc7\x2e\x58\xcb\x2b\x3a\x20\xa8\xfa\xda\x51\xba\x66\x81\x53\xd0\xe2\x7d\x85\xb6\x08\xf1\x16\x2b\xf5\xc9\x0b\x3d\x39\x75\x77\x3a\x6c\xbf\x9e\x72\xa3\xd5\x3b\x2e\x33\x72\x46\xbc\x7c\x99\x80\x84\x66\xb5\xaa\xd5\x03\xc9\x19\xe1\xc6\x00\x0c\x62\x43\x1a\x44\x4a\xff\x94\xdf\x9a\x67\xb9\x70\xe0\x54\x60\xd3\x58\x18\x16\x96\x86\x3a\xd2\x17\x57\x7f\x67\x20\xbc\xb7\x6d\xba\xec\x01\xe4\x50\xb3\x85\xd2\x6b\xab\xc0\xe4\x86\xb1\x6c\x0a\x93\xab\x08\xc5\x60\xa5\xbd\xa4\xa9\x4f\xb6\x74\xba\x82\xd3\x9a\x9a\x52\x5e\x64\xf2\x34\x8b\x12\xe8\x3d\xa2\x5c\x35\xf4\xf0\x90\xeb\x28\xa3\x72\x05\xe9\x47\xe0\x69\x37\x3e\x17\xdc\xc0\x59\x6e\x3f\x8b\x0c\x4f\xca\x16\x59\xc9\x0f\x2a\xce\x22\xf4\x81\x81\x8e\x4e\x9f\x8c\x80\x36\x64\xca\x6a\xdc\x45\x40\xbf\x4c\x4a\x09\xff\xe7\xa8\x94\xc9\xb7\x43\x21\x1e\x76\x01\xa8\x54\xd5\xd5\xa7\x8c\xc1\x3e\x51\x81\x3e\x92\x7b\x4f\x3a\xc3\xc7\xdd\x00\x09\x2e\xf5\x15\xee\x83\x1e\x81\x7e\xba\x51\x48\x0f\x98\x8e\x91\x68\x40\xad\xde\x7c\x4d\xfc\x3e\x94\xdd\x2f\xee\x75\x8f\xc6\xf2\xe9\x93\x6e\xdf\x82\x98\xc4\x68\xdc\xd1\xd7\x3b\x6a\xf8\x28\xd8\xef\x0b\xe1\x1b\xa1\x7b\x2b\x84\xdf\xeb\x1a\xac\x9d\x27\x7b\xcf\x64\xad\x97\x11\xb5\x06\xb2\xdb\x73\xb9\x58\xbb\xfb\x0e\xe6\xce\x05\xda\x35\x96\x86\x34\x97\xcb\x5c\x01\xb4\xbb\x44\xf4\x17\x3a\xb0\x3f\xee\x0d\xbb\x72\xd8\x1b\x7d\x41\x76\x46\xdc\xad\xbf\x75\xdc\x31\xcf\x71\x58\x2e\x05\x83\xb6\xec\x30\x02\x73\xe6\xc9\xe0\x38\x94\xa3\x27\x83\xe3\x83\x7d\xef\xf7\xba\x9b\xba\x72\xbf\xfb\xa8\xbb\x37\xee\xbd\xdb\x0d\x40\x09\xbf\x33\x1a\x1d\x1f\x76\x05\xf6\x36\x70\x72\x02\x2f\x6b\xbf\xbb\xd7\x1d\x8d\x3a\xc3\x13\x82\xc8\x41\xb2\x68\xd8\x3d\xea\xf4\x86\x08\xc8\x1b\x0e\x91\xac\x33\x14\x62\xe7\xb6\x5f\xc9\x73\xdc\x3f\xe8\x8e\x46\x72\xd8\xfd\xad\xe3\xde\xb0\x69\x12\x00\x0f\xe7\xe3\x61\x17\x55\xfd\xed\x98\x0b\xe0\x3a\xd5\xa3\x53\x1d\xf8\xc0\xa7\xee\x44\x3d\xfd\xa7\x4f\x06\xf2\xb0\x43\x8c\xac\x27\x3c\x35\x86\x5d\x93\xd3\xc2\xcf\xe2\xcf\xef\x8c\x9c\x89\xd9\x79\x38\xd0\x3d\x60\xf1\x89\xe3\x01\x74\x87\x1e\x1e\xc2\x17\xba\x54\x9e\x9d\xfe\x89\xa0\x1c\x9b\x03\x52\xb4\xc8\xc5\xcd\x20\xc5\x0a\x87\x29\x21\xf2\xa0\x42\xab\xcf\xf3\x63\x3c\x90\xd5\x25\xe9\xe0\xfe\xea\x73\xcf\xe3\x52\x15\xd0\xe2\x71\x47\x3e\xec\xea\xab\x87\xdd\xfe\x7e\x77\x08\x4b\xa9\xb3\xb7\x77\x3c\xec\x8c\x81\xf6\x54\xdf\xd1\x1d\xc9\xd1\xf1\x68\xdc\xe9\xf5\x71\x50\xf4\xf7\xc2\x42\xee\x0d\xf7\x79\x2d\x09\x98\x9e\x8f\x3a\xbd\x83\xe3\xa1\xe1\x4f\xe5\x46\x8d\x07\x72\x70\xd4\x85\x47\xc2\x44\x73\x06\x04\xaf\x18\xb5\x0d\xb2\x10\xb0\x83\x02\x47\x4f\x7a\x2b\xf6\xe4\xf5\x98\x4f\x51\x5f\xbf\x31\xa5\x29\x44\x67\xb9\x54\xe9\x2c\x7e\xfe\x8e\xfc\x15\x50\xda\x3f\x5b\x2d\xa2\x14\x24\x7b\xca\xdf\x70\x9d\xfd\x69\x96\x9e\xab\x35\xf9\xea\x9f\x4e\xa1\xfd\x9d\xb7\xd7\xeb\x57\x95\xd9\xdf\x2c\x3f\xfa\x09\xcb\xec\x3f\xa8\xca\xec\xef\x5c\xa1\xab\x2f\x6f\x74\xf5\x3f\x42\x5d\xfd\x07\xa0\x09\x9e\x55\x6d\xe3\xcb\x11\xa7\x81\xbc\xff\xe6\x3d\x79\x18\x15\x85\xe8\x9c\xab\x40\xee\x45\x0b\x94\x46\x63\x98\xe9\x9d\xb7\x03\x79\x3c\xea\x7c\x9c\x3a\xfc\xb1\x97\x6f\xbb\x8e\xf8\xbe\x34\xe2\xfb\xe2\x1a\xe2\xfb\x8f\xd3\x6c\xc1\xd4\xa6\x3c\x35\xef\xbf\x1d\xc8\xea\xd2\x7b\xfe\x5c\xfa\x2b\x4f\xba\x77\x82\x08\xbf\x78\x4d\x11\x7e\xd9\xac\xc1\x2f\x5e\x47\x83\x5f\x36\x6b\xf0\x8b\x5f\x29\x0d\x7e\xca\xa5\xe0\xeb\x98\xad\x06\x43\xeb\x62\x1a\x25\x09\x84\xca\x16\x0a\xe0\x8f\xe4\x0c\x02\x43\x40\x63\xcb\x88\x02\x68\x0a\xcd\x83\x75\x3c\xd1\x83\xbb\x2a\xd4\xad\x69\x12\x4f\x9f\x01\xd4\x6f\xa1\xd2\x95\x8c\x4b\xb5\x28\x6e\xdd\xd2\x9b\x2c\xb8\xb2\xc5\x2a\x2e\x0b\x0f\xf4\xfa\xd1\xe8\xf7\xc3\xe5\x1f\xb5\x88\xff\x13\x95\x2b\x11\xc9\x02\xb0\x8f\x0f\x30\xe3\x60\x4b\x93\xde\xd1\x0d\x5f\x67\xb3\x75\x6a\x54\x3f\x49\xa7\x84\x5f\x51\xf8\xd2\x21\x9e\xa4\xa3\xbb\xde\x7e\xcf\x99\xd6\x5b\x62\xdb\x7c\x1c\x0a\xfe\xe4\x98\x83\x00\x81\xa9\xdc\x1a\x15\x80\x90\x03\x88\xb6\xfe\xcb\x62\xa2\x7f\xd9\x36\x69\xa9\xc9\x5a\x7e\x5e\x37\x52\x3c\x89\xa6\xcf\xa0\x92\xec\xb3\xba\x2b\x22\x64\x65\x9e\xcb\xf1\x5a\xee\x65\x59\xfa\xb9\x40\xee\xc8\xce\x32\x8f\x13\x44\xc3\xd3\x8f\x03\x5b\xca\x07\x5c\xa6\xf1\x14\x00\xe5\x51\xb9\x65\xb2\x0b\x98\xb0\x86\x68\xcd\xff\xf4\x4b\xa8\x1d\x09\xdf\x38\x84\xa2\x8f\x9d\x5f\x1a\xff\xe3\xbd\x7b\xf7\x77\xef\x54\xf5\xdf\xef\xdd\xbf\x77\x53\xff\xf1\x49\xfc\x39\xcc\xbe\x1c\x27\x49\x4d\xd1\xd7\xea\xff\xee\xb0\xc0\xeb\xbe\xcd\x07\x01\x6a\xee\x76\xb8\x13\xca\xd6\x9e\x49\x0d\xca\xe3\x42\x31\xd4\xaf\x4a\x9e\x62\x53\x2f\x94\xa2\xd3\xab\x76\x2f\x03\x12\x6e\xb1\x97\xcd\x5c\x6e\x15\x6d\x50\xbb\xa9\x5d\x78\x19\xbe\xca\x94\x2e\x1a\x48\xa1\x36\x89\x59\x7f\x53\x1b\x50\xa8\x48\xc4\x91\x58\x3a\x68\x8c\x05\x8f\xa4\xeb\x68\x5b\xfb\x6a\x85\x20\x44\xea\xbf\x83\xfb\xa0\xe5\xe4\x1f\xa7\xd9\x62\xe2\x51\xf0\x2b\x39\xe0\x58\xfd\x1e\x24\x81\xa1\xf6\x51\x54\xa4\x1b\x0b\x34\x31\x23\xe9\x3c\x3e\x30\x78\x2a\xff\x62\x16\x69\x85\xcf\xb1\xec\x6b\xc2\xb9\x15\xb5\x3d\xa1\xb5\x48\x63\xae\x5f\xed\x36\xd3\x6b\x53\x5d\x67\xcf\x24\xc2\xcd\xc7\x88\xa6\x8f\xa9\x2b\xd4\x02\x9a\x11\x41\x88\x51\xa1\x1c\xa8\x0e\x81\x24\x0a\x46\x62\xa1\xd8\x61\x28\x5b\x5d\x6b\x2c\xed\xbb\x73\xe2\x50\x69\xb7\x2c\x2e\x0c\x38\x34\x92\x0b\xfe\x91\x8d\xcf\x51\x5a\x47\xcd\x84\x11\xa2\x23\x6b\x8f\x1c\x51\xd2\x34\x00\x55\x01\x03\x9a\x56\xae\x89\x66\xf2\x77\xd9\x5c\xce\xa2\x32\xc2\x90\x1f\xcc\xe8\x7b\xba\x7d\x26\x35\xca\x0d\x71\xfb\xd4\x63\x35\x72\xce\x72\xca\x53\xeb\x4b\xe0\x4b\xef\x87\xb2\xd5\xd3\x6b\x23\x4a\xe4\x3e\xb6\x4c\xe5\xee\x80\xf8\x1a\xcf\xac\xef\xaa\x8f\x05\xa2\x5d\x84\xcb\x44\xed\x19\x56\xe6\xca\xbc\x90\xad\x45\x52\x6a\x83\x89\xd5\x7d\x7e\x16\x4f\xe2\x52\x76\xa0\x35\x6f\x86\xb2\x75\x10\x01\xe7\xf6\xd3\x2c\x7f\x66\x7b\xd8\xc3\x1a\xeb\xb1\x57\x95\xcf\xcd\xf2\xda\x48\xa2\x5d\x38\xa5\x17\xcb\x53\x7d\x79\xea\x44\x73\x3d\x3c\x9c\x45\x2e\x71\x1f\xbf\xa5\xdb\x82\x3f\xb5\xfd\xa1\xbd\x20\xaa\xc4\x82\x06\xbf\x05\xcb\x1b\x2f\x73\x87\x82\x44\xbe\x4d\x7e\xc9\x80\xe7\x02\x5e\xd0\x8b\xe8\x79\xbc\x58\x2d\x88\x53\x5f\x70\x84\xc1\x16\x4c\x50\x71\x3a\xe4\x86\x68\x8e\xc7\xd4\xc9\x28\xab\x05\x70\x36\xa6\x85\x86\x19\x87\xdd\x1a\x88\x8a\xa8\xb4\x93\xe5\x42\x77\xdd\x4d\x73\xed\x84\x6f\x87\xbe\xb6\x71\x61\xba\x5d\x3f\xc6\x11\x4b\x41\x22\x6f\x05\xff\x34\x09\x3f\xdd\x04\xc8\x5e\x0a\xc8\xc8\xe7\xab\x29\xdb\x17\x4e\x99\x77\x6d\x55\x23\xa0\x9c\xb4\x35\x2a\xea\xab\x4f\xb5\x0b\xe1\xcf\xe5\x42\xe6\x2a\x51\x11\xc1\x9f\x23\x59\xa8\x9c\x6b\x8c\xe2\x04\x00\x86\x55\x6d\xe4\x77\x84\xe8\x5c\xa7\xf9\x7a\xab\x65\x48\x6f\x84\x21\x0a\x07\xcd\xcd\xed\x16\x66\x8e\x35\xb7\x19\x5f\x06\xd5\x46\x10\x28\x81\xfd\x9c\xa1\x9f\x55\x69\xe9\x5a\x67\x6c\x7c\xe8\x4e\xb8\x73\x3b\x94\x2d\xef\x06\x1e\x1c\x77\x5d\x41\x2d\xff\x62\xb9\xd2\xb6\xa9\x53\xd4\x37\xb3\x99\x15\xe1\x29\x50\xbe\xca\xba\xd4\x1d\xee\x1f\x14\xe0\x20\xc1\x83\x83\xea\x24\xc5\xfa\x0c\x18\x29\x37\x7f\xef\x94\x98\x61\xa9\x62\xae\xa2\xd9\xda\x3f\x45\xfd\xe5\xe9\xad\x48\xe8\x06\xbd\xce\x8e\x40\x76\x4f\xee\x81\x61\xed\xce\x52\xd4\xe3\x93\x60\x71\x6f\x17\xed\x40\xa6\xd9\x85\xcc\x2e\x52\x24\x80\xd7\x73\x3d\x9a\x97\x2a\x17\x66\x89\x38\x07\x00\xc7\x22\x12\x23\xd5\x15\x48\xed\x04\x65\x33\xc0\x2e\x6b\x4f\x20\x60\x6c\x7b\x94\x47\xe5\xaa\xc0\xf7\x14\x81\x30\xba\xe1\xf0\x76\xbb\x0b\xe8\x6f\x80\x35\x4a\x07\xde\x8e\x6e\xbc\xd3\xe1\xad\x2b\x71\x41\xde\xf4\xb7\xf8\x20\x1f\x0e\x8c\xa6\x77\x55\x7e\xb1\x01\xde\x13\x00\x97\x1b\xae\x67\x92\x5c\x81\x83\x89\x45\xfd\x1c\x66\x5a\x5a\x4f\xc0\x49\x5d\x16\x86\x5f\x01\x2c\x92\x2c\x21\x1f\x24\x32\x10\xaa\x38\x2d\xca\x28\x49\xcc\x49\x1c\xa5\xd2\x9e\x4b\x10\x69\x72\x71\x42\x26\x55\x18\xa3\xe3\xbb\x8c\xf2\x18\x14\xc5\xa3\x53\xdd\xcc\xd2\xad\xb3\x68\xd8\x32\x08\x2c\xa9\x92\x04\xca\x7e\xd2\xc0\x31\xbd\xfc\xc3\x80\x3b\xd1\xd8\x1d\x5b\x85\x40\x85\x5d\x4c\xea\xbb\x93\x7f\x1a\xa5\x2c\x0c\x05\x6d\xa2\x32\x0b\xfd\xc6\x7c\x7a\x16\x9f\x47\x09\x8c\x8c\x05\xb2\x8b\x8a\x1f\x2e\x67\x8a\xef\x33\x68\xcb\x5b\x78\xaf\x4b\xf0\xa7\x67\xff\x45\x3c\x03\x25\x43\x6e\xb6\x20\x36\x3e\xc4\xf9\xe1\x5c\xd1\xb6\xdc\x49\xb6\x6a\x01\x4c\x43\xff\x2d\x6f\xb5\xcd\x54\xaf\x1c\xc7\x11\xd5\x89\xd1\xb1\x5c\x53\xc1\x45\x18\x5f\x40\x79\xf0\x05\x29\xfa\x22\x7c\xd1\x9e\x0d\x7c\x12\x06\xfe\x6a\x45\xec\xec\x0a\xb6\x73\x93\x2a\x9f\x57\x57\x74\xb1\x32\x70\x26\x2b\x1d\xb6\x83\x09\x5e\xa7\x71\x80\xed\xc1\xef\x62\xe5\x4a\x38\xa6\xa8\xe5\xb6\x8c\x28\xcf\x12\x6d\xac\x15\xfc\x8f\x04\xb6\x04\x2c\x4c\x2c\x8c\x6c\xea\x62\x81\x89\x68\x98\x94\x10\x75\x03\x75\xd8\x47\x4d\xc2\xf2\x76\x76\x07\xb2\x45\xf7\xf0\x0a\xdc\x8e\xda\xb8\x0a\xb3\x0b\xdd\x4f\xe8\x69\x23\x80\x1f\xff\x1e\x60\xe5\x01\xa3\x9f\xf0\x87\x34\xcc\x8b\x28\x8d\x4e\x8d\xfc\x14\x40\x8b\x58\xc9\x9f\x0e\x71\x31\x59\x1b\x9d\x25\xcf\x99\xc0\x20\xec\xa4\x0d\x9b\x54\xce\xfa\x4d\x96\x94\x71\x1e\xcf\xcb\xb5\x5c\xaa\x7c\xaa\x9f\xbe\x7d\xef\xf6\xbf\x6b\xb3\xa1\x9b\xad\x4a\x23\x4c\x0e\xa5\xd2\x05\x72\x3c\xa6\x6a\x1e\x83\x33\xe3\x3d\xd2\x69\x95\x55\xe5\x75\x66\xbf\xdd\x65\x77\xf5\xa8\x8d\x41\xeb\xa6\x6a\xca\x3d\xd6\x7b\xd9\xa6\x5f\x52\xc0\x03\xf6\x3b\x10\x01\x16\x60\xae\x25\xb3\x5b\x7a\xb6\x07\x32\xcf\xd6\x51\x52\xae\x6f\xcd\x73\xa5\xf4\xc6\x9c\xde\xa2\x44\xc1\xb9\x03\x7f\xf0\xa0\x3f\xc6\x7f\x12\xcd\x52\xb2\xb8\xfd\xbe\x23\x44\x14\xd2\x84\xb8\x4c\x72\x56\x6e\x3b\xe6\x2f\x6d\xd5\xae\xce\x68\xdb\xd9\xb8\xf5\x78\xd5\xbf\x10\x11\x6a\x81\xab\x0b\xcb\xe8\x3b\x2a\x05\x08\xf4\x50\xe1\x2e\x61\xf1\x78\xa2\x01\xa0\xed\xef\x6a\xdb\x0d\x56\x6b\xbb\x46\x66\xe4\xfb\x31\x5c\xf4\x49\x1c\xed\x68\xb7\x38\x36\x33\x17\xb4\x84\x06\xe1\x8d\xf6\x0d\x1e\x9a\x32\x4e\xe7\x79\x9c\x9e\x5a\x33\x18\x0f\x96\x80\x2a\xd4\xa9\x88\x1b\xfe\x3a\xf7\xcd\x9f\x80\xc3\x4e\x01\xc6\xc8\xb5\xb7\x17\x60\xc7\x2c\x21\xb8\xab\xfb\x45\xdf\x1c\x10\xb0\x41\xbb\x2e\x00\xd3\x8c\x12\xac\x7f\x7d\x23\xcb\x1d\x24\xa3\xee\xba\xcc\xb0\x70\x5f\xa7\x67\x42\x21\xa6\xa1\x0b\x9b\xb1\xa8\x2d\xd6\x00\xe3\x2d\x68\x37\xdc\x81\xb5\x0d\x55\xb7\x93\x36\xc4\x72\x4d\xda\x8a\x50\x61\x02\xaa\x81\xea\xc3\x3d\x8f\xf3\xa2\x74\x06\xae\x62\xff\x34\x81\xe0\x2b\x06\xcb\x0c\x74\xaa\xf5\xf8\x99\x95\xea\x35\x4c\x37\x08\x8b\xa3\xd2\x8c\xa7\x64\x62\x6d\x24\xfa\xa8\x77\xe4\x4e\x5b\x60\xb9\xe8\x4c\x59\x3d\x78\xb0\x61\x1d\xc4\x9d\xd7\xb8\x07\x72\xb7\x2d\x0b\x05\x86\x4a\xc3\x35\x02\xaf\xc9\x72\x79\xa7\x0d\x63\xc3\xd3\x01\x89\x21\x60\x9f\xd3\x33\xe3\x1d\x19\xb7\x9d\xe2\x9c\x69\x63\xd8\xc0\x18\xc5\x31\x5d\x7c\x55\x88\x81\x66\x36\xac\x46\xb7\x72\x7f\xa6\xce\xe3\xa9\x2a\x60\x0f\xda\x0d\xdd\x63\x9b\x77\x9e\x51\xe3\xf6\xb0\x61\xd9\xb3\x75\x06\xde\xbe\xfb\xb0\xda\x4e\x25\xaf\xbd\x53\xb1\x14\xfd\xc7\xb4\xe7\x78\xc1\x95\xd7\xdc\x6e\x60\xdd\x57\xb6\x1b\x3f\x78\x82\x11\x26\x2c\xb6\x5e\x55\xfa\xa6\x71\xc1\x09\x06\xcc\x41\x16\x67\x95\xda\x72\xed\xa8\x88\x0d\xed\x1a\x5c\x52\x09\xb6\x44\x15\xf7\x9c\x56\xff\xab\x6d\x5a\xd7\xdb\xb3\x82\xca\xa6\xe5\xb5\x44\x78\x31\x29\xf7\x83\xe9\xd3\x00\xc0\xcf\x49\x59\x24\x73\x9e\x58\xcd\xd0\xf2\x0c\x5c\x1a\xe7\x3e\xc3\x2c\xe3\x75\x18\x1f\xb4\xce\xdd\x6d\x67\xbf\x84\xe1\xc4\xad\xb1\xb2\x2d\x0a\x67\x2b\x75\x19\xd5\x2a\x3b\xa4\xde\x0a\x2e\x0b\xb6\xb9\x0d\x6c\x1c\x49\x4c\xc3\xef\x36\xae\xd3\xcd\xcf\x75\x23\x77\x8d\xbd\x21\xaf\xdd\x1b\x97\xef\xdd\x46\x86\x74\x37\xdc\x35\xfb\x36\xfc\xfd\xd2\xbd\xdb\x6d\x09\xee\xda\xba\xbf\x75\x0b\xdd\xc8\x6e\x93\x4f\x75\xd5\x26\xbd\xfb\xca\x9b\x34\x8a\xd0\xf3\x46\xed\x6d\x3b\x51\x41\x9b\xb6\xa3\xda\xd8\xd0\x89\x7a\xef\x16\xf5\xbd\xbb\xf1\xca\xab\xb7\x6f\xe1\x6e\x94\xbe\xdb\x98\xcd\x1b\xc7\x70\xe3\x4e\x2e\xae\x37\xf3\x1a\xb7\xf7\x6d\x5b\x06\xc1\x92\x32\x1b\x3e\xaa\x6d\x99\x05\xe8\x40\x80\x83\xea\x6e\xfb\xf2\x3d\x01\xb7\x4f\x3f\xf0\x59\xfa\x95\xdd\xd7\x6b\x3e\x9a\xc7\x77\x42\x3f\xda\x3b\xb0\xa2\x85\x50\x82\xb7\x13\x02\xf0\xc8\x39\x12\x3d\x1a\x02\xff\x55\xe8\xd5\x00\xe3\x0f\x6c\xbd\xc4\xf7\x82\x34\xe1\x27\x58\x40\x6f\xf0\x3e\x79\x35\x06\xb2\x21\x44\xd9\x10\xbb\x10\x36\x76\xe1\xce\xe1\xba\xaf\xcb\x99\x76\x98\x01\x4e\x9f\xd5\x49\x18\x04\x14\x47\x35\x54\x81\x5d\xe5\x22\xd6\xae\xe1\xc8\x9d\xa8\x39\x89\x68\x28\x9e\x70\xf9\x2e\xf3\xb5\x57\x4a\x4c\x6d\xb5\x47\x49\x78\x29\xe1\x62\x32\xdc\xcf\x3b\xf1\x2a\xb4\xfd\x5a\x1e\xdc\x78\xf5\x1c\xb7\x25\x03\xf0\x51\x50\xc6\x99\xae\x1b\xfb\x09\xcb\x86\x92\x52\xe5\x24\x3c\x88\xa5\x05\x05\xa7\xe2\xf5\x3c\x98\x24\x9b\xdd\x63\x0a\xea\xbb\xe5\x07\x64\x20\x18\x79\x5e\xa7\x6a\x86\x9b\xcb\x25\x56\x91\xd5\xaa\x8e\x12\x13\x77\xc6\x2f\xe1\xe8\xb2\x73\x01\x3d\xd9\x8b\xf4\xb1\x44\xf3\x9d\xf0\x1e\x4c\xdf\xdd\x50\x76\x30\xf8\x80\x02\xd0\xd9\xdc\xcb\x08\x40\xd1\x91\x17\x49\x6d\x9e\xc2\xc2\xf9\xb1\x9d\xc2\x5c\x6c\x09\x2b\xcc\x86\x66\x62\x2f\xeb\x50\x29\x24\x15\xcd\x13\xcb\x1a\x1e\x10\x63\x8e\x16\x0a\x8a\x68\x23\x08\xff\xba\x31\x26\x3b\xed\x72\x71\x0e\x0a\xb1\x26\xf3\x22\xaf\xcc\xe0\x10\xb5\x09\x52\x34\xc9\x8b\x33\xaa\x3c\xd2\xed\x17\xcd\x6f\x31\x5f\x85\x07\x6a\x3c\xaf\x7e\xac\x6e\xc3\x86\xf7\x0a\xf3\xde\x80\x29\x5b\xa1\xfe\xc8\xd7\x66\xb0\xa0\xb8\x0b\x95\x9c\x2b\xb9\xbd\xb3\xdb\x96\x8b\x2c\x2d\xcf\x0a\x09\x41\x4c\x7b\xfc\x01\xc7\x15\x78\x2f\x89\x5e\xbe\x53\x80\xb7\xf1\xc3\xc0\x2c\x32\x0f\x2b\xe2\xe7\x72\xfb\x7e\xe5\x41\x91\x93\x3f\x10\xde\xf2\xf5\xf2\x77\xfe\x84\xd0\xa7\xd9\x44\xa9\xb4\xfa\xe1\x40\x5e\x35\x3d\x73\xe6\x3a\x56\xea\x20\x49\x19\xf1\x52\xd1\x37\xaa\xb4\x58\xe5\x86\xb2\xa1\xba\x8a\xb9\x25\xd8\x3d\x85\x13\x2d\x73\x45\xc0\xae\x1e\xdc\x58\xef\xf5\x71\x8a\x25\xa3\x98\xc4\xf4\x73\xb3\x77\x42\xbd\xdb\xa3\xfe\x5e\xa3\x31\x14\xda\xcd\x09\x43\x40\x51\x92\xf8\x1b\xe7\xa6\xdd\x9c\xb1\x57\x10\x55\x84\x9c\x00\x2f\x5f\x5e\xb8\x88\xed\x2c\x68\xd1\xe3\xa3\x70\x89\x09\x3a\x99\x7c\xf3\x19\xc3\x4f\x35\xfe\x8a\xb0\x69\xff\x34\x1c\x19\x02\xa4\x7e\x61\xd7\x30\x5d\x5d\x49\x94\x30\x3d\x2e\x07\xbf\x92\xb5\x74\xc2\x5f\xc9\x9a\x2a\xf2\x7c\xa7\xcf\xd4\x31\xd2\x41\x55\x77\xa2\x31\x38\xcc\xe7\x54\x59\xa1\xfa\xa5\xeb\x85\x97\x2d\xe4\x58\x9c\x33\x17\x02\xe3\xc0\x53\xa8\x9d\x41\x9f\x69\xf3\x2e\x20\x60\x93\x4e\xc0\xcb\xf1\xe8\x8a\xad\x00\x19\xba\xd0\xb8\x45\x3a\x15\x6b\x60\x7c\x38\x81\x33\xd1\x60\x31\x62\x66\xf0\x4e\x78\x37\x04\x3d\x68\xe3\xfc\x1d\xb1\xf3\x77\x08\xda\xec\x05\x5f\x29\x25\x7c\xd3\x18\x26\xdd\x11\x18\x62\x68\xbd\x00\xda\xae\x6a\x22\x1a\x61\x30\x3a\x75\x8c\xb1\x89\x7b\xa5\x37\x79\xb7\x0a\xcf\xfd\x14\x55\xf7\x13\x12\x66\x94\xcc\x29\x33\x5b\xf2\xd6\x50\xef\xd6\xe0\x0c\xfa\x27\x75\x01\x31\x8b\x2c\xd7\x16\x45\xe0\xb5\xba\x32\xeb\x40\x51\x11\xe6\xba\x29\xfd\xc6\xa1\xc4\x39\xe3\x01\x2b\xca\xb8\x4c\xd4\x4c\xb6\x0e\xba\x8f\x3b\x07\x2d\x1a\x1a\x1e\x16\x02\x2c\xe8\xae\x32\x33\x9f\xec\x58\xcc\x82\xd8\x5f\xc7\xa9\x2c\x56\xf3\x79\x3c\x85\x32\x45\xae\x71\xc3\xfe\xb3\xe5\x8b\x00\x4c\x05\xa6\x30\xd8\xe3\x2d\x30\x32\xac\x0e\x04\x56\x98\x53\x9d\xa8\x1d\x11\xb3\xf1\xd6\x56\x8f\xbf\x0b\x8a\xa8\xf9\xfc\x95\x77\xaa\x7d\x87\x4a\xce\x7a\xa1\x2e\xf5\x92\x73\xaa\x21\xa1\x4b\xa0\x1f\x21\xbf\x64\x19\x15\xbd\xae\x07\x3f\xc7\xd9\x7d\x4d\x8e\x0b\x7a\x0c\x9f\x0e\xca\xc1\xa8\xbb\x0f\x04\x75\x72\x1b\xc9\xf9\x20\x0b\x47\xe5\xab\x6e\x1e\x63\x11\xc5\xe0\x44\x27\x71\x81\xdc\x84\xa9\xba\x28\x4e\xf3\x6c\xb5\x2c\xda\x56\xd0\x67\x2d\xa6\x51\xa2\x0f\x06\x62\x33\x45\xe4\x29\xf1\x82\x5e\x9c\x65\x7e\x29\xbd\xbf\x5b\xea\x81\x49\xd5\x85\xed\x59\x61\x8e\x13\x53\xdb\xef\xae\x9e\x49\xdb\xfb\xea\xce\x51\xaf\xb6\x76\xb6\x2a\x69\x53\x3b\x21\x53\xb6\xd0\x60\x04\x18\x2c\x88\x52\xe6\x94\xf9\x82\x10\xed\xe6\x85\x98\xcd\x2b\x8e\x9f\x5b\xde\x6e\x3b\xc4\xe2\x05\xa1\x62\x7f\xb1\x4c\x9c\x2d\xb7\x73\xd4\x6b\x58\x35\x80\x71\xe4\x96\x62\xad\x80\x03\xe0\x25\x1d\x27\x3b\x13\xbc\x4e\x99\xb6\xe5\x50\x51\xc5\xa7\xf1\x4c\xdc\x37\xe4\xfc\x5b\xac\x7b\x0f\xa4\xf5\xc1\x00\x96\x98\x69\x2f\x71\xb9\xca\x8b\x15\x51\xfe\xd9\x59\x7a\x57\xef\x58\xcc\xdc\xe4\x3e\x73\xa2\x92\x58\x9d\x73\x25\xfd\x65\xfd\xaf\xfb\xc6\xcf\xbc\x99\x9a\x60\x06\x31\x6d\x17\x6d\x8e\x76\x54\x3b\xdf\x59\xcd\xb6\x3e\x1c\xf1\x0e\xba\x4b\xaa\x30\x86\x7a\xb2\x58\x5b\xba\x72\xc8\x9b\x5f\x1f\xeb\x20\x9c\x53\x72\xb6\xc2\x39\x81\x9b\xa1\x3d\x4f\x6c\xc2\x9b\x80\x42\x02\xb6\xb2\xba\x97\x01\xc5\x95\x96\x77\x97\x81\x1b\xc0\x10\xc4\x7a\xed\xce\x31\xe5\x02\xa1\x3c\x33\x18\x8c\x82\x95\xc2\x24\x6e\x61\xa1\x13\x80\xd3\x4d\xeb\xc7\xba\xff\x60\x11\xc9\x24\xa3\xa9\x6d\x96\x75\x04\xce\xd6\xb9\xee\x2c\x3c\xbe\xb3\x7c\xdd\xa6\xba\x89\x08\xb9\x7c\x2e\x00\x62\x3b\x41\xc8\x76\xb2\xd6\xb6\x7c\x92\x65\xcf\x2c\x39\x12\xd3\x12\xc1\x67\x5a\xbb\x7f\x86\xac\x2d\x84\x9c\x77\x47\x5c\x0f\x26\x79\x2e\x22\x9a\xcd\x10\x86\x8b\xa5\x16\x85\x8f\x1b\x63\xe8\x0b\x7d\x84\xb7\x51\x5a\x1c\x90\xf9\x72\x81\x7c\x31\xce\x78\xb9\x89\x47\xb4\x07\xfc\x43\x9e\x41\x54\x6e\x3f\xc3\xd7\x0b\xef\xd4\x6f\x70\xc7\xbc\xd3\xdf\x48\x52\x24\x11\x4b\xdc\xfb\x96\xc0\x49\x8d\x18\x8b\x28\x60\x88\x17\xb8\xca\x78\x14\x98\xba\x86\x40\x16\xab\xe5\x32\xcb\x21\x6b\x3f\x53\x8b\x34\x2e\xd7\xda\x68\x49\x62\xe3\x91\xd9\x80\x03\x3c\xd8\xe9\x75\x9f\x80\xce\x6b\x92\x71\x22\x4d\xdb\xa0\x3a\x08\x29\x4e\xb2\x14\xeb\xa2\xb2\x8b\x54\x4e\xd4\x59\x94\xcc\xb1\xa5\xe0\x16\xf3\x8f\x2a\xa6\x99\x35\xe5\x04\x05\xb7\xdc\x50\x89\x9d\x9d\x5c\x17\x10\x4d\x8a\x2c\x59\x95\x50\x12\x94\xa8\x88\x42\xdf\x86\x79\xd1\x7c\xbf\xa8\x7f\xbf\xdc\xf0\xfd\x7a\x85\x41\xbf\xe2\x3a\x07\x67\x22\xc9\x52\x65\xc2\x06\x82\x02\xfa\x40\x6d\x8d\x47\x11\x3c\x72\x7e\x99\x51\x0a\x11\x04\x3f\x72\x98\xe5\x90\x8a\xb6\x6d\x88\xd3\xe9\x2a\xcf\x2f\x33\x6f\x79\xb5\xb8\xcf\xa1\x05\x58\xac\x92\xd2\xad\x80\x6a\x1a\x72\xff\x93\xd1\x05\xd6\xdf\x07\x9f\x0b\x9b\xd8\xfd\x4a\x1c\x2a\x9b\xbb\xe6\x2e\x85\xcc\x0a\x1b\xe2\x70\x02\xff\xee\xc4\x10\xb1\x67\x26\x23\xc4\x84\x68\x6f\x30\x32\x01\x1b\xa5\xe1\x05\x37\x36\xdf\x9d\x70\x27\x40\xab\xe5\x4e\x78\x47\xff\xdf\x5d\x38\x2b\xef\x84\xf7\x30\xfb\x87\x2e\xa0\x2a\x69\xcd\x55\x1c\x96\x80\xbd\xe3\x13\xa0\xbb\x60\x0b\x91\x16\x3e\x11\xf6\x89\x4b\xbd\xbf\x26\x20\x4c\xec\x9a\x3c\x95\xd8\x54\x35\xf6\xe2\xc1\x62\x58\x65\x9d\xbb\xf2\x2c\xbb\x40\x02\x14\xd8\x1a\x4f\x98\x50\x60\xbe\x4a\xe6\x71\x92\x10\xc4\xc3\x5d\x89\xb6\x6b\xe4\x1d\x0e\xac\xd1\xd7\x70\xd4\xc3\x27\xc3\x64\x4d\x46\x71\x3d\xc7\x25\xd8\xe0\xb6\x40\xf6\x2f\x81\xc2\xac\x28\x11\xcd\x4e\x4c\xc3\x76\xe6\x6e\x5d\x35\x47\x06\xa9\x93\xfd\x39\x03\x1e\x75\x43\x50\x65\x5e\x43\x59\x56\xb7\x49\xc1\xee\x09\xbb\x2b\xd9\x1c\x77\x1b\xc4\xdb\x04\xd4\x62\x64\x2d\x43\x8f\x18\xe7\xbb\x01\x03\x59\x61\x16\x61\xc6\xce\x27\x0f\xe3\x38\x02\x8b\x6d\x02\x49\x8b\xf5\x32\x1a\x43\x48\xc2\xd0\xe1\x39\x49\x07\x73\x42\x34\x7c\xab\xe1\x6c\x20\xd2\x1d\xdd\x77\x10\x57\x85\x0d\xd0\xd4\x7d\x98\xde\xde\x2a\x8c\xb7\x55\x47\xd4\xf1\x43\x4d\x14\x9f\x3a\xab\xc0\x15\x53\x9e\x99\x8c\xb5\x09\x1f\xd3\x71\x7b\xf5\xa0\x60\xc1\x60\xe4\x74\x20\x7f\xdd\xb5\x76\xe5\xd2\x86\x3e\x29\x76\x41\x24\x21\x56\x1f\xc7\x14\xb5\x01\x90\xb3\x69\x07\x06\x16\xbb\x0d\x9b\xe3\xc6\x03\xe3\x35\xb6\x6b\xd1\xb8\x5d\xcb\xd7\xdc\xae\xc5\x86\xed\x9a\x43\x2a\xb0\xa5\x37\xed\xc6\x6f\x86\x6e\xb6\xd2\xd9\x76\x29\x28\xea\x25\x33\x25\x80\x7e\x16\x13\x84\x90\x7a\xbb\xb1\x93\x21\x79\x35\x5c\x72\x03\xd9\x9f\x70\x5f\x89\xa8\xd8\x38\x3d\x4d\xac\xd4\xbd\xec\xa5\x6c\xd2\x4d\x23\xbd\xa8\xfc\xe9\x41\x94\xe9\xfe\x19\x50\x8b\x60\xeb\x29\x60\xb6\x45\xb3\x7c\xea\x81\x11\x88\x89\x98\x03\x4d\x1b\x4c\x8b\x65\xb2\x96\xfb\x68\xe0\x8e\xca\xa8\x24\xde\x9f\xa1\x3a\x5d\x25\xcc\x54\x62\x2c\x69\x08\xca\xdb\x00\xe1\x09\xb2\xe1\x23\x64\x8d\xf0\x6a\xe9\xba\x8a\x57\xf3\xd7\x3b\x5c\x95\xab\x62\x49\x40\x01\x97\x8e\xb4\xe9\x30\x21\xdb\xbb\xc0\xa6\x05\xf2\x4b\xab\x19\xe1\xa7\xf2\x99\x36\xa4\xc0\x91\xe2\xb6\xfa\x36\xf9\x3b\x10\xd7\x71\x5b\xb7\x79\xe0\xca\x4c\xd4\xe1\xde\xc6\x6b\x78\x60\x02\x5c\x5e\x4c\xca\xe6\x73\x2c\x77\x2d\x70\xb8\xa1\xec\x3e\x24\x43\x89\x28\xc8\x3d\xd9\xf8\x28\xaa\x08\x02\x3b\x21\x05\x6b\x74\x0b\x2f\x3a\x71\xd7\x53\xf6\x35\xf7\x1b\xa4\x60\x4d\xff\xac\xea\x14\x89\x2e\x11\xc7\xe2\x81\xc3\x9f\x99\x67\x60\xd6\x53\x9c\xc9\xce\x02\xdb\xb3\x01\xce\x51\xe7\x33\x04\x37\xc3\xfa\x82\xc9\x9a\x62\x3b\x34\x07\xdd\xe0\x4e\x36\xd7\x23\x86\x72\x68\xc5\xb3\x38\x49\xa8\x86\x1f\xe2\x31\x65\xe6\x90\xd6\xa3\x96\x81\x94\xf2\x5e\x2d\x89\x57\x71\x22\x3d\x46\x74\x87\x96\x68\xea\xc6\x7c\x37\xec\x35\xda\x8b\xc5\xb2\x7a\x0c\x81\x88\x26\x1f\x93\x1c\x05\x3e\xf4\xeb\xeb\xe9\x7e\x68\x8c\x3c\xee\xee\x6a\x89\x02\xc0\x2c\xfb\xea\xc2\x5c\x28\x44\x5f\x95\xc5\x34\x5a\x2a\xc8\x80\xaf\x52\xe3\x93\xef\x11\xfb\x0f\x78\x8b\x2d\xbe\xaa\xd5\xbe\x84\xc4\x4a\x54\x48\xac\xdc\x26\x34\xb1\x56\x79\x94\x51\x86\x3f\x27\x3e\x57\xa9\xb8\x8a\x37\xca\x7e\xd0\x6e\x28\xbb\x30\xb9\xf5\x0b\xfd\x4f\x1b\xa4\xd3\xca\x02\x36\xa1\x23\x5b\x0c\xcf\xb6\x88\x93\xbc\xa8\xd8\x93\x6c\x61\x18\x3f\x29\x4a\x2e\xa2\x35\xa2\x4d\xe3\x14\xb7\x04\x92\x66\x69\x4c\x7e\x5a\xda\xa8\xd0\x7a\xbd\xda\x4f\xb5\xbe\xa0\xbe\x9d\x9c\x03\xa7\xb5\x0d\x4f\xc3\x23\x87\x33\x30\x7e\x12\xd1\xf6\xb5\x57\xea\xcf\x43\x17\xca\x3e\xf9\x86\x16\x67\x64\x06\xff\x0c\x6b\x72\xd0\xe6\x10\xc0\xda\x60\xa2\x8b\xc4\x8b\x65\x53\x97\x15\xe7\xd6\xb8\xfb\x75\xf8\xbe\x33\x4e\x90\x37\x31\x8c\xb2\x70\x26\xc2\x66\xee\xe7\x09\x21\x63\x62\xf9\x9d\x37\x25\x88\xb7\x71\x35\x31\x03\x96\x76\x4f\xc4\x2c\x03\xf2\xcd\x7c\x86\xf0\xcb\x08\xb8\x3e\x90\x9e\xc3\xab\x6b\x68\xaa\x27\x90\x5e\x3d\x81\xa8\x84\x88\xda\xce\x39\xa8\x77\xf1\x5c\x41\xac\x02\x4c\x56\xb6\xa3\x58\x26\x02\x02\xcf\x67\x79\x54\xa8\x42\xb6\xa8\xdc\xb0\x15\x88\xd6\xe1\xe0\xb7\x7b\x07\x07\x9d\xa3\x83\x56\x20\xf5\x3f\xf0\x2f\x66\x59\xe9\x1f\xd2\x8f\x8e\x0e\x5a\xd2\x80\x43\xd2\x39\x00\x96\x92\xb5\x21\x72\xc3\x87\x6b\x5f\x1d\xbe\x63\xb9\xd4\x36\x5a\x9c\x62\x0c\x25\xa9\x72\x72\xc3\x55\x56\x8f\xc7\x5e\x81\x06\x5c\x21\x6a\x16\x9c\x05\x40\x7a\x65\x8c\x30\xbd\x1d\x83\x10\x3e\xde\x5f\x28\x0c\x78\x73\x18\xcc\xad\xc5\x28\x7d\x8b\x51\xc9\x0d\xa5\x98\xfa\xe5\xdc\x2b\x55\x8a\x68\xb9\xfd\x28\x46\xcc\x16\x1d\x52\x0d\xf9\x21\xbb\xab\x06\x3e\x92\x50\x54\x22\x87\xfc\x88\xcb\x02\x4b\x14\x14\x47\x2c\x80\xbe\x7c\x51\xa8\xe4\x5c\x15\x62\xa2\xef\x50\x0b\x8c\x66\x4f\x54\x1d\x2c\xe3\x2d\x82\x36\xac\x82\x37\x43\x2b\x99\x38\x94\x83\x47\x86\x70\x40\x88\xbd\xc1\xbb\xc0\xce\xb3\x37\xd8\xf7\x65\x22\x8f\xfb\xfb\xdd\x21\xaa\xf4\xb1\x7a\x07\xc8\x08\x4a\x26\xb2\x7a\xd8\x19\xf5\x46\x41\x8d\xcf\x4a\xbc\x0e\x9f\x95\x79\x0a\x70\x0a\x81\xd6\x47\xe0\x4a\xbe\x8f\x9f\x74\xc6\x44\xc0\xe5\x37\x97\xd9\xc1\x90\x44\x6a\x14\x38\x34\x1c\x07\x5d\x90\x85\xaf\x29\x49\x0a\x56\x92\xf4\x15\xe1\x7b\xfd\xc7\x1f\x82\xf2\xaa\xda\xae\x1a\xef\x15\x92\x48\x39\x17\x55\xc8\xaf\x64\xaf\x0f\xac\x23\xc3\xee\xe8\x08\xf4\x28\x4f\x06\xc7\x72\xbb\x3f\xc0\xcf\xee\xf5\x7b\x48\xe2\xd4\x7d\xb7\x7b\x30\x38\x42\x06\x23\xcb\x76\xe4\x48\x5c\xb6\x1b\x09\xb4\xfa\x27\xaf\x40\xa0\x85\x83\x6e\x27\x8c\x70\x26\x0c\x90\x4a\xa1\x68\xe5\x48\x4f\x06\x3d\xa8\xc8\x2f\xa5\x3b\xd8\xe8\x3a\xd2\x8c\x09\x65\x7f\xc0\x7a\x8f\x4e\x07\x08\xee\xa5\xce\xf1\xf8\xc9\x60\xd8\xfb\xed\xee\xbe\x7c\xd2\x1d\x76\x71\xca\x11\x1f\x9b\x33\xff\x6c\x53\x70\x53\x7f\x2b\x04\x0a\x25\x2e\xa9\x15\x6f\x61\x2d\x40\xc5\xff\x68\xc8\x1e\x1a\x18\x0b\x1e\xf9\x96\x3d\xd6\x63\x0c\x15\x14\x09\x9a\x13\x03\xa5\x67\x39\xc3\xb6\x82\xe5\x88\xf0\x16\x73\x91\xf6\x4f\xe0\x1c\x9d\xe4\x00\xe5\xd5\x97\xc7\xa9\xb8\x73\x5b\xce\xf4\x89\x9d\xcd\xe5\x44\x4d\x33\x48\xe8\x44\x08\x25\xc6\xcd\x03\x2f\x47\x75\x61\x0b\x8f\x2d\x9a\x62\x21\xc2\xa6\x73\x30\x85\x9a\xac\xcd\xa7\xe1\x76\x51\xac\xf2\x73\x96\x01\x29\x6d\x17\xd5\x6d\xc6\xa3\x9c\xd8\x1b\x0a\xae\x8d\x43\x7f\x2e\xce\x25\x52\x2e\xf8\xa0\x8f\x38\x25\x4c\xa3\x9c\xa8\x75\x46\x9d\xeb\xbc\xa0\xe6\x88\x79\xcd\x01\x92\xc7\x5d\x13\x33\x40\x14\x48\xa9\xfd\x86\x92\x83\xa7\x13\xa8\xf5\x52\x79\x89\x01\x30\xca\x63\xb9\x80\x41\x4a\xa1\x6e\x03\xc8\x19\x28\xb7\x67\x6a\x9a\x44\x65\x96\xaf\xb5\x33\x74\x8a\x22\x40\x18\x0f\x6c\x9b\x12\xad\x46\xe7\xda\x0f\xf3\x6f\x37\x17\x04\x57\xf6\x6c\x7e\x20\xa4\x64\x61\x76\x00\x3f\x14\x38\xac\x53\x8e\xff\x72\x71\x9c\x00\x1a\x49\xd9\x3a\x02\xc3\x2e\x5e\x46\x69\xd9\x6a\x6b\xcf\x44\x9d\x32\x8e\x04\xeb\x41\xe0\x7e\xe7\xaa\xad\x66\xbc\x6a\x33\xd6\xc1\x74\x0f\xd6\x26\x61\x9f\x51\x3e\xc6\xad\xa9\xdd\x90\x42\x77\x5e\x4b\x5c\x64\x14\xab\xf1\x32\xe9\x94\xf8\xda\x0d\x77\x6b\x96\x10\x8c\x71\x20\x57\xcb\x2c\x95\xf7\x69\x9a\xd3\x99\x06\x47\xad\xf3\x02\xcb\x6f\xac\x67\x2e\x38\xbd\x40\xc8\x15\xc8\x55\x9a\xa8\xa2\x90\xf1\x9c\x16\x8c\x79\x12\xa6\x87\x21\x3b\xbb\x84\x33\x10\x1f\x0d\x96\x30\xe2\xad\xde\x91\xdb\x71\x9b\xe2\x33\x71\x0a\x44\x22\x14\x44\x5c\x46\x6b\xef\xf3\x22\xb9\x58\x95\x2b\x2c\x74\xd7\x97\x83\x29\x69\x32\xa2\x4a\x10\x94\x9e\x9d\xf9\x5c\x2e\xa3\x02\x29\x5d\x09\x2d\xb8\x2a\x2e\x81\x66\x56\x7b\x13\x9c\xf1\xed\x38\xc6\xda\x98\x59\x1e\x5d\xb0\xbd\x66\xa6\x3b\xce\xe5\x6a\x0c\x60\x03\xd4\x54\xf0\xdc\xab\xbe\x08\x56\x54\xa5\xdb\x4c\x47\x05\xe0\x76\xf2\x27\x72\xb5\x80\x40\x26\xa5\x35\xae\x96\x3c\x8f\x78\x75\xe9\x4d\x45\x1b\x1b\x7e\x47\xcd\x70\x74\x9d\xde\xa5\xb0\x0f\x91\x52\x0b\x8a\xb0\xd4\x3e\x8d\x6c\x5d\xee\x80\x34\xd8\x00\xe6\xf0\xe6\x88\x33\x09\xe5\xa6\x49\xb8\x89\xff\x9b\xec\x5f\xf5\x7c\x19\xe7\x1e\xd3\x02\x76\x8c\x11\xfa\x52\x79\x9c\xcd\x0c\xd7\xef\x0c\x41\xd3\x21\x80\xf9\xc1\xc1\x31\x0a\x78\x67\x51\x3e\x33\x22\x83\x08\xf1\x0d\x5c\xff\xe5\xf2\xa5\xcb\xc0\xfb\x4d\x38\x25\xbb\x76\x65\xe3\xda\xf5\x7b\x8a\xbb\xa6\x69\xe9\xd6\xbb\x0b\xb0\xe0\x88\x48\x67\x40\x7a\xae\xce\xb3\x67\x6a\x66\x81\xe9\x22\x32\x5e\x32\xa0\xb4\x70\x47\x43\x4c\x3a\x15\x4a\xcd\x02\x59\x64\xc9\xcc\x65\xc2\x9e\x41\x67\x9c\x45\x33\xba\xea\x92\xe2\x05\x77\x9a\xea\xed\xff\x8e\xd9\xfe\x71\x9f\xbf\x74\x93\xe7\x09\xef\xad\x61\xda\x3d\x31\x0f\xf3\xd1\x6f\x9c\x94\x5d\xc1\x52\x00\x9e\xc3\xb9\x2a\xb2\xe4\x5c\xcd\x6c\xd2\x7a\xb2\xb6\xa9\x83\x5c\x16\xaa\x2c\x11\x3e\xd1\x16\x28\xc6\x4e\xcb\x98\xce\x38\x3a\x7b\x9b\xbe\xd4\x2e\x19\x1a\x76\x0c\x6e\x9a\x3d\xe9\x3c\x4a\x56\xaa\x42\xbc\x7c\xf9\x26\xbe\x11\x07\x25\xf0\x34\x9e\x28\xc0\xd8\xa4\x48\x9f\x1c\x4d\xa7\xd9\x0a\x1a\x25\x67\x0a\xd7\x91\x41\xe9\x2e\xe0\x37\x59\x2e\x4d\x23\xb0\x9f\x60\xdb\xc0\x04\x30\xfb\xd8\x6f\x21\xbe\x0c\x17\xdf\x39\x45\xb8\x5c\xd3\xa3\xd2\xaa\xb7\xb0\x55\x6f\x85\xbb\x5c\xaf\xa0\x9b\xa6\xd2\x99\x80\x84\x7f\x83\xfe\xaf\x3d\xf1\xed\x4c\xcc\xf2\x82\x28\x87\x0b\x95\x10\x8f\x14\xd8\x46\x67\xd1\xb9\x12\x10\x66\x01\x7d\x13\xc7\x40\xa2\x8c\x00\xb9\xb7\xce\x93\x1c\xab\xd0\x0e\xa1\x63\xda\xf8\x96\x95\xf3\x1b\x34\x46\xdf\x0e\x1d\xa7\x45\x1b\xba\x46\x34\x5d\x08\xb4\x61\xfb\x03\xb9\xd7\x1b\xee\x1d\x1f\x8e\xc6\xda\x65\x40\xb2\x50\xf3\x2b\x8c\x76\xa2\x34\xbb\x55\x63\xaf\x68\xad\x0b\xab\xb5\xde\x0e\x1c\x9d\x76\x57\x77\x3d\x20\xf9\xfb\x93\xc1\x71\xd0\xec\x34\x04\x40\x1b\x5b\x73\x19\x0c\x97\xad\xe1\xa9\x1d\x80\x93\xe8\xba\x2b\xe6\x9a\xd1\xf1\x91\xf6\xde\xf4\x05\xe0\xaf\x30\x2d\x2a\xd1\xb5\x56\x18\x6c\xf5\x15\x47\xdd\xe1\x68\xd0\x37\x7a\xfb\x46\x67\xbf\x89\xb6\x16\x34\xee\x9b\x79\x6b\xd9\x85\x78\xd2\xd1\x9f\x0e\x82\xf5\x97\x7a\x8f\x74\x1f\x90\x2f\x32\x3d\xed\xe3\xc1\x60\xff\x69\xef\xe0\x20\x90\x4f\x07\xc3\x2f\xc8\xd1\x78\x70\x74\xd4\x79\xdc\xd5\x3d\x7a\x78\x74\xac\x1f\x6a\x88\x66\x87\xf2\xb0\x73\xf0\xe8\xb8\xbf\x87\x4f\xc3\xc6\x83\x20\xa5\xee\x63\xee\xc3\x43\xed\x6e\x7a\xad\x64\x66\x5b\x9f\x77\x96\x78\x66\x71\x80\x9e\x74\xde\xed\x0a\xa0\x9b\xed\xf5\xb5\x1f\x79\x3d\xbe\x59\x76\xac\x9a\xa7\x1a\x3e\x59\xbb\x8b\x9d\xa3\xa3\x03\x60\xf0\x35\xbf\x44\x0e\xe1\x6e\x67\xfc\x44\x37\x0f\x87\xa3\x73\x20\x7b\xfd\xcf\x1f\x0f\xc1\xe1\x3c\x3e\x00\x82\xeb\x47\xc3\xc1\x21\xb2\xe4\x42\x6b\xb7\x46\x8e\xc2\x7f\x85\x50\xbb\x42\x9f\x7c\x34\x1c\x3c\xe9\x3d\xec\x8d\x47\xd8\x64\xdb\xc8\x50\x8c\x06\x87\x5d\xf9\xf9\xe3\x61\x6f\xb4\xdf\xdb\x43\xbd\xcf\xfd\x01\x36\xf4\xe0\x60\xf0\x94\x1e\xba\x77\x70\x3c\x82\x6f\x1a\x56\xbe\xd0\x4e\x8d\x8d\x33\x23\x90\xa3\x01\x76\x8e\x7d\x8e\x1e\x27\xe7\x41\x87\x9d\x13\xaf\x6f\x84\xf6\xcc\x91\x6e\xeb\x76\x28\x8f\xc3\x51\x48\x01\x38\xd8\x99\x55\x3a\x43\x51\x32\xe4\x3f\xac\xe5\xf4\x65\xcb\xca\xf4\x00\x5d\x60\xd0\x42\x5e\x21\x6d\x83\xa8\x1c\xc9\x47\xd5\x1c\x70\xdc\x71\x2a\xef\xbe\x25\xf7\xc2\x47\xe1\x30\x14\xbb\xe1\xce\xed\x1d\xb9\x3d\x98\x96\xa1\xdc\x79\xfb\xed\x7b\xed\x00\xd2\xf0\x18\x6d\xd6\xfb\xa6\xfb\xe0\x1a\x45\x4a\x0b\x35\x06\x1c\x89\xa0\x3a\x8b\x8a\x97\x8e\xc7\x66\x39\x59\xc2\x08\x2d\x59\xbf\x55\x72\x67\x37\xdc\xdd\xd9\x15\xdb\x23\xb5\xe4\x76\x41\x55\xab\x6e\x17\xc2\x51\xcb\xb3\xda\xe5\xd0\x16\xfb\xc3\xdd\xdd\x37\xc3\x37\x77\x6f\xef\xde\xda\x91\xe5\x59\x9e\xad\x4e\xcf\x84\xf9\xd1\x5d\xb9\xfd\xf9\x55\xaa\xf8\x8b\xf5\x66\x0a\x3d\xfe\xd8\xf6\x78\x37\x9d\xc9\x63\xd4\x6f\x47\xca\x93\xa6\x3c\x64\xaa\xed\x3d\x80\x6d\x92\x71\x64\xb3\xd3\x86\x1e\x48\x8f\xe8\x4e\x28\x0f\xe3\x62\xaa\x92\x24\x4a\x55\xb6\x2a\x2a\xf9\x11\x0f\x6e\xe8\xa8\x75\x99\x13\x87\x95\x25\x80\xb1\x80\x2a\x79\x17\x00\x95\x96\xcc\xb9\xd5\x9b\xb3\xc6\x2c\x31\x7b\xd6\x89\x26\xe4\x99\x4a\x38\x44\xb7\x4a\x55\x3a\xcf\xf2\xa9\xc2\x4a\x07\x16\x77\xc5\x7b\xed\xe1\x9c\xab\x79\x96\x2f\x58\x11\xca\x4f\x4d\x19\xcc\xa6\x4b\xd1\xec\x3c\x15\xe3\x1f\xc2\x77\xbf\x27\x7e\x8d\xd6\x5e\x94\xc4\xf3\x2c\x4f\xe3\x48\x26\xd1\x85\x6d\x41\xe1\xc6\x6c\xed\x3b\x85\x13\x76\x4f\xa2\x0b\xa0\x9a\x04\x92\x4a\x42\x3b\x14\x36\x4a\xdb\x0e\xa4\x3d\xa4\x63\x44\x3c\xce\x93\x78\x5a\xde\xca\xe6\xb7\x92\x08\x84\x3b\xe8\x5d\xa1\x7c\x5a\xf1\x7a\x66\x71\xb1\x84\xba\x75\x83\x17\x31\x75\x20\x59\xca\x50\x6a\x58\x77\xd3\xb8\x8c\xbf\xac\xb4\x65\x8f\xe5\x22\x29\xf3\x71\x4c\xcf\xa2\xbc\x84\xf9\x82\xc9\x3a\x3d\x73\x09\x4c\x3e\xcb\xe4\x64\x55\xc4\x29\x38\x99\x68\xa6\x1c\xa7\x90\xe2\x1b\x95\x51\x89\xea\xeb\x9d\x85\xca\xe3\x69\x14\x50\xa2\xde\xb8\x32\x3e\x2e\xa5\x16\xdd\x80\x9c\x9f\xab\x01\x23\xbe\xb4\xca\xe3\x62\x16\x4f\xdd\x9a\xf2\x47\x6a\x06\x4c\xa7\x7b\xd9\xca\xe1\x3f\xed\x67\x20\xff\x92\x12\x6c\x0a\x53\x48\x76\x80\x02\x9c\xf3\xe7\x2a\x5d\x29\x89\x34\x28\x71\x2a\x47\x51\x5a\x46\x72\x2f\x89\xf2\x48\x3f\x0e\xd0\x5a\xce\x3d\x36\xb7\x9b\x64\x40\x8f\x80\xac\x14\xd5\x72\x96\x69\x56\x94\xc5\x55\x94\x42\x53\xdd\x5a\xbc\x94\x0c\x2d\x63\x98\x46\x65\x99\xe5\xa9\x5a\x17\x5b\x72\xae\x48\xad\x54\x3d\x5f\x82\x7d\x8a\x50\xa3\xa8\x9a\xad\x34\x7d\xde\x37\x19\xbe\x54\xdb\x8a\xe0\xa6\xa5\x68\xb9\x47\xd3\xb2\x30\x19\xfb\x5e\x4a\x52\x69\x50\x2a\x36\x8a\x10\xda\xfa\x38\xcb\x66\x50\x2d\x60\x25\xaa\x70\xda\xa9\x19\xd4\x82\x09\x3d\xad\xfd\x44\x38\x4e\x28\x33\x63\x2d\xc2\x26\x4a\x4f\x57\xd1\x29\x29\x21\x1a\xd2\x13\x1e\x58\xa1\xf7\xe5\x32\x5f\x69\x07\x91\x7c\x11\x70\x95\x72\x8c\x4a\xd8\xd8\x3c\xa6\x7a\x2a\xf3\x83\x36\xa2\xdd\x50\x0e\x5d\x89\x7b\x8c\x2f\x4c\xa9\xa6\xa2\x53\xc8\x89\x2a\x2f\xb4\xa9\xda\x0c\xfd\xab\x44\x03\x8a\x00\x09\x01\xcd\x7a\x70\xc6\x55\xd8\x07\x23\xf4\x22\x5a\x44\xe0\x5a\xe6\x71\x41\x82\x50\xcd\xc5\x32\x7a\xd8\x89\x08\x6b\x55\xc6\x49\xfc\x65\xe3\x3a\xd3\x1e\xdb\x40\x8b\xc5\x55\x90\x06\x18\x63\x25\x28\xeb\xe0\x9a\x0a\x62\xbd\xa0\x05\xef\xc9\xf4\xe6\x7e\x27\x61\xf9\xbe\xfa\xfd\x55\x8c\x40\x22\xa8\xde\x0f\x45\x3f\x43\xa6\x5f\x8a\xbd\x12\xe3\x73\x3a\xc3\x45\x6f\x56\xa4\xcd\x8d\xc0\x10\xc6\x25\xb2\xd3\xaf\x65\x34\x23\x35\x17\xfd\x75\x06\x8d\x43\x43\x75\x27\x94\x87\xab\xa4\x8c\x97\x89\xba\x65\xe4\x6a\x01\xc2\xd0\x10\x19\x04\x30\x9a\x42\x72\x5a\xe5\xd5\x91\xd7\x50\x1b\x51\x21\x5b\xe6\xc1\xd4\x81\xb3\x56\x28\x1a\x7e\x68\x48\xb6\x68\x86\xd6\xdf\x0b\x82\x34\xc8\x45\x0c\x89\x5b\x18\x30\x25\x2e\x6d\x00\x8e\x9f\x83\x70\xe3\xab\x0e\x8f\x0e\xb8\xde\xd3\xd1\x25\xe4\x3c\x5a\x61\x77\x7b\x1b\x2a\xd9\x88\x57\xa2\x7d\xb5\x8e\xd8\x70\x60\xd2\x36\xb1\x75\x6b\x43\xfe\x2d\x14\xa2\x35\xae\x70\xdc\xa1\x30\xbf\x7e\x2e\x48\xf4\x79\xbb\xed\xa6\x34\x1e\x47\xcd\x76\xc2\x1d\x88\xed\x5a\x5e\xc4\xf6\x03\x93\xb6\xd5\x6b\x17\x59\x92\xf8\x05\x74\x04\x36\x83\xf6\x84\xc9\x03\x72\x22\x1e\x0b\x40\x2a\x8c\xeb\x66\x89\x94\xf2\xac\x2c\x97\xef\xbc\xf1\xc6\xc5\xc5\x45\xb8\xc0\x76\x86\x59\x7e\xfa\xc6\xe1\xd1\xc1\x1b\x42\x18\x2e\xf5\x66\xa1\x4f\xc7\x8a\x70\x2f\xc0\x85\xc1\xe9\x37\x24\xb5\x10\x97\xcb\xc9\x50\x61\x2a\xed\x97\x54\x4f\x9c\xc4\x7a\xbf\x64\xea\x79\x87\x67\x1e\xa0\x3f\x34\xde\x53\xbb\x45\xa2\x0d\x61\x69\xba\x60\x07\x70\x31\x3f\xb5\x96\x13\x73\xb8\x4f\xa7\x12\x17\xf2\x77\xaf\xf5\x47\xd2\xed\x0d\x31\xf9\x26\x9a\x96\x4b\x9e\xab\x9f\x74\xc4\xcb\xc3\xe1\x13\xd9\x70\x35\xd6\x82\xb8\x8c\xee\xfc\x18\xd9\x49\x12\x31\xc4\xaf\x1f\x82\x92\x12\x94\xfe\x38\x3b\xdb\x76\xd1\x7e\xe7\x15\xbe\xaf\x63\xd7\x5c\xb2\x66\xae\xf3\xa6\x79\x4f\xb5\xee\x60\xb6\x37\x42\x3c\x94\xc0\x87\x9a\xfc\x3b\x4c\x79\xf9\xbf\xfe\xee\xef\xfe\xee\xef\x48\x33\xf3\x03\x6b\x5d\x01\xa3\x6c\x79\xa6\x5c\x03\x30\x9b\xc3\x0d\xfa\x1e\xe1\x62\xe9\x1c\x13\x50\x1f\x82\x2a\x9a\xe1\x4b\xa1\x24\x1d\x22\xa7\x55\xed\x2e\x50\x35\xa5\x78\xb9\x58\xd7\x32\xf5\xfc\x59\x9b\xeb\xf5\x15\xb6\xe4\x77\xbc\xf3\x26\xcd\x20\x3c\x8c\x0f\x07\xb3\xd3\xa8\x3c\x6e\x7e\x87\x7d\xfc\xe1\xd1\x41\xe0\xeb\x18\x0a\x23\x9e\x35\x59\x13\xcf\x26\x05\xbf\x9c\x5e\x41\x65\x60\x34\x7f\x96\x49\x04\xe2\xd7\x6a\x61\xcd\x2c\xca\x48\x00\x7f\x14\xac\x33\xe7\x5e\x97\x9d\x92\x3f\xea\x77\x3c\xf8\x2c\xc8\xbc\x20\x94\x82\x48\x92\xf4\x60\x56\x5f\x1f\x78\xe8\x31\x3d\x1b\xae\xf3\xd1\xb8\xee\x45\x65\xa3\xf7\xdb\xd0\x12\xa2\x3f\x18\x77\xdf\x01\x93\x0d\xaa\x21\xf9\x41\x76\xaf\x76\x44\xf9\x8a\x44\x4f\xff\x64\x6d\x61\x14\xf6\x1e\x46\x8d\x35\x82\x8b\x49\xe7\xb4\x61\xe9\xe2\x6e\x4a\x3c\xfa\xc4\x59\x27\x36\xb4\x24\x8f\x6c\xe8\xdd\xbc\x1c\xa4\x54\xf8\x9d\xfe\xae\xe0\xd6\x72\x9a\xb4\x4e\x85\xb1\xf4\x13\xe5\xff\x0e\xdf\x00\xa3\x76\x12\x15\xea\xd6\x4e\x78\xfb\x63\x61\x81\xbf\x82\xff\xfd\xcd\xfb\x3b\xbb\x15\xfe\xf7\xbb\xb7\xef\xdd\xbe\xe1\x7f\xff\x24\xfe\xf4\xfa\xe3\xee\xf0\x61\x67\xd4\x95\x47\xc7\x0f\x0f\x7a\x7b\x8c\x91\x10\xc2\x52\xc0\xdf\xfe\x55\xa1\x80\xdf\xda\x72\x6b\x22\xb7\x5e\x8b\x04\x5e\x70\xfd\x64\x9d\xa8\x80\x48\xe0\xbd\xb7\xb0\xdd\x66\xde\x56\xfe\xca\xd1\xc0\xeb\xf6\x5a\xdb\xda\x6b\xe8\xaf\x0c\x11\xfc\xd6\xd6\x95\x54\x13\xa6\xe1\x9f\x20\x15\x3c\x90\xc0\x6f\x6d\xd9\xfa\x10\xd3\x88\xd7\xa4\x81\xdf\xda\xaa\x99\x87\xde\x80\x7c\xd2\x44\xf0\x5b\x5b\x4e\x81\x83\xd3\xc3\xaf\x42\x05\x2f\x68\x2c\xe5\x87\xa6\x82\xdf\xda\xa2\x1f\x3b\x7d\xf2\x29\x25\x83\xdf\xda\xf2\x16\x8c\xed\xfa\x5f\x73\x3a\x78\x92\x54\xff\xa4\x18\xe1\x1f\xe2\xfb\x3e\x26\x52\xf8\xad\x2d\xef\x0e\x33\x48\xaf\x40\x0b\x2f\xe2\x0a\x59\xc5\xab\xac\xd2\x1b\x5a\xf8\x8f\x86\x16\x7e\x6b\xcb\xe9\x71\x6f\xbf\xbd\x21\x86\xbf\x21\x86\x6f\x22\x86\xdf\xda\xfa\x50\xcc\xf0\xc2\x8d\x43\x7f\x78\x66\x78\xb1\xa9\xaa\xe3\xd5\x99\xe1\xb7\xb6\x04\x53\xc3\xcb\x8f\x88\x1a\x1e\x93\x3e\xaf\x46\x0d\x6f\x16\xa1\xcf\x0d\x2f\x48\x85\xed\x37\x92\x1b\x1e\x0d\xa1\x2b\x19\xe2\x37\x45\x19\x3f\x02\xe2\xe5\x4d\x14\xf1\x97\x72\x40\xbf\x23\x84\x1e\xc4\x1b\x8e\xf8\x66\xba\x65\x3d\xc7\x3e\x8d\x24\xf1\xdb\xd3\x76\x33\xc6\xaf\x81\x25\xfe\x97\x47\x12\xbf\x3d\x6b\x5f\xc6\x12\x7f\x43\x12\xbf\x89\x24\x9e\x37\xa3\x46\xaa\x78\x21\x5e\x87\x2b\x5e\x6e\xe0\x8a\x17\xaf\xb3\x65\x49\xc3\x15\xff\xf1\x6c\x3e\x37\x64\xf1\x8d\xbb\xd7\x0d\x5b\xfc\xa7\x8a\x2d\xfe\xb2\x4d\xdc\xa5\x8b\x77\xd8\xe2\x3f\x46\xb2\xf8\xcb\x37\xeb\xdd\x1b\xb2\xf8\x1b\xb2\xf8\x1a\x59\x3c\xd3\xc5\x6e\xa6\x8c\x47\x7b\xf9\xfa\x9c\xf1\x55\xc2\x6d\x97\x33\x5e\xbc\x22\x67\xbc\xbc\x84\x33\x5e\xbc\x1e\x67\x7c\x63\x0e\xba\x89\x13\xfd\xda\x9c\xf1\xbe\xfb\x28\x3e\x04\x67\xbc\xac\x73\xc6\x8b\xd7\xe7\x8c\x97\x75\xce\x78\xf1\x9a\x9c\xf1\x0d\x9c\xfa\xa2\x7c\x6d\xce\x78\xd9\xcc\x19\x2f\x5e\x83\x33\x5e\x22\x67\x3c\xcf\xe2\x2b\x98\xe3\x51\x01\xf3\x1a\xd4\xf1\xcd\x33\xd9\xa5\x8e\x17\xd7\xa4\x8e\xdf\x40\xb8\xe3\x51\xc7\x8b\xeb\x51\xc7\xcb\x6b\x52\xc7\x8b\xeb\x50\xc7\x6f\x78\x8b\x4f\x1d\x2f\x5e\x89\x3a\x5e\x5e\x45\x1d\x2f\xae\x4d\x1d\x2f\xaf\x41\x1d\x2f\x5e\x89\x3a\x5e\x5e\x93\x3a\x5e\xbc\x02\x75\xbc\xbc\x8a\x3a\xfe\x72\xf2\xc0\x1a\x75\xbc\xbc\x06\x75\xbc\x78\x05\xea\x78\x5e\x15\x57\x11\xc8\x0b\x71\x5d\x06\xf9\xea\x8a\xa8\x31\xc8\x8b\xeb\x33\xc8\xd7\x09\x19\x3d\x06\x79\xf1\x0a\x0c\xf2\xf2\x0a\x06\x79\xf1\xca\x0c\xf2\xf2\x32\x06\x79\xf1\x8a\x0c\xf2\xf2\x12\x06\x79\xf1\x3a\x0c\xf2\x72\x13\x83\xfc\x06\xf2\xc5\x72\x23\x83\x7c\x93\x19\xf9\x91\x31\xc8\x87\x37\x14\xf2\x1e\x85\xfc\xd6\xd6\x75\x39\xe4\x85\x83\xe1\xb8\xe1\x90\xff\xcd\xe4\x90\xaf\xad\x9e\x1b\x12\xf9\x8f\x94\x44\xfe\xd7\x9d\x43\x9e\xb7\xe9\x26\x26\x79\xe7\x44\xbf\x36\x95\xbc\xdc\x44\x25\x2f\x5e\x97\x4a\xbe\x86\x07\x15\xaf\x4f\x25\x2f\xab\x54\xf2\xe2\x75\xa9\xe4\xe5\x06\x2a\x79\xf1\xea\x54\xf2\xf2\x72\x2a\x79\xf1\x6a\x54\xf2\xf2\x12\x2a\x79\xf1\x6a\x54\xf2\x57\x71\x2f\x8b\x57\xa2\x92\x97\x97\x51\xc9\x8b\x57\xa6\x92\xdf\x44\xa5\x5e\x88\xd7\xa0\x92\x97\x8d\x54\xf2\xe2\x43\x50\xc9\xcb\x06\x66\x60\xf1\xda\x54\xf2\xaf\x40\xa5\x7f\x25\x95\xfc\x66\x6e\x62\xd1\xfc\x25\x1b\xa9\xe4\x37\x73\x13\x6f\x78\xd2\x15\x54\xf2\xb2\x91\x4a\x5e\x5c\x9b\x4a\x9e\xf7\xb2\x6b\x12\xca\x0b\x71\x05\xa3\xbc\x7c\x05\x46\x79\xe1\xd1\xa6\xef\xdc\xfa\x10\xec\xf1\xa2\xca\x1e\x7f\xb9\x76\xd8\x55\xec\xf1\xe2\x8a\x28\xc2\xf5\xd9\xe3\x45\x9d\x3d\x1e\x9d\x82\x0f\xc1\x1e\x2f\x5c\x02\xdf\x0f\xc5\x1e\x2f\x2c\x7b\xfc\x06\x09\xac\xeb\xb3\xc7\x0b\x7f\xc7\xfa\x70\xec\xf1\x1e\x0c\xe5\x43\xb3\xc7\x0b\x7f\xec\x6e\xd8\xe3\x6f\xd8\xe3\x7f\x65\xd8\xe3\x79\x03\xae\x72\xc8\xdb\x9d\xf6\xd5\x48\xe4\x65\x03\x89\xbc\x78\x5d\x12\x79\x59\x25\x91\x17\x1f\x01\x89\x3c\xbf\x57\xdc\x90\xc8\xdf\x90\xc8\xdf\x90\xc8\xff\x7a\x91\xc8\x87\x42\x3c\xcc\xf2\x44\x3f\xdb\x14\x55\x7b\xf4\xf1\x5b\x5b\xa6\xec\x6e\x6b\xeb\x32\x06\x79\x99\xaa\x0b\xf1\x91\x30\xc8\xcb\x2a\x83\xbc\x78\x75\x06\xf9\xf0\x86\x42\x1e\x17\x90\x19\xbd\x26\x0e\x79\xf3\x4b\x26\x91\x17\xa6\x62\xe5\x93\x20\x91\x0f\x3f\xed\x2c\xf2\x5b\x5b\xc4\xb1\xb0\xb5\x15\x88\xad\x2d\x43\x24\xbf\xb5\x15\x48\xf8\x27\xff\x95\x69\xd3\xf5\xbf\x88\x4d\x7e\x6b\xab\x8f\xac\xf2\x66\x90\xe0\x1f\xa3\xbd\x56\x20\x5a\xbd\x87\x5b\x5b\x97\x30\xcd\xcb\x57\x61\x9a\x17\x57\x32\xcd\xd7\xad\xbd\x4d\x4c\xf3\xe2\x4a\xa6\x79\x79\x5d\xa6\x79\x2c\xbe\xbe\x9a\x69\xbe\xca\x82\xd1\xc8\x34\x2f\xae\xc9\x34\x5f\x65\x2d\xde\xc0\x34\x2f\xae\xc3\x34\x2f\xaf\xc5\x34\x2f\x7c\xa6\x79\x58\x2a\x77\xa9\x51\x36\xb2\xc2\xcb\xb4\xc6\xf8\x31\xf6\x7e\xbd\xc4\x5f\x3b\x50\xa4\x09\xe0\x2a\x48\x58\x7d\x13\xe1\x87\xdc\x09\x77\x84\xb1\x49\xe6\x59\x92\x64\x17\xba\x03\x29\xe5\xf8\x0e\xbe\xc6\x79\xaa\xb7\xc3\x5c\x76\x7e\x84\x72\x90\x26\xf5\x4b\x84\x7b\xc4\x4c\xa3\xf4\x55\x76\x9b\xd0\x6f\x0d\x95\x6d\x98\x0d\x03\x60\x4e\x06\x21\xdb\xb8\xe4\x1d\xeb\x19\x3d\x49\x66\xe3\xa4\xe8\xa4\xdd\x76\x8a\xea\xa4\x65\x33\x03\x37\x00\x18\xd8\xe8\x3c\x8b\x67\xbc\x08\xb3\x14\xfb\x91\x27\xe7\xbf\x87\xa4\x88\x1d\x20\xee\x80\x7f\x5f\x48\x07\x9a\x59\xcd\x8b\xb9\x86\x4d\x36\x37\x99\x5f\xe3\x1f\x5e\x32\x1f\x70\x0a\x8d\x2b\xe9\x53\x33\x74\x5e\xb4\x1a\x93\x66\xad\x4d\x4f\x6b\x79\x8f\x83\xf2\x24\x40\x4d\x01\x14\xc2\x25\xbd\x69\x7e\xbc\x39\x6c\x73\xb5\xc8\xce\x9d\x2c\x4d\x67\xa1\xd2\x19\x7a\x0e\xbd\x40\xf6\xe0\x7f\xbd\x40\xbe\x8b\x71\xa0\x77\x7b\x4e\xcc\x88\xa0\x71\xe6\x56\xf3\xf4\x60\xd3\xf2\xb7\xaf\xa5\x7b\x85\xe8\x40\xfe\x28\xe2\xb7\xca\xed\x5e\xaf\x6d\x2f\x8b\x66\x33\xc8\x65\xe3\xd2\x36\x85\x9b\x9c\x07\x20\x92\x54\xc0\xf4\xa8\x99\xb0\x09\x06\x2e\x03\x31\xb8\x5d\x98\x2b\x97\xad\x85\xcb\x95\x24\xc2\xd7\x97\x92\xd8\xda\xaa\x68\x49\x88\x66\x32\x9b\x0f\xa1\x25\x21\xac\x96\x84\xfc\x90\x5a\x12\xc2\xd5\x92\x90\x1f\x46\x4b\x42\x54\xb4\x24\xe4\x87\xd3\x92\x10\xae\x96\x84\xfc\x48\xb4\x24\x04\x6a\x49\xc8\x4f\xb9\x96\x44\x77\x78\xd8\xeb\x13\x5f\xe9\x8d\x98\xc4\x8d\x98\xc4\xaf\xa3\x98\x84\x36\xeb\x6f\xd4\x24\x6e\xd4\x24\x6e\xd4\x24\x7e\x15\xd4\x24\x50\x82\xe1\x46\x4e\xe2\x46\x4e\xe2\x46\x4e\xe2\x46\x4e\xe2\xa3\x91\x93\x08\x6f\xf4\x24\x6e\xf4\x24\x6e\xf4\x24\x7e\x4d\xf4\x24\x1e\xeb\xc9\xde\x3f\xd4\x1f\xd7\xd5\xcb\x73\xd4\x1d\x8e\xc2\x4d\x82\x12\x5b\x5b\x55\x45\x89\xad\xad\x8f\x48\x52\xc2\x7b\x74\x8d\x5f\x49\xbf\x26\x9d\x79\x17\x5d\xa9\x2a\x81\x4d\xfb\x8d\x94\x95\xe8\x8d\xf6\xba\x07\x07\x9d\x7e\x77\x70\x3c\xaa\xa6\x4c\x6f\x74\x25\x6e\x74\x25\x6e\x74\x25\x6e\x74\x25\x3e\x19\x5d\x89\xee\xe8\x68\xd0\x37\x67\xbb\x3e\x90\x21\xaa\xa9\x77\xa5\x1b\x61\x89\x5f\x31\x61\x09\x6d\x0e\x1d\x1d\x74\x6f\x51\x20\x1b\x0d\xe0\xf0\x53\xab\x2c\xd1\xff\x64\x95\x25\xa0\x9f\xbb\x5f\x04\x7b\x11\xd4\x25\x60\x8d\x3f\x6c\xcc\x2e\xbe\x9a\xbe\xc4\xa6\xc4\xa2\xa3\x30\x71\xfb\x57\x43\x61\xc2\x82\x64\xa6\xd9\xe2\x8d\xde\xd1\x41\x78\x56\x2e\x92\xdf\x08\x9d\x09\x4a\xef\x56\x48\x99\x22\x8f\x11\xc8\xce\x08\x2f\xaf\x89\xb8\xfd\x12\x6c\x59\x6d\x05\x65\x79\xb1\x41\x2f\x82\xd2\xa2\x6f\xf4\xd2\x65\x1e\x13\x42\xd4\x17\x8a\xa8\x5c\xb1\x49\x30\x42\x4a\xf9\x21\x34\x23\x0e\xbb\xfd\x7d\xed\x51\x8c\x84\xe8\x85\xce\x57\x41\x3f\x65\xa7\x59\x25\x6f\x65\x40\xde\x58\x4c\xe6\xc4\x01\x1b\xf3\xbf\xa2\xe5\x20\xe5\x02\xd9\xfa\x7c\x74\x1e\xb5\xf4\x50\xc2\xdf\x46\x90\xd1\x6f\x99\xca\x74\xd8\x60\x31\x6f\x8c\x68\x75\x0f\x7e\x59\xa7\xbd\xac\x16\x9a\x4b\x29\x7b\xbd\x50\x8e\xf9\xf5\xf2\xb8\x88\x80\x3a\xb2\xd7\x03\x0a\x92\xd9\xb9\xca\x4b\x38\x64\xe4\x61\x54\xaa\x3c\x8e\x92\x02\xf3\x5a\x91\xf3\xab\x05\xff\x4a\x2e\xf0\xd8\xd7\x3f\x9c\x2b\x48\x3a\x41\x38\x79\x65\x39\x72\xa6\x1e\x1d\xc8\x0a\xf9\xd0\x96\x49\xb4\xae\xa0\x46\xa2\xa9\xa9\x86\xd4\x0f\x7d\x47\xb6\xc0\x04\x26\x88\xb1\x34\xa4\x8f\x55\x5e\xec\x4b\xd0\x24\xa1\x6c\xc1\x87\xed\x86\xda\x27\xc9\xf2\x02\x63\x51\xa1\x01\x3a\x14\x04\x63\xd0\xc3\x19\xb4\x00\x26\x15\x90\xde\x5f\xef\x61\x0b\x5b\x0b\x30\x74\xf4\xb4\x44\x99\x49\x85\x0f\x42\xf2\xdd\x6c\x91\x95\x8d\xd1\x7e\x58\x8b\x2e\x90\xdb\x58\x65\x10\x77\x07\xf2\xf4\x8b\x3c\x2e\x4b\x95\xe2\x29\x50\xb0\xdf\x61\xf7\x14\x68\xfa\x9d\x50\x1e\x51\x0f\xf4\x75\x83\xc3\xe6\xb7\xe9\x26\x7b\xaf\xe3\xad\x70\xa2\xe4\x34\x4a\x12\x35\x13\xf6\x4b\x71\x76\x59\x7c\x98\x4c\x33\x3c\x03\x75\xdb\x2e\xb2\x7c\x26\xdd\x6b\x2d\x0a\x8c\x53\x8b\x0b\x55\x88\xda\xe7\xc8\x2b\x3f\xe7\x97\xc3\xff\x1f\xbe\x31\x5a\x2a\xed\x00\xde\x7a\xeb\xfe\xc7\x22\xfe\x70\xa5\xfe\xc3\xed\x9d\x9d\xfb\x77\x2b\xfa\x0f\x77\xee\xde\xdf\xb9\xd1\x7f\xf8\x24\xfe\x38\xe7\xc5\xb4\x2d\x77\xde\x7e\xeb\xbe\xde\x2e\x8e\xd3\x18\xb0\x5a\x48\x51\x33\xce\xf2\x2c\x2d\xb3\x50\x3e\xa5\x39\x3c\x59\xcb\x27\x2a\xcd\xd7\x92\xe6\x4e\x28\xfb\x59\x29\x88\xc1\x02\xf3\xa2\x46\xae\x8c\xf7\x23\x7d\x86\xd9\xa9\x6f\xe9\xbc\x7c\x0e\x18\x63\x9a\x98\x6d\x8c\x6b\x4d\x88\x76\x96\x48\x83\x9c\x70\xd0\xba\x28\xd5\x22\xb0\x38\x6e\xc7\xdc\x8e\x4b\x39\xcf\x15\xa4\x60\x2b\x46\x94\xdd\x57\x19\x86\xa4\xf7\x89\x77\x84\x20\x72\xd6\x68\x55\x9e\x21\x23\xae\xde\x25\xaa\x3e\x25\xee\xdb\x29\x02\x86\xa7\x48\x85\x6b\xb6\x74\xa7\xf1\x81\x48\x33\x13\x4c\xc9\x2e\x64\x74\x31\x5f\x25\x81\x4b\xa3\xb2\x06\x9f\x85\x72\xc9\x33\x35\x57\x53\x2c\x66\x02\x7c\x3c\x15\xb9\x65\x0e\x6a\xd1\xed\x19\x77\xfb\x5d\xc4\x85\x89\xf4\xa8\x99\xb1\x7c\x26\xda\x65\xd4\xde\x69\x5c\x0a\x4c\xf7\x64\xf0\xc3\x8c\xc6\x21\x14\xe2\x8e\x3e\xbe\x30\x7e\x60\xe0\x79\x8c\xc7\x5b\x26\x51\x9c\x26\x6b\x38\x50\x91\x26\x5e\x9f\xaf\x81\x05\xd7\x35\xbe\x5d\x00\x08\x8c\xd3\x2c\xa6\xe6\xdc\x4e\x84\x5f\xf6\x9c\xbf\xf9\x63\xff\x84\x6f\x7c\x31\x55\xe5\xc7\xb5\xf3\xe3\x9f\x2b\xf6\xff\xdd\x3b\x77\x77\x2a\xfb\xff\xee\xbd\xbb\x77\x6e\xf6\xff\x4f\xe2\x8f\xde\x60\xbe\x18\xf6\x55\x19\xc8\x5e\x3a\x0d\x8d\x95\xee\x9f\x0b\xbb\xb7\x6f\xdf\xbe\xb5\x7b\xfb\xf6\x8e\x7f\x6d\x34\x8f\xd6\xaa\x2c\x95\x17\x97\x13\xc7\xa3\x4e\x75\xaf\x77\xb9\xab\xf5\xf6\xa4\x77\x65\x89\x18\xdc\xfc\x14\xf9\x8e\x61\x8f\x57\x79\x91\x31\x03\x09\xa2\xa4\xb4\x97\x29\x6a\x5b\x1f\xa0\x7e\x0c\xd7\x7e\x95\x75\x00\x94\xbd\xd0\x03\x66\x7b\xb7\x85\xdc\xa0\x33\x15\x25\xc2\xd4\x8a\xd2\xc3\xd8\x56\x73\x4e\x82\x2b\xa8\xfe\x9c\x6a\x52\xa6\x8e\xd5\xed\xb4\xac\xb1\x0b\x05\x9f\x45\x80\x6e\x17\x5c\xe0\xf2\xc7\x1a\xfe\xd1\x42\x25\x89\x20\x72\x19\x53\xd1\xc5\x10\x0d\x3a\xd8\x30\x18\x42\x5d\x54\x18\xbe\x34\xef\x4b\xb4\x4b\xbf\xca\x53\xc0\x90\x0b\x8c\x06\x17\xd9\x25\x67\xdf\x34\x4b\x91\xc4\x8e\xc1\xe8\x28\x2d\x37\x35\x63\x4f\x80\x12\x0c\xcf\xc5\x85\x6b\xbc\x72\x21\x39\x07\xa2\x1c\x57\x4b\x38\x5c\x39\x24\xa9\x52\x46\x28\x4b\x50\x8d\xdd\x8c\xac\x75\x30\x7e\xd2\x95\xa3\xc1\xa3\xf1\xd3\xce\xd0\xc7\xe9\x92\xcb\x6f\xf3\x9f\x1b\x70\xb8\x08\xc0\x95\x83\xa1\xa8\xc3\x6f\xe5\xc3\xe3\x31\xe4\xc6\x20\x5d\xd6\xdd\xe7\x44\x9f\x03\xc0\x1d\x3c\x72\x90\xb5\x10\xc0\x04\x70\x6d\xbf\x3b\xc2\xec\x6a\x23\xc0\xb6\xd3\xdf\x97\xfd\x41\x9f\x00\xb6\x5d\xed\x06\x87\xb2\xd7\x97\xfd\x01\x24\x46\xc7\x94\x0b\xd5\xaf\x42\x24\xe8\x08\x13\x7c\x47\x27\xc3\xde\xe3\x27\x63\xf9\x64\x70\xb0\xdf\x1d\x8e\x9c\x74\x32\x27\x90\x21\x70\x1a\xb8\x19\x57\xcc\xc6\x9a\x7c\x67\x20\x38\x8b\x0e\xb8\x5a\xd9\xd9\xe3\x6c\xa2\x4d\x9c\x43\x7e\xdd\xcf\x9e\x77\x86\xbd\x11\xa7\x41\x03\xa9\xbb\x73\xf0\x48\xb7\xa9\xd7\xd7\xf7\xf5\x11\x20\x8b\xe0\x5e\x6f\x44\x06\x43\xf8\xf7\x31\xa2\x8a\xb1\x2d\xfb\xdd\xce\x41\xaf\xff\x78\xa4\x6f\x76\x2f\xe6\x24\x94\x4d\x32\xd5\x33\x34\x44\xa9\x44\x99\x91\x82\x83\x6d\x49\x74\x61\x27\x47\x49\x3c\x6b\x4e\x2a\x47\x4f\xc5\x86\x4b\xbd\x24\x87\xb4\x49\x8e\x1b\x63\xe3\x8a\x3f\xe1\x1b\x87\xab\x24\x4a\x8f\x46\x07\x1f\x9b\xfc\xdf\x15\xe7\xff\xee\xce\xce\x4e\xf5\xfc\xbf\x73\xef\x46\xff\xef\x93\xf9\xf3\xf2\xbb\xdf\x7f\xf1\xf5\xbf\x7f\xf1\x83\x7f\x7e\xf9\xbd\xff\xf1\xf3\x1f\xfc\xf8\xc5\xb7\x7e\xf8\xf3\x1f\x7e\x35\x90\x1f\xfc\xdd\xdf\xed\x7c\xf0\x8d\xf7\x64\xe3\xaf\x7f\xf1\xb3\x6f\xf2\x05\x42\xec\xde\xde\x79\xfb\xc5\x4f\xfe\xf1\xad\x97\xdf\x7d\x8f\x63\xbf\x8c\x9b\x9a\x66\xc5\x34\x09\xb3\xfc\x34\x9c\xa6\x66\x9a\x09\xf1\xf2\x0f\xbe\xff\xe2\x87\x3f\x69\xfd\xfc\x9f\x7f\xf8\xfe\x3f\xfd\xa8\xf5\xc1\x77\xbe\xf6\xe2\x6f\xff\xe3\x8b\xf7\x7e\xf4\xaf\x5f\xf9\xea\xfb\xff\xfc\x2f\x1f\xfc\xc5\xf7\xf5\x5f\xfe\xe5\x07\x2f\xff\xe2\x27\x2f\xbe\xf5\xc7\x2f\xde\xfb\xc3\x17\xdf\xfa\xf3\x17\xdf\xfa\xcb\x4d\x0d\xa1\x76\xfc\xe2\x67\xef\xb5\x5e\x7e\xf7\xef\xcc\x6f\x5a\xbf\xf8\xd9\x37\xf4\x93\xff\xeb\x1f\xbc\xff\xe3\x3f\x79\xf9\xbd\xbf\x79\xf9\x77\xff\xe3\x83\xef\x7c\xed\x83\x9f\xfe\xd7\x97\xdf\xfb\x3f\x7e\xf1\xb3\xef\x40\xa0\xef\x76\x28\x5f\xfc\xe0\x3b\xef\xff\xe4\x1b\xf0\x2f\x6e\xcf\xcb\xff\xfd\x87\x2f\xbf\xf9\x47\x1f\xfc\xc5\x7f\x6f\xfd\xfc\x1f\xff\xe6\x83\x6f\xfe\xa0\xf5\xf2\xaf\xbf\xf6\xf2\xbd\x3f\xfb\xe0\x3b\x5f\xc3\x87\xbf\xf8\xee\xf7\xfd\x37\xbd\xff\xe3\x3f\xd1\x8f\xfe\xfe\x9f\xbc\xf8\xe9\xb7\x5e\xfc\x6f\xdf\xfc\xe0\xaf\x7e\xfc\xe2\xeb\xff\xf0\xf2\xdb\x7f\xf4\xf2\x6f\xfe\xaf\x0f\xbe\xf3\xb5\x7f\xfb\xab\x3f\x7c\xf1\x67\xef\xfd\xeb\x57\xfe\x80\x5e\x02\xcf\xfc\xf9\x57\xbe\x4e\xef\x79\xf1\xf7\x7f\xf8\xe2\x5b\x7f\xf9\xc1\x37\xde\x7b\xf9\xbd\xff\xf0\xf2\x1f\xfe\xf3\xfb\xff\xf2\xbd\x97\x7f\xfc\xb7\x1f\x7c\xe7\x6b\xef\xff\xf3\x77\x5f\xfc\xa7\xaf\x5e\xfa\xc6\x9f\xff\xd1\x7f\xfb\xe0\x6b\x3f\x7a\xff\xa7\x3f\x7d\xf9\xde\xb7\x5b\xfa\xde\x9f\xfe\xf4\xc5\x0f\xfe\xfa\xfd\x7f\xfe\x4f\x2d\xf3\x36\xef\xa7\xf8\xc2\x97\xdf\xfa\xb3\xf7\x7f\xfa\xb7\xd8\x8c\x0f\xbe\xf3\xb5\x97\xdf\xfd\xe9\xcb\xbf\xfe\x9a\xee\xe8\xaf\xff\xa8\xf5\xe2\xeb\xff\xf0\xf3\xaf\xfe\x85\xfb\x10\xff\x47\xf8\x84\x5f\xfc\xec\x9b\x7a\xf8\x1a\x5a\xf4\xfe\x8f\xbf\xf2\xf2\xdb\x3f\xf9\xf9\x57\xbe\xf9\xf3\xef\x7f\xe5\x17\x3f\xfb\xe6\xcb\x3f\xfd\xbf\x71\x58\xf5\xf0\xc1\xdf\x5f\xbe\xf7\xed\xf7\x7f\xfc\xa7\x2f\xbe\xfe\xa3\x17\x5f\xff\xef\x2f\xfe\xec\x9b\xe6\xe7\xa6\x21\xfa\xae\xff\xe7\x6f\x5f\xfc\xed\xd7\xf4\x4f\xf0\x16\x6c\xf5\x77\xbf\x81\x17\xbf\xfc\xf6\x4f\x5e\xbe\xf7\x6d\xf7\x76\xfd\xc6\x3f\xfa\x87\x17\x7f\xff\xe7\xf7\x6e\xff\xbb\x0f\xfe\xea\x1f\x5f\xfe\xe9\x7f\x79\xf9\xde\xb7\xff\xed\x2f\xf5\x5f\xf4\x43\xfe\xf8\x3f\x7f\xf0\x5f\xbe\xff\xf2\x7b\xff\xe1\x5f\xbf\xf2\xd5\x9f\xff\xbf\x5f\xfb\xb7\x3f\xfa\x73\xb8\xfd\x47\xef\xff\xd3\xb7\x5f\x7e\xf7\x1b\xef\xff\xd3\xff\xf7\xf3\x1f\x7e\xf5\xc5\x7b\x3f\xae\x8c\x8f\x9d\x04\xef\xff\xd3\x3f\xbd\xff\xe3\xaf\x38\xc3\x76\xe9\x90\x5c\x32\x94\xfc\x86\x9d\x50\xbe\xfc\xd3\xf7\xde\xff\xe9\x7b\x78\x21\x3e\x01\x7e\xf3\xf2\x87\xdf\x7a\xff\xc7\xff\xcd\x9d\x21\xff\xe7\x4f\x5e\xfe\xc7\x1f\xf8\xef\xc1\x7b\x5f\xfe\xc1\xf7\x5f\xfe\xfd\x8f\xdf\xff\xc9\xd7\x5f\x7e\xe5\xff\x67\xef\x5f\x9b\x23\xb9\xee\xfb\x70\xfc\xf9\x79\x15\xa7\x50\xff\x7f\x88\x49\x35\x7a\x17\xd8\x9b\xc8\x75\xb9\x32\x0b\x0c\x76\x47\xc2\xce\x40\x33\x03\xd2\x9b\x54\xea\xe7\xc6\xcc\x19\xa0\xc5\x9e\x6e\xa8\xbb\x07\xe0\xa4\x7e\x0f\x18\x39\x94\x48\x4b\x94\x98\x58\x17\xcb\xa2\x62\xc9\x16\x2d\x2a\x91\x44\xa6\x2c\x2b\xd4\x92\x92\xaa\x92\x77\x92\x2c\xc0\xe5\x23\xbd\x85\x5f\x9d\xef\xe5\x5c\xba\x7b\x00\x2c\x45\xd2\xb2\xcd\xad\x92\xb8\x0b\xcc\x74\x9f\xfb\xf9\x5e\x3e\xdf\xcf\xe7\xc7\xef\xff\xd5\x7f\xd2\x43\xfc\xd2\x9b\xef\xbf\xf6\x67\xce\x3f\x5f\x7d\xfc\x8b\x5f\xe1\xdf\x3f\xf8\xfe\x7f\x7d\xff\xab\x3f\x3d\x7d\xf5\x07\xf8\xcf\x47\xef\xbc\x7a\xfa\x8d\xb7\xce\xfe\xcb\x8f\x3e\xf8\xe6\x8b\x7a\xdd\x3a\xcd\xd0\xa3\xff\xa5\x37\x4f\xbf\xf1\xd6\xa3\x77\xdf\x58\xb6\x27\xf5\xc3\x71\x4f\xbe\xf4\x4b\x1e\xad\xdf\xbd\xf7\xb5\x47\xef\xbc\xfa\xf8\xe7\x0f\xf1\x23\x7a\x8a\x5f\xfb\x3b\xee\xf0\x06\x77\xf8\xd1\x3b\x7f\x71\xfa\xf2\x4f\xb8\xc3\xff\x38\xbd\xfd\xdd\x7b\x2f\xe3\x7b\xce\x5e\xff\xe9\xd9\xf7\x7f\xf8\xf8\xc7\xff\xe9\xf4\xe7\x7f\x85\xbf\xfd\xe0\xbb\x3f\x3a\xfd\xd1\xb7\x7f\xf7\xde\x2b\x6e\x3b\x75\xcf\x7e\xf3\x3d\x3d\x28\x2f\xff\xf2\x83\x17\x7f\xa0\xdf\xf5\xe3\x6f\x9e\xbd\xf2\x97\xe6\x9f\x66\x74\x1e\xff\xfc\x9d\xc7\x6f\x3d\xfc\xe0\x9b\x2f\x9e\x7e\xf3\xe7\xba\x19\xfc\x97\xc7\xbf\xfd\xde\xe9\x37\xfe\xd6\x19\x2c\xbd\x07\xde\x7d\x83\x96\xe0\xb7\x7f\x75\xfa\xde\x37\x1e\xff\xfa\xa7\xef\xff\xf8\x5d\xe7\x23\xff\xf7\xc5\x2f\x9d\xbe\xf2\xea\xe3\xdf\xbe\xed\x36\xe5\xd1\xbb\x2f\x7d\xf0\xdd\xd7\x1e\x3d\xfc\xba\x33\x66\xef\x7f\xfd\xed\xd3\xd7\xdf\xd4\x2b\xfa\xed\x2f\x9f\x7d\xff\x8d\xb3\xaf\xbe\x71\xf6\xfa\x2b\x67\x2f\x7f\xdb\xec\x2a\xf7\xbd\xaf\xff\xf4\xf1\xc3\xff\x8e\xab\x9f\x7f\xf6\xe8\x9d\xaf\xe3\xc3\xcd\x87\xbe\xa3\xbf\x65\x8e\xe6\x77\xff\xe2\xf4\xb5\x97\x1f\xbf\xf8\x35\x7d\x4a\xfd\xf6\x25\x7d\xda\xbc\xf7\x57\x8f\x7e\xf3\x0f\xef\xff\xf9\x5b\xb0\xdb\x75\xe3\xce\xbe\xff\x67\xba\x89\x7f\xf7\x1f\xcf\xfe\xc7\x97\x70\x1d\x9c\x7e\xed\xa5\xb3\xaf\xfe\xf4\xd1\xbb\x2f\x9d\x7e\xef\x07\x7a\xea\x74\x7f\xbf\xfd\xe8\x21\x2d\x0e\x67\x18\x70\x0c\xce\x79\xc9\xe9\xcb\x6f\x37\xbe\x47\x8f\xcf\xdf\x7d\x09\x9f\x7d\xf6\xa5\x37\x75\x8b\xbd\x73\xaa\x72\x0c\x9c\xbe\xfe\xf6\xef\xde\x7b\x19\x9b\xf5\xc1\x8b\x7f\xf5\xf8\xb7\x5f\x79\xf4\xee\xdf\xbe\xff\xda\x97\x61\x79\xc0\x00\xff\xcd\x7f\xa7\x31\x86\xc3\xf4\xf4\x1b\xdf\x79\xfc\xf3\x9f\x3c\x7a\xf8\xf0\x77\xef\xbd\xa2\x0f\xbb\xb7\xff\x87\xb9\x1b\xb0\xd1\xef\xfc\x0c\x06\x09\x3b\x72\xfa\xd6\xaf\xf4\x21\xf1\x6b\x38\x69\xbf\xf1\x9f\x1f\xff\xc3\xff\xc4\x87\x3e\xfa\xcd\x3f\xe8\x8d\xf5\xd6\x2b\x8f\x7f\xfe\x9e\x79\xfd\xe9\x37\x5e\x7d\xfc\x96\x9e\xa1\x47\x0f\x7f\x74\xfa\x8d\x57\xf8\xb7\xaf\x98\xd1\xc0\xef\xbe\xff\xee\x2f\xf4\x77\x7f\xf8\xb5\xd3\x3f\x7f\x53\x6f\xca\xaf\x7d\x45\xcf\xe8\x4b\xbf\xc4\x61\x31\x03\xa2\x1b\xf7\xf2\x77\x97\x6c\x19\xff\x8a\x75\x57\xd2\xe3\xaf\xfc\x37\x3d\x76\xdf\x78\xed\xf1\x3f\xfc\x4f\x6c\x01\x74\x5a\x37\xdd\x7d\xf1\xa3\x5f\x7d\xf5\xec\x3b\x6f\xbc\xff\xee\xcb\x67\x3f\xfb\x1b\xde\xcc\xd7\x42\x79\xf6\x9d\x1f\x9c\x7e\xeb\xcb\x67\x3f\xf8\x8a\x73\x74\x55\xcf\xc2\x57\xf5\x2d\xf3\x9b\xef\x41\x13\xec\x62\xfd\xab\xff\x74\xfa\xad\x2f\x9f\xfe\xc5\x7f\x3c\x7d\xed\xd5\xf7\x7f\xfc\xb6\xde\x4b\xf0\x9c\xff\xfb\xe2\x7f\x3c\x7b\xfd\xd5\xd3\x3f\xff\xe1\xd9\x0f\xbe\x72\xfa\xdb\xef\xc0\xe0\xfc\xd8\x7c\x0c\xbf\x65\x5e\xa7\x97\xd8\xaf\xbf\x7c\xf6\xa5\x37\x1f\xbd\xf3\xf0\xec\xdd\x1f\x3e\xfe\xe5\xdf\xbf\xff\xd3\x9f\x5e\x37\x5b\x59\x7f\xfa\x6f\xdf\x3e\xfb\xcb\xaf\x3f\xfa\xd5\x2b\xa7\x7f\xfe\x43\xbd\xaa\x7e\xfb\xd2\x07\x3f\x7c\x17\xb7\x29\x6e\x71\xee\xcb\xf5\x50\xe2\x49\xf6\xc1\x77\x5f\x3b\x7d\xf9\x97\x68\x97\xe0\xd9\xf7\xfa\x9b\x38\xa5\xa7\xff\xed\xbf\x3c\x7a\xf7\xab\x8f\xde\xf9\xd9\xe9\xdb\x5f\xe6\xc1\x7c\xf4\xee\x1b\x67\x0f\x5f\xa3\xeb\xfe\xd7\x7f\x73\xfa\xde\x37\x60\xf4\xde\x3a\x7b\xe5\xc7\x7a\xdc\xe0\x27\x1f\x7c\xe5\xd5\xb3\x6f\xbf\x8d\x4f\x6f\x3c\x1c\x4d\x37\xb0\x79\xa7\xaf\xfd\x67\xbd\x60\xbf\xf9\xcb\xc7\x2f\xbe\x84\x43\xe7\x8f\xa8\xee\xd6\x2b\x6f\x9d\xbd\xfe\x53\x3d\xe3\xbf\xfa\xe5\xa3\xdf\x7e\xff\xfd\x6f\x7d\xd7\x34\x08\x96\x23\x9e\xe3\xee\xa0\xe2\x94\xc3\xd5\xfe\xea\xe3\x5f\xfc\x2d\x8e\x0b\x77\xfe\x46\x28\xdd\x1f\xeb\x83\xe0\x17\x7f\xfb\xe8\xdd\x77\x79\x2c\xf8\xe1\x68\x19\x54\x56\xfc\xeb\x6f\x62\x23\xcf\xbe\xf3\x4b\xbd\xdf\xdf\xf9\x3b\x1c\xad\xb3\xbf\xfc\xfa\xfb\x3f\xd2\x1b\xe8\x83\x77\xff\xf2\xfd\x1f\x3d\xd4\xb7\xef\x57\x5f\x7a\xf4\xdb\xef\xeb\xed\xca\x23\x7a\xf6\x67\x2f\x9d\x7e\xf9\x1f\x1e\xbd\xf3\xd5\xdf\xbd\xf7\x35\xf7\xf0\x7f\xf9\xdb\x74\x71\xbe\xf2\xe2\xd9\xeb\xaf\x3c\x7e\xf1\x25\xfd\x60\x77\x67\x7d\xef\x07\x38\x87\xe7\x6d\x45\x3d\xdd\xef\x7d\xeb\xf4\x1b\xff\x59\x2f\x78\xf8\x66\xe5\x24\x38\x7b\xf5\xaf\x4f\x7f\xf4\x3f\xce\x5e\xf9\xed\xd9\x57\x5f\xc2\xfe\x9a\xd9\x81\x17\x7c\xeb\xfd\x1f\xbf\x7a\xfa\xf5\xbf\x3e\xfd\xde\x0f\x4e\xdf\x7a\xef\xf1\x57\x7e\x71\xf6\xf2\xb7\x1f\xbf\xf8\xd2\xe9\x5f\x3f\x7c\xf4\xf0\xeb\xf8\xdb\xb3\xbf\xff\xd6\xe9\x6f\xbe\xfa\xfe\x6b\x5f\x7e\xfc\xf3\x87\xc1\xe9\xab\x7f\xff\xe8\xd7\xbf\x3d\x7d\xe9\x97\x67\xdf\xfb\xcd\xe3\xbf\xf9\xef\xa7\xef\x3e\x7c\xfc\xf3\x9f\xeb\x13\xf8\x67\x3f\xd2\x1f\x85\x97\x81\x55\xf0\xd6\xe3\x3f\xfb\xf5\xd9\x8b\x3f\x86\xc1\x27\x63\xf4\xdd\xbf\x38\xfb\xfe\x5f\x0b\xa1\x0d\xd4\x5f\x7f\x4b\x1f\xdf\x17\xd9\xb7\x5f\x3b\x7d\xf8\xcd\xf7\xbf\xf9\xe6\xe9\xcb\x6f\xe3\x91\x87\xe3\x00\x4f\x38\xfb\xaf\xaf\xeb\xa5\xf4\xce\xd7\xce\x5e\xff\xde\x87\x79\xd4\xd9\xb7\xdf\xc6\xa7\xc1\x68\x3c\x7c\xf4\xf0\xcb\x67\xdf\xfe\xd5\xa3\xdf\xfc\xd6\xae\xc9\xbf\x7e\xe3\x83\xbf\x7c\x49\x7f\x11\xbb\xf8\xa5\x37\x4f\x7f\xfe\xb5\xb3\x97\x5f\x43\xf3\xfa\xd1\x3b\xaf\x9c\xfd\xec\x0d\xb6\xaa\xd7\xb5\x77\xf0\xf8\xad\xff\x79\xf6\xa5\x37\x1f\xff\xf0\x8d\xd3\x97\x5e\xc2\x0f\xf1\x3a\x83\xb5\xfa\x93\x87\xef\x7f\xf7\xd7\xfa\x71\x70\x28\xe2\xbb\x4f\x5f\x7b\x55\x5f\x97\xf0\x77\x6d\x37\xff\xdd\xb7\xcf\x7e\xfa\x43\x7d\x2a\xfd\xf0\xcd\xd3\x5f\xfd\xe2\xd1\xbb\xbf\xd6\x1b\xf3\x1b\x7f\xae\xb7\xfe\xaf\x5f\x7f\xf4\xce\x43\x5c\x2f\x8f\x1e\xea\x75\x76\xfa\xda\xab\xa7\x3f\xfb\xce\xef\xde\xfb\x1e\x5a\x1c\xb6\x05\xa7\xaf\xbf\x49\x4f\xff\xda\x4b\x68\xa0\xbe\xff\xf0\xc7\xef\x7f\xef\xe7\xa7\xbf\xfe\x96\x6e\xd3\xcb\xdf\x3b\x7d\xf7\xe1\xa3\x77\xdf\x58\x21\x0c\xd4\xca\xa3\x77\x1e\xea\x63\x47\x0f\xc9\x57\x70\x3c\xf4\x78\x7e\xeb\x17\x8f\xde\xf9\x6f\x66\x24\xb5\x69\xff\xfa\x4f\xcf\xbe\xf9\x9b\xd3\x97\xde\x78\xfc\xd6\x1b\xf8\xc9\x47\xef\xfc\x8c\x5f\x7f\x8d\x5e\xaf\xef\x33\xa7\xeb\xee\xd7\xd0\xf8\x39\x7b\xf8\x1a\x7e\x19\x5c\xa0\x5f\x7c\xf0\x67\x6f\x9e\xfd\xfd\x9b\x1f\x7c\xe5\xcf\x1f\xbd\xf3\x33\x58\x29\x7e\x08\xf6\xdf\x69\x47\xeb\xdf\xcb\x7f\xc7\x04\x04\x36\x48\x77\x98\x25\x13\x95\xff\x7b\x21\xfe\x9d\x09\x04\xf6\xa2\x99\xfa\xf7\xd2\x72\x30\xb8\xf0\x1a\x70\xc4\xe4\xee\x70\x47\x1e\xaf\x13\x7f\xda\x38\x4a\x1b\x32\x6f\xd1\x78\x0c\x74\x4e\x86\xc2\x90\x70\xd5\x20\x76\xc9\x81\x43\x0e\xc0\xc0\x53\x85\xf7\xd4\x46\xb4\x90\xfb\x76\x09\x25\xa2\x97\x73\x1a\x01\xf9\xde\x18\x1e\x74\x6b\xf6\x57\x2a\x25\xfb\x95\xf8\x9e\x09\x16\x0a\xbf\x68\xbf\xb9\x64\xbf\x29\x66\xe8\x54\xd3\x43\xb0\x2f\x10\x95\x98\xa1\x7e\x14\x95\xe4\x37\x46\x0c\x43\x21\x18\x7a\xe4\x0d\xc5\x94\x49\x65\x91\x5d\xab\x08\xf9\xd7\x14\x71\x3d\x76\xc2\xbc\x14\xa3\xff\xdd\x7b\x5f\x33\x90\xaf\x27\xf9\xb4\x5c\x97\xab\xee\xbb\x5b\x42\xb4\xe7\x07\xf3\xa2\x94\x7a\x89\x5d\xd2\x89\x07\x84\x1d\xeb\xa5\x61\xc8\x1c\xe2\xe0\x9e\x8c\x9d\x47\x95\xe7\xc0\x63\x4d\xdb\x20\x2c\x28\x7c\x64\xb1\x37\x2c\xab\x3e\x3d\x0e\xc0\xd2\x6c\xfc\xba\x69\x41\x3e\xc3\xbe\xfd\x96\x91\x25\x75\x10\x67\xae\x32\x30\xb0\x90\x13\xdc\xd7\x27\xfe\x74\xc9\xc5\x41\x7c\x16\x08\xb9\xa0\xf1\x59\xa1\x2c\x85\x21\xf7\xb1\xb6\xcb\x3c\x70\xac\x47\x39\x6e\xde\xdf\xf5\x94\x66\x77\x40\xca\xb5\xc3\x62\xad\x99\xad\x85\x43\x7c\x39\xed\x75\x40\x24\x03\xfe\x74\x19\x29\x94\xf7\x20\xfb\x36\x42\x8e\x13\x6d\xbf\x53\x1c\xce\x5d\x88\x92\x04\x5e\xd5\x9e\x4e\xe3\x24\x8e\x4a\x20\xe9\xb6\xff\xa0\x47\xb1\xd6\xac\xd5\xe1\xce\xb3\x04\xd1\xe9\xb9\x6a\x50\x94\x85\x1a\x0c\xa8\xb7\xf6\x25\x65\x89\xce\x8e\xc0\xbd\x15\x3c\x71\x20\x9f\x62\x15\x59\x7a\x6d\x5d\x35\x56\x78\x22\x11\x06\x41\xdf\xa0\xea\xca\x6b\xee\x38\x03\x6c\x3b\xea\xd0\xca\x71\x74\x14\x97\x30\xf4\x82\xe4\xb3\xd4\x78\x9e\x63\xdf\xe0\x70\x35\x3d\xc9\x58\x0e\x37\x59\xb8\x3f\x36\x8a\xaf\xde\x48\xda\x01\xf7\xa6\x0c\x21\xc3\x66\x95\x80\x14\x8a\x43\x8d\x56\x97\x7c\x68\x80\x57\x87\xa8\xcd\x88\x7c\xb0\x7c\xf4\x33\xe3\xa2\xaf\xd7\x78\xde\x49\xed\x0e\xf3\x05\x7a\x8d\x65\x06\xa8\xd1\x48\x8f\xe7\x91\x2a\xe7\x51\x12\xa0\x7a\xe3\x85\xe2\x8d\x81\x8c\xf3\x5c\x1d\x67\x50\x4d\x21\xec\x4d\x95\x18\x26\x46\x57\x6a\xd1\x9e\x1b\xb8\x68\x3c\x00\x47\xe1\x2d\x55\x2a\x14\xf0\xb5\x32\x73\x99\x66\xa5\xd1\xde\x35\xa3\xb4\xeb\x2a\x87\xff\x81\x0f\x11\x57\xa4\x4c\x01\xce\x7f\xcc\x44\xf2\xce\x62\xa0\xd2\xd2\x56\x55\x17\xaf\x41\x29\x56\xc0\x80\x56\x55\x61\x51\x0b\x31\x9e\x1d\x65\xb9\xaf\x94\x2c\xcb\x3c\x4a\x0b\xfd\xe1\xea\x68\x13\x37\x33\x16\xf0\xd4\xe4\xf8\x60\x47\x40\x52\x14\x41\x3c\x58\x31\x6f\xb5\xe2\x0b\x2b\x12\x6f\xf7\x8d\x68\x52\xc2\x04\x41\x79\x80\xd0\x11\x13\x01\x9e\xbe\xcc\x5e\xc8\xc5\x40\xb1\x53\xd3\x0c\x2c\x53\xb5\xf6\x12\x33\x2e\x62\x5c\x1a\x34\x52\xfd\xce\x59\x71\x14\xa2\xcf\xf2\xe8\x24\xfd\xcf\x46\x85\x23\x2b\x34\x71\xeb\x7f\x4c\xd9\xb0\xd3\x73\x51\x64\x89\x02\x4d\x28\x5f\x48\x13\x58\xe0\x78\xec\x8b\xa7\x6a\xeb\x98\xf9\x68\x4d\xc3\x0b\x28\xbe\x5a\x60\x45\x2f\x7c\xdb\x39\x92\x97\x94\x7d\xaf\xba\x7a\x3f\x50\x9d\x06\xc4\x52\x07\x2a\x2d\x03\xe1\x4f\x23\xb2\xb2\x16\x45\x7c\x90\x2a\xf5\xbb\xf7\x5e\x09\x40\x71\x1e\x6b\x08\xcc\x27\x4d\x7d\xd0\xaa\xcb\xe6\x3d\xce\xb3\xa2\xb0\x98\x22\xa8\xb2\x56\xb9\xd1\x82\x89\x9c\x2f\x3a\x32\x83\xf4\x50\xaa\xe4\x32\x74\x26\xc7\x70\xf0\x1a\x0a\x08\x3d\x9e\xbe\x10\x3b\x5d\x5f\xfa\xe0\x74\x09\x46\x7c\x63\xa2\xca\x79\x4c\x7a\x43\x71\xe9\xd0\x10\x60\x03\x0a\x87\x83\xa0\xb2\xb0\x1d\x54\xda\xc2\xf0\x34\x78\x3c\xbc\x56\xd4\xc0\x35\x62\x5c\x96\x06\x9f\x74\x00\x96\xbb\x33\x8c\x59\x2e\xa8\xcf\x50\xd6\x32\x8d\xe9\x96\x81\xaa\x75\x23\x89\xd8\xcb\x1c\x10\xb2\x39\xc3\x7a\x99\x45\x46\x37\x48\x63\xd6\x10\xd4\x88\x46\x0d\x1c\x38\xb5\x3e\x08\xf2\xe3\x78\xac\x04\xfd\x13\x81\xba\x80\xa0\x45\xc8\xaf\xaf\x55\xe9\x4a\x96\xb8\x52\x46\xc4\x44\xcc\x84\x25\x1e\x73\x71\x9c\xea\xeb\x14\x3a\x7b\xdd\x70\x12\x7b\xbc\xf9\x03\x0b\xb5\x68\xe4\xca\xf7\x51\x0d\x38\x51\x33\x35\x89\xe7\xb3\x9a\x68\xb7\xbb\x87\x02\x41\xb2\xf0\xd0\x04\xe4\xc4\xd5\xab\xc7\x67\xda\x2f\xaa\xdc\xe6\x7a\xa2\xe9\x27\x0e\x93\xbb\x20\x1b\xa5\x51\x13\x11\xad\x46\xf0\x6d\xcc\xf5\x16\x58\x82\x0b\x33\x47\x64\x01\xc3\xbe\x00\xf5\x1f\xd2\x01\x73\x18\xcb\x0d\x00\x02\xc3\x32\x5b\xe6\xd3\xfa\xa5\xcf\x91\x68\x01\x22\x98\x2d\x02\x05\xf4\x2f\xa9\xa6\x07\xa1\x1b\x43\x17\x1b\xe3\x1d\x5e\xb8\x07\x88\x51\x09\xbb\xcd\x83\x47\x9a\x08\x64\xf5\x44\xe9\x42\x3c\x1f\xa7\x93\x73\x0b\x27\xba\xa9\x4c\x33\x22\x41\xc0\x95\x5f\x21\x1a\xc7\xe3\x80\xc6\x44\xa0\x73\x8a\x02\x27\xcc\x3b\xa8\xc7\x9b\x61\x9d\x54\xba\x15\x98\xb3\x25\x90\xfb\x73\x04\x16\x3a\x77\x8b\x6e\x19\x1e\x70\x81\x7b\xda\x51\xb1\x0e\x9e\x11\x06\x90\x09\x40\x93\x4a\x49\x18\x02\x2c\xe1\x04\x9d\x17\x4a\xc0\x33\x1c\x8e\x6c\xde\x34\xee\x59\x52\xbb\x04\x60\x1c\x41\x9b\xd6\x42\x3a\x45\x5c\x3e\x65\x64\x60\xf5\xbd\xc3\xc4\x90\x78\x91\x24\x60\x8d\x97\x87\x2a\xcb\x17\x16\xf7\x19\x4d\x8e\xad\x43\xa1\x88\x81\x1a\xa7\x92\x75\x7c\xa9\xf9\xa1\x10\x9d\xd4\x7c\x70\x64\x4c\x96\x4d\x63\xb2\x08\x71\x2f\x3b\xb1\xbc\xac\x8e\x5f\xf9\xe1\x5c\x41\x9c\x1e\x5b\x65\x2d\xc4\xa8\xe1\xd9\xe8\x9c\xf1\x67\xb5\x75\x1b\xa0\xb0\x60\x54\x2c\x64\x3c\xd1\x73\x60\xee\xb5\xfd\x85\xb3\xa9\x02\xb1\x20\x21\x81\x62\x7e\x70\xa0\x8a\x92\x6b\xd7\xa8\x2c\xd9\xf1\xed\x0e\x73\xa5\x24\xc8\x65\x3d\x23\x44\x1c\xca\x6d\x7d\xdc\xd0\xae\xd9\x4f\xa2\xf4\x79\xd8\x43\xf6\x0b\x66\x6f\xb9\xe0\xad\x38\x05\x1a\x16\xbf\x4b\xfa\x9c\x43\xae\x9e\x85\x8a\x72\x1e\x5d\x24\x86\x41\xae\x4f\xb3\xc9\xbc\x2f\x22\x16\xcb\xea\xe9\x70\x47\x11\xf2\xea\x59\xfd\xa8\xd1\x70\x5b\x88\x38\x0e\xe5\x26\x53\xd3\x43\xbd\x15\x52\x5c\x9a\x90\x13\xad\x14\xcb\xdb\x7a\x08\xe2\x5d\x09\x55\x84\xbd\x50\xd6\x88\xe0\x4d\xf5\x19\x8a\xe7\x93\xae\x50\xad\xb5\xf2\x28\x1a\x3f\x1f\x1d\x28\x68\x44\x1c\xca\x36\x30\x61\xc3\x57\x1d\x39\x42\xb4\xdb\x5c\xf1\xb1\x28\x4d\xb3\x12\xdc\xe1\x62\x91\x96\xd1\x0b\xcc\x3a\xb4\xaf\xef\xdd\x34\x4e\x0f\xf4\x22\x05\xbb\x98\x4e\x58\x92\xc5\xfa\x34\x5c\xf5\x2f\x39\x5c\xf5\x29\xce\xea\x9f\xe6\x9f\xf0\x4a\x7f\x1b\xa0\x5f\x6b\x69\xb6\x36\xd8\xee\x7d\x1c\x08\xb0\x0b\xf0\xdf\xb7\xae\xaf\xd7\xea\x7f\x6e\x5e\xbd\xfe\x29\xfe\xeb\x93\xf8\x33\xec\xee\xc8\xfe\x6e\xa7\x27\xb7\xfb\xbd\x11\x93\x9a\x0a\x61\xec\x83\xf0\xaa\x5c\x93\x1b\x1b\xb2\x97\x1d\xab\xd9\xbe\xca\xe5\xc6\xd5\xab\x37\x84\xd8\x1d\x74\xda\xf7\xef\xec\x74\xd0\xf6\x3c\xc8\xa2\xc4\x1c\xad\xfd\x23\x95\xca\xed\xcc\x86\x5e\xe4\x6a\x7f\x7b\x07\x19\xda\x40\xe5\x23\x9e\x81\x66\xa5\x0d\x94\x70\xa9\x22\x89\x6c\xcb\x71\x96\x1d\xa9\x1c\x49\x90\xa7\x19\x8a\x57\x7c\x41\x8d\xc1\x6d\xcb\x58\xbd\x8b\xa0\xcc\xda\xe7\x26\x31\x43\xa9\xa6\xd3\x8c\x48\x27\xa2\xb1\xb6\xc0\xe3\xb1\xc0\xf0\x2c\x68\x1e\x94\xf1\x18\x42\x79\xf3\x14\xdc\x4d\x8b\xac\x26\xd3\x3f\x4a\x65\xa6\xdb\x3e\xcd\xa3\x99\x82\x88\x9d\xa1\xe8\xd0\xef\x29\x04\x89\xb5\x17\x87\x11\x73\x18\xc7\x33\xfd\x65\x44\xb3\x1e\x45\x79\xc9\x31\x49\xab\x2e\x53\x10\xbb\x4e\x7f\x7b\x47\xfb\xae\xd9\x49\xe1\x52\x9d\x4d\xf0\xc9\x4c\x9c\x82\x74\x74\xe5\x7c\x12\xeb\xbf\x18\xf2\x6d\x74\x36\x9c\x5a\x68\x81\x55\x4d\xda\x27\x4b\x32\xed\x8e\x17\x5c\x4b\x84\xfc\x86\x45\x96\x30\x4a\x96\x58\xd3\xb1\x92\x08\x5e\xe6\xa9\x72\x69\xbb\xda\xca\x07\xe8\x4e\x17\x01\x93\x7f\xef\xcf\xd3\x49\x02\xc1\x8e\xd9\xbe\x42\x3e\x67\xaf\x15\x28\x70\xaa\x5f\xc5\xb2\x30\xc2\xda\x1e\x9e\x83\x65\xa6\xca\x78\x98\xd5\x97\x62\xfc\x18\x18\xb9\x27\xa8\x9e\x8f\x03\x03\xfe\x93\xf9\x6c\x11\x68\x9b\x1b\x75\xf5\xc6\x60\xa7\x20\x91\x8c\xa7\x73\x0f\xf2\x34\xc8\x60\xb8\x38\xd2\xb6\x87\xb0\x3c\x6e\x5b\x9d\x6d\xa0\x0b\xeb\xf7\x86\x42\xac\xc0\x22\x35\x15\x02\xc8\x6c\x5a\x70\x2d\x02\x07\xc5\xd9\x3a\x64\x3b\x13\xf3\x0b\x6b\xd8\x1f\x28\x35\xa0\x1f\x4c\xa2\x32\xf2\x7e\x40\xe6\x11\xa8\xc5\xe0\x4f\xf6\xe7\x71\x32\x91\xc8\x42\x6e\xbe\xe6\xe9\x23\x8b\x15\x2e\xcb\xc6\x2d\xa4\x2d\x23\xb7\x65\x40\xb1\xe2\x36\xdb\x28\x3b\x16\x0a\x0b\xf3\xe6\xc8\x2c\x94\x4e\x84\x1d\x08\x1c\x76\xfd\x21\x4b\x09\x69\x84\x74\xad\x65\x66\xcc\xc2\x50\x88\x95\x61\x19\xa5\x93\x28\x9f\x70\x11\x6d\xb5\x15\xe3\x0c\x54\x8f\xc9\x4e\xf6\xdb\xa4\xcd\xf9\x2c\x05\x37\x37\x2a\x84\xbb\x64\x08\xba\x6d\x6d\xc5\x7b\x60\x0d\xea\x17\x1a\x96\xf8\x86\x17\x82\xa7\x68\x97\x0c\x8c\xbd\xad\x83\x23\x46\xc6\x68\x42\xd6\x5f\x20\x80\xa5\x1c\x9c\x49\xae\x3f\x88\xcb\x39\xc4\xff\xff\xcf\x8b\xdf\xe4\xcd\x4a\x31\x47\x34\xb6\xd7\xd6\x5c\x5d\x23\xa7\x03\xd9\x54\x10\x16\xdd\x1b\x0e\x20\x13\x86\x05\x0b\xde\x25\x08\xc6\x16\x14\x79\x84\x22\x07\x2a\x7f\xf3\x06\x06\x38\x73\x81\x37\x5d\xa5\xc7\x71\x9e\xa5\x3c\xd8\x6d\x28\x37\xac\xf7\x18\x22\x73\x79\x20\x95\x7e\x8d\xd2\x7f\x63\xf1\x5c\xfd\xf7\x52\x8d\x0f\xd3\x78\x1c\x25\x50\x5c\x0c\x7c\xbe\x94\xcd\xa0\x42\x9a\x93\xc3\xcc\x0d\x5b\x36\x2e\xa0\x50\x88\xdd\xce\xe0\x7e\x77\x08\x8c\x62\xff\x4a\x6e\xf6\x7b\x5b\xbc\x43\x3e\xfa\x22\x9e\xca\xcb\x03\xc9\xf5\x33\xfa\xd4\x5b\x98\x32\x1a\x2c\x9f\x81\x73\xc7\xa6\x06\xdc\xc3\x27\x80\x83\xbd\x50\x49\xe2\x1f\x93\xf3\xd4\xfc\xd3\xaf\xa7\xa9\xbc\xb6\xc2\x64\xb4\xa4\x24\x66\xbd\x25\x7b\x14\x0a\x69\xd8\x78\x14\xc1\x20\x3e\x19\x27\x60\x69\x57\x4f\x00\x3c\x46\xb4\x74\x84\xe1\x1b\xb0\x8b\xbc\x08\x24\xdf\x2a\x74\x66\xc7\x65\xa1\x92\x69\x28\xc4\x46\xcb\x2e\xba\xa6\x6f\x36\xf6\x8c\x9f\x66\xce\x6e\xff\xde\xa8\x9d\xd8\x8e\x6f\xeb\x1f\xd9\xe0\xe0\x81\x17\xe4\x79\xa6\x95\x02\x21\x51\x2d\x10\x32\x9a\x0f\xa3\x43\x65\x65\x24\x4c\x6d\x10\x0d\xa6\x3e\x89\x74\xd7\xd6\x20\x60\x0f\x82\xe5\x02\x4e\xce\x40\x1e\xce\x67\x51\xba\x96\xab\x68\x02\xd1\xa2\x43\x15\x4d\xf4\x8e\xb0\xa2\x21\xbe\x4e\xf6\xf8\x30\x4e\x95\xfd\xf8\x4c\x95\x91\x3e\x87\xc5\x34\x56\xc9\xa4\x60\xde\x60\x74\xa3\x73\xb9\x8f\xda\x54\x58\x20\xe6\x5d\x9e\x59\xa1\xfd\x58\xf8\x0e\xb5\x59\x45\x45\x9c\x2c\xe4\x71\xac\x4e\x58\xb9\x06\x6e\x68\x7d\x56\x5d\x6b\xc9\x5e\x56\x9b\x91\xe5\x13\xc2\xe1\xa5\xfa\xd9\xbe\x5a\xb4\x02\xd1\x70\x1e\x19\xce\x68\x2e\xdf\x6d\xe2\x0f\x88\x3d\xa6\x54\xbd\x8e\x6b\xe7\x2a\x52\x6f\x38\x95\x6d\xae\x86\x16\xd6\xdf\x90\x00\x85\x9e\x92\x2c\xb7\x54\x19\xb5\x0d\x83\xcc\xb0\xe6\x2a\x9f\xa9\x74\x4e\x97\x4f\x3a\xa1\x7b\x06\x7e\xe1\xca\xa0\xe1\x90\x06\x0e\xa9\x3b\x04\xca\x80\x14\x89\x94\x13\x63\x96\x7e\xc6\x0b\x35\xcf\x66\xd6\x70\xba\xde\x32\x54\x14\xab\x45\xcb\x66\x71\xfc\x4e\x72\xb0\x0e\x0f\x51\xe7\x83\xfe\xd9\x6b\x59\xac\xf6\x6d\x33\x88\xa3\x22\x70\x79\x2b\x98\xc9\x03\x79\x94\xaa\xb3\xcc\x01\x71\x38\xcb\x2d\x27\x07\xd7\x84\x9b\x70\xe1\x79\x0d\x66\xba\x2b\xd3\x62\x41\x01\x6d\xe2\x90\x38\x67\xd2\x43\x21\x6e\xe0\xa8\x54\x26\xc8\x9c\x7b\x59\xee\x9c\x82\x41\xd3\x65\x17\x70\x81\xb7\x77\x35\x83\xd8\x91\xb7\x8b\xa9\xd0\xdb\x52\x65\xd4\xf9\x7a\x8c\x8d\xe1\x18\x59\x8e\x70\x01\xd5\x81\x71\xa6\x02\xd4\x01\x54\x21\xd3\x39\x84\x8d\x27\x12\x44\x5e\x90\x78\x89\x07\x8b\x4f\x18\x13\xb1\x31\xa4\xdd\x4a\x5f\x95\x8e\x66\x03\x54\x0c\x82\xdb\xf2\x11\x94\x0d\x8a\x4b\xc7\x54\xf4\x57\xcf\x2f\x1b\x14\x54\x36\xb8\x34\xaa\xd2\x54\x36\x88\x85\x7b\x54\x17\x18\xc8\xdd\xf6\x08\xe2\x35\xa3\x41\x7b\xab\x73\xbf\x3d\xf8\x9c\x65\xc1\x95\xf0\x91\x65\x65\x86\xd5\xda\x42\x5b\x5a\x28\x2e\x5f\x5a\xe8\x8c\x80\xfe\xc2\xdd\x4e\xaf\x33\x68\xef\x58\x2e\x5b\x61\xe9\x6d\x1d\x56\x5b\xb9\x9c\xbb\xf4\xc2\x52\x45\x71\xc9\x52\x45\xb7\x08\xb1\xdb\xe3\x28\xd6\x08\x35\x38\x78\x41\x08\xb7\x6a\x11\xf8\x5e\x9b\xeb\x15\xbd\xc5\xf3\x2f\x33\x84\x15\x5e\xb9\x13\x17\x08\x4c\x50\x70\x66\xaf\x6d\x84\x1b\x1f\x71\x10\xe8\x22\xfe\x97\x8d\x5a\xfd\xff\x8d\xf5\x5b\x9f\xd6\xff\x7d\x22\x7f\x60\xf6\x65\x87\x67\x1f\x78\x1a\x23\x93\x56\x33\xab\x22\x30\x04\x72\x46\x67\x37\x41\x3e\x25\x08\x94\x18\x38\x18\x18\x8a\x7c\xdf\x38\xee\x33\xbe\xe6\x28\xca\x0b\x95\xcb\xe2\x79\xed\x9e\x55\xf1\x81\xa4\x94\xe7\xa2\xdb\x58\xa0\x71\xe1\x8a\x59\x17\x99\x63\xb7\xf1\x17\xe2\x22\x7d\xaa\x24\xdb\x19\xc1\x55\xfa\x45\x07\x2a\x55\x79\x54\x02\xe1\x16\x3b\x64\xe6\xe5\x20\x92\x52\x53\x44\x2c\x91\xf4\x16\xa5\x89\x2b\xed\x25\xa6\x14\x64\x0e\x4c\x16\x40\x19\x08\xc3\x82\x32\x6b\x80\xdd\xa9\x24\xb1\xab\x3d\xc6\x16\xda\xd1\x5c\x65\x6d\xc0\xec\x08\xa1\x12\x28\xeb\x45\xa9\x8d\xfa\x2c\x38\xc8\x18\x48\x3a\xfa\x5d\x32\x92\x40\x20\xa9\xac\x7b\x8c\xe3\x9e\xcd\xcb\xa3\x39\x45\x2b\x28\xd6\xd4\x90\x69\xb9\xdb\xdb\x93\x77\x61\xc4\x92\x2a\xb5\xa0\xa5\xb3\x6a\x6a\x16\x97\x7b\xd7\x7e\x01\xb8\x19\x90\x02\x63\xc7\x7f\x5b\xfb\x8c\xc6\x36\xde\xce\xe6\xe9\x24\xe2\xe4\x2a\x4f\x01\xc9\xb0\x40\xd3\xff\x65\x1e\xca\x9f\xe0\x9f\xf0\xca\x9d\xe1\xd6\xda\xc6\xda\x66\xa2\x97\xd3\x5a\x4f\x95\x77\x86\x5b\x9f\xec\xf9\xbf\x71\xe3\xc6\xd5\xca\xf9\x7f\xfd\xe6\xcd\x1b\x9f\x9e\xff\x9f\xc4\x9f\x1a\xcf\xcb\x67\xc0\xb9\xc0\x75\xe0\x6c\x50\xa2\x7c\x69\x5b\xa9\xa5\xdc\xf2\x47\xc2\xee\x1f\x13\x6f\xbc\x47\x03\x56\xd8\x90\xa0\x17\x86\x6a\x7c\x87\x3e\x24\x84\x18\x28\x0f\x32\x0e\x51\x1d\xcc\x7a\x53\x40\x15\x28\x20\xc8\x93\x47\x38\xcf\xf9\x98\x20\x88\x47\x03\x7b\x8a\x7e\x79\x53\x64\xba\x1e\xfc\x91\x08\x16\x2f\x91\x11\xcc\x6f\x12\x5c\x49\x4e\x70\x97\x55\xc4\x20\x75\xdc\x10\x24\x61\xad\x22\x56\xc5\x2c\x4a\x82\x18\x9b\x77\xd1\xb1\x6d\x1b\x62\x21\x43\x48\x03\x56\x6d\x40\x9c\xba\x23\xc0\x0d\x20\x44\xed\x47\xde\x06\x0e\xbd\xf8\xa1\x6a\xe2\xae\x41\xcf\xdf\x32\x5e\x7a\x18\x23\xfc\x9a\xd3\xf4\xf0\xbc\xd4\xf8\x9d\x07\x60\x95\xf7\x3a\x23\x58\x17\xfd\xbd\xde\x16\xa9\x5c\x74\x7b\x9b\x21\x38\x4d\x8e\x9e\xc7\x50\xfc\xe9\x9f\xb2\x50\x23\x08\x56\xf4\x1e\x34\x24\xc8\x1d\x57\xcd\x53\x63\xac\x38\x76\x62\xd4\x27\x35\x91\xda\xd7\x1a\x3c\x3c\x78\xdf\x32\x27\x4f\x18\x27\x6f\xd0\xb1\xba\x7e\x5b\xcb\xfc\x35\xdb\x4d\x72\x9f\x4c\xff\xe4\x9d\x8e\xa8\x90\xc2\x58\xa7\xab\xc9\xfd\x32\x4a\x23\x9d\x3f\xe9\xdc\xdf\xdd\x69\x0f\x1e\xd4\x5d\x32\xc1\x5e\xdf\xea\xf2\xc1\x90\x7a\x30\x76\x07\xfd\xcd\xbd\x81\x71\x4d\x87\x7b\x77\x48\x14\x11\xe4\x45\x80\x66\x07\x55\x16\x3b\xc3\xdb\x46\x79\x64\x4f\xbb\x6d\x5b\xed\x51\x1b\x5e\xbc\x3b\xe8\x6f\x77\x47\xc3\xdb\xfa\xef\x77\xf6\x86\x5d\x18\xae\x6e\x6f\xd4\x19\x0c\xf6\x76\x75\x8f\x5b\xf2\x5e\xff\xb9\xce\xb3\x9d\x81\xd8\x6c\xef\x0d\x3b\x5b\x30\xae\x7d\x54\x89\x44\xa9\x18\x4f\xfe\xc3\x73\x23\x2d\xc9\xcd\x70\x34\xe8\x6e\x8e\x5c\x62\x9c\x7e\x4d\x59\xc6\xd5\xf8\x70\x9d\xcc\x96\x71\x32\x49\x9c\xf2\xb9\xf6\x03\xc7\xd3\x14\xa4\xec\xe8\xad\x59\xab\x79\xd2\xde\x7a\xb6\x3b\xbc\x8c\xae\xc9\x1f\xae\x19\x13\x5e\x69\x6f\xef\xac\x6d\x7c\x5c\xd4\x2f\xf0\xe7\x22\xfe\x97\x6b\xb7\x6e\xd6\xf8\xdf\xae\x7d\x7a\xff\x7f\x22\x7f\xf4\x45\xdc\xa6\x64\x39\x5a\xe7\x06\x6c\x7c\x1c\xca\x8d\xf0\x2a\x46\x90\x1b\x3f\x52\x65\x19\xf7\x62\xcb\xe9\xc2\x50\x3f\x62\xc5\x92\x76\xaa\x20\xde\x09\x19\x72\xfc\xaa\xe1\x63\x7e\x2e\xcb\x9f\x5f\x69\xc9\x13\x08\xc4\x03\x76\xce\x7b\x78\x96\xaf\x80\xb8\xb0\x38\x4a\xa2\xb1\xaa\xde\x54\x94\x84\x88\x67\x33\x35\x89\xa3\x52\x25\x0b\x0f\x47\xd8\x40\x68\xc6\x6c\xdf\xde\xfb\x9f\x11\x0c\xb1\x73\xbd\xa2\xe6\x9e\x5b\x5f\xe5\x2a\xa4\x89\x96\xd7\xe6\x30\xa5\x9e\xa9\x1d\x91\x54\x3b\x02\x9a\x02\x08\x82\x58\x6b\x28\x17\x11\x95\x72\x11\xa7\xc2\xc4\x32\xc8\xa1\x5a\x89\x2d\x05\x99\x64\x4d\xc9\x6a\x29\x65\xd4\xf2\x8a\x6e\x64\xad\xf3\xc8\xff\x7e\x14\xab\xe2\xb6\x10\xfb\x2d\x8c\x8d\xab\x23\x24\x92\xae\xe4\xea\x57\x57\xb6\xec\x8f\x80\x4f\x79\xa5\x45\xc8\x57\x50\x52\x74\x1f\x2e\xf4\xef\x6f\x0b\x31\x6e\x55\xa4\x10\xfc\xf4\x9c\xdf\x16\x6d\x8c\x54\x5f\x61\x4a\x4c\xa0\xf3\xb7\xb9\x63\x93\x16\x91\xe3\x81\x21\x54\x7f\x14\x7e\x3c\x59\xdc\x86\x94\x38\x7d\x49\x71\x63\x0c\xcf\x76\xf3\x97\x30\x0b\xb7\xa4\xa2\xe8\x13\x9b\xd8\x80\x56\x63\x43\x71\x8d\xf0\x8a\x6b\xd8\xc9\x36\xed\x02\x13\x57\x4f\xa1\x9a\xed\x67\x93\xd8\x24\x77\xaa\xc3\xed\xd2\x06\x56\x9e\x11\xd8\x0a\x23\xcc\xd3\x2a\x0a\xdd\xfb\xf5\x45\xcd\x93\x28\xaa\x93\x88\xb9\x33\x33\xa0\x43\x34\xa2\x81\xfa\x7c\xc7\xc9\x1c\xa2\xb8\xd4\x8a\xf3\xeb\x15\xaf\x72\x93\x25\x68\x61\xce\x1b\x57\x10\xe0\x13\xb1\xd8\x71\xe6\xe9\x99\x96\x19\x80\xe1\x09\xdc\x11\x1d\x47\x71\x02\x15\x58\x3e\x85\xa4\xa3\x5b\x7e\x88\xf0\x6a\x47\x4a\xdf\x7b\x53\x6d\x15\x08\x20\xbd\x2b\x3c\x60\x51\x3d\x51\xe9\x8a\x27\xb8\xa3\x50\xe9\x8c\xc0\x91\x84\x78\x17\xd8\xd3\x36\x2d\xdb\xd8\x6d\x98\x70\xd3\x20\xbb\xdb\x8a\x50\x98\x9f\x92\xdf\x56\x58\x16\x4b\x40\x55\x45\x65\x5c\x40\x07\xe3\x42\x66\xfb\x89\x23\x5a\xac\xcf\x5c\xcc\xe3\x57\xbb\x21\x96\x75\x03\x4a\x36\x64\x9c\x22\x2e\x02\xc5\x85\x8e\xb2\x22\x06\xa0\xb2\x11\xd7\x59\xc8\x71\x94\x8c\x01\x0c\x06\x74\x95\x44\x71\x19\xa7\xa8\xaf\x83\x22\xcf\x80\xde\x3d\x56\x69\x8c\xc5\x42\x63\x55\x14\xac\x72\x08\x35\x04\x36\x8b\xcb\x3d\x14\x7a\x47\xc4\xe9\x5c\x55\xd5\x57\x6a\xe3\x15\x30\x9d\x20\x11\x75\x1a\x69\xc8\xc9\x04\xeb\x1e\xa6\xa8\xc3\xb9\xa4\x23\x80\x14\xbe\xfc\xe5\xc3\xc9\x72\xdc\x95\xf6\xaa\xac\xaf\x29\xc8\x7c\x76\xf0\x88\xd0\x8b\x76\x5b\xbb\xd2\x7c\xf5\xc0\xee\x09\x3d\x60\x82\x81\x55\xd9\x5d\x9b\x66\xce\xaf\x04\x15\xa9\x8d\x2b\xca\x34\x0d\x03\xe2\xa0\x1a\x30\x17\xe9\x2a\xf1\xe7\xd5\xe2\x21\x42\x1b\x70\x36\xb5\x81\xfc\x9f\x6a\x8b\x2a\x61\x01\x58\x65\xfe\x22\x67\xdf\x9d\x6b\x4e\xce\x63\xcd\x77\x0f\x28\xe0\x1e\x3f\x44\xac\xbf\x68\x96\xad\xb2\x1a\x39\x4d\x92\x13\x6e\x6d\x94\x99\xab\x82\x4b\xe5\xb8\x78\x4a\x16\x6a\x9c\x2b\x84\xf8\x58\x60\x55\x9c\x96\x0a\x60\x50\xf3\x28\x21\xbd\x72\xa4\x4c\x37\xbb\x8d\x92\xc5\x91\xab\xe2\x54\x20\xbc\x9e\x74\xdc\x64\x2f\x6b\xa8\xae\x74\x2a\xba\x2a\xa7\xaf\x3e\xf3\xf1\xf0\xd5\xdb\x56\x1f\xc7\x78\xba\xcf\x58\x3d\xa6\x56\x8e\xe8\x0a\xfa\xba\xe0\x43\x41\xbf\x76\x24\xfc\xa8\xcc\x54\x6e\x40\xb3\xf0\x74\xf0\x5b\x53\x7a\xea\x1c\x6e\x5f\xc5\xe5\x44\x38\xaa\xe7\xa7\x9d\x3e\xaf\xc4\x4a\x38\xcc\xb2\xa5\xca\x8f\x72\x55\x9a\x94\x3d\x8a\xec\x98\x31\x76\x08\xe7\xf5\x83\xf0\xb6\x34\x00\x03\x4c\x23\x08\xbb\xee\x6c\x0d\xd7\xe2\xdc\xe3\xd3\x56\xc8\x9e\x64\xf3\x64\x82\x15\xb6\x11\x0e\x8a\x3e\xae\x12\xb7\x3e\x1b\x92\xf2\x71\x61\x0a\xdf\x40\xac\x09\x05\xbd\x12\xe0\x5b\x2f\x4b\x08\x95\xdd\x6c\xc9\x76\xe9\x14\xc2\xc1\x62\x23\x75\x1d\x1b\x46\x0a\x6c\x79\x98\x77\x37\xe8\x26\xdb\x3b\x55\x90\x61\xa4\x5b\x0d\x75\x11\x90\x9a\x41\xd1\xc1\x5a\x55\x1a\xa0\x24\x4c\x5d\x1a\x1e\x45\x05\xef\x46\x25\xce\xb9\x84\xf8\xa8\x2c\xe4\x09\x5c\xfe\x28\xe6\xcc\x4f\x00\x75\x29\x1e\x7a\x86\x1d\x1a\x0c\xc8\x31\xa2\x7b\x9c\x52\x19\xcc\xb0\xe8\xa3\xb3\x40\x3d\x1f\x67\x34\x7a\xf0\xcc\x70\xc5\x0c\x87\xb0\x49\x0e\xb7\x81\x5c\x3c\x56\xb7\x11\xfd\xa1\x80\xd2\xa2\x28\xcf\x17\x32\x12\xfa\x40\x8a\x53\x3d\x10\xf5\x37\x36\x5f\x49\x60\x2b\xc0\xc9\xef\x14\x30\xc1\x2b\xa0\x5e\x04\x0b\xae\x39\x7f\xd4\x74\x88\xdf\x6a\xd9\xfa\x3d\x6d\x3e\xe6\xd9\xb1\x4a\x41\x5e\x09\x0c\xdc\xc6\x42\x3f\xc7\x9e\xa0\xe2\x3c\x7a\xa5\xef\xc7\xc4\x29\xa3\x97\x9b\xad\x67\xa7\x18\xbb\xa2\x47\x8e\xa3\xaf\xcd\x3c\xf3\x22\x28\x78\x3b\x49\x1b\x0c\x48\xfa\xa5\xb5\x4b\x27\x9e\x8a\x3e\xac\x1c\x93\xa5\xf3\x36\x97\x89\xfe\xd5\x4f\xee\xb1\x27\x35\x64\x68\x35\x9c\xc3\x97\x04\xdc\x9d\xe6\x87\x94\xa2\x94\x4d\x07\x29\xed\x15\xf7\x0a\x3e\xca\xb3\xb1\x52\x93\x38\x3d\x10\x20\x4a\x90\x8e\xa9\xe2\xab\xe2\xf4\x38\xf1\xca\x06\xe9\x37\x5f\x72\x0a\x6a\x75\xa0\x69\x55\x44\xc9\x39\x05\x93\x0e\xda\x3a\x68\x92\x1e\x84\x79\xf5\xcb\x30\x6b\x45\x3b\xb5\xf0\x63\x96\x5f\x18\x7d\x0c\x51\x72\xb6\x37\xea\x0e\x3a\x72\xd0\x1d\x7e\x4e\xb6\x87\x4c\x7a\xfd\xf9\xbd\x36\xc7\xa8\xf4\x3f\xfb\x83\xee\xdd\x6e\xaf\xbd\x83\x6a\xc1\xdd\x21\x92\x3f\x83\x76\x2c\x1c\x69\x16\x72\xa3\xbf\x61\x50\x34\x56\x6f\x0e\x36\xb2\x2a\x0a\x2a\xbd\xc4\xf4\xef\xb4\x42\x62\xd1\xcb\x5c\x47\xb5\x36\x0d\xee\xf2\xc4\x99\xa0\xba\x63\x67\x5a\xbc\xa8\xf8\x67\x5a\xcb\xea\x61\x43\xb9\x07\xdf\x49\x33\x39\x8e\xf3\xf1\x7c\x56\x94\x11\x00\xdc\x10\x20\x4a\xbf\xf2\x4a\x33\xdd\xba\xe1\x32\xcb\x4b\xb7\xd6\x3d\x55\x07\x49\x7c\xa0\x57\x10\xaa\xd8\x82\x74\x62\xe0\x51\x28\x04\x5c\x03\x6e\x04\xd3\xb2\x4a\xc9\xab\x03\x8c\x35\x95\xaf\x54\xc2\x5a\x2b\x66\x85\x25\x03\x07\x66\x94\x04\x62\x69\x65\x2b\xdb\x74\x87\x91\x6e\x90\xca\x4d\xa9\x2b\xa4\xae\x31\x05\x5c\x9d\x06\x41\x56\xa1\xa3\x3f\x55\x8d\x02\x9c\xb7\x58\xcd\xbb\xa7\x59\x2e\x92\x0c\x2c\x64\x79\x90\x65\x93\x93\x38\x41\xe6\x8b\xe7\x65\x51\x66\x47\x47\xd1\x01\x50\xe2\x93\x44\xcb\x34\x8a\x93\x39\x16\xd5\xce\xa2\x64\x3a\x4f\x89\x30\x88\x06\x02\x2e\x8d\x24\xb1\xec\x07\xac\x0b\x6c\x7a\x9a\x4b\xfd\x32\xac\x62\x80\xf4\x85\x3b\xef\x46\xdb\x90\xd8\x84\x3c\x9d\x4a\xfb\x4b\x3d\xec\x13\x15\x61\xa2\x08\xa7\x22\x4a\x64\x9c\x7e\x61\x0e\x2e\x09\x27\xcc\xa7\xd6\xd4\xce\xf2\xa7\x0a\x61\x67\xbf\x22\x51\xeb\xcb\xc5\x1a\xab\xa4\xe0\x7a\x7f\x6e\x62\x28\x87\xd9\x4c\x49\x57\x2b\xb5\x10\x93\x0c\xe5\x34\xb5\x9f\x40\x0f\x25\x63\x1f\x3a\xeb\xf5\xcf\x2e\x86\xa5\x55\xce\x81\x28\x88\x42\xc7\x3e\xc7\x57\xa9\x33\x28\x3e\x33\x32\x0f\xb2\x79\x28\xc4\xd3\x2d\xd9\x1e\xeb\x7d\x66\xae\xa5\x91\x23\xfd\x2e\xbb\x53\x38\xec\x2f\x17\xb6\x11\x80\xa8\xa8\xdc\xc9\x81\x35\x6d\x40\xc7\x37\x72\xb4\x55\xa9\x60\xc7\x09\xb6\x79\xfb\x55\xdb\x58\x54\x90\x89\x43\x84\x67\x6b\x04\x07\x8d\x6e\x81\x7b\x2b\xbb\x25\x9f\xd5\xb3\x87\x4d\x4c\xa1\x92\x42\x41\x79\xb9\x77\xca\xaf\xc2\x3a\xc4\xd5\xc7\xfe\x86\x65\xae\x67\xd1\x52\x7b\x5b\xa2\x1e\x68\x4b\x38\xe1\x1e\xe7\x92\xd3\x26\x07\x1a\x1f\x35\xeb\x64\x49\x88\xcc\x0c\x9e\xf6\xa0\x5e\xd0\x6b\x9f\x8c\x53\x1a\xe4\xca\x05\xee\x58\xe9\xeb\x74\x9b\xa3\x1f\x0b\x7b\xa9\x2c\xd5\x0c\xc1\xa9\x20\xfe\x50\x3d\x45\x97\x0c\xd1\xf9\x63\x20\x96\x8e\x81\xaf\x4e\xcb\x7b\x00\x0d\x09\x90\xbd\x76\xb8\x7f\xa2\x13\xb8\x81\x85\xfa\xe2\x3c\x3e\x8e\x12\xf0\x77\x88\xc1\x9f\x77\xfe\x5c\x1b\x06\x5c\x99\xb5\xbf\x40\xcb\xdf\xe8\xe2\x96\x7a\x58\x17\x10\x20\x02\xed\x68\x15\x08\xd0\x37\x82\x11\xa3\x6a\xa6\x25\x63\x46\x46\x4b\xe3\xd0\xe1\x2f\x26\xf1\x38\x2a\x15\xd2\x9a\x45\x76\x47\x34\xf1\x3e\x10\xac\x49\xef\xf5\xa6\x12\xe3\x50\x88\xf5\xab\x2d\x77\x1f\xc1\xd9\x43\xc1\xc3\xf6\x18\x77\xd6\xa8\xee\xa9\x3a\x0c\x22\xf3\x32\x9b\x45\x65\x3c\xd6\xce\x83\x60\x01\x5a\xdc\xc2\x10\xee\x80\xeb\xf1\xc2\x95\x42\xbd\xde\x5f\xf8\x77\x40\x85\x9f\x04\xcc\x65\x7d\xe8\xe2\x09\x00\x84\x2c\xbe\x02\x0a\xb1\xbd\xac\x35\xb2\xbd\x04\x20\xc6\x4b\xc6\x1a\x13\xad\xc0\xce\x59\x8d\x5b\x46\x4e\xd8\x1a\xb5\x15\x39\xec\x88\xbf\x6a\xcf\x53\xbd\x78\x0b\x87\x88\x61\x35\x76\x1e\xa4\x7b\x4b\x6c\x30\x97\x7c\x54\xfd\x92\x5b\xdd\x87\x38\x03\x77\xcf\xe5\xdb\x69\xbe\x15\xf5\x9b\x98\x27\xcc\x69\xd8\x61\x94\x4f\xf4\xdf\x5b\x7a\xca\xd7\x5b\xf2\xb3\xce\x19\x1f\xc8\x67\x41\xcd\x5a\x4f\xde\x5d\xa3\x20\xba\x13\x9d\x80\x74\x33\x0d\x32\x56\x27\xc5\xa5\x2b\xbd\xed\xc7\x30\xb8\x9c\x03\x78\x7c\x4a\xe4\x5c\xa2\xf3\x70\x6c\x14\xb6\x23\xef\x76\x41\xd6\x26\x42\xf1\xbb\x51\x3f\x14\x31\xcf\x6d\x55\xa3\xf9\xa5\x5e\xbc\x10\xa4\xd1\x6b\xfa\x28\x8f\x67\x51\xbe\x30\x3a\xe2\x81\xb5\x9b\xc0\x58\xb5\xb2\x1b\x51\xe9\xbf\xf8\x5c\x51\x74\xe9\x8a\xa2\x8f\x0e\x95\x78\x12\xd9\x6c\x79\xb1\x6c\xb6\xb8\xac\x6c\xf6\x72\xe3\x27\x9b\x97\x7a\x90\x50\x07\x76\x9c\x1d\xd5\xb7\xbf\x3e\xfa\xa0\x70\x8e\x37\x3f\xef\xf0\x65\x12\xe9\x1e\x2f\x0e\x78\x35\x2a\x8d\x92\xd2\xb9\x42\xe1\x98\xb4\x59\xa3\xb6\x36\x04\xd7\x6f\xc1\x8f\x37\x43\xf9\xbf\x7e\x24\xd7\xaf\xae\x4b\x55\xca\x42\x7d\x31\x44\x6f\xe1\xb2\x07\xe8\xb2\xd3\xd3\x46\x29\x28\xc6\x52\xcc\xf3\x63\xf0\xd4\xe9\x7a\xf0\x58\xb3\x3c\x22\xba\xf5\x0d\x08\x5f\xa0\x20\xba\xdc\x56\xda\x24\xeb\x22\x3d\x0f\xad\x68\x88\x02\x02\xbb\xd3\x39\xb7\x4d\x96\x8b\x42\x29\x88\xce\xb3\x8d\x67\x77\x80\x5e\xbd\x65\x16\x70\xa8\xff\x38\x8a\x13\xa3\xee\x6e\xc7\x19\xce\x80\x04\x0e\x39\x91\x2b\x10\x51\xa5\x55\xc7\x1a\xee\x2c\xd2\x7e\x91\x07\x76\x91\xd8\x3b\x3e\x31\x4e\xc7\xf3\x9c\xca\x63\xc6\x59\x9a\xd2\x35\x02\x67\x10\xd6\xc6\x54\x8f\x4d\x08\x84\x80\x3a\x28\x5c\x17\xce\x87\xfc\x49\x90\x97\x9a\x04\xe1\x4c\xc2\xb5\x96\xbc\x1f\x17\x63\x95\x24\x51\xaa\xb2\x79\x51\xb9\x4d\x8c\x14\x5f\x61\x6a\x19\x81\x5b\xc5\xda\x34\xe3\x2c\x1d\xe3\x89\x84\x6b\x9d\xd6\x2c\xd3\xda\x00\x02\x16\x8c\x3f\x70\x5b\x78\xdf\xd6\xa6\x11\x6a\x02\x93\x09\x22\x4a\xc5\x3c\xa5\x89\xd7\x23\x49\x05\x43\xf6\xbb\x66\xe2\xe0\xea\x9e\x01\x49\x0e\x4b\xc9\x1b\x9b\x9a\x99\xde\x16\x82\xc2\x9e\x32\x36\x64\x61\xfa\xa9\xba\xf3\xd7\x5b\x0e\xb3\xa7\x6e\xd2\xca\x83\x6c\xbe\xa2\xa7\x65\xe4\xd9\x7c\xf8\x63\x62\x40\xcb\x2a\x36\x5f\x20\xc9\xe1\x13\x71\x2a\xe7\x47\x47\x58\x44\x94\x64\x27\x7a\x17\x45\xc0\x47\x08\xe9\x26\x48\x62\xb8\x44\x64\x11\xf9\x8d\x74\x05\x39\xc6\x07\x45\x2e\xe0\x9c\x0c\x68\xe1\xcc\x8e\x92\x05\x4b\x88\xb9\x68\x68\xde\x15\x41\xc5\x4e\xdd\xd6\x8d\xb0\xcf\xd7\x3b\x59\x70\xf7\x48\xde\xd7\xb9\xff\x5c\x0e\x4e\xbd\xca\x8b\x06\x02\xce\x98\xe5\xa9\x91\xc3\x52\x78\xfc\x9b\x8b\x6c\x8e\xef\x24\x6d\x4d\xbb\x51\x27\x66\x84\x03\xb9\x42\xdf\xe1\x14\x9c\xbe\xd6\xf5\xd1\x46\x4c\x9a\x75\x6e\xce\x00\xc3\x6e\x1c\xb8\xc3\x1f\xd2\x6d\x37\x8b\xd2\x88\xcc\x03\xde\x13\xd8\x1b\xeb\x82\xef\x2f\x8c\x97\x5d\x71\xb2\xd9\x16\xf0\xb8\x3f\x1b\x28\x3f\x05\x93\x93\xd0\x70\xeb\x73\xbd\x8c\x52\xb8\x99\xa0\x78\xbf\xe0\x67\xc5\x2d\xb9\xaf\x52\x35\x8d\x91\x44\xca\x7d\xae\xd3\x36\xbd\xec\x6e\xb4\x30\x56\xab\xfb\xb6\xe7\xea\xa1\x73\x37\x6b\xd9\x74\x3d\xdf\x27\xd1\x02\x15\x44\x4d\x2f\x04\xd7\xe2\x19\x66\x44\x34\x1b\x39\xf8\xe6\x5f\x36\xfb\x0b\xb4\x9b\x91\xfd\x8b\x6e\x6b\x88\x64\x16\xaa\x00\x4f\x17\x62\x94\xa5\xca\xa7\x8a\x94\xec\x24\x86\x1e\xaa\x92\xa5\xd0\x9d\xb9\x9e\x63\x4c\x9e\x85\x95\xd2\xac\xb8\xa8\x48\x87\x6f\x5c\xbd\x7a\x4d\xdb\x2b\x50\x1c\x28\x3b\xa1\x1c\x64\x85\x4a\x97\x21\x40\xcf\xab\x14\x46\x82\xa7\xa3\x45\x1d\xee\xef\xbc\xbf\x09\xba\x19\xfa\x4d\x74\x0a\xd1\x4c\xd8\xd5\xd5\x59\x66\x07\xb1\x31\x67\x24\x3c\x1e\x5d\x9c\xea\x3f\x5c\x54\xd6\x27\xf7\x27\xbc\xd2\xdf\xd9\x6a\xef\x7e\xac\x08\xb0\x0b\xf0\xdf\xd7\x6e\xde\xba\x51\xc5\x7f\xdd\xba\xf5\x29\xff\xcb\x27\xf2\x67\x44\x8c\x2d\x7a\x11\x54\xaa\x3e\x2c\x0b\xcc\x46\x78\x35\x90\xb7\xe4\x67\xe7\xa9\x92\xeb\x4f\x3f\xfd\xb4\x73\x54\xe8\x7f\x06\xd2\x7b\x8a\x0b\x1a\x1f\xa8\xc9\x49\x96\x4d\xc4\xa6\x3e\xe2\x5d\x95\x50\xb9\x37\x6c\xe3\x61\x82\x29\x30\x53\x1b\x1d\x2e\x45\x80\x3f\x99\x0a\xe8\xaa\xab\xfd\x29\xce\x45\x88\xcb\x0f\x83\x10\x17\x1f\x16\x21\xde\xc0\xb7\x81\x86\x26\x65\xd4\x42\x51\x7d\x18\x7c\x3b\x4a\x8a\x8c\x4b\xac\xaa\xac\x94\xdc\xf3\x7f\x7e\x60\xf1\x6b\xa1\xa9\x00\x97\x2b\xbc\xc2\x56\x3c\xf1\xe9\x27\x00\x1f\x38\x49\xe0\x9a\xfa\xeb\x45\x78\x83\x86\xe5\x1d\x8a\xed\xc6\xaf\x04\xf2\x08\x18\x69\x70\xba\xc6\xa5\x9c\x9a\xaf\xfc\x9b\xec\x48\xa5\xc9\x24\x3a\x02\xca\x38\x21\xae\x87\x72\x77\x39\x42\xc2\x23\x11\xa0\xee\x8e\x23\xb0\xef\x9c\xc1\x48\xc1\xae\x5a\x08\xe7\x47\xe0\x76\xf0\x54\xc4\x4c\x00\xf3\xa4\x5d\x15\x4e\x57\x6d\xff\x63\x4c\x2f\x1c\xc4\x05\xaa\x86\xdb\xa4\xf2\x79\x23\x25\x6e\x84\x72\x6b\xae\xe4\x38\x57\x93\xb8\x94\xc5\x21\xa4\xd4\xf7\x95\x3c\x88\x8f\x55\x6a\x12\x99\xe6\x24\x42\xc6\x27\xb9\x4a\x74\x7b\x27\x27\x27\xa1\x3b\x74\x57\x5a\x97\xa9\x24\xe8\xef\x76\x7a\xd8\x12\x0b\xb2\xaf\x56\x11\xc8\x3f\xfd\xd3\xf6\x50\x34\x55\x11\x74\xb6\x9e\xbc\x8e\x40\x8e\xfa\x81\xf8\x68\xea\x08\xb8\x58\x5c\x5c\xae\x8e\xa0\xa9\xaf\xba\xf9\xa3\xa1\x5f\x34\x51\x57\x9a\xfd\xb4\xa8\xe0\x5f\x70\x51\x41\x78\x65\x2f\x8d\xf5\x1d\xb5\xb6\xb5\x3d\x5c\xdb\xb8\xba\x7e\xf3\xa3\x37\x03\x2f\xb0\xff\x6e\xdc\xb8\x5a\xb5\xff\xae\x6f\x6c\x7c\x5a\xff\xfd\x89\xfc\xd9\xeb\x75\x37\xfb\x5b\x1d\x2a\xb1\x22\xfe\x3f\xd9\xbe\x3b\xe8\xe0\x2e\x5d\x83\x9d\x27\xb7\xbb\x3b\x9d\x21\xec\x24\x5e\xb0\x42\xd0\xc2\x91\x5b\x51\x19\xc9\x6d\xa8\x2d\xa6\x30\x05\xf8\xbe\x96\x0f\xcd\xc9\x3e\x31\x5d\x6d\xac\x0a\xe9\x1c\xed\x73\x7c\x14\x9c\xec\x68\x84\x5e\x09\xc4\x92\xdf\xe7\xea\x28\xcb\xcb\xe2\x4a\xb0\xec\x01\xe3\x64\x92\x5f\xd1\x6f\xb7\x1f\x41\x5b\x2c\x8c\xc7\xf3\x35\xe2\x12\x34\x8f\x2a\xae\xc4\xe3\xf9\xf2\xb7\xc5\xc7\x13\x7e\x96\xb6\x7a\x96\x7c\x6a\x5e\x42\x92\xf9\x4a\x99\x47\xe3\x2b\xfb\x79\x76\x52\xa8\xfc\x4a\xd8\x38\x44\x94\xfa\xe5\x91\xda\xdd\xda\x96\x59\x9a\xc4\x29\x59\x8a\xe3\xc3\x28\x2f\x9b\x46\x6c\xb1\xac\x85\x34\x5e\xa1\xa3\x72\xe3\x45\x8b\x5c\x3b\x94\x70\xae\x16\x33\xc3\x0d\x74\x99\xa6\x6c\xa8\xff\x09\x66\x6b\xd9\xef\xcd\x6c\x2d\x6b\xfe\x87\x9b\xad\x0f\x31\x17\xbd\xfe\xa8\xbb\xd9\x21\xaa\x90\xc1\x33\x72\x33\xca\xd5\x74\x9e\x24\x00\x48\xae\xda\xb3\x18\x85\x33\x11\xd3\x50\x5b\x14\x5b\xfd\xe7\x7a\x3b\xfd\x36\xdc\x6e\xa2\xdb\x1b\x8e\xda\x3b\x3b\x70\xd3\x6d\xf6\x77\x1f\xe8\xd3\xde\xbd\x03\xe4\x1e\x5c\x00\xb4\xbd\x60\x77\x3d\x35\x74\xf7\xd2\xea\x8a\xfd\x87\xf6\x50\xda\xbd\xad\x2b\xfd\x81\x35\x67\x56\x57\xf8\xaf\x2b\xad\x40\x3e\xe8\xef\xc9\xbd\x5e\xe7\xf3\x7b\xdd\x67\xfb\x9b\xed\x9d\x9d\x07\xb2\xbd\xb9\xd9\xd9\x1d\x05\x68\xb4\xe8\xed\xaa\x7b\x76\xa7\x23\xef\xe8\xeb\x5f\xdc\x79\x10\x48\x6d\x19\xd0\x25\x32\xea\x0c\xee\x0f\xd9\xf4\x21\x7a\x37\x73\x05\x99\xcd\x1e\xea\xeb\x47\xbf\x69\xab\x0f\x37\x37\xfc\x22\x10\xf4\x2f\xee\xbe\x3e\x2a\xa0\xef\xd8\xf1\x40\xdb\x26\x68\x5e\xc0\x2d\xc8\x3c\x2c\x4e\x57\x9d\x6e\x85\x42\x58\x82\x1a\xdd\x1e\x87\x7b\x8e\x26\xc8\xfa\x96\xff\xeb\x27\xda\xbd\x5c\x87\x5b\x89\x57\x6a\xad\x0e\x59\x98\x28\x94\x95\x18\xf0\x0a\x78\x46\x9c\x82\xd8\xc3\x2a\xe2\x65\xeb\x90\x5f\x1b\x1e\x96\xb3\xe4\x82\x90\xd6\x87\x25\xbf\xe3\xed\xe6\x9c\x8d\x26\x73\xbf\xd4\x91\x85\x3a\x28\x7b\x82\xac\x40\x7c\x93\x9f\xe4\x3b\xc3\x17\x3f\xc7\x3a\xc5\x00\x8e\x57\x51\x22\xe8\x28\x70\xce\xa8\x2c\xaf\xfb\x47\x0e\x87\x98\x9b\x1b\xae\x27\x54\x84\x93\x89\x66\x76\x3f\xa2\xf5\x23\x22\x3f\xa2\xf7\xa3\xc3\x28\x70\x62\x82\x70\xc8\x5e\x01\x9c\x39\x62\x58\x63\x04\xaf\x2f\x6f\x9f\x65\x71\xc5\xe2\x01\x9c\x00\x78\xf3\xc9\x21\x62\x5b\x9d\x6f\x0a\xb7\x67\xfa\x7f\xa6\xee\x45\x32\x62\xa2\x46\x84\x07\xc8\x3e\x21\x56\xa3\x16\x3a\x65\xd6\x4d\xc6\x7c\x9e\x59\x25\xcc\x85\x87\xbe\x97\x89\xf9\xfb\x88\x19\xdd\x16\xd1\xd0\x8b\x2c\x07\x18\xf1\xea\xfe\x93\xbd\x05\x70\xb4\x66\xc2\xb7\xdc\x09\x0f\x91\x20\x6b\xc9\xf5\x0d\xd5\xc9\x97\xe6\xca\x12\x1e\x57\xd6\xe5\xf9\xc7\x75\x03\x3e\x26\xae\xac\xd1\xbd\xee\x60\x0b\x3e\xff\x00\x09\xb1\x86\xa1\xb8\x24\x23\x56\x7f\x40\x7f\x1b\x52\xeb\x3b\x5b\xc8\x08\xd5\x1d\xd2\x21\xd4\xe0\x25\x11\x69\x16\xfd\x8b\xbc\x22\xe3\x33\x2d\xa7\xbe\x12\xec\x65\x91\x8b\xf4\xdc\xbd\xf6\x68\xd8\xd7\xfe\x89\x1c\x74\x86\x7b\x3b\x23\x66\xb8\xaa\xfb\x3b\x8e\xbb\x63\xbc\x14\xb1\x94\x41\xab\xc9\x1b\x01\x8f\xa5\xdb\xdf\x1b\xd2\x17\x2c\xa7\x56\x7f\x6f\x24\xfa\xdb\xc8\xa2\xa5\x9f\xd1\xeb\xe0\x13\x01\xfb\xe9\x70\x6c\xed\x76\x06\xdb\xfd\xc1\xfd\x36\x3c\x75\xfb\xfc\x93\xdd\x42\x74\x29\x4e\xc5\x76\x46\x5c\x70\x48\xc9\xd4\xa4\x20\x6e\xa1\xaa\x0a\x20\x0d\x49\x9f\xe0\xc8\x8e\x5e\xe1\x44\xc8\x07\x72\x4b\x9e\x72\x95\x21\xf0\x43\x1e\x1c\x10\xba\x9a\x63\x0c\x08\x43\x4d\xfa\x80\x8b\xd3\x83\x82\x0e\xb9\xe2\xc2\x63\xce\x8f\x8d\x60\xc1\x6a\xfc\x1f\x5c\x94\x82\xa8\x36\xfa\x9f\x74\x1a\x21\xbc\xd2\x8b\xf4\x99\xf1\x31\x96\x7f\x5f\x1c\xff\xbf\x5e\xe5\x7f\xb9\x76\xf5\xc6\xb5\x4f\xfd\xbf\x4f\xe2\x4f\xaf\xbd\x77\xbf\xd3\xab\xf2\x3d\x8d\xbc\x38\xbb\x9f\x1b\x1c\xb7\x24\x7d\x69\xb5\x9c\xb5\x7c\xb9\xa1\x2c\x2f\x42\xd1\x9c\x21\xfc\x27\x40\xeb\x62\xdb\xf2\x51\xd0\xba\x04\x7f\x08\xbc\x2e\xe7\x37\xe2\xe3\x8b\xd5\xbb\x2b\xe4\xf7\x0f\xd6\x17\x97\x0e\xd6\xc3\x77\xf0\xe5\x18\x5d\x1f\xb9\x45\xae\xd5\xe4\xb3\x0b\xe6\x23\x15\xa8\xb8\x34\x00\x7d\x42\x45\xc8\x49\x46\xb9\xf6\x83\xf8\x58\x01\x73\x9b\x57\x39\xab\xbf\x35\xc4\xb2\x48\xac\x79\x5b\x2d\x66\x20\x79\x37\xb2\x55\x72\x30\x0e\xd9\xd4\xb6\xec\x86\x81\xd7\x4c\xe9\x2a\x02\xf4\x80\x85\xa0\xd3\x00\x66\x9e\x3a\x28\xad\x5f\xc3\xed\xba\xc8\xe6\x02\x46\xd7\xa2\x2d\x4c\x66\xdc\x90\xbd\x61\x01\x94\x2d\x7f\xe2\xc2\xad\xa2\x64\xc0\x15\x72\xd0\x09\xa2\xdf\xc7\xd5\x62\x7c\x13\x83\x13\xb5\xf5\x06\xe9\x01\x70\xe9\x9b\x65\xf4\xcc\x05\xa1\x78\xea\x0b\xd7\xd1\x5c\x36\xcc\x2e\x2e\x08\x26\x3f\x51\x98\xfd\x12\x76\xe6\x85\x61\x76\xec\x87\x68\x88\xaa\xcb\x0f\x1b\x55\x17\xe7\x44\xd5\xe5\x87\x88\xaa\x8b\xe6\xa8\xba\xfc\x30\x51\x75\xd1\x18\x55\x97\xbf\x47\x54\x5d\xd4\xa2\xea\xf2\xc3\x47\xd5\x85\x1f\x55\x97\xbf\x47\x54\x5d\x78\x51\x75\xe1\xdf\x7e\xe3\x2c\x2d\xe2\xa2\xb4\xba\xc0\x36\x2f\x4b\xc2\x03\xb4\xbe\x6b\x37\xa1\x1c\xa2\xdc\xc2\x58\x44\xa5\xf3\x35\xfd\x50\x7d\x52\xdb\x28\x5c\x34\x1e\x67\xb3\xa3\x28\x05\xb0\x18\x66\xc8\x0a\x92\xd5\xfa\xb8\xef\xff\xf0\x4a\xbb\xbd\xf3\x71\x1a\x7f\x17\xdb\x7f\xd7\x6f\x5d\xaf\xea\xff\x6c\x6c\x5c\xfb\xd4\xfe\xfb\x44\xfe\xb8\xc5\xb0\xed\xa2\x98\xe7\x50\xf6\xc0\x76\x60\x8d\x1d\x70\x43\xaf\xf7\xf6\xde\xe8\x1e\x9d\x19\x1d\x08\xdd\x69\x47\x58\x9f\x6c\xdd\xed\xee\x26\xf2\x7e\xff\x6b\xb9\x37\xd8\x91\x2b\xbb\x83\xfe\xfd\xfe\x08\x3f\x31\xdc\xe9\xdf\x6d\xf7\xf0\x7c\x84\x07\x3c\x35\xf4\x1f\xb1\xab\xcf\x88\xee\x66\x67\x45\x88\x06\x5c\x88\x6c\x8f\xf0\xb8\x85\x24\xee\x70\xb8\x37\x00\x9f\x94\x33\x16\xab\xd1\x24\x3a\x2a\x6d\xf6\x5c\x59\xf6\xa1\x3b\xc3\x2d\xc6\x90\xb5\xfe\x11\xec\x50\xc7\xfa\xdc\x57\x49\x76\xc2\x36\xa8\xd1\x48\xb0\x90\x12\x42\x8b\x23\x2f\xad\x2a\x4a\xe9\x9c\x1b\xfa\x2a\xff\x23\x1c\xb8\x3f\xa6\x58\x1e\xa9\x86\xb4\x02\x10\xfa\x38\xcc\x8e\x58\x98\x3d\x2e\x0b\x81\x66\x15\x62\xbf\x8f\xa3\x64\x8e\x20\x82\x43\x95\x1c\xc9\x2f\xcc\x8b\x92\xc9\x4c\x74\x8f\x8a\x28\x9d\xa0\x2a\x4f\x96\x24\x51\x0e\x66\xa8\x75\xb2\xf7\xe3\x04\x29\x52\xca\x78\xa6\xc7\xe9\x58\xf1\xd1\xa5\xed\x2f\xc3\x19\xef\xa8\x00\x90\x38\x11\x73\xab\x04\x20\xab\xb4\x46\xc3\x5b\x58\xdd\x91\x0b\x71\x33\x81\xd5\x67\x81\x1a\x93\x1c\xa3\x61\xe7\xcd\x87\xc0\xa1\x01\xce\x98\x16\x11\xdd\x1b\xdb\x27\x59\x38\xa4\x3f\x71\x21\xef\xee\xde\x5d\x03\x89\x95\x09\x55\xa9\x03\x09\x6d\x3c\x85\xb2\x4d\x60\x97\x69\x36\xd3\x0d\xaf\x3f\x52\x9d\xd4\x4c\xf6\x7d\x7b\xa4\xc7\x16\xd8\x29\x1a\x5e\x07\x85\xa0\x5e\x98\x36\x02\xfd\x55\x50\x6a\xd4\xe3\x5d\x7a\x74\xbe\x56\xc9\x56\x90\x10\x0c\x82\x92\xf9\x1f\x13\x75\xa4\xd2\x09\x90\x1e\x00\x8a\x1b\x42\xd7\x49\x34\x4f\xc7\x87\xda\x5e\x8c\x1c\x33\x90\x07\x62\x55\x85\x07\x61\x20\xf4\x3f\x8a\x43\x59\x8c\x73\xa5\x52\x54\x32\x4d\x53\xe0\x60\x7e\xa1\x34\x42\x06\xb8\xe0\x9e\x2a\xbc\x75\xe9\x90\xa3\x10\x3f\xb1\xe0\xfc\x93\xa1\x9f\x5a\x8d\x5a\x20\x77\x21\x57\x57\x70\x09\xaf\xb4\x02\xf3\xbb\xfd\x96\xdc\xcd\xb3\xa9\x02\x0b\x3e\x4a\xaa\xfa\xa1\xab\x2b\xe7\x1c\x34\x7a\x8e\x1d\x62\x27\x7d\x4a\xe9\x83\x67\x75\x65\x6f\xb0\xb3\xd2\x42\xa7\xa4\xca\x94\x62\x38\x4e\x6a\xc8\x15\xec\xdf\x12\x56\x13\x71\x39\x56\x93\x9a\xaf\x42\x9a\x4b\x63\xdf\x69\x11\x9e\xa4\xc3\xf5\x50\xee\xa1\x6e\x53\x8e\xa5\x0d\xb9\x82\xbc\x94\xc1\xf0\x06\x16\x29\x6f\x0a\x45\xbd\x36\x53\xf8\xdf\xd3\xff\x29\x50\x94\x15\x70\xe8\x31\x9c\xeb\xb0\x73\x56\xd7\x5b\x32\x57\x07\xf3\x84\xca\x6c\x0a\x55\xea\x25\x8a\xe8\x67\x14\xc0\x98\xc5\xa9\x5e\xf0\x91\x36\x63\x40\xee\x73\x76\x94\x64\x0b\x35\x81\xda\x93\x23\x14\x59\x5d\xdd\x68\x39\xcc\x0f\xa6\xd0\xc3\x92\xa3\xf8\xb2\xa9\xab\xd7\x5a\x22\xc9\xc6\x51\xe2\xbd\x3b\x57\x07\x11\x8a\x76\x42\x9e\xc0\x95\x2e\xcf\xa0\x94\x81\x7f\x8d\xc2\xf5\x81\x54\x2f\xc0\x7f\x85\x03\x0a\x54\xe9\x38\x5f\x20\xdf\xb4\x73\xb8\x80\x1d\xb8\x3d\xe8\x74\xce\x45\x08\xd1\x55\xb6\xc4\x35\x71\x1c\x13\x71\x79\xfc\xcf\xe5\x1d\x13\x71\x19\xfc\xcf\xe5\x78\x44\x05\xf5\x84\xa3\xd5\xd6\x39\x79\x52\xdf\x44\x5c\x06\xf1\x73\x59\xdf\x44\x74\xb6\xb7\x3b\x9b\x23\xf4\x38\x7a\xd8\xc6\xee\xbf\x45\x97\xef\x7e\x7b\xa7\xbb\x09\xc1\xe9\x5e\x67\x04\xdc\x03\xed\xcd\xcd\xce\x70\x78\x7b\x39\x4c\x48\xfc\x5e\x0e\x8d\x0f\x13\x12\x1f\x81\x43\x43\x30\x21\xf1\x91\x38\x34\xf2\xb9\xf6\x03\xf1\xd1\x38\x34\x00\x13\x12\x97\x81\x09\x85\x57\xf4\xe5\x7c\x7c\x94\xae\xe9\xff\x16\x45\x62\x95\x20\x3e\x32\xaf\xe0\x22\xfd\x87\xf5\x9b\x55\xfc\xcf\xcd\x5b\xb7\x36\x3e\xb5\xff\x3f\x89\x3f\xc3\x1a\x67\xff\x14\x18\x08\x52\xa8\xce\xeb\x1f\xa9\xf4\xd9\xdd\x1e\xde\x1b\xfa\x1f\xc3\xe1\xce\x33\x42\x74\x53\x10\xdb\x23\xf0\xf4\x12\xc1\x08\xfe\xee\x48\x8d\x0f\xd3\x2c\xc9\x0e\xa0\x30\x11\xb2\xf7\x07\xf1\xb1\x2a\x2a\x45\xf3\xfa\x95\x64\x2f\x4f\x2c\xd6\x9b\x0d\x1b\x13\x73\xa4\x46\xc8\x9d\x78\x3f\xd7\x46\xd7\x2a\xd7\x14\x57\x95\x1c\xe0\x32\xe2\x4f\x83\x55\x6c\xe4\x12\xb4\x0d\xc0\x45\x25\x51\xc1\x1f\x42\x4b\xc2\x8d\x11\xea\x26\x81\x90\x9c\x53\x1f\xec\xde\x50\x4a\x96\x27\x99\xc3\xdd\x94\xed\x2b\x34\xaa\xcf\x51\x52\xa0\xc2\x20\x2a\x5b\xc6\x5a\x56\xa7\x32\x0c\x3a\x8f\x62\xf2\x96\xb3\x8b\x1a\x08\x21\x43\x47\x6f\x02\x06\x68\x1a\x6b\xe3\x80\xe5\x24\xa0\x8e\x6e\x62\xa8\x20\x68\x46\x59\xa7\xfd\xd8\xd7\x29\xc3\xaf\xee\xcf\x21\xfa\x67\x64\x96\x88\xfb\xcf\xc9\x88\x9b\xf7\x12\x74\xe9\x24\x2e\x0e\x9d\x74\x39\x68\x2d\xaa\xea\x3b\xad\xc4\xb8\x55\xde\xa7\xf7\xff\x93\xce\x97\xfd\x73\xfb\x13\x5e\x39\x48\xe7\x47\x49\x56\xfe\xa3\xf1\x3f\x5f\xdd\xb8\x71\xb3\xaa\xff\x73\xed\xda\xc6\xfa\xa7\xe7\xff\x27\xf1\xc7\xad\xe4\xf9\xcc\x4d\xb9\x26\xd7\x9f\x7e\xfa\x5a\xa0\xff\xff\x33\x81\xd4\x33\x22\x47\x87\xd9\x2c\x2a\xe4\x73\x71\x92\xc4\xd1\xac\x08\xe4\x66\x96\xc4\xa9\xfc\x9c\x4a\x12\xb5\xf0\x60\x52\x3e\xda\xa7\xa9\xda\xcf\x43\x2b\xc5\x65\x51\xc9\x3c\x55\x33\x2f\x55\x47\x7f\xaa\x54\x13\x16\xab\x1e\x73\x81\x2c\x99\xa8\xd1\x3e\x3b\xa0\x19\x0b\xcc\xc1\x24\x47\x54\xca\xfd\x0c\xee\x18\x28\xaa\xf5\xbf\x28\x8c\xbe\xe5\x79\x40\x1c\x12\xa6\x86\x14\x5b\x05\x88\xe3\x0f\x92\xc3\x25\xeb\xe6\x58\x4d\x7f\xf4\x91\x0c\xb5\x9d\xcd\xb9\x2b\xe1\x55\x75\x9b\x7b\xcf\x89\x9b\x84\xa4\x5a\xc8\xa4\xb7\x24\xbd\x5d\x51\xf0\x8b\x0a\x71\x14\x95\xe3\x43\xcb\x42\x6a\x94\x94\xf9\xa4\x96\x7e\xc3\x9d\xe9\x84\x98\x87\x1e\x3e\x4a\x4e\x02\x71\xb0\x6e\x14\x56\xeb\x57\x5a\x55\x78\xfd\x33\xf3\xb5\xc8\xe6\x10\x05\xaa\x70\xb4\x8e\xb3\x1c\x5d\x5f\xac\xd8\xc5\x7e\xf9\x34\xbe\x26\xca\x57\x6d\x32\xa3\xd9\x98\x1a\x18\x48\x41\xc6\x87\x70\xd9\xb9\x44\xba\xfa\x33\xdc\x87\x00\x82\x3c\xd1\x64\x62\xcc\x18\xbe\x29\x2b\xa1\x08\x1a\x02\x94\x13\x3f\xf4\x2f\xd5\xd8\xda\x44\xcc\x3a\xb2\x1f\x15\xa6\x81\xe6\x73\xe9\x7c\xb6\xaf\xf2\x00\x22\x13\x4c\x10\x0c\x0f\x32\x5a\x9a\xcc\x3e\x1b\x31\xdd\x31\xf2\x71\xd8\x62\x22\x0c\x65\xb0\x0e\x7a\x36\x15\xf0\xfd\xaa\x01\x64\x03\x23\xd7\x43\x4e\x63\x83\x8e\x16\x3d\xc7\x25\xb5\x8d\x53\x72\xb5\x39\xa1\x49\x26\x02\xf4\xc0\x71\xaa\x97\x2e\x87\xa6\xa9\xe0\x87\xb8\x39\x75\x3b\x03\xe2\x12\xb3\x7c\xde\x5c\xda\x05\x85\xc5\x7d\x60\xd5\x59\x8e\x11\xb9\xc1\xb5\xff\xf2\x3a\x0c\x19\x05\xe9\xbc\x40\x5e\x2d\xd7\xe3\xf2\x01\xae\x44\x7a\xd5\xae\xd4\x88\x69\x2d\xb7\x1f\xf3\xf6\x31\x8d\x81\x20\x1a\x03\x1b\x0d\xde\x5f\x54\x78\xc2\xfe\xe0\x6c\x9f\xf0\xca\x66\x7b\xd4\x1f\xee\xac\xad\x87\xeb\x1f\x97\x09\x70\xfe\xfd\x7f\xfd\xc6\xfa\xad\xda\xfd\xbf\xbe\x7e\xeb\xd3\xfb\xff\x93\xf8\xb3\xc9\x24\x7d\x6d\x86\x91\x16\x72\x94\xcf\x21\xc4\xaf\xfd\x0e\xe6\x5d\xad\xd5\x04\xaf\x87\xeb\x42\xec\xee\x74\xda\xc3\x8e\x1c\x74\xda\x5b\x18\xa7\xd8\xea\x6f\xee\x41\xd8\x66\xb3\x3d\xe8\x6c\xef\x01\x50\xbd\x07\xe8\xca\xee\x68\x48\x74\x94\xa3\x07\x48\x4e\xd9\xde\xdc\xec\xdf\xdf\x6d\xf7\x1e\x74\x7b\x77\xc5\xee\xa0\x7f\x77\xd0\xbe\xef\xc5\xe8\xf6\x7a\x5b\x9d\x81\x83\x5f\xe7\x60\x88\xfe\xda\xde\xa8\x33\x90\xed\xe1\xb0\xbf\xd9\x6d\x8f\x3a\x43\x39\x1a\xec\x0d\x47\x9d\x2d\x28\x83\x13\xc3\xfe\xde\xc0\xcd\x0d\xad\xd0\xdf\x56\x5a\x21\x04\x5a\x20\x54\x34\xe8\xec\x0e\xfa\x5b\x7b\x84\x8b\xbc\xdf\xdf\x32\x41\x65\xd9\x1f\x58\x50\x7b\xb7\xdf\x13\x1c\x63\xa1\x36\x6e\xf6\x7b\x14\x8f\x1a\xc2\xcf\x07\x9d\xcd\xee\x6e\xb7\xd3\x1b\x3d\x35\x24\x58\xbe\x85\x4b\x76\x87\xdc\x8c\xd0\xc8\x4b\xc8\x3b\xd1\xf8\xf9\x83\x3c\x9b\xeb\xf3\xb9\x69\x02\x3c\x62\x23\xf2\x99\x57\x37\xdb\x2d\xb9\xaf\x92\x58\x1d\x2b\xcc\xd0\xe8\xd9\xa1\x52\x09\xf9\x9c\xe2\xdf\x09\x63\x04\x39\x1f\x90\x13\x75\xac\x92\x0c\x22\xb7\xa8\xa0\x0d\x3c\xf2\x51\x2a\x4b\x20\xe5\x73\x34\xb5\xcd\x59\x48\xae\x37\xd0\xf0\xcd\xd3\xa3\x5c\x8d\x95\xbe\x0d\xd5\x44\x26\xfa\x61\xe0\x5f\x7f\x71\x1e\x25\x50\xd9\x7d\x90\x67\x27\xe5\x21\xf3\x0e\xa5\xd9\x31\x55\x8d\x8e\x32\x39\x51\xb3\x2c\x85\x60\xb2\x12\x7c\xff\xc4\xe9\x9c\x98\xb7\x66\x71\x09\x8d\x2a\x33\xb7\xbd\x81\x3c\x41\x7c\x36\xde\x29\xec\x6e\xef\x52\x34\x60\x35\x2a\x04\x93\x56\x43\x4e\xad\xd5\xc0\xde\xca\x87\xbb\xc3\x56\x03\xa4\xcc\x13\xe5\xe2\xc5\x3d\x4a\x74\xdd\x7a\x87\x54\x90\xee\x2f\x7a\xab\xa0\xab\xd1\xf9\x91\x1b\xb0\x06\xea\x47\x37\x75\xc5\x69\xb0\xd4\xb2\x54\xcc\x90\xab\x8d\x0c\x38\xe0\xe0\xa1\x94\xd7\x4c\x91\xc3\xef\x4e\x1a\xc5\x28\x0a\xd0\x9d\x3c\x84\xbb\xec\x04\x68\x2e\x80\x60\xea\x50\x61\xa7\x81\x62\x46\x98\x16\x79\x28\x04\xb8\x09\x57\x23\x4b\xf1\x4d\xa3\x05\xc8\x85\x32\x43\x56\x10\xf3\x55\x50\x08\x99\x45\x71\x2a\x74\x2b\x82\x1a\xd9\xcf\x44\x71\xf6\xca\x0c\x1f\xa0\xa1\x32\xa9\xbf\x04\x06\x06\x6a\x59\x9e\xd8\x48\x3c\xe7\xa9\x0a\x53\x31\xe1\x3d\x95\x54\xce\xf5\x63\xc6\x87\x59\x66\x54\x4c\x8a\x2c\x94\xa3\xc3\x79\x11\x20\x4d\x90\x7e\xac\xf0\x7b\x45\x36\x16\x2f\x09\xce\xbb\xd5\x25\xaa\x97\xf3\x42\xea\x05\xe2\xd9\x0c\xb0\x75\x10\x28\x07\x59\x91\x69\x96\x93\xa9\xd8\x44\xf4\x47\xcf\xc7\x94\xd7\xa2\x42\x07\x43\xed\x42\x72\xf0\xf5\x50\x6e\x75\xb6\xbb\x3d\x2c\xbc\xd1\x26\xef\xba\x37\x47\xcc\xac\x13\xb5\x0c\xb9\x5b\x84\x46\xd8\x66\xbb\x42\x5b\x4c\xcf\xbd\x8d\x39\x95\xfd\x96\xa8\x7c\x01\x32\x87\x0e\x0a\xc5\x65\xb2\xdd\x6c\xb7\x02\xc2\x6f\x15\x6c\x69\xc6\xee\x68\xda\x55\x04\x1c\x72\xb8\x3c\x9c\x2f\x5c\x81\xe4\x90\xff\x1d\x33\x03\x0c\x61\x53\x60\x9c\x83\xcb\x04\xea\x31\xce\x84\xec\x13\x69\xd1\x51\x94\x97\xf1\x78\x9e\x44\x1e\xba\x0d\x6c\xcf\x34\x9a\x4e\xe3\x04\xcb\x19\xca\xc3\x38\x9f\xe0\x87\x55\x11\x8a\xb6\x3f\x66\xe6\x7d\xe4\x0d\x44\xde\xb3\xe2\xa9\x8c\x4b\x47\x7f\xd4\x6f\xac\x76\x56\xa0\x73\xde\x57\x50\x3d\x16\x7d\xd0\x2c\x55\xc0\xd6\x95\x1e\xc8\x2c\xad\x7d\xb6\x90\xfb\xea\x30\x4a\xa6\xa1\xbf\xd5\x44\xa5\xb8\x6f\xe9\x58\xc1\x9a\x79\x46\xae\xbe\xd0\x42\x7e\x6d\x75\x14\xe9\xf3\x51\x9b\xbf\x73\x80\x03\x4e\x85\x39\x87\xdd\x01\x44\xf2\xb1\x2f\x10\x83\xae\xf5\x64\xf8\xb9\x66\xc5\xc7\xb8\x0b\x13\xa6\x7c\xe4\x42\x36\xca\xc5\x2d\x5a\x26\xde\x57\x53\xf7\xf1\x4f\x3d\x48\xd3\x6f\x78\xe3\x84\x8b\x75\xb3\x6d\x4a\x8e\xdc\x9c\xa3\x1e\x3e\x97\x9f\xca\xd1\x20\x71\x57\x18\x3c\xf6\x9a\xf7\x58\x36\x2c\x88\x79\x0b\x55\xa4\xdc\x4f\x04\xf8\xc4\x8a\x77\x61\x4e\x67\x14\xea\xa0\xc2\x47\x4c\xcf\x3b\xf3\xe5\x2d\x1d\x76\xb0\x75\xe3\x37\x6b\x90\x2e\x51\x99\x2c\x48\xa5\x03\xed\x1f\xb4\xfa\xba\xdc\x41\xe5\x63\x20\x7a\xa2\xd6\x7a\x32\xc8\xb3\xfd\x38\xa5\x36\xd8\xcd\x21\x21\x36\x80\xa7\x0c\x10\xac\xa1\xdb\x02\x5e\x11\x80\x4b\x81\x24\xd2\x72\xb0\x2f\x3b\xb2\xd6\xc3\x1b\xd2\xc8\x54\x21\xa9\x68\x01\xad\x20\xf6\x4b\xe6\x4b\x02\x8f\x43\xfb\x1f\xfe\x16\x63\x45\x20\x66\xea\x34\x82\x3f\x54\x36\x51\x10\x8b\xa2\xbe\xce\xbc\x31\xd3\x9e\x1b\x7c\xe2\xe4\x50\xa5\xdc\xc9\x49\x6d\x09\x42\x0b\x6f\xd6\xce\x2b\x47\xbe\x87\x71\x39\x75\x37\x91\x16\x3c\x94\x6e\xc5\xe3\x43\x8f\xf7\x0e\x68\x27\xca\x32\x1a\x1f\xaa\x09\x11\xbf\x58\x87\x73\x7f\x01\x07\xa5\x3d\xe9\xbc\x8b\x38\x43\x76\x3b\xfd\x0f\x38\x95\xbc\xe0\x0c\x88\x38\x47\xe9\x22\x64\x08\xc1\x7a\x78\xab\xa1\xd1\xb5\xfe\xd4\xae\x59\xe8\xf8\x67\xe4\x80\xcd\x07\xc3\x20\x07\x47\xc9\xc9\x61\xc6\x0e\x3a\xca\x8c\xc0\x7f\x81\x8f\xcb\x17\xea\xa9\x5f\x1e\x1b\xa1\xbc\x3b\x68\x63\x26\x14\x0b\x9d\x84\xd8\x08\xd7\xe5\xd0\x63\x9a\x6c\x5e\x2f\x41\xfd\x3e\xf0\xb5\xaa\x4c\x73\x45\x94\xca\x38\xcf\xd5\x71\x36\x46\xcc\x4e\x45\xa5\x0a\xe4\xac\xea\x6a\x56\x2e\xa7\xbb\x01\xaa\x07\x62\xa9\x74\x58\x36\x0d\x8c\xba\x16\x43\x50\x9c\x9f\x90\x8e\x97\x5b\x12\x08\x53\x66\x05\x08\xfc\x9d\x4d\xcb\xa7\x7a\x3c\xf3\xa4\xe2\x69\x07\xbf\xb5\x2d\x01\x35\x3a\x60\x85\xf4\x23\x13\xe9\xc4\x5d\x29\x10\x74\x40\x76\x3c\x08\x28\x1e\x67\xf1\x84\x19\x81\x27\xd9\x7c\xbf\x44\x32\x63\x6e\x95\x89\x1a\x70\xbd\x93\x15\x52\x59\xb7\x45\x4d\xf6\x62\x70\xc7\x4d\x9f\x42\xbc\xa3\x05\xef\x68\x08\x77\x38\x5d\x02\x20\xd2\xc6\x1f\xde\xa4\x97\x46\x2e\xc2\x69\xfc\x12\x56\xc7\x06\x31\x9b\xa0\x22\x65\x03\xfe\x03\x40\x3d\xc4\x93\x4d\xf4\xf9\xb3\x89\x58\x2e\x28\x06\xe0\xb6\x3b\x74\xda\x95\x09\xdb\xa0\x09\x33\x54\xe9\x14\x6f\xe5\x24\xa0\x30\xf0\xaf\xd4\xc7\x11\xba\x07\x7e\x3c\x0d\x24\xf9\x61\x06\xc7\xe5\x7d\x21\x26\xcb\x84\xcf\x5f\xaf\x57\x48\x16\x4a\xd6\x83\x6c\x7a\x1f\x20\xfe\x8b\xa5\xc3\xbf\xef\x9c\xf0\x92\x8d\x1d\xa7\x0f\xc0\x89\xae\xcf\x6e\x43\x8c\x48\x81\x36\x75\x90\xc5\xe9\x41\x20\xd2\xac\x49\x8d\xc8\xf1\xb2\x9c\xf1\x7a\x06\x2c\x57\x0e\xde\x63\xfe\x36\xa7\x0d\x0f\xda\x25\x15\xb3\xa8\xd2\x5d\xbe\xf9\x21\x95\x1c\x97\x52\xbd\x10\x33\x87\x6b\x5c\xd8\x22\xc0\xf1\x38\xcb\x61\x0b\x0a\x73\xe7\xe0\xf2\xc7\xeb\xf4\x36\x00\xc9\xa6\xc0\x43\x69\x49\xa8\x0b\x1c\x28\x3d\x06\xcf\x10\x73\x25\xdb\x94\x0b\x3f\xd8\x58\x9b\x55\xdb\xb0\xdb\x86\x79\xb2\xb2\x12\x50\xf0\xb1\x66\x3f\xec\x2f\x70\x07\xd6\x2c\x4c\xcc\x67\xf8\x3c\xd2\xab\xca\x54\x4d\x5a\xe1\x0c\xaf\x19\x1c\x72\x69\xb9\x65\x8d\xc7\xf1\x58\x15\xd8\xb0\x71\xab\x46\x85\x5d\x33\x10\x6a\xd7\xbd\x59\xa7\x5c\xdb\x54\x28\x3a\xdd\xea\x1d\x32\x76\x7b\xf5\x3c\xba\xe6\x5c\x77\xb0\x34\x60\x35\x91\x1f\x15\xb1\xcf\x5a\x3b\x8d\x0e\x58\xd6\xc6\xba\xb8\x02\x74\xf9\x8a\xca\xcb\xad\x0f\xc6\x64\xed\xce\x60\x39\x27\xae\x5d\x8b\xd7\x61\xe5\x46\x0c\x64\xc6\xd4\x87\xf9\xa8\x36\x87\x5c\x93\x8f\x0d\x22\x77\x40\x26\x99\x2a\x68\xb5\xe2\x90\xc1\x41\x64\x35\x94\xce\x13\xfe\xa2\xaa\x37\x0f\x05\x57\x35\x8b\x43\xd1\xa9\x8e\x07\x17\x64\x21\x5f\x87\x95\xac\x28\x33\x67\x7c\x01\xc9\x87\x9f\x62\x36\xf0\xfd\x85\x38\xc7\xfc\x46\xb5\x01\x04\x68\x5a\x52\x76\x10\x94\x68\x68\xbb\xe0\xb6\x3b\xf5\xb5\xa1\x6c\x17\x50\xa4\x4b\x1e\xaf\x23\x50\xc0\x27\x06\x7d\x0b\xc5\x26\x68\x2a\x6b\x52\x2e\x74\x21\xd9\xbe\xd0\x75\xa4\xa7\x69\xa6\x0a\x59\x64\x89\x43\x58\x6a\xfa\x5e\xa8\xf1\x3c\x57\xe2\x22\xb5\x35\x6a\x42\xaa\xd4\x04\xe4\x76\xd8\x9c\xdb\x08\xaf\xcb\xda\x50\x3b\xdc\xc8\x10\x98\x71\x25\x96\xf4\xd9\x73\xa8\x1d\x46\xae\x5f\x0c\x24\x70\x4c\x0b\x43\xa6\xad\x8a\xd2\xb2\xaf\xb3\x58\x91\xfe\x49\x6d\xe9\x12\x5b\x4c\xe4\xab\x2c\xe2\xd0\xf8\xdf\x37\xe3\xe6\xac\xf6\x8a\x14\x1a\xda\x81\xd7\x42\x2f\x28\x29\x07\x9d\xcf\xef\x75\x11\x24\x37\x14\xe2\x5a\xb8\x2e\xbb\x53\x7f\x6b\x17\x55\xdf\xb1\x6a\xdf\x80\x0d\x93\x7a\xb0\x60\x4a\x78\x72\x38\xa5\xaa\xdd\x86\x22\xff\xe8\x28\x3b\x82\x60\x84\x64\x06\x12\xef\x2a\xf1\x44\x20\xbc\x4a\xb3\x6a\x46\x88\xd3\x59\x4e\xab\x0d\x72\xdc\xa6\xf9\xdc\xe3\x10\x0e\x3b\x37\x7b\x95\xa5\xa0\xd2\x09\x13\x0a\x71\x0b\x5f\x38\xc4\x4b\x8c\xb6\xbd\x47\xcd\xa2\x85\x1b\x77\xf2\xf3\x59\xce\x11\x59\x1d\x38\xba\x08\xf5\xb4\x2f\x71\xb3\xbd\x9c\xb4\xc1\x41\x4b\x29\xff\xb5\x84\xa8\xe3\x0c\xe5\x1f\x2b\x57\x59\x25\xc0\x54\x31\xec\x3c\x0d\x5b\x7a\x94\xa5\xc7\x35\x2f\x7f\x46\x88\x7f\x2d\xd5\x74\xaa\x0f\xc5\x63\x85\x76\x36\x0b\x01\xa6\x14\xb8\x80\x33\x2a\x49\x2a\xc5\x85\xc0\x58\x6c\xa4\xa8\xfc\xc6\x04\xc2\x08\xb0\xa0\x8d\x56\x51\xb7\xf2\x44\xac\xf2\x6a\x2f\xf4\x3e\x22\x92\xcb\x74\xcd\x3d\x90\x10\xc9\x5b\x49\xa8\x35\x3e\x63\xa6\xf2\xf1\x61\x94\x96\x7c\x3a\xea\xef\x4d\xe3\x32\xd5\x4d\x02\xdb\x43\x38\x61\x25\x42\x10\x18\xd8\xf4\x2c\x7a\x21\x9e\xcd\x67\xf2\xe2\x0c\xdd\xed\xea\xe8\x91\x78\xc0\x65\x06\xaf\xa2\x36\xc4\xe2\x3c\x76\x8c\x2e\xa5\xf9\xc4\x03\xdf\xa8\xf3\x03\x86\x61\x21\x93\x0c\xeb\x1a\xa6\x31\x28\x54\x7e\xa8\x4e\x02\x44\x8b\x2f\x6b\x97\xe8\xbd\x20\xff\x9b\xa8\xa4\xb0\xfe\x4d\x3f\x91\x56\xab\xab\x87\x92\x2b\x01\x16\xbc\x13\xdd\x73\xcf\x5b\x8c\x1a\x10\xbb\x29\xdf\xbf\x74\x61\x69\x1b\x8c\x96\xb4\xdf\x98\x27\x3b\x1e\xaa\x56\x96\x30\x75\x37\x58\x0c\xed\x66\x7c\x39\x41\x01\x85\x3d\xbc\x73\x54\xc1\x22\xbf\x74\x68\xc4\x58\x9a\xe1\x0a\x03\xcc\xa0\x1a\xc2\x04\x09\xae\x85\x1b\xf2\x39\x7d\x74\x56\x9a\x06\xd6\x92\x6d\x5f\xc5\x29\xd1\x6f\xad\x1d\x05\x7c\xd2\x56\xbe\x5a\xcf\x67\x98\xa1\xaa\x90\xbf\x1a\xa9\x90\xea\x91\xdd\x2c\x18\x6c\x63\x0b\xd7\xc2\x6b\xf2\xbc\x0c\xc9\x34\x1a\xeb\xc5\x1c\x19\x54\x86\x15\xe6\x72\x2b\xa8\x28\x9f\xc1\xa3\x50\xb7\xb1\x42\x79\x2f\x3b\x51\xc7\xda\x0e\xf0\x76\x8c\x3e\x7c\x21\xba\x8f\x1c\x4a\xd6\x3e\x28\x44\x24\xb3\x54\xad\x69\xc7\x29\x90\xf3\xa3\x69\x9e\xa5\x08\xfe\xe1\xd5\x50\x69\x80\xd7\x31\xef\x25\x82\x99\x53\x6b\xef\xa0\x0b\x6b\x3c\xcf\x73\x48\x45\x11\x8f\x13\x9f\xa6\x53\xa5\x8c\x40\x59\x96\x82\x53\x24\xc8\x07\x36\xad\x70\x1e\x66\xd4\x78\x28\x74\x46\xa6\x41\x83\xa6\xa0\x1f\x69\xf7\x5b\x4b\x8e\x27\x28\x1f\x2c\xbb\x27\x1b\xfc\x13\x3d\xfe\x0b\xf7\xf6\xb2\xcb\x48\x6f\x6d\xd8\x09\xd6\x53\x56\x5f\xd4\xe6\x93\x71\x6b\x0b\x13\x4c\x70\xf7\x50\x99\xc9\xa3\xc3\x45\x81\x0a\x44\x4b\xd8\xdb\x31\xa6\x13\xca\x2e\x48\xc4\x32\x60\x09\x85\x4f\x6b\xc2\x73\xae\x70\xab\x1f\x92\x84\x4d\x0c\xc3\x0f\xc5\xef\x4a\x15\xc6\x95\x24\xb5\x61\x14\x0e\x80\x07\x83\xff\x87\x27\x96\x1f\x93\x8e\xcc\x32\x82\xb0\xb1\x99\x9a\x40\x16\x99\x51\x88\x86\xa3\x02\x85\x3d\x30\xfa\x2d\xa2\x94\x25\xb3\xa0\x54\x1e\xe4\xc7\x8e\xa9\x7e\xca\xba\xc3\x2e\xf9\x15\xdc\x03\xa6\xb9\xb8\x24\x62\x64\x96\xc2\x73\xcd\xae\x29\xd3\x17\xef\x94\x00\xe3\x09\xb6\xdf\x75\xdf\x1a\xc1\x4e\xa0\x76\x58\xe4\x05\x99\x11\x5a\xb5\x8f\x8c\x62\x5e\x1e\xc1\x38\x94\xc2\xa9\x57\x7e\x92\x88\x72\x03\x4e\x4f\x09\xf7\xdd\x08\xef\x8e\xd3\x83\xc4\x94\x3d\x81\xe6\x0b\xde\x44\xa4\x96\x51\x5d\x98\x46\xef\x4d\x14\xf3\x5c\x59\xc3\xcf\x93\xc3\xa9\x69\x6b\x01\x1f\x57\x32\x8d\x81\xe0\xb8\x32\x6e\xa1\x68\x57\x3c\xb7\x93\xc3\xcc\x8f\xf7\x3b\xf6\x5a\xe4\x9e\x56\xd4\x6a\x8c\x34\x41\x70\xc3\x91\xb6\xb2\x5e\xb7\x37\xe4\x28\x6d\xcd\xc2\x28\x38\x67\x81\x97\x37\xc0\x51\xf7\xd3\x13\x99\x89\xd9\x44\x89\x11\xb1\x98\xc3\xdf\x39\xd1\xed\xcb\xd1\xf0\x03\x81\x3d\x0d\x44\xd0\x03\x8e\x81\x62\xbd\x96\x6f\x8d\x55\x8d\x27\xeb\xce\x44\x66\x69\xea\x79\xf1\x4e\x40\xce\x54\xf5\xb2\xa5\x8b\x2d\x5d\xb8\x0d\xf7\xad\x18\x5c\xd4\x3e\xc3\x8b\x55\x60\x83\x53\xc5\xcf\xa2\x7d\xb8\x29\xa9\xc5\x4a\x56\x37\xed\xc7\x9d\x9f\xb7\x8c\xf3\x68\x64\xf6\x27\x6a\xaa\xd2\x09\xdd\xec\x13\x35\x4b\xe3\xe9\x42\xe8\xfb\x66\x51\x6f\xbc\x5c\xed\xd2\x47\xb4\xb9\xe9\x3d\x17\x42\xf4\xfa\x12\xae\xe6\x99\xbd\xeb\xad\x96\xce\xd4\x9f\x6f\x6a\xa8\xa7\x58\x86\xf2\x95\x81\x60\xb5\x23\xab\x2b\xb4\x3a\xce\xc0\xa5\x45\x5b\x73\x07\x3e\xd7\x32\x52\x9e\x78\x36\x82\xed\x1e\x80\xd8\xd3\x3c\x46\xcf\x95\xea\xfc\x88\xa6\x92\x0e\x26\x1b\x17\x90\x91\x17\xe8\xe2\xa6\x94\x20\x9a\xd5\xd8\x7f\xe1\xc7\x6c\x4d\xd4\x0c\xa3\x43\x63\x8a\x0c\x10\xf8\xaf\xf0\xd4\xe1\xfc\xd5\xe3\x2c\x7b\xe1\x2d\x7b\x1b\xbe\x6d\x1c\xae\x06\x5d\x25\x00\x08\x3b\x37\xbd\xa8\xde\xf4\xa3\x43\xc5\xf5\x0a\x16\x2f\xe8\x28\x2b\xb1\xcc\x26\x07\x72\x21\x3c\x09\xa3\xa9\x8f\x6b\x1c\x6c\x57\x7b\x8d\x85\xac\x58\xec\x27\x49\xd4\x81\x9a\x2c\x89\x3b\xb8\x1b\x11\x8e\xf3\x1b\xda\x01\xf7\xa2\xee\x51\x21\x9f\x4f\xb3\x93\x44\x4d\x0e\x58\xf6\xdf\x18\x18\x68\x1a\x78\xf3\x54\x78\x6f\x12\xd5\x08\x47\x5c\xf0\xf9\x39\xf1\xa4\x22\xcb\xba\xf2\x5f\x43\x7a\x1b\x95\x89\x38\x54\x56\x40\x62\x22\xcb\xe5\x46\xb8\x11\xd4\x8f\x6e\x44\x22\x70\xae\x02\x8a\x95\x01\x74\xc9\xee\x2a\x9b\x2f\x9e\x85\xe2\x19\x65\xa4\xce\x15\x86\x57\xba\xbb\xff\x4f\x77\x38\xdc\xeb\x0c\x03\xc6\x2c\x40\x90\x61\xba\x90\x9b\x6d\x19\xa7\x82\xab\xc8\xc1\x73\xb8\x14\x16\x2a\x90\xfd\x54\x35\x7d\x58\xec\x26\xd1\x7f\x88\x02\xd9\x2d\x92\x28\x9d\xc4\x51\x20\x7b\xea\x44\x3e\xd0\xd7\xd8\xfa\xfa\xad\xeb\x4f\x07\xb2\x5d\x96\xe9\x33\x1e\xb0\xed\x6e\x9e\xcd\x8f\x48\x6b\x47\xcd\xa2\x38\xd1\x0d\x81\x5a\x38\xf8\xfd\xbf\x19\x47\xe1\x38\x9b\x05\x02\xd0\xe1\xa8\x6b\xbe\xcf\xd7\x30\x0a\x22\x5a\xbd\x6d\x08\x2a\x47\xcf\xfb\xbf\x06\x64\xf8\x74\x1a\x8f\x21\xf4\x35\x51\x65\x14\x27\x6c\xc2\xd8\x90\x18\xe4\x13\xdb\xf2\x24\x4e\x12\x58\x33\xc4\x5e\x99\x19\xb8\x2e\x85\x78\x19\xa4\x4b\x1a\xfb\x25\x64\xa5\x2b\xeb\x0e\xdd\x18\x32\x77\xec\x02\x44\xe5\xba\xa6\x44\x84\xef\x7b\x04\xee\xad\xc6\xb9\x90\xa4\x40\xae\xbd\xa3\x32\x59\xb8\x00\x76\x33\xbb\x84\xca\xf5\xa0\xf5\x7e\xa8\xe5\x79\xe5\xfa\x6e\x36\xab\x8e\x49\x3a\x94\xc0\xd4\x96\x2f\x05\xc8\x4b\x75\x54\xc8\x55\x76\x78\x71\xc9\xc0\x3a\xb1\x60\x35\x31\x23\x71\xb8\x04\x09\x5a\x72\x99\xaa\x93\xe2\x40\xcf\x68\xd1\xba\x50\xd4\x1d\x4b\x8c\xf5\xb1\x9f\xab\xb1\x02\xca\x29\x3f\xed\xaf\x5d\x51\xfd\xfa\x54\x9d\x38\xc3\xa8\x77\xf5\x3e\x14\xc9\xef\x23\xc7\x21\x6c\xfe\x9b\xce\x5c\xda\x7c\x5f\xae\x66\xd9\x31\xa4\xa0\x8b\xf1\x1c\x69\x3e\x79\xf0\xc0\x49\x6a\xcb\xa6\x1b\xd6\x29\x5c\xb0\xd2\x9a\xd8\x69\x55\x46\xb9\xd5\xde\xc7\xda\x03\x40\x9f\xa5\x3e\x2e\xcd\x91\x37\xab\x38\x12\x5e\x3e\x9c\xe4\x20\x6b\x2c\x04\xa8\xea\x37\xb1\x61\x5f\xbd\xe7\xdd\x93\xd6\x8b\x55\x72\xf8\xfd\x7a\x43\xe6\x11\x8e\x13\x82\xd1\x2f\xc8\x90\x12\x91\x87\x04\x80\x25\x5b\x47\x1c\x78\xb9\xbd\x48\xce\x88\x8f\x40\xcf\x8a\x9d\x59\x01\x12\xca\x7a\xa9\xef\x53\xb8\xc4\xf5\xca\xf4\x5c\xf3\xab\xeb\x2f\xac\xee\x84\x90\xc1\xf2\xa6\x78\x1a\xc3\xac\x58\xe3\x8b\xc8\xad\xeb\xe1\x7a\x3d\xa8\x5c\xa1\xe0\x32\x0b\xc8\xe2\x18\x7c\xeb\x98\x62\x83\xda\xcd\xf5\x76\x62\xe9\x0a\xbc\xc0\x76\xe2\x49\x31\x27\x0a\x61\xb1\x6a\xf6\x36\xc1\x56\xc8\xa0\xd3\x43\xd9\x0c\x93\x39\x8f\xd2\xab\xd6\x31\x61\x85\x67\xec\x65\x60\x43\xc5\xb6\xc4\xcf\xd8\xf7\xd5\x83\x85\xe8\x11\x02\x81\xe1\xae\x64\xe1\xea\xc4\x25\x8b\xc0\x06\x78\x97\xd8\x57\x11\xb1\x26\xb8\x76\xb6\xf0\x6b\x30\x99\x4d\x94\x6a\x25\xfc\x0f\xe3\x0b\x70\x1a\xfc\x1b\x11\xac\x0c\xc0\x91\x62\x13\xf5\x2a\x43\x8e\x5f\xdb\x18\x6f\xdb\xf0\xe5\x45\xfb\x85\xca\x7f\xe0\x5f\x2e\x2f\x87\x19\xf7\xbc\x39\x1c\x6e\xe5\x57\xab\x93\x48\x97\x8b\x72\x37\x07\xb8\x95\xae\x2c\x5d\x0d\x1e\x72\x23\x94\xbd\xbe\xe1\xeb\x15\xe2\x86\x5e\xa1\x7f\xb2\xd9\xd9\x1d\xc9\xf6\x90\x89\x0c\x76\x1e\xc8\x61\x67\x24\xb7\xfb\x83\xd1\x3d\x43\x75\x4b\xb8\xe4\xc0\xc3\x36\x3b\xf8\x6b\x01\xa4\x08\x2e\x7e\x5b\x3f\x0b\x58\x07\x46\xed\x51\xc7\xa7\x13\xf7\x5a\x81\xe0\x6a\xf8\x2c\x00\xaa\x03\x61\x3e\x17\x20\xaa\x7b\xd4\xfe\x1c\x31\xa6\x8f\x3a\x83\xfb\xcd\xcc\xc2\xfa\x2d\x7b\x23\x28\xc4\x77\xaa\xe6\x03\xdd\x2c\xa2\x16\x76\x9e\xfa\xf9\xbd\x36\xd6\xdf\x6f\xed\x0d\x4c\x2d\xbe\x43\x5e\x1b\xc8\x5e\xbf\xb7\xe6\x92\x08\x07\x75\x2e\xe2\xfe\xe0\x62\x36\x06\xa2\x38\xaf\x40\xc2\xbb\x43\x79\xb7\xfb\x6c\x07\xa0\xe3\xed\xe1\x70\xef\x7e\x67\x4b\xdc\x79\x50\xa3\x62\x00\x7e\x89\x9d\x1d\x54\xf1\x70\x19\x25\xfc\xf1\x1a\x06\x0e\x4f\xbb\x37\x62\x43\xa0\x8c\x20\x3a\xf7\x41\x47\xde\xeb\x0c\x3a\x77\x1e\xe8\x09\x47\x1a\x63\x1a\x98\xed\xbd\x9d\x9d\xce\x70\x24\x3b\x7f\x32\xd2\xf3\x05\x24\xeb\xa3\x11\xd2\x5e\xec\xb4\x9f\x03\x02\xc2\x0d\xdc\xef\xf6\xda\x8a\x31\x13\xe7\x13\x8f\x90\x6e\x3e\x2a\x92\xf2\x96\x73\xae\xe0\x54\x15\x90\x3a\x9f\x93\x02\xb7\x13\x4b\xa8\x06\x2b\x48\xae\x0b\x52\x7e\x98\x63\x2b\x9e\x2f\x5c\xfa\x6a\x28\x0b\x8a\x2b\xd1\xb4\xa5\x91\x34\xd7\x07\xa9\xf8\xd1\x46\x7d\x17\xdf\x60\x9c\xad\x6c\x6a\x0a\xca\x55\x9e\x67\x39\x40\xb1\x7c\x72\x14\x3f\x4e\x5e\x04\x14\x7a\x07\x2d\xfa\x1c\xfc\x38\x88\x29\x47\x65\x14\x18\x84\x3c\x24\x5d\x2d\x31\x0a\xca\x25\x93\xa5\x83\x8e\x74\x86\xc9\xcb\x3c\x9f\x1f\xb1\x23\xa3\x6d\xfb\x88\x91\x63\x37\xc2\x6b\xd5\xd9\x88\xc6\xc6\xe4\x28\xea\x59\xea\x98\x73\xd4\x14\xae\xd5\xb3\x84\x34\x56\x82\xa0\xff\xb9\x41\x28\xa4\xf3\x71\xa2\xa2\x9c\xe3\xb9\xa8\x0f\x1c\xe7\xe3\x3c\x9a\x96\x32\x8d\x8e\xe9\x52\x87\xb1\x98\xcd\x53\x2e\x76\x2b\x16\x45\xa9\x66\x45\x00\xb2\xfe\x71\x2e\xcb\x3c\xd2\x56\x2c\x8b\x8c\xca\x59\x34\x3e\x04\x9c\xa3\x39\xd0\x00\x83\x0c\x81\xb3\x28\x4e\xe6\x56\x7f\x93\x1b\x3d\xce\xe6\xc9\x44\x24\xa0\xb6\x00\xdc\xf3\xe5\x61\x40\x79\xeb\x28\x91\x71\xfa\x85\x79\x8e\xaa\xa5\x85\xf6\xde\x95\x89\x40\x62\x52\xfb\x38\xce\xb3\x74\x86\x19\x12\x9c\x14\x3c\x00\x6f\x86\x96\x1d\x65\xe0\x71\x76\x08\x71\xf3\xc9\x0f\x43\xd8\x5f\xb8\x8b\xaa\xbb\x47\xe0\xee\xd1\x47\x89\xb7\xab\x91\x84\xe5\x5e\xfb\xd9\x0e\x6c\x78\xf3\xfe\xe5\x7c\x2b\xe2\x49\x15\x96\x1a\xf8\x56\x98\xab\x5d\x00\xdd\x0a\x16\xae\xec\xf4\x87\x23\xa6\x3e\x69\x05\x1f\x92\xb2\x51\x9c\x2f\x84\xf4\x24\x0c\x27\xe2\x5c\x21\x24\xe6\x18\xf7\xd2\xda\x95\x83\xb5\x3f\xa0\xa9\xe8\x0c\x36\xbb\xc3\x8e\x40\x3e\x7a\x02\x42\x22\x30\xb2\xb3\x05\xc7\x20\x9c\x92\x1f\x82\x1f\x65\x88\xcb\xe8\x56\x28\x47\x83\xf6\x56\xe7\x7e\x7b\xf0\x39\xbc\xf4\xee\x0c\xda\x3d\xdd\x3b\x21\x6e\x85\xeb\x7e\xa6\xc4\x80\x44\x30\xa1\xaf\xed\x01\xbb\x73\x99\x5d\xca\x0d\xc0\xa4\xec\xc5\xbb\x55\x24\xa5\x25\x88\xcd\x72\xfc\x17\x29\xb5\x69\x07\x10\x44\x5b\xd9\xaa\x4d\x16\xf2\x28\x83\xa2\xac\xa8\x74\x15\x2c\xd0\x3b\xbd\x32\x8e\xca\x7c\x32\xcb\x9f\x0f\x0f\xcb\x19\x6e\x58\x93\x66\xb3\x2f\x09\x4c\x3c\x9d\xfe\x99\x64\x07\x59\xed\xd5\xfb\x2a\xc9\xd2\x03\xd2\xa2\xdf\x6c\x57\x02\x54\x9b\x6d\x79\x5f\x7f\xb9\x45\x94\xb9\x1e\x8d\x96\xff\x02\x7c\xbe\x79\xbc\x00\x3b\xcd\x7d\x7a\x3d\x4f\xe4\x9c\x7e\x18\xdd\x23\x85\x5b\x3d\x60\xe4\x2f\xc1\xdb\xb5\x5b\xa3\x3b\xe9\x43\xa6\xd8\x10\x5c\x46\xce\xd5\x80\xe2\xc5\xb8\xd7\x25\xc8\x88\x97\x3f\x23\xd4\xcb\xc3\x03\x66\xb2\x3b\x74\x2b\x5c\x0f\x5c\x6f\x64\x16\x2d\x96\x41\x0c\xe8\x76\xb3\x53\x25\x60\x6e\xf0\x2e\xe1\x60\x69\x7d\x7e\xfc\x2c\x54\xa5\x0e\x9e\xfc\x70\x74\x24\x85\xa5\xe7\x73\xb9\xdb\xd8\x91\xc4\xb2\x9f\x8a\x17\x89\xfb\xe2\x33\xa1\xdc\x6d\xc3\x39\xb8\xd3\x1d\x75\xef\x22\xbd\xa3\xf8\x0c\xc2\x4d\x1c\xe3\x21\x2d\xca\xb8\x04\x04\x33\x39\xac\xfa\xaa\x39\x20\x4e\x3b\x27\x14\x5a\xc5\x29\x09\xa7\x40\x25\x92\xe3\x3c\x2b\x8a\x35\x0c\x9c\x64\xa4\x68\xaf\x72\x13\x48\x89\x38\x08\xda\xc2\xe0\x9c\x87\x2a\xe1\x4a\x00\x82\xa7\xac\x62\xe2\x9e\xea\xcc\x2c\x83\x4b\xe5\x52\x6a\xc2\xe4\x41\xec\x2e\x9f\xe8\xbf\xb7\x04\xc7\xf9\x28\x9e\xe2\x4c\x28\x76\x74\xb5\x68\x11\x8e\xa6\xfa\xfb\x4a\x50\x0e\x75\x95\xea\x38\x53\x56\x7b\x07\x32\x1a\x6a\x1d\xb8\x67\xf0\x3c\x67\x18\x89\xee\x65\x82\x13\xf3\x74\x28\xfb\xcf\xf5\x3a\x83\xe1\xbd\xee\xae\x10\x4f\xd7\x11\xe1\x06\x58\xd4\x80\xde\x74\xe8\x68\xbc\x88\x60\x94\x4e\x00\x67\x0c\x04\x0a\x0d\xee\x3c\xd6\x91\x3b\x18\xa9\x22\x70\xc0\x1d\x2e\x48\x4a\x3f\xa9\xba\xc7\x3d\x44\x61\x35\x40\x19\xea\xed\xbd\xf4\xf9\x35\x10\x16\xc9\xbe\x2c\x05\xe7\x2f\x7d\x31\xb8\x54\x2e\x94\x43\x1f\x72\x9b\x7e\x71\x51\xd1\x72\xa0\xe3\xd5\xdf\x61\x90\x8e\x34\x2a\xa2\x79\x99\xcd\xa2\x92\x12\xa5\x85\x3b\x03\xae\xb2\xfb\x66\x5b\x6f\x7f\x80\x04\x63\xa1\x60\x02\xf1\xd2\x71\xae\x10\x22\x65\x41\x48\x1c\x1f\x6e\x7e\x75\x93\x19\x8c\xfd\x99\xc4\x00\xc3\x48\x4b\x81\x79\x3e\x3a\xb0\x32\x96\x21\xf5\xd4\x38\x1c\x89\x71\x07\x02\x45\xa7\xad\x83\xb4\x9f\x09\x3c\x48\xa8\x8c\xed\x6a\x08\xae\x47\xb7\x47\xa7\xc0\xfa\xd5\x70\x1d\xa4\x98\xb2\x69\xc3\xba\x6f\x58\x6e\xd5\x05\x8f\x55\x5a\xda\x5c\x84\x8b\x11\x15\xf3\xc9\x10\x4f\x0d\x64\x81\x39\xe8\x39\x83\x59\x43\x17\x79\x59\xc4\x74\x22\xcc\xf5\x3c\x9e\x73\x15\x1b\x9b\xa4\x15\x60\x87\x3e\x8e\xe2\x6c\x82\x18\xa5\x19\xc7\x48\xf7\xd5\x38\x9b\xc1\x81\x74\x82\x00\x17\x8a\x03\x66\xa9\x75\x17\x42\xef\xfc\x3b\x37\xe3\xcf\xdd\x0d\x44\xed\x82\xd3\x9d\x06\x7a\x08\xbc\xe2\x26\xe7\x21\x1b\x20\x83\x9d\xe9\xe3\xb4\x70\x23\x60\x47\x79\x34\x2e\xd1\x65\x71\x90\x16\x4e\xcb\xdc\xb8\x5d\x43\xf3\x78\xb3\xd4\xf0\x9b\xfb\xae\x51\x03\x69\x60\xff\x24\xb0\x69\x13\x2f\x66\x72\x88\x17\x0f\x14\xf9\x72\xf5\x46\x7e\x1c\x1f\xdb\x81\x30\xb1\xb6\xf5\xf5\x50\xde\xed\xf4\x3a\x83\xf6\x8e\x10\xeb\xeb\x78\xa7\x78\x50\xa4\xda\xf4\x02\x46\xe5\x38\x4a\x62\x92\xaa\x53\xe9\x34\xcb\xc7\xca\xc1\xcc\x58\x0f\x4e\x80\x76\x7e\xec\x06\x64\x23\x00\x76\x41\x83\xe1\x21\xe4\x9c\x99\xa7\x90\xbb\x36\xa5\x6c\xb5\xbe\x15\xf5\x33\x09\xe3\x72\x4e\x06\xdd\x50\xd4\xcc\x73\xbc\x65\xf1\x94\xa7\x04\x1a\xd5\x30\x42\xee\xb2\xcc\x28\xdb\x69\x3b\x89\xed\x03\xd5\xfe\x69\x96\xcf\x6c\xb9\xa2\xf6\xb9\x1d\x44\x57\xad\x92\x02\xd6\xa5\xb0\x0f\xc2\x81\xd1\xed\x71\xc6\x25\x84\xb1\xdd\xa0\x33\x88\x65\xb7\x20\xaa\x6d\xb8\xd2\x9c\x4b\x38\x57\x84\x02\x6b\xd5\x06\x1f\x0a\x3b\xb1\x9c\x21\x83\xfd\x42\x31\x43\xe7\x51\x3c\x76\x3b\x46\xd7\x1f\x7b\x86\x32\xbf\x91\xcb\x9f\x12\xa7\x07\xc2\x67\x45\xc1\x8c\x9e\xa9\xf2\x76\x2a\x57\xbd\xb3\x19\xba\x11\x25\x27\xd1\xa2\xa8\x94\xfc\x8a\xc2\xbf\x02\x97\x34\xca\x29\xdc\xe5\x2a\x51\x4e\x01\x78\x91\xef\x40\x50\x82\xe2\xbc\x1e\xc6\x85\x95\x55\x0c\x6a\x29\x76\x95\x60\x73\xc4\x12\xcb\x6f\xd5\xaf\x20\xaf\x74\xd4\x56\x30\x3b\x0d\x08\x45\x2f\x93\x50\x8c\x67\x29\xe2\x36\xdb\x35\xb0\xb1\x47\x13\xe7\xd4\x0f\xae\x87\xd7\xf4\x36\x8b\x21\xe0\x13\xcf\x8e\xb2\xc2\x06\x7a\xec\x7e\x5f\x7e\x1a\xf3\x26\x10\xde\xd2\xa8\x56\x20\x60\x49\xbb\xc7\x6d\x67\x42\xbc\x73\xac\x3d\x2f\xa3\x12\x24\xdf\xbe\x30\x9f\xc4\xe3\x38\x4a\x44\x96\x03\x58\x1c\x0e\x17\xa6\x88\x25\xd3\xca\x29\xab\x9b\x17\x25\x16\x9c\xb8\xed\xab\xed\x4e\xe1\xe3\xad\x6a\xd8\x48\xea\xb5\xa9\xa3\x36\xd1\x57\x32\x9d\x58\xcd\x0e\xb3\xed\x06\xfa\x0c\x48\x2b\x3c\x44\x42\x39\xc4\xc2\x32\xfd\x3d\x24\xbd\x5b\x86\x9a\xf6\x93\x64\x82\x5f\xe5\xd5\x2e\x5c\x0b\x6f\x40\x5b\x9a\x61\x7c\x20\xa8\xda\xc0\x41\xdd\x94\x88\x0d\x25\x09\x71\xf9\x29\x7d\x86\x5f\x51\x7a\x18\x47\xbf\x32\xd8\xa2\x58\xd6\x25\x9b\xc2\x4c\x16\x94\xc4\xa4\xb0\x93\x9b\xc5\xcc\xa6\x32\xcb\x27\xc0\xb4\x23\x8a\xe7\xf5\xd6\xc7\x5a\x24\xcc\xf8\x65\x4e\x91\x88\x8c\x4b\x5c\x8c\xd7\x6b\x18\xc4\x2a\x6e\x49\x9b\xfc\xbc\x86\x86\x25\xe5\x2d\x38\xb1\x0b\xb8\x16\x5b\xd0\x86\xc7\x4d\x8e\xce\x84\x8b\x8e\x68\xba\xf9\x66\x19\x62\x93\x52\xd8\x4d\x0b\x15\xe5\x36\x47\x2a\x30\x9f\x93\x4d\xf9\xfb\x51\x9e\x15\x7c\xde\xd9\x0e\x9f\x44\x40\x65\xe9\x40\xfe\x00\x7e\xf6\x85\xb9\x3e\xa3\xc1\x66\x89\x53\x81\x48\x43\xe6\xf0\xb6\x06\x7d\x28\xdb\x70\xef\x1a\x03\xdf\xd6\xf7\xc4\xc5\x91\x9e\x9d\x5c\x15\x59\x42\x35\xcb\xaa\x3c\x51\x2a\x15\x0d\x49\x63\xff\x2a\xae\x9b\x5b\xfa\xa2\x38\x4a\x22\xcc\x56\x98\x51\x14\xce\x28\xe2\x1d\x56\x7b\x30\x41\x6d\x00\x8b\x9c\x9a\xf5\x64\x22\x76\x5f\x98\xe7\x71\x31\x41\x58\x9c\xc8\xa6\xf8\x90\x63\x95\xce\xf5\x8b\x10\x14\x06\x39\x22\x84\x6a\xab\x09\xf0\x61\x8e\xb3\x79\x5e\x22\xf0\x1d\x5a\x63\x6a\xc4\x6d\x8e\x1b\x0e\x11\x51\xb3\xa1\x47\x18\x79\x4e\x38\x40\x69\x35\x35\xf5\x9a\xee\xd1\x76\xdd\xcc\xd2\x63\xed\x59\x62\x5d\xc0\x26\xa1\x51\x0a\xc1\x78\x32\x0f\x4f\x20\x87\x54\xee\x7c\x37\xcb\x26\x80\xb0\x20\x90\xbb\xc5\x7d\x4f\x70\x99\xde\x90\xcf\x41\x69\x81\x17\x2e\x4f\xb2\x71\xe4\xc8\x78\xc0\x3d\x4c\x55\x54\x9f\x9f\xab\x7d\x35\x0e\xe4\x66\x94\x46\x93\x28\x20\x3c\x21\x49\x30\x89\x71\x02\xab\x0b\x7a\xa3\x8a\x67\xa0\x6b\xae\x8d\x80\x83\x3e\x8d\xf3\x99\x71\x6f\x17\xf2\x30\x3a\x46\x04\x1d\x12\xf0\xd3\x2f\x9c\xa3\x0e\x2c\x39\x20\x17\xf5\xf3\x4e\x78\x4b\xe6\x7a\x6d\x43\x5b\x3b\xe9\x81\xbe\xae\x42\xb9\xa3\x0a\xf3\x5a\xc6\xed\x68\xdb\xaf\x10\xf4\x76\xdd\xcf\x2f\xce\x9f\x52\x09\x90\x12\xa4\x50\x9b\x77\xa0\xe4\x17\xe7\x4a\x02\x1c\x10\xb0\x67\xf4\xd5\x52\x2a\xbd\x44\xe6\x85\x44\x99\x63\x7a\xb7\xc0\x00\x3f\x94\xf9\xc4\x88\x59\x9b\xc4\xda\x9b\xd6\xe6\x40\x7a\x90\x44\x71\x81\x23\x7c\xd3\xbb\xfc\xe3\xc2\x75\xa6\x74\xaf\x90\xf9\xdb\xa9\x10\xa5\x00\xbd\x87\xcd\xd4\x87\xb5\xcb\x2f\x6e\x68\x55\xe7\x69\x99\x2f\x6c\xa8\xda\x4e\x23\x5d\xfc\x7e\xe1\xb5\x73\xa2\x2c\xcf\x8a\xe0\xfd\xc3\x22\xa8\x64\x75\x15\xf3\xdc\x04\x25\xec\x4b\x8c\x84\x14\xd1\x97\xcb\x5c\xad\xf1\x5f\x91\x4f\x4c\xf7\xa7\x82\x98\x3b\x8e\xb3\x24\xf2\x2a\x5f\xeb\x1d\x16\xde\xf9\x5d\x04\x2e\x5b\x22\x64\x29\x8d\xc5\x68\xa2\x01\xb0\x4a\x5c\x5d\x43\x1a\xff\x5b\xfe\x41\xac\x37\x3d\x47\x74\xe0\x16\x01\x56\x7a\x5b\x65\xc2\x07\x92\x67\xdf\x42\x06\xc7\xb1\x02\xe0\x08\xa0\x69\x44\xb0\x0a\x55\x6b\xfe\xc1\xf1\xa0\xfd\x4b\xfd\x13\x5e\xe9\x6f\x03\xf9\xdb\x5a\x9a\xad\x0d\xb6\x7b\x1f\x07\x07\xdc\xf9\xfc\x6f\xeb\x57\x37\x36\xaa\xfc\xdf\xd7\x6e\xdc\xfa\x94\xff\xed\x13\xf9\xe3\x2b\xfc\xfc\xd1\x24\x2a\x55\xf1\xc7\x81\xfc\x23\xfb\xf3\x7b\x20\x72\xfa\xc7\x72\xf5\x8f\xf6\x06\x3b\xff\x2f\x40\xe4\xfe\xb8\x15\xe2\x61\xb1\xad\xef\x04\xd6\x50\x15\xb1\x29\xa9\x71\xb9\x97\x86\xdd\x1d\x04\xdc\xc1\x87\x8d\xd3\xec\xf0\xc8\x31\x53\x97\x53\x70\x0e\x00\x32\xa2\xab\x0a\xb8\x14\x1c\x90\x28\x16\x41\x86\xa7\xae\xdc\x6e\x7f\x5e\x46\xe5\x33\x46\x3c\x1e\x4c\xd7\x22\x2c\xe2\x04\x74\xbd\xfb\xdb\x3b\x02\x9a\xb0\xdb\xe9\xc9\xed\x3e\xc4\xb1\x21\xd5\xe7\x51\xd9\xc9\x35\xb9\x71\x53\x6e\xab\xfd\x7c\xae\x0f\xcb\x8d\xab\x57\x6f\x09\xb1\x3b\xe8\xb4\xef\xdf\xd9\xe9\x20\x4f\xd4\x41\x16\x25\xe6\x42\xa9\x75\x48\xae\xf6\xb7\x77\x5a\xcc\xb4\x5a\x94\xf1\x0c\xf0\x66\x96\x42\xc1\xa5\x60\x13\x20\x25\x96\x24\xd1\x7e\x96\x23\x3b\xc6\x34\x43\x0b\x5d\x9f\x94\x58\xd0\xc5\xf4\x9e\x68\x38\xe8\x5b\x36\x57\x78\x1b\xa8\xe9\x34\xcb\xa9\xcc\x78\x1c\x4d\xd4\x2c\x1e\x0b\x2c\xc0\x05\xbf\xba\x84\x1c\x2d\x64\x72\x29\xd7\x4b\x02\xd9\x44\x36\x1a\x21\x13\x17\x24\x04\x74\x2f\xa6\x79\x34\x53\x40\x5f\xc3\xb7\xa3\xd0\xef\x2b\x58\x06\xa5\x38\x8c\x72\xe2\x5c\x89\x67\xfa\x21\x68\x44\xe8\x23\x9f\x71\x29\x36\x86\x5e\x10\xa9\x56\x7f\x7b\x47\x12\x34\xcb\x09\x45\x4f\x24\x3e\x19\x9d\x82\x79\xa1\x1d\xe6\xa2\x9c\x4f\xa0\x92\xd0\xf0\x97\x22\x0b\x9b\xeb\xd5\x33\x95\x5a\x61\x2a\x39\xd0\x0f\x23\x0a\xa3\x22\x4b\xd8\x59\x98\x15\x2a\x39\x56\x05\x1a\x8b\xf0\xb2\x0a\x54\x59\x54\x29\x49\x02\xa0\xc1\xdb\x57\x72\x7f\x9e\x4e\x12\xdd\x10\x35\xdb\x57\x13\xa8\x25\xf6\x5a\x61\xa4\xc9\xf5\xdb\xe0\xa2\x83\x12\x15\x87\x2e\xcf\x4d\xbe\xa0\xc9\x8f\xca\x55\x98\xb8\xe1\xd6\x32\xb0\xba\xda\x10\x80\xd5\xd3\x00\x41\x24\xd0\xfc\xbe\x08\xe4\x21\xc7\xf5\xc6\x51\x4a\x52\x9a\x86\xfd\x86\xc2\x5e\x36\xe3\xb7\x38\x02\xe3\x3e\x71\x0d\x67\xa7\xf2\x02\x8c\x17\x33\x11\x94\xfa\x71\xdc\xa3\xa4\x92\xe4\x14\x1e\x7e\x9a\x0d\x3b\xc2\x9a\x4d\x08\xf9\x51\x9a\xb6\x67\x4c\x40\xe5\x74\x20\x14\xc2\x23\x40\x5b\xf1\x0e\x8e\x15\x99\xab\xa9\xca\x0d\x6f\x48\xa1\xc0\x93\x44\x0d\x4a\x97\xe4\x07\x11\x53\xfe\xc1\xb4\x5a\xb4\x44\x43\xe3\x01\xf4\x91\xa8\x28\x4f\x16\x90\x8d\x04\xbe\x63\xb0\xa2\xe8\xe8\xd2\xab\x9b\x51\x6d\xe4\x3c\xc3\x0b\x03\xb1\x3f\x8f\x93\x89\xa4\x73\x44\xd6\x18\x83\x42\x21\x56\x8c\x28\x19\xf4\xa3\x17\xcd\xbc\x3e\x80\xe1\x05\x73\x4e\xda\x3f\xf6\xe5\x0e\x08\xd7\xe6\xe6\x0c\x90\x6e\xb5\x68\xe9\xa7\x9b\x7c\x06\x1d\x50\xd5\xf1\xe1\x8c\x2c\x5a\x86\xde\x50\x82\x51\x9a\xa5\x58\xe0\x56\x88\xc6\x6a\x85\xda\xf8\xe9\x77\xde\xe7\xdd\xd7\xf0\x4e\x98\x76\xbb\x5a\x39\x81\x13\x4d\x10\x83\xc7\x1a\x00\x50\xd1\x92\xe5\xa2\x98\xef\xa3\xe5\xa8\x7f\xfb\x7f\x5e\xfc\x26\x9f\x16\x04\x36\x45\x3d\x2f\xfd\x73\x27\xa8\xe4\x34\x9b\x4f\x58\x96\x6f\x33\xec\x20\xfb\x84\x54\x84\xc2\x08\x28\xfe\x2e\x08\xb7\xcd\xb4\xdb\xfa\x7b\xfe\x70\x80\x37\x9e\xaa\x13\x17\x3f\xa2\xbb\x4b\xd2\x69\xb5\x4e\x02\xc1\x61\x1e\x48\xa5\x5f\xa3\xf4\xdf\x08\xe4\x33\xd3\x7f\x2f\xd5\xf8\x30\x05\x44\xca\x49\x1e\xeb\x79\xcc\x72\x4f\x70\x09\xc0\xc4\x86\x51\xd2\x86\x71\xbd\x36\x85\x42\x00\xa2\x04\x04\xad\xe4\xbf\x72\x90\x5e\x1e\xbf\x72\x03\xcf\x39\x33\x28\x72\xad\x22\xb5\x9a\x33\xaa\x00\x47\xa6\x34\x6a\x76\xb4\xe0\x6a\x09\xef\xe5\x81\x21\x69\xd7\xe7\xee\x82\xb9\xda\x67\x0a\x1e\x08\x27\x1f\x9d\xc4\x0b\xff\xf8\xc3\x3a\x6d\xe0\xe8\xf1\x0e\xea\x79\x6a\xfe\x49\xa0\xef\xe6\xd7\xfa\x81\x59\xd1\x24\xce\xfc\x8c\x10\xeb\x2d\x4f\xad\xcb\x9f\x4b\x96\xed\x22\xac\x70\x9c\x4e\xe2\xe3\x78\x42\xe5\x55\xb4\x7a\x00\xc6\x69\x96\x4e\x96\xcb\xea\xba\x2e\x02\x73\xaf\xd1\xad\x61\x0a\xf2\x36\x5a\x36\x93\xd8\xf4\xcd\xc6\x9e\xf1\xd3\xcc\xed\xe1\xdf\x5c\xd5\x3b\x43\xba\x77\x46\x95\xb9\xde\xd6\xea\x52\xc6\x0e\x2f\xcf\x65\x64\xf6\xcc\x49\xef\x9e\xf3\xda\x71\xc3\xeb\xcc\xc4\x0f\x69\x3c\x23\x50\xfc\x4d\x27\x6b\x50\x92\x2d\x4c\x4d\x87\xbe\x5c\xe6\xb3\x28\x5d\xcb\x55\x34\x01\xbb\xea\x50\x45\x13\x52\x02\x63\x76\x18\x87\x1f\x96\x60\x5f\xe6\xe3\x62\xa6\xca\x68\x12\x95\x91\x9c\xc6\x2a\x99\xd8\xc8\x8e\x7e\x81\xe5\xdd\x26\x41\x61\xf7\x06\xcf\x0a\xc5\xdf\xc1\x36\x0b\x15\x15\x71\xb2\x90\xc7\xb1\x3a\xb1\x07\xd6\xbc\x80\xc2\xeb\x6b\x2d\xd9\xcb\x6a\x93\xb2\x7c\x4e\x18\x64\x53\x3f\xaa\xf1\xc6\x00\xde\x51\xf5\xc2\x51\x12\x8f\xe3\xb2\x49\x4a\x3a\xf6\xca\x69\xca\x1a\x2f\xbd\x39\x48\x05\x1e\xa4\x74\xaf\x38\xde\x39\x56\x37\x53\x90\xc7\x44\xcf\x88\xce\x1d\x6c\x3a\xe4\x7c\x2f\x38\x92\x02\x15\x80\xa6\xd3\xfa\xd6\xbc\xde\x32\x9a\xda\xab\x45\xcb\xa2\xd6\x6b\x67\x38\x5d\xbb\x24\x07\xe7\x7c\xd6\x37\xd1\x6d\x26\xcc\x11\xb8\x23\xd0\x4b\xe0\x02\x61\xa2\xc9\xb1\xca\xcb\x98\x80\x37\xd5\x61\x67\x22\x1e\xc8\xf0\x8f\xdd\x1a\x27\xe5\x69\xe4\x5e\xd0\x66\x06\xa3\x9b\x46\x0b\x26\x49\x42\x0b\xe2\x9c\xe9\x09\x85\xb8\x81\x63\x53\x39\x68\xcc\x71\x04\xe9\x41\xab\x95\xdd\x70\x09\x05\x1c\xdd\xf6\xee\x49\x23\xbf\x57\xb7\x2a\x02\x1b\xa1\xa7\x21\xac\xd1\xcd\x3a\x74\x35\xbf\xa7\xfd\x65\xb3\xd8\x97\xb5\xbf\xaa\xd7\x8c\x97\xab\xf7\x3c\x2c\x48\x70\xeb\xa7\xcf\x89\x73\xed\x38\x8b\x27\x54\x6f\xc1\x13\xc6\x4a\xf3\x9e\x76\xbe\x6e\xce\x4c\xe9\x2b\xd4\x62\x2e\x85\x00\xc8\xb1\x76\xad\x1a\xa5\xf6\x48\x5c\x2f\x60\xc0\xa2\x81\x89\x4b\x02\xf3\x7d\xae\xdb\xdb\x32\x10\x70\xe1\x42\xc0\x2d\xc2\xb0\xae\x2d\x47\x80\xc2\x73\xe4\xf5\x82\x4b\x88\x7e\xf7\xb6\x64\xaf\xdf\x73\x71\xe1\xfa\x41\x9b\xfd\xdd\x07\x00\x31\x0c\x08\xfc\x14\x08\x03\x0e\x0c\x0c\xc4\x11\x51\x88\x4b\x04\xf9\xec\x33\xe4\xbd\xfe\xce\x56\xc7\xd1\xe1\x13\x8c\x0b\x85\x01\x0c\x0c\xb6\xd3\x3c\xd7\x01\x5b\xda\x11\xd0\x5f\xa0\x64\xb9\xa3\x1f\xde\x2c\x2f\xbe\x0c\x3e\xea\xa9\xd8\xb5\x7b\xb2\xbd\xc9\x98\x4b\xab\xd1\x0d\xd8\x4e\x0f\x71\x6f\x74\xea\xb6\x07\xfd\xfb\x41\x03\x80\xb3\xdb\x63\xc4\xeb\xa8\x0f\x3f\xe3\x05\x21\xcc\x82\xe8\x0f\xe0\xdb\xd4\xc1\xad\x4e\x7b\xa7\xdb\xbb\x3b\x44\xf8\x6d\x65\xf1\x7c\x1a\x1b\xfc\x04\xff\x84\x57\xda\xbb\xc3\x9d\xb5\x8d\xf0\xea\xc7\x27\x00\x75\x81\xfe\xc3\xad\xab\x35\xfd\x87\x8d\x9b\x9f\xea\xff\x7d\x32\x7f\xda\xbb\xbb\x3b\x1d\xb9\xbb\x77\x67\xa7\xbb\x29\x7d\xdd\x04\x1b\x20\xdb\x08\xaf\xca\x35\xd9\x9e\x1f\xe8\x9b\xef\x26\xe8\x42\x5d\x93\xbb\xa8\x6b\x93\x03\x9c\xdf\xcb\x1c\x44\xb9\x9a\xce\x93\x44\xdb\xc5\xd3\x2c\x57\x72\x92\x9d\xa4\x49\x16\x69\xab\x49\x78\x32\x50\xa1\xbc\xb3\x70\x7f\x0b\x77\x76\x61\x24\xa5\xad\x9d\xcc\x02\x75\x90\x7d\x20\x6c\xb2\x36\xba\xb3\x79\x7a\x01\x61\x72\x45\xbb\x2e\xcb\x39\x82\x02\x8f\x62\x77\x64\x09\xb0\xe7\x08\xbb\x48\xdf\xe5\x86\x4a\xaa\xb5\x28\x0f\x3d\x6d\x9c\xf6\xd1\x51\xa2\x64\x2f\x2b\xd5\x33\xb2\x9b\xca\xcf\x46\xa9\x09\x25\x06\x12\x7f\x89\x85\x76\xa8\x7c\x35\xce\xf2\xa3\x0c\x48\xbf\xc1\x08\x04\xb8\xde\x0a\x7c\xcc\x48\x42\x60\xb5\xf3\x8a\x6e\x24\xfe\x86\xfe\x0d\x57\x39\x3e\xcb\x56\xa3\xe6\x6a\x9a\xa8\x71\xc9\x41\x53\xaa\x7a\x61\x13\x75\xa1\xa2\xbc\x90\xf3\xa3\x49\xe4\x28\x4c\x91\x9d\xc2\x45\x85\x90\x5f\x84\x67\xb1\x3c\x00\xd8\x66\xbb\xc3\x1d\xbd\x00\x50\xaf\x9b\x54\x0d\x6f\xcb\x2d\x35\x8d\x53\x34\x0c\x42\x3f\x71\xe4\xd8\xbb\x04\xe5\x62\x06\x6c\x7c\xdd\x49\x96\x3f\x2f\x30\x0b\x67\x3b\x25\x57\xb1\x87\x2b\x2d\x89\x85\xc2\x86\x12\xd8\xe1\xb2\x01\x7e\x37\x28\x34\x61\xf7\x28\x62\xbe\x3a\x48\x6f\xc3\x52\xc0\x67\x72\xd9\x27\x90\x41\x13\xd8\x8a\x9b\x71\x42\xb4\x26\x36\xce\x02\x6a\xe1\x08\xf8\x44\xaa\x3a\xc1\x7c\x80\x7e\x1a\xb2\xbe\xcc\xf0\x6d\xa4\xf1\xe8\x4b\xa5\x18\x45\x2a\xbd\x7b\x56\x57\xe8\xa7\x20\x41\x62\x59\x4d\xdd\xf5\xf6\x0c\x0a\x03\xc0\x40\x50\x09\x12\xd2\x77\x92\x14\xfe\x0a\x50\x4a\x3f\x53\x93\x09\x40\xce\x3b\xea\x37\xba\x8c\xe0\xb8\x64\xb9\x30\xf5\x53\x01\x90\x9f\x32\x0b\xdc\xd4\x70\x85\x1b\x3e\x70\xaa\x38\x70\x8a\xb2\xc7\x48\x35\x10\x40\xfd\x21\xf0\x86\x02\xe4\xde\x4a\x40\xe0\x1b\x01\x3f\x83\xdc\xa8\x40\x7e\x7e\xac\xf2\x6a\xca\xaf\x82\x3f\x55\xc2\x1b\x78\x5c\x8d\xe0\x2a\x9d\xc3\x1b\x0c\x31\x0b\xc3\x30\xcd\xb1\xd8\x8a\x28\x9a\xf7\x5c\x93\x07\x75\x89\x1a\x6e\xbb\x65\x9c\x95\x11\x7c\x80\x87\x8c\x70\x06\x50\x7e\x14\x03\x28\x60\x00\x65\x7d\x00\xe1\x85\x17\x0f\x5f\x9c\xea\x4f\xe6\xbe\xa6\x5b\x20\xca\xe8\x79\xe5\xd0\xb2\xc7\xa9\xc7\x4c\x8b\x8a\xad\xee\x78\x10\x93\xff\x8a\x83\x50\x5b\xb1\x24\xe5\x4b\xe8\xfb\xd1\xc9\x60\xcc\xad\x25\x29\x47\x52\x14\x93\x92\xc8\xa6\x7e\xeb\x88\xde\x7f\x65\x53\xf7\x07\x88\x46\xf4\x06\x6b\xa0\x53\xc7\x05\xe0\xf7\x8c\x03\x82\x2e\xdf\xb2\x3f\xb3\x0c\x59\xad\x7c\x8f\x15\x2a\x30\xf6\x7e\x84\x45\x2b\x35\xde\x7d\x22\xf1\x5f\xe9\xbc\x00\x40\x10\x7d\x4f\x6d\xa9\xa3\x24\x5b\x50\x03\x71\x83\x41\x06\x66\xdf\xf8\x7d\x0e\x7a\xcf\x65\x48\x05\x56\x03\xe9\xf6\xd2\xa1\x51\x90\xcb\x8a\x9e\xf1\x64\xf4\x11\x7c\xe2\x41\x36\xbf\xcd\x3d\xd0\xeb\x93\xca\x5e\xdc\x67\x07\x76\xb6\x97\xf3\x16\x11\xde\xe8\x24\x5a\xf8\x49\x1f\x2a\xcd\xb9\xa0\x6a\x72\xa2\x92\x18\x99\x73\xa6\x30\xe1\xc0\xd0\xc8\x42\x6a\x80\x65\xcc\xb3\xd4\x26\x98\xc6\xce\x62\x8b\xe4\x38\x41\x10\x98\x85\x25\x3e\xc8\xe6\x24\x59\xb0\xe2\x34\x72\xc5\x57\x4d\xe0\x33\x9d\x64\x13\xbc\xd1\xfc\x28\x75\x13\x6e\xca\x15\x6f\xc1\x60\x33\x3c\xfe\x1a\x27\x98\x9d\xa5\x70\x27\x9b\x55\x45\xf7\x6d\x99\x05\x82\x50\x0d\x45\x09\x65\xa3\x1c\xe2\x2b\xf3\xf9\xb8\x74\xaa\x1e\x2b\x6b\x1c\xef\x42\x75\x1c\x67\xf3\xa2\xb6\x95\xeb\xb4\xd2\xcd\x0b\x7e\xc9\x03\x9c\x95\x2f\xce\x5b\xf9\xc8\x59\x88\x1c\xae\x4e\x66\x05\x29\xbe\x54\x4e\xd1\x5b\x8a\x0a\x46\xc2\x7d\x89\x8c\x69\x63\x54\x86\x0b\xe4\x0b\xdc\x01\x33\x31\x20\x4b\x63\x0f\xa0\x47\xba\x04\x30\x72\x66\x67\xd8\x5b\xf3\x88\x58\x39\x41\xee\x03\x87\x50\xcd\x25\xb9\x92\xd9\x54\x8c\x99\xfa\x85\x6f\x75\x93\x41\x29\xf8\x1c\x65\x03\x41\x0f\x1a\x6d\x14\xf7\xb5\xb0\x20\x6e\xd5\x4c\x00\xab\xc3\x03\x99\x6b\xbc\xcf\x37\x49\x90\x3a\x6a\xb6\x65\x64\x54\x08\xd6\xb4\x80\x64\x93\xc7\xe3\x68\x2c\x92\xf3\x0b\x98\xed\xeb\x84\x79\x5d\xba\x20\x83\x0d\x8e\xdf\xf9\xd1\x41\x1e\x4d\xd0\xae\x72\x2d\x9a\xc2\x72\xad\xd7\x5e\x2d\x96\xbf\xda\xa8\x9e\x1a\x03\xd2\x22\xdf\x58\xf5\xd2\x31\xa8\x04\xe7\xaf\xe8\xda\xc4\x18\x31\x4c\x14\xc5\xf8\xe0\xb7\xba\x1d\xf6\x8a\x85\x4a\x64\x87\x6c\x04\xe5\x41\x21\x9f\xcb\xbc\x9d\xee\x10\x43\x46\xfa\xc3\x0c\x24\x2a\x6f\xac\x38\xcf\x72\xef\x1a\x88\x6e\x4b\x13\xdd\x76\xc4\x24\x1b\x2d\x53\xb4\xfc\x74\x6f\xe3\x92\xbf\xc0\xa4\x3e\xbe\x3a\x25\x50\x96\x7b\xe9\x65\x4c\x8e\x80\x82\x4f\x5c\xf2\x8a\x2f\xb4\x1f\x31\xc7\xa5\xe8\x14\xbb\x43\x2d\xd3\x34\x02\x6d\x36\x36\xa5\x79\xeb\x71\xee\x91\x02\xb4\x82\x4b\xae\x71\x00\xa9\xa6\x0e\xea\xa1\x8a\x32\x4a\x2c\x48\xcc\x63\xa2\x90\xab\xce\xd8\xb7\x60\xc1\x3f\x2d\x57\x1e\x64\xf3\x15\xdd\x63\xfd\x17\xe7\xfe\x77\xb3\x29\x80\xe9\x45\xec\x2c\x99\x02\x0e\xe9\x37\x55\xb1\x36\xc8\xad\x81\x56\x86\xf3\x35\xc0\x1e\x54\xdf\x67\xd8\xe1\xf4\x68\x50\x01\xa0\xb5\xe9\xf3\x2c\x29\x02\x84\x7f\xc0\x3f\x12\x58\x81\x08\x91\xe3\xda\x15\x7d\xf3\x64\xa9\xa9\x42\xd7\x97\x41\xa0\xef\x19\xd2\xac\x12\x2b\xf4\x9b\xea\x66\x3e\xca\x4e\xb4\x47\x85\xb7\xb0\x7b\x23\xc3\x7d\x6c\xd9\x5b\xf0\x87\x60\x76\xe8\x79\x4f\x23\x4b\x9c\x0e\x2b\x16\x1b\x6d\x18\x76\x90\x9b\x11\xa1\x93\x9e\x69\x00\xad\xd6\xbb\xc0\xd0\x77\x08\x38\x5b\xa7\x25\xd8\x5a\x63\xfd\xcc\xd5\x1b\x57\xff\xff\x2d\xe4\x04\xb2\xf7\x46\x36\x2f\x8d\x28\x03\x60\x2f\x30\xcb\xa9\x52\x35\x05\x98\xbc\xff\x40\xa7\x4d\xc0\x79\x8e\x8a\xbd\xc0\xfa\xbb\x57\xa8\xe2\xb6\xdc\xb4\x01\xdc\x7f\x25\x07\x0e\x74\x30\x6c\x16\x13\xf1\x59\x9f\x45\xcd\x27\xc6\x4d\xe8\x0b\x8a\xc0\xf0\x1b\xce\x64\x99\xa5\xb6\x86\x11\x6c\xdc\x31\xe6\x0a\xaa\x55\x47\xc6\xa1\x6e\xba\x2e\x11\x39\xb3\x56\x57\x1f\xa9\xa8\x94\x08\x63\xa3\xf9\xde\x43\x36\xc5\xa6\x3e\x85\x4e\x5a\x93\x43\xe5\xfb\xc8\x85\x00\xeb\x9b\x4f\xe3\x4a\x7b\x50\x96\xce\x43\xf1\x3e\x83\x3a\x3c\x7b\x36\x03\x0a\x37\x0b\x74\x99\x32\x50\x8e\xcb\x12\x38\x72\x37\xac\x72\x13\xa7\x6c\x82\xba\xe5\x21\x94\x40\x03\x9b\x3f\xcb\x0f\xa2\x94\x70\x9a\x78\x68\xd7\xcc\x56\xed\x67\xee\x47\x65\x3c\x0b\x9c\x7c\x87\xf0\x93\xb1\x95\xce\x10\x7a\x95\x69\xf8\xb2\x1c\x86\xd4\xe5\x67\x44\xfa\xec\xc2\x66\x28\x59\x5f\x0b\x93\x94\x70\xf0\xa4\x63\xed\xb2\xea\xfd\x05\x3d\x9e\x17\x25\xcb\x0c\x23\x82\x87\x7d\x35\x9f\x13\xac\x66\xdb\xf8\x58\x08\x5b\xa7\xdc\x48\x78\x85\x15\x72\xe0\x86\x41\x8a\x72\xca\x5e\x28\x43\x82\x8c\x1a\x77\x83\x9f\xa9\xbf\xfd\xbc\x52\x47\x7a\xdc\xf5\x76\xa5\x54\x18\x3c\x99\xee\xb5\x6a\xd3\x80\x6c\x6a\xaa\xf2\x2a\x1a\x9d\xc8\x98\xf5\xfe\x36\x9d\xb7\x1c\x49\x8d\xfc\xcc\x48\xc7\x0c\xc6\x35\xff\xde\xb9\xb1\x44\xc5\x40\xa9\xe3\x4e\xe0\x45\xbe\x1f\x52\x5b\x0b\xa8\xf9\xcc\x0b\x10\x02\x5e\x20\xaf\x43\x18\x63\xca\xe6\x91\x89\x9c\xd6\xaf\x60\x16\xee\xc0\xaf\x70\x2a\x53\x54\x6b\x46\xb1\x38\x8e\x0b\x0c\x9f\xe2\xd2\x07\x57\xf0\xc1\xea\x74\x98\xf3\xc8\xaf\x7f\xbe\x49\x8a\x46\xf7\x9b\x37\x0f\x15\x2f\xd5\x86\x64\xd9\xa6\x12\x0d\x9b\x4a\x7e\xf8\x4d\x25\xea\x1e\x37\x49\x7e\xb9\xee\xd8\xe5\xf7\x91\xf0\x33\xfd\xd5\x7d\x84\xc7\x64\x52\x64\x72\xa6\x54\xe9\x14\x4d\x15\xca\x07\x48\x78\xbb\xad\x88\xca\xb8\x98\x2e\xe0\xe3\x64\x75\x3b\x55\xb1\xae\x02\x55\xb5\x3a\x4b\x6f\x8e\x8a\x75\x8b\x39\x5a\xc7\x30\xaf\xac\xee\xc9\x1c\x2b\x2f\x6a\x07\x6d\x5c\x5a\x3a\x8c\x28\xd1\x76\xd6\x02\x25\x7c\xd0\x91\xa7\x00\x5d\x9c\xca\xce\x0b\x48\xff\xdc\x36\xdd\x47\x3b\x7f\xda\x68\x6c\x27\x49\x53\xd4\x03\xd6\xb7\xbd\xac\xcd\xc9\x8b\xf0\x02\xb8\xc8\xf3\x7c\x51\xd3\xb3\x28\xa4\xa7\x41\xf1\x00\xe4\x46\x21\x16\x0b\xbe\x17\x81\x13\x96\x52\xa3\xf1\x6e\x1f\xb7\x64\x77\x0a\xdf\xae\x9f\xc2\x4d\x8d\x35\x83\x07\x61\x82\xca\x6e\x37\x3d\xac\x3d\x4b\x4d\x2a\x2b\x8f\x21\x1c\x96\x3c\x31\x23\xfc\x44\x99\x09\x20\x8a\xd4\x6f\x82\xf8\x6d\xd3\xc3\x9a\x9a\xa6\x1d\xeb\x5a\x88\x35\xac\x2e\x8a\x4b\xb6\x8f\x8b\xc4\x7c\x48\xa2\x53\x32\xbb\x54\xda\xa4\xea\x03\x79\xea\x5c\xce\xf7\x84\x5b\x29\xc7\xb0\xe0\x29\x06\x42\x18\x51\xb2\x68\x9c\x97\xea\xba\xd6\x66\x5d\x79\xa2\x92\x63\x25\x57\xd7\x37\x5a\x72\x96\xa5\xe5\x61\x61\x5d\x57\x9e\x7d\x30\xc9\xa3\xc4\x3c\x91\x9e\x87\x14\x4f\x60\xb2\xea\xb3\x1c\x30\xcf\x59\x7a\xa0\x72\x3c\xba\x8a\xc3\x6c\x9e\x4c\xb4\x9f\x3e\x55\x39\x50\x4f\x56\xea\x3e\xcf\x1f\x60\xb1\x6c\x01\x98\xc8\x0b\x74\x6d\x55\x85\x07\xa1\x35\x9f\x48\xfe\xf4\x44\xed\xcb\x22\x2e\xc1\xd6\xdf\x08\xaf\xc9\xad\x4a\x29\x79\xc7\xba\x06\x0c\x69\xf2\xab\x5d\x65\xbc\x64\x71\x0b\xef\x18\x5e\xad\xc5\x26\xae\x64\x95\xf5\xd5\xaa\x88\xa6\x04\x2e\x43\x1e\x7a\x60\x69\xb2\x08\x9a\xee\xce\xea\xd6\x0d\xce\x91\x9e\x11\x28\x3d\xd3\x2c\x3b\xe3\x6f\xf9\x0b\x4e\x3b\xe1\xe9\x4a\x5c\x20\x1c\x2c\x2f\x54\xa0\x11\x56\x4c\xa2\x7a\xc7\x92\x32\xd1\x08\xd8\x81\x76\x81\x1d\x08\xad\x51\x5c\x40\xd6\x0b\x77\x71\x35\x10\xff\xc1\x84\x95\x2b\xad\x25\x6c\x08\xfe\x32\x22\x5b\x74\x70\xc7\x79\x53\x78\x54\x34\x8c\x4a\x83\x00\xd7\xf9\xea\x5a\x18\x2b\xa0\x18\x6c\xa3\xcc\x96\xf7\xf8\x9a\xd6\x16\x15\x13\x79\x5a\x5b\xe2\xf2\x5a\x5b\xe4\x07\xc9\xe5\xc3\x22\xd8\x7a\xac\x4b\x6d\xe9\xd1\x6f\x14\xd9\xaa\xbd\x00\xa5\xb5\xc4\x65\xa5\xb5\xe4\x25\xa4\xb5\xc4\xa5\xa4\xb5\x64\x83\xb4\x16\x9c\xfc\xae\x9e\x96\x38\x57\x4e\x4b\x3e\x99\x9c\x96\x20\x39\x2d\x70\xee\xd5\x0b\xd1\xec\x28\x61\xd2\x77\x97\xdf\xca\x50\xfe\x98\x02\x0e\x97\xa9\x1a\x0a\x01\xc0\x2a\xad\x8b\x2c\xf9\x06\x15\x66\xdc\xe0\x50\xac\x77\x80\x12\x2a\x28\x29\x68\x91\x4c\x98\x62\xae\x92\x0e\x56\x82\x7d\xd7\x42\x7c\xea\x5d\xd8\x15\x70\xec\x81\xae\xcd\xc4\xf2\xe4\x05\x2c\x2b\xeb\x2b\x9e\x05\xfe\x16\xa2\x19\x10\xb4\x60\x9a\x42\x6b\xce\x8c\x90\xde\x57\xd6\x9c\x61\xc1\xd2\xc3\x38\x3d\x10\x6e\x2a\xab\x1a\x21\x6d\xe4\xec\xa8\x2a\x75\x7a\x0e\xb2\xb6\x85\x8f\x94\x9e\xd6\xc0\x95\xf7\xb4\x28\x36\x7c\x22\x0c\xc8\xb9\xbe\xf1\x25\xf6\xdf\xaa\x13\xed\xc7\x55\x80\x11\x8f\x89\x49\x19\x71\x18\x07\xa2\x04\xa2\x96\xca\x6b\xf2\x8b\x19\x80\xbc\x24\x03\xe3\x5b\xec\x62\xa9\x01\x66\x94\x85\xa3\x99\x92\xc5\x38\x3b\xa2\x33\x01\xed\xd6\xa8\x30\x01\x02\x43\x7d\xd2\xc0\x91\xae\xbf\x61\x18\x91\x42\x21\xae\x87\x6e\xbe\xa5\xb0\x1e\xcb\xc5\xca\x1d\xde\xac\x42\x05\x09\x25\xe0\x9f\x28\x97\xd1\x24\xc4\x82\xaf\x14\xe7\x0a\x76\x58\x49\x4a\xf6\x3a\xaa\x06\x2a\x69\x75\xf8\x32\x1d\xd5\x08\xd0\x12\x99\x8e\x6a\xd6\x06\x16\x3c\x5e\x2d\x4e\xe2\xed\x46\x28\x77\x1c\x6a\x85\x2c\xe5\x45\x67\x82\x88\x1d\xe3\x38\xda\x9b\x10\xa2\xfb\xbe\xd0\x23\xc8\x3c\xb2\x8e\x14\x3c\x81\xd3\xb4\xac\x52\x86\x2e\x2f\x8a\x94\xe9\x26\x3b\x58\x5e\x1b\xc2\x8a\xd3\xd0\x5f\x32\x0c\xd8\x76\xa7\x18\x66\x97\x86\xc4\x55\x3a\xf0\x0f\x3d\x32\x21\xf1\xd9\x58\x46\x85\x7f\xd7\xdf\xc6\x73\x80\x84\x02\x2b\xe4\x4f\xa1\x10\x37\x43\xd9\xb6\xcf\x1d\xe9\x59\x77\xd6\x95\xa1\x86\x02\x5f\xde\xd4\x73\x91\xdc\x4d\xc4\xc2\x48\x01\xab\x85\x2c\x02\x41\xc5\x63\x01\x0b\x62\x20\xcb\x8d\xbd\xee\x5c\x4a\x20\xea\x31\xe5\x5a\x70\x57\x5b\xcd\x2f\x2b\xb6\x8a\x1b\x88\xb6\x54\x55\x45\x17\x07\x53\xae\xae\x54\xfb\xb1\x02\x99\x4c\xcc\x5a\x0a\x08\x73\xe6\x0e\x33\x51\x25\x29\x63\xe9\x8b\xb8\xf3\x93\x4c\x16\x19\x82\x03\x32\xf6\xde\x4f\x98\xbc\x4b\xd0\x81\x0d\x3f\x6e\xb8\xf5\x02\x23\x3c\xe6\xf1\x7d\xe1\xb4\xd4\x8d\x94\x50\x98\xed\xe0\xa8\x07\x9a\xe6\x3e\x55\x38\xc5\xcf\xa6\xc8\x0b\x36\x54\xb5\xd3\x55\x59\x34\xf4\xee\xb3\x94\x62\x50\xee\x95\xcd\x28\x24\xa3\x5c\x12\xb8\x7a\x26\x87\x59\x32\xe1\x04\x8c\x3e\xb9\x20\x7a\xe4\x4b\x4c\xe4\xb3\xc4\x28\xe0\x79\x26\x4d\x9c\x8e\xe7\x79\x6e\x80\x07\xac\x30\x5a\x14\x2a\x87\xca\x04\xe2\xe4\x33\xa3\x51\x53\x60\xd9\x5f\x10\xcd\x14\x1b\x59\x8d\x7d\x05\xfe\xc3\x5a\x8d\x84\xd9\xcf\x76\x0f\x30\xef\x10\xf0\x0b\xd9\x72\x3a\x97\x86\xa8\x76\xd6\xa0\x57\x56\x27\x1c\x62\x2a\x9e\x27\x64\x17\xea\xa7\xe3\x6a\x88\xcf\xa4\xbf\x0c\x87\x8f\x51\xe6\x70\xe4\x04\x19\xca\x53\x8b\x86\x9b\x4d\x4a\x7c\x57\x9c\xb6\x8f\xcb\x66\x27\x22\x2a\x2d\x8b\x0f\x7f\x17\xe2\x3e\x76\x97\xcf\x99\xfc\xcd\x6f\x68\xc3\xe3\x70\x4e\x98\x22\x54\x78\xfc\x44\xce\x20\xda\x9e\xf1\xd9\x07\xa4\x29\x15\x06\x21\x3a\x14\x31\x90\x2a\xea\x24\x42\x26\x3f\x60\x0d\x86\x32\xf3\x8f\x7d\x83\x48\xaf\x27\x87\x84\xf8\x8c\xc7\x10\x2e\xfb\x03\x39\xdc\xdb\xdd\xed\x0f\x46\x88\x8f\xf7\x1e\xc4\x23\x4a\x9c\x94\x58\x31\x86\x18\x17\x3d\x29\xe2\x28\x57\x6b\x14\x6b\xd0\xc6\x4c\x09\x84\x18\x01\xc6\xdf\x4a\x89\xd8\x43\xfc\x21\x95\x56\x9e\xfb\x0a\x81\x5c\xd0\x9c\x39\xd6\xfe\x3b\x46\x98\x88\x33\xae\xa8\x33\x3f\x43\x19\x00\x16\xfe\xc4\xc8\x09\xa7\x20\x22\x2b\x6c\xab\xa3\xf1\x78\x9e\x47\xe3\x58\x3d\x89\x63\x47\x94\x33\x7a\x06\x7c\xc3\xb8\xf9\x46\x85\x5c\x19\xc6\xb3\xe8\x00\x44\x12\x0a\x60\x6a\xc8\xe3\xe2\xf9\x50\x8e\xee\x75\xc4\x66\xff\xd9\xce\xa0\xb3\x25\x37\xfb\x5b\x8d\xc8\x7c\x40\xc1\x57\xc1\xf9\x81\xdc\xdb\xbd\x3b\x68\x6f\x21\x2e\x9d\xe6\x4a\x38\x88\x7d\x24\x33\x07\xf8\xa8\xf9\xdb\x53\x4c\xa4\xdc\x1f\xac\x0e\x5b\x72\x75\xb3\xbf\xb3\xd3\xd9\x1c\x75\x9f\xed\xec\x3c\x90\x83\xce\x76\x67\x30\x20\xec\xfe\x50\xac\xc0\x37\x56\x00\x9b\x0f\x0c\xbd\x08\xc9\x07\x20\xff\xb0\x83\x82\x0b\xf2\x33\xf0\xec\xa7\x5b\x86\x39\xdd\xe1\x5d\x76\x08\x9d\x4d\x35\x02\x7c\xc6\x29\x0a\x68\xf7\xb6\xae\x20\x18\xde\xb0\xa9\x37\x51\xcd\x1b\x94\x7d\x20\xea\x85\x06\x48\x90\x4f\x9f\x3d\xf7\xe1\x8d\x35\x08\xba\x3b\xed\x51\x77\xb8\xdd\xde\x04\x32\x7b\xc3\x54\xdf\xdf\xbe\x90\x6d\x1e\x3e\xd4\xde\xdc\xdc\x1b\xb4\x37\xf1\x51\x9f\xdf\xeb\x76\x46\xb2\xd3\xfb\x6c\xff\x01\x92\xd8\x2f\xa9\x60\x18\xdd\xeb\x0e\xb6\xe0\x89\x4c\x96\x1c\x3a\x93\xd5\x69\x6f\xde\x13\x2e\x85\xf5\x56\xbf\x33\x84\x6e\x53\xf7\x64\xfb\x6e\xbb\xdb\x1b\x8e\x64\xb7\x37\xea\x0c\xb6\x3b\x03\xe0\x76\xd6\x6b\x44\x3e\xe8\xef\x0d\x6c\x03\xa8\x12\xc0\x5b\x63\x7a\xc0\xda\x23\x22\xa2\xef\xd1\x4c\xea\xb7\xb5\xbb\xbd\xce\x16\x63\xfe\xbd\x55\xf9\x5c\x77\x67\x47\xde\xef\x74\x46\xf0\x78\xe1\x6a\x1b\x3b\x4f\xeb\xef\x76\x06\x6d\x97\x25\xba\xfe\x8c\x3b\x1d\xb9\xd7\x83\x46\x0f\xf6\x76\x47\x9d\x2d\xd1\x1f\xc8\xce\x60\xd0\x1f\xac\x6d\x0f\x3a\x1d\x24\xaf\xd6\x8f\xdb\xea\x6c\x77\x36\x47\xc3\xe5\x8d\xb9\xa3\x7f\x38\x18\x74\x36\x47\x9d\x2d\x38\xba\xfa\x83\xf6\x8e\x7e\xda\x73\x83\xee\x68\xd4\xe9\xc9\x6e\x0f\xb4\x05\xb0\x39\x03\xe0\x9b\xde\xec\x90\x0a\xc0\x9d\x07\x38\xd8\x01\x14\x59\xe0\xb0\xef\x8d\xee\xf5\x07\xdd\x7f\xdb\xd9\xf2\xc8\xfe\x9f\xed\x08\x2e\x06\xa9\x31\x8a\x6f\x0e\x3a\xa0\xb3\x60\xf6\x64\x48\xe9\xd4\x8a\xa8\x94\x63\x7f\x23\x7a\x64\x39\x3b\x3c\x66\x98\x2f\xcb\x0e\x2f\x2e\x66\x87\x97\x97\x65\x87\x17\xcb\xd8\xe1\xfd\x2b\x04\x8e\xdf\x0b\x28\xe2\xc5\x13\x51\xc4\x3f\x1d\x4a\x87\x21\xdd\x65\x3c\x0f\x2b\x44\xef\x7a\xfd\xef\x0e\xfa\xf7\xba\x77\xba\x56\x2b\x21\x70\xcb\x7b\x04\x4e\x0c\xce\x68\xc3\xbc\x99\x12\x1f\x43\xfd\xde\x48\xf4\xce\x45\x3b\x62\x29\xcd\x3b\x57\xdc\x50\xad\x4d\x7f\x20\x07\x9d\x9d\xf6\x48\xff\x08\xda\x6c\x19\xeb\xf5\xef\x60\xcf\x9c\x57\x8b\xe3\xef\x4e\x6a\x9a\x3e\xd0\xf5\x90\x8c\xee\x75\x06\x9d\xfe\xb6\xe5\x7f\x07\x26\x75\xd9\x76\x48\xe2\x2d\x1d\xbc\xbd\x1e\x96\x73\xc0\xb7\x02\x3d\x8c\x5b\x7b\x9b\xa3\xa1\xb0\x64\xf8\x7e\x49\x91\xa1\x69\xe7\xa1\x04\x49\x0c\x77\x2c\xef\xb5\x87\xf2\x4e\xa7\xd3\x63\x26\x77\xb1\x9c\xc9\xdd\x0e\x1b\x1c\x86\x23\x7d\x4e\x0d\x47\xc8\xde\x8e\xc7\x50\xbb\xbb\xb3\x37\x00\xd5\x8e\xce\x70\x88\x63\x2d\x8c\xa2\x07\x51\xca\x77\xee\x77\xb6\x1e\x84\x72\xd8\xbf\xdf\x91\x9f\xdd\x1b\x74\x87\x5b\x24\xfb\x23\xb7\xfa\xb0\x36\xda\x3b\x3b\xfd\xe7\xe0\x79\x4b\x16\x94\x6e\xa2\x9d\xf0\x73\xaa\xb0\x86\x66\x0e\xcd\x73\xee\xb7\x1f\xe0\x4b\x76\x77\x77\xf4\xdc\x89\x07\xfd\x3d\xf0\xdb\xd3\x4c\xdb\xfd\x46\x56\x8a\x63\x16\x65\x56\x7a\x5a\x8d\x4e\x04\x13\xc8\x02\x49\x69\x10\xe3\x33\x02\x4c\xbc\xc8\x70\x7a\x98\xe8\x5c\x4d\x19\xba\xd5\x14\x6e\x52\x2f\x8c\x95\xc2\xe4\x58\x34\xcb\xe6\x48\x60\x82\x50\x96\x49\x96\x24\x51\x5e\xc8\xd5\xff\xdf\x8d\xab\xe1\xd5\xab\x80\x33\xba\x1a\xca\x91\xa1\x32\x0f\x2f\x64\xce\xb7\xc4\x79\x75\x62\x7c\x51\x61\xa7\xa7\x2a\x81\x40\xae\xdc\x8f\xc6\xf4\x1f\xd9\x1f\xea\xbf\x7d\x7e\x1e\x8f\x9f\x1f\xc5\x33\xe5\xfd\x43\x0e\xcb\x5c\x45\x33\xed\x0d\x0c\x55\x7e\xac\xf2\x15\xf9\xd1\xd0\xe3\x0b\x83\x80\xf7\x19\xf2\xa9\x52\x03\x78\xea\x57\x2e\x4d\x93\xef\xf7\xf3\x02\x9a\x7c\xb8\x04\xc0\x68\xac\xf0\xe3\xa3\xa7\x08\xaf\x96\xbf\x2f\x45\xbe\xc9\x95\x7d\x58\x7e\x7c\x8c\x04\x59\x80\xb3\x17\xd2\xf1\xb5\xc9\x01\xca\x26\x89\x04\xd0\x51\x64\x21\x16\x7b\xed\xf8\x91\x54\x3e\xad\x7e\xe1\x06\x9f\xcd\xc0\xca\x79\x11\x1d\x28\x79\x30\x8f\x27\x2a\x81\xcb\xc7\xea\x98\x37\xaa\x27\x44\xe0\x0c\x8d\xb3\xd9\x15\xc0\xad\x5d\xb1\xdf\x9c\x66\xf9\xb5\x7c\x42\xb4\x66\xe1\x61\x39\x4b\x90\x24\x4d\xf6\x19\x7c\x55\x83\x4f\x5d\x82\x6e\xbd\x4e\xa8\x2e\x9e\x88\x50\x9d\x57\x43\x25\xfb\x4a\xbc\xe6\x75\x42\x75\x5c\x8a\x4f\xfc\x8a\x1a\x74\xa6\x19\x70\x6f\x88\x40\xaa\x84\xea\xb4\x2d\xa8\x9a\xc9\xc7\x5c\xbb\xc4\xea\xb4\x53\xbc\x67\x32\xb7\xba\x5c\xc6\xad\x5e\xe7\x85\x34\x21\x86\xa5\xf4\xea\xb2\x99\x5e\x5d\x34\x35\xe0\x12\x0c\xeb\x72\x39\xc3\xba\x78\x62\x86\x75\xe9\x31\xac\x6f\x84\x10\x55\xb1\x2c\xd9\xeb\x1b\xe1\xba\xf7\xa3\x4a\xb1\x15\x61\x16\x2a\x52\x03\x26\x3f\x84\xe3\x69\x18\xc8\x09\x41\xe2\x0f\x2c\xd7\xc9\x10\xaf\x84\x13\xc6\xa4\x7c\xb0\x36\xd8\x1a\x08\x81\xa1\x6a\x6e\xb5\x81\x26\x1a\xe8\x3e\xf9\x3b\x86\x81\x7d\x3f\x87\xc5\x4f\x40\x9c\x6b\x57\xe5\x24\x5a\x80\x4b\xcd\x6c\xeb\x22\x42\xf1\x85\xa9\xfb\x79\x82\xa1\xc4\xb3\x99\x9a\xc4\x51\xa9\x4f\x58\xb2\x62\xf1\x52\x64\xfe\x18\x50\xee\xc6\xb0\x76\x21\x1b\x09\x76\xd7\xaf\x85\x37\x56\xf7\x5b\xb7\x45\x96\x23\x94\xe3\xc9\x46\x01\x16\x17\x9c\xe3\xfa\x56\x99\x30\xcd\x23\xd6\x0e\xd6\x4b\x07\x01\x04\x84\xe5\x01\xcc\x20\x3b\xb5\x62\x8e\x5e\xde\xd0\x8b\xc4\xdd\xae\x20\x85\xb0\x09\x93\x18\xe3\x98\xd3\x38\x2f\xca\x27\x78\xb6\x89\xf2\xe9\x69\x64\xba\x55\x0e\xff\xe3\xea\xda\x90\x1d\xe4\x44\xcf\xa6\xfe\x3a\xdb\x3b\xca\x52\x97\xb2\x3d\x70\xee\x9d\x32\xf3\x66\xa4\x28\xb3\x23\xa8\x3a\x61\xf6\x73\x2f\xc5\x83\x5f\x76\xb1\xd3\x4e\x66\xa7\xae\x1a\x66\x75\x7e\xfd\xd8\x70\x3b\x49\x9c\x84\x50\x61\x55\xeb\xdd\xa4\x0a\x9c\xf7\xb6\x90\x11\xb3\x55\xc9\xc2\x70\xda\xa3\x40\xa0\xfe\xaa\xed\x18\x19\x56\xcc\x52\xcf\x08\x39\xa7\x18\xc3\x0f\x65\xed\x32\xdd\x3a\xdd\x2f\x01\xa5\x6b\xe2\x5c\xa6\x51\x09\x32\x9f\x04\x03\xb1\xb2\x2a\x08\x8e\x95\xfb\x6a\x91\xd1\x8e\x75\x5e\x51\x0b\x7b\x7a\x0d\xba\xa0\x62\xc7\x24\xab\xae\x05\xf2\x46\x20\x3e\x13\xc8\xa7\x03\xb9\x7e\x35\x90\xeb\xeb\x81\x84\xf9\xd5\xc3\xbb\x7e\x0d\x62\x7e\x78\x61\x72\xd4\x54\x1b\x8f\x18\xc6\xb3\xf6\x10\x13\x9b\xaa\xb4\x20\x4a\x68\x2f\x85\xc0\x66\x25\x47\x1f\xb3\xbc\x64\x7a\x54\xc8\x3b\x21\xcd\x31\x8c\x19\xf7\x8f\xab\x79\x19\xac\xaf\xef\x99\xf1\x38\xcb\x27\x56\x74\x4d\x9f\xd9\x70\xa6\x52\x72\x63\xf9\xe8\x9b\xb6\xd3\x76\x15\x47\xb9\x02\xfe\xf0\x4a\x37\x8c\x7a\x6a\xae\x66\x6a\xb2\xe0\xf6\x42\xff\xe9\xa8\xbd\x16\xca\xfb\x71\x31\x56\x49\x12\xa5\x2a\x9b\x43\xcd\xda\xb5\x70\x5d\xde\x85\x24\x1c\xec\xcc\x4e\x0a\x28\xea\xbc\x29\x80\x18\xeb\xee\xae\x38\x58\xbf\xb8\x54\xb3\x15\x3d\x0a\x80\xe7\xc7\xab\x60\xbb\x3d\x90\x1b\xe1\xfa\xd5\xf5\xd0\x7d\xac\xe1\x8c\xc3\xce\x32\xa7\x14\x90\xe8\xb0\xd6\x73\xda\xe0\xd5\x13\x46\x06\x4b\x25\xe1\xde\xe1\x74\xcd\xbc\xd0\x47\x59\x1e\x27\x0b\x87\x52\x88\xf8\x66\xb0\x36\xd5\x6f\x57\x95\x58\x39\xb6\xcf\x58\xb8\x88\xc6\xc4\xca\xc4\x54\xda\x09\x97\xb8\x43\xfc\x68\x5e\xdb\x30\xbd\x7a\x14\xf4\x4a\x5c\x5f\x97\xab\x23\xf3\x98\xad\xa8\x8c\x90\x02\x06\x7e\xb7\x01\x8a\xef\x50\xd6\x23\x98\xc3\x04\x7e\x8d\x38\xaf\x2d\xa5\xe7\x8e\x71\x16\x5b\x6a\x4a\xa1\xed\x7c\x7c\x18\x01\x50\x79\x0b\xc6\xfa\xc6\x46\xb8\xb1\x71\x6b\xed\xd6\xd5\xf5\x1b\xce\xbb\x84\x7e\x97\x5c\x5b\x73\xb5\xc7\xbb\xa5\x9a\x11\x05\xcd\xc6\xc6\xad\xf0\xd6\xc6\xd5\x8d\xb5\x6b\x72\x75\x60\xc6\xdf\xd3\x29\xa7\x7a\x23\xc3\xa3\x03\x2a\xa3\x95\x1f\xca\x2d\x17\x7f\xd4\x0a\x65\x1b\xc6\x21\x4e\x0f\x12\x6d\x9a\x24\x89\xdc\x0b\x87\x61\x65\x7d\x09\x58\x5f\x06\xdb\x50\x4b\x11\x37\xcc\x76\x15\x94\x83\x0b\x77\x43\x0e\x14\xb1\x00\x93\x54\xe8\x2e\x59\xaf\xbe\xc5\xe0\x1a\x58\xc0\xf1\x9b\xcf\xb1\x04\x0c\x8b\x39\xf5\x35\x9c\xca\xe8\x40\xa5\xe3\x45\xe0\x92\x3c\x06\xf2\x0b\x59\x9c\x96\x52\xdf\xba\xf3\x5c\xf9\x5e\x14\x17\xd5\x10\xe3\x3a\x55\xb9\xe8\xa3\x8d\x59\x82\xf5\xc7\x67\x59\x7a\x80\x57\xe9\xb2\x14\x9c\xcd\x8f\x99\x66\x9a\xea\x2f\x61\xd8\xef\xd2\x32\x8f\x72\xa7\x04\xc3\xb8\x15\x70\x12\x43\xd6\x97\xef\x19\xc4\x83\xc3\x52\xf4\xe0\x37\x30\x64\xd7\x40\x0c\xff\x48\xa5\x13\x3d\x19\x5b\x96\x9f\x53\x9f\x95\xda\x4a\x39\xa8\x09\xe6\x40\xb3\xe2\xd9\x51\x14\xe7\xc6\x17\x31\xb9\x12\x9a\xc4\xc0\x02\x2d\x88\xf3\x33\xc0\x2b\x09\x19\x32\xf9\x87\xb0\xac\xe3\x32\x40\x7a\xc2\x92\xf2\x61\x9e\x4e\x84\x5e\xbf\x59\x92\x1d\x2c\xc8\xf5\x42\x97\x0b\x2e\x71\xc2\x4a\x58\x7c\x43\x96\xcb\x22\x9e\xc5\x49\x94\xcb\xe9\x3c\x25\x76\xe8\x08\x03\x74\xa6\xdf\x78\xb4\x13\x1c\xba\x56\x77\xeb\x26\xbd\x03\xff\xed\xc2\x7f\xbb\x49\xcf\x72\xff\x0c\x98\x83\x3a\xe3\xd5\x66\xe3\x68\x5f\x97\xcf\x45\xf1\xb1\xca\xa1\x24\x05\xab\x25\xc1\xce\xd8\xa6\x70\xa0\x49\xcc\x37\xc1\xc7\x32\x16\x34\x11\xe7\xcb\xc3\xb8\xab\x7b\xa2\xf4\xd9\x2f\x23\x24\xe9\x87\x5a\xee\xe9\x1c\xd6\x2e\x3d\x8b\xa9\x58\xa1\x4b\xde\x7a\x36\x2f\x20\x8a\xfe\xe8\xc4\x17\x4a\x20\x43\x83\x85\x9c\x11\x92\x04\x4e\x60\x94\x1e\xcc\xb5\x13\x0a\x15\x66\xa6\x30\xc8\x08\xbc\x38\x3b\x8e\x2c\x33\xc0\x9c\xe6\x58\x32\x6e\x84\xa5\x0c\xe3\x53\xb5\x88\xf5\x5a\x78\x43\x0e\xd5\xb1\xca\x29\xec\x13\x42\x7d\x53\x77\x6a\xf2\xbf\x94\xb1\x8d\x90\x67\x1f\xcb\x78\x61\xca\xd3\xd2\xe7\xeb\x9f\xc6\xe9\xa4\x38\x5f\x6c\x27\x70\xca\x6f\x6d\xca\x89\xc8\x5b\x5d\xe5\x9d\x00\xab\x43\x2a\x0f\xaa\x8b\xc0\xd0\x57\x26\xcb\x44\x39\x88\xdd\x6b\x3f\x51\xa2\xc8\xa0\xa6\x23\x63\xcb\x09\x2c\xfe\x71\x96\x66\xb3\x78\x4c\xc5\x50\x04\x52\x82\x28\xb7\x71\x04\xc8\x65\x0f\xac\x67\xc4\x22\x3e\x35\x2b\x0b\x5a\x65\x12\xb7\x71\x0a\x89\x43\x09\x2d\xc4\x3c\x1a\xc9\x7c\x68\xff\xa3\x97\x95\x7a\xcb\x70\x61\x16\xa2\xc6\xb3\x5c\x1d\x64\xc0\x7a\x19\x4f\x2b\x61\x34\xa3\xb6\x51\xb8\x85\x14\x05\xba\x53\xda\xb5\xc0\x24\x25\xed\x79\xa2\x09\x45\x47\xa4\x42\x2b\x6f\xc1\x48\x9c\x31\xbf\x86\xa7\x01\xf8\x3f\xcc\xcd\xee\xca\x17\xe9\x8e\x12\x62\x1c\xba\xac\xaf\x0e\x7e\x4a\xd0\x78\x9c\x59\x4b\xde\xd1\xa2\xc3\x83\x18\x35\xc0\xdd\x8f\x68\xbf\x9a\x07\x0d\x6a\x54\x8b\xe6\x50\x3e\x72\xd8\x16\x65\x9e\x2d\x9c\xfa\x1f\x01\xec\x8d\x96\x36\x21\x4e\xe5\x22\x9b\xe7\x20\xc8\xa2\x0a\x56\xce\xa6\x2c\x02\xae\xf8\x9b\x72\x8b\xe4\x30\x06\x46\x0e\xe3\x43\x49\x67\x30\xdf\x02\x87\x45\x9e\x50\x35\xa3\x97\x81\x73\x93\x12\xb0\x7a\x0c\x67\xc7\x66\x94\xc4\xd3\x2c\x4f\xe3\xc8\xde\x5d\xf6\x1d\x9f\x90\x80\xc6\xd6\x1f\xbc\x80\xc6\xb5\xf0\x96\xec\x60\x5e\xba\xcd\x20\x9a\xdb\x64\x0a\xe9\x39\xd8\x89\x4e\xc2\xcb\xe8\x0f\x88\x8b\xf5\x07\xe4\xa5\xf4\x07\xe0\x65\xc2\x9f\xf2\x7d\x75\xae\xf6\x0c\x8d\x13\x88\xa7\xd8\x6a\x11\x56\xa4\x11\xee\x4a\xa0\xf2\x27\x98\x9c\xfd\x0c\xfd\x0f\xfb\x7b\x38\x20\xc6\x59\x3a\xa6\xce\x8f\xb3\x74\x9a\xc0\xf1\xa0\x4d\xa8\xe8\x24\x14\xe2\x39\x97\x91\xe4\x43\xeb\x8c\x48\xd4\x19\x11\x1f\x8d\xce\x88\xf1\xe0\x7e\x2f\x9d\x11\x56\x11\xf9\xdf\x3f\x91\x5f\x9c\x2b\x01\x20\xc5\xff\xfd\x93\x8b\x75\x44\xf4\x6f\x53\xf5\x82\xa3\x23\xf2\xbf\x7f\x32\xd1\x8f\xf1\x95\x44\x3a\x7f\x02\xe9\x3b\xd9\x0e\x85\x58\xd9\x65\x02\x04\x9f\xe5\x7e\xfd\xe9\xa7\x9f\x5e\xdb\xb8\x7a\xf5\x96\x4b\x40\xd4\x4e\x12\x86\xbe\x32\x65\x28\xf3\xd2\x43\x99\x92\xa1\x14\xb8\xb8\xfa\xa1\x81\xbf\xa1\x10\xe4\x7d\x99\x30\x2b\x1f\x80\x15\x7a\xa1\xf3\x08\x85\x9e\x75\x09\x85\xf4\x87\x9f\xa2\xdf\x3c\xd5\xb2\x70\x41\xa2\x18\xc7\x19\x83\x96\xd3\x62\x44\x82\x18\x4f\xec\xbc\x3c\x54\xc2\x9c\x0e\xc4\xe7\x45\xd0\x37\xb7\x88\xd1\xb6\xc0\x0f\x9f\x67\x47\x2a\x45\xea\x6c\x27\x92\x1e\x1d\x15\xc9\x15\x81\x15\xa0\xd1\x44\x9f\xf5\x04\xd1\x76\x88\xbd\x74\xb3\x98\x28\xbe\x1e\x67\x4e\x12\xeb\x21\xd7\xf8\x35\xfd\xe6\xf8\x9f\x10\x50\x16\x2f\x9f\x02\x54\xcb\x53\x72\x3f\x2a\xe2\xe2\x42\xd6\xc9\x2e\x10\x12\x36\x80\x42\x84\xc5\xb7\x90\xca\x3e\x83\x4c\x86\xcd\x1a\xfe\x35\x65\x6e\x27\xbd\xa7\x9f\x76\x11\x5b\xe5\x25\xd0\x20\x80\xfe\x10\x0e\xf8\x62\x20\x7b\xfd\xde\x9a\x0b\xfe\x30\x13\x59\x28\xe5\x0d\x16\x9f\xdf\x6c\x6c\x18\x5b\x55\x1c\x98\x63\xd8\xab\x39\xb0\x38\xdd\xda\xc8\x87\x2b\x9f\x72\x34\xfe\xf3\xf8\x13\x5e\x19\xde\xed\xae\xdd\x59\x5b\xff\x18\x09\x20\xcf\xe7\x7f\xbc\xb6\xb1\xb1\x7e\xab\xca\xff\x78\x6b\xe3\x53\xfd\x97\x4f\xe4\xcf\xf0\x6e\x57\x6e\x0f\x3a\x1d\x4b\xdd\xcb\xb8\x92\x3b\x42\xac\x5a\x85\x94\xab\x72\xfd\xca\xc6\x8d\x2b\x1b\x57\xaf\x5e\x6d\x61\xfc\x34\xf4\x38\x00\x99\xbb\xce\xa2\x83\x7b\x98\x48\xb1\xd1\x72\x66\xe4\x40\x1d\x04\x07\x47\x6f\xe3\xe9\x51\x41\x11\x1b\x61\x6c\x6e\x78\x88\x43\xea\x5e\x45\xc3\x1e\x2a\xa4\x8e\x3c\xf7\xd5\xe1\x0a\x91\x9f\xb5\x77\xbb\x0e\xe9\x89\x6b\x0c\x33\xcf\x3f\x46\x7d\x98\x9b\x45\x15\x65\xe4\xa0\x67\xf5\x68\xc5\xa9\x18\x67\xe9\x17\x28\xc6\x62\xe5\x27\xeb\x64\x6b\x97\x25\x40\x93\x75\x03\x22\x6f\x22\x41\xab\x7f\x51\x1f\xd4\x95\x20\x0e\xd7\x56\x03\xdc\xca\x66\x0e\x96\xb1\xa0\xdd\x23\x9d\x73\x8f\x0a\x8e\x41\x55\x13\x05\x30\x05\xb4\x55\x80\xc4\xa3\x90\x71\x7a\x34\x2f\x21\xe0\x33\x56\xda\x65\xa3\x1f\x88\xa2\xcc\x72\x32\xd5\x31\x09\x50\x10\xd0\x40\x7f\x0c\x9c\x64\x32\x95\x4c\xd0\x24\x9b\x97\x47\xf3\xf2\x0f\x8a\x1f\x0c\xff\xa9\x9d\x78\x6e\xc3\x61\x74\xec\x15\xe4\x69\x3b\x0d\x92\x49\xc1\x05\xca\xa2\x81\xe0\xf0\x24\x21\xf4\x20\x6f\x48\xb3\xc8\xc5\xc5\x08\x82\x01\xf0\x3d\xc3\xb8\x01\x20\xcc\xd4\x8b\xc0\x19\x94\x4e\x84\xa3\xa2\x6a\x2b\x34\x8e\xd5\xc2\x54\x5e\x60\x4e\x03\xb6\xe5\x2d\x69\xb8\x26\xcd\x82\x8b\xad\x21\x1d\x12\x5b\x52\x03\x15\x5a\x51\x23\xf7\xf2\x99\xce\x1a\x58\xce\xea\x38\x01\x66\xe0\x3b\x97\x23\xac\x99\xc7\x2c\x14\xc0\x4f\x56\x4d\xb3\x5c\xc4\x53\x26\xab\x3c\x65\x42\xb4\x31\x3e\x50\xed\x4a\x9d\x96\x4c\x3a\xb4\x64\x4d\x5d\x11\x1f\xba\x2b\xe2\x0e\xb6\xc1\xf0\x99\x2d\x27\x26\x6b\x3c\x10\x96\x3e\x17\x68\x9c\xf0\x84\x73\xa7\x2d\x5d\x72\x52\x42\xa6\xc2\xe3\x10\xb4\xc5\x99\xc2\x82\x6f\xea\xae\x41\x65\x77\xac\x5f\x5d\xc2\x96\xe6\x28\xcf\x72\xb8\x11\xd2\x22\x85\x95\xa4\x31\x99\xd9\xb8\xf0\xc5\x6f\x61\x7d\x39\xdf\xa7\x83\xdb\x85\xa7\x59\xd6\x88\xa8\xe2\x7b\xa1\x24\x09\x53\xa4\x41\xc4\x2e\xcf\x21\x78\x94\xe7\x1c\x34\xf3\x22\x6b\x25\xca\x6f\x63\x77\xd6\xe5\x8a\xd1\x67\xfc\xd0\x3c\x58\x78\x0f\x61\x43\xaa\x72\x90\x76\xcb\xf2\x91\x13\xd4\xa0\x21\x11\x47\xa4\x6d\xed\x86\xa8\xc8\x9d\x17\x73\xe3\xfa\x30\x92\xe1\x33\x4b\xb8\xb6\x9c\xfe\x30\xcf\x96\xb0\x3c\x5b\xf2\xf7\xe6\xd9\xb2\xf2\xf5\xd8\x00\x66\x37\x31\xa7\xa9\x65\x32\x0b\xa4\xe5\xe1\x22\x62\x32\x6c\x84\x21\xe5\x12\x17\x93\x72\xd9\x1f\x23\x0f\x97\x4f\xc0\xf5\x8f\x40\xaf\xc5\x47\xec\xfa\x86\xb6\x04\x78\xd5\x0c\xe3\x24\x1e\x67\xa9\xbc\x9b\x47\x47\x87\xf1\xb8\x40\xda\x66\xf8\xf4\x46\x68\x66\xf2\x2e\xe1\x1d\x27\x3e\x09\x17\x72\x48\x79\x1f\xaa\x21\xcb\x1c\x03\xa9\x09\x6a\x03\x80\x85\xc3\x38\x9f\x08\x4c\xef\x37\xd7\xeb\x62\xfd\x57\x60\xdc\xc0\xc9\xdc\x62\xc0\x1b\xbf\x21\x8e\xf2\xac\xe4\x7d\x14\xa7\x87\x08\x7d\x6a\xe2\x49\x0a\xc0\x2e\xf2\x29\xc1\x1c\x2d\x61\xab\x81\x17\x88\x73\x88\xbc\xa4\x4b\xe4\x55\xe3\xda\x02\xfa\x5d\x5e\x99\x86\xb1\xcb\xde\xd7\x64\x9d\x05\x28\xa9\xe1\xd6\x16\xb3\x80\x11\x17\xe8\x56\x75\xd7\x90\xe6\x53\x40\xa6\xd9\x67\xb6\xb1\x21\x7d\x53\xa4\x0c\x03\xee\xe6\xde\x2a\x97\x06\x68\xeb\xf0\x2d\xb8\x84\xa3\xf5\xb6\x25\xfd\xb5\xd2\x6d\x04\xde\xa1\x2a\x3d\xdb\x2f\x41\x56\x27\x1c\x6f\xb3\xfd\x6c\x12\xdb\x93\xb3\x4e\x51\x36\x8b\x9e\x57\x94\x6c\x9c\x45\xfa\x67\x00\xc4\x39\xca\xa3\x31\x50\x69\x88\x42\x25\x09\x46\x99\x91\x17\x4a\x2f\x86\x22\x4a\x54\xe0\x55\x81\x42\xa6\x50\x77\x38\x2b\x9a\xd9\x4c\x5d\x7d\x5c\xb6\x0b\x97\x31\xc8\xd5\x96\xec\x3e\x29\xab\x94\xc8\xa9\x68\x15\x47\x44\x34\xcd\xb0\xe8\x38\xce\xb4\xc1\x16\x39\x5b\x64\xc3\xdd\x35\x4d\x75\xc3\x95\x04\x4d\xc3\xbe\xa1\xd3\x53\xef\x37\x3d\xf6\x40\x65\x51\xe7\x2d\x20\xa0\xd0\x33\x72\xbd\x25\x0b\x75\x14\x01\x43\x7b\x33\xb8\xf5\xb6\x48\xb3\x5c\x6e\xb4\x30\x91\xeb\xa0\xae\x0a\xac\x1f\x83\xeb\x4b\x2f\x5b\x17\xfa\xd4\xcc\xc8\x26\xf4\x61\x86\x2c\xd0\x35\x26\xd8\xfa\x2a\xb3\x72\x8b\xf6\x92\xcd\x72\xc9\xa6\x3c\xd1\xbf\xf4\x32\x33\xe4\xdb\xce\x6f\x65\x77\x76\x94\x28\x03\x53\x20\x68\x4b\x0d\xbc\x6a\x81\x73\x70\x40\xb1\xf6\x8b\x5f\xfd\x17\x7b\x8f\xd2\xdf\x31\x6f\x61\x11\x99\xe4\x20\xcb\xe3\xf2\x70\x56\x98\xd5\x2b\x9a\x56\x2f\xb1\xa2\xf8\x5e\x90\x7b\xc8\xb5\x77\xbb\x80\xb8\x40\x1b\x25\xac\x52\x73\xe5\x04\x8b\x61\xa1\x49\xbf\x92\x5f\xc2\x9c\xb7\x2a\xdb\x1b\xce\xf6\xfa\x73\x30\x33\xc7\xf6\x10\x15\x40\x03\xba\x7a\xb7\xeb\x40\xe8\x1d\x92\xd4\x38\x95\xe7\x39\x9f\x75\xaf\xb6\xda\x75\x29\xe5\x35\xbd\xa7\x3c\x85\xff\x10\xcc\xd8\x01\xa4\x6e\x69\x29\xe0\xa3\xaf\x6c\x52\x64\xd6\x4b\xec\xd0\x6b\x3d\xa6\x25\x63\x3b\x05\x82\x28\x93\x98\xa9\x69\x9c\xa5\xc5\x51\x3c\x9e\x67\xf3\x02\x94\xad\x89\x9f\x1d\x16\x32\xe9\x86\xc5\x29\xbb\x1f\x14\xec\xf7\x5a\x57\xe5\xab\x43\x8b\xc0\xfb\x48\x63\x56\x30\x4e\x3d\x83\x0f\xf8\x1e\x84\xe3\xe9\x43\x03\x2d\x8b\x1f\x56\x3c\x3b\xf6\x33\x98\x68\xcc\x15\x04\x1a\x63\x88\x86\x2c\x0b\xd4\x12\xbb\xad\xc7\xd8\x21\x41\x45\x42\x09\xe7\x05\xd0\x9f\x66\x86\xbe\xca\xbb\x29\xbd\x21\x7c\x16\x3e\x30\x30\x13\xfd\x9b\x3c\x4a\x88\x39\xbe\x3c\x74\x84\xe1\x9f\x2a\xd8\x38\x74\x33\x8c\x1e\x92\x0b\xe2\xd6\x6c\x07\xa3\x9b\x70\xee\x02\x22\x18\x3b\xdc\xcf\x09\x93\x1c\x16\x8d\xab\x89\x3a\x91\x14\x19\xd6\x79\xfc\xfe\x13\x8b\x9e\x4c\x42\x49\xbf\x63\xa7\xb6\x7b\xd7\x43\xaa\x7a\xca\xf8\x4b\x92\x0d\x4b\x74\x36\xec\x57\x01\x54\xe2\x73\x5b\xb8\xcb\x85\x6e\x29\x87\x4c\x8a\x0c\x67\x82\x21\x37\xf0\xa6\xac\xae\xb7\x2a\xcc\x8d\xab\x1b\x2d\x6d\xd8\xf3\x99\x0f\xfb\x78\x1c\x25\xd5\x7c\x29\x80\x2d\xa7\x00\xfd\x4e\xa8\xf6\x9d\x95\x32\x22\x12\xc3\x32\x02\x05\x50\x6c\x01\x11\xa9\x4c\x5f\xe1\x79\x3c\x5d\x08\x6f\x41\x64\xc8\x51\x89\x2f\x45\x5d\x81\x4a\xdc\x86\xf1\xc7\x13\x95\x67\x07\x0e\xa3\xaf\x5e\xa6\x62\x78\xb7\x6b\x96\x95\x65\xcc\xbe\xe6\xf6\x23\x9b\x7a\x4b\x10\x00\xe7\x10\x76\x71\x3c\x5c\x18\x7e\x61\x71\xec\x74\xaf\x79\x92\x27\xde\x9c\xba\x54\x0f\x38\x77\xbc\xf9\xf4\xb7\x84\x65\x64\xd3\x8b\xc9\x20\x15\xae\x07\xf2\x66\x20\x6f\x11\x0c\x75\x23\x20\x04\x2a\xd1\xa6\xd1\x83\x38\x57\xb5\x6f\x59\xfc\xa0\xae\x6f\x7e\xa4\xf2\x42\x4d\xb8\x32\xc4\xd4\xe9\xf0\xca\x41\x21\x7c\x47\xdd\xc5\x2e\x1e\x60\x49\xe3\x42\x22\x81\x6c\x08\x34\x38\xb6\xce\x7d\xe9\xca\x33\x34\x28\x71\x29\xa3\x7d\x00\x0f\x28\x7d\x11\x24\xfa\xe0\x36\x7c\x0f\x24\x3e\x89\xcd\xc1\xfe\xe0\x78\xd6\x07\x13\x6f\x25\xcb\x02\xe1\xd8\x4c\x96\x0b\x02\x86\x00\x4c\xbc\x50\x88\xcd\x10\x10\x69\x80\xb6\x75\x6c\x2c\x8f\x2c\xa2\xf0\xd8\x22\xc0\x36\x5c\xce\xfd\x60\xac\x47\x1f\x9b\x6b\xc8\x1c\x22\x67\x5b\xfb\xf3\x6c\x5f\x0e\x3d\x28\x90\xf9\xe6\x23\x2b\x44\x10\x3e\xf8\x3e\x76\xa7\x11\x81\xff\xc4\x11\x0d\xe8\x7a\x62\x17\xe1\xba\x82\xc2\x2b\x2c\x10\xcd\x85\x05\x86\xf3\xbe\x8d\x2c\x09\xa6\x7b\x0d\xb0\x71\xe2\xfc\x16\x0c\x17\x37\xcd\x7f\x22\x64\x78\xa0\x97\x0d\x97\x87\x70\xd8\xb6\x1a\x75\x84\x61\xb7\xcd\x09\xdd\x63\x5e\x37\xa3\x01\x4c\x4e\xcc\xba\xb3\x28\x4e\xc5\x45\x50\xf2\x7a\x9b\xbc\x2e\x20\x05\x4f\x2f\xb3\xf5\x79\xb2\x9f\xcb\x3e\xec\x0e\x66\xa1\xbb\x74\xb9\xde\x33\x42\xdb\x54\x9e\x08\x76\x04\x0e\x8f\x31\x97\xfd\xc0\x93\xb6\x96\xb1\x35\x15\x9c\xb6\xf6\xc0\x85\xb1\x40\xf5\xdb\x2c\x88\xa4\xbe\x90\xa2\x3c\x46\x2f\xc2\x03\x7a\xaa\xa2\xcc\x8e\x8e\x54\x62\x24\x79\xc1\x89\x69\xc2\x83\xf8\xea\x03\x60\x75\x9b\xf2\x3c\x28\x90\x0b\x6c\x45\x19\x56\x1a\xdb\x62\x3d\x79\x72\x18\x95\x45\x86\x1c\x35\x36\xb8\xce\x67\xb7\xcd\x99\x12\x16\x0f\xf1\x11\xc8\x6c\x3c\xad\x44\x4c\xa8\xaa\x6e\x46\x5c\x77\x58\x59\x47\x53\xb8\xbc\xbc\xce\xb5\x23\xec\xa5\x81\x65\x0d\x0d\x22\xa6\xda\xef\xb9\xdb\xbd\x2d\xd1\xbf\xe0\xae\x42\xf1\x17\x06\x33\xbd\x68\x47\x83\x53\x89\x47\x1c\x4d\x9b\x5b\x8e\x87\x0b\x92\x20\x37\xfa\xf8\x02\x04\x05\xf9\xe5\x8d\x96\x49\xf3\xc4\x36\xb1\x9b\x01\x4b\x90\xc1\x60\xdc\x0c\x1d\xcb\x1f\xdf\xb7\x13\x9d\x14\xb7\x65\x2f\x4b\xd7\xba\x8e\xdf\xd5\x74\x64\x16\xc5\x3c\x27\x80\xa6\x8c\x4b\xd2\x3f\xf5\x0a\x99\x74\xc7\x3c\xec\x5e\x11\x38\x48\x4f\x42\x12\xa2\xc5\x01\xe4\xe6\xfa\x9e\x2f\x02\x01\x16\x4e\x9a\x2a\x27\x0b\xe4\x5a\x55\xe8\x3e\x5b\x17\xb8\xc2\x73\xe7\x56\x74\x08\xbf\xa2\x03\xa1\xe2\xea\x05\x24\x70\xca\xd5\x1a\xff\x95\x14\xf8\xb3\xbc\x34\x51\xb9\x7a\x6b\x45\x63\x6b\x0d\x84\x29\x1c\x86\x94\x11\xc1\xd2\x23\xc3\xb6\x3d\xce\xe6\x69\x99\x03\x5c\xdc\xde\x53\x7c\x47\x3b\x16\x59\xfd\xdc\xd4\x87\x00\x99\x94\x27\xa0\xa9\x8e\x13\x52\xc8\x55\x47\xff\x46\x8c\x2d\x9a\x37\x4e\x16\x2d\xf7\xae\x58\x75\xb2\x54\xe0\x8f\x07\x36\xc4\x43\x7b\x51\x16\x6a\x9c\xab\xb2\xb2\x33\x2f\x41\x63\x48\x97\xdd\xf3\x71\x3a\x69\xf9\x5c\x91\x86\x8d\x4f\x50\x64\x92\x5d\x70\xef\xfa\xa9\x6a\x8f\xe4\x96\x64\x8b\xd7\x72\xc0\x3c\x63\xa0\x7d\x5e\x46\xa5\xee\x23\xaa\xfc\x50\x79\x90\x8d\xf2\xf8\x0b\x0d\xf8\x0e\x67\x90\x55\xb2\x70\xe5\x32\x83\xf8\x8d\x80\xfa\x25\x02\x07\x21\xc7\xd2\xa6\x11\x9f\xf2\x17\xbd\x67\x03\x69\x6b\x25\x35\xfd\x76\xcb\x64\x91\xf6\x12\x90\xca\xa0\x23\x6b\x17\x68\xcd\x72\x26\x03\x93\x71\xe4\x51\x82\xe1\xe3\x2c\x41\x2d\x23\x80\x72\xe1\xbd\xcd\x93\x8d\x5c\xbf\xf6\x6d\x4f\x15\xe7\xce\x8b\x6b\x78\x81\x61\xa0\x4f\xbf\x23\xbd\x54\xd2\xac\xd4\xc6\xb3\x36\x5a\xf8\xb6\x84\x86\x23\x83\xd0\x52\x9a\x29\xfd\xf9\x4b\x92\x4c\x61\x8c\x5d\x2d\xe7\x98\xa2\x2a\x5d\x12\x35\xf2\x29\xa5\x64\x85\x52\x4a\x00\xa5\x94\x37\x78\x4f\xc4\x28\x55\xe9\x48\x20\x3c\x57\xa8\x39\x5a\xeb\x18\xe5\xc1\xb9\xc4\x53\xa2\x91\x78\x0a\x22\xe7\x0d\x74\x53\x8d\x9c\x93\x64\xb9\x88\x1a\xdb\x94\xe9\x80\xc7\x2e\x05\xf7\xc0\xb9\xd1\x6b\x76\x12\x04\xfa\x0c\xd7\x1b\x30\xe7\xda\xdd\xe2\xf9\xbc\x1c\xfd\x94\xb8\x98\x7e\xea\xe9\x50\x5a\xc5\x62\xd9\xdf\x76\x38\x55\x2e\xa0\x47\x0a\x57\x00\xee\xc5\x08\xb1\x76\x6f\x4b\x34\x73\x01\xb9\x44\x40\xed\x41\xc7\xbe\xcf\x23\x18\x5a\x0a\x0e\xbb\xf8\xa1\x4d\x98\xb1\x46\x6a\xa1\x0b\x75\x8f\x0d\x6d\x50\x05\x3a\xa6\x87\xbd\x3d\x1c\xee\xdd\x07\x36\x20\x39\xe8\x0e\x3f\x27\xda\x43\xa6\x49\xa1\xc7\xc3\x77\x77\x3b\x03\xa0\xbf\xe9\x6d\x76\x98\x8c\xc7\xe8\xf7\xca\xe1\xbd\xfe\xde\xce\x96\xf7\x43\x18\xd5\x8e\x40\xda\x9d\xee\xb3\x1d\x14\x20\x7e\x20\x07\x9d\xe1\x2e\xc8\x17\x57\x5e\xbd\xd9\x1f\x02\xbc\xcd\xf2\x87\xe8\xbe\x0c\x3b\x83\x67\xbb\x9b\xc0\xd3\x34\xe8\xec\xb6\xbb\x03\xe4\xd8\x00\x9a\x9e\x6e\xbf\x17\x22\xab\x46\xf3\x44\xeb\xa9\x6d\xf7\x2c\xff\x07\x0c\x8b\xec\x6f\x0b\x97\x4d\x05\x98\x7e\xf6\x2c\x29\x48\x75\x6d\x38\x2c\x3e\xf7\x3a\x83\x0e\x32\xa5\x74\xfe\x64\xb3\xb3\x3b\x92\xc3\xbd\x3b\x9f\xed\x6c\x8e\x04\x13\xb4\xd8\x66\x10\x29\xc6\x52\x1a\x1a\x7c\x8c\xee\x75\x77\xb0\xb9\x77\x7f\x38\xd2\xc3\xaa\x87\x61\x20\x77\x3a\x77\xdb\x3b\xc4\xc4\x62\x19\x5a\x2a\xdc\x2b\x8d\x8b\xca\x21\x64\x01\x7e\x95\xd1\xa0\xbb\x39\xb2\x6f\x6d\x05\x8e\xe6\xb3\xcf\xcd\x82\x24\x37\x7a\x42\x88\x29\x46\xff\x95\x79\xbd\x1a\x38\x6e\xac\x02\x35\xfd\x4d\x38\x4c\x37\x17\x8b\x52\x9b\xb1\xbe\xd7\xd6\xad\x01\x71\x6a\x43\xc7\xd5\xd4\x31\xfe\x9e\x7e\xff\x4e\x7f\x08\x0f\xb8\xdb\xef\x6f\x3d\xd7\xdd\xd9\x09\xe4\x73\xfd\xc1\xe7\xe4\x70\xd4\xdf\xdd\x6d\xdf\xed\x04\xe6\x03\x5b\xed\x51\x3b\x10\x9b\xfd\xfb\xbb\x7b\xfa\x15\x86\x11\x66\x20\xef\xb7\x77\x98\xa6\xca\x70\xe3\x30\xdd\x18\xca\x55\x6f\xf6\xef\xeb\x8d\xe7\xb5\x79\x20\xf4\x93\x3b\x43\x4b\x65\x03\x80\x50\x64\xdc\xc2\x11\xbc\xd7\x7e\xb6\x83\x14\x36\xc8\x15\xd5\xd9\x92\x8d\x1c\x36\xc2\xe5\xb0\x09\x6b\xcc\x30\xee\x5a\xa1\x27\xbb\x44\x31\xfe\x16\x11\x5b\x9d\xf6\xe8\x9e\xee\xc6\x6e\x67\x30\xec\xf7\xda\x3b\xb2\xdb\xfb\xec\xde\x00\x76\xda\xde\xce\x88\x65\xbc\x25\x86\x94\x9c\x35\xe2\x73\x21\xe9\xa7\x77\x37\x41\xad\x7c\xa7\xfd\x9c\xa1\x45\x1a\x62\x2f\x6d\xeb\x2e\xc7\x97\xd3\xf9\x93\xcd\x9d\xbd\x61\xb7\xdf\x13\xb0\xa5\xdd\xae\x5d\x9e\x2f\xa7\x3d\xb2\xcf\x81\x63\xf8\x1c\xf6\x1c\x39\xe8\x6c\x76\x77\xbb\xfa\x50\x43\xde\x8e\xc6\xb8\x8a\x81\xfd\x53\x09\xb3\xa1\x0f\x25\xd9\x2f\xae\x76\xd6\x2e\x67\x9c\x1e\x04\x62\x99\xa2\xa3\xf6\xc1\x28\x32\x34\x2f\xe3\x84\xb4\x45\xa4\x51\x0f\x6d\xbc\x93\x2a\x26\x10\xd2\x7e\x06\x4e\x6c\xc7\x30\x80\x1a\x96\xcf\x25\xa9\x66\x14\x00\x48\x6d\x51\x19\x44\x83\x32\x6d\x9b\x9a\x98\x50\xc0\xbd\xd1\x36\x43\x81\x75\x49\xea\x85\x23\xf4\xb9\xad\x09\x8e\x69\xf9\x68\xc1\x95\xb6\x58\x4f\x86\xfa\xbb\x65\x99\xe5\xa9\x5a\x14\x72\xaa\x54\xd1\xe2\x51\xe1\xce\xbb\xd1\xc7\xb9\x36\x65\xfc\x8a\x7f\x97\x0d\xa0\x56\xf1\xdf\x98\x2a\xd0\x16\x3e\x3c\x5a\x9c\x6f\x89\x1b\x1e\x12\x0b\x4f\x00\x66\x83\xa6\x72\xdb\x27\x2d\xe7\x26\x22\x5c\xe0\xe8\x9e\x7a\xbf\xaf\xe1\x5c\xa0\xf6\x1b\x2c\xa9\x92\x39\x60\xa5\x03\xfa\x47\xa7\xfb\xfa\x67\xd8\xfc\x64\x25\x82\x6d\x2a\xeb\x19\x58\x27\xce\x38\x91\x4b\x3b\xc0\x10\x31\x41\xd5\xc1\x0d\xb5\xc1\xd5\xca\x55\x78\x66\xbd\xde\x80\x4d\x44\x51\xaf\x34\xac\x94\xc7\xfb\x81\x21\x33\x1d\x05\xe7\x2c\x91\x03\xd3\xd6\xe7\xd8\x02\x17\xe8\x2f\xf0\xb2\x78\xa5\x38\xe0\xb9\x9c\x5f\xce\x19\x17\xf2\x50\x25\x93\xe6\x9a\x43\x56\x41\xa4\xef\x9a\xcd\x9c\xab\x69\x96\x6b\x57\xca\xd4\x10\x46\xe3\xc3\x58\x1d\x43\x04\x3e\x55\x51\x8e\x64\x05\x0c\xd4\x03\x4b\x19\x4a\x68\xa9\x7a\x59\x3b\xd0\x5c\x69\x48\xc1\x36\x64\x45\x35\xea\x84\xce\x5b\x2f\x59\x66\x58\x65\x82\xa8\x8c\x66\x63\xfd\x11\x48\xdd\x98\x7a\xd1\x86\xba\xfa\x0f\x5d\xa0\x44\x19\x49\x70\x5a\xf5\xf0\xf0\x9c\x15\x52\x01\x1b\x10\x14\x55\x66\x4c\x07\xb4\xaf\x18\xf1\xa0\x98\x5c\x34\x59\x08\x0a\xb7\x3a\x0f\xe5\x82\x2c\xe7\x47\xb9\x2a\x20\xbf\xf2\xff\xb1\xf7\xb7\xcb\x8d\x23\x49\xba\x20\xfc\x3f\xae\x22\x4c\x66\xef\x49\x69\x5e\x08\xa5\x8f\xcc\xaa\xae\xac\xb1\xb1\xa5\x24\x28\x93\xdd\x14\xa9\x21\xa9\xcc\xd6\x19\x1b\x3b\x07\x22\x83\x12\x3a\x41\x80\x0d\x80\x52\x71\xd6\xf6\x82\xf6\x36\xf6\xca\xd6\xc2\x3f\x22\x3c\x00\x50\x99\x55\xdd\x5d\x6d\x63\x5b\xf9\x63\xa6\x4b\x24\x81\xf8\xf4\xf0\x70\x7f\xfc\x79\xea\x4e\xbd\x9e\xc8\x8d\xa9\x9e\xea\xbb\x87\xce\x42\xf5\x38\x11\x59\x35\xc7\x5d\xa7\x5d\xa4\x2e\xb1\x38\x8e\xfe\xda\xa9\xd8\x6b\xd5\x61\x1d\x42\xc5\x39\x06\x6d\x5b\x65\x62\x41\x69\x1e\xcb\x78\x60\xe9\x1d\x0b\x14\xcb\x37\xf1\x20\x8b\xa7\x1f\x61\x78\x8e\xea\xf9\x10\x19\xe6\x3a\x91\xef\x40\xd1\x26\x2d\x9a\xd4\xde\xeb\xab\x54\x5f\x96\x5b\x88\x2a\xc8\x32\x32\x3f\xcb\x90\xcb\xa1\x8b\x7c\xfb\x94\x02\x73\x1e\xa9\xd7\xc2\x91\x11\x95\x03\xa3\xe5\xa7\xe2\x9c\x7e\xbb\x0e\xcb\x8e\x0f\x86\xbf\xb1\x66\xd0\x36\x4f\xfd\xba\x9a\xc1\xfe\xba\x6b\xd5\x53\x77\xad\x7f\x55\xdd\xb5\x92\x75\xd7\xf8\x35\xc6\x37\x74\x0b\xaf\x7d\x22\x5d\xb9\x92\x41\x16\x4e\xa0\x32\x6c\xe2\xad\x0f\x11\x06\x0e\x9a\xcc\x36\x01\x12\xd9\xd6\x0a\xdb\x23\x4b\x89\x15\x9e\x16\xbd\xb9\x98\x40\x3f\x8d\x82\xaa\x80\xd8\xaf\x8c\xf1\xbc\x13\x5c\x97\x77\x11\x69\x09\xd8\x87\x12\x31\xaf\x3b\x1f\x75\x20\xb0\x61\x93\xb8\x35\xf6\x48\x51\x7b\x90\x67\x22\xe2\xf2\xcb\xea\xcd\x3c\x8d\x7c\xe7\x01\x5f\x2b\x38\xeb\xf8\x3c\xca\xfa\x3c\x91\x5d\xb6\xc5\x7b\x3d\x02\x9b\x3d\xc3\x18\x7d\x1d\xe9\xd3\xef\x4f\x4e\xf4\x60\xbd\xc9\x9a\x27\x93\x36\x95\xd1\xb7\x69\xf5\xe5\x25\xdd\x45\xfa\xc6\x6e\x30\xfb\xa6\x4f\x99\x79\x89\xf4\xe5\x40\xff\xf8\xf6\xe4\xed\xf9\xf1\xe9\xf9\xbb\x53\x00\xe0\xa4\xcd\x7b\xa5\xa8\xbc\xad\xac\xeb\xb8\x7e\xcc\xa0\xa2\x6d\x53\x95\x76\x60\xea\xef\xec\xa8\x5f\x28\x35\x2e\x1b\x43\xb9\x9a\x34\x24\x3e\x91\x91\x1c\x9c\x2b\x9e\xa2\xac\x0e\x4a\xd9\xb0\x50\xed\x60\x30\x53\xc3\xd9\x01\x17\xaa\x21\xc1\x5d\x18\x6a\xf8\x86\xa8\x80\x08\x33\xa8\xaf\xdc\x08\x7f\x75\x98\x41\xf5\x33\x18\xff\xca\x30\x83\x52\x2d\x34\x59\xb7\x10\x30\xab\xdf\xeb\xff\x70\x74\x85\x2e\xbf\x14\xb5\xe2\x6f\x3a\xa2\x4a\x43\x2c\x79\x5b\xa6\x8d\xf9\x4f\xc7\xba\x41\x21\xa9\x5e\x97\xb9\xf7\x95\x2a\x2c\x13\xfd\x0f\x4d\xe2\xcb\x2b\xe2\xdd\x42\x2a\x1d\x66\x16\x61\x50\x8f\xa3\x09\x11\xd5\x2a\xaa\x93\xfd\xf8\xcf\x7d\x0d\xf1\xef\xa4\x20\xba\x33\x1a\x14\xcf\xc2\x14\x22\x47\x56\x33\x03\x16\x13\x84\xaf\x96\x19\x96\x05\x9b\xbc\x36\x08\x44\x61\x4d\x8b\xfe\x62\xd6\xd7\x30\x26\x76\xb8\xf7\x17\xe6\x20\xc3\x41\xb1\x8b\x5e\xab\xd0\xe9\x66\x7c\x7e\x61\x95\xce\xc1\x7f\xfe\x5e\x55\xf8\x5b\xff\x8b\xbf\x5b\x5a\x4f\x1e\x16\xd2\xff\xfa\x70\x3b\x3a\x3e\x8b\x4f\xfe\xff\x7f\xe7\x4a\xc0\xd7\xeb\xff\xde\x9e\x7e\x7f\xfa\xae\x55\xff\xf7\xee\xe4\xe4\xfb\xdf\xeb\xff\x7e\x8b\x7f\x1f\xc6\x77\xfa\x43\x32\x4e\xa6\x83\x91\xbe\xbd\xbb\x18\x0d\x2f\x39\x14\xaa\x14\x3b\x13\x67\x91\xfe\xe3\xb6\x30\xfa\xf4\xc7\x1f\x4f\x95\x34\x92\x97\x47\xfa\xf4\xc7\x3f\xfc\x18\xc1\x27\x2d\xa7\xe4\xba\xdc\x16\x4b\xb2\x95\x88\x87\x7f\x67\xbf\x92\x16\x5f\x72\xeb\xf9\x36\x95\x31\x4d\xa4\xaf\xb3\x55\xf3\xa4\xaf\xf3\xd2\x7a\xe2\x17\x65\xdd\xd8\xaf\xdf\x0c\xf4\xc9\xd9\xe9\xe9\xc9\xf1\xe9\xf9\xc9\x69\xa4\xef\x66\x03\xa5\x92\x67\x53\xed\xca\x02\x4e\x52\xef\x12\x01\x29\xe5\x66\xd7\x96\x44\x62\x45\x64\x2d\x55\x90\x33\xa7\xf3\xe4\x10\x7d\x11\x60\xbc\x00\xd5\x05\x56\xbc\x61\xe6\x74\x50\x2c\x03\x9b\x79\x5b\x99\x74\xfd\x90\x1b\xac\x56\xf7\x5a\x3f\x50\x55\x50\x4b\x2e\x37\xc4\xf4\x65\x8f\x05\xf1\xdb\xa4\x5f\x8c\x4e\x5f\xd2\x1d\xf2\x9b\xac\x2a\x63\x96\xe5\x1a\x84\xd8\x9e\xd2\x0a\x49\x14\x10\x4f\xa6\xb3\x26\xd6\x17\x2c\x23\xce\xba\xa9\x30\x31\xa6\x80\xd8\x00\xd1\x01\x88\x5b\xb1\xa3\x76\x6f\x4a\xf5\xb8\x4d\x21\x97\x6e\xfa\xdf\xa4\xc5\x9b\xec\x67\xae\xc9\xc7\xc7\x84\x18\x77\xc2\x4f\xaa\x16\xfe\x0a\x7c\x97\xe9\xa4\x33\x54\xa3\xaf\x38\x0c\xb0\xa7\x65\x44\x34\x61\x5b\x05\xa3\xc3\xb7\xb3\x3d\x2b\xe3\x4d\xdd\xe2\xc2\x2b\x43\x0e\x26\x90\xe7\x7f\x79\x2a\x6b\xc0\x0b\x3d\x95\x55\x0d\x68\xcf\x8c\x48\x8f\x71\xce\x62\x7d\x38\x2b\xd7\x8c\xf1\xda\xf7\xaa\x80\xac\x6e\x41\x91\x1f\x02\xe7\xd8\xa1\x1e\x99\xba\x36\xd5\xde\x11\x2f\xea\xc6\xa4\xcb\x18\xf5\x70\x17\x54\x3a\xba\x53\xd8\x12\x24\xb0\xc1\xe6\xda\xdb\x61\x59\x22\x83\x47\xa1\x5f\xa0\xdc\x3e\xfd\x02\x3e\x84\x1c\xfb\xc8\x7e\x84\x38\x87\x95\xa9\x2a\x02\x89\xd2\xd4\x45\xb0\x06\x37\x55\xb6\x30\xb1\x9e\x6c\x2b\xd5\xdf\xaa\xba\xb3\xe6\xe4\x64\xa6\x0d\x08\xa2\x42\x2d\x00\x94\x52\xe0\xb3\x55\x28\xc1\xe7\x37\x48\xd0\x3c\x7d\x48\x8b\xa6\x7a\x64\xe2\x80\xac\x76\x48\x98\x6c\x65\x1f\xad\x5e\xb2\xfa\x09\x6e\x15\xf4\x2a\x94\xb3\x0b\x01\x9b\xf6\x7a\x9a\x16\xfa\xd1\x80\x4e\x30\xfe\x50\xbf\x80\x18\x56\xe3\x7f\xaa\xec\x77\x68\x89\x22\xe4\xd3\xa3\xda\xed\xdd\x62\x93\x99\x05\xb6\x32\x03\x37\x09\x6a\xea\x6c\x7b\x79\xd0\x7f\x72\x9c\x1a\xca\xbe\xe0\x4b\x51\xbe\xc0\x9b\xec\x73\xb1\x94\x04\x6f\x28\xc5\x63\x1d\x2b\x35\x2f\x35\xd5\xb6\xe0\xd4\x71\x4e\xfa\xc5\x80\xec\xa1\x1b\xc9\x4a\x14\xea\x60\x5b\x57\x65\xf5\x90\x41\xc5\x8d\x35\x45\x4d\xa9\x96\xa6\x80\x0d\x4e\xaf\xf0\x4a\x8f\x76\x29\xd7\x5f\xf0\xa3\xd2\xce\x49\x65\x9c\x33\x54\x39\xa4\x15\xfc\x46\xbc\x45\x35\x55\x5a\xd4\x79\xda\x40\x76\x73\x61\x2a\xb8\xb0\x04\xaa\x56\x19\x59\x1f\xfb\x64\x1a\xcf\xbe\xf9\x54\x72\x1c\xb1\xb2\x0b\xbf\x4c\x19\xd5\xac\x89\x95\x6a\x8b\x3a\xee\x7b\x18\x79\x86\x3c\xdc\x9e\x79\xef\xb1\x4a\x9b\x0c\xe0\x5b\x2b\xac\x66\x33\x26\xc2\xb7\x6c\xeb\x06\x54\x99\x28\x38\xe6\x24\xbf\x58\xab\x9a\x51\x64\x72\x9d\xc6\x9e\x70\xaa\xb5\x92\x9b\x27\x03\x88\x8a\x32\x72\xab\x4c\xac\xac\x16\x4a\x38\xd6\x83\x62\x09\xcb\x0a\x55\xb2\x9f\xca\x17\x0d\x4c\xcb\xb4\x0c\x50\x91\xb8\x44\xb2\x1b\x58\x2a\x24\x8a\x8a\xd3\xa2\xd4\x67\xd3\xb7\x3e\x28\x1a\xf3\x52\xea\xba\x31\x9b\xfa\x3d\x20\x8b\x1d\x50\x45\x87\xe3\x0d\x15\x3e\x67\x47\x28\x02\x46\x0b\xc4\x1f\x40\x84\xaa\xb2\xe3\x83\xb2\xc5\x18\x79\x14\xb8\x2d\x3a\xd8\x64\x01\x13\x97\x15\x89\x94\x38\xbf\xcf\xfa\xf6\x79\x5d\x22\x5c\x00\xc0\x0b\x68\x2e\xdf\xd4\xda\x17\x71\x21\xd8\x67\x5b\xe1\x42\x7f\x21\x61\x4a\x18\x68\x5e\x68\xb0\x81\x0c\x9f\xb4\xe0\xbd\x43\x41\x8d\x0f\xb4\x54\x24\x2e\xe2\x83\xef\xce\x3a\x04\x06\x24\xd6\xc3\x70\x09\xda\x9f\x39\xb5\xee\x87\x9d\xae\xcb\xb5\xb1\x2f\xb1\x77\x17\x2c\xaa\x4a\xeb\x1a\x6e\xc6\xbe\x79\x19\x60\xe8\x79\xe9\x58\xcb\x45\xb3\x95\x36\x00\xc4\xd3\x9e\xae\x88\xce\x6d\x19\xa4\x8d\x70\x8e\x09\xb7\xbb\xa9\xca\x87\xdc\x00\x80\xb9\xc1\xe2\x30\xb8\x58\x11\x25\xa3\x60\x9b\x5c\xe5\x18\x04\x09\x03\xbe\x74\xfc\xbc\xd1\x95\xd9\x6c\x1b\x57\x8b\x7b\x9d\x81\x04\x25\x16\x6a\x4b\x8b\x64\x1b\xd4\x3c\xc1\x05\xce\xda\x66\x08\x3f\xa5\x50\xdc\xfd\x20\xe0\x92\x08\x77\xaa\x63\xfd\xd9\x80\x35\x05\xab\xf1\x5c\x66\xac\x43\x5e\x3c\x1a\x92\xce\x15\x20\x7d\x7b\x0a\x62\xfd\xb2\x7c\x1f\x32\xb9\xb9\xe2\xd5\x7c\xa7\x28\xae\xd2\x52\x29\x8c\x04\x1b\xf1\x1a\x2b\xb0\x28\xd0\x03\x8f\xd9\x54\xe5\xa6\xca\x4c\x93\x56\xbb\x58\x83\x9d\x04\x9a\x39\x08\xd1\xc2\xc4\xb8\xda\x32\x6b\x8a\x51\x39\xc6\x8f\x31\xbe\x8a\x6b\x4c\xb8\x16\x07\x57\x25\xad\xaa\x37\xb5\x82\x76\x6f\xb1\x00\x16\xa1\x6f\xf4\x3d\xc7\x84\x0e\x34\x55\x76\xe6\xeb\x3d\x35\x65\x18\xf6\xdc\xec\x00\xe0\x1e\x24\x92\x40\x99\x4b\x24\x9e\x14\x96\x10\xda\x87\x26\xd3\x9b\x4e\xac\xe3\x1a\x72\x8e\xb7\xf7\x10\x32\xb9\x1a\xce\x50\x7d\x84\x12\x8c\xfa\x66\x72\x35\xbc\x1e\x5e\x42\xf4\x44\xa9\x93\x36\xe4\xd9\x39\x3b\xbc\xc2\x60\x08\x1d\x30\x2d\x20\x2f\xe0\xb2\x6f\xd6\xc3\x07\x66\x39\xe7\x81\x78\x33\xf2\x54\xe6\xf6\x98\xa8\xd3\x1d\x79\xa4\x54\x6e\xd4\x4f\x84\xe4\xc0\x39\xcd\x7e\xa7\x0c\x63\x1d\x07\xb7\xd8\xbc\x83\x88\xd5\xd3\xc1\xf3\x70\xad\xe7\x64\x8a\xfd\x8e\x2a\xb1\xf1\xa4\x88\xab\x0f\xa0\x27\x20\x7a\xcc\x1b\x83\x9f\x46\x25\xb0\x44\x37\x28\x3e\x21\x3e\x4d\xd5\xaa\xb6\x6c\x97\x70\xea\x3c\x7d\x79\xcf\xf8\x6b\x38\x29\x81\xc6\x1f\xbf\x2b\x2b\x17\x9e\x8c\x92\x4f\x76\xb4\x94\xe0\x13\x44\xdc\x00\xe7\xf8\xdb\x1e\x58\x73\xbd\x0e\xcb\xbb\xd0\x82\xba\x43\x76\xa9\x28\xcf\x81\x13\xc6\x41\xe4\x58\x1f\x7e\x84\x40\x0a\x44\x87\x23\xf7\x7d\xa4\x17\xf0\x85\x34\xdd\x38\x3b\x07\x45\x00\xb5\x7e\x20\x5f\x7e\x10\x1f\xa1\x74\x21\xad\x76\xcc\x38\x2e\x97\x95\xa9\x89\xda\xe0\x60\x57\x6e\x0f\xac\x25\x5f\x34\xd9\x33\x9e\xf3\xa2\x6c\xe1\xdb\x56\xbb\xab\xd3\x23\x0f\x97\x62\x47\xa2\xf8\x05\x4c\x26\xb8\x56\xdb\xa6\xce\x96\x94\x97\x5b\x94\x1b\xe6\x07\xc4\x24\x49\xb5\x2d\x78\xdc\x79\x46\x15\xd9\x58\xf6\x57\x90\x9f\x62\xc9\x45\xd5\x9b\xad\x00\x7e\xdf\x7a\x2b\xc8\xbe\x36\x64\x2a\x33\xc8\x91\x2b\x17\x84\xf6\x24\x7f\x3c\xe7\x7d\xab\x4c\x1f\x66\x82\xa7\xb7\x5c\x31\x29\xc7\x83\x31\x85\xe2\xe4\x6f\x4f\x8b\x8f\x62\xfd\x99\x1c\x15\xb7\xc2\xaa\xad\x75\x99\xed\xb3\x40\x7e\x96\x8f\x11\xd7\xc9\x65\x69\x90\x64\x41\x48\x3b\x7e\xe3\x05\xd3\x3d\xe4\x4d\x40\x8a\xa0\xd2\x3a\x70\x8f\x33\x90\x65\x85\x4d\xb7\x36\xcb\x6c\xbb\x6e\x17\xdd\x80\xe3\x1a\xd4\xe7\xc1\x36\xdc\xa0\x6d\x06\x12\x4e\xc5\x38\xc7\x92\xd9\x5e\xb0\x91\xf2\x5b\x62\x93\x15\xbe\xf4\x8d\xf5\xcf\x91\x1c\x94\x4f\xf1\x9f\xd4\x17\x63\x36\xf6\x6c\xb4\xf3\xcf\x3e\x1a\xfe\xac\xe6\x13\x68\x85\xf5\x4d\x9d\xac\x32\xe5\x0a\x20\x8f\xb6\x30\x0c\x15\x74\x8f\x86\xef\x3c\x72\xfd\x04\xc1\xfe\x03\x0d\x58\x39\xd5\x61\x69\x9e\xcb\xb6\xa4\x79\xc9\xc4\x0a\xe2\xdb\xb1\x52\x5e\x25\x37\x54\xc3\xc5\x53\x8d\x89\x6c\x68\x55\xc3\x46\xe6\xfb\x56\x4a\x1e\x56\xca\xce\x62\xba\xd3\x29\x79\x7c\xe5\x86\x8c\x8b\xed\xb3\x73\x75\x84\x2f\x05\x45\x86\x7c\xa9\x66\xd7\x17\x8a\x58\xdd\xba\x21\x3f\x0d\x9e\x87\x7d\xaa\xfa\x97\x4b\x5b\xdc\x11\x4d\x9a\x6a\x9e\xb6\x70\xd0\xad\xb1\xb1\x7b\x77\x47\x44\x87\x63\x77\x95\x82\x4d\x0f\x2c\x20\x5b\xf6\x3e\x35\x51\xa7\x93\x81\x52\xd7\x7d\xab\x12\xca\x0a\xd7\xc6\xc0\x12\xa1\x82\x01\xa4\xea\xa4\x83\xf9\xbd\x52\xe9\x91\x57\x95\x46\x19\x4d\xfb\x16\xe7\xfa\x01\x69\x0b\xb8\xb7\x69\x55\xc1\x90\xae\xb3\xc2\x6e\x6b\x5e\x6c\x75\xc3\x9a\x01\x74\x99\xc3\x51\x46\x3b\x83\xbf\x66\xab\xb3\xa4\x9c\xab\x1d\x3c\xfc\x56\xac\xd4\x43\xe7\xfd\xb0\x1a\x6d\xa7\x5d\x3f\xc4\x18\x41\x51\x06\xec\xa5\x88\xd5\x31\x9c\xde\xa8\x22\xbd\x51\x7f\x7c\x23\x41\x46\xa7\x28\xa3\x3d\x91\xf6\x37\x21\x5f\xb2\xf2\x4e\x0e\xf0\x1a\xc1\x1b\x52\xdb\x6b\x5e\xb9\xa8\x93\xdf\x8a\xf4\xf7\x6a\xc8\xfa\x6d\x11\x2b\xb5\x00\xf6\xe7\x60\x88\xd9\x11\x29\xca\x6a\x0d\x28\xed\xca\xa4\x4b\x8c\x9c\x80\x2f\x0f\xec\x56\x29\xeb\x55\xbd\x3c\x99\xc2\x1a\xcf\x48\xed\xc2\x61\xb3\x76\x0a\x3e\xac\x9b\xb4\x82\x32\x16\xb2\xb0\x2b\x16\x0b\x16\x0f\x92\xf2\x82\xeb\xb2\x6e\x14\x10\xdf\xa7\x15\xd4\x04\xc0\x18\x6c\xaa\xac\x60\x5e\x70\x62\x52\xd0\x69\x51\x94\xdb\x02\x89\xb8\x45\x4d\x44\x68\xc7\x54\xaf\x1d\x63\x47\xea\x95\x9b\xc9\xa1\x75\x3b\x73\xa8\x81\x42\x6f\xca\x2d\x29\x5a\xd9\x40\x0d\x8e\x5f\x3e\xf2\xa4\x9c\x10\xe6\x22\xcd\xef\x56\x29\x2a\x8f\x2c\x4c\x8b\x6a\x2f\x7e\x16\xaf\xc8\x73\x3e\x87\xec\xa3\x34\x5c\x3f\x4b\xfd\x9c\x99\x97\x3d\x85\xc7\xb1\x3a\xc4\xf4\x71\x56\x16\xef\xed\x19\x19\x1c\xa1\x4d\x6d\xf2\x15\xc7\xfc\x78\xb8\x1f\xb6\x8d\xaf\xcd\x72\x13\x0d\x63\x8c\xb8\x98\xd6\xe8\x46\x68\x87\xf6\x1f\xb1\xee\x70\x27\xe6\x1d\x9e\x31\xd5\x7a\x50\x7c\x04\xee\x79\x1d\x8a\xc4\xcb\xbc\xb9\x58\x89\x2f\x4e\x8f\x1e\x16\x3c\x00\x7e\xb8\x6e\x1e\xaa\x77\x6b\x2e\x19\x65\x8c\x3a\xfe\x82\x9c\x98\x7d\xfb\x8c\x2c\x5e\x5a\x20\xda\x87\x80\x0c\x3b\x00\xcb\x64\x4b\xc2\xaf\x78\x87\x01\xa4\x2a\x98\xca\x01\x29\x3f\x70\xa5\xae\x6b\x93\x3f\x1b\xc4\x73\xb4\x0a\x43\x21\x3c\x2b\x64\x49\x96\x65\x1b\x1e\x50\x02\xc5\x26\x35\x1f\xf6\x49\xcb\xb2\xa0\xb8\x53\xad\xc2\x57\xc7\xfa\x62\xdb\xec\xfb\x3e\x32\xf9\xbb\xa7\x06\x04\x22\x30\x82\x8a\x69\x94\x5e\x3f\x10\xc0\x38\xf6\xc0\xeb\xd0\xec\xd0\xfd\x4c\x95\x45\xd7\xb2\xf8\xf4\x35\x84\x5d\x45\x48\x02\x2f\x5d\xe4\x28\x93\x0f\x5b\x23\xd0\x61\xc9\x70\x01\x52\x1e\x86\xd7\xb0\x73\xb8\x45\x16\x77\x08\x4a\x38\x09\x73\xe8\x56\x65\x1e\xd3\x6a\x09\xb8\x46\xeb\x8a\x3c\x95\xfa\xc5\x1e\xb0\x0a\x42\x53\xf3\xa7\x6d\x1d\x89\x88\x3c\x40\xc8\x04\xd3\x3b\x84\x23\x17\xcc\xca\x85\xb5\x2d\x3e\xfa\x06\x0e\x66\x8d\x87\xb9\xf2\xfa\x82\x78\x23\xa3\x2a\x39\x46\x32\x59\xe7\x71\x57\x6e\x7f\xd2\x55\x6a\x3b\x17\xc9\x57\xe1\x9d\x84\x68\x9f\x8c\x6a\x24\x0b\x1c\xd7\x60\xf5\x0d\xb6\xb8\xf5\x10\x5f\x00\xea\x03\xd2\xf2\x83\x59\x53\xe1\xac\xc5\x4a\x0d\x0b\x97\x7d\x8d\xf4\xda\x5a\xb4\xf4\xf1\xd1\x8e\x92\xaf\x06\x17\x37\x4b\xa8\x1c\xee\xdb\xca\x40\xd5\x14\xb8\xcf\x7c\x1b\x7a\x65\xd1\x1c\x01\x26\x41\x3f\x97\xf9\x76\x4d\x28\x9a\xba\x29\xab\xf4\x11\xb4\x4e\x82\xfe\xa1\xd7\xea\xcd\xcf\x03\x4b\x61\xc9\x7b\xaf\x3f\xb9\xe0\x72\xd1\x73\x72\x9d\xbf\xee\x62\xb7\x3b\xd0\x6e\xbb\x3d\x9e\x02\x92\x0f\x75\x06\x75\x68\x25\xa2\x58\x38\xfa\xdc\xa2\x82\x78\xc5\xf1\xa9\xad\xe7\x53\x2c\xf5\x19\xfa\x3f\x6a\x8f\xfb\xb3\x24\xe5\x74\xdc\x51\x9e\xa0\x08\x3c\x9f\xc1\x62\x51\xae\x37\xd6\x07\xc8\x1a\xef\xad\x3a\x70\x24\x30\x93\xd5\x9b\x12\x29\x6a\x48\x22\xf7\xd8\x1e\xcf\xd0\x40\x71\x69\x88\x68\xa7\x73\x2c\xe5\x95\xeb\xff\xfe\x2e\xe0\x94\xe2\x74\x29\xa9\x11\xb4\xe5\xa8\x8c\x8f\xce\xd9\xb3\x05\x7d\xa8\x9f\x74\x59\x45\xe0\x47\x75\x7b\x93\xba\xdd\x03\xae\x71\xa4\x9f\xd3\x3c\xc3\x47\xa5\x50\x7b\x06\x82\x16\x95\x31\x7a\x67\xd2\x0a\x72\x21\xe0\xfa\xab\x56\x31\x5a\x44\x4e\x33\xf9\x3e\x45\x89\x14\x5d\x70\xd3\x25\x87\x19\xb3\x47\xec\xc1\xa3\x64\x24\x79\xc3\x8a\x06\x4a\xae\xca\x08\xce\x56\x1a\xe7\xce\xc8\x4a\x68\x51\x30\x09\x4a\x8e\x39\x81\x1d\x7f\xed\x58\x2b\x1e\x6b\xfd\x4b\xc7\x7a\xb1\x6f\xe5\x64\x85\xed\x32\xee\x7f\x71\x87\x5c\x12\xae\x15\xf6\xdc\x8a\xee\x65\x22\x52\x1c\xae\xb3\x20\x34\x7e\x08\x21\x2c\x89\x35\x83\xff\x84\x74\x27\xde\xd1\x57\x10\x96\x2b\x3c\xd4\x59\x75\x42\x0e\x7c\x97\x0f\x9a\x24\x1d\xa4\xd7\xf6\xa1\x82\x7d\x08\x5d\x64\x4f\x85\x16\x93\x83\xb8\x52\x51\xf1\xf6\x81\x4d\xfc\x03\x0e\x32\x39\x1f\x6d\x06\x19\xb6\x0d\x9e\x5e\x75\x83\x69\x35\x1c\xf9\xb5\x3b\xfe\xec\x97\x20\x73\x0b\x81\x4f\x15\x06\x87\x9a\x12\x92\x89\xd7\xe0\xc4\x4b\xbb\x81\xa1\x30\xb7\xb8\xe4\xcb\x89\x36\x30\xcf\x55\xd3\xd7\xac\x3c\xb7\xbe\xd0\xd6\xde\x59\x32\x7f\x8b\x88\xf4\x26\xdf\x12\xd7\x26\x29\x25\x99\xa5\xe7\x9c\x55\x9e\x45\x8f\x29\x2e\xe1\xfb\x68\x4b\xab\x6c\x83\xa9\xd8\xa5\x3c\x83\x6c\xe3\xb2\x3c\x75\x13\x04\x12\x7f\x79\x1e\x30\xc7\xfa\x1e\xc5\xfa\x63\xf9\x82\x35\xec\x48\xa9\xb9\x31\x00\x69\x37\xec\x84\x46\xed\x94\x4a\xc0\xb2\x0e\x39\x32\xd4\x17\x27\x22\x9e\x62\x87\x6a\x49\x1c\x65\x71\x0e\xa9\xdc\x4a\x87\xf6\xce\x9c\x11\x6b\x15\x3c\xb9\xac\xd4\x03\x5e\x12\xec\x2c\x1d\xf9\x65\xbf\x4e\xff\x42\x32\x74\x65\x01\xee\xe5\x21\x76\xd0\xb6\xf8\x8b\xa9\x0a\x43\x24\x66\xb5\xb5\xc5\x47\x4c\x1f\x46\xb2\xe6\x76\xc5\x83\x38\xb9\x76\x3a\x3d\x61\xf7\xed\x45\xa6\xb6\x87\x07\xb8\x1e\x44\xcb\x49\xaf\x22\x77\x5b\xa5\xb4\x1d\x33\x56\x9f\xf0\x83\xa7\xd4\x70\xd5\x39\xf0\xc5\xd3\xad\x97\x24\xd6\x7e\x26\x74\x52\xed\x32\x87\x0b\xce\x62\x01\xaf\x2e\xe1\x6e\x83\xfe\x6d\x4a\x99\x5c\x58\x0c\x10\x1d\x26\xbf\xd4\xfd\xca\xfa\xdb\xcf\x69\x0e\x2e\x2d\x3f\x00\x2d\x1b\xa6\xee\xc5\xe2\x63\x87\x19\xfc\x49\x14\x31\x81\x02\x6f\xf0\x29\xfb\x3c\xc3\xe0\xe8\x31\xcf\xe0\x0e\x97\xdb\xc7\xa7\xd6\x7d\xd4\x87\x17\xd7\x1b\x03\xb4\x91\xa2\x09\xfc\x10\x1f\xab\x81\x5d\x21\x06\x03\x49\x44\x24\x72\x14\x43\x30\x18\x2a\x11\xaa\x90\x98\xb1\xdc\xe3\x0d\xe0\x32\x6d\xe9\x09\xf3\x61\xdd\x53\x68\x83\x54\xb0\x4d\x63\xd6\x9b\x46\x10\xdc\xb9\x14\x1b\xbd\x5d\x09\x92\x90\xfd\x2f\xcf\x6a\xfd\x5c\x66\x14\xfa\x84\xa4\x4b\xc8\x64\xe2\x19\x4e\x64\xea\xb0\xaf\x55\x6e\x0f\x3a\xf1\x92\xa7\x92\xb5\x37\xc8\xa4\x62\xb8\x08\xc0\xa9\x9c\xa3\x86\xa9\xb5\x76\xb7\x87\x37\xc1\x65\xb1\x38\xe9\x9f\x55\x1e\xb1\xe2\x1a\xb6\x54\x75\xa9\x61\x8a\xb8\x5e\x85\x1b\xe0\x8b\x14\x40\x09\xc9\xa3\x77\x91\x36\x84\xd5\x48\xda\xf7\x44\x64\x00\x6c\xd3\x8e\x80\x40\x89\x43\x20\xd8\xdf\x20\x4e\xc1\xba\xf7\xbe\xef\x05\xe9\xac\x41\x1a\x90\xa8\x23\xe1\x86\x1e\xa4\x42\x29\x94\xd6\x99\x15\x99\x12\xc8\x98\x2d\x43\x50\x3b\x72\x8a\x3d\x5d\x78\x7a\x37\x16\x66\xc2\xe4\x4b\x9e\xbe\x30\x9c\x81\xaf\x78\xdd\xde\xc0\x63\xa0\xaa\xc4\x00\x3d\x0b\x36\x07\x4a\x9f\xa4\x6b\xdc\x0a\x97\x1f\x52\x34\x68\xbf\xcb\x8d\xa9\x72\xc6\x71\xa2\xe3\x83\xaf\x4f\x49\xdd\x25\x90\x5d\x41\x5a\xcc\xba\x8c\x5c\x7d\x90\x67\x22\xfa\xb6\xfc\x18\xb6\xd8\x35\x5f\xb5\x62\x57\xe2\x72\x82\x1e\x36\x92\x6f\x40\xda\x02\x0a\xe4\xf1\xbc\x7f\xcd\x49\x7f\xbd\xbf\x2a\x00\x03\xb4\x76\x0e\xad\xfa\x5a\x70\x5a\x39\x3b\xe6\xf2\xb0\x4c\xa0\xa5\x7a\x12\xe4\x3a\x4c\x8e\x73\xbb\xc2\x3a\x92\x3d\x19\xc5\x58\x49\xab\x94\xad\x81\xfa\x52\x2a\xda\x06\x58\x10\xea\x97\x8f\x62\xbf\x71\x77\x44\x86\x5e\xf4\xf0\x20\x65\x45\x7b\x0f\x85\x75\x1c\x58\xdc\x84\x82\x40\x0e\x37\xdf\x01\xff\x76\x45\xe1\x7e\x88\xf5\x70\x45\x47\x39\x28\x4d\xfd\x75\x6b\x68\xfd\xb0\x0c\xdc\x5f\xb6\xcb\x47\x26\x9a\x49\xf3\x5c\x5c\x29\xfb\x44\x83\xcb\xca\x51\x4a\x71\xb8\x1e\x44\xe5\x0e\x5b\xd2\xb3\xfc\xdb\xba\xde\x9a\xfa\x28\x92\x0b\x10\xfc\x5c\x18\x45\xb8\xe7\xda\x85\x73\xc8\xa0\x11\x10\x1d\x02\x71\xba\x6a\x09\x3e\x88\x2b\x19\x93\x04\xa4\x47\x9e\x30\xbb\x4a\x97\x19\x4a\xc0\xa9\xfd\xbc\xa2\x11\xa6\xb6\x68\x17\x9b\x9f\x17\xdb\x1a\x17\xac\x5b\x44\xc1\x6f\xc3\x7a\x37\x3d\x5c\x31\x5e\xa8\xc5\x77\xe2\x6a\xc8\xea\xb4\xc9\xea\xd5\x4e\xd7\xd9\x7a\x9b\x37\x58\x13\x97\x63\x78\x5f\x95\x0f\x39\xd5\x35\xf5\x99\x7a\x47\xd2\xeb\x88\x47\x1a\x0c\x79\x8b\x9f\xd1\x59\x9f\xd6\x2a\x9c\xc3\x9d\x58\x95\x7b\xf6\x1d\x65\xcd\x75\x1b\xcc\x93\xaa\x16\xbb\xe9\x0b\x68\x12\x03\xb4\x0c\x00\x94\x5a\x92\xf1\xb6\x68\x00\x5b\x29\x0a\x20\x0a\x87\xe8\x74\x09\xe8\x95\xd2\x65\xb3\x28\xa3\xd1\x5f\x18\x6b\xef\x82\xe0\x45\xec\xca\xad\x8b\xb2\x51\xd1\x22\x21\x23\xed\x52\xc8\x97\x6e\x74\x1f\x4a\x90\x03\xa6\xd8\x91\x3c\xdb\xe0\x6b\x0f\x06\xf9\x7d\x57\x95\x3d\xa8\x5c\x2d\x1a\x4c\xf1\x2b\xcd\x47\x9f\xad\x95\x63\x09\x62\x48\x5c\x68\x98\x15\x78\xa3\x2d\xab\xb0\xda\xd0\x73\xb8\x28\x41\xe2\x21\x55\xc7\xd1\x67\x7e\x48\x73\x6f\xbb\x8d\x7c\xbc\x40\x6c\x52\x18\x31\x2d\x96\x4a\x7e\x49\x64\x06\x7a\xbf\x6f\x2f\x55\xc8\xd5\x23\xc5\xce\x6d\xdf\x82\x28\x19\x71\x4c\xf5\x85\xc9\xb2\x62\xb9\xa5\x45\x05\xff\x85\x7b\x5e\x60\x37\x6a\x4f\xab\x13\x32\xb6\x30\x31\x31\x22\xdb\x38\xbc\x06\x63\x05\xdc\x39\x82\x53\x0e\xbf\xf9\x93\x0a\x5e\xfe\x44\x15\x94\xa0\xcc\x2f\x5a\xc8\x29\x35\x3a\x3b\x6d\xa7\x1f\x2b\x7a\x22\xa3\x16\x55\x57\x0d\x0a\x00\x9d\xe0\xe4\x47\x8e\x59\xde\xb3\xd1\xe2\xd1\x4e\xc2\xc7\xbc\xfa\x99\x04\xb9\x8e\xd5\x0d\x74\xd8\x94\xa0\xd0\xe7\xf0\x2c\x8f\xa6\x30\x55\xb9\x25\x52\x74\x47\x62\x4a\xd7\xec\x97\x6c\x69\x74\x05\xf9\x3e\x51\x90\xa2\xe4\x05\x87\x17\x3b\xd8\x2d\xba\x82\x20\x8d\x28\x32\x57\x21\x9b\x7a\x9d\xd5\x92\x5c\xda\xaf\xc6\xb4\x51\xf8\xa3\x9f\x28\xec\xb9\xdd\xb8\xd4\x2a\xa0\x8f\xbe\x5b\x96\x05\x8e\xff\xd2\x2c\x20\x75\xbf\xd2\x4f\xa8\xca\xf0\x04\x4b\xc6\xfa\x7f\x54\x52\x19\x58\x30\x1a\x3d\x6e\x9f\x37\x45\xd4\x48\xcc\xa7\x38\x60\x02\x19\x41\x34\xdf\xc8\x7c\xb8\x78\x2a\xb3\x85\x61\x3d\xb4\x3d\xab\x1a\xa0\x64\xb6\xa1\xf6\x2d\xcc\x9c\x88\x19\xf6\xac\xd6\x0f\x26\xcf\xcc\xb3\xe1\x8a\xd2\x54\xb5\x8e\x2a\x3c\x50\xeb\xa6\x9b\x1c\x51\x7f\x88\x39\xc7\xd5\x8e\x44\x7c\x47\x00\xd1\x56\x42\x15\x44\x23\x18\xa5\x00\x85\x68\x08\x70\x53\x8e\xe5\x8a\x6f\xa2\x0f\x6e\xe5\x03\x0b\xfc\xce\x27\xcd\xe5\x95\x9c\x4a\x3e\x9d\x17\xe2\xbe\xa4\x08\xae\x63\x2d\x22\x5c\xb3\xea\xa0\x1d\x3d\x67\x01\x64\x99\x97\x4b\x0c\x31\xd8\x15\x90\x35\xfa\xd1\xd8\xaf\x6f\x9e\x80\x85\x34\xe8\xa2\x20\x94\xc3\xca\x48\xdc\x28\x65\x6d\x3c\x61\x97\xc7\xb9\x05\x3f\xcd\x6a\xe5\x71\xf2\x18\xb0\x11\x2a\xcc\x7e\x20\xd0\x6c\x6c\x6b\x51\x7a\x39\xe4\x72\xd7\x14\x8f\x55\x91\x87\xcf\x8a\x45\x59\x6d\xca\x2a\x65\x59\x46\x49\x79\x57\xdb\x15\xc9\x01\x42\x4a\x06\xb2\xfa\x61\x97\x8e\x67\xfe\x0a\x30\xfc\x97\x72\x39\xed\x81\x6d\x77\xa8\x9d\x62\x3d\xb3\x1d\x0b\x1e\xc1\xe2\xb4\xa4\x9e\x0c\xc5\xbe\x9b\xac\xca\x04\x81\x11\x14\xba\x7b\xfe\xa4\x87\x2d\x13\xd5\x42\xec\x2d\x2b\xf4\xd2\x34\x69\x96\x83\xa9\x46\x48\x8f\x7d\x85\x72\x98\x43\xcc\x48\x2c\x4c\x05\xa0\x41\xf0\xa7\xb9\x8e\x2d\xab\x21\x40\x5a\x7c\x95\x69\x8a\xb7\x80\x73\x6b\x51\xd9\xc2\x58\x8f\xa1\x55\x14\xd7\xa9\x40\x47\xfa\x60\x0f\x57\xa3\x03\xf6\x00\x68\x22\xd2\xc6\x38\x3a\xaa\x03\xcc\x02\x3b\xd0\xb8\xc3\x41\x08\x4d\xc9\x66\x1f\xd1\xbb\xd4\x9c\xf5\x74\x53\x0a\xd9\x6e\x3b\xaf\x0a\x89\xa3\x5e\xab\x12\xe0\xae\xbb\xdb\x9e\xcb\x3c\xe0\x18\xec\xf4\xd7\x46\x20\x72\x7e\x14\xf2\x5e\x41\x38\x9a\x7f\x62\x2f\xa2\xbf\xa0\x31\x48\xe5\x43\xfe\x22\x83\x36\xc5\xb6\x00\x47\xbd\x03\xf1\x00\x9c\x19\x69\xa5\x4b\xe0\xba\xc2\x34\x5b\xb0\x73\x5b\x6e\xb4\xa3\xeb\x8d\x60\x6f\x99\xf0\x50\x60\xa0\xf9\xaa\xac\x94\xbf\x34\xa3\x37\xe8\x2c\xbf\x3b\x22\xa5\x75\xfb\x4a\x47\x23\x15\xbc\x6d\xdf\xd7\x7e\x82\x1a\x87\x72\x6d\x90\x15\x12\xce\x00\x17\x47\xac\x1d\x3a\x38\x56\x93\x6d\x05\xe7\x56\x8d\x74\x89\x44\x77\xb0\xcd\x96\x42\x9a\xe9\xa5\xd4\x8f\x65\x9a\x93\x72\x14\x14\x2e\xf2\x8a\x43\x74\x71\x93\x36\x5b\x24\x23\x03\xc2\x14\xbe\xed\xc3\x0f\xb8\xf6\x25\x2c\x29\x41\x1f\x63\x5d\x3a\x17\xa3\x7e\xc2\x92\x4d\xac\x1b\xdd\xd6\x00\x58\x72\x3f\x79\x44\x43\x92\x93\xda\xc7\x78\xe2\xe8\xa3\x90\x46\xe6\x22\xb9\x1c\xdc\xcd\x12\x24\xf1\x99\x4e\x3e\x4c\x07\x37\xda\xb3\x47\x5d\xa1\x94\xda\xe4\x1a\xb8\x8c\x3e\x24\x91\xfd\xde\x14\x88\xa3\xc4\x93\x80\xa6\x47\x3c\x20\x6a\x51\xef\xdc\x26\xd3\x9b\xe1\x7c\x9e\x5c\xe9\x8b\x7b\xc1\xc3\xa3\x47\x83\xcf\x31\x73\x4d\x7d\xfe\x98\x8c\x3d\x65\x93\x9a\xcd\x07\xf6\xfb\xc3\xb1\xfe\x3c\x1d\x02\xc7\x8f\x7d\xde\xe5\xe4\xf6\x7e\x3a\xfc\xf0\x71\xae\x3f\x4e\x46\x57\xc9\x14\xd0\xaf\xdf\x31\xd7\x13\xd6\xeb\x26\x8e\xef\x4c\xf6\x49\x21\xf5\xd9\xc1\x2f\x12\xcf\x4c\xae\xa4\x7c\xa6\x24\x71\xba\xb8\x9b\x03\x3b\x0f\xd4\x22\x27\x57\x7a\x3e\x81\x91\xe9\xab\x45\xee\x16\x1f\x03\x12\x97\x2a\x8d\xd5\xbe\x4a\xe3\x18\x07\x70\x3c\x1f\x4e\x13\xa0\x2d\xd3\x5f\xa5\x2d\x53\xcc\xc5\xe4\xa7\xd1\xf6\x56\xdf\x4f\xee\x02\x06\x33\xfe\x1c\x08\xcc\xb4\x23\x30\x8b\xec\x17\x89\xb1\x4c\xe1\x68\xcf\xe6\x30\x3c\xa3\x91\x1e\x27\x97\xc9\x6c\x36\x98\xde\x0b\xc6\x32\xdd\xcb\x58\x86\x4c\x35\xc3\xb1\x5d\x20\xc9\x27\x3b\xfd\x77\xe3\x51\x32\x9b\xe9\x69\xf2\xef\x77\xc3\x69\xdf\x22\x00\x8e\xaa\x0f\xd3\x04\x06\x52\xcc\xb9\xfa\x3c\x1c\x8d\x88\xb5\x2c\x9c\x78\x47\x6b\xe5\x27\xfe\x5e\x7f\xfe\x38\x01\xda\x24\x00\x39\xdf\xf3\xd2\x98\x26\x0e\x05\x9d\xc8\x45\x6a\xc7\xd3\x2f\xcc\xc1\xc5\xc4\x8e\x80\xa7\x02\x9b\x4f\x60\x38\xec\xf4\x38\xd2\x26\xaf\x87\x3a\x18\xdf\x2b\x2a\x32\x8c\x74\x0f\x37\xd8\x7e\x6a\xb0\xc1\x74\x38\xb3\x4f\xb0\x6b\x90\xe6\xeb\x6e\x96\x28\xbb\xce\xc6\xbc\x3e\xe6\xc8\xd8\x26\x1b\xeb\xa9\xd1\x74\x77\xed\x05\x94\x60\x0a\x5a\x3c\x1f\xe8\x8b\xc4\x7e\x7b\x9a\x8c\xaf\x80\xf0\x6d\x38\x1e\x5c\x5e\xde\x4d\x07\x73\xa0\x08\x43\xaa\x2f\x3d\xbb\x9b\xcd\x07\xc3\x31\x4e\x8a\xed\xef\x64\xaa\xe7\x1f\x87\xd3\x2b\xde\x4b\x0a\x96\xa7\xe3\x16\x0b\x17\xd8\x7c\xa2\x27\xb7\x09\x3c\x12\x16\x9a\x98\x10\xfc\xc6\xec\x28\x24\x13\x53\x38\x7b\x3a\xd8\xb1\xf7\xfa\xe3\x60\x86\xac\x62\x83\xab\x4f\xc3\xd9\x3e\x52\x31\x1d\x90\x8a\xa9\x64\x8c\xdf\xeb\x01\xc1\x2b\xf5\x11\x21\x4a\x03\xb8\x66\x62\xc8\x74\x0e\x27\x7c\x53\xea\x7b\x6b\x57\xc7\xe6\x85\x8f\xb2\x1a\xee\xd2\x80\x5d\xc1\x32\x7b\x9d\x82\x3f\xb5\x91\xd8\x1c\x51\xe5\x45\xfe\x3e\x9d\x87\x8f\x50\x12\x51\x7b\x99\x3c\xb5\xf5\x9c\xdc\x78\x63\xa3\x8b\xb4\xfd\xd2\x4b\xba\x93\xf4\x3d\x70\xa4\x23\x24\x83\x89\xda\x03\x83\x4f\x39\x73\x57\xc0\xb2\x48\x8b\x30\x5c\x29\x2a\x21\x5d\x62\x97\x03\x82\x58\x17\xc6\x01\xd6\xa6\x49\x29\x6f\xe4\x1d\x1f\x07\x87\x2d\x65\xae\x33\xd6\x78\xfd\xae\xd3\x95\x6d\xb2\x6d\x2e\xfc\x58\x61\xc9\x11\x69\xe8\x35\x84\xe3\x01\x1c\x0c\xe5\x49\x50\xd5\xa2\xc4\x3a\x52\x2c\xc9\x40\x48\x1e\x6a\xfb\x51\xde\x09\x08\x63\x30\x8b\x17\x42\x6a\xe1\x51\xf0\x8c\xfa\x09\x82\x23\xe0\xb5\x89\x34\xbc\xd1\x07\xee\xbc\x3f\xd0\x79\x56\x50\x24\x4a\x6d\x4a\xb8\xd9\x20\x43\x2d\xeb\x57\x40\xc8\x9f\x45\xe4\xec\xc1\xbd\x2d\x96\xb1\x52\xff\x6a\x07\x12\x7e\x4b\xa9\x7c\xd9\xf7\x37\x35\x52\x34\x60\x80\x4b\x67\x4b\x93\x22\x94\x07\xc8\x96\xc1\x4f\x8b\xff\xad\x5d\x31\xfc\xaf\xbb\xdd\x6e\xf7\x6f\xfa\x5f\x99\xdc\x01\xfd\x98\x7f\xa3\xbb\xa5\xa8\x9f\x09\xe6\xf6\x27\x57\xcf\x17\xcc\x28\x7a\xb2\xa2\x2c\x8a\xf9\x4f\x55\x0b\xda\xf4\x6a\x41\x6d\x5a\x7f\xc5\x01\x54\xd2\xe1\xf1\xb5\x06\x58\x1d\xdd\xe6\x70\x05\x26\xe1\x10\x49\x7c\xe4\xfd\x5f\x56\xac\x88\xbb\x1d\x96\xc1\x04\xba\x3e\x3d\x95\x1b\xa6\xa7\x6f\x9c\xd7\xb4\xad\xcd\x6a\x9b\xe3\x3d\x84\x0e\x68\x29\x2f\x7d\xff\x93\xab\x4c\xa0\x4c\x9e\x71\x14\xc5\x0e\x1c\x59\xae\x3a\xe7\x6c\x59\x7d\xc3\x31\x3b\x23\x55\xe9\x57\x46\x73\xc5\x8a\x6b\x78\x2b\xaa\x09\xa5\x2d\x57\xa9\xc7\x31\x04\xd0\x8c\xd7\xa6\x48\x26\x15\xfd\xb0\xfd\x64\xaf\x9c\x45\xd9\xf6\x8d\x5f\x2f\x45\x8f\xb4\x28\x45\x57\xbf\xb0\x14\x9d\x6a\xed\xe0\x12\x2f\xe1\x19\x65\xc1\x48\x4f\xc8\xf3\x63\xed\xa0\x5d\x4c\xa0\x4a\x51\x95\x45\xb6\xa0\x3a\xb7\x8d\xa9\xf4\x3a\xcd\x72\x8c\x4a\x06\xb0\x89\x00\xe4\x19\x39\x2b\x47\xe5\x15\xa9\x1d\xc3\xca\xc1\x60\xf3\xec\x0b\xd9\xc4\x97\x27\x53\xa8\xac\x41\x33\x53\x63\x75\x41\x00\x17\x5d\x97\x4b\xf3\x5e\xa9\x0f\x45\xb9\x66\xe2\x32\x5e\xbe\xdf\xff\x18\xe9\x70\x83\xee\x4c\x5a\xe9\x70\x77\x6a\xf9\xcb\x45\xb9\x36\x35\x12\xfa\x0c\x2e\x66\x93\xd1\xdd\x3c\x19\xdd\x4b\x07\xf7\x27\x24\x4f\xc4\xd9\xd7\xcd\x6e\x63\xf4\xff\x86\x2a\xcc\x97\x37\x54\x42\xd5\xde\xdd\x88\xb7\xdc\x51\x72\xe4\xc5\xe4\xf6\x1d\x18\xea\x0d\x37\x3b\x95\x0f\x51\xbd\xa2\xbf\x29\xfd\x24\x5e\xa3\x16\x6f\x64\x03\xa8\x9e\xec\x69\xb7\xb1\xf7\x2f\xc8\x36\x79\x2c\x34\xb7\x0b\xa6\x06\xff\x63\xf1\x86\x97\x2a\x57\x8e\x06\x68\xe4\xe0\x7a\xb7\xaf\xe2\x6a\xb2\x82\x14\x07\xd3\x00\xb9\xd7\x41\xe2\x96\xa2\x40\x0f\x46\x2d\x52\xc8\xa1\xc3\xf5\x09\xee\xfc\xa2\xe0\xa7\xb7\x65\x54\xbf\x83\x31\x73\xd8\xdc\x20\x9f\xb2\xad\xcd\xf1\x22\xcf\x16\x5f\x20\x7e\xbb\x36\xc5\x16\xe8\x0b\xeb\xe3\x63\x6b\x8a\xe1\x82\x5b\x6f\x33\x4c\xad\xba\x4a\xf5\x70\x5b\x02\xb6\xed\xd1\x90\xd5\x32\xeb\x4d\x5e\xee\x4c\xa5\x0f\xb9\x64\xdb\x21\x79\x59\x27\xd9\x54\x20\xad\x08\x5f\xaf\xed\xb5\x3a\x8f\x14\x93\xc4\x34\x25\x24\x7b\x91\x51\x91\x97\x96\xaf\x3c\x39\xf0\x05\x1a\xec\x34\xd8\x5d\xcc\x6a\x3a\xb1\xfe\x68\xb0\x4e\x3f\xd5\x35\xe4\x33\x7e\x42\xc0\x12\xfc\xc4\x2e\xcc\xfa\xbd\x6d\xfb\xae\x5c\xee\x0a\xc3\x5b\x9a\x08\xff\xf9\x2d\x58\x69\xbc\x10\xe4\x3a\x8d\x81\xf0\x22\x19\x56\xde\x72\xff\x5b\xac\xec\x37\xea\x90\x50\x77\xe9\x17\x53\x63\x45\x6a\xad\x09\x1e\x92\xe5\xa6\xaa\x8f\x5c\x78\xeb\x61\xa7\xff\x68\x5b\xa2\x3f\xa6\x8b\x2f\xa6\xb2\x27\xa5\x46\xf8\x06\x89\xe3\xce\x77\xfa\xb2\x2c\x0b\xfd\x6f\x3a\xd2\xa7\x7a\xb0\xa9\xb2\x1c\xc8\x32\xf8\x83\x48\xdf\x32\x3b\x9e\xfd\xfa\xa7\x6c\x61\xfe\x19\xec\x37\xf1\x77\xe3\xc1\x6c\x70\x7c\x1a\x9f\xff\xc3\xe4\xdf\xbf\xa6\xff\x7e\x7e\xf6\xee\xb4\xad\xff\xfe\xfd\xbb\xb3\xdf\xf9\x5f\x7e\x8b\x7f\x76\xf6\xed\xb5\x64\xac\x67\x93\xbb\xe9\x65\x82\x37\xcb\x1b\x7b\x11\xfd\x94\x4c\x81\x6a\xf7\x34\x3e\x57\x48\x92\xdd\xff\xbd\xc3\x03\xf7\xbf\x0f\x8e\xec\x05\x79\x38\x4e\x66\x70\x23\x81\x3b\x28\x5c\xb5\xee\x66\x09\x5c\x80\xa7\x93\xab\x3b\x64\x5a\x56\xb2\xda\x36\x0a\x4a\x6d\xe1\x7e\x22\x2e\xa2\xc4\x14\x7c\x99\x4c\xed\xed\x4b\x3b\x0e\x67\xe6\x16\x57\x93\xe9\xf0\xc3\x70\x3c\x18\x8d\xee\xf5\x34\x19\x25\x83\x19\xde\xd0\xe0\xb6\x38\x86\x5b\x1f\x04\x48\x66\xfa\xc3\xe4\x53\x32\x1d\x43\xab\x07\x33\x68\x4f\x32\x4b\xc6\x73\xf7\x75\x25\xbf\xf0\x21\x19\x5f\xde\xeb\xd1\x70\x06\x9f\x27\xa3\xc9\x67\x7d\x78\xd0\xf9\xc2\xc1\x51\xfc\xea\x8b\x22\xd5\x7d\x53\xe7\x21\x11\x91\x93\x0f\xc7\x73\x7b\x01\xbd\xc2\x5b\xe5\x31\xde\xf7\x2e\x92\x71\x72\x3d\xbc\x1c\x0e\xa6\xf7\x8a\xe2\x0b\xb3\xbb\x0b\xba\x2c\x07\x45\xcb\x33\x1d\xde\xe0\x99\xce\x0d\x88\xd8\x91\x9d\xdc\xb3\xb4\x5b\x97\x71\x32\x4e\x20\x0e\x70\x07\x44\xd6\x3c\x3f\xf6\x7f\xfb\x28\xc0\x8c\x27\x27\x69\x3f\x9e\x66\x99\x79\xcf\xf9\xc9\x91\x1d\x5b\x5c\x06\xc8\x92\x3e\xf4\xbc\xda\xc0\xb9\x0e\x41\xb1\xc9\xb5\xed\x74\x84\x03\x3f\x98\xeb\x01\x11\x70\x0f\x2e\x2f\x93\x5b\x08\x67\x0c\xc7\xfa\xfa\x6e\x34\xc2\x95\x94\xcc\x6e\x27\x63\xba\xde\x32\x67\xdd\xe4\x62\x34\xfc\x30\xc0\x5e\x5e\x4e\xc6\x74\x35\x1f\x8e\x91\x41\xdb\x2d\xca\x58\x29\xc1\xa1\x3b\x78\x34\xc5\x62\xf7\x5e\xff\xaf\xf0\x5f\xcf\x77\x3c\x99\x99\xf3\x24\xaf\x08\xa2\x07\x85\x3a\xbf\xea\x09\xf3\xac\xc9\x4d\xcf\x6f\xef\x6a\x53\xe9\xa9\x79\xb4\xde\x0e\x3a\x94\x53\xf3\xd7\xad\xa9\x1b\xb3\x8c\xf5\x2d\xd2\xdb\x7d\xca\xea\xac\xd1\xc4\x50\xf8\x0d\x6f\xbf\x2d\x33\x3c\x5c\x2e\xc9\x23\xb5\xc7\x6e\xa7\x49\x3d\x8d\xd1\x5a\xc3\xff\x81\x49\xe4\x20\xc1\x20\xd6\x07\x97\x5e\xc5\x85\x4b\xbf\x3b\xaf\x8d\x98\x2d\x97\x69\xf8\x2a\xdd\x92\x16\x52\xb3\x80\x27\x43\x48\x54\xc3\x4d\x07\x4f\xdf\x50\xd6\x1d\x55\x08\x0f\x98\xb2\x19\xd5\x5f\x49\xb6\xbe\xa5\x9d\x9b\x07\x9a\xc0\xa9\x16\x6d\x26\xaa\x82\xca\x28\x76\x36\x32\x21\x62\xe2\xae\x7e\xc4\x4d\x50\x13\x4d\xa9\x75\x9c\x02\x89\x79\x90\x6f\x03\xc0\x94\xf5\xbb\x51\xae\x95\xca\xc1\xe1\xf7\x2c\x80\x31\xf3\xf4\x1c\x97\xb1\x3e\xb8\xc2\xc2\xb7\x03\x81\x53\xb6\x6e\x1d\xf8\x7d\xab\xd6\x4d\xa8\xfd\x08\x57\xe1\xce\xd0\x0a\x85\xe9\x4a\x7c\x14\x2a\x6c\x67\xeb\xf4\x11\x6f\x9f\x3e\xc3\xbb\x34\xcf\x98\xb8\xbd\xc2\x06\xb8\x2c\x03\xb7\x02\x63\x0d\x2c\xef\xcf\x05\xb2\xfb\x9b\xe1\x8b\x76\x54\xb9\xc2\x67\x44\xda\xd7\xd0\xc7\x4a\x25\xb1\x3e\x10\x6a\xc7\xfe\x45\x6d\x5d\x78\x46\xde\xda\xd1\xab\x7b\x5e\x55\x56\xca\x71\x21\xba\x6a\x4a\xc4\x8d\xf3\x23\xba\x0a\xbd\xed\xc7\x38\x6d\x37\x10\x31\x13\xec\xca\xdd\xd2\xa7\x01\xe3\x90\x62\xa5\xae\x63\x7d\x20\xe7\x5c\x2a\xed\x83\x2f\xca\x89\x7b\xa9\xe5\xc4\xc5\x3b\x24\xad\xb5\x34\xb9\x41\x0a\x8a\xaa\xa4\xa2\xac\x7a\xfb\x50\x37\x3c\xd8\x75\x53\x6d\x17\xec\x2e\x0a\x06\x85\xae\xd1\x28\x2b\xee\x57\x6b\xeb\xb0\xcc\x7b\x07\xf9\x48\x9b\x30\x45\x31\x3a\xcd\xda\xec\x3e\xb0\xe0\xae\x7c\x6a\x06\x92\x45\x26\xd2\xa7\x3f\xe8\xbb\xd9\xa5\x3e\x3d\x39\x15\x00\xcd\xc6\x73\x02\xf8\x8e\x76\x06\x99\x2a\xd5\x54\x5b\xea\xda\xa7\xea\x48\xbe\x0f\xb7\x93\xc9\x57\x61\xe9\x7f\x6b\xab\x7f\x88\xf5\x41\x67\x14\xe4\xbe\xe9\x2e\x26\x64\xe8\x24\x22\x50\x09\x03\x56\x6e\x5a\xed\xac\x77\x8d\x24\x2c\xa8\xee\x9f\x97\xde\xd2\x77\xec\x23\x44\xdf\x0a\x20\x74\x5f\xb6\x3f\xd4\x72\x41\x04\xc5\x25\x12\x14\x0e\x66\x8f\x2b\x3e\xb2\xe2\x31\xd4\x98\x65\xb6\xcd\x58\xa9\x8f\x71\x20\xeb\xef\x16\xa1\x35\x40\x2f\x4f\x25\xf3\xc0\xd7\xfd\x6b\x5f\xe0\x0f\xdc\x28\x48\xa2\x68\x7b\x45\x12\xe6\x11\xb0\x44\xf0\xc2\x65\x8f\xa5\xb8\xea\xc1\x57\x75\x17\x02\xf0\x29\x87\x13\xaa\x9c\x22\xd2\x3a\x05\x0c\xf8\x1f\xe1\x1d\x5e\x0e\x40\xce\x2c\x71\xd2\x30\x76\xd1\xde\xda\xec\xca\x8a\xd0\xba\x51\x0d\xbd\x53\x0c\xef\xb1\xb4\x7f\x8a\xf5\xc1\x2c\xcd\x83\xe5\xe2\x4a\xf5\xf7\x35\x1b\x43\x56\x85\x01\xfc\x9a\xc7\xd9\xab\xe7\x34\xdf\xda\x87\x8e\xec\x43\x5b\x3f\x92\x2f\xe8\x2c\xd6\xa8\x2d\xef\x4a\x56\x99\xb4\x08\xb3\x67\x0e\x24\xb0\x4c\xa5\x52\x37\xb1\x3e\xb8\xab\x83\xc7\x06\x18\x21\xbe\x95\xaf\x5d\x0d\xe4\x9e\x8e\x00\x48\x0d\x21\x56\xb1\x3f\xcb\x3f\x4c\x07\x63\xc8\xa1\xa0\x53\x0e\xe7\xf9\x1d\xac\x8f\x71\x59\x1c\x93\x9c\x3a\x72\xc6\xbe\x6f\x4b\x38\xbd\xaa\xeb\x2e\x56\x16\x84\xa4\xc5\x82\x8a\x3a\x02\x8c\xf6\x2c\x2d\x5f\x8a\x00\x63\xc5\x6f\xe9\x9c\x00\x8a\xee\xf4\x84\x0b\xe7\x32\x52\xaf\x9b\x91\xea\xa2\x2c\x8e\x1d\xa9\x7a\x64\x6d\x5f\xbe\x3c\x7e\xc9\xec\x7e\x93\xe8\x46\x25\xd4\x3f\x4d\xf1\x68\x57\x12\xd9\x41\x1f\xde\x4f\x3d\xef\xca\x06\xe3\x4b\xc4\xca\xd7\xd7\xb6\xf7\x30\xa6\xf8\xef\x34\xd6\x77\xb5\x11\x7f\x38\x8b\x83\xcd\x22\x3e\x01\x95\x6f\xbf\xf0\xc5\x27\x6f\x43\x49\x73\xf1\xc9\xbb\xb6\x32\xb8\xf8\xec\x7b\x78\x93\xf5\x2a\xc0\x3f\xc2\xf9\xfc\xef\x39\x97\x68\xab\x5a\x0e\xde\xab\x33\xac\x02\xfc\xea\xdf\x38\xc3\x1d\x53\xf2\x8f\x98\x61\x6b\x97\xc2\x99\x9d\xa0\x74\xb0\x3d\xe0\xe1\xb3\x4b\xc4\x45\xb5\xd0\xe3\x5b\x9a\xd7\x2a\x05\x9c\x98\xbe\x88\x31\x5e\x17\x54\xdd\xa3\x27\xc5\x7e\x89\x0a\x1c\xdf\x37\x6d\x0f\x96\xb5\x21\xda\xf6\x23\x5b\x45\x9a\x18\x71\x10\x37\xf5\x64\x54\xf0\x4b\x64\x2d\xf2\x2e\x54\xb0\x42\xc0\x66\xb1\x13\xc4\xb4\x81\xc1\xb2\x06\x6a\x89\xba\xd3\x5e\xcc\x11\xb6\x68\x39\x5b\x6b\x01\x12\x6d\xce\x9f\x40\xfe\xcd\x80\x30\x54\x3c\x90\x05\x3f\x9d\x52\x7c\xcb\xc1\xb8\xea\x1d\xe6\xac\xf0\x63\x5c\xeb\x41\x0c\xc3\x04\x63\x9d\x53\x20\xd8\x2f\x57\x20\x75\xe4\x7a\x21\x45\x74\x00\xe9\xda\x93\x3b\xce\x42\xa1\x5f\x57\xc9\x2b\x0a\xa3\xed\xd7\xfb\xb6\xa3\xea\xf3\x48\xd9\x8e\xcb\x4b\xaf\xb5\xe6\xac\x73\x04\x06\x3d\x3c\xa3\xab\x96\xe1\xd8\x7b\x6a\x70\xdb\x00\x07\xcb\xe9\x33\xf9\x7e\xe6\xf4\x87\xe3\x65\xc9\x56\x83\xe7\x0b\xbb\xb4\x71\xcb\xf3\xfc\x23\x32\x28\x7d\x7e\x32\x05\x04\x9f\x53\x31\x70\x3e\x9e\x5f\xa3\xb6\x83\xfc\x43\xbf\xe9\x68\xb1\x66\xf8\x56\x71\xbb\x03\x46\x2e\x41\x88\xb4\xa7\xbf\x3f\x59\x0f\x0e\xb8\x7a\x02\xe9\xcc\x5f\xdc\x32\xa6\x71\x5a\x95\xd5\x5a\x89\xd0\x7d\xe0\xf6\xb5\x14\xc6\x91\x42\x07\x91\xb2\xad\x8a\xd1\xca\x98\x7c\xa7\xd3\xe7\x34\xcb\x51\xe0\x06\xd8\xbd\xec\x8f\x98\xaf\xe4\xdb\xba\xd7\x93\x96\xb2\x1b\x85\xf8\x00\xdb\xaf\x05\xe9\x05\xa1\x06\xb2\x4e\x8b\xc2\x5e\x00\x61\xfd\x38\xc8\x70\x4f\x65\xb3\xea\x56\x36\xb3\x9f\x85\xb7\xf5\x24\x34\xf0\xd0\x13\x53\x04\xa4\x9e\xc2\x38\x77\x59\x5e\x80\x66\x1e\x44\xb9\x91\x22\x08\x21\xac\x7b\x4e\xe3\xff\xe8\xf3\xec\x81\x12\xb1\x36\xc8\xc6\x23\xa5\x23\x3b\x2f\xcb\x88\x47\xcb\xd5\xa2\x28\xe9\x9e\x13\x36\x3d\x6b\xb2\x34\xef\xd4\x19\x38\x54\x70\x80\x3b\xab\xcc\xba\x24\xc8\x82\x7a\xa8\xd2\xc5\x17\x63\x2d\x8c\x63\x98\xfb\x4f\xa5\xfe\x63\xfe\x7a\xff\x45\xb6\x77\x69\x2f\x04\x2c\x6f\x09\x41\x0d\x56\x38\x41\x4d\xe9\x7a\x9b\x16\x8d\x9d\xe3\xee\x20\x38\x29\x14\x68\x14\x11\x64\xc0\x4a\x60\x62\x15\x78\x2e\x46\x13\xd2\xda\x5e\x7a\xd0\xe0\x7c\x7d\x3c\x21\x4f\xc8\x3c\x29\x3d\xd7\x26\x3f\x0c\x90\x8c\xef\x1b\x05\x1d\x2a\x2e\xfc\x9f\xf7\xc9\x60\xfa\x7f\xb5\x74\x8c\x44\x43\xd2\x5a\x39\xdd\x29\x1c\x89\xf6\xed\x6b\x9f\xf4\xc1\xdf\x30\xd8\x8b\xec\x39\xcb\x81\xfb\x38\x85\x02\x89\x22\xdf\xc5\xbd\xf7\xc8\x5f\x3c\x3a\xca\x2d\x92\xbf\xc7\xe8\xa8\xb4\xd6\x5f\x1d\x9d\x71\x29\x73\x62\x35\xc6\xcc\x7c\x54\x00\x9f\xad\xe8\xd9\x68\xd7\x21\x62\xa9\x4f\x7f\x88\x40\x8e\x0c\x05\x3b\xec\x20\x4b\xd5\x78\x39\xd4\x97\xb4\xf3\x65\xdc\x0d\x69\xa5\x9e\x52\xbb\x12\x4d\x95\xfd\x17\xd2\x0e\x06\x81\x94\xde\x8d\xad\xd2\x76\x20\x50\x3b\xa3\x48\x44\x42\x3b\x0e\x28\x84\x1a\x5d\x0d\xc2\x8e\xdb\xb1\x3b\x05\xe6\x8e\x6c\x1c\xf1\xda\x31\x7f\x10\x9e\xf3\xb5\x14\xb9\x9d\x7a\x9e\x3a\xeb\xf0\xf2\x1b\xc3\xf7\x70\x81\x7d\xe0\x63\xe8\x21\x54\xd1\xae\xb2\x3c\x17\x17\xb6\x16\x6d\x52\xd4\x19\x24\xe5\x5d\x16\x80\xf6\x1c\x9a\xf8\x31\x8e\x90\x29\xc3\x5e\x60\xf3\xf2\x11\x3e\xa0\xea\xb8\xa5\xa9\x17\x55\xf6\x40\xe7\x93\x1f\x4f\xac\x39\x57\x6d\xa2\xb4\xd6\x97\x22\x47\xc6\x64\xea\xa0\x25\x69\xdd\x1a\x46\xeb\x06\x06\x3f\x24\x87\xa5\xe6\xa1\x11\x73\x1b\x4c\xa8\x6c\x52\x67\x2e\x23\x60\x8d\x76\x35\x6b\x0f\x3b\x19\x4b\x03\xb0\x2f\x1e\xf3\xee\xb4\x68\x7b\xa2\x44\x10\x15\x05\x51\x51\xa9\xcb\x08\x06\xae\x1b\x4f\x73\xd5\xe2\x7d\x11\xa1\x58\x4f\x8a\x85\x51\xd4\x3b\x00\xe8\xa3\x7f\x18\x31\x1d\x2b\x55\x5a\x55\x06\xa3\x1d\x40\x42\xf5\x5c\x7e\x81\xd5\x7f\x15\xeb\x41\x38\xab\x54\xf0\xe1\x6f\x4b\x2d\xd3\xb3\xe7\xc6\x44\xd2\xd2\x69\xf7\x07\x2e\x9c\x82\x8e\xf8\xbe\x1b\x97\xf4\xba\x9c\x92\x3b\x59\x1c\xe2\x18\x29\xb7\x0d\xc5\x47\xa0\x8e\x5e\x56\x5d\x3b\x41\x46\xdf\x13\x88\x37\xd9\x57\x82\x39\xc7\xc6\x60\xbc\x77\xa0\x03\xd9\x6a\x78\x13\xf8\x38\x3d\xc2\x8d\x7b\x8e\x70\xa2\xdb\x23\x22\xdd\x75\xd9\x80\x46\x4c\xa4\xd3\xe5\xb3\xa9\x1a\x12\x9a\xe4\xda\xb4\x75\x6a\x57\x5a\x9a\x73\xbe\x60\xd7\x92\xf8\xaa\x55\x5a\x68\x53\x2c\xcb\xaa\x7e\x25\xf2\x47\x67\x1e\xbc\x31\x03\x67\x99\xfb\x50\x3a\x5d\x42\x7b\x8d\xb3\x8b\x8a\xa9\xef\xe5\xca\x71\xdf\x8f\x34\xa7\x16\x6c\x53\x6a\x63\xbe\x68\xef\x6f\x09\xc9\xc8\x74\x69\x8f\x90\xf4\x91\xaa\x7a\x8d\x5e\x51\x64\xb5\xd3\xb6\x37\x35\xb1\xdc\x86\x0d\x7b\x53\x93\x84\x78\xb6\xe1\xc1\x54\x7d\xa1\xeb\x21\x00\x80\xcc\x6a\x55\x56\x78\xef\xb7\x87\x8b\xde\xd6\xe9\x23\x3a\x27\xeb\x34\x43\x29\xac\x74\xb1\xd8\x42\xfc\xbc\x32\x8b\xb2\x5a\xd6\x2d\x3b\x2c\xa2\xcd\xe1\x6d\x3d\xd2\xdb\x0d\x88\xf8\x2d\x4c\xb6\xd9\x1b\x8d\x8a\xb0\x10\x8b\xd2\x58\x0a\xe0\x3c\x8f\x59\x6d\xf7\xcc\x9e\xa8\xeb\xc3\x4e\x3f\x67\x75\xe6\xc0\xfa\xfe\xc4\x7e\x31\x0f\x75\xd6\xf4\x24\xab\xe2\x60\x78\x1c\x1c\x11\xe5\xfd\xd3\x3c\x70\x86\x9d\x1c\x9c\x77\x5d\xed\xaa\xac\x01\x14\xc4\x31\xb3\x5a\xe3\x11\x4f\xdb\x4f\xae\xec\x6e\x5e\x4a\xb8\xeb\x54\xb5\x27\xfa\xcb\x66\xcb\x3f\x02\x1b\xd3\xd3\x71\xfa\xe6\x8b\x79\xd0\xb6\x9b\x7e\x9d\x21\x17\x15\x21\xcb\x98\xf6\xa3\x7d\xd8\x28\xf5\x1f\x03\xc1\xe8\xe3\x6f\x62\x2b\xaa\x8f\x03\xbe\xb9\xd4\x3f\x7e\x05\xf7\x1b\xcc\x2a\x22\x87\x70\x91\x35\x65\x45\x32\xa7\x5c\x31\xef\xeb\x47\x98\x58\x02\x64\x19\x37\x9b\xb2\x22\x07\x03\x9f\x61\xe7\xa7\xd3\xa5\xff\x54\x7f\xaf\x55\x28\x6e\x82\x7f\xfb\x2a\x44\x62\x43\x18\xdc\xae\x8b\x0b\x67\x90\x39\x5e\x53\x2d\x17\x20\xbc\xbe\x9e\x55\xcd\xb3\x1a\xa9\xa4\xad\x37\x65\x47\xfb\x5d\x7c\x1d\x47\xad\xf5\x2b\x96\x61\x67\x0d\xeb\xee\x1a\x56\xbf\x6e\x0d\xeb\x9e\x35\xac\xfe\x86\x35\xac\xbb\x6b\x58\xed\x5b\xc3\xbf\x6a\xf0\x14\x0e\x9e\x6e\x0f\xde\x57\x17\xfc\x87\x1e\x2f\x33\xd0\xa4\x4d\x1b\xc6\xcd\xd6\x1d\xbf\x21\xac\x45\x55\x61\xa0\xcc\x57\x79\xda\x3b\x80\x53\x2b\xe6\xc0\xd3\x73\x56\x82\x3e\x07\x64\xad\x7f\xc6\x92\x3d\xa1\xa0\x1a\x29\xaf\x56\x59\x47\x58\xb1\xc4\x01\x85\x2d\x90\x39\xd9\xa7\x31\xab\x04\xb4\x50\x76\xe1\x09\x38\x59\x56\xab\x6c\x01\x63\xed\xa9\x0b\xc1\x07\x81\x81\xa0\xbf\x61\xe2\x96\xa3\x65\xad\x33\xe0\x63\xf7\x4c\xc6\xca\x37\x38\x98\x90\x6d\x8b\xa8\x9b\xdb\xc4\xc9\x91\xc3\x08\x47\xbc\xd7\x23\x95\xb1\x7a\x36\xa3\xad\x9d\xac\xb4\x24\x31\x80\x87\x17\xc4\xc3\x51\x31\x1d\xe0\x54\x72\x3d\xab\x5e\x57\xa7\xd3\x58\x82\xe1\x3f\x71\x16\x12\xea\x57\x81\x92\x04\x9d\xa8\x07\xf3\x94\xe6\x2b\xd8\x24\x76\x4e\x4a\xfe\x4b\xef\x61\x1a\x66\xc4\xbd\x48\x34\x86\xe8\x02\x2f\xc9\x49\x8f\x64\x8d\x4e\x1f\xea\x32\xdf\x36\xc6\x55\x32\x3b\x9d\x03\x08\x6b\x76\x47\x49\xb7\x47\x49\xf5\x8d\x92\x5d\x7f\x30\x03\x3c\x75\x69\x23\x33\x1a\x79\x59\x98\x58\x5f\xe3\xfa\x88\xf0\x55\xbe\x81\xb0\xce\x6a\x2a\xe5\x27\x95\xf0\x9e\xc3\xc4\xf1\x6c\xb6\xba\xec\x68\x3d\x5c\xc3\xec\x7d\x63\x5b\xf9\xa0\xeb\x1a\xbd\xf4\xca\xd4\xdb\xbc\x91\x0c\xe1\xaf\x74\x53\x3c\x4d\x74\x2c\x6c\x39\x66\x16\x3b\x6b\x12\x6e\xd9\xad\x94\x31\x14\x61\xaf\x1f\x30\x38\xdf\x71\x13\x01\x01\xee\xd2\xfe\xee\x84\xfa\x7a\x76\xdf\xb3\x8c\x84\x44\x93\xb0\x22\xe5\xfb\x91\x12\x2d\x2b\x1e\x73\xc3\x1e\x60\xb7\x24\xda\xb4\x03\x5b\x76\xd5\x28\x88\x6d\xf5\x01\x19\x74\x17\xc8\xe0\x62\x96\xac\x1b\x2a\x9a\x90\xd5\x2a\x60\xad\x69\xed\xee\x3f\xda\x7b\x7c\x63\x47\x02\xd4\x59\xb0\x9a\x71\x27\xc5\x5a\x89\x6a\xce\x11\xcf\xc8\x30\x24\x50\x5d\x40\x2e\x66\xb3\x6d\x54\x59\x04\x44\xca\xe6\x67\xdb\x52\x76\x80\x1f\x41\xa0\xd7\x3a\xb7\x66\xf1\x54\xc0\x01\xb3\x4c\x9b\xd4\xa3\x2d\x82\x58\x84\x42\xce\x64\xb8\xde\x02\xa6\xd9\x91\xef\xd1\x53\x3b\xb4\x3e\x2d\x7d\xf3\x58\x5f\xa7\x59\xbe\xad\x8c\x08\x57\x3a\x54\x70\xeb\x21\xcc\xd0\x0c\xeb\xd4\x9e\x1e\x55\xb6\x26\x86\x20\xde\x73\x18\xc8\x86\x77\xe4\xe9\x4b\xdd\x17\xb4\x29\x08\x76\xd1\x3e\x39\x3c\x05\x91\x97\x06\x7e\x30\xca\xb1\x5e\x15\xe4\xf0\x43\xa6\x9e\xff\x0a\xa7\xa7\x3b\x9e\x81\x15\x67\x09\x33\x05\xd0\xee\x90\x09\x48\x39\x09\x63\x67\x50\xc2\xfe\x89\x88\xbf\x13\x78\x9d\xea\xc9\x75\x5b\xb7\x75\x34\x1c\x30\x26\xee\x27\xfd\x79\x30\xfc\x94\x4c\x51\x37\x76\x7c\x95\xdc\x8c\x85\x7a\xc9\x00\x82\x3f\x9f\x69\x3b\xbf\xef\xc5\x04\xea\xa1\xab\x06\xbd\xd2\xed\x12\x50\x59\x61\xa2\x5e\x2d\x03\x8d\x7c\x11\xe8\x64\x0a\x88\xc8\xbb\xf9\x64\x7a\x2f\x4b\x42\xdb\x65\x79\x6a\x3e\x89\x82\x37\x20\x28\xb0\xb7\x91\x50\xe6\x78\x39\x19\x5f\x4f\xa6\x50\x54\x07\x05\x85\xdc\xd1\x59\xa4\xf6\xa8\xdc\xf6\xc8\xda\x7e\x5d\xc0\x56\x4d\xa6\x50\xd3\x7b\x35\xb9\xd1\xd7\xd3\xc9\x8d\x96\x42\xb6\xbf\xa8\xc5\xea\x22\xd1\xc9\x74\x4a\xcf\x73\x80\xc8\xf0\xd7\x57\x93\xcb\x3b\xfb\x64\xd2\xeb\x1d\x5e\xbb\xe9\x88\x82\x6e\x2b\x2a\x6d\xed\x80\x3a\x5b\xd0\x47\x7d\x35\x49\x66\x76\x9c\xed\xd8\xc3\xfb\x6e\x06\xe3\x71\x32\x8d\xa0\xdc\x72\x3e\x9c\xdf\xcd\x13\x35\x18\xeb\x64\x7c\x35\x99\xce\xf0\x27\x7d\xf8\x54\x07\xdf\x9c\x0e\x01\x02\x4a\x39\x27\xae\x06\x9e\x26\xb3\xbb\xd1\x7c\x16\x29\xfc\x1f\xc3\xf1\x07\x7d\x95\xcc\x86\x1f\xc6\xb3\x48\x7f\x1c\x4c\xaf\x10\x15\xea\x86\x83\x50\xc0\xb3\xb0\x2a\x95\x8a\x5c\x31\xb3\xe5\x1e\xa4\x60\xd4\xef\x66\xc9\x5e\x1c\xab\xbe\xbe\x9b\xda\x07\x44\x3d\xcd\xe6\xad\x33\xd3\x83\xd1\x48\xed\xdf\x3a\x7a\x9a\x7c\x18\x4c\xaf\xb0\x70\xda\x23\x6f\x3d\xa2\x15\x66\x02\x10\xbc\x88\x2f\xf5\x98\x63\xf1\x25\xfb\x50\x09\x8e\x1d\xce\x69\x13\xc5\x07\x90\x10\xf9\x9c\x66\x90\x0d\x2b\x96\x7a\xc8\x67\xe8\x7b\x31\x9a\x30\x6d\x50\xb6\x0c\x1b\x19\xc6\xc6\x3e\x73\x60\x27\x9e\xba\xf1\x61\x30\x1c\xcf\xe6\xea\x55\xc4\xb1\x1e\xce\x11\x10\x3b\x05\xc1\x66\xec\xed\xec\xee\x42\xfc\x09\x30\xba\x9f\x93\xd1\x48\x0d\x66\x7d\x33\x1b\xdb\x1e\xbb\xff\x7a\x33\x7b\x6d\x06\x78\xfa\x15\x2d\x31\x31\xae\x91\xbe\x4a\x6e\x06\xe3\x2b\xfb\x3f\xb8\x2c\x38\xf9\xf3\x6d\x32\x9e\x21\x98\x98\xea\x6a\xb9\xca\x17\xe6\x1a\x2a\x5f\x01\x2f\x1e\x14\x10\xbb\x92\x60\xf8\x92\x5b\x42\x17\x00\xf6\x9e\x20\xc2\xd8\x2f\x3f\xfb\xa5\x48\x76\x40\xbd\xd2\x01\xf1\x45\x3d\xfb\x68\x47\x9b\xad\x27\x8e\xff\xc7\xc9\xe8\xca\xae\xe3\x1b\x28\xcc\xb6\x93\xff\x77\x19\x7a\x8d\x43\xaf\x5a\x43\xff\x2a\x1d\x00\x70\x00\xc8\x79\x99\x4d\x46\x76\x02\x6e\x92\x2b\xe4\x15\xb0\x23\x05\x95\xbf\x37\x83\x39\x60\xe4\xa1\x3f\x17\x09\xd5\xdb\xdf\x24\x57\xc3\xc1\x3c\x89\xec\xe2\x19\x0d\xe6\x20\xfb\x3a\xb7\x2f\x18\x0f\x18\x66\xdf\x01\x4f\x3b\x04\x11\xc9\xc4\x42\x0d\x31\x1c\x28\x73\xe2\x94\x84\x4b\xed\x3c\xcc\xcd\x72\xec\xb9\x87\x08\x0f\xf3\x0a\x10\x54\xf0\x74\x99\x21\x19\x60\xb6\x0a\x42\x2f\x2b\xac\x24\x2b\x91\x19\x6f\xe7\xa0\xb6\x7b\xd8\xfc\x30\x75\xea\x7f\xb4\xad\x48\x0c\x05\x79\x8d\x89\x5b\x0f\x9e\x02\xde\x57\x56\x35\x3b\x7d\x78\x7e\x72\xa4\x97\xe9\x0e\x5c\xc6\x07\xb3\x28\x51\x78\x05\xd2\x10\x8c\x65\x08\x7e\x1f\xeb\xbb\x4d\x59\xb8\x2e\x10\x09\xb5\xf0\xe5\xbd\xb3\xbe\x5e\x9b\x25\x29\xf7\x2c\x20\xe8\xb2\xad\x4d\xe8\x87\xbe\x92\x04\xc1\x74\x8b\x87\x12\xd4\xfb\x20\x2b\xc4\xd9\x95\xef\xdc\x68\x93\x27\xfc\x50\x19\x60\xc4\x7e\x14\xad\x43\x47\xa5\xde\x56\xcf\xcc\xcf\x0d\x3d\x14\xbd\xe9\x05\xc6\x5e\xc4\x7a\x66\xef\x16\xe4\x64\xbd\xd7\xc3\x55\xe8\x7c\xf6\xa4\xe9\xa1\xac\xb1\x9f\x57\x4d\x11\xaf\x9a\x4f\xcd\xe6\xe9\x8b\x70\xa4\x00\xea\x81\x6a\x75\xb6\x23\x9e\x70\x8c\xe9\x12\x8d\xbb\x61\x11\xef\x22\x70\x98\x2e\x3d\x84\x79\x3f\xc6\xf7\x32\x86\x8a\x77\x7a\xef\x28\x7d\xe9\xac\x61\xe7\xcc\x09\x6f\x3c\x4c\xbf\xad\xcc\xd2\x54\x69\xae\xf2\xf4\xc5\xb3\x67\xdb\x1f\x71\x20\x46\xc0\x41\xb1\x60\x37\xe4\x50\x8c\xf4\xd2\xe0\x90\xb3\xca\x99\xe4\x54\x6b\x61\xb2\x10\x20\x69\xd2\x82\x10\x92\xf6\x36\x2c\x9c\xfe\x70\xc7\x45\x01\x2b\x21\xe5\x62\xcd\x52\xc8\x0f\x11\xa3\x24\x26\x2d\x12\x94\x6e\xb8\x73\x9a\x8f\x59\xf1\xd8\x19\x0f\x8f\xd9\x25\x5c\x25\xfe\x68\x2b\x7f\x04\x5b\x4f\x50\x3a\x06\xef\xd2\x95\xc9\x49\xde\xa7\x74\x01\xc8\xbd\x58\xd2\x62\xe9\xf2\x16\x18\x78\x34\x55\x6d\x96\xd6\xd1\x76\x0a\x23\x40\x68\x85\x0c\x64\x04\x51\x79\xf0\x9c\x9d\x5c\xab\xe7\x93\xfa\xcb\x6d\xbe\x23\xae\x66\xbf\x3b\xfc\x38\x24\xb1\xbe\xc8\xf0\x42\x35\x80\xba\x57\x58\xe1\x17\x3b\x62\x65\x65\xda\x18\x54\x1e\xfe\x0a\xe2\x56\x89\x79\x0b\xac\xc2\x6a\x95\xd9\x15\x09\x09\x50\x7e\x09\x04\xa2\x32\x9a\xbf\x00\x64\x04\xdc\xe2\xdf\x04\xd9\xf3\x0a\x36\xad\x98\x02\xdd\xf6\xd0\x1c\x29\xd6\x19\xea\x7b\x26\xb1\x94\x42\x0e\xa1\x1d\xa9\x7b\x0f\x34\xca\xfe\xa9\x5c\xe5\xbc\x27\x92\x8f\x34\x0d\x0f\x46\x61\x32\xce\xe7\xa9\x04\xcb\xb5\xcc\x0c\x3d\x03\x88\x1c\xe3\xa5\x75\x4f\x84\xf4\x9f\x51\x1b\xf9\xff\x85\x7f\xf1\x77\xb7\xa9\x5d\x81\xc7\xdf\xc7\x27\xf1\xc9\x3f\xa6\x06\xf4\xf5\xfa\xcf\x93\xf3\xb3\x93\xb7\xad\xfa\xcf\xf3\x77\xe7\xe7\xbf\xd7\x7f\xfe\x16\xff\xe6\x4f\x46\xe3\x0a\x68\x33\x2e\xc0\x82\x50\x32\x38\xfe\xde\x43\x7d\x4b\x64\x08\x50\x6a\x86\x50\xb2\xcb\x72\x69\xde\x13\xae\x8c\x88\x2d\x38\x82\x92\x9b\xc6\x17\xbe\x03\x6b\xff\x13\xd6\xe5\x64\x42\xfd\xdd\x1e\x9b\xab\xca\x18\xa8\x5b\x61\x72\x72\x50\x06\xe7\x37\x8a\x60\x1f\x92\xb9\x7d\x21\x3c\x5c\xd6\xc4\x7a\x86\x64\x78\xe0\x3b\xbe\x77\x04\x35\x68\x4d\xf0\x4c\x04\x11\x06\x52\x3e\x65\x32\xb8\x65\x89\x61\x52\x0c\xd0\x90\x4f\x29\x5b\x05\xa4\x9c\xc8\x3c\xeb\x79\xe3\x1d\x6d\xaa\x28\xd9\x59\x04\x19\x04\x59\x75\x0e\x3a\x35\x9e\x60\x55\xa1\x52\x51\xeb\x37\xc0\x6b\x22\x99\xef\x1f\xca\xe6\x09\x3d\xef\xd3\xd8\xe7\x07\x0c\xa1\x40\xd0\x6e\x7b\x1c\xa6\x1b\x0f\x0e\x16\x0a\x5d\xe8\x33\xcf\x6d\x8c\x95\x56\xad\x2e\x42\xaf\x89\x0d\xd4\x05\x2c\xc5\xa0\xc3\x59\x02\x9f\x2b\xf1\xd4\xf3\xa0\x55\xc1\xc4\x50\xd5\x9f\x75\x6c\x36\x79\x09\xf4\xfa\x90\x5b\x8c\x30\x05\x52\xf4\x8c\x33\xca\x02\x24\x08\x0d\x74\xec\x3d\x2f\x4f\x40\x48\x50\xb7\x45\xd3\xfc\x9a\x21\x2a\x7c\x10\x0e\x91\x82\x9b\x41\xbc\x7f\x55\x56\xeb\x08\x1f\x84\xee\xe0\xcf\x9e\x62\x34\x97\x2a\x96\xad\x29\x41\x7d\x09\x58\xcf\x80\x93\xcc\xa1\x4a\x0d\x65\x48\x80\x0e\xff\xaa\x0c\x71\x0e\xa8\xe1\x8d\xf3\x9b\x3e\xa6\x59\x51\x37\x5c\xa9\x93\x2e\x16\xec\x33\x88\x0e\x20\xa2\x5e\x91\x38\x53\xb9\x6d\x78\x7a\x23\x51\x61\xd8\x37\x3d\x50\x8b\x05\x8b\xd0\x85\x7e\xc5\xe2\x42\x22\xa3\x9e\x7d\x13\x39\x46\x4d\xe6\x8e\x0f\x80\xaa\x8e\x18\x41\x4a\xa7\x28\x2f\x97\xe2\x5b\xe7\x51\xa1\x8c\x59\x85\x34\x1d\x10\x99\xf7\x50\xf4\x02\x77\x6e\x80\x17\x45\xa6\xcd\xf0\xf5\x76\xbc\x79\x3e\x42\x06\x5e\xb8\x03\xe4\x95\x49\x97\x3b\xa7\x15\xad\x02\xca\x28\x4d\xd7\x30\x94\x4c\x23\x10\x0b\x7a\x14\xe1\x3c\x83\xba\x4c\x56\x3c\x02\xbf\x1f\x73\xb1\x23\x57\x38\x36\x6d\x5b\x7c\x29\x20\x61\x9b\xef\xe0\xd6\x04\x1d\x3f\x8d\xf4\x19\x2c\xdf\x73\x16\xbd\x11\xa3\x9b\xd6\x3e\x00\x0c\x48\x91\xa6\xdc\xe8\x65\x49\x33\x83\xa6\x05\xbf\xe0\x16\x80\xdb\xe9\x74\x01\x3d\x3f\x71\xf7\xce\xdc\xa4\x95\x75\xef\x81\x86\xf3\xa1\x2a\x09\x27\x6c\xcd\x57\xac\xd4\xbf\xfc\xcb\xa0\xd6\xab\xb4\x62\xac\x9b\xbd\x75\x20\x68\x2d\x6a\xed\x0d\xe0\x68\x01\x46\xd6\x3a\x72\xcb\x4b\xca\xb2\x46\xaa\x6f\xd1\xcb\x44\x7f\x0e\x12\x7d\xa4\x0f\x6d\x97\x23\x27\x8f\x96\xe9\x3a\x7d\x64\x5f\x1e\x1c\x3b\x15\xbe\x9c\x15\xe1\x5d\x3f\xf9\x97\x5f\x32\x2c\x01\x14\x5b\x25\xfe\x97\x7f\xf9\xdd\xb5\xfb\x27\xfe\x8b\xbf\x9b\x7d\x1e\xfd\xe3\xa8\x3f\xe0\xdf\x57\xfc\xbf\xb7\xa7\x67\x1d\xfe\x8f\xb3\x1f\x4e\x7e\xf7\xff\x7e\x8b\x7f\x73\xc7\x24\xeb\xd2\x82\x08\x35\x08\x15\x58\xb6\x35\xb8\x05\x52\xac\xc7\xa7\x50\xc1\x78\xfb\x12\xbb\xc0\x16\x30\x02\x3a\x28\x70\x75\x06\x81\xa2\x24\x2d\xad\x61\xe5\x70\x15\x6d\xec\x23\x32\xe2\x56\x86\x92\x9b\x59\xc1\x2c\x3f\x99\x93\x05\x4e\x49\xbb\x85\x74\xf6\xa5\x5e\xbb\x53\xed\x26\xa0\xa1\x3c\xab\x6a\x48\x8f\x75\x22\x06\x91\x33\x62\x20\xc2\x83\x05\x67\x00\x95\xc8\xbc\xdd\xf7\x6a\x19\x04\x7a\xc5\x6b\xfd\x7f\x99\xa5\x1d\xb7\x3a\xac\xec\xab\xbb\xf6\xd2\x01\x18\xdb\xe4\xbc\x59\xe5\xe6\x06\xa0\x0e\x2c\xbc\xe5\x1d\x5b\x1a\x75\x38\x5a\xe0\x00\x64\x44\x30\x46\x5a\xdb\x22\xce\x00\xdc\x34\x2f\x7c\x58\xda\x83\xc2\x9e\x38\x50\x59\x81\x2a\x34\x4e\x96\x12\x0b\xaa\x37\x29\x56\xcd\x7a\xb2\x41\xc7\x18\xb8\xc3\x1a\xac\x58\x29\xc9\x5e\x8a\xf1\xe6\xf9\xc7\x44\x0f\xee\xe6\x1f\x27\x53\x08\xf3\xbb\xa4\x88\xfd\xef\x80\x34\x94\x39\x41\xee\x91\x3a\x74\x38\x4d\x2e\xe7\x91\x1a\x8e\xe9\x7f\xf5\x91\x85\x46\xbf\x84\x2d\xd4\x87\xfd\x87\x33\x99\xce\x99\xcf\xda\xb9\x36\xca\x45\x5d\x25\xd3\xe1\xa7\xc1\x7c\xf8\x09\xc9\x4d\x90\xa7\xc4\x76\x4d\x0d\xaf\x83\x6e\x7d\x1c\x7c\x4a\x7e\x21\x0d\x67\x2c\x1f\xa0\x82\x6c\x91\x7d\xa2\xcb\x63\x8e\x46\x3e\x73\x25\x93\x84\xc3\x80\x55\xd5\xe5\x50\xd5\xaf\xa2\xd5\xdd\x9f\xfc\x54\x9c\xfc\x84\xe4\xc5\x78\x32\x3e\x96\x49\xcf\x38\x1c\xcb\x20\x65\x0c\xd4\x3d\x2e\x71\x7c\x31\x98\x0d\x21\x1d\x7b\x15\x0c\x5c\xa7\xdf\x30\x92\xe3\x89\xa8\x6c\xb3\x2b\x83\x59\x89\x6f\x06\x40\x8a\x33\x18\x5f\x26\x91\x9a\xdd\xdd\xde\x4e\xa6\xf3\x48\xdf\xdd\x5e\x0d\x80\x9a\x26\x19\x7f\xb4\x1f\xd9\x96\xcd\x60\x12\x25\x91\xd0\x2c\x56\x92\xd1\xe7\x6e\x96\xbc\xe7\xdb\x10\xd8\xa6\x45\xe0\x96\x79\xff\x45\xc2\x89\x1c\x4e\xe1\xd1\xc5\xb8\x50\xc7\x48\xc4\xbc\x30\x4e\x0c\xcc\x86\x10\x04\x3e\x98\x7a\xf5\x01\x2c\x90\x38\xd0\xae\xf4\x2a\x28\x12\x02\x0f\x2a\xac\xfe\x07\x89\xb6\x90\xac\xe1\x1a\xa3\xcc\x7a\x60\x1b\x5c\x67\x44\x0f\xe3\x60\x66\xfa\xf0\x7a\x30\xad\x8f\x74\x56\xa8\x4b\x02\xd1\x9d\xc5\x67\x67\x3f\xc4\xa7\x3f\x42\xe1\xc8\xe1\xd9\x51\xbc\xaf\xdf\x66\x7f\xb7\xd5\x95\xd9\xa4\x55\xc3\x61\xdc\x2b\xb3\x72\x3a\x3b\x82\x81\x83\x43\xe4\x8b\x3c\xad\x6b\x0c\xca\xa6\xb5\x3e\xb8\xf4\xb0\xe7\x4b\x22\x6b\x50\xbe\x72\x9e\x7d\xcf\x5f\x38\x86\x7e\x64\x54\x56\x68\xea\xeb\x19\x76\xf6\xf8\x87\x93\xd3\x73\xec\xee\x29\x48\x02\x5e\xd9\x41\xe9\x22\x65\x10\x96\x59\x99\xc7\x12\x42\xf2\x50\xd9\x40\x36\xd6\x63\xec\x5a\xc0\x14\xa4\xae\xb0\xb7\xb0\x1a\x8a\x88\x01\xcf\x09\xc7\x1a\x0d\x98\x3f\x2c\x15\x1e\x96\x7d\x6a\xb6\xb5\x2c\x1b\x84\x9b\x88\xcb\x42\x89\x4c\x05\xf3\xfa\x43\x17\xa5\x1b\x1d\x2b\x75\x71\xaf\x87\xe3\xd9\x7c\x30\x1a\x51\xa6\x5a\xda\x34\xa0\xa3\xbe\xfc\xd3\x78\xf2\x79\x94\x5c\x7d\x48\x10\x50\x60\xff\x08\xfb\x6b\x9a\x0c\xae\x5a\xa9\xbd\x48\xb9\xaf\xdc\x8d\xaf\x92\xe9\x6c\x0e\xc0\x91\x39\xee\x7b\xf7\x19\x7c\xdf\xee\xc8\x8b\x44\x5f\x4c\xee\xc6\x90\x87\xb4\x06\xb4\x8f\x4b\xf8\xf7\x38\xed\x7f\xb3\x7f\xf1\x77\x37\xc3\xf9\xf8\x7a\xf0\x8f\xbc\x02\x7c\xc5\xff\x3f\xfb\xe1\x87\xf3\x0e\xff\xdf\xe9\xdb\xdf\xfd\xff\xdf\xe2\xdf\xad\x77\xf3\xb3\xf0\x06\x60\x96\x11\x92\xb4\x96\x2b\x02\x09\x13\xd1\xd3\x8e\x80\xe9\x04\xd1\xc3\x6a\x2d\xeb\xbc\xaa\x4e\x88\x0e\xe2\x94\x5e\xe3\xb6\x75\x09\xc8\x72\x53\xeb\x43\x6b\xfa\x0e\xdc\xd1\x70\x14\xa1\xc0\x51\x9a\x2b\xae\x14\x92\xa1\xca\x72\xdb\x48\x29\x3e\x49\xb6\xc3\x1f\x0b\x45\x1a\x9f\x0d\x55\xfd\x77\x98\xb5\x81\x6e\x51\x5c\x2c\xbc\xd3\x48\x31\x52\x02\xba\xd6\x26\xcf\x15\xdd\x36\x38\x6b\x19\xf0\x31\x35\x25\x6b\xab\xe1\x10\xa1\xea\xfc\x13\x73\x53\xb9\x03\xa0\xd6\xab\x6d\x55\x00\xdf\xb4\x90\x75\x0c\x95\x0a\x83\x72\x55\x4e\xd1\xbd\x47\x32\x5b\x94\x9c\xee\x96\x4c\xb3\x6a\x9a\xb8\xbc\xd1\x47\x1e\x97\xe8\x71\xa7\x4a\x5c\x9e\x6c\xef\x90\x9c\x0a\x8a\x9c\x1d\x5e\xb5\xd5\xcd\x58\x29\xc9\x31\x80\xd4\x63\x79\x0e\x10\x57\xa2\x38\x0f\x7b\x2a\xf4\xa1\xb8\x66\x81\xd2\xae\x5e\x3d\x51\x61\x38\x6b\x47\x22\x6f\xc0\x08\xff\x64\xf4\xb6\x70\x69\xde\x59\x10\x9a\xa6\x45\xd7\x92\x6f\x06\xd5\x2d\xdf\x85\x7c\x87\x15\x8b\x11\xd5\xbc\xb1\xa2\x2c\x4a\xc1\x6f\x8b\x05\x56\x98\x09\xad\x31\x01\xd8\xdd\x36\x75\xb6\x74\x99\x69\x5e\xb6\x66\xa9\x16\x65\xb1\xca\x1e\xb7\x54\xb5\xba\x36\x8b\xa7\xb4\xc8\xea\x75\x1d\x14\x86\x85\x0f\x73\x23\xef\x7a\x53\x6f\x81\x1e\x9e\xee\x63\xae\x3c\x11\x53\xce\x6f\x6a\xfd\xb0\x7d\xd4\x95\x81\x29\x28\x1e\xb5\x81\x8a\x0a\xd2\x15\xa2\x6b\xee\xb6\xca\xf1\xfa\x86\x39\x08\x55\x19\x50\x9f\x5a\x4a\xcd\x79\x4c\xcf\x06\x5c\x00\xed\x5c\x7c\xa8\x3f\x09\x3f\xa3\x18\x2f\xdc\x76\x61\xdc\x96\x4e\x66\x2f\x56\x00\x3b\x7b\x0d\x2c\x1a\x7d\x4d\x30\x04\x21\xa2\x7a\x32\x55\x5d\x9d\x90\x3e\xa9\x06\xfb\xc2\x6f\xbb\xc6\xec\xe5\x2c\xe7\x5b\x4c\x78\x89\x79\xf5\xce\xaa\xe0\x86\xd9\x16\x4f\xf1\x17\xd7\x6b\xba\x2c\xc2\x0d\xcd\x41\xdb\xbc\x4e\x03\x23\xe0\xee\x23\xf5\xf9\x63\x02\x7f\x02\x6c\x1c\x91\x5c\x02\x99\x29\x01\xc2\x22\x3d\x9f\x4c\xe7\xee\xa7\x9f\x87\x70\xef\x12\x78\xb8\x88\x6e\xb3\xa8\x79\x61\x7f\x37\x46\xe9\x10\x14\x91\x08\x66\x04\xe4\x28\x12\xc4\xea\x71\x5b\xae\x92\x81\xf5\x16\x67\x84\x5b\x14\xfc\x9f\x60\xff\xe3\xef\x3e\x65\xeb\x7f\x6a\xfc\xef\xf4\xe4\xdd\x79\x27\xfe\x77\xfe\xfd\xef\xf1\xbf\xdf\xe4\xdf\xa7\xe1\x0d\xab\x17\x29\x35\x3c\x42\xa5\x63\x92\xa8\xed\x88\xde\x06\x4a\xc2\xc2\x3c\xfb\x23\xf1\x53\xe6\xf4\xb9\xd9\xc0\xed\xa8\x5c\x9f\x0a\xdb\x83\x84\x4c\x63\x7e\x6e\x50\x14\x77\x91\x16\xc8\x8d\x22\x2e\x4d\xfe\x0d\x9e\x75\xdd\xbe\x20\x02\xea\x7b\x48\xc6\x6e\x0b\x21\xf4\x47\x08\xa0\x6f\x78\xb1\xf2\x2f\x06\x37\x05\xc8\x94\xec\x69\x8b\x27\x15\xff\xc4\xab\xba\xd3\xf9\x82\x99\x56\xa9\xb0\x2e\xda\x68\x9b\x86\x29\x2d\x96\xec\x47\x05\x88\x97\x82\x8a\x1e\xa9\xd2\x1d\x4d\x38\x7c\x1b\xe5\xfc\x63\xa5\x86\xc3\x23\xd2\x11\x11\xcd\x90\xca\x25\xfe\xf4\x38\x84\x9a\x79\x3c\x56\x8f\x1c\x8d\x3f\x0f\x8d\x60\xf7\x93\xad\x67\x07\x46\x66\xdc\x5e\x48\x8f\x55\x38\x1a\x2b\xdb\x60\x41\x44\x04\xd1\x49\xd3\x38\x2e\xac\xd3\x23\x3d\x6f\xcf\x5f\x97\x85\xc7\x8f\x49\xac\xd4\x19\xac\x29\xdf\x7c\xdb\x4a\xfe\x45\x4b\xf0\x02\x72\x9e\xab\x76\x93\x80\xd3\x32\xdd\x59\xd7\x27\x3d\xe2\x30\x06\x64\x5d\x39\x1b\xde\x94\xf0\xd4\x1d\x30\xee\xe7\x2b\x4a\xf0\x03\xe5\x04\x45\x37\x39\x2a\xca\x01\x95\x80\x4e\xad\x2b\xdb\x80\xd4\x45\x08\xb7\xa3\x22\x55\x53\xe9\xb4\xfe\x82\xb9\xf6\x43\x8a\x1f\xbf\xa4\xbb\x23\x8c\xfd\x72\x86\x1a\x02\x43\x41\x57\x21\x25\xee\xbb\x29\xda\x06\x5d\x80\x15\xe2\x12\xab\x6d\xe6\x48\x45\xa9\x51\xae\xcf\x64\xcf\x50\x34\x8a\xbd\xde\x95\x41\x99\x72\xf9\x19\x2a\xa8\x21\x56\x0f\x4b\x09\xe5\xe2\x96\xaf\xe6\x71\x29\xa1\xf2\x30\xcd\xdb\xcb\xca\x0e\x08\xb9\x2b\xfe\xf9\x0a\xb2\x85\xcb\x12\x9d\x8e\xe0\x71\xe0\xa3\x20\xca\xd7\xfe\xce\xa7\x06\xcc\xce\x51\xad\x88\x51\x51\x59\xad\x0b\xf3\x58\x36\x90\x72\x64\xbd\xbf\x4a\x50\x1d\x14\x25\x7f\x81\x1d\xfb\xa2\x95\x63\x84\x69\x08\x14\x56\x22\x4f\x92\x46\xba\x87\xb2\x8d\x38\x5a\x50\xfc\x06\xd5\x68\x6e\xd4\xb2\x5a\x5f\x54\xe9\x5a\xdf\x94\x65\x6e\x8a\x34\xad\xd4\xbf\xda\xff\xfe\x3f\x9e\xb3\x75\x5c\x56\x8f\xff\x46\xcd\xcb\x6a\x3f\x78\x5e\x9a\x25\x2d\x8a\x72\x5b\x2c\x28\x37\xe1\x65\x23\x48\x1d\x54\x1d\x82\xd8\x8f\x35\x5f\xf9\x4e\xdb\x27\xd6\xab\xb8\x30\x4d\xa4\x5f\x5e\x5e\x62\x7a\x03\x6f\xd6\x45\xb9\xde\xc4\x66\x99\x35\x65\x55\x1f\xd1\x92\xc4\xfa\x5c\xc0\x20\x1b\x80\x13\x83\x4a\x2b\xfa\x70\x62\x0d\x87\x13\x45\xea\xa5\xbe\x04\xb1\x29\x75\x6d\x8a\xa5\x7e\xa2\x5d\xc3\x3d\x41\x70\x72\x4d\xb5\xef\xad\x95\x66\xe7\x02\xdc\xdf\x6a\xcd\xe9\x84\x27\x9c\x21\xa7\xe6\x12\x3c\xcb\x4f\x76\x51\x36\x24\x29\x09\x97\x80\x1a\xc1\xd1\x29\x20\x0d\x1f\xdc\x96\x6e\x0b\xc3\x04\xdb\x08\x5e\xf7\x92\x86\x1a\x39\x69\xad\xad\x5b\x9e\x95\x05\x93\x90\x59\x0b\xe1\xa2\x9c\xde\x90\x32\x20\xb4\xad\x25\xc2\xaf\x88\xc2\x47\xa5\x8d\x1e\x1e\xc5\x4a\x9a\x1a\x06\xdb\xa4\xb9\xb7\x3a\x8c\x26\x21\x08\xf3\x91\x5c\x69\xa4\xd1\x4a\x4b\x4d\xa9\xc5\x91\xbe\x25\x12\x2f\xd4\xd1\x36\xfb\x77\x3d\x9b\x67\x20\xfb\x82\x32\x4e\x49\x79\xfa\x8a\x75\x21\x71\x15\x4a\x27\x2d\xad\x39\x75\x1c\x88\x58\x88\x87\xc4\x51\xb6\xd1\xcb\x6c\xb5\x42\xd1\x7b\x7b\xf2\x52\x71\x70\xb8\x59\x31\x90\xb9\x22\xc9\x55\x00\xc1\xc0\xd8\x2e\x97\xb4\x77\xc4\x66\x87\x64\x95\x0a\xb8\xee\x48\xe2\x1e\x0e\x67\x0e\x9e\xc2\xb1\x49\x70\x12\xcc\x6f\x01\x25\x8a\xb7\xe3\xd2\x08\xa9\xb6\x11\x52\x6a\x79\x84\xdb\xc0\xad\x97\xd6\x32\x21\xa1\x4b\x66\x45\x76\x2d\xec\x2e\x94\xc5\x51\xe4\x14\xa5\xc2\x65\x21\x89\x51\x02\x7e\xb6\xf0\x8a\xa4\xb3\xd6\x49\xa5\x9a\xa7\xca\x98\xb6\x7a\x27\x9e\x9e\xc7\x30\x60\xde\x0c\xa6\x4d\xb8\x58\xfc\x53\x31\x7c\x50\xb3\x46\x77\x2b\x84\xec\xf6\x16\xfe\x08\xce\xd2\xde\xb3\x00\x09\xec\x44\x9c\x84\xf8\x04\xe0\xd9\xdd\x9f\x2a\x71\x2e\x04\x7d\x7c\xfd\x58\xd8\xff\xc2\xd8\xf6\xd9\xae\xae\x2f\xc6\x6c\x82\x47\xc2\x79\xe9\x45\xca\xec\x90\xed\x4c\x5a\xd5\x44\x1d\x9c\xdb\x3f\x07\x7e\x26\xca\xfe\x57\x78\x5b\x5d\xfa\x8b\x3f\x4d\x79\xff\x59\x0d\xbe\xce\xda\x30\x8e\xac\x75\x0a\x77\x8f\x69\x54\x51\xdd\x73\xbc\xcb\xe6\xfb\x9a\x11\x98\xab\xac\x5c\xa2\x64\xae\x3f\xd2\xb1\x8a\x5a\x1e\xd9\x4f\x00\xca\xc2\xf1\xf8\x16\x8f\xa4\x47\x48\x8a\xb6\x36\xfd\x45\xc9\x5b\x3d\xbc\x19\xcb\x1e\xb0\x3e\xe2\x17\x0f\xb1\xc2\x80\xc1\xde\x21\xc6\xc3\xd5\xe3\x32\xf9\xc4\x89\x95\x32\x47\x7e\xf8\x5f\x51\xef\x3a\xfc\x70\x3b\x3a\xda\xb3\xe4\xdd\x3e\x54\xad\xc5\x1e\xb4\xc1\xd3\x66\xc2\x6b\x6e\x47\x52\x7f\xad\xea\xca\x0b\xc7\x4a\x9d\x1f\xe9\x81\x5e\x9b\x1a\x7c\x6f\x76\x39\x81\xc0\x28\xf2\xc3\xc3\x2b\x1c\x15\xb6\xc8\xfb\x3c\x78\xcf\x7a\xc8\x2c\xdd\xa4\x90\x6d\x1d\x3e\xcd\x8a\xa6\x2a\xad\xef\x6e\x4c\x41\x15\xfa\x2e\x98\xb3\xad\x7d\xe5\x49\xd0\x7e\xeb\xd9\xe3\x72\x50\xb5\x11\x92\x6e\xd6\x34\xb1\xb3\x8c\x43\x19\x2c\xfe\xae\xe5\xd2\x67\x47\xe6\x08\xce\x23\x9a\x38\xee\x61\x86\xa4\x1f\x2d\x54\x82\xc0\x8b\x65\xb5\x67\xb1\xb0\x07\x79\x9e\x31\x7c\xdf\x03\x09\x04\xad\x88\x98\xa2\x58\xa9\xb7\xe8\xc6\xf7\x85\x95\x04\x02\xce\x35\xd1\x9e\x86\xc5\x52\x9f\x1d\x2d\x8f\xfc\x69\x00\x44\x59\x10\x53\x52\x25\xfb\x09\xcb\xa8\x7d\x6d\xe3\xe8\xf2\x53\xb6\x46\xa2\xf8\xb4\x20\x77\xdf\xae\x50\xbc\x8c\xc2\x8d\x69\xe8\x5c\x87\xfe\x8b\x52\xfb\x6a\xe4\x3c\x03\x53\x2c\xca\x6d\x95\x3e\xa2\x73\xb0\xad\x91\x03\xc0\x7e\x27\x17\x12\x76\x1d\x87\x76\xcf\xee\x6e\xf9\x5a\xe2\x02\xd6\x3a\x41\xf0\xd4\xf4\xf8\x4a\x52\xb7\x5c\x96\x4e\xd8\xd2\x13\xa8\x00\x37\x95\xda\x6e\xf2\x32\xf5\x59\x4b\x88\x97\x5b\x4b\x05\x74\x54\x54\x49\x8a\x3f\xe0\xef\xdc\x4d\x47\x4e\x29\xdc\x6b\x61\xf3\xb1\x91\xd5\xba\x5e\x5b\xff\xc3\xd1\xca\xb9\xc1\xba\x49\xbf\x18\x24\x96\xf3\x0f\x0c\xbd\x05\x4d\xee\x3e\x74\x43\x51\x3b\x59\xee\x5c\x84\x77\xb3\x5a\xff\xab\x1f\x0f\xe7\x36\x2b\x35\xfc\xc4\x77\x5c\x44\x74\x3a\xf7\x4c\x70\x65\x76\x39\x02\x7a\x2a\xe4\x5a\x37\x6d\x0e\x0d\x64\x8d\x06\x14\x79\xb9\xee\x59\x05\x78\xd9\xb7\xae\xd1\xb6\x6e\xc5\x02\xec\x64\x6f\x2a\xf3\x9c\x95\xdb\x1a\x56\x01\x15\x26\xd9\xe3\xaf\x6e\x4c\xba\xe4\x0d\x1d\x9c\xdf\x28\xc4\x96\xae\x31\x2f\x01\x16\xc5\xae\x18\x85\x82\x8f\xff\x6d\xf2\xa0\xf1\x77\xc9\xf5\xe8\xf8\xf4\x1f\x55\xfa\x01\xff\xbe\x92\xff\x3b\xfd\xfe\xb4\x93\xff\x7b\x77\xfe\x7b\xfc\xef\x37\xf9\x97\x64\xab\x95\xc9\xf5\x75\x59\x6d\xd7\x5e\xc1\x94\x4d\xe7\xa9\x52\xaf\x25\x08\x7b\x91\x81\x7c\x7d\x0d\x4e\x73\xeb\x2d\xa5\x8b\x2f\xe9\xa3\x89\x54\x00\x49\xc3\xd0\xd2\xf1\xd7\x90\x7e\xdb\x82\x8e\x0b\xeb\x47\xb5\xb1\x7b\x0e\xcf\xcf\xaf\xd0\x2f\x4f\x06\x89\x02\x45\x9d\x20\xa8\x84\xba\xab\x01\x94\xe8\x59\x83\xb7\xa7\x87\xa8\x87\xe8\xbb\x29\x7a\xf3\x90\x15\x69\xb5\x73\x12\xfe\x74\xe9\x58\x9a\x8d\x29\x08\x3d\x27\x9b\xd2\xee\xed\x31\x5f\x1c\xc2\xc7\xd0\xef\x21\xcc\xda\x7f\x86\x85\x8f\xdd\x95\x5b\xa4\x2b\x42\x04\x7c\xbe\x73\xe5\x94\x81\xeb\xb1\xe7\xf7\xa4\xe7\x76\x3b\xb8\xfc\xd3\xe0\x43\x3f\xed\xc7\x60\x7c\xd5\x49\xe6\xc4\x90\xf5\xf0\x49\x1c\x46\x9a\xa9\xd7\x01\x6a\xbf\x4e\xf7\x5d\x09\xdd\xf7\xbd\x04\x1d\x7a\x30\x4d\x3c\x41\xca\xd5\x9e\xbc\x8e\x62\xec\xd9\x2b\xd8\x43\x00\xff\x11\xea\xd0\xe3\x0f\x25\xec\x90\xb1\x88\x2a\xf9\x73\x72\x73\x3b\x1a\x4c\xef\xbf\x01\x8a\x48\x9c\x08\x9f\x07\xf7\x2d\x0d\x73\x46\x25\x2a\x9a\x84\x7f\xd2\x89\x11\x7f\x37\xbd\xb5\xf6\xff\xdd\x3f\xcd\xfe\xff\xf0\xee\x87\x1f\xda\xf5\x7f\x67\xdf\x9f\xfc\xf0\xbb\xfd\xff\x2d\xfe\x41\x41\x6f\x55\x2e\xba\x77\xb6\xd3\xf8\x9d\x3e\x9c\xde\x8e\x4e\xe3\x77\x47\x4a\x7d\xe2\x13\x21\x7e\x17\xe9\x3f\x6e\xf3\x9d\x3e\x7d\x17\xe9\xb3\x93\x93\x1f\x5a\xea\xc1\x67\x27\x27\xa7\xc7\xf0\xf7\xb9\x23\x8d\xba\xdd\x56\xf5\x36\x6b\x50\xa9\x55\xf5\x33\x74\xdf\x4e\x93\xc1\xcd\xc5\x28\x41\x80\xc3\xfe\x66\xd9\x26\x1d\x81\xb3\x0c\x42\x4f\x84\xf2\x58\x94\x05\x5c\x22\xca\x15\xe2\x0a\xaa\x72\x01\x7c\x64\x55\xc4\x25\x3b\xe8\x77\x47\x7a\x95\x66\x55\x61\x6a\xb8\x42\x14\x28\xa8\x1c\x85\xae\xe7\x63\x65\x5e\xec\x85\x10\x03\x66\x4b\x53\x67\x15\x06\x57\xf3\xb2\x36\x3a\x2f\xcb\xcd\x53\x99\x63\x70\x84\xdd\x46\x55\x6e\x8c\xab\x41\x63\x9a\x86\x48\x7c\x17\x43\x3e\xe4\xf2\x72\x02\xbe\x71\xfa\x4d\x5a\xfc\x5e\x05\xe8\x19\xa4\x38\xd6\xab\xac\x48\x0b\x08\xc1\x3c\x98\xc2\xac\x40\xf9\xbe\x5c\xcb\x70\xd5\x53\xfa\xdc\xaa\xab\xc7\x98\x5c\xb6\xb6\x27\x10\x92\x13\xa2\x2a\x19\x2b\x85\xd5\x42\x39\x64\xbd\x05\x42\x37\x12\xd0\x07\x25\x00\x08\xea\xad\x29\xf0\x50\x2e\x90\x26\x0e\x88\x22\x40\x19\x04\x18\x76\x41\xb4\x6f\x99\x2d\x29\xd8\x27\xde\x1b\x68\x17\xc1\x9d\xe5\xa0\x79\xca\x2a\xec\xfc\xee\x20\x56\xea\xf3\x13\xe8\xdf\x43\x9c\x1f\xb4\x7e\x59\xd5\x79\x55\x19\xb3\x2c\xd7\x9a\xc3\x2c\xeb\x72\x69\x72\x28\x1b\x62\xac\x3b\x12\x44\x34\xd5\x76\xf1\x25\x00\x70\x92\x9f\x3e\xbd\x1d\x69\x48\x1c\x60\x9a\xd2\xce\xb8\x8b\x2d\x8a\x79\xf2\xdd\x4e\x1b\x9d\x23\x0b\x62\xe1\x2a\xcb\x1c\x0d\x64\xeb\xe1\x20\xaf\x06\x73\x0f\x4c\xbc\xdb\x3c\xad\x62\x3d\x40\xd9\xab\x1c\x44\xd9\x1f\xf5\x2a\xfb\xd9\xd4\x91\x82\x2c\x5d\xed\x09\xb3\x89\xba\x61\xb5\xcd\xe1\x3f\x9f\xd3\x7c\x0b\x97\x48\x39\x25\x2f\x86\xd8\xec\x16\x65\x51\x67\x75\x03\xba\x07\x6a\x95\x39\xf0\x6a\x56\xc1\xc5\xf1\x21\x5d\x7c\xd1\x59\xd1\x33\x83\x0e\x9e\x8f\x2a\xd1\xab\xad\xc9\x39\x00\x8e\x85\x1a\xab\xb4\x06\x5c\xcc\x63\x55\xbe\x34\x4f\x78\x89\xfc\x79\x93\x16\x92\xf7\xb9\x7c\x36\x15\xe0\x7a\xc4\x78\xb9\x75\x69\x77\x9e\x9b\xc0\x9d\xd7\x90\xe6\xd8\x56\x65\xef\x4c\x2e\x05\x04\xc8\x5b\x2d\xe8\x22\x5c\xca\x06\xfe\x56\xd7\xa6\x58\x18\x25\xa6\x2e\xab\xf5\xaa\xdc\x52\xbc\xe5\xa5\x44\xc8\x2f\xc1\x9f\xf4\xc1\x15\x94\x95\x22\x84\xf8\x60\xca\x71\x87\xcb\x72\xbd\x29\x0b\xd0\x84\x8c\x95\x9a\x82\x48\xa1\x1d\x30\x2c\x42\xc5\x4a\x0e\x1f\x42\xb2\x6f\x09\x33\x6f\x7e\xd6\xb4\x9c\x35\xd3\x2c\x62\x15\xa8\xa3\x74\xae\xfe\x5f\x59\x51\x2f\x1c\xae\xc6\x76\x2b\x21\x19\xa2\x8f\x8f\xb9\x86\x18\xd4\xa9\x0b\x60\xbe\x29\x2b\x44\xd9\x39\x10\x12\x6c\x18\x4a\xc9\xc0\x60\x37\x69\xd5\xe8\x6a\x5b\x14\x1c\x01\x0a\xea\x6f\x39\xd1\x82\x5f\xab\x9f\xd2\x0e\xd0\x3b\x56\xca\xf1\x4b\x86\x63\x82\x78\x30\x1e\x49\x8c\x97\xa0\xfe\xbb\xc8\x51\x2c\x9e\xcc\x3a\xad\x23\x4e\x5e\x47\x2a\xc8\x5a\xd8\x11\xb3\x1d\xf3\x3a\x91\xc0\x22\x49\xfe\xb8\x5d\x97\x6f\xb0\x3c\x71\x93\xe5\x90\x25\xc3\x78\x06\xd0\x2d\x2a\x72\x89\x91\xb4\x18\xf2\x3b\x76\xfe\x9f\xd2\xfc\x19\xd1\x05\x8b\x3c\x33\x45\xf3\x1d\x47\x3f\x84\x85\x39\x3e\x76\x11\x3e\x28\x2f\x5f\x62\x6e\xc3\x0d\x06\x95\x9c\x43\x34\x38\x37\x7a\x93\x99\x08\xa3\x10\xd6\xe7\x2f\xb1\x8e\xb1\xb6\x0b\x13\x03\x09\x78\x38\x48\x3d\x47\x24\x1b\x7a\x2c\xd3\xbc\x8e\xdc\x78\xbd\xa4\xcc\xe1\x81\x97\x84\xb5\x31\xc4\xd1\x2a\x48\xfe\x79\x69\x4f\xec\x42\xa1\x72\xf9\x2b\xb7\xa4\x21\xc2\xc7\xd1\x12\x87\x1e\x93\xdf\x1d\x82\xee\x08\x48\xc6\x1d\x4e\x66\xc3\x23\xd2\xb3\x27\x9c\xf8\xe2\x15\x41\x2f\x1f\xb1\xb0\xbd\x6f\xd5\x14\x38\xa2\x1c\x87\xda\x64\x98\x5b\xac\x14\x21\x42\x98\xea\xe9\x34\x3e\xe1\xc8\xee\x4f\x8e\x33\x07\x69\x77\xfe\x87\xe8\x4b\x4d\x87\xc5\xfe\xc3\x9b\xbc\x08\x05\xbe\xc5\x01\xfd\xf5\x20\x88\x0c\x13\x99\x10\x5e\xad\x1c\xe3\x3b\x5a\xdd\xd4\xda\xc7\x3c\x07\x8a\xce\x02\x2e\x9a\x00\x61\xdc\x6e\x96\x29\x71\xec\xc2\x50\x9a\x02\x80\xf5\x2e\x8c\x53\xae\x74\x9d\x66\xcb\xe0\xb1\xf8\xc0\x43\x01\x3c\x55\xb2\xce\x38\x90\xa2\xca\x6a\xd7\x01\x3c\x20\x03\x88\xa3\xbf\xb9\x3e\x95\xb9\xdd\x4d\xdc\xb1\xb2\x3a\x38\x52\x44\xb8\xec\xac\x86\xc0\x2f\xa6\xee\xa9\x63\xc4\x68\x1e\x22\xff\x0a\x46\xe9\x69\xba\x8e\x5c\x24\x4c\xf1\x53\x69\xea\x77\x44\x89\x9f\x32\x52\x82\x64\x6b\x83\x9b\xb1\xdf\xdf\x01\x0f\x12\x3d\xcb\xc4\x7a\x50\x53\xd4\xae\x08\x3a\xfa\xde\x4e\xfa\x69\xaf\xe0\xaf\x04\x00\x57\xec\x03\xbc\x3c\x95\x4e\x33\x05\x52\xd7\x85\xcb\xd2\x42\xb9\x9b\xf1\x6c\xca\x28\x56\x9b\xb0\x95\x05\xa9\xa8\x33\x6f\xd7\x49\xfd\x90\x02\x0b\x33\xbb\xd5\x25\x16\x57\x87\x91\x05\x6a\xae\x47\x88\x4a\x1d\xa6\x55\x59\xe9\x7b\x6b\xe6\xd9\xbc\x82\xbf\x99\x56\x8b\x27\x8e\x51\xdc\x32\xc3\xf6\x5d\xdd\x56\x54\x25\xbf\x4a\x79\x38\x71\xc4\x8b\x0e\xeb\xe7\xf9\x99\x7d\xc3\x5e\xae\x7a\x5a\x46\xa9\x23\x68\xd1\xc3\xb6\xce\x0a\x30\x8e\x95\x2e\xab\xc7\xb4\x70\xba\x19\x61\xf3\xf7\x35\x58\x61\x83\xfd\x7e\x40\x9a\x1d\x2d\xf4\x2f\xfc\xa0\xd1\x42\xd9\xd7\x42\x57\x97\x63\x57\xfb\x3d\xe6\x1d\xc1\xcd\xf3\xfe\x9a\x54\xba\xc2\x6d\x56\x14\x20\xf6\x7b\x1a\x9f\xdb\xa9\x73\xe2\xb3\x9f\xed\xb6\x82\x42\x9d\xbe\x55\x25\x75\x68\x71\x65\x42\xa1\x8d\xdb\x41\x2a\x4f\x5f\xe0\xa1\x6f\xf5\x41\x92\x9b\x45\x53\x95\x45\xb6\x08\x55\xcd\x6e\x18\x73\xeb\xd6\xa3\x87\xe1\xea\x47\x34\x52\x39\x33\x36\x71\x15\x8d\x38\x23\x89\x9f\x82\xf8\xac\xf8\xbc\xe6\x84\x87\xf1\x6f\x95\x5a\xc8\xcb\xb4\x49\x15\x64\x7a\xec\x50\x97\x2f\x45\x5e\xa6\x24\x9f\x94\x16\xfa\x7a\x7e\xcb\x11\x79\x6b\x59\x88\x64\x3f\x22\x5f\x0c\x7e\xe6\x9b\x98\xd5\x2e\x64\xa3\x3c\x6f\x02\xf4\xfa\x9d\x3e\x70\xdb\xa2\x96\xdb\xad\xa5\x25\xda\x1e\xef\x08\xa5\xde\x3a\xae\x10\xe2\xaa\x4b\x4f\x92\xd7\x3e\x05\xfc\xcc\xc4\x0e\xe1\x15\x7f\xaf\x9d\x61\x76\x52\xa4\xaf\x19\x75\xf1\xd3\x1f\xdc\x4f\xc9\xa4\xc9\x4e\x10\x10\xdd\x53\x13\x67\x85\x4e\xfe\xfc\x71\x78\x31\x9c\xeb\x01\xf4\xff\x0f\xee\xe7\xcb\x8e\xca\xaa\x7d\x82\x5b\xa7\xcc\x02\xe1\xb4\xaf\x1c\xf3\x89\x6b\x53\xe7\x41\x18\xd1\x73\xdb\x1b\x38\xda\x38\xe8\xef\x47\x9d\xe7\x74\x27\x59\xd9\x11\xca\x68\x77\x06\xc1\x53\xa0\xb5\x3f\x6a\x6f\xe7\x03\x69\xe2\xd6\x71\x40\x5c\xca\x82\xa4\x0f\xdf\x9a\xef\xc8\xcf\x87\x93\x46\x75\x4f\x9a\xd2\x9f\x60\xc1\x81\xb3\xc7\xa6\x8b\xf9\x38\x8d\x4f\x4f\x42\xfd\xea\x60\x39\x79\xe6\x98\x50\xa8\xba\xf6\x59\x17\x27\x54\xad\xda\x42\xd5\x87\xd9\x11\x8b\x13\xb9\xd3\xb9\x6e\xca\x2a\x7d\x0c\x0e\xb7\xce\xf8\x03\xa4\xfc\x30\xb3\xbf\xb6\x8b\xc1\xbc\xb8\x67\xf0\xaf\x49\x0f\x1c\x1e\x41\xc7\x0c\x95\x14\xec\x7d\x18\x3d\xad\xfd\x24\x3c\xa5\x09\x14\xef\xbd\x08\x40\x8c\x42\x51\x40\x20\x15\x95\xab\x4e\x39\x40\xcf\xea\x01\x97\xdb\xde\x7c\x71\x7c\x4f\xf5\x81\x3c\x3c\x78\x78\xb7\xc8\x67\xd7\xfd\x3d\x28\xcd\x80\x6d\x7e\xce\x96\x5b\x50\x8b\xcb\x8d\xbd\xd9\x95\x95\x86\x0b\x76\xa5\xed\x48\xb2\xe4\x43\xa4\x37\xb0\xc7\x31\x08\x50\x94\xc5\xb1\xd0\x91\x61\x6e\xc1\x58\x0f\xe4\x23\xdf\xd4\x6a\xef\xeb\xb3\x42\xbe\x65\x91\x6e\xd2\x05\x5c\x53\x6a\xb8\x69\xac\x56\xd9\xc2\xde\x06\x50\x60\xd8\x98\x48\xaf\xcd\xfa\x01\x93\x99\x18\x97\x66\xc6\x37\xd2\x9c\xb3\x6e\xc7\x23\x2b\xe5\xe8\x45\x59\x6d\xca\x8a\xce\xc8\x7d\x27\x9b\x3a\x14\x3d\x80\x70\xbc\xec\xd3\x91\x4f\x4d\xff\x75\x9b\xe6\x90\x46\xa8\x83\xe3\x19\x87\xfd\xac\xff\xce\x27\x16\x77\x63\x7e\x6e\x22\xe7\xea\xf9\x6b\x0a\x5d\x5c\x22\x3c\xb8\x57\xe9\xc2\x28\x71\xb1\x24\xce\xa3\x32\xc7\x2c\x6b\xd4\xf6\x3c\x85\x1e\x9c\xb5\x03\xb8\xc0\x30\x43\x81\xad\x51\x20\xcb\x27\x8f\x4c\x3b\x34\xf6\x16\xfd\x68\x74\xfd\x05\xb8\x4e\x4b\x7b\x16\x58\x8b\xbf\xda\x02\xc7\x69\x51\x37\xd6\x0c\x41\x25\xf0\xb6\xe8\x39\x8f\xc5\x7e\x02\xaf\xa1\xab\x29\x0d\xb8\x9d\xf0\x31\xf0\x4d\x7f\x44\x28\x38\x22\x70\xf4\xce\xa1\xaa\x16\x1c\x0a\x1e\xb2\xac\x78\x36\x75\xc3\xc0\x40\x80\x16\x6f\x4c\x95\x85\x54\x0d\xc8\xb4\x03\x8b\x4e\x97\x2b\x15\xf0\x3d\x62\xaa\x39\x05\xf3\x80\x1c\x3e\x80\x31\xa2\x0b\x48\xcf\x46\x22\x42\x88\x4d\xd9\x18\x28\xd4\x51\xc0\x91\x00\xed\x7b\xab\x0f\xc0\xe1\x13\x5e\xe0\xd2\xe4\x40\x9a\xdc\xfb\xa0\xef\xd8\xc1\x13\x06\xfc\x61\xa7\xf0\xc7\xb4\x34\x49\x28\xbe\x30\x8d\x9d\xc9\xb6\x44\x05\x7f\x8e\xb8\x24\xaf\x9e\xb2\x22\xf4\xb4\x5d\xb8\xfd\xf6\xa0\xf7\xed\xd8\x8d\x77\xa2\x9e\x4d\xac\x4c\xd7\x96\x6f\xbb\xde\xa8\x6f\xb8\xd6\xe0\xe9\xde\xbd\xd7\xf8\xf5\x29\x51\x4f\x2e\x55\xf4\xb0\xd3\x7c\x74\x61\x8b\xbf\xb7\x2d\x76\x44\x6e\xf2\x38\x0b\xe9\xa0\xb4\xa0\x83\x6a\x95\x5f\x95\xe2\x8e\xf2\xf5\x81\x92\xa8\x47\xbb\x78\xd7\xe5\x12\x18\xda\x9c\x77\xa0\x1a\x56\x2e\x00\x24\x3d\x1c\x5b\xbe\x90\x10\x37\xb9\xdb\xc9\x22\x44\xc4\xfb\x97\xb6\x3d\xb8\xa1\x8a\xb0\x54\x76\x7b\x63\xe4\xc1\xeb\xba\xd0\xee\x91\x57\x13\x8f\x9b\x77\xc9\x39\x9e\x28\x25\xa2\x23\x0e\xf3\xf2\x4d\x3b\xff\x61\x9b\xe5\x4b\x9d\x72\xdc\x86\x13\x73\x6a\xef\x3e\xd9\xb7\xb8\x7e\x00\x95\xf8\xea\xf8\x53\x86\xa8\xdf\x41\xe3\x7d\xe3\x5f\xe4\x74\xa9\x0b\x7c\xe0\x1f\xf4\xc1\x7d\xb9\x3d\xb0\x2f\xb4\xff\x43\xdc\xf3\xe4\x71\x85\xf0\x6a\xe0\x6d\xa2\x2b\x9f\xf9\xd9\x9a\x6e\xb8\x5c\x50\x8d\xa5\x27\x3f\x75\xbe\x88\xbe\x2e\x2b\xf9\xb3\xcc\xce\x4d\xfb\x7d\xde\x29\x2b\x76\xf4\x74\x85\x2b\x98\x66\xad\x8e\x34\x81\xdf\xaa\x32\xcf\x61\xc8\xc1\xfa\x65\xac\x51\x69\x0f\x92\xb2\x70\x93\x8c\x88\x8c\xfb\x72\x4b\x3e\xb8\x3a\xa0\x4f\xb8\x6f\x87\xe9\x11\xae\xee\xf2\xc5\x9e\x7b\xdd\xcb\x13\x54\xa1\x82\x58\x35\x81\x50\x08\x79\xa4\xf0\xf2\x93\x3e\x3a\x76\x5b\xd4\x6e\x80\x46\xfb\xbc\xf3\x83\x10\x5e\x95\xde\x07\xb4\xfa\xf0\xe1\x48\x97\x2f\x85\xa9\xea\xa7\x6c\x63\x17\xc0\x2a\x5b\x35\x70\xa7\x5e\xd8\x67\x1e\xbe\x3b\xf9\xff\x1d\x79\x0d\x9d\x15\xe3\xd3\x9c\xc1\x85\x60\x16\x6c\x76\xcc\x05\xe0\x89\x2a\x1f\x28\xda\x04\x14\x80\x27\x7a\x00\xd7\x21\xb0\x1f\x93\x95\x9f\x1d\x2e\x80\xc1\xf0\x3d\xad\x67\xd2\x5d\xda\x34\xa1\x43\x5a\x67\xd6\x1d\x74\x21\x46\xfb\x93\x3a\x7b\x84\x35\xd5\x38\xa9\x1e\xfb\x67\xa0\x3c\x33\x39\x64\x52\x52\x8e\x23\x76\xe9\x84\x14\x82\x06\x64\xc9\x2d\x97\xe5\x96\x15\x4b\xc3\xc8\xd0\xb8\x35\xca\x9e\x72\x51\x0a\x07\xda\x75\x23\x8e\x80\x40\x29\x57\xf8\xf1\x80\x5c\x02\x1a\x38\x8f\xcf\xdd\x54\xe5\x53\xf6\x90\xd1\xd7\xf3\xf4\x45\x51\xbe\x68\x89\xf4\x7e\x3d\x23\x11\x63\x91\xd4\xaa\xac\x50\xb4\x72\x63\x2a\x6b\x1b\x99\x8b\xcf\x29\x7d\xd2\x6b\x20\x10\xc9\xf4\x3a\xb8\xa7\x53\x3f\x1b\x2d\xe7\x1d\x6c\x12\x7e\xc7\xf1\xfa\x22\xb6\xea\xa1\xdc\x16\xe8\x65\x10\x79\x5f\x5f\xdc\x0f\x68\xfb\xef\x27\x77\xfa\x6a\x02\x89\x77\xe4\x6e\x80\x42\x41\x2e\x71\x74\xac\x0d\xca\xb3\x36\x38\x86\x1c\x8e\xfb\xd1\xcf\x81\x85\x1f\x08\x55\xee\x23\x7d\x39\x4d\x06\xf3\x44\x12\xe4\x44\x01\xb7\x4f\x12\x54\x87\x42\x4b\x86\x73\x3d\x9c\xe9\xe1\x0d\x52\xe2\x50\xe1\xa4\x6d\xde\x7c\xa2\x2f\x27\x37\xb7\xa3\xfb\x5f\xd1\xb6\xf9\xc7\x64\x0c\x0f\xb9\x1c\x8c\xbf\xa9\x95\x2a\x68\x65\xab\x08\x52\x9d\xc7\x27\xfa\x03\x10\x7f\xf8\x73\x5e\x5f\xdb\x7b\x90\x3b\x22\x1d\xcd\x33\x85\xfc\xf7\x44\x5c\x95\x9c\xc8\xc8\xfd\x3c\xc0\xcc\xd4\xb8\xe5\xec\x31\x9d\x2f\x8f\x5f\xb2\xa5\x89\x98\x55\xea\x18\xf9\x4f\xad\x5f\x6c\x7e\x5e\xe4\xdb\xda\x3a\x6f\x2e\x57\x22\x6a\xc3\xf9\xc1\x6f\x6a\x38\x01\xf3\xdc\x2c\x1a\x6b\xa2\x91\xfd\xbd\xd9\x31\x01\x38\x86\xaa\x38\x90\xa3\x38\x90\xd3\xf7\x0b\xa0\xe2\x73\x7a\xaa\xfe\x1a\xd8\x3d\x96\x84\x3a\xbc\xeb\x29\x83\x18\x05\x18\xfe\xbd\x1d\xd8\x53\x0c\xab\x55\x06\x65\x94\x4c\xc0\x1d\xb6\xc9\xd3\x5d\xc4\x7b\x27\x88\xf0\xb5\xa8\x53\xba\x6e\xb1\xdb\x23\x62\xcf\x67\x05\x90\xa6\x6a\xe1\xc6\xb8\x68\x15\xde\x72\xfc\xb1\xae\xe8\x58\x87\xd9\x3f\xd3\x97\x68\x6a\xda\x51\x15\x7d\x98\xb2\x8e\x9c\xa9\xd6\xdf\x12\xba\x3a\xda\x7f\xf5\x5b\x2e\x29\x39\xeb\xae\xdb\xc5\x63\xcf\x6d\x5b\xcb\xdb\xb6\xe2\xb8\x75\xe7\x91\xd0\xf0\x73\x24\x6b\xe7\xb9\x2b\x57\xc4\x02\x6a\x6f\x51\x2f\x74\xd3\x23\x85\x5a\x7b\x38\xf8\xb8\x2c\x1f\xa1\x6e\x21\x45\xd6\x41\x5a\xa7\x5f\x4c\x84\x41\x57\xb0\xef\xeb\x74\xe9\x89\x0f\xfc\xf5\xd9\xce\x5c\xb9\xef\x96\x59\x56\xaa\x2b\x74\xf5\xb0\x6d\xe8\xb2\xcb\xfb\x07\x32\x6c\x4d\x4b\x4f\x0d\x89\x53\xa1\x10\x8c\x14\x9f\x6c\xab\x30\x15\xcd\x51\xc9\x5f\xdf\x46\x25\xfd\xaa\x76\x1b\x61\x38\xdf\xfa\x0d\x2b\xeb\xe6\xb4\xab\x9b\xe3\xf4\x76\x61\x5e\xd8\x7b\xeb\xd0\x23\x20\xa3\xeb\x32\x03\x19\xb4\xa2\xd1\x2b\x03\x17\x23\xeb\x8f\x32\x43\x31\x5f\x37\xd3\x0d\xa6\x50\xc0\x23\xe2\x00\x44\x1d\xe9\x16\xa1\x5b\xa4\x28\xa6\xc9\x39\x04\x52\x3b\xe0\x9b\x83\x17\x5e\xae\x9b\x6c\x51\xc7\x28\xd7\x1d\x79\x7f\x40\x5a\x03\xf5\x9a\xbd\xc0\x18\xaf\xe3\x69\xef\xce\x2e\x12\x19\x60\xde\x48\x65\x85\x1f\x2f\x9a\x00\x7b\x28\x89\xd3\x16\x50\xe3\x7b\x8d\x6b\x70\x2c\x5f\xec\x82\x64\x1e\xf3\x14\x78\x69\x83\xac\x50\x33\x74\xc0\xf4\xf7\xcc\xe2\x6c\xda\xf2\x8f\xbf\xc4\xce\xaa\x96\xa1\xd5\x7d\x86\x16\x36\x5f\x28\x0e\xd9\x3b\x80\xaa\xd7\xe0\xea\x5f\x61\x70\x7b\xee\x4f\x5d\xa7\x7a\x9f\xc1\x7d\xfb\x77\x32\xb8\xf6\xee\x29\x2c\x2b\x26\x66\x84\xa8\x9f\x1c\xf3\x3d\xd2\x76\xd2\x16\xab\x57\x6d\x31\x5f\xb1\x22\xf6\xed\xe0\x5e\x26\x8b\xcb\x1f\xd2\x1a\x23\x57\x69\xad\x38\x20\xd8\xb6\xd5\xb0\xd4\xce\xfe\x66\x83\x28\x7a\xf6\x2b\x6d\xa2\x18\x37\x31\x34\xea\x6f\x37\x86\xda\x19\x43\xf5\x37\x1b\x43\x91\x2c\xeb\x35\x86\xef\xe2\x13\x9d\xe0\xce\xb0\x1f\x08\x67\xc8\xe0\x6e\xf6\xaa\x76\xed\x04\x8f\x23\x3b\x59\x5a\xe7\x15\x6e\xde\xc8\xaa\x06\x4a\xe0\x4e\xcd\xb4\xa9\xd2\xa5\x59\xa7\x90\xbb\x70\x47\x28\x60\xf9\x1b\xd4\xc5\x87\x2f\xe8\xda\x2c\x2a\x83\xb0\x25\xbb\x28\x4b\x87\x95\xe8\x6e\x28\xd7\x3d\x8a\x4e\x86\x11\x7c\xae\x31\x49\x6b\xd6\x3a\xcf\x77\x0a\x04\xe6\x59\x90\x2f\xb6\x3d\x6e\x7f\x45\xd3\x57\xb2\x42\x93\xf9\xa9\xf5\x39\x6c\x97\xb7\xd6\x7e\x90\x09\x26\xf2\x6d\xee\x03\x8b\xa9\x5b\x8b\xb8\xde\xe4\x58\x5e\x5a\x99\x96\x00\x60\xdc\xf1\x60\x84\x7a\xa2\x12\xe5\xa6\xf8\x74\x2f\x7b\xb8\x92\xae\xa9\x7d\x89\x34\xb9\x0c\xe0\xb2\xa6\xd1\x3e\x0f\xde\xa9\x88\xab\xce\xae\x3b\xbb\x1c\xec\x98\x42\x45\xc4\xb8\xa4\xd3\xcd\x6b\xdc\x3b\x17\xd7\x4d\x90\x1c\x59\xd5\x37\xb2\xcf\xa6\xd0\x19\xdd\x39\xf1\x17\x18\x70\x6e\xc9\x5b\x76\x7d\x98\xaf\xae\x21\x88\xef\x6c\x2a\xe3\x65\x9b\xe1\xaa\xe6\x7b\x0f\x63\xe1\x0e\x4c\x8a\x3f\xf8\xd3\x17\xfd\x74\xb2\xad\xc1\x1d\x6b\x87\x25\x9d\xb0\xe9\xfc\x58\xba\x3d\x03\x3c\x44\x8a\x0a\x4c\x9d\x03\xe0\x79\xf8\xde\xc5\xa7\x70\xbe\xf8\x85\x92\x2e\xbe\x14\xe5\x4b\x6e\x96\xa4\x6d\x0d\xb7\x37\x46\xfd\x35\x4f\x40\x97\x2e\xcf\xcb\xce\xe9\xa5\xe8\xd8\x12\xa8\x0d\x0e\xaa\x65\xe0\x91\x6c\xec\x02\x7c\x36\x1d\x66\xa6\xee\xa6\xae\x0d\x08\xbd\x36\x4f\x4e\xfc\xb3\x28\x75\x5a\xd7\xdb\xca\xba\x98\xee\xda\xeb\xe8\x8a\x5e\xd9\x37\x9e\xa5\xa8\x7b\x30\xb9\x80\xbd\x13\x44\x40\x72\x21\x58\xae\xce\x3f\x91\xbb\x55\xb5\x3d\x0e\x4a\x8d\xe1\x37\x29\x5e\xf1\xfa\x30\xc1\xfa\xb5\xc6\x51\x05\x32\xb6\x76\xa4\xee\x41\xf1\xc1\x99\xff\x07\xe0\xa8\x6f\x58\xe2\x5f\xbe\xc3\x43\x47\xb9\xe9\x20\x0e\x04\xb4\xfa\xaf\xf8\x47\x72\x89\x00\x70\x22\xf5\xf7\x3f\x30\xcf\x2e\x20\xa6\x3c\xf1\x98\xe4\xb5\xef\x51\x41\x83\x28\x95\xab\x39\xa8\xeb\xed\xda\xe0\x3e\x75\xe4\x4c\x28\xac\x0b\x15\xfb\x0b\x8c\xb1\xef\x7a\x86\xb6\xd3\xd8\xc2\xa0\x52\x52\x06\x43\x8c\x71\x38\xe2\x1f\x89\x14\xa8\xab\x49\x27\x25\x34\x32\x01\xb7\x71\x43\xcc\x28\xec\x83\x87\x45\x9a\x5d\x87\x85\x35\xc4\xc1\xbc\x85\xbd\x90\x80\xd7\x46\x96\x9a\x3f\x40\x30\x45\xb5\xcb\x7e\x7b\x2f\x3e\xdf\xc7\x27\xf8\xec\x89\x90\xb7\x1a\x14\x4b\x3c\x99\x6a\x90\xea\x05\xec\xe4\xd2\x54\xec\x4e\x92\x67\x46\xae\x07\x9a\x67\x37\x75\xaa\x29\xa3\x70\xdb\x09\x5b\x68\x3b\xdd\xf5\xc0\x82\x49\x13\x3b\xbd\xd8\xa9\x5f\x99\xaa\xd7\x87\x8b\x12\xe6\x32\x7b\xb6\xbe\x81\x3f\x16\x8e\x7c\xf2\x99\x42\x62\x98\xf5\x41\x43\x7f\xdf\xd2\x22\xb0\xc7\xcc\x6b\x2a\xc8\xca\x01\x31\xbc\x28\x59\x97\x37\x2f\xe2\xd3\x4e\xbf\x8d\x41\xf5\x49\x9c\x52\xdc\x1a\xf5\xf5\xd6\x30\x20\xcf\x39\x90\x5f\x01\x23\x61\x8c\x79\xb5\x85\x54\x52\xbb\x70\x85\xbf\x43\xb7\x30\x7e\x18\x37\xf4\x07\x38\x4f\x55\xc0\x60\x2e\x42\x25\x0e\xb5\xe3\x17\x3d\x30\x86\x07\xf7\x83\xe0\x42\x10\x29\x79\x5d\x70\x2b\x95\xbb\x50\xd6\xe6\xf5\xfd\x67\xc7\xa2\x7c\x29\x84\x8f\xe9\x28\x08\x85\x7b\xde\x75\xcb\xd9\x61\xef\xc6\x3f\x03\x46\x42\xb5\x27\x48\x22\xb7\xa1\x87\xec\x74\x66\xf1\xde\xf1\x5a\x14\x4b\x85\xf3\x83\xd3\x45\x67\xde\x12\xf8\xd7\xed\x2d\xc8\xde\x26\x75\x5d\x02\x16\xb3\x04\x64\x6f\x66\x7d\x57\x48\x53\x81\xb7\xfa\x50\x9b\xbf\x6e\xad\xf1\xd8\xd6\x06\x1c\x04\x69\xad\xdd\xf1\x21\xde\xed\x81\x46\x54\x93\x29\x49\x9a\x24\x93\x8e\x98\x75\x30\xfc\x5c\xfc\xab\x7d\x85\x3c\x89\x44\xd3\xaf\xf6\x30\x66\xb4\xfa\x2d\xf9\x32\xe0\x92\x08\x1b\xd8\x1e\x64\xac\x8d\x4f\xae\x5b\x49\xae\x02\x2d\x56\x18\x4e\xa9\x77\x84\xd9\x52\x77\x91\x09\x56\x6c\xef\x8c\xd0\x1d\xd9\xb7\x47\xb1\x83\x80\xef\x74\x6c\x19\xf6\xf7\x42\x12\x71\xdf\x5e\xa0\xcc\xac\x27\x52\x7c\x43\x4e\xa8\x3f\x5f\xc0\x60\x9e\xea\x41\x10\x3b\x58\xc9\x28\x99\x98\x04\x5c\x11\x0c\x55\x8c\xda\xfb\x55\xb5\xde\x1f\x51\xe8\x43\x0c\x08\x9e\xe7\x3d\xe6\x82\x8c\x40\xa4\x9f\xb3\x54\xa7\x85\xfa\x2a\xba\x0b\x8b\xa5\x5b\xd1\x3c\x78\x3a\x8f\x86\xb3\x44\x72\xfd\x76\x61\xda\x84\xba\x2b\x0b\x03\xc4\xd0\xeb\xb2\x68\x9e\x08\x92\x2c\x81\xd9\xa8\x36\x28\xa8\x14\xfc\x13\x80\x01\xa5\xd4\x80\x65\x06\x60\x5e\xf3\x62\xf2\x67\xfb\xb8\x33\x7a\x1e\x33\x2b\x40\xaa\x88\xa2\xfc\x24\xf4\xd9\x94\xf4\x02\x9f\x6c\x69\xf3\x2e\x9a\xa2\xde\x12\x48\x9b\x76\x8b\xec\x76\x53\x2a\x70\x82\xb8\xdb\x7e\x30\xa9\xa5\x12\x5d\xca\xce\x38\x6c\xb9\xfe\x21\x56\x37\x12\x8a\x16\x42\x8f\x03\xa7\xc0\x57\x4c\x03\x4c\xe9\x09\x0b\x24\x80\xeb\x83\xa6\x42\x89\x5d\x16\xb4\x59\x92\xf4\x88\xd3\x93\x8d\x75\x56\xc0\x7d\x0c\xa1\xe1\x94\x10\x01\xff\x70\x51\xd6\x70\xbd\x5f\x6e\x7d\x30\xa8\x4f\x25\x15\x02\x33\xf6\xe5\xb0\xbc\xcf\xf4\x95\xc1\x74\x2f\x7d\x1c\x9c\xc1\x62\x7d\x63\x3e\xaf\x03\xa8\xfb\x25\x67\x1a\xe6\x62\x3c\x21\xa8\x76\x24\xb5\xae\xf7\x11\xd7\x41\x28\xe2\xf8\x60\x6f\xc6\xc1\xae\x22\x47\x2b\x10\x80\xaf\xee\x89\x5c\xae\x6b\x16\x55\x6a\xcf\x97\x75\x56\x00\x51\xba\xbd\x93\xae\x5d\xcc\xc0\x3e\x39\xec\x0e\xc2\xfc\x20\xb0\xc4\xa9\x4d\xac\x2b\xe0\xe4\x66\xbe\x8b\xd4\x2b\x21\x7e\x01\x83\x25\x70\xc7\xda\xb4\xae\x1b\x7c\xa2\xb6\x6f\x0b\xfb\x42\x87\x59\x01\xb8\xb1\xf6\x3a\xb1\xcf\x00\x48\x18\x9d\x55\x94\xad\xa6\x53\x91\x41\x71\x7d\x0f\x0c\x0d\x39\x76\xce\x09\x12\x85\x34\xc3\x59\x81\x53\x09\x71\x13\x47\xbb\xe2\xf1\x5f\xe0\xd7\xbb\x68\xe9\x3e\xeb\x1d\xec\x06\x45\x95\xce\x3c\x7d\x86\x50\xeb\xe6\x78\xbf\x72\x09\x4f\xba\xab\x6f\x2e\x1d\xa8\x05\xd8\x08\xf7\x5e\x94\x9d\x83\xc6\xe2\x24\x22\x95\x4a\xad\xf5\xd7\x43\xb5\x27\x32\xe0\x40\x9a\xdf\xc7\xe7\x7a\x28\x1d\x97\x5b\x76\x5c\x6e\xd2\xa6\x31\x10\xb5\x4d\x01\xc7\x5f\x2d\xf5\x2d\x5c\x0e\x2e\xe1\x42\x05\xb4\x12\xae\xa6\xc2\xdf\x76\xf1\x08\x93\xac\x51\x81\x15\x79\x53\xbf\x16\x74\x6e\xdf\x34\xe8\x0a\x65\x74\xd3\x55\x8e\x7e\xd8\xb5\xd2\x4e\x3d\xce\xc3\xd3\x76\x9d\x16\xc7\xd6\x4b\x41\xcb\x9d\xd1\x01\x80\x56\x26\x60\xfd\x83\x76\xf3\x72\x20\xe8\x26\x6a\xb7\x51\xb5\x12\xde\x8c\x3c\x59\x15\x07\xe5\x0a\x5d\x6f\x81\x0f\xc9\x6e\xc1\xa5\x69\xd2\x2c\xa7\x73\xdc\x9f\xc4\xc8\x95\x61\x07\x89\xd8\x9f\x1d\x99\x4f\xac\xd4\x43\x1c\xf8\x48\x83\xdb\xa1\x1b\xdc\x56\x4a\x8b\xba\x55\x04\xd1\x71\x0a\x98\xae\xed\x3d\xd3\x23\x60\x0e\x0f\x06\xb7\xc3\x83\x23\xce\x8d\xb5\x67\xc9\x05\x43\x45\x70\x01\xda\x0c\xe7\x51\x5a\x97\x45\xfa\x90\xef\x54\x10\x6e\xcc\xec\x65\xd1\x1b\x9a\xc1\xed\x50\x8c\xb9\x44\xd3\x12\x7f\x89\xa0\x84\xc9\x0a\xd5\x3f\x19\xf5\x16\x2a\x3d\x96\x7b\x66\x25\x56\x6a\x11\xeb\xa9\xd0\x85\x75\x16\xdc\x89\xc5\x42\x6b\x22\x11\xd1\x83\x90\x40\xd9\x86\x03\x7f\x1f\x9f\x1f\xa6\x47\x0a\x98\xb2\xb1\xdd\x0f\x26\xcf\xcc\xb3\xbf\xab\xb5\x1d\x62\x19\x02\xaf\x28\x53\xef\xaa\x00\xb9\x7c\xa1\x56\x4e\x66\xc8\x0d\xb3\x58\x0f\x3e\xc4\xe9\xc5\x24\xe8\x6f\x8b\xb2\x78\x36\xbb\x6e\x4d\x89\xd8\x9a\x6f\xfd\xd5\x10\xa1\x3c\xb4\x1b\xd9\xe1\x9b\x3b\xd6\x52\x98\x03\x3e\x26\x4d\xc7\x2d\xcc\x0a\xcc\x22\x86\xee\xb2\xe2\xcb\x37\xf9\xcb\x2c\x83\x14\x98\xcb\x7b\xa8\x95\x65\xaa\xba\xd2\x0b\x63\x06\xa6\x5b\x75\x5d\xbd\x6f\xba\xa2\x12\x20\xe7\xd9\x54\x5a\x9a\x63\x25\x7c\x58\x1e\x2f\x29\x15\xdd\x17\x08\x78\x88\x5b\xf5\x33\xbd\x23\xf3\x55\xe4\x39\x10\xd0\xab\x36\x6e\x1d\x8e\x24\x2f\x7a\xd4\xe3\xe3\xd0\x00\xc0\x40\x86\xab\x67\x3f\xa6\xab\x27\x71\xed\xcc\x2a\x0d\x9d\x2c\x8d\x89\x14\x9f\x39\xe9\x92\x7e\x68\xcf\x62\x08\x64\x84\xd7\xac\xb2\xf7\x68\x4d\x17\x8b\x72\xbd\x49\x8b\x9d\x35\x15\x2d\x8d\x19\x3f\xb3\x29\xcd\xc2\x46\xe6\xde\xa4\x02\x23\x34\x31\x73\xc4\x3d\xcc\xfe\x65\x4f\xfb\xcd\x36\x88\x0e\x72\x21\x13\x5c\xc9\x7c\x7d\x6c\xe8\xc6\xdb\xf1\x5c\x6e\xe1\xa4\x80\xa8\x34\xa7\xbb\x41\x55\xa7\xe8\x5a\x75\x08\x2c\xf7\xbd\x20\x2f\xc9\x22\x62\x9d\x45\x8a\xe4\x5b\x18\xbb\x05\xfd\xc2\x2f\x94\x66\xc9\xcb\xf2\x0b\x0a\x4f\x42\x05\x07\xad\x07\xb4\x35\xb2\x69\xf2\x96\x24\x16\x93\xfd\xfa\x6a\x17\x56\x91\xf8\xca\x11\xba\x64\xa6\xfb\x6f\x58\x14\x47\x0a\x6c\xfb\xbe\x5b\x89\x7d\x14\xdf\x20\x34\x40\x1a\xa1\x9a\xc5\xdf\x51\xdc\xb0\xc0\x39\xb4\x78\xc2\xd6\x39\x67\xb9\x35\x97\x2a\xbc\x7b\x47\x0e\xf2\xd8\x35\x0e\x22\x32\x67\xc2\xfb\xe1\x0c\xaa\x7b\xb1\xfc\x25\xf8\x2d\x39\x34\xbb\x6f\x1e\xa8\xca\x3c\x67\x35\xd4\xe4\x88\xa7\xbc\x32\x14\x78\x99\x72\x04\x56\x62\x4e\xc8\x42\xa9\xa0\xf7\x0f\x3b\xbb\x38\xd9\x66\x48\xf6\xd5\xc2\xbc\x58\x47\xa2\xdc\x6e\xea\x48\x33\xbd\x55\x9e\xd5\x4d\x1d\xe9\x17\xf3\x90\x97\x8f\x48\x79\x4f\xe5\x0c\x59\x63\x6a\xb7\xaa\x1c\x6a\x56\xa8\x9c\x52\x51\x96\x29\x1e\xb3\x82\xd2\x05\xf2\x18\x7d\x30\x00\xa3\x66\xd9\xf3\xac\x58\x9a\x9f\xb1\xe0\xd8\xb6\xcf\xb9\xaa\xb6\xfb\xd6\xe7\x6c\x4a\xfd\xd7\xad\xa9\x90\x93\x9f\x2b\x97\xa5\x05\x51\x5f\x87\x1d\x2f\x63\xbd\x0f\x16\xfa\x6b\xec\xa2\xba\x20\x61\x8e\xaf\x61\x4d\xbd\xa1\xb4\xbb\xef\xf8\x39\x73\x32\xb0\xd6\x85\xe7\x25\xf8\x4d\xa6\xd0\x11\xe9\xe4\x59\x61\x00\xf9\xec\x9c\x68\x81\x67\x40\x91\x55\x52\x90\x4d\x45\x83\x84\xff\xf1\xaa\x51\xd5\xc2\xa8\xaa\xfd\x46\x35\x62\x91\x65\xba\xa1\x8a\x37\xe1\xb8\x45\x1c\x50\xfe\xeb\x16\xd4\x26\xb8\xeb\xf6\x67\xbe\xa0\x44\x9b\xdc\x41\x45\xed\x98\x7f\x65\x3c\x91\x71\xad\x68\x62\x35\x2f\x31\x30\x60\xc8\x65\x96\x2d\xd8\xe7\x87\xc1\x16\xdd\xf7\x06\x25\x6c\x27\xb3\x1f\xda\x4d\xe7\xcc\x68\x5b\x6f\x25\x3c\x31\xa4\x91\x25\x4d\xec\x57\x8c\xac\x33\xb1\xdf\xc7\xef\xf4\xc0\x67\x33\xe7\xa6\x5a\xd7\xfe\x2e\x45\xbc\xb3\x1c\x78\xc3\x31\x6f\x87\x1a\x22\x21\x5a\x6b\xfd\x47\x60\xec\xb0\x7b\x6a\x5d\x10\x14\xc6\xe7\x81\x4a\x91\x14\x68\x41\xfd\xbd\x8b\xd1\x0b\x0c\x8a\xf5\x47\x84\xb0\xfa\x05\x02\xb2\x2c\x48\xaa\x58\x52\x5d\x45\xf9\xc2\x22\x69\x11\x55\xe6\x34\x5e\x37\x4d\xb5\xef\xc8\xaf\x26\xa2\x91\x8d\xd5\x87\x48\xd0\xf6\x38\xd8\x67\xad\x1e\x4c\xf3\x62\x28\x48\x65\xdf\xb5\xef\x6a\xd7\x0a\xe0\x65\x44\x7b\x1e\x42\x0a\x94\x1b\x43\xfd\xed\x63\x08\x9c\x92\x90\x4d\x75\x95\x2f\xa0\x4c\x8d\xe1\xe7\x6e\x12\xa4\xe4\x47\xae\x76\xdd\x60\x01\x06\x66\xe5\x58\x70\x18\xc9\xbf\x1a\xb1\xfe\x4d\x53\x56\x85\x01\x99\x4d\xc0\x07\xd4\x8c\xad\xe1\x0b\xbe\x35\xae\x70\x87\x21\x3f\xc2\x75\x12\x21\xb7\x9a\xb3\x80\x76\x63\x00\x6d\x89\x7e\xd8\x75\x66\xa6\x83\x65\x01\x0b\x50\x99\x7a\x9b\xdb\xdd\xfa\x0b\x06\x0c\x03\xc4\x10\xf1\xb7\x83\x05\xab\xfe\x7b\xfb\x68\xa0\xd8\xac\xf5\x67\xeb\x66\x4d\x60\x7a\x69\xd9\xd5\xc0\xf5\x49\xd9\x3c\xca\xe8\xba\x60\x98\x3c\xaf\x1f\xac\x5d\xa9\x9a\x2d\x9c\x82\x48\x68\xd2\xc1\x29\x82\x65\x21\x28\x02\x24\x16\x20\xfd\xca\x26\x72\x91\x55\x8b\xed\x1a\xe1\x85\x91\x5a\x41\xbd\x7c\x37\x0f\xc3\x0f\x08\xb8\x39\x44\x96\x46\x24\xeb\x90\xec\xc3\x9e\x71\x4f\x65\x01\xcc\x07\x8c\xfd\x0e\x8d\x12\x2c\xc6\xb6\x89\xf7\xa1\x4a\x1f\x17\xf4\xc5\xe8\x44\x5c\xd9\x5b\xd6\x08\x96\x31\x2b\xb6\xcc\x73\x1e\xd2\x97\xca\x08\xb5\xd1\x41\x5f\x9c\xdc\xff\x4b\x95\x11\xb3\xac\x07\x10\x94\x55\x0b\x99\x5e\x99\xba\xcc\x9f\x0d\x51\xe2\xd2\x5b\xc0\xdd\x5c\xa5\xf5\x93\x8b\x3b\x73\xe8\xd5\xb3\xb4\xf8\xa6\x40\xa9\x4e\xd3\x2d\xb5\x9f\xd9\x05\x27\xde\xc6\x9c\xf1\x1c\xe0\x48\x99\x73\x3a\x80\x69\xb4\x03\x6f\xb1\x52\x3f\xc4\x27\xcc\xa4\x00\xc3\x34\x0f\xc0\xe9\xae\x73\xb6\xcf\xac\xf8\x8e\xe1\xbe\x6c\x8d\xb4\x25\xf6\xff\xb3\x2f\xd6\x86\x32\xba\xe7\x00\xe1\x48\xf7\xe0\x76\x94\xfc\xf4\x68\x67\xbf\x52\x25\x3c\xfe\xfe\x64\x88\x38\x7b\xf3\x97\x74\x57\x07\x73\xba\xad\x89\x95\x1d\x01\xc6\xed\xe5\xd7\xe1\xf1\x84\x45\xe6\x0f\x10\xfb\x73\x79\x55\x10\x80\x88\xde\xf5\x1e\xe4\xae\xfa\x9b\x2b\xba\x18\x54\x4c\x8d\xe9\x60\xf1\xa5\xfa\x1e\xeb\x9d\xb6\x50\xa3\x14\x29\x14\xb0\x71\x9f\xd7\x69\xca\x1e\xbc\x1f\x17\x2f\xf4\x14\xd3\xd8\x99\x3f\x6d\xb9\x36\xc8\x95\xf2\x1a\x65\xa0\x1b\x7b\x7f\x1f\x5f\xa7\x3b\xb5\xa4\x93\x0d\x02\xa0\xf0\x2a\x94\x4a\xd8\xd9\x49\x68\x4a\xef\xc1\x23\x55\x71\x28\xc3\xbf\x7f\x8c\x7b\x03\x74\x95\x01\x17\x0b\x8c\x81\x33\x23\xa5\x23\x41\xce\x3c\x27\xf1\x16\x98\x60\x76\x8a\xad\x57\xab\xae\x9b\x78\x94\xf6\x9c\x75\xc1\xf3\xb9\x90\x58\xe1\xb0\x63\xb8\x0f\xa0\x41\x5d\x44\x10\x80\x06\xea\xd2\x3a\x82\xae\xd6\x32\x6f\x2f\xd9\xa2\x6c\x14\xe7\x0f\x1c\x3c\xaa\x8d\x3b\xa3\xa5\x15\x1c\xcf\x78\x7f\xc2\xa7\x06\x45\x73\xaa\xd5\x3b\x74\xa8\xd6\x59\xc3\xb0\x8b\xc6\x43\x18\x74\x7a\xe4\xf2\x27\xa7\xe7\xf1\x1f\x04\x8a\x10\x97\x18\x6c\x19\xac\xb4\xfa\xe3\xb6\xca\xea\x65\xe6\xce\xc2\x4f\xc6\x6e\xb1\x15\xa2\x67\x36\xdb\x06\x08\x8f\x8e\x44\x08\xc4\x3f\x0b\x21\xee\xaa\x75\xdd\xc6\x72\x3b\x7b\xaa\x1e\xd9\x2f\xf1\x0f\x2f\x3a\x3f\xd4\xe9\xd7\xdc\x4f\x3f\x9e\x72\xef\x43\x91\xa1\xbb\x27\x3b\x9c\x16\xee\xa5\x0e\xf3\x80\x04\x0c\xd4\xd9\xda\xae\x59\x62\xe4\x89\x95\xfa\x43\x7c\xa2\xaf\x08\x24\x84\xd5\xf7\x9f\xe9\x20\x8f\xb9\x84\xe4\xaa\x5f\xc3\x0c\x44\x50\x83\x5a\x13\xd5\x27\x68\xfc\x35\x89\xb3\x21\xc8\x6e\x75\x49\x32\x23\x25\x98\x31\xf9\x19\xc0\x8c\x49\x0a\xd4\x82\x0d\x13\xc4\x57\xe7\x1f\x93\xfe\x16\x5f\x4f\x93\x44\x4d\xae\xf5\x55\x72\x9d\x5c\xce\x67\x91\x60\xce\x1c\x25\x20\x88\xb6\x9f\x2f\x73\x32\x95\x8a\xce\xc3\xf1\x87\x58\x5d\xdf\x4d\xa1\xc9\x20\x77\x6d\x9f\x3f\x9e\xf8\xbe\xdd\x0c\xae\x50\x41\x6d\x30\x1a\xf5\xf1\x76\x86\xfc\x9b\xea\x95\x86\xdf\x24\xc9\x7c\x86\x84\x99\xf0\x98\x19\xd5\xfe\x80\xe8\xf6\xec\x72\x3a\xbc\x65\x6d\xb4\xdb\x64\x7a\x3d\x99\xde\x0c\xc6\x97\x89\x9a\x4c\xf5\xe4\x36\x99\xd2\x10\xcd\x06\xc3\x2b\xf8\xfd\x60\xce\x12\xdb\xb6\x6d\xb3\xbb\x21\xb3\x86\xea\x8b\x64\x38\xfe\xa0\xef\x27\x77\x53\x3d\x4d\x66\xb7\x93\x31\x8b\x71\xc7\xc4\x6a\x84\xd5\x40\xd0\xe0\x99\x54\xd7\xbe\x8f\x5c\xff\x26\x6e\xfe\x92\xab\x08\x27\x03\xe4\xde\x26\x63\x56\xad\x7e\x33\x53\xc9\x9f\xe7\xc9\x78\x06\x25\x4a\xb6\x6b\xf0\x0d\x90\xd0\x1d\x4c\xaf\x50\xe1\x4d\x36\xd3\xbe\x75\x6f\x2f\x63\x28\x9d\x4a\xc6\xf3\xe1\x34\xd1\xd3\xe1\xec\x4f\x7a\x30\x63\xf5\xbb\x7f\xbf\x1b\xb8\x7e\x8a\x9f\x30\x93\x68\x67\x9c\xd5\x90\x06\xf6\x7e\x72\x17\xeb\xd9\xc7\xc9\xdd\xe8\xaa\x67\x36\xec\xaa\x4f\x68\x05\x0d\x3f\x25\xcc\x53\x6a\x87\x0c\x88\x4f\xef\x27\x77\xea\x10\x95\xf3\xe4\x84\xda\xe9\x40\xae\x54\x54\x97\x13\x43\x72\xa4\x07\xb3\xd9\xdd\x0d\x16\x58\x5d\x4e\x66\x73\xde\x17\xe3\xe4\x32\x99\xcd\x06\xd3\x7b\x35\x4b\xa6\x9f\x86\x97\xb0\x01\xa6\xc9\xed\x60\x38\xc5\xe5\x30\x9d\xa2\xa2\x5d\xec\xb6\x20\x97\x82\x85\xb5\x5f\x93\xa9\xfe\x3c\x1c\x8d\x40\xf3\x9c\x94\xc0\x5b\x62\xe4\x20\x60\x3c\xa3\xc7\x74\x24\xc5\x87\xb3\xd9\x5d\xc2\xd2\xe1\x38\xbe\xc3\x99\xf2\x15\x6b\xee\x2d\x1f\x07\xb0\x09\xbc\x96\xf2\xe4\x5a\x27\xb0\x48\xf4\xe5\xe4\x0a\x36\xd1\xa7\xe1\xf4\x8e\x34\xf5\xa4\x0a\xb3\xba\xb8\x9b\xeb\xab\x49\x32\x83\x71\xa3\x95\xe5\xb7\x73\x7b\x17\x83\xc2\x1f\x4a\xc4\x27\xd3\x29\xa9\xe5\xc3\xa3\x93\x59\x8c\x1c\xbd\x6e\x73\x4d\x6d\x2b\xdc\xbe\xbc\x9c\x8c\x67\xf3\xe1\xfc\xce\xf6\x64\x30\xd6\x76\xa9\x22\x01\xad\xdd\xf3\xed\x9a\xb9\x58\x8d\x27\xcc\x39\xdb\x6b\x51\x90\x1f\x77\xf8\x3f\x93\x2b\x6d\x8d\x00\x8e\x5f\xf2\xe7\xcb\xe4\x76\x2e\xcd\xa2\x6f\x4b\xac\xd4\x8f\xf1\x89\x1e\x79\xad\x55\x38\x08\x5d\xf0\xd4\xcd\xc0\xe5\x70\x7a\x79\x77\x63\xf7\xc5\x65\x82\x62\xd1\xee\xa3\x51\xf2\x61\x00\x75\x7f\x93\xa9\x10\x4a\x04\x39\xc4\x43\x2f\x0a\x39\x4e\x3e\x8c\x86\x1f\x92\xf1\x65\x72\x14\x09\xd5\xc4\x50\x30\xd1\x2b\x38\xf2\x1c\x46\xaa\xb5\x63\xbd\xc2\xbf\xd7\x9e\xef\x1d\x0f\xf7\x45\xbb\xc4\x46\xc3\x64\xaa\x68\x1d\xb3\x98\x3f\x58\xd5\x64\x16\xf5\xb0\x09\x27\xd3\xd9\x64\xec\xe8\x84\x3d\x8d\xb0\xa3\x0e\x96\x7c\xc2\x7b\xb9\x83\xe9\x7d\x97\x1f\x07\xb6\xaf\x20\x1e\xf9\xda\xc1\xa1\xf8\x77\xf6\xbd\xa3\xc9\x0c\x1e\xf0\x61\x32\xb9\xb2\x9b\x25\xd2\x9f\x27\xd3\x3f\xe9\xd9\x7c\x72\x7b\x3b\xf8\x90\x44\x60\x96\xee\xec\x43\xaf\x07\xc3\xd1\x1d\x8a\x46\xde\x0c\x46\xd7\x77\xe3\x4b\x7c\x1a\x35\x9e\x6d\x3e\xef\xf3\x1b\x7b\xc8\x04\xad\xc4\x97\x81\x08\xff\xa7\x64\xac\x87\x62\x78\xee\x71\x46\x14\x48\x8f\x5f\x24\xf6\xd3\xb1\xb5\x5c\xc9\x15\xdb\x2d\x2c\x09\x25\xdb\x48\xbf\xa4\x27\xc7\xbc\x76\xb9\x87\x7a\x72\xad\x9c\xa4\x26\xcd\x35\x54\xb7\xde\xde\x8e\xee\xed\xd8\xfb\x0f\xaf\xc1\xce\x0e\xe6\x1f\x6d\xf3\x70\x3a\x06\x23\x3d\x1c\xff\xf1\x6e\x0a\xc6\xed\x6e\x34\x1f\x8e\x3f\x28\xbf\xed\xa0\xb5\x6f\x66\x62\x99\xb1\xe1\x05\xfb\x8e\x2f\x19\x5e\xc2\x2c\x8f\x06\x9f\xad\xdd\x04\xe7\x67\x86\x3f\xf7\x8d\x8c\xd5\x6c\x72\x93\xe8\x3f\xde\x4d\x87\xb3\xab\xe1\x25\xd6\xae\x72\x19\xee\x68\x34\xf9\x4c\x0f\xbd\x1c\xdd\xcd\xa0\x4f\xd3\xb0\x87\x82\x6a\x5a\xed\x5b\x19\x91\x9e\xa1\xd1\x12\xcf\xb1\xf3\x24\x1e\x74\x33\xb8\x0f\xc6\x46\xd9\x63\x40\xa9\xd3\x93\xf8\x44\x7f\xcc\x1e\x9f\xf4\x34\xab\xbf\xe8\xc1\xa2\xc9\x9e\xa1\xf6\x2c\xde\xef\x66\xd8\xc7\x5c\x0f\xee\x46\xf3\xe3\xf9\x64\x94\x80\x21\x1b\x8c\xaf\x14\x7d\x72\x95\xcc\x86\x1f\xc6\xf6\x7c\xbc\x19\x8c\xef\xae\x07\x97\xf3\xbb\xa9\xfd\x2f\x90\x29\x9d\x27\x63\xeb\x51\xd9\xd9\x20\x31\x52\xb7\xeb\xa0\xcd\x33\x3d\x19\x1f\x8f\x86\xe3\x44\xc1\x0e\x9d\x8c\x74\xf2\xef\x77\xc3\xdb\x1b\x3b\xe0\xc3\xb1\xfe\x38\xf8\x9f\x83\xe9\xd5\xe4\x6e\xa6\x93\xf1\xa7\xe1\x74\x32\xb6\x1f\xcc\xf4\xd4\x7e\x69\x0a\xc2\xa8\x83\xe1\xe8\x78\x36\xb8\x4e\xe4\x91\x18\x29\x98\x92\x81\x93\x3a\x75\x8e\x83\x1d\xde\xf1\xdd\xe5\x28\x19\xd8\x65\x7f\x69\x97\x0a\x6c\xe0\xc1\x70\x7a\x39\x1d\x5c\xcf\xf5\x78\xf0\x89\xcf\x09\x74\x50\x6e\xee\xc6\xc3\x4b\xf8\xc3\x4c\xcd\xee\x67\xf3\xe4\x06\xbf\xae\xe7\xd3\xc1\xf5\xf5\xf0\x52\x53\xbb\x23\xe2\x0c\xd7\xa3\xe1\x75\xa2\xf9\x50\xba\x19\x5c\x7e\x1c\x8e\xa9\x40\xfa\x73\x32\xb0\x5e\x88\xe6\xc7\xa8\xe1\x58\x7f\xfe\x38\xbc\x44\xed\x56\xb7\x0b\xf7\x1c\xe7\xfa\x12\x0f\xf0\x64\x70\x45\xaf\xc2\x25\x0f\x8b\x3c\x52\xad\x25\x0e\x2f\x9c\x25\x9f\xac\x23\x77\xfb\xf1\x7e\x36\xbc\x1c\x8c\xc0\x9b\xf1\xc3\xe8\x56\x93\x3e\x3c\xf8\x38\xfc\xf0\x91\xfc\x0d\xeb\x05\xc0\xa8\x1c\x1c\x09\x47\x89\xc4\xfd\xd9\x5e\xce\xd0\x90\x5d\xdb\xc7\x8e\xee\xdd\x71\xb0\x87\x15\xde\x1d\x56\xd6\x80\x4a\x22\xf7\xbe\xd7\xda\x35\x7a\x1a\x9f\xe8\x69\x88\x18\xb7\x97\x16\xc6\x9f\x0c\x6a\xcd\x21\xd1\x20\xb0\x28\x0b\x60\xb0\x2c\x90\x6b\x9d\xbb\x1a\xc7\x54\x1c\x00\xa0\xb2\x74\x9d\x82\xb4\x4b\x95\x21\xa7\xf0\x3e\xa8\x14\x51\x41\x67\x4d\xad\xb7\x4d\x96\x3b\xa6\xbe\x15\x67\xaa\x7b\x00\xe2\x78\xd7\x76\x45\x9f\x79\xbe\x73\x95\x0b\x35\x47\x16\x33\x53\x4b\xc6\x9c\xb0\xa0\xa1\x1d\xf5\xc1\x20\xcf\x26\xad\xd2\xc7\x2a\xdd\x3c\xd9\xbe\x35\xa5\x72\x9a\x2b\x80\x79\xff\x0b\x65\x1d\x28\xaf\x8b\xf5\xe9\xa2\xbc\xcd\x3e\x50\x5c\x8d\x26\xee\x6a\x94\x19\x08\x9d\xf1\xfd\xf2\x0f\x11\xbd\xdb\x1d\xee\x93\x95\xbe\xa2\xe1\xf2\xb5\x50\xfa\xc7\xc8\x81\x65\x96\xfe\xb1\xa0\xec\x57\xe3\x5d\xd9\x0e\x79\x9f\xd5\x91\x4f\x39\x3d\x41\xac\x67\x3b\x86\x02\x81\x65\xf7\x5c\x64\xfa\xec\x1b\x39\x83\x38\x34\x9e\x4e\x11\x54\xa0\x18\x18\xdc\xaa\x19\xc9\x89\x38\x71\x17\xaf\x06\x4e\x20\x18\xae\xbd\x4b\xaa\x55\xf4\x00\x31\xa6\x56\x75\x06\xd6\x2c\x9a\xbf\x6e\x33\x84\x02\x63\xc9\x62\x5f\x6c\xb0\x3f\xb4\xe9\xd0\xf8\xca\x95\x99\xfd\x21\xe2\xe1\xb5\xe3\xc3\xa5\x52\x58\xd0\xa3\xb3\xda\x0b\xab\xdb\x3b\x70\x58\x74\x47\x01\xd2\xba\xc9\x9a\x6d\x63\x14\x32\xbe\x09\xc4\x98\x5b\x64\x76\xcf\x9d\xc5\x27\x90\x94\xc9\x0a\xca\x9c\xcd\xdb\x6c\x14\x50\xf4\x1b\x42\xb1\x1c\xbc\x18\x63\x98\x0d\xfd\xde\xa8\x6c\xbd\x36\xcb\x2c\x6d\x0c\x06\x96\xa0\xbe\xf1\xd9\x05\x43\x4d\x10\x8c\xae\x1d\xfa\x63\x19\x2c\x87\xf3\xf8\x7b\x5d\x56\x50\xa3\xe2\x43\x65\x79\xfa\xe2\xea\xbf\x6a\x89\x95\xc6\xb8\x3b\x44\x74\x90\x55\xcb\x36\xd9\x71\xa4\xe2\xd6\x03\xd6\x9e\x1c\xf8\x52\x61\x22\x7c\x2d\x5f\xa4\xdf\x72\x4a\xf5\x7b\x08\x70\x6c\x2a\x68\x2f\x06\x1e\x4c\xb1\x2a\xab\x85\x11\x5b\x12\xaa\x10\x99\x76\x89\x1f\x13\x39\xd0\x15\xe2\x16\xc4\x18\xd8\xe5\xcb\x61\x0e\x3b\x0f\xdb\x3d\x55\xe9\x38\x13\xa7\x7a\xb0\x6d\xca\x75\xda\x64\x0b\x39\x27\xfa\x6e\x53\x16\xfa\xa2\xb2\x96\xad\x67\x7e\xba\x50\x39\xb5\x6f\x7e\x74\xca\xcf\x07\x8b\x94\x61\x24\x71\x95\x66\x39\xae\x19\x08\xa5\xb4\x42\xea\xb4\xe4\x20\xab\xc9\x5f\xdc\x32\xad\xe5\x03\x34\x4a\x88\xe2\x59\xb3\x7b\x78\x7e\x72\xa4\x97\xe9\xae\xc6\x9c\xc5\xa2\x44\x6a\x14\x2c\x38\x25\xed\x13\xea\xcc\x20\xcf\x45\x55\x43\xbd\xbf\xf6\xdc\x81\xd5\x30\x19\x9a\xef\x14\xaf\x45\x5c\xfc\xf5\xb6\x7a\xce\x9e\x3d\x5e\x9f\x87\xae\xcd\x8d\x88\x2a\x9c\x1e\x9b\x1e\x21\xac\xd0\x64\x15\x71\x98\x45\x81\x9e\x5e\x56\x68\xb3\x5a\x99\x45\xa3\x1f\xcc\xae\xa4\xc1\x7e\xe5\xf9\x91\x0a\x9a\x83\xd3\x7a\xd6\x9d\xcc\x41\x5d\x1b\x97\xf4\xb9\x45\x60\xde\x50\xd4\xa2\xb9\x04\x36\x42\x40\x1a\x6b\xc1\x98\xa4\x4d\x61\xa5\x98\xfd\x3d\x90\x08\x13\xae\x4f\x96\xb2\x51\xf6\xeb\x10\xaa\x59\x88\x07\x7d\x91\xa7\x55\xda\x94\xd5\x4e\xff\x65\xbb\x7c\x84\x6f\x11\x41\xcd\x91\x22\x93\x1d\x26\x2e\x83\xdc\xd8\xe1\x9e\xe4\x23\x5b\x7b\x84\x39\x5a\xd3\x4a\x30\x3f\xa0\xac\xa5\x37\xe0\x41\x4c\x34\x62\x4d\xc9\x56\x2c\xad\x81\x8e\x6e\x53\x02\xbd\xe0\xc1\x91\xb5\x34\xe6\xd1\x01\xe1\xbb\xe0\x87\xfe\x03\xda\xf5\x9c\x39\x23\x1b\x60\x7b\x07\x30\x91\x24\xec\x25\x92\x2a\x0f\x27\xc5\x56\xfa\x16\x84\xf5\x5e\xa2\xe0\xb7\xac\xf4\xdb\x8e\xcd\x86\x89\x56\x7e\x6b\x6d\xaa\x92\x41\xb8\xf9\x4e\x6f\xed\x2c\xd7\xd9\xcf\x76\x3b\x7c\xcf\xdb\x81\xf0\x16\x60\xac\xc4\x6b\x11\x68\x81\xe1\x51\x75\x0b\x9a\x92\x07\x47\x7a\x5b\x40\xc1\x81\xdb\x5a\x69\xc3\xd1\x58\xfc\x0a\x16\xa0\x66\x3e\x69\x0c\x40\xe7\x2a\x83\x55\x71\x98\x1d\x01\x3c\x2b\xdd\xc9\x17\xa5\x7a\xbd\x6d\xb6\x48\x8f\x6b\x7f\x01\x96\xd5\xc3\x56\x98\x20\xc1\xf3\x26\x6f\x00\x23\x50\x29\xaa\xc9\xda\xcb\x2e\x09\x25\x17\xdd\x01\x45\xb6\xab\x2c\x3b\x82\x5e\x2c\xab\xf4\x45\x51\x68\xdd\x11\x0e\xe2\x42\x05\x93\x43\x20\xe6\x5e\xb8\x9f\x5b\x66\xad\x37\x80\x48\x2f\x0d\x11\x14\x05\x84\x43\x94\xfa\xde\x19\xd7\x3b\x50\x42\x4d\x77\xb8\x03\xac\x3b\x41\xe5\x9f\xcc\x83\x15\x8e\xd1\x12\xa7\x52\x8c\x2d\x39\x52\x5c\x43\x46\x45\x38\xed\x3e\x29\x4a\x6a\x70\xcf\x8b\xa8\x1f\xd3\xec\xf7\xdc\xbe\xd5\x97\x16\x4b\xf5\xb6\x65\xb9\x85\x45\x6f\x88\x45\x60\x93\xf9\x5c\x41\x77\x28\xd0\x12\x9d\xeb\xa9\x1f\x8f\x4f\x69\x8e\x69\xe5\x30\x7d\x48\x86\x07\x2d\x4c\xbf\x79\x51\x04\x94\xa6\x39\x91\x2b\xac\x77\x07\xeb\xaf\xec\x60\xd5\xb7\x83\x25\x7b\xb2\xa3\x43\xa0\xec\xec\x52\x1f\x32\x19\xf3\xc3\x4e\x0b\x66\xf0\xda\x34\x0d\xe2\x6d\x8e\xd4\xa6\xca\x3c\x34\x92\xec\x28\x8d\x4f\x9f\xc9\xf4\x13\x48\xb6\x03\x81\xf5\x3c\x5c\xea\x99\x87\xab\xb7\x54\xd4\x2e\x7e\x3b\xe8\x62\x2c\xfa\x26\x52\xbf\x25\xbb\xf1\x60\x74\x93\x7e\x31\x05\x09\x20\x2c\x16\xe5\x16\x1a\xa4\x97\x06\xe7\xd6\x15\x8d\xac\xe1\x93\xb2\xd2\xae\x01\x38\x46\xb8\x80\x4b\x27\xba\x8c\x33\xfc\x56\x8f\x4b\x3d\x35\x4d\x55\xa6\x58\x2e\x9e\xe0\xf1\x65\xa7\x59\x7a\x79\xc3\xb6\x73\x26\x4e\x28\x41\xf1\xc4\x4e\x99\xb5\x9f\xa6\x58\x22\xc2\xd2\xd1\x86\x38\xa8\x8a\x3c\x69\xe4\x59\xee\xdc\xe6\xb2\x42\xdc\x74\x65\x6a\x93\xe7\xa6\xaa\x8f\x48\x40\x3c\x7d\x36\x98\x4d\x06\xe5\xda\x7c\x27\x07\x14\x00\x15\x55\xa8\xf6\x46\x2c\x1e\xd8\x44\x3f\xc3\xa2\xf5\xa1\x3f\x20\x3e\x41\x9c\xf5\xe9\x79\x7c\xa2\x6f\xb2\x7a\x61\xf2\x3c\x2d\x4c\xb9\x05\x5a\x45\xe0\xaa\x8a\x67\xb1\xfe\x00\xd5\xb3\x30\xb4\x49\xb1\x84\x64\x56\x2d\xaf\x27\x41\x51\x4b\xad\x53\x7d\x20\x58\x6d\xb3\xc6\xac\xa3\x03\xb5\x8f\x36\x2a\x2b\xf4\xdb\x3f\xe8\xcb\xf8\x3a\x9e\xc6\xfa\x2c\x3e\x3d\x39\xd5\x87\x93\x45\x13\xeb\xd3\x1f\x7f\x7c\x77\x14\xf1\x7d\x01\xd8\xda\x57\xf2\xc1\xca\x31\x87\xd6\x8e\x56\x14\xe4\x4f\xc4\xbb\x3b\x5f\x09\xe1\x5b\x11\x70\xb2\x03\x46\xc6\x73\x81\xf3\xd5\xd1\xb7\xca\x7a\x2b\xa7\x67\xfa\x70\x66\x36\xdc\x2e\x28\x56\x08\xee\x31\xee\xeb\x8a\xbe\x0e\x0b\xdb\xf7\xec\xec\x87\xf8\x87\xb3\x93\xb3\xe3\x53\xdd\x3c\x41\x11\xbe\xff\xd3\x5b\x7d\xf8\xc7\x6d\x61\xb8\xc7\x76\xa6\x5a\xc3\xae\xdc\xb0\x3b\x40\x6a\x7f\x45\x0c\x66\xaf\xd1\x13\x27\xab\xda\x26\x3e\xc0\x99\x3d\xd3\x53\x09\xb6\x04\x87\xab\xa2\xd0\x57\x70\x65\x67\xa9\xfa\x07\x83\xd7\xa7\x6a\x8b\x1a\x24\x08\xfd\x2f\x1e\x95\x75\x68\x1e\x4d\xb1\xd8\xa1\xe8\x28\x03\x12\xf5\x5f\xca\x0c\x30\x04\x05\x3a\x90\xb4\x66\x11\x1e\xc0\xca\xeb\x98\x99\x65\x0a\x53\x70\xe3\x28\x96\x61\xbf\xbe\x2e\x31\xed\xec\x59\xe3\xa2\x1e\xf0\x98\xbf\x68\xb8\xb6\xba\xaa\x08\xe5\x94\x80\x8a\xa6\x4a\x2b\xc1\x45\xe9\x48\x2a\x80\xac\x10\x28\x49\x16\xac\x67\xb0\xd9\x98\x14\x58\x21\xa2\x90\xdd\x00\x06\xee\x5c\x0f\x05\xfb\xf3\x95\xe7\xcd\xdf\x4f\xff\x02\xed\xca\xd6\x9b\x34\xab\x04\x4d\x9d\x72\x68\x08\x9a\xd2\xc8\x67\xd7\x89\x8e\x1f\x8a\x9b\x99\x32\x33\x02\x1e\x11\x83\xfe\x83\xe4\x1b\x30\x8b\xa7\xa2\xcc\xcb\xc7\x1d\x10\xd7\x20\xd6\x89\x36\x1b\x15\x50\x23\x82\x26\x5d\x1b\x09\x81\x72\xec\x5a\x3a\xad\xc3\x8e\xc2\xb6\x31\x0d\x6a\x33\x44\xbd\x85\xab\x00\x04\xe4\x46\x7a\x5e\xa5\xbe\x06\xe2\xb0\xbd\x85\x0d\x63\x87\x6c\x5e\xd2\xad\xcd\x8e\x97\xfe\x9c\x66\xcf\xa6\x8a\xf5\x75\x9a\xe5\x5b\xac\x81\xde\xe7\x54\x03\xd7\x0f\xdc\x3d\x15\xc9\xa1\xe0\x9d\xa5\xe3\x84\xca\x35\x4b\x97\xff\x54\xbf\xc0\x8b\xec\x77\xc9\x6f\xa3\x67\x31\xc9\x05\x74\x2d\x58\xa4\xee\x05\xd8\x83\x77\x7a\x66\x9e\x4d\xe5\x92\x39\xf3\xb0\x00\x9f\x56\x1c\xd3\xdd\xaf\x37\x58\x01\xe7\xf8\x2a\x41\x8b\xad\xf2\xea\x44\x44\xa8\xb5\x86\xfa\x32\x4d\x2c\x43\xd6\xcf\x78\xbd\x6f\xa0\xc5\x99\x2f\xb1\xe4\x52\x6d\x0b\x77\x1b\xcf\x0d\xa9\x6e\xfb\xdf\xba\x08\x08\xd0\x72\xae\x81\xdc\xa3\x43\xb1\x14\x10\xcb\x31\x7c\x44\x3c\x15\x3b\xff\xbd\x1e\x16\x82\x55\xe4\x12\x2f\xc5\x57\x88\x53\x98\x35\x69\x43\xf5\x86\x53\xf3\xb8\xcd\xd3\x56\x7d\x04\x54\x8d\x63\x75\x04\x39\xd1\xed\x8b\xb5\x67\x08\xdd\x13\x0b\x6a\xfb\xc2\x75\xb9\x06\x9e\x26\x50\xe3\xda\x57\x58\x42\x38\xc8\x1a\x9b\x17\xd9\x2b\x1e\xd1\xc2\x56\x40\x32\x02\x01\x13\x6e\xaf\x28\xb4\x58\xa4\x85\x5d\x3d\x40\x4b\x20\xc8\x57\x5b\x42\xec\x42\x38\xea\xf4\x3c\xfe\x41\x27\x3f\x6f\xca\x0a\xfc\x3e\x96\xfb\x17\x90\x5e\x98\x04\xfc\x80\xcb\xbc\x44\x6f\x58\x3b\xc3\x2e\x8e\x90\x96\x1f\x2c\x03\xc4\x61\x0d\x3c\x1e\xfe\x27\xb4\xdb\xfd\xf7\x9e\xce\x13\x01\x2c\xf8\x04\x18\xe5\x91\xa5\x68\x76\x3b\x39\xbb\x61\x37\xdd\x5d\x01\x31\x43\x3b\x95\x14\x46\x24\xe4\xad\x8b\x36\xa9\x3c\x7d\xa9\x09\x70\xca\x83\x56\x03\x4b\x9d\x68\x3e\xf0\xef\xee\x44\x0f\x90\x8b\x60\x2f\x74\x3f\x72\xf5\xdf\xb0\x53\xa8\x48\xe1\xa1\x5b\x0e\x0e\xab\x25\x03\x36\x48\x5c\x31\x79\xfe\xd5\xb6\xc1\xc4\xfc\x41\x0f\xaa\x87\xac\x61\x22\xfe\x00\x05\xf4\x3f\x10\x04\xd4\xda\xcb\x6e\xdb\x08\xd2\x10\x75\x59\xe6\x65\x95\x2e\x4b\x8e\xb9\x71\xb8\xe4\x90\x75\xda\x83\x4d\x15\xc6\xe8\x98\x6f\xc6\xc9\xde\xd6\xca\x0d\xd0\x11\xd4\xec\x91\x97\x98\x61\x41\x1c\xc0\x2b\x8f\xcb\xd5\x71\xf8\xae\xb8\xcd\xae\x64\x47\x4c\x39\x3c\x33\xa1\x98\x82\x0a\xb1\x7e\x06\xa9\x7a\xfb\x40\x18\x6b\x3b\xd6\x24\xa2\x97\xfa\x51\x12\xd0\xc0\x6a\x8b\x3a\x8d\x06\x55\x1d\xa9\x46\x84\x76\xdc\x60\x6d\xaa\x6c\x91\x16\x72\x84\xf5\xc0\x1f\xe6\x18\x55\x26\x95\x3d\x49\x09\x33\x58\xa6\xeb\x5a\x5f\x5a\x1f\x7e\x17\x69\x37\xb4\x77\xb3\x01\x08\xc1\x20\xb2\xff\xd9\x60\x7c\x70\x49\x45\x83\x08\x65\x16\x6f\xda\x54\xe5\xc2\x18\x68\xfc\x5f\xe4\xac\xa6\x35\x6f\x39\x59\xec\xd2\x62\xb2\x57\x78\x69\x62\x7a\x62\x1e\xbc\x3e\xb2\xee\x3f\x6e\x97\x74\x1b\x82\x4b\x2f\x44\x4f\x5e\xd2\x6a\x89\x17\xfc\xac\x08\x1a\x45\x6f\x36\x45\x03\xf8\x70\x80\x78\xa3\x31\x5d\x72\x65\xe1\xa2\xdc\x22\x5f\x1f\x1d\xb3\x45\x13\xb4\x3f\x06\x21\x33\x7e\xa6\x0b\x64\xe3\x2b\x19\x05\xfe\xa6\x06\x1c\x38\xa5\x33\x6a\x62\x8d\x12\xed\x20\xe6\x79\x31\x69\x44\x5f\x40\xb8\x3b\x8a\x91\x60\x4a\x68\x95\x81\xfc\x40\x9b\x57\x0f\x9a\x0d\x8b\x52\x2e\x0e\x6c\x08\x5c\x2b\xcd\x17\x2f\xb8\x46\xae\x06\xd3\x37\xe3\x4d\x14\xbe\x8a\x54\x24\xd9\x73\x96\xf7\x74\x5d\xc9\xae\x47\xc4\x70\x19\xb6\xd9\x2f\x5c\x20\xaa\xca\x59\x1e\xdf\xdd\xd9\xfd\xa0\xa8\x70\x50\xf0\x8e\xd2\x43\xa2\x49\xd6\x6e\x4c\x35\x11\x97\x65\x61\xfd\x54\xf8\x42\x81\x3e\x47\xba\x68\x6a\xc5\x2a\x0f\x43\x54\xb5\xa2\x6a\x8d\x59\x8a\xb5\x8f\x1f\xca\x72\x59\xdb\x05\xeb\xb7\x24\x6e\x65\xb3\x24\x5a\x0b\x51\x9e\xa0\xfc\x97\xc0\x13\x69\x51\xff\xa5\x76\x09\xec\x74\x53\xc1\x8d\xa9\xa0\xb4\x97\x0f\x9e\x38\xe7\xa1\x9f\xbb\x35\x5c\xb0\x83\x02\x38\xbb\xc3\xf3\x8d\x1c\x42\x32\x40\x9e\x25\x21\x4f\x8b\xc7\x6d\xfa\x88\xb5\xab\x9e\x9f\xdd\x8d\xb9\x70\xfa\x29\xb2\x01\x99\xad\x0a\xb9\x3d\xf0\x6b\x00\x82\x05\x94\x2c\xd9\x1c\xe5\xc1\xb9\xa7\xe7\xf1\x8f\x3a\x41\x8d\xcb\x01\x7b\x43\x2d\x8b\xeb\xf3\x32\x9c\x62\x80\xaf\x7b\xe7\x89\x6e\x05\x4a\x86\x98\xda\x87\xe8\x2b\x5e\x95\xc3\x74\xa2\x48\x60\x0b\xc7\x09\xcc\xa9\x04\xd1\x07\xd7\xff\x1b\xab\x5c\x55\x4f\x95\xeb\x7e\x67\x84\x5c\xcb\xc0\x99\x36\x95\x69\xca\xf7\x4a\xdd\x61\x54\xd3\xfc\x6c\x17\x6a\xd6\x40\x55\x1d\x55\x3c\x0b\xa2\xb4\x65\x8b\xe5\x90\x00\xe6\xad\x1a\x05\xc6\xe8\x37\x5c\xd3\x03\x6b\x03\x7a\x02\x74\xb5\x21\x69\xf7\x2b\x8a\xc2\x07\xd3\xdb\xd1\xc1\x51\x28\x71\x0c\x05\x22\x6d\x7c\x38\x48\x74\xb0\x8a\xef\x83\x43\x9d\x8a\x04\x10\xe1\x84\x91\x18\x05\xa1\xd9\xbe\x55\x76\xb0\xd1\x18\x09\xc9\xcc\x16\x8b\x10\xb2\x40\xd1\x51\x9b\x15\xaa\xed\x0d\x34\xfb\xf9\xc7\x05\x08\x16\xf2\x2a\x3e\xe8\xd6\x65\x63\x71\x4a\xab\x8e\x08\x10\x5d\x36\x2c\x75\x4a\x0b\xc6\xbc\x2a\x48\x65\xfe\x7a\xcc\x2b\xc1\x53\x10\x4e\xa0\x3e\x26\xd3\xe4\xe2\x5e\xc2\x2f\x47\x23\xc4\xd1\xf4\x0a\xc8\xf7\xa2\x64\x05\x62\x73\x98\xcc\x54\x57\x37\x3e\xfa\xaa\x68\x7c\xa4\xff\xfd\x6e\x98\xcc\x75\x32\xfe\xe3\xe4\xfe\x26\x19\x03\x9c\x4c\x09\x58\x6c\x62\xff\x18\xeb\x99\x31\x6e\xa8\x56\x22\xa7\xe8\x2c\x09\xf9\x4d\x5e\x02\xc3\x67\xa5\x09\xe1\x1d\x8c\x77\xac\x94\x83\x4e\xe3\xfe\xfc\x5a\x35\x20\x51\x1d\xbf\xa0\x57\x82\x33\x15\xf5\x6d\x60\xd5\x5b\x7d\x99\x06\xc1\x27\xc7\xa0\x1c\xbf\xd5\x87\xcb\xa3\xf7\x20\x38\x1f\x7f\x77\x31\xbb\x3a\x3e\x3f\xbe\xcc\xd3\x6d\x6d\x8e\x47\x17\xe3\xd1\xdf\x5d\x09\xfe\x75\xfd\xf7\x93\xb7\xef\xce\xde\xb5\xf4\xdf\xdf\x9e\xbf\x3d\xfb\x5d\xff\xfd\xb7\xf8\x27\xc4\xdb\x17\x20\xde\x7e\x1e\x69\x14\x60\x7f\xf4\x66\x15\xdc\x08\xb0\x81\x98\x06\xbf\x4c\xf3\x6c\x55\x56\x45\x96\x46\x2e\xc6\x37\x4a\x5f\x2a\x50\x72\xbe\x30\xd5\x17\x93\x9b\x1d\xf9\x1c\x69\xae\x47\xe9\x43\x49\xb9\xc7\x43\x61\x95\x41\x4c\x6f\xe3\x2a\x63\x1d\x0f\x0c\xf8\xb2\xcf\x69\x5e\x7b\x92\x22\x08\x12\x5e\x41\x50\xb2\x5c\xe9\xa4\x30\xd5\xe3\xee\x08\xd3\xc7\x8e\x2d\x82\x94\xe4\xf5\xd4\x04\x74\x51\x29\x86\xad\x55\xe6\x54\x9a\xed\x5f\x48\x69\xd8\x5a\xdb\x3a\xa2\x78\x62\xe5\x98\x76\x64\x95\x06\x92\xf7\xfa\x62\x4d\xde\x86\x9e\x1a\xd5\x71\x70\x4b\x73\x0c\x69\x31\xd3\xbc\x57\xea\xf0\xf4\xa8\xd5\x26\x54\xa4\x15\x47\x00\xa5\x9c\x81\xcb\x0e\x82\xfe\x0f\xe5\xb3\xe9\x50\x08\x45\x8a\x64\xea\x6b\x72\x2c\xfd\xcb\x28\x33\xed\x5b\xe2\xf1\x38\xb1\x52\x87\x67\xdd\x16\x64\x85\x1c\x03\x6e\x01\xc5\xb7\xfe\xee\x8d\x60\x30\x48\x10\x93\x56\x92\xab\xda\x3a\x32\xc6\xfa\x84\xe2\x48\x72\x07\x5e\x8b\x22\xe6\xf0\xfc\x48\x8f\x85\x14\x0c\x14\x17\x7d\x75\xa1\xf2\x02\xd5\x9d\x05\xaa\xfc\x02\x8d\x7a\x97\x9a\x2e\xca\x2a\xa4\xc2\xa2\xfb\xab\x07\x09\xe1\x6d\x48\x41\x48\x1d\xae\x14\xcb\xb2\xc2\x9c\xd4\xa6\x2a\xd7\x25\x26\x88\x31\x5e\xd9\x22\x7d\xcf\x6a\x7f\x54\xf3\x02\xe4\x93\x86\x52\x1c\x5d\xe6\xa7\x58\xa9\x10\xf9\x2e\x0b\x59\x2e\xee\x09\x83\x7f\x7b\x3f\x1d\x7e\xf8\x38\xd7\x1f\x27\xa3\xab\x64\x3a\xeb\xc2\xf9\xf8\x94\x07\xb0\xef\xab\x20\xbe\xf0\x64\x8e\xf4\xc5\xdd\x1c\x60\xa0\x70\x34\x27\x57\x7a\x3e\x89\xec\x4b\x55\x4f\x89\x48\xf7\x88\x86\x86\x7c\xed\x94\x56\x61\x69\x49\xac\x87\x63\x3d\x9e\x00\xd6\x78\x2e\x00\xdf\xbe\x97\x93\xcf\xe3\x84\x2a\x0a\x44\x17\x1d\x48\x5b\x5d\x3b\x00\x38\x82\xb2\x3d\x3c\x5b\xa2\xb2\x19\xaa\xad\x93\x3f\x27\x37\xb7\xa3\x01\x81\x2a\x03\x3c\xae\x43\x5c\x1f\x7e\x65\x44\x6e\xa7\x93\xcb\xbb\x29\xb8\x13\x88\x72\xbe\x20\xd0\x3e\xe0\xb3\xed\x38\x53\x4d\x44\x32\xfb\xc9\x41\xb7\x41\xcf\xe6\x6a\x30\x1f\xc0\x8b\x6f\xa7\x93\xeb\xe1\x7c\xf6\x93\xfd\xdf\x17\x77\xb3\x21\x8c\xd9\x70\x3c\x4f\xa6\xd3\x3b\xa8\x25\x39\xd2\x1f\x27\x9f\x93\x4f\xc9\x54\x5d\x0e\xee\x66\xc9\x15\x0c\xee\x04\xcb\x39\x10\x5c\x8f\x30\x77\xe7\x1e\x31\xd2\x7e\x38\x16\x78\xfa\xd9\x7c\x3a\xbc\x9c\x2b\x25\xbe\x37\x79\x0d\x8c\x1f\x00\xf0\x8f\xf4\x60\x3a\x9c\xd9\x2f\x50\x19\xc9\xe7\xc1\xbd\xb2\x8e\x1b\xa1\x5a\xa9\xf4\x20\x2c\x95\x70\xa8\xf1\xc1\xd5\xa7\xe1\xec\x55\x64\x38\x8d\x77\xac\x14\xc7\xd0\xd0\xaf\x2a\x4a\x59\xac\xfe\xf2\x94\x36\x75\x09\x95\xc8\xc8\x16\x8e\x1c\x46\xc5\x4e\xaa\xfb\x6f\xd2\x66\xf1\x64\x90\xed\x63\xbb\x79\xac\xd2\xa5\x87\x1d\x79\xb5\x8e\x96\x20\x68\xd5\xbe\xf3\x63\x54\xd4\x19\x70\x75\x78\x90\x14\x4f\xf6\x43\x48\x87\x1e\x1c\x51\x51\x7a\x59\x98\x9f\xb8\x3a\x1a\x42\x63\xbb\x72\x2b\x4a\x56\x21\x06\x0d\xb4\x20\xf2\xd7\x4a\xd0\x39\x52\xe8\x82\x18\x48\x22\xcf\x83\x8a\x17\xd0\xfd\x26\x4d\x9c\xb9\x91\x62\xab\x02\xd1\x69\x04\x0d\xd5\x66\x93\x56\x69\x63\x9c\x69\xe9\x24\x75\x3d\x97\x83\x6c\x1c\xc5\x8e\x77\xbe\xf4\xdf\xf3\x5c\x79\xc3\x4f\x0f\x7b\x0f\x5c\x3b\x92\x54\x37\xd4\xe0\xd8\x98\x6a\x63\x80\x15\x4e\xb0\xc7\x91\x20\x5f\x14\x06\xa5\x37\x95\x6d\xb0\xe4\xc3\x45\xa5\x43\xd0\x11\x24\xf9\x51\x7b\xc6\x37\x4c\xca\xdf\xc9\x87\x86\x4a\x63\xf6\xb0\x12\x0a\x18\x9d\x7e\x2a\xa0\xf6\x0b\xdf\xa5\x03\x81\x0b\x3c\x3c\xe1\x39\xe2\x24\x07\xb6\x5d\xf5\xcf\x76\xea\x7e\xc1\xbf\xf8\x3b\x60\x03\x3c\x1e\x5c\xde\x0e\xff\xee\x8e\x3f\xfd\x7b\xdd\xff\x3f\x3d\xff\xe1\xe4\x87\x96\xff\x7f\xfe\xf6\xec\x77\xff\xff\x37\xf9\x67\xe7\x5d\x1f\xfb\xe0\x0d\x07\x45\x5c\x00\x4b\xa9\xfd\x9f\x81\xb4\xdb\x74\x3e\x18\xcf\xf5\xb1\x9e\x26\x83\x2b\x7d\x91\x5c\x4f\xa6\x78\x28\xc3\xa1\x38\x1c\xcf\xe6\x83\xd1\xc8\x1e\x0d\x93\xa9\xb2\xc7\xd7\x87\x58\xa9\x2b\xd4\xd6\x23\xe5\x7c\xd0\x52\x0f\xfd\x20\x26\x17\x15\x92\x9f\xde\x3f\x0c\xa8\xd2\x31\x0a\xe4\xf5\x56\x8f\xf4\xb6\x68\xb2\x5c\x3b\x9d\xc2\x45\x5a\x19\x44\x06\x57\x26\x6d\x7b\xa8\xbd\x1a\x7a\xea\x62\xa7\x45\x92\x67\x5b\x73\x4e\xc7\xa7\x72\x76\x8e\x37\x3a\x90\x84\xe3\x18\x94\x8f\xfe\xa9\x61\xa0\x26\xf8\x92\xd5\x4f\x98\xd4\xc3\x9f\x47\xfc\x01\x8b\xf8\xba\x98\x91\x91\x54\x77\xa7\xb1\x70\x73\xc6\x93\xf9\xf0\x32\xd1\xb3\x12\x93\xdc\x2e\x2f\x98\xd5\x88\x66\x3f\xd6\xfe\x4e\xf7\xff\xfc\xdf\xfa\xf4\xc7\x1f\x7f\x3c\x3e\x3b\x39\x79\x17\x21\xef\xa7\xba\x2c\xab\x4d\xff\xd5\x09\x00\x32\x67\xae\x4c\x5a\xa9\xb3\xf8\x94\xe2\x97\x59\x8d\x07\x15\x1b\x4c\xf0\x5d\xe1\x79\x1a\x9f\x87\x07\x72\xd6\xbc\x2e\x91\xe4\xd3\x84\x48\x34\xee\x89\x81\xdc\x09\x20\x35\x3b\x98\x84\x53\x06\x74\x97\x20\x41\x19\x2c\x97\x08\x45\xd4\xed\x34\x41\x23\x1d\xdc\x00\x87\xd2\xfe\x16\xa9\x48\x5f\x6f\x9b\xed\xef\x59\x4c\xbd\x42\x39\x8e\x48\x03\xfb\x3b\x32\x90\x55\x8f\x28\xbd\x04\x69\x6b\x50\xa6\xd6\x87\xcc\x1b\x68\x17\x9e\x4f\x00\xa6\x01\x33\xb2\x3c\x1f\x30\x6a\x23\xa1\x13\x10\x19\x3c\x3c\xb8\x44\x19\x78\xd4\xdf\x3d\x02\xf1\xd5\xaa\x32\xcf\x25\xa4\xd6\x22\x7f\x54\x46\x48\x59\xff\x62\x5d\x9b\x90\x94\x1e\xda\xfd\x46\x90\x66\xd5\x7c\xeb\x7a\x48\x6b\x7a\xbd\x54\x03\x66\x6a\x4b\xd4\x03\xc6\x5e\x1f\x1e\x4c\x98\xf0\x92\x27\x17\x9a\x03\x49\xec\xcd\x2e\x42\x97\x25\x20\xa5\x17\xa7\x2a\xd1\x23\x2c\x7d\xfc\x29\x64\xb7\xb1\x6d\x91\xfd\x94\x14\xf5\x91\xbf\xed\xa1\x9e\x1e\xa8\x65\x87\x07\x34\xf6\xea\x27\x40\x44\xaa\xb3\xf8\x3c\x9c\x2b\x36\x4f\xa6\xed\x75\x38\x09\xf5\xa6\x4a\x8b\x7a\x65\x2a\xd4\x9d\x0a\xe8\x50\xd5\x61\xf8\x7a\x1d\xbc\xfe\x88\xb9\xd0\x05\xe6\xc8\xab\x4c\x61\x23\x58\x6b\xca\xae\x37\x85\x9c\xc7\x88\x2e\x74\x91\xe2\x9e\xa1\x8d\x5a\x42\x4e\xb5\xb1\x9e\x0f\x92\xd0\x83\xe4\x47\x9e\x23\xd7\x92\x75\xdd\xaa\xa6\x3b\x82\x30\xda\x7b\xfc\x94\x96\xd0\xd4\x3a\x2b\xb2\xf5\x76\xad\xda\x68\x88\x0e\xef\x6e\xfb\xe2\x9f\x4b\xee\x8d\xac\xb0\x5e\x37\xe0\x06\x09\xeb\xde\x3c\xb5\x07\x13\x73\xc3\x4b\xde\x2b\x8e\xf7\x9a\xf4\x0f\x43\xe1\x68\x22\x3d\xec\x19\x1c\x10\x28\x0a\xa9\x7c\xca\xaa\xab\x58\x24\x31\xa5\x2d\x80\x93\x32\x75\x53\x6e\x36\x26\x0f\x40\x3f\x3f\x61\xae\xac\xd5\x4b\x84\x05\xb7\x65\x50\xf8\x25\x76\xe2\x15\x11\xab\x7f\x25\xde\xa3\xb5\x3e\xb7\xf6\x9a\x05\x4c\x41\x09\xb3\x13\x96\xf2\x14\x91\xb0\xf0\xa6\x2e\x3f\x76\x4d\x49\xe4\x2b\x9f\x69\xc1\x2f\xb6\x1f\xa1\x5a\x41\x24\xc1\x6a\xd3\xa4\xa0\xac\xfe\xea\xde\x6b\x4d\x84\xc2\x24\x93\x6b\x06\xe7\xb2\x65\xe5\x13\xbe\x2c\x20\xe7\xf4\xeb\xc5\x1d\x3a\x8e\xe8\xc3\x7f\x26\x04\x03\x44\xec\xe8\xd2\x8d\x5e\xd4\x13\x3c\xf2\x85\x6a\xb0\x01\x08\x73\x72\xe9\xd3\x21\x1e\xb4\xa4\x87\x85\x5b\x64\x91\x37\x03\x92\xf3\x3d\xcf\xb9\xf7\x8a\x29\x39\xb1\x44\xcf\x7d\xdb\x73\xd4\xd6\x8e\xae\x19\x79\x9f\x80\xb0\x94\x02\x57\x8e\x0b\x1a\x09\xdc\x95\x7f\x59\x8a\x4f\x25\x5a\x1e\x38\x75\x3a\x3b\x55\x52\x5a\x42\x7e\x9c\x68\x2d\xf9\x29\x2a\x18\x5b\x86\xfd\x43\x03\x3a\xd1\xb3\xf0\x19\xb5\xc3\xe0\x13\x13\xf9\x12\xb6\x77\x59\xb9\x16\xc6\xad\x81\xf1\xa4\xd9\xaf\x52\xcb\x07\x6b\x24\xab\xbf\x4a\x2c\x8f\x47\x77\xdf\x6e\x06\xb1\xd5\xaf\xed\x83\xa2\xfc\xa6\xad\xa0\xba\x4f\xf9\xf5\x5b\x41\xb5\xb6\x82\x8b\xc2\xfd\x9a\xdd\xa0\xfa\x56\xb0\xfe\xca\x0a\xfe\x1b\xc2\xa3\x41\x68\x74\xdf\x46\x48\x77\x0a\x12\xd7\xdb\xe6\xa9\xac\xb2\xff\x32\xae\x3f\xe2\x84\xf5\x43\xc8\x10\xf3\xfd\x23\x86\x67\x52\xd8\x75\x64\x59\x22\x6c\x10\x82\xce\x7d\xe6\x5d\x7a\x8d\xae\x59\x48\x00\xcc\xf8\x75\x30\xb7\x82\xfd\x88\x99\xd4\xba\xcc\xf1\x66\xfd\x50\x2e\x33\xaf\xbd\xc0\x6e\xa0\xdf\x8c\x3e\xf7\x8f\x1c\xc3\xfc\x0a\xcf\xd9\x08\x81\x86\xd7\x1e\xae\xb2\xa2\x75\x50\xc9\x07\x81\x0b\x6b\xcf\x6d\x54\xe2\xed\x5b\xd5\x89\xcb\xe9\x76\x3e\xcd\x8a\x76\xc6\x97\xf3\xec\xbf\xd2\x78\xf7\x84\xef\x55\xcb\x2a\x6b\xb6\xca\xaf\x59\xda\xfe\x75\xaa\x5e\x5f\xa7\xfa\xd7\x86\xf1\xcf\xe3\xb7\xec\xc1\x61\xee\xa3\xf6\x75\x5a\x11\x2a\x0f\xb1\xcf\xd1\x98\xca\x20\x71\xae\x50\xa8\x0d\x8d\x8c\x72\x46\xe6\x5d\xdc\xcd\x0e\xe0\x6b\x8a\x00\xf5\x2a\x48\xbc\x7a\xe5\x40\x15\xfe\xc8\xe1\x43\x18\x2e\x9f\x2e\x9f\x4d\xd5\x40\xd1\x78\x08\x26\xc6\xa8\x23\x04\xfb\x11\x86\x9c\xa3\x5f\xa7\xcb\x8a\xb4\x2b\x97\x26\xcd\xb3\xe2\x11\x3c\xf3\xfe\x7c\x00\x20\x59\x24\xac\xad\x35\xf3\x64\x9b\x5a\x89\x01\xde\xd9\x38\x21\xfe\x72\x86\x57\xba\xb7\xb1\x64\x91\x19\x8c\xaf\x74\xf2\x67\xe0\x29\x40\x26\x26\xe0\x59\x52\x6f\xad\x93\x32\x1c\xcf\x93\x91\xbe\x19\xfc\x29\x09\x59\xa0\x44\xb6\x5f\x4f\x93\x0f\x83\x29\x44\x83\x81\x24\x45\x12\x0a\x41\xf6\xe1\x63\x32\x4d\x62\x15\x7c\x36\x99\x0e\x3f\x0c\xc7\x83\x39\x50\x37\x4c\x27\x37\xf4\x1e\xe0\xea\x98\x0e\x3f\x25\x57\xf2\xaf\x7d\x29\x0d\x85\x89\x8a\xe8\x00\x19\x7e\xe0\x7b\x4c\x05\xc4\x5f\x72\x9c\x2d\x93\xe9\x3c\xd2\x83\xd9\x6c\x88\xac\x33\x2e\x08\x41\x6c\x29\xf3\xe9\x60\x38\xc6\x80\x04\x91\x9b\x70\x08\x3e\x7e\xed\xc9\x44\x1b\x14\xe9\x64\xfc\xd1\x3e\x16\x28\x29\x14\x30\x45\x31\x0f\x14\xff\xbe\x97\x24\x01\xb9\xa6\xbe\x29\x3d\x12\xa9\xf1\x64\x2c\xa1\x08\xdf\x94\x2f\x41\x0d\xdc\xbe\x34\x09\xb6\x0a\xb8\x58\x6c\x1b\x3c\x5b\x0a\x50\xa7\xc0\x5d\xdf\x8e\xd2\xdc\xf1\x05\x25\x33\x15\xb0\x3c\xcd\x3f\x0e\xa7\x57\x48\x95\x12\x39\x76\x9b\xd1\x64\x36\xe7\xec\x44\x84\xff\x85\x49\x0b\x91\xc7\xd0\x93\xa9\xba\x9c\xcc\xe6\xf0\xdf\x5f\x4f\x86\xb8\x99\x80\xe4\x43\x87\x46\x47\x51\x6e\x66\x3f\x73\x0e\xa7\x21\x5c\xee\x61\x38\xd3\x83\x0f\xd3\x24\x41\x94\x07\x52\x0f\x0d\xc6\xf7\x98\x2a\x81\x65\x7d\xc9\xac\x1f\xbd\xb9\x12\x58\x6e\x53\x62\xc5\x1a\x7e\x82\x9f\xf8\xfc\xc9\x3c\x19\xa9\x8f\x83\x99\x1e\x5c\x7d\x02\x4e\x2e\x0a\xcd\x7c\x1b\xc5\x4d\x32\x4b\x04\xb0\x65\x46\x8c\x39\xc8\xdb\x32\x9e\xcc\x3f\x0f\xe7\x1f\x81\x4e\xcc\xf6\xa7\x87\x29\x44\x30\x3e\x31\xb5\xdb\x35\x4d\x2f\xe4\x9f\x94\x1d\xe9\xab\x7b\x58\x15\xe7\xc2\xf9\xf3\x38\x36\xc4\x55\x3b\xe1\xe5\x7d\x0e\x9d\x43\xac\x67\xb5\xaa\x05\xc6\xab\xde\xd5\x8d\x59\x8b\xf8\xbb\x35\x59\x70\x4f\xef\xa4\x33\x57\x59\x65\x5d\x7e\x1f\x1f\x29\xfe\x5f\xf6\xde\x75\xb9\x8d\x24\x4b\x13\xfc\xef\x4f\xe1\x06\xb3\x31\x11\x6b\x41\x88\xa4\x2e\x99\x92\xc6\xda\x16\x22\x21\x09\x55\xbc\x0d\x40\x96\x5a\x35\x36\x56\xed\x40\x38\x00\x4f\x05\xc2\x31\xe1\x01\x52\xa8\x5f\xfb\x2c\xfb\x68\xfb\x24\x6b\x7e\xce\xf1\x5b\x44\x80\xa4\x54\x59\xd9\xdd\xd3\xe2\x9f\x54\x92\x11\x1e\x7e\x3d\x7e\xae\xdf\xb7\x63\x3e\xdc\x1f\xd9\x76\x3e\x11\x1b\xe2\xff\x3c\x0a\xff\x73\x0c\xca\x8a\xaa\x76\x60\xda\xa7\x58\xfb\xe4\xd3\xbf\x1d\x7c\xb2\x2c\xe7\x44\xcc\x13\x3f\x1d\xa5\x42\x52\xe2\x77\x28\x39\x4a\xab\xe1\x82\x16\x81\xf3\x63\x02\x2b\xb3\x1f\x57\xe8\x58\xd2\x24\xc8\xee\xc3\xe8\x35\xd6\xf1\x9a\xb0\x17\xbe\x54\xcb\x92\xe7\xd2\xd4\x54\x9b\x96\x35\xd7\x87\xa0\xbf\xbd\x06\x95\x18\x7e\x90\x6a\x0b\x5f\x79\xee\xbf\x17\x9c\x4d\xa1\x3a\x0d\x50\x41\xda\xc9\xe4\x85\xb8\x37\x59\x9c\x3e\x9e\x31\x28\x13\x88\x6a\x63\x7c\x0a\x7f\x9c\x5a\x06\x91\x71\xd2\x0e\x86\xf9\x5a\x95\xb6\x4f\x78\xe3\x4c\xe2\x5c\xf4\xe0\x87\x59\x56\xd2\x25\x60\x96\xb4\xcb\x54\x1d\x6e\x61\x0c\xa3\x5b\x9d\x47\xe5\x4a\x54\x98\xea\x68\x07\xdf\x18\x1b\xc3\xaa\xfe\xf9\xaa\x54\x73\x51\x58\x0b\x4a\x64\x98\x13\x6d\x4c\x16\x79\x01\x21\x53\xb7\xba\x53\xc8\xac\xd8\x0d\xe6\x42\x3e\x09\xa8\xb7\xc4\xe4\x07\x32\x04\xdb\xcb\xb9\x0c\xb5\x80\xd4\x63\xda\x5d\xe4\x5f\x71\x5b\xd8\xd1\x8a\xda\x79\xf1\xbe\x12\x9c\xc6\xd0\x84\x28\xfc\xbe\x86\x8e\x16\x12\xf2\x36\xad\xde\xe7\x98\x79\x43\xa0\xae\x79\x5e\x60\x1b\x05\x37\x8c\x3b\x1f\xbe\x99\x7f\x20\xe2\x34\x78\x3e\x2e\x17\xfa\xf0\xaf\xe3\xeb\x7f\x56\xf4\xe7\xd1\xfc\xaf\xd7\xc7\xc7\x2f\x9b\xf1\x9f\xe3\xd7\x3f\xe3\x3f\x7f\xc8\x8f\x5b\x7d\x1f\xdc\x49\x13\xc2\x8e\xdf\xbc\x39\x3a\x3c\x39\x3a\x7a\xc3\xfd\x36\xd9\x13\x3a\xf8\x40\x29\x32\x51\xe5\x01\xba\x7b\x52\x17\x9b\xdf\xc5\x3d\xd7\x60\x2f\xae\x91\x45\xe8\x9f\xc8\x88\x36\x12\xc1\x97\xca\x5c\xdd\xa9\x7c\x2b\x0a\xf3\x96\xb1\x0b\xab\xb4\x0f\xf3\x42\x56\x19\xff\x93\x5e\x95\xfc\xfd\xd6\xac\x32\xfe\x67\x51\x15\xfc\x4c\xdc\x29\x93\xf1\x4f\xa2\x12\x45\xce\xcf\x64\xf9\x15\x9e\x92\xa2\x3c\xbc\x50\xf3\x95\x2c\xf8\xd9\x76\xa6\xed\x23\xf0\xbb\x42\x6f\x37\xec\xa3\x50\x85\xbd\xea\x3e\x6d\xad\xa5\xc1\x3f\x6a\x51\x17\x72\x97\xf1\x51\xce\x3f\xea\x2a\xb7\xf2\x79\x2c\x4a\xfb\xef\xb5\x28\x33\x7e\xba\xaa\x94\xe1\x9f\x64\x35\xd3\x55\xbd\xca\xf8\x99\xaa\xbe\xf2\x4f\x42\x18\x99\xb1\x8f\x95\x5c\xda\x8f\xd7\xf7\x6a\x99\xf1\x89\x9e\xc9\xaa\xe6\x9f\xa4\xb0\xcf\xfd\x49\x97\x02\xe0\xa2\x3f\x6d\x73\x63\x1b\xbd\x16\xdb\x82\xff\x59\xc9\x52\xd5\x7f\xcf\xa0\xe7\x39\xff\xb3\xaa\xcc\x7c\x35\x13\xdb\x75\xc6\xec\xd8\xca\x1d\x3f\xb7\x96\xeb\x55\x59\x6a\x7e\x27\xec\xb5\x51\xf1\x73\x55\xe6\xd2\xf6\x6a\xa9\x2b\x7e\x21\xca\xbc\xb2\x43\x2b\xbf\xea\x8c\x4f\x6b\x79\x27\xf9\xf5\x80\x5f\xa8\x02\x26\x68\x2a\xab\xa5\xd2\xec\x42\x97\xd2\xa8\x8c\xff\x59\x02\x1a\xfd\xbd\x2c\x4d\xc6\x3f\x4a\x5d\x2d\x25\xbf\x96\x75\xa5\xef\x32\x0e\x9d\x9f\x68\x59\xe8\x85\xb1\xd3\xa9\xf8\xed\xbd\xe4\x13\x7b\xd3\x16\xae\xe5\xa9\x28\x94\x99\x6d\xab\x5d\xc6\xce\x84\xfd\xff\x35\x94\x4e\xc2\x1f\x4b\x7e\x31\xe0\xd3\xf9\xea\x5e\xe6\x82\xa6\xa9\x56\xa2\xe4\xd3\x8d\x92\xd0\x97\x53\x6d\xd6\xaa\xe4\x37\xd5\xd6\x8a\xf0\x61\x59\x6b\x55\x4a\xfe\x17\x59\xad\xa4\xfa\x4d\x96\x19\x83\x19\xb9\xd3\x25\x7f\x2f\x57\x95\x1d\xe1\xc4\xca\xe6\xcf\xa2\x90\x26\xe3\x17\xea\xab\xe4\x9f\x57\x0a\x2a\x2d\x6f\x92\x80\x61\x9c\xc9\xdc\x13\x86\x2b\x93\xf5\x02\x71\x1e\x01\x00\x3b\xcf\xc6\x57\x55\xe6\x31\x4f\x3f\x23\x9e\x7e\x50\x04\x9c\x77\x9b\x2e\x62\x7f\x3e\x88\xbc\x35\x49\xfa\x9a\x49\x2c\x51\x0c\xf0\x52\x0c\x4b\x6c\xec\x6d\x93\xf9\x7b\x07\x92\x14\x54\x0e\xb7\x40\x86\xb9\x5d\x28\xbd\xe7\xba\xa4\x0c\x73\x05\xf7\x5a\x02\x48\xe6\x70\xc7\xec\xa1\x22\xe4\x0d\xb8\xcb\xa2\xe2\x44\x9f\x5e\x1e\x55\xe8\x5d\x07\x80\xf9\x94\xd6\x1f\xf3\x51\x3a\x5f\xf3\xdc\xaa\x74\x78\xb3\x08\x91\x2a\xaa\x31\x8f\xca\x4b\x9c\xcb\x96\x50\xaa\xed\xb5\x8e\x35\x69\x91\x87\x4c\xd5\x10\x3d\x2b\x80\x41\x01\xb2\x3e\x5d\x91\x32\xfa\x26\xf2\xd4\xef\x90\x3a\x25\x62\x05\xe4\x2d\x63\xff\xd7\x63\x29\x94\x07\x40\xf3\xa8\x0b\xc7\x05\x69\x95\xbf\x7e\x77\x62\x25\x6b\xe5\x34\xa2\xf8\x21\xb7\x59\xe8\x96\x73\x96\x74\xe6\x3b\x0e\xba\x3a\xd5\xc8\xaa\x3c\xb0\xea\x97\x2a\x80\xb1\xc2\xf9\x7b\x5c\x8e\xf8\xac\x02\x8d\x07\xfb\xc8\x9e\x94\x7a\xf9\xb4\x6e\xb2\x34\x2d\x53\x95\xbf\x8f\xbb\x26\x22\x71\x69\xf0\x6b\x22\xd0\x09\x12\xce\x23\xa1\x6d\x34\x58\x47\x1b\x63\xb7\x11\x0e\xbc\x94\xcc\xab\xfc\x1b\x57\xde\xe6\x4a\x75\xa4\x03\x1d\xb3\x6d\xca\x84\x0e\x49\x19\xf7\xbc\xf2\x91\xcd\xf0\xa5\x67\x86\xd9\x8b\xbc\xde\x6e\xf8\x4c\x94\xa5\xac\xb0\x22\x0a\xc8\x14\xb0\x9a\xc2\xd7\x8a\xa9\x88\xfc\x1d\x41\x45\x1a\xbe\x3b\x26\xb8\xa9\x45\x99\x8b\x2a\xe7\xb7\xe5\x5f\xd5\x66\xfa\xe1\x5f\xdd\xba\x1e\xf8\x93\xc1\xa7\x1f\xfe\xf5\xb3\xfa\x7b\x1f\xb8\x5c\x04\x6a\xe0\x82\x1b\x59\x2c\x0e\xe5\x37\x28\x2d\x02\xcc\x80\x6a\xbe\x52\x77\xf2\x9d\x87\xd1\x0f\x99\xc4\x3e\x2d\xab\x84\x40\x65\x54\x02\x1d\x54\x3d\xc3\x81\xa8\x8d\xae\xc5\xd2\x5e\x40\x05\x87\xee\xc0\x20\x01\x2b\x0f\xeb\xbf\x65\xc9\x2b\xb9\xd6\x51\x62\xa9\x74\x7d\xc6\x8a\x5e\x3b\x4b\x39\xec\xda\x61\x81\x25\x7b\xae\xaa\xe5\xf0\x30\xa2\x83\x9f\x6d\x61\xbf\x45\xae\xd8\x8c\xa3\x41\x53\x6b\x5e\xca\x7b\xae\x37\x12\x8d\x3d\x86\x16\xa0\xb1\xa2\x94\x70\x2b\xf0\x41\xf4\xe4\xcb\x7b\x0e\x50\x85\xa0\xb3\x7b\xa2\x4a\x93\x85\x62\x1a\x78\xce\xf1\x16\x40\x8d\x73\x0e\x5b\x28\x4e\xbe\xc3\xcd\x9d\xef\x4a\xb1\x56\xf3\xcc\x0a\xe5\x4a\xe6\xa8\xea\xd7\x00\x94\x86\x27\x69\x17\x5a\x2d\x75\xcd\xc8\x03\x86\xa2\xfb\xf0\xd0\x51\x43\x6f\x0a\xa1\xca\x62\x87\xd5\xfb\xb9\x43\xc4\x08\x9c\x02\x54\x49\xbf\x56\xc6\x57\xb9\xcb\x9c\x01\xe1\x85\x0b\xfc\x78\x42\x48\xe7\x2c\xc7\xc4\x3e\x98\x69\x85\x74\x35\x74\xe4\xfd\x2a\x34\x5e\x19\x30\x20\x02\x11\x8d\x45\x20\xd2\x94\xbd\xdd\xe0\xbe\x1b\xfe\x4a\x22\x2e\xfc\x64\xfd\x58\xd7\xfa\x15\x62\x26\xe3\x72\xd6\xd6\xb7\xfd\x99\xc7\x04\xe7\xa0\x9b\xb1\x03\xc7\xba\x2d\x2a\xe5\xaa\xeb\x7c\x16\xdc\x83\x9b\x06\xc9\x16\x00\x10\x40\x6c\x54\x2d\x1c\x70\xa6\xe9\x67\xac\x77\xad\xe7\x5f\x65\x8d\xa7\x2b\xeb\xf1\xde\x67\xf5\xd7\x9e\x5d\xd4\xde\x85\x98\xff\x55\x6d\xc2\xdd\x4d\xe0\x46\x50\x2d\xd6\x60\xbe\xf5\x1a\xe9\xbe\x09\xad\x42\xa0\xc3\x61\x07\xba\x75\x89\xe7\x16\x43\xe7\x78\xc5\x42\x36\xd1\x5f\xd5\xe6\xf0\xfd\x76\x09\x06\xbd\x9f\x6c\x79\xb8\x16\xaa\xb0\x5b\xd4\x6a\x0d\x01\xf8\xc9\x3f\x70\x3b\x39\x3f\x30\x7d\x82\x26\x10\x40\xee\x80\xdc\x04\xfe\x09\x30\x6e\x5d\x5e\x2a\x91\x0a\x71\x57\x79\xd9\xec\x3e\x9c\xd4\x68\xa9\xd1\x41\x9e\x24\x28\xb8\x4c\xa1\xc6\xa2\xd9\xf9\xa4\x69\xa5\xf9\x65\x3d\x27\xc6\x68\xae\xed\x7f\x9a\x4b\x40\xff\x8f\xff\x07\xf0\x32\x6e\x2d\x16\xa4\xfb\xe8\xfb\x92\xb5\x6b\x28\xdc\x2e\xfc\x4f\x95\xf6\xf8\xf3\x87\x7e\x06\xcf\x67\x7f\x57\x9b\x93\xc3\xe3\xc1\xd1\xe0\xd5\x3f\xc9\x05\xf0\x88\xfd\xff\xe2\x75\x3b\xff\xf3\xc5\xc9\xd1\x4f\xfb\xff\x8f\xf8\x09\x45\xaf\x47\x83\x57\x56\xaa\x1e\x1f\xf1\x33\x39\x97\xeb\x99\xac\xf8\xc9\xd1\xd1\x2f\xad\x6c\xc2\xd7\x87\xf0\xeb\x3f\x6d\x0b\x30\xed\xe4\xbd\xa8\x72\x32\xc7\x88\x9a\x3a\xe3\xb0\xa7\x28\x03\x24\xa4\x70\xba\xab\xba\x50\x33\x7a\xc0\x61\x33\xa6\x58\x55\x0c\x89\x43\x1f\xff\xec\x3e\x5f\x44\x77\x09\x18\xff\xe1\x12\x30\xd6\x5d\x02\xc6\x9f\x5a\x02\xf6\xff\xfd\x3f\xff\xef\xef\x54\x02\x86\x6e\xf8\xef\x2f\x01\xb3\x3d\xb8\x89\x28\xef\x17\x0d\x03\x70\xbf\xde\xf1\x2e\xe1\x77\x25\x70\x43\x18\xb8\xfd\xfd\x7d\xe5\xa2\x9d\x91\x96\xe3\x08\x15\x29\xf7\xb5\x6d\x6e\x22\x3f\x30\xc6\x3f\x33\x80\xd5\x9a\x3b\xaa\xf2\x35\x02\xf3\x11\x3c\x02\xb2\xd9\x35\x88\x28\x1d\xf7\xa4\xd8\x6c\x2a\x49\x5b\xcb\x2a\x20\xca\x30\x84\xc4\xc2\xc0\x02\x8d\xda\x29\xbb\x34\xd9\x5e\x3b\x78\x58\x27\xcc\x9a\x4a\x21\xdb\xa7\x8d\x75\x8f\x3d\xcc\x78\x5c\x9c\x86\x61\x5a\x57\x25\xee\x63\xca\x4f\xab\x17\x63\x4f\xa8\x17\xe3\xff\x48\xbd\x18\x92\x80\x78\xb6\xa3\xfd\x35\x61\xec\xfb\x6a\xc2\x9e\x16\xf4\x64\x4f\x89\x71\xf2\x27\xd5\x84\x31\x1a\x49\xe0\xe7\xf8\xe1\xd2\xaf\xbd\x54\x0c\x3f\x5e\xfa\xc5\x5a\xd1\xce\x1f\x2f\xfd\x62\x54\xfa\xc5\x7f\x87\xd2\xaf\xff\xe0\x95\x5f\xd7\xc3\x9b\xd1\xe5\xcd\xf4\x2d\xbf\x41\x1f\xd2\x4c\xa2\x0c\x5c\xef\xb8\x93\x1d\x92\x2e\x1e\xe7\x61\xc1\xff\xc9\x43\xb1\x41\x40\x17\x05\x3c\xf9\xa5\xae\x54\xbd\x5a\x9b\x88\xfa\x75\xec\x1e\x87\xfc\x74\x84\x00\x45\xc9\x81\x59\x81\xa2\xb2\xf6\xf4\x36\x02\x46\x45\x2a\x68\x80\xb2\x01\xf0\x31\xc9\xc7\x0e\x56\x6b\xe9\xd0\x4f\x96\x5b\x01\x7e\xb8\x20\x08\x40\xba\xfb\x74\xbb\x7f\x47\xd5\x79\xf0\x3c\xb7\x52\x6d\x6e\xa5\xe8\xdf\xce\x3f\x5e\x9f\x1f\xbe\x18\x1c\xfd\xce\x7a\xe0\x23\xf5\x3f\xaf\x5f\xb6\xf4\xbf\x57\x47\xaf\x8e\x7f\xea\x7f\x7f\xc4\xcf\xc7\xcb\x5b\x7e\x3e\x9a\x4e\x47\x13\xfe\x71\x74\x39\x9a\x40\x3e\xc1\xfb\xf3\xf1\x69\xa8\x02\x71\x2a\xe2\x8b\x8c\x9f\xbc\xe1\x80\xdf\x69\x55\x31\xc6\xa2\x50\xd1\x69\x1f\x95\xc5\x0f\x95\x8c\x18\xa4\x3f\xe8\x6d\x99\x53\x80\x7b\x5c\xce\x07\xfc\xbf\xaf\xea\x7a\x63\xde\x3e\x7f\xbe\x30\x8b\x81\xae\x96\xcf\xff\x85\xb1\xd1\x9d\xac\xc0\x33\x9d\x38\xc7\xa8\xe2\xc0\x95\x13\x38\x9f\xf2\x9d\xac\x66\xa2\x56\x6b\xfb\x47\x15\x05\x99\x5c\x1a\xbf\x53\x15\xd0\x25\x01\xb9\xb1\x08\x37\x16\x18\x2c\x01\xbd\xc5\x05\x10\x1a\xc4\x9f\x30\x1b\xd6\xbc\xaf\xf8\x47\x59\xca\xaa\x0d\x16\x13\x95\x1b\x9a\x50\xf9\xc3\xda\x60\x2c\xae\xe5\x17\x71\xdb\xdd\x8d\x22\xc3\x30\xe2\x16\xcb\x9c\x51\xb9\x40\x54\x1c\x13\xee\x71\x74\xf1\x5a\x85\x47\x16\xfa\x1e\xd3\xbb\x8e\x06\x31\xc3\xf6\x99\xf7\x11\x1b\xfc\x33\xe7\x9c\xb1\xa1\x41\x55\x03\x81\x51\x33\xde\x8b\x71\x94\x7a\x88\xce\x0e\x12\xae\xb3\xdb\xe9\x94\xb0\x66\xef\x9d\xee\xd9\x83\x21\x5e\x9f\x3f\xda\x5e\x3a\x0d\x11\x84\x92\xeb\x6e\x0f\xc1\x8b\xc0\x5c\x88\x5b\x13\x58\xe9\x23\x73\x2c\x75\x8a\x60\xeb\x1a\x34\xa1\x81\x9b\xd5\xaa\x97\xc3\x18\x17\x0b\xa1\xed\xd7\x33\x88\x37\x7e\xb6\xcd\x44\x30\x29\xd1\xb4\xe2\xbc\x95\xbc\x17\xbd\x0d\xb1\x4a\x2b\xd1\xe1\xf3\xa0\x05\xaf\xc5\x57\x69\x5c\x80\x46\x94\xc1\xd3\x19\xcc\x04\x5c\x50\x46\xe3\xc1\xad\x89\x49\x07\xb4\x29\x43\x0a\xe1\x4c\x18\xa8\x36\x20\x68\x25\x78\x61\x40\x6b\x8a\x85\xbb\xdb\xd9\xbc\x10\xc6\x10\x88\x95\xfd\x67\xe8\xfc\x2e\x7e\x0d\xc3\xaa\x84\x09\xba\xa6\xb4\x68\x2c\x66\xeb\xec\x26\x4b\x5f\x8f\x27\x81\xf7\x92\x09\xc3\x59\xc0\x39\xa0\xb0\x05\x7c\x7c\x0e\x0f\x51\x5a\x64\xa1\xca\xaf\xf4\xad\x68\x02\x99\xf7\x34\xfa\xc1\xdd\x38\xa4\xab\x3d\xcc\xc1\x38\x18\x78\x2f\x64\x6a\xb8\xfe\x30\x58\xc0\x7b\x41\xf9\xef\x8a\xdc\xa8\x73\x01\x39\x9c\xb0\x29\xcf\x55\x69\x15\x7b\x92\x62\xbd\x68\x5c\xf6\xcb\xbd\x0b\x55\xaa\xb5\x80\x32\x36\x44\x62\x44\xdf\x3e\xdc\xf9\xe8\xfa\x6a\x6e\x97\xb5\x14\xe4\x89\x4b\xde\x61\x94\xc7\xee\x1c\x7a\xc9\x4b\x31\xf6\x21\xe4\x13\xa5\x35\xc3\x2e\xd9\xd7\x97\xc3\xa4\x5f\x44\xa6\x0a\xc0\x87\xce\x61\xf7\x03\x07\x8c\x2e\x22\x80\x92\x64\xe3\x44\x13\x8e\xa9\xda\x44\x53\x8f\x13\x1a\x4f\x47\x73\x36\xd2\x59\x88\xcf\x0d\x54\x82\x3d\x32\x1f\x1a\xa3\x7c\x73\xaa\x77\x78\xae\xab\xd6\x40\x9b\xdd\x0b\x5e\x64\x62\xf1\xa9\x05\xda\xeb\x35\x52\xeb\x90\x4b\xc1\xc4\xf1\x25\x17\x2c\x73\xe6\x57\xda\x1d\xef\x77\x4f\x3e\x33\xdb\xd6\x2c\x2c\x01\xd4\x57\x62\xfe\xda\xb9\x8b\xc4\x85\x44\xeb\xa8\x35\x02\x0d\x1f\xf0\x51\x1c\x43\x72\x48\x4a\xa9\x50\x03\x80\xa7\x88\xdd\xf6\x4e\xee\x9a\x02\x0b\xab\xc8\x4c\x13\x13\xbe\x0b\x03\x56\x6f\x6b\x86\x16\xe6\xcc\xde\xa2\x80\x30\xbf\xff\xb3\x58\xb8\x09\xe8\x7e\x80\x80\x7a\xe1\xd8\xa0\xff\x12\xdc\xc9\x64\x8e\x13\x23\xb5\xe0\x71\x8d\xa2\x97\x4d\xa2\xcc\xa1\xbe\x7d\xd7\x62\x2b\xce\x80\x03\x7d\x8e\xcb\x12\x8b\x64\x17\xaf\x81\x38\x93\x5d\x3f\xc4\x35\x85\x3b\x4d\xa1\x64\x68\xc8\x60\x10\x9c\x5b\x23\x29\xd9\x83\x1a\xe5\x07\x11\xa3\xb6\x80\xac\x2a\x51\x2d\xe1\x3a\xe7\x1b\x61\xec\xfe\xbe\x77\xc0\xfc\xfe\x1d\x88\x05\xde\xe9\xaf\x32\xef\x47\xd8\x04\x8d\x15\x08\xe3\x6c\xb2\x64\xbf\x65\x4c\xf4\x3b\xb0\x30\xb3\x86\x93\x07\x1b\xfd\x2a\xb9\xe0\x4b\xad\x81\x0a\xa7\x5e\x71\xb9\x58\x40\x55\x9e\xa6\x7c\x3d\x86\x07\x35\x61\x3e\x6a\x0c\x3d\xd7\x12\x65\x3e\x4c\x0f\x4a\xdc\xe6\x04\x66\xe9\xb4\x98\x5a\x15\x05\x85\xdd\x24\x05\xde\x09\x8f\xc2\x00\xe8\x05\x40\x5e\xb8\x10\xa4\xaa\x8d\x0b\xe3\x3b\x96\x7a\x66\x4f\xa8\x2a\x97\x8b\x2d\xe4\x9e\x31\x36\xeb\x47\x40\x70\xb4\x89\x32\x57\x80\x53\x06\x2b\xa5\x5b\x03\x69\xec\x56\x96\x30\x9a\xe3\x74\xd9\x29\x1f\xb8\x52\xb8\x2b\x44\x7c\x82\xf4\xf5\x71\x92\x2d\x7a\x41\xd1\x67\x57\x18\x82\xa2\xfe\x93\x14\xb6\x6f\x1f\x54\x21\xcd\x00\xe5\x12\x0a\x96\x00\xb1\x40\x77\x6d\x3c\xb1\x76\xc9\x23\xe5\xcc\x47\xb6\x5d\xd6\xe5\x0a\x5a\x65\x54\x4c\x45\xb1\x58\x11\x12\x27\xfd\x7d\xd4\x38\xc1\x10\xce\x89\xbf\x4f\x33\x07\x6a\x9f\x5e\xe0\x41\x99\xaf\x34\x78\xe7\x92\x4d\x03\x81\x41\x2c\x63\xf1\xdd\x0a\x75\xec\xee\xee\xa7\x90\x19\xab\x35\x2f\xb7\x08\x33\x5b\x00\xcf\xdb\x5a\xd6\x90\x93\x09\x47\xca\xd4\xd5\x76\x0e\x60\xde\x85\xd8\xe9\x2d\x21\xcd\x89\x39\x16\x79\x61\xe6\xa6\x59\x8b\xa2\xe0\x6b\x31\xaf\xb4\xc9\x98\x2a\x0b\x55\xca\x18\xfb\xdc\x6a\x69\x72\xbd\x29\x40\x75\x3d\xa8\x11\x7a\x7e\x21\xef\xa1\xbe\xb2\x44\x52\xb6\x42\x96\xcb\x7a\xd5\xcf\x5c\xd1\xfa\x4c\xd7\x2b\x47\xda\xe4\x5d\x8b\x78\x68\x3e\x5a\xeb\x36\xd4\x8e\x11\xb9\x0d\x6c\x22\x80\x94\x8c\x8f\x5d\x3c\x7f\xde\x69\x4a\x33\xce\x94\xf1\xa5\x15\x94\x46\xd2\x7c\x04\xab\x40\x6a\x54\xb3\xd0\x39\x8c\x42\xb5\xa1\xf7\x0d\x60\x6b\x0f\xe7\x73\xbd\xde\x40\xce\x68\xe3\xd3\x98\x02\x9b\xf4\x8c\x76\x7f\x9c\x42\x81\x32\xd8\x59\x12\xbe\x84\x22\xb9\x17\x4c\x97\xa8\x4f\xef\xa1\x68\x9f\xf0\x74\x9f\xd0\xee\x40\x02\x90\x5a\x2f\x01\xa7\x3f\x63\x58\x35\x85\xfc\x41\xe4\x85\x70\x59\x30\x69\xb5\x0f\x75\xbd\xa1\x33\xf8\xc9\xa2\xd2\x45\xac\x61\x6a\xdf\x8f\x98\xa7\x63\xe5\x9f\xe4\xd2\x9a\x47\x12\x4b\xe7\x81\x1f\x5e\xce\xb6\xcb\xa5\x4f\x39\x4d\xe5\x3f\x23\x00\x1b\xd0\xb0\x72\x8d\xab\xfc\x8f\xef\x8d\xb6\xaa\xf3\x07\xee\x8e\xf4\xe3\xdf\xb1\x3f\x58\xb4\x3f\xe6\x7d\xfe\xa1\x43\x2f\x82\x7e\x52\x29\xbc\x69\xb9\xf2\x0d\xcf\xb7\x30\xef\x98\xc3\x12\xe9\x42\x92\x80\x4d\xd3\xe7\xbd\xf6\xe4\x47\x0d\xa4\x11\x98\x32\x43\x4d\x42\xc2\xc8\xbd\x2c\x0a\xb8\x3e\xd1\x6e\x02\x4c\x3e\xcc\x43\x73\x9a\x0f\xb0\xb8\x78\xbe\x88\x4d\xa4\xfb\x3c\xf1\x34\x70\xce\xf3\x3e\x3f\xd3\x3c\xba\x2c\xe2\x1d\x70\xd4\x27\x55\x04\xfe\xf2\x90\x86\x1d\xdd\x43\x9d\x70\xf8\xa8\xbe\xb6\x74\xed\x96\x66\x8a\x21\x05\xb8\x1a\x8c\x63\x61\x5c\x38\xc6\x8c\x58\x62\x3b\xb2\x88\xb5\x42\x8e\x30\x3f\x19\x95\x44\xf3\x45\x52\x09\x96\x2a\xbf\x36\xb5\x48\xb7\x3f\x7c\xca\x4a\xcb\x56\x89\x55\x6b\x2a\x07\x83\xa4\xae\xf0\x4e\xd3\x2c\xc0\x23\xca\xd6\x98\xce\x43\x7e\x7c\x99\xa8\x7b\xaf\x9b\xab\x83\x28\xf1\x4e\xd5\xeb\x9a\xd6\x01\x63\xc7\x7d\x7e\x6b\xcf\x43\x98\x0f\xcc\x9d\xf1\x51\xb8\xb5\x9c\xaf\x44\xa9\xcc\x1a\xda\x73\xe6\x5a\xdb\x3e\x1b\x32\xdf\x42\x78\x45\x19\x58\x7b\x98\xcd\x03\xab\x41\x59\x65\x4e\xd4\xbc\xda\x96\xbc\x56\x6b\xd9\xad\x5e\x32\x51\x54\x52\xe4\x50\xa0\x0c\x0c\x19\x64\x93\xd8\x35\x00\xe4\x0a\x87\xd9\x04\xaa\x39\x2e\xde\xc1\xac\x8f\x89\x13\xa4\x00\x05\x06\xc0\xc6\x6a\xec\xb3\x1c\xdd\x65\xef\x2d\xde\x43\x10\x00\x35\x20\xa5\xba\xe1\xb2\x96\x59\x24\xfb\xc8\x15\x08\x4a\x0b\x80\xb3\xe0\x1e\x18\x07\x6e\x01\xb4\xe4\x01\x13\x82\x44\x23\xc6\xa6\x22\x73\x5e\xfa\x70\x14\x8b\x30\xc9\x40\xb8\xc6\x24\x05\x89\x5d\xd0\x5a\x70\x9c\x88\x88\xd1\xc2\x61\x38\xc0\xd0\x5a\x8d\x59\xc5\x22\x06\x77\x70\xd8\x32\x58\x36\x62\x85\x8d\x7c\x60\x13\xa7\x32\x2c\x36\xef\xdd\x09\x21\x03\x1f\xcf\x88\x93\x29\x2d\x1b\xff\xa1\x85\x49\xa6\x9a\x1f\x44\x71\x42\xca\xf0\x7b\x99\x1f\xa1\x12\xbc\x6f\xea\x09\x03\x37\x91\xe5\x0f\xca\x19\x51\xe6\xec\x61\x11\x92\xc4\x2b\x7d\x3f\x8e\xb3\x10\xff\x74\xcb\xf7\x60\xc7\xe8\xce\xfd\x9e\x03\xcd\x9e\x70\xa0\xfb\x20\x78\x5f\x45\x6a\x88\x37\x5c\x23\x55\x64\x53\x88\xb9\xf4\x27\x9c\x2c\x08\xe5\x6a\x70\x00\x59\x09\x0d\xd1\x2e\x3f\x13\x37\x2a\x97\x6c\x86\xff\x45\x81\x6a\x54\xb9\x2c\x42\x83\x4e\x57\xa1\x68\x39\x41\x73\xec\xfd\x18\x84\x63\xa3\x69\x26\xa5\x95\x78\xf6\xf6\xdc\xd2\x99\x83\x63\xf2\xca\xb7\x20\xc7\x92\xcc\x99\xfb\xd8\x7e\xdd\xca\xc3\xec\x91\xf2\xba\x47\x41\x49\xb5\x00\xd7\xbe\x1f\x4c\x87\x22\x00\xa4\x42\xad\xb9\x0b\x4e\xbd\x6d\xe9\x5b\x09\x44\x2f\x7b\x66\x28\xa3\xf1\xc5\x80\xdc\xac\xf3\xfe\x43\x9d\xe5\x01\x75\xaa\xb3\xfb\x1e\xf3\x08\x0d\xc2\xe0\xae\x63\x5d\xeb\x9e\x91\x64\x80\x48\x38\xdc\x01\x90\xb3\x5b\x6b\x64\x4b\x00\x4b\xd0\x4d\x97\xfd\x73\x18\x29\x73\xb6\x58\x32\x41\xa8\x23\xbc\x1e\xf0\x89\xbc\x53\x26\xf2\x41\x3c\xd9\xcb\x4e\x56\xdf\xbe\x60\x02\x6e\x75\xfb\x86\x59\x59\x55\x16\x3e\x42\xfe\xa6\x52\xde\x87\x18\x3f\x39\xd3\x1e\xf7\xea\xa3\xcf\xc8\xde\x5b\x56\xc0\xaa\xb5\x1c\x70\xc8\x29\x4c\x5a\xb3\xb7\x10\x9b\x49\x4f\x2b\xa5\x4a\x6e\x36\xaa\x52\x1e\x62\xde\xdd\x6a\xf4\x06\x5e\x0f\xc0\x1f\x05\xa9\x90\x44\xef\x47\x24\xba\x94\x48\xc8\xec\x27\x36\x95\x9e\x15\x72\x6d\xa8\x26\x60\x2e\x2b\x70\xd8\x8c\xac\xaa\xec\x84\xa7\x32\x10\x4f\xb4\xa7\x32\xc7\x6c\xdb\xad\x32\x40\xc2\xe5\x9e\x28\xb7\xeb\x99\xac\x40\x8c\x25\x7a\x22\x40\x77\x31\x40\x5b\xbe\x93\xc0\x7e\xe1\xa4\x92\x3b\xaa\x7c\x2e\x2b\xc8\x3c\xc1\x26\xda\x22\xfb\xd1\x20\x00\xef\x51\x9e\xa8\xb5\x2e\xbd\x13\xb7\x87\x25\x03\x0e\x88\x21\x0b\xa8\x6c\x60\x99\x6d\x5c\xbe\x75\x04\xc8\xb6\x0f\xde\x9e\xca\x07\x1d\x7d\x15\xad\x7e\xdc\xd3\x0a\x32\xb7\x9b\x5d\x88\x9e\x24\xff\xf6\xbe\x5d\xd5\x9c\x38\x86\x13\xc7\xe3\x89\x0b\xde\x1b\x98\x41\x6b\xf4\xa5\xb3\xff\x1d\x51\x13\xef\xa7\x42\x3c\x50\x48\xb2\x7d\x62\x34\xca\x45\x4c\x38\x7a\x7e\x9e\x3c\x42\xf0\x01\xb6\xf7\x06\x7f\x70\x6f\x6c\x2a\xfd\x6d\xc7\xe7\x50\x79\x34\xb7\x37\x03\x11\xcb\x39\x56\xd8\xbb\xef\x3d\xdd\x8e\xe6\x65\xb3\x29\x76\x19\xe2\x65\xc1\x37\x9e\x19\x42\x3a\x8d\x70\x68\xf4\x02\x9c\x1c\x9b\xda\x21\xaf\xc6\xd3\x44\x01\x43\x01\x42\x31\x81\x40\x80\x1b\x75\x47\xec\x5b\x84\xb7\x6a\x47\xe3\xde\x6c\xd8\x52\xff\x85\x53\x57\x07\xcf\xcf\xd5\x6c\x53\x2e\xff\x79\xd5\x9f\x8f\xc6\xff\x8f\x8e\x5e\x36\xf1\xff\x5f\x1c\xbd\xfc\x99\xff\xf9\x87\xfc\xdc\xb8\x12\x4d\xee\xa9\x6d\xed\x76\xf0\x4e\x8a\xb8\xb0\x8e\x0e\x15\xe9\xaa\xa5\x92\xe5\x5c\x42\xcd\xdc\x5c\x18\x64\xd5\x41\x7e\xa9\x79\x25\x37\xa2\x9c\xef\x1c\x99\x4d\xa8\x03\xf5\xa1\x62\xdf\x3c\xb9\xf3\x55\x21\xb9\xdd\x85\x2b\x94\x07\x60\xae\x21\xc1\x90\x7b\x84\xfa\x15\x27\x51\xa2\x01\x5f\x20\x03\x0e\x0a\x15\x62\x54\x1a\x30\xd6\x04\xcc\xcc\x22\x0c\x14\xd4\x78\x28\xc1\xe1\x6d\x33\x32\x42\x5f\x72\xf2\x59\x95\xc8\x84\x1c\x9c\xe1\xbe\xf3\x11\xd3\xbf\xbf\xc2\x10\x1f\x1f\xb2\x04\xcb\xb9\x2f\x54\x04\xf7\x23\xd4\x1a\x41\xb2\x7c\x4c\xc4\x42\x9f\x0b\x34\xbe\xf4\x0b\x2f\x57\x8f\x07\x27\x83\xd7\x19\x1f\x6e\x97\xd6\x08\x39\x7e\x95\x71\x7b\x52\x02\xf3\xc2\xf1\xe0\xe5\xe0\x55\x16\xb2\x76\xdf\xd8\x07\x8e\x8f\x20\x2e\xc8\x5a\xfc\x0e\x2f\xe1\xf5\xd7\x87\xf6\x11\xfe\xb1\x90\x65\xc9\x27\xc2\x76\xc6\x1c\x5e\xcb\x55\x05\x75\xa9\x4e\x4d\x8f\x99\x63\xac\x0a\x08\xa5\x58\xae\x88\x0f\xf4\xbd\x46\x0d\x9f\x47\x91\x36\x34\xac\x43\xdb\xf9\x57\x41\x55\x0d\x37\x7d\xa8\xe8\x65\x58\xf6\x43\xcd\x46\xe8\x70\xb4\xd0\xd6\x56\x03\xe1\x6e\x18\x8b\x0b\x48\xbb\x66\xea\x68\xf0\x4b\xc6\xff\xb4\x2d\x76\xfc\x18\xc6\x79\x14\x4f\x93\xed\xc9\x21\xbf\x9a\xd7\xda\x4e\xd3\x0b\x78\xe0\x04\xa7\xa9\x3d\x4f\x50\xf6\x7c\xf2\x87\xcc\xd0\xd1\xe0\xf5\xc3\x33\x64\xbe\x67\x8a\xa6\x6a\xad\xcb\xc3\x6b\x25\xab\x4a\xf2\x53\x91\x2b\xb9\xfd\xc6\xd8\xa8\x52\x73\x3e\x1d\xf0\x89\xd8\xad\x75\x99\x33\xf6\x51\x15\x85\x34\xfc\x2f\xba\x28\x44\x59\x33\xf0\xb3\x75\x74\x22\x01\x6f\xac\x57\xf1\x78\xde\x32\x4c\x7a\xc3\x48\x46\xa8\xb2\x75\xec\x59\xe8\x70\x41\x0f\x24\x36\x0d\xc2\x43\x96\xbf\xe9\x5d\x8c\xcb\x41\x56\x0b\x14\x80\xf9\x57\x03\x33\x37\x64\x08\xb4\xbf\x82\x2c\xa6\xb6\x3d\x08\xc2\x45\x44\xec\xd8\x1a\xf8\x8c\x16\xdb\x62\xa1\xc0\xf5\xb1\xf3\x76\x62\x94\x6b\x10\x6a\xd5\x2b\x88\x2f\x3b\x4a\xe0\x22\x64\x50\xf8\xec\x08\x0f\x9f\xb1\x10\xdb\xa2\x8e\x20\x0b\x89\xc2\xab\x52\xe6\x2b\x24\x75\x8b\x5a\x99\x85\x98\x03\xdd\xc9\xff\xde\x52\x11\x5b\x84\x1f\x9f\x31\x31\x9f\x6f\x2b\x31\x77\x86\x17\x06\x11\x55\x54\x85\xb5\x35\x90\xb4\xdd\xdc\xde\x47\x83\x37\x76\x77\x8b\x72\x6b\x3b\x77\xfc\xe6\xcd\xaf\xf1\xee\x3e\xb2\x42\xe2\x42\x54\xf3\x15\x3f\x39\x72\x9b\xbf\x63\x6f\xe3\x7b\xc7\x6f\xde\xbc\xf9\x03\x36\xf7\xd1\xe0\xcd\xeb\xec\x77\xdb\xdc\x76\xc7\xe9\x35\x3f\x17\xa5\x64\xac\xb3\xf3\x8c\x7d\xb6\xfb\x7a\x0d\x95\xf2\xd3\xf9\x4a\xa8\xaf\x5d\xf3\xf8\xeb\x9b\x8c\x3b\x22\xea\xd7\x61\x12\xb1\xb7\x17\x02\x26\xf7\x97\x7d\xb3\xf7\x1a\x66\xef\x17\x3e\x2c\xf3\x4a\x0a\xc3\xcf\xd4\x72\x29\x2b\xc6\xce\xba\xa6\x8b\x7f\xe7\x74\xfd\xfa\x2b\x4e\x17\xdb\x3b\x5d\xfc\x7b\xa6\x0b\xd1\x11\xf4\x7d\x61\x3b\xf8\x67\x79\xa7\x4a\xfe\xbe\x12\x73\xb9\x63\x6c\x2a\xd6\x80\x9b\x20\x8b\x82\xb1\x0b\xb1\x2c\xb7\x86\x7f\xd2\xc5\x7a\x59\xc9\x92\xb1\x18\x0a\x00\x67\xfd\x06\x3c\x5a\x5d\xb3\xf9\xca\xcf\xd9\xab\x78\x2e\xed\x50\xa2\xcd\xfa\x7a\xdf\x7c\xbe\x82\xf9\x7c\xcd\x3f\x6e\x77\x1c\xc5\xd4\x7c\x25\x8a\x52\xd4\x19\xff\x58\xe9\xed\x86\xbf\x3c\xc1\xf4\xc1\x1f\x00\x99\xe8\x9a\x96\x1e\x57\x86\xa5\x80\x13\xfc\x11\xc0\x89\xb0\xd4\x05\x2e\xb5\xb5\x61\x2f\xac\x20\x29\x73\x51\xd8\xcd\xd8\xec\x3b\x43\x28\x83\xe9\x7c\xb5\x56\x79\xcd\xd8\x8d\x5a\xf3\xcf\x72\x09\x33\x78\xb3\x92\xfc\xfa\xf2\x23\x9f\xb8\xf8\x4c\x9c\xb2\xe5\xd3\x26\x28\x0f\x1f\x13\xa4\xba\xc6\x01\x3e\xcd\x74\x86\xfc\x0e\x03\x49\x45\xb2\x12\x1c\x4e\x84\x76\x80\x30\x77\x84\x77\x90\x94\x70\xba\x9c\x93\xc0\x5e\x86\xea\x55\x68\x04\xb2\xad\x65\x35\x5f\x89\xb2\x76\x20\x04\xe0\x98\x5e\xf0\x85\xaa\x4b\x69\x4c\x13\x47\x00\x09\x3e\xf7\xf5\xbd\xb1\xba\x00\x84\xb3\xb6\xaa\x21\xe0\x29\x60\xfb\x0b\xcf\x78\x91\xb1\x07\xe1\x14\xec\x08\x21\xb8\x5d\x21\x4d\x46\x27\xb4\x42\x86\x19\x64\xcc\xaa\x75\x95\x34\xdb\xa2\x0e\xd9\x42\x94\xc1\x57\xef\x5b\x9b\x0c\xf2\x39\x80\xdf\x36\x47\x8f\x13\x79\x97\x90\xf1\x19\xbb\xeb\xe8\x40\xf1\x7b\x2d\x34\x86\x98\x32\x03\x8f\x30\xa0\x3e\x13\xb4\x36\x51\x5d\x34\x32\x5e\xa9\xe0\x63\x5b\xcd\x25\x24\x56\xc1\xe8\x7c\xe8\xd7\xd5\xe2\xb6\x00\x1c\x3c\x94\x90\x94\x59\x93\x0a\x31\xe8\xaa\x0d\x94\x05\x4c\x75\xea\xac\x13\x6a\x54\x2a\x75\x96\x0a\x01\x82\x7a\xab\xba\xfc\x91\x4a\x9b\x7f\xa4\xfa\x1a\xe0\x1e\xf1\xca\x3e\x6d\x86\x4b\xa3\x22\x1b\x57\x17\x0f\x68\xf9\xd8\x39\x4c\x0a\x09\x89\x78\xba\x62\x22\x2d\x14\x6a\x80\x55\x7e\xcf\x46\x76\xd5\x38\x80\xad\xee\x62\x8d\xf1\x82\x20\x82\x57\x39\xd7\xdb\x4a\x2c\x65\xba\xfd\x1a\xb3\x0d\x81\xdc\xb9\x5e\x6f\x34\x78\x39\x00\x96\x7c\x13\xf1\x61\x33\xbb\x59\xc1\x7c\xc2\x10\x04\x81\x7e\x39\xc8\x0e\x57\x44\xd4\x55\x8c\x15\x3e\xd2\xa8\xc7\x6a\x14\x63\x19\x1e\x97\x55\x61\xf6\x6a\x47\x0d\xd6\x00\x12\x45\x37\xe5\xf2\x6f\x4b\x59\xff\xcd\x0b\xe4\x5e\x48\x6f\x52\x86\x7b\x6e\x9b\x2c\x44\x31\xad\x21\x59\xbb\x02\xbd\x9e\x98\xe9\x6d\xdd\x63\x33\xfd\x4d\x86\xaa\xb6\x42\x7d\x95\x6f\x19\xdb\x54\xaa\xac\x17\x07\xbd\xff\x66\x7a\x59\xeb\x43\x07\x97\xb7\xe7\xe7\xfd\xfe\x3b\xc6\x86\x85\xd1\x99\x3f\xc9\x85\x5e\x6a\x80\x07\x81\x99\x82\x49\xca\xb0\x78\x6e\x5b\x19\xd9\x4f\x64\x6e\x64\x8e\x1a\x18\xcb\x4c\x54\x83\x4d\xb9\xec\xc1\x8a\xb9\x5f\xfc\xb6\x59\xf2\x83\x5f\x7f\xfd\xf6\xe2\xb8\xcf\xdd\xef\x4b\x7d\x0f\x0f\xf2\x83\x37\xf0\x87\x01\x63\xe8\x58\xb1\xed\x5f\x4d\xc7\xfc\x54\x56\x35\x46\x82\xae\x36\xb2\x74\x61\x29\x4f\xf2\xf0\xc0\x33\xca\x30\xf4\xd0\x46\x78\xaf\x80\x5a\x8a\xd2\x2a\x7e\x74\x5c\xaa\x5a\x41\x3d\xfb\x60\xaf\x82\xb4\xb4\xbf\xae\x36\x1c\x53\xf0\x2a\x33\xc0\x9d\xb0\xd0\xd5\x52\x0e\x4a\x59\x33\xd6\xb4\x24\xff\xeb\x7a\xc7\xfe\xcf\xff\x19\x3c\xff\x78\x7a\x7a\xe8\x11\x52\x0e\x5f\x0c\x8e\xff\x68\xfe\xcf\xd7\xaf\x5e\xbc\x6e\xf2\x7f\xbe\x3a\x79\xfd\xd3\xff\xf7\x47\xfc\x7c\x3c\x3d\xe5\x93\xdb\xcb\x9b\xf1\xc5\x88\x9f\x8f\xdf\x4f\x86\x93\x2f\x7c\xf4\xaf\xa7\x23\xa8\x2f\x8c\x6a\x7f\x06\xc7\x19\x7f\x71\xec\xed\xcb\xa3\x37\x8c\x39\xef\x7e\x94\x7b\xf0\x96\xaf\xea\x7a\xf3\xf6\xf9\xf3\xfb\xfb\xfb\xc1\xb2\xdc\x42\x8d\x0f\x69\xe3\xe6\xf9\x72\x3e\x0f\x3b\x6d\xb0\xaa\xd7\x45\x47\x0d\xd1\x9b\x27\xd5\x10\xfd\xf3\x4a\x88\xf8\xf7\x96\x10\xc1\x0c\x6e\x4b\x88\x1e\x3a\x3d\x3e\x64\x8b\x1f\xf4\xfc\xbf\x7b\x7d\xac\x1e\xe9\xce\xab\x6d\xe4\x80\xfc\xf2\x94\xb2\xa1\x50\x5c\x73\xd0\xfb\x78\x7d\x7e\xf7\xa2\xd7\x1f\xf0\x71\x1d\x47\xdd\x04\x45\x0d\x91\x66\x06\x0a\x22\x1a\x9d\xed\xf5\xd1\x97\x32\x93\xc2\xaa\x33\x4e\x7f\x82\x54\x02\x1f\x52\x0a\xf6\xd5\x4a\x17\x79\x88\x73\x41\xb3\x80\xc4\x03\xea\x88\x2b\x87\x07\xb6\x6b\x93\xd4\xe7\x40\xff\xb8\x00\x38\x23\xf2\x07\x28\x13\x26\x6a\xc0\xd8\x67\x97\xbd\x6d\x55\x01\x3b\xab\xb0\x80\x80\xa6\x83\xea\x09\x62\x0b\xd8\xbf\x60\xda\x25\xa6\x6b\xc5\x69\x90\x2e\x8e\x69\x9f\xc1\x84\x5f\xba\xcb\x21\xe9\x91\xc6\xed\xb1\xb7\x92\x08\x3a\x82\xf6\xd0\x57\xa8\x2a\x85\xd2\xa8\xdd\x0e\x09\xab\xaa\x70\x6e\xed\x46\xa0\x77\x7d\x66\x66\xa9\xcb\xc3\x8f\xd7\xe7\x31\x50\xd4\xa6\xd2\x9b\x4a\xc9\x5a\x54\xbb\x3e\xf7\x05\x0d\x4e\xfb\x77\x44\x40\xf7\x62\x87\x4a\xcb\x13\x3a\xde\xcc\x9d\x88\xa7\x11\x2b\xc2\x5a\x65\x60\x43\xbf\x2a\xa2\xe4\xbd\x71\x99\xcb\x8d\x2c\xad\x11\xc5\x2f\x74\xbe\x2d\x64\xcf\x9a\x36\xaa\x76\x81\x56\x8f\x6d\x6a\x7b\xd4\xdc\xde\x01\xe4\x0b\xe0\x15\x80\x1f\x1f\xb2\x1f\xfd\x44\x5c\x3b\x74\x56\x28\x77\x7f\x62\x85\x54\xf3\x3b\x19\x95\xf5\x3f\x54\x23\xd5\x78\x05\xc7\xda\xfb\x78\x7a\xda\xa3\xba\x14\xd1\x15\x55\xc5\xae\xca\x8a\x9f\x12\x95\x98\x95\x2e\x0f\x41\x40\x98\x2c\xd9\xcc\xd1\xc1\x83\xc4\xcf\x90\xe6\x93\x04\x9f\xfb\x8f\x1f\x62\x7e\xf0\xf1\xfa\xbc\x1f\x76\xa2\x0f\x8a\xfb\x52\xad\x5d\x27\x11\x7d\x3b\xe8\x3b\xfd\xe0\x06\x7f\x7d\x1e\xa7\xb8\x79\x6a\x34\x9e\x20\x07\x20\x89\x51\x52\xb2\x68\xf7\xa9\x58\x92\xac\x4d\x32\x8e\x1d\x82\x06\xea\xfd\x28\x62\xe9\x00\x46\x99\x91\xf6\xd4\x59\x53\x02\x7c\x5f\x61\x48\x11\xc3\xc4\xc7\xd3\x53\xea\xe4\x8d\xa8\x96\xb2\xa6\xaa\xa2\x50\x4d\xa2\xb7\xf5\x66\x5b\x07\xf3\x6c\xee\x16\x0a\x0b\x8f\x2a\x89\xc0\x89\x77\xaa\x02\xda\x86\x1a\x5b\x21\x2c\x60\xfb\x48\x35\x5f\xa9\x5a\x42\xaa\x7c\xd6\x49\xb4\x50\x25\x09\xa2\x5c\x95\xf6\x7b\x00\x8f\xc8\x85\x31\x72\x3d\x03\xa0\xca\x42\xdb\x33\x98\x41\x5a\x24\x7a\xeb\x9e\x27\x7b\x7e\xb3\x12\x06\x08\x8a\x6a\x3b\x4c\x40\x8b\x73\x12\x30\xe3\xd1\xd8\x42\xc6\x80\x23\xca\x80\x74\xfe\x88\xf8\x4a\xd4\x3e\x43\x11\xf2\x9c\xbd\xc1\x07\xc3\x86\xb3\x42\x51\x26\x1e\x23\x56\xd9\x25\x42\xb2\x38\x8c\xcb\x85\x8a\xa8\xa7\xbd\x8d\xcb\x40\x35\x5f\xad\x73\xdb\xe3\xc8\x95\x05\x25\x26\x60\x22\xa2\x97\x1b\x58\xf4\x02\x08\x06\x90\x41\x95\x87\xc9\x67\x1c\x37\xbe\xe1\xb9\x34\x6a\x59\x52\xff\x56\xdb\xb5\x28\x0f\x1d\x30\x05\x3a\x32\x68\x56\x55\xc9\xff\x24\xee\x04\xff\x0b\x2d\xea\x85\x98\xaf\xac\x60\x9f\xed\x6a\x49\x4f\x02\xb1\x67\x34\xad\x56\x3e\x6f\x4d\x46\x82\x48\xac\x37\x9e\x69\x21\x45\x55\x59\xc2\x99\xab\x9d\x9d\xbe\x81\xca\x31\xaa\x99\x00\x8f\xbf\x73\x11\x44\xb5\x75\x71\x51\x48\xa7\x48\x33\xaa\x24\x9c\xc6\x8e\x3f\x43\xa2\xc4\x8c\xf2\x9a\x4d\xad\x35\x3a\x3a\x6a\x81\x16\x7b\x38\xe7\xb8\xd1\xe9\x3b\x51\x3f\x61\x2d\xa3\x6e\x3a\xe9\xdd\xf5\x2d\x65\x78\x6f\x54\xa8\xa5\x3d\xe7\x4e\x7e\x2b\xc3\x73\xab\x0a\xa1\xf8\xf8\x78\x7a\x9a\xc1\xa5\x2b\x9d\x64\xa3\xa4\xb4\x86\x90\x48\x40\xb4\xd3\x86\x9c\x38\x0c\xf2\x28\xcd\x82\xb3\x67\x1a\xf2\xdf\xa3\x85\x50\x10\x41\x86\x8b\xb0\x4b\x14\xc1\x49\xdf\xd4\x6a\xad\xfe\x8e\x89\x2f\x28\x39\xf6\x6e\x56\x43\x82\xc7\x2e\x16\x84\x54\x16\x3b\x2a\x10\x73\xa3\xef\x9a\x1e\x5f\xbb\xf7\x11\x28\x6a\xf5\x22\x2e\x93\xbe\x8e\xa1\x51\x38\x87\xaa\x1f\xc8\x4c\x8a\x34\x32\xcc\xd8\x05\x91\xe8\x13\x27\xf5\x22\x39\xde\xf6\x84\x34\x8b\x5f\xbb\x6e\x4c\x98\xf9\xf6\xa5\x6b\x82\x57\x11\x7c\x61\x91\x04\x6e\xe5\x12\xdf\x29\x5d\x08\x02\xdb\xf1\xb9\x82\xa0\x55\x35\x8b\xd5\x44\x51\x24\x9d\xbc\x17\xc6\xed\x30\xec\xeb\x43\xb3\x26\x23\x92\x46\xa8\xa7\xeb\x4a\xc5\x8c\xb3\x96\xbb\xb3\x30\xe1\x40\x19\xc8\x52\x6e\x5c\x04\x11\x0e\x61\xc7\x84\xf8\x5a\xc6\x4b\xcd\x3f\x4b\xf1\x55\x96\xf4\xbc\xdd\x22\xd6\x58\x28\xe4\xa2\x26\x7f\x1c\x39\x93\xbc\xeb\xb5\xa1\xa4\x05\xd1\x0b\x30\x7c\x00\xc4\x41\x77\xb0\xdd\x5c\xdb\xf5\x26\x14\x23\xd6\x2b\x55\xe5\x87\xc8\x36\x19\x83\x0a\x6f\x4b\x01\x55\x39\xa9\x26\x6c\xfb\xe0\x34\x24\xa0\x0b\x0e\xa1\xcc\xf4\xaa\xfb\xf7\xb6\xee\x1e\xff\x19\x3c\xbf\xfe\x74\x7d\xf8\x62\x70\xf4\xfb\x9b\xfd\xfe\xe7\x11\xfb\xff\xd5\xcb\x97\x4d\xfb\xff\xe4\xf5\xcb\x97\x3f\xed\xff\x3f\xe2\x07\x62\x51\x9f\xae\x3b\x6c\xca\xc1\xd1\x71\x1b\x0c\xfe\x0d\x3f\xe4\x27\x47\xc7\x27\xdc\xbd\x07\xae\x6f\xc0\x61\x63\x7f\x00\x0e\x5b\x62\xdf\x7f\x37\x0c\x5b\x8b\x85\xf1\x47\x51\xd8\xd8\x1e\x4c\xe8\xc7\x50\xd8\x5a\xf4\x77\x2d\xc4\xe8\x36\x91\xd7\xef\xda\x87\x7f\x80\x68\xae\xee\x22\xf0\x0a\x08\x67\xbd\xeb\x4f\xd7\xbd\x24\x8e\xf3\x3b\x41\x9b\xed\x45\x34\x03\x9d\xa3\xfd\xfb\x8c\x6d\x20\xc5\x0a\xcb\x20\xe7\x35\x5f\xda\x1d\xfa\x7f\x6f\x56\x9b\x41\x29\x6b\xa0\xc3\xb1\x57\x5d\x07\xf5\x56\x03\x11\x2f\xc4\x8f\x08\x4d\x02\x86\x98\x01\x7d\x89\xfd\x23\xfc\x2f\x43\x42\x5f\x9a\x57\x55\xc1\x64\x64\x8f\x76\x1e\x3f\xd8\xe8\xd9\x17\x9f\x70\x96\xdb\x0d\x2f\x7d\xe5\x79\x15\xcd\x0a\x10\xbc\x42\x8c\xa7\xfc\xcd\xc5\x55\x60\x7d\xec\x61\x9c\xed\xb8\x11\x3b\x55\x2e\x59\xef\x83\xd6\xa0\x1d\xc3\xb2\xa8\xd2\xd4\x52\x40\xc4\xd2\x8e\x85\xdc\x59\x76\x00\xfc\x83\xd6\x08\xbc\xbb\x59\x6d\x16\x5a\xf7\x18\x7b\x35\x48\x0f\xf7\x77\x66\xdb\x27\x64\x7f\x2c\xcd\xa9\x4f\x12\xda\x21\x41\x67\x26\x9f\x98\xd5\xce\xae\xca\x79\xa8\xec\x84\xc3\xba\x82\xd0\xa0\x8c\x53\xbc\x51\x23\x11\x0f\xe0\x89\xb8\xd4\x00\xe6\xd2\xfb\x44\x71\x8f\xe5\x99\x65\xad\xca\xad\xc7\xc7\x57\x75\x77\x69\x62\x48\x22\xf6\x6a\x12\x43\xc8\x11\x4a\x33\xc6\xd7\x41\x5b\x4a\x7a\xdb\xd1\x5a\xb7\x6d\xcf\x1a\xf3\xd8\xb2\xf4\x23\xb1\x7b\x49\x25\x98\x01\x37\x21\x79\x80\xad\x44\x03\x32\x98\x52\x1c\xa3\x34\xfb\xa4\x78\x3f\xe9\x31\x52\x99\xd2\xa4\xb2\x46\x55\xca\xeb\x4e\x59\xea\x8c\x5a\x80\x25\x30\x1a\xd2\xd3\x9b\x32\x35\xca\x2d\x4b\x02\x8d\x6f\x59\xcf\x81\x88\x02\xea\x23\x19\xcc\x06\x86\x13\xec\x13\xa4\x14\x08\x81\x44\x3c\x4a\xff\x3d\xf2\x3b\xd3\x81\x7a\xee\xde\x79\xfe\x2f\xbd\xa7\xc0\x1f\xda\xcf\x9c\x8d\xfe\x32\x3a\xbf\xba\x06\xd0\xbe\x9b\xd1\xf0\x82\xff\xdb\xbf\x41\x16\xc6\xb3\x67\x4d\x38\xc4\xd1\x19\x0b\x80\x88\xfc\x1f\x06\x44\x64\x6d\x40\xc4\x27\x91\xbe\x75\x00\x22\xb2\x36\x20\x62\xf7\xd8\x6c\xff\x6f\xa6\x08\x04\x38\x7e\x7f\x7b\x73\x35\x99\xa6\x90\x89\xec\x87\x20\x13\xf7\xb2\xb3\xb1\x1f\x86\x4c\x6c\x13\xc4\xbd\x63\x3f\x0a\x99\xc8\xdb\x90\x89\xec\x07\x21\x13\x79\x1b\x32\x91\xfd\x18\x64\x22\xef\x86\x4c\x64\x3f\x02\x99\xc8\x3d\x64\x62\x4a\x91\x42\x16\x19\x82\x93\xe9\x62\x5b\xd6\x0e\x2c\x20\x1c\x61\x47\x22\xbc\xb6\x07\x39\x4e\xd1\xd3\x25\x9f\xc9\x95\x28\x16\x3e\x47\xc6\x0b\x21\xca\x67\xf2\xd7\x05\x39\x40\xe8\xfa\x95\x39\xbf\x53\x82\x8f\x10\x3c\xbd\x7d\x1b\x7f\x00\x2a\x53\xa4\x4b\xf7\x35\x94\xba\x21\xc7\xbc\x4e\x63\x7f\xb3\xa9\xf4\x6f\x90\x05\x44\xf7\xbc\x91\xb2\xeb\xf8\xff\xcb\x80\x31\xfb\xb8\x17\x23\xf6\xfd\xbf\xca\x32\xe7\x23\x00\x3d\xe8\x90\x24\xa2\x4e\x1a\xfa\xbb\x2c\xf3\xc1\x5c\xaf\xff\xe5\x3f\x83\x1d\xf7\xa3\x3f\x83\xe7\xc3\xc5\x7a\x23\x2a\x23\xff\xdd\xec\xbf\xe3\x57\xbf\x1c\xb5\xf0\xbf\x5f\xff\x8c\xff\xfe\x21\x3f\x07\xa7\xd6\xae\xfb\x15\x32\x82\x7f\x7d\x63\xcf\xfe\x30\xd7\x33\x87\x8e\x65\x22\xc0\x1e\xb9\x17\x6e\x1b\xe4\x0c\x44\x97\xac\x42\x35\x93\xee\x64\x41\x80\x35\x6f\x11\x03\xe5\x11\xad\x09\x25\x9d\xf5\x31\x89\x8b\x52\xa9\x29\x02\xe9\x54\x32\x43\x80\x52\xcd\x8a\x10\xfb\xc5\x8c\xb1\x93\xbe\x2b\xdc\x83\x2e\x78\xad\xd0\x97\x9f\x93\xb3\x1d\xe2\x6b\x3e\xbc\xe9\x32\xf5\x9a\xfc\xe6\x56\x4a\x6e\xd4\x7c\xab\xb7\xa6\x08\xaa\xb8\x1d\xe5\xb5\x36\xf5\x74\x5e\xa9\x4d\x9d\xf1\x33\x44\xf5\xe0\xf1\xef\xec\x30\x71\xee\xac\xb4\xad\xe4\x52\x19\x4c\x28\xf3\x3c\xc3\x06\x7d\x90\x7a\x26\x59\xe7\xf4\x5a\x25\x65\xc4\xc7\x97\x1f\xae\x26\x17\x40\x0a\xca\xdf\x8f\xce\xaf\x3e\x5b\x65\xe5\xc3\xed\xe4\x72\x3c\xfd\x64\xef\x2b\x20\xc2\xb5\xbf\x9b\xde\xbe\xff\xd3\xe8\xf4\x86\xdf\x5c\x71\xab\x37\x7c\x1c\xf1\xcf\xe3\x9b\x4f\x57\xb7\xbe\xe2\x05\x20\x95\xa7\x9f\xae\x6e\xcf\xcf\xe0\xae\x7d\x3f\x82\x8b\xf9\x66\x72\x8b\xed\x0c\xf9\xe9\xd5\xc5\xc5\xf8\x06\x2e\xdc\xf7\x5f\xf8\xf0\xec\xea\xfd\x88\x4f\xbf\x4c\x6f\x46\x17\xf6\xd6\x3c\xbd\x9a\x5c\x5f\x4d\x86\x37\xa3\xb3\x01\xdb\xff\x37\x3e\x9c\x4e\x6f\x2f\x90\x30\x78\x32\x9a\x5e\x5f\x5d\x86\x1b\x69\x12\x91\xcd\x12\x06\x33\x1b\x4d\x26\x56\xd3\xb0\xda\xc7\xe5\xf0\xf4\xf4\x76\x32\x3c\x05\xbd\xe9\x61\xd6\xe1\x03\xd2\xbb\x32\xaf\x3c\x5d\x4d\xd8\xf4\x66\x78\x63\xf5\x96\x2f\x7d\x18\x3a\x27\x9e\x56\x3b\x23\xa0\xee\x45\x53\x99\x39\xde\x63\xdb\x48\x8b\x96\xd7\x2a\x01\x56\x57\x7a\x98\x96\x37\xd1\xc6\xda\xba\xd8\x14\x3e\xd1\xa0\xee\x65\x78\x95\x3b\xfa\x5c\x0e\x25\x49\xd3\xff\x38\x37\xca\xe0\xf9\xd5\xc7\xf3\xc3\xdb\x3f\x43\x19\xca\x3f\xe9\x06\x78\xa4\xfe\xef\xc5\xeb\x93\x76\xfd\xdf\x4f\xf9\xff\xc7\xfc\x40\xf6\x60\xe0\xc2\x45\x0b\x6f\x2e\xf9\xdd\xf1\xe0\x08\x71\x25\xac\x34\xf3\xb9\xaa\x2e\x69\x99\x84\xfa\xa1\xa3\xa0\x89\x11\x30\x5c\x38\x33\x28\x56\x91\x05\x59\x60\xfb\x59\x48\x5d\x6c\x7f\x3c\xa8\x66\x65\xce\x17\x85\xfc\xa6\x66\xc5\xce\xb9\x06\xcb\x62\xc7\x04\x5f\xc8\xfb\x94\x8b\xed\xd6\x38\x6a\xa4\x14\x53\x25\xfe\xa8\x7d\x4a\xa2\xb7\x2c\xae\x16\xc8\x45\x2d\x66\x56\x93\xc4\x5f\x79\x80\x36\x4a\x99\x87\x8c\xe5\x5c\x3e\x38\x1c\xcc\xac\x79\x16\x7d\xfe\x59\xdf\x5f\x1e\x06\x7d\x38\x69\x1d\x73\x52\xe8\xce\x22\xf7\x9d\x43\xa0\x45\x04\x5c\x6b\x6e\xeb\x0a\x33\xc6\xb1\x56\x1b\xe2\x50\x45\x7e\xaf\x72\x99\xf1\x4a\xef\x44\x51\xef\x0e\xed\x7c\x41\x91\xd1\x46\xd6\x5b\x51\x64\x10\x7c\x03\xb8\x4b\xa3\xee\x88\x6f\x6d\x2e\x63\xce\xa0\x78\xa6\x1a\xe9\xe1\x9d\x9d\x89\xc6\xea\xe3\x2a\x18\x1a\xc1\xd1\xd9\x1e\xe4\x7a\x4d\xb3\xbe\x10\xca\x93\xdd\x03\xca\x9c\xfd\x7f\x62\xc2\x0f\xc0\x18\x61\x19\x08\xf8\x30\x5a\x05\x9f\x27\xe6\xf8\xf2\x5c\x55\x82\x83\x3b\x41\x42\x65\x69\x07\x85\x4a\x04\x66\xd1\x93\xb7\x24\x8b\x33\xbe\xc0\x7a\xa8\x44\x69\xd6\xaa\x6e\x0e\xfe\x1d\xbc\x2b\x72\xb1\xe9\xfa\x93\xfc\xb6\x29\x74\xfb\xa5\x28\xc3\xba\xd8\xa5\x41\xe8\x24\x12\xa8\xea\x28\xe4\xca\x12\xe4\x20\x5d\xd9\x47\x43\x8e\x90\xaa\x3d\xea\xa6\xbe\x2f\xbd\x13\x44\x57\x31\xeb\xa2\x43\x7a\xd9\x9a\x3a\x23\x94\x0e\x82\x3a\xf1\x24\xdd\xe4\x2f\x7e\xcb\xa2\x34\x6e\x5c\x71\x97\xe9\xbe\x68\x8d\x26\xe9\x08\xf0\x1c\xd7\xc1\x69\xef\x6b\xf1\x59\x82\x65\xd3\x6c\x83\xb0\x92\xaa\x03\xd3\x47\x0c\x51\xec\x1e\x16\x47\x14\x01\x1a\x91\x0b\xc8\xa9\x60\x8e\x89\x8f\x36\xd5\x3b\x0f\x4d\xd0\xd5\x68\xd8\x72\xa1\x15\x4f\x79\xd1\xd9\xd9\x8c\x61\x1c\x7b\x47\x3b\x65\xdb\x12\x0f\xe0\x36\x32\xf2\x0e\xe2\x81\x5d\x1f\x35\x54\x99\x50\xd4\x6a\x53\x48\x16\x7d\xc6\x78\x0c\x9b\x0d\xd0\xfc\x21\xc1\x1d\x55\x17\x76\x2e\x5c\x16\xa3\x92\x42\xa2\x01\xc3\x1e\x35\xa1\x69\x4e\x11\xbb\x2f\x20\x21\xc8\x79\x0d\x29\x12\xa1\x7f\xe4\x17\x8c\x4b\x88\xf7\xc8\x51\x66\x85\xf8\x80\xb1\x98\x4c\x9c\xf6\x8b\x63\x44\x68\xce\x38\x54\x02\xdc\x8b\x9d\x83\x96\x5a\x2e\xa5\x21\x0a\x74\xbd\x58\x28\xbb\xe3\x99\x9d\xe4\x2d\xd5\x5b\x8a\xf6\xd9\xf0\x8b\x46\x8e\x7f\x14\x5b\xae\x74\x3c\x2a\xb3\x69\x1c\xb5\xee\x4e\xae\x95\x29\xc0\x75\x6d\x8f\x10\x7c\x34\xae\x0f\x69\x7d\x1c\x99\xca\x88\xa5\xac\xdd\xea\xbe\xef\x87\x0d\x36\xab\x00\xa0\xd0\xfe\xfd\x4c\xd4\xc2\x8e\xa6\xc6\x04\x31\x36\x9c\xd7\x50\x3c\xe9\x2a\x4d\xaf\x2b\x75\x27\xe6\x78\x4b\x8d\x0a\x39\xaf\x2b\x5d\xaa\x39\x10\xd3\x6f\x4b\x0f\x79\x74\x30\x3a\xe5\x67\x08\xbf\x77\x27\xfb\x31\x53\x3a\x3b\x39\x3a\x7a\x81\x92\x9e\x80\x0b\xd5\x7a\xa3\xab\x5a\x94\x75\x23\x31\x2b\xb9\x6a\x00\xed\x10\x77\xf6\x82\xb0\x64\x80\xe5\x7d\xe7\xeb\x06\xd7\xc1\xe7\x9b\x30\xc0\x42\x6e\x65\xeb\x56\xcc\x1c\xbb\xb9\xc3\xb5\x71\xb7\xa5\x7b\xd3\xe3\x82\xe3\x65\x94\x11\x49\x7b\x99\x73\xb1\xad\xb5\x9d\x40\xa8\x74\x19\x30\x36\xfa\x26\x31\xa8\x6e\xf6\x5d\x19\xe0\x60\x8e\x0a\x5e\x50\x74\x1f\xda\xab\xcb\x20\xb7\x28\xa5\x47\xb5\x37\xc8\x61\x5b\xc9\x00\xf6\x4b\x4a\x58\x6c\x44\x02\x4a\x24\xbd\x9c\x17\x3a\x1c\x95\xe8\x14\x31\x84\x4e\xe5\x85\x35\xd3\x28\x01\x22\xca\xd8\x74\x28\x2a\xf6\x46\x23\xa6\x41\xf7\xe1\xe1\xbc\x36\x1e\x3f\xe4\xf6\xcf\x70\x7d\x4f\xe7\xba\x2e\x44\x99\xf7\xed\x5c\xb9\x3c\x1b\xba\x4a\x4d\x54\xe9\xdc\x75\x4c\x60\x64\xb9\xdc\x88\xaa\x26\x9e\x78\x5d\x35\x4e\xbf\xae\x96\xa2\x54\x86\x8e\xbf\x5e\x6a\x93\xf1\x79\x45\x07\x13\x1d\x63\x13\xab\x08\xf0\x61\xb5\x36\x0c\x6f\x4e\x07\xe2\xb4\x92\xe4\x91\xa7\xc4\xcb\x65\x85\xf0\xb2\x44\x57\xea\x02\x81\xee\x06\x36\xb2\x7e\x47\x4b\xb2\x56\x85\x02\x17\xa1\x2a\x8d\x5a\x96\x4a\xb8\x3f\x40\xae\x04\xc7\x5c\x09\xda\x64\x7b\x65\x80\x4b\x99\x46\x70\x16\x8a\x08\x92\x04\x6b\xad\x69\xa4\x87\xa0\x82\x60\x3b\x0c\xf9\x99\x5b\x2c\x65\xda\xc8\xf0\xcd\x18\x39\x1c\xa9\x58\x4c\xc6\x82\xa9\x4d\x75\x74\x90\x82\x46\x6f\xbc\x83\xb5\xc2\x31\x40\xf9\xa0\xaa\x77\x7e\x02\x5c\x31\x1a\x8e\xe5\x7d\xa5\x6a\x65\x56\xfc\x5a\x18\x63\x8f\xe4\x80\xb1\xcb\x50\x7b\x8e\xca\xd9\x38\x85\xdc\xf3\x62\xf9\x19\xd0\x4f\x3f\xf3\x4b\xd3\x2d\x1b\xbf\xa1\x57\x92\x89\xa2\x68\x26\x3b\x65\x49\xe1\xa6\x9e\x15\x6a\x29\x62\x4d\x08\x33\x5e\x14\xa2\x67\x54\x92\x76\x6f\xad\x59\x4b\x11\x47\x7d\x6e\x2d\xbe\xa9\xf5\x76\xcd\x09\x34\x30\x04\xd0\x67\x3b\x5e\x08\xa7\x6b\x3e\xb4\x7c\x81\xdf\x1a\x04\x85\xac\x2a\xca\x54\xd3\x1e\x14\x9a\x70\x2c\xe3\x56\x6c\x6f\x11\x95\x83\xe2\xa8\x8d\x66\x0a\x6d\x60\x15\x7f\xdb\x12\x47\x2d\x14\x4d\x52\x18\x89\x7d\x55\x65\xce\xe7\x02\xa2\xc8\x56\x41\x41\x7c\x57\x8c\x4d\x3e\xac\x23\x04\xb6\x1d\x3a\x82\xe0\x45\xca\x19\x21\x6e\xb7\xcf\xe2\x80\x31\xbc\x3c\xed\x5e\x3a\x17\xf7\x0d\xe1\xd5\x48\x64\x47\xcc\x91\x7b\x1f\xef\xfc\x6d\x5b\x29\x93\xab\xb9\xbb\x3f\x03\x49\x41\xf4\x09\xe6\xbb\x69\x65\x16\x60\x74\x57\xaa\x9c\xab\x8d\xdd\xd8\x00\xda\xa7\x17\x7c\x66\x75\x02\x48\x31\xdc\x96\x05\x50\x93\xfb\xe4\xaf\x58\xf7\x6a\xad\xb3\x6b\x7b\xc0\x58\x94\xf6\xcd\xd8\xb8\xe4\x6d\x9b\x0b\x8d\x0e\x50\xec\x03\x14\x57\x88\xc9\x11\x54\xb8\x79\xcb\x58\x62\xce\x50\x36\x75\xac\x88\x6c\xf0\x6a\x74\xe9\x6f\x91\x2e\x3f\xdb\x35\xd4\x79\x76\x90\x28\xc9\x85\xaa\xa5\x47\xee\x15\x55\xad\x4c\xad\xe6\x18\xdb\x86\xcc\xb1\x1a\xca\x2f\x3c\x17\x40\x94\xa1\xd1\x67\x1a\x58\x65\x31\xa9\xd4\xde\x21\xfb\x00\x64\x69\xd0\x83\x74\x1c\x7e\xae\x9e\x45\xb4\x05\x78\xf9\xf0\xa6\xa4\x45\x5d\xd3\x5d\x07\xf1\x62\xb6\x2f\x51\xfb\x19\x77\x41\xba\xa6\xed\x1e\xef\xdc\xa9\xb8\x43\x5c\x6c\x96\x64\x23\x32\xba\xc3\xe8\x58\x97\x19\xbb\x67\x7c\xdc\xb3\x4d\x94\x75\xa5\x8b\x02\x4b\x33\x3e\xc9\x8a\x5f\x88\xdf\xa4\xa9\x77\xcf\x0c\x9b\xa2\x60\x91\xd5\x8e\x5f\x59\x25\x4e\x5a\xed\x5c\x3f\xd0\x81\x7d\x52\xf9\xb4\xd2\xf7\x25\x4b\xad\x67\xf8\x5d\x63\xb9\x51\x52\xed\x69\x24\x79\x9d\x35\xcc\x3e\x7f\xad\xc3\x75\x2e\x0c\x65\x10\xdb\x8e\x59\x0b\xda\x95\xa0\x12\x78\xb3\xfd\x74\xb6\x17\x42\x31\x5a\x9a\x5b\x23\x9f\x61\x66\xf5\x9d\xac\x66\x19\x2d\x50\xae\xbd\xc1\x33\x8f\x18\x59\x5c\x51\x74\xc7\xc6\x76\xbd\xc5\x5c\xa7\xcc\x41\xa1\x39\x85\xc5\x97\x27\xaf\x65\xae\xb6\x6b\xa2\xa2\x0f\x06\x2f\xfe\x1a\xaf\x26\x17\x97\x62\x2e\x57\x24\x98\xb8\x51\x9e\x4d\xb9\xc4\xf2\x70\xf8\x07\x58\xa9\xf0\x2f\x0c\xe3\x2b\x64\x06\x27\xa7\x7b\x2d\xe7\xab\x12\x55\x31\x96\xe0\xbf\x52\x3a\x83\xc2\x24\x0b\x47\xca\x8c\x8c\x30\x15\xe5\xa0\xdb\x49\xfa\xa2\xb7\xf1\xa9\x28\x45\xbd\xad\x50\x1d\x29\xe4\x12\x6b\x95\x8c\x33\x5d\x75\x0e\x82\x14\x7f\x65\x78\x80\xdd\x87\x21\xfb\xff\xcd\x18\xae\x19\x30\xfa\xe3\xce\xe8\x3c\x3b\xc3\x99\xe3\x7a\xde\x67\xca\x84\x02\xec\xee\x4d\xce\x5b\x9b\x9c\x1f\x7c\xba\x98\x5e\xf5\x61\x37\xe5\xf2\x4e\x16\x7a\x23\x73\xc7\x9f\x49\xaa\xb4\xdd\x11\xb5\xd6\x05\xe6\x29\xc1\xed\xd4\x6d\x0a\x3a\x46\xca\x44\x2f\xab\xb5\x67\xb2\x77\x1a\x6d\xe4\x16\xc3\xeb\x41\x55\x1d\x4e\x29\xa4\xc3\xb7\x22\xc7\x8e\xd6\x4f\x43\x63\x88\xaa\xbc\x53\xb5\x6c\x9a\x82\x33\x9d\x43\xd5\xda\xbd\xcb\x35\x56\xe8\x31\x78\xe8\x58\x41\x04\x85\xaa\x36\x52\xac\x83\xce\xee\x35\x16\xa7\x63\xe6\x2f\xa6\x57\x30\xaf\x89\xe8\x70\x73\xf1\xd8\xb9\x67\x1d\x4e\x37\x7d\x5f\x36\xce\x35\xde\xf4\xa4\xb3\xf8\x74\x7c\xd7\x8b\x67\x86\x44\x65\xf4\x5d\xe8\xf6\xf7\x88\x4e\xc0\xe9\xaa\x39\x72\xf0\x33\xd2\xe7\x9b\x7b\x0f\xcc\xf4\x0f\x95\x58\x4b\xc2\x36\x05\xdd\x20\xa2\x0e\x3b\x1e\x1c\x25\xa5\xd8\xed\xcd\x1b\x41\x78\x24\x53\xc8\xd6\x62\x97\xb5\xb1\x47\x33\xae\x8c\xd9\xca\xce\xe4\xaa\x7d\x5f\x60\x9e\xc1\x30\x72\x34\x24\x09\x4d\xe3\x87\x5c\x08\xd1\x70\xcc\x4a\x6f\x8b\x1c\xd2\xa3\xee\xad\x0a\x5c\x03\xd6\xbf\xd1\xde\x50\xc5\xb9\x04\xd5\x01\x85\x74\xe1\x65\x34\x04\xe9\x6a\x09\x8a\xba\xf0\xf0\xda\x56\xfe\x9d\x56\x12\x69\xd6\x4f\x61\xe3\x1b\x36\x8c\xbc\x36\xde\xed\x8b\x22\x18\x6c\xc4\x08\xd2\x05\xe5\x25\x8c\x1c\x4c\x72\x6a\x82\x47\x4d\x30\x9f\xbe\x9a\x34\xd1\x75\x2b\x45\x09\x4f\xfe\x0b\x66\xc0\xd8\x07\x62\x8a\x07\xf5\xe3\x5b\x9d\x21\xc1\x24\x39\x78\xf0\x60\x2f\xb7\x2a\x07\xff\x2d\xa5\x38\x2c\x80\x98\x87\x44\x43\xb2\x75\x58\xc7\xd6\xf1\xa5\x9d\xba\x84\xfd\x70\x29\xa8\x14\x61\x58\xcd\x57\xea\x4e\x1a\x7e\x2f\x67\x46\xd5\xf2\x0f\x0d\x0e\x0d\x9e\x7f\x98\x7e\x18\x5e\xff\x33\xe1\x1f\x1f\x8b\xff\x1f\xbd\x78\xd9\x8c\xff\x9f\xbc\x7c\xfd\x93\xff\xf1\x0f\xf9\x39\x45\xe5\x22\x2d\x92\xf6\xf9\x92\x14\xd7\x7f\x24\x2d\x9b\x27\xf4\xd8\x8c\x54\x1e\xd2\x81\xdc\x1b\x14\xaa\x88\xb3\xb6\x3b\x48\x2e\x3c\xf1\x04\xfe\x3f\x12\x6f\xfb\x54\x03\x1e\x32\x0d\x14\x5d\x00\x90\x4d\x70\xa8\x4c\xc8\xb9\xc5\x58\x3f\x5a\xea\xff\x71\xe2\xac\xff\x51\x7f\x06\xcf\x4f\xaf\x87\xe7\xff\xcc\xe8\xef\x63\xe7\xff\xf5\x2f\x47\xbf\xbc\x6c\xd5\x7f\xbc\xfa\x19\xff\xfd\x43\x7e\xf0\x32\x75\x45\xc9\xad\x5b\xd9\x48\x4f\x67\x62\xf5\x9c\x03\xbb\x59\xfa\xae\xae\xae\x17\x79\x1b\x7a\x8c\xd9\x3d\x74\x0c\xe5\xa4\x0e\x7d\xe8\xd6\x48\x57\x86\x9d\xca\x96\x2a\x72\x6d\xac\xc5\xd7\x40\xe4\x07\xe9\xc7\x0c\xaa\xd6\x42\xbc\x15\x60\x0c\x22\xaf\xe3\xc0\x7e\xeb\x38\x02\x77\xd3\x95\xfb\x0c\x38\xef\xc9\xb5\x87\x4c\x64\x90\xc4\xec\x90\xd5\x29\x22\xe8\xc1\x2c\xe1\xaf\x94\x73\x7d\x11\x97\x7b\xc3\x27\x4e\x92\x4f\x78\x06\xc9\xc8\x46\x8a\xab\xe1\x9c\x86\xe6\x6c\xc0\x53\xa8\x5c\x85\x0a\x00\x96\xb4\xcd\x9d\x4f\x4b\xf0\xa8\xf9\x00\x28\x99\x3e\xec\x52\x32\x3d\xa6\x3f\xe6\xb5\xb3\xe8\x55\xe8\xec\x0b\xdb\x59\xcc\xde\xc6\xa2\xea\xd0\xcb\xa4\x4b\x76\x26\xd2\x2f\x90\x07\x21\x1a\x0b\xeb\x1a\x0b\xf4\xef\x22\xad\x89\x57\x25\xf1\x39\x09\x23\x63\x7f\xac\x83\x64\xa8\x11\x9f\x0c\x3a\xf8\x92\xf7\xa2\x28\xc9\x59\xbc\x1f\x2e\x1c\xaf\x4c\x28\xda\x0f\x54\x33\x54\xb3\x57\xec\x28\x82\x1e\x78\xad\x7c\x6a\x2b\x99\x77\xa0\x11\xcf\x31\xfc\x42\xd8\x71\xf6\x31\x19\xbe\x8a\x55\xcd\xa8\x81\x5b\xe5\xd0\xd3\x19\x1d\x0f\x5e\xf1\xde\xc8\xd7\x8a\xbb\x7e\xc4\x33\x1a\x17\x6d\xc7\x19\xf7\x04\xbd\x04\x65\xc9\x76\x9c\xaf\x79\x0f\x61\x98\x0a\x7e\x46\x66\x67\x15\xaf\x46\x48\xab\xb5\x33\x4f\x7b\x15\xfd\xd1\xe0\xe0\x13\xce\x9d\x0e\x6d\x30\xdf\x86\x53\x34\xa3\xef\xb9\x5b\x33\x60\x73\xed\xf8\xe8\xdb\x4a\xcd\x54\xcd\x87\xd0\x99\x5f\x78\xef\x5c\x54\x4b\x59\x11\x71\xab\x9b\x5e\x50\x48\x9d\xae\x0c\x38\x1a\x8d\xc1\xc6\x20\x73\xb4\x8a\x08\x81\x3a\xa7\xef\xb6\x7c\xa2\xfb\xf8\x2b\xdc\x04\xff\xca\x7b\x9e\x6f\xd8\xcd\x06\xd4\x18\x7b\x66\xa9\xe3\xc1\xaf\xf6\x58\xe3\x53\xf1\x32\xac\xc4\x9d\x13\x11\xbe\x92\x01\xa2\x53\x59\xb7\x8f\x9b\x85\xb0\xb3\xf3\xd0\x50\xa0\x12\xec\x2c\xed\x68\xf9\x70\x95\x96\x58\x1e\x5c\x45\xb5\x18\xb0\xd9\x70\x4e\x33\x48\x58\x00\xcb\xa1\x28\xdc\xab\x64\x4f\x78\x16\x0f\xa4\x55\x86\x21\xbc\xe1\xbd\xe4\x90\xf4\x22\x6f\xa0\x03\x7e\x21\x7f\x56\x2e\x0b\x19\x62\xd1\xb0\xa3\xb7\x33\x43\x29\x22\x15\x0b\x9c\x7f\x7a\xe1\x60\x39\x3a\x8f\x33\x00\xff\x55\xf2\x4e\xe9\xad\x69\x88\x31\xfe\x79\x25\x4b\x96\x6e\xe3\x08\x85\x1a\x1c\x20\x46\x3a\xfa\x53\x80\x1c\xc9\xb8\x48\x1a\xe1\x0a\x10\x30\x07\x7c\xf8\x94\x11\x90\xf7\x16\xab\x41\x50\x55\x23\x3e\x3a\xbb\x82\xae\xeb\xcc\xef\xb1\xee\x6e\x33\xf6\x1e\xbf\x67\x6d\xe0\x40\xd9\x38\x77\xd1\x71\x24\xf2\x0f\x75\xfa\xad\x29\xd9\xdb\xee\xf1\xe0\xf8\x88\xf7\x92\xe7\xdd\x0a\xc5\x07\x0b\x92\x84\x1c\x1b\x55\xc8\xa0\x07\xf6\x03\x74\x13\xb2\x5c\x9a\x79\xa5\x66\x21\x1f\xf5\xa9\x07\xd3\xce\x7a\x7a\x4b\x20\xf8\xb2\x6d\x38\x6b\x6e\x54\x55\xfb\xe5\xea\xa0\x29\x0d\x90\x44\xc8\xab\x95\x5c\xa0\xfb\xd8\xb1\x69\x16\xec\x51\xbb\x86\xc0\x19\x3f\x2d\x84\x5a\x27\x3b\x15\x23\x6a\x1c\xca\x06\x0f\x4c\x3f\xe3\xa5\xbe\x27\x27\x8d\xae\x60\xbb\x13\xea\x8b\x3f\x25\x41\xfa\xb7\x1d\x9a\x19\x5f\xcb\x7a\xa5\xf3\xcc\x21\x75\x64\xce\x14\x17\x15\xe4\x12\xc0\x77\xf0\x3e\x11\xe5\x8e\xd1\xd7\x83\x20\xe0\x0e\x35\x93\x2e\xbb\xe3\x63\xde\x8b\xa6\x3b\x16\xaf\x1b\x00\x13\xa1\x08\xc1\x3a\x78\x8e\xa2\x13\xb0\x40\x50\x1a\x55\x2e\x59\x82\xf1\xe2\x58\x4a\xa2\x64\x98\xa2\xb0\xa6\xce\xb6\x90\x86\xab\xb0\xff\x32\xbe\x29\xb6\x74\xa4\x8d\xd1\x88\x7f\xc8\x02\xae\x4d\xee\xf5\x22\x77\xa4\x0c\x24\x09\x1b\x5f\x14\x39\x47\x67\x50\x02\x1e\x84\x5e\xe1\x40\x2b\x85\x88\xfa\x3c\xdc\x4a\xc8\xf2\x19\x95\xab\x7a\x6f\xae\x15\x63\x80\xb3\x50\x29\xf0\xc7\x3a\x1c\xed\x20\x35\x58\x87\xd4\xc0\x4b\x0c\xf8\x02\xbf\x96\xe0\x4a\x0f\x3a\x57\x7a\x19\x44\xee\x37\x54\x39\x9e\x19\x86\x95\xfe\xe8\xdb\x8a\xb7\x3e\x39\x47\xc0\xdd\x6c\xfb\x14\x60\x67\x01\x9c\xe5\x4e\x14\xb0\x32\x01\xb4\x00\x3c\x6f\x62\x83\x28\x49\xa2\xb6\xd3\xe7\xde\x23\x65\x31\x97\x87\xf8\x2e\x00\xf4\x46\xe5\xf9\xf7\x2a\x4f\x4a\x38\x80\xf7\xa3\xd4\x7c\xbe\xb2\x97\x1e\x6e\x95\x13\xde\xfb\xa2\xb7\x3d\x40\xea\xb1\xff\xaa\x7a\x7d\xbf\xd1\x1b\x97\xb1\x20\x4f\x37\x5d\xca\xf2\x9b\xd5\x63\x4d\x70\x5e\x63\xe0\xc7\x31\x54\xad\x37\xc5\xce\x63\x7a\x44\x97\x83\xbb\x08\xb3\xf4\xa8\x42\xfb\x29\x67\x0a\x6b\x12\x3f\x83\xe3\xcf\xb9\xe5\x1c\xcb\xf4\xeb\xc1\x31\x16\xbb\x46\x9d\x83\xd0\x30\x8e\xcb\x07\x12\x20\x34\x8b\x3d\x77\x37\x3b\x6c\x32\x7b\xae\x8c\xfb\x9f\x02\xe4\x01\xc2\x7c\x38\x67\x3c\x39\xa3\xdd\x9e\x84\x34\x92\x2f\x7a\x8b\x1f\x6d\x41\x2d\x87\xcd\x9d\xf1\x1e\xbd\xe3\x0e\xe0\x81\xe8\xe3\x21\xd4\xf7\x76\x9e\x10\xaf\x17\x52\xb1\x3c\x76\xaf\xdd\xfc\xc2\xa5\x1e\x11\x2f\x25\xae\xf2\x5a\x94\x62\xe9\x69\x5f\x20\x1c\x8f\xc3\xf1\xb7\x38\x9b\x51\xc1\x92\xc0\x0c\x2b\x6f\x44\xc0\x78\x0e\x66\x7d\x10\x51\x95\x59\xa9\x0d\x80\x15\x6b\x4c\xfd\xb1\xa7\x70\x51\x03\x14\xeb\xdc\xb6\x7e\xf0\xea\xe8\xbf\xf5\x9d\x8e\xab\xb7\xb5\x87\xef\x01\x86\x44\x50\x88\x67\xb2\x94\x98\xee\x94\x36\x19\xf5\xca\x23\x55\xc4\x9b\xbf\xa9\xf6\x9c\x0c\x8e\x29\x62\xdd\xd0\x08\x11\x94\xc4\xc7\xde\x9b\x7f\x8d\x91\x82\x0d\x14\x9a\x52\xde\xe7\x61\x57\xe2\x67\x47\xb6\xa7\x69\xc2\xfe\x86\x9c\x8d\xee\xac\x0a\x14\xc1\x6f\x19\x3b\xf0\x84\xd8\x0f\xa5\x5f\x24\x64\xdd\x24\xaf\xad\xbe\xed\x12\x30\xfa\x91\xf4\xb6\xcb\xd6\x1e\xa2\xc3\x3f\xf3\xd5\xee\x01\x02\x99\x48\x53\x3d\x6c\x3e\x0c\xc5\x11\xaf\xb6\xf0\x91\x9b\xd7\xff\x41\x87\xee\xda\x6f\x79\xb0\x52\x4b\xc6\xd5\xc0\x0b\x13\x25\xc7\x44\x9a\x33\xe5\x8e\x1c\x78\xe6\x6c\xbc\x39\x0d\x5d\x9d\x9e\xb0\xc0\x6b\xc3\x78\xbf\x38\x2c\x1c\x2b\xb7\x25\x16\x5e\xeb\x45\xaa\x05\xc1\x89\x58\x8b\xaf\x32\x43\x9f\xba\xb5\xf7\x32\x9c\x19\xe7\x7c\xce\xe0\x65\x62\x81\x84\xf8\xac\x15\x73\x46\x14\x1e\x43\x89\x05\x73\xda\xce\x9d\x0e\x49\x6e\x4f\x98\x9a\x01\x63\x07\xf3\x7e\x5c\x73\x1c\xb2\xc6\x1c\x38\x9d\x93\x45\x27\x83\x63\xbb\x3f\x1c\x31\x27\xe4\x86\x3b\xda\x62\x47\x89\x97\x5b\x19\xde\x5e\xef\x85\xaa\x4c\x1d\xad\x5c\x43\x09\xea\x88\xd6\x34\x6b\x8e\x0f\xf2\x7e\x0b\x71\x2b\xee\x98\xed\xd0\x4c\xdf\xc1\x81\x70\x7b\xb2\x08\x8a\x12\x8d\xe9\x2d\x3f\xee\x13\xe3\xa2\x63\xa3\xb6\xe7\x0b\x54\x59\x19\x14\xd9\xa4\x73\xef\xf8\x49\x9f\x1b\x09\xea\x4a\xc7\x33\x0c\x9f\xd1\x15\x7f\xd1\x27\x54\xb1\xc0\x5f\x61\x42\x16\xcb\x5b\xae\x70\x9e\xbb\xe8\x9c\x5b\xba\xb1\xa2\x87\x1f\x73\x32\xc4\xb0\x4e\xfe\x72\x84\x5b\xf3\x4e\xcd\x1d\xa2\x0e\xc8\xa2\x93\xf8\x0a\xf7\x12\x68\xfa\xfd\x62\x22\x43\xb3\x3f\x6e\x0d\x25\x16\xfb\x11\x89\xe5\x39\x95\xff\x49\xb2\x27\xf1\xb2\xfc\xa0\xd8\xc1\xa8\x6a\x2a\x76\x52\x37\x8a\x2b\x97\x9f\x11\x56\x52\x3c\x39\x9d\xe7\x8e\x39\x4e\x3b\xab\xfa\xf1\x6d\xe9\x0b\xd6\x66\xc2\x28\x0f\x85\x02\x8f\x34\xdc\x2e\xa2\x61\xac\x93\x10\xf8\x4e\xe1\xf5\x34\xd9\x95\x35\x84\x57\xd2\x15\x96\x78\xa7\xe2\x11\xd3\xd8\x10\x7a\x2c\x00\xbd\xb5\x30\x03\xad\x7d\x13\xbd\xe7\x01\x67\x93\x19\x73\x17\x6f\xf4\x76\x3f\x92\x9b\xb0\x9e\x28\x22\x1b\xe2\x91\x45\x22\x35\x46\x39\x69\x48\x4a\x2b\x12\x1e\x72\xbb\xc5\x1d\xec\x5c\x4a\x98\x61\x2b\x23\x3a\xce\xeb\xfe\x76\x63\x1f\x5e\xe7\x6c\xf0\x27\xcf\xc6\x23\x32\x9c\xa4\xa4\xb1\x32\xc0\xc9\x6f\xfb\xcf\x07\x45\x78\xdc\x11\x14\xde\x88\xe4\x99\x3a\x78\xbb\x2c\xac\x47\x65\xf5\xc9\xf7\xca\x6a\xc4\x82\x74\xf2\x3a\x91\x3b\x90\xde\x61\x65\x77\x1e\x04\x73\xc7\x1c\x5a\x11\xce\xda\x22\xbc\xf3\xc9\xc7\xa5\x38\x8b\x25\x65\x6a\x44\xc6\x64\x2c\xd1\x12\xee\x15\xe8\xec\x69\x1b\xaf\x53\xca\x1f\x50\xb2\x2f\x9d\x7c\xd6\x36\xd4\xdc\xf7\xfb\x5e\x5f\x76\xf7\x02\xdc\x57\x2f\x1f\x11\x09\x28\x3e\x53\x27\x28\x16\x99\x18\x49\x95\x4c\x4f\xeb\x3e\xde\x42\x2f\x06\xa9\xe3\xf7\x2a\x24\xb7\xfa\x6b\xea\xc5\xe0\x38\xe1\x66\xd6\x8b\x06\x2d\x6c\xfa\x41\x34\x75\xec\x7d\x83\x02\x18\x6e\x02\x1d\xff\xda\xbb\xfd\x61\xaf\x3b\xaf\x08\x7b\xc8\x6d\x19\xfb\x00\x3a\xf2\xb3\xa2\x8d\x0c\xf6\x2f\x8b\x4d\x80\x08\x70\x26\x99\x39\x4a\xd3\x8a\xeb\xa0\x81\xd2\xbb\xa1\xf7\xb4\x6c\xc2\x0e\xbb\xb1\xd9\xdd\x26\xad\x1c\xf5\x8f\xbd\x1e\x1c\xa3\xd6\xe8\xaa\x86\x3c\x0a\x69\xcc\x6d\x1c\xb5\x03\x7b\x4c\xde\xc9\x6a\x97\x70\x02\xe2\xf0\x50\x31\x01\x5d\xc9\x8f\x21\x60\x05\x02\x46\x2f\x48\x5f\x24\x98\x71\x9c\xa6\x34\xbf\xe8\x3b\x8f\xe6\xc9\xf3\x8e\x13\x64\x61\x4d\xe5\x1d\x2e\xfb\x8e\x72\x13\x43\xb6\xc6\xbe\xb1\xeb\x0a\x1c\x08\x95\x9c\xab\x8d\xb2\x27\xf5\x99\x53\x13\xac\x70\x86\x09\x19\x70\x9f\x1e\x13\x40\x96\x68\x22\x12\x38\x6e\xe7\x8c\xc6\x2c\x53\xe7\x73\x8e\x1e\xa0\x96\x13\xdf\x9f\xdb\x0d\x2f\x06\xaf\xa2\x4d\x7c\xc2\x87\x0d\x78\xc2\x34\x50\x30\x2c\x77\xa9\x9b\xf5\x7b\x36\xb2\xa3\x54\xb1\xa7\x8d\x05\xa7\x8d\x4a\xa2\x11\xe8\x00\xdb\x97\x04\xe5\x29\x64\xbd\x12\x62\x05\x3f\xd0\x54\x01\x08\xa7\x03\xd8\x0c\xf8\xb9\x11\xd3\xee\x9d\xfd\x7b\xe9\x03\x32\x7c\x4f\x60\x87\xf9\xc0\x0e\x22\xec\x02\x46\x3b\x8c\x49\xaf\x29\x51\x09\x97\xa0\xe3\x2b\x7e\x54\xa8\xbd\xa8\x45\xb3\x0a\x13\x60\x45\x1e\x0b\x28\x65\x0e\x7e\x68\x2d\x54\xd9\xf0\x13\x89\x9a\xdb\x53\x53\xf3\xfa\x5e\x16\x77\x92\x1f\x1c\x9f\xf4\xf9\x5a\x97\xf5\xca\x10\xa6\x35\xb8\x28\xec\x52\x40\xfa\x24\x18\x34\x85\x3d\xc4\x73\x3b\x4b\x81\xca\x84\xc5\x8d\x19\xf5\x8d\x1f\xbc\x6e\x34\x24\x3a\x70\x9e\x3c\x9e\x54\x04\x56\x15\x6f\x08\x16\x90\x0c\x44\x33\x1c\x0a\xf7\x7f\xd8\xf1\x78\x0a\x11\x76\xc0\x6c\x74\x09\xb1\x0f\xac\x4b\x2c\xcd\xb6\x42\x56\x4a\x72\x2c\x77\x89\x2a\x9c\x9e\xb8\x62\xd7\xa1\x92\xda\x37\x1e\x5f\x5c\x65\xe5\xbe\x02\xdf\xa8\x8b\x6c\xa6\xe1\x5a\x77\x28\x5e\xf0\x33\x89\xae\xd0\x2e\xe5\x28\x2a\x6f\x24\x1f\x91\x28\x8a\x54\x88\xee\x3b\x10\xe4\x52\x85\x45\x06\x9f\x2b\x73\x47\xd9\x1d\x62\x00\xf2\x97\x86\x04\x00\x36\x45\x07\x8d\xee\xaa\x54\xa1\xf6\x8b\xef\x88\x4d\xb1\x81\x41\x97\x2c\x0d\xd4\xec\x81\xb9\xd8\x4f\xf8\x45\x03\x61\x82\x30\xe7\x9c\x77\xac\xd8\xf1\xc8\x3f\x56\xb8\x84\xc0\xd4\xc2\x6b\x02\xa5\xb7\x83\x83\x21\xa5\xd8\x0d\x18\x60\xf9\x7c\xb1\x43\xd3\x1a\x57\xa5\x77\xd6\x45\xd2\x3d\xf3\x96\x3d\x05\x3b\x29\x8e\x01\xff\xb7\x47\x16\x40\x05\x8a\xcc\x1b\x98\x82\x2a\x16\x68\x4e\x5c\x46\x49\xd2\xa0\x8e\xc4\x9e\xb5\x0e\x1d\xd2\xed\x9a\x97\x7c\x1c\x5b\x83\xd7\xce\x1a\xbc\x00\xe6\x57\x83\x66\xe3\x0d\x6c\xb8\x6b\x50\xc8\x50\x8b\x01\xce\xa3\xa6\xaa\x18\xd7\xc4\x02\xbd\xb5\x53\x3a\xb1\xa8\x3b\xd9\xb8\xcf\xcc\xc3\x66\x28\x44\xd2\x28\xc0\x53\x6b\xe7\x2e\x96\x51\x84\x30\xae\xa1\x6b\x19\x85\xc9\x5d\x6d\xc0\x55\xa8\x2b\xab\x53\x64\xc9\x63\xf1\x5e\xb3\xfd\x93\xdf\x6a\x0c\x89\xf9\x2a\xb3\xf8\x48\x27\x79\x16\xb5\xaa\x01\xb8\xf0\x7c\xf4\x71\x78\xde\xa3\x05\x71\x8b\x61\xe0\xda\x24\xb6\x38\xda\xef\xa4\xcf\x86\x8c\x0c\xfc\xb3\x2a\xb9\xd9\x42\xf9\xa7\xdd\xd9\x8e\xc3\x1e\xe7\xcf\x4b\x21\x64\xdc\xb4\xf3\x8b\xf2\xdd\x1d\xc9\x79\xdd\x5a\x08\x3d\xc3\x30\x1e\x4c\x49\x58\x11\x2f\x74\x59\x23\xfe\xd8\x94\x80\x62\xef\x0d\xdc\x98\x3b\x28\x3f\x62\xf6\x78\x6e\xec\x41\x8b\xd0\xef\x60\x4a\x28\x95\xac\x04\x39\x43\x74\x20\xc9\xd4\x83\xbd\x13\x49\x5e\x1f\xf8\x62\xa1\xb8\xa9\x16\x5f\x1d\x02\x9f\xa9\xe5\xc6\xf0\x03\x57\x49\x66\x0f\x0f\x65\xe9\x47\xd1\x8d\xb5\x50\x60\x4b\x17\x08\xc6\x55\xb1\x52\xde\x1b\x80\xc5\x32\x7d\x5e\x49\x61\x74\x29\x66\xc5\x8e\xcf\x45\x61\x2f\x05\xaa\xdd\xc4\xc2\x1b\x5e\x03\x6c\xff\xfd\x4a\x07\xce\xf6\x56\xe2\x0c\x2c\x4c\x29\xef\xa3\x99\xf5\x57\x09\xce\x3c\x60\xcd\xd8\x53\x1e\x0f\x76\x78\x3d\x6e\x1d\x99\x67\x8d\x00\x6a\xa2\x36\x05\x1d\x9d\x11\xa9\xc5\x1a\xa9\x2a\x5d\x18\x0c\xca\x43\xf6\x9e\x3f\xbd\x68\xd8\x7d\xa4\xcb\x33\xbc\xc7\xfc\x3c\x24\xb5\x0c\x6a\xbd\x29\x22\xf9\x3a\xbc\x1e\x77\x1c\x16\xc0\x63\x74\x27\x06\x94\x1d\x95\x96\x38\xa7\x1b\x80\x6c\xe7\x49\x5a\x85\x37\x48\xda\xf5\x25\x7a\x86\x30\xfe\x83\xe1\x15\xaa\x4c\x37\xdb\xca\x6c\x45\x59\xb3\x5a\x47\x5b\xf2\x25\x18\xdc\x68\xeb\xc6\x4d\xce\x64\xa1\xe4\x9d\xe3\xd9\x7f\x60\xd2\x61\x42\xd2\xbf\xfb\x42\x13\x97\xc0\x44\x65\xf7\xcf\x75\xd5\x9a\xf1\xe8\xe4\x92\x50\x72\xd9\x13\x9d\xa9\x0c\xed\x60\xb1\x13\xc3\xaf\xf8\xc4\x49\xbb\x4b\x64\xc0\x8e\x2f\xec\x7c\x8b\xdb\x01\xc5\x5f\xb8\x37\x42\xd8\xdb\x25\x0b\xc1\xa1\x4b\x2c\x0b\x12\xf8\xe3\x45\xc4\xb2\xe3\x52\x38\xa0\x74\x61\x5b\xa3\xac\x88\xae\xa3\x58\x6d\x4a\x94\x5e\xb8\xfc\x31\xef\x5d\xd5\x86\xfb\x2c\x0a\x28\x7f\x2b\xdb\xd7\x77\xab\xe1\x42\x93\xe0\x81\x83\xcc\x20\x47\xc2\x1a\x58\x77\x76\xca\xf0\x9a\xd6\xd5\xae\x4f\x15\xb6\x02\x58\xd4\x02\x23\x5e\xa1\xbe\xca\x02\xeb\x21\xb4\xfe\x8a\xae\x28\x84\x4e\xc7\x6f\xc0\x30\x83\x96\x9f\x73\xc2\xe6\x87\x60\x55\xbc\xee\x76\x49\x9d\xb5\x22\xf2\x1c\xcb\xd7\xe1\x52\x87\x1e\xc5\x3e\x29\x4a\x82\xa1\x41\x24\xa2\x31\xa4\x03\x85\x91\xc3\xf9\x88\xd7\x2b\x2c\xb7\x4b\xde\x4d\x2e\x73\x9f\x49\x15\xcf\x33\x8e\x3e\xb9\xdd\xdb\x26\x18\x4b\x6e\x79\x8f\x1c\x56\x10\x5f\x90\x4e\x6f\x7c\x3f\xdc\x80\xa5\x0a\x76\x18\x68\x25\x76\x90\x18\xd6\xb5\x1a\x9e\x04\xf5\xd6\x57\xca\xee\x32\x47\x8b\x68\x2d\xf7\x5c\xae\x21\x01\x4c\x57\x11\x93\x68\x54\x47\x6b\x9b\x8a\x67\x3d\xf4\xbb\x69\xb4\x77\x18\x8e\x50\x0c\x81\x96\xbb\x2e\xed\xf6\xc7\xf2\x1b\x44\x47\x44\xfd\x09\x4c\xe1\x26\x60\x62\x5b\x05\x23\xb7\x56\xe2\x24\xf1\x6b\x64\xaf\x1e\x7b\x1a\xc4\xcc\xe8\x62\x0b\x14\xf3\xf3\x42\x0a\x72\x7a\x23\x72\xec\x7c\xf5\xe0\xf8\xd9\x9e\xf1\xc7\xb9\xd3\xb3\x1d\x9a\x0e\x85\x2e\x65\x70\x15\x50\xf4\x51\x2c\x11\x5f\xc5\x35\xb9\x70\xa5\xa7\xcd\x91\x00\x9d\x25\x78\x0d\x12\x9f\xa1\xab\xf3\xf5\x7d\x50\xe5\x7c\x5b\x55\x71\x11\x6b\xc7\x9c\xb4\xf4\x24\x3a\x80\x40\xd7\xaa\x17\x1d\x43\x66\x7b\x96\x1c\x0d\x5e\x3b\x20\x18\x6e\x24\xca\x5e\xa7\xe6\xa2\x5e\xc4\xba\x2d\x79\xcc\xbc\x74\xb3\x8b\x1e\x1c\xff\x4d\x6f\xd8\xa8\x49\x30\x63\x77\x06\x59\x4e\x31\x45\x80\x35\x23\xc2\xa5\x70\x7c\x68\xe5\x69\x28\xa2\x59\xcb\x9a\x4e\x59\xc3\x14\xc9\x1c\xde\x83\xed\x4a\xd0\x02\xe9\xa8\xb7\x98\xb7\xf6\x38\xa2\x5a\x29\x30\x31\x3c\x13\x7b\xc4\x45\x90\x24\xc4\xd0\x69\xf7\x06\xdc\x4a\xdf\x73\xcc\x5e\x92\x95\x64\x9e\x45\x83\x88\xd7\x49\x3d\x89\x6b\xd8\x93\x69\x38\x21\x04\x71\xa2\x6c\x25\xaf\x46\x82\xc1\xc7\x62\xd8\xbf\x27\x98\x24\x59\xb7\x41\x62\x15\xad\xb9\x2e\x80\x9e\x09\xe1\x5a\x3a\xcc\x93\x0e\x1f\x52\x2c\xac\x9a\x9a\x56\x10\x58\x8d\xc0\x50\x97\xa1\xb4\x68\xe5\x57\x7a\xc1\xc8\x92\xd2\x48\x11\xb3\x48\x7c\x89\x39\x35\xb0\xc7\xae\xb8\x0b\xf0\x94\x61\xbd\x42\x51\x27\x62\x6e\x27\x6b\x97\xa2\xe4\x3b\x3f\x01\x86\x62\x36\x85\x12\x9e\x9c\x7f\xef\xfa\x33\xb4\x0e\x68\x87\x79\x78\x6f\xba\x13\x3a\xc6\x1a\x00\xa2\xea\x5a\xae\x37\x35\x16\x07\xae\x15\x64\x82\x80\xa7\x8f\x27\x1e\xbb\x67\xc6\x5b\x54\xed\x4c\x3a\xd7\xa8\xf7\xd8\xd3\xcd\x62\xf0\xc4\xd4\x2b\x1f\xa3\x76\x1a\x0b\xa7\x0b\xf6\xf1\x45\x71\x36\x5f\x98\x40\x37\xba\x27\xc9\xe1\x3a\x72\x70\xa2\xea\x8a\x0d\x45\x70\xf2\xce\xcb\x06\x21\xd9\x4e\x99\x0b\xd8\x08\xbb\xee\x2b\x22\x0b\x59\x5b\x0f\x5e\x1b\x0f\x0b\xed\x6e\x8f\x41\xc6\x3b\xda\xfe\x5e\x41\xce\xf6\xf6\xbc\xab\xf5\x47\x84\x3b\xf3\x90\xe8\xf3\xd5\x03\xb2\xfb\x97\x38\xb4\x19\x0b\x69\xf2\xe6\x24\xa1\xcf\x14\x8f\x2b\x39\x81\x51\x3c\xc5\xe5\x34\xb3\x27\xe5\x34\xb7\x19\xba\x65\xf2\x49\x3b\x24\x66\x54\xb9\x2c\x3c\xd3\xc1\x80\x8f\x4b\xcf\xa0\x23\xec\xb1\x4c\x37\x18\x81\x14\xc9\x0e\x52\x19\x65\x58\xbc\x89\x82\x60\x5d\xf8\xca\xff\xa6\xd3\xe4\xa5\xfd\x9c\xbf\x04\x35\xb0\xfc\x14\x3b\x7e\x86\x4a\xf1\xb4\x16\xf5\x16\xdd\xcb\x01\x8c\x68\xc0\x82\xf6\x0d\xce\xfb\xe0\x42\xb4\x3d\x4d\x31\x86\x62\xb4\xb1\x6e\x89\x01\x4f\x55\xd2\x6c\x28\xaf\xc0\xe8\x35\x06\x32\x42\x96\x5c\xb2\x16\xa4\xaf\x1b\xec\x5a\xc6\x7f\xdb\xe6\x94\x7c\x55\xe5\xf6\x18\x80\x05\xe6\xfa\x9a\xea\xf1\x6f\xc1\x8f\x15\xf7\x6e\xff\xc2\x11\x46\x4a\x13\x10\x85\x46\xfb\xce\x3b\xbf\x12\x7f\x55\x04\x3d\xe7\xfd\x24\x76\xc3\x30\xc0\xd6\x41\x0c\xbc\x01\x9f\x6e\xbd\x6b\x05\xef\x46\x77\x99\x35\x51\x6b\x23\xc7\x83\x57\xd4\x59\xe2\xc3\x78\x19\x28\xd1\xe3\xf7\x7d\x9a\x61\x0b\x75\xbf\x65\x48\x21\x07\x92\xbb\xb2\xdc\x30\x2b\x0d\xa6\x00\x79\xa3\xc2\x2e\x08\x33\x9b\x11\x7b\x7d\x18\x06\x73\xdd\x08\x56\x64\xb1\x23\x0f\x10\xed\xc1\xc8\x05\x64\x3b\xa3\xab\x1c\xf9\x4c\xcc\x57\x55\x14\x54\x15\x0c\x6a\x46\xad\x1d\x2b\x1a\xa8\x34\x35\x6e\xd6\x57\x83\x66\xb4\xaf\x61\x7e\xde\x24\x47\x2f\x30\x9b\xce\x13\x7f\x70\xb7\x3a\x09\x35\xea\x75\x2d\xe6\x2b\xd4\x44\x58\x97\x5d\x0a\x8b\xaa\xbd\xda\xd0\x3e\x4f\xaf\x07\x5e\x27\x74\xd3\xdd\xb4\x8e\x5f\x0f\x8e\xf9\xa5\xbc\x8f\x75\xc7\xa9\xb6\x3b\x18\x6b\x89\x81\xb8\xf6\xa0\x17\x7e\xd5\xeb\x7f\x07\xad\x06\x8b\xbe\xd8\x2e\x17\xff\x2e\x5a\x0d\xd6\xa4\xd5\xf0\xfd\x3f\xe1\x23\x84\x73\xd4\x8b\xe6\x48\x80\x7a\x23\x39\xaf\x3f\x44\xbd\xe1\x54\x12\x2f\xb0\xff\x89\xd4\x1b\x49\x6f\xbf\x9b\x7a\xe3\xbc\x8b\x7a\x23\x2c\x5e\x17\xef\x46\xf8\xab\xc3\x55\x61\x4f\x25\xdd\x48\xfa\x9a\x90\x6e\x74\x7b\x62\x5e\x43\x18\xa5\x52\x77\x58\x51\xef\xae\xc1\xc4\xad\x40\xdc\x90\x5c\x04\x18\xec\x7d\xf1\xd3\x03\x3c\x40\x0e\x37\x00\x00\x56\x73\xab\x3e\xa0\xf0\x85\xc8\x1d\x00\x27\xa9\xda\x1f\x3b\x8f\x95\xd2\x51\x7c\xc0\x93\xe2\x03\xd6\xf0\x27\xf5\xa3\xab\xcf\x0a\xee\x4a\x82\x4b\x03\xf4\x5c\xa7\x7c\x19\x1d\xd4\xcd\xcd\xaa\x12\x46\x1a\x1e\x9f\x9d\x8c\xf5\x4e\xaf\x87\xe7\x3d\xee\x13\x43\xca\x05\xe4\x2a\x15\x01\xc4\x0e\xdf\x73\x28\x82\x81\xa5\x67\x17\x7f\x88\xd2\x27\xac\x64\x2a\x75\x42\xb8\xe3\xc9\xa0\x41\xa1\x33\x6d\x8d\x2e\xe4\x40\x26\x95\x8c\x92\xa9\x3a\x56\x10\x61\x5c\xdd\x14\x34\xa1\x9a\x25\xd2\x20\x79\xa4\x41\xc2\xb1\xb7\x03\x1d\xf0\x83\x0f\x8a\x68\x7b\xca\xc7\x63\x3b\x5d\xba\x57\xd6\xce\xff\x8f\xb5\x30\xd7\xec\x43\x0e\xa4\x80\xe5\x45\xc7\x64\x6d\x64\x71\x27\x0d\x24\x35\x48\xb9\xf6\x10\x10\xad\x74\x98\x64\x17\x63\xf5\xe8\x2f\x83\xc0\x5a\x32\xe1\x57\x1f\x3c\xe8\xf7\x80\xb1\xd3\xab\xbf\x8c\x26\xa3\x33\x7e\x7a\x75\x96\x12\xb5\xdc\x5e\x9e\x8d\x26\x88\xec\x7d\x3e\x3e\x1d\x5d\x4e\x47\x1c\x98\x3b\x78\x0f\x40\xd1\x7b\xfc\xfd\x70\x3a\x9e\x66\x1e\x06\xdd\xb5\xc9\x22\x20\xf1\x8c\x8f\xc6\xc0\xe7\xe1\x79\x5c\x78\xe0\x71\x49\xc8\x5b\x5c\x2b\xc0\x50\x42\x18\xe2\x11\x61\xcb\xcd\xa7\xe1\x0d\x50\x70\x34\xbb\xfb\x61\x32\x02\x02\x8f\xb3\xd1\x87\xd1\xe9\xcd\x34\x8b\x60\xc4\xcf\x47\x80\x21\xde\x62\x73\x61\x8e\xcd\xe5\x6a\xc2\x2f\xaf\x2e\x0f\x09\x40\x7c\x7c\xf9\x71\x00\x9f\x18\x5d\xde\x8c\x27\x23\x3e\x19\x4f\xff\xcc\x87\x53\x84\x37\x1f\xf1\xff\x71\x3b\xf4\x3c\x31\xd7\xa3\x09\x40\x9d\x5f\x9e\x8e\x18\x51\x83\x34\xfb\x05\x08\xe9\x5f\xae\x6e\x07\x0e\x12\xde\x4e\x49\xf2\x90\x9d\xe8\x11\xf5\x7b\xfc\x97\x11\x1f\x5f\x02\x03\x0c\xa1\xaa\x67\xf6\x65\x7e\x70\x79\x85\xc3\x1e\x5f\x8e\x91\xdc\x05\x69\x65\x46\x93\x8c\x5f\x4d\xc6\x1f\xc7\x97\xf1\xef\x38\x62\xbe\x23\xf9\x09\x8b\x98\x66\xfa\x84\x1a\x4f\x3d\x9d\xde\x38\xb0\xf7\xcb\xd1\xe9\x68\x3a\x1d\x4e\xbe\x10\xd5\x0b\x2c\xc5\x64\x74\x3d\x1c\x4f\x90\x58\x66\x32\xb1\xbd\xbb\xba\x1c\x20\xa3\x4f\xf7\x2e\x42\x9c\x7b\xe0\x8e\x99\xda\x0d\x62\x17\x1a\xb9\x68\xec\xa4\x3b\x7a\x15\xb7\x8b\x06\xec\xf2\xca\xd1\xae\xb4\x26\x65\x3c\xe5\xc3\xdb\x9b\x4f\x57\x93\xf1\x5f\x47\x67\xfc\xd3\x68\x32\xc2\x6d\x88\x24\xf9\xf1\x9e\x0c\x5d\x41\x51\xfd\xeb\x80\xdf\x8c\x26\x17\xe3\xcb\x21\xf6\x97\xfd\x0a\xc5\x00\x0d\x43\xa2\x6e\x43\x75\xfa\xbc\x15\xbc\xcc\xad\x78\x50\x25\x98\x36\x31\xde\x26\x23\xa7\x50\x07\x08\xa8\xc3\x68\x81\xaa\x44\x44\xd1\x76\x0f\x59\x43\x03\x6e\x48\x02\x3a\xb5\x8f\xab\x92\xbd\x38\xe2\xb9\xbd\x8b\xf5\x82\xcf\xe4\x5c\x43\x20\x47\x60\x22\x31\x4a\x19\x7c\x1c\x19\x20\x42\x56\xac\x69\xb8\x45\x30\xb3\x07\x25\x19\x42\x37\x58\xe1\x53\xec\xfc\xd0\x50\x86\x98\x6d\x75\x67\xaf\x2e\x67\x3e\x27\xd9\xcd\xf1\x8d\x07\x00\x4c\x26\xe4\x79\x65\x64\x98\x01\xd1\x1a\x3a\xf5\xe3\xfc\x0e\x55\x52\x2a\x23\x9f\xc9\x9d\xa6\xc9\x8d\x3e\xd0\xca\xad\x4a\xba\x03\x2b\x74\xe2\xbc\x07\x98\xef\x51\x5b\x71\x5d\x3b\xc7\xe9\x0c\xea\xbd\x24\x52\xf9\x0a\x17\xbe\x8a\xd3\x04\x29\x60\x7a\x80\xf8\x8e\x56\xe1\xca\xe5\xbc\x10\xb5\xae\x76\xd6\xa8\x01\xa2\x2b\x2e\x30\xe2\xdb\xf7\x65\x5a\x4f\x12\xe1\xe0\x3c\x49\xb3\x8a\xbf\xcb\xf4\x8e\x03\x06\xee\xc3\x10\xa8\x85\x4d\x04\x3c\xfe\x60\xa0\xce\x9d\x8f\xd8\x17\xd2\x59\x0d\xc0\xf0\xde\x35\x68\x76\x6a\x23\x4a\xab\xbe\x8a\xa2\x90\x4b\x97\x59\x42\x65\x23\xd0\x40\xf4\xd8\xb3\xee\x6c\xd6\xee\xc4\x07\x3f\x8f\x58\xc9\x84\x93\x4b\x41\x9b\xb8\x04\xb7\x71\x58\x5c\x64\x3d\xfa\xac\xed\xf0\x17\x87\x75\xcb\x92\x00\x3b\x29\xd8\x27\x83\x93\x96\x1e\x04\x7b\x21\xe3\xdb\x8d\x2e\xf9\x6b\x3a\x0e\x74\x21\xc2\xed\x1f\x7d\x80\x85\x23\xb9\xa9\x34\x58\xb9\xea\x4e\x16\x3b\x0f\xdc\xa8\x16\x74\xb0\x7c\x4b\x18\xdb\x86\xa0\xed\x06\x74\x6c\x02\x38\xb1\xfd\xc4\x14\xac\xb7\xfc\x40\xf5\xc9\x7d\xa3\x4a\x20\x0d\x24\xbf\xe3\x46\xec\x92\xe1\x09\xbe\xde\xd6\x5b\x2c\x89\xb7\x8f\x83\x22\xe9\x23\xa6\x92\x39\xa8\x15\xb2\xde\x2b\xbe\x11\x06\xc1\xfa\x28\x8d\x90\xf0\xbf\xba\x33\x37\x9b\xb3\x09\xd6\xf7\x81\x52\x58\x42\x93\x57\xe2\xde\x69\x6b\xfe\x5c\xe0\xa6\x6f\x1a\xfd\x7b\x32\x51\xfd\xe6\x6b\x7e\x08\x1c\x77\x8d\x69\xf3\x13\x95\x21\xfb\x3b\x0d\xd1\x55\x13\x80\x6b\x72\x23\x76\x78\xac\xaa\x4a\xb8\x63\xe8\x00\xba\xd3\x89\xca\x71\x75\xa3\xd9\x25\x3f\x0f\x18\x2d\x12\xc2\x55\xa8\xa1\x35\x86\x46\x9a\xae\x9b\x80\x32\xeb\x12\xdb\xb3\x5d\xba\x47\xa2\x4d\xc8\xf7\x6d\xc2\x44\xa2\xc7\x92\xbe\x26\xd3\x7d\xa3\xaa\x04\x92\x01\x27\xc6\x6d\xcc\x8d\xac\x94\xce\x23\x74\x50\x88\x33\x53\x70\x1f\x6c\x1c\xcf\x9b\xb7\x12\x55\xee\x19\xbe\x31\x05\x38\x8b\x0d\x98\x87\xcf\xae\xcb\xcb\xdf\x97\xb5\x14\x0e\x2f\xef\x3c\xbc\xe9\x54\xb9\xb9\xe9\x3a\xbb\xed\xf9\xc2\xb1\x24\x09\xeb\x95\xbc\xd3\x5f\x65\x1e\x12\xd7\x99\xf0\xa6\x39\x24\xec\xa1\x4c\xc3\x9c\x75\xaa\xa7\xca\x33\x6e\x74\x91\xc7\xcc\x00\x39\x4c\xc6\x4a\xe4\xf4\xd4\x03\xb5\x0d\xf1\x3e\xb5\xf7\xc4\x0b\x77\x4f\xe0\x85\xf0\xe0\x6d\xe0\x36\x7c\x72\x86\x63\xf1\xf9\x4f\x10\x9c\x14\x9f\xc5\x42\x01\xb7\x87\x2b\x69\x74\x71\x27\xf3\x90\xa2\x32\xdb\x85\x68\x43\xc5\x8d\xac\x6b\x4c\xaf\xe8\x33\xa4\x2e\xa5\x63\x4c\x97\x21\xdd\xd1\x5d\x23\x0d\x47\x86\x56\x1d\xbd\x99\x5e\x26\xdd\x89\x62\x2b\x1b\x16\xd0\xc3\x42\x7c\x6f\x7a\x14\xc3\x5b\x7b\x26\x21\xf5\x06\x60\xad\x35\x17\xf3\xb9\xde\x42\xa7\x78\x2e\xf1\x1c\xf9\xf4\xdd\x35\xfc\x45\x57\xdc\x77\x02\xe7\x69\x87\xa9\xbe\xde\xda\x83\x85\x7d\xc9\xc7\xd8\x79\x79\xe7\x90\x07\x23\x0d\xa5\xd1\xa9\x5f\xb1\x53\x56\x6d\xa0\x0c\x0f\x41\xd0\xe8\x5b\x23\x2b\x8f\x0e\x09\xc2\x07\x7d\xba\x41\x33\x08\xfb\x50\x13\xd7\x40\x25\x8d\x2c\x0a\x59\x99\xbe\x87\x88\xa5\xf8\xa0\x9d\x3e\x95\x47\x7a\x14\xc5\x10\xc8\x00\x8e\x5a\x8a\x94\xc7\xb0\x82\xd1\x00\x30\x23\xca\x29\x60\xd1\x5f\x50\x67\x7d\x33\x88\xec\x9d\x84\x09\x71\xc0\x18\xea\xba\x97\x57\xfc\x74\x3c\x39\xbd\xbd\x98\xde\x58\x73\x03\x59\x8f\xfc\x9f\xd0\xbd\x89\x4c\x8a\x81\x3c\xf1\xe6\x6a\x72\xc3\x03\x35\x22\x0b\xd4\x88\xfd\x2c\xa2\x55\x8c\x69\x12\x33\xa2\xaf\xfc\x72\x75\x9b\x3d\x66\x70\xb0\xe8\x77\xde\xdc\x88\x89\x2d\x33\x67\x88\x9c\x8d\xa7\xee\x77\x76\x74\xb1\xa6\xef\x9e\x61\xd3\xdb\x6b\x6b\x0d\x4e\x9c\x39\xe0\x78\x15\xc1\x5e\x1b\x4d\xb3\x88\x24\xf3\xe6\x0a\x9e\xb8\x1e\x4d\xa6\x57\x97\x8e\xe1\x2a\x50\x65\x32\x4f\x8f\x19\x73\x66\xee\xe3\xc7\xf4\xe6\xc7\xa7\xa1\x9d\x0e\xe0\x9c\x74\xd6\x28\xeb\xb2\x46\xdd\x7b\xf6\xbb\x8e\x0e\xf3\xe3\xd5\xd5\xd9\xe7\xf1\xf9\x79\xc6\x3f\x5f\x4d\xfe\xcc\xa7\x37\x57\xd7\xd7\xc3\x8f\x23\x3b\xcb\x17\xd7\xb7\x37\xa3\x09\xfb\x30\x1c\x9f\xdf\x4e\xc0\xd6\xbc\x18\x9e\x7f\xb8\xbd\x3c\xc5\xd6\xa8\xf3\xc0\x73\x7a\x7e\xee\xe7\xf0\xc2\x9a\xaf\x49\x2f\xf1\x63\xa3\x69\xc6\x1c\x29\xa5\x9f\x9e\x2f\xb4\x68\x9f\x86\x7f\x19\xf1\xf7\x23\xfb\x57\xa0\xe0\x7a\x0a\x61\xe5\x94\x2c\xba\x3d\xfb\x8f\x5a\xb6\xe6\xe7\xf0\xfa\xfa\xfc\x8b\x9d\xfb\x94\x5c\xec\x6c\x34\xbc\xf9\x04\x24\xa0\xb0\x1c\xc3\x73\x36\xbe\xfc\xd3\xed\x04\x0c\xd8\xdb\xf3\x9b\xf1\xe5\x47\xfe\x61\x72\x75\x11\xf5\xf6\xd9\x34\x26\xe9\x24\xb3\x7a\xf4\xaf\x37\xa3\x4b\xfc\xc8\xf8\x14\x56\xf9\x7c\xf8\x99\x5d\x4f\xae\x3e\x8d\xdf\x8f\x6f\xa6\xf8\x7a\xe8\xe4\x80\x4f\xaf\x2e\x46\xfc\x4f\xb7\x93\xf1\xf4\x6c\x0c\x73\x39\xe5\x67\x57\xd8\xd1\xf3\xf3\xab\xcf\xd4\xe8\xe9\xf9\xed\x14\xc6\x34\x61\xe9\x08\xc3\xd6\xd8\xbb\x33\x32\x3e\x25\x46\xb3\xd0\x8e\x5d\xa7\xd0\x10\xbb\x18\x7e\x49\xe7\xc6\x5a\xfa\x08\xd4\x75\x34\xe0\xb7\x83\xe9\x80\x7f\xb4\x9b\xfd\x12\xc8\xde\x46\xf6\xc8\x4e\x47\x93\xa9\x87\x77\x6d\xe4\x06\xf0\x5e\xa0\xb8\xe1\xaa\x96\xeb\xac\x87\xc0\x44\x56\x31\x91\x15\xdc\x26\x00\x04\x80\x4e\xa2\x97\xbf\xf2\xd3\xc1\x87\xc1\x64\xc0\x4e\x06\xc7\x47\xc7\xfc\xe0\x6a\x5e\x0f\xf8\xf1\x9b\x37\xaf\xfa\x99\x23\x1e\xa5\xfa\xc1\xb8\xe1\x16\xc4\x4a\x0f\xe4\x60\xf4\x08\x6b\xa3\xb0\x24\x61\x7d\xec\x56\x14\x31\x44\xb2\x97\x46\xaf\xf8\xf1\xc9\xe0\xe4\xf8\x84\x1d\x4c\xe5\xc6\xf5\x0b\xf2\xfb\x6c\xbf\xe0\xb2\xb4\xaa\x6b\xf3\x71\xe8\x4b\xf8\xe5\xc9\xc9\x2f\x83\x5f\x4e\x8e\x4e\x0e\x8f\x79\xbd\xaa\xf4\x76\xb9\x62\xfe\x57\x2f\xf9\xc1\x9f\xb6\xa5\x74\x23\xb6\x97\x00\x4e\x79\x40\x6a\x1d\x95\x39\xbf\x35\x40\x2b\x83\x98\x29\x0d\x9b\xd9\x91\x5b\x51\x8a\x27\x29\x4c\x21\xca\xed\x21\x86\xec\x92\x1e\x0f\xf8\xc5\x78\x7a\x3a\x3a\x3f\x1f\x5e\x8e\xae\x6e\xa7\xcd\x30\x49\x92\xae\x28\xd1\x35\x20\xeb\xe8\x22\xb2\x8b\x32\x27\xc4\x7b\x07\x13\xb0\x86\x74\x6a\xee\x20\xbb\xc6\x74\x4d\x3a\x13\xbc\x65\x30\x29\xc3\x57\xb2\x70\x5e\xbf\x6d\x29\xcb\x85\xae\xe6\x12\x91\x4a\x60\x49\xfc\xbb\xe1\xca\xae\xe4\x42\x57\x6b\x57\xfb\x94\x46\xa8\x92\x4c\x4f\x17\x78\x8f\x5a\x45\xfc\x47\x96\x1a\xef\xb3\x14\xe8\xe6\x54\x14\x6a\xa1\xab\x52\x09\x5e\x88\xfb\xd0\x03\xe3\x6b\xe5\x92\x6f\xb2\xc8\x15\x5f\x88\xfb\xcc\x5a\x6e\xa2\xdc\xf9\xb4\x89\x08\x83\xbf\x9f\xf1\x70\x77\x2b\x4c\x99\x5c\x14\x6a\x5e\x1f\xea\xc5\x61\x21\xee\x59\xf8\xd6\x80\x7f\x6e\xd8\x42\xb9\x32\x1b\xa8\x79\xf7\x89\x27\xbe\x60\x44\x97\x2e\xef\x1a\x0e\xde\x5c\xd5\xea\xef\xd2\xea\xfb\x44\xcc\xe2\x30\x3d\xe6\x2b\x51\x21\xa1\x24\xc6\xec\x3c\xbd\x24\x00\xf4\x3a\xee\x00\x0f\x47\x5b\x42\xa4\x6f\x5a\x8b\x5a\x42\xee\xd1\x70\x2d\x2b\x35\x17\x19\x45\xf2\xbd\x81\x93\x26\xb8\xb4\x7c\x23\x10\xfa\x8b\xe9\xc1\x58\xc2\x77\x40\x0a\xdd\x07\x99\x43\x5a\xcd\xa9\xde\x56\xb5\xd7\xc4\x2f\x35\x40\xea\x96\x94\x6c\x85\xb1\xa5\xb0\x40\x19\x6e\xfa\x3b\x59\x6e\x25\x47\x28\x15\x55\xf2\xa9\x28\x6b\xc1\x4f\x0b\x51\x09\xdb\x1c\x24\x7a\x45\xef\x84\x10\x6f\xa1\x0d\x72\x7f\x54\xf5\x8e\x35\xeb\x5e\xe6\xda\xa4\x14\x21\x5d\xa0\x44\x73\xdb\x5b\x7c\x94\xf4\x2f\xaf\xae\x8a\xba\xd6\x55\x29\x77\xe6\x19\x5f\x48\x89\x7f\x96\xdf\x36\xa0\xb5\x62\xce\x92\x68\x06\x2d\xfd\x9c\x5f\x92\x41\x7d\xaa\x4b\xab\x42\x82\xf1\x56\xa2\x3e\x2f\x62\xf2\x98\x71\x59\xcb\xaa\x74\x28\xc0\x53\x81\x59\xb1\x1f\xb5\xce\xa1\xb4\x20\xd0\xcf\x11\x59\x48\x0e\x90\x58\xcc\x6e\xeb\x34\x1e\x8e\x1b\xca\xef\xd8\x90\xaa\x23\xca\xe5\xd6\x51\x6a\x04\xe0\x14\xb7\xb0\xcc\x0a\xe6\xba\xda\x5a\xb3\x91\x2c\x14\xb0\x9f\x2a\xf4\x55\x04\xea\x0e\x0c\xff\x34\xf6\x07\x49\xa2\x93\x41\x93\xf4\xd3\x5e\xc5\x48\xad\x39\x60\x6c\x68\xf8\x4c\xd6\xf7\x52\x96\x4f\x74\x54\x39\x97\x68\x64\xfe\x10\xda\x00\xf3\x87\xa4\xb5\xd8\x58\xb4\x8a\xb0\xe2\x6b\x01\x46\x68\xa5\xb0\x78\x7d\x4f\x91\x0d\xb3\x7b\x81\xe0\xb5\xb6\xb5\x2a\xd4\xdf\xfd\x4a\xb6\x71\xea\x63\x77\x2d\x98\x7c\x2e\xc5\xe6\x5e\x57\x5f\x71\x13\x3f\x7d\x70\xf1\xc0\x48\x32\x90\x35\xca\xa8\xaa\x8b\x06\x47\x69\x9b\x90\xe6\x26\xff\xf7\x56\x61\xea\x12\x60\x03\x0c\xf8\xa5\xae\x57\x76\x5b\x93\x8b\x57\x61\xa5\x4a\x99\xa3\x74\x40\x25\x3f\x89\xcb\xc0\x5a\xab\x1a\xe9\xf0\x76\x5c\xe4\xc4\xdc\x62\x47\xec\xf3\x7a\x68\x4d\x5f\x0c\xf8\x85\x55\x98\xae\xcf\x47\x87\xe4\x22\x47\x15\x79\xc0\x58\x3b\xc6\x0e\xf9\x6f\xc0\xb3\x03\xfe\xb0\xa8\x4a\xbd\x95\xe6\x21\x0c\xbf\x20\x3e\xb5\x43\x9a\xd4\x7c\xc0\x5a\xbf\xf2\x68\x5e\x9e\x5d\xac\xf9\x4d\x04\x1b\x46\x66\xb1\x5a\xd3\x0a\x4a\xf6\xe0\xc7\x71\x41\xa3\x84\x3a\xff\xd4\xf5\xf0\xdc\x81\x60\x42\x76\x5a\x09\x81\x55\x67\xbd\x99\x70\x29\x74\x30\xe0\x75\xd4\x55\xd5\x8e\x8a\x38\xc9\xef\x88\x71\x19\xed\x24\xbf\x1c\xf0\xe1\xd9\xd9\xd8\x2a\x6f\xd6\x60\x1a\x4d\x2e\xde\xf2\xe1\x0d\x1a\x27\x56\xa1\x03\x87\xea\xd0\x60\x04\x57\x9a\x3a\xe1\xb9\xa3\x3b\x0c\xe9\x4a\xfe\x8e\x78\x96\x70\x76\x23\x20\xcc\x4e\x58\x91\x83\x5e\x7b\x5b\xf6\xfa\x99\xeb\xf6\x4a\x6f\x28\x0a\x8a\x14\x35\x7a\xad\x49\x3c\xa1\xe9\x6c\xd7\x7a\x25\x8b\x0d\xfb\x6d\x6b\x6a\x1f\xd3\x06\xcc\xfa\xb5\x2e\x25\x3a\x69\xe5\xc2\x6a\x2c\x5c\x95\x77\xd2\x10\xfe\x80\x77\x66\xb6\x00\x52\x59\xf2\xab\x74\x57\xb9\x0c\xfd\x68\xf6\xde\xf3\x83\x5e\x0c\x52\x1b\xa1\xda\xf7\xfa\x4c\xc4\xf9\x53\x38\x0e\x64\x73\x53\xeb\x66\x99\xa9\xed\x68\x02\xf8\x57\xa5\x89\x63\x4c\x19\x5e\x88\x6d\x09\x99\x23\x20\x3b\x5c\xf9\x67\xb5\x2d\x5d\xcc\xdc\x73\xcb\x3b\xff\x08\x84\x05\x0c\x02\x97\x59\x3d\x30\x54\x06\x32\x02\x17\x69\x21\xb8\xf8\x21\x3f\x4b\x10\xed\x13\xbc\xfe\x03\x11\xb4\x6d\x60\xee\xe9\x63\x5e\x8e\x9e\xcf\xb7\xae\x74\x97\x2f\x2b\xb1\x59\xa9\x39\x96\x23\x84\x22\x1c\xb9\xde\x14\x7a\x17\xb6\xac\x73\x4e\x70\x74\x9a\x48\x63\x58\x3b\x63\xe2\x20\xa4\x9a\xba\x45\xf0\xfd\x2f\x81\x7c\xb1\x10\x66\xc5\xcd\xbc\x92\xd2\x0e\x14\x0f\x08\x32\x58\x18\xf5\x77\x7f\xb4\x5c\x9f\x14\x30\x3b\x21\xb5\x80\xcb\xf0\x8d\x55\xef\xba\xf1\x1e\x12\x66\xca\x22\x4e\x84\x93\xfb\xa6\x67\xe0\xf8\xbf\x89\xd3\xad\x3d\x50\xd6\xc8\xff\x6c\x2e\x7e\xa0\xa7\x73\x29\x84\x7b\x26\x73\xa1\x2b\xc7\x1c\xd7\x11\xf8\x22\xc0\xb7\x28\xd3\xbe\x71\x87\xfa\x9e\xa6\x87\x92\xa6\x96\xec\x98\x7d\x9b\xa0\x59\xf4\x02\xd9\xe6\xde\x91\x47\x04\x16\x0e\xf3\xb0\xb1\x44\x99\xc7\x57\xaf\x79\xa1\x97\xaa\xb4\x6a\x20\xef\x89\x99\xde\xd6\xbd\x80\x7b\x03\x9e\x61\x62\x3c\x8f\x09\x2f\xad\x55\x25\xec\xca\x37\xa6\x03\x1b\x37\x68\xe3\x21\xcb\x96\x8b\x2d\x40\xbf\xa0\x37\x0b\x28\xd0\x17\xf5\xfe\x81\x19\xd0\x81\xef\xf1\x70\xac\xa5\x24\x51\x11\xca\x2b\xe1\x38\x23\xb4\x1f\x96\xd0\x80\x7f\x3b\x6e\x2f\x2e\xf0\x72\x59\x2c\x0d\xb0\x83\x18\x67\xde\x1e\xcd\x59\xa5\xe4\x82\xf2\x44\x32\x96\xee\x54\x88\x35\xf1\xdb\xc9\xf9\x43\xe2\x06\x33\xf3\x4d\x53\x3f\x4e\x31\xb4\xe1\x9a\x6a\x1e\x5f\x44\xd6\xab\x81\x4e\xc3\xe1\xeb\x65\x71\x15\x31\x6c\x1b\x7b\x0b\x7a\xb1\x81\x75\x44\xa1\x06\x73\x5b\x79\x8e\xb7\xa5\xba\x8b\x5d\xad\x6e\xa9\x69\x83\xc2\x92\xe1\x01\x62\x9e\xf5\x6e\xaf\x10\xe2\x3e\xd7\x3b\x2d\x39\xd8\xb7\x78\xcc\x76\x8b\x52\x6e\xe2\x35\x58\x78\xb4\x11\x0a\xad\x44\x69\x3f\x31\x27\x67\xe3\x58\x27\xcc\x57\x4e\x4f\xee\xe8\xa5\xb7\x4d\x4a\xcd\x21\xe0\x16\xe6\xce\x07\x33\xd8\xbe\xfd\xf6\x40\x97\xbd\xec\xa1\xca\x75\x58\xa7\x25\x08\x85\x8a\xcd\x65\x55\x0b\x05\x06\xc9\x03\x97\x56\x48\x46\x43\x6d\x61\x97\x5e\x5f\xb0\xfe\xa1\x1a\x1f\xbc\xc6\xc9\xd5\x1e\x6f\x79\xd8\xc5\x51\xca\xe3\xbe\x2b\x0c\xc5\x08\x66\x51\xdb\xb3\xd3\x0d\x62\xe6\xbc\xc5\x17\x09\x77\xc3\x6c\x5b\xa3\x80\xa2\xdb\x8f\xd9\xdb\x0f\x4d\x1c\x50\x29\x21\x25\xb8\xd6\x9e\x79\x77\x01\xb6\x87\xaf\xce\x6c\x2b\x27\x19\x96\xc9\x2e\x74\x25\xf7\x5d\xee\x73\x51\xda\x4f\xd2\x50\x23\x0c\x36\x27\x88\x5c\x6a\x3d\x69\x16\xd0\x92\x20\xcd\xca\x53\xd5\xc5\x8b\x27\xf6\x5e\x9e\x98\x1f\x1c\x89\x80\x90\x03\xba\xaf\x5a\xbe\xdd\xe3\x77\x88\x76\x67\x15\x7e\xd0\x06\xc0\x66\x07\xc9\xc1\x0e\xec\x48\xe4\xb7\xb9\x94\xd0\xd6\xf1\x11\x3c\x64\xfa\xef\xf8\xc1\xbc\x0f\x0f\xa6\xa2\xa5\x59\xca\xdf\xf1\x31\x88\x6a\x1e\xe4\x7d\x27\x82\xe6\x1a\x4a\xd0\x29\xc4\x6c\x5f\xea\xb5\x85\x4c\xcf\x61\x40\x8d\x17\xd1\x76\xf3\x37\x5b\x28\xdc\xdd\xed\x9b\xa9\x10\xb8\xa9\x90\x78\xa3\xd4\x69\x3e\x7a\x94\x0d\xee\xc4\xd2\x03\xcd\x39\xa1\xd3\x1e\x20\xc1\x43\x81\x29\x35\x6f\x16\xe4\x17\x05\x8f\x59\x3c\x8d\xac\xee\xa0\x36\xc8\xfe\xaf\x8b\x9c\xc2\x03\xb0\x64\x86\x51\x16\x1d\x25\x48\x93\x1e\xbb\xaf\x4b\x31\xf8\x8e\x57\x3c\x52\xd6\x01\x4a\xc4\x0f\xe0\x74\xbe\xea\xdf\x33\x66\x61\xe1\x0e\x66\x69\xbb\xbb\x66\x46\x6e\x47\xc7\xc1\x8b\x26\x8a\x89\xf2\xfe\xfc\x8b\x70\xcf\x12\xf2\xaa\xaa\xe6\xdb\x35\x42\x7e\xc7\x74\x8f\x81\x4c\x05\x39\x3a\x39\x56\x4a\x04\x97\x40\xe0\xad\xea\x32\xca\x5f\x75\xd8\x16\x97\xa3\x1b\x88\x08\xdc\x4e\x47\xe4\xf4\x05\x3f\x6e\x6f\xf4\x0d\x2c\x1e\xbb\x3c\x56\x51\xb4\x2b\x1d\xc3\x29\x03\xb6\x5a\x9c\x71\x9e\x21\x95\x42\xc4\x71\xdc\xcd\x16\xd0\xa2\x19\xa0\xf2\x2d\x7b\xcd\xa3\xbf\xd6\xc9\xc0\xe4\x3d\xd6\x7a\x8f\x70\x93\x3c\x69\x02\xa2\xc8\x44\x91\xeb\x2f\x7a\x1b\x70\xde\xa9\x40\x5e\x57\x5f\xb1\x6e\x3a\x81\x5b\x8a\x3b\x8e\x66\x31\x3e\xee\x68\xec\xa0\xe4\xbf\x89\x34\xd0\x28\x75\xf7\x76\xb6\x23\xa0\x04\x46\x63\xc1\x4b\x59\x03\x41\x18\xd8\x6c\xa5\x5b\xaa\x40\xe4\xec\xef\x17\x42\x48\xd4\x0b\x1f\x1e\xf4\x21\xbb\xe8\x92\xac\xed\xa5\x03\x13\xd6\xb1\x40\x3e\xfc\xb7\x07\x39\x32\x9d\x40\x28\xb1\x49\x70\x21\x70\xf3\x99\x50\x8d\x48\x7b\xf9\x6b\x0a\xf5\x14\xa6\x21\x05\x24\x86\xba\xbd\xd1\xbf\x42\x3c\x84\x0f\x07\xfc\x51\x0e\x11\x16\x71\x88\x0c\x18\xeb\xdd\x34\x80\xe2\x3d\xd1\x10\x1c\xbf\x54\x9f\xfa\xbe\xd6\x31\x27\xca\x13\x0d\xf4\xdf\xf9\xbc\xe6\xc0\x78\xee\xbe\x45\xfe\xe0\xa4\x14\x8e\x79\xa9\xe0\xab\xc9\x5c\xb6\x3a\x42\x27\x24\xc8\x59\x21\x53\x5c\xd4\xfc\x6f\xf1\x0f\x47\x5b\x28\x72\x95\xcf\x00\x9f\x8b\x6c\xb5\x0b\xfd\x77\x55\x14\xc2\x0d\xaa\x4d\xb5\x72\x0c\xf7\xb2\x8b\x33\xb3\x63\xac\x09\x39\x8e\x4b\x46\x45\x9e\x3b\xd7\x8e\xdd\x81\x4e\xef\xf6\x00\xa0\x77\x8e\x68\x10\xe3\x27\xb4\x3f\x31\x63\x26\xba\xcb\xc1\x21\x2a\xf3\x44\x07\xd9\xaf\x79\x41\x21\x93\xc3\xc3\xca\x58\x48\x0e\x0e\x60\x45\x2e\xdf\x1c\xc3\x02\x4d\x4b\xcf\x5f\x4d\x50\x21\xe1\x42\x3a\xd1\x21\x0d\xc9\xfa\xd1\xe4\xa5\xa0\x69\x60\xbb\x50\xca\x2f\x62\x65\xb2\x66\xca\x2f\x4f\x52\x7e\x09\xe3\xca\x9d\x49\x04\x28\x2b\x94\xcc\x07\x7c\x4a\x34\xc1\xe7\xa1\xac\x11\xc4\x37\xb9\x7a\xe6\xc1\x89\xba\xf4\x14\xc1\x11\x9b\x5c\x5c\x1c\xd4\xea\x39\xc9\xd9\x54\x2e\x2a\x93\xee\x94\x78\xcb\xa4\x8f\x47\x4e\x25\xbc\xc3\xbb\x3d\x4e\x64\x85\xc4\x0d\xf1\xf1\x82\x15\x72\x51\xf3\x59\x21\xca\xaf\x7b\xd5\x55\x65\xba\x9b\xdc\x8b\x4a\xdd\x29\xe8\x1b\x03\xe2\x98\x23\xea\x5c\x71\xee\x72\xc0\xb2\x81\xca\x5e\x6a\x90\x47\x19\xbf\x81\xf8\x16\xce\x42\xb3\x3a\x4c\xdc\xd2\x04\x67\x7b\xe2\x48\xc0\x58\x02\x9b\xb9\x7f\x2e\x87\xc1\x95\xe7\xd4\xa6\x6e\x99\x13\x5f\x30\x9d\x85\x27\x92\x61\xa3\xbe\x6c\xc0\xfe\xfd\x7f\xfe\xed\x6f\x7f\xfb\x5f\x51\x55\x83\x0f\xec\x00\x17\x0e\x68\x00\x21\xf6\xa4\x17\xf0\xbc\x7d\x25\xa9\xe6\x8b\xa2\x4f\xaa\x34\xb5\x14\x39\x7e\x11\xc0\xf3\x28\x95\x6b\x8c\x5c\xff\x8e\x8c\x51\x58\xf5\xd7\x9d\xf6\x5d\xab\xbc\xc0\x0d\x6a\x3f\xb4\x20\x76\x3d\xf4\xdd\x43\x16\xf8\xc6\xe1\x6e\x35\xae\x9e\xa6\xeb\x1b\x0c\xbe\x11\x9a\x3f\xbd\x1e\x9e\x03\xf2\x00\x22\x4a\xc0\x2b\xb9\x9c\x63\xdc\x70\xb6\x23\x9e\x10\x52\xb5\xa3\x79\x81\x31\x32\x8c\xbd\x20\x0d\x76\xbd\x92\xeb\xa0\x9a\x45\xac\x70\x64\x96\x85\x77\x63\x6e\x0d\xbf\x20\x2c\x2e\x02\xb6\xd3\x46\x05\x20\x84\xee\xdc\xf5\xf9\x2c\xa9\x60\xb3\x9b\xc1\x8d\x9a\x75\xce\x2c\x8e\x3a\xe2\x63\x89\xfd\xc7\xc9\xae\x18\xf4\x18\xfb\x9f\x97\x57\x37\xa3\xb7\x1c\xf5\xad\x6f\xb5\x6f\x2a\x48\x4e\xac\x1f\x87\xaa\x0f\x53\xd8\xbd\x5e\xec\x82\x01\x17\xde\x71\xb5\x6b\x9d\x45\xd2\xc0\x32\xd1\x79\x3c\xf1\xfe\x22\xcf\x1b\xc1\xee\xb3\x3d\x3d\xa9\x44\x50\xaa\xfc\xc7\x13\x92\xcb\xf4\xe4\xc7\xba\x82\xcf\x35\x4d\x11\xdd\xfe\x17\x63\x4e\x51\x78\x3f\xd8\xeb\x44\x48\x4c\xf5\x20\x09\x10\x65\xe6\xed\x9e\x33\xfe\xb7\xf4\xb5\x6b\x2c\xf8\xd9\x67\x8e\x3d\xb1\x95\xdb\xc9\xf9\x03\x4f\x7e\x24\x4b\x6e\x8c\x4e\x22\x13\x8c\x39\x9a\x9f\xd4\x1b\xe8\xbc\xa2\xec\x2c\xf8\x7e\x1f\x70\x82\xfd\x4f\xb7\xa3\x9f\x47\xc6\x71\xfe\xbf\x6c\xdb\x71\xc5\x73\x94\x5e\x1f\x65\x60\xf8\x8d\x28\xbe\x97\xde\x89\x11\x88\x31\x7f\x32\xbd\x13\x55\x25\xfd\xe4\x56\xfc\x3f\xe0\x67\xf0\xfc\xea\xfc\x6c\x78\x7d\x78\x32\x78\xf9\x4f\x23\x80\x7c\x84\xff\xf5\xe5\xf1\xc9\x8b\x26\xff\xe3\x2f\xaf\x5f\xfd\xe4\x7f\xfc\x23\x7e\x6e\x88\x54\xda\x6e\x82\x86\x39\xc2\xbc\x61\x75\x32\x78\x99\xf1\x5f\xf9\x99\x9c\xcb\xf5\x4c\x56\xfc\xe4\xe8\xe8\x88\xb1\x89\x4c\x8c\x4a\x51\xe6\x81\x58\x5c\x99\x60\x89\x80\x33\xdd\xd3\x24\x35\x60\x59\x0e\x7a\xce\x0a\xe8\xf5\x29\x21\xe4\x69\x34\xb3\x0d\x60\x93\xd4\x35\xe8\xad\x6e\x74\x02\xac\x65\xfd\x96\xb1\xe3\x01\x4f\xbb\x8c\x50\xea\x11\x9f\x12\xd5\x12\x81\x9d\x17\x42\x06\x1e\xd3\xd3\x38\x55\x89\xb0\xcf\x4e\xda\x0d\xaa\x92\xcf\xb0\xfc\x1d\x62\x1f\xd4\x20\x31\x0d\x74\x72\x4f\x47\xcd\xb3\xa8\xf9\xcc\x51\x95\x9b\x1a\xc9\xc8\xdc\x80\x02\x4f\x64\x18\x2e\x40\xd0\x09\xb5\xf6\xf1\x67\x96\x4e\x72\x0c\x7d\xcf\xd7\xa2\x96\x95\x12\x45\x74\x7b\x79\x7d\x2b\x1e\x8c\x47\xec\x6e\x8e\x11\xf1\x59\x3d\xda\xea\x9d\xac\x66\xa2\x56\xeb\x14\x51\x3a\xa2\xf5\x7b\x49\x20\x3f\x62\x4d\x89\x34\xc1\xbf\xe7\xee\x13\xe4\x91\x37\x44\xac\xe4\x66\x66\xa5\x0b\x20\xdf\x87\x0f\x96\xba\x66\xb3\x90\xdb\x27\xf2\x3b\x59\xd5\xca\xb1\xab\x04\xd7\x19\xba\xaa\xd7\x9a\xb4\x3d\x64\x49\xd9\x62\x7e\xbb\xc3\x3f\x17\x85\x2a\x97\xcc\x73\x9b\xb8\x8d\xea\x76\x9d\xb3\xfd\x32\x6f\xb0\x60\x2a\x75\x70\xe9\x79\xe8\x82\xb3\x2d\x94\x6c\xe7\xaa\x8e\xa2\x9b\x58\x7a\x4f\xee\x8b\x70\xb8\x2a\xfd\x9b\x9c\xdb\x09\x79\x8d\x13\xe2\xff\xf2\xc1\xaa\x58\x21\x76\x85\x60\x00\x11\x55\xfd\xfe\xaa\x7f\x06\xcf\x92\xfe\x10\x55\xfa\x3b\x14\xde\x46\xb5\xbf\xf7\x65\x38\xfe\x25\x3f\x74\x2c\x95\xea\xa0\xc9\x87\x64\x42\x97\x00\x58\x3d\xa1\x94\xde\x3d\xcd\xd2\x5c\x7f\x6b\x53\x7e\x1a\x4f\xf9\xf4\xea\xc3\xcd\xe7\xe1\x24\x2d\xec\x7d\xff\x05\x92\x64\xaf\xae\x47\x97\x38\x21\x57\xb7\x97\x67\x98\x20\x3b\xbc\x3c\x8b\x13\xb9\xa7\xfc\xdf\xfe\x6d\x38\x65\xe3\xe9\xb3\x67\x98\xa9\x7c\xf9\xa5\xb3\x92\x37\xaa\xd4\x4d\x8a\x7a\xdf\xdf\xde\x40\x9a\x2c\x64\xce\x8e\xce\xf8\xcd\x55\xc6\x20\xb9\xbc\xf5\x1a\xbf\xfa\x10\x55\xee\x8e\x7d\xa5\xed\x87\xf1\xcd\xe5\x68\x3a\x6d\xd5\xf0\x72\xaa\xe1\x65\x76\x70\xbe\x14\xf4\x6c\xc0\xc7\x97\xfc\xf2\x8a\x8f\xfe\x32\xba\xbc\xa1\x1c\xe6\x7d\x63\xb5\xdd\xbf\x99\x26\xc3\x65\x21\xd7\xfc\x83\x4f\x61\x87\xdc\xf2\x90\x65\x9e\x24\x97\xfb\x8c\xf3\xd1\xbf\x8e\x2e\xae\xcf\x87\x93\x2f\xed\x84\x73\xe6\x52\xb9\x0f\x1e\x9e\x19\xbb\x40\xa7\xb7\x93\x11\xa4\x0c\x43\xb2\xf6\x7b\x2a\xaa\x85\x34\xf3\x29\xbf\x9a\x30\xac\xd2\x1d\x4d\xdf\xf9\x0c\xf4\xdb\xe9\x28\xe3\x67\xc3\x9b\x21\x7c\xf8\x7a\x72\xf5\x61\x7c\x33\x7d\x67\xff\xfd\xfe\x76\x3a\x86\xb9\x1b\x5f\xde\x8c\x26\x93\xdb\x6b\x3b\xea\x3e\xff\x74\xf5\x79\xf4\x97\xd1\x84\x9d\x0e\x6f\xed\x22\xda\x49\x86\x85\xff\x42\x65\x04\x49\x1a\x78\xa8\x29\x18\x5f\x46\x95\x03\xd3\x9b\xc9\xf8\xf4\x26\x7a\x8c\x5d\xb5\xaa\x0e\xe2\x5c\xef\xb8\xd2\xa0\xcf\x87\x93\xf1\xd4\x3e\x30\xc6\xcf\x7e\x1e\x7e\xe1\x57\xb7\x54\x26\x3c\x62\x54\x19\x9c\x6c\xdf\x8c\xbb\xdc\xf7\xe1\xd9\x5f\xc6\xd3\xa7\xe4\xb7\x0f\x18\xf3\x27\x1e\x32\x3d\xbd\x18\xf4\x86\x5b\x5b\x20\x80\xb7\xc3\xc9\xc3\xe3\x37\x6f\xde\x1c\xda\xbb\x77\x9f\xf8\xc8\xac\xac\xbe\xd7\x3a\xe7\xa7\xaa\x99\x37\x79\x3b\x1d\x0e\x58\x97\x3f\x85\x5f\x87\x48\x05\x78\x13\x37\xbb\x06\xc2\x51\x9e\xc8\x78\xe4\x0a\x65\x89\x94\x8f\x28\x3b\x7e\x9a\x05\xff\xa9\x7e\x82\xfe\xff\xea\xdf\x4d\xff\x3f\x39\x3a\x69\xeb\xff\x2f\x7f\xea\xff\x7f\xc4\xcf\x13\xf5\xff\x57\x19\x3f\x3e\xe6\x17\x62\x67\x75\xff\xe3\x9f\xba\xff\x4f\xdd\xff\xa7\xee\xff\xb8\xee\xef\x86\xe6\x31\xda\xf0\x63\x3f\x4d\x80\x9f\x26\x40\xf7\x58\xb3\x96\x01\x80\x8a\xec\xa7\x11\x81\xd0\x1c\x4c\xfb\xa0\xbb\x7e\xbe\x1c\xe1\xbf\x51\xeb\xf4\x53\xfa\x04\x73\x81\x7d\xaf\xb9\xc0\x1f\x30\x17\xd8\xf7\x99\x0b\xfc\x21\x73\x81\x7d\x97\xb9\xc0\x1f\x30\x17\xd8\x77\x9b\x0b\xfc\x41\x73\x81\x7d\x87\xb9\xc0\x1f\x34\x17\xd8\xbf\x83\xb9\x70\xfc\xd3\x5c\xf8\xf9\xb3\xef\x67\xf0\x5c\x9e\x6a\x73\x88\xb9\x30\x4a\x97\x87\x27\x83\xa3\xdf\xdb\x10\x78\x44\xff\x3f\x3e\xfa\xe5\x97\x86\xfe\xff\xea\xe8\xf8\xa7\xfe\xff\x87\xfc\x40\x85\x11\x28\x3d\xa2\xe0\x7e\x17\x40\xec\x12\x35\x26\x0c\x2d\xab\xd2\xd4\xa2\x44\x40\xac\x5a\xae\x37\x85\xa8\x91\x28\x7d\x0b\xb8\x87\xf3\x4a\x63\x5a\x4d\x59\xa8\x52\xf2\xc5\xb6\x24\x80\x8c\x80\x9b\x68\xdb\x81\xdc\xc1\x1d\x30\x77\xad\x37\xaa\x88\x93\xb1\x30\x99\xa6\xfc\xca\x55\x1d\x23\x33\x43\x22\x1f\xe9\x75\xa8\x46\x63\x6c\x33\xca\xa6\xf2\x6d\x87\xc6\x7c\xd6\xeb\x6c\xc7\x55\x6d\x64\xb1\x88\x38\xe7\x43\x9a\x34\xb4\xe4\xd2\x94\xee\x64\x94\x4b\xf0\xf1\xf2\x96\x7f\x94\x25\xd4\xb4\xa6\x46\x91\x67\x84\x40\x0d\x33\x32\x20\x30\x69\xca\x27\x95\x58\xbd\xd5\xd4\x04\xc6\xda\xc8\x2a\x54\x40\x9d\xa7\xab\x3c\xa0\xaf\xbb\x64\xbc\x83\x17\x7d\x27\xdf\x1f\xe8\x04\x95\x7b\xfb\xf5\x8a\xf3\x7c\x01\x2a\x44\x50\x9d\x1f\xce\x22\xe6\x6b\x1b\x7e\xbf\xda\xed\x9f\x40\xbe\x86\x5b\xe3\xbb\x26\xe3\xa7\xf0\xfe\xcf\xfe\x33\x78\x7e\x7a\x7a\xf8\xfe\xcb\xe1\xe5\xe9\xe1\x8b\xdf\x5f\xf2\xe3\xcf\xc3\xf2\xff\xe5\xeb\xa3\xe3\x57\x0d\xf9\xff\xe2\xe4\xe4\xa7\xfc\xff\x43\x7e\x4e\x81\x40\xea\xce\xa5\xd9\x26\x65\x14\x87\x97\xba\x8c\xc8\x9e\x5f\x0c\x8e\xf8\x6d\xb9\xd1\x15\xa0\x64\x4f\x46\x43\x00\x09\x3d\xbd\xba\xb8\xb8\xba\xb4\x46\xcb\xe4\xfa\x6a\x82\x60\x24\xe3\x29\x62\x91\xf0\xf3\xe1\x67\xfe\x61\x3c\xb9\x00\x2d\xfd\xec\x6a\x84\xbf\x27\xa3\x8f\xb0\x82\x9c\x49\x30\x08\xe0\x3c\x84\x8c\x62\x55\x68\xe6\x90\x5e\xfd\xdb\xf0\xe5\x11\x1f\x5e\xf2\xe1\xcd\xcd\xd5\xe4\x72\xf4\xe5\xf0\xf4\x7c\x6c\x6d\x8e\xc9\xe8\x1c\xbe\x3f\xfd\x34\xbe\x1e\xb4\x7a\xc8\xe8\xb3\x53\x54\xcd\x11\x98\x86\x02\x2f\x0e\x45\xf6\xd0\xa3\xc8\xb6\xdf\xe7\x17\xc3\x3f\x43\x17\x62\x14\xd8\xc9\xe8\xe3\x70\x02\xd6\x02\x42\x14\x85\x36\x9d\x65\x9b\xe1\xd8\xc9\x1a\x9c\x36\x31\x6b\xc8\xb4\xf2\x10\x35\x0c\x20\x6a\xac\x15\x88\x89\xfa\xde\x17\x67\xdb\x87\x04\xfe\x83\xe1\x94\x9f\x8d\x3e\x8c\x2f\xad\xd5\x3c\x3a\xbf\xfa\xdc\xef\x04\xc9\x1d\x41\xde\xff\xd4\x9b\x22\xed\xe9\xb8\x7d\x7f\x3e\x3e\xf5\x48\xba\x07\xbd\xd3\xd3\xeb\xf3\x9e\x35\x84\x7a\xf4\xbb\x5e\x1f\xe1\x67\xe1\xb3\xf8\x8d\x9b\xd1\xe9\x0d\x5a\xeb\xa7\x57\xd7\x5f\x26\xe3\x8f\x9f\x6e\xec\xf8\x9e\x5f\x4d\x18\x02\x06\xa5\xb0\x39\x03\x30\x90\xbc\x45\x44\x4d\xe1\x93\x37\x9f\xec\x12\x26\xe8\xaa\x01\x4c\xd5\x2f\x3b\x18\xa3\xee\x4b\x76\x3b\x61\x3f\x20\xa5\x6c\x74\x36\x60\xec\xbd\xb5\xfe\x47\x93\x53\x34\xc9\x00\xaf\xd6\x3e\xeb\x51\x72\xe1\x8b\x7e\x76\x3e\x8d\xac\x31\xf6\xe5\xea\x96\x0f\x4f\x01\xbf\x15\x3c\x08\x1f\x27\xa3\x11\xbf\xb9\x62\xef\x47\xfc\xbd\xb5\xc5\x9d\x37\x22\x9d\x41\x87\x16\xdb\x00\x0a\x4a\xf0\x88\x2f\x86\x5f\xac\x0d\x6e\xed\xe7\xf1\xd9\x68\x32\x3a\x63\x37\x57\xf6\x17\xc3\xc8\xf8\xb4\xef\xe2\xf3\x57\x13\xfe\xd1\xee\xa4\x29\xf4\xc8\xfe\x9e\xfa\x6e\x1f\x1e\xc2\x0a\xdb\x0e\x93\xed\x0a\x2d\xe2\x01\xbb\xfa\x60\xdf\x98\xd0\x20\x86\x10\xd1\x22\xeb\x11\xfb\x4c\x3e\x13\xac\x01\x99\x52\x59\xc8\x80\x9f\xc9\x05\x94\x2a\xeb\xd2\x30\x26\x06\xbc\x37\xcc\xc5\x06\x1d\x85\xae\xe8\x23\xd1\x0f\x00\x2e\xd1\xea\x00\x9f\x75\xf5\x15\xeb\x56\xe2\xdf\x84\xc4\x4c\xb6\xa9\xe4\xa1\xfc\x46\x30\x3f\xa0\xb5\x11\x06\x8c\x20\xdb\xb5\x34\x8e\x63\x40\xf8\x6f\x66\x48\x86\x8a\x02\xe8\x1e\x3e\x11\x81\x38\x32\xbd\xb0\x6a\x94\x9a\x07\xf7\x1d\x94\xe7\x07\x60\x69\xc1\x0b\x65\x7f\x51\x01\xbc\x83\xa8\x6a\xfb\xfd\x39\xb5\xa4\x2b\xbe\x59\xe9\x12\x88\x09\x19\x7a\xf0\x20\xdd\xae\xa4\x84\x52\x5f\xbc\x3d\x57\xa5\x5c\x8b\x5a\xbb\x3a\xad\xd0\x3f\xe3\x4a\xe6\x48\x15\xd6\xd5\x3a\x10\x9b\xfa\x49\xa0\xfc\xe1\x4a\xce\x85\xa9\x33\x1c\x2b\x82\xdc\x20\x82\x8b\x6d\x4e\xc6\xec\xac\x58\x09\xc3\xc0\x4b\x5c\xc9\xb9\x5e\x96\xea\xef\x50\x4c\x47\xd4\xb0\x21\xfd\xd3\xf1\xfc\x79\xbe\x41\x22\xdd\x44\xcd\xd5\xfe\x3b\xe0\x3a\x18\x26\xf8\x29\x55\x8a\x39\x1e\x00\xd0\x81\x29\x09\x3f\x07\x9d\x4e\x94\x3c\xac\xb9\x4f\xf4\xa7\x22\xd4\x26\xe3\x88\xaf\x53\xe5\xe2\x4e\x2b\xd4\x56\xf5\x82\xe7\x7a\x3b\xab\x33\x42\x18\xf4\xd3\x00\x4e\x0a\x58\x2f\x51\xd0\x12\x44\x53\xce\xe2\xe5\xc0\x6c\x6c\xb3\x2b\xe7\xab\x4a\x97\x11\xf6\x46\x68\xac\x04\x17\x67\x7e\x88\xf0\x34\x30\x9e\x7a\x05\x60\x08\x77\xe0\xbf\x85\x0c\xcc\x83\x1e\xb4\xa1\xca\x65\xaf\xef\x89\x0f\x7e\x78\xb0\x8c\xcd\x06\xbc\x17\xa6\x30\x9c\x88\x79\x98\x56\x80\xcb\xd8\xb3\xe7\xc2\x96\x67\xb2\x9c\xef\xe6\x85\xde\xc8\x5c\x09\x74\x6d\x8b\xb2\x5e\xe9\x42\x2f\xa1\x16\x36\xdd\x8e\x26\x0b\x53\x03\x5b\x6e\x56\x69\x91\xdb\xdd\x64\x00\x7c\x35\x36\x85\xa0\x0c\x38\xc1\x6b\x8a\x2a\xa1\xf0\x91\x42\x39\xd8\x05\x57\xb0\x73\x7c\xb0\xe8\x63\xe5\x69\xc6\x02\x8e\x32\x5a\x05\x6e\xda\x8d\x74\x43\x84\xde\x46\x58\xaa\xbe\x7c\xcd\xa5\xcf\x67\xd1\xae\x63\x09\x43\xae\xa3\xa3\x34\x51\x3e\x7c\xbc\x41\x62\x32\x14\x55\x1b\x80\x36\xaa\x24\x10\x0a\xf1\x6d\xe9\x4a\x47\xf0\x64\x88\x42\x13\x6e\x4f\x42\xd6\xe7\x18\x7b\xca\x10\x95\x40\x7c\x98\xd0\x29\x00\xb5\x92\x1b\x51\x89\x1a\x93\xcb\x55\x99\xcb\x8d\x2c\x73\xa8\x42\x81\x39\xc2\x50\x09\x21\xd8\x3b\x66\xad\x5a\x2f\xb1\x88\x0c\x22\x57\xc6\xc8\xf5\xac\x80\xbe\xd6\x3a\xda\x04\x77\x92\xdd\xaf\x74\x21\x07\x7c\xd8\x7d\x0e\xf9\x77\x9f\x43\x16\x03\x3c\x40\x52\x7a\xbf\xb9\x5b\xdb\x40\xfa\x8c\xcd\x07\xbc\xe7\x79\xec\xa4\xaf\xda\x23\xec\xac\x84\x30\x1c\x5b\x02\xdb\x2d\x96\x2b\x2e\xe8\xa2\xa4\x2f\x0e\x80\xa5\xd2\x55\xd4\xbb\x0c\x64\x78\x60\xb0\xcd\x1c\xfe\x19\x04\x58\x82\x70\x46\xc1\x27\x2b\xdb\x92\xe7\x36\x1b\x30\x96\x0f\x5c\x41\x96\xae\xe2\xd2\x42\x55\xe6\xea\x4e\xe5\x5b\x2b\xde\xc2\xbf\xed\x6a\x52\x91\x7a\x85\xff\x52\x0e\xd3\x08\x98\xa0\x0e\x4c\x9f\xf9\x7e\x3e\xc2\x5c\x37\x60\x4c\x0e\x78\x80\x3c\x19\x42\x3c\x86\xfa\xe0\x41\x4f\xa0\x60\xe3\xb1\xdb\x04\xca\xe7\xbf\xa3\xc3\xf7\x2b\xed\xb9\x3c\xe2\x69\x55\x0b\x5e\xea\xa8\x25\xff\xd2\x8e\xcf\x45\x09\x84\x3f\x50\xa4\x6f\xcf\x41\x16\x96\xcd\xac\x64\xf5\x8e\xae\x2d\x5f\x7f\xc5\x0f\x54\x9f\xb5\x06\x11\xdf\x73\x88\x8a\x81\x18\x4a\x46\x95\x4b\xa8\x3e\x05\x19\xad\x60\x06\x40\xa4\x57\x18\x57\x64\x54\x61\x41\xb5\x90\x76\x00\x62\x5e\xe3\x7b\xf6\xa2\x2e\x14\xf0\x60\x02\x9e\xb9\x5a\x67\x1c\x32\xda\x55\x99\x21\x1e\xc4\xa6\x92\x75\x12\x8c\x63\xd4\x8f\x07\xc4\x25\x8c\x1d\x6b\xb2\xdc\x8d\xbe\xd0\xc5\xd7\x42\x57\xf2\x1d\x22\x4e\x53\x44\x33\x1a\x9c\x93\x93\xae\x94\x23\xdf\xce\x65\xc5\x67\xd2\x17\x97\x40\xf7\x81\x07\x52\x2e\x45\xe1\xe6\xd6\x8e\x06\xf0\x80\xd9\x42\x7d\x93\xc6\x39\x6f\xca\xdc\xb4\x27\xcd\x6f\x68\x7c\x00\xa6\x3d\xb3\xfd\xf1\x1d\x82\xd9\xb6\xdb\x3c\x12\xd4\x74\xae\x00\x90\xc7\xd1\x54\x89\x1a\x0f\x05\x80\x40\xd4\x80\xa2\x4f\xcf\x0f\x18\x5b\x0c\x78\xcf\xee\x8a\xf8\x48\xf8\xb9\xa2\xa8\x6d\x32\x5f\x9e\x40\xae\xb3\xac\x27\x06\xe6\x7b\x00\xf5\xcc\x61\xfa\xe5\xdb\x79\x1d\xb1\x21\xbb\x0f\x67\xcc\x00\xc0\x04\x94\xbe\xe1\x45\x40\x3d\xc8\xf5\x5a\xd8\xd5\xbe\x5f\x89\x1a\xfc\x5f\xa4\xf6\xd8\xb7\xd7\x54\x52\xe0\xd0\x47\x40\xb4\xfb\x85\x65\xa1\x3f\xb9\x5a\xaa\x5a\x14\xf0\x60\xac\x1f\xce\xb4\xb6\xea\x82\x58\x6f\x56\x85\xac\xa3\x7a\x1f\x02\x0e\x7a\x67\x0f\xa7\x44\x1a\x5f\x26\xf2\xdc\xb6\x0c\xb5\xe1\x6b\x5c\xeb\x70\x43\xfa\xeb\x4c\xac\x25\x71\x04\xd8\x97\xf3\x4a\x00\xcc\x36\x40\x9c\xd0\xbf\xf5\x21\x69\x2b\xcc\xbe\x68\x9f\x9a\xaf\x74\x25\xbd\x1e\x78\x4f\x47\x56\xda\xfd\x5d\x0b\x85\x38\x8e\xaa\xe4\xf9\x76\x3d\xe3\x66\xa5\xef\xdf\x45\x1a\xcf\x5c\xaf\x37\xda\xc0\xb9\x6c\xa5\x32\x40\x09\x0a\x7c\xa0\xa1\x6a\x3a\x0f\x64\x28\xe9\x10\x06\xb1\x29\xa0\x42\x1d\xca\x3d\x68\x22\x5d\x3c\x77\x53\x69\xc0\x9f\x11\xa5\x28\xf4\x52\x6f\x91\x0b\x2b\x6e\x77\xf7\xce\x69\x88\x56\x57\xab\xc4\x3d\x1c\xe0\x8d\x50\xa5\x9d\xca\x8c\x89\x6a\xbe\x52\x35\xcd\x26\x37\xf3\x6d\xb1\xc1\x7f\xca\x72\x59\x89\x3b\x8a\xaa\x17\xb6\xef\xa1\xbd\xcd\x4a\xb7\xba\xcd\x1e\xe8\x36\x7f\x4a\xb7\x43\xa3\xbb\x77\x2c\xf4\x19\x11\x2f\x60\xef\xd9\xc3\xc7\x55\x51\x6c\x4d\x5d\xd1\x65\xb4\x16\x1b\x10\x3e\x65\xc6\xcd\x57\x59\xcf\x57\x58\x7b\x55\x49\x79\x98\xab\xb5\x2c\x0d\x00\x56\xc1\x9a\x12\xb8\xe1\x1d\x5c\x81\x4b\x5a\xd9\x5d\xc6\x6b\xbd\xf1\xff\x8e\x67\x03\xb4\x2b\xbb\xff\xe7\xb0\x69\x22\xa1\x60\xbb\xe7\x0f\xef\xbb\x58\x10\xbd\xa3\x22\x5b\x55\x78\x2d\x36\x17\xb5\x68\x40\x5b\x22\xb3\xde\xa6\xd2\xf6\x4b\x32\x47\x52\x69\x9f\xed\x00\xb7\x34\x6e\x42\xc0\xa1\x82\xbe\xd3\xd7\x7d\x1c\x5f\x54\x4a\xe2\x25\x03\xa8\x01\xc6\x3f\xe0\xf9\x9f\x93\x6f\x01\x09\xb1\xcf\x8c\x88\x35\x8f\xfd\x12\x79\xc0\xd8\x72\xc0\x7b\x5f\xf4\xd6\xeb\xbe\x25\xef\xbc\xab\xe4\x37\x59\xcd\x31\x03\x63\x2f\x5e\x9e\x55\x93\xa0\x2e\x18\xe8\xbc\x2b\x79\xa7\x80\xd0\x95\xdf\x29\x5d\xf8\x7b\xb1\x9b\xa8\xaf\x41\x25\xc0\x12\x13\xd4\x35\xeb\x19\xf0\x5d\x5d\x6f\x04\xb9\xe0\x2d\x28\xa7\x78\xd8\xf5\xa0\x4e\x4b\xb6\x1f\xe2\x2f\x97\x66\xa3\x00\x01\xca\x75\x98\xba\x8b\xc1\xd5\xd5\x80\xf7\xd0\x05\x5e\xec\xf8\x35\xce\x7f\xa4\x77\xb9\x2b\x8f\x34\xad\x4a\xce\x7d\x71\x70\xac\x5d\x39\x36\xeb\x80\x45\xd0\x52\xd1\xb4\x91\x1d\xad\x64\x04\x80\x40\x5f\xd4\x95\x3b\x56\x59\x24\x63\x67\x3b\x7e\xaf\x70\x2f\xdb\xff\x02\x3c\x4e\x78\x1e\xdb\x74\x72\x38\x36\x42\xde\x39\xcd\x91\xed\xd3\x1c\x3f\x3b\xd5\x99\x98\x2c\xef\x05\x81\xe3\xaf\xa1\x2c\xc4\x0f\x92\x1e\x07\x7e\x36\x02\xcb\x02\xa8\x23\x7c\x1f\x96\x46\x70\x2c\xf7\x84\x2b\xa6\xf6\xff\x1b\xf6\x5a\x01\x48\x3a\x06\x8b\x85\xad\xaa\xfe\x8e\x45\x13\xec\xa7\x32\xed\xe0\x9e\xd9\x89\x68\x1b\x63\xd8\x8a\xf4\x5d\xd7\xf7\x68\x46\xe2\x45\x8b\xb1\x44\x67\xbb\xc6\x3c\xb2\x58\x52\x40\x44\xc9\x89\x0a\xc2\x15\x0d\xff\xef\x7b\x9e\xf4\xd5\xb7\xcd\x8c\x5a\xda\x75\x76\xba\x49\x85\xa8\x31\x66\xc0\x98\x1a\xf0\xde\xc4\xa5\x93\x35\x95\x7d\x1f\x68\x7f\xec\x03\xee\x4e\x62\x91\x4a\x30\xdb\xe1\xf7\x00\x22\x5f\x19\x7b\xd2\x2b\x39\x07\x22\xc7\xa5\x49\x49\x8a\x40\x47\x53\xdf\x7c\x6a\x99\x4f\x70\xb3\x7d\x77\x7f\xd8\x3b\x71\xa6\xd6\x95\xc7\x23\xf5\xc2\xb0\xa9\x7c\x05\xaf\x8d\xbd\x6b\x23\x8d\x21\xdc\xf4\x60\xab\x56\xba\xb4\xbb\x4c\xe6\x6a\xbb\xc6\x8c\xbc\x0f\x42\x55\xfc\x0c\x53\xbc\x28\x71\x21\x40\x65\x36\xa0\x52\x12\xcc\x4c\xa0\x7f\xb4\xf3\x9a\xa1\xaa\x44\x8c\xa3\x84\x5a\x6b\xa7\x71\x6b\x4d\xb0\x45\x25\x29\x0f\x2b\x24\xaa\xd9\x07\x09\x0f\x00\x31\x47\xf1\x81\x08\x18\x80\x81\x9a\x4b\x91\x3a\x32\x65\x88\x1c\x09\x53\xf0\x16\xc8\xc0\x36\xd7\x65\xe9\x8d\x46\x4a\xca\x0b\xdf\xa1\xe9\xb2\x1b\x97\xb0\x63\xfc\x9f\x08\x20\x86\x5c\x64\x09\xa0\xb1\xdd\x38\x2f\x06\x7e\xcc\x1f\x2b\xe0\x59\x99\xa6\x08\x1b\x84\x9c\x0d\xa6\xa0\x4b\x35\x6c\x8a\xe4\xcc\x4b\x52\x46\x44\xc3\x84\x63\x02\x28\x3e\xf6\xf6\x28\xf2\x7b\x95\xcb\xcc\x51\xb3\x1c\xda\xc9\xca\x78\xa9\xcb\x43\x8f\xa5\x03\x1e\xa1\x8d\x04\x57\xc1\x81\x43\x5a\xf0\x50\x66\x2e\x1f\xb0\x23\x51\xb2\xef\x33\xd1\x22\x31\x1e\x76\xa5\x87\xbf\x73\xfc\xbb\x90\x57\x49\x60\x6b\x6f\xc1\xd3\x59\x6b\xee\x0f\x4f\xb4\x37\x81\x27\x79\xae\xab\x8d\xae\x44\x1d\x3b\xb3\xac\xcd\x1f\xbb\x1d\x82\x45\x6f\x32\x46\x8c\xa1\xed\x06\x11\x89\xcf\xb7\x17\xd5\x05\xfb\xb7\xdf\x81\x9b\xa9\xd6\x1e\x6b\xb0\xcc\xa3\x86\x86\x91\xef\x31\x4d\x72\xf5\xcc\xc8\x91\x61\x1e\x49\x7d\x80\xcb\x0a\x5e\x56\x87\xb6\x83\xa7\x23\x03\xa6\x0c\x13\x83\xc4\x99\x5a\x6e\x50\x75\x2c\xa4\xa8\x8a\x1d\x2b\xc4\x4c\x16\xd6\xbc\x5b\x8b\x6a\x4e\x0c\x92\x41\x7f\x20\xa3\x94\xe4\xfd\x7c\x25\x80\xea\xe5\x5e\x56\x14\xdb\xf6\x80\xa4\x84\x44\x83\x20\x62\x1f\x60\xe7\x8b\xf5\xa6\x80\x2a\xfb\xb8\x7f\x73\x97\x30\xb9\x16\xd5\x57\x99\x73\xc0\x84\xf1\x6e\x09\xac\x5f\x16\xc6\xbf\x22\x73\x06\xc7\x6a\x54\x2e\x0b\x02\x42\x98\x6e\x44\xa9\xcc\x2a\x43\x1a\xc8\x24\x5d\x98\x5a\xf7\x78\x04\xed\xc6\x59\x0b\xaf\x64\xd0\x7b\x07\x1e\x95\x5a\xf3\xe0\x53\x81\xd5\x69\x5e\xf8\xf1\x2e\xf1\xd3\xdf\x5a\x77\x16\xaf\x39\x98\x90\x8e\xbf\x33\x7f\xd2\x47\xa2\x9d\x40\x78\x1c\x88\x15\x47\x1b\x9e\xac\x2f\x77\x16\xd0\x2f\x00\xa0\x81\xb9\x12\xc8\xf5\x04\xb5\xe5\xc6\x23\x23\x95\xfa\x9e\x7f\x2d\xf5\x3d\x60\xf6\xd9\x33\x8c\x30\xcf\x39\x52\xcf\x12\xa8\x75\xfc\x09\x07\x19\x16\x84\xbf\xbb\x6d\x60\x1f\x26\x34\x8f\xa0\xd0\x56\x56\x94\xcc\x57\x25\xb1\x19\x25\x70\xee\xdd\x87\xd6\xa5\x25\x37\x3b\x3d\x60\x91\x88\x72\x5e\xcc\x5f\x0f\x16\x84\xad\x4f\xef\x63\xa9\xbf\x83\xc4\x8a\xa8\x51\xbc\xd2\x27\x2a\xe9\xc4\x55\x45\x09\x6c\xc9\x45\x4e\xd8\x77\x0e\x03\x87\x76\x71\x0b\x7b\x3f\xb8\x52\xd9\xcb\x83\xbc\x8f\x79\xcd\x13\xba\x1e\x10\xf0\xfd\x26\x22\xf6\x74\x3d\x89\x59\x9d\x69\x6a\x13\x5c\x6f\x7b\x72\x58\x84\x76\xe4\x01\x65\x42\xee\x45\xc8\xf3\xae\xa2\xcf\xa1\x48\x73\x99\xbc\xd1\x4e\xd2\xd5\x03\xbb\xb5\x0b\x12\xc4\xa7\xe6\xa5\x70\x47\x5b\x53\x37\xd0\x33\x39\xe1\xd1\xd7\x88\x73\x0e\x2d\x4f\x24\xe5\xbf\x8c\x9d\xcb\xaa\x62\x07\xb7\x93\x31\x38\x2f\xb3\x0e\x8d\x1e\xa9\xe5\x63\xfc\x24\xe8\x98\xfd\x64\xf7\x20\x18\x0d\x22\x0c\x16\xcc\x1a\x00\xcb\x40\x14\x1f\x40\x4a\xf1\x2c\xfc\x71\x6c\x0a\x24\x95\xbf\xc3\x11\xf6\xa2\xcb\xd6\x70\x11\x0e\x07\xb8\xbd\xa0\x2c\xa1\x88\xd3\x3a\x56\x37\xbd\x11\x51\xb7\x19\xc0\x6a\xed\xbe\xea\x5e\xee\xc6\x93\x69\x81\x4b\x31\x3b\xac\x40\xab\xe8\x3f\x18\x2d\xc7\x57\x29\x37\xf6\x5a\x12\x73\x04\xc9\x73\x68\x20\xf4\xc1\x85\xac\x1c\x42\x3b\x4b\xe8\x25\xb5\x4b\xee\x77\x55\x02\x7a\xc1\xef\xc1\xbd\x8f\x7e\xca\x87\xd7\x85\x3d\xbc\xb9\x06\xfc\xb3\xe3\x62\x7f\x7c\x17\x32\xbc\x72\xe3\x95\x8c\x16\xd0\x53\x79\xa1\x0c\x81\x50\xc9\x5c\x00\x0a\xaa\xd9\x56\x32\x59\x5b\xd6\x5a\xdb\x78\xf9\xc4\x9e\xc5\x83\x0b\x84\xf0\x0b\x7f\xdf\x55\x04\x5a\x0a\x77\xd4\x5f\x02\xde\x64\x00\xed\x7c\x48\x37\x88\x23\x05\x08\xc5\x09\x0b\xe8\xb3\xb9\x02\x42\x66\xac\x43\x70\xb1\x11\x55\x1d\x6c\x5c\xbc\x8b\x30\xcf\x8d\x28\x78\xed\x9d\x4c\x92\x85\x25\x5a\x5e\xd3\x43\xce\x53\xda\xe8\xb4\x43\x10\xec\x8d\x38\x10\x81\x5f\xcc\x0b\x57\xb7\x35\xb3\x16\xd1\xbc\x98\xd7\xa8\xc1\x65\xbc\x92\x6b\x2b\xf7\x7c\x5f\x43\xf3\xd0\x18\xd5\x4f\x88\x14\xce\x27\x4c\xe5\xbc\x9f\xb9\x3f\x02\x98\x78\xab\xbf\x65\xa2\x0f\x35\x3b\xcc\x7f\xb4\xc3\xcc\x77\x38\x0a\x20\xfe\x50\x87\x41\xdd\x8b\xf7\xbc\xbf\x09\x21\xb0\xbc\xe0\xdd\x3b\x10\xb1\x77\x9b\xf7\x07\x73\x6a\x9d\x28\x4b\x49\x14\xd3\xe0\x57\x52\x6b\x51\x29\x80\x3c\x8e\xd0\x09\x75\x45\xf4\x07\xd0\xe4\xbd\xa8\x72\x1e\x31\xeb\x88\xfc\x4e\x94\x35\x98\x63\xc0\x15\x76\x67\xe7\x73\xad\x4b\x59\x0b\x10\x06\xeb\x8d\x2c\x0d\x01\x6c\xdf\x20\x22\x26\xa8\x7d\xe9\x99\x72\x5a\x22\xf3\xba\xba\xf7\x00\xce\xbc\x25\xbe\x08\x66\x9c\x2a\xe4\xa1\x59\x89\xaa\x55\xbb\x13\xd8\xa5\xd3\x40\x19\x6e\xe8\xa7\x8f\x8b\xc7\xe3\x62\x0f\x8e\x2b\x8b\x55\x6c\xab\xca\x82\xdb\xcc\xf3\x49\x52\x61\x8b\x7b\x95\xc5\xaf\xee\xb3\xd7\xe2\x49\x6a\xcd\x08\x86\xec\x68\x03\x07\x79\x99\x3d\x72\x6d\x63\x0a\xc2\x30\xcd\x4a\x48\xec\x91\xb0\xb1\x89\x7f\x54\xb8\x0d\x18\xe1\xf2\x59\x91\xb0\xd9\x56\x66\x4b\x0c\xa9\xb1\xbc\xca\xe2\xeb\x85\xd9\x85\x68\x22\x66\x07\xda\x12\x9f\xf8\x41\x93\x97\xc5\x66\x05\x1d\x2c\x34\x3b\xec\x02\xe0\x0e\x00\x23\xb1\x92\x44\xd4\xa0\xca\x25\x92\x9d\xd6\xfb\x80\x77\x31\x50\xc7\x0f\xec\xce\x34\x72\x9b\xeb\x72\xb7\xce\x98\x5a\x44\xc6\x61\x9f\xab\x05\x37\x5b\x74\x15\x67\x2e\x60\xa2\xba\x1b\xa2\xbf\x7a\x13\x36\xf0\x55\x88\x32\xc2\x7b\x86\x93\x80\x78\xd5\xfc\x40\x0e\x96\x83\x0c\x92\xa3\x35\x48\x0f\xe5\x02\xbc\x99\x0b\xc9\xa9\x72\xc9\xd0\x1f\x9a\xf1\xdf\xf4\xb6\x2a\x45\x81\x71\xdb\x18\x4b\x31\x05\x10\xbf\xc6\xd6\x7b\x10\x49\x72\xdd\x79\x66\x5a\xe8\xc4\x59\x10\xd7\x0e\x01\x57\x57\xf6\x44\xc5\x09\xbd\x30\xe3\x14\xcb\x8c\xa7\x12\xb9\x97\x80\x17\x27\x0c\x88\x22\x6a\x70\x13\xa8\xba\x48\x8f\x71\x34\x95\xef\x28\xd2\x95\x8a\xc8\x80\xf8\xcc\x12\x69\x09\xea\xe0\x64\x1c\x28\x32\x40\x24\x79\x89\xeb\x08\x33\x0c\x1d\xe3\xa8\x14\xd4\x03\xe5\xa2\x56\x40\x1b\x17\xba\x7e\x3b\x19\xf3\xe8\x0a\xf4\xaa\x8d\x6c\xed\x4a\xee\xc9\x1b\xb1\xa8\xaf\x8d\xe6\xfd\x19\x43\x3b\x18\xc1\xbb\xeb\xb7\xf0\x28\xbd\x80\x3d\x98\xf5\xb3\x66\x78\x2f\xbd\x5d\xac\x26\x8c\xd2\xdf\x59\xc3\x2e\xe8\xe8\x4b\x5f\xa3\xec\x95\xe4\xea\x60\xb4\x9b\x7a\x1f\x2a\x59\xce\x57\x89\x25\xdc\xf0\xd9\x35\xb6\x2e\x9a\xb7\xbd\x29\x20\xed\x6f\x0a\xb1\x63\x3e\x73\xdb\x1b\xb4\x7b\x5e\x85\xf4\xbd\x95\xaf\x51\x4c\xf1\xf2\x94\x89\x4c\x9a\x79\xdf\xd9\x93\xca\xda\xea\x56\xfa\x91\x7e\x52\xee\x92\xbd\x06\xd7\xce\x3b\x2f\x36\x33\xbe\xc2\x64\x78\x5c\xf7\x76\x2c\x3a\xba\x3c\x13\x99\x85\x08\xdf\x7c\xad\x4a\xb5\xde\xae\x89\xa5\x14\xbb\x09\xf9\x12\x62\xb3\x91\xa2\xc2\x13\xef\xfe\x00\x07\x0b\x24\x93\x4b\xfd\xb0\x76\x77\x5a\x61\xb9\xef\x7b\xd4\xa0\x01\xba\x11\x40\x0b\x07\x0d\x0a\xdf\x32\x6e\x8a\x8c\x0f\xb0\xbb\x0b\xd6\x93\x74\x89\x18\x62\x1e\x88\xf0\x24\x73\x2f\xa5\xc0\xf1\x5d\xdd\x7b\x38\x8f\xca\xaa\xd9\x1e\x47\xda\x55\x29\x3c\xb2\x68\x5d\xc9\x4c\x91\xd4\x71\x2b\x41\xc3\x70\x68\xd1\x84\x36\x6f\x0f\xc3\x2c\x89\xe1\x00\x72\xdf\xde\xa8\x08\x5d\x30\x41\x67\x2f\xd4\x5c\x11\xa7\x92\xfc\xe6\xff\x8f\x98\x70\x09\x5d\x15\xbd\xcf\x8d\x3b\x32\x63\x24\x4d\xcd\x4a\x6d\x30\x9c\x94\xeb\xca\x48\x07\x6a\xdc\x21\xbb\xb3\xc8\x9a\x47\x29\x1e\xf3\x05\x5c\x3b\x76\x81\x66\x8a\x8a\x5e\x38\x82\x54\x18\x5b\xe3\x84\x66\x3e\x34\x8b\xa9\x4f\x98\x2b\x94\x31\x1f\x49\x82\x9a\x5f\x5f\x01\xdc\x84\xf2\xfe\xa1\x3e\x0e\x22\xff\xcf\xfe\xed\xf0\x16\x1c\xfd\x97\xba\x3c\xbc\x17\xea\x0e\x4e\xdd\xa9\x5e\x6f\xb6\x85\xd1\xd5\xce\xdb\xac\xd3\xf9\x4a\xae\xa5\x19\x20\x57\xad\x5d\xff\x98\x95\x2d\xb0\xcc\xb1\xc4\x77\x43\x19\x4c\xe4\xa1\xc5\xb4\x1a\x4c\xe4\x01\xe7\x62\x2d\xea\x2d\x10\xd5\x23\x4e\xb6\xfb\x66\x90\xaf\x06\xbe\xea\xd0\xfb\x67\x92\xdb\x2e\xba\x34\x15\x3f\x03\xe4\x68\x31\x4e\x1f\x22\x18\xf5\x66\x2f\x88\xed\xca\x77\x65\x41\x7a\x8e\x57\x8f\x53\x8c\xeb\x86\x86\xdc\xde\xa4\xef\x18\x53\x6a\xc0\x3f\xff\x0e\xb3\x06\xa7\xfb\xf7\x9a\x35\x8e\xb3\xc6\x28\xbb\xe7\x1f\x99\x32\x9e\x4e\x19\xfb\x47\xa7\x8c\x38\x3e\xaa\x60\x0d\x3b\xe5\xc1\x39\xe8\x68\x59\x82\x94\xc1\x93\x44\xec\x47\x31\x62\x3d\xe4\x1f\x96\xba\x8c\x0d\x0c\x13\x21\x36\xa4\x08\xe2\x2f\x1d\xa7\x77\x68\x00\x26\xc6\xf0\xae\x0d\xcb\xfe\xb1\xa9\x77\xde\x57\x65\xf7\xc7\x5f\x74\xb1\x2d\xc1\x12\x68\xed\x8a\x9b\xbd\x4b\xb2\xbf\x43\x01\x78\x3e\x09\x5d\x5a\x91\xa0\x62\x1a\x69\x8f\x53\xe1\x3f\x80\xe9\xb2\x10\x38\x65\xc4\xcf\x87\xb7\x95\xed\xb7\x9e\x43\xac\x1f\x1d\xff\xb9\xbd\x26\x4d\x2d\x2b\xc3\xef\x7c\xef\x9b\x83\x34\x19\xbf\x53\x82\xd8\xc4\xf1\xf5\x2c\x98\xc0\x3f\xba\x43\x98\xb3\x30\x7f\x7c\x1b\xf0\x78\x1b\xb0\xe6\x36\x98\xf7\x31\x47\x6f\x84\xe9\xcd\x22\x6e\x8b\x28\xfb\xdb\x6c\xfd\x7e\x0e\x91\x15\x81\x54\x97\x24\xf3\x8c\x76\xdd\x6c\xc7\x3b\x08\x3e\xed\x0c\xf8\x90\x4b\xf6\x88\xe7\x2a\xc4\x95\x08\xf2\x37\xd4\x14\xe2\xe7\x9d\x26\xf1\x88\x91\x86\xd7\x3c\xa1\x59\x40\xb5\xb4\xae\xea\x8c\xaf\xad\x49\x04\x37\x16\xf8\xd3\x61\x2f\xd7\xe2\xab\xf4\x78\x15\x95\x5e\x0a\xd8\xe4\xc2\x27\x6c\xb9\x9c\x68\x16\x7b\x97\x70\x31\xee\x5d\x58\x65\x53\xc9\xdf\xb6\xb9\x82\x15\x70\x48\x74\xe9\xa5\xf5\xcc\xf0\x95\x2e\x71\x16\x2b\xb9\xd9\xd6\x94\xe4\x10\xae\x32\x3b\xff\xe4\x60\x54\xdd\x12\x13\xd4\x5a\xfe\x27\xb1\x11\x65\x0c\x81\x1d\x6f\x39\x16\xef\xb5\x4e\xd7\xb8\x95\x05\x4d\xa7\xec\x41\x3b\xe8\x10\xcd\x6d\x9f\xf9\x71\x06\x86\x43\x6b\x5e\xb8\x79\xc5\x44\x21\x9c\x5a\xfc\x77\x1c\x1d\x8a\xd0\x40\xdc\xec\x32\x9a\xdd\xef\x98\x36\x8a\x7e\x6f\xeb\x40\x9e\x12\x0c\x4c\xd0\x62\x41\xa4\x71\xa4\xad\x22\xed\xa8\x2b\x97\x36\x68\x75\xde\x31\xb5\xd8\x16\x85\xb5\xde\x89\xa4\x36\xd9\xd0\x8d\x18\xa9\x27\x10\x85\xdd\x5d\x6b\x2e\x51\x57\x27\x47\x67\x44\xd5\xe3\x57\x24\x68\x7b\x4d\x62\x87\xce\xa5\x78\x60\x19\x5c\x00\xc5\x9f\x3d\x0f\x8e\x32\x71\x0c\xc4\x2e\x73\xe5\x73\xf0\x39\xdb\x99\x3b\xf3\x0e\x69\xc6\x6e\x2f\xcf\x47\xd3\x69\x40\x58\xe0\x17\xb7\x37\xb7\xc3\xf3\xf3\x2f\x58\x99\x73\xc6\x6f\xae\x5c\x45\x0e\x71\xb0\xf3\xf1\x25\xff\x3c\x19\xdf\x00\x14\x85\xaf\xa5\xb9\xfa\xf0\x61\x34\x99\x86\x4a\x29\xa8\xe7\x82\x52\x18\x5f\xba\x35\x19\x5d\x4f\x46\xd3\xd1\x25\xb2\x66\x03\x24\x45\x8a\xf7\xe1\x48\x03\xf8\xe9\xd5\xe5\xe9\x68\x72\x39\xbe\xfc\xe8\x1b\xcc\x1c\xce\x48\xe6\xc0\x42\x32\x3e\xbd\x19\xde\xdc\xde\x00\xec\x44\x42\x5e\x1f\x41\x65\x74\x50\xb7\xb3\xf4\xa3\x37\xe3\x9b\xf3\x51\xe6\xb1\x46\xc6\x0e\x94\xe2\x31\xa0\x91\x8c\x5f\x5e\x5d\x8e\x2f\x3f\x4c\xc6\x97\x1f\x01\x76\x23\xa0\x85\xbc\x9f\x8e\xa8\x2a\xe8\x7c\x08\x65\x4a\xae\x7b\xfc\x6c\xf4\x61\x74\x7a\x33\xcd\xf8\xf0\xf4\xf4\x76\x32\x3c\x25\xf0\x0b\x3b\xb9\x30\x35\xf8\x16\x35\xc0\xae\x3e\xf0\xd1\x64\x72\x35\x99\x06\x24\x8d\xab\x09\xd4\xe1\x9d\x8d\xa7\x40\x9f\x3f\x7c\x7f\x3e\x7a\x12\x09\x3a\x8b\x48\xd0\x3f\x74\xa2\xb4\x4c\xaf\xb0\x86\x29\x3c\xb8\x87\xd6\xfc\xf5\x00\x59\x8f\xe8\x3c\x97\xfc\xdc\x53\x98\xda\x97\x47\xd7\x37\x8d\x22\xad\xc9\xe8\x7f\xdc\x8e\x27\x58\xb9\x96\x96\xa8\x65\x2c\x46\x67\xf9\x3c\x3e\x3f\x0f\x1b\x2a\x21\xfa\xff\x72\x75\xeb\x80\x46\xb0\x70\x91\xe0\x46\x1c\xd0\x8a\x83\x52\x49\xf0\x55\x12\x20\x95\x8c\x5f\xdf\x5e\x8e\xa1\x08\xef\x6a\x12\x10\x57\x7c\x11\xa0\xc3\x15\xf1\x60\x22\x69\x1d\x5c\x02\x2e\xe2\x77\x24\xc1\x10\xfa\x3e\x7f\x1a\x4e\x91\x79\x7f\x3f\xd2\x08\x6b\x11\xef\xdb\x43\xfb\xcb\x80\xdf\x58\x39\x53\x12\x26\xbb\xc0\xb8\x46\x42\x13\xd0\xa1\x34\x78\xf2\x1a\xb4\xdc\x6b\x6a\x02\xc0\x8f\x34\xe4\xd9\x5a\x8d\x08\x3d\xf3\xf6\x5e\x98\x55\x50\xac\x91\x2a\x22\xfb\x62\x13\x21\xc9\x3e\x4e\xae\xa7\xc4\x42\x60\xbd\xa3\x14\xc0\xfd\x17\x6f\x08\xfb\x74\x19\xb6\xde\x7f\xe1\xcb\x34\xa0\x5d\xac\x77\x71\x04\xb0\x61\x50\x11\xf2\x18\xe8\xc9\x51\x15\x00\x8b\xb3\xff\x2b\xb9\x16\x0a\xee\x6a\x2b\xc9\x23\x7e\x19\xe7\x29\xb6\x57\xa9\x6b\x7e\xe0\x79\x5e\xf8\x71\xc6\x4f\x32\xf6\x2a\xe3\xaf\x33\xfe\x0b\xa2\x7d\xfd\x8a\x5d\x33\xdb\xea\x4e\xdd\x85\x58\x27\x2d\x53\x47\xc5\xc3\xac\x95\xdf\x83\x66\x7f\x57\x96\x4f\x46\xc9\xdf\x69\xdc\x9a\x7c\xe1\x2c\x4d\xd6\xe1\x4f\x4d\xd6\x71\x9a\xaf\x55\x4b\xfa\x90\x7f\x65\x07\x6d\x6a\x51\x42\x86\x9b\xef\x51\xf6\x98\xb6\x5d\xc9\x42\x8a\x28\x1a\x4a\x2b\x88\x64\x09\xf6\x5e\xf4\xe1\x52\xdc\x3e\xe0\x26\x34\xb5\xde\x44\x58\x66\xe4\xa1\x43\xa7\x75\x60\x95\xeb\xf0\x61\xb1\x34\xcd\x46\xb6\x0a\x78\xa0\x8b\x90\xad\xad\xea\x55\x5e\x89\xfb\xc6\x3d\x19\xd7\x0a\x86\xae\xd9\x46\x9d\x13\x1e\x3c\xfd\x2a\x0a\x1d\x81\xda\x92\xb5\x14\xf0\xc6\x81\x60\x81\x65\x04\x0f\x61\x12\x57\x27\x97\x98\x2a\xb7\xd2\x6f\x38\xa0\xcc\x77\x64\xbc\x76\x27\x90\x7b\x35\x6c\x64\x16\xb2\xa4\x1c\xd1\x08\xe7\xfc\xd7\x01\xbf\x50\x66\x2e\x8b\x42\x94\x52\x6f\xb1\x48\x74\xe4\x29\x74\x9f\x16\xe7\x0d\x61\x8b\xd8\xe3\xc7\x52\xcd\xdd\x2e\xa1\x0f\x8f\x86\x48\xab\x88\x13\xbd\xa2\xcc\x05\xf4\xd3\x88\xb5\x2b\x79\x68\x24\xab\x09\xd3\xb9\x91\x29\x8e\xd6\x3e\xf8\x78\x4c\xbe\x6b\x60\x0d\x5f\x70\x63\x24\xec\xf1\x91\xa4\xee\xda\xd6\x90\x1a\x27\x93\xfd\xc0\x90\x30\xb8\x44\x05\x1e\x0e\xb0\xad\x59\x1b\x62\x1c\x44\x08\x62\xb9\xc9\x12\xf6\x4a\xc4\xf2\x15\x8e\x34\x43\x83\xa9\x8e\x69\x6c\x71\x3b\xd9\x9e\x41\x23\xbe\xec\x89\x5a\x69\xe4\x50\x58\x29\x98\x43\xce\x01\xdb\x2b\xe6\x71\x53\x3b\x7f\xdc\x62\x5b\x61\x1a\xe3\xdc\xa5\xa6\x82\x97\x93\x82\x32\x2e\xc3\x01\x4c\x93\xb5\x2c\x6b\x2a\x22\x09\xe3\xf5\xcc\xa0\xc0\x40\xb9\x0e\x49\x3d\xce\xd7\x4c\x01\x0d\x9f\x9c\xc4\x92\xa4\xa6\xd0\x10\xce\x11\x1c\xa1\x30\x45\x58\xcd\x76\xa9\x91\x3b\x4f\x57\x0f\x4c\xb4\xef\x08\x59\x28\xe8\xf8\x21\x14\x49\xba\x05\x81\x81\x5f\xba\x75\x8d\x43\x20\xf0\x74\x85\x8e\x0d\x78\x24\xb4\x17\xd9\xc3\xb6\x31\xa3\x96\x25\xf2\x04\xba\x89\xda\x39\x4c\x9b\x95\xa8\x96\x0e\xe1\xb1\xbb\x55\x34\xbe\x93\x6b\x3e\x2e\x64\x04\xff\x05\x94\x68\x72\x3f\xe3\x9e\xcf\x3f\x5e\x17\x08\xe6\x84\x7c\xfd\x70\x72\x0b\x47\xe9\x6e\xef\x14\x70\xb1\x54\xc8\x7c\x54\x6a\xdc\x6e\xee\x5a\x30\x59\xf8\x84\xc1\xec\xdb\xc4\x80\x68\x96\x04\x84\x4f\x80\x68\xf6\xc4\xec\xf8\x9d\x10\x80\x02\x26\x7c\x72\x57\xce\x20\xc9\x99\xf2\xa2\x5d\x11\x9d\x28\x62\x46\x20\x4c\x67\x17\x3b\x0a\x18\xb8\x18\x48\x9a\x38\xee\x34\x8a\xc6\xcc\x39\x07\xf9\x4c\x06\x12\xb4\xd8\xcd\xbc\xde\xc2\x5d\xea\xbc\xca\x7e\xb8\x2c\x49\x27\x21\xcb\xd2\x36\x0f\x35\x62\x37\x7b\xfc\x34\x01\x0b\xb4\x51\x0f\x0c\x01\x33\x59\xce\x31\xd5\xad\x51\x91\x61\xa7\x3f\xaf\xc4\x02\x9a\x71\xc1\x58\x7f\xe3\x28\x48\xbb\xf1\xe7\xf7\xbd\xac\x4a\xc9\x4f\x75\x79\x67\x37\x41\x14\x74\xb8\x0e\xb9\xc8\x7a\xc1\xcf\xa3\xa2\x35\x3e\x74\xf5\x24\x98\xec\x7f\x60\xcd\xdd\x35\x86\xee\xb5\xb5\xf9\x37\x35\x51\x48\xfc\x9a\xf1\xe3\x37\xbf\xbc\xe9\xa3\x0a\x32\xd1\x6b\xc9\xa2\x2f\xe9\x05\x3f\x7e\xf3\xfa\x18\xff\xf8\x79\x7c\x7d\x15\xd1\x02\xdd\x54\x52\xa0\x90\x39\x7e\xf3\xe6\x75\xf4\xc8\x75\x94\xbb\x0f\x37\xc4\x75\xa8\xaa\x4e\x5f\xf2\x73\x77\x5b\xda\x13\x61\x80\xd1\xc8\xb5\x1f\x75\xe3\x00\x52\x39\x20\x41\x92\xe9\x92\xff\x69\x5b\xec\xf8\xc9\x4b\xe8\xf9\x31\x46\xd7\x8c\x8c\xe9\xe0\x1a\x4b\x01\x8e\x1c\xba\x81\x49\x29\xb2\x3a\xcd\x9d\x28\x6b\x16\x3b\x52\xd2\x62\xe9\xf3\x44\xab\x01\x46\x44\xbd\x25\x95\x68\x26\x9d\x38\xca\x09\x42\x0a\x54\x2a\x17\x1d\xad\xec\x01\xd1\x70\xa0\x1a\xf4\x63\xf6\xef\x3e\xb8\x17\xa9\x70\xc0\x55\x8c\x73\x13\x5e\x70\xe1\xa3\x3d\x6e\x06\x4f\x63\x0e\x87\x57\x54\x76\xdc\xaa\x86\x18\x46\xd7\x4e\x65\x9d\x4a\x62\x21\xee\x03\x04\x43\x74\x18\xa3\xdc\xce\xb6\x5f\x92\xf9\x3b\x03\x4b\x50\x5a\xaf\x21\x2b\x52\xe4\x12\x8a\x2b\xce\xa3\xc9\x7d\xc7\x9a\xb7\x22\x82\x67\xc5\xf5\x00\x51\x76\x99\xbb\x85\xc9\xcd\x97\x44\xca\xd2\xfb\x72\xc0\x58\x0b\x52\x07\x79\xac\x3a\xfe\x40\x9f\x15\x41\x6c\xb7\x2f\xc6\x35\x64\x6e\x97\xda\x25\xed\xed\xa0\x02\xd3\x68\x50\x59\xf7\x64\xa1\x60\xea\x60\xeb\x73\x71\x29\x7a\xa1\x5c\xbe\x06\x86\xc9\x20\x1b\x8b\x92\x20\x50\xe6\x61\xfd\x6c\xbd\x92\x1a\x11\x8d\xe1\x97\xb9\x80\x72\x94\xa8\x0f\xd9\xc3\xb5\x25\xf6\xa5\x25\x82\x87\x65\x0e\x67\x0e\x5e\x81\x18\x3a\xd6\x94\xc1\x65\x04\xd0\xb1\x4a\x14\xfe\x13\x54\x4e\xd1\x18\xa3\x9b\x23\x87\x29\xdb\x34\x2f\xd0\x7d\xa6\x2b\xb9\xd4\xf0\x7f\xf7\x9a\x1f\x9c\xf4\x39\xdc\xb2\x00\xb5\xc0\xd4\xa2\x3d\x33\xab\x84\x5c\x37\x54\x60\x3b\x4f\x2f\x29\x63\x5e\x42\x07\xc6\x56\xe6\xd5\x23\x30\x1c\xa3\xec\x64\x08\x6f\xcc\x0a\xb5\x0c\x35\x31\xee\xfd\x01\x63\xe4\xf0\x76\x12\xd5\xa5\xfd\x46\xe1\x5c\xca\x5e\x87\x51\x34\xaa\xc3\x44\x54\x47\xa4\x0c\xf3\x97\x6c\x44\xc8\x77\x7a\x7d\x9e\xb5\xc7\xe9\xb3\x2a\x30\x30\xad\xfe\x2e\x7d\xfe\xc2\x6c\x47\x0e\x6e\x46\xbb\x80\x2c\x73\x8f\x3a\xda\x6b\xb6\xd6\x73\xa9\x49\xe0\x8f\x96\x79\x8c\x50\x5a\xf1\x42\x2f\xb5\xbd\x1d\x3a\x76\x61\xb8\x12\xd3\x38\xab\x53\x75\x3a\xde\x1a\xb0\xa1\xdd\x9f\x21\x9c\xe4\x4c\x1f\x54\x88\x9a\x06\x76\xf3\xf5\x67\xf6\x6b\xe5\xe1\x7c\x5b\x81\xdd\x18\x3a\xba\x35\x40\xed\xb9\x55\xb9\x2c\x54\x49\x81\x64\x0a\x28\xb8\xc2\x7b\xb8\xb9\x54\x6d\xf8\xbd\x9c\x19\xd5\xa8\x8c\x60\x0d\x68\x3f\xf0\x73\xb8\xe4\xab\x0e\xc8\xe6\x07\x12\x01\x50\x24\x85\xbe\x45\x19\xdf\x61\xe1\xb0\xbe\x30\x24\x2f\x44\xea\x7f\x6b\xa6\x69\x1c\x00\xd7\x3d\x47\x8e\x57\xbe\xaa\xeb\xcd\xdb\xe7\xcf\xe7\xf4\xec\x9c\xa6\x57\x57\xcb\xe7\x3f\xd1\xfc\xfe\x0b\xfe\x0c\x9e\xe7\x56\xd1\x06\x42\xec\xbf\x7d\xbc\x3e\x3f\x3c\x19\x1c\x1d\xda\x33\x74\x38\x2f\x84\x31\x1b\x51\xaf\x02\x38\xec\x0f\xc2\x03\x3e\x86\xff\xfa\xcb\xf1\xeb\x14\xff\xef\xe4\xf8\xf5\xab\xd7\x3f\xf1\xff\xfe\x88\x1f\x55\x42\xd2\xce\xc7\xeb\x73\x7e\x77\x12\x5c\x16\xf2\x5b\x0d\x97\x1c\x63\xa7\x76\x1b\xf0\x6b\x01\xdc\xcd\xb4\x0f\x18\x3b\x57\xe5\x57\xbc\x6d\xe1\x2e\x9e\x81\xfe\x6f\x6a\xe7\xee\x85\x14\xdd\x5d\x29\xd6\xf4\xbf\x11\xa2\xeb\x5a\xe7\x5b\x40\x94\xb5\xf2\xc9\xb6\xc1\x84\xe3\xa8\xcc\xbb\xa0\x49\xa9\x71\xab\x6c\x6f\xc9\x5f\xb9\xbf\x5e\x51\xb2\xfd\x60\xa5\xc4\x93\x6d\x1b\x00\xfc\x1e\xfa\xaa\x2b\xed\xde\x07\x84\x9b\xa6\x1d\x3a\x5a\x82\x00\x90\x8f\x43\x5f\x5a\xb9\xbb\xd3\xdb\x28\x57\xc8\x6a\xe5\x80\x68\x9b\x3c\x08\x33\x11\xe3\x11\xb9\xf9\x88\x31\x6e\x4b\x2e\xbf\xc9\xf9\xb6\x76\x19\xe9\x4b\x51\xe5\x85\x34\xa6\x01\xa8\x9f\x54\x23\x00\xee\x47\xab\xd9\xcc\x15\x81\x74\xe0\x74\x63\x72\x90\x47\xc3\x0d\x9f\x74\x7a\x84\x6b\x1d\xe8\x7c\xe7\x2b\x0d\x79\xa9\x69\x55\xa2\x1d\xb2\x28\x8c\x66\x6b\x29\xeb\x0c\xd4\x19\x70\xef\xdb\x81\xcb\xbc\xa3\x47\x8f\xaf\x60\xa4\x6b\xa3\x35\x0e\xef\x0d\xf8\xb0\xec\x68\x8e\xd2\x28\xf0\xdf\x3e\x1f\x01\x19\x7f\x01\x4b\x0d\x8d\x75\x5d\xed\xdb\x55\x44\x13\x4c\xc1\xf7\xf8\x6f\x99\xa7\x8e\x07\x97\x51\x8e\xd7\x73\x80\xdc\xad\x75\x07\x35\xb2\x0c\x6f\xff\xff\xec\xbd\xdb\x72\x1b\xc9\x96\x25\xf8\xee\x5f\xe1\x46\xb3\xb1\x24\xc7\x82\x48\x51\xa9\xd4\xa9\x4c\x8d\x8d\x19\x44\x42\x12\xaa\x29\x82\x05\x80\x99\x47\xf3\xd2\xe3\x00\x1c\x64\x94\x02\x11\xe8\xf0\x00\x29\xd4\xc3\x58\xff\x43\xff\x61\x7f\xc9\x98\xef\x8b\xfb\xf6\x88\x00\x48\x65\x9f\x73\xaa\xad\x2a\xf5\x90\x29\x91\x40\x84\xdf\x7d\x5f\xd6\x5a\x7b\xb1\xa3\xe1\xa9\xb1\xa0\x2a\xd9\x82\xe0\x5d\xa8\x55\xa5\x5d\xd5\x2e\x52\xcc\x25\x9e\xe1\x97\x59\xac\x59\x9c\xbc\x36\x94\x0c\x41\xeb\x42\xd6\x29\xfe\x23\x17\xf8\xe0\xc7\x0f\xb5\xb5\x50\xd0\xf6\xdf\xa9\xfe\xcf\x9b\xd7\xaf\xbb\xfa\xaf\x6f\x7e\xfe\xb3\xfe\xe7\x3f\xe4\x4f\x98\xfd\xf6\x69\x79\xae\xb9\xfa\xcf\xc5\xe0\x55\x8f\x7e\xe4\x40\xa9\x8b\xc1\x05\x08\xe6\x85\x6a\xec\xac\x4a\x00\x47\x00\x29\x85\x20\x61\x18\xd8\x3a\x8e\x9c\x3d\x3a\x7f\x42\xf8\x9f\x55\xe3\xfc\xf1\x96\x96\x8f\xf6\xef\x78\x9d\xbe\x83\x9b\x25\x65\x93\xc4\x49\xde\x5b\x04\x3b\x43\x47\x43\x25\x0f\xc7\x72\x32\xa0\xad\x22\x1e\x1f\xc3\x6a\xe9\x87\xc1\xcc\x5f\x50\x77\x20\xec\xb9\xdc\x15\xa6\x96\xb5\xe8\xa1\xb5\x3f\x41\x6b\x63\xa5\x65\xd9\xcc\xb4\x7a\x76\xd5\xaa\x95\xcd\x44\x44\xd1\x19\xd5\x5b\x70\xdf\x37\x30\xf9\x26\xc4\xf9\x50\x02\xcf\x24\xf2\x4f\x5c\xe2\x59\x53\x89\x67\x68\xe1\x9b\x81\x3e\x19\x45\xfd\x84\x2b\x59\xc7\xe9\xb3\x5d\x3e\x98\x32\x77\x9b\xa8\x7d\xb8\xe1\x1f\xb1\x1b\x5f\xec\xb5\x59\xfa\xd3\xc8\xae\x38\x4e\x14\xca\x3d\xad\xec\xa3\x2d\xaa\x2d\x1c\x4f\x14\x33\x6d\xf6\xc1\xc9\x15\xaa\x0d\xac\x15\xc7\x72\x39\x01\x1c\x7b\x31\xf8\xd9\xb7\x2f\xdc\x45\xdc\x90\xa4\x7a\x35\x45\x65\x51\x13\x22\xca\x1f\x8a\x8a\xe8\xd0\xd3\xb7\x03\x7d\x32\xf6\xcb\xd5\x14\xfa\x0a\x5b\x66\x0f\x28\xd0\x09\x69\x1b\xe1\xfd\x13\xd0\xbb\xf3\x8c\xbe\x12\xec\x44\x48\x90\x80\xed\x50\x59\x1d\x5a\xf3\x97\x81\x3e\x11\x75\xbc\x5b\x7a\xab\x2f\x2c\xd6\xcd\x33\xa9\x5e\x5c\xac\x3b\xc9\x10\xf1\x18\xff\x53\x90\xe4\x13\x0b\x34\xad\xdc\x74\x31\xf8\x65\xa0\x4f\x92\x75\x16\x45\x81\x62\xf8\xdc\xef\x61\x6f\xec\x41\x81\x7f\x29\xbc\xe3\x76\x0b\xd7\xb0\xf2\xa7\x6b\xea\x1d\x29\x2c\xad\x65\xe9\xfc\xce\x8e\xc0\xe4\x15\x29\xef\xa4\x67\x01\x50\x4d\x55\xba\x0e\x1c\xe7\x88\x57\xa8\x23\xe6\x6c\x4d\x32\x28\x50\xb6\x20\xd3\x86\xfb\x2c\x9f\xa5\x73\xf7\xab\x52\x43\x6f\x52\xbc\xa0\x23\xac\x7a\x89\x8c\x06\x50\xca\xa7\x02\x58\x7e\x8b\x71\x0f\x54\x98\xa9\xfe\xd6\x2b\xf5\x1e\xdf\x57\xda\x27\x7c\x08\xcb\x46\xfa\x27\xe1\x98\x4a\xb7\xbe\x33\x32\x07\x9f\x7b\x31\xb8\x78\x25\x45\x0e\xe5\xa9\x23\x17\x28\x30\xd2\x36\xdb\x5d\x03\xca\x76\xb4\x61\x61\x05\xb1\xdd\xa4\x56\xd6\x2d\xeb\x7c\x11\xa3\xa5\x2f\x5d\xe0\x7e\xf4\xd3\x13\x17\xe2\xef\xa4\x35\x4a\xe1\x2a\x08\x84\x90\x3a\x1c\xa7\xf6\xfb\x40\xc9\x14\xa1\x2a\x6a\x6b\x56\x7b\xde\x09\x38\xbe\xe9\x3a\x4f\x96\xf6\xc5\xe0\xc2\xdf\x46\xa2\xc5\x72\xa7\x6f\x21\x2b\x52\x23\x81\x70\x13\xca\xd8\xcb\xc5\xe4\x4f\x29\xf2\x48\x12\x69\x03\xd0\x08\x69\x64\x98\x13\x74\x16\xd8\x8d\x89\x73\x98\xe9\x6d\xb1\xa3\xdd\x11\x78\x4e\xa0\x8f\x5a\xaf\xcd\x92\xaa\xf5\xe3\x5a\xa3\xd5\xe9\x47\x7b\xdb\xd0\x4d\x04\x46\x7a\xd9\xd4\x55\x91\xe8\x89\x21\x25\xc5\x35\xa6\x28\xc2\x9d\x60\x4a\x3d\x12\x0e\x02\xa4\xda\xb9\x5a\x9c\x2c\x49\x11\x90\x12\x39\x09\xd4\x99\x3a\x07\x71\x47\x73\xef\x1b\xdc\xa8\xe3\x5b\x91\x54\xf5\x6c\x51\xa0\x70\x44\x26\xe2\x5c\xe9\x01\x85\xe9\x5d\x71\x17\xfe\xe0\xc8\x61\xc0\x04\x96\x5c\x47\x2c\x73\x59\x92\x70\x1a\xa9\xc4\x81\x5a\xc3\xf2\x21\x7f\x34\x85\x42\x79\x40\x49\xce\x94\x98\x49\xbd\xb2\xfc\x3d\x42\x73\xae\xec\x39\x7e\x17\xc1\xd3\xb4\xb6\x73\xa7\x9f\xf2\x95\x2d\xf6\x42\xd0\x6a\x0d\x68\x4c\x4a\x8d\xe2\xaa\x79\xfd\x8c\xe2\x99\x49\x95\x24\x0f\x28\x9f\x65\x04\x49\xd8\x6c\x8b\x3d\x87\xc2\x61\xa1\xb4\x10\x4e\x59\x47\x7c\xc0\xe8\xf5\x0e\x8e\xc6\xe8\x48\xb4\x93\x13\x6e\xd7\x41\xd0\xbf\xf5\xb6\xd7\x87\x54\xe6\x12\xf0\xe8\xd8\x17\xce\xac\x40\x58\x3f\x68\x60\xe2\x15\x03\x6b\xcc\x1b\x0d\x8e\xff\x51\xc0\x8e\x62\x74\x0a\xcb\x0b\x6d\x36\xa0\xa4\x82\x4b\x12\x32\xbc\x90\xf3\xfc\x00\x32\x62\x2d\x51\xda\xb8\xb6\x33\x7d\x42\xdf\xe1\x11\x3d\x35\x48\x3b\xdc\x56\x4f\x20\x20\x0a\xd4\x5d\x55\x21\x64\xde\xff\x1d\x60\xab\xb1\x40\x0b\xfe\x90\xa6\x76\x63\x4a\x13\x75\x88\x11\x99\x43\x94\x4b\x42\xde\xab\xc5\x1e\x5b\x69\x96\xa9\x02\x29\xf4\x07\x10\xad\x2c\x46\x8b\x17\xc3\xba\x81\x48\xf2\xd2\x3f\xf3\xf4\xe7\x57\xff\xc7\x19\x8b\xfc\xb0\xb9\x55\xed\x9a\x90\x4e\x70\x0f\xa6\x46\xc3\x75\x61\x4b\xbb\x46\x64\x70\xf2\x40\xd1\x26\xbc\x61\x5f\x0f\x92\xf5\xde\xbe\x7d\x5f\xfb\x99\xf3\x9b\xa2\x6b\x56\xa0\x3c\x13\xaa\xbd\x74\x7f\x7b\x50\x77\xe9\xfc\x59\xe1\x25\x76\xaa\x33\xed\x24\x34\x2c\xaf\x57\x94\xf3\x49\x54\x9c\xfd\x4e\xb3\xfe\xa7\x80\xd0\xf5\x77\x25\x4c\x61\xe5\xcf\xa9\x2c\x96\xb4\x64\xc8\xba\x9f\x52\xb7\x2d\xcc\x3e\x08\x7e\x67\x52\xcb\xa2\x27\xe8\x90\x9e\x35\xa7\x3d\xf6\xcd\x99\x6e\x6b\x68\xb6\x2c\xde\xaa\x56\x12\x7b\xaf\x85\x65\x05\x7c\x0f\xa5\xfc\xcc\xe3\x52\xde\x1a\xbc\xc0\xcb\x0a\x74\xb2\xa2\xf6\x8d\x9f\xc7\x55\x70\x4a\x78\x1f\x74\x87\x3e\x63\x90\x48\x86\x59\x1e\xef\x0c\x60\x61\x49\x48\xfa\xfa\x03\xf2\xf4\xe4\x0e\xd2\xe9\xf6\xe4\xac\xe7\x38\x95\x5d\x54\xdc\x45\x0c\x11\xb8\xaa\xb0\xc5\xbe\x45\xb7\x4d\xa1\x68\xd8\x7e\xb4\x76\x02\x9a\x3b\x01\xb0\xa4\x98\x6f\x6a\xc9\x33\xed\x88\x43\x4d\xa5\x47\x75\x53\xc1\x71\x71\x0f\xce\x5a\x9d\xb4\x85\x52\x09\x89\xa4\x0f\xbf\x86\x21\x3b\xc9\x0c\x29\xe4\xe4\xb0\x27\xe3\xc4\xf2\x7f\x3d\x90\x37\x45\x58\xf4\x80\xc6\x92\xbf\xf8\x8f\xb3\xde\x53\x3f\x8f\x65\xa1\x17\x34\xbd\xb2\xcf\xfd\x13\x44\x89\x39\xb0\x06\x84\x4e\xba\x5e\x18\x97\xbb\x4c\x46\x57\x5b\xbb\xc4\x74\x3d\x09\xda\x35\xea\x6f\xbe\x6b\x12\x27\xba\xa9\x94\x5c\x85\x3d\xfe\x7b\x7f\x57\x0f\xef\x09\xf5\x3d\x7b\xa2\xcb\x83\x10\xad\x51\xdf\xd1\x9a\xb8\x35\xf4\x81\xad\xa1\xbe\x7b\x6b\xe8\xde\xad\xf1\xd3\x20\x75\xc5\x27\x31\x75\x1c\xf6\xce\x4f\xfe\xea\x18\x22\xde\x80\x83\x1d\xb2\x24\x58\x7b\xa5\xe1\x8d\x2f\xe4\x52\x10\x22\x2b\x7e\x1c\x82\x31\x10\xa6\x64\xf3\x5a\x1d\x73\x23\x7b\x12\xfe\x52\x5f\x9a\x0d\x14\xd8\xe7\xf3\x07\xab\xe4\x5d\x28\x62\xa5\xc9\xba\xa4\x31\x94\x35\x24\xfb\xd4\xaa\x3a\x4a\xd7\xfd\xe6\x53\xfa\x99\xe0\x21\x26\x06\x94\x7a\x3b\xb8\xc8\x18\x69\x75\x40\xf0\xea\x45\x0a\x56\xd8\x3d\x74\x4f\xfc\xa3\x62\x1f\xbe\x43\xb4\xca\xff\x43\x8c\x13\x07\x74\xe9\x1e\x28\x80\xfb\x27\x14\x29\x5d\x1b\x9d\x73\xa8\xef\x24\xb1\x18\x50\xa9\xee\x07\x36\x5a\x03\x82\x21\x14\xb4\x8b\xca\x4c\x61\x20\x4a\x89\xb0\xe1\xd8\x80\x82\x9e\x30\xd4\xa2\x0b\xc1\x49\x9c\xc8\xc0\x2c\x1a\xfc\x2c\x56\xf1\xeb\x81\x1e\xa2\x49\x1e\xf0\xa2\x69\xec\xc6\x3b\xca\x89\xc7\xfe\x3d\x2b\x19\x26\x93\x44\x90\x54\x52\x74\x4f\x2e\x45\xf0\x03\x9f\xa9\x1f\xc0\xa1\x0a\x04\xeb\x2a\x00\xeb\x92\x56\x9d\x4b\x9d\xb0\x38\x03\xb5\x7e\x04\x2d\xbb\x10\x24\xd3\x07\x82\x6d\x2a\x04\xdb\xe8\x74\xa9\x4a\x44\x97\x3f\x60\x58\x9f\x8a\x06\xf6\xbe\x25\xf4\x0a\x4f\xed\x7c\xdd\xae\x30\xe8\xdb\xf0\x6c\x90\x2f\xe3\x1a\xe5\x40\x56\x08\x5f\x46\x5e\x31\x2b\x1f\x34\x4f\xb6\x78\xb4\xfa\xf4\xe2\xf5\x99\xde\x54\x65\xf3\xe0\x34\x5e\x03\x60\xaa\xfb\xa9\xc8\xfd\xd6\x01\x8b\xa9\xf0\xbb\x78\xe9\x47\x29\x3c\x0c\x94\x54\xc3\xc3\x5c\xfe\x4d\x9f\xbe\x6d\x3d\xc8\xc8\xda\xd1\xc9\x4a\x4e\x42\xad\xc9\x82\x50\xa9\xae\x4d\xa2\x58\x8c\x0c\xe6\xb0\xe4\x07\x41\x7d\x06\xc1\x71\x2e\x67\x47\xd0\x96\x6e\x57\x23\x25\x81\x42\x14\x7d\x67\x15\x0e\x8f\x13\xef\xb0\x8f\xb6\x64\xa5\x99\xe7\x27\x17\x12\x9d\x39\x84\x08\x38\xde\x2c\x2c\x11\xb1\x2b\xfc\x0d\x60\x31\x24\x40\x23\xd0\x0e\xf5\x84\xa3\x0a\x9d\x25\xef\x5e\x26\xc7\x68\xd8\x11\xfb\x74\x47\x50\x68\x01\x6b\xb6\xaf\xf3\x22\xd6\x88\xe7\x6d\xcc\x8a\x9e\x5f\x78\xdd\x45\x81\x52\x18\x9c\xe4\x35\x1c\x21\xf7\xb3\xaf\x08\x12\x87\x0f\xe8\x95\x0f\x8c\xc2\x19\x31\x77\x15\x46\x3c\x99\x54\x70\x24\x6b\x24\xc8\xa3\x17\x88\xa9\x64\x76\x14\x0b\xe6\x34\xa7\x56\x6d\x08\x14\xd0\xb5\x45\xf6\xbb\x8a\xae\x53\xac\xf7\xc4\x1d\x96\xb2\x43\xbd\xf1\x5d\xf6\x5a\xc5\xf9\x8e\xf7\x85\xb7\x90\x28\x00\x4d\x21\x31\xf8\xd7\x81\xc3\x80\xb1\x51\x49\x51\xfe\x58\x44\x0a\x6e\x0c\x3a\x30\x05\x4b\x00\xfc\x58\xe9\x64\xb6\xa3\x55\x62\xd9\xbc\x19\xe8\xb1\xb4\x66\x6f\xd9\x9a\xfd\x0c\x20\x54\xc7\x9f\xd4\x1a\xfa\x34\x87\xb5\x77\x0b\x56\xf0\x25\xd8\xbb\x03\xa5\x48\x93\x0a\x9c\x9b\xaf\x65\xf5\x54\xd8\xd5\xbd\xe5\x62\x53\x68\x31\xa3\x6d\x8c\xe1\x91\x3e\xdb\x99\xa9\x3f\x4a\xec\x58\xae\x03\x6b\x0a\xe2\x09\x2c\xd9\x09\xc9\x1b\x47\xf8\x63\x3c\xdf\xbb\x71\xc0\xb3\x4c\xed\xbb\x6b\x09\x80\x09\x10\x3e\x0d\x60\xc7\x34\xe0\x25\xce\x39\x90\x39\x5a\xe9\x13\x60\xeb\x9d\x50\xb1\x02\x1e\x6c\x4a\x1c\xf9\x4e\x85\xf5\x8c\x1d\xc5\x18\xa0\xf8\x35\x08\x9e\xaf\xbd\xeb\xef\x57\xee\xca\x36\x26\x2f\xc8\x1a\x15\x7c\x0f\x40\xa3\xf9\xb1\xc3\x03\x9c\xb7\xdc\xb2\x09\x59\xde\x6a\x01\x3b\x10\x8e\xa7\x38\xc8\x70\x06\x92\xc0\xca\x57\x8b\x7a\x0c\xc9\xd5\x17\xcf\x1d\x73\xf0\x72\x7d\x8d\x97\x37\xa2\xdd\xfd\x7e\xdb\xfa\x9d\x13\x92\xda\x96\x18\x8b\x30\x70\x24\x14\x4b\x8a\xe1\xe1\xc5\xe2\x08\x0d\xa6\x3e\xc4\xb4\x10\xdd\x28\x38\xe9\x28\x1d\x7c\xca\xd5\x3b\xfc\x26\x40\x29\x24\x19\xa3\xdb\x98\x1c\x54\xb8\x8b\xdc\x35\xde\x76\x51\xa5\x7d\x72\xf7\x75\xb5\xdb\xba\x33\x69\xb2\x2f\x4d\xe1\xd7\x0a\x51\x20\x50\xc1\x89\x60\xc9\x4f\x0f\x55\x24\xf8\x89\x0d\x80\xb6\x16\x4c\x40\x69\x9f\xc4\x50\x86\x3b\x01\x47\x1a\xc4\xf7\xe2\xda\x5f\x9c\x25\x6e\xc8\xf0\x76\x1c\x57\x7e\xdd\xce\x0f\xc0\x05\x2e\x0c\xed\x6d\x0d\x38\xf2\x0d\x0a\x89\x73\x44\x97\xcd\xc7\xea\xc9\xef\x58\xc5\xb1\x32\xf6\x9c\x62\x79\x8c\x43\x3e\x4a\x40\x64\x63\x77\x86\xb7\x63\x40\x1d\xa0\x4e\x80\x29\x5c\x25\x44\x78\x81\xb9\x13\x05\xae\x18\xcf\x1c\x26\x56\x1c\x09\xc0\xbf\xa6\x30\x3d\x82\x8f\x93\xdb\x63\xb5\xc3\x8e\xe1\x89\x13\x0f\xb1\x18\xce\xe7\x7c\x22\x2c\x98\xc4\xd0\x15\xd1\xfd\x56\xcd\x19\xc4\x07\xcb\x63\x2e\x24\xfe\xe4\x57\xa9\x6c\x9c\x3c\xf8\x54\x8f\x7d\x8a\x1a\x07\x88\x7d\x4d\x0e\xbe\x54\x00\x72\x95\x88\x74\xcb\x49\x3c\x75\x67\x51\xb7\xc8\xac\x56\x08\xd6\x80\x63\xdf\xb8\x34\xe7\xcb\x8e\x26\x8d\x44\xb2\xc7\x68\x4c\xd4\x10\x5e\x1c\x4b\x6b\x6c\x2b\x87\x86\x44\x53\xe9\xed\x8e\xa4\x59\xc4\x7d\x20\x0d\x97\xc4\xec\x84\xdb\x77\x67\x31\xab\xe0\x62\x66\x0c\x80\x31\xa5\xee\x9c\x79\x9d\x07\x17\x15\xad\x49\xd8\x81\x58\x49\x84\x59\x05\x74\x6b\x02\x62\x3b\x2f\xec\x19\x0d\xb6\xd1\x3b\x07\xf5\x71\x48\x34\xa1\xc8\xbf\x92\x7f\x5d\x54\x15\x8a\x38\xe2\xb3\xe8\x45\xd1\x73\x59\x3e\x54\x15\x52\xd8\xc0\xea\x8f\x70\x22\x08\xa0\x7b\x6b\xc2\x5a\x54\xfb\x65\x78\x7a\x06\x4a\x72\x55\xdd\x64\x2a\x2f\x57\x76\x53\xd2\xd1\x5f\xe4\xc1\xda\x17\xa0\xe8\x96\xca\x7a\x5c\x08\x6d\x17\x71\xa0\x3a\x6e\x0a\xc0\x64\xd0\x4f\xac\x4a\xdc\xc5\x7e\x23\x2e\xec\x83\x29\xd6\xd1\x75\xaf\xf8\x47\xad\xeb\x5e\x98\x07\x94\x78\x94\xb9\xfc\x68\xc8\xc0\xe9\x98\x37\xda\x2c\x5c\x55\xec\x1a\x3f\x70\xa0\x99\x8e\x39\x67\x0e\x48\xa8\x6e\xff\xf5\xb3\xfd\x07\xed\x14\x2a\xea\x44\x84\x68\x53\x54\x25\xed\x2f\xb8\x91\x31\x06\x06\x5c\x21\x3c\x20\xe1\x91\xeb\xfd\x01\xc3\x05\xf8\x6a\xe0\xa3\x8a\xce\x04\xa1\xa0\xd8\x86\xbc\x04\x2c\x74\xdb\x64\xd2\xc9\x98\x74\xa2\x53\xc6\x29\x43\x88\x31\x21\x23\xfc\x82\x2e\xa3\x77\x85\x84\xef\xb5\xad\xc5\x51\xf5\xb6\x15\xf6\xa8\xd6\xd2\x90\xa2\xe8\x4c\x38\xbd\xfc\xac\x47\x9a\x66\x1b\x13\x20\xbe\x88\x59\x3e\xbf\x34\x72\xe6\x22\xc2\x79\x48\xf4\xb2\xb5\xb8\x3b\x2f\xce\x7f\x1a\xfc\x8c\xa6\x0f\x3a\x14\x96\x61\xf9\x2d\xbb\x17\x97\x14\xe9\xc7\xd0\xf6\x0c\x5b\x06\xc1\x8f\x60\x37\x1c\xf1\x25\xfa\xf2\x8e\xb9\x70\x2d\xd4\x33\x0e\x69\x92\x85\xa4\x83\x2a\x78\x0b\x0f\xd5\x13\x52\x29\x01\xb8\x19\xec\xb9\xf5\xae\x58\xe7\x10\xa4\x03\xfb\x32\x65\x24\x08\x13\x02\x93\x12\xd4\x1b\xf6\xa1\x97\x55\xe9\xb6\xf9\x72\x07\x95\x7b\x94\x24\xd3\xbc\xc0\xfe\xcd\xfa\xad\x5f\xbc\x2a\x0b\xff\x9b\xda\x14\xba\x6b\x0b\xeb\x7c\xd1\x1b\xb3\x90\x77\x42\xdb\x1e\x88\x47\x96\x58\x20\xe0\xa0\xf5\x98\xe5\xad\xe8\x13\xf1\x78\x18\x56\xa9\x2a\xb2\x09\x18\xf2\x88\xcd\x83\xe3\x90\xbc\x28\x9c\x9c\x90\x5e\x65\xb0\x80\x9c\x28\x76\x4a\xd0\x52\x64\x17\xb4\x87\xab\x70\x38\xfa\x80\x97\xac\x49\x28\x48\x8a\xef\xd4\x9e\x7e\x45\x76\x47\xd3\xd8\xcd\x16\xa2\x96\x10\x99\x83\x03\xae\x60\xa7\x3d\x8c\xec\x0f\x4e\x45\x25\xfe\x43\x4b\x36\xe0\x20\xfa\x54\xf1\xd3\x1c\x3c\xdd\xcc\xcf\x4f\x00\x0f\x78\x1c\x40\x0e\x9e\xf3\xa9\xab\x8e\x9d\xba\x8d\x08\x9e\x91\x55\x0f\x0f\xea\x4e\x03\x14\x00\xe8\x3d\x61\x91\x07\x75\xe4\xf0\xeb\xbb\x10\xd4\xdf\xe4\x38\xf6\xc3\xa7\xfe\x36\xc7\xb1\xe6\xe3\x98\xdd\x70\xf8\xcc\xe1\xd3\xf6\x2f\x03\x19\xf2\x97\xc7\x6a\xd0\xff\x16\xbf\xd7\x90\x59\xdd\x2c\x10\xe9\x92\x6c\x19\x91\x72\x60\x10\x92\x7a\x11\x08\xa9\x95\x1e\x41\x1b\x56\xbc\xd2\xf7\x49\xb9\xbc\xbc\x2f\xb8\xbc\x63\x03\x7a\x7d\x54\x72\x6a\x69\xfc\xde\x4a\xef\x66\xb7\x23\x85\x74\x79\xc6\xb7\xb5\x13\x60\xf7\xc5\xa3\x90\x77\x51\xd7\xa7\x06\x77\x3a\xdc\x5b\x15\xe8\x08\x16\x7b\x7d\x85\x26\xdb\x0c\x34\xe7\xc0\x60\x99\xda\xfb\x5d\x28\x0c\x16\x6c\x43\x88\xee\xc6\x10\x13\x65\x1f\x10\x17\x40\xa0\x80\x28\xfb\xdd\x3b\x42\xaa\xcd\x74\x76\xd5\x06\x23\xdd\x11\x4d\x90\xcc\x05\x59\x93\x2e\x36\xad\x0e\x4d\x43\xbd\x53\x1e\xaf\x5f\x21\x02\x20\x1b\x73\x78\x9e\x98\x36\x6f\xbe\x09\xda\xbc\xe2\xce\xbd\x0b\xa1\x90\x24\x7a\x21\xaa\x1e\x89\xa2\x5b\x58\x43\x64\x4f\xe2\x01\x03\x3d\xf3\xf6\x92\xbc\xbc\xf8\xb6\xe9\x90\x35\xa3\xd7\x7a\xc0\xf1\x7d\x03\xf1\xcf\xce\xf7\x03\xfa\x42\x06\x04\x5c\x8f\x27\x13\x94\xe7\xb0\xbb\x2a\x28\xc2\x57\x60\xf6\x53\x96\xae\x6f\x64\x89\x82\xda\xd7\x8d\x18\x2d\x28\xf6\x0a\xe3\x05\xb4\xe4\x5a\xa5\x09\x80\xbe\x0b\xcc\x89\xaf\xa0\x9d\x83\x22\x66\xe4\x55\x44\x7a\xbc\xce\x9b\xa0\xab\xd5\xca\xfe\xb4\x40\x50\xa9\x60\x4f\xac\x41\xb0\x4c\xa2\x83\xfd\x27\x8c\xf7\x9e\x4d\xd3\x98\xe5\x03\x9a\x0a\xaa\xc7\x31\x0c\xf6\x3f\x5f\xec\xdd\xfd\xf3\x76\x10\xac\xb6\x2e\x45\x0d\xcf\x21\xc0\xae\xdc\xd8\x27\x69\xde\x7d\x28\xaa\x3a\x77\xfa\xd1\x94\x7a\x65\x4b\xfd\xde\xd6\xf7\x70\x2e\x11\x09\x8f\x59\xd8\xac\xaf\xea\x1d\xff\xc7\xfe\xd7\xa8\x1e\xd6\x1d\xe4\x96\xf9\xf6\x61\xde\xe0\x7d\xfe\x68\x4b\xd2\x8c\xcb\xcb\xfb\x1d\x2a\x7a\x87\x8f\x95\xbb\xcd\x42\x1c\x9e\x6f\xbd\x85\x34\x42\x2e\x77\xb5\x6e\x37\x7f\x52\x2e\x5b\xbb\x32\x04\x23\x22\x8d\x90\xaf\x3d\xe1\x1a\xb6\x0c\xc3\x8e\xe0\xae\x29\x9e\xcc\xde\x45\x81\x17\x4c\x4a\xfb\xb3\xa6\xd7\x52\x34\x21\x80\x1e\x4b\x8b\x40\x18\x21\xfa\x71\xfe\xeb\x74\x93\x74\x4c\xa0\xe4\x69\x78\x9d\xb4\x03\xf3\xa9\x58\x81\x24\x49\x2e\xf6\xba\x67\x12\x95\xba\x21\x17\x2f\xe2\x74\xfb\xe6\xfa\xc1\xb4\xc4\x7f\x44\xf0\x8a\xd8\x22\x91\x67\xdd\x8a\x09\x84\x58\x40\xaf\x2a\x0a\x4f\x1f\x84\xd7\xa1\x1c\x40\xfe\x68\xc3\xfd\x47\xb1\xb9\x98\x55\x82\xc0\x7a\x14\x70\x38\x94\x59\x3b\x8d\x81\x76\xd6\x6e\x56\xab\x0a\x4a\x1a\xd5\x2b\x14\x2c\xf7\x0d\xde\xfb\xa9\xe2\x0d\x98\xf0\x53\x5a\xf8\x46\x9d\xe0\x1b\x55\x0b\xdf\x78\x96\xc5\xc0\x80\x3f\xc2\x6b\x0b\x81\x0c\xb0\x52\xd9\x74\x72\x55\x34\x16\xb7\x0f\xb5\x71\xd6\x81\xde\x38\xc2\xfb\x4f\x32\xf5\xff\x1e\xc2\xfa\x9f\x64\xfa\xe4\xc3\xf8\xf6\xfa\x24\x63\xc3\x67\x59\x95\xeb\x1d\xdc\xc2\x7b\x8d\x85\x5d\x6b\x7a\x26\x71\x55\x14\xe9\x63\x98\x72\x8f\x21\x86\xbc\xc4\x00\x8b\x44\x41\x00\xf6\x2a\xc8\x79\xb2\x45\x27\xcc\x38\x49\x5e\xd1\x2d\x6e\x53\x40\xc6\x1e\xb6\xf3\xac\x6e\xf7\x28\xd4\xf2\xd7\xa7\x1f\xf2\xa2\x08\x65\xff\x9e\x89\xf7\x67\x5d\xf4\xa3\x74\x9f\xf9\x11\x87\xc3\x43\x7a\x28\x34\x72\xf0\x2d\x54\x5b\x3e\xd1\xa8\x54\x41\x1a\x64\x29\x0b\x25\x8a\xe5\x7a\xc6\x52\x6c\x57\xe3\xd9\xe5\xf5\x70\xfc\x79\x34\xd5\x93\x0f\x2c\x92\xf7\x65\xa0\x14\x68\xee\x8d\xae\xf4\xe5\xe4\x6a\xa4\xc7\x33\x7d\x3b\x9d\xfc\x36\xbe\x1a\x5d\xe9\xbb\x9b\xab\xd1\x14\x44\xe3\x74\x10\x8d\xbb\xd1\xc3\x1b\x7d\x32\x9c\xe9\xf1\xec\x44\xbf\x1f\xce\xc6\xb3\x28\x47\xc8\xcf\x54\x42\xf5\x30\xd3\xa3\x31\x68\xfc\x91\xd0\xe1\xe8\x4a\x4f\xa6\x51\xec\xf0\xb8\xa8\xa1\x90\xf2\x53\xf3\x4f\xc3\x39\xc8\xce\xb5\x9b\xfb\x61\x3a\x02\x05\xbb\xa0\x42\xc8\xa2\x87\xc3\xf7\xd7\x23\x50\x3c\xec\xa8\x1d\x2a\x52\x3b\x44\xe1\xc1\x9b\x73\x12\x3c\x1c\xdf\x7c\x1c\xa0\xc4\xdf\xcd\x7c\x3c\x1d\xe9\xe9\x78\xf6\x5f\xf4\x70\xc6\xc2\x7f\xff\x72\x37\xbc\x1e\xcf\xbf\x80\xfc\xe3\xed\x68\xfa\x61\x32\xfd\x3c\x24\x41\xc3\xbe\x76\xf9\xfe\x80\xb8\xa0\x9e\x7d\x9a\xdc\x5d\x5f\xc1\x90\x24\x1f\xf2\x03\x3d\xa2\x76\x8f\x7f\x1b\xe9\xf1\x8d\xf2\x9f\x99\x8e\x66\xb7\xa3\xcb\x79\x06\xfa\x80\xa7\x37\x13\xec\xf6\xf8\x66\x3c\x1f\x0f\xaf\xf5\xd5\xe8\xb7\xd1\xf5\xe4\x16\x55\x13\xfd\xc7\x51\x83\xf1\x72\x72\x33\x9f\x8e\xdf\xdf\xcd\x27\xd3\x33\x3d\x9c\xcd\xee\x3e\x8f\x14\xb6\x6a\x36\x67\x15\xca\x9b\xd1\xe5\x68\x36\x1b\x4e\xbf\xe8\xd9\x68\xfa\xdb\xf8\x12\x86\x7d\x3a\xba\x1d\x8e\xe1\x61\x97\x93\xe9\x74\x04\x4a\x8b\x03\x9c\xf4\xb8\x62\x94\x58\x31\xa0\x40\x38\x1f\xcf\xef\xe6\xa3\x99\x5f\x0c\x7e\x52\x41\x8c\x10\x06\x98\x65\x06\x79\xc5\x0c\xf4\xcd\x84\x35\x06\xc5\x00\x28\x1e\xa5\xe1\xdd\xfc\xd3\x64\x3a\xfe\x7f\x46\x57\xfa\xd3\x68\x3a\xc2\x25\x47\x82\x8b\x62\xfd\xc5\xa6\x04\x59\xb1\xf9\x68\xfa\x79\x7c\x03\x0b\xa5\x63\xa7\xfc\x2f\x09\x0b\x52\x3c\x66\x6d\xf2\xa2\x6d\x69\xe3\xc9\xe1\x9f\x93\x23\x8e\x3a\x7c\xc8\x7b\x0c\x70\x09\x92\x1a\xa1\xff\x78\x5e\xaa\x9f\x5e\xe9\x95\xbf\x6e\xab\xb5\x5e\xd8\x65\x05\xd1\x7e\x03\x58\x62\x3a\x39\xf0\xe3\x03\x3d\x04\x45\xbe\x45\x14\x08\xac\x3a\x66\xb9\x28\x8e\x8d\x39\x32\x51\xa2\x0e\xcf\x8a\x17\x4b\xfa\xdd\x46\x25\x17\x42\xd4\xa3\x87\x95\xd7\x54\xe1\x3c\x4d\xe4\xe7\x25\x6b\xce\x2c\xec\xbe\x2a\x63\x9d\xe5\x84\x55\xd4\x91\xaa\xa2\xe6\xe0\x8c\xfd\x32\x10\x3b\x1b\x54\x44\xc7\x43\x14\x8f\x1c\x28\x85\x33\x7d\x33\xd1\x97\xe3\xe9\xe5\xdd\xe7\xd9\xdc\x6f\x2c\x14\x5a\x0d\xbf\x92\x12\x99\x51\x3a\x74\x3e\x99\xce\xf5\x69\x38\x46\xd4\xcd\xe8\xe3\xf5\xf8\xe3\xe8\xe6\x72\x74\x96\xe1\xa6\x18\xfa\xad\x94\x4a\xa9\xce\x3e\x0d\xaf\xaf\xfb\x77\x55\x16\xf7\x94\x12\x7b\x2a\xe3\xdd\x76\x35\x9e\xf1\xcf\x7c\x27\xe4\x7e\x0e\x9f\x99\xdd\xdd\xfa\xe3\x6d\xca\x6b\x7e\xf2\x41\x81\x38\x26\x49\xcd\x66\x3d\x2a\xa0\x72\x2b\xdf\x8e\xa6\xb3\xc9\x4d\x50\x01\x1d\xdf\x5c\x8d\xa7\x70\x1e\xf4\xea\x81\xc2\xc6\x15\x92\xa0\x41\xfb\x93\x37\xdc\xa7\xa1\x1f\x82\xd1\xf4\x39\x01\x59\xfe\x9e\x7f\xef\xf5\x64\x06\x0f\xf8\x38\x99\x5c\xfd\x3e\xbe\xbe\xce\x50\xfe\x76\x36\x9f\xdc\xde\x0e\x3f\x8e\xfc\xc8\x7e\xbe\xbd\xf3\x0f\xfd\x30\x1c\x5f\xdf\x4d\xe1\x24\xfd\x3c\xbc\xfe\x70\x77\x73\x89\x4f\xa3\xc6\xfb\x19\xf4\x63\xcd\x87\xd4\x67\x7f\x38\x27\xad\xc4\x97\xf9\x51\x61\xe1\xd1\x30\x56\x5f\x70\xa2\xd4\xa7\xe1\x6f\x23\x54\x20\x1d\xdf\xf8\x53\xb7\x57\x82\x54\xb7\x25\x48\xf9\x18\x12\x6b\x4e\x85\x35\x47\x4b\x20\x11\x82\x8d\xbf\xf4\x43\x70\x35\x1a\xce\x3f\xf9\xe6\xe1\x74\x0c\xaf\xf5\xf8\xe6\x9f\xef\xa6\x70\x3c\xdf\x5d\xcf\xfd\x5a\xfb\x30\x9d\x7c\x16\xad\xfd\x61\xa6\xe3\xea\x6b\xa9\xc5\xa6\x0a\xb1\xfe\xe4\xff\x34\x7e\x3f\x9e\xcf\xf0\xeb\xb1\x91\x03\xf5\x02\xd9\x5b\xa1\x66\xeb\x87\x2f\xd9\x55\x71\x69\xa8\x43\x2b\x03\x54\x71\xe1\x3a\x8d\xcf\xf1\xf3\x24\x1e\xd4\x16\xc9\x55\x28\x92\xab\xb5\xbe\x78\x35\xd0\x77\x83\xd9\x40\x7f\xf4\x2b\xff\xe6\xb3\xef\xdc\xc8\x6f\xd3\xd9\x68\x3a\x23\xc8\x60\x27\x18\xad\x4f\x84\x7a\x7b\xde\xd8\x4d\x76\x82\x4c\x38\x6f\x5c\xda\x1a\x10\x2d\x80\xf7\x47\x13\xe8\xcd\x3f\xe9\xcb\xc1\x87\xc1\x74\xa0\x5e\x0f\x2e\x5e\x5d\xe8\xd3\x89\xf7\xf1\x2f\x7e\xf9\xe5\xe7\xb3\x8c\xcb\xed\x40\xb5\xaf\x75\xf2\xe0\x0e\x17\xe9\x04\x8e\x68\xf1\x11\xd5\xa5\x2b\x25\x71\x64\x6c\x96\x88\x78\x41\x85\x29\xd7\x6a\x95\xbe\x78\x3d\x78\x7d\xf1\x5a\x9d\xce\xec\x96\xdb\x05\x00\xe4\xa4\x0c\x50\xfb\xe3\xd0\x96\xf8\xc3\xd7\xaf\xff\x32\xf8\xcb\xeb\x57\xaf\xcf\x2f\xb8\x02\x81\x0a\x3f\x7a\xa3\x4f\xff\x79\x57\x5a\xee\xb1\x3f\x4a\x71\xc8\xc1\x96\x87\xe4\xee\xa8\x5c\xe9\x3b\x67\x6b\xa7\xcd\x12\x0b\xfa\xa5\x37\x05\x04\xd3\xca\x62\x4f\x89\xef\x4e\xa4\x15\xaf\x30\x9a\xd2\x8b\x81\xfe\x3c\x9e\x5d\x8e\xae\xaf\x87\x37\xa3\xc9\xdd\xac\x7d\x9d\x06\xe1\xbc\xc0\x8d\xdd\x02\x8f\x3c\x2a\xf8\x2d\xab\x72\x69\x6b\x08\xea\xb5\x04\xcb\x98\x26\xfa\x12\x19\xc9\x07\x5b\xb0\xc8\x56\x22\x23\xd9\x96\x64\x54\x5d\x49\x46\xec\x6b\x82\x78\x4f\xd2\xe2\xec\x2a\x48\xe5\x45\x2c\xb2\xd8\x51\x57\x94\x41\xc7\xab\x5d\xb3\x7c\x00\x61\x31\xa1\x7d\x76\x6a\x65\x80\x87\x5f\xd7\x11\xb9\xa4\xf2\x55\x14\xb5\x17\x65\x08\xce\x32\xac\xc8\x01\x39\x97\xbc\x01\x5f\x7c\x5d\xe4\xcb\xe6\xbc\x5a\x9f\xa7\xef\x1a\xa8\xdf\x5b\xa1\xbb\x55\xee\xb6\xc0\x74\x8e\xd2\xf8\x0c\x85\xf3\x3e\x31\x61\xd1\xfd\x9e\x5b\xe6\x4d\xfe\x6f\xb6\xe4\x32\xab\xa6\xa4\xca\x62\x90\x69\x6d\x60\xad\x60\xf8\x09\x2a\x41\x20\x5a\x62\x55\xe9\x85\xf7\xd2\xac\xf3\x2f\x40\x65\x05\xbf\xa3\x6f\x80\x17\x53\x98\x72\xe5\x20\xe2\xa7\x48\x59\xf2\x48\x69\x85\x8c\xa3\x65\xd8\xdc\x34\xd3\x22\x62\x93\x34\x9a\x5c\x71\x9a\xbe\x90\x7c\xfe\x08\x3c\xc8\x9d\x85\x89\x93\x75\x6f\xd7\xe0\x79\xf9\x1d\xb7\xc8\x91\x75\x63\xea\x45\xde\xd4\x14\x67\x0b\x81\xca\xa2\x02\xda\x15\x8e\xda\xd6\xec\x89\x8b\xa7\x96\x95\x23\x7a\x66\xfc\xda\x3b\x8d\x25\x46\xf6\xf2\x87\xdd\x7e\x0d\xc3\xa6\x40\xec\xcc\xc2\xe2\xba\xce\x4b\x3d\x2c\x36\xb6\xa8\xb2\xf6\x88\x52\xe4\x73\x79\x46\x19\xd5\x86\x73\xb9\xed\x67\xab\xd6\xb3\x31\x32\x98\x08\x33\x27\x1a\x80\x64\x62\x2e\xab\x1d\x72\x5a\xc4\xfb\x95\x78\xff\x81\xe1\x68\x63\x1b\x61\x4c\x8e\x6b\xb3\x65\xf4\x2e\x1c\x3e\x2c\x67\x10\x4a\x7d\x99\xa6\xa9\xea\xd2\xee\x9d\x5e\x5b\x92\xec\xb7\xdf\xb6\xa4\x57\x3d\xf4\x3d\x37\x4f\x2a\x09\x88\xd2\x02\x0f\x3b\x28\x66\xae\x4c\x79\xbf\x0b\x65\xff\x03\x55\x2b\x0c\x0a\x28\x8e\xd6\x3b\xbb\x52\x44\x4b\x44\x70\x61\x8d\xe8\x50\xa1\x3d\x0b\xf1\x94\xd6\x8a\xa4\x43\xf1\xf5\x00\x1c\xb1\xc9\x4d\x30\x30\xbc\x55\x00\x4e\xc8\x2c\xaa\xad\xe5\x25\x24\x10\x1c\xc3\x22\x88\xe1\x98\x90\x4e\x8c\x03\x37\x81\x09\x99\xd1\x9b\x60\xe0\xf8\x4f\x83\x37\xd9\x41\x48\x69\x4b\xbc\xee\x30\x8c\xd1\x4f\x05\xe7\x19\x25\x10\x2e\x6a\x28\xf6\xc8\x95\x4b\x11\x13\x4b\x01\x4a\xaa\x34\x99\x5b\x48\x6b\x27\x97\x79\x04\x11\x07\x34\x2e\xe5\x49\x1e\x6d\xb9\xb3\x0e\x3e\x10\x10\x56\x10\x54\x09\x9a\xa0\x4a\xd4\x01\xca\x62\xa9\x9e\x88\x34\x59\x9b\x65\x03\xa5\xcd\x60\x28\x38\x21\x86\x5c\x76\x88\xbe\x83\x0b\x62\x57\xac\x11\xab\xf0\x38\xe4\xbc\x4f\x18\x38\xc2\x44\x40\x0a\xd9\xfe\xb7\x5d\x8e\x99\x42\x60\xb6\x0c\xf4\xe8\xaf\x60\x78\x01\x83\x1e\x8a\xb8\x4b\x32\x36\x0c\x0d\x24\x07\x40\x23\x33\xdd\x5a\x07\x75\x2d\x28\x68\xab\x2e\x06\xaf\xb0\xca\x48\x20\xc2\x9f\xbd\x0b\xe1\x3c\xbf\xdc\x90\x8e\xc8\xaf\xb0\x71\x05\x75\xf3\xb7\xaa\x5d\xcf\x99\xb1\x7e\x26\xa1\x0a\x04\x87\x37\xc8\xb0\x3d\x54\x1b\x3b\x78\xfa\xe6\x06\x65\xf1\xe3\xff\xb7\x2e\x1e\x57\x0b\x5b\xdf\xff\xb8\xae\xad\xcd\x7d\xdb\xcf\x59\xe5\xb0\xf9\xd6\x28\x35\x0b\x56\x90\xa0\x49\xc4\xc0\xad\xb8\x9a\x53\x1e\x85\x1f\x59\x8e\x01\x21\x63\x48\xb5\x63\x40\x3a\x89\x01\x11\xea\x9d\x8b\xa1\x51\x41\xb7\xdc\xae\x06\x7a\x66\x6d\xf2\xb2\x35\x31\x0c\x48\x80\x77\x19\x37\x3b\x5e\xcc\x82\x26\x1b\xaa\x9b\xb3\xfc\x46\xbb\xe5\x7f\xea\xcf\xfd\x3b\xfc\x19\xfc\x78\x79\x79\xfe\xfe\xcb\xf9\xcd\xe5\xf9\xcd\xd5\xf9\x9b\xc1\xab\xbf\x83\x0a\xd0\x33\xfa\x3f\x17\x6f\x7f\xee\xe8\xff\xfc\xfc\xd3\xc5\x9f\xfa\x3f\xff\x88\x3f\x1d\xd1\x48\x51\xb9\xf0\xfc\xa6\x2a\x2f\x83\x3b\x76\x7e\x53\xc5\xfc\x89\xd3\x6f\x06\xaf\x00\x77\x5e\xb3\x32\x70\x57\x7f\xf2\x92\x6a\x9d\x63\x19\xdc\x8e\x7c\xe8\x59\xd4\xbf\xf5\x76\xf4\x3a\xaf\x11\x8a\xbd\xaa\xac\x03\xc9\x6e\x32\x25\x88\xe2\x4e\x75\x70\xe1\x3c\xc2\x9f\x98\xd5\x23\x80\x15\xdb\x00\xb2\xf6\x9b\x14\x09\xa7\x86\x70\x5d\x00\xca\x04\xd4\x43\x61\x9e\xf6\xb6\x3e\x5f\x16\x98\x9a\xad\xe3\x6d\x87\xa7\xd5\x43\xbe\x8d\x82\xba\x2a\x0a\x6c\x7e\x05\x09\x08\x17\x1f\x8d\x66\x54\x41\x05\xde\x23\x5c\x37\xc2\xab\xe9\x40\x36\xee\x3c\x77\x27\x8a\x2e\xba\xce\xd8\xdd\xc3\x20\x47\xd9\x5f\xac\x2a\x72\x6f\xea\xe0\x87\xf0\x2b\x33\xaa\x08\xde\xd8\xda\x3b\xcd\x5d\x31\xd8\xbc\x3e\x50\xfb\xa3\x25\xdf\x2a\x9a\xdb\xd3\xd7\x15\x15\x6c\x72\xe0\x29\x44\xe8\x8a\xb4\x7a\xa2\x98\x1c\x67\x68\x72\x4c\xa8\x51\x76\x3d\x2d\x6b\x15\x30\xb4\x03\xa5\xee\xc0\x94\xed\x8c\x42\x7a\x77\xbb\x1e\x8d\xd3\xf6\xd4\xf2\x9a\x31\x42\x9c\xda\x62\x4e\xa6\xaf\xca\x42\x54\xa7\xaa\x6a\x27\xcd\x1c\x62\xc9\x91\xdc\x9f\xbf\xd2\xa9\x1f\x20\x08\x10\x8b\x39\x60\xa9\xf3\x6a\xad\xa8\xd4\xeb\x43\xbe\x15\x8f\xe1\x59\x91\xd6\x49\x14\x13\x84\xb6\xd8\x1a\x2c\x05\xf9\x5a\x15\xe5\xec\x29\xf5\x94\xf6\x52\x2f\x6c\x51\x3d\x21\x5e\x6f\x5d\x15\x45\xf5\xe4\x07\x8f\x6b\xa6\x33\xfc\xa2\xc6\xdb\x59\xcc\xaa\xf7\xc7\x82\x70\x43\xe9\xad\x50\xd6\xa6\xb3\xdf\x1e\xcc\xce\xf9\x81\xcd\x68\x0b\x76\xc5\x66\xab\x5d\xa8\x6a\xe2\x06\x4a\x5d\xa6\xaf\x5b\x87\x4a\xcc\x55\xed\x7e\xd5\x93\x5d\xdd\x99\x1a\xc4\xbf\x89\x3a\xee\x28\x3b\xac\x30\xe8\x11\x14\x89\xc1\xf0\x06\x3d\x45\xd1\x73\x51\x82\x95\x72\xd8\x61\x68\xbd\x13\x0b\x41\xfb\x20\xc9\xcb\x34\x49\x8c\x0a\x3c\x3f\xde\x03\x68\x6e\xda\xce\xba\xb6\x8f\xd5\x12\x6b\x3e\xb0\x6c\xb3\xd3\xee\x01\x20\xd4\xb5\x35\x58\xc9\x41\x60\x34\x9a\xe3\xb2\x86\x01\xbf\x07\x48\x18\x4a\xc7\x2f\xec\xba\xaa\x11\xa8\xb1\xc7\x6d\x1d\x4b\x17\x84\x97\x41\xfe\xde\x59\xc8\x59\x08\x79\xe9\xc8\xff\x6f\x3f\xa5\x92\x9d\x49\xb2\xc2\x38\x96\x4b\xe3\x9d\x55\x56\xdb\x08\xe3\x68\x9c\xf2\x1e\x9e\x1f\xb6\x9e\x56\x40\xd6\xb6\xf0\xe7\x0c\x54\x7f\x8f\x07\x0e\xd6\x5f\x48\x8d\x6f\x36\x5b\x31\x30\x15\x54\xde\xc9\xdb\xba\x3c\x0f\x67\x14\x3f\x24\x43\xa9\x0f\x7a\xe2\x2e\x1e\x5f\x20\x85\xc9\xaa\xa3\xb0\xc4\x02\xd1\x58\x6e\xa5\x81\xfe\x5c\xd5\xb6\xbd\x05\x92\x35\xa9\x7f\xd5\x4f\xf9\xd7\x7c\xd0\xa7\x7c\x9c\xae\xe5\xff\xba\xae\xea\xff\x1a\xbe\xd7\xbb\xd2\xe3\x68\xfe\xaa\xdf\xfb\xa3\x01\xc6\xbd\xb4\xb4\x4f\xda\x4b\x3f\x0b\xe0\xd2\xaa\x56\xa4\x67\x70\x74\x71\x8b\x41\x5c\x89\x71\x81\x21\x09\x87\x83\xea\x5b\x6e\x41\x9b\x9f\xdf\xf7\x83\x93\xcf\xa7\x1b\x37\x46\xdb\x08\x1a\xae\xd0\xf5\xff\x9f\xff\xfd\x7f\x00\x31\xf2\x9b\xd9\x6c\xbd\xb7\xb8\xb0\xc8\x34\x24\x38\x88\x60\x1c\x47\x41\xca\xc3\xb3\xf2\x3f\xff\xfb\xff\x68\x1e\x6c\x89\x87\xec\x2e\x4a\x3b\x51\xcc\x20\x22\x05\x83\x98\x7b\xb2\x0f\x61\xa0\x30\x56\x18\x7b\xe0\x14\xcb\xd3\x3c\xb7\xab\x99\xbe\x56\x04\xd1\x76\xe3\xf8\x94\x01\x68\x1f\xce\xc4\x40\xdf\xc5\xda\xd0\xdd\x31\xf7\x27\xbf\x6b\x72\x0e\x60\x86\x83\x65\x2d\x6c\x04\x3f\x72\x2e\x53\x31\xd6\x12\x86\xcd\x7f\xc0\x21\x0c\x3b\x36\x38\x7e\x33\x01\xdf\xf2\x2b\x07\x7a\xa8\x42\x9b\xfd\xeb\x11\xe4\x48\xca\xb4\x24\x2d\xee\xb8\x02\x82\xd3\xc6\x7d\x0d\xb8\x73\x20\x76\x11\x95\x13\x18\xd0\xf5\x57\xbb\x52\xa0\x90\x44\xa0\x85\x81\x1e\x16\xcd\x03\xd4\xd0\xc5\xa9\x88\x6a\x5e\xf2\xdc\xc8\x82\x74\xa9\x2d\x97\xd5\xae\x36\xf7\x08\x60\x08\xb1\x4d\x0c\x54\x53\x63\x28\x9e\x12\xc3\x47\x87\xf7\x63\x5c\xf6\xea\x8f\x6c\x48\xdb\x6b\x04\xfc\x71\x9b\x35\x35\x30\x94\x7a\x9f\x08\x3c\x09\xe7\x74\xa5\xa7\x38\x5b\xa7\x9c\xfa\x80\x4b\xf8\x8c\x42\x41\x4b\x2c\x5f\x5b\xae\x42\x28\x44\xc9\x82\x33\xc7\x2f\x87\xdc\x75\x2d\x9f\x17\x76\x49\x75\xba\xd4\x8e\x77\x9c\x9e\xb4\xc0\x3e\x67\x03\x3d\x6f\x89\xcd\xe4\xae\x85\x9f\x61\x41\x06\xa0\xba\x6d\x6b\xdb\xb0\xc0\x1e\x47\xef\x62\x04\x2c\x14\xa6\xea\x8e\x15\x95\x6e\x88\x33\xa9\x39\xe2\x85\xe3\xc5\xf2\xf7\xa8\x5e\xdc\x6f\xa3\xd2\xd5\x1a\xab\xd2\x0a\x39\x98\xa4\x54\x75\xcf\xab\x50\xb1\xa9\x49\x6b\x37\x28\x0a\x78\x51\x61\x40\xc1\xf6\x0c\xad\xff\x1c\xae\xc4\x28\xeb\xcf\xc6\xb4\x6c\xa8\x12\xc7\x2e\x84\x21\xe1\x3f\x0c\x4e\xbd\xd0\xff\xf3\xbf\xff\x8f\x96\x62\xaa\x19\x60\x11\x31\xf9\x12\x14\xc9\xea\xb3\x14\x2f\x93\x33\x6e\x46\x38\x2c\x1a\x5b\xae\xcc\x4c\x84\x69\x9d\xea\x1c\x43\x19\x82\x03\x9d\x2a\x57\x69\xa5\xf3\xee\x47\xb0\x0c\x41\xe9\xe0\x90\xce\x90\x3a\x00\x7f\xf1\xae\xc8\x3d\x94\x2f\x07\xfd\x4e\xc8\xe6\x64\xad\x7a\x08\x8c\x9c\x83\xf0\xd7\xc6\x94\x25\x9c\x91\xfe\x98\x81\x68\x75\xbc\x8b\x44\xb5\x8a\xbe\x8e\xaa\x29\x2b\x55\x14\xab\x76\xe5\xe7\x03\x2a\x64\xe9\x4a\x67\xaa\xe1\xc1\x3e\x1a\xbd\xd9\xb9\x7c\x49\x56\x7c\x50\xf3\xf1\xcb\x12\x3a\xe5\x60\xfb\xd6\x96\xca\xec\x64\x3c\x77\x2a\x79\x08\x22\x34\x49\x23\x68\x15\xdf\xd9\x33\xf4\xb9\xd3\x6e\x5f\x02\xc0\xd6\x1f\xfa\xf9\xc6\xae\x14\xbb\x98\x14\x35\xd5\x9b\x0a\x54\xec\x20\xfe\x87\x65\xea\x8e\x2d\x03\x5a\x3d\xc9\x6d\xf8\xa3\x6f\x3a\x7d\x8a\x76\xc7\xb2\xa8\x9c\x2d\xf6\x2a\x54\xea\xa8\x92\x72\x8d\x74\x6f\x65\x3d\x7a\x2e\xad\x51\x59\xd4\x95\x59\x2d\x8d\x6b\x32\xd5\x19\x1d\x68\xdd\x2e\x47\xf9\xf5\xdc\xe9\x2b\xd3\x18\xbf\x1a\xa9\xa9\xf1\xe9\xe8\xc7\xfa\x46\x3c\x54\x4f\x3a\x14\xdb\x47\xcb\xbb\x30\x0b\x5b\x90\xbe\x90\x69\xec\x3d\xfa\x04\x2f\x9c\x70\xf1\xac\xc4\x87\x0a\xa2\x34\xa7\x8b\xb3\xd3\x8b\xb3\xf3\xd3\xd7\x67\xc1\xf7\x39\x36\xbc\x58\x54\x0f\x51\xbf\xfe\x74\x9e\xdb\xe5\x03\xd4\xc8\x82\x55\xf3\xd9\x1a\xb7\xab\xad\x0b\x3a\x93\xfe\x4e\xdc\xf0\x0f\xfd\x06\x0d\x55\xe0\xcd\xc2\x59\xd0\x42\x5d\x53\x4a\x2c\x5a\x22\x99\x2c\x1c\xb6\xcc\xeb\xe5\x6e\xf3\x68\x45\xdd\xa3\xc2\x3c\x39\x66\x2e\x80\x99\x19\x19\x5c\x64\x0b\x0d\xeb\x26\x5f\x16\x56\x5f\x5c\xb0\x1d\xd3\x5f\x31\xcb\xac\xaa\x2d\x85\x84\xaf\xec\x92\xea\x70\xbd\xca\xb0\x8c\x96\x6a\xad\x9c\x3c\xb9\x54\x62\x6d\x36\x2c\x81\x17\x4a\x01\xe0\x89\x7d\x2d\xe2\xba\x38\x18\x6b\x83\xae\x7f\x86\x7f\x5b\x59\x53\xf0\x22\xf9\x31\x29\x94\x79\xc4\x90\x3c\xba\xf0\xd1\xde\x89\x10\x77\x7f\xaf\xa8\x5d\x34\xe5\x3a\xbb\x0f\x6b\xdd\x75\x37\x65\x14\x09\x35\x5c\xbb\x0c\x5a\x42\x45\xcd\xf0\x68\x58\xd1\x5a\x8e\x87\x9d\x0a\x27\x76\x82\xab\x8f\x45\xdc\xa0\x69\xab\xbe\x75\x8a\x85\xdd\xda\x86\x45\x6c\x47\x0b\x08\x47\x35\x9a\x5a\x3e\x56\xdf\x2d\x74\xe4\x20\x64\x2c\x1a\x17\x1a\x6a\x2a\x92\x0f\x11\x43\xac\x0e\x0d\xf1\x9e\x07\x58\x1f\x1b\xe0\x84\xaf\x16\x2f\xec\xb6\xd9\x1d\xbd\x43\x75\x2f\x2a\xf5\xf5\xa9\x32\x9f\xba\xb3\x28\xcc\x7c\x9a\x5b\x77\x86\x83\xd2\x16\xdf\xc4\x7c\x6b\x67\x90\x1f\x06\x3a\x31\x9d\xe8\x1d\x18\x5a\xcc\x37\xa6\xce\x8b\x7d\x1a\x91\xf0\x96\x32\xa4\xe8\x60\x84\x9e\x4c\xbd\x72\x5a\x00\x52\xcc\xea\xd1\x94\x0d\xa4\x32\x6b\xbd\xa9\x4a\xdb\x18\x50\x83\xda\x6c\x6d\xe9\x28\x70\xf6\xe2\x73\xca\x7e\x43\x4b\xfd\xf0\x78\x46\x1f\xe3\xa8\x75\xa0\x7a\x76\xc7\x62\xaf\x57\xf9\x7d\xde\xf8\xa7\xe4\x85\x3d\x77\x0f\x06\xae\x5f\xb1\xc1\x71\x30\x72\x97\x8e\x91\x92\xaa\xab\x35\xb9\x6c\x7a\x6b\xf6\x2c\xc1\xd9\xdb\x6d\xdd\x5f\x88\x2c\xf4\x71\xa0\x54\x3e\xd0\x33\x08\x9d\xd1\x44\x57\x21\x54\x27\x37\x92\xf0\x8a\xa9\x4e\x23\x7e\x1c\x4b\x6d\x2e\xa1\x86\xed\x83\x69\x14\xf9\x2d\xae\xdf\x9e\x68\x6d\xad\xe8\x2b\xb1\x96\x1f\xdd\x6c\x68\xf3\x46\x35\xbf\xe0\x8e\xc7\x0b\x4f\x12\x88\xe0\x5f\xce\x32\x8e\x32\x4b\xcb\x42\x82\x26\x65\xbe\xd9\x56\x35\xdf\x9c\xc4\x95\x01\xff\x6d\xd3\xb5\x29\xd3\xee\x46\xef\x91\x02\x5a\x68\xe1\x6d\xe0\x98\x0e\x51\x24\xfa\x30\x50\x43\x96\x34\x1c\xe2\xe1\x60\x04\x1a\xbd\x2d\x58\x9d\x02\x3c\x60\x6f\x68\xa8\xb8\xab\x0a\x88\x3f\x39\xcb\xd5\x55\x37\x03\xa5\xfe\x75\x70\xec\xea\xa6\x49\xa0\x2d\x27\x98\x1c\xd1\x88\x08\xa1\x5f\xa4\xdf\x5c\xa1\x86\xeb\xa3\xd5\xbf\xbc\xfd\xf1\x97\x1f\x47\x97\xdc\x81\xd1\xce\x5f\x7f\xa6\xd4\xb7\xa6\x2e\x72\x03\xab\x0a\xe2\xa5\x4c\x6c\xdb\x95\xcb\x1c\x78\x6e\x17\x17\xea\xb3\xa9\x97\x0f\x58\xb0\x91\xcc\x59\x0c\xfc\x6f\x43\xfd\x49\xd6\x8f\xf7\x8d\x45\xbd\x43\xae\x36\xc9\xd7\xd9\x6e\xb9\xb4\x76\x65\x57\x99\x32\x0e\xb5\x8c\x0d\x77\xc1\x3a\x87\xda\xc8\xc5\x1e\x52\xcf\x8f\xa6\xf0\xcd\x09\xf9\xca\x48\x6d\xf0\xaf\x06\xe9\xc9\x81\x52\x5f\x29\xcb\x7b\x5c\x45\xfe\x19\x2f\x12\x0b\x23\xf6\xdd\x0d\x78\xce\x3e\x90\xb7\x25\x0b\x3a\xfa\x37\xe6\xe5\x7d\x8f\xab\xf1\x1a\x5c\x8d\xd9\xb2\xda\x46\xc2\x8b\x09\x37\x0c\x9e\x99\x20\x76\xdc\xae\x0c\x7e\xd4\x27\xed\x39\xb4\xa2\x17\x75\x50\x9c\xf3\x90\x36\x67\x80\x4b\x23\x0e\x21\x91\xeb\xcc\x94\x88\xb7\xca\xba\xc9\x34\x8a\xb6\x77\x0c\xf3\x03\x1e\x8e\x6a\x2a\x94\x77\x0f\xca\x9d\x68\x3f\xc0\xe9\xd3\xfb\x8d\x0c\x1d\xa2\xaa\xb0\x08\xd3\x80\x98\x37\x56\xb3\x69\x1d\x8e\x32\x7c\x4e\x8a\x99\xef\x07\x5a\xbe\x46\xc8\x85\x2e\x76\x0d\x5c\x36\xf0\xe6\xac\xeb\xf9\x3d\xf3\xfc\x81\x52\xaf\x8f\x59\x5a\x47\x8b\xc9\x91\x1f\x12\xbf\xad\xda\x76\x5a\xe7\x62\xcf\xfa\xa6\x5d\x90\xca\xfd\xe7\xe1\x50\x03\x76\x1a\xa5\x08\x4a\xdb\x45\xca\x80\xcb\xdd\x17\x9b\x14\x72\x3c\x3f\x0d\xf4\xdc\xd6\x1b\x4c\x62\x60\x35\xe5\xde\x65\x07\x3e\x53\x9f\x29\xff\xf6\xd4\x9c\x0d\x94\x7a\x33\xd0\x9f\x51\x91\xaf\x44\x6d\x77\xd3\xb8\x77\xba\xf1\x76\x3a\xd8\xe8\x29\xdd\xc6\x14\x45\xf5\xe4\xbd\x89\x79\x62\xaa\x71\xea\xc1\x29\xe2\xeb\x3e\xb7\xee\x40\x01\xbe\xfd\x5a\x16\xa4\x06\xc5\x54\x10\x4c\x57\x89\x6e\x2a\xb1\xd4\xd2\x7b\xe1\x50\x4b\x13\x3c\xe4\xaa\x52\xae\x6a\x35\x1a\x6a\x39\xbb\x60\x4f\x7b\xfb\xdc\x05\xa9\x52\x07\x45\xbd\x42\xa9\x52\x5d\x09\x7f\x43\x35\x95\x6f\xf1\x22\x47\x85\x91\x24\x0a\xf2\x92\xc6\xc8\xb1\x51\x9d\x9b\x56\xa8\xac\xbd\xe4\x61\xd1\xdf\x51\xcf\x79\x59\x2f\x34\xad\x5c\xee\x17\xa2\xa2\x1e\xb5\xa6\x3f\xe6\x98\x98\x60\x17\x3d\x43\x73\x76\xfa\xe6\x4c\x97\xf6\xd1\xd6\xbc\xa1\x5d\xc7\xe3\x97\x4b\xf8\xe7\x81\xbe\xaa\x9e\x4a\xd7\xd4\xd6\x6c\xa4\xe0\x20\x1c\x3e\x93\x94\xa9\x16\xe6\xcd\x9f\xd4\x5d\xdf\x44\x8f\x40\x25\x20\x61\x07\xcb\xb5\x17\x43\x0e\x09\xfb\x45\x87\x60\x96\x29\x49\x61\xb4\xfb\xc6\x67\xe6\xac\xc3\xfd\x7c\xd1\x75\x80\x05\x2d\x6e\xfc\xda\x14\x43\x10\x0a\x56\xba\xe7\xc5\x4f\xa3\x72\x28\x04\xa8\x83\x14\x04\x11\x50\xeb\xa4\x0d\x25\x66\xab\xe1\xc8\xf2\x5f\x3e\xb0\x58\x54\x70\xc9\x9b\x2a\x3b\x14\x84\xf1\x47\x24\x16\x0a\x10\x82\xaa\x61\x84\xda\x03\x1f\x0d\x6a\xcc\x95\x1f\x98\x20\xe9\x66\xbe\x85\x81\xb1\xe5\xaa\xaa\x1d\x38\xcd\x50\xa5\xf6\x21\xb0\x11\xbb\x87\x9c\x2c\xba\x4e\x51\xff\x14\x18\xe9\x5a\x49\x22\xda\xe1\x04\xcd\xa2\xb2\x44\x14\x92\xcd\x34\xab\xd7\x1c\x72\xd9\x64\x00\x2b\x63\xc3\x9d\x68\xf3\x18\xf9\xda\x56\x7e\xe9\xf8\xc3\x8a\xba\x81\x61\x3e\x76\x49\xab\x35\x29\xe1\x03\x35\xde\xa9\xc5\x3e\x35\x0f\x82\x97\x0c\x8a\x75\xf9\x7d\xc9\x51\x27\x5a\xaf\xda\xc4\xf0\x36\x28\x52\xb3\xd3\x91\x97\x2a\x90\xfb\xfd\x8e\xbc\x38\x3b\x1d\x9e\x9d\xe6\x67\x61\xdf\x2d\x06\x7a\x22\x53\xb7\x60\xd5\x7c\xae\xea\xa0\x3f\x1b\x8d\xfd\x48\x27\x86\x6a\xba\x8d\xbd\xc7\x70\x0b\x07\x7e\x3a\x48\x89\x8e\x0f\xe9\xcd\x94\x1a\x29\x5c\xf0\x73\xf8\xfa\xb6\xce\x1f\xcd\x72\x1f\x42\x19\x24\x8a\xc7\x2c\x59\x5b\x3b\x12\x3c\xa4\x48\xd4\x3b\xfd\xc0\xca\x55\x29\x06\x9d\xe1\x0f\xad\xa1\xeb\x3b\xd8\x55\xf7\x60\x97\xc1\xef\xbe\x10\x69\xcc\xc5\xa2\xc3\xdf\xc6\xd9\x2b\x8c\x00\x54\x4f\xfa\x05\x77\x5e\xb4\x65\x42\xa0\x17\xad\x93\x5b\x94\xe1\x86\x1b\x2d\x16\xae\x8d\xd1\xbc\x03\xe3\xdc\x3d\x4c\x7e\x6a\x67\x25\x9e\x1b\x9d\x7d\xa4\x8a\x2f\x2b\xc0\x9b\x93\xd1\x99\x5b\x17\x2a\xf4\xc7\xd2\x53\x07\xb6\x77\x8c\x4d\xd2\xdd\x2d\xf1\xba\x4c\xf5\x30\xfc\x06\x3c\x35\x96\xb9\x6d\xf6\x21\x3f\xbd\xd7\x8f\x55\xb1\x2b\xc1\x25\xa6\xf6\x81\x15\x8b\xa2\x11\x55\x4d\xba\x97\x9b\xed\xae\x70\x55\xbd\xa7\xd4\x1e\x3c\x69\xf9\x60\x37\x16\xd4\x4d\x40\xda\x03\xd5\x54\x00\x9f\x9c\x74\x39\x16\xa6\xae\xad\xb3\x75\xd2\x7d\x25\xba\x8f\x2b\x82\xc7\x20\xc1\x7e\x3f\xd8\x43\xd9\x80\x9c\xaa\xcf\x60\x4c\x0b\x9c\xba\x8e\x59\x1a\x2e\xdd\x1e\xd7\xe3\x27\x79\xa1\xe9\x4b\x69\xeb\xc1\xe9\xf3\xcc\xc0\xeb\x5c\x16\xde\x06\xb0\x72\x2b\xce\x15\x00\x2e\x9d\x6c\x0b\x3a\x39\x22\x51\x26\x2f\xe7\x8b\x20\x14\x78\xd4\xee\x0f\xca\x28\xe4\x30\xa0\xba\x53\x82\xab\xc9\x59\xda\xc5\xed\x28\xa4\xd7\xde\x69\x01\x91\xdf\x39\x5f\x7f\x85\xb8\x07\x57\x14\x5b\x26\x15\xea\x08\x75\x04\x31\xae\x63\x11\xb5\x10\x2a\x85\xfa\x4c\xc7\xcf\xd2\x8c\x95\xb9\x04\x92\x5f\xa4\x60\xac\x8b\x49\xf7\x18\xa0\x3b\x15\x89\xeb\xbd\xde\x3a\xbb\x5b\x55\xe5\x7e\x03\x17\x65\x78\xe1\xd9\x3b\x31\xb8\xf8\x27\xcf\x07\x04\x70\xc6\x9d\x88\xfc\xf8\xbe\xcf\xc1\x07\x89\x3e\x0f\x17\x13\x54\x63\x72\x01\xcb\x9f\x9e\x06\x3d\x4f\x78\x3c\xf6\x00\x1b\xb0\x69\x88\x86\x8f\x88\xb9\x77\x4a\xc1\x37\xef\xa6\x63\x28\x61\xb0\xdf\xda\x1a\x4b\xb2\x56\x07\x06\x3c\x3d\xa1\x85\x6c\xe7\xb6\x36\xcb\x06\xb1\x0f\xef\xc0\xf4\xa1\xf2\xec\x96\x05\xe1\x42\xde\xeb\xf0\x4c\xd2\xf2\xa2\x0a\x43\x4b\x51\xce\x49\x14\x3d\x4b\x2c\x56\x72\x31\x2f\xc5\xeb\x0e\x6e\xe3\xe7\x8f\x59\x74\xde\xa2\xa2\x28\xd5\xf9\x25\xca\x91\xff\x77\xcf\x40\xf5\x7a\x85\x03\xa5\x8e\xf9\x9e\xc2\x3f\x04\xec\x43\x4f\x90\xae\xf3\x48\x7f\x92\xe1\x56\x6d\xfb\xc9\x78\xd3\xb0\x39\xe9\x4c\x93\x3b\x12\x06\x11\x16\xa2\x54\x05\x42\xc3\xe1\xe0\x56\x50\x09\x8b\xc2\xbb\x71\xbb\x4d\x86\xf1\x9c\x8c\x8d\x5f\x18\x98\x44\x99\xee\xc8\x31\x32\x80\xc1\x08\xa0\x99\x3c\x94\x4b\x11\xaf\x6e\xaa\x43\x2d\x5f\x10\xcf\x0e\x89\x4f\xaa\x6f\xad\x82\xca\x17\x8a\x16\x61\xda\x97\x11\x55\xcd\x83\x28\xc8\x26\xf1\x9b\x70\xa1\x8e\xd7\x9d\x5d\x1f\x0e\x2d\x21\xa2\x55\xdb\x4d\x45\x34\x74\x3a\x88\x24\x70\x95\x1f\xaf\x16\xfb\xf6\x08\x9f\x0e\xcf\x5e\xb4\x61\x7a\xae\x8d\x37\x18\xb1\x3a\x1c\x72\x1c\x28\xf5\x7b\x37\x93\x1a\x3c\x70\x5c\xc2\xc7\x42\x96\x49\xf2\x42\x3d\x9b\xbc\xf8\x15\x92\xf3\xeb\x23\x8b\x3a\xf1\x14\x2f\xce\x64\xe8\xab\x91\xc2\x35\xf6\x1b\x22\x24\x14\x60\xec\x92\xfa\x31\x31\x0c\x05\x17\x3e\x4b\xdf\x37\x06\x2b\xb4\x51\xfd\x91\xc8\x04\x0b\x5c\x17\xe0\x58\x70\x9c\xf3\xc8\x05\x8d\x68\x29\xff\x9a\x60\x51\x8b\xbd\x08\xaf\x56\xed\xed\xf5\x0e\x92\xcc\xa9\xac\xe5\x8b\xda\x17\xda\x13\x1a\x9a\x97\xca\xc4\x1f\x27\xdb\x07\xce\x81\xa3\xd9\xe1\x86\x8d\x14\x7e\x80\xfa\xae\x07\xe8\x53\x36\x51\x73\x68\x49\x88\xc9\x72\xeb\xce\x54\xee\x3a\x67\x0b\x1d\xb0\x4b\xa1\xf7\xda\x96\x47\x3b\x7c\xc8\xf0\xa0\xc9\x29\x55\x2f\x9d\xd2\xa4\xab\xcf\x9c\xa7\x49\xa4\xe2\x0d\x1a\x22\x24\x73\xc7\x80\x79\x42\x73\x41\xe4\x1f\x57\xbb\x54\xfa\x3c\x78\xea\xf6\xc1\x15\xd2\x4d\xa6\x98\x23\x77\x34\x4b\xde\xde\xdf\x3f\x23\xf8\x25\xb9\x97\x7f\x8f\x48\xf6\x34\x16\x89\x65\x6c\x08\x50\x8e\x28\x99\xbb\x36\x63\xd5\xd9\xad\xa9\x0d\xe8\x40\x42\x67\x1a\xf3\x35\x24\x30\xc4\xa1\x76\xc0\xc3\x52\xa9\x73\xba\x46\xe3\xa1\xff\xa2\x76\xe7\x39\x36\xd0\xb8\x73\x41\x9c\xf3\x3f\x01\xbc\xbf\x2a\xab\xc8\xb1\x8e\x15\x7d\x04\x4e\x9f\xae\xf4\xaf\x39\xde\x25\xcc\xb5\xee\x37\x41\x15\x7b\x1e\x64\x06\x67\x4c\xb6\xca\xa2\x0b\x11\xb3\xce\x48\x83\x0e\x17\x40\x2f\x62\x43\xa5\x4d\x01\x19\x7c\x7f\xbf\xd5\xcb\x07\x53\x36\x34\xcc\x99\x5e\xe7\x0d\x30\x87\x51\x97\x4e\x68\x92\xd1\x61\x82\x31\xfa\xbc\x5c\xd7\x79\x89\x15\xf8\x32\x45\x30\x06\xff\xd8\x02\x3d\xbf\xe0\x00\xaf\xec\xda\x2e\x81\x2b\xb8\x5c\xee\x6a\x70\x90\x19\xee\x07\x43\xb5\x44\x0d\xc3\xf0\x00\x65\xeb\xba\xaa\x85\xe7\x05\x95\x19\x1b\x0c\x9c\x62\x22\xd6\x41\xc5\x7e\xc4\x13\xe2\x65\x10\x0d\x3d\x97\x5a\x7a\x8a\x9d\x4d\x8a\xf0\xfa\xad\xba\xde\xe1\x21\x16\xe2\xf9\x58\xa9\x30\xae\x49\x8e\x4e\xc9\x48\x38\x42\x6e\x0e\xb9\xa2\x79\xa9\xcb\x0a\xea\x7f\x90\xe0\x7f\xb2\xae\x40\x59\x9b\x6f\xfb\x2f\xd5\x4e\x51\x65\x1f\x4c\x5a\x35\x0f\xd6\x7b\x83\xa7\xcf\xc0\x6d\x4a\x7b\x5f\xe4\xf7\x7e\x90\xce\x52\x60\x15\x8b\x38\x73\xcd\x44\x42\x84\x66\xa2\x8c\x62\x5e\x2e\xc1\xd7\xf0\x3f\x5d\x56\x25\x49\xb7\xc1\x87\xb6\xbb\x32\x47\x7c\xbf\xfd\x66\x37\xdb\xc2\xd4\x7b\x28\xcd\x82\x93\x57\x54\x0e\xf2\x67\xc4\x1a\x66\xa6\x2f\x4c\x61\x8b\xd2\xaa\x7d\x83\xfb\x63\x82\xaa\x3a\x7e\xc7\x66\x49\xe5\x94\x04\x20\x00\x4a\x79\x66\x85\x1a\x7f\x74\xdf\xe1\xb0\x87\x0a\x41\xe0\xde\xbe\xa0\xa1\xbc\x56\x8c\x18\x56\x6f\x65\x0b\xb5\x55\xf7\xb2\xa5\x22\xd0\x28\xc9\x52\x51\x61\xa9\x2c\x31\x28\x7f\xc8\xff\x68\x71\x1e\x75\xd2\x8a\x70\x43\x9b\x45\xf5\x68\xa3\x4a\x82\xc4\x5c\x4a\x0c\x1d\xe2\x89\x0e\x85\x90\x36\x95\xbf\xba\x08\xe6\x05\x85\x18\xbe\xe5\x1b\xa8\xb9\x6e\xca\x20\xa2\x2b\x1b\x0a\x4a\xd1\x26\x7f\xc4\x36\x27\x9c\x9e\x9e\xf3\xfc\x2d\x9c\xe7\x73\x4b\x14\xad\x79\x54\x13\xc2\xf3\x7a\xde\x73\xb5\x30\x38\x87\x8d\xaa\x98\xe5\x39\x80\xf8\x63\x68\x63\xf0\x64\xfc\x3c\x8a\xfa\x54\xc7\xa4\x9e\x0e\x24\x2c\x4b\xbc\x0b\xbb\x94\xea\x56\x5b\x0f\xa8\x4b\xe1\x69\xf0\x3b\x57\x2c\xa8\xa3\x95\xb7\x6b\x07\xca\xc2\x05\x02\x4a\x86\xfc\xb8\x4e\xd5\xb1\x53\x73\x06\x1e\x42\x6d\xa1\xa8\x6f\x63\xdd\xaf\x10\xc2\x4c\xc3\xfa\x46\x5a\x08\xf8\xa2\xc7\xbc\x2a\x82\x68\xfc\x72\x07\xb1\xd9\x18\x36\x6d\xc2\x4f\x15\x6a\x59\x69\xa1\x65\x05\x2d\xe7\xe3\x34\x18\xf9\xe1\x81\xef\xbc\xd9\x12\x5d\xee\xd7\x03\x44\x8f\x32\xfd\x37\xb4\x14\x72\xf5\x6d\x20\xe6\x77\x18\x2e\x6f\x41\x2e\x36\xa4\x13\x51\xa2\x4a\x04\xf2\x64\x4c\xc2\xef\x37\xb0\xf8\xbc\xdf\x64\xed\x57\xef\xa4\xd8\x15\xaf\x26\xe8\x50\x68\xff\x91\x14\xc5\xf2\x78\x8e\x34\x39\x86\x50\x6e\xd3\x51\xa5\x83\x03\xa9\x65\xa2\x60\x90\x31\xd2\x9f\xab\xa8\xb5\x6b\xaa\xad\x40\x8e\x1c\xba\xfb\x15\x2b\x59\xe7\x1b\x2b\xa2\xc4\x21\x3b\x01\x37\x0c\x44\x7e\xc3\xea\xec\xef\x26\x4e\x1c\xd0\xb3\x31\xfb\xa2\x2f\x32\xfd\x73\xa6\xdf\x66\xfa\x2f\x68\xb9\xfc\x53\x50\x1b\xeb\x53\x1a\xeb\x7b\x60\xb2\xfd\xff\x02\xdb\x1f\x03\xef\xf3\x90\x24\x4a\xa2\x7d\xa6\x95\x9f\x8c\xba\x0d\x12\x08\x9f\x26\x7e\x74\x6f\xe2\x47\x02\xda\x22\xc2\x26\x0a\x78\x93\x9a\x49\x0c\x1b\xa2\x9a\x09\xee\x55\x28\xe9\x8e\x30\x65\x30\x90\x33\xc1\xd1\xca\xcb\x7b\x62\x3d\x06\x34\xa3\xe0\x54\xf6\x27\x48\x80\xdd\xd4\x18\x16\xa4\xf3\x07\x72\x1d\xad\x51\x02\xdc\x00\xa2\x7a\x65\xb7\xb6\x5c\x89\xd4\x10\x96\x2c\x7c\x69\x36\xad\x3d\xe4\xff\x04\x43\x3e\xe6\xcb\x40\x9c\xb5\xcf\x6e\xb8\x03\x19\x7c\x5c\x09\x61\x5e\x54\xeb\xae\x69\x2a\xef\xab\xa2\xa3\x0a\x77\x56\x16\xd2\x63\x99\x48\xdd\x25\x59\x39\x98\xcf\x9d\xb3\xea\x60\x04\x93\xaa\xdc\xef\x8a\x95\x2e\xcc\x93\xbf\x67\xf7\x5c\x9b\x2f\x98\x3f\xed\xf0\x50\x2f\x2e\xe6\xb8\x5d\x76\x48\xaf\xa8\x0b\x26\x40\x31\x4e\xd5\x92\x2c\xca\x85\x1e\x49\x3b\xc3\x4a\xa2\x45\x2c\x88\x9d\x97\x42\x10\x3b\xcd\xa7\xf4\xea\x16\x11\x1f\x2b\xb6\x6d\x69\x4a\xda\x16\xfc\xec\xf4\xfd\xce\x62\x59\x83\xa8\x66\xdf\xf6\xd9\x68\xdc\xf0\x08\xe5\xb5\x1b\x5e\x1a\x2c\x26\x8c\x0e\x6d\x0c\xe8\xb7\xf7\xb3\xc5\xe0\x88\xbc\xa9\xe8\x6e\x16\xe7\xd8\xa1\x11\x64\xf1\x64\x30\x1d\x56\x54\x64\x05\xae\xe4\x5d\x6d\x55\xbc\x95\xc1\xfc\x64\xf8\xea\x81\x1d\x0b\xea\x51\x9d\xfb\x64\xf5\x07\xb3\xa5\x1d\xae\x8a\x30\xff\xfc\x85\x96\x71\x7a\x06\x2c\x9e\x8c\x16\x4c\xfe\x98\x17\xf6\x9e\x4c\xb5\x1c\x0e\x1b\xb0\xdc\x52\xec\x6b\x02\x7d\xc2\x0b\x48\xe6\x57\x42\xce\x3d\xc0\xd3\xfc\xa2\x88\x9e\x60\xaa\xf3\x23\xb0\x18\x83\x1e\x32\x53\x20\xc5\xa3\xb0\x0f\xd5\x09\x6a\x31\x0a\x61\x8c\xfc\x3a\xe0\x83\x2d\xeb\x63\xa7\xef\xb5\x2d\x28\x95\x82\x5d\x21\x8a\x62\xcf\x03\x11\x90\xc2\xd1\xe4\x26\xe8\x3a\xe3\x01\x06\x13\x51\x41\x4c\xc7\x01\x6d\xc7\x85\x85\xc0\xac\x1b\x8a\x7c\x9f\x84\x99\x3c\x21\x68\xcf\x37\x3e\x10\x9f\x27\x6f\xc3\xf6\x5c\xd1\x69\x9f\xc2\x23\x57\x15\x68\x5b\x06\xac\x82\xba\xbc\x7c\xc5\xeb\xe2\x0a\x7f\x77\x65\x39\xa8\x1e\x54\xdd\xd9\xf4\xe4\x24\x28\xb9\xb6\x98\x10\xc6\x4f\x73\xf9\xc7\x8d\x24\x69\x3c\x98\x5a\xe8\x75\x3f\xd3\x6e\xaa\xaa\x1c\x3d\x35\x38\xcf\x1a\x11\x74\xed\x3e\xa0\x2a\xf2\xa5\x5f\x66\x51\x3e\x9b\x79\xe8\x2d\x26\x1c\x7f\x32\xeb\x8e\x5e\x34\xa5\x18\xd6\x02\x2f\x13\x1e\x58\x4c\xc9\x76\xd5\x17\x94\x44\xe1\x8b\x4f\x56\xde\x1b\xbc\xaf\xfa\x74\x14\xc2\xc1\x03\xeb\xa7\xce\xfd\x7e\xaa\x7d\x47\x4b\x45\xdb\xfd\x39\x2e\x49\x0f\x4c\x18\x6e\x90\x32\x22\x73\x54\x0a\xd9\xa1\xc2\xcb\x07\x16\x6d\xd2\x87\xa3\xd7\xbe\x4a\xaf\x7d\x11\x96\xa1\xf1\xea\x50\x3f\x8f\x5e\xb4\x78\x45\x79\x23\xe0\xbe\x36\xdb\x87\x38\x17\x09\x65\xbe\xe9\x50\xf7\x5d\xdf\x8e\x8f\x70\x8f\xc6\x00\x0e\xa3\x7f\x2d\xfc\x5d\xf4\x71\x82\xfe\xcb\xd5\xf9\x4f\x7f\x17\xf1\x97\xe7\xf5\x5f\x5e\xbd\x7d\xf3\xb6\xad\xff\xf2\xfa\x4f\xfd\x97\x7f\xcc\x9f\x67\x88\xa7\x40\x35\x75\xfa\xa7\xc1\x2b\x7d\x57\x6e\xab\x1a\x6a\x3e\x4c\x47\x43\x50\xc0\xbe\x9c\x7c\xfe\x3c\xb9\x99\xe9\xcb\xc9\xf4\x76\x32\x05\x2d\x52\x35\x9e\xa1\x14\x29\x08\xa7\x7e\x18\x4f\x3f\x83\x58\xe9\xd5\x64\x84\x3f\x27\xb5\x72\x92\x07\x46\x61\xeb\xd1\x6c\x10\x85\x7a\x49\x18\x75\xfe\x69\x3c\x53\x2c\x63\x1e\xbe\x0d\x6f\x1e\xe9\xe1\x8d\x1e\xce\xe7\x93\xe9\xcd\xe8\xcb\xf9\xe5\xf5\x78\x74\x33\xd7\xd3\xd1\x35\xbc\x7f\xf6\x69\x7c\x3b\xe8\xb4\x50\xd1\x6b\x67\xa8\x32\x8b\xba\xb4\x24\xc2\xca\x12\xe9\xe7\x41\x22\xbd\xfb\x7d\xfd\x79\xf8\x5f\xa0\x09\x52\xe2\x7c\x3a\xfa\x38\x9c\x5e\x8d\x6f\x3e\x92\x34\x71\x7c\x26\x4b\xb2\x67\xd8\x77\x12\xc3\x9e\xb5\x25\x6b\x49\x53\xb7\xa5\x50\x3b\x9e\xcf\xf4\xdd\x6c\x34\x50\x2a\x90\x92\xfd\xf3\x41\xd1\xf7\x74\x38\xd3\x57\xa3\x0f\xe3\x9b\xd1\x95\x7e\x3f\xba\x9e\xfc\x7e\xd6\xab\x00\x3f\x02\xb5\xed\x59\x10\xf7\xee\x0e\xc7\xdd\xfb\xeb\xf1\x65\x90\x89\x3f\x3d\xb9\xbc\xbc\xbd\x3e\xd1\x93\xa9\x3e\xa1\x9f\x01\x4b\x98\x5f\x8b\xef\x98\x8f\x2e\xe7\xfe\xbd\x5f\xf4\xe5\xe4\xf6\xcb\x74\xfc\xf1\xd3\xdc\xf7\xef\xc7\xc9\x54\xa1\x5e\x70\xaa\x9a\x3b\x00\x41\x31\xd2\x12\x0f\x8f\xc2\x4f\xce\x3f\xf9\x29\x4c\xe4\xc4\xa3\x7a\x78\x98\x76\x50\xc4\xe5\x37\xf9\xe5\x84\xed\x00\x45\xb8\xd1\xd5\x40\xa9\xf7\x5f\xf4\xe8\xaf\xa3\xe9\xe5\x78\xe6\x67\x01\xc4\xd8\xfd\x67\x83\x04\x3c\xbc\x31\x8c\xce\xa7\xd1\x74\x84\x2a\xed\xc3\x4b\x10\x2c\x07\xb5\xe3\x8f\xd3\xd1\x48\xcf\x27\xea\xfd\x48\xbf\x9f\xdc\xdd\x40\xff\xba\x23\x18\xe4\xd1\x53\x9d\xe0\x44\x6c\xff\xf3\xf0\x8b\x7e\x3f\x02\x11\xdf\xf1\x15\xa8\xa6\xcf\x27\xfe\x07\x43\x21\x6c\xed\xbf\x8b\x9f\x9f\x4c\xf5\x47\xbf\x92\x66\xd0\x22\xff\x73\x6a\xbb\xff\xf0\x10\x66\xd8\x37\x58\x8f\x6f\xc2\x13\x71\x83\x4d\x3e\xf8\x6f\x4c\xa9\x13\xc3\x9b\xcb\x51\xd0\x52\xc6\x36\xfb\x6e\x5d\x4e\x6e\xae\xc6\xb0\x1f\x48\x1f\x71\x20\x89\xc8\xe0\x45\x9e\x40\x2a\x0c\x6e\xd9\x13\x22\x33\x18\x94\xef\x6b\x31\x88\x7f\x07\x02\x5c\x55\xa7\x3f\x89\x22\x37\x6a\x5b\xdb\x73\xfb\x8d\x54\x7e\x41\x0f\x47\x88\x13\x04\x22\x31\x32\x62\xc2\x3b\x33\x24\x2e\xe3\xd9\x83\x1c\x3b\x71\x7f\x7b\x7f\x12\xb8\xb9\x31\xbf\x00\x24\xe4\x18\xef\x31\x91\xa1\x07\x10\x3d\x62\xee\x3d\x71\x63\xb7\x0f\x55\x09\x25\x5b\xfd\xc5\x2f\x18\x3d\xa2\x14\xb4\x75\x7a\x99\x97\x76\x63\x9a\x0a\x2e\xf1\x7c\x29\xda\xd7\xb2\x2d\xfc\xd7\x95\x64\x4d\xe3\x20\x84\x3c\x3f\x50\x62\x3b\xac\x68\x43\xd9\xc6\x84\xdb\x63\xca\xbd\x02\x2b\xa1\xb6\xcb\xea\xbe\xcc\xff\x0d\xd2\xe5\x09\x8d\xbb\x79\x88\x0a\x43\x19\x4b\x0f\x92\x9c\x05\x4c\x11\x79\xd5\xc1\x0d\x52\x46\x5f\x12\x44\x8d\x0b\xdc\x30\xa1\x34\x9a\xe7\xa6\xd4\x71\xce\x85\x18\x43\x30\x89\x65\xbd\xac\x97\x90\x0b\xc2\x30\x1c\xe7\x52\x2b\x39\x1d\x18\x74\x03\x16\x74\x5d\x95\x42\xf5\x32\x3e\x8c\x98\xd1\xe7\xfd\xcc\x68\x05\xcc\x68\x7d\x7a\x02\xcf\xc8\xcb\xfb\x93\xb3\x3e\x5f\xe4\xfb\x3a\x0b\xc1\x85\x93\x38\x84\x71\x47\x2c\xe3\xb0\x82\x91\x78\x60\xcd\xc5\x25\xaf\x6c\xb9\xdc\x2f\x8b\x6a\x6b\x57\xb9\xa1\x44\x62\xd9\x3c\x00\x42\x99\x12\x15\x62\x6c\x5c\x16\x87\x06\x96\x5c\x20\x58\x3b\x91\x9e\x21\x91\xa9\xba\x2d\xd7\x2c\x98\x58\xf8\x91\x22\x77\x4d\x4a\x93\xb8\x38\x5d\x9f\xa1\x54\x45\xa6\x62\xf1\x00\xc4\x69\xf0\xb0\x3b\xcb\x5d\x84\xd6\xc6\x6d\x48\x1f\xc8\xeb\x90\xb8\xce\xc4\xaa\x53\x89\xd2\x2f\x1a\xac\xa0\xd9\xd0\xdd\x27\x31\x65\x09\x8d\xf3\xa6\xbc\x2d\x9b\xbc\xb6\x50\xfb\x4e\xef\x4a\x46\x4f\xe1\xce\x30\x45\x45\x8a\xb5\x49\x75\x58\xae\x37\x57\xc6\x92\x5e\x19\xd6\x29\x0e\x8d\x82\xc8\x29\x05\xe7\x54\x3b\x2e\x87\x63\x84\x00\x3f\x2a\xcf\xc2\xd4\xd8\xa6\xba\xb7\xe4\x44\x58\x40\xd9\x6e\x16\x05\xb4\x15\xd0\x37\xbc\x08\x1e\xad\x02\x96\xd0\x40\x0f\xfb\xf7\xa1\xfe\xee\x7d\xa8\x4e\x4d\x54\x53\x87\x4c\xd0\x59\x7b\xb5\x76\xab\xc4\x40\xd4\xe6\x24\xc8\xde\xd9\x93\x48\xaa\x6c\xd7\xf2\x4e\x9c\x68\x79\xae\x50\x24\x88\x85\x63\xc3\x54\x11\xe8\x55\x3b\x83\x6c\xa8\xe0\x1f\x96\x6e\x8d\xb9\xa2\x50\x98\x1e\x83\x35\xc1\xe3\x3f\xe9\xe5\xc4\x65\xe2\xef\x7e\xba\x90\x1e\xc7\x44\xb9\x10\x6a\x81\xa0\xfb\xa9\x3b\x53\xa1\x21\xcf\x94\x42\x45\x3a\xf7\x49\x28\xdc\x33\x04\x0f\xf2\x84\x71\x5c\x04\xe3\x5c\x1a\x52\x2f\x3a\x76\x5d\x34\x0f\x92\x1e\xf9\x7c\x83\x9f\x1e\xaa\x50\x72\x2a\x34\xb7\xaa\x75\xbe\xd6\x65\xa5\x7a\xe9\x80\x4b\x53\x42\x8c\x8a\x90\xa0\x20\xa1\xf1\x10\xab\x67\xd5\xef\x58\x96\x83\x83\xe3\xfa\x34\x3f\x53\x9d\x4e\xc8\x8b\x0c\xce\x66\xd0\xe0\xcd\xb4\xcb\xcb\x7b\xeb\xff\x02\x87\x70\x0e\x23\x00\x67\x76\x8d\x90\x36\x02\x71\x20\x38\x1d\x3b\x00\x22\x2e\xa4\x51\x6c\x8b\x1c\x33\x0f\x16\xb2\x83\x99\xde\x16\x66\x0f\x92\xe2\x21\xa8\x96\xe6\xa2\xa9\x1d\x47\xce\x43\x1d\x81\xcb\x7c\x65\xaf\xab\xe2\x6b\x51\xd5\xf6\x9d\x3e\xcd\xf3\x33\x9a\x21\x25\x3a\xc7\x07\x21\xc7\x4b\x57\xbb\xa5\xad\xf5\xc2\x72\x84\x13\x9b\x1f\xf5\x1f\x69\x6c\x7d\x6f\xd6\x79\xed\x1a\xb5\xce\xbf\x11\x28\x0e\xc4\x29\x5c\x77\xd0\x22\x5e\x1f\x3e\x00\xc3\x9e\xf9\xf6\x84\x06\xc1\x68\xfb\x1d\x21\x4e\x62\xda\x38\xf7\x26\x5c\x58\x48\x73\xf7\x9b\x62\xc3\x02\x33\xe1\xf3\x48\xef\x3f\xf1\xab\x42\x6e\x89\x30\x56\x8c\xec\x97\xe3\x15\xca\x40\xb7\x56\x7d\xa7\x56\x4b\x47\xd0\x5b\xe6\x97\x29\x06\x4e\x04\x67\xee\x10\xbf\x38\x53\x0e\x8a\x12\x82\x4e\x2f\x9e\xf4\xd4\x02\x0c\xae\xf9\xb3\xd0\x34\xc0\x7f\x22\xbb\x06\xe2\xdd\x54\x10\x0b\x2b\x2a\x63\x18\x26\x4e\xac\x10\xbd\x0a\x7c\xf3\xaa\xde\x48\x03\x70\x51\x55\xde\x1e\x30\x9b\xed\x43\x61\x1b\x21\x8e\x48\xd2\xf3\xef\xfc\xe6\xb4\x58\x03\x5d\x99\xd5\x0a\x41\x30\xce\xd6\x1b\x9c\xeb\x78\x05\x86\xfb\xca\x6c\x2c\x55\xbe\xf1\x5f\x5e\xd5\x06\xc2\xf5\x90\x4d\xa2\xbf\x57\xe7\x64\x8e\x28\xff\x45\xff\xa9\xe5\x43\x55\xdb\x60\xe8\x3d\xd1\x96\xb5\x7e\x7d\x37\x26\xc7\x3a\x0d\x79\xa9\x57\xbb\xcd\x42\xbb\x87\xea\xe9\x9d\x30\x69\x96\xd5\x66\x5b\x39\xd8\x97\x54\xac\xa1\x0e\xc3\xff\x54\xd5\xb0\x8e\x3a\xb6\x24\x5e\x10\x95\xd0\x5e\x30\x0e\x59\x22\x40\xb5\xf1\x9b\x44\xd1\x40\x62\xa4\xd0\x04\x8a\xbb\x29\x4d\x51\xdd\x57\x3b\xac\xdd\x28\x9f\xbb\x7f\xc7\x26\xa0\x37\xc6\x6a\xf3\x04\x1b\x78\x6b\x72\x10\x45\xc8\x94\xa9\x97\x0f\x79\x43\xa3\xa9\xdd\x72\x57\x6c\xf1\xaf\xb6\xbc\xaf\xcd\x23\x49\x00\x14\xbe\xed\xf1\x79\xdb\x87\xaa\xd3\x6c\x75\xa4\xd9\xfa\x25\xcd\x8e\x0f\xdd\xbf\x53\xb1\xcd\x2c\x8b\x61\xea\xe6\x1d\x20\xa1\x8b\x62\xe7\x82\xd4\xff\xc6\x6c\xe1\xf0\x29\x33\xed\xbe\xda\x66\xf9\x40\x34\x0c\x6b\xcf\x57\xf9\xc6\x96\x0e\xf9\x62\xf0\x30\x34\x0f\x31\x45\x7c\x4f\x33\xbb\xcf\x74\x53\x6d\xc3\xdf\xe5\x68\x80\xf9\xe4\xd7\xff\x12\x16\x8d\x38\x14\x7c\xf3\xc2\xe6\x7d\x27\x0f\x22\x98\xd6\x6a\xb3\xcd\x0b\x23\xc9\xe6\x2d\x10\x06\x26\xdf\x89\x93\x8e\x64\x2d\x01\x8b\x87\x6b\x18\x17\x21\x00\xad\xa0\xed\xf4\x76\x1e\xc0\x47\x53\x03\xa7\xa4\xaa\x91\x10\xe9\xc2\x07\x6a\xd5\xf7\xae\x84\x88\x93\x98\x16\x87\x4f\x64\x94\xdb\x38\xf9\x52\xed\x82\x71\x5b\x3e\x4b\x5d\x3f\x28\x45\xef\xed\x20\x40\x3a\xa0\x98\x06\x62\xd7\x8b\x3d\x25\xe5\xed\xea\xf0\xbd\xad\x5b\xe5\x6d\x55\xe2\x63\xf2\x63\x83\x2a\x3d\xa3\x10\x44\x8e\xf0\x28\xc3\x51\x1d\x6c\xb2\x5e\x59\xb7\xcd\x41\xed\x37\x80\xed\x03\x86\x00\xd5\x42\x48\x2a\xad\xd8\xeb\x5b\x1c\x7f\x61\x58\xf1\x95\x47\xa6\x54\x6d\x97\x81\x49\x2d\xcd\x27\x7f\xd9\x62\x16\x8c\xf3\xd6\x1d\x1b\xac\x72\xb6\xe7\x29\xd9\x21\xc1\x8b\x44\x58\x70\xaf\x9f\x72\x5c\xcb\xfe\xff\x90\x55\x8b\x9f\xa7\x4c\x09\x9d\xc3\xd2\xcb\x78\xc7\xa6\xa1\x3a\x64\x1a\xfe\xce\xb6\x31\x15\x5a\x7e\x32\x44\x2a\x3c\x28\x40\xa1\xa2\x00\x85\xa3\x7a\x9a\x07\xf4\x27\xf0\x9f\x47\x04\x28\xde\x29\x31\xc0\xd1\x12\x7d\x91\x1c\x48\x2c\x33\x2c\xb4\x38\x54\xfa\x5d\x6e\xbb\x18\x11\x39\x69\x32\x95\xb7\xd8\xb7\xc6\x51\xc9\x93\x02\x32\x96\x7c\x54\x10\xa7\x23\xfe\x3b\xb4\x3c\x69\x6b\x78\xb6\x72\xf9\xbd\x9f\x67\xb6\x4d\x6a\x14\xf9\x72\x28\x8e\x72\x32\x65\x9c\x78\xdb\x9a\x47\x23\x3d\x59\x65\xfd\x2f\xe8\xa9\xf1\x01\xe5\x8b\x01\x7c\x51\xd5\xfa\x31\x77\x3b\x90\x90\x24\xc9\x2e\x97\x96\xde\x03\x1b\x2d\xff\x66\x82\x27\xc8\xc8\x75\x50\xf5\xa0\x5f\x1c\x1c\x38\xd7\x54\x75\x28\xf2\x11\x0e\xc3\xb6\xf1\x15\xc3\x32\xfe\xae\x15\x16\x43\xbc\xe9\xc1\x19\xad\xab\xd2\xaf\x32\xe0\x66\x20\xff\xe3\x83\xc9\x6b\x7d\x85\x32\x52\x8c\x3b\xee\x24\x8a\x45\x9e\x3f\xe8\xfa\x00\x53\x4a\xc2\x1a\xb0\x6c\x09\x22\x1b\x18\xc0\xe0\x97\xae\x25\x38\x47\xa2\xd4\x19\xb8\x8c\x78\x20\xc2\x07\x44\x15\x03\x05\x66\x6e\x50\x68\xc0\x18\x4d\x6d\x23\x32\x6b\x8d\xa8\xc2\x1e\x71\x1c\xf1\x9e\xa8\x67\xd2\x51\x37\x2d\xcc\x93\x88\x81\x45\xfd\xd5\xc2\x3c\x39\x64\x79\x70\x9f\x3f\xa2\x9a\xe9\xf7\x28\x7c\x04\xa4\xdc\x1f\x97\xf5\x88\x1a\x1e\x7e\xaa\xb7\x16\x62\x01\xa7\x5c\x16\x62\xb5\xab\x93\x00\x8f\xe8\x40\xe8\xe2\xd9\x41\xc1\x8f\x20\xed\x18\x9d\x42\xe3\x18\x8d\x03\x31\x0d\x64\x6d\x34\x95\x0e\x9b\x47\xac\x4d\xa8\x45\xb4\x24\x0d\x7a\x19\xad\xf2\x4e\xbd\x8c\x2b\x44\x97\xdd\x81\x0c\x5a\xff\x03\xfd\xbb\xc5\xf3\x82\x36\xb7\xf8\x36\xba\x13\x10\x4c\x6a\xaa\x28\x4b\x8f\x47\x61\xfb\x6e\x91\x0d\xe2\x4d\xd4\x7d\x85\x12\x8f\x0f\x48\xaf\xa3\xb0\x36\xe4\x1c\xde\x54\xe5\x79\xe0\xa2\x5e\x06\xfa\x69\x58\x2d\x33\x20\x9f\x3a\x60\x9f\xe2\x95\x24\x41\x0a\xb1\x60\x95\x4a\xb8\x2d\x1d\xa6\x6d\x08\x17\x00\x25\xb9\x9f\xf2\xaa\x03\xe5\x55\x21\xe5\x55\x20\x60\x10\x46\xd2\x42\xe2\x05\x9a\x2b\x1a\x3e\xb4\xc0\x3a\xad\x50\x29\xe1\x95\xa5\x8c\xe3\x1a\x22\xbc\x18\x23\x61\x52\x55\xb5\xae\x81\xf0\x4e\xa9\x3c\x1f\xe8\xdf\xff\x06\xa3\xa6\x83\x10\xe1\xdf\x60\xd4\x88\x28\xac\x28\x86\xd0\x3b\x64\x44\x8b\x3e\x3e\x60\x2d\x86\xb0\xfa\x5f\x1e\x30\x5a\xee\x40\xf0\xfc\x2d\xb0\xa0\x3b\x83\xd5\xa7\x5b\x72\x7c\x59\x45\x56\x44\x62\x35\x54\x75\x08\xec\x20\x06\x3f\x48\x9b\x87\xc7\x63\x28\xda\x72\x65\x24\x49\xdd\x56\x4c\xdd\xc6\x53\x7a\xb5\xc9\x4b\x28\xa6\xe6\x04\x83\xbb\x3d\xe8\x2e\xd3\x8f\xb9\xc1\x6f\xd0\xd7\x33\xb8\x04\xd4\xff\xca\xc0\x51\xe5\x45\x08\xf7\xf1\xa7\xc9\xe5\xe6\x47\xae\xfe\xb0\xcc\xcc\x0a\x2b\xe5\xe3\xb0\x27\xaf\x90\xcc\xcf\x58\x67\x1d\xd4\xa5\xfd\xc2\x48\x80\x17\xe0\xc5\xd4\x42\x9f\xa6\xd8\x1f\x96\x81\x11\x22\xbc\xa4\x57\xd7\x6e\x74\xa6\x16\x3b\xe9\xb3\xec\x99\xd1\x55\x56\x41\xae\x9b\xda\x12\x63\xa3\x2e\xb9\xcd\x02\x30\xf2\x74\x7d\x96\x29\xa9\x84\x0f\x05\x0c\x18\x5a\xc6\xa3\xbe\xd8\x0b\x81\x9f\xda\x6a\xba\xd9\xe8\x6c\x59\xa1\x74\xd0\x34\x51\x2c\x99\x8b\xf2\xe3\xfc\x18\x49\xf9\xa2\xd1\xec\x50\xd6\x65\x2d\xbb\x80\xf8\x8f\xe8\x9f\x48\x25\x97\x02\x29\x78\x75\x31\xab\x55\xdc\x15\x55\x7d\xe4\xaa\x00\x7e\x5f\x37\x32\xaa\x92\xd5\x15\xb9\x6c\x81\xce\xc7\x75\xa8\x22\xd3\xb7\xcc\xe1\xc9\x53\x26\x96\x8e\x39\x34\x59\xab\xd3\xbb\xe9\x18\xa2\xd0\x59\x8f\xe7\x66\x01\x43\x2e\xcb\x5a\x41\xc3\xfc\x2b\xfb\x3b\xa1\xa8\x13\xcf\x2b\xc2\x50\x6f\x4a\x19\x8c\x06\xae\x37\xd9\x6a\xfe\x50\xed\xf7\x29\xf9\x32\x6c\x63\x1f\x5b\x62\x2d\xec\x56\x04\x67\xb1\x67\xb7\x36\x15\xbf\x95\xbf\xdc\x1b\x88\xb6\xad\xd1\x36\x7b\x45\x85\x10\x82\x35\x43\x2f\x14\xd3\xf1\xd5\xda\xad\x37\x3f\xcc\x12\xa5\xda\x91\xd1\xee\x04\xa5\x3d\x14\x0f\x0c\x24\x8a\x72\xf5\x1c\xcb\xfd\xb9\x79\x51\xc7\x17\x17\xf0\x1b\xca\x23\x13\x28\x57\xa1\x42\xd3\x4a\xce\xa4\x98\x40\x1b\x54\x79\x9a\x44\xc2\x29\x68\xe2\x8a\xb9\x55\x9d\xb9\x95\xd3\x67\x0e\x4c\x5e\x10\xf6\xf8\x9b\xcf\x22\x94\x17\x0d\x1c\xcb\x53\x73\x26\xc5\x65\x8f\xd9\x80\x32\xe5\x83\x3a\x29\x30\x81\x82\x94\x89\x25\x5f\x53\x5b\x51\x1b\x00\x89\x85\x58\x06\x1a\x82\x8d\xb3\xc5\x9a\x8a\xaa\x4a\x31\x0c\x95\x58\xf3\xed\x4c\x08\x2b\x5d\x84\x6a\x46\xb2\x41\x90\xb5\x27\xe9\x84\x70\x71\x85\x93\x91\x97\x66\x87\x58\x14\xd9\xdb\x19\x13\xc4\x43\x5b\xe3\xe3\xe1\x61\xcb\xda\xae\xf2\x06\xe5\x35\x63\x35\x81\x38\x94\x8b\xb3\x8c\x7f\x09\x54\x74\xcc\xb6\x52\x9b\xe3\x92\xcb\x9e\x39\xf9\xea\xc4\x4e\x8f\x2d\xe7\xea\xa6\x86\xdf\x10\x09\x65\x30\x84\xdb\x5d\xed\x76\xa6\x4c\xee\x90\x37\x40\xc3\x69\x6f\xc7\xe0\x92\x28\xde\x98\x9c\x89\x0b\x88\x07\xf2\xeb\xb2\x16\xb5\xbf\x09\x42\x02\x3a\x48\xd9\x92\x1a\x93\x0a\x25\x15\x7f\xd5\xa7\xf9\x19\x7c\xb4\x34\x9b\x80\xd1\x6c\x25\xb0\xf4\xa9\xf7\x92\x59\x83\x03\x91\xed\xc1\x69\x3a\x53\xf9\x3a\xc8\x90\x04\x01\xa2\xbc\xff\x41\xf4\xdb\x30\xd5\x41\xcb\x83\xeb\x5e\x2a\x04\x18\xfb\xf7\x61\x89\x46\x7d\x6a\x07\xf7\x83\x4c\x1b\xd6\x7f\x02\xb8\x2f\x64\x36\x33\x4e\x55\xf9\x6b\x0c\xe3\x84\x99\xfe\xd7\x6a\x57\x97\xa6\x80\xab\x42\x49\x45\xa7\xd3\x13\x81\x22\xd3\xb7\xf8\xf4\x13\xc8\xb0\x70\x73\x7e\x70\x1d\xe5\x90\x2c\xa6\x3c\xa8\xd6\x17\x24\xc4\xf7\x49\x9d\x0d\xd4\x71\xc0\x1c\x9f\x1c\x4a\xac\x39\xdc\xea\xd0\x3b\x05\x99\x26\xd8\x39\x79\x53\xd8\x14\x67\x10\x87\xf2\x1d\x65\x80\x5e\x22\x66\x80\x5c\xe2\xbb\xe9\x38\x16\x0d\x86\x93\x26\x12\x5f\x48\xad\xd0\xd1\x3e\x36\xce\x1b\x8e\x86\xf5\xb5\x84\x83\x8a\x0b\x17\xdd\x98\xbb\xe9\x58\xf2\xb8\xc3\x55\x60\x3b\xc3\xa4\x43\x55\x1b\x8c\x7c\x44\xa9\x06\xf6\xba\xf1\xd6\x99\xa3\xc6\xcc\x2a\x4f\xab\x7c\xa4\x5c\xf2\xd3\xc5\x59\xc0\xcf\x6f\x88\x54\x4e\xc7\x5a\x28\x0a\x23\xa4\x33\xde\x85\xc0\x46\x26\x54\xad\x50\x92\xa2\x95\xaa\x94\x67\x90\x69\x94\x09\xc4\x09\xe8\x2e\x35\x0c\x32\xe4\x66\xbb\xb5\x06\xe9\x7d\x86\x7f\x01\xae\x49\x51\x88\x64\xbf\xf7\x8e\xb1\xc4\x96\x0a\x1c\x42\x71\x98\xfa\x47\xb0\x88\x80\x71\x12\x81\xeb\x78\x18\x5c\xc8\xb1\x32\xa5\xd2\x34\x0a\x8b\x31\xa3\x04\xd9\x26\x2f\x41\xcc\x8a\x0a\x67\xd3\x97\xf8\x0c\x68\xa3\x0f\x62\x83\xc0\x1b\x57\x87\xb0\x32\xa1\x24\x28\x98\x6e\x64\x18\x3c\x33\x31\xaa\x07\xb0\x22\x37\x58\x28\x19\x03\xdd\x80\x02\x67\xbb\x86\xcc\x53\xc8\x68\x2e\x64\x18\xff\x10\x07\x32\x84\x7f\x5a\xd7\x39\x28\x9d\xa1\x04\x96\xfd\x16\xfe\x85\xda\x63\x2a\x48\xce\xc1\xd1\x9f\x86\xb5\x32\x3e\x38\xa0\x0c\x1a\x64\x14\x82\x06\x1e\x5b\xc3\xad\x63\x2a\x8b\x9c\x3f\x3a\xb0\x7a\x8e\x0e\x14\xf6\xdd\x6e\xeb\x6a\x5b\xfb\x9d\x94\x11\xab\x51\x33\x17\x10\x31\xdc\x22\x95\xc0\xd9\x39\x84\xb7\x20\x1e\x24\x8b\xc9\x04\x89\x5d\x97\xa9\x85\xd6\x99\xac\xa8\x8d\xfa\x05\x6d\xa4\x52\x01\x88\xd5\x32\x47\x8b\x6d\x77\x04\xa4\x90\x40\x40\xfb\xf0\x00\x8f\x20\x8d\xfd\x05\x32\xec\x34\xaa\x8b\x1c\xb7\xde\x62\x0c\x8d\xca\xbb\x2e\xf6\x6c\x6f\xe0\xeb\x79\xcb\xf8\x79\xed\xbd\x69\x61\x79\xac\x72\xd7\x54\x75\x93\xa9\x8d\xbf\xd7\x60\x54\xc1\x6f\x44\xc1\x34\xef\xbf\xb1\x1c\x40\x5d\xdd\x1b\x08\x6b\x98\x90\x8d\x0e\x88\x2e\x69\x52\x61\x98\xe9\x09\x28\x62\x0b\x50\x0b\xf8\xd7\xdd\x0a\xd5\x05\xe9\x63\xad\x25\xf3\x83\xd3\x0f\x55\x89\xc3\x56\xdb\xed\x2e\x70\xe3\x50\x93\x73\x9a\x6a\x33\x64\x6d\xdd\x89\x28\x4a\xa1\xd4\xdd\xcd\xf5\x68\x36\x43\x54\xea\xef\xe3\xd9\x48\x7f\xbe\x9b\xdf\x0d\xaf\xaf\xbf\x20\x30\xf4\x4a\xcf\x27\x0c\x08\xbd\x1d\x4e\xe7\xe3\xd1\x4c\x8f\x6f\xf4\xef\xd3\xf1\x7c\x7c\xf3\x31\x8b\x50\xce\xc9\x87\x0f\xa3\xe9\x2c\x02\x75\x01\x4e\x0c\x48\xcc\x80\x1c\x9e\x8e\x6e\xa7\xa3\xd9\xe8\x66\x8e\x38\x65\x3d\x99\x0a\x30\xb1\xac\xbf\xab\x2f\x27\x37\x97\xa3\xe9\xcd\xf8\xe6\x63\x78\x60\xa6\x47\x7f\xf5\x5f\x9f\x65\x7a\xfc\xf9\xf6\x7a\x3c\xba\xca\xf4\x6c\x3e\x9c\xdf\xcd\x27\xd3\x2f\xfe\x51\xa1\x07\x99\x1e\xdf\x5c\x5e\xdf\x5d\x41\xfb\xb8\xcc\xef\xf5\xf8\xf3\x18\xdf\x9b\xa9\xf4\xa5\xf3\xf1\xfc\x7a\x94\xe9\xcf\xa3\xe9\xe5\x27\xff\x53\xc4\x27\x67\xfa\xc3\x78\x7e\xe3\x47\xe6\xc3\x64\xaa\x87\xd8\xf7\xcb\xbb\xeb\xe1\x54\xdf\xde\x4d\x6f\x27\xfe\x35\x37\x93\x9b\xf1\xcd\x87\xe9\xf8\xe6\xe3\xe8\xf3\xe8\x66\x9e\xa9\x09\x42\x8f\x87\xef\x67\x23\x02\xa5\x5e\x0f\x01\x25\xcb\xcd\xd3\x57\xa3\x0f\xa3\xcb\xf9\x2c\xd3\xc3\xcb\xcb\xbb\xe9\xf0\xf2\x4b\xa6\xe9\x4b\x38\x34\xf8\x2d\x7a\x80\x9a\x7c\xd0\xa3\xe9\x74\x32\x9d\x65\xfa\xf7\x4f\x23\x78\xc0\x64\x0a\x30\xf0\xab\xf1\xec\x72\xf2\xdb\x68\x3a\x7c\x7f\x3d\x1a\xe8\xd9\xe4\xf3\x48\xff\xf3\xdd\x74\x3c\xbb\x1a\x5f\xe2\xd8\x5e\x4d\x10\x84\x7e\x7d\x3d\xf9\xdd\x3f\x5f\x8d\xfe\x7a\x79\x7d\x37\x23\x6c\x39\x8d\xa0\x18\xfe\x4c\xcf\x26\x08\xa1\x8d\x1f\xfc\x3c\xfc\x82\x0f\xb9\xbd\xbd\xfe\xe2\xd7\xc1\x97\xc9\x1d\x6a\x7b\x4a\xe1\x92\x52\x08\x97\xf8\x2f\x8f\x6e\xe7\x2d\x8c\xf0\x74\xf4\x2f\x77\xe3\x29\x02\xa7\x53\x84\x74\xa6\xc6\x37\x7e\x65\x8c\x7e\xf3\x9f\xfb\x7d\x7c\x7d\x1d\x17\xd4\xfb\x11\xa0\xc5\xaf\x47\xf4\x66\xc4\xa9\x7f\x21\xdc\xfc\xfc\xd3\xc8\xcf\x3b\x4c\xce\xcd\x17\x3d\xbb\x1d\x5d\x8e\x87\xd7\xfe\x79\x97\xe3\x2b\xbf\xc4\xae\x33\x40\x0d\x8f\xfe\xe5\x6e\x74\x33\xf7\xbf\xd2\xb7\x77\x37\x63\xc0\x80\x4f\xa6\x7a\xf4\xd7\xd1\xe7\xdb\xeb\xe1\xf4\x4b\xc0\xa0\x0f\xa7\x88\xa1\xf6\x8b\xa5\x8d\xbe\xa7\x29\x6a\x21\xb9\x33\x68\xb6\x1e\x7f\x88\x6d\xfe\x34\x9c\xe9\xf7\xa3\xd1\x8d\x1e\x5e\xfd\x36\x9e\x8d\xae\xf8\xe3\xb7\x93\x19\x57\x65\x57\x0c\x55\xa6\x17\xe3\xa6\xfd\xcb\x40\x0a\x0a\x44\x3d\x81\xc4\x07\xee\xfa\x78\x0f\xb6\xb6\x78\x9b\xa1\x14\x47\x3f\x85\x1f\xb8\x7f\x70\xa8\x2d\x6a\xc0\x0a\xa6\xb1\xba\x43\x1e\x55\x84\x80\x49\xe8\x17\xa5\xbd\x1f\x6d\x4c\x50\x8b\xa3\x32\x7a\xa7\x7d\x97\x6c\xb0\x97\x18\x16\xa8\x90\xe0\x0e\xf8\xca\x48\xc3\x8b\xca\x01\x21\x87\x04\x16\x53\xde\xdf\x22\x22\x78\x2a\x16\xb1\xe8\x56\x27\xf7\xe6\x43\xa4\x0d\x4a\x86\xf8\xeb\x0e\x49\xdc\x37\x4d\x31\x53\x9c\x43\x32\x6d\xb6\x78\x02\x9a\x6d\xa5\x9b\xd0\x04\xe9\x2f\xe5\xd5\xf4\x84\xd7\xa8\xc6\x84\x4a\x73\x47\xfa\xa5\xb9\x23\x36\x84\xfc\x45\x72\xd6\xe1\x44\xaa\xd0\xa2\xec\x40\x72\x21\x44\x41\x6b\xeb\x0d\x41\x91\xec\xc1\x19\x0c\xe4\x74\x55\x08\xa1\x08\x98\x80\xa6\x3a\x40\xf3\x47\x5f\x51\x32\xfb\x3b\x36\x33\xc6\x3e\x82\x8a\xab\xed\x00\x46\xa1\x89\x00\x1e\xca\x9b\x87\x55\x6d\x9e\xd2\x70\xd7\x69\x52\x41\x27\x06\x9c\x4c\xf4\x7d\x91\xb2\x2d\x5c\x72\x70\x46\xb2\x4e\x50\xba\xb5\x03\x38\xee\x74\xc6\x95\xd7\x92\xf0\x1f\x19\xe4\x79\xb9\xb3\x41\x35\x05\x48\xc7\xf0\x61\x8c\xfe\x30\xd9\x37\x2e\x64\x15\x93\x76\x30\x19\xb8\xe9\xff\x69\xa0\x3f\xe7\x6e\x69\x8b\xc2\x94\xb6\xda\x21\x29\x61\xe4\x37\xa8\x1f\xb4\x17\x86\xa3\x42\x68\x20\xf1\x37\xfa\xd5\x9e\xaa\x56\x4c\xd0\xc8\xbc\xa3\x08\xb0\x46\x88\x59\x2f\x81\xdf\xb8\xde\x85\x4c\x45\x7a\x7a\x63\xfd\x18\xed\xe8\x27\xa8\x27\x19\xeb\x47\x53\xe4\x90\xa9\x4f\xd8\xe9\xcc\x43\x0d\xeb\x5f\xa1\x01\xd8\x08\x8d\x05\x52\xd3\xf0\x2d\x83\x87\x04\xc8\xea\x61\x4e\xf8\x0a\xe2\x88\xea\xe0\x21\x88\x2b\x80\x0d\xe9\xf5\xae\xc6\x14\xf4\x92\x61\x05\xe0\x9e\x50\xe0\x80\xa3\x96\x81\x61\x49\x00\xc0\xd8\xdf\xc0\x6e\xff\x6e\x3e\x7d\xeb\x41\x38\x46\xb0\xde\x04\xcb\xbe\xcd\x63\x3f\x3c\xd0\xa1\x21\x28\x04\xd0\x22\xb2\xe3\x1d\xa1\xfa\xd8\xeb\xd0\x0e\xe6\x8f\xd7\x4c\x70\xd7\x42\xb7\x27\xd8\xf7\xa0\xb3\x90\xdf\x97\xa8\x9a\xc8\x03\xb5\xa7\x80\xc0\xf2\xc1\xd4\xf7\x1c\x0d\xe8\x7f\x2a\x22\xab\x93\x4b\x50\xa2\xcc\x21\x48\x01\xf8\xf9\xc8\x69\xd5\x0b\xdb\x3c\x59\x92\xd0\xe3\x79\xf1\xaf\x88\x35\x3b\xc5\x32\x6f\x49\xec\xcc\x51\x31\x09\x34\xb4\x3a\x82\x19\x91\x36\x8b\xc8\x89\x54\xfa\xac\x05\xe7\x8a\xaf\x80\x73\x2c\x54\x6e\xc0\xf7\xa4\xea\x20\xea\x19\x75\x90\x30\x89\x14\x21\x07\x85\x16\xf0\xf4\x59\xdb\x33\x05\xfd\xf0\xf5\xdb\x1a\x39\x51\x5e\x2d\x88\xb4\x4a\xff\x70\xb3\x83\x8b\x87\xdd\xc1\xd0\xdd\x54\xd4\x02\x9d\x3f\xd2\x7d\xc2\x21\xeb\x4d\xf4\x85\x92\x95\x6d\xb2\x06\x04\x75\x6c\xb9\x04\xb9\x87\xb2\x85\xa6\x03\x71\xb3\xda\xac\xe1\x31\x1c\x30\x0c\xc7\x73\x0e\xa1\xf4\xb0\x7f\xdf\xdb\xba\x04\xad\xe5\x47\xbf\x08\x04\xbd\xe5\x36\xe2\x48\x40\x52\x2f\x02\x8e\xa1\x46\x1c\x60\x01\x11\xa8\x75\x2a\x2a\xe5\x54\xa5\x9e\xd9\x6d\x43\xf5\xe0\xfe\x29\xd3\x17\xbf\xfc\xe5\x97\x33\xbc\xaf\xa7\xd5\xc6\x2a\xf1\xa6\x6a\xad\x2f\x7e\x79\x7b\x81\xbf\xec\xaf\x32\x07\x1f\xf9\xe5\xad\xf8\xc8\xad\xc0\x5d\xc1\x71\x7a\x1b\x29\x2f\xe9\x97\xc2\xd8\xdd\x95\x7e\x47\x38\x23\x2b\x94\x89\x66\x9c\x42\x3c\x19\xf2\x9c\xaa\x2a\xf5\x3f\xef\x8a\xbd\x7e\xfd\x06\x5a\x7e\x71\x06\x73\xe3\x6c\xac\xe3\xb3\x6a\x4f\x05\xf8\xa9\x74\x5d\x91\x05\xe1\x0d\x80\x47\x53\x36\x2a\xd1\x6a\x48\x98\x2c\xd7\x89\x09\x00\x32\x30\xd5\x8e\xec\x87\x45\xd0\xdf\x58\x69\xb3\x24\x7c\x95\x0a\x11\x3c\x59\xc6\x47\xac\x6a\x96\x5b\xe5\xc8\x9b\xb0\x77\xbc\xd5\xd6\xe0\xd8\xc4\x2f\x30\x21\x40\x98\x42\xa1\x42\x5f\x61\x9e\x82\xd6\x48\x2c\x7d\xbf\xcb\x1b\x08\x1e\xf5\xad\x54\xd5\x6b\x51\x15\xe6\x29\xf2\xe3\xc4\x66\x14\xc9\xd6\x6e\x62\x5b\x85\x3b\x03\xe1\x83\x9d\xaf\xf9\xd1\xa2\x03\x17\x47\x4b\xd2\x81\xc4\xe0\xbe\x53\xed\x5b\x11\x62\x52\x09\x96\x4b\x64\x8c\x82\x02\xc3\x3a\x0a\x49\xb9\xde\xfb\xb2\x8f\x77\x7f\x03\xf1\xd4\x17\x49\x70\x74\x2f\x46\xd0\x82\xf4\xc7\x25\x25\xe2\xf6\x80\x9e\x77\x15\xd8\x77\x07\x10\x5f\x18\x98\xed\x91\x55\x88\x3c\xa1\x44\x40\x10\xf4\x44\xbd\xd9\x80\x71\xed\x1e\x35\xc1\x20\x0a\x48\x22\x7d\xb1\x0d\xd9\x71\x5c\xa0\xff\xd2\xbd\x2d\x6d\x6d\x8a\x44\x4a\x90\x05\x04\xc3\x65\xc4\x12\x82\x6d\x1d\xc0\x56\x1f\x79\x8c\x42\x29\xef\x96\x2d\x4e\x99\xf0\xda\xde\x83\xba\x55\xf3\x54\xe9\xd3\xd7\x67\x1a\x6e\x59\xe0\xc1\xa9\xbc\x47\x70\xc2\x5b\xb3\x31\xd7\x1e\xd9\x33\x1c\xb9\x32\x2d\xa9\xfc\xe0\x12\x66\x2a\x98\x47\xe0\x65\x09\xb8\x00\x10\x10\x84\x36\x2a\x9c\x94\x41\x7d\xe6\x7b\x84\x43\x3a\xc8\x5e\x23\x30\xa0\xb9\xd0\xb1\x13\x95\x6e\x2f\x6f\xaf\xb3\x6e\x3f\x8f\x48\x79\x2c\xf6\x14\xb0\xe3\x74\xcd\xf3\xd2\x1e\x4c\x5d\x0d\xd5\x5e\xdb\xe2\x1e\xea\x98\xb8\x07\xf4\x28\x09\x90\xb2\xa9\xd3\xf3\xad\x81\x1a\x96\x54\x9e\x1d\x02\x95\x3b\x21\x11\x04\x0b\x24\xf5\x46\xdb\x5f\xff\x01\x02\xf6\xe7\xcb\x5d\x0d\x4e\x56\x6c\xe8\xce\x99\x7b\xab\xef\x77\xf9\xca\x16\x79\x49\x11\x60\x0a\x90\x46\xcd\x94\x0a\xa9\x84\x4f\x76\xe1\xf2\xc6\xa6\x14\x25\xc8\xfd\x89\x02\xce\x5b\xd2\xb2\xb6\x8e\xb3\xae\xde\xcd\xf0\x33\x98\x6f\x8e\xb3\x5d\xf1\x48\x12\xe5\x2d\x22\x8a\xe3\xa0\xee\x47\x62\xff\xbf\x48\xf0\xe3\xa1\x69\xb6\xbf\xfe\xf8\x63\x9f\x06\xcc\xdf\x45\xf8\x83\xfe\x0c\x7e\xbc\xad\x5c\x73\x5f\xdb\xd9\xbf\x5c\xff\x7d\xd4\x3f\x9e\xd3\xff\x78\xf5\xfa\xf5\xcf\x3f\xb5\xf5\x3f\xde\xfe\xf4\xfa\x4f\xfd\x8f\x7f\xc4\x9f\x38\xfb\x51\x50\xfb\xb3\x29\x0d\x11\x80\x67\x7b\xd7\xd8\x8d\x52\xa7\xc8\x46\x29\xf6\xa4\xcf\x6b\x9c\xa6\x6f\x8a\xa4\x1b\xff\xe4\x97\x9f\xcf\xf4\x2d\x0a\x5f\x3b\x61\xbf\x9d\x2e\xcf\xc0\xc8\x3b\x7f\xfd\xea\xe2\x55\x06\x08\x38\xf1\xf6\x8f\x45\xb5\x30\x85\xbe\xb2\x8f\xb6\xa8\xb6\xf0\xf2\x8f\x75\xb5\xdb\x2a\x75\xf8\x51\x6f\x32\x30\xc3\xa7\xf6\x5e\x8a\x6a\x93\xed\x48\x0e\xef\xa5\x29\xf2\x75\x55\x97\xb9\x51\xea\x36\xa9\xa1\x04\xea\xec\xde\xf0\xe1\x14\x06\x5e\xec\xab\x18\x75\x80\x7d\xec\xaa\x75\xf3\x04\x3c\xa8\x12\xee\x1d\xbd\xaa\x96\xbb\x60\xad\x05\x10\x65\x50\x4d\x0e\x1e\xb3\x6d\xb9\xd0\xa6\xeb\x62\x78\x4b\x43\x42\xae\xed\x2a\x93\x05\x58\x4d\x23\x82\x6a\x9d\x3c\x70\x08\xd0\x44\x19\x22\x36\x9f\x63\xd1\x14\x7f\xd1\x86\xdf\x3b\xe9\x3e\x21\xe0\x01\x33\x57\x32\x10\x3d\xfb\x34\xbc\xbe\xc6\x90\xef\xcd\xf8\xb7\xd1\x74\x36\x9e\x7f\xd1\x93\x0f\xfa\x72\x78\x3d\xfe\x30\x99\xde\x8c\x87\x69\x74\x7a\x78\xf3\x05\x12\x04\x10\x8f\x56\x57\xe3\xe9\xe8\x72\x9e\xe9\xf1\x0d\xff\x8d\xa3\xd3\x5a\x46\xa7\x41\xdb\x43\x04\xa8\x39\x20\x2c\xd2\x17\xea\x7a\x32\x03\xc1\x98\x0f\x63\xc8\x19\xb4\x43\xd4\x22\x24\x3d\x9e\xe9\xd9\xe4\xc3\xfc\xf7\xe1\x74\x04\x49\x97\xf1\x7c\xa6\xaf\x26\x97\x77\x9f\x39\xdd\x92\x29\x8e\x56\x1f\xed\xd7\x0b\x22\xd8\x7a\xf2\x41\x89\x08\xf6\x00\xd5\x59\x0e\x3e\x11\x3a\xff\x61\x7c\x09\x39\xa5\xa8\x04\xe3\xc7\x4c\xa6\x1f\x62\xce\x46\xbd\xbf\x9b\x43\xde\x01\x72\x36\x90\x81\x42\xd9\x90\x6e\xd6\xc2\xbf\x8a\x13\x37\x2c\x2c\xe3\x7b\x4f\xb9\x1b\x75\x28\x77\x83\xca\x2e\x61\xc0\x12\x81\x14\x94\x61\x19\xcf\xa2\x2e\x8e\x1e\xcf\x4e\x14\xe8\xe2\xa0\x9c\xcd\xb3\x03\x78\x33\xd1\x93\xf7\xd7\xe3\x8f\x94\xe7\x9a\x4f\x82\xe8\xcf\xe7\xe1\xf8\x66\x3e\xba\x19\xde\x5c\x8e\x32\x35\xbb\xbb\xbd\x9d\x4c\xe7\x99\xbe\xbb\xbd\x1a\xce\xfd\x20\x8c\x6e\x3e\xf9\x5f\xf9\x49\x9b\xc1\x0a\xf9\x3c\xb9\x82\xb1\x23\x21\x93\x7f\xef\xa3\xf2\x3f\xe4\x1f\xa1\xff\x75\xf1\xef\xa3\xff\xf5\xfa\xcd\xeb\x9f\x5e\x77\xf4\xbf\x5e\xbf\xfa\xf3\xfe\xff\x47\xfc\x79\x99\xfe\xd7\xc5\xe0\xd5\x51\xd9\x2f\x3d\x9e\xa9\xbf\x95\xec\x97\xbe\x9a\x0e\x3f\xcc\xff\x14\xff\xfa\xcf\x2d\xfe\xf5\xbf\x83\xd6\xd7\xb3\x62\x5d\xea\x19\xb1\x2e\xfd\x37\x13\xeb\xba\x0c\x0a\x34\x5a\xea\x4a\x18\x52\x30\x89\x6a\x0b\x5b\x5b\xe7\xd5\x0a\x50\xd7\xb9\x73\x3b\x30\x41\x51\x7d\x68\xaf\xab\x3a\x11\x27\xea\x15\xea\x39\x26\xce\x43\xd2\x0e\xa0\xce\xa3\x48\x94\xa9\xdc\x31\xd5\xa6\x57\x9d\xa7\x57\x98\xa7\x2d\x98\xad\x7a\x85\x79\x9e\x51\xe2\xd1\xc7\x95\x78\x84\x22\xd6\x23\x03\x8d\x0e\xc8\xf1\xe8\xab\xa8\x44\x06\x1f\x94\x92\x3c\x40\x33\x3c\x6b\xe3\xf1\xfa\xd4\x68\x16\x03\x7d\xd2\x7a\xd2\xf3\xc2\x6a\xbd\xba\x6a\xac\xd6\xf2\x72\x5d\x35\x16\xaa\x10\xda\x4d\x19\x6b\x61\xfc\x1b\x55\x85\x59\x63\xc8\xc2\x14\xfc\x13\xbd\xa9\x20\x86\xb1\xcd\x51\x20\x01\x9c\x26\xff\x73\x24\x0c\x07\x9a\xb0\x9f\x8a\x26\x90\x81\xf1\x61\x66\x51\xe7\xab\x7b\x7c\xcf\xb2\xf2\xb3\xe8\xe8\xa1\x1d\xd9\xb4\x9e\x55\x96\xca\xa6\xa9\x03\xb2\x69\x2f\x52\x3e\xd3\x72\x9e\xd5\xf7\xcd\xf3\x01\x55\xb0\x96\xcc\xd2\x71\x79\x23\xa1\x9b\x10\x75\x8c\x5c\x1b\x47\x70\x90\xb9\x22\xc5\xfb\x0f\x68\x19\x1d\x7e\x61\x9f\x0e\x11\xc9\x22\xb5\xc5\x67\xba\x72\x14\x10\x33\x47\xfc\x2a\x80\x35\x5f\xa6\x3f\x43\xda\x36\x7f\xaa\x48\x1c\x52\x91\x60\xa6\xfa\x5d\xac\x64\xd7\x61\xa9\x17\x7f\x88\xa5\xde\xc7\x44\x5f\xfb\x57\x41\x1c\x03\x04\x90\x5a\xa2\x5d\x09\x4f\x9d\x68\x93\x29\x39\xd4\xc5\xc2\x64\x81\xf3\xfe\x54\xda\x5a\x1f\xa3\xa1\xab\x3f\x69\xe8\x87\x68\xe8\xf5\xdf\x82\x86\x4e\xe7\x18\x15\xa3\xec\x7d\xea\x73\x5c\x74\x3a\xe1\xdc\x3b\xe6\xa2\x8b\xa0\x16\xcb\x49\x90\x18\x03\x1e\xf3\x0e\xb8\x81\xab\xdc\x81\xf2\xd7\x96\xa0\x36\x59\x4b\xf5\xa4\xd8\x23\x3f\xbe\xfd\x53\xbd\x08\xc2\x1c\x6b\x6d\x82\xae\x83\xd9\xad\xf2\x8a\x55\xb2\x28\xec\xd6\xe1\xbc\xab\x9e\xae\xf4\x74\xe3\x3f\x19\x5f\x76\xa0\x86\xff\xb1\x08\xae\x2b\xc1\xf3\x0a\xcb\x86\xd6\x9b\xf8\x09\xad\xac\x2c\xea\xd9\xc0\xc7\x60\x3d\x15\x7b\xd5\xd1\x88\x39\xc0\x87\xed\xc9\xd7\xb6\x39\xb1\xea\xbb\x38\xb1\x47\xd9\xb0\x0a\x1f\x94\x6c\xa8\x0e\x39\xf6\x65\x03\xa0\x8e\x0f\x00\x8f\xcf\x0b\xb9\xb4\xaa\xc3\xa5\x05\x15\x5d\x2d\xaf\x96\xc3\x57\x2c\x8d\x4a\x40\xcc\xb9\x1f\x54\xbb\x9a\xf7\x21\x44\x6e\xda\xbe\x3e\x52\xac\xfa\x03\xa4\x58\x7d\x94\x14\xab\x12\x52\x6c\xda\x82\xef\x5c\x7d\xea\xe8\xe0\x0b\xea\x02\x17\x30\x38\x40\x77\xf5\x5d\x50\xe0\x11\x55\x85\x26\xb9\xa4\xb4\x46\x1e\x3b\x5d\x81\x92\xe4\x8f\xc2\xd2\xe5\xae\xc1\x12\x83\x04\x1c\xe8\xd7\x02\x1c\x72\x1a\x41\x9e\x5d\x2f\x63\xad\x76\xdd\xa3\x48\x5d\xd5\x47\xa9\xab\x6c\x3c\x47\xfe\x6a\xbc\x16\x0f\xf2\x57\xf5\x77\xf0\x57\xfb\x9a\xd6\x26\xb1\xea\xef\x26\xb1\xaa\x43\x24\xd6\xd0\x1f\x48\x98\x13\x44\x0b\xd0\xbd\xfe\x8c\x97\x14\x9d\x5e\x66\x50\x2f\xb1\x75\xff\xe2\xfd\xfe\xfd\x07\x5e\x9d\x10\x74\xf8\x86\xcc\x0e\x93\xcc\x5f\xc0\x6a\xbd\xcf\x11\x88\xde\xe1\x90\x06\x9a\x5a\x8b\xec\xaa\x0e\x90\x5d\x05\x76\x6d\x01\xec\xb0\x47\xbb\x67\xf0\x07\x30\x35\x13\x76\x6b\x9b\xdc\x7a\x80\x11\x9b\x10\x35\x9b\xe7\xb8\x9c\xde\xf4\x5c\x3e\x28\x6a\xf9\x41\x6e\x63\xb7\x2c\xf8\x41\x6e\x63\x57\x86\xb5\xb3\x3e\xc1\x3f\x7d\x86\xe0\x88\xa2\xd9\x2a\x3a\xc7\xcb\x6a\xb3\x35\x50\xde\x54\x3a\x62\xcc\xa6\x46\x46\x63\x0f\x65\x51\x33\x65\x51\x25\x94\x45\x78\xeb\xf3\x0f\xfe\x43\x34\x29\x33\xd0\xef\xf7\x78\xcd\x24\x28\xf7\x75\x54\x9d\x63\x00\x7d\x1f\xf3\x41\x60\xef\xe9\x9d\x08\x03\xa4\xd3\xda\xa5\xa5\x2d\x17\xd6\x35\x12\x94\xf3\x83\x03\xab\xad\xb0\xab\x7b\xab\xd1\x64\x13\x73\x97\x97\xfe\x88\xda\xa3\xe8\x51\x52\x52\xd4\x59\xa8\x87\x28\xa1\x3f\x82\x2d\x90\x1a\x67\x70\x81\x49\x44\x19\x3b\x80\x91\x63\x42\x77\x0e\x42\x5d\xf0\xa3\x50\xcf\x4c\xbf\xf4\x4e\x54\x9c\x07\xa6\x6a\xd6\x08\x14\xde\x0b\x2c\x12\x3c\xdf\x20\x0c\x36\x4a\xe1\x74\x35\x81\xac\x5a\x5b\xff\x8b\xda\xba\x48\x08\x89\xeb\x6a\x6b\xf6\x80\xd6\x25\x3d\xa3\x39\xf7\x38\x1c\xeb\x5c\xd3\x37\xf5\xfc\xb2\x08\x71\xe1\xf3\xc9\xfb\xf1\xd8\x9d\x4c\x21\x20\x05\x1c\x41\x76\x1d\xe5\x4b\x83\x82\x1c\x5c\x87\x0f\x79\xbd\x8a\x6c\xec\x18\xae\xd1\x2b\xbb\x36\x1b\x0a\x48\xe5\xe5\xa3\x61\x88\xf6\xb6\xce\x1f\xcd\x72\x2f\x04\xa7\x21\xe9\xbf\xf3\x73\xf6\xaf\x3b\x9c\xa4\xd6\x93\xf1\xb4\x25\xce\xd5\x70\xc6\x0c\xb9\xeb\x2f\xc0\x8c\x1b\x5d\xe9\xf1\x4d\x5a\xa0\x41\xd2\xe4\x98\xdf\x17\xd9\x7c\x6a\x32\x3d\xc6\xd5\x4a\x02\xe2\xf4\xc4\xab\x34\x4b\xaa\x29\x4b\x4a\xac\x3b\xd5\x4f\xef\xcb\xf4\x68\x0c\x71\x70\x6a\xaf\x6f\x16\xe7\x76\x9f\xa1\xee\xa5\x59\x63\x9d\xe6\x20\x2e\x27\x37\xf3\xd1\xcd\x1c\x9e\xc7\xfc\x3a\x19\x7d\xff\x5b\x73\xd7\x86\x37\x57\xfc\x25\x99\xd0\xe0\x34\x3d\xa4\x33\x62\xce\x63\x3e\xd1\x43\x3f\x1b\xd3\x2b\xc2\x0a\x84\xc4\x07\x7c\x52\xbd\x9f\x8e\x86\x97\x9f\x42\x7b\x63\x27\xc7\x37\x7a\x36\x02\x5a\x9f\xfe\x39\xd3\x2f\x20\xcc\xa9\xef\x20\xcc\xe9\x17\x10\xe6\xd4\x4b\x09\x73\xfa\x25\x84\x39\xf5\x9d\x84\x39\xfd\x1f\x97\x30\xf7\x98\x88\x86\xbe\x88\x35\x07\x84\x81\x3f\x59\x73\x7f\xb2\xe6\xfe\x64\xcd\x1d\x66\xcd\xad\x12\xd6\xdc\x4b\xdc\xd8\x84\x3f\xf7\xc8\x1a\x4f\x7f\x1b\x12\x5d\x6f\xd9\xd1\x3f\x49\x74\x7f\x92\xe8\xfe\x24\xd1\xfd\x67\x27\xd1\xfd\x49\xbb\xf9\x93\x76\xf3\x0f\xa5\xdd\x94\xa4\x7c\x83\xf3\x0a\xd3\xcf\x7a\x4c\x2f\xa9\x94\x7b\x90\x4e\x73\xb4\x56\x6e\x87\x4e\xa3\x8e\xd1\x69\xf4\xf7\xd0\x69\x3a\x3b\x28\xa5\xd3\xe8\xef\xa4\xd3\xa8\x23\x74\x1a\xfd\x7d\x74\x9a\xff\xbd\x39\x2f\x7f\xfe\x89\x7f\x06\x3f\xbe\x9f\x5d\x9d\xcf\x20\xdf\x75\x7e\x59\xad\xec\xdf\x01\x02\xfc\x1c\xff\xe7\xcd\xc5\x9b\x16\xfe\xf7\xcd\x4f\x6f\xde\xfc\x89\xff\xfd\x47\xfc\x49\x39\x35\xaf\x5f\x5d\x5c\x64\xfa\xca\xee\x5c\xb3\xcf\xf4\xf5\xf5\xa5\x92\x79\x68\x91\x5a\x9e\xda\xe8\xc1\x51\xb5\x88\x9d\x40\x50\x05\xce\x4c\x5e\x6a\xca\xa5\xfa\x8f\x2c\xf2\xd2\xe0\xed\xb9\x71\x19\xd5\xf7\x8b\x71\x51\x99\x4f\x47\xf8\x5f\x3c\x08\xbb\xa4\x98\x98\x74\x8e\x7e\x85\xf2\x5f\xda\xd8\xe6\x57\xa5\xfe\x4f\x9d\x36\x11\x2e\x1c\x6a\xca\xb2\x5a\x59\xcc\x95\xd4\xb6\x31\xcc\xa9\xee\x25\xd9\x60\xce\x57\x15\x39\xc6\xa4\xa5\x0b\xd3\xa6\xda\x88\x54\xe4\xc0\xbf\xff\x86\x6e\x9b\x46\xa8\x54\xe2\xc8\xea\xb2\x8a\x3f\x76\x5c\x54\x2b\x20\x27\xab\x3a\x9c\x96\x3b\x67\xa1\x9c\x0c\xe9\xe8\x91\x51\xbe\xa9\x1a\xae\x8f\xd6\xb8\x76\xe5\x50\x39\xfa\x3c\xb2\x64\x41\x2e\xd5\x31\xe1\x3b\x31\xeb\xc0\x6a\x91\xa4\x1a\x09\x34\x26\xd0\x6c\xc4\x01\x7f\x9a\x5c\x5f\x8d\xa6\x01\xcb\x8a\x80\xee\xc9\x74\x16\xd8\x23\x00\xbe\xbd\xf9\xd2\x17\xf1\xec\x27\xc1\xe8\x03\x24\x18\xf5\xdd\x24\x98\x83\x02\x66\xca\x77\x8b\xd1\xd9\xa3\xab\x81\xee\xa7\x40\xb5\x7b\x49\xc4\xa5\xd8\xc7\xf7\x23\x45\x54\x28\x0e\x2e\x76\x19\x50\x32\xca\x18\x42\x8f\x21\xa6\xd8\x25\x43\x29\x8e\x32\x9e\x3e\x33\x24\xb7\xd3\xc9\xe5\xdd\x14\x18\x33\x18\x28\x7c\x3f\x9b\x8f\xe7\x77\xf3\x91\xfe\x38\x99\x5c\xf9\x81\x56\x8c\xb5\x7f\xa7\xaf\x27\x33\x18\xad\xbb\xd9\x28\xd3\x57\xc3\xf9\x10\x5e\x4c\xfc\xaa\x77\xfe\xef\xef\xef\x66\x63\x18\xb4\xf1\xcd\x7c\x34\x9d\xde\xdd\xce\xc7\x93\x9b\x33\xfd\x69\xf2\xfb\xe8\xb7\xd1\x54\x5d\x0e\xef\x66\xa3\x2b\x18\x5d\x0a\xae\x52\x58\x75\xf2\x21\x46\x7a\xa3\x58\x1b\x82\xa1\xa9\xf0\xf1\x6c\x3e\x1d\x5f\xce\xc5\xc7\x40\x2e\x6e\x32\x9d\x8b\x3e\xea\x9b\xd1\xc7\xeb\xf1\x47\xd4\x81\x13\xb1\xfa\xb3\x10\x6d\x1d\xdf\x10\x73\xea\x8b\xa0\x81\xa9\x3e\x1a\x58\x94\x27\x7b\x71\x6c\xf5\x3f\xa7\xc5\x31\xf8\x71\xf8\xf1\xf6\xfa\xfc\xa7\xc1\xab\xf3\xaa\x2c\xf6\x7f\x17\x02\xd0\xd1\xfb\xff\xe2\xd5\xeb\x8b\xd7\x3f\x77\xf8\xbf\xaf\xdf\xfe\x79\xff\xff\x23\xfe\x7c\xbc\xb9\xd3\xc3\x0f\x1f\x46\xd3\x89\xfe\x38\xba\x19\x4d\x87\xd7\x3a\x25\x88\x28\xf5\x1b\xe2\xc2\xf5\x4f\x99\xbe\xf8\x45\xdf\x54\x8f\xa4\x14\xf3\xea\xd5\x5f\x94\x12\xf6\xc3\xe5\x19\xfc\x4c\x7f\xa8\xad\xd5\x33\xbe\x83\x3e\x54\xbb\x72\x45\x77\xfa\xb8\x5c\x0e\xf4\xff\xe5\xad\x7e\xf7\xeb\x8f\x3f\xae\xdd\x1a\x4c\xfd\xff\x5b\xa9\xd1\xa3\xad\xf7\x55\x09\x11\xbc\x78\xe9\x43\x65\x90\xed\xbe\xcd\xca\x7d\xb4\xf5\xc2\x34\xf9\x26\x29\x8c\x15\x7d\x60\xc5\xfc\x5c\x44\xb4\x2c\x1f\x4c\x79\x0f\xe8\xdb\x50\x3a\xcf\xf8\x1b\x1b\xcc\x98\xdb\xda\x9a\xcd\xa2\xb0\x88\x2f\x84\xb1\x58\xaf\x6d\x5d\xe9\x8f\xe8\xa3\x93\xe8\x98\x0c\x30\x1a\x8d\xa8\x53\xdf\xb2\xc2\xae\x9b\x10\xc4\xf4\xbe\x2b\xdf\xbc\x2a\x56\xb9\xfc\x9a\x53\x21\x52\x46\xf0\xd3\x5d\x0c\xa1\x58\xd4\xe4\xc6\xae\xda\xd2\xed\x6a\x6f\x81\x54\x5b\x2a\x74\x8e\x4e\x5e\x13\x8b\x9b\x21\x21\x43\x62\x11\x4a\xdb\x00\x98\x1b\x0c\xb3\xf8\x7e\x2a\x30\x12\xf2\x23\x6b\xc0\x98\xba\x26\x25\x33\x33\xcd\x00\x51\x32\x05\x15\x77\x44\xa9\x96\xd8\xae\x06\xca\xc6\x3d\x99\xbd\xde\x57\xbb\x1a\x7a\xbf\xf2\x96\x46\xe5\x1d\x7d\x7a\x12\x0c\x32\x7a\xd2\xf0\x10\xc0\x0b\x80\x41\x03\x75\xd1\xfd\xf7\x68\x44\x55\x3a\xa2\xf8\x3a\x89\x82\xbe\xdf\x19\x88\x06\xdb\x67\x5f\x07\x35\x40\x88\xb4\xe0\x42\xdd\xb1\xfb\xda\x6c\xce\xcf\x63\xdc\xd3\x3f\xbe\xa1\x68\x2d\x55\xf9\x0a\x83\xc0\x2a\xd3\x79\xe3\xd4\xce\xd9\xda\x0d\x94\x82\x62\x08\x4f\xd6\xcf\x93\x01\x90\x7c\xf2\x95\xcc\xff\xca\x7f\x15\xa0\x42\x35\x45\x23\xa8\x91\x19\xe1\xd8\xf3\xa5\x1d\xe8\xc9\xae\x56\xfd\xab\xa8\x3b\xc4\xb1\xa9\x60\xde\x86\xe2\x28\x60\x5f\xe2\xb3\x55\x3f\x88\xb7\xd5\x3c\x7d\x4a\xc3\x53\xdf\x5b\x0e\xa6\x00\xcc\xc6\x3f\xf2\x29\x77\x0f\x67\x04\x69\xf1\xff\xa6\x8c\x5c\x62\x15\x57\x35\x94\x2a\xbe\xb7\x58\x6a\x92\xbe\x68\xa0\xf2\x64\x16\x5b\xe7\x3f\x43\x93\x00\x81\x7e\x7e\x3d\x81\xdb\xb6\xb9\x5d\xb2\x61\xeb\x57\x6c\x69\x9f\xb0\x9d\x34\x3f\x0c\x6d\xe6\xc7\x7d\x2d\xab\x27\xff\x17\x28\x71\xb4\x82\xe8\x0e\xc4\x65\xf2\xf2\xde\x4f\x09\x69\x02\x20\xaf\xc2\x34\xe8\x69\xc4\x25\xd5\x19\x5e\x2a\xa7\x86\x0b\x88\x7c\x17\x0c\x06\x3e\x55\xca\x35\x76\xeb\x7e\xd5\xa7\x17\x67\xa4\x68\x2d\xb1\xef\x94\xb7\x08\x93\xed\x5b\x79\xfa\xfa\x8c\x10\x96\xbe\xa9\x2d\xfa\x42\xbe\x7c\x00\xf4\x94\x83\x5f\x62\x8c\x70\x9b\xa8\x0c\xa0\xc0\xc0\x2a\xa9\x05\xf6\x23\x6c\x47\x50\x4d\x96\xef\x1b\x28\x35\xd4\xce\x7a\x27\xc3\xbb\x49\x0b\x5b\xda\x75\x0e\x7e\xc7\xca\xae\x2d\xc6\xf3\x0c\x06\xad\x6a\xf7\x43\xd8\x1a\x39\x0d\x4b\xbe\xf1\x5e\x12\x06\x99\x11\xb6\x0b\x90\xe8\xc6\xd6\x90\xe4\x95\x3b\x05\x83\x52\x54\x90\x1f\xeb\x07\xec\xc3\x7a\x78\xca\x57\xd6\x6d\x6b\x6b\x56\x48\x2d\x58\xd8\x65\xb5\x91\x95\x23\xd7\x01\xa5\xb1\x12\x33\x93\xc0\xdc\x07\xfa\x33\xc4\x47\xe3\xef\xdb\x4b\x55\x21\x66\xd9\xd4\x8d\x2d\x2d\xe7\x22\x96\xd5\xae\x36\xf7\x11\x59\x5c\x5b\xb7\x2b\x1a\x74\xf2\xc2\xb1\x38\xd0\x9f\x38\x29\xdc\xaa\x21\x1d\xd6\xa1\xf7\x9b\xfc\x6c\xa6\xc7\xa3\x23\x04\x2f\x3e\x15\x7c\xac\xb5\xc9\x0b\x9c\xa5\x0d\xb8\x80\xbb\x66\x10\xae\x82\x03\x77\x00\xde\x4f\x7e\x84\xbf\xc2\x84\xc4\x78\x38\x8d\x30\x42\xa4\x6d\xd3\x70\x32\x95\x02\x95\x04\x00\xcd\x61\x9d\x19\x3e\xb2\xd9\x47\x83\xba\xcb\x98\x50\xc5\xdb\xca\x25\x1b\x93\x28\x2e\xf8\xa8\xc1\x77\xdc\x57\xe1\x9c\x49\x2e\x9e\x78\xdf\x00\xf6\x4a\x71\xe1\x4f\x3f\x92\x94\x74\x0e\xdd\x92\xcd\xc0\xb5\xe0\xba\x15\xe6\xc3\x0d\x35\x50\xe3\x00\x1c\xc5\x30\x31\x4e\x5c\x45\xf5\xb8\x5a\x37\x56\x53\xb1\x6f\x4f\x5b\x41\x9c\x45\x98\x57\xeb\x0c\x6f\xbd\x2b\x4b\x0a\x6d\xd7\xe1\xfd\xb0\x27\x70\x69\x1b\xca\x04\xd7\x94\x92\x59\x57\xb5\xcd\x14\x4d\xc2\x8e\x31\x7c\xed\xc7\x66\x38\x2b\x21\x5f\x8a\xb3\x95\xfb\x2e\xe2\xd3\x32\xda\xe8\x7e\xc1\xa5\x33\x4a\x4d\x48\xdb\xae\xfb\xda\xee\x77\x78\xa9\xab\x62\x65\x03\x78\x21\xd3\x7e\x46\x88\xeb\x74\x7c\x36\x81\x7a\x11\xc4\x8f\x16\x7b\x85\x1f\xcf\xf4\x93\x71\xc9\x7d\x62\x96\x18\x29\x76\x0f\x1a\x4b\x37\xd7\xfa\xbe\x32\x85\xa3\x9c\x0e\x58\x31\x21\x49\x1f\x1a\xa2\x30\xf9\xc2\xc3\x4c\x5d\xe0\x26\xdd\x5e\xa3\x3d\x45\xff\x46\x7a\x15\xa4\xff\x57\x30\xab\x4f\xe2\x8b\x2a\xfd\x22\xd1\xff\x78\xe3\xd4\x36\x96\xaf\x10\xa9\xde\x22\xa4\x7a\xe7\x70\x3a\x59\x64\x4b\xf4\xa5\x8f\xd7\x15\x72\x93\xb0\x7a\x7d\x3b\x10\x25\xe3\x48\x0a\xc3\x33\xfe\xa1\x3d\x7c\x5b\x48\xa9\xbf\x4a\xe8\xb6\x98\x66\x3f\x91\xb9\xaf\x13\xbc\xec\x61\x9e\xb9\x8f\x3f\xf1\xf0\x3c\xbb\x07\x07\x4a\x9d\x04\x23\xf9\x44\x9b\xc2\x55\x84\x99\x0d\xf7\xce\x79\x91\x7f\x45\x2a\x15\x81\xf4\xb7\x5b\xdc\xa2\xbd\x16\xa4\x62\x0e\xa8\xb3\x9b\xdc\x0f\xca\x6e\xe9\x37\xd7\xc6\xb8\xaf\xbe\xf5\x27\x73\x14\x82\xf4\x67\xbb\x6c\x39\x66\xfa\x3a\x2c\xc0\x4e\xb2\x44\x26\xdd\x01\x58\x40\x9f\x40\xe3\x17\xcb\xb3\xfb\x29\x77\xfa\x64\x5f\xed\x4e\x02\x41\xd2\x5a\x77\x02\xc3\x7f\x12\x09\x03\x27\x01\x7f\x1b\x61\x38\x0a\xc0\xd4\xb1\x94\xbe\x6f\xf3\xbc\xd2\x27\x78\x1f\x9e\x30\xcf\x33\x94\xc0\x05\x0f\x00\x62\x5b\xcc\x0c\x85\x3b\x90\x8a\xbc\xf0\x34\x3c\x21\x8e\x5e\x19\xbd\x36\xee\x21\xa7\xe4\x44\x5e\xe3\xd5\x11\xea\xac\x86\x9b\x39\x63\x98\xe1\x83\xe1\x52\x1a\x70\x9a\x03\x80\x51\xdb\x6f\x66\xd9\x00\xab\x83\x74\x3e\xc3\x35\x84\xef\x71\xbc\x67\x0d\xb5\x5b\x6c\xf1\x13\x6e\x92\x35\x75\x91\x53\xe5\x7a\x15\x4b\x7f\x9f\x20\x0b\xd8\x7f\xb0\xfd\x29\xb8\xff\x4f\x96\xd5\x23\x30\x31\x9f\x04\x85\x53\x84\x12\x05\x1d\x9b\x66\x59\xd4\x15\xe7\x67\xc3\x21\x45\xbf\xa6\xf1\xdd\xd6\xd5\xd6\xdc\x9b\xc6\x76\x87\x78\x05\xab\x03\x39\x8a\x60\x27\xe5\x0d\x41\x72\xf9\x72\x12\x03\x47\x95\x1a\xc0\x64\x45\x9c\x7b\x6d\x97\x54\x2d\x84\x6d\x97\xbc\xd8\x73\x46\x15\xeb\xdf\x22\xde\x74\x13\xeb\x70\x09\x1c\x46\x42\x32\x0c\x9c\x5f\xfb\xcd\x2e\x11\x1d\xc4\xf7\x25\xc0\x60\x89\xbd\x82\x8b\x05\xaf\x5f\x80\x8e\xa2\x49\xbc\x1f\xf8\x4e\x43\x37\x51\xbd\x93\x64\x2c\xfb\xcf\x8a\xd3\x76\x29\x7f\x79\x70\x9c\x65\x8a\x2f\xf8\xfe\x8a\xd9\x19\x43\xb3\x9d\x37\x1d\x96\xd5\xae\x6c\x6a\x30\xc9\x03\xc2\xe3\x11\xa1\x66\xc6\xa9\x27\x5b\x14\x34\x0d\x88\x89\x6f\xcd\x81\xdf\x9b\x7e\x97\x23\x12\x36\x76\x00\x4e\x03\x0b\x40\x67\x17\xc0\xbd\x00\x4a\x08\xc0\x0e\x00\x13\xa0\xdd\x46\x6a\x4e\xfa\xb3\x25\x97\xaa\x36\x22\x11\x6e\xe0\x8a\x8c\x95\x47\xc3\x78\x2a\xba\x91\x29\x20\x5f\x12\x63\x6f\x1d\x0b\x68\x7a\x03\x96\x5c\xe7\x00\xe9\xc7\x9b\x2c\xbc\xe5\x11\x6f\x60\xfc\xc1\xda\x2c\x2d\x53\x1d\x9c\x3e\x19\xc6\xc2\x2d\xfa\x1a\x2c\x64\x14\xde\x74\x27\xcc\x26\x20\xd8\x0a\x5a\xb1\x8d\x90\x1f\xc5\xf7\x95\x08\x35\xc2\xf2\x5b\x88\x78\x07\x92\x30\xde\xce\x6b\x6b\x1a\x36\x64\x94\x37\xeb\xc3\x9b\x4d\x29\x8b\xc6\xf4\xc4\xf6\xd9\xbc\x6f\x6c\x51\xb8\x60\x46\xe0\x93\x1a\x02\xd9\x25\x58\x03\xce\x4f\xc3\xdc\x9d\x32\x3d\x3d\x21\x9d\x40\x27\x44\x71\x3e\x6f\xea\x72\xf6\x82\xbc\xaf\x70\xa4\x62\x9c\x1f\xc7\x34\x3e\xb7\x0f\x06\xe9\x5b\xfa\x50\x3d\xf9\x69\x7f\xcc\xed\x53\x2c\xe8\xd8\x65\xd2\x34\x0f\x56\x4c\x03\x03\xee\x01\xa9\x85\x49\x0c\xe8\xa3\xb7\xd7\x4c\xb9\xc2\xe3\x78\x4b\x58\xc3\xa8\x2e\xb0\xb1\xe5\x2e\x43\x87\x9a\x28\x06\x79\x63\x37\x1c\x7d\x80\x27\x6d\xac\x05\xe8\xbe\x3f\x0d\xeb\xbc\xb1\x75\x28\xc2\x72\x31\xd0\x98\x50\xd4\x90\x50\xc4\x0b\xfd\x44\x98\x47\x27\xe8\x79\x27\xc7\x10\xde\xf9\xde\xa9\x26\xa1\x89\xe4\x68\x87\x00\x06\xec\x47\x95\xd0\x2e\xc1\xed\x68\x06\xfa\x64\x82\x80\x4a\x7c\x7a\xdc\x55\x65\x55\x9e\xd3\x8b\xf9\x99\x46\x9c\xb5\x33\x16\xca\x1d\xf3\x80\x25\xb4\x76\x1e\x44\xdc\x87\x78\x06\xe7\xf0\xbb\x6a\xbd\xc6\x12\x35\x2c\xb5\xab\x82\x60\xc4\x1e\x8b\x17\x56\xf7\x65\xfe\x6f\xde\x7a\xa6\x0f\x38\xbd\xa8\x56\xfb\x4c\xd6\xb0\x65\xb7\x25\xbc\xc8\x45\xac\x0f\xea\xca\xe1\x76\x5f\xee\xbc\x05\x47\xfe\xda\xc6\x9f\x49\x85\x29\xef\x77\xe6\xde\x66\x40\x20\xc6\x7d\xe3\xc0\x71\xc3\x1a\x53\x2b\x6d\x36\x55\x79\x2f\xfc\x2f\xd0\xd8\x08\x24\x74\xbf\x06\xe9\x11\x3c\x3d\xa8\xf4\xa7\xaf\xf3\x45\x6d\xfc\x41\x76\x12\xee\x42\x7f\x10\x47\x83\x21\x94\x14\xa5\x1b\x43\xde\xa4\x2a\xcc\x17\x2c\x22\x50\xe8\xa0\x25\x7f\x6a\xce\x10\x9e\x97\xca\xfe\x96\x55\xbd\x09\x15\xe0\xd7\x7a\x6b\x96\x5f\xcd\x3d\xb0\x82\xf5\x67\xf3\xaf\x50\xf3\x6f\xb3\xad\xca\x10\xcd\x43\x4b\x92\x0e\xa3\x68\x00\x98\xa6\xfb\x71\xd8\xdc\x8b\x33\x45\xc0\x55\x60\x8a\x82\xdb\x83\x00\x86\x48\xd8\x78\x0a\x54\xbe\xfe\x07\x21\x6c\x35\x50\x88\x94\xd1\xdd\x65\x03\x0b\x14\x1b\xe7\x57\x4e\x2a\xe8\x9c\xf7\xf8\x4b\x78\x89\xa8\x98\x1f\x05\xb7\x01\xb9\x9d\x43\x7d\xd2\x6a\xc4\x49\x94\x0c\x5f\x56\x65\x63\xbf\x35\x59\x90\x16\xd9\xc0\x47\xbd\x55\x06\x80\x21\xb5\xe4\x2f\xe9\xd3\xaf\xb6\x2e\x6d\xe1\x0f\xf6\x72\x55\x3d\x69\x07\x53\x8c\x23\xe3\x2a\x5d\x95\x67\x3c\x04\xec\x1b\x92\xaf\x06\x62\x2d\xa8\xfc\x78\x8a\x45\xee\xce\xfc\x1d\x1c\x55\x3c\xda\x8b\xa2\xde\xf9\xe3\x03\x56\xac\x7f\x7d\x5e\xd8\x1a\x97\x21\xba\x77\xab\xdd\xd2\x86\xb5\x41\x12\x21\xba\x8a\x3b\x16\x77\xc0\xb6\xb6\x8d\xf8\x5e\xbd\x2b\x35\xf0\x95\x60\x79\x5e\x26\x1a\xda\x78\xbc\x24\xc7\x48\x9e\x3e\x11\x56\x14\x0d\x51\x51\x08\xff\x4c\xc1\xaf\x4b\x6b\x39\xde\x08\x56\x7b\x63\x33\x28\x76\x68\x8a\x82\x56\x0e\x42\xbc\xda\x3d\x3d\x83\x66\x81\x57\x8b\x85\x39\xe1\x69\xc4\x0d\x12\x21\x1d\xec\x68\x84\x82\xb9\x65\x9d\x6f\x1b\x32\x68\x91\x0f\x8a\x18\xf3\x68\x28\x0c\x54\x0c\x6b\x34\x92\xac\x13\x49\xe8\xfe\xa9\x3f\x38\xdd\xde\xaa\x30\xa2\x84\x2a\x3b\x27\xc8\x94\x6a\xaa\x0a\x31\xef\xf4\x0b\xef\xd2\xc6\x08\x8e\x0c\xc6\xf1\xba\xe5\xb8\x89\xb0\x30\xf3\x92\xd1\xc2\x18\xcb\x48\x5b\x2c\x76\x24\xa2\x1e\x9b\x8e\x4d\x8e\xc2\xba\xf6\x9b\xf1\x3b\x22\xd3\xc9\x2c\x2a\xba\x24\xc2\x75\x2f\x8c\x87\xe0\x90\xe9\x75\x5e\x80\x11\x95\x16\x51\xe4\x33\x1d\x7e\xc9\x32\x0f\x38\xe8\x41\x7e\x3f\xdd\x57\x18\x3e\x5e\xe9\x82\x47\x0d\xd3\x0a\xfb\xd2\x6c\x28\x26\x52\xe4\xe5\x57\xbb\x52\x6e\xb7\x08\x23\x13\xd0\x06\x6c\xf7\x1f\x8c\xde\x53\xc4\x23\xde\xa1\x8b\xbd\xca\xcb\x26\xdf\x78\xcb\x63\x65\x1a\x93\xc2\x2c\x09\xe7\x07\x0b\x61\x5d\x54\x4f\x02\x78\xea\x27\xcf\xdf\xa2\xb2\x1d\x22\x5a\x6f\xea\xa8\xda\x41\x17\xd9\x1c\xe8\xac\xdd\xfd\x01\xab\x3c\x59\x44\xc1\xcc\xe7\x38\x6a\xed\x20\x96\x5b\x5b\xde\x06\x2a\xe1\x82\x90\xe3\xd5\x7d\x73\xdf\xeb\xf0\xf2\x3f\xd8\x98\x74\xaf\xb6\x4f\xbd\x10\xc5\x84\xca\x2b\xd4\x31\xad\xf5\xeb\x81\x7e\x6f\x5c\xbe\xd4\x51\xbb\xd5\x7b\x8c\x02\x95\x72\xb8\xcc\x3a\xac\x4a\xfe\x35\x9b\x6e\x08\x6e\x5e\x0b\x5a\x2c\x45\x7d\x6f\x39\x1e\xea\x07\x1b\xb2\x12\x75\x6d\x1f\x2b\xe4\x4e\x08\xfc\x89\x65\x58\xbe\x04\x83\x20\xee\x64\xa0\x12\xcc\xac\x2c\x9e\xb8\x5e\xe7\xf5\xc6\x61\x48\x7a\x57\x06\x7c\x63\x12\x2a\xe6\xa3\x25\x6e\xc0\xe0\xc3\xc1\xb0\x56\xbb\x66\xbb\x23\xb8\x1d\x07\xc1\xfc\xba\x8a\xfe\x22\xb8\xa6\xf4\x6f\x2e\x29\xc9\xc1\x6a\xb8\x00\xa9\x56\x2c\x3e\x09\x23\x5a\x65\x40\x9f\xb0\x9a\x93\xd0\x56\x92\x0f\x4f\x11\xc1\xca\x2c\x03\x2d\xd3\x25\xa1\xf6\x6a\x1d\x74\x69\x22\x9f\xcf\x6f\x8f\x47\x53\xe0\xcd\xec\xe2\x78\x2e\x44\x54\x82\x74\xfa\x99\xb8\xef\xfd\x9b\x0c\x06\x85\x4c\x7f\xf4\x5f\x93\x36\xb9\x98\x44\x58\x55\xc2\x43\x09\xae\xab\x12\xb3\xe4\x2a\x5d\x78\xab\xc8\x50\x7b\x43\xf5\x80\x80\x72\xe4\x34\x51\x5e\x22\x43\x23\xaa\x08\xe0\x63\x55\xeb\xdd\x14\xa2\x89\x94\x6a\x57\x15\x89\x9e\x14\xf1\x3c\x21\x0d\x03\xfe\x5a\x2a\x1a\x12\x64\x6b\x0a\xf4\x2d\xf6\xd5\x2e\x0b\xc8\xfb\x95\xa5\xb4\x4d\xf3\xa0\xd7\x66\x99\x17\x78\xe8\xfa\xcf\xc5\x10\xa8\x7f\x0f\xc5\x85\x52\x8c\x14\xa4\x69\x2a\xa8\xd4\x99\xca\x08\x74\x59\x13\xa5\x60\x6a\x83\x84\x8a\xf1\xd6\xbc\x29\x54\x34\x6a\xd2\x01\x86\x63\x2b\x4c\x9b\x5f\x17\x50\xae\xe2\x61\x17\xa2\xe2\x49\x1b\xc3\x94\x91\xd0\x1b\xf5\x14\x21\x58\xab\xca\xcf\x8b\x1c\x88\xaa\xc4\xe9\x59\xd8\x07\x53\xac\x33\xda\xd8\xf0\x23\x0c\x36\x60\xe1\xe9\x15\xb7\x04\x22\xb7\xd8\x35\xe8\xf9\xb6\xae\x1e\xf2\x05\x92\x74\x37\xb8\x5b\xd8\x95\xc7\x18\x18\x65\xce\xe0\x89\xa1\x17\x76\xa5\xb8\xdf\x7e\x7b\x38\x8a\x48\xe7\x75\xa8\x5a\x09\x2c\x6a\x18\xcb\x3d\xe2\xd7\xc3\xa0\x31\x43\x38\x30\xbb\xf3\x7a\xb9\xdb\x78\xcb\xdf\xdb\xf4\x49\x4e\xdb\x2f\x90\x44\xb2\x44\xa0\xd7\xa4\xa4\x10\x70\xc4\x44\x99\xdf\x24\x73\xfd\x4e\x3b\xc2\x7f\x5f\xbc\x22\x44\x7c\xde\xe8\x5d\x19\x78\x1f\x78\x76\xfe\x34\x08\x15\x61\xca\x7b\x7d\x87\x59\x23\xf4\xc0\x51\x9a\x4a\x7f\xf0\x83\x33\x2c\x9b\xfc\xfc\x12\x9a\xcc\xf5\x55\xae\x61\x23\xde\x54\xe9\xe1\xd2\x66\x7d\xc4\x8a\xa1\xcf\x55\x7e\x57\x71\x84\x52\xf1\x28\xbd\xde\x15\xeb\xbc\x28\x60\xcd\x08\x74\x38\x7d\xde\x3b\x3f\x85\xd5\x17\x17\x81\xed\x3f\xbe\x9d\x88\x88\x11\x55\x48\x31\xab\x6a\xdb\x60\xe0\xeb\xf5\x2b\x7d\x65\x97\x88\x50\xc0\x32\x34\xfe\xea\xa7\x20\x38\x84\x58\x79\x79\x78\x0b\x44\x08\xa1\x40\xa4\x30\x19\x04\xae\x2a\xcd\x72\x1e\x9c\x1c\xc6\x9d\x05\x3e\x7b\x7a\x40\x66\x94\x2d\x65\x1a\x20\xa5\x03\xab\x27\xcc\x73\xac\xab\x7a\x91\xaf\xd2\x97\x00\x3d\xe2\x80\x78\x48\x12\x56\xc0\xec\x4c\xd2\xbe\xdc\xd1\xb0\x63\x32\xe0\x25\x82\x6b\xbd\x44\x93\xb4\x0b\xa6\x5c\x29\xd2\xaf\x00\x34\x23\xf4\x04\x12\xf4\x4c\x38\x80\xcb\x4b\x47\x94\x02\xc7\xe3\x82\x69\x13\x8d\x13\x45\xc1\x04\x92\x86\x42\xb2\x11\x4a\x0a\xde\xfb\x83\xb6\x91\x66\x2d\x98\x23\x19\x6e\x4b\x38\x4e\x99\xea\x9d\x5b\xf7\x83\xc2\xc1\xa4\x9e\x1d\x18\x4d\x7d\x70\x34\x71\x43\xbc\x19\xe8\xb8\x69\x7f\x63\x18\xc9\x25\xab\xa0\xa7\x67\x7d\x3f\xce\x24\xd8\x09\x3f\xa4\xf9\x39\xbc\x53\x38\x16\xa7\xf2\x26\x63\x7a\x0d\x4a\x65\x64\xba\xef\x78\x2e\xdd\x36\x5f\xee\x50\xf4\x0e\xcc\x8e\x18\xae\x2a\xf6\x9c\xeb\xf1\x06\x0a\x10\x71\x09\x0c\x73\x34\xa8\xf5\xee\xa0\x9e\x8e\x3f\x5d\xd0\x8a\x37\x4d\x57\x4e\x87\x83\x25\x6c\x91\x44\x3e\xea\x8a\xdc\x75\x2c\x6b\x44\xe6\x37\x9d\xc2\x7f\x89\xb9\x0a\x5c\x49\xab\x23\x0d\x60\x46\xea\xc2\x59\xaa\xaf\xe1\x5f\xca\xb1\xb5\x77\x2a\x28\x91\x00\x6b\x24\x24\x11\x0e\xc4\xba\x50\x86\x34\xde\x6d\x31\xda\x1d\xa6\x11\x61\x10\x48\x19\xa4\xc2\xe9\x65\x45\x7f\xf7\x77\x50\x1c\x54\x39\x25\x60\x3d\xf8\xb6\xec\xab\x9d\x82\xc2\xdd\x90\xfc\x77\xbb\xed\xb6\xf2\xe7\x5d\x1d\xc3\x81\xdb\x50\x6f\x8b\xac\xdb\xb5\xb5\x41\x60\x23\xae\xb4\xcf\xec\x4e\x91\x25\x4c\x80\xaa\x9e\x25\xd7\x13\xc6\x8f\x76\x29\x99\x18\x9d\xf8\x17\x3b\xd8\x79\x13\xd5\x6d\xc2\x97\x28\xce\xc2\x01\x16\xb9\x64\x7b\xc8\xac\x3c\xaf\x6f\xfa\x96\x2b\xa5\xae\x2c\x25\x60\x42\x71\xf5\x70\x81\xfd\xaa\x94\x39\x03\x4b\x15\x03\x7b\xfe\x7a\x5f\x9a\xba\xde\x8b\x30\x62\x6b\x35\xc6\xa7\x47\x9f\x13\x63\x37\xea\x3e\x47\x89\x8c\x50\x9a\xcb\xbb\x51\xc0\x04\xfd\x43\xef\x40\xf8\x57\x48\x59\xa2\x24\x47\xef\x36\x90\x76\x3d\x2c\x7e\x1c\x28\xbe\x72\xff\x42\x76\x30\x79\x7c\x90\xd4\xa0\xc6\x3b\x85\xa0\x85\xf8\x0b\xef\xe9\x70\xad\x7d\x3f\x57\x27\x07\x36\xc7\xc9\x40\xa9\xe5\x59\x14\xf1\x91\x7a\x59\x44\x52\xa4\xe3\x59\x04\xd6\x7a\xce\x77\x4c\xf4\x55\x25\x4a\x6b\x62\xae\x1e\x84\x06\xb7\x95\x73\x36\x60\xbd\x71\x4b\xb5\x28\x7e\x28\x0a\xc0\x19\x73\xdc\xd9\xa9\xda\x6f\x7a\x7d\x87\x01\x91\x74\x43\x58\x4a\x41\xcb\x05\x1a\x2a\x2f\x04\xd4\x0f\x24\xcc\x15\xba\x94\x99\xf7\x3e\x4d\xbd\x02\x7e\xa8\x37\x99\xab\x27\xc4\xa3\x00\x03\x00\x02\x82\xb6\xcd\xe3\x84\x4c\xbc\x2a\xab\x96\x03\x25\x47\x8d\x1d\xcd\x68\x95\x3d\x99\x3d\x06\x11\xd3\xf0\x0a\x70\x61\xbd\xe7\x8b\x1c\xd9\xf8\x40\x42\x3f\x01\x12\x8b\xa5\x8b\x8b\x7d\x14\x32\x80\xe0\xd4\xea\x8c\x63\xee\xf0\xc2\x07\xe3\x8e\x24\x45\x5c\x86\x67\x0e\x1a\xbe\x24\xb6\x28\xd2\x23\x2a\x49\x8f\xbc\x8b\xe2\x07\x79\x72\xf5\x74\xde\x22\x02\xc8\xb0\xd6\x57\x95\x22\xd5\xb3\xf6\x1b\xd2\x04\x0c\x5d\xb6\x4f\xa8\x87\x43\xb1\x02\x70\x53\xc0\x74\x06\xd3\x1c\x02\xe5\x18\xd4\x0b\xd7\x7b\xcb\xe9\xc4\x3c\x1a\x8c\xf1\x21\x89\x67\xf6\x51\xd2\x68\x11\xa2\x7c\xf2\x5a\x97\x98\xc2\x01\x5b\x27\x01\x29\x75\x6c\x93\x18\x6f\x52\xe8\x8c\x6c\x16\x10\x76\xe7\xbc\x25\x87\x5f\xd0\x42\xd8\x68\xa3\x0b\x7f\x0b\xd4\x02\xee\x04\x16\x0b\xa4\x14\x1f\xab\x62\x07\xc4\x0c\x65\xb4\x6b\xaa\xda\xdc\xc3\x25\x91\x64\x09\xf9\xfa\x16\x49\xdf\x52\x9f\x98\xfb\x7b\xbf\x6a\x1b\x7b\xc2\x73\x23\x86\x48\x71\xa5\x18\x09\x5f\xe2\x6b\x9a\xfb\xce\x61\x4e\xb4\xa6\xe0\x62\x0c\x02\x71\xd2\xd6\x51\x55\xe7\xf9\x6c\x2b\xe9\x85\xdd\x57\x30\x24\x14\xa5\x12\x42\xbc\xe8\x69\xa1\xdf\x31\xd0\xe3\x12\xdc\x2b\xb4\x37\xdb\x21\x83\x12\x6c\x0a\xee\x50\xdc\x1a\x4b\x83\xec\xc8\xd6\xf1\x42\x17\x3e\x1c\x75\x3d\x91\xa1\xf0\x20\xbc\x08\xdf\xca\x8b\xf0\xa6\x2a\x89\x6a\xa6\x3f\x54\xf5\xa6\xf7\x02\x6c\xb7\xad\x13\xd4\x3d\x7c\x6d\x39\xf5\x06\x96\xc8\xcf\x07\x6f\x2f\x91\x6a\xdb\x98\xe5\x43\x5e\xda\xf3\xda\x9a\x15\x1c\x67\xbd\xb1\xc9\x67\xa5\x25\x7d\x0b\x4b\x1b\x6f\xc3\x27\xb3\xa7\x7b\xf0\x32\xbe\x2b\x0d\x75\xc3\x4d\x6e\x37\x8b\x6a\x85\x21\x56\xc8\xb3\x3d\xec\x51\xc1\x9b\x68\x3d\xfa\x54\x08\xa4\xc6\xdf\xf6\xac\xcc\xb3\x8c\xe0\x3e\xa6\xcc\x23\x70\xae\x3f\x02\x97\x7f\x43\x96\xa7\x01\x99\x10\x88\x6b\xf1\x93\x49\xd0\x6d\xb9\x73\x4d\xb5\xc1\x0c\x3e\xac\x50\x89\x6a\xc6\x73\x06\x71\x9f\x78\x0f\xff\xbb\xf5\x31\xd6\x52\x02\xeb\x2c\x23\x45\x83\x75\x55\xab\xa0\x90\xd6\x3c\xd4\xd6\xea\x7d\x90\x51\x0b\x1f\xf1\xe7\x83\x08\x04\xb1\x81\xb7\xc5\x0b\xa7\x46\x69\x2b\x1c\x09\x5b\x2b\x36\xfc\x30\xc4\x83\xf1\x05\x68\xfe\xa6\x5a\xd9\x02\xae\xba\x7b\xf2\xf8\xfc\x4a\xf0\xf7\x2e\x5d\xb6\x8c\x7f\x8b\x23\xa3\x28\x89\x08\xe8\x53\x61\xd6\x1e\x0b\x99\x86\xec\x45\xa4\xd4\x01\x04\x8d\x5a\xc1\xc9\xbf\x03\x61\x3f\x82\xb5\xbd\x60\xbe\xd5\xd1\xf9\xce\xc8\xc2\x45\xeb\xb9\xac\x50\xb2\x18\xe0\x33\x18\xfb\x8b\x92\x6c\xcb\xca\x01\xed\x9f\xdf\x15\x25\x47\xd0\x18\xc3\x24\x16\x1d\x09\xc1\x26\x85\x15\x73\xfa\xfa\x4c\x80\xea\xc8\x34\xb7\xaa\x7f\x70\x40\x07\xb2\x8d\x27\x34\xde\xfc\x23\xd3\x1f\x6d\x2a\x5a\xa3\xe2\x6c\x4c\xfd\x39\xb9\x70\x09\x29\x21\x27\x86\x59\xdb\xb8\x48\x5a\x70\xc5\xde\x30\x38\x9a\x2a\x0c\xbc\xcd\x51\x50\x97\x22\x37\x90\x86\x54\xd5\x72\x09\xca\x67\x98\x95\x01\xd1\x8c\x72\x59\x6d\x36\xde\x81\xf7\x3f\xc3\x9b\x8e\x03\xb6\xc2\xaf\x5c\x75\x16\x54\xd4\xbf\x30\x61\x2f\xb4\x9d\xb5\xdd\x82\x4d\xb5\xb7\x0b\x34\x59\x0e\xec\xdb\x85\x10\xf9\xa3\x69\xa0\x51\xc6\x54\x07\x0a\x2c\x15\x66\x69\xf5\xe9\xbd\xf7\xfe\x01\x3e\x80\x0b\x03\x87\x9c\x14\x70\x70\xb0\x62\xcc\xb7\x85\x94\xec\x1b\x36\x56\x59\xc4\xf8\xbf\xd9\x07\xa4\x4a\xf8\x21\xbe\x18\x27\x98\x95\x54\x68\xa2\xc1\x70\x66\x0b\x46\xb1\x6c\xa9\xf0\x21\xc5\x6a\xea\xdf\x6a\x2d\x6f\x52\x64\xf7\x02\xa8\x02\xdf\x2f\x9f\x94\x9c\x79\xae\xb3\x18\xb3\xee\xeb\xf8\x5e\x21\x5c\x1c\xee\xcd\x80\xc4\xa4\x35\x7c\x8a\xb1\x15\xdc\xcc\x70\x40\xf9\x01\x16\xd2\x77\x67\x08\x51\xa1\x93\xc9\xc9\x81\x26\xa8\x93\x08\x18\x8b\xcb\x10\xfc\x2c\xe3\xbd\x8f\xbc\xd4\xcb\xc2\x1a\x11\x51\x75\xaa\xb4\xdf\x42\x4c\x48\xf6\xcc\x19\x78\xe2\x13\xc3\x6d\xd7\x39\x65\xd8\xfa\x57\xff\x34\x58\xf3\xa0\xc8\x1b\xe1\xb8\xfa\xa1\x72\x8d\x3b\xf8\xcd\x8c\x16\xba\x6f\x20\xc7\x02\x25\x33\x46\x09\x37\x2e\xc5\xa2\x8b\xe3\x3c\xe6\x75\x9d\x5f\x9e\x98\x8d\x75\x89\x4f\xe6\xad\x0e\x7b\x70\x0b\xec\x20\x80\xb6\xb5\xb6\x3e\x6f\xaa\x73\xff\xff\x44\xc0\xbc\x35\x98\x79\xe9\x8f\x35\xae\xd7\x61\xbd\x4d\x46\xc3\xd4\x7a\xac\xdf\x14\xbd\xeb\x4e\x62\x10\xbc\x51\xbb\xb0\x78\x2a\x62\x35\x06\x9a\x0d\x4a\xe1\x06\x20\xb9\x38\xe3\xd8\x39\x15\x7b\x7c\x45\x3c\x02\xd6\x00\xdd\x62\xfd\xc4\x9e\xf3\x2e\xf3\xb7\x95\x4b\x53\xa5\x20\xfe\x4d\x20\x8d\xa0\xee\xdb\xbf\x65\xfc\x8a\x4f\x72\xd1\xfb\x2c\xba\x11\xad\x1a\xcf\xe1\xc4\x57\x9d\x33\x37\xa0\x71\xee\xbc\xb3\x74\x8b\xf7\xda\x09\x34\x44\xde\x96\x27\xcb\xaa\x74\xbb\x0d\x9a\xf2\xf0\x91\x8c\x9c\x81\x08\xf7\x69\x4c\x79\x9f\x2f\x0a\xab\xb6\xb6\x76\x2c\x7f\xb3\xb5\x20\xf7\x11\x91\x23\xf5\x06\x0e\xde\x70\xdf\xf1\x87\x33\xbd\x36\x9b\xbc\x00\x90\x8e\x7e\xa8\x76\xce\x3e\x54\xc5\x4a\x71\xcd\x97\x78\x43\x71\x16\x35\x24\x80\xe1\xd2\x2c\x56\x84\x76\x64\x16\x04\x62\x10\xa1\x6e\xcd\xea\xc9\x42\x90\x7b\xa0\xc6\xa5\x5e\x59\x94\xf9\xa2\x5d\x85\x80\xc1\x60\x56\xe4\x84\x7b\x4b\xfa\x9a\x61\x2d\xda\xf5\xae\x40\x88\x3e\x69\xff\x80\x14\x94\xab\x8a\x47\x1c\xe4\xb5\x79\x44\x98\x3d\x18\x03\xe6\x9e\xea\xda\xb6\x61\x44\xf0\x9a\x70\xa3\x80\x35\x15\x3f\x00\x44\xa8\x4c\x9f\x24\xc3\x94\x00\x89\x75\xb3\xdf\x82\x0d\x51\x21\x8c\xac\x2a\x23\x9a\xc6\x34\x7a\x59\x18\x74\xe4\xb9\xe9\x2a\xf5\xef\x39\x83\xba\x8b\x4c\x94\xd8\x3a\xf0\x97\xb1\x0f\xb0\x2d\xcc\x3e\x29\x1f\xa3\xda\x1f\x35\xcb\x66\xc7\xad\xc4\x09\xb2\xdf\xb6\x76\x89\x26\x1c\xea\xd8\x63\x80\x9c\xeb\x7d\x12\xf3\xc5\x37\x6c\xa0\x86\xc7\x07\xbd\x15\x98\xe0\xa9\x12\x8f\x40\xa1\xd9\xdd\xc2\x35\x26\x80\x6f\xe8\x16\xf7\xd7\xf0\x6a\xe7\x4d\x59\x1c\xa9\xb2\x2a\xcf\xc3\x0b\xb0\xb5\x52\x13\xcb\xff\x24\xca\x42\x41\x5f\xe1\xfe\xf7\x0b\x0c\xc2\x7d\x18\x65\xb2\x04\xe0\x13\x24\x1e\xec\x8a\x3a\x19\x23\x7c\x05\x97\xdd\xb8\xc4\x42\x02\x00\x48\xc6\x0b\x5a\xee\x2e\xb1\x65\x36\xb6\x79\xa8\x56\x78\x4b\x2c\xed\x6a\x57\x5b\x97\x29\x2e\x43\x8d\x0f\xfb\x6a\xf7\x38\xb6\x78\xce\xe5\xf1\xd9\x89\x50\x1e\xe1\x67\x90\xca\x03\xb0\x99\x48\x80\x50\x29\x4f\xaf\xed\xe4\xc1\xc2\x49\x1a\x48\x76\x47\x87\xfc\x51\xad\x95\xf7\xac\x0f\x19\x5e\x36\x69\x1d\xc4\x59\xdc\x6e\xbd\xce\xf1\xe2\x16\x94\x17\x18\x61\x96\xe5\x5b\xe9\xf5\xae\x84\xd3\x93\x4c\xd2\x84\xbb\xd1\xba\xe5\xf3\x12\x4e\x5f\xe3\x00\xb0\xf8\x08\x0a\x67\xaa\xe2\x28\x0f\x76\x0b\x21\x2a\x90\xe9\x5b\x58\xf4\xa3\x93\x14\x09\xeb\x0d\x02\x4d\x6b\xa0\x14\x69\x86\xb3\x13\x5c\x76\x0e\x48\x19\xeb\xe3\x83\x9e\xbc\x2c\xff\x32\xcc\x72\x09\x6c\x0a\xa4\x6e\x77\xce\x92\xeb\x25\x87\x36\x22\x64\x84\x15\xbe\x5c\xee\x6a\x90\xe5\x0b\x39\x3d\xbc\xf6\x10\x41\xac\x92\x12\x4e\x41\xea\x57\xc4\x14\x13\x01\x10\x9b\x4e\x25\x16\xcf\x06\x44\x71\x8d\x72\x16\x4d\xa2\x21\x88\x20\xa3\xad\x6d\x76\x24\xb8\x47\xb1\x74\xef\xad\x22\x5c\xe3\xb4\x37\x42\xa8\x44\x0b\xc1\x03\x7a\x30\xb5\x59\x36\xb6\xce\xff\x8d\xa0\xb6\x07\x2e\x2e\xec\x77\x02\x19\x51\x3c\xa8\xb0\x64\x16\xb6\xcf\xa7\x3e\xb4\xc1\x06\xfa\x3d\x2b\xe7\x0b\x33\x43\xc5\x9a\xee\x10\x31\xc9\xd7\x41\x7f\xca\x4f\x75\x49\xa2\x52\x52\x2a\x19\xd5\x48\x1c\x65\x49\x50\x6d\x30\xee\x2b\xd5\xbb\x20\x29\x49\x90\x0c\x38\x60\xd7\x02\xe6\x2a\x89\x4d\xc2\xa2\xa3\x07\xda\x95\x9f\xd7\xe9\xe4\xf3\x19\x61\x88\x64\xe0\x5a\x38\x3a\x87\xfa\xdd\xc5\xa8\x99\x64\x00\x08\xeb\x06\xba\x97\xe2\x71\xec\x4f\x7b\xa3\x10\x50\xd8\x9c\x4e\xc9\xb0\x18\xda\xca\x34\x84\x72\x10\x25\xbf\x54\xdc\x31\x61\x14\xea\xd8\x91\xc8\x17\xa4\x45\x95\xf1\x3a\xea\xae\xc6\x92\x82\x90\x79\xa3\x8f\x3f\x74\xa0\x87\xc1\x6b\x89\xa6\x3d\x59\xee\x2b\xeb\x97\x86\x7a\x7a\x20\xb1\xc0\x64\x7b\x93\x4c\x1a\xe3\x09\x38\xb9\xb7\xf2\x87\x98\x45\x34\x10\xdc\x51\x4d\x60\xc7\x71\x2a\xf8\xc1\x86\x17\x55\x35\xd7\xc1\x22\xd5\xd5\x5d\x41\xa0\xb5\x6d\x5d\x35\xd5\xb2\x2a\x98\x08\x25\x71\x65\x66\x59\x57\x0e\xf3\x10\xf4\x20\x40\x2a\x1c\xd9\x05\x78\x1e\x1c\x9c\xe4\x28\xc3\x1a\xdc\x4a\x45\x6e\x92\x38\x8b\x78\xdb\x80\x54\x3d\x7e\x39\x44\x26\xa2\x04\x29\x11\xf3\xed\x0a\x79\xca\x40\x6f\xef\xc2\x65\x0f\x60\x65\xfb\x50\x63\xe4\x6e\x92\x96\x0f\x2c\x3d\x55\x56\x2c\xac\xa7\xb7\xc6\xb9\x27\x28\xc6\x52\xfb\x4b\x0c\x86\x6b\x57\x6e\xcd\xf2\x2b\xe4\xa0\x6b\x6b\x56\x04\x56\x21\xb7\x29\xc8\x2b\x0f\x63\x46\x63\x6e\x31\x52\x79\x22\x7e\x16\xb3\x04\xee\x84\xca\xfe\x04\xf8\x09\x14\x22\xa0\x4d\x74\x28\x6e\xa8\x16\x7b\xc6\xa4\x20\x89\x00\x69\x6d\x00\xb6\x13\x15\xa1\xa2\x32\x10\x25\xa4\x92\x86\x89\x46\x90\x34\x6e\x9d\xe8\xfd\x32\x80\x00\xd3\x47\x9c\x3b\x08\x20\x8e\x86\x2a\xc7\x81\x98\x1f\x7b\xda\x7b\xf5\x84\xec\x11\x09\xd3\x96\xd1\xa4\x1e\xb2\x43\x48\xd6\x60\x80\xad\x4f\x68\x15\xb5\x5b\x7b\x9b\x4e\xc7\x23\xc3\xb3\x25\x80\x34\x24\x31\x31\xec\x66\xea\x46\x09\x5d\x24\x99\x93\xe1\x83\xbc\x62\x7e\x2e\x3e\x9b\x6b\x9a\x74\x06\x81\x70\x5e\xea\xde\xdb\x21\x65\x37\x6a\x16\x28\x41\x78\xf1\x04\x9d\xe6\xde\x1e\x1c\xc0\x85\x60\x08\xa9\x0f\x21\x02\x12\x9c\x44\x4f\x47\xee\x85\xa6\xea\x24\xa6\xdc\xab\x03\xc3\x44\xa9\x5d\xd3\x10\x21\xc7\x9f\x6f\x5c\x09\x85\x07\x2d\x6f\x06\xfa\x34\xae\x10\x25\xbf\x4f\x23\xc7\x61\xd3\x08\x59\xa5\x14\x4c\xf5\x44\xad\x30\x05\xf8\x6b\xb6\xc6\x28\x01\x78\x1b\xfe\x98\x53\x21\x4b\x1b\x21\xce\x83\xb3\x00\x90\xa3\xe8\x4c\x7f\xe3\xfd\x09\x41\x87\x61\x86\x49\x55\x45\xa1\x0d\xaa\xea\x29\x87\x28\x45\x9d\x41\xfa\x8d\x65\x09\x72\x2c\x70\xd3\x45\x3f\x88\xae\x02\x70\x29\x15\xc1\x14\xb5\x11\x0e\x49\xda\x66\x44\x31\x21\x04\x18\x64\x0c\x56\x60\xac\x1c\x9a\x41\x40\xc6\x93\x9d\x1c\x6f\xa0\x98\xe8\x79\x00\x9a\x6f\xe0\x24\x07\x74\xd9\xd9\x8b\x4e\x08\x0a\x45\xf9\x5f\x61\x3a\x81\xeb\x71\x80\xd3\xc8\x00\x84\x8a\x8a\xfc\x01\x27\x84\xc5\xfc\x63\x40\x89\x01\xbc\xf2\x2d\x6c\xe9\x38\x7d\xf1\x33\x1c\x9e\x17\x6f\xdb\xef\x7e\xa7\xab\x1a\xc2\xfb\xd3\xc0\xa1\xdc\xa2\xf6\x5b\xc8\x00\x46\x4d\x5a\x11\xf8\xc5\xb4\x55\x80\x7b\xd4\x34\x3c\xca\x34\x42\x86\x8d\xad\xfd\x08\xb6\xab\x19\xa4\x70\x30\x4f\xc9\x99\x4c\x5c\x36\x98\xda\x02\x21\x49\xf4\xa1\xf3\x06\x5b\xbc\x3c\xf3\x1b\x9c\xc1\x5d\x7a\x93\xbb\x54\x67\x37\x44\x40\xa0\xc0\x4c\x70\x58\xe3\xca\x04\x38\x18\x75\x19\x8f\xd4\xb6\xff\xe1\x22\x2a\x8c\xdb\x0f\xa5\x8e\xea\xaf\x78\x58\x8a\xd1\x78\x02\x0a\x9a\x13\x6a\xe8\x61\x2e\x2a\xae\x70\x43\x4f\xc5\xe6\xaf\xce\xb0\x3c\x03\x83\x26\x77\x24\x2a\x13\x6b\x71\xc8\xea\xb3\x41\x3b\xae\x20\x15\x55\x31\xe2\x21\x69\xc8\x8d\xc4\x17\xd8\x33\x7d\x65\x97\x05\x0e\x5a\xa8\x7a\x92\x82\xc5\x82\x64\x28\x80\xf3\x62\xb1\x2a\x60\x39\xc2\x6f\xf1\xcd\x50\xb5\x15\x3f\x8a\xbe\x21\x99\x73\x30\x16\x0e\xdf\xb7\x96\x2b\x28\x2f\x57\x76\x53\x26\x28\xb1\xd8\x72\x30\x8f\xb0\xe9\x9d\x69\xd1\x8b\xbd\x12\xb9\x15\x3c\x61\x5d\xd2\x3d\x90\x76\xef\x9d\xaa\xbc\x39\xc3\x9d\x84\x62\x34\x10\x2d\x50\xc6\xb9\xdd\x66\x1b\x54\x01\xe3\xc6\x69\xbb\x26\x59\x10\xfa\x15\x9f\xa1\x2b\x0f\x91\x2f\xbd\xcf\x0c\x94\x58\xaa\xc7\x56\x95\x49\x41\x81\x56\x87\x09\xcd\x5e\x51\x8d\xc2\x04\x82\xd5\x06\x56\xc0\x35\x2b\x6a\xda\x9e\x70\x1c\x5c\x16\xde\x3b\x01\xfb\x8c\xf6\x94\x77\xf4\x39\xcf\x12\x30\xa3\x21\xa4\xcd\xf7\x61\x8a\x5e\x43\x0c\x0e\xf6\x5c\xc5\xbb\x25\xe3\x3d\x07\x91\x6e\x2c\xc6\xd5\x03\xb1\x39\x74\xa7\x2a\x11\x62\x37\xe8\xd7\xb1\x85\x68\x74\x4f\x3f\xe2\x49\x4b\x97\x23\x8e\xbc\xad\x37\x03\xef\x2f\x47\xe5\x79\x36\x2b\x65\xf3\x7a\x9e\x07\xb6\x40\x8f\x06\x81\x42\x2a\x46\x02\xe5\x4d\x6f\x86\x70\x67\xaf\x56\xdd\xfb\x2a\x2e\x42\xee\x38\xcb\x95\x8b\x73\x3d\x72\x3e\x75\x54\xa7\xea\xd1\xb4\xec\xb6\x3a\xba\x91\x5c\x60\x02\x4e\x1f\xa9\xa1\x20\xdb\x1f\x63\x09\xd0\x58\xb4\x4a\x3b\x4d\x6e\x25\x88\xa4\x25\x9f\x45\x64\x36\xdc\xe8\x19\xe7\x65\x02\x0a\x4b\x52\x6f\x32\x6d\x90\x0d\xb1\x21\x41\xe3\x96\x95\x24\xcc\x62\x30\xf3\xd0\xf9\xf7\x5b\x81\xbe\x0e\x5e\x1e\xad\x25\xa1\xf0\xdc\xcd\x35\x48\xbb\x96\x0c\xf2\x61\x07\x75\x24\x76\x4e\xd5\xde\x4b\x19\x5b\x40\x84\xb2\x16\xc0\x38\x04\x45\x08\x73\x92\x8d\xa4\x20\xd1\xe1\xcf\xb7\x86\xad\xe5\x68\xb1\xbf\x23\x57\x1d\x6a\x86\x8a\x0c\x83\x42\x9b\x96\xdc\xfd\x27\xb3\x0f\xc5\x1b\x44\xd9\x16\x01\x7e\x40\xd9\x28\xe6\x37\x44\x71\xa0\xd6\xb4\x11\xdf\x38\x11\xe7\xe6\x45\xa4\x7a\xf4\x1b\x40\x4c\xda\x34\x8d\xdd\x6c\x1b\x41\x72\x40\x5f\xbc\xf3\x32\xdc\xbd\x8f\x55\xbe\x42\x90\x16\x96\x2e\x4b\xd8\x40\xb1\x62\x8c\xe4\x7b\xf4\xc0\xd0\x64\x66\x1f\xec\xd3\x46\x08\x8d\x74\x29\x3b\x36\x86\x41\xcc\x7d\x6d\xb6\x0f\xc9\x71\x75\x71\x36\x50\x82\x1b\x47\xa1\x32\x28\x3c\x02\x0a\x60\x5c\x7d\xb9\x6b\xd2\x35\x64\x96\x47\xaa\x07\x64\x34\x92\x78\x78\xdb\x60\x43\x94\x20\x04\x01\xd0\x51\x3d\x8b\x46\x23\xe6\x66\x29\x6c\x6b\x4a\x3f\xe8\x4d\x5e\xf4\xda\x7d\x09\xf9\xa7\x5c\xf9\x85\x9c\x0e\x61\xca\x41\xc1\x21\x3f\x5d\x9c\xc1\x1a\x36\x48\x71\xcf\x22\xb6\xa8\xf5\xf0\xb5\xc9\x0b\xd8\xd8\x7e\xeb\xac\x29\x49\x88\x9f\x0d\xc3\xe1\x8f\x21\xb8\xb5\x65\xa5\x3b\x08\xfb\xa2\x0a\x6c\x53\xe9\xb7\xaf\xf4\x0a\xac\x14\xa8\xaa\x06\x6f\xb2\xce\xf1\xea\xfc\x5c\xd5\xb6\x82\x31\xef\x0c\xa1\xfe\x9e\x21\x14\x3d\x52\x87\x3a\x04\xfd\xc8\xad\xeb\xed\x89\x3e\xd4\x93\x0c\x01\x9c\x39\x5a\x03\x58\x02\x1b\x74\xc8\x83\xe3\x10\x6e\x34\x3a\x63\xaa\xf5\xe1\xf5\xa2\x4e\xf9\xb6\x47\xa6\x67\xea\x71\xc9\xe6\x06\x7c\xb0\x5e\xee\x28\xd9\x17\x9f\x0a\xa3\xeb\x0f\xba\x9f\x92\xd1\x25\x94\xc4\xd2\xe6\xdb\x70\x52\x62\xa3\x06\x4a\xcd\xd3\x82\x41\x07\x76\x17\xef\x88\x70\x25\xc4\xfd\xd8\x08\xb5\x3f\xc0\x5e\x70\xed\x8a\x4e\xf9\xa5\x58\xfe\x99\x5e\x00\xdd\xdc\x1f\x28\xbb\x32\x4e\x1b\x03\x8f\x82\x88\x99\xa8\xb8\x84\x00\x86\x46\xce\xb3\x98\xfe\x8c\xb8\x43\x00\xd7\xfb\x6f\x3b\x53\x80\xff\x58\x05\xd5\x8a\xd2\x3e\xa5\x3a\x85\x21\xdf\x1f\x2e\xd6\x14\x7f\x7b\xf1\x0a\x4f\xd3\x5f\x30\x3e\xb7\x05\x96\x8d\xf7\x14\xc8\xd8\xa4\xa4\xde\x27\x64\x5e\x25\xe0\x7e\xc6\xde\xc9\xac\x85\x59\xa2\x88\x43\x8b\x11\x55\xd5\x2b\x84\x7b\x70\x3b\x91\xd1\x44\x9e\xbd\x4a\x23\x14\xfe\xa4\x5d\xe6\x45\x61\x10\x86\x1c\xf4\x3b\xba\xb9\x0e\x08\xb4\x83\x3d\x4c\xe9\x01\xe3\x94\x89\x15\x1f\x96\x94\xdf\x39\x9a\x83\x96\xad\xa2\x40\x43\x91\x7f\xb5\xfe\x6c\x57\x9d\xd2\xad\x26\x0c\x91\x90\x4d\x2b\xa9\x20\x7d\xa2\x81\x23\xe1\xb5\x50\x96\x11\x1c\xfe\x14\x60\xdb\x7b\x49\x01\x64\x3a\xa5\x09\x5a\xe2\x09\xa3\xc3\x87\xea\x2f\x82\xb6\x43\x67\x38\x11\xca\x7a\x66\x40\x2a\x77\x41\x71\xf1\xa0\xf7\x82\xe4\x38\x1c\x61\xc0\x8d\x75\x9d\x73\xb2\x23\xe8\x92\x8a\x03\xd0\x71\xb1\x51\xfa\x06\x20\xae\x5a\x83\x59\x3c\xe4\xeb\x8e\x3e\x43\x96\xf3\x55\xf5\x54\xba\xa6\xb6\x66\xa3\xa7\x01\x53\x32\x50\x2a\x16\x5e\x3a\xc2\x09\x4a\x93\x1d\xe9\x85\x4a\xd3\xe8\xd7\x40\x72\xbc\x26\x4e\x62\xf0\x1a\x32\x22\x89\x66\x71\xe8\x25\x2f\x12\x95\x47\x00\x64\x9d\x94\xdd\x95\xc3\x9a\xee\x02\xb7\xf5\xae\x04\xc3\x28\x02\x3b\x47\xd4\x99\x40\x5b\x56\x10\x71\x84\xc5\x18\x05\xae\x86\xa5\x3e\x81\xd2\x6a\x7b\x99\x35\x3a\x41\xd3\x5e\x66\x69\x42\x1e\x88\x74\xdb\x81\x48\x88\x0c\x32\xa9\x09\x05\x05\x98\x45\x5a\xd5\xef\x13\x6f\x8c\x38\x67\x11\x68\x5a\x95\x64\x94\xed\x16\x80\xea\xc2\x20\x4f\xfa\x0c\x2c\x4e\x5b\xdf\xa3\x89\x2f\x05\xa7\xbc\xf7\x73\x7c\x9b\x22\x70\x97\xd1\x4f\xa5\xee\x76\x2e\x53\x80\xe4\x16\x95\x6a\x4c\x93\x74\xd5\x9f\xbc\x3c\xbd\x6d\x48\x19\x80\x3d\x0a\x17\x3f\xa0\x9e\x1e\x4c\x03\x0a\x80\xb1\xa4\x5d\x15\x3f\xcb\x49\xf2\xfd\x0f\xfe\xf2\xb6\x2b\xa0\xf9\x61\xdc\x04\xb2\x8e\xd6\x35\xfa\xc1\xac\xd0\x13\xd8\x15\xc0\x9d\x90\xd8\xd5\x6d\x6d\x1f\xa1\x98\x66\x30\xb0\x32\xbd\x2d\x76\xbe\x5d\xa1\x96\x5b\x4a\x10\x38\x08\x5c\x4a\x44\x59\x78\xa9\x1e\x68\x53\xb0\x5f\xe4\xef\x1f\x8c\x53\x79\xd3\x12\x1a\x25\x5a\x5a\xb8\xdd\xed\x7a\x5d\xd5\x8d\x6b\x99\xc8\xa2\xbc\x79\x9f\xdf\xcb\xb9\xb0\xfe\x82\xac\x8a\x8d\x4e\x7f\xc7\x03\x1b\xbb\x5f\xf4\x2c\x15\x2c\xd8\xf7\xbc\x3e\x94\x8e\x5b\x5b\x9b\x51\xa1\xd6\xbd\xc8\x8f\x0b\xf9\x55\xd9\x94\x3e\xba\xba\xea\xaa\xfc\x24\x6f\x2c\xf3\x06\xa2\x61\x45\xde\x70\x8d\xd8\x68\x5a\xfb\x55\x55\x57\xce\x9d\x43\x5c\x10\xdd\xd8\x1d\x20\x36\x81\xb7\x07\xa9\x98\xc2\x3c\xb9\x5d\xde\x9c\xf9\xfd\x63\xef\x83\xa7\x2e\x8c\x72\xfa\x70\x3c\xa7\x57\x31\x39\x91\xe1\x55\x94\x69\x87\xe8\x95\x2c\xc2\x03\x01\x27\x6a\x0a\xdc\x86\x7e\x64\xea\x10\xb7\x8a\xb2\x64\x68\xfc\x47\xf8\x11\x97\x1f\xbe\xb8\x18\xe8\x5b\x78\xbd\x63\xcd\xb3\x50\xfb\xe0\x84\xb1\x18\x2d\x0b\xd1\xef\xa7\x10\x6e\x05\x00\x7c\xcf\xec\xb5\xee\x65\xa1\x8c\x96\xc8\x97\xf0\xaf\x73\x87\x54\xab\x41\x24\x14\x01\x89\x99\x45\xf1\x54\x04\xfd\x53\xbe\x9c\x5b\xf9\x83\x4b\x1a\x1d\xc4\xdf\x88\x2d\x91\x7c\x2e\x48\xb3\x24\x43\x4e\x89\x23\x7f\xae\x25\x3f\xd6\xd5\x13\x21\x8a\xe8\x7c\x2c\x62\x44\x41\x3c\x38\x8b\xc8\xa1\xa2\xb6\x66\xb5\xd7\x66\x49\x46\x0d\x15\x64\x42\xb3\x93\x7f\x9a\xf1\xf5\xe0\x8f\x07\x48\xd4\xd1\x6c\x07\xe3\x1a\x0b\x4c\x67\x82\xab\xdc\x85\x12\xaf\x5b\x0b\x03\xce\x69\x5c\x1b\xed\x1a\x16\x51\x57\x73\xb1\x6b\xf8\xaa\xe7\x44\x31\x75\x35\x36\x49\x2f\xac\x8a\x4d\x82\x64\x90\x61\x48\x8e\xb0\x8c\x78\xdb\xf7\xf1\x4d\xc5\xbb\x19\x6d\x82\x9b\x59\x46\x4d\xb1\xbe\x7d\x50\x17\xc9\x68\x16\xab\xe2\x24\xca\x90\x34\xa2\xc4\x25\x9e\x1a\x3c\x43\x8e\x29\xd9\xc0\xaa\x8a\x45\xb9\xfb\x4a\xf6\xcb\x78\x80\x6e\xd5\x89\x64\xd3\x41\x0e\x17\xda\x5c\x18\xba\x81\xd0\x45\xa0\xc4\x67\x7e\x65\x16\xab\xa7\x7c\x15\x8f\x9b\x73\x54\x70\x81\x66\x85\xf3\x28\x21\x95\x8b\x15\x78\x60\x01\x66\x2c\x3d\x9d\x21\x34\xca\x4f\x64\x46\x38\xe7\xb8\xbd\x71\x6f\x47\x05\x12\xd4\x49\x38\x62\x84\x58\xd6\x92\x00\x47\xe4\xc0\xaa\x18\x28\x35\xe6\x00\x0c\xd7\x4f\x41\xbc\x7e\xb8\xa2\x20\xb8\x74\x92\x86\x0e\xf0\x70\x28\xf7\x1c\x00\x91\x75\xe6\x30\x13\x9e\x37\x18\x5c\x23\xea\x94\x5e\xd9\xb2\x22\x47\x05\xe5\xb9\x01\x06\x44\xe5\x37\x79\x3c\x4e\x83\xf0\x59\xc9\x4f\x56\x6d\xc3\x17\x44\xd2\xc5\x77\xe0\x7d\x8f\xb6\x34\x48\x38\x04\xc8\xa9\xde\x51\xc4\x1e\x3f\x22\x75\x0f\xcf\x06\x20\xff\x07\xb3\x7c\x42\x80\xed\x56\x5c\x04\x03\x75\x68\x51\x04\x6d\xc6\x58\xbd\xd1\x94\x87\x7a\x7b\xb0\x5f\x92\x64\xcd\x35\xb3\x5b\x50\xa3\x96\xb1\xfa\xb5\x84\xb9\x00\xd3\xb4\x40\x83\xbb\xec\x34\x34\x20\x88\xfa\x81\x05\x89\x24\x27\x41\x60\x52\xbc\x2e\x46\xf3\x83\x38\xb6\x5f\xcb\x7e\xad\x04\xc2\xee\xc1\x42\xab\x32\xb4\xc3\x3a\x86\x51\xb1\x97\x5f\xa2\x5a\x9c\x80\x70\x33\x43\xc2\x3f\xd5\xf6\xc5\x38\x42\x88\x14\x61\xe4\x33\xe2\x4e\x15\x93\xa0\x0e\x40\x89\xb0\x18\xa5\xab\xe2\xcb\x23\x4a\xb4\xae\x51\x14\xbf\xd2\x2b\xbb\xad\xf3\x47\xeb\x1d\xaa\x1a\x90\x21\x34\x44\x42\xe1\x1b\xa7\x28\x59\x0e\xe8\x0c\xe7\x4e\x86\x5a\x58\x40\x4b\x9d\xfe\x14\xde\x90\xfd\xa1\xb3\x28\x0c\x25\xd4\x17\xfa\xd6\x58\x0a\xb4\xd2\x99\xa2\x0a\xe9\x24\x05\xf7\x27\x42\xea\x07\xfa\xe4\xbf\xb4\x17\x0b\x8b\xe7\x85\xf0\x0b\x25\x47\x62\xfd\x7e\x94\x15\xf5\x37\x02\xbb\xfa\xed\xa5\x45\xaa\x1c\x1c\x8f\x6f\x5a\x24\x40\xd0\x34\x27\xb9\x4d\x34\xba\x38\xb0\x82\xed\x42\x6e\x5c\x1f\x7d\x50\xa7\xdf\xc4\x9b\x30\x94\xc2\x97\xb0\x0b\x2e\x78\x88\xe8\x69\xb4\x53\x42\xde\x92\x1e\xd0\x52\xea\x47\xdb\x55\xc1\x72\x28\x72\xfb\x68\x23\x20\x02\xf6\x5c\xe6\x6f\x21\xb7\x33\x88\xac\x42\x33\xb9\x5d\xaa\xd2\x68\x7f\xa7\x16\x36\x71\x23\xfc\x76\xc1\x69\x86\x73\x4d\x49\x92\xba\xf0\x85\x81\xbb\xb1\xad\xab\xe5\x8e\x5d\xab\x47\xbb\x27\xa7\x37\xeb\xec\x72\x60\xda\xfb\x93\x48\xf5\x9d\x41\x60\x0d\x48\x68\x2e\x20\x53\xbd\xa3\xd2\x37\x21\xc1\x28\x23\x6c\xf7\x26\x40\x6d\x43\xdb\xc2\x55\x11\x32\x15\xbe\xaf\x2c\x39\x27\x3d\xa3\xa4\x99\xaa\x79\x08\x95\x58\x93\x36\xfa\x31\xc0\x7b\xd9\xdf\x06\x89\x43\x8d\x0b\x99\x22\x3b\x89\x8c\x80\xea\x5b\x12\x10\xe7\x86\x74\x72\xa0\xdc\x83\x8d\x3a\x6c\xbf\x32\x77\xfa\x64\x95\xbb\x65\x9d\xc3\x65\x52\xd5\x7b\x20\x7e\xf6\x09\xb5\x89\xe4\x9b\x5b\x56\x5b\x1b\x6f\x41\xc4\x64\x67\x41\x81\xc4\xb5\xdd\x15\x2e\x3f\x1d\x00\x3f\x51\x05\x00\x2d\x02\xfc\xa4\x42\x0f\x58\xc2\x84\xa2\x9f\xa3\x03\x14\x28\xd1\x2a\x3b\xac\x92\x35\x48\x7c\xac\x03\x3c\x4c\xca\x29\xd5\x56\x56\x67\xf5\x37\x52\x5c\x9b\x04\xe7\x4a\x10\x8d\x9c\xe0\xa3\xf1\x58\x78\xab\x91\x40\x9c\x49\x05\xf0\x58\x71\x81\xea\xd3\x7b\x53\x1d\x01\x27\xfe\xfe\xdb\x9a\x3d\x83\x12\x93\x64\x41\xb3\x4f\xa5\x12\x08\x95\xc4\x11\x54\x52\xaa\xf3\xab\x4b\xa5\x27\x4a\xdc\x06\xe2\x7d\x9d\x67\xa3\x49\x96\xb1\x7a\x36\x0e\xb3\x92\xa1\x55\xb4\x5d\x39\x18\xd7\x59\x5e\x1c\x5a\xcd\x80\xe5\x23\x57\x4f\xdb\x74\x03\x79\xcc\xee\x91\x90\x32\xd5\x92\x67\x07\x10\x2b\x02\x69\xd4\x29\xa2\xd8\x72\x8b\xb5\x1f\xd8\x39\xaf\x1c\x0b\x03\x9f\xe1\xcd\xb4\x38\xd3\xdb\x3a\x27\x8a\xe7\x9a\x0a\xf2\x26\xaf\x26\x4e\x19\xef\xcf\x50\x68\x0e\x6d\x0e\x26\x21\x3b\x3e\x0e\xcb\x50\x42\x2f\x3d\x64\x30\x4d\x02\x93\x68\x21\x20\xb0\x42\x32\x04\xad\xcf\x78\xa6\xe9\x40\xac\x4c\xf7\xdc\x93\x09\xde\x72\x16\xa3\xea\xaf\xff\x49\x7f\x36\xf5\xf2\x01\x6a\x0d\x21\xd6\xe7\x21\xe8\x9a\xf6\x95\xa8\x06\x41\xb3\x7a\x17\x72\x77\xe4\x3c\x4b\xe8\x0c\x48\xdc\x6c\xb6\x45\x6e\x57\x61\x46\x44\x8d\x8b\x75\x88\xc8\x24\x4a\xd6\xa1\x9c\x72\xb4\x8b\x17\xa2\x46\xaa\x6f\x6c\x0c\xab\x8b\xfc\x25\x77\x13\x34\x96\xbc\x37\xfc\x1a\xaa\x6e\xcf\xa0\x6a\x2b\x16\x14\xd7\x13\x90\x15\xfb\x01\x6a\x29\xad\xaa\x0d\xda\x6d\x2d\xc1\x39\x8c\x47\xac\x48\x2f\x4b\x9f\xb2\x43\x08\x92\x6a\x3b\x90\x2a\xc1\x5c\x45\xa8\x6e\x2d\x2b\xba\x9e\xa9\x30\x7f\xb5\x59\xe5\x54\xf7\x5c\xbc\xa2\x2f\x9b\xb6\x67\x47\xce\x7e\x5b\xee\xe8\x24\x0e\x24\xa1\xc3\xdf\x85\x88\x1b\xd5\x8d\x39\x7c\xc8\x78\x2b\x0a\x84\xad\x99\xba\xe5\xf2\xcd\xae\x68\xb0\xd0\x7d\x41\xe5\x87\xba\x22\x51\xbd\x1a\x1e\x58\xe3\x7f\x6b\xeb\x06\x25\x41\xc4\xd7\xc8\xd8\xeb\xb8\x97\x14\x78\x51\x4a\xb4\x30\x6f\xb4\x01\x9d\x8e\x56\x58\x88\xcf\x43\x3f\xb2\x70\x2a\xc5\x3c\x37\x33\xd7\x60\x53\x82\x89\x0b\x75\xf5\xb5\x61\xd7\x0d\x36\x5d\xe0\x2f\x86\x63\x49\xec\xd7\xa6\xf2\x87\xcb\x46\xda\xe9\x42\xcf\x1d\x23\xca\xe0\x22\x53\x51\x26\x0c\xfa\x85\x61\x5b\x54\x60\xf6\x55\x49\xf5\x84\xb4\x6e\x0d\xb9\xdc\x98\x49\x58\xd7\x7e\x03\x23\x42\x92\x11\x63\xe9\x71\x19\xb5\x75\xfc\x72\xfd\x69\xa0\xa7\x16\x6a\x50\xde\x90\x9d\x3d\x8e\x62\xe3\xef\xf4\x5d\x00\xaf\x1d\xad\xa3\xf2\x47\x61\x7a\x34\xf4\x02\x88\xc8\xe3\x02\xe6\x75\x97\x31\x82\x58\x06\x21\x1c\x8e\x1e\x6e\x28\xa4\x13\x95\x34\xa2\xfc\xbd\xaa\xa1\x83\xc5\xbe\x47\x2f\x3d\x00\xb4\x4f\x73\xba\x67\xf8\x4d\x81\x8f\x09\xfe\x9a\x50\x60\x3f\x53\xa6\xd4\x15\xfc\x12\xab\x78\x89\x0c\xce\x41\xd7\xa2\x6a\x3d\x7d\xc1\xc9\x7e\xc8\x7b\x3c\xcb\xa7\x7d\x01\x3f\x3a\x78\x51\x0a\x4c\x3e\x56\xaa\x8e\xec\x77\x53\xef\xa3\x78\x17\x31\x4a\x4d\xd0\xb3\x08\xf4\x6d\xaa\x5e\x04\xbc\xe7\x7e\x97\x10\x0f\x63\x29\x65\x7b\x98\xef\x4e\xf9\xd7\xa0\x19\xb8\xd8\xf7\x57\xdd\x38\x50\x24\x25\x9a\x1c\xa1\x18\xd1\x2a\x18\xdf\x4c\x3e\x89\x41\x87\x10\x6e\xf8\xa3\xeb\x31\xb8\x00\x49\xc0\x40\x15\x79\xf9\x95\x6e\xcc\x45\x5e\xda\x4e\x96\x8c\x4d\xfe\xbe\x22\x1c\xed\xee\xaa\x23\xdd\x25\x7e\x21\x79\x0e\x51\x0e\x25\x4a\xe1\x4a\xd5\x0b\x95\x56\xb2\xc0\xb8\xe7\x21\xfc\x69\x51\x24\xfc\x8d\x44\xe9\x0b\xc0\xd8\x81\x52\xd9\xbd\xfc\x19\x77\x1d\xbb\x1a\x48\x17\x60\xdf\x06\xd5\x16\xb0\xd1\x37\x26\x2f\x13\x2c\xf6\x77\x4c\x38\x1d\x4a\x6f\xfc\xa1\xf4\x98\xfb\x41\xfc\x2d\x29\x74\x95\x24\xaa\x7c\x77\x0f\x95\x27\x44\x14\x33\x4a\xae\xe9\x9a\x9e\x45\xc5\xba\x44\x79\x1b\x27\x27\xe5\x78\xbd\x9e\x6e\x5d\x74\x3d\xf3\x27\x43\xf2\x34\x3f\x04\x6a\x61\x83\x46\x61\x5e\x6a\xb7\xcd\xeb\x3c\x58\xbb\x4c\x09\x4c\xe2\xa9\xbe\xad\x08\x2c\xf5\x5f\x58\xd9\x86\xea\x58\x51\x81\x16\xe5\x5f\xb1\xad\xab\x45\x61\x37\x64\xb8\x95\x4b\x5b\x97\x21\x69\xc9\x03\x9c\x3b\xd2\x80\x05\x03\xd5\x2f\x8c\x5d\xee\xc0\x9e\xe2\x4f\x94\xbb\xcd\xc2\xd6\x1d\xc4\x20\x03\x80\x99\x7a\x10\x00\xe3\xf8\xf9\x84\xb1\x17\x66\xf0\xf8\x70\x9d\x50\xc2\xa0\x30\x4d\xdc\x04\x27\x68\x39\x91\xf9\xd5\x64\x69\x71\x3c\x42\xcf\xfb\xd3\x49\x84\x11\x69\x49\xab\x56\xd5\x20\x8a\xea\x30\x20\xaf\xdb\xd0\x9a\x35\xe9\x92\x16\x88\x02\xf9\x14\x86\x3f\xb4\x82\x3a\x83\x14\xb1\x7b\x30\x5a\xfb\x58\x5d\x49\xe1\xdb\x5f\x3c\x38\x31\x13\xb5\x7c\xa8\x38\x09\xc6\xcf\x82\x40\xa7\x2c\x0c\x75\xbc\x95\x60\x4b\xf6\xce\x25\xd9\xe6\x7e\xe5\x7c\xdb\x43\x7e\x6e\x65\x97\xb9\xf7\x69\x61\xf3\xae\x77\xa0\xd2\x24\x36\x82\x7a\xd9\xcc\xfa\x27\x11\x6b\x23\x0b\x1a\x2a\xdf\x20\x9b\x89\x1f\x0c\x18\x42\x80\xe2\x25\x19\xfb\x58\x90\x4a\xe2\x4b\x44\x26\x88\x58\x04\x34\x2e\xf0\x74\x1e\x18\x8e\x31\x45\xfb\xe5\x1a\x66\x96\x6d\xfc\xd0\x13\x3f\xb0\x90\x33\x25\xe4\x24\xe3\x0a\x41\x0c\x8a\xd5\x19\x24\xe5\x23\x60\x29\x54\x59\x25\x5f\x10\xe6\x69\xcb\x46\x07\xf5\x34\x68\x36\x13\x8e\x92\xfc\x16\x00\x41\xa8\x32\x5d\x10\xa7\xf5\x7d\xe2\x1a\x93\xb0\xc0\x21\xa5\x27\x16\x27\x9d\x7e\x3f\x0f\x02\x3f\x00\x17\xd5\xef\xc4\x10\x80\x4a\xde\x23\xac\xe0\x7d\x33\xe1\xba\xd9\x5f\xa0\x58\x35\x94\x43\x9e\x4e\x3e\x4e\x87\x9f\x33\x3d\x9f\xc0\xbf\x47\x7f\x9d\x8f\x6e\xe6\xfa\x76\x34\xfd\x3c\x9e\xcf\xb1\xda\xf7\xf0\xf6\xf6\x7a\x7c\x39\x7c\x7f\x3d\x52\xd7\xc3\xdf\x07\x7a\xf4\xd7\xcb\xd1\xed\x5c\xff\xfe\x69\x74\x13\x8b\x34\xeb\xd9\xfc\xff\x67\xef\x5f\x97\xdb\x46\xd2\x74\x51\x78\x7e\xe7\x55\xe4\x52\x44\x7f\x96\x3a\x20\x58\x92\x4f\x5d\x76\x4f\x47\xd0\x14\x6d\x73\x5a\x22\x35\x24\x55\x2e\xcf\xb7\x57\x44\x25\x89\xa4\x88\x36\x08\x70\x90\xa0\x64\xce\xd5\xac\xdb\xd8\x7f\xf7\xba\xb1\x1d\xf9\x1e\xf2\x00\x82\xb2\x5d\xd3\x55\xb3\x66\x77\xa9\x7e\x94\x2d\x93\x40\x9e\xf3\x3d\x3c\xef\xf3\xf4\xec\xe7\x87\x23\xf9\x71\x32\x9c\x0d\x47\xef\x0f\xab\x84\x3f\x1d\x4f\x04\x7c\x11\x75\xb9\x07\x4e\x5c\x3c\x6c\x12\xab\x87\xcb\x8f\xc3\xd9\x87\xf1\xed\xcc\xb7\x7d\xfc\x0e\x54\xa0\xff\x3a\x1c\x5d\x26\x72\x30\xb4\x0f\x12\x24\x2d\x3e\xb8\x0c\xc4\xc5\xbf\x45\x51\xbc\x43\x88\x5c\xfc\x42\x45\xf1\x14\x07\x70\x34\x1b\x4e\x06\x72\x32\x9c\xfe\x55\xf6\xa6\x82\x86\xf5\x5f\x6f\x7b\xee\x39\x37\x83\xc9\xbb\xf1\xe4\xba\x07\x32\xd7\xef\xa2\x2e\x0f\xa7\xd0\x5b\xf9\x69\x7c\x9b\xca\xe9\x87\xf1\xed\xd5\x65\xf8\xef\xc2\x0e\xd3\x40\x5e\x0e\xde\x0d\xfa\xb3\xe1\x8f\x83\xc4\x7e\x50\xf6\xa6\xd3\xdb\xeb\x01\x8d\xf6\x14\x54\xb1\x7b\x57\x57\x72\x34\xe8\x0f\xa6\xd3\xde\xe4\x93\x44\x09\x70\x18\x85\xc9\xe0\xa6\x37\x9c\xc8\xf1\x44\xf4\xc7\x93\x89\x7d\xca\x78\x44\x4b\xe8\x65\x8a\xd5\x07\x2e\xa7\x76\xc5\x90\x77\x7b\x60\x04\xe2\xe8\xb7\xa3\x2b\x3b\x0c\x93\xc1\xbf\xde\x0e\x27\xed\x15\x22\xaf\x7a\x1f\xed\x14\xf4\xde\x4f\x06\x30\xca\xe1\x82\xf8\x38\xbc\xba\x12\x76\xea\xda\xab\x02\x94\xc8\xed\x3f\xf8\x55\xf1\x49\x7e\xfc\x30\x96\xd7\xe3\xcb\xe1\x3b\xbb\x40\x70\xd5\xc8\xfe\x78\xf4\xe3\xe0\xd3\x34\x1a\x94\xde\x34\x58\xae\xbd\xb7\x63\x3b\x2e\x6f\x07\x92\x54\xd9\x67\x63\x18\x24\x3b\x69\xa4\xaa\x1e\x2c\x0b\x78\x27\xc9\x1e\x7b\x69\x76\xe1\xf5\xda\xf7\xa4\xd9\xf9\x21\x4e\x92\xdc\xeb\x90\x4b\xd0\x21\x9f\xc8\xe1\x88\x57\xcd\x6c\x0c\xda\xe4\xe1\x0c\x07\x6a\xe7\xfb\x2b\xd2\x49\xb4\x5f\xf6\x66\x3d\x09\x2d\x9e\xf5\xe4\xdb\x81\xfd\xf4\x64\x30\xba\x1c\x4c\x06\x97\x62\x38\xea\xf5\xfb\xb7\x93\xde\x0c\x5e\x66\xbf\x31\x98\xca\xe9\xed\x74\xd6\x1b\x8e\x70\x36\x6c\x7f\x61\x7b\x0f\x27\x97\x6e\x87\xc1\xa2\x7d\xd7\x1b\x5e\xdd\x4e\x78\xd9\x09\x6e\xd4\x6c\x2c\xc7\x37\x03\x78\x24\x2c\xbf\x60\x26\xf0\x13\xd3\x13\xaf\xa7\x0e\x8a\xe9\x5e\x0c\x1f\x3e\x27\x70\xc6\x3e\xf4\xa6\xf2\xed\x60\x30\xfa\x76\xcd\xf5\x29\x2d\xbe\x57\x29\xfa\x90\x9b\x5a\xfb\x05\x38\xdd\x2b\x54\xf2\x57\x57\x16\x9d\x76\xae\x1e\x0a\x94\x37\xa3\x55\xec\x0b\x37\x1c\xdc\x1e\xf1\xda\x18\x8a\xb0\x96\x17\x1a\x40\x45\xb5\x50\x05\x95\x30\x21\xad\x32\x61\xe4\xe9\xfc\xc5\x2a\x39\x02\x9a\x5b\xf3\x50\x3f\xa0\x23\xb4\x05\x8f\x0f\xe8\x38\xd0\x44\xa6\x27\xa9\x07\x8a\x10\x55\xa6\x91\x8b\xa2\xc2\xca\xdf\x8d\xbd\xf9\x40\x15\x02\xf5\xa9\xe6\xa6\x2a\xb6\x8d\x46\xd6\x68\x34\x40\xac\xdd\x9d\xdf\xe7\x85\xf0\x6d\xef\x08\x0d\x46\x05\x92\x0c\x49\x8e\x2a\xc3\x7c\x49\x8a\x88\x06\xc2\x97\xb6\xb7\x81\x49\x0e\x17\x51\xca\x5a\x37\xdb\x3a\xa4\xb5\x95\x83\x91\x9d\xd0\x03\x3a\x8a\x1f\xaa\x07\x3b\x48\x3d\x18\x00\xc4\xff\xcd\xb8\xf8\xe0\x93\xbd\xca\x46\xfa\x81\x1f\x6f\x5c\x12\x92\xe4\x89\x48\x3f\x72\x13\x0a\x30\x04\xba\xc3\x94\x64\xa3\x36\xde\x41\xd9\xaa\x75\xe9\x2b\x4c\xe1\x89\xad\xd9\x93\x66\xc3\xe4\x9a\x69\x90\x48\xaa\x92\x6a\xb1\x82\xa4\x8c\x83\x0b\x53\x62\x15\x28\x73\x43\x51\x5a\x34\x74\x34\xcb\x91\xa3\x36\x46\x2c\xde\xcb\x62\xd7\x2e\x45\x69\x7c\x49\xc2\x8c\x10\x85\x89\x54\x4d\xa3\x28\xa4\xec\x4d\x53\x2e\x8d\x73\x96\x3d\xa1\x47\x87\xe0\x15\x19\xb5\xb4\x4d\xb6\xcd\x85\x2f\xbb\x6c\x4a\x83\x8c\x29\x58\x87\x03\xb0\xb3\xa0\x06\x03\x85\x67\x4c\xe3\x29\xd8\x8b\x1d\xda\x53\x14\x12\x0f\x98\x1f\x1d\xd7\x32\x72\x74\xd8\x27\xc1\x23\xcc\x0a\x02\x42\x98\xb2\xf3\xf4\x79\x5a\x1e\x2d\xbc\x72\x65\x81\x6e\x6c\x26\x95\xd8\x54\x10\xdc\xc0\x40\x15\xd3\x1d\x2d\xb7\x8e\xce\xd6\xf6\x66\x69\x0d\xce\x54\x88\x3f\xdb\x71\x84\xef\x32\x51\x5e\xd0\xf5\x27\x06\xaa\xc9\xf0\xb1\x72\x5e\xe7\x7a\x29\xf3\x4c\x2b\xc9\xcc\x51\x94\x60\x49\xff\xd2\x56\x9a\xff\xf3\x4e\xab\xfa\x2f\xf2\xcf\xf0\xf5\x8a\x2b\x31\xff\x22\x50\x81\x63\xe3\x01\x3e\xd1\xfc\xbe\x76\xea\xd5\xd1\xac\xe6\x4d\x4b\x95\x39\x6f\x1c\x3e\x2b\xf2\x8f\xbf\xc5\xd8\x55\xa6\xdb\x16\x17\x9d\x92\xf8\xe4\x94\xec\x39\xbc\x57\x41\xe9\xc9\x71\x5c\x2c\x7c\xb2\xef\x25\xa5\xfb\xfd\xf6\xdd\x73\xb5\x2e\xab\x6a\xa3\x5d\xa5\x16\xb8\xde\x68\x94\x2f\xb7\x05\x7a\x95\x64\x6a\xc1\x1d\xcd\xe6\xd6\x9b\x50\xa1\x18\x9f\x43\xa1\xf2\xe0\xb0\x59\xee\x59\x4c\x55\xcd\x06\x93\x38\x6c\x30\x4d\xb5\xfe\xc6\x41\x5d\x52\xae\x4b\xa0\xab\xcb\xc8\xc0\x70\xe1\x3a\x84\x7b\x7c\xa6\x7d\xc3\x84\x79\x86\xe3\x26\x18\x44\xf0\xe6\xca\xaa\x49\xa4\xd1\x5a\xfe\x79\xd5\x34\x1b\xf3\xfa\xe9\xd3\x87\x87\x87\xf4\xae\xdc\xa6\x55\x7d\xf7\x94\xc1\x40\x4f\xff\x02\x45\x7c\x06\x5c\x81\x88\x81\xa6\x2a\x91\xad\x04\xa9\x30\x14\x8a\x92\xdb\x55\xa1\x0b\xbd\x68\xea\xaa\xcc\x17\x08\xa0\x51\x1b\x5d\xcb\xb5\xca\x0b\x07\xd1\x08\x78\x18\x17\xca\x4b\x2d\xe2\xe9\x8f\x91\xcb\x6f\x88\x52\x62\xc6\x98\xc6\x09\x19\xbc\x63\xb1\xf9\xbc\xe1\x9b\x11\xef\x8f\x1d\x57\x7d\x22\xdb\x13\x02\x34\x99\xeb\x3e\x15\x1d\x61\xf0\x3a\x5c\x76\x4a\x3e\xe8\x39\x67\x3b\x70\x89\xe7\x4d\x28\xed\x84\xb1\x6a\x2a\xe8\x15\x4a\x1e\xb1\x96\x17\x44\xcc\xb0\x54\x4e\xab\xcc\xf8\x26\x40\x9a\x71\xb1\x02\x10\x3e\x27\xc2\x32\x86\x88\xa3\xf4\x8e\x2a\x77\x02\xea\x6d\x7d\x34\x9c\x48\x3d\x89\x5a\x0e\xb4\x9e\x3c\xcf\x9e\xbd\x73\x5d\xf4\xc5\xee\x82\xb9\x6e\x1a\x82\x3d\xf9\x7a\x5d\x96\x5f\x7a\x03\x2b\xc0\xd5\x1f\x3c\xf3\x65\x0a\x9c\x23\x6b\xd1\xcb\x7d\x6a\x0d\xb9\x1d\x44\x18\x28\xbd\xde\x14\xd5\x4e\xd7\x1c\x3b\x0e\xc4\xf2\x58\xde\x4f\xd7\x27\x80\x6c\xb6\xbe\x5f\x91\x08\x94\x5f\x83\x1c\xa4\xc9\xef\x4a\xe4\x41\xe3\x83\xd0\x5b\x41\x47\x1e\x4f\x11\xc8\xba\x7b\x3d\x10\xf9\xae\xaa\x05\x82\x1b\xe2\xd5\x69\x57\xbc\x93\x97\xf4\x61\x3e\x28\x59\x42\x8f\xd3\x6d\x22\x90\x80\xfe\xa6\xbd\xf0\x4f\xbf\xff\xfc\x77\xf9\x49\x9f\xf6\xfb\xa7\x6f\x3f\x9d\x9e\xa7\x67\x69\xf3\xa5\xf9\x55\xde\x71\x76\x76\x76\xf6\xf2\xe5\x73\xfb\xff\xf3\x57\x2f\xce\xc2\xff\x9f\x9d\x9d\x5d\xbc\x3c\x7b\xfe\xe2\x9f\xce\x9f\xbd\xbc\x38\x3b\x7b\xfe\xea\xfc\xc5\xf9\x3f\x9d\x9d\x5f\xbc\xba\x78\xf1\x4f\xf2\xec\x57\x69\x4d\xeb\x67\x6b\x2d\x2b\x29\xff\xa9\x50\xcb\x3a\xff\x6c\x0e\x7e\xee\x6b\xff\xfe\xdf\xf4\xa7\x6f\xcd\x69\x7b\xb4\xf6\x81\xc9\xcf\xc8\x9e\x27\x6b\x90\xe7\xe9\x99\xec\x4f\x06\xbd\xd9\xf0\xc7\x81\xec\x8f\xaf\xaf\xc7\xa3\xa9\xec\x8f\x27\x37\xe3\x49\xcf\x1a\xfe\x18\x55\x9a\xc9\x9e\x75\xfb\xc5\xbb\xe1\xe4\x1a\x1c\x83\xcb\xf1\x00\x7f\xcf\x61\x9d\xab\xc1\xfb\xde\x15\xc5\x21\x06\xd3\x54\x5e\x0e\xa7\xb3\xc9\xf0\xed\x2d\x3c\x03\x9c\xc4\xe1\x54\x5e\x4e\x7a\xef\xac\x37\xdc\x1f\x8c\xa6\x03\xe1\x9e\x01\xef\x1f\xc8\xde\x48\xf6\x66\xb3\xf1\x64\x34\xf8\x74\xda\xbf\x1a\x0e\x46\x33\x39\x19\x5c\x41\x2b\xa6\x1f\x86\x37\xe9\x7e\x3b\xe9\xe5\x53\x01\x4f\x1f\x8e\x20\xe8\x82\x6f\x1c\xd9\xc7\x1d\xf5\xa6\xa7\xc3\xe9\x91\x7c\xdb\x9b\x0e\xa7\x1d\xdf\xbf\xee\xfd\x75\x10\x06\xcd\x86\x83\xa9\x98\x0c\xde\xf7\x26\x97\x1c\xdc\x0a\x9f\x49\x6f\xbb\x4c\x70\x04\x86\xd3\xfe\x55\x6f\x78\x3d\x85\x30\x04\x5a\x44\x41\x08\x42\x4e\x06\xd3\xdb\xab\xd9\x70\xf4\x5e\xbc\x9b\x8c\xaf\xe5\x70\x36\x95\xb7\xd3\x41\x2a\x18\x20\x0c\x51\x3b\xf9\x71\x3c\xf9\xab\x3c\xee\x4d\xe5\xe5\xe0\x1d\x3a\xf7\x83\xab\xf1\xc7\x13\x3b\xea\xfc\x3a\x79\x3b\xb2\x8e\xb8\xfd\x34\x3a\x66\x3c\x9a\xed\xee\x88\x9b\xdb\xb7\x57\xc3\x3e\x8f\xaf\x3c\x3e\xea\xf7\x6f\xae\x8e\xac\x0b\x7f\x44\xbf\x3b\x3a\xc1\x10\x16\xbc\x16\xdf\x31\x1b\xf4\x29\x08\xe8\x43\x36\x51\x00\x2f\x8e\xfc\xa4\x10\x3a\x80\x38\xc8\x3b\xff\x28\xfc\xe4\xec\x83\x9d\xc2\xa9\xec\xdd\xce\x3e\x8c\x27\xc3\x7f\x0b\xda\x3e\x9c\x0a\x6e\x16\xbe\xf6\xc3\xf0\xed\x70\x36\xb8\x4c\x85\x78\xfb\x49\x0e\x7e\x1a\x4c\xfa\x18\x6c\xb1\x4f\x87\x46\x4c\x39\x5e\x09\x2f\x70\x83\xf1\x61\x30\xe1\xa0\x58\x1f\x62\x94\x76\x2e\x20\x14\x25\x67\x63\xf1\x76\x20\xdf\x8e\x6f\x47\xd0\x9d\xfd\x01\xa3\x16\xe0\x10\xe0\x5f\xc6\x13\xf9\xde\xce\xfc\x14\x1e\x69\x7f\x8f\x2f\x17\xfd\xf1\x88\xc2\x2d\x18\x5b\x1d\x41\x90\x68\x78\x39\xa0\x6d\x31\x7e\x67\xbf\x31\xa1\x56\x70\xa4\x0f\xe2\x1e\x5d\xee\xb3\x53\x4d\xbe\x74\xc0\x74\x23\x84\x4a\xe5\x51\x1f\xc1\x03\x76\x7f\x7e\x0c\xe4\xe0\x15\x65\xd9\xbc\x5e\xf3\x46\xd7\x79\x95\x01\x2b\x67\x6e\xcc\x16\x2c\x9e\x66\x55\x15\xd5\xdd\x4e\x56\xb5\xd0\xe5\x62\xb7\x28\xaa\x8d\xce\x72\x95\x44\x8c\x9a\xf0\x5c\x28\xda\x69\x0c\x61\x00\x30\xde\x10\xa8\x80\x5a\x83\x21\x16\x02\x91\x3e\x7d\x51\x31\x8e\xc1\x73\xbc\x04\x22\x82\x00\xee\x3a\xa0\x09\x41\x6a\x70\xe8\x9c\xac\x8d\x2e\xee\x81\x50\xc0\xda\x74\xc6\xe8\xf5\xbc\x60\xc4\x90\x62\x10\x85\x1d\x07\x90\x14\x49\x65\xcf\x73\xc3\x85\x92\x85\x42\xc9\xd6\x98\xa1\x89\x47\x8c\xb4\x01\x75\x86\x92\x97\x1a\x94\xe3\xdd\x07\x8f\x15\x95\x06\xb0\x06\xdb\x89\x4b\x20\xec\x95\x10\xf8\x94\xe2\x3c\x95\x47\xad\x27\xc5\xd3\x44\x10\xb5\xed\x86\x40\x6a\x1f\x89\xdc\x2d\xfe\x85\x2a\x33\xa6\x11\xae\xf5\xa9\xfe\x82\xc9\x38\x92\xcd\x08\x26\x1a\xb0\xa1\x05\x59\xd6\xeb\x2d\x92\xb9\x47\x68\xaa\xac\x56\xd6\xbc\xe3\x4a\xba\x25\x56\x47\xa9\xc2\xd5\xc5\xad\x2b\xac\x53\xce\x17\x61\x3a\x27\xb1\xb6\x72\x09\x60\x36\x0c\x7a\xd9\xa9\x68\x80\x92\x14\xf0\x5f\xf0\x30\x35\xaf\xf3\xec\x6e\xcd\x42\x91\x99\x2e\x8d\x2f\xb6\xf3\xe9\x72\x14\xf4\xdc\x5b\x65\x44\xc0\x50\xeb\x85\x32\x0d\x10\xc8\x94\xc6\x7e\x54\x67\xf8\xfd\x4c\x6d\x00\xeb\xc5\xba\xea\x98\x8c\xea\x9c\x67\x19\xce\xb3\xf8\xbe\x79\x6e\x4d\x6a\xc7\x9c\x2e\x52\x79\x74\x45\x55\x97\x47\x81\x40\x79\xc0\x21\x0f\xf5\x92\x8d\x23\x84\x01\x6f\xc3\xf8\xae\xba\xe0\x90\xe8\xcc\xae\xe3\x8e\x97\x52\x66\xa9\x3c\x1a\x73\xa1\x67\x0f\x62\x18\x5f\x7d\x21\xb0\xe0\x10\x79\x1b\xbf\x30\x15\x42\xa7\xf2\x28\x5c\x7d\x51\x9d\xbd\x97\x6a\x76\xb1\x12\x90\x33\x64\xa2\xe9\x16\xde\x5e\xec\xb7\x77\x99\xca\xa3\x4f\xd5\x36\xd2\x47\xef\x68\xdc\xb7\xa8\xd0\x09\xac\x4a\x27\x11\x6f\xaa\x4d\x04\x45\x7f\xa0\x3b\xcc\x0e\xe3\xfe\xdb\xfa\x75\x82\xfb\x8f\x4c\xa8\xf4\x58\x17\x09\xe0\x2a\x91\x00\x9a\xe1\x6a\x16\x79\x7e\xa1\x70\x82\x81\xb5\x87\x19\x2d\x32\x6d\x36\x79\x03\xf0\x57\x2e\xa6\x74\x25\xff\xa9\x10\x17\xa9\x7c\xa7\xf2\x1a\xc0\x4f\xa8\xad\x98\xca\x36\x32\x31\xc0\x12\x83\x9e\x5e\xc6\xca\xc1\xd9\xd6\xba\xa8\x10\xb7\x4e\x42\x49\x42\xd8\x51\xd4\x24\x55\xe3\xa0\x42\xfb\x59\x5e\x35\x21\xce\x03\xa3\x8a\x00\xb0\xe8\x03\xe0\x46\x38\x60\x2c\xd5\x12\x05\x1a\xad\x31\x0f\x43\xf5\x50\xea\x9a\x3a\xee\x7f\x5b\xa8\x07\xf7\x5c\x11\x2b\x37\x5a\x3f\xf7\x59\xea\xc6\xe7\x7d\xad\xca\x06\x44\x2b\xff\x16\x48\x0b\x7a\xfc\xd9\x63\xc0\x42\x9e\x0a\x61\x1d\xfa\x39\xe3\x6e\xb1\x56\xf9\x50\xed\x53\xd2\xae\x91\x22\x0a\x59\x55\x00\xfd\x29\x2c\x8c\x6c\x5b\x47\x15\x62\x41\x07\x5c\x17\x4f\x42\xe4\xbb\x83\x62\x07\x70\xea\xbc\x14\xfe\x90\x36\x32\xd4\xe8\x7c\x0d\x97\x34\x4c\x21\x69\xb0\x49\xbf\x1e\x01\x2d\xea\x20\x48\xe1\x55\xdb\x54\x11\x7a\xbb\x75\x8e\x19\x07\xdb\xd9\x7f\xaa\x54\x2d\x5c\x13\x05\xf6\x5a\x57\x9e\x79\xc3\xc7\xcb\x1c\x9a\x87\x87\x05\x3c\xd6\x3f\xb3\x75\x2a\xda\xef\x2c\xe0\xd3\x41\x5c\xd4\x73\x45\x6c\x56\x55\x59\xe1\xd5\x60\x00\xa8\xce\xda\x52\x5c\x7d\x93\xb0\xc6\x87\xff\x0d\xe0\x2f\xda\xbf\x85\x6a\x7e\x86\x94\x29\x99\xe5\x77\x79\x63\x6f\xb0\x6d\x96\x57\x2d\x96\x03\x3f\x62\x8e\x4b\x66\xbf\xfb\x1d\x5d\xcf\xfe\x8f\xea\x46\xc7\x38\xcf\x3c\x69\x10\xae\x31\xba\x18\x79\xf9\xa1\xdc\x62\x81\x22\x2d\x8a\x62\x31\xf5\x5a\x35\xc6\x15\x7d\x96\xd5\x03\xd4\x6a\x95\x22\xaa\xf6\xcc\x10\xb6\x84\xb8\xae\xe8\x15\x21\xf6\xce\xd5\x7c\xfb\xe2\xb2\x58\x96\x58\x19\x22\x35\x5d\xac\x4a\xaa\x1f\x70\xa1\xa4\xc3\xfb\x84\x8e\x9f\xbd\x46\xa7\xa1\x5a\x37\x82\x87\x99\xbd\x88\xab\x12\xe6\x3b\x7f\x1e\xdb\x37\xd3\x41\x80\xa4\x83\x3a\x4b\x85\x00\x7c\x97\xaf\xf5\xc6\x1e\x16\x21\x5f\x05\x0e\x1b\x25\x0d\xe5\x33\xea\x7e\x1e\x92\x25\xad\x55\xa6\x43\x6e\x04\x97\x2e\xf4\x91\x7a\x9f\xac\x09\x4b\xcb\x71\xa7\x73\x9d\x84\x5f\x5a\x49\x40\x6e\x8b\x2b\x29\xf8\x0d\xad\x19\xac\xd3\xf1\x1f\x83\x95\x52\xec\x04\x2f\x29\x6f\x13\x96\x91\x30\xf0\x81\xc2\x37\xdb\x66\x27\x13\x48\xb3\x2a\x5c\xc8\xdb\xa9\x44\xde\x96\x39\x3c\x7d\xa2\x29\x57\x34\xa4\xa2\x26\x34\xcf\x92\x8e\x6b\x15\xb2\x5e\x02\x1f\x14\x6d\x15\x3e\x3f\xa1\x95\x9f\x50\x1b\xf6\x1b\x06\x40\x3c\x3e\x00\x3c\x3e\x7e\x5c\xed\xda\xc0\xb0\x2d\xd5\x94\x13\xce\x89\x4c\x92\xe0\x48\x40\xd3\xb0\x68\xf0\xa3\xee\xbe\x3c\x6c\x37\xd0\xa8\xf8\x72\xa0\x27\xa2\x9b\x26\xc0\xad\x25\xbb\x04\x61\x32\xe2\xf6\xf9\x12\xe0\xc0\xf6\x72\xf3\x71\x48\xfa\x14\xda\x0b\x12\x0a\x6d\x4a\x0e\x3e\xec\xe3\xa4\x76\x90\xac\xcb\xb5\x89\x5b\xf0\x9d\xab\x4f\x3c\x3a\xf8\x7e\x48\x9d\xc2\xe3\x21\x39\xe2\x95\x02\x31\x75\xa0\xec\xf0\x52\x75\x41\xb1\xdd\x47\x57\x64\x47\xa5\x88\xf6\xac\xde\x2f\x46\xec\x34\x30\x65\x8f\x8b\x14\xc2\xb3\x2b\x80\xfe\x3d\x72\x05\xee\xfb\x7c\x8c\x3f\xcd\x8d\xdc\x23\xc4\xe9\xb8\x2f\xa5\x02\x92\x43\x57\xc8\x80\x1d\x41\x0e\x6f\xcc\x3d\x43\x45\x8d\xe9\xb2\x6d\xba\x2a\x1d\xec\x6c\xe1\x9d\xdb\xd5\x34\xf0\xfb\x28\x4f\xea\x18\x7c\xdd\xe9\xc7\x4b\xa9\xcd\xb4\x4c\x05\xc8\x50\x61\x2a\x88\x10\xd1\xd9\xb2\x7b\xfd\xb1\x76\xa3\x86\x2c\x06\xd6\xa8\xc2\x19\xef\xde\x41\x9b\x81\xfd\x0e\x81\x7e\x07\x68\x8b\xda\x51\xd2\xa6\xb1\x57\x48\xd4\x91\x7d\x37\xaa\xbb\x23\xe2\xbb\x3a\x22\xdb\x1d\x69\xbd\x43\x7c\x5f\x47\x64\x67\x47\xc0\x45\x67\xc0\xc1\xaf\x74\x72\xa3\xf3\xdb\xbe\xea\xed\xef\xdb\xf6\x49\x22\xa3\xc3\x42\x04\x87\x45\x5b\xca\xd9\xd3\x61\x71\x84\xc0\xe7\xcf\x5b\x5d\xb6\xb3\x94\x41\xd9\x82\xa3\x50\xa1\x51\x27\x9d\x37\xe0\xc2\xb1\xe6\x0a\x13\x00\x6d\x9b\xbc\x80\x9a\x4d\x2c\x17\x0a\xab\x3d\x4a\xb5\xd6\x50\x4e\xb6\x31\x7a\x9b\x55\xe5\x6e\x2d\xf3\x65\x60\x3c\x9f\xf0\x86\x6f\x37\x22\x5f\x22\xb5\x71\xae\x33\x64\x46\x6c\xf2\xa6\x70\x9c\x1c\x1f\xa9\x90\xd0\x7f\x84\xcb\xc6\x94\x21\xa4\xe7\xde\x12\x53\xd4\x31\x2e\xc9\x75\x02\x42\x1d\xc7\x4e\xc7\xfa\x91\xc7\x3a\xbd\x4b\x13\x79\xf4\xce\x2e\xa0\x55\x18\x3c\x61\x14\x37\x7c\x6c\xbe\xdb\x5b\x43\x47\x76\xc8\x8e\xa6\x8b\x5a\xeb\x12\x2c\x44\x57\x68\xe8\x78\x99\xda\x5f\xa5\x7d\x74\x74\x42\x30\x6f\x6a\x3a\x19\x77\x8e\xe4\x9e\xcc\x3b\x58\xd9\x9e\xce\x0e\x4e\xcc\x37\x9e\x6d\x5f\x38\xed\x57\xcc\xd2\x7e\x65\xa8\x3a\x96\x5a\x02\xa5\x4b\x72\x9d\x97\xf9\x7a\xbb\x46\x75\x5b\x6a\x12\x52\x3b\x6e\x36\x5a\xd5\x04\xe0\xf0\xb1\x1b\xc0\x06\xa1\x70\x54\x10\x27\xa0\x2f\xe2\x77\x10\x59\x1d\x9e\xf4\x0e\x34\xa2\x4c\xa0\xc3\xac\xa8\x12\xe6\x91\x07\x0b\x7c\xb0\x13\xcd\x9e\x44\x84\xcd\x26\x61\x20\x6b\x4e\xd2\x07\x1e\xe5\x0a\x16\xd9\xdb\x40\xb0\xce\xad\x05\xcf\x99\xcc\x72\xcf\x9d\xac\xae\xee\x14\x71\x24\xd1\xd8\x2f\xba\x77\x0d\xd5\xaa\xd3\x3e\x02\x34\x11\xa0\x22\xf1\x5b\x4f\x8c\xf4\x55\xed\x68\x7c\x07\xd3\x99\x97\xf6\xb2\xd9\xbd\x16\x22\x4f\xfd\x8b\x40\x2c\x48\x2f\xb6\x10\x96\xf2\x26\x71\x1e\x18\x36\x91\x99\x8d\x35\xce\x8d\x37\x74\x39\x3e\xe1\x6c\x13\xb6\x1e\x90\xb3\x05\x3f\xaa\x1e\x96\xdb\xe2\x00\x09\xd2\xbe\x75\x23\x18\xdd\xf1\x09\x71\xf5\xae\xee\xc5\x01\x99\x91\x95\x1f\x79\xde\xd0\x03\x07\x51\x39\x00\x1a\x14\xa6\xaa\x77\xae\x75\x4b\xad\x01\x1b\x67\x20\x28\x64\xe2\x98\x20\xd5\xf0\x5a\xff\x27\xcf\xf1\x92\x87\x1e\x07\xf5\xd3\x54\x8a\x1f\x05\x26\x12\x4f\x49\x9d\x04\x4c\xd8\xd8\x9d\x44\x90\xfe\x54\xa1\x1e\x5c\x64\x23\x7c\xa9\x93\xaa\x69\x4b\xad\x60\x49\x04\x45\x13\x65\xa6\x97\x6a\x4d\xf1\xd2\xbc\xbc\x57\x5c\xb7\xb0\xb1\x7b\x6c\xb1\xf3\xa1\x95\x06\xb8\x8c\xb6\x76\xce\xfe\xb6\xad\x77\x5c\x19\x1c\x3c\x19\xaf\x1b\x82\x48\xf7\xa6\x92\x80\xc9\x57\x9f\x02\x80\x74\x98\x6f\x70\x18\x4a\x00\x51\x13\x6c\xd6\x63\x66\xc5\x78\xf2\x08\xd2\x36\x89\xf2\x35\xf4\xc4\x4b\x9f\xdf\x92\x2e\xbf\x95\x38\x6c\x8f\xcf\x66\x75\x01\xa9\xb9\xbd\x01\x8c\x3a\x44\x51\x33\x16\x1b\x30\xab\x90\xeb\x48\x42\xb0\xd0\x10\x52\x5b\x61\x8a\xac\x3f\x1e\xcd\x06\xa3\x19\xe2\x4f\x01\xb7\xda\xff\x14\x26\x87\x52\x21\x5a\xc0\xe3\x32\x00\x1e\xf3\x38\xc6\xe0\xf4\x47\xc6\x43\xf4\x46\x97\xfc\xa5\x30\xdf\xc6\x68\x5d\xc8\xb6\xf9\x94\xdc\x6c\x2c\x7b\x01\x4e\xf6\x93\xcf\xcb\xc1\x27\xc5\xdb\xc9\xa0\xd7\xff\xe0\xda\xeb\x3b\x39\x1c\xc9\x29\xa2\xa7\xe5\x8b\x44\x86\xe8\xe8\x8f\xc3\xab\x2b\x9f\x3e\x72\x38\x64\x41\x38\x64\x98\x9a\x4f\x94\x10\x9d\x7d\x18\x8c\x27\x98\x18\xb4\xbf\x64\xfc\xb1\xf4\xf8\xe3\x24\x46\x1f\x27\xf2\xe6\x76\x34\x9c\x0d\x7f\x1c\xd8\x75\x31\xf8\x69\x70\x7d\x73\xd5\x9b\x7c\x3a\x0c\x4a\x8e\xd7\x99\x03\x29\xfb\xf1\x47\x5c\xaf\x18\xbe\xf3\x6d\xfe\xc5\x28\xde\x57\x11\xbd\x31\x9c\xcf\xb3\x3d\x4f\xe7\x91\xa3\x88\x04\xe8\x1d\xa7\x69\xc4\xec\x20\xc0\xda\xb4\x9b\x6d\x5e\x03\x70\x71\xbe\x83\x23\x8b\x8e\xb7\x43\xc6\xb8\x0b\x51\x1b\x17\xa3\xce\x81\x6e\xaf\x4d\x8b\xfa\x2d\xb6\x1b\xda\xa9\x9f\x22\xaa\x54\xe1\xee\x13\x77\x61\xbb\x44\x04\x97\x29\xe5\x21\xad\x9f\xe7\x4d\x75\x80\x64\x2a\x17\x75\x4d\x15\x41\x53\x59\x10\x33\x2f\x11\x60\xe9\xa9\x19\xd9\xa3\xf2\xc4\xf2\xd6\x53\xf4\xa0\xe9\x44\x5e\x24\xe2\x45\x22\x5f\x26\xf2\x15\x86\x0d\xfe\x84\x4d\x63\x22\x71\x76\xad\x03\xe2\xd9\xfd\xdc\x56\x2b\xa0\x8b\x7e\x59\x57\x58\x37\x09\x2f\xaa\x68\x72\x65\x0e\x6c\x4a\x41\x74\x56\x7e\x6b\x74\x36\xbc\x1b\x4f\x20\xa2\x1e\x16\x68\x0a\xd7\xa2\xe8\x36\x87\x98\x51\x4c\xe3\xe5\x0c\x81\x56\x82\xc6\x63\xbd\x9c\x53\x8f\x0b\x09\xfc\x74\xd3\x54\x9b\x98\xa7\xc2\x1b\xe3\x18\x9c\x6f\xf2\xb5\x0e\x8c\x36\x5e\x03\xc2\x91\xec\xc1\xd4\x02\xd6\x0f\x81\xdb\xb4\x32\xa0\x89\x00\x9f\xcd\x9b\x55\x56\x03\x54\x3c\xa4\xcf\x0e\x2f\x31\xdf\x34\xfb\x50\x96\xac\x62\xaa\x90\x90\xca\x76\xae\x93\x2e\x6a\xed\x70\x6b\xf0\x72\x3d\x49\xf6\xaa\xc2\x5b\x15\x9f\xbc\xe0\x88\x52\xaa\xcc\x18\x15\x4f\x58\x73\xbf\x90\x85\x0f\x8b\xc3\x64\x38\xb2\xf3\xeb\xdc\x2c\x74\x51\x60\x01\x3f\x9c\x07\x9e\x30\x35\x0e\x23\x3d\x1e\x21\x8a\x1d\xad\x76\xc0\x3c\x89\xd3\x39\x9c\x89\x6b\xab\xcc\xa9\x30\xd0\x1f\xc4\xdc\x10\xc8\x67\x5d\x9e\xce\x64\x85\x32\x9d\xeb\x1a\x61\xed\x9d\x6c\x2a\x70\xff\xff\xb2\x7e\xee\x7b\x40\xe2\xfb\xfb\x15\xfb\x27\xbf\x46\x07\x17\x28\xe7\x54\xee\x0e\xd7\x45\x63\x92\x0b\x05\xa1\x40\x74\x8b\xb8\xc9\x60\x7b\x77\x29\x44\x25\x32\x6f\xa8\x4c\x1c\x08\xc3\x70\xad\xd9\x96\xc1\x43\x48\x19\xd0\x3d\x05\x2b\x19\xd8\xb6\x85\x23\x12\x99\x33\xda\x88\xed\x76\xe8\x94\xcd\x5d\x26\x60\x20\x9a\x25\x8a\xfe\x32\xb7\x0b\x05\xe9\x84\xa3\xce\xa0\x14\xbc\xef\xaf\xa3\x17\x01\x96\xe2\xb5\xd7\xea\x25\x7f\x8b\xc3\x1d\xce\xa0\x17\x51\xbc\xdd\x3f\x08\xc7\x08\xf6\x97\x1f\xa2\x14\xb2\x18\x23\x24\x96\x20\x9e\xa7\x03\x03\xed\x1a\x92\xd9\x96\x66\x58\x48\xc2\xa4\xdc\x74\x59\x0a\xe0\xb9\xe0\x79\x0d\x65\x47\xb9\xec\x04\xcd\x61\xc0\xc6\xf2\xf3\xf2\x12\x74\x10\xd0\x21\xc8\x24\x2a\xdd\x8a\x60\xa0\x76\x14\x1c\x43\x32\x01\x27\x36\xde\xf5\x54\x4c\x4f\x47\xd6\x40\x98\xcc\x6f\xbc\x42\x97\x27\x2b\x99\xeb\xe6\x41\x3b\x02\x28\x4f\x3e\x2c\x7c\xfa\xd7\xef\x63\x57\x41\x6f\x2f\x9c\x10\x1a\x5c\x56\xb8\xdc\xf8\xce\x30\x01\x1f\x8a\x11\xa1\xf7\xa7\x18\x11\x1c\x65\x98\x03\xd7\xcc\xd5\xf1\xe6\xee\x3d\x6e\x77\x62\xfd\x0f\xa1\x0f\xe6\x00\xa4\x98\xa3\xcb\x14\x2a\x62\xf1\x24\x1a\xcf\x1d\x43\x5e\x38\x45\x04\x22\x2d\x3f\xc1\xe6\x46\x6b\xe4\x38\x10\x3c\x0f\x34\x4a\x79\x59\xc3\x0a\xdc\xc2\x45\xcb\x22\x16\x01\x69\xe0\x32\x3e\x2a\x29\x95\x90\x0a\xb1\x87\x02\x64\xde\xbe\x90\xe0\xb8\xbd\x95\xec\x6a\xb6\x1f\xf3\x75\x00\x0f\x2b\xd5\x98\x0a\x6e\xc0\x03\x15\x4b\x10\x2f\x97\x7b\xaf\x0b\xb1\x1b\x45\xce\xf1\x2b\xb0\xef\x88\x44\x16\xbd\x36\x1c\x25\x2c\xd2\x6a\x56\xda\x3a\x9f\xcc\x19\x91\xa9\xb5\xba\x03\x5a\x26\x6e\x43\xe2\x33\x87\x3c\x3e\x22\x28\x0e\xb3\x5f\x22\x61\xed\x84\x15\x03\xe1\x2b\x10\x6b\x62\x79\x63\xe2\x87\x01\xf6\x4c\x7e\x05\xe5\xe2\x5b\x7d\xe4\x31\x2a\xd8\xf8\x6c\xd3\x49\x60\x7a\xa9\xd6\x77\x15\xfc\xed\xa1\x02\x9a\x40\xd8\x97\xe5\x42\x1b\xc0\x7a\xef\x8d\xcc\x2a\x52\xfb\x60\x66\x3a\x90\xe8\x81\xf8\x34\x1d\xdf\x3e\xc6\xc0\xd6\x74\x22\xdc\x81\x8a\x75\x3d\x3e\xe0\x00\x5c\x9e\x41\xa1\x72\x10\xd6\x48\x85\x18\x20\xfa\x86\xcd\x34\xce\x8f\x05\x68\x99\x40\xa8\x25\x56\x68\x74\x42\x36\x18\x93\x33\xa2\x45\x6c\x01\xb1\xea\xfe\xcd\x55\xe2\xa4\x50\x71\x5e\x61\xfa\x99\x67\xd1\x4b\x50\x1d\xb5\x47\xe3\x48\xd0\x64\xd7\x9a\x80\x22\xee\xb3\x55\x2d\x8b\xea\xae\xb2\xcd\xeb\x58\x5d\x7e\x73\xa0\xf6\x05\xed\x0d\x3e\x17\xbb\xbe\x85\xea\x29\x9e\x0c\x77\xcb\x16\x12\x1e\x8d\x2d\x3b\x7c\x6f\x07\x3d\xb1\x6f\x2b\x4f\x17\x40\xea\xd4\x04\x0d\xdd\x1a\x75\xa7\xe5\xdd\x36\xcf\x74\x91\x97\x80\x78\x73\x09\x60\xcf\x34\x80\x22\xa2\xf2\x41\xcf\x4d\xde\xe8\x88\xb8\x09\x93\x11\x9e\x51\x13\x1c\x23\x0a\x77\x77\x50\x4e\x74\x6c\x6e\x7a\x1b\x55\xa4\xd8\xcb\xa2\x91\xab\xa6\xd9\xbc\x7e\xfa\x74\x41\x9f\x5d\xd0\x20\x54\xf5\xdd\xd3\xdf\xf1\xfc\xff\x1f\xfe\x49\x9f\xf6\xeb\x9d\x69\x54\x31\x6d\xd4\xe2\xb3\xae\x7f\x8d\x22\x80\xc7\xf1\xff\x67\xe7\xaf\x2e\x5e\xb6\xf0\xff\xcf\x5f\xbc\x3a\xff\x1d\xff\xff\x5b\xfc\xd0\xec\x4b\x9a\x7e\xae\x98\xf4\x84\x4e\x01\xa5\xeb\x42\x95\x20\xa9\xcb\x80\x1a\x55\x83\xa1\x63\x3f\x5f\xec\x84\x0b\x67\xa0\x06\x07\xc3\x4d\x20\x07\x4b\x02\x6d\x00\x33\x7e\x62\xbc\x8b\xc2\x40\x51\x28\x8e\xf2\x9e\x76\x55\xa6\xe2\x06\x1d\x76\x43\x25\x82\x47\x7d\x3c\xad\xec\xa5\x73\x6b\x8e\x5c\x35\x96\xe3\xf4\x76\xef\xc0\x4c\x5f\xa9\x75\x16\x94\xdd\x89\xad\x71\x96\x02\xc6\xe9\x53\x21\xc2\x64\xc2\x48\x3f\xc0\x39\xb9\xad\xb5\xbc\xd4\x50\x6a\xe5\xec\x9b\xbb\xad\x02\xaf\x08\xa2\x31\x77\xaa\x76\xb7\x79\x7b\xf0\x1c\x15\x96\xf8\xa8\x0f\xca\x6c\xb0\x15\x01\xcc\xc2\x60\x26\xe6\x4d\x12\x48\xf0\xfa\xb2\x3f\x34\xc2\x80\x3d\x17\xcc\x0b\xe4\x22\x26\xbf\x0b\xa8\x7d\x5c\x62\x13\x43\x4d\x75\xb5\x05\x9c\x27\x5b\x5b\x9e\x56\x93\x86\x51\x7c\xeb\x30\x12\x57\x52\xa8\xb7\x8c\x95\x91\x54\x42\x6f\x4e\x73\x13\xc9\x15\x64\x15\x73\xa7\x05\x16\x18\xfc\xeb\x06\x26\x52\xc4\x6a\x77\x7b\x6b\x04\xea\x90\x09\x86\xde\x82\x9e\x7b\x68\x42\xa9\x1f\x5a\xab\xe4\xd1\x69\x53\xdb\xee\x69\xdb\x9a\x96\x03\x89\xdd\x14\xf3\x2d\x12\xa7\xda\x6b\x9e\x8c\x9b\x95\x2e\x36\xfe\xfd\x8e\x51\x09\x7a\x0d\xb1\xa5\x7a\x0b\xa5\x99\x55\x2a\xe3\x05\xfb\xcd\x23\xdd\x5e\xb0\x50\x70\x69\xa7\x1b\x1c\x29\x6b\x5a\x6c\x8d\x54\x73\x6b\xbf\x00\x4d\xa5\x31\x5b\x6d\x42\xe2\xe1\xb0\x67\x5c\xa5\xf9\xed\xfb\x3f\x7d\x3a\xfc\x97\xf7\xbf\x5a\xe5\x17\xfe\x3c\x7e\xfe\x9f\x9f\x5d\x9c\x3d\x6f\xd7\x7f\x5d\x3c\x7b\xf6\xfb\xf9\xff\x5b\xfc\x0c\x7d\x3d\x86\xfc\x97\x9b\xc1\x7b\xf9\xbe\xae\xb6\x1b\xe7\x6b\x62\xa2\x62\x38\x9d\xde\x0e\xa6\x40\xd9\xbf\x29\x54\x5e\xca\x41\x79\x67\x0d\xd5\xd7\x42\x9c\xa7\xf2\xa3\x96\x59\x55\x3e\x21\x92\x45\x0e\x54\xa2\x62\x19\x1f\x65\x50\xc7\x90\xca\xe3\xb7\x5b\xb7\xe0\x41\xda\x11\x02\xfa\x5b\xeb\x95\xd3\x31\x51\xe8\x46\x6e\x31\xb7\xfa\x3f\x4e\x00\x57\xfd\x89\x6e\x1e\xf4\x0f\xc2\x87\xa2\x50\x34\x09\xe7\x30\x61\x04\x7e\x01\x1b\x84\xa7\x22\xa4\x2f\xc5\x96\x00\xcb\xb1\xe6\xa2\x26\xde\x73\x3a\x92\x1e\xea\xaa\x69\xbd\xc5\x1d\xb1\xf6\xfd\x79\x83\x69\xef\x4d\x40\x39\x89\x60\x0e\xb5\xf0\xe9\x60\x53\xad\x35\xa6\xd5\xdd\xd5\x46\x9b\x9d\x12\xaa\xf4\xba\x27\xf7\xa4\x64\x6e\xcf\x8b\xe1\xbf\xbc\xc7\xba\x66\x18\x66\x70\x71\xb5\xd1\xaf\x09\x2d\x4a\xda\xb8\x10\x40\x0a\x79\x9c\xf6\x02\x18\x8e\x51\x80\xb1\xef\x08\xa5\x2b\x72\x9d\x25\x62\x3f\xb6\x11\x74\x14\x0b\xb5\x41\xa1\xad\xd9\x25\x52\x2d\x16\xdb\x5a\x2d\x76\x89\x5c\xeb\x7a\xb1\x52\x65\x43\x87\x26\xd0\xcf\x2f\xf3\x06\x88\x9c\x91\x1f\x24\x20\xa8\x27\x37\x91\x6c\x87\xf0\x2a\x73\x17\x00\x25\x26\x1d\xcf\x87\xf5\x54\xb1\xdc\x3b\x41\xce\x12\x1d\x06\x84\xea\xdc\x00\xe8\x0b\xe8\xdf\x5c\xfb\x90\x31\x82\x9a\xc8\xec\x07\xe1\xdb\x16\x11\x5b\xc4\xf9\x0f\x3f\x9c\x9f\x9e\xff\xf0\xc3\x9f\x12\x39\x5b\x55\x6b\x65\xe4\xfb\x54\x5e\xa9\x52\xa7\xb2\x57\x14\x84\xd8\x97\x13\x82\x9b\x0a\x2f\xb4\xe9\x03\x3e\x80\xf8\x4e\x85\xb8\xf1\xb5\x04\xb9\x91\x21\x62\x9d\xa2\x6b\x46\x27\xa4\x6b\x80\x64\x12\x5c\x7c\xee\x62\xc0\xd1\xa8\x23\xd0\x06\x25\x72\xc0\x95\xaf\x75\xb5\x3c\x71\xb6\x0a\x0d\x67\xe2\xe3\x96\xda\xde\xe6\x51\x52\xc6\x84\xd4\xbb\xaf\x85\x38\x3e\x3f\x71\xf1\xd9\x40\x4d\x3f\xbc\xcb\x9d\xb4\x40\x38\x64\x01\x63\x04\x72\xe4\xa2\x3a\xd1\x64\xd0\xbb\xbc\x1e\xe0\x05\x0d\x4b\x1d\x1c\x60\xb8\xba\xb3\x24\x90\x03\xf3\x23\x8e\xb1\xc7\x53\x17\x16\x42\x38\x93\xd8\x96\x80\xd8\xd4\xd9\x1b\x47\xd3\xcb\xc1\x31\x93\xc8\x4c\x17\x9a\xfe\x58\xd5\xc4\xb1\x62\xf6\x62\xda\x20\x1b\x2b\xb8\x19\x8b\x42\xab\xba\xd8\x39\xc5\xb7\x8c\x95\x6d\xd7\x1b\x55\x02\x9e\x29\xda\x78\xa9\x10\xc7\x17\x30\x36\x00\xb5\xd5\x5f\xf4\x62\xdb\x50\xc2\x29\xeb\x1e\x02\xcc\x4c\x1d\x7c\x22\xb6\x84\xd9\x56\x54\x23\x8f\xf6\x46\x15\x71\x43\x79\x49\x73\x81\x4f\xe4\x4a\x1c\xfb\xe7\xe0\x04\x16\xfe\x04\x3e\xb2\x8d\x7d\x76\x22\x83\xe5\xb6\x0c\xe1\x96\xad\xb7\x38\x71\x2b\xdb\x31\x52\xdd\xb2\x3b\x8a\xc8\xf4\x8c\x80\x5c\x8e\x33\x45\xd1\xfa\xe1\x45\xb6\x2d\x33\x6d\xf2\x9a\x46\xc2\x31\x22\xb3\xbc\x2d\x9d\x3d\x24\xd3\x37\x1a\x0b\x9f\x40\x0f\xed\x59\x42\x59\x7c\xce\x81\xf6\x65\xd6\x5a\x97\x9e\x3e\x14\xd2\x62\xdc\xf4\x4c\xd7\x10\xae\x86\xb8\x45\x55\xc7\x74\xee\x7c\x24\x26\x10\x58\xfd\xdb\xd6\xb8\x80\x6c\x60\x21\x16\xf9\xbc\x06\x86\x83\xe0\x98\xb6\x47\xae\xd7\x03\xb4\x86\x35\xc2\xbd\xfd\x19\x8d\xd7\x41\xbc\x97\x47\xe3\x99\x1b\x47\x8e\x7e\xd1\x78\xdb\x36\xdb\xd6\xe0\x58\x30\x6b\x0d\x11\xa2\xab\x72\x27\xe0\xef\x76\xf1\x65\xf7\xba\x6e\x72\xd6\x65\x0e\x00\x2b\xba\x08\x22\x66\xe1\xec\x61\x74\x1f\x29\xd6\x69\x38\x30\xf2\x9b\x37\xed\x53\xd4\x15\xd0\x2d\x75\x4d\x39\x3f\x96\x4a\x3a\x6a\x2d\xa5\xe0\x32\x7f\x62\x04\x3f\xc1\xae\xaa\x8f\x2d\x65\x00\xc2\x0e\x61\x06\x62\x51\x6d\x6b\x45\x18\x9c\xce\xb5\x46\xf1\xc6\xb9\x32\x39\x80\x78\x17\xd5\xda\xde\x0f\x39\x86\xb7\xa1\x17\x6d\x65\x6b\x55\x14\x11\x2f\x95\x67\xa2\x22\x19\x28\x7b\x0c\xe2\xc1\xef\x60\xf8\xf4\x2c\x79\xaf\xcb\x0c\xa2\x92\xaa\x34\xf9\xc5\xe7\xb2\x4e\x17\x44\xee\x0b\xe7\x8f\xab\xad\x0a\xbd\x02\x60\x4a\xf6\x33\x5b\x2d\xe5\x55\x2a\x6f\x74\xa3\x6b\x79\xa9\xb7\x8d\x59\xac\x12\x61\xaa\x02\x5e\xb2\xa9\x73\xdd\x20\xf1\x27\x6a\x34\xb4\x85\x5e\x7b\x85\x3d\xa3\xac\xc5\x03\xf4\x64\x39\x15\x81\x5e\xeb\xb2\xa8\xe4\x8d\xaa\x3f\x27\xa2\xdf\x4b\x65\xdc\x3c\xbb\x92\x98\x0f\x97\x3a\x44\xa4\x63\xd1\x19\x19\x26\xcf\xad\xef\x91\x97\xa6\xd1\xca\xe5\x58\xb6\x66\xab\x8a\xb8\x67\x11\x15\xd1\x21\x82\xcf\x37\x72\x53\xe7\xe5\x22\xdf\x80\x5c\xb1\x70\xc6\x4d\x58\x31\x10\x7b\x76\x4b\x52\x7f\x8f\x28\x91\x52\x79\xcc\xfc\x3c\x70\xf6\xfb\x2e\x0a\x64\x30\x2f\x0a\xc9\x6c\x3c\x27\x5e\x5b\xd4\xe4\xe5\x42\xb7\xc6\xc3\x6e\x5f\xeb\xdf\x20\x07\x3f\x5f\x4a\xa0\x2e\x4f\xcc\x31\x18\x88\x6f\xf8\x24\x88\x76\x7f\x0b\xc8\x0d\x01\x69\xe2\x00\x47\x12\x1b\x38\x2d\x84\x0f\xad\x7b\x09\x29\x99\x55\xe4\xc9\xde\x96\xf9\x17\x3b\xe0\xcb\xfc\x8e\x71\x07\x66\x51\xe7\x9b\x06\x14\xc0\xe0\xb7\xfa\x08\x24\x07\xa8\x40\x8a\xf2\x59\xc0\x7c\xb2\x6d\x2a\xfb\xa1\x54\x0c\x9b\xd8\xb6\xf8\x0a\xd5\x2a\xce\xaa\xa1\x08\x89\x9f\x4a\x4c\xf1\xcd\x58\xe8\xd6\xae\x35\x34\xa5\x80\x69\x07\x59\xc4\xa1\x72\x1a\x5a\x68\xe4\x31\x36\x31\xbd\xdb\x6a\x83\xd5\xd5\xf6\x6f\x66\x3b\x4f\x64\xd1\xe0\xdf\x12\x51\x34\x6b\x95\x97\xa9\x59\x9d\xa4\xb2\x57\x22\x5e\x8d\x9e\x45\x0f\x4a\x60\x85\xa9\xa2\x38\x35\xab\x64\xaf\x23\xd7\xe9\x30\x9d\xa5\xb6\xc9\xc2\xfa\xf6\x85\xa9\x0e\xb4\xdb\x8e\x02\x01\x41\x7d\xc4\x5f\xd5\x79\xb3\x5a\xeb\x06\x04\x5d\x50\x60\x61\x13\xa2\x3b\xe0\x38\xb2\xe7\x0e\xbe\x97\xf7\x86\x60\x79\x1d\x54\xbd\x9b\xef\xe4\xf0\xed\x75\x22\x7b\xb3\xff\xdf\x0c\xed\xa6\xeb\xbc\x31\xdb\x79\x6e\x56\x79\x2a\x3f\x00\x0a\x7c\xff\x4d\x44\xe5\x07\x36\x73\xb1\x63\xa6\x59\x67\x32\x55\xf3\x46\xe5\x25\x6a\x59\xf9\xb2\x3b\x0f\x99\x79\xc7\xc6\x10\x06\x86\x12\x1e\x35\x58\xe6\xfb\x6f\x63\x04\x06\x81\xd7\x83\x15\x0b\x54\x63\xd8\x51\xe7\x3c\x1c\x4f\xed\x7e\x10\xfb\x8f\x71\xa4\x4b\x78\x82\xcb\xb5\xaa\xd1\xc4\xb9\xb3\x0e\x96\x1d\x20\xba\xe9\x70\x84\x74\x26\x3f\x6c\x97\xcb\xb5\x2a\xc5\x1a\x36\x05\x32\x69\x6f\xcb\x22\xff\x8c\x0c\x50\xc8\x7b\xbb\x03\x32\x24\x8f\x36\x56\x01\xcf\x11\xaf\x86\xbc\x49\x4f\xe4\xb4\x92\x4b\x55\x0b\x65\xe4\x03\xc6\xaa\x14\x3a\x01\x4d\x98\x3a\x25\xa9\x8a\x2e\x95\x4d\x4c\xba\x23\x05\x62\xc6\xdc\xda\x76\xcf\x46\x07\x16\xe4\xc6\xd1\x44\xa3\x13\x1b\x4e\x1c\x40\xe4\x28\xcc\x52\x3f\xd4\x79\xa3\xe5\xfb\xe1\x3b\x34\xee\x52\x39\xab\x84\xba\xaf\x72\x7b\x1d\x35\xaa\xbc\x2b\xbc\xba\x0c\x57\x36\x99\x9d\x91\x57\xff\xf6\x91\x9a\x97\xc0\x97\x41\xdb\xcb\xee\x19\xea\x24\x4f\x93\xe0\x69\x52\x45\x53\xdd\x41\xf5\x9c\xd3\x2f\x83\x2f\xc2\xfb\x6b\x3f\xad\x06\xdc\x25\xb0\x2d\x50\xf1\x18\xca\x25\x8f\xb6\xa5\xbd\xeb\xad\x4b\xa5\x33\xf1\x7e\xf8\xce\x1c\xd1\xed\x8c\x55\x72\xff\xbe\xd5\xfe\x88\xe2\x54\x96\x6d\xa3\x2a\xee\x2a\x98\xfc\x37\x34\x6c\x4c\xc0\xee\x7a\x2c\xec\x60\x17\xaa\xbe\x63\x2d\x66\x38\xf8\xf1\x4a\xb0\xff\x64\x7b\x06\xb6\xd9\x1c\x65\x70\x1d\x4f\xbf\x7d\x42\xa6\xed\x80\xd6\x06\x2f\x76\xfc\xb8\x47\x04\x79\xcb\x54\x88\x23\x3b\x41\xef\xed\xb1\x98\x2f\x0c\xd2\x6d\x12\x93\xe1\x3b\xa8\xd3\x3b\x5e\x9c\x30\x97\xbb\xa7\xda\xb3\x57\xa4\xae\x31\x52\xd6\xaf\xd6\x9b\xed\xd4\x7a\x48\x62\x18\x54\xe0\xa4\xb6\x1d\xc7\x66\x7d\x82\xf4\x5f\xf6\x03\xf9\x42\xcb\x6b\x55\x7f\x3e\xf0\x75\x19\x7d\xfd\xe8\xf7\xf4\xd2\x7f\xe1\x4f\xfa\xb4\x3f\xe8\x0f\xaf\xae\x4e\xfb\xbf\x5e\x10\xf0\xf1\xf8\xdf\x8b\x8b\xe7\xe7\xfb\xfc\x4f\xcf\x5f\xfd\x1e\xff\xfb\x2d\x7e\xfa\x1a\x67\x5f\xbe\x9b\x0c\x06\x72\x3a\x7e\x37\xfb\xd8\x9b\x0c\x1c\x6a\x18\x00\xe9\xd7\x83\xd1\x4c\x8e\xd0\x89\xc7\x48\x8b\xab\xd6\xc3\x3d\x1f\xdb\x3f\x0c\x25\xf3\x50\x1e\xd6\xe4\xf0\x07\xa0\xac\x96\x22\xcb\xcd\x62\x8b\x7c\xea\x0e\xec\x63\x0d\x20\x76\x38\x43\x15\x7e\x5d\x02\x63\xe1\x3e\xfa\x55\xcb\xe6\xa1\x12\x00\x91\x25\xab\xb7\xd0\x06\xd2\xeb\xac\x49\x9b\xd5\x6a\x69\x0f\xdc\xd7\x42\xfc\x11\xf9\x12\x8a\x5d\xd2\xf9\xa4\xf0\x01\x20\x46\xc1\x61\xf5\xe8\x4a\xab\x96\x31\x9d\xe7\x6b\xe9\xc5\x58\x02\xab\x3a\x91\xf3\xba\x52\x59\x1b\xed\x8c\x11\xa2\xda\x24\xb6\x35\x46\x5b\x17\xc0\x36\x07\x02\x5e\x85\x4f\x11\xa8\xa0\x05\x80\x8e\xa3\x0a\x26\xf8\x73\x5b\x4f\x43\x58\x13\xd0\x9e\xe1\xf6\x2e\x04\xf5\x1f\xc5\x29\x0f\xc3\x35\x21\x60\x87\x81\x38\x0d\xd6\xee\x34\x1a\x40\x94\x5b\xf4\xdb\xf0\x90\xb6\x0f\x17\x7c\x35\x6e\xea\xaa\x61\x64\x0b\xf1\x44\x7a\x08\x22\xbe\x84\x03\x03\x40\x1e\x68\xdd\x25\xe7\x9a\xd8\x7e\x55\xeb\x7c\xc1\x05\x2b\x60\xce\xf8\xec\x58\x14\xd3\x64\xb5\x71\x58\x88\xff\xcf\xff\xed\x97\x4f\xad\x5f\x03\x92\x54\x88\x7e\xb5\xb6\xde\x9c\xaa\x73\xd5\xc8\xff\xfd\xbf\x64\xf1\x64\x50\xea\xfa\x2e\xd7\xb2\xd7\x54\x6b\xb8\x7b\x4f\x65\x7f\xd0\x4b\x9c\x1c\xa8\x34\x8b\x1c\xa1\x32\x8b\xc4\xd7\xb1\x03\xcb\x4e\x5e\x66\x5b\x3b\x9d\x0a\xe2\x21\x1a\xb4\xc4\xb4\xb1\xb6\x6d\x6e\x56\x24\x1e\x8b\x75\x30\x76\xf5\x38\x57\x4a\x6e\x0a\x85\x8a\x04\xac\x62\x27\x54\x23\x2f\x5e\xc8\x7a\xab\xe5\x95\x9e\x17\xaa\x5c\x24\x32\x5f\xaf\x35\xe4\xe0\xae\xb4\xbc\xa9\x40\x1c\xf6\x32\x91\xaf\x5e\x9c\x9d\xbf\xb0\xde\x62\x6e\xec\x4c\xda\x55\x97\x72\xd7\x74\xd9\xd4\x5a\x8e\x14\x61\xc4\x32\x3b\x5b\x72\xa2\x17\x2b\x7b\x3d\x6b\x39\xe5\x7e\x50\x27\x47\x93\x69\x67\x2f\xa1\x6b\x71\xe9\xee\x2f\xea\x94\x54\x8d\x7c\x66\xfb\x24\xae\xf3\xc5\x4a\x17\xa7\x3d\x50\x18\x7d\xf5\xe2\xd5\x0f\xcf\xb1\x07\x72\xa1\x33\xfd\x45\x9e\xbf\x6c\x77\x65\x48\x80\xbe\xa8\x33\xbe\x27\xba\x94\x43\xe6\x9e\xb4\x9d\xd1\x8d\xfd\x55\x8f\x40\xfe\xd8\xbd\xe1\x68\x32\xec\x25\xe2\x40\xff\xe4\x77\xf7\x4f\x74\xf6\xef\xb2\xb2\xe7\x85\xb6\xcd\xfb\xb1\x2a\xb6\x0b\xad\xb6\x89\x9c\x54\x0b\x08\x7b\x55\xdb\xba\x49\xe4\xdb\x1b\x79\x7e\xf6\x22\x91\xaf\xfe\x74\xfe\xe2\x99\x9d\xcc\xfe\x4a\x9b\x52\xed\x04\x74\x3e\xe8\xf9\x4d\xad\xd5\xda\x4e\xf8\xac\x83\x51\xe8\x6b\xe7\x22\x32\x51\x63\x99\x17\x9c\x0a\x22\x02\xad\x07\x02\xcb\xb5\x3e\x65\xa3\xd2\x85\x62\x42\xc1\x9c\x08\x79\x86\xfb\x2b\x60\xe2\xe1\xf6\x10\xa6\x3e\x10\x98\x54\x85\xe7\xa1\x8a\x4b\xbe\x20\xd5\x10\x89\xd9\x61\x5d\x16\x00\x14\x1b\xf4\x7b\x23\xd6\x08\xc4\x25\x31\x5d\x75\x10\x5e\x70\xf1\x67\x8a\x78\x83\xce\x1b\xe7\xe6\x39\x26\x8e\xd1\x7d\x7d\x4f\xcc\xac\x98\x05\x61\x1a\x27\x57\x27\x10\xcb\x5e\x85\x2f\x69\x15\x97\x38\x6d\x61\x1c\x43\x81\x63\x18\xc4\x37\x02\xe6\x89\x00\xfe\x9c\x10\xeb\xac\x1d\x5e\x17\xc4\x42\xa9\x35\xe4\x3d\x23\x34\x9c\x88\x18\xe7\xc3\xde\x3d\xe1\xfb\x0b\xcf\x74\x12\xf7\x68\x1d\x8b\x5c\xbe\x86\x9b\x76\x05\x98\x60\x50\x24\xbe\xe7\x96\xc0\xc1\x68\xdf\x0b\x29\x2c\xc6\xe0\x15\xa1\x24\x43\xc9\x4e\x2b\xa4\x73\x12\xea\xbd\xf9\x6c\xa4\x32\xa6\x5a\xe4\x10\x4d\x81\x66\x17\x95\xca\x42\x35\x7f\x1c\x13\x02\xf6\x3e\xad\x6a\x41\x3c\xec\x14\xb4\x64\x8e\x18\x9f\x54\xa6\x05\xe7\xe2\x52\x1a\x59\x3a\xe6\xb5\x0b\xad\xf2\xef\x9f\xd8\x53\xd1\x3a\x65\x90\x8a\x42\x66\x7d\x3b\xb1\xf1\x4e\xb0\x6e\xc9\xd6\x24\x74\x87\xad\xd5\xce\xb1\xb1\xe3\xb5\x8c\xb1\xfc\xa6\x12\x5b\x4e\x7d\x84\xa6\x03\x5d\x47\x28\xf4\x8b\x23\x00\x69\x1b\x8c\x46\x63\x57\x34\xdd\x4b\xfa\xcb\x46\xd7\xb9\x2e\x17\x3a\x13\x9b\xba\x5a\x6a\xb0\x37\x54\x61\xdc\x71\x51\x9e\x66\x7a\x03\x52\x9b\x44\x9c\xec\x62\xc4\xa9\xbc\x75\x8b\x01\xbc\xe2\x65\x55\x6b\x1f\x23\xcd\xec\x9e\xb0\x43\x4b\x47\x13\x51\xa6\x9b\x6d\xde\xec\xc1\x0b\x7c\xf0\x34\xb8\x96\xf3\x3a\xe2\x0d\x26\x38\xa9\x53\x2b\x2a\xed\xe1\xc6\x53\xa0\x17\xdb\xda\x3f\x31\xaf\xa5\xd9\x99\x46\x23\x9a\xff\x29\x04\xe1\x1b\x45\x70\x6c\x34\x95\x32\xbb\xe4\x13\x0c\x75\x10\xca\xb5\x40\x1a\xe1\x2d\x95\x62\xd9\x41\x52\x0d\xe7\x34\xb9\x48\xa0\x45\xd4\xc4\x2f\x4e\xdb\x76\x1f\x85\xa2\x29\x42\xe4\x68\x85\x70\x30\x1c\x8e\x31\x08\x05\x63\xbc\xa2\xac\x1a\x41\x59\x20\xf6\xc2\x51\x91\x2e\xc0\x46\xdb\x91\xa2\x24\xa6\xca\x60\x03\xd6\x2e\xd6\x02\xd3\x50\x83\x20\x66\x47\x83\xa2\x1c\x43\x85\x1a\x7f\xad\x6c\x31\x13\xd2\x45\x1b\x53\xb4\x36\x26\xc9\x1e\xa1\x49\xb7\x9d\x73\x69\x2d\x9d\xc0\xb5\x06\x5b\x8a\x6e\x1a\x6e\x36\xde\x82\xbd\xba\xc9\x17\x85\x96\xe7\xf2\x14\x59\x3b\x59\x20\xe1\xdd\x01\xd2\xb9\x9e\xaf\x30\x78\xe0\x7c\x93\xe7\xa0\xa1\x24\x2e\x0c\x0b\x44\xda\xcb\x85\x66\x0a\xc6\x85\xda\x00\xe7\x50\x01\xd4\xd5\x24\xcf\x19\x00\x7e\xe3\x27\xad\xb5\x2a\xd1\x08\x46\x66\x28\x21\xdc\x9b\x5f\x3b\xc2\xb8\x80\xa4\x2c\xa8\x7c\x00\x83\xd1\xf6\x95\x04\x17\xec\x90\x10\x2a\xda\x29\x28\x09\xcc\xe8\x95\xfa\x8b\x36\xa9\x7f\x87\xb7\x91\x3d\x27\x9d\x4f\x5b\xe1\xd1\x30\xc6\x5c\x66\x9f\x4e\x71\xbb\x9a\x49\x0e\xb0\x4f\xa9\xca\xb5\xfd\x7d\x22\xa8\x52\xdd\x95\x8d\x60\xc2\x3a\xca\xc7\x25\xf2\x48\x19\x99\x9b\x23\x3f\x98\x84\x64\xd0\x9c\x09\x83\xf9\xf6\x6c\x23\xbe\xad\xc3\x32\x07\x94\x77\x57\x9b\xa7\xad\x36\x87\x0d\x84\x05\x8f\x43\xb3\x0b\x3a\x24\xe2\xd6\xcb\xef\x6f\x3d\xee\x18\xf0\x58\x44\xc8\xe6\xdf\x2e\xed\xea\xa2\x57\x0b\x09\x55\x7c\x17\xaf\x39\x69\xf6\x68\x1f\x5d\x6a\x6d\xbe\xf3\x85\xfd\x55\xa9\x21\x66\x74\x07\x41\x1b\xd1\x0f\xf8\x3e\xa3\xf9\x76\xe3\xc2\x8f\xb6\xeb\x31\x7c\xfc\x13\x03\x51\xe8\x7a\x4b\xe1\x44\x18\x3e\xca\x02\x00\x20\x1a\x55\x25\xf2\xc5\x8a\x45\x2e\xc3\x2a\x37\x67\x3b\x04\xfa\x9f\x53\xef\x57\x70\x3b\x82\x35\x15\x76\x71\x9e\x97\xaa\xde\x61\xd4\x8d\x73\xca\x4d\x20\xbe\xaa\x43\x81\x63\x3e\x1b\x82\x3e\x05\x6f\xf8\x00\xe7\x47\xf8\x70\x3c\x51\x8e\xcd\xc9\x81\xdb\xde\xc7\x74\xdb\x2b\x2d\x78\x2c\xfe\x9f\xd7\x6c\xe7\xf4\xd8\x6b\xd6\xbe\x85\x8b\xf5\x61\x59\x13\x69\x62\xd7\xa4\xbb\xa9\xaa\x5c\x73\x95\xdf\x15\xf4\x14\xc4\x94\x77\x4f\xb6\x3c\x30\xd9\x5c\x33\x10\xb6\xf2\x03\xa5\xcd\xa2\x2a\xfc\x98\x28\x92\x24\x76\x80\x2e\x32\x01\xce\x46\xbf\xb8\xd1\x00\xf6\x5d\x75\x2b\xbd\x7b\xc3\x76\xb6\xd0\x75\xd2\xdf\x01\x91\x9d\x6a\x7d\xff\xba\xa6\x32\xd9\x24\xe4\x04\x31\x89\x00\x0e\x52\xe5\x56\x26\x6b\x3f\x2e\xb7\x25\x2d\xd7\xdc\xbf\x94\xd4\xac\x75\x74\x1a\x50\xd5\x4f\x55\x0b\xfb\xe2\x60\xec\xc3\x63\x71\x42\xe5\x0b\xd7\x55\xb6\x2d\xfc\x4e\x91\x46\x37\xa8\xa8\x6a\x9f\x67\x68\x9d\xfa\x22\x16\xbc\xf9\x63\x00\x02\x92\x54\x70\xaa\x23\xec\xa8\xdc\x6f\x5d\x82\x56\x85\xc6\x24\x13\x25\x08\xec\x86\xe0\xee\x89\xaa\x86\xda\x54\x60\x9f\x81\x74\x36\x9e\x2a\xf8\x2c\xbc\xb7\x96\x61\x5a\xb3\x63\x09\x07\x25\x8c\xed\x63\x86\x4a\x9c\xe6\x51\xc5\xb1\xff\x58\xe2\x8f\x1e\x3b\xee\x55\x83\xd1\x08\x08\x87\xc4\x43\xb6\xb7\x63\x6e\xb0\x40\x0c\x5f\xc4\x0a\xc8\xe1\xe1\x4f\x66\x7a\x50\xe7\x22\x25\x09\x15\x85\x97\x2c\x99\x35\x88\xcc\xb5\x4f\xc9\x4b\xd0\x56\x05\x6c\x13\x1c\x55\xc5\xb6\x26\xe0\x72\x7c\xe3\x5f\xc8\x53\x16\x36\x41\xff\x2b\xba\xe9\x75\x1c\x32\x6b\x56\xe4\x81\xf0\x38\x86\x6c\xa4\x61\xc3\x41\x0f\xb1\x4d\x75\x89\xc4\xb9\x9a\xb8\x54\xca\xcc\x73\x64\xba\xeb\x9b\xf1\x0b\x53\x6f\x7a\x0a\xbb\xba\x96\x55\x8d\x9d\xe2\x66\xbf\x00\x93\x2a\x2f\x91\xc2\x84\xbf\x06\x24\xcb\x54\x7c\xb8\x6c\x87\x83\xc8\x75\xe2\x34\x75\x14\xe2\x51\x79\xd6\x5a\x13\xfc\xa2\x67\xf2\x34\xe0\xc3\x16\xe2\x59\x7a\x0e\x3e\xb3\x9b\xa2\x76\x21\xa3\x32\x9d\x47\x5c\xd7\x9d\x27\xf6\xac\xa9\xc0\xab\x5d\x60\x0d\xce\xc2\xcd\x04\x72\xa6\xf2\x5f\xbc\xad\x75\x6f\xad\xf0\xd7\x42\x1c\xe7\x27\xec\x32\xc5\x63\xe8\xf6\x36\x91\x33\x2a\x7b\x7e\x94\x55\xa3\xe6\xd6\xb4\x9e\xef\x64\x56\x3d\x94\xfc\x4d\x60\x13\x53\x24\xd1\x42\xea\xcb\x70\x2e\xce\x77\x32\xfc\x8c\x54\x72\xb3\xda\x19\x22\x5b\xcb\xf2\xed\xfa\x8d\x6d\x42\x7e\x12\xb4\x15\x0b\x7a\xc2\xc1\x62\x7a\x17\x3a\xe6\xbe\xc2\x60\x67\x47\xfb\x42\x8e\x4b\x1d\x29\xe3\x04\xa6\x27\xa9\xf8\xc3\x60\x33\xa5\x57\x8c\x58\xc1\x32\x4f\xb5\x68\x74\x9d\x9b\x26\x5f\x18\xb1\xb7\x79\xe9\x73\xec\xac\xb2\x8b\x9c\x84\x14\x77\x4b\xb5\xd8\x73\xe0\x04\xa7\x17\x31\x3c\x1a\xb8\x6c\xe4\x8d\xbb\xd4\x9c\xc7\x95\xc4\xbb\x84\xaa\xba\x9a\x0a\x90\x84\x81\x7e\x28\x10\xee\x74\xac\x7a\xbb\xf8\x68\xdd\x23\x7d\x40\x7c\x3e\x68\x66\xa0\x14\x01\x64\xc8\xb8\x38\x28\x72\x0c\x93\xe3\x47\xd5\xa5\x55\x65\x8d\xe4\x78\xc9\x3f\x97\xa7\x72\xf0\x8e\xc4\x1a\xe5\x25\xca\x18\x5c\x02\x05\x3c\x9f\x5b\xcf\xd3\xf3\xd6\x47\xf0\xf0\xf0\x0b\x99\xb7\xc5\xa2\x5a\x6b\xaf\xf1\xc5\x59\xd8\xcc\x7a\x70\x81\xb5\xe8\xb6\x0a\x6e\x4e\xe1\x0f\xc0\xc3\x23\x91\xfa\xc6\x5c\x50\xe3\xba\x9a\x10\x10\x51\x54\x2c\xd6\x1d\xe0\x34\xa9\x28\x93\x8e\x0c\x7f\x5c\x88\xaf\x59\x43\xdd\xc7\xc5\x0b\x79\x2a\xa7\xfd\xf1\x0d\xb0\x95\x10\xe7\x3f\x90\xf1\x0f\x2e\xb1\x79\x51\xc5\xa3\x27\x0d\x6e\xad\x0c\x34\x30\xc8\xf4\x4f\x5a\x3b\x1e\x5b\x22\xf6\x5a\xe2\x80\x71\x95\x93\x89\x4f\x98\xd0\xd4\x9d\x41\x1d\xbb\xa8\x42\xaa\x60\xc0\x46\xc5\xc4\x24\x2d\x13\xdd\xcf\x44\x70\xf8\xa6\x42\xbc\xd5\xc6\xba\x9d\x09\x23\xf8\x7c\xf1\xff\x43\x49\x32\xce\x6b\x34\x90\xab\x87\x32\x42\x33\x30\x8c\x82\xc7\xbd\xbc\x03\xfb\xa3\xaa\x23\x08\xa8\x37\x63\x5a\x9b\x57\x86\x10\xa8\xf5\xa6\x2a\xed\xc3\x62\x62\x05\x01\x0b\xbd\xa1\xe2\x8a\x06\x93\x32\xb8\x12\x3a\xce\x1e\x5c\x7e\xc6\x37\x4c\xdd\x29\x6b\xf6\x07\x91\x2e\xb7\x36\x0d\xc7\xa5\xf4\x97\x4d\x51\x61\xc5\xb9\x93\x62\x6b\x1f\xc2\xac\xb1\x1c\x3e\xba\xd6\x82\xaf\xc4\x9a\x80\x9b\x7e\xe8\x82\x66\x37\x95\xf7\x8c\xf9\x0b\x1a\x8c\xa1\xb9\x59\xd4\xf9\x5c\x33\xa3\x78\x58\x1c\x1b\xed\x1a\xd4\x07\x0b\x24\xe3\x71\xe3\xbc\x48\xcf\x71\x8d\xda\xc5\x7a\xcb\x06\x80\xdb\x7b\xb9\xf1\x7a\xc5\x9c\x01\x6a\x9d\x9d\x6c\xc0\x41\x79\x73\x50\xa3\x6c\x04\x05\x1a\x96\xb9\x2e\x32\x04\x59\x86\xda\x5a\x5c\x73\x33\xd7\x00\x4d\x09\xae\x72\x8f\x5c\x76\x70\x7c\x01\x08\x06\x7b\x6b\x20\x70\xdf\x09\x2a\x03\xdf\x89\x5e\x6f\xaa\xda\x5a\x83\x21\xe5\x3f\x0b\x52\xb6\x16\x52\xeb\x4a\x14\xe1\x95\x28\x99\x1c\xce\x6f\x20\xb2\x96\x2e\x52\x1f\x8a\x24\xd2\x45\xf8\x73\xbd\x2d\x4b\xf8\x83\xb5\x3e\x9b\xaa\xde\xbb\x78\xab\x32\xbe\x78\xed\x2d\x89\x68\x7e\x70\x23\x08\x21\x62\xb7\xc5\x1c\x2e\xda\x44\x9a\x66\x9b\xed\xb0\x5b\x06\xef\x1a\x0c\x77\x01\xee\x8b\x7d\xc8\x4c\x23\x89\x89\x86\x49\xcf\x33\xad\xd8\x1d\x75\x79\xc0\xb9\x5e\x71\x99\x02\xbd\x9d\x79\x0b\xec\x1b\x35\xbe\x19\x23\x65\xb1\xe9\x83\xc0\x4d\x38\x38\x31\x2a\xb5\x1f\x90\x58\xa8\xba\x06\x5e\x6a\x9a\x77\x7a\x41\xd7\x10\x09\x37\x44\x11\xb7\x34\x8d\x97\xba\xd3\x41\xf7\x5a\xb9\xbf\xe0\x7e\xc6\xeb\x4b\xe4\x86\x87\x0d\x2b\xe4\x54\x5d\xef\xa0\x11\xa1\xc1\xc0\x0b\xfb\xc2\x2f\x6c\x14\xe3\xed\x03\xed\x17\xae\x70\x47\xaf\x16\xf9\x1d\x04\xf5\x69\x31\xf0\xb0\x9f\x65\x8f\x52\xeb\x64\x25\xac\x5a\x01\x0c\xb5\x98\x6d\x38\xe0\xb1\x79\x4f\x86\xbb\x12\x45\xfb\x23\xae\x74\x11\x83\x6c\x82\x2a\x0e\x87\x7d\x34\x09\xc3\xb1\xb1\x66\x21\x89\x1f\xc5\x84\xa7\x5d\x8e\x4c\xfa\xb5\x9d\xfd\x58\x3f\xda\xdd\x68\x95\xc4\xe5\xbe\x81\x52\x95\x70\x18\xe6\x8b\x9c\xc9\x40\xfd\x67\x70\x5c\x59\x49\x1c\x17\x9e\x88\xde\x43\x3a\x2b\x10\x46\x37\xde\x4c\x60\xce\x7f\x28\xf1\x46\xfb\xa1\xd6\xd5\x32\x98\xec\x67\x7e\xb2\x43\x89\x26\x2c\xfc\xe9\x1c\xaf\x6a\x19\x27\xc7\xbb\xe7\x9e\xe2\xc1\x6e\xf5\x36\x24\xcd\xcf\x64\x17\xf1\x69\xc8\xe3\x44\x61\x6b\xce\x05\x76\x1d\x02\x98\x41\xe9\xb4\xcb\xf7\x96\xc8\x5a\xd5\x9f\x75\xe3\xea\x63\xf2\xae\xf4\x92\x80\xf2\x8a\xaa\x46\x28\x5f\xb5\x24\x6e\x93\x24\xba\x6b\x99\x4e\xbe\xf3\x28\xc4\xd7\x77\xac\x13\x47\x38\x13\xad\x97\x0e\x96\xfa\x65\x90\x5a\x03\x4f\x58\x04\x68\xf7\x78\x8c\x98\x75\x10\x8a\x71\x5b\x62\xc5\xdd\x8e\xd2\x21\xcb\x43\xf2\xcf\x8b\xd4\x5a\x84\x7b\x0a\x5d\x0e\x18\xc2\x0c\x80\xfb\x87\xc1\xe1\x4d\x11\xd6\xbe\xd4\xdb\x83\x03\x98\x97\x14\xab\xc0\xd0\x69\x55\x47\xa1\x61\x24\xe4\x8d\xb7\x0c\x9c\xb9\xd1\xfa\xc3\xfc\x11\x31\xc5\xd8\xe5\x20\xc8\x79\xe5\xe4\xc2\x9e\x37\x0e\x9b\xc5\x04\xa2\xc8\xd6\x78\x79\x1d\x8c\x08\x4a\x33\xa9\x03\xae\x13\xdc\x6a\x07\x7d\xa6\x58\x8b\xba\x15\x96\x80\x42\x82\x30\x91\x18\x08\x3e\x1f\x30\xd7\x8d\xfc\x13\x34\xf8\x87\x44\x08\xce\x9e\x24\x9c\xbe\x01\x07\x96\xe4\x68\xca\x02\x9d\xf3\x70\x04\xf7\xc6\xdb\x44\x29\xd1\x2c\x11\x71\xc8\xc4\x9a\xc9\x26\x70\x39\xe2\xe4\x2b\xe0\xbf\xc3\xc8\x57\xeb\xf1\x22\x64\x9f\x95\xd9\xd6\xdd\xea\xe4\x2f\xa0\x62\x15\x5b\x9d\x6d\x84\x4d\x74\xdc\x0b\x67\xe0\x04\xce\x96\x47\x1e\x7b\x82\x9d\x45\x85\x8e\xbd\x5a\xfc\xfb\x36\x0f\xcc\x08\xd7\x48\xe1\x19\xa6\xf4\x97\x85\xa6\x90\x02\x7f\xcd\x19\x91\x0e\xf7\xa3\x1a\xd5\xde\x1c\x17\xfb\x9b\x83\x54\xea\x2f\xdd\x2e\x11\xe2\xe3\xde\x6d\x8f\x65\xc9\xaa\x3c\x14\x58\xdd\xbf\xe4\xdc\x26\x16\x2d\xf7\xc1\x31\xe8\x75\x0c\x9a\xbf\xfa\xf6\x82\xfd\xe4\x44\x46\x02\x08\x14\x9c\x6f\x6f\x90\x30\x94\xf2\xd5\x3b\x2f\x2a\x6d\xd3\xfb\xef\x85\x05\x4a\x25\xd6\x0b\xda\xd9\x15\x36\x61\xf1\xfb\xce\xfe\xa5\x3b\x3b\x1c\x41\x6a\xfb\xde\xc8\x8b\xbd\x2d\x2e\xbf\x7b\x8b\x47\x13\x77\xe0\x3d\xf2\x7b\xf6\xba\xe8\x5a\xb6\x5d\x8b\xe6\xdb\x36\xbd\xe8\xde\xf4\x21\x36\xe4\x9b\x37\xbd\x38\xb4\xe9\x9f\xed\x6f\xfa\xcb\xc1\x64\xf8\x23\x4a\x2c\x3e\xb6\xed\xd1\x9a\x34\xb2\xc3\x98\xa4\xc2\x96\x8e\x7f\x91\x6b\xb5\x13\x73\x2d\xf7\xb3\x7e\xaa\x03\x45\x44\xd4\xc4\x58\x07\x13\xa7\x94\x69\xab\x0b\x80\xc3\xec\x03\x1e\x03\xf8\x01\xe9\x15\x41\x6d\x90\x5b\xf4\x8b\xaa\x5c\x04\x30\xc8\x83\xf1\x92\x40\x38\x2f\x08\x2d\xbd\x4c\x9f\xa7\x72\x18\xaf\xe0\xc0\xfc\x24\xae\xbe\xae\xee\xbb\x74\x5f\x64\xd6\xba\x6b\x21\xc8\x67\x44\xb1\xf2\xd0\xd5\x5f\xa9\x06\x9d\xdc\xaf\x1d\x8a\xcc\xe9\xb4\x87\xa6\x6a\x9d\x04\xcd\xea\x60\x4e\xcc\x51\x78\x7f\xc3\x7b\x84\xab\x59\xf5\x54\x5e\x50\x1f\x4c\x59\x1d\x7b\x0d\x5b\xc7\x36\x5a\x44\xc8\xd7\x0e\x6a\xcc\x87\xf6\x6a\x07\xe0\x8a\xdb\x20\x02\xbf\xe9\x5b\xf7\x69\xd7\x1e\xf5\x33\x15\x3c\x11\xf8\xfe\xf0\xc8\xde\xd3\x11\x72\x44\x53\xe0\xe8\x66\x18\xf2\x83\xfa\x79\x8f\x20\x10\xac\x7c\xdf\xba\xf4\xdf\x7c\xeb\xfe\x77\x1b\x79\xb3\xad\x17\x2b\x65\x78\x1b\x3f\x32\x20\x01\x10\xe9\x3f\x7d\x32\x3c\x4f\x65\x7f\x7c\x7d\xd3\x9b\x31\x35\xb2\x35\x90\x91\xfa\x1a\x00\xad\x4e\xd0\x16\xcf\x06\xd5\xd1\x08\x0a\xbe\x3f\x6a\x1c\xc4\x15\xdf\x82\x9e\xdd\x01\xd6\x00\x90\x0b\xbc\xa8\x6b\x63\xf9\x57\x71\x42\x4d\x60\x42\xad\x2d\x6e\x72\xf8\x05\xad\x5b\x37\xbc\xcb\x90\x7b\x13\xbc\x92\xbc\xd1\x10\x21\x0d\xce\x02\xc0\xf5\x60\x51\x98\x2a\xe2\x60\xef\x4b\x80\x7e\xce\x06\x57\x57\x83\xfe\xec\xb6\x77\x25\x6f\x26\xe3\x9b\xc1\x64\xf6\x89\x07\xfb\x65\x7a\x2e\xc7\x3f\x92\xd0\x2d\x80\x6a\x7a\x57\xc1\xb1\x3b\x73\x99\x67\x8c\x94\x3e\x1a\x6f\xde\xcb\xbe\x03\xd1\x1b\x3a\x8f\x22\xd0\x95\x68\x7f\xce\xda\x12\xc1\x28\x75\x42\xd1\xbb\x5c\x2e\xe2\xb6\x76\xc8\x23\x6a\x28\x10\xfb\x15\x9a\xb3\x1e\x51\xe9\xa5\x21\x5d\x78\xe4\xf0\xb4\xbe\x27\xf2\x4b\xce\x75\x14\xb9\x09\x30\x10\x9d\x61\xe6\x43\x76\x22\x44\x0c\x3a\x40\x08\xc1\x30\xb6\x8e\xd2\xee\x01\x81\x63\x89\xd2\x02\xf5\xb6\x40\x22\x39\x40\x10\x88\xfd\x43\x54\xee\xf1\x3e\x77\xe6\x23\x9e\xa7\x17\xa9\x9f\xf5\x8b\x70\xd6\x67\x83\xf7\x13\xa0\xd0\xef\x8f\x47\xee\x2a\x9e\xb6\xac\x53\xc0\x13\x20\x06\xf0\xd1\x0d\x45\x61\x14\x94\x3d\xa4\x19\x0f\x51\xf1\xc2\xa1\xe2\xe3\xf5\x93\x9b\xf8\x39\xa1\x66\xec\x4e\xc6\x12\x89\x41\x47\x9e\xf9\x8e\x80\x6c\xf5\xe0\xd2\x7a\x0d\xb7\x57\x83\xc7\xdb\xdf\x4a\x7b\xff\x67\x5a\xdd\x7a\xd2\x63\xed\x46\x98\x3c\x96\xad\xc2\x52\x5f\x55\x15\x93\x33\xee\x36\x58\x10\x1f\xd7\x76\xe0\x39\x8a\x57\xe8\x9e\x3f\x27\x3c\x8c\x23\x58\x9c\x1d\x06\x03\x5a\x5a\x7e\xd0\x9e\xcb\xd1\x78\x36\xec\x07\x29\x20\xfe\xb7\x59\x9c\x0b\x65\x7a\x4c\xbf\x6a\xf1\xee\xa7\x3c\x05\x82\x07\x13\x9f\x54\x48\x38\x3e\x8d\xf2\x25\xc9\xde\x38\xfa\x9a\x08\x92\xe2\x11\xaa\x69\xd4\x62\xe5\x53\x8f\xee\x9e\x42\xe3\x20\x54\x6b\x04\xdf\x85\xbe\x47\x6f\xa2\xdb\x1e\x72\xbc\xf4\x4a\x56\x74\x09\x63\x21\x62\x1f\x83\x85\x40\x88\x37\x68\x13\xb8\x3a\x18\x18\xf4\xe0\xac\x9a\x46\x1c\x2e\x8f\xf6\xc4\x61\x8e\xc3\x54\x2c\x50\x48\x44\x06\x50\x0b\xb0\x10\x33\x6c\xc8\x46\x7f\xc1\xef\x42\x30\x59\x99\xbc\xd8\x91\x3d\x92\x03\xb4\x2d\x22\x18\x70\xe0\x2a\xdb\xae\x7a\x49\x80\xfc\x96\x60\xd2\xa1\x08\xeb\x7e\xd6\x29\xcb\x6b\xbd\x68\x0a\x38\xb2\x6d\xb3\xe8\x6f\x91\x7c\xc8\xe3\x7b\x62\x19\x9e\xc3\x84\xf2\x09\x91\x3a\x9c\x5c\xf5\xf6\x2d\x25\xb0\xd5\x67\xdd\x05\x43\xbc\xcf\xcd\xe9\xff\xfe\x5f\xa7\xf7\x76\x9c\x1a\xe0\x42\x5f\x2e\x13\xe4\x37\x29\x33\x8e\x49\xa2\x8a\x5a\x58\x9c\x89\x73\xe9\xe8\x8c\x39\x87\xd0\x3d\x7b\xdf\xda\xf6\xf8\x62\x7d\x25\x4f\xdd\x79\xc3\xf2\xfb\x42\xbc\x4a\xcf\xe5\x2d\xec\xc9\xb2\x92\x8b\xbc\x5e\x6c\xd7\x06\xf2\xe5\x9c\xb1\x88\xa7\x1f\xb2\x61\x3a\xce\xaa\x35\x15\x3b\xec\x22\xa8\xae\x31\x26\xc7\x07\xc1\x56\x53\xa0\x72\x0b\x7f\x75\x98\xa2\x36\x2e\x25\x15\xe2\x83\x17\x3a\x0a\x5e\xd0\x4a\x52\xa0\x2c\x20\x1c\x64\x7c\x04\xf1\x33\x51\x4b\xa6\x33\x50\x62\x3f\x05\xf6\x69\x47\x13\x13\x1e\x3d\xb4\x5b\x7d\x63\x13\x7f\xd9\x46\x37\x94\xf2\x42\xe6\x08\x60\x44\xb5\xba\x31\x3b\xe4\x31\x53\x3b\x24\x1f\xec\x74\x06\x4f\x16\xf4\xc6\xce\x11\x73\x43\x84\x53\x90\x97\x8b\x6d\x48\x95\xc1\x00\xf4\xd4\x4e\xdf\x85\x9c\xe6\xeb\xbc\xb0\x7e\x44\x12\xcb\xc7\x75\x0f\x1b\xa6\x10\x0b\xce\xb7\x26\xe4\x4c\x5a\x67\x1c\x88\x30\x62\x5e\x98\x44\xaa\x00\xbc\x11\x9c\xef\x10\x7b\x98\x03\x8c\x12\x02\xcd\x80\xb1\x41\x1e\x62\xb8\xde\x29\xf7\xf2\x58\x2c\x8f\x07\xfd\x80\xcf\x4f\x37\x45\xd7\x5c\x06\x27\x15\xdf\x4b\x88\xd2\x4e\xe5\xd4\x8e\x73\x0b\x6e\x02\xd8\x19\x3b\xea\xb9\x2a\xba\x89\xef\x29\xf2\x18\xa5\x53\x1d\x06\x89\x0d\x3d\x80\x5f\x75\xcc\xbb\x40\xf2\x20\xe0\x85\xf2\x34\xe5\x11\xb3\x76\xe8\xc1\xc5\xbb\xf2\x4f\xf2\xd4\x8b\xd0\x08\xf1\xa7\xf4\xbc\x2d\xb3\x11\x87\xb5\xdc\xf7\xd2\x8b\x56\x00\xc7\xb5\x97\x27\x1d\x3c\xfd\x42\xe5\x6b\xb0\x4f\x59\x9e\xdd\x93\x64\xc3\x69\x29\x8b\xca\xd8\xa3\x0a\xfc\x33\xc8\x88\x9b\x2d\xc1\xfa\xdc\x59\xed\xc3\xb8\xd6\x0c\x71\x45\x9b\x52\xc9\xa5\x82\x3f\x7a\x62\x76\x1f\x7a\x2c\xf4\xbd\x2a\x1b\x37\x0c\x11\x51\x15\x1e\x17\xd6\x95\xd2\xf6\xd8\x28\x17\x3a\x48\x40\xfd\x29\xbd\x90\xb3\x38\x7c\xe6\x97\x3e\xa0\xd2\x11\x53\x14\x54\x21\xe5\x0d\xa6\x5e\x01\xb9\x1a\xe8\xb1\xc4\xf1\x3f\xef\xe0\x21\x6b\xd5\x16\x78\x73\x5a\x7d\x8a\xb2\x81\xaf\x25\xe2\xbf\x8c\x11\xd9\x36\x46\x5d\x3d\xb1\xde\x36\x31\x83\xc3\x17\x54\x21\x97\x2a\x2f\xb6\x98\x8f\x59\x6e\x8b\xa5\xb5\x88\x21\xdb\xec\x11\x04\x89\x3c\xce\xf3\x13\x41\x43\xbf\x47\x2a\x0e\x73\xc1\x05\xb2\x6e\x1e\x22\x58\xa0\xb6\x46\xb3\x0e\xca\x6c\x40\xd3\x13\x35\x23\x54\x00\x6c\x8b\xf3\xa3\xc7\x79\x9e\x9f\xec\x15\x80\x20\x04\x33\x68\x80\xb0\x0d\x80\x38\x4d\xc0\xe2\x66\x9f\x46\x90\xca\xc0\xbc\x02\xa3\x4f\x3a\x6d\x13\xca\xb7\x6d\xf4\x62\x5b\xe6\xaa\x06\x14\x80\x2b\xb3\x83\x6e\x1d\xe7\xa9\x4e\xf1\x8f\xd5\x12\xdc\xe7\xc4\xfd\x6d\x53\x57\xcb\xbc\x31\x09\x67\xae\xcb\x3b\xf8\x27\xfc\x00\x30\x0b\x6d\x4d\x53\xad\xa1\xa8\xb4\xc6\x42\x60\xf8\xf0\xa6\xaa\x1b\xac\x40\xb3\x7e\x7a\x42\xcb\xda\x34\xdb\x7a\xae\x48\x24\xd2\xd7\xfa\x2d\x9a\xfc\x1e\x64\x74\x4e\x44\x0c\xe9\x41\xb4\xd2\xa6\xae\xac\xd7\x9f\x97\x77\x08\x4a\x07\x39\x82\xcc\x61\x55\xa2\x19\xb0\x56\x32\x3a\xb7\x02\x48\xcb\xf9\xb0\x08\x64\xc4\x3a\x26\x36\x5e\x83\x74\x65\x86\xa8\x05\x11\x57\xab\xc4\xbb\xb6\xad\x55\x1f\x1f\x23\x3f\xc8\x53\x47\x04\x28\xc4\x0f\x6d\x3c\xe5\x3e\x74\x0d\xc2\x22\x1d\x15\x95\x70\x15\x01\x55\xc4\x69\xb5\x3c\x6d\x56\xfa\x54\xd5\x8d\x70\x80\x05\xef\xef\xa9\x88\x21\x4d\x66\x68\xe7\x12\xa8\x18\x17\x03\xd7\x88\x6c\x0d\x02\x6e\xe6\x1a\x20\x18\x58\x8f\x24\xef\x75\x0d\x47\x7e\x22\xcb\xca\xa3\x4d\x91\xbf\x10\xd7\xb1\x7b\x40\xa6\x97\x7a\xd1\xf0\x33\x32\xdd\x80\xab\x6c\x17\xaa\xd8\xaf\x7b\x0b\x76\xa8\x2b\x3f\xf3\xb0\xc1\xac\x56\x0f\x2e\xbf\xd2\x2e\x91\x13\xdf\x54\x22\x27\x83\x12\xb9\x50\x47\xbd\x0d\x55\x11\xe8\xe7\x63\x10\x33\x28\x4b\xdb\x03\x35\xb6\xed\xdc\x40\x4f\x24\xa6\x0b\x86\x21\x43\x9c\x4c\x67\x9e\xdb\xba\x0d\x1d\x35\x67\x4c\xa0\xc5\xac\x42\x61\xa5\x19\x7a\x09\x77\x55\x05\xc8\xe1\xcf\x88\xb7\xca\x88\x17\x05\x58\x6f\xc0\x34\xc5\xbe\xe1\xad\xeb\xd7\x30\x92\x10\x23\xe9\x1b\x58\xb1\x44\xe4\xaf\x6b\x53\x21\x48\x8d\x6c\xd6\x1c\x2a\x81\x7e\x68\x9d\xec\x5e\xda\x9b\x45\x17\xc1\x15\x82\xc6\x2c\x55\xde\xac\x92\xf0\xa6\x0f\x6c\x19\x81\x78\x69\x36\x4f\x0f\xa1\x08\xe5\xb1\xc7\xcb\xe7\x7b\x67\x1a\x45\xb0\xbb\x91\xd0\x27\xd0\xdc\x67\xdf\xb2\x8b\xe2\x98\x10\xea\x99\xba\xe2\x9d\x08\x7a\x59\xd5\x11\xb6\xab\x6a\x73\x73\x36\x6a\x91\x37\x81\xf1\x12\x05\xf3\x95\x3b\x32\x70\x5a\x82\xd6\xda\x71\x85\xba\xa2\x16\x94\x25\x7c\x99\xcf\x40\x39\xfa\x4c\x4f\xd7\x26\xee\x55\xb1\x25\x87\x91\x44\x29\x13\x69\xd4\x12\xd2\x75\x65\x45\x6e\x19\x94\xde\xd1\xb5\x5e\x02\xcd\x72\x2a\xc4\x34\xf0\xee\x5a\x66\xbb\xa3\xc0\xa1\x77\x77\x0f\x19\x18\x70\x08\x90\x2e\x77\x52\xd7\x75\x55\xfb\x69\x87\xa8\x12\x17\x27\x72\x77\xc0\x75\xac\xb7\x1b\x34\xd3\xa2\x8f\xce\xb1\x6a\x47\x35\x76\xcb\x08\x17\x8b\x0b\x8e\x84\xea\xa1\x94\x76\xf9\x6f\xbc\x59\x10\x04\x44\x3d\x23\x18\x9e\x4a\x0c\x93\x82\x87\xaf\xb5\x6e\xda\x8f\x0b\xb7\x12\x2c\x99\xe7\xf1\x0a\x77\x63\x10\x33\xb1\xa2\xc7\x0a\xf3\x5d\xec\x0e\x8f\x8f\xd8\x17\xc4\x6c\x8b\x57\x3e\xe2\x21\x86\x79\x4a\xa1\x1c\x41\x52\x48\x36\x18\x48\x72\x46\x5f\x25\xd5\x9c\x65\x55\xeb\xf6\xa4\x12\x4f\xba\x11\xa1\x4f\x1b\xf8\x26\xd5\x83\x83\x9b\xf9\x8d\x53\x53\xed\xf9\xd6\x09\x70\xb2\xc1\xe0\x6f\x5d\x5a\xd5\xd8\x4f\x1f\x4e\x62\xc9\x5c\x7f\x25\xe7\xa5\x0c\xfc\x64\x32\x83\x92\x28\xdd\xd0\xae\xf1\xee\xf0\x3e\x52\x39\xb2\xae\x66\xb3\xd2\x05\x10\xa9\x99\x55\xb5\x2d\x32\xa7\xc8\xe4\x5a\x15\xbf\xbb\xcb\x1c\x68\x8d\x10\x1e\x8f\x7c\xbd\xe7\xcc\x56\xc5\x97\x2b\x34\x0d\x4d\x8e\xc0\xe3\xe3\xa3\xd9\xde\x74\x20\x18\x33\x6d\xf9\xaa\x1d\x5f\x12\x41\x95\xc4\x82\xaa\xd3\xa1\x16\xd4\xe8\xd3\xf9\xee\x14\xf4\x81\x11\x7f\x1c\xfa\x25\x7b\x96\xb9\x0b\x02\x79\x04\xfd\xb6\x36\x5b\x85\x79\x40\x25\xd7\x7a\x5d\xd5\xaa\xcc\xb6\x10\xc4\x8f\x04\x94\xd2\xd6\x62\xff\xca\xda\x68\xa1\x11\x83\x6d\x14\x84\xaf\x90\x4d\xb3\x35\x57\x62\x14\x28\x0b\xe5\x86\x8a\xc9\x5b\xcf\xd3\x5f\x40\x5e\x9e\x6c\x07\xa8\x02\x68\xdf\x0c\x20\x67\xdd\x81\x77\x7e\xec\x49\xca\x0b\xb6\xb4\xea\x7a\xcf\xe4\x29\x60\xe4\x87\x23\x82\x3e\x9d\x9f\xa5\xe7\x71\x96\x13\xbe\xef\x55\x2a\xa3\x61\x26\xa7\x33\x04\x18\x07\x8a\x3d\xd1\x9a\x82\x82\xe6\x50\x02\x33\x90\xc6\x6c\x15\xbb\xd8\xc3\xa1\xd9\xc9\xe3\x67\x67\x27\x32\x53\x3b\x83\x82\xc4\x82\xb2\xb8\x9e\xd9\x8c\xf2\xbc\x4d\xbb\x32\x0a\x0b\x1a\x80\x14\xc3\x6e\x35\x97\x63\x4c\xa1\x7b\x17\xb2\x17\xc5\xa7\x4d\xbb\x98\xc9\x4b\x5a\xb2\x99\x20\x8b\xaa\xbc\xd3\xb5\x5d\xa7\x1e\x2b\x22\x98\x1d\x99\xf2\x16\x55\xdd\x86\x8e\xf8\x7d\xea\x82\x42\x08\x88\x66\xf1\x4c\x3a\xf7\xd7\x6a\x27\xc0\x6f\x65\xb8\x39\xd7\x7f\xec\xeb\x59\x1e\xac\x63\x40\xdd\xb5\x20\x41\x8e\xd5\x75\x54\x72\x04\xe3\xc5\x4f\xdf\x97\xfb\x39\x9c\x73\x09\x31\x95\x6e\xd1\x9c\xcb\x53\x79\x3d\x9c\xf6\x07\x57\x57\xbd\xd1\x60\x7c\xeb\xe2\xd8\xe7\xe7\xe9\xb9\x1c\xfc\xd4\xbf\x9d\x82\x84\x2d\x48\xc8\x4e\x85\x18\xd1\xcd\x71\x03\xc7\xbd\xdb\xf2\xa4\x8c\xd5\xaa\x4e\xc8\x34\x88\xd7\x5b\x7b\xda\xfb\xa2\xe4\x1d\x8a\x26\xae\x50\x08\x4f\x57\xd5\x78\x52\x47\xac\x99\xf7\xeb\x17\x71\xfd\x6b\xf5\x37\xbd\x45\x77\xd2\xba\x52\x76\x13\xbd\xaf\x32\xbc\x43\xec\xb9\x6e\xec\x61\x07\xf6\x20\xe5\x81\x31\xa9\x40\xf9\x69\x2e\x36\x20\x38\x7f\x78\x83\xbb\xe2\x21\x48\x80\xd5\xc8\x90\x0b\x81\xb1\x42\x47\x12\x68\x46\x96\xba\x79\x40\xdd\x7c\xfa\x13\xc0\xef\x8b\x9d\x3d\xe2\x5c\x25\x87\x50\xf2\x3e\xaf\xb7\x60\xfc\xab\xc5\xe7\x04\x5f\x76\x4f\x7e\xc0\x7c\x47\xb1\x6d\xbc\xfe\x71\x3d\xa2\x88\x35\x98\x34\x48\xb2\xaa\x4c\x03\xb4\x4c\x0f\xaa\xd1\x4c\x6a\x9c\x48\xad\xea\x66\xf5\xef\x5b\xf5\xd9\x7e\x7a\x99\xdb\xc1\x80\x2a\x05\x83\x9e\xbd\x5d\xbd\x9f\x49\x9a\xbc\x50\x73\x28\x37\xa8\xb5\x75\x4b\x1f\x54\x9d\x08\xdd\x2c\xec\x16\x3a\xb7\x5b\xa8\xdc\xb9\xf9\x99\xef\x64\x38\xc1\x09\xa8\xca\x07\x00\xd3\x6a\xb1\x50\xf4\x02\x40\x65\xdc\x57\x9f\xb5\xfd\x80\x70\x1f\x58\xb6\xa3\x44\xb8\xec\xd8\x27\xdd\x76\x07\x77\xe7\x14\x82\x07\xda\x7b\x90\xed\xc4\x04\xbb\x62\xc1\x3e\x3a\xad\xe0\x43\xe0\xb4\xd1\x0a\xa4\x53\xcb\x41\x69\xa9\x49\x10\xdf\x74\x8d\x38\x36\x27\xc2\xe7\xf5\x8b\x1d\xf6\x1c\xcd\x69\xbf\x07\x17\xb6\x29\x85\x61\x27\xaa\x50\x0b\x6d\x62\xe3\x40\xdf\x83\xc2\xb6\x57\xe9\x83\xda\x79\x50\x42\x65\x49\x3b\x08\x08\x00\x45\x62\x70\xc9\x71\xbc\x02\x0f\xb4\x7b\x07\x04\xb2\x77\x8b\xa3\x51\xa7\xdd\xca\xca\x83\xc2\x83\x1f\xbc\xeb\xb4\x2f\x41\x08\x1d\xe5\xe7\x07\xa0\x18\x1c\x00\x62\xbc\xb7\xf7\x95\x2f\xab\x75\xc9\xa6\x16\xf8\xfb\x91\x43\xc3\x6d\x74\x11\x80\x3c\x4c\x67\x1f\x49\xc2\x11\x9d\x24\x88\x80\x75\xaa\x35\xca\xf9\x4e\x50\xd1\xf0\xb6\xd8\x85\xb0\xbd\x50\x34\xe0\x1e\x1c\xb5\xf3\xf3\xf4\x79\x1b\xad\xa3\x9a\x78\x5d\x1e\x58\x76\xf2\x41\xe3\xa9\x63\xad\xe9\x22\x5f\x34\x8e\xa2\x82\xd4\xcf\x80\x2e\x18\x34\x5a\x82\x44\xa3\xc2\x68\x58\xa1\xef\x72\xa8\xbf\x06\x5d\xe1\x2f\xd6\x58\xb5\xa3\xba\xff\xaf\x02\x92\x4e\x6c\x69\xe9\x7b\x95\x17\x3e\xd6\xcb\x03\x83\xff\x0c\x28\x7c\xb8\xfb\x9d\x9c\xbe\x5a\xeb\x32\xc3\x88\xa1\xa9\x04\xf3\x0f\xad\x37\x4c\xed\x73\xe0\xa5\xd0\x24\x14\x09\x70\x36\xb3\x83\x3e\x40\x9a\x80\xae\x13\x7f\x67\x86\xb1\x79\x92\x40\x25\xbf\x5c\xb5\x65\x3c\x75\x2b\x3f\x2e\xbc\x3c\x51\xa4\x63\xd8\xf6\xbe\xe3\x6b\x0d\xa2\x99\x54\xb1\x5b\xe1\x26\x87\xb7\xa6\xc1\x2d\xf3\x42\x5e\xf5\x46\xef\x6f\x7b\xef\xf7\xea\x0b\x73\x62\xc8\xc3\x7b\x0e\x80\x8c\xc4\x35\x67\xc7\x96\x84\x3e\xe0\xcf\xf0\x6f\x4c\xf8\x01\x55\x57\x5c\xa9\xbb\x6d\x56\x90\xde\x6c\x5d\x7b\x17\xf2\x54\x8e\x06\x1f\xe5\x8f\x83\xc9\x74\x38\x1e\x4d\x59\x49\xdc\x91\x0a\x0a\x71\x7e\x91\x9e\xb3\xd0\x9e\xc1\xb4\x7c\x0b\x5c\xba\x25\x3e\xa0\xb6\x8a\x42\x98\x38\x6d\xc1\x55\xcf\x2f\xd2\x0b\x39\xe5\x2a\x1f\x47\x1d\x68\x17\x2b\xe4\x77\x1a\x64\xe0\xcf\x42\x6a\xac\x68\x40\xa8\x8a\x8e\x82\x56\xf6\xbe\xe4\xd4\x47\xc8\x8d\xd1\xec\x93\xd8\x39\x7d\xcc\x87\x55\xc5\x01\x20\x1f\x78\x10\x78\x31\xe7\x55\xc6\xd4\xeb\x58\x17\x21\xb7\x9b\x0c\x40\x82\xc4\x36\xe0\xc6\x78\x7f\x91\x80\x51\x09\xaa\x40\x41\x5a\xa2\xdc\xae\xe7\xba\x4e\xa9\x9c\xbd\x83\x9d\x05\x6d\xc9\x2c\x83\xa0\x83\x7d\x03\xa9\x08\x01\x97\x11\x1c\xf6\x50\x44\x11\x91\x34\xe1\x38\x3e\x83\xc9\x71\x66\x73\x17\x20\x11\xed\xf2\x16\x8c\x2b\xe6\xe5\xb1\xa3\x27\xe6\x61\xd3\x42\x56\xe9\x88\xd2\x04\x8e\xeb\x83\x0f\x03\xb5\x91\x7d\xf0\x58\x6b\xdd\x3d\x93\xa7\xf2\xfd\xf8\xc7\xc1\x64\x34\x1c\xbd\x97\x57\xbd\x8f\x50\x76\xfb\x2f\xb7\x93\xe1\xf4\x72\xd8\x27\xb3\x9d\xeb\xcf\xa3\x89\x0f\x73\xe0\x9e\x71\x11\x5d\x1e\x77\xbf\xdc\x51\xfa\x49\x97\x99\x56\xf7\x55\x6d\xa7\xd5\x68\xfd\x19\xcc\xa4\x35\x9d\x6e\x86\x88\xcc\x98\x8d\xc8\x5a\x18\xee\x46\x23\xd3\x77\x43\xe2\xb7\x2c\x05\x5b\xe7\x46\x8b\x00\x95\xd7\x11\xe2\x8f\x96\xf9\xb3\xf4\x42\xbe\x53\x79\x81\x87\x7e\xc7\xbb\xed\x42\xc9\x4b\x27\x35\xba\xae\xca\x66\x05\x8a\xcf\x1c\x59\xce\xeb\xa0\x3e\x1e\xd9\x16\xe8\x6a\xd1\x6b\x5d\xdf\xe9\x72\xb1\x8b\x82\xe4\x40\x0b\xcd\x67\x6a\xc2\xe0\xa2\xee\x8e\x89\x50\x22\xd9\xe9\x15\xd0\x61\x0d\x30\x9a\x6d\xdd\xb8\x1a\xff\xbf\x6d\xeb\xdc\x64\xc8\x31\x9d\xf0\xee\x82\x5b\x27\xcb\x8b\xfc\xce\x4e\x36\xd8\x22\xa9\x10\x3f\xd2\xea\x38\x4f\xcf\xa0\xb0\x29\x93\x17\x67\x67\x2f\x4f\xcf\x7e\x38\x3d\x7b\x91\xca\x73\xc6\xae\x81\xc3\x8a\x19\xe7\xbe\x3e\x56\x27\xb2\x7f\x5c\xd6\xe6\x44\x0e\x8f\xcb\x3a\x57\x27\xf2\xea\xb8\xba\xcb\x17\xb9\x2e\x4e\xc4\xd5\x71\x3e\xaf\xf5\xc9\x3f\x22\x11\x71\xfa\x34\xbb\xcf\x37\xd9\x72\xfd\x2b\x6a\x80\x7d\x45\xff\xf1\xec\xd9\xc5\x45\x8b\xff\xf7\xd9\xc5\x8b\xdf\xf5\xbf\x7e\x93\x9f\x9e\xbf\xd2\xa2\x53\x97\x25\xf9\xc8\x59\x8c\x6a\x08\x40\xd5\xa0\xe1\xe8\x59\xfc\xaf\x6c\xfa\xfd\x31\xcb\x21\x95\x59\x36\x7f\x84\x08\x4c\x2a\xfb\x40\x36\x9e\x11\xab\x0d\x4b\xf8\x84\xb7\xc0\x1f\x99\xa0\x9d\x6f\x38\x30\xd0\x34\xdd\xfd\xdb\x12\xe9\xca\xb3\x3f\x76\xa1\x93\x8d\x26\xfa\xf8\x7f\xc4\x4d\xfc\x9f\xf8\x49\x9f\x5e\x6f\x37\xff\xa5\xfa\x7f\x67\x17\x2f\x5f\x3e\x6b\xf3\x7f\x3f\x7b\xf5\xe2\xf7\xfd\xff\x5b\xfc\x78\xaa\xff\xe3\x05\xe8\xa4\xbd\x38\xbd\x38\x3b\xbf\xb0\x37\x70\xaf\xfe\xfc\xb9\x56\xa1\xf2\x0d\x3a\x42\x14\x60\xe5\xfc\x66\x2a\xc4\x24\x8e\xba\xc3\x6e\x35\xda\x97\x7d\xa1\xfb\x40\xe4\x6b\x55\xbd\x36\x44\x5c\x10\x24\xc7\x42\x5f\x39\x01\x45\x04\x2f\xbd\x1d\x97\x86\x35\x11\x87\x47\xa8\x30\x55\x6b\xb9\xd6\x54\xf6\x11\x37\xc9\x78\x5a\x2d\xac\x08\x80\xe3\xa7\xd6\x8d\x22\x18\x66\x5b\x9e\x07\x43\xa7\x89\x20\x4e\x44\x2c\x08\x08\xdf\xc5\x18\x23\xd7\x90\xcb\xe1\xb4\x7f\xd5\x1b\x5e\x0f\x26\xc8\x74\xd0\x6e\x80\x75\xae\xfc\x08\x70\x03\x18\x33\xfa\xf7\x6e\x03\xc3\x4b\x63\xb2\x30\xca\x65\xa3\x27\xbb\x56\x8d\xae\x73\x55\x04\xca\x7c\x2e\xb4\x19\x8b\xac\x8a\x67\x88\x91\xff\x65\x6a\x6d\xb2\xa5\xd6\x26\xbe\x55\xad\x2d\x66\x3e\x23\xbf\xd8\x43\x08\xe9\xa5\x9e\xb1\xdc\x5e\x33\xe4\x33\x55\x06\x91\xd4\x48\x49\xdc\x66\x2a\x4e\x85\xf0\x23\x25\xc4\xec\xc3\x70\xea\x0b\x9c\x87\x53\x79\x33\x19\xff\x38\xbc\x1c\x5c\xb2\x52\x21\xb8\x0f\xbd\xd1\x27\x39\xf8\xe9\x66\x32\x98\x4e\xe5\x78\x22\x87\xd7\x37\x57\xc3\xc1\x25\x03\x30\x86\x83\x69\x22\x87\xa3\xfe\xd5\xed\xe5\x70\xf4\x3e\x11\x6f\x6f\x67\xa0\x02\x75\x35\xbc\x1e\xce\x06\x97\x72\x36\x4e\x10\xc5\xbe\xf7\x35\x28\x20\x1d\x4c\xfa\x1f\x7a\xa3\x19\xcb\xaa\xd9\xf7\xbd\x1b\xce\x46\x83\xe9\x54\xbc\x1b\x4f\x64\x4f\xde\xf4\x26\xb3\x61\xff\xf6\xaa\x37\x61\x92\x31\x69\x1b\xeb\xba\x71\x99\xca\xe1\x48\x8e\xc6\x18\x42\x96\xd3\x0f\xbd\xab\x2b\xf4\xb5\x6f\x67\x1f\xc6\x93\xa9\x7c\x3b\x00\xd9\xb6\xab\x81\x84\x07\x8e\x3e\xc9\xcb\xe1\x64\xd0\x9f\xd9\x56\xfb\x3f\xf5\x87\x97\x83\xd1\xac\x77\x95\xc8\xe9\xcd\xa0\x3f\xb4\x7f\x18\xfc\x34\xb8\xbe\xb9\xea\x4d\x3e\x25\xb6\xdb\xfd\xf1\x68\x3a\xf8\xd7\xdb\xc1\x68\x36\xec\x5d\x89\xcb\xde\x75\xef\xfd\x60\x2a\x8f\x7d\xcf\xe5\x7e\xcf\xed\x78\xf6\x6f\x27\x28\x23\x30\x7e\x27\xa7\xb7\x6f\xa7\xb3\xe1\xec\x76\x36\x90\xef\xc7\xe3\x4b\x3b\x9c\x82\xc1\xa9\x6f\xe4\xd5\x78\x3a\x25\x1a\x95\x44\x5e\xf6\x66\x3d\x78\xef\xcd\x64\xfc\x6e\x38\x9b\xbe\xb1\x7f\x7e\x7b\x3b\x1d\xda\xa1\x81\x92\x80\xc9\xe4\xf6\xc6\x7a\x74\x27\xf2\xc3\xf8\xe3\xe0\xc7\xc1\x44\xf4\x7b\xb7\xd3\xc1\x25\x8c\xe1\x78\x04\x3d\x9d\x7d\x18\x8c\x27\x9f\xec\x43\x1d\xea\x2e\x91\x1f\x3f\x0c\x66\x1f\x06\x13\x3b\x6c\x50\x4f\xd0\xb3\x23\x30\x9d\x4d\x86\xfd\x59\xf0\x31\x31\x9e\xc8\xd9\x78\x32\x0b\xba\x28\x47\x83\xf7\x57\xc3\xf7\x83\x51\x7f\x60\x5b\x33\xb6\x4f\xf9\x38\x9c\x0e\x4e\x64\x6f\x32\x9c\xda\x0f\x0c\xf1\xb5\x1f\x7b\x9f\xe4\xf8\x76\x46\x51\x0f\x71\x3b\x1d\xe0\x1f\x83\xd5\x96\xc0\x7c\xc9\xe1\x3b\xd9\xbb\xfc\x71\x68\x9b\x4d\x21\x92\x9b\xf1\x74\xca\x15\x45\x30\x64\xfd\x0f\x12\x47\xfb\xef\x6c\xe0\xa4\x4f\xa7\xbd\x9f\x4e\x6f\x2e\x7f\x4d\x13\xe0\x2b\xf7\xff\xf3\x0e\xfd\x8f\x17\x2f\x7f\xbf\xff\x7f\x93\x1f\x7f\xff\x4f\x81\x94\x5b\x88\x69\xef\x27\xc6\x68\xfc\x0f\x60\xfe\x58\xaa\x45\x93\xa0\x70\x3b\x80\xd8\x18\xa1\x45\x34\x54\xbe\x24\xb5\xa9\xe4\xb4\xf7\x13\x4b\xc0\xc1\x17\x90\xb6\xad\x50\x0b\x9d\x09\xba\x92\x88\xce\x23\x03\x12\xfe\x54\x88\x51\x25\x3f\x52\x9a\x57\x88\xb7\x1a\x23\x9c\xd4\x88\x5a\x83\x2a\xb0\x8b\x1c\x44\xdf\x65\xad\x2a\xa0\x95\xf6\xa9\x62\xba\x1f\x44\x86\x72\xe0\x01\xce\xcc\x33\x0f\x47\xea\x58\x8e\xb9\x4e\x7f\x01\xb5\x2b\x6f\x78\x44\x95\x31\x02\x22\x41\x03\x94\x86\x05\x70\x1c\xdc\xa3\x0f\xb9\x41\x42\x73\xbc\xcf\x38\x08\x4f\xb5\x1d\x91\x9a\x20\x53\x8a\x0a\x0a\x25\x53\x40\x89\x61\x03\xb6\xcf\x8e\x00\x98\xcc\x22\xaf\x9b\xe8\xd5\x35\xdb\x12\xbf\x3a\x13\x81\xc8\xaf\xbf\x35\xd1\x51\x73\x92\x79\x30\x8a\x54\xea\x82\x9f\xe5\xa7\x53\x1c\xb5\xa5\xf3\x0b\xf7\xea\xb7\xe8\xfc\x76\x49\xf5\xda\xb7\x04\x52\xbd\xa2\x15\xca\xa2\xe9\x05\x7b\x63\x57\x6d\x53\x39\x45\x5f\xd2\xfe\xde\x0e\x87\xf6\x79\x44\xd4\xf0\xf4\xba\xc0\xbe\xde\xbb\x28\x82\xf8\x3e\xc2\xe7\x91\x4e\x4a\x6f\x54\x5e\x23\xd2\x96\x89\x5e\x91\x30\xbf\xac\x28\xb5\x41\x41\x2e\x57\x8d\xb1\x5f\x02\x65\xfb\x7b\x57\x93\x26\x7b\x30\xaf\x0f\x79\x51\x08\x04\xd1\xb6\xa5\x22\x63\x6c\x0d\x24\xce\xd0\x06\xd9\x05\x4a\x0e\x4f\x01\x51\xe5\xbd\x5e\x01\x3b\xc6\x27\x77\x9b\x0a\xc5\xb1\xbd\xb0\x6a\x30\xa3\xf0\x7c\x02\xf3\x52\x91\x8d\xfd\x43\x5e\x2e\xa0\xbe\x48\x15\x62\x0f\x5e\xcc\xea\xac\x2d\x38\x4e\xc3\xfa\x9e\xb5\xcc\x4b\x8f\xe3\x91\xbc\xf7\x3c\x8a\x4e\xec\x2f\xa2\x08\xd1\x2b\x99\x7d\x1e\x73\x89\xb5\x2e\x33\x40\x30\xe7\x25\xca\x33\x37\xf0\x12\xfb\x0d\x6d\x84\xb1\xa7\x2d\x17\x9d\x81\x36\x6b\xdd\xa2\xb1\x81\x75\xc6\x89\x52\x46\x6d\xf4\x7e\x82\xc3\x26\xc0\x84\x89\x08\xc5\x74\x57\xab\xb5\x39\x49\x60\x72\x65\x4e\x45\x1f\xcc\xf0\x5e\x47\x33\xe2\xc0\x10\x2a\xbb\xcf\x41\x6b\x16\xcb\xd0\xf1\x54\x73\x10\x4a\x78\x02\x8d\x5d\x2a\x84\x3f\x25\x2f\x09\xef\xa2\x6b\x43\x14\xf4\x1b\x75\xa7\x3d\xef\x11\x9c\x04\x18\x0b\x85\x6d\xa0\x1a\x4a\x0d\xd9\x1e\x5f\xaa\xfb\x3c\x93\xd7\xfa\xee\x2e\x2f\x41\x69\xd0\xae\x8f\x07\xbb\xf2\x11\xce\x80\x0d\xa3\x65\xc0\x30\x7e\x7e\x33\x9f\x62\xce\xba\x7e\xa8\x00\x9d\x62\x47\xe7\x3c\x3d\x8b\xe3\xa2\x3c\x72\x70\xd2\xc9\xde\xcd\x10\xbe\xfe\xd3\xf5\x95\x3c\x9e\xf6\x7e\x3a\x49\x88\x97\x20\x93\x8b\x0a\x90\x64\xf9\xbd\x2e\x76\x2e\xec\xaa\xd7\x73\x5d\x9b\x55\xbe\xe1\x3c\xfd\x4f\xd7\x57\xa7\x97\x83\x1f\xe5\x9a\xa2\xcd\xd6\x1b\x49\x02\xfd\x6b\x77\x4e\x3b\x4e\xe4\x8e\x53\x1e\x52\x89\x0f\xa5\xb1\xf3\xf9\x1a\x05\x3c\xd5\x8e\x65\xd5\x49\x48\x80\x53\x50\x81\xac\x2c\x56\xc1\x96\xa7\x01\x74\x31\xa8\xd9\x00\xe9\xd4\x32\x2b\x3c\xea\x0a\x04\xd7\xcd\x5e\xc6\x02\x0e\x7a\x66\x38\xc8\x1b\xc4\x4d\xf5\x2f\x4f\x27\xe3\xeb\x44\x80\x77\xd5\xb4\xaa\xc6\xa1\xe6\x67\x5e\x55\x9f\x13\xb9\xce\xeb\x9a\xcb\x57\x23\x29\x77\x94\x56\x85\xb2\x63\xf9\xa0\xe7\xd2\xe4\x0d\x12\x9a\x05\x6a\xf1\x6e\xa5\x3e\x28\x5c\xf4\x46\x6b\x7b\xb0\x5a\x37\xa4\xbd\x20\xdc\x1f\xe5\xcc\x69\xdd\x68\x23\xaf\x1a\xeb\x66\x9f\xff\xf0\xc3\x9f\x4e\xcf\x5e\x9c\x9e\x9f\xe3\xac\x5f\xd8\x59\x1f\xf2\x1c\xa8\xb9\x2a\x33\x22\xc9\x6a\x97\x8d\xe1\xcd\x6c\xbf\x20\x8f\xbb\xd7\xc5\x49\x42\xf8\x39\x98\x48\xe4\xfc\xf3\xbb\xcf\x7e\x31\xd2\xb6\x42\x9e\x74\x92\x73\x4c\x22\x06\x03\x74\x35\xa9\xd2\xfc\x90\x44\xaf\x5b\x27\x37\xb8\x4e\x50\x92\x27\x85\x97\x21\xc9\x25\xcc\x65\x20\x75\x6f\x07\xf5\x6e\xab\x00\x92\x03\x27\x43\x74\x35\x79\xa9\xf4\xef\x1e\xd5\x8b\xb3\xb3\x33\x3b\xaa\x67\x2f\xfe\x11\x43\x87\xe9\xd3\xf7\x37\x57\xa7\xcf\xd2\xb3\xd3\x22\x2f\x3f\xe7\xe5\xdd\x29\x8a\xdf\xdb\x3b\xf3\xef\xe5\x12\x7c\x2d\xfe\xff\xe2\xc5\x59\xcb\xfe\x7f\x79\xfe\xea\xe2\x77\xfb\xff\xb7\xf8\xe9\x79\x22\x8d\x40\x33\x1b\xf3\xb1\xef\x47\xb7\xf2\xfd\xcd\x95\x4b\x0c\x3c\x93\x86\x28\xc0\x5f\x09\x41\x72\xeb\x8e\x83\x20\x37\xf2\x06\x6f\x62\x67\x09\xb1\xcc\x2f\x4a\xb1\xcf\x77\x92\x96\x18\x31\xd9\xce\x91\x70\x9a\xcf\xed\xff\x3f\xa3\x40\x49\xd1\xfd\x7f\xca\x63\x30\x06\xba\xf3\x13\xaa\xe1\xcf\x9d\x44\xf4\xd5\xf6\x96\x37\x6d\xf1\x6d\x27\x9b\xdd\x7e\xc7\x13\x57\x15\xf9\x3f\x25\x9a\xc6\x81\xfc\xd2\x32\xea\x15\xf1\xb5\x83\x31\xda\x39\x66\x88\x7f\xb9\xd7\xc4\x8a\xee\xa8\x60\xf0\x9a\xfe\xaf\x9e\xe7\x43\x3f\xe9\xd3\x2b\x3e\x00\xaa\xb2\xd8\xfd\x2a\x61\x80\xc7\xf7\xff\xf9\xcb\xe7\x67\xaf\xda\xf9\xbf\x97\x2f\xce\x7e\xdf\xff\xbf\xc5\x8f\xdd\xe3\x57\x83\xe9\x74\x30\x91\xef\x07\xa3\xc1\xa4\x77\x25\x6f\x6e\xdf\x5e\x0d\xfb\x9e\xb8\x86\xed\xca\x67\x89\xbc\xf8\x41\xfe\xcb\xb6\xd4\xf2\xe2\xec\xec\x55\x68\x15\x1f\xf7\x4f\xe0\x77\x07\x95\xd0\x13\x39\x2c\x17\xa9\xfc\xf3\xaa\x69\x36\xe6\xf5\xd3\xa7\x4b\xb3\x4c\xab\xfa\xee\xe9\x5f\x84\x18\xdc\xeb\x7a\x67\x6d\x43\x6b\x4b\x3b\xd7\x9b\x04\xdc\xda\xa8\x9f\x7b\x5d\xcf\x55\x83\x76\x71\x08\xff\xa1\x5d\x2c\xd8\x08\x41\xdf\x17\x42\xc4\x74\xc6\x90\x0c\x3d\xb0\x28\x41\xd2\x02\x8c\xf7\x16\xd2\x04\x46\xc3\xba\xd4\xb5\x7c\x4f\xec\xa3\x64\xa0\x10\xb2\xc7\x5a\x90\x2c\x5d\x6c\xfc\xd9\xd2\x51\x78\xee\x0f\xcd\xe0\xd9\xdd\x0f\x4d\x02\xdc\xa0\xd7\x55\xe8\x3c\x65\x30\x11\x00\x65\xc7\x45\x45\x04\x23\x67\xa9\x0c\x4e\xf1\x4b\xbd\xcc\xcb\xbc\xf1\x92\x54\x28\xf6\x64\x50\xd3\x02\x59\x3f\x13\x79\x04\xa3\x46\xef\x3f\x42\x84\x06\x98\x89\x9d\xcd\x8e\x87\x44\xb4\x5b\xcf\x01\xf8\x23\xba\x30\xbe\xfa\xbc\x78\x18\x98\x08\x3c\x68\xee\x11\xd6\x18\xc0\x19\x1d\x3e\x4d\x45\x77\xca\x3e\x67\x97\x6b\x92\x2f\xa3\x12\xaa\x94\x3d\xef\x2f\xa0\x83\xd9\x87\xdb\x47\x67\xf2\x23\xf0\xec\x04\x5c\x28\x7e\x58\x71\xdc\x4a\x79\x14\x7c\xfb\x08\x00\x6a\xe5\x0e\x5f\x4f\xc8\x9d\xcf\xda\x15\x33\xa8\x32\x20\xb9\x70\x69\x15\x57\x10\x06\xfd\xc1\xa5\x49\xf2\xad\xb8\x28\x7d\x20\x69\x0e\x5e\x54\xc5\xe5\xe4\xf0\x85\x94\xe6\x14\x90\xba\x66\x3b\x5f\x14\x0a\x2b\x64\x95\x84\x3f\x86\x44\x2e\xc1\xd7\x00\xd9\x47\x00\x3d\x7b\x89\x42\x03\xa1\xbc\xb1\xbb\x99\x22\xfe\x7a\x38\x08\xf2\x28\x1a\x30\x1c\x05\x1c\x03\xa7\xfb\x36\xdf\x05\x77\xba\xf5\xf8\xe9\xae\x8f\x87\x3f\xac\xcf\xa2\xce\xcd\xa8\x8c\x9c\x02\x4b\xad\x1d\xc9\x9d\x09\x34\x6f\x1b\x50\x28\xc7\xf6\x08\x98\xc0\x07\xc5\x28\x58\x23\x55\x61\x2a\xb9\x50\x45\x41\x6c\x5e\x47\x57\x79\xf9\x59\x67\x92\x4e\xb1\xa3\xa0\x5f\xf6\xcd\x47\xd7\x79\x99\xaf\x55\x21\xfb\x55\x8d\xa5\x97\x10\x68\x41\x92\xb9\x23\x8a\x7b\xc5\xcb\xc5\xab\x1d\x45\xdf\x61\xa1\x28\xf6\xd3\xa3\x2f\x25\x12\xf4\x5b\x5c\x10\x27\xf4\x33\xed\x17\x36\x55\x1d\x12\xf3\x8b\xf8\x8d\x48\x06\xc9\x74\xc5\xe8\x53\xe5\xa6\x2a\xe8\x68\x05\x6e\xcf\x70\xe1\x04\x03\x8e\x6e\x1d\x2c\x32\x5e\x54\xe1\x70\xb4\x47\x23\x1e\x85\x70\xdf\xf4\xab\xec\xab\xe3\x81\x9c\x94\x62\x11\x48\xb9\xb5\x3b\xda\x6e\x5e\x2b\xb8\x05\x91\x24\xc8\x1f\x37\x18\x84\xe4\xe8\x8e\x2c\xb5\xce\xa8\x98\xb6\x5d\x7c\x1b\x37\xc7\x55\x4d\x47\xaf\x99\x6f\x1b\xe1\xa7\x00\xfc\x5a\x50\x50\xa4\x05\x16\xf0\x11\x47\x4f\xc3\xf1\x39\xe7\xb8\x2f\xd9\x79\x53\x32\x83\xe3\x43\xed\xe6\x2a\x15\xe2\x13\x85\x35\xc8\x14\x6c\x1d\x58\x68\x57\x93\x15\x6d\xe4\x33\xe8\xea\x73\x77\x8b\xf1\x25\x43\xd1\x5f\x81\x21\xb5\xb9\xbd\x45\xed\xfe\x32\x87\x5f\x2b\xa5\xbc\x48\x65\x1f\x5e\x1a\xf1\x0f\xd2\x3c\xdb\xbb\x20\xb6\xd8\x63\xda\x53\x77\x36\x71\x4d\x29\x44\x35\x5a\xba\x59\x4a\x2e\xd5\x02\xa7\x25\x3c\x92\xb9\xd0\x43\xc6\x3a\x94\xae\x2e\x16\xca\x96\xa3\xb5\xc4\xf4\x45\x28\xc6\xc7\x0f\x95\xc7\x41\xf1\x2b\x50\xf1\x4b\x55\xdf\xc1\x75\x2e\x37\xca\xd8\xf5\xed\x25\x12\xf9\x3b\xc0\x4d\x74\x5f\x7d\xd6\xd9\x09\xd4\x4f\x95\x2e\xb0\x14\xcc\x80\xef\x67\xdb\x99\x78\x2d\x84\x3a\x09\xe8\x23\xfc\x0d\x12\x83\x0e\xf0\xa1\x9f\x35\x08\x73\x73\xa9\xb2\xd4\xcb\x65\x55\x37\x01\x97\x4f\x07\x6b\x6b\xab\xeb\xae\xba\x13\x86\x07\x4f\xdc\xf6\x00\x26\xf1\xb0\x98\x26\xa8\x88\x25\x66\x73\x8a\xa7\x1b\x80\x89\xeb\x7b\xed\xe5\x19\x40\xa9\x91\xa4\xa7\x10\x9b\x6e\x04\x89\x3f\x2e\xb7\x85\xf5\xcd\x84\x98\x9f\x04\x88\x5b\x5a\x44\x04\xc9\x28\x21\x4a\xb7\x7c\xcc\x02\x69\xad\x56\x11\x44\xce\x39\xe4\x69\x87\x1c\x57\xe5\xb3\x34\xe2\xa0\x1e\x3a\xf3\x09\x56\x29\x41\x10\x70\xcf\xf2\x51\xff\x41\x2b\xdb\xb6\x77\x08\xe7\x82\x73\xa9\x4d\x17\x4c\x77\x6d\x38\xb0\x76\xca\x03\xe3\xcc\xc1\x1b\x58\x64\x69\x05\x4f\x15\x00\x6a\x63\xba\x8d\x90\xbd\xc4\xdd\x47\xad\x1d\x0c\x91\xe0\xf0\xfd\x21\x47\x4d\xb5\xc4\x8d\xb2\x58\x55\xf9\xa2\xbd\x68\x9c\x8c\x4b\xd0\xac\xcc\xb7\x8b\xee\x7e\x56\x14\x6e\x2a\x59\x6e\xd7\xba\x86\xd2\xcf\x8d\xaa\xd5\x5a\x43\x41\x12\x6e\x29\x14\x4c\xdc\xd6\x5a\x16\x6a\x57\x6d\x49\xc6\x1d\x29\xb7\xaa\x1a\x51\x18\x66\x8d\xb5\x0f\x8b\xba\x32\x89\xc8\xcb\x22\x2f\x43\xc9\x17\xa4\x7b\x58\x6f\x0a\x30\x5d\x8f\xa9\x8e\x66\xa9\x1f\x74\x4d\xc2\x8b\x79\x29\x0b\x5d\xde\x35\xab\x13\x4c\xba\x64\x28\xf4\x2e\xda\x52\x59\xb8\x69\xde\xe7\xf7\x60\x3c\xac\x73\x90\x10\xa1\x62\x43\x58\x44\x80\x52\x0f\xb7\x5d\x38\x7e\x0e\xc4\x43\x23\x2e\x72\xb2\x4d\x41\x5b\xd3\x8b\xc2\x86\xb7\x3f\x4b\x90\x6e\x51\x17\x3e\xf6\xef\xfd\x52\x4c\x61\x69\xf7\x18\x52\xb2\xf7\x6a\x2e\x4b\x09\x5a\xc6\x31\x0e\x7c\x6d\x20\x80\xca\x9e\x04\x2e\xe3\xe7\x69\x7c\x2f\x98\xae\xa3\x3e\xbe\x87\x82\x75\x22\xe3\x75\x42\xab\xa3\x51\x9f\xed\x69\x46\x98\xc7\xc4\x57\xfd\x14\x3b\x3b\xf4\x76\x71\xb0\x32\x56\x27\x11\x6e\xcb\x66\x70\x83\xe5\x42\xaf\x9c\x71\x6d\x59\xbb\x10\xe6\xb5\xe7\x9f\x96\xda\xba\x47\x1a\xd9\xaa\x50\x3d\x79\xbe\xbd\x03\x8f\x69\x9f\xcd\x35\x11\x39\x5e\x20\x60\x61\x65\x15\xce\xf2\x7f\x7e\x6d\xec\x9b\x3a\xbf\xe1\xea\x88\x5f\xfe\x1d\xeb\x43\x04\xeb\x63\x71\x22\xdf\x75\xd8\x45\xd0\x4e\x12\x71\x31\x7b\xb8\x2e\xc3\xfc\xbb\xc8\x24\x15\xa6\x27\x44\x9c\x3c\xa6\xd1\x63\xeb\xc9\xf5\x7a\x5d\xa1\x25\x63\xb4\x67\x1b\x54\x46\x3e\xe8\xa2\x60\x86\xa3\x25\x96\xbc\x10\xf9\x10\x5b\x3e\x20\xe0\xed\xa8\x94\x42\x2d\x86\x6f\xdc\x0d\x52\xca\xec\x44\x5e\x52\x4a\x67\x7f\x05\x9c\x9d\x90\x29\x02\xff\xf2\x98\x85\xbd\x27\x66\xdb\xba\x5c\x3c\xba\xeb\x71\xcb\x14\x93\x35\x70\x35\x20\x19\x0a\xd6\xc9\x26\x5e\xa2\x8d\x4e\x6c\x24\xd5\x80\x30\x43\x12\x0d\x46\xad\xd1\x7d\x61\xce\x8b\xbc\xfc\xdc\xb6\x22\x79\x7d\xb0\x11\xd1\xe6\x2e\x8e\x4d\x6b\x22\xbd\x02\x78\x5f\x10\xc5\x6c\xb9\x05\xb8\x45\x05\xb2\x42\x06\xa2\x4d\x81\xb9\xf7\xb2\x3d\x3b\x4b\xcc\xf2\x92\xa9\xd7\x35\xac\xa9\x10\xe7\x27\xf2\xd6\xee\x07\x3f\x1e\x66\xa5\x6a\x10\x91\xc7\xf5\xb3\xd6\x8b\x95\x2a\x73\xb3\x86\xe7\xb1\xbb\xb6\xef\x9f\xf5\x84\x7b\x82\xff\x4a\x6e\x60\xee\x61\x34\x8f\xad\x05\x05\x52\x84\x8d\xac\xb7\x25\xaa\x15\x76\x9a\x97\x42\x15\xb5\x56\xd9\x8e\x18\x7f\x9c\x4f\x82\xca\xf1\x5e\x82\x1d\xc5\xcd\x89\xc6\x6a\x7e\x12\x53\x82\x60\x6e\xab\xd8\x89\xd6\x6c\x1c\xf2\x1c\xf9\xb2\x77\x1e\xef\xa9\xa7\x0b\x71\xdd\x15\x7b\x6e\x91\x3e\x91\x37\x04\xcc\x18\x96\xa6\x51\x05\xa9\x02\x0f\x4b\x00\x32\x38\xaf\x02\x4b\xc3\xe8\x68\x84\x5c\x6e\xe8\xce\x7b\x2e\x73\xe1\x29\x13\xf1\x70\xcd\xfd\x83\x62\xbf\x60\x6f\xc2\x71\x20\x90\xf9\x1f\xf9\x9f\x09\xa9\xe2\x79\xb7\xc3\x87\x59\xc3\xc2\xe1\x22\x00\xbd\x00\xcd\x27\x3d\x7c\xa0\xad\x7b\x64\x11\xc7\x67\x58\xe8\xde\xf3\x0e\x21\x07\x1f\xf7\x08\x9f\x29\x7b\x3e\xfe\x63\x13\x13\x0d\xb5\x3c\x26\xc7\x04\x62\x28\xe8\x63\x3d\xcf\xce\xd0\x08\x3e\x34\xf4\x08\x2a\x55\xd1\x59\xfe\xe8\x39\xa3\xca\x4c\x3c\x7e\x84\x80\xb2\xdc\x5e\x3b\xce\xd1\x14\x82\xd7\xf1\xf4\x3d\xda\x30\xba\x73\xbf\x67\x43\x8b\x6f\xd8\xd0\x27\x70\xf0\xbe\x08\xcc\x10\xe7\xb8\x06\xa6\x08\x20\xad\xdc\x0e\x27\x0f\x22\xe7\x22\x33\xe0\x5f\x44\x47\xb4\x2b\xce\x24\x4d\x9e\x69\x31\xc7\xff\x13\xe3\x65\x5e\xde\x15\xfe\x81\x51\x7d\x06\xc5\xd8\x1e\x79\x99\xb0\x26\x4c\x30\xcc\x64\xb4\xd6\x1a\x4b\x59\xbb\x6f\x69\x57\xa3\xed\x8c\x6f\x45\x81\x25\x9d\x09\x7e\xd9\x61\xdb\x2a\xe1\xad\x48\xc6\xeb\x01\x03\x25\xb6\x02\xf8\xf9\xae\x33\x1d\x86\x00\x14\x26\xee\x8d\x9d\x0f\xea\x6d\x4b\xf7\x14\xfc\xb6\x4b\xfb\xef\x8f\x50\x42\xfd\x0b\x2b\x1f\x45\xe7\xfd\x87\x36\xcb\x23\xe6\x54\x67\xf3\xf1\x92\x73\x0e\xa1\x0f\xd7\x89\xae\x79\x4f\xe8\x64\xd8\x14\x94\x43\x43\x86\xdb\xa6\x92\xcb\x9c\x2e\xdf\x08\xa5\xed\x7b\x2a\xd8\x17\x8b\x06\x08\x6d\x84\x97\xa9\x9c\x68\x84\xd8\xfc\xd8\xaa\x67\xfd\x6a\x94\x9d\xbc\xbe\x43\xc9\x04\x5c\xea\x54\x3b\x5b\xd3\x4b\x02\xb5\xee\x56\xfd\xac\xf8\x7a\x54\x1f\x63\x46\xa0\xb2\x5b\xc1\xff\x89\x8c\x27\x7a\x1a\x40\xbf\xe6\x5a\x1a\xac\xef\x86\xf2\x86\x4d\x5e\xe7\x01\x6b\x27\xde\x6a\xf4\x0d\xbc\x1e\x6c\x5b\xb1\x16\xca\x7e\x21\xd3\x8d\xca\x0b\x88\x9b\x60\x39\xae\xb0\xaf\xd8\xd4\xd5\xbc\xd0\x6b\x92\xf8\x04\x7a\x01\xbb\xab\x07\xd6\x54\xe6\xc3\xd3\x33\xe0\x40\x3e\x24\x2f\xef\xb6\xb9\x59\xd9\xf9\xe0\x4f\x70\x19\xf0\x30\xbe\xff\x94\xb1\xfb\x41\xd4\x7a\xa1\xf3\x7b\x6b\x48\x37\xee\x54\xe2\xad\x2a\x17\xba\x86\x52\x08\x7c\xc4\xfe\x91\xfd\xd5\x24\x80\x3c\xa2\x9c\x6f\x01\xf4\x19\xf4\xf5\x23\x44\xd5\x69\xa2\x1f\xc3\xa3\xd4\x49\x70\xd2\x19\x5b\x2d\x85\xaf\x60\x68\x0e\x51\x24\x10\xe4\x91\x73\xbf\x34\xfb\x61\x4b\xed\x3f\x8a\xbd\x26\x04\x9f\xa4\xf8\xf6\xa1\x55\xd5\x1e\x38\x81\x03\x27\xc3\x81\xf3\xd1\x1b\x18\x41\xeb\xf4\xc5\xa3\xff\x1d\x59\x13\x17\xa7\x42\x76\x75\xdb\xf2\x6f\xcd\x46\x71\xc6\x44\x62\xe4\xe7\x9b\x7b\x08\x31\xc0\xfd\xb5\x21\x1f\x5d\x1b\x9b\xba\xfa\xb2\x93\x0b\x55\x12\xe5\x94\x63\xe3\x20\x4a\x87\x76\xb5\xfa\xd7\x77\x5b\x20\x8b\x89\x94\x34\x02\xde\xf1\xc4\x30\x6a\xcc\x81\xe8\x20\xce\xe3\xe5\x9c\x09\x04\x1b\x6c\x09\x2f\x61\xca\xb4\x01\x68\x82\xd8\x1b\xd5\xf6\x2c\x64\xaf\x57\x6e\x67\xb6\x7d\xa9\xff\x73\xd3\xf3\xbf\xfa\x4f\xfa\xf4\xea\xe6\xe6\xea\xf4\x3c\x3d\xff\xf5\x2a\x00\x1e\xcf\xff\x3f\x7b\x76\xbe\x8f\xff\x7f\xf9\xea\xf9\xef\xf9\xff\xdf\xe2\x07\x12\xad\x6a\xa6\x7f\xb2\xde\x0e\x44\xca\xe2\xcd\x2a\xc4\x3f\x9f\x3e\xfe\x9f\x10\x76\x05\x49\x8f\x3e\x3d\x97\xe7\x3f\xfc\xf0\xc3\xe9\xd9\xab\xd3\xf3\x33\xe9\x31\x02\xf6\x97\xf8\xaa\x67\xfc\xae\x38\xf9\x4f\xa9\xf9\x96\x1a\xca\x57\x32\xfe\x2e\x32\x91\x00\x50\xb9\x1d\x27\xeb\x4a\xfc\xdf\x4c\x06\xbd\xeb\xb7\x57\x03\x21\xfe\x99\x7e\x88\x8b\xf5\x91\x61\x90\xc7\xb6\x93\x27\x2c\xc0\xc1\x2f\x6f\x6b\xbb\x58\xf3\x4a\xe0\x73\x62\xb8\x63\x44\x9c\x1b\x18\xec\xc8\xe6\x12\x74\xc7\xa1\x19\x09\x75\xe4\xb2\x0f\x70\x6d\x32\x01\x92\xbd\x1c\x1f\xac\xf5\xd3\x54\x5e\x4e\x0d\xc0\xf8\xc1\xa3\xa8\x74\xdb\xe7\x56\x8b\x9d\x0f\x06\xe4\x64\x35\xf3\x7b\x72\x23\x67\xfa\xa7\xd3\x9a\x54\x81\x8e\x99\xcf\x4b\xd1\xb0\x6c\xd4\xe2\xb3\xba\xd3\x27\x68\xd4\xb4\xc0\xbb\x8c\xbb\x6e\x3f\x71\x5b\xf2\xf3\x9a\xca\x3e\x1e\x93\xbd\xec\x06\xfd\xcc\x25\x58\xbd\xd1\xa5\xfc\x30\xfe\x28\x67\x63\xaf\xb2\x36\x90\x37\x93\xf1\xfb\x49\xef\x7a\x2a\x6f\x47\x97\x20\x9d\x32\x9c\x32\x26\xe5\x49\x22\x20\x51\x9f\x80\x49\x64\x88\x97\x7d\x41\x69\x2a\xfd\x45\xad\x37\x05\x67\x4a\xc0\x6b\x5d\x6b\xba\x02\x09\x2e\x4a\xac\x2d\xa0\x0d\x5f\x6b\xc1\x99\x55\xa8\x41\x74\xf3\x86\xe6\x48\xee\x11\xe6\x61\x9e\xa8\x70\x96\xea\xb0\x3c\xb0\x20\xe5\xcf\x40\x1b\x82\x5f\x7e\x12\xa2\x18\x82\xf9\x0d\x4b\xe7\x3b\x1f\x1f\x4d\x29\x76\x37\x30\x8b\xc2\x05\x18\xbc\xad\xa3\x6c\x1f\x3c\xe0\x03\xdf\x6c\x7b\xea\xb0\xcb\x1e\x7f\x5c\x2a\x86\x65\x96\xdf\xe7\xd9\xd6\xd5\x79\x76\x7e\x47\xd5\x01\xb8\x85\x82\xb5\xa8\xba\xb0\xd1\xb5\x01\x5a\x91\xb0\x55\xd6\xb8\xdf\x0f\x75\xaf\x8d\x2e\xee\x89\xda\x8b\x7c\x97\x36\x05\x40\x3b\x9c\x61\xe2\xaf\xe2\xb2\xfd\x63\x59\xfd\x11\x69\x0d\xbe\xa9\xad\x22\x6e\xa7\x8c\xdb\xd9\xd5\x0a\x55\xca\x40\xac\x37\x70\x1f\x21\xef\x94\xca\x9e\xff\x06\xd4\x3e\xa3\x01\x1f\x1f\x78\x9e\xf6\x20\xe9\x7a\xd8\x6c\xa5\xc5\x8d\x3b\x1c\x88\xb0\x15\xb2\xe3\xc8\x69\xb5\xd2\x8b\xcf\xe4\x15\x06\xad\x45\x68\x7d\xb4\x4e\x11\x17\x00\xbe\x9e\xd0\x05\xac\xb5\x9e\xe3\x4b\x0f\x79\x88\xdb\xb5\xdd\x4f\xdb\xd4\x66\xad\xc1\x64\xcf\xbf\xed\xe0\xd3\x8b\xdf\xd8\xd6\xed\x50\x0d\x8c\x38\x04\x81\x83\x78\x51\x6d\x74\x8b\x87\x1e\x63\x40\x0a\x49\x5f\x49\x02\x3d\x7a\x15\x9d\xed\x9c\x26\x81\xa3\xf5\x23\x93\xb3\x46\x57\x4d\x22\xe7\xba\xc8\xf5\x7d\x90\x7f\x0a\x06\x08\x4e\x13\xd8\x5d\x68\x35\xae\x34\x14\x24\x64\xd5\x5a\x78\x51\xef\x08\x88\xf6\xd5\x2d\x43\x79\x50\x88\x0c\x61\xc9\x8a\x4b\xd5\x06\xa4\xeb\xcc\xa4\x8c\xcd\x80\x10\xa2\x3d\xd6\x1f\x56\xc8\xbd\x91\x3b\x5c\x2b\x78\xe1\xf7\x2a\x2f\xa8\x58\x27\x11\x39\x28\x5b\xe5\xac\x78\x51\x6b\x4f\xba\x1a\x37\xc5\x05\xb6\x28\xa9\x64\xb4\x96\xab\xea\x01\x4e\xa2\xc5\xca\x8e\x89\x80\x83\xfb\xae\x52\x05\xbf\x59\x6b\x3e\xff\x4c\x38\x50\x30\xb2\xa5\xac\xb5\xc2\xb8\x00\x9f\x75\xf2\xe7\xc5\xf2\xee\x6e\x9b\x67\x3a\x6d\xf4\x97\x27\x9c\x78\xb2\xd7\xa1\xec\xb8\x0e\x97\xb0\xb1\xee\xee\xb4\x61\x9c\x5a\x7f\x3c\xba\x1c\xce\x90\x24\x6c\x14\x6b\x6d\xda\xdb\x21\x56\x9b\xfe\xe7\x6f\xff\xf1\x37\xed\x77\xed\x30\x3f\x74\x97\xa1\x90\x55\xb5\xc4\xad\xc4\xa1\x95\x8e\xa5\xe8\xcd\x0c\x7e\xb1\xfd\x2d\x61\x2e\xa8\x1a\xe4\x41\x59\xc7\xb1\xeb\x1c\x82\x45\x63\x0f\x22\x7b\xf1\x22\xf7\x2f\x06\x7b\xac\x43\x33\xcf\x33\x38\x86\xf6\x0f\x48\xd5\xc0\xd3\xd2\x03\xbd\x75\x3d\xec\x7a\x65\xbe\x0c\xc2\xcb\xf6\x2f\x51\xb4\x4c\x68\xb0\xdd\x0e\xb1\x2c\x7c\xe2\xd0\x28\xf0\x64\xab\x80\x23\x00\x84\x19\xfd\xfe\xaa\xea\x52\xb3\x7b\x8a\xad\xd8\x3f\x40\x11\xd2\x76\x28\x6a\x0c\xdf\x02\xa4\x9e\x59\xd4\xf9\x9c\xb1\x7a\x1c\x6f\x05\x52\x30\xb2\x2b\x3c\x1a\x52\xf4\xa3\x23\x3b\xb8\xb2\xde\x75\x5c\x59\x4f\x90\xb9\x61\x18\xbc\x30\xf7\x16\x90\x2b\x29\xb2\xff\x40\x1b\x61\xb7\xdf\x7f\x5f\x2f\xda\x3d\x14\x87\x6e\x8e\x47\x3b\x2e\x5c\xfc\xf6\xbb\xba\x2f\xe3\xee\x43\x3f\xbc\xc6\x18\x0c\xc1\x13\xa4\x77\x70\x13\x69\x57\x6b\x8b\x95\x37\x5e\x3e\x2e\xea\x68\xff\x16\x12\x37\x73\x5d\x9a\xa0\xa5\xe8\xc5\x5f\xa3\x07\x04\xf1\xf4\x80\x5b\x1f\xcf\x37\x34\xcb\x56\xf9\x06\x2f\x27\xff\x70\x11\x51\x4a\x78\xc4\x29\x7c\xe4\x38\x87\xb0\xc0\x49\xc0\x4f\x09\x2b\x1b\x6d\x1b\x27\x79\x09\x05\x57\x2f\x82\xae\x22\x81\x04\xcc\x1a\x8b\xb1\xd2\xa6\xb2\xdd\x47\xfd\x00\xb7\x10\x20\x8f\x82\xbc\x15\x8e\xc8\xc2\xdd\x24\xf1\x08\xd1\x49\xd0\x71\x48\xa4\x42\xbc\xec\x6e\x00\x45\x03\xb5\x93\x92\x8d\x1f\xc9\xf1\x8a\x5a\x43\xd2\x1f\x78\x0b\x05\xf0\xe6\x9b\xa8\x95\xa8\x11\x10\x6e\x6f\x27\xfd\xd2\x56\x8f\xc3\x47\x81\x3d\x2c\xd0\x7e\xf3\xb4\xcd\x7c\xf1\xf8\x90\x92\x1b\x7f\xf7\x4f\xb5\x71\xf4\xfb\x98\x5d\x46\x95\x06\xcc\x7d\xf8\xcf\xb4\x71\x57\x44\xd2\x24\x5e\x05\xe3\xf0\xe8\x7a\x6b\xeb\x1e\xe3\x69\x07\xa7\x61\x4b\x66\x30\x0c\xf7\xc7\xcf\x80\xf3\x0d\x63\x47\xd8\x55\x6b\xeb\xdf\x87\x72\x47\xd1\xe7\xc5\x57\xd7\x38\x1f\xb7\x52\xca\x3f\x85\x1d\x71\x72\x18\xc7\xbd\x13\x3b\x19\xc7\x6f\x4f\x5e\x0b\x61\xff\xd2\xba\x7e\xf6\x6e\x1a\x79\x4c\x79\xca\xe4\xb1\xeb\x49\xc4\x5f\x3a\x69\x65\x64\xf6\x7a\xf2\xc6\x79\x65\x1d\x94\x59\x62\x6f\xd9\x02\x86\x76\xbe\xf3\x0a\x66\x5e\x63\x18\x9a\xdc\xb1\x30\x01\x5c\x45\xb5\xf6\x80\x6f\x82\x14\x14\x1d\x8f\xee\x39\xfa\xdf\xb7\xf9\xbd\x2a\x20\x4e\x17\x3f\x32\x1c\x02\x50\x84\x70\xa9\x04\xcc\x65\xd9\x83\xd5\xa0\xfd\xe8\x0e\x51\x2a\xf4\x6d\x56\xd5\xf6\x6e\xd5\xaa\x1f\xf6\xd9\xa5\xf5\x46\x17\xac\x88\xd5\x7e\x93\xb2\x0b\xfd\xd0\x98\x09\x71\xfc\xf6\xc4\x27\xfb\xaa\x80\x4f\x86\x02\xa5\x5d\x9b\x3e\x48\x01\x86\x6a\x4e\x39\xe8\xed\x08\xda\xc0\x6b\xa8\x63\x9e\x43\xac\xbd\x73\x19\xbc\x21\xb5\x18\xf0\x60\x7d\x8c\x98\x1b\xa3\xe4\x6d\x99\x03\xb1\xf7\x44\x13\xb2\xf6\xaa\x5a\x28\xeb\x4c\x1c\xdf\x4e\xae\x4e\x08\x9f\x6b\xf2\x46\xfb\xc8\x81\xfe\x02\xba\x09\xb0\x5b\x83\x14\xe6\x9a\xf2\x54\xa2\x6b\x35\x82\x42\x47\xb5\xb4\x47\x54\x7d\xa7\xe5\x31\x2d\x6b\xdb\x6f\x17\x43\xb5\x53\x8f\x67\xec\x1e\x58\x54\xe4\x6e\x8f\x01\x34\x6d\xa3\xeb\x95\x02\x41\xd3\x28\x38\x7f\x02\x85\xc1\xdc\xd6\x90\x8a\x29\x91\x3f\x87\x2b\xf6\x09\x5e\x91\xc8\x48\x07\x70\xe3\xb5\x72\xa9\x67\xdc\xe2\x68\x1b\xdb\xab\xb2\x42\xe7\xc5\xb0\x5e\x0e\x7c\x81\x62\x23\x5c\xa7\x8d\x72\xb4\x90\x19\x07\x4a\x58\xca\x91\x47\x8f\x04\xc2\xa4\x9d\x5c\x5b\x23\xb9\x44\x36\x2b\x4c\x47\x5a\xfb\xcd\x53\x51\xb1\x99\xe0\xe4\x2f\xed\x7b\x41\xe3\x27\xac\x42\xb0\x43\x64\x74\xb1\x4c\xe5\xcf\xd7\xc1\x40\xed\x77\x8c\x82\x03\x0b\x9d\xb9\xa3\x9a\x92\xf0\x76\xf8\x32\xaf\xc1\x1d\x9e\x8e\xe5\x1e\x7f\xc1\xe9\xa9\x0c\x0e\x14\xf8\x6c\x50\x25\xb7\x77\x96\x09\x5a\x37\x77\x25\x34\xad\x6c\x18\x5d\x86\x41\x34\x47\x39\xe1\xa2\x71\x44\xdd\xd5\x12\xfc\x26\x7e\x0b\x50\xce\x2e\x88\x12\x03\x02\x1e\x94\x09\x55\xe5\xdd\x56\xdd\xd9\x93\xb3\xcf\xa5\x39\x4d\xa0\xff\xa0\xdc\x68\x06\x58\x77\x44\x13\xab\x4e\x08\x1c\x1d\xc3\xb3\xb6\x41\x15\xd8\x5b\x6d\xb7\x97\x9c\x20\xcc\x42\xe1\xa3\x09\xa7\x0c\x09\xcf\x42\x13\x46\xc8\x17\xe4\xbb\x8d\x4e\x74\x55\x75\x16\xeb\x00\x30\x6f\x17\xbf\x32\x95\x76\x4d\x27\xd6\xc7\x02\xfa\x66\x7c\x9e\x33\xc5\xe4\xab\x14\xf3\x48\x0a\x01\xc0\x18\x0f\x0a\xf0\x76\x74\xa4\x50\xbf\x42\xd3\x1b\x5e\xc4\x27\x1c\xc8\x4a\x66\xd8\xee\x4d\x5d\xad\xf2\x79\xde\xa0\x65\xb4\x02\x19\x0b\xea\x28\xbc\x45\x30\xf3\x07\x30\x0d\x87\x62\x52\x6b\xdd\xac\x2a\xbb\x49\xdd\xe8\x9b\xca\xe9\x2c\xcc\x35\xd6\x62\x7b\xf5\x5a\xba\xe1\x01\x43\xda\xec\x55\x64\x76\xf8\x17\xa9\x10\x3d\x39\x89\x62\x70\xd6\x14\x0d\xf7\x80\xfc\x48\x64\x27\x91\xaf\x25\x4e\x7f\xc9\x8f\x10\xc3\x06\x99\x45\x8c\x96\x25\x7a\xdb\x95\x87\xbc\x77\x34\x90\x2e\x13\x4a\x18\x61\x25\x3f\x92\x51\x2b\x90\x03\x0f\x24\x95\x0a\x53\x85\x9e\x31\xcd\xc7\x9e\x87\xb4\x0c\x85\x2d\xe8\xb3\xf1\x5d\x9b\xca\x8f\xe0\x66\xc3\xf1\x0e\x5f\xc7\xc9\xdc\x13\xd2\x77\x74\x99\x70\x78\x43\x7f\x44\x9b\x8d\xb3\x5a\x36\x9a\xd6\x38\x7c\x6a\xa5\x36\x1b\x0d\xaa\x07\x6a\x81\xbc\x20\xf6\x30\xe0\x9b\x64\x59\xd5\x77\x9a\xb4\x7b\x5d\x58\xd9\xbd\x8c\xf7\xd4\x1b\xb0\x24\x1b\xe7\xbf\x02\x49\x30\x73\x93\xa0\xbe\x3c\x67\x6c\xf1\xac\x05\x19\x3b\xba\xd9\xf7\xee\x46\x77\x13\x29\x38\xd1\xb6\x26\x1e\x1e\x82\x75\xde\xe7\x15\x4a\x17\x89\x76\xf4\x2a\x8e\xf8\xa7\x12\xa7\x78\x6b\xb6\x60\xd7\x72\xb1\xc2\xdc\xae\x48\x96\x2e\xb0\x6d\xfd\xac\xf5\x06\x23\x1b\x5d\x37\x9c\x5f\xd3\x6e\x23\x53\xf6\xb1\x2a\x75\x2a\xaf\x83\x20\xad\xa3\xe8\x11\x0f\x6a\x47\xa6\x4b\xd9\xd4\x15\x2a\x91\xcd\xf5\x4a\xdd\xe7\x55\x90\x9b\x66\xff\xc3\xad\x9b\x06\xad\xa0\x40\x84\x35\x13\x6c\x08\x1f\xf4\xd6\xbe\xe2\xac\xfe\xc2\x0d\x02\x7b\xa4\x57\x82\x33\x13\x44\x6f\x0f\x06\x44\xbb\x9d\x58\x5a\xa7\x1c\x2b\x15\xad\xa0\xae\x6e\xc7\xd7\xda\x87\xf0\x5e\xd0\x01\x6f\x56\xef\xb7\x87\x99\xff\x2f\x8b\x62\x6b\x10\x16\x4d\xe0\x88\x83\x77\x41\xa4\x29\x43\xe0\x82\xc7\x3d\x6b\x4c\x49\xc4\xfe\x79\xde\x1d\xd9\xee\x08\xbb\x06\xe0\x0e\xe8\x0a\x2c\x25\x16\xaa\x22\x54\xc8\xe7\xbc\xcc\x08\x61\xd3\x50\x4a\x3b\x32\x95\x1c\x61\x21\xbe\x8b\x8d\x47\x0a\x24\x25\x94\xeb\xd9\x7f\xee\x37\x46\xc0\x2b\xcf\x8c\x7b\x78\xad\x61\x84\x23\x8e\x0c\x7c\xe7\x02\x03\x6c\x41\x77\x54\x8b\xc0\x97\x7c\x59\xcd\x35\x22\xba\xa1\x53\xf8\x66\xef\xfc\xe4\xd6\xdc\x10\x87\xc2\x2e\x27\xe4\x58\x44\x31\xaa\xee\x35\x9a\xa0\x6d\x2a\x02\x49\x8e\xaf\xad\x52\xb2\x3c\xdd\xbd\xec\x8d\x4b\xb8\xf5\xe1\x68\x42\x19\x3d\xe7\x17\xc2\x9c\x52\x21\xd1\xa9\xec\x08\xf9\xb1\xcf\x89\xbd\xdd\xff\x9e\xfc\x39\xcd\x4b\xf3\x84\x38\xd3\x30\xde\xaa\x6a\x2d\xf2\x10\x5f\x88\x2b\xa3\x65\xbf\x85\xe1\xc1\x00\xe0\x87\x64\x6b\x61\x54\x00\x54\x4e\x98\x37\xaa\xb1\x76\x85\x6f\xe9\xd7\x22\xda\x7c\xfb\x1c\x6a\xfb\x32\x7b\x22\x8e\x71\xa2\x96\x55\xd9\x60\x29\x6a\xee\x1b\x1d\x16\x1a\x01\x21\xbb\xaa\xdb\x85\xd2\x10\xab\xbf\xb9\xb9\x92\xca\x08\x1f\xdd\x82\xb9\xf0\xc5\x38\x58\x73\xe0\x1b\x1b\xdf\x91\x9d\x0d\x10\x41\xdb\x89\xea\x9e\x2d\x5e\x64\x0a\x8d\x8a\x75\xac\x9b\x7e\x7e\x82\x86\xb1\xdd\xc9\x8f\x53\x9a\x32\x01\x1b\x0a\x9f\x72\xf1\xaf\x73\x41\x6c\x4b\x48\x0a\x93\x8a\xc0\x9a\x46\xaf\x37\x48\xc4\x43\xd7\xe4\xb6\x74\x9f\x87\x96\x1b\xeb\x77\x5e\x9c\x04\x15\x16\x71\x54\x84\x5b\x10\xc5\x04\xb0\x35\xc7\xb6\xf7\x79\xb9\xd9\x36\x72\xa3\x9a\x95\x91\x0b\x55\x0a\xde\x65\xc1\x6d\x85\xce\x9a\xd1\x70\x06\x3d\x32\x69\xe8\xce\x34\x78\xbd\xda\x87\x88\xf9\x4e\xce\xf4\x4f\x27\x7f\xd7\xa5\xb3\x58\xde\x3d\x11\xc7\x91\x00\x23\xaf\x99\x83\x73\x96\xee\x5d\x52\xc7\x48\x36\x0c\x6d\x05\xc9\xc6\x13\x87\xcd\x82\x80\x19\x44\xd8\x80\x37\x77\xbd\x06\x3d\x00\x8f\x84\x25\xb8\x01\xb8\xe2\x41\x01\x72\xd4\x22\x0e\x66\x32\x2f\x21\x28\xd4\xd6\x4e\x6c\x15\x8f\x75\x5c\x2b\x5e\xae\x1a\xb4\x35\xf2\xb2\x75\x80\x25\xd2\x81\x0c\x9e\x09\x46\x19\x64\x7a\x53\xeb\x85\x23\x13\x38\x74\xa6\x47\x03\xbb\xa8\xd6\x9b\xaa\x44\xb9\x85\x25\xa1\x0d\xd0\xfc\xf0\xc1\x3e\xbf\xb6\x60\xf2\x29\x05\x1c\x56\xe1\xae\x31\x25\x8a\x44\x67\xa1\xe1\xbd\x50\xa5\x97\xbd\x7c\xc4\x0c\x13\x22\x64\x67\x12\x51\xd2\x65\x76\x88\x98\x31\xca\xad\x7c\x23\x97\x62\x02\x7e\x90\x07\x92\x7c\x40\x62\x37\xda\xbe\x26\x5a\x12\x3f\x03\x7f\xe2\x93\xe4\x10\x81\xa2\xe8\x26\x50\x94\xbf\x8c\x40\x51\x3c\x4a\xa0\x28\xbf\x97\x40\x51\x1c\x26\x50\x6c\x6b\x81\xb4\xae\xd7\x36\x91\xa2\x08\xff\xfd\x2b\x84\x8a\xf2\x6b\x84\x8a\x02\x09\x15\x93\x6f\x61\x54\x3c\xc8\x99\x28\xbb\xe6\x90\x99\x82\x04\x46\xfe\x61\x8f\xc7\x57\xd7\x9e\xb3\xf6\x08\xc9\x62\x40\xaa\x18\x66\xa9\x5b\x91\xbf\x90\x64\x84\x40\x24\x8f\xb2\x2f\x8a\x6f\x67\x5f\xdc\x17\x77\x6f\xb1\x2f\x8a\x40\x0c\x95\x4e\x93\xb0\x6d\x76\x13\x6f\x49\x91\xbe\xc5\xc9\x18\x45\x8a\xfd\x02\xed\x20\x67\x4c\x5a\x7a\xeb\x8f\x73\x33\x26\x87\xc8\x19\x55\x09\xb0\xac\xb6\xfa\x7f\xa0\x62\xd7\x4e\x5d\x7e\x0f\x41\x63\xe7\x86\xb6\xa6\x19\xa8\x70\xe1\x62\xe0\xbf\xc2\x43\xc4\x41\xf6\x46\xf4\xdc\x1e\x65\x6f\xfc\xc5\x38\xa3\xef\x4a\x35\xb7\x13\xcf\x10\x6f\xe4\xa4\x9c\xcf\x42\xad\xe1\xfe\x28\x9b\xef\x01\x2d\x89\x0e\xd0\x92\xfc\xcf\x80\x96\x50\x29\x8a\x9f\x08\xb7\x21\x25\xa0\x32\x3b\xe5\x3f\xef\xaa\xed\x13\xe7\xb4\x19\xb7\xe1\xfb\xab\xaa\x32\x88\xc1\x08\xd8\x0a\xaa\x5a\xf6\x28\xc0\xe7\x40\x83\xdf\xe5\x35\x38\xcc\x1b\x65\xcc\x22\x18\x19\x44\x1c\x14\x6a\x3f\x95\x74\xb6\xd8\x1d\xf1\xc7\xf0\xd2\xfa\x63\x70\x51\x09\xaa\xbb\x04\xaf\x8c\x12\x3c\x15\xaa\x11\x84\x83\x40\x9e\x84\x2b\xb4\x5d\x72\x4d\x64\x50\xe3\xa9\xca\x1d\xd6\x42\x70\x8c\x81\x1b\x05\x0a\x28\xa5\x69\xb4\x8a\x40\x21\xd1\x67\x38\x71\xe5\x84\x50\x84\x0b\x60\xc4\xe8\x3f\x14\x99\xdb\x03\x36\xc2\xd6\x5b\x57\x99\x2e\xe2\xe0\x14\xb7\x5f\x10\x10\xaf\x76\xdf\x20\x41\x96\x56\x7f\xc8\xba\x66\x1e\x54\xb8\x63\xef\x38\x89\x91\xaf\xe1\x06\xb4\xf7\x3e\x47\x69\x22\x04\x5f\xb7\x48\x97\x7d\x20\x87\x5d\x1d\x02\x64\x5d\x65\x1e\x01\x22\xbf\x82\x00\xa1\x6a\x13\x8e\x16\x35\x10\xd4\xae\xac\xd5\xba\xe2\x9a\x93\xaf\x44\x80\xf8\x09\x49\x9c\x31\x79\x58\xed\xa2\xdd\x40\xf6\x51\x8b\xee\xa0\x1b\x97\x7e\xfc\xfe\xe6\xea\x04\xc8\x64\x22\xaa\x15\xb5\xd9\xd4\xd5\xa6\xce\xc1\x77\x1a\x7c\x0d\xea\x68\x07\x1d\xde\xe9\xe4\xb1\x16\x5b\x24\x88\xcb\xcb\xd6\x20\x09\xbb\x06\x90\xdd\x61\xee\x45\x9a\xf1\x04\xe0\xbd\x89\x8e\xf3\x3e\x4a\x2c\xde\xe4\xc2\xe7\x01\xdc\xf2\xa9\x35\xea\xbb\xd5\xea\x0e\x5b\x05\xa8\x1d\xc8\x82\x7f\x40\xf4\xcf\x2d\x5c\x2c\x01\x93\xc3\xa1\x6d\x2b\xc4\xac\xda\x83\xaa\x26\x94\xa1\xcb\xcb\xb8\x12\x9c\xaf\xed\x78\xc3\x54\x50\x12\x05\xb3\x96\x2f\xf2\x46\xec\x95\x37\xfb\x6b\x16\xbe\x08\xee\x02\xa7\xf9\x77\x10\x89\x02\x6d\x69\x53\x49\x15\xd4\x07\x40\x1c\x73\xcf\x72\x3e\x00\x52\x0b\xd3\x35\x20\x02\x5a\x47\x39\xee\xe0\x08\x69\x9d\x15\x76\xc8\xc8\xa0\x85\x3e\xc0\x5a\x73\x17\x8d\xe2\x2e\x80\xf0\x26\x37\xed\xb5\x10\x7f\xf8\x83\xdc\xe4\x77\x69\xd6\x7c\x81\x3f\xfb\x0b\xef\xe2\xec\xec\x5c\x5e\xa7\xf2\x53\x2a\x47\x6a\xad\x85\xf8\x83\x10\x7f\xc0\xa9\xd8\x3c\x0a\xe0\xf4\xbd\x8a\x4a\xc7\xc4\x1f\xba\x7c\xea\x47\xe0\xcc\x61\x3e\x87\x51\xdb\xf6\x29\xed\x33\xa8\xaa\xe5\xb1\xa3\xb8\x85\x72\x9d\x93\xfd\x2a\x9f\x14\x1b\xdf\x9d\x15\x08\x83\x7e\x76\x35\xdb\xcf\xae\x9a\x66\xf3\xfa\xe9\xd3\x87\x87\x87\xd4\x7e\xe5\xcb\xe9\x06\x1b\x09\x8c\x70\xc5\x66\x53\xa4\xcd\x97\xc6\x7e\x10\xc2\xc2\x01\xae\xdc\xda\x2a\xf0\xe6\x80\xbb\x03\x24\x90\xdb\x52\x2f\x88\x74\x11\x7f\xf0\xdf\xfe\xe1\x87\x1f\x9e\x9e\xbd\x7c\x7a\xe6\x1f\x92\x76\x0d\x3b\x6c\x7c\xd3\x98\x78\x35\xd3\x2c\xa2\x21\x9e\xdf\xa5\x79\x69\x84\x78\x0f\xd5\x58\x8f\xac\x00\xaa\x49\x67\xb4\x50\x38\x45\x58\xc9\x45\xab\x4c\xb4\x91\xc3\x54\x46\x4c\x05\x32\x60\xdb\x77\x40\x89\x6b\x3a\x14\xe0\x02\x79\xe0\xdc\xd5\xcf\xd4\xd6\x27\xd0\x96\x9f\xa9\xb5\x4f\xf0\x50\xf9\xb9\xcb\xee\xea\x78\x1c\xe6\x3f\xc4\xcf\x7e\x89\x3e\xb1\xe6\xbe\x33\x5d\x26\x2d\xf3\xe4\xf0\x75\x2f\x84\xe3\x2e\xfb\x48\x59\x30\xd6\xde\x8d\x83\xd9\x33\xbe\xa7\xa8\x5e\xda\x38\xfa\x84\x78\x66\x43\x93\x93\x8c\x2a\x58\x02\x3e\xd8\xb5\x07\x7e\x6c\x08\xb5\x4f\x31\x5b\x6f\x81\xb9\xbc\x84\x4f\xaf\x3f\x28\x27\x20\xc0\xeb\x16\x32\xca\x99\x46\x65\x71\x4d\x41\x14\x17\x91\xa3\xde\xc4\xaf\x9c\x21\x5c\x61\x5b\x64\xf1\xed\x24\xe6\x9a\x21\x97\x70\xea\xf0\x69\x58\xec\x80\xd6\x0f\x7c\x8c\xb0\x2f\xed\x0e\x97\xf6\x1c\x6c\x42\x72\x08\xd6\x78\xaf\x96\x78\x08\x73\x10\x1c\x52\xd0\xc8\x18\x07\x34\x30\x45\xfe\x59\x3f\xba\xd8\xed\x7b\xf1\x9d\x44\x30\x98\x97\x72\xad\xca\x7c\xa9\x4d\x63\xb7\x63\x2a\xf0\x50\x54\x0d\x1e\xfb\x0e\xdc\xa5\xe6\xc6\xa9\xe6\x97\x72\x5b\x02\xd4\xa3\x5a\xa8\x02\x25\x8b\xf2\x86\x32\x5c\x73\x1c\x79\x4c\x91\x8b\xf6\x18\xcb\xd6\x18\x63\x0c\x3c\xb8\x86\x89\x2f\x9e\x54\x7b\xeb\x3c\xf6\x89\x10\x47\x60\xfb\xeb\x78\xba\x38\x6d\x02\x16\x66\xc7\xaa\x31\x01\x1c\x68\xae\x55\x7d\x30\x90\xdc\xc6\xa4\x03\xbd\x77\x55\x7e\x3d\x56\x93\xb4\x02\xf0\x11\xbf\x15\xfc\x5e\xf8\xb1\xfe\x0a\x6a\xaf\x15\x9b\x7f\xc2\x81\x70\xac\x6f\x71\xee\x82\xce\xd0\x8c\xeb\xdc\x25\x41\x05\xb1\x4f\xcb\x21\x77\x20\xda\x61\x3a\x18\xbb\x20\x90\x0e\x14\x1c\x74\x5f\x14\xb0\x5e\xda\x1f\xa6\xc5\x5a\xbb\xa7\x85\xaa\xd1\x0b\xd5\xe8\xbb\x8a\x18\xd6\xc4\xde\xd7\x52\x21\xde\x75\x85\xb7\xd9\x26\xf6\xc8\x2f\x57\x93\xe2\xd4\x09\x4f\x10\x45\x0e\x09\x50\x76\xa0\x84\x0b\x3d\xf2\xac\x42\x2b\x18\x22\x9e\xdf\xb7\xb3\x3d\xe1\xdc\xa6\x34\xda\xfb\x31\x40\x23\x8f\x1f\x0f\x65\x62\x5b\xb8\x15\x72\xaf\x15\x85\x36\x46\x1c\x6e\xc5\xf7\x63\x42\xc1\x8b\x3b\xbc\x64\x5b\xd9\x13\xaa\x1d\x76\x08\x82\xb0\xa1\x99\x5e\x14\xd0\x48\xa1\x78\xb6\x76\xfb\x1d\x08\x67\xae\xf3\xad\xff\xc0\x55\x94\xff\x7d\x7f\xd2\xa7\x97\x55\x63\xf4\xbf\xff\xfd\xd8\xde\xf7\x7f\xbe\xc6\xff\xfe\xfc\xac\x5d\xff\xf9\xec\xe2\xf9\xf9\xef\xf5\x9f\xbf\xc5\x4f\xcc\xe1\x7c\xfe\xc3\x0f\x2f\x40\xa8\xc4\x6e\xed\x4c\xf6\x6a\xa3\x4b\xad\xb6\x14\xcc\x0a\x05\x61\x49\xaf\x03\x90\x5e\x14\x4d\xc5\xc0\x15\x33\xc6\x38\x99\x58\x4e\x88\xce\x59\xb2\x2f\x13\x14\x2c\x76\xd0\x2f\x7b\xd5\x93\x3a\x2c\x78\x78\xc7\x78\xd6\x84\xd4\x8b\x3b\x7e\x23\x81\xa6\xc1\x4c\x55\x1b\x5d\x9f\x9a\xfc\x3f\xb4\x20\x2e\x01\x6b\x56\xfc\x5f\x6c\x46\x03\x39\xee\x09\x97\xd0\x91\xa1\xc4\x62\x84\x85\x5e\x02\x5a\x44\x2d\x9a\x7f\xe8\x73\x2b\x7d\x3a\xe8\x5f\x9d\x9e\xa7\x67\xff\x75\xfb\xff\xf9\x8b\x67\x7b\xfa\xaf\x2f\x9e\xfd\xbe\xff\x7f\x93\x1f\x6b\x43\x0c\xb2\x2d\x9a\x3f\x60\x7b\xae\xd7\xdb\x32\x6f\x76\x3e\x28\x04\xdb\xe7\xd1\xcf\xa0\xa8\xcc\x11\xd3\x89\x9f\x84\xb4\x1f\x90\x07\xe0\xd2\x10\xe0\xcf\xb1\x96\x8d\xaf\xf4\xc0\xaf\x8e\x39\xcd\x0b\xfc\xd2\x27\xf2\x01\xcc\xe6\xea\xa1\xd4\x75\xf4\xf0\xaa\x3e\x3a\x91\x2b\x65\x04\xc1\x1c\x62\x20\x08\x87\x92\xd6\x6b\x9d\xe5\xaa\xb1\xc7\x45\x4c\x2d\xd2\x45\xaa\x07\xe1\xa3\xe8\xfd\xaf\x23\x6a\xfb\xc5\x89\xfc\xf3\x4e\xab\xfa\x2f\xf2\xcf\x7b\x82\x6e\x7f\x11\x4c\xc5\x11\x86\x47\x1f\x1f\x2b\x1f\xd0\x38\xa3\xb1\x8d\x5e\x1e\x32\x22\xfb\xd4\x71\x24\xbe\xc3\x07\x1c\xd2\x7e\xa2\x53\xc1\x85\xd6\x79\xa3\xd7\x06\xa4\x99\x30\xe7\xd3\x22\x21\xdf\x93\x2d\x3b\x36\x27\xd2\x6c\x91\x23\x93\x83\x09\x44\x44\x24\xbe\xda\x97\x54\xbe\xdd\x11\x9c\x1d\xd2\xa5\xcc\x2e\x0e\x71\x2a\xfb\x26\x1c\xf7\xdc\x88\x56\x17\x21\x03\x79\x57\x6b\xdd\xaa\x6f\xaf\xb5\xca\x12\x1c\x49\x40\x8b\x30\xfa\xa9\x28\xb0\x26\x02\x11\x56\x22\x9e\xf5\x4e\xbe\x18\x32\x94\x1f\x6d\xfe\x6b\x21\x6e\x22\xfd\x0e\x80\x7b\xda\x76\x27\x94\x3a\x4c\xe4\x5a\xd7\x77\x3a\x61\x8e\x95\x24\x08\xc8\x61\xdb\x0c\xc4\xd5\x60\xa3\x34\x7b\x73\xe9\x98\x29\x23\x6d\xa4\xaf\x88\x1f\xc3\x9a\x0c\x04\x8d\x3c\x02\xcc\x7e\x74\xa9\x91\xa0\xb0\xda\xa9\xa2\xd9\x05\x2c\x8e\x7b\xb3\xea\xd4\xb9\x04\x28\x97\xd8\x1b\x79\x9f\xd3\x98\x05\xb1\xe2\x11\xad\x4a\xd9\xbb\xba\x6a\x71\x43\x72\xcf\x90\x72\x3d\xe4\x2c\x87\xd8\x4a\xb5\x0c\x57\x6e\x0c\x0b\x07\xcf\x90\x81\xeb\x26\x71\xaf\x17\x6b\xf5\xd9\xce\xc2\x0c\x48\x90\x8b\x22\x48\x84\x7c\x6d\x17\x81\x43\x5b\x54\x14\xdc\xbd\xcf\xf5\x03\x83\xff\x09\x7a\xbf\xa4\x82\xa9\x30\x82\x1a\xb5\x83\xb9\xaa\x7a\x00\xf4\xd4\xa7\xfa\x0b\x85\x60\xf2\xb2\xd1\x20\x8a\xb6\x55\x85\x57\xd2\xca\xbc\xf0\x5b\xe2\xf9\x36\xab\xda\x2f\x3f\x11\xba\x42\x10\x8f\xf0\x94\x35\x0c\x27\x6a\x45\xa5\x5d\xaa\xff\xe0\x11\x00\x4a\x96\x8a\x30\x40\xfc\x94\x07\x0d\xd8\xc3\x4c\x53\xf3\x5b\xa3\xbd\xdc\x7f\x64\xa7\xde\xbe\xaf\x68\x40\xb6\x3a\x81\xd0\x03\x75\x5f\xe5\x19\x09\xf8\x94\xcb\xad\x71\xcc\x97\xfb\x4f\xa5\x57\xed\x9d\x8b\xd6\xe8\xfa\x30\x78\x54\x54\x39\x91\x1f\x87\xb3\x0f\xe3\xdb\x99\xc3\x90\xc8\xf1\x3b\xd0\xcd\xfd\xeb\x70\x74\x99\x04\x5a\xcb\x82\x44\x93\x03\x81\xe5\x2e\x95\x61\xfb\xc2\x47\x65\x95\x93\x6f\xd0\x54\x1e\x5d\xca\xd1\x78\x34\x1c\xbd\x9b\x0c\x47\xef\x41\xb1\xf8\x2b\xc2\xca\x02\x44\x91\x6f\x3e\x4d\x86\xef\x3f\xcc\xe4\x87\xf1\xd5\xe5\x00\xd4\x96\x65\x4b\x6d\x19\x64\x9a\x13\xc9\x8a\xc9\x2c\x1c\x1c\x4a\x0d\x07\x8a\xc4\xbd\x91\xec\xf5\xa1\xfa\x79\xfc\x2e\x90\x27\x06\x25\xe2\x50\x73\x38\x71\x9a\xc3\xef\x26\xe3\xeb\x84\xe4\x86\x6d\x9b\x50\xd6\x78\x34\xc0\xa7\xd8\xa1\x96\xd1\x8c\x8c\x27\xf0\x77\x10\x25\xe6\xb6\x5c\x0e\x7a\x57\xc3\xd1\xfb\xa9\xfd\x72\xf8\x61\x4a\xf5\xf9\x94\x4c\xad\x32\xbd\x56\xf5\x67\x82\x23\xed\x9f\x3d\xd6\x5e\xb7\xd3\xc3\x20\xb4\x1c\x32\xf6\xba\x6e\x08\x06\x41\xa4\x55\x0b\xbb\xa3\x37\xc8\x3d\x16\x84\x9f\xdd\x1a\xab\x6a\x79\xe9\xf7\x2b\xf0\x2e\xbb\x83\x90\x4b\xe7\x13\xc1\xa4\x28\x9b\x3a\xc7\x52\x23\x3a\xd1\x53\x39\xcb\x1b\xd2\x52\x74\x6d\xa4\xbc\xe4\xfe\x31\x0d\x30\x14\x63\xaa\x45\x0e\x59\xbc\x58\xe6\x0f\x6e\x20\xd5\x60\x74\x36\x5f\x6b\x43\xd4\xea\x21\x07\xdf\xde\x16\xf8\xaf\x36\xed\xbe\xe9\x27\x7d\xda\xef\x9f\xbe\xfd\x74\x3a\xea\x9f\x8e\x2e\x4f\x9f\xfd\x2a\x7e\xc0\xe3\xf6\xff\xf3\x8b\x17\x67\x17\x6d\xff\xff\xc5\xc5\xef\xfa\x4f\xbf\xc9\x4f\xbf\xd6\xb8\xbb\xec\x15\x6b\x6f\x8f\x5e\xe3\x62\x90\xa7\xa3\xaa\xec\x3b\xd5\xcd\xd3\x51\x05\x9b\xd1\xc8\x67\xe9\x99\xbc\x2d\xed\xf5\xaf\x33\xd9\x9f\x0c\x7a\xb3\xe1\x8f\x03\xd1\x1f\x5f\x5f\x8f\x47\x53\xd9\x1f\x4f\x6e\xc6\x13\xa0\x6a\xb0\xe7\xbe\x3d\x06\x7a\xf2\xaa\xf7\x51\xbe\x1b\x4e\xae\xe1\x84\xbd\x1c\x0f\xf0\xf7\x74\x27\xc8\xab\xc1\xfb\xde\x95\x64\x0d\xf8\x54\x44\xfc\x0f\xac\x99\x4e\x98\x1c\xff\x6d\x78\xf3\x00\xce\xca\xd9\x6c\x3c\x19\x0d\x3e\x9d\xf6\xaf\x86\xf6\x94\x9e\x0c\xae\xe0\xfd\xd3\x0f\xc3\x9b\x54\x70\x0b\x25\xb7\x90\x5e\x3b\xc5\xe7\x0e\x47\xef\xc6\x93\x6b\x6c\x2f\xd0\x4d\xd8\x1b\xea\x74\x38\x3d\x92\x6f\x7b\xd3\xe1\x34\x95\xed\xef\x8b\xeb\xde\x5f\xa1\x09\xe1\x75\x33\x19\xbc\xef\x4d\xe0\x6a\x02\x99\xff\xe0\x99\x7c\xf1\x25\xd8\x77\x52\xec\x9f\xfa\x93\x1f\xae\x23\xbe\x18\x26\x83\xe9\xed\xd5\x8c\x4f\x74\x39\x9c\x4d\xed\x19\x9d\x3a\x3f\x03\x2f\xd6\x8f\xe3\xc9\x5f\xe5\x71\x6f\x2a\x2f\x07\xef\x86\xa3\xc1\xa5\x7c\x3b\xb8\x1a\x7f\x3c\x89\xee\x59\x86\x33\x0d\xe4\x6c\x30\xb9\x9e\xba\x71\xdc\xeb\x4e\xac\xf7\x25\x8f\x8f\xfa\xfd\x9b\xab\x23\x7b\x2d\x1c\xd1\xef\x8e\x4e\x52\xe9\x5e\x8b\xef\x98\x0d\xfa\xf6\xde\x7d\xfb\x29\xb8\xfd\x7a\xa3\xcb\xa7\xe3\x89\xc0\xcb\xa4\x77\x73\x73\x35\xec\xc3\x1d\x78\xd5\xfb\x98\xc2\x25\xe8\x24\xf0\xe9\x51\xf8\xc9\xd9\x07\x3b\x85\x53\xba\x51\x87\xff\x16\xb4\x7d\x38\x15\xdc\xac\xe8\x9e\xb5\xcb\x09\xdb\xf1\x61\xf8\xd6\x1a\x00\xa9\x10\x6f\x3f\xc9\xc1\x4f\x83\x49\x1f\xef\x43\xfb\x3a\xf8\xec\xd4\xd9\x06\xf6\x8d\x6e\x74\x3e\x0c\x26\x83\x44\x7e\x1a\xdf\xca\x5e\xbf\x3f\xb8\x81\xc6\xcb\xde\xfb\xc9\x60\x20\x67\x63\xf1\x76\x20\xdf\x8e\x6f\x47\xd0\xbf\xfd\x11\xa4\x26\xa5\xfc\xe4\xc1\x4f\x33\xbb\xea\xa2\x55\x7a\xdd\xfb\x64\xad\x80\xfe\x78\x34\x1d\x5e\x0e\x26\x83\x4b\x31\x1b\xdb\x5f\xf4\xc2\xeb\xfc\xc3\x80\x3e\x3f\x9e\xc8\xf7\x76\x25\x4d\xa1\x45\xf6\xf7\xd4\x76\xfb\xe1\x1e\xcc\xb0\x6d\x30\xdd\xea\xf0\x44\xe4\x42\x19\xbf\xb3\xdf\x98\x50\x27\x7a\xa3\x3e\x0c\xf0\xf4\xb6\xff\x81\xda\x6c\xbb\xe5\xc9\x55\x9c\x9c\x4d\xa0\x12\x26\x84\x4a\xe5\x51\x2f\x53\x9b\x86\x34\xae\xa8\x10\x35\x64\xbb\xdd\x6e\x28\x47\x81\xf6\x69\x55\xc7\xbf\xc1\x62\x1e\x04\xea\x85\xa6\xb4\x7d\x82\xe1\xea\x1e\xfb\x48\xae\x0c\x45\xdd\x22\xf7\xce\xa4\x6d\x97\x27\x12\x90\xb5\x77\x58\x5e\x54\x2d\xad\xfd\x9a\x2f\xbc\xbb\x0b\x35\x55\xde\xde\x55\xb2\xc8\xed\x2f\xea\x1d\x00\x44\xad\x9d\xd1\xe4\x0b\x7a\x92\x35\x0a\x56\x55\x89\x89\x66\xb4\x10\x1c\x94\x16\x1c\x34\xd6\x6e\x5e\xe4\xa5\x5e\xab\xc6\x7e\x70\xb3\xca\x17\x41\xfb\x4c\x8c\x3b\x85\x0a\x6c\x7b\xfb\x3b\xe2\x37\xb4\xb1\x31\x34\x5a\xeb\x85\x32\x4d\x82\x7d\xb5\x1f\xa5\x22\x68\x78\x9c\xce\x02\xe3\x1e\xf9\x60\x90\x45\xb7\xd6\x8b\xea\xae\xcc\xff\x43\xcd\x8b\xdd\x3e\x3f\x81\x47\xff\x87\xa1\x51\x15\xe8\x90\xf9\x5c\xb4\x11\x4a\xf6\x49\xd6\x99\x6d\x17\x0e\xc0\xfa\x84\xaa\x2a\xa5\x9f\x73\x97\xf3\x66\xe5\x18\xc2\x6e\x38\x69\x36\x10\x38\x80\x74\xaf\x75\x0e\x18\x85\x9c\x55\xdb\x79\x93\x30\x5f\x30\x0f\x03\x14\xef\xc0\x7c\x91\x48\x75\x12\x0e\xb9\x08\xa7\x03\x81\x11\x66\x57\x2e\x56\x75\x55\x12\x79\x27\x7b\x15\xf8\x30\xe4\x93\xcf\x90\x99\x2e\x22\xe1\xbf\xb7\xa6\x64\xbe\x56\x77\x5a\x1e\x1f\xc1\x33\xf2\xf2\xee\xe8\xc4\xd1\x52\xfc\xe2\xce\x0a\x31\x4f\xe5\x91\x1f\x42\xbf\x23\x16\x7e\x58\x41\x44\xf4\xc0\x9a\xf3\x4b\x5e\xe8\x72\xb1\x5b\x14\xd5\x46\x67\xb9\x22\xfe\xeb\xb2\x59\x91\x02\x31\xd7\xc6\xf3\xd8\x98\xc4\x0f\x0d\x2c\xb9\x79\x5d\xa9\xcc\xae\x26\x83\x59\x67\xa4\x7a\x00\x3b\x18\x0a\x99\x30\x6e\xb3\x56\x4d\xa3\xeb\x90\xb2\x0b\x3f\xe2\xb3\xcb\x2c\x58\x75\x7e\xbc\x3c\x21\xd4\xb3\x80\xc5\x9b\x20\xb1\xbb\x32\x7e\xd8\x8d\xe6\x2e\x22\x5b\xb7\xdb\x86\xf4\x81\x1c\x40\xce\x0d\xc6\x9f\xfc\xaa\x13\x91\xdb\x0c\xf2\xe2\x98\x04\xdf\xdf\x27\xbe\x0e\x9f\x64\x3d\x0c\x01\xe0\x1b\xa8\xe6\xf4\xf5\x2d\xb8\x33\x02\xb2\x86\x30\xaf\x8c\xdd\x75\xe5\x0d\x04\xa3\x45\x75\x11\x6a\x14\xc4\xd0\xf4\x46\xd5\x0a\x31\xe1\x32\x2f\x33\xbd\xd1\x65\x86\x20\x1b\x3b\x46\xe8\x0f\x38\x96\x38\x6a\x29\xb3\x6a\x00\x32\xd6\x18\xbd\x9e\x17\xae\x96\x3d\x90\x4c\x17\x0f\xab\x0a\x69\xdd\x3a\xf7\xa1\xfc\xee\x7d\x28\x8e\x03\x2d\x42\x48\xd6\x9e\xb4\x57\x6b\x17\x45\xf8\x22\x95\x47\xae\x78\x5a\xf3\x72\x75\xcc\x65\xae\x16\x24\xd6\x66\x8f\xea\x9a\x30\x7c\xb6\xc9\x31\x81\xee\xa6\xaa\x59\xd5\x40\xb2\x61\x14\xe2\x4a\x68\x8d\xc1\xc9\x86\x6c\xc7\x10\xa3\x35\xab\x7c\x93\x0a\x91\xa5\x41\x9c\x36\xd0\x85\xf3\x05\x95\x49\xf0\x67\x3b\x5d\x65\x03\x90\xed\x1a\xff\xe4\x58\x87\x81\x38\xe4\xd8\x9c\x08\xd7\x90\xaf\xe8\x84\xa4\x42\xe8\x34\x08\x23\xf7\x20\xc0\x4c\x6d\x70\x8a\x5c\x0b\x45\x95\x5a\x8f\x5d\x17\xcd\xca\xae\xe5\x6f\x6f\xf0\xc3\xaa\x72\x6a\xfa\xae\xb9\x55\x2d\xf3\xa5\x2c\xab\xe0\x49\xee\x4b\x48\xa6\x3c\xd7\x8e\x75\xc8\xde\x0f\x6e\x5e\xcc\x4a\xd7\x6f\xe8\x5e\x72\x79\x76\x79\x9c\x9f\x88\xbd\x4e\x84\x17\x19\x9c\xcd\x8b\x06\xb4\xa0\xac\x8f\x0d\x61\x2a\x38\x84\x73\x18\x01\x38\xb3\x6b\x84\x97\x0b\xc2\xe5\x03\xca\x8b\x00\xe5\x8b\x06\xbf\x67\x6f\xe2\x22\xbf\xd7\x75\x82\xb0\x80\x7c\x0d\x38\x4f\xbb\x31\x13\xac\xae\xde\xd4\xba\x89\xd0\xc4\x82\xda\xf1\xc8\x79\x08\x7d\xff\xc2\x50\x63\x44\x47\x54\xc5\xe7\xa2\xaa\xf5\x1b\x79\x9c\xe7\x27\xac\x83\x12\x74\x8e\x0f\x42\x1c\x1a\xcc\x2a\xd6\x14\xd5\xf6\x20\x35\x80\xf3\x41\x25\x24\x8d\xad\xed\xcd\x32\xaf\x4d\x23\x96\xf9\x17\x02\xb6\x98\x6a\x5b\x66\x66\x7f\xd0\xdc\x82\xc6\x0f\xbc\x41\xf5\xbb\xe3\xdc\x37\x08\x46\xdb\xee\x88\xe0\x24\xa6\x8d\x73\xa7\xdc\x85\x85\x64\x20\x94\x0a\xc5\x57\xba\xcf\xa7\x42\x2c\x53\x79\x84\xba\x99\x7e\x4b\xb8\xb1\xa2\x68\x79\x34\x5e\xb8\xfe\xa3\x9c\x82\xd3\x1b\x8b\x84\x02\xbd\x29\xc1\x61\x11\x28\x04\x51\x74\x7c\xef\x68\xdc\x9a\x40\x98\x82\x5f\x9c\x08\x03\xd4\x34\xf9\xd2\x5a\x3a\x70\xd2\x53\x0b\x32\xd0\xe2\x4f\xbc\xb4\x1c\xd9\x35\x54\xd8\x0f\xc3\xc6\xc4\xff\x70\x76\xbb\x89\x0d\x6a\x65\xb2\xfc\x2e\x6f\x14\x40\xd7\xd7\xa1\x01\x38\xaf\x2a\x6b\x0f\xa8\xf5\x66\x55\xe8\xc6\xdb\x8d\x5c\x2c\xf4\x06\x88\xef\x40\xea\x2c\x11\x54\x94\x90\x48\xa3\xeb\x35\x71\xbc\xbb\x2b\x50\x86\xba\x03\xa5\xb2\xdf\xb0\x5f\xce\x6a\xb5\x56\x0d\xda\x8a\xfc\xe7\xea\x94\xcc\x11\x48\x40\xd9\x4f\x2d\x56\x55\xad\x9d\xa1\xf7\x40\x5b\x56\xdb\xf5\xdd\xa8\xbc\x64\xf8\x66\xb6\x5d\xcf\xa5\x59\x55\x0f\x6f\x02\x93\x06\xea\xef\x0c\xd6\x98\xb6\x23\xf9\x0f\x55\x0d\xeb\x68\xcf\x96\xc4\x0b\xa2\xa2\x0b\x86\xee\x15\x10\x12\x68\x48\x1c\xd2\x08\x5f\x8e\x36\xdf\x21\x5c\x0b\x2a\x45\x55\xa9\x8a\xea\xae\xda\x22\xf3\x40\xf8\xdc\xdd\x1b\x36\x01\xad\x31\x56\xab\x07\xd8\xc0\x1b\x95\x97\x58\x37\xa7\xea\xc5\x2a\x6f\x68\x34\xa5\x59\x6c\x8b\x0d\xfe\x51\x97\x77\xb5\xba\x77\x4a\xad\xcd\x2a\x78\xde\x66\x55\xed\x35\x5b\x3c\xd2\x6c\xf9\x2d\xcd\xf6\x0f\xdd\xbd\x11\xbe\xcd\x4c\xbd\xa2\xea\xe6\x0d\xa8\xd2\x16\xc5\xd6\x34\x35\xf9\x04\x6b\xb5\x81\xc3\xa7\x4c\xa4\xf9\xac\x9b\x05\x8c\x74\xb3\xaa\xb5\x3e\xcd\xf2\x35\xa2\xaf\x38\xa9\x88\xe6\x21\x72\xba\xdc\xd1\xcc\xee\x12\xd9\x54\x1b\xf7\xe7\x70\x34\xc0\x7c\xb2\xeb\x7f\x01\x8b\x26\x38\x14\x6c\xf3\xdc\xe6\x7d\x13\x1e\x44\x6f\x88\x99\x2b\x2f\x9c\x99\xca\x72\x97\x08\x88\x83\xf2\x7e\x44\xe4\x6d\xea\xaa\x01\x4e\x34\xa1\x0c\x31\x3d\x41\x74\x10\xae\x61\x5c\x84\x50\x10\x88\x1a\xba\xf8\x76\x1e\xc0\x7b\x55\xe7\x1a\x2f\x99\x45\x5e\x2f\xb6\xc6\x7d\xa0\x16\x5d\xef\x8a\x15\x84\x43\xd3\xe2\xf0\x89\x9c\x0a\x71\x97\xca\xa3\x4f\xd5\xd6\x19\xb7\x11\xef\x81\xbf\xab\xf4\x17\x5d\x2f\x20\x6c\x2b\xa1\x07\xa6\x43\x2d\xd3\xda\x41\x50\x9b\x05\xbc\x77\xb5\xbe\xcf\xab\xad\x29\x76\x44\xe9\x41\xf7\x62\xe7\xbd\xdd\x66\x36\x10\x91\x8f\xc9\x8f\x75\xfa\x04\xb4\xd4\x42\xd9\x7d\xe7\x22\xb1\xe1\x01\x44\x77\xd8\x68\x2d\x0e\x36\x59\x66\xda\x6c\x72\x60\x63\xe3\x06\x33\x03\x09\x20\xda\x57\xa9\x3c\x42\xcc\x7c\xb1\x93\x37\x38\xfe\x81\x61\xc5\x57\x1e\x99\x52\xb5\x5e\xe4\x4d\x9c\x7e\x61\xb7\x18\xf9\xc7\x20\x7d\x05\xe4\x81\x6d\x1b\xcc\x3a\x20\xfb\x4f\x49\x22\xf2\x2a\x2c\x25\x87\x6d\x15\xd6\x23\xce\x77\xf2\x21\xc7\xb5\x6c\xff\x0f\x98\x1a\xff\x79\x7c\x26\x9f\xc3\xa1\x97\xf1\x86\x4d\x43\x71\xc8\x34\xfc\xc8\xb6\x71\x9b\xf1\x6a\xad\xd7\xf3\x20\xbd\x46\x1f\x5f\xab\x9d\xf0\xec\x2f\x86\x43\xf5\xa4\xbc\x89\x65\x22\x70\xc5\x34\xee\xaf\x7e\xad\x01\xa6\xa7\x32\x48\x59\x63\x6d\xf1\x37\x22\x18\x60\x6f\x89\x46\x0d\x3c\x30\x3a\xae\x62\xc4\x8f\x38\x94\x36\x45\xdf\xe5\xb6\x07\x23\x12\x4e\x5a\x98\x7d\x9b\xef\x5a\xe3\x28\xc2\x93\x02\xc8\x2c\xf8\xa8\x20\xf8\x93\xff\xbb\x6b\x79\xd4\x56\xf7\x6c\x61\xf2\x3b\x3b\xcf\x6c\x9b\xd4\x32\xe7\x7a\xc5\x3c\x95\x47\x13\x06\x52\xb5\xad\xf9\x38\x29\xfb\xc8\x0b\x9c\x8a\x70\x60\x12\xcc\x77\xf8\x3e\xfb\xba\xfb\xdc\xd8\x9d\x5e\x6b\xe2\xb6\xf0\x83\x87\x79\x0c\x00\x80\x7e\x51\xce\x13\x0c\x54\x97\x05\xff\xc3\xc1\x81\x33\x4d\x55\xab\x3b\x36\xe5\xf8\x30\x6c\x1b\x5f\x3e\x2c\x63\xef\xda\xc0\x62\xf0\x37\x3d\x38\xa3\x75\x55\xda\x55\xa6\xb3\x7c\xbb\x46\x8e\xd6\x77\x2a\xaf\xe5\xa5\x56\xc0\xd8\x36\x81\x4d\x0e\xb4\x5b\x2b\xc7\xdb\x19\x5a\x49\x31\xff\x48\xad\xed\xb8\x26\x68\x2a\x81\x5f\xed\x64\x36\xa9\x30\xd7\x20\xff\x1d\xac\x5f\x9f\xd8\xb1\x1f\xc4\xe3\x84\xca\x79\xf1\x03\x7e\x78\x8d\x00\x33\x97\x60\xb2\x21\x27\x07\xe7\xdd\x91\x74\xce\x9e\xd1\xa5\xf3\x0a\xf7\x12\x48\x34\x5c\x76\xe1\xe2\xb9\xe5\xff\xa9\x50\x0f\x41\x0c\x2c\x62\x7c\x33\x48\xe4\xca\x7d\x7e\x5f\xab\xb2\x49\xe5\xb4\x0b\xda\xd1\x05\x95\x08\x05\xb8\xf8\x24\x15\x88\x1f\x90\x80\x1f\x30\x50\xb5\x08\x37\x56\x91\x3d\xe4\x99\x4e\x18\x84\x70\x6a\x07\x2b\x91\x65\x55\x9e\x3a\xae\x1e\x08\xf9\x6c\x34\xc4\x02\x8e\x19\x64\x93\x31\xcd\x03\xeb\x0b\xfb\x0e\xb8\x2e\x9e\x78\xa2\x4f\x7f\x8c\xfb\x55\x09\x25\x44\xfe\x78\x35\xcc\x16\x00\x31\x8d\xd7\x10\xca\x6c\x2a\xe9\x36\x4f\xb0\x36\xa1\x24\xdd\xcb\x03\x07\x01\xa6\xa6\x8a\xe2\x0a\xde\x65\x27\xe8\x7b\xe7\x03\xed\xbb\x23\x5d\x5f\xa7\xb5\xea\xbe\x8d\xee\x04\x04\x93\x9a\xca\x93\x9b\xe1\x51\xd8\xbe\x5b\xc2\x06\xb9\x7a\xf3\xbd\x57\x88\xe0\xf1\x94\x95\x45\x48\x37\x0d\x0e\x59\xea\x3c\x6e\xe8\x43\x16\x05\x6c\x1d\xd4\x55\x47\x96\x4a\xc3\x22\x3e\xb2\xac\x1e\xe4\xe7\xb2\x7a\x28\xed\xda\xb5\xf3\xad\x96\x8d\xae\x65\x86\xaa\x5a\xc8\x4e\x10\xbd\x22\x44\x8c\xe0\xa2\xe4\x93\x69\x5f\x32\x16\x8c\x9f\x5a\x7b\xc2\xf3\x62\x17\x4b\x13\x76\x4f\x30\xad\xef\xbd\x46\x63\xc9\xab\x37\x75\x1c\x6c\xa8\xac\xf8\xcb\xdc\x16\x1f\x52\x31\xd1\x26\xf8\xd3\xf1\xf2\x24\xb1\x43\xc2\x96\x81\xb5\x58\xc8\xaa\x28\x68\xa5\xa3\x1d\xe6\xcc\x09\xdb\x01\xda\x08\xb5\x36\xba\xbe\x8f\x38\x22\x40\x58\x3e\xae\xc0\x0f\x3b\x63\x34\x90\xd5\x36\xab\x30\x0a\xf7\xfc\x38\x3b\x41\x82\xe4\x09\xd7\x03\x54\x25\x71\x9b\x38\xa5\x07\x6a\x49\xf0\xb5\x67\x34\x11\xb9\x09\x5a\xbc\x56\x99\x16\x01\x80\xcb\x0e\x17\x37\x85\xf9\xb6\x1d\xae\xa7\x0e\x5e\x87\x9b\x85\x2b\x91\x83\xd5\x59\xd5\x8f\x2c\x4e\xe0\xc6\xd9\x8f\xc5\x88\x28\x16\xe3\x09\x71\x79\xb1\x38\xae\x53\x44\xcc\xac\x34\xf3\x98\x4a\xc7\x63\x3a\xe4\x60\x48\x2d\x8e\x6f\x27\xc3\x13\x94\x6f\xdd\xb7\x15\xad\x47\xba\x8b\x94\xf9\xa0\x61\xf6\x95\xdd\x9d\x10\xd4\x89\x34\xa2\x67\xaa\x90\xb4\xab\xc6\xa2\x24\x24\x61\xa6\xde\x94\x61\xf8\x4b\x05\x22\xcc\x07\x55\xfa\xb8\x53\x01\xff\x3e\x82\x8f\x16\xf9\x26\xf7\x91\x53\x67\xc8\x38\xf3\x34\x58\x29\x3c\xe1\x2c\xa1\xee\xbf\xdc\x19\xfa\xd2\xad\xd1\x56\x3b\x81\xaa\xf2\x73\x4f\x94\x8c\x2f\x0c\xa6\xe3\xb3\xd6\x1b\x02\x3d\x23\xdb\x47\x48\x1e\x15\x95\xc0\x3b\x85\x31\x3a\x00\xa9\x3c\x85\x10\x50\xb6\x09\x01\xf5\xc9\x57\xe6\x45\x3c\xbe\xb8\x52\xf9\x71\xa5\xcb\x47\x26\x30\x5c\x85\x02\x0f\xf3\x70\x26\x83\x09\x74\x0a\xda\x78\xe2\x40\x94\xdd\x7a\xec\x6b\xad\xcc\xb6\xd6\xd1\xdc\x8a\xbd\xb9\x0d\xa7\x4f\x1d\x98\x3c\xb8\xf1\x3f\x61\x21\xda\xdf\x77\x16\x67\x76\xd4\xfd\x09\xa1\x22\x10\xed\x63\xb7\x4e\x18\x64\x46\xd0\x3d\x4c\xa0\x93\xaa\xa3\x82\xca\xd6\xed\x24\x15\x14\xd0\x3a\xef\x09\xaf\x9e\xc6\xe8\x62\x49\x1c\x6d\x40\x06\x4d\x27\x8b\x68\x41\x43\xe3\xd8\xab\x1c\x2e\x61\x4c\x30\x0a\xda\x6a\x10\xe4\x09\x19\x6d\x5b\x57\x6b\x80\x36\xba\xc3\x95\x97\x66\xd2\xf2\xa2\x37\xb5\x5a\x34\x68\x1b\x24\xb2\xd6\x6b\x7b\xee\xb9\xb6\xfa\xc7\xc3\xc3\x16\xb5\xce\xf2\x46\x82\x9f\x88\x5a\xbb\xf6\xe4\xf3\x43\xb9\x38\x49\xf8\x1f\xb5\x41\x8d\x90\x79\x7c\x18\xb8\x6b\x08\x52\x7c\x4b\xd9\x3d\xa1\x9f\x00\x2f\xd9\x3e\x8e\x05\x89\x3a\x90\xe0\x2b\xd3\xf7\x6d\xea\x7c\xad\xea\x1c\xf8\x29\xc9\xf4\x5c\x22\xa9\x49\xc0\x96\xfe\x80\x6c\x68\x8c\xb0\x10\x2a\xbb\x57\x65\x03\x76\xb3\x75\x69\xf2\x7b\x05\xe4\x5a\xa5\x6e\x50\xd7\x7d\xbd\xd1\xa5\xa1\x42\xb5\x19\xd6\xe0\xad\x98\xe0\xca\x2f\x51\x36\x10\x7d\x8d\xbd\x0b\xd5\xcc\x9d\xcb\xb4\xf4\xf6\x76\x5e\xe8\x53\xb3\xc2\x22\xaf\x88\x25\x02\x75\xfa\xca\xaa\x11\x71\xca\x02\xd7\xc7\xb7\xf7\x4b\x86\xfd\x12\x8f\xf6\x2b\xc2\xa8\x7a\x0e\xa9\x8d\xda\x39\x39\x40\xc0\x3b\xe2\x57\x45\xf8\xd5\x43\x86\x75\x38\x48\x7b\x23\x82\xc9\x13\x5a\xbf\x97\x01\xb6\xf7\xf1\x5b\xb0\x8e\xac\x44\xbf\x8a\xb9\xb2\x45\xf1\x6a\xf3\x8c\x35\xb0\x9d\x36\xdb\xda\x6c\xa1\xf4\xb8\x92\xe1\x5e\x4f\xf6\x8e\xe6\x76\x85\xaf\x71\x79\x20\x97\x6f\xa7\x91\x4a\x28\x7f\x17\xba\xf1\xe8\x2a\x81\x49\x0b\xd3\xfd\x09\xc9\x57\xc5\xb6\xc9\x8b\xfc\x3f\xf2\xf2\xee\xb5\x3c\xce\x4f\x7c\x01\x4e\x1b\x32\x8a\xe9\x13\x79\x6c\x97\xa1\xd1\xdb\xac\x2a\x77\x6b\xe0\x66\xf4\x26\xfb\x89\xc8\x97\x48\x01\x9a\x13\x4b\xe5\x53\x4c\x7a\x74\x3d\x88\xfe\xd5\x6d\x7b\xc7\x17\xcf\xd4\xd0\xc4\xef\x53\xd5\x8e\xc8\xfd\x58\xa7\x77\x69\x22\x95\x34\x9b\x0a\xbe\x93\x73\x5e\xcd\xa1\xb1\xa1\x2a\x11\xa2\x54\x89\xfc\x5b\xb5\xad\x4b\x55\x9c\x20\x7a\xda\x63\x98\xe4\xf1\x51\x80\x68\x92\x37\xf8\xf4\x23\x88\xef\x73\x73\x9e\xec\xab\xf3\x27\x3e\xe0\x8e\x44\x58\x5c\x55\xcd\x68\x7b\x37\xe2\x94\x61\x0a\x87\x12\x0c\xe1\x76\x87\xde\x08\xc8\x73\xc0\x29\x0a\xb0\xc4\x28\xcb\xed\x87\xf2\x0d\xe5\x1f\xe2\xf3\xd0\xbd\x70\x17\x1d\x8d\x70\xf5\xdc\x4e\x86\x38\x37\x25\xc9\x69\xfa\x71\x0e\xc4\x3c\x91\xea\xda\x03\x1c\xdd\xfe\xc0\x1b\x15\x17\xae\x80\xa6\xdf\x4e\x86\x32\xb8\x3e\x02\x26\x99\xbd\xfa\x89\x8a\xd9\x67\xd0\xef\xf6\x1c\xf8\xec\xf3\xa1\x05\x02\x1c\xab\x78\x4c\x87\x67\x34\xdc\x22\xe1\x41\xcd\x0e\x4c\xbe\x26\xce\x4e\xba\xe2\xca\x9d\x08\x87\x1c\x8e\xda\x37\xee\xa8\xf0\x54\xdb\x11\x91\xbc\xcf\x25\x85\xf7\x91\x6a\x84\x92\xeb\xbc\xcc\xd7\xdb\x35\xce\x14\x35\x0c\x31\x9e\x9b\x8d\x56\x35\x0e\x27\xff\x03\xd0\x13\xc1\x96\x2c\x3d\xc9\x12\x55\xb0\xd8\x05\x12\x5d\xaa\xf6\xeb\x2c\x93\xa4\x3c\x4b\x05\x09\x29\xc1\x03\x8d\xcb\xee\xf1\xa5\xa1\x1a\x59\x68\x65\x1a\xeb\x2f\xf9\x22\x6d\x85\x99\x22\xfe\x12\xef\xff\x76\xde\xdb\x37\xa6\x03\xa5\x21\x3c\x4a\x83\x2f\x3c\x34\xe1\xc9\x40\xfc\xda\xa4\xb4\x92\xcf\x20\xd1\x13\x6c\xa7\x96\xd8\xb9\x6e\x80\xc0\x8c\xaa\x8c\xcb\x2c\x41\x92\x03\x17\x40\xfe\x54\x6d\x39\x86\x22\xf6\x43\xb2\x7b\x66\x1d\x73\x23\x60\xf2\x90\xff\xa6\x8c\xd1\x75\xc3\x8c\x7d\x10\xfa\x12\xad\x73\x3f\xe1\x43\x03\x2a\x8c\x20\x96\x9d\x55\xb5\x41\x14\x03\x79\x45\xad\x23\x2a\x88\x7a\xd0\x61\xd5\x71\x6c\x80\x1d\x11\xd0\x01\x41\x85\xbf\x6d\x34\x5a\x32\x35\x93\xba\xb9\x6d\x25\x38\x2f\x84\xc0\x0a\x44\x22\x24\x3e\x8c\x0d\x88\x65\x87\x5f\xf6\x41\xed\xee\xf3\x38\x11\xde\x29\x3d\xd8\x46\x84\x78\x49\x29\xb3\xc7\x40\x3b\xaf\x21\xca\x38\xaa\xca\xd3\x07\x95\xdf\xc3\xae\xea\x57\xeb\xcd\xb6\x30\x55\xed\x8b\x2c\xa6\x8b\xff\x97\xbd\x7f\x5b\x6e\x23\xc9\xd6\x04\xe1\x7b\x7f\x0a\xff\x69\xfd\x8f\xc8\x9a\x60\x88\xa4\x4e\x95\xa9\xb6\xb6\x81\x48\x48\x42\x6e\x10\x60\x01\x60\xaa\x34\x37\x5d\x0e\xc0\x41\x44\x29\x10\x81\x0c\x8f\x20\x13\xfb\x6a\xde\xa1\x5f\x20\x2f\xb7\xf6\x3c\xc1\x58\xdf\x25\x6d\x5e\x64\x9e\x64\xcc\xd7\xc1\x0f\x01\x80\x54\x1e\x2a\xab\xf7\xb4\x78\x91\xa6\x24\x23\x3c\xfc\xb8\x7c\x1d\xbf\x6f\xa9\x01\x75\xb3\x47\x80\x05\xf2\xef\x4d\x95\x99\x39\x99\x90\x2e\xb5\x43\x44\xce\x00\xca\x8f\x20\xf7\x10\xc6\xf4\x31\x8b\x00\x80\xee\x6b\x55\x37\x75\x89\x31\x89\x99\xff\xa6\x13\x23\xc2\xc0\x57\xe5\x4c\x15\x94\x2d\x61\xbb\xc8\x31\x72\x37\x03\x64\x8b\x3b\x30\x02\xf4\x3b\x6d\xf5\x02\x25\x9a\xef\x0a\x63\x8d\x39\x95\x6f\xba\xc1\x15\xdc\xa9\xf5\x6d\x6f\xd2\xd7\x42\x64\x59\x2a\x3f\xfc\x0e\xb3\x06\xf6\xcc\xef\x35\x6b\x12\x67\x4d\x50\x6a\xc1\x6f\x99\x32\x19\x4f\x99\xf8\xad\x53\x66\x85\x29\x9c\x0e\x67\x30\xf1\x1d\xc9\x1e\x1f\x07\x8f\xc9\x09\x59\x78\x92\x70\x96\x32\x13\xa8\xa4\x90\xdd\x54\x94\x45\xa8\x34\x87\x88\x8e\xf8\x75\x7f\xa5\x4c\x8f\x7c\x88\x19\x1a\x80\x89\x31\x72\xd7\x86\x15\xbf\x6d\xea\xd9\xdd\x97\xd9\xfd\xf1\x7d\x99\x37\xc8\x77\xb9\xb5\x2b\x26\x7b\x97\x64\x7f\x87\x12\xe7\xaf\x8b\xe2\x26\x56\x6c\x91\x08\x46\x14\x4e\xc7\x4a\xe2\x3e\x80\xc9\x78\x10\xb5\x41\x7e\x35\xce\x5e\x82\xf2\xc2\x19\x04\x1a\xd1\x4f\x3d\xb7\x97\xa2\xa9\x75\x65\xe4\xad\xeb\x7d\x7b\x90\x26\x91\xb7\x99\x42\xdb\x99\x5e\x4f\x28\xce\xf3\x1b\x76\x88\x60\xab\xe9\xd7\x6f\x83\x08\xd8\x53\x6c\x6f\x03\x4c\x10\x22\xc4\x59\x15\xb6\x45\x90\xa5\x01\x5e\x29\xdd\x10\x6e\x0e\x6d\xa7\x9c\x6f\x35\x4a\x7b\x61\x1c\xd1\x36\xfd\x4a\x42\x7b\xde\x3b\x8e\x93\x47\x9c\x1b\xde\xa9\x4d\x48\x2b\xd3\x0d\x9b\xe3\xf8\x79\x87\x77\x55\x6c\x76\x1b\x1f\x8e\xba\xad\xac\xea\x44\xac\xac\xaa\x0f\x97\x0d\x81\xa0\xda\xab\x40\x7d\x62\xf5\x61\xae\xab\xf2\x46\xc1\xae\x56\x2e\x3d\xc4\xa5\x58\x86\x1e\x07\x14\xf0\x88\x48\x35\xd5\x72\x5d\xe9\xbf\x37\xf3\x0c\xa6\xbc\x5d\xae\x83\xb7\xd4\x13\x23\x97\x65\x81\xd3\x56\xe9\x75\x53\x73\x48\x55\x4a\xf9\x22\x85\x19\xd1\x86\x2b\x6b\x4c\x22\x3f\x78\x47\x92\x3d\xaa\x17\xce\xcb\x24\xc4\xf5\xa0\x0f\x25\x60\x5c\xee\x24\x2f\xaf\x27\xd7\x9d\x7e\xff\x23\x66\x6a\xbb\xf4\x6c\xa8\xe4\xea\x42\xdd\xd2\x87\x51\x6f\xd2\x1b\xbc\x4b\x7c\x62\xf5\xf0\xed\xdb\xee\x68\xec\xd3\xe6\x21\xb9\x1f\x59\x25\x39\x8f\x7f\xd4\xbd\x1a\x75\xc7\xdd\xc1\xa4\x43\x14\x94\xa3\x56\x25\x19\x97\xa5\xc9\xf3\xe1\xe0\xbc\x3b\x1a\xf4\x06\xef\x5c\x83\xae\x54\x2d\x91\xae\x50\x6d\x3c\xe9\x4c\xae\x27\xc3\xd1\xc7\x56\xb5\x96\x2b\x60\xf3\xd5\x6f\x50\xc1\x06\xdf\x4d\x44\xfc\xd1\x49\x6f\xd2\xef\x26\xae\x8a\xad\xd7\xaa\x62\x93\xfb\xaa\xd8\x92\x76\x09\x5b\x22\xa8\xda\xab\xf3\x66\xdc\xa5\x14\xf1\x7e\x07\x72\xd6\x83\xda\xaf\xb7\xdd\xf3\xc9\x38\x91\x9d\xf3\xf3\xeb\x51\xe7\xfc\x63\xc2\x25\x62\x38\x35\xf8\x16\x35\x20\x86\x6f\x65\x77\x34\x1a\x8e\xc6\x89\xe4\xaa\xb5\xe1\x08\x8a\x32\x2e\x7a\xe3\xf3\xe1\xf7\xdd\x51\xe7\x4d\xbf\x9b\xca\xf1\xf0\xb2\x2b\xbf\xbb\x1e\xf5\xc6\x17\xbd\x73\x9c\xdb\x8b\x21\x96\x84\xf4\xfb\xc3\x0f\xb6\x7d\xd1\xfd\xeb\x79\xff\x7a\x4c\x95\x1e\x34\x83\xc1\xf4\x27\x72\x3c\xc4\x84\x76\xff\xe0\x65\xe7\x23\x36\x72\x75\xd5\xff\x28\x27\x43\xf9\x71\x78\x8d\xdc\x7a\x7d\x1f\xeb\x2c\xad\x81\x47\x2e\xbd\xd4\xbe\xdc\xbd\x9a\xb4\x32\xf6\x47\xdd\xbf\x5c\xf7\x46\xb8\x8f\xe2\x7a\x85\x44\x84\x55\x7f\x1f\x7a\xfd\xbe\xdf\x50\xbe\xb8\x0f\xbf\x8c\x55\x23\x1f\xa9\x8a\x65\xf2\xbe\x6b\xd7\x9d\xeb\xfe\xc6\x57\xdd\xf3\x5e\xa7\x6f\xdb\x3b\xef\x5d\xd8\x2d\xd6\x4f\x20\x87\xbf\xfb\x97\xeb\xee\x60\x62\xff\x24\xaf\xae\x07\x3d\xa8\xc8\x18\x8e\x64\xf7\xaf\xdd\xcb\xab\x7e\x67\xf4\xd1\x55\x84\x70\x85\x1f\xd6\xf6\x6d\x15\x45\xb8\x2a\x3e\x5f\x57\x91\x40\xb7\x65\xef\xad\xef\xf3\xfb\xce\x58\xbe\xe9\x76\x07\xb2\x73\xf1\x7d\x6f\xdc\xbd\xe0\xc7\xaf\x86\xe3\x31\x6d\x2c\xc1\x85\x03\xf4\x61\x3c\xb1\xaf\x52\x39\x01\x54\x2e\x8c\xa4\x0b\x95\xc6\xe0\xaf\x51\xcc\xd8\xcb\xf8\xa5\xae\x34\x31\x4c\x67\x50\xd7\x8b\x4d\x00\xe6\x6c\x09\x39\x59\x00\xd8\x0e\xce\x41\x2b\xd1\xa6\x15\x64\xee\xc6\xf7\xc6\x3e\x6f\xa3\x4f\xc8\x0c\x13\x31\x29\x09\x05\xaa\xc8\x29\x5d\x24\x90\x93\xde\x73\xbb\xcb\xf0\x70\xf6\x23\x27\xe9\x0a\xe4\x87\x82\x6c\x67\x72\xa8\x1b\x3f\x8a\xb9\xf7\x52\x81\x1e\x93\xed\xee\x11\x15\x09\x8a\xac\xc0\xea\x66\x28\x61\xcf\x42\xf2\x28\x7b\xcb\x71\xf3\x29\xdf\x57\x46\x9e\x26\xf2\x2c\x91\x2f\x12\xf9\x32\x91\xaf\xb0\xfe\xfb\xcf\xd0\x35\x61\x9a\xea\x36\xbb\xf5\xe1\x0a\x5a\x97\x1d\xe9\xb0\xd3\xad\xe0\x2f\x9a\x65\xbb\x42\xc0\x09\x65\x06\xc6\xa1\x27\xf2\xbf\x89\x38\x92\x2b\xbf\x34\x92\xcb\x9a\x89\xbd\x45\x8e\x20\x38\x6f\x07\x0d\x65\xfd\x4c\xf2\x43\x84\x1b\x8f\x68\x43\x95\xb6\xc6\x71\x10\x7a\xc5\x15\xdc\xc2\xd5\xe5\xfd\x02\xde\x0a\x53\x97\xeb\x2d\x58\x64\xf2\x9d\x61\x9c\xbf\xce\xac\xce\xb6\xe5\x43\x20\xaa\x55\xa6\xe4\xd2\x5b\xe9\xdb\xd0\x45\x48\xe5\xcb\xea\xe5\xbc\x52\x77\xb1\xb2\x7b\x18\x56\x8a\x88\x88\xb5\x92\x7d\x81\xe0\x5d\xcc\x02\x77\x35\x38\x67\x92\x2d\x05\xa9\x75\x02\x38\x26\x73\xc4\xfc\xa7\x51\x68\x8c\x1c\x14\x59\xd1\x40\x71\x3c\x6c\xb8\x45\x59\x51\xe6\x0d\x46\x46\x18\xa5\xdd\x6f\x64\xe1\x43\xe8\xc8\xb8\xc1\x9c\x96\x97\x99\x99\xe9\x3c\x57\x85\x2e\x1b\x2c\x11\xea\xda\x03\x6a\x27\xed\x0b\x43\x35\xce\x55\x1a\xf9\x5f\x44\xac\x59\x2d\x98\x13\x3f\x8e\x97\xa9\x30\x0b\x20\x08\x3e\xfa\x84\x4f\x74\xcf\xb5\x32\x19\x94\xd9\xb9\x91\xc9\x77\xbf\x7d\xf0\xf1\x98\xf4\x16\x9c\x2a\x7b\x9b\x99\x1d\x87\x09\xf3\x47\x6e\x55\x9e\x41\xde\x4c\x53\xe8\x02\x26\x16\xb9\x3f\x10\x78\xd7\xb3\xfe\xa2\xf6\x57\x7b\xe7\xb9\x54\x38\xf7\xb6\x67\xd0\x88\x4b\x20\xa7\x56\x5a\x31\x43\x2b\x32\x00\x0e\x1d\x01\x38\x76\x0a\xc1\x16\x26\x44\x53\x61\x42\xc8\x8c\x93\x7c\xc0\x65\x43\x8e\x54\x8e\xe8\x81\x9e\xbb\xd2\x45\x4d\xe9\xb8\x7e\xbc\xd8\x55\xa8\x5c\xa2\x3c\x44\x76\x23\x93\x9b\x8c\x9c\x90\x2e\x74\x2f\xa2\x90\xbf\x6f\x08\xe7\x08\xf6\x9b\x9f\x22\x74\xb1\x0f\x4a\x18\x09\xe5\x6a\xed\x99\x68\xd7\x91\xb9\xed\xe9\x9c\xac\x58\x62\xaa\xa7\x3b\x42\x00\xc2\x3e\xaf\x2b\x6d\x68\xe8\x07\x3c\x5d\x39\x10\xfe\xa2\xf6\xed\x05\xca\x3d\x80\x76\x64\x37\x05\xb2\x9a\xf0\x44\x6d\xc8\x41\x8a\x7c\x97\xe4\x1d\xdd\xdd\x2a\xd6\x39\x44\x97\x60\x58\xf3\x51\x3b\x3a\x07\xe9\x66\x5c\x4e\x75\x7d\xa7\x89\xb7\x88\xd7\x05\x90\x4c\x5a\x9c\x4e\xb0\xcd\x99\x22\x0c\x04\x30\xd8\x8b\x15\xb3\xfe\x05\xd0\x28\x59\x71\x63\x12\xff\x09\x83\x79\x4c\x91\x6e\xbd\x93\x36\x0a\x3e\x01\x72\x8c\x7c\xc3\xfc\x1d\xef\x34\xb6\xb3\x26\xc8\xf7\x32\x85\x74\x31\xca\x30\x0b\x60\xff\xdc\x22\x52\xf4\x18\x48\x7a\xc0\xfb\xc9\x2c\xe7\x71\x0a\x1e\x5f\xbf\xad\x99\x0b\xc0\xc1\x1c\xd6\x61\xe8\x33\x5b\x35\x70\xf1\xb0\x8b\xcc\x0d\x57\x44\xe1\x53\x74\x88\x41\xf3\x60\xe6\x4d\xf6\x18\x9d\x9e\x38\xba\x55\x3a\x05\x4e\x6e\x5d\xcc\x30\xb5\xa3\x95\xdb\x6a\xa7\x7f\x5e\xa9\x05\x34\xc3\x01\x14\x27\x9e\x33\x08\x33\xbb\xf3\xfb\x46\x57\x85\x96\xe7\x65\x61\xed\xf1\xd0\x83\x7a\xe5\xb3\xba\xca\x85\xec\x07\xe9\xff\xb2\xc3\x99\xb9\x98\x36\x79\xa8\x8c\x54\x88\xe6\x69\x45\xde\x58\xaf\x6b\xb0\xdf\xe5\xd9\x9f\x13\x79\xfa\xcd\xab\x6f\x10\xfc\x53\x8e\xca\x95\x16\xc1\x97\xca\x85\x3c\xfd\xe6\xe5\x29\xfe\xf1\x43\xef\x6a\x18\x40\xfd\x4e\x2a\xad\x50\xc8\x9c\x7e\xf3\xcd\xcb\xe0\x91\xab\x20\x0b\x12\xc4\xe9\x95\x2f\x40\x8b\x5f\x72\x73\x77\x5d\xd8\x13\x61\x00\x96\x85\xdb\x0f\xba\x71\x08\xb1\x56\x48\x1f\x12\x65\x21\xbf\x6b\xf2\x8d\x3c\x7b\x0e\x3d\x3f\x3d\x82\xb5\x31\x6e\x75\x08\x41\x27\x5c\x0a\x30\x52\xe9\xba\x22\x0d\x82\x91\xd1\x45\xe8\x47\x8b\xeb\xca\xfa\x91\x0a\x60\x0f\x8b\x29\x1b\xd2\x1f\xa6\x9a\xc5\xd1\x3c\x66\xf2\xc2\x88\x46\x65\x0f\x48\x89\x18\xeb\xc1\xae\xa6\xf5\x74\x91\x88\x40\xdf\xb1\x5a\x5b\x8d\x73\xe3\x5f\xe0\xf2\x9c\x40\x15\x2a\x18\xbe\x26\x57\x77\x8e\x56\xde\xb1\x60\x99\x26\xab\xc1\x21\xbb\x6b\xa7\x8a\x9d\x1a\x55\xae\xee\x7c\xb5\x6a\x70\x18\x83\x5c\xa6\x6d\x27\x8b\x70\x77\x46\x8b\x64\xcf\x67\x33\x3a\x81\xcb\x91\x5d\x5f\x9c\x17\x4c\xee\x6b\xd1\xbe\x15\xdb\x34\xa4\x51\x36\x85\xc3\x10\xc7\xeb\x35\xca\xc4\x8e\xef\xcb\x54\x88\x2d\x18\x02\x84\xcf\xd9\xf1\x07\xfa\xac\xf2\x62\x7b\xfb\x62\xb4\x77\x53\xcc\x3d\x74\xb7\x54\xb5\x29\x41\xbf\xdb\x13\x26\xc6\x40\xd5\xd6\xe7\xc2\xaa\x3d\x4f\x12\x83\x3e\x7f\xc1\xa4\x15\x1b\x49\x66\x0c\x56\x22\xd5\x4b\x5d\x56\x1b\xe7\x6a\x66\x12\x18\xdf\x87\xe4\xe1\x2c\xdd\xdf\xce\x33\x13\x8f\xb1\x45\x6b\xb1\xa5\x8b\x53\x96\x58\xa5\x6f\x4a\xf8\xbf\xbb\x52\x1e\x9e\x1d\x49\xb8\x65\xa1\x2a\x55\x64\x8b\xed\x99\xb1\xda\xac\xcf\x43\xf3\xb5\x6c\xec\xb6\x22\x65\xcc\x49\x68\x67\x12\x26\xc2\xa9\x47\x60\x65\xd9\x7f\x04\xf2\xa0\x9c\xe6\xd9\x8d\xcf\x2e\xe6\xf7\x53\x21\xc8\x7b\xe7\xb1\xa3\x31\xcd\x2d\x28\xe3\x25\x8a\xfe\x10\xca\x9c\xf3\xec\x55\x90\x91\xed\x31\xd7\x43\x65\xfb\xfc\xfc\xca\xda\xe6\xed\x71\xba\x48\x28\x46\xd9\xb2\x7f\x45\x4b\xa4\x41\x37\x27\x7a\xeb\x38\x7c\x4d\x76\x2b\xe3\xe3\xc8\x83\x76\x6b\x07\x5c\x48\xee\xd8\x22\xdc\xb3\x40\xc4\x73\x53\x42\x44\x71\x7b\x17\xfa\x2b\x31\x0e\x1a\xb1\xaa\xb3\xe3\xad\x14\xa1\xad\xbc\x6f\x9c\xed\x04\x54\x88\xda\xd6\x68\xfb\xf5\x27\x10\xc4\x3c\x9e\x35\x15\x18\x59\xbe\xa3\x8d\x51\x37\x5a\x02\x8d\x45\x9e\x15\x14\x15\x23\xef\x28\x97\x30\xc2\xcd\x95\xd5\x46\xde\xe9\x29\xb0\x91\x47\x05\x83\x90\x0b\xe1\x6b\x0f\xc0\x0b\xc0\x09\x13\x98\xe5\x63\xcd\x0c\xbb\x82\xd9\xea\xe1\xda\x73\x14\x49\xbe\x6f\x41\x86\xa3\x5f\x38\xac\xd4\x70\x91\xd8\x48\xff\xdf\x9a\x6a\x1a\x08\xa0\x51\x43\x3a\x8b\x35\xdc\x90\xb0\x60\x46\xcf\xce\x68\x7e\xcb\xea\xe6\xe9\x7f\x10\x98\x9f\xbd\x3f\xe9\xd3\x77\x57\xfd\xe3\xf3\xf3\x7f\x24\x04\xe8\x23\xf8\x9f\xcf\x5e\xbd\x7a\xde\xc6\xff\x39\xf9\x8a\xff\xfb\xc7\xfc\xbc\xbb\xea\xcb\xf3\x12\x99\xbb\xec\xa1\xb1\xc7\x20\xab\xc1\x68\xf9\x3e\x04\xaa\x7c\x83\xe4\x09\x8b\x2c\xa7\x34\x31\x72\x36\x90\xa8\x5d\x57\xa5\xd1\x33\x4c\x6e\xe7\x6b\x10\x6a\x72\xf4\x9c\x9f\xcf\x55\xb6\x8a\x20\xf0\x95\xbc\xd0\x0b\x5d\x40\x0c\xb2\x03\x47\xf6\x28\xae\xac\x68\x39\xb8\x94\x3c\x2f\x6f\x21\x01\xcd\x5d\xf6\x77\x58\xe9\x93\xd5\x98\x8f\x89\x1c\xda\x21\x87\x45\x50\xc8\x76\xf8\x64\x53\x36\x4f\x8e\xac\x0a\xd8\x10\x75\x98\xa3\x9c\xa6\xb4\xc2\xa8\x75\xba\x15\x39\x77\x3a\x50\x0d\x2b\x7d\xa3\x40\x89\x94\xb3\xa6\xd2\x54\x1c\x03\x84\xad\x35\x19\xd8\x56\x89\xa5\xd2\x34\x3b\xc1\x0c\xf9\xf9\x2c\x95\x1d\x83\x88\x68\xf6\x36\x4c\x9c\x11\x21\x9f\x84\x62\x89\x18\x39\x9c\x5f\x84\xa1\xce\xb6\x7a\x88\xc5\xd0\xac\xdc\x22\xb1\x0f\xe9\x17\xc0\xbf\x23\x67\xe0\x38\xb3\x17\xac\xab\x6d\xdb\x76\x25\x40\xae\x4a\x44\x24\xc5\x85\x5b\x21\x29\x66\x0c\x6f\x86\xee\x2b\x1a\xf3\x5c\x1e\xaa\x23\x3f\x41\x2a\xcf\x37\x89\x23\x04\x2c\xec\x15\x5b\x67\x79\x2b\x7f\x88\x9a\x09\xf3\x3a\x80\x2d\x11\xde\xf6\x0e\x2a\x13\x75\x0c\xb5\xbb\xc3\xe9\x11\xdc\x6a\xaa\xd0\x45\x6d\x3f\x95\xed\x46\x21\x04\xa6\x3a\x98\xc4\xa2\xac\xb3\x05\x12\x48\xd0\x15\xed\xa7\x03\x4a\xa2\x56\x7a\x2b\xa5\x8b\xee\xd9\xba\x94\x2f\x4f\xe4\x5c\x6d\x8c\xc4\xca\x08\xf8\x92\x36\x86\xa3\x5a\x97\x65\xa5\x4b\x98\xf3\xdf\x36\x85\xc1\x88\xf6\x0e\x08\xc6\x91\xe1\xa4\x7c\xf9\x48\x28\x8b\x1e\x49\x50\xb0\x36\x1e\x2f\xd8\x00\x76\x95\x1c\xe6\x9e\x4d\x64\xef\x7e\x41\x27\xb0\x3d\xe5\x77\x65\xf5\xe9\x88\xb3\x72\x01\xf9\x22\xee\x2e\xae\x16\x6c\xc3\x86\xf2\x8f\x7d\xab\x6e\x76\x9f\x45\xb3\x0b\x73\x08\xdd\x59\xbb\xc4\x6b\xec\x54\x2a\xc4\x07\xed\x79\xf2\x33\x13\x8a\x2a\xb2\x5b\xaa\x4a\xdf\x96\x94\x34\x6c\xbf\x3d\xcd\x8a\x39\xfb\x7c\x42\xa7\x9d\xba\x51\x76\xde\x65\x43\x88\x2c\x06\x1c\x42\x58\x55\x07\xb8\x2a\x50\xcb\x58\xe2\x09\x64\x02\x79\x54\x51\x53\x66\xb4\xe1\x22\x8a\x83\xd6\xa1\x0c\x8b\xfc\xf7\x73\x8d\x25\x4e\x26\x9c\x01\xed\xd8\xed\x19\x19\xf5\xf6\x95\xbe\x36\x46\x57\x8f\xbf\x99\x9e\xca\xc3\x3e\xbc\x9c\x9e\x1e\xb9\xca\x0a\x68\x21\x9b\x82\x77\xe1\x0b\x3e\xde\xe7\xaf\x5b\x29\xa1\x4c\xa0\xc1\x91\x7b\xec\x6d\xa5\x75\x40\x3f\x52\x36\x44\xfb\x93\x0a\x71\xd0\x16\xe0\x1e\x29\x67\xff\x15\x00\x7b\xe5\x83\x96\x53\xa4\x5c\xa1\xa5\x40\x30\x5a\x89\xb6\x38\xfa\x7d\x15\x23\x3a\xee\x68\x04\x16\x40\xd5\x9e\x18\x86\x19\xf2\xd4\xc2\x5e\x51\x48\x73\x7d\xf0\xc1\xad\x06\xe3\xc2\xa0\xcf\xba\xf4\x54\x7f\x95\x86\x5a\x7e\x08\x84\x3b\xa3\x1f\x00\x57\xc1\x9c\x80\x1c\x99\xe0\x10\x20\x9b\x53\x50\xe7\xd8\x4c\x4d\x36\xcf\x14\xd1\x9b\x40\x7e\x05\x97\x98\x05\x9f\x23\xaf\xd7\x1d\xc3\x23\x79\xd5\x97\x48\x02\x1f\x84\xe1\x1b\x2f\x55\xa5\x3b\x79\xf6\x49\xcb\xe7\xe9\x89\xec\x15\xb5\xae\xbc\x6f\x81\x8f\xa5\x55\x52\xcd\x1e\x2d\x95\x63\x4c\x4f\xa7\x9b\x63\xa3\x9e\x3e\x4f\x4f\x9e\x1e\xa1\xe6\x9a\x3e\xed\x5f\x5d\xfd\x83\x01\xe0\x1f\xd6\xff\xce\x4e\xcf\x4e\xda\xfa\xdf\xd9\xcb\x97\xaf\xbe\xea\x7f\x7f\xc4\xcf\x43\x2c\x71\x42\x00\x23\x57\xa0\x07\x02\x8f\xda\xf1\xc9\xb3\xe3\x93\xd3\xc0\xf9\x67\x7f\x49\xc4\xd6\xdc\x92\x10\xdd\x5b\x5d\x01\x85\x6c\x16\xe6\x67\x11\x16\x2b\x88\xdd\x80\xcd\xf0\x56\x57\x53\x55\x67\xab\xa8\xba\x39\x20\xe2\x64\x34\x56\xac\x6f\x89\x78\xfd\xd8\x1f\x84\x6c\xde\xa9\x10\x57\x95\x56\xab\x69\xae\x89\x53\xec\x81\xf1\xc9\x43\x3b\xbe\x23\xbe\x19\xf9\x24\x51\xdc\xda\xf9\x16\xa7\xca\x68\xb1\x83\xc3\x32\xa6\xc7\x04\xd5\xce\xf3\xd7\x43\x41\xaa\xe3\xae\x88\xb9\x13\x67\xda\xe5\xd4\x39\x7e\x1e\x87\xc8\x7d\x97\x99\x65\xcc\xf5\x98\x0a\xd1\xab\x9d\x81\xed\x14\x8a\x7c\x03\x2e\x44\x10\x23\x4c\x48\xe9\x9a\xcb\x8c\xb4\xfd\x65\x2f\x83\xa3\x4e\x52\x34\x90\xb5\x9a\x7d\xb2\x56\x3c\xb2\x28\x05\x4c\x1d\x8c\xd8\xdb\xee\xa0\xe7\xee\x45\xd0\x09\xc7\x77\x29\xea\xd2\x7e\x2a\xdd\xc3\x11\x59\x6f\x51\x42\x46\x73\x48\x94\xa5\xe8\x07\x7a\x88\x1e\xf2\x26\xbb\xdd\xcf\x0d\x99\x78\xc4\x2e\x42\x87\x73\x0e\x7d\xd1\x76\x7e\x09\xd1\x91\xf5\x66\x0d\x75\x61\xcc\xe4\xc8\xd9\x4d\x8e\xb2\xd1\xd4\x9b\x47\x29\x1b\x5b\x5c\x6a\xaa\x68\x81\x8d\xef\xa5\x6b\xa4\xd8\x25\xd3\x2d\x3e\xb2\x47\x2f\x82\x26\x41\xd7\x3a\x9f\x74\x06\x40\x8e\x58\xcd\x96\x90\xcb\x08\xb5\xf3\x95\x9e\xc1\x25\xb6\x52\xb3\xaa\x34\x4f\x81\x57\xf1\xa9\xdd\xb9\x8e\x50\xf1\x35\xfb\xaa\x42\x5a\xc4\x56\x19\x5a\xf2\xc5\x8c\x8f\xbb\xd8\x0f\x03\xe2\xee\x2d\xc6\x43\x3e\xd1\x3b\x39\x0e\x21\x4d\xfa\x5b\x21\x1e\x61\x39\x74\xbb\xfb\x6f\xb4\x46\x4f\x1e\x60\x35\x14\x7b\x58\x0d\x65\x8b\xd5\x70\x52\x4a\xa3\x35\x6c\x19\xbf\x23\x12\xf8\x1d\x0f\x06\x95\x19\x3b\x87\x24\x15\x66\xaa\xaa\x32\x8a\xf5\x6d\x51\xf1\xb1\x7b\x12\xa8\x6f\x61\x1d\xa2\x2d\xcf\x7c\x34\x2e\x48\x8d\xf9\xa8\x10\xb7\x08\x25\xcf\x4e\x02\xc0\x6d\x56\x50\x88\xd9\xf0\x1e\x0b\x73\x63\xa8\x01\xfb\x06\x9c\x2e\x67\x44\x72\xb4\xd8\x31\xa0\xd6\x3b\x28\xee\x90\x57\x1c\x47\x1f\x9e\xd1\xb0\x82\x78\x9b\x04\xaf\x45\x6f\xe7\x43\x8c\x02\xc4\x21\x0f\x3d\x03\xbd\x5a\x17\xa6\x61\xc1\xa7\x7c\x43\x00\x66\x82\xb5\x3d\x31\xe3\x2d\x82\xef\xe4\xba\xd6\x21\x42\x20\x17\x9c\xc6\x34\x89\xe0\x7f\x04\x60\x11\x3d\xfb\xd4\xde\x8a\x1c\xe0\xc3\x7d\x0a\x37\x51\xa9\x0d\x04\x3c\x99\x60\x1a\xdf\xc3\x92\x56\x64\x8c\x2d\xa2\x2f\x20\xa9\x63\x5d\xa9\x68\x42\x20\xc6\xb3\x29\x1b\x31\x2f\x5d\x4b\x94\x7d\x59\xb7\xe9\xdd\x5c\x58\x1f\x4c\x36\x58\xab\x64\x27\x19\xb5\x70\xa2\x74\x07\xe1\x74\xd8\xa7\x2d\xbe\x69\xd9\xe6\x9b\x16\x5c\xf5\x61\x2f\x11\xe3\xb3\xac\x90\x73\x01\xee\xfa\xc7\x48\xa7\x25\x93\x4e\x8b\x1d\xa4\xd3\x28\x85\xf2\xcd\xaf\x66\x9f\x0e\x87\xf3\x25\xe4\xd3\x0f\x2b\x2f\x5f\x40\xd1\x0e\x8b\xd0\x29\xe6\x21\xe5\xe2\x5b\xa8\xee\x03\xee\x92\x20\x69\xd7\xae\x99\x7d\xf0\x32\x38\x26\xbf\x81\x1e\x9e\x7b\xc0\xdc\x07\xbe\x29\x18\x99\x2b\x7c\x74\x01\x2c\xbb\x1a\xc1\xf4\x6c\xd5\xcb\xee\xce\x45\x86\xe8\x1a\x67\x3d\xdf\x2d\x75\x11\x56\x77\xd6\x5c\x41\x4c\xa9\x11\xc9\x6e\x5a\x7e\xca\x90\x32\x22\x5c\x9d\xbf\x29\x7b\x8c\x9f\x78\xdc\x33\xee\x27\x45\xfb\x3e\x65\xc5\xdc\x91\x0c\x7b\x80\x30\x2a\xda\xc9\xf4\x3c\xc0\x31\xc2\x4d\x15\x63\x28\x24\x2e\xf8\x0a\x19\x01\x3e\x45\xb8\x5c\xc8\x95\xae\x66\x4b\x55\xd4\x9c\x39\xa3\x8a\xb9\x58\x64\x75\xa1\x8d\x4b\x20\xf7\x5e\x17\x0a\x0e\x51\xbd\x2c\xe6\x65\x54\x99\x81\x4a\x6a\x9a\xc2\x1f\x1a\xc5\xed\xc4\x40\xb5\x84\x13\xe4\x37\x24\x28\x17\x9b\xb2\x49\xe5\x18\x77\x7d\x38\x25\x76\x9e\xb4\x9c\x6b\x2a\x41\x27\x92\x1b\x63\x9a\x15\x56\x88\xcf\x4a\xe3\x08\x8b\x3d\x08\x06\x56\x17\xc2\x2c\x54\x7a\xad\x32\xca\x34\xa9\x2a\x47\xba\xdf\x2b\xec\x46\xc0\xfc\x7e\x72\xaa\x85\xe5\x5a\x71\xe2\x39\x84\x97\x30\xa1\x1d\x00\x4f\x5c\xda\x0b\x64\x0f\xee\x5a\xdf\xc4\x41\x1b\x53\xc0\xdb\xdf\x20\xcc\x41\x6e\xf5\x2d\x17\x0c\x46\xb8\x06\xb1\xb5\x1f\xa3\xf8\xa8\x1d\xba\x7d\x82\xe2\x92\xa1\xc5\xbc\x33\xb8\x29\x7e\x41\x70\x13\x4a\xcc\x68\x9b\x51\xbd\x55\xc8\x24\x6c\x25\x0d\x3e\x90\x15\xbc\x43\x90\x15\x26\x5a\xad\xc3\x08\xc1\xa3\xb5\xfb\x64\x5e\x1a\x28\xed\x03\x7c\x37\x18\x47\xad\xc8\xdb\x5a\xe9\xc2\x11\xc3\xcf\x66\x0d\x58\xfa\x10\xba\x33\x46\x1b\x69\xac\x39\xc9\xa4\xe2\xe4\x97\x98\x6e\x44\xbd\xcc\xaa\xb9\xcb\xfc\x51\x58\x20\x6c\x9a\x9c\x18\x4e\x17\x2a\xcb\x01\x94\x2e\xbe\xc7\xea\x52\xa2\x63\x9e\x22\x74\xaa\xd8\x30\x74\x27\xf1\xbe\x1f\x79\xb5\x1c\x54\x31\xf2\x13\x3a\x88\x20\x0c\x4b\xba\x1a\x64\x35\x87\xb4\x0c\x5a\x6a\x81\x6c\xbc\x2e\xfd\x0c\x5a\xa0\xc9\x4e\x45\x04\xc2\x1f\x4b\x3a\x21\x46\xba\xcd\x55\xda\x14\xcc\xe0\x87\x7a\x47\x66\xd8\x24\x6b\xb1\x0e\x79\xa2\x61\xe0\x6e\x87\x34\xb2\x66\xbd\x7d\x41\xb6\xe6\x02\x92\x14\x42\x6b\xab\x57\x84\xc7\x1c\x6e\x4a\x76\xbc\xb5\x6e\x92\xa5\xe2\xf2\xd7\x98\xfc\xc6\xa1\x70\xb7\x09\x9a\x64\xb6\x10\x2d\xfe\x8f\xb8\x94\xd3\xc3\xe6\x6e\x69\x76\x0f\x8f\xc2\xa5\x69\xee\x24\xe4\x0d\x38\xa0\x85\xb7\x9b\x66\xe4\x5f\xe4\xd2\x4c\x6f\xc8\xa0\xb6\xc1\xde\x5b\xd4\x78\x40\x9d\x70\x05\xa7\xd8\x02\x98\x0d\xf6\x0f\x65\x01\xfc\x56\xab\x75\xae\xb2\xe2\xff\xb7\xbb\xbb\xbc\x8c\xcc\x62\x0c\xbf\x43\x54\x4c\x5e\xda\x56\x7a\xc8\x64\xa9\x85\x13\x03\x2e\x1f\x5c\xd3\xd9\x9c\x95\x73\xf2\x86\x47\xe2\x02\xa0\x24\x69\x83\xf8\xbb\xdd\x85\x5b\x44\x0b\xaa\xe6\x4f\x44\xe3\xcd\xaf\xc0\x58\xc9\x4d\x8e\xae\xc6\x6d\x1b\xc4\x07\x80\x7d\x9a\xc2\xa2\xac\xa6\xd9\x5c\x64\x75\x2a\xc7\x1a\x5c\xcb\x9a\xf0\xb0\xa9\x17\x07\x31\xf9\x72\xd6\xd2\xa7\x0f\x52\xdb\x97\x8f\x30\xeb\x60\x86\xba\x8f\x4d\x31\x40\x86\x16\xff\x27\x1d\xb1\x3e\x59\x51\x5c\xbb\x90\x88\x7b\xc5\x07\x3f\x84\x51\x1b\x07\xc3\x52\xa8\x15\x6c\xcb\x08\xbe\x63\x9e\xca\x0e\xe7\x24\xc7\x27\x6d\x07\xb3\x93\x60\x5d\x30\x4a\x3f\xc6\xb1\x9b\xad\x15\x0f\x28\xaa\x13\xa6\xc2\xa1\xb6\x09\x87\x5e\x30\xf4\xc6\x2a\x09\x16\xcb\x8e\x9f\xa2\x59\xe4\x2a\x76\xc7\x82\x37\xca\xd6\xb1\x6e\xb3\xb3\xf3\x6c\x12\x44\x83\xfd\xf2\xdf\x38\x95\x84\x1c\x3c\xf6\xe5\xe2\xe6\x49\x5b\x05\xb7\x5a\x7a\xae\xc1\x0d\x42\x59\x1f\x54\x46\xe6\xa6\x97\x26\x30\x3c\xb7\x3e\xf9\x6a\x63\x6a\x8d\x9f\x6f\xd1\x83\xfb\xfc\xaa\x42\xfe\x4d\x57\x15\xa6\x55\x96\x55\x2d\x09\x8d\xf6\x89\x34\x04\xee\x02\x7f\xe5\x8c\x01\x81\x4f\xe1\xfd\xb1\xf7\xa2\x25\xb8\x61\x97\x7a\x49\x6d\x6a\x0e\xd2\xd0\xff\x0b\x5e\x54\x5e\x6a\x06\x19\x69\x73\x8c\xb7\x04\x4c\xe2\xfa\x86\xbd\x01\x85\x88\xf8\xab\xed\x5c\xac\xac\xb9\xe7\xee\xa7\x68\xc9\xd6\xce\xc4\xa4\x47\x2a\xca\x0c\xf3\xb0\x1e\x70\x69\x84\x7f\x67\xfa\xaf\x70\x3f\xba\x25\x55\xb3\x4f\x45\x79\x97\xeb\x39\xb1\xb5\x12\xce\x13\x6c\x30\x4f\xff\xd8\x16\xa8\xec\x99\x20\x3c\x68\x37\x60\x64\xbc\xe6\xa6\x73\x13\x99\x86\x90\x8f\x53\x3c\x44\x96\x0d\x4a\x4e\x4e\x7e\xf3\x5b\x9d\x6f\x04\x73\xfe\x9b\x66\xb1\xc8\x00\x09\x39\xc2\x2f\xe0\x79\xa4\x54\x9f\xca\xb9\xaf\xa2\x1e\xc9\x99\x2a\xc4\x54\x87\xf0\x0c\xfa\xc7\xb5\x9b\xaf\xa9\x96\xac\x11\x21\x4b\xa2\xdd\x54\x9e\xca\x21\xe8\x32\x99\xb1\xa1\x8e\x8d\x79\x2f\xce\x21\xc1\xae\x44\xdc\x3b\x1b\xa9\xe4\xf5\xa8\x8f\x61\x12\x48\xb0\x71\x0e\x44\xec\x80\x80\xab\x86\x38\x73\x79\xac\x6e\x30\xe4\x25\xdb\x65\x3c\x1f\x92\xd2\x0e\xe1\x3a\x9c\x48\x51\x72\xaa\x65\x30\x03\xde\xfd\x0a\x0c\x21\x4c\x65\xb0\x54\x6b\x08\xff\x84\xee\xa2\xa3\x9d\xe7\x2c\x06\x65\x64\xbf\x23\x96\xef\x63\x7d\x04\x52\x8f\x94\x45\x82\x86\x1e\x46\xaa\x69\x37\xbb\xbc\x3d\x1f\xa1\x27\x99\x4a\xb4\xec\x86\xba\xec\x9d\x1f\x08\x04\x55\x10\x42\x24\x34\x29\xc6\xce\xbd\x19\x3f\x17\x0e\xb1\x6a\xec\x07\xbd\xdc\xcb\x1d\x7b\xe4\x31\xb2\xf1\x13\x00\x56\x40\x08\x9f\x15\xe6\x89\x55\x31\x4d\xad\x72\x0a\x78\x42\xb7\x8f\xbe\x8d\x2e\x66\x9f\xfd\xec\x37\x3a\xa9\x48\x53\x3d\x53\x64\xae\x6f\x9c\xc6\xd0\xbe\xed\x42\x88\x49\xe4\x43\x25\x74\x44\x54\xb0\xeb\xe0\x4c\xee\xed\xea\x62\xfe\x44\x1e\xa2\x21\xbd\x28\x8b\x1a\xd9\x07\xe8\x02\xdc\xd5\x67\x55\x69\xc1\xb7\x30\x01\x45\xb5\x13\xb7\x41\x1e\x70\x56\x85\xbd\x25\xd0\xc2\x83\x3b\x1b\x1c\x3f\x18\xfa\x02\xfd\x40\x40\xd8\xd1\xc5\xc3\x6c\x17\x0c\x83\x8e\xad\x2b\xb4\x7a\x54\x5d\xeb\xd5\x1a\xd1\xfd\x08\x66\xb6\x29\x5a\xef\xa4\x92\x73\x1f\x62\x99\x61\x28\x73\xde\x45\x08\x76\xaa\x82\x04\x4a\x0b\xe1\xdf\xf0\x0a\x7b\x68\xe2\x66\x8b\x9b\x27\xf2\x70\x56\x16\x8b\xec\x86\xcb\xa1\x76\x4d\x18\x55\xe4\x13\x45\x80\x08\x5d\xc2\x7e\x32\xb4\x32\x48\xb7\xe8\xdb\xe2\x2b\x0b\x6f\x2a\x38\x3b\x91\x52\x0a\x49\x9e\x8b\x1b\xc8\xc3\x4b\x6b\xfd\x23\x5f\xb7\xe0\x77\xdc\x11\xae\xe0\xd8\x84\x41\x47\x00\xf8\xfb\x3f\x59\x93\x05\x2b\xb0\xcb\xa0\x50\x98\xb7\x0f\xaa\x1b\x3c\x13\x01\x14\x64\xe8\x05\xe4\xf9\x0d\x4f\xf3\xba\x2a\x97\xd9\xd4\xea\x3c\x76\x29\x97\xba\x98\x69\x76\x6e\x81\xc7\x57\xb0\x85\xdf\xac\xe7\x0a\x7d\x0f\x0e\xc4\xb6\x5e\x96\xf3\x84\xec\x22\x70\x3f\x92\x24\xce\xec\x39\x99\x95\x56\xe7\x40\x0d\x61\x06\x25\xc8\xb0\xdf\xad\xb8\x31\x75\x2c\xf8\x55\xbd\xcb\x75\x97\xfe\x66\xa7\x4d\x60\x06\x0d\x86\x93\xee\x98\x1a\x84\xf4\x84\xa9\xce\x33\x7d\xab\xdd\xd5\x61\x34\xeb\x6f\x50\xa3\x81\x9e\x2f\x2b\xa4\x41\x72\x59\x33\xbd\x5c\xe1\xff\x53\x41\x4d\x0c\x9f\xc9\x84\x22\x90\xc0\x08\x1b\xd0\x61\xf2\x3b\x48\x4d\xe7\xd8\xa5\x94\x59\x8e\x21\x01\x97\x49\x6e\xfc\x9d\xef\x8a\xee\xf0\xe0\x80\xd9\x87\x94\x0e\x37\x15\xbb\x3f\x2a\x9d\x67\x41\x41\x52\x74\x1b\x91\xb5\x81\xcb\x28\x8c\xd6\x72\x59\xde\xe1\x91\x5c\xc2\xa0\xe1\x72\xb8\x29\x55\xce\x5f\x56\xf3\xa5\x0e\x1c\xf0\xed\xc9\x80\xbc\xa3\x4a\xab\x39\x82\xc3\x72\x60\xe0\x97\xec\xe9\x05\x64\x6b\xdc\xdc\x68\xc3\x90\xa8\x6f\x48\x6e\xb2\xf3\xa6\xac\x42\x3f\x91\x03\x03\x73\xbf\x83\xda\x18\x74\xc4\xc2\x41\xb3\xf6\xd5\x27\xfa\x56\xe2\x9d\x8c\x2e\xb0\x29\xe7\x7a\x5d\xe9\x99\xe2\x52\x9f\xb6\x32\x5d\x94\xc5\xb1\xd3\x32\x03\x2d\x0d\xa0\xca\xca\x02\x06\x5e\x2e\x68\x2c\x50\x01\xc7\xde\x90\x7c\x13\xc8\x41\x97\x3b\x00\xba\xc1\xdc\x45\x15\x56\x80\x37\x8a\x96\x7a\xf0\x65\x3c\x85\x6d\x18\x8c\x7a\xe7\x81\x65\x33\x95\xe7\x7b\x55\xce\x7f\x81\x0c\xa9\x31\xa7\x6a\xc9\x3a\x0f\xc2\x83\xf8\x8b\x29\x5a\x61\x7c\xdc\xd5\x16\xca\x2e\xf9\x2a\x5a\x7a\x40\x14\x4b\xf4\x57\xbd\x54\xd5\x4d\xc3\x4c\x0c\x51\x2f\x41\x0f\xaa\x09\xaf\x29\xdf\x10\x13\xf3\x92\x31\x0a\x60\x4f\x91\x3d\xa6\xb6\x74\xe6\xb6\xc2\xd3\x0a\xe3\x0a\xf1\xb0\x05\xf8\x98\xfc\xc0\xd9\x6d\xbf\x45\x46\x82\xaa\xc2\xfa\x8b\x20\x26\x81\xba\x8a\x69\xd6\xba\x32\x9a\x34\x35\xda\x17\x62\x16\xf5\x27\x5a\x0f\x1f\xfc\x21\x5d\x85\x34\x05\x36\xce\x29\xca\xc1\xc5\x27\xf6\xea\xae\xb4\x2f\x6e\x25\x9b\xef\x31\xdf\xcb\x3e\xaf\x05\xa8\x62\x28\xeb\xf2\xcc\xd4\x06\xe9\x51\x11\x5b\x06\x31\xb0\x83\x7b\x74\x12\xc7\x5c\x91\x03\xc6\xdf\xac\x00\xbd\xec\xb6\xe9\xad\xde\x1a\x96\x9b\x29\xbb\xca\x56\xe7\xf6\x4e\xa4\x48\x3f\xe2\x70\x46\x3b\x82\x8c\x86\xc9\xa4\x15\x95\xdc\x5e\x5f\x8a\x9f\x90\x87\xa1\x08\x9d\xec\xe5\x42\xfe\x29\xec\xd6\x9f\x1c\x6e\x89\xcf\x3e\xd8\xf5\x89\x3f\x85\x93\xfb\x27\x44\x44\xe6\x3a\x56\x06\x17\x73\xfe\x1e\x7b\xd3\x37\x46\x2a\x71\x58\xe9\xa3\x30\x2a\x46\xd9\x45\x18\x02\x4b\x02\x87\xdb\xde\x10\xd8\x4a\x6b\xd4\xba\xc4\x03\x11\xb0\xd7\x01\x8b\x44\x84\xcd\xec\x63\x67\x4b\xad\xb0\x20\x15\x23\x62\x82\xaf\xd5\xed\xa0\x96\x7f\x2b\x0e\xea\xd9\x3f\xda\xde\x98\x1d\xf7\xc0\x7f\xf4\x0c\xfa\xff\xd8\x3f\xe9\x53\x77\xa1\xcd\xff\xeb\xa0\x29\xb2\xfa\xf7\xcf\x03\x7b\x24\xff\xff\xec\xe4\xe5\xab\x56\xfe\xd7\x8b\xd3\x93\xaf\xf9\x5f\x7f\xc8\x8f\xf7\x52\xfd\xfc\x59\x9e\x9d\x9c\x9c\x1d\xdb\x65\x90\xdf\x81\x6f\xef\x43\x2a\x07\xfa\xee\x53\x56\x7d\x4a\xe4\x65\x36\x5b\x2a\x9d\xcb\xf3\x54\x4e\xee\xca\x44\x76\x72\xfd\xa3\xce\x64\x27\x95\xdf\x97\x95\xb5\xc0\xca\xdb\x44\x9c\x2f\x55\x95\x67\x5a\x5e\x95\x65\xae\xed\x4d\x1a\x37\x7e\x82\x8d\x5f\x2d\xb3\x3c\x5b\xdb\x57\xcf\x2b\x95\xdd\x50\x56\x40\x98\xbb\xe4\x42\x06\x4f\x94\x39\xce\xcc\x93\xc4\xd9\x96\x08\x33\x85\xf0\x79\x3e\x9a\xe8\xe2\x8f\x69\x14\x2e\x43\xec\x91\xa5\x76\x91\xac\xa9\x15\x66\xf9\x9c\x23\x55\xed\x0a\xbd\xb8\xfa\x60\xa9\x45\xe3\xd9\x21\x5d\xff\x52\x21\xae\x3c\x52\x5f\x16\x41\x04\xab\x02\x52\xde\xea\x20\x13\xca\x0d\x8b\x3f\x46\x11\xc9\x20\x26\x26\x42\x18\x2b\x0c\xe7\x11\x2c\x07\x19\xc2\xe0\xb9\xb2\x72\x1a\x75\xf4\xc0\xf3\x95\xd5\xe4\xe3\x49\xda\x50\xcd\x7b\x51\xdf\x4f\xd1\x96\x44\x43\x77\x6b\x74\x1e\x4a\xca\x5a\xf6\x99\x71\x25\xe5\x7a\xfe\x1a\x7d\x50\xfc\x77\x48\xc4\x15\x3e\x6f\xad\x2a\xc9\x13\xe7\x4c\x68\x37\x63\x6c\x3b\x6c\x4f\x0a\x2b\x14\xf3\x66\x56\x27\x42\x15\x81\xd7\x10\x34\xbf\x43\x97\x87\xc3\xc3\x71\xcc\x6c\xf4\x56\x3b\x74\xe3\xa3\xa3\x76\xa1\xca\x0a\x6f\xbc\xdf\xbe\xcd\x85\xdf\xe6\x32\xda\xe6\x92\xf2\x05\xbe\x64\xa3\x9f\xa5\xb2\x63\xd7\x52\xcf\xd9\x1d\xea\x4c\x04\xf6\xf8\x42\x6c\x06\x80\xfd\xab\x4f\x56\x73\x46\x70\x03\xaa\x6b\xf5\x6b\x23\xe2\xb5\x91\x10\xe2\x63\x9f\xcb\xf6\x0a\x00\xac\xc7\x33\x4a\x43\xa6\x50\x49\x50\x7b\x8f\x08\xdb\x73\xe7\x25\xe5\x5c\x33\xcc\x00\x84\x8e\xc6\x91\xae\x7f\xb6\xd8\xfa\xfa\xf3\x3b\xfd\xa4\x4f\xc7\x97\xfd\xc1\x77\xff\xb8\xe4\xef\x2f\xb8\xff\x4f\x9f\xb7\xf9\xff\xcf\x5e\x7c\xbd\xff\xff\x98\x9f\xf1\xa4\x33\xb8\xe8\x8c\x2e\xe4\x65\x5f\x0e\xdf\xca\x41\xf7\x83\xfc\xae\x3b\x1a\x77\x43\x5e\xf7\xc1\x70\xd2\x3b\xef\x26\x8e\xdb\x3c\xe4\xb1\xef\x8e\x52\x2f\xfd\xc4\xe1\xec\x08\x32\x65\x8f\xcf\x4e\x4e\x4f\xe5\x74\x03\x37\xcd\x5b\x6d\x45\x37\x47\x7b\xc6\x97\xfd\xa7\x83\xef\x42\xdd\xc0\xbe\x74\xfa\xcd\x9f\xbf\x39\x86\x1c\xdb\xe9\x46\xf6\x9b\x99\x95\xfd\x13\xc7\xe1\x60\xad\xee\xe0\xce\xc5\xeb\x35\x01\xc3\x87\xf1\x0d\x93\x76\x4a\x79\x7c\xcf\x00\xe2\x72\x3b\xce\x2f\x5a\x57\x72\x0c\xaa\xa3\x41\x13\x09\x29\x90\xf4\x3c\x69\x25\x33\x38\x0f\xcb\x76\xc2\x72\x00\x86\x82\x70\xee\x0c\x70\x08\x2f\x4e\xcb\x2d\xda\x27\x7e\xaf\x98\x63\x51\x73\x00\x07\xec\xff\xe4\x13\xad\x02\x36\x0e\xff\x29\xd3\xac\xd7\xf6\xca\x2b\x6e\xe2\x91\x12\x91\x11\x77\x99\x81\xca\x77\x4c\x74\x22\xdf\xe8\x3c\x97\x7d\x35\x75\x9c\xe7\xf4\x14\x95\x51\x12\x1d\x40\xc3\xec\x42\xf3\x5b\x5d\xd5\x94\x98\xc3\xac\x73\xf6\xb9\x35\xe6\x0c\xb4\xf3\x38\x43\xcf\x36\x2d\x8e\x03\x49\x66\x4f\x66\xe2\x21\x91\xb1\x00\xc8\xcd\x44\x2a\x04\xf5\x86\x87\x8f\x4e\x87\x36\x19\x09\x56\x68\xba\x22\x1f\x9f\xc4\x1e\xe4\x21\xe5\xb9\xf8\xe2\xfc\x32\x49\xf9\x65\x90\x76\xe2\xd4\x4b\xc4\x30\xc0\x0e\x09\x9f\xff\xe4\x52\xe7\x3d\x72\x03\x06\x51\xf7\xa7\x36\xc5\x7a\xa8\xf0\x48\x11\x94\x26\xe4\xc9\xc6\x4a\x03\x7d\x84\xfd\xcf\xd9\x49\xeb\xaa\x5c\x64\x75\x04\x12\x2b\x41\x95\xe2\x88\x3b\x78\x13\x81\xe2\xb7\xd0\x37\x79\x76\xa3\x23\xf2\xdb\x1a\x94\xa4\xc6\xd0\x0b\x49\x3b\xd1\xaa\xcd\x59\x26\x5c\xec\xad\x41\x90\xd6\x88\xd5\x6d\x4b\x5b\xfe\x67\x4b\xb8\xaf\x3f\x0f\xfd\x44\xf6\xff\x98\x1c\xd7\x97\xfd\xe3\xdf\x53\x25\xf8\xe5\xf7\xff\xcb\x67\x27\x67\x5f\xef\xff\x3f\xe2\xe7\xeb\xfd\xff\xf5\xfe\xff\x7a\xff\x7f\xbd\xff\xbf\xde\xff\xff\x73\xfe\xa4\x4f\x3f\xfc\xf8\x21\x2b\xe6\xe5\x9d\x39\x76\x61\xbb\xe3\x67\xe9\xe9\xef\xe8\x11\x78\xec\xfe\x7f\xf6\xaa\xed\xff\x7f\x79\xfa\xf5\xfe\xff\x63\x7e\x10\x17\xbd\x37\x1c\xd0\x2d\x0f\x8e\xc2\x53\x28\x66\x56\x2e\x1d\xce\x6d\x8c\x64\x27\x2e\x49\x58\xaf\x8d\xb8\x13\x90\xe7\x12\x92\xb4\x97\x51\xe0\x1b\x28\x96\xc3\xf2\xb3\xed\xb0\x35\x83\x3e\xd3\x53\xdc\xb0\x72\x25\xd4\x61\x92\xc3\x1d\x6f\x61\x07\x7c\xd1\xc7\x87\x12\x4c\x10\x00\x94\x1c\x4c\x6b\xf4\x50\x3c\x71\xed\xeb\xec\x4b\x6b\x5f\x5b\x6f\xed\x84\xcc\xd8\x39\x41\xfb\xbf\xec\xee\x6a\x74\xd3\x9e\x39\x72\x3f\x9c\x74\xac\x4f\x27\x37\x3b\x55\x93\xb3\xf2\x93\x67\xc5\x27\x47\xf1\xd0\xd2\x80\x70\x7e\x5c\x09\x1f\x54\x1c\x26\x72\x9a\x15\x76\x82\x4a\x04\xdd\x84\xdc\x92\x30\x99\x98\x78\x02\x29\xf3\x92\x7a\x09\x73\xea\x7c\xc8\xe4\xcc\x87\xb0\xb3\xcf\xee\xe7\xe0\xf9\xae\x92\xbd\x88\xf1\x72\x1f\x28\xca\x4c\x7f\x29\x82\x09\xa4\xf9\x43\xe6\xab\xa7\x1b\xf5\x9b\x2f\x41\xe4\x41\x5f\x6c\x4f\x79\x31\x94\xe8\xe0\xa7\xd5\x03\xfb\xd9\x3d\xe2\x29\xce\xe6\x41\x32\xad\x9a\xfb\x2d\x79\xa7\x36\xa9\x9c\x94\x08\x43\x27\x57\x99\xc9\xb5\xe2\x92\xa6\xb2\xd0\x41\x45\x19\x50\xc6\x18\x57\x53\x13\x27\x24\x26\x3e\x8c\x32\xd7\x50\xce\x0a\xad\xfb\x7e\x05\x64\x99\x94\xef\x6f\xbb\x44\xe5\xe4\x6a\xfe\xf7\xc6\x84\x00\x9b\x00\x43\xe5\x43\xfb\xac\x2a\x32\xce\x69\x4e\xeb\xf6\xdc\xad\x9b\xd5\xad\x5a\x89\x66\x2e\xb9\xd9\xee\x13\xcc\xe7\x09\xe7\x13\x13\x04\xe0\x81\xd9\xb2\xb4\xcd\xb3\xa2\x81\x44\xfd\x80\xbf\x15\x8f\xc1\xae\x0e\xcf\xea\x56\xd2\xb0\x69\x25\x93\x11\xe6\xc1\x52\xd5\xbb\xe6\x46\xff\x23\xa7\xe6\x9f\x2d\x7e\xff\xe9\x3f\xe9\xd3\x37\xe3\x8b\xe3\x67\xc7\xe7\xb9\x6a\x8c\x3e\x1e\x94\xc7\x83\x06\xea\x2a\x8e\xa9\x8e\xd6\x9a\x72\xcf\x7f\x9b\x32\xf0\x18\xfe\xdf\xd9\xb3\x17\xad\xfb\xff\xd5\x8b\xd3\xaf\xfe\xff\x3f\xe4\xa7\x1d\xb9\xfc\x73\x22\xed\x82\xcb\x61\xa5\x66\xb9\x3b\x5a\x40\x5a\xc8\xc8\x4a\x26\x95\x1d\x0f\xd9\xca\x9c\xe8\xa9\x10\xd7\x88\x0a\x1c\xb0\x91\x47\xcc\x0c\xe9\x56\xdd\x20\x80\xc3\x19\x88\x02\x07\xd5\x21\x74\x43\x59\x93\xc2\x60\xe0\x5f\x96\x95\xb3\xcb\x63\x9c\x82\x38\xed\x71\xdb\x38\xf7\x51\xf0\x90\x26\xa0\xd2\x72\xa5\x6b\x28\x2b\x8b\x7b\x44\x15\xf9\xd0\x15\x10\x2d\x20\x8a\x2a\xed\xb2\xcb\x30\x9d\x72\x07\x5b\x28\x56\xea\x1b\x4a\x3d\xf3\x9f\xa2\x72\x38\xdf\x0f\x6f\xb7\xa7\xbb\xbe\x9f\x15\xe1\xf8\xf9\xfb\x44\x22\xf5\x50\x17\x04\xc9\xec\x5f\xd4\x05\x97\xc5\x15\xb9\x45\x68\xd1\x89\x85\xdf\x2a\x3f\x99\xca\x83\xa4\x0c\x67\xff\xb5\xaa\x1f\xff\x24\x07\x41\xf1\x08\x3b\x19\x68\x27\x9d\x13\x2e\x16\x8a\xf1\xb0\x82\xac\x5c\xc0\xfe\x0a\xe0\xb2\x8c\x08\xa1\x68\x20\x4b\x1e\xf8\x1b\xc9\xd8\x5d\x95\xb5\x0b\xff\xbb\x1a\x35\x4e\xda\x08\xbd\x3e\x8c\xad\xec\xb0\x2f\xf6\x11\x2e\xa6\x42\x4c\xde\xf7\xc6\x72\x3c\x7c\x3b\xf9\xd0\x19\x75\x65\x6f\x2c\xaf\x46\xc3\xef\x7b\x17\x9e\x64\xca\xfb\xc3\xde\x0f\xfb\x17\xdd\x11\x72\x48\x9d\x0f\x07\x58\x25\x3b\x1c\x8d\xe5\x41\x67\x2c\x7b\xe3\x03\x61\xff\xd0\x19\x7c\x64\x62\x28\x39\x1c\xed\x24\x36\x0a\xd8\xa0\xde\x5c\x83\x9b\x0d\xd9\xa0\xba\x17\x72\x32\x4c\x80\x1c\x69\xfb\x35\x39\x7c\xeb\x28\xa1\x3a\xc8\xdc\x03\x1d\x79\x8c\x15\x4a\xd8\x61\x39\xaf\xdd\x45\x2a\x43\x82\xa3\xf1\xfb\x4e\xbf\xdf\x1a\xe5\xf0\xc3\x00\x69\x9d\xa2\x21\x3a\xf2\x23\xc1\x0c\x47\x17\xbd\x51\xf7\x7c\x62\x47\xe3\xff\xe5\xa9\x8e\x98\xff\xc8\x13\x1b\x25\xd4\xa6\x67\x40\x12\x4c\x75\x74\xf8\xc8\x8c\x5c\x8d\x86\xe7\xd7\x23\xe0\xb4\x92\xc0\x56\xf4\x66\x3c\xe9\x4d\xae\x27\x5d\xf9\x6e\x38\xbc\xb0\xf3\x2c\xc6\xdd\xd1\xf7\xbd\xf3\xee\xf8\xb5\xec\x0f\xc7\x30\x59\xd7\xe3\x6e\x22\x2f\x3a\x93\x0e\x7c\xf8\x6a\x34\x7c\xdb\x9b\x8c\x5f\xdb\x7f\xbf\xb9\x1e\xf7\x60\xce\x7a\x83\x49\x77\x34\xba\x06\x3b\xe8\x48\xbe\x1f\x7e\xe8\x7e\xdf\x1d\x89\xf3\xce\xf5\xb8\x7b\x01\x93\x4b\x0c\x4f\xc4\xed\x34\x7c\x0b\x73\x40\x74\x5c\x4c\x80\xd5\x1b\xe0\x4c\x75\xec\x14\x8c\x27\xa3\xde\xf9\x24\x78\x0c\x28\xb8\x86\xa3\x49\x30\x46\x39\xe8\xbe\xeb\xf7\xde\x21\xb7\x56\x40\x13\x76\xe4\x28\x9f\x7a\xf8\xd9\x0f\x9d\x8f\x9e\xfd\xa9\x2b\x1c\xdb\x53\xb0\x61\x3d\xe5\xd3\x7e\x82\x27\x19\x13\x3c\xa5\x42\x6c\x97\xe9\xa9\xba\x9d\xa0\x83\x2a\x32\x12\x36\xeb\x79\xe2\xd9\x29\xc0\x2d\xe4\x29\xc0\x05\x09\x72\x90\x0b\xf0\x74\x42\x10\x33\x0d\xb9\x95\x3c\xc8\x6c\x59\x61\x55\x82\x2e\xd8\x67\x64\xcd\xac\x02\x15\x0f\xb9\x50\x33\x24\xed\xfa\xaa\x9d\xfd\xe3\x7f\x50\xff\x3b\x63\xfd\xef\x6d\xa5\xf5\x9b\xf1\xc5\xef\x9b\x0e\xf2\x98\xff\xe7\xd5\x8b\xb6\xfe\xf7\xe2\xe4\xec\xab\xfe\xf7\x87\xfc\x4c\x08\xe1\xf3\xcd\xf8\x22\xa2\xf3\x08\xb0\xfd\xce\xac\x09\x70\x26\xc3\x27\xa9\x18\x26\x54\x04\x45\xa0\x08\xfe\x8f\xa6\xe6\x9d\xa6\xbf\x93\x9e\xf7\xab\x94\xac\x14\xf2\xfe\xfe\xbf\xa4\xe8\x3d\xaa\x2b\xbd\x1d\x75\xbb\xb0\x4f\x46\xc3\xef\xba\xe7\x13\xf9\xb7\xbf\x81\x66\xf4\xe4\x89\x6c\xa9\x46\xe2\x57\xab\x46\x3b\x5e\x13\xbf\x52\x35\x92\xdb\xaa\x91\xd8\xa1\x1a\xb5\x07\xb5\x57\x35\x92\x2d\xd5\x48\xfc\x7a\xd5\x48\xee\x50\x8d\xc4\xaf\x53\x8d\xe4\x6e\xd5\x48\xfc\x0a\xd5\x48\xee\x53\x8d\xc4\xaf\x51\x8d\xe4\x83\xaa\x91\xf8\x05\xaa\x91\x7c\x50\x35\x12\xbf\x44\x35\x9a\x00\x5a\xb5\xbe\x73\x54\x89\x84\x04\x6c\xda\xbe\x6a\x1d\x07\x99\xe3\x6c\x64\x55\x69\x81\xf0\x1a\x4c\x94\x48\x89\xe8\x41\xc1\x1a\xa5\xe0\x5a\x75\xa8\x5a\x57\x9a\x92\x79\x5d\x6e\x2f\x04\xe2\x00\xa2\x40\xe5\x62\x5d\xe6\xd9\x0c\xa2\xb4\x0f\x41\x6b\xf1\xc7\xda\xd2\x7a\x97\x3e\x95\x3e\xed\x67\x45\xf3\xe3\xf1\x70\xad\x8b\xde\x9b\x7f\x4c\x1a\xe8\x23\xf7\xff\xe9\xcb\x17\xcf\x5a\xf7\xff\xf3\x93\xe7\xcf\xbe\xde\xff\x7f\xc4\xcf\xff\x68\x57\xf5\xf1\x3f\xd9\x23\xb3\xfd\xfd\xff\xd8\x17\x75\x77\xf7\x3d\x4d\x9e\x0a\x4f\x43\xcd\x40\x84\x21\xdb\x75\x12\x38\x30\x84\xe3\xb6\xf6\x42\x7a\xfb\x1e\x42\x0a\xe2\x87\x7c\x15\x8e\xbe\x5a\xec\xbf\x8d\x07\x17\x6d\x06\xeb\x7d\xde\x8a\xce\xf5\xe4\xfd\x70\x04\x5a\xc4\xb6\x7b\x66\xfb\x3e\x86\x0b\x3e\x71\x77\xaa\x23\xbf\x0e\xcc\xf4\xe0\xca\xea\x0c\x64\x07\x48\xab\xed\x30\xfc\xfd\x05\x57\x55\x4c\xeb\xcd\x97\xd2\xdb\xd1\xf0\x32\xa1\xfb\x08\x34\x1b\xb8\xf7\x06\x5d\x6c\xc5\x4e\xb5\x8c\x56\x24\xa4\x6f\xf6\x44\xdc\x9d\x7e\x6f\xf0\x0e\xc8\xcc\xc3\x87\xff\x41\xd6\x70\xfa\x74\x50\x7e\xca\xd4\x3f\x31\xff\xff\xc5\xc9\x8b\x93\xd3\xaf\xf8\xef\xff\xa4\x1f\x58\x7d\x69\x6f\x7f\x39\x46\x29\xeb\xc0\xd1\x07\xc3\x7f\x19\x8e\xf9\x7f\x8f\x84\x08\x70\xe0\x95\x3c\x4d\xe5\x45\xf7\x6d\x6f\xd0\x03\x56\xf7\x54\x88\x83\x8e\x8b\x0f\x1c\x60\xad\x32\x82\x0f\x62\x92\xd4\x4a\x2b\xc8\x49\xc2\x24\x32\x88\x48\xaa\x23\xaa\x7a\x87\x02\x7c\x42\x8e\x05\xa7\x92\xfb\x3f\x70\x09\x97\x79\x8e\x4c\x0b\xb3\x25\x36\xf9\x5a\x88\x69\xf0\xae\x0f\x33\x43\x41\xb5\x4f\xb5\xf2\x69\x57\x77\x85\x26\xb4\xa9\x8a\xdb\xe4\xc2\x2a\x64\x6e\x7b\x2d\xcb\x0a\x3a\x35\x7b\xbc\x53\xb6\xb5\x79\xd0\x52\x8e\x71\x7f\xdf\xbf\x54\x08\x62\x2c\x33\x9a\x53\x0b\xa1\x96\x8f\x53\xe8\x1c\x2d\x6d\x8d\x98\x30\xbe\x78\x2b\x6e\x52\x15\x48\x22\x9d\x11\x9c\x09\x8a\x7f\x6a\x64\xa9\x8c\x5c\x64\x0b\xcc\xb4\x83\x94\xb8\xc3\x17\x27\xff\xff\x23\xf0\xad\x95\x95\x53\x38\x6f\xcb\x1a\x91\xd8\x60\xb0\xf8\x6e\x02\x25\xeb\x04\x4c\x45\x73\x44\x11\x1e\x95\xa1\x72\xfa\x14\x29\x32\x78\xb2\x30\x30\xbe\x02\xaa\x0c\xcc\x81\x10\xf6\x85\x69\xa9\x2a\x40\x93\x64\xfc\x71\xa4\x3f\xff\xa1\xc9\x6e\x55\x0e\xbc\xb7\xe5\xdc\x4e\xc7\xc1\xb9\x2f\x70\xbc\x36\xfa\x20\xdc\x14\x71\x66\x60\x08\x13\xbc\x52\x9f\xda\xd4\x4c\x0c\xd7\x24\x3c\x52\x06\xe4\x01\x78\x7c\x4d\xfa\x9c\x0b\x25\x44\xdf\x02\x16\x10\x9a\x3f\x04\x0e\x80\x05\x30\x6e\x35\x21\x73\xc1\x85\xf1\x91\x49\x03\x53\xe8\x2e\xa3\xf8\x75\xfc\x0d\x66\x48\x88\xbe\x95\x15\x72\xa6\x3c\xfd\x65\xf8\x38\xcd\xe6\x94\x49\xf5\x69\xa9\x86\x5c\xb5\xe7\x41\xa9\x30\x5e\x11\x7d\xdb\x01\xee\xa9\xb0\x4d\x07\xbc\x28\xe2\x87\x81\x69\x6f\x4a\xa3\x0d\xf0\x32\xc3\xee\x40\x6e\xac\xef\x2d\x4a\x84\xac\x10\x9c\xb0\xb3\xbb\x73\x0c\x49\x67\x95\xa2\x30\xaf\x12\x15\x9b\x6a\x65\x37\x75\xf7\xc7\x99\x6e\x6a\x22\x81\x3e\x68\x2f\x62\x34\x5d\xbb\xbf\xb1\x35\x78\x9c\x3d\x11\xcc\x9e\xdc\x37\x7b\x30\xae\xe8\x6d\xe0\xf6\x45\x26\x18\x65\x74\x50\x7f\xbb\xe6\x32\x51\xc0\xc8\x28\x17\xb6\xb7\xdd\x5c\xcf\xea\xaa\x2c\xb2\x59\x0c\x02\x7d\xa9\x67\x4b\x55\x64\x66\x15\x75\x5f\xc9\x15\xff\x3e\xc4\x73\x99\xcd\xf4\xba\xd6\x73\xd1\xb6\x14\xe7\xfa\x56\xe7\xe5\x1a\xf1\x6e\x90\x27\x99\x30\x9e\x21\xdf\xc1\x7f\xba\xae\x54\x61\x16\x08\xbe\x30\x57\xb5\x82\x9e\xfd\xa8\x67\x38\xab\x51\x17\xda\xd3\x1b\x2e\x50\x08\xcd\x4e\x62\xfe\xbc\x9c\xc3\xaa\xc0\x72\x47\x0d\xe1\x06\x08\xe3\x75\x9c\x3d\xed\x45\xbc\x7d\xb3\xaf\xaa\x1b\x5d\x01\xa3\x66\x6b\x2e\xee\xca\xea\x53\xc2\x58\xf9\xb0\x54\xda\x6c\xf7\xaf\xac\x24\x4f\xbc\xa0\x89\x47\x45\x16\xf4\x7c\x20\xb3\xb5\xaf\x04\x60\x85\x3b\xb9\xd0\xa1\x2b\xcc\xbd\x14\xed\xa8\x80\x6e\xc0\x3f\xb4\x35\x6f\x4b\x75\xcb\xfb\x16\xd5\xf7\xba\xc4\x74\x6f\x87\xb1\xbd\x52\x3f\x86\x34\xe8\x08\x9b\x9b\xeb\x44\x70\x1a\x0c\x99\x36\x40\xaa\xe5\x60\x94\x33\xc8\xf0\x85\x96\x90\x54\x6a\x4a\x89\xbf\xb0\x31\xb0\x44\x39\x41\x5a\xed\x62\x0e\x30\x68\x4c\x01\x8f\x81\xf5\x59\x59\xdc\xea\x0d\x51\xc5\x65\x40\xb7\x14\xed\xe6\x78\xce\x03\x76\x6e\x80\x1b\xac\x30\x81\x06\x92\xef\xa8\x9a\x1d\xba\x50\x23\xb4\x75\x25\x31\x30\x43\xa8\xc3\x41\xd8\x76\xe7\x21\x44\x7e\x7c\x7d\x0b\x69\xc2\x2d\x51\xf8\x61\xa9\x77\x6d\x3e\x97\xc2\x37\x47\xbc\x63\xa3\x99\x23\x89\x91\x46\xa3\x86\x64\x66\xbe\x15\x42\x1d\x01\xca\xe9\xa3\x23\xb1\xc2\x9a\xa1\x94\x08\x26\x8c\xdc\x32\x76\x29\x79\x08\x22\xda\x6a\x7b\xba\x6f\x75\x09\xfb\xcd\x42\xdf\x49\x8f\x67\x43\xad\x19\xc9\x14\xbf\xfb\xc5\x4c\xd0\xb6\xd8\xba\x25\xb6\x1e\xdf\x12\x7a\xc1\x71\x44\x33\x71\xb5\x6e\x6a\x1d\x50\xb9\xc0\x69\x80\xb3\x24\xb2\x90\x61\x26\xdb\x7e\x9f\x32\x9c\x42\x78\xf0\xee\x8f\x00\xc4\x26\x3b\x76\x15\xb6\x6f\x18\xa8\x0b\x80\xc6\x93\xf6\x2e\xce\x6a\x9f\x85\xe9\xd9\xa4\xdb\xf4\xcf\x2a\xaf\xb4\x9a\x6f\x78\x03\xf8\x29\x8f\xcf\x6e\x7c\x5c\xaf\x14\x1c\xa4\x73\x48\xe0\xdf\xda\xc7\x6b\xfc\x2b\x18\xc4\x87\xe6\x28\x91\x45\x79\xe7\xb5\x2e\x7b\x1a\x90\x2b\xce\x1d\x22\xb1\xc5\xa6\x2c\x3d\x9b\x72\xe2\x20\xe5\x80\x47\xcc\x30\xc6\xed\x7a\xad\x2a\xc8\xd2\xc3\x32\x82\x84\xc4\xa5\xa0\xaf\x7b\x61\x21\xb9\xfc\x03\x38\x88\x0f\x82\xf9\xde\x5a\xcb\x35\x72\x8e\x60\x40\x74\xc5\x5b\x66\xeb\x6c\x2c\x20\xfe\x69\x95\x1b\x11\xa7\xe1\x11\x4e\x70\x54\xa4\x20\x57\xe5\x1c\x00\x28\x33\xbf\x2b\x13\xb9\xce\x1b\xdc\x9b\xca\x98\x72\x06\x4c\x68\x02\x3c\x88\x0b\x35\xd3\x01\x86\x23\x1f\x36\xbb\x69\xd6\xb5\x71\x09\x15\xac\xd8\xd9\xed\x96\xe5\x81\x94\x0f\x20\x2b\x05\xa8\x2e\xd2\x5f\x37\x90\x21\x1b\xfa\x62\x1c\xd5\x44\xa6\xb0\x29\x55\x65\x06\x3c\x1c\xc4\xea\xe6\xe5\x8a\xd8\x23\x57\xf0\x62\xba\xd3\x79\x2e\x3f\x15\xe5\x5d\x91\x04\x20\x68\xdb\x37\x06\xe2\x96\x07\xca\xcb\x13\x43\x29\x89\x98\x33\x1b\x1e\x06\xc2\x5d\x04\x84\x09\xdb\x37\xef\x27\x45\xe6\x1c\x95\xa3\xee\x22\x02\x1f\x15\x94\xed\x54\xe5\xba\xb2\x33\x2a\xe7\x9a\xdf\x23\xdd\x74\xae\x8f\xf1\x5d\x30\x48\x02\x51\x77\x97\xcd\x75\xbe\x11\x21\x26\x65\x25\x8b\x52\xce\x96\xf6\x8e\xb4\xdb\xe6\x63\xd9\x1c\xc8\xc3\xb2\x92\xf6\x5f\xd5\xc1\x51\xcb\x2e\x0a\x50\xa8\x80\xc1\x00\xc1\xd4\x48\x55\xd5\x3f\x5a\xdd\x19\xd2\x19\x29\xd6\x86\x3c\xda\xe4\x9a\x5e\x51\x86\x33\x82\xba\xfa\x7b\x84\x6f\xcb\x24\x3e\xb8\xd0\xfe\xa2\x01\xd1\xef\x00\x5e\x17\xed\xc3\x6d\x1a\x97\xc1\x3b\x26\x1a\xf1\x97\xe9\x29\x62\xd2\x06\x9d\x03\x5f\x34\x0e\x8e\x81\x93\x85\xd7\x12\x5c\x06\x2c\x0e\x24\x95\x67\xa9\x1c\x0f\xaf\x47\xe7\x5d\x79\x3e\xbc\xe8\x72\x41\x19\xa7\x3d\x9f\x92\xea\xf1\xce\x9e\xb6\x54\x88\xb1\x4f\x24\xdb\x7b\xfb\x27\xf4\x4e\x58\xa7\x65\x10\x24\xd8\xaa\x21\xf9\xfc\xd8\xae\x4d\x22\xaa\x72\xa3\xf2\x7a\x73\xbc\xa8\xb4\x4e\x00\xa5\x4f\xff\x08\x2e\xfd\x5b\xed\xc9\x4d\x4c\xf8\x41\x67\x51\x80\x6b\x3e\xb7\x3a\x59\x83\x38\xc9\x6b\x5d\xd5\x1b\x81\x72\x03\x2f\x2d\x9c\x28\xcf\x12\xd9\x12\x1f\xd8\x45\x2e\x5b\x73\xce\x43\x5f\xbb\x36\xcf\xcc\x3a\x57\x9b\x44\x50\x29\x0d\x74\x85\x93\xe7\xb6\x0a\xdb\x76\xdd\x42\x87\x81\x36\xc5\x6a\xec\x91\x68\xbb\x6a\x5b\xea\x30\x27\xce\x7a\x70\x7b\x25\x03\xad\x0e\x0d\x6d\x64\x70\xb5\xe3\x43\xb1\x6d\x48\x6e\x3b\xb4\xb0\x0c\x80\xd2\x16\x55\x06\x68\x64\xa4\xaa\xa1\x7c\x4b\x64\x43\x95\x61\xc2\x68\xb4\xe3\x21\x23\x6c\xcb\xd0\x21\xfc\x4b\x82\xe1\xb5\x56\x4b\x82\x93\xb5\xae\xd4\x0c\x1d\xba\xb6\x01\xe8\xb2\x28\x01\xa0\x0d\xb0\x1f\x15\x51\xf8\x3c\x8d\x2c\x47\x3b\x9d\x41\xd0\xe5\xe1\xd9\x62\xdd\xf3\x28\x15\x62\x76\x04\x62\x84\xe9\x12\x1d\xb4\x0f\xa7\x80\xf3\x51\x38\x4b\x4f\x0f\xd5\x91\x63\xa3\xb5\x4d\xea\x05\x11\x7f\x50\xda\xbc\x00\x12\x49\x5c\x79\xe4\x5c\xf5\x6b\xb8\xe3\x26\xde\x9d\x2d\x1f\x5d\x9b\xf3\xa3\x2d\xe2\xfe\xb0\x3f\xb6\x1f\xd3\xf2\x16\x76\x37\xdf\xa1\xb9\xbf\xac\x69\x28\xdf\xca\xd3\x23\xa8\x7b\xf4\x79\xee\xf6\xb0\x50\xb6\xb5\x53\xb0\xb6\xfa\xf7\x5a\x9e\x1d\x49\xa3\xe1\xd2\xf4\xcf\x6d\x4b\xf5\xd7\x76\xbb\x3d\x3b\x82\xd5\xe1\x4d\x81\x60\x90\x80\xcb\x69\xf7\xc7\xb7\x32\x3b\xc2\x3d\x12\x72\xe9\x3c\xa4\x5f\x65\xf4\xc2\x17\x99\x7d\x76\x82\x88\x26\xc3\x04\x6d\xcc\xf5\x2d\xa1\x00\x82\xac\x39\x8b\x4c\xe0\x5f\x22\x71\x30\x76\xf7\xb8\xa4\x10\x2c\x29\x9c\x86\x01\xa6\x67\xf8\xd9\x47\x84\x96\x8c\x84\x96\xd8\x29\xb4\xbe\x44\xfc\x44\x7e\x82\xfd\x52\x48\xb0\x14\x92\x5f\x28\x85\x62\xd3\x9c\x00\x8e\xd9\x17\x16\xde\xd2\xbb\xa5\x13\x6b\x07\xa0\x7a\x84\x60\xe8\x53\x65\x32\x17\x67\x02\x0f\x58\x5b\x6e\xed\xb0\x26\x1f\x93\x65\x20\x39\xac\x3c\x0b\x65\xd9\x2f\x17\x65\xa8\x03\xa1\x2c\xdb\xf2\x0b\xc5\xee\x96\x70\x02\x68\xa8\x2a\x87\x42\x11\x4a\xaa\x2e\x22\x2f\x10\x0c\xd7\x2a\xdd\x3b\x3c\x4b\xf1\x04\xf2\xad\x1a\xbc\x7d\x14\x88\x50\xbb\xbc\x02\xa5\x65\x5b\x52\x06\xd2\xf5\x01\xa1\x69\x65\x44\x3c\x30\xb1\x77\x60\x3b\x57\x16\x26\xdb\x0a\x8c\xed\x43\xfb\x90\x7f\x2a\x6c\xf7\x8b\x67\x43\xec\x9a\x8d\x87\x45\x39\x49\x4d\x63\xc5\x00\x8b\x71\xfb\xcf\x07\x25\x79\xd8\x0f\x94\xe7\x08\x9f\x1d\xbb\x36\xf7\xe9\xfc\x8f\x89\xef\xb3\x5f\x2a\xbe\x81\x5e\xc4\x89\xf0\x48\xa8\x28\x43\xe2\x7c\xee\xe5\xf9\x8e\x59\xb4\x12\x5d\x6c\x49\xf4\xdd\x4f\x3e\x2e\xd0\x45\x28\x06\xb7\x8a\x8b\x76\x2d\xe2\x5e\xb9\xfe\x8b\xb6\x48\x4b\xd0\x1f\x62\xad\x10\x8b\x01\xe1\x96\x63\xeb\xfb\x47\xbe\x00\x9a\xae\x06\xb8\xba\x9e\xef\x16\x10\x4e\x28\x88\xe9\x66\xa7\xa7\x0d\xe3\xc0\x46\x53\x3e\xeb\x97\x0d\x21\x15\xcf\x52\x19\xf2\x2c\xc9\xe1\x9b\x7e\xef\x5d\x87\x63\x2a\x50\x6f\x77\x2a\x3b\x1e\x13\x10\xaa\xf6\x9d\x46\x30\xd9\x12\xc2\xe8\x73\x03\x46\x15\x10\xc7\x12\xfd\xf8\xc1\xaf\x9d\x9b\x5b\x86\x56\xba\x78\xc8\xc3\x16\x5a\xa4\xdb\x06\x76\xb8\x8b\xc1\x0a\x13\xa1\x15\x16\x54\x4d\x6e\x4d\xdb\x36\x9b\x25\xa2\xee\x3a\x55\x48\xec\xbe\x80\x77\x58\x30\x5b\xcf\x38\xe7\x53\x64\xc3\x88\x97\xe9\x29\x9a\x4d\x1f\xb9\xce\x8c\xcc\x96\x76\x31\x21\xb7\x83\xb0\xff\x40\x04\xe9\xff\xce\x86\xa6\x80\x21\x82\xfe\xe4\xd9\x7a\x99\x6d\x11\xdc\x23\x28\x80\x31\x37\x07\x11\x26\x36\x3c\xc7\xe8\xec\x08\xe6\x4a\xf0\x58\x88\x27\xab\xd6\x18\x4f\x61\xfc\x46\xc3\x06\x2a\xf3\xbd\xed\x1b\x7b\x59\x09\x04\xe8\x9e\x65\xeb\xcc\x1e\xd5\x27\xec\x53\xb4\xf2\x19\x26\xc4\xd3\x25\xb8\xee\xba\x89\x28\xc2\x52\x5d\x76\xa0\xa2\xd2\xcd\x8e\xd2\xe0\x01\x6a\x39\xf2\x4b\xf1\x8e\x78\x96\xbe\xe0\x5d\x7c\x26\x3b\x01\xee\x3c\x00\x81\x44\x7e\xe8\x4e\xb1\x89\xfd\x81\xbf\x64\x27\x33\x76\xa2\x3d\x67\x81\x11\x9e\x45\xce\x6e\xf4\xc9\x3c\xa2\x66\x07\x3a\x89\xdd\x7f\x10\x51\x5c\xe9\x79\xa6\xc0\x89\x19\x3a\x43\xfc\xec\x57\xf2\xd6\xfe\xbd\x70\xee\x7e\xb9\x27\x76\x20\x5c\xec\x20\xc6\x0a\xbd\x5b\x12\x0b\x00\xc8\x89\xdd\x5f\x71\xa3\x42\x45\x26\x5b\xd0\xc3\x6e\xb0\xb6\x0f\x8f\xc6\x2c\x12\x4e\x5f\x59\x01\x94\x37\xbf\x8c\x37\x4a\x2d\xed\x91\xa9\x65\x7d\xa7\xf3\x5b\x2d\x0f\x4f\xcf\x8e\xe4\xaa\x2c\xea\xa5\x91\xe8\x70\xab\x99\x1a\x3f\xab\xd9\xbf\x9d\x6f\x80\xa9\x64\x15\xf4\x24\x11\x61\x63\x26\xfb\x51\x1e\xbe\x6c\x35\xa4\x02\x6f\xf8\x16\x69\x43\x10\xa5\x8a\xc8\x36\x1d\x8b\x5d\x6b\xe0\x75\x89\xf7\xbf\xdf\xee\x78\x04\x15\x02\x8a\xaf\xcb\x02\xbc\xf5\xc8\xd9\x5a\x98\xa6\x42\x22\x04\xf2\x76\xee\x92\x55\x38\x3d\x21\x4d\x3f\x93\xec\xd9\x37\x1e\x5f\xdc\xcc\xb4\x88\x96\xda\x01\x4a\x38\x11\xcf\xe4\x85\x46\xb7\x1c\x8d\xbe\xed\x3c\x76\x22\x0a\x19\x0d\x54\x9e\x6f\x8b\xd0\x7d\x27\x82\x5c\x7c\x08\xd8\xbe\xc8\x72\x4f\xa1\xce\x47\x98\xb9\xc9\x3e\xf2\xbe\xb3\xaf\xe0\x49\xa3\x6b\x6a\x5b\xc1\x76\x3b\x40\x50\x54\x13\x1b\x49\x77\x49\x53\xcf\x6d\x07\x44\xa3\x10\xea\x72\xb3\x1e\x2d\x6c\xe6\x6a\xb8\x92\x3d\x31\xf7\x04\xd5\x93\x6d\x5b\xcf\xb9\xee\xd8\xc9\x22\xd0\x89\x19\x06\x23\xb9\x0e\x8d\xe3\x9a\xd2\xaa\x7c\xad\xa5\x4f\x9c\x29\x4f\x41\x33\xf4\xa4\x0b\x04\x52\xd9\x7d\xe8\x99\x5b\xbd\x85\x3f\x1b\x4a\x2e\x16\x8a\x20\x4b\x18\x70\xb7\x0a\xf3\x11\xf6\x6a\x8b\xb0\x45\x9e\xcb\x5e\xe8\x7a\xba\x62\x83\xf2\x52\xd5\xf6\x72\x10\xc2\x0e\x65\x02\x5b\xeb\x0a\x14\x2f\xd4\x56\xa0\xbc\xba\xad\x12\xb6\xaa\x7c\x54\x4c\x77\x2f\xa2\x2d\xfa\xc4\xec\xf6\x79\xb1\xb0\x0f\x40\x76\xa1\x3a\x0f\xfd\x93\x3a\x88\x5e\x09\x56\xb7\x39\x33\x22\xec\x4e\x74\x25\x1b\x70\xfc\x95\x95\x55\x1f\x92\xe8\xb1\x70\x43\xd9\xfe\xe9\x1f\x89\xd1\xc5\x65\xbb\x85\x87\x37\x06\xa2\xcf\xea\x5c\xcf\xe5\x41\xbf\xfb\xae\xd3\x3f\xa0\x15\x71\x04\x38\x08\x87\x6f\xa7\xca\x6d\x6a\xd2\x5b\x7d\xc6\x01\xfe\x19\xf2\x26\x1c\x3f\x18\xd2\x59\xf0\xfc\x39\x79\x83\x54\x5b\x76\x7e\x51\x92\xf3\xd9\x9b\xd5\x5b\x0b\x81\x2c\x60\x98\x79\x12\xac\x88\x13\xaf\xa2\x15\x12\x6b\xcb\x3a\xb5\xf7\xa2\x6d\xcd\x1d\x78\x97\x85\x3d\x83\x6b\x7b\x9a\x02\x16\x6a\x98\x12\xc7\x8c\x13\x60\x53\x45\x53\x0f\xa6\x4d\x20\x63\x5d\xd4\x45\x60\xe6\x32\x50\x16\xa8\x4f\x9a\xf5\xef\x5a\xaf\x8d\x3c\x44\x3a\x78\xac\xb4\x5f\x80\x4f\x3a\x74\xa7\xaf\x54\x06\x1e\x40\xe4\x8a\x28\x2b\x51\xe8\x3b\x73\x53\x95\xcd\xda\x1c\x85\x0c\x6a\x33\x95\x5b\xf1\x5f\x33\x87\x2d\xdc\xdb\x98\x45\x7d\xb7\x2c\x99\xee\x72\x1e\x9e\x1c\x1f\x76\x82\xc5\x29\xf4\x5d\x30\xbb\xee\xe2\xc0\xd9\x87\x0a\x15\x7b\xd4\xc3\x01\x77\xae\x7a\x5b\xc7\xe6\x49\x2b\x56\x18\x69\x48\x5e\x25\x17\xc4\x9c\x87\xa4\x8d\x2e\x06\xa3\x90\x55\x7a\xcf\x19\x2c\x17\x2d\x1b\x8f\x54\x77\x81\xb7\x96\x9b\x8b\x88\x91\x21\x5b\xad\xf3\x40\x90\x76\xae\x7a\x3b\x0e\x0c\x70\xe3\xf1\xa9\x01\xd5\x26\xa4\xb5\x23\x4b\xc5\x6f\x02\x3b\x17\xb3\x23\x39\xe2\x74\x73\x06\x68\x08\xdb\x75\xb9\xe8\x86\x40\x1a\xbc\x91\x05\x89\xab\xa5\xd5\xb3\xd7\x4d\x65\x1a\x55\x00\xfe\xb8\xdf\x96\xcf\xc1\xbe\x46\xbb\x36\x6c\x92\x88\x92\xcc\x96\x49\xd4\x9e\x74\x98\x90\xf8\xef\x0e\xdd\x9a\xf3\x73\x0e\xcd\x11\xbb\x33\xda\x33\x1e\x9c\x5e\x12\x4c\x1c\xdd\xdf\x19\x6a\xdf\x8e\x55\x82\x1c\x7e\x21\x47\x2c\xee\x06\x8e\x4c\xc4\xdd\x79\xf3\x06\xf7\x02\xca\x3f\xcf\x43\xea\x43\xaf\x9c\x76\x82\x4c\x84\x8b\xb6\xec\x4a\x45\x6f\x11\xb0\x70\x70\x7e\x01\xa0\x6b\x34\x35\x0a\x0b\xdf\x6c\x44\x6f\x1d\xe9\xb7\x70\xcd\x37\x1a\xc3\x88\xc6\x47\xf8\x91\x38\x6f\xfb\x92\xde\x6a\x38\x2f\x49\xf2\xc0\x49\x16\xc4\x53\x9c\xeb\x5b\x55\xd4\x2e\xc7\x6b\x73\x24\xef\x80\xa1\x5c\x11\x97\x20\xd3\xee\xe4\xd9\x27\x8d\x88\x1f\x79\x59\x7e\x22\x6e\x26\x2b\x10\xe8\x1b\x30\x4c\xaf\xd0\x5b\x63\x4f\xbb\x74\xb5\x70\xd1\xed\x7a\xb2\x55\xa2\xe6\x73\x04\x10\x81\x6b\x1c\x7a\x14\xac\x31\x83\xdd\xd3\x20\x22\xd9\xe8\xa6\x3f\x50\x4f\x90\x38\x32\x58\x2f\xbf\xd6\x82\x6e\xfe\xf8\x3a\xe7\x94\x9c\x70\x9e\x71\xf4\xd1\xfd\xbe\x6d\x6a\x89\xe8\x9e\x77\x58\x09\xb9\xaa\x09\x11\x6f\xeb\xce\x77\x43\x9e\x2d\x4b\x2b\xeb\xea\x12\xad\x47\xc2\xee\xe3\x60\xa2\xd5\xe7\x34\x68\xb3\x89\x03\x03\x4c\x18\xf8\x0f\xb0\xe6\xf4\x0a\xb2\x89\xca\x4a\x06\x64\x5e\xd3\x3c\xbb\x61\x56\xb1\x32\x9a\x79\xdf\xf7\x5d\x46\xfa\x0e\x43\x71\x5e\x4a\x53\x22\xaf\x4c\x09\xbb\x0a\x71\x63\xa6\x7a\xa9\xf2\x05\x6a\x52\x60\xfa\xf2\xaf\xbc\xf2\x45\x7e\xab\xd0\x03\xe2\xd6\x06\x99\xa0\xb3\x5a\xaa\xa9\x29\xf3\xa6\xb6\x5b\x09\xeb\x81\xf1\xbe\x65\xce\xa2\x2f\x1e\xb3\xf0\x63\xb6\x27\x0b\xe6\x12\x8f\x38\x52\x88\x02\x19\x32\xbb\x02\xc8\x13\x0f\xd4\xe9\x78\xeb\x40\x93\x8b\x50\xad\x44\x2f\x40\xe4\x07\xa4\x01\xf9\x79\xce\x8a\x59\x53\x55\x81\x42\x2a\xf9\x14\x84\xbb\xb6\x45\x00\xfe\xe5\xcb\x88\x36\xab\xed\x30\x0c\x87\xe5\xd3\xcb\xd8\xdc\x2b\x17\xa1\xca\x4a\xfe\x2e\x27\xb2\xd4\x26\xf4\xe3\xef\xf2\x65\x05\x2f\x63\x1e\x43\x40\xb6\x1c\x32\xf7\x58\x2b\xc0\x8b\xfa\xd3\x63\x2b\x28\xc1\xc3\x8c\x66\x9a\xae\xe9\xf8\xec\xb0\x26\x70\xe6\x33\x94\x07\x5e\xc7\xa3\x73\x6c\x2d\x06\x54\xc4\x1e\xb0\xd2\xf6\x65\x57\x64\x81\xe2\x22\x1e\x31\xf7\xa3\x5c\x0b\x3a\xce\xce\x1e\x5b\x96\x77\x08\xb9\x09\xc4\x59\xb0\x4b\xec\xe0\x16\x4d\xbe\xc8\x20\x45\xd7\x36\x1b\x1c\x2c\x19\x4d\x07\xa1\x78\x31\xd7\x02\xf3\xf9\x96\x85\x59\x67\xb3\xa6\x6c\x4c\xbe\x11\x21\x93\xb6\xb7\x3a\xe4\x3e\xab\x23\xd9\x63\x73\x94\x95\x98\x95\x39\xa0\x94\xa9\x7c\x8f\x05\xb2\xc3\x19\x14\x4a\xa3\x5d\xba\x94\x97\x48\xad\xb8\xcf\x2e\x7b\x68\x87\x7b\xaf\xac\xc4\x96\x04\x6c\x13\x53\x97\x0b\x14\x20\x98\xc4\xc1\x39\x83\x20\x05\x99\xd3\x0b\xd6\xcd\x65\x9a\x08\x0f\xf3\xe1\xd6\x30\x2e\x32\x62\xdb\x1f\xc3\x2b\xeb\x3c\x03\x8c\x01\x67\x33\x44\xfb\x40\x84\x31\x3d\xb7\xdb\xb8\x73\x2c\xfc\x77\x8c\xd7\x63\x87\x21\x37\xa9\xac\x4b\x01\x2e\x51\x47\xa1\x21\x23\x17\xdc\x13\xe3\x6c\xa7\xed\xb4\x2d\x6e\xd4\x45\x55\xe9\x51\x83\x27\xa8\x5e\xba\xf8\x33\xeb\x25\x92\x6e\xd2\x47\x17\xc6\x31\x81\xbb\x09\x74\xa3\x73\x97\xe2\xe3\x82\x17\xe6\x4c\x90\x15\x85\xf4\x68\x5b\xcb\x20\x31\x41\x67\x97\x90\x85\x0a\xc7\x4d\x74\x07\x88\xad\x3b\xe0\x11\x09\x2c\xf7\x4a\x60\xf1\x2b\x24\xb0\x6c\x49\x60\xbe\x5d\xc4\x1e\x01\xfb\x2a\x0c\x25\x86\x92\x94\x3c\x26\x51\xa8\xd1\x7e\x19\x23\x1a\xf6\x70\x6d\x1d\x8b\x1d\x61\x0b\xf1\xc5\xc9\xae\xbb\xc2\xb0\xe1\xa7\x95\x11\x4a\x9a\xac\xb8\xc9\x1d\x42\x0e\x60\xd6\x92\x22\x36\x53\xf6\xbc\xc4\x2b\x6f\x1a\xe2\xa3\x8b\xa8\x1b\xb7\x0e\x48\x15\x4a\x3e\x3e\x19\xdb\xda\xc2\xf3\x54\xf6\x06\x5c\x7c\x3d\x19\xca\xf3\xe1\xe5\x55\xff\xa3\xbc\xb8\xee\x8a\xc9\x50\x8e\x27\x1d\xa8\x49\x1e\x8e\xe4\xa8\xfb\xee\xba\x0f\x91\x8e\x54\x78\xfd\x17\xdc\xe4\xde\x5f\xf7\x11\xa9\x51\x31\xc7\x89\x12\x9c\x8a\x4d\x3b\xc1\x29\xd6\xe3\x08\x00\x18\x88\x3d\xc1\x39\x58\xae\x88\xfe\x3b\xdf\x7b\x67\x90\xd6\x0c\xb8\x7d\xb5\x4e\xe4\xdf\x9b\x39\x16\xdc\x96\x15\x33\xb7\x57\xfa\xa6\xa1\x44\xb9\x48\x9b\xfe\x16\xfc\x49\x61\x0f\xf7\x77\xed\xe1\x7c\xe2\xd7\xce\x09\x15\xfa\x8d\x82\x48\x8b\xaf\x1c\x9c\x95\x60\xdc\xe9\x8d\x54\x10\xac\x4c\xe5\xb8\x71\x1e\x0e\xbc\xc0\xf8\xc6\x09\xef\x98\x96\xfd\xef\xd4\x65\x11\xb9\x12\x9e\x7b\xae\xa1\xf0\x7d\x97\x5e\xb6\x55\x9e\xb9\x65\xce\x88\x2e\x1a\x88\x34\x5e\x1e\x27\x91\x02\x93\x57\x08\xe7\x3a\x9e\xda\x04\x37\x6a\x30\x0e\xc7\x84\xef\x2d\xb9\x7c\xe3\x89\x45\x41\x03\xf3\x62\x16\xe1\x8a\xe7\x58\xae\x69\x3e\x01\xfd\x97\xa3\x61\xb7\xd3\x0f\xe2\x10\xe2\xaf\x32\xab\x53\xf9\x22\x95\x9d\xab\xab\x7e\xef\xbc\xc3\x75\x7e\x50\x3a\xee\xf3\xd2\x26\xd1\xd9\xb3\x46\x3f\x96\x87\x60\xe8\x95\x9d\xaf\x94\x82\x66\x85\x4a\x5d\xab\xd9\x92\x74\x83\x2d\x53\x50\x74\x98\xd1\x8b\x2f\xf2\xed\x03\xf4\x32\x95\xdf\x77\x47\xe3\xde\x70\x30\xe6\x42\xf5\x28\x4d\xee\x65\x7a\x2a\x07\xfa\x2e\x54\xeb\xf0\xf3\x56\x1c\x11\x12\xa9\xac\xf4\x6d\x06\x99\xd7\x68\x15\x17\xfa\x2e\x02\xf9\xac\x97\xbe\xcc\x0b\x05\x79\xb6\xd2\xc0\xa5\x9c\xad\x74\x2a\xbb\xd6\x56\xe5\x4b\x09\x9c\x5b\x53\x0d\x90\xae\x05\x71\x3a\x66\xc5\x4d\x93\x99\xa5\x15\x6f\xfc\x58\xd1\xac\xa6\x2c\x2f\x5f\xa6\x67\xb2\x0b\xfb\x12\x54\xff\xb8\xb3\xc3\x62\xb6\xe3\x00\x3a\x1f\x8d\xc7\x52\xe5\x9b\x2b\xb0\x76\x63\xd5\x4f\x38\x05\xc0\x19\x8b\xf9\x9d\xda\x60\x85\x7e\x56\x34\x8e\x87\x2d\xab\x77\x87\x7d\x94\x0b\x3e\xa4\xc2\x37\x61\xca\xc0\x02\xb3\xaf\xd3\xe5\xd1\xea\xf1\x8e\x16\xf1\x16\xe1\xc0\x86\xd8\x05\x18\x0b\x15\x61\x01\x5a\x2c\x16\x5f\xca\x01\x99\x64\xbe\x4a\xc3\x6f\x29\xa7\x10\x48\xcf\xd1\xed\x3f\x1b\x84\x03\x77\x18\x95\xce\xd4\xf6\x09\xdc\xc2\xe9\x10\xaf\xd2\x00\xc5\xdf\xee\x35\xae\x01\x4e\x85\x38\x1f\x7e\xdf\x1d\x75\x2f\x76\x17\x0f\x5f\x0f\x2e\xba\xa3\xe8\xa4\x20\x0a\x04\x57\x15\xcb\x37\x9d\x71\x6f\xec\x6a\x8b\xc5\x9e\xda\xe2\x1e\xd4\xbb\x52\x89\x71\xf7\x22\x40\x49\x8b\xf0\x3f\xb8\x42\x19\xaa\x8c\xe1\x9c\x26\x22\x28\x31\x9e\xbc\xef\x4c\x08\xb9\x6c\xbb\xcb\x6f\x47\x5d\x00\x84\xb8\xe8\xbe\xed\x9e\x4f\xc6\x49\x50\x8d\xdc\xef\x42\x29\xf2\xfe\x32\xe4\xe1\x48\x0e\x86\x83\x63\x2a\x43\xee\x0d\xde\xa5\xf0\x99\xee\x60\xd2\x1b\x75\xe5\xa8\x37\xfe\x17\xd9\x19\x73\xcd\xf3\x5f\xae\x3b\xf6\xc6\x03\xe4\xb7\xab\xee\xe8\xed\x70\x74\xd9\x01\x5c\xaf\xb7\x7b\xfb\x06\xe5\xc0\x1f\x87\xd7\xa9\x1c\xbf\x1f\x5e\xf7\x11\x16\xa5\xfd\xa0\xb0\x93\xde\xa5\xfe\xf7\xbe\xef\x32\xee\xc5\xa8\x3b\xbe\x02\x40\x91\x8f\xc3\x6b\x79\x38\x18\x4e\xe4\x60\xf8\x2f\xbd\x4e\x22\x7b\x13\x5e\x94\xe1\x08\x2a\x9c\x3b\x6f\xdf\xf6\xfa\xbd\xce\xa4\x0b\x55\xd2\xf6\x5d\xac\x33\x0e\xa0\x4b\x8e\x64\x67\x3c\xbe\xbe\xec\x52\x57\xc7\x13\x5e\xa8\x41\xf7\xbc\x3b\x1e\x77\x46\x1f\x09\x3b\x04\xd6\x63\xd4\xbd\xea\xf4\x46\x58\x72\x3d\x1a\x61\x6d\x73\x8a\xbb\x61\xf7\x76\x02\x44\x13\x04\x23\x19\xdb\x5d\x62\x57\x1b\xc1\x4d\xec\xac\xcb\xe1\x5b\x11\x09\x5d\x39\x18\x32\x8e\xc7\xae\x19\xb1\x53\x87\x65\xdf\xbd\xff\xbd\x7b\x21\xdf\x77\x47\x5d\xdc\x8f\x88\x64\x2d\x82\xcd\x19\x72\x54\xfc\x39\x95\x93\xee\xe8\xb2\x37\x60\x95\xe3\xcf\xe9\xa9\x9c\xb4\x35\xab\xc0\x27\xc8\x01\x0c\x17\x32\x27\x36\x49\x5d\xad\xb2\x02\x74\xbe\xa6\x2e\x57\x0a\x68\xe8\xad\x29\x87\x0a\xf9\x02\x02\x04\xb1\xc6\x82\x07\x15\xab\x78\x90\x4c\x80\x1f\xb2\x9a\x17\x48\x97\x69\x05\xfe\x41\xfb\x78\x56\x88\x67\x27\x72\x6e\xe5\x58\xb9\x40\xc6\x7b\xb0\x4e\x83\x04\x78\x7a\x1c\xd1\x97\x7c\x8a\x9e\x69\x19\x72\xbe\x5a\x12\x6f\x29\x0a\x98\xad\x75\x95\x3b\x42\x0b\x72\xe5\x9b\xa6\xba\xcd\x6e\x7d\x7a\x42\x94\x64\x19\xfa\x43\xaf\xac\xa9\x65\x7c\xaa\x49\x42\xda\x6a\x56\xc9\x42\xa1\xaf\x31\x8c\x30\x67\x05\x65\x53\xc9\xa9\xde\x94\x34\xc1\xc1\x07\xb6\x12\xcf\xa3\xee\xc0\x2a\x9d\xb1\xad\x83\x11\xe7\xda\x2a\x44\x35\xfb\x75\xa6\x50\x00\xa1\x91\xf1\x42\xb1\x4b\x3d\x4c\x53\xa2\x40\xce\x21\x24\x4e\x42\xb1\xdf\x5c\xcf\x72\x55\x97\xd5\xc6\x6a\x79\xc8\x32\x89\xc4\x07\xe6\xc8\xd5\x2d\x78\x53\x25\x4e\x76\x73\xbf\x8f\xbc\x39\xf4\x12\x04\x7f\x60\x13\x58\xe5\x0a\x35\xee\x59\xed\x48\x29\xa9\x32\xa4\x2e\xad\xf1\x71\x70\x05\xb7\x5a\xb6\x56\x45\x7d\x70\x64\xd5\x2a\x7d\xc3\x71\x69\x4c\x29\x87\xf7\x83\xa7\x9e\xec\x4e\x85\xdb\x53\xa4\xcc\x53\x60\x84\xaf\xa8\x21\x37\x30\x55\x9c\x81\x2a\xd7\xda\xeb\x1c\xac\x0b\x3e\x6b\xfb\x6b\xc7\x84\x51\xc2\x28\x66\x47\xca\xc5\x59\x7a\xb6\x65\xa5\xc0\x32\x26\xb2\x59\x97\x85\x7c\x49\xbb\x39\xc4\x6e\x0e\x3e\x20\xfc\x89\x5a\x57\x25\x68\xed\xd9\x2d\x10\x9a\x36\x45\xae\x8d\x91\xd9\x82\xce\x85\x6b\x09\xc3\x65\x10\x07\x5a\x83\x8a\x41\xd1\x5a\xdb\x4f\xcc\xdf\xf8\x56\x1e\x66\x47\x64\x4b\x66\x05\x00\x7e\x92\xa3\x63\xad\x36\xd1\xf0\x94\x5c\x35\x75\x83\xd5\x9a\xf6\x71\xb8\x49\x5d\x00\x46\x73\xdd\x00\x5b\x23\x95\x5c\x2b\x83\x3c\xac\x94\x80\x44\x14\xb1\xbb\x13\xbe\xda\xb3\x09\xb9\x11\x87\x59\x76\x04\x43\x9a\x57\xea\x0e\x1b\x0d\xb6\x34\xee\xd7\xb6\x11\xb3\x27\x89\xcd\xed\xbd\xf6\x87\xc0\x43\xd0\x9a\x36\x37\x51\x09\xa8\xcc\x3c\x44\xce\x32\x06\x1f\xe7\x5a\x6d\xf0\x44\x54\x95\xe2\x13\x64\xe5\x86\x35\x50\xe3\x89\x9a\xe3\xea\x06\xb3\x4b\x76\x2b\xe8\x6b\x1a\x1c\xe0\x68\xbe\xb4\x86\x46\x51\x0e\x9e\x00\xe2\x14\xd8\xde\x89\xd1\x1e\x09\x36\xa1\xdc\xb7\x09\x23\x81\x1c\x0a\xea\x9a\xac\x90\x75\x56\x45\xb9\xe6\x38\x31\xbc\x31\xd7\xba\xca\xca\x39\x93\xd0\x58\xe5\x79\x5a\x82\x0c\x9a\x1e\x11\x0f\x2a\xbb\x2e\x97\xaa\x9a\xe3\xbf\x5c\x5e\x79\x12\xea\x6e\x0f\x1f\x5d\xc6\x51\xd8\x97\xec\xe0\xcf\xae\xdc\x79\x76\xe3\x99\xe2\xa9\xd9\x75\x74\xb7\xa7\xeb\x70\xba\x95\xed\x5a\xe9\xdb\xf2\x93\x9e\xfb\xac\x57\xa1\x9c\x8d\x00\xc9\x3e\x28\xd1\x30\xe1\x95\xca\x32\xe6\x89\x34\x65\x0e\xe9\x1a\x2e\x75\x0f\x26\x63\xa9\xe6\xf4\xd4\x03\xe9\xc3\xe1\x36\xb5\x12\xfe\x19\x4b\x78\x14\xe5\x0f\xca\x71\xde\xef\xd1\x11\x0e\x85\xe7\x3f\x40\x6e\x52\xc0\x07\x93\x8c\x79\x0b\x57\xda\x94\xf9\xad\x9e\xfb\xa0\xf7\x74\xe3\xbd\x9a\x95\x34\xba\xae\x31\x58\x7b\x24\xb0\x8a\x9f\x4e\x31\x5d\x63\x74\xbb\xee\x1a\xa9\x3f\x31\xb4\xea\xe8\x9c\x71\x22\xe9\x56\xe5\x4d\x40\x8c\xd1\xca\x6f\xfe\xb2\x8d\x40\x09\x17\xc2\x43\x51\xa8\x4f\xba\x20\x5a\x85\xd9\xac\x6c\xa0\x53\xd6\xce\x86\x63\xe4\xf2\xfe\x56\xf0\x97\xb2\x92\xae\x13\x38\x4f\x1b\xcc\x11\xac\xb8\x3f\xb0\xb0\xcf\x65\x0f\x3b\x8f\x74\x49\xb6\xc7\x81\x6e\xd1\xea\xd4\x9f\xb1\x53\xf6\xc2\xa7\x78\xb1\xed\x99\x46\x3c\xaa\x4a\xb8\x32\x04\x2b\x7b\xd0\x45\xe5\xef\x74\xbf\x0f\x19\x5b\xad\xd2\x46\xe7\xb9\xae\x0c\xe3\x79\xb8\xb8\x84\x9d\xbe\x6c\x1e\x68\x40\xe4\xab\x64\x0a\x26\xdf\x52\xa0\xfa\xf9\x15\x0c\x06\x80\x39\x16\xac\x3a\x05\x7f\x49\xe5\x37\x69\x60\xae\x44\x78\xc1\xa9\x20\x0d\x75\x30\x94\xe7\xbd\xd1\xf9\xf5\xe5\x78\x62\x2d\x05\x44\x93\x76\x7f\x42\x2f\x0d\x82\xea\x79\x1c\xbd\x16\x4a\x9e\xf0\x28\x79\x47\x49\x80\x50\x14\x83\x13\x21\x5a\xd2\xc7\xe1\x75\xc2\x36\xc2\x4e\x23\x20\x11\x0e\xb4\x70\xcc\xbf\x43\xe0\xa3\x58\xff\x86\xe6\xed\x73\xe3\xeb\x2b\x6b\xac\x8d\x58\x51\x67\x08\x3d\x30\xa5\xba\xe3\x44\x78\xfc\xa5\xc9\x10\x9e\xb8\xea\x8e\xc6\xc3\x81\x43\x63\xf2\xa8\x88\x0e\x09\x31\x84\x47\xdc\x8b\x12\xcd\x86\xc1\xfb\x8e\x1d\x2e\x60\x35\x3d\x64\x2c\x3a\xb8\x27\xfb\x5d\x42\x3e\x14\xef\x86\xc3\x8b\x0f\xbd\x7e\x3f\x91\x1f\x86\xa3\x7f\x91\xe3\xc9\xf0\xea\xaa\xf3\xae\x9b\x80\xbf\xf2\xda\x36\xfa\xb6\xd3\xeb\x5f\x23\x46\xd3\x65\xa7\xff\xf6\x7a\x70\x8e\xad\x51\xe7\x01\xc7\xb2\xdf\xc7\x79\x14\xe7\xc3\x4b\x6b\x59\x86\x80\x8d\xf4\xb1\xee\xd8\x43\x33\xbb\xe9\xf9\x48\x8b\xf2\xbe\xf3\x7d\x57\xbe\xe9\xda\xbf\x0e\xac\xc9\xd8\xbd\x10\x8f\x62\x13\x8e\x53\xb6\xbc\x77\xee\x2f\x6a\x79\x30\x9c\x88\xce\xd5\x55\x1f\x7c\xb0\xfe\x8f\x76\x0a\x2e\xba\x9d\xc9\x7b\xc0\x7b\x84\xe5\xe8\xf4\x65\x6f\xf0\xdd\xf5\x08\x6c\xca\xeb\xfe\x84\x71\xac\x82\xde\x3e\x19\x07\x3b\x8d\x2d\xde\xee\x5f\x27\xdd\xc1\x84\xdd\x67\x76\x95\xfb\x9d\x0f\xf2\x6a\x34\x7c\xdf\x7b\x63\x8d\x50\x78\xdd\x77\x32\x95\xe3\xe1\x65\x57\x7e\x77\x3d\xea\x8d\x2f\x7a\x30\x97\x63\x71\x31\x04\xfc\xb0\x4e\xbf\x3f\xfc\x40\x8d\x9e\xf7\xaf\xc7\x30\xa6\x51\x6b\x84\x7e\x6b\xec\x05\xc9\x44\x64\xcc\xcb\xce\x47\x6a\xd1\x8f\x7b\x32\x44\x34\x30\xc0\x29\x7b\x6d\x8d\x68\xe8\xde\x79\x07\xd6\xa7\x43\xc3\x34\x68\x3e\x77\x2f\xaf\xfa\xc3\x8f\x5d\xdb\xde\x1e\x4b\xfa\xc9\xd6\x7c\xfb\xd6\xed\xb7\xae\xd3\x71\x2a\xff\xd3\x8b\x93\x54\x0e\xca\x7a\xc9\xc0\x3e\x90\x7b\x24\x5a\xa1\x1c\xb2\x78\xd6\x95\x06\x9f\x33\xba\x7c\xd1\x37\x6a\x4d\x14\xba\xec\x9d\x9c\xad\xea\x8d\x9c\x6b\x05\xd5\x47\x10\xc3\x98\x95\x85\x69\x56\xba\x4a\xe5\xe9\x49\x2a\x2f\x7b\xe3\xf3\x6e\xbf\xdf\x19\x74\x87\xd7\xe3\xb6\xfb\x32\x4a\xe3\x41\x3c\x1f\x28\xfa\x73\x22\x15\x60\x2e\x75\x55\x20\xdc\x12\x16\xb8\xad\x20\xd5\x50\x32\x2e\x4a\x40\xfc\x40\xfe\xe4\x2d\x97\x93\x55\xee\x08\x96\x32\x90\xb2\xdb\x08\x02\x94\xea\x44\xa0\xc1\x6e\xa6\x76\xcf\x0f\xa6\xec\x80\x92\xe0\x55\x20\xf2\xcf\xa9\x62\xc3\x1a\x5d\x5d\xa9\xb9\x5e\xa9\xea\x93\xd9\x4a\x3a\x20\x44\x03\x5f\x9c\x9c\xb8\xac\x5e\xfa\x33\x5c\x9b\xbe\x05\x81\x41\xc4\x38\x42\xcb\xb5\x65\xfb\xca\xcf\xe2\xc0\x2c\x24\xe2\xb4\x97\x21\x33\x5b\xa1\x9e\x5c\xdd\x41\x87\xdf\x66\x45\x0e\x71\x2e\x77\xb1\x11\x31\xc2\x22\xcf\x66\xf5\x71\xb9\x38\xce\xd5\x1d\xd6\xab\xa3\x3b\x15\x3c\x00\xf3\xcc\xac\xa1\xa8\x94\x79\xfb\xc0\xc4\xe2\x0c\x55\x17\xe0\xcd\x8c\xec\xb8\x95\xc6\xbb\x6b\xaa\x49\x4f\xa1\x2c\x65\x0a\x1c\xa9\x6a\x9a\xd5\x95\x82\x38\xd9\x7a\x5d\x66\x7c\x4d\xc2\x72\xeb\xa2\xae\x54\x2e\xcf\x97\x6a\x35\x45\x5c\x1a\xaa\x80\x82\xa4\x60\x1a\x01\xc6\xbe\xb9\x1d\x3b\x15\x00\xbe\x30\x07\x87\x87\x4f\x1e\x5c\xe7\x0a\xfd\xe3\xef\x75\x6e\xb2\xe2\x53\x96\x70\x03\x8c\x98\xd3\x2d\x6e\xc0\xa1\x9d\xab\xe2\xa6\x51\x37\x18\xf9\x8c\x31\x39\xa2\x71\x65\x46\x2e\xca\xa6\x98\x4b\xe0\x68\xc2\xd2\x65\x5d\x2c\xca\x6a\xa6\x31\x37\x3d\xab\xd1\x8f\x03\xb1\x5b\x74\x4d\xd8\xef\x80\x52\x40\x85\x09\xe0\x61\x51\xb9\xa7\x33\xd4\xfe\x03\x1c\xa1\xc6\xf9\x23\x2f\x07\xbc\x8c\x01\x4a\xff\x29\xcf\x33\xc4\xf9\x58\x48\x82\x22\x4f\x4f\x53\x70\xdf\x0d\x07\x4e\xc2\xbf\x1d\x8e\x04\x78\xaa\xec\x99\xed\x18\x39\xd5\xf5\x9d\xd6\x45\x10\xf9\x6c\xd9\x7f\x5c\x4c\x4a\x55\xa7\x66\x2b\xd1\x1d\x4b\x4e\xc1\xa4\x63\x8e\x49\xda\x1d\xfb\x73\xac\x89\xee\xd1\x76\xb5\xa9\xb3\x3c\xfb\x57\xa7\xa5\x86\xa8\x03\xdb\xe1\x48\x38\x95\x1c\xb6\xbd\x2b\xab\x4f\x68\xbd\xfa\xce\x87\x1d\x8f\xc8\x40\xb5\xa0\xcc\x7d\xea\x3c\xe5\x2a\x21\x52\xdc\x0f\x4d\x86\xa1\x6c\x28\x07\xf5\x02\x82\x1c\x69\x99\xf1\xf4\x03\x2e\xe1\x75\xaa\xe5\xdc\x2e\x14\x63\x5c\x98\x3a\x83\x20\x13\xc2\xe3\x30\x1b\x5d\xb9\xf0\xf1\xe2\x54\x76\xff\x0a\x37\x96\xec\x60\x3d\x55\x08\x2d\x03\x43\x05\x6f\x8e\x02\x03\x20\x2a\x0e\x8e\xe0\xf1\x64\x00\x8e\x27\x0f\xeb\xa5\xf6\x98\x44\x47\xaf\x1d\x71\x9b\xdd\x74\x8d\xd1\x41\xbb\x94\x49\xb9\x27\x57\xc1\xa7\x21\xfa\x48\xe5\x4e\x82\xb5\x40\xb6\xc4\xd5\x54\x76\x26\xd9\x2b\x8f\x65\xb5\xe2\x61\xc4\xcf\x18\x57\x38\x40\x15\x4e\xe5\x58\xeb\x38\x72\x44\x75\x46\x8e\x5d\x85\x0f\x29\xc9\x37\x8f\x57\x01\xbb\x20\x8c\x63\x6e\xf5\x9c\x8a\xd9\x76\xa0\x8c\x19\x21\xfe\xeb\x17\xfd\xa4\x21\xa7\xf0\xcf\x9f\xe5\x7f\xde\x68\x55\xfd\x97\x60\x1b\x82\x85\x4e\x32\x73\x84\xfd\x1a\x79\xcc\xfa\x60\x93\x1e\x9a\xa3\x6f\xe5\x97\x7e\xf4\x9f\x0d\xe0\xf8\x1b\x7f\xd2\xa7\x97\x4d\x5e\x67\x33\xf3\x0f\x44\x00\x7d\x8c\xff\xeb\xd5\xab\x36\xfe\xe7\xb3\xb3\x17\x2f\xbe\xe2\x7f\xfe\x11\x3f\xb4\xfa\xee\x50\xbf\xcf\x4c\x5d\x56\xd9\x4c\xe5\xf2\x8d\x9a\x7d\xba\xa9\xec\x6d\x4a\x1a\x8c\x9e\x67\x21\xf4\x02\xbf\x6a\x7c\x3d\x27\x03\x13\x6f\x23\xa1\x67\x1e\xad\x18\x6f\xa5\xb2\xe0\x0c\xff\x4b\x65\x8c\x9a\x2d\x1b\xab\x8a\x18\xd9\x73\x42\xbb\x5c\x78\x66\xea\x8d\xd5\x3f\xde\x55\x65\xb3\x96\x6f\xae\xfb\xfd\x00\xbb\x0f\xfe\xf7\xfd\x40\xf6\x82\x2c\xf7\xf1\xc6\xd4\x7a\x65\xdb\x9a\xa5\x92\xd5\xe4\xa0\x3a\xa4\x0c\x60\xb6\x66\x19\xd4\xec\xba\xd4\xfc\x14\xc7\x0a\xfd\x8b\x8a\x30\x72\x53\x02\x34\x9c\x35\xf6\xb5\x1d\x48\xa0\x1f\xcc\xca\xd5\xaa\x2c\xa2\xaf\x18\xa8\x64\xfe\x92\xa1\x79\xca\xed\x12\x94\x2e\xc0\xd4\x61\xde\x4b\xac\x36\xcb\x66\x89\x78\x5f\x16\x7a\x03\x40\x49\xfb\x86\x9a\x48\xff\x0c\x4c\x0b\xfe\x12\xa6\x4d\xe3\x6f\xec\xd4\xdb\x7f\x88\x87\x66\x8c\x2e\xb8\x10\xa4\x90\x2f\x43\xe2\xf0\xb1\x06\x02\xbc\x91\xf2\x2e\x10\xe1\xd3\x77\xca\xb8\x70\x0d\x68\x8e\x5f\xb6\xc4\x84\x53\x2f\x2e\x3b\xe7\xf2\xf0\xf4\x9b\x97\xcf\x8e\x4f\xbf\x79\x75\x72\x94\xc8\x4a\x17\x6a\x45\x49\x15\x97\xbd\x89\x9f\x2a\xf4\xcb\x9f\xf3\x62\x8e\x69\x31\xed\x28\x3b\x55\x9d\x11\x6a\x3e\x16\x51\x11\xed\x35\x29\x96\xab\x6c\x2e\x6d\xeb\x26\x09\x2e\xa3\x5c\xab\xb9\xaf\xcc\xba\xaa\xca\x85\x36\xa6\xac\xe4\x5b\x5d\x15\xaa\x98\x97\xe2\xbb\xd2\x00\x93\xd9\x54\xd5\x65\x2a\xaf\x8d\xae\x40\x3d\x37\x19\xb6\xa0\x6a\x77\x28\x22\x50\xa9\xa9\x36\x75\x40\x13\x50\xcd\x96\x59\xad\x21\x35\x5f\x20\x16\x58\xa1\x6e\xd0\x4a\xa4\x81\xb0\x87\xd9\xc7\xeb\x20\xe2\x50\xda\x8b\x59\xcf\x1a\x58\x00\x2a\x3b\x31\xa9\xbc\x6c\x25\x1e\xb4\x17\x09\x2a\x57\x08\xce\x51\xcf\x83\x2e\x66\xc5\x2c\x5b\xe7\xda\xb8\x55\x84\x95\x0b\x34\x08\xab\x86\x9f\x7e\xf3\xea\x85\xdd\x12\x67\x27\x27\x27\xc1\x29\x6c\x72\x48\x35\xed\x36\xb6\x87\x09\x83\x88\xda\xd1\x82\xf5\x3b\xdd\xe0\x23\xf1\x3e\x13\xf1\x76\x45\x0c\xde\x19\x4e\x32\x84\x0b\x6b\x5d\xd9\xb9\x9a\x72\x69\xa1\xfd\x2d\x16\xf0\x15\x58\x5a\xe0\x76\xb8\x80\xe6\xf1\x84\x17\x73\xf9\xf8\xe9\x90\xa9\x3c\xfe\xf5\x3f\x42\x5c\x79\x3a\x63\xc6\x50\x41\x0e\x5e\x06\x71\xda\x4e\xcd\x33\xda\xad\x12\x6b\xf1\x59\xcb\x46\x74\x60\x0e\x04\x14\x8c\x19\xc7\x54\x64\xbf\xd0\xa0\xd2\x85\x30\x31\x7a\xde\xce\x77\xc5\x0d\x96\x97\x77\xa2\x8d\x40\x0f\x6d\x2d\xbd\x40\x9f\x3a\x81\x6e\xed\x3a\xad\xaa\x56\x05\x98\x4b\x82\x9d\x96\xf5\x12\x8b\xe4\x7e\x41\x8b\xf0\xb2\x15\xf3\x7e\x9e\x28\x2e\xe7\x3f\x46\xf9\xed\xe0\xb2\x0d\x67\x21\x89\x13\x70\x1d\x2f\xe0\x65\x6f\x92\xc8\xf7\xbd\x71\x82\xd2\xab\xac\x9c\xb8\x27\xd6\x0c\x40\xa0\xb0\xa3\x98\xdf\xea\xaa\x26\xda\xfa\x0a\x73\x6c\x66\x19\x82\x23\x33\x2c\x64\x68\x79\x04\x51\x20\xb7\x42\x3c\xeb\x8f\xb3\x05\x46\xfc\x48\xaf\xce\xc4\x17\x4b\xb8\x47\x77\xaa\xb0\x3b\x35\x54\x64\xcf\x4e\x4e\x5e\xc2\x61\x7a\xe4\x9a\xdb\xf9\x8e\x3d\x21\xe3\xce\x78\x97\xc6\xcb\x7a\x6b\xfa\xb4\x9f\xf5\xb3\xbf\x1c\x8f\x8e\x4f\x7f\x57\xce\xf7\xf0\xe7\x61\xfd\xef\xec\xf4\xe4\x65\x9b\xff\xe3\xd9\xd9\xab\xaf\xfa\xdf\x1f\xf2\xc3\x84\xda\xfd\x6c\x0a\x79\xb0\xf2\x2f\xcd\xfd\xe7\xa9\x9e\xc9\xff\xe7\xff\xf8\x6f\x72\x74\xff\x79\x96\xad\xab\x72\x96\xd5\xf7\x9f\xe5\x21\xed\x94\x08\x0a\xfe\x94\x09\xe3\xaf\xaa\xfb\xcf\x6a\x35\x6d\x72\x2d\xc4\xb9\xae\x6b\xed\xe8\xb7\xcd\x13\x48\x52\xfb\xa1\xd1\xf2\xfe\x27\x59\x03\x7a\x48\x79\x93\xcd\x32\xed\x73\x49\xef\x3f\x5b\x8d\xab\x96\xb9\x96\xf6\xe0\xe4\x2a\xc3\xde\xcc\xab\x32\xab\xc5\xfc\x89\x6a\x6a\xdd\x54\x72\x5d\xd9\x1e\x19\x2d\x7f\x68\x9e\x64\xb9\x84\x6b\xb5\xf9\xbb\xae\xa5\x6a\x7e\x04\xff\x8a\x36\x72\xae\x65\xae\xe4\xbe\x71\x89\x07\xc6\x25\x0f\x67\xd9\xb1\x5a\x57\xf7\xff\x06\x79\x75\x3a\xbf\xff\x0c\x6d\xfd\xfc\x7f\xfe\xfc\x13\x0d\xe6\xe7\x9f\x7e\xfe\xef\x47\x8e\xa6\xfd\xe2\xfe\x33\x03\x6d\x1a\x21\x2e\x54\x61\xec\xe3\xb6\x93\x46\x17\x7e\x06\x12\x3b\xee\x55\x99\x15\x46\xda\x49\x20\xb0\x5a\xfd\x63\xad\x65\xf1\x24\x2b\xe6\x30\x35\x4d\x21\x8d\x2e\xb0\xd2\xe1\xfe\x73\xa5\x21\x59\x00\x20\xe3\x35\xc4\xe5\xab\x6f\x85\xb0\x1d\x99\x95\xc5\xec\xfe\xf3\x5c\x15\xb5\xed\xcb\xcf\x3f\x7d\xbb\x7b\xce\xa4\x9b\x33\xd3\x54\xf6\x11\x9e\xf2\x44\x42\x4e\xb5\x95\x4d\x6b\x5d\x99\xb2\x28\xb4\x98\xdf\xff\x77\x8c\xf4\x5b\xeb\x37\x33\x76\xd8\x6b\x55\x49\xa8\xa8\xab\x8a\x4c\x57\x76\x00\xe8\xcf\xd2\xd5\xce\x21\xbe\x76\x9d\xa3\xeb\xaf\xa9\xbe\xb0\x7b\x5b\xbd\x09\x7a\x21\xb6\x7b\x61\xca\x66\xa5\xeb\xda\xaa\x51\x00\x78\x40\x73\x21\x9b\x42\x47\xea\x77\x2a\xaf\x03\x7d\x5c\x37\x95\x80\xfd\x65\x5a\xa6\x80\xc6\x72\x48\x50\x8e\xec\xb0\x55\xe3\xf7\xa6\xfd\x1b\x2a\x77\xf7\x9f\xab\xfb\xcf\xa0\xe4\xc3\x3a\xf9\xcf\x0a\x5d\xc8\x4a\xdf\xa8\x6a\x6e\xb7\x5d\xab\xf1\xf6\x9c\x64\x65\xc1\x73\x12\x1f\x02\x2e\x68\x85\xa5\xc1\xf4\x09\xd8\xc5\xed\xbf\x0b\x3b\x78\x6b\x87\x01\x1f\x67\x9d\x15\xf7\x9f\xed\x94\xdc\xff\x7b\x8d\x9e\x6a\x1a\x85\x9c\xc3\x46\xf4\x0d\xbc\x86\xfd\x6a\xfb\x12\xde\x7f\xc1\xfa\x2c\x94\x5d\x11\x2d\xe7\xf7\x9f\xf3\xec\xb6\xd2\x15\x4d\xe7\x3a\x83\x15\x0b\xda\xf1\x47\x21\xbb\xff\x1c\x8e\x26\x58\xbf\x1f\x9a\x0c\x72\xda\xef\xff\x6d\xae\x77\x37\x64\x47\x60\x9f\x02\xe0\x00\x2d\x72\x7b\x6a\xed\xae\x30\x3c\xb5\xf7\x9f\x01\xbf\xc9\x6e\xb5\x78\x83\x71\x0b\xfc\x69\xdb\xfc\xff\xfd\xdf\x9a\x5b\x54\x95\xeb\xfb\xcf\x37\xbc\x79\x73\xdd\xda\x69\x89\x04\x44\x03\x2b\x3a\x9a\x82\x6f\xfd\x95\x16\xf3\x27\x98\x31\x0e\xbb\x51\xc3\x16\x69\xe9\x26\x6b\x48\xd1\x51\x3f\x34\xf0\xfe\xc3\xfb\x59\x28\x16\x52\xf7\x9f\xed\xa7\xe0\x15\x27\xa7\x20\x6d\xb0\x25\xa9\xf6\x9d\x25\x2f\x23\xef\x3f\x57\xd9\x6d\x3c\xdd\xdb\x9b\x43\x5a\xf9\x9b\xc3\x67\xed\xf0\x9b\x42\xba\x75\x4a\xec\x91\xaa\xb4\x20\xe1\xe3\x5f\x6d\xe0\x31\xfe\x5f\x44\xed\xb2\x8f\xc3\x0a\x56\xe5\xbc\xc9\x6a\xfb\x10\x41\x05\x66\xb5\xed\x6e\x5d\xd6\x2a\xb7\x72\x53\xc0\xeb\x9c\xef\x03\x95\x1b\x55\x6d\x35\xd4\x5d\x5b\xa6\xfd\x8d\x78\xeb\x84\x78\x61\x5b\xbd\x87\x69\xb2\x4b\x36\xd7\x46\x2e\xb2\xd9\x32\xd3\x95\x11\x04\x43\x1c\x6e\xaa\xb2\x91\xda\x1e\x02\x8d\x33\x54\x94\xcd\xad\x56\x0d\xbf\xc2\xc0\xc5\x76\x6c\x7c\x56\xec\x74\x88\x78\x3a\x76\x8e\x47\x07\x42\x88\x4b\x82\xdc\x0d\x33\x6f\x6f\x34\x21\xc6\x65\x63\x24\x2c\x6b\x75\x0b\x65\x16\xf1\x8a\xbb\x6b\x01\x6f\x02\x16\x61\x24\x60\x41\x06\xb9\xc1\x37\x85\x16\x7c\x91\x16\x56\x60\x39\x00\x48\x5d\xcb\x1c\x2f\x37\x2d\x2b\x3d\xd7\xb7\xaa\x98\x69\x23\x73\xbb\x76\xf6\x6b\x75\x0d\x55\xdb\x4f\xf0\x90\xd9\x03\x61\x04\x9d\x32\xd3\x64\xb7\x00\x39\xd9\xba\x1b\x7e\xfe\xe9\x5b\x18\x9d\xbd\xd1\x7f\xfe\xc9\x1a\xc0\xf3\xc6\xee\xf2\x60\x0f\x54\x3a\xda\x04\x7b\x27\xed\xb5\x10\x67\x3f\xff\x24\xbb\x3f\xde\x7f\x9e\x81\x49\x4b\x6d\xd0\x5e\xaf\xbe\xac\x15\xc9\x15\x01\xb3\xd7\xdc\xb1\x67\xb6\x63\xf6\x57\x5f\xda\x06\x2e\x18\xfc\x27\xd6\x4b\xec\xa9\xc4\x39\xb7\x32\xc3\x80\xd0\xcc\x56\x59\x0d\xb9\x1c\x55\x66\x2f\x21\x95\x6b\x14\x09\xfe\x6f\x73\xfb\xe7\xd5\xda\xa4\x42\xf4\x71\x6e\xb3\x99\x0b\xa6\xe2\x56\x71\xd2\xcc\xeb\x27\xf7\x3f\xd9\xce\x46\x18\x25\x24\xa4\x82\xcb\x64\xde\x60\x5d\xc9\xf6\xde\xb6\x5b\xc5\x8a\x1f\x39\xb7\x1b\x0d\x05\xbe\xb1\x9b\xcc\x8e\xd8\x1a\x04\x3a\x5e\xf3\x8d\xb5\xb9\xca\xaa\x06\x70\x3b\x13\xe3\xf1\xa5\xb2\x1f\x6d\xbb\xb5\x6e\xec\xcd\x6f\x4c\xe6\xfa\xa7\xa3\x5d\x21\xec\x24\xad\xd6\xea\xc6\xde\x37\xf3\x27\xf6\x93\xe5\x62\x81\x1b\x2f\x7e\x63\x6f\xef\x61\x02\x17\x95\xca\x8c\xb0\x26\x60\x7e\xff\x19\xc4\x6b\x56\x01\x11\x80\x15\x4e\xa8\x1a\xcd\x74\xf3\xa3\xb4\x8f\x95\x05\xe4\x3a\x19\xa9\x16\x90\x86\xc4\xc3\xab\xe8\x00\xdd\xe2\x43\xad\x29\x4b\x69\x85\xa9\x7b\x7e\xae\x20\x42\x67\x1b\x29\x9c\xb2\x30\x6f\xe0\xc2\x0f\x3e\x86\x1b\xe5\x79\x1a\xc3\x3a\x89\xbe\x0e\x8e\x23\x4c\x56\x30\x68\x3b\xbb\x64\x3d\x47\x03\xb6\xd3\xb4\x2d\x59\xad\xc8\x64\x69\x9e\xe0\x02\x06\x52\x82\xf3\x3d\xf1\xac\x86\x84\x71\x74\x5e\xb5\x91\xd1\xf9\xec\x07\xb2\x3c\x18\x6c\x7b\xb9\xec\x35\xbb\x5a\xd3\x7d\x65\xe7\xb8\x8e\xee\x1a\x7b\x4c\xc7\x59\x74\x31\x28\x79\xff\xd9\x1e\x29\x7f\x23\xe4\xe1\x24\xc0\xb7\x74\x61\xd5\x06\x5c\x0f\xc0\x95\x82\x8c\x46\x2d\xec\x11\x47\x05\xd6\x6e\x02\xbb\xee\xb3\xa5\x9a\xb5\xc4\xb7\x6b\xd9\x90\xda\xaf\x28\x7d\x9c\xd6\x19\x56\x08\xae\x6b\x41\x6d\xbf\x16\xe2\x19\x0c\xd9\xd8\xbe\x59\x8d\xb9\x06\x80\xf1\x86\x3f\x6e\x6c\x77\x8c\x5d\xdd\xfb\xcf\xb5\x02\x0d\x89\x8f\xa1\xd7\x00\xe0\x30\xa8\xea\x87\xc6\xca\x42\x74\xdb\x5a\xe1\x88\x7f\xb8\x51\x95\x2a\xea\x0c\x5b\xa5\xbb\x59\xd5\x56\xea\xd7\xa0\xfd\x41\x6e\x84\x42\x23\xc5\x4d\x55\x01\xfb\xec\x56\x17\xb5\x58\x2b\x43\x2b\xc0\xa3\xc3\xa6\xec\x8e\xaf\xb2\x95\xfd\xdf\x96\x25\x30\x7b\x60\x34\x85\x16\xa6\xcc\x30\x39\xd0\x17\xf9\x18\xdb\xc0\xae\xad\x25\x83\xad\x65\xe7\xb4\xb8\xff\xcc\xfb\xf9\x34\x8d\x0d\x1e\x21\xce\x97\x56\x99\x91\x8b\x32\x73\x16\x49\xb0\xba\xbc\xbb\x63\xab\x21\xbe\xab\xf0\x84\xa9\x46\x82\xae\xb3\xce\xec\xc1\xca\x2a\x2d\x48\x0d\x9f\x11\x66\x7e\xeb\x7e\x91\x46\xe7\x65\x01\xbb\xfb\x61\x15\xc8\xca\x28\xd1\xda\x70\xf6\x93\x19\x6b\xa6\xfe\x0b\x5f\xd8\xa2\x00\x25\x2e\x56\x9d\xdc\xdc\xa1\x35\xe9\x06\x9e\xfe\x9a\x19\xda\xab\x4d\x89\xc0\x80\x81\x81\x28\x03\x19\x3b\x32\x7f\x12\x20\x54\xcc\x9f\xe8\x62\xbf\x34\x4d\x70\x58\x62\xa5\x8a\xec\xfe\xdf\x40\xd9\xbd\xff\x7c\xdb\xc0\x0a\xd4\x55\x99\x99\xec\xfe\xdf\x56\x5a\xaa\xdc\xda\x04\x0a\x35\x26\xc8\xff\xcc\xf5\xcf\x3f\x3d\xe3\x8d\x70\x96\x82\xab\x5c\xd5\x18\x69\xb7\x3b\x81\x6d\xd6\x95\x86\x32\xe0\xf2\xfe\xff\x8a\x87\x6a\xca\x66\xa9\xe0\xda\xf3\x5d\xdb\xb9\xfd\xb0\xe0\xf9\xfe\xb3\x68\xed\x4f\x3b\x58\xab\xf8\x66\xb8\x71\xfd\xed\x3b\xa3\x9e\xe4\x3a\x91\x2b\x95\x91\x20\xc8\xe0\x44\x19\x5d\x59\x8b\x64\xad\x8c\x70\xe5\xc0\x30\x41\xb1\x84\xc4\x15\xdf\xb9\x35\x13\xd0\x1c\xf2\x66\x6b\x3f\x08\xbf\x77\x92\x2f\xd9\x4b\x91\xb4\x0c\x3a\x9d\x0a\x71\x1d\x2a\xa9\x60\xce\x98\x3a\x30\x0d\x48\x53\x5b\x3c\x6e\x92\xfb\x49\x12\x7b\x27\xc9\x4e\x0b\x5c\x3e\x56\xca\x18\xda\x00\x2a\x2f\xb3\xca\xf7\x12\x46\x9e\xca\x5e\x6e\x07\xaf\x4d\x6d\x45\xdc\xea\xfe\xdf\xad\x72\xc0\x9b\x5f\xe3\x6d\xeb\x8d\xb5\x1d\xa6\x3f\x5a\xd9\xe6\x98\x06\xa7\x2b\x52\x55\xc4\x6f\x1b\x5b\x6b\x03\x88\x68\x2e\xbb\xb1\xad\xad\x9d\xb1\xbd\x73\x2e\x70\x24\xfc\x07\xd4\x82\x01\x69\xac\xb9\xbd\xff\xac\xed\x2d\x3b\xd3\x10\xfe\x71\xc6\xa0\x02\x32\x64\x9f\x56\xf0\xb6\x6c\x8a\x39\xe5\xb7\x34\x32\x7f\x12\x12\x20\xf6\x28\x43\xfb\x56\x27\x82\x9d\x52\x45\x06\xb6\x84\xbd\xa4\x23\xdf\x11\xfa\x08\x56\x6b\x55\x41\xaa\x0a\x4a\x7b\x2b\x86\xed\x54\xdc\xff\x24\x67\xda\xea\xe3\xed\x3d\xe8\x0c\x00\xd0\x8b\x60\x34\x20\x69\xf8\xf6\xc8\x8a\x79\x85\xb8\x09\xd6\x42\x2d\xea\x96\x5e\x7e\x8e\xd1\xc6\x8b\x20\xe2\xa6\x8a\x79\x8c\x01\xe3\x58\x1c\xcf\x2f\x2e\xfa\xc7\xa7\xe9\xc9\x11\xb7\x70\xe6\x5b\x00\x3d\x7a\xb6\x3b\x87\xe5\xfc\x2a\x7e\xed\x19\xbc\x56\xd4\x15\xdc\xad\x6e\xf2\x43\x3f\x05\x2e\xc4\xb9\x3e\x87\xc4\x5a\x2e\x7f\x3d\x4b\x4f\xe5\xe1\x79\xd7\xfe\xf2\xf8\x2c\x3d\x75\x0d\x3e\xff\x65\x0d\x1e\x9f\xbb\x56\xce\x5d\x1b\x2f\xac\x89\x31\xcb\xb3\xb5\xd1\xed\xc1\x1c\xcb\x5b\x1c\x48\xb7\x35\x90\x97\xf6\x1d\x88\x5a\xa9\x42\x5e\x17\xd9\xd6\x3c\xf8\xae\x9f\xda\xae\x77\xaf\xaf\xfa\xf2\x36\xb5\xff\xe3\xda\x78\x65\x55\x91\x2f\xf7\x9c\x2e\xac\x2a\x1e\xb7\x4a\x3e\xc7\xff\x35\x6a\xf6\xcf\x3f\xff\x24\xdf\x0d\xae\x5d\xf0\x77\xcf\xfa\x9c\xc9\x43\x78\xea\xaa\x7f\x7b\xe6\xde\xfd\xe6\xcb\xde\x7d\xe6\xdf\x7d\xe6\xde\x3d\x3d\xa1\x97\xfb\xda\x18\x5d\x3d\xfa\x7d\x3b\x00\x78\x1c\xba\x10\x0c\xe0\xf4\xf4\x17\x35\xf4\x2c\x68\x26\xe8\x8d\xdd\xa1\x97\xe5\xbf\x66\x79\xae\xf6\x77\xe1\x44\x1e\x5e\x5e\xd9\x1d\x45\x2b\xfb\x22\xc0\xac\x43\x7f\x6c\xcb\x0a\x07\xc3\x05\xdc\xa9\x74\x9d\x65\xc5\xac\x06\xea\x11\x2b\x4c\x22\xaf\x20\xfa\xd9\x34\xbb\x22\x22\x37\x62\xec\x76\x04\xc1\x9a\x31\x39\xfc\x96\xe7\x0d\x6e\x32\xd7\x5c\xec\xfa\x01\x99\xcd\xa2\x80\x0b\xe7\xe5\x25\x6a\xa7\x32\xd0\x4e\x85\xe8\x3b\x9f\x81\x2c\x9e\x78\x37\xc1\x0c\xec\x5d\x1f\x6e\xe3\x4a\x79\x54\x11\x7e\xf0\x8e\x00\xb8\x4d\xe7\x4f\x20\xab\x0f\x8a\x29\xbc\x1a\x1c\x7e\x48\xce\xc3\xb1\x91\x61\x46\x8a\x6a\x9e\x13\x40\x88\x69\x99\x9a\xd9\xdc\x6a\xac\x8b\xcc\x36\x0b\xa8\xaf\xb7\xba\x80\x2c\xb6\xc0\x1e\xc2\xd1\xbd\x4a\xe5\x3b\x56\xb1\x85\x18\xab\x66\xc1\xda\x2e\xce\xb0\xbd\x59\xda\x97\xf9\x6e\x55\x0b\xc4\x26\x8d\x9f\xb5\xf6\x44\xd8\xe9\xad\x32\x03\xa3\xd2\xb5\x04\x31\x9c\x1b\x52\x86\x66\x3f\x34\xd6\x28\x69\x2a\x12\xc6\x5b\x3e\xc9\xc4\xbe\xc3\x32\x59\xd8\x5b\xab\xd2\x95\x6c\xbb\xcc\xd6\x4d\x66\x0c\x5c\x02\xeb\xd2\x0a\x69\x52\xc7\xa7\xda\x94\x59\xb0\x00\xe8\xef\xc0\x87\xed\x1d\x52\xa0\xda\x64\x37\x63\x93\x5b\xeb\xc4\x1a\xf3\xb3\xb2\xf8\x01\x94\xcd\x31\xba\x17\x74\xd5\x1e\x3c\x6c\x59\xff\xa8\x64\xf5\x2f\x91\x55\xa6\x0b\x59\x3c\xd1\xab\xf5\xfd\xbf\xcf\x96\x3a\x72\x98\x89\xf9\x13\xd2\x95\xad\x4d\xf0\x04\xee\xea\x4a\xef\x30\x71\x1a\x8e\xc7\xe2\xfa\xfc\x39\x95\x23\xcc\xc4\x54\x4e\x3f\x8c\x8c\x5f\x0d\x85\xbd\xf4\x44\x8e\xae\x10\xab\x50\xdb\x8b\x8d\xb2\xd7\x79\x84\x05\xca\x74\xef\x20\x99\x7b\xef\x13\xfb\x5c\xda\x2e\xde\x14\x3e\x17\x8c\xdf\x6a\x82\xaa\x81\xcd\x8b\x37\x63\xad\x8b\x26\xee\x41\x13\x7e\xdc\x34\xd3\x8c\xdd\x2a\x7e\x36\xd0\xa7\x8e\x5e\x38\x6b\x7b\x92\x3f\xd7\x4e\x2b\x6c\x6d\x00\x57\xc6\x4d\x2e\x0d\x59\xb6\xb9\x9d\x5e\x75\xab\x67\x41\xf7\xa4\xae\x43\x4f\xb5\x3d\x5e\x1b\x69\xca\xc2\x3b\x91\x88\x5c\xe6\x1b\xb0\xb7\x0c\xa4\x99\xa3\x07\x61\x87\x3d\x82\x93\x89\x8f\x59\x2d\x65\xae\xe5\x3a\xd7\x59\xc1\xea\xd4\xfd\xbf\xb1\xe1\xb1\xe3\x8b\xc2\x4f\xa1\x9d\x23\xdb\x07\xab\x16\xc2\x64\xdb\x5f\xce\x4a\x88\x12\xa3\x97\x25\x14\x3b\x41\xa7\x4d\x9d\xad\x9b\x1c\x3b\x3d\x61\x0d\x24\x91\x06\x3c\x01\xf3\xfb\xcf\x0b\xd5\xd4\xa4\xde\x54\x55\x76\xc3\x61\x05\x6b\xc8\xdf\x7f\xce\x15\x28\x35\xcf\x4e\xe4\xdf\xcb\xa6\x32\x14\xfc\x58\x57\x99\xdd\xee\xb0\x86\x85\xca\x8c\x01\x39\x40\x8b\xec\x34\x4e\x5d\x70\xf3\x09\xc6\x01\xac\xed\x65\x9e\xa8\x1b\x3b\x6c\xbb\x9e\x7a\x05\xa6\x12\x3d\x23\xc2\x15\x88\x3c\x76\x40\x78\x08\x3e\xde\x54\x88\x2b\x67\xde\x71\xdf\x4d\x33\x35\xf7\x9f\x21\x23\x86\xa5\x0a\xac\x00\xcc\x89\xfe\x11\xc3\x7c\x91\xc4\x83\xf6\x8b\xfb\xcf\x00\xb9\x6a\xad\x59\x70\x3e\xc1\x2a\xf8\x3e\xc0\x16\xd9\xd3\x09\xb8\x4a\x53\x5f\x63\x18\xbe\x08\x9b\x1b\xb2\xe7\xe1\x25\x7b\x29\x65\xd6\xfe\xb7\x32\x43\xdd\x80\x27\xc4\xa9\x10\x89\x34\xda\x48\xb5\x51\x8e\x66\x63\x47\xd0\x8e\x8c\x56\xbb\x85\x6e\x0a\x9d\x58\xeb\x00\xca\xec\xe6\xd9\x62\x01\xc0\x9c\x76\xc7\x3b\xd4\x17\x6b\x2e\x80\x7a\x8f\x5e\x06\xef\xa0\xd8\xba\x89\x24\xd9\xbe\x1e\x0d\x7d\xa6\x6f\x2b\x65\x57\xbe\x68\x56\xf7\x9f\xab\x52\x36\x45\x66\x25\x97\x1c\x67\x91\xad\x67\xa7\x6f\x7e\xff\xf9\xef\xf7\x3f\x71\xa4\x2a\xbc\xf1\x40\x98\x71\xa3\x66\x6d\x15\xa4\x85\x6d\x26\x91\xb3\x27\xe0\x28\xd5\x0d\xa1\xdb\xa2\x35\xc3\x08\x66\x76\xcf\x5a\xe1\xa8\xe0\x2c\x50\x75\x31\x39\x54\xf7\x49\x8e\xc0\xa7\x39\x5b\x5a\xf3\x18\xad\x24\x7c\x40\x57\xf1\x7a\x36\x60\x01\x3b\xa0\xfd\x59\x0d\x71\x1e\xe1\x66\x9c\xff\xd2\xe4\x35\x69\xf6\xda\xde\x8d\xe0\x8f\x9d\x29\x13\x1b\xcc\xf0\x65\xfe\x26\xb4\x8d\x61\x23\x87\x06\x13\x7c\x3a\x27\x9b\xd1\xed\x26\xda\x42\xa7\xa9\xbc\xc8\x6e\x01\xe0\x7b\xb7\x7d\xde\xda\xb2\x4d\x21\x57\x59\x91\x99\x1a\xef\x86\xa6\x90\x65\x75\x03\x50\xf4\x84\x36\x33\x23\xe7\xb8\x70\x87\x70\x55\x56\x2a\x0f\x62\x17\xf8\x58\x22\x67\xd5\xfd\x67\xbb\x17\x75\x61\x87\x5d\x37\xb4\x6c\x79\x89\x46\xcc\x93\x8e\x31\x7a\x35\x85\xc0\x38\xe6\x47\x2a\xc0\x9c\xf5\x1b\xb7\x75\x5a\xab\xfb\xcf\x37\x59\x2b\x20\x17\x40\xd6\x28\xaf\x35\x6b\x10\xbc\x33\x45\x8e\xb9\xa2\xd6\x86\xe3\x6f\x60\x91\x5b\x2d\xa0\xb0\xfb\x29\xd0\xb4\x8d\xae\x40\x94\xe9\x26\x37\x60\x86\xdd\x7f\x86\xdc\xfd\x74\x8f\xcc\x85\xc5\xc1\xab\xc4\x27\x1e\x90\xeb\x3f\x70\xb7\x46\x7a\x94\x49\xa5\x17\x8f\x22\xdc\xc3\xee\x10\x85\xce\xd7\xa8\x5d\xf4\xd0\xcb\xa2\x5c\x05\x61\x7d\x6a\x4f\x06\x7e\x52\xab\x54\x7e\xb1\x68\xd0\x24\xce\x94\x91\xf7\x9f\x67\xcb\xfb\xcf\xa0\xab\x39\x81\x81\x93\x6c\x2d\x57\xd7\xa7\x4a\xd7\x99\x35\xaa\xb7\x35\xba\x3d\x9a\x9c\x6c\x69\x72\x5a\x84\x67\xed\x9f\x9d\xb2\xf2\xf5\xe7\x77\xfc\x49\x9f\x5e\x91\x83\xe0\x1f\x57\x00\xf0\x70\xfe\xd7\xb3\x97\xa7\xcf\x5e\xb4\xf2\xbf\xce\x5e\xbe\x78\xfe\x35\xff\xeb\x8f\xf8\x01\xc7\xd7\x85\xaa\x15\xf9\x84\x8c\x3c\x66\x9b\xfb\xa2\x84\xea\xb6\x0b\x3d\xe7\xd0\xfc\xff\xe2\xdd\x4a\x76\xd7\x1c\x09\x71\x55\x69\xb5\x9a\xe6\x9a\xca\x77\x7e\x45\x63\x33\x44\xec\x75\x39\x17\xae\xaa\x4b\xd4\xa5\x54\x79\x5e\xde\x41\xf9\x54\x5d\xca\x45\xa5\x75\xbe\x91\x66\x09\xd0\x1b\x61\xd6\xad\xab\xa9\x82\xea\xb3\x1d\x19\xb5\x82\x73\x3b\xa1\x7a\x94\xf8\x94\x30\x18\x0a\xd9\xfe\xb9\xef\x89\x2b\x2a\xb3\xcd\x80\xe6\x55\x00\xf3\xfe\x54\x59\x11\x8b\x25\x4f\x59\xe5\xcb\xc4\x0e\x0f\xec\x5f\x0f\x8e\x5c\xe9\x54\x5d\xde\x20\x2b\x3c\x95\xd7\x21\xad\x6f\xbe\x49\x85\x80\x44\x6d\xdf\x18\xb2\x7b\xdf\x32\x62\xaa\x4b\xb6\x4d\xe5\xb8\x5c\x69\xf9\xf7\xa6\xca\xcc\x9c\x3a\x0a\x4e\x72\xc0\x61\x76\x39\xd7\x02\x30\x0d\x5c\xb6\x2a\xfc\xc3\x13\x32\x11\x8d\xf9\xad\x55\x04\xdd\x17\x67\xca\x01\x17\x1f\x98\x26\x93\x37\xba\xd0\x55\x66\x0e\x04\x3f\x22\xa9\x03\x6f\xca\x7a\x49\xc5\x0d\x06\x8a\x44\x8d\xaf\x03\x84\xbc\x6d\x48\x60\x55\x86\x60\x4f\x90\x11\x98\xcb\x04\x89\x63\x7a\x5d\x95\xb5\x9e\xd5\xe1\x80\xa1\x1c\xb1\x56\x09\x90\x33\x13\x76\x6a\x53\xcc\x30\x47\x17\xc1\xae\x89\xf0\x55\xe5\x70\x65\xda\x6b\xb8\xde\x08\xc4\x1b\x05\x06\x08\xc2\x1d\xac\x4b\xdc\x08\xad\xd6\x71\x71\x20\xa3\x1f\x49\x91\xed\x9f\xe5\xb4\xb1\x86\xab\xfd\x86\x50\x14\xc7\x9f\x3b\x2c\x8b\x45\x1b\x9b\xf8\x00\x10\x43\x1d\x48\x32\xe6\xcb\x1e\xa0\x83\x59\xcd\x96\x00\x70\x0f\xc7\x80\x8a\xb0\xcb\xa6\xce\x81\xe9\x87\xa1\x7d\xa9\x0a\x81\xcf\xc0\x55\x55\xd6\xe5\xac\x04\xba\x69\xd9\x63\x0e\x07\x20\xaa\xb7\xe7\xa5\x03\x09\xf0\x70\x6c\x52\xd1\xf1\xb8\xb4\x44\xdb\x7c\xa7\xac\x2a\x48\x15\x74\xb8\x4b\xeb\x2a\xf3\x60\x5f\x8b\x26\xcf\xad\xa6\xd5\x02\x13\xb5\xa7\x47\xdb\xa1\x16\xc4\x9d\x65\x9f\xf3\x08\x25\x61\x15\xb5\xdf\x28\xf0\x41\xb7\x15\x78\xb5\x52\x20\xe7\xb2\xa3\x69\x00\x91\x7c\x50\x02\xde\x61\x25\x4d\xb6\xca\x72\x55\x79\x82\x1f\xd8\x24\x8d\x67\x41\x74\x4d\x95\xb8\x09\xe5\xbc\x04\xa8\x5b\x40\x15\x57\x71\x0d\x2f\x9f\x7f\xca\xa3\x2f\xb1\x42\x77\x56\x07\xf5\x3b\xf6\xff\xe0\x70\xc3\x8c\x09\xc7\xdf\xe7\x00\x18\x9b\x00\xb4\xb9\xfd\x6d\xaa\x30\x5c\x97\x26\x2a\x62\x8a\xa0\x43\xed\x2f\xac\x08\x11\xe2\x8d\x46\xb3\x2b\xea\x1a\xd6\x2b\x9b\xb8\x79\x84\x12\x35\x5e\x20\x20\xc7\x8f\x32\x12\x88\x31\xec\x06\x71\x31\x2c\x02\x64\x82\xac\x73\x14\x8b\x73\x10\x8b\x09\x12\xac\x10\xd2\x52\x24\xa0\xb0\x8e\x3b\xc0\x5c\x87\x3e\xcc\x89\xa0\x2c\xe8\x3e\x53\x57\x70\x67\x53\x39\xf2\xc0\xfe\x2b\xb5\x69\x09\xc9\x99\xa3\xad\xcc\x37\x89\x80\xbf\xe9\xd9\xb2\x80\x83\x47\x07\x17\x74\x5c\xad\xac\xe1\x61\x12\x0a\xf0\x69\xbf\x47\x78\x62\x61\x16\x02\xae\xd6\x50\x58\xd2\x69\x27\xce\x18\xc4\x19\xb6\xc2\x93\xb8\xa7\x00\x86\x6c\xce\x6a\x77\x59\xc9\x4f\x5a\xaf\xed\x33\x2b\x69\xf4\xac\xd2\x75\x2a\x7a\x8e\x16\x43\x85\xf3\x80\xbb\x36\xa0\x2e\xa0\x9a\x08\xb9\x68\x2a\xd8\x13\x0d\xd4\xe6\x20\x66\x2d\x48\x56\x07\x35\xc7\xa7\x08\x58\xca\x42\x1c\xe5\x98\x57\xa4\xac\xc2\x5d\x1c\x0e\x16\x81\x17\x38\xe3\xc4\x6e\xaa\x9b\x52\xe5\xb6\x9b\xd1\x99\x8b\x56\x71\xa9\x73\x57\x42\xdf\xfe\x8e\x08\xbf\xc3\x87\x0e\xb7\x2e\x2e\x32\x9d\xa8\x0c\x16\x99\xaa\x58\x77\xef\xe6\x39\x5e\xaf\xbe\xef\xb8\x9b\x7d\x69\x40\xae\xee\x50\x7c\xdb\x89\x59\x95\xa6\x66\x01\xae\xee\x82\x3a\xa8\xa9\x02\x8f\x65\xb9\x90\x07\x3b\x79\xa0\x0e\x12\x01\x37\xe5\x12\x10\xc5\xf3\x8d\xb3\x05\x6d\x3b\x74\xa5\xae\x34\xc4\xb6\xa8\xa4\x03\x62\x86\xc0\xfb\x63\xf4\x2d\x84\x04\x18\x90\x7c\xa6\x8d\xc8\x0a\x00\xdb\xf7\xd5\x26\xae\x5c\x57\xf6\xae\x1c\x49\x0b\xf2\xf9\x57\x3a\xcf\x8a\x1f\x1a\x40\x50\x4d\x50\x3a\xce\xa5\x07\x1e\x72\xc8\x01\x2b\x80\x05\x87\x7b\x29\xba\x48\x83\x99\xc9\xe7\xd4\x57\x60\x20\x33\xeb\x0c\xa8\x04\x01\x2c\xa8\x5a\x95\x45\x66\x1c\x5a\x98\x35\xaf\x57\xcd\x4a\xe6\xfa\x56\xe7\xd0\x84\x3f\x23\xb8\x05\xa0\x74\xa9\xd0\x61\xd7\x67\x28\x31\x49\xdd\xa9\xb9\x0a\x24\xd3\x46\x98\xb5\x2a\xe8\x6e\x5d\x11\xea\x10\xf1\xb0\xee\xea\x31\x5e\x6c\x0d\x08\x12\xed\xee\x79\x77\x3d\xda\x06\x11\x07\xd9\x09\x2a\x3f\x49\x00\x8c\x58\xcc\x61\xa2\x98\xa0\x68\x1f\xaf\x57\xc0\x86\x20\xe2\xb5\x88\xd5\x03\x93\x38\xe5\x88\xb6\xf4\x4d\x5e\x4e\xed\x86\xe6\x3b\x22\x95\x2c\x40\xcb\x05\x92\x10\x2d\x34\xe6\xf7\xd8\x7d\xbc\xb3\x0b\xb0\x33\x63\x71\x8b\xa8\x63\xc1\x82\x23\x73\x57\x50\x53\x0e\xcb\x6f\x48\x12\x12\x4f\x4d\xf0\xe7\x19\xd3\xa1\xd5\x08\xa4\x75\x53\x6a\x20\xde\x74\x37\x38\x80\x68\xdb\x39\x55\xfe\xc6\xb7\x43\x6b\xed\x98\xca\x4a\x66\x84\x45\xb3\x07\x05\x36\xb5\x15\xa9\x8c\x9c\xef\x96\x42\x20\xb4\x33\xf5\x17\x98\xf7\x6d\x0f\x1d\x8c\x0b\x03\x33\xf0\xf1\x25\x0d\xb5\x7d\x07\xb2\x2c\x21\x7c\x3e\x78\x79\x59\xe6\x73\x8d\xf8\x09\x08\x9b\x81\xa2\x14\x0e\x38\xc0\x76\x6d\xdd\x2a\xa9\xbc\x2e\xf2\xec\x93\x73\x7f\xe0\xd0\xac\x16\x8d\x9b\xd4\x2a\x1f\x94\xac\xe7\xb0\xed\x04\xfc\xd9\x0e\xa5\xb1\x87\xd4\xb6\x6e\x00\xd9\x0d\x9e\xa6\x3b\xce\x35\x98\xb4\xfa\xe6\x90\x35\x02\xc4\xed\x03\xab\xfd\xf2\x74\x1f\x04\xbd\xb6\x7b\x07\x59\x5a\x19\x5d\x0c\x56\x01\xfe\x84\xa2\xa8\xc5\x59\x00\xb4\x4b\x7c\x5e\xa7\xee\x82\xd6\x1b\x04\xf7\x02\x5b\x01\x30\xaf\x99\x57\x93\xfe\x8e\x4d\x02\x2d\x86\xaa\xad\xf4\x91\x77\x0a\xb6\xed\x46\x20\xd0\x73\x4a\xc5\x51\x6e\x8a\xad\xbc\x5a\x94\x56\x3b\x57\xc5\x13\xbb\x03\x8f\x1d\x13\x73\xdd\x26\x5b\x8f\x6e\x06\x5e\xe7\x22\xe8\x3b\x6a\x27\xdb\xfd\x2d\x08\xcf\x22\xd7\x8b\x3a\xd8\x91\xa9\xbc\x28\xed\x01\x34\x4c\xc7\x68\x64\x5d\x35\xf9\x86\xb4\x1e\xcc\x85\xb1\x37\x45\x5d\xca\x69\x93\xe5\x73\x59\x01\xb8\xab\x27\x24\xe3\x7b\x15\x12\x82\x01\x3e\x1a\x92\xdd\x01\xce\x61\xe1\x0a\x9e\x19\x55\x44\x55\xb5\x61\x88\x1a\xb7\xff\x40\x3d\x07\x95\x90\xf9\x50\x2b\x28\x0a\xdc\x52\xec\xb6\xb4\x9f\x43\x22\xcc\x56\x47\x5e\x06\x84\xf6\x47\x41\x8b\x25\xef\xec\x6d\x7d\xab\xaa\x4c\x23\xea\x0a\xef\xad\x63\xd8\x40\x7f\x6f\x4c\x2d\x17\x0a\x89\xf4\x61\xb8\xc7\xad\xbd\x66\x96\xc0\x3b\xc5\x6b\xfc\x4b\x4c\x4f\xe1\x4d\x4f\xb4\x15\xa5\xd5\xc7\xab\x87\x86\xc5\x14\x38\xc0\x40\x41\x90\x4e\x70\x1f\xb1\x3e\xb6\x8f\x68\xc6\xab\x63\x3c\x1b\x80\x3a\x44\x43\xc3\x95\xb4\x2d\x59\x9b\xa3\xce\x56\xda\xa0\x55\xf7\xb0\x98\x7e\x60\x26\x02\x05\xa7\x2e\x05\xae\x21\xac\xdc\xce\x65\x8b\xba\x71\xb7\x04\x72\x55\xa0\x40\xe4\x52\xfe\x1d\x54\x3a\xc1\xa0\x5e\x3b\x08\x25\x64\x6f\x60\x06\x30\xae\xe3\xc4\x66\xa1\x77\x24\x15\xc8\xdc\x15\xa1\xb9\x1b\x29\x92\x38\xb4\x54\x88\xf8\x48\xda\x29\x82\x0a\xfc\x6d\xa5\x1c\xaa\xf9\xd1\x44\xda\xd3\x28\x1f\x4b\x94\xbd\x12\x1e\x86\x05\x55\xee\x11\xd4\x51\x73\x6d\xe7\xbe\x0e\x51\x60\x90\x3e\xc0\x5b\xe9\x82\xf4\x25\x16\xa9\x01\xe6\x13\x38\x13\xf4\x06\xfa\x3a\x27\xc4\xa5\xe9\x4e\x3b\x02\xc0\x80\x0d\xd3\x41\x1c\x7c\x28\xab\x4f\x07\x8c\x2c\x44\x6a\x0e\x9d\xbb\x63\x77\xf2\x8e\x1f\x3e\x78\x2d\xd3\x31\xde\x21\x85\x26\x44\x9c\x5c\xab\x2a\x47\xee\x05\x0d\xe2\x10\xe5\x11\xd8\xd1\x74\x3c\x8a\x9b\x5d\x2b\x8d\x9b\x03\x1e\xa6\x07\x35\x42\x5b\x7d\x67\x0f\x2a\xdc\x32\x48\xc3\xe2\x74\x6b\xa2\x56\xe7\xf7\x09\xb4\x8c\x78\xfd\x77\xed\xee\x44\xec\xdc\xd6\xf6\x2a\xf1\xcc\x8e\x56\xb2\xdb\x19\x82\xe5\x63\xa1\x7c\xc7\x7f\x29\xef\x0a\x93\xca\x2b\x60\xfe\x16\xc0\xf5\xab\xfd\x66\x64\x0a\x6c\x47\x50\x05\xb3\x81\x13\x03\x17\x39\x0c\x78\x7b\xe3\x13\xf4\x71\x7c\x9a\xdb\x02\x73\xad\xab\x95\x2a\x50\x19\x86\xa5\xa9\x2a\x7d\x5b\xce\x80\xc3\x11\xc9\x34\x6d\x17\x90\xa2\x25\x64\x2e\x06\xe9\x8c\x62\x8a\xdd\x56\xa4\xed\xdb\x7f\x7e\xca\x8a\x39\x95\xd6\xd7\x3c\x1f\x61\xe1\x33\x21\x24\xfb\xd1\xe1\xdc\x09\x00\xdb\xd0\x6b\x18\x1d\xda\xc3\xa8\x50\x2c\xd5\x7a\xad\x8b\x54\x88\x2b\x6b\x79\xf7\xbe\x95\xbd\xa2\x46\x92\x18\x88\x53\x5b\x95\x24\x3c\x76\x20\xcc\xe5\x15\xc4\x8c\xa4\xfd\x55\x80\xe8\xe3\x54\x19\x49\x9e\x03\x1c\x1d\x81\x2e\x1b\x6b\x23\x2d\x4a\x7b\x23\x9b\x6f\xa9\x42\xf4\x44\x5e\x68\x57\x2d\x09\xb8\x61\x6a\x9d\xd5\x2a\x07\xa2\x8a\x0f\x65\x35\x37\x42\x1c\x38\x4b\xe5\x40\x1e\xcb\x1e\x82\xaf\x99\xd8\x41\x13\x6b\xa6\xf8\xbb\x42\x67\x37\xcb\x69\x09\xdc\xce\xec\x86\x02\xa3\x13\x3d\x14\xf9\xc6\x11\x6e\xc4\xae\xac\x10\xfb\x41\xdd\x79\x9f\x00\xa9\x92\xa1\x1a\x28\x22\xbc\x52\xf9\x32\x7d\x9e\x0a\x71\x60\x6f\x1c\xdb\xd5\x6d\xe4\x28\x0d\xb7\x11\xca\x16\x3c\xd9\x19\x0f\x07\x61\x60\x5d\x1d\x37\xb2\xbd\xad\x75\x31\x07\x32\x59\xaf\x72\xc1\x09\x72\x1b\x72\x56\xc2\x91\x01\x3f\x13\x49\x8e\x0b\x67\x28\x12\xef\x52\xeb\x16\x72\x36\xef\x85\xdf\xb7\x07\xfc\x92\xed\x76\x87\x5b\x25\x1b\x12\x2e\x50\xc2\x7e\xc6\xba\x7a\x82\x90\x50\x75\x36\x03\xc6\x40\x5d\x2f\xcb\x39\x78\x09\xee\xd4\x86\xd8\x96\xbd\x8f\x33\x54\x52\xa6\x1b\xa9\x3d\x55\xb6\x1f\x0f\xd8\x85\x5b\x1d\x6e\x51\xfd\xef\xea\x30\xee\x4d\xdb\xed\x4b\x68\x83\x77\xa2\xdd\x7f\xd0\x71\x14\x7e\x0e\x01\x0f\x30\xd3\x96\x6a\x5d\x5b\x33\xb2\xd7\x93\x87\x07\xa6\xc9\x04\xbb\x3c\x8f\x5a\x38\x86\xee\x2b\x17\x00\x88\x66\xb5\xf6\x43\xff\xcf\x6f\x5e\x3e\xfd\xe6\x69\xf7\x9c\x97\x96\xf3\x07\xed\x41\xca\x33\xe5\x52\x30\x1d\xbf\x50\x53\xcc\x32\xa0\x1b\x3a\x3d\x95\x97\xaa\x9a\x2d\xe5\xe9\x37\xdf\xbc\x64\x83\x1e\x8d\xbc\xc0\xcd\x52\x2e\xbc\xdb\x04\x11\x9a\xed\xf1\x67\x84\xf1\xf5\x1c\xd4\xc0\xc0\xeb\x0a\x80\x1f\xe4\x7d\x63\x7b\xc7\x5d\xd4\x59\xb1\x7f\x17\xcb\xdd\xbb\x98\x66\xdb\xce\x2d\xdb\xed\x00\x2a\xc7\x96\x8c\x1b\x20\x79\x23\xfd\x01\xf2\x66\x16\xf8\xd9\xa7\x6a\xf6\x49\x36\x6b\x77\x11\x38\x6c\x49\xfb\x19\x94\x24\x7e\x01\xa9\xe8\x43\xe5\x60\xbf\xe3\x9c\xa0\xb0\x01\x6b\x76\x5a\xce\x41\x33\xc4\xdf\xd9\xab\x8e\x20\x4c\x04\x78\xd6\xdd\xff\xda\xa6\xaf\x69\x3f\xdb\x46\x6f\x75\x35\x4d\x68\x1c\xf3\x12\x0d\xe0\x0d\xb8\x12\xe1\x2e\x40\xb4\x3c\x70\xcd\xa0\xdf\xfd\x3c\xd0\x19\x44\xbc\xd9\x8c\xbd\xf7\x60\xdb\xd2\xa4\x3a\xdf\xcd\x4a\xcf\xb3\x66\xe5\xc0\x25\xed\x33\xaf\xa5\x27\x1f\xd7\x46\x60\x80\x82\x6d\x1b\x62\xe7\x02\xb3\x71\x1a\x38\xdb\xda\x1c\xbf\xc4\x57\x93\x15\x21\x67\x9b\x6d\x0b\x9d\xb8\x20\x33\xd8\x6b\x11\xca\x13\xc7\x10\xe3\xf9\x20\xdc\x77\xed\x04\x81\x8e\xe1\x66\x7e\xb7\x56\x7f\x11\x2a\x17\x70\xa2\x7e\x89\x5c\xf9\x58\x36\x07\xa4\xa5\xd0\x95\xa1\x66\x3f\x34\x59\x20\x92\x43\x69\xcb\x39\x02\x79\xcc\x37\x16\xb6\x28\x25\x5e\x0b\x3c\xf7\xd6\x4e\x04\x1a\x20\xe6\xaf\x05\x8b\x37\x87\x0d\x64\x7b\x7c\x9b\xcd\x30\x38\xaf\xb8\x40\xff\x44\x7e\xc0\xdb\x3f\xb2\x6d\x4a\x4c\xad\x80\x27\x4e\x53\xd9\x87\x8d\xa7\x1d\x5f\x51\xdc\x0d\x9c\xea\x0b\x6f\x98\x7f\x2b\x84\x4a\x65\xc7\xe9\x4b\xe8\x4e\xd8\x32\xbe\x5b\xa7\xe5\x3c\xba\xb4\x78\xa2\x49\xc9\x8d\xaf\x50\xd8\x46\x42\x4c\xed\x47\x9c\x3e\xb5\xaf\x05\xb9\xab\x05\x3b\x61\x91\x07\x03\x91\xd1\xd9\xa7\x0e\x31\xb5\x05\xe2\x83\x86\xe7\x9b\xbd\x15\x15\x4f\xdf\x19\x4f\x8e\xa3\x49\x06\x2d\x38\x85\x19\x38\xf7\xd1\xaa\x4e\x5b\xf1\xde\x71\x1d\xf3\x22\xc2\x7e\xf4\x2f\x0b\x7b\xed\x82\x15\xe8\x51\x2f\x5b\x71\xaf\x69\x13\xd9\x16\xa4\xed\x7f\x1b\xef\x58\x7b\x40\x72\x2b\x17\xcc\x6c\xa9\x57\xca\x5d\xb9\x86\xf0\x74\x1d\x13\x72\x40\x6c\x80\x9a\x15\xa5\xca\xa8\xd0\x8d\xea\x6e\x6e\xb8\xe0\x9c\xed\x11\xee\x3b\xf7\xe5\x9a\xea\x14\xad\x39\x0d\x5a\x9d\xbd\xcc\x7f\xd4\xe6\xb5\xb7\x80\x74\x51\x57\x78\x57\x96\x4d\x0d\x8c\xce\x4b\xad\x6b\xf3\xda\xd9\xe0\x6f\x33\x6d\x35\x3b\x46\xbd\x81\xa3\x67\xea\xb2\xf2\x31\x25\xfe\x5c\x38\x75\x9e\xae\xca\xad\x3e\xbc\x89\xba\x04\x20\xe1\xe0\xcb\xd1\x05\x00\xdf\xdc\xac\x35\x7f\xc8\x6f\xb7\xd6\x9e\xda\xfa\x05\x2a\xdd\x10\x67\x9a\x07\xd4\x6e\x95\xf2\x0d\x57\xfa\x18\x93\x8c\x23\x9e\x85\xbb\x65\x99\xa3\xbf\x1d\x92\xf2\x6a\x55\xd4\x56\xa1\xf1\xe1\x1f\xec\xf8\xf6\x07\x67\xc4\xb4\xbe\x11\x60\x67\xb2\x0d\x82\x24\xaf\x45\x19\x6e\xba\x70\x06\x70\xa2\x76\x36\x96\x9b\x52\x40\x8b\xae\x31\x9c\x33\xb8\x14\x56\xe5\xad\x55\x98\x59\x77\x88\xc4\x61\x66\xa4\xd1\xa4\x7f\xc1\xfd\x4c\x4a\x12\xd0\x46\x93\x43\x49\xd5\x81\xb1\xcb\x90\xfe\x78\xf9\xf8\x94\x27\x1f\xe5\xe5\x53\xc6\x1d\xb4\x6f\x45\x47\x2c\x16\x3d\x9e\x72\x14\xfa\x1f\x82\xd8\x39\x08\x23\x86\x43\x42\x07\xf8\x27\x44\x43\x62\x3c\xb0\xed\xfd\xfd\x1a\xd6\x7d\xcf\x67\xbc\x51\x8d\x24\x05\x26\x9e\x64\x59\xb6\x26\x5c\xa0\xdd\x25\x8d\xd6\x4e\xbf\x78\x9e\x9e\x49\xe0\xa5\x75\xb0\xce\xee\x3b\xe0\x8b\xa4\x60\x0d\xd2\xf9\x19\xda\x8a\xb3\x2f\xe8\x12\xc0\x34\x4b\x44\x7a\x56\xc6\x94\x33\x84\x9a\x73\xc8\xa9\x8f\xf4\xea\xd9\x2f\xe8\x55\x2a\x04\x02\xbd\xb9\xbb\xc1\xed\x0b\xf0\x10\x42\xc9\x40\x00\xc6\xb5\x81\x3b\x1e\xcc\x4c\x36\xb9\x49\xf5\xf5\xcc\xe0\x80\xda\x9d\xbb\xe0\x8b\xf3\x6e\x8a\xb3\xf4\x99\x7c\xab\x66\x35\x26\x07\x2c\x2a\x4d\x11\xa6\xc8\x2c\xab\x9d\x41\xe9\xe2\x3f\xf0\x71\xf6\xe6\x04\xb6\x85\xc8\xa2\x7d\x15\xa9\x3b\xed\x69\x5e\x22\xd1\x37\x5d\x90\x8f\xdd\x26\x40\x37\x48\x11\x7e\x88\x43\x6f\x7f\x3c\x94\xf9\xd1\x97\x09\xee\x8b\xfd\x53\x76\x41\xc3\xd7\xa8\xd9\xb6\x76\xc6\xda\x9b\xc3\x52\x8f\xee\x14\x36\x6a\x7b\xdf\x86\x49\x26\xbb\xae\x66\x02\x70\x38\x09\x9e\xa3\x40\x52\x95\x44\x71\xf6\xc7\x6e\x5d\x21\x9e\xa5\xa7\xe1\xd7\x1e\xbd\xa6\x77\xbb\xe9\x27\x4b\x1d\xb9\xbb\xec\xb0\x1b\xf2\x8a\x07\x0b\x94\x38\xd7\x4b\xb0\x38\x3b\x07\xc8\x31\xf0\xa9\x2e\xf4\x22\x73\x42\x96\x1e\x42\x41\xed\x83\x2a\x21\x13\x54\x56\xc4\x23\xd8\xd2\x87\x23\x45\x83\xc5\x54\x6b\x7f\x56\x1a\xac\x7a\xc3\x2e\x9b\x19\x83\xe1\xb1\xcd\x50\xb5\xc3\x78\xf6\x41\x88\xed\x44\xed\x2c\x15\x48\x79\x3e\x8f\x7b\xba\xb8\x53\x17\x12\xdc\xc5\x16\xb2\x1c\x6e\x68\xd3\x8a\x82\x2c\xd8\x3a\x85\x15\xba\x06\x38\xe2\xe9\x8e\x81\x61\x6e\x90\xe1\x1c\x83\x6c\x4b\x85\xf2\xbe\x48\xc4\xf4\x37\x56\x79\x0f\xc8\xa2\xb6\x75\x21\xd2\x89\x1f\x1c\x51\xc2\x56\x88\x70\xde\xba\x5b\x6d\x6a\x8c\x7b\x22\xd9\xe5\x8d\x76\x91\xaf\x68\xc4\xdb\x56\x9c\x87\xf3\xa6\x73\x0e\x68\xec\x30\x18\xfb\x1f\xd4\x64\x1c\x2a\x23\x47\xaa\x80\x92\x65\x6f\x53\x8e\x19\x15\x82\xaa\xe0\xd9\x0f\x4d\x21\x30\x96\x20\xb4\x2d\xf0\x90\xdb\x65\xbd\x03\xc8\x55\x30\xf5\x98\xa4\x92\xa6\x05\xe7\x2a\xb5\xa7\xeb\x4c\x7e\x78\xc0\xe0\x7c\x74\x27\xc0\x1d\x4f\x52\x1f\xce\x6a\xa0\xb4\x87\x55\xf5\x80\x2a\x1f\xc4\xcf\x49\x76\x05\xdc\xf6\xad\xdb\xf7\x17\xda\xd8\x48\x71\x15\x6d\x25\x8a\x5c\xaa\x62\x23\xb6\x07\xe6\xb6\x6b\xf4\x8a\xbb\x56\x20\x05\x06\x52\x21\xe2\x29\x13\x6d\x2b\xc0\x55\x8d\x86\xfa\x3a\xdd\xb2\xf8\x87\x1d\x6a\x9f\x10\x93\x98\xb6\x97\xb3\x57\x1e\x1a\x33\x8e\x10\x77\x49\xdb\x47\x20\x42\x1f\xc1\x17\x6e\x14\xf9\xd0\x46\x11\xf1\x46\xd9\x3e\xa7\xe8\x83\x84\xe5\x02\xba\x3d\xa0\x95\xf2\x1d\xf4\x13\x2e\xc2\x00\x32\x5b\xd0\x04\xe2\x8f\x79\x28\x6d\x79\xf7\x2c\x7d\xe6\x82\x47\x8f\x8a\xfb\x70\xff\x19\xd8\x46\xf6\x29\xbb\xad\xa3\xdd\x27\xb6\x77\x5f\x60\x3d\x66\x7b\x9a\x68\xe9\x83\x38\x27\xe2\xd7\xef\xc8\x18\xca\x5f\x19\xe1\xfd\xb7\x24\xe4\x31\xf9\xb3\xac\x10\x89\xd4\x30\x35\xa0\xf2\xab\x99\x30\x99\xdc\xb1\x15\xb0\x89\x2c\xca\xe2\xd8\x21\x16\x25\xae\x14\x06\x85\xac\xdf\xa9\x2e\x67\xab\xf1\x7a\x6a\x4b\x6d\x7e\xd0\x80\x86\xee\xf9\xfb\x45\xff\xb8\x06\xf4\x4f\x98\x15\x34\xd9\x7c\xba\x13\x22\xb7\x06\x39\x66\x48\xb6\xa1\x81\xf0\x6b\x01\x86\x58\xb9\x90\xba\x98\x6b\x75\x5b\x36\x55\x2a\x7f\xcd\x69\x10\xd1\x7d\x47\x3e\x1f\xac\x85\x63\xc0\xd2\x3c\xdf\xb1\xdb\xd9\xdb\x14\xee\x7a\xb1\x5f\x3c\x3e\x97\x97\x65\xe5\xec\x73\xd2\xe7\x0c\xad\x32\x89\xf7\x55\xf0\x44\x90\xe0\x11\x6d\x79\x31\xd5\xd2\x65\xff\xcf\x25\x92\x0e\x4b\xd5\xd4\x4b\x9f\x49\x04\x0b\x85\x24\x58\xa5\xe7\x41\xb0\x5d\xf3\xf9\x58\x60\xfd\x60\x84\xec\x0e\x0a\x45\x23\x56\x1b\x6c\xef\x89\x91\xcb\xb2\x28\x9b\x8a\xf4\x90\x75\xc3\x65\x1e\xa1\x2f\x4d\xce\x75\x55\xde\x00\xc4\xb3\x70\x1f\xc1\x9d\xf8\x76\x2b\x3f\x03\x3c\x1a\x10\x5c\x72\x92\x27\x1e\xb5\xdb\xb8\x2c\x75\xf3\x5c\x84\x4f\x60\xef\xdd\x53\x4e\xd0\x86\xf7\xf4\x23\xe9\x96\x9e\xc9\xe5\xc1\x28\xc2\xf6\x49\x44\x1b\xac\xb7\xd8\xd3\xf9\xd6\x0b\xc0\xce\xfe\xe0\xde\x63\x8d\x9f\x7b\x16\x8c\x7e\xa7\x58\xb4\x53\x1e\x7d\x30\x92\x78\x22\xc8\xb2\x01\xa4\x60\x77\xf3\xc6\xf3\xf7\xe0\xe4\x50\x96\x90\xf8\x15\x93\xe3\x2c\xc2\xed\x55\x77\xbe\xac\x70\xe5\x21\x9a\xef\x09\x8d\xe2\xa1\x42\x97\xc5\x03\xf3\x6a\x07\x3b\x4d\xc2\xcd\x6f\xb7\x02\x66\x0e\x93\x8e\x14\x0e\xdb\xdf\xb7\xce\xa8\x87\xd3\xb3\xd6\x33\x1f\x05\x62\xe3\x04\xcd\xd0\xa2\xac\x29\x24\x69\xb6\x52\xbc\xb7\x1d\x74\xe0\x3c\xd9\xbd\xa7\x31\xbc\x55\xc6\xcb\x60\x7b\x6b\xea\x0c\x59\x81\x4d\x66\x02\xbf\x08\xe7\xc0\x6c\x7f\x96\xd1\x61\x4e\xe4\x48\x23\x0b\x3f\x00\xa0\xdb\x73\x1e\x5a\xad\xe2\x79\x7a\x0a\x3c\xe5\x94\xdb\x86\xf9\xb8\x0d\x04\xa6\xb8\x72\x6a\xc7\x55\xcc\xc1\xcf\xcc\xb4\xa2\x9f\x4c\x5c\x19\x66\xe6\x6f\xb7\xed\x11\x72\xcc\x43\xdc\x24\x3b\x33\x94\x5d\x5a\xf2\x4e\x0f\x01\x5b\x02\x98\x5a\xea\xf2\x8b\xed\x7e\x73\x37\x2b\xe4\x29\x47\x59\xca\x81\x7b\xfa\x79\x7a\xb6\x35\x63\xe4\x29\xd9\xeb\xc0\x08\x68\xac\x9c\x95\xb9\x28\x2b\x11\x7a\x59\xf6\x2b\x7f\xe5\x5d\xc1\xa0\xf3\x0f\xfb\x22\xc4\x97\xfa\x22\xe4\x43\xbe\x88\xe7\xe9\xb3\xad\x01\x06\x7e\x97\x5f\x32\x48\x87\x72\x1e\xfa\x6d\x1e\x1c\x28\xba\x97\x76\x3c\x20\x5c\x2e\x73\xe8\xf8\x44\xb7\xf2\x2f\xf3\xd3\x88\xdf\x30\x37\xe4\x6b\xe8\x7d\xeb\x20\x2e\x3c\x2b\x17\xc1\x51\x9c\xc8\x0f\xe0\x24\xac\x81\xcf\x61\x9e\x19\x90\x9d\xde\xc7\xc0\x6c\x38\x11\x1d\x91\x10\x2f\x80\x97\xdc\xef\x4f\x07\xf6\x4e\x37\x4c\x34\x59\x07\xca\xc8\xcc\x1c\x44\xa0\xf1\x76\x9a\xef\xf0\xcb\x90\xf4\xec\x13\x09\xf6\x9e\x1f\x67\x60\xc2\xdc\x65\xb5\xbd\x35\xec\x9b\xb3\x59\x53\xa9\xd9\x06\x67\x02\xd9\xe2\x0a\x6d\x4c\xe2\xa1\xd3\xad\x85\x8b\x9a\xb0\x9a\xba\x7f\xea\xaa\x02\x8a\xaa\x72\x21\x17\x59\x6d\xdf\x00\x69\x46\xd9\x8e\x3e\xb6\x6d\x75\x84\x54\x6c\xd7\xba\xc4\x82\x10\x95\x2f\x46\xd8\x28\x17\xdc\x69\x1e\x24\x4c\xaf\xc1\x7c\x1b\xe1\x1f\x64\xbe\x25\xe7\x2d\xfd\x58\x36\xa9\x9d\xde\x33\x39\xf6\x44\x4e\x98\xb4\x42\x93\xef\x13\x3b\x29\xc9\x82\x54\x43\xca\x2f\xc6\xb2\x91\xa9\x4b\x55\x6d\x39\x6d\x48\x96\xd8\xd6\x90\x84\x0b\x17\xda\x53\xe1\x51\x6b\x06\x99\x4d\xfd\x57\xad\x00\xc8\x4b\x43\xf9\xf2\x2b\x75\xa3\x9d\x2b\x0e\xd6\x75\xa9\x0b\xf4\xcb\x29\xae\xac\xa1\x14\xc7\xe9\xc6\x25\x8c\xf8\x94\x1d\xe1\xdd\x45\xbc\xa8\x9e\xe1\x14\xdf\xb0\xef\xea\x9c\xd5\x60\x7e\x8a\x9a\xa7\x46\x17\xaa\xc9\x6b\x41\x01\x84\xd0\x53\x1f\x8d\xb9\xb4\xaa\x2a\x3b\x12\xa3\x45\xf2\xc3\x63\xe3\x2e\x11\x14\xc9\xc1\x59\xc2\xd9\xac\xcb\x04\x83\xd9\x98\xd4\x0c\x0a\x2a\x68\xa2\xf6\xdf\x50\xb1\x0f\x05\xfc\xf0\xa7\xb5\x15\xee\x60\x47\x94\x95\x20\x4c\xc3\x6a\xc3\xfc\x66\x5b\x9d\x60\x53\x93\x53\xd4\x76\xba\x97\x80\x11\x56\xcd\x6f\x41\x2d\xe7\x5d\x0d\x6a\x0b\x71\x91\x11\x2d\x20\x7f\xc4\x6e\x20\xe0\x2b\xf6\xe3\xdb\xb5\x5f\x78\x93\x70\x5a\x1c\x0f\x56\xd2\xb5\x86\x54\x11\x95\x9e\xd5\x62\x91\x15\xaa\x00\xc3\x04\xf6\x40\x1d\x59\x1b\xf8\xbe\x5f\x19\x28\xca\x9d\xcb\x42\xdf\x30\x9d\x49\xb0\x42\x62\xc7\x0a\x31\xae\xcc\x09\xcb\x29\x21\x5e\xa6\xa7\x8e\x44\x8f\x65\xd6\xd6\xfd\x86\xb4\x13\xf9\x9c\xf2\xdf\xb2\x02\x39\xee\xca\xaa\xcd\xa7\x87\x47\xa6\x31\x75\x9b\x51\x6f\xe6\x29\xf5\x2a\xcf\x8b\xe7\x66\x15\x95\xc0\x95\xca\x60\xe3\xe2\x2f\xf6\xe7\x80\xbc\x4c\xcf\xb6\x02\xb1\x38\x4f\x98\xb8\xe9\x35\x3e\x0e\x22\xd6\x9e\x89\x3c\x22\x53\xe7\xa4\xbb\x0f\x58\x04\x83\x5e\xf1\xa5\x06\xdc\xb4\xda\x9a\x23\x58\xe2\x63\x67\x47\xab\x0a\x40\x59\xe0\x6c\x99\x5a\x41\x4c\xcd\x9e\x5e\x47\x41\x2c\x20\x88\x4a\x7e\x3e\xca\xbd\xdd\xc5\xdc\x0e\x1f\xb3\xf3\xe3\xc9\xc5\xe1\x93\x76\x60\xcf\xf6\x86\x79\x70\x2e\xdb\x95\x5a\x9e\xab\x98\x8f\x31\xec\xc0\x20\x85\x28\xdf\x60\x0e\x29\xd5\xb3\xc5\x76\x34\xe4\xaf\x53\xc2\x5b\x90\x6d\xe6\x14\xb4\xd0\x44\x3c\xb4\x92\x29\x96\xcc\x48\x85\xbd\xb5\x55\xdc\x45\x7f\x04\xa0\xa0\x9c\xed\x97\xe0\xff\x81\xc5\xed\x92\x31\x91\xf2\x0e\x35\xba\xc8\xe4\x83\x0c\x10\x48\xd5\x9a\x95\x37\x05\x9c\xc8\xf0\x96\xac\xa4\x7b\x13\x18\x15\x03\xca\x6c\x01\xf9\xc3\x41\x00\x1a\x1b\x8c\x87\x6d\x60\xba\x9f\xb7\xa6\x1b\x63\x29\x14\xfd\x7f\xd0\xab\x07\x09\xe4\xd9\x8c\xe2\x4b\xf4\x3e\x6d\x59\x85\x78\xbc\xe4\x40\xb2\x92\x00\x37\xfc\xdc\x79\x16\x69\x09\x7d\xbd\x4a\x4c\x8c\xea\xbb\x0a\x56\xd2\x23\x1d\x21\x6f\x19\x97\x4e\x79\x03\x00\x88\xf5\xf9\x13\x62\x07\xf7\xaa\xbf\x1c\xd0\x43\xb1\xdd\x44\x9b\xf5\x34\xba\x53\xb0\xb8\x0d\x5a\x2b\xe5\x4a\x6b\x3c\xea\x19\x66\x6e\x6f\x9f\xdb\x7f\x76\x71\xf3\xd7\x9f\x47\x7f\xd2\xa7\xdf\x8f\xff\xc1\xe5\xff\x8f\xf1\xff\x3d\x3f\x39\x7d\xd5\xae\xff\x7f\xf1\xf2\xd5\xd7\xfa\xff\x3f\xe2\xe7\x7b\x6b\x5d\x28\x0f\x8c\xc9\x05\xfe\x00\x78\x78\x12\x54\xc7\x1b\xed\x34\x2a\x2c\xcc\xf7\x84\x66\x21\xbb\x18\xfb\xe6\x0f\xa8\x61\xa8\xcb\x38\x8f\x2a\xe1\x3a\xbe\x54\x05\xc0\x13\x55\xb5\x39\x60\x22\x54\x5f\xe8\x0d\x3c\x51\xd6\x9a\xf2\xad\x53\x44\xb4\x9a\x13\xef\xad\xeb\x00\xd7\xc0\xc3\xf5\x11\x3b\x32\xa7\x1a\x6a\x6c\xb8\x38\x10\x45\xa1\xd1\x5c\x6d\xc7\x35\x37\xd6\xe2\xda\x33\x15\x49\x84\x8b\xe9\xd3\x6f\x0e\x67\x47\xc8\x89\x46\xef\x0d\x74\x4d\xb9\xbb\xc0\x36\x16\x30\x65\x57\x9e\x65\x74\xa4\x23\x0c\x78\x06\x2f\xc8\x5c\x25\x16\xb8\xa0\xb2\x42\x21\xb5\xdd\xca\x24\x54\x5a\x5b\x39\xfb\x2e\x04\x73\x4f\x80\xa4\x1a\x20\x00\x6b\x2b\xe9\xb7\x99\xc1\xd0\x89\x4f\x14\xe4\x5c\x69\x0b\x64\x8d\xba\xfe\x56\x88\xd3\x54\xc6\x5d\xc2\x1a\x21\xec\x0b\x00\x10\x83\x6e\xe7\x5d\x60\x14\x42\x69\x13\x83\x25\x82\x4a\x4f\x4c\x4d\xc5\x3c\xee\x5b\x94\xe3\xe4\x3b\xe2\x4d\x61\x48\x78\xd8\xea\x40\x56\x84\x33\xc0\x1d\x00\xfa\x01\xf6\x24\xff\x8e\x7d\xe0\xbb\x36\x66\x65\x23\x3a\xef\x38\x05\x3b\x30\xc6\x9d\x1b\x29\xec\x3a\xf8\xe4\x61\x2b\x61\x2a\xd7\xc1\xf7\xc3\xf3\x4e\xff\x20\xf9\xa5\x87\x01\xec\x32\xf1\xcb\x5e\x92\x87\xf0\xb1\xa3\x03\xaf\x8c\x73\x95\x40\x5d\x0a\x5d\xcc\xcb\x0a\x6b\xe1\xd7\x55\xb9\x2a\x6b\x8d\xfc\x1e\xb3\xda\xc8\xb9\xae\xb2\x20\xef\x29\x0b\x08\x3d\x79\xcb\x45\x44\x68\x22\x24\x42\x7b\xbb\x93\x20\x2d\x91\x6b\x74\x77\x42\xaa\xc6\xac\x96\xb7\xe5\x4c\xe5\xff\xdb\x2d\x0c\x28\x2d\xab\x1b\xf0\x2e\x21\xbf\xc4\x23\x5d\x08\xac\x2b\x02\xaf\x70\xb3\x5a\xa0\x7f\x56\xd0\x2f\x02\x4e\x3b\x74\xd5\xda\x45\x48\x76\x8f\x21\x24\x73\x13\x62\xf2\xbe\x37\x96\xe3\xe1\xdb\xc9\x87\xce\xa8\x2b\x7b\x63\x79\x35\x1a\x7e\xdf\xbb\xe8\x5e\x38\xea\xe4\xce\xe0\x02\x38\x92\xbb\x7f\xbd\x1a\x75\xc7\xe3\xee\x85\x1c\x8e\x64\xef\xf2\xaa\xdf\xeb\x5e\x30\x91\x72\xaf\x3b\x4e\x44\x6f\x70\xde\xbf\xbe\xe8\x0d\xde\x25\xf2\xcd\xf5\x44\x0e\x86\x13\xd9\xef\x5d\xf6\x26\xdd\x0b\x39\x19\x26\x72\xf2\xbe\xbb\xe3\x35\x39\x7c\x2b\x2f\xbb\xa3\xf3\xf7\x9d\xc1\xa4\x83\x94\xe0\x89\x78\xdb\x9b\x0c\xba\xe3\xb1\x7c\x3b\x1c\xc9\x8e\xbc\xea\x8c\x26\xbd\xf3\xeb\x7e\x67\x24\xaf\xae\x47\x57\xc3\x71\x37\x91\x93\xde\xa4\xdf\x85\xae\x0d\x86\x83\xe3\xde\xe0\xed\xa8\x37\x78\xd7\xbd\xec\x0e\x26\xd2\x8e\xe3\xa2\x37\x06\x4e\xf1\xee\x45\x2a\x7a\x03\x39\x18\xca\xee\xf7\xf6\x6f\xe3\xf7\x9d\x7e\x5f\x7e\x6f\x47\xd8\x91\x83\xee\xe4\xc3\x70\xf4\x2f\xe3\x44\xf6\x06\xe7\x29\x8c\x6a\x32\x96\xe7\xc3\xc1\x64\xd4\x7b\x73\x3d\x19\x8e\xc6\xf2\x4d\x57\xf6\x7b\x9d\x37\xfd\x2e\xd0\x94\xdb\x59\xb8\xe8\x5c\x76\xde\x75\xc7\xb2\x37\x90\xdd\xbf\x9e\xdb\x4e\x0e\xdf\xca\xff\x74\x9a\x9c\x9c\x9c\x24\x72\x30\x1c\x61\x9f\x07\x1f\x65\x6f\x70\xd1\x1b\x75\xcf\x27\xd0\x7a\xef\xa2\x3b\x98\x74\xfa\x89\x1c\x5f\x75\xcf\x7b\x9d\x7e\x22\xba\x7f\xed\x5e\x5e\xf5\x3b\xa3\x8f\x89\xfd\xf0\xf9\x70\x30\xee\xfe\xe5\xba\x3b\x98\xf4\x3a\x7d\xf7\x8d\xc3\x47\x66\xf4\x6a\x34\x3c\xbf\x1e\xc1\xa8\xc5\xf0\xad\x1c\x5f\xbf\x19\x4f\x7a\x93\xeb\x49\x57\xbe\x1b\x0e\x2f\xc6\xb6\xe1\x71\x77\xf4\x7d\xef\xbc\x3b\x7e\x2d\xfb\x43\xec\xeb\xb5\x9d\xbe\x8b\xce\xa4\x03\x1f\xbe\x1a\x0d\xdf\xf6\x26\xe3\xd7\xf6\xdf\x6f\xae\xc7\x3d\x3b\xed\xa2\x37\x98\x74\x47\xa3\xeb\xab\x49\x6f\x38\x38\x92\xef\x87\x1f\xba\xdf\x77\x47\xf2\xbc\x73\x6d\x17\xdf\xce\xf9\x70\x00\x43\x9c\xbc\xef\x0e\x47\xc0\xa1\x6d\x27\x09\xd7\x4e\x7e\x78\xdf\x9d\xbc\xef\x8e\xec\x04\xc1\x54\x76\xce\x27\x89\x18\x4f\x46\xbd\xf3\x49\xf8\xd8\x70\x24\x27\xc3\xd1\x24\x18\xa3\x1c\x74\xdf\xf5\x7b\xef\xba\x83\xf3\xae\xfd\xeb\xd0\xb6\xf2\xa1\x37\xee\x1e\xc9\xce\xa8\x37\xb6\x0f\xf4\xe0\xb3\xe2\x43\xe7\xa3\x1c\x5e\x4f\xec\x77\xed\x9e\xba\x1e\x77\xf1\x9f\xc1\x46\x4e\x60\xbd\x65\xef\xad\xec\x5c\x7c\xdf\x83\x3d\x8b\x0f\x5f\x0d\xc7\x8e\x79\x7e\xf8\x56\x8c\xaf\xcf\xdf\xd3\x74\x7f\xd5\xd8\xff\xa7\xfb\x49\x9f\xbe\xbb\xea\x1f\x3f\x4b\x4f\x8e\xcb\xea\x18\x92\x22\x7f\x7f\x43\xe0\x41\xfd\xff\xf4\xe4\xd9\xd9\xf3\x97\x2d\xfd\xff\xf9\xd9\xab\x97\x5f\xf5\xff\x3f\xe2\x07\xc0\xc0\xbb\x83\xee\xa8\xd3\x97\x57\xd7\x6f\xfa\xbd\x73\xd9\xef\x9d\x77\x07\xe3\xae\x67\x79\x7c\x96\xc8\xb3\x6f\xe4\x77\x4d\xa1\xad\xc2\xfb\xaa\xc5\xb3\x6f\x7f\xb5\x17\x5d\x9f\x94\xe1\xff\xbc\xac\xeb\xb5\xf9\xf6\xe9\xd3\x85\x59\xd8\xfb\xff\xe9\x7f\x11\xa2\x7b\xab\x2b\xf0\x61\x31\x67\x6c\x4d\x3e\x52\xab\xd7\xb5\xc9\x74\x6f\x75\x35\x55\x75\xb6\x62\xb2\x9d\x08\xcc\x05\x30\x96\xd9\xaf\x31\x05\xfc\x4d\x55\x00\xa1\x72\xe6\xd1\x63\x10\x1d\x20\x6d\x43\x96\x3d\x00\x99\x0e\x7e\x2d\xcc\x63\xb1\x5d\x82\x3a\x7d\x36\x85\xac\x9d\xe2\x09\x9d\x0b\x4a\x7a\x80\x38\x0b\x74\x0e\x2c\x01\xca\x9d\xa3\x77\x30\x08\x02\x98\x2b\xe1\x9b\xa4\x63\x7a\xd8\x2b\x78\x95\x4a\x72\x01\xda\x15\x93\xed\xd5\x27\x2d\xd4\x9d\xda\xc8\x4d\xd9\x20\x8a\xc3\xdc\x2a\x4b\x0c\x83\x05\x39\x56\x48\x99\xcc\xe1\x5e\x93\xca\x37\x1b\x8a\x6c\x1a\xf4\xf8\x84\xc3\x15\xdb\xc3\x75\xd8\x67\x75\x29\x6f\x1a\xc0\x8a\xd6\xfa\xf1\x0f\xaa\x3c\x17\x0e\x68\xb6\x5c\x48\xc5\x09\xe9\xc7\xc7\xec\x6a\x84\x52\xdc\xac\x26\x97\x2f\xe5\x5f\xba\x69\x80\xe8\x60\x9e\x43\x41\x33\x00\xf7\xa4\xe2\x83\xc6\x0e\xef\xdf\x58\x5c\xf9\xff\xc0\x0a\xf2\x84\x8b\x72\x21\xed\x20\xf8\x83\xaf\x25\xc3\x90\x42\x5a\x03\x12\xbb\x7b\x47\x24\xc4\xca\x11\x9a\x42\xcf\x19\x85\x0b\x18\xe8\xb3\xda\x08\xcc\x0c\x30\x29\x78\x62\x5d\x85\x82\x6d\xb1\x2e\x71\xae\x38\x1d\x3f\x91\x75\x59\xa6\x42\x7c\x58\xea\x42\xde\x81\x99\xaa\x3e\x41\x54\x2c\x1c\x7d\x62\xff\x84\x29\xb1\x0b\x5d\x55\x04\x6e\x46\xf3\x9d\x60\x2e\x47\x95\xcd\x74\x2a\x87\x4d\x25\x76\x8f\x74\x7b\xbf\xf8\x59\x07\x53\x70\x53\x36\x14\xea\x5c\x6a\x6e\x5b\x84\x84\xc8\x3a\x38\x59\xf1\xe2\x1c\xd2\x4a\x57\x37\x0e\x5c\x6b\x25\xb3\x05\x34\x79\x97\x99\xe5\x11\xa5\xef\x6e\x80\xe1\x6d\xa6\xb3\x5b\x1d\x19\x90\x65\x05\xb3\x74\xa3\x31\x9c\x41\x2f\x2a\x88\x6e\x24\xbe\x77\x00\x39\x01\xfb\x09\x72\x77\xdd\xe7\x09\x68\x66\x9d\xe9\x19\xf6\x0e\xab\xe3\x0a\x7d\x87\xfd\xf4\x93\xed\xd2\x5e\x6d\x73\x9f\x0a\x04\x0e\x14\xae\x1a\x5f\x63\x19\x7e\x71\x43\x29\x8e\x9c\xbc\x0e\x4b\xc6\x99\x42\x77\xda\x15\xcb\xaf\x2b\x0d\x78\xca\x94\x18\x0c\xb6\xc9\x5c\x17\x50\xd1\x07\x88\x84\x41\x8a\x97\x00\xc4\xaf\x4f\xee\x4f\xa5\x9d\xfa\x4a\xbb\x72\x37\x9f\xa0\x45\xc8\x22\x89\x5f\x11\x42\xbf\x63\x5c\x73\x8c\x3c\x65\xda\x08\x9a\xaa\x9d\x4b\x14\x4e\x11\xb8\xd1\xe9\x61\x2c\x3a\x94\x59\xfd\xed\x76\x7b\x80\x4d\x43\x71\x09\xbf\x0b\x6c\x6b\x0e\x53\xea\x2d\x78\xd9\xd5\x6a\x9d\xeb\x44\x3e\xf4\x7d\x08\x8a\xb9\x73\xee\x43\x8d\x37\x95\xaa\x33\x80\x49\x44\x44\xa2\x85\xa6\xa1\x82\x55\xba\x56\x86\xf1\x77\xea\x10\xbc\x8c\xaa\xb4\xd4\xca\xf5\xca\xf8\x95\xa4\x3d\x35\x4f\xc5\x47\x6e\xa7\xb5\xb9\xeb\xa5\xde\xc0\x59\x4b\xdc\x06\x0c\x36\x1d\x4e\x95\xdb\x8f\xa9\xec\x14\x73\xe1\xba\x64\x96\x18\x62\x5e\xf1\x0e\x01\x7f\x3e\x84\x93\xf5\x06\x77\x11\x65\x7a\x73\x76\x2c\xd1\xae\x60\x89\x84\xaa\x63\x39\x74\xd5\xdf\xb5\xaf\xc8\x5d\x70\x57\x4a\x53\xeb\xb5\xf9\x56\x1e\x9e\x1e\x51\x52\x52\x00\xb4\x44\xa1\x3c\xbf\xac\x76\x43\x1f\x9e\x1d\x61\x15\x26\xed\xb9\xcc\x38\xe9\x76\x83\x88\x4e\xf6\xf7\x10\x3a\x09\x0c\x73\xbe\x46\x93\x70\xf5\xc8\xa7\xe1\xb6\x08\xad\x37\x66\x9e\xf2\x98\x9e\x60\x75\x13\xca\xb8\x27\x41\x8d\x32\xdd\x1f\x57\x7d\x87\x22\xa1\x7f\x5c\xe7\x20\xcc\x39\x7b\xdf\xd5\x65\x71\xfa\x81\x07\x1f\x88\x44\x0a\xba\x0d\xa0\xf2\x14\xa4\x7d\xfc\x4d\x61\xd4\x27\xed\xbf\x46\xa0\x6f\x34\xd9\xe8\xfc\xd2\x73\x0f\x6c\x3e\xc5\x74\x12\xf4\xf6\xa1\x00\x99\x53\x3e\x00\xf6\x2a\x03\x81\x3c\xcd\xf5\xaa\x05\x50\xc4\xe0\x6f\x73\x48\x58\x28\x74\xd9\x18\xcc\x14\xa0\x9e\x20\xcc\x97\xbe\xcd\xca\xc6\x03\xa9\xa7\x02\x13\x16\xe6\x1a\x31\x9a\xdb\x72\xd7\x4a\x08\x02\x9f\xc3\x5a\x78\x8c\x55\x99\xda\xde\x6f\x65\x25\xab\xa6\x70\x83\x88\x2e\xcd\x48\xe8\x65\x85\xc9\xb0\xd0\x70\x95\x48\x95\xd7\xcb\xb2\xb9\x41\x7f\xd3\x4a\x15\x0d\x94\xda\x54\xba\x62\xa4\x11\x53\x7a\x5c\xa4\x85\xbd\x20\xc1\x8f\x95\x63\xfa\xab\x67\x4d\x72\x3e\x2b\x95\xad\x42\x08\xb3\xe2\x86\x97\x21\xb8\x18\x02\x5d\xc2\x2f\x9b\xd5\x66\x02\x3c\x80\xb5\xaa\x6b\x5d\x15\x5e\x1e\x4c\x21\x9a\x38\x9b\x35\x15\xd7\x38\x08\x55\x69\x45\x1f\x43\x5f\xcf\x22\x82\x45\x35\x54\xf3\x1c\x14\x6c\xae\xad\x58\x30\x1a\x4b\xf4\x50\x6b\xc8\x0c\x5e\xe3\x4d\x61\xe7\x74\x5d\x63\xce\x7e\x20\x4c\xef\x34\xca\x52\xbf\x12\x76\x3a\x18\xa8\x9b\x66\xd7\xee\x26\x84\x25\x5d\x66\xd3\x0c\xeb\x4d\x48\xed\xd2\xa1\xe3\x99\x7a\x0a\xa1\x3b\x18\x97\xdb\x3e\xaa\xca\x8c\x0e\x6b\x18\x31\xef\x9a\x70\x0f\xa1\xf6\x06\xef\x10\x88\x16\xcb\x4a\xab\x39\x6c\x28\xae\x99\x5c\x72\x3e\x8f\x71\xb5\x49\xf6\x8b\xf4\xa6\x6d\x8a\x12\xf9\xdb\x1b\xe3\xdd\x55\x1f\x60\xfb\xec\xdd\x14\x83\xab\xb6\x24\x39\x69\x4f\xe2\x6d\x56\x00\xb2\x23\x02\x16\xb1\x9c\xc6\xa8\x39\xa4\x13\xdb\x49\x9a\x95\x05\x0c\x24\x07\xdd\xc6\x6d\x3e\x97\xc4\x36\xae\x55\xad\x8d\x08\x80\x47\x30\x23\xc7\x65\xaa\x79\xa8\x4a\x96\x20\x0e\x28\x80\xe2\xca\xfe\x1a\x2f\x10\x6c\x56\xe5\xc7\x94\x07\x24\xb8\x7c\x91\x6b\x7c\x0b\x9a\x0e\x2a\x56\x86\x89\xb4\x0a\x06\x1c\xc9\xdb\x32\x43\x1f\xae\x83\xbf\xb3\xfb\x13\x73\xc4\x04\x77\x08\x55\x3a\x4c\xb4\x88\xb4\x03\x39\x83\x21\x30\x5e\x1b\x86\x7b\xb3\x5b\xbb\xc9\xd6\x55\xb9\xae\x32\x5d\xab\x6a\x93\xca\x49\x29\xf8\xda\xb7\x8b\xe5\xa5\x10\xf2\xc1\x90\x10\xe2\xcf\xcd\x54\x11\xfb\x59\x65\x70\xe5\xd3\x97\x45\x51\x16\x90\x0c\xcf\x90\x6f\xb8\xbb\xe9\x9e\x01\xd5\xca\xfb\xa9\x17\x25\xc2\x9b\x40\xe8\x7c\x2b\x50\x10\x3a\xfe\x29\x39\xdf\x36\xda\x1d\x5d\x8e\xc1\x23\x75\x3e\x1c\x5c\xf4\x26\xbd\xe1\x60\x0c\x49\x1f\x27\x69\x08\xb8\x82\x89\x20\x07\x93\xe0\x02\x39\x20\x1c\x22\xdb\xf1\x5b\xc7\xc8\xc4\x3b\x6e\xaf\x56\x9d\xc6\x30\x2d\xa0\x3e\x23\xd8\x82\xbb\xca\x8e\x11\x76\x4e\xdd\xd1\x84\xb9\x1c\xac\x5d\x56\x52\x22\x50\x78\x18\x69\xf4\x2a\xb3\xb3\xd1\xcc\x6a\x70\xed\x1a\x30\xa1\x0e\xec\xb4\x5d\xe1\x6c\x86\x5d\x8e\xe0\x9e\x20\xc8\x0f\x7a\x3b\x87\x7a\xc2\xa8\xb7\xeb\x79\x57\xcd\x96\xfc\x04\x1a\x78\xf3\x79\xa5\x8d\xc1\xdb\xe3\x60\x53\x36\x07\xa9\x3c\xa0\xc7\x35\x25\xd6\x1d\x78\x3d\xe5\x80\x73\xf9\x03\x09\x06\x38\xb4\x50\x44\xfe\xaf\x8a\xa7\x7a\x52\xca\x03\xbc\x67\x0f\xb0\x3c\xe2\x13\xe3\x6a\x90\x79\x0b\xda\xa4\xd5\x90\xe6\x6a\x0d\xc7\x0a\x5c\xf3\x41\x9a\x15\xe5\xeb\x0a\x25\x17\xca\x2c\x91\x87\x83\xd1\x14\xbc\xca\x10\xba\xdc\x09\x0b\x77\xa9\xe2\xf2\xdf\x05\xe0\x9b\xfd\xa8\x66\xa8\x6a\xa0\x10\xf7\x48\x29\x77\x94\x66\x48\xce\x75\x45\xfd\x0e\xae\xd8\x03\xee\x12\xe7\xc3\x00\xe4\x20\x68\x77\xf0\xf2\xc1\x14\xcc\x24\xfb\x60\xfb\xa9\x54\x88\x8e\x3c\xe0\x2c\x9b\x3b\x80\xa0\x58\x85\x00\x14\x35\x50\x17\xb9\x2f\xd2\x2a\x4b\xdf\x38\xb7\x0d\x77\x09\xfd\x99\xe6\xd7\x1e\x5c\x75\xa3\x6a\xbd\x3d\xc5\x73\xd8\x1d\x08\xd3\x86\x80\x53\x58\xa0\x10\x44\x03\xfc\xc4\x89\x3b\x2f\x1b\x50\xdf\xad\xf4\xcc\xca\x44\x6b\xe2\x6b\xbb\x1f\x55\x95\xe5\x9b\x20\xb1\x2f\xca\x3d\xd9\x4e\xe0\x98\xfd\xbf\xec\xbd\x6b\x73\xdb\xca\x95\x36\x3a\x9f\xfb\x57\x74\xb1\xea\xd4\x16\xe7\x40\xb4\x25\xdf\xb2\xed\x54\xea\xd0\x12\x6d\x73\x22\x91\x1a\x92\xda\x1e\xbf\x6f\x4d\xd5\x34\xc9\xa6\x84\x18\x04\x38\x00\x28\x99\xf9\xf5\xa7\x7a\x5d\xba\x57\x03\xa0\xec\x9d\x99\x24\x73\xd9\xfa\x90\x78\x4b\x24\xd0\xf7\x5e\x97\x67\x3d\x4f\xcc\xb6\x4a\x99\x4d\xfb\xcd\xae\xf6\x35\x05\x25\xdc\x8e\x0e\xe5\xdb\xde\x28\x03\xae\x12\xe7\xed\x3d\x18\xb4\xb6\x0f\x03\xd7\x69\xe8\x66\x84\xfc\xe8\x3e\x24\x4e\x9e\x4a\x15\xf6\x13\x45\x4b\xa2\x49\x40\xe5\xc5\x3f\xb0\x14\x0b\x21\xe2\xab\x62\x9f\x23\xcf\x34\x61\x69\xdc\x79\x09\x7e\x84\x36\x95\x7a\xb4\x59\x46\xd3\xb0\x2a\xf2\x07\xdb\x5c\xe6\x8c\x39\xa5\x9b\xdf\x77\x00\x4e\x03\x4b\xd2\xce\x14\xf8\x40\x90\x96\x62\x9f\x15\x20\x55\x68\xc4\xa3\xbb\x31\xd0\xd7\x60\x06\xe4\xb5\x65\xaa\x01\xa2\xf5\x05\x95\x9b\xfa\xbe\x04\xe3\x28\x8c\xa7\xca\x31\x13\x4b\xa9\xd3\x1c\x50\xcb\x79\xb5\x41\x9c\x99\x21\xc3\xd8\x17\x46\xbb\xe6\xa7\xf9\x9d\x5b\xab\x79\x78\xcb\x83\xc5\xc7\xc3\x2f\x36\x66\x05\x99\xbe\x5d\x66\x0e\x95\xee\x0d\x77\x78\x69\xb8\x49\x42\x82\x8c\x09\x24\x20\xab\x1e\x53\x7a\x11\x7c\x0f\x2b\x96\x6b\x81\xd8\xc1\xf7\xe5\x29\x5f\x93\xbb\xb2\xd8\xa6\xc4\x1b\xe6\xcc\x02\x58\x61\x44\x95\x0a\x57\x9b\xf3\x14\xfc\x9b\x31\xd8\xe0\xdf\xdd\x4a\x80\x7a\x8f\xa1\xb6\x59\x86\x4e\x15\x8d\xd1\xd3\x06\x3a\x1d\x37\x27\xb4\x54\x63\x0c\x22\x56\xf6\x78\xac\xad\xb3\x78\x15\xe7\x41\xc9\xf7\xf7\x47\x2a\x96\x20\xe0\x98\x86\xe7\xb6\x4f\x62\x6c\xe9\x7d\xf1\xe8\xa6\xfd\x21\xb5\x8f\x34\x2d\x3e\xae\xc7\x27\x36\xc3\xa7\xc2\x34\x10\xda\x0e\x31\x67\x98\xe9\x85\x3e\xae\x8a\xed\xd6\xe4\x6b\x3c\x8e\x19\x5f\xc6\x37\x0b\x48\x54\xef\x13\xf4\x58\x71\xc0\x75\x5a\xdb\x2d\x27\x7f\xe1\x49\x5b\x6b\x6b\x2a\x55\x58\x95\x69\x6d\x4b\xcc\x0e\x02\x79\x19\x6b\x83\x5e\x38\x0f\x12\x6f\xf2\x9e\x70\x2a\x7b\x18\xc2\x8a\x8e\x21\xbc\xec\x37\xb6\x24\x16\xb6\x6d\x74\xb4\x43\x68\x0a\xf6\xa3\x8a\xd4\xd9\xc1\x5d\xa8\x07\xba\x37\x45\x8c\x32\x3e\x3d\xec\x2a\x67\x4e\xd0\x8b\xf9\x99\x46\x9c\xb5\x73\x67\x78\x9a\x72\xad\xc7\x3c\x60\xe1\xcb\x62\x10\x71\x1f\xe2\x19\x9c\xc2\xdf\x8a\xcd\x26\x05\xbb\xaa\xa2\x27\xa8\xb5\x33\x1e\x08\x10\xcc\x98\xbc\x3f\xdb\xb5\xff\x40\x05\x04\x4d\x89\x2e\xca\x84\x87\x71\x65\x2a\xcf\xf0\x0b\x2f\xaa\x02\xe2\x91\x02\x02\xac\xad\x63\x7c\x98\x6c\x0b\x00\x0d\x93\xdf\xed\xcd\x9d\x4d\x80\xc7\x8f\x2b\xfd\x1f\xd3\xb5\x33\xd1\xc0\xba\x32\xdb\x22\xbf\x13\x8e\x2a\x10\xa5\x21\xa3\x31\xad\x41\x7a\x04\x4f\xcf\x1c\x1c\x15\xca\x8f\xa7\x6e\x73\xf2\x5d\xe8\x0e\xe2\x60\x30\x70\x89\x20\xdf\x18\xf2\x26\x55\x7e\xbe\x60\x11\x01\x91\x09\x2d\xf9\x13\xd3\xd7\x81\x84\xc9\x57\xe7\xe5\x45\xb9\x35\x99\x9f\x9b\x9d\x59\x7d\x35\x77\x20\x14\xa0\xaf\xcd\x9f\x8a\x12\x14\x98\x8b\xdc\x87\xaa\xbd\xdb\x03\x71\x3e\x6f\x00\x98\xba\xfd\x71\xd8\xdc\xcb\xbe\x02\x30\x09\xb1\xb1\x04\x96\x60\x41\xbb\x0f\x0d\x26\x6f\xaf\xeb\x41\x58\xc5\x97\xb2\x12\x81\x32\xba\xbd\x6c\x60\x81\x62\xe3\xdc\xca\xe1\xcf\xd2\x3d\x54\x1d\xbb\x44\x54\x40\xb2\x40\xf0\xcf\x8d\xc3\x40\x0f\x75\xaf\xd1\x88\x5e\xe2\xb9\x37\x80\x36\xef\x5b\xcd\x8c\x5d\x46\x6f\xe1\xa3\xce\x2a\x03\x1f\x0b\xfc\x04\xf8\x92\x3e\xf9\x6a\xcb\xdc\x66\xee\x60\xcf\xd7\xc5\x23\xf9\xa2\xc4\x2f\x5f\xe8\x22\xef\x7b\x4f\x9a\x55\x31\x88\xfb\x24\xbf\xa3\x0f\xab\x93\x14\xb0\xcf\x7d\x77\x07\x07\x3c\x67\x73\x51\x94\x7b\x86\xa7\xc2\xb5\x92\x66\x48\x29\xcf\xae\xd7\x7a\xbf\xb2\x7e\x6d\x10\x8c\x95\xcb\x22\xa1\xdf\xb0\x03\x76\xa5\xad\xc5\xf7\x9c\xeb\x9f\xd6\xbc\x3c\x2f\x8a\x12\x23\x74\x00\xb5\xc5\xe3\x25\x3a\x46\xd2\xf8\x89\x88\x85\xc1\x21\xc2\x8a\x7d\x1a\x68\x05\x7f\x0e\x9e\x21\xba\x59\xb5\x4d\x38\xec\x40\x2b\x87\xa9\x6e\xe3\x9e\xf6\xa1\x59\xee\x69\xf8\x32\x7c\x1a\xd2\x73\x70\xa8\x28\x74\x34\x60\x83\xab\x55\x99\xee\x6a\x32\x68\xf3\xba\x2c\x32\xf2\xde\x82\xa1\x30\x50\x9f\xb0\x8c\x01\x70\xf0\x1e\xd7\x2c\x59\x94\xdc\x53\x7f\xaa\x74\x73\xab\xc2\x88\x36\xdd\xc5\xba\x28\xb2\x4a\xfc\x21\x3b\x88\x45\x18\x85\x82\x79\xdd\x96\x9e\x26\xd3\x5b\x98\x29\x40\x3f\xdc\x58\xba\x3d\xd9\x6c\xb1\xd8\x91\x28\xc5\x50\xb7\x6c\x72\x8c\x5d\xf9\x18\x69\x34\x8b\x8a\x2e\x09\x7f\xdd\x0b\xe3\xc1\x7b\x62\x7a\x93\x02\x5f\x54\xa3\x24\x8d\xcf\x74\xf8\xe3\x06\x65\x66\x68\xd0\x19\xbd\xd4\xd8\x57\x98\x87\x59\x83\x48\x32\x12\x68\x41\xce\xec\x90\x9b\x2d\x21\xe1\xb2\x34\xff\x6a\xd7\xaa\xda\x2f\xfd\xc8\x78\x5c\x18\xdb\xfd\x11\x74\x4e\x06\xb2\x28\xee\x16\xee\xd0\xe5\x41\xa5\x79\x9d\x6e\x9d\xe5\x81\xb4\xc5\x11\x26\x89\xa8\x28\xdc\x42\xd8\x64\xc5\xa3\x00\xe2\x17\x18\x33\xf1\x6d\x08\xe9\x32\x37\xb8\x55\x34\xba\xb8\x39\xba\xf6\x06\xc6\xe5\xe5\x02\xf2\x26\x3e\x87\x61\x89\x27\xb8\xb4\xbc\x05\x94\xd9\xd7\x05\xc4\xaa\xa0\x7b\xe8\x74\xb5\xdf\xdc\xf5\x3a\xbc\xf8\x8f\x36\x26\xde\xa7\xcd\x13\x0f\xe3\x2c\xa6\x0e\x8c\xe6\x4c\xf6\xa4\xdf\x9b\x2a\x5d\xe9\x1b\xef\x7e\x38\x6f\x51\x40\x05\x3b\x20\xdb\x1c\xee\x75\x2b\x92\xff\xcc\x66\x5b\x6d\xf1\x9a\xf1\x96\x20\x57\xec\xdc\x70\x60\x1e\xb9\xaa\xac\x20\xa4\xb5\x12\x25\x68\xb1\x4a\x72\xdd\x81\x0e\xa4\x98\x22\xbf\x5e\x14\xd5\x9b\xcd\x26\x2d\xb7\x15\x46\xb8\xf7\x39\x97\xb7\xc4\xe1\x67\x3e\x56\xc2\xe6\xf3\xfe\x1b\x0c\x2b\x51\xa1\xc1\x9c\x94\xfb\x3c\x47\xdf\x47\xfa\x8a\xc8\xf5\xe3\x79\x8b\xe4\x60\x28\xe6\xe3\xae\xfd\x93\x12\x7d\x97\x42\xa5\x4f\x20\x45\xc6\x0a\xa2\x3a\xad\xf7\x35\xd9\xde\xe1\xe1\x54\x2e\xc4\xcf\x33\xab\xaf\x79\xf1\x98\xd9\xf5\x9d\xad\xa2\xc8\x7d\xb1\xf1\x35\x0c\xa1\xb0\xc0\x6d\x8d\x07\x93\xe1\xad\x1c\x97\xe8\xad\x24\xb3\xdd\x40\x61\xce\x82\xa4\x02\x12\x18\x14\x32\xfb\xd1\x77\x8d\xda\x24\x92\x1e\x54\x01\x87\x96\xb4\x77\x5b\x95\x98\xa5\xaa\xd0\x99\xb3\x88\x0c\xb5\x97\x33\xd3\xa1\xfa\x9e\x73\xad\x29\x10\xdc\xac\x2c\x66\x2c\x83\x81\xae\x1a\xef\x2e\x7c\xaa\x8b\x56\x57\x55\x64\x91\x46\xc1\xbd\x79\x20\xe6\x80\x2d\xfa\x6a\x91\xe5\xaa\x3c\xd1\x43\x86\x7e\xc5\xa1\xd8\x27\x84\x38\x04\x69\x96\x03\x55\xfb\xea\x8d\x59\x51\x4e\x0a\x69\x08\x69\xf6\x49\xe0\x09\x63\x42\x31\x92\x15\x12\x84\xc5\x16\x78\xdb\x38\x8a\x1d\x17\x0b\xf9\x2c\x76\x1e\x5c\x3a\x24\x59\x20\xf0\xa6\x0a\x06\x4d\x3c\xc0\x70\x64\xad\x24\x29\x16\x06\x21\xf7\x55\xa0\x50\x13\x6d\x0c\x1c\xe6\x38\x6c\xd4\x53\xcc\x26\x41\x30\x5e\xcb\x81\x28\x72\x9c\x9e\xa5\xbd\x37\xd9\x26\xa1\x8d\x0d\xbf\xc2\x40\x03\xa1\x4d\xb9\x25\x09\x04\x3b\xa0\x6b\x18\x6b\xa4\x68\x35\x8e\x3a\xec\x16\x76\xe3\x31\xfe\x45\x09\x39\x78\xa2\x28\x43\x57\x9e\x37\xb8\xd8\xd7\x9c\x4c\x40\xc2\xa2\x50\xd0\x0b\x63\x79\x80\xba\xc8\x0b\x3f\x68\xa1\x6c\x88\xca\xb1\xd3\x72\xb5\xdf\x3a\xab\xdf\xd9\xf3\x11\x58\xc3\x2d\x10\x67\x9f\xfb\xa0\x67\x58\x9f\x8a\xce\x95\xa5\xcd\x8a\xc7\x81\x9e\x33\x2b\x29\x58\xec\x11\x24\xe3\x9d\x67\xac\x38\x7b\x4e\xe5\xe2\xa0\xb2\xe0\x69\x51\x07\x44\xd8\x05\x42\x5a\x94\xb0\xb8\xc5\x84\x05\x7a\xdf\xc4\xb6\xf2\xc1\x0d\xce\x30\xaf\xd3\xd3\x0b\x68\xf2\x03\x89\x8b\x5f\xc1\x46\x9c\x14\xf1\xe1\x52\xdd\xbb\xd5\xb1\x74\x57\xb3\xdd\xda\xb5\xbf\xe8\x9d\x89\xc4\xe1\x61\x21\xda\xb2\x02\xce\x57\x10\x43\x52\x47\x0b\xab\x36\xfb\x6c\x93\x66\xc0\x73\x2e\x0a\xd7\x79\x44\x9d\xe3\x93\x59\x7d\x76\xe6\xa9\x01\xc6\x37\x53\x11\x2d\x02\x9e\x8b\x83\x36\xeb\x62\x57\x63\xd0\xeb\xfc\xb9\xbe\xb4\x2b\xbb\x5d\xda\x12\xf8\x83\x13\xa9\xba\x05\xe1\x55\x5e\x1e\xce\xfa\x80\xc8\x09\x69\x0e\xe5\x77\x34\x6f\x3c\x08\x9c\xa3\x61\x41\x27\x86\x25\xe0\xce\x02\x7f\x3d\x3e\x20\x13\xca\xd3\xbb\x61\x08\x52\x3a\xbb\xe2\x11\x8b\x7f\x36\x45\xb9\x4c\xd7\xf1\x4b\xa0\x00\xb1\x6b\xc4\x9a\x65\x8d\xd0\x92\xb8\x7d\x29\x17\x61\x21\xcb\x3e\x71\xa5\x74\x70\xc7\x8a\xbd\xde\x55\x6a\x17\x77\xc1\x50\xaa\x97\xe1\xde\x44\x35\x57\xd3\x4b\x41\x75\x63\x9b\xd6\x5a\x30\x24\x96\xd1\xa9\x16\xe9\x28\x51\x20\x01\xf9\xab\xa9\xc4\x0b\x1c\x46\x73\xe7\x0e\xda\x5a\x9a\xb4\x60\x8e\x24\xb8\x2d\x31\x09\x4a\x65\x0b\xa9\xad\x7e\x52\x52\x2f\xef\xd8\x68\xea\xa3\xa3\xc9\x8c\x0d\x3a\x6c\xda\x5f\x18\x1f\x75\x81\x31\xb3\x70\xf1\xd0\xe4\x76\x02\xa8\xbc\x9d\xf0\x53\x15\xd9\x30\x78\xa7\x70\x1c\x4e\xa5\x35\x78\x6b\xc0\x14\x02\xb4\xc7\x89\xee\x3a\x9e\xf3\x6a\x97\xae\xf6\x98\x45\x05\xb3\x23\x84\xaa\xb2\x03\xfa\x87\xd5\xbd\x33\x50\xac\x71\xd3\x8f\x28\xaf\x27\x03\x5a\xef\x50\x10\x2c\x45\x10\xb9\xc1\xdc\x2d\xa4\x5d\x41\x1b\x18\x2c\x78\xa6\x39\xf3\x66\x12\x91\x67\xe7\x45\x7e\xca\x16\xc9\x83\xcf\xb7\xac\xc9\x55\x47\xc9\x65\x32\xbd\xe9\x14\x7e\x13\xf2\x14\xb8\x92\xd6\x4f\x34\x80\xc6\x4f\x54\xbd\xcb\xba\xfb\x77\x70\xa4\xdf\xa5\x28\x4b\x23\x81\x0e\xdd\x71\x2e\x6d\xe0\x2e\xf7\x77\x5b\x88\x74\xfb\x69\x44\x00\x0e\x56\xed\xa6\x28\xb1\x90\x17\xf4\x6f\x77\x07\x85\x41\x95\x53\x02\xd6\x83\x6b\xcb\xa1\xd8\x03\xdf\x01\x62\x09\x48\xf7\x1f\x29\x7f\x29\x14\x28\xe8\xc8\x3d\x76\x63\x40\x5c\x06\x62\xa5\x5d\xb3\x2b\x45\x96\xf0\x2f\x21\x31\xde\x58\x72\x1d\x21\xfc\x60\x97\x92\x89\xd1\x8a\x7d\xb1\x73\x9d\xd6\x81\x88\xd5\x7f\x89\x19\x90\x28\xb8\x22\x97\x6c\x87\xfe\x0a\xcf\xeb\xcb\xae\xe5\x4a\x69\x2b\x4b\xc9\x17\x56\xba\x0c\x17\xd8\x5b\xa5\x4c\x1f\x2c\x55\x0c\xea\xb9\xeb\x7d\x65\x4a\x4c\xa6\x52\x08\xb1\xb1\x1a\xc3\xd3\x83\xbf\x89\x71\x1b\x45\x58\x0d\x13\x4a\x3a\xd7\xc8\x5c\xbe\xfc\x8b\xde\x91\x12\x8d\x39\x41\xd4\x84\x42\x45\x73\x1b\x48\xbb\x1e\x16\x3f\x57\x40\xe1\x4c\xbf\x21\x3b\x58\x4a\xeb\x51\xe3\x49\x6c\x4b\xfc\xc1\x79\x3a\x4c\xa1\xea\xe6\xaa\x77\x64\x73\xf4\x06\x4a\xad\xfa\xda\xc3\x75\x24\x1f\x39\x15\x6c\xd3\xf1\x2c\x82\x6a\x1d\xe7\xbb\x67\x3a\x50\x8f\xf7\xc0\x76\x8b\x2e\x75\x01\x15\xfa\xb6\xe2\xdc\x3e\x6e\xa9\xd8\xa0\x47\xa4\x47\x10\x72\x82\x9d\x9d\xe0\x36\x53\x98\x3e\x88\xaf\x6f\x3f\x20\xb2\x24\x16\x96\x52\xc2\x07\x02\xd1\x18\x87\x0b\x01\x49\x78\x18\xb8\x08\x2e\x65\xe2\xbc\x4f\x53\xae\x33\x52\x5b\x22\x74\x11\x92\x36\x62\x30\xd0\xae\x1b\x4d\x75\xc7\x44\xa5\xdc\x66\x8e\x1c\x28\x39\x6a\xec\x68\x0a\x8c\xa2\x39\x50\xda\x3c\x0a\xad\x40\xd1\xbd\xf3\x7c\x11\xb8\x10\x1e\x48\x60\x2e\x94\x8c\xa5\xf2\x37\xac\xb5\x06\x70\x15\x06\xa6\xd6\x7d\x8e\xb7\xc3\x0b\xef\x4d\xf5\x44\x42\xa4\x4a\xf0\xcc\x41\xc3\x17\x53\x14\x5a\xa4\x46\x54\x94\x1a\x79\xc7\x9c\x16\x09\xbb\x6d\x9c\xec\x6b\xbe\x45\x04\x8f\x09\x09\x00\x9a\xa1\x1d\x6f\x88\x93\x2f\x74\xd9\x42\xcb\x7d\xac\x80\x84\x5d\xec\x96\x71\x32\x6a\x48\x01\xbd\x40\x34\x17\xdb\x85\x41\xc9\x32\x94\x09\x92\xcc\x05\x17\xd8\xb3\x8f\x12\x47\x8a\x90\x9f\x05\xea\x8e\x20\x7d\x03\xb6\x4e\x84\xe2\x68\xd9\x26\x21\xd6\xa4\xd0\x19\x01\x89\xcd\xb5\xcf\x59\x72\xe8\x05\x2d\x84\xad\x36\x3a\x73\xb7\x40\x19\x70\x77\x28\x36\x0a\xe9\xc4\x87\x22\xdb\x6f\x41\x70\x0f\xc9\xc3\xcd\x1d\x6a\x9f\xca\x0c\x21\x5f\xdf\x22\xe1\x9b\xeb\x9e\xb9\xbb\x73\xab\xb6\xb6\x3d\x9e\x1b\x31\x44\x8a\x95\x86\x42\xce\x58\x28\xb0\x50\xdf\x39\xc4\x89\xd6\x14\x5c\x8c\x08\x7e\x2a\x1a\xda\xc0\x45\xeb\xf9\x6c\x2b\xe9\xa5\x3d\x14\x30\x24\x86\xab\xca\x39\xc5\x4e\x0e\x2a\xfa\x1d\x03\x94\x85\xa9\xc8\xde\x6c\x86\x0c\x72\x24\x00\xa3\x0e\x09\xea\xe8\x20\xc3\x24\x8f\x17\xba\xf0\xe1\xa8\xeb\x88\x0c\xf9\x07\x31\x8f\x86\xb8\x08\x27\x45\x7e\x4a\x77\xe0\x87\xa2\xdc\x76\x5e\x80\xcd\xb6\xb5\x02\xba\xc7\xaf\xad\x4a\xbd\x84\x25\xf2\xea\xe8\xed\x25\xd2\x6c\x5b\xb3\xba\x4f\x73\x7b\x5a\x5a\xb3\x26\xba\xc4\x8e\xb8\xe4\x31\x8d\x32\x9f\x94\x73\x2d\xcc\x6d\xb8\x0d\x1f\xcd\x81\xee\xc1\x8b\xf0\xae\x38\xcc\x0d\x37\xb9\xdd\x2e\x8b\x35\x86\x57\x21\xc7\x76\x7f\xa8\x58\x48\x76\xbd\x5f\xd5\xfa\x24\xe8\x4a\x8a\xbf\x76\xac\xcc\x7e\x02\x96\xd9\x76\x67\xf2\x34\x50\x1e\x75\x47\xe0\xd2\x6f\x76\xad\x60\xe5\xaf\xf7\x25\xc6\xb5\xf8\xc9\x24\xce\xb1\xda\x57\x75\xb1\xc5\xec\x3d\xac\xd0\x08\xb5\x0f\xe7\x0c\xc2\xdc\xf0\x1e\xfe\xbb\xf5\xd1\xf8\xb2\x44\xb0\xce\x12\x8d\x64\x2b\x40\x0c\x56\x6b\x77\xc7\xd7\x00\xdb\xb2\xfa\x60\x0d\x31\xf4\xfa\x8f\xb8\xf3\x41\x04\x82\xd8\xc0\xdb\xe1\x85\x53\x12\x8f\x15\x8c\x84\x2d\x15\x1b\x7e\x1b\xa6\xd7\xe2\xe6\x83\x80\x02\x5c\x75\x77\xe4\xf1\xb9\x95\xe0\xee\x5d\xba\x6c\x89\x25\x55\x8c\x8c\xa2\x04\x22\x80\x59\x85\x59\xfb\x54\xc8\xd4\x67\x2e\xfc\x24\x68\x12\x28\x84\x56\x04\x8a\xef\xce\xb0\x5f\xa2\x7f\x74\xbe\xd5\x93\xf3\x9d\x90\x85\x8b\xd6\x73\x0e\x2c\x7a\x16\xa1\x33\x18\xfb\xb3\xa6\x2a\x72\xa2\xeb\xc7\xf2\x01\x7e\x97\xf3\x64\x7c\x02\xc1\x27\xb0\xe8\x48\xf0\x36\x29\xac\x98\x93\xf3\xbe\xc0\x80\x92\x69\x6e\x55\xf7\xe0\x38\x5b\xd7\x68\x42\x2e\x68\x48\xf1\x95\xda\xd4\xa0\x72\x00\xa6\x3f\xda\x54\xb4\x46\xc5\xd9\x18\xfb\x73\x72\xe1\x0a\xf1\x63\x6f\xb5\x50\x09\x2f\x2e\x12\x34\xb7\x1f\x28\x38\xd4\x1d\x06\x47\x53\xc5\x64\xb5\x2d\x73\x83\xf7\x73\xe5\xa5\x36\x8b\x3c\x3b\xa8\x62\xb5\x32\x15\xd8\x4b\xe4\xf7\xe5\x45\x1e\xa9\x4b\x63\x95\x0b\x05\x6c\x25\xa2\xbb\xb5\xa0\xd0\x1d\xdb\x63\xce\x91\xf6\x42\xd3\x59\xdb\x2f\xd9\x54\x7b\xbd\x44\x93\xe5\xc8\xbe\x5d\x92\xb3\x03\x76\x37\x4e\x03\x8d\x32\xa6\x39\x20\x3c\x85\x52\xaa\x27\x08\x5b\x57\xa8\xb0\xe3\xc6\x0c\x86\xbc\x4f\x4d\x87\xc1\x0a\x31\x5f\x31\xa9\xc7\x86\x8d\x59\x10\x30\xfe\x0f\xe2\x10\xa5\x87\xf0\xc2\x2f\xf1\xc5\x38\xc1\x4c\x70\x4e\x13\x0d\x86\x33\x5b\x30\x8a\x0c\xf0\x08\x2c\x1f\x56\x53\xf7\x56\x6b\x78\x93\x22\xb3\xe7\x01\x15\xa4\x21\x2b\x9e\x14\x9d\x79\x55\x6b\x31\x26\xed\xd7\xf1\xbd\x42\x98\xb8\x22\xd2\x2c\xe2\x35\x7c\x82\xb1\x15\xdc\xcc\x07\x22\x2f\x92\x34\x0e\x7d\x84\xa7\xd0\xc9\x54\xc9\x81\x26\x98\x93\x08\x18\x8b\xcb\x10\xfc\x2c\x93\x82\x16\x00\xd1\xf7\xf9\x88\x6a\xa5\x72\xfb\xcd\xc7\x84\x64\xcf\x2a\x03\x4f\x24\x1e\xa3\x42\x6f\x52\xca\xae\x75\xaf\xfe\x99\xb7\xe6\xdd\x21\x00\xb6\x09\xf5\xeb\xbe\xa8\xa8\x6e\xa1\xeb\x9b\x09\x2d\x74\x90\x02\xa2\x58\x20\x9a\x48\x28\x4b\xa8\x84\x1b\x27\xb2\x98\xf1\x71\x1e\x72\xba\x95\x5b\x9e\x98\x89\xad\x22\x9f\xcc\x59\x1d\xf6\xe8\x16\x40\x11\x81\x9d\xb5\xe5\x69\x5d\x9c\xba\xff\x47\x28\x54\x28\xd3\x97\x83\x89\x12\x0c\x9c\x9a\xb3\x20\xe8\x4b\x74\x4f\xf1\x63\xdd\xa6\xe8\x5c\x77\x12\x7f\xe0\x8c\x5a\x24\xdf\x60\x11\x29\x9a\x8d\x3b\x26\x4c\x24\x35\x02\x71\xc6\xb1\x73\x2a\xf6\xf8\x1a\x4c\x76\xb4\xc4\xe1\xcc\x47\x5a\x90\x8e\xf3\x2e\x71\xb7\x55\x15\xa7\x49\x99\x10\x6e\x4d\xe4\x02\xea\xf8\x96\x71\x2b\x3e\xca\x43\x1f\x92\xe0\x46\x2c\x63\x4e\x24\x7f\xe2\xab\xd6\x99\xeb\x91\x38\xb7\xce\x59\x22\x86\x83\x1e\x34\x44\xde\x96\x3d\x60\x96\xdc\xa2\x29\x0f\x1f\x61\x04\x7c\x80\xfa\xd4\x26\xbf\x03\x6e\x61\x14\x40\x93\x42\xb0\x02\x35\x52\x6e\xe1\xe0\xf5\xf7\x1d\x7f\x38\xd1\x1b\xb3\x4d\x33\x00\xe8\xe8\xfb\x62\x5f\xd9\xfb\x22\x5b\x2b\x4a\xe7\x54\xe1\x86\xe2\x2c\xaa\x4f\xfe\xc2\xa5\x99\xad\x09\xe9\xe8\xc9\x57\x00\x7f\x08\xc8\xea\xf5\xa3\x85\x20\xf7\x40\x8d\x73\xbd\xb6\xce\x98\x4c\x73\xda\x55\x08\x16\xf4\x66\x45\x4a\x98\xb7\xa8\xaf\x89\x5e\x17\xfb\x65\xbd\xd9\x67\x80\x18\xaa\x30\x16\xaf\x40\xdc\xbd\x2a\xb2\x07\x1c\xe4\x8d\x79\x40\xf6\x69\x30\x06\xcc\x1d\x95\x8d\x34\x21\x44\xf0\x1a\x7f\xa3\x80\x35\x15\x3e\xe0\xcc\x80\x32\xd1\xbd\x68\x98\x22\x10\xb1\xae\x0f\x3b\xb0\x21\x90\xe3\x72\x5b\xe4\x01\x49\x63\x6a\xbd\xca\x4c\x55\x89\xfa\x85\x44\xc5\xfe\x3d\x67\x50\xf7\xfe\xbf\x44\xeb\xc0\x5f\x16\x5a\xfc\x40\xd3\x16\x40\x27\xaa\xf9\x51\x24\x07\xc4\x56\xe2\x04\xd9\x6f\xc4\x25\x5c\xe2\x52\xde\x61\x80\x9c\x6b\x26\x08\x67\xee\x1a\x36\x50\xc3\xa7\x07\xbd\x11\x98\xe0\xa9\x12\x8f\x00\x4f\x5c\x14\x37\xa8\x70\x8b\x83\x44\xe5\xde\x99\xb2\x38\x52\x79\x91\x9f\xfa\x17\x60\x6b\x49\x8b\x14\x6e\x6f\xf7\x9b\x40\x8c\x07\x7d\x85\xfb\xdf\x2d\x30\x08\xf7\x61\x94\xc9\x12\x78\xcf\x0f\x1d\x77\x45\xf5\xc6\x08\x5d\xc1\x65\x37\x0e\xda\x30\x8c\x90\x91\xbb\x4b\x6c\x19\x94\xa7\xc4\x5b\x62\x65\xd7\xfb\xd2\x56\x09\x15\x6c\x12\x3a\x5b\x7f\xb5\x07\x29\xaf\x29\x75\x67\xe8\x5c\x5d\xcb\x92\x1d\xa4\xf0\xb4\xab\x7d\x6d\xbb\xeb\x76\xda\x4e\x1e\x2c\x9c\xa8\x81\x64\x77\x34\x91\xd5\xce\x57\x77\x9e\xf5\x31\xc3\x2b\x52\x09\xa5\x72\xb5\xfd\x66\x93\xe2\xc5\xdd\xd0\xb7\x55\x28\x04\xb2\x77\xc7\xc0\x3e\x87\xd3\x93\x4c\xd2\x10\x67\x75\x9b\x3b\xbe\xe5\xd3\x1c\x4e\x5f\x83\x64\xed\x0f\x36\xaf\x9d\x53\xc5\x51\x1e\xec\x16\xc2\x53\x20\xd3\xc7\x72\xc6\x51\x8a\x84\x79\x34\xf5\xd6\x00\x38\x72\xbc\x89\xb2\x4a\x79\xeb\x80\x94\xb1\x3e\x3e\xe8\xc9\xcb\x72\x2f\xc3\x2c\x97\xc0\xa5\x40\xea\x16\x69\x92\x92\xc6\xdc\x07\x74\x8c\xb0\xc2\xb1\x00\xc9\x54\x21\xa7\x87\xd7\x9e\x21\x82\x74\x09\xfc\xa2\xd2\xbb\x8d\x8c\x29\x8a\xfa\x15\xf7\x91\x68\x2a\xd3\xca\xa3\x89\x4b\xbb\x56\xcd\x4a\x46\x02\x18\xed\x6c\xbd\x27\xea\x4b\x8a\xa5\x3b\x6f\x15\xe1\x1a\x27\x9d\x11\x42\x25\x5a\x08\x1e\xd0\xbd\x29\xcd\xaa\xb6\x65\xfa\x67\x82\xd9\x1e\xb9\xb8\xb0\xdf\x11\x64\x44\xf1\xa0\xc2\x92\x59\xda\x2e\x9f\xfa\xd8\x06\x1b\xe8\xf7\x7b\x2f\x1c\xe3\xcd\x0c\xd5\x14\x9b\xd8\xe8\x9c\xee\x33\x37\xd5\x39\xb3\x3b\x0b\x72\x2e\xa4\x8c\x22\x25\x01\xe6\xd7\xf5\xfb\x4a\x75\x2e\x48\x4a\x12\x44\x03\x0e\xb8\x35\x8f\xb7\x8a\x62\x93\xb0\xe8\xe8\x81\xc8\x3c\x36\x9b\x5e\xf7\x09\x43\x24\x03\xd7\xc2\xd1\x39\xd6\xef\x36\x3e\xcd\x44\x03\x40\x38\x37\xb7\xc1\xe4\xe3\xd8\x9f\x76\x46\x21\x20\xb0\x39\x9d\x02\x8b\x98\x95\x5b\x05\x5a\x08\x6c\xdd\xb0\x63\xfc\x28\x94\xa1\x23\x3c\x45\x7e\x51\x25\xbc\x8e\xda\xab\x31\xa7\x20\x64\x5a\xeb\xa7\x1f\x3a\xd0\x43\xef\xb5\x04\xd3\x9e\x2c\xf7\xb5\x75\x4b\x43\x79\x49\xbc\x68\x7b\xa7\x75\x65\xb3\x8d\xc7\x51\x70\x72\x6f\xed\x0e\x31\x8b\x68\x20\xb8\xa3\xc0\x14\xe2\x3c\x2a\x07\xfa\xf8\x45\x45\xa9\x1f\xd2\x22\xf3\xda\x55\xe5\x9e\x45\x13\x77\x65\x51\x17\xab\x22\xe3\xea\x27\x89\x29\x33\xab\xb2\xa8\x30\x0f\x41\x0f\x02\xa4\xc2\x13\xbb\x00\xcf\x83\xa3\x93\xcc\xf6\xae\x70\x2b\x15\xb9\x49\xe2\x2c\xe2\x6d\x03\xd2\x7e\xf8\x65\x1f\x99\x40\xab\x35\x3b\x78\xbe\x30\xbb\xc6\x0a\x79\xf7\x18\xd5\x86\xca\x1e\xc1\xc9\x76\xa1\xc6\xc8\xdd\x24\xbe\x33\x58\x7a\x2a\x2f\x7c\xc1\xdb\xce\x54\xd5\xa3\xf3\x83\x8b\xd2\x5d\x62\x30\x5c\xfb\x7c\x67\x56\x5f\x21\x07\x5d\x5a\xb3\x26\xb0\x0a\xb9\x4d\x18\xb3\x7c\x33\xd0\xc3\x90\xd1\x58\x58\x8c\x54\xf6\xc4\xef\x42\x96\xa0\xea\x41\x44\x57\xc0\x4f\xdc\xfa\xce\x68\x13\x1d\x8b\x1b\xaa\xe5\x81\x31\x29\x81\xdb\x95\xc0\x76\xb9\xc5\x8c\x7a\x89\xb8\x70\xc4\x66\x79\xb5\x80\xee\x46\xa0\x6f\x64\x28\x6b\x43\xf9\x19\x06\x10\x60\xfa\x88\x73\x07\x1e\xc4\x51\x93\x46\x0a\x48\x97\xb0\xa7\x7d\x50\x8f\xb6\x83\xcd\x34\x44\x93\x3a\x0a\x1d\x82\xc2\x16\x04\xd8\xba\xd8\x59\xc1\x87\x36\x9d\x4d\xa7\xe3\x91\xa1\xd9\x12\x3c\xea\x93\x98\x54\x42\x58\xa2\x80\x27\x17\x0f\x8a\x9c\x0c\x1f\xe4\x50\x8c\x1a\x9e\x8d\xe9\x9e\x8e\x41\x20\x9c\x97\xba\x73\x76\x48\xde\x8e\x9a\xf9\x72\x20\xbc\x78\xb8\xd7\xdd\x3d\x38\x82\x0b\xc1\x10\x52\x17\x42\x04\x54\x48\xa9\xda\x1d\xeb\x2e\x48\x49\x13\xb4\xad\x8e\x0c\x13\xa5\x76\x4d\x4d\xc5\x38\xee\x7c\x03\x1b\x09\x74\x10\x70\xd0\xd2\x7a\xa0\x4f\xc2\x0a\x51\xf2\xfb\x34\x72\x1c\x36\x0d\x70\x55\x4a\xc1\x14\x8f\xd4\x0a\x10\x24\xf4\x14\x0b\xe8\x6d\xb8\x63\x4e\x09\xb2\x04\x0f\x3e\xed\x7b\x80\x1c\x45\x67\xba\x1b\x0f\xe4\xf2\x78\x18\x26\x98\x54\x55\x14\xda\x80\xb3\x35\x1e\xa2\x18\x75\xc6\xf2\x5d\xc0\x4d\x00\x71\xd6\x2e\xf4\x83\x8a\xd8\xe9\x26\x45\xed\x26\x90\x09\xa8\x45\x0e\xb0\x4d\xdf\xed\x57\x36\x96\x97\x10\x02\x0c\x32\x06\x6b\x30\x56\x8e\xcd\x20\xa0\xe2\xc9\x4e\x0e\x37\x50\x48\xf4\x20\x9b\x78\xc5\x7e\x91\x47\x97\xf5\x7f\xe8\x84\xa0\x50\x94\xfb\x13\xa6\x13\x2e\x09\x8f\x83\xd2\x2d\x04\x40\x60\x92\x7d\x24\xec\x64\x9b\xc1\x07\x94\x18\xc0\x2b\xdf\xc2\x96\x4e\xa5\xcf\x5e\xc1\xe1\x79\xf6\xba\xf9\xee\x77\xba\x28\x21\xbc\x3f\xf3\xf5\x93\x3b\x24\xe4\xf4\x19\xc0\xc0\xca\x2d\x02\xbf\x98\xb6\xf2\x70\x8f\x92\x86\x47\x31\x6d\x00\x53\x55\x92\x66\x00\x83\xed\x3c\x9f\xe4\xd1\x3c\x25\x67\x32\x71\xd9\x60\x6a\x8b\x24\x2d\xb1\x3a\x10\x5b\xbc\xea\xbb\x0d\xce\xe0\x2e\xbd\x4d\xab\x98\x69\xdc\x47\x40\x40\x91\xdc\x3b\xac\x61\x65\x02\x1c\x8c\xba\xac\x8e\x90\x27\x78\x54\x18\xb7\x3f\xb0\x29\x00\x23\x89\x1f\x8d\x47\x28\x3f\xab\x84\x24\xb9\x9f\x0b\x2f\x89\x4e\x4f\xc5\xe6\xaf\xfb\xfa\x8a\x27\xb3\xc6\x3a\x34\x12\x81\x58\x02\x8c\xf8\xc0\xc0\x52\x68\x84\x97\x3e\xce\x48\xab\x48\x8c\xb8\x4f\x1a\x72\x23\xf1\x05\xb6\xaf\x2f\xed\x2a\xc3\x41\xab\x0b\x52\x1d\x89\xc1\x62\xa5\x59\x5b\xd7\x1d\x04\xe7\x91\x13\x01\x41\xfa\xad\x25\x29\x12\x78\x73\xa2\xfc\x47\xd1\x37\x24\x73\x0e\x85\x4a\xf0\x7d\x1b\xb9\x82\xd2\x7c\x6d\xb7\x79\x84\x12\x0b\x2d\x17\x64\x16\xad\x69\xd1\xcb\x83\x12\xb9\x15\x3c\x61\xab\xa8\x7b\xfa\xc4\x63\xd0\x1a\x53\x95\xd6\x7d\xdc\x49\x42\x21\x47\x99\xaa\xda\x6f\x77\x9e\xba\x55\x88\x59\x14\x4d\x2b\x92\x45\x58\x1a\x82\x17\x1e\xf9\xd2\xf9\x4c\x5f\x0e\x9b\x6e\x11\x07\xcc\x90\xfe\xce\x0e\x13\x9a\xbd\x20\x15\xb3\x08\x82\xd5\x04\x56\xa0\x2e\x4b\x01\x54\x17\xee\x44\xea\x79\xa1\x4f\x46\x31\x3a\x8b\x04\xec\x33\x96\x34\xb6\x86\x9d\xda\x80\x19\xf5\x21\x6d\xbe\x0f\x63\xf4\x1a\x62\x70\xb0\xe7\x2a\xdc\x2d\x09\xef\x39\x88\x74\xc3\xce\xec\x82\xd8\x1c\xbb\x53\x95\x08\xb1\x1b\xf4\xeb\xd8\x42\x34\xba\xa3\x1f\xe1\xa4\xa5\xcb\x11\x47\xde\x96\x5b\x50\xff\x33\x1e\xed\x21\x64\xea\x7d\xf3\x3a\x9e\x07\xb6\x00\x26\xc4\x51\xe1\x93\xb0\xb5\x24\x2e\x1c\x41\x79\xe3\x9b\xc1\xdf\xd9\xeb\x75\xfb\xbe\x0a\x8b\x90\x3b\xce\xc2\x66\xe2\x5c\x0f\xf5\x9e\x3a\xd0\xae\x75\x30\x0f\xb7\x5b\x1d\xdc\xc8\x6a\x5f\x3e\x00\x51\x94\x3b\x7d\x44\xfb\xb5\x6c\x7f\x88\x25\x40\x63\xd1\x2a\x6d\x35\xb9\x91\x20\x92\x96\xbc\xa4\x1e\x72\x37\x7a\xd2\xd2\xed\x94\x65\x37\x89\x36\x42\x33\x8a\x11\x00\xcd\x45\x1b\x08\x0d\x94\x27\xf0\xa0\xaf\x83\x97\x47\x6b\x29\xcd\x51\xcb\xb1\x33\xd7\x20\xed\x5a\x32\xc8\x87\x2d\xd4\x91\xd8\x39\x45\x73\x2f\x25\x6c\x01\x11\xca\x5a\x00\xe3\x10\x14\x21\xcc\x49\x36\x92\x32\x9f\x43\x2d\xf9\x6b\xa6\x12\x16\xfb\x3b\x72\xd5\x51\xe8\x35\x64\x18\x48\x2f\x9d\xdc\xfd\x47\x43\x78\xec\xdf\x0d\xc0\x99\x48\x73\x43\xd4\xc7\x6c\x3b\x21\x61\x19\xd7\x37\x04\xc2\xa1\xc6\xb4\x51\xad\x31\x34\x81\x15\x72\x78\x11\xa9\x0e\xee\x06\x3d\xcc\x9d\xa1\x59\xdb\xed\xae\x16\x45\x0e\xe8\x8b\xb7\x5e\x86\xbb\xf7\xa1\x48\xd7\x08\xd2\x02\x38\x58\x5c\x0d\x54\x53\xeb\x6d\x54\xef\xd1\x01\x43\x93\x99\x7d\xaf\xd3\x15\x58\xfd\x9a\x25\x3b\x36\x84\x41\xcc\x5d\x69\x76\xf7\xd1\x71\x75\xd6\x1f\x28\x51\x17\x47\xa1\x32\x20\x4b\x76\xae\x0c\x3a\xc9\x9d\x26\x5d\x4d\x66\x79\x28\xf5\x80\x8c\x46\x14\x0f\x6f\x1a\x6c\x88\x12\x84\x20\x00\x3a\xaa\xfd\x60\x34\x62\x6e\x96\xc2\xb6\x26\x77\x83\x5e\xa7\x59\xa7\xdd\x17\x15\xff\xe4\x6b\xb7\x90\xe3\x21\x8c\x6b\x50\x70\xc8\x4f\x96\x7d\x58\xc3\x06\xcb\xdb\x93\x80\x2d\x6a\x3c\x7c\x63\x52\xe4\x01\x72\x5b\x67\x43\x49\x42\xfc\xac\x1f\x0e\x05\x04\x35\x5b\x2b\x6d\x12\x0c\xfb\x22\xaf\x73\x5d\xe8\xd7\xcf\xf5\x1a\xac\x94\x4d\xcd\xd5\x08\xb6\xaa\x78\x75\x5e\x17\xa5\x2d\x60\xcc\x5b\x43\xa8\x7f\xcd\x10\x8a\x1e\xa9\x63\x1d\x82\x7e\xa4\xb6\xea\xec\x89\x3e\xd6\x13\xa2\x2f\x27\x61\x9b\x4d\x5a\x56\xb5\xae\xd3\xad\x0d\x8e\x83\xbf\xd1\xe8\x8c\x29\x36\xc7\xd7\x8b\x3a\xe1\xdb\x1e\xab\x3c\x63\x8f\x4b\x36\xd7\xe3\x83\xf5\x6a\x4f\xc9\xbe\xf0\x54\x18\x5d\x77\xd0\xbd\x88\x46\x97\x50\x12\x2b\x9b\xee\xfc\x49\x89\x8d\x1a\x28\x25\x8e\x05\x5f\x99\xd2\xde\x5d\xbc\x23\xfc\x95\x10\xf6\x63\x2d\x48\x33\x01\x7b\xc1\x3a\x3e\xf7\x45\x63\x20\x18\xfc\xe0\x5f\x00\xdd\x74\x7d\xe9\x62\x7f\x19\xc7\x8d\x81\x47\x41\xc4\xcc\xbf\x7a\x4d\x00\x86\x5a\xce\xb3\x98\xfe\x84\x6a\x87\x00\xae\xf7\xef\x7b\x93\x81\xff\x58\x78\xc6\x8a\xdc\x3e\xc6\x74\x9f\x3e\xdf\xef\x2f\xd6\x18\x7f\x7b\xf6\x1c\x4f\xd3\x9f\x31\x3e\xb7\x83\x2a\x1b\xe7\x29\x90\xb1\x49\x49\xbd\x4f\x58\x79\x15\x81\xfb\x19\x7b\x27\xb3\x16\x48\x8f\xd5\xaa\x88\xf2\x92\x2d\x82\x1e\x0f\x4a\xd1\x60\x31\xa8\x38\x42\xe1\x4e\xda\x55\x9a\x81\xb6\x96\xe4\xee\x68\xe7\x3a\x20\xd0\x0e\xf6\x30\xa5\x07\x4c\xa5\x4c\x50\xed\x5a\x51\x7e\xe7\xc9\x1c\xb4\x6c\x15\x05\x1a\xb2\xf4\xab\x75\x67\x7b\xb0\x16\xd8\xb9\x37\x7e\x88\x06\xda\x9f\xa1\x79\x81\xf9\xcb\x88\xff\x46\xc2\x6b\x41\xac\x18\x1c\xfe\x18\x60\xdb\x79\x49\x01\x64\x3a\x2e\x13\xb4\x54\x23\x8c\x0e\x1f\x32\xbf\x88\xb2\x1d\xa6\x49\x24\xcd\xba\xf6\x0c\x44\x4c\x65\xcb\x83\xe0\x7a\xc1\xe2\x38\x1c\x61\xc0\x8d\xb5\x9d\x73\xb2\x23\xe8\x92\x0a\x03\xd0\x72\xb1\x91\xf6\x06\x20\xae\x5a\x83\x59\x3c\xe4\xeb\x8e\x3e\x43\x96\xf3\x65\xf1\x98\x57\x75\x69\xcd\x56\xcf\x3c\xa6\x64\xa0\x90\x1b\xc9\x1f\x38\x47\x6a\x82\xe2\x64\x47\x7c\xa1\xd2\x34\xba\x35\x10\x1d\xaf\x91\x93\xe8\xbd\x86\x84\x8a\x44\x93\x30\xf4\xb2\x2e\x92\xf4\x84\xcb\xaf\x89\xaa\x82\x5c\x5f\x3c\xac\xf1\x2e\x20\xb6\x4b\x82\x51\xf8\xea\x1c\xac\x1b\x4c\xdd\x98\xa1\x2d\x2b\x0a\x71\x84\xc5\x18\xc8\xad\x86\xb9\xee\xd9\xbc\x06\xf7\x28\xe4\x64\x7a\x68\xda\xcb\x2c\x8d\xcf\x03\x91\xba\x06\x14\x12\x62\x05\x99\xe4\x83\x4a\x9c\x4d\x1e\x73\xc6\x41\x62\xb1\xaa\x2c\x02\x4d\x8b\x9c\x8c\xb2\xfd\x12\x50\x5d\x18\xe4\x89\x9f\x01\x4b\xd4\x96\x77\x68\xe2\x4b\xb2\x29\xe7\xfd\x3c\xbd\x4d\x11\xb8\xcb\xe8\xa7\x5c\xb7\x3b\x97\x28\x40\x72\x63\xe2\xa6\x2e\xc8\x86\x17\x5d\x75\x27\x2f\x4f\x6f\x13\x52\x06\x60\x8f\xac\x0a\x1f\x50\x8f\xf7\xa6\x06\xc5\x42\x7f\x14\x32\x82\x1e\x33\x20\x98\x24\x3f\xfc\x04\x5c\x7f\x6b\x28\xf3\xc3\xb8\x09\x64\x1d\x6d\x55\xeb\x7b\xb3\x46\x4f\x60\x9f\x41\xed\x84\xc4\xae\x7a\x4a\x46\x6f\x60\x25\x7a\x97\xed\x5d\xbb\xbc\x84\x7b\x5c\x20\x70\x14\xb8\x14\x11\xb2\xf0\x52\x3d\xd2\x26\x6f\xbf\xc8\xbf\xdf\x9b\x4a\xa5\x75\x83\xe2\x96\xca\xd2\xfc\xed\x6e\x37\x9b\xa2\xac\xab\x86\x89\x4c\xee\x34\x68\x2d\x76\xf8\xbd\x9c\x0b\x63\xd1\x70\x6e\x2b\xe1\xa8\xd9\xe8\x74\x77\x3c\x54\x63\x77\x13\x9e\xc5\x64\x05\x87\x8e\xd7\x2b\xbf\x55\x6d\x50\x6f\x17\xf9\x71\x41\xfc\x2b\x9b\xd2\x55\xae\xae\xda\x0c\x3f\xd1\x1b\xf3\xb4\x4e\x51\x74\xa7\xa6\xd2\x48\x61\x5a\xbb\x55\x55\x16\x55\x75\x0a\x71\x41\x74\x63\xf7\x80\xd8\x84\xba\x3d\x48\xc5\x64\xe6\xb1\xda\xa7\x75\xdf\xed\x1f\x7b\xe7\x3d\x75\x61\x94\xd3\x87\xc3\x39\xbd\x0e\xc9\x89\x04\xaf\xa2\x44\x57\x88\x5e\x49\x02\x3c\x10\x70\xa2\x26\x23\x26\xdd\x2d\x60\x8c\x28\x6e\x15\x28\xc9\xd0\xf8\x0f\xf0\x23\xa8\x98\x70\x47\xed\xd9\x40\xdf\x10\x65\x22\xf1\x9d\xe5\x18\x22\x2c\xca\x1e\x63\x31\x1a\x16\xa2\xdb\x4f\x3e\xdc\x5a\x35\x14\x3c\x43\x91\xfb\xa6\xd1\x04\x4e\x22\x46\xd4\x25\x37\x81\xdb\x11\x4a\xad\x06\xa1\xa0\x08\x8a\x98\xbd\xf6\x51\x00\xfd\x53\xbe\x9c\x5b\xf9\x53\x15\x35\xda\x13\xbf\x51\xb5\x44\xf4\x39\x4f\xcb\x12\x0d\x39\x25\x8e\xdc\xb9\x16\xfd\x5a\x17\x8f\x84\x28\xa2\xf3\x31\x0b\x11\x05\xf1\xe0\xc0\x1f\x6c\x32\x24\xcd\x34\x2b\x32\x6a\xdc\x26\xb3\xa5\x45\xb3\x93\x7f\x9b\x48\xb9\x79\x48\xd4\xd1\x6c\x7b\xe3\x7a\x6b\xf2\xdc\x19\x07\xa1\x56\xb9\x0d\x25\xde\x34\x16\x06\x9c\xd3\xb8\x36\x3c\x8b\x40\x63\x48\x30\x07\x43\x57\x3d\x27\x8a\xa9\xab\xa1\x49\x7a\x69\x55\x68\x12\x24\x83\x0c\x43\x72\x84\x65\xc4\xdb\xbe\xab\xde\x54\xbc\x9b\xd1\x26\xb8\x99\x65\xd4\x14\xfa\x13\x98\x45\x12\x9a\xc5\x22\xeb\x05\x0a\x92\x5a\xca\xfc\x63\x8c\x94\x66\xa8\xe2\x92\x6c\xa8\xaa\x02\xde\x1d\x37\x66\x18\x91\xab\xe0\x23\x1e\x41\x2a\xe3\x01\xfc\x66\x15\xae\xcc\x11\xd6\x1e\x86\xe1\x42\x9b\x0b\x43\x37\x10\xba\xf0\x25\xf1\x89\x5b\x99\xd9\xfa\x31\x5d\x87\xe3\xe6\x14\xd9\x5b\xa0\x59\xfe\x3c\x8a\x8a\xca\xc5\x0a\x3c\xb2\x00\x13\x26\x3d\x4f\x10\x1a\xe5\x26\x32\x21\x9c\x73\xd8\xde\xb8\xb7\x03\xed\x3e\xf2\x24\x3c\x61\x84\x58\xe6\x92\x00\x47\xe4\xc8\xaa\x18\x28\x35\xe6\x00\x0c\x0b\x4c\x21\x5e\xdf\x5f\x51\x10\x5c\xea\xc5\xa1\x03\x3c\x1c\xf2\x83\x17\x64\xf6\xc2\xa2\x8a\x32\xe1\x69\x8d\xc1\x35\x96\x03\x5e\xdb\xbc\x20\x47\x25\x61\x6d\x7b\x52\x9a\x04\x27\x16\x9e\x7e\xe2\x49\xcf\x72\x7e\xb2\x6a\x1a\xbe\x44\x7a\xeb\xbf\x03\xef\x7b\xb0\xb9\x09\x9a\xf9\xd5\x9e\x02\xf6\xf8\x09\x49\x79\xd8\x1f\x00\xf3\x1f\x4c\x72\xcf\x53\x81\x47\x7d\xc3\x38\x1d\x1a\x14\x9e\x96\x91\x68\xbb\x11\xde\x7d\xa4\xb3\x47\xbb\x25\x6b\xac\xe1\xb9\x6d\xa4\x51\xc3\x56\xfd\x9a\xc3\x54\x80\x65\x9a\xa1\xbd\x9d\xb7\x1a\xea\x01\x44\xdd\xb8\x82\x88\x8d\x93\x10\x30\x31\x5c\x17\x83\xf9\x9e\x6f\xdb\x2d\x65\x90\x23\xe5\x7a\xdd\xf5\xf7\xcb\x6e\x02\x85\xa1\x47\x17\x04\x99\xfc\x46\x49\x80\xbf\x98\x21\xdf\xef\x3e\x09\xb0\x8e\x34\x84\x11\x7c\xa0\x08\x03\x9f\x01\x76\xaa\xb8\x06\xea\x08\x92\x08\x95\x4b\xab\x22\xbc\x3c\x80\x44\xcb\x12\xe9\xa0\x0b\xbd\xb6\xbb\x32\x7d\xb0\xce\x9f\x2a\x01\x18\x42\x43\xb4\xb4\xb9\xdd\xa4\x75\x80\x41\x46\xcb\xc1\x13\x81\x8b\x48\x0b\x73\x67\xa9\x93\x17\xfe\x0d\xc9\x5f\x74\x14\xf9\xa1\x54\x92\x6c\xb9\xd5\x08\x70\x91\xbc\xf3\x13\x00\xf5\x03\xdd\xfb\x63\x73\xad\xf4\x14\x2e\x5b\x1f\x7c\x21\xe5\x66\x4f\x13\x43\x84\xa2\xee\x3e\x60\x47\xbf\xb9\xb2\x88\x93\x43\x62\x85\x5b\x91\x6b\x22\xda\x44\x93\x8b\xc3\x2a\xd8\x2e\xac\x8c\xeb\x2a\x1e\x54\xf1\x37\xf1\xd2\xe1\x1d\x1a\x81\x2e\x58\x0c\x11\xb1\xd3\xc4\x5b\xcc\x59\x4b\x7a\x80\x8a\x15\x22\xd0\x72\xc5\xd5\x90\xa5\xf6\xc1\x06\x38\x04\x6c\xb9\xc4\xdd\x41\xd5\xde\x20\xae\x0a\x8d\xe4\x55\x91\xe7\x36\xe2\xe6\x74\x37\x6a\x66\x23\x27\xc2\xed\x16\x9c\x65\x38\xd5\x94\x2c\x51\x17\x9e\xb0\x25\xa1\xeb\xd5\x9e\x1d\xab\x07\x7b\x20\x97\x37\x69\x6d\x72\xa8\xb3\x77\x07\x91\xea\x3a\x82\xc0\x16\x90\xc0\x5c\xc0\xa5\x3a\x37\xa5\x41\xe6\x42\x6e\x0c\x99\x64\x34\x5b\x5b\x0f\xb4\xf5\x6d\xf3\x17\x85\xcf\x53\xb8\xbe\x32\xd9\x9c\xf4\x8b\xa2\x66\xaa\xfa\xde\x6b\x52\x47\x6d\x74\x63\x80\xb7\xb2\xbb\x0b\x22\x77\x1a\xd7\x31\xc5\x75\x22\x12\x01\xd5\xf1\x0a\x2c\x27\x85\x64\xb2\x2f\xb8\x07\x0b\x75\xd8\x7c\x65\x5a\xe9\xde\x3a\xad\x56\x65\x0a\x57\x49\x51\x1e\xa0\xec\xb3\x8b\xa2\x4d\xa4\xde\xaa\x55\xb1\xb3\xe1\x0e\x44\x44\x76\xe2\xf9\x47\xaa\xa6\xb3\x92\x10\x66\xd9\xc3\x7d\x02\x07\x00\xda\x03\xf8\x49\x85\xfe\xaf\x04\x09\x05\x2f\x47\x7b\x20\x50\xc4\x52\x76\x9c\x23\x6b\x10\x79\x58\x47\xaa\x30\x29\xa3\x54\x5a\x7f\x41\x41\x9d\xb9\x5c\x9b\x04\xe6\x8a\xf0\x8c\x9c\xde\xa3\xf1\x58\x3a\x9b\x91\x20\x9c\xa1\xc8\x0f\x42\x61\x2c\xdf\x80\xed\x03\x43\x1d\xe1\x26\xee\xfa\xdb\x99\x03\x43\x12\xa3\x54\x41\x7d\x88\x89\x12\x08\x93\xc4\xf1\x53\xe2\xa8\x73\xab\x4b\x85\xfc\x5e\x1d\x71\xc4\x89\xf7\xb5\x9e\x8d\x06\x59\xe2\x75\x6e\x36\x01\x80\x4e\x81\x55\x3c\x44\x38\x14\xd7\x5a\x5e\x1c\x58\x4d\xa0\xc6\x47\xae\x9e\xa6\xe1\x06\xc4\x98\xed\x23\x21\xae\x53\x8b\x9e\xed\x21\xac\x08\xa3\x51\x27\x88\x61\x4b\x81\x4e\x76\xed\xa3\x48\x45\xc5\x94\xc0\x7d\xbc\x98\x96\x7d\xbd\x2b\x53\x2a\xf0\xc4\xcb\x78\x1d\xbf\x9a\x2a\xca\x78\x7f\x7a\x11\x02\x34\x39\xb8\x04\xb9\xe2\xe3\x30\xf7\x2a\xa7\xf1\x21\x83\x49\x12\x98\x44\x0b\xe1\x80\x35\x96\x42\xd0\xfa\x0c\x67\x9a\xf6\x65\x95\xf1\x9e\x7b\x34\xde\x57\x4e\x42\x4c\xfd\xfc\x77\xfa\xda\x94\xab\x7b\x90\xd0\x42\xa4\xcf\xbd\x67\x34\x15\xa1\x3d\x8f\x72\x03\x3a\xb3\x72\xef\x33\x77\xe4\x3a\x4b\xe0\x0c\x10\xdc\x6c\x81\x06\xdf\xcf\x88\xb7\x19\xd6\x76\xe3\xe3\x31\x11\x87\x35\x61\x14\x0e\xc2\x2a\x5e\x5a\x61\x84\xa0\xb2\x51\x0b\x0d\xe7\xbb\x09\x0c\x4b\xce\x17\x3e\x1f\xe8\x49\xa1\xe7\x5e\xfc\xa6\xd8\xe8\x29\x90\x8a\xfd\x04\x4a\x4e\xeb\x62\x8b\x66\x5b\x83\x6e\x0e\xa3\x11\x6b\x62\xcb\xd2\x27\xec\x0e\x02\xa1\xda\x1e\x88\x4a\x30\x53\xe1\x75\xfe\xb9\x4f\xae\xad\x7d\xe5\xe7\xaf\x34\xeb\x94\x54\x11\xc4\x2b\xba\x72\x69\x07\x76\xe3\xec\xb7\xd5\x9e\x4e\x62\x5f\x22\x74\xfc\xbb\x10\x6f\x23\xbd\xa2\xe3\x87\x8c\x33\xa2\x80\xd2\x9a\x0b\xb7\xaa\x74\xbb\xcf\x6a\xc3\x22\x23\x88\x96\x6b\x51\x44\x75\x32\x78\xa0\xba\xc4\xce\x96\x35\x12\x82\x88\xaf\x91\xad\xd7\x72\x2e\x0f\xed\x53\x30\xad\xb5\x01\x92\x8e\x41\xa7\xc8\x0f\x0c\x2c\x1c\x4a\x21\xc9\xcd\x65\x6b\x0c\x6d\x5b\x39\xf7\x7d\x55\x6b\xc3\x7e\x1b\xe0\xf2\x7d\xf1\xa2\x3f\x95\xc4\x76\xad\x0b\x77\xb6\x6c\xa5\x95\xde\xc0\x42\x5a\x2c\x22\x25\x61\x33\xd2\x69\xe0\x51\x03\x89\x18\x7a\x92\xd7\x4b\x88\x81\x65\xe4\x6f\x63\x1a\x61\x53\x9a\x34\x57\x08\x8f\x64\xb8\x58\x7c\x5a\x06\x62\x1d\xb7\x5a\x5f\x0c\xf4\x6d\x25\x84\x51\x3e\x4e\x6e\xf5\xd0\xb9\x8c\xc5\x71\xed\x83\xbf\x08\x8e\xe7\x8d\xab\xc8\x11\x53\x59\x9a\x7f\xa5\xb3\x68\x99\xe6\xb6\x95\x7d\x60\x63\xaa\x4b\xd8\xa0\xa9\xd8\xa0\xbe\xdb\x78\x2e\xdf\x22\xd3\x2c\xb0\x4d\x04\x96\x51\x46\x24\x11\xf5\x8b\x14\x09\xc0\xb0\xd2\x31\x78\x5f\x96\x45\xf0\x78\x49\xa4\x84\xa0\x1b\x5f\xb1\xd6\x3e\x5d\x19\xd6\xca\x40\xe7\xb6\x85\x2f\x67\xe6\x88\x02\x5a\x12\x52\x6a\x2f\x00\xdb\xb3\xb2\x25\xe2\xe9\x04\x6f\x7c\x70\xb4\xc8\xab\x52\x88\x0b\x88\x69\x9f\xdc\xb0\x10\x78\x1b\xeb\x99\x68\xb5\xbc\x1c\xe8\x99\x7d\x48\xdd\x14\xfc\x12\xe9\xb3\x44\xe9\x83\xc5\x13\xa2\x75\x88\x2d\x45\x22\x2c\x5d\xd2\xb3\x48\x96\x29\xb7\x8f\xba\x21\xfb\xa2\x9e\x92\xb6\x83\x4d\x96\x6e\x71\xd3\xa6\x5b\x3b\xd0\x73\xe7\x59\x47\x8f\x81\xde\x39\x9f\x0e\x29\xe3\x80\x9c\x79\x97\x96\xa9\x37\x3f\xb8\x42\x2b\x0a\x6f\xb9\x46\x22\xce\xcf\xdd\x44\x6b\x5b\x9b\x34\x83\x49\x45\xad\x0c\xf7\x0a\xe5\x25\x71\xd0\x0e\x76\x83\xed\x73\x48\xbc\x32\xd3\x8a\x28\x39\xc1\x62\x70\x0b\x69\x9f\x56\x70\xc1\xf1\x27\xf2\xfd\x76\x69\xcb\x16\x80\x8b\xf1\x98\x8c\x04\xf7\xf8\x5d\xfc\x7c\x54\x40\xe5\x57\xc7\x91\x71\xea\x11\xf2\x0b\xa4\x4d\x83\xa4\x85\x90\xb2\x4f\xeb\x24\x96\xc7\x23\x14\x73\xb1\x89\xc2\x39\xe2\x08\x92\x34\x9c\xe4\x5e\x33\x30\xaa\xdd\xc2\x92\xb9\xc1\xa2\x16\xf0\x2a\x08\xe1\xd0\x63\x6b\xa6\x35\x3a\x01\x43\x05\xc3\xe4\xee\x1e\x7a\xa8\xc2\xb7\x7f\x7f\x54\x42\x2a\x60\x75\x5f\x70\x16\x82\x5b\x66\x1f\xdc\x75\xc3\xcd\xd3\xdf\x6b\x1e\x5c\xe7\x9d\xb3\x47\xe6\x91\x3b\x17\xbf\x1d\x50\xab\xca\xae\x52\xe7\x56\xc0\x59\x80\x52\x47\x72\xcd\xab\xef\xcc\xa5\x7b\x04\xe1\xe5\x13\xcf\x5e\xf1\x0d\xf2\x48\xf8\x41\x8f\xde\x02\x10\x54\x94\x2b\x35\x61\xe4\x45\x66\x5f\xc4\xe0\xf9\x92\xc3\x01\x81\xa7\xf3\xb0\xb2\x7f\x1f\x2e\x8f\x2b\x98\x4b\xb6\xaf\x7c\x17\xdc\x88\x42\xb6\x8a\x30\x6b\x8c\xe8\x02\x1a\x1e\xae\x8b\x97\x60\x7b\x9f\xc5\x56\x79\x11\x7d\x41\x98\x06\x0d\xfb\x08\x78\xab\xa0\xd9\x5c\xea\x11\x65\x16\x20\x05\x8f\x27\x77\xa0\x05\x75\x7d\x62\x5d\x49\x58\xd2\x90\x4c\x11\xcb\x91\x4e\xb8\x57\x03\x8f\xcc\xc6\x65\xf4\x99\xb0\xd9\x20\x92\x3e\x42\x71\xf4\xc9\x94\xa5\xcb\xbf\x80\xd0\x37\x48\x4a\xcf\xa6\x1f\x67\xc3\xeb\x44\x2f\xa6\xf0\xdf\xa3\x7f\x59\x8c\x26\x0b\x7d\x33\x9a\x5d\x8f\x17\x8b\xd1\xa5\x7e\xff\x45\x0f\x6f\x6e\xae\xc6\x17\xc3\xf7\x57\x23\x75\x35\xfc\x3c\x00\xe9\xf0\x9b\x85\xfe\xfc\x69\x34\x09\x42\xd7\x7a\xbe\x18\xba\xcf\x8f\x27\xfa\xf3\x6c\xbc\x18\x4f\x3e\xc2\xf3\x2e\xa6\x37\x5f\x66\xe3\x8f\x9f\x16\xfa\xd3\xf4\xea\x72\x34\x03\xc1\xa3\x67\xd3\x99\x82\x2f\xa2\x3a\xfa\xc8\xeb\xb6\xcb\x26\x79\x09\xf7\xcf\xe3\xc5\xa7\xe9\xed\x22\xb4\x7d\xfa\x01\x04\xbc\xff\x38\x9e\x5c\x26\x7a\x34\x76\x0f\x52\x5d\xfa\xee\x20\x5e\xfe\xeb\x45\xdd\x55\x5b\xd4\x1d\x54\x9a\xbe\xa7\xeb\x3e\xc0\x01\x9c\x2c\xc6\xb3\x91\x9e\x8d\xe7\x7f\xd4\xc3\xb9\xa2\x61\xfd\xe7\xdb\xa1\x7f\xce\xcd\x68\xf6\x61\x3a\xbb\x1e\x82\x54\xf8\x87\xa8\xcb\xe3\x39\xf4\x56\x7f\x99\xde\x0e\xf4\xfc\xd3\xf4\xf6\xea\x52\xfe\x5d\xb9\x61\x1a\xe9\xcb\xd1\x87\xd1\xc5\x62\xfc\xcb\x28\x71\x1f\xd4\xc3\xf9\xfc\xf6\x7a\x44\xa3\x3d\x07\x65\xf1\xe1\xd5\x95\x9e\x8c\x2e\x46\xf3\xf9\x70\xf6\x85\x64\xd4\x61\x14\x66\xa3\x9b\xe1\x78\xa6\xa7\x33\x75\x31\x9d\xcd\xdc\x53\xa6\x13\x5a\x42\xaf\x07\x88\xfb\xf6\xd9\x8c\x2b\x06\x1b\xbb\x93\x42\xc8\xd0\xdf\x4e\xae\xdc\x30\xcc\x46\xff\x7c\x3b\x9e\x35\x57\x88\xbe\x1a\x7e\x76\x53\x30\xfc\x38\x1b\xc1\x28\xcb\x05\xf1\x79\x7c\x75\x05\x3a\xf4\xcd\x55\x01\x8a\xea\xee\x0f\x61\x55\x7c\xd1\x9f\x3f\x4d\xf5\xf5\xf4\x72\xfc\xc1\x2d\x10\x5c\x35\xfa\x62\x3a\xf9\x65\xf4\x65\x1e\x0d\xca\x70\x2e\x96\xeb\xf0\xfd\xd4\x8d\x4b\x90\xbe\x5f\x4c\x61\x90\xdc\xa4\x91\x32\xbd\x58\x16\xf0\x4e\x12\x51\x16\xf2\xf6\x41\xf3\xfe\xb8\xbc\x3d\xcb\xba\x37\xb5\xdc\x67\x7a\x3c\xe1\x55\xb3\x98\x2a\xf7\x3b\x39\xc3\x42\x31\xbe\xbd\x22\xbd\xcc\xfd\xe5\x70\x31\xd4\xd0\xe2\xc5\x50\xbf\x1f\xb9\x4f\xcf\x46\x93\xcb\xd1\x6c\x74\xa9\xc6\x93\xe1\xc5\xc5\xed\x6c\xb8\x80\x97\xb9\x6f\x8c\xe6\x7a\x7e\x3b\x5f\x0c\xc7\x13\x9c\x0d\xd7\x5f\xd8\xde\xe3\xd9\xa5\xdf\x61\xb0\x68\x3f\x0c\xc7\x57\xb7\x33\x5e\x76\x8a\x1b\xb5\x98\xea\xe9\xcd\x08\x1e\x09\xcb\x4f\xcc\x04\x7e\x62\xde\x0f\x9a\xf4\xa0\x3a\x8f\xd3\xe6\x95\xee\x15\xce\xd8\xa7\xe1\x5c\xbf\x1f\x8d\x26\x4f\xeb\xd6\x6b\xa1\x5b\x3f\xa7\xc5\xf7\x66\x80\x02\x16\xbb\xd2\x86\x05\x38\x6f\x95\x88\x84\x3b\x6b\x1d\x9d\x76\xbe\x12\xc5\x7d\x2c\x8b\x56\x71\x80\xcc\x7b\xa0\x33\x22\x65\xd1\x0d\x54\x4b\x4b\xb6\x4e\x56\xac\x4c\x46\xc5\x23\x48\x68\x4b\xe8\x64\x3a\x7f\xb1\x3e\x89\x20\xbe\xce\x04\xb4\x8f\x18\xe5\xdc\x97\x35\x13\x21\xa0\x3d\x4a\x4f\x32\x8f\xac\x7c\x59\xd5\x7a\x95\x15\x58\x73\xb9\x73\x37\x1f\x70\xf1\xa3\x2a\xd0\xb2\x2a\xb2\x7d\x6d\x91\xaf\x17\x4d\x0e\x67\x92\xa7\x0f\x69\xa6\x42\xdb\x3b\xc2\x32\x91\x3b\xc6\x60\xd0\xa8\x26\x27\x14\x03\xa8\x68\x20\x42\x51\x71\x13\x12\xe2\x33\xd2\xb9\x2e\x6d\xbd\x2f\x25\xa1\xa8\x1e\x4d\xdc\x84\x1e\x91\xad\xfb\x54\x3c\xba\x41\x1a\xc2\x00\x20\xf2\x6a\xc1\xb0\xef\x2f\xee\x2a\x9b\xd8\x47\x7e\x7c\xe5\xf3\x3f\x24\x0a\x03\x66\xfd\x63\xe0\xc6\x63\x00\x02\x69\x0d\x53\x7e\x83\xda\x78\x07\x05\x83\x55\x0d\x50\x11\x60\xd9\xd8\x57\x2d\x41\x2c\xcc\x6b\x54\x35\x52\xf8\x14\xda\xac\xee\x21\x20\xee\x81\x9a\x85\x97\x14\x8c\x04\x4e\xa9\x28\xd7\xb2\xc2\x39\xaa\x12\xc4\x52\xac\xac\xb0\xe9\xb3\x43\x55\x00\x83\x2f\x08\xcb\x95\x68\x53\xd7\x86\xc2\x79\xc1\x18\xe5\xa2\x24\x6f\xc4\x13\x6e\x6f\x0c\x01\xca\xca\x6c\x5c\x93\x5d\x73\xe1\xcb\x3e\x92\x5d\x23\x57\x05\x56\x40\x00\xe0\x47\xa0\xdf\x51\xee\xa3\x8a\xb5\x11\xc1\x9e\xa2\x70\xa4\xe0\xdc\xf3\x2c\xb7\xc8\x8e\xe0\x9e\x04\x8f\x20\xa1\x48\x4c\x97\x04\xe2\x32\xab\x7b\xab\xa0\x17\x98\xa1\xa3\xbb\xd6\x46\xed\x0a\x70\xce\x30\x4a\xc0\x44\x33\x9b\xbd\x27\x12\x05\x3d\x53\x67\x69\x0e\x94\xfa\xbd\x1b\x47\xf8\x2e\x53\x94\x89\xae\xff\x54\x41\x1d\x0f\x3e\x56\x2f\xcb\xd4\x6e\x74\xba\x46\xe1\xd1\x47\x2a\xe6\x70\x66\xf3\xe0\x0f\x52\xbb\xfe\xe4\xa2\xaf\x7f\x7f\xb0\xa6\xfc\x83\xfe\x3d\x7c\xbd\xe0\x1a\xb8\x3f\x28\xd4\x3e\x10\xb2\x99\xd1\xfc\xbe\xf5\x8a\xd5\xd1\xac\xa6\x75\x4b\x63\xd7\x23\x63\x22\xd7\xf9\x49\x2b\xd7\x54\xfa\x69\xeb\x5b\x49\x15\x74\xf2\x3f\x5a\xfa\x8d\x57\x02\xed\x7f\x12\xd7\x67\xf6\x83\x3b\xa2\x82\xfd\xd7\xec\x70\xe8\x97\x2f\x2f\xb8\x2f\x76\xd6\x17\xc7\xb0\x6f\xb9\xaf\xec\x66\x9f\xa1\xe7\x48\x36\x16\x5c\xce\x6c\x67\xbd\xf3\xe5\xa7\xf6\x81\x72\x20\x14\x9f\x14\xa7\xcc\xa6\x65\x2a\x15\x25\x5b\x4a\xea\xb8\xa5\x34\xb7\x3f\x28\x01\x0f\x22\xbd\xce\x8f\x65\x14\x96\x5c\xaa\x1e\x4d\x1c\x9f\x62\x4f\x4d\x91\x2f\xfe\x51\xb5\x18\x36\x70\xd5\xf2\xa2\x4e\x74\x65\xad\xfe\xfd\x7d\x5d\xef\xaa\xb7\xcf\x9e\x3d\x3e\x3e\x0e\xee\xf2\xfd\xa0\x28\xef\x9e\x31\xe2\xe2\xd9\x1f\xa0\x52\xaa\x02\xab\x3f\xa2\xf9\x28\x72\xa4\x84\x40\xbe\x01\x83\x42\xd2\x6e\x1d\xd8\xcc\xae\xea\xb2\xc8\xd3\x15\xa2\x14\xcc\xce\x96\x7a\x6b\xd2\x2c\x5c\x67\x3b\xe9\x22\x12\xa8\x39\x93\x11\x90\xc4\x9f\x57\x24\xbf\x61\xdc\x48\x94\xcc\x32\x0c\xd0\x5b\xec\x12\x70\x01\xa4\x35\x1e\x18\x15\xf1\x6a\x4a\x9a\xd6\x6d\xb1\xb6\x6f\x95\xfa\x3d\xbd\xf3\x0f\xfa\x2f\xd9\x58\xc8\xe9\x0b\x17\xd1\xf0\xfd\x7c\x7a\x75\xbb\x18\x5d\x7d\x91\x1e\xc6\x3b\x98\x40\x9a\x3b\x5d\x1f\x76\x56\xff\x1b\x48\x76\x3f\xfe\xc4\x6b\xb6\xb9\x39\xc3\xc1\xef\x3c\xa7\x47\x9b\xad\x8a\x2d\xc5\x07\xe3\xbd\x8a\x27\x2f\xc5\x16\x84\x4f\xff\x4e\xbe\x67\xf5\x93\x6c\x01\xc5\x77\xee\x0f\xbb\xa2\xbe\xb7\x90\xa9\xf3\xc2\x73\xbe\x61\xf0\x7e\xff\x6d\x5a\x69\xac\x33\x2e\x2b\x7e\x55\xc4\x35\x7a\x24\xe2\xa8\xa7\x1b\xb0\x0e\x7c\x42\x39\x9c\x79\xfe\xcd\x5b\xa8\x1a\x5e\xda\xe0\x65\xbe\xa3\x2b\xf7\xe3\xed\x38\x10\xea\x12\xa5\x3f\xb4\x67\x0f\x5e\xbf\xee\x99\xa5\xdb\x9a\xcb\xe2\x5b\x2f\xde\x19\x80\xe8\xbc\xb3\x74\x70\xd8\xed\x2e\x2b\x0e\xb6\x84\x3a\x61\x7c\x08\x6b\xa2\xb1\x8a\x9b\x2d\xfb\x00\x62\x75\xce\x66\x96\x28\x54\xd9\x82\x84\x53\x95\xde\xe5\x48\x79\xc5\x0b\x24\x98\x5d\xbd\x90\x3c\xf7\x94\xb6\x1b\x1d\xa4\x1f\xf4\x87\xa2\x54\x98\xc9\x8e\xf7\x08\xca\xf3\x92\x8a\x60\x08\x39\x42\x75\x0a\xba\xb8\x75\xd0\x64\xff\xd1\x0d\xb9\x78\x7a\xdb\xfb\xc8\x0b\xa2\xca\x24\x39\x16\xea\xb0\xfb\xc9\x51\x48\x53\x1d\xa4\x85\xbd\x36\x15\xe7\x0f\x4a\x79\xd6\x1a\x5d\xed\x97\x65\xb1\xaf\x53\xb8\xe4\x88\x7d\x8c\x62\x34\x8a\x4b\x24\xdd\x9a\x85\xa1\xc0\x23\x17\x90\x3c\xd8\x90\x2c\xcd\xbf\x62\x61\x73\x78\x21\x65\x69\x6a\x0a\x04\xa2\xa9\xa7\xe8\xe1\x14\x54\xc2\xdd\xf3\xc8\xe9\xff\x47\xca\xe9\xaf\x8b\x24\x52\xb5\xbf\xb2\x55\x65\xcb\xc6\xa8\xa8\x10\x55\xae\x6a\x6b\xd6\xed\x44\xc9\xfb\x7d\x8d\x65\x2c\x89\xde\x01\x51\x39\x60\x56\xba\xa7\x41\x79\x28\xda\xb3\xc7\xfb\xc3\x69\x5e\xd4\xa7\xd9\xdd\x2e\x1b\xdc\xd7\xdb\xec\x0f\x03\xf5\x0f\xbf\xfd\xfc\x95\x7e\x06\xcf\xf6\xa7\xcb\xa2\xa8\x4f\x7d\x21\xe0\xe9\xf9\xe0\xf9\xa0\xfe\x56\xff\xe7\xbd\xe3\xf9\xf3\xe7\xcf\x5f\xbf\x7e\xe9\xfe\xff\xec\xcd\xab\xe7\xf2\xff\xdd\xcf\xd9\xd9\xab\x37\xff\x70\xf6\xe2\xf5\xf9\xf3\xe7\x2f\xdf\x9c\xbd\x3a\xfb\x87\xe7\x67\xaf\x5e\x9c\xbf\xf9\x07\xfd\xfc\x3f\xaf\x09\xc7\x7f\xf6\xee\x86\xd3\xfa\x1f\x32\xb3\x29\xd3\xaf\xd5\xd1\xcf\x7d\xef\xef\xff\x4d\x7f\x3e\xde\x5c\xf9\xf3\x6d\xc4\x4b\xe0\xad\x52\x23\x34\xd6\x20\x5d\x72\x7b\xfa\xbe\x00\x54\x88\xe7\x6e\x6c\x52\xf4\x82\x48\xba\x5b\x38\xcf\xe8\xff\xff\xdf\x84\xd0\xa9\xee\xc8\xfc\xc7\xbc\xa8\xff\x11\xbf\x80\x4e\x48\x71\x4a\x40\xe4\x1e\x8a\x89\x66\x45\x6e\x7b\xf1\x89\xc5\x9a\x6e\xfc\x72\xaa\xc8\xaf\xa0\x80\x86\x25\x58\xdc\xc3\xfe\xb4\xdf\xee\x74\x1d\xeb\x9a\x2d\x0f\xfc\x35\x10\xbe\xce\x0e\x02\x7f\x46\x72\x56\xa7\xfe\xf8\xdb\x5a\x48\x16\x8a\x42\x74\xd2\xf0\x24\xf0\x15\x3e\x09\xef\x1a\xd1\x9d\x8d\x73\xb0\x03\xb4\xef\x9e\xe9\x77\x36\xba\xb7\xb6\x25\xd8\x93\x20\x78\xcd\x26\x83\x35\x50\xeb\x08\xfa\x7e\x3d\x02\xd8\x3c\x4b\xb7\xe6\xce\x0e\xee\x49\x67\xdc\x94\xab\xfb\x67\xff\xf8\x8c\xff\x68\xaa\x2d\x6d\x4e\xf7\x09\x94\x63\x8d\xd8\xf1\x0b\x6a\x1b\x51\xa2\xaf\x29\x51\x51\x59\x7d\x12\x54\xd7\xfa\xf1\xab\xc1\x90\xc3\x7c\x25\xf8\x6c\x08\xd1\xf9\x6b\xf5\xfc\xf4\x54\x7f\x2e\xb2\xcd\x9d\xc9\xef\xf4\xa5\xcd\xbf\xfe\x76\x90\xff\x57\xfb\x19\x3c\x7b\x3f\xbf\x3a\x3d\xfb\xcf\x3e\xf2\xa3\x9f\xef\x9c\xff\xe7\x2f\xdf\x9c\x37\xce\xff\xf3\x57\x2f\x5f\xff\x76\xfe\xff\x2d\x7e\xde\x17\x45\x55\x87\xc4\x1e\x5f\x05\xa7\x9c\xe2\xd6\x67\x83\xe7\xfa\x54\x0f\xf7\x77\xfb\xaa\xd6\x67\x6f\xea\xfb\x44\x9f\x3f\x7f\xfe\x42\xa9\x1b\x21\x2e\x52\x41\x91\xc6\xf2\x10\x40\x4e\xe0\x92\x79\x1c\xb4\x07\x9e\x21\x3b\x2d\x64\x45\x45\x15\x9b\x2a\x96\x4c\x7f\x13\xfb\xe0\x9e\xbc\x1d\x22\x3b\x14\x70\x04\x30\x07\x33\x4f\xa0\x43\x10\x2e\x23\xf4\x5e\x3d\x16\x0d\xa2\x4f\xdc\xbb\x5e\xdf\x03\x3a\x4b\x4b\x42\x43\x09\xd3\xf1\x08\x2d\x7d\x9b\x30\xe5\x27\x56\xb2\x53\xbd\x2a\xc6\xb2\xe6\x91\x9b\x09\x56\xbe\x05\xb2\x7d\x38\xfb\x90\x22\x1d\x71\x98\xd4\x07\xff\x05\xc5\x5f\x40\xa3\x1d\xe0\x79\xa7\x0c\xc1\x63\xa4\x8c\xfc\x06\xb8\xb6\xfb\x32\xc7\x50\x50\x1d\x82\x82\x59\x16\x17\x45\x8a\xe0\xe0\x5b\xbc\x6e\x9a\x4a\x5a\x1e\xb7\x38\x97\x23\x0a\x63\x45\x6c\x62\x3e\x77\x2a\x54\x7e\x55\x60\x84\xc8\x64\x35\x6d\xc2\x04\x91\x81\x8f\x84\x69\x38\x43\x94\x32\x38\x79\x09\x20\xd1\x55\x83\x44\x19\x02\xd4\x11\x28\x30\x0c\x2d\x50\x74\x82\xda\x0e\x60\x10\xdc\x20\x91\x94\x69\x96\x89\x81\x56\xdd\x03\x1d\x71\xd1\x86\x12\xf1\xd6\x04\x01\xb2\x14\x2b\x97\x53\x94\xfa\x66\x65\x29\xd6\xd3\x10\x62\xc9\x92\xa7\x92\xf5\x65\x89\x6f\x98\xc2\xa8\x2c\x40\xae\x80\x7c\xb6\xaa\x8a\x12\xd3\xa6\x7a\x3e\xfd\xb0\xf8\x3c\xc4\xec\x29\xa5\x28\x2f\x39\x2f\x99\x7c\x2f\x31\x89\x19\x49\x3d\x9d\xa9\x76\x3e\xb2\x2b\xf9\xe3\x5e\x18\xb2\x90\xba\x9d\x85\x4c\xbe\x1b\x58\x4b\xf4\x62\xbc\xb8\x1a\x41\x74\x7e\x32\x9d\x9c\x8e\x27\x1f\x66\xe3\xc9\xc7\xd1\xf5\x68\xb2\x18\x68\x99\xc4\x9b\x7f\x1a\x5e\x5d\x41\x12\xa8\x9d\xa1\xc5\x5c\xdc\x74\x32\xd2\x97\xe3\xf9\x62\x36\x7e\x7f\xeb\xd3\xb9\x7e\x40\x42\x82\xed\x03\xa5\xee\x28\xa1\xa3\x38\x27\x04\x7f\xa7\x76\x7f\xfe\x34\x82\x5f\x8d\x27\xfa\x62\x3a\x59\xcc\x86\x17\x8b\x44\x2f\xa6\xb3\x85\xcf\x20\x7d\x1e\xbb\xd6\x73\x52\xed\xc3\x6c\x7a\x9d\x28\x4a\xad\x4d\xf9\x7b\x13\xcc\x57\x62\x8e\x2a\x6a\x0d\x25\xb3\x29\x01\x87\xaf\xbf\x1c\x0d\xaf\xc6\x93\x8f\x73\x3d\x9e\x44\x73\xf9\x3f\xc5\x27\x1d\x3c\x5b\x4c\xe7\x57\x7f\xc5\xcb\xff\xfb\xf7\xff\xcb\xe7\x67\xaf\x9a\xf7\xff\xcb\xe7\xbf\xdd\xff\x7f\x93\x9f\x45\xb9\xaf\xaa\xda\x96\x7a\xba\xb3\x39\x57\x02\x5d\xc5\xc0\x16\x67\x03\x18\x7d\xb2\x98\xdd\xce\x17\x7d\x71\xb5\x9c\xac\xfa\xce\x16\x78\xad\xaf\xd3\xaf\x56\x5d\xa7\x79\xfd\x67\x38\xa4\x67\xc5\xd2\x96\xb5\x1e\x7d\xb5\xf9\xda\xdc\x67\x03\x2d\x04\xae\x91\x7a\xcf\xae\x07\x4a\xcd\x6c\xa4\x8e\xc3\xac\xcb\x81\x19\xd5\xfd\x66\x99\xe6\xa6\x04\xff\x6d\x5b\x25\x24\xce\x55\xfa\x94\x82\x2c\x9d\x4c\x14\x48\xde\xf8\x82\xcf\x0e\x46\x2a\x7f\x37\xb5\xd5\xae\xdf\x2a\xf5\x8f\x3a\x6e\x51\xa5\x1b\x1a\x83\xc4\xcc\xea\x41\xe2\x94\x01\x6e\x5c\xb5\x78\x39\xaa\x2c\xad\x6a\x64\xaf\x0f\xaf\x7a\xe2\x8e\x1c\x74\xbd\x3f\xcd\x65\xff\xf9\xfd\x64\xb9\x3c\xd5\x04\xb6\x82\x7e\x55\x13\xd8\x44\x88\x4c\x2b\x45\x19\x2d\x74\x19\x99\xc5\x44\x68\x5e\xfb\x2c\xb2\x6c\xfa\xb1\xde\x40\xb5\xbb\xef\x4a\x9b\x99\xba\x33\x11\x42\xd6\x21\x12\x39\xd8\xba\x2d\x84\x8f\x7c\x32\x91\xa9\x98\x1f\x62\x73\xd1\x67\x66\x39\xae\x50\xc5\xdf\x42\x74\x6b\x6b\xb2\x29\xbb\xb6\x6c\x92\xc8\xc6\xbd\x55\x45\x19\xc1\xe5\xb1\xb0\xab\x4e\xb7\x00\x42\x36\xd5\x3d\x6b\x6a\x46\x4a\x43\x08\x36\xc5\x19\x8a\x9e\x46\x64\x06\x58\xea\x99\x61\x61\xbe\x27\x06\x5e\x5a\x30\xad\xa1\x50\xcd\x7f\x0b\x5e\x8a\x1e\xb9\xe0\x1d\x30\xf9\x5a\xf1\x1b\xbd\xa9\xf6\x60\x23\x06\x5e\x50\x54\xc8\xb5\xb0\x73\x36\x69\x66\x93\xce\xb1\xa6\x8a\xb8\xfa\xbe\x3d\x03\x20\xb4\x5d\xac\x81\xd4\x39\x0d\xdc\x75\x90\x92\x6e\x55\x15\xe1\x97\x95\xff\x32\x7f\xb1\xe0\x18\x05\x6e\x58\xd4\x65\xc8\xc4\x44\xc2\xab\xb7\xe6\x4f\x54\xbd\x51\xe4\x84\x10\x46\x15\x0e\xa4\x9e\x76\x73\x8d\x2a\x1e\x51\x91\x7c\xa3\x83\xba\xdc\x03\x5e\x75\xf1\x69\x3c\xef\x36\xcf\xde\x7f\xd1\xd7\xe3\x3f\x8e\xf4\xf5\x78\xb2\xf8\x3f\x60\x09\xcd\xa6\xef\x47\xb3\x85\x1e\xfd\x71\x34\xb9\x1c\x7e\xba\xd2\xff\xf6\x6f\x60\xc1\xfd\xf4\x93\xfb\x2b\xa4\x3c\x83\xad\xd6\x81\x07\xfb\x35\x30\x32\xf5\x63\x06\xdc\x51\x0c\x19\x00\xa1\x9a\x96\x5b\xa2\x5c\x1f\x2f\xc7\xf3\x8b\xab\xe1\xf8\x7a\x74\xd9\x65\xc9\x7d\xa7\xcb\xae\x63\x8b\x39\x1a\x5f\xce\x9e\x9b\xce\xe6\xaa\xc3\x84\x1b\xcf\x46\xce\x32\x1b\x4f\xc2\xbf\x18\x09\x15\xe0\x51\x7a\xf4\x2f\xa3\xeb\x9b\xab\xe1\xec\x4b\xd2\x82\x47\x29\x86\x47\x9d\x7c\x67\xcc\x6e\x66\xd3\x8b\xdb\x19\x74\x0f\x21\x41\xef\xe7\x8b\xf1\xe2\x76\x31\xd2\x1f\xa7\xd3\x4b\xb0\x9a\x11\xb6\x36\x9a\xbf\xf3\xb0\xa8\x5b\x37\x40\x97\xc3\xc5\x10\x5e\x7c\x33\x9b\x7e\x18\x2f\xe6\xef\xdc\xbf\xdf\xdf\xce\xc7\x30\xb0\xe3\xc9\x62\x34\x9b\xdd\xde\x38\x43\xb1\xaf\x3f\x4d\x3f\x8f\x7e\x19\xcd\xd4\xc5\xf0\x76\x3e\xba\x84\x91\x99\x4e\xa0\xab\x8b\x4f\xa3\xe9\x0c\x2c\xf6\xef\x99\xa9\xce\x02\xbe\x58\x88\x8f\x39\x0b\x17\x6c\x57\x81\xe5\x9a\x8c\x3e\x5e\x8d\x3f\x8e\x00\xd2\x27\x2c\xda\xbe\xb7\x68\xc7\xf8\xda\xcf\xc3\x2f\x02\x31\x06\xe8\x30\xf8\xa7\x58\xcc\x01\x69\xf5\xc3\x28\xaa\xff\x29\x26\xed\x6f\x3f\xbf\xe2\x67\xf0\xec\x7a\x7e\x7a\xf3\xd7\x75\x00\xbe\x63\xff\xbf\x3a\xeb\xb0\xff\x5f\xfd\x96\xff\xf9\x9b\xfc\x5c\xa7\xab\xb2\x70\x56\x50\x33\xd9\x7d\x72\x5d\x9d\xde\x5c\xf5\x09\x64\xe1\xc3\x3f\x40\x0b\x1b\x15\xa6\x77\xda\x59\xbe\x4c\x8e\xf3\xc8\x1e\x9d\x01\x55\x94\x92\x25\x2d\x6b\x14\xd6\x35\x89\xd4\x6c\x28\xa8\xa7\x3f\xd1\x33\x95\x7f\x19\xa2\x3f\x07\xfa\xd2\x73\xa1\x54\x18\x06\x43\xcc\x55\x2f\x44\xfb\x7a\xe1\x3f\xc0\x67\xe8\x51\xce\x42\x84\x85\x12\xca\xc6\x48\x9b\xac\xa7\x7c\x75\x08\xb2\xf9\x11\x11\x31\xa0\xd6\x0c\x97\xef\xdd\x0e\xe6\x03\x61\x8b\x83\x54\x80\xe4\x03\x22\x1a\x31\x34\x57\x98\x10\x2d\xc0\x56\x88\xaf\x91\xcb\x00\xb0\xb6\x06\x40\x82\x1e\xea\x17\x86\xb7\xc1\x33\xa4\x88\x4a\x84\xe2\xab\x28\x9c\xec\xe3\x99\x55\xcc\x5c\xe2\xcc\x51\x51\x70\xe8\x27\xa0\x77\xc5\x54\x41\xc4\x14\x40\xac\x3e\x0d\x06\x96\x98\xe1\x07\x5e\x05\x89\x7d\xcf\x14\x8d\xa2\x21\xd1\xfb\x70\x8a\xce\x07\xfa\x23\x14\xbb\x17\x1b\x3d\x43\x22\x2b\x75\x32\xec\x0b\xe8\x10\xfc\xf9\x54\xcf\xe3\xe8\x66\x5c\x75\x96\x05\xb9\x5a\x91\xf5\xe2\x5f\xab\x86\xb7\x13\x70\xbc\x95\x14\x30\x7f\x91\xb0\x62\xfe\x0f\xb1\xd6\xa8\x63\xac\x35\x62\xba\x03\xed\x40\xf0\xd1\x9a\xe3\x90\x70\xb8\x58\x75\x85\x8b\xdb\x9f\x86\xd4\x9b\x44\x2d\x35\xa6\x91\xaa\x9b\x5a\x0f\xf3\x94\x0e\x2b\xc0\xb9\x0e\x94\x3a\x79\xdf\x27\x9a\xaa\xff\x7e\x83\x1c\x73\x02\xb9\x41\xf0\xc5\x90\xcc\x69\xe1\xd9\x7f\x60\xa3\x6e\xcd\xda\x26\x2a\x10\x01\xe9\x6e\x22\xa0\x44\x4b\xef\x16\xca\x9e\xd7\x69\x85\x34\xe7\xed\xd9\xf0\xa2\x9e\xec\x69\x76\xc5\x94\x9b\xfc\x4d\xa8\x6d\x15\x6f\x5e\xd8\x0b\x2f\x40\x4b\x5a\x0e\x62\xa8\x9b\xa0\x6d\x31\x29\xf4\xc2\x53\xd8\xd3\xde\x3c\xd5\xd1\x79\xec\x9d\x2b\x24\x91\x00\xde\x73\xe2\x4e\x28\x08\xe3\x05\x00\x22\x1e\xfe\xea\x27\x40\xca\x26\x3a\x2b\xee\x0a\x2c\x57\xf7\xcc\xf7\xb4\x48\xe8\x18\x5e\xa2\x70\x6a\xcc\xac\xc6\x24\x3c\x58\xa8\x1a\x26\x15\x52\xfb\x7e\x2a\xee\x4d\x8d\xe4\x1e\xf8\x9d\xb2\x41\xd0\x15\x5d\x07\x84\x85\x6a\xb0\xc5\x94\xc5\x96\xa3\xf7\x81\x07\xab\x71\x06\x6a\x9b\xaf\x1b\x9c\x19\xae\x07\x17\xbe\x07\x11\xde\xfa\xd0\x54\x8e\x8c\x5a\x10\x85\x76\x28\x31\x81\xdb\x3a\xa1\xb3\x30\x09\x03\x45\x99\x88\xa0\x03\x11\x00\xd9\xcc\x57\xc1\x75\x95\xed\x99\x3f\xb9\xfc\x95\xed\xeb\x52\x0a\x82\x36\x83\x7c\x0c\x64\x84\x90\x62\xac\x7d\xa2\x63\x44\x45\x10\xec\xb1\x53\x1f\x52\x6c\xe1\xc3\x48\x95\x00\xb3\x11\x45\x72\x7e\x7d\x6b\x91\x59\x01\x75\xe4\x9a\x82\xe7\xa1\xf2\x10\xda\x8c\xcd\x27\x5a\x81\x70\x82\x62\x35\xff\x16\x4b\x34\x03\xcc\x36\xf3\x45\xb6\x27\xa3\x3e\x05\x6c\x42\xa6\xcc\x1f\x09\x3d\x53\x9d\xa6\xd5\xa0\x07\xfc\xa0\x4b\x6b\x4a\xa2\x14\xa9\xbe\x06\x3e\xda\xb4\xc6\x88\x8f\xdc\x1a\x48\x34\x99\x17\x9e\x8f\x8b\xf0\xc9\x20\x3b\x7b\xb7\x37\x90\xda\x24\x9e\x77\x19\x43\x61\xce\x11\xc4\xbd\x07\xc1\x1a\x2f\x90\x18\x91\x1f\x23\xfd\x34\xd7\x76\x54\x3e\x46\x21\xa6\x8d\xa9\x05\x50\x9b\x5c\x2f\x50\x9e\x9e\x18\x41\x42\x80\xb3\xf3\x79\x49\x7c\xfc\x14\xa5\x57\x40\x95\xd0\x6b\x15\xba\x06\xe9\x2e\x14\xc6\xae\xa9\xb4\x23\xd1\x9b\xb4\x06\x72\x93\x4d\x4b\x70\x93\xe0\x33\xa4\xf3\x7c\x2a\x59\x24\x7e\xf3\x1f\xff\x1b\xfe\x0c\x9e\x8d\x6e\xfe\xbe\xf8\x8f\xf3\xd7\xcf\xdf\x3c\xff\x0d\xff\xf1\x77\xfa\x19\xad\xb2\x74\x57\xd9\xa6\xf7\x77\xaa\x1f\xf4\xd9\xe0\x39\xe6\xaf\x87\x17\x17\xd3\xeb\x9b\xe1\xe4\xcb\x78\xf2\x51\x16\x99\xfa\x60\xe9\xed\xe4\x72\x84\xb9\x53\x2c\xeb\xe2\x60\xd4\xe8\xe2\x6a\x7c\x33\x1f\xe9\x9b\xdb\xf7\x57\xe3\x0b\x75\x35\xbe\x18\x4d\xe6\x23\x7d\xd2\x83\xba\xce\xeb\xd1\x64\xd1\xeb\x0f\x20\xa2\x05\x31\xb9\xd9\xe8\x66\x36\xbd\xbc\xc5\xf4\xec\x74\x26\xf2\xc6\xee\xbf\xa3\x1a\x57\x75\x31\x9d\x50\xa8\x6f\xae\x67\xa3\x8b\xf1\xcd\x78\x34\x59\xfc\x34\x77\x6d\x1d\xdd\x2c\x42\x55\xec\x78\xae\xfd\xcb\x82\x9f\x38\xfa\x30\x9e\x70\xcd\x99\xd6\xba\x77\x11\xb9\x68\x10\xe7\x46\xa1\x2a\xa6\x03\x32\xc1\xdf\x45\x1e\xdb\x4c\x5f\x48\xfe\x52\xf9\x07\xaf\x91\x1d\x27\x52\x64\x41\x8d\xb8\xab\x87\x4c\x69\x03\x66\x05\x34\x47\x6b\xbd\x6c\xbd\x1a\x0b\xb6\xf6\x4b\x24\x79\xa9\xe5\xeb\xdf\xf2\xb7\xb4\xd6\x69\xbf\xe9\x33\xde\x88\x7a\x38\xf9\xc1\xb4\x2f\x5c\xcd\xf8\xb3\xef\x94\xc2\x82\x2c\xb4\xc1\xe8\x79\x64\x2b\x1f\xfb\x12\xbb\xb4\x35\xab\x2a\x38\x23\xc9\x39\x3a\xa2\xdf\xcb\x43\x90\xbf\xa3\x1b\x45\xf4\xc3\x79\xb5\x72\x26\xf4\x4f\xfe\x91\xd5\x4f\xac\x76\x21\x3e\x4f\xb4\x65\x8f\xa6\x42\x19\xb6\x66\x83\x96\x07\xec\x40\xf4\x15\x54\xb3\x44\x3a\xdf\x22\x47\x66\x77\xa4\x86\x6c\x7e\xf6\xa7\x4a\x2f\xed\xbd\xc9\x36\x83\xa8\x55\x55\x93\xff\xd5\x0f\x88\x6a\xbc\x1f\xae\xf6\xb7\xfa\xc4\x8d\xb4\x1b\x4c\xd2\x64\x09\x09\x8f\x4d\x30\x60\xe2\x72\x2b\x67\x3b\xfc\x89\x54\x7c\x5b\x75\x9a\x01\x7b\x49\x4a\x77\x6c\x37\x98\x68\x29\xe9\x93\x14\x5f\x0c\x62\x05\xc7\x1c\x95\x88\x10\xa7\x77\x21\xa9\x8b\x83\xac\x72\x40\x6d\x31\x77\x78\x33\xbe\x10\x3f\xca\x07\x12\x98\x18\x19\x1f\xd6\x88\x1c\x60\xb3\x21\x27\x03\x30\x1a\x39\x4d\x68\x15\x41\xe3\xa9\x16\x24\x05\x94\x4e\xc3\x8d\xd8\x23\xbb\x95\xf3\xe9\xd8\x63\x8b\x16\x10\x20\x8b\x21\x61\x7c\x6f\xdd\xa0\x32\xe3\x4d\x63\x44\x5d\x93\xe9\x9f\xdc\xed\x1a\x58\x32\xa3\x59\x8f\x0b\xe2\xb0\xaa\x17\xe8\x25\x02\x8b\xbc\xdf\xcc\xee\x89\x9e\x5d\x5f\x0c\x25\x0b\x7f\x79\x32\xf5\xae\x79\x8d\x4f\x05\xa1\x3e\x93\x45\xa7\x4e\x15\x82\x2a\xb3\x21\x26\x40\x00\x81\x33\x87\x93\xeb\x49\xef\x5e\x3c\x1e\xce\x15\x39\xf4\x12\xc9\x57\xa9\x59\x20\xfb\xff\x51\x22\xdf\xa7\x43\x22\x89\x7a\x02\x30\x97\x08\x7d\x55\x86\xe5\xf9\xdf\xec\x6c\x89\x2e\x44\x98\x09\x80\xd4\x05\x22\xe3\xd6\xac\x79\x81\xbb\xe8\xb0\xe6\xda\x24\xfc\xf2\xea\xbe\x85\x28\x4b\x9a\x4e\x17\x10\x06\x37\x5c\x99\x01\xa8\x0a\xfe\xfd\x86\xb9\xe1\x33\xe3\xe2\xf1\x11\xbc\x9b\x66\x5c\xa4\x15\x0c\xa9\x0b\xfa\xcf\x4e\x52\x64\x16\x37\xd0\x48\x8d\xfb\xa3\x43\xfa\x43\xe3\x86\x25\x80\x71\xf3\x91\xe3\xee\x28\x13\x93\x67\xf1\xcf\x23\xc0\x88\x8a\xca\xcd\x37\x89\x26\xa4\x07\x12\x23\x35\xbf\x90\xf2\x3d\x41\xa7\x87\xec\x81\x42\x5e\x62\x3a\xca\x3b\xdf\x07\xf4\xb9\x1e\x55\x18\xda\x86\x75\xe5\x11\x04\xd5\x43\x68\xfc\x09\x88\xee\x66\x67\xa7\x83\xac\x36\xb3\x33\x12\xa1\x9a\x7f\x45\xc5\x2a\xcf\x79\xf0\xe4\x64\xd3\x80\x74\xef\xde\x94\xeb\x47\x82\xc0\xe8\x2a\x76\x89\xdd\x62\x83\x05\x32\x00\x61\xc9\xb0\xda\xe0\x97\x50\x84\xc1\xd1\x8b\x8c\x8a\x3e\x5a\x0b\x96\x02\x77\xb5\x14\xe7\x01\xfa\xa4\xaa\x71\x50\x56\x16\x28\x71\xeb\x7b\x78\x6d\x9a\x27\xce\xa7\x36\x55\xb5\x2f\xdd\x69\x59\x51\x80\x24\x94\x6a\xb8\x2e\x5f\xc8\x38\x0f\xe3\x75\x5a\x8c\x47\x9e\xe2\xb6\x0e\x63\x29\x94\xfc\x6b\x0b\x04\x75\x7b\x93\x41\x25\x9c\x2d\xeb\x83\x22\xdf\x9b\x38\x98\xf0\x93\x78\x89\x0d\xf4\xa8\xd9\x45\xc6\xc2\x54\x4d\x99\xc4\x22\x0c\x19\xb0\x01\xd1\xa7\x96\x40\x27\x56\x73\x27\xe4\xd3\x05\x0b\xab\x24\x5a\x74\x97\x94\x68\xa7\xe2\x76\x72\x8c\x40\xc6\x22\x07\x7a\x48\xc4\x7e\xb4\x28\x81\xdc\x18\x78\x53\x39\x1c\x4b\xdf\x72\x3b\xa1\xa5\x47\xe6\xe7\x9c\x0e\x9f\x30\xe9\x74\xf4\x00\xb1\x83\x5b\xd0\x45\x66\x83\x7e\x0a\xf4\x18\xa8\x0b\x2d\xe8\x41\x85\x8e\x75\x0e\x30\x37\x21\xb7\x16\x75\xb5\x61\xa0\x63\xe1\x09\x28\x06\x8d\xe8\x48\xdb\x94\xb4\x91\x8a\x11\xd4\x6f\x86\xf6\xd6\x85\x3c\xf2\x23\x9b\x16\x75\xde\x66\x82\x32\x39\xee\x08\xb2\x36\xb0\x34\xb0\x50\x2e\x5c\x82\x1e\x8f\x8a\xa8\x5b\x63\x8b\x60\xdd\x6f\x2f\x10\x2f\xc1\xca\x20\x15\x5c\xff\x81\x14\x9a\x74\xd8\xab\xfd\x66\x93\xae\x52\xd4\x71\x64\x55\x5f\x1a\xa9\x34\x6f\xed\x99\x70\x7e\x7a\x21\xd3\xfa\xbe\xeb\x22\xf5\x5b\x4b\x31\x47\xa8\xb4\x38\x30\xaa\x4c\x8c\x3a\xce\xe1\x99\x2b\x35\x8c\xda\x2f\x28\xbf\xa2\x41\x6d\xd2\x76\x34\xcf\x6c\xa2\x31\x70\xed\x3e\x62\x70\x46\x68\x3b\xef\x90\x38\x0f\xaa\x11\xca\x8b\xa9\xd4\xba\x98\x36\x7d\x97\xde\x35\x3d\xa2\x10\xf8\x0f\xaf\x7e\xab\x54\xda\x8f\x58\x2b\xc2\x2e\x2e\x72\xb2\xe0\x99\x10\x45\x5a\x4f\xf0\x0b\x11\x07\x8b\x89\xdd\x92\xc0\xca\x9f\xaf\x39\x6c\x26\xb3\x21\x32\x82\x56\x36\xbb\x91\xd6\x19\xda\x26\xcd\x18\x59\x22\x1f\xf7\xe4\x33\x1a\x31\x39\x85\xba\x7b\x4f\x87\xe5\xde\x29\x95\x36\x06\x83\x82\x7f\x3f\x32\x16\xe1\xbc\x83\x8a\x77\xb3\x35\x77\xb6\x4a\x54\xe8\x32\x26\xf8\x12\xd0\xa4\xc2\x7f\x11\x65\x23\x8c\x0b\x50\x8d\x9b\x8c\x67\x95\xfc\x54\xe7\x10\xfb\x47\xb1\x32\x41\x56\x54\xc0\xdd\xb6\x49\xeb\x0a\xda\x9c\xf6\xb1\xfe\xa0\x12\x8a\x2e\xcc\xa6\xc9\x21\x52\xa2\x24\x24\x76\x51\xb9\x4e\xe0\x46\x01\xa3\x86\xe9\xf4\x4c\xe4\x1f\x93\x1b\xc0\xd2\x6e\xd1\x69\x0d\xe7\x11\x2d\xb4\xf4\x21\x6e\x46\x1b\x67\x18\xa9\xad\x08\x21\x00\x9f\xaf\x88\x4c\x0a\xa4\x23\x06\xe8\x2a\xaf\x5b\x5b\x71\xbd\x3a\x81\x1a\xa1\x8c\x5c\x9b\x48\x0d\x10\xc9\xef\xd1\xe1\x22\xca\x4a\x65\xf4\xd6\xae\xd3\xfd\x56\xaf\xf6\x55\x5d\x10\xe7\x31\x28\xc7\x43\x52\xcb\xe7\x44\xbe\x51\xd4\x18\xb6\xcd\x67\x66\x1d\x17\xad\x06\x46\xe5\x08\xaa\xd8\xcc\x2e\x34\x76\x2f\xc3\x0e\x1b\x5f\xec\x72\x56\x68\x1c\x97\xfd\xa8\x8c\x27\x9a\x2a\x7e\x9a\xc7\x53\xc2\x99\x40\x59\xc2\x16\x85\xd0\x40\xa9\x68\x99\x32\xa9\x2d\x89\xe8\xc2\xd4\x82\x30\x0c\xe4\xa3\x9a\x25\x2f\x04\x43\xa4\x97\x50\x89\x47\x78\x72\xeb\x74\x87\xb6\x11\x63\xfe\x81\x23\x05\x06\x4d\x1e\x8e\x44\x20\x9f\x63\xeb\x00\x57\xc2\x00\xf6\xf2\x05\x9c\x1a\xc7\x89\x3d\xe0\xbd\x56\xc9\x20\x4e\x10\x60\x83\xab\x84\x5e\xad\xda\x2f\x6c\x59\x7c\x30\x47\x2f\x07\xfa\x62\x7a\x7d\x3d\x9a\x5d\x00\xa7\x98\x08\x97\xb9\x71\xdb\xba\x23\x04\xf6\x1f\x9f\xf3\xa4\x48\xed\x57\x0b\xe8\x00\x23\xce\x82\x29\x36\xa3\xeb\xd3\xa7\x5f\xdc\x6f\xc9\xcb\xb1\x08\xd3\x2e\xab\x24\x70\xa0\xbb\x4d\x94\xdb\x32\xc0\x8b\xb3\xf4\xab\x1d\xe8\xcf\xf7\x40\x2c\x24\x53\x1b\x69\xa5\x9c\x19\xc1\xbc\xf6\x1b\xb3\x72\xef\x09\x5a\x2b\xbe\xcd\x02\x60\x12\xb1\x05\x4b\x43\xd1\x39\xd2\x91\xd0\x8d\xb8\xc1\x8c\x7c\x18\x01\x3e\x82\xe0\x13\x91\x5c\x60\xfa\x29\xcd\x95\x9f\x32\x3a\x6a\xd8\xe0\xc4\xec\xb9\xde\x15\x35\x1d\x65\xf1\x19\x89\x47\x48\xec\x92\x0b\xad\x3f\x30\x7b\xa2\xe0\xd3\x5f\xd2\x58\x3a\x36\xe5\x73\x4e\x7a\x62\x76\x65\xcc\xa6\xef\x6d\x3b\xb7\xe1\x2a\xd4\xeb\xd8\xd8\x7c\x4d\xd4\xe8\xa8\x5a\x7e\x50\xc0\x4c\xd5\x6e\xbe\x3e\xe9\x8d\x59\xd9\xdc\xae\x1b\x4f\x96\xb9\xdf\x0c\xf4\xd5\x12\x3e\xd9\x15\x9e\xf9\x55\x5d\xe9\x13\x62\x89\xc6\xdb\xa7\x77\x05\x1f\x74\xdf\x2e\xd1\x6a\x45\x4e\x66\x92\xec\x21\x41\xaf\x2a\xf8\x9e\x0a\x99\xd3\x58\x6e\x51\x1a\xd8\x91\x01\x29\xd5\x60\x8e\x34\x99\xa3\x71\x94\x37\x03\xef\xcd\xbb\x7e\x86\x58\xe0\x0b\xa6\xe2\x14\x6e\x6d\xd7\xc8\xaa\x0e\xea\x34\xd7\xf0\xa8\x82\xa1\x4d\x7f\xd6\x35\xb1\x8a\x27\x16\x5d\x42\x49\xf5\xc9\x46\x5d\xd0\x46\x6d\x3b\x87\x6c\xda\x94\x1a\xc7\x56\x95\x36\x23\xd9\xf2\x82\x70\xef\x60\xa0\x23\x2a\xdb\xde\x21\x57\x7d\x87\xe1\x1e\xa5\xee\xf4\x98\x54\x42\xdd\xa8\x91\xb0\xa9\xb3\x55\x8e\x0d\x2e\x9c\x95\x6f\x35\xea\x09\x6f\x77\x75\x76\x60\xf5\x5e\xdc\xa4\xdc\x69\x15\x2f\x7f\x10\xa3\x66\x05\x77\xf0\xa3\x5d\x6f\xd0\x28\x5a\xf6\xc9\xf0\x8f\x9f\xd0\x9c\x52\x92\xb8\x4a\xc8\xce\x40\xd8\xb7\xe0\xf0\xee\xfe\xa6\x76\x6e\x28\xe0\xf6\x91\x02\x5f\x71\x95\x00\x8c\x9e\x5d\x3b\xcb\xba\xce\xf0\x8a\xca\xed\x5d\x51\xa7\x2c\xaf\xb8\x38\xbe\xc2\x90\xce\x19\xac\xb0\xd4\x79\x34\x8a\x2a\x1c\x42\xcf\x34\x70\x65\xa1\xd1\x6c\xbf\xed\x28\x7b\x1d\x11\xb0\xc7\x27\xc4\x16\x25\x45\x85\x9f\xff\xa3\xab\x29\x71\x9f\x84\x83\xe3\x5f\x5c\xa3\x1b\x16\x10\x12\x6f\xe7\xf0\xb6\xae\xf1\x19\xe8\xf1\x46\x91\xdd\xd4\x39\x7e\xf0\xed\xad\xf9\x6a\x2b\x8e\xc3\x41\xe8\x93\x77\x32\xdc\x52\x1b\x77\x05\x04\x9b\x56\xf1\xd8\xd6\x45\x68\x5b\x42\x7c\xee\xed\x87\xa0\x82\x89\xb0\xc7\x39\xff\xd0\xbd\x9a\xda\xae\x1e\x58\x79\x03\x7d\xdb\xd2\x18\x4e\x9e\x5a\x52\x8f\x81\x08\x2c\x9c\x96\xdc\x22\x71\xca\xb4\xcf\x7a\x2d\xfa\x07\x9d\x52\xdf\xed\x14\x99\xff\x28\xd1\xb9\x2f\xbd\xb2\x6d\x25\x2c\xd2\xc6\x7a\xdf\x19\x34\x57\xe9\xa8\x45\xd2\x25\x24\xf8\x7d\xaa\x5f\xa4\x7a\x6f\x0e\xd4\x34\xfa\x3a\xda\x0d\xaf\x06\x92\x63\x4b\x29\xa2\xe2\x1d\xce\xb9\x84\xe1\xea\x8b\x9e\x8f\x16\xfa\xc3\x74\xb6\xf8\xa4\xc7\x93\x46\x1e\x2d\x69\xb2\xcd\xfa\x44\xe0\x74\xa2\x86\x13\x4f\xb9\xfb\x7e\x38\x1f\xcf\x5b\x05\xae\x44\x23\x1a\x68\x1f\xbb\x98\x78\xb9\x21\x4a\xd4\x52\x88\x5a\x00\x7e\x24\xd4\x02\x0c\xdd\x53\x12\x2d\x48\xe7\xba\x5e\xa1\xa0\xa6\x35\x69\x97\x45\xb4\xa8\xe7\xa6\xb3\xef\x93\xf4\xa2\xf1\x18\x42\x14\x69\xc5\x95\xc4\x4d\x21\xda\xb5\x45\x22\x36\x0e\x30\x08\xfe\x2f\xd2\x8f\x51\x08\x49\x89\xa0\x7e\x4d\xf9\x49\x38\xae\x28\x5e\x03\x62\x40\x69\xf5\xd5\xad\x85\xaa\x58\xa5\xb0\x06\xf9\x46\x52\x1d\x2a\x9d\xdf\xc9\x2b\x00\x75\x9f\xbb\x67\x00\xc5\xe7\xd3\x68\x8a\xde\xe1\xaf\xf6\x62\xe3\x39\xab\x6c\x59\x82\x84\x6f\xd0\xd6\x25\xa9\x82\x20\x0d\x82\x60\x14\x5c\x76\x0a\x85\xa2\x9c\xd5\x00\xd5\x4e\xa6\x36\x89\x67\xc4\x82\xb4\xd2\xbf\xef\xd3\x5d\xf0\x8f\xf7\x39\xf9\x19\xb8\xb1\x0b\x8c\x3d\x95\xe5\xde\xd3\x90\x52\xb5\x4f\x91\xd3\x8a\x7e\x3d\x08\x95\x2d\xb3\xa8\x1e\xe3\x2f\x58\xdd\x13\x5a\x83\x3e\xaf\xac\x27\x58\xda\xa2\x64\xe5\x0b\x95\xcc\x7c\x1a\xfe\x32\x82\xb5\xe7\xdf\xf8\x63\x85\x30\xea\x47\x0a\x61\x74\xbb\x10\xa6\x63\xed\xab\xab\xe9\x7c\xc1\x85\x2c\xfd\x84\xeb\x55\xf4\x7f\xa0\x5e\x45\xb5\xea\x55\xf4\x5f\x5e\xaf\xa2\xe2\x7a\x15\x2e\xb0\x7e\x22\xbd\xcf\xa5\xd8\xa3\x7f\x71\xbe\x0d\x96\xb7\xb8\xf6\x53\x7e\x0b\xf2\x5d\xa3\x4b\xfd\x69\x34\x1b\x01\xf6\xe0\x2f\xa8\x76\x21\xce\xe0\x37\x03\x66\x6e\x06\x16\xc5\x28\xf2\xd0\xe1\xbe\x82\x00\x14\x68\xa1\xb9\x55\xb9\xcf\x49\xa6\x50\x78\xc4\x61\x0b\xa8\xcc\x3c\x42\x84\x52\x84\xf9\x91\x11\xd8\xed\x6c\x78\x08\xad\x6e\xff\x14\x5a\xef\x24\x82\x65\xb7\x26\x25\x15\x9d\x26\x83\x68\x0b\x38\xe0\x4b\x62\x59\x8f\x85\x24\x2f\xc8\xde\x65\x9a\x09\xe7\x1e\xd4\x05\xb9\x14\xa1\xa3\x5e\x61\x08\x5c\x97\x6d\x48\xa5\xbb\x83\x6b\xbb\xdf\xb2\x11\xed\x89\xf9\x22\x39\x47\x15\x1e\x84\x43\x03\xb4\xb0\x61\x64\x90\xa0\x52\x1c\x96\x79\x55\xa7\x35\xe4\x8d\x7d\x20\xd8\x4b\x02\x4b\x37\x83\x42\xe9\x52\x25\x58\x09\x95\x60\xfd\x6b\x54\x82\x23\x5b\x0a\x5c\x7b\x75\x12\x24\x94\x64\xb2\xa5\x69\xc7\x63\xd1\x31\x0c\xaa\x84\xfe\x72\xbe\xa5\xef\x2d\xe9\x0a\x87\x55\x46\xa3\xb1\x7f\x27\x55\x9f\xa4\x7a\x5a\x1f\xe8\x12\x52\x66\xca\x6a\x75\x7e\xb2\xec\xd3\xdc\x10\x9b\x67\x0d\xe5\x06\xd4\xc0\xb5\xfb\x4f\x78\xa2\x18\xbf\xb4\x82\x0a\xc7\x35\xf0\x8b\x66\x5d\xef\xea\xba\x0e\x5a\x6f\x41\x68\xc5\x06\x69\x37\x0b\x05\x07\xfd\x81\x0e\x79\x2f\x20\xe6\xeb\x81\x79\x69\xb6\x02\xa1\x8d\x38\x5d\xbe\x0e\xa2\xfe\x90\x5d\x80\xd6\xbb\xb7\xec\x4b\xdb\x0a\x84\xed\x6c\x99\x16\x48\x2c\x98\x6e\xad\x46\x0d\xe0\xa5\x5d\x15\x5b\x58\x0a\x50\xcf\xcb\x8e\x44\x5e\xe4\xe1\x32\x02\xd0\xaa\xf9\x15\xbd\xf7\xfd\x4e\x64\x26\xd6\xfb\xd0\x2b\x60\x2f\xdc\x13\xee\xf1\x29\x9f\xcf\x38\x3b\x00\x95\x63\x42\xe0\x47\x91\xe0\x2a\xec\x05\x2f\xf9\x10\x35\xee\x88\x16\x54\x34\x74\xa8\x63\xd2\x4c\xf3\x2c\x0f\x62\x67\x49\x5f\x50\x36\x0b\x67\xd7\x2b\xf4\x60\xe2\xbb\x7c\x48\x1f\x40\xbd\x97\x69\xaa\xd3\x4a\xa0\x4b\x49\xd1\xb4\x59\x81\x20\x19\x5b\xe2\x43\x68\xb9\xaf\x9d\x03\x04\x5e\x24\xf8\xa2\x0f\x45\xba\x06\x8e\x4c\x12\xf1\x5c\xe1\x51\x14\x1d\xa6\x3e\x68\x87\x42\x38\x1e\x19\xac\x96\x56\x33\x83\x19\x23\xa1\x42\xcd\x3a\x06\x6b\xd0\x37\x0b\x8f\x9b\xd7\xf6\xd1\x94\x6b\xa6\x18\x10\xda\xc7\x60\x47\x93\xec\x4e\x24\x90\x23\x4e\x16\x90\xe3\x71\xbf\xec\x77\x2c\x5c\xaf\xb6\xa3\xbc\xda\xce\xa4\x40\xe1\x42\x38\x17\x7c\x41\x77\xbb\x35\xf7\x26\x16\x61\x66\x6e\x68\x20\x09\x08\xd9\x1b\xe8\x0b\x83\xf1\x84\x62\x10\x29\x26\x31\xb6\xac\xf5\xfc\xe8\x8b\xaa\x21\x35\x64\x2a\xe0\x5e\xc5\xcb\xa4\x99\x16\x83\x41\xe2\xf0\x66\xeb\xb9\x0a\xa5\xa2\xf6\x29\x16\x4d\x7b\xec\x52\x94\x3b\x15\x63\xc9\x1b\x21\x3c\x88\x09\xa2\x81\x17\x5f\x7d\x57\x03\x68\x21\x96\xab\x98\x96\x28\xb5\xdc\x07\x3e\x54\x93\x3d\x9a\x43\xa5\x97\x31\x68\xaa\x41\x88\x74\xb4\x59\x52\x95\x91\xc0\x63\x4c\x00\x0d\x51\x10\x86\x00\x24\x74\xde\x98\xa7\x7b\x99\x0a\xb6\xee\x44\x35\x83\x03\xc0\xd9\xfc\x44\xaa\x4d\x74\xb4\x95\x47\xef\xab\xc0\xb1\x27\x9a\x30\x20\x9a\x46\x94\x00\x84\x14\x15\x33\xb5\xc3\x4e\xf1\x72\x07\xe7\x27\xa6\x0f\x7b\xca\xdd\x22\x0a\x88\x22\x92\xe8\xa8\x20\x04\x52\x5e\x88\xe4\xb3\x3f\x5e\x68\x18\xbb\x93\xea\x94\x4d\x97\xbd\xed\xf6\x31\x58\xc7\xcf\x37\x34\x81\x9a\x84\xad\x27\x7a\x4c\x94\xad\xea\x62\xb7\xb3\x59\x33\xf5\x1d\x28\x43\xd2\x38\x87\x81\x9a\x7d\xdc\xf1\xe8\xe2\x54\x1d\x79\x21\x41\x38\xb2\x68\xd9\x72\x58\xce\x18\xc2\x82\x80\xc8\x67\x3a\x29\x08\x4b\x17\x1b\xd0\x1c\xf8\xc2\x12\xab\xcd\x41\x09\x19\x7c\xf9\xdd\xdb\x1c\x1c\xa9\x39\x26\x93\x8a\x8d\x1e\x6e\x6d\x99\xae\x0c\x1c\x1b\x5e\x74\x34\x6e\x2d\x6a\x91\x71\xd9\x8d\x8c\x83\x76\xdf\x08\x81\x49\xc2\x9d\x43\x07\x6b\x4a\x5a\xb1\xce\x77\x43\xa9\x67\x50\x41\x42\xab\xaa\x2c\xdc\xa8\xc2\xae\xc5\xf7\x83\x52\x04\x16\x06\x86\x8a\x21\xa3\xff\xb4\x77\xc6\x1d\xdc\xe9\x18\xcd\x52\x41\x06\x2e\x58\x19\xbf\x41\xfd\xff\xa7\xfc\x0c\x9e\x7d\x98\x7f\xb8\xbd\xba\x9a\xfd\xfd\xf8\x1f\x9f\xbf\x78\xd5\xe2\x7f\x7c\xf3\xf2\xfc\x37\xfc\xff\xdf\xe2\x27\x94\xde\x9e\xfd\xfc\xf3\xeb\x53\xa0\x73\x3a\xa6\xf5\x96\xe8\x71\xbe\xe2\x73\x94\xd9\x63\x23\xee\xfd\x77\x70\xfa\x1d\x95\x3f\xbc\x83\x23\x67\x9f\x73\xa0\x29\x48\xa1\x29\x61\x6e\x3e\x2b\xca\xb8\xe6\xf5\x69\xde\xa7\x2a\x41\x48\x81\x3b\x36\x91\xd5\x47\x05\xf9\x90\x5d\x38\xfe\xff\xde\x23\xfd\x5f\xf3\x67\xf0\x6c\x98\x39\x93\x27\xff\x3b\xd6\xff\xbc\x3c\x3f\x6b\xec\xff\x17\x67\xaf\x7f\xab\xff\xf9\x9b\xfc\xd0\xec\xe3\x9e\x8d\x8b\x80\x94\x3a\x61\x12\xd8\xdf\x25\x7a\x52\x3c\x58\x50\x97\x3c\xfb\x5d\xe2\xce\x8a\x9f\xfb\x0d\xc5\x8f\xb3\x9f\x7f\x7e\x09\x7f\x79\x05\xff\xfb\x06\xfe\x97\x3e\xab\xf8\x35\x23\x94\xe7\x4a\x2b\x5b\x25\x4a\x5d\xdb\x3c\x2b\xf4\x0d\xd4\xd4\x5e\x98\x2c\xdd\x14\x65\x9e\x9a\x04\x88\x14\x86\xdd\xb4\x71\x7a\x32\x5d\x8c\xde\x62\x11\xf4\x55\x00\x15\x38\xa3\xd0\xb3\x33\x98\x4a\xc6\x28\x40\xc1\x80\xcd\xda\x5f\xa1\x6b\x39\xae\x2b\xc6\xa9\x41\xa0\x62\x59\xd5\x06\x40\x00\xd9\x41\xa8\x39\x0a\xb1\xe3\x8e\xf7\x71\xf5\x2c\x50\xd3\x6d\xcc\x36\xcd\x52\x53\xc6\x7a\xc3\xfc\xd1\x58\x24\x21\x02\x4d\x20\x44\xe6\x5b\x5d\x1a\xbd\xc2\x2a\xe2\x8e\xe1\x8c\x01\xe5\x94\x0c\x76\x96\x21\x84\xff\xa4\xec\x30\xe7\x93\xc5\x10\x2a\xaf\x4c\x56\x3c\xe6\x2c\x08\x2c\x0f\x55\xcb\x34\xb1\x9e\x1e\x24\xe6\x05\x40\x1e\x3a\x02\xde\x28\xcf\x2d\xeb\x9c\xc6\xbb\xd2\xec\xee\xfb\xe4\xec\xa7\x9c\xaa\xc8\x0b\xae\x2b\x4a\x42\x01\x4d\x82\x25\xf5\x99\x45\x0f\x06\x25\x09\x10\x70\xeb\x3e\xcb\x2f\x03\x51\x89\xf0\x6c\x21\xf2\xa6\x9f\xa3\xb4\x39\x15\xe6\x04\xff\x75\x6d\xab\x55\x99\xfa\xf4\x41\x4d\xc2\xf9\x48\xbb\xcb\x24\x61\x02\x8e\xba\xb4\x60\x86\xef\x10\xa7\x07\xf0\x84\x0d\x8f\x64\x54\x0a\x83\x49\xd3\xfb\x22\x5b\x57\x0d\xcc\x26\xb9\x2d\x5e\x5d\x19\xf0\x20\x02\x1a\xde\x7a\x0d\xba\xdc\xa8\x88\x0f\xb8\x93\x35\x27\x7d\xf7\x79\xed\xe1\x1a\x3e\xd4\x10\xf9\x18\xc0\x68\x9c\x99\x15\x0d\x91\x7a\x62\x88\x5e\x73\x14\x4f\xa6\xa2\x74\x69\x61\x41\xaf\xbc\x06\x1a\xb9\x33\xaa\x91\xb3\xe2\xd6\x60\xf4\xfc\xf9\xc0\x17\x40\x5c\x9b\xba\xb6\x25\x19\x07\x5e\x28\x29\xc8\xec\x12\xbe\x67\xb7\xaf\x6d\xd0\x3e\xf9\x9a\xbb\xf5\x66\x2a\xdd\xe3\x15\xfd\xf1\xbe\xa8\x6a\x9c\xab\x41\x0f\x38\x5c\x7c\x65\x4e\xa2\x97\x36\x2b\x1e\x13\x6c\x2b\x3c\x94\xc3\xd8\xa8\xbe\xb4\x68\xe0\xf3\x64\x74\x49\xa1\x9e\x36\x6c\x54\x31\x47\x6e\xdb\x64\x70\x18\x74\x6d\x29\xa4\x8f\xc6\xce\x14\x65\xaf\x3f\xd0\x37\xb0\x47\xdd\x71\x43\x78\xe2\x8e\x76\xbb\xa7\xe6\xc4\x1c\x58\x0b\x55\xa6\xd0\x59\xd0\x98\x09\x5f\xe8\xa9\x9c\xd0\x85\x22\xcc\x20\x1f\x28\x90\x86\xc8\x7d\xc7\x09\x5f\x5c\xb1\x1e\x57\x33\x2c\xeb\x74\x63\xbf\x29\x7f\x9e\xa1\xbd\x36\xd4\x3d\xe8\xbd\x87\xa4\x0b\x77\x9a\x6b\x93\x44\x7b\x43\x3d\x1f\x26\x9e\xe3\x32\x1d\xd5\x44\x65\x99\x8a\xb4\x09\x7c\xa0\x2e\xf6\x7e\xc3\x2d\x31\x04\x54\x93\x3e\xfb\xf9\xcd\xeb\x04\x13\x07\x90\xcc\x86\x52\x93\xcc\x78\x3e\x93\xc8\xba\x1b\x28\xf5\xfe\x0b\x0a\x78\x42\xf9\x69\x94\x37\x22\x3a\x61\xaf\x8a\x49\x79\xb7\xcf\xd3\xd9\x1f\xf5\xfb\x21\xa4\x81\x26\xf2\x13\xfd\x44\x7d\x99\xde\x42\x3e\xee\x62\xb8\x18\xe9\x2f\xd3\xdb\x59\x57\xc5\x28\x17\xaa\x2e\xa6\xfa\x72\xaa\xe7\xd3\x04\x72\x68\xc3\xab\x2b\xa0\xbf\xf3\xd2\x85\x4a\x24\x98\x3f\x40\xea\xee\xe6\x0b\xa4\xa7\xa3\x16\x4e\x67\xa2\xf9\x8d\x1c\x97\x6b\xe9\x1c\x9b\xaa\xa6\x13\x3d\x5e\xc0\xfd\xf6\x09\xbe\x06\x39\xb9\xc5\xa7\xe1\x24\x6e\x13\xe4\xbe\xe6\xa0\xce\x09\x7a\xa5\xf3\xf9\xd8\x75\x92\x44\x4e\xbf\xe8\xe9\x4c\xf9\xd7\x8f\x9a\xef\x73\xcd\xbf\x1c\xcd\xc6\xbf\x0c\x17\xe3\x5f\x46\xf8\x7a\x10\x9c\x9d\x8f\xf4\xf0\x02\x7b\x32\x9c\xc1\x57\x3e\x8d\xdf\x8f\x17\xa3\x4b\x37\xfa\x20\xd7\x3b\xfe\x00\xef\xbc\x9c\x02\x09\x1f\x0e\x1a\x7d\xb3\x4b\xcb\x31\xe1\x4f\x7e\xaf\x59\xbe\x28\xd7\xdf\x99\x4a\xf1\x8e\x6b\xdc\x69\x20\xd1\x1c\x05\x82\xd1\x3a\x68\xa0\xcf\x91\xf7\x06\x12\x16\x48\x6a\x61\xb2\x2c\xe4\xd4\x3c\x65\xb9\x2c\x54\x61\xe0\x95\x3f\xb7\xf2\xc0\x1f\x9b\x70\x4a\x2d\x51\xfe\xe9\x11\x19\x86\x0e\x62\x1b\x31\xea\xf5\x4a\xde\xdf\x62\xcf\xbc\x55\xea\xc4\xf4\x3d\x6f\x44\x57\x98\x3d\x4b\x6b\x10\x5a\x39\x49\x07\x76\x90\xb8\x73\x61\x69\xea\x74\xdb\x6f\x30\xa6\xdf\xb0\x16\x98\x8a\xaa\xae\x70\xa8\x28\xc2\x07\xd2\x97\x88\x22\x2e\x48\x69\x1f\x4a\xca\x12\x26\x64\x45\x60\xf1\x40\xa9\x93\x65\x68\x94\x8f\x52\x8b\x9d\x4e\x68\x48\x2c\xd6\xeb\x3a\x4c\x1a\xbd\x50\xa1\xb1\x70\x50\xff\x58\x2b\xb0\xa4\x71\x26\x26\x0a\x7f\xb9\x88\x71\xa4\xcd\x80\xaf\x58\x14\xe2\xab\x34\xd4\x97\x4f\xa4\x6c\xe8\x98\x3b\x7a\x42\x22\xf8\x30\x1c\xba\x4a\x2a\x17\x30\xe8\x4e\x62\x13\x51\xdf\xee\x3e\x5d\xc2\x29\x98\x52\x52\xd9\x1c\x38\xe8\x08\x40\xea\x08\x4f\x88\xcb\x14\x4b\x11\x45\x4b\x43\xfc\xd4\x53\x6b\x9d\x98\x0a\x09\xf1\xf1\x69\x58\x08\x20\x80\xd3\x8a\x1a\xdd\x47\xd0\xc4\x53\xdf\xab\x8a\xad\x65\x59\x9d\x18\xca\x14\xa6\x5c\x15\x65\xfb\x3b\x1e\xa0\x5a\xfa\xaf\xa3\x28\x24\xa3\x5b\x3b\xd5\x60\x55\x8f\x9d\x77\x94\x84\xe8\x41\xac\xc0\xed\xb5\xd2\x22\x19\x0c\x41\xe2\x08\x24\x05\xe9\xf2\x5c\xdb\x6f\xf7\x66\x5f\xc1\xed\x63\xf3\xfd\x96\x50\x1f\x0a\xb1\x28\x3c\xc6\x20\x49\x08\x70\xe5\x3e\x5a\x01\x22\x55\x64\xeb\xfb\x62\x5d\x35\x49\x76\x75\x9a\x3f\x14\xd9\x43\x9a\xdf\x29\xee\x5f\xc8\xd2\xa7\xb9\xb0\xf8\xb6\x95\xcd\x1e\x2c\xa4\x1b\x8c\x7e\x48\x8b\x4c\x14\x24\xc6\x1a\x08\x6e\xad\xa5\x7d\x7d\x53\x54\x2d\xf8\x4e\xe1\xec\x38\x12\xa9\x37\xab\x95\xad\xaa\x88\xea\xb8\xaa\x8b\xd2\xdc\xe1\xb1\x53\xda\xba\x4c\xed\x83\xc9\x14\x0f\xee\x26\xd4\x43\xeb\x8d\xa5\x6a\x29\x92\xac\xdc\x40\x51\x12\x7c\x03\x92\x08\xe2\xa1\x27\x5c\x6d\x61\x72\x55\xe4\xa7\xa0\x9d\x4a\x8f\xec\x37\x4f\x4c\xd8\x40\xf8\x68\x48\xcd\x16\x79\x6d\xf3\xfa\x74\x6d\x77\x36\x5f\xbb\xc1\xa1\x73\x08\x4c\x4b\x6b\x49\x43\x70\x29\x18\xf1\x1a\x0d\xf1\xbf\x7f\x28\xb2\x3d\x2a\x40\xca\xb6\x51\x4e\xd0\x0d\x7f\xb1\xd1\xa5\xc9\xd7\xc5\x16\x60\x41\x7d\x0a\xb2\x9b\x9a\xc7\x89\x59\x9f\x68\x30\x48\x43\xe3\x58\x29\x86\x4a\xf3\xd0\xe8\xa8\xe8\xaf\xbd\x6a\x07\x7a\x98\xf3\xa2\x83\xcf\x46\xcb\x39\x24\xaa\x23\xbd\x23\x81\xce\x05\xca\x3d\xdd\x18\x5a\xda\x0a\x15\x21\x94\xb0\x20\x14\xa9\x97\x00\x9c\xcb\xbd\x73\x9f\x70\x8b\x3e\x98\x76\x75\x41\xb5\x1d\xb6\xa4\xf3\x9d\x58\x90\xa0\x9e\xee\x84\xb4\x2e\xd5\x93\xfb\x62\xd0\x77\x6b\x30\x95\x07\x5e\x7b\x25\x42\xf1\x04\xbc\x92\xed\xf1\x53\xe7\x73\x62\xed\x89\x5d\xa7\x26\xac\x8e\x50\x8b\x89\xcc\xcc\x54\x51\xd1\x42\xa7\x41\x9e\x85\x0a\xbc\xd7\xe4\x2a\x92\x1a\x23\x5f\x5d\x8a\x19\x16\xe8\x15\x54\x6d\x9a\x35\x39\xbf\xc3\x67\x10\x8f\x12\x93\x5c\x23\x8b\x76\x7e\x2a\x8e\x63\xaa\x7d\xaa\x74\x7c\xbe\x24\x61\xac\xc5\x23\x9b\x54\x0b\x18\x05\xa0\x3d\x0e\x80\x10\xbb\xa3\x63\xf5\xa8\xda\x4c\x5f\xff\xc0\x22\x53\x7e\x91\x8d\xe8\x58\xf3\xd7\x20\xb6\x84\x9d\xd4\x8b\xcb\xd3\xd9\xf4\x3a\xd1\x5b\x73\x97\xdb\x3a\x5d\xe9\xda\xec\xa8\xf1\xc5\x0e\x78\xcd\x14\x1f\x0f\xf0\xc5\xb0\x14\xe8\xac\x0a\xd5\x14\x4b\xdb\x58\x19\x59\x5a\xd5\x83\xbe\x58\xe6\x90\xb9\x8b\x0f\x42\xa4\x72\xf8\x91\xb5\x4e\x4d\xf5\xa5\x3b\x00\x77\xd6\xcb\xa2\xf8\xaa\x21\xdd\x79\x67\xfe\x9c\xe6\xb6\xd1\xbe\xa7\x97\xea\xb2\xef\x9c\x02\x3a\xbb\xa5\x83\xeb\x2e\x10\x00\x35\xb7\x24\x02\xa4\x73\xd0\xbc\x62\xdc\xec\xba\x97\x46\xa6\x41\xc3\xac\xab\xef\xed\x01\xef\x9c\x7d\x5d\xa5\x6b\xe4\x54\xac\x56\xc5\xce\x0e\xf4\x07\xa2\xdc\x30\x19\xa8\x81\x9f\x94\xfb\xdc\xad\xf5\x7e\x0b\xd9\x5f\x51\x15\x12\x9e\xfd\xce\x46\x64\x3c\x39\xe9\xea\xfa\xbd\xc0\xf5\x5b\x35\xb3\x55\xb4\x9e\xd4\x6c\x2c\x9b\x38\x70\x3c\xa4\x81\x86\x10\xaa\x84\xdc\xc1\x89\xd8\x29\x65\x9e\x30\x59\x4e\x1a\x2b\xf4\xde\xc0\xa9\xbc\xb4\x00\xe2\x5e\x03\xe1\x06\x75\x2e\xb2\x1a\x9c\x11\xb8\x22\x23\x70\x5f\xd5\x7a\x6b\x6d\x2d\xcd\xe7\x4e\x05\x05\x30\x5e\x44\x85\x10\x5b\x53\x9d\xe6\xb2\x33\x28\x08\x89\x41\x46\x43\x4b\xe9\xc7\xd3\xc7\x6b\x04\xae\x93\xa8\x9c\xa2\x50\x5b\xcb\x72\x83\xef\xb8\xa5\x63\x8b\x8d\x3e\xe9\xb9\x4f\x7c\x2e\xca\xaf\xbd\x3e\x5d\xc8\x44\x60\x87\xc4\x90\x6c\xa8\x47\x86\xad\x67\x00\xc4\xb4\x29\x3f\x01\x8e\x64\x53\xa2\x7a\xeb\x36\xcd\x6d\x5e\x2b\xae\x2d\xab\x6a\x02\xda\x70\x1f\x8f\x3e\xfe\xa7\x8a\x0e\x4f\x4e\x1f\xaf\x31\xaf\xac\xa0\x9a\x83\x38\xde\xc6\x79\x87\x22\x7b\xe7\xa3\x45\x6b\x7d\x9c\x4b\xf9\xf6\xb1\x90\xf3\x13\xcd\x42\x82\xff\x10\xbe\x03\x02\x39\x24\x85\x74\xff\x54\xf6\x74\x6b\xd2\x4c\x9b\xf5\x1a\xca\x5f\x4f\xd0\x80\xed\x27\x71\xfb\xc1\x43\x22\x32\x38\xe6\xbc\x84\xbe\xbc\xa3\x1b\xe8\xcb\xf1\x31\x5d\xda\xc0\x4c\x00\x11\x00\x5c\x01\xc8\xaa\x48\x91\xc1\xf2\xce\xdd\x88\x40\x79\x12\x6c\xeb\xd4\x56\x42\x78\x30\x86\x43\xd2\x1e\xc7\xd7\xe3\xac\xfb\x77\xa2\xac\x21\x80\xb3\xcd\x5a\xe8\x26\x0b\x3d\xeb\xec\x80\x92\xd7\xe5\x3e\x0f\x23\x4c\x69\xf4\xb4\x06\x62\x09\x98\x20\xcf\x2c\x01\x0f\x86\x6b\x08\x48\x0d\x3c\x20\x39\x41\x4d\xb0\x14\xa9\x09\x88\xc5\xc4\xd9\x60\x26\xcf\x8b\x7d\xbe\x22\xec\x41\x40\x34\xe6\x8d\xf0\x5a\x5c\xc5\x48\x9a\xf6\x72\x5a\x61\xa9\x2b\x38\x83\x82\x84\xfa\x49\x51\x6a\x9b\x01\xc7\x87\x39\x44\x0b\x93\xee\x72\x37\xcc\xf4\xe1\xfe\x40\xcf\x11\x33\xe7\x1e\xaa\x60\x96\x40\xef\x99\xf5\xfe\x51\x22\x83\xea\x2d\x23\xd9\x6c\xdf\xf3\x88\x72\x52\x6a\x4a\xa8\xa6\xf7\x0b\xcb\xc6\xc2\x3c\xc2\x11\x58\x72\x05\xec\x43\x6a\x1f\x7d\xcc\xb4\xe5\x34\xfb\x5b\xc6\x7b\xcf\xee\xbd\x03\x7d\xe2\x55\x4a\xab\xb7\x1c\x51\x15\xa7\xa9\x94\x28\x47\x5c\x3b\x4d\x3d\x4c\x49\xa5\xc2\x9c\x10\x93\x87\x1b\x7f\x39\x33\x68\x95\xd5\x14\x2d\xf8\xf7\xbd\x45\x85\x0e\x03\x4d\x4f\x34\x1b\xd5\xa9\x9b\x50\xdd\x1b\x7a\xf9\xec\x24\x8c\x4d\x83\xce\xa0\xb5\x18\x00\xd1\x83\x13\x1a\x86\x51\x79\x93\x79\x95\x96\xab\xfd\xb6\xaa\x81\x2d\xe3\x5d\xab\x8f\x58\x96\xda\xd1\x55\xbe\xc4\x55\xdc\xe7\xce\x6e\xc6\xad\xc5\xcb\xac\xd9\xe2\xc6\x9a\x1d\xf4\x61\x6f\x3d\x88\xad\x1d\x2b\x73\xc0\xd3\xfc\x6c\x09\xb2\xd1\x12\xc1\x67\x6b\x84\xee\xa1\xb2\x1a\x5b\x9c\x32\x70\x91\xe8\xb5\xcd\x52\xa4\x51\x01\x8f\xe9\x87\x4a\x9e\x61\x18\xb8\xea\xb9\xa9\xe2\x82\x0e\x32\x5c\x94\x81\xd7\x69\x07\x01\xe4\x12\x1f\xb4\xd5\x32\x1f\x00\x7a\x24\xe6\xab\x73\x4c\xa2\x1c\x33\x32\x3d\x74\xe9\xa5\x60\x7c\xbf\x53\x9b\x86\x58\x9f\xb2\x0c\xe7\xf6\xc7\x34\x53\x12\x8d\xfa\x2f\xf9\x41\x96\x77\x78\xd9\x57\xb5\xf6\x1c\xe7\x78\xad\xd0\xe7\xe1\x0d\x10\x2d\xae\x70\x8c\x42\xa9\x1c\x11\xb2\x1a\x6f\x42\xa5\x79\x55\x9b\x2c\x33\x32\x1b\x22\x7a\xe4\x5a\xd8\x45\xfb\x1a\x6d\x44\x2a\xb9\x26\x15\x16\xf4\x98\x60\x25\xd1\xd2\x93\x46\xf6\x49\x9a\x73\x7c\x99\x06\xa1\x28\xa5\xb0\x51\x3f\x3c\xba\xa9\xee\xa2\x4e\x88\x4d\xb6\x4c\xf4\x57\x5b\xe6\x96\x0a\xff\x80\xf4\xd6\xdb\x65\x3f\xaa\xfd\xa2\xca\xbd\x1b\x60\x7f\x81\xc2\xa1\xd7\x38\xdd\xe4\x34\x49\x2f\x0c\xfb\x99\x06\x5b\x42\xa5\x35\x73\xdc\x61\xe1\xa2\xd0\x68\x74\x3b\xe5\xe1\x18\xd1\xef\x63\x99\xd6\xb5\x85\x58\x37\x6c\x34\xbb\x0e\x38\x6a\xf2\x89\xa2\xa1\x26\xb4\xbe\xff\x4c\x74\xf7\xd3\xb8\x1a\xff\xd4\xae\xc3\x14\xb9\xe5\x85\x15\xc3\x1f\x4e\xf3\x35\x9b\xd2\xde\xd3\xe3\x43\x21\x12\x78\x6e\x9c\xe7\xe1\xfb\x55\x5d\x22\x95\x7e\x05\x79\x3a\xe8\x10\x55\x33\x3d\x0b\x47\x1e\x3b\x8c\x32\x2e\x74\xe5\xed\x5c\xb4\x2a\xa4\x04\x12\x6e\x7c\x18\xc5\x34\xc4\x24\xc1\xdf\xd9\x12\xff\xec\xc1\x57\x3a\x44\x31\xdd\x82\xe1\xae\x01\x5b\xcd\x15\x51\xbc\xd4\x1b\x90\x7b\x24\x29\xc2\x1a\x85\x26\xb4\x5b\xea\x3f\xc6\x64\xc6\x1c\xc7\x5b\x1e\x42\x55\x39\x2c\xb6\x7f\xdf\xa7\x0f\x26\x73\x83\x2c\xd8\x83\xa0\xdf\xc8\x8a\xa8\xd7\xb6\x4a\xef\x72\xd8\xd5\xbb\xcc\xa0\x5e\x98\x5b\x0d\xfc\x94\xf0\x04\x6d\x02\x1b\x0f\x3c\xa1\x75\x8c\xb0\x45\x0c\xf7\x06\x3c\x0d\xf3\x73\x50\x26\xd8\x81\x53\x8f\x4f\x5b\x2b\x34\xbe\x63\x23\x8b\x1d\x29\xb7\xf0\x2d\x28\x75\xb7\x9b\x80\x02\x4e\x06\x72\xc4\x7e\xbd\x8a\x21\x0a\x84\x34\x90\xbb\xf7\x0e\x1b\x12\xff\x0f\x94\x9a\x78\xe0\xa9\x7b\x1d\x4f\x47\x23\xb8\x63\xbb\xc0\xae\x0d\x82\xa9\x81\x92\x2b\xc4\x35\x33\xa1\xf8\x75\x22\xc8\xe1\x12\x1d\xe3\x8a\x3a\xdf\xa2\xc2\x5b\x7c\x84\x4c\xb8\xc3\x57\x2c\x95\x30\x74\xc7\x73\x5d\xdb\xed\xae\x96\xa4\x69\x45\xfc\x76\x25\xa8\xe9\x8e\xbf\x3c\xad\xf4\x43\x91\xae\xb9\x8c\x27\xcb\x62\x52\xf3\x50\x9c\xa0\xc0\x54\x6f\xd7\x31\xf8\x56\xf9\xd2\x02\x9e\xc7\xc7\xfb\x02\x3d\x00\x1f\x30\xc4\x90\x3c\x04\x76\x39\x79\x02\xab\x08\xb4\x3a\x5a\x8f\xc4\xe6\xb8\x51\x65\xfd\x8b\x54\x62\x84\xb9\x61\x6b\x55\x15\x1e\x2c\x80\x39\x59\x6a\x00\xd6\x30\x39\xcf\x6e\xb3\xcf\x32\x51\x2f\xe8\x09\x2c\xa6\xb0\x87\x1b\xe1\x7e\x32\xde\x9b\xce\xbf\x3b\x51\xba\x9d\xe8\xe0\x8a\x43\x64\x9d\xc8\x2c\x30\x57\x9d\x5a\x3c\x9b\xb0\xdc\xdb\x54\xce\x46\xf7\x19\x26\x80\xc9\xaf\xd7\x78\xa9\xef\xb2\x74\x95\xd6\xfa\xce\x16\x90\x35\x77\xe3\x1f\xb7\x21\xe8\x1c\xa8\x50\x3b\x54\x53\x52\x99\xde\x95\xb8\xcb\x29\x26\xc8\xa4\x08\x4a\x28\xae\x40\xdf\x1e\xd3\x9d\xdb\x22\xbf\x53\xfe\xdb\x1a\x91\x2c\x7b\x4f\xdb\x8d\xa8\x74\x2c\x29\x37\x15\xa9\x0b\x4a\x2b\xb9\x28\x77\x45\x69\x98\x84\x53\xb4\xd0\x59\xa9\x1b\x71\x54\xc3\xdf\x97\xc5\xba\x75\x3d\xf8\xa2\x60\xa1\x40\x40\xd2\xb5\x5d\x45\xbe\x8b\x29\x64\x02\xb1\xca\x37\xe9\xb5\x04\x6c\x21\xa1\x88\x72\x6a\xb2\xca\xf8\x03\xd5\xf4\xd1\x23\x9b\x95\xbe\xa3\x4b\xa1\x9b\xf6\x3d\xb1\x34\x25\xc4\xd2\x9e\x56\xbb\x85\xb4\xe4\xf7\xca\x79\x15\x29\xdd\xca\xba\x60\x4a\x06\xcf\x2e\xe1\xf3\x5c\x7a\x38\xc0\xb2\xc4\xc9\x62\x3c\x1b\xe9\xd9\x78\xfe\x47\x3d\x9c\xb3\xea\xee\x3f\xdf\x0e\xa1\xe0\xd4\x3d\xec\x66\x34\xfb\x30\x9d\x5d\x87\xac\x72\x34\x94\x20\x3d\xfb\x65\x7a\x3b\xd0\xf3\x4f\xd3\xdb\xab\xcb\xe8\xef\x6e\x9c\x47\xfa\x72\xf4\x61\x74\xb1\x18\xff\x32\xc2\x94\xf5\x70\x3e\xbf\xbd\xc6\xbc\xe9\xc5\x74\x0e\x8d\x1b\x5e\x5d\xe9\xc9\xe8\x62\x34\x9f\x0f\x67\x5f\x34\xca\x9c\xc1\x78\xcd\x46\x37\xc3\xf1\x0c\x6b\x49\x67\x33\x54\xbb\x75\x7b\x4a\xa8\xbd\xdd\x4e\xae\xdc\x78\x10\x55\x18\xa8\xdd\x0d\x6f\x6e\xae\xc6\x17\x20\xe4\x76\x35\xfc\x0c\xea\xbd\x1f\x67\x23\x9c\xee\xf1\x44\x7f\x9e\x8d\x17\x58\x7d\x7a\x75\x45\x44\xce\xd3\x59\x42\x22\xbf\x94\xac\xc6\x81\xfa\xfc\x69\xaa\xaf\x87\x9c\xb3\x77\xe3\xff\x6c\x3a\xd3\xb3\x51\x77\xfa\x57\x0d\xe7\x98\xc7\x5e\xb8\xa9\x1d\xbe\x9f\xfe\x32\x4a\x84\x2c\x30\xad\x35\x37\x71\x54\xb6\x29\xe5\x8f\xdd\xab\xa9\x7a\x33\x08\xcb\xa9\x50\x64\x7b\xbc\x9e\x96\x0b\x54\xdb\x55\xa9\xe3\x09\xaf\x9c\xc5\x14\x94\xd5\x22\x84\xc1\x93\xd2\xcb\x2c\x30\x77\x39\x5c\x0c\x01\xa8\xe0\xfe\xff\xfd\xc8\x7d\x7a\x36\x9a\x5c\x8e\x66\xa3\x4b\x35\x9e\x0c\x2f\x2e\x6e\x67\xc3\x05\xbc\xcc\x7d\x63\x34\xd7\xf3\xdb\xf9\x62\x38\x9e\xe0\x44\xb8\xfe\xc2\x56\xe1\xb5\x47\xd5\xec\x43\xfd\x61\x38\xbe\xba\x9d\xf1\x82\x52\xdc\xa8\xc5\x54\x4f\x6f\x46\xf0\x48\x58\x58\x62\x42\xf0\x13\xf3\x7e\xa8\x8f\x85\x0a\x58\x94\x68\xf6\x35\xbb\x0a\x27\xee\xd3\x70\xae\xdf\x8f\x46\x93\x5f\x5d\x43\xfb\x7a\xa0\x3f\x82\x22\x76\x36\x68\xe0\x7f\x7e\xb4\xc4\xa2\x0d\xfe\x4b\xb4\x3f\x60\xd5\xea\xbe\x00\x5f\x79\xe3\xbe\xac\x4b\xe7\x31\x0d\x42\xb5\xae\x29\xeb\x76\xf0\xa0\xd2\x9b\x62\x9f\x73\x54\x1c\x93\xad\x9b\x2c\x5d\xd5\xc1\x54\x81\xea\x5c\xf0\x5b\xe0\x11\xbe\x04\x36\x45\x00\x90\xa5\xbb\x24\xad\x81\x86\xc6\xac\x2d\xc4\x43\x51\xf7\xc9\xd7\xb4\x35\x9e\x47\x9c\x6f\x82\x5b\xac\x6a\x9a\xbb\xfe\x3d\x58\x0b\x0c\x85\x29\xce\xab\x8c\x41\x33\x1f\x61\xd4\xb0\x60\x09\xc9\x96\x1a\x17\x5e\xac\xbf\x3a\x1b\x61\xbd\xf6\xe8\x52\xf1\x39\x45\xbe\x07\x0a\x38\xed\xf3\x14\x22\x10\xe6\x0e\xca\xf0\x3a\xab\x54\xc4\x2b\xdd\x27\x4b\xab\x90\x38\xb1\x99\xec\xe1\xab\x14\xae\xa4\xf8\xc1\x49\x23\x48\x0c\x40\xc3\xb7\xfe\x3a\x6f\xb4\x82\x4a\xdb\x2e\xad\x1b\x27\x66\xc7\xbc\x44\x7e\x16\x7d\xd2\xbb\x9c\x5e\xf6\xfa\x49\x13\x5e\x00\x1c\x84\xb1\xf8\xbf\xeb\xe2\x2a\x33\x55\x85\x31\x4e\x53\xe9\x9e\x80\x48\x79\xcc\x19\x07\x0c\x48\xde\x4b\x64\x90\x5a\x1f\x89\x5f\xd0\xe3\xe0\x36\x86\x09\x01\xca\xb7\xdb\x97\xd5\xde\x20\x37\xe5\xe5\x87\xe1\x2c\x94\xec\x9e\xbf\x19\xbc\x39\x7f\x7e\x8e\x0d\x17\x63\x9a\x56\xba\x7b\x3c\xc1\x23\x6f\x75\x2a\xcd\x55\x9b\x61\xfa\x48\xcc\x73\xa0\x8f\x0e\x30\x92\x2a\x41\x4a\xe5\x72\x7a\xd9\x1a\xcd\x8e\x17\x3f\x39\x9a\xed\xa1\x6a\x8d\x66\x7b\xc0\x9f\x1a\x4d\xd5\x1a\x4d\x31\x98\xfa\xec\x7c\x70\x7e\xf6\xe3\x43\xa9\x8e\x0d\x65\x07\x59\xf7\xb1\xa1\xfc\xdf\x56\x26\x30\x78\x36\xff\x38\x3e\x7d\x7f\x7a\x36\x38\xfb\xab\x55\x00\x3c\x8d\xff\x7f\xf1\xf2\xec\xf5\xeb\x56\xfd\xcf\x8b\x57\xbf\xe1\xff\xff\x16\x3f\xf3\x8f\x63\xfd\x61\x36\x1a\x05\x15\x64\x06\x1a\xbe\x17\xf8\xff\xb3\xc1\x99\x7e\x7e\xfe\xec\xfc\xfc\xd9\xf9\xf3\xe7\xcf\xfb\x1d\x7a\x8b\x03\xa5\xdc\x87\x7a\x43\xaf\x7f\xa4\x27\x18\xe2\xbe\xf1\x44\x9e\x8c\x35\x8d\xa8\xb6\xb1\xae\x94\xa9\x3e\x4d\xe5\x2e\x0d\x6b\x4a\x16\x5b\xa3\x87\xa4\xb9\x9e\xb2\x62\xe2\x45\xb1\xb6\x22\xf5\x70\x6f\x0d\xb8\x61\x4f\xbe\x7a\xd0\x73\xed\x3b\xd7\xbd\x0b\x8a\x6a\xb9\x87\x48\xae\xff\xf8\xe9\x45\xa9\xaf\xe3\x12\xa3\x82\x49\x26\x3d\x4f\x84\xa2\x94\x23\xf4\xfc\x85\xee\x7d\x22\x3e\x88\x48\x38\xe1\xfe\x50\xa1\x17\x69\x03\x38\x04\x19\x17\x2b\x9d\xe6\xbb\x3d\x32\xe7\xae\x6c\xe5\xfc\x69\xfc\x05\xa4\xfb\xb9\x7a\x1d\x6a\x2f\x99\x7a\xc7\x7d\x0c\x92\xe2\xe4\x0a\x93\x0d\x50\x51\xd2\x19\x1a\xf2\x52\xf7\xae\x4c\x79\x67\x4b\xcc\x81\x72\x5b\x08\xed\x4e\xc1\xcc\x65\x9a\x03\x30\x37\x0c\x05\x04\x23\x51\xd2\xab\xe2\x5c\x2a\x66\x5e\x20\xca\x03\x0a\x73\x0d\x43\xee\xc8\xf9\xa9\xce\x06\xaf\x18\x33\x6d\x96\x99\x1f\x0e\x4a\x41\xd7\xb2\x14\x1e\x62\x3e\x89\xe7\x1a\x31\xdf\x24\xd7\xc8\xae\xa8\x80\x45\x29\x51\x8c\x82\x93\xe4\xee\x0d\x31\x16\x24\x4d\x2e\x4a\x41\xae\x09\xca\xe1\x98\xd3\x48\x34\x61\x6f\x94\x84\x82\x62\x1c\x65\x55\xe4\x0f\xf6\x20\xe3\x80\x48\x7e\x7a\x36\x78\xed\x05\x31\xc3\x42\x49\xc3\xe5\x02\x5d\x7d\xa3\x8f\x68\x5d\x34\x65\x32\xaf\x22\xb1\x0b\xb7\xeb\xbc\x58\x9c\x57\xb5\x50\xdd\xaa\x16\xad\xa5\xe9\x3a\x13\x2d\xcf\x88\x4e\x7d\xfe\x71\x0c\xe1\x9d\xc6\x72\xd5\x72\xb9\xfe\x4e\xf7\xa2\x07\xc8\x35\xeb\x39\xf0\x91\xb4\x89\xcb\x31\x44\xb0\x11\x4b\x61\x20\x8c\xaf\x30\xfe\xbb\x2f\xfd\x8c\x74\xb6\x76\x57\xda\x87\xb4\xd8\x57\x71\xb3\x07\x48\x50\x4b\xeb\x50\x5d\x50\x5c\xb5\xb4\x00\xb2\xa7\xdc\x70\x65\x4b\xc2\x90\x52\xba\xc3\x44\x0f\xd1\x69\xf5\x56\xa9\x21\x45\xe4\x44\xd3\x29\x2b\x59\x93\x46\xbc\x36\x98\x54\x17\x08\xa6\xb8\xa5\xb8\xa7\xd4\x77\x7b\xff\xf4\x33\x8f\x74\x54\xa9\xf7\xd8\xc2\xdc\x3e\x8a\xe4\xbe\x07\x3a\xc4\x8e\x4c\xc7\x20\x1e\x7d\xee\xd9\xe0\x67\xdd\xc3\xe3\x4e\x4e\x62\x7e\xe4\xd8\x2c\xca\x68\xdb\x27\x48\x54\x82\xbb\x44\x2d\x0f\x94\x1e\x6a\xf1\x7a\xb5\xb6\xf8\xd9\x73\xdd\x8b\x9e\xec\xcf\xf6\x38\x7d\xd2\x36\x06\xe1\x2f\x0c\x81\xc3\xb2\x9c\x25\x62\x89\x9a\xd1\x6d\x3a\xc4\x7d\x62\x72\x79\xd0\xa3\x6f\x00\xf9\xd4\x43\xd7\xee\xe8\xfd\x44\x1c\xb6\x5b\x3b\x5f\x06\x0c\x41\xe0\x28\xc3\xec\x23\xe3\xbd\x77\x76\x05\x83\x07\x51\x55\xa4\x42\xc2\xde\x9c\xe9\x2e\xb5\x16\x48\x8f\x3c\xa4\x6b\xa6\xd3\xa4\xa2\x7c\x62\x25\x12\x54\xfc\x32\x24\x9b\x10\x19\xea\x76\x97\x41\xda\xa3\x89\x40\xe7\x63\xb3\x11\xc8\x83\xe7\x6f\xf6\xb0\x93\x42\x15\x88\x6a\x78\xb5\xd5\xbe\xc9\x11\xa4\x7f\x87\x49\x49\xd1\x34\x88\x41\xca\xfe\x30\x30\x57\x09\x4e\x25\xbf\xfe\xca\x22\xab\x12\xcc\xf7\xc0\x7f\x64\x30\xd2\x09\x61\x6f\xf0\x5d\xce\xba\x47\xd4\x26\xe4\x13\x81\x12\xd8\x3f\x1f\xdf\xef\x51\x78\x7c\x21\x84\x3c\x65\x42\x52\xc5\x45\xd6\x43\xb4\x1c\xb7\x01\xc7\xf9\xc4\xf4\x21\x3f\xba\x2b\x1e\x6d\x99\x10\xd4\x59\xc2\x97\x13\x24\xd0\xe0\x5f\x6f\x4d\x6e\xee\x88\x39\x08\x1f\x04\x8d\x3d\x59\xf6\x75\xf1\x98\xdb\xb2\xba\x4f\x77\x0a\x8e\x8b\x4d\x0d\xa2\x31\x2b\x00\xb0\xbe\x7a\xfe\xff\x00\x28\x1a\x68\x13\x38\x6f\xb8\xaf\x41\xfb\x02\x29\x81\x4d\x89\x3c\xec\x4b\x9b\xdb\x4d\x0a\xbe\x4c\xf4\x40\xf1\x46\x5c\x35\xe7\x62\x94\x7f\xcd\xe9\x6f\xa4\xb6\xc1\xbd\xa9\x55\xa7\x44\xea\x5f\x7e\x0b\x28\xba\x05\x3a\x8c\x16\x71\x0b\xf0\x35\x77\xf6\x42\xf7\xe6\x1f\xc7\xdc\xf0\x79\x9a\xa5\xab\x22\xd7\x1f\x31\x02\x5e\x71\xd1\xf7\xd9\xe0\xec\x25\x7c\xf0\xd7\xde\x73\x8d\xb2\xb5\xa6\x42\x8d\x47\xfc\xf3\x2a\x47\x85\x68\xb7\x89\x1a\x49\x81\xf3\xc1\x19\x3c\x30\xfa\xe0\xe0\x69\x05\x1e\x99\xb4\xf4\x38\x7d\x45\x38\xfd\x4e\x5a\x5c\x66\x34\x65\xc2\xf7\xf5\xbe\xf4\xa9\xab\x6e\x36\x94\x5d\x59\xd4\x7c\xc4\xa4\xf9\x3d\xd6\x85\xd2\x79\xd6\x38\xa3\x5c\xf3\xe3\x9a\x16\x29\xfc\x13\x94\x7e\x94\x54\xfa\x49\x62\x45\xa0\x20\xcd\x8c\xd9\xe6\x28\xe4\x82\x6a\x63\xbc\x6b\x09\x4a\x54\xa9\xd6\xac\x24\xb1\x26\x93\x48\x4d\xf9\x32\x8f\x96\x3c\x93\xbb\x02\x13\x74\xd8\x63\x6a\xe5\x40\x79\x97\x08\xc0\xd3\x9a\x39\x5e\x3b\x6e\x34\xbe\x6c\xbf\x67\xc8\x04\xe6\x7e\x50\x9e\xab\xfc\x25\x69\xb4\xb0\x72\x91\x76\x1e\x50\x67\xc4\xc1\x97\x1f\xe4\x42\xa4\x95\x96\x74\x89\x44\xb7\x75\x91\x36\xce\xaa\x11\x22\xd1\x6d\x8d\x68\xa9\x8d\xd4\xd9\xb1\xf6\xde\x54\x8d\x8e\x0d\xe4\xc4\x93\x3f\x50\x7f\x4f\x18\x83\x8b\x75\x97\x04\x19\xaa\x01\xa8\x22\x6b\x9d\xcd\xa6\x28\x01\xac\x93\x16\x39\xd5\x45\x78\x12\xe3\x2e\xed\x21\x15\x09\x2e\x45\x0e\x41\x53\x4d\x49\x92\x25\x37\x0c\x30\x54\x55\x3a\x22\xa1\x14\x7d\xf6\x3f\x5f\x42\x29\x30\x1e\xe9\xf3\xc1\x19\xac\x81\x86\xaa\x92\x3a\xaa\xaa\x14\x95\xad\xb4\x1a\x4b\x5c\x3d\xf2\x6d\x4a\x06\x5e\xe9\x1a\x0e\x07\x22\x1c\x19\x92\x55\x1b\x66\x4e\x7e\x60\xd9\x5c\x15\xae\x91\xcd\x25\x5f\x94\x2d\x36\xc2\xd6\x1a\x6b\xec\x9a\xbc\xa8\x5b\x0b\xcc\x9d\x97\xe7\x62\x95\xfd\x07\x4e\x4d\x15\x55\x37\x3d\x79\x6a\xb6\x44\x86\xe8\x98\x83\xbd\xec\xfc\x2f\x3f\x11\x42\xfa\xc0\x1c\xd3\x38\x3b\x7a\xf2\x21\x62\xce\x3d\xac\x75\x01\xff\xf8\x2e\x8f\xa4\xe0\xd5\x7f\xc6\x2e\x6f\xde\xc0\x30\x09\x2f\xdc\x3a\xe2\x11\x75\xa6\x12\x07\x0a\xf4\x78\xbb\x43\xca\x71\xc9\x35\xde\x22\xf8\x0b\x2b\x1c\x6e\x40\x60\xf4\x1a\x9c\x7b\x88\x86\xa0\xdc\xad\x0b\xa0\xd6\xb2\x51\xe8\xd3\xbf\x8d\x8f\x88\xec\xae\x28\xd3\xfa\x7e\x5b\x29\xbb\x5d\x16\x6b\x41\xb0\xf7\xeb\x1d\x4d\x2d\x40\x1e\x32\xdb\xed\xae\xeb\x17\x83\x33\x3d\xb3\x35\x1e\x46\xc0\xa3\x05\xf6\xfc\xb3\x0b\xc2\x00\xf9\xe0\xf5\x22\x84\x79\xa2\x8a\x4c\x6f\xec\x27\x8a\x0a\xbf\x59\x3c\x64\x55\xe4\xd5\x2e\x5d\xed\x8b\x7d\x05\xa0\x5e\x52\xf9\x08\x0a\x0b\x6b\xae\x2a\x84\x15\x9c\x65\x12\xc4\xca\x20\x55\x79\xda\xa1\x0d\x1b\x7d\x24\xa8\x6e\xc8\x43\xb1\x43\x8b\x5d\x89\x30\x15\xa2\xca\x20\x80\xe5\x3e\x8b\x32\x0b\xc2\xdf\x03\x9f\x82\xc9\x09\x6a\xfb\xad\x26\x04\xb1\x3b\x3c\x52\x9b\xad\xdf\x39\x3f\x48\x80\x8e\x50\xef\x50\xbc\x00\xd1\xc0\x9d\x80\xd9\xc6\xbb\xe9\xac\x56\x71\x2c\x1c\x0e\x97\xcc\xfd\xa5\x34\x99\x46\x91\x57\xf7\xf8\x0e\xa2\x4c\xc9\x25\x19\xb9\xe8\xa8\xdd\x48\x8e\x1b\xba\xb5\x4f\x85\xde\xb8\x76\x0d\x4e\x8c\xec\x40\x4d\xac\x54\xe7\xa2\x0b\xb0\x3c\x28\xfe\xf9\x8f\x4f\xac\x5b\x87\xe7\x7a\x98\xd5\xb6\xcc\xd1\x98\xf1\xeb\xee\x26\x2a\x81\x8b\xb8\xbc\x3b\x5d\x60\xab\x3a\x4f\x49\x79\xe8\x6d\xcd\x01\xe0\x1f\x8c\x85\xe1\x92\xa4\xb5\x2d\x8b\x3b\x6f\x46\xba\x23\x15\x6f\x86\x30\xda\x54\x73\x48\xc7\x71\xc3\x6c\x7c\x02\xa2\x48\x96\x94\x58\x33\xe4\x3d\x9e\x20\x91\x65\xb4\x7c\xf1\xca\x3a\x39\xeb\xc7\x90\x79\x7d\x72\xde\x0f\xf2\xfb\x0a\x65\x68\x56\x26\x6b\xd5\xcf\x2c\xf7\x58\x1b\x05\xf0\x95\x58\x1b\x98\x30\x63\x9e\x1f\x38\x15\x7a\x12\xab\xcc\x94\xe9\xe6\x10\x2f\x32\x40\xfc\x73\xb5\x0b\x8a\xdc\x44\x47\xcd\x3b\x3e\x65\x4f\x5e\xc8\xc6\x15\x9b\xe8\x31\x20\x66\x06\x31\x51\x59\x9a\x06\xd3\xd4\xe2\x68\x91\x53\xd6\x2e\x70\xf3\x12\xa2\xf0\xe5\x60\x14\xa4\x95\x37\x30\x5e\xc0\x14\x79\x82\xc5\x97\x89\x7e\x9d\xe8\x37\x89\x3e\x7b\x9e\xe8\xb3\x73\x74\xfc\xcf\x5e\x24\x0c\x3d\x85\x07\x31\x2a\x4d\xf2\x99\x42\x98\x72\x67\xcb\xca\x0a\x05\x44\x72\x93\x68\x85\x29\xa2\xf5\x0d\xf9\xbd\xb0\xc8\x80\x54\x12\x10\xc9\x7b\x42\x42\x7a\x8c\x99\x74\xb5\x44\x77\x05\xa9\x2d\x96\xf5\x98\xaf\x50\x16\x6e\x96\x55\x91\xed\x6b\x9b\xb9\x0b\xdc\x9d\x1b\x5e\x7d\x8b\x34\x8e\xb0\x39\x52\x7f\x4b\xb5\x06\x53\xaa\x6f\xc5\x6c\xb4\x60\xbc\x27\x52\x77\x0b\x2c\xdf\x31\x6c\x31\xbb\xdd\xdd\x9b\x2a\xfd\x73\x98\x83\x38\x7f\x6f\x3c\x1d\xbd\xbf\xf5\xc1\xf5\x28\xed\x9d\x29\xd7\x19\x52\xe7\x47\x33\xe7\x0e\x4b\x65\xb7\xbb\xac\x38\x34\x5b\x72\x4c\xaf\xd7\xcf\xec\xe0\xbc\xb1\x8d\xdd\xf1\xc7\x4b\xce\xaf\x76\x46\xcc\xb5\xc2\x6a\x6d\x93\x8c\xdd\x2c\x53\xb1\x26\x20\x1f\x80\x0a\xaa\xb0\x04\x7d\xaf\xbb\x47\x1b\x04\x04\x70\x6c\xbd\x60\xdd\x91\xfa\x30\xe8\x50\x6f\xf4\xec\xc4\x5e\xd6\x07\x9e\xc4\xe9\x79\xaf\x54\xa4\xd2\x7c\xb5\x2f\x4b\xe1\x53\x05\x05\x09\xae\x5e\x44\xcb\x5d\x1c\x92\xf1\x6e\x08\xe2\x97\x28\xf2\x31\x50\xea\xe5\x40\x2f\x08\xfe\x07\xb6\xf2\xa2\xa3\xce\xae\x0b\x69\x4b\xf4\xab\xa9\x24\x9b\x56\x31\xde\x31\x95\x8b\x7d\x59\x5a\xb3\xba\x27\x81\x0c\xf7\x0d\x8a\xd3\xc3\x3b\x98\x9e\x3a\x70\x49\x2b\xfc\x3c\x09\x7e\xe9\x17\xcf\xf5\xda\x1c\x7c\x46\x03\x2f\x2b\xa9\x17\xdc\xe1\xf8\x50\x6c\x92\x88\x3d\x05\xc5\x28\xfa\x15\xc4\x9b\xec\xdb\x13\x29\xd4\xca\x23\xc6\x2c\x2b\x49\x2d\xed\xec\xb7\x66\xe6\x04\x86\x3d\x34\x67\x20\x6f\x4d\xd7\x8c\x84\x62\x41\x69\xa9\x73\x53\xef\x4b\x4b\x26\x10\xa2\x2a\xc1\x56\x40\x42\xf9\xa5\x3d\x14\x34\xe6\x4f\xb6\x29\xea\xc2\x40\xa9\x57\xe0\xe4\x2c\x4a\xb3\xb6\x5b\x53\x7e\xd5\xd3\x92\xf1\x98\x08\xd2\x8d\xa7\xd5\x57\x89\xde\x51\x88\xe6\x10\xa8\x43\xdf\x42\xa9\x1d\xac\x25\x8e\xf4\x1a\x70\xd6\x7d\xe0\x3c\x8e\x3b\xe7\xee\x10\x44\xcd\x5f\x7f\xf8\x79\x1a\xda\xc0\x72\xdd\x4d\xf6\x1a\x16\x92\x29\x9d\xa9\xde\xe0\x94\xd5\x82\x53\x56\x05\x83\xbe\x59\xa7\xd8\x6c\xd4\x3b\x52\x4c\x77\x13\xeb\x46\x84\x8a\xe2\x6a\x1e\x1d\x25\x08\x0f\x60\xb4\x1e\xef\x4d\x5d\x15\x88\xb8\x15\xc2\x90\x74\xe7\x07\x24\x66\xe4\x3b\x23\x21\xf5\xa6\x11\x32\xb5\xf9\xba\x28\x2b\xcb\xe8\x9b\x5d\x59\x6c\x0b\x9e\x42\x2a\x2a\xf6\x85\x90\xad\x21\x55\x38\xa4\xfc\xe2\x5d\x99\x16\xa5\xc7\x7d\x0a\xea\x2f\xb4\x39\xde\x41\xb4\x34\xf5\x5d\x4d\x6b\x74\x1d\x8a\x32\x0e\x77\x76\xd8\x21\x78\x11\xd0\xb4\x61\xa5\x42\x9d\x6e\x3d\xcc\x97\x4a\x41\xe1\x90\x0f\xdc\x6d\xdd\x86\xde\x13\x2c\xbe\xed\xdb\x45\x70\xf8\xbe\x1e\xe8\x8b\x86\x65\x76\x65\x1e\xab\x77\x7a\x52\xe4\xa7\xe3\x48\xd2\x0a\x94\xd8\xe0\xfb\x0f\xa6\x84\xe4\x89\x77\x33\x51\x9d\x44\x95\xf6\x6e\x9f\x79\x12\xc9\x7c\x4d\xa6\x77\x0a\xd2\x82\x6b\x10\xb4\x8b\xbc\xab\x75\x5a\xed\x8a\x2a\x44\x65\xa2\x25\xad\x9e\x5c\x02\xf6\x9b\xf3\x32\xdd\xf5\x75\xca\xff\x24\x25\xd0\xa2\xf4\x81\x78\x12\x4d\x91\xcd\x52\x5d\xcd\x4a\x3c\x82\x6b\x30\x1f\x50\x62\xd6\xb3\xc4\x73\x9c\xc3\xc3\x91\x31\x94\xca\x27\x38\x24\xd8\xb6\x29\xd4\x8c\xa3\x7a\x2e\x70\xcf\x23\xf2\xbe\x58\x5a\xba\x0c\xda\x2d\xe9\x1c\xa0\x81\x8a\x6f\x4d\x37\xad\xc2\x5a\x6d\x1f\xac\xee\x94\x20\x13\xfe\xd1\x04\x11\xb2\x4a\x9f\x30\x57\x89\x42\x15\x01\x66\x96\x4e\xb3\x03\x2e\xd4\x27\xe5\x87\xe9\x1e\xfb\x9a\x22\x6f\x87\x3f\x53\x54\x93\xaf\x8d\x16\x7f\x3f\xbe\x58\xbc\xae\xaf\xf7\x92\xb8\x56\xd2\xeb\xc0\x26\x8a\x55\x5b\xdd\x31\x50\x9b\xda\x35\x0e\x15\x7b\x61\x5b\x24\x22\xf6\x18\xcb\xe0\x80\x06\x08\x0a\x7b\x2d\x9d\xe7\x64\xb7\xc8\xf5\x06\xe1\x09\x30\x06\xa8\x04\x7c\xa0\xd4\x9b\x81\xbe\x20\x81\xb7\x8d\x8e\x97\x73\x64\x03\x3a\x6b\x2d\xf7\xdd\x96\xf1\x19\x54\xc2\xc0\xb4\x42\x7e\x90\x4b\xb6\xe5\x0e\x90\x81\xbd\xf1\x55\xef\x6e\x7c\x1e\xef\x0b\x77\x09\x17\x08\x5f\x44\xba\xc3\x20\x70\x01\x37\x4c\x78\xdb\x4f\xd5\x93\xd3\x22\x6d\x2a\xb8\xf2\x1b\x62\x71\x0a\xe2\x5d\x52\x0a\x6e\xa0\xd4\xef\x06\xfa\x17\xe6\xe7\x8f\xb1\x93\x03\x30\x5f\x40\x74\x8d\x4a\xc8\x81\xb4\x1f\x09\xfa\x5c\x4f\x22\x6e\x7f\xe2\xae\xe3\x73\xc4\x53\xf8\x6b\xa2\xf0\x27\x59\x6c\xcc\xcf\x7d\x87\x9d\x5e\x4d\xdd\x69\x13\x0d\x9e\x33\xe9\x60\xf2\x02\xa5\x24\x2d\x00\x29\xcc\xdb\xe0\x8d\xef\x32\xc8\x9d\xcb\xd8\x95\x6c\x10\xa6\x6d\x12\xa4\x1b\xc8\xea\x4f\xeb\x80\x80\x91\x6e\xa9\xa9\xf9\x95\x90\xfd\x09\x5a\xcf\xee\x4b\xa4\xa6\xd6\x72\x08\xbd\x4d\xa2\xbc\x39\xe8\x15\x4a\xb9\x03\x11\x71\x26\x9c\xf0\x8d\x08\xa2\x00\xf1\x04\xb2\xc1\x4a\xa1\xcf\xf4\xb2\xa3\x22\xcd\x59\xd5\x3c\x9f\x82\x6d\x8a\x22\xe0\xd1\xb9\x1b\x85\x1f\x98\x1b\xb1\xa3\x00\x46\xa9\x9f\x9b\x3a\x50\xa1\x28\xe1\x62\xfa\xcb\x68\x36\xba\xd4\x17\xd3\xcb\x51\x54\xcf\x80\x85\x0c\x83\x1e\x20\xea\xa9\x1a\x01\xe8\xdd\x3a\x0a\x0c\x62\x92\x33\xe0\x4a\xf3\xef\x8b\xab\x16\x3a\x24\xca\xd4\x70\xf2\xa5\xab\x6a\xa1\xf1\xd0\x76\x11\x43\xa2\xe7\xc3\xc5\x78\xfe\x61\x78\xb1\x98\xce\xbe\x70\xa1\x41\xa2\xbe\x57\xd7\x80\xbc\x75\x4d\xc5\x33\xdc\x46\x58\x51\x00\x25\x1a\xb3\xf1\xfc\x8f\xaa\x55\xc7\xa0\x8f\xd4\x31\x30\x50\x2c\x2a\x5e\xf0\xe8\x31\xa8\x5e\x50\xbe\x7a\x81\x14\xa0\xf4\x6c\x34\xbf\x01\x05\xac\xc6\xab\xb1\x98\x61\xd6\x10\xcf\x0a\xc5\x0c\xaa\xb3\x98\x01\x19\xf1\xba\x27\xda\x4d\xed\x70\xa2\x47\xf3\x39\x41\xfe\xdd\xb0\x80\xfe\x9b\x60\xd1\x03\xfd\xbb\xdb\xa0\x2b\xd5\x5c\x1b\xc3\xdb\xc5\xa7\xe9\x6c\xfc\x7f\xa4\xc6\x94\x26\x1d\xb1\xf9\xed\xfb\x7f\x1a\x5d\x2c\x14\x8c\x56\xd4\x8c\x81\x52\x67\xcf\x07\x62\xc6\x23\xa1\xad\x81\xc6\xc7\xb8\x5e\x8f\x67\x17\xb7\xd7\x73\x20\x1d\x9c\x83\xb8\xd8\xd5\xe8\xe3\xf0\x8a\xe4\xb9\xbc\x22\x97\x6a\xe8\x6d\x75\xeb\xde\xc5\x22\x5c\x4d\xdd\xae\x7e\x22\x44\xbd\xa4\x48\x57\x42\xfa\x65\x6e\x42\xa8\x8a\x03\x92\xab\x54\xda\x21\x6a\x30\x8e\xca\x99\x05\x09\x33\xa1\x6b\x76\xbc\xe6\x82\xc7\xfa\xd3\xd0\xb5\x06\x04\xc7\xb8\x63\xaa\xab\x63\xfc\xbd\x0f\x54\x28\xe1\x1e\xf0\x71\x3a\xbd\xfc\x3c\xbe\xba\x4a\x90\xe4\x71\xbe\x98\xde\xdc\x0c\x3f\x8e\x92\xa8\xf6\x22\x51\x17\xd3\xeb\x9b\x5b\xf7\x0a\x5f\x32\x31\xd3\xd7\xc3\xab\x0f\xb7\x93\x0b\x7c\x36\x75\x89\x69\x1d\xb1\x5c\x42\x6a\x29\x73\x9b\x67\x0a\x6b\x34\x1a\x15\x14\x58\x31\x21\x14\xe0\xa0\x70\x62\x3c\x71\x9b\xe5\x58\xe5\x84\x8a\x2a\x27\x98\xd5\xb1\x73\xad\xd0\x93\x81\x69\xf1\xe6\xe6\xea\x0b\x54\x97\xc8\x2d\xa2\x2e\x47\xc3\xc5\x27\xd7\x8d\x9b\xd1\x6c\x3e\x9d\x0c\xaf\xf4\x78\xf2\x4f\xb7\x33\xd8\x69\xb7\x57\x50\xaa\xf3\x61\x36\xbd\xa6\x20\xa3\x58\x23\xb4\xc9\x47\xff\xb2\x18\x4d\x16\xa2\xea\x47\x5d\x0d\x3f\x7b\xde\xc7\x39\xf6\x32\xb4\x6e\xa0\xe7\xd3\xeb\x91\xfe\xa7\xdb\xd9\x78\x7e\x39\x26\xa6\x48\xe6\x82\xbc\xba\x9a\x7e\xa6\x87\x5e\x5c\xdd\xce\xc7\xd3\x89\x82\x2d\x2d\xbb\xf6\x03\x45\x39\x89\x9e\xbb\xb6\x0d\x17\xe1\x39\x70\x0c\x8b\x07\x5d\x0f\xbf\xc4\x83\xe2\x25\xfa\xdc\xde\x3b\x1b\x74\x47\x4c\x7c\xc9\xc5\x31\x89\x46\x96\xd6\x44\x8d\xe2\x44\x79\xda\xbc\x88\x44\x2f\xd1\xce\xa6\xa7\xc8\xd8\xbe\x4e\x33\xe6\x00\xec\x54\x5a\xf4\x77\x52\xc3\x04\x42\x85\xd1\x44\x44\x6d\xdc\x05\x79\x5f\x80\x08\x69\xb9\x85\xc0\xd6\x11\x0c\x06\x16\x10\xe7\xeb\x96\x14\x73\x12\xa2\x3d\x5e\x93\x39\x61\xd5\xc6\x92\x95\x67\xa5\xdc\x11\x22\x6e\x88\xf9\xce\xb5\x3f\xa8\x6e\x99\xba\x2e\xca\xdc\x1e\x2a\xbd\xb1\xb6\x0a\xca\xcd\xd4\x79\x19\x7d\xdd\x3b\x53\x46\xf2\x24\x24\x1e\x53\xe0\xc9\x06\xba\xd4\xb2\x9a\xc8\x53\x7c\xb4\x7a\xda\x12\xf7\xf5\xd6\x01\x79\xa4\xd4\xd9\xf9\x00\x9d\x20\x51\x1e\x30\xca\xd7\xfa\xb6\x72\xce\x09\xa4\x96\xe2\x04\x4e\xa5\x4d\x54\xad\x90\xd6\x76\xdb\x6b\xf0\xd1\x7d\xaf\x7c\x84\x12\xd8\x81\x1c\x5c\xf2\xdf\x82\x3b\xfd\xf2\x77\x6c\x7e\x5e\x10\x10\xee\x83\x5d\x43\xca\x65\x16\x3c\x2a\x9f\xc3\x38\xda\x01\x06\xb0\x62\x08\x52\x44\xd4\x9e\x66\x2e\x25\xbe\xf2\xae\xfc\xae\x6a\x22\xf9\x5e\x0c\xf4\x75\x5a\xad\x6c\x96\x99\xdc\x16\xfb\x66\xc8\xc7\x4f\x47\x15\x93\x7a\x18\x2f\x43\xb3\x2a\xf2\x95\x2d\x73\x5e\x53\xc0\xa6\x45\xef\xde\x02\x25\x34\x8a\xb1\x75\xea\x2a\x8a\x70\x2f\xd0\x30\x23\x0c\x20\x52\x55\xfc\x01\xa9\xc2\xaa\x00\x8e\xf2\x42\x9b\xd5\x7d\x6a\x51\xd3\x2a\xb7\xa6\xcc\x0e\x80\x18\x21\x18\x31\x96\xbf\x9b\xad\x65\x69\x1d\xe7\xcd\xae\x8a\xbc\xd8\xa6\x2b\x0e\xa3\xc5\x5a\xff\x02\x98\x1e\x22\x9a\xac\xc9\xd8\xa2\xb9\x81\xcd\x1d\xca\x9d\xf1\x89\x8d\xd1\xf4\x6d\x97\x58\x6a\x93\xaf\x15\xd0\x7a\x95\x7b\x4a\x6f\x75\x14\xab\x1c\x17\x17\xe2\x96\x71\x2d\x9d\x0a\xb5\x74\x84\xa6\x07\xa7\xd5\x0d\x0f\xcf\x59\xe5\x7c\x61\xd8\x13\x69\x0e\xe0\x08\x1e\x79\x02\xec\x08\x0a\x3f\x45\x81\x54\xf1\xd0\xa5\xad\x1f\x9d\xdf\x23\x7e\x55\xda\x0a\x92\x46\x15\x06\x58\x85\x1a\xa1\x48\x22\xc6\x58\xc6\x70\x26\xc7\x0b\x35\x24\xfb\xff\xb4\x2f\xd3\x6a\x8d\xf0\x2f\xee\x3a\xed\x22\x75\x51\xec\x45\x69\xdd\xa4\x00\x22\x88\x9c\x58\x0f\x91\x65\x5a\x34\xef\xa4\x28\x7d\x38\x36\x5e\x9b\xd1\x4b\x54\xca\x75\xd6\xf0\xf4\x84\x56\xbc\x7c\x53\x47\xc1\x62\x9f\xd4\x49\x1e\xac\x73\xcf\x10\xf3\xe9\x3b\x91\x1d\xdc\x43\xe7\x26\xaf\x8d\xf3\xeb\x4b\xa3\x2f\x8a\x3d\x44\x15\x64\xc5\x63\x98\x65\xc8\x65\x91\x23\xdf\xbc\xa5\xe0\x38\x7f\x3a\xca\x94\x90\xaa\x34\x9e\xfc\xc8\x26\x7a\xe4\x5c\x87\x65\xc7\x17\x03\x1e\x94\xe4\x73\xc9\xf1\xa6\xa5\x36\xa1\x03\xeb\xa2\xc8\x1f\x38\x9f\x9f\xa3\xfc\x17\x08\xe9\x6f\x0a\xa4\x2f\x1a\xe7\x94\x41\x80\x4c\xf0\x9c\x90\x8b\x1f\x8b\x62\x0d\x7c\x80\x21\xde\x17\x6a\xdb\x61\xbd\x98\x47\x0d\xf4\xa1\x7c\x34\x62\x46\xc8\x97\x37\x84\x1c\x9d\xc9\xef\xf6\xe6\x8e\xd8\x3a\x57\xf4\xfe\xb0\x96\xc2\x36\x12\xca\xdd\x6a\x5d\xa2\x2e\x56\x03\x17\xd4\xcc\x6e\x0e\x02\xe0\x80\x19\xa8\xad\x1e\x92\x1f\x0a\x77\xab\x97\x5e\x8b\xe1\x6f\xbe\x6e\x82\x8f\x04\x48\xf8\xbb\x43\xd8\xdd\x58\x4a\x2c\x70\x93\x77\x26\x59\x8c\xa4\x06\xa0\x68\x29\xd4\xe5\x44\xda\x14\x8c\xfe\x7a\x9f\x68\x59\x96\x23\x39\xea\x2d\x17\x4c\x4a\x90\x7a\xdc\x24\x6e\x0d\x88\x2c\x76\xba\xee\x51\xc0\x45\x12\x6b\x20\x8d\x1b\x3f\x8c\x28\x33\xa2\x4c\x79\xe0\xea\x6a\x3d\xa0\x58\x02\x23\x83\xe9\xa4\x80\x31\x75\xdb\xe4\x51\xce\xe4\x49\xdc\xaa\xcd\xdf\xea\x2b\x38\xb2\xe7\x18\x7c\xaf\x12\x7d\xf6\xfa\xf9\x73\x3d\xdc\xee\xee\xd3\xfa\xde\x9a\xba\xb4\x20\x22\xf2\x68\x0e\x89\xbe\x76\x1b\xcc\xbd\xea\x97\xd4\x3e\x26\xfa\x62\xa8\x7f\x7e\xf9\xfc\xe5\x8b\xd3\xb3\x17\xaf\xce\xb0\x2e\xa2\x7e\xab\xd4\x7d\x5d\xef\xde\x3e\x7b\x56\x54\xd5\xa0\xba\x4b\x07\xab\x62\xfb\x6c\x57\x16\x6e\x64\xaa\x67\x6e\xd8\xdf\x2b\x35\x61\x8e\x7f\x48\xe2\x79\xe0\x4b\x1a\xc1\x58\x71\xb8\xfd\x1c\xa5\x55\x44\x7c\x04\x17\x87\xee\x0d\xe7\x6a\x3c\xef\xe9\xa5\xa9\xd2\x8a\x76\x7b\x23\xd4\xf0\x03\x51\x01\x11\x66\x50\x3f\xa0\x84\xfe\x17\x85\x19\x54\x67\x98\xe1\xbb\xf4\x09\x47\xc2\x0c\x4a\x45\x21\x7f\x3c\x64\xe2\x2c\x40\x5a\xbd\xd5\xff\x17\xf2\x2c\x10\x06\xe4\x61\x4c\x1a\xf1\x37\x8d\x61\x70\x2a\x0c\x01\x02\xc2\x7f\xd5\x89\x5e\xdb\x07\x9b\x15\x3b\x8a\x49\x75\xda\xcc\xed\x77\xaa\x54\x4a\x12\x9c\xac\xfa\xfa\xff\xc2\x03\xa9\xc4\x04\x64\x33\x20\x23\x47\x27\xaa\xaf\x48\x43\x7e\x65\x01\xc6\xe9\x4c\x6c\xfc\xeb\xb1\x86\x5c\x48\x61\x10\x30\x87\xf8\xd8\xa0\x80\x16\x66\x07\x25\x0b\x4f\x5a\x21\xd3\x1c\x70\x34\xb9\x4b\x39\xab\x2c\x42\x76\xa8\x56\x09\xb2\x2c\x98\xaa\x23\x96\x1d\x38\x52\x3d\x18\x47\xb5\xc0\x38\x6e\xb8\x8f\x97\xdf\x25\xc4\x56\x2e\x7a\x4d\x5d\x56\xa1\x0e\xaf\x9d\xcb\xf9\x95\xb5\x78\xbd\x7f\xfd\xdf\x56\x64\xfb\x5f\xf8\x67\xf0\x6c\xb5\x2f\xb3\xbf\xa2\xf8\xd7\xf7\xf5\xff\xce\x9f\x9f\xbf\x68\xd6\xff\xbe\x7a\xfd\xe6\xb7\xfa\xdf\xbf\xc5\xcf\xc5\xf4\xe6\x0b\x50\x46\x70\xb8\x97\x15\x45\x26\xd3\xc5\xf8\x62\xd4\x38\x2a\xcf\x7e\xfe\xf9\xb5\x3e\xd5\xe7\xcf\xcf\x5e\x25\xfa\xd2\xe4\xa9\xcd\xf4\xbc\xb6\xf9\xd2\x96\x77\x89\xfa\xfd\x1a\x7e\xf3\xff\xdd\x9b\x6f\xdf\x06\x95\xfd\x03\x49\x90\x37\x25\xbc\x94\xba\x89\xe4\xa8\xf6\x98\xe0\x90\xac\x5d\x0d\x35\x0c\xa4\xa2\xe6\xdb\x81\x11\x2e\x94\x3f\x57\x4d\x71\x40\x22\xb2\x97\x00\x64\xbb\xee\x62\xbc\x47\xd1\xaa\x26\xe3\xaa\x50\xaf\x0a\xcd\x64\x32\x56\x7f\x26\xa2\x9e\xf6\x2e\xb5\xcc\x94\xe4\x23\xe0\xed\xd4\x42\x2f\x69\x71\x24\x71\x30\xf4\x8f\xe3\xc9\x65\xe2\x2d\x81\xe9\x4c\xb5\x09\x90\xba\x98\x66\xdc\x0b\x9f\xa4\x3d\xf2\x97\xb6\x3a\x76\x69\xeb\x5f\xc1\x79\x04\xd4\x41\x0a\xa9\x83\x30\x32\xe9\x1a\x80\x41\xf2\xb9\x26\xe5\x1b\x5c\x45\x48\x2d\x33\xef\x08\x1f\x83\xf5\xe2\xa3\xba\x3e\x16\x1d\xe2\x9a\x3e\xee\x8d\x49\x03\x12\xa4\x71\x6d\xf2\x11\x6c\x0d\x11\xf1\x38\x8c\x4d\x54\x3e\xea\x03\xd0\xa8\x13\xa1\x0f\x10\xf9\xb8\xef\x4d\x30\x65\x80\xcc\x38\xd1\x3c\x11\x1d\x15\xd1\xfe\x60\x5b\x2e\x47\xc3\xab\xf1\xe4\xe3\x5c\x8d\x27\x71\xae\x43\xa9\xa0\xba\x4c\x48\x43\xb6\x05\x91\x3f\x35\x25\x22\x3f\x6f\xcc\x08\xf5\x29\x88\xee\x49\x07\x44\x2d\x2d\x92\x74\xba\x85\xb4\x7e\xb0\x65\x4d\x21\xb6\x32\x26\x93\x43\x18\x08\xab\x2c\x64\x88\x63\xf7\x9f\xd2\x6b\x6b\xb2\x34\xbf\x23\x84\x45\x5a\x05\x3b\xb4\x1b\x0a\x62\xf6\xf5\x7d\x51\x8a\xa8\x65\x1d\x09\x96\x61\x2b\xff\xd7\x31\x60\xfc\xef\xfe\x19\x3c\x9b\xce\x47\x8b\xd3\x9b\xab\xd3\xf3\xbf\x1a\x03\xc8\xd3\xf7\xff\xcb\xd7\x2f\xcf\x5e\x36\xf5\x3f\xcf\xcf\x7e\xbb\xff\xff\x26\x3f\x6e\xf6\x1b\xba\x9f\x70\xd3\xbb\x2b\x1e\xbc\x54\xbc\x03\xf4\x6c\x34\x1f\xcd\x7e\x19\x5d\xea\x5f\x46\x33\xb0\x0f\xce\x07\x67\x91\x30\x99\xba\x1c\x7d\x18\x4f\x46\x73\x38\x37\xe9\x4b\xd3\x0f\xee\x78\x05\x46\xba\xd9\xf4\xf2\x96\x72\x6f\x41\x1d\xcd\xfd\x17\xd0\xc4\x8d\x2f\xbc\xeb\x7a\x29\xa9\xe2\x20\x95\xf4\x41\x5f\x8c\x66\x8b\x21\x9c\xe7\x98\xa6\xf5\x67\xf8\xc9\x70\xae\xf1\xbd\x97\xfa\xfd\xe8\x6a\xfa\xb9\xaf\xa7\xb3\xf1\xc7\xf1\x64\x78\x75\xf5\x45\xcf\x46\x57\x23\x50\x81\x7b\xff\x05\x08\xd3\xa6\x37\xa3\x89\x9e\x4f\x6f\x67\x17\x23\x3d\xba\xa2\x8b\x61\x31\xba\xf8\x34\x99\x5e\x4d\x3f\x7e\xd1\x1f\xa6\xb7\x93\x4b\x4c\x34\x9d\x40\x22\x6f\x76\xf5\x45\xf7\x5c\x7f\xa6\xf3\xcb\x5f\xc4\x9f\x7b\x7d\x67\xda\x4c\xbe\x4c\x27\x23\xa0\xbb\xbb\x85\x04\x21\xf7\xd2\xfd\x3b\x90\xdd\xcd\xb9\x8b\xee\x5f\x0d\x22\xbc\x39\x11\xfa\x41\xaf\x14\xf7\xca\x67\x27\x21\x73\x0d\x5c\x8a\xd3\x0f\x89\xb3\x2b\xa0\x1f\xc3\x05\xdd\x8c\x09\xa9\xb0\x39\x1b\x61\x3c\xd1\x1f\x6e\xe9\x5e\x06\x39\x36\xe5\xee\x4c\xe4\x94\x1b\x93\x82\x1c\xf0\xf9\x21\x00\xa0\x21\xe6\xe6\xfe\xe0\xcc\x0a\x48\xfa\xc1\xd7\x13\xf8\xbb\x1b\xe2\xc9\x74\xa1\x02\x41\xdf\x02\xd3\xe6\xa2\xd9\x02\x0f\x10\x29\x74\x3d\x42\xd0\xc4\xee\x0c\x20\x8f\x49\xa4\x42\x61\x91\xdd\x9f\xd3\x2c\x33\xad\x55\xd7\xbb\xbe\xb9\xea\xf5\x83\xef\x7f\x3e\x78\xce\x84\xdb\x79\x51\x47\x97\x16\x63\xfb\x57\xb6\x52\x1c\x8f\x8e\xc4\x33\x00\x90\x7d\x73\xe5\x9e\xe1\x85\x55\x2b\x8b\x37\x29\x2c\x79\xa1\x4a\xfd\x68\x97\xba\x4a\x6b\xab\x4c\xad\x1f\x1f\x1f\x07\xee\xef\x42\x08\xb6\x28\xef\x9e\x61\x44\xe0\x34\xf3\x79\x93\x05\xe4\x54\xbe\xd5\x4d\x0c\xfa\xd2\xde\xa5\x39\xda\x9e\x6f\x3b\x58\x72\x88\x24\xe7\x22\xc0\xdb\xbc\xfe\xa2\x59\xdd\x37\xf8\x06\x22\xb6\x01\xac\x1f\x82\x48\x41\x95\x04\x7c\x9c\xad\x38\x88\x07\x7f\xc3\x21\x4a\x08\xcb\x19\x28\x5e\xd8\x30\x18\x78\x16\x1c\xdf\x00\x0e\x26\x4a\x32\x1c\x59\x9a\xe9\x53\x76\x79\x5c\x1b\x05\x26\x48\xa5\x58\x1e\x02\xed\x19\x28\x6e\x97\x0f\xf7\x1a\x3c\x02\x13\x25\xfe\xfe\x53\x15\x3d\x58\x54\xa5\xbf\x10\x8d\x14\xad\x6b\x76\x08\x2d\xad\xee\x87\x33\x1f\x4e\xf3\x3b\xbe\xd2\x1d\xcb\x68\x20\x84\xf1\x01\xea\x94\xa5\x18\x2c\x33\xcb\x88\x07\x2a\x80\xf1\xd7\xb5\x59\xdd\x93\x96\x46\xa0\xd9\x08\xc5\x6a\xf0\x87\x51\xa8\xc7\xf9\x40\x1c\xf3\x10\x76\x11\xef\x54\x1f\xa0\xb8\xab\x5d\x3a\xd0\xf1\x59\x8d\x9f\x4d\x49\x25\x64\x65\xbc\x40\x02\xe4\x0b\x28\x92\xa4\xda\xc5\xfd\xaf\x74\x6f\x9c\x03\x49\x7f\x0d\x89\x84\xcf\x00\xd0\xb5\xab\x22\x5f\x9b\xf2\xe0\x35\x17\x69\x48\xde\x2a\x65\xdc\x36\x26\xff\xa8\x63\x08\xf4\xb1\x21\xf0\x05\x61\x62\x30\xd4\xfb\x26\xcc\x7a\xee\x75\xe2\x8b\x52\xa9\xe5\x20\xf8\x62\xad\x89\x75\xe7\x07\x64\x7c\x83\x42\x56\x87\xf4\x07\x9d\x15\xea\x6c\xf0\x0d\x32\xdd\xa6\xcc\x52\x5b\x36\xe1\x76\xa4\x04\x41\x95\x65\x1d\x8f\x31\x61\x4c\x94\xa4\x39\x79\xad\x7b\x8d\x99\x94\x24\x2b\x2d\xf5\x00\x51\x7f\xd3\x9c\x3c\xcf\x16\xf4\x2b\xc9\x99\x22\x93\x9e\x5e\xc0\x4c\xf0\x09\x2a\x30\x55\xee\x90\x35\x35\xa9\xc6\x9c\x14\x25\x32\xe5\xf4\x3d\xcb\x8a\xeb\x79\xc7\x49\xc0\x6b\xe4\x77\x3f\xc0\x73\xf4\xf3\x7f\x11\x4a\xa7\x24\x2a\xfe\x23\x52\xf3\x26\x93\x53\x83\xb1\x5e\x72\x5d\x3c\x7f\x82\xf8\xa8\xa9\x71\x84\xbb\x01\x26\xda\x0d\x6c\xda\x9e\x54\x1c\x61\x26\xe9\x22\x78\x86\x64\x21\x4a\x3c\x81\x10\x80\x37\x12\x24\x20\x69\x0b\x58\xc9\x7c\xcd\xd1\xbd\x62\x24\x7f\xd0\xd1\xd6\x44\x9c\x42\x9d\xe7\xff\xd9\x99\xee\x61\xb1\x34\x61\x8d\x91\x96\x25\xda\xe6\x82\xc2\x4c\xd0\x7b\x9c\x54\x7d\x51\xe9\xa0\xba\x12\x90\xa8\xb7\xe8\x59\xcd\x48\x18\x6b\x07\x2b\x74\x5f\xf9\x3a\x71\x8e\x81\xe3\xc3\xc3\xd2\x52\xcb\x03\xc3\x54\x43\x63\xa0\x5f\x5e\x72\xd0\x13\xa5\x24\xbe\x1e\xd1\x0d\x21\x2d\x97\x06\xce\x96\x2a\x6e\x50\xd2\xc3\xb9\xcf\xf0\x7f\x95\xcd\x32\xf8\x87\x27\xdd\x0f\xe5\xe0\xb4\xa8\xb1\x6c\x1c\xe1\xf9\x6e\xda\x94\x2f\x07\x2f\x36\x2c\xba\x90\xd6\x55\xf3\x5e\x6c\xfc\x32\x5c\xaf\x9e\x31\xa6\x75\xf8\xf2\x12\x2c\x72\xb7\x05\xde\x42\x7b\x41\x20\x1a\x29\x75\x1b\x66\x92\x4f\xfe\x29\x30\x6d\xf8\xc3\x57\xb6\xaa\x6c\xf9\xbd\xef\x38\xa3\x3d\x7c\x67\xe8\x3a\x5f\xf0\x77\xd4\xb1\xef\xbc\x70\xef\xe1\xa2\x32\x77\xf2\x48\x88\x35\x91\x9f\x67\x41\xbb\x97\x08\x65\x1a\x6b\x53\x5a\x17\xad\x63\x33\xd2\x63\xa1\xb9\x8a\xb6\x49\xe5\xf9\x67\xbe\x14\xfb\x1e\x1c\x71\xee\x5f\x65\xaf\xff\x97\x72\x35\xa9\x2e\xfa\xfc\x4e\x1e\x25\x78\x63\x90\x36\x3d\xc6\xa0\xa4\x7e\x35\x83\x92\xfe\x52\xec\xbb\xb9\x93\x54\x37\x77\x12\x5f\xd1\x27\xa6\xaf\xbf\x4f\x98\x14\x64\xb7\xf0\x97\x84\xa6\x42\xf6\x24\x82\x7d\xa9\x88\x44\x89\xcf\xe4\xe5\x21\xa4\xd6\x65\x44\x0a\xb6\x81\x8a\x78\x96\x5c\x8b\x81\x50\x09\xee\xbc\x4e\xc6\xa5\x27\x98\x96\x54\x17\xd3\x92\x6e\x31\x2d\x75\xd0\x03\x21\xb8\xe1\x22\x88\x4e\xd1\x09\xef\x9c\x52\xfc\x80\x52\x23\xd3\x38\x46\x62\x46\x8a\x2f\xc5\x9e\x89\x27\x4e\xbf\xcb\x3c\xc1\x05\x69\x78\x25\xe0\x94\x3e\x59\x8f\x72\x22\x4c\x01\x3a\xe4\xdc\x39\xc5\xa5\x64\xfd\xef\x1e\x79\x14\x16\x17\x14\x3d\x50\xb4\xeb\x8d\xa1\x10\x2b\x27\xc6\x9d\x84\xd1\x3b\x89\x92\x64\x3e\xbe\x22\x08\x62\x8a\xf6\xdb\x2e\x2b\xd2\xba\x7d\x72\x25\x7c\xa6\x61\xca\x3a\x28\x5a\x2b\x99\xb5\xee\xe0\xc4\x7c\x92\x92\xc7\xdd\x5a\x38\x58\xd1\x7d\xe3\xa7\xb8\xd1\x63\x64\xed\x38\x4e\xd5\xa1\x04\xa1\x07\x9f\xcc\x71\xff\xfc\x21\xfd\x9d\x13\x5a\x75\x9f\xd0\xbc\x88\xce\xf5\x08\xe0\x5b\xe9\x83\xd5\x97\xa6\xb6\xe8\xef\x3d\xc1\xcc\x01\x0b\xaf\x4b\x07\x51\xbe\x5c\x2f\xed\xaa\xd8\x5a\x65\xfd\xb3\x37\x60\xb2\xca\x81\x20\x68\x4d\xcd\x32\x7b\x91\xeb\x05\x96\x5d\x59\xc9\x0a\xab\x4a\xc5\x03\x19\xf7\xe3\x85\x54\x74\xd0\x98\x93\xce\x6b\x3d\x5f\x15\xbb\x27\xfa\x14\x55\x46\x23\xd1\x08\x6c\xe1\x3c\x3b\x34\x2b\x7a\xc3\x29\xea\xcd\x66\x3d\x29\x64\x72\xd9\xd7\x74\x86\x57\x01\x52\xce\x5d\xe4\x54\x4f\xe5\xcb\x19\x23\x09\x20\xff\x0d\x08\x8c\xb7\xcd\xa2\x4e\x01\x94\x49\x51\xbb\x59\xf0\x47\x8d\x20\x4e\x71\xe7\x16\x24\x7c\xdc\xd6\x6e\xb1\x08\x55\xb2\x20\x3b\x32\x85\x70\xcb\x6f\x3c\x95\x1a\x17\xb2\x99\x96\x5b\x04\xba\xba\xdc\x9f\xa3\x56\x5c\x9b\x24\x08\x4e\x6a\xf7\x62\x24\xef\x72\x17\x5b\x90\x13\xa5\x63\x44\x56\x5c\x45\x37\xa3\xea\x18\x9a\xc4\x17\xb9\x75\x38\xf3\xed\x2d\x11\x3c\x0b\xe5\x73\x6c\x27\x41\x77\x87\xf7\xf7\x11\xc3\xa6\x8f\x3d\x5b\x75\xef\xf4\x88\xd5\xae\x35\x85\x84\x26\x00\x68\x1e\x12\xfc\x47\x7b\x93\x75\x48\x7e\xac\x06\x99\x1e\xe6\xcf\xd8\x2a\x89\xaa\x75\xe1\xbc\x52\x59\x71\x57\xf8\xb2\x39\xd9\x1b\xd1\xe1\xad\x39\xb8\xe5\x19\xb8\x2c\x40\xd6\x67\xbb\xcb\x0e\x01\xa9\x47\xa9\x42\xe2\xa6\xc4\x79\x14\xc7\xc1\x8b\xc1\xcb\xbe\xd8\x87\x2f\xf5\x3c\x54\x54\xb1\xcf\x0d\x02\x48\x91\xcd\x6d\xbe\xda\x4a\xee\x1d\xba\xa9\x1a\xf5\xfa\xb0\x3e\x48\x12\xa1\x96\xf2\x65\xaa\xd3\x8f\xe6\xa2\xb4\x8e\x9a\xae\x26\x84\xf5\xa4\xb2\xd6\x6f\x99\xb3\xe7\x83\x73\x20\x4c\x7c\xda\x5d\x0e\x5f\x4e\x37\x02\xc5\xd6\x51\x58\x16\xc6\xe6\x85\x1c\x9b\x57\x7a\x16\x41\xbe\x3b\x2e\xee\x08\x84\xec\xe3\x05\xe1\xef\x4b\x9b\xa5\xf6\x01\x64\xf4\x1a\x6b\x1b\x99\x15\xe1\xfc\x21\xc0\x0a\x87\xc9\x80\x1e\xa5\x64\x6e\x86\x6a\xbf\x71\x76\x88\x1b\x1c\x5f\xd1\x4e\x2b\x2c\xa0\xae\x15\x68\x00\x36\x77\xcf\x77\xbd\xce\xf3\xc1\x6b\xfd\xc1\xa4\xa5\xbe\xad\x6c\x5b\x1e\xa3\xa9\xe1\x0c\xbe\x94\x5c\xd6\x5f\x58\xc4\x95\x26\xd2\x17\xc6\xa9\x90\xb9\x5b\x17\xab\xba\x84\xb0\x41\xb1\xd1\x1b\xf7\x2e\xb8\x44\xe1\x5f\x94\x24\x4c\x42\xda\x30\x08\x8c\x55\xa2\x91\x6f\x22\x73\xca\x93\x9c\xbc\x70\x1e\x03\xd0\x63\xbc\x18\xbc\xc0\xeb\xf6\xc5\xe0\x25\xaa\x04\x34\x18\xea\x3a\x6f\x13\x25\x6e\x48\xa9\x08\x86\xd0\xd6\x34\x03\x33\x9b\x5b\xf1\x62\x70\x26\x94\xcb\xa9\x62\x1d\x3d\x09\xe7\x44\x20\x9c\xa0\x59\x50\xd0\x75\xaa\x74\x85\xce\x82\xe0\x6a\x93\x85\x0d\x16\x95\x1b\x67\x62\x3e\x44\x6b\x04\x43\x81\xf0\x6b\x1f\x6d\x0d\x14\x54\x47\x64\x68\x55\x0c\x7c\x44\xa5\x3e\x70\x78\xca\xc0\x77\xe6\x17\x71\xcb\x83\x8f\xeb\x23\x94\xc4\x15\xfe\x10\xfd\x76\x42\xc5\x24\xa0\xab\x7a\x00\xbe\x29\x04\x5e\xaa\x6e\xd2\xa8\x41\x53\xa6\x97\xe2\x20\x70\xc6\x5c\x37\x05\x30\x41\x0b\xb9\xa5\x35\xdc\xd0\x42\x86\x01\x03\x56\xa0\x20\x37\x5c\xc5\x40\x52\x12\x4e\x03\x62\xbe\xcc\x39\x94\x45\x10\xf1\x23\x94\x3d\x8f\xd5\x4f\x8d\xd3\xbd\x23\xac\xc6\x4b\xe7\xbc\xb5\x74\x1a\xa1\x3b\xfe\xe8\x18\xfa\xd7\x55\xa6\x2e\x97\x50\x33\x82\x5b\xdf\xdb\x1c\x6d\x81\xa8\x8c\xd6\x7f\x25\x62\xae\x6a\x04\x2e\xbb\x56\xa4\x32\x55\x1c\x34\x0d\xe7\xe3\x19\x4e\xe3\x13\x2b\x88\xd6\x49\x68\x23\x04\x93\xbb\x26\x5e\x20\x6e\x3b\x83\xca\xa0\x04\x1e\x40\xe2\xe0\x63\x62\x58\xb1\x4e\xb7\x36\x3b\x38\x87\x31\x77\x6e\x26\x98\x3c\x24\xcc\x9c\x17\xc2\xeb\x43\x1b\x03\x55\x72\x63\x65\xf9\x02\xa3\x73\xdc\xec\xe0\x13\xf0\x62\x10\x53\x00\x8d\x6b\x8e\xf9\x77\xb4\x9e\x01\xce\x2b\xd8\x5c\x7c\x51\x74\xa0\x7e\x82\xef\x75\x61\x7f\x04\x69\x10\xb4\xb2\xf9\x6a\x6f\x67\xb0\xca\x9f\x3f\x9b\x41\xba\xb5\xa6\x76\xb5\x57\xaa\x3a\xb2\x52\xbb\xeb\x95\x79\xf1\xbe\x68\x2d\xde\xc8\x9d\x52\x5e\xe1\x90\x8e\xa8\x06\x40\x2a\xfa\x30\xbf\x89\x87\x4c\x18\x0c\x4d\xe2\x2b\x70\x82\xdd\x9a\x6d\xda\x37\x91\x61\xd3\xb4\x13\x38\xe4\xd6\x3c\xa6\xbc\x0e\x8d\x6c\x0c\x54\x5c\x35\x6c\xd0\xee\xe0\x36\xc6\xc1\x95\x3c\xe8\x20\x26\x46\x9c\xcd\xed\xac\x45\x90\x24\x6f\x6f\x60\x24\xc5\xfc\x91\xdc\x47\x83\x88\x1b\x6d\x18\xbc\x77\x6b\xe9\xca\x64\x07\xd5\x5c\xaf\x47\x7d\x92\x26\xc7\x4f\xeb\xad\x27\x55\x3f\x51\xac\x13\x18\x2d\x24\x1f\xc2\x14\x63\x08\x1c\x01\xf8\xc1\xb4\xd4\xc5\x0e\x23\x43\xac\x7f\xfa\x63\x16\x60\xd4\x28\x72\x8f\x9b\x0c\xe4\x71\x5b\x55\x68\xab\x58\xa9\x2f\x09\xd0\x5b\xa9\x48\x75\x13\x9d\x9f\x78\x73\x08\xa1\x80\x4d\xc4\x53\xc6\x17\x87\xa8\x47\x6c\xa2\xf0\xdc\xa6\x45\x4f\xc2\xff\xf7\x3a\xad\x20\x7c\x6c\x4b\xe8\x43\x60\xe8\x00\x57\xd1\xfb\xb9\xce\xd6\xf4\xe5\x90\x7d\x81\xd6\xa2\x52\xa6\x1f\xb8\x78\x83\x27\xa5\xc8\x2d\xf0\xbb\x05\xf4\x22\xa1\x87\x5d\x1d\x8a\x0b\x43\xa4\xa4\xb6\xdb\x4b\xeb\x83\xfa\x9a\x17\x8f\xb9\xde\x20\x17\x98\x4e\x73\xb3\x5a\xed\x4b\xb3\x42\x18\x21\x0f\xf1\x2b\x2e\x3b\xe1\xfd\x22\xd0\xd4\x0b\x30\xa7\xd5\x8b\xc1\xab\xc1\x99\x6f\x50\xa0\x79\x80\x88\x49\xc2\x25\x5d\x74\x5c\x1b\x80\x44\x6e\x8a\x32\x11\x83\x56\xed\x77\x10\x41\x51\x29\x97\xcc\xe2\x38\xb2\x6a\x2d\xb0\xc2\x84\xbb\x5f\xee\xc4\xf8\x22\x6a\xe7\x18\xbc\x0c\xa9\x3f\xe7\x0b\x14\x6c\xce\xdc\x8e\xc6\xf3\xc8\x0d\xc3\xd2\xde\x9b\x6c\x13\x08\xe2\x0a\xfe\x55\x87\x83\x46\x1a\xaf\x3f\xc6\x5e\x07\xeb\xb8\xdd\x55\xed\xbb\x9a\xa8\x23\x7d\x05\x3e\x9c\xc0\x65\x87\xe7\xa3\x67\xb1\x03\x5b\x5c\xd0\xaf\x45\xec\x6b\x0a\xd9\x3e\xa3\x68\x4d\x93\x8b\x4d\x4b\x2e\xb6\x56\x08\x4c\x38\x7a\x2a\x5a\xe0\xed\x0e\xc4\x73\x85\xfb\xda\xb5\x0e\xda\x1e\x2e\x58\x8a\x5b\x2b\xe1\x54\x1e\xd9\x45\xd0\xbf\x4c\x46\x8b\xc4\x2e\xf2\xca\x09\xba\x2e\xa0\x4a\x57\x96\xcd\x0d\x70\x35\x9e\xfb\x97\xa2\x0e\xb1\x78\xa5\x70\x14\xf6\x3b\x16\x68\x8e\x03\x49\x14\x76\xf2\x75\x57\xf1\x46\x0a\xae\xf8\x1a\x29\x50\x90\x7f\xc7\x26\xfa\x4f\xfb\x35\xc5\x8f\xcb\xb5\x5b\x71\xa2\x86\xec\xe4\x49\x3e\xa6\xaa\xe6\x6b\x74\x43\x95\xb9\xbb\xb2\x58\xed\xf1\xca\x13\x8f\xe9\x27\x9a\x0b\xda\x54\x65\x57\xfb\x92\xf5\x06\x10\x12\x82\x6a\x81\xb6\xaa\x99\x5a\x2e\x2e\xad\x10\x3d\xf7\xdc\xb5\x19\x94\xa6\xaa\xc8\xf6\x13\x89\x74\x51\x8c\xe5\xcf\x8f\x58\xf1\xe1\xc5\xe0\x25\xc9\x9d\xb8\x73\x28\x52\x71\xef\xa6\x71\x46\x4d\x61\xae\x79\x0b\xc8\xe5\x63\xa7\x9e\x92\x35\x4c\xb4\x0b\x8a\x92\x89\x2a\xd7\xc5\x63\x5e\xd5\xa5\x35\x6d\x9f\x86\x54\x86\xbb\x7d\x18\x08\x8b\x7d\x29\xf6\x5e\xf9\x77\x9c\x0b\x85\xec\x0b\x34\x40\x2e\x71\x7e\xe7\x38\xbf\xee\xad\xa1\x60\x1a\x74\x04\x91\xb2\x0a\x54\xc0\x43\x69\x24\xdd\xd5\xd2\x88\x11\x09\xdd\xce\x41\x51\xcd\x68\x6d\x55\x6c\xe9\xfa\xca\x8e\x8d\xcb\xd1\xd5\xa7\x68\xf5\x45\x45\x8c\xa4\xeb\xcd\xc7\xd6\x5b\x7d\x62\xfa\x2d\x3b\xab\xbb\x6d\x4f\x67\xcf\xc1\x8e\x06\xbd\x0b\x5e\x43\x64\xd1\x86\xcd\xcb\x76\xd1\xaa\x58\x83\x51\x70\x20\xb5\xc9\x81\x9e\xbb\x15\x8a\xdf\x03\x33\xc2\xaf\x4b\x49\xb0\x1b\x96\x63\x73\x11\xaa\x68\x11\x76\x97\x43\x96\x05\xa0\x3f\xe8\x90\x0b\x33\x29\x87\x06\xb8\x1a\xbb\x9a\x11\x22\x31\xd9\x41\xaf\x6d\x6d\xd2\x8c\xf2\x82\x26\xb6\x91\x8a\x72\x9d\xe6\xee\x48\xa8\xbe\xa6\x59\xa6\xb0\x80\x99\x09\x83\xa0\xad\x10\x05\xd6\x69\xed\xe5\x8d\x05\x61\x25\x5f\xb6\xee\x16\xfd\x60\xd2\x6c\x5f\xda\xb0\x0a\x31\x34\x7e\x34\xd4\x1d\xef\x2b\xcf\x62\xa9\x5b\x2c\x96\x5f\x8a\xbd\xda\x98\x34\x3b\xb2\x36\x3d\xc1\xaa\x10\xee\xc6\x6f\x51\xa6\xc0\x57\x56\xd6\xb8\x96\x54\xc7\xc1\xd9\xd1\x2c\xd2\x99\xef\x06\x45\x11\x9f\x5e\x9a\xc3\x01\xb8\x86\x64\xa2\x3f\x72\x5c\xc3\x13\xbd\xcf\x81\x84\x02\xf4\x74\xf2\x3a\xcd\xda\x17\x15\x2b\x65\xa3\x1a\xa6\xde\xa4\x68\x1e\xfb\xa1\xa8\xf0\x8e\xc7\xf8\x65\xe2\x97\x2b\xe6\x96\x8a\xfc\xae\x70\x87\x32\x25\x96\xd2\x8e\x5c\x10\xf0\x7a\xba\x29\x45\x9a\x30\xba\xd9\x68\x59\xe6\xa7\x82\x9a\xd9\xad\x30\x37\x52\x4d\x17\x96\x90\xef\x75\xa1\x5f\x3f\x3f\x5d\x9b\x43\xa5\xb0\x06\xd8\x47\xd3\x60\x7c\x97\x66\xf5\x15\x6b\xe0\x85\x30\xb9\xbe\x2e\x4a\x5b\xb0\xfd\xc2\xbd\x68\x8f\xaa\x3a\x3e\xaa\x5d\x3d\xed\xec\x28\xf4\x2f\xb5\x95\xfa\xf5\x3d\x24\xb7\x85\x44\x54\x31\x2f\xe4\x5c\x76\xe5\xbb\xe8\x35\xdf\xe9\x66\x29\x36\xcd\x67\xb7\xb4\x9d\xb0\x97\xcd\x66\x62\xf5\x65\xd7\xba\x0c\xc3\xfc\x02\x87\x59\xfb\x61\x2e\xf1\xfd\xbb\x3a\xf4\xcb\xb5\x62\x10\x76\xde\x39\xe7\x0a\x24\xcf\x1d\x25\x0e\xe0\xac\x77\x6f\x44\x34\x50\x6d\x25\xa9\x80\xa4\x3f\xa1\x64\xbc\xbb\x9b\xaa\xca\x96\x10\x87\x32\xec\x3a\xc8\x3c\x8b\x42\x62\xbc\x93\xa0\xdb\xbe\xb6\xab\xcc\x94\xa6\x2e\x4a\x67\xd0\xac\xef\x90\x41\x71\x45\xc9\x4d\x20\x50\xb4\xe5\x29\x23\x56\x40\x93\xa3\x2c\xaa\x8a\x7e\xa3\xfa\xee\xaa\xb0\x77\x3e\xf0\x65\xba\xb2\x23\xba\x9b\x4a\x46\xf0\x1e\x9a\xfc\xa0\xb0\xb9\x74\x61\x74\x6c\xf2\xba\xc0\xd1\x3f\x44\xe8\x27\xf1\xba\xca\xc7\x31\x8e\x78\x7f\x32\x4f\xd9\x34\x0f\xb0\x2c\xc5\x6f\x5e\x31\x43\x2f\xa4\xe7\x21\x68\x37\xc9\x09\x69\x66\xdb\x08\xdc\x61\x71\xd5\x37\x33\x89\xaf\x90\xe6\xae\x25\x14\x45\x7f\x4f\x14\x9f\x7d\xc8\xe0\x2b\xc2\x61\xfa\xe4\x89\xa0\x70\x3f\x91\x2c\xce\xf1\x47\x55\x3b\x08\x18\x7d\xfc\x45\xfb\xc9\x51\x24\xa5\x0f\x57\x3a\x67\x44\x9c\xef\x7b\x42\xce\x6f\x9f\x26\x0b\x36\x04\x2a\x42\xf3\x96\x38\x16\xd7\x73\x57\x8d\x0f\x12\x12\x8d\x03\x26\x23\x11\x55\x03\xc1\x34\x26\x2c\xc6\x6d\xc4\x3b\x68\xe9\x8f\xc0\xb0\x95\x61\x93\x3e\xa4\xff\x3f\x7b\xef\xb6\xdc\x36\x92\xae\x0b\xde\xe7\x53\xe4\x56\x4c\xec\x12\x23\x20\xd8\x92\x4f\x55\xe5\x1d\x3b\x82\x96\x28\x9b\xab\x65\x51\x4d\x52\xe5\xf6\x4c\xcc\x05\x48\x26\x45\xb4\x41\x80\x0d\x80\x52\x71\x5f\xcd\xb3\xcc\xdd\x7e\x8e\xf5\x26\xf3\x24\x13\xf9\x1f\x32\xff\x04\x40\x4a\x76\x1d\xd6\xea\xd5\xf6\x4d\x77\x51\x24\x90\xe7\xfc\x0f\xdf\xff\x7d\x45\xe6\xa8\x85\x83\x05\x18\x31\x8e\xa6\xd3\x90\x39\x18\x9a\x54\x42\x13\xae\x99\xd5\x80\x93\x8d\x6c\x5f\x7b\xfa\xbb\xe7\x38\x9e\x9c\xdc\xd4\x00\xea\x81\x2b\x5b\x6d\x4c\x99\x16\x0b\x6c\xb9\x86\x6b\x85\x62\x86\xd6\x7b\x3a\x7e\xd1\xd3\x3b\x93\x94\x95\x58\x72\x2f\x83\x5d\x34\xb6\x5e\x33\x24\x08\xe8\x38\xe8\xba\x4e\xf7\x1b\xbe\x10\x25\x83\x5b\x44\x03\x34\x16\x46\x55\xb5\x0e\xb1\x0e\xce\x15\x39\x69\x40\x3b\x9e\x2e\x03\x99\x23\x5e\x13\xaf\xe2\x17\xb4\x12\x4c\x3b\x6b\x05\xf5\x8e\x98\x95\x82\x0d\x8d\xb0\x37\x21\x30\xd8\xa4\x3e\x56\x29\xb2\xa8\xc2\xf1\x9d\xe6\x4c\x8c\x91\xe6\x90\xb3\xa9\x91\x6d\x74\x56\x62\x16\x83\x8e\x2a\x5d\x19\xf3\x05\xf7\xdb\xdf\x81\xc8\x13\x4e\xfe\x2c\x35\x4b\x70\x72\x99\xdb\x6a\x59\x20\xeb\xf6\x72\x9b\x89\x92\x2f\x60\xf9\x6c\x1d\x95\xba\xed\x3a\x29\xe1\x3a\xc9\x47\x6e\xf3\xbf\xdb\x25\x6d\xf2\x32\x9d\xaf\xd6\x70\x88\x61\x85\x7a\x13\xb5\x9b\x25\x0f\x3d\x38\x00\x40\x82\x33\x71\x72\x59\x7e\x09\x0b\x1a\x2d\x01\xf8\xf3\xd8\x0e\x4f\x97\x4a\xc7\xa2\x7a\x24\x3c\x2c\x56\xd5\x2b\xc7\xa9\xe4\xd6\x46\xdf\xb1\xe1\x28\x35\xc4\x53\xd7\xdc\x73\xfc\x4d\x70\x68\x0b\x03\x4b\x9c\x64\xb6\x13\xc6\x1a\x48\xf6\x91\xae\xe8\xc0\x3f\x52\x5e\x33\x7c\xc2\xd8\x63\x1a\x69\x0c\x2a\x93\x65\xa6\xb4\x87\x08\x26\x99\x7c\xd7\xee\x93\x2c\x5d\x08\x42\xe4\xd9\x4e\x91\xf7\x05\x57\x6a\xf0\xac\x0e\xd3\xcf\x5d\xc7\xb2\x07\x01\xe9\xb7\x12\x7f\x71\xea\xfd\x17\x2e\x26\x60\x7b\xff\x89\x42\x02\xaa\x7d\x99\xb4\xf5\x8f\x5a\x87\x43\xae\x8f\x12\x6b\x96\x04\x7c\x17\x76\x05\xb9\x48\x83\xe0\xea\x75\xb0\x23\xa2\x86\x31\x8b\x88\x61\x21\x51\x83\x67\xd7\x2d\xc9\xa8\x13\x77\x4a\x4f\x4f\x4d\x75\x00\x53\x9e\x5a\x33\xce\xc0\xf1\xb9\x30\xd6\x1f\xaa\x22\xb5\x36\xe5\x7c\x95\xe4\x35\xee\xeb\x65\x5a\x93\xb3\x21\xcc\x67\xba\xb2\x34\x18\x6c\xf9\x09\x6d\x95\x34\xbf\x43\x7a\x09\xe4\x4a\xd2\x65\x5a\x7d\x51\x89\x8b\x01\xfe\x63\x8b\x7c\xba\x42\x08\x8d\x43\xa1\xfb\xda\xe6\x51\x81\x93\x95\x5d\xfc\xaa\x0b\xc2\x0b\x13\x60\xa8\xfd\x29\x9e\x13\x48\x9c\x06\xae\x2c\x06\xdd\x8e\x21\x73\x11\x46\xd0\x7a\x2a\xa9\xaa\xed\xda\x04\x09\x1b\xc4\x14\x73\x74\x05\xf1\x12\x90\x2d\x2e\xcd\x26\x49\xd1\xa5\xf5\x12\x9a\x54\xe2\xe3\x43\x48\x32\x4c\x85\xec\x3b\xa9\xf5\xf6\x00\x90\x69\xa7\x33\x07\x24\xb7\x57\x36\x0d\xb1\x3a\x58\xcd\xba\x94\x48\xe5\x20\xe5\xc9\xf5\xaa\xdd\x8b\x8d\x22\xb3\xe2\x2f\xbe\x5d\xb8\xb2\xdf\xc4\x02\xff\xa4\x41\x72\x88\x35\x11\xd4\x2d\xfc\x2c\x2f\xf4\x3c\x2d\xe7\xdb\x35\xc6\xa9\xd9\xe9\xa1\x3f\x21\x16\xb4\x5e\x19\x58\x80\x0c\x8f\xac\x8b\x52\x9e\x90\x2a\x37\x77\x59\x7a\x67\xf2\xb9\xe9\x45\x0e\x38\x19\x35\x90\x93\x9e\xea\x3e\xb8\xa3\x31\x3e\x58\xe4\x46\x3f\xac\x0a\x11\x76\xe9\xc0\xff\x07\x24\x41\x04\x64\x9a\x19\x88\xd1\xa1\xcf\x0b\xd7\x23\x3e\x50\x31\x0e\xd4\x23\x42\x21\x82\x97\x64\xb0\x8f\x80\xab\xcb\xfe\x7f\x64\xda\x26\x58\x88\x9d\x29\x3e\xda\x69\x52\xe6\xab\xc4\x76\xc6\x94\x9e\x75\x2a\xea\xa4\x9d\x92\x57\x42\x66\x97\xd6\xa6\x2c\x96\xa9\xf5\xfd\xb2\x02\x85\x3a\xee\x8a\x62\x61\xef\x9f\x48\x81\x75\x00\x04\xfd\xc9\x1d\x14\xfe\x93\xe1\xb0\x24\x37\x1c\x90\x30\x19\x93\x52\x3b\xe8\xb1\xc3\xfc\xb3\x8c\x1b\x31\xf4\x29\xd7\x66\x78\x35\x24\x74\xec\x41\xee\xfc\x2d\x64\xd3\xc2\x09\xf0\x07\x2d\xe6\x54\xcd\x82\xf7\x23\x06\x57\x70\x71\xb0\x75\x45\x4f\x76\x85\x6d\x72\x29\x89\xd8\x68\x9b\x56\xca\x6b\x6f\x00\xbd\xa4\x49\x90\xa0\x00\xb9\xc8\x21\xee\xff\xf7\x6d\xb9\xa3\x50\x2f\xc0\xcf\x9d\xdb\xc5\x20\x2f\xbf\xaa\x38\x8f\xda\x12\x5b\x04\xf3\x80\xa3\x2d\xc4\x49\xe8\x1b\x19\xeb\x89\xb5\x72\x64\xa4\xb6\x22\x63\xc8\x5e\xc1\x98\x29\x66\xa6\x32\xc4\x06\x87\x3d\xf4\x0b\x65\xef\x3a\xa1\x14\x16\x50\x7b\xf1\x73\xc2\x38\xb2\xcf\xf9\xf3\xd8\xb8\x08\xe0\x8f\x76\x77\xb2\x4f\xa7\xd4\x7e\xe2\xb8\x86\xcc\x15\xa2\xb3\x66\x65\xb1\x05\x0b\x26\x07\x6f\x8a\x0e\xb5\x6d\x59\x23\x89\x75\xc8\x1e\xe7\x75\xae\x90\x7d\x33\x01\xde\xed\x94\x0a\x25\xec\xe0\x6d\x4a\xdb\xdd\x8d\x3d\xac\x20\x7a\x5d\x2c\xf5\x6c\x5b\xa5\xb9\xa9\x50\x4c\x98\x06\xd7\x35\xaf\x93\xc9\xcf\x93\xf4\x25\x75\xd0\x00\x7f\x09\x02\xd2\x9d\x67\x35\xc5\xa2\x95\x65\x96\xce\xeb\x93\x62\x79\x42\xf3\xc9\x92\xf5\xfa\xba\xa8\x57\x5d\x9e\x14\x4a\x37\x6e\x4a\xb4\x57\x12\xb7\x66\x44\x38\x15\x8d\x44\xe9\xaf\xe2\x24\x4a\x9f\x16\xa7\xe1\xa7\x80\x7a\x92\x3c\x3b\xb4\x9b\x7e\x8a\x4f\xad\xd7\xc7\x54\x98\xc3\xda\xac\x31\x34\xd6\x75\x79\xb5\x69\x35\xa3\x23\x24\x54\x4c\x30\x0d\xaf\x59\x14\x18\xdd\xa2\x97\x3f\xaa\xf3\xf8\x32\x1e\xc7\xd6\x27\x7d\x7e\xaa\x8f\x47\xf3\x3a\xd6\xa7\x3f\xfd\xf4\x0a\x8f\x51\xe2\xe3\xd4\x4f\xe0\xe3\xcc\x17\xea\xe0\x57\x74\xa0\x81\x16\x75\x31\x78\x32\x1b\x83\x6f\xd5\xe9\x59\x7c\x76\x7a\xa6\x8f\x27\x66\xc3\xed\x8a\xed\xe1\x6d\xdb\x85\x64\xae\xf5\x4a\xbf\xfc\x51\x87\x5f\x07\xb2\x73\xfe\x50\x9d\x9d\xbd\x89\xdf\x9c\x3d\x3f\x3b\x39\xb5\x1e\x8f\x5d\xb0\xda\x7d\xf4\x52\x1f\xff\xdb\x36\x37\xdc\xe3\xa7\xf1\x80\xee\xa9\x0a\x43\x76\x50\x6b\xa2\xb4\xf8\x41\x1b\xaa\xf6\x3f\xc5\x67\xf6\xe2\x9d\xc0\x73\xd2\xbb\x5c\x0f\xd7\xeb\x6d\x0e\x37\xe2\x94\xf5\x24\x38\x21\xd2\xd0\x95\xa8\x90\x6f\x12\xe6\x93\x68\x28\x0e\x40\x68\x14\xe5\xc9\x1e\x12\x4a\x08\xa4\x76\x3e\xf8\xad\x29\xbd\xb5\x85\x99\x26\xe6\xcf\xb5\x48\x84\xfb\x1d\xd1\xe4\xdc\x14\xbd\x7a\xa1\xcf\x11\x11\x69\x6f\xf9\xe4\x01\x1a\xfc\x8b\xc9\xb7\x46\xa9\x9f\xe2\x17\xf1\x29\x83\x7e\xe0\x26\x95\x3d\x83\xc3\xa2\x62\x5a\xc7\xba\x49\xaf\x19\x39\xd3\x7b\x8b\xe2\x63\xfb\x6c\xb7\xcd\xb6\xac\xb6\x80\x17\x2c\xec\x8e\x14\xb9\x24\x57\x4b\x01\x7d\xc5\x0c\x91\xc2\x37\xfa\x76\x44\x5d\x21\x99\xc6\xf1\x52\x23\x0f\xa8\x73\xfe\xe1\x19\x90\xa1\x26\x4f\xe3\xf0\x79\xe2\xd1\x12\xc9\x02\x12\x17\xee\xa4\x5f\xa4\xd5\x06\xb0\xe4\x7b\x0f\x5d\x86\x6c\x3f\x95\xac\x13\x22\xd5\xed\x14\x1b\x91\x69\x66\x05\xf2\x99\x31\xdf\x26\x7c\x31\xc6\x99\x3a\x0b\x66\x2a\xd7\x89\xbd\x03\x77\xdd\xd4\xa7\xed\x85\xea\xa6\x4b\x91\x69\xf9\x7b\x4c\x97\x72\xcd\x78\xca\x2c\x71\xa3\xec\xe0\x2f\x29\x9f\xc4\x31\xaf\x48\x3d\x36\x05\xfb\xef\xbd\xc6\x14\xa8\x27\xf1\xa5\xee\x1f\xf8\x4f\x09\x08\x5d\xd4\x45\x1e\xa9\x8b\xf8\x9c\x46\xff\x45\x03\xe3\xd0\xf6\xad\xf9\x0e\xb2\x5b\x0e\x63\x8e\x32\xde\xd2\x50\xf4\xf7\x91\xb6\x57\xf1\x99\xd8\xad\x2f\xf5\x64\xbb\x29\xcd\x3a\x99\xef\x08\x11\xeb\x1e\x4b\xea\x8b\x59\x6a\xb6\x50\xc9\x8e\x97\x2f\x89\xe5\x55\x91\x08\x99\x30\xa3\x72\xdf\x9e\x8d\xa8\x70\xa2\xc6\x22\xc5\x74\x61\xaf\xfa\xca\x74\x7d\x4f\xcb\xef\x39\x5c\xec\x3c\x4b\xe8\x5c\x73\x9b\x06\x51\x52\xc9\x62\x01\xce\x69\x25\x0f\x0e\x8f\x4b\x6c\xdf\x37\xfb\xa0\x5e\xa7\xcf\x1b\x6c\xcb\x0d\x3c\xf0\xd7\xb0\x2d\x33\xc2\x46\xb0\xd9\x2a\x56\x39\xfb\x4d\x84\xcb\xb8\xe6\x0f\x11\x2e\xe3\x7d\xb3\x27\x43\x4f\x75\x3c\x3a\xad\xb5\x78\x6a\xac\x3a\x89\x5e\x39\x00\xf2\x75\x54\xaf\x6a\x1f\xd5\xab\x26\xaa\xd7\x48\x18\xe5\x4c\xb5\x04\x41\x43\xfc\x4d\x98\x6c\x75\xd9\x84\x06\x77\x80\x9d\xaf\xd3\xbd\x5a\x34\xae\xa6\xf8\x34\x3e\xd5\xd7\xe6\xc1\x7d\x0f\x2f\xd2\xd1\xc6\xb8\xc0\xea\x20\xa3\xc5\x3d\x35\xf3\x55\x5e\x64\xc5\xdd\x4e\xd2\x4f\x1c\x1f\x8d\x26\x83\xe9\x51\x4f\x1f\xc3\xf0\x96\xd9\x4e\x23\x4a\x28\x41\xb9\x1d\xf9\xa8\x8b\xf4\x2e\xb5\x06\xf9\x2f\x05\x9c\x11\xfe\x29\x3d\x4e\x04\x55\xb5\x79\x48\xca\x45\x3b\x16\xe6\xf9\xab\x24\x95\x29\xef\xbb\xd3\xd3\xf8\x05\xc4\xa2\x01\xe7\x13\x2a\xf6\x3b\xc5\x70\x7c\x34\xb0\x20\x04\x35\xdf\xa4\xde\xc2\xa0\x88\x6a\xd5\x14\xe2\x69\xf2\xec\x26\xf3\x95\xab\xdc\xe7\x73\xed\x2e\xb5\x4e\xdb\xa3\x42\x3c\x7e\xd8\xb9\x48\x0b\x5e\x10\xce\x40\x07\xbe\xf4\xa9\xc8\x38\xfb\x1f\xbe\x3e\x22\x50\x10\x22\xe9\x42\x07\x0b\xe7\x9a\x02\x50\x14\xa0\x54\x5b\x27\x88\xcc\x55\x51\xa8\xb0\x8a\xe2\x09\x4a\x3b\x1d\xe3\x2f\xc7\xe0\x05\x81\xb4\xcd\x42\xf4\x9e\x2e\x50\x42\x8a\xba\x43\x09\x8a\x66\x02\x73\xa2\x89\x1b\xb7\xbf\x7a\xa0\x4b\x11\x7f\xad\x12\x98\x4a\x09\x96\xc5\x1b\xdb\x75\xad\x03\x97\x0a\x38\x72\xaf\x76\xca\x13\xdd\x3a\x83\xb0\x99\xa5\x01\xc6\x34\xd9\x51\x0c\x92\x02\x9e\x10\x23\x5b\xcc\xf5\xc2\xae\x30\x73\xac\x75\x8c\x8e\x2b\xe4\xc1\xec\x31\x15\x6b\x41\xa3\x5d\x8b\xf8\x27\x08\x13\xae\xda\x92\xa6\x3d\x54\x93\x78\x29\x40\xb9\xf9\x5d\x1b\x34\x38\x25\x7e\x85\xa7\xa0\x4c\xfd\xb4\x38\xac\x9e\x58\x9d\xdd\xa5\xfc\x87\x1f\xcd\x58\xa9\x6a\x2f\x4c\x7a\x8f\xf8\x94\x44\x1b\x05\xd7\x35\x73\x98\xbc\x6b\xdd\x17\x8c\xce\x60\xe6\x8f\x58\x0f\xfe\x06\x42\x21\xba\xaf\x4f\xda\x09\x24\xfe\x19\xf1\xe4\xd2\x15\xdf\xec\x63\x5a\xed\x53\x29\x80\xff\xe8\x60\xa6\x8a\xd4\x7d\x7c\x16\x9f\xda\x23\xf3\xe6\xea\xa8\x87\x17\x5d\xc0\x28\x3d\xba\xb9\x02\xe6\x90\x50\x87\x6e\x21\x32\xdd\xcb\x34\xc3\x65\xab\x04\x48\xde\x9e\x7a\x49\xfd\xf3\x93\xe9\x7f\x1c\x10\x09\x04\xfc\x19\x8a\x04\xb1\x9e\x2a\x2d\x39\x22\xb7\xd9\xe2\xad\xe4\xb9\x73\x83\xb0\x32\xb4\x44\x79\x90\x90\xc7\xeb\xb5\x7e\x05\x86\x1b\x5c\x16\x26\xbe\x8b\x23\xf2\x22\xac\xd3\x4d\xec\x5b\xf0\x30\xc4\xed\x97\x26\x33\xf7\x76\x17\x63\xe8\xaf\x28\x77\x3d\xce\xc9\x08\x04\x8d\xa3\x53\xc8\xd2\x2f\x86\xa2\x56\x45\xf1\xc5\x6d\x71\xbb\xf3\x31\x61\xef\x4d\xc2\xc5\x42\x62\xdb\x10\xba\x5a\x7b\xa4\x50\xb1\x94\x99\x25\xae\xe7\x8e\x15\x2f\x95\x77\xfa\xe4\x49\x6c\x34\x47\x8f\xaf\x9b\xa7\x91\xda\x44\x68\x90\x42\xc8\x81\x99\x20\xba\x56\x95\x86\x55\xf5\xaf\x49\x7c\x18\x3f\xbb\xcd\x79\x5d\xff\x51\x24\xc0\x8f\xf1\xff\x9e\xbd\x69\xf2\xff\xbe\x78\xf5\xea\xf5\x77\xfe\xbf\x3f\xe3\xdf\x94\x40\x44\x90\x17\xc3\xec\x87\xc9\xe7\x60\x6c\x81\xb4\x0a\x19\x0f\x44\xbd\x4e\x8a\x21\x10\x96\xc1\x3d\xb4\x28\xd6\x09\xc4\x97\xfa\x98\xc7\xe0\x47\x81\xb9\x2d\x29\x7d\xc9\xac\x89\x98\xee\x77\xbd\x81\x83\x98\x0a\xfd\x1b\x55\x0c\x82\xee\xd7\xa5\x08\xd3\x3c\x10\xbe\x47\x16\x11\x02\x4d\xd3\xe3\x16\x7a\x06\x98\xc0\xc8\x25\x42\xc8\xf3\x8e\x44\xc2\x80\xd3\x78\xfe\x13\xb4\x7e\x08\x5d\x03\xe0\xaa\x18\x72\xc2\x61\xec\x9c\x11\xae\xc5\x5d\x9e\xfe\x2f\xc9\x9b\x8a\x52\xa9\xe0\xd5\x43\xc2\x0a\x5a\x05\xff\xcf\x97\x05\xfa\x50\xa4\x41\x36\xf7\x20\xa7\x31\x17\xdc\xf0\x08\x27\xe6\x90\xb6\xfb\x5d\x30\xea\x8a\x46\x5d\x7f\x32\xe8\x6c\x61\xfa\xcb\xb8\x88\x02\x57\xe8\x20\xc1\x86\x0f\xa5\xe1\x9c\x25\xb6\xcd\x50\x18\x90\x2f\x38\x8e\xb0\x30\x75\x99\x72\x44\xac\xd8\x96\x7a\x65\x52\xca\x57\x57\xdb\xb9\x75\xee\x8a\xb2\x82\x17\x62\xb5\x6a\xeb\x95\x75\x61\xdd\x32\x7b\xa5\xde\x9b\x12\x70\x54\x90\xd0\x37\x59\x9a\x5b\xbf\x1b\xc0\x01\xb6\x57\x1b\x53\x6e\x4c\xbd\x4d\x29\x11\x0c\xa2\xa0\xe0\xf3\x62\xa4\x68\x5b\x6f\x4b\xc7\xe8\xc4\x31\x90\x86\x63\x1d\x0c\xfd\x7f\x21\xfa\x65\x22\x5a\xd6\x7b\x88\x96\xd5\x63\x9c\xca\xfa\xa9\x9c\xca\xea\x89\x9c\xca\xfa\x71\x4e\x65\xf5\x64\x4e\x65\xdd\xe4\x54\x06\xee\x1b\x28\x28\xc1\x64\x1c\x46\x04\x14\xb1\x35\x82\xd5\x6f\x57\xc0\xff\x58\xd5\xf5\xa6\xfa\xf9\xd9\xb3\xad\xbb\xa8\xac\x4d\xf6\x3f\xff\x25\xaf\xeb\xdf\xfd\x9f\xbd\xff\x53\xeb\x28\x24\xd9\xc9\xe5\x68\x32\x39\x41\xf7\x29\x2d\xf2\x93\xd3\xf8\xf9\xef\x63\x12\x3c\x72\xff\xbf\x3e\x3d\x3b\x6b\xdc\xff\xaf\x5f\xbf\xf8\x7e\xff\xff\x29\xff\xa6\x18\x55\xc7\x15\xa0\xed\x0a\x20\x54\x3f\x44\xe7\xbc\xd0\xd0\x73\xb8\x11\x25\x78\xad\xde\x2b\x47\xc7\x11\xa4\xcc\xd5\x0f\xb6\xaa\x0b\x82\x42\x61\x17\x47\xf6\x77\xfe\x22\xa9\x93\x88\x65\x9d\x83\xf4\x9d\x3e\x9e\x17\x40\xbb\x04\xf2\x5a\xf0\xb0\x23\x17\x69\x39\xd2\x22\x59\x4b\xde\x71\xf0\x75\xef\x07\x4a\x01\x14\x21\x47\x20\x1f\xa7\x5b\xaa\x4a\x21\x55\x7a\xa5\x1f\xd2\x6a\x65\xc7\x62\x99\xcc\xd3\x2c\x85\x7c\x07\xdc\xe0\xc5\xc6\x94\x9c\x8d\x15\xc4\x8d\x4f\xea\x5f\xcb\x6d\x75\x61\x60\x00\xe2\x54\x9b\x82\x68\xb4\xd0\x18\x62\x7e\x0f\x0e\x6a\x70\xe4\x60\x34\x19\x9e\x24\x1b\x00\x0b\x39\x7d\x6c\x6b\x78\xdc\x11\xa2\x86\xfc\xa1\xcb\xc9\xa5\x35\xa1\xc0\x66\x0b\x47\xf6\x68\x84\x61\xf6\xd1\x64\x62\x5d\xed\x4f\x06\x31\x94\xcb\x82\xf4\x67\x98\x4a\x8b\x60\xbf\x44\x9a\xb8\x67\x5c\x9b\x79\x3e\xfb\x9b\x6d\x65\xf6\x2a\x44\x86\x09\x4e\xdf\x92\x48\x94\xb6\xe4\x55\x8d\xf5\x05\x8c\x15\xd1\x55\x7a\x97\x27\xd6\x80\xa8\x70\x84\x75\x55\x97\xdb\x39\x7c\x20\xa4\xf1\xd3\xfc\x9e\xdd\x69\x64\x2b\xac\x5c\x84\xb8\xdc\xe6\x08\xb8\xac\x8d\xcf\x01\x01\xb2\x13\xdb\xb5\xd6\xc7\x88\xf0\xb2\x9f\x45\x61\x2c\xec\x07\x70\x4b\x6b\x53\x2e\x93\xb9\xa9\x8e\x7a\xc8\xff\x7b\x9c\xf6\x00\x24\x36\xf1\xdf\xf2\x5f\xc2\xc2\xde\x46\xf9\x8c\x03\xf9\x34\xc2\x7f\x1c\xe1\x10\x63\x01\x71\xf0\x4d\x4a\x66\x79\x84\xdd\x08\x4b\xc3\xdd\x8e\xf3\xbf\xb3\x9f\x40\xc1\x12\x26\x5c\x09\x06\x1c\xae\x5a\x0f\xf3\x41\x24\x30\xc2\xea\x91\xd7\x81\x1b\xbc\xb7\x61\x32\x80\x4c\xca\x8c\xf9\x4e\x76\xbb\x39\xc9\x66\x3d\x33\x0b\x2c\xcf\x27\x61\xa3\xfd\x43\x46\x12\x8b\x49\x0d\xb6\x63\x9d\xae\x83\x00\x58\x73\xeb\x4a\xe2\x8f\x8e\x2a\xc0\xa4\x72\x99\xff\x46\x17\x8e\x31\xce\x0b\xf5\x8a\xae\xa4\x14\x56\x6c\x06\x98\x17\x93\x0b\xa6\x4d\x66\xe0\x6d\x75\x6c\x7f\xc3\xa8\xa4\x1a\x58\x9a\xa6\xc1\xab\xff\xc3\x56\x88\x64\xbf\xf8\x96\xf5\xe1\x23\xad\xa2\xfd\x33\xd7\xbc\x16\x29\x50\x6b\xb4\x44\x25\xba\x87\xfd\x42\x22\x92\xf2\x5d\x69\xe9\x89\x7c\x88\xd9\x21\x5d\x32\x5b\x2d\xf1\x35\x10\x72\x5d\x4a\x6c\xb5\x5e\x24\xd6\x67\xb3\xbd\x98\x11\xdb\xdf\xe4\x30\x35\xd2\x6c\xba\x9b\xd4\xb4\xa7\x87\x4b\x4c\x94\x89\x87\x63\xa1\xb3\x83\xb0\xa1\x1e\x2d\xcd\x8f\xa7\x31\x17\x8f\xe5\xc3\x2e\xdc\xbc\xe4\x10\x3b\x5e\xc7\x48\x1e\xa7\xcf\xa4\x2f\xbd\xf7\x44\x6d\x3c\x34\x48\x97\x2d\x8c\x59\x73\xd1\x3a\x8e\xa5\xcb\xca\x89\x9f\x74\x8f\x52\x63\x29\x8a\x14\xc8\x57\x1e\x09\x62\xd5\x36\xde\x4c\x70\x3c\xa6\xe4\x8c\x34\xa0\x4c\xc0\x9b\x34\xbf\x26\xf6\xaa\x84\x61\xeb\x82\x29\x02\x51\x0d\x96\xe7\xd9\x51\xda\xe5\xc9\x9a\xfe\x33\x4b\x73\x57\x2d\x31\xf1\x3e\xf7\x1d\x42\x3e\x1b\x97\x10\x55\x67\xc0\xd6\x40\x7c\x56\xe3\xca\x07\x9a\x59\x78\x56\xd8\x43\x2a\xa2\x9f\x15\xf5\xaa\xa1\x71\xe4\x78\x94\x1d\x24\x50\x52\x66\x34\x59\x4d\x9c\x6d\xc3\x7e\x3e\xdd\xac\xe9\xbd\xf1\xb2\x72\x9e\x0c\x1c\x38\xf4\xef\x8b\x74\xc1\x00\xe4\x45\xb1\x9d\xd5\x91\x30\x1a\xf0\xb0\x6b\x5a\x0d\x8f\x5a\x0c\x91\x98\x05\x6e\x8a\x03\x4b\x2f\x9b\x22\x4a\x51\xc3\x30\xc3\x5a\xc8\x2e\x73\x81\x69\x83\x05\xc3\x02\x2c\xc1\x15\x6a\x0a\xdc\xa7\xc5\xb6\xca\x76\x08\xe4\xac\x8a\xbd\x0d\x76\xad\x64\x3c\x68\x5e\x3c\xe8\x85\xd9\x94\x06\x61\x10\xc1\x39\x93\x17\x3a\x2b\xf2\x3b\xac\xba\xc1\x18\xcf\x82\x64\xf0\xdc\xc3\xed\xd3\xda\xb0\xbc\x6e\x8b\x87\xc9\xdb\x98\xc9\xab\x91\xf1\x39\x78\x3c\xe5\x5d\xa7\x4d\xd1\xde\x56\xf2\xc4\x14\xef\xeb\x6e\x90\x80\xdd\x63\xe9\x46\x03\xc3\xd5\xd5\x12\x40\x37\x50\x5d\x09\x5b\x71\x55\xc7\x29\x2a\x76\xe7\x77\xb7\xfc\x9f\xea\x5f\xfc\xec\x66\x72\x52\x94\x27\x37\x17\x97\x27\xcb\x22\xaf\x85\xff\x7f\xf6\xfc\xf4\xcd\xf3\x1f\x4f\xdf\xfc\xe6\x20\xc0\x23\xfe\xff\xf3\xd7\xaf\xdf\x34\xfc\xff\x37\xcf\x5f\xbd\xfc\xee\xff\xff\x19\xff\xa6\xe0\xbc\x51\xf4\x15\xc0\x67\x66\x81\x9c\x6d\xee\x7c\x73\x79\x44\xd4\xba\x17\x86\xa3\xbf\xf7\x81\x4f\xfc\xf2\x72\x30\x1e\xe9\xf7\x83\xeb\xc1\xb8\x7f\xa5\x6f\x6e\xdf\x5d\x0d\xcf\x5d\x82\xd2\xd1\x89\x23\xcd\x64\x4d\xd4\x70\x20\x1d\x37\xbc\x7e\xdf\x13\x32\xd8\xde\x99\x34\xbf\x9a\x35\x2c\xc6\x9f\x95\xea\x5b\x43\x9b\xca\x18\xb4\xf1\x31\x0a\x71\xc4\xa5\x41\xc9\xac\x48\xa6\x56\xd4\xc9\x4d\x59\xdc\x95\x09\xf0\x92\xea\x44\xdf\x14\x55\x8d\x0c\x04\xf6\x20\xbc\xb9\xb8\xc4\x16\x31\xb1\x77\x95\x56\x35\xd1\x5d\xb2\x87\xde\xa0\xd8\x07\x05\x18\xb4\x18\x89\x85\x19\xef\x89\x4d\x99\x62\x71\x3e\xd9\x01\x69\x05\xaf\x07\x7a\x92\xa4\x5c\x40\x1d\xa4\x67\xfe\x77\x24\x8a\xa2\x92\x6c\xb3\x41\x25\x71\x8e\xce\xf3\xfb\xd3\xba\x32\xd9\xf2\x77\x3c\x64\xe3\x67\x97\x49\x5a\xfe\x87\xea\x7f\x3e\x7f\xf1\xba\xa9\xff\x75\xf6\xea\xf4\xf4\xfb\xfe\xff\x33\xfe\x01\x33\x29\x9b\x11\xff\xc3\xab\x7d\x0e\x7d\x48\xfe\x7f\x2a\x75\x5b\x11\x14\xaf\x26\xce\x7e\xc8\x19\x7a\x47\xb4\xc9\xaf\x07\xf6\x79\x55\x97\xb4\x68\xad\xd7\x8e\x24\x5c\x5e\x21\x1c\x9e\x12\x69\xe6\x40\x6b\x12\xeb\x6f\x2b\x53\x85\x6f\x23\xae\x04\x07\x6d\x53\xfe\x0d\xb1\x52\x4e\x1e\x7b\xfc\x33\xa6\x67\x46\xe3\xbf\x4c\x40\xc0\xaa\x99\xfb\xf9\x6e\xa1\xc8\x7f\xf1\xb3\xfe\xcd\xe4\xea\xe4\x34\x3e\xfb\xe3\xce\x80\xc7\xf4\xff\xce\x9e\xbf\x6e\xee\xff\xd7\x6f\xce\xbe\xef\xff\x3f\xe3\x5f\x7f\x63\x1d\x66\x02\xc4\x10\xd4\x86\x8f\x83\x5f\x4c\x19\xeb\xd3\xf8\x4c\xa9\xd3\x98\x65\x42\xde\x4a\x39\x33\x72\xc5\xaf\xc4\xad\x95\x1a\xe7\xdd\xd3\x65\xeb\x01\xd6\x40\xef\x88\xae\x26\xbe\xf6\x9c\x90\xd3\x24\x91\x7e\x7c\x04\x1f\x1f\xf5\x88\x0a\xbb\x83\x66\x00\x3c\x7b\x78\x02\x5f\xc2\x0e\xa8\x84\x95\x5b\xe0\xa6\xe2\xd3\xa1\x7a\x2d\x5d\xc2\x3d\x8a\xb5\x75\xbe\x41\x50\x84\x98\x54\xfa\x28\x50\x32\x3f\x52\x5c\xe8\xe2\xe2\x59\x08\xf3\xda\x8f\x53\x4b\x2b\x7d\x60\x08\xd5\xbd\x4b\xa0\x9c\x81\x6c\x49\x07\xde\x93\xfc\xf4\x9e\x3e\x76\x32\x4c\xbd\x58\xf7\x65\x64\xd2\x8f\xf1\xcf\xa4\x20\xd7\xf7\x55\x80\x44\xa2\x82\x32\xf0\xa8\x12\x82\x5c\x53\x5c\x15\x97\x80\x83\x6f\x4a\xc3\xe3\x82\x07\x2b\x58\x4a\x05\x94\xf0\x62\x1a\x27\x82\x60\xf5\xdc\x49\x34\x20\x33\x00\x01\x1f\x10\x41\x0a\xf0\x6d\xc7\xa4\xc0\x65\x49\x8b\x08\xe0\x5e\x80\xb1\x02\x44\x46\x95\xde\xe5\x68\x83\xe1\x1b\x81\x00\x08\xf9\xe8\xc1\x7c\xba\x37\x65\x03\xba\xde\x14\xd5\x35\x2a\x98\x18\x94\xfa\x79\x0c\x77\x1e\x2a\x66\xb4\x82\x61\x48\x8f\x19\x4a\xd7\x73\x94\x48\xd2\x1f\x78\x7e\xad\xf6\x08\x52\x65\x8a\x12\x03\xa8\x7f\x8f\x01\x54\x30\x80\xba\x3d\x80\xf0\xc2\xc7\x87\x2f\xcd\x3b\x38\x9b\x23\x55\x27\x5f\x4c\x8e\x0c\x86\x44\x24\x21\xc3\x4a\x18\xd6\x92\xe3\xd1\xa1\x0f\x28\x15\xb2\xb0\x80\x15\x84\xd6\xda\xaa\x84\x54\x25\xea\x2a\x98\xeb\x02\x46\x49\xe8\x12\x86\xad\x83\x77\xbd\xf0\xf2\x7c\xb0\x01\x85\x4c\x50\x63\x01\x34\xb4\x47\xea\x50\xd9\xc0\xae\xe2\x70\x66\x39\x80\xd4\xf8\x1d\x2d\x0a\x51\x31\xbf\x27\x68\x06\xd2\x81\x17\x66\x93\x15\x3b\xd7\x2a\x5a\x62\x82\x72\xb8\xbb\x08\x0e\x1a\xe0\xc3\x23\x6a\xc9\x45\x64\x10\x29\x04\x59\x0c\x53\x99\xa4\x9c\xaf\x30\x0a\x68\xee\x4d\x56\x6c\x90\x7a\x63\xfc\xdf\x2f\x7a\xdc\xca\x1b\x2e\x18\xbe\x25\x88\xb6\x72\x42\x44\x5d\xe1\x4d\x09\x29\x72\x6f\xda\x13\xe6\xe1\x7a\x7b\xb7\x0b\x78\x05\x71\xd9\x2b\x1c\xdb\xe5\x5d\x92\xb3\x5e\x34\xe1\xaa\x6d\x5f\xc6\xff\xfd\x42\x86\x9b\xb9\x99\x0a\x9b\x59\xe9\x07\x93\x65\x80\xbd\x6c\x49\x13\xf9\xb1\x23\xbd\xeb\x83\xed\x22\xde\x1b\xba\x4f\x84\x0a\x06\x93\x1e\x30\x08\x0c\x49\xaa\x61\xd6\x5e\x1d\xd2\xd8\xe3\xab\xa3\x21\xb2\x87\xf3\x55\xb6\x96\x81\xa2\xfc\xeb\xa2\x0b\x3d\xbf\x9f\x75\x04\x74\x03\x3b\x64\xe6\x82\xe0\x5c\xa0\x0e\xa7\x51\x1d\x8e\xd3\xb4\x9c\x66\x8b\x54\x1d\xd0\xe8\xd2\xdf\x5d\x56\xd3\x65\x7c\xc2\xad\x82\x97\x2f\x86\x49\x5b\x27\x42\x5b\x11\xa4\x7b\xdf\xec\x79\x80\xd8\x40\xea\xd0\x06\xd2\x9f\x30\x45\x86\x39\x0e\x07\x1f\x04\xb4\x5e\x65\x4a\x62\x9f\x84\x40\x43\xa4\x13\x25\x5f\xa2\xd3\x0a\x2f\xb0\xc6\x70\x21\xbe\x5a\x0c\x18\x3b\xd0\x4e\x3a\x2f\x41\x18\x34\xdd\x25\x76\x85\xc9\x19\x7e\xcb\x6d\x07\x29\x18\x29\xa6\xe7\x2c\x94\x32\x90\xa2\xd0\xc5\x52\xb9\xe2\x2e\x36\x1e\xa0\x58\x71\xed\xcf\xf5\x40\x6f\x8f\x99\x2e\xe4\x6b\x59\xf9\x31\xb4\x34\x68\x5d\xb2\x96\x97\x04\x39\xa3\xa4\x69\x97\xf1\xa4\x93\x4a\x89\xaa\x93\x06\xcb\xbc\x33\x7c\xda\xe5\x67\x32\x0d\xea\x5f\xa7\xdc\xeb\xf2\x9d\xde\x6e\x16\x7c\x8a\x6f\x37\x77\x65\xb2\x40\x43\x4e\x1a\x4e\x15\x5b\x4e\x2d\x65\xce\xd9\x4e\xed\x7f\xb5\xd3\x80\x5d\x25\x15\xc6\xec\x89\xed\x25\xdb\xb1\x8d\x96\x0a\xbb\x4d\x71\x75\x36\xdd\xbe\x2b\x93\xd8\x67\xda\x89\x02\xd1\x0e\xaa\x7e\x7d\x60\x95\x29\x98\x4e\x00\x9d\xe0\x8d\x08\x6b\x8e\x01\xa1\xca\x33\x2b\xc8\x21\x06\x30\xc0\xb7\x0c\x24\x4c\xe6\x8f\xfa\x48\x9e\xcc\x3c\x97\x54\x72\x1a\x1c\x2a\x00\x2a\x95\xda\x74\x55\x91\x99\x0c\x0e\x2e\x6d\x7d\x58\xb4\x06\x1c\x33\x44\xa4\x37\x65\x7a\xcf\x85\x34\x21\x4a\xd5\x55\x91\xc6\xba\x2f\x1f\xf9\x43\xc5\xb5\xc9\xc1\x9b\xd3\xdc\xbe\x80\xcc\x0d\x3d\x4f\x36\xc9\x1c\xe8\x68\x80\x9b\xa5\x58\x2e\xd3\xb9\xb5\xbb\xcd\xda\x5e\x70\xc6\x44\x7a\x6d\xd6\x33\x60\xa0\xcc\x17\x66\x63\xf2\x05\x50\xe6\x51\xd9\x1d\x61\x5a\xef\x5c\xc1\xf4\xbc\x28\x37\x45\x49\xd7\xce\xde\x1b\xe3\x58\xb0\x74\xb4\x40\xb7\x3d\x9f\xb2\x05\xaa\x9c\x25\xb4\x4d\x8e\x2b\x0b\x8f\x8a\x89\x93\xf6\xc1\x6a\xbb\x4e\x72\x5d\x9a\x64\x91\x10\x0f\xec\xfa\xc0\xd6\x51\x8c\x8b\xa9\xb6\x69\xcd\x3f\xe8\xd4\x1a\x44\x66\x86\x40\x31\x24\xcb\xec\x57\xb6\x10\x14\xad\xf9\x78\xa9\x22\xbd\xc9\xb6\x94\x71\xa9\xaa\x62\x9e\x52\x6d\x2d\x65\xfc\xb4\x57\xf1\xe3\x73\x0e\x83\x8d\x0e\x6e\xa2\x58\x0e\x10\x57\x2b\x41\x12\xf2\x05\xc4\x4e\x92\xcc\xd3\x62\x25\x76\xcb\x38\x1a\xbb\x63\xb1\xd0\x7b\xa8\x8c\xf8\x9c\x74\x0a\x9d\x30\xe2\x9f\xa4\x8b\xe8\xdf\xd7\xa1\x90\xa8\xbc\xa3\x06\x12\x89\xfa\xab\x25\x12\xa1\x4e\x87\x18\xc5\x54\x43\x08\x51\x7f\xb3\x0c\xa2\x6a\xca\x20\xea\xaf\x96\x41\xd4\x81\x0a\xa2\x82\x9b\xac\x43\xfb\x90\xe0\xad\x87\x34\x10\x75\x97\x06\xa2\x6a\x69\x20\x9e\xc5\x76\x6b\x50\xb4\xed\xb6\x32\xd5\x5b\x21\xd7\xa3\xff\xbb\x1e\x93\x7c\x0a\x18\xd6\x93\x2e\x6f\x15\xf8\x2b\xbd\xc2\x4f\x4b\x38\x06\x4f\xbc\x96\x46\x62\xa4\xbd\x5c\x9d\x14\xa6\x03\xbf\x64\x6e\x2d\x42\xd5\x41\xb9\xf7\x90\x67\x45\xb2\xe8\xb4\x4d\xbe\x56\x72\xb1\x89\x7e\x29\x96\xd8\xd4\x1f\x2a\xbd\xcf\x09\xa6\xbe\x52\x28\xb3\x52\xe0\x31\xf1\xd5\xd7\x68\x4f\x5d\xe8\x45\x11\x66\x1d\x7e\xb6\xc3\xed\xc9\xf5\x9b\x3a\x8c\x2d\xbd\x45\xae\x7f\x6d\x68\x72\xf0\x8b\x14\xbe\x08\x61\x80\xa5\x33\xdc\x1b\x66\x95\xb8\x17\xf6\x7b\x0a\x4a\x7a\x0a\x9d\x3e\x42\x18\x88\x65\xbd\x70\x38\x4f\xf2\xb9\x21\xf1\x50\xc7\xa4\x8f\x51\x59\x4a\xfd\xb0\xdb\x6c\x3f\x08\x28\xc2\x43\xfb\x30\x00\x42\x2a\x8f\xaa\xdb\x94\xc5\xa6\x4c\x4d\x6d\x7d\x71\xae\x08\xa3\x11\x91\x7c\xf3\x14\x10\x80\x23\x7c\xa7\x93\xcd\xc6\x24\xe5\x1e\x97\xdf\xfe\xfa\x8b\x31\x1b\x3b\x16\x76\x13\x12\x44\x05\x9e\xcc\x80\xad\x46\xd3\xa0\x42\x63\x69\x4a\xd5\x60\x4f\x20\xe9\x19\xbb\x6b\x85\xaa\x0e\xa6\x87\xba\x95\x91\x08\xfa\x07\x94\xfe\xfc\x77\x29\xde\xde\xbc\x6e\x71\xdd\x4b\x1c\x67\xa8\x31\x24\x24\x7d\x88\x11\x09\xc5\x2d\x8b\x52\x01\x99\x39\x22\x02\xc8\xa3\xc8\xdb\x16\x0b\xc6\x10\x3a\xd4\x92\x02\x05\x0f\x64\x88\x6e\xab\x27\xd9\x6d\x0d\xa7\x6c\xa4\x85\xb0\x5f\x43\xad\x8d\x6b\xc1\x5f\xc3\x79\x73\xf6\x6d\x1b\x00\x3d\xe6\x60\x6c\x22\xf5\x75\xab\xb2\x4a\xea\xb4\xb2\x8f\xcb\xb2\x56\x8a\x6c\x79\x50\x71\xd3\x2e\xa2\x86\x25\x2d\x0b\xb2\xc1\x09\x68\xac\x82\xc5\x16\x95\x36\x5a\xe7\x4c\x5a\x0b\x0d\xa0\xcc\x9a\x19\xf6\xba\x4c\xab\x5a\xd6\xcf\xca\xaa\xd9\xbe\xeb\x18\xfa\x14\xcb\x4e\xc3\x3e\xcb\xba\x02\x35\xb0\x3c\xfd\x55\xe5\x2a\x95\x31\x11\xcb\xd2\x5b\xfa\xe9\xd2\x5b\x8a\xf3\xab\x9e\x0b\x7e\x41\x1c\x37\x44\xec\x96\xdf\xc1\x58\xcc\xc5\x58\x40\x29\xd1\xbe\x06\xe3\xc4\x9a\x45\x43\x16\x8c\x63\xb4\xea\xa0\x4c\xff\x21\x5f\x84\x43\x29\x74\xe7\x54\xa6\x56\x0e\x4b\xee\x08\x44\xf4\xcc\x64\xc5\x03\xd5\x75\x55\x80\xd4\xb1\xff\xbb\x2b\xb6\xbc\xe2\x9a\x13\x0d\x2a\x6e\x0f\x26\xbb\x37\xea\xf8\xf4\xac\xa7\xd7\x45\x5e\xaf\x2a\x21\x36\x4a\xc3\xc1\x72\xf3\xf8\x18\xa6\x30\x4d\xe7\x2b\xbb\xf7\xad\x75\x82\xa8\x20\x28\x83\x55\x15\xf0\x32\x92\x60\x75\x32\xcb\x5a\x14\x03\x8d\xd1\x3b\x30\x72\xca\x64\x66\x5e\x97\x45\x4e\x08\x34\xa8\xec\xf5\x57\x27\xd1\x8d\x3f\x98\x99\xae\xd2\xda\xf4\xf8\x04\x5b\xf4\xb8\x70\xbe\x63\xa7\x01\x72\xd3\x1b\x87\x91\xb4\x1a\xd1\x3e\xce\xb3\x5d\xe4\x26\x5c\xf9\x23\xb0\xb9\xb2\x22\xcf\xa9\xb6\x30\x94\x75\x96\x91\x9d\x34\x77\x60\x81\x90\x5c\x4b\x05\x2b\xf2\x91\xcd\x08\xbc\x61\xfb\xd6\x4d\x8b\x30\x00\x76\xbb\x28\x15\xb2\xe7\xe4\xaa\x78\xa0\x9c\x80\xc1\x22\x39\x2a\xe8\x6e\x9e\x9f\x70\xa4\x21\xbb\x8d\x77\x3e\x93\xf9\x97\xbc\x78\xc8\xcc\xe2\x8e\xc2\x1e\xa8\xe9\x42\x27\xed\x0a\xf8\xba\x7c\x00\xbb\x49\xf0\xab\x68\xc1\xd6\x52\xf8\x10\xcf\x90\xb4\xec\x0c\x2e\x76\x8d\x80\x2b\x9d\x50\x08\x7d\x06\x12\x8e\xa4\xaa\xb6\x25\x11\x52\x12\xe3\x27\x1c\x9f\xce\x31\xa5\x08\x66\x4b\x24\x5f\x3c\x1e\x9d\x7b\x77\x84\x71\x80\x1b\x4d\x66\xa7\x48\xcd\x88\xf8\x03\x52\xd6\xc5\x52\x79\xd2\x1d\x32\x48\x0f\x0c\x8b\xbb\xf0\x1b\xca\x37\x18\xcb\x86\x50\x28\x45\xc8\x99\xc2\x8f\x0a\x2f\xe5\x0b\xf4\x0c\xa2\x45\x45\x1e\xf2\x12\xc3\x76\xf5\x4d\x55\xad\xa6\x0a\x33\x1d\x52\x28\x89\xbf\x3c\x00\xcc\xec\xdd\x1d\x51\xbd\x62\x37\x56\x4b\xb9\x52\xdc\x98\x52\xf5\x07\x19\x54\xad\xb1\xa6\x4b\x29\x62\x09\xfd\x03\x7d\x18\x23\x46\xeb\xe0\xb8\xe6\xc6\x2c\x0c\x31\x4b\xe7\x3b\xf4\xb2\x08\xc0\x8a\x1f\x62\xc0\x53\x61\xc0\xb3\x2d\x58\x2c\xd5\xa5\x90\xd0\x91\x62\xa5\x7b\x58\x4f\xf0\x2a\xc6\x7c\x16\xf1\xf3\x37\x3b\x40\xe9\x08\x5c\x4b\xfc\xaa\x19\x96\x7c\x34\xa1\xaa\xaa\x11\xe3\x7a\x11\xe3\x53\x51\x7e\x3d\xd6\xc3\x1c\x31\x34\x0b\x92\xa8\x71\x6c\x4e\x49\x73\x5a\xa2\x70\x0b\x31\xbb\x33\x25\x3f\xda\x0e\xa9\xb0\x17\xc2\x3a\x14\x99\x6e\x42\xe3\x81\x03\xc6\xd6\x92\x4d\x42\xff\x22\x74\x3e\xbc\xb7\x81\xef\x83\xae\x1c\xf4\x2f\x0e\xcc\xb0\xda\x2b\x02\x8f\x4e\xe3\xc2\xa5\x4a\xd8\x13\x46\x4f\xab\x2d\xfa\xae\xf6\xd9\x5a\x51\x88\x25\x75\x76\x57\x87\x70\x27\x9e\x3a\xaa\x4a\xec\xc2\x9d\x17\x1b\xda\xb6\xc4\x26\x5a\x39\x6f\x2a\x0b\xe9\x44\x9c\x02\xec\x19\x52\xa0\xeb\xb3\xf8\xac\x61\x46\xef\x1f\x7d\xe4\x23\x9d\x55\xe9\x22\x4d\xca\xce\xc1\x07\x2f\x10\x9c\x40\x15\x3a\x81\x54\x1f\x9c\x64\xf8\xa0\xb2\x34\xf7\x05\xd1\x9d\x3e\x65\x8a\xd4\xd3\xa6\x68\xbf\x4e\xbf\x9f\x22\xf5\xa4\x29\xda\x6f\x0e\x83\x2c\xf8\xbd\xb7\xe6\xd4\xb1\x3d\xfc\xdc\x20\x3d\x43\x29\xfa\x60\x9c\x7a\x41\x72\xa9\xe1\x50\x76\x25\xf8\x44\x1e\x24\x72\x1c\x93\xeb\x6d\x56\xa7\xf6\x2d\x75\x4a\x5e\x97\xcc\xb2\xc4\x4a\xbd\x8c\xa5\xca\x81\x50\x67\x65\x16\x9f\x40\x7d\x10\x02\x21\xeb\x59\x3b\xa0\x0e\x37\xb2\x12\xd5\x0c\x4f\x4e\x92\x34\xbb\x56\x3b\xc1\x43\xf5\x89\x32\xf3\x89\xb6\xe7\x74\x06\xb7\xdf\x62\x3b\xaf\xe1\x44\x81\xcb\x86\x82\xc3\xe8\x3c\x44\x0d\xf3\xb5\xda\x12\xd3\xab\x54\xb0\x6c\x99\x12\xa0\x47\xb5\xcd\x96\x69\xc6\xea\x42\x5d\xe6\xa3\xc4\x68\xfb\xc4\xe0\xab\xb8\xa9\xaa\x4f\x87\x83\xe7\xb7\x72\x2e\x96\xb7\x35\x48\x18\x46\xd8\xb4\x67\x91\x72\xb5\x20\x74\xba\x73\x1a\x99\x7e\x06\xc1\x2c\x66\x43\xb7\x4d\x16\x1a\xf5\x3e\x5c\x93\xe6\x71\xc3\xb2\xa4\xc5\x25\xa7\x18\x66\xd7\x95\xc6\x08\x7c\x78\x70\xad\x90\x79\x8c\xcf\x06\x23\x98\xc2\xfa\xf6\xd7\xb8\xcd\xd3\x1c\x17\xad\xbd\x01\xed\x4d\x5f\x1a\x5a\x53\xaf\xe3\x96\x4c\x61\xfc\x5b\x04\x0a\xd5\x63\xa2\x77\x52\xa0\x90\x7a\x2c\xb5\x14\x18\xc1\x69\xcf\x04\x07\x3a\xc3\xf3\xaf\xc1\x1c\x25\xaf\xfc\x34\xd7\xc7\x47\xcd\x7e\x1c\xf5\xbc\x02\xa2\x3a\xa0\x80\x08\x37\xa1\xfe\x3a\xf5\x43\x45\x57\x22\x7c\xdc\x61\x57\xec\x51\x47\xdc\x67\x06\x0a\x99\x44\xb2\x84\x83\x88\xc0\x0f\x95\xe0\x12\x0c\xe5\x12\x9b\x9d\x06\x98\xc3\x37\x4a\x21\x46\xc4\xb3\x4c\x6a\xd4\xd9\x82\x33\x3b\xf6\xe2\x69\xa9\x24\xae\x92\x72\x0d\x90\xd8\xc3\x72\x89\xde\x70\x44\xa5\x1f\xb3\x70\xd4\x7d\x6e\x34\x5a\x02\x4b\x4e\xdd\xd8\x13\xae\x75\xf4\x35\x56\xea\xcd\x5e\xa6\x3f\x36\x76\x41\xda\x90\xf8\xed\x4a\x73\x9f\x56\xbe\xae\x56\xd2\xdd\xb5\xce\x1a\xf4\x38\xd3\x35\xd6\x4d\xa6\xeb\x06\x01\x9e\x3e\x4c\x80\xa7\x1a\x04\x78\x7a\x94\xcf\x9b\x71\x2f\x97\x57\xf3\xd4\x71\x5c\x15\x2c\xe8\xa6\xf6\xf0\xb0\x09\x0a\xb7\x22\xaf\xd3\x1c\x25\xee\xb6\x52\x4e\xb9\x71\x8c\x27\x0e\xbb\x14\x2b\x4f\x17\x5a\x15\x62\x97\xdb\x9f\xc3\x48\x87\x0d\xed\x78\x5c\x48\x82\xa7\x02\xca\x32\x29\x6c\x21\x49\xf1\x60\x3e\x40\x40\xa0\xc1\x56\x48\x87\x22\x46\x17\x55\x93\x9f\x50\xc4\xc2\xbd\xd5\x00\xa2\x6f\xe2\xd8\xc7\x1b\xb0\x4b\x70\x20\x56\xea\xc7\x58\x5f\x8f\x04\x89\xc8\x58\x4f\x6e\x6f\x6e\x46\xe3\x29\x16\xac\x06\x0f\xe2\x11\xb5\x7b\x30\xcd\xf5\xc3\xaa\xc8\x18\x83\x63\x27\x45\x6d\x4a\x73\x42\x69\x71\x6b\xd1\xd4\xa6\xaa\x49\xf4\xc2\x6e\xf6\xe5\x36\xcb\x76\x1a\x3f\xc4\x94\xeb\xe1\x57\x28\x53\x96\x45\xe9\x52\xd2\xdb\x6c\x41\x99\x0f\x62\xd5\x77\xf4\xf8\x60\x0d\x70\xf1\x39\x93\xa9\xa7\xb9\xab\x31\x27\xb3\x07\x5b\x2d\xd4\x69\x9f\xee\x3a\x7b\xe6\xdd\xc0\x45\x88\xf6\xdc\xa8\x90\x16\xc2\xe0\x15\x1d\x80\x70\x4a\x78\x4d\x8d\x58\x4f\x3f\x0c\xd4\xf9\xe8\x97\xc1\x78\x70\xa1\xcf\x47\x17\x9d\x1c\x2f\xc0\xa7\xd2\x84\xfa\x46\xfa\xf6\xe6\xfd\xb8\x7f\x81\xd4\x28\x34\x57\x4a\x70\xbf\xc0\xaf\xfa\x37\x37\x57\x03\xff\xff\x7e\x98\x50\xcd\xc2\x68\x7c\x3c\xe9\xe9\xe3\xf3\xd1\xd5\xd5\xe0\x7c\x3a\xfc\x65\x70\xf5\x59\x8f\x07\x97\x83\xf1\x18\x59\x60\xfa\x13\x75\x04\xbf\x38\x02\x3e\x96\xe9\x87\x01\x93\xbb\x00\x25\xcc\x04\x59\x52\x26\xfa\x47\x78\xf6\x4f\x3d\x7c\xc5\xd5\x15\x52\xaf\x0c\xdf\xdd\x4e\x47\xe3\x09\x93\xcf\x5c\x7d\x76\x10\x66\xf8\x8e\xa0\x97\xe9\x5f\x5f\x3c\x1b\x8d\xed\xaf\x2e\x86\xf0\x44\xc9\x58\xa3\xdb\x8c\x35\x91\x6a\x53\xd6\x44\xd0\x3c\xfa\xee\xc1\x87\x77\xb1\xd9\xd8\x21\x9b\xf4\xa7\xc3\xc9\x65\xff\x7c\x3a\x1a\x7f\xd6\x7f\xbd\xed\x23\xbb\xcc\xe8\x92\x99\x6e\xf4\x3e\xa6\x1b\xf8\x52\xff\xfc\xfc\x76\xdc\x3f\xc7\x47\xfd\xf5\x76\x38\x98\xea\xc1\xf5\xbf\x8d\x3e\x7f\x1c\x5c\x4f\xa3\x2e\x2e\x1c\xfb\xa3\xe9\x87\xe1\xf8\x02\x9e\xf8\x59\x8f\x87\xef\x3f\x4c\x27\xb1\x98\xac\x41\xff\xfc\x83\x12\x43\xa9\x2f\x46\x83\x09\x74\x9b\xba\xa7\xfb\xef\xfb\xc3\xeb\xc9\x54\x0f\xaf\xa7\x83\xf1\xe5\x60\x3c\xb8\x3e\x47\x38\xb8\xfe\x3c\xba\x1d\xfb\x06\xe0\xbb\xc2\x35\x66\x07\xac\x3f\x85\x51\xbb\xbc\xbd\xa6\x99\xb4\x6f\xeb\x0f\xaf\x07\x17\xcc\x65\x13\xac\xca\x4f\xc3\xab\x2b\xfd\x71\x30\x98\xc2\xe3\xd5\x78\xf0\xd7\xdb\xe1\x18\x3a\x33\x11\x4f\x1b\xdd\x0c\xc6\x7d\xa0\xcf\xc1\xb7\x76\x3c\xe3\xdd\x40\xdf\x5e\x43\xa3\xc7\xb7\x37\xd3\xc1\x85\x1a\x8d\xf5\x60\x3c\x1e\x8d\x4f\x2e\xc7\x03\x3b\x9e\x63\x7c\xdc\xc5\xe0\x72\x70\x3e\x9d\xec\x6f\xcc\x3b\xfb\xe1\x78\x3c\x38\x9f\x0e\x2e\xe0\xe8\x1a\x8d\xfb\x57\xf6\x69\x9f\xc6\xc3\xe9\x74\x70\xad\x87\xd7\x97\xa3\xf1\x47\x6a\xce\x58\xf7\x2f\x7e\x19\x9e\x0f\xf4\xfb\xe1\x2f\x83\x6b\xfd\xee\x33\x0e\x76\x04\xbc\x41\x38\xec\x40\x44\x34\xfc\x3f\x07\x17\x7a\x3c\xb0\x2b\x70\x70\x3d\xed\xdb\x9d\xa1\x98\x8f\x48\x4c\x07\xf2\x17\x9d\x8f\x07\xfd\xe9\x40\xf7\x3d\xfc\x9e\x52\x87\xfe\xfc\xe8\x8e\x5c\xa5\x1c\xb7\xaa\x4d\xbe\x30\xbe\x64\x91\x19\x46\x36\x3e\xae\xa0\xf3\x2d\x0a\x40\x13\x0d\x07\x24\xa8\x93\xb4\x9c\x97\xc9\xb2\x56\x79\x72\x4f\x76\x22\xb2\x80\x6d\x73\xc6\x19\x55\xbb\xaa\x36\x6b\xe4\x78\x4f\xd2\x52\xd7\x65\xb2\x5c\xa6\x73\x97\x82\x5e\x27\xf3\x15\xe0\xc4\xe0\xfc\xb6\xd6\x30\x20\x41\x21\xb4\xce\x62\x25\x1d\x21\x3d\x3c\x7e\x33\x93\x80\x89\x0b\xea\x1f\x51\x53\xfb\x03\xb4\xb9\x2a\x6b\x0b\x19\xbd\x59\xed\xaa\x74\x8e\xf9\x79\x93\xdf\xa7\x65\x01\x0c\xd3\x4e\x66\x03\xb8\xb9\x71\x2f\xbb\x85\xe3\x08\x9e\x62\xe6\xa3\x1a\xfc\x6d\x6a\x97\xb2\x5d\xff\x37\xe3\x11\x30\x2e\x0e\x2e\xec\x24\x5e\xf5\x3f\x45\x92\x58\x4a\xe1\xc4\xe0\x8c\x76\xcc\x5b\x9b\x65\x6a\x78\x7d\x3e\xbc\xb0\x53\x7d\x15\xe9\xc9\xcd\xe0\x7c\x68\xff\xcf\xf0\xfa\x62\x68\x57\x96\xc2\xd3\x63\x32\xf8\xeb\xed\xe0\x7a\x3a\xec\x5f\x39\x36\x2a\x26\x91\xf2\xf4\x51\xe3\xc1\x55\x7f\x6a\x3f\x82\x36\x0f\x27\xae\x38\x6c\x34\xc6\x3d\x43\xc4\x51\xc3\x6b\xea\x9d\xfd\xa2\xfd\xac\xb9\xbc\x23\x6e\xb8\x3d\xd0\xed\x90\x4c\x3f\x0c\xc6\x83\xd1\xa5\xa3\xbb\x52\xb7\xd7\x17\x03\x7b\x1e\x4d\x3f\x0c\xec\x81\x15\x10\x5e\xf9\xeb\x01\xa8\xaf\x8e\x3d\xd7\xd7\xf5\xe0\xfd\xd5\xf0\xbd\x3d\x27\x7a\x91\x1d\xc6\x8b\xdb\xf3\xe9\x44\xb9\xc1\x6e\xb0\x64\xd9\xe1\xd4\xc3\x4b\x3f\x94\x93\xdb\xf3\x0f\xc1\x58\x7e\xe8\x4f\xf4\xbb\xc1\xe0\x1a\x76\xd6\xc4\xee\x64\xdc\xf3\x37\xa3\xc9\x64\xc8\xcf\xbc\xc4\xdf\xb9\x61\x83\xc3\x70\x6a\xcf\xa9\xc9\xb4\x7f\x0d\xed\x82\x63\xa8\x3f\xbc\xba\x1d\x0f\xec\xf7\x07\x93\x09\x8e\xb5\x62\x36\x31\xba\xd3\xec\x71\x73\xf1\x39\xd6\x93\xd1\xc7\x81\xfe\xb7\xdb\xf1\x70\x72\x31\xa4\xb3\xeb\x62\x04\x6b\xa3\x7f\x75\x35\xfa\x04\xcf\xdb\xb3\xa0\x6c\x13\xfd\x84\xeb\x7d\xb3\x1b\xe9\x89\x9b\x43\xf7\x9c\x8f\xfd\xcf\xf8\x92\x9b\x9b\x2b\x3b\x77\xea\xf3\xe8\x16\xfc\xf6\xbc\x20\x71\x35\x24\x1a\xe0\x90\x53\x5d\xd8\x55\xde\x8c\x11\x3b\xda\x7c\x56\xf6\xc1\x20\x8d\x62\xf2\x00\x32\x5a\xa4\x44\x61\x28\x8a\xd3\xdb\x27\x17\x45\x04\xcd\xc9\xba\xd8\xe6\xb5\x47\x6d\x2c\x8a\x2c\x4b\xca\x4a\x1f\xff\x1f\xaf\x9e\xc7\xcf\x9f\x03\xa6\xe6\x79\xac\xa7\x65\xb2\x30\xeb\x84\x6c\x2f\xf1\x28\x17\x54\x47\x97\xd8\x95\x78\x33\x42\x18\x2d\x4d\xf7\x6b\xbb\xd5\xe1\xbf\x74\x9e\xac\x4d\xa5\xa9\xca\x21\xa2\xff\xe3\xaa\x20\xec\x27\x1f\x93\xb9\x1e\x4d\xf4\xdf\xe4\xff\xd7\x13\x53\xde\xe3\x9f\xff\xba\x4d\xe7\x5f\xa6\xe9\xda\x1c\x45\xca\xff\x87\x9e\x80\x1c\x37\x70\x14\xe3\x57\xd9\xd6\x22\xdb\xd8\x35\x45\x37\x9a\x32\x33\x59\x01\x4a\x66\xca\x85\xef\x1a\x24\x40\xf8\xe1\x47\xfb\xe3\x23\x40\xb4\x30\x18\x97\x9f\x19\x3e\x32\x7c\x62\xd3\x39\xb5\x26\xbb\x78\x20\xcf\x24\xb3\xef\x98\x7c\x51\x94\x8e\x81\x7f\x5d\xd4\x2e\xf8\x53\xa9\x85\x29\x81\x60\xdb\xe5\xef\x42\xcf\x22\xa4\x97\x08\x18\x52\x10\x50\xa5\x29\x61\xee\xd5\x6f\x55\x40\x21\x03\x21\x02\xb7\x2e\x05\xd2\xd8\x77\x74\x0b\x45\x70\x77\xdb\x74\x61\x32\xb8\x16\x10\xdf\x64\xfd\xe4\x4d\x01\x86\x7a\x52\xeb\x55\x5d\x6f\x7e\x7e\xf6\xec\xe1\xe1\x21\x4e\xc0\x4d\x99\x17\xeb\x67\x00\x9e\x7a\xe6\x7f\xb9\x2c\xca\x17\xe5\x82\x02\xd3\xf1\xaa\x5e\x67\x48\x38\xad\x47\x8e\x35\x57\x37\x40\x3c\xad\x04\x45\x17\xd2\xb2\x95\xa2\x42\x80\x47\x05\xfd\xe4\xe0\x52\x9d\xd6\x1c\xa5\x15\x64\x93\x14\x90\x69\x21\xe6\x11\x1b\x39\xdb\xa9\xa6\x6b\xcd\x6e\xf1\x57\xbf\xa2\x85\xf4\xe8\x86\xea\xf3\x8b\x21\xa9\xd3\x0e\x7d\x50\xad\x90\x0a\x61\xd6\xbd\xc8\x13\x80\xd1\x42\x0b\x9e\x09\xbe\x36\xd1\x9c\x84\x72\xdd\x81\xac\x86\x04\xbf\x39\xe7\x3f\xd2\x50\x0e\xd4\x8a\x7d\x45\xc2\xef\x75\x64\xe4\x5b\x17\x3a\x0b\x1b\xd0\x35\x6b\xd8\x41\xcf\xee\x81\x3e\x2a\x2d\x74\xfb\x60\x57\x1b\xa3\x1a\xd5\x40\x08\x7d\x77\xe1\x35\xd0\x39\x2d\x04\x65\x86\x59\x13\x4f\x12\xc9\x19\x9c\x05\x1a\xe8\x76\xcd\x9d\xc5\xa7\xc1\x47\x8d\x82\x2e\x82\x0e\x34\xe4\x88\x5d\x6e\xac\xa1\x80\x4e\x89\x99\x70\x60\x19\xef\x44\x45\x5a\x22\xc0\x98\xee\x97\x74\x4d\x72\x54\x13\x27\xc0\x6f\x2b\x74\xec\x7e\x63\x6d\x30\x98\x6d\x52\x0d\xa6\x4a\x06\x96\xd1\x2d\x96\x4e\xa1\x57\x25\x48\x5a\xb1\x94\xdf\x27\x34\x48\xba\x5e\x9b\x45\x9a\xd4\xc6\x6b\x89\x79\x2d\xd0\x95\x69\x68\x04\x76\xaa\xfb\x9e\xbe\x88\x5f\x1d\xcf\x7a\x6f\x55\x51\x22\xaa\xe2\xeb\x46\x01\x16\x17\x9c\xab\xf6\x3c\x5f\x6c\x19\xae\x06\xa3\xd0\x46\x50\x00\x8c\x16\x2b\x02\x58\x06\x76\xb9\x47\xcb\x35\x88\x91\xe1\x94\xb3\x72\x82\x7d\x6e\x30\xf9\xb7\x1b\xa2\x1e\xa1\x4f\x30\x36\xe4\xe3\x7b\x62\x98\xaa\xba\xd8\x40\xa6\x73\xb9\x2d\xe1\xec\x0d\xd2\x22\xf8\x63\x09\xab\x8d\xc2\xca\x8f\x26\xef\x5b\x53\x5a\xc9\x9d\x0b\x60\x41\x57\x75\x59\xec\x1a\xa8\xb4\xd6\xb7\xb9\xca\xca\x6e\x92\x5d\xb1\x2d\x81\x97\xdd\x54\x2c\x6e\x47\x46\x7d\xac\xfb\x20\x86\x3a\x6b\xa4\xec\x1b\x89\x0d\x27\xcb\xaa\x30\xb0\x06\x69\x23\xa1\xcb\xfa\xb8\xd0\xaa\xc3\x73\xf9\x4a\x0b\x15\x9e\x2c\x37\x4e\x9a\x09\xdf\x17\x51\xca\x24\x2d\x35\xb2\xd8\x45\x9a\xf0\x26\xc4\x79\x96\xe6\x04\xc6\xd4\x33\xb3\x2b\xf2\x85\x93\x93\x10\xc5\x1c\x1d\x02\x45\xd4\x20\x89\xbb\x99\xe1\x52\xc4\xea\x21\xc4\x22\xbb\x7c\xdf\x8b\x48\xbf\x8a\xf4\x8f\x91\xfe\x29\xd2\xa7\xcf\x23\x7d\x7a\x1a\x81\xba\x19\x4c\xc7\xe9\x0b\xb8\xc4\xf1\x6a\xe4\xc8\xa5\xd7\xa0\x74\x36\x07\xe6\xf9\x8b\xf5\xc6\xe4\x15\xcd\x7f\x10\xc6\x6f\x08\x4d\x56\x45\x59\x33\x04\x12\x72\x3f\xc8\x83\xa4\xa5\x16\xaf\x35\x29\x02\xfd\x88\xb6\x6a\xb3\x3d\x9d\x89\x17\x0c\xd6\xce\xfe\xa1\x71\xb2\x23\xbc\x31\x37\xa5\x01\x45\x26\xd3\xa1\xcb\x8c\x88\xbb\xb5\x59\x38\xed\x5a\xe8\x3f\x1d\xaa\x2f\x1a\x9a\x3e\x76\x8f\xbd\x88\x4f\x3b\x85\xdc\x3a\x82\x78\x9d\xd2\x79\x47\x92\xb9\x3e\xcd\xf5\x65\x7f\x8c\x32\x79\x81\x3e\x5c\x15\xd0\x84\x99\xf9\x0a\xb0\x44\xc8\x7c\xe8\xe5\x89\xda\x9e\x35\xa1\x7e\xda\xb2\x71\xf3\x6d\x65\x0f\xad\x32\xcd\x76\x02\x49\x1a\xf0\x7d\x87\xed\x0a\x17\x34\xdc\x1d\xfc\x8c\x9d\xa4\xdc\xce\xfc\x9c\x35\xda\x09\xd7\x35\x6b\xc6\xa5\xa1\x38\x4d\x73\x7a\xed\x28\x80\xce\xde\xa9\x3e\x9e\xba\xc7\x5c\x24\x35\xd4\x0a\x2d\x9c\x64\x1f\x1b\xd4\x4e\x4c\xb6\x87\x1a\xde\x76\x4d\x5e\x18\x3b\x77\x8c\x26\x61\x8d\xa8\xcd\xb6\x9c\xaf\x12\xd0\x0e\xbd\x80\xb1\x7e\x75\x16\x9f\x9d\xbd\x39\x79\xf3\xfc\xf4\x95\x78\x97\xb2\xef\xd2\x27\x27\x4d\x55\xc4\x0a\xdf\xef\xb4\xfd\x5e\xe8\xe3\xb1\x1b\x7f\xf1\x5d\x6e\x98\x57\xc9\x2b\xca\xf6\x87\xfa\x42\x22\xaa\x7a\xb1\xee\xc3\x38\xa4\xf9\x5d\xb6\xdb\x2b\x14\xa8\x02\xa1\xc0\x76\x9a\xf6\x69\x22\x81\xa7\x2f\xe2\x33\x3d\x36\x58\x79\x60\xed\x50\x3b\x48\x37\x64\xa7\x86\xb6\x81\x34\xa5\x84\x18\x53\x45\x05\x9f\xf6\xc2\xf5\xb2\x69\x76\xcc\xc9\xb2\x8d\xf4\xdf\x8b\x14\xca\x9f\xf3\x9a\xe4\x5e\xfd\x76\xe3\x22\x0e\xac\x36\xe0\xaa\x0a\xd0\xb7\x27\x7a\x3c\xfb\xf5\x75\x91\xdf\xc1\x9d\xb9\x2f\x0b\x26\xe4\x6c\xb8\x95\xae\xb2\x8b\x09\xcf\x11\xdb\x2f\x85\x7d\x5d\x74\x1b\x0e\x62\x48\xbc\xf2\xdd\x85\x38\x65\xa4\x4f\x93\x18\x23\x18\xb1\x17\x7a\xe8\x6b\x66\xf4\x85\x87\x68\xb7\xa9\xc2\x82\xc1\x4b\xd7\x9b\x24\x2d\xd9\xe9\xf0\xe9\x0a\x9a\xc3\xc8\x03\x1e\x08\xf6\x1d\x21\x9e\x00\x5e\x5f\xf1\x87\xb0\xaa\xd3\x3a\xd2\xd6\x47\x31\x0c\x0b\x57\x32\xb9\xee\x65\xa7\xd0\xb3\x02\x8f\x0a\xef\x4b\xc2\x2c\x60\x72\x14\x54\x75\x4a\x5d\xa5\xeb\x14\xf4\x49\x88\xf6\xab\x52\x49\x15\xea\x19\xe3\xc9\x5e\x1b\x2a\xd2\x68\x60\x59\x65\xde\x39\x0a\xdf\xae\xc2\xb7\xbb\x0c\x29\xf7\xcf\x81\x2a\xa8\x33\x41\x79\x2d\x8e\xf6\x4b\xfd\x29\x49\xef\x4d\x09\x05\x10\x58\x09\x09\xb6\xcb\x25\x45\xe4\x0e\x62\xe4\x9c\xc0\xa4\x3a\xac\x8f\x26\x17\x37\xd1\x21\x26\x28\x65\x09\xe5\xde\xc8\x52\x2f\xc5\x2a\x15\x67\xc6\x82\xe5\xec\x5e\x10\xeb\x4e\xf9\xb3\x2e\xf5\x33\xb8\xd4\x0f\xa9\x9f\xe9\xc7\xd4\xcf\x5c\xeb\x95\x13\xdd\x6d\x96\xb0\xbd\x88\x5f\xe9\x89\xb9\x77\x8c\x85\x31\x54\xd3\x0c\x97\x2e\x05\x4b\x49\xd3\x04\x95\x03\x51\xda\x05\xa6\x3c\x0f\x95\x6d\xd5\x32\xcd\x17\xd5\x61\xb5\xb9\x48\x94\xd6\xfa\xac\x4f\x97\xf4\x1c\x16\x69\x35\x1e\x64\x5a\x12\x88\xf4\x13\x77\x35\xad\x93\x5f\xd3\xf5\x76\x1d\xf0\xa3\xa2\x24\x8f\xaa\x0a\xa2\x9b\x24\xc3\x09\x4c\xfb\x79\x91\x17\xeb\x74\xce\xea\x08\x95\xf3\x54\x85\xe8\x28\x9e\x79\x9e\x6e\x18\x4d\xb0\x05\x4a\x9e\xb7\xd7\x8a\xcb\x9d\xa6\x39\xe4\xee\x34\xb4\x10\x53\x59\xf0\xe6\x18\x4a\x86\xae\x8b\xda\x6e\x19\x2e\x03\x42\x94\x76\x51\x9a\xbb\x02\xa4\xb5\xd3\xe5\x7e\x79\x67\x81\xfa\xaf\xd0\x6f\xb2\x3e\x04\xe6\x09\x69\xcf\x03\x39\xd6\x92\x3c\x0e\x74\xa7\x98\xf7\x56\xc0\xb9\x38\x69\xfd\x02\x4f\x03\x70\x74\x10\xc5\xea\xa6\xc2\xc9\x60\x13\xd3\x28\x74\xd9\xde\x1c\xfc\x94\xa8\xf3\x38\xf3\xde\x81\x73\x09\xf9\x20\x56\x58\x72\x21\xbe\x62\x1d\x68\x1e\x34\xa8\x3f\x6d\x0b\x76\xfa\xc2\x8a\x96\x07\x60\x1b\x97\xd6\x9e\x59\xe1\xb0\xcd\x0f\x2b\xfe\xb5\xbe\x40\x91\x4d\x3d\x36\x55\x91\x21\x16\x4a\x37\x64\xa7\x1d\x88\x84\x04\x39\xed\x98\xd3\x77\x99\xa1\x55\x31\x25\x03\xc7\x3f\xf6\x08\x76\xe2\x66\xad\x93\x2f\xc4\x4c\xc2\xb6\xd8\x75\x01\x0e\x53\x4e\xe2\x62\x73\x38\x3b\xce\x93\x2c\x5d\x16\x65\x9e\x26\xfe\xee\xf2\xef\x20\xa0\x05\x68\x70\xe7\x2e\x24\xe4\x52\x0a\xc1\x86\x64\x98\xe5\xbd\xc1\xe5\x88\xe8\xca\xbd\x5a\xac\xe4\x30\xc3\x40\x72\x83\x82\xba\x8a\x76\x44\xc4\x9a\xb0\xb4\x4c\x25\x69\x24\x69\xb3\x5e\x53\xa4\xe3\xbc\xc8\xed\xca\x22\x9c\xf6\x39\x1d\x61\x95\x62\xb0\xd5\x10\x0b\x9c\x08\x86\x31\x49\xb0\x64\xe2\x7d\x51\x2c\x80\xed\xc9\xa7\x9a\x51\xdf\xd6\x2c\x70\x16\xdf\xe8\x01\xa6\x86\xfb\x8c\x63\x79\x4b\x96\x90\x9d\x83\xab\xe4\xa1\x61\xa6\xc0\x49\x99\xd6\xc8\x48\x01\x6b\xdc\xfe\x5a\x79\x14\x8c\xe4\xdd\x65\xa8\x68\x17\x5b\x79\x83\x70\x83\xcb\xdc\xed\xcb\xd4\x53\x64\x7b\x2b\xdd\xa9\x61\xcb\xe7\xcb\x84\x24\x88\x95\x5c\x09\x2c\x65\x67\x27\x67\x56\xa0\xfb\xe1\xff\x0e\x07\x84\x10\x04\x65\xe9\x5f\x78\x13\x2a\xa3\x7c\x92\xa4\x25\x52\xfe\xb5\x66\x61\x65\x62\x84\xfd\xeb\xd6\xcc\xcc\x3c\xd2\xe7\x49\x9e\x2c\x92\xa8\x41\xc3\x87\xca\xa8\x8a\xf8\x7d\x7e\x86\x15\xc0\x63\xe5\xd7\xe6\x32\x65\xe1\x3a\xa8\xed\x02\x5b\xa5\x34\xff\xd8\x22\x88\xc1\x33\x83\x39\xe1\x4d\x82\xe9\x36\x0b\x09\x80\x34\x1a\xef\x32\x68\xeb\x20\xbf\xcb\xd2\x6a\x15\xeb\x2b\x53\xb9\xd7\x16\x79\xad\xcd\xaf\xe9\xdd\xbf\xff\x6f\xfd\x8f\xad\x51\x80\x13\xfc\xf7\xff\x5d\x79\x05\xdf\x5a\x1b\x3b\x77\xdb\x4a\x67\xa6\x12\xcf\x9e\x17\x79\x6e\x7e\x35\x95\xae\x0a\x10\x42\x2b\xff\xfd\x7f\x2f\xec\x63\x2a\x6d\x72\x9d\xe4\x77\x59\x92\x56\x5e\xb3\xac\x1f\x2b\x75\x74\xc3\x00\x7e\x4f\x8f\x76\x3c\xef\xe9\xd3\x9f\x7e\xfa\xe9\xe4\xec\xf9\xf3\xd3\x6e\x36\xa3\x7e\x96\x31\x5e\x78\x6c\x2a\x53\xde\xc3\x12\x9e\xb2\x06\x9d\x27\x0e\x68\x05\x43\xed\xe9\xdc\xc2\xf0\x36\xbe\x55\x29\xa1\xa5\xee\x2a\xec\x93\xb2\xa5\xd1\xfc\x08\xc1\x13\x40\x82\x80\x9d\xc8\x7e\xf9\x07\xfa\xcb\x0f\xbd\x38\xa8\x55\xc3\xa4\x06\xb7\x9c\x96\x25\x49\xdf\x62\x34\xdd\xb1\x37\x2a\x1f\xdf\x40\x21\x17\xc2\xa1\x85\x3a\x7d\x2e\x98\xb7\x27\x62\x8e\xde\x26\x4a\x1c\x28\xac\x4f\x4c\x16\xf6\xc4\x27\x34\xba\x64\x56\x4c\x21\xae\x35\x6d\xe5\x04\x78\x7d\x79\xed\xa5\x4e\xea\x4a\x89\x09\x15\xdf\x50\x50\x8b\xad\x7f\x00\x78\xc9\x0f\x7a\x96\x54\x69\xf5\xa8\x90\xd0\x10\x14\x6f\x3a\xd0\x19\xca\x03\x4d\x3e\x0c\xc6\x83\x77\x9f\x35\xa3\x3d\x26\x00\xf7\x80\x0c\xa0\x87\x65\x48\xfd\x21\x7e\xa5\xcf\xb3\xd9\xa7\x7d\x7e\xa2\x00\xd1\x01\x58\x06\xc0\x30\x94\x40\x41\x8c\xf5\xf5\xe8\xfa\x24\x54\x24\xa2\x49\x64\xca\xce\x2b\xa1\x04\x0a\xa7\x22\x99\x1c\xce\x62\x55\x77\xee\x30\xf6\xe5\x15\x82\xa5\xa6\x6a\x8f\x7c\x7c\xf4\x9d\x91\xef\x3f\xec\x5f\xfc\xec\xf3\xcd\xd5\xef\x27\xf5\xd3\xf9\xef\x30\xff\xdf\xd9\xe9\xcb\xd3\xa6\xfe\xcf\xd9\xab\xd7\xaf\xbe\xf3\xff\xfd\x19\xff\x3e\x27\xab\xa2\xf8\x6f\x2d\x45\x4c\x21\xfc\xa3\x8f\x3f\xdf\x5c\xf5\xe8\xe6\xea\xfc\xba\xbd\x3b\xd2\x4a\x1f\x39\x93\xec\xa8\x87\x61\x4d\x0a\xe3\x84\x88\x63\x4e\x9f\x54\x42\x0d\x39\x90\x56\xc6\x57\xd8\x3b\x34\xd2\x89\xbe\x30\x59\x42\x8a\x00\x8e\x73\xc4\xda\x16\x10\x56\xa9\x2b\xe0\xda\x9d\xa7\x9b\x24\x53\x68\x65\x17\x4b\x4f\x48\x92\xd4\xfa\xcd\xf3\x53\x7d\x99\x96\x55\xad\xfb\x60\x11\x47\x7a\xb2\xcd\xf3\xdd\x7d\x92\x99\x48\xda\x52\x3f\xbd\x7c\xfe\xe3\x4f\xfa\xf8\x08\xdf\x7e\xd4\xc3\x00\x31\x79\xe6\x81\x0c\xdf\xae\xd8\xea\xfb\x34\xf1\xa5\x9a\x41\x64\xe4\xd8\xa9\x07\x1d\xf5\x62\xfd\x8e\xb4\x00\x54\x1d\x88\x21\xec\x20\xe1\xd3\xe2\xe6\xc8\xb9\xfa\xed\x18\xd8\x35\x7a\x3e\xf3\x22\x21\xb3\x18\x05\x77\x63\x8d\x52\x85\xcd\x52\x2b\xf4\x8b\xb7\x5c\xf3\xb2\x4e\x2b\xb2\x35\x41\xd0\x64\x2f\x2b\x84\x0f\x09\x52\xbd\xad\xb4\x8a\xb1\x35\x49\x45\x86\x61\x85\x02\x37\xa7\x31\x96\x7c\x21\x10\x9e\xed\x23\xa7\x92\x7e\x1a\x9f\xea\x93\x66\x32\xbb\xeb\xdd\x9e\x4e\x91\x7b\x16\xf1\x52\x40\x13\xd3\xd5\x5b\x16\x98\x30\x23\x88\xb3\xe0\x3c\x03\x9f\xb0\xda\xa3\xa6\xe8\xb3\xcf\x7e\x22\x54\x72\x88\x81\x02\xff\xb3\x2e\x93\xbc\xc2\x6a\x5f\x5f\x32\xd0\x52\xb7\x64\x3d\x4b\x85\x15\xb7\x26\xea\xaa\x70\x09\x64\x3d\x42\x2e\x3c\xa8\xfe\xab\xbd\x7c\x42\xc7\x44\x47\xa2\x72\x1b\xaa\xe6\x02\x26\x31\xbb\x7e\x66\x65\xba\xf0\x95\x92\xf2\x8d\x8a\x93\xe9\xd6\xa8\xc3\x8c\x83\x7c\xff\xdb\x23\xbd\xe2\xaa\x05\xc8\xe9\x59\x2b\x0f\xbc\x86\x45\x6b\xd0\x30\x46\xe3\x20\x30\x0c\x16\x96\xec\x57\x41\x5f\x09\xc7\xd7\x78\x63\x7c\x84\x4c\x83\x27\x9a\x64\xb1\x71\x58\xe4\x8e\x48\xe6\xe0\x56\x07\xb9\xff\x80\x79\xc8\x6d\x3c\xc5\xd4\x2d\x80\x21\xde\x76\xe8\x24\x50\x54\xab\xc1\x32\x26\x4d\x65\xf8\x29\x1e\x2b\xb0\x59\x51\xc0\x93\x40\x49\xb3\x94\x41\x05\x8d\xd7\x33\x0d\x62\xd1\x58\xba\x94\xdc\x83\x18\x0f\xa5\x2c\xeb\x82\x1c\x76\xe7\x73\x1f\x78\x60\xea\x06\x17\x76\xb5\x69\x24\x4b\x21\xd7\xeb\x17\x4a\xf3\xe5\x48\xac\x78\xe2\xd6\xd4\xc1\x61\x08\x69\x2a\xba\x54\x56\x93\x3a\xf2\x55\x25\xa2\x98\x65\x5f\x9d\x7f\xb0\x62\x17\x2d\xc2\x0d\x95\x48\x45\x33\xc1\xbc\xe1\x7e\x87\xbe\x04\xcc\x48\x50\xb8\x86\x42\xcf\xde\x2f\x57\xdf\xd6\x99\x43\x4d\xc6\x63\xdf\xc5\x4d\x61\xbb\xe4\x3e\x3a\xfe\x90\x70\x0e\xc5\x17\x12\xe0\x17\xf1\xa4\x6a\x07\x4e\xfc\xe8\x03\x10\xce\x11\x52\x2d\x2a\x48\x3c\xe4\x6e\xf1\x07\xf5\xb5\x1d\xa0\x91\xd6\x69\x60\x7f\x78\x04\x91\x44\xd7\xc4\x55\x61\xaa\x23\xe0\x1d\xc0\xe6\xa4\x79\xa8\xb4\x44\x7c\x38\xf6\x97\x0c\x5d\x5b\x40\x09\xfd\xde\x43\x39\x18\x09\x8e\x55\xd0\x29\x88\x51\xb8\x76\x55\x62\xdc\x0c\x73\xea\x46\x98\xd3\xf5\x3b\x68\xbe\x6a\x36\x3f\x72\x63\x63\xf7\x42\xc3\xad\x95\x31\x2f\x11\x31\xc6\xa1\x62\x50\xc6\x1b\xa2\x72\x60\xac\x20\xa2\x94\x28\xb4\x17\x80\x71\xfc\xda\xc3\xb8\x74\x00\x07\x6a\xbc\xad\x58\xba\x20\x1a\x90\x31\x26\xb0\x90\x21\x9a\x56\x2c\x75\xce\xe1\x3d\x6f\x5c\x10\x9b\xe8\x37\x6f\x48\xa7\x6e\x6c\x0f\x3c\x6c\x57\xb0\x9e\xdd\x0e\x83\x2a\x1c\xb6\x59\x44\x8d\x1a\x62\x6a\x40\xc5\xb7\x75\x9c\x37\x62\x0d\xdd\x7b\x06\x2a\xbf\x28\x92\xfc\xe8\xf6\x8d\xc1\x17\x3f\xa8\x2b\xd3\x0a\x70\x74\xf6\x12\x5a\xa0\xa8\x05\x8c\x15\x6c\xc8\x1d\xf2\x0a\x9c\xaf\x0a\xa0\xad\x08\xa9\x66\x78\x01\x05\xa1\x0a\x5f\x0e\xb8\xe7\x10\x80\x9d\xca\xb7\x6b\xb3\xc0\x34\x99\x41\x40\xd8\x64\x3b\x0d\xa0\x73\xe5\xca\xe8\x9c\x71\xe0\x8f\x06\x8a\x0b\x13\x1b\x45\x77\xe7\xc9\x2a\x06\xf8\x97\x22\xd4\x57\xb0\x22\x11\xb6\xd4\x2e\xc4\x73\x95\x81\xf6\x43\xda\x31\x2e\x12\x04\x08\xb4\xac\x09\x58\x75\xbc\x41\x62\x71\xc0\x2b\x5b\x44\x70\x5e\x80\x1a\x42\x30\xb0\x16\x1a\x4b\x47\x96\xa3\xd2\x81\xd3\xb9\xa3\x8a\x32\x7c\xa6\x92\xeb\xab\x03\x73\x18\x3c\xd7\x76\x76\x1f\xe4\x2a\x7e\x41\x8c\xaf\x27\x18\xf3\xf5\xaf\x74\x1d\x86\xc0\x03\xd1\x1d\x74\xa8\x30\x11\xbf\x0e\x23\x87\x30\x38\x9c\xed\x7c\x91\x26\xb0\x6e\x1e\xa7\xb1\x89\xf9\x28\x59\x14\x54\x97\xc0\x37\x77\x97\x96\x93\x0a\x4c\x3d\x3e\xc2\x82\x25\xdf\x13\x06\x2c\xae\x18\xa4\xef\x29\x0a\x96\x91\x3b\x8b\xf5\x04\x6b\x60\x95\x62\x4b\x38\xa9\x40\x40\xce\x95\xbe\x82\x59\x41\x1b\xde\x23\x2b\xa8\x74\x16\xb9\x3c\x91\xd6\x13\x8f\x70\x97\x91\x76\xe0\x0d\x3f\x66\xee\x8c\xa4\x77\x41\xb2\x14\xb9\xa5\x69\x92\x32\x49\xc4\xe2\x80\xda\xf9\x8e\x4a\xc0\x0d\x99\xa3\x8d\xcd\x8e\x9d\x79\x11\x43\xc4\xdf\x15\xe2\xdf\x70\x21\x3e\x86\x48\x95\x7a\x01\x8e\xc2\xc0\x93\x0c\xcb\x12\x5d\x9f\x0d\x08\xe1\xaf\xd2\xd4\xe7\x75\x61\x5d\x0e\x60\x51\x61\x34\xaa\x43\x7a\x15\x00\x30\x98\x51\x26\xbf\x0a\x4a\xaa\x09\x49\x99\x94\x29\xc2\x54\x4a\x02\x41\xa8\x96\x6d\xf7\x14\xbc\x80\xf9\x75\x95\x6c\x2b\xfa\xff\x55\x5d\x6c\x36\x06\x28\x30\x25\x3b\x89\xc0\xcb\x86\x54\x93\x87\x08\x0b\x22\xcc\x11\xf3\x8a\xda\x37\x2e\x1d\x27\x08\xc5\xe9\x4b\x1f\x8a\x7e\x81\xf6\x37\xda\xee\x32\x38\x2b\x4f\x2a\x32\xed\x83\xfd\x69\x3d\x60\xac\x93\x14\x5c\x42\x5d\x5c\x72\x51\xb7\xca\x7d\x44\x40\xc5\xc8\x83\xab\x89\x1a\xa4\xf6\x36\x2e\x33\x5c\x89\x14\x5f\x28\x21\x2c\x45\xca\x9c\x81\x06\x60\x86\x90\x5d\x4e\x35\xbe\xdf\xd0\x0f\xa4\x54\x08\x0c\x8b\x27\xdc\xf4\x0d\x11\x94\x73\x9c\xae\x45\x40\x66\x00\xaa\xcf\x8a\xbb\x82\xda\x0a\x24\x61\x6c\xe3\x27\xd6\x1d\x29\x05\x29\x68\xe3\x7c\x80\x69\x78\xc1\x07\x58\xeb\xbc\x46\x2b\xcd\x8e\x71\x58\x60\xe0\x30\x68\x3f\x54\x00\xbb\x8f\xa0\x01\x91\xab\x34\x80\x76\xb9\xfc\x91\x07\xd6\x05\x74\xf9\x12\x70\xeb\x88\xb6\xe2\x33\xdc\xaf\x2f\x63\x7d\xe1\x98\xfb\x6c\xab\x3f\x61\x61\x7e\x6a\xaa\xc7\x05\xf7\x3b\x8b\x31\x65\xa8\x3c\xd6\x9f\xfb\x1f\x46\xa3\xff\xa6\x3e\xf6\xff\x02\x45\x7b\x41\xec\x9b\x25\xeb\x29\x8e\x1e\xf9\x1a\xc7\xd1\x58\x4f\xa6\xfd\xe9\x2d\x14\x21\x8e\x07\xef\xfb\x63\x08\x91\x8b\xd2\x22\x45\xe5\x50\x5e\x65\x1e\x2a\x96\x2e\x87\xe7\xfd\xab\xab\xcf\x11\xbd\xb7\x5d\x2b\xe8\xea\xf3\x5c\xbf\x3e\x0d\xaf\xae\xd4\xbb\x01\x56\xde\xe9\xcb\xf1\x00\x4a\x7c\xa0\xae\xee\x66\x30\xbe\x1c\x8d\x3f\x92\xa6\x7e\x50\xab\xa7\x3f\xf6\xaf\xaf\x07\x63\x57\x96\xf5\x1e\xea\xdf\x26\x53\x45\xf5\x59\x50\x7f\x23\x0a\xb3\xa8\x3d\xb2\x91\x8d\xd4\x40\xbb\x68\x53\x7d\x4b\xbc\x5f\x1f\x73\xb9\x12\xbd\xf2\x43\xff\x02\x6a\x93\x14\x16\x01\x0e\x2e\x5c\x25\x12\xfd\xa2\xd7\x5d\x98\x09\x05\x94\xe3\x81\x6d\xf1\x54\x37\x46\x1b\x33\x13\x1f\x47\x17\xd0\x17\x2c\x3c\x82\xd2\xac\xe9\xc8\xad\x89\xe6\x6f\x6f\xb1\x7c\x09\x4a\x9c\x46\xe3\xc1\xfb\xd1\xf0\xfa\x3d\xae\xc1\x80\x69\xc3\xae\xc1\x2b\xae\x14\x52\x4a\x14\xb4\xe1\x9c\x50\xaf\xda\xd5\x6b\x58\xa6\xe6\x0b\xd6\xa2\xce\x7a\x36\x35\xf8\xdb\xe0\xe3\xcd\x55\x7f\xfc\x39\xda\x5b\xf3\x24\x57\xb0\xac\x1a\x6b\x67\x68\xd4\xd5\x68\x02\x5f\xbf\x19\x8f\x2e\x87\xd3\x49\xa4\xf9\x83\xdb\xc9\x20\xd2\xef\x6e\x27\x43\x98\x2c\xb7\x70\x86\xa3\x6b\xff\x9d\x8b\xfe\xb4\x1f\xe9\xf3\xd1\x64\xaa\x47\x97\x58\x95\xda\xb3\x6b\xed\x7c\x74\x7d\x8d\x45\xc5\x38\x90\xb6\x83\x8f\xd4\xd8\x0d\xf4\xe5\xed\xf8\x7a\x38\xf9\x00\x75\xc1\xb4\x6e\xfb\xd7\xe7\xb0\x96\xc5\xc8\xbb\x55\x4f\x83\x06\x55\x6e\x54\x74\xab\xdf\xdb\x75\x37\xb8\x80\xcc\x15\xd4\xd5\x45\x8a\xb7\x68\xff\xea\x6a\xf0\x7e\x70\xa1\xfb\x13\xdd\xd7\xef\xc6\x83\xfe\xf9\x07\x59\x6b\x07\xa5\xaa\x50\xa2\x77\x0b\xd5\xb3\x17\xb7\x34\xfe\xad\x7a\x3b\xcc\x90\xb5\x96\x68\x58\x3e\xa7\x1f\x2f\x9f\xc3\x95\xf3\x1a\x0b\x1d\xe0\x52\x11\x08\x77\xa5\x5e\x83\x95\x31\x6d\x86\x1b\x1a\x08\x1e\x02\x0b\x6d\x73\xa0\xa5\x80\xb0\x69\x5e\xa7\xa2\xd2\x61\xa1\x4d\x52\x66\xa9\x29\xd5\x66\x5b\x56\xdb\x84\x41\x19\x69\x15\xb0\x68\xbe\xe6\x1b\xd6\x57\x14\x90\x71\xb5\x30\xf8\x2c\x23\x90\x70\x90\x30\xc7\xba\x04\xf0\x5f\x02\x77\x9f\x2d\x40\x6b\xa4\x78\x74\x4d\x2b\xf0\xf3\x1a\x2e\x13\x6b\x5b\xec\x67\x34\x63\x64\x8a\x7b\x4a\x10\x13\x16\x82\x1a\x4d\xaf\x48\x8c\xa4\xc3\x62\xa5\x79\x40\xd1\x2f\x6a\xe1\xd0\x12\x58\x9b\x85\xbd\x32\x3c\xcb\x9f\x0f\x96\x24\x35\x23\xe2\xac\xe5\x89\xb8\xf0\x2e\xf3\x05\xba\x65\xdd\xe7\x69\x07\x9e\xbb\x31\x8b\x10\x6a\xf4\x50\xaf\x8d\x87\xd8\xa3\xf4\x9e\x35\x7d\x1b\x77\x3d\x33\x41\xf9\x2b\xf0\xb4\x17\xc9\x5f\x32\xa1\x1d\x29\x56\x80\x4b\x61\xff\x3f\x76\xe3\x87\x4a\xf9\x02\xc6\x63\x07\xb3\x7a\x09\xfd\x7f\xd5\x8b\x82\x56\xbb\x97\xbc\x86\x5a\xba\x00\x37\xee\xfe\xa8\xde\xf4\x22\x89\x0c\xac\x7c\xe9\x12\xd7\x16\x74\x21\xdb\xe5\x78\x69\xad\xdf\x34\x60\xe9\x94\xc0\xf1\xe3\xe5\x55\x0c\x1d\x2c\x46\xa4\x6a\x42\x1c\x5c\x13\x11\xa3\x3a\x10\x31\xed\x19\xc1\x52\xac\x8d\x29\x2b\xb3\xa0\xd8\x8b\x53\x95\x08\x2a\xb1\xab\x48\x85\xca\x0b\x15\x85\xf7\x39\x82\x54\x79\x92\x09\x40\x71\x44\x0e\x99\x46\x51\x98\x87\x32\xad\x6b\x93\x47\x0e\xa4\x75\x08\xce\x53\x25\xe9\xa2\xd1\x7a\x44\x35\x95\x0d\xe4\xb3\x78\x88\xf2\xdb\x27\xa5\x3d\x0b\x6c\x84\x1e\xf8\xeb\xc9\xf2\x1d\x6c\xb0\x73\x7d\xaa\x7d\x80\x69\xfd\xf5\x80\x69\xb5\x17\x30\xdd\x85\x6b\x8a\xf5\x70\xe9\xfc\xcd\xc8\x87\xf9\x22\x42\xe6\x52\x0c\xad\xed\x1a\x82\x7e\xe5\x16\x13\x28\xb0\xe7\xef\x93\x2c\x5d\xd8\x39\xca\x92\x87\xe5\x36\xc3\x9d\x2b\x90\x9c\x5c\xfc\x89\x88\xcc\xa8\x73\x28\x82\x61\x00\x53\x19\x55\x5c\x70\x70\xd7\x45\x55\xeb\x79\x56\x54\x26\xdb\x29\x3c\x8f\xb7\x09\x83\xb8\x24\x56\x33\x3c\xa2\x26\xc8\x0d\x06\xed\x6b\x76\x33\xec\x25\xb7\x01\x8b\xf0\x45\x61\x29\x22\x3d\x21\x72\x83\xa5\x24\x32\x1c\x9a\x2f\xc4\x9e\x8c\x88\xe1\x3e\xbc\x3f\x70\x8c\xb0\x05\x48\x65\xe2\x86\x85\x23\x28\xcb\x6d\x96\x99\xaa\x6e\x09\xfa\xab\x19\x80\x84\xe3\xce\x0b\x6a\x46\x2a\xfc\x9b\xd2\xd4\x24\xe2\x1f\x8e\x5f\x58\x2d\xa1\x9a\xb8\x33\x46\x98\xc9\xac\x27\x47\x74\x43\x4c\x5a\xb1\xd4\xfd\xb5\x29\xd3\x79\xe2\x64\xfe\x15\x1e\x9f\xe8\x36\x20\xcc\x8c\x50\x66\x9c\x80\xcd\x0c\x55\xb7\xdc\xc6\xd7\xf1\x3e\xf4\x9f\xf5\x9e\xd4\x63\xe8\x3f\x2f\x46\x1f\xe2\x97\xc5\x34\xf7\x45\x18\x57\x59\x9f\x1d\xce\xe6\x6d\xc7\x92\xb0\x8b\xa1\xc8\xee\xfd\x79\xed\xf6\xcf\xb2\xc5\xbe\xa7\x1c\x7e\xef\x50\xb0\x99\x86\xf3\x09\x21\xe0\x00\xcb\x07\x87\x10\x82\x32\x31\x2e\x98\xe6\x7a\x92\xe4\x75\xa2\xcf\xb3\xa4\x4c\xf4\x79\xb1\xcd\xeb\x9d\xcc\x49\x43\xa5\x15\x85\xec\x29\xfa\xc9\xca\x60\x51\x18\x05\x72\x95\xd4\x0b\x63\x0f\x02\x20\x12\xea\x38\x81\x08\xcd\x65\x0f\x20\xce\x6a\x96\x82\xdb\xb0\x83\xa5\xc8\x17\x47\xdc\x17\xd9\x36\x07\x72\x77\x64\xd5\x72\xfc\x1b\x0a\x97\x41\x50\x5d\xe6\x04\xf9\x2b\x9a\xd8\xa4\xaa\x8c\x3d\xb5\xd7\x06\x4a\x03\x10\x9a\x5b\x15\x59\xba\xa0\x80\x09\x2f\x33\xbc\xb4\x53\x7f\xa2\x3b\xd0\xab\x48\x0b\x38\x89\xa2\x6d\xb9\x29\x4a\xd8\x0c\x30\x2e\x98\x17\xa1\x31\x20\xa1\x07\xee\xa8\x2b\xf4\xa2\xac\x1b\x3e\xd4\x4d\xf8\x7d\x61\x77\xeb\x0c\xd9\xa0\x0b\x84\x05\x7b\xbc\xbf\xf5\xd8\xc5\x55\xdc\x5e\x64\xa8\x02\x97\x38\x9f\xdc\xf3\xd1\xb2\x05\x24\x2c\x1b\x25\x66\x64\x5b\xd5\x64\x45\xd9\xfe\x52\xb8\x78\x66\xbc\xe8\x82\x2b\x6c\x88\x74\x6e\xee\x32\x92\xb8\x58\x98\xcc\x4e\xf8\x4e\x25\x5c\xa5\xee\x2a\x1b\x9a\x76\x4f\x67\x63\xed\xca\x6f\xb7\x51\x89\x1a\xd4\x68\x4f\x81\x0f\x28\x56\x70\x4d\x04\xb6\x55\x56\x46\xa0\x5c\x10\x8e\x02\xd3\xa0\x76\x87\xa4\xf2\x85\x7f\x03\x05\x99\xec\xa2\x11\xc6\x1b\x1c\xa1\x60\x17\x2e\x61\x5d\xb8\xc5\x19\xe6\x9a\x9b\x7d\xf3\x95\x7c\xb2\x31\x2e\xfc\x0b\x9a\x78\x52\x87\x11\xeb\x67\xff\x55\x55\x61\xe3\x67\x10\x96\xfd\x43\x05\xa0\x1f\xd1\x7f\x7e\xf9\xfc\xac\xa9\xff\x7e\xf6\xe6\xf9\x8b\xef\xf8\xaf\x3f\xe3\x1f\xcc\xbe\x1e\x6d\x4c\xde\x04\x07\xb7\xc0\xce\xaf\x4f\xce\x9e\x3f\x7f\x8e\x61\x7c\x7d\xee\x71\x0b\x4a\xf9\x58\xb6\x8c\x2f\x8f\x4d\x90\x03\x04\x37\xba\x92\x49\x79\xfb\xc9\x2c\xcd\xed\xa5\x62\xed\xd8\xaa\x2d\x92\x12\x54\x90\x43\xd4\x7b\xbf\xe6\x74\x00\x58\x17\x26\x5b\x69\xf4\xda\xd4\x3f\x2b\xf5\xff\xfd\x3f\xff\xaf\x0e\xdb\x04\xa7\xa3\xcc\x46\x49\x55\x14\x40\x81\xcc\x8a\x7b\x21\x77\xe2\xc8\xf1\xe1\x18\xcf\xd2\x8a\x2a\xa3\x02\xfb\x30\x6c\x89\x97\x3f\x89\xbb\x5b\x90\xe6\x72\x0c\xb8\x05\x2c\xc6\x72\xa0\x11\x08\x08\xf8\xca\x46\x70\xb0\x3c\x20\xed\x57\x01\x7d\xea\x3a\xa9\x4d\x99\x26\x99\xa8\xc5\x75\x09\xd3\x06\x8f\xb0\xed\xcf\x35\x79\x62\xf6\xcf\xc0\x00\x43\xf6\x51\x6b\x99\x58\xb3\xc8\x7d\xab\xf2\x60\x2d\x57\x9e\xe7\xac\x9c\x27\xf0\xc1\xe8\x06\x1f\x4c\x5a\x79\x8c\x1e\xdb\x12\x0e\x9b\x1c\x1a\x14\x5c\x1e\x06\x3d\x00\x06\xa3\xce\x50\xf6\xbb\xcf\xc4\x3a\x75\xf3\x19\xc2\x60\xfa\xc3\xe8\xea\x62\x30\x46\x7e\xa6\x80\xc1\x8f\x82\xde\x08\xf1\xbe\xfe\xdc\x01\xff\xee\x46\x76\x47\x7a\x0f\x4f\x9f\xea\xe0\xe9\x6b\x87\x7c\xa1\x21\x8f\x45\x7d\x95\xed\x96\xd3\x46\xbf\x88\x25\x11\x18\x31\xb4\x01\x31\xe0\xf5\x74\xc0\x5c\x4f\xbe\x63\x41\x2c\x55\x3d\x3d\x96\xaa\x9f\x10\x4b\x55\xc7\x8f\x8c\xc3\xcd\x78\x74\x7e\x3b\x76\x5c\x80\x93\xdb\x77\x93\xe9\x70\x7a\x3b\x1d\xe8\xf7\xa3\xd1\x05\x12\x3a\x0e\xc6\xbf\x0c\xcf\x07\x93\xb7\x2a\x88\xae\x62\xf8\x74\x34\xe6\xe0\xeb\x5b\xfb\xff\x3b\x43\xae\x3d\xfd\x61\xf4\x69\xf0\xcb\x60\xac\xcf\xfb\xb7\x93\x01\xd0\x41\xaa\xd1\x35\xcc\xa2\x27\x0e\x73\xd4\x58\x3e\x33\x81\xc1\x58\xa2\x13\x9b\x4c\xc7\xc3\xf3\xa9\xfc\x1a\x45\x3d\x55\x27\xb3\x58\x40\x22\xd6\x73\x11\xdc\x21\xbe\xf6\x53\xff\x33\x07\x73\x83\xe0\xf8\x70\xa2\x5c\x90\xdd\x13\x8f\x3d\x35\x2c\x1a\x2b\x35\xf8\xdb\xcd\x68\x3c\xd5\x57\xfd\x4f\x93\x9f\x43\xf2\xb5\xfe\xc5\x05\xa4\x60\xc6\x03\xec\x09\x46\xed\x99\x55\xce\xfd\xca\x3e\x12\x48\xda\x24\xaf\x58\xac\x87\x10\x1e\x60\x48\xd0\x0f\x55\x87\xac\x40\x83\xd9\x45\x9b\x5f\x21\x3b\xed\xeb\x60\x2b\x25\xca\x1e\xd3\x5c\x3e\x4d\xba\x5e\xb1\xbe\x05\x53\xf2\xfc\x76\x3c\xb6\xcb\xe2\xf8\x63\xb2\xd3\xf6\x4e\xea\x61\x45\x3c\x3e\x57\x89\xe7\x36\x4e\x86\xb4\xd2\x26\x4b\xef\x52\x96\xff\xa3\x86\x38\xd7\x1f\x9e\x02\x8e\x75\x92\xeb\x99\x51\x0c\xf1\x75\x04\xc4\x1e\xe7\x8b\x3f\x45\x83\xb8\x34\xee\xbf\x1c\xad\xbd\x1e\xfc\xed\x7c\x70\x33\xb5\xdd\xb7\x4f\x55\x66\x3d\x4b\xca\xbb\xc2\x60\x31\x23\xc5\xee\x98\x42\x8a\x19\x19\xce\xb7\xb3\x24\xd2\xc3\x32\xf9\x47\xa4\xaf\xd2\xd9\x2e\x89\xb0\x5a\x50\xff\xa5\x28\x0d\xfe\x25\x8f\xd4\x64\x57\x5a\x87\x72\xb2\x5d\x24\x79\xa4\xfb\xcb\xbb\x55\x92\xa7\x55\x9d\xe4\xce\x31\x62\x4a\xf6\x6d\x5e\x63\xaa\x0f\x5f\xe3\xba\xb8\x4a\x2a\xed\x1a\xa4\xee\xc0\xeb\x86\x60\x9d\x29\xef\xd3\xb9\xa9\xfe\x55\x8d\xe1\x7f\xc1\x7f\xf1\xb3\xf3\xf3\x93\x77\x9f\x4f\xae\x2f\x4e\xce\xfe\xa8\x22\x90\x47\xea\x3f\x5e\xbf\x7a\xf1\xba\x61\xff\xbf\x38\x7b\x71\xf6\xdd\xfe\xff\x33\xfe\x9d\x43\xf0\xf9\x1e\xaa\x17\xd7\xf6\x44\xea\x7b\xe8\xc3\xc9\x75\x71\x61\xcd\xac\x4a\x9f\xc5\xcf\x91\xc9\x75\xf8\x8b\x35\x89\x3e\x7e\x44\x36\xdc\xf1\xcd\x88\xb8\x6c\x87\x13\x05\xc4\x8f\xf6\xa6\xd0\x97\xc3\xf1\x47\xb0\x4e\x5c\x96\x9d\xac\x2a\x7d\x35\x78\xdf\xbf\x72\xf7\x76\x6c\x2d\x13\x34\x37\x1c\x1f\xae\xbf\x97\x94\xfb\x35\x73\xc8\x5e\xeb\xfe\x74\x3a\x1a\x5f\x0f\x3e\x9f\x9c\x5f\x0d\xed\x0d\x80\xc9\xce\xd1\xf5\xe4\xc3\xf0\x26\x6e\xb7\x90\x5e\x3b\x41\x33\x2f\x20\xbb\x85\xcc\xfd\x51\x7f\x72\x32\x9c\x1c\xe9\x77\xfd\xc9\x70\xd2\xf1\xfb\x0e\x74\x82\xf2\xa8\x03\x34\x9c\xfc\x33\xd9\x74\xc4\xb4\xb9\x4f\xe2\x7b\xfa\x50\x6b\xa5\x71\x2e\x79\x3c\x98\xdc\x5e\x01\x62\xe1\x72\x3c\xfa\xa8\x87\xd3\x89\xbd\xec\x63\xa5\x5c\xe9\x84\x7d\xfe\xa7\xd1\xf8\x2f\xfa\xb8\x3f\xd1\x17\x83\x4b\x20\x1e\x7e\x37\xb8\x1a\x7d\xea\x05\x96\x2a\x52\x9d\xda\x6f\x4f\x07\xe3\x8f\x13\x37\x8e\xcd\xee\xa8\x9b\xdb\x77\x57\xc3\x73\x77\xef\x1f\x1f\x9d\x9f\xdf\x5c\x1d\x59\x7b\xe4\x88\x3e\x3b\xea\x01\xdb\x36\xbe\x16\xdf\x31\x05\xf6\x60\x6b\x0e\x7b\x53\x18\x49\xa3\x15\x26\x89\xfb\x37\x37\x57\xc3\x73\x30\x13\xaf\xfa\x9f\x62\xb0\x62\x44\x66\x19\x1e\x85\xdf\x9c\x7e\xb0\x53\x38\x91\x34\xc2\xdc\xf6\xe1\x44\x09\x2e\x58\xff\x26\xbb\x9c\xb0\x1d\xc4\x68\x1b\x2b\xf5\xce\x9a\xd8\x83\xf1\x39\xda\x4d\x40\x7b\x8a\x79\x6a\xb2\x59\xe0\x8d\x6e\x74\x3e\x0c\xac\xc5\xf4\x79\x74\xab\xfb\xe7\x70\x23\x83\x99\xfe\x7e\x3c\x18\xe8\xe9\x48\xbd\x1b\xe8\x77\xa3\xdb\x6b\x67\xee\x87\x23\x48\x4d\x8a\x89\x2f\x15\x49\xc1\x31\x1d\x3e\x81\x47\xda\xcf\xf1\xe5\xca\x73\x43\xdb\x37\x92\x85\x38\x19\x5e\x08\xb6\x67\x60\x9d\xc6\x56\x60\x0a\x9e\x6c\x34\x7c\x29\xf9\x15\x44\xc3\x1d\x73\x71\xcd\x85\x53\x11\xae\x94\x4a\x62\x7d\x74\xee\xf8\x39\x3b\x14\xee\x23\x0c\x7a\x01\x87\xd6\xc6\x94\x69\xb1\x00\x40\x60\x5a\x55\x5b\x40\x63\xd5\x2b\x47\xc5\x62\xf2\xf9\x6e\x9e\x15\x1b\xb3\xb0\xd6\x04\x53\x1c\x83\x91\x00\x1a\x2c\xa4\xf4\x81\x99\x41\x94\xdc\xdf\xe6\x5e\x99\x10\x14\x67\x00\x16\xac\x08\x16\x8c\x0a\x05\xd6\xb1\x63\xfb\x23\xf7\x7e\x6e\xe4\x2b\xf1\x41\xff\xd6\x6c\x92\x92\x29\x09\xa4\xe4\x34\xca\x8b\xa3\x97\xba\xae\x4c\x76\x0f\x24\x1c\x25\x84\xbe\xcd\x7a\x96\xa1\xc2\x72\x01\x28\x64\x37\x0e\x10\x19\x8c\x75\x1f\xe1\x9a\x2c\xcb\xce\x75\xff\x2a\xd1\x8d\x31\x6b\xc5\x36\xa9\xc8\x22\xd1\x70\xde\x25\xfe\x8b\xc7\x9e\xef\x0a\x4b\xa2\x7a\x8e\xc0\xa0\x55\x80\xe1\xf9\x55\x66\xb1\x3e\x6a\x3c\x29\x9c\x26\xd2\x37\x73\x89\x77\x78\x17\xa0\x35\xe5\x07\x49\xbe\x50\x4c\x24\x63\x4e\x00\x57\x06\x7c\x1e\x48\xac\xe3\x27\x1a\x62\xdc\x19\x45\xd2\xd7\x5b\x24\x93\x06\xb8\xd6\x1d\xd5\x0a\x2c\xca\x64\x9d\xd4\xa4\xcb\x1d\xa9\x25\xda\xd3\x49\xc6\x9f\xe8\x75\x81\x40\xfa\x74\x0e\x39\x46\x92\x61\x88\x74\x05\x69\xbf\xd2\x10\x01\x95\x9d\x8a\x3a\x64\xf9\x53\x58\x76\x84\xef\x99\x17\x76\x16\x99\xf1\xad\x4d\xed\xd4\x5e\x65\x8e\xcc\x77\x9e\x54\x75\xa4\x30\x5c\x5f\x94\x6b\xd2\x42\x48\x16\xc9\x06\xd2\x19\x92\x0a\x21\xe9\x9e\x67\x2d\xe7\x59\x7d\xdd\x3c\x37\x26\xb5\x3d\xa7\x0c\xdd\x4f\xee\x8b\x14\x93\x6c\xc5\x52\x2f\x8a\xed\xac\x8e\x58\x7c\xd0\x6d\x1c\xdb\x12\x9e\x06\xeb\xfb\x14\x15\xe7\x1f\x71\x3c\x95\x18\x4f\x48\xa4\xef\xf2\xf9\xaa\x2c\x9c\x6e\x3a\x45\x50\x78\x17\xd6\xe9\xda\x2c\x4e\x38\x37\xcd\x20\xfc\x75\x01\xb5\x4a\xe9\x3a\xb9\x33\xfa\xf8\x08\x9e\x91\xe6\x77\x47\xbd\x20\xbb\xfa\x15\x1d\x56\x8d\x45\x3c\x8f\xf5\x11\xfe\x57\x51\x4a\xdd\xf5\xb0\x68\x91\x2b\xa0\x30\x21\xbe\x34\x65\xe5\xdb\xee\x0a\x84\x54\xa7\x08\x14\x1e\x71\x5a\xeb\x45\xac\x8f\x5c\xe9\x7e\x1f\x0a\xaf\x1e\x7d\xe1\xc3\xaa\x70\x5a\x1d\xfc\xc2\x58\x29\x13\xeb\x23\xb9\xdd\x6a\xa9\x56\x0c\xee\x25\x2c\x9d\x62\x49\x05\x5e\x94\xe9\x47\x70\xfd\x23\x02\x94\xb1\x52\xcb\x98\x84\xcf\xf7\xc8\xab\xef\x93\x55\xef\xe0\x7d\x55\xb6\x07\x88\xe7\xae\x1d\x2c\x22\xdb\xe9\xfb\xb4\xc8\x5c\xaf\xba\xc5\xb3\xba\xc0\x18\x9f\xe0\xf0\x2f\x4a\xcd\x8f\x2d\xcd\xdc\x40\x84\x8c\xc5\xa4\x7c\xdc\xcb\x3b\xbc\x3c\xbf\x42\x1c\xd1\x74\xa4\x6d\x1c\xf1\xb5\xa9\x36\x69\x8d\x7a\xa1\x84\xe3\xc0\xe6\x62\x30\xed\x0c\x92\x55\xa5\xbe\xad\x0c\xc1\xba\xdb\x0c\x68\x42\xc0\xd0\x51\xfb\xd7\x85\x2e\x0d\xe2\x85\x01\x5c\x03\x38\x56\x57\xaa\x20\x21\x45\x94\xe9\x45\xea\x23\xfb\x2a\x60\x1d\x5d\x42\x7d\x2f\xe6\x1a\x39\x8a\x29\x18\x07\x14\x9d\xa9\xae\xb0\xd3\x2b\x5b\x86\xeb\x03\x05\xd8\x5b\xd0\x72\x02\x29\x21\xe0\x22\xe4\x67\xaa\x50\xf8\x90\xc7\x07\x0a\x61\x5b\xd4\xcd\x07\xab\x5d\x5d\xc5\x35\x4f\x85\x6a\x49\xb0\xb3\x66\xfa\xa3\x92\xe9\x52\x3c\xef\x98\x33\xed\x8b\x6d\x58\x14\x2c\x3a\xe0\xba\xd8\x93\x85\xad\xbc\x0e\x44\xc5\x18\x63\x9f\x59\x9b\x8d\xc4\xcc\xe0\x42\xfc\x19\xac\x12\x98\x42\x19\xb4\xc6\xf5\x08\xa2\x50\xbe\x50\x42\x9c\x6a\x4e\x50\x0b\x25\xf2\x1b\x07\x77\xe5\x14\xc2\xda\x4f\x45\xf9\x59\xf7\xd0\x85\xe7\xb8\x0c\xee\xf8\xea\x2d\xdc\xc3\x61\xbd\x07\xd3\xc7\x96\x7a\xb3\x2a\xf2\x02\xcf\xe1\x0a\xa4\x29\x49\xc6\xcf\x09\x1a\x3b\x3d\x3f\xff\x09\x10\x91\x34\x3f\xd5\xb3\x1d\x9d\x06\x90\x01\x5e\xa4\x77\x69\x6d\xaf\xdf\xed\x22\x2d\xf0\x66\xe6\x5d\x27\x7a\x4f\x99\x72\xd5\xd1\x95\x66\x37\xdc\x29\x39\xf7\x45\xc2\x87\x2f\xa1\x87\x43\x97\xd0\xcf\x4a\xa5\xb1\xbe\xc1\x4e\xc0\x23\xc6\xb0\xa0\xec\xb0\x60\x74\xed\x5d\x96\xe4\x5f\x8c\x2b\xe1\xae\x62\x7f\x4a\x40\x9e\xb7\x0a\x37\x93\xe7\x2d\x24\x83\xcc\x63\x06\xfc\xd9\x98\x41\xf4\xec\x3e\x4d\xd0\x2c\x75\xef\x66\x26\xca\x62\x9e\x9a\x7a\xa7\x50\x03\xb9\x3f\x39\xef\xdf\x44\xfa\xdd\xc7\x61\xa4\x27\x83\x49\xff\xbc\xc7\xab\xde\x36\xd2\x5f\x5c\x40\x41\x20\x9f\x06\x55\xb1\xf0\x29\xcd\x82\x92\x7f\xc5\x87\x3f\x98\x99\xb5\x34\x7a\xf2\x92\x8d\x95\x4a\xd3\x58\x7f\x34\xf3\x55\x82\x05\x34\x42\x44\x72\x52\x27\xf5\xb6\x2e\xca\x9d\x1f\xa8\xdf\x7b\x44\x60\x9a\x1a\x63\x81\x59\xfe\x2a\xbd\x03\xb8\xa9\x4a\xee\x4c\x5e\x53\x17\x3e\x80\x16\xf8\x65\xf1\xab\xee\x03\x5a\xac\x35\x3c\x90\x1f\xf7\xeb\x1b\x0b\x8b\x50\xd9\xd1\x9e\x9c\x7e\x2b\x1f\x1f\xcd\x8b\x7b\xe3\xa4\xc1\x8e\x7a\x8d\xaa\xf5\xa8\x09\x84\xb1\x0b\x69\x9b\x55\x76\x34\xe8\xc4\x50\x7c\x09\xcf\x76\xfa\xf4\x8d\xbe\x9d\x9c\xfb\xfa\xac\xd3\x57\x8e\xf3\x6a\x22\xd2\x89\xfd\x79\xad\x8f\x69\x16\xcd\x3f\xb6\xe9\x7d\x92\x21\x50\x87\x8c\x5d\x19\xf2\xad\x7a\xb1\x52\x8b\x58\x7f\xc2\x69\xb3\x87\xff\x63\x73\x73\x60\x93\xa8\x2e\x4b\xad\x65\xe2\x1e\x9c\x5c\x8f\x23\xf8\xfa\xe5\x7e\xd2\x98\x62\x9c\xce\x89\x7d\xff\xe0\x57\x2c\xec\xef\xb1\x1c\x6a\xc7\x52\xe7\xa3\xe5\x69\x8b\x3a\x6a\xd6\xb0\xb6\xe7\x4e\x1f\x9a\xbb\x97\x5d\x73\xa7\xf6\xce\x9d\xde\x33\x77\x5a\x6b\xe4\x66\xc2\x2c\x26\x8d\x00\x59\xfd\x7c\xd5\x20\x7e\x2d\xcb\x34\xd0\x03\x22\x4d\x1d\x54\x7d\x56\x6e\x70\xf3\xe2\x41\x7f\xc9\x8b\x07\x00\xf5\xd8\x59\x44\xaa\xcb\x05\x0a\xf1\x11\x29\x9d\x7c\x05\xc7\xd4\xdd\x2d\x06\x4a\x70\x88\xfd\x98\xaf\x82\xcc\x72\x65\xcf\x61\x60\xf7\xe0\x0a\xba\x6c\x17\x96\xca\x74\xdf\x89\x9c\x30\x6d\x36\x3a\x52\xb3\x6d\x2d\x72\x05\x3b\x06\x77\xbb\xa2\x34\xd7\x96\x86\x59\x5e\xc9\xba\x30\xc0\x6a\xb5\x2b\xbc\x66\x3b\xbf\x42\xbb\x0b\xbb\x5e\xc6\x7a\x4c\xd6\x13\xd6\x63\x4f\x3b\xd4\x2e\x03\x75\x7d\x1c\xb9\x80\x76\x6f\x9d\x2c\x8c\x12\xdb\xdf\xd1\x38\x79\x56\x3b\x9f\x60\x2e\xc5\xeb\xd0\x20\x70\xd4\xae\xe2\x30\x71\x57\xa6\x97\xcc\xe5\x4f\x9c\x76\xae\x3b\xc3\xe1\x6b\xb0\xe0\xb3\x9d\x92\x34\xb5\xe8\x2b\x1f\x22\x20\x70\x36\xd5\x5e\xfa\x01\xa8\x75\x83\x97\x11\xfa\x11\x9e\x3e\x36\x84\x05\x18\x2e\xac\x21\xbf\x4c\xd1\x6d\x6d\x91\x5d\xd6\x2b\x54\xb1\x54\xf8\xa0\xc0\x98\x08\x9c\xb7\xb0\x94\xfb\xd0\x00\xa8\xc3\x03\xc0\xe3\x13\xb2\xb2\x81\xdf\x42\x22\xb1\x45\xe5\x19\xe7\x9d\xc5\xfb\xc9\xb9\xc9\x49\x56\xe3\x57\x9d\x59\xbd\xdf\xbd\xa0\x51\xf1\x25\xc2\x3f\x28\xb7\xfe\x03\x22\x81\x76\x69\x41\xd8\x3e\x21\x65\xec\xaf\x5a\x37\x1f\x5f\x8c\xd9\x58\x43\x30\x99\xa3\x0e\x4b\x50\xf0\x57\x1a\xdb\xb5\x26\xa5\xa6\xe0\x70\xf1\x90\x06\xeb\xa6\x3d\xb8\xe2\xb4\xb0\x05\x5f\xb9\xfa\xd4\xc1\xc1\xf7\x43\xea\x32\x99\x8e\xdc\x18\xac\x86\xb5\x49\x2a\xd0\x5a\x84\x1a\x4d\x56\x11\xa3\xba\xfb\x22\x60\x26\x61\xdf\xde\x81\x9e\xad\x19\xc8\x7a\xb5\x3a\x2c\x50\x6f\x31\xce\xca\x92\x0c\x77\xec\x11\x39\x23\x8f\xcf\x1e\x4b\xb9\x1d\x0b\x8b\x40\x0c\x00\x9e\x2f\xca\xc4\x59\x07\xbe\x65\x56\xeb\x04\x90\x77\xa1\x1d\x91\xd6\x95\xc9\x96\x04\x07\x04\xaa\x99\xaa\xcb\x05\x6a\xfa\xd3\xcc\xfd\x82\xd7\x50\x57\xd3\x20\x1e\x26\x35\x33\xec\xa0\xbb\xd3\x8f\x97\x52\xc4\xaf\x61\x3c\x75\x99\xcc\x6b\xf4\x71\x22\x55\x9a\xb5\x1d\x1e\xe7\xf2\xb6\xfa\x03\x6c\xc7\x20\xbd\x82\xe4\xff\x70\x3d\xb8\x77\xd0\x66\xe0\xf0\x84\xc2\xf0\x44\xa4\x93\xca\x73\x5b\x62\xc4\x6f\xb8\x84\x83\xfe\x8f\x3a\xf0\xca\x96\x67\x20\x98\x09\x9a\x7b\xa9\x09\x16\xf2\xb4\xab\x1c\x58\x04\xb9\xd9\xa0\x6b\x14\x79\xb1\xb3\xb1\x48\x6b\x62\x80\x96\xa8\x75\x7b\xcf\x6d\xd7\x76\x8f\xa0\xbf\xc3\xe4\x0a\xdb\x3a\xcd\xd2\xff\x45\xc0\xdf\x79\x91\xdf\x9b\x1d\x93\x7e\x00\x20\xc8\xda\x0b\x9b\xca\x6c\x17\x45\xbe\x5b\x87\x1c\xc7\x3d\xd6\xfd\x68\x36\x22\x5d\x42\x11\x7b\x96\x9a\xc5\x5b\x5c\x41\x20\x29\x14\xec\x1e\xf9\x95\x24\x5f\xa8\x70\x11\xb8\xf6\xef\x82\xf5\xf0\xd8\x81\x1f\xe9\x74\xa9\x92\x7c\x87\x85\xd6\x7e\x1d\x10\x98\x08\x37\x18\x22\xb1\xa1\xd4\x42\xa2\xa3\x68\xcd\x62\xd5\x18\x2c\xa3\xdb\xf1\x50\x89\x5d\xe5\xce\xb4\x36\x9c\x0b\x2b\x8b\x58\x1e\x25\xcd\xd1\x94\x60\x61\x17\x7f\x7c\x42\x81\x03\x4d\x11\xab\xb7\xae\x37\x19\x1c\x07\x4c\x06\xba\x93\x93\x87\xe7\xcb\x5b\x07\xe6\x8a\x1c\xd5\x13\x32\x57\x90\xf7\x0c\xca\x86\xe0\xc1\xb6\x36\x21\x44\x5c\xd7\x69\x0e\x1c\xdb\x95\x78\x3f\x73\xe5\x98\xa4\x24\xcb\x5a\x82\x0f\xd6\x9b\x04\x49\xb3\x44\xa4\x8d\x7e\x88\xbf\x61\xde\x6d\x7f\x08\x26\xb5\xce\x4c\x52\xd5\xd6\x1e\x03\xd6\xb2\x1c\x00\xba\x34\x98\x8f\x3f\xd8\x95\x8d\x8e\x9b\xd5\x44\xbe\x7a\x19\x5e\xea\x4b\x9b\x95\xba\xbd\xbe\x02\xb4\x16\x43\x72\xf4\xc7\xdb\xe9\x2d\xd4\xe1\x42\x96\x08\xa4\x5e\x29\x3b\x04\xf8\xaa\x01\x08\x6e\x7e\x1a\x0f\xa7\x80\x5d\x72\x69\xa1\xd1\xe5\xe5\x60\x3c\xf1\x59\x3b\xc8\x2d\x42\x56\xc7\xa5\x11\xa5\x68\x26\x48\xad\x8e\x1b\x10\x2f\x57\x5d\x7a\x3e\xba\x3e\x1f\x8c\xaf\xa1\xa0\xf9\xc3\x40\x7f\xec\x4f\x07\xe3\x61\xff\xca\x4b\xbf\x8a\xa2\x68\x5f\x11\x1d\xca\x13\x0a\x80\x15\x55\xa8\x2a\xc1\x21\xda\x78\xf3\x74\x38\xbd\x1a\x44\x0e\x63\x36\x7c\xac\xac\x58\x39\x1a\xd1\x46\x7d\x30\xc9\x93\x0e\x74\xff\xdd\x64\x40\x59\xae\xab\xfe\x94\x08\x46\x31\x11\x48\xc2\xa5\x91\x94\x85\x25\x01\x5d\x18\x1f\xfc\x95\x78\x00\xd4\x60\x8b\xca\x70\xa0\x2a\x9d\x42\x8e\x75\xf4\xcb\x60\xdc\x7f\x77\x35\xe8\x12\x3d\x54\x2d\xd1\xc3\xc1\xdf\xce\xaf\x6e\x27\x94\x8f\xeb\x42\xe7\x4d\x46\x98\x93\xf3\x5f\x24\x51\x43\xc5\xa2\x86\xfa\xf3\xe8\x16\xf5\xee\x65\x71\x72\xee\x8b\x93\x63\xc6\xfe\x84\xca\x9c\xa4\x07\x7b\xc1\xc2\xaa\x3e\x67\x1a\xb5\xab\x99\xdd\xaa\xf2\x18\x3c\x7c\xb3\x26\x78\x1a\x66\xd2\x09\xa4\xc6\xa5\xce\xae\x98\x59\xa2\xf2\x02\xf8\x5d\xa4\x6f\x6e\xaf\x87\x90\x15\x1e\x8d\x3d\x4e\x6f\x9f\x66\x67\x33\x31\xdb\xa8\xd7\xb6\xeb\xdc\xa3\xd1\x5c\x9b\x9f\x50\xb6\xab\x3a\xcb\x76\xdf\xc4\x61\xb5\x6e\xf2\xdb\xf4\xc8\x42\x0d\x2e\x05\xc6\x84\x3d\xa1\x48\x2b\x8c\xe8\x65\xe8\x4e\xd9\x67\xa2\x38\xa7\xbe\x72\x01\xfe\xd4\x54\x14\xbd\x07\x86\x6b\x8a\xb3\x37\xaf\x67\x34\x39\xec\x1b\xba\x44\xdf\x1c\xdf\x9e\x6d\xb2\xb2\xd7\x03\x3c\x0d\xe5\x9f\xbc\x36\x95\x2f\x38\x76\x60\xdc\x0a\x4b\xdc\x3a\x9b\x45\xc5\x6b\x8a\x55\x08\xda\xfc\xcc\xd6\x4f\xc8\x5c\x64\xcf\x95\xab\x9e\x46\xfa\x0c\x74\x9f\x5e\x47\xfa\x0d\x3a\x4e\x3f\x62\xd3\xf6\xcb\x59\x75\x64\x3d\x1b\x91\x6f\xb4\x4c\xbb\xe2\xdf\x51\x40\xef\x22\x27\x52\xa7\x95\x0a\xc3\xd8\xfa\xa9\x61\x6c\xbe\xcb\xec\xf0\xf7\x5a\x2c\x64\xca\xb5\x48\x84\x78\xc8\x6b\xae\xc2\x30\x01\xe9\xb2\x37\x33\x59\x4e\xa2\x4f\x85\x54\x4f\x98\x3f\xa9\xea\x62\x13\xb2\xb8\x79\x7b\xcb\xd7\xd5\x74\x5c\xc4\x9e\x41\x0a\xa6\xd6\x64\xe4\x96\xbb\xe4\x25\x34\x11\x60\x7c\x69\xbd\x5a\x94\xc9\x43\xe8\x0e\x1c\x07\x15\xa1\xde\xe3\x4a\x6a\x48\x04\xcd\x8c\xc1\x5c\x6c\x5a\x79\xcd\x54\x30\x62\xa2\x16\x6b\x4c\x63\x1b\x30\x16\xa5\x27\xca\xc9\xbe\x4e\xf6\x82\xad\x21\xbf\x90\x95\xcf\x1f\xc0\x64\xe0\xce\xff\xb1\x55\xad\x9c\xc4\x7a\x60\x77\x29\x08\xe2\x35\x38\xd1\x9e\xe6\xa6\x45\x41\x8a\x4b\x71\x76\xb2\x08\xbd\x5b\xc1\x25\x26\x5d\xa7\x42\x90\xca\x74\x52\xa5\x22\xc9\x4c\x6b\x09\x13\x55\x5e\x7b\xcb\x3b\x27\xe1\xb0\xf2\x0c\xe4\xc5\xb0\x78\xb4\x59\x54\xcb\x84\x51\x6e\xe5\x2b\xac\xbb\xab\x65\xc5\x64\x57\xf9\x54\xd9\x50\xf6\x70\x5e\x3c\x6b\x9a\x70\x85\xd5\x81\x30\x0a\x57\x64\xb0\xdc\x1f\xa9\x0e\x52\x24\x88\x2b\xad\xc9\x61\xf7\xf2\x0a\x04\x53\xf0\xfd\x75\x15\x77\xa5\xc1\x34\xbf\xf3\x2e\xc8\xc0\x24\xf3\xdd\x85\xdf\x54\x10\xb6\xf3\x0f\xea\x2c\xb0\xc5\xb4\xf5\x35\xca\xf2\x51\xdd\xc0\x9e\x81\x76\x0d\xa1\x5a\x36\x08\xf6\x2e\x88\x53\x8d\xae\x08\x45\x75\x82\xd8\x4a\x69\xd8\x73\xc5\x5b\xd9\x2e\x25\x14\xb5\x7c\x80\xa9\x85\x82\x4d\x25\x06\x6a\x47\x2e\xc4\x7c\x95\x94\x77\xec\x3f\x74\x3f\x15\x83\xdf\x4f\x10\xb4\xd0\x8f\x0b\x5a\xa8\x86\xa0\x05\x2c\x73\x5a\xbe\x78\xf4\x42\x38\xa1\x34\xc4\x57\xd6\xa8\xc0\x8f\x44\xf9\x3d\xe6\x67\x03\x13\xbb\x53\x33\x03\x5e\x01\x27\x18\x79\x4f\xfc\x1e\xef\x56\xd9\x51\x53\x84\xd0\x98\x41\x24\x1e\x24\x7b\x77\x8e\x55\x22\xc9\x64\x35\x23\xd6\x86\x27\xcc\xed\xc4\xfe\x4e\xc0\x26\xa0\xf8\xe2\x6d\x8c\x1c\x07\x85\x66\x46\x3b\x18\x13\x2f\xeb\xda\xd3\x25\x73\x9d\x88\xeb\xae\x0a\x34\x0b\xe0\xb0\x85\xb0\x62\xac\x54\x0b\x3d\xe9\xd8\x6e\xdd\x44\xb7\xb7\x92\x5d\xcd\x40\xe3\x46\x51\xab\x9d\x7e\x58\x25\x75\x55\xc0\x5d\x00\x4c\x85\x79\xee\xae\x00\xe1\x5a\xc6\xba\xf5\x3a\x89\x6f\xf1\x2a\x8c\x60\xd5\x94\xca\x91\x44\x69\xb2\x7b\x90\x24\xa0\x5e\x99\x02\xab\x8d\xe0\x43\x56\x62\xf4\x6d\x90\xa5\xbc\x5c\x4b\xe3\xd3\xe9\xf0\xa3\x3b\x93\x9b\x32\xc9\x22\x9c\x58\xfb\x7f\xd2\x7c\x9e\x2e\x50\xb5\x9e\x97\x2f\x94\x57\xa6\x89\xd7\xf1\xa6\xf4\x7d\xa3\x8f\x3c\x46\x19\x9b\x5c\x07\xd9\x43\x75\xfd\x50\xe8\xe3\xb3\x9e\x86\x7d\x99\xcf\x4d\x15\xa9\x74\xd9\x1e\x19\x80\xb8\xbb\x60\x76\xca\xfe\xfd\x82\x63\x55\x74\x7c\xbb\x39\x75\x36\x64\xa4\xdc\x81\x0a\x16\x99\xd7\x35\x86\xc9\x93\x45\xd7\xc0\x48\x84\xbf\x8f\x95\x6a\x51\xd7\x61\xac\x5c\x20\x8a\xac\xd1\x36\x17\x62\x41\x2e\xb3\xe3\x2a\xd8\x28\x2b\xa5\xdc\xb6\xf4\x17\xf3\xf9\xf9\xcd\x55\xa4\x73\xaa\xb6\x12\x02\x9c\x2d\xc1\x71\x7d\xd4\x1c\x8d\x23\xe5\x64\xbd\x08\x5b\x22\xd5\xbb\xb3\xe2\xae\x00\x5e\x80\xf6\xea\xf2\x9b\x23\xa8\xa1\x52\xa2\x28\xbb\xf9\x2b\xac\x9d\xf6\x65\x7a\x5b\x21\xdc\xd5\x56\x0c\x69\xed\xa0\x1f\xec\xdb\xf2\x93\xf9\xb6\x44\x2d\xe4\xbd\xea\xdb\x91\x90\x82\x87\x61\xac\x56\x28\xda\x91\xd6\x95\x7e\x30\xb3\x2a\xad\x43\xb1\x3e\x0c\x4c\x7a\x22\x1a\x70\x07\x28\x86\x47\xe1\x41\x6b\x6a\xd8\x99\x49\xd7\xa6\x6b\x73\xd3\xdb\x80\x38\x65\x2e\xf4\xbe\xab\x9f\x9f\x3d\x9b\xd3\x97\xe7\x34\x0a\x45\x79\xf7\xec\x9f\xa1\x8c\x22\x7e\x36\xba\xba\xe8\xdf\x9c\x9c\xc6\x2f\xfe\xb0\x1a\xe0\xc3\xf8\xff\xd3\x17\xa7\xaf\x5e\xb5\xea\x7f\xdf\x3c\xff\x8e\xff\xff\x33\xfe\x81\x6c\xce\xc6\xe4\x76\x11\x34\x64\x1d\x94\xf2\x2a\x10\x2f\x22\x7d\xfa\x46\xff\x5b\x92\x6f\x93\x72\x07\xca\x47\x22\xa1\x7f\xfa\xd3\x4f\x3f\x9e\xd8\xcf\x22\x1d\x3c\xee\xd2\xde\xe7\x04\x0e\xeb\x52\x43\xb2\x27\xbd\xf9\x39\xa4\x3e\x4c\x5b\xa5\x9d\x46\x1f\xf5\xcb\x3a\xad\x6a\xdf\xb2\x23\x6b\x7d\x4b\x35\x1f\x77\x4f\xde\x98\x12\xb8\x45\xef\xca\x64\xbd\x46\x45\x30\xd4\xa5\x89\x75\xbf\x02\x5b\x0c\xb2\xbe\x79\xed\x9c\xb9\xb9\xa9\x14\x40\x6b\x23\x97\x25\x07\x6e\x63\x27\xe5\x8e\x12\xcc\x60\xb1\x26\x8b\x58\xa9\x9b\xf1\xa0\xff\xf1\xdd\xd5\x00\xd3\xda\x0d\x2a\x1a\xae\xab\x05\x92\xa0\x82\x98\x41\xf0\xb9\x0e\xfa\x25\xc5\x2e\x12\x7d\x93\xcc\xbf\x24\x77\x46\xb9\xc3\x65\x93\x5a\xdf\x10\xec\x41\x77\x2f\xf8\xb1\xfe\x50\x64\x0b\x28\xd2\x4d\x89\xbd\xa9\x2a\xd6\x46\x03\x34\x9a\xb0\x0e\x2a\xe1\xd1\xe2\x0c\x14\x60\x3c\xc0\x89\xf6\xda\xa4\x9e\xde\x08\x5e\x0f\x84\x53\x99\xd1\x77\xe9\x3d\x5f\xb9\xdb\xca\x94\x95\x0a\xbf\x16\xba\xc9\x5b\x0a\xc9\x34\x64\x0e\xa8\x47\x14\xd9\x2d\x4a\x73\x52\x94\x27\xd6\x74\x56\x5e\x1b\x78\x99\x54\x2b\xc0\x08\x6f\xb2\x6d\xd5\x91\xa3\x97\x01\xec\x80\x5b\x5c\x29\x01\x88\xff\x59\xa9\x23\x7a\xdb\x11\x86\xd7\x2b\x1f\x5f\xcf\xd8\x8f\x2e\x96\xc4\xf3\x2b\x57\x0c\xd9\xe3\xcd\x81\x45\x8c\xd7\xc2\x65\xe5\xc9\x1b\x02\xa0\x71\xfb\x81\x1e\x80\x5a\x16\xdb\xbb\x95\xae\xcd\xaf\x60\x42\xca\x26\xc7\x4a\x1d\x4d\xac\x29\x93\x94\x0b\x96\x55\x91\x8d\x45\x18\xb7\x1f\x34\xd0\x35\x64\x5c\x28\x88\x8f\xb3\xb1\x0a\x34\x4d\xec\xd1\x7b\x13\xb6\x43\x28\x19\x50\x60\xf6\x42\x14\x4a\xe9\x61\x3f\x6d\xab\x9a\x9f\x1d\xd9\x45\xfb\xb0\x02\x1b\x10\x0c\xd9\x64\xed\xd1\x75\x02\x24\x29\xb0\x91\x9e\xd0\x87\x16\x88\x7d\x2e\x00\x64\xd3\x0a\x55\x4e\x52\xc8\x8a\xfd\x00\xc9\xc4\x34\xff\x02\x5e\xd1\xcc\x1a\x15\xf6\x19\xc4\xa8\xd6\x08\x9a\xa4\x15\x8f\x86\x7d\xda\xd8\xaf\x04\xfe\xc9\xd2\x18\x6a\x6b\x52\x43\x63\x81\x90\x36\xc9\xf5\xdf\xb7\x55\x9d\x2e\x77\xec\xbc\x83\x66\x97\x1d\x01\x40\x68\xa8\x79\x61\x37\xf9\x62\xeb\x95\x0b\xd1\x03\xab\x22\xbc\xf9\x8b\xa5\xde\x98\x02\x34\xf9\x81\x33\x88\x59\x74\x40\xef\x20\xd6\xc7\x52\x4f\x58\xcd\x4c\x10\x4c\xe1\x37\xa7\xb5\xd7\x93\x6f\xac\x2c\xc8\xb3\xa2\x0a\xb3\x00\xe4\xd4\x28\x11\x01\xee\x4b\xbd\x43\x4e\xbc\xf2\xce\x20\xb0\x9f\x54\x70\xd1\xe9\x41\xaa\x98\x04\x77\xf2\xd2\x98\xb8\xa7\xd4\xd1\x65\x69\x4c\xb6\xd3\x7d\xb6\x6a\x3c\xee\x39\xa9\xad\x8b\xb1\x34\x70\xa4\xb2\xab\xc9\xc6\x69\x5a\x9b\x35\x59\xc2\xf6\xd8\xb3\x8b\x57\x81\x32\x2b\xdb\x38\x4b\x03\x8c\xb7\x38\x0c\x76\x0d\xac\x92\x7c\x91\xf1\xd1\x60\x7f\x0e\x95\xbf\x40\x38\x2f\xde\xe8\x31\x03\x7c\x70\xc0\x9b\xec\x43\x4b\x23\x49\xed\x6b\x61\xd9\x42\x8c\x45\x9c\x8f\xc0\xdd\xeb\xc2\xaa\x29\xea\x59\xb8\xb4\x3e\x92\xb0\x73\x02\x33\x79\x48\x76\xfa\xde\x94\xb3\xa4\x4e\xd7\x0e\xde\x89\xaf\xa6\xdc\x9e\x23\xec\x45\x0e\x2c\xd8\x88\xee\x66\xe3\x73\x9b\xb7\x1f\x9b\xbc\x02\xd0\xd2\xe4\x94\x87\x24\x2f\x2d\x22\x70\x0f\xb8\xab\x05\xe7\x30\x5b\xd9\x57\x2c\xcc\xf5\x19\x43\x0f\x5e\xa8\x10\x36\xcd\x9d\x43\xc2\xab\xd9\xf6\x4e\x2f\xd3\x5f\xed\xc2\xdc\x14\x65\xcd\x51\x1b\xf8\x08\x9d\x10\xc4\x1d\x05\x0c\xfa\x74\x6b\x2a\x77\x6b\xd2\x65\x7e\x51\xd8\xbb\x02\xb8\xaf\x7d\x0a\xbc\x71\x18\xe8\xbe\x1b\x00\x71\xac\x28\x3a\x9a\xec\x10\xa3\x43\x54\xd5\xed\xd2\x02\x39\xac\x7c\xbe\x21\x2a\x9a\x3b\x25\x2c\x70\x50\xcb\x41\xa5\xd6\x40\x3b\x40\x5e\x19\x48\x04\xe4\x47\x5d\xb9\x51\x4f\xf3\xca\x94\xe0\x5c\xbb\xdc\x20\x25\x4f\xd3\x5c\x43\x48\x1f\x41\x74\x0b\x14\xb0\xb1\x97\xaf\x5d\xb1\xab\xe2\x01\x43\x58\x2b\x93\x2b\x38\x2a\xe8\x5b\xf0\x60\xfb\xd5\xc8\x13\xbb\x85\xd3\x5c\xb8\x94\xa4\x1e\x5d\x0f\x1c\xf5\x17\xe3\x9e\x7e\x56\x2a\xe9\x91\xba\x2b\x74\x6a\xdd\x14\x35\xe8\x9c\x08\xe9\x92\x7c\x81\x3b\x73\xad\x71\x23\x2b\xb7\x91\x7d\x7d\xcf\x6c\xa7\x37\x05\x42\x1f\x81\xb8\x30\x7c\x47\x5d\xe8\xdb\xca\xe4\xa6\x66\x05\x29\x07\xca\x53\x98\xaf\x47\x84\x41\x96\xcc\x79\xf3\x86\xbf\x2f\x30\xfd\xfa\x77\x00\x93\xcd\x57\x76\x4f\x81\xe7\xc4\x6f\xdf\x6e\x73\x53\xc7\xdb\x6d\x9c\x1b\xc4\xe5\xcf\x40\x86\x17\x61\x5f\x9d\xa6\x09\x62\xbe\x01\x7b\xb7\x7f\x4c\xba\x37\xa2\x11\x07\x3f\x82\x9e\x67\x3d\xe7\xdf\xba\x95\xc9\x8b\x05\xce\x52\xe2\xd9\xa6\x25\x15\x6a\x03\x95\x77\x09\xd7\xd4\xc4\x4a\xcd\x7b\xba\x34\x00\x48\xb0\x4b\x2c\x2f\xf2\x93\x8a\x97\x2d\x8a\x36\xd9\x61\xb7\xf6\x94\x43\x2e\x54\x4c\xf6\xef\x28\xef\x30\x54\xc7\x6d\x17\x3f\x63\xc2\x4e\x2f\xc3\x31\x33\x22\xd2\x2f\x96\x97\x4e\x7c\xf1\xdb\xda\xda\xd3\x99\xde\x58\xfb\x0f\xf8\x08\xec\x1a\xde\xd3\x32\xb2\x42\x32\x93\x94\xd9\x4e\xe8\x99\xda\xd5\x9d\xb2\x39\x5b\x79\x60\x4e\xc7\x9e\xa4\x6a\x9b\x1e\x2e\x3b\xa7\x73\x2c\x28\x7a\x7c\xcd\x58\xe5\x2d\x89\x0e\xdb\xe1\x65\x17\xc0\x8f\xe2\x04\x60\x7b\x57\x5d\x5b\x5b\xa8\x7a\x40\x50\xda\xf5\x4d\x21\x14\xe6\x5b\x37\xa0\x68\x42\xd2\xea\x37\xff\x46\xce\x31\x62\x19\x67\x25\x58\xa2\x29\x4c\x5f\x5d\xdc\x01\xd0\x14\x8b\x19\x53\xaf\x2c\x5f\xe9\x63\x5a\xb3\x62\xb6\x98\xb4\x16\x77\x5a\x4f\x83\x94\xbb\x41\x7d\xb8\x3b\x53\x77\x2e\xf1\x58\xa9\x59\x0f\x4c\xb5\xf5\x06\xb2\x41\x4d\x91\x14\x37\xe0\xeb\x64\xbe\x4a\x73\x73\x62\x1d\x0e\x98\x7a\xba\xc9\xc2\x3d\x82\x2d\x6d\x6f\x31\x5c\xea\xfe\x3d\x07\x57\x3b\xbf\x33\x85\xdd\x83\xd4\x1d\x10\x74\x6b\x6d\xd0\x60\xb1\x0b\x37\x61\xef\xa3\x83\x3f\xc0\x76\x42\xe3\xba\xb9\x84\xf9\x41\xc2\x21\xb3\x8b\x45\x8c\x76\x05\x29\x2e\x31\xde\x07\xa7\xeb\xd0\x5c\xfc\x21\x9b\xe1\x95\xdf\x0c\x68\x67\xe9\x44\xfa\x2f\xc2\x6a\xf5\x41\xd7\x96\x38\x8e\x34\x7a\x9b\x4f\xcb\x77\xf0\xe3\x9d\xd3\x07\x81\xe7\x38\x91\x8f\xc6\xcf\x25\x00\x52\xb9\x06\xf1\xdb\xc3\x3d\x09\x16\x60\xac\x3f\x70\x32\x7a\xd7\xb5\xa9\xfd\x0f\x94\xbd\x9f\xef\xee\x4a\xe0\x98\x24\xb2\x2e\x18\xb8\xe3\x4d\x01\x82\xfb\x18\x89\x37\xe5\x3c\x4d\xb2\x9e\x3f\x0b\x92\xca\xf1\xf5\x25\x68\xdf\x96\xaa\xfb\x27\x6d\xad\x5e\xa7\xef\xd4\x3c\x18\x20\xce\xbe\xb8\x37\xd6\xdb\x35\x2a\xe8\x17\x96\x3f\x63\x8d\xaa\x7d\xe9\x8e\xe4\x5c\x10\xb6\x61\xdd\xf6\x6a\x5e\xa6\x9b\xba\xe3\x24\x70\x98\x32\x04\x4f\x6e\xb6\x60\xd0\x63\x26\x69\xb1\x9d\xe3\xe7\xc5\xb6\xde\x6c\x6b\x6f\x6a\xed\x3d\xf4\xb8\x99\x12\x87\xa0\x97\xd6\x94\xf2\xe6\xaf\xb3\x16\x55\xe3\xd7\xe8\x31\xcc\x0c\x48\x2f\x01\x89\x4b\xb1\x06\x77\x07\xa3\xef\x54\x23\xb8\xe6\xa4\x02\xd8\xed\x55\x91\x2d\xc4\x80\x72\xd1\x12\xd3\x87\xf2\xdc\xb9\x88\x49\xe0\x6b\xbd\x89\xf5\xb9\xae\xb6\xb3\xb2\xb0\x6e\x89\x1c\x8b\x19\x18\x6d\x34\x5a\xf9\x17\x2e\xc2\x6e\x1d\xf0\x25\x1a\x00\xca\xac\xb7\x59\x02\x56\x84\x7f\x18\x88\xd2\x27\x65\x8a\xa7\x83\x2b\xaa\xde\x85\x4f\xf1\xa9\xcc\xc0\xcc\x54\x01\xdf\x63\x30\x40\x09\x01\x55\x45\x39\x02\xc4\xda\xed\xd4\xc1\x1c\xea\x9b\xa4\x4c\xee\xca\x64\xb3\xd2\xaf\x03\xb3\xd2\x54\x61\x0b\xf9\xb6\x27\x89\x45\xeb\x41\x9a\x55\x72\x9f\x16\x65\xe3\xe8\x95\x84\x95\x80\xf5\x7d\x80\x18\xd1\x3c\x01\x7e\x3b\x58\x31\xcb\x24\xcd\x28\xc9\x7a\x57\x1a\x2a\x00\x33\x55\xed\xab\x3a\xfc\xb8\xff\x18\x7b\x31\x93\x03\x43\xde\x9a\x32\x39\xe4\x60\x26\x89\xce\xa8\xdf\x34\xdc\x01\xbd\xa6\x72\xdb\x2a\x5f\x7c\xdd\x8a\x6e\x4d\x98\x62\x04\x8f\xbc\x28\xdc\xce\x9a\xed\xa0\xab\xf6\xb0\x84\x1d\x1b\x30\xba\x85\xed\x5e\x27\x3b\xc5\x4c\x71\x48\x34\xdf\x0c\x07\x36\xbc\xb8\x83\x9b\x24\x56\xea\x27\x3c\x17\x24\x83\x5d\x47\xd0\xcd\x25\x10\xf7\x53\xd4\xa9\xaf\xa0\xa8\xd3\x4f\xa1\xa8\x3b\x7d\x1e\x23\x1b\xc5\x4d\xff\xfc\x2f\xfd\xf7\x8f\x0b\xae\x3c\xce\x41\xa7\xda\xd0\x40\x29\x2f\x8e\xcc\x26\x07\x39\xe8\x86\x9e\x83\x4e\x3d\xc6\x41\x87\x23\x3b\xc8\x17\xff\x04\xe9\x90\x7f\xb9\x7f\x8e\xff\xe9\xfc\xe4\x2c\x7e\xf5\x1f\xc1\xff\xf4\xe2\xec\xd5\xeb\x26\xff\xeb\x8b\xb3\x17\x6f\xbe\xe7\x7f\xfe\x8c\x7f\x8f\xf0\x3f\xe5\xe7\xee\x98\xd4\x67\xf1\xab\x83\x24\x50\x6a\x88\x74\x4d\xbf\x07\x09\x94\x03\x9d\xfe\x66\x12\x28\xc5\x24\x50\xfa\x3b\x09\xd4\x77\x12\xa8\xef\x24\x50\xdf\x49\xa0\xbe\x93\x40\x7d\x27\x81\xfa\x4e\x02\xf5\x9f\x85\x04\xea\x9b\xa8\x9f\x54\x07\xf5\xd3\xe2\x8f\xa5\x7e\x32\xdf\xa9\x9f\xbe\x53\x3f\x7d\xa7\x7e\xfa\x67\xa1\x7e\xa2\xf4\x21\x34\x8f\xb8\x6f\x02\x69\xe2\x16\xf3\xc6\x5b\x38\xec\xfe\xe9\xe9\xa2\xde\xc2\x41\xf8\x9f\xa8\x1b\x1d\xe3\xfc\x2f\x46\x07\x13\xab\x90\xd3\xa5\x43\xb5\xfb\x11\x4e\x17\x81\xc8\x07\x6a\x19\xa7\x6c\xef\xcb\x67\x98\x5a\xc8\x00\x02\x1d\x72\x62\xbe\xba\xef\xe5\xf1\x02\xa9\x9d\x5e\x1e\x9b\x5e\x07\x41\xcc\xb7\xf2\xc3\x48\x8a\xa1\xef\xfc\x30\xdf\xf9\x61\x1e\xe7\x87\x01\xb7\xe8\x31\x8e\x98\xfd\xbc\x16\x92\x23\x46\x7d\x05\x47\x8c\x7e\x1a\x47\x8c\xfa\xe6\x15\xd8\x2a\x3e\x54\x4f\xe1\x88\xd1\x4f\xe1\x88\x51\x4f\xe1\x88\x69\x4d\x52\x17\x47\x8c\x7a\x1a\x47\x4c\x17\x07\x44\x8b\x23\x46\x3d\x8d\x23\x46\x74\x64\x1f\x47\x8c\xfa\x0a\x8e\x98\xae\xa6\x09\x8e\x18\xf5\x6d\x1c\x31\x7a\x3f\x47\x8c\x72\x1c\x31\x4c\x5d\x21\x8a\x68\x67\x3b\x3d\xcf\x20\xe7\xf7\xf2\x78\xde\x6b\x70\xc2\x34\x1b\xae\x1a\x17\xe1\x1f\x42\x6e\xd3\x74\xf0\x9e\xdc\x70\x25\x1a\x2e\x37\x87\xdb\xd8\x24\x99\xd9\xb1\xb9\xa9\xe0\xcc\xdf\x17\xca\xdd\x17\x98\x25\x95\xb2\xae\x69\xa5\x37\x65\xba\x4e\xca\x34\xdb\x79\x2f\x60\x89\x44\x3b\x8b\xb4\x34\x73\x7c\xe4\x43\x52\xca\x14\x9d\x4a\x16\xf7\x49\x5e\x13\xf2\x66\x03\x9d\x34\x7a\x5d\xe4\x06\x24\x29\xad\x7f\xcd\x11\x07\x5c\xef\x86\xf8\xf4\x82\xbd\xb4\x74\xa6\xbc\x33\x7f\x51\xb2\xe5\x4b\x15\xd8\x33\x6c\xcd\x2c\xd3\xcc\x9c\x54\xab\xa4\x24\x9c\xb2\xc7\xed\xb9\xb4\xa9\x6a\x80\x21\x0b\x96\x69\x7d\x5a\xbf\xb4\xec\x97\x3a\xd8\xaf\x00\x1e\x85\x75\xf2\x3a\x2f\xf4\x26\xd9\x31\x9c\x1f\xc6\x9a\x7e\xaa\xe4\x4f\xf5\x9e\xa2\x42\x39\x48\xad\x11\x41\xe7\xff\x0f\x27\x35\xb2\x8d\x6e\x9a\x88\x4f\x20\x3b\x52\x87\xc8\x8e\x74\x8b\xec\x88\x86\x2e\xfa\x16\x56\xa3\x9f\xf5\x71\xda\x73\x98\x40\x3b\x56\x4d\xb2\xa2\x80\xe0\x08\xca\x11\x05\xc3\x91\xe4\x29\x02\x8b\xe3\x99\xfd\x45\x9a\xc2\x1f\xea\x0e\xea\x23\xfa\x8a\x73\x0a\x1d\x0b\xa8\x4e\xf2\x42\x14\xff\x15\xa5\x2b\xef\x45\x16\xc8\x44\x83\xf0\x12\xa8\xb7\x52\x38\x2c\xe2\xd2\x38\xbb\x82\x31\x42\x11\xa9\xbf\x17\xdb\x32\x4f\xb2\x1e\xa2\x91\x7c\xba\xc7\x2e\x13\x7e\xeb\x0f\x55\x97\xea\x1d\x9f\xd0\xa4\x13\x44\x70\x50\x6c\x94\xac\xd8\xb0\x03\x19\x05\x43\xe6\xa5\x38\x45\xbb\x05\xb3\x93\xda\xcb\xec\xf4\xd5\xac\x4e\x6a\x0f\xab\x93\xfe\x7a\x56\x27\x11\x5e\x69\xb0\x3a\xe9\x6f\x60\x75\x52\xfb\x58\x9d\xde\x32\x11\x52\x1d\x10\x31\xb5\x2e\x8c\x84\xcf\x72\x2a\x67\xdd\x31\xab\x45\x07\xb1\x5c\xd7\x6d\x00\xcb\x24\xd2\x47\x97\xa5\xc9\xe7\x2b\x19\x31\x66\x91\x5b\xf8\xda\x6c\xd7\x5c\x93\xd1\x91\xed\xc8\xd1\x64\x5e\x1a\x93\x83\xbf\x88\xa1\x6b\x08\x67\xd2\x37\x9b\x3f\x25\xa6\xb4\xa3\x1e\x89\x72\xff\x26\xce\x2a\xe5\xe8\x52\xba\x39\xab\x9a\x3d\x6d\x1f\x20\x21\x8d\x95\xda\x43\x63\xa5\xbf\x85\xc6\x4a\xed\xa3\xb1\xd2\x5f\x4b\x63\xa5\x24\x8d\x15\x12\xe3\xff\x0e\x21\xe7\xdf\x44\xf9\x1c\x10\xa4\xfc\x57\x22\x7d\xc6\xe3\x37\xa9\x83\x87\x75\x9a\x27\xea\xeb\xae\xf1\x47\xcc\x93\x6f\xe7\x9a\xfe\x9d\xa6\x22\x60\x9b\x4e\x80\x41\xfa\x3b\xd9\x34\x11\x16\xc3\x3d\xf1\xb9\xd8\x96\x2d\x84\x2e\xc9\x86\x8b\x0e\x04\x8b\x45\x7d\xa3\xcd\xf7\xe8\x62\x31\xff\x41\xdc\xd7\xdd\x8b\x0d\x97\x8d\xfa\xa6\x7d\xdf\xc9\x7e\xad\x1a\xec\xd7\xfb\xf7\xfc\xe3\xec\xd7\xaa\x8b\xfd\x7a\xff\x62\x3a\xcc\x7e\xad\xbe\x6a\x31\x75\xb2\x5f\xbb\xc5\xa4\x0e\x74\xe1\x4f\x70\x88\xfe\xab\x92\x22\x12\xfb\xdc\x6f\xe0\x43\x94\xa0\x47\xf5\xdb\xf8\x10\xf5\x5e\x3e\x44\xf5\x2d\x7c\x88\x7a\x3f\x1f\xa2\xfa\x76\x3e\x44\xdd\xe4\x43\x54\xdf\xce\x87\xa8\xbf\xf3\x21\x7e\xe7\x43\x3c\xc4\x87\xf8\x14\xaf\xbe\x8b\x23\x51\x75\x73\x24\xea\xdf\xc2\x91\xa8\xda\x1c\x89\xfa\xdb\x38\x12\x55\x07\x47\xa2\xfe\xce\x91\xf8\x9d\x23\xf1\x9f\x93\x23\x11\x42\x70\xcd\x78\x77\x48\x9c\xa8\xbf\x99\x38\x51\x75\xc2\x1f\xbe\x8d\x38\xf1\x1b\xfb\xd9\x8e\xa2\xa8\xaf\xef\x57\x18\xe3\xf8\x23\x3a\x38\xff\xce\x0c\xf9\xc7\x33\x43\x2e\xfe\x8b\x31\x43\x9a\xef\xcc\x90\xdf\x99\x21\xbf\x33\x43\x7e\x67\x86\xfc\xce\x0c\xf9\x9f\x95\x19\xf2\x3f\x3f\x31\x64\xfc\xec\xea\xfd\xcd\xd5\xc9\x59\xfc\x1c\x58\xda\x92\xda\x94\xbf\x7b\x11\xe0\xe1\xfa\xbf\xd7\xcf\x5f\x3c\x7f\xdd\xa8\xff\x7b\xf9\xf2\xf4\x3b\xff\xe3\x9f\xf2\xef\xfd\xf5\xad\xbe\x1a\xbe\x1b\xf7\xc7\x9f\xf5\xfb\xc1\xf5\x60\xdc\xbf\xd2\x61\x89\x98\xa7\x81\x3c\x8b\xf4\xbf\x6d\x73\xa3\x4f\x7f\xfa\xe9\x54\x44\x45\x8f\xcf\x7b\xf8\xd1\x65\x69\x8c\xaf\x64\xf7\xec\x8f\x91\x1e\xe6\xf3\x58\xa9\x57\xf6\x2b\x49\xfe\x25\x4b\x73\x3d\xa9\x23\x7d\x99\x2e\xeb\x95\xbe\xcc\x8a\xa2\x8c\xf4\xbb\xa2\xaa\xed\x57\x3f\xf6\xf5\xf3\xb3\xd3\xd3\xe7\x27\xa7\x2f\x9e\x9f\x46\xfa\x76\xd2\x57\x6a\x70\x6f\xca\x5d\x91\x63\xb4\xd4\x9d\x1f\x10\x85\xde\xec\x9a\x14\x84\x9d\x6c\x60\xfe\x16\x51\xcc\x3b\x82\xa0\x26\x08\x3c\x03\x4a\xbd\x76\x57\x74\x96\x15\x0f\xa0\xea\xf4\x7f\x81\x95\x90\xe2\x85\x80\x50\x73\x72\x7b\x17\x2e\x0b\x40\x26\x00\x93\x48\xbc\xbf\xb9\x02\x66\x34\xfb\x2c\x28\x85\x32\x0b\x7d\xa6\x67\x06\xb8\x01\xec\x05\x72\x57\x30\xed\x0a\x3f\xe1\x4c\x3b\x02\xb1\x45\x9a\xf3\x43\xfe\x6f\xa5\x6e\x4a\x93\xac\xad\x35\xaf\x04\x40\x13\x03\xe3\xeb\xa2\xaa\x7d\x39\x39\x10\x66\x18\xb4\x27\xe1\x98\x02\x8e\xb4\x87\x84\xa8\xb6\x96\xa5\x31\x0b\x7b\x8a\x15\xf6\xfa\x2a\x0d\xd2\xb0\x20\xf4\x23\xad\x63\xfd\x6e\x87\x40\xb4\x84\x49\x30\xed\xa2\x78\x8f\x17\x79\x83\x13\x14\x81\xb1\x02\xbe\xaf\xee\xb6\x09\x38\x38\xa6\xfb\x5d\x5a\xbc\xcb\xfe\xcd\x35\xfa\xe4\xc4\x9b\xef\x98\x97\x50\xae\x3f\x69\x85\xdf\x05\x4b\x24\xcb\xe0\xe0\x06\x3a\xca\xd8\x0e\x85\x9f\x4b\x76\x54\x69\xe8\x3b\x5b\x1c\x49\x65\x34\x24\xcb\x44\xcb\x24\xdb\x79\x68\xc5\x62\xef\xda\x75\xed\x75\xb0\x74\x9f\x1c\xc6\x39\x07\x2b\x7a\x55\x54\x46\x51\x22\x57\x2f\x8c\xb5\x78\x98\x94\xc1\x8e\xf0\x67\x22\x28\x24\x7e\x08\xdb\x2f\x18\x2d\xf7\x84\x48\xd7\x45\x11\x2b\xf5\x69\x65\x72\xfd\x00\x6d\x4c\xa0\x56\x25\x18\xb3\xc8\xfe\xc9\xb6\x0f\x40\x07\x25\x99\x0b\x34\xe4\x11\x95\x93\xa4\x73\x13\xeb\xd1\xb6\x54\x87\x66\x50\xae\x16\x39\x09\x44\xaf\xc2\x71\x36\x7e\xb6\xea\x06\x94\x37\x9a\xa7\x8f\x69\xb2\xcb\x3b\x41\x36\x43\x60\x11\x62\x82\x54\x0f\x69\xb5\xea\x45\xfe\x55\x14\x2f\x64\x8e\x23\x26\x87\xb2\xa3\x75\x67\x6a\xd8\x96\x88\x41\x7a\x48\x72\xfb\x9f\xfe\xa7\xca\x7e\x47\x90\x75\xb8\x66\x10\x8c\x72\x93\x5a\x4f\x11\xcc\x2b\x08\x7b\xe5\xe6\x01\xdb\xcb\x74\x2d\x6f\x29\x62\x93\xd4\x40\x0b\xf7\x25\x2f\x1e\x1c\x95\xe4\x02\xcc\xb0\x0a\x69\x2b\xef\x60\xe1\x15\xf6\x87\xb5\x75\x62\x60\xee\xd0\xf4\x83\x29\xc9\x8d\x18\x49\x89\x75\x26\x8a\xb9\xa2\x9c\x81\x47\x0a\x67\x58\x5d\xa8\x85\xc9\x91\xdd\x03\x5f\xc1\x35\x29\x10\x22\x4b\xaa\x2f\xf8\xa7\xc2\xce\x49\x69\x9c\x99\x57\x52\x59\xcd\x14\x7f\x23\xde\xa2\x18\xc9\x01\x6b\x6e\x6e\xca\x3a\x49\x73\x8d\x64\x4e\x55\x0a\x9e\x3d\x27\xd4\x80\x46\xaf\x89\xe9\xf2\xf3\xa9\xc4\x51\x86\xf1\x30\xfc\x2e\x11\xf7\x01\x34\xe1\x12\xa8\xbb\x92\xf5\x26\x33\xd1\xa1\x67\xe9\xe0\x59\x9c\x26\xbc\x2b\x93\x3a\x85\xbe\x2e\xad\x23\xa2\x97\xc6\x10\xed\xd0\xb6\xaa\xbd\x28\x9d\x07\x17\xc3\x01\x20\x82\xdc\x30\xa2\x0f\x46\xdf\xd9\x25\xba\xb3\xae\x1c\x03\xc3\x54\x63\x21\xd7\x2b\xb3\x83\x7d\x15\xb9\x45\x26\x16\x56\xbd\x0a\xd6\x9c\x83\xba\x65\x69\xfe\x45\x25\xbc\x46\xbc\x9f\xe5\x7a\xe2\x1a\xcb\x84\x6e\x8e\x32\x98\xf8\xcd\x90\x47\x08\xed\x78\x25\x3a\x02\xcc\x72\xd4\x2e\x68\x46\x69\xed\xd5\x2f\x1a\xf8\xff\xda\xef\xc1\x8a\x86\x75\x02\x7c\x28\xb8\xcc\x2b\xc6\xca\xf2\x6d\x93\x50\xf6\x76\xbd\x49\x33\xbc\xc4\xac\x91\xbd\xf0\x6d\xac\x56\xc5\x03\xbe\x80\x56\x33\xc4\x71\x90\xe3\x6e\xa7\x60\xc5\x63\x38\x9d\x56\x97\x52\xa3\x6d\xa9\xd7\xa6\x5e\x15\x00\x55\xa7\x15\xef\x28\x59\x68\x12\xac\x0f\x65\xdd\xad\xaa\x36\x9b\xea\x67\x7d\x7c\xda\x13\x11\x66\xd9\x0b\xb8\x6a\xac\x53\x86\x58\x74\x5c\xf3\xa2\x16\x0c\x0b\x41\xef\x80\x69\x17\x46\x1f\x1c\x51\x51\xaf\x46\x97\x7c\x24\x96\x98\x22\x84\x1c\x2d\x4a\xf1\xba\x58\xa9\x7e\x56\x15\x91\x76\x64\x7a\xee\x57\x00\x69\xe3\xde\x58\x3b\xe3\xc1\xe0\x89\xc2\xdb\x96\xb7\x0d\x4c\x91\x21\x83\x43\xf9\x48\x47\xe5\x26\xcf\x61\x2f\x9d\x97\xee\xce\x3a\x38\x5e\xb8\x31\x76\x45\x89\xc6\xa9\xb4\xf2\xd1\x85\xd9\x0e\xee\x22\x7b\x1e\x98\x8c\x32\x39\x9b\xa4\x42\x50\x95\x6f\x9c\xbd\xf8\xc4\x0a\xaa\x0b\x38\xa4\x30\x18\xfe\xe0\xd6\x12\x9c\xd6\x64\xbc\x04\xf1\x4a\x51\xc1\xab\x5d\x00\x7d\x53\x16\xb3\xcc\xac\xa1\x08\x8f\x98\x77\x14\xa3\xf8\x44\xdc\xa0\x34\xcb\xcc\xae\x66\x0a\x77\xba\x67\xd2\x25\xf7\x83\x2e\xcd\x66\x5b\x3b\xca\xb9\x4b\xfb\xc7\xcc\x2e\xdb\x7c\x17\x9c\xb2\x68\x3e\x41\xaa\xdd\xde\x37\x10\xa4\x4a\xf2\x1a\x4b\x88\xdc\x91\xbd\xb1\x7f\xb6\xa7\xdb\x27\x03\x37\x04\x9c\x84\xf7\x45\x8a\xf9\xad\x85\x5d\xfc\x25\x43\xe6\xd7\x9b\x24\x4f\x25\x9d\x33\xd6\x05\xca\x8b\x08\x7a\x21\x11\x09\xaa\x98\xc1\xec\xe2\x7b\x9c\x2d\x65\x2f\x93\x2d\xd4\xee\x50\x28\xde\x95\x1e\x73\x78\xc1\xf5\x22\xaf\xe1\xfc\xdf\x94\x29\x02\x6c\xf9\x5d\xb1\x86\x8b\xc1\xdc\x83\x53\xba\x4a\xf1\x46\x80\x29\x01\xb7\x32\x25\xd2\x46\x31\x01\xd8\x06\x22\xf4\x75\x81\x36\x64\x80\xa4\x85\xf7\x03\xad\xa5\x2d\xd6\x5b\x60\xc1\x0f\x79\xfe\x50\xae\x91\xc5\x4a\x7d\xb4\x46\xa0\xb5\xd5\xbc\x7d\xe0\xe3\x33\x60\xea\x08\xfb\x22\xad\x10\xbe\xe2\xcb\x73\xbc\xb9\x79\x7d\xbb\xc7\x58\x60\x5a\xcb\x07\xa8\x80\x27\x93\xc1\xb6\x13\xd0\xb1\xf5\xce\x5d\xa5\x71\xc0\xe2\x1e\x29\xb6\x22\xbf\xc2\x36\xe3\x0d\x28\x8c\x32\xd7\xfc\x58\x35\x49\xe2\xff\xb1\xb5\x5e\xbc\xcb\x36\x79\x08\xbc\xeb\x55\x91\x9b\xb7\xc0\xf6\xb4\x45\x2e\xc0\xd2\x24\x0b\x9d\xd6\xac\x8d\x16\x11\x9d\x55\xfe\x43\xad\x93\xaa\xda\xae\x8d\x9b\x21\x57\xb6\x8a\x3e\x01\x47\xfb\x89\x4d\x4c\xbe\x84\xc3\x31\x31\x9a\xe8\x08\x61\x74\xf3\x2f\x98\x3e\x29\x9c\xc3\x1d\x00\xfe\xbe\x60\x82\xf0\x45\xb4\xa3\xd5\x2c\xdb\x52\x4a\x0f\xca\xfd\x29\xe4\x67\x97\x03\xe2\x6b\xe0\xc4\xe2\x70\x2e\x9e\x83\x84\x51\x4f\x16\x0b\x32\x0b\xdd\x1d\xa6\x30\xd8\xbc\xde\x64\x3b\xbd\xad\xf8\x9a\xb8\x62\x36\xee\xf0\xaa\x4b\xc4\x95\x4d\x41\x1e\xe7\x22\xd9\xfb\xcc\xfd\x15\xd2\x11\xcc\x3e\x0f\x61\x73\xf9\x86\xf0\x26\xcb\x17\x00\x37\xca\x93\xac\xb8\x2b\xb6\x30\xdb\xe5\x36\xcf\xa1\xa4\xb1\xb9\x94\xa0\x13\x1b\xcf\xd1\x4d\x1f\x0b\x92\x42\x80\x5a\x32\xd5\x3a\x94\x9d\xd9\x4b\x43\x55\xde\x23\x20\xc2\x34\x41\x9e\x0a\x68\xa7\x79\xb1\x9e\x01\x89\xc3\x03\xc1\x69\x3d\xcf\xbb\x6e\x70\x38\xab\xa0\xf1\xe1\x6e\xe9\x5c\xca\xba\xb6\x47\x5c\xa5\x53\x07\xf4\x8c\x95\x7a\x87\x6e\x9f\x73\x41\xed\xb4\x96\xc8\xff\xcc\xb3\x1a\x89\x01\x7b\xe4\x15\x70\x40\xf8\x05\xb3\x48\x17\x58\xa2\x01\x27\x57\x7a\x6f\x00\x13\x0d\x1c\x64\xfe\x20\xa4\xea\x85\x88\x3d\x50\x74\x1c\x49\x07\xc0\x94\x95\xe2\xa7\x70\xac\xd0\x6f\x39\xfd\x09\x02\x5a\x50\x14\xb7\x60\xb3\x2b\xf9\x82\x9c\x1e\x9c\xeb\x5a\xc3\x8d\xcf\xd4\x67\x5c\x2b\x31\x33\x75\x0d\xc5\x5e\x6e\xce\xb6\x39\x1b\xac\x66\xe1\x48\xde\x8a\x25\x14\x31\x07\x36\xb9\x46\x2a\xbd\x85\xd9\x94\x6c\x0b\x0a\x21\x82\xa2\x0a\xc9\x16\x31\xb1\x92\x9b\x65\x2a\x4e\x00\xbc\x0a\xea\xa4\xde\x36\xcc\xd0\x14\x13\x23\xc4\x28\x42\x67\xca\xe1\x13\xaa\x59\xac\x8e\xd1\x07\x31\x80\xb2\x13\xca\x35\x8d\x5c\x3f\x61\x0e\xa4\xc4\x11\x9c\xd9\x0e\x40\x42\xdd\xd9\x54\xec\x32\x03\x8d\x87\xed\xac\x35\xc4\x39\xa7\xe5\x9e\x27\x1c\x9d\xf0\xb1\x74\x6c\x81\x5b\xde\x2a\x8d\x5e\xc7\xea\xf8\x13\x1d\x47\x98\x26\x37\x39\x50\x06\xdb\x03\x62\xbe\x4a\xcd\x3d\x31\x7c\x42\x79\xd0\x5d\x52\x2e\x2a\xb6\x35\x81\xf5\xdd\x24\xd6\xfd\x40\x8e\x5c\x28\x3d\x75\x67\x1b\xfe\x78\xa1\xb9\xb4\xa8\xf5\x5b\x80\x12\xcc\x61\x93\x2e\xb7\xf9\x5c\xd4\xbe\x1b\x45\x83\x1e\xf7\xa0\x58\x67\x55\x6c\x8c\x38\xff\x52\xb2\x42\x32\x7b\x60\x03\x95\x62\x45\xb5\xbd\x52\xbc\x22\x1c\x04\x3a\x80\x37\xd6\x58\xaa\xf6\xd4\xdd\x2f\x49\xb9\x00\xf6\x43\x48\xf5\x9a\x87\xb4\xda\x0a\x2b\x57\x63\x7d\x93\xec\xf4\x3c\x83\xda\xc9\xda\x5e\xda\x2e\x2b\x21\xe9\x6a\xdd\x41\x9c\xe8\x23\xc1\xeb\x82\x86\x13\x1f\x24\x47\xc8\x01\x4f\xdf\x80\x9e\x6e\x2b\x53\xc9\x83\xf2\x08\x4b\x97\x20\xf9\x89\xc4\x39\x20\xf0\x01\x1e\x71\x8b\xdd\x5d\x38\x56\x69\x46\x5b\xd7\xb6\xb1\x24\x5a\x6c\x40\xd7\x30\x4b\x6e\xcb\xbb\x88\x95\xba\x2e\x6a\xba\xf1\xf0\x96\x23\x3a\x56\x0a\xba\x38\x0f\x83\x12\x92\xfb\x2c\x07\xdc\x34\xaa\xb1\x69\xca\x04\xde\x5a\xaf\x92\xdc\x31\x4e\x52\xd4\xc5\x5e\xcb\x76\xb2\x3a\xd8\x8e\x00\xb6\x75\x3e\xba\xf9\x0c\x10\xbd\x80\x15\x0c\x00\x83\xa3\x8b\xe1\xe5\xf0\x1c\xa9\xc6\xd4\xf3\x46\x0a\xcf\xd5\x3b\x4a\x93\x02\xf0\x22\x7c\x14\x72\x8f\xd0\xa2\x71\xc3\x9b\x28\x2a\xd5\x00\x1a\x77\xd7\x45\xef\xce\xac\x90\xfc\xd1\xd1\x4b\xa0\x01\x9c\xfe\x2f\x62\xc9\xdc\xe9\x2a\xd9\xe1\xa5\xca\x1a\x2e\x92\x8a\x72\x7f\x0d\xf2\xa1\x63\x47\x1d\x03\x87\xf8\x3c\xc9\x32\xb3\xd0\x47\x32\x53\x78\xd4\x23\x30\x04\xd9\x12\x78\xb7\x2d\x16\xa5\x01\xef\x21\xa9\xf4\xd1\xae\xd8\x1e\x59\x57\x48\x1f\xb9\xc5\xc7\xbc\x43\xa1\x8a\x89\x1b\x1b\xbf\x41\xc9\xb7\x5a\x24\x35\x30\x7d\x6c\x92\xd2\x2c\x54\x55\x40\x56\x8c\x96\x42\x7e\x6f\x72\xeb\x8f\x64\xbb\x80\x99\xb4\xe3\xd2\xae\xf4\x31\x8e\x36\x90\x93\x16\x6b\xe3\x4f\xf1\xe0\x8d\xf0\xba\x1e\xec\xf5\xa2\x5c\x4b\x72\x50\xda\xd7\x47\x34\x5c\x47\x11\x32\x4f\x44\x42\x40\xc5\x81\x82\x5a\x33\x5d\x94\x48\xf9\x82\x6d\x58\x25\x95\x02\xe5\x94\xce\xe9\xe1\x43\x23\xd6\xfd\x8e\x5d\xcc\xd3\xc5\x03\x89\xb9\x36\x25\xa3\x8f\x9c\x34\xf5\x26\xc5\x83\x47\x45\x05\x8c\x22\x3f\xbb\x52\xc8\xba\xb0\x8b\x27\xd2\x09\x30\x5e\xf1\x9a\x64\x73\x40\x3e\x19\x84\x20\x68\xd6\xd2\x3a\xa2\x06\xf8\x58\x77\x41\x7b\xbc\xc1\x63\x80\x93\xe9\xc2\x43\x0b\x5d\xd5\x65\x62\xdb\xb1\x2c\xca\x87\xa4\x5c\x20\xe6\xb8\x70\x95\x65\x99\x53\x4b\x3a\xfe\x60\x4a\x93\xe6\x10\x84\x88\x64\xa9\x90\x4a\x1d\x99\x82\x4f\x92\x8b\x24\x30\x9d\xfc\x00\xb3\x38\x92\xcd\x39\x02\xc1\x92\x89\x0f\xb9\x1c\xd1\x51\x03\x7d\xf7\x9c\x3d\x1b\x0c\x6e\x12\xbd\x18\xdf\xe0\x0f\x5c\xc0\x49\x01\x91\xb0\xa3\x75\x01\x36\xed\xa5\x3c\xba\x22\x1f\x98\x91\xb1\x45\xda\x09\x14\x54\x92\x7f\xa1\x68\xb3\x5a\x17\x8b\x6d\x66\xc0\x94\xe3\x53\x82\x74\x8a\x00\x7d\xe0\x4b\xc4\xac\x61\x50\x2e\x93\xb9\x41\x76\x30\xe4\x77\x22\x3e\x79\xfb\x7d\x58\x1f\xcc\x34\xcd\x8c\xb1\x5c\xf2\x8d\x41\x9b\xc4\xdd\x3f\xa9\xf5\x8b\xb3\xa0\x1c\x4b\x86\x35\xac\x85\x87\x61\xbc\xc2\x9f\xad\x4f\xbb\xcd\x08\xb5\x51\xf3\x29\xae\xf8\x48\xa6\x13\xe5\x2d\x46\x11\x20\x72\xba\xad\xab\x14\x9c\xd6\x4a\x57\xf3\x62\x63\xa8\x7a\x1c\x69\xb4\xc9\x66\x17\x9e\x85\xb7\x5d\x79\xb1\xa6\x5c\x15\xc7\xd6\x1e\x5a\xd0\xc8\x98\x8d\x36\x1a\xc9\x8a\x88\xf8\x00\x37\x0c\xae\x2e\x50\x40\xaa\x60\x9c\x20\xe8\xe1\x61\x2d\x21\x6f\x5a\xb8\x33\xf5\xb1\x20\x90\xe3\x48\xa6\xa8\x8b\x73\xed\x03\xe7\xa1\x28\x00\x86\xe7\xe0\x38\x69\xdd\x8b\xf5\x27\x0a\x51\xba\xdd\x59\x6e\xed\xcc\xda\x67\x02\x63\x02\x07\x5c\xdc\xb3\xa0\x06\x10\x95\x45\x92\x3a\x88\x16\x84\xf7\xbb\xfc\x7e\x28\x66\xf3\xe4\xfc\x95\x7b\x08\x14\x66\x06\xcb\x5a\xc1\xe2\x4d\xaa\x20\x9a\x6e\xcf\x08\x2e\xbf\x26\x19\x90\x36\x89\xba\x1d\xd9\x4d\x3a\xdf\x22\xfb\x54\x92\x2f\x54\xb2\xc1\x10\x47\x52\x83\x37\x81\xc9\x73\x3b\xd2\xa8\xae\x82\xad\xd5\xe2\x5b\xed\x8a\x47\xea\x0d\x57\x12\x78\xe2\x85\xdd\xdb\x16\x9d\x43\x0d\xfa\x01\x9e\xd2\x41\x1f\xa2\x74\x20\x6c\x6a\x65\xa8\xac\x05\x09\xb8\xf9\xd1\x8d\x41\x4c\x42\x7d\x19\xf7\x24\xe0\x52\x77\xa5\x9d\x57\x6e\x7f\xb5\x08\xfc\x3d\x5f\xbe\xd1\x9b\xd5\x8e\xe8\xf4\x70\x1f\x60\x90\x88\x12\x30\x09\xc5\x27\x13\x0c\xbb\x82\x0d\x90\x50\x8a\xa0\xd8\xd0\x6e\xb6\xbd\x72\xd1\x42\x1f\x85\x84\xc0\x13\x17\x61\xe3\x61\xb8\x34\x26\x94\x04\x6a\x6b\xe6\x94\xdd\x2b\x83\x6f\xa0\xf0\xa6\x50\x10\xe0\xe2\x88\xd6\x81\x0d\x14\x91\xb9\xdc\x5e\x90\x1d\x04\x39\x7c\xb3\x76\x58\x37\xae\x86\x86\x71\xc4\xed\x75\x47\xaa\x51\xa6\x16\xea\x49\x95\x94\x80\xfa\x99\x0b\x20\x13\x74\x10\x3c\x28\x0b\xae\x0a\x60\x6b\x41\xb0\xce\x0c\xa2\x2c\x8d\x8b\x1f\x95\x36\x5c\xbd\x38\x3a\xbe\x98\xc2\xb5\xe7\xba\x7b\x9a\x3d\x8d\xa1\xbc\xad\xa9\x27\x54\x39\xed\x20\x97\x1c\xf2\x9a\x41\xfc\x18\x0e\x0c\x2c\xec\x36\xa0\xf5\x88\xdf\x42\x05\x8e\x8e\xf7\x03\x45\x65\x70\xa3\xa1\x4d\x25\x43\x7b\x79\xc1\x8b\xd0\xde\xcb\x59\xa6\xea\x55\x5a\x2e\x1c\x5e\xef\x11\x4e\x9b\x58\xa9\x45\x0f\xb0\xa4\x7a\x99\xcc\x31\xb0\xc2\xf2\x25\xdc\x6d\x5e\x2f\xc2\x84\x72\xe6\x18\x1a\x1b\x18\x33\x29\x96\x0a\xcc\x40\x6c\xa3\x24\xa6\xc7\x33\xa0\x69\xed\x35\x4e\x3d\x7e\x7f\x44\xa0\x6b\xb8\xb1\x12\x60\xce\x4b\xca\x3b\x54\x49\xa4\x90\xf7\xc3\x8a\x50\x89\xbe\xcd\xa8\x3e\xf6\xc5\xde\x1f\xb5\xfd\xab\xcb\x68\xac\x93\x2f\x46\x25\xfa\xae\x28\x16\x7a\x99\x00\xd7\xce\x72\x59\x94\x35\xb2\xb1\xbb\xec\x4f\xc4\xdd\xc6\xc0\x6c\xa3\xc5\xae\x7a\x1b\x7a\xb5\x43\x6f\x5b\x8e\x41\xed\xcb\xca\x5d\x9b\x50\xfd\xca\x7a\xfd\x49\x6d\x88\xa6\x8c\x70\xc6\x5e\x8b\xce\x09\x15\xd8\x3b\x8c\x11\x5e\x08\xa7\xad\xc0\xf6\x48\xf3\xbb\xe5\x36\x8b\x95\x3a\x0e\x12\x69\x62\x0a\xe0\x8a\x12\xfe\x17\xea\xc4\x19\x5d\xfd\x63\x0b\xb9\xdf\xa2\xa0\x0c\x4c\xc2\x2f\x50\x7c\x65\x21\xe4\xd3\xfa\x7f\x26\xcb\x4e\x98\xb3\x34\xbc\x19\xb5\x28\x0d\x70\x84\x19\x80\xb9\x35\x91\x9e\x6c\x67\x15\xb1\x78\x9c\x2d\x18\x0a\x5f\xf9\xd8\xb5\xf8\xdd\x89\x5b\x11\xad\x81\x43\x63\x87\xcd\x0c\xfe\xb3\xe2\x88\x37\x1e\x8b\x49\xf6\x33\x53\x20\x1c\x98\x1a\xca\xf8\x06\xbd\x6f\x3c\x11\xe7\xa5\x6b\x94\xac\xc5\xc9\xe9\x52\xe8\x09\x8a\xb9\xa0\xca\x1a\xa3\x8b\x83\xb3\x05\x46\x95\x98\x64\x87\x4b\x87\x0e\x04\x4c\x75\x65\x64\x10\x23\xa9\xe9\x17\x64\x5c\xb5\x54\x4b\xc3\x73\xd5\x7a\xc2\x42\xd6\x72\xa7\x04\x6b\x88\x9c\x1f\x88\xd5\x72\xd4\xb8\x93\x07\xb7\xc6\xcd\x22\xb0\xa3\x58\x80\x5e\x63\x05\x41\x15\x39\x8d\x06\xdf\x4d\xbb\x08\x5d\xf3\x1f\x78\x3f\x85\xd2\x4d\x6b\x9d\x54\x2a\x7c\x75\xac\xdf\x6d\xeb\x7d\xdf\xc7\x98\xb8\x7b\x6a\xa0\xf1\x02\x23\xa8\xd0\xef\x4a\xab\xc3\xd7\x4e\xdd\xd4\x41\xe2\xf3\x11\x0e\x4b\x5a\x33\xcc\x58\xb5\x07\x87\xfe\x80\x91\x41\x97\x36\xac\x3c\xd7\x8b\xf3\x93\x2b\x04\x90\x2f\x38\x87\x4a\xf0\x68\x78\x0d\x87\x79\x31\x36\x0d\xc6\x0e\xe0\xc7\xef\x4d\x89\x48\x59\x0a\x70\x01\xcc\xdb\x9a\x34\xab\x42\x3f\xd8\x6b\x5c\x41\x4a\x7c\xba\xda\x56\x91\x40\x10\xd5\x6d\x61\xd8\xca\x63\x5a\xc1\x34\x12\x49\x7f\xb0\x74\x2b\x34\x19\x98\x81\xb3\x2e\xc8\x75\x25\xc8\xb1\xdb\xd8\x28\x0b\xf2\x96\x42\x2c\x91\x7c\x15\x3a\x94\x8e\xcb\xb3\x96\xd5\x3a\xec\x75\x74\x0d\xb6\x8c\x82\x97\x01\xa3\x32\x32\xe3\xd8\x59\x53\xe1\xac\xc5\x4a\x0d\x73\x07\xc4\x8e\xf4\x1a\xc0\xe1\xa4\x2e\x43\x8f\x65\x9f\xf2\x81\xa1\xde\x9d\x66\x7b\xd3\x16\x83\x4a\x1d\xca\x44\xec\x5d\x34\x3d\x94\xad\xbb\x2f\xb2\xed\x9a\x18\x20\xaa\xba\x28\x93\x3b\xa0\x24\x09\xfa\x87\xd6\xaf\x3f\x55\x66\xa5\x8b\xb6\xfb\xd6\x09\x2d\x4a\xeb\xf4\x34\x4b\x7b\x1a\x72\x86\x1b\x18\x51\xda\x5d\xe1\x9a\x0c\x93\x6a\xfb\x82\x3b\xd6\xd5\x33\xc9\xa2\x65\x9d\xc2\x4d\x7c\x97\xde\x9b\x5c\x58\xaf\x7e\xcc\xf5\xb4\x40\x58\x4a\x5a\x79\x14\x82\x42\xe6\xb6\xa7\x5b\xd3\x51\x88\x43\x90\xf4\x25\xea\x09\x8d\x8f\x3c\x6c\x2d\xd2\xb2\x23\x45\xc3\x0e\x39\x06\x23\x24\x37\x0f\xa2\x62\x1e\x4c\x80\x03\xb0\xb7\xfd\x43\x06\xd7\x1d\x00\xfb\x03\x8b\xc0\x1e\xab\x58\x41\x40\xec\xc3\xae\x36\x9f\x5a\xc6\xd8\xa1\xb4\x5a\xc5\x3d\x7d\x01\x07\xa3\x22\x09\x51\xc7\xf1\x41\x48\xb8\x9c\xec\x50\x1a\xc3\x58\xa9\x51\x3e\xa7\xf0\x38\x7f\xa7\xa2\xa4\x6e\x1e\xcc\x14\xef\xfd\xb4\x2c\x0d\xb4\x80\xe3\xa8\x94\xb1\xde\xec\x22\x55\x15\x4f\xed\x6c\x10\xc1\x84\xea\xc2\x19\x41\xe6\xc9\xf0\x6f\x68\x14\xd3\x3e\x85\x86\xd1\xed\x43\x6f\x65\xb8\x1c\xf9\x21\x29\x44\x21\x96\xdb\xcc\x1f\xe9\x9c\x6b\x87\xf5\xe6\x45\x7f\x18\x87\x15\x2c\x40\x45\x9c\xeb\x81\xb9\xe7\xca\x1a\xbc\xed\xfd\xf2\xb0\x7f\xdb\xdc\xec\x22\xb6\x55\x86\x19\x39\x65\xef\x7e\xdc\x9b\xec\x55\x9c\xf5\x0e\x0a\x09\x62\xc8\xa8\x6d\x23\x2b\x5f\xc4\x09\xcd\x39\xa3\xb2\xcb\x0e\xdf\xc4\xe9\xe6\xa5\x82\x63\xcf\xb9\xdc\x81\x48\x9e\xda\x27\xd4\x67\x1b\x16\x28\x42\x3e\x1a\x14\xde\xd7\x40\x94\xe7\xc4\x33\x8c\xd5\xb3\x53\xc8\xb2\x52\x22\xde\x63\x26\xf3\xda\x94\xce\xff\x18\x2e\x5b\xc7\xbc\x1c\x34\x5e\xc7\xb3\x1d\x3a\xa7\xe0\x1b\x22\x07\x21\x2f\x06\x64\xa4\x93\xb4\x20\x10\x20\xa7\xcd\xe7\x7e\x25\x68\x10\x1a\x0f\x68\x85\xd7\xd8\x30\x82\xca\x39\x14\x4d\xad\x92\x3a\xad\x96\x29\xd7\x96\x7a\x23\xad\xc1\x60\xdb\x78\x56\x04\x56\xbd\x17\x2e\x96\x0e\x92\x0f\x76\xad\x37\x06\xc2\xe7\x1d\x0d\xf2\x71\x00\xdc\x94\x7e\x68\x50\xcf\xaf\x1f\x2e\x72\x97\x2c\xc8\x8b\x46\xce\xb8\xe1\x70\x07\x86\xcd\x6c\x5b\xab\xb4\x0a\xa0\x96\x78\xa7\xf3\x6b\x79\x17\xcc\x76\x7a\x66\x00\xe5\x05\x31\x41\xb3\x40\xda\x28\x1f\x5a\xb7\x7e\xbc\x3d\x84\x30\x1d\xd0\x9d\x44\xba\x72\x49\xa4\x09\xc9\xf6\x42\x92\x3b\xb5\xdb\xbe\x60\x5d\x00\xdc\xad\x2a\x69\x85\xa9\x9b\x6d\x27\xe7\x16\xdd\x02\xd0\xf7\xaa\x5c\x70\x50\xde\x93\x4d\xbe\x78\x97\xf0\xcd\x1c\xbc\xe0\x50\x63\xdb\x63\x81\xa4\x1c\xd6\x4b\x54\x4d\xed\x53\x30\x24\xdb\x29\x7b\x77\x96\x70\x8a\x5b\xc4\x6d\x79\x6e\x2a\x15\x7e\xb9\x17\x05\x39\xaa\xa7\xa4\xe5\x84\x5a\x29\x62\x42\x68\x6c\x82\xd4\x98\xac\x94\xe7\x23\xeb\x35\x96\xf2\x92\x75\x0e\x9b\x56\x6e\x4d\xc5\xe4\x32\x61\xd6\x03\x80\xc0\x8f\x0c\x1e\x7c\xb2\x4e\x6a\x53\xa6\x49\xc6\x1b\x56\xa4\x6c\x31\x7a\x91\x56\xc1\xc1\x1e\xd8\xdd\xf2\x4c\xe0\x68\xd7\x83\x50\x64\x68\x2d\x94\xc6\x38\xca\x7d\xd8\xda\xf0\xb8\xd8\x64\x5c\x95\xc0\xf4\xe5\x16\x2a\xd8\x8d\x03\x62\x43\x29\x24\x84\x97\xf2\x9a\x7d\x42\xcc\x88\xa0\xdb\x24\xf6\x02\x57\x1d\x5d\x05\x20\x55\xe5\x7e\x61\x5f\x41\x75\x5c\x1e\x88\x67\xe7\xaf\x5e\x95\xa6\x5a\x15\xd9\xc2\xa3\xf5\x30\xb0\x41\xcd\x61\x32\x7e\x6b\x3b\x03\x34\xdc\x09\xe6\x65\xc9\x03\x9e\xa8\x18\xb8\xce\x25\xce\x13\xe7\x00\xe2\xd6\xf9\x76\x6d\x4a\x08\x13\x5a\x17\x6a\x6d\x6a\x53\x5a\x5f\x2c\xa9\xad\x71\x5a\x6e\x51\x53\x23\x4b\x76\x76\x1b\xc1\x0d\x8e\xe7\x65\x51\x52\x28\xa1\x5a\x03\xe5\x75\x32\x2f\x8b\x4a\x7c\x90\xe6\x59\x9a\xcb\x7c\xd9\xb1\xf5\x07\xa0\xd0\x09\x8e\x09\x53\x55\x2a\xcd\x75\x66\xf2\xbb\x1a\x81\xd5\x14\x4b\x11\xc1\x6f\xd9\x60\x6b\x04\xe4\x32\x3c\x1f\x78\x36\xca\xd1\xf9\xc0\x7e\x03\x64\x4d\xb6\x6b\xaf\x83\x58\x1f\x0f\x84\x84\x5f\x90\xb9\xb2\x06\x07\x32\xbb\xc2\x32\x80\xcc\x09\xef\xc3\xe6\xa6\x45\xfa\x04\x70\xe0\x85\x88\xa0\xdb\x3a\xd6\x81\x1f\x71\x99\x56\x14\x2c\x8d\xc3\xa7\x41\x97\x94\xa9\x3a\xb8\xe2\x0f\x84\x32\x5f\x63\xe5\x9a\xd8\xa0\x2a\xe8\xb0\x0b\x05\x64\x55\xd1\xd9\x0d\x0f\x7f\x26\x2c\x9f\x4b\xb8\xe0\xca\x56\x48\xf4\x43\x72\xd6\x61\xbe\x02\x25\x5a\x81\x5f\xa5\x0f\xc1\x33\x14\x41\x11\x48\x04\x67\x3a\x50\xc0\x95\x7b\x8e\x29\x64\xbc\x52\xf8\x46\xe1\x23\x45\x3d\xf5\x3c\x46\xd4\x23\x30\xe6\x93\x43\x26\xba\xbe\xe7\x74\x8d\xda\x26\x1f\x0f\x11\x8d\x32\x8f\x30\x46\xb5\x57\x05\xd0\x4b\x86\x82\xef\x7e\x26\x08\x73\x13\xa4\xb4\x9a\x59\x41\x30\xd2\xc0\x3e\x32\xe5\x0f\x95\x2e\x1e\xa0\xd6\x42\x21\x3e\xda\x9a\xe4\xd6\xdf\xbf\x4b\x73\x83\x56\x0b\x1c\xc2\x66\xb6\xbd\x03\x5c\x5b\x3b\xc0\xcd\x19\x01\x87\x49\x6f\x29\xce\x23\xcb\xb7\xcb\x8a\x04\x31\xdd\x46\x9e\x48\xa5\x94\xfd\x43\x44\x21\xd7\x1c\x04\xc3\xcc\x11\x1c\xbb\x69\x93\x03\xb7\x8a\x6f\x16\x85\xc7\xba\x13\x1d\x0e\x7b\x0c\x0d\x5a\x6c\xd1\x54\x83\xf5\x0b\x31\x36\x64\x6e\xad\x54\x8b\x3a\x55\xc0\xdb\x25\x63\x7e\x2b\xcb\xc3\x63\xee\xda\xbf\x2e\x90\x3d\x64\x0d\xd5\x97\x0f\x26\xcb\x30\x96\x06\xfe\x25\xa4\x6c\x70\x8d\xb3\xf7\x0d\x38\x27\xc1\x9a\xd9\x0e\x64\x23\x92\xdb\x35\x67\x41\xaa\x11\x9c\x2d\xc0\xba\x0c\x14\x00\xef\x07\xa2\xda\xa1\x91\xd5\x6d\xba\xef\xd3\xd8\x56\xc1\xc1\xe0\x93\x86\xae\xea\x99\xc2\xbc\x0e\xe8\xf4\x60\x4a\xe3\x66\xd7\xbd\x1d\x61\x0f\x6a\xbf\xed\xdf\x6d\xee\xf7\x20\x8f\xd5\x3e\xe7\x02\x5b\x28\x54\x83\x15\x9b\xae\xdd\xe5\x56\x27\x0f\xed\x7d\x98\x38\x79\x3c\x12\x7a\x20\xb0\xbb\x45\xec\x00\xa6\x10\x6a\x70\x04\x10\x5f\xae\x67\xb8\x89\xb8\xc6\x41\x1e\x23\x2e\xe4\x2a\x7a\xe5\x4f\x15\xd5\x95\xac\x88\xf5\x31\x16\xd5\x11\x20\xbf\x28\x16\x61\x43\x20\x24\xc7\x93\x82\x83\x80\xf9\x63\x05\x11\x2e\x27\x9f\x46\xc9\x9b\xb4\x19\x85\x22\xd4\x3b\x93\x4b\x58\x1f\xcb\xda\x3f\x54\x37\xcf\x35\x16\x78\x87\xc8\x70\x35\x21\xfd\x82\x36\x8b\xd7\xd9\x0b\x6c\xb6\x7f\x81\x26\x2e\xc0\x07\x0e\x55\x44\xdc\x15\x48\xcc\x4b\x24\xa2\xd6\x70\x31\x7a\x67\x92\xb2\x8a\x54\x5d\xf8\x1a\x19\x88\xbf\xe2\x3e\x02\xd1\x78\xb4\x03\x2b\x41\xa9\x90\xe6\x22\xa0\xaf\x5f\x27\x11\x5f\x11\x58\x7b\x43\x79\xa6\xbc\x40\x21\x16\x30\x85\x71\xe8\x2a\x30\x17\x29\xb9\xe1\x6e\x75\x69\xb6\x62\x8e\xab\xc3\xcd\x94\x0b\xf7\x9b\x7d\x4c\xcc\x98\x1e\xf6\x2d\xd1\x41\xf6\x9d\xf5\x03\xe0\x78\x27\x61\x84\xe0\x91\x98\x17\xfb\xc5\x94\x2e\x52\xe4\x16\x0e\x84\x96\x32\xbb\x45\x76\x9e\xbc\x4a\x1e\xab\xa6\x92\xa3\x5b\x10\x17\x91\x2b\x93\xe3\xdf\x56\x5c\x00\x80\x8f\x4d\x38\x02\x03\xa0\x14\xa9\x9f\x1f\x49\x67\x37\x44\xb9\x1c\x34\xf7\x21\xdc\xc7\xa7\x32\x12\x34\xd4\x28\x34\xd2\x44\xe3\x43\x41\x1a\x05\x08\x58\xf1\x86\x0f\x5e\xe1\xc7\xc0\xf0\xa7\xb5\x80\x56\xc3\x91\xcd\x48\x3d\x67\x68\x44\x2d\xd3\x5e\x1e\x68\xf6\x5d\xc0\xd3\x21\x9a\x86\x08\x7a\x1f\x20\x2a\xd7\x60\x46\xca\x9f\x1d\xa7\x39\xa3\x98\xe8\xc9\x45\xa9\x67\x88\xaa\xb7\x43\xd2\xf3\xe7\xd9\x3a\xf9\x7b\x81\x8c\xb9\x45\x0e\x09\x9c\x63\xda\x8d\x65\xa4\xbf\x98\x32\x37\x04\xe6\xaf\xec\x15\xe1\x48\x5e\x31\x51\x67\x0f\x94\x6a\x57\xd5\x66\xad\x0b\xa9\x3b\x27\x8e\x9e\x72\x9b\x57\x8e\xe0\xd9\xd5\x98\xc0\xab\x9c\x2f\x31\x77\x65\x27\x2a\xfc\xb5\xf5\x0c\x90\x77\x64\x95\x6c\x36\x26\x17\x20\x56\x19\xce\xc0\xfa\xda\x45\x3a\xaf\x43\x72\xa0\xa0\x58\xb0\x58\x3a\xa5\x3f\x57\x67\xd2\xc4\xf9\x52\x6e\xc7\x0d\x69\x12\x9c\x2c\xae\xcf\x1a\xfb\x1c\x2b\x0a\x06\xf8\xf7\x63\x50\x3c\xc9\x2b\x0e\xa0\x32\xfa\x7b\x56\xe0\x70\xaf\x5d\x66\xdb\xdb\x80\x08\x23\x05\xf9\x7f\xb9\x92\x85\x1e\xbf\x9b\x59\xd4\x91\xe7\x00\x20\x86\x79\x9c\xc2\x3e\xa6\x52\x03\xd0\xf2\x21\x4c\x4f\x95\x2e\xcc\xc9\x6c\x77\x62\xff\x17\x5e\xae\xab\x34\xbf\xcb\x8c\xc8\x8e\x4a\x80\xab\xac\xca\x0d\x5e\x26\xc0\x4f\x7a\xb6\x53\x6d\xe2\x95\x26\xda\x41\xd4\x0a\x38\x34\x59\x18\x2b\x84\x1d\x41\xc9\x32\xb5\xf7\x0c\xec\xec\x15\xe0\xa1\x96\x22\x07\xd1\x6e\xb1\x35\x19\x3d\x3d\x85\x2b\x79\x8f\x24\x99\xbd\x08\x5a\xfa\x62\xd5\x87\xe2\x80\x61\xd4\xec\x13\xdf\x41\xd2\x82\x85\x23\xb3\x8d\x62\x76\x46\xc6\x36\xf7\x55\x14\xac\x70\xb2\xaf\x17\x04\xd1\xed\xb0\x82\x54\x27\x8c\xa1\xe9\xca\x20\x8e\xe3\xfd\x7e\xfb\xbb\xb3\x53\xf4\xa8\x65\x32\x27\xa5\x48\x8a\x7e\xa8\xb4\x7e\x34\x17\x09\x49\xbf\x5f\x37\x19\xf9\x37\x44\x99\x5b\xe8\x65\x4a\x5b\xc2\x6d\x37\x7b\xae\x88\xb1\x90\x87\xb8\x1b\x42\x94\xf6\x97\x72\x1a\x98\x2c\x40\x7b\x29\x12\xda\x37\x18\x2f\x83\x4e\x45\x5a\x06\x88\x82\x70\xb9\x22\xfd\xcb\x80\xc0\xc6\xad\x86\x0e\x62\x31\x70\x5b\x93\xba\x36\xeb\x4d\x2d\xd6\x53\x5d\xa8\xdf\xd6\x10\x3b\x8e\xf7\x45\x8a\xeb\x51\x21\x7f\xba\xa4\x96\x14\x94\x93\xb2\x6a\xb4\xab\x85\xee\xea\xa1\xf8\x6d\x07\x91\x24\x26\x3d\xa0\x39\x5c\x73\x0d\x37\xd7\xae\x93\x4d\xcd\xd9\x72\xea\x11\xb2\xc8\xaa\xd0\x10\x05\x66\x5e\x76\x0e\x20\xef\xa5\x87\x8c\x95\xfa\x29\x76\xfa\x10\x88\x72\xf4\x54\x81\xd6\x42\xd9\xd4\xcd\x54\x5b\x6a\x3d\x1f\x67\x2a\x00\xac\x01\x59\xbf\x82\x6b\x37\x27\xa5\x44\x28\x05\x25\xf5\x3f\xfb\xa3\xb0\x0e\x96\xcc\xec\xd6\xac\x28\x01\x00\xb3\x3e\x64\x33\x33\xc4\x25\xe3\x09\xef\xad\x12\xf6\xd3\x2a\x9d\xb1\x58\x57\x96\x3c\x70\x79\x3e\x63\x07\xda\xbd\x09\x70\x22\xb3\x5d\x58\x76\xd6\xe2\x74\xe4\x25\xcb\xc4\x8b\xfb\x73\xb9\xe8\xe3\x11\x03\x12\x2d\x18\x7c\x3d\x13\x58\x07\xda\x99\x35\x24\x41\xad\x6b\x08\x31\x34\x62\x87\xf8\x9a\x82\x0f\x6c\xb1\x6b\x7e\x13\xc5\x2d\xb2\xde\x1a\x48\x83\x62\xa5\x4e\x9f\x4b\x06\x42\x04\x5a\x1e\x4a\x69\x1d\xee\x30\xa6\xe6\x3d\xdf\x60\xb0\x75\x68\xd9\x57\x82\x86\x50\xd4\x36\x52\x11\x6e\xc6\xe2\x20\x1d\xe5\xd1\x62\x0b\xeb\xb0\x4a\xda\x5d\xab\x01\x03\x29\x23\xdf\x55\x38\x7a\xe1\xc1\x25\x14\xc4\x98\xe7\x2f\x34\x5d\x72\x5d\x7f\xbd\x26\x58\x9a\x37\xf7\x13\x51\x16\x50\xfa\x14\xf9\xfb\xec\x1c\x09\x72\x28\x0c\x89\x88\x8c\x4f\x2b\xf5\xac\x4e\x4f\x63\x3d\x5c\x92\x39\xeb\x18\xc7\x08\x36\xaa\xe7\xc5\xb6\xac\xf5\xdf\xb7\xa8\x57\xac\x11\xf5\x2d\x80\x0b\x54\x9f\x9b\xe6\x4b\xeb\xb3\x10\xd1\x5b\xe9\x68\xd1\xa4\xdc\x89\x3e\x6e\x48\xf1\xf1\x6f\xab\x6a\x6b\xaa\x5e\x14\xd0\x42\x96\x86\x86\x11\xd0\x14\x76\x11\x1d\x73\x58\x70\xb6\xa3\x56\x15\xe5\x02\xec\x70\x57\xcd\x22\x79\xaa\x7a\x42\x34\x0c\x6c\x39\xd8\xfd\x87\x94\x45\x21\xce\x48\x5b\xda\xfc\x3a\xb7\x66\x9e\x7d\xaf\x5b\x50\xc1\x6f\x55\x2b\x82\x24\x2c\x44\x69\x21\x71\x35\x08\x66\xef\xac\x99\xb6\xde\x66\x35\x92\x92\x66\x08\x55\x55\x92\x0d\xad\xe3\x90\x86\xbd\xeb\x06\x73\x63\xca\x1a\x6f\x77\xf1\x33\x0a\x65\x27\x95\x0a\xe7\x70\xd7\xa9\xdd\x16\x5a\x58\x58\x21\xad\x9b\x54\x15\x89\x0a\xeb\xbf\xa9\xd8\x10\x22\xff\x18\x64\x94\x12\xab\x72\x8f\xb7\xf3\x7b\x6a\xb6\x23\xd4\x45\x01\x3c\x06\x85\xc3\x5e\x13\x3a\xd7\xc5\x74\x0b\x24\xc7\xa7\xff\xaa\x57\x25\x64\x4b\x76\xc5\xd6\x07\xeb\x11\xf9\x4e\x84\x3d\x76\x29\x64\x0b\x37\xba\x60\x97\xbb\xb8\xa1\xbc\xe8\xe0\x6b\x33\x0a\x50\x2c\x4b\x7b\x6b\x31\x4e\x08\x7d\xbb\x03\xcd\xc7\x8c\x46\x2b\x7d\x29\x90\x4a\x69\xa5\x57\x26\x5b\x3c\x4a\x3a\x9a\xef\x00\xf3\x98\xce\xb7\x59\x52\xea\x79\x5a\xce\xb7\xeb\x0a\xce\x6e\xf4\x1b\x67\x49\xe6\x0f\x72\x23\x1f\x2f\x0b\x2b\x01\x4e\x83\x48\x36\xf9\x2d\x8f\xc7\xeb\xfc\x81\xa7\xde\x97\xef\xad\xd0\x29\x13\x60\xac\xa6\xa2\xb7\x40\x63\xa5\x39\x44\xa5\x88\x72\x85\x37\xbd\x28\xd4\x07\xb4\xb3\xf7\xcb\x4c\x59\x93\x28\x31\x02\xb9\x98\xb7\x85\x51\x5c\x9e\x5c\x75\xe9\x4b\x93\xf0\x9b\x6f\x55\xf0\xf2\x15\x31\x0d\x56\xb6\x77\xa2\x85\x82\x73\xa3\x26\x74\xd7\x5d\x29\xc8\x59\xa1\xd4\xd4\xe5\xfd\x83\x39\x26\x4f\xd7\x01\xef\xa4\xcc\xce\x6c\xd7\xac\x42\x27\x05\x25\x3b\x5e\x1f\xa1\xbf\xa6\xd8\x64\x92\xbb\x00\xc8\x1c\x8b\x6d\x15\xaa\xf8\x73\xd8\xf6\x21\x5d\x18\x5d\xb2\x80\x18\x37\x48\x49\x27\x9f\x17\x3b\x9c\x5b\xd4\xb8\x14\x83\x82\xb8\x26\x72\x2d\x24\x0d\x65\x5c\x8d\x30\x96\xe4\xbb\xbf\xa5\x7c\xd4\x76\xe3\x68\xb3\xa1\x0a\xef\xd9\xa2\xc8\x71\xf8\x89\x73\x29\x5d\x6a\xb8\x27\x75\xb5\x82\x15\x63\x8d\x41\xac\x87\x57\xc1\x09\x46\x83\xc7\xed\xf3\x47\x11\x35\x12\x8b\x35\x5d\x89\x1d\x1d\x82\x78\x7c\x63\xfc\x07\xb3\x16\x8c\xb0\xd9\xb3\xaa\x01\x69\x64\x1b\x6a\xdf\x92\xed\x88\x09\xe2\x81\xe2\x22\x33\x93\x61\x0d\x2d\x89\x4f\xa9\xc6\x55\x85\x37\x6a\x55\x77\x80\xbc\x4f\xcf\x5c\x88\xbf\x59\xfb\xf3\x2c\x54\x91\x14\x26\xbb\x28\xc1\x4e\x73\xe6\x5b\x50\xf3\x62\x6b\x27\xd7\x70\x55\x1b\x2c\x14\x5c\xf9\xba\xa0\xab\xc9\x6b\xc3\xb9\x9a\x27\xa2\x27\x77\x26\x89\xfb\x92\xa2\x82\x49\x7b\x24\x82\xfb\x1f\x16\xc1\x74\x5c\x06\x90\xac\x5a\x2c\x30\xb6\x60\x97\x40\x5a\xeb\x3b\x53\xdc\x95\xc9\x66\x65\xad\xa2\xd0\xbf\x16\xb5\x66\xa0\x4b\x42\x4c\xa0\x05\x54\x10\x50\x57\x7c\xa0\x3a\xf8\x29\xd2\xa6\x13\x7d\x1c\x16\x1b\x21\xe2\x7d\x5d\x00\xfa\x82\x07\x02\x8f\x8d\x6d\x45\x2f\x00\x35\xc7\x9c\x76\x72\x82\xf7\xaa\x47\x07\xca\xb2\x6b\x0e\xee\x78\x4a\xd4\xca\x2e\x49\x0e\xf2\x52\xd4\x79\x56\x2c\x3a\xf2\x1d\xea\xf4\x05\x66\xaa\xf7\x52\x91\xad\x13\x5f\x93\x53\xa2\xd2\x31\x4f\x78\x6e\x1e\x18\xfb\xe6\x78\x9c\x1e\xa9\x6c\x6f\x13\x5b\x22\x72\x24\x78\x94\xdd\x3f\x6a\x06\xe4\x0e\x69\x86\xac\xba\xd5\x26\x2d\x53\x47\xe4\x4b\x54\xbf\x9e\x6a\x66\xb6\xad\x29\xef\x0a\x31\x5c\x20\xf4\xa8\x93\x34\x83\x33\x1b\xcb\x54\x95\x7d\x85\xa3\xa1\x41\x04\xec\xdc\x94\x90\x76\x03\x2b\x5b\x28\xec\x20\xc8\x2e\x21\xca\x84\xbb\x2d\x69\xd9\xf1\x37\x90\x63\xcf\xed\x05\x67\xe1\xb2\xae\x9b\x4a\x1a\x5f\x6d\x81\x2e\xf1\xac\x14\x90\x3b\xba\x6a\x8f\x80\x17\x37\xa9\x85\x62\x51\xa4\x02\x6e\x34\x57\xdd\x23\x84\x8e\xeb\x7d\xa2\xef\xb4\xb7\x18\x3a\x4e\x8f\x84\xab\x05\xef\x89\xe0\x55\x9e\xb7\x94\xeb\x91\xf7\x2d\x0a\xee\xba\x0a\x8a\xd2\x3c\xb3\xf2\x4e\xf8\x11\xe1\x48\xf8\x44\xf1\x7c\x55\xb0\x71\xcf\xed\x82\x1c\xd7\xd3\x1b\xa1\xd4\xe9\x4b\x67\x31\x32\xa6\x50\xca\xbf\x5b\x0b\xa1\x95\xfc\x47\x29\x78\x18\x97\x80\x03\x42\x21\x9c\x3b\xd8\xba\x4d\x43\x3a\x87\x38\x4c\x0d\xae\x02\xc7\x82\x00\x09\x5e\xa6\xb5\x09\x2f\x09\x45\xac\x6a\xd6\x80\xf7\x1e\x35\x5a\x87\x9e\x31\x88\xaf\x4c\x79\xd8\x75\x75\x5b\x49\x5e\xcb\xe0\x6d\xfb\x46\xe7\x2d\x10\xfa\x15\x6b\x63\x37\x59\x85\x77\x82\x8b\xad\x57\x8a\xe1\x28\x40\xda\x07\xf7\x58\xe5\x94\x0d\x66\xc4\x6b\xeb\x9a\x52\x3f\x14\xfa\xae\x80\x3c\xc4\x52\x12\x49\x78\xbb\xc0\xf1\x5e\x58\xe3\xd4\x87\x02\xe0\x23\x66\x9b\x10\xcc\x91\x39\xd3\x7c\xad\x0b\x67\x71\x10\x8d\x07\x65\xcf\xe9\x2e\x71\x3f\x21\x86\xe7\x6c\x87\xaa\x04\xd7\x23\xd6\x8b\xf9\xac\xd4\xe9\xab\x58\xbf\x1b\x9c\xf7\x6f\x27\x03\x50\x38\x61\x66\xd1\xe1\x84\xd9\x44\x2f\xf4\xe5\x78\x00\x82\x29\xe7\x1f\xfa\xe3\xf7\x83\xc8\x7e\x6f\x3c\xb0\xdf\x10\x4f\xd2\x97\xa3\xb1\x12\x0f\x88\x1a\xda\x31\x37\x83\xf1\xc7\xe1\x74\xda\x25\x1e\xe3\xd4\x66\x3e\x7d\x18\x5c\x7b\xf9\x1f\x35\x99\xf6\xed\xf7\xbd\x4a\x11\x3c\xef\x7c\x74\xf3\x79\x3c\x7c\xff\x61\xaa\x3f\x8c\xae\x2e\x06\x63\xe0\x24\x78\xe6\x84\x79\x58\xdb\xe8\x66\x3c\xfa\x65\x78\x11\xf4\x49\x1d\xf5\x27\x7a\x38\x39\x72\x5a\x42\xae\xed\x42\xb2\x28\xd2\x83\x21\x3c\x88\x54\x8a\x06\x17\x7a\x34\xf6\x4a\x45\x5e\x91\x48\xbd\xbb\x9d\x82\xaa\x0e\x28\x12\x81\xbe\x12\x8c\x4c\x87\x26\x8f\x7d\x3e\xcb\x12\xf5\x51\x3d\x06\xf8\x11\x48\x99\x48\xed\x53\x26\x8a\x71\x00\xaf\xa7\xc3\xf1\x40\x8f\x87\x93\xbf\xe8\xfe\x84\x87\xf5\xaf\xb7\x7d\xf7\x9c\x9b\xc1\xf8\x72\x34\xfe\xd8\x27\xa9\xa1\xc6\x34\xda\xde\x82\xe2\x8f\x9e\x7c\x18\xdd\x5e\x5d\x04\x7f\xb7\xc3\x34\x20\x35\xa3\xe1\x2f\x83\x08\x04\x7a\xfa\x93\xc9\xed\xc7\x81\xc2\xd1\x9e\x80\x8c\x4e\xff\xea\x4a\x5f\x0f\xce\x07\x93\x89\xfd\xd5\x64\x30\xfe\x65\x78\x0e\xa4\x0f\xe3\xc1\x4d\x7f\x08\x72\x46\xe7\xa3\xf1\x78\x00\xaa\x45\xf6\x70\x79\x1d\x6b\x29\x09\x44\xea\x54\xfb\x15\x84\xec\x13\xbc\x50\x95\x9f\x73\x05\x62\x42\x76\x76\x9a\x13\x0f\x8a\x4b\xf6\x0f\x7e\xe2\x3f\xeb\x4f\x1f\x46\x20\x77\x04\xd4\x13\x9f\x79\x69\x8c\x07\x8e\x9b\x62\x20\x17\xa9\x1d\x4f\xbf\x30\xfb\xef\x46\x76\x04\x5a\x7a\x45\x76\x7a\x48\xe4\x47\x2c\x00\xfb\x6a\x45\xfc\xbb\x91\xd3\x2d\xd2\x5e\xb7\x08\xc7\x44\x28\x17\xed\x97\x28\x02\x49\x22\x65\xd7\xd9\x35\xaf\x8f\xe9\x48\x37\xb7\xe4\xb1\x7f\x77\x7b\xed\xe9\xab\xd1\x04\x16\xda\x45\x7f\xda\x57\xd0\xe2\x69\x5f\xbf\x1b\xd8\x6f\x8f\x07\xd7\x17\x83\x31\x6c\x25\x94\xab\x9a\x82\x14\x92\xfd\xc5\x60\xa2\x27\xb7\x93\x69\x7f\x78\x8d\x93\x02\xfa\x4c\x63\x3d\xfd\x30\x1c\x5f\xf0\x5e\x52\xb0\x3c\x2f\xfb\xc3\xab\xdb\xb1\x13\x4e\xe2\x46\x4d\x47\x7a\x74\x33\x80\x47\xc2\x42\xf3\x13\x32\x19\x5d\x4e\x3f\xf5\xc7\x83\x9e\xd7\x57\x9a\xdc\x9e\x7f\x50\x38\x7b\x3a\xd8\xb1\x9f\x9f\xa2\xb8\xa4\x5b\x8a\x4b\x83\x6b\xfc\x5e\x07\x35\x09\x00\x5b\xed\x39\xdf\x07\xaf\x13\xe3\xa9\x53\xb8\xe7\x91\x55\xbf\xd4\xd7\xe6\x81\x2e\x36\x6b\x76\x28\x16\x4e\x46\xd2\x1a\xac\x84\x08\x19\xb1\x04\xa7\x29\x39\x00\x74\x3d\xde\x21\x04\xb6\x76\x94\x2c\x6a\xeb\xb5\x48\xd0\x85\x03\x8e\x39\x00\x25\xfc\xff\xec\xfd\xd9\x72\x1b\x4b\x96\x2e\x08\xdf\xfb\x53\xf8\xcf\xb2\x63\x22\xcc\x42\x21\x0e\x92\x76\x4a\xaa\xbf\xec\x40\x24\x24\x21\x8b\x22\x78\x08\x72\xef\xd2\xb9\xe9\x0a\x20\x1c\x64\xa4\x02\xe1\xd8\xe1\x11\xa4\x50\x17\x6d\xe7\xb2\xf3\x2d\xea\xaa\xeb\xa8\xeb\x11\xf2\x6e\xf3\x4d\xfa\x49\xda\x7c\xad\xe5\x53\x0c\x20\xa9\x61\x0f\x95\xa4\xa5\x29\x37\x09\x84\x87\x8f\xcb\xd7\xf8\x7d\x4b\x81\xbc\x01\x04\x61\x1c\x4a\xf7\x00\xcb\x50\x1b\x31\x2c\x70\x5b\x3a\x68\x5e\x87\x50\x0b\xbe\x55\x30\x01\x50\x51\xd6\xed\x36\xfc\x20\xa0\xc1\x33\x1f\x4f\x72\x5b\x96\x11\x87\x42\x94\x22\x41\x24\xaa\xa8\xbb\x50\xb5\x17\xe3\xca\xb2\xe8\x20\xd0\xaa\x2d\xae\x31\xaf\x88\x78\x52\x55\x09\xc5\x6e\x9d\xba\x65\xcb\x5d\x02\x58\x4c\x03\xc0\xac\x92\x85\x50\xc0\x56\xe8\x1e\x5e\x9a\xef\xaa\x8a\x92\x62\x21\x89\x8b\x42\xd0\x98\x35\x2b\x11\x25\xcb\x07\xd6\x02\xd4\x93\x35\xc5\x7e\x81\x0c\x11\x35\xbf\xb0\x00\x1d\x9a\x82\x36\xd4\x25\x38\x67\x30\x41\xc0\x65\x72\x08\xbe\x65\xf5\x8b\x2d\x06\x89\x9d\x68\x69\xae\x24\x18\x56\x90\x23\x6e\x79\x1a\x21\xfe\x40\xf1\xae\x4c\xf1\x85\xd6\x28\x62\xc6\xf4\x5a\xc2\xa3\x7e\x32\x48\x6e\xe1\x01\x80\x72\x19\xfd\x6b\x3c\x4b\x45\x82\xf5\x6a\x88\xf3\x43\x08\x04\x21\x76\xf7\x5a\xdb\xa4\x86\xa8\x99\x54\x26\x83\xb7\x67\x6d\xc7\x60\x63\xbd\xb2\xc5\x37\xc1\x7e\x42\xcd\xd9\x83\xe6\xcc\x2a\xb7\x59\xc2\x6d\x70\x3b\x36\x20\x14\x14\x76\x29\xa0\xac\x53\xc5\x72\x80\x28\x61\x71\x91\x75\x85\xca\x92\x6f\x87\x75\xf9\x03\xd6\xd2\xbb\xe3\xf6\xc0\x7d\x77\x06\xd9\x6f\x80\x57\x65\xa0\x93\x8c\x9e\x86\x95\x35\x68\xff\x90\x4a\xc0\xb4\xf8\x32\x6a\xc1\x2b\x9b\xbe\x4c\x39\xd3\x48\x82\x0c\x95\xa7\x06\x19\x40\x2e\x5a\x37\xbb\x2c\xef\x70\xb1\x4f\x85\xb8\xeb\xac\x22\x78\x78\x29\x18\x5a\x65\x26\xd3\xd1\xdf\xaf\xdd\x49\x30\x77\x68\x9c\x05\x65\x15\x6e\x1a\x5f\x69\x1b\xb8\x90\xd5\x1d\xf5\x65\x84\x8b\x8f\xbe\x14\x2e\x9e\x40\x60\xc1\xa3\xe0\x33\x6e\x4b\x0b\x7c\x46\x34\x0d\xb0\x89\x67\x6b\x24\x13\x2b\x65\x91\xcd\x09\x86\x75\x05\xb8\xbb\x59\x1e\xce\x0d\xa4\xd3\x5e\x08\xda\x42\x62\xb9\xca\xe5\x5a\x94\x7c\xdb\x94\x98\xd9\xf2\x61\x32\x63\x96\xa2\x1c\x70\x03\xf4\xad\xb4\x8d\x95\x23\x37\x3c\xd0\x90\x4b\x08\x04\xf2\xc4\x13\x08\x1e\x6c\xc6\x96\x47\x16\x62\xf0\x16\x17\x8e\xf9\x28\xe6\xef\x44\x09\x75\x08\x09\x57\xe0\xde\x7e\x85\xe2\x17\x1e\xd1\x47\x59\xbd\xd4\x7d\x5f\xcb\x74\x5d\x08\x9a\x4f\x88\xb8\xcc\xd6\xf6\x2d\xaa\x41\x9e\x0f\x02\x48\x40\xe2\x27\xf3\x71\xa0\xf9\xbf\xbe\x29\xe5\xec\x11\xdf\x76\x45\xe9\xd0\xb9\x6b\x81\xb7\xce\xc7\x42\xce\xd4\xc0\x12\x80\xb0\xd9\x9a\xff\x59\xf7\x80\x9f\x26\x45\x2a\x97\xfc\x5d\x32\xff\x08\x60\x80\x98\xe4\x55\x97\x20\x67\xce\xd6\xfc\x40\xea\x05\xdc\xe5\xc3\x55\x99\xe5\x7c\xf7\xc5\x8b\x1d\xc6\xec\x9f\x4f\x4a\xa1\x32\x53\xb1\xfe\x63\x36\x07\x10\xfc\xa4\x7a\x64\xa1\x7b\x10\x85\x17\xec\xf5\xff\xdf\xef\x87\x4e\xe3\x0f\xf7\x13\x3f\xf9\x9f\x22\xfd\xe6\x8c\x1f\xe1\xcf\x66\xfe\x8f\x9d\x9d\xa7\x3b\x4f\x1b\xfc\x1f\x7b\xfb\x4f\x9f\x3d\xf0\x7f\xfc\x1a\x3f\xdb\xf3\x01\xff\x73\xb6\xe4\x87\xc9\x15\xf8\x4d\xff\x9c\x14\xb5\x3e\xe2\xbb\x2f\x5e\x3c\xf3\x60\x71\x3a\xeb\x38\x33\xcc\xa6\x05\xdd\x20\x5f\x63\xb6\xc9\xcf\xb5\x28\x0d\xa1\x30\x04\x6d\x93\x0c\xb0\xcf\x41\x86\xb2\x19\x5c\x40\xd7\x49\x49\xfe\xf1\x3f\x67\xcb\x18\xdf\xfc\xdf\xe7\x72\x99\x27\xb3\x58\x7e\x8a\x93\x79\x5c\x7f\x8c\xad\x0a\x6d\xab\x75\x6d\x76\xaf\x74\xef\x8e\xf8\x0a\x69\x28\x29\xc8\xd9\x08\x08\x96\x42\xd5\x79\xa5\xbc\x74\x23\xd0\x73\xfe\xf5\xdf\x44\xfa\x78\xae\x56\xb1\xaa\xd6\x8f\x7e\x47\x64\x3c\xbf\xc1\x4f\xfc\xc4\xd2\xff\x14\xf9\xfa\xfb\x08\x82\xcd\xe7\xff\xe9\xde\xfe\xde\x0f\x8d\xf3\xbf\xff\x6c\x7f\xff\xe1\xfc\xff\x1a\x3f\x50\x86\x7e\x0f\xde\x9f\xa6\xf1\xb0\xfb\xe2\x4f\x2f\xa2\xbb\xd0\xff\xf0\x26\xff\x4f\x29\xc4\x1f\x81\x03\xe8\x77\x48\xc2\xd3\x88\x32\xfe\xca\x14\x3c\x98\xd4\x79\x2b\x74\x01\x5b\x4a\x65\x8b\x4e\xfb\xb6\xc6\x23\x15\xba\xa2\x03\x7a\x1d\x8b\x4b\x1e\x90\xeb\xcc\xe5\x72\x89\x1e\x13\x87\x65\xbe\x3d\x95\x4b\x93\x4c\x7b\x2b\x91\x0f\x6b\x23\xe1\x83\x69\x23\x94\x12\x65\xef\x8c\x23\x9e\x44\x3c\xb0\x8e\x12\x70\x51\x30\xec\x09\x4c\xbb\x89\x5e\x3c\x50\xf9\x3c\x50\xf9\xfc\x5e\xa8\x7c\xdc\x6e\xfb\x4a\x2e\x9f\x10\xb3\xb3\x83\xce\x87\x59\xf8\xc2\x2f\xa0\xf3\x31\xfb\x14\xdc\x90\xcc\xc2\xbc\x7d\x39\x97\xcf\xd0\x80\x31\xde\xca\x81\xc3\xbb\x38\x70\x7e\x12\x5d\xfb\x83\x1c\x1b\x9b\x68\x6f\x42\xb2\xb0\xed\xbd\x01\xfb\xbe\xbc\x37\x96\x84\xa4\x45\x7c\x83\xe2\x32\xe0\xbc\x21\x20\xd6\x52\x6d\x26\xbf\x61\xd6\x61\xfc\x25\xe4\x37\x8e\x16\x65\x1c\x6e\x41\xfe\xd5\xf4\x37\x8c\xe8\x6f\xf8\x1d\xe9\x6f\xfe\x4b\xd1\xde\x78\x8e\x56\x89\xac\x03\x49\xf8\xbe\xbb\x53\xde\x38\xb6\x1b\x8a\x1b\x54\x1e\x72\xad\x57\x7a\xe4\x33\xdb\xb0\xaf\x61\xb6\xe1\x21\xb3\x0d\xbb\x9d\xd9\xe6\x3b\x60\xf9\x7f\x07\xcc\xf9\x06\xd2\xbc\x47\x60\xe2\x61\x8b\x35\xe1\xe6\xc9\xa1\xcf\x6e\x81\x9b\xb7\xa0\xf2\xfc\x76\x50\x79\x66\xd4\xdb\x6e\x35\x01\xb3\x8a\xb6\x4e\xb0\x7b\x1b\x21\xd4\x0d\xae\x33\xa5\xc1\x47\x01\x69\x41\x90\xcc\x6e\x5a\x0b\x00\xd1\xfd\x4f\x08\x8e\x96\x7d\x19\x20\x7a\x0b\x6a\x40\x2b\xa7\x7e\xcb\x5f\x04\x88\xce\x5b\x80\xe8\xec\xbe\xf0\xe7\x7c\x33\xfc\x39\xdb\x04\x7f\x7e\x57\xdc\xfe\xdf\x13\xd6\xb7\xb7\xa2\xac\x07\xdb\x1b\xe4\xa4\x87\xef\xed\x6f\x02\x4f\xd7\xf6\xc0\xbd\xd9\x5d\xc1\xbd\x4d\x33\x0d\x70\x6f\x2d\x84\x90\x67\x46\x14\xcc\x14\x19\x77\xf4\xf8\x16\x50\x6f\xee\x83\x7a\x9b\x41\x7e\x15\x48\x37\x35\x02\x66\x8d\x55\x47\xd8\x37\xc1\xe6\xe6\x01\x36\x37\xfb\x06\xd8\xdc\x41\xfc\x92\x7d\x15\x36\x37\x66\x5b\x21\x36\x37\xeb\xc4\xe6\x06\x55\xd0\x2f\x9f\xb0\x0a\x61\x38\x75\x0d\x40\x0b\xd6\x46\xee\xf6\xbf\xfd\x07\x47\xee\x0e\x45\xe5\xbd\x91\xbb\x4f\x8c\x36\xfe\xbb\x42\xee\x4e\x3a\xa1\xaf\xad\xea\x67\xd9\x31\xbf\x17\xf4\x76\x1b\xfa\xdb\x96\x63\x75\x94\x2b\xeb\xb9\xa7\xb3\x44\xe6\x68\x56\x18\x9c\x6e\x28\x78\x86\xea\x51\x7b\x7d\x6b\x33\x4a\xb5\xb1\x7e\x9b\x0b\xa9\x9f\x01\x65\x59\x2e\x22\x4c\xee\x70\xc4\xfd\x5e\x49\x43\x07\xdc\x37\xbf\x13\xdc\xb7\x87\x4c\x8a\x28\x0c\xc1\x14\x1b\x45\xc4\x16\x89\x97\x22\x49\xd1\x73\x02\xba\x3c\x44\xfa\x12\x93\xda\x00\x58\x90\x65\x5d\x60\x76\xab\x37\x6d\x5a\x4e\xc1\x87\x90\x2a\x21\x52\x2b\x61\x01\x77\x50\x6f\x2d\xaf\x21\xa4\x36\x36\x48\xe3\xaa\x72\x58\xa2\xd7\x09\xc6\x3b\x57\x65\x86\xf5\x4c\x84\x3e\x03\xd2\xaa\x28\x64\x5d\xcc\xb1\xd4\xc9\xa1\xac\x84\x72\xac\x85\x52\x43\x5a\x09\xfd\xd2\x6f\x99\x6c\x6b\xb5\x33\x87\x3a\x4c\xd4\xa6\xec\x96\x32\xd4\xad\x89\xfd\xf2\xc0\xe1\xf2\x80\x9b\x0b\x4e\x70\xab\xc8\xcf\xcc\xac\x9f\x02\xe3\x36\x3f\x5d\x87\x82\x4a\x0e\x2c\xc0\x04\x46\x9d\xaf\x32\x71\xdd\x07\xd7\xc3\xb6\x47\x26\x21\xd4\x82\x62\xdb\x2b\x14\x21\x08\xb2\x60\xdd\xc0\x6f\x69\x53\x7d\xed\x42\xc3\x1c\x33\x83\x53\xe6\xcf\x6e\x84\x72\xa8\xff\x8a\xb5\x97\xbb\x2b\x69\xc5\xd6\x1a\x0d\xfd\xa6\x98\xda\xa1\xc4\x7b\xc0\xd4\xee\xbb\x10\x5a\x75\x21\x0f\x98\xda\xbf\x5f\x4c\x6d\xa7\xcb\x7c\x25\xa6\xf6\x89\x47\xe4\xc9\x02\xf5\x79\x13\xa6\xb6\xd1\x95\x7f\x4b\x4c\xed\x3e\x9c\x60\x7f\x00\xcd\xbe\xb7\xc0\x81\xd9\x17\x82\x03\xf7\x80\x71\xb1\x1e\xf5\x27\x00\x22\x73\xb9\x88\x4d\xc0\x8d\xdb\xe1\x83\xfb\x30\xc8\x10\x6a\x8b\xdd\x07\x3e\xb8\x67\x08\x3e\x7c\x30\xbb\x33\x7c\xf0\x2b\x2e\xcb\xa8\x01\x5b\x65\x46\x73\x5f\xc0\x2a\x93\xa3\xc8\x10\x83\xc4\xa8\x36\xeb\x88\x94\xe6\x2e\x08\x2a\x52\x98\x09\x83\x8a\x34\xf8\x7c\xed\xc1\x51\x31\x9a\x28\x7f\x57\x46\x08\xda\xd2\x03\x7c\xe6\x27\xb2\x85\x18\xce\x01\xbc\x19\xe6\xe1\x7e\xe9\x5c\xb3\xfb\x43\x35\xd3\x5c\xcf\xfb\x76\x8e\x9f\xc0\xe6\xd9\x90\x29\x55\x60\xc3\x99\x5b\x90\x5d\xe6\x79\x8a\xc3\x7d\x16\xb8\xc6\xb7\xc1\x85\xe5\x25\xeb\xc2\x65\x82\xe1\x4e\xb4\xd1\x17\xe0\x96\x2b\x20\xb9\xb8\x9c\x67\xcd\xfa\x3b\xf0\x22\x93\x2d\x1f\x74\xa9\x0a\xe8\xb2\xfb\xcf\x21\xc0\x3b\xe1\x10\x2d\xa2\x2a\x6e\x26\x6d\x15\xcf\xe7\xb2\x24\x6c\x19\x0f\xbb\x6c\x46\x88\x30\xa8\x7c\xb4\x69\xdb\xbe\x88\x44\x8e\x85\xce\x21\x9f\x44\x2e\x40\x39\x42\x57\xd8\x66\x36\x39\x56\x75\xb3\xc9\xf1\xfb\xb3\xc9\xb1\x6e\x36\x39\x92\xa5\xf7\x67\x93\x33\xe8\x9c\x1e\x68\xd5\x57\x21\x7e\x31\x88\x91\x7d\x1b\xc4\x2f\x86\x88\x5f\xfc\x5b\x20\x7e\xb1\x26\xfa\xd5\x57\x20\x7e\x31\x0f\xf1\xab\x39\x79\x9d\xe8\xea\x5e\xeb\x5a\x4b\xba\x2b\xd6\x3a\xeb\xc6\xc1\xe3\xf7\xc7\x5a\x67\xbd\x58\xeb\x04\xc2\x05\xe5\xad\xa0\x53\x76\x69\x86\xc1\xd5\x13\xa2\x3a\x7f\x05\xba\x7a\x13\x72\x37\x64\x07\xd8\x8c\x88\xd4\x46\x1f\x32\xda\x00\x6e\x53\xf6\xf5\x30\x48\xe1\xdb\x99\x7b\xfb\x86\x97\xfb\xd0\x47\x7c\x13\xf4\x11\xbb\x2f\xf4\x11\xef\x85\x3e\x62\xf7\x84\x3e\xe2\x9b\xa1\x8f\xd8\x97\x40\x1f\x3d\xfb\x5d\x42\x1f\x79\x8e\x97\xdf\x0d\xf4\x91\xf1\x24\xf7\x23\x01\x19\x95\xfb\x77\x01\x7d\xe4\x4d\x61\x17\xf4\xd1\xf3\x5b\x91\x8f\x02\x25\x7d\xf3\x78\xbf\x2f\xf2\x51\x03\xee\xc8\xf4\xab\x1b\xee\xa8\x31\x63\x31\xfb\x3a\xb8\x23\xee\xc1\x1d\xb1\xea\x2b\xe1\x8e\xbc\x93\xc7\xee\x00\x77\xf4\xc3\x03\xda\xd1\xdf\x23\xda\x91\x8d\x98\x7c\x4f\xb4\x23\x23\xcc\xfe\xa0\x68\x47\x9e\x6f\xe5\x77\x87\x76\x04\xe0\x89\xd5\x03\xd8\xd1\xd7\x81\x1d\x45\x0f\x68\x47\xff\xe5\xd1\x8e\xfe\x74\x57\xb0\x23\x4f\x49\xff\x4d\xc1\x8e\x4e\xfc\x38\xd1\x03\xd8\x51\xc7\x92\xbe\xf8\xb6\x58\x47\x5f\x8b\x71\xc4\x1d\xc6\x11\xfb\x26\x18\x47\xfa\x15\xec\xbb\x60\x1c\x59\xb5\xf6\xef\x0f\xe3\xc8\x0c\xbd\x03\xe3\x68\xf3\x0c\x34\xb1\x8e\x98\x87\x75\xc4\xef\x8f\x75\xb4\x73\x77\xac\x23\x2b\x91\xbe\x1c\xeb\x08\x77\x19\xc4\x70\x3b\xd0\x8d\xb8\x43\x37\x62\x5f\x8f\x6e\xe4\x97\xed\xb0\x6f\x80\x6e\x64\xb3\x83\x63\xf6\x0d\xd0\x8d\x38\xa2\x1b\xb1\x6f\x81\x6e\xc4\x2d\xba\x11\xbb\x33\xba\xd1\x6e\x88\x6e\x74\x72\x3a\x79\x7b\x3a\x7c\xff\xe5\xe8\x46\xd4\xc0\xef\x09\xdd\x88\xba\xf4\xf7\x84\x6e\xe4\x2d\x63\x27\xba\x91\xf9\xfc\xbb\xa1\x1b\xed\xfd\xae\xd1\x8d\xcc\xf0\xff\x10\xe8\x46\xa6\xb3\xbf\x2b\x74\x23\xd3\xa9\x7e\x74\x23\xfa\xc6\xf4\x77\x8d\x6e\x74\x62\xae\xac\x6e\x70\xa3\x95\x9f\x9b\xf3\x75\xe0\x46\xa0\x37\xea\x2f\x5d\x27\x6b\x74\x30\x5f\x6a\xd3\xc1\x31\x48\x92\xad\xd1\x04\x3c\xa2\x98\xb9\x8f\x78\xc4\x7b\x10\x8f\x5c\x60\xd7\x38\x04\xb1\x2e\xcc\x38\x58\xef\x80\x36\x44\x03\x0e\xd1\x86\xb8\x45\x1b\x62\x5f\x8b\x36\x44\x71\x27\x42\x1b\x62\x5f\x89\x36\xc4\x1d\xda\x10\xbb\x0f\xda\xd0\x3f\x76\xc2\x0d\xad\x6c\xa2\xf3\xad\x70\x43\xff\xd4\x28\x19\xfe\x47\xbe\x5e\xaf\xd7\xff\xc4\xff\x31\x84\x1c\xfa\x27\xb2\x2d\xbd\xfa\x99\xef\x80\x39\x74\x4f\xac\xa1\x2e\xd4\xc7\x2f\xc3\x1a\x72\xfa\x2f\x6b\x60\x0d\x79\x03\xfe\xa3\x61\x0d\xdd\x82\x31\xc4\xbf\x08\x63\xa8\x6f\x89\xfc\xa0\xa2\x9b\xb6\x2f\xc3\x16\xe2\x5e\x29\x3a\xbb\x67\x29\xfa\x37\xc5\x17\x22\x9b\xce\xdb\x03\x5e\x92\x67\x64\xa5\x1c\x95\x57\x24\x7a\x0e\x4b\x9b\x06\x9b\x67\x1f\x49\x26\x5e\x5f\x8a\x82\x65\x15\x8a\x19\x85\xd5\x05\x41\xba\xe8\x52\xa6\xe2\x25\x63\x6f\x0b\xb9\x94\x57\xa8\x82\x9b\xed\xfb\xfc\x45\xc4\x6f\x05\x04\xe3\xfe\x93\x73\xb9\x14\x8a\x41\xb0\x7e\xf8\x7a\x3a\x39\x3a\x3f\x1b\x1d\x7d\xf0\x15\xdc\x57\x44\xb0\x09\xab\xcf\xab\xf5\x4a\xf0\x7f\x85\x2a\xcc\xeb\x47\x54\x42\xd5\x3c\xdd\x98\x6f\xb9\xa6\xe0\xc8\xb5\xc8\xf5\x3b\xd0\xd5\x1b\x1e\x76\x2a\x1f\xa2\x7a\x45\x67\x29\xbd\xf2\x5e\xc3\xe6\x8f\xfc\x0e\x50\x3d\xd9\xe5\x7a\xa5\xed\x2f\x88\x36\xb9\x5c\x68\xd3\x2f\x58\x1a\xfc\x65\xfe\xc8\x6c\x55\x53\x39\x1a\x64\x23\x07\xe6\x5d\x5f\xc5\xd5\x64\x01\x21\x0e\x8a\x4a\xb8\xd7\x41\xe0\x96\xbc\x40\x33\xc1\x88\xd1\x1b\xcc\x27\xb0\xf9\xbd\x82\x9f\xce\x9e\x51\xfd\x0e\xfa\xcc\xe1\x70\xcf\xf4\xe2\xd6\x4a\x3c\x9e\xe7\xd9\xfc\x23\xf8\x6f\x97\xa2\xa8\x79\x56\x89\xa5\x7a\xfc\xd8\x12\x56\xaa\x3a\xc3\xd0\xaa\xad\x54\xff\x3d\xc0\x5b\x59\xa5\xe1\xd7\x84\xb7\x0a\x8e\xdc\xbf\x7a\x3b\xfb\x11\xdb\xa6\xac\xbb\xe4\xa3\x50\x58\x91\xaa\x38\xa5\x87\x64\xb9\x28\x1d\xce\x15\xb7\x30\x57\x16\xdf\xea\x1f\xbb\x00\xae\xf8\x3f\xf9\x10\x57\x7f\x7a\xc1\xfb\x11\xae\x02\x60\x05\xd6\x10\x7f\xd6\xe5\x41\xa1\x1b\xe7\x70\xd0\xdb\xc6\x5f\x56\x74\x35\x78\x75\x9c\xcc\xf8\x1a\x8c\xd7\xa2\xf4\xe5\x4d\xc2\x55\x3d\x2b\x65\x5d\x65\x85\x87\x36\x66\xdd\x25\x94\x51\x0d\x85\x88\xb2\x04\x6d\x6d\x51\x83\xa3\x8b\x3a\x62\x88\xde\x7d\xce\x3a\xcf\xb5\xad\x5c\x52\x8f\x43\x67\xa4\x54\x50\x10\x5c\x94\x5a\x69\xca\x91\x53\x19\x59\x42\xcd\x3b\xc3\x32\xb0\x96\x7f\xf1\xb7\x86\x55\xf9\xc3\xfc\xc4\x4f\x44\x95\xe4\xc9\xec\xf1\x5e\xbc\xf3\xbd\x60\xc0\x36\xe3\xff\xec\xfe\xf0\xfc\xe9\x7e\x13\xff\x67\xff\xf9\x03\xfe\xd7\xaf\xf2\x03\x8e\xab\x83\x11\x9f\x9c\xff\x38\x3a\x3d\x1b\xf1\x27\xda\x44\x3d\xe6\xe6\xcf\xff\xff\xaf\xff\x61\xec\x31\xb7\x48\x42\xf1\x8e\xfe\x75\x78\xa5\xc5\xe1\xde\xce\xee\x0f\x8c\xfd\xf2\x9f\xfc\xf4\xe6\xaf\xe7\x67\xe3\xa3\xf1\x14\xea\xac\xf9\x2f\x7f\xe3\x87\x23\x7e\xf4\xe8\x97\xff\xe4\xe3\x63\x70\xd6\x98\x3f\x4f\x27\xe7\x53\x7e\x30\x3a\x3b\x1b\xd9\x0e\x3e\xfe\xfa\x1f\xc6\x8e\x04\xff\xe5\x3f\xf9\x81\x2c\xe6\x37\x9f\x53\x2d\x88\x7e\xf9\x1b\xf8\xeb\x6f\xfe\x77\x2a\x78\x52\x73\xe8\xe3\x67\x60\x59\x55\x49\x25\xea\x52\x7f\xa1\x2e\x78\x5a\xca\x4c\x6b\x63\x85\x31\xd3\x16\x5c\x54\x80\x89\x51\x67\x15\x4b\x51\xe4\x89\xc6\xe3\x7a\x1e\x7e\xf9\x1b\xd7\x9f\xc2\x10\x3d\x15\xf2\x97\xbf\x41\xb2\x5c\x05\x1f\xea\x9b\xf6\xe6\xb3\x12\x45\x45\x95\xf4\x73\x11\xb1\x9b\x7f\xe7\xa9\x50\x7c\x91\x15\x58\xcf\x85\x09\xba\x42\x71\x59\xeb\x7e\x44\x3c\x4d\x0a\xc5\x73\xad\x13\x14\x29\xd6\x63\x88\x52\x77\x6a\xa5\xc5\x7e\x5d\x08\x9e\xd6\xe5\xcd\x67\xc1\xb3\x1c\x02\x37\x37\x9f\x45\xc4\xe8\x19\x15\xf8\xf2\x3f\xad\xca\x6c\x79\xf3\x59\xff\x35\x7b\x9c\x0a\xa5\x64\xad\x35\xa9\xa3\xe6\x70\x68\x36\xf4\xcd\x8a\xa3\x4d\x05\x2f\xcd\xc7\xa2\xec\x1c\xe4\x4b\xf0\xad\x3e\xa6\x61\x12\x43\x6d\x56\x8a\x48\xff\x0a\x09\x05\x65\xa4\xf7\x09\xcc\x51\x92\x26\x2b\xa8\xc2\xce\x2d\x73\xb4\xfe\xe5\x91\xf8\x54\x95\x49\x56\x0a\x3d\xba\x3c\xa1\xd2\x4e\x59\x2e\x21\xa3\x0e\x52\xc8\xf5\x40\xb5\x16\xa8\x58\xd8\x05\xc5\xd3\x9b\xcf\x65\x76\x05\xa3\xfb\xe5\x6f\x11\x4c\x29\xf6\xa1\x82\x99\xd4\xbf\x13\xd6\x8d\xb2\x1d\x81\xf4\xf2\x65\x5d\x64\x3f\xd7\xd4\x9b\x34\x5b\x2c\x6a\x45\xbf\x38\x45\x95\xfe\x00\x06\x25\x4e\xbe\xe9\xde\x52\x54\x95\xd6\x75\xcd\xd0\xc4\xa7\x55\x2e\x33\xad\xd8\xdc\xfc\x3b\xaf\xb2\xaa\x14\xde\xa2\x42\x5e\x20\x17\x9f\xb4\x2a\xa6\x57\x92\x7a\x30\xcb\x0a\xbd\x43\x93\x2b\x31\xe7\xe9\xa3\xa4\xae\x4a\xa1\x98\x67\x87\xa8\x48\x8f\x40\x7f\xfd\x11\xa4\xe7\xea\x2f\xc3\x02\x2b\x59\xe0\x25\x2d\xcc\x58\xf5\x17\xbd\xab\x3a\x66\x6c\x2a\x6b\xc5\x61\xd7\x95\x57\xb0\x92\x2f\x75\x5f\x97\x7a\x1b\xc9\xa2\x80\x0a\x79\x08\x97\x96\x85\xde\x3a\x7d\x7b\xf8\x25\x57\x89\xf1\x71\x6c\x27\x35\x5f\xca\x0c\x37\x65\x21\x97\x2c\xad\x5b\x67\x6d\x40\x73\x04\xe5\x9c\xa9\xfe\x5f\x59\x64\x37\xff\xbb\x14\x7c\x99\x29\xa1\xe7\xe6\x2f\x12\x82\x07\x5d\x6f\x63\x76\xb3\xdd\x7c\x16\x1b\x36\xe8\x4a\xd4\x60\x38\x69\xcd\xb5\xa8\xb8\x7a\x94\xcc\x7f\xae\xb5\x2a\x07\x0d\xcf\x45\x55\x79\x09\x42\x1c\x98\xcb\x8b\x2b\xb9\x4e\x8a\x2a\xd2\x2a\xbf\x3e\xee\x79\x26\x0a\x6d\x46\x88\xb2\x12\x9f\x2a\x11\x81\x09\xa5\x3b\x6e\xca\x11\xe0\xd5\xf9\xa3\xc6\x74\x88\x8a\x27\x4a\xd5\xda\xec\xd6\x27\x90\xd1\x74\x3a\x8f\x8f\x7e\x50\xf9\x13\x1b\x33\x76\xe2\xad\xfd\x4b\x90\x92\xef\xb3\x22\x53\x15\x4c\x4b\x2a\xf8\xa7\x4f\x9f\xf8\x63\x7e\x28\x8b\x02\x76\xb1\x89\x4c\x0b\xc5\xab\x9b\xcf\xf9\xcd\x67\x28\xac\x80\x8f\x54\x5d\xf2\xcb\xaa\x5a\xbd\x7c\xf2\xe4\xfa\xfa\x3a\x4e\x93\x2a\x89\x2f\x64\x7d\x15\x2f\xca\x27\x8b\xf2\x89\xfe\x5d\x89\x4a\x3d\xf9\xf4\xe9\xd3\x93\x88\x85\x33\x5e\xf3\xdd\xa7\x7c\x71\xf3\xf9\xaa\xd4\x3b\x59\x0b\x6c\xfe\xcb\xdf\x62\xc6\x0e\x60\xba\xcc\x40\x52\xe1\x6f\x8a\x02\xe6\x71\x01\x1d\x4d\xea\x79\x5d\xf0\x79\xa2\xcd\x50\xf8\x83\x5c\x2c\xb2\x79\x26\x72\xfd\x8a\x3c\x69\x4b\x46\xd6\x2b\x19\x23\x3d\x8f\x5a\x7e\x69\x91\xbb\x82\xcc\xd5\x8b\x8b\x9b\xcf\xa5\x40\xb1\xf6\x73\xad\x6d\xc6\xe2\xe7\x1a\x71\xd1\x8b\x22\xc9\x94\x82\x04\x3a\xf0\x1a\x61\x60\x4d\xaf\x63\xde\x96\xf5\x70\x62\xf4\x67\x95\x04\x27\xa1\x3e\x53\x20\x3a\xf5\x70\xe0\x18\xff\x5c\x8b\x88\xc3\xce\x65\xed\x9d\x05\x02\x43\x2f\x60\x97\x9c\x8f\x61\xed\x0e\x27\xc7\xc7\x37\x7f\x1d\x4d\xf9\xcd\xff\xe2\x07\xc3\xd3\xe1\xc1\xd9\xcd\xff\x75\x3a\xe2\x27\xa3\xd3\xe9\xe4\xf8\x78\x74\xa4\x9b\xf9\x36\x37\x59\xc7\x71\x34\x4b\x9a\x66\x6a\x25\x15\xee\x6f\x38\x0d\x88\xc2\x90\x81\x88\xd4\x9d\xb7\xbb\xe9\xe6\xdf\xbd\x35\x63\x2b\x51\x2a\x7d\xfa\x73\x38\x46\xb2\xbe\xd2\xb3\xb6\x00\xd1\x9b\x3f\xa2\xfb\xea\x91\x5e\x83\xce\xf1\xf3\x69\xc6\x2b\x91\xe3\x05\x21\xf8\x3c\x51\x11\xeb\x58\x03\x72\xa5\x08\x5a\x9f\xf6\x2c\xeb\x5d\x21\xc0\x74\x81\x4b\x11\x92\x51\xba\x46\x0b\x23\xbb\xf9\x7f\xf4\x12\xc2\x7d\x04\xa7\xdd\x97\x11\xee\x8e\x9c\x27\x29\xe2\xa7\xe1\x45\xae\x18\x16\x9f\xdc\x7c\x56\xb8\x53\xba\x6e\x60\x98\x1b\x2b\x26\x52\x48\x59\x59\x89\xb9\x16\x23\xb6\xc5\xfc\xe6\xf3\x45\x92\xb3\x52\xe4\x49\x95\x2d\x68\xab\x7b\xd8\x01\xf0\xc6\xce\xb9\xe6\x76\xae\x69\xdf\x9c\x4e\xc6\x67\x53\xad\x0e\x9d\x9c\x4e\x4e\x4e\xc7\x37\x7f\x3d\xbb\xf9\x2b\x1f\x1f\x9f\x8d\x8e\x8e\x46\x07\x67\xe7\xfa\xff\xbe\xd9\xde\x19\xe3\x22\x5d\x00\x98\x60\xd6\xab\xf7\xe8\x23\xa6\xe5\xcc\xcd\xe7\x2b\x51\x54\xb5\xc8\x71\xef\xc0\x0c\x82\x28\x00\x43\xf0\xe6\x73\x75\xf3\x99\x69\xa3\x1b\x4a\x1f\x6b\xfd\x7f\xb0\x8c\x37\x9f\x2b\x51\xd4\x38\xc3\x7a\x22\xb4\x82\xa2\xcc\x01\xec\xda\x18\x5a\x7e\x35\xe5\x81\x16\x13\x85\xe0\x0b\x59\xa0\x2c\x90\x33\x55\x25\xf3\x5c\x9f\xdd\x4f\xb4\x98\xfc\xf6\xc5\xd4\x3b\x48\x96\x0a\x07\xd4\x7e\xb1\xee\x2a\xa4\x29\x9b\xe3\xd1\x35\x44\x1e\x0e\x51\x77\x6c\x2e\x30\xb2\xa1\x3a\xbb\x0e\xf2\x26\xcb\x51\xdf\xda\xa8\x60\xa6\x82\x2f\x92\x9b\xff\x90\x05\xf3\x34\xcc\x2b\xdc\x82\xa8\x2c\x5c\x94\xc9\x3c\x13\xf5\x27\x52\x78\x1a\x6a\x1f\xfd\x15\x85\x9a\xbe\x5e\x41\xf3\x63\xf7\x18\x8d\x11\xbb\x7d\x67\x12\xce\x1a\x48\x02\xa6\xdf\xc2\x6b\x95\x5c\x88\x3e\xad\x40\x5f\x0a\xb2\x5c\xde\x7c\x5e\x62\xea\xf7\x27\x7d\x3e\x45\x59\xe9\x15\x12\xf8\x07\xa7\x7f\xb2\xf4\xe6\xf3\x22\x83\xea\x9b\x0d\xab\x77\x3a\x9a\x9e\x4c\x8e\xa7\xe8\xbf\xbe\xf9\xeb\xf7\x13\xa1\xfa\x5c\x74\x89\x51\x98\x2c\x38\x11\xa4\x52\x09\x0e\x19\xf2\x37\xff\x51\x0b\xda\xd0\xac\x7d\xdb\x28\xa8\x19\x83\x5b\x86\x0e\x9b\x30\x95\x2c\xf0\x7c\x95\xcc\x75\x4b\xba\xd9\xb9\x7e\x81\x82\xc1\x5f\xd5\x38\x19\xac\x73\x32\xf8\xd1\x23\xc2\x5f\x01\x0d\xea\xe6\xf3\x22\xa9\x49\x99\x7d\x24\xca\x52\xd4\xa5\x77\x62\x31\x4b\x92\xe4\x7f\x2d\x14\x59\x00\x5d\x3b\x15\xf4\x51\x3d\xff\x0b\x59\xeb\x0b\xbe\x06\x1d\xb5\xa8\xb2\xa2\xee\x5b\x69\x56\x3c\x82\x00\x5f\xa2\xdc\xf0\x7a\x0e\x77\xcc\xc7\xb9\x3e\xc8\x9e\xd0\xd6\x3d\xc2\x8d\x4b\xe9\xf1\x50\x32\x98\x0a\xda\xc7\xa0\x7c\x45\x30\x01\x7f\xa9\xd3\x6c\x0e\x13\x96\xca\xe5\x92\x76\x9e\xd6\x03\xf4\xc4\x29\x59\x6a\x85\x2e\xa9\xd5\xcd\x67\x4e\x56\x13\x8a\x9a\xb4\x66\x8b\x24\x33\x36\x56\xcf\x9d\xbd\xc9\xcc\x51\xa2\xce\xfd\xce\x6d\x68\xa9\x6b\x86\x18\xbe\xa0\xe7\x01\x5f\xc3\xc9\x0a\xb0\x8a\xb4\x32\x8a\x4b\xe8\x8d\xe2\x67\x50\xec\x93\xda\x2c\x22\xeb\xd3\x9a\x9c\x2a\x2e\x2a\xfd\x8b\x51\xb2\x7d\x45\x2f\x66\x0c\x6e\x1a\x3f\xcf\xe0\xdb\x9c\xa5\x8e\xad\x0a\x73\x58\xde\x7c\xbe\x70\xdb\x02\xed\xe8\x45\x99\x14\x37\xff\x91\x64\xc0\x50\x32\x79\x7f\x32\x3c\x1b\x9b\x83\x7d\x38\xe2\x47\x43\x7e\x72\x7a\xf3\xd7\xe9\xe8\xf8\x9b\x5b\xff\x5d\x9d\x4c\x38\x0a\xc4\xb9\x2c\xf0\x30\xeb\x1d\x89\x3b\xd4\x63\x9e\x03\x2b\x8c\x04\x2c\x3d\x08\x4a\x07\xfb\xb9\xce\xb8\xf8\x94\x5d\x80\x74\x27\xfb\x27\xe9\x51\x98\x85\x6f\x97\x40\x8b\xb9\xcb\x67\x4b\x8a\x4a\xdb\xaa\xa2\x06\xca\x8e\x4e\x41\xc8\x93\xac\x50\x19\xff\xb9\x7e\x84\x0f\x0b\x65\x3e\x51\xd6\xd2\xfe\xe5\x3f\xf9\x64\x25\x0a\xfe\x56\x5e\x89\xb2\x80\x37\x1d\xd1\xd3\xbf\xfc\x8d\x6f\x4f\xde\x1e\x0d\xb4\x7e\x7b\x2a\xd7\x49\xbd\x14\x8f\xcf\x8b\x2c\x72\x4f\x1e\x94\x02\x6b\xaa\x0e\xe4\x72\xa9\xcd\xe7\x61\xe5\x92\xd5\xf4\xe3\x07\x07\x8f\x5f\x7f\x18\xe8\x61\xb5\xbe\x2a\xaa\x46\x0f\x0e\x93\x2a\xe9\x6d\x68\x72\x68\x5b\xca\x1f\xc1\xd7\xff\xb9\x90\xd7\xb9\x48\x2f\x1a\x29\x78\x87\x37\x7f\x7d\x33\x3e\x26\x0c\xbf\x6f\xb2\x0b\xa6\x12\x25\xa2\xca\xd2\x9b\xcf\x7a\x8a\x23\xbd\x74\x4a\x14\xaa\xcf\x1b\x43\xb2\xf1\x65\xb7\xff\xe8\xa5\x13\x58\xa0\xd1\xa1\x43\x09\x3f\xb6\xae\xa3\xb4\x5b\x69\x66\x3d\x8a\x03\xb7\x9e\x9a\xe0\xea\x6c\xb8\x6e\xfc\xcb\x22\xe8\x38\xa3\x8e\x77\xdf\x71\x60\xea\x63\x9f\xfd\xb0\xa6\xb1\x7f\xf8\x22\xbb\x40\x1b\x16\x3a\x81\x3a\x2c\xa2\x68\x2b\xe7\x19\xd1\x3d\xd2\xba\x9c\x7e\xe8\xe6\xb3\x22\xcb\x59\xf0\x24\x5d\x82\xf9\x5a\x52\x76\x2f\x79\x14\x6e\x3e\xc3\x01\x59\x95\x62\xa9\x0d\xcc\x24\xcf\x8a\x9b\xcf\x09\xf9\x7d\xca\x2a\xd3\x2a\xdd\x51\xbc\xbf\xb3\xf3\x78\x4f\xcb\xed\x83\xd3\x93\xe1\xab\xee\x6e\x76\x1a\x39\xd6\xa4\xb3\x8b\xa0\x44\x2e\x0b\x98\xb0\x4a\x94\x4b\xa1\x98\xa8\xfc\xa9\xeb\x59\xe9\x0d\xf2\xfa\x25\xcf\x1f\xf9\x7f\xea\x51\x7e\x74\xcf\xc8\x59\x03\xce\x3b\xe6\x5f\xee\xa8\xbb\x69\x3d\x14\x7e\x07\x9d\xc2\xc8\x9f\xb6\x5e\xd1\x7f\x3b\xb5\xb6\x9c\x96\x42\xce\x17\x07\xc3\x6e\x7a\xc2\x9a\x8a\x19\x0b\xf5\xb0\x0d\x33\x72\xb8\xc9\x68\xe4\x81\xd1\xf8\xb2\x63\xc1\x94\xe0\x65\xb2\x5a\xc9\xb2\xd2\x7b\xea\xe6\xdf\x59\x5d\x78\x3d\x07\xd8\x07\x3d\x47\x06\x2d\x48\xef\x14\x59\x07\xe0\x41\x91\x35\x46\x51\x2e\x7b\x5f\x65\x58\x80\x44\x45\x65\xb5\xad\x48\x42\x04\x23\x7e\x04\xf3\xd5\xb5\x9c\x70\xbf\xd7\x33\x59\xa6\x6e\x77\x92\x85\xc7\xd2\x9a\xec\xbb\xbf\xd4\x65\x96\x42\xef\x44\xc1\xaf\xb2\x8b\x5a\xc0\x15\x7a\x8e\x26\xb0\xbf\xf2\xd6\xcf\xe8\xcf\x42\x21\xeb\x2b\x58\x63\xf3\x0e\xe8\xa0\x7b\x68\x5e\xde\x7c\xd6\x33\x1a\x0c\xe2\xe6\xdf\xb1\x00\xb0\xcf\x0d\xa6\x1b\xf1\xbe\x03\xf6\x38\x79\x0b\x33\x05\xfb\x92\x75\x3d\x05\xb6\x3b\xed\x4b\x6b\x92\x86\xfd\x51\xe0\xe0\x56\xb2\xd6\x47\x0c\x97\x59\x54\x4e\x98\xc0\x76\xbc\x8f\x45\x81\xf3\x60\x6c\x6e\x6f\xd5\xc8\xa3\xcd\x2a\x6d\x52\x92\x66\x70\x00\xd8\x03\xb4\x07\x7b\x1b\xdd\x76\xf7\xa7\xd5\x26\x60\x58\xa2\x2e\x23\x46\x2f\xba\x92\x99\x02\x04\xd6\xba\xf9\x0d\xfa\x5d\xd5\x19\xa6\xff\x66\xca\x79\x84\xe7\x15\xa8\xce\xa9\x80\x8a\x56\xa5\xef\x60\x33\x4f\xff\xef\xff\xfa\xbf\x07\x31\x63\x37\xff\x0b\x8c\xf3\x09\x98\xe9\xdf\x23\x38\xd1\xad\x9e\x5c\x49\xaa\x1d\xba\xf9\x77\xda\xff\xd6\xc3\x41\x93\xa7\x1a\x52\x17\x25\x8d\x36\x1f\xca\x70\xdf\x93\x6b\x45\x85\xab\x6e\x04\xbf\x8a\xf9\x48\x4f\x32\xea\xe8\x9f\x2f\x12\xb2\x1e\xe0\xa5\x2c\x7c\x69\x53\xda\xca\xfa\x32\xc9\xe0\x80\xa3\xeb\xbb\x29\xa1\xbb\xd5\x63\xde\x15\x90\xb8\x93\x41\x78\x94\x40\x5a\x0f\x29\x99\xa9\xac\x74\xc7\xf4\x61\x68\x9d\xdc\x8b\x5c\xce\x92\x9c\x5f\x65\x0a\xc5\x0f\xc6\x46\xc0\xa1\x0f\xd2\x69\x25\x8b\x2a\xd1\xcb\xcc\xfa\x26\xf3\x96\x59\xe3\xc9\x22\x2b\xb4\xf1\x55\x40\xa4\x1c\x86\x0f\xa6\x5b\x5e\x6b\x5d\xb0\xbc\x10\x8d\x65\x40\xb9\x6e\xf5\x82\x7b\x58\x14\xf8\xe7\x56\x0f\x99\x55\xb4\xcd\x69\x42\x24\x0f\x28\xf4\xcf\xa9\xbf\xa2\x00\x4f\x99\xc9\xbd\x04\x75\xe2\x51\xe3\xb6\xde\xd6\xf7\xee\xc0\xba\x7d\xcd\x1e\x5c\x24\xf3\x2c\xcf\xd0\xb7\xd0\xd8\x51\x18\x09\x72\xb1\x30\x7c\xab\x3f\x51\xcc\x4d\x94\xa8\x50\xb7\x80\x2d\xb4\xcc\x42\x05\x56\x5f\x61\x2b\x51\x5f\xd9\x1d\xe7\xb6\x39\xed\x84\x46\x6f\x99\x80\xd4\xa6\xaa\xd6\xfa\x6c\x7a\xf3\x79\x5e\x0a\xa0\x52\xd0\x43\x0d\x6a\xee\x9a\x4a\xc6\xde\x3e\x28\x19\x5c\x0f\x36\x66\x6c\x04\x61\x71\x74\x5b\x26\xdc\x60\x11\x18\xb7\x7a\xa4\xf7\xb6\x36\x99\x93\xba\x92\x25\x06\x43\x6a\x7e\x42\x7a\x0c\xf5\x47\x44\x3c\x7d\x24\xeb\xab\x32\x2b\x99\x9e\x61\xbd\xf2\x17\x65\x52\xa4\xbc\x90\x4b\x0a\x95\x59\xa1\xeb\xe6\xa3\x63\x29\xb1\xb3\xa3\x2a\xa9\xb4\x42\x9d\x6a\x3d\x46\x9b\xf3\x55\x32\xcb\x33\xa5\x08\x82\x0f\x57\xd0\x1c\x57\x58\x93\x04\x66\x4a\x0f\xc0\x68\xfb\x93\x5a\x4f\x0e\xd9\x33\x66\x05\xbb\x84\x42\xd7\x12\xf2\xb9\xe8\xdb\xee\x11\xfa\x42\xf4\x82\x89\xa6\xf3\xc6\xcd\xf2\xfe\xde\xee\xe3\x5d\x6f\x92\xc3\x0d\x45\x73\x7d\xe5\x82\xc5\x74\x10\x1a\x9d\x77\xab\xa3\x84\x8b\x56\xe5\x89\x1e\x4f\x9d\x53\x60\x4a\x5f\x17\x52\x61\x74\xc7\xdc\xb8\xca\x15\x7d\x05\x0d\x33\xd3\x30\x3f\x00\xd0\xc0\xa4\xa8\x22\xa3\x2d\x85\x5a\x96\x22\x1f\x78\x59\x92\xb9\x00\x8e\x10\x88\xdf\x79\x41\x4f\x96\x37\xe7\xe9\xe7\xfa\x51\x96\x2b\x2e\xa1\xe8\x1b\x9d\x2e\xb8\x83\xe6\xc1\x0c\x28\xf8\x56\x6e\x25\xa7\xd6\x56\xbe\x6f\x2e\x4b\xfc\xe4\x3d\xf2\x3f\x7d\x47\x0e\xb8\xcd\xf9\x1f\xfb\xcf\xf6\x76\x76\x9b\xfc\x6f\xcf\x9e\x3d\xf0\x3f\xfd\x2a\x3f\xef\xe5\xbf\x65\x79\x9e\x34\x13\xab\x82\x84\x0d\xce\xf9\x6e\xcc\x0f\x2d\x2a\x95\x62\x6c\x37\xde\x8d\xf9\xd6\x81\x29\x94\x96\xa5\x05\x82\x4f\x00\x17\xd6\xd0\x10\x70\x59\x12\xb7\x05\xc4\xd3\xd6\x84\xe9\x80\x45\x00\x91\xab\xb4\x16\xca\x40\x48\xc2\x67\x58\x73\x08\x89\xd4\xf2\xba\x50\xfc\x80\x30\xc4\xa7\x8e\xef\x62\x37\xde\x0b\x7b\x60\xfa\xbc\xe5\xc1\x80\x91\x06\xec\x23\x02\x1c\x04\xc5\xdd\x72\x41\x0c\x10\x6c\x1b\x73\x17\x07\x08\xad\x35\x5b\xf3\x84\xfb\x8d\x5b\x74\x58\xaf\xfa\xdf\xfb\xfc\x91\x0a\x1a\xc6\xe2\x31\x98\xb7\x7d\xbf\x97\x5e\xf7\x9a\x43\x42\xb4\x8e\xee\xd6\x61\xb8\x4f\xa1\xa1\xf0\x21\xd3\xd8\x14\x3d\x7c\xa0\x2d\xbf\x91\xe5\x12\x33\xfb\x0d\xf2\x15\x2c\x5b\x92\xfb\x2d\xb2\xcb\x44\x51\x9d\x02\x21\xb7\x99\xcc\xff\x82\x8f\x3e\x01\x3e\x0e\x1f\x62\xee\xea\xc8\x21\x5b\xbd\x21\x2c\x35\x28\x0e\xf6\xde\xc9\xf4\x07\x58\xf8\xf1\x3e\x80\x54\xeb\xf8\x2e\xc7\xef\x66\x06\xb7\x3c\xc1\xa2\x62\x2a\x6d\x26\x78\x06\xc5\x08\x3d\xd9\x9b\xc8\x67\x31\xdf\x1a\x17\x9e\xf3\xed\x27\xc0\x88\x13\x5a\x47\x4c\xca\xb5\x25\x45\xa2\x39\x61\x6c\x3b\x19\x58\x70\xe0\xae\x39\xe0\x7d\x73\x90\x0a\x35\x2f\xb3\x19\x26\xe1\xd3\x6c\xb0\xd7\x26\xb5\xbc\xb9\x06\xaf\xb8\x2c\x19\xdb\x9e\x79\x2f\x6b\xad\xed\x75\x42\x20\x60\xc9\x55\x92\xe5\x1e\x9e\x44\x50\xa4\x60\x0a\x66\x77\xe3\x5d\x40\xcc\x4b\x4a\x48\x20\x69\x56\x17\xcc\x30\x91\x01\x33\x76\x3b\x9a\x49\xdc\xa4\x78\x68\x9b\xbb\xf1\xf3\x98\x6f\x35\x16\xd3\xec\x1f\x00\xba\x69\x02\xe5\x79\xb9\xc8\xcd\xf5\x83\xf6\x7e\x88\xf9\xd6\x91\x56\x64\x4b\xfe\x93\x2c\x3f\xda\xb6\x3c\xac\x6d\x3c\x7f\xa2\x63\xb7\x43\x56\x28\xbc\x81\x2d\x93\x4a\x94\x90\xf0\x92\x15\x3c\x71\x48\xbd\x50\xda\x22\x4b\x83\x81\xe7\xb0\xe5\xaa\x2e\x79\x60\xb6\xc9\x9f\x74\xaf\x70\xd4\x4e\x12\x64\xce\x59\x05\x5d\x7f\x61\xbf\xa4\xa7\xc2\x7c\x8f\x58\x05\x02\x90\x57\xc0\xef\x89\x2c\xb0\x71\xf2\x29\x5b\xd6\x4b\x44\xbd\x75\x35\x4c\x11\x33\xd0\x36\xb4\x01\xa0\xe4\x9c\xe6\xd2\xec\x3c\x68\x09\xc0\x1a\xea\x19\xe2\x1e\x54\x86\x38\xc6\xc0\x39\x11\x8e\x1d\x41\x07\x61\x15\x90\x29\x48\x09\xaa\xe7\xcd\x60\x77\x77\x62\xbe\x15\x1c\x39\x7f\x45\x3b\x20\x4a\xf5\x99\x80\xc5\xd6\x73\x9b\xb5\x17\xd6\x40\xfd\x03\x6d\x26\xe1\xd2\x39\x50\x5a\x5e\xc9\x88\xa7\x22\x17\xa0\x68\xeb\x4f\x23\x8b\xb9\x14\x40\x59\x08\x6e\x19\x1e\xe4\x62\xc3\x89\xd1\x5d\x01\x2e\xaf\x8d\xdd\x71\xe4\x29\xc5\xba\xfb\x2a\xd8\xd5\xb7\xd1\x09\xa2\xdd\x1c\x40\xf6\xf7\x16\x9e\x04\xff\xb8\xbb\x89\x21\x5c\x1c\xc8\x13\xdf\x56\x83\xc8\x09\x20\xd6\xa6\xf4\x88\xb4\xed\x7a\x29\x53\xc0\xc3\x9f\x0b\x45\x30\xdf\xc9\x0a\xb6\xa9\x56\xe1\xe0\x85\x96\xd3\x81\x1a\x77\xdb\x8b\xcd\x08\x18\xc5\xef\x0c\x81\x5d\x13\xa6\x8d\x41\x62\x49\xf1\x74\x9b\xec\x78\xda\x32\xe1\xf9\x67\x54\x9f\x84\x18\x96\x11\xd2\xe0\x45\x5c\x21\xec\x78\xe4\xe0\x02\x01\x73\x34\xc9\x45\x64\x36\xb6\x96\x40\x11\xc0\x7a\x94\x95\x5e\x38\x66\xe8\x10\xa0\x30\x0d\x8b\x9a\xb2\x4a\x35\xaf\xc8\xc6\x1f\xdd\x4d\x8b\x53\xaf\xaf\xe1\x96\x14\xee\xe0\x85\xe9\xaf\xed\x89\x4c\x83\x6c\x2f\xde\x89\xee\x96\xfa\x1d\x79\x2a\xca\xae\x7b\x66\xa8\x07\x2f\x7b\x92\xe8\xdd\x33\xfb\xfa\x3d\x84\x70\x15\x80\x12\x50\x61\x87\x54\x8e\xea\x11\x47\xa9\xaf\xf1\xe6\xee\xf4\x35\x8d\x96\xf4\x0c\x10\x48\x0d\xd3\x52\x00\x38\x8a\x0d\xeb\x6b\xfd\x83\xac\xb7\x00\x3e\x4d\xff\x57\xb9\x35\xb0\x5b\xb5\xa1\x49\x25\xa1\x2e\x45\x90\x63\xba\x61\x14\x19\xac\x0b\x66\xf0\x4d\xa8\x82\x01\x60\x08\xbe\x91\xe0\x3b\xf1\x4c\x04\xfa\x19\xa2\x8a\xaa\x08\xb9\x12\xe1\x97\x1c\x04\x51\x44\x0c\x08\x86\xc5\x67\xb9\x44\xbc\x02\x00\x21\x05\x99\xfe\x41\xd6\xf8\x4e\x02\xf9\x71\x9c\x05\x0e\xd6\x34\xe2\x5b\xf4\x8c\x99\x42\xbc\xab\xb5\x59\x7a\x2d\xca\x88\xd0\xa4\x7c\x2c\xa9\x08\x29\x23\xa8\x34\x80\x5c\xa3\x20\x6f\xf4\xe4\x16\xc9\x05\xf9\x7a\x49\xe1\xc0\xd1\x38\x9e\xba\x99\x61\xd7\x9c\x87\x20\x63\x00\xad\xa8\x25\x91\xbc\x2e\x44\xa9\x2e\xb3\x95\x6e\xc2\x61\x11\x2f\xb2\x45\x05\xc8\xc3\x73\xdd\xfa\xf6\xb3\x9d\xff\x66\xd0\x46\x81\x3f\xa7\x4a\x08\x61\xf7\x32\x29\x05\xd4\xde\xcc\x44\x21\x16\x19\xa0\xa9\x06\x4d\x7a\xbd\x42\xf9\xbd\x17\x5b\x65\xfb\x2d\xc2\x1e\x6a\xa9\x72\xe0\x32\x20\x48\xc8\xef\x69\x4d\x1b\xbf\x41\xc8\x21\x81\x0a\x83\x45\x2f\x04\x9c\x08\xe0\x72\x7a\xfb\xe5\xe9\xe3\xeb\x4c\x1f\x76\x1f\xe1\x2b\xe2\x85\x2c\x1e\xdb\x3c\x12\xc3\x48\x41\xb7\x02\xae\xa8\x73\xac\x26\x79\x03\x01\x4a\xf1\x6d\x4f\x23\x20\x29\x87\x64\x4a\xa9\x58\x26\xe5\xc7\xc1\xad\x32\x4f\x6a\xe5\x3a\x32\x09\xbf\x73\x53\xe0\x66\x95\x22\x07\x04\x4a\x1c\x11\x91\x01\x7d\x8e\x3c\x40\x23\x94\xbf\x0e\xc7\x93\xb2\x68\xdb\xa2\xcb\xb2\x42\x41\x1c\x95\xd7\x85\xe1\x25\x60\xb3\x44\x01\x9d\x99\xde\xb0\xc1\xf5\x89\x52\xc1\x87\xdd\xf7\x34\x1c\x28\xbb\xc5\x8b\x0b\x67\x2b\xb8\x71\xec\x2a\x37\x86\xac\x87\x18\xe1\xc0\xb5\x8c\x26\x01\x0d\x78\x1d\x56\x3a\x8b\x86\x6c\x0e\x07\x68\xc5\xf4\x06\x19\xcd\xfa\x65\xb4\xd9\x47\x7b\x31\x1f\xd9\x94\xd3\xc3\xa4\x6a\x52\xda\x1a\xa8\x42\x7d\x0f\xd3\xe1\xda\x8b\x77\x71\x92\x28\x06\x62\xc8\xc2\xfc\xb7\xf3\x99\x98\xcb\xa5\x60\x2e\x9d\xd5\x92\x10\x06\x5f\x23\xcc\x44\xc8\x3f\x08\x0c\x31\x50\xf1\x4a\xe5\xe3\xdb\x29\x16\xce\x64\x38\x90\x7d\x7d\x74\xcc\xf5\x0c\x60\x8c\x70\x3e\xf8\x74\x2e\x57\x1b\x06\x05\x62\xd1\x8e\x8c\x27\x54\xf7\x0c\xd0\x48\x0d\xb4\x46\x27\x47\xad\x06\xcd\x8f\xa5\xd5\x83\x92\xdc\xa3\x1a\xb0\xaf\x32\xd5\xb9\xa6\xd4\xd6\xe2\x0e\xfa\xe0\x2e\xcc\x3e\x01\xe5\x7e\x6d\xe5\xa8\x13\x2a\xf6\x58\x56\x7a\x19\xac\xbc\xb1\x88\xf7\xf1\x2e\xa8\x51\xc8\xd7\x53\xc8\x06\xd9\x1f\x80\x0b\xd1\x90\x9a\x16\x2d\x1d\x7b\x83\xf3\x08\xae\x61\x24\xf2\x6b\xd9\x48\xa5\x58\x4a\x4b\xc3\xd1\xaf\xcc\x2d\x40\x5c\x3b\x18\x49\x85\xf2\x5a\xbf\xfa\x25\xdf\xce\x06\x88\x24\x10\x62\x21\x7a\x90\xf0\x8f\x54\x93\xaa\xa8\x3d\x39\x58\x5a\x9d\x65\x83\x2e\xeb\xbe\x7d\x2c\x3c\x23\xc3\x11\xdb\x22\x38\x8d\x7f\xc8\x7b\x8e\xce\x80\x86\x36\xef\x3e\xee\x56\x67\xd3\x53\xdb\x5a\x45\xaa\x32\x34\x39\x59\xf8\x16\x16\x74\xcf\x14\x80\xb7\x4a\xfc\x50\xed\xd3\x93\x44\xbb\xcc\x90\xca\x19\x49\xab\x22\x4b\xc5\x4b\xbf\xca\x92\xe5\xf2\x42\x2a\x83\xb4\xe4\x0f\xc7\x1b\x31\x71\x09\xda\x4a\x4b\xac\x56\x5e\xae\xf2\xb5\x2b\xd3\x23\x7e\xc2\x80\xdd\xc5\x13\x09\xfb\xf1\xd3\x81\x77\x16\x9f\xc6\x08\xd3\x0e\xf6\x8c\xb5\xc1\x19\x3b\x96\xa1\xee\x0d\x05\x95\xde\xf9\xa1\x1b\x0b\x2a\x4a\xd1\xdc\xd0\x5d\x87\x1d\x82\x58\x73\x0d\x44\xfb\x4e\xb3\x9a\x30\x19\x3d\x8b\xca\x3a\x8f\x9b\x10\x58\xdb\x4a\x08\x7b\x6c\x76\x77\xe2\xbd\x01\x42\x3c\x6e\xb2\x9e\xdd\xc3\xd9\xc2\xe3\x1c\xef\x60\x5f\x74\x93\xb3\xef\x4f\xce\xb3\x98\x9f\x0a\x42\x0f\xc3\xe0\x44\xfb\x06\x2f\xcd\x17\x94\xef\x3f\x70\x9f\x13\x6c\x9e\x6a\x6f\x6f\x06\xfb\xac\x52\x1e\x2c\x1d\xf9\xce\xb6\xd5\x00\xd5\x76\x38\xbe\xaa\xc6\xa4\xfb\xa2\xe2\x8e\x09\x05\xf7\x98\x03\xaa\x65\x80\x0a\xd6\x3c\x40\xb7\x9a\xa0\x7b\xf1\xf3\x98\xbf\x49\xb2\x92\x9f\x2b\xd1\xd8\xcf\x64\xab\xfb\x08\x81\x60\x55\xf9\x3b\xfb\x83\x01\x1b\xa3\xa5\xc4\xf8\x8c\x56\x20\xbc\xba\x61\x39\xaf\x4a\xf0\x22\xc8\x05\x64\x9b\xe2\x65\x0a\xff\x95\x8a\x84\xac\x1e\x03\x5b\xe9\x40\xd2\x95\xd7\xcb\x1f\xe2\x40\xb5\xb2\x14\x0e\xfb\xda\x78\xd8\x8f\xf7\xf4\x3f\xfb\x78\xef\xee\xc7\x4f\xe1\x6e\x68\x22\xcd\x76\x5e\x2a\xcc\xbb\x29\xf1\x75\xfb\x7a\xcd\x43\xba\x66\xd3\x8d\x7d\xad\xca\x1d\x36\x50\x4a\xc9\xa8\xd0\xf6\x04\x63\xc3\x3c\x6f\xc1\x98\x76\x89\x96\x2e\x7f\x9a\x23\xcf\x5a\x87\x3a\x0d\x22\x38\x02\x6f\x39\xf8\x5d\x09\xc3\x13\xfd\x83\x1f\x90\x6b\xd0\xaa\x56\x86\x6f\xe4\x36\xe2\x31\xc7\xb1\x86\x71\x0e\x9f\xd1\xcf\xee\xe3\x96\x39\x6f\x7d\xb0\x48\x4e\x39\xf5\xb8\x81\x2f\x20\x33\xcd\xc3\x02\xeb\x66\x25\xd2\x2b\x44\x55\xf9\x6b\x40\x03\x41\x96\x5b\xd6\x43\xac\x15\x60\xcd\x1b\x08\x78\x60\x5a\xd3\x46\x9f\x74\xb0\xce\x4d\x3c\x67\x16\x8a\xde\x0e\x07\x98\x59\xd3\xbd\xf6\x9a\x36\xbc\x6c\xe6\xbb\x63\x10\x70\x3e\x8c\x6f\xd7\xda\x36\xfd\xad\xd5\xa5\x28\xe8\xb2\x26\xa5\xa8\xf1\x0c\xac\x02\x38\x03\x67\xa2\xe9\x65\xec\xda\x2b\x2c\x51\xa1\x8b\xd3\x49\xaf\x5d\x9c\xe0\x0d\x6b\x4b\x2b\xe8\x3a\x09\xbe\xdf\xae\x25\xf1\xa0\x3d\x3a\x7d\xc0\xc0\xd9\x69\xb8\xbb\x88\x49\x83\xc1\x63\x55\xb6\x14\xf9\x5a\x9b\x75\x05\xc0\x43\x57\x3d\x44\x31\xa8\x03\x20\x62\x68\x70\x6a\xd0\x5b\xc7\x6c\xb7\x3d\xc5\xdd\xec\x87\x26\x4b\x62\x73\xd6\x7b\xf6\xbf\xf3\xc2\xa0\x23\xcf\x2a\x5a\x06\x99\xc2\x82\xf5\x19\xe2\xb0\x90\x45\xc8\x13\x23\xc6\xcb\xc3\x9a\xaf\xb6\x7a\x80\xb7\x5f\x51\x70\x02\x78\xb7\xc1\x41\xf0\xc1\xc7\x49\x86\xf7\x6c\xd6\x2e\x95\xd2\xed\xdf\xfd\xf6\xfe\x0d\xac\x1e\x8f\x62\x13\xc5\x47\x83\xa7\x29\xf8\xb2\x79\x95\x99\x33\xef\x42\x77\x53\xe1\x04\x12\xec\xda\xa6\x02\x12\x68\x1e\xcd\x7b\xdc\xb8\xc6\x9a\x22\xc4\xc2\x63\xfa\x9d\xc9\x10\x11\x3d\xd0\x12\xbb\x3d\xd1\xe8\xb4\x66\xbe\x10\x02\x92\x27\x02\xb2\x69\x47\x19\x1c\xf5\x6d\xfb\x0c\xc3\xea\xb1\xbb\xc4\x2a\xa2\x70\x70\xa8\x63\xe0\xad\x58\xf9\xe6\x46\xbe\x66\xcd\x0d\xdb\x6b\x37\x78\x3b\x16\xcf\x5d\xf3\xad\xdb\x6a\x10\x31\x03\x19\x1b\xec\x24\xeb\x6a\xf4\xe6\x70\x09\x7c\xcc\xf0\xc5\xcc\xa0\x19\x45\x16\x15\xff\x6e\x1a\x5a\xd0\x29\xeb\x12\xf4\x06\x6e\x08\x25\x5b\x81\x8b\x6d\x35\xf0\xb6\xea\x53\xb0\x84\xb2\xb9\xbe\x52\x7d\xc1\x8e\x06\x4a\x78\x3c\xb4\x4e\x68\x69\x14\xc0\xcf\x47\xef\x32\x28\x5e\xdb\xce\xe9\xdb\x24\x98\xd4\xc7\x16\x75\x7d\xfb\xbb\x03\x2f\x51\x3e\x6f\x6e\x84\x16\xa0\x35\x46\xb5\x32\x98\x67\x09\xdc\xfc\xeb\x81\xf1\x5c\x13\x55\x74\xdf\xf1\x0c\x6f\x45\x67\xec\x30\x52\xdc\xed\x71\x01\xec\x60\x18\x61\xd7\x80\x0c\x07\x1f\xc6\x26\x7c\x82\x0e\x7d\x98\xd2\x35\xfb\x58\xc8\xeb\x82\x2f\x12\xf4\xee\x64\x45\x32\x9f\xd7\x50\x41\xa4\xbc\x39\x7e\x16\x03\x0c\x9c\xe7\xce\x1f\x3a\xad\x1d\x40\xe1\x7c\xce\x5d\x29\x11\xbd\x8d\x08\x9c\x88\x0d\xb8\xc9\xc5\x1b\x79\xf3\xa5\xea\x15\xfa\x38\xb2\x22\x15\xcb\x22\xab\xd6\x68\x12\xd3\x9c\xf9\x98\xf8\xd0\xb0\x77\x0a\xc3\x6b\xa8\x15\x08\xb0\xa4\x22\xb6\x7f\x00\xe6\x86\x06\xbe\x2c\x50\x16\xe9\x19\x98\x89\xcb\x24\x5f\x60\x6f\xf5\xf6\x91\xe6\x4f\x1d\xd6\x13\xf1\x42\xe8\xcb\xd0\x80\x31\x25\x33\x25\xf3\xba\x12\x16\xe1\xda\xf2\xdf\xc3\x1e\xde\x34\xd4\xa8\x6f\xac\x5a\x68\xc0\x1c\xa2\xec\x41\xd9\x28\x0b\xe1\xee\x63\xf2\xf4\x01\x57\x02\x41\xb9\xeb\x36\x17\x6b\x86\x8c\x8a\x81\x3b\xc5\xb8\xb6\xed\x9b\xb2\x62\x5e\x97\xd4\x78\xcb\x49\xe5\x19\x61\x2c\xd8\xdb\xed\x01\xf0\xa0\xff\x78\xa6\x75\xef\xa0\xef\x4e\xdb\x22\xcf\x32\xf3\x0c\xbe\x9e\x03\x04\xe3\xcb\x7d\x6f\x8e\x77\x80\x0c\xc6\xf1\x9c\x57\x12\x20\x7b\xff\x52\x97\x99\x4a\x91\x85\x03\xf7\xec\xd3\x98\x8f\x0b\xdb\x1f\x6d\x74\xc2\x65\x72\x58\xc3\x24\x4d\xab\xa4\x22\x62\x90\x53\x71\x51\x13\x1f\x16\x1b\x2f\x08\x61\x1d\x20\xce\x1d\x01\x07\xc9\x5d\xff\x42\xf2\xe2\x68\x9d\x8a\x00\x6b\xba\xc7\x94\x5c\x92\x24\xca\xfb\x0e\x36\x4f\xb1\x77\x0a\x7b\x17\x71\xa8\x64\xca\x92\x9c\x11\x21\x06\xe8\xa5\xa6\xbb\xa0\x00\x5a\x95\xec\x25\xb8\xca\x9b\x57\x66\x77\xd7\x36\x07\x2d\x11\x44\x50\xeb\x44\x46\x19\x6c\xe0\x79\x3b\x9e\x65\x60\x31\x47\xe2\x78\x70\xf2\x11\x8a\x36\x3e\x87\x08\xd1\xc6\x6e\x00\x10\xf4\x14\x23\xb9\x95\xf8\x54\x99\xd0\x9e\xc7\x98\xcf\x92\x86\x95\xa3\x7a\x27\xaa\xcb\x17\x36\x22\xa1\x88\x3a\x9e\x19\x54\x40\xea\xa3\xdc\xb2\xbb\x79\x8c\x70\xe3\x77\x75\xda\x59\xc8\xfa\xa2\x05\xd4\x30\x8a\xdb\x24\xe1\xe5\x68\x49\x8d\xd5\xc7\x2c\xcf\x0d\x92\xfd\x0c\x61\x1c\xa1\xb3\xe0\xa2\x43\xe6\x1c\xce\xf9\xb3\x18\x44\x26\xa9\x1f\x8c\x3d\xd3\x16\xe0\x59\x9b\x1d\xa6\x8f\xcb\xc9\x72\x36\x35\xa8\x72\xb2\x05\x88\xa5\x05\x61\x8e\x77\x6c\x58\xcb\x0c\xe4\x71\x2d\x65\x68\x7f\xa0\xbf\xd6\x72\xcc\x00\xd3\x38\xa1\x04\xde\xde\x2d\xa2\x2a\xeb\xce\x53\xd1\x76\x33\x2b\x05\x90\xcf\x01\xe3\x5b\x32\x40\xa5\x4f\x91\x16\x63\x49\xd7\xf4\x24\xd5\x45\x95\xe5\x6d\x69\x64\x50\xf1\xf3\x35\x60\xc2\x2d\xb2\x22\xe4\xd5\x52\x28\xc8\xd1\x81\x14\xd9\x4d\x8c\x3e\x7e\x59\x5c\x48\x6d\x04\x93\x83\x3f\x6b\xbb\xe4\xd9\x02\x41\xe9\x80\x26\x26\x5b\xac\x49\x7c\x91\xeb\xab\x78\xec\xa8\x77\x60\x27\xe9\x99\x6a\x5a\x29\x7c\x55\x66\x60\x43\xb3\xe7\x3b\x3c\x4d\xd6\x8a\x27\x0b\x7d\x29\x5b\x67\x06\xcc\xef\x2c\x99\x7f\x44\x2c\x2e\x8f\x47\x8b\xbf\x97\xa5\x90\xb0\x1a\xde\x28\x60\x56\xd9\xa6\x59\xe5\xde\xac\x76\x8c\xb4\x73\xa0\x30\xbe\x4c\xa8\x2f\x18\x61\xe4\xa0\x56\x81\x74\xbd\x54\x15\x83\x9c\x06\x3b\x44\x0b\xe0\x48\x39\x33\x72\xd1\x6c\x9b\x84\x53\x73\xef\xe8\x6e\x32\xaf\x9b\xee\x86\x6b\xee\x4b\x3b\xcd\x7c\xbf\x39\xcd\x25\xbe\x7f\x55\x31\x3b\xae\x2a\x23\x9a\xb2\xbd\xd8\x18\xda\x98\x79\x01\xe9\x95\x95\xb9\x67\x93\x8b\x44\x4f\xa4\x1f\xf2\x9c\x01\x0d\x23\x90\xf2\x5c\xf0\xa4\x93\x10\x09\xe9\x85\xb7\x1d\x05\x43\x2a\xe6\x79\x52\x26\x95\x2c\xd7\x8e\x5b\x89\x58\xc6\x22\x24\x57\x10\xe5\x63\x93\x19\x00\xb0\xb3\xa5\x54\x8a\xfe\x32\x60\xc0\xc1\x64\x19\x13\x93\x2e\xf7\x73\x1f\xa5\x8e\xe9\x98\x9f\xca\xd0\x7f\x84\x11\xc0\x17\xc6\xe8\x25\x9a\x78\xaf\x53\xbd\x26\x55\xc8\xae\x0b\xb1\xa0\xa6\x35\xa6\x2e\x13\x5f\x4a\xc1\xfc\xef\x03\x7f\x04\x68\xa2\x57\xc6\xa6\x70\x32\x30\x6c\x54\xf1\x67\x98\xeb\xf4\x2c\xde\x33\x51\x0c\xdd\xa2\x28\x52\x06\xdc\xe9\x46\xc7\xb5\x14\x51\x2a\x58\x05\x73\x89\xe8\x61\x20\x9e\xbb\x12\x39\xe1\xf4\x81\x7b\x4b\xef\x55\x36\x13\xa2\x40\xaa\x9a\x7c\xed\xc7\x43\xe0\x5c\xd0\x7e\x0a\x9a\xea\x90\x7b\xb0\x17\xe1\x46\xf5\xc6\x82\xc3\x57\x75\x79\x05\xb8\xb8\xee\x13\x94\xfe\xcf\xc1\xb2\x26\xad\x47\xcf\xc3\x4f\xa4\xf4\x30\xd6\x65\x34\x6e\xa0\x30\xa4\x33\xbf\x95\xe8\x33\xb9\xc5\xbd\xf0\xa5\xac\x2b\xe6\x63\xba\xea\x55\xfe\x98\x15\xa9\x8d\x7d\x9a\xc2\xf2\x34\x32\x81\x29\xd0\x2f\xf0\x8a\x94\xe5\xda\x73\x1d\x46\x9d\xd9\x2f\xd4\x3a\x12\x61\xf6\x25\xb8\x19\x3c\x4f\xa0\xbe\xd6\x2a\x82\x8a\xd8\x12\x49\x6e\x2b\x8c\xec\x2e\xb2\x8a\x6e\x54\x4f\xca\x59\x22\x20\x60\x9c\x7d\x4c\x5b\x3b\x2b\x2e\xf0\x96\x24\x3a\xf1\x32\x53\x1f\x99\x23\xbc\xfd\xb9\x4e\x40\xdb\x03\x30\x55\x0c\x0f\xfb\x94\x4b\x5d\x7d\x73\x99\x09\x53\x40\xbb\x64\x5d\x99\x44\xb0\x00\x82\xfa\x0f\xc4\xb8\x98\xd0\x43\xca\x1d\x48\x6c\xa4\x40\x6b\xd8\x08\x03\x96\x28\x55\x2f\x45\xe0\x90\xc2\xd4\x26\x13\x67\xc1\x70\x0d\x78\xaa\x4b\xb1\x4a\x32\x54\xf2\x80\xa6\x17\x95\x59\x04\x7f\x74\x4a\xb2\xaf\x88\x43\x59\x6a\x95\x69\x95\x06\x92\x42\xf4\x72\x16\x90\x53\x66\x22\x58\xcd\x68\xa1\xe1\xc4\xf1\x86\x19\x38\x5b\x11\xd4\x35\xfb\xb7\xee\xcd\x46\x66\xa7\xf7\x89\xeb\x17\xee\xec\x1f\xfc\x08\xac\x7e\xd1\x91\x51\xd9\x19\x3b\x87\xc7\x0a\x19\xb2\x54\xd1\x8d\x4f\x1f\x61\x3e\x4a\x75\x29\x60\x03\x9a\x24\x8d\x4a\x96\x95\x6f\x96\x17\xe2\x22\xcf\x2e\x44\x31\x17\x83\xc8\xa6\x6f\x44\x61\xfe\x06\x9d\xc1\xc6\x8a\x98\xe4\x1e\x6d\x3d\x5e\x5f\xfa\x6c\x48\x1d\xa9\x88\x89\xf2\x82\x3b\x24\x84\x66\x02\xac\x10\x54\xec\x40\xd5\xc2\x06\x99\xc9\x46\x71\x79\x29\x44\x9e\x0b\xe7\x08\x8a\xd9\xf4\x7f\x23\xe1\x0b\x05\xa5\xf4\x4a\xa5\xc9\x32\xb9\x10\x36\x3e\xa7\x2d\xe4\x64\x5e\x89\x92\xb9\xd3\xc7\xbb\x4e\x9f\x79\x4e\xbf\x3f\xd7\x5b\x6b\x55\xca\x45\xa6\x15\x9f\x5c\x22\x6f\xfe\x85\x94\xa9\x56\x16\x23\x06\x79\x47\xaa\x92\xab\x55\x72\x21\x90\xb0\xb8\xd6\x17\xa6\xd6\x78\x00\x95\xb4\xe4\xcb\x24\x5f\xd4\xc5\x1c\xdb\x26\x2b\xd1\x66\x1f\x22\xb7\x98\x47\xfb\x6c\xfa\x0c\xaf\x06\x77\x15\x40\xce\x1a\x65\x03\xc2\xb6\xb4\x00\xa0\x14\x80\xa0\x25\x20\x9f\xd4\x9c\x47\xb4\x37\x70\x73\x18\x9f\x14\xb5\x4c\xbb\x3e\x0f\xb6\x92\x67\xfd\x41\xcb\x70\xe0\x00\x98\x1e\xfc\xa0\x66\x9f\x21\xc0\x6f\x52\x5d\xea\xee\x61\xc5\x19\x38\x35\xfe\x52\x97\x6b\x32\x66\x21\x09\xce\xe8\x1c\x36\xc8\xec\x76\x55\xc3\x86\x70\xc1\x27\x60\x05\x35\x26\x05\x71\xa4\xba\x4e\xc6\x7c\xaa\xf5\x14\xdf\x16\x55\x44\x3b\xc8\x80\x48\x3b\x04\x6e\x0f\x3d\x44\xa0\x9b\xdb\x8d\xd2\xbb\x4f\xc8\x41\x97\x29\xaf\x9d\xd0\x52\x76\x51\x0d\x33\x37\x5a\xbe\xc1\xe9\xfc\x93\x3e\x9d\x46\xe3\x61\x6c\x08\x9e\x00\xab\x01\x61\xed\x17\xb0\x84\xb5\x99\xa9\x66\x82\xcf\x80\xbe\xab\xb2\x94\x51\x28\xd4\xea\xb2\x42\xde\x95\x60\xdc\x1e\x7c\xbc\x16\x9b\x50\x39\xc3\x97\x49\x46\xf9\x9a\x7a\xf2\x56\xa5\x1e\xee\x4a\x0b\x2b\xa0\x21\x96\x0b\x3e\xab\x55\x56\x08\xa5\x40\xbf\xa7\xc9\xb5\xdd\xc3\x45\x9f\x89\x20\x20\x94\x27\xd7\xca\xf2\x0a\xf9\x1d\x70\x97\x20\xa4\xdb\x99\x55\xcd\x30\x7d\x76\x91\x67\xf3\xea\xb1\x5c\x3c\xa6\xf5\x44\x43\x44\x81\x17\x11\xe0\x96\x9b\x59\x21\xf0\x72\xb6\x2a\x51\x73\x49\xec\x9e\xf1\x1c\x0c\x33\xc8\xad\xf4\xb5\x39\x5c\x44\x5f\xe3\xc3\x65\x78\x11\xf3\xf7\x99\x9a\x8b\x3c\x47\xb2\xc8\x46\x78\x34\x08\xfc\x0a\x47\x2f\xee\xd8\x30\x89\x32\xca\x12\xd7\x10\x8f\xe9\x32\xa9\xb4\xe0\xa0\x04\x79\x6e\x88\x0d\xcd\xf0\x5a\x4a\x9a\xa1\x36\x44\x6b\x35\x60\x35\x44\x9b\x98\xb9\x67\xed\xec\x03\xdb\xed\xd2\x30\x87\x85\xae\xc5\x20\x7d\xc0\x78\xc5\xbc\x56\x63\xdc\x72\xc9\x75\xc3\x91\x81\x2a\x19\xa9\x39\x9e\x36\x91\x27\xc5\x45\x9d\x5c\x58\xc2\x52\xca\xd3\xc3\xc5\x98\x09\xbc\xfe\xca\x5a\x4b\x67\xd2\xde\x61\xc3\x95\x68\x0e\x38\x29\x81\xc8\xf8\x86\x17\x1d\x1e\x09\x1d\x22\x56\xf9\x6f\x14\x57\x70\xce\x77\x77\x62\xa3\x78\xab\x46\xc6\xad\x4d\xb7\xde\xd1\xd6\xfb\xb1\xb8\xb6\x5f\x64\xcc\x94\xcf\x78\xcc\x65\x99\x0a\xa2\x3c\xaa\x12\xd7\x49\x99\x5a\xbf\x45\xe2\x29\x7a\x5e\xec\x6d\x77\x27\xde\x8f\x58\x41\x0e\x4f\x97\x67\xd7\xd1\x94\xe5\x52\xb4\x49\xea\x8e\x1e\xd9\x50\xa6\x15\xe2\x9a\x85\x29\xad\x81\x0b\xc5\x27\x20\xb3\x54\x4c\x1b\x59\xc8\x18\xb1\x90\x79\x93\x61\xf3\xc9\xf4\x0b\xc2\x69\xe9\x88\xb2\xdd\x35\x3c\xa0\x7f\x71\x49\x1c\xcc\x5b\x07\xfa\xb6\x8b\x5b\x9b\xbc\x07\xc7\x1d\xdc\x1d\x91\x89\x6c\xaa\x47\x48\x0a\x81\x2e\xdb\x56\xea\x48\x8b\x09\xa2\xb9\x94\xde\x1c\xec\xc7\x14\x6b\x17\xa9\x37\x7c\x43\x26\x8b\xf1\x32\x9b\x7a\x04\xb9\x3d\x41\x98\xbb\x19\xd9\xf6\x91\xb0\xf1\x69\x86\xe4\x2a\x7e\xcc\x10\x24\xa6\x05\xce\x77\x50\xdd\x2e\x3a\xa7\xb5\x3f\x0b\x96\x9a\x3a\x22\xb6\xa6\x60\x58\x10\xa1\x33\x60\xfd\xfb\x23\x45\x5b\x0a\x82\x2a\xa8\x01\x93\x6c\x35\x3a\x38\x33\xec\x00\x5d\xdb\xd3\xe4\x1b\xa1\x8b\x85\xb2\xca\xa0\xd3\xb6\x47\xe6\x11\x8c\x96\x2a\x46\xa9\x72\xae\x6f\x03\xa4\x59\x7b\xea\xc7\x26\x8b\x8b\x9e\xfa\x80\x4c\xf1\xbb\x04\xdb\x60\x5d\x20\xdf\xc1\x86\x2d\xbc\xfd\xf9\x25\x4d\x9b\x28\x95\xea\x0d\x17\x07\xe9\x48\x22\xa0\x2a\x6e\x55\x1b\x31\xaf\xf6\xea\x75\x4b\x8a\x1b\x5f\xa5\x29\x58\x8a\x5d\x9d\x16\x7f\xdc\xea\xbd\xe5\x6b\xc4\x78\x19\x5d\x3d\xad\x31\x66\xaa\xc1\x8e\x1d\x9e\xc3\xee\xe2\xc0\x88\x5d\xc5\x7c\x2f\x46\x12\xbc\x90\xbf\xe3\xfd\xc9\x11\xd4\x3a\x85\x6c\xc5\xa9\xe7\x0b\x5a\x64\xfa\xd6\xf9\x40\x54\x2e\x94\xbc\xa1\x65\x5e\x52\x19\x94\xd2\x25\xbe\x35\x96\xe5\xc5\x93\xf7\x27\x47\x4f\xf6\xe2\x9d\x27\xb1\xe7\xb4\x07\x14\x7c\xe3\xb6\x07\x2d\x50\x65\xa5\xd1\xd5\x57\x75\xd5\x28\x67\x0b\x0c\x4e\x78\x3d\x73\x1e\x75\x17\xab\x68\x3d\x95\x1b\x80\x85\x6d\xd8\xbb\x10\x24\x21\x9a\x37\x5b\xaf\x92\xb0\x52\xe4\x02\x30\x48\xd0\x1c\x90\xe5\x7a\x40\x4a\x91\xef\x3a\xb6\x85\x1e\x79\xf6\x51\x90\x26\x2b\xe5\x47\x77\x9c\x13\xe7\xc1\xb2\x81\xbe\x34\xf5\x13\xe6\x30\x58\x57\xb9\x70\x9f\x5c\x78\xec\x06\x36\xd7\x3c\x66\xcc\xed\xa1\xc7\x77\xad\x98\xbb\x75\x97\xdc\xad\x1d\xe0\x20\x87\x34\x7f\x91\x9a\x32\x95\x9e\x3d\xc4\x69\x0f\x3d\x20\xf5\xff\xb6\x3f\xf1\x93\xd7\xc9\xe5\x7a\x75\xf9\x1d\xcb\xbf\x6f\xa9\xff\xde\xd9\x7b\xb6\xff\xb4\x89\xff\xbf\xf3\xf4\xe9\x43\xfd\xf7\xaf\xf1\xe3\x98\x02\x8f\x27\x67\xe3\x83\x11\xa4\xcf\x2b\xc0\xa7\xab\x44\xe9\xc5\x00\x91\x18\xb3\xc2\x6a\x17\x8e\x31\x34\x88\x4c\x78\xdc\x41\xf3\x01\x7f\xfb\xfe\x47\xbe\xfb\xe2\xc5\x6e\xab\x9d\x6b\x01\x80\x17\xc0\x18\x47\xc1\x35\xa0\x64\xd1\xb2\x4d\x3f\x54\x1b\x9e\xfc\x92\x92\xd8\x08\x90\x24\x2b\x40\x69\x73\x3c\x58\x10\x87\x24\xa5\xb5\x10\x8b\xac\xa2\x0a\xee\x98\x0f\x73\x25\x23\xae\x56\xa5\x48\x88\x27\x39\xe8\x01\xd1\x5f\x6b\x63\x11\xd2\x30\x56\x49\x91\xa9\xcb\xc7\xd6\xfa\x38\x13\xff\x62\x80\xcc\xaa\x35\x07\xd3\x1b\x90\x7d\xc1\xa0\x20\x9d\x1d\xa2\x3a\x8f\xe9\xc5\x5a\x1b\x62\xba\xef\x60\x46\x22\x45\x97\xbe\xd5\x2e\x45\xbe\xe2\x1f\x85\x58\xe9\x4e\xd8\xcf\x05\x18\xc6\xaa\x2a\x45\x82\x45\xd4\xf8\x7e\x3d\xf0\x52\x5b\x8c\x36\x4c\x67\x42\x2f\xa8\x90\xeb\x89\x02\xd7\xaa\x9e\x1c\xc3\xc6\xe9\x93\x7d\xc5\xbc\xdb\xe3\xc6\x74\x57\xfe\x5c\xe7\x99\xe4\xd3\xa4\x98\x5f\x8a\x7f\x8b\x74\x67\x22\xfe\x67\xa9\x1e\x09\x3e\x8c\xf9\xfb\xe4\xff\x2c\x12\x65\xdd\x40\x17\x86\x05\xbb\xf4\x72\x96\xaf\x90\xe6\x59\x9b\x9a\xda\x14\x03\x43\xb2\x34\xf9\xad\x14\x36\x87\x58\x4a\x59\xca\x52\x59\x83\xda\xd3\x79\x5d\x3a\x82\xf1\x27\x01\x6f\xab\x48\x51\xeb\xd3\xd3\x08\xf9\xbc\xe8\x5a\x2a\xb0\x22\xdc\x0b\xbb\x83\x47\x0e\x6c\x1e\x70\x2f\x51\x54\xeb\x6e\xee\xa5\xb1\x47\x4b\xaf\xb2\xaa\xa6\x18\x50\x99\x81\x33\x0b\x95\xdf\x70\x2c\xe8\x9d\x8d\xd9\xb9\x4f\xa0\xef\x7b\x4e\x3d\xda\xee\x64\xae\xf5\x5c\xcf\xf7\xac\xfc\xac\x61\xba\xca\xf5\x2a\x60\xd5\x9a\xdf\x92\x99\x12\x72\x80\xc7\x46\x23\x02\xc5\x49\x80\x1f\x00\x1e\x70\x44\xe3\xa4\x1f\x18\xe2\x61\x62\x31\x0c\x5a\x25\x5b\x00\x13\x37\x51\xa9\x01\x6f\x9e\x5e\x56\xdd\xe9\x24\x2b\xa0\xc4\xf5\x52\x82\xcf\x15\x3d\x4a\xd7\x97\x6b\x7c\xbb\xee\xd6\xc7\xac\x48\xc1\x9a\xfa\xb9\x16\x8a\x76\xbe\x12\x54\xb1\x81\xaf\x44\x13\x40\x7c\xfa\xef\x17\xcb\xab\x58\xa8\x98\x35\x3b\x14\x8a\x0a\x90\x13\x9d\x1d\x4b\x41\x83\xca\xc8\x34\x00\xfa\x7b\x58\x75\xa4\x3a\xd3\x63\xcf\x45\x52\xe6\x6b\x9e\x27\x33\x91\x6b\xe3\x5f\x99\x96\x4d\x39\x8b\xb5\x27\xf0\x35\x31\x3f\x14\x6a\x95\xa1\xb1\xc9\xf2\x64\xfe\x31\x4c\xd5\xba\x16\xa4\x88\x21\x71\x9a\xe4\x97\x22\x29\xf5\xfe\xaa\x2b\xe3\x42\x99\xe5\x62\x09\x9d\x5d\x64\x45\x1a\xf3\x93\x5c\x24\x4a\xb0\x52\xac\x64\x59\x71\x4b\xe7\x1d\xce\x00\x27\x6a\xcd\x96\x28\xfd\xad\x65\xfb\x5d\x7e\xe2\x27\xc3\x37\x47\x8f\xf7\xe2\xdd\xdf\x0c\xff\x65\x6f\x77\xff\xd9\x0f\x2d\xfc\x97\xfd\x07\xfe\x9f\x5f\xe5\xe7\xec\x52\xf0\xe1\x3c\x49\xc5\x32\x9b\x23\x6b\xa2\xf5\x7a\x5d\xc5\x7b\xf1\x2e\x7a\xe8\x3b\xbf\xc1\xb7\xf5\x61\xb7\x60\x0b\x03\x9f\x60\x1e\x4e\xb2\x29\x4b\x81\xd4\x5a\x4b\x25\x08\x15\xb1\xf8\xe8\xc4\x7c\x03\xf0\x23\xb4\xe1\x04\xc1\x40\x6d\xcb\x04\x8d\xcb\x72\x6b\x00\x37\x00\x66\x17\xb1\xaa\x83\x96\x95\x67\xcb\xa5\x48\xb3\x04\xf2\xf2\x42\xb2\xfa\x66\x7a\xa7\x8d\x78\x9b\xf7\x33\xfd\xfe\x97\xcc\x18\xcd\x7e\x89\x4f\xf7\xc8\x1d\x44\xd5\x2e\x63\xbb\x03\xaa\x3f\x84\xa4\x44\xf3\x2a\xeb\x6c\x33\x43\xb8\x5f\xad\x2e\x0b\x6a\x75\xa1\x0e\x76\x25\xaa\x3a\xc9\x23\x2f\xed\x1c\x63\x15\xd4\x27\x20\x4f\x6b\x01\x3e\xa0\xa7\x2a\x19\x60\x1a\x28\xd5\xdd\x06\x83\xa7\x54\xe9\x02\x89\x77\xd4\x2b\xc6\x66\x03\xd4\x78\xc4\x0a\x92\xd5\x2c\xcb\x3a\x2c\xa4\xe2\xdb\x5b\x87\xee\x4f\xfa\x61\xb5\x35\x00\x74\xc4\x94\xd7\x2b\xaa\xf2\x0c\x66\xf6\x15\x63\xf3\x41\xc3\xdd\x82\x2f\x33\x97\x78\xd8\x17\x7d\x2d\x35\x5f\x11\x52\x04\xbf\x32\x03\x4b\x07\x44\x45\xb7\xa0\x52\x89\x46\x53\xf8\xf5\x7c\x4d\x15\x00\xf8\x90\x30\x9d\x59\xe5\xc9\x7a\xc3\x43\x31\x63\x7b\xde\xda\x9e\xf8\xc0\x0e\xbf\xde\xc2\x46\xb4\x1b\x7d\xd0\x0a\x05\x87\x24\x65\x18\x3e\x72\xe5\xf9\x9e\x93\xc9\x60\x4c\xe8\x25\x14\xcb\x99\x4c\x33\x47\x2a\xdb\x98\x6e\xc5\x17\x75\x59\x80\xcb\x93\x35\xda\x88\x3a\x2a\x98\x89\x56\x9f\x8a\x98\x01\x62\xa2\x7b\x11\x59\x73\x11\x63\xc6\xf6\xbd\x09\xf5\x1d\x0d\x76\x56\xcf\xc8\x09\x15\xc0\x2d\xf8\x48\x0b\x16\x58\x81\xf9\x98\x0b\xe1\xcb\xfb\x20\x17\x30\x36\x64\x23\x9e\xb6\x4e\x86\x19\x74\x18\x03\x0d\x08\x2e\x39\xfd\x38\x51\xba\x92\x87\xbd\xf5\xa6\xd6\x2e\x60\x10\xbe\x51\xbe\xc9\x90\xf0\x65\x32\xbf\xcc\x0a\xf1\x58\x1b\x26\xb0\xb4\xbe\xcf\xcc\x9f\x85\xc6\x60\x18\xce\xa4\x65\xbe\x25\xc8\x24\xef\xe1\x70\xd8\xb0\xe0\xb6\x43\x5e\xd0\x3b\x66\xf6\xaf\x5a\xb3\x2f\x49\xab\x77\x11\x04\x95\x54\x99\x5a\x90\x4b\xda\x4b\x4b\x9e\xad\x41\xe6\x62\x66\x54\x73\x18\xac\x6f\x18\x86\x7f\xd6\x21\x54\x6a\x0d\x4a\x65\x90\x2e\x65\x73\xcd\xd6\x7c\x9e\xe4\xf3\x3a\xd7\xfa\x1c\x73\x84\x92\x59\xa1\xed\xae\x42\x9f\x0e\x4c\x9c\x92\xc5\x95\x28\x32\x4c\xb0\x9a\x0b\xa5\x4c\xea\xce\x02\x53\x97\x61\x76\x12\x65\xc7\xcd\x0c\x2a\x9f\x6a\x88\x9c\xd6\x7c\xa1\xcf\x5d\x0f\x11\x3d\xfe\xe6\xbe\x48\xd2\xb4\x14\x10\x5c\xc7\x4a\x95\x9e\x81\x80\x97\xf0\xee\x97\x0f\x69\xf0\x74\x2a\xdd\x55\xd9\xde\x53\x8c\x3d\x1d\xf0\x91\x89\xfb\x2a\xfe\x46\xdb\x49\x01\x58\x44\xcc\x8f\x3d\x64\x15\x60\x44\xc5\x2c\x0c\x73\x6a\x0b\xe9\x7d\xc4\x4c\xd2\x81\x9f\xf5\xd5\xf5\x66\x7c\xce\xd9\x5e\x99\x87\xee\x00\x96\x21\x55\x1d\x33\xaa\x3a\xa6\x88\xb1\x09\xba\x89\x22\x95\x25\x66\xf3\xac\x4a\xb9\x94\x95\x30\x18\xba\xd6\xe6\xe3\xce\xd3\x1f\x6e\x72\x4b\x58\x8d\xe9\x4a\x94\xfb\x67\xc8\x56\x61\x6b\xa8\xb6\x27\x5d\x96\x7e\x2c\x97\x75\xe4\xa6\xcd\xf4\x05\x26\x96\xd8\xc1\x56\x61\xb5\x9e\x04\xaf\xa8\xda\xae\x95\x8a\x18\x8a\x5b\x15\xe1\x17\xb8\x12\xf3\x52\x54\xd6\x58\xc6\x08\x5d\x37\x5a\x86\xb7\x10\x94\x4a\xc3\x12\x65\x06\x96\x63\x76\xb2\x48\x41\x5e\x64\x05\x64\xeb\xf4\x57\xed\xb7\xa5\xaf\x96\xf9\x28\x7c\xc1\x36\xcb\x73\x92\xee\xb6\x5c\xaa\x09\x70\xa4\x7a\xc2\x89\x29\xa3\x8f\xc9\x61\x1b\xe2\x3e\xe8\x6e\x11\x71\x6e\xd0\x9b\xb0\x0e\xdd\x1f\x2b\x0b\x72\x43\xf0\x63\x2c\x69\xa4\xdc\xef\xae\xcb\xa7\x1d\x8a\x37\xea\xa7\x5d\x3e\xf0\x12\xad\x4a\xe1\x1c\x31\xe8\xde\xb6\x73\x0c\x5b\xca\x61\x2a\x74\xd6\xe1\xb5\x23\x4c\x30\x4f\x9b\xc4\xa7\xc3\xdf\xb8\xf6\xd8\xf5\x71\x52\x18\xa4\xa2\x78\x95\x74\xcf\x06\xa8\x28\x2b\x9a\x40\x28\x7a\x36\xb5\x5b\x5c\x62\x72\x51\xcc\xd8\xf3\x41\xc0\x79\x70\x0a\x9b\xcd\x2b\xa6\x2d\x45\x95\x64\x45\xd4\x55\x76\x4a\x4b\xeb\xee\x54\x46\x8a\x51\x58\xdd\x1b\x85\xbc\xc7\x51\x17\x52\x8b\x8d\x21\x18\x88\x0a\xb6\xe1\x12\x32\xa2\x52\xf1\x6b\xb8\xfc\x31\xef\xd4\x8b\x42\xb8\xa9\xd7\x77\x3e\x38\x7a\x4c\x8e\x3d\x64\x45\x7e\xaa\x2c\xc8\x37\x06\x68\xf5\xbe\xc7\x76\xf8\x96\x3f\x1b\x18\x85\x88\xb7\xec\x74\x30\x0b\xf8\x13\xcc\x84\x71\x9e\xb4\x75\xc4\x46\xa1\x33\x40\x06\x95\xe5\x9a\x27\x4c\x0b\xa4\xac\xd0\x13\xd1\x7e\x63\xf7\x95\x84\x45\x36\x5d\xb5\xcd\xcc\x66\x41\x5b\x07\x44\x97\x10\xff\x61\x60\x13\x3e\x41\x7d\x2c\xe5\x95\x28\xc0\x5b\x04\x0a\x6e\x67\x66\xa8\xa7\x4f\x90\xdf\x82\x5e\x19\xda\x31\x59\x61\x4a\xad\xba\xb5\x67\xd0\x93\x70\xdd\x1b\xf9\xc0\x38\xfb\x5a\xcd\xb3\x2f\x02\xf0\xc9\xeb\xa2\x43\x81\xa4\x0f\x9d\x5e\x6a\xf3\x89\xad\x81\xc4\x3a\x4b\x4f\x5c\x65\x4a\x5b\x72\x7b\xb7\x10\xe0\x14\x18\xbc\x2d\x27\x7c\x19\xd2\xe4\x7b\xdd\xf7\xb3\x27\x5a\x82\x94\xce\x8a\x7f\x05\x03\x52\x9b\x80\x24\x42\x80\x08\x07\xe6\xb6\x0e\xa3\xe7\x4e\x49\xb7\xc3\x29\x1f\x4f\xb7\xf8\xeb\xe1\x74\x3c\x65\xbe\x17\xd6\x78\x60\x9b\xb9\xb6\x90\xb0\x6d\x72\x6d\x37\xe7\xf7\xc1\xba\x7a\x19\xb6\x72\xc1\x8f\x27\xc7\x8f\xc7\xc7\x6f\x4e\xc7\xc7\x6f\x47\xef\x47\xc7\x67\x11\x7f\x3f\x3a\x3d\x78\x37\x3c\x3e\x43\x9e\xab\x0f\xba\xf9\x37\xe3\xb3\xe3\xd1\x74\xca\xdf\x4c\x4e\xf9\x90\x9f\x0c\x4f\xcf\xc6\x07\xe7\x47\xc3\x53\x76\x72\x7e\x7a\x32\x99\x8e\x62\x7e\xf6\x6e\xc4\x47\xc7\x67\xe3\xd3\x11\x3f\x1d\x4f\xff\x99\x0f\xa7\xfc\x6c\x02\x7f\xfd\x1f\xe7\x43\x68\x66\xf2\x06\x7e\x9d\x9c\x8e\xdf\x8e\x8f\x87\x47\xfc\xa7\xc9\xe9\x3f\xf3\xf1\x14\x86\xc7\x3f\x4c\xce\x63\x0c\x07\x1e\x8e\xa7\x07\x47\xc3\xf1\xfb\xd1\xa9\x7e\xc2\x8c\xf9\x9e\x39\xa9\xec\x58\xfa\x86\x6a\x6b\x19\xfc\xed\x89\x2b\x71\x4b\x12\xea\x9f\x06\x7d\x19\xa8\x7d\xfe\xf0\x0d\x19\xa8\x16\xbe\x51\x6f\xa5\x30\x09\x95\xdf\x23\x09\x55\x1f\x07\x7b\x76\x82\x0c\x52\xb8\x93\x21\x47\xd1\x39\xc3\xef\x94\x48\xca\xee\x9c\x48\x0a\x5e\xed\x0c\x55\x61\x1f\x52\x25\xb8\x54\x49\x2b\xac\x55\xb7\x94\xbf\x65\xb3\xfa\xc9\xa8\xac\x95\x7e\xca\xbf\x3c\xfd\x94\x75\xa5\x9f\xf2\x56\xfa\xe9\x5d\xd2\x45\x59\x77\xba\x28\xbf\x4f\xba\xa8\x59\xc3\x47\x8a\xb5\x92\x45\xf9\x37\x48\x16\x65\x98\x2c\xca\x7f\xfb\x64\xd1\x17\x03\x3e\x74\x41\x0c\xfd\x8c\x57\xae\x16\x77\x00\x56\x6c\x70\xdb\x30\x48\xee\x6f\xdc\xc9\x11\x0f\xcb\x67\x13\xbf\xd4\x48\x2c\x16\xfa\xb0\x39\x67\x5b\x18\xbf\xaa\xa4\x41\x92\xc0\x29\x42\xd9\x9a\x80\xa0\xd1\x3d\xf0\x6f\xe5\x56\xf2\x4a\x03\x3d\x4b\xab\x98\x4c\xe4\x4a\x00\xbe\x66\x88\x0c\x04\xfb\x10\x77\x9f\xb1\x37\x5c\x0e\xe6\x4c\x54\xd7\x42\x14\xde\x6d\x89\xd5\x4a\x03\xe6\xb9\x7b\xbc\x4b\xce\x26\x6e\xb5\xb5\x93\x1e\x17\x99\x9d\x3c\x6d\x41\x21\xa2\x63\x10\xff\x6a\x5c\xe0\x7e\xce\x20\xdd\xe6\x91\x05\xd5\x22\xc4\x08\x86\xbe\x40\x25\x9b\x52\xb4\x67\x8a\x36\xcf\x01\xeb\x9d\x03\x0a\x92\xd2\x75\x1c\xd6\x60\x9e\xc7\xd3\xd8\xd3\x58\xf2\xe4\x3a\xc2\x64\x6b\x8b\xcf\x63\xb3\x7a\xcd\xc9\xaf\xb5\x62\x60\xa0\x15\x66\x6b\x13\x1f\xa6\x04\x98\x4a\x4f\xeb\x1a\x1c\x44\x90\x9c\x8a\x48\xa8\x1e\x06\x66\xff\x9c\x91\xd2\xd2\x39\x75\x1f\x88\x1e\x68\x9e\x54\x82\x21\x42\x59\x23\xac\x17\xd8\x0c\x16\xa8\xd7\x16\x58\x1a\x27\x85\x0b\xfb\xed\xee\x0c\xfc\x73\x04\xb2\x87\x9c\x87\x43\xbf\xda\xa3\xa7\x8a\x2a\xac\xf5\x64\x16\x90\x05\x8e\x30\xb8\x3b\xe0\x7a\xbc\x75\xa7\xb8\xd2\xaf\x30\x09\xd6\x1e\x5f\x80\xe2\x43\x00\xa0\xe5\x12\x69\x65\x0a\x2a\x62\x0b\x00\x85\xfc\x6c\x67\x2f\xd9\x19\x7e\x8f\x6c\x52\x6d\xa0\x35\x3a\x78\x02\xc1\xc3\x5a\xb7\xae\x4b\x87\x0a\xda\x98\x29\xbe\xa3\xf9\xf1\x4b\xad\x9a\x29\xca\x4e\x98\xe1\x85\x4a\xfd\xb6\x2f\x63\x1d\x65\x7c\x88\x02\x6a\xd1\x40\x7a\xbc\xcf\x0e\x34\xce\x06\x56\x19\x00\xe1\x95\xa9\xc1\x1b\xde\x1d\xf0\x3f\x07\x49\xe8\x3f\x8a\xa2\xc6\xdd\x81\x04\x7b\x7a\xb4\x47\xc9\x75\xcc\x87\xfa\x50\x5a\xa0\x52\x55\x67\x95\x9f\x7f\xcf\xee\x97\x7f\xcf\x7b\xf2\xef\xf1\x4b\x81\x8b\x0f\x12\xac\x21\xc5\x82\xf2\x65\xed\x87\x7a\xa7\x82\x47\x86\x92\xf3\x97\x49\xb9\xb6\x19\xf9\x91\x53\x92\x18\x66\x66\xf7\xe4\xdd\x73\x57\x84\x77\x5b\xae\xfd\xd9\xa5\x60\x49\x88\x28\xa1\x9b\x3e\x2f\x40\x52\x1c\xd3\x52\x1c\x80\x97\xcf\x00\x45\x1e\x90\x9e\xe5\x8a\x13\xc7\xbe\x2c\x60\xd3\x24\x87\xc3\xf9\x56\xca\x54\x85\x52\x08\x3b\x26\x52\x9c\xfb\x5e\x4d\x47\xd6\x95\x9e\x24\x18\xa5\x9a\xcb\x55\xfb\xac\xeb\x6d\x05\x09\xe6\xe6\xa4\x87\x55\x7f\x33\xd1\x48\x9d\x0c\x11\xf3\xb0\x38\xad\x48\xf2\xca\xbb\x2f\x41\x26\xba\x10\xd1\x50\x6b\x7d\xbb\x3f\xc0\x9f\x0f\x62\xfe\xcb\x7f\xf0\xdd\x9d\x5d\xa0\xe9\x14\x3f\xc7\x68\x1a\xdc\x55\x5a\xf6\x89\x4a\xe7\x92\x60\x8d\x62\xc5\xcb\xa0\x60\xb1\xad\xb0\xb3\xdd\x3d\xf0\x55\xc8\xb2\x10\x6b\xc5\xdf\x08\xc8\xa7\xc0\x8a\x38\xda\xd1\xe0\xf2\x83\xac\xff\x0d\x57\x8b\x2c\x99\x12\x02\x5c\xf1\x46\xa1\x73\x27\x40\xef\xde\x4a\x46\xc6\xaf\x7f\x95\x64\x39\xb0\x00\x78\x85\x45\x33\xa2\x62\xcf\x41\xa2\xb1\x52\xcc\xf5\x09\xa3\x5d\xa7\x68\xa6\xd1\x63\x2c\xd4\x6d\xe6\x96\xa7\x7d\xb0\xc4\x8c\xed\x11\x5f\x08\x61\xc4\xb8\x02\xcc\x2f\x02\xcb\x80\xa0\x58\x51\xd0\x9d\x01\x82\x01\xb3\x35\x9b\x32\x12\xbc\x1e\xc9\x6a\x25\x92\xdc\xe2\xee\x24\xbe\xa8\x57\x7e\x81\xc9\x6d\x8b\xe0\xa3\xf6\xef\x0f\xc2\x22\x92\xc6\xd5\x71\x9f\x22\x12\xd6\x2e\x22\xe1\x5f\x56\x44\xc2\x3a\x8a\x48\x5a\x12\xfa\xae\x45\x24\xac\xaf\x88\x84\xed\x3e\x1d\x78\xac\x23\xba\x4b\x06\xb7\x3a\x98\x04\x03\xa0\xed\xf2\xbb\x1a\x99\xf5\x64\xdd\xb1\xac\xe0\xf5\x6a\x85\xb8\x6f\xb9\xbc\xd6\xa7\x28\xd1\x9f\x7f\x15\xda\x36\x55\x77\x03\x02\x43\x66\xe2\x34\x1e\xf8\x87\x39\x15\xd1\xed\xb0\xdc\xec\xae\xb0\xdc\xfc\x2e\xb0\xdc\x2c\x80\xe5\x5e\xf7\xc1\x72\xf3\x8d\xb0\xdc\x88\xb4\xca\xee\x08\xcb\xcd\xef\x08\xcb\xcd\x6e\x85\xe5\xb6\x38\xaf\x01\x88\x76\x07\x1a\x37\x33\xe0\x40\xbd\xa8\xdc\xa6\xad\x6c\x70\x47\x70\xee\xdd\x67\x03\x74\xcc\xea\xb1\x9d\xfb\x20\x82\x66\x98\xad\xd0\xb9\x5e\xef\xeb\x64\x8d\xb9\xe9\x76\x14\xcc\x80\x0b\xea\x13\x50\x3a\x1d\xb1\x5d\xfd\xa1\x3f\xc6\x32\x37\xdc\x4e\xf6\xb6\x06\xb7\xa5\x12\x0a\xcc\x5a\x70\x48\x56\xa2\x5c\x08\x4b\xa0\x51\xe2\x31\x0b\x73\xd8\x60\x38\xb5\x5e\x63\x8c\x94\x19\xa0\x59\x2f\xbe\xe0\x25\x6d\x1e\x0c\xf8\xde\xce\xce\xfe\xe3\xbd\x9d\x9d\xa7\x5a\x69\xc1\x22\xba\x51\xcc\x4f\xa5\x12\x45\xcc\x87\xb9\x45\x3b\xa6\xd8\x61\x1a\x33\x76\xe2\x4c\x1e\x10\x0d\x2e\x02\x6e\x0a\xb0\x56\xeb\x26\x52\x5c\xe5\x77\xc2\x48\x67\x3f\x3e\x1b\x87\xfd\x34\x46\xeb\xcc\x73\xb4\x9a\xc7\x7c\x93\xb0\x33\x4a\xc4\xf0\x86\x08\x12\xe4\x1f\xb2\xcd\x5b\x3f\xf1\x93\xf7\xb2\x92\x4a\x56\xf2\xfb\x25\x80\x6d\xce\xff\x7a\xfa\xc3\xee\x0f\xcf\x9a\xf9\xdf\x4f\x9f\x3f\x7f\xc8\xff\xfa\x35\x7e\xde\x4f\xce\x26\xd3\xc9\xd9\x84\x4f\x4e\x46\xc7\x7c\x3a\x39\x3f\x3d\x18\xd9\x32\x97\xc7\x16\x8b\x64\x27\x7e\x11\xef\x92\x18\x31\x1b\x06\xf9\xbc\x29\x30\x73\x87\x9c\xb0\xad\x03\x9b\x5c\x7d\x22\xcb\x4a\xab\xf1\x5a\x9a\x94\x5b\x54\x6e\x86\x51\x17\xe5\xa1\x31\xa0\xa1\xd2\x88\x3c\xd5\x2b\x6d\xb7\x2a\xb8\x60\x20\xcc\xa6\x2d\x75\xa8\xc3\x49\xec\xb5\x96\x54\xae\x9d\xed\x2d\xdb\xe1\x13\x6a\x72\x6b\xe0\x72\x63\xfc\x32\xa5\xd9\xda\x0e\x2e\x3e\x90\x4b\xf6\x3a\xfe\x31\xe6\xdb\x5e\x12\x1a\x1a\x15\xcd\xf6\x6c\x44\x55\x5f\xae\xaa\xa6\xfa\xbd\xc0\xe8\x06\x24\xca\x2d\x9b\x5f\x46\x0f\xc6\x5b\xbc\xf9\xa7\x08\x93\x62\x15\x61\x5f\x54\xeb\x88\xa2\x14\x15\xa6\xa2\xcf\xd6\xec\xb0\xae\x28\x0b\xc4\xba\x56\x1a\x5a\xa1\x0d\xb7\x29\x4f\x05\xf1\xab\x27\xa9\x66\x90\x41\x54\x59\xb7\x14\xf9\x72\xda\x50\xfa\xac\x5b\xbd\x43\xf8\x5d\x93\x8a\xad\xea\x19\xa1\x26\x80\x29\x2b\xcc\x86\xa0\x89\x1f\x23\xfc\x8e\x56\x74\xb7\x27\xd3\x31\x61\xcd\xaf\xb4\x9e\x98\xe4\x31\x3f\x29\x45\xb2\xd4\x8a\x38\xee\x2a\xf3\x2b\xc0\xb2\x79\x90\xd1\xa6\x3c\x0e\x26\x06\x72\x98\xf9\xa8\xb8\xc8\x33\x75\x49\x55\x74\x49\x55\x97\x68\x7b\x83\x1d\xd7\xac\x72\xf4\xf0\xaf\xaa\xe6\x7b\xc0\x89\x10\x06\x2c\x72\x2f\x0f\x89\x91\x7e\x66\x8b\x5c\x9b\x1a\x71\x0a\x6c\x91\xa0\xe0\x68\x05\xd7\xba\xf6\x82\x22\x3a\xeb\x77\x21\xb4\xc1\xa0\x17\x8d\x85\x43\xec\x23\xa1\x5c\xfc\xcc\x3f\x63\x4e\x17\x66\xc1\x3a\xe0\x9c\xe2\xfe\xf5\xbf\xef\x16\x20\xf6\xb0\xe7\xbc\xfd\x6e\x0c\xfd\xb6\x13\x62\x99\x94\x1f\x31\xe5\x7a\x6b\x32\x1d\xf3\x03\x51\x52\xf8\xd6\x6f\xdf\x22\x2f\x6e\x35\x4a\xdb\x83\x12\xef\x97\x8c\xed\x06\x2a\x14\x65\x91\xc9\x12\x2a\x1c\x78\x72\x9d\xf8\x61\x47\xff\x28\x00\x04\x22\x37\x08\x85\x7a\x72\x64\x21\x8a\x0a\xf3\x59\x78\x72\x71\x51\x8a\x8b\xa0\xc2\x36\x40\x01\x26\xf0\x4d\x30\x28\x4b\x79\x51\x26\x4b\x0a\x78\x2b\xbd\x1d\x00\x92\x90\x72\x04\x98\x82\x01\x29\xcc\x7a\xc0\x6c\x3d\x87\x28\xbe\x10\xb0\xd8\x06\x50\x33\x66\x6c\x2f\xe6\xaf\x65\x15\x42\x1a\xa3\x19\x6a\x91\x7c\xaf\xba\x6b\xc9\x83\x73\x6e\x8c\xc7\x90\x33\x0f\x8a\x5f\x66\x6b\xb0\x87\x33\x59\x07\xd4\x04\xda\xda\x2f\x7d\x7c\x67\x7d\xa4\xd6\xb2\x06\x48\xf4\x98\x6f\x9f\xd9\x80\x6c\x4b\xd6\x44\x5b\x0d\xa6\x30\xfd\x07\xbf\x69\x14\xc3\x41\xd6\x1d\xc3\xfc\x4f\x9b\x1e\xe2\x0d\x24\x1e\x30\xb6\xef\x0a\x07\x20\x94\xe1\xf2\x55\x1a\x34\x80\x64\xf9\x75\x2c\x30\xd6\x3c\x43\xa9\x4a\x9f\xdb\x9c\xaa\x44\x70\x74\x94\x1a\xd8\x4a\x40\xe5\x99\x2b\x3c\x6c\x77\xf4\x69\xcc\x5f\xaf\xc9\xaf\x6b\xf2\xb2\x5a\xa2\xcd\xf9\xc8\x9d\xf7\xaa\x79\xe8\x23\xa6\x25\x27\x61\x70\x1a\xd4\xcf\x70\xac\x28\x5a\x3f\x8a\xbe\x41\x9b\xf8\x7c\xe1\x23\xfa\xea\x29\x6c\x02\xa0\xf7\xf7\x02\xfc\x30\xae\xa8\x15\x3b\xe5\x62\x2c\x1d\x89\x23\xb0\x45\xc2\x7e\xba\x3d\x54\x49\x53\x41\xc5\xd8\xb3\xb6\xb1\xd3\x1a\x40\xa3\x76\x25\xa2\x90\x8a\x97\x37\x40\x08\xc8\x28\x06\xf4\x84\xc3\xac\x15\x6b\x87\x68\x74\x7d\x99\x54\x4a\xa2\x58\x2e\xf0\x89\xa0\x05\xb7\x56\x01\x8e\xa9\x59\x5b\xc4\xe7\xb0\xfe\xe4\x56\x17\x53\x29\x54\xf1\xa8\x32\x4c\x5c\x72\x25\x4a\xc4\x51\x03\x53\x15\x16\x09\x5c\x36\x14\xff\x93\xa5\x2d\x19\x62\xec\xb9\xad\xb1\xf1\xf0\xbd\x3b\xdf\x22\xcb\xd6\x6e\xf5\xca\xf1\x01\x03\x97\x81\x6b\x69\xe1\xd2\x39\xd6\xe8\x07\x5e\x19\x0e\x36\x9c\x4d\x3b\xda\x1e\xa0\x55\x0f\x14\x97\x55\x12\x97\x73\x5e\xab\x4a\x2e\xa1\xf0\xcd\x2b\x1e\x22\xe8\x5d\xe3\x36\xf5\xf6\x41\xcc\xd8\x0f\x76\x68\x08\x78\xd7\x91\x2b\xe6\x23\x6c\x78\x0e\x65\x1f\x32\xc6\xcd\x04\xb3\x07\x59\x2f\x21\xb6\x3c\x2b\x21\x49\x55\xb7\xdc\x75\x0d\x46\xd8\x79\x2f\xff\xae\xa3\xbd\xae\x64\x8c\x10\x00\xd3\x87\x9c\x0b\x37\xac\xf7\x48\x98\xfe\xb9\x36\xf0\xbf\xed\x35\x33\x5e\x72\x06\xb5\x67\x9b\x0f\x1f\x96\x1e\xda\x38\x2a\xb4\xda\x92\x59\x7f\xa9\x15\x24\xfd\x41\xad\x62\x2a\xcd\x38\x6d\x45\x44\x4b\x11\x64\x6c\x98\x93\x07\xf7\x4a\xe4\x6b\xb7\x8d\x9a\x03\x68\xbd\x8a\x88\x33\x6c\x4e\xe2\x64\x3a\x7e\x6c\x14\x02\xe6\xdf\xd6\x36\x9d\xdc\xf2\x9e\x24\x70\x34\xca\x4c\x54\x49\xe9\xe0\xa4\x8d\xb8\x40\xd4\x76\xb3\x63\x58\x4d\xb1\x26\xfb\x35\x3f\xa9\xd0\xf7\xb6\x5d\x1a\x75\xcb\x4a\x25\x93\x90\xab\xa7\x61\x51\xe7\x8b\x2c\xcf\x41\x5d\xdc\x08\xf4\xee\xa5\x60\x34\x16\xc4\xdf\x8d\x2e\x73\x97\x35\xb6\xfb\x80\xce\x80\xd4\xfa\x08\xb1\xca\xda\xb1\x75\x67\x8e\xcd\x65\xa1\x32\x65\x31\x25\x37\x5c\xd9\x58\x66\x91\xe5\x42\xf9\x5a\xc6\xfb\x06\xbb\xdf\xb1\xb8\xe6\x7d\x20\x2c\x46\xd1\x72\x60\x23\x98\x8b\x97\x2d\xf1\xe6\xc8\x96\x9e\xdf\x09\x01\x2b\x18\xe2\xda\xd8\xa9\x34\x02\xda\xca\x28\x38\x6e\x26\x8f\xb2\x1b\x79\x82\x9b\x39\x61\x96\x9d\xaa\x70\xbd\xf4\x74\x65\xf4\xd8\xfa\x42\xa0\x85\x3a\xe3\x2a\xfe\x2c\xda\x04\x05\x44\x69\xe3\xdb\x43\xd2\x35\x9b\x2d\x47\x36\xe8\xbd\xb2\x60\xab\x52\x40\x60\xd3\xf9\x25\x51\x80\xce\x45\x89\xc9\x00\x88\x6a\x7b\x06\x2b\x4b\x2f\xf4\xd4\x94\x6b\x02\xc2\x5c\x03\x18\x2d\x12\x8b\xd5\x00\x7f\x68\x12\xe3\xfc\x86\x11\x5a\x75\x25\xc0\xf4\xb4\xca\x94\x4d\x39\x37\x58\x10\x6f\x73\x89\xbe\x6a\xba\x70\x44\x91\x36\x26\x36\xb6\xd5\x43\x06\x24\x1d\x59\xb3\x6d\xb1\x83\xf9\xf4\x8d\x9f\x61\x62\x9f\x6a\x55\x91\xac\xef\x43\xe5\x67\xcf\x36\x0b\x42\x52\x96\x5a\xab\x27\x51\xd9\xc0\x93\x76\x57\x0e\x25\x31\x3f\x6f\xb2\xf5\xf5\xb1\xf3\xf9\x57\x65\xc3\xe9\xd7\x92\xed\xb2\x74\xe7\x91\x2a\x8b\xfd\xc3\xde\xd0\x52\x14\x05\xea\x31\x14\x47\x8b\x3c\x88\xb4\x22\x30\x6b\xaa\xe0\x64\x28\x14\xbe\x1e\x4e\x9a\x7f\x7c\xd7\x72\x92\x4d\x95\x23\xb7\x09\x85\x24\xcf\xf5\x43\x75\x2e\x14\x73\xc8\xff\x95\xc9\x34\x58\xe5\x35\x7a\x30\x12\xa5\xe4\x3c\xa3\xdc\xc5\x4a\x94\x8b\x64\xee\xef\x4a\x43\x78\x8c\x39\xb4\x8a\x79\x98\x56\xe0\xcf\xd7\x76\x50\x46\x90\x5a\x18\xfb\x53\x55\x92\xe7\x36\x84\xd4\x39\x01\x40\x11\x96\xf0\x3c\x33\x74\x29\x64\xfa\x64\x09\x36\x98\x94\x99\x82\x09\xf7\xee\xff\x8e\xa4\xe0\xe6\x6a\xc6\x8c\xcd\x62\x7e\xd0\xa3\xba\x6f\x27\x06\xe5\x4b\x20\x8c\x88\x39\xa4\x78\xff\x34\x1c\x19\x2c\x4f\xae\x07\xde\x51\x71\x8a\xd6\x0c\xd0\x50\x48\xe4\x43\x22\x57\x2e\x5c\xba\x56\x15\xb2\x3d\x94\x5c\x55\x65\x3d\xaf\xea\x12\x7c\x01\x2a\xc9\xd2\xae\xfb\x76\x6e\xf2\x04\xe7\x96\xbd\x91\x52\xfe\x79\x21\x01\xb9\x4c\xaf\x1b\x6e\x3b\xcc\x8e\x6d\x15\x5b\xd9\x72\x0b\xb6\x91\xe6\x91\xb7\x68\x1e\x93\x22\x7d\x12\x64\x98\xeb\x03\x05\xa5\x8f\x0b\xd6\xa5\x65\x36\xcf\x0b\xaa\xdc\x4a\xe6\xa2\x15\x56\x0b\xb8\x08\x08\xb7\x58\xab\xe3\x3e\x64\x9b\xc0\xf4\xab\x35\xa2\xdd\xdf\xa9\xe3\xec\xd6\x8e\x77\xaa\xc7\xad\x83\x2e\xcb\x56\x51\x18\x0f\xa8\xde\xf7\x3a\x44\x66\x25\x1b\x52\xe1\x0d\x12\x11\xfa\x10\x6e\xfd\x2c\xd8\x06\x43\x47\x05\x9b\x07\x6e\x95\xae\xdd\xc3\xec\xee\xe1\x20\x98\x06\x3c\x41\xb8\x1f\xef\xa2\x6f\x0b\x01\x13\xae\xf2\x09\xad\x59\x9b\xbc\xda\xb8\x9a\xda\x97\xe1\x3b\x4f\xca\x65\x4d\x95\xca\xe4\x59\xb7\xad\xfa\x2d\x0a\xb6\x9a\xb2\x7a\xfd\xdf\xd6\x71\xd0\x30\xc2\x75\x6f\xb4\x26\x47\x58\x69\x86\xdd\x3b\xa4\xbb\x00\x43\xb9\x9d\xad\xe1\xa9\x5f\x2e\x8b\x8a\x3d\xdd\x4e\x06\x7c\x26\x72\x79\x1d\x61\x69\x1a\xe5\xb8\xca\xd2\xc4\x2d\xaf\x2f\x4d\x3e\x9c\x3b\x3f\xe4\x7c\xa2\x7d\x6b\x38\xeb\x98\x24\x46\x0e\xcf\x41\x15\xf1\x24\x18\x04\xdf\x4e\x02\x9f\xc5\xd6\xa0\xeb\xd6\x64\xf7\xbd\x35\xf9\x1d\x6e\x4d\xf6\xeb\xde\x9a\x49\xb1\x6e\xb8\x85\xcc\x2c\x76\x11\x78\x74\x8a\x88\xf0\x86\x64\xb7\xdd\x90\xbd\x64\xb9\x84\x30\xef\x78\x71\xb5\x54\xed\xa8\xec\x9c\x7d\xbd\x40\xf5\x11\x7c\xbf\xa5\x4c\x0d\x67\xf2\x8f\x22\x50\x6f\xed\x75\xe8\x80\x60\x1d\xd2\x74\x3f\xbe\xa5\x8e\x90\xb1\x9e\xfa\xab\x2f\x28\x9f\x63\x5e\xf9\x1c\xff\x26\xe5\x73\x8c\xbe\x1e\xd2\x43\xf4\x16\x82\x6c\xaa\xa8\x63\x26\x36\xad\x04\xf0\xf6\x0b\x27\xfd\xdb\xd2\x1c\xcc\x0d\x4b\x88\xab\x97\x95\x30\x59\x80\xa7\xa1\xfb\x19\x72\xe5\x74\xe5\x17\xb6\x6e\xc6\x2e\x5e\x5a\x3f\xc5\xf0\xfe\xc5\x77\xa0\xdd\x35\x67\xea\x6e\xf5\x78\xed\xbb\xc8\xe4\x4b\xf7\x6e\x89\x2f\x2a\xc9\x63\x8d\x92\x3c\xde\x5d\x92\xe7\xe6\x7d\x63\x25\x1e\x4b\x9c\x21\x1a\x54\xe2\x3d\x8d\x11\xd0\x7f\xe2\xf1\x48\x9d\x8a\x8b\xa4\x04\xfd\xd1\x67\xba\x8b\x41\x5a\x37\xc8\xae\xce\x1a\x0e\xa4\x0f\x2d\xcf\x69\xcc\x87\x06\x06\x08\xb2\x0f\x6c\x5a\x07\xf3\x9d\xf1\xfd\x7e\xff\x75\x8b\xcc\xa9\xd3\x91\xcc\xec\xde\xeb\x60\xed\x5c\x37\x58\x3b\x11\xc8\xc7\x7c\x12\x50\xa5\x97\x82\xdd\x89\x5a\xf3\xb6\xcc\x39\x47\x39\x4d\x31\xd0\x2e\xdd\xe2\xf6\xbe\x1a\xbf\x87\x77\xcb\x33\x0c\x9e\xdd\x92\xa2\x0e\x09\x59\x8b\x1a\x14\xb3\x3e\x92\x5f\x0a\x02\xa7\x2c\x64\xae\xf8\x21\x60\x2b\x25\x45\xa9\x93\x2f\x94\xaa\xec\x81\x50\x8b\x3e\x87\xe3\xde\x76\xf1\xbb\xfe\x53\x10\x04\x96\x92\xb2\x74\x50\xe0\x63\x15\x98\xa4\x7d\x4d\x5c\xc1\x98\x40\xd9\xb0\x5a\xdb\x71\xa3\x5e\xd1\x21\xcb\xae\x6d\xd2\x4d\x67\xea\xd5\xa8\xf4\xcd\x98\x6c\x71\x49\x1a\xe2\x53\x5b\x89\xe5\x39\x85\xd6\x0d\xc8\xcc\xa4\xf0\x11\x2a\x0d\x86\x02\x0e\xdf\xb8\xe4\xda\x9c\xe9\x9d\xdc\xa3\x4f\xb7\x01\xf3\x75\x16\xf3\x21\x06\x26\xc8\xf1\x1d\xa0\x44\xc4\xcd\x6a\x12\x13\xc3\x88\x3a\xb6\x0f\x6b\xe9\xd0\x9b\x0c\xda\x20\x3c\xb3\xe1\x30\xfa\x67\xcb\x29\x4c\x60\x44\x24\x4b\xc1\xa1\x04\x51\x5f\x4e\xe1\x77\x31\x95\xcf\x71\xa6\xba\xd8\xa2\x07\x61\xd1\x79\xa7\x5c\xe9\xe6\xf8\x52\xcc\x2f\x93\x22\x53\x4b\x42\xc0\xca\x73\x13\xce\x72\xf1\x2e\x17\x04\x45\x90\x3d\xca\xfe\x34\x29\x17\x26\x22\x20\xf4\x85\x5b\xca\x22\x9b\xeb\xab\xa4\x50\x0b\x2c\x40\x4d\x93\x2a\x61\xdb\x49\xc1\xb7\x46\xee\x0b\x01\x2f\xe8\x7b\xd3\x87\xad\x01\xa2\x74\x74\x95\xe4\x7a\x50\xc3\xb7\x6e\x5d\xde\x31\xa9\xa6\x0a\x7a\x09\x04\xb2\x16\x9e\x03\x9a\xaf\xb8\x3e\xdd\x15\xaf\xae\x45\x7e\x25\xf8\xf6\xee\xde\x80\x2f\x65\x51\x5d\x1a\x62\x20\x5b\xd3\x00\x28\x12\x59\x95\xc1\x3c\xcd\xc4\x5c\xaf\x8c\xdb\x2b\xcc\x6f\x4c\x65\x9f\xf8\xf6\xf3\x46\x43\x7d\x8c\xe2\x9d\xbe\x04\xd6\x1a\x97\x0d\xcc\x87\x64\xbc\x2e\x5a\xda\x4c\xd8\x13\x85\xaa\xe9\xc0\x74\x30\x27\x9b\x0e\xe0\xac\xf8\x91\x3b\x73\xc3\xeb\x27\x7a\x96\x8d\xd9\x65\xd3\xba\x84\x81\xe6\x37\x00\x6a\x9e\xb5\x83\x2e\x91\x43\x8f\x1d\xad\xa9\x82\x7a\xa7\x0f\x33\x3e\xdb\xc1\x4f\x6b\x63\x7e\xd5\x9d\x45\xbe\x2e\xd8\x02\x0c\x6c\x6f\x23\x5a\x3c\x84\x0e\xb4\xe9\x23\x8b\x4a\x17\x58\xf6\x28\xa8\x52\xe1\x95\x63\x11\x30\x88\x49\x45\x94\x14\x1a\x08\x43\xe2\xce\x47\x0c\x44\x63\xd2\x83\x0f\x6c\xbf\x92\xf9\xaf\xec\xbc\x62\x5c\xd1\x39\x68\xa8\xcb\x20\x68\x19\x0a\x18\x8b\xb4\xa4\xad\xde\x6e\xe6\xa7\xa8\x5f\x65\x25\x3f\x20\x92\x2e\x56\x3e\x24\x48\x18\x55\x25\xd9\xe6\x6b\x89\x7d\x61\xea\xac\xe0\xdb\xd9\xa0\x19\x55\x41\xba\xb5\x2c\x1b\x18\x72\x1c\x03\x62\x8d\xb6\xad\xd9\x57\x3d\xb7\x98\xf5\x01\x37\x0e\x3d\x16\xaa\x98\x0c\xb0\x10\x8b\xc7\x56\xb0\xa0\x1a\xee\x98\x0a\x19\x46\xd3\x20\x4f\xc3\x4f\xe6\xed\xd6\x69\x7d\xba\x58\x07\x97\x8f\x6a\x3d\xc3\xd4\x77\x21\x3e\x21\xf4\x7d\x0b\x30\x4c\xf5\xea\xca\x16\x87\x2a\x86\x0a\x15\x6b\xcd\x9c\x18\x6b\xe6\x3d\xe4\xd9\x6b\xfb\x38\x83\x88\x47\x99\xf2\x13\x70\x2e\x1c\x20\x53\x84\x09\xc8\x82\x25\xfb\xb1\x90\xd7\xb9\x48\x2f\x8c\x4e\xe8\x97\x4c\x07\x87\xf5\x91\x62\xdd\xc6\x93\xb5\x1a\x7c\xfa\x57\x5b\x2b\xd6\x51\x24\x36\x5b\x37\xee\xc9\x16\x52\xa3\xcf\xe3\x68\xd3\x92\xfc\x2d\xe1\x27\xdd\x30\xaa\xd4\xd8\x3a\x1a\xbd\x1d\x1e\x6d\xe1\x38\xcc\xaa\x51\x8d\x02\x98\xd0\x0e\xa5\x40\x77\x9b\x3c\xee\xee\xe3\xac\x60\x8e\x94\x91\x23\x25\xa3\x99\x14\x0f\x56\x3b\xcb\x73\x98\x34\x7e\x7d\xa9\x4f\x06\xc9\x0d\xbd\xde\x34\xad\x04\x30\x0e\x27\xd8\xcd\x2e\x4a\x79\x9b\xa9\xd1\x96\x63\x4e\xc4\x36\xb8\xd2\x99\xd3\x57\x66\x03\x9c\x2c\xb4\x8a\xf4\x51\x5f\xe9\x23\xeb\x21\x45\xc1\x1c\x38\xac\x70\x84\xe5\xc8\x84\xcb\x11\x61\x5e\x12\x86\x73\x8e\x40\x2a\x1b\x96\x04\xea\xde\x51\x29\x5a\x25\x56\xca\x41\x91\x23\x77\x21\x04\x1d\x56\x18\xc4\x4d\x2a\xc1\x96\x54\x3f\x93\x67\x0a\x6d\xed\x42\x5c\xab\x8b\x52\xd6\x2b\x35\xb8\x15\xe4\x02\xe5\xe1\xf5\xa5\xb4\x64\x0a\x9d\x96\x2e\x0a\x21\x70\x75\xe8\xe5\x28\xc4\xb5\x37\xb1\xf6\xe6\xc3\x79\x87\x64\xa9\x2c\x8b\x03\x81\x33\x3c\x19\xdb\x6d\xdf\xbc\x39\x7d\xc5\xd2\xb3\xcb\xc8\x45\xb5\x44\xa3\xd4\x44\x4c\xb6\xb7\x86\x27\xe3\xad\x81\x25\x4e\x68\x1c\x21\xeb\x7f\x32\xa7\x48\xb9\xa4\x4f\x37\x17\x2c\x70\xe4\x64\xcb\x55\xee\x89\xe9\xe1\xc9\xd8\x3b\x10\x40\x56\xee\xd0\xe2\x21\x4f\xd1\x01\x43\x11\x4e\xb1\x5b\x73\x18\x7a\x16\xf3\x53\x0f\x4d\xd7\x5e\x14\xb6\x6e\x07\x5e\x14\x79\x5e\x0d\x40\x39\x90\x8d\x64\x52\xf6\x74\x3b\x1d\x80\x2f\x1a\xe9\xa9\x20\xd1\x42\xe4\x99\xb8\xda\x98\x87\xd4\xc8\x30\xd2\x13\xce\x6c\x0e\x82\x71\xbc\x1a\x88\x67\xd2\xc5\x60\x16\xbd\xb3\xe7\x5c\x3d\xe8\xfe\x71\x32\x84\x41\x98\x74\xdd\xae\x66\x88\x19\x13\x7a\xdc\x24\x81\x88\xb2\xdb\xbb\x21\xd3\x1a\xd7\x56\x34\x2d\x50\x44\x46\xf0\xe5\x3f\xe4\x36\x59\x24\x35\x87\x84\xd6\xa1\xce\x77\xcf\x81\xbb\xfe\xbf\x40\x13\x81\xf2\xca\x2b\x92\x15\xf6\xf2\xe9\xb0\x96\xfc\x9c\x84\x9e\xcb\xa7\x39\x70\xcb\x36\x60\x43\x85\x3e\x01\xc4\x90\x32\xa9\x71\xf2\xb6\xe0\xbe\x05\x17\x3b\x88\x93\x6e\xe8\x38\x74\x9f\xac\xd6\xa0\x81\xf9\xd7\x6b\xdf\xa5\x18\xf0\x94\xa4\x0d\x67\xbb\x35\xf7\x58\x92\xa6\x78\x58\x81\xf5\x03\x72\x31\x3b\x34\x88\x63\x07\x50\xdc\xc1\xd3\x80\xd4\x0c\xcc\x7d\xb1\x45\xcd\x10\x98\x13\xa0\xf4\xd5\x96\xcb\xc9\xc6\x64\xc0\x8e\x2b\x60\x80\xc1\x25\x05\x72\xf1\xf8\x16\xf6\x86\x36\x57\x03\xbc\x68\xc0\x0c\x61\x03\x50\x4e\xde\x9d\xab\x81\xb7\x78\xd0\x99\xc7\x83\x7e\x3f\x12\xf4\x8d\xf9\x5e\xfd\x24\xe8\x1d\x81\xa4\xa6\xb1\xee\x48\xd0\x99\x2c\x5c\x16\xd4\x46\x12\xf4\xaa\x89\x02\x74\x2b\x29\xfa\x7d\x99\xd0\x83\xf1\xb2\x5e\x22\xf4\x75\x48\x84\xde\xf6\x9d\x79\x44\xe8\x3c\x28\x82\x86\x7c\xdc\x7b\x32\xa3\xfb\xc3\x66\x66\xb9\x7b\x98\xd2\xf9\x7d\x98\xd2\x29\x29\x77\x6d\x99\xd2\x19\x5b\xc4\xa1\x79\x2d\x17\x7c\xe4\xdc\x40\x86\x4b\xc8\xed\xb1\x8e\x94\x0a\x6b\x81\xf6\xc5\x74\x6c\x9e\x57\x77\x6e\x17\x2e\x17\x6c\x60\x32\xb7\xd0\x49\xe5\x1c\xb5\x6d\x17\xad\xc5\x4b\xd2\xb7\x91\xbb\x2f\x00\x3e\xd2\x00\x61\xf9\x79\x5d\x4c\x2e\x1c\xd9\x2b\xc4\x0b\xa9\x4c\x13\x3c\x3e\xe4\x95\x48\xaa\x40\x89\x8c\xd0\xc2\x58\x03\x32\x83\x73\xd7\x15\x6a\x95\xcd\x6b\x59\x2b\xe6\x68\x5a\x30\x50\xd3\xf4\x9e\x45\x3d\xb6\x04\x56\x6a\xe6\xfa\xa3\x32\xc9\xf9\x52\xff\x7f\x96\xe4\x8a\x69\xf3\x2c\x40\x28\xe8\xb2\xbf\xfb\x3c\x46\x99\xa7\x2f\xb2\x5b\xdc\x98\x21\xae\x42\x1a\x5a\xdb\x97\xf2\x9a\xee\x22\x51\x0a\x66\x27\x97\x52\xe6\x68\x72\x3d\xd1\xc0\xdd\xdc\x92\x3e\x8a\x65\x8e\x88\x6b\x8f\xf6\x73\x9e\x73\x63\xd6\xb0\x3b\x9b\x35\xc4\xaa\x9d\x5d\x0d\x9c\x92\x1c\x9c\x71\xe6\xd2\x3b\x69\xf5\x30\xc4\xd5\xf6\xe8\x43\x18\xbd\xeb\x38\x43\x61\xdf\x7a\x53\xa8\x07\xf7\xfe\xc6\xe3\xce\x37\x1f\x77\xb6\xf9\xb8\xfb\x12\xee\x96\xa3\xee\x0d\xd8\x3f\xc4\x17\xed\x43\xdc\x8a\x8c\xba\x5b\xa2\x2f\x4b\x46\xc4\x17\x71\xc4\x9a\x91\x23\x20\xe6\xd6\x1d\x71\xb5\xc4\x1b\x02\x49\x10\x37\x19\x34\xc2\xc8\x70\xdd\xb6\xde\x87\x0c\x74\x58\x5b\xd5\xcc\x1e\x35\x82\x02\x0c\x1b\x70\x15\x62\x34\x80\xb9\x24\x00\xe9\x4e\xc9\xc6\x04\x4e\xa0\x39\xb0\x5b\xd7\x26\x63\x32\x3f\x19\xb3\xb3\x7f\x7e\x2e\xe6\x26\x3f\x78\x3b\x46\x4e\x78\x02\x96\x7b\x7f\x5c\x78\xc4\x8d\x07\x48\x92\x7f\x88\x5a\xc5\x14\xf8\x8f\x61\x82\x4f\x2d\x43\xa1\xcf\x32\x05\xae\x7b\xe7\xa2\xa3\xd8\x6e\x07\xd3\x7e\xef\x59\x07\x36\x65\xc3\x1e\x0c\x68\x9d\x77\x58\x51\x52\x7a\x90\x9e\x59\x44\xfc\x2f\x75\x0a\x05\xcb\x4c\x96\x50\x6c\x1e\x30\x2a\x3a\x6d\x08\x2f\x63\x2d\x93\xfd\x1e\xf6\x77\x8d\x74\xb6\x65\xf2\x29\x5b\xd6\x4b\x13\xeb\x36\x23\x26\x01\x3c\x27\x2a\x05\xd3\x9b\x06\x9d\x23\xac\x93\x05\xbe\x02\x79\x85\x29\x25\xe9\x25\xb8\xff\x1b\xae\x25\x23\x54\x74\xcb\xbe\x1f\xc7\x8b\x32\x59\xb6\x19\x46\x51\x40\xb1\xe6\x09\x54\x5f\xc5\x7c\x0a\xc4\x1e\x9e\xc0\x34\x84\x68\xad\x78\xa6\xb3\xba\x03\x6a\x35\x27\x29\xd3\x01\xf6\xa5\xd5\x82\xad\xdd\xf7\x6f\x23\x15\x6a\xdb\x0c\x03\x11\x23\xcb\x71\xe7\xe5\x0a\x84\x08\x48\x9d\xb3\x46\x60\x09\xde\x40\x98\xe9\x86\x33\xba\xf2\x35\xb9\x3c\xe8\xe0\xf8\x3e\x0f\x08\xfb\xa7\x59\x01\xac\xd2\x1f\x21\x17\xbd\xb2\x58\x6b\xcc\xb3\x94\x11\xaa\x81\x9b\x12\x0f\x38\xe9\x50\x1a\xcf\xb3\xca\xf2\x93\x6f\x88\x7e\xc6\x8d\xa2\x2e\xaf\x92\x13\x57\x47\x36\xa1\x65\x64\x19\x48\xd0\x4b\x2d\x42\x89\xad\xae\xa1\xf8\x5b\x2b\x27\xa2\x36\xc0\x98\x9e\xcb\x72\x25\x4b\x2f\x94\x6f\x0d\x4b\x4b\x40\x68\xe9\xa7\x7d\xae\xce\x46\xaf\x13\xfb\x29\xc6\x29\x36\xd6\xab\x66\x2d\x68\x62\xc1\xff\x9c\xcc\x66\xa2\x84\xaf\xb3\xf0\xeb\x58\x0d\x6f\x5c\xce\xe8\x49\xb0\x7e\x94\x06\x24\x9c\xf1\x70\x19\x4b\x84\x01\x61\x5b\x5d\x52\xce\xa4\x4f\x98\xe9\xa1\x7e\xea\x8b\xc2\x90\x78\xb6\x32\xc2\x79\x29\xae\x32\x2d\x2d\x28\x6d\xa4\xcd\xf2\xe9\xe7\x23\xcf\xfb\xf8\x39\x63\x3e\x29\xe6\x1d\xb2\xc7\x7a\x6f\x5c\x52\x3a\x46\xee\x03\x3b\xad\x8f\xd2\xd0\xd8\x1b\x49\x0e\x48\x08\xcd\x4c\xf5\xac\xea\xa2\xe0\x04\x19\x62\xb3\xcf\x2d\xf5\x5d\xae\xa4\xc7\xd2\xa8\x1f\x87\x53\xd3\x52\x7c\x3b\xb4\xad\x1e\x52\xcf\x46\x1a\x7c\xc0\xf1\xe9\xb2\xb1\x8f\x5b\xfc\xab\x47\xd9\x9c\xf7\xe4\xbf\x7b\x9e\x3e\x4a\x43\x77\x1b\xa0\x92\xed\x44\x4e\x63\x66\xb7\x8b\x5b\x62\xc6\xd2\xb8\x7d\x11\xb6\xcb\xbe\x16\x8d\x20\xfb\xdd\x88\x3e\xa3\xb0\xea\x57\x5b\x84\x06\x5c\x0a\x6e\x15\xb3\x79\xd7\x7a\x91\xe0\x9e\xa2\x48\x22\xa8\x7a\xa6\x4e\x36\x2f\x45\x92\xae\x79\xd2\x5f\x39\xd7\xe9\x46\x26\x76\x51\xf0\x3d\x59\xa6\x50\x69\xf9\xb2\xa8\xf5\xb9\x2c\x16\xb5\xca\x8a\x8b\x7c\xcd\x55\xb6\xcc\xf4\x46\x6b\xd4\x50\x7b\x32\x1b\x7c\xa7\xa1\xd1\x09\x66\x8d\x69\xdf\xe6\x5c\xde\x41\x45\xd5\x5a\x02\x53\x92\x17\xc9\x92\x2a\xd5\x4a\x97\x18\xb8\xf6\xa2\x06\x26\xe2\xe5\x50\x94\xc3\xfc\x9b\xb6\x91\x4c\x5c\xdc\x3d\x48\xbf\x8c\x51\x99\xfd\x21\x3f\x39\x9d\x1c\x9e\x1f\x9c\xf1\xf1\x54\xff\xe7\x8f\xe3\xc3\xd1\x21\x3f\x3f\x3e\x1c\x9d\xf2\xb3\x77\xe3\xa9\x2d\xc7\x9f\x1c\xf3\xe1\x71\x88\x47\x1b\x19\x30\x5a\x66\x81\x59\x27\x6f\x80\x1e\xec\x9f\xc7\xc7\x87\x11\x1f\x8d\xcf\xde\x8d\x4e\xf9\xe8\x5f\x4e\x4e\x47\xd3\x29\x9f\x9c\xf2\xf1\xfb\x93\xa3\xf1\xe8\x30\xe2\xe3\xe3\x83\xa3\xf3\xc3\xf1\xf1\x5b\xdb\x06\x3f\x1a\xbf\x1f\x9f\x0d\xcf\xc6\x93\xe3\xc8\xb4\x37\x1e\x4d\xf9\xd9\xbb\xe1\x19\x40\xc5\x76\x75\xf8\xcd\xe9\x68\xa4\xdf\x79\x38\x7a\x33\x3a\x38\x9b\xfa\x68\xb5\x47\xa3\x88\xbf\x19\x9f\xb1\x26\x48\x2d\x27\x90\x5a\xdd\x1d\x0f\xed\x76\x7c\xfc\xf6\x0e\xb0\xb5\x6c\x78\x7c\xc8\x4f\x46\xa7\x6f\x26\xa7\xef\x87\xc7\x07\x23\x03\x63\xdb\xd5\x37\x8b\x64\xcb\xa7\xef\x26\xe7\x47\x87\xad\x2f\x31\x3d\xdd\x23\xea\xfb\xf8\xc7\x11\x1f\x1f\xc3\xe4\x9d\x8e\xa6\x27\xa3\x83\xb3\x48\x3f\xcc\xb7\xf5\x1b\x8f\x27\xfe\x14\x4c\x4e\x75\xdf\xf5\x37\x27\x30\xbf\x07\x93\xe3\xb3\xd3\xf1\xeb\xf3\xb3\xc9\xe9\x80\x0d\xa7\xd3\xf3\xf7\x23\xf8\xf6\xc1\x64\x7a\x66\x16\xe4\x78\x74\x30\x9a\x4e\x87\xa7\x1f\xf8\x74\x74\xfa\xe3\xf8\x00\x66\xfe\x74\x74\x32\x1c\x43\x63\x07\x93\xd3\x53\xdd\x89\xc9\x71\x8c\xab\xee\x70\x77\x99\x8f\xbb\x7b\x30\x39\x9e\x9e\x8d\xcf\xce\xcf\x46\x53\xbd\x1b\x46\xd3\xa9\x9e\xae\xe1\x11\xcc\x2f\x4e\x86\xdb\x32\x31\x3f\x9e\xf0\xf3\x29\x4c\x92\x19\x3b\xf3\x26\x68\x78\x7e\xf6\x6e\x72\x3a\xfe\x9f\xa3\x43\xfe\x6e\x74\x3a\xc2\x3d\x37\xfa\x97\x83\xd1\xc9\x99\xbf\x01\x5d\x57\x2c\xb3\xb9\x8f\x13\x8a\x79\x54\xa6\x3e\x2f\x80\x3e\x3c\x5f\xc9\x82\xbf\x86\x92\x40\x8b\xde\xea\x12\x5e\xdb\xf1\x28\xe6\x00\x80\x21\xb8\xd3\x03\x8a\x68\x8a\x0d\x17\x10\x16\x92\xdd\x4a\x2f\x33\x48\xe3\x45\xea\xbe\x58\x97\x74\x97\x50\x9d\xa2\x7e\x04\xf3\xdc\xca\x6a\xcd\xb7\xf7\x77\x06\x3c\xd5\xd7\x97\x5c\xf0\x99\x98\x4b\x90\x09\x09\x62\x00\xe2\x0d\x32\xa3\xc1\x0c\x01\xc7\x6b\xe6\x62\x0b\x3d\x71\x54\x1b\x73\xb0\x65\xa8\x66\xa8\x21\x16\x98\x31\x30\x9b\x80\x6c\x16\x90\xe0\xc4\xa5\x60\x63\xcc\x00\x1d\x56\x59\x49\x10\x08\x11\xf3\x73\x27\xb2\xc2\xe0\x16\xcc\xc4\x5a\xd2\x5c\x6f\x00\x7c\x8b\x42\x68\x32\xd4\x51\x5a\x2b\x39\x84\xb2\x51\x7a\x9c\x20\x2d\xc7\x1e\xc2\xa2\xbd\xa2\x30\xfd\xa2\x12\x1e\xb3\x3f\x9b\xad\xa9\xec\x14\x9d\x1f\x5d\x00\x8d\x18\xfc\xdb\x76\xe0\x82\xa9\x98\xe7\x49\x99\x80\xaf\xf6\x2f\x75\x7a\xb1\x44\x1a\x10\xd0\xcb\x07\xdd\xd0\x93\x81\x0e\xba\xdd\xa7\x9c\x9a\x47\x21\x70\xb8\x96\x35\xe6\x19\xa0\x7f\xd7\x82\x49\x1a\xcd\x93\xe2\xa8\x0e\xb9\x7e\xeb\x14\x32\x38\x52\x51\x54\x5b\x83\x06\xc0\x65\x2b\xd8\xdd\x1d\xcd\x77\xb0\x97\x5e\x15\x2e\x19\x74\x04\x8b\x0c\xa6\x08\xc5\x5a\x5c\xbc\x16\x3b\xe9\x3a\x40\x55\xa8\x3c\xc8\x79\x53\x7c\x57\xbf\x6e\xaf\x65\x95\x23\x48\xb2\x3b\x56\xab\x52\x82\x7d\x0a\x65\xa7\x88\x60\xa1\xb2\x4f\xfa\x28\x3c\x37\x47\xc1\x90\x66\xe9\x9b\xd3\x7b\xad\x1f\x9f\x60\x27\xa2\xcc\x64\xba\x35\xe0\x75\x91\x03\x24\x93\x39\x56\x49\x65\xd4\x7e\xfc\x0a\x74\x95\x12\xa7\xd0\xa7\x93\x15\x00\xe0\xa4\xe7\x0f\x12\x0e\x24\x5f\x25\x6b\xff\x45\x09\x5f\xd6\x55\x8d\x39\x4f\xfa\x09\x50\xb0\xbc\x68\xa6\x01\x6c\xb0\xe9\x97\xab\x44\x55\x5c\x96\x8c\xb2\x05\xeb\x9e\xfa\x14\x03\xb4\xd0\x98\x4f\x57\xcc\xa1\x07\x91\x96\xc9\xb5\x51\x5e\xcc\x4e\xa6\x6d\xda\x34\xef\xdb\x49\x19\xb4\xc7\x1a\x2f\x00\xca\x44\x9a\x20\xc8\x28\x0a\x27\x28\x80\x48\x36\x63\x43\x44\xfc\x35\x6e\x7f\xad\x40\xe0\x81\x61\x86\x56\x3e\x9c\x21\x42\x19\xf6\x66\xd6\x60\x0a\x68\x35\x1e\x93\x65\xd0\xf2\x0e\x87\x64\x74\x3d\x33\x70\x74\x30\xb4\x53\x06\xdc\x81\xeb\xdb\x7b\x49\x91\xb2\xbd\xbe\x9a\x6d\x9e\x58\xfc\xae\xac\xb4\xd2\xa8\x3d\x15\x68\xc3\x9c\xba\xd9\xf8\x31\xc9\x6b\xd1\xb2\xf8\x9a\x35\xed\xfd\x92\xc5\x0a\x0c\x7f\x77\x75\x1e\x5e\x7e\xd7\xc3\xcb\xbc\x12\x7a\x0c\x23\xc1\x6a\xdb\x3a\x81\x52\x28\x99\x6b\xeb\xd2\xc6\xa1\x66\x5e\x0d\x75\xc9\x95\xa8\x2a\x0c\x39\x0f\x18\x72\xde\xd0\x45\x42\x12\x94\x26\xa7\x6b\x48\x6e\xf5\x48\x6c\xa0\x4b\xce\x02\x5c\x5e\x99\xd9\xf2\x8a\x84\x83\x55\x84\x19\xf7\xa6\xa2\x6b\x15\xf9\x1e\x89\x8c\x99\x80\x74\x04\xa0\x36\x91\x3c\x99\x03\x00\xa9\xde\x62\xa9\xc0\x85\xb5\xb9\x59\x4b\xf8\x44\x96\xdc\x76\x00\xe7\x08\x77\xaf\xb4\x66\x00\x5a\x3d\xc7\x92\x9f\x8a\xaa\x94\x09\xc8\x20\xcf\x62\x0d\x91\xc8\x7d\xdc\x07\x3d\x24\xef\x66\x42\xb3\xd2\x76\xfb\xc5\x76\x32\xd0\x6f\x7f\xb1\x3d\xb3\xf1\x72\x70\x83\x17\x29\x06\xf8\xac\x06\x62\x30\x32\x95\x7f\xe3\x98\x89\x62\x3e\x7a\x80\x2c\x15\x81\x54\x29\x91\xeb\x63\xa9\x08\x41\x0a\x1c\xf4\x60\x33\x5f\x25\x79\x96\xba\xdb\xdd\x78\xbb\xc9\x4f\xe9\xb5\xe4\x71\x1c\xb8\x05\x6f\xc1\xcb\x5a\x88\xd0\x40\xcf\xe2\x9c\xef\xee\xc4\xbd\xcc\x07\x8c\xa1\xd2\x76\x3c\xe1\x07\xe3\xd3\x83\xf3\xf7\xd3\x33\xad\x22\x6b\x45\xd1\x18\x14\xc7\x13\x72\x90\x9d\xbd\x1b\x4d\x4e\x3f\x44\xfc\xa7\x77\x23\x50\x61\xcf\x26\xa7\x67\x7c\xdb\x1a\x05\xec\x78\xf4\xf6\x68\xfc\x76\x74\x7c\x30\x1a\x44\xa8\xdf\x0e\xb5\x42\xac\x35\x5f\xfd\xfd\x9f\xc6\xd3\x51\xc4\xa7\xef\x86\x47\x47\x81\x5e\x1c\x81\xae\xeb\xe9\xc3\x11\x23\x4d\xf9\x70\x3c\x35\x7f\xf3\xd5\x51\xa3\x8a\x47\x46\xa3\x9e\x9e\x9f\x68\x0b\xe5\xd4\xe8\xcd\x93\x37\x7c\x7a\x7e\xf0\x0e\xed\x87\xd1\x34\x62\xaf\xf5\xdb\xb4\x75\xa1\x2d\x03\xfd\x8d\x93\xd1\xe9\x74\x72\x8c\x5c\x18\xc7\x1f\xf8\xf8\xf8\x70\x7c\x0a\xda\xbb\x56\xe2\xc7\xc3\x23\xb0\x75\xc6\x87\xa3\xe3\x33\xfd\xdf\xa0\x6b\x1f\x4f\x47\xff\xe3\x1c\x15\x67\x76\x38\x7c\x3f\x7c\x3b\x9a\x9a\xf7\x1d\xbc\x1b\xea\xa1\x8e\x4e\x6f\xb1\x90\xb8\x79\x4e\xbf\xf7\x68\xa2\xad\xab\x37\xec\xed\x64\x72\xf8\xd3\xf8\xe8\x28\x42\x36\x8d\xe9\xd9\xe4\xe4\x64\xf8\x76\xa4\x67\xf0\xfd\xc9\xb9\x6e\xf4\xcd\x70\x7c\x74\x7e\x0a\xb6\xcf\xfb\xe1\xd1\x9b\xf3\xe3\x03\x6c\x8d\x3a\xaf\x57\x4a\xcf\x29\x4c\x32\x3b\x98\xbc\xd7\xe6\x94\x56\xef\x6d\x2f\xf1\x65\xa3\x69\xc4\x47\x3f\x8e\x8e\xf9\xd8\x9b\x9e\x0f\xb4\x20\xef\x86\x3f\x8e\xf8\xeb\x91\xfe\xf4\x58\xdb\x49\xa3\x43\x46\x56\xd2\xc9\x64\x3a\x1d\x13\x8d\x88\x99\x58\x6a\x39\x36\x96\x83\x19\x21\xae\x92\x21\x1d\xc1\x96\x8f\x27\x67\x6c\x78\x72\x72\xf4\x41\xcf\xbd\xfb\x50\x4f\xc1\xe1\x68\x78\xf6\x4e\x77\x0f\x97\x63\x78\xc4\xc7\xc7\x7f\x3e\x3f\x05\x63\xea\xfc\xe8\x6c\x7c\xfc\x96\xbf\x39\x9d\xbc\xf7\x7a\xfb\x80\xc6\xf8\xdb\xff\xc4\x4f\x86\xef\x8f\xbe\x27\xf9\xff\xed\xfc\xff\x4f\x9f\x3e\x7f\xde\xe4\xff\xdd\x7b\xb6\xf3\x80\xff\xf8\x6b\xfc\x58\x20\xd8\x97\x0d\x22\xff\xbd\x9d\x9d\xe7\xfa\x12\x1b\xae\x56\xb9\x80\xe0\x59\x5d\x89\x32\xe2\xe3\x62\x1e\x47\x60\xfd\x22\x79\x99\x56\x20\x0c\x28\xec\xf8\xfd\xc9\xe4\xf4\x6c\x78\x7c\xf6\x92\x68\x83\xe1\x59\x9f\x3e\x5d\xd5\x10\x45\x48\x8d\xe2\xd8\xf3\x02\xb6\xbd\x05\x7f\xc6\xbc\x27\x88\x05\xa6\xc2\xa9\x8a\xa0\xe5\x3b\x88\xeb\xaa\x51\x86\x8b\xe6\xbf\xcd\x18\x29\x11\xe6\xd0\x87\x49\x88\x02\x70\x07\x8c\xd0\xa4\x8d\x40\x6e\xd5\x31\x02\x8f\xf4\x88\x75\xb1\xbf\x13\x36\x09\x29\xa4\x86\xe6\x05\xcc\x1c\xe3\x9b\x30\xdf\x8a\xf8\x0a\x8a\x95\x78\x2a\x19\xb9\x17\x6d\x1f\x23\x2f\x45\xd9\xeb\x98\xe8\xea\x93\x9e\xf6\x3b\x4d\x51\x32\xcb\xd0\xde\xe9\x9d\x2b\x2a\x83\xa6\xe0\xa0\xeb\x28\xbe\x30\x00\x26\x31\x0c\x3a\xbd\x25\xd5\xa8\x94\xc1\x93\x8f\x3c\x1c\x5e\x87\x4f\x63\xf3\x10\x1b\x53\x8c\x66\x25\xfe\xd1\x00\x0c\x6e\x0d\xa0\x1c\xb8\xee\x2c\xac\x26\xc5\xac\x41\xf4\x19\x36\x10\x59\xb8\x64\x2a\x6d\x63\xcb\x30\xef\x5f\x9b\x62\x18\xe9\xa1\xd0\xca\x0c\x23\x6c\x0b\x59\x2e\xd5\x2b\x97\xf5\x82\x6e\xeb\x05\xa5\x58\x34\x22\xed\xe1\x3b\x9b\x40\x9e\x98\xda\xd1\x81\x7a\xac\x02\x6f\x39\xe4\x2b\xc3\x0c\x91\xdd\x6d\x1c\x65\xfe\x92\x7d\xaa\x4c\xa4\x9f\x3c\xcb\xca\x64\x18\x83\x95\x11\x6e\x66\x65\x5c\x57\x61\xff\xda\x1c\xa2\x51\x40\x86\x49\x5c\x9f\xdc\x92\x7f\xe6\xf2\x42\x42\x5b\x5d\x27\xf6\x0b\xb8\x40\x1d\x04\x51\x63\xe2\xcc\x24\x01\x21\xd6\x22\x9b\xf7\x93\x81\x42\x0b\xf0\x74\xcc\x6e\x63\x88\xb3\x33\xaa\xf7\x2c\x85\x78\x68\x4f\x4a\x6b\x14\xa8\xc8\x3c\xcd\x7c\x12\x37\xc0\xe7\x73\x8a\x3d\xf6\xd7\xe0\xba\xb8\x8c\x9e\x59\x0d\xa9\x35\x18\xd1\xa6\xa0\x60\xb1\x66\x21\x13\x9f\x4d\xba\x82\xc8\x33\xda\x73\xc6\x5c\x28\xdb\x6c\xdb\x88\x0c\x4e\xd4\x3c\xfa\x2f\xcc\x56\x44\x74\x4c\x9d\x6d\xd7\xc5\x52\x21\x8e\xdb\xde\x9c\x1e\xf5\x9d\x1d\x51\x48\x78\x07\x75\xff\x31\xd7\xea\xde\x88\xbf\x1f\xfe\xf3\x68\xca\x8f\x27\x5e\x5c\x20\xda\x1c\x56\xe8\xd0\x99\x41\x05\xa5\x6f\x72\xd7\x90\x56\x4e\x6f\x67\xbd\xd3\x9a\x71\x1f\xed\x9d\x89\x28\x44\xec\x74\xf4\x76\x78\x0a\xaf\xd7\xef\xc2\xbe\x4f\x27\x6f\xce\x7e\x1a\xa2\xce\x3d\x3e\x9b\x82\x43\x5c\xb7\x36\x39\x19\x9d\x62\xbf\x86\x47\x93\x63\xfc\xf8\x58\x6b\xea\xaf\xc7\xc7\xf0\x77\x66\x02\x08\xa7\xc6\x4a\x99\x6a\x71\x7b\xac\xad\x28\xad\x7c\x9f\x91\x56\x8c\xaf\x71\x76\x89\xb1\x44\x3c\xfb\xc3\x98\x24\xce\x12\xe1\x13\xad\xdf\x7b\x86\x88\x55\xf1\xb7\x3d\xc3\xe3\xf5\xf9\x19\xc4\x1e\x60\x12\x47\x87\xfc\x6c\x12\xe9\xbe\x1c\x9c\x9f\xc2\x34\xa1\x12\xff\x9a\x22\x02\x60\x7e\xc0\x72\x60\x88\x61\x34\x7d\x65\x2c\x13\x3d\x68\x6d\xb2\x9c\x0d\xc1\xd4\x38\x39\x9d\xbc\x19\x9f\x4d\x5f\xe9\xff\x7e\x7d\x3e\x1d\xc3\xac\x8e\x8f\xcf\x46\xa7\xa7\xe7\x27\x7a\xe8\x03\x36\x3c\x1d\x4f\xf5\x3c\x52\x48\xe4\xa7\xe1\x07\xae\x57\x93\x0c\x09\x68\xee\x74\x44\xd3\x02\x16\xcc\xfb\xc9\xe1\xf8\xcd\xf8\x80\x66\xf4\xf8\xf0\x89\x36\x0a\x8c\xd1\xa7\x67\x93\x1e\x0d\x17\x25\xe2\xef\x26\x3f\x8d\x7e\x1c\x9d\xf2\x83\xe1\xb9\xb6\x07\xf5\xca\x18\xa3\xd4\xc4\x20\xb4\xa9\xaa\xdf\x6c\xed\x50\xd6\x30\x57\x79\x60\xae\xea\x77\x1e\x9c\x79\xf6\x49\x68\xb5\x1a\xbb\x09\x3a\xc2\xde\x0d\xa7\x68\x2b\x0d\x0f\x7f\x1c\xeb\x0e\xdc\x6a\x2a\xfd\x57\x82\x91\x8f\x9f\xfc\x74\xf6\xe6\xe4\xfb\x5a\x00\xb7\xe8\xff\x3b\xcf\x9f\xef\x37\xf5\xff\x67\x7b\x0f\xf8\xef\xbf\xca\xcf\xe1\x84\xff\x64\xc2\xbb\x6f\xce\x0f\xfe\x19\x22\x9e\x3f\x0d\x8f\xcf\xb4\x81\x7f\x72\xfe\xfa\x68\x7c\x60\x5c\x35\x8c\x19\x34\xf8\xbd\x88\x1f\x8a\xb9\x58\xce\x44\xa9\xed\x84\xa7\x8c\xb5\xf8\x24\x9e\xf2\x69\xb2\xe4\xef\xe4\x5c\x5c\x25\x25\xff\x47\x95\x2c\xff\xfb\x25\xfe\x12\x17\xa2\xfa\x27\xc6\x46\x57\xa2\x5c\xcb\x02\x6f\x22\x60\x7e\xdf\xc0\x1c\x71\x25\xca\x59\x52\x21\xfb\x98\xcd\x76\xb0\x5c\x84\x2c\x20\x96\x30\x29\xbf\x36\x0b\xbf\xb8\x40\x9a\x2a\x48\xd4\x25\x9c\x62\x8f\x37\xde\x68\x3f\x40\xaa\x02\x99\x3d\xfa\xca\xbc\xd7\xbc\x9c\x8d\x4e\xdf\xa3\x93\xed\x60\x72\x7c\x38\xd6\xc2\x0e\xef\xa8\x83\xc9\xc9\x07\x10\xe3\xbe\x1c\x84\x2f\xfa\xc2\x12\xfc\x7a\x3b\x98\xfe\xf2\x17\xad\x05\x6e\x7a\xf9\x37\x16\x3e\xf1\x93\x59\x2e\x94\xca\x8a\x8b\xdf\x8a\xff\x61\x67\xe7\xe9\x6e\xd3\xfe\xdf\x7f\xba\xff\xf4\xe1\xfc\xff\x1a\x3f\x5a\x35\x4c\xea\xea\x52\x96\xd6\x9a\xf0\x69\x53\x4c\x0e\x0e\x19\x47\x73\xc8\x7d\x1c\x03\x10\x3f\xda\xbd\x86\x24\x89\x54\x6b\x88\xb9\xc3\x41\xe3\x66\x5f\xbd\x84\xed\x0d\xff\xbc\x4f\xd6\xc6\x30\xbe\x90\x32\xb5\xb5\x27\xe2\x2a\xcb\xe3\xf6\xd7\x16\x59\x01\xf9\x8f\x17\xd9\x95\x28\x84\x52\x36\xc2\xa7\x44\xbe\xc0\xb0\x3e\x7e\xe8\xf0\xab\x9b\x4d\x00\x05\x10\x5f\x94\x02\x40\x75\x0b\xa8\xe5\xaa\x0c\xbc\x23\x66\x38\x61\xfe\xec\x05\x04\xbd\x7f\xeb\xd5\xf8\xf5\x7f\xe2\x27\xa9\x58\x95\x62\xae\x2d\x85\xff\x43\x1c\x48\xf5\x78\x2f\xde\xf9\xc6\xa2\xe0\x96\xf3\xbf\xbf\xb3\xdf\xe4\x7f\x79\xb6\xfb\xc3\xc3\xf9\xff\x55\x7e\xf4\xf9\xd7\xcb\x6e\xaf\x4f\x93\x30\xb9\x17\xef\x50\x02\x30\x16\x30\x2b\x0b\x5e\xa8\xbf\x8e\x81\xe1\xd1\x72\x26\x52\x6d\x41\x1e\xc8\x62\x91\x5d\xd4\x25\x44\x69\x27\x2b\xf0\x43\x15\x17\x7c\xba\x56\x95\x58\x7a\x94\x87\x4c\x6b\x07\xbb\x2f\x5e\xfc\x29\xd2\xff\xbe\x88\xb4\xa6\xb0\x03\xff\xee\xc2\xbf\x7b\xfc\x54\xa4\xfc\x5d\x52\x91\x1b\x90\x41\xd7\x74\x1f\x4a\xe1\x7c\x44\xaf\x30\x0b\x32\x29\x42\xb7\x4f\x56\x19\xe7\x0d\x39\x86\xb2\xaa\x9b\xa7\x5e\xf0\xb7\xc7\xe7\xfc\x2d\x22\xa9\xf0\x13\x48\xe2\x71\x69\xce\x2a\x4c\x0e\xd5\x5f\x7f\xa3\xdf\x6e\x4c\x67\xf6\x46\xd6\x45\x0a\x9e\x9b\x57\x26\x93\xc1\x4e\x1a\xe4\x0e\x98\x74\x44\x09\xf9\xdd\x08\x0a\x09\x35\x47\x36\xd3\xd5\x0d\xcc\xa7\xe3\xa0\x04\xf6\x4b\xb9\x12\x36\x3f\x12\xb2\xa0\xd0\xaf\xb2\xa8\x73\xc4\xa9\x33\x86\x35\x9a\x65\x98\x17\xf6\x8a\x19\xaf\x09\x80\x82\x40\x04\x19\xbd\x17\x1e\xf2\xfc\xe2\xcb\xa8\xe4\xa7\x42\xdc\x36\x6b\x0b\x53\x9e\x88\x79\xeb\x8a\x60\xd9\xd5\xa5\x05\xec\xb2\x55\xe5\x01\xf4\xd2\xe6\xa5\xb0\xe5\xbe\x30\x5d\xaf\x78\xb6\xd0\xd7\x45\x04\x9e\x20\x4b\xb0\x10\x2c\x0e\x77\x8b\x63\x5c\xd5\xcf\x76\xf9\x9b\x32\x29\x3e\xe6\x59\xc1\xa7\x55\xc4\xde\x64\x8b\xea\x92\xbf\xc9\xa5\x2c\x23\xfe\x5a\xaa\x4a\x7f\xf5\xfd\x90\xef\xec\xed\xee\xee\x3c\xde\xdd\xdf\xd9\xe5\xe7\xd3\x61\xcc\xd8\x50\xdf\x62\x44\xca\x4e\x05\xda\xc8\xfa\x68\x38\x38\x11\x00\x1c\x7c\xb6\x05\x66\x3b\x55\x62\xb9\xca\x11\x3a\x04\x93\x73\x97\xc9\xbc\x94\xe8\x4b\x2a\xf2\xac\x10\xdc\xd0\x9f\xfb\xf0\x67\xba\x1d\xc8\x3a\xc1\xc2\xe4\xe5\x2a\xcb\x85\xfb\x84\xa8\xbc\x8b\x8f\xb8\x1d\xaa\x4b\xe6\x39\x83\x08\x7e\x2d\xad\xe7\x02\xe1\xa2\x3f\x12\xcd\xb4\x2c\xfc\xb6\x5d\x63\xa9\x14\xca\xd4\x5e\x65\x95\xbe\x48\x99\xa3\xef\x73\x3c\xe8\xd0\x12\x16\x10\x00\xdf\xa6\x3b\x0b\xfd\xeb\x15\x33\xaa\x3d\x25\x38\x22\xab\x31\x50\xf1\x8f\xe9\x02\x38\x3a\x55\x45\x1b\x3b\xc4\xc8\x01\x37\xe6\x7c\x2e\xcb\x14\x58\x9d\x90\x72\x93\x0a\x37\xb6\xf7\x07\xb7\x6f\x1a\x53\xb5\x60\xd7\xcb\x8d\x38\x2b\x20\x46\x9f\x10\x1c\x13\x79\x00\x21\x5f\x42\xf1\xeb\xcb\x75\xe7\x04\x62\x5e\xd8\x12\x94\xa1\xfb\x4d\x86\x8f\xe8\xef\xd2\x2f\x00\xee\x47\x9f\x7d\xf2\xd4\x51\x32\x4f\x6a\xa8\x10\x93\x39\xcc\x7f\x28\x06\x93\x8a\x5f\x56\xd5\xea\xe5\x93\x27\x86\xa8\xa6\x14\xe9\x65\x52\xc5\x73\xb9\x7c\x22\xe6\x52\xc1\x3f\x8f\xe9\x25\x4f\xf8\xe3\xbb\xff\xb0\x7f\xf8\x87\x7f\xf8\x87\xd1\xc1\x64\xfa\xf6\xe4\x48\x5b\x2b\xa7\xe3\xb7\xef\xce\x46\xc7\x87\xfa\xcf\x7f\x87\xea\xd0\xdf\xdd\x4f\xfc\xe4\xa2\xa8\x1f\xff\x25\xb9\x4a\x96\x49\x96\x3f\xb6\xc7\xe6\x5b\xaa\x80\xb7\xd9\x7f\xcf\xf6\x9a\xfa\xdf\xf3\xdd\x1f\x1e\xfc\x3f\xbf\xca\xcf\x86\x4b\x4e\xdf\x46\x70\xef\x90\x7b\x65\x56\x26\xe5\xda\x2f\x39\xc5\xfb\xcf\xbf\x81\xfc\x22\xf4\x28\x7c\xae\x7d\xf1\xf0\xae\x8b\xc7\x2b\xe6\xbe\xef\xf5\xc3\xfb\x04\x3f\x31\x92\xdc\x7e\x01\x34\xaa\xc9\xbf\x58\xf4\xff\xd6\x8b\x7a\x8f\x9f\xf8\xc9\xeb\xac\x3a\x93\x65\x29\x8a\xea\xf1\xee\x37\x37\xfd\xe0\x67\xf3\xf9\x7f\xf6\xfc\xe9\xfe\x0f\x8d\xf3\xff\x74\xef\xc1\xff\xf3\xeb\xfc\xb8\xd5\xef\x2a\x8f\x74\x2e\xdf\x5d\x6b\x0e\x6e\x7e\x62\x13\x01\xa8\xfe\xc4\x3d\xcd\xe6\x39\x14\xb4\x7e\x09\xf9\x27\xbf\x07\xfb\xa7\xd7\xdf\xdb\xf9\x3f\x99\xfb\x36\xc5\xb5\xdb\xf4\x9f\xed\x06\x3b\x09\x40\x59\x93\x2d\xb2\x5d\x39\x17\x77\xd2\x89\xb4\xe8\x3f\x99\x4f\xff\xc9\xcf\xe3\x69\xfc\x55\xec\x9f\x6c\xed\x73\x31\xde\x83\xfd\x33\x66\xec\x81\xb4\x13\xa9\xe9\xbf\x88\xb5\x13\x51\x1a\xc3\x82\x63\xd6\x28\x38\x6e\x1e\xa7\xdd\x78\x87\x8e\xd4\x9f\x27\xd3\xa3\xad\x81\xa9\xe5\xec\x22\xff\x64\xbd\xe4\x9f\x0e\x80\x65\x8e\x18\x11\x4f\xb7\x17\x03\x2c\xc5\x77\x55\xcf\x93\xe9\x91\xcb\x67\x66\x69\x29\x57\x2b\xca\x1e\x78\xa0\xf6\x7c\xa0\xf6\x7c\xa0\xf6\x7c\xa0\xf6\x7c\xa0\xf6\x7c\xa0\xf6\x7c\xa0\xf6\x7c\xa0\xf6\x7c\xa0\xf6\x7c\xa0\xf6\xdc\x44\xed\xd9\xd0\x19\x2d\xb7\x27\xbf\x3f\xb7\x27\xeb\xe5\xf6\xe4\xf7\xe5\xf6\x64\x9b\xb9\x3d\xf9\x3d\xb8\x3d\x6f\x27\xf6\xf4\x26\x77\x33\xaf\x27\xfb\x56\x0c\x65\x16\x04\x9c\x3d\x30\x94\x3d\x30\x94\xfd\x21\x18\xca\xbe\x8c\xec\x91\x77\x72\x3d\xb2\x2f\xe0\x7a\xe4\x3d\x5c\x8f\xec\xde\x5c\x8f\xbc\x97\xeb\xb1\x85\x03\x75\x3b\xd7\x23\xef\xe1\x7a\x64\xf7\xe6\x7a\xe4\x1b\xb9\x1e\xd9\x3d\xb8\x1e\xf9\xad\x5c\x8f\xec\xee\x5c\x8f\xfc\x0e\x5c\x8f\xec\x4e\x5c\x8f\x77\x65\x48\x66\x5f\x24\x49\x1f\xb8\x1e\x1f\x24\xe9\x1f\x43\x92\xde\x4a\xf4\xc8\xef\xc8\xf3\xc8\x6e\xe7\x79\xe4\x77\xe6\x79\x64\x77\xe4\x79\xec\x40\x4f\xeb\xe2\x79\x64\x77\xe0\x79\xe4\xf7\xe0\x79\x64\x1b\x79\x1e\x7b\x0c\x85\x6e\x9e\xc7\x6e\xaa\x0c\x2f\x56\x7a\x67\x9e\x47\x76\x1b\xcf\x63\x7b\xa6\x36\xf3\x3c\xb2\xdb\x78\x1e\xfb\xb7\x44\x0f\xcf\xa3\x03\x59\xef\xe2\x79\xe4\xf7\xe4\x79\x74\xad\x75\xf1\x3c\xf2\x07\x9e\xc7\x07\x9e\xc7\x07\x9e\xc7\xff\x42\x3c\x8f\xe9\x03\xcf\x63\xc7\x9d\xf2\xc0\xf3\xf8\xc0\xf3\xf8\x6b\xf1\x3c\x22\x65\xdd\xfc\x81\xb2\xee\x81\xb2\xee\x81\xb2\xee\x81\xb2\xee\xbb\x51\xd6\xcd\xff\x50\x94\x75\xe9\x03\x65\xdd\x03\x65\xdd\x03\x65\xdd\x03\x65\xdd\x03\x65\x5d\x0f\x65\x9d\x78\xa0\xac\x4b\x1f\x28\xeb\xbe\x31\x65\x9d\x23\x85\xf2\xa8\xe6\x58\xe3\x6c\x7e\x15\xd5\x1c\x6b\x50\xcd\x75\x49\x87\x7b\x50\xcd\xb1\x2f\x39\xa6\xfe\xbb\x9b\x47\x94\x35\x8e\x68\x37\xd5\x5c\x07\x5f\xe4\x03\xd5\x9c\xb7\xf4\xbf\x19\xd5\xdc\x97\xf0\xcc\xf1\x1e\x9a\x39\xf6\x05\x34\x73\x2d\x1c\x7a\x5a\x4d\xf6\x25\x34\x73\xbc\x93\x66\x8e\x7d\x21\xcd\x1c\xef\xa4\x99\x63\x5f\x43\x33\xc7\x5b\x34\x73\xec\xcb\x69\xe6\x78\x8b\x66\x8e\x7d\x15\xcd\x5c\xd3\xd1\x19\xb1\x2f\xa6\x99\xe3\x0d\x9a\x39\x56\x7d\x25\xcd\x1c\xef\xa2\x99\x63\x5f\x46\x33\xc7\xbb\x69\xe6\x58\x07\xcd\xdc\x2d\x1c\x73\xfc\x7e\x14\x73\x6c\x03\xc5\x1c\xaf\xee\x45\x31\xc7\xbe\x92\x62\xee\xfb\xf3\xb7\xcd\x1e\xf8\xdb\xbe\x09\x7f\xdb\xaf\x41\xdf\x36\x7f\xa0\x6f\xfb\xaf\x47\xdf\xd6\xcf\xdd\xd6\xc9\x36\xb6\x81\xba\x8d\x21\x75\x1b\x00\xab\x36\x88\xdb\xf8\x7d\x89\xdb\xd8\x2d\xb4\x04\xf7\x21\x6e\x63\x1b\x89\xdb\x7a\x61\x56\x3b\x88\xdb\xd8\xad\xc4\x6d\xfc\x8e\xc4\x6d\xec\x2e\xc4\x6d\xfc\xae\xc4\x6d\xec\xee\xc4\x6d\xfc\x36\xe2\x36\x76\x5f\xe2\x36\xde\x4f\xdc\xc6\xee\x4f\xdc\xc6\x6f\x21\x6e\x63\x0f\xc4\x6d\x0f\xc4\x6d\x0f\xc4\x6d\x1b\x89\xdb\x1c\xdb\xd1\x03\x6d\xdb\x03\x6d\xdb\x03\x6d\xdb\x03\x6d\xdb\x03\x6d\xdb\xdf\x0d\x6d\xdb\x6f\xc5\xda\xb6\x89\xb2\x8d\xdf\x9b\xb1\x8d\xf5\x30\xb6\xf1\x2f\x65\x6c\x63\x4d\xc6\x36\xfe\xe5\x8c\x6d\xac\x8b\xb1\x8d\x7f\x1d\x63\x1b\x6b\x32\xb6\xf1\xaf\x64\x6c\x63\x1e\x63\x1b\xff\x5a\xc6\x36\x16\x30\xb6\xf1\xaf\x60\x6c\x63\x01\x63\xdb\xed\x34\x04\xb7\x30\xb6\x31\xcb\xd8\xc6\xef\xc9\xd8\xc6\x58\x2f\x65\xdb\xd4\xdb\x65\xc6\xbe\x1b\xfd\xcb\xd9\xe8\x18\x5f\x32\x3e\x80\x55\x3e\x1a\xfe\xa4\x37\xc9\xbb\xf1\xeb\xf1\xd9\x94\xc1\xd3\xae\x93\x31\x9f\x4e\xde\x8f\xf8\x9f\xcf\x4f\xc7\xd3\xc3\xf1\x01\x82\xa5\x1f\x4e\xb0\xa3\x47\x47\x93\x9f\xa8\xd1\x83\xa3\xf3\x29\x8c\xe9\xd4\x7b\x58\x1b\xac\x01\x85\x46\xf7\xce\x88\xf8\x74\x82\x93\xe3\xda\xd1\xeb\xe4\x4d\xd5\xfb\xe1\x07\x16\xcc\x8d\x36\x37\x19\xdb\xdd\x8d\x49\xb6\xaa\x8c\x7c\xfa\x5a\x41\x31\xa9\x6f\x43\xc5\x67\xa2\xba\xd6\xa2\x23\x08\xdb\x86\x40\x1e\xda\xd0\x60\x54\x57\xa4\x5a\x59\x80\xa6\x1c\xbf\x48\x0d\x34\x01\x4f\xca\x4c\x41\x46\x76\xf7\xbd\x15\x31\x59\x83\xfc\xcc\x2a\xc5\xeb\x2a\xcb\xb3\x7f\xb3\xa2\x84\x6e\xf9\x0e\xaf\x94\x97\xaf\x5c\x49\xc4\x4b\x80\xf8\x4a\x6f\xc7\x1b\x55\xf5\x44\x25\x14\xcc\x05\x16\x0c\x89\x9f\xeb\x0c\x13\x5c\x89\x23\xc6\x54\x12\x90\xa2\xed\xa3\x01\xc9\x12\x2c\xcf\x46\x99\x09\x25\xbe\x11\x99\x16\x6a\xce\xa9\x61\xf5\x91\x0b\x17\x45\xd3\x4b\xb2\x17\x23\xe8\xd1\x5b\xc8\x6f\x87\xeb\x68\x54\xa4\xfc\x5c\x01\x42\xc2\x59\x5f\x80\x13\x92\x62\x45\x09\x61\x8d\xac\x12\xcb\x08\xcb\xf6\x13\xac\x4b\xf0\x60\x45\xf4\x75\xf8\xf4\x4f\xfc\x20\x7e\x13\x9f\xc6\x7c\x2f\xde\xdd\xd9\xe5\xdb\x93\x79\x15\xf3\xdd\x17\x2f\x9e\x0d\x22\x13\x21\xd2\x23\x94\x0b\xaf\x59\x66\x1d\xe2\xd6\xe7\x86\xf1\x5a\xfb\xde\xf6\x17\x82\xf0\x6e\xa4\x35\x0b\x28\x36\x22\x17\x64\x49\x0c\x4a\x41\x8f\x76\xf7\xe2\xbd\xdd\x3d\xbe\x3d\x15\x2b\xd3\x27\xc8\x4f\xd3\x7d\xc2\x9c\xc2\xea\xd2\x7d\x9d\xd1\xd7\x01\xe6\xc7\x8d\x6a\xef\x87\xf8\x87\xbd\x9d\xbd\xc7\xbb\x36\x9a\x6d\xff\xf4\x94\x6f\xff\xb9\x2e\x84\x19\xad\x5e\xa8\xc6\x7c\x33\x3b\xdf\x3c\x99\x43\x20\xae\x2f\x40\x88\xb5\xe5\x52\x59\xf5\x53\x09\x80\x15\xa9\x2e\x4d\xd9\x0e\x63\xbb\xfb\x31\x7f\x9f\xa9\xb9\xc8\xf3\xa4\x10\xb2\x56\x8d\x30\x80\xcd\x34\xa3\xec\x4b\xb9\x5c\x41\x55\x8e\xa3\x33\x9b\xcb\x62\x2e\xca\xc2\xe4\x9e\x9b\x9a\xbe\x25\x64\xae\x72\xaa\x8a\xd2\x0a\x26\xa8\x30\xc6\xfe\xee\x42\x83\xba\x14\x79\x8a\x21\x0c\x56\x17\xa2\x58\xc8\x72\x2e\x30\xd3\x1c\xb6\xbf\x7b\xd6\x6e\xe0\x52\x2c\x64\xb9\x04\x84\xd8\x56\x01\x99\xcd\xcc\x33\x15\x6d\x3c\xab\xb8\xd7\x6a\x63\xa0\xb6\x4d\xbf\x72\xe3\x20\xc9\xb3\x85\x2c\x8b\x2c\xe1\x79\x72\xed\x55\x63\xb2\x6d\x61\xa2\x41\xfe\x3b\x3d\xb7\x75\x9e\x5c\x03\x72\x63\x52\xac\x23\x87\xd4\x64\xcb\x6a\x06\x90\xb4\x47\xc8\x44\x5a\x94\xcc\x65\xb1\xc8\xb3\x79\xf5\x58\x2e\x1e\x87\xef\x42\xe1\xe1\x88\xb4\x1a\x15\x2c\x9e\x05\x62\xd2\xc8\x98\xf1\xf7\xe6\xcd\xc1\x05\x15\x97\x82\xff\xa5\x2e\x33\x95\x66\x73\xbf\xe4\xf4\x8d\x48\x21\xbd\xe1\x40\xd6\x65\x65\xf9\xca\x8e\xf5\xb6\x11\x65\x41\x81\x6f\xd4\x2f\xbd\xe9\x31\x40\x28\xf5\x4a\x80\x4a\x06\x4f\x9b\x26\x0f\xb4\x3a\xbb\x86\x5c\x8e\xa4\xa8\x12\x2d\xc1\xcb\x24\xf2\x1f\xdf\x4e\x94\x9f\x8a\x3a\x20\x92\xb8\x2b\x51\xd4\x82\xe7\x6b\xaa\x8c\xf2\x9e\x66\xd8\xa6\xdf\x48\xe4\x5c\x57\xb9\x84\x1a\x28\x14\xfb\x2d\x99\x2f\x55\xa5\xbc\xd2\x1b\xd6\x55\x7a\x33\x87\xfe\xe3\x57\x51\x6d\xb5\x26\x54\x52\x55\xb2\x2c\xc4\x5a\x71\x40\x9d\x41\x44\xaa\x15\x68\xbc\x31\xd0\x7b\x75\xd4\xf1\x9e\x17\x10\x22\x3c\xa6\x98\xe7\x01\x00\x1f\xe0\x17\x0a\x94\xfb\xc9\xbc\x52\xb6\x60\x60\x5c\x10\x4a\x89\x2c\x92\x9c\x4d\x13\xcc\xd9\x7b\x2b\x65\x0a\x40\xe5\x6e\x2f\xe0\x1e\x12\x29\x5d\x30\x45\xea\xae\x42\xf7\xa5\xeb\x84\x7c\x63\xcc\x65\x63\x26\x1c\x20\x79\xaa\x12\x24\x72\xd1\xdc\x49\xee\x50\x77\xc6\xe0\x01\x8d\xd9\xde\x6d\x43\xc0\x54\xbf\xee\x89\x15\x3b\x88\x32\x5c\x9a\xa4\xb8\xa8\x93\x0b\x22\xac\x98\xd3\xd0\x99\xdd\xa1\x70\x13\x95\xb5\x48\x03\x8c\x9c\xb4\xc4\xe4\x66\xfc\x1a\x04\x51\x1c\xea\x45\x10\xfd\xd9\x7d\x1a\xfb\x30\x6f\x72\x01\x33\x93\x15\x0d\x83\xf7\x03\x64\x20\x83\xf0\x95\x75\xd5\x8a\xf1\x08\xbd\xd9\x59\x56\xf0\x7a\xb5\xc2\x2a\x9f\x5c\x5e\x8b\x92\xcf\x13\xfd\x39\x14\xb9\xeb\xcb\x57\xab\x05\x57\x59\x5a\x43\xb0\xde\xf2\x6f\x60\x0d\xb6\xc9\x9b\xd7\x73\x48\x1e\x28\x50\x0c\x22\x73\x2f\xad\x70\x5f\xdb\x08\x74\x23\xb1\x20\xba\xb5\x16\xab\x19\x9c\xe2\x99\x52\xb5\x8d\x8a\x79\x95\x58\x6f\x74\xff\x5d\xd7\x32\x41\x00\x4a\x14\x05\x07\xf7\x19\xa3\x5e\xdb\xe2\xf9\x52\xe6\x2a\x02\x22\x1e\xbf\x56\x18\x31\x88\x8c\x8e\xa3\x6f\x57\x82\x80\x2b\x65\x8e\x43\x59\xcb\x3a\x66\xfa\x8d\x04\x5c\xe5\x82\x6f\x0e\x10\x24\xb2\x8f\xe0\x54\x6e\x67\x03\x74\xae\xe8\x49\x36\x9a\x97\xaf\x77\x41\x59\xb2\xc3\xa8\xc5\x3f\x12\x5d\xe8\x32\x29\x12\xb2\xe7\x25\x55\x5e\xe2\x58\xec\x42\x1a\x40\x6f\xbd\xd3\xb4\x12\x64\xa5\xb0\x73\x54\xc9\xeb\x42\x94\xea\x32\x5b\xe9\x36\x16\xd9\xa2\x5a\xf3\x95\x28\xe7\xe0\xa5\x7b\xb6\xf3\xdf\x06\x36\x81\x92\x56\x49\xd6\x15\x44\xd6\xb5\xb4\x05\x62\x13\x65\xda\xca\x06\x7c\x26\x0a\xb1\xa0\x1c\x0e\xbf\x5d\xaf\x6f\x7a\xa7\x3e\x8b\x2d\xe0\x09\xba\xc2\x8d\x0e\x14\x42\xcc\xd8\x04\x0e\xe3\x04\x37\x5a\x89\x65\x4d\x61\xb2\x10\x76\xbd\xbb\x12\x72\x2c\xf4\x8a\xbe\x8e\x23\x2c\x27\x58\x5d\x26\x33\x01\x8e\x25\x93\x68\xb2\x90\x18\x51\xf6\x61\x59\x68\xb8\xa5\x48\xa0\x2c\x0d\x6a\x90\x7a\x5e\x64\xb9\x10\x21\x26\x60\x60\xe2\x8c\x7e\xe7\x10\x62\x80\x7b\xf6\x52\x5e\x83\x77\x6d\x95\x94\xa2\x00\x86\x53\x15\x33\xe6\x69\xc0\x2f\xf9\xa8\x0b\xd9\x80\xdf\x1d\xd9\x80\xdd\x01\xd9\x20\xd6\x9a\x9c\x1b\xd2\xde\x80\xb1\x66\xec\xf8\x25\x3f\xb3\x7a\x6a\xa2\xec\xe4\xb7\xa1\x2c\x71\xed\xf0\x60\x68\x9d\x8d\x35\x80\x41\x83\x37\xed\x6e\xcf\x06\x03\x8b\x65\x43\x1c\xbd\x9b\xe1\x5c\xa9\x05\x9c\xc8\x55\x52\x26\x17\x65\xb2\xba\xf4\xfc\xb2\xae\x3d\x2b\xac\x5f\xde\x07\x25\xb5\x21\x4a\xcf\xfa\xd1\x2f\x3c\xc9\xd1\x0f\x7c\xd1\x85\x73\xc1\x9a\x68\x18\xb7\x0e\x0a\x56\xd0\x5f\x1f\xce\xed\x1d\xf7\x92\xb7\x21\x62\x6f\x9d\xa2\xa0\x93\x38\x3f\x5f\x0c\x55\xc2\x02\xa8\x12\xfe\x95\x50\x25\xcc\x83\x2a\xe9\x48\xcd\x6e\xed\x54\xce\xc9\xd9\xfb\x12\xce\x65\xb3\x1e\x20\xc8\xbc\x69\x3c\xfe\x74\x5b\xe8\xed\xe7\xe5\x37\x61\x1b\x2b\x1b\xaa\x81\xa2\x1e\xa0\x12\x31\x14\x4d\x77\x81\x9a\x64\x5e\x7e\x6a\x9e\xeb\x87\x6a\x0f\xbd\x0b\x13\x83\x90\xa9\x75\x95\xd7\x18\xb6\x49\x94\x92\xf3\x8c\xb8\x61\x4d\x71\x8e\xbb\x2a\x20\xa6\xa4\x22\x8e\xc9\x53\xca\x92\xda\x9a\x0b\x04\x39\x3a\x5c\x82\xae\x4f\x2d\x8d\x8e\x53\xbf\x08\xd4\x82\x6e\xe0\x75\x4d\xa9\x86\x36\x63\xd9\x98\x89\x49\x99\x01\x10\xb9\xaf\x82\x84\xd5\x12\x9d\xc5\x4d\x38\xc9\xb0\x30\xee\x9c\x27\x03\x5c\xaa\x0f\xb2\xa6\x63\xde\x61\xf2\xda\xaf\x3f\x6d\xa7\xaa\x8c\xfe\x05\x9c\x37\x7c\x88\xe4\xb1\xe4\xdf\x07\xf8\x17\xaa\x2c\x5a\xad\x44\x52\x7e\x87\x12\x0f\x93\x8a\x41\xf9\x95\x2d\x07\x45\xbb\x66\x17\x32\x8e\xd2\x94\x62\xaa\x5a\xc6\x3b\x21\x88\xfb\x13\x1e\x24\x58\xe4\x75\xf0\xbd\xc2\xe5\xdf\x39\x94\xaf\x97\x38\x68\xfd\x69\x90\x6e\x8a\x6c\x2c\x65\xcb\xa2\xb9\x05\x43\xdb\x83\xd0\xc6\xe8\x9b\x91\x0b\x2e\x61\x0a\x73\x68\x56\x6b\x93\x14\xe4\x51\xb7\xe8\x19\xce\x08\x42\x02\xc0\x5d\xe6\xed\x62\x72\x44\x98\x21\xeb\x10\x08\xd3\x97\xab\x3c\x03\xc9\x61\xcd\x93\x40\x0b\xd5\xef\xa4\x3a\xc3\x90\x8d\xc7\x0a\x40\xcb\x38\x72\x7d\x7d\x1d\xcf\x32\x6d\x7e\xe8\x01\x02\xe3\x88\xe1\x19\x89\xf5\x61\x6e\xc2\xf3\x7a\x19\x52\x22\xb8\xab\xbc\x2f\xa0\x17\x09\xb3\x61\xc0\x83\x64\xdd\xb5\xac\x3b\x1b\x86\x66\xc0\x40\x31\x38\x6a\x66\x47\x4e\x64\x5e\x65\xcc\x19\x43\x1e\xcd\xac\xf2\x8f\x46\xb6\x53\x8d\x89\x58\xc7\x65\x85\xb6\xfa\xfd\x87\x42\xf2\xff\xb2\x9f\xf8\xc9\xf0\x64\xf8\xe6\xfd\x77\x25\x80\xbd\x85\xff\x63\x77\xf7\xd9\x6e\x8b\xff\xf5\xf9\xfe\x03\xfe\xff\xaf\xf1\xe3\x11\xb7\xce\x07\x7c\xf7\xc5\x9f\x9e\x45\xfa\xdf\x1f\xe0\xdf\x17\x40\xd3\xb6\x03\xff\xee\xc2\xbf\x7b\xf0\xef\x3e\xfc\xfb\x03\x1f\xa6\x72\x26\x88\xe5\x4d\xb1\xb1\x4f\x3a\x0e\xb6\xc5\x29\x9e\xb3\x53\xa1\x44\x79\xe5\xb0\xc4\x2d\xab\x95\x3e\x6a\xbb\x4f\xf9\x89\x54\xd5\x14\xae\xda\xed\xd3\x01\x1f\xbe\x79\x6f\x98\xb5\x2a\x08\x58\x2e\x57\x49\x91\x09\xe5\x33\xcc\x47\x58\x96\x9c\x62\x82\xb5\x2f\x5a\x1a\x08\xc6\x01\xe9\x3e\x96\xb7\x91\xcb\x46\x96\x9d\x64\xfc\x11\x0b\xb9\xfe\xa9\x04\xba\x71\x9d\xa0\x7d\x83\xea\xc5\x2b\xe7\x67\x70\x5d\xa7\x00\x3f\xf3\xbb\x66\x5e\x67\x85\xfb\x2b\xf7\x8a\x0e\x4d\xc7\x4c\x94\x81\x52\x5a\x74\xbc\x62\x55\xca\x65\x56\x40\x2a\xb7\x7e\x9d\xcb\x4e\xb7\x39\xa5\xfa\xbb\xdb\x6a\xf0\xca\x55\xcc\x82\x1f\xc5\xe9\xa9\x94\x3b\x60\x1e\x88\xc3\x45\x85\xb4\xd9\x42\xb6\xc2\x00\xa5\x57\xd4\xa3\xcd\x64\x2a\x26\x83\x77\x7b\xa8\x38\xb6\xb7\x7f\x07\x92\xf4\x8f\xf9\x13\x3f\x99\x1c\x1c\x9c\x3d\xfe\xae\x0c\xe0\x9b\xe5\xff\xfe\xfe\xde\x7e\x93\xff\x77\xef\xf9\x0f\xcf\x1e\xe4\xff\xaf\xf1\x03\x0a\xeb\xc1\x70\x7a\x30\x3c\x1c\xf1\x33\x31\xbf\x2c\x64\x2e\x2f\xd6\x0d\x4a\x23\xc7\x03\xf3\x3c\x7e\x1e\xf1\xe1\xaa\xcc\x72\xbe\xb7\xb3\xbb\xcf\xd8\xe4\x64\x74\x6c\x1b\xb0\x3c\x2c\x90\xeb\x9d\x7c\x14\x44\xa6\x39\xcf\xd7\x3c\x00\x8e\x08\xe8\x01\x51\x58\x30\x1b\x22\xeb\xeb\x13\xa9\xdb\x01\x17\x68\x37\x0a\x4e\xab\xb0\x00\xdd\x9f\x85\x31\xb9\x9b\x39\x9a\x8c\x8d\x6d\x2e\x3b\xf8\x04\xe9\xf6\x68\x7c\x8f\x8a\x02\xeb\xb9\xc5\xff\x33\x99\x3d\x5e\x32\xa0\x72\xa8\x3f\x0d\x8c\x13\x03\x96\x58\x1a\x5b\x52\xa8\x0a\x33\x50\x08\x02\xc9\x96\x21\xe3\x37\x5f\x85\xc4\xe6\xa6\x82\x41\xc9\x3c\xe8\x21\xb1\xc3\x98\x44\x1e\x6d\xd0\x5e\x94\xd4\xa2\x99\x2f\xd6\xcd\xa3\xa1\x40\xca\xfb\x15\x32\x06\x4d\x02\x63\x51\xb8\x78\xb6\x07\xab\x32\x99\x23\x30\x02\x7b\x0f\x03\x16\x72\x95\x0b\x87\xcc\x88\xa8\x45\xb2\x56\xa1\x65\x65\x16\xee\x3a\x4b\x05\x87\x24\x38\x2c\x3a\x24\x3e\x55\xff\x8e\x34\xb1\x49\x24\xf1\x81\xde\xe9\x2b\xad\x14\x64\xce\xa0\xe3\xd7\x04\x3e\x5b\x41\x8f\xa4\x62\xf8\xd0\x2b\x2a\x4e\xa8\x57\xe6\xe5\x48\x72\xfd\x24\x95\x05\xce\x7f\x2a\xe6\xba\x3b\xd9\x82\x5f\xa2\x7f\xe5\x12\xcc\x94\xeb\x2c\xcf\xb1\xaa\xc9\xb7\x55\xbd\x92\x0a\xec\x9f\x2b\x63\xa4\x4e\x42\xde\xa7\x99\x28\x61\x20\xfb\x11\x17\x0c\x1d\x50\x04\xba\xce\xd8\x09\x9c\x11\x70\x6f\x86\xbb\x6b\x9e\x94\x62\x51\x43\x3a\xa0\xf1\xd6\x8b\x4a\x00\xb4\xd1\x02\xb8\x55\xe5\x75\x91\xcb\x84\x50\xca\x33\x65\x17\x15\x38\x30\xbc\x4f\x23\x5e\x63\x3a\x01\xd6\xb8\x50\x66\x81\x59\x77\x60\x5e\x48\x5d\x0e\x34\x46\x51\x81\xe4\x1b\x9b\x33\x8e\xfa\x14\x71\x1f\x20\x39\x13\x51\xa8\x60\x0d\xb0\xe0\x6b\x26\xeb\xa2\x81\x34\x17\x1e\x32\xd6\x4a\x84\xa6\x84\xbf\x54\x62\xb6\x22\x39\x00\xb1\x65\x64\x70\x80\x49\xa3\x3f\x18\x4d\x8e\x08\xda\xd8\x5d\x0f\x73\xc4\x57\x38\xc1\xf4\x1e\x33\x2f\xc6\xb6\xd6\x36\x6f\xb1\xe6\xcb\xa4\x28\x4c\xc6\x84\x9d\x47\x70\x9a\xec\xfa\xc1\x1c\xc5\xd8\x39\xe6\xc6\x56\x86\xda\x5c\xc9\xa5\xf0\x80\x13\x5b\xe1\x67\x59\x9a\x0f\xe0\x8c\x7f\x02\xc8\x07\xbb\x69\x19\xb4\xa3\x75\x41\xcc\xd2\x9c\x27\xab\xac\x4a\xf2\xec\xdf\xac\x0f\xbe\xd3\xdb\x8b\x41\x28\x38\x69\x95\x0f\x43\xcb\x96\x22\xd1\x36\x6d\xcc\xd8\xd6\xd0\x45\x82\xbb\x91\x9d\x50\x1f\xdf\x32\x01\x90\x64\xd0\x4a\x86\xc5\x40\x20\x40\x6a\xb1\x43\x94\xac\x18\x3d\x5a\x87\x89\x26\x06\xed\x55\xba\xff\xf4\x0e\xa3\x72\x0c\x3b\x3e\xe6\x13\x0b\xe5\xa1\x07\x6e\xd3\x02\x8d\xa5\x2c\x83\x34\x22\xf8\xd8\xd9\x1a\x41\x69\x55\x76\x01\x1e\x3d\xac\x87\xa4\x9e\x72\xdb\x53\xa7\xe5\x02\x5b\x5f\x73\x65\x02\x37\xa5\x6e\x60\x42\xc8\x32\x80\x98\x8b\xc0\xb0\x9b\xa2\xfa\x54\xcc\xd6\x87\xf8\x6b\x4a\xa1\xa1\xc6\x3b\xe0\x17\x31\xef\x41\xa7\x98\x31\x04\xfc\xb4\x50\x54\xd0\xb7\x67\xe1\x92\x30\x44\xa6\xec\x28\x4f\xba\xff\x9a\xb0\xce\x35\xe1\x5f\xb0\x26\xac\x67\x4d\x4c\x57\xc1\x1e\x68\xc2\x50\x74\x2e\x0c\xeb\x5a\x98\x36\x14\x27\x1d\xa9\x66\xa3\x8f\x1a\xde\xff\x88\x61\xaa\xab\xe5\x96\x42\x57\x98\x29\x75\xc7\x99\x0d\x96\x42\x9f\x1a\x1f\x63\x9a\x4e\x06\xb8\x34\xc3\x38\x6b\x10\x65\xc5\x81\x40\x40\x48\x85\x01\x21\xc5\xda\x50\xd7\x2d\x97\x65\x93\x6d\xa2\xb5\x8d\x75\xb7\xbc\x90\xd0\x09\x3a\x90\xb7\x5e\x9a\x20\x30\xf8\xf2\x0d\x60\x06\x8e\xd0\xb4\x35\xf5\x70\x66\x4d\xf9\x3b\x33\x18\xc2\x01\x1e\xad\xd3\xbf\xb4\x94\xbc\x13\x76\xa8\xee\x57\xab\xb3\xb6\x5b\xbe\x26\x48\x46\x36\x54\xb4\xc8\xc5\x02\x8d\xe6\x8a\xef\x6a\xe1\x8c\xbe\x76\xc5\xde\x94\x37\xff\xbb\x14\x7a\x0d\x8b\xea\x42\xe6\x8b\x4c\x4b\x9a\x1f\xfe\xb4\xf7\xa7\x9d\x88\xbf\xad\xd7\x49\x01\xf9\x10\x11\xb0\x77\xc3\xc5\xd9\xc0\x7d\xc7\xf7\x72\x1f\xf7\x9d\x57\x32\xb2\x91\x14\x0c\xa4\xe8\xe5\x21\x36\x0b\x19\x46\x55\x98\xf1\x14\xfa\x20\xf0\xfe\x1c\xc6\xfc\xa7\x4b\x51\x74\xa8\xaa\x6e\x96\x21\xbd\x8f\xc0\x48\x01\xc6\x41\x89\x32\xc3\xf0\x33\xc5\x10\xc2\xd8\x1f\xcf\xd4\x4b\x10\xbc\x9b\x7b\xcd\x5a\xbd\xf6\x9d\xd1\xed\xc8\x4f\x73\xe5\x21\x87\x1a\x63\x3e\xcc\x38\x11\x0c\xdd\xa9\x0f\xed\x45\xe9\x6c\x41\x51\x37\x14\x94\x53\x82\x75\x7f\xa8\x28\x9c\xa7\xd7\x6b\x7e\x9d\x80\xc2\x29\x3e\x25\x5a\x6d\x89\x7a\x51\xd2\xd6\x3c\x15\xb3\xfa\x02\x02\xa5\xe8\xc7\x2d\xe5\x15\x01\x98\xc9\xa8\x43\x5a\x92\xec\xa3\xec\x47\xcb\x14\x17\xa0\x64\x33\x8f\x26\x52\x7f\xab\xd0\xb7\xae\xab\xac\x2e\x9d\x61\xe2\x20\xb3\xb7\x82\xd7\xd8\x5d\x8c\x78\x2f\x5d\x06\x0a\xbf\xcd\x40\xb1\x40\x65\xf9\xba\x49\x6b\x4e\xa7\xaa\x7d\x61\x75\x15\xdf\x3a\xfa\xb8\x8e\x8e\x34\x58\x30\xeb\xd5\x45\x99\xa4\xc2\x96\x8f\x87\x73\x67\xee\x14\x6d\x5e\x49\xbc\x0a\xa1\x1d\x22\x99\x27\x66\x1a\x90\xab\xfe\x6b\xf4\x63\x9b\xc6\xc2\xee\x32\x0e\x3d\xc5\x66\x87\xd8\xd9\x6d\x75\x11\x57\x3c\x14\xe3\x26\xeb\x6f\xe6\x4a\xde\x58\x7b\x5c\x6d\xec\x34\xab\x30\x9a\xd2\xa8\x16\x8a\xba\xee\xd3\x07\x59\x6f\xe9\xaf\xea\xff\x70\xc2\xeb\xde\x89\x35\xb6\x1a\xde\x8d\x18\xb4\xc7\xbd\x98\x0f\x9d\xae\x0c\xa9\xac\xf4\xe1\xeb\xb5\x51\xcb\x8d\xfa\xb0\x51\x47\xf7\xb5\x88\xe6\x19\x67\xc6\xcb\x89\xe3\xe3\x16\xda\x3e\xcc\xda\xb3\x2a\xfc\x87\x86\x0a\xef\xa7\xfd\xb0\x1e\x75\xda\x8f\x85\xc3\x58\x2b\xa2\xbe\x4b\xe6\x55\x48\xd3\x6f\xd3\x89\x3c\xe8\x96\xee\xa6\xfc\x0a\x7b\xdd\x29\x54\xb8\xf7\x63\x3e\x9d\xcb\x15\xbe\x8a\x0c\xdb\x06\x85\x50\x83\x45\x76\xea\xa7\xdb\x7e\x08\xab\xbc\xbb\xb4\x33\xe6\x23\xe4\x79\xba\x99\x16\xb3\x59\x89\xc0\x92\x41\xc3\x11\xef\x99\x61\xd6\x81\x4b\xef\x10\xa6\xba\xb2\xb0\x21\xd8\x5f\x55\x62\x89\x99\x9b\x36\x0f\x88\xdd\xae\x49\xf2\xb6\x26\xe9\xdf\x3c\x57\x32\x03\x28\x09\x86\xbc\x65\x3d\x55\x5b\x1f\x3c\x52\xb6\xce\x53\x8a\x60\xea\xbe\xb2\x66\xb7\xec\x34\x0c\x74\x6e\x34\xbf\x02\x04\xe6\x96\x80\x40\xd4\x24\xad\x57\xd9\xfc\x4c\x2f\xae\xeb\x33\x7b\x60\x56\x61\x3f\xb1\x07\xcb\xca\x52\x5c\x49\xdc\x46\x08\x05\xd7\x41\x99\xe4\x05\xf3\x6e\x33\x8b\xd8\xa9\xd1\x7c\xc5\x1a\xc2\xc2\x8e\xab\x22\xba\x9b\xc6\x1f\xda\xd3\x82\x05\x0b\x15\xc4\x13\x5e\x22\xa7\x9d\x6d\xad\x81\xb2\xda\x54\x2f\x50\x10\x9a\xe8\x03\x88\x65\xeb\x58\x22\x72\x37\x66\x63\x12\x18\x09\x21\xb8\x02\xdb\x56\x87\x8d\xe4\x38\xbc\x28\x84\xdf\x32\x85\x50\xc0\x1a\x60\x15\x0c\xc5\xeb\xe7\xa6\xfa\xf7\x3a\x17\x7c\x6b\xb8\x65\x85\x30\x76\xc9\x74\x43\x96\x7e\x2f\x98\x43\x67\xe9\x38\xb9\x1f\x85\x58\x69\x6b\x44\x4b\x14\xca\xb1\x84\x36\x1a\x5d\x02\x99\x8f\x4e\x14\x48\x15\x69\xa6\x0d\xa1\x71\x41\x6e\x9e\x99\x32\x39\x64\x3e\x2b\xe5\x2b\x9c\xf7\x7b\xa3\xc2\x87\x7d\xfe\x10\x60\x6d\xbe\x62\xcc\x78\x34\xee\x74\x62\xb7\x13\xe5\xe2\x32\xb3\xb5\xb1\x96\x24\x5a\x3c\x8c\xa0\x0c\xc9\xc9\x07\x74\x85\x18\xf1\x1a\x44\xc4\x02\x69\x71\x54\xdc\xfe\x90\x88\xfa\x48\x29\x14\xa0\x81\x5e\x5f\xca\x5c\x44\x2c\xa9\x78\x21\x6d\xc8\x4b\x2f\x5f\x9e\x7b\x78\xcc\x90\x8f\x79\x17\x2f\xa9\x65\x80\x8b\x4c\x56\x4e\xe6\x33\x94\x86\x64\xa3\xad\x77\x34\x55\x29\xd6\x98\x52\x5a\x17\x0b\x29\xaf\x1b\x68\xdb\x7f\x91\xbb\xc9\x2a\x83\xfd\xad\x75\x4d\x2d\x4e\x60\x42\x02\xeb\x8a\xa5\x42\x9b\xa4\xe6\xdb\x0d\x04\x99\x60\x31\x31\x96\xe8\x47\xd1\xdc\x0e\x41\x22\xa8\xa4\x2c\x21\x63\x16\x5e\xe3\x83\xe7\x76\x79\x4e\x1a\x88\xcc\xfa\x40\x1a\xf4\x54\x76\x87\xa3\xcc\xfb\x8e\x72\xe3\x24\xb2\xe0\x24\xbe\xde\xb2\x2a\xf2\x86\x83\xc8\xfb\x0e\x22\x33\x09\xb4\x4d\xfa\x0b\x06\x09\xb5\x17\x60\xe5\x5a\x86\x3e\x20\x24\xaf\xc2\x7c\x70\x82\x7c\x92\x92\x2c\x7c\x73\x1f\x6b\x69\x9d\x1b\x2c\x3a\xd6\xb6\x67\x15\xdf\x36\x9e\x10\xe8\xbd\x03\xd4\x74\xec\x8f\x38\xef\xed\x67\x07\x8d\xc0\x2f\xa2\xf2\xa3\x05\x96\x15\x17\xb9\x65\x90\x87\x1a\x54\xf4\xa9\x43\x1a\xb5\x45\x01\x05\x2c\x76\xc2\xc8\xc1\x6d\xfb\x05\x20\x73\xa1\xd5\x95\x14\x6b\xd6\xd0\x17\xf0\x7a\x7d\x46\x5c\x25\xf6\x5e\xf5\xd0\x06\x89\x6c\x27\xcf\xc3\x1b\x91\x84\xab\x2c\x10\xdf\x1a\x20\x2d\xf4\xce\xa0\xfa\x02\x77\x91\x5b\x6a\xc2\xf0\xca\x0c\x2e\xc5\xf0\x06\xc5\x94\x35\xef\x12\x35\xdd\xba\xfb\x95\x69\x22\xfb\x3d\xdc\x4e\x1f\x64\x0d\xc9\xd3\xf7\xbe\x39\x7b\xce\xff\x5d\xc3\x39\x81\x4e\xf3\x3c\x76\x8b\xe3\x25\x6c\xf9\x6b\xd0\x74\x33\x75\xd6\xe3\xdc\xfd\xad\x06\xf6\x1f\x9c\xd8\x10\x6e\x40\xaf\xae\xf4\xf9\x41\x08\x9b\x0a\xdd\x2b\xa5\xdf\x1e\x11\xae\x02\x70\x61\x29\xae\x08\x18\xbd\x83\x2f\x17\x68\x30\x3f\x34\x89\x27\x00\x51\xac\xe7\xee\x89\x98\x02\x2e\x1d\x28\x1b\x31\xfa\xeb\x4a\xab\x88\x55\xd5\x4e\xde\xe7\xfe\xde\xfd\x21\xe6\x43\x47\xed\x81\x16\x03\x6b\xa1\x08\x73\x42\x11\x96\x05\x60\x0d\xfb\x0a\x19\x25\x78\xd1\x1d\xdd\x84\x18\x66\xfe\x2d\xed\x81\xd2\x02\x83\x81\x28\xb4\x79\x11\x75\xa3\x0c\x7b\x3e\x0d\x8b\xed\x1d\x54\xc4\xc1\xd5\x03\x76\xc5\x6d\x88\x89\xe1\x35\xad\xef\xbc\x2d\x6f\xcc\xc0\xf9\xb9\x35\x30\x5f\x0c\xd1\x8c\x43\x3f\x88\x45\x32\xb6\x10\xb8\x92\x11\x92\xb1\xb9\xe7\x3d\x24\x63\xbc\x05\xe8\xcf\x10\xd5\xa3\x05\xa2\x99\x0b\x93\x2e\x3c\x04\x63\x4c\xdd\x0b\x7b\xf3\x48\x79\xf5\x71\x21\xa8\x71\x73\x2c\x1c\x51\x71\x2c\x54\xea\x87\x10\xb1\x78\x23\x14\x6a\xc4\x53\xb1\x10\x20\x9c\x52\x7e\x29\x73\x48\xe2\xe9\xf0\x07\x18\xe5\x30\x44\xeb\x2b\x97\x10\x4a\xe9\xc7\x4a\x65\xe8\x54\x36\x25\xb2\x00\x0d\xd1\x28\xcb\x69\xbf\xab\xed\x1d\x47\x24\x13\xe6\x2d\x71\xef\x64\xe0\x2e\x6f\x41\x7d\x99\x2d\x89\xa9\xa0\xbe\xd5\xb5\xc1\xd8\xa3\xc4\xc6\xad\x44\xf1\x4c\x6d\x99\x9d\x6f\x2e\x39\xdb\x24\xe9\xa6\x1f\xb3\x22\xf5\x5d\xc1\x5d\x25\x61\xf4\x4c\xe6\x57\x33\x79\x9d\x61\x20\xcf\xe5\x02\x16\x65\x5e\xa9\x88\x2f\x45\x39\xbf\x4c\x8a\x0a\x6b\x18\x17\x19\xc5\xd1\x7c\x8d\xcd\x86\x8e\x4b\x38\xa9\x14\x85\x80\x18\xd2\x19\xf0\xdf\x56\x59\x29\x78\x99\xa9\x8f\xa0\x8c\xe2\xae\xff\xb9\x4e\x60\xa1\xc0\x44\x47\x4e\x43\xdf\x93\xe0\x4f\x10\x4c\xbd\x35\xee\x5f\xc4\x0e\xed\x80\x31\x64\x0d\xd4\x8a\xa9\x36\xbb\x97\xe8\x88\x35\x82\x57\x5f\x1b\x77\x5e\x62\x06\x8a\xaf\x55\x3c\x21\x1a\x0d\x65\x1b\x66\x73\xb5\x0b\x7a\x6c\xb9\xb5\xb7\x00\xb7\xd5\xe4\x99\x47\x16\x50\x8e\xa5\xe0\xd9\x0b\x29\x53\x6d\x72\x47\xf6\x2f\x69\x52\x25\x11\x96\x58\xab\x4a\xae\x56\xc9\x85\x88\x5c\x71\xf0\x22\xc9\xf2\x1a\x55\x84\x65\x92\x2f\xea\xc2\x96\x11\xf9\x88\x41\x06\x5b\xd7\xd6\x0e\xdb\xde\x96\x4c\xbf\x47\x28\xc2\x08\xd6\x7b\xc5\xb8\xb6\x43\xfa\xf6\xb0\x74\xcb\xc3\x3d\xa1\x45\xac\x55\x4b\x01\xa7\x90\xe7\x4e\xcc\xcf\x0c\x30\x5e\xc3\xf5\x92\x4a\x81\x89\x11\x5d\xb4\x80\xa6\x38\xca\xa7\x07\x44\x26\xc0\x22\x59\x0a\xf4\x2d\xa5\x12\xc2\x00\xf0\x07\xbe\xf5\x7e\x78\x76\x3a\xdc\x8a\xf8\xd6\x68\x78\x38\xe5\xef\x93\xaa\x4c\xf8\x61\x52\x25\xe8\x33\xd2\x1f\x1c\x0c\xa7\xf1\xc1\xf0\x70\xa4\xff\xdb\xf7\xb4\x6e\x45\x6c\x4b\xae\x44\x31\x4f\xd4\x3c\x49\x45\x3c\x97\x4b\x34\x42\x83\xbf\xca\xf2\xa2\xa1\x10\xf7\xf5\x4d\x2b\xc8\x7e\xd7\x20\xee\x2a\x4b\x17\x71\xec\x8b\xcd\xe8\x09\xdb\x8d\xb9\x4d\x9d\x44\x19\xd1\xde\xb4\x98\x21\xa8\x3c\x3c\xa8\x88\x03\xd9\x0c\x15\x0d\x54\xa2\x14\x0a\x7d\x69\xd6\x80\x0d\x1d\x9d\x61\x86\x78\x29\x96\xf2\xaa\xe9\x14\xf8\xe5\xb3\x29\xc2\xc0\x24\x0e\xb4\xea\x15\x28\x09\x64\x5b\x51\xfc\xbb\x63\xd9\xf7\x10\x2a\xac\xb1\xe2\x1e\x8b\x22\x05\xf5\x50\x86\x40\x0d\x81\xd0\x92\xc0\xdd\x85\x4b\x8a\x40\xac\x10\x05\x49\x2e\x98\x49\x47\x81\x54\x8d\x2b\xe1\xe1\xd4\x6f\x8c\x3b\x86\xbe\xc1\x96\x47\x82\x3a\xbc\x1f\x60\x9b\x31\x36\x2e\xd0\x52\x0e\xb1\x65\x22\x02\x9e\x46\x39\xed\x95\x3a\xec\x1b\x64\x99\x00\x1a\x21\x5b\x02\x9d\x57\x25\x80\x62\x52\xae\x60\xef\x2c\x6a\x28\x3e\x0e\x75\x58\x6c\x3c\xc8\x17\x0d\x13\x6a\x5a\x89\x15\x4d\xf9\x48\x2b\x9d\x0a\x55\x95\x72\xbd\xd9\xf7\x43\x81\x58\x0a\x89\x02\x6c\xb2\x20\x84\x04\xab\x71\xb7\xf1\xec\x9a\xed\xe0\xb6\x70\x90\x37\x06\xce\xce\x62\x93\xdd\x01\xcf\xa6\x0f\xe3\xce\xaa\xbe\x63\xc7\x10\x17\x39\x28\xa2\x67\x11\xff\x93\x6e\x78\x77\x37\xd2\x4b\x87\x98\x04\xbb\xcf\xe2\x16\xbe\x59\x84\x49\x3e\x89\x32\x05\xa6\x1e\x3a\x5e\x13\x5a\x67\x33\x1c\x9e\xb9\xee\x60\x3b\x32\xaa\xab\xd4\xc3\xde\xde\x7d\x36\xe0\x6b\x7d\x34\x68\x2b\x3d\x0d\x11\x7e\x2b\x87\xb6\xd4\x77\x9e\x7d\x6c\x5f\x8f\x5a\xbf\x6d\x2a\xfa\xc0\xbf\x0c\xf9\xfe\x01\xb1\x37\x0c\x62\xf4\xc1\xf5\xf2\x1e\xb8\xde\x06\xeb\x55\x5b\x07\xef\x83\xec\xbd\x25\x45\x27\xf1\x50\x76\x4b\x2b\xd1\xc3\xbe\xde\x0a\xd4\xcb\xfa\x98\x07\x03\xa4\xde\x4d\x12\xf5\x59\x03\x14\x02\x8a\x55\x77\xf9\xa9\xc0\xba\x2a\x53\xcf\xaa\x9b\x38\x21\xe7\xd2\x59\xa8\xd4\x53\x95\x76\x58\xd0\x4d\x6c\xca\xfa\x2c\x26\xff\x1f\x7b\xff\xb6\xdc\x36\x92\xa6\x8d\xc2\xe7\x79\x15\xf9\x33\xe2\x0f\x8b\x11\x10\xca\x92\x5d\x55\xdd\xae\x2f\xbe\x58\xb4\x44\xdb\xec\x96\x48\x7d\x24\x55\x2e\x7f\x1d\x1d\xdd\x49\x22\x29\xa1\x0d\x02\x6c\x24\x28\x99\x73\x34\xf7\x30\xb7\xb0\xd6\xc1\xdc\xc6\x9a\x3b\x99\x2b\x59\x91\xef\x26\x37\x00\x28\xb9\xba\xa6\x7b\xd6\xac\x29\x1d\x54\xb8\x24\x12\xc8\x7d\xbe\x9b\xe7\x7d\x9e\x52\xaa\x3b\x5d\xae\x0f\x09\x0c\x30\x15\xc9\x26\xf2\x2f\x55\x0e\x4c\xc3\x65\xb3\xaf\x75\x7c\x77\xb0\x6e\x1f\xe6\x82\xb8\x6c\x0c\x48\x11\x89\x06\x86\x6b\xe0\x7b\xbb\xe6\x0d\x6a\xd7\xba\x40\x46\xc9\x67\x76\x6b\x55\x1f\x12\xc1\x95\xc3\x2e\xb4\x02\x54\x91\x50\xe9\xc2\x20\xb7\x40\x24\x15\xab\x79\xcf\xe5\xa4\xcc\xf4\x4e\x23\x15\xd8\x65\x00\x86\x3c\xa6\xee\x0a\x2d\xc9\xb7\x3b\x95\xd7\xfd\x70\x9f\x17\xc6\x93\x24\x13\xe6\x23\xf1\xe0\x2a\xc2\x5b\x92\x1e\x33\xb4\xc6\xf0\x2f\x61\xf3\xe5\x4d\x22\xec\x6d\xab\x1b\x0a\x41\xb1\x8b\xda\x78\x24\x67\x55\x7b\x5d\x00\xac\xd9\x47\x93\x12\x7d\x36\x85\x6a\x04\x44\x24\x2c\xd8\x60\xb2\xfe\x40\x12\x0d\x01\xe4\x31\x75\x83\x0e\x5d\xd2\x8e\x19\xf6\x44\x9c\x12\xf1\x54\x23\x9c\xd3\xc6\x5d\xf4\x81\x8b\x9e\xfe\xe0\xf8\xbf\x92\x0b\xeb\xf1\xb1\x1f\x33\xd9\xb4\x70\x6b\x10\x6a\x26\x5a\x0a\x6a\x6d\xd9\xc4\x1c\x18\x9b\xbc\xcc\x28\xb9\x7e\x8c\xa9\x24\x09\x92\xdd\x3e\xd9\x87\xd1\xdf\x16\x6d\x09\x04\xb4\x5a\x0f\xd2\xf1\xe4\xaf\x34\x73\x92\x64\xfd\x0c\xfd\x18\x1a\x40\x92\x7e\xeb\xbf\xa2\x1b\x40\xb4\xa4\x00\x8c\x5a\x57\x65\xb5\xcd\xd7\x54\x75\x4e\xb5\x54\xe0\xb1\x3b\x74\x80\x8b\x32\x3b\xc2\x58\x30\x16\x32\x5d\x77\x38\x04\xa0\x55\xee\xf4\xca\x4b\xb9\xd9\x17\x85\x84\x16\x92\x4b\xdc\x00\x47\xe9\x78\xea\x68\xb1\x96\xe3\xf9\x35\xb0\xa4\x89\x8b\xd9\xf4\x72\x82\x2c\x52\x2d\x12\xdd\x16\x38\x19\x38\x81\xde\xd5\xba\x84\x6c\xf7\x3a\xff\xb7\x7f\x6d\xfe\xed\x5f\x6d\x33\x99\x97\xd4\xae\xb8\x5d\x91\x6f\xf2\x7f\xfb\x57\x00\xb5\xc2\xee\x01\xa5\xac\xbb\xdc\x58\x63\x2d\x13\xf7\x5a\x65\x04\x68\x69\xe3\x59\xe4\xcf\xc3\xb3\xa0\x34\xc0\x13\xf8\x98\x9f\xf9\xbc\x54\x4c\x1a\x23\x1f\xf5\x4a\x9a\xbc\x01\x1b\x0e\xf4\xa4\xec\x11\xd8\xc4\x90\x41\x7b\x53\x63\x19\x5d\x6c\x4c\x0b\xf1\xb5\x60\xf0\x30\x0d\x14\xd5\x4a\xc6\xa5\x92\xb9\x69\x57\x4a\x3e\xfd\x02\x17\xca\x44\x8e\x52\xfa\xbf\x41\xab\x4e\x92\x2f\xa8\xde\x57\xba\x1a\x48\xf1\x64\x0d\x24\x41\x70\x29\x8e\x72\xb4\x04\xb2\x3d\x40\x44\xca\x92\x81\x7a\x54\x07\x9e\xbb\x37\x0c\xcc\x65\x31\xbd\x7e\x33\xa2\x17\xa9\x91\x3f\x8b\x9f\x12\xbf\x70\x7d\x40\xad\x75\x9c\xe5\x03\xa2\x8d\xc0\x91\x88\xb6\xcb\x62\xb4\x48\xe4\xf9\xcb\x97\x67\x68\x62\x3a\xd5\x38\xaa\xe5\x92\x83\xee\xf3\xd8\x95\xed\x82\xcd\x7b\xab\x42\xdb\x9f\x00\xfb\x59\x0c\xa0\x2e\xf4\x68\xf4\x44\x46\xd1\x93\xa3\x37\x2f\x45\xb0\x04\xa7\x40\xd0\x0b\x0b\x35\xbe\xe0\x6c\x7a\x3a\xfa\x12\xc4\x26\x73\x0d\xd6\x92\x0f\xaf\xc0\x79\x0f\x11\x96\xd2\x85\xb4\x9e\x8f\xb2\x20\xd9\xb2\xc3\x80\x9b\x67\x8a\x57\xfb\x03\xcf\xed\x42\x56\xf1\x6c\x21\xeb\x20\x15\x40\xe1\x55\x6d\x64\xbc\x77\x7f\xfe\x8e\x7f\x3b\x10\x62\xf0\xeb\x96\xff\xff\xcc\x96\x0f\xa7\xe7\x99\x2d\x2f\xda\x1a\x48\x55\x4f\xaf\xbc\xa3\xc9\x44\xcd\x7f\x3a\xf2\x93\xb6\x1e\x67\x8f\x83\xa8\x6d\x7f\xf8\xa4\x51\x47\x22\x10\xcf\xf9\xe3\xb1\xa6\x2d\xbf\x02\xa0\xf7\x95\x07\x94\x78\xf2\x80\x92\x3f\xe7\x80\x12\xcf\x1d\x50\xf2\x6b\x0f\xa8\xde\xe8\x64\x7c\x40\xc9\x9f\x73\x40\x89\xff\x77\x1d\x50\x3d\xe7\xd3\xdb\xc1\xaf\x45\xa3\x7f\xf7\x9f\xf4\x9b\xb7\x5a\xd7\x10\x12\xfc\xbb\x15\x80\x3e\x53\xff\xff\xf2\xf5\xd9\xcb\x56\xfd\xe7\xab\x57\xdf\xbe\xfe\xb5\xfe\xf3\x1f\xf1\x33\xb0\xce\xd4\xdb\xf1\x78\x7e\xfa\x71\x34\x77\x62\x2c\x03\x79\x32\xd7\xe4\x41\xbe\x3e\x1f\xbe\x11\xe2\x7f\xec\xee\x3f\xff\x1f\xef\x6a\xad\xdf\x2e\x2e\xd3\xd9\xfc\xfd\xff\x94\x8f\x75\xd5\x04\x4c\x25\xc0\x8d\x0b\x62\xc7\xca\x10\xd9\x12\x25\x29\x73\xa7\x45\x00\xea\x47\xaa\x14\x59\x25\x1f\xef\x55\xe3\x64\x8a\xa1\x14\x8c\xae\x6c\x6b\x41\x34\xfb\x0d\xd2\x77\x3e\x6a\xb9\xd5\xba\x41\x49\xbb\x4c\x1d\xbc\xa4\x6a\x73\x9f\x97\x9f\xa9\x0a\xce\x7e\x1c\x12\x4f\x40\x33\x9a\x37\x09\xbf\x48\xae\xf6\x07\xb9\xd5\x52\xd9\x0b\xa9\xc6\x18\x63\xb3\xaf\x4b\x79\x53\xed\x8b\xd3\x0f\xba\x84\x33\xea\xf7\x6a\xbb\xfb\x6f\x7b\xd2\xa4\xdf\xbc\x5d\x5c\x9e\xde\xb8\x98\xfd\xdf\xe3\x14\x78\x7a\xff\x9f\xbd\x3e\x7b\xdd\xe6\xff\x78\xfd\xea\xbb\xf3\x5f\xf7\xff\x3f\xe2\xe7\xed\xe2\x52\xfa\xd9\xf7\x06\xff\x3b\xbd\xaa\xf7\xaa\x3e\x58\x73\xf0\x5c\xde\xd4\x5a\x6d\x57\x85\x16\xe2\x94\x7e\xd0\xe0\x7a\xab\xeb\xcf\xba\xd0\x07\x9f\x6d\x88\x34\x4a\x4f\x06\x6f\x17\x97\x83\x61\x54\xc1\x0c\xe5\x1e\xa5\x04\x90\x25\x46\x94\xf2\x07\x2d\xa0\x28\xcc\xda\x03\x10\xa1\x97\xc8\x8a\x81\xd1\x0a\x34\x5c\xa0\x76\xd8\xec\x6a\x8c\xbf\x60\xaa\x35\xe0\xd2\x5c\x55\xcd\x7d\x48\xcc\xcc\xb8\xe0\x20\x9d\xca\xb1\x3e\xa4\xa6\x64\x05\x43\x0d\xa9\xb2\x0a\x8a\x9b\xf3\xad\xed\x30\x46\xb1\x48\x45\xa6\xa9\x04\x55\xa8\x40\xeb\xa0\xbe\x59\x15\x2e\x1b\x6e\x4d\x3d\x87\x7f\xf4\xe5\xb3\x88\x90\x53\xf5\xdd\x9e\xea\xdd\x31\x04\x53\x6b\x54\xea\x90\x2b\x0d\x55\x6f\x1e\xa9\xa3\x10\xcc\x61\x27\xc3\x05\x5a\xa1\x94\x85\x40\x3a\x26\xac\x93\x31\xcc\x57\x6c\x74\xe6\xe5\xde\x01\xd2\x0b\x81\xb4\x7b\x5d\xec\xbc\x59\x9a\x67\x5a\x15\xd5\x1d\x71\x2e\xca\xad\x6e\x54\x61\x5d\x3b\x0c\x91\xab\x1c\xac\x3d\x08\xa4\x83\x8c\x75\x94\x7a\x00\x21\x08\xb0\xf2\x2b\x83\x38\x34\x86\x2d\x3b\xb5\x44\x5f\x31\xae\x5c\x4a\x61\x57\x57\xd6\xb2\xcc\x24\xb0\x55\xaa\x3a\x33\x48\xf4\xc6\x99\xba\xe5\xc5\xcd\x37\x93\x1b\x94\x7f\x2b\x0e\x32\x2f\x8a\xbd\x6d\x4a\xc3\x20\x07\x04\x0e\x0a\x2c\x3c\xc8\x1f\x74\x6d\x50\x23\xc5\x8d\x74\xeb\x9d\xb2\xd0\x2a\x23\x75\x3f\xb5\xcb\xb3\x56\xa5\x83\x6b\x85\x38\x3d\x95\xd5\xa6\xd1\x25\x08\x52\xc8\x95\x06\x7c\x15\x56\xdb\x9a\x86\x56\x96\x92\x19\x70\x14\x6b\xf7\x3d\x79\xa2\xef\x12\x39\x5b\x4c\x64\xa9\x1b\x58\x78\xdb\x2a\xd3\x85\x19\xa6\x42\x7c\x64\x3f\x13\x5f\xbc\xab\xab\x22\xdf\xe8\x40\x1d\x85\xf7\x85\xc3\xe8\x7a\xd3\xf7\xfd\xf4\x56\xbe\xa7\x05\x15\x7b\xc3\x89\xbc\x67\x20\x11\xbb\xbd\x79\xb9\xb7\x03\xba\x5f\xaf\xb5\xf1\x09\xa7\xba\x42\x9f\x7b\xad\x00\x7a\x07\x1a\x1f\x7f\xdd\x6b\x03\x27\xb9\x78\x9f\x3f\xe8\xd2\xe3\x46\xc0\x95\xe0\xa0\xb0\x92\x1b\xfd\x28\x8b\xbc\x44\xb7\x61\xf0\xfe\xe6\xea\x14\x00\x9e\x3a\x1b\xe0\xee\x42\xc1\x10\x59\xa8\xfa\x4e\xd7\x62\x55\x65\x07\xb7\xf1\x60\x99\x91\x60\x31\x5c\xaa\x48\xcf\xac\xb3\x38\x19\x7a\x7a\x0a\xd7\xf5\x9d\x6f\x06\x25\x55\x85\x7f\x0a\x29\xd6\xaf\xf6\x79\x41\xf2\x37\x10\x08\x70\x4d\xe1\x0a\x1e\x87\x3e\x6e\xee\xf5\x16\xc8\xf3\xec\x22\x85\x02\x59\x4a\x8b\xdb\x33\x83\xc9\x6a\x01\x21\x7c\x7a\x8a\x9b\x8e\x92\xa8\xfa\x01\x39\xeb\x5b\xd0\x13\x12\xd2\x07\xb8\x9e\x11\xa0\xa4\x9f\x44\xd2\x8a\x94\xcf\xa6\xa4\xe4\x5d\xa5\x0a\x22\x5d\x78\xc8\x33\x3e\x9f\x1a\x62\x37\xa0\x03\x6a\x6f\xd4\x9d\xf6\x89\x4c\xdb\x5b\xbb\x21\xcd\xbd\x7d\xde\xdd\xde\xae\xa9\x48\x64\xc8\x8f\xfe\x20\x15\x71\x2e\xb5\x2a\x81\x4c\x40\xe6\x5b\x75\x97\x97\x8e\xbc\x91\x39\x91\x30\xb9\x6b\xfd\x49\xdb\xe3\xd5\x41\xba\xc2\x22\x28\x0c\x31\x1a\xd9\x0c\x4e\x48\x72\xf7\x20\xd7\x85\xdd\x99\xa7\x08\xc9\x1e\x62\xb9\x17\x74\xda\xb5\x2f\xe8\xef\xd6\xe8\xe2\x41\x3b\x4a\x42\xc0\x30\xd7\xb9\x21\x1e\x65\xdb\x68\xb7\xac\x31\xb7\x91\x83\x96\xf6\xc7\xfb\xbc\xe0\x94\xa1\xfe\x42\xc4\xf9\x5e\x6f\xcd\xda\x6c\xf8\x4a\xa8\xdf\xc4\xa4\x98\x75\x37\x69\x7a\x73\x54\x98\x0e\x04\xa3\x39\x0b\x57\x59\xb7\xde\x1d\x90\xf9\xc6\x33\x2e\x08\x78\x8f\xdb\x5e\x38\x2c\x70\x24\xae\xe1\x4d\x81\xf2\x2b\x3c\x31\x3a\x4e\x57\x6a\x4d\xcb\x1d\xde\x2e\xaa\xc7\x52\x9e\xf8\x9b\x63\x18\xa6\x89\x50\xaf\xe7\x20\xb7\x10\xa4\x58\x69\xb9\x51\x44\xd2\xeb\x99\x23\x18\x7a\x00\xf8\x46\xb8\x85\x60\xd0\xa3\xcd\x41\xf0\x6a\x2c\x59\xa8\x1e\x58\x01\xc8\x24\xd6\xe6\xdd\xed\x99\x33\x1f\x76\xf9\xa0\xff\x92\x1e\xbc\x91\x23\xd7\x7f\xc4\xbc\x63\x42\xc7\x59\xde\xc8\xfd\x91\x55\xdb\x50\xdf\xa6\x75\xd1\x70\xb2\x98\x67\x12\xf6\x26\x94\x60\xd0\xa5\xfb\xa0\xea\x5c\xe3\x5d\x67\x74\x63\xe7\xd2\x24\x78\xdf\xb6\x2e\xd8\x58\xfa\x00\x48\x45\x90\xfd\x32\x64\x27\x81\x9d\x0f\xf9\x71\x4a\xb0\xd0\x8e\x5d\x87\xe0\x3d\x3e\x50\xfc\x75\x90\x55\x5b\x8a\xf1\xec\x6a\xbd\xb6\x4b\xb0\x37\xf0\x80\x54\xeb\xbb\x76\x35\x1d\x86\x4a\xb2\x08\xb8\x21\x30\x1f\x92\x0a\x01\xa3\x3b\x9f\x2d\x51\xc4\x91\x5d\x20\x9f\x61\x92\x41\x86\xe9\x1d\x28\x8e\xdc\x7c\x02\x89\x19\xa7\x8f\x03\x72\x30\xa3\xe9\xa5\xb8\x9e\x5d\x4e\xde\x4d\x2e\x50\x61\xe4\xf4\x17\xfe\x40\x5a\xfc\x65\x44\x46\x91\x0a\xa1\x86\x72\xc0\x05\xe1\x09\x32\x72\x26\x78\x1d\x3b\x7a\x4c\x2e\xe4\xad\xf0\xe8\x39\x12\x85\x47\x28\x6f\x97\x09\x67\x35\x94\x23\x39\x80\x2f\xae\x94\xc1\xa8\x17\x24\xdd\x8f\xbf\x94\xe8\x19\x83\x4f\x39\x05\x25\x9f\x83\x85\x27\x32\x85\x77\x48\x52\x0c\xfd\x94\x52\xae\x87\x32\xaa\xf0\xee\x7b\x13\xec\x17\x14\x02\xe0\xb4\xbe\x6c\xbd\xc3\xb8\x07\x66\x43\x28\xf2\xec\x6d\xb1\x5a\xdf\x3b\xb6\x16\x47\xfb\x01\x55\x88\x6c\x0e\xf1\xfe\xc0\x60\x96\x71\xb0\xab\xaf\x58\x5b\x0e\xa7\x80\x83\x91\x8a\x19\x0a\xe7\x59\x5b\x17\xa8\xd0\xe1\x4a\xaa\xf6\x8d\xc9\x33\xdd\x83\x53\xa6\x57\xff\x00\x56\x13\x75\xb7\xde\x97\x4e\xef\x82\x07\x99\x18\x8b\xfc\xfd\xeb\x13\x22\xd5\xbe\x81\x53\x84\xb9\x84\x83\xaf\x10\x2a\x4b\xa0\x88\x30\x97\x55\x53\x79\x79\x28\xca\x22\x8f\x2e\x82\x94\x4b\x5d\x7f\xd4\xf5\x4a\x35\xf9\x96\x40\x4c\x69\x00\x0d\xaf\x76\x87\x16\x13\xb6\x35\xfa\xc3\x4f\xb7\x86\xc9\x07\x0e\x80\xa5\x59\x58\x47\x9e\x54\x02\xb6\x3a\xcb\xf7\xdb\x24\xae\xa5\x43\x2f\xbf\x2a\xcd\x2e\x5f\xef\xab\xbd\x21\xde\x9c\x40\xd2\xa1\x70\x78\x1d\x51\x11\x51\x2d\x35\x2b\xfc\x54\x87\xdf\xef\x87\x4e\x61\x5a\xe3\xa8\x8e\xcd\x2f\xac\x43\x73\x16\x11\x92\xfa\x51\x4d\x7e\x1b\x51\xee\x46\xa4\xbf\x4e\x4d\x41\x9c\xc5\xe5\x38\xa2\x49\x79\x95\xc6\x84\x03\x98\xc0\x88\xec\x32\xda\x84\x78\x29\xf9\x8d\xcf\x33\x47\xc2\xd8\x50\x12\xc4\xa4\xb4\xbd\x13\xd6\x66\x3a\xa7\x2c\x3f\x61\x54\xdb\x7b\xdf\xf4\x4d\x1f\x44\x77\xe2\xec\xb4\x3f\xce\xdf\xc0\x69\xb7\xbc\xef\xce\x50\xab\x42\xaa\xb5\x3a\x9d\xd4\xbd\x2b\x3d\xc1\x32\xd9\xb6\x84\x7f\x50\x97\x96\x74\x74\x79\xb0\x9e\x02\x27\x68\xab\x1a\x5d\xe7\xaa\xf0\xa0\x42\x01\xf7\x23\x71\x08\x39\x12\x7a\x30\xe6\x42\x8e\xc8\xb2\xaa\xb7\xe0\xbb\x04\x47\x30\x1e\xb1\xb6\x57\xed\xc3\x91\x9b\xed\x1c\x23\x64\x2c\xce\x11\xc6\x64\x1f\x1e\x5a\xa6\xa8\xc0\x2d\x38\x47\x86\xa8\xa7\x0d\x3a\x85\xbc\x32\xb8\x88\x1f\x9e\x9f\x0a\xb1\xc6\x17\xc7\x35\xb2\xce\x58\xea\x34\xa8\x45\xdb\x8b\x75\x53\x0c\x4e\xb2\x37\x3b\x12\x7d\xc3\x57\xc3\x05\x56\x6d\x1c\x7c\xb2\xff\x70\x7e\xfd\xb5\x8b\x34\xb4\xf8\x7e\x5d\xa2\xff\xd8\x25\xea\xca\x4d\xdc\x7a\x0c\x8b\x30\x11\x9d\x49\x2a\x66\x8d\x67\xfa\x06\xd6\x12\x83\xc9\x3f\x82\x34\xf3\xf9\x04\xe3\x04\xd0\x9e\xcc\x5a\xa8\x85\x91\xa5\xd6\x19\xac\x5e\xa6\x58\xca\x21\xb7\x2a\xdb\xc3\xe0\xa9\x19\x44\xc4\x6c\xda\x99\x30\x38\xe3\xa3\x8f\xc0\x8d\x47\x1d\x00\x18\x97\xdb\x4c\x82\xa9\xdb\xeb\xfd\xda\x67\x20\xdd\xab\xab\x92\x7c\xc3\xa6\xdd\x6a\x5a\x62\xdb\x0e\x0b\xb9\x75\x07\xaa\x7d\x99\xe1\x4e\xf3\xe3\xa7\x58\x7c\x9e\xc2\x56\xb4\xb2\xe2\xb2\x61\xba\xa9\x12\xda\xd9\x25\x16\xf2\xca\x0a\x24\x61\x80\x76\xc5\xe9\xe2\xa3\x1c\x0a\x2c\x5e\xe6\xf0\xe8\xda\x5e\xf8\x9d\x18\x2c\x26\x7a\x4a\x85\x65\x58\x29\xdc\x5f\xc4\xdb\x83\xfe\x8c\xd4\x78\xb8\xc8\x71\x82\xa4\xdc\x41\xfc\x25\xd8\xb3\x21\xc7\x79\x6b\x43\xb6\x1a\xde\xde\x95\x94\xe2\x17\xcf\x72\x2e\x38\xa6\xb9\x8b\xaa\x24\x5c\x6a\x71\x48\x7c\xed\x0f\xa9\x43\x5b\x4f\xcd\x0b\xa3\x2a\xc3\x64\xe2\xc7\x18\x32\x7a\xe8\x22\xb1\xbe\x70\x3a\x73\xf2\xee\xd6\x6a\xfc\x30\x59\xc8\xc5\xec\xdd\x12\x32\x29\x93\x05\x68\xd4\x4f\x2e\xc7\x97\x2e\x63\x0c\x52\x91\xd3\x4f\x3d\xaa\xfe\x81\x6a\x7f\x12\xa8\x58\x8a\xb7\xb7\x4b\x10\x46\x04\xe1\xc2\xf1\xa5\x5c\xce\x12\x80\xbf\x75\xbf\x26\x67\xef\x02\x05\xff\x89\x53\xdc\x7f\x37\x59\x4e\xc7\x0b\xd4\xbc\xec\xd5\xf2\xb7\x8d\x75\x3a\xf1\x97\xa9\x9c\x4c\x6d\xbf\xc6\x3f\x8e\xa7\xcb\x40\x2d\xd4\x3a\x3d\xf3\xc9\xfb\x0f\x4b\xf9\x61\x76\x75\x39\x9e\x83\x2a\xa7\xd7\xd1\x47\x2d\xcb\x8f\x1f\x66\xf2\x7a\xf4\x49\x82\x1b\x04\xaf\xff\x66\x36\x97\xf3\xb1\x73\x94\x50\x5c\xff\x66\x3e\x7b\x3f\x1f\x5d\xcb\xd1\x42\xde\x8c\xe7\xd7\x93\xe5\x72\x7c\x29\x46\x6f\x67\x3f\x8e\x43\xa9\xd0\x77\x4e\x85\x14\xa5\x41\xbd\x48\x68\xa0\x0d\xea\x05\x43\xc7\x3f\x8d\xaf\x6f\xae\x46\xf3\x4f\x4f\xe8\x85\x8e\xe6\x93\xc5\x64\xfa\x5e\xce\x6e\x97\x8c\x23\x04\x8d\xfd\xb9\x9c\x4c\x79\xcc\x96\xa8\xbb\x1f\xb4\x53\x9c\x04\xb2\xa2\x7d\x13\x72\x33\x9f\x5d\xdc\xce\xc7\xd7\x76\xc4\x40\xa2\xf3\x2d\x09\xfd\x83\xb8\x28\x4c\xf3\x62\x3c\xff\x71\x72\x31\x5e\xfc\x20\x58\x77\xf4\x76\x31\x4e\xe4\xe5\x68\x39\x02\x21\xd1\x9b\xf9\xec\xdd\x64\xb9\xf8\xc1\xfe\xfb\xed\xed\x62\x62\xa7\x4c\x4e\xa6\xcb\xf1\x7c\x7e\x7b\x63\xbd\xc9\xa1\xfc\x30\xfb\x38\xfe\x71\x3c\x97\x17\xa3\xdb\xc5\xf8\x12\xdc\x4d\x50\xb5\xfc\x44\xc2\xb0\x91\xf8\x67\x22\x59\x25\x76\x32\x0d\xb4\x60\xed\x34\x5c\x2c\xc3\x8f\xcd\x50\x47\x36\x11\x91\x34\x29\xce\xb1\x93\x8e\xa5\xe9\xfd\x30\x5a\x48\xd0\x28\x1d\x5d\xfe\x38\x59\x1c\x93\x28\x15\x91\x44\xe9\x7f\xdb\xc4\xda\x7f\x91\x9f\xf4\x9b\xf7\xef\x2e\xaf\x4e\xcf\xd2\x57\xa7\xd6\x1f\xfc\xbb\x80\x00\x9e\xce\xff\x7d\xfb\xfa\xd5\xf7\xaf\xda\xf9\xff\xef\x5e\xfd\xca\xff\xff\x0f\xf9\x79\x3f\xbd\x95\xef\x6a\xad\xe5\x65\x68\x5c\x76\x79\x9f\xcf\xd2\x57\x89\x7c\x25\xa7\xd5\x83\xde\xae\x74\x2d\xcf\x5f\xbe\xfc\x8d\x0c\xc4\x03\x2e\x86\xf6\x57\x2f\x11\x3e\x06\xff\x3d\x87\xff\x7e\x9f\xe0\x47\xed\x3b\xbc\x5a\xc8\x3b\x6b\x25\x91\x19\x0b\x12\x4a\xff\x83\xd4\x46\x36\x66\x93\x56\xf5\xdd\x37\xff\x53\x88\xf1\x83\xae\x81\xff\x20\x0f\x4b\xd5\xa1\xcc\xe5\x2b\x23\x0b\xfe\xc6\x16\x6c\x3a\x23\xc7\x27\x18\xa9\x88\xee\xe6\x18\x0a\xa4\x1b\xc1\xf2\xc5\xa0\xdb\xcd\x7c\x3c\xba\x7e\x7b\x35\xa6\xa0\x63\x8b\x0f\x3a\xa8\x94\x63\xa1\x4f\x30\xb5\xf7\xaa\x48\x64\xa3\xbf\x34\xab\xaa\xfa\xec\x6b\x15\x24\x97\x30\x50\x66\x72\x6f\xf4\x66\x5f\x78\xd6\x93\xc1\xa6\xd6\x7a\xe0\x6c\x7e\x2c\xe0\xdc\x70\xe0\xf3\x0d\x18\x65\x06\xe8\x2a\x34\x0f\x8a\xb5\xab\x5d\xfa\xd4\x85\x79\xc3\xd1\x09\xfc\x29\x0d\xa0\x88\x5e\xd9\x03\x94\xb9\x6c\x12\x41\x31\x3c\x1f\xc0\x45\x11\xe2\xb2\x2a\xc3\x5f\xa5\x72\xa1\xad\xf7\x03\x96\x7a\x4b\x2d\x70\x47\x68\x3c\x23\x38\x25\x82\x59\x15\xa2\xf5\xc2\x32\x20\xc8\xe5\x2a\xa8\x48\xbd\xd3\x40\xa2\x99\x51\x8d\x72\x94\x2b\x81\x0c\x42\x59\x35\x02\x93\x74\x50\xda\x9f\x41\x2d\x61\x5b\x59\x33\x56\x4e\x60\xcc\x21\xd6\xa5\xa4\xdd\xc2\x46\x85\x55\xbf\xd5\x46\x0e\xec\x48\x15\x7a\xd3\x0c\x98\xff\x9a\x29\xea\x54\xd3\x35\x41\x49\x7d\xc9\x4d\x19\x18\xf6\x41\x8a\x64\x45\xbc\xe4\x3c\x87\x6a\x4b\x13\x99\xca\x09\x23\x47\x99\x53\x51\x8b\x6e\xea\x2f\x14\x82\x24\x2e\x6e\x0c\xfe\xd8\x16\x3a\x87\xdd\x45\xf9\x6d\xcf\x23\x5e\xef\x54\x88\x8f\x04\xbe\xf4\xa9\x80\x96\x52\x9e\x4b\x69\x51\x71\x18\x2a\x6d\xd9\x45\x6b\xdc\x03\x7d\x16\x5b\xac\x34\x3a\x2e\x31\xdf\xba\x75\xd9\x0c\xfe\x2e\xf2\x47\xdf\x48\x85\xbf\x75\x34\x92\xf7\x90\x79\x59\x57\x5b\xe2\x98\xe1\x57\xf9\xd4\x99\x1b\x29\x5a\xbf\x41\x91\x7b\xa0\x97\xac\x4d\x2a\xdf\x92\x6e\x86\x08\xa6\xd2\x6e\x5b\x00\x15\xe2\xb1\xe0\xbe\x41\xef\x01\x0a\x70\x00\x01\x91\x7a\x21\x17\xe6\xd8\xfd\x69\x3d\x49\x5c\x6a\xb5\xbe\x53\x75\x56\x50\x56\xb5\x4b\xe5\xcc\x45\x59\x78\x54\xf8\x6a\x36\x70\xa0\x76\x35\xa4\x29\x85\xdd\xee\xa9\xfc\x08\x74\x0c\x76\xb7\x94\x59\x7b\x6b\xe4\xe5\x3a\xdf\xc1\xa6\xda\x50\x58\xde\xe1\x0e\xe8\x6c\x01\xd1\x6c\xe7\x8c\x0a\x28\xee\xa6\x24\xbb\x0b\x50\xb3\xc6\xba\x37\xef\x2f\xc7\xef\x26\x53\x4c\x4e\x1c\xa7\xcc\x23\xbe\x6b\x62\x36\xc4\x23\x09\x7b\xdf\x8a\xaf\xb6\xf8\x3e\x39\x94\x01\x00\x64\x97\x3c\xf2\x91\x8e\xfb\xaa\xb0\x2b\xca\x28\x3a\x45\x78\xb8\x3b\x09\x07\xd1\xf5\xa5\x1c\x30\x7b\x01\x9e\x19\xbf\x0a\x12\x55\xe6\x09\xfe\x37\xe1\xf2\x7f\xfb\x92\x67\x3f\x2f\x65\xb6\xaf\xe9\x3e\x71\x55\xe9\xaa\x09\x73\x0e\x94\x48\xe7\x4c\x11\x90\x9c\x66\x82\x34\xa9\x21\x32\x31\xe0\x2b\xf0\x58\x5e\x05\x7c\x48\x3f\x8e\x10\x53\x03\x7a\xbf\x2d\xdc\x89\x5c\xeb\x4b\xa4\xf9\xb0\x83\x39\xc5\x80\x71\x28\xfb\x2b\xac\xbd\xc1\x05\x34\x38\x54\xfb\x01\xc9\xe8\x22\xe9\x79\x58\x85\x9a\x6f\x28\xc2\xbd\x3b\x30\x75\x4e\x8f\xef\x4c\xb9\x7a\x3a\x56\x91\xc1\x88\x0a\xb2\x59\x4f\x1d\xa7\xa0\x9d\x74\x19\x71\xb6\x45\x67\x5c\x08\x3b\x60\xb7\xf7\xd2\x1d\x73\x44\x8e\x49\xa1\x8b\x16\xe5\x2c\x7f\x4c\x20\xb6\x98\xea\xd3\x80\xa9\xd5\x69\x76\xa1\x50\x8f\xbb\xa0\x13\xbe\x81\x5a\x07\x37\x05\xb3\x9a\x5a\x95\xa6\x80\xa9\x41\xfc\x41\x89\xab\x95\x45\xbc\xb0\xdd\x7c\x07\x1d\xb8\xd4\x78\x80\xa3\x5d\xaa\xad\x86\x04\x80\x2e\xb3\xfc\x0b\xc9\xd7\xd6\x55\xd9\x9c\xd2\x7e\x36\xa1\x8c\xa8\x16\xae\x9b\x74\xe6\xdb\xd3\xc9\xd1\xaf\x14\x07\x1f\x47\xad\x7b\x8a\x50\xdd\x8d\x06\x0c\x0d\x04\x20\xe8\x0c\x20\xa5\x03\xf8\xff\x5f\x18\x59\x3d\xd8\x63\xbf\x70\x47\xcd\x09\x16\x5f\xc3\x2b\x74\x46\x27\x8f\x19\x32\x2d\x27\x46\x7c\x4a\x2a\xe6\xa4\x0d\x6a\x0f\xd6\x8d\x7d\x88\x63\x78\xb0\x4d\xcd\x09\x65\xd1\x7a\x43\x2a\x4e\x96\xf7\x7b\x03\x09\xf3\xa8\x6d\x70\xe2\x60\x98\x48\x39\xab\x05\x40\xe4\xca\xde\x6c\xaa\xc9\xd7\x40\x60\xdc\x19\x6e\x17\x74\xd6\x5f\x76\x85\xe2\x33\xc4\x7f\x29\xc5\x90\x68\x34\x6a\xd8\xe8\x15\x1a\x4a\x78\xb8\x6e\xe4\x7d\x6e\x9a\xaa\xce\xd7\x20\xa5\x5f\x96\x7a\xed\xa9\xd5\x9a\x80\x58\x9f\x97\x4c\x6b\x8c\xd0\xc0\xa2\xe2\xdc\x24\xcc\x3d\x8b\xdd\x7d\x5e\x54\xa6\xda\xdd\xdb\x67\x27\x52\x37\xf7\x0c\x80\xda\x55\x45\x8e\x0a\xb4\xbb\xca\x20\xfd\x32\x5e\x01\x0c\x2e\xa1\x3c\xf3\x60\x52\x3e\xa8\x3a\x57\x65\xe3\xea\xd9\x07\x58\xa2\x80\x4c\x68\xdd\x51\xe1\x03\x1d\x28\x1e\x30\x98\xe8\x98\xe8\xb2\x44\x40\xb5\x37\xbe\x84\x4c\xc9\xee\x1b\x12\xb6\x1f\xe8\x34\x44\x19\x0c\x75\x08\x2e\x46\xb7\xe7\x02\xea\xe9\x5e\xde\xd1\xc9\x06\xe8\xa8\x71\x48\x1d\x89\xc7\x86\xe2\xf5\x08\x3a\x08\x24\x2f\xab\x4d\xd0\x23\xc0\x39\x74\x8c\x63\x2a\xc5\xf0\x9d\xb2\x67\x98\xeb\x04\x1e\xa2\xae\x79\x98\x03\x84\xe5\x2b\xff\x49\xd7\x55\x4f\x6f\xa1\x8d\xd1\x8a\x74\xcd\x74\x62\x8d\xaa\x3c\x88\xee\x37\x1d\x10\x83\xd0\x3d\x65\x55\x72\xf1\xcd\xe0\x02\xb0\x84\x4b\xfd\xa5\x69\x4d\x98\xb9\xaf\xea\x46\xee\x94\x31\x4c\x02\x03\xe2\x0c\x8e\x67\xa1\x00\x04\x09\x00\xef\xde\xc1\xa1\x01\x4f\x12\xf0\x24\xbb\x72\xde\xaa\xf5\xe7\xd3\xe0\xe9\x3f\x63\xb2\x22\x9e\xf0\x5e\x92\xd8\xf0\x95\xf0\x78\x96\x3b\x53\xd6\x50\x37\x8d\xfc\xd6\x9e\xc0\x19\x95\xd3\xaa\xa0\x31\xa2\xef\xd3\xe7\xf4\x71\x3c\x2f\x97\xf6\x54\x45\xd5\xe3\x41\x54\xf8\xd4\x3e\xe7\xe5\x56\xad\xef\xf3\x52\x9f\xd6\x5a\x65\x08\x96\x82\xdb\xc7\x15\xad\x73\x5a\x01\x79\x10\x69\xc1\x73\x31\x08\x33\x9c\xc7\x9c\x90\x21\x6e\x12\xaf\x46\x0e\x71\x1b\x61\xf6\xb9\x53\xb0\x94\x35\x20\xce\xe9\x6a\x71\x86\x36\x80\x14\xef\xee\x9b\x4d\x55\x3f\x5a\x43\x8d\x4e\x65\x78\x22\xd4\x9f\x7c\x69\xa4\xf5\x21\xaa\x1a\x18\x5d\x4e\xa0\x04\x1d\x89\x73\x80\x2b\x1c\x92\xd7\x1b\xb9\xcb\xbf\xe8\xc2\x0c\xdd\xf7\x76\x2a\x2f\x1b\xb6\x55\x61\x7a\xe1\x9b\x59\xad\x1e\xf3\xf2\xce\x0c\x05\x40\xce\xad\xf9\x11\x21\x0f\xe9\xef\xf4\xc6\xc4\xcb\x1a\x40\xe1\x5b\xd0\x99\xbc\xdc\xed\xf1\xf4\xd7\x5f\x1a\x81\xc3\xd5\xe0\x5d\x81\x86\x28\xb3\xf5\xba\x2b\x8f\x88\x0f\x55\x08\xb8\xc1\xef\xc5\x8f\x16\xd1\xa3\xa5\x7f\xb4\x5d\x45\x30\xb9\xe0\x04\xc1\xa9\x1c\x94\xca\x07\x6b\x00\xf3\x22\xf8\x45\x81\x53\xb8\x55\xf5\xe7\xfd\x0e\x59\x8f\x7d\xe6\x9a\x7f\xeb\x98\x2a\x20\x8b\x7d\xc7\x65\xe3\x8f\xc0\x05\x8f\x34\x93\xd5\xbe\x56\x77\x5a\x78\x42\x88\x18\x10\xb1\x3a\x90\x9c\xb7\xe1\x33\x25\x68\x8f\x35\xa2\x70\xce\x78\x5d\xe5\x46\xb4\x3e\x63\x2f\xaf\xc8\x8a\x27\x1a\x7f\x28\xaa\x52\xdb\x6a\x4f\x65\x81\xfa\x4b\xe3\xc6\x81\x57\x99\x7d\x54\xbc\x07\x3c\x64\x72\x30\xdb\xa9\xbf\xee\xb1\x40\x12\xa9\xeb\xc9\x0f\xf0\x03\x0e\x33\x60\x5f\x1b\x36\x87\xe2\x0c\x4c\x17\x8a\xd7\xe0\x68\x71\x31\x99\xb0\x7f\x2d\x78\xf4\x96\xfa\x4b\x5e\x6e\x2a\x5a\x12\xf8\xc0\x44\x5e\xa9\xa5\xfe\xa9\xf5\xbb\xc5\xfb\xeb\x2b\x3b\xa0\x3f\x5d\x5f\x51\x69\xa1\x72\xfa\x59\xc2\x2f\xc2\xcb\xe5\x25\xae\x3c\x46\xa8\x9e\xae\x2b\x60\x26\x05\xa2\x52\x00\xc7\xca\x0f\xcb\xeb\xab\x24\x50\x56\xb4\x8f\xbd\xb9\x7c\xe7\x9c\x43\xf0\xd1\xef\xf7\x5b\x55\x46\x13\x95\xca\x70\x14\x9a\x70\xfc\x83\xf9\xf1\xfd\xbe\x99\xbe\x4f\xc4\x4f\x17\xef\xa0\x39\xbf\xbb\x79\x9f\x4a\x1c\xcf\xce\x07\x43\x9a\x53\xfe\x1b\x1a\x33\xe8\x32\x00\x6e\x52\x95\x99\xb0\x3b\x0b\xb2\x6f\xc5\x81\xf0\x8c\xee\x7b\xf6\x44\xb3\xbf\x58\x6b\x63\x2a\x7b\xfd\x87\xe3\x05\x6e\x95\xcb\x64\x5f\x2e\x2f\x05\x99\x94\xf4\x05\x84\xe6\x55\x85\xd3\x66\xe4\x43\x29\xdc\xdf\x1e\x3f\xc3\x07\x21\x7e\xc8\x9e\x7b\xc7\x46\xd4\xe5\x6f\x57\x07\xac\x53\x69\x35\x13\x5a\x46\x70\x1c\xf2\xf5\x0c\x60\x6f\xf8\xc2\x5a\x02\x25\xd4\x8d\xba\xd3\xa4\x3f\x92\x70\xb1\x1e\x7a\x97\x12\x83\x49\xe0\x42\xc1\x47\x77\x76\x26\xf2\xc6\xe8\x62\x43\x9a\xd6\x90\xce\xf4\xf9\xe9\x1d\x1c\x7f\x8a\xba\xaa\x75\x86\x3b\xd6\xba\x6b\x89\xb5\x96\xf2\x15\x06\x6f\xb4\x4b\x1b\x47\xd7\x91\x20\x1e\x54\x74\x7c\x22\x96\x68\xdf\x00\x84\xd1\x3b\xb0\x20\xcf\x29\x4e\x01\x49\x2f\xdd\xab\x07\x0d\xc4\x16\x41\xbb\x1d\x92\xa1\xdb\x6f\xca\xb8\x7d\x69\x64\x09\x85\x9f\x90\x63\x35\x8d\xe7\xe7\x15\xd8\x98\x30\x41\x67\x1b\xf0\xc2\xe0\x0b\x12\x00\x07\x6a\x17\x5a\x58\xe9\xbb\x1c\x4b\x7c\xe8\xc3\x0c\x62\xb6\xb6\x3f\x9c\x14\x34\x03\xce\x94\x1f\x04\x0e\x0f\xd1\xc9\x55\x75\xa4\xfa\xe2\xbd\x2f\x13\x23\x0e\x44\xdb\xe4\xc7\x8d\x0b\x17\x30\x5b\x61\x83\x71\x09\x0d\xcd\xe4\x4f\x9f\xfe\xf7\xc0\xab\xb9\x80\xdb\x62\xf6\xab\x7d\x99\x37\x9d\xab\x39\x30\x2a\x39\x48\x07\x2c\x84\x00\x83\x2c\x0e\xf6\x51\xcc\x07\x05\xae\x82\xfd\x7f\x34\xeb\x75\xd9\xdc\x6b\x03\xe4\x75\xbc\x32\x9c\xc5\x23\x9c\xa7\xe5\xbe\xd1\xf1\xb5\xe4\xc9\x07\x6b\x60\xd9\x3f\xc3\x49\xc3\x45\xa4\xae\xf8\x93\xfa\x25\x6c\x07\xe4\x16\xab\x26\xec\x7a\x45\xe7\x19\x53\xae\x46\x0e\x46\xeb\xcf\x65\xf5\x58\xe8\x0c\xab\x4b\xcd\x20\x91\x83\x4b\x9d\x39\x21\x97\xc4\x0e\x4c\x56\xd5\x86\xff\x6c\x2f\xf2\xc1\x07\xf0\x0d\x0e\x03\xeb\x4c\x54\x72\x70\x43\xd1\x45\x18\x1c\x58\x3a\x03\x3c\xa8\x21\x7a\xc0\x23\x0c\xd4\xa8\x80\xda\x40\x7f\x39\x9a\x98\x20\xbe\x97\x37\x44\x47\x62\x82\x2f\xb7\xa6\x07\x05\x0e\x02\x72\x3d\xe1\xcd\x65\x5a\x39\xfe\xd1\xca\x53\x47\x7f\xe4\x42\xe0\xcb\x80\x7e\x19\x14\x49\x68\x65\x44\x7c\x6d\x10\x88\x20\x54\x59\x57\x2c\xc1\x4b\x1e\xf0\xab\xc0\xcc\x36\x47\xde\xa2\x6a\x2d\x82\x58\x69\x5c\x3a\x8d\x97\xb0\xab\xdb\x28\x5b\x0c\x33\x4e\xfc\x4a\x19\xf2\x88\x8c\x63\x4f\x00\x82\x04\x57\x67\xfc\x26\x20\x48\x0a\xd9\x89\xd8\xec\x3d\xd2\x3a\x70\x09\x20\x42\x19\x68\x17\xb0\xc0\x2c\x91\xcb\x10\x4a\x86\x44\xcd\xfa\x89\x7d\xcf\x53\xf9\xe3\x78\xfe\x76\xb4\x9c\x5c\x33\x16\xf7\x69\xd8\x61\x6c\x89\xc7\x11\xaf\x9e\xb0\xb7\xe8\x86\xbd\xdb\x30\x93\xae\xe0\x41\x47\x23\x18\xae\x12\x11\xc4\x73\x78\xda\x29\x5a\xf6\x35\x73\x4d\x3a\xc3\x7c\xc3\x88\x48\x2c\x20\x30\x3e\xed\x82\x57\x59\x66\xc7\x91\x59\x24\x5d\xa0\xeb\xf1\x5e\x35\xa6\xc2\x12\xa1\xca\xf9\x9e\x22\x76\x3f\x3a\x64\x0b\x7a\x7d\x5f\x82\x93\xbc\xd5\xca\xec\xe9\x2a\xa8\x56\x18\x9e\x0c\xe8\xe7\x60\x83\xd9\xbb\x9b\x14\x4b\x18\xf6\x45\x40\x59\x3e\xcc\xe8\xa4\x84\x8d\xa9\x3e\xeb\x16\x91\x92\xa3\xcd\x15\x07\x6a\x07\x45\xc3\xa0\xa8\xa0\x34\xe4\x57\x94\x52\x7f\x21\x51\xa4\x8d\xc3\x7b\x79\x55\xc1\x80\x0b\x19\x8b\x56\x84\x2e\x41\xab\xb1\xdc\x43\xc6\x0a\x08\x98\x7c\x33\xf6\xc6\xfa\xb5\xa6\xa2\xc3\xb1\x1d\x1f\xb4\xfe\x22\x93\x06\x06\x20\x16\xf8\x46\xa1\x21\x34\xb3\x6b\x71\xe8\x43\x24\xbb\x13\x62\x64\xc6\x41\x2a\x5c\x15\x8e\x44\x6e\x8d\x98\xab\x5d\x81\xab\x16\xd1\xb3\x08\xe0\xa4\x55\x2d\x27\x53\xf9\xbf\x6e\x47\xd3\xe5\x64\xf9\xc9\x69\x0d\x30\x01\x1d\x1b\x07\xd4\xa7\x13\x8f\x80\xcb\x4b\x58\xdd\xca\xd5\x8a\x6c\x61\x5b\xc3\xce\xe3\x80\x35\x60\x80\xcd\xb0\x7d\xd9\x24\x34\x58\x76\xea\xa0\xa8\x01\x4a\xd3\xce\x5e\xbe\xf4\x86\x51\x10\xc9\xe2\x40\x25\x2d\x6c\x67\x35\x44\x3e\xf2\xc1\x13\xae\x03\xe2\x34\x5c\x0f\x39\x51\x44\x3a\x53\xb0\xae\x0f\x89\x60\xb4\x16\x90\x06\xb0\xb1\x42\x28\x5c\xa3\xc3\xa7\xbf\xe9\x78\xcd\x86\x4f\x10\x08\xfb\x61\x37\xb1\xed\x6d\xef\x9d\x3f\x08\xc5\x1f\xf0\xb9\x54\xbe\xc5\x2a\x42\x68\x91\x5f\x20\xd4\x1e\x11\xb4\xc7\xc7\x27\x60\xeb\x99\x38\x20\x48\xa3\x6a\xb4\x5b\xa3\x4b\x6e\x11\x3e\x5d\xc0\xc3\x1d\x0f\x1c\xe3\xcb\xd0\x4a\x62\x31\x1d\x74\xe0\x1d\x10\x09\xfe\x06\xe4\x9b\x08\x7e\x62\x8b\xa8\xcc\xa4\x75\x9b\x57\x45\xb0\x8d\xed\x59\x10\xc3\x02\xb9\xb7\xd4\xb9\xdc\x97\x18\x21\x8f\x29\x13\x4c\x38\xfc\x5e\x90\x58\xf1\xdf\x83\xd8\x08\xd7\x78\x43\x19\xcc\x2e\xbc\x95\xb1\x8d\x94\x29\xf3\x67\x98\x75\x54\x54\x93\x1b\xbc\x8e\x4d\xb8\x47\x12\x36\xff\x1b\x10\x09\x80\x80\x52\x98\xca\x85\x76\xe5\xa5\xd3\x2e\x03\x3a\x67\xbb\x4f\x28\x70\x44\x4b\x2e\x03\xbb\x06\xcd\x13\x77\xa0\xdb\x99\x46\x8d\x8c\x4a\x3e\x54\xc5\x7e\x9b\x97\xd5\x1e\xce\xb1\x4d\xde\xb8\x85\x05\x47\x0e\xa5\xaa\xc0\xad\xb6\x93\x91\xd7\xc6\x5e\x45\x30\x0c\x50\x55\x04\xd2\x1d\x40\xd6\x6b\xe0\xdb\x58\xac\xa3\x56\xc5\x61\xc8\x23\xab\x50\xe2\x32\x58\x71\x9e\x8e\x11\x31\xa7\xf6\x91\xd6\xa0\xce\xfe\xa2\xd6\x40\xb2\x66\xad\xf4\xb4\xb3\xb1\xe3\x10\x3f\xb9\x53\x31\xb8\xd5\x8d\x6d\xbc\x5b\x85\xdf\xad\x7e\xd7\x91\xc5\xe8\x64\x2d\x3a\x11\x9e\x96\x57\x7b\x40\x74\x39\xae\x06\x80\x53\xfa\x26\x1c\x20\x40\x00\xe7\x1a\xe6\x13\x65\xef\xa7\x20\x73\x89\xdc\xc7\xa7\x54\x32\x29\x80\x8c\xcc\x89\xf2\x79\x47\x8d\x23\x43\xf4\xb9\x53\x74\x7b\x29\x85\x62\x6d\x03\x85\x15\x8f\x4d\xe5\x88\x6c\x45\xf8\x99\x53\x57\xa5\xc9\xc5\x99\xbb\xba\x6a\xaa\x35\x38\x7a\x8e\xb1\xa7\xdb\xc9\x96\xd1\x9e\x48\x66\xd2\x56\x59\x86\x11\x66\xd8\x37\xee\x7a\x61\x0a\xa2\x82\x62\xd7\x3b\x4c\x36\xb9\x71\x6e\xd4\x67\xb8\x08\x69\x59\xc8\x5d\xbd\xcf\x30\x7c\xa5\x77\x26\xf1\x76\x29\xf8\x24\x1d\xb4\x74\x3c\xcb\x79\x29\xfe\xba\x57\xe0\x74\x40\x3a\x2b\x90\xaa\x40\xb3\xa1\xd3\x1b\x2a\xc8\xdc\x62\xd9\xd7\x9e\x47\x0d\xf8\xfb\x38\xa1\x8a\xb7\x91\x9b\x87\x7d\xd9\xe4\x85\x54\x76\x27\x28\x5c\xed\x50\x7b\x2d\x51\xeb\x13\xbb\x6a\xfb\x95\x6f\x75\xeb\x7e\x15\xaa\x8c\x66\xfb\xc4\x25\x21\x20\x8b\x8f\x02\xc9\x28\x1a\x7c\xc7\x42\x7d\x50\x92\x56\xf8\x2b\x47\x61\xd0\xce\x3a\x0f\x6d\x77\x69\x42\xd1\x52\xa8\x63\xd5\x19\x1a\xa6\x58\xe6\xc2\x9a\xb0\x61\xf5\x07\xd4\x68\x78\xb0\x41\x67\x8f\x08\xd0\x05\x24\xbe\xa6\x10\x63\x0e\x25\x92\x07\x34\x15\x3a\x36\x02\x8c\xfb\x1d\xf1\xcd\x42\x1d\xc6\x3d\x90\xf6\x05\xc5\x7d\x40\x5c\x01\x67\x75\x49\x82\x7c\x59\x5b\x6b\xc6\xd9\xec\x0e\xf4\x1e\xd4\x87\x2d\x9e\x36\x5a\x59\x37\xd2\x67\xe7\x3a\xbb\xbf\x2f\xb1\x29\xa0\x4c\x8f\xa2\xe4\x48\xb8\xeb\x48\x8f\xbb\xd8\x76\x8a\x49\xc3\x33\xda\xaf\xa3\x38\xb5\x77\x34\x63\xa3\xd7\x25\x69\x3a\xcd\xdc\x70\x21\xa4\x3d\xf6\xaa\xee\x8d\x90\xe0\x12\xf5\xca\x76\x1d\x06\xe5\xbe\x5a\x2a\x7e\x8d\x43\x24\x35\x95\x75\x8d\xc1\xb0\x25\x66\x64\x6d\x82\x82\x99\x1c\xa5\x5f\x7c\x25\xad\xdb\xaa\x59\x85\xf7\x90\x80\x94\x9a\x53\x9b\x6a\xf7\xe3\x8d\x10\xa3\x54\xde\x1a\x87\xe9\xf0\xf1\x0a\x79\x42\xca\x0d\xe1\xd5\x98\x03\x00\x7e\x28\x15\xdd\x83\x19\x14\xbe\xae\xb1\x06\x0b\xfd\xbb\x8e\xb5\x65\x1f\x43\xf0\x6d\x27\xe6\xae\x1f\x72\x7b\x4f\x39\x72\xe1\x13\xf2\x13\xef\xa9\x34\x79\x83\x72\xae\xf2\x11\x92\x1f\xe5\x21\x41\x09\x28\xd3\x78\xb8\x3c\xb9\xce\xad\x74\xa7\x7b\xaf\x67\x57\x13\x7c\xac\x81\xed\x4a\xdc\xe4\x08\x6c\x88\x9b\xc1\xb9\x43\x57\x50\xd2\x32\x76\x94\x27\x00\xb6\xbb\xc6\x04\xe9\xe7\x54\x88\xb7\xa9\xbc\xca\x8d\xf3\xee\xfc\x40\x82\x41\x41\x1b\x17\x6b\x9d\x2b\xaa\xa6\xc5\xe8\x8b\x71\xe1\x97\x1c\xe9\xef\x19\xfa\x23\x28\x86\x6e\xbf\x18\xe4\x64\xb7\x2d\xd1\xd1\xde\x89\xb5\x7b\xfb\x0e\x41\x1d\x20\x55\xe0\xce\xc0\x8d\xdd\xef\x9c\xdd\x65\xc4\xc6\xb1\x73\x45\x9e\x00\x69\x3f\x96\xcf\xb9\x4f\x0b\xd7\x19\x28\xac\x83\x1b\x6c\xa3\x1f\xb1\x5e\xa7\x84\x37\x0c\x01\xb9\x40\x8a\xe2\x07\xb7\x05\xed\xf2\xa4\xa5\x40\xc7\x1f\x29\x11\xa5\x42\x5c\xa4\x72\x01\x97\x6e\x34\x80\x10\x4e\xc3\x52\x8c\xad\xee\x64\xa5\xdb\xfb\xc6\xf5\x5e\xb4\xcd\x55\x57\x2f\x79\x99\x4a\x17\x65\xe1\xaa\xb7\x8e\x5f\xdb\x73\xb6\x8d\x41\x22\xe6\xb9\xaa\x3a\xb0\xce\xe0\x5a\x68\x65\xfe\xd9\x1e\x22\x51\xef\xca\x39\x90\xd1\x7b\x53\x21\xde\xd9\x1d\x0d\x76\x4c\x12\x72\xb6\x07\x57\x56\x9f\x17\xde\xf6\xbf\xef\xf2\x07\xae\xa3\x24\x33\x23\x80\x4a\x04\x92\x06\x9d\x73\xed\x99\x2a\x08\x97\x0e\x84\x6a\x75\x73\x5f\x3d\x96\xfc\x9b\x51\x96\xe9\x32\xdb\x6f\x31\x32\x96\x0a\xf1\x3e\x18\x69\xce\xda\xb7\x9a\xe9\xbc\x02\xbb\xb5\x4d\x7f\xba\x18\x42\x0c\xce\x06\x0e\x9d\x1b\xe4\x5c\xa0\xd7\x77\x5d\x36\x7a\x49\x2a\x3f\xb8\x21\x95\xca\x9e\xf8\xaa\x00\x9e\xdb\xde\xb2\x43\x7b\x37\x07\xed\x46\xa8\x22\x1e\x30\x2e\x70\xe6\xa2\x76\x49\xd0\xc1\xc6\xe0\x8a\xa5\xdc\x65\x06\xfa\xed\x79\x03\x9a\xab\x8d\x46\xc1\x61\xb8\x8e\x79\x23\x3a\x67\x22\x01\x9b\x24\x01\xb6\x75\xb7\xb3\x62\x38\x21\x5d\x2e\x9d\xd9\x52\x3c\x08\x9d\x43\x87\xd3\xce\x35\xa1\xc8\x3a\xbd\x10\xae\x17\xed\x11\x4c\x48\xcd\x0c\x8e\x2a\x6e\x76\xa7\xb5\x61\x4b\x45\x67\x43\x7a\xc7\x28\x68\xa1\x1b\x23\x3a\x16\x21\xbf\xad\x70\x53\xc1\x18\x65\xda\xac\xeb\x7c\xc5\x2b\xb7\xaf\xbb\x64\xe1\x51\x93\xdd\x09\x0e\x69\x5b\x04\x91\xfd\xae\x35\x7d\x6c\x32\xb3\x51\xc8\x97\x58\xd2\xbf\x7e\x60\x07\xe3\x9e\x11\xde\x2c\x57\xc7\x8c\xeb\xd6\x3d\x57\xe4\x9f\x35\x64\x22\xfb\xde\x6c\xc4\x13\x6f\xec\x5c\x89\x79\x23\x1f\x95\x71\x95\xc9\x1c\x12\xc5\x1c\xb8\x20\xb4\x1a\x3d\xca\xcf\x25\x4d\xb3\x77\x93\xab\xad\x5d\x84\x9d\xb6\x30\xe3\x90\x75\x5b\x10\x45\xa6\x22\xe0\x9f\xbb\x2e\xec\x59\x86\x7c\x45\x64\x5e\xc6\x81\x46\x4a\xd0\x54\x35\x5d\x9e\xe2\xd8\xe5\xe9\x35\x0a\xf3\x26\x80\x9c\xf5\x5c\xa4\xbf\xc7\xac\x0b\xe4\x3f\x3b\x5b\xaf\x13\x66\x07\x95\xe3\x38\xd0\xce\xd3\x2f\xfc\x96\x60\x71\x6b\xbd\xf6\xc5\xec\xbb\xe8\x70\xf2\xfb\x9c\x6f\x05\xa7\xa1\x8e\x41\x4e\xb8\xb8\x37\x91\xbc\xeb\x3a\xd4\xfe\x6f\x35\x8c\xc1\x5e\x99\x6f\x1a\x2e\x38\xb4\x6c\x72\xdb\xd3\xab\x9e\xbb\xa8\xe7\x00\xec\xac\x34\x7f\x84\x61\xd3\xf3\x1a\x32\x3d\xc4\x4f\x8e\xbf\x21\x84\x4e\xea\x64\x41\xd0\xfa\x37\x92\x60\xcb\xf6\x40\x7d\x50\x05\x07\x60\xb1\x70\x8d\x83\xea\x22\x54\x40\xe7\x71\xa1\x07\x0a\x71\x9d\xca\x4b\x0d\x1e\x67\xff\x1c\x45\x79\x0e\x87\x7d\xe4\xcf\x05\xb5\xbc\x1c\xb4\x17\x47\x8c\x98\x54\x88\x69\x2a\x2f\x2b\xf2\x8c\x58\x56\xe6\xe0\x09\x57\x5c\xdb\x20\x09\x70\xa4\x09\xd0\xe5\x4a\xac\xab\x72\x53\xe4\xa8\xeb\x1c\x46\xa1\xca\x43\x77\xd0\x9d\xb9\x30\x0b\xa7\xa8\x3c\xf4\xc6\xfc\x7d\xa8\xa6\x73\x62\x51\x0f\x0d\x1c\xee\x7d\x28\x3d\x14\xf4\x46\x30\xdf\x9a\xb8\xa1\x04\x30\x6f\x6d\x20\x10\xd3\x03\xc0\x0a\x30\x73\xf6\x60\x77\xd1\x2f\x02\x21\xba\x4a\x49\xb7\x5e\x7c\xc4\xb9\x41\xdb\x04\x1d\x7b\x8f\x71\xc2\x94\xae\x6d\x08\x5a\x7b\x18\xc1\x72\x2d\x54\xd6\xca\x64\x00\x94\x58\x56\xe8\x5c\x80\xde\x5d\x96\x45\xab\x8d\x23\x69\x05\x18\xc2\xbd\xb7\x79\x6b\xaa\xd9\xd3\xe9\xb9\xb6\xf1\xbc\xa3\x07\x73\x29\x71\xe4\x70\x04\x29\x1a\xce\xd2\xb9\x45\x1a\x86\x09\xd5\x73\x8b\x34\x70\x1b\xf3\xa6\x03\x48\x14\xd6\x39\xd7\xc1\xe7\x6d\xd7\x02\x31\xd1\x60\xbe\x57\x07\x40\xb6\xd8\x83\x9c\xea\x4a\x4f\x4f\x21\x60\x87\x80\x83\x44\xc0\xfd\xe5\x1e\xb2\xd3\x1a\x21\x41\xfa\x11\xf7\x25\xc5\x31\x60\x37\x7b\x40\xca\x0e\x78\x7c\x20\xb7\xa5\x4a\x59\xd5\x77\xaa\xcc\xff\x09\x09\x5e\xc8\xce\x25\x25\xc6\x06\xd1\xfc\x3e\x85\x87\x24\x46\x1c\x3e\xea\x0c\x0b\xe1\xc4\xec\xa7\xf6\x3b\x8c\x1a\x62\x31\x40\x86\x99\xf5\x4e\xe8\x99\x91\x59\xf4\x45\xe1\xbe\xc8\x58\x2c\xfc\x5a\x2b\x0e\x9d\xf0\xba\xd0\x58\x95\x10\x2e\x91\xc0\xa0\x3b\x7a\x0c\xc8\x19\x6a\x0b\xea\xb0\xc1\x1d\x2c\x19\xba\xab\xf0\xb7\x63\xc0\xb1\x8c\x32\x84\x27\x41\x10\x87\xe0\x3e\x38\x27\x54\x5a\x31\xc4\x95\x55\x6a\x4a\x8b\x5b\x6b\xaa\x15\xf0\x2d\x6a\xad\xb2\x83\xdf\xe0\x8a\xa2\xb1\x8c\x57\x0a\xb3\x25\x10\x2d\xe5\x1b\xbe\x38\x08\xd7\x8e\x03\xaa\x23\xdb\x79\xf5\xad\x70\xf5\x1d\xee\x09\x94\x9b\x3f\x90\xf4\xa6\x42\xa6\xa1\x8a\x25\x16\x45\xb5\x21\xcf\x9f\x8e\x56\xb4\xa9\x60\x63\xfc\x00\x91\x25\xfe\x63\xad\x91\x66\x1b\x5c\x90\x02\x86\x0b\xe4\x2c\xf5\x97\x5d\x91\xaf\xf3\x46\x04\x5e\x82\x3b\x47\x9c\x69\xe2\x6f\x74\x84\x13\x66\x18\x66\x71\x8f\xa2\x7c\x31\xae\xc5\x13\x33\x8c\x8d\xd8\x93\x6e\x26\x86\x21\x14\xab\x38\xee\x02\xf7\xa4\xe8\x75\x58\x40\x31\x69\x4b\x52\x75\x68\xa5\xd9\x91\x01\xf4\x49\x4d\x25\x44\x1a\x01\x5b\xf9\x76\x57\x1c\xc2\x6d\xcb\x92\x84\x3d\xb7\x0c\x56\x76\x5f\xcc\xae\xdf\x4e\xa6\x93\xe9\x7b\x79\x39\xbb\xb8\xbd\x1e\x4f\x97\x51\xf8\x6a\xbb\x42\x6e\xb2\x10\xb6\x00\xd5\x46\xc8\x01\x41\xbf\x7b\x12\xb0\x9a\x74\x44\x5e\x61\xab\xe2\x45\xce\x67\xd4\x6b\xc2\xad\xfa\xc2\x1f\x1f\x74\x0b\xb8\x00\x84\x0b\x70\x71\xdc\x3b\xe7\x58\x8d\x6d\xa9\x72\xb6\x8c\xd3\x48\xef\x33\x2c\xf0\x03\x22\x0a\x7b\xb8\xae\x58\x4b\x83\x5b\xc0\xf6\x2d\x55\x04\xc1\x17\x43\x64\xac\x7b\xaa\xe0\xc3\x91\x46\x2c\x73\xe8\x7d\x6b\xff\xc7\x87\x7c\x2b\xbd\xbb\x6b\x19\x43\x79\x2d\x8e\xdc\xb7\x4b\xd7\x4f\x7e\x3e\xb0\x2c\x40\x0e\x90\xef\x46\x60\x95\xeb\x71\xf1\x88\xca\x68\x5f\x34\xf9\xae\xd0\x02\xb3\x5c\x6b\x55\xf4\x8d\x10\x1d\x1c\xb4\x6f\x88\x74\xc4\xc9\x2f\xdb\xa7\x7b\x47\x4b\x40\x5d\x0e\x3d\xb6\xef\x61\x1e\xf2\x6d\x37\x35\x04\x34\xec\xe6\xcc\x72\x50\x29\x2d\x1b\x47\x50\x94\x08\x48\x20\x87\xe9\xa6\x40\x07\x9c\xd7\xc9\xbe\xcc\xff\xba\x87\x83\x42\x65\x19\xb9\x96\xc1\x21\x8b\xcc\x42\x22\x80\xc8\x24\x9d\x40\x8a\x9b\x72\x2a\x62\xf3\x0c\x0d\x3e\xe6\xe5\xae\xd6\x7c\x23\xad\x89\x5b\x82\xb5\xaf\x0b\x50\x63\xa6\x36\xa0\x6d\x99\xca\x6b\x6e\x36\x2a\x55\x67\x7f\xd9\x9b\x26\x84\x0b\xc5\xb7\x34\x2f\xd8\xe7\xad\x85\x56\xd8\xc0\x99\xdf\xb8\x00\x04\x11\xbf\x4c\x3a\xeb\x3f\x08\x88\xf2\xfe\x0d\x4c\x56\xd3\xe3\xd2\xd3\x1b\x05\xdf\xe2\x7d\x9b\x82\x51\x88\xe0\x1f\x1f\x0d\x0e\xfc\xe0\x9c\x41\xf1\xcc\xbb\x7b\xa0\x43\xac\x2c\xdb\xf9\xb4\x88\x7c\x9d\xd4\xf3\x6f\x64\x64\x91\x17\x45\xdf\x2b\x62\x93\x9c\xa9\x1d\x2e\x66\x57\x57\x48\x08\x07\xd5\xfa\x3d\xa7\x1e\x55\x7d\xae\x2b\x90\x34\x44\xb9\x43\x10\x20\x0e\x70\x0f\x51\x12\xf4\xd8\x61\xd8\x03\x08\x4f\xa8\x82\xd3\x5f\x49\x9e\x01\xa5\x5d\xe2\x1a\x14\xf8\x85\xb3\xe3\xdf\xd3\xdd\x98\x0e\xb2\xdc\xe6\x59\xf1\x9d\xe9\x3b\x4c\x03\xa4\x44\xbd\x2f\x7a\x9a\x60\x8f\xe5\x76\xfa\x36\x70\x0c\xa3\x0a\x4a\x4c\x42\x3b\xdd\xd3\x20\xb7\xcb\x03\xac\xbf\x34\x35\x10\x70\x71\xd3\x1d\x26\x1c\xee\x5f\x42\x7e\x85\x4d\x6e\xa5\x50\xf2\x46\xf8\x61\x2b\x0e\x7d\x97\x8e\x37\x6e\xf1\xb6\x80\x1b\xb2\x9f\x75\x4b\x30\x43\x24\x37\x4c\x67\x32\x8b\x23\xf9\x3c\x3e\xf1\xac\x74\x3b\x29\x7c\xc5\x49\xdf\x70\x21\xd0\x30\xca\x1d\x7d\x9f\xca\xd1\xfb\xf7\xf3\xf1\x7b\xa4\x16\xfc\x38\x59\x7e\x90\x93\xe9\xe5\xf8\x66\x3c\xbd\x1c\x4f\x97\xf2\xe3\x6c\xfe\xfb\x85\x10\x23\xc8\x78\xe6\x85\xea\x0b\xfb\xc3\xcd\xdf\x98\xa0\xb6\xd5\x84\xb7\xb4\xd1\x3b\x45\xfc\x98\x19\xe8\x3d\x93\xa8\x9c\xf0\x33\xc6\x80\x4f\xa2\xa1\x42\xb5\x6f\xc8\xad\x6b\xb6\xa6\xab\x1a\x6c\xd0\x3a\x4e\xea\x10\xda\x4a\x78\xdc\x35\xc8\x24\xdf\xdd\xd9\x81\x68\xf4\x80\xd3\x0b\x3e\x7e\xdb\x92\xba\xa5\xc3\xcb\x75\x8d\x50\xdd\x80\x08\x07\x51\xf7\x2d\xd5\xb5\xa0\x50\x1f\xc9\x83\xf8\xc3\x90\xbf\xf8\x02\x64\x5e\x21\x62\x73\xa8\xca\x0c\xd0\x51\xa2\xb5\xbf\x10\xd3\x8a\x25\xe7\xa9\xfc\x48\x95\x26\xad\xb2\x29\xbf\x6f\x40\x55\x90\x3a\x92\x44\xb8\x2a\x5f\xce\xa2\x76\x3b\xaf\xc2\xeb\xeb\x2f\xdd\x21\xee\x1e\xc0\x22\xae\x35\xa0\x6a\x64\x50\x60\xdc\x53\x91\xdc\x8e\xc3\x93\xa7\x1d\xd8\xfd\x41\x1a\x41\xfa\xc4\xa0\x7c\x05\x45\x1a\x6d\xc1\x55\x13\xc0\x0c\x3a\x09\x3b\x5d\xf6\x95\x8f\x51\x1a\x43\xa1\x45\x01\x9a\xe6\xd4\x2c\x52\x91\x8e\x46\x26\x8a\x44\x87\xd1\x6a\x32\x25\xc8\x90\xa8\x62\x54\xd0\xaa\x56\xeb\xcf\xba\x55\xfc\xe4\xca\xdd\xc2\x57\xb8\xf8\x8d\x3d\x10\xea\xaa\xcc\xd7\x61\x28\x07\x72\xbb\x88\x7e\x69\x65\x88\xb1\x0e\x2e\xf8\x96\xbd\xc5\x52\x39\x73\xb5\x13\xc8\xf8\x0a\x80\x20\x44\x43\x57\x65\x80\xbf\xea\x34\x15\xba\x4a\xdc\x4a\xdc\x38\x27\x33\xbe\x9c\x8f\xa6\x8b\x2b\xd8\xc6\x42\x2c\x83\xda\x8f\xdc\x84\x65\xee\xbe\x4e\x3d\x56\x9b\x35\x95\xf3\x58\x42\x84\xa3\x7f\x8e\x11\xc7\xd3\xc4\x2e\x6f\xe1\xec\xe9\x54\xce\xe1\x92\xb1\x1b\xad\xc7\x5e\x45\xb3\x2c\x78\xb8\x07\x79\x01\x08\x58\x15\xb2\xc7\x2d\xca\xeb\x4e\x8d\xb0\x49\x44\xe8\x6c\xb1\x59\x1e\x3d\x1a\xe8\xb2\x7d\xb0\xa5\xdf\xe4\xe1\x7c\x2e\xc3\x06\x9c\x11\x12\x8b\xb1\xda\xc5\xdc\x57\x70\xf6\xa9\xd5\x00\x15\x36\xa1\xad\x4b\x98\x38\xbd\xa0\xae\xa1\x65\xba\xa9\x01\x36\x4c\xd8\x2e\x17\x81\x5d\xde\x97\x7c\x07\x70\x99\x1b\x89\xb0\x2f\xe3\xf2\x0e\xa0\x40\x47\xb4\x5f\x3d\xc9\x67\x7f\xe7\xab\xa0\x95\x31\x0b\x9d\x49\xe5\xa4\x14\xcc\xc3\xae\xec\x5f\x40\x05\x19\xd6\x09\x2b\x9a\x36\xf7\xd1\xc4\x1c\x7d\x5b\xa7\x59\x10\x36\x67\x3b\xb4\x0e\x5e\x9b\xf4\x7f\x1f\x50\x2b\xd6\x85\x56\x79\x81\xc7\x97\x8f\x46\xb5\x13\x01\xf9\x33\x56\x61\x1c\xe7\x8e\x00\xe4\xf8\xf6\xf0\x28\x3c\x71\xeb\x7f\x68\xcf\xbe\x6e\xa6\xca\x7f\xe2\x6c\x28\xa0\x99\xcd\x61\x67\x1d\xa1\x82\x4b\xac\xb5\x27\x11\x69\x1c\xfa\x0b\x5d\x12\xa7\x7b\xbf\x1c\xcf\xaf\x27\x53\xda\xea\x6d\x1a\x34\x2e\xe9\x4e\x02\xf1\xe6\xa4\xa7\xbe\xdb\x8d\x00\xe9\x9c\x29\x23\x9e\x26\x41\xf3\x35\x85\xe5\x41\xaa\xa6\xd1\xdb\x5d\x13\xd4\x81\x11\x45\x88\x7b\xbd\x38\xfe\x7a\x2c\x00\x7d\xa8\x72\xf2\x70\x61\x20\x5c\xe1\x1a\x0c\x06\x2b\x31\x43\xfe\xba\x16\x74\xef\xf6\xb4\x46\x08\x06\xf9\x4a\xae\x6b\x87\xb4\xb7\xdd\x5d\x0f\x79\x55\xf4\x8a\x39\xd3\xc5\x03\x2e\x73\x11\x68\x2b\x8b\x48\x69\xaf\xc3\x47\x00\xf9\xf3\xbc\xa4\x7c\xd8\x89\x1a\x7a\x61\x55\x04\x73\x53\xfe\x5d\x95\xd6\xf6\x6e\xf2\x76\xa6\x9b\x1e\xc3\x91\x1f\x82\xa2\x6e\xf2\x32\xee\xb2\x89\x1a\x86\x52\x5f\x27\xab\x21\x9c\x88\xaa\x24\xee\xb9\x8e\x61\x43\x0f\xdf\x00\x93\x60\x03\x41\x1e\xc6\x91\x72\x32\x88\x87\x43\x70\x45\x91\xc3\x95\x69\xaa\x61\x70\x92\xdd\xdf\xbd\x94\x99\x3a\x98\x30\x05\xae\x0d\x02\xa6\x41\xae\xad\xd6\x18\x61\xeb\x0c\xa1\xfc\x39\x43\x18\xf4\x48\x1c\xeb\x10\xf4\x83\xd1\xd5\xed\x9e\xc8\x63\x3d\x21\x83\x29\xc7\x50\x2d\x02\x2f\x1d\xe4\x0c\x10\xcb\xc4\x06\x9c\x05\x0e\xee\xd1\xf5\x22\x4e\xb8\x3a\xd0\x9a\x48\x43\xbe\x90\x54\xd3\x69\xae\x17\x12\x5a\xef\x29\x71\xe7\x9f\x0a\xa3\x6b\x2f\x98\x57\xd1\xe8\xc2\x18\x42\x73\x76\x2e\x01\x44\x01\x79\x21\x96\xb1\x24\x39\x7e\xb6\xb3\x1b\x3a\xe5\xd8\x7e\xff\x04\x57\x0c\x8a\x68\x10\xf7\xe2\xe3\x7d\xd5\x1a\x08\x36\xd2\xdc\x0b\xa0\x9b\x00\x52\xec\xd9\x77\x93\xb8\x31\x5e\x9e\xcf\xbd\x1a\xeb\x30\x6c\x6b\x82\x79\x0e\xa6\x3f\xe1\x4e\x43\x94\xd0\xf9\x46\xdd\xc4\x08\x86\x36\x5c\xd2\xc5\x75\x12\x70\x74\x70\xe3\x95\x2c\xf7\x2f\x1c\x0b\x0d\x71\x9b\xbc\x4c\xe5\xbb\xdb\xe5\xed\x7c\x2c\xe7\xe3\x1f\x27\x8b\x7e\x39\xdf\xe5\xbd\x46\xb2\xaa\x1e\x22\xa9\xb6\x3a\x7b\x82\xf5\xc4\x41\x7c\x90\x5b\xf9\x7e\x7a\x2b\x8e\x53\x5e\x45\xe2\xed\x12\xc5\xdb\x21\x4d\x17\x29\xbe\xb3\x8e\x32\x6b\x54\xe7\xa5\x34\xbb\xbc\xce\x7d\xf5\x17\x81\xbb\x1f\x18\x73\x64\xcd\x1f\xb4\xda\x36\x1b\x24\x64\x45\x3a\x51\x88\xcc\x92\x20\x6f\xa9\x1f\xc5\xae\xae\x56\x85\xc6\x92\xe4\x75\x55\xae\x75\x5d\x42\xa6\x52\x4b\xa2\xc8\x7a\x7c\x7c\x4c\xef\xca\x3d\xd0\x64\x31\x41\xd0\x37\xa9\x10\x63\xeb\x64\xb7\x00\x88\x01\x5b\x0e\xe6\xd7\x15\x65\x89\xee\xf6\xb9\xb9\x27\xff\xd3\xf8\x14\x28\x47\xec\x7c\xcd\x14\xd5\x7a\xb1\x34\x4b\x74\x6a\xe0\x77\xda\xb0\xc7\xc0\x20\x18\x54\xb5\x40\x8c\xa5\xdd\x3f\x0f\x4c\x32\x12\x54\xbb\xb0\x58\x17\x2c\x4b\x30\x12\x76\xbc\x85\x82\xa2\x35\xc7\x56\xdf\xa2\xfb\x27\x70\xb3\x8b\xc6\x51\x5b\xb3\x50\xcf\x9e\x22\xdb\x51\x13\x30\x95\xd8\xa3\xbf\x7f\x02\xce\x9a\xb1\xc3\x54\xab\x4d\x33\xe4\x54\xc3\xb1\x45\xd7\x1d\x2f\xb7\xe8\xb1\x31\x07\xeb\x20\x47\x43\xdc\xbd\xe3\x0e\x91\x90\x3f\x0c\x18\x7f\x05\xd1\x8d\x7f\x7b\xf3\x44\x9b\x60\xa1\x3b\x9d\x75\xf5\xe5\x00\x28\xfc\x4c\xaf\xf3\x8c\x1d\x50\x52\x65\x08\xb6\x4e\x6c\xea\x05\xbc\x4a\x04\xc7\x85\x07\xbd\x30\x8c\xa9\x72\xc9\x3c\x98\x80\x88\x57\x55\x39\xa8\x60\x78\xde\x50\x9a\xee\x9f\xe8\x06\xb1\x66\x0a\x8c\x07\x3e\x9d\xbf\xc1\xd9\xa3\x18\x59\x7b\x76\x96\xca\xf9\x18\x8f\x09\xa8\x06\x1b\x5c\x2b\x63\xec\xa9\x73\xbd\x2f\x9a\x9c\x22\xb8\x17\x55\x51\xa8\x55\x45\xe2\x3c\x8b\xbc\xd1\x03\xc8\x76\x0d\xae\xaf\x2f\xf0\x7f\x87\x41\xf9\xe7\xc7\xaa\x2e\x32\xf9\x31\xcf\xb4\xf8\xa8\x57\x12\x0c\x44\xca\xee\xf0\x84\x04\x52\xaa\x70\xa3\xa1\x5f\x8e\x3e\x83\x71\x40\x61\x13\x54\x6b\x6c\xd4\x3a\x2f\x10\xcc\x48\x37\x15\x94\xa4\x36\x15\xa0\xa1\x59\x67\x09\x78\xb2\xe5\x88\x87\xf2\x31\xff\x9c\xd3\x74\xd1\xe7\xd7\xaa\x84\x3a\x69\x70\xe3\x4b\xce\xa0\x46\xe5\x90\x35\x14\xb4\x8c\xe4\xf3\x23\x31\x10\x3c\x08\x83\x21\x27\x08\x02\x02\xea\xbc\xd1\xc1\xa8\x18\x4d\x8e\x74\xb7\xdf\xcd\xfd\xde\x08\xbf\x56\x09\x76\x65\xc7\xd6\x3e\x23\x15\x62\x70\x71\x71\xfa\xf6\xd3\xe9\x62\x14\x96\xfb\x5e\x80\x8a\xc3\x83\x96\x17\x50\xa7\x64\xe4\xa8\x71\x61\xa3\xd3\xc5\xbd\x5d\xcf\xa3\x22\xff\xac\xe5\xab\xf4\xa5\x2b\x38\xf2\x6f\x59\x1d\xba\x4f\xb8\x20\xa5\x17\x0c\x09\xda\xcd\x78\xba\xa9\xea\xd3\x5d\x5d\x6d\x20\x83\xed\xfe\x4a\xf0\xcf\x00\xeb\x89\xf1\xd6\x6a\x23\x57\x7b\x93\x83\x6c\x6a\x5e\xca\x85\x2a\x51\x50\x37\x37\xeb\x2a\x91\x17\xaa\xc8\x37\x55\x5d\xe6\x0a\xd0\xab\x00\x2f\x57\x86\x76\x8c\x70\x94\x6d\xf1\xad\x13\xe0\xfb\xa2\xc6\x13\x67\x08\xdc\xa4\x3e\x75\x6d\x07\x6b\xe2\x15\x6b\xdc\x78\x55\x61\x91\x48\xad\xf9\x7f\x54\xe0\x84\x06\xbc\xd1\x4c\xee\x03\x88\x4f\x46\xad\x70\x91\x6f\xb0\x81\x46\x25\xcc\x52\x6e\xe4\x40\x17\xf9\x5d\xee\xf9\x38\x1c\x44\x7b\x40\x70\x56\xcf\xa8\xd8\x9f\xc2\x83\xd0\xe1\x86\xab\x97\x3e\xd3\x29\x03\x48\x65\xb4\xed\x7c\xe7\xbb\x5f\x07\x8b\x02\x29\xb7\xa1\x8d\x82\x74\xd1\x72\x63\xdb\x47\x8c\x07\x8e\x5f\x02\xf8\xc8\xdd\x10\x65\x7d\x1d\x77\x9a\x3e\x02\xbe\x7f\x72\x36\x94\xf7\x0a\xaa\x24\x7d\x3e\x1a\xc9\xb4\x5d\xa4\xc0\x38\x22\x1e\xb0\xe6\xcf\x87\xd8\x78\x00\xac\x87\xaf\x13\xce\x02\x77\x8c\x98\xc8\x7a\xf9\x1b\xca\xc0\xa1\x24\x13\xdf\x3f\x92\x8f\x18\x4e\x35\xf3\xcc\xe1\x5f\xfa\x77\x1d\xd2\x76\xf1\xa6\xe1\x0d\x85\xcc\x82\xf6\xef\x78\x20\xa0\xa9\x42\x00\xb4\xd1\xfe\x6e\x6f\x1a\x6a\xca\x6f\xa3\xa0\x03\x0c\x82\x9d\xc0\x63\x73\x9c\xca\xd1\xe5\xe5\x78\x7a\x79\x7b\xfd\x46\x7e\xa8\x1e\x7d\x66\xb9\x15\xe0\x07\x47\xcf\xc5\x84\x85\x58\xf6\x7c\x0e\x38\x62\x5c\xb8\xde\x5d\xf0\x8f\x75\xde\x34\xba\x4c\x82\xf0\x4b\x58\x8c\x13\x67\x32\xfc\xf7\x31\x57\xde\x25\xe1\x67\x93\x1e\xb3\xaf\x51\x74\x46\xfc\x05\xa2\x75\xce\x2b\xf2\x04\x04\x6f\x84\x08\x68\x4b\xd7\x43\xf9\x69\x3c\x9a\xcb\x4f\xb3\xdb\xb9\x9c\x8e\xae\xc7\xa9\xbc\xf1\x01\x2d\x6b\x36\x91\x70\x92\x73\x9b\xc3\x12\x0d\x80\xb1\x09\x57\x6a\x9e\xfb\xac\x4b\x3f\x58\x18\x35\xdf\x8e\xdb\x9e\x49\x48\xb7\xca\x6c\xe8\xb1\xe5\xd2\x3a\x3d\x8e\xdf\xfd\x3f\x60\xf0\xae\xec\x23\x5e\x4a\xec\xaf\x3b\xa5\x93\x09\xf9\x01\x9d\x52\xc9\x54\x8c\x22\x5c\x67\xe1\xad\xca\x8e\x5e\x01\x39\x38\xda\xc5\x6a\xfa\x7b\x2c\x02\x61\x7a\xaa\xb0\x82\x15\xd2\xd7\xd6\x6e\x8d\x67\x5f\x3d\x67\xc2\xe9\x32\x88\xbe\x0e\x6c\xe7\xd3\x34\xc5\xf6\x0f\x40\xe8\xce\x2b\xcc\xbe\x11\xc2\x25\x9c\x7b\xc2\x8c\x48\xd3\x75\x35\x59\x2c\xe5\xf2\xc3\x78\x32\x97\xcb\xc9\xf2\x6a\xbc\x08\x6a\x5e\xba\xfc\x50\xfe\x3b\x1c\x2b\xa1\x8f\x76\xea\x4e\xfd\x27\x9f\xed\xbb\xa3\x6a\x8d\xfa\x59\xd5\xe4\x7b\x71\xe5\x3a\xa7\x74\x39\xf2\xdb\xdc\xd7\x5a\x27\x72\xab\x81\xd0\x1f\xe9\x23\x1e\x2b\x09\xc0\xc8\x92\x12\x3f\x4d\x05\x1c\x37\x7c\xda\xec\xf9\xde\x61\x77\xd1\x2d\xe4\x00\xf1\x55\x36\x75\xfe\x60\x3d\x3b\x1d\x70\xc4\x30\xdd\x27\x4a\x54\x3c\x06\x14\x98\x22\x52\x75\x33\xda\x7f\x0d\xcf\x67\x55\x14\xba\xa0\x8d\x82\xa8\x88\xfb\x8a\x3c\xfc\x98\x72\xd4\x45\x58\x98\x51\xa2\xe9\x55\x4f\x0c\xa2\x46\x15\xa5\x6f\x28\x1a\xbd\xc7\x43\x25\x7a\xea\xaf\xcc\xe4\xf0\x93\x7e\x33\xbb\xb9\x3a\x3d\x4b\x5f\xfe\xfd\xe4\xbf\x9f\xe1\xff\x7e\xfd\xfd\xf9\x79\x9b\xff\xfb\xfc\xdb\xef\x7e\xe5\xff\xfe\x87\xfc\xcc\x6e\xc6\x53\x79\x73\xfb\xf6\x6a\x72\xe1\xe3\x2c\xfe\x16\x7a\xc9\xcc\xb3\xb1\x08\xdd\x59\x7a\x96\xca\xc1\x85\xc7\x78\xb3\x89\x0a\x99\xfe\x90\x2f\x07\xeb\x25\x8c\xa3\x8c\x20\xea\x1c\x2e\x2b\x07\xdb\x1d\x4f\xae\x50\x10\x08\xdf\x71\x1e\xbf\xc3\xb3\x94\x7a\xf7\x21\x04\x74\xd1\xe9\x37\xe3\x34\xc3\x05\x9c\x48\x18\xcc\x8b\x1e\x8e\x69\xe3\x95\xf5\xcd\x83\xc7\x7b\x8a\x83\xeb\x5e\x4a\x69\x74\xfd\x5c\xf4\x43\x04\x5f\x85\xd6\xbe\x4a\x89\x7b\x10\x4a\x71\xb2\x88\xd4\x28\x6a\x93\x1d\x8b\xf8\x15\x55\xdd\xee\x8c\xe8\xeb\x0c\x34\x30\xfa\x26\xd8\xfb\xa8\x6b\xa6\x0c\x83\xc6\xa1\x38\x9a\x64\x53\x25\xe9\xbf\x40\x0b\x5f\xa7\x72\x30\xf6\x59\xce\x48\xaa\xf9\x5a\xaf\xef\x55\x99\x9b\xad\xa7\x25\xda\xf2\xaf\x42\xa6\x2c\xf0\xe4\x3d\x2c\xdd\xd3\x34\xeb\x07\x5d\x54\x3b\xba\x32\xb6\xdb\x7d\xc9\xe0\xc3\x56\x46\x16\x32\x4b\x1b\x8c\x83\x64\xaa\x51\x0e\x4e\x7e\x96\x7e\x6b\xdb\xf7\x45\xaf\xf7\xe0\x56\x72\x43\xc2\x31\x65\xf6\x16\x14\x04\x25\xd1\x41\x55\xca\x05\xca\x24\xd9\x8f\x40\x4f\xbf\x4b\xe5\x60\x62\x97\xab\x2a\xe4\x25\xb6\xcc\x93\x3b\xb5\xd2\xfd\x9e\xe0\x29\xd6\xdb\xb2\x16\x69\xe7\x19\x6c\xe7\x04\x2f\x94\x31\xfd\x05\x2c\xac\xf1\x17\x54\xc6\x1a\x41\x6b\xbe\x4f\xe5\xe0\x0a\x64\x74\xe5\xc7\xaa\xfe\xec\x47\xd8\x91\x9d\x83\x30\x1d\x00\xa1\x5a\xfd\x05\xc2\xd2\x78\x2a\x89\xa7\x81\xde\x4c\xf2\x84\xde\x1e\xec\x67\x59\xb6\xcd\xf8\x8d\x6d\x06\x99\x5d\x6e\x28\x42\x9b\x95\xd7\xff\xba\xaa\xb1\xd4\x12\xa1\x73\x5c\xbc\x46\x25\x48\x38\xf9\x6c\xe8\x7d\x97\xbe\x76\x55\x6d\x67\xe9\x6f\xd3\x58\xc2\xd1\x84\x84\x5a\x9c\xba\x05\x2a\x99\x1a\x51\x59\x11\x9a\xd6\x55\x95\x08\x60\x19\xa8\xf7\x6b\x08\x42\x55\x9b\x50\x60\xb2\xb3\x95\x50\xf1\x92\x70\xb8\xf1\x21\x02\xe0\x0d\x11\x2f\xa0\x00\x84\xaa\x90\xfc\xa9\x26\x34\x15\x09\x4a\xa9\x58\x9a\x0c\xac\xc5\x11\x65\xd3\x9e\xeb\x81\x93\x51\x44\x85\xe5\xbc\xd0\x21\x65\x32\x37\x5d\xb8\xa9\xed\x6f\x36\x14\xcc\xda\xf7\x41\x65\x44\x5e\xe8\x98\x97\xdb\x8b\x3b\xf5\x1e\x12\x4f\x3d\xf7\x2c\x3d\x7b\x99\xca\x41\xf4\x05\x9e\xa2\x70\x49\x43\x88\x07\x19\x1c\xfc\x16\x47\xad\x60\x62\xa7\x17\x6e\x35\xfc\xdc\x2d\x61\x87\x3d\x3e\xa3\x21\x6c\x00\x0f\x4e\x18\xa8\x09\x4e\x2d\x15\xd7\x72\x85\x6c\x4f\xc4\xc0\xf1\xd3\x22\xe2\x9c\x66\x1a\xc7\x37\xde\x18\xad\xbd\x70\x66\xef\xaf\xa0\xc5\xe1\xd9\xb0\x83\x12\xac\x1a\xb9\x26\xb7\x3c\xc8\xd1\x2a\x42\xe6\xfc\xcf\x79\x79\x27\xe2\x62\x56\x0a\x69\xfb\x83\x58\x15\x85\xdc\x56\x19\xc0\xe5\x82\xfa\x09\xe2\xed\x43\x4a\x11\x53\xad\x73\xa6\xbc\xd6\xf5\x46\xad\xa3\x32\x05\x5a\x96\x06\x48\x07\x8d\x83\x3c\x31\x01\x53\x88\x8a\x62\x41\x33\x55\x78\x40\x83\x2a\xa5\x3f\x53\x91\xe0\xd3\xa1\x4a\x03\x75\x39\x0f\xb5\xc5\x7a\x99\xed\x4e\xd5\x39\x54\x60\xb3\xf8\xf3\xd3\x7b\x90\x40\x4d\xba\x28\x18\x09\xeb\xf9\x2a\xe3\x13\x0d\xb1\x45\xc1\xed\xf9\xc2\x90\xe5\x8f\x3c\x39\xe1\x3a\xa2\x30\x33\x84\x13\x6c\x9b\x88\x3a\xdd\xbe\xb1\x5e\xdf\xe7\x0f\xaa\x00\x6a\xd5\x38\xd0\x11\x55\x21\x67\x9a\xbf\x47\xf9\x80\x4c\x9f\xe2\x77\xa1\x46\x8a\xd7\x76\x6e\x88\xeb\x35\xa0\xd9\xdc\x00\x0f\x18\x09\xa3\xe1\xaa\xb1\x16\xc9\xa7\x6a\xef\x4f\xb5\xd6\x45\xa2\x08\x7f\x46\x17\x8a\xfe\xa2\xeb\x35\x72\xda\x86\xb9\xc0\x84\xf2\x18\xdb\x5d\x01\x90\x3f\xc7\xf8\xd3\x12\x1d\x6b\xe9\x6b\x20\x9d\x79\x14\x98\xef\xc4\xe5\x73\x63\xf6\x2e\xb8\xb6\x70\x67\xf4\x19\xd6\x0d\x06\x8d\x03\x8e\x0b\xdb\x97\x17\x2f\x5c\xa1\x06\xa4\x1e\xa8\xe9\x7c\x29\xc1\x22\xb3\x76\x86\xe1\xff\x29\x60\x4b\x25\x24\x42\xc7\x82\xbe\xdb\x2d\x02\x60\x61\x4d\x42\x5c\xf5\x53\xb5\xc7\xb7\x32\xe9\xa5\xbb\x94\xfc\xe2\x4e\xe4\x80\xbe\xf3\xe2\x05\x8d\xe9\x89\x1a\xe2\x2e\xac\x1e\x75\x9d\x10\xc1\xb9\x80\x20\x1d\xfe\x1b\xdc\x3b\x54\xa6\x80\x28\x11\xfc\x92\x26\x77\xab\x4a\x75\xe7\xe1\x6e\x7b\x67\x8c\x26\xac\xe3\x20\x56\x88\x82\x07\x64\x29\x8b\x21\x3c\xe6\x04\x7e\x38\x59\x0d\x65\xf5\x58\x6a\x47\x2a\xb0\xc9\x37\x0d\x50\x41\x42\x85\xfa\xc9\xb7\x2f\xff\xff\x43\xa6\x28\x60\x13\xad\xda\x37\x50\x44\x04\xeb\xe9\x5e\xd5\x68\xec\xae\x74\xa9\x37\x39\x20\xa4\xa2\x07\x06\x6d\x0a\x2c\x9f\xb3\x57\xee\x6a\x96\x23\x88\xd1\xf3\x12\xbb\xda\x37\x75\x6e\xe4\x52\xaf\xef\xcb\xaa\xa8\xee\x60\xde\x26\xe5\xda\x51\xe1\x85\xdb\xc5\x9f\x70\xe7\x76\xca\x97\x10\xde\x68\x5b\x30\xef\x6b\x47\xd6\xdd\xfd\xa3\x35\x31\x56\x07\x56\x61\xf8\x54\xed\x05\x29\x31\x74\x85\x18\x12\xd0\xff\x76\x74\xf9\x5e\x97\x9d\x59\xdb\x91\x35\x91\x64\x04\x0f\xd2\x1e\x6e\x00\xd5\xdd\xab\x42\xd8\x0d\xaa\xed\x6f\x01\x21\x64\xaf\x58\x3b\xef\xb8\x98\xc2\x0f\x4a\xf7\x41\xda\x40\x27\x81\xd5\xb7\x53\x0d\xc1\x5a\x9b\x5a\x65\x7a\xab\xea\xcf\x43\xd9\x54\x62\x6f\x5b\xe1\x68\xf3\x3c\xd0\x86\xd8\xd6\x12\x3b\x9f\x78\x6c\x78\xec\x4b\x1f\x67\x60\x7c\x5f\x9f\xf4\xd8\x62\xc3\x8e\xa8\x4e\xcb\x3c\xb7\x7b\x36\x08\xbe\x8b\xc0\x0c\x04\x29\x60\x21\xec\x92\x23\xa6\x15\x85\xb6\x43\x59\x41\xc5\x9b\x7d\x03\x06\x30\xed\x02\xca\x02\xd2\x3d\xdc\x81\xdd\xd9\x4b\x04\x89\x11\x25\x18\x50\xb2\x9e\x4b\x22\xf7\xd4\x39\x63\xcf\xe6\x93\x3f\xff\xb9\xda\x90\x74\x31\xfc\x02\xae\x8c\xad\xed\xd7\x8b\x17\xc3\xaf\xed\x35\x66\xb3\x4d\x55\x68\x8f\x6a\xd5\x5f\x1a\xa7\xa4\xe0\xc4\x32\xb0\x4b\x48\x55\xef\xa8\x91\x58\xeb\x13\xf3\x5e\x08\x06\xf9\x84\x29\xbf\xdb\x26\x2f\xf2\x7f\xd2\x3d\x97\x4c\xd8\x0e\xe1\x46\x9f\x81\x0b\x24\xd0\x71\x07\xce\x66\x1d\xb5\x85\xb0\xa5\xd1\x4b\xf9\x35\xc4\x56\x28\x3a\xde\x58\xe0\x89\x19\xd8\x4d\xe7\x69\x78\x63\xf1\x1e\x82\x94\x7b\xf8\xfb\xce\xf6\x91\xc7\xb7\x8f\xf8\xdb\xb7\x8f\xfc\x2f\xb1\x7d\xa2\x51\x15\x6b\x62\x78\x5b\xd1\xd2\x08\x87\xad\x7f\x6b\x71\x76\x1f\x20\xd6\xbe\xda\x4a\xac\x94\xc9\x4d\x12\x42\xd7\x5b\x9b\x4e\x75\x9d\xa8\x70\x13\xca\x70\x13\x8a\x5f\xb8\x09\xa3\x00\x42\x53\xfd\x87\xec\xc0\xe0\x99\x2e\x14\xf3\x9f\xb7\x0f\x7b\x22\x30\xb6\x35\xa2\xa7\x35\x7f\xdb\x76\x14\xad\xed\xd8\x0d\x8e\x84\xdb\x91\x39\x32\xa3\xe8\xc5\x6c\x55\xe4\x77\x6e\xbb\xbe\xb2\x97\xdf\x68\xe7\x89\x69\xab\x8d\x47\x45\x2e\x3b\x01\x1e\x34\x75\x6c\xcf\x99\xdc\xa3\x46\x72\xa9\x7c\x0d\x56\x4c\x10\xb8\x82\x1a\xd3\xaf\xf2\xb8\x43\x1f\x80\x09\xe1\xa1\x4a\x81\xd0\x07\x64\xb3\xc0\xc9\xd2\xb6\x7a\x03\x38\x4d\xb4\x8e\x69\xec\x02\x75\x25\xd4\xf0\x3f\x42\x4c\xf3\x8c\xe1\x18\x7f\xa6\x55\x8c\x14\x98\x8e\x38\xad\xae\x98\xaa\x2f\x75\x17\x3c\x07\x09\x01\x1f\x74\x7d\x10\x61\xca\x28\xec\xde\xa7\x88\x4d\x2e\x26\x9f\xc5\xad\x81\x25\xaa\x15\x89\x26\x23\xf4\xa7\xc2\xc8\x4f\xdf\x38\xe1\x5a\x2f\x58\x5e\xa1\xd6\xf6\xd9\xeb\xc6\xb0\x33\xc0\x65\x0e\xf4\xf9\x36\xcc\x9b\xc3\x6f\x5e\x86\xff\x85\x43\xcb\xe9\x5a\xc3\x80\x78\x8e\xda\x36\x84\x5c\x28\x0f\x4a\x0f\x6a\xe1\xb0\x27\x0e\x1e\xec\x3f\x40\x4f\x8e\xdc\x67\x96\xd5\x79\x95\x7e\x0b\xcb\xf7\x3c\x95\x23\x74\x43\xf2\x22\x47\x25\x88\x30\xc2\x05\xb1\x81\x28\x48\xd1\xbf\x84\x45\xf0\x6b\xbf\x84\x99\x2e\x00\xe2\x9a\x01\xf3\xbd\xcb\x68\xdb\x61\x86\x3b\x80\x10\xc7\xa8\x39\x01\xb9\xa3\x22\x8a\xf3\x21\x53\x88\x5a\x63\xb9\x6a\x1e\x85\xe1\xd0\x77\xee\xae\xcc\xd8\x5d\xf1\x47\xbc\x87\x0f\x02\x75\xad\x32\xb1\xe3\x1a\x22\xba\x1e\xec\xdf\x4b\x1f\x8a\x7c\x36\xa4\x49\x9d\x02\xd9\x44\x20\x8d\xdb\x12\xe6\x0a\x42\xaa\xc1\x5b\x1c\x30\xc9\x0d\xcb\x0f\x92\x20\x0d\xf1\x68\x41\x1b\x9e\x7d\x6f\x82\x3c\xaf\xc4\xcb\x18\x3b\x96\x9e\xeb\xe8\x51\x17\x0f\x5a\x9e\x9c\x9d\x0f\xe5\xb6\x2a\x9b\xfb\x10\xcc\x0b\xca\xea\xb9\xdd\x74\x60\xea\x15\x07\x10\xe5\xdb\x46\xf3\x16\x3e\xcc\xe4\x5f\xe4\xc9\x77\xad\x07\xa9\x00\x35\x11\x3b\x8e\x51\x40\x3b\x5e\x51\x0e\x1c\xd7\xea\x38\xe4\x0d\xd7\xf7\xc1\x66\x81\x0d\x2c\xcc\xbd\x75\x60\x09\xcc\xdc\xf4\xfa\x16\x11\x21\xd9\x3a\xae\x2d\x70\xdc\x3b\x14\x1e\x88\xb6\x39\x50\x19\x6b\x47\xf6\xc8\x10\x68\xf2\xf8\x51\x6d\x05\x51\x61\xee\x5d\x0b\xa2\xa8\x17\x4e\x12\xbc\xdb\x1e\xc6\x70\x12\x67\x00\x50\xbc\xe6\x08\xc4\xa8\x7b\xce\x2d\x70\xda\x01\x64\x4a\x04\x90\x76\xe9\x1c\x59\x02\x3e\x74\xce\x11\xf0\xb0\xd7\x02\x29\x59\xe2\x91\x85\x8d\x6f\xef\x35\x8d\x91\x1e\x3a\xa4\x5b\x01\xcd\xb6\xa6\x7c\x51\xc4\x57\x84\xbb\xb7\x0e\xf1\xa6\xa7\x80\x91\x42\xf1\x9e\x3c\x28\xa6\xe4\x23\x8a\x89\x7f\x3f\xf1\xce\xb0\x5f\x81\xc3\x04\x17\x4a\xf4\x1a\x9e\xb6\xae\xf2\x7f\xda\x77\x53\x78\x00\x9c\x87\x05\x3a\x42\x8f\x56\xb4\x95\x65\xed\x13\x19\xd2\x8a\xb2\xf3\x5f\x1c\x12\x8c\xb6\xc6\x5e\x8a\x5b\x0c\xab\x63\x8b\x0f\x43\x63\x7c\x23\x37\xad\x62\x6f\xfa\xbc\x88\xe2\xfc\x1c\x89\x08\xd6\x00\xc1\x82\x56\x43\x4e\x44\x50\xa0\x13\xcb\x00\xbb\xc7\x15\xaa\x38\xa2\x68\x59\xa4\x96\x89\x70\x25\x3e\x9d\xf9\x32\x08\xca\x64\x20\x36\x11\x04\x0e\x44\x3b\x06\xe9\xa2\x07\xaf\xd2\xd7\x76\x75\x07\x46\xff\x0d\x1b\xfd\xd7\x28\x0c\x84\xde\xc1\x12\x9c\x89\x1b\x70\x26\x2e\xc0\x6d\x00\xf4\xea\x27\x86\x1f\xb8\x92\x9a\x10\xe9\xcb\x1e\x06\x86\xba\xfa\x1c\x78\x04\xd2\x10\xe2\x8a\x4e\x12\x2f\x77\x0b\xb7\x57\x8d\x11\xc6\x13\xaa\x3f\xdd\x83\xb9\xc7\x2c\xb4\xa8\x0e\xe9\xef\x84\x61\x50\x98\x1e\x54\x69\x01\x75\x48\x5e\xe8\x80\x29\x20\x0a\x5e\xfa\xcd\x27\x18\x79\x72\x35\x7e\x3f\xba\x1a\xb0\x22\x09\x0d\x31\xa5\x0d\x6d\xa7\xdc\x2a\xc6\x8e\x62\x3c\x37\xf8\x73\x5e\x0a\xb3\xdf\x6c\xf2\x75\x0e\xc0\x5e\x42\x6b\xe3\xd8\xb8\xe3\x0f\x4f\x11\x3b\x76\x78\xb1\xf0\x46\x5b\x37\x8e\x3a\xb8\x5a\xd9\x7d\x87\xe0\x05\x3f\xc8\x78\x36\x7f\x62\x46\xfc\x4f\x9e\x33\x87\x8f\x46\x77\xe6\xaa\xd8\x5c\x10\x0b\x47\x4c\x7f\x8e\xe6\x08\x1e\xbe\x76\x97\xed\xec\x7e\xf1\xda\x17\x12\xc6\x00\x07\x2e\x12\x0f\x70\x2f\x0e\xe2\x9d\x8d\x77\x76\xc0\x5b\x81\x87\x36\x40\xd7\x8f\x05\xc2\x8d\xde\x19\x79\xc2\x20\x0c\x3c\xeb\xe1\xe4\xf4\xf1\x56\xb1\x55\x39\x90\xbf\x12\x6b\x61\x2d\x4b\xfd\x68\xee\xea\x6a\xbf\x33\xc3\xd0\xf9\x58\xab\xc2\xae\x15\x82\x56\xe5\x20\x5f\xc4\xf8\xd7\xfb\xca\x15\x3b\x74\x96\x3d\x4e\x40\xa9\x1f\x83\xa1\x74\x77\x15\x8e\x34\xa8\x38\xdb\x3d\x3a\x67\xd5\x32\x3e\x3d\x43\x57\xc6\x49\x9a\x21\x48\x31\xf1\xf5\x55\x58\xb8\x06\xc2\x61\xbb\x7d\x6d\xf6\xaa\x6c\xec\x89\xed\x47\xfd\xb5\xdd\x4e\xc4\xa9\x1b\x3e\x72\xa5\x8b\x5c\x3f\x30\xb6\x3a\x8e\x70\xc7\xce\xb0\x75\x23\xe2\xbf\xbb\xe2\x38\x4e\x89\x13\x49\xcc\x37\x00\xd7\x0d\x22\x0c\xa0\x9f\xe3\x56\xa5\xaf\xa6\x80\x98\x03\xda\xb1\x68\x61\xae\xab\xf2\x41\x1f\x7a\xf3\x1f\xd6\xce\x94\x73\x4e\xce\x4c\x89\x60\x33\x20\x4c\xd8\xa3\xef\xa4\x83\x1a\x17\xbb\x7e\x7c\x0e\x87\xd2\xce\x02\x56\x56\xf7\xae\xe4\x5c\x7a\x0b\x12\x58\x1e\x5a\xa7\x20\xdf\x8e\xf8\x55\x81\x5f\x45\x08\x68\x74\x2e\xf6\x98\xe6\x28\x2e\x89\xe2\x2c\xd1\xb9\x48\x87\x9a\x0b\x38\x84\xac\xb2\xe1\x2c\x9c\x98\x61\x12\x31\xe6\x03\x06\x09\x6e\x05\x48\x0c\x86\x5e\x78\x2c\xdc\x12\xd9\xee\x3e\xd5\x6b\x5f\xec\x35\x13\x77\x15\xf2\x6f\x23\x6a\xb7\x41\xab\x09\x1f\x80\x12\x7a\xc1\x79\x19\xd9\xcd\x70\x39\xef\x35\xa6\x92\x8c\xcf\x83\xfa\x62\xb8\xe8\x70\x14\xc1\x83\x31\x51\xe2\x6c\x29\xb7\x55\x15\xb8\x77\x0f\x76\x81\xe0\x35\x5a\xd5\x07\x78\xd1\x90\x06\x5b\x41\x55\xbc\x78\x64\x8d\xce\x22\xff\x4c\x21\x85\xa2\xaa\x3e\xc3\x34\x99\x50\xa6\xd7\x3b\x6d\x0c\xd2\xaf\xd0\xe1\xa1\x89\xaf\x04\x66\x4d\xac\xb1\xa1\xc1\xe0\x4d\x58\x3f\x06\x0a\x1e\x77\xbb\xaa\x86\x34\x59\xa6\xb7\x25\xdd\x11\x45\xee\xdc\x1d\xef\xcd\xdb\x47\x85\x13\xe8\x17\x42\xdb\x3b\xee\xf1\xd0\xb2\x4a\x9a\x0a\x89\x6f\xaa\x12\x4e\x58\x51\x3d\x32\x33\x94\x8f\x56\x38\xb2\xa8\x96\x35\x10\x9a\xae\x98\x66\x8e\x20\x1f\x6e\xb7\xc0\xf9\x9d\x37\x52\xad\x4c\x55\xec\x81\x91\x16\x24\x23\x5a\x31\x98\xa7\xfa\x2f\x8e\xf4\xdf\x2e\x26\x18\x57\xdc\xc6\x10\x50\x2c\x80\x99\x8a\x7d\x72\x8a\x38\x42\x15\x2f\x9e\xa4\xf0\xc8\xcd\x41\x1c\xb7\x83\xc0\x3d\x8f\x4e\x15\x2e\x9b\xf3\x6d\xc8\xcb\xf5\xbe\xc6\xd7\x1e\x79\x12\xaf\x89\xf0\x39\xb4\xd6\xcc\xbe\x80\x50\x5b\xb7\xcb\xe2\xc8\x94\xa3\x7b\xf8\x09\x4a\x07\x37\x40\x49\xfc\x2a\xfd\xae\x15\xe4\xa9\x36\xa1\x85\x45\xa1\xa8\xa0\xa6\x3b\x08\x3f\x86\x0b\x43\xe4\x91\x65\x86\x39\x5d\xbb\x26\xf2\x48\x43\xc2\x11\xcf\xf9\x73\xfe\xec\xf4\x55\xfa\x6d\x50\x31\xb7\xd5\x0d\x49\xdb\xb7\xec\xe1\x84\xbd\xc4\x4f\x01\xe5\x94\x2b\x85\xf6\x3c\xb1\x64\xf1\x06\xa7\x5d\xbb\x60\xab\x8d\x55\xf0\xb7\xf3\x33\x41\x1e\x3b\xb2\x2e\xe7\x4c\x27\x94\x73\x22\xee\xab\x47\x04\xa5\xba\x93\x15\x3a\xb5\xd9\x17\x9b\x1c\x02\x99\x60\x77\xfa\x5d\x27\xa2\x61\xa0\x08\x15\xf5\x86\xc3\x07\xeb\xaa\x34\xbb\x7c\xbd\x07\xda\xb6\x16\x21\x46\x60\x17\x8b\x5e\xbb\x38\x39\x62\x15\x83\xa9\x58\x00\xe2\x59\x15\xfd\x36\xb2\x78\xe6\x2e\xe8\xd8\xc9\x7d\xeb\xc3\x7e\xa8\xc7\xed\x6f\x07\xdc\x70\xcc\x3d\x83\x74\xb5\x41\x3b\x0d\xd3\xd5\x8c\xdc\x09\x94\x6e\x05\x31\x97\x39\xda\x2a\xcf\xe8\xdd\x65\x9c\x81\xf5\xf0\x89\x88\xeb\x40\x0a\x67\xbb\x2b\x72\xa8\x92\x82\x04\xea\xf1\x80\x9e\x63\x06\x0b\xd1\xd8\x7c\x97\xf6\x78\x21\x9e\x87\x84\xca\xc1\x1d\x65\x0a\xd4\x6f\x72\xb4\xc1\x8d\xec\x0b\xc3\x23\xdb\xc5\x76\xb8\xc1\x72\xa0\x17\xfa\xa8\xd1\x10\x2a\x6a\xee\xdb\xd2\x62\xce\xcd\x78\x7e\x02\x78\xc0\xfd\x00\x72\xef\xbe\xfe\xb4\xa5\x39\x20\xb3\x1f\xab\x2d\x3b\xd3\x00\x63\xde\x7f\xb2\x3a\xd6\xbd\x3e\xf8\x57\xcf\x45\xf0\xf4\x31\x7c\xc4\xbd\xfc\x1b\x8e\xe1\x23\x4f\xfa\x8a\x63\xd8\x5d\x41\xed\x53\x56\x4e\x36\xa2\xa5\x9d\xa5\x3b\xab\xc7\x84\x10\xa6\xf8\xd4\x73\xb6\x88\xcb\x16\x89\x7e\x83\xf1\x6d\xbb\xa6\xc3\x45\x7f\xbe\xe1\x1c\xbc\xab\x1b\xf6\xa1\x1d\x0f\xd2\xc7\xa7\x37\x70\x2d\x7c\x9f\x86\x09\x9c\xe0\xfc\xa7\xd0\x67\x94\xdf\x91\x2b\xa6\x27\x6c\xb7\x5e\x04\xf9\xa3\x9f\x07\xa6\xeb\xc9\x75\x85\x79\x5d\x82\x95\x21\x65\x15\x37\x5c\x4e\x4a\x47\x58\xa5\xec\x29\x10\xaf\x67\xc3\x45\xe8\xe1\x65\xd4\x89\x53\xdb\x35\xeb\xcf\x6c\xde\xef\xdd\xa0\x00\xc4\x03\xdc\xcd\x6a\xcd\x63\xe0\x7b\xbc\x44\xa3\x72\xd1\xa8\x66\x8f\x21\xe2\xb9\xbe\xdb\x17\x01\xf2\x1f\xad\x57\x08\xbd\x1b\x57\x22\x44\x29\x21\x84\xab\x78\x5e\xe0\x16\x56\x25\xae\xc3\x27\xb5\x76\x60\xbb\x82\x90\x61\xb7\x56\x3c\x3a\x68\xc9\xde\x35\xbe\x69\xb5\x6b\x9a\x00\xb3\x97\xc7\xeb\x0d\x84\x65\xc2\xc6\x1c\x9f\x27\xba\x0d\xb6\xea\x4b\xbe\xdd\x6f\x29\x0d\x25\xb8\x73\x3f\xb8\x58\xce\x45\x4e\xec\x70\x5c\xc6\x8e\xcd\x30\x71\x3b\x8c\xab\x73\xc5\x35\x7d\xa8\xf6\x02\xce\x15\x0f\xe4\xd9\xec\x0b\xdf\x2a\x5f\x2b\x97\x42\x9d\x51\x14\xe4\xf1\xa9\x20\xc3\x61\x08\xb1\x46\xf7\x56\x1f\xa4\x02\x31\x44\xaa\x3b\x0f\xef\x72\xbe\x7c\xdb\x65\x37\x81\x9b\x1f\xa1\x34\x03\x9f\x95\x98\x1d\x5b\xdf\x77\xd0\xa3\x30\x82\x62\x7a\x3c\xba\x54\x8c\xd1\x3f\x8e\xd3\x8c\x3c\x1a\x94\xd8\xed\x9b\x3f\x12\x02\x0d\xba\x21\xb8\x19\xde\x91\x2d\x0e\x14\x60\x61\x85\xe7\x20\xc2\x52\x6d\x24\xe8\x70\xaa\xfa\x20\xcd\x67\x20\x63\x81\xf8\x29\xdc\x1c\x4d\x85\x97\x06\x40\x70\x1c\x9d\xc0\xb7\x9d\xfc\x5f\xcb\x03\x5e\x1e\x51\x5f\x5c\x87\x41\xd4\x23\xce\x00\xa8\x52\x35\x8d\x5a\xdf\x53\x61\x5d\x8f\x83\xcc\x7e\x90\xb3\x73\xba\xbb\xf4\xbb\xd4\xd9\xb0\xad\x72\xfd\x54\x08\x80\x6c\x4d\xf5\x63\x60\xe6\xc6\xf8\xa0\x88\xee\x80\x99\x0e\xe8\x3c\x0d\x99\x0a\x44\x8b\x09\xa0\x87\xdd\x20\x22\x0e\xe0\xa0\x78\x3f\x5d\x80\x68\xd5\xb2\xfb\x38\x11\xcc\xe6\x6a\x9b\x37\x14\xd1\xa9\x76\xba\xc4\x08\x5d\x5a\xd5\x77\x28\xd8\xa8\xeb\xc6\x0b\x4d\xdb\x3e\x9e\xa7\x72\x4c\xba\x9f\x9b\x56\x6f\x67\xe5\xba\x75\x46\xf4\x94\xeb\x93\xb9\x20\x02\x57\xba\x9f\x00\x21\x70\xf4\x8b\x47\x75\x30\x81\x36\x1b\xf3\x50\xb8\x50\x64\x74\x9a\xf8\xd2\xf3\x40\x5d\x0f\x44\x01\x9d\xdf\x6b\xbf\x4e\x37\x70\xdb\x74\x8c\x9f\xc6\xaa\xe5\x9d\x4c\x4c\x34\x41\x51\x81\x5f\x67\xf1\xa5\x62\x5a\x61\x44\xc3\xe3\x38\xfa\x57\xa8\xb3\xcc\x6c\x1b\x83\x88\x20\x36\xc7\x67\x45\x45\x2b\x7e\x22\x39\x6e\xd2\x4b\xe2\xf3\x1d\xa6\x28\x1c\x15\x1d\x5d\xc1\x14\xe9\xf4\xc9\x47\x48\x4e\x74\x28\x7a\xbb\x4e\x0b\x05\xdd\xac\xd7\x40\x30\x58\xae\xcb\x0e\xaf\xc3\xac\x27\xb3\xe3\x49\xf6\x8e\xc0\xd2\x13\x56\x4e\x62\x7e\x05\x70\xfa\xb2\x0a\xb9\x0b\x33\x44\x60\x20\x31\x1f\xd2\x76\x78\x7c\xb3\xe8\xc7\x15\xcb\x27\x71\xc5\x61\xe0\xda\xde\x51\xb5\x2e\xd5\x56\x8b\x4f\x21\xf3\x8e\xa9\xbc\xdd\xbe\xbb\xaf\x95\xd1\x46\xfe\xf9\xcf\xb3\x9d\x2e\x5f\xbc\x48\xe8\x5f\x37\x57\xf4\x6f\xfb\x0f\x36\x38\xd7\x55\xb9\x01\xd9\xbb\xe2\x20\x88\x73\x84\x1e\xc0\x44\xd1\xc4\x4c\xa7\xca\x03\x7a\x79\x79\x8b\x37\x89\x2f\x3b\xcf\x04\x05\xe1\xdf\xbc\x09\xcd\x67\xf8\x46\x6b\x61\xf2\x03\x1c\xfc\xfc\x88\x7d\x0d\x8b\xdd\x76\xa0\x55\x8e\x97\xca\x93\x77\xa4\x08\x46\xb7\x55\x4f\xe6\x25\x00\xb1\x75\x61\xf2\xa1\x69\xcb\x8f\x78\x2a\x12\x27\x5d\x32\x92\xde\x42\x1c\x8a\x62\x65\xbf\xa1\xb7\x4e\x19\x39\xc6\x6e\xb7\x6f\x89\x21\x67\x58\xbe\x4b\x5f\x07\xe1\xd2\x91\xcf\xe5\x1f\x5f\x95\x74\xc3\x04\x95\xb2\x40\x08\xec\x47\x35\x60\x37\x79\xac\x20\x16\x48\xf6\x05\x69\x51\xae\xec\x47\xf6\x65\x26\x95\x11\x2e\xf9\xe1\xfc\x31\xc8\x94\x23\x59\xc1\x89\x8b\xe8\x0d\x9d\x02\x11\x2e\x6f\x54\x13\xd3\x90\x79\x5b\xeb\x37\xdc\x1b\x29\xe5\x1f\xce\xfe\x28\x47\x41\xeb\x9d\xa0\x77\xe1\x36\xfa\x1f\xce\xff\x28\x97\xad\x8a\x06\x18\x1d\x30\x32\x66\x37\x57\x7f\x3a\xfb\xd3\xcb\x74\xf9\xd3\x32\x89\x74\x70\x58\xce\xd1\x8b\xbb\xed\xaa\x22\x5f\x1f\xf8\x1a\xf2\xd5\x97\x62\x52\x4a\x26\xa2\x63\xf9\x09\x12\x83\xdb\x55\xc6\xab\xf0\x72\x82\xc6\xb7\xa0\x08\x75\x97\x09\x1c\x42\x4b\xb5\x7a\xd4\xf5\xa9\xa3\xa5\x01\xc4\x17\x92\x96\xe1\xa9\x0f\x97\xd4\x4e\xd7\x46\x67\xbd\x36\xbe\x96\xf7\xf9\xdd\xbd\xae\x45\xf4\x08\xc7\xc0\x7a\x39\x59\x5c\x5c\x8d\x26\xd7\xe3\xb9\x9c\xbd\x93\x1f\x47\xf3\xf9\x68\xba\xfc\x94\x0a\x71\x31\xfb\x71\x3c\x1f\x5f\xca\x8b\xd9\xe5\x58\x4e\x16\xf2\x66\x3e\xfb\x71\x72\x39\xbe\x94\xb7\xd3\xcb\xf1\x3c\x22\x31\x92\xb3\xa9\x1c\x4d\xe5\x60\xb4\x90\x93\xc5\x40\xbe\x1d\x2d\x26\x8b\x04\xf8\x5c\x67\xb7\x4b\xf7\x4c\x31\x7b\x27\x47\xd3\x4f\xf2\xf7\x93\xe9\x65\x22\xc7\x93\xe5\x87\xf1\x5c\x8e\x7f\xba\x99\x8f\x17\x8b\xf1\xa5\x9c\xcd\xe5\xe4\xfa\xe6\x6a\x32\xbe\x4c\xe4\x64\x7a\x71\x75\x7b\x39\x99\xbe\xf7\x4f\xb9\x9a\x5c\x4f\x96\x40\x3b\x97\xf0\x13\x27\xe3\x85\x58\x7e\x18\x41\x41\xb3\x6c\x37\xf7\xdd\x7c\x3c\x06\x92\xe3\xf1\xbb\xf1\xc5\x72\x91\xc8\xeb\xf1\xfc\xe2\xc3\x68\xba\x1c\xbd\xbd\x1a\x27\xf2\xdd\x64\x29\xdf\xcd\xe6\x72\x24\x6f\x46\xf3\xe5\xe4\xe2\xf6\x6a\x34\x17\x37\xb7\xf3\x9b\x99\xed\xce\x5c\x4e\x67\xd3\xd3\xc9\xf4\xdd\x7c\x32\x7d\x3f\x99\xbe\x4f\xe1\x15\xe3\xe9\x72\x32\x1f\xcb\xf9\x64\xf1\x7b\x39\x5a\xc8\xe5\x0c\x7e\xfb\xbf\x6e\x47\x57\x93\xe5\x27\x39\x9a\x5e\xca\x9b\xf1\xfc\xdd\x6c\x7e\x3d\x9a\x5e\x8c\x05\x10\x3d\x75\xdb\x05\x2c\xb7\x9f\x66\xb7\xa9\x5c\x7c\x98\xdd\x5e\x5d\xc2\x90\x44\x1f\xb2\x03\x3d\xa6\x76\x4f\x7e\x1c\xcb\xc9\x54\xd8\xcf\xcc\xc7\x8b\x9b\xf1\xc5\x32\xb1\x5f\x96\x27\xd3\x19\x76\x7b\x32\x9d\x2c\x27\xa3\x2b\x79\x39\xfe\x71\x7c\x35\xbb\xb1\xb3\x38\x87\x47\xce\x60\x78\x2f\x66\xd3\xe5\x7c\xf2\xf6\x76\x39\x9b\x0f\xe5\x68\xb1\xb8\xbd\x1e\x0b\x6c\xd5\x62\x29\x69\x3e\xa6\xe3\x8b\xf1\x62\x31\x9a\x7f\x92\x8b\xf1\xfc\xc7\xc9\x05\x0c\xfb\x7c\x7c\x33\x9a\xc0\xc3\x2e\x66\xf3\x39\x92\x46\xa7\x38\xe9\x7e\xc5\x88\x60\xc5\xd8\x57\x2d\x96\x93\xe5\xed\x72\xbc\xb0\x8b\xc1\x4e\xea\x14\x9a\x66\x07\xb8\x4d\x7b\x95\xca\xe9\x4c\xde\x2e\xc6\xdc\x06\x1a\x00\xc1\xa3\x34\xba\x5d\x7e\x98\xcd\x27\xff\x7b\x7c\x29\x3f\x8c\xe7\x63\x5c\x72\xe3\x9f\x2e\xc6\x37\xcb\x70\xfd\xf9\xa6\x78\x2a\x52\xcf\x4f\xe8\xb2\xc9\xbf\x49\xcf\x64\xc8\x65\xb6\xdf\x55\xa5\x7c\x5b\x43\xb2\xa7\x65\x35\x53\xf6\x94\xc2\x3f\x4c\x94\xe0\x20\x53\xb8\xf3\x3c\xc1\x59\x44\x1c\x28\x28\x58\xba\x21\x06\xac\xc8\xa1\x83\x0d\x89\x4a\x40\xc8\xbc\xc7\x1f\xb2\x5e\x32\x98\x5a\x2b\x68\x90\x44\x16\x58\xc1\x34\x6d\xd5\x46\xae\xf4\xba\x02\x02\x72\xf5\x88\x11\x1e\x68\x22\x7e\x3c\x95\xa3\xa2\x08\x30\xab\xa6\x2f\x5c\x98\x08\xc7\xc0\x4b\xe0\xd9\xe2\xc0\x7d\x4b\xe8\x62\x31\xfb\xfa\x21\x7f\xf0\xe0\xb4\xa8\x00\x35\x34\x97\x6e\x98\x76\x90\x73\x8c\x78\xe4\x80\x52\x03\xa6\x74\x42\x80\x50\x5e\xb2\x0a\x3e\x91\x13\xf3\xe9\x14\xd5\x84\x86\x7c\x29\x61\x6b\x52\x21\x7e\x03\xa1\xda\xa0\x41\xb7\x3b\xe0\x96\x68\x28\xae\xeb\x02\x71\x08\x27\x6a\xec\xdd\xce\x7f\x83\x72\x58\x10\x88\xb0\x66\xbe\x62\x70\x70\x5e\x6e\xea\x9c\xc5\x37\x30\x2d\x7e\x02\x98\x65\x08\x34\x67\x7a\x5d\x28\x48\x26\xfd\x65\x9f\xdd\x21\x26\x0c\x99\x0b\x86\xae\x6c\xa8\x3f\x86\x16\xc3\x7f\x8f\x26\x18\xa2\xa0\x16\x3d\x10\xd2\xec\xb0\x76\xec\x4d\x84\x41\x95\x35\x27\x4b\x5c\xe9\x16\xe8\x5d\xc8\xc1\x0d\x78\x06\xf9\x4e\x95\xcd\x60\x68\x1d\x5d\x7d\xc7\xa1\x78\x02\x4d\xc3\x03\x82\x8f\x01\x35\x71\x17\xf1\xda\x0f\x46\x71\xe3\x83\xb5\x33\x38\x68\xac\xde\x56\x1e\x1c\x7f\x6c\x6b\x8f\x30\x06\x3a\x78\xad\x6d\xf0\x27\xa6\xf0\x13\x8e\x00\xe2\x3c\x3d\x63\xaf\xee\x3c\x3d\xef\x44\x38\x60\x05\x24\xb8\x49\x99\x0a\x92\xd5\x16\xad\xa3\x17\xbc\x40\xf8\x9d\xb8\xab\x2b\x88\xcc\xe4\x0f\x3a\x60\xc3\xcc\x37\xb4\x9f\x5a\xa4\x92\x01\xe3\x21\xa5\x2f\x6d\x3b\x11\xb9\xf7\x46\x9e\xe4\x43\x8a\x7a\xe6\x25\xf0\xbb\x50\x18\x7e\xa7\x0e\x51\xf7\x94\xdc\xee\x1b\xa4\x61\x87\x8f\x43\x84\xd1\xb3\x41\x0a\x82\xc6\x73\xc4\xa9\x96\x3b\x65\x10\x61\x48\xc0\xd5\x3d\x9a\x0a\xfd\xb5\xd9\xed\xd1\x04\x02\xd8\x93\x3c\xc7\xfa\x8c\xac\x56\x8f\x92\xec\x70\xb7\xde\x71\x31\xb7\x03\x55\x47\x00\xcf\x82\x16\x5f\xe7\x45\xb0\xa5\x5a\xc3\xe6\x06\x2a\x81\x30\x86\x23\xbc\xa4\x2e\x02\x8e\x6c\xa7\x0e\xb8\x5d\x02\x6d\x1b\xd6\x1a\x8b\x07\x2a\xc3\xd9\x0d\x46\x97\xec\x16\x22\x88\x14\x14\x06\xec\x74\x8d\x7c\x18\x1e\x80\x32\xe9\x3b\xad\x57\x87\x78\x8d\x04\x8b\x50\x1e\x5b\x84\xc7\x18\x60\x59\x63\xe3\xcb\x2e\xaf\xa3\x22\x76\x1c\x18\x5e\x98\x3b\x5d\xe7\x55\x16\x90\xf5\x01\x92\x82\x20\x1b\xe0\x23\x93\x8d\x98\xc8\x7b\x55\x67\xf8\x2f\x28\xdc\x7b\x80\x31\x0d\x3c\xdf\xa7\xf7\xae\x70\x7a\xaf\xcf\x6d\x5e\xd9\xbb\x79\xe3\xa1\xe2\xb1\xe9\xdb\xbb\xdd\xf1\xc2\xbe\x64\x76\xbc\xe0\x9f\x90\xba\x7e\xa8\x3e\xeb\x8c\xce\xf8\xfc\x41\x0b\xe5\xcc\x4e\xc0\xd1\xe1\x99\x56\x9b\xc6\x97\x0d\xd8\x2b\xa7\x2a\xb2\x90\x75\x28\x83\xc1\xb8\x57\x19\x7d\x2a\x06\x96\x44\x64\x05\xe1\x3a\xb5\xb7\xc3\x2b\x77\x01\x90\x14\xd0\x53\xc7\x3c\xaf\xf8\x68\x13\xd3\xf9\x89\x88\xc0\xff\xf8\x93\x93\x12\x94\xf0\x60\xb7\x88\x6b\x6d\xaa\xe2\x41\x67\x1e\xce\xb0\x3a\xf8\x8c\x5c\x2d\x8d\x6e\x9a\x02\x5a\x3e\xf4\xac\x5c\x0d\xd4\xf8\xc3\x2d\x47\x37\x73\x5f\x4f\xfd\x9e\xa1\x69\xc7\x98\x83\x3b\x94\x1e\x54\xb1\xd7\x2d\x3f\xf8\xe9\x53\xbc\x67\xe7\xe0\xae\x11\x2e\x4c\xd6\xa8\xcf\x20\x74\x69\x6f\xa8\xf5\xba\xda\x43\xa3\x64\xa6\x71\x23\x39\xc4\xf8\x16\xfe\x52\xd5\xd2\x35\x02\xc7\xe9\x80\x7a\x4d\x75\xe0\xab\xfd\x06\x11\x80\xb8\xfb\x1e\x28\x64\x1a\x1a\x26\xad\x56\xfd\x06\x5b\xf5\x1b\xbb\x97\x11\xc5\x64\x9b\xa6\xcb\x4c\xec\x8d\x0e\x22\x06\xcc\x0c\x6e\xa2\x3b\x9f\x57\x62\x55\x1b\x52\x29\x31\xba\x40\x69\x77\x34\x9d\xee\xd5\x83\x16\x10\xa9\x7b\x50\x45\x9e\x79\xfb\x89\x13\x6d\x14\xd3\x08\x9e\x14\x58\x8d\x7e\x0a\x03\xcb\x27\xb6\xbb\x82\xbf\x38\xae\x6d\xef\xf3\x58\x3b\xf9\x6a\x32\x7a\x3b\xb1\xae\x46\x2a\x04\xda\xc0\xd3\x99\xbc\x98\xcc\x2f\x6e\xaf\x17\x4b\xeb\x72\x2c\xc0\x07\x71\x7f\xc2\xf8\xf9\xf2\xc3\x78\x36\xff\x94\xc8\x8f\x1f\xc6\xe0\x11\x2c\x67\xf3\xa5\x3c\x71\x0e\x96\x98\x8e\xdf\x5f\x4d\xde\x8f\xa7\x17\xe3\x61\x82\xee\xc2\xc8\x3a\x19\xb3\x39\x7a\x10\x1f\x27\x8b\x71\x22\x17\x1f\x46\x57\x57\xfd\xfe\x46\xe2\xbd\x0d\x11\x78\x1b\x09\xfb\x21\x97\x93\x05\xff\xce\x76\x22\xf4\x74\xdc\x67\x16\xb7\x37\xd6\xf1\x9b\xb3\x37\x30\x7b\x27\x16\xb7\x17\x1f\xd0\x35\x1b\x2f\x12\xf9\x76\x0c\xbd\xbf\x1a\x5b\xa7\xcb\xfa\x3f\x91\x93\x73\x33\x9e\x2f\x66\x53\x74\xe7\xa6\x9f\xe4\x64\x7a\x39\x99\x83\xa7\x64\x1d\xa6\xc9\xe8\x2a\x11\x93\xe9\xc5\xe4\x72\x3c\x5d\x8e\xae\x12\x74\x69\xa6\x8b\xf1\xff\xba\x25\xff\xe4\x72\x74\x3d\x7a\x3f\x5e\x38\x57\xe4\xc3\xc8\x0e\xc1\x78\xfe\x8c\x17\x2a\xf8\x7b\xf6\xbd\x57\xb3\x05\x3c\xe0\xfd\x6c\x76\xf9\x71\x72\x75\x95\x80\x78\x89\x5c\x2c\x67\x37\x37\xa3\xf7\x63\x3b\xb2\xd7\x37\xb7\xf6\xa1\xef\x46\x93\xab\xdb\x39\xf8\x98\xd7\xa3\xab\x77\xb7\xd3\x0b\x7c\x1a\x35\xde\xce\xa0\x1d\x6b\x76\xdf\xae\xad\xdb\x1a\xb5\x12\x5f\x66\x47\x65\xfc\xe3\x78\x2a\x27\xef\xa4\x1b\xab\x4f\x38\x51\xe2\xc3\xe8\xc7\xb1\x7c\x3b\xb6\x7f\x9d\x5a\x7f\xd4\x7a\xd7\xe8\x8d\xde\xcc\x16\x8b\x09\xae\x22\xfb\x2b\xf8\x26\x3d\x39\x65\x07\x2d\x58\x73\xc2\xad\x39\x5a\x02\xd6\xed\x1c\xdd\xdc\x5c\x7d\xb2\x13\xe1\xff\x68\x87\xe0\x72\x3c\x5a\x7e\xb0\xcd\xc3\xe9\x18\x5d\xc9\xc9\xf4\x77\xb7\x73\x70\x5c\x6f\xaf\x96\x76\xad\xbd\x9b\xcf\xae\x83\xd6\xbe\x58\x48\xbf\xfa\xd8\x9d\x1e\xff\xb4\x1c\x4f\xf1\x25\x93\x0b\x98\xf2\xab\xd1\x47\xeb\x13\x7f\x98\xbc\x9d\x2c\x17\xf8\x75\xdf\xc8\x54\x2c\x66\xd7\x63\xf9\xbb\xdb\xf9\x64\x71\x39\x21\x6d\xa3\xcb\x19\x36\xf4\xea\x6a\xf6\x91\x1e\x7a\x71\x75\xbb\x80\x3e\xcd\x5b\xbb\xca\x2f\x0d\x71\x6c\x65\x24\x72\x61\xdb\x36\x5a\x06\xcf\xb1\xf3\x14\x3c\xe8\x7a\xf4\x29\x1a\x1b\x61\x3d\x7c\x47\x02\x7d\x9b\x2e\x52\xf9\xde\xae\xfc\xe9\xb5\xed\xdc\xd8\x6e\xd3\xc5\x78\xbe\x20\x5e\xc5\x0e\x40\x46\xfe\xf9\xcf\xc0\x37\x56\x43\xad\x75\xde\xe8\x6d\xf2\xe2\x05\xf2\xb7\x28\xe4\xd7\x96\x79\xa4\x25\xf7\xfa\x37\xf2\x22\x7d\x97\xce\x53\x71\x9e\x9e\xbd\x3c\x93\x27\xb3\x75\x93\xca\xb3\xdf\xfe\xf6\xdb\x61\xd2\x92\x70\x8a\x1e\xdd\x21\xc4\xb0\xaf\x29\xb3\xe8\x43\xa2\xcb\x9a\x11\x65\xbc\xa9\x69\x41\x32\x5e\xa1\x69\x1b\xb7\x4c\x9e\x9d\xa7\xe7\x67\xe7\xe2\x64\xa1\x77\xdc\x36\x40\xaf\xda\xb6\x39\x71\xbd\xf6\xc7\xa1\x35\xfe\x97\xe7\xe7\xdf\xa7\xdf\x9f\xbf\x3c\x3f\x3d\x63\x3d\x47\xe1\x7e\xf5\x5a\x9e\xfc\x6e\x5f\x6a\xee\xb5\x3d\x5c\x71\xe0\x21\xb6\x0d\x77\xe3\xb8\xcc\xe4\x2d\x48\xe5\xa8\x35\x0a\x1e\xf4\x64\xcf\x4b\x6b\x00\x02\x68\xb7\x03\x02\x71\x4a\xbe\xc4\xcf\x7b\x3d\x59\x5c\x8c\xaf\xae\x46\xd3\xf1\xec\xd6\x4e\x66\x48\x87\xfe\x08\x32\xaa\xb6\x67\x44\xd1\x2f\x81\x42\x75\x55\xa8\xf2\x73\xda\x1f\x86\x74\x8a\xc4\xb5\x16\x18\x28\x75\x12\x56\x4f\x93\xd7\x38\x73\xd3\xb6\xeb\x3c\x85\x58\xd1\x6c\xea\x76\xba\xdd\x9e\x10\x27\xb1\x6d\x1c\xbb\xec\xc4\x1a\x42\xf5\x04\x96\x24\xb2\x8b\x36\x2c\x77\x83\xe9\xcb\x56\x34\xc3\xd7\x76\xbd\x4e\x1c\xda\x07\x5b\xe8\x73\xec\x99\xda\x2a\xb0\x43\x6b\x60\x8b\x38\x5e\xfb\x50\xed\x81\x85\x1d\x9c\x99\x10\x47\x5f\x6d\x7a\xd8\xe6\x5d\xf2\x8b\x85\xb2\x31\x74\xee\x68\xa8\x11\x0a\x2e\xda\xa8\x27\x5f\x1b\xe5\x8b\x8c\xd0\x30\x7a\xd0\xe5\x9e\xf8\x99\x1d\x1b\x3d\xf8\x99\xd8\x14\x6b\x19\x62\x71\x10\x34\x25\x09\x54\xcf\x1c\xfe\x74\xa3\xd6\xd6\x72\xc0\x6c\x9a\x83\xcb\x80\x4c\x21\xe6\xa2\xc1\x3a\xa6\xc8\xab\x6d\x5d\x53\x85\x58\x0b\xf8\x4c\x37\x54\xe0\xc6\x93\x00\x94\x50\x8e\xa1\xff\xba\xcf\x11\xc9\x02\x15\xc3\xa9\x18\xff\x04\x07\x23\xb0\x32\x2d\xbd\x16\x69\x6e\x42\x60\xb3\x91\x5f\xb1\x9c\x92\xe3\x64\x48\x64\x51\xf9\x82\x85\x67\x6b\x53\xec\x0a\xf7\x61\x6d\xce\x3d\x81\xed\x44\xc5\xaf\x3b\xd0\xaf\xc3\x2d\xb7\xa7\xd2\x19\xfb\x6c\xbb\x44\xa9\x4f\x6f\x8f\xf6\xe9\xed\x7f\xb5\x3e\xfd\x67\x53\xe2\xfd\xb7\xfa\x49\xbf\x99\x2d\xae\x4e\xcf\xd2\xb3\xff\x34\xfe\xc7\xf3\xf3\xef\xbe\xeb\xf2\x3f\x7e\xff\xf2\x57\xfe\xc7\x7f\xc4\xcf\x92\x93\xb6\x8e\x42\x98\x63\x8b\x0f\xa9\x3c\x4b\xcf\x28\xe8\xdf\xff\x11\x08\xdc\x3a\x4e\xb9\x61\x08\xa4\x01\x88\x18\xd7\xb4\xc0\xf1\x5e\x6d\x04\xd2\xcf\x43\x45\x1b\x7e\xd5\x71\x7c\x00\x2f\x9e\x75\x20\xad\x2d\x01\x75\x6f\xd1\xc3\xab\x7a\x30\x84\x3b\x96\x24\xe2\x9a\x7b\x7b\xeb\x73\x06\x95\xf1\x37\x5b\xa8\x1d\x06\x48\x68\x2c\x1e\xe1\xa9\xa2\x39\x38\x5a\xc5\x44\x56\xc2\xbe\xff\x8d\x60\x56\xe2\x2c\x40\x5b\x1f\x19\x1c\xc7\x90\x79\x26\xc4\xd9\x10\x09\x41\x10\x3f\xcc\xaf\x72\xe9\x6f\xee\xc2\x71\x76\x90\xd3\x67\xe9\x41\x80\x74\x63\xa7\x9b\xbd\x2a\x90\x77\xc7\xa7\x31\xe0\x86\x2b\x3c\xe4\x2d\xab\xe2\x04\xb3\x4b\xfc\xaa\x21\x02\x92\x08\xaa\x19\x0d\x00\x22\x17\x01\x84\x6c\x6d\x82\x1f\x84\x58\xc1\xa7\x77\xb5\xde\x21\xbd\x63\x4b\x7d\xf0\x64\xd0\x46\x81\x0c\x86\x64\x67\x40\xbc\xb2\x33\xba\x3f\x08\xb1\x86\x47\x06\xb7\x79\xa8\x64\xda\x6e\x8b\xb5\x1d\xda\xaf\x70\xe2\x2a\xd0\xf9\x24\xc2\x87\x3e\xe4\x0c\xae\xf0\x4f\x8d\x9f\x58\xd5\x3d\x0f\x24\x0c\xb6\x08\x5a\xe5\x22\x35\x1d\xaa\xfb\x23\xab\xe1\x07\x1e\xe1\x6c\x48\xd4\xc3\x54\xcd\xd6\xee\x13\xb6\xbb\x38\x10\xf5\x0f\x7e\x49\xf3\xa8\xec\x0a\x75\x78\xe2\x4b\xa9\x10\xe7\xc1\x42\xbb\xc1\x78\xd6\x7f\xc6\x2a\x4b\x22\xae\x14\xaa\x10\x15\x47\x08\x52\x3c\xb6\x89\x2b\x27\xec\xc8\xe9\xed\xaa\xca\x72\x0f\x60\x8c\xba\x2c\x40\x4e\xa1\x2e\x23\x9e\x73\xf7\x8c\x93\x81\xdb\xa5\x58\xc6\x3a\x80\x01\x44\xd6\x15\xe0\x2d\x70\xb4\x2a\x80\x72\x86\x92\x0d\xa3\x8a\x9e\x05\xff\x8f\xdd\x9b\x7e\x15\xb5\x3a\x20\x9e\x6a\xbe\x74\xcd\xef\xc0\xae\x84\x78\x15\x2c\x88\x3e\x22\x30\xf0\x9d\xc0\x07\x7e\x96\xec\x50\x84\x64\x87\xf1\x0a\xf4\x6c\x87\xb2\x87\xed\xd0\x25\xb9\x9c\xbb\x20\x62\x94\x37\x99\x95\xf6\xeb\xf7\xa8\x2b\x10\xc0\xd1\x9e\x9e\x0f\x01\x1e\x02\x2a\x5f\x70\xd5\xbd\xdc\xaa\xf5\x7d\x5e\xea\xd3\x5a\xab\x0c\x06\xf8\x18\xd1\x48\xab\x33\x02\xcf\x95\xa2\x62\xca\x3d\x24\xce\x0d\xbe\x1c\x77\x1b\x16\xab\x6b\x90\x3f\x20\x4c\x2a\xdc\x6f\x49\x39\xb0\x05\xb7\x33\xaa\xc9\x0d\x4b\x02\x04\xd5\x5c\xab\x83\x64\xb1\xcd\x6e\x37\x8e\xf2\xa5\x60\x71\x39\x96\xc8\xe2\x73\x6a\x0d\x10\x99\xaa\x3e\xf4\x97\xd4\x0a\x4f\x80\x9e\x97\xfa\xcb\x4e\x97\x06\xf3\xd5\x19\x56\x85\x96\x39\xa6\x6a\xd7\xda\x18\x0e\xca\x6e\xb0\x6e\x00\x46\x47\x19\xd7\x6f\xc1\x48\x49\xd3\x3a\xbb\x3b\xe3\x85\xee\xde\xca\xa1\x52\x03\xee\x13\x10\xb7\x62\xc6\x89\x23\x1d\x81\xd2\xc5\xaf\xbf\xc9\x19\x74\x8b\x27\x8a\xb7\x3b\xba\x6b\x4a\x88\xd7\x43\x39\xc6\xcd\x6a\x17\xed\x3b\xeb\xb0\xf2\x3d\x4e\x44\x5e\xd3\xaa\xb9\x77\x00\xb5\x4e\x86\xdd\xc1\xc6\x7c\x9d\x6d\x90\x1f\xb2\x2f\x65\xfe\x2c\x93\xf8\x16\x9a\x84\xc9\xa4\x12\xfc\x80\x75\xa9\x6a\x8d\x55\xd1\xaa\x3c\x08\xf4\x8c\xfb\xe9\xba\x1c\x63\x51\x55\x07\x85\xc9\x5e\xf8\x91\x84\xf9\x38\xc8\x32\xad\xf8\x30\x0e\x10\x67\x81\x74\x45\xfb\x74\x01\x5d\x92\x90\x84\x0a\xcf\x63\x57\x76\x10\xa4\x64\xa8\xfe\x3f\xc8\xba\xf5\x9c\x60\x61\x7c\xcd\x53\x1b\xd9\x66\x11\x3d\x40\xd4\x9a\x06\x05\x46\x69\xc8\xe2\xbe\x3e\xa0\xd0\x30\x84\x11\xf0\xcf\x58\x1d\x85\x78\x75\xd1\x77\x5d\x7c\xc5\xf4\x01\x7d\xcd\xae\xd6\xd4\x00\x46\xad\xfb\x7d\x0c\x51\x0c\x0f\x5a\xc3\xa3\xda\x57\x21\x61\xac\xae\xa7\x8a\xa8\x3c\xb4\x8e\x97\xf8\xd0\xf0\x60\x4b\x2c\xad\x85\xb2\x3b\xe5\x0f\x0a\x9f\xc3\xf9\xd6\xae\x51\xe2\xd8\xb9\xd4\xbb\xa2\x82\x3c\x4f\x78\x80\xf7\xfc\x39\x3c\xc8\xf7\xa6\x23\xbb\xdd\x21\x11\x3f\x6a\x06\x51\xd5\xde\xa3\xe2\x42\x21\x06\xa9\xc6\x9d\xeb\xfb\x2a\x91\x52\x39\x4a\x75\xe4\xd9\x09\x96\xcb\xa7\x6a\xef\xd8\x37\xc1\x70\x7f\xbe\x39\x60\x71\xfa\x8c\x27\xae\x19\xeb\x19\xec\x74\x6d\x88\x13\x6c\xab\xb2\x90\xbc\x00\x09\x83\x54\x00\xfa\x87\x80\x22\x13\xc4\xc0\xe8\x3c\x40\x6d\x99\x0b\xd1\x96\xba\x79\x84\xe5\x33\xb2\xdf\x65\x55\x55\xaf\x2f\xe7\xbc\x04\x32\x0a\xaa\x8d\xdb\x5d\x2e\x5d\x95\x84\x71\x2c\x2e\x40\xeb\x99\x29\x97\xfa\xda\x48\xd5\xee\x6f\xfb\x94\x21\xd4\xbd\x9b\xc5\x08\x64\xef\x6c\x52\xeb\x63\x15\xc5\xb3\x65\xa1\xc0\x7c\x57\xf7\x05\x76\xce\x4e\xd6\x43\x1f\xa5\xfd\x6e\x18\x2a\x6f\xc9\x39\x9c\x60\x01\x25\x40\xad\x1b\x95\x97\x49\x1f\xd9\x33\x9d\x17\xbe\x57\x22\xb6\xad\x09\x16\x9e\x30\xfd\x04\x1e\x8f\x49\x1f\xff\xa0\x93\x2d\xe6\xe2\x42\xf1\xc4\x7d\xce\xb7\x8e\xd7\xe0\xf2\x95\xa7\xc1\x6c\xc1\x6d\x5b\x66\x90\x66\x76\x45\x28\x90\x45\xfc\xd2\x84\x94\xef\x0d\x23\xce\x60\x25\x0d\xc2\xd1\x40\x86\x84\x74\xe0\x86\x43\x78\xfe\xd9\x16\xe7\x55\x6b\x28\x64\xef\x50\x20\x83\x6d\x5d\x1f\xa4\x12\x8e\x1b\x47\x76\xdf\xf8\x2c\x61\x46\x50\x0e\x0f\x92\x86\xae\xb4\xd7\x21\xef\xfb\xee\xc3\xef\x87\x4e\xa3\x1a\xdd\x2c\x27\xd4\x6c\x47\x8d\xff\x14\x18\x63\x54\xc7\x6d\xfc\xb9\xe0\xef\x61\xc2\xe8\xf5\x5d\xbd\x50\xbd\xfe\x58\xf6\xd8\xf0\xec\x0a\x74\x8f\x98\xdc\x44\x3b\x7f\x75\xf0\x5f\xe2\xe2\x50\x8c\x22\x42\x5d\x64\x70\xe1\x05\x1c\xec\xdc\x34\x88\x23\xa4\x72\x7c\xfc\xfe\xa4\xd5\x1c\xda\x1b\xbb\xba\x5a\x6b\x8d\x6c\xbe\xda\x1e\x21\x6b\xd2\xae\xef\x74\xed\x09\xf1\x65\x8a\x40\x47\x28\x5f\x18\x26\x4a\x8e\x0a\x86\x82\x26\x4c\x81\xc6\xa7\x0f\x52\xdf\x15\xb9\xce\x02\x06\xc1\xc4\xd1\xcb\xfa\xba\x31\x8c\xc9\xd3\xcc\x50\x18\x3f\x40\xe2\x8e\xaf\xc7\xd3\x65\x88\xe4\xc5\xf4\x46\x55\xcb\x77\x93\xe5\x74\xbc\x58\x74\x20\xbd\x92\x20\xbd\xa9\x78\x1e\xc0\x4b\x29\xd2\xd9\x7c\xf2\x7e\x32\x1d\x5d\x61\x06\x37\x42\xec\x42\xd4\xe8\x08\xfc\x75\x5d\x95\xa6\xc9\xb1\xc4\x4e\x95\x52\x1b\x43\xb4\xe3\x9e\xd4\x3e\xac\x1e\x9e\x56\x61\x78\xa3\xb3\x5c\xba\xc0\x53\x32\x98\x82\x69\xf1\x52\xe4\xa9\x10\xbf\x19\xca\x2b\xcf\xc4\x08\xd6\x07\x15\x4b\xa6\xf2\xb6\x44\x2d\x63\xb9\xce\xeb\xf5\x7e\x8b\x72\x04\x88\x73\xd8\xf3\x9f\x90\x45\xbb\xb9\xd7\x55\x7d\x48\x04\xdf\x6c\x76\x29\x55\x75\x23\x4f\x7c\x1d\x7e\xa9\xef\x8a\xfc\xce\xae\x20\xcc\x2c\x02\xe9\x74\xd2\x62\x9d\x26\x9a\x1d\x27\x7f\x06\x3c\x32\x50\x01\x8c\xdc\x21\x60\x8a\xc1\xb5\xe7\x8e\x17\xe6\xc1\xf6\x8c\xd8\x24\xc6\x0f\x4b\x06\x8e\x34\x55\x00\x04\xce\x8e\x34\x96\x1b\x81\x20\x2f\x65\x99\x3c\x61\x97\x6d\x90\xdd\x53\x98\x76\x6a\xd7\x0d\x47\x25\x9d\x74\x17\x12\x0c\xaf\x2f\x76\xf4\xe4\x62\xe5\x77\x6f\xaa\x5a\x14\x15\xb8\x03\xf2\xae\xaa\xb2\xc7\xbc\x28\x12\x0c\x10\x9a\xa6\xda\xed\xd4\x9d\x4e\xfc\x15\xbd\x51\x79\x01\x12\x10\xf6\xbe\x2f\x98\x56\x2a\x61\x04\x09\x1c\xeb\xd6\x9c\x65\x25\x2c\xce\xd5\xba\x9e\xd6\xd2\xbe\x4c\x1b\x97\x8f\x08\xe7\xdd\x97\x59\xc3\x24\x08\x2a\xa3\x21\xe2\x13\xf7\x47\x48\xd0\x69\x85\x3c\xcf\x38\x15\x40\x4e\xf0\x97\x3d\xf8\x5f\x76\xb4\xa0\xf8\xd3\xfb\x15\x55\xfd\xc2\x08\x3f\xfb\xad\x9a\xc9\x80\x91\xb2\x50\x8f\xce\x18\xa5\xb4\xb0\x6f\x62\x2a\x17\xd5\x56\xcb\xbf\xec\xeb\xdc\x64\x39\x62\x77\x04\x57\xfb\x58\xa7\x88\x1e\x4a\x9e\x0d\x12\x6a\x84\xfd\xf3\x8b\x41\x1e\x5b\x0b\x89\x80\xa8\x59\x6e\x82\xe7\xa0\x9c\x9e\x7b\x10\x53\x73\xba\x91\xf9\x54\xed\x53\x21\x7e\x3b\x94\x23\x2f\xeb\x6a\xbf\x13\x20\x8f\xfb\x4a\xfe\x9f\x08\xf6\x09\x80\x04\xb7\x6e\xcd\x76\x8d\x74\x84\xa5\xd4\x9b\x8d\xdd\x6c\xde\xfa\x89\xf6\xab\xf5\xd3\x90\x0b\x8a\x11\x89\x35\xe9\xbd\xcb\x87\xaa\xe0\xea\x1d\x05\xe7\x0e\xa4\x4e\x83\x6b\xb4\x8a\x8c\x29\xd1\x3e\x8a\xd0\xd1\xd0\x85\xd1\xc0\xbd\x1b\x1d\xfa\x27\xa1\x12\x02\x4a\x1d\x7a\x10\x95\x58\xe9\xe6\x51\xeb\xd2\xdf\x67\x44\xe1\x32\x0c\x83\x4e\x3b\x2f\x3e\xe8\xf8\xf7\x3a\xe6\x84\x38\x12\x67\x75\x06\x75\x53\xb1\xf4\x80\x0e\x6b\xb5\x5b\xd8\x4f\xef\xab\x19\x71\x46\x96\x20\x3a\xf1\xb0\xb7\x3c\x55\x04\xf2\xe8\xb4\x4e\xd5\x63\xa5\xdf\x4f\x0e\x82\x3c\x3e\x08\x79\x78\x3d\xfb\xb2\x62\xb1\x3a\x20\x34\xc1\xc7\xf0\x0b\xf5\x88\x97\x9f\xfe\xeb\x3e\x7f\x50\x05\x58\x01\xea\x11\x9a\xc2\x27\xc1\xbe\x6c\x6a\xa0\xca\xa7\x98\x04\xf1\x97\xe2\xcc\x8b\xc6\x8e\xeb\x01\x9c\xab\x1a\x84\x33\x01\x99\x1f\xa8\x35\x1c\x1f\x34\x42\x81\xf6\x8f\x1d\xfe\x25\x43\xea\x2c\xc8\xd1\xc7\xca\xc7\x1d\x16\x01\x2a\x3a\xb7\x9b\xbf\x4f\xe0\x9a\x4e\xad\xd8\x9d\xf5\x80\xdb\xd0\x6c\x61\x39\x7b\xdc\xad\x10\xc6\xd1\xb5\xf8\x8a\x55\xe0\x61\xad\x51\xeb\x60\x71\x41\x17\xe8\x0c\xb6\x7b\xea\xbe\x2a\xe9\x1a\xe0\x80\x7b\xe0\xef\xc7\xfe\xc4\xd9\xcb\xa1\xbc\x06\x20\x73\x54\x91\x60\xcf\x52\x8a\x5c\x8f\xd6\x78\x52\x3c\xd9\xc5\xb8\x68\xc4\x11\x11\x87\x9d\xfc\x9a\xa5\xde\xdf\x49\x57\x84\x92\x5b\x07\x12\xd6\xd0\x3e\x6f\xd8\x19\x5e\x57\xfb\xba\x89\x4b\x06\xd0\xdf\x5f\x4c\xe4\x05\x96\x32\xeb\x0c\xea\x9c\x89\x8a\x50\x38\xcc\x0f\xc6\xb9\x3a\x5a\xb9\x48\xed\x11\x55\x53\xe2\x93\x73\x23\x07\xdd\xc1\x12\x9d\xc1\x1a\xc8\x75\xa1\x50\xcc\xb0\x8b\x5c\xe6\x48\x8d\x8f\xb1\x3b\xbb\x0a\x49\xdd\xa9\xbe\xd0\x57\xe0\x9d\x9d\x0d\xe5\xef\x82\xdb\x25\x91\x3f\xea\x72\x8f\x2b\x13\x91\x40\xa0\x54\xa9\x1e\x49\xfd\xc8\xc9\x6c\xc0\x30\x05\xa4\x3b\x31\xa9\x2f\x45\x04\x56\x80\x39\x6a\x88\x6b\x89\x91\x07\xfb\x9a\xd5\x91\xc2\x7b\x0d\x91\x35\xf8\xa1\x28\xb8\x0a\xfa\xd9\x58\xf6\x89\xe0\x52\xf7\x47\xbb\x4b\xf6\xeb\xc6\xc0\xe6\xd9\xd5\xf9\x56\xd5\x07\x27\xdb\x9c\x78\x8b\x0d\x6c\x77\x3e\x1e\x60\x04\xa2\x17\x7b\x60\x6b\x8e\x9c\x79\x50\x88\x78\x5a\x6d\x4e\xe9\x6e\xa6\x02\x1e\x38\x2c\x84\x6a\x93\x0a\x68\x79\x5b\x02\xfb\xc1\x94\x42\xe2\x17\x10\x5f\xc5\x0f\x94\x08\x11\x52\xb6\x95\x1c\x4b\x98\x44\x07\xd1\x42\x21\x7d\xde\xfb\xaa\xca\x4c\x7c\x04\x62\xc3\x74\x86\x63\x7f\xd4\xec\xaa\xf6\x8d\x1d\x24\xe8\xa5\x59\x57\xbb\xee\x39\x63\x0f\x59\x28\xe4\xe0\x53\x86\xf7\x62\x58\xb8\xef\x15\x07\xb4\x88\x08\xb1\xa0\x58\x41\x97\xaa\x68\x82\xcb\x1b\x0e\x64\x9f\xe9\x1c\x59\x13\xf4\xec\x7b\xf8\xf5\x45\x2a\xff\xed\xff\xfa\xbf\xff\x4f\x79\xf6\xf2\x4c\xea\x46\x18\xfd\xd7\xf4\xe7\x1d\xd6\xd1\x49\x2d\xfd\x49\x9d\x1b\xc1\x91\x8b\x16\x1a\x38\xae\x92\xea\x21\x7b\x38\x3b\x87\xe0\x46\x55\x97\xfa\x60\xe4\x3b\x6d\xcd\xc1\x09\x15\xe8\xe0\x13\x81\x00\x7f\x53\xd5\x6b\x7d\xfc\x66\x93\x55\x2d\x8c\xd6\x90\x06\x61\xfb\xd2\xef\x01\xbb\x7e\x9b\x2a\xe1\x9c\xca\x03\xd1\x60\x22\xb5\xa8\x1b\x69\x27\x8b\xdb\x54\xa2\xd6\xa8\x42\x8d\xeb\xce\xd0\x58\x63\xb4\x5e\x9b\x67\xbd\xbf\x00\xa6\xae\xb8\x6f\x2f\xe4\x46\x93\xb7\x82\x4f\x74\xf4\x41\x90\xd9\x2d\x4b\xc6\xdb\xe5\xcd\x7d\x58\x39\x15\xbc\x0c\xc2\x24\x50\x4b\x5e\x38\xb9\x1a\x15\x9e\xd4\x3f\x6b\x12\x44\x30\x09\xaf\x86\xf2\x3a\x37\x6b\x5d\x14\xaa\xd4\xd5\xbe\x7d\xb9\x45\x7c\x9c\xda\x23\x84\xbc\xed\xb0\xae\xca\x35\x9e\x49\xb8\xda\x69\xd5\x6e\x81\xe4\x56\x92\xce\xa1\x35\x3c\x51\x11\x8e\x76\x6e\x67\x1a\x73\x23\xef\x75\x41\x25\xe0\x62\x5f\xd2\xc4\x23\xce\x0d\xd5\x12\xdc\x77\xdd\xc4\x81\x99\xb0\x05\x10\x5d\x47\x6a\xc1\x69\x19\x70\x1e\x4f\xe6\x8d\x0c\x9e\x6a\x3b\xff\x7a\x18\x28\x68\xda\x26\xa1\x8c\x54\x5e\x46\x83\xc0\xea\x52\x84\xd7\xac\x5a\x06\xa6\x17\x31\xca\x4b\xb9\xdf\x51\x8d\x1c\x14\x3d\x13\xab\xd0\xdf\x28\x4b\x25\x28\x96\xf9\xb7\xc8\x52\xf5\x2a\x4b\x09\xee\x1e\x0a\x4b\xc9\x40\x58\xca\x49\xd9\x7d\xbd\xae\x94\x08\x75\xa5\xac\x95\xf3\x33\x74\xa5\x38\x44\x7e\x92\x03\x99\xb3\x88\x64\xa5\xe4\x2f\x96\x95\x72\xee\xff\xd3\xb2\x52\x79\xfe\xbc\xae\x94\x60\x8e\xcb\xa3\xba\x52\xfc\xac\x7c\xf8\x95\xf2\x52\x67\xdf\x0e\x31\x92\x0b\x9a\x1e\x26\xe0\xc2\xe3\x6e\x76\xf0\x1f\x20\xdd\x4f\x65\x84\xbe\x17\x82\x35\x15\x5c\x86\x1f\x2d\xd4\x2e\x0b\x06\x68\x5f\x1d\xd0\x46\xb7\xcb\xc9\xdd\xd7\x10\xe7\x34\xda\x08\x12\x08\x41\xad\x3b\x5d\x6b\x27\xa1\xb4\xea\xe2\x62\xa1\x3b\x7b\x3b\xc7\x18\x3f\x4f\xbb\xbc\x0a\x81\x98\xfb\xc5\x50\x9e\xbf\x7c\x79\x6e\x2d\x96\x1a\xfc\xee\x71\x2a\xe7\x95\xd1\x25\x56\xfe\x3a\xb2\x40\x48\xd9\x66\xa9\x88\x95\xde\x43\x04\x80\x17\x7c\xef\x92\x7d\x05\xaf\xe7\x73\x39\xcc\x8a\xa7\x71\x0b\xd9\x7b\x5e\x05\x31\x59\xfe\x5a\xe8\x9b\xb2\xab\x14\x38\x80\xd5\x46\xe0\xdd\xc0\x1d\xc4\x78\xe6\x7f\x2c\x3e\x32\xfd\xe6\x5d\xad\xb6\xfa\xb1\xaa\xbf\xfc\xdd\x54\xa0\x9f\xc5\xff\x7d\xfb\x6d\x0b\xff\xf7\xfa\xec\xe5\xb7\xbf\xe2\xff\xfe\x11\x3f\xcb\x0f\x63\xf9\x6e\x3e\xba\x1e\x7f\x9c\xcd\x7f\x92\xa0\x06\xcd\x4c\x15\xa0\xfe\x1c\xdd\xd1\x23\xbe\x8b\x13\xc8\x4b\xba\x95\x83\xb0\x28\xfe\xd4\x59\xfa\x32\xf1\x6c\x4d\xda\xee\x73\xb0\x40\x9a\xca\xc5\x40\xe2\x6f\x5f\x54\xdb\x1d\x57\x4b\x1f\xaa\x7d\x12\x96\xdb\x45\xb9\x36\x57\x3a\x29\x95\x71\x30\xf8\xb6\x8b\x1d\x3f\x39\xd3\xf2\xad\x22\x2b\xb8\x94\x97\xd5\x63\x69\xac\x4d\xb9\x8d\xa8\x65\xc5\x09\x40\x41\x94\xcf\x63\x83\xa4\xed\x30\x15\x62\xf4\x7e\x3e\x86\x58\xba\x7c\x3b\xba\xf8\xfd\xfb\xf9\xec\x76\x7a\x89\x95\x28\xdd\xf6\xc3\x5d\xb6\xf5\x1c\x58\x40\x3d\xa0\x8b\x5c\x93\xe3\x11\xf8\x8a\xce\x0d\x13\x18\x40\x84\x14\xec\x4a\x83\x25\xf3\xd7\x3d\xf0\xe6\x27\x4e\x3f\xa9\xd1\xeb\xfb\xd2\xba\xc0\xa4\xb8\x02\x94\x82\x32\x2f\xcb\xea\xc1\x89\x09\xd8\xbb\x6d\xab\xea\xcf\xba\x21\x5e\x18\x08\x2f\xe0\x85\xa2\xb7\x70\xeb\x21\x41\x18\x7f\xdf\x8e\x62\x16\xf3\x51\x96\xd9\x29\x14\x00\x3a\xfd\xe6\x54\xcc\xf6\xb5\xac\xc0\xce\xb2\x9f\xcf\x0d\x5a\xca\x44\x57\x48\x09\x9c\x9e\xe1\xf6\x5a\xda\x01\x4b\x3f\xf8\xb3\xf9\xd6\x5a\x57\x81\x73\xe1\xbb\xe1\xd4\x53\x89\x0f\x01\xe4\xfa\x01\x07\x65\xc7\x8d\x15\xc3\x5d\xdb\x96\x95\x60\xc1\xa8\xe6\x5e\x1b\x1e\x6a\x7c\xaa\x6b\xb3\x49\xe4\xa3\x8e\x13\xca\x8c\x25\x89\xdb\x2d\xb0\xdd\x7c\x36\x23\xde\x2b\xd7\xdc\xc8\x48\x6e\x00\xd5\xcf\xda\x2d\x8a\xd8\xe2\x9b\xde\x7d\x13\x2d\xa8\xe5\x78\x7e\xbd\x38\xb6\x96\x1c\xbf\x33\x20\x06\xb0\x10\x5c\x19\x42\xc3\x98\x37\x7d\xb2\xec\xcb\x98\x56\x08\x59\x34\x14\x19\xe7\xfe\x0f\x54\xed\x6e\xe7\xd3\x9a\x46\x79\x79\xc7\xfa\x71\x7d\xfb\xc6\x03\x0c\xda\x52\xdf\x78\xf7\xf7\xb6\x9e\xa4\x52\x22\xe1\x98\x9e\x24\x99\x1b\x16\xac\xfd\x3e\xb2\x39\x03\x05\xe9\xae\xd5\xc6\xba\x55\x49\x0b\xf8\x50\xdb\x45\x54\x35\xae\x01\x4e\x47\xc9\xf5\x02\x0d\x42\xd5\x1c\xab\x4f\x76\x4a\xbd\x02\xc2\xff\x3b\x5d\x66\xe8\xc5\xe7\x8d\x09\xb0\x05\x94\x92\x80\x82\x31\xca\xc9\x1d\x3d\x7e\x0e\xac\x99\x06\x9a\xe3\x05\xeb\xa0\x80\xe3\x82\xfc\x5c\xd6\xb4\x73\xa1\x0e\x8f\x2f\xda\x77\x48\x47\xb1\xce\xa6\xef\x4d\xc1\x34\xd9\x36\x3f\x51\x4a\x14\x21\x79\x84\xcb\x66\x86\x10\x1e\x27\xed\x7d\xb2\x1e\xb6\x20\x84\x94\x9a\x72\xaf\x3b\xaa\x9f\x7c\x0c\x3d\x88\xbb\x24\x88\x48\x45\xb2\xc9\x91\x30\x72\xab\x88\x4e\xf6\xe9\x24\x0b\x24\xc8\x62\x17\x86\x25\x91\xa1\xd3\x5e\x11\x99\x65\x94\x5d\x0a\xc9\x6b\x88\xe1\x34\x40\x1a\xdd\x5d\x5e\x7d\x9a\xc3\x3a\x23\x47\x09\xb5\x89\xad\x1b\xcf\xe9\xcc\x2c\x91\x7b\x8a\x1f\x47\xa2\x18\xf6\xe3\x81\x86\xbe\x07\xad\x90\x88\x31\x97\xc4\xb0\x4c\x71\xc3\x6a\xaf\xd6\x88\x3f\xc9\x86\xf2\x47\x55\xec\xf5\xe9\x28\xb3\xf3\xb3\xd0\xf5\x03\x20\x1c\xfc\xbe\x08\x32\x5f\x55\x2d\x37\x5a\x9f\x62\x86\x80\x47\xf6\x94\x58\x28\x85\xc1\xef\xf6\x88\xd3\x05\xb1\x85\x37\xd2\x1c\x4c\xa3\xb7\xd0\xe5\x20\xe0\x15\x4a\x7f\x21\x30\x90\x52\x5f\x3f\x04\x37\x14\xa8\xe9\xd3\x3d\x42\xa4\xef\x84\xf0\x80\x60\xe7\x0f\xd1\x3e\x45\xc1\x25\x5d\x2a\x48\xb2\xaf\xab\x72\x93\xdf\xed\x6b\x37\x71\x34\x37\xf0\x35\xeb\x53\xed\x1b\x3c\x84\xb3\x44\xde\x57\x86\x7c\x11\x42\xf1\x50\x8f\x83\xf6\x72\x67\x51\xc0\xb3\x8d\xf8\x5b\x44\x31\x2f\x2e\xc6\x8c\xa2\xef\x14\x52\x68\xd9\x3a\x82\x4f\xe8\x3e\xc4\x70\xaf\xa4\x27\x56\x32\x78\x96\x40\x1f\x6e\x13\x5f\x2b\xf0\x89\x2b\x8e\x04\xa9\x37\x3a\xc2\x57\xd9\xb7\x6e\x21\x23\x4e\x9a\x0b\xb5\xde\xd8\xc7\x78\xc8\xa4\xc1\x90\xeb\xee\xfe\x60\x60\x8e\xc2\x29\xb0\xd7\x18\xcb\x87\x92\x4f\xd8\x7b\x9f\xe7\x25\x23\x15\x22\x44\x4e\xdd\x85\xb1\xda\x4d\xff\x03\x9e\xe8\x10\x0c\xd9\xb6\xc4\x39\x33\x1e\x5e\x38\xd1\x48\x42\xdf\xf8\xdb\xb4\x64\x54\x90\x53\xbe\x10\xc7\xed\x3a\xbb\x30\xf0\x74\xa2\x5c\x59\x81\x44\xcc\x58\xa4\x00\x27\x77\xab\x70\x21\x16\x81\xea\x79\xa4\xa0\x93\xe1\xf8\x59\xcd\xca\xbd\xd9\xb0\xe7\xfa\xa1\x41\xf9\x1c\x95\x4f\xd2\xd0\xf9\x33\xc0\x2b\xed\x31\xf7\x1e\xae\x85\x53\x58\x0b\x49\x98\xca\xd8\x54\xb5\xbe\xab\x08\xde\xd8\x1a\xfc\x15\xb2\xe2\xda\x21\x07\x6e\x6c\xb7\xca\x2f\xa2\x1c\x12\x41\xd8\xda\x54\xa3\xb1\xd4\xe3\x99\x5b\xef\xb6\x77\xc0\x04\xe9\x32\x2b\xf6\x7e\xf2\x1e\x74\x4f\x30\xb1\xff\x5e\x4f\x80\x03\x4c\x90\x3d\x17\x87\x99\x3b\xa6\x4a\xbc\xf9\x22\x5c\x17\x7d\x03\x16\xbd\xf0\x31\x79\x6a\x30\x2d\xdf\x0b\x8e\x18\xf6\x22\xb2\x8e\xd8\x16\xfd\x97\xa3\xa3\x51\x01\xee\x6b\x0e\x58\xa1\x6e\xff\xd7\x58\x03\xa4\x7b\x85\xf6\x80\xe8\xdd\x4f\xcf\x2e\xb2\xc4\x07\x1f\xa1\x35\xd6\x1a\x8e\xe4\xe9\x19\x00\x08\x35\xda\x7c\x7d\xc1\xe5\xd1\x73\x94\x95\x15\xeb\xa7\x60\x1c\x27\x7f\xd0\xa8\x42\x0f\x78\x16\x63\xe4\x46\x3d\x54\xb5\x57\x27\xc4\x94\x43\x1d\xa0\x59\xfa\xa3\xd0\xc4\x9f\x74\xa7\x6a\x00\x47\x87\x43\x1f\x59\x5e\x40\x14\x12\x94\x50\xd8\xa7\x0f\x19\x4e\x0c\x44\xba\x3d\xad\x8e\x6c\x92\xa3\x06\xb5\x3d\x68\x46\xe5\xa1\xff\x8e\x64\x56\x53\x2f\x2c\x4a\xcf\x3c\x6a\x17\x89\xbc\xa4\xb0\x3e\xe6\x05\x9e\x5a\x3d\x6e\x86\x58\x49\x80\xfc\x2b\x6c\x34\x04\x2e\xdd\xc5\x8c\x1d\x74\xc9\xb9\x10\xd9\x67\x3f\x64\x7d\x2a\x42\x06\xc2\xe6\x50\x79\x2d\xc9\x9f\x03\x02\x18\xc1\xc1\xbd\xbe\x6e\x62\x3a\x83\x0e\xd6\xe4\xf8\x85\xc6\x4a\xa1\xc2\x29\x02\xc0\xd3\x64\x6b\xd0\x6c\xfb\x4c\xe5\x3a\xe5\x07\x2d\xc0\xa1\xae\x1d\x19\x01\x54\x61\x25\x01\x15\x34\xb2\xa0\x3b\x91\x1b\xa4\xe2\x69\x9c\x60\x28\x46\x6d\x3b\x61\xf9\x70\x4a\xb1\x30\xca\x9e\xea\xa3\xa2\x38\x36\xfa\x06\x5f\x67\x77\x3f\x58\xcd\xa4\xba\x52\x14\x5e\x27\x19\xbc\xda\xc2\x4b\xbb\x1c\xb3\xce\x99\x66\x18\x84\x19\xf7\x79\x91\xf5\x61\x5c\x61\xbc\x8e\xad\x04\xa4\xf3\xa1\xae\xfb\x63\x40\xf0\xed\x18\xc8\x2a\xa0\x71\x85\x27\x80\xa7\x92\xc5\xd7\x92\x75\xca\xf6\xa0\xc2\x1d\xe9\x62\x05\x5e\x35\x19\x46\xdb\xcb\x80\xb9\x58\x29\xc7\xc4\xed\x05\x9c\xfb\x61\x49\x58\xb0\x0b\x73\xdd\x41\xf2\xf9\xc8\x21\xd4\x1e\x2c\x11\x1c\x5d\xf1\xe1\x4d\x08\x5a\xc8\x18\x14\xfa\x4e\x97\xd9\x1b\xcc\x69\x84\x6f\x32\x32\xca\x8d\x8b\x63\xea\xa2\x78\x23\x3d\x1d\x5b\x4a\xe5\x6d\xdb\x1d\xb2\xd6\x1e\xbb\x51\x75\x3b\x9f\xe9\xcf\x3c\x58\x33\x8e\xa0\xa2\x71\x58\x05\x0c\xa9\x87\x2b\x88\x33\x93\x71\xd9\xa8\xbd\x94\x7c\x05\xeb\xba\xd6\x59\x6e\x3d\x09\x56\x39\x0a\x50\x86\x46\x9c\x84\x76\x06\xca\x06\x74\xdc\xab\xef\x28\xcc\x94\xd0\xc0\x99\xa4\xed\xe8\xa8\xb2\xac\x1a\xd6\x8c\x43\xcf\x06\x17\x33\x8d\xab\x87\xb0\xf6\x2d\x6b\x15\x60\x54\x09\x01\xe1\x82\x69\xb0\x40\x1e\x86\x5e\x15\xb4\x94\xfb\x12\xa4\x60\x74\x16\xd5\x44\xdd\x37\xdb\x02\xe7\xb2\x54\x5b\xe0\x7b\xa0\x17\xfd\xc9\x05\x3e\xfe\x94\x97\x0f\x8c\x59\xb3\x1f\x17\x91\xbc\xc0\x13\x0d\xc4\xd3\x70\xed\x94\xfc\x0c\x50\xd7\xe3\x8d\x16\x1c\xa5\x20\xf8\x4f\x5c\x7d\x61\xf5\x50\x75\xfc\xc9\xae\x6d\xb6\x9f\x5f\xd3\x4d\xcf\x6d\x80\xdd\x6c\xee\xf5\x9f\x7c\x57\xb9\x4e\xa3\xf9\xd2\xfc\xbc\xce\xf9\x0c\x18\xbe\x21\x7c\xa5\xed\x48\x87\xd3\xd3\x1d\x83\x6c\x64\x3e\xe4\x43\xaf\x9f\x5a\x1c\x7c\xa1\x28\x5e\x4d\x0f\xb9\x7e\xc4\x8b\x0d\xee\xeb\xfe\x2a\x38\x7b\x34\x08\xd8\x47\x47\xce\x2f\x87\xeb\xf7\xb1\xc3\xad\x2a\x4b\xc0\xbb\xd6\x5b\xb0\x58\xa1\xc0\x83\xcf\x19\x41\xad\x30\xed\xd3\x80\x4e\x00\xc1\xb8\x7d\x08\x97\xb5\x60\x30\x00\x94\x7c\x22\x82\xca\x2b\x9b\x50\x55\x58\xff\x60\x0f\xb7\x30\x04\xd7\xd1\x7c\x64\x1b\xfb\xb9\x23\x24\x11\x01\x40\x8d\x3d\xb4\x80\xa0\xac\xb7\x61\x4f\x9f\x39\xb9\x79\xf2\xc8\x89\xad\x18\xed\xb9\x50\x08\xef\x89\xf1\x97\x00\x44\xef\x4b\xc8\x62\xee\x39\x84\x90\x38\x45\xf2\x91\x5b\x4d\xb1\x83\x1a\x1d\x98\x79\xfc\x7e\xf5\x55\x6b\x3c\x50\xcb\xd5\x99\x08\x91\x81\x4e\xff\x60\xa5\x5b\x82\xd6\x79\x89\x61\xc5\xaa\x94\xaa\x91\xf7\x4d\xb3\x7b\xf3\xcd\x37\x8f\x8f\x8f\xa9\x7b\x43\xba\xae\xac\x97\x02\x5c\xea\xc1\xf0\x54\xa5\x7c\x6a\x69\x1a\x12\xa8\x38\x16\xba\x0f\x4c\x75\x87\xf6\x43\x50\x54\xdd\x1c\x8e\x05\xf7\x70\xd1\xf8\x04\x38\x43\x5f\xfa\xf7\x31\x24\xe3\xf1\x05\xb1\x4d\x1e\xcc\xba\x8a\xd7\x12\x2c\x32\x87\x5c\x38\x82\x17\x70\x72\x00\x70\x33\x7b\x0f\xd2\x07\x4b\x55\x13\xf4\x5b\x44\x16\x07\x0b\x75\xb4\x56\x1e\x30\xc3\xd7\xad\xf1\xad\xf5\x69\x14\x76\x51\x48\xf5\x07\x78\xef\x5a\x5b\x2f\x32\xc3\x00\x66\x7c\x47\xf8\x74\x71\x54\xd0\xea\xcb\x6a\x02\xa4\x90\xa0\xed\xb7\x3a\x90\x3b\x86\x7f\x73\xa8\x72\x5f\x55\xf5\x8c\x4d\xcd\xf3\x09\x89\xa0\xaa\x16\x34\x9d\x3d\xa1\xdf\x70\xc0\x38\x19\x74\xec\xa9\x27\x55\x2d\x9e\xf6\xb7\x86\xc9\x33\x73\xe1\x37\xae\x38\xf6\x16\xc2\x1c\x2b\x6e\xad\x0b\x00\x85\x02\xf7\xbd\x9e\x0e\xf0\x95\x55\x28\x93\xda\x7f\x1f\x0c\x9f\x38\x37\x29\x0a\xb2\x1a\xda\xd5\x70\x1a\x94\x3d\x15\x85\x3c\x61\x99\x4b\x70\xf3\x30\x62\x54\x14\x43\x37\x62\xb4\x01\x30\x69\xe2\x15\x00\x7d\x35\x05\x87\x69\x83\x31\x09\xe3\x87\x27\x5d\xb7\x70\x88\x4f\xf6\x8f\x13\xc0\x3b\x81\x2c\x62\xc1\x63\x0c\xc9\x30\xac\x80\x9c\x28\x60\xf5\x8c\xd6\xaf\xc2\x3b\x41\x6f\x77\x18\xc3\x64\xc0\x01\x5b\x51\xaf\x1d\xa3\x57\xff\x9d\x12\xc7\xe9\x9a\x0a\xdc\xc1\x20\x9a\x01\x8a\xf6\x3c\x6a\xc0\x7e\x55\x0b\xfa\x93\x1f\x04\x65\x82\x6d\xdb\x54\x64\xe8\x13\x5d\xf7\xd3\x1e\x8e\x68\x35\xd4\x2b\x00\x26\xf2\x9e\x25\x4b\xbd\xfa\x46\xff\x7c\xf8\xa6\x78\x22\xd1\x7d\xe9\xc8\xb2\x68\x93\xe0\x2d\xc9\xec\x03\x79\x79\xd7\x72\x0c\xfb\x93\x35\x1e\x73\x88\x45\x7e\xa6\x35\x3a\x20\x01\x0d\x05\xfe\x3e\xa4\xcd\xc0\xb9\xc0\xcc\x05\x08\x90\xc0\xdf\x3b\xfa\x6f\xdf\xac\x9e\x0d\x1c\x0c\xbb\x0e\x12\x8b\x79\x63\x60\x7c\x45\x4b\x10\xf1\xc8\x38\x77\x81\x7a\xa1\x2b\xf9\xed\x11\x6d\xf4\xfe\xb2\x30\x77\x55\xf2\x9d\x17\xc1\x85\xdd\x73\xa1\xa2\x12\xeb\xfe\x89\x01\xd5\x5e\x7d\x86\xf2\xd1\x65\xd6\x3f\xd0\x26\x48\xbd\x89\xfe\x68\x2f\x17\x8e\x07\x51\x17\x46\xce\x92\x54\x46\xef\x93\x93\x18\x28\x42\xc6\x33\xa2\x82\x8f\x48\x64\xf6\xdc\x74\x20\xef\xe3\x2b\x03\x7d\x55\x20\x4a\x3a\x2c\x66\xef\x96\x1f\x47\xf3\x31\xe3\x03\x42\xb9\x81\x50\xf3\xe2\xcf\x7f\x86\xaa\xb7\xf4\xc5\x0b\xd0\x62\x20\xd5\x8a\x40\xb3\x22\xd0\xa4\x88\xe4\x2b\xde\xde\x2e\x81\x18\x12\xb8\x22\xc7\x97\x72\x39\x4b\x90\x47\x15\xbf\x26\xfc\xd7\xe4\xec\x5d\xbb\xb2\x2d\x79\xb6\xae\x2d\x01\x22\xca\x4e\x89\x9c\xb0\x5d\xb2\x3d\x79\xfb\xc9\xd7\xab\x5d\xa6\x72\x32\x95\xd3\x19\xf0\x86\x2e\x03\x4e\x57\xec\x3b\xf2\xb3\x02\x07\x28\x8f\x4a\x22\xdf\x8e\x05\x11\xaf\xbe\x73\x7c\xae\xc8\xad\xea\x59\x56\x43\x72\x55\x66\x5c\x95\xe3\x9f\xc6\xd7\x37\x57\xa3\xf9\xa7\x2e\xe1\xaa\x23\x4e\x75\xc3\x24\x4f\xba\xc3\x34\xb4\x83\x7f\x71\x3b\xc7\xb4\x32\x70\x95\xbe\x25\x7d\x09\x60\x59\xb5\x83\x2f\x50\xb0\x62\xbc\xf8\xc1\x11\xb0\xde\xda\x31\xb9\x1c\x2d\x47\xf0\xde\x9b\xf9\xec\xdd\x64\xb9\xf8\xc1\xfe\xfb\xed\xed\x62\x02\x63\x39\x99\x2e\xc7\xf3\xf9\xed\xcd\x72\x32\x9b\x0e\xe5\x87\xd9\xc7\xf1\x8f\xe3\xb9\xb8\x18\xdd\xda\xe9\xb7\xc3\x09\xf4\x9e\x9f\x88\x39\x37\x62\xde\xf5\x34\xba\x93\x69\x40\x96\xbb\x58\xce\x27\x17\x4b\xff\x31\x31\xeb\xf0\xec\x86\x4c\xa7\x21\xb7\xee\x50\x8e\xe6\x93\x85\xfd\xc0\x04\xdf\xfa\x71\xf4\x49\xce\x6e\x49\x30\x63\x2c\x48\x23\xa3\x35\x2d\xcc\xfc\x3a\xba\xfc\x71\xb2\xf8\x1a\x76\xd7\x54\x88\xef\x7d\x20\xfd\xc7\xbc\x22\x85\x44\xd8\x7a\xbe\xac\xda\x57\x6f\x84\xc7\x76\x13\xa0\x55\xb0\xa8\x2c\x28\xeb\xee\xe7\x4d\xcf\xa8\x2e\x29\x87\x04\x3f\x17\x53\x1f\xb1\x76\x8f\xd8\xb3\x60\x34\x55\xb5\xdc\xa8\x75\x5e\xe4\x58\xdb\x1a\x86\xaf\x1f\xa0\x17\xda\x04\xb5\x1b\x5e\x1c\xae\x3f\x72\x7f\xec\x92\x3a\x92\xc1\xef\x2a\x63\x38\x92\x53\xc6\x04\x87\xba\x5b\xd6\x68\xcc\xb0\x28\x18\x2f\x51\xe3\xfc\xd4\x87\x70\xc4\xfb\xde\xe5\x8d\xf0\xc0\x70\x05\x2f\x09\x40\xa8\x66\x0f\xbc\x26\x55\x8d\x21\x13\x65\x4c\x7e\xe7\x25\xf6\x88\x56\x52\x22\x5e\x3b\x15\xa8\xcf\xd5\x31\xd5\x7d\xd2\xa5\x45\xd2\x4e\x2e\x9f\x87\x37\xd9\x41\x2a\xd7\x28\x94\x7d\xe8\xc7\x23\x79\x87\xcf\xe5\xe6\x43\xab\x31\xb0\xb7\x4f\x2e\x86\x32\x42\x64\x89\x8b\xd9\xf5\x8d\x5d\xeb\xe7\x2f\x5f\xbe\xfa\x7b\x30\x23\xa6\xdf\x8c\x2f\xae\x4e\xcf\xff\x4e\xc8\x3f\xfc\x79\x06\xff\xf7\xed\x77\xdf\x7d\xdf\xe1\xff\x7b\xfd\x2b\xfe\xef\x1f\xf2\x33\xce\xf6\x6b\x2e\xb6\xb8\x70\x48\x26\xa7\x62\xc6\x24\xfe\xe7\xe9\xcb\x44\x8e\x76\x75\x5e\xd8\x95\xf8\x7d\xe8\xdf\x57\x46\x67\xfb\xb4\xaa\xef\xbe\x61\x86\xfc\x6f\xd0\x14\x7f\xf2\xd1\x0e\x78\x71\x9e\xbe\x94\x27\x83\xf1\xc5\xd5\x60\xc8\x49\x05\xb7\xe3\x46\x3b\xb5\xbe\xd7\xc2\x7e\xc4\x51\x8f\x79\x66\x83\x4a\xae\xef\x55\x79\x87\x49\xeb\xa0\xf6\x45\xb3\xe9\x83\x49\xcf\x80\xf2\xe2\x95\x40\x87\xc3\xe9\x9d\xd1\x6e\x2f\xb5\xce\xdc\x4b\x35\x37\xdb\x05\x11\xed\x79\x81\xb8\x8e\x48\xd5\x15\x3a\xe9\x38\x0e\xb1\xad\x32\x68\x2b\x23\x44\x48\xc7\xad\x79\x13\x8e\x9a\x82\x8f\xc7\xc3\x46\x86\x95\xdd\x8d\x42\x00\x3a\x0c\xee\xd8\x8b\xd9\xf4\x72\x82\x6c\xdd\xd6\xb2\x80\x6b\x7b\x3e\xbe\x99\xcf\x2e\x6f\x91\x10\x1d\x3e\xe5\xc8\xe3\x27\xb3\x69\x1f\x3a\x8c\xb3\x2a\x42\x38\xc2\x46\x3a\x48\xb7\x9a\x48\x7d\x7a\x73\x46\xc4\x9e\x92\x38\xe2\x40\x8e\x4c\xb7\x62\x61\x21\x78\xf2\xe0\xb5\x06\x1c\xf9\xb4\xfc\xad\xc7\xe9\x53\x90\xbb\xdb\xa6\xaa\xee\x34\xaa\x05\x7f\x46\x80\x09\x54\x12\x60\x2c\x3e\xff\x27\xcf\x2f\xd1\xa2\x7e\x70\x75\x78\xb0\x10\x38\xe5\xef\x4b\x52\xfc\xcb\xe1\xe2\x18\xc3\x63\x3b\x0d\x88\x64\xfb\x14\xe2\x2a\xb8\x05\x6c\x04\x20\x85\x03\x55\x3f\x88\xb0\xc4\x21\x81\x08\x4b\xb7\xc4\x01\x78\xbf\x83\x1a\x07\x19\xd5\x38\x60\x24\x82\x60\xfc\xef\xb8\xe6\xf2\x6f\xa8\x77\x90\x51\xbd\x83\xf8\xc5\xf5\x0e\xae\x02\xe5\x97\xd7\x3b\x48\xaa\x77\x10\xff\x71\xf5\x0e\x6e\x42\xa1\xfa\xe4\xa4\xaa\xa1\x9e\xa6\x1e\x0c\xc3\x39\xed\x54\xc7\x84\xb3\x1f\xd6\xc6\x78\x28\xbe\x11\x41\x80\xb8\x55\x5c\xe6\xde\x89\x11\xef\x01\x82\xde\x5a\x6b\xe8\x2b\x21\x71\x61\x1d\xd6\x6a\xdf\x60\xd8\x26\xdf\xe6\x84\x27\x76\xe6\x43\x10\x08\x6f\xa5\x8c\xe8\x4f\x5c\xca\x13\x00\xaa\x10\x1f\x17\x36\x78\x06\x81\xc3\x6e\x83\xad\xf1\x46\xec\x32\x11\xb7\xc1\x56\xdb\xf3\x16\x10\x44\x4d\xad\x4a\xe3\x12\x31\x02\x01\x5e\xa5\x29\x5c\xf1\x97\xe2\x14\x04\x42\x65\x7d\x94\xa0\xa7\x5b\x08\xd7\xd3\x0c\xda\x15\xd8\x2d\xc4\xca\xf4\x80\xff\x1c\x8b\x1d\x69\x27\x37\x15\x0b\xc8\xeb\x2c\x57\xb2\x39\xec\xe2\x6e\x02\xb5\x6c\x7b\x42\x88\x91\x36\xc8\xe7\x79\x8e\x2a\x0f\xb3\xa9\x6a\x89\x83\x84\xdd\x10\x47\x20\xad\x3a\x62\x5b\xe2\x02\x70\x8c\xca\x74\xb9\x67\x21\x01\x9a\x9b\x48\xc3\xdb\x1e\x08\x4e\x51\xba\xf2\x2d\x3c\x51\xa5\xd4\x5f\xd4\x76\x57\x74\x22\xf9\x78\x3f\xee\x74\x99\xe5\x5f\x84\x83\xab\xbb\x5e\x77\xd8\x59\xdb\x33\xfc\x08\x14\x0b\xcf\xf7\x99\xcf\x50\xc7\x21\x7f\xc2\xa8\x2a\x22\x7f\xc7\x73\xc6\x71\xb6\xda\xb5\xed\xd5\xb3\x75\x96\x37\x55\x6d\xb7\x2d\x68\x54\xc3\x22\x17\x41\x56\x33\x91\xba\x50\xab\xaa\xe6\xff\xe3\xa3\xa4\x45\x34\xe9\x8a\x03\x13\x8c\x26\x3f\xde\x57\x05\x2c\x72\xd1\xe6\x18\x0e\x66\x14\xab\xc4\x7a\x4f\x4e\x37\x5f\x1d\xd2\x2a\x2f\x1d\xcb\xf9\xe0\x47\xcf\xe0\xc4\x40\x26\xcd\x99\x79\xdb\x7f\x68\xf4\x56\xd7\xba\x38\xc8\x22\x2f\x3f\x43\xac\xd9\x7a\x26\x76\xfe\x4b\xb5\x45\x7e\x57\x8e\x5d\x01\x6c\x95\xab\xe8\xf4\x53\x54\xb7\x54\xd0\x18\xcc\xa9\x13\x1c\x80\x52\xf0\x9e\xf9\x6c\xaf\xe8\x18\xeb\xe6\x86\x8a\xb6\x0e\x1f\xbc\xae\x0d\xf6\x31\x2d\x49\xdc\x3a\xc0\xeb\x71\x20\xb8\x4b\xdb\x26\xa2\x26\x27\xee\xde\x8d\x35\x1d\x22\x7d\x70\xcf\xbc\x07\x77\x12\x73\x8f\xe4\x20\xf7\x8f\xaf\x68\x5f\xea\xde\x00\x80\x70\xe7\x53\xa7\xb8\x37\x0d\x04\x86\x77\xb7\x79\x63\xd7\xee\x4a\xdf\xab\x62\xc3\x97\x79\xbb\xb2\xea\xf8\x7a\x09\x6e\x5a\x31\x70\xfd\x18\x04\x10\x5c\x66\x4f\xd5\x85\x5e\x37\x75\x55\xe6\xeb\xc4\x8e\xf3\x4a\x15\xb0\x3e\xb8\xbc\x8b\x4c\x4a\x87\x50\xf5\x1e\x67\xc8\x8d\x95\x37\xc1\x92\x57\x54\xc6\xf0\xd4\x19\x2a\xa2\xe7\xda\x9e\xfa\x76\xc8\x2d\xd5\x22\x17\xd6\xb4\x4e\xa2\x2c\x2a\x1b\x1d\x88\x49\x41\x98\xa9\xc8\x8d\xd9\x03\x41\xe3\x1a\x6e\x28\xfa\x9b\x87\x2e\xa1\x75\xe0\x2c\x99\x70\x58\x93\xa8\x2b\x62\x13\x8f\xa7\x1d\x9f\x2c\x37\xeb\xbd\x61\x52\x36\x2a\x07\xe1\x15\x8a\xb4\x2f\xb6\x7b\xbe\x2c\x3f\x1e\x31\x5e\x59\xd6\x53\xd8\xe5\xeb\x7d\xb5\x37\x10\xfe\xa8\x3f\x23\x50\xc9\x13\x2e\x66\xda\xfa\xfd\xcc\xf2\xd5\xd2\xce\x6b\x1b\x8a\xca\xc8\xc1\xb4\x6a\x42\x5d\xca\xbc\x2a\xd3\x41\xdf\xe6\x6b\xd9\xa8\x11\x93\x09\xe4\xb0\x8f\x2f\x4b\x37\x54\x76\xeb\x81\x8e\x65\xfc\x42\x1f\x56\x70\xf2\x1a\x21\x01\x1a\x26\xc2\x59\x40\x1e\x58\x15\xd6\x55\xbd\xab\xe0\x9a\x14\x01\x1c\x81\x78\xde\xa4\x94\xe7\xe9\x53\xd4\xe4\x42\x7c\x0d\x0c\xba\x73\x68\x42\x8a\x2c\x52\x3f\x41\xb2\x5e\x9f\x62\x41\x34\x74\x40\x8b\x0c\x54\xca\xc8\xa4\xdc\xe2\x4e\x2e\xab\x53\xc4\x2d\xb7\x39\x96\xf3\xba\xd6\x0f\xd5\xda\x31\xfc\x12\xf9\x8b\x67\x02\x73\x4c\xe6\x89\xa3\x29\xef\x9c\xa2\x76\x49\x32\x81\x36\x83\x16\xfc\x6f\x98\xaa\x3b\x09\x54\x61\x93\x6e\xc5\x67\x70\x44\x22\x08\xac\x7d\xf0\x1d\xbb\x3d\x71\x0e\x5e\xa5\x47\x59\xbb\xff\xcb\x4c\xc0\x89\x27\xa1\x0d\xa9\xf3\x3c\x1f\xc0\xb0\x4d\x40\xeb\x58\x67\x41\x0e\xce\x29\x1a\x26\x31\xf1\x6c\x42\xff\xcd\xb7\x08\x16\x74\x8a\x31\xb0\x87\xd1\xcc\x24\x1b\xeb\x23\x1b\x2c\x35\x55\xbf\x38\x9d\x3a\x62\xff\xf5\xa5\xf9\x40\x15\x1a\x91\xa2\xe0\x67\x51\x0c\x86\x42\x93\xa1\x52\xa4\x3b\xdb\x38\xc9\x97\x07\x0a\x85\x99\x97\xed\x0d\x37\xeb\x89\x19\x02\x99\x34\x97\x3c\xaf\xab\xed\x2a\x52\xea\xed\xfb\x82\xcb\x63\x21\x59\x6c\x45\xa6\x52\xdc\x20\xfe\x2c\x28\x45\xd1\x5d\x93\x0a\xa7\xdd\x4b\xc5\x26\x7e\xc0\x9d\xf0\x67\x98\x74\x23\x17\x35\x48\xd0\x29\xb9\xae\x2b\x63\x4e\x61\x48\x90\x1d\x6e\x6f\x2d\x12\x52\x5a\x2c\x3d\x05\x4e\x4b\x29\xd7\x37\x38\x96\xee\xc5\x0b\xfb\xf8\x11\x14\x11\xfd\xf9\xfc\xdf\xda\x0f\xfc\xa1\x4f\x96\x11\xb5\x18\x43\x59\xc8\x8e\xf4\x62\xa4\x53\x1a\x45\xa4\x37\x4c\x2d\xe9\x99\x55\x03\xe5\xdb\x56\x30\x97\x96\x91\x1b\x3f\x42\x2d\x12\xe7\x4a\x6b\x41\xb3\x0e\x28\xe5\x93\xdb\xca\xb1\xeb\x60\x54\x4c\xd7\x42\xd1\xdb\x5d\x51\x1d\x38\x55\xeb\x66\x91\xbc\xa7\xaa\xbe\x53\x25\x6b\x39\x31\x4f\x1d\x71\x15\x47\xeb\x18\x15\xa8\xd0\x98\x74\xcf\xe6\x4b\xb1\xb9\xd7\x24\xb1\x21\x43\xd3\x2e\x37\x08\xd9\xc1\x6f\x3d\xe8\xb2\xf1\x1f\xe8\xdb\x25\x54\xe0\x24\xfc\xbb\xa2\xe6\x51\x45\x15\xb5\x1e\xae\xac\x26\x24\x3f\xc7\xa8\x5b\x84\x6d\xa2\x1c\xba\xe7\xbd\x63\x12\x6d\x54\x8f\x54\xf5\xfa\x5e\x6e\xf6\x24\x47\xe4\x54\x27\x81\xf9\xb1\x6a\xb1\x63\x0a\x62\xc7\xf4\x6b\xc2\x6e\x5b\x9a\x1b\x3c\x6f\x01\x60\x14\xc6\xa6\x30\xca\x0f\x40\x16\xaf\x7e\xd1\x3a\xe5\x63\x76\xba\x27\xf4\x22\xc0\xc4\x15\xc4\x11\x65\x5d\xce\xfd\x36\x71\x14\x06\x7d\x84\x00\x8e\xd7\xe6\x98\x87\xe5\x31\x9a\xcc\x12\xbb\xd5\xba\x69\x01\xeb\xfc\x75\xf0\x46\x08\x15\x10\xf3\xde\x71\xbe\x85\x85\xb6\x1c\x95\xdd\x73\x7d\x41\xdf\xb4\x9d\x03\x22\xdc\xe1\x2a\x78\x05\x46\x89\xbc\x77\x60\x1d\x3f\x28\xb6\x73\x34\xb6\x9e\xc4\x96\xe9\x77\xed\x2d\xc1\xe7\x07\x8c\x3e\xc6\x6a\x11\x59\x0d\xdf\xa6\x17\xad\x9f\x25\x19\x66\xd3\xfa\x69\x66\x5d\x3f\x97\x89\xe8\x25\x1a\x4e\x3c\xcd\x30\xa5\xef\x02\xbe\xdd\x36\xef\x30\xbd\x3b\x12\x45\xc0\x0b\xc8\x5b\xa6\x78\xcf\xf0\x37\x11\x23\x83\xec\x8c\x3b\x5d\x23\xf9\x60\xe5\xa0\x68\xec\x6c\xb5\x3b\x40\xa3\x90\x01\x71\x8d\xdf\xb2\x1e\x36\x3a\x98\xce\x96\x93\x8b\xf1\x20\x40\xa8\x2a\xe3\x98\x52\xad\xa7\x10\x95\x73\x09\x27\x5f\xfc\x35\x43\x85\xc3\xee\x90\xcf\x32\x92\x54\xe0\x26\xf7\x8d\x93\x47\x69\xd2\x99\x0f\xfb\x1d\x9b\x0a\x8d\xec\x0c\x94\xf8\xca\x81\x92\x47\x06\x0a\x56\x85\x6a\x64\xa1\x95\x69\x04\x5c\xbb\x9b\xd6\x1e\x01\xf0\xaa\x79\xc3\x4d\x52\xdc\x1e\x3f\x72\x21\xb5\x30\x8d\xe2\xf1\x89\x09\x6e\xb3\x68\x25\xd6\x9d\x72\xd4\x8d\x8b\xcc\x88\x40\x5e\xa2\xff\xa9\x55\x9d\xf8\x06\x32\x98\xd7\x07\xbb\xc8\x41\x69\x9b\x98\xf0\x12\xbb\x68\xe1\x50\x7e\xd0\x35\xf3\xb4\xbb\x9a\x31\x37\x35\x0e\xb1\x0b\x2c\x4e\x75\xac\x9f\xc8\xbd\x0d\x66\x0a\x0e\x50\xf4\xc2\x5d\x44\x4f\x15\x81\x0f\x5c\x12\xbd\x20\xcd\x99\x17\xef\x70\xec\x4e\x0e\x27\xa8\xb2\x8c\xb0\x5f\x8f\x65\xef\xba\xa1\x9e\x77\x18\x2d\xfb\xb6\x31\x4a\x75\x98\x1c\x53\xdb\x44\xf0\xce\x7a\x8e\x64\x2f\x47\x33\xcc\x9c\xe1\xb8\x51\xe3\x63\x15\x89\xac\x7c\xbd\x45\xef\xa2\x86\xc0\x14\x57\xb7\x34\xf5\xde\xce\xa7\xa1\x0e\x77\xd3\x07\xbd\x9d\xf6\x9e\x0a\xd8\xc9\x9c\x53\x86\xbf\xc7\xb1\x15\x86\xd3\x52\x3b\x45\xd0\xb8\x2a\xd4\x1e\x70\x06\xf5\xd7\x67\x67\x44\x4b\x08\xc0\x81\xfd\x5a\xf7\x12\x85\x5f\x5c\xb6\xbe\x7b\x45\x18\xe1\x82\x6d\x6e\x3c\x51\x7c\xf2\xf9\x94\x50\x7c\x01\x39\x2a\x21\x44\x75\xd1\x5a\x20\x6f\xdc\xf5\xa7\xe5\x5c\x44\x61\xf6\x6f\xa1\x6a\xd7\xb3\xe3\x44\x86\xa8\x49\x85\xb8\x2d\x01\xe3\x68\xe7\x45\x7f\xb1\xb6\x46\xde\x30\xd5\x77\x98\xa0\xb0\xdd\x6d\xd9\xb0\xbd\x61\x2a\xd1\x0e\x4d\xc9\x30\x34\x05\xd8\x8a\x56\xe8\x26\x80\xe6\x45\x24\xa9\xe2\x39\x87\x8e\xed\x06\x28\x7b\xf7\xeb\x80\x18\xb7\xea\x90\x12\x54\x4c\xab\xc6\x7e\xdc\xe5\x4a\xe0\x88\x46\x60\x61\x49\xf4\xb4\x44\xa6\xc8\x98\x8c\x9d\xae\x8d\xa6\x6a\x5d\xaf\xbc\x83\x2d\xa3\x7b\x15\x43\x9a\x8d\xee\x8a\x7f\x3b\x56\x51\xa0\x92\xc0\x3a\x26\x3a\xf6\x65\xc0\xd4\x78\xa7\xea\xcc\xe9\x7f\xb6\x27\x46\x4a\xf9\x5d\x2a\x97\x4e\xf2\x23\x6d\xf1\xca\x64\x95\x46\xc2\x29\xb4\x0b\x63\x12\x5c\xce\x50\xa1\x86\x4a\xa9\xb6\xda\x24\xa1\xe2\x0a\xd7\x79\x4b\x12\x60\xc1\x72\x35\xa0\x48\x81\x0f\xc7\x55\xaf\xf6\xf8\xf5\xbe\x2c\x17\x7e\xc1\x36\x08\x19\xf5\xec\x7c\xed\x4d\x53\x01\xab\x24\x32\x6e\x86\x3a\x46\x3e\x9c\x2a\xdb\x41\x54\xde\x13\xf4\x31\xe1\x0a\x9a\x3b\x07\x2f\x0e\xcc\xf7\xe9\x31\xfe\x7d\xb7\xa0\x5d\x2b\x57\x87\x36\x79\x34\xc3\xcc\x49\x14\x80\xe3\x5c\x49\xc4\xbb\xe5\x6a\x68\xb0\x95\x80\x08\xee\x84\x10\xf8\x73\x60\x52\x44\x13\x38\xec\x63\xb3\x4f\x04\xeb\x7c\x87\xb0\xbc\x79\x98\xac\x26\x91\xf0\xdf\x4f\xa6\x97\x5f\x49\x73\x2f\xfa\x4a\x4c\x51\x98\x84\x69\xee\xe3\xdd\x00\x88\xc8\xc9\xf2\x6a\x9c\xf4\x00\xfb\x3a\x08\xc1\xaf\x21\xbf\x77\x12\xbd\xa6\x2a\x34\x40\x62\x1d\x23\x99\x40\x22\xf0\x96\x4e\xbf\xc7\xc4\x96\xa8\x72\x44\x50\x01\x58\x50\x1d\xce\x19\x5e\x26\x42\x19\xb3\xdf\x6a\xd2\x11\x32\x70\xd4\x3a\xb6\x0b\xd8\x5b\x9f\xda\x05\xd8\x41\x3a\xb2\xc7\xf1\xc5\xc5\xf4\x9b\xf4\x28\xb5\xbd\x10\x13\x7b\xd3\x81\xc2\x4e\xf3\x04\xa1\xbd\xfc\x4a\x42\x7b\x71\x8c\xd0\x7e\xff\xec\xa2\x3d\xc1\xcb\xd8\xc8\x4c\x17\xf9\x0a\x0c\x1f\xa4\xc8\xa8\x2b\x40\xe1\xf2\x6b\x1a\xa9\xd6\x8d\x19\x1e\x5f\xe4\x78\xc0\x45\xe7\x79\x55\x8b\x88\x3e\x9f\xa5\xad\x98\xef\xbc\xc5\x31\xf2\x9f\x45\xa5\x6f\x17\x39\x9d\x08\x24\xdc\x93\x97\x5c\x2b\x1d\x9c\x79\xb8\x5f\x8f\x46\xfe\x41\x1c\xd9\x13\xeb\xcb\x5f\x4c\xac\x2f\x3c\xb1\xbe\xfc\x3a\x62\xfd\x61\x12\x6b\x36\x85\x13\xe1\xa2\xd9\x2a\x7b\xc8\x21\x7b\x48\x41\x87\xca\x78\xa9\x66\xfa\x1e\x3d\x18\x97\xf1\x6f\x53\xe2\x96\xb7\x7d\x76\x80\xe4\xaa\x96\x23\x7f\x37\x86\x2b\xfb\xe3\xbd\xb5\x63\x8f\x6d\xb7\x27\xfc\xf8\xc4\x59\xae\xeb\xfb\xca\x3a\x29\x0d\x95\x3d\x53\x9a\x19\x09\x35\x14\x50\x6e\x6c\xec\xd5\x11\x83\xfb\x5c\x8d\x33\x97\x80\xc2\x42\xd2\xdb\x12\xa8\x21\x5d\x2e\xd3\x4b\x09\x84\x88\x7e\x55\x66\xdf\x54\x0e\x38\xba\x6e\x89\xbb\xc7\x7b\xfb\x03\x43\x30\xad\xd7\xe0\x46\x06\x06\x2e\x78\xa4\xef\x0d\xa0\x32\xac\xdd\xce\x24\xde\xd6\x34\xa5\xd4\x03\x84\x58\xe9\xd7\xf6\x90\x6b\x89\x67\x27\xc8\xfc\x18\xe6\xca\x7c\x74\x21\x98\x5d\x8c\x11\x21\xb9\xf3\x26\x56\xf3\xa6\x31\xd8\x1c\x12\x99\xe9\x0d\x90\x10\xd9\x97\xde\x57\x45\xcf\xbd\x73\xaf\xea\xad\x3d\x30\x04\x5b\xa2\x7e\xb4\x1c\x7b\x2d\x65\x9a\x28\x4a\xa5\x8c\xd1\x35\x78\x70\x18\xee\x4c\xba\x2b\x6f\xc5\xc2\x78\x0e\x9f\xeb\x47\xcd\x59\xbb\x8f\xc1\xc2\x0a\x8c\xae\xc2\xab\x81\x8c\xa7\x97\x62\xf6\x4e\xf6\x41\xb1\x84\x18\xdd\xdc\x8c\xa7\x97\x93\x9f\xde\xc8\x0f\xa8\x6a\x48\x02\x09\xcf\x22\xdf\xb0\x04\x05\x39\x4a\x84\x58\xfe\x6d\x5f\x4c\x08\x30\x20\x44\xec\x03\xaf\xaa\xbc\xd0\x35\x94\xca\x90\x5f\x93\x78\x43\x7b\x93\xeb\x22\x33\x52\x97\xeb\xa2\x42\xbd\x2e\x21\x56\xb5\x5a\x7f\xd6\x8d\x91\x83\x3f\xfc\x71\x60\xad\x17\x54\xd8\x65\xaa\x55\x5c\x3a\x61\x91\x77\xe0\x26\xa6\x42\x9c\x5c\x56\xe5\x0b\x1f\x42\xb0\x6f\xe1\x27\xfe\xff\x86\xa4\x5e\xf6\xa5\x91\xe6\x1e\xf4\xcf\x80\x02\x99\x5e\x4e\xa4\x75\x22\xac\x2a\xa1\xfa\x66\x69\x0e\x65\xa3\xbe\x38\xd2\x6c\x70\x53\xf1\xad\xa9\xfc\xa8\x31\x9c\x59\x6b\xfc\x74\x26\x28\x7c\x8f\x1f\xc3\x75\x62\x0c\x18\x7f\xc4\x31\x43\xa2\x4f\xb8\x1c\x38\x19\xb9\xf2\xb2\x72\xb2\x2a\x71\x1c\xa1\x40\x6b\xb0\xab\xf3\x12\x25\xe8\xef\xf4\x40\x2a\xd3\x4a\x16\x07\x1a\xc2\x5a\x99\x5c\xd7\x42\xb0\x8c\x14\xe5\x5f\x5d\xe4\xc0\x7b\xe7\xc4\x1d\x65\x0f\x38\x9f\x87\xfb\xc3\xe1\x70\x38\xfc\x51\xfe\x01\x9a\x5a\x6d\xda\x09\xe9\x3f\xca\xae\x1e\xb1\x10\x4f\xae\x91\x44\xfe\x18\xe2\x2a\x9b\x48\x9f\xf9\x07\xb6\xe5\x05\x90\xb0\xe2\x25\xc3\x95\xfa\x64\x14\xe7\x48\x7a\xd5\x2e\xbb\x69\x7b\xfa\x42\xb8\x5a\xb7\xb0\xa4\xd9\x69\x1b\x34\x42\x3c\x0d\x11\x25\xd4\xf1\x2f\xb1\x71\x85\xe8\xe2\xa9\x23\xb1\xde\xa0\x06\x36\xfc\x40\x64\xcd\x0a\x81\xe6\xac\xfc\x25\xe6\xac\x10\xde\x9e\x4d\xe5\x42\xeb\xe8\xf5\xbc\x8a\x1d\xea\xb4\x50\xe5\xdd\x5e\xdd\x69\x79\xc7\x24\xfb\x42\x84\xd6\x5d\x2c\xc0\x62\xba\x3d\xfa\x0f\xe4\x80\x4d\xbf\xb9\xb8\x38\x7d\xfb\xe9\xf4\xf5\xdf\x11\x01\xfe\x34\xfe\xfb\xf5\xcb\xef\xbe\xfd\xae\x8d\xff\xfe\xfe\xd5\xeb\x5f\xf1\xdf\xff\x88\x9f\x8b\x5a\xa3\x5d\x74\x01\x30\x54\x13\xa9\xd0\xbd\x4e\x5f\xc6\x82\x05\xb2\xf3\xf1\x0b\xca\xfe\x01\x8b\xea\xa0\xfd\xe7\x01\xe8\xba\x80\x7a\x10\x6c\xe5\x4d\x5e\x6f\x29\x96\x48\x1e\x3f\xcb\xfa\x52\xed\x06\x51\xd0\x08\x47\x29\x6e\x4d\xc7\xb5\x4e\x5b\x75\xb6\x9b\x6e\x43\x30\xa7\xef\xd3\x42\xfc\x06\x41\xc4\x60\xd0\x80\x83\xae\x4f\xd7\x45\x4e\x04\x63\x9c\x31\x41\xd8\x22\x42\xc6\x3a\xcf\xdd\xaa\xcf\xe4\x14\xf3\xa3\x05\xba\xf9\x05\x45\xaa\x3c\x1f\x85\x47\x06\xd2\x11\xa3\xcc\x69\x6e\x06\x72\xa5\x4c\x6e\x7a\x1e\x7d\x67\x2f\x04\x51\x56\xa1\x7b\xeb\x22\x29\xd1\x2b\xd1\x0b\xde\xaa\x46\x03\x96\xae\x2b\x4c\x9e\xd7\xbd\x91\x26\xc7\x33\xd5\xd3\xdc\x9e\x06\x31\x81\x09\x54\x80\x8a\x96\x02\x96\x93\x3c\x88\x40\xa1\xf8\xee\xbd\xf1\xcc\x45\xfb\xa2\xd0\xa6\xe1\x62\x77\xb4\xf5\x21\xd8\x71\x0b\x8e\x51\xe7\xa5\x37\x38\x71\x57\x3c\xba\xe2\xd9\xa9\xf5\x52\xd0\x10\x04\x53\x75\x06\xb4\x2e\xf6\x0e\xea\xab\xad\x46\x38\xb6\x7d\x68\x45\xbc\x22\x34\xf1\x54\xe4\x5b\x15\x99\xae\x8d\xa7\x45\xaf\x10\x7e\x2c\x23\x68\x21\x88\x41\x05\xec\x2f\xfe\x31\x6e\x56\x82\x4a\x7c\x7f\x91\x43\x5b\x28\xcb\x11\xbe\x56\xd0\x6d\xe0\xc1\x9c\x71\x2f\x89\x79\x53\x2e\xdb\x59\x40\x93\x67\xba\x66\x17\x02\x23\xf7\xe2\x89\xc8\x3d\xe2\xcf\xed\x4e\xd3\x5f\xee\xd5\xde\x00\xf3\x57\x18\xce\x87\x9c\x06\x27\x5e\xaa\x7d\x2d\x78\x98\xc1\x52\x89\x5e\x07\x2e\x26\xc5\x95\xcc\x1b\x39\xdb\xd7\x9d\xa9\x41\xb1\xde\x96\xf0\xea\xea\x20\x30\x57\x16\x20\xf6\x9b\x0a\x33\x97\x41\xcf\xbb\x61\x3f\x37\xb4\xf6\xd6\x57\x07\xd3\x4f\x48\x0f\xd8\x8b\xe7\xc6\x3b\x85\xe6\xc6\xed\xf4\xf8\x16\xaf\xe8\x6d\xd8\x54\xad\xb5\xca\x7c\x98\x04\x16\xda\x33\x08\x1d\x17\x3c\xb5\xa6\x24\x7b\x94\x72\x05\x02\x53\x68\xe3\xe3\xb6\xf6\xc2\x9a\xee\x65\x60\xd0\x1a\xbd\xb6\x2e\x79\x50\x7c\xed\x95\x25\xda\x4f\xa9\xc2\xce\x30\x8d\x44\x30\x96\x6b\x55\xca\x5a\x73\x18\xc1\x8d\xa3\x32\x42\x7f\xd9\x41\xcd\x78\x4f\x2b\xd6\x85\x56\x35\xc1\xe9\xe2\x03\xc7\x2e\x94\x16\xd1\x44\x50\x05\xe3\xc1\xcc\xac\x13\x7d\x71\x71\xea\xce\x28\x7e\x08\xe2\x64\xf9\x89\xfb\x50\x16\x89\x8c\x4f\x02\x43\x04\xda\x73\xe1\x56\x4a\xe5\x75\x55\xeb\xf6\x16\x88\xd6\xa4\x7c\x23\x1f\xf3\xcf\x79\xba\xa6\x13\x04\x4b\x2b\x0c\x58\x9e\xf1\x5a\xfe\xd3\xa6\xaa\xff\xe4\xbe\xd7\xbb\xd2\xfd\x68\xbe\x91\x6f\x0f\x1c\xd5\xc3\xbc\x63\xd5\x5d\xfa\x89\xa3\x00\xa9\x6a\x07\xc4\x7a\x6a\x71\x07\x83\x98\x05\xe3\x02\x43\xe2\x0e\x07\xd1\xb7\xdc\x5c\xae\x98\xdf\xf7\xc2\x84\xcf\xa7\x1b\xd7\xf3\x15\x90\x67\x2d\xd0\x25\xfe\xf7\x7f\xfe\x17\x70\x5d\x10\x56\x9e\xc8\x95\xc6\xfc\x3e\x39\xfa\x81\xf1\xed\x66\x45\x1e\x9f\x95\x7f\xff\xe7\x7f\x01\xb4\x0e\x2c\xc0\x3d\x1a\xdb\xf6\xed\xb5\xbe\x23\xb5\x5a\xca\x68\xf2\x7a\x89\xf7\x21\xf1\x52\x96\x88\xc5\x73\xe5\x16\x5c\x19\xf3\xdc\xae\x26\x50\xaa\xe7\xc7\xb9\x57\x86\x4f\x19\x88\xa4\xe1\x4c\x20\x7d\x4f\xbc\x49\x83\x31\x07\x86\x93\x26\x67\xa5\x17\x77\xb0\x6c\x02\x1b\xc1\x8e\x9c\x49\x44\x10\x8a\xe3\x61\xb3\x1f\x20\xa2\xed\xc0\x7f\xab\xe3\x76\xd2\x19\xcf\xaf\x4c\xe5\x48\xb8\x36\xdb\xd7\x03\x61\x28\x85\x1e\xc1\x17\xd2\x88\xd5\xa5\x40\xa9\x32\x9f\xbd\x06\x59\x51\x10\x98\xc2\x20\x11\x4d\xfd\x59\x67\x48\x52\x4d\x2a\xcf\xa9\x1c\x15\xcd\x3d\x14\x5d\xe1\x54\x78\xd7\x2a\x3c\x37\x12\x64\xc2\xa8\xc1\x27\xaf\xf6\x35\x80\x7a\x41\x98\x88\x40\x4d\x70\x66\x73\x63\x08\x7a\xe4\x93\x24\xc7\xf7\xa3\x5f\xf6\xe2\x6f\xd9\x90\x5a\x9b\xae\x95\x10\x98\xa5\xa2\x6b\x96\xc6\x36\x84\x10\x6f\xa3\x42\x9e\x26\x14\xac\x47\x65\x6b\x79\x12\x33\xfd\x93\x8e\xf7\x1a\x13\x43\x65\xe6\x82\x59\x22\xe4\x27\x79\x16\xa1\xf9\x8b\x9a\x2d\x4f\x06\xf1\x2f\x06\xc3\x54\x2e\x23\xea\x20\x78\x09\x7e\x48\xb4\xe4\xd6\x42\x89\x7b\x66\xdc\xa1\xf8\x3c\xa7\x34\x1c\x7a\xae\x3b\x1e\x02\x39\x5d\xfd\x84\xc8\xa3\xf2\x0a\x47\x52\xd1\x8e\xf2\xdf\xeb\xb7\x05\xd4\xc8\xb0\x90\x23\xfa\xd8\xf8\x55\x58\xdf\x45\x47\xa6\xc3\x8f\x13\x0a\x9a\x60\x39\x54\x31\x15\xb5\xfe\xda\xdd\x6c\xdd\xaa\x9c\xb0\xa1\x22\xcc\xa0\x0a\x4f\x79\xfb\xef\xff\xfc\x2f\xad\x2a\x49\x95\xca\x51\xa6\x76\x4d\xf8\x70\x84\xf9\xf7\x19\x7a\x17\xd1\x11\xb5\xc8\xb7\x79\xa1\x6a\x1e\x53\xc6\xe5\x85\xd5\x32\x00\x16\x8d\xe5\x3b\x7b\x3a\x83\x78\x31\x57\x46\x23\xba\x1f\xc9\x8d\x2b\xb9\x02\xbc\x1e\x52\xda\x59\x6b\xaf\x06\x9c\x55\xe2\x6b\xb4\xec\xff\x84\x29\x1a\xe1\x50\x5c\x10\xbf\x21\xa2\x37\xcf\xd7\x14\x5c\x25\x3e\xf2\xd0\xdb\x51\x31\x67\x9e\x9c\xa2\xa3\xf1\x7d\x44\xa3\x29\x5e\xe1\x89\x07\x34\xf6\xf7\x51\xc9\xed\x1e\x49\xab\x31\xe8\x49\x80\x6d\x20\x0c\x07\x8e\x68\xd8\x9a\xb5\x5e\x57\x35\xd2\xa5\xd0\xdc\x89\xe8\x21\x05\x18\x8f\x84\xfc\xcb\x02\x10\x65\xef\x3b\xcd\xa1\x84\x42\x2c\x7b\x66\xe7\x5b\x9d\x09\x47\x07\x8b\x8a\x58\x72\x8b\x15\x0b\xb9\x75\x88\x52\x80\xca\xe1\x5b\xed\x3d\xec\x76\xa5\xa3\xc3\x67\x83\x1e\x76\x61\xa0\xa1\x5b\x3f\x3d\xa6\x39\x85\xe8\x63\x5c\x69\x53\x75\x57\x27\xe6\x04\xaa\x3a\x8b\x43\x76\x4f\x22\x0f\xe2\x69\x48\x01\x86\xf7\xd4\x5a\xa6\xfe\x44\x37\xf2\x37\x76\xfc\xe9\x53\x9c\xc5\x28\x2a\xa3\x8b\x83\x60\x77\x33\x72\x85\x9e\xa1\x12\x8e\xa6\x76\x55\x57\x2a\x5b\x2b\xd3\x24\xa2\x33\xc5\xd0\xba\x7d\x2e\xdf\xeb\x52\xd7\xb9\x91\x97\xaa\x51\x76\x4b\x51\x53\x03\x0d\x0f\xf0\xa5\x25\x08\x97\x82\x58\x32\xf3\x3a\xd9\xc3\xb0\x50\x2b\x5d\x90\x9c\x95\x6a\xf4\x1d\xfa\x25\x5f\xb9\x6a\x83\x67\x45\x7e\x9c\x13\x4e\x38\x59\x0d\x4f\xce\x86\xa7\x27\xe7\x43\xe7\x7f\x3d\x35\xbc\x29\x20\x00\xc7\x4e\xde\x66\xc9\x02\x00\xb0\xf4\xaf\xb5\x32\xfb\xda\x31\xfe\xe3\xbd\xbc\xe5\x5f\xda\x53\xc6\x41\x26\xd5\xca\xe8\x72\x0d\x35\xb5\x48\x2a\xe4\xad\xa1\x24\xd4\xa2\x42\xb9\xe4\x07\x5d\xfa\x88\x29\xa8\x32\x6e\xf6\xc5\x26\x2f\xa0\x5c\x28\x64\x03\xc3\x4f\x8c\xea\x26\x5f\x17\x5a\x9e\x9d\x39\xd4\xc3\xe4\x66\x16\x74\x6c\x09\x6a\x8d\x52\x65\xd5\x8e\x02\xad\x97\x7a\xad\xb7\x2b\x5d\xcb\xf3\x97\x89\x3c\xfb\xed\x6f\xbf\x03\x3a\xc7\x70\xe5\xc4\x7a\x8f\x01\xfa\x57\x08\xcd\x24\x4d\x2e\x2a\x7a\x15\x44\x45\x71\x30\x80\x28\x19\xc0\x48\xf0\xaf\x4c\xab\x82\x17\xc9\x37\x14\xfb\x40\xda\xf0\x27\x8c\xd9\x27\x17\x3e\xda\x5c\x54\x62\x40\x3b\x57\x04\x72\x9c\x9d\x23\x24\x15\xff\x0f\x7b\xef\xba\xdc\x36\x92\xa6\x0d\xfe\xcf\xab\xc8\x55\xec\x37\x96\x62\x60\x58\x07\xdb\x55\x65\x6f\x6c\x04\x2d\x51\x36\xa7\x65\x51\x43\x52\xe5\xf6\x6e\x6c\xc4\x82\x64\x52\x42\x1b\x04\xd8\x48\x50\x2a\xce\x15\xcd\x7d\xcc\x8d\x6d\xe4\x7b\xc8\x7c\x13\x00\x25\x75\x6d\x77\xcf\xf7\x45\x94\x7e\x74\x97\x25\x12\xc8\x73\xbe\x87\xe7\x7d\x1e\xb5\x4a\x7b\x4e\x96\x70\x22\x64\x75\x93\xdb\x26\x5f\x60\x4b\x1a\x53\x3b\x23\x1d\xcf\xb7\x25\xad\xe5\x70\x62\x2b\x7f\xed\xf8\x6a\x81\x08\x73\x84\x4d\x5b\xee\xd9\xd6\x77\x69\xc7\xf2\x09\xed\xe8\x17\xc9\xb5\x7b\x2a\x52\xd4\xb3\xc7\x48\x42\xed\x83\xed\x15\x10\xec\xce\x60\x8d\x86\x58\xed\x1b\xe2\x70\x34\x3e\x35\xc0\x64\x68\xa0\xc3\x1b\xac\x8d\xb6\xe9\x1f\x3c\x54\x75\x1f\x9c\x5d\xd1\xfd\x80\xa0\x3f\x44\x90\x01\x96\x4c\x1c\xe6\xc6\x1e\x05\xca\x00\x1a\xa4\x80\xb8\x50\x9d\x41\xce\x53\x3d\xbd\x17\x1a\x28\x95\x8f\x50\xc9\xb9\x13\xce\x20\xd1\xb5\xe1\xc7\x11\x7b\xb3\x20\x76\xbe\x86\xe5\x57\x6d\xff\x3d\xdc\x9a\xcd\xe0\x22\xc4\x58\x3c\x32\xbf\x5b\x15\x4f\xf1\x19\x1b\xcb\x40\x2c\x73\x6b\x0d\x73\xf5\x24\x71\xd9\x5d\x42\xc0\xfb\xaa\x96\x45\xd8\xac\x76\xb9\xee\xda\x60\x71\x77\x83\xd3\x44\x71\x1c\xb4\x8c\xd6\x70\x32\x04\x66\x1e\xfc\x30\xa6\xaf\x69\x38\xc4\xc3\xc1\x78\xca\xa4\xb8\x95\x73\xfc\xdc\x05\xad\xc2\x44\x16\x10\x76\xb1\xa6\x24\x6b\x64\x9d\x2a\xf5\x97\xf4\xa9\xdb\x82\x26\x81\xe9\x56\x83\xac\x46\xb8\xb7\x7c\xc4\x53\x41\x1b\x2e\x90\x29\xe1\xc1\xe8\x5f\xde\xbf\xf9\xe5\xcd\xf0\x9c\x3b\x30\xdc\xba\x13\x37\x2b\xf5\x4d\x56\x17\x79\xb6\x66\x9c\x0d\xfd\xf9\xbc\xda\x96\x8b\x1c\x18\xa3\x4e\x4e\xd4\x57\x28\x7a\x70\x27\x62\xcc\x5e\xb4\xa9\xab\x86\x89\x18\x56\xfe\x38\x40\x39\x04\xf7\xc8\x25\xf2\x45\xbd\x41\x22\xde\x85\x31\x4b\xb3\x4c\x94\xd0\x4a\xa0\x82\x09\xd6\x7e\x2e\x76\x52\x79\xd7\xd3\xc3\xed\xd0\x06\xca\x7d\x35\x7c\xb1\x4c\x95\xfa\x41\xf9\xbd\x9e\x2d\x22\x78\x37\x9e\xf1\xac\x58\x75\xb9\x7b\x1c\xe1\xd6\xbe\x27\xef\xa4\x46\xdc\x01\xac\x0b\x12\xa2\x12\xa6\xf9\x29\x98\xe6\xd3\x45\xb5\x21\x68\x53\x16\x38\xb9\xd0\xa7\x57\xea\xe4\x65\x32\x2e\x4f\x5c\xe2\xc1\xd5\xe8\x53\x73\x11\x35\x73\x51\x65\x1c\x54\xd0\xf9\x8a\x41\x54\xf8\x88\x8b\xea\xa2\xda\x39\x51\x11\xe7\xf1\x5c\x7d\x03\x97\xef\x71\x07\x14\x28\xb4\x68\xfe\x19\xa4\xad\x2a\x16\x3c\x7b\x7a\xbf\x9a\xa0\x1b\x51\x15\x04\x31\x82\x40\x2f\x95\x1c\xf8\x07\x7e\x4a\xb5\x2f\xa4\x14\x35\x95\xe1\xd1\x6d\x8b\x13\x05\x75\xf6\x5f\xcd\xa1\x90\x3a\x7b\xa8\xf2\x25\xfb\x8e\xcb\x6a\x3b\x6f\xd8\xe2\x0f\xdf\x56\xed\x8b\xbd\x73\x13\x24\x7d\xf3\x17\x52\x48\xf0\x79\x84\xa3\x00\x82\xbc\xa2\xf0\x57\x60\x97\x28\xa8\x5c\xcb\xeb\xec\xb7\x03\x6a\x3c\x1a\x67\x29\x08\xb0\xa7\x04\x5c\xe0\xda\x8f\xee\xcb\xf3\x3d\x86\xdf\xfb\xc3\xec\x08\x39\x8e\xbf\x02\x1b\x05\x31\x22\xac\xb3\xc6\x4a\x95\xa4\x16\x12\xbc\x28\xaa\x47\x67\x7b\xce\xa2\x8b\x9d\x83\xe5\x56\x11\xd6\xf8\xb9\xd5\x83\x35\xc9\xad\xd7\x7a\x3c\x5f\x59\x3d\xea\x1f\x65\xf5\x08\x31\x56\x37\x07\xa8\x0a\x8e\xe9\xb1\x65\x7c\xa4\xef\x6b\x69\xc4\x81\xba\xac\x94\xad\x5a\x8d\x7e\xcc\x72\x62\xc5\x7c\xc3\x69\x7b\x9c\x24\x67\x07\x00\x6e\x87\x20\x8f\x14\x24\xf3\x17\xb6\x6a\x2a\xd7\xe2\x79\x8e\xb2\x77\x91\xc3\xff\x92\xc6\xc8\xb1\x51\x9d\x4b\x52\x10\x21\xbc\xe4\x61\xc1\x3a\x56\xcf\xd9\xe4\x2f\x74\x18\x6c\xee\x56\xa1\xea\x23\x7d\xe9\xf0\x18\x09\x6e\xdb\xd3\xc3\xec\xe8\xf0\xed\x91\x2e\xa1\xe4\x83\xb6\xa6\xed\x38\xb9\x7e\xfd\xbe\x4b\x25\x73\x60\xa8\x05\x4b\x95\x1a\xa4\x7a\x0c\x95\xb7\xbe\xc4\xc9\x4f\x9a\x3b\x69\xbb\x66\xac\x1e\x3e\x98\x7a\x17\x1e\xd2\xb6\xc7\x82\x8b\x1d\x13\x1b\xfa\xa0\x4d\x56\x52\xad\x6f\xf7\x8d\xcf\x4c\x58\x1b\x3f\xff\xb2\x13\x3d\x55\xea\x13\xd4\x0c\x2e\xe5\x10\x04\x26\xe1\x50\xa6\x02\x08\x37\x16\x84\x71\x76\x0d\x95\xb7\x05\x14\x98\x8a\x4a\x30\x7a\x70\xf8\x1a\xad\x22\x3a\xac\xdc\x97\xf7\xac\x14\xe5\xbd\x37\x96\x87\xef\x09\x3a\xb8\xc3\x11\x10\x7d\x95\x6f\xb1\x8d\xc0\xbf\xd1\xc0\xd3\x20\x91\x15\xb9\x77\x82\xe4\x79\xfd\x1e\x06\xc6\x94\xcb\xaa\xb6\x48\x8d\xab\xaf\xa9\x58\x80\x6b\x2d\x5a\x27\x9c\xac\xdd\xa5\x20\x75\xbb\x30\x26\xce\x69\xd0\xf6\x26\x24\xcc\x2e\x94\x9b\x81\xb4\x1f\x97\xe5\xee\xb3\xee\x65\xc0\x26\x61\x79\x29\xc2\xa1\x61\xa4\x67\x53\xb9\xa5\xe3\x4e\x2a\xea\x06\x86\xb5\xd8\x7b\xa9\x56\xc4\x0f\x65\x9b\xac\xd9\x5a\x35\xdf\xc5\x37\xbc\x77\xa8\xac\xa4\x86\x00\x1a\x01\x58\xaf\x51\x45\x50\x16\x71\xed\x78\xa3\xe4\xcc\x6d\xc7\x93\xa3\xc3\xc1\xd1\x61\x4e\x6c\x3b\xf3\x54\x8f\x65\x9a\x11\xac\x92\xaf\x55\x9d\x15\x9e\xcc\x97\x2d\xf4\x50\x25\x5b\xad\xc0\xed\xbd\x43\xb7\x9c\x03\x04\x9d\xac\x7e\xc7\xd7\x70\x66\x06\x52\x87\xa1\xb1\x0c\x5f\xdf\xd4\xf9\x43\xb6\xd8\x79\x97\x17\x0d\x40\x76\xaf\x37\xa6\xb6\x24\x48\x45\x11\x8b\x8f\x82\xd0\x33\x0a\x2e\x73\xaa\xbe\x35\x6e\x7d\x47\xba\xea\x1e\xe9\x32\xc2\xdb\x17\x0f\x0c\x79\x43\x74\x0c\xfb\xc4\xf3\xe1\x22\xd4\x2f\xb8\xed\x12\x8f\x84\xf6\x51\x4d\x34\x4a\x88\x5f\x01\xee\x32\x2e\x11\xd1\x22\xea\xb3\x67\x9c\xbb\x27\xc9\x59\x3b\xf4\xfe\xdc\xe8\xec\x42\x05\xf4\xa2\x02\x66\xe7\xa0\x21\x8b\x8e\x03\x43\xd1\xf1\xa1\xfd\x7b\x3b\xc4\xb0\xe8\xd6\x96\x84\xaf\xc4\xa4\xa7\x32\x7e\x03\x1e\x19\x8b\xdc\x34\x3b\x9f\x4b\xdd\xe9\x87\xaa\xd8\x96\x8d\xbb\xca\xa8\x7d\x28\x22\xe4\xb6\x05\x94\xdc\x93\xb8\xd0\xb6\xb0\x55\xbd\x53\x81\x2d\xde\x2e\xee\xcd\xda\x20\x65\x78\xc0\x7e\x3b\xef\x23\xee\xb2\xe4\x0b\xf7\x2c\xd8\xd4\x7d\x25\xba\x8f\x2b\x82\xc7\x40\xd8\xf6\x67\xf2\xc6\x91\x52\x75\xc4\xc6\xfa\xcc\xe0\x38\xe3\x2b\xb4\xa1\x2d\xc4\x10\xc1\x61\x55\xdb\xc6\xcb\x52\x99\x92\xc1\xdd\x4a\xc4\x0a\x4f\x98\xd1\x12\x82\x9f\x97\xa2\x0a\xba\xaa\xd7\x94\x3a\x5a\x6f\x6d\xf3\x01\x6e\x59\x2c\x62\x8e\xdb\xe1\x4e\xf8\xbc\x41\xa1\x10\x8a\xd7\xb4\xb7\x47\x1b\x6a\x19\x4e\xc4\x0f\x10\x61\x68\x41\x4c\x99\xc2\x08\x61\x2d\x10\xc0\x78\x2a\x5c\xe2\xe3\x60\x56\x3d\x7b\xfa\x21\xca\xbc\xdc\x89\x5c\x9f\x4c\x12\x18\x1b\xb2\xba\x21\xfa\x22\x8b\x14\x76\x7a\x63\xcd\x76\x59\x95\xbb\x35\x5c\x6d\xfe\x85\x47\x1f\x85\xdb\xa1\xb5\xce\xf3\xb4\x87\x21\xad\xf3\x21\xf8\x94\x60\x4f\xd3\xc0\xa6\x47\x84\x54\x9d\xcd\xdb\xfe\xfa\xc3\x53\xdf\x36\x42\xb4\xc9\x8d\x60\x40\x62\x7d\x54\x0a\xbe\x79\x3b\x19\xb9\x1d\x73\xbf\xdb\x98\x1a\xe8\xbd\xa2\xa2\x3f\x39\xce\xf1\x69\x2a\x04\xde\x36\x75\xb6\x68\x30\xa7\xfe\x11\x6c\x14\xa6\x88\x63\xe4\x7c\xe0\x34\xdd\x3b\x81\xb4\xaa\x88\x54\x62\xe1\x69\x46\xa0\x6c\xba\x36\x0f\x79\xb5\xb5\xb1\x5d\x49\x6e\xde\xb9\x78\xdd\xde\x94\xc7\xf3\x47\x22\x51\x43\x09\x98\x37\xe0\xba\xab\x15\x5d\xed\xa6\x6f\xa0\x7a\x1d\x37\x3c\xa8\xbb\xca\x22\x51\x1d\xa8\x70\xa9\xe8\xd2\xdd\xbb\x28\x95\x67\xa6\x83\x78\x11\x31\x32\x40\x0c\xc3\x93\x05\x42\x5b\x7d\x46\xed\x99\xdd\x8e\x8c\x9b\x1e\x1f\x91\x37\x6c\xfc\x88\x57\x37\xd5\xbe\x96\xcf\xb9\xa2\x17\x6a\x0d\x54\xdf\xf2\x81\xc2\x20\xac\x28\x8f\x45\xa2\xc0\x42\xe0\x6c\x7d\x8c\xb3\x3f\x83\x73\xaa\xbd\xff\x44\x51\xa3\x20\x51\x58\x57\x4c\x09\xb1\xa2\x28\x4e\xc0\x28\x7a\xa9\xbb\x40\xd2\x2a\xcc\x9a\x17\xad\x61\xf4\x6f\xa3\x53\xb3\x93\x93\x72\x7f\xf2\x91\x04\xf7\xc4\x6e\x86\xcc\xe7\xc3\x14\x34\x1b\xc1\xa0\x58\x9d\xd6\x25\xb1\xe8\xbc\x00\x6e\x54\xf4\xed\xf3\x50\x70\xdf\x17\x9d\x0d\xf2\x1b\x10\x51\xda\x1f\x0a\x84\x42\xa2\x4e\x66\xd0\xbb\xd7\xb8\xf2\x9f\x0a\x25\x46\x71\x6c\xf5\x6c\x1c\x1b\x89\x3c\x56\x4f\x84\x4a\x22\x37\xf0\xe4\x48\x46\xa7\x1a\x49\xb9\x62\x7e\xc3\x4c\xbf\x02\xc8\xd7\x9e\x28\x0e\xdc\xe9\xb5\xce\x80\x42\xac\xc9\xb0\x8e\xcd\xeb\xe1\x30\x23\x1e\xd2\x04\xe8\x6a\x05\xf5\x10\x1c\x7f\xfc\x08\x59\xce\x9c\x19\x88\x84\x50\xde\x33\x0f\xe4\x07\x84\x27\xe7\xa5\xca\xc2\xaf\xa3\x3d\x09\x18\x9a\x27\x33\x7b\x40\x6e\x21\x9f\xab\xfe\xa6\x07\xe8\x43\x36\x1b\x51\xb6\xd5\x07\x37\xb9\x75\x47\x2a\xb7\x9d\xb5\xd6\x43\x54\x22\x83\x4a\x4f\x9f\x5c\x3c\x68\x72\x0e\xd4\x4b\xe7\x20\xea\x6a\xaa\xd4\x53\x61\xb5\x96\x26\x0e\xd8\x19\xa4\x7c\x19\x01\xae\xa9\xc2\x47\xb5\x24\x7a\xec\xfe\xa3\xbf\x2f\x5f\x1e\xef\x0a\xc5\xd5\x61\x4f\x66\x38\xb9\x71\xef\x10\x75\xd1\x57\xf4\x9c\x9b\x76\x30\xb1\x5d\xc4\x9a\xa5\x9a\x2a\x46\x02\x4d\x18\x17\xaf\x17\x64\x05\x37\xd9\x0f\x9f\x01\x10\x27\xe4\x1e\x6f\x47\xc5\x5e\xe2\x6a\x45\x7a\xba\x7d\x17\xb1\x7d\x9d\x63\x03\x33\xfb\x5a\xc8\x3b\x23\x95\xc3\x0f\x04\x73\x4b\xe2\x46\xe2\xd0\x94\xe5\xcb\x78\x65\xff\xc8\xf1\x62\x5a\x60\xfd\xc7\x9e\xe8\xad\x62\x2f\x80\xcc\xdd\x24\x14\x4d\x7b\x73\x3e\x64\x0a\x49\x2f\x81\x6f\x93\xde\x2c\xbb\x8a\x9b\xd2\xe4\x8d\x6b\xff\xda\xd4\x8b\xfb\xac\x6c\x32\x2e\x01\x5c\xe5\x0d\x54\x33\x03\x72\x10\x35\x13\x16\x5b\x70\x27\x31\xd0\x85\xf1\xee\x88\xb4\x4b\x51\xea\xd9\x3d\xb6\xc8\x9a\x08\x62\xbf\x34\x20\xf1\x00\xe5\x93\xdb\x1a\x9c\x55\x86\x89\xc1\x50\x21\x29\x52\x78\x80\x32\x75\x5d\xd5\xc2\x0b\x02\xe1\xf3\x06\xc3\x97\xc8\x8e\x61\x17\xd5\x83\xa9\x11\x87\x86\xa7\xb6\x50\xdf\x8c\x2d\x39\xc5\x8e\x1f\xc5\x59\xdd\x16\x5d\x6d\xf1\xf0\xa2\x90\x38\x6d\x1f\x61\x0b\x72\x98\x48\x06\xa3\x11\xeb\xb1\xcf\x2d\xcc\x45\x79\x35\x88\xb3\x45\xeb\xaa\x5d\x94\xac\x2a\x34\x67\x64\xed\xf5\xb3\x6a\xcb\xa2\xfe\x3a\x46\xf4\x70\xed\x64\x4f\x11\x73\xa8\x70\xf6\xe5\xcc\x71\x2d\x73\xa2\x37\x40\x72\xff\x00\x9c\x3d\x20\xb3\x55\x47\xd5\xab\x50\xe7\x9b\xa0\x8e\xbc\xfb\xc8\x86\xd0\x83\xa2\x28\x80\xab\x9e\x7d\x59\x73\xe7\x10\x51\xd5\xd3\x97\x61\x28\x23\x8e\x86\xad\xa7\x84\x18\xf6\x6b\x5f\x09\xf1\x0b\x1a\xca\x6b\x25\x13\xc3\xea\xac\x68\x51\x73\x6a\x5f\xb6\x54\x04\x82\x20\x5a\x2a\xca\x2f\x95\x05\x86\xc6\xf7\xf9\x17\xad\x2a\x2f\x1d\xb5\xc2\x07\x9f\x80\xd8\x23\x48\x7e\x49\x90\x9f\x04\x6f\x21\x06\x64\x5f\x38\x67\x5d\xb9\x2b\x8b\xa0\x39\x50\x6e\xf9\x5b\xbe\x06\x39\x98\xac\x74\xbb\xae\x2a\xb6\x4d\xd4\x50\x20\x1a\xca\xf2\x07\x6c\xb3\x7b\x77\x21\x8e\xe0\x20\x5f\xeb\xce\xf1\x99\xa1\x92\x9e\x59\x90\x7a\xc1\x73\x7a\xd6\x73\x95\x30\x90\x82\xad\x9e\x90\x63\xd9\x03\x31\x63\x2c\x9d\xf7\x50\xdc\xfc\xa5\x3a\x14\x44\xe3\xf5\xba\xca\xf2\xa2\x9d\xed\xd9\x97\xf4\x2b\x95\x14\xbe\xdb\x7f\xed\x09\xda\x40\x19\xe0\xc6\x53\x00\xd7\x51\x78\x90\x44\x75\x77\x2f\x0e\x20\xc9\x0b\x82\x3f\x91\xf0\xbe\x7a\x7f\x98\x1d\x81\x9b\x51\x9b\xbc\x04\xb6\x1a\xfb\x01\x02\x13\x71\x5c\xbd\xc5\x5d\xe8\xfe\xc3\x4b\xe5\x00\x25\xee\x16\x82\xa3\x21\x6e\xd9\xf8\xdf\x32\x31\xe3\xd9\xb1\x5e\x42\x19\x05\x61\x3b\xf9\x18\xf5\x9e\x82\x7f\x20\x2a\x0a\xa2\x07\x7d\x9a\x22\x56\x91\xb9\x3b\x7c\x33\x21\xc3\xdd\x86\xfd\xc1\xc2\x7f\xb1\xa1\xf2\xfe\x70\x7e\x24\x32\x79\xa8\xa7\x27\xa2\x49\xf2\x2c\xf0\x24\x34\xc0\x1d\x6a\x7e\xa0\x88\x10\xaf\x26\xe8\x90\x6f\x7f\x3b\x47\xa0\x82\x3f\xb0\x7c\xae\x79\xad\x57\x42\x6d\x06\x91\x96\xf6\xa6\x67\x09\xb2\xcf\x0c\x3a\xbd\xc9\x82\x1a\x48\x18\x74\x87\xa0\xa0\xfb\xb4\x0c\xfb\xdf\xe4\x6b\x23\x22\xb5\x3e\x3d\x00\x37\x0b\x44\x5f\xfd\xea\xec\xf7\xb1\xb5\xd6\x26\x15\x3a\x1c\x89\x7e\x97\xe8\xf7\x89\xfe\x09\xcd\x95\x9f\xbd\x56\x93\x94\x68\xda\x9b\x58\xe1\xf9\xfa\x09\xf6\x3c\x46\xbc\x67\x3e\x35\x13\x85\xf0\xb2\x56\x4a\x30\x30\xaa\x4b\x28\x75\x8b\xe9\xa8\x37\xdd\x22\x11\x47\x01\x8f\x12\xa4\xad\x88\x69\x24\xc4\x02\xb1\x4c\x98\x20\x99\xee\x05\x08\x86\x05\x2b\x38\x11\x85\x3c\x79\x79\x47\xa5\x71\x1e\x6e\x26\x0a\xef\xfa\xd3\x12\x50\x02\x83\xec\x54\x44\xaf\x04\x2c\x31\x3c\xeb\x08\x4f\x01\xdc\xee\xd2\x6c\x4c\xb9\x14\x09\x99\xbf\x0d\x89\xc9\x43\xfd\x33\x0c\xf5\x88\x4f\x7c\x71\xb0\x3e\xbb\xbb\xf6\x64\xca\xa5\x48\x7f\x59\x35\xaa\x75\xa1\x34\x95\xf3\x1c\xd1\x6d\x84\x8b\x29\xf1\xc9\xa8\x44\x24\xca\xa2\x1c\x18\xcc\xe3\xd6\x7a\x11\x8f\x9e\xa8\x18\x8a\xa1\x6c\x8b\xa5\x2e\xb2\x47\xd4\xcd\x64\xfd\x5c\xb6\x71\xda\x48\xa7\x5e\xf4\xc8\xd3\xc6\x17\x47\xc2\x48\xda\xec\x89\xbc\x3d\xaa\xb1\xa9\x6d\x69\xca\x55\x55\x2f\x0c\x9a\xf0\xb9\x90\x15\x6b\xe7\x33\x11\x44\xcd\xd7\xeb\x3a\x2f\xf3\xf5\x76\xdd\x9b\xc0\x80\xe4\x79\xde\x68\xf1\x68\x5f\xac\x13\xda\x16\x78\xe6\xf8\xd9\xf1\xfb\xad\xdb\xf3\x66\xa9\x28\x6f\xda\xe3\x90\x31\x5d\x18\xa6\x1c\x69\xcd\xfa\x97\x7a\xb3\x08\xe3\x49\x6b\x94\x3a\xee\x2f\x25\x82\xe3\xfa\xba\xa2\x8b\x58\x1c\x5a\xfb\x46\x90\x75\x87\xc1\x3e\xc0\x0a\xb9\xb2\x62\x3e\x19\x15\xae\x60\xb0\x31\x19\x57\xb8\x67\xa7\x82\xfe\x6b\xe7\xfe\x58\xfe\xce\xdc\x64\xa7\x02\x42\xd8\x78\xee\x02\x4b\x38\x1f\x02\x66\x4d\x42\x0b\x26\x7f\xc8\x0b\x73\x47\xf6\x58\x1e\x04\x9f\x62\x50\x62\x84\x15\xc2\xdb\x46\xa2\x0a\x7c\x86\xdb\x83\xb8\xdc\xa2\x08\xee\xde\x5f\xb6\x75\x6e\x97\xb9\x17\xd8\xf1\xb0\x87\xb4\xa7\xdc\xd5\x57\x4c\x23\x73\x44\x53\x41\xb4\xa2\x55\x6e\x06\x63\x24\x79\xe0\x12\x5f\x7c\xa2\x42\xe9\xf2\x0e\x75\x00\x02\x3b\x09\xd5\xaf\xf5\x3c\x10\xb1\x1f\x1c\x12\x6e\xf0\xcf\xf6\x9e\xca\x9d\x61\x22\x50\x9f\xd8\x42\x31\x88\xf5\x0b\x81\x6b\x39\x28\x7c\xed\x95\x9c\xd2\x83\x40\xff\x81\x6b\xf1\xf9\xca\x5e\xd8\x9e\x2c\x9f\x12\x83\x08\x97\x15\x68\x6f\x04\x22\x8c\xf3\xf3\x63\x5e\x17\x17\xf8\xb7\x0b\xc3\x91\x71\xaf\xee\xca\x76\x26\x67\x1d\x85\x12\x01\xc7\xd1\xdd\xce\x00\x38\xa2\x2c\x01\xb8\xcf\xea\x50\x9f\xf8\x5c\xb1\x39\xd1\x53\x06\x77\x0c\xce\xb3\x46\x84\x69\xbb\x0f\xa8\x8a\x7c\xe1\x96\x19\x0f\x33\xe0\x19\xfb\xca\xa4\xf8\x93\x49\x77\xf4\x82\xdd\xc4\x08\x12\x78\x99\x70\xb3\x42\x0e\xb4\x5b\x9a\xaf\x24\x3c\x5a\x7c\x12\xa8\x9d\xee\xaa\xde\x22\x7b\x3e\x78\x60\xfd\xd4\x79\x10\xb6\x50\xb4\xdd\x9f\x03\xf9\x63\xed\x4f\x49\x57\x1c\xd6\x53\xb8\x1b\xa4\x14\x8a\x1d\x31\x3a\x86\xa8\x61\xf7\x2c\xda\xa8\x0f\x4f\x5e\xf7\x2a\xbe\xee\x45\xec\x85\xc6\xab\x53\x17\xf8\xe4\x45\x8b\x57\x94\xbb\xfc\xef\xea\x6c\x73\x1f\xe6\x22\xaa\xa7\x6e\x3a\x75\xdd\xb6\x6f\xc7\x07\x70\x45\x93\x01\xea\xa1\x7f\x2d\xfc\x1d\x69\x3f\xfc\x4f\xfa\xe6\xeb\x68\xf6\xfa\xfc\xeb\xed\x7f\x9b\xfe\xe3\xf1\xe9\x49\x57\xff\xf1\xa7\xe3\xf7\x7f\xf0\x7f\xfc\x33\x7e\xfe\x8f\x76\xf6\xf5\xff\xd4\x9f\x76\x24\x64\x0f\xbb\x18\xea\x9e\x3d\xb8\xc4\x7d\xda\x0b\x21\x7a\xfa\x1d\xfc\x23\x88\x50\x0b\x1a\xc3\x16\x4b\xf2\x2e\x50\x84\x91\xd8\x39\x7a\x73\xb5\xc9\x96\x7e\xb7\x56\x15\x93\xcf\xe7\xc0\xe1\x1d\x87\xd9\x43\x3e\xbd\xcf\x96\xf9\xa0\xd4\x4d\xbb\xca\x3a\x81\x16\x93\x6a\xe4\xae\x47\xdb\xa3\xd5\x0d\x1d\xf7\x41\xc5\xe2\x6a\x1c\x66\xe3\x5b\x04\xe2\x24\x74\xca\xad\x0c\x58\x97\x12\x47\x2c\xdd\x71\xe5\x2b\xf4\x21\xa4\xd3\xa5\x93\x42\xb6\x66\x8f\xe3\x44\x3e\xfa\x24\xd4\x3a\xcc\x2b\xd2\x05\x54\xdd\xaf\x96\x54\xfe\x21\xec\xe8\xe8\xa9\xa0\x81\x89\x5c\x75\x6e\xf0\xe2\x89\x51\xb2\x9c\x42\x33\x15\x55\x13\x51\x5e\x21\x47\x06\x3b\x71\x5b\xa2\xef\xca\x96\x0f\xa6\x6e\x72\xa6\xbb\xf4\x98\x24\x45\xb4\xde\x24\x37\xde\xc7\x09\xec\xc7\x9c\x87\x8f\xc9\x91\x12\x2f\x95\x14\x3a\x93\x2a\x35\xfb\x32\xd4\xe7\xe3\x9b\xef\x93\xd1\xe7\x2f\x33\xfd\x65\x7c\x75\x31\x9c\x78\xb9\x6e\x3d\xb8\xba\x92\xbc\x4d\xdf\x46\xb3\x2f\x7a\x32\xfc\x3c\x98\x5c\xe8\xd9\xb8\x25\x08\xad\x82\xce\xb4\xfb\x5a\x57\x93\xbc\x47\x5c\x1c\xb8\xdf\x88\x3a\x34\x52\x06\x57\x41\x19\xbc\xd3\xba\x4f\x43\xdd\xd2\x03\xf7\x8a\xdf\x2c\x08\xbe\x5f\xef\x9b\x15\xc4\xe9\x9f\xdf\xbe\x0c\x66\xd3\xf1\xf0\xd7\xe1\x44\x4f\x86\xd3\xdb\xab\x99\x6b\xfe\xe5\x64\xfc\x15\x45\xc9\xdb\x82\xde\x7a\x3c\x51\xa4\xe7\x1d\xc9\x70\x0f\xae\xf5\x00\x24\x43\xdd\xa7\x83\x26\x77\x8f\xde\x36\x68\x72\x8f\xc6\xb7\x53\xfa\x42\xa2\x58\x7b\x9b\x04\xb7\xc7\xac\xeb\x7d\x3d\xc4\x27\xc2\xa0\xbb\xd6\x80\x0c\xf7\x44\xdf\x0c\x27\x97\xe3\xc9\xd7\x01\x3c\xb5\xa5\xca\xfd\x8f\xb8\xc8\xfe\xf8\xf9\x5d\x3f\xe9\x9b\xaf\x37\xc0\xc4\xf6\xba\xac\x5e\xbb\x0d\x5f\x98\x55\xf3\xda\x17\xcb\xfd\x5d\xac\x82\xa7\xef\xff\xb3\x77\xa7\xc7\x27\xad\xfb\xff\xa7\xe3\xe3\x3f\xf8\xbf\xfe\x29\x3f\x5f\xab\xff\xc8\x8b\x22\x6b\x7b\xd8\x82\x45\xb0\x47\x4c\x58\xa9\x93\xf4\x24\xd5\xb1\x26\x1a\x56\x0d\x01\xbf\x67\x5c\x36\x84\x3e\x31\x15\x0f\x05\x32\x26\x4c\xd5\xd0\x03\x8c\x55\xe4\xee\xa1\xdd\x0b\x37\x05\xa6\x36\x1f\x81\x65\x0c\x22\x22\x7a\x4a\xd7\x06\x00\xf7\x4e\xe3\x16\x70\x9b\x0f\x44\xfd\x92\xd0\x64\x0a\x59\x06\x59\x4f\x5d\xad\x18\x16\x77\x88\x21\xa4\x23\xbc\xdd\x40\xba\x53\x3e\xdc\x5f\x92\x22\x19\x2a\xfe\xfe\x2a\xe6\xcc\xf6\x80\xfc\x93\xf4\x4c\xb6\x52\x34\xaf\xdd\x25\x08\x15\xec\x79\x3a\x74\xf7\x2d\x3c\x28\xfe\x12\x3f\x8c\xf4\x29\xce\xab\xa5\x71\x4e\xcb\x3a\xae\x15\x85\x69\x03\xb6\xc8\x98\x9b\x37\x48\x8e\xde\x33\x59\xa8\xbb\xd6\x87\xbf\xdd\xe7\xf3\xbc\xd1\x03\x0c\x86\x0f\x81\xf2\x1d\x52\x97\x97\xa4\x86\x02\xe9\x36\xf1\x4e\x75\x09\x22\x6a\x6e\x8c\xbe\xc6\xfa\x91\xdd\xcf\xea\x4b\x52\x84\xc5\xa5\xb2\x40\x14\x08\x07\x52\x08\x0b\x01\x6c\xe5\x91\xfc\xe5\x49\xfa\x2e\xd5\x07\xa3\xd2\x99\x84\x59\x93\xbb\xd6\x7c\x73\x66\xe1\xd4\x38\x03\x30\xab\x3d\x03\xa6\xa5\x31\x51\xea\x30\x3b\x0a\x76\x4d\xcf\x18\xe8\x7d\x63\xe0\x89\x54\xc4\x68\xa8\x4f\x1c\x8f\x68\xcf\x01\xa6\x4a\x0e\xe7\xe2\x65\x9d\xb9\x7d\xcc\xac\xde\x2b\x1e\x4b\xe1\xee\x95\xd7\xe5\x3c\x49\x4f\xa0\xdc\x2e\xab\x8b\xdc\xd4\xad\x94\x69\x80\x3e\x43\x62\xa2\xe7\x31\x59\x18\x14\x91\xf6\x38\x49\xdf\xa7\xfa\xa0\x35\x99\x7d\x0a\x96\x8d\x97\xc7\x0d\xc5\x90\xed\xf9\x83\xe7\xfd\x94\xea\x83\xab\xac\xbe\x33\xb5\x46\x8d\x5d\x7a\x16\x7e\x9b\xe2\xbe\x6e\xff\x99\x9e\xd5\x8e\x8a\x49\x51\x81\x33\xe2\x4e\x45\x48\x9d\xe8\x5c\x41\x2d\x28\x88\x8a\x62\x2d\x7d\xe7\x3c\xe0\x65\xf2\x73\x1a\x18\x4f\xfd\x49\x10\x8b\x8e\x9f\xa4\xbf\xf8\x0f\xb9\xa1\xe0\xcf\xdd\x67\x5e\x89\x32\x56\xb3\xf2\xa9\xd5\x75\xf6\x9b\x8c\xfd\x06\x0c\x09\x03\x15\x68\x01\x34\x79\xb0\xa2\x79\xe5\x11\xd5\x51\x1d\x49\x38\x26\x31\xdd\x36\x86\xc9\x02\x25\xf4\x83\xd9\x3d\x21\x3a\x7d\x92\x9e\x1c\xa7\xfa\x20\xda\x72\x72\x46\xdb\x02\x39\x1f\x70\x4f\xc0\x64\xbb\xb1\xcd\xbb\x13\xcb\x08\x59\xbb\x2d\x1a\xcb\x49\x0d\x9f\xa8\x81\x14\xc1\xd2\x14\x06\x62\xaa\x41\xfc\x56\x34\xa0\x0f\xc5\xb4\x7f\xc7\xb8\xa6\x94\xe6\xf1\x99\xe6\x90\xd8\x90\x25\xa6\xf7\x9e\xab\xe0\xc4\xdd\x46\x84\xfd\x3f\x07\x06\xc3\x03\xdc\x09\x72\xbb\x87\x81\x91\xaa\x67\x87\xf6\x48\xca\x6e\xf7\x05\xad\xd6\xa6\xb9\xaf\xd0\x97\x5b\x00\x0a\x07\xe6\x6b\x03\xcb\x74\x6b\x89\x96\xda\xa3\xa6\x37\x52\xe2\x11\xd4\x24\x7a\x14\x07\xb1\x63\x8f\x4c\x8a\xec\xa5\x06\x71\x77\x73\xd4\xf2\x8e\x65\x23\xe5\xfe\x57\x14\x53\xc4\x5a\x32\xef\xa0\x5b\x53\x20\xf3\x01\xa4\x2a\x21\x28\xed\xd6\x5a\x56\xa0\x04\x23\x94\x9d\x81\x08\x23\x4b\x2d\x56\xb5\xf2\xfa\x8a\xd5\x8a\x19\x6d\x3b\xea\x0f\xac\x47\xdb\x73\xd3\xe2\xd0\xbb\x6b\xb8\x73\x0a\x7b\x73\x20\xa7\x43\xc4\xe8\xcf\xd7\xb7\x88\xcb\xeb\x10\x1f\x79\xd2\x62\x75\x9a\x1e\x27\xfe\xc3\x57\xc6\x5a\x53\x3f\xf7\x1d\x7d\x9a\x9e\x84\xef\x0c\x5c\xe7\x2b\xfe\x4e\xa7\x7c\x86\xbf\x73\xe6\xde\xc3\x7c\xe3\xee\xf8\xd1\x5e\x4e\x1c\x46\xdb\x39\xf7\x22\x60\x77\x92\x9e\xb8\x6b\xbc\xbd\x3a\xa5\xa5\xd1\x39\x3d\x23\xc9\xf7\x5e\xb5\x77\x7c\xb0\xbb\xd6\x3b\x72\xf5\xbc\x54\x5b\x96\x54\x16\xdb\x52\xa2\x10\x9b\x48\x25\x7b\x74\x21\x20\x88\x29\xbe\x06\x51\x05\x7c\x63\x50\x19\x0b\x7a\x91\x7e\xc3\xd5\x55\x61\x13\x85\x52\xbb\xee\x1f\x45\xe0\x61\xcf\x19\x35\x81\xb1\x49\xaf\x22\xcc\xba\x15\xfd\x35\x91\x4a\x88\x28\xeb\x03\xfa\x0e\x0f\x21\xde\xd5\x46\x6f\xaa\x47\x48\x77\x7b\xb1\xc8\x00\x60\x02\xb1\x39\x82\x58\x28\xfc\x25\x65\x53\x50\x90\x78\x4d\x19\x57\xd8\x6a\xd8\x9b\x00\x20\x03\x8e\x48\xe4\xc3\x8a\xe5\x2a\x54\x55\x6b\x77\x12\x01\xe1\x36\x30\x7b\x56\x2b\xbd\xae\x00\xef\x98\x95\x7a\x95\xaf\x1a\xa0\xa6\x5b\xb8\xa7\x1f\xbe\x3b\xfe\x1f\xbe\xd0\xa2\xda\x36\x5e\x83\x07\xf2\x05\xc0\x5a\x8b\x44\x56\x50\x88\x16\x3d\x52\xb4\xca\x2b\xf3\xb2\xb1\xfd\x19\x61\xbd\x71\x26\x3d\xa0\x2f\x4e\x48\x3f\xd6\x2a\x35\xec\x17\x7e\xed\x29\x5b\x7f\xbd\xaf\x6e\xdd\x17\xa9\x33\xa4\x86\x6e\x05\x9c\xd1\xbc\x6c\x0c\x54\xef\x6c\x31\x8d\xb5\x31\x75\xb3\x63\xa8\xcc\xa1\xb0\x08\x36\x1e\xe2\xe7\x33\x07\x47\xcf\x9e\x79\x95\x6e\xc3\x93\x21\x61\x2a\x90\x94\x1c\xa7\x0b\xc4\x15\xa4\xd0\xab\x22\x61\xb0\x48\x25\xd6\xfc\xb6\x29\xaa\xbc\xe9\x1e\x5d\x9e\xa6\x1b\xe9\x78\xb7\x25\xd7\x59\x28\x60\xe4\x25\x62\xfc\xaf\x1d\x4d\x2c\xa1\xaf\x97\x69\x61\xe1\x10\x10\xd8\x2d\x17\x1c\xad\xe8\xc6\xf1\xb3\xdc\xea\x32\xaa\xe0\x42\xc7\x51\xeb\x96\x8a\x62\xab\x5a\xf9\xd3\xd9\xb4\xce\xe6\x3d\x32\xb8\x4f\x9c\xd1\x6a\xff\x19\xcd\xeb\xe8\x54\x32\x0c\x5d\x64\x8d\x51\x6a\x16\xf8\xa9\x02\x0f\x8c\xe4\x31\x4a\x4f\x3a\x42\xa7\x1d\xf9\xac\xb9\x59\x54\x6b\xa3\x8c\x7f\x36\x32\xe3\xb7\x74\xa0\xb8\x40\xc3\x83\x97\x64\x63\x57\x79\x6d\x1b\x11\x98\xb5\x5d\x1d\x29\xd1\x91\xb3\x34\xe2\x0b\xa8\x4a\xd2\x57\x06\xb6\x88\xfd\x9d\x8a\x2b\xab\x35\xd7\x7f\x00\xf9\x64\x8b\x0a\x47\x54\x60\xfa\x73\xf4\xba\x92\x80\x15\x26\x0c\x11\x5c\x96\x9c\x10\x65\x85\x52\x9f\x14\x96\x01\x50\xe5\xbf\x01\x51\xd3\xae\x71\xd4\xa7\xed\xd3\xce\xf5\x7a\xe8\xd8\x69\x7a\x02\x66\x14\xcb\x7f\xb5\x35\x6b\xf3\xd0\xa5\xb6\x47\x4b\xdb\x9e\x43\xda\x20\x07\x4f\x6c\x9a\x6d\x1f\x09\x2b\x4a\xa8\x43\xfb\x8d\x39\xd2\x10\xf4\x90\x60\x8b\xe7\xb5\x7b\xf5\x07\x7d\x98\x1f\x11\x9f\xa0\xac\x46\x43\x89\x04\x4c\x74\xbf\x6a\xd5\x2f\xa9\x9e\xc1\x81\xed\x79\x98\xe7\x47\x7d\xde\x7d\x77\x5b\x08\x27\xc3\x07\x9c\x85\x92\xb5\x14\xd1\xec\xd9\x3a\x47\xd4\xb5\x45\xff\x76\x8f\xe4\xa1\x3b\xb3\x18\xf3\x71\xd1\x5b\x54\x5b\x18\xed\x29\x15\x34\x8f\x82\xf3\xcc\x20\x42\xf4\x4c\x77\x44\xcf\x54\x51\xdd\x55\x1e\x70\x20\xbb\x23\x7a\x4c\x89\xc6\x98\xec\xa0\x95\x64\x41\x27\x98\x69\x88\xd6\x54\xb4\x11\x8a\x1a\xd2\xb7\x47\x62\x2f\xbe\x05\x0e\x16\xf2\x67\x04\x89\xf7\x75\x15\xdb\xde\xc0\xa2\x2e\xf6\x0f\xdd\x58\x2d\x99\x24\x64\xbc\xbb\xaf\xa0\x56\x4f\x64\x0e\x80\x52\x79\xdf\x56\xc9\x84\x47\xc5\x76\x5c\x5b\x73\x49\x1f\x5a\x63\xfc\xb6\x39\x39\x4e\x4f\x01\x41\xfd\xb4\xf7\x1c\xbe\x9c\x93\xfc\x56\x13\x0b\x4c\x78\x09\xbd\x30\x38\x67\x72\x70\xde\xa5\x7a\x12\x55\x03\xf4\xdc\xe0\xbe\x5c\xc0\xca\xf8\x41\xf8\xfb\xdc\x14\xb9\x79\xe8\xd3\x65\x03\x5c\x7b\x0e\x87\x10\x11\x95\x73\xec\x8c\xf8\xac\xf2\x06\xb6\xaf\xdd\x42\x69\xbc\xe0\xff\xf1\x2a\xcd\xde\xd5\x85\xf0\x5b\x77\x03\x3d\xeb\x82\x9e\xa6\xef\x53\x7d\x99\xe5\xb5\xbe\xb5\xa6\xb5\x9e\xc9\x57\xf7\x74\xe0\x40\xc9\xb5\xce\xa3\x95\xed\xab\x76\xda\x12\xd1\x22\xcb\xb5\xac\x16\x4d\x0d\x51\x84\x6a\xb5\x97\xef\xcd\xc3\xd5\x03\xdb\x91\x15\xad\xfc\x29\x8d\x4c\x2b\x0f\x8b\x3c\x73\xce\xc3\x59\x7a\xea\xfe\xe7\x0c\xef\xdd\xb3\xf4\x2d\xdc\x0d\x7b\xe9\xbd\xe5\xa5\xa2\xc4\x4d\xe9\xd5\xfe\x27\x52\x50\x29\x37\x36\xb0\xcb\x9c\x74\x85\x0c\xc8\xa9\x70\xfe\x84\x52\x83\xa2\xe8\xa4\xcb\xfa\x8e\x96\xbe\x78\x9a\x94\x35\x8b\x6c\x9a\x20\xae\x4a\x52\x08\x68\x97\x84\xb2\xa9\x10\x85\x4d\xb0\xbc\xa9\xab\x60\xe9\x8d\x78\xc9\xe5\xc4\xea\xc1\xe0\xfb\x88\x9a\x3d\xbf\x8e\x3b\xee\xbc\x8f\xc1\x22\xc0\x2d\x74\xc9\x92\x16\x8a\x69\xf1\xec\x76\x94\x32\x51\x48\x0a\xd8\x1c\x77\xc0\x72\x8e\xa9\x6a\x25\x75\x68\xe4\xcd\x29\x29\x3f\xb2\xa6\x31\xeb\x0d\x1a\x31\x45\x83\x65\x25\x8c\x70\x24\xac\x1c\xf7\xe1\x95\x8a\x8f\xde\x9e\x00\x18\xcf\xe9\x69\x77\x4e\x5b\x51\x36\xfe\x2c\x95\x4c\x8a\xfc\x73\xdf\xdc\xb6\xe3\xad\xcd\xbd\x29\xe9\xb2\x26\xa3\xa8\xf5\x1d\x98\x05\x08\x06\x32\xae\x32\x44\x19\xfb\xd6\x8a\x02\xe5\x3d\x11\xe2\x0c\xa7\xd7\x09\x0e\xf0\x13\x73\xcb\x5c\x67\xbe\x91\x10\xfb\xed\x9b\x12\x21\x0d\xd4\x1b\x03\xd6\xf3\xb8\x98\x17\x82\xb6\xf0\xb5\x26\x5f\x1b\xa8\xec\x2f\x4b\x50\x62\x73\x36\x09\x49\xb1\x95\x95\x70\xce\xd0\x06\xb0\x70\x73\x44\xbb\x06\xa3\x75\xca\x37\x5b\x18\xee\xbc\x1e\xc4\x24\x40\xeb\xda\xa3\xbe\x67\xfd\x87\x28\x0c\x06\xf2\xbc\xa1\xd5\xd0\x37\x5a\x28\xe6\xb6\x0c\xb1\x38\x46\x38\xca\xa3\xda\xaf\x0e\xb0\xae\xb0\x5e\xf1\xe0\x74\xb6\x1a\x2c\xdc\xd6\x62\xe5\x33\x7c\xcf\x62\xdd\x2b\x17\x09\xeb\xf7\xac\xbb\x7e\x23\xaf\x27\x08\x1d\xb3\x92\x4a\x8c\xa1\x88\x3e\xcc\xaf\xe2\x31\x13\x17\x7a\x1b\x0b\x01\xce\xaa\x5b\xb5\x6d\x03\x24\xb2\x3c\xda\xf7\x38\x87\xc6\xda\x47\x88\x87\xd9\xca\xc6\xe4\xc8\x34\x17\x59\x89\xfd\x91\x68\x0c\x5a\x2b\x79\x08\x01\x54\xb2\xc6\xe5\xd6\xcd\x32\x78\xba\xeb\x9e\x3d\x8c\xba\x33\x2f\xc9\x55\x24\x71\xe7\xd0\xc6\xb0\xcc\x80\x12\xcc\xa5\x62\xa7\xda\x0b\x76\xaf\xdf\x20\x56\x2c\xee\xbb\xf6\x5b\x0f\xed\x51\xa2\xa4\x66\x44\x97\x41\x48\x8c\xe1\xda\x79\xe1\xf8\xc1\xbc\xd6\xd5\x06\xe3\x37\xab\x6d\x4d\xf4\x24\x2f\xb1\xd0\xa2\x46\xf9\x90\xa0\xe8\x78\x55\xb7\xda\xaa\x42\x5b\xc5\x52\x7d\x0b\x9e\x10\x08\x04\x29\x79\xb0\x53\xc9\x7b\xb4\x3d\xa8\xc2\x76\xe1\x85\x0d\x78\xdb\xb1\xda\x77\x28\xb6\xeb\x20\x6a\xdc\xb6\x45\x5b\xdf\xff\xbb\xbf\xba\x10\xe3\x61\x42\xab\x2b\x2a\x26\x3b\xea\xca\xe4\xbf\xe0\x56\x0c\xce\x0e\x71\xd6\x06\x26\x25\x2c\x47\x69\x4c\xdd\xdb\xa1\x76\xed\x3e\xf1\x08\x00\xc9\xc7\xda\x2c\x77\x0a\xcb\x27\x57\x19\x46\x77\xf2\x92\xaa\x31\x73\x23\x09\xf0\xde\xa5\x7a\x80\x56\x18\xef\x18\x21\xba\x09\x25\x1f\xe2\x40\x40\x89\x93\x58\x34\xd3\xb9\x14\x1d\xdd\xcc\x30\x5e\x5e\x33\xd3\x2b\x65\xa2\x4b\xdc\x27\x91\xe9\x1e\x2c\x76\x61\x7c\x0d\x75\x12\x01\xbe\x28\xcc\xb7\x6f\x59\x69\x5b\xed\x13\xc2\x4c\x08\xbb\xde\x23\x76\x19\xa5\x5e\xfd\x65\xc8\xe0\x7e\xae\x98\x2b\x76\xa8\x98\x42\x6e\x73\x5b\x56\xb2\xaf\xab\xc9\xbe\xbe\xba\x43\x03\xc6\x30\x54\xb7\x64\x45\x55\x9a\x70\x1f\x53\xa4\xaf\x2b\xb2\xa9\x0c\x54\x70\x45\xe1\x94\xa7\xa4\x34\xbb\x41\x2a\xe1\x84\xa9\x68\x6d\x77\x3b\xa0\xa3\xf6\xe3\x9e\x76\xad\x83\xb6\x07\x6b\x8b\xeb\xc2\x85\xc3\xb7\x67\x03\x75\xc4\xee\xa2\x3a\x48\x2f\x99\xd7\x54\xaa\x8d\xa3\xc7\x35\xfb\x36\xd5\x23\xa9\x9c\x7b\x8e\x97\xc9\xc5\x16\x06\x69\x0a\x55\xd2\xb0\x82\x26\x28\x48\x02\x4e\xd8\x88\xd9\x78\xa0\xa4\x05\x52\x78\x5c\x43\xd6\xf6\x88\x45\x1e\xad\xd7\x10\x50\xed\xf0\x98\xad\xd6\x74\x12\x15\xfb\x36\xb6\x5e\x62\xeb\xb0\x86\xdb\x24\xfa\x2f\xdb\x25\x84\x8c\x55\x55\x2f\xdd\x36\x42\x45\x75\x6a\x2e\x18\x80\x81\x63\x08\x42\xe5\xed\x2b\xb3\xbf\x69\x4f\x27\x2d\xc1\x28\x82\xd8\x37\x1b\x83\x01\x29\x1f\x24\x6a\xc9\xc8\x5a\x92\xa8\x11\x56\x9c\x38\x9f\x7f\x71\x1f\x09\x6b\xb2\xdf\x40\xf2\xa1\x68\xc7\x99\xdf\x1a\x4e\xed\x91\xd0\xa6\x6b\xb1\xca\x5a\x5e\x8e\xdd\x3b\x50\x7d\xb1\x30\x42\xf6\x93\x8d\xc7\x9d\xaa\x2b\x48\xd3\xd3\x0a\x0f\xd3\x1e\xc6\x91\x88\xd8\xfa\x1a\x1d\x3c\x64\x77\xd1\x9a\x26\xcb\x0b\xca\xdb\x64\xf1\xe5\x08\x14\xf4\xee\x2a\xb5\x3f\xa0\xc2\x1b\x4c\x6e\xae\xea\x16\x42\x51\x79\x83\xab\xf3\x5d\x2a\xcb\x62\x95\x7a\xe7\x3c\xc0\x59\x97\x7a\xbb\xdb\x4f\x2a\x21\xef\x2f\x41\xd5\xf9\x4a\xed\xab\x7a\x15\x60\x79\x58\x15\xdd\x5a\x59\x8c\xd7\x7a\x99\x4f\xc0\xb2\x13\xad\xc6\xf3\xcd\x62\x1a\xe6\x5e\x9c\x8a\xf3\x9b\x95\x2f\x0f\x5d\xc2\x52\xf5\x65\x4f\xae\xe1\x5e\x1d\x1c\x85\xb5\x9a\xbc\xe8\x9e\x46\xe6\xb7\x0d\xc0\x48\x8b\x1d\x20\x53\x57\x39\x7c\x33\x0c\x85\xc5\x83\x1c\x03\x48\x89\x5f\xc4\x18\xe3\xaf\xca\x3b\xa8\x94\xa4\x00\x7f\x9f\x2a\xb5\x1b\x34\xb8\x5a\xdc\xbd\xb9\xda\xd1\xf1\x45\xa1\xaf\xf2\xb5\x50\x3f\x75\x2b\xc9\x8d\x54\xdb\x4b\xa1\xd2\x87\xa6\x52\xef\xa9\xa0\x16\xa9\x54\x7d\x30\x03\xc6\x77\x9e\x2d\x7e\xe8\xbc\xe4\xe9\x81\x47\xa2\x66\x4e\x05\xb3\x21\x7a\x01\xa3\xaa\x9e\x1a\x55\x2d\x46\xb5\xa7\xa7\xbd\x1d\x85\xfe\xe5\xc6\xfe\x8e\x1e\x92\x5d\x9a\x53\x6e\x33\xaf\x6d\xa3\x00\xd3\xf0\x3d\xa0\xb6\x81\x37\x6c\xc9\x98\x99\x6a\xd5\x7e\x76\x47\xc6\x1a\xd7\x8e\x6b\xa6\x6a\xeb\x48\xf7\xae\x4b\x3f\xcc\xbe\x6e\xd9\x0f\x73\x8d\xef\xdf\x34\xca\xf7\xcb\xb5\x22\x75\x3b\xec\xd4\x73\x13\x21\xf2\xa2\x71\x67\x5a\xc3\xf7\x2c\x69\x46\xcb\x94\xa7\xbb\x55\x81\xc7\x10\xa2\x27\x6c\xf9\xc9\x48\xb6\x82\x9b\x0b\x02\xa9\x14\x64\x59\x9a\x45\x91\xd5\x19\xf0\xe9\xfd\x65\xbb\xbc\x5b\x93\x5a\x3d\xe6\x90\x16\xd5\xb6\x6c\x40\x6a\x12\x91\x01\x80\x53\xaf\x2b\x6b\xe9\x37\x47\xee\x08\x34\x77\x41\xd2\xa9\x2f\xfc\x1c\x51\xff\x71\x1a\xd4\xed\x7d\x6a\x98\x84\x32\xec\xdf\xc2\x44\xea\xcf\x15\xb7\x04\x34\x11\xaf\xb3\x7b\x5d\xaa\xb8\x4c\x1d\x72\x41\x6d\x6f\x0c\x4b\x16\xfd\xd6\x84\xf1\x3f\x03\x06\x41\xb0\x44\x1f\xd8\xa7\x10\x25\xc6\xd1\x43\xad\x7e\x87\x58\xa7\x77\xe9\x29\x67\x31\xdc\x13\x4d\xb9\x54\x5b\x6b\x7c\x72\x45\x56\xee\xc8\x59\xe0\x4b\x84\x85\x1d\x6b\x63\x4d\x51\x98\xda\x1e\x51\x78\xcb\xad\x55\x05\x04\x12\x0f\x59\x91\x2f\x8b\x9d\xcc\x87\xc0\xbe\xa8\x7d\x29\x7c\x78\x54\xcf\xb9\x07\x6b\x11\x6e\x54\xd1\x17\xec\x7e\x4f\x21\x35\x9e\xfe\xef\xd3\x7e\x96\x9b\x9d\x52\x7d\x4e\xa3\x8f\x14\xf4\xbc\xde\x0b\x8a\x6a\x2f\x28\xea\x0b\xac\x54\x10\x32\x0f\xe4\x32\x6d\x89\x62\xa8\x31\x65\xf2\x18\x28\x47\xf7\xfc\x31\xa1\x64\xab\x17\xfd\x22\x28\x2b\xf6\x03\xdc\x72\x77\x86\x19\xac\x8f\x22\xb2\x17\x15\x58\x65\x0a\x03\x94\x32\x7b\xe9\x64\x90\xdf\xc5\x13\xca\xe4\xe5\x1d\xde\x92\x6e\x83\xba\xb3\x2f\xb7\x3f\x54\xe6\x1d\x9c\xbf\x6e\x81\xce\x14\x26\x5c\x08\x1a\xec\x35\x22\x72\x2b\x90\x09\x53\x90\x3a\x54\x7d\x48\x22\x98\x00\x43\xed\x77\x13\xea\x19\xe7\xc0\xb8\x43\x8a\xb5\x43\x08\xcc\xc4\x3e\xc2\x91\xca\xac\xdd\xae\x4d\x14\x90\x42\x68\x13\xe7\x59\x30\x5d\x03\x91\xea\xda\x6c\xb2\x1c\x8d\x3c\x20\xc1\x47\x63\x16\xd9\x32\x82\x91\x2c\x0d\xf1\xa8\xde\x35\x2b\x03\xb9\xbf\xa8\x33\x8b\xb3\x85\x5a\x08\xfa\xf5\x05\x5b\x05\xe5\x74\xcf\x62\x23\xb7\x53\xfc\x25\xb4\x0b\x57\xf6\x4f\xe9\x3e\x8a\x26\xa5\x6e\x4b\x2c\x15\x21\x16\x6d\x2e\x17\xf5\x52\x9a\xee\x4f\x92\xf5\x26\x80\x34\x9a\xaa\x6e\xa4\x5b\x2e\xe8\x6e\x12\x21\x67\x16\xe1\x37\x68\x0f\xb6\x66\x84\xc1\x3d\xce\x7b\x7c\xbc\xaf\x44\xf0\xa4\x07\x8a\xc8\x4c\xc6\x90\xdc\xa1\x43\xa8\x4d\xd7\xe3\x35\x14\x03\x9d\x4e\x0f\xd7\x4e\x60\xd8\xc1\x4a\xea\x40\xb2\xe3\x99\x72\x68\x52\x9c\x87\x9c\x2d\x1a\x53\xab\x67\x0a\x26\xf9\x7b\xa0\x73\xe9\x96\xd6\xa6\xae\x56\xb9\x33\x7c\x8a\xca\xc2\xe3\xee\xaa\x6a\xe9\x8c\xc5\x44\x01\xee\xc8\x36\xd5\x66\x93\xdd\x41\xe5\xd3\x7a\xb3\x75\x17\x26\x15\x67\x23\x54\xa6\x58\x6d\x4b\x12\x09\x21\x2f\xd1\xa3\x0f\x91\xf0\xb5\x5a\xbb\x8d\xeb\xbc\x11\xdf\xe6\x40\x02\xc4\x24\x3d\x60\x6c\x60\x7d\x32\x4e\x00\x18\x05\x70\xd0\x62\xcc\xd8\x78\xdd\x0b\x41\xd5\xa3\x38\x26\xe5\xe9\x78\x66\x2d\x2e\x9d\xd8\xfb\xf3\xcc\x11\xbe\x0e\xdb\xff\x11\x28\x8f\x96\x26\x6b\xee\xa1\xf4\x88\x58\x8e\x75\x5e\xfe\x65\x0b\xa4\xe5\x91\x48\x71\x68\xed\x2b\x2b\x48\x94\x5a\x3e\x44\x4b\x76\x9e\x5d\x0a\x4b\xec\x42\xbe\x91\xa9\x9e\x3a\x3b\x45\xfa\xa2\x96\x54\x07\x14\x32\x18\x63\x18\x06\x70\x36\x1d\xbd\x21\xa8\x3c\xe6\x85\xb2\x77\x9d\x50\x80\x0e\x98\x6e\xf9\x39\x2d\xc2\xa0\x3d\x0c\x55\x5a\xeb\x9f\xdd\xee\x64\x8b\x47\xa9\x01\x44\x02\xbc\x05\x84\x6a\x66\x58\x9a\x15\x6d\x7b\x4a\x0e\xcf\x81\x64\x98\x44\x39\x73\x8e\xb2\x6f\xeb\x06\x82\x5b\x59\x5c\xcb\x1e\xa8\xe1\xdc\xb1\x59\x2e\x9d\xd9\xb6\xce\x72\xc2\x6b\x52\x99\x70\xb9\xc8\x37\xee\xb0\x02\xe9\x96\x6a\xa5\xe7\x5b\x9b\x97\xc6\x62\x65\x39\x0d\xae\x6f\x9e\x67\x41\x90\xb1\x58\xd0\xa6\x82\xf5\x94\x35\x51\x03\xc2\x25\x08\x70\x3b\x9e\xd5\x1c\xe1\xb3\xab\x22\x5f\x34\xaf\xab\xd5\x6b\x9a\x4f\x74\x44\x6c\x97\x5f\x80\x6d\x1c\x78\xb9\x62\x1a\xca\xcc\xaf\x19\x11\x60\x98\x03\xb6\x52\x5a\x73\x38\x89\xd2\xe2\xc3\x69\xf8\x25\xd5\x5f\x73\xbb\x30\x45\x91\x95\xa6\xda\xda\x56\x7a\x34\x4a\xfc\x92\xd9\x6b\x1a\x61\xea\xb4\xf9\xe1\x98\xe4\x78\x9d\x35\xee\xe0\x20\x80\xbc\x33\x76\xfb\xa9\x2f\x44\x1e\x16\x08\xb9\xd1\x5b\x6d\xf1\x5e\x80\x39\x1e\xbe\xeb\x47\xdf\xb3\x5e\xc0\x32\x88\x43\x8b\x11\x7c\xa0\x8f\xf2\x02\x97\x5c\xf6\xd8\x0a\x64\xa0\x49\x46\x66\x8e\xb0\x26\x8a\xac\xbc\xdb\x66\x77\x54\x02\xe1\x71\x7a\x38\x19\x92\x74\xde\x5b\xef\xb0\xe0\x6a\x74\x07\x22\x7e\x19\xc0\x9b\x80\xcb\x85\x5f\x89\x03\x22\xde\xf8\x6f\x15\x57\x68\xad\x4f\x8e\x53\x36\xbc\x6d\x0b\x71\xeb\xe1\xd6\xc7\xce\x7b\xbf\x36\x8f\xfe\x83\x4a\x71\xf9\xcc\x65\xb5\x2d\x97\x3e\x92\x27\xb3\x3c\xb6\x31\x8f\x59\xbd\xf4\x71\x8b\x98\x5a\xde\xaf\xbc\x93\xe3\xf4\x2c\x51\x25\x05\x3c\x03\xce\xae\xe7\x51\xc8\x26\x25\x41\xea\x88\x9a\xf3\x35\x98\xf6\x5e\x97\xe6\x51\xc5\x90\xd6\x28\x84\x92\x2d\xee\x3d\x52\x82\x61\x4b\x77\xb9\x3b\xdb\x33\xb0\x84\xf3\xf2\x6e\x9b\x5b\xd8\x22\x5c\x94\x50\x6e\xd7\x73\xbe\xfe\x71\x30\x3c\x9e\xcc\xbd\x20\x1e\x96\x9e\x2c\xdb\x4b\xd3\x03\xee\x1f\x01\xc4\x21\x18\xa0\xf8\xd3\x21\x6f\xcd\xb8\x87\x20\x3a\xd1\x9f\x91\x49\x3c\xd4\x43\xc5\x50\x0f\x08\xd9\x76\xa0\x23\x81\x92\x21\x96\x2e\xf6\x53\x29\xc6\xe0\x2c\xa5\x5c\xbb\x59\x8a\xee\x8f\x56\x50\xde\x4c\xf9\x32\x0f\x3d\x02\x6c\x4f\x94\xe6\x6e\x67\xb6\xdd\xb7\x1e\x01\x98\x51\xd1\xb7\x55\x06\x00\x79\x99\x33\x84\x13\xd3\xfa\xbe\xed\xba\xd9\x39\x67\xfd\x65\x81\x55\x9a\xa7\xb0\x73\x30\x60\x33\x6b\x03\x45\xbf\xb2\xa7\xe8\x4b\x79\x1e\x61\x7f\xb6\xb2\x0d\xae\x64\x99\x70\x7b\x79\x32\xde\x08\x43\x2c\x84\x2a\x83\x46\xfb\x16\xf1\x57\x30\x5b\x6a\x05\xd3\x0d\xb5\xed\x28\x55\xea\xe4\x38\x7d\x2b\x73\x93\xe5\xdd\x9e\xfa\x80\xdc\xea\x97\x24\xdb\x60\x5e\x00\xef\xe0\xd3\x16\x62\x7d\xfe\x9e\x47\x73\x96\xaa\x2b\x58\xc2\x43\x1d\xc1\x91\x4c\x44\x43\xd7\xa9\x36\x52\xa2\xf6\xea\x53\xe7\x14\xe7\x58\x25\x17\x2c\xa5\xa1\x4e\x4b\xbf\xee\xb4\xde\xab\x03\x63\xbe\x8c\xae\x9e\x4e\x1f\x81\x90\xbe\x47\x41\x8b\x9a\xdb\x5f\x1c\x98\xa8\x87\x54\x9f\xa6\xc7\x78\xf5\x08\xdc\x85\xd1\x5f\x6f\xae\xa0\xd6\xc9\xad\xf4\x30\xb6\x4b\x11\x0b\x5a\xe5\xee\xd6\x81\x59\x08\xe0\x0d\x77\xe6\x65\x8d\xbe\x6f\x9a\xcd\x87\x37\x6f\xd6\xf8\x56\x60\x3f\xf9\x7a\x73\xf5\xe6\x34\x3d\x7e\x93\x8a\xa0\x3d\x30\x45\x73\xd8\x1e\x75\xaf\xf3\x9a\x6d\xf5\xcd\xb6\x69\x95\xb3\x45\x0e\x27\xbc\x5e\x85\x88\x7a\xc8\x55\x74\xbe\x55\x54\x94\x02\x3b\xf4\x2a\xdc\xfa\x6a\x74\x3e\xbc\x9e\x0e\x7d\xbd\x4a\xa6\x6a\x53\x98\x07\xb7\x63\xd1\x1d\xa8\xea\xdd\x11\x19\x45\x32\x74\xec\x0b\x3d\x8a\xfc\x87\x21\x4b\xb6\xaa\x7e\x84\xed\x9c\x85\x08\x96\x4f\xf4\x2d\x97\x12\x30\x87\xc9\xba\x26\xa4\xfb\xaa\x95\xd4\x1b\x67\xac\x79\xaa\x54\x58\x43\xaf\x5f\x5a\x31\xf7\xec\x2a\x79\xd9\x73\x40\xa5\x8e\x84\xb5\xb9\x4c\x65\xcf\x1a\xd2\xb4\x86\xfe\xa8\x04\xff\xef\xfd\x49\xdf\x5c\x7d\xa6\x02\x70\x67\xe9\xfd\x43\x58\x60\x9e\xae\xff\x7e\x7f\x7c\x76\xfc\xbe\x55\xff\x7d\xf6\xfe\xed\x1f\xf5\xdf\xff\x94\x1f\x28\xb4\x1a\x7d\x9a\x0c\x26\xdf\xf5\xe7\xe1\xf5\x70\x32\xb8\xd2\x37\xb7\x9f\xae\x46\xe7\x7c\xd8\x29\xe5\x2b\xad\x12\xfd\x6f\xdb\xd2\xe8\x93\x5f\x7e\x39\x11\x6c\xad\x87\xe7\x47\xf8\xab\xcb\xda\x98\x60\xdb\x05\x93\x38\x71\x77\x68\xaa\xd4\x3b\xf7\x91\xac\xfc\x51\x38\xbb\xb7\x49\xf4\x65\xbe\x6a\xee\xf5\x65\x51\x55\x75\xa2\x3f\x55\xb6\x71\x1f\xfd\x3a\xd0\xc7\xa7\x27\x27\xc7\xaf\x4f\xce\x8e\x4f\x12\x7d\x3b\x1d\x28\x05\x4a\x64\xee\x92\xc8\x65\xa8\x86\xc4\xa5\xdb\x78\xa4\x07\x53\xcf\xb3\x26\x5f\x13\x85\x8a\xbf\x48\xc9\xe6\xf0\x94\x2e\x58\x6a\xb7\xb8\xcf\x20\xe0\x28\xee\x16\x96\xe3\x53\xea\xff\x9e\xb5\xb3\x20\xce\x7b\x36\xa0\x37\xd1\xba\xd9\x8b\x7c\x0e\x32\xbe\x9f\x6f\xae\x52\x3d\xc2\x67\x81\xc5\x6c\x96\xfa\x54\xcf\x0d\x40\xe1\x55\xee\x0c\x40\x43\xf1\x48\x7e\xc2\xa9\xaf\x28\xe2\xec\xa2\x7b\xc8\xff\xa3\xd4\x4d\x6d\xb2\xf5\xbc\x68\x97\x34\x40\x3d\x59\x65\x1b\x41\x5c\x53\x1b\x52\x59\x21\xda\x34\xa8\xaa\x79\xcc\x76\xce\xbe\xab\x21\x32\xbb\xac\xa0\x28\x1c\x0a\x95\x90\x8a\xd2\x75\xdc\x79\x6e\xa9\xfe\xc4\xc5\x51\xb6\x49\x9e\x29\xd5\x43\x15\x25\x01\xe9\x55\x77\xdb\x0c\x22\xea\xa6\xff\x5d\x5a\xbc\x0b\x22\xc4\xdc\xe8\xd7\xaf\xd9\x79\xb4\x5b\x52\x80\xb7\xed\x68\xf2\x8a\xf2\xe8\xce\x9d\xdf\x5a\x53\x7b\xc8\x7c\x21\xed\xa8\x2b\x1e\xfa\x3d\x85\x82\x42\xbc\x19\x92\x5d\x14\xb0\x83\x54\xaf\x97\xc2\xd9\xb7\x76\x85\xa1\x4d\xe0\x96\x50\xbc\x80\x73\xee\x1e\xfd\x78\x5f\x39\xf7\x12\xa2\xaa\xee\x06\x5c\xe4\x4b\xc3\x8c\xc0\x6e\x84\xd9\xde\xc1\x7f\x43\xbf\x60\xb4\xfc\x13\x12\xdd\x54\x15\x0a\x50\x94\xfa\x11\xda\x98\xfd\x00\xbc\xb3\x1c\xb3\xc4\xfd\x09\xb3\x81\x2b\x53\xd7\x14\xc4\xa1\x21\x4f\x48\x42\xc3\x59\x11\x7a\xbc\xad\xd5\x53\x33\x28\x57\x8b\x9c\x04\x49\xcc\x04\x8b\x1e\x9f\xad\x62\x5b\x39\xec\xac\xa8\x79\xfa\x90\x26\xbb\xbe\x63\xa0\x9e\x33\x30\xa9\x52\x01\xbd\x0d\xf5\x98\xdb\xfb\xa3\x24\xbc\x8a\x05\x88\x48\x10\x05\xea\x50\x40\x93\xbd\xd4\x77\xa6\x81\x6d\xb9\x0a\x7e\x51\xde\x84\xaf\x2a\xf7\x19\x5a\x5a\x11\xa7\x10\x51\x8d\x6f\x72\x43\x76\x52\x0e\xe2\x2f\x50\x68\xec\xda\xbb\xa9\xab\xbb\x3a\x5b\xa3\x42\x0e\x72\x2a\xb9\x17\xfc\x28\xab\x47\xf4\xdb\xb2\x52\x2f\xc1\x1c\x86\x6a\xc3\xbc\xbc\x83\x85\x57\xb1\x38\x2f\xce\x1d\xcb\xbb\x3d\x1a\xaf\x35\x0a\x23\x29\x25\x07\xb1\xad\xa4\x6b\x49\xf1\xe8\xa6\x52\x4b\x53\xc2\xd6\xa4\x57\x84\x5a\x22\x90\x54\xfb\x81\x7f\xaa\xdc\x9c\xd4\xc6\x3b\x16\x24\x30\xa7\x67\xf8\x1d\xf1\x16\xac\xe3\x2d\xa0\xb0\xaa\xd2\x0b\x24\x5f\xd2\x75\x0b\x85\xce\xab\x8e\xc7\xb3\x6f\x3e\x95\x38\xca\xb0\xd4\x13\x3f\x4b\x01\x06\x80\x35\xc4\xe2\x38\xfb\x9f\xa5\xa3\x67\x71\x8c\xff\xae\xce\x9a\x1c\xfa\xba\x02\x21\x8c\x95\x61\x17\xd6\xf9\x37\x77\x39\xad\x3b\x01\xf5\xca\x88\x4a\xbf\x16\x22\x2b\x8f\x46\xdf\xb9\x25\xba\xab\xb6\x01\x89\xae\x5a\x0b\xb9\xb9\x37\x3b\xd8\x57\x89\x5f\x64\x62\x61\xe1\x8a\xf1\x6b\x0e\x9c\x19\xd7\x8e\x22\x2f\x7f\xa8\x8c\xd7\x48\x80\xd8\xf8\x9e\xf8\xc6\xb2\xc8\xb7\x8f\xdc\x55\xe8\x49\x01\x5f\x41\x07\x83\x6c\xb5\x80\x5c\x22\x4e\xba\x36\xa8\x08\x74\x6f\xfa\xde\x83\xd1\x2d\x2a\x1c\xc6\x65\xee\x49\x52\xf8\xb6\x41\x3f\xdd\x35\x20\x2f\xf0\x12\x4b\xf5\x80\xe2\x08\xd0\x46\x4b\xc0\xec\x35\xaf\x66\x70\xef\xa0\x25\x06\x01\x81\x04\xec\xf4\xf2\x85\xe3\x6d\x4d\x05\xef\x6e\x0e\x59\x8e\xba\xbc\x93\x8b\x1e\x23\x50\x8f\x95\x73\xf9\x37\xf6\x83\x3e\x3c\x39\x12\xbe\x88\xec\x05\x5c\x35\x87\xa7\x47\x54\xf4\x88\x6b\x3e\x1c\xe0\x14\xcc\xb9\x03\x0d\x3d\x18\x7d\xe4\x4f\x8d\x68\xdc\x90\xc1\x4d\x20\x4d\x89\x8b\x8e\x16\xa5\x78\x5d\xaa\xd4\xa0\xb0\x55\x12\x2a\x10\x45\x5a\xf7\x95\x15\xe2\xda\xb0\x6d\x39\xd2\x02\xeb\x86\xb7\x0d\x4c\x91\x21\x83\x43\x05\x4c\x4f\x88\x57\x32\xc4\x37\xe4\xe7\xfc\x59\x07\xc7\x0b\x37\x86\x11\xc9\xf4\x6f\x95\xdb\x10\x00\x21\xe0\x85\x3b\x0f\x4c\x41\x01\x97\x4d\x66\x51\xc8\x2a\x34\x2e\x07\x62\xea\x50\x58\x51\xc1\x21\x85\xf8\xe9\x47\xbf\x96\xe0\xb4\x26\xe3\x05\xed\x08\xaa\x07\x22\x0b\x23\xf1\x4b\x8f\x02\xc5\xf3\xc2\x40\x01\x5b\x83\x65\xb8\xe0\xab\x91\x36\xa6\xe7\x17\xaf\xcd\x0a\xa8\x63\xa9\x6c\xd3\x3f\x93\x2e\xb9\x57\xba\x36\x9b\x6d\xe3\x2b\xd9\x2f\x73\x02\xf8\x00\xbb\x84\x38\x65\xd1\x7c\x82\xd8\x94\xbb\x6f\x20\x30\x9b\x95\x4d\xb1\xc3\x31\xe0\xd4\x2b\xc0\x18\x6c\xaa\xbf\x19\xb8\x21\xe0\x24\x7c\xa8\x72\x0c\xe8\x2d\xdd\xe2\xaf\x3d\xa5\xc8\x26\x2b\xdd\x11\x13\x91\xa9\xc7\x17\x11\xf4\x42\xca\xc2\x2b\xaa\x49\x88\xeb\x23\x01\xe7\xb2\x85\x22\x0f\xac\x5e\xa5\x52\xdb\xaa\x5e\x73\xd0\xdd\xf7\xa2\x44\x59\xff\x4d\x9d\x9b\xc6\xcd\xa6\xf5\xb0\x53\xb8\x18\x30\x63\xe0\x16\x01\xcc\x9e\xaf\xe9\x75\x77\x4f\x0b\x25\x4a\x6d\xe0\x80\x0e\xf3\x8e\x42\x46\x8b\x17\xde\x2b\x5a\x4b\x5b\x4e\x8e\x0b\xd9\xca\x0c\x4c\xd4\x54\xa9\xaf\xce\x08\x74\xb6\x5a\xb0\x0f\x42\x19\x10\x98\x3a\xc2\xbe\x80\x4a\xfe\x07\x06\x98\xc6\xe6\xe6\xf5\xed\x1e\x63\x21\xa1\x0d\xfa\x98\xd9\x60\x32\xb8\x76\x6e\x1b\x2f\x54\x01\x57\xa9\xcf\xe4\x51\x84\xc8\x73\x38\xbc\xdc\x36\xe3\x0d\x28\x8c\x32\xdf\xfc\x34\x32\xfb\x5c\x5f\xfe\xba\xcd\x1b\x23\xaa\x2d\x7c\xb1\xad\xef\x55\x55\x9a\x8f\x08\xee\xab\x0d\x82\xa0\xb3\xa5\xce\x1b\x45\x92\x1e\xc4\x05\x59\x95\xaf\x1a\xed\xd3\xf7\x38\x43\x3e\x37\x84\x3e\x01\xdc\x14\xd9\x1a\x12\xc5\x79\x19\xbd\x84\x6b\xe8\x53\x34\xd1\x11\x46\xe5\xe7\x5f\x70\xd9\xb4\x08\x83\x21\xee\x13\x4d\x10\xbe\x88\x76\xb4\x9a\x17\x5b\xbc\xf4\x31\x18\x4f\xb9\x36\xb7\x1c\x60\x35\xe3\x89\x35\x37\xcd\xa3\x31\x24\x47\xb9\x23\x12\xc6\x6c\xb9\x24\xb3\xd0\xdf\x61\x98\x66\x43\x51\x5e\x20\x0b\x81\x6b\xe2\x2a\x2f\x7f\x10\xe0\x49\x5e\x75\x99\xb8\xb2\x29\x1d\xed\x5d\x24\x77\x9f\xf9\xbf\x82\xd2\x10\x19\xd4\x18\xfe\x95\x6f\x88\x6f\xb2\x72\x09\xa0\x83\x32\x2b\xaa\xbb\x6a\x0b\xb3\x5d\x6f\x4b\x20\x25\xcf\xda\x4b\x89\x45\x95\x19\x80\x4e\xbf\x96\x30\x46\xc6\x96\x6e\x49\x1b\x11\x2e\x0d\x65\x83\x47\xe0\xae\x55\x90\x98\xf5\x85\x35\xa2\x12\xc4\x2c\xa1\xd6\x23\xd1\x99\x5e\x9a\x3a\x7f\x40\x2a\x5e\xef\x82\xe1\x31\xa7\xa2\xc6\xc7\xbb\xa5\x77\x29\xeb\xc6\x1d\x71\x16\xf0\xe1\x98\x31\x4e\x95\xfa\x84\x6e\x9f\x77\x41\xdd\xb4\xba\x0d\x28\x66\x35\x11\x03\xf6\xcc\x2b\xe0\x80\x08\x0b\x66\x99\x23\x7a\xdd\xd7\xdd\x83\x4a\x5f\xb5\xae\x64\xca\xc1\xf9\x60\x80\x2d\x20\x0f\x14\x1d\xc7\xa5\x79\x30\x45\xb5\x01\x35\x50\x7a\x0a\x6b\x97\x84\x2d\xa7\xbf\x41\xe6\x8d\x80\xbb\x64\x76\x65\x3f\x4c\x24\x6c\xb1\x86\x1b\x9f\x5e\xab\xe8\x6d\x6e\x65\x36\x90\x2b\xf2\x73\xb6\x2d\xd9\x60\x85\x6d\x8d\x4b\x8f\x30\x83\x91\x4d\x4e\xa1\xd2\xa5\xd9\xd4\x6c\x0b\x82\xe7\xa7\x3c\x2f\x8b\xff\x24\x49\xd3\x20\xe3\x86\x38\x01\xf0\x2a\x00\x15\xe8\xd8\x0c\x45\x08\x93\x59\x5b\x53\x3c\xf8\x33\xe5\xe9\x13\x0a\x97\x79\x28\x60\xc5\xe8\x83\x18\x40\xd9\x09\xe5\x9b\x46\xae\x9f\x30\x07\xe0\x0c\x7e\xbc\xcf\x0b\xd2\xbc\xaa\x1f\xbc\x4d\xc5\x2e\x33\x44\x98\x01\xf5\x56\xad\x90\xff\x40\x3e\x4f\x38\x3a\xf1\x63\xe9\xd8\x02\xb7\x7c\x51\xd5\x9b\xaa\xce\x3c\xe1\x81\x59\xa7\xea\xf0\x1b\x1d\x47\xa0\x60\xe1\x0e\x0c\xb0\x09\x2b\x9d\x2d\xee\x73\xf3\x40\x29\xd2\x8c\x15\x30\x2c\xdb\x9a\xee\x09\xf7\x26\x73\xee\x07\x32\x70\xa9\xf9\xb6\x09\x67\x1b\x7e\x79\x49\x0b\xbe\xe7\xbb\x50\xfe\x8e\xa5\x26\x0c\x39\xe1\xf9\x50\x34\xe8\xe9\x11\xc0\xbc\xee\xab\x8d\x11\xe7\x5f\x4e\x56\x48\xe1\x0e\x6c\xe7\xdf\x66\xb6\x01\x11\x31\x18\x73\xa6\x79\x89\x07\x81\x0e\xe0\x8d\x33\x96\xec\x1e\xd5\xf8\x55\xe0\x2f\x4e\xe2\x7a\x41\xd0\x6f\x13\x25\xb3\x0a\x29\xb3\x52\x7d\x93\xed\x50\x38\x09\x6a\xf1\x4a\x51\x5c\xe8\xaf\x9e\x45\x38\x88\x33\x7d\x00\x10\x1c\x29\x48\xca\x07\xc9\x01\xc2\x6c\xe8\x13\xd0\xd3\x2d\x2b\x2b\xf3\x47\x10\xf4\x06\x79\xf7\x3a\x90\x5e\x81\x47\x0c\x27\x55\x90\x84\x88\x1c\x2b\xb7\xa6\x30\x8d\xde\x40\x51\x6b\x59\xec\xe0\x84\x73\xcb\xe6\x0e\xbd\xae\xb6\x77\x91\x2a\x75\xed\x53\x73\x78\xcb\x45\x85\x10\xfe\x16\x20\xd0\xc0\x5e\xcb\xa1\x97\x67\x49\xd7\x59\x48\x60\x73\x9e\x93\xa2\x2e\xee\x5a\x76\x93\x35\x9c\x7c\x9d\x02\xad\xee\xf9\xf8\xfa\x62\x34\x1b\x8d\xaf\xa7\xc0\x93\x7b\x3e\xbe\xf9\x3e\xba\xfe\x9c\xe8\x8b\xd1\x74\x36\x19\x7d\xba\x05\x72\x59\xf7\xc1\xaf\xe3\x8b\xd1\xe5\xe8\x7c\xe0\x7e\xa1\xd4\x31\x59\x1c\xfc\xca\x81\x47\x4d\x08\x93\x02\x12\xbc\x7c\x14\x72\x8f\xd0\xa2\x09\x9c\x62\x8a\x92\x3e\x54\xb9\x30\x67\x45\xd7\x16\xf7\xb1\x2f\x30\x17\xd8\x39\x02\x40\x65\x3b\xbc\x54\x15\x21\x68\x64\xe6\x6b\x7f\x1d\xe9\x53\xc7\x8e\x3a\xc4\xca\xc8\x0c\x68\x97\x0e\x64\x22\xf0\xe0\x88\xf2\xf7\x64\x4b\xe0\xdd\xb6\x5c\x22\xc8\xd3\xed\xc5\x83\x5d\xb5\x3d\x70\xae\x90\x3e\xf0\x8b\x8f\xa9\xf9\x58\x38\x1c\x03\x97\x7e\x6c\xc2\x06\x25\xdf\x6a\x99\x35\xce\x30\x70\xe6\x8b\x59\x2a\x5b\x69\x84\x5f\x22\x18\xe3\xc1\x94\x58\x2b\xc1\x17\x2d\x5a\x0e\xdd\x4b\xdb\xea\x43\x1c\x6d\x77\x18\x3a\x53\x21\x9c\xe2\xd1\x1b\xe1\x75\x20\x3e\x0b\xe5\xc6\xe1\xde\xe6\x7d\x7d\x40\xc3\x75\xe0\x2e\xb2\xa2\x7a\x4c\x84\x88\xb3\x2f\xbc\xea\xcc\x74\x55\x23\x15\x17\x43\x81\x2d\x22\x81\x7b\xa7\x87\x0f\x8d\x54\x0f\x7a\x76\x31\x4f\x57\x4c\x6b\xa6\x64\xf4\x91\x15\xf8\x82\x49\xf1\x18\xea\x61\xc3\x6a\x2a\xb2\xc7\x0f\x3e\xb5\x0c\x2a\xc2\xce\xc6\x40\xe8\x1e\xad\xc9\xa0\x41\x14\x9e\x2c\x45\x42\xf3\xc6\x83\x7b\x7d\xac\x9b\x05\xc4\x63\x06\x15\x9a\x4c\x1f\x1e\x5a\x6a\xdb\xd4\x99\x6b\xc7\xaa\xaa\x1f\xb3\x7a\x09\x08\x2f\x18\x43\x8a\x68\x12\x12\x27\xd5\x87\x5f\x40\xe4\x08\x82\x10\x89\x7f\x82\x3b\x1b\x83\xc4\xe4\xb2\x07\xb1\xe8\xb9\x4a\x4c\xbd\xd6\x07\xb2\x39\x07\xe9\x91\x52\xcc\xa1\xe6\x0e\xb5\x03\x3a\x6a\xa0\xef\x81\x49\x2d\x22\x4e\x8b\x39\xd5\xf6\x31\xa9\x21\x79\x05\xd2\x8e\x09\x03\xd6\x07\x66\x64\x6c\x91\x76\x02\x05\x95\xe4\x5f\x28\xda\xac\xd6\xd5\x72\x5b\x00\xe1\x86\x3f\x25\x12\xbd\x29\xb6\x08\xb8\x17\x04\xf7\x20\x38\xb3\xca\x20\x87\xcf\xd4\x66\xcc\x56\xe9\x3e\x0f\xeb\x03\xab\x8d\xac\x44\x26\x01\x59\x1a\x06\x6d\x32\x7f\xff\x40\x79\x47\x51\x44\x24\x8a\x22\xac\xe1\x2c\x3c\x0c\xe3\x09\x70\xd0\xcb\x6e\x33\xcd\xd8\x13\x3a\xc5\x55\x0b\x7a\xf2\x11\xa3\x08\x10\x39\xdd\x36\x36\x5f\x22\xab\x88\x5d\x54\x1b\x83\x57\x52\x86\x18\x1f\xb2\xd9\x85\x67\x11\x6c\x57\x5e\xac\x39\xab\xcc\xb2\xb5\x47\x64\x56\xdb\x66\xb3\x6d\x04\x1a\x33\x93\xf1\x01\x6e\x18\x42\x0e\x57\x0c\xdf\x6b\x58\xa9\x83\xc0\xcf\xbc\x56\xfa\x76\xa6\x3e\x8c\x85\xb7\x54\x13\x2b\xa1\xf8\xf6\x81\xf3\x50\x55\x05\x4c\xf7\x63\x9d\x37\x78\x76\x1f\x81\xa4\x1f\x0f\x2d\xee\xce\x7a\xeb\x66\xd6\x3d\xd3\x2a\x80\xaf\x11\x5e\x8d\x9f\x05\x85\xfa\xa0\x01\xc0\x7f\xe1\x3e\xc5\xf7\xbb\xfc\x3c\x90\xfe\x79\xec\xc1\x8b\xf3\x57\xfe\x21\xaf\x6c\x7b\x59\x2b\x58\xbc\x99\x8d\xa2\xe9\x79\xe3\xf9\x28\x59\x11\x3d\x26\x22\xd8\x21\xef\x87\xdd\xe4\x8b\x6d\xb5\x05\x49\xa6\x72\x89\xe2\x90\x9b\x3a\x47\x31\x5d\x06\x93\x55\xcc\xd5\x8b\xad\xd5\xe2\x53\x3d\x3a\x06\xd8\x9b\x1e\x18\xfb\x47\xfd\xc3\x98\x8d\xdb\x35\x6e\x3d\xf1\x0e\xf4\xd5\xcb\x5e\x9a\xbf\x03\x4c\xc5\xc4\x0b\xcc\xa8\xe0\x53\x72\x7d\x0b\x8f\xee\x90\x12\xf4\xd1\x81\x40\x4d\x2d\x8a\x85\xcb\xb3\x3b\x95\x15\xcd\x71\xe5\x32\xce\xea\xfd\xce\xe6\x0b\xc0\x60\x20\xda\x9e\xf8\xd8\x6a\xdc\x0c\x18\x9f\x24\xf8\x16\xd8\x00\x19\xa5\x08\xb0\x5a\x9e\x62\x9f\x3e\x5a\x18\xa2\x90\x10\x78\xfa\x8d\xb3\x63\x70\x78\xad\x4c\x4b\x20\x9f\xa2\x9c\xf0\x3c\xec\x53\xdd\xbf\x32\xf8\x06\x8a\x6f\x0a\x05\x01\x2e\x8e\x68\x3d\xb1\x81\x58\x2b\xbf\xbb\x20\x05\x74\xcb\x53\x73\xd5\xf2\x76\x8b\xac\x1b\x0f\x68\x64\x28\x7d\x77\xdd\x81\x6d\xb3\x36\x06\x16\x01\x55\x70\x45\xc2\x72\x1f\x18\x61\x97\xa1\x83\xe0\xc3\xa6\x78\x55\x00\x33\x49\x63\x4d\xb1\x02\x40\x54\xe7\xe2\x4f\x95\x62\xa6\x0f\x10\xeb\x66\xd6\x48\x8a\xcc\xfb\xa7\x01\xa3\x64\x5d\xa3\xdb\x9c\x97\xa2\xde\x1f\xdc\x47\x2e\xcf\x82\xe4\x10\x4e\xd2\x52\x3c\x86\x03\x03\x40\x68\x17\x60\xfd\xe5\x9d\x9b\xc0\x45\xef\xfb\x1f\xef\xab\xc2\x44\x37\x1a\xda\x54\x32\xb4\x57\xfa\xf2\x79\xa0\xa9\x29\x54\xa0\x48\xcb\x9f\x00\x9a\x09\x7d\xcb\x23\xc4\x65\xad\xb2\x05\xd7\x7e\xc3\xe7\x7d\xb7\x79\xbd\x08\x13\xca\x9b\x63\x68\x6c\x60\xcc\xa4\x5a\x29\x30\x03\xb1\x8d\x20\x28\x4e\xa1\x6b\x3c\x03\xda\xd6\x5e\xeb\xd4\xe3\xf7\x27\xc4\xc0\x06\x37\x56\x86\x9a\xb3\xf5\x1d\xa4\xe0\x39\xe4\xfd\xc8\xc5\x6b\xa1\xcd\xce\xc8\x78\xa8\x7e\xb8\xfb\x03\xd0\x5a\x3b\x59\x85\xaf\x32\xa8\x7a\xd0\xab\xcc\xd9\x3c\x66\xb5\xaa\x6a\xd4\xc1\x2f\x7d\xf6\x27\xe1\x6e\x13\x94\x3b\x6e\xb1\xa7\x58\x81\x5e\xed\xd0\xdb\x96\x63\x40\x45\x4b\x51\x9b\x6c\xe3\xbc\x52\xe7\xf5\x23\x79\xbd\xa8\x3f\xb2\x70\x05\x98\x07\x53\x2b\x49\x2a\xc7\xe5\x4d\xa8\xc1\x67\xc1\xf6\xc8\xcb\xbb\xd5\xb6\x48\x95\x3a\x8c\x12\x69\x62\x0a\x10\x7d\x16\xfc\x2f\xaa\xe3\xd0\xf6\xaf\x5b\xc8\xfd\x56\x15\x65\x60\x32\x7e\x81\xe2\x2b\x0b\x0b\xa6\x9c\xff\x67\x8a\xe2\x35\x21\xb1\xfa\x24\x29\xc5\x60\xc0\x15\x0f\x70\x6f\x93\x20\x97\x1b\x71\x0b\x2e\x99\x43\xc2\x86\xd8\xb5\xf8\xde\x6b\xbf\x22\x3a\x03\xe7\x39\xf4\x31\x29\x42\x7f\x56\x1c\xf1\xc6\x63\x31\x2b\x3e\xb0\xdc\xf3\x13\x53\x43\x19\xdf\xa8\xf7\xad\x27\xe2\xbc\xf4\x8d\x92\xb3\x38\x39\x5d\x2a\x38\x65\x22\x55\xbf\xf8\x6c\x81\x51\x85\x6d\x0a\xe9\x1b\x28\xd3\xc8\x57\x50\x09\xa4\xac\x91\x41\x0c\xa0\x6f\x76\xdf\x20\xe3\x8a\x3c\xf4\x10\x86\x8a\xcf\x55\xe7\x09\x8b\x3a\xdb\x9d\x12\xb2\x79\x72\x7e\x20\x56\xcb\x51\x63\xf4\xe2\x29\x92\x83\x51\x2b\xda\x0e\x31\x17\x11\x0b\x17\x11\xe5\x10\xd6\xa2\xc8\x6e\x56\xa0\x92\x4f\xcd\x7f\xe4\xfd\x14\xa3\xb3\xd7\x3a\xb3\x2a\x7e\x75\xaa\x3f\x6d\x9b\x7d\x9f\xc7\x98\xb8\x7f\x6a\x44\x9a\x0a\x23\xa8\xd0\xef\xca\xed\xd3\xd7\x4e\xd3\x62\xc8\xf4\xe7\x23\x1c\x96\xb4\x66\x54\x55\xee\x3f\xf4\x12\xc4\x5f\x88\xb4\x21\x06\x7b\x18\xa5\x81\x7e\xb2\xc5\xf2\x85\x25\xe7\x50\xa9\xb8\x10\x5e\xc3\x61\x5e\x8c\x4d\x83\xb1\xe3\x7e\x81\xcc\x1a\xd0\x2d\x0c\x70\x41\xed\xba\x33\x69\xee\x2b\xfd\xe8\xae\x71\x05\x29\xf1\xd9\xfd\xd6\x26\x02\x41\xd4\xdc\x13\x46\x26\x14\xe7\xd1\x38\xc1\x7e\x86\x62\xe2\x90\xf4\x07\x4b\xd7\xa2\xc9\xa0\x02\x43\x1f\xba\xae\x24\x86\xe4\x37\xf6\x1c\x4c\x81\x8f\x14\x62\x49\xe4\xab\xd0\xa1\x24\x52\x68\xe4\xe3\xf1\x15\x02\xec\x75\xf4\x0d\xb6\x8c\x82\xd7\x3e\x42\xf0\xc0\xcb\x0f\x66\x4d\xc5\xb3\x96\x2a\x35\x0a\xb4\xf0\x89\x5e\x03\xe0\xf5\xee\xce\x8d\x92\x27\x91\x22\x9f\x12\xfa\x01\xe5\x19\x7d\x66\x7b\xdb\x16\x03\x1a\x6c\x41\xc9\xd4\xfb\x2d\xac\xf6\xd7\x0f\x55\xb1\x5d\x53\xd5\x88\x6d\xaa\x3a\xbb\x03\x99\xf9\xa8\x7f\x68\xfd\x86\x53\x05\xcb\x77\x20\x88\x15\x5a\x17\x2e\x55\x70\x7a\x3a\x64\x77\x4a\x9d\x05\x83\xac\xda\x08\x3d\xcd\x0e\x64\x5a\x26\xd5\xf6\x05\x77\x9c\xab\x67\xb2\x65\xc7\x3a\x85\x9b\x18\xcb\x30\x24\xa8\x9a\xc7\x5c\xcf\x2a\x84\xa5\xe4\x36\xa0\x10\x14\xf1\x01\xbd\xd8\x9a\x4e\x62\x1c\x82\xf8\x8c\x1b\xbc\x67\x1b\x9f\x04\xd8\x5a\xa2\x65\x47\xaa\x96\x1d\x72\x08\x46\x48\x69\x1e\x03\xb9\x3a\x3a\xad\x4f\xc0\xde\xf6\x0f\x19\x5c\x77\xa0\x65\x16\x59\x04\xee\x58\x45\x8e\x18\x62\x2e\xe7\x87\x73\xcb\x18\x3b\x94\xdb\xfb\xf4\x48\x5f\x60\x91\x1e\x92\x4e\x7b\x18\x17\x23\xe1\x4a\xb2\x43\x69\x0c\x53\xa5\xc6\x50\x4e\xe6\xba\xc5\x9f\x21\x19\x0f\xb8\xa2\xc3\x4c\xf1\xde\xcf\xeb\xda\x40\x0b\x38\x8e\x4a\x19\xeb\xcd\x8e\xea\xf9\x5e\xd4\xd9\x28\x82\x09\xf5\xe5\xbe\x44\x05\x0d\x7f\x38\xef\x5b\x81\x26\x6a\x18\xdd\x3e\xf4\x56\x86\xcb\x91\x1f\x92\x43\x14\x62\xb5\x2d\xc2\x91\xce\xb9\x76\x58\x6f\x52\xb5\x12\x71\x58\xd1\x02\x54\x18\x2a\x8a\xcd\x3d\x2f\x56\x1b\x6c\xef\xb7\x4f\xfb\xb7\xed\xcd\x2e\x62\x5b\x75\x9c\x91\x53\xee\xee\x6f\x91\x10\x1c\xb9\xb1\x27\xa0\x0d\x63\xc5\x44\x9e\x6f\xd5\xcf\xdd\x17\x08\x3f\x4f\xa0\x39\x44\x36\xd0\xe7\x9b\x2c\x10\x60\xe0\x0c\x8f\x10\x36\xf7\x2e\x37\x54\x6c\xdb\x4d\x05\x34\xcc\x6a\x9d\x2d\xee\xf3\xd2\xbc\xae\x4d\xb6\x84\xd7\x8b\x70\x12\xa7\xce\xd9\xe8\x79\x3a\x28\xbc\xaf\x81\x70\xce\xd1\x19\xb6\xd8\xda\xa6\x5a\x67\x75\x0e\x59\x56\x4a\xc4\x07\xcc\x64\xd9\x60\xbd\x3d\xf8\x1f\xa3\x55\xe7\x98\x97\x83\xc6\xeb\x78\xbe\x0b\x72\x11\xd9\x62\xe1\x6e\x37\x5e\x0c\x44\xf4\x12\xb2\xf1\x0a\x02\xe4\xb4\xf9\xfc\xb7\x02\xdd\x6a\xfb\x01\x9d\xf0\x1a\x1b\x46\xce\x6e\xc0\x87\x69\x9b\x35\xb9\x5d\x51\x5e\x4e\x1a\x69\xad\xe2\x9c\xd6\xb3\xa8\x0e\xb9\xb9\xaf\xb6\x77\xf7\x2d\x07\x29\x04\xbb\xd6\x1b\x03\xe1\xf3\x9e\x06\x85\x38\x00\x6e\xca\x30\x34\x40\x61\xa1\x07\xf1\x22\xf7\xc9\x82\xb2\x6a\xe5\x8c\x5b\x0e\x77\x64\xd8\xcc\xb7\x8d\xca\x6d\x04\xb5\xc4\x3b\x9d\x5f\xcb\xbb\x60\xbe\xd3\x73\x03\x28\x2f\x88\x09\xba\xeb\xae\x8e\x42\xeb\xce\x8f\x77\x87\x10\xa6\x03\xfa\x93\x48\x57\x3e\x89\x34\xc5\xf8\x1a\x26\xb9\x73\xb7\xed\x2b\x66\x40\x22\x6a\xc2\xac\x13\xa6\x6e\xb7\x9d\x9c\x5b\x74\x0b\xf4\x2a\x2b\x0a\xeb\x83\x83\xf2\x9e\x54\x2d\xe7\xd3\x27\x7c\x0b\x0f\x2f\x78\xaa\xb1\xdd\xb1\x20\x69\x30\x9d\x95\x4a\x6c\x6b\x3e\x6a\xfa\x52\xf6\xfe\x2c\xe1\x14\xb7\x88\xdb\x06\x3d\xa9\xf8\xc3\x47\x49\x94\xa3\x7a\x49\x5a\x2e\xb4\x46\x21\x26\x84\xc6\x26\x4a\x8d\xc9\x22\x4b\x3e\xb2\xde\x43\x30\xc1\x90\x75\x0e\x9b\x36\x26\x84\x67\x71\x88\x28\xeb\x01\x40\xe0\x67\x06\x0f\x7e\xe3\x65\xab\x69\xc3\x8a\x94\x2d\x46\x2f\x72\x1b\x1d\xec\x91\xdd\x2d\xcf\x04\x8e\x76\x3d\x12\xeb\x23\xc6\x56\x5a\x0b\xa5\x35\x8e\x72\x1f\x76\x36\x3c\x2e\x36\x19\x57\x25\x30\x7d\xbd\x75\x7f\x54\xc6\x03\xb1\xb5\xdb\x21\x10\x5e\x2a\x1b\xf6\x09\x31\x23\x82\x6e\x93\xd8\x0b\xd5\xb6\x89\xbb\x01\x20\x55\xe5\xbf\x91\x5b\x0e\x0d\x85\x2b\x09\x75\xc8\xef\x6b\x63\xef\xab\x62\x19\xd0\x7a\x18\xd8\xa0\xe6\x10\x7a\x1a\xf2\xc7\x00\x0d\x47\xdf\x19\x8b\xcf\xf1\x44\xc5\xc0\x75\x29\x71\x9e\x38\x07\x10\xb7\x2e\xb7\x6b\x53\x43\x98\xd0\xb9\x50\x6b\xd3\x98\xda\xf9\x62\x59\xe3\x8c\xd3\x7a\xbb\x68\xb6\xb5\xd1\x45\xb6\x73\xdb\x08\x6e\x70\x3c\x2f\xab\x9a\x42\x09\x76\xed\x2e\xfb\x75\xb6\xa8\x2b\x2b\x7e\x91\x97\x45\x5e\xca\x7c\xd9\xa1\xf3\x07\x0a\xe4\xc3\xae\xb5\xf3\x48\x54\x5e\xea\xc2\x94\x77\x0d\x02\xab\x29\x96\x22\x82\xdf\xb2\xc1\x20\xde\x22\xc3\xf3\x91\x67\xe3\x85\xac\xd0\xa0\x01\x64\x4d\xb1\xeb\xae\x83\x54\x1f\x06\xda\x5a\x1b\x67\xae\x9c\xc1\x01\x2f\xc4\xc8\x34\x64\x4e\x78\x1f\xb6\x37\x2d\x24\xfa\xd1\x81\x77\x87\x4c\xeb\xb6\x7f\xef\x1c\xf8\x71\xe0\xfa\x90\x4b\xe3\xe9\xd3\x20\x94\xc5\xb6\x18\x4a\xf7\xae\xf8\x27\x42\x99\xef\x53\x3d\x28\x77\x72\x83\xaa\xa8\xc3\x3e\x14\x50\xd8\xaa\xb7\x1b\x01\xfe\x4c\x58\x3e\x9f\x70\xc1\x95\xad\x3c\xb9\x53\xe7\x3c\xc4\xc5\x9c\x2a\xe5\x1a\x81\xec\x2f\xac\xcd\xc9\x11\x0c\x6f\x3a\x50\xc0\x75\xe7\x99\x42\x89\x5c\x97\x74\xd4\x00\x6c\x4c\x47\x8a\x7a\xe9\x79\x8c\xa8\xc7\xe5\x76\xe1\xb3\x2f\xa2\xeb\x7b\x4e\xd7\x1e\x99\x65\x1e\xa2\x16\x3d\xf0\x6e\x3f\x3d\x70\x98\x09\xc2\xdc\xf4\xa9\x8c\xf9\xac\x20\x18\x69\x60\x1f\x99\xfa\x95\x05\x96\xcf\xad\xc5\x42\x17\x34\xc9\x9d\xbf\x7f\x97\x97\x26\x48\x63\x2d\xcd\x7c\x7b\x07\xb8\xb6\x6e\x80\x9b\x33\x02\x1e\x93\xde\x8e\x10\xe3\x40\x85\xac\x48\x14\xd3\x6d\xe5\x89\x54\x6e\xbd\x64\x72\xde\xe8\x48\x6e\xf9\x4a\x00\xb9\xa9\xca\x85\xc8\xe7\xfb\x6f\x95\xd0\x2c\x0a\x8f\xed\xe3\x3d\x1f\x89\x06\x2d\xb7\x68\xaa\xc1\xfa\x45\x66\x31\x50\xd7\xb1\x7d\xc4\xb7\xbb\xc0\xfd\x1d\xea\x62\x3b\x59\x1e\x1e\x73\xdf\xfe\x75\x55\xde\xb9\x0d\xb6\x86\x1a\xd0\x47\x53\x14\x4c\x2b\xca\x28\x19\x92\x6c\x22\xef\x1b\x70\x4e\x2c\xf9\xd9\xd7\x03\x42\x72\xfb\xe6\x2c\x89\x1a\x81\xb3\x05\x58\x97\xf1\x41\xa9\xec\x48\x0f\xbc\xd1\xee\xfb\xfc\x8c\xe9\xae\xf7\x98\xee\x2a\x3a\x18\x42\xd2\x90\x51\xb5\x1c\xe6\xf5\x40\xa7\x47\x53\x07\x41\x6c\xff\x76\x84\x3d\xa8\xfd\xb6\x7f\xbf\xb9\x7f\x04\x79\xac\xee\x39\x17\xd9\x42\xd2\x30\x8c\x36\x5d\xb7\xcb\x9d\x4e\x3e\xb5\xf7\x61\xe2\xe4\xf1\x48\xe8\x81\xc8\xee\x96\xb4\xd1\x6e\x0a\xa1\x06\x47\x00\xf1\xe5\x7a\x86\x9b\x88\x6b\x1c\xe4\x31\xe2\x43\xae\xa2\x57\xe1\x54\x51\x7d\xc9\x8a\x54\x1f\x62\x51\x5d\xd0\x89\x8f\x1b\x02\x21\x39\x9e\x94\x46\x08\x10\x2a\xa4\x24\x63\xe9\x5a\x4a\xde\xe4\xed\x28\x14\xa1\xde\x99\xda\xc4\xf9\x58\x82\xda\x93\x6b\x2c\xf0\x0e\x91\xe1\x6a\x42\xfa\x45\x6d\x16\xaf\x73\x17\xd8\x7c\xff\x02\xcd\x7c\x80\x8f\x08\x94\x81\xa5\x0e\x53\x81\x8d\x2e\x4c\x06\x5c\x27\xb5\x31\x7a\x67\xb2\xda\x26\xaa\xa9\x42\x8d\x0c\xc4\x5f\x71\x1f\x01\xcb\x2b\xda\x81\x96\x49\x73\x89\x5f\xc4\x07\xf4\xf5\xfb\x2c\xe1\x2b\x02\x6b\x6f\x9e\xe3\xd4\xa7\xe4\x86\xbf\xd5\xa5\xd9\x8a\x39\xae\x1e\x37\x53\x2e\xdc\xdf\xed\x63\x62\xc6\xf4\x69\xdf\x12\x1d\xe4\xd0\xd9\x30\x00\xc0\xa6\xe9\x47\x08\x1e\x89\x79\xb1\x5f\x4d\xed\x23\x45\x7e\xe1\x40\x68\xa9\x70\x5b\x44\xd0\x88\x44\xb4\x06\x56\x8e\x6e\x55\xab\xb8\x4c\x8e\xbf\x6b\xb9\x00\x00\x1f\x9b\x71\x04\x06\x40\x29\xa5\x58\xeb\x89\x74\x76\x63\x94\xcb\x93\xe6\x3e\x84\xfb\xf8\x54\x06\xac\x91\xb3\x2d\x81\xef\xa3\x85\xc6\x87\x82\x34\x0a\x10\xb0\xd8\x1a\x1f\xbc\xc2\x8f\x81\xe1\xcf\x1b\x01\xad\x86\x23\x9b\x91\x7a\xde\xd0\x48\x3a\xa6\xbd\x3c\xd0\xdc\xbb\x14\x0a\xbd\xf8\xa6\x21\x82\x3e\x04\x88\xea\x35\x98\x91\xf2\x6b\x87\x79\xc9\x28\x26\x7a\x72\x55\xeb\x39\xa2\xea\xdd\x90\x1c\x85\xf3\x6c\x9d\xfd\x05\x02\xd3\xeb\x4d\x55\x22\x05\x24\xed\xc6\x3a\xd1\x3f\x4c\x5d\x1a\x02\xf3\x03\xd7\x77\xd0\xe7\x83\x44\x9d\x3b\x50\xec\xce\x36\x66\xad\x3d\x03\x51\x3c\x0c\xba\xde\x96\xd6\x13\xd3\xfa\x1a\x13\x78\x95\xf7\x25\x16\xbe\xec\x44\xc5\xdf\x76\x9e\x41\x03\xe6\xd6\x7d\xb6\xd9\x98\x52\x80\x58\x65\x38\x03\xeb\x6b\x97\xf9\xa2\x89\xd9\x81\xa2\x62\xc1\x6a\xa5\x30\x22\x29\xea\x4c\xda\x38\x5f\xca\xed\xf8\x21\xcd\xa2\x93\xc5\xf7\x59\x63\x9f\x53\x45\xc1\x80\xf0\x7e\x0c\x8a\x67\xa5\xe5\x00\x2a\xa3\xbf\xe7\x15\x0e\xf7\xda\x67\xb6\x83\x0d\x88\x30\x52\x50\xe7\x90\x2b\x39\x84\xcd\xc2\xcc\xa6\x4a\xfd\x14\x02\x80\x18\xe6\xe1\x64\x26\xa5\x52\x23\xd0\xf2\x53\x98\x1e\x9b\x2f\xcd\xeb\xf9\xee\xb5\xfb\x7f\x94\x06\xb1\x79\x79\x57\x18\x91\x1d\x95\x00\x57\x59\x95\x1b\xbd\x4c\x80\x9f\xf4\x7c\xa7\xba\xbc\x3b\x6d\xb4\x83\xa8\x15\xf0\x68\xb2\xae\x90\x07\x27\xcb\xd4\xde\x33\xb0\xb7\x57\x80\x87\x5a\x89\x1c\x44\xb7\xc5\xce\x64\x0c\xfa\x7f\xbe\xe4\x9d\x72\xce\x9d\xa0\x65\x28\x56\x7d\xac\x9e\x30\x8c\xda\x7d\xe2\x3b\x48\x5a\xb0\x70\x64\x76\x51\xcc\xde\xc8\xd8\x96\xa1\x8a\xc2\xd3\x4d\xef\xe9\x05\x41\x74\x7b\xac\x20\xb5\x87\xf8\x29\x76\x65\x10\xc7\xf1\x79\xbf\xfd\xdd\xdb\x29\x56\x3d\xce\x16\x4d\x50\x6c\xc7\x68\xf2\xb3\xb9\x48\x48\xfa\xfd\xb6\x29\xc8\xbf\x21\x76\xbb\x4a\xaf\x72\xda\x12\x7e\xbb\xb9\x73\x45\x8c\x85\x3c\xc4\xfd\x10\xa6\x4a\xfd\x1c\x2b\x10\x61\xb2\x80\x45\x2e\x83\x7e\x0c\xc6\xcb\xa0\x53\x10\xd1\xe8\x0f\x97\xab\x20\xe4\x46\xac\xae\xc5\xee\x29\xd6\x58\x74\x5b\x59\x45\x46\xe8\x49\x56\xea\xff\x5f\x43\xdc\x38\x3e\x54\x39\xae\x47\x05\xc6\x53\xcc\x4f\x1e\x78\xcb\x65\xd5\x68\x5f\x0b\xfd\xd5\x43\xf1\x5b\xe5\xec\xb8\x98\x61\x1a\x93\x1e\xc8\x8a\x4f\x35\xd7\x70\x73\xb9\x95\xbf\x8f\x38\xbd\xac\x1a\xc5\x45\xec\xb9\xd0\x68\xf4\x0d\x83\xdb\x02\xa2\xc0\x54\xae\xe3\x03\xc8\x08\xd6\xd0\x54\x26\x26\xc9\xbb\x95\xfa\x05\xa7\x93\x63\xcc\x52\x63\xc3\x59\x28\x9b\xa6\x9d\x6a\xcb\x9d\xe7\xe3\x4d\x05\x80\x35\x40\x30\x58\x45\xd7\x6e\x49\x74\x84\x50\x0a\x4a\x94\xe0\xee\x4b\x71\x1d\x6c\x60\x79\x8b\x67\x45\x09\x00\x98\xf3\x21\xdb\x99\x21\x2e\x19\xcf\x78\x6f\x21\xd5\xad\xe0\xcb\x2f\xb2\x47\x2e\xcf\x67\xec\x40\xb7\x37\x11\x4e\x64\xbe\x8b\xcb\xce\xa2\x5a\x4c\xb9\x64\x0f\x09\x95\xb6\x3f\x97\x8b\x3e\x5e\x5e\x2e\x9d\x49\x4d\x0b\x06\x5f\x1f\x58\x7d\x63\x51\x03\x90\xf5\x48\x3c\x6f\xa9\x47\x3e\xbc\xb0\xe0\x03\x5b\xec\x9b\xdf\x46\x71\x8b\xac\xb7\x6b\x2a\x24\xf8\x4f\x8e\x09\x74\x0f\x24\xe8\x08\xb4\x7c\x2a\xa5\xf5\x74\x87\x31\x35\xef\xc9\xa1\xe2\xad\x43\xcb\xde\x42\xfc\x52\xf0\xa6\x37\xb2\x08\x17\xff\x82\x84\xd4\xed\xf2\x68\xb1\x85\x75\x5c\x25\xed\xaf\xd5\x88\xf2\x8b\x91\xef\x2a\x1e\xbd\xf8\xe0\x02\xa1\x0c\xb4\x3a\x59\xfa\x27\x36\x5d\x88\x7c\x5c\x08\xa8\x31\x10\x81\x8f\xc5\x16\x31\xf9\x3d\xe0\xcb\xdb\xfb\x89\x28\x0b\x28\x7d\x8a\x9c\x92\xa8\xd0\x23\x39\xeb\xe3\x8c\x4f\x27\xf5\xac\x4e\x4e\x52\x3d\x5a\x91\x39\xeb\xf9\x55\x17\x9e\x60\x72\x5b\x37\x81\xb5\x1d\x51\xdf\x02\xb8\xd0\x47\x00\x2f\x44\x55\x2a\xea\x3d\x94\x7a\x1e\x62\x65\xee\x3a\x27\x42\x1a\xfe\xae\xb5\x5b\x63\x91\xb5\x98\x57\x23\x24\xe9\x60\x18\x01\x4d\xe1\x16\xd1\x61\x24\x4f\xed\x5a\x45\x02\x20\x81\x03\x54\x92\x1d\x1f\x09\x75\x6e\xb0\xe5\x60\xf7\xb7\x75\x0a\xe5\xf9\x03\x71\x46\xda\xd2\xe6\xb7\x85\x33\xf3\xdc\x7b\xfd\x82\x8a\xbe\xab\x3a\x11\x24\x61\x21\x4a\x0b\x89\xab\x41\x30\x7b\xe7\xcc\xb4\xf5\xb6\x68\x90\xe4\xb4\x40\xa8\xaa\x92\x32\x3e\x3d\x87\x74\xac\x02\xbb\x01\xf2\x7d\xe8\x6e\xf8\x1a\x85\xb2\x33\xab\xe2\x39\xdc\x89\x65\xb9\x67\x0f\x52\x85\xb4\x6e\x53\x55\x64\xaa\xa5\x8f\x8b\xc5\x86\x10\xf9\xc7\x20\xa3\xd4\xcb\x96\x7b\xbc\x9b\xdf\x53\xf3\x1d\xa1\x2e\x2a\xe0\x31\xa8\x3c\xf6\x9a\xd0\xb9\x7b\xe8\xfb\x9b\x7b\xe0\xd7\x75\xdd\x08\xc1\x7a\x44\xbe\x13\x61\x8f\x5b\x0a\xc5\xd2\x8f\x2e\xd8\xe5\x3e\x6e\x28\x2f\x3a\x26\x95\x83\x00\xc5\xaa\x76\xb7\x16\xe3\x84\xd0\xb7\x7b\xa2\xf9\x98\xd1\xe8\xa4\x2f\x05\x52\x89\x69\x63\xf3\x12\x83\x12\xc0\xa1\x29\x58\x5e\x59\xb2\xb3\xdc\x29\x41\xb0\x27\x49\xbf\xd1\x6f\x9c\x67\x85\xa4\x67\x17\x8f\x97\x85\x95\x00\xa7\x41\x24\x9b\xfc\x54\xc0\xe3\xf5\x7e\x01\xc0\x00\x08\xe2\x90\x64\xe3\xe8\x94\x09\x30\x96\xe7\x99\xef\xa2\xb1\xf2\x12\xa2\x52\x44\xb9\xc2\x9b\x5e\x14\xea\x03\xda\x39\xf8\x65\x41\x10\x5d\x07\xfa\x5f\x42\x58\x19\xdb\x60\x04\x27\x0f\x64\xfc\x60\x5b\xe0\x27\x3f\xaa\xe8\xe5\x4c\xe3\x6a\x5d\xef\x44\x0b\x05\xe7\x46\x43\xe8\xae\xbb\x9a\x9e\xd8\x50\xf9\x67\xe0\x4a\x8a\xe6\x98\x3c\x5d\x0f\xbc\xcb\xdd\xd2\x77\xe7\x08\xde\xf3\xad\x2a\xf4\x4d\xed\x4c\x02\x18\xaf\xaf\xd0\x5f\x53\x6d\x0a\xc9\x5d\x70\x67\x4a\x53\x57\x5b\x1b\x14\x42\x59\x96\x0b\x3c\x9c\x7c\x69\x74\x0d\xb8\x18\x51\x4b\xa6\xa4\x93\xcf\x8b\x1d\x29\x40\xb1\x71\x39\x06\x05\x71\x4d\x94\xb0\xb5\x73\x2b\x09\xb8\xc3\x6a\xcc\x1a\xf2\xdd\x3f\x52\x3e\x6a\xbb\xe1\x97\x63\x15\xde\x9b\x65\x55\xe2\xf0\x13\xe7\x52\xbe\xd2\xf7\x28\x27\x77\x4f\xc4\xff\x45\x81\xf5\xf0\x91\x80\x1e\x0f\x1e\xb7\x2f\x1c\x45\xd4\x48\x2c\xd6\xf4\x25\x76\x74\x08\xe2\xf1\x8d\xf1\x1f\xcc\x5a\x30\xc2\x66\xcf\xaa\x06\xa4\x91\x6b\xa8\x7b\x8b\xd7\x0b\x7b\xa4\xb8\x08\x49\xfb\x32\x33\x73\xa6\x5a\x57\x15\xde\xa8\xb6\xcb\xf0\xaf\xd4\xc9\xa9\x0f\xf1\xb7\x6b\x7f\xde\x10\xfd\x51\xbb\xf0\xc5\x8a\xa2\x1c\x37\x09\xc4\xb7\xa0\x80\xba\x1a\x02\x0c\x14\x8e\x99\xfb\x95\x0f\x21\x99\x5d\x88\xfe\xcb\x9a\x27\x9b\xc4\x26\x89\xff\x90\xa2\x82\x49\x77\x24\x82\xfb\x1f\x17\xc1\xf4\x5c\x06\x9e\xed\xb2\xf4\xe2\x3f\xfa\xce\x54\x77\x75\xb6\xb9\x77\x56\x51\xec\x5f\x8b\x5a\xb3\xa0\x04\x82\xa7\xb0\xef\x4a\x08\x54\x47\x5f\xcd\xad\x0a\xf4\x71\xcc\x6f\xee\xae\xf5\x75\x05\xe8\x0b\x1e\x08\x3c\x36\xb6\x44\xbe\xbe\x34\x4b\x90\x34\xc1\x9d\x9c\xe1\xbd\x1a\xd0\x81\xb2\xec\x9a\x83\x3b\xbe\x85\x19\x48\xf3\x70\x90\x97\xa2\xce\xf3\x6a\xd9\x93\xef\x50\x27\x67\x98\xa9\xde\x4b\x45\x06\x01\x15\xaa\xc9\xa9\xcd\x43\x0e\x15\x03\x38\xe1\xa5\x79\xd4\x82\xef\x39\xb2\x69\xf7\xa0\xcc\xd0\x08\x70\xf6\xac\xdb\x52\xf9\xda\x10\x72\x24\x7a\x94\xdb\x3f\x6a\x0e\xe4\x0e\xb9\x3b\xde\xf3\x52\xdb\x4d\x5e\xe7\x9e\x2f\x96\x38\xcc\x03\xd5\xcc\x7c\xdb\x50\xde\x15\x62\xb8\x40\xe8\xd1\x90\x4e\x15\x95\xa9\x2a\xf7\x0a\x4f\x43\x83\x08\xd8\x85\xa9\x21\xed\x16\x51\x53\xe7\xf6\x19\x56\x6a\xe2\xd8\x0b\xe2\x9f\x6c\xe1\x52\x54\xd8\xd9\x0e\xf1\x47\x3b\xa0\x4b\x3c\x2b\x05\xe4\x8e\xae\xda\x03\x10\xd0\xcb\x9a\x00\x5f\x3c\x48\x54\xc4\x8d\xe6\xab\x7b\x34\x96\x8b\xf3\x81\xdd\xeb\x8b\xd0\xde\x62\xe8\xb8\xa7\x64\xae\xf9\x9e\x88\x5e\xd5\xe5\xa0\xde\xb7\x28\xb8\xeb\x2a\x2a\x4a\x03\x47\x93\x70\x91\xc1\x8f\x88\x47\x42\x30\x47\x23\x1f\xb2\x6b\x05\xb7\x0b\x72\x5c\x2f\x6f\x84\x52\x27\x6f\xbd\xc5\xc8\x98\x42\xb1\x2f\xc0\x56\xef\x24\xff\x01\x4f\x88\xc7\x6e\xc4\x01\xa1\x10\xce\x1d\x6d\xdd\xb6\x21\x2d\xe9\x68\x39\x16\x04\x48\xf0\x3a\x6f\x4c\x7c\x49\x28\x62\x55\x5b\xa1\x50\x04\x79\xd4\x68\x1d\x06\xc6\x20\xbe\x32\xe5\x61\xd7\xd7\x6d\x25\x79\x2d\xa3\xb7\xed\x1b\x9d\x8f\x40\xe8\x57\xad\x8d\xdb\x64\x16\xef\x04\x1f\x5b\xb7\x8a\xe1\x28\x40\xda\x07\xf7\x58\x4c\xcb\xbe\x85\xe8\x0e\xab\x62\x3f\x56\xfa\xae\x82\x3c\xc4\x4a\x12\x49\x04\xbb\xc0\xf3\x5e\x80\xca\x9e\x0f\x05\xc0\xaf\x98\x6d\x42\x30\x47\x96\x4c\xf3\xb5\xae\xbc\xc5\x41\x34\x1e\x94\x3d\xa7\xbb\xc4\x7f\xe5\x0e\x8f\x93\x62\x87\x3c\xe8\xd7\x63\xfd\x6d\x30\x99\x0c\xae\x67\xdf\x95\x3a\x79\x97\xea\x4f\xc3\xf3\xc1\xed\x74\xa8\x67\x5f\x86\x9e\x59\x74\x34\x65\x36\xd1\x0b\x7d\x39\x19\x0e\xf5\xf8\x52\x9f\x7f\x19\x4c\x3e\x0f\x13\xf7\xb9\xc9\xd0\x7d\x42\x3c\x49\x5f\x8e\x27\x4a\x3c\x20\xd1\xb3\x31\x3c\x70\xf8\xe7\xd9\xf0\x7a\xa6\x6f\x86\x93\xaf\xa3\xd9\x6c\x78\xa1\x3f\x7d\xd7\x83\x9b\x9b\xab\xd1\xf9\xe0\xd3\xd5\x50\x5f\x0d\xbe\xa5\x7a\xf8\xe7\xf3\xe1\xcd\x4c\x7f\xfb\x32\xbc\xd6\x63\xf7\xf4\x6f\xa3\xe9\x50\x4d\x67\x03\xf7\xf9\xd1\xb5\xfe\x36\x19\xcd\x46\xd7\x9f\xe1\x79\xe7\xe3\x9b\xef\x93\xd1\xe7\x2f\x33\xfd\x65\x7c\x75\x31\x9c\x00\x27\xc1\x9b\xf1\x04\xbf\xa8\x6f\x06\x93\xd9\x68\x38\xd5\x37\x93\xf1\xaf\xa3\x8b\xa8\x4f\xea\x60\x30\xd5\xa3\xe9\x81\xfe\x36\x9a\x7d\x19\xdf\xce\x42\xdb\xc7\x97\x7a\x70\xfd\x5d\xff\x69\x74\x7d\x91\xe8\xe1\x08\x1e\x34\xfc\xf3\xcd\x64\x38\x75\xdd\x1f\x4f\xf4\xe8\xeb\xcd\xd5\x68\x78\x91\xe8\xd1\xf5\xf9\xd5\xed\xc5\xe8\xfa\x73\xa2\x3e\xdd\xce\xf4\xf5\x78\xa6\xaf\x46\x5f\x47\xae\x9d\xb3\x31\x8c\x0c\x7f\x96\x9f\xee\x1a\x33\xbe\xd4\x5f\x87\x93\xf3\x2f\x83\xeb\xd9\xe0\xd3\xe8\x6a\x34\xfb\x0e\xfc\x08\x97\xa3\xd9\xf5\x70\x3a\x55\x97\xe3\x89\x1e\x60\xcb\xcf\x6f\xaf\x06\x13\x7d\x73\x3b\xb9\x19\x4f\x87\x29\x0e\xe0\xf5\x6c\x34\x19\xea\xc9\x68\xfa\x27\x3d\x98\xf2\xb0\xfe\xfb\xed\xc0\x3f\xe7\x66\x38\xb9\x1c\x4f\xbe\x0e\xae\xcf\x87\x6a\x7c\xd9\x9e\x46\xd7\x5b\xfd\x7d\x7c\x9b\xea\xe9\x97\xf1\xed\xd5\x45\xf4\x77\x37\x4c\x43\x7d\x31\xbc\x1c\x9e\xcf\x46\xbf\x0e\x13\xf7\x41\x3d\x98\x4e\x6f\xbf\x0e\x15\x8e\xf6\x74\x06\xc3\x73\x75\xa5\xaf\x87\xe7\xc3\xe9\xd4\x7d\x6b\x3a\x9c\xfc\x3a\x3a\x07\xd2\x87\xc9\xf0\x66\x30\x9a\x68\xe0\x81\x98\x4c\xdc\x53\xc6\xd7\xee\x70\x79\x9f\xba\x89\xbb\x1e\xeb\xe1\xaf\x6e\xfa\x6f\xaf\xaf\x86\xd3\xa9\x9e\x0c\xff\xfd\x76\x34\xe9\x5b\x04\xee\x09\x83\xcf\x93\x21\x0c\xa4\x98\x73\xf5\x6d\x74\x75\x05\xb3\xd3\x9e\xf8\x04\xbe\x72\xfd\x5d\x4c\xfc\x77\xfd\xed\xcb\x58\x7f\x1d\x7c\x47\xea\x89\xef\xbc\x34\x26\x43\xcf\x4d\x31\x94\x8b\xd4\x8d\x67\x58\x98\x83\x4f\x63\x37\x02\x9f\xdc\x9f\xa1\x59\xb3\x31\x0c\x87\x9b\x9e\x8b\xc1\xd7\xc1\xe7\xe1\x54\x2c\x00\xf7\x6a\x45\xfc\xbb\x89\x9e\xde\x0c\xcf\x47\xee\x3f\x46\xd7\xe7\xa3\x8b\xe1\xf5\x6c\x70\x85\x63\x72\x3d\x1d\xfe\xfb\xad\x9b\xc2\xc1\x15\x3f\x44\x0f\x26\xa3\xa9\x7b\x82\x5b\x83\x34\x5f\xb7\xd3\xa1\x72\xeb\xec\x9a\xd7\xc7\x6c\xac\xdb\x5b\xf2\x30\xbc\xbb\xbb\xf6\xf4\xd5\x78\x0a\x0b\xed\x62\x30\x1b\x28\x68\xf1\x6c\xa0\x3f\x0d\xdd\xa7\x27\xc3\xeb\x8b\xe1\x04\xb6\xd2\xe0\xfc\xfc\x76\x32\x98\x0d\x5d\xe3\xdc\x37\x86\x53\x3d\xbd\x9d\xce\x06\xa3\x6b\x9c\x14\xd7\xdf\xf1\x44\xcf\xbe\x8c\x26\x17\xbc\x97\x14\x2c\xcf\xcb\xc1\xe8\xea\x76\x32\xd4\xad\x05\x36\x1b\xeb\xf1\xcd\x10\x1e\x09\x0b\x2d\x4c\xc8\x74\x7c\x39\xfb\x36\x98\x0c\x8f\x12\x58\x03\x7a\x74\xa9\xa7\xb7\xe7\x5f\x14\xce\x9e\x8e\x76\xec\x77\xfd\x65\x30\xd5\x9f\x86\xc3\x6b\x3d\xb8\xf8\x75\x04\xbb\x0e\xdf\x73\x33\x9e\x4e\x47\x34\x26\x63\x7c\x02\x8f\x63\xaa\x86\xd7\xf8\xb9\x1e\x6a\x12\x00\xb6\xba\x73\x7e\x00\x5e\x27\xc6\x53\x41\x0c\x99\x84\x77\x6a\x10\xc0\xb8\xe2\x5c\x9d\x97\x80\x20\xd2\x1a\xcd\x2a\x0e\x22\xcf\x20\x38\x4d\xc9\x01\xa0\xeb\xf1\x0e\x21\xb0\x81\xe4\x5e\x6d\xad\xbf\x64\xd0\x85\x03\x8e\x39\x00\x25\xac\x4d\xb9\x64\x4e\x04\x20\x41\x32\x91\x7b\x23\xb8\x0c\x9d\x13\xa3\xa2\xb0\x65\xa0\xe6\x0d\x0c\xb5\x28\x99\xec\x5c\x00\x34\x94\xdd\x73\x5b\x71\x10\xaf\xa4\xe1\x89\x76\x0e\x41\xc6\xb1\x68\x4c\x5d\x66\xc8\x44\x95\xec\x93\xf6\xd8\xc3\x71\xa5\x84\xee\xc3\x4c\x14\xd7\xf0\x2b\x12\xd2\x3d\xc0\x8b\xce\x9b\x5b\x2d\xe9\xeb\xc0\xbc\x08\xfe\x95\xcd\x56\xc6\x36\x70\xfd\xfb\x2f\xaf\xf9\xb3\xb6\x21\x50\x2c\x80\xb8\x28\x05\x8d\xa8\xd9\x0a\x59\xb2\x24\xb1\x16\xb0\x9e\xec\x28\xf7\xeb\x85\x9d\x56\xad\x02\x74\x78\x14\x3c\xc3\x82\xcc\x1c\x01\x04\x02\x92\xc3\xe8\x03\x6f\x5f\x1c\x28\x00\x76\xa2\xa7\xb9\xa9\xc0\xb1\x02\x8c\xb8\x97\x54\x82\xfc\x03\x4b\x12\x58\xbd\x72\x16\x45\xaa\x40\x2d\x01\xbe\x2a\xc1\x20\x85\xa7\x07\x00\x69\x0e\x8c\xaf\xe9\x7c\x69\x32\xac\x57\x43\x9e\x1f\x62\x20\x88\xb9\xbb\x77\xce\x27\x65\x41\x0f\x32\x99\x98\x6f\xcf\xfb\x8e\xd1\xc2\xfa\xe8\x8b\x6f\xa2\xf5\x84\x96\xb3\xa0\xe6\xcc\x9b\x3e\xd9\x95\xe6\x45\xdc\x80\x50\x50\xd8\x67\x80\xaa\x5e\x13\x2b\x10\xa2\xc4\xc5\x45\x3e\x14\x5a\xd5\xfa\x30\xae\xcb\x3f\x52\x1d\xbb\x3b\xed\x76\x5c\x86\x33\xc8\x7f\x03\xbe\x2a\xa6\x4e\x62\x3b\x0d\x2b\x6b\xd0\xff\x21\x93\x40\xb9\xe3\x8b\xcd\x82\x8f\x1e\xbe\x4c\x98\x69\xc3\x7a\x8c\x5a\xea\x37\xb6\x6f\xf6\xaa\x7e\xc1\xc5\x3e\x35\xe6\xa5\xa3\xba\x22\x31\x75\x92\x39\x66\xa4\xa3\x5c\xaf\xfd\x20\x98\x17\x3c\x5c\x45\x65\x15\x61\x18\x3f\x3a\x1f\xb8\xac\x9a\x17\xda\xcb\x48\x17\x9f\xfc\x5e\xba\x78\x22\x81\x85\x88\x02\x6a\xd1\x51\x44\xc9\x13\x9f\x01\xd6\x0c\x69\x9c\xdd\xc2\x32\x85\x59\x34\x75\x55\xe6\x0b\xa2\x61\xdd\x00\xef\x6e\x5e\xc4\x63\x03\x70\xda\x3b\x43\x4b\xc8\xac\x37\x45\xb5\x33\xb5\x3e\xe4\x12\x33\x5f\x3e\x4c\x6e\xcc\xda\xd4\x47\x9a\x89\xbe\xad\xf3\xb1\x8a\x44\xe5\xe0\xec\x25\x10\x3d\xcf\xef\x00\xe1\x1f\xb0\x95\x81\x36\xe3\xc0\x43\x10\x03\xdf\xe2\x2a\xe8\x6e\xa5\xfa\x8b\xa9\xa1\x0e\x21\xd3\x16\xc2\xdb\x1f\xf1\xf8\x85\xaf\xb8\xad\x6c\x3f\xb8\xb6\xef\xaa\xe5\xae\x34\x34\x9e\xac\x20\xcf\x6f\x41\x12\x9c\xf0\x76\x38\x80\x0c\x00\x3f\x95\xe4\x81\xd6\xff\xef\x65\x5d\xcd\x5f\xe9\xc3\x50\x94\x0e\x8d\x7b\x34\x78\xeb\xfc\x28\xab\xb9\x3d\xe2\x18\x87\x52\xf3\x9d\xfe\x37\xd7\x02\x3d\xc9\xca\x65\xb5\xd6\x5f\xb2\xc5\x0f\x20\x03\x44\x90\x17\x08\x11\xae\xf4\x6c\xa7\xcf\x2b\x37\x81\x27\x7a\xb0\xa9\xf3\x42\x9f\xfc\xf2\xcb\xb1\x52\xfe\xd7\x37\xb5\xb1\x39\x57\xac\xff\x4a\xe2\x24\x59\xf3\xca\x53\xf7\x20\x0b\x2f\xf8\xeb\xff\xdb\x1f\x22\x22\xbf\xfb\x27\x7d\x63\x3e\x9b\x32\xff\xed\x1f\x22\xfc\x41\x3f\x4f\xeb\x7f\x9c\x1c\x9f\x9e\x9d\xb5\xf5\x3f\x8e\xdf\x9e\xfd\xa1\xff\xf1\xcf\xf8\x19\x7e\x1e\x5e\x8f\xfe\x9c\x9e\x8f\xbf\xb6\x64\x3f\xd0\x7f\xfa\x3a\xbc\x9e\x05\x01\x90\x93\xf4\x24\x3d\x8e\x98\x7e\x45\xa6\x32\xb7\x71\xba\xfb\x66\xd7\xdc\x57\xa5\x3e\xbf\x9e\x8c\xba\x2c\x7d\x89\xca\x20\x7f\x80\x08\x36\xb3\x81\x80\xec\xc6\x94\xaf\xd9\x12\x0b\xc4\xba\x5a\xeb\x93\x54\x8f\x88\xac\x1a\x4a\xa6\xf0\x92\x3e\xe8\x3c\xf5\x00\xa3\xea\xc8\xc6\x48\xeb\x7a\x51\xad\x85\x10\xdc\xf4\x47\x5e\x14\x18\x9c\x9b\xa2\x2e\x81\x55\x9f\xd7\xf3\x2f\xfa\xf0\x20\x7c\xfe\xe0\x28\x71\x37\x21\x00\x56\x01\x99\x0b\xbc\x46\x8d\xbe\xc9\x6c\x53\xd5\xaf\xaf\x2a\x73\xff\x7a\xda\xd4\xa9\x7e\xfb\x73\xa2\x2f\x5e\xbf\x3d\xfe\xe9\xfd\x5b\x7d\xe5\xec\xe8\x72\x65\x8a\x65\xa2\x3e\x9b\x7a\x0d\xc7\x3c\xa7\xb3\x46\x9e\x8a\xda\xdd\x08\xe3\xfa\x2e\x2b\xf3\xff\x20\x75\x29\xee\x86\x39\x38\x22\x98\x2b\xbe\x78\x19\x12\xbf\x9e\x67\xcb\x19\xb5\xa1\xe0\xb3\x03\x9c\x44\x18\x12\xd7\x12\x08\xa6\x32\xd6\x3c\x41\x06\xb7\xc3\x03\xc0\x5a\xd1\x83\x0e\x8e\x70\x90\x4f\xd3\x20\x78\x38\xed\x13\x05\x6b\x45\x34\x39\x90\x2a\xc6\xb9\x65\x6b\x88\xd9\x16\x1f\xa2\x6b\x88\x60\x2e\xdc\x79\x50\xc0\x2a\x5f\x93\x71\xfd\x60\x92\x28\x15\x9b\xb8\xeb\xb5\x58\xbe\x76\x4b\x86\x39\x97\x31\xed\x49\xa8\xf2\x04\xd8\x85\x77\xff\x61\x12\xed\x5c\xa7\x84\xb1\xcb\x9e\xcf\x10\x2b\x1e\xc8\x7d\x2a\x00\xce\x07\xe4\x86\xaa\x8d\x96\x89\xa1\x14\xd1\x34\x78\xa4\x77\x90\x0e\x2e\xa0\x26\xa1\x26\xae\x2d\xf9\x30\x1f\x10\x67\x80\x56\xe2\xcc\x0f\xc4\xfb\x78\x04\xe1\xde\xb1\x53\x03\xb9\xaf\x6a\x67\xab\x95\xc1\x00\x8d\x84\x0d\x89\xe6\xab\xfb\x6a\x26\x5b\x15\xfa\xd6\xc8\xe7\xe8\x8c\x1e\x1e\x77\x9c\xfb\xb3\x34\x8e\xe3\x89\x76\x01\x8c\xfb\x07\x87\x06\x43\xcf\x1f\xb2\xbc\x60\x78\xbc\x9f\x44\x92\x29\xa7\xc8\x18\xc8\x94\xa7\x6a\x7a\xfb\xe9\xdf\x86\xe7\x33\xe7\xdc\x3b\x83\x78\x3a\x1b\xcc\x6e\x67\xe3\xc9\x77\x19\xd3\xfa\xf6\x65\x74\xfe\x45\x9f\x0f\xae\x21\x10\xf1\x69\xa8\x87\x7f\x3e\xbf\xba\xbd\x18\x5e\x24\x3a\x9c\x50\xea\xeb\xe0\x4f\x43\x88\x13\x4e\x86\x37\x93\xe1\x74\x78\x3d\x1b\x20\x73\xe8\x78\x22\x1e\x96\x70\xb4\x4d\xc4\xda\x52\xfd\xc9\xbd\x0f\xbc\xfe\xe1\x9f\x07\x5f\x6f\xae\x86\xad\x98\x1b\x3c\x49\xbe\x4d\xfb\xb7\x0d\xae\x2f\xf4\xc5\x68\x7a\x7e\x35\x18\x41\x64\xe0\x7b\xeb\xfd\x7a\x3c\x51\x32\xfa\xd7\xb6\xe1\xc7\x13\xb6\xe1\x21\xfa\xe3\x1e\xd0\xb5\xe2\x31\x50\x32\x98\x29\x0a\xe0\x70\xc8\x82\x03\x1f\x1a\x42\x57\xae\xb9\xa3\xeb\xcb\xc9\xe8\xfa\xf3\x10\x1e\x14\x62\x2b\xdf\x35\xc4\xb3\xa6\x38\xa3\x6f\x53\xd1\x2d\xf7\xac\xab\x11\x35\x47\x29\xd1\xc7\xe9\x97\x01\x3d\x35\x0a\x54\xd1\x1d\x30\x8c\x83\x62\xb7\xd3\xe1\x64\xda\x6e\x97\xe2\x2e\x85\x58\x95\x08\x60\xed\x8d\x5a\x51\xc4\x48\x84\xa1\x12\xc5\x91\x54\x39\x1f\xfc\xf9\x4b\xfe\xc2\xf8\x52\x7f\xba\x9d\x8e\x60\x34\x6f\x26\xe3\xcb\xd1\x6c\x9a\x84\xdf\x8c\xae\x67\xc3\xc9\xe4\xf6\x06\xbe\xac\x3a\x5f\x18\x5d\x43\x68\x13\x1f\x1d\x62\x46\xc3\xf3\xdb\xeb\xd1\x60\xf2\x1d\xde\x70\xa4\x07\x53\x3d\xd0\x93\xe1\xf4\xf6\x0a\x22\x6a\xee\xcb\x9f\x13\x85\x41\x40\x88\xb4\x4d\x04\x3b\x2d\x05\x92\x79\x38\x7c\x1c\xf1\x62\x38\x19\xfd\x3a\x98\x8d\x7e\x1d\x62\x84\x7b\x7c\xe9\x23\x57\xea\x89\xa8\x14\x7d\x36\xd5\xd3\xf1\xd7\xa1\xfe\xb7\xdb\xc9\x68\x7a\x31\x3a\xc7\x55\x7e\x31\x86\x99\x1a\x5c\x5d\x8d\xbf\x51\x34\xfc\xfc\xea\x76\x3a\x1a\x5f\x2b\x37\x3a\xd1\x74\xbf\x20\x72\x98\xe8\x29\x46\x7f\x21\x54\xb9\xf7\x61\x5f\x07\xdf\xf1\xb5\x37\x37\x57\xdf\xe5\xe2\xc0\x85\xf6\x2e\x85\x40\x58\x5e\x66\xe2\x6a\xee\xb2\xf2\x3e\x09\x12\xdd\x6e\x90\xe7\x80\x4b\x99\xe7\xb5\xc9\x16\xf7\x8a\x58\xb4\xfa\x6e\x1f\x7c\xf7\x7b\x40\x18\xd7\x4b\x7d\x03\x44\xbc\x13\x40\x98\xa1\xe0\xb5\x14\x03\x8a\x6e\xbf\xfd\xf7\xa6\x47\xd2\xb6\x58\x02\xa7\x51\x38\x2d\x8f\x2e\x56\x42\x50\x7b\xda\xa4\x5e\xb3\xc8\x2b\x3c\xc8\xa3\xb2\x37\x3e\x96\x35\xdd\x27\xec\x23\x3a\x56\x3e\xd3\xd7\x22\x7a\x6a\xd7\xda\x4e\xbd\x52\xc5\x79\xc4\x1b\x18\x50\x74\x5e\xc7\xc0\x27\xd7\x90\xde\xb5\x75\xdd\x08\x2d\x56\x08\x95\x68\xad\x7f\x4a\x3d\x07\xb4\x6a\x8b\x6a\xf7\x50\x33\x43\x44\x0d\x79\x54\x21\x51\xd5\x54\xf5\xce\x33\x21\xad\x00\x0b\xb2\x5d\x9b\xda\x12\xc4\x02\x51\x17\x73\xa3\x1f\x33\x08\x48\xb0\x92\x3a\x5e\x61\x2c\x14\x9d\xbe\xe4\xd5\x5e\xd8\x7a\xe9\x7e\xb1\x0c\x02\xbb\x24\x70\x8b\x0c\x09\xf6\x3e\xdf\x80\xca\xf9\x9d\x29\x17\x3b\x04\x25\x93\xb0\x26\xdc\xb5\x7f\xa9\x72\xc8\x75\x97\xe0\xc6\xf6\x58\x9a\x6e\x95\x8a\xab\xf5\x59\x6d\xee\x9e\x06\x6e\xcb\x22\x7b\x84\x50\x12\x42\xac\x59\x2a\x09\x9a\x09\xa0\xc3\x1e\x09\x6f\xdd\x23\xe1\x2d\x79\x0e\x9b\x1e\xf5\x6e\x05\x06\x14\x2c\xc3\x58\xbf\x3b\xd0\xfa\x56\x24\x17\x41\xa8\x96\xc6\xb5\x06\x43\x11\x55\xb7\x6a\x56\x09\x16\xf1\x04\x28\x03\x0d\x96\x5c\x74\xd4\x7d\xe5\x92\x28\x97\x52\xe7\x9f\x54\x58\xee\x8d\xf2\x38\x2a\x08\xac\x72\xe3\xb0\xce\xc9\x63\x63\xd6\x5c\x88\xec\xb5\xdd\xf7\x8f\x70\xba\xf7\x6c\xea\x95\x9c\x47\x4e\xde\xc6\xd4\x9b\xda\x50\xec\xcf\x7d\xaa\x06\xd6\x82\xc6\xb2\xbc\x29\xa8\x9c\xaf\xb4\xb7\xf8\x03\x24\x85\xf5\xe7\xdd\x9f\xdb\xfa\xf3\xa3\x26\x74\x5a\xb5\x5e\xec\x9e\x7a\x5b\xc2\x22\xbf\x26\x00\xe5\x39\x70\x6e\x73\x14\xeb\x9c\xd6\x3d\x02\x9c\x47\x25\x85\xdd\xab\x32\x2b\xd4\x34\x43\x82\xc9\xcf\x55\xb5\xb4\x7b\x29\xd2\xfd\xc9\x01\x46\x78\x0b\x66\xee\x8c\xdc\xb0\xa2\x55\x53\x67\x4b\xb3\xce\xea\x1f\x08\x74\x73\xff\xc2\x08\x13\x51\xe9\xf2\x9f\x49\x05\x04\x58\x18\x97\x55\x8d\xba\x35\xac\x47\x81\x56\x3a\x42\xe9\x48\x0f\x0e\x66\x8a\xb7\x4a\xc2\xe4\xa5\xe2\x4c\x22\xea\x6f\x62\x2e\x03\x14\x97\x14\x8a\xdf\xb3\x9e\x72\xab\x87\xe5\x5d\x91\xdb\x7b\xc0\x23\xf0\x0b\x80\x40\x4a\x04\x36\x05\xa1\x75\x3f\x03\x36\x50\x3a\xb9\x2f\x01\x65\xb8\xbf\x1a\xdc\x4e\xe4\x67\x02\x15\x2f\x91\xa1\x03\x96\x8d\x53\xe2\x3f\xa7\xe2\x94\x56\x9f\x76\x7a\x59\x3d\x96\x45\x95\x2d\x01\x88\xee\x11\xe9\xc4\xf8\x4c\x78\x74\xe9\x65\xb4\xad\xed\x24\xf4\x03\xae\x05\xa6\xae\x98\x57\xdb\x32\x40\x03\x9e\x72\xd2\x7a\x76\xc3\x65\x55\xeb\xbf\x6e\x8d\x85\x31\x40\x12\x08\xef\x64\x76\x3d\x38\xbd\x01\xdd\x4b\x1f\xc1\xfd\x10\x39\x09\x4f\x3a\xd8\xda\x39\xd8\x4a\xf5\x78\xcf\x4a\x75\xbd\x67\xc5\xde\xf3\x1f\x41\xbd\x7f\xc6\x4f\xfa\xe6\xda\x3c\xda\xc2\x34\xf5\x3f\x2e\x02\xf8\x74\xfc\xef\xf8\xf8\xa7\x9f\x4e\xda\xf1\xbf\xb7\x67\xef\xfe\x88\xff\xfd\x33\x7e\x42\x2a\xf0\xe4\x97\x9f\x7f\x79\xfd\xda\x4d\x82\x3b\x51\xbe\x6c\x21\x1f\xf9\xb9\xca\x9a\xc2\xb8\x73\xed\x26\x5c\x12\x79\xa8\xe2\x40\xfd\x05\x94\xb5\xa4\xf0\x88\x8c\x51\x71\xcd\x84\x47\x37\x63\x98\x84\xb8\x5a\x19\x6d\xeb\xa5\x55\xdb\xd9\xc4\x55\x6d\x20\x97\xdc\xd2\xa8\x0f\xf9\x5f\x59\x83\xf2\x01\x98\xd5\x67\x71\x8c\xec\x7f\x89\xfc\x1d\xf0\x7d\x0f\x8a\x06\x8c\x25\x0f\xbd\xe4\xb2\x49\xa8\x46\x04\xcd\xaf\xfa\x07\x0a\x7c\x38\xcb\x0b\xc7\x0c\x3e\x43\x36\xf2\x3a\xb7\xb5\x21\x38\xa6\x59\x2a\xb8\xba\x82\xb2\x14\xa1\x74\xbd\x6a\x1d\x9f\xae\xe9\x9b\xf1\xf9\xf9\xec\xb5\xc7\xa3\xbd\x3e\x49\x8f\xff\xde\x27\xc1\x33\xfb\xff\xe4\xf4\xf4\xa7\xd6\xfe\x7f\xfb\xfe\xed\x4f\x7f\xec\xff\x7f\xc6\xcf\x78\x63\x4a\x7d\x3e\x98\x9e\x0f\x2e\x86\x7a\xe8\xa9\x85\x0e\x1f\x7c\xc8\xff\x18\x84\x59\x20\xfb\xfb\xf9\xe6\x2a\x64\xd8\xd3\x13\xb2\xd0\x24\x67\xc8\x61\x9e\x9a\x94\x18\x21\xd1\xcb\x3e\xf2\xb5\xb1\xcf\xb0\x99\x2d\xb2\x32\x82\x8c\x3e\x47\x6c\xa6\xfb\x89\xcd\x90\x26\xa9\x4b\x62\xc0\x87\x07\x74\xc4\x58\xeb\x0e\xb7\xfe\x14\xb9\xe8\x61\x1f\x8d\x14\x3a\x3e\x11\x9b\xa2\x6f\x35\x32\xcb\xc8\x76\x4b\x05\xad\x60\x46\xfa\xea\xe5\x68\xf8\x67\x66\x71\x5f\x56\x45\x75\x27\xab\xfe\x0f\x03\xf9\x0c\x73\x72\x9e\x5f\x5c\x21\x0a\x33\x5f\xe8\x45\x91\x59\x6b\xec\xd1\x8b\x98\x95\x42\xc5\x78\x3f\xa9\x51\x5e\x02\xad\x50\x55\x43\x47\xe2\xb0\x09\x57\xd9\x41\x23\xf8\xf0\x5c\x67\x3f\x8c\xe5\x6a\x83\xaa\x8e\x72\x40\xa2\xfe\xde\xbf\x9f\x4c\xd5\x7d\xbd\xee\x9c\x4e\x7f\xfc\xfc\xa3\x7f\xd2\x37\xe3\xcf\x57\xaf\x6f\xff\xf4\xfa\xf4\xef\x7f\xee\xf3\xcf\x33\xf9\xdf\xb3\x77\x67\xef\x3a\xf9\xdf\xf7\x7f\x9c\xff\xff\x94\x1f\xd8\x8a\x9f\x21\xfc\x00\xfe\x33\x1c\x82\x0b\xa3\x1f\x4e\xd3\x63\x84\xbf\x38\x3b\xca\x94\x8b\x6a\x5b\x67\x77\x68\xf1\x6d\xa9\x80\xb3\x36\xaf\x39\x23\x36\x12\x40\x1b\x1f\x26\xf5\x29\x22\x06\x81\x71\x2c\x74\x61\xc8\xb4\x83\xc7\xac\x0a\xf3\x5b\x3e\x2f\x98\xc1\x0a\xea\x72\x32\xbd\x32\x8f\x71\xbc\xf7\x16\xdc\x62\xf9\x22\x51\x4a\x44\x8f\x75\x9f\x32\x18\x49\x64\xb3\x96\xe5\xc5\xdc\xb9\x44\x75\x7b\xfe\x84\x0e\x2c\x0a\x50\xee\xf6\x64\x83\x0f\x5d\x37\x5f\x89\xd7\xbf\x3a\xf2\x45\xeb\xb6\xbf\x6a\x5d\xf8\xe4\xb2\x4a\x17\x14\xcc\xe8\xee\xbc\xa2\x42\x6e\x59\xf5\x9f\x61\xb2\xf3\x31\x5f\x76\xb2\xa0\x1b\x53\x6f\x4c\xb3\xcd\x8a\x24\xce\x96\x2a\x6e\xa5\xa0\xa3\x92\x23\xd5\x32\xa0\x7b\x1b\x23\xfa\x1a\x22\xcb\x18\x8f\x8b\x64\x2a\x71\xd4\x57\x59\x5e\xeb\xa5\xc9\x38\x7c\x01\xff\x46\xb5\x62\x25\xa8\xb5\xfd\x34\x90\xa6\x9c\x98\x85\x50\x02\x81\x22\xae\xbe\x68\x8a\x31\x69\xe0\x40\xd4\x86\xa2\x0d\x5a\x53\xa5\x3b\x81\x02\x13\xdd\x42\xb2\x42\x48\x67\x9d\x37\xed\xce\x7f\x84\xef\x66\xcb\x6c\xd3\xf7\x27\xf3\xdb\xa6\xa8\xba\x5f\xd2\x00\xad\xad\x89\x9e\xd4\x3d\xde\x8d\x77\xf4\xcb\x95\x2c\x2e\x9e\x83\x53\x33\xc7\x68\x24\x33\x47\xe3\x18\x88\xa7\x26\x54\x50\x17\xae\xf4\xbc\x71\x97\x2e\x82\x12\x1f\x4b\x8e\x93\xa9\x58\x03\x57\xb0\x11\x26\x04\x0f\x25\xd6\x17\x18\x69\xd2\xd0\x98\x57\x0f\xe6\x83\x52\xd9\xe2\x47\x59\x3d\x16\x66\x79\x17\xd1\x26\xd3\xa7\x64\x17\xa3\x86\x64\xc8\x14\x12\x2a\x49\x9b\xac\xc1\x00\x56\x60\xd8\xa2\xdb\x5b\x3e\xe3\x06\x6f\xf6\xfa\xd0\x1e\x21\x75\x1d\x36\x2f\x84\x81\x59\x24\x3f\x43\x61\x7d\xb6\x22\x68\xa5\x7d\x84\x10\xf9\xbe\x87\x86\x75\x18\x9e\x42\xad\x59\xf4\x37\x36\x51\x40\x07\x8b\xdb\xa8\xe6\x50\x9a\x7c\x36\x2a\x90\x99\x07\x30\xfc\xfa\x5e\x6a\xc9\xb1\x2a\x9a\x7c\x53\x18\x25\x5e\x13\xb8\xa5\xa9\x70\x36\x2b\xfc\xe4\xd1\xc4\xb5\xc4\x8b\x83\xf9\xb8\x25\x41\x06\xef\xba\x7e\x50\xea\xdc\x93\x14\xa3\xfd\x69\xcd\xa2\x81\x7c\x7e\x68\x94\x17\x06\x0a\xd9\xa2\x3d\x07\xb6\x72\x07\x76\xca\x72\x27\xcc\x35\x50\x37\x19\x92\x4f\xb5\xe3\x81\xbc\xd3\x21\xca\x8d\xe3\xb5\xa2\x22\x3d\xa0\x5a\x08\xc2\x0c\xeb\x3e\xf2\x86\xa6\x6a\xb3\xaf\xd0\x03\x7d\x20\x97\x0b\x06\xf9\x60\xe6\x6f\xce\x77\x02\x96\x5b\xd5\x09\xfa\xdf\xa6\x5c\xc6\xc9\xc1\x54\xa9\xe1\x6f\x66\x4d\x25\x52\x7b\x4e\x27\xa0\x74\xc2\xa3\x61\x63\x6a\x5b\x39\x07\x17\x38\xd1\xc8\xcf\x8f\x77\x7a\xde\xbe\xa2\xee\x33\xab\x4b\xae\x79\x85\x28\xaf\x87\x1b\x97\x08\x19\x01\xe9\x57\x1e\x7c\xf1\x7d\x45\x74\x74\x85\xb9\xcb\x39\x8a\x2c\xec\x74\x06\xb7\xba\xd3\xb2\x5a\x45\xab\x6c\xc0\x61\x7b\x88\xf2\xff\x09\xae\x86\xe9\xa2\x6a\x8a\xac\x5c\x1e\x01\x55\x5e\x2d\xa9\x8d\x4a\x2b\x34\x7b\xfa\x56\xeb\x47\xa5\x96\xc6\x79\x41\x60\xa8\x03\xba\x28\x5e\x4d\x15\x60\x8d\x2c\x2d\xa7\xea\xae\xb2\x89\x5e\xd4\xc6\x36\x41\xc0\x6a\xe2\xae\x18\x3d\xa8\xd7\x96\x09\x86\x3c\x04\xdd\x23\x8a\xa8\x0a\x1d\xc9\x8d\x49\xe4\x85\xfd\x03\x3e\xdb\xad\x69\xf0\xac\x5d\x3b\xbb\x1f\x0b\xfc\x80\xd8\x39\xc3\x5f\x8b\xd8\x3e\xaf\xa7\xbd\x3b\x9f\x65\x05\x50\x6b\x95\xa4\x13\x69\x37\x7c\x54\x44\x93\xe6\xda\x04\x62\x25\x5b\xd7\xae\xa8\x36\xdf\x4a\x29\x7c\xaa\x66\x4e\x28\x7b\x01\xc9\x0c\xe2\xfd\x02\xe6\x41\x12\x5d\x01\x0c\x3f\xb4\x14\x65\x7f\x9a\x9d\xef\x22\x51\x04\x51\xc1\xfe\xa7\x3a\x6f\x72\x7b\xaf\x6f\x32\x6b\xdd\x1e\x53\xea\xda\x5d\xc6\x98\xf6\xc0\xa0\x7f\xff\x82\xc5\x74\x0b\x1c\x4e\xe5\x2e\x88\xb3\xf4\xdd\xd8\x90\x5c\x79\xcc\x76\x98\x09\xb5\xdb\xbb\x3b\x9a\xb3\x1d\x02\xd2\x9c\xf9\xc2\xb5\x7e\x75\x00\x14\xf5\x0e\x26\xb5\xcc\x42\xf9\x2a\x23\x92\x45\x89\xb8\xf8\x12\xe4\x52\x4b\x1f\xd1\x42\x23\x25\x6a\x57\x48\x67\xeb\x57\x99\xd5\xb9\x7d\x25\x50\x6e\x7d\x2f\xc7\x12\x6a\xab\x30\x7b\x46\x01\x2a\xa6\xf8\xa0\x17\x21\xbf\x93\xa0\x0c\x41\x8b\x00\xf3\x7d\x39\xe6\x9a\x38\x47\xcb\x52\x80\x91\xc9\x49\x5a\x4e\xd9\x6f\xf9\x7a\xbb\xe6\x4c\x67\xa8\xf5\xf6\x2c\xde\xed\xee\xb4\x17\x5c\x91\x67\x5e\x03\xb9\xdc\x69\x53\xd7\x55\x0d\x23\x5c\x79\x65\x21\x3c\x5c\x94\x7c\x4a\x9c\xc4\x04\xc2\xf2\xe8\x31\x45\x65\x61\x41\xfe\x65\x8b\x14\x43\xcb\x6c\x4d\x59\xac\xac\xdc\xa9\x1f\x39\x08\x44\xb1\x66\x16\xd1\x00\x63\x2d\xf8\xd3\xd7\xe2\xdd\x36\x83\x63\x95\x49\x7a\xcb\x26\x2f\xb7\x66\xa9\x88\x1b\xb8\x77\x7a\xf1\xea\x70\xdb\xe2\x2a\x7b\x6c\x2d\xd4\xdc\x76\x32\x91\x45\xf6\xe8\x01\x03\x7f\xd9\xd6\xb9\x65\x0e\xc1\x5c\xb2\x29\x8a\x57\x28\xdf\x4c\x77\xbe\x82\x0a\x5a\x9d\x97\x8b\x7c\xe3\xf6\x28\xb0\x01\x56\x2b\x3d\x77\x17\xb3\xb1\x81\x76\x31\x64\xbf\xa4\xb9\xd1\x99\x67\x7e\x76\xaa\xd4\x45\x20\x59\x05\x31\xa2\xf8\x16\x0a\xc6\x37\x18\xb8\xa1\x68\x3b\xc4\x8e\x49\x8c\xcd\x7e\x50\x2a\x32\xeb\x89\x1d\x51\x5e\x17\xc4\xc8\xc1\xb0\x03\x61\xd3\xce\x77\x2d\xb3\x56\x1d\x46\x76\x61\x91\x37\xc6\x93\xfe\x65\x75\x93\xdb\x26\x5f\x30\xd0\x90\x28\x6a\x93\x40\xe4\x29\x38\x36\x8f\x14\x90\xa0\x12\x8b\xa7\xdb\xad\xfb\xa4\xff\xa8\xd3\x69\xdc\x0f\x3f\x56\xaf\xa4\xb6\x2e\x5c\x93\xba\x7d\x2f\xa0\x79\xc5\x57\x97\x9c\xcc\xee\x0d\xef\x5e\xc3\xb7\x37\x3f\xda\xad\xf1\xde\x95\x8a\x64\x6e\x56\x14\x63\xbb\x53\xb5\xa9\x88\xe0\xb5\xef\x4d\xfb\x7a\x07\x35\x5d\x08\x4c\xc1\xe7\x9d\x53\x62\x18\xab\xea\xbf\x98\x5a\x7f\xcd\xfe\x62\x6c\xb3\x7b\x65\xd5\x14\x0f\x18\x53\xef\xf4\x18\xe0\xbb\xc9\xdf\xd0\x14\xe9\x2d\x9d\xd7\xd5\x63\xa9\x62\x6f\x12\x7e\xd7\x9a\x76\xba\x4f\xf6\x3c\x25\x70\x63\x74\xbd\x51\xeb\xe5\xa9\x1f\x0c\x9a\x21\x99\x0d\x82\x21\xee\x00\x59\x10\xc9\x1c\xed\x48\x78\x7d\xf2\xec\x78\x29\xf5\xea\xd6\x1a\x9e\xa1\x65\xe5\x8d\xfc\x45\x13\x8a\xdd\x05\x23\x48\x7b\x65\xc7\xad\x4c\x82\x30\x40\x19\x67\x14\x48\x9c\x26\x00\x51\xf1\x6e\x66\xd5\x59\x84\x51\xd0\xb4\x51\x06\x45\x09\x82\x0c\x49\xcb\x26\x72\xe3\xe0\xae\xc1\x7f\x05\x9a\xb9\xcc\xb2\x2c\x45\x63\x16\xf7\x25\x1a\x8a\xca\xc3\x59\xf8\x26\x45\x97\x2a\xf3\x02\xfd\xc0\x1c\x6f\x08\x46\xb3\xce\x1a\x37\x32\xdf\xab\xad\xdc\x16\x50\x96\x82\xd6\x13\x28\x1e\xd0\x3e\x41\x77\x8d\xc8\x3a\xf0\x57\x56\x87\x00\x35\x74\xd9\xff\x33\x51\x38\x51\x90\x96\xea\xf0\x1d\x86\x59\x19\xcc\x59\xc2\x62\x9f\x25\x0f\x97\xd4\x13\xab\x5b\x77\x56\xb7\x3e\xfc\xf2\x75\x3a\x3e\x82\xf5\x4d\x15\xa7\x06\xc9\xa2\x7c\x60\x00\x2a\x93\x40\xf7\x18\x10\x1a\x70\x3d\xf5\xbb\x3f\x34\xc1\xb1\x19\xd9\x54\x01\x76\x4d\xda\x12\x22\x02\x84\xf7\x43\x5e\xf7\x44\x67\x80\x49\x75\xed\xce\x9c\x8d\x29\xc3\x30\xb4\xba\x98\x97\x0f\x79\x63\xda\x9e\xd0\xbc\x5a\x02\x5c\xed\x91\x25\xd1\x73\xf4\x92\xa3\xed\xa8\xda\xdb\xa9\xa9\x98\xcc\xab\x89\x54\x30\x7a\x9b\xd7\x9a\x9c\x9e\x91\xff\x3a\x1d\x23\x45\xb4\x3c\x33\x78\x2c\x7e\xc7\x7e\x77\x3d\x68\x6d\x66\x16\x98\x69\x84\xb1\x1f\x5a\xf1\xca\xe2\x11\xa5\xc4\x7b\xa1\xd9\x7d\xbd\xd9\x73\x1a\x40\x35\xac\x69\xb4\x5b\x7a\x55\x09\xdd\xbc\x26\xc8\x90\x1e\xd4\x8b\x7b\x20\x88\x78\x34\x73\x9b\x37\x9e\xd2\x28\xb7\x22\x13\x72\xcc\xed\xda\xb3\x68\xb1\x0b\xdd\xa1\x53\xeb\x6c\x97\x74\xa9\x66\x12\x64\xc8\x6b\xd3\xd6\x3c\xf9\x06\x2e\xa9\x46\xdc\x3d\x72\x6e\x77\xfd\x7b\x5e\x75\x9b\xda\x3c\xe4\xd5\xd6\xb6\xc0\xf0\xf0\x74\xd5\x7d\x7a\xb2\x0f\x89\xb9\x20\x42\x51\x36\xae\x3c\xf5\x98\xf7\xb5\x29\xc6\x57\x23\xef\x7e\x8b\x92\x44\x9f\xd7\x06\x41\xf9\xe7\xb0\x0d\xac\x1e\x88\xb8\x05\x67\x9c\xde\xa6\xc7\x9e\xf9\x0c\xba\x7f\xe1\x0c\x82\x27\xbe\x91\x20\x2b\x1c\x54\xf6\xba\xa3\x9c\xd7\xc5\x93\x17\x0d\xd3\xf1\xd2\xb1\x97\x35\x41\x77\xb7\x65\xe1\xc3\xe9\x8b\xe4\x42\x01\xbc\x8a\x23\x2b\x79\x6c\x2a\x6b\x78\x90\x48\x38\x22\x06\xf8\x32\x83\x5d\xd3\xc3\x34\x68\xf4\xf8\xf3\x55\xd0\xa1\x13\x41\x07\xbc\x5e\x82\x74\x27\x2f\xae\xf1\xe7\xab\x07\xb7\x10\x73\x4b\x63\xe4\x0d\x40\xcf\x0e\xe9\xce\xf6\x4b\xa2\xa7\x04\xe3\xea\xb7\x26\xd1\x73\x28\xa5\x27\xaa\x33\xe8\xd2\xdd\x36\x5f\x42\x94\x96\xe4\x85\xa0\xb0\x9a\xcf\xbd\xdb\x3f\x89\xc5\x47\x58\x2f\xb7\xc8\x2e\xeb\x6c\x6d\x20\x7f\xc9\x5c\x5f\x55\xa9\x9f\xd9\x48\xff\xdd\xc1\xfd\x17\xfc\xa4\x6f\x56\xb5\x31\x75\x53\x59\x81\x01\xf8\x3b\xe7\x82\x9e\xc9\xff\x9f\x9d\x9d\x1c\xb7\xf2\x3f\xef\x7e\x7a\xfb\xf6\x8f\xfc\xcf\x3f\xe3\x67\x50\xee\x20\x56\x35\x99\x8d\xa7\x6d\xf9\x42\x34\xf8\x3c\x8c\x18\x4d\xbc\x1c\x68\xe1\xc8\xf8\xab\x0d\xa2\x02\xdd\xe9\x01\xd6\x92\xb0\x12\x49\xec\x1c\xfe\x7b\x93\xd5\x4d\x02\xdb\x0d\xb2\x3b\x2d\x49\x14\xd4\xb4\xdd\xc7\x18\xf1\x84\x50\x26\x48\x4b\x61\x11\x1a\xaf\xdd\x54\x0f\xca\x48\x50\x79\x5d\x2d\xb7\xc8\x1e\x99\xf1\x7f\x7b\xf3\xb7\xa3\xdb\xec\x8c\x0e\xce\x5f\xf3\xa8\xa4\x4a\x21\xa3\xd0\x68\x7c\xad\x67\xc3\x3f\xcf\x30\xe2\x08\xff\x73\x5e\x80\xe2\xdc\x09\xfc\xe3\x8a\x24\xef\xc2\x70\x36\xfe\x28\x74\x06\xf5\xae\xcc\xd6\xf4\x4f\x91\x1e\xc0\x36\x59\x51\x67\x25\xc8\xe7\x63\x12\x61\xdf\x22\x8d\x82\xc3\x4f\xa3\x3e\x9f\x1c\x39\x08\x9d\xc2\x87\x70\x9a\xf0\x8d\x59\x00\xf6\xf7\x83\x28\x12\x3a\xcb\xd9\xfe\x22\xaa\xbf\x6a\x15\x3a\x7d\x07\x47\x60\x97\xbd\x1a\x48\x89\xfd\xa7\x50\xd6\xb0\x33\x4d\x41\x7f\x61\xbd\x2d\x91\x0f\x1a\x3e\x29\x56\x68\x61\x04\x89\x2a\x47\x5a\xe1\x6f\x83\x9b\x51\xa0\x27\x6c\xe9\x9a\x51\x2d\x3d\x59\x4f\x62\x79\x01\x7f\x5f\xa7\x19\x1e\x91\xb6\x4f\xc0\xb4\x36\x76\x5b\x34\xa4\xd9\x28\xe6\xea\xc5\x28\x0c\x18\x64\xad\xf5\xbf\xea\x21\x88\x4c\x4b\xa6\x85\xf8\x91\x6e\xe5\x7a\xf9\x09\x84\xa6\x7b\x42\x41\x9f\xf8\x20\xb2\x43\xe4\x74\xe0\x70\x58\xa0\x98\x76\xff\x12\x86\x90\x1f\xb2\x2d\x51\x08\x52\x9d\x2b\x92\x3f\xba\x46\x83\xea\x05\x8a\xf6\x3c\xb0\xe6\x63\xdf\x31\x21\xc3\xde\xce\xf9\x8b\x54\xb4\x7c\xf6\xc3\x33\x8a\x1e\x31\x99\x42\xdc\xbc\xda\x00\x10\x19\xb9\xb6\x79\x5c\x66\x7d\x23\x01\x2c\x9c\xa4\xc9\x51\x6a\xd7\x9a\x44\xdb\xc5\xbd\x71\xb3\xe6\xd5\x40\x80\x29\xde\x14\x50\xa0\x43\x89\x99\xd6\x73\xfb\x56\x5e\xb6\x5c\x46\x3a\x84\x28\xb5\x90\xaf\xa1\x3e\x88\xd4\xf7\xb2\x82\x1c\x00\x3f\x16\xb0\x36\x90\x60\x79\x6d\x40\xa1\x1b\x55\xc6\xa9\xe2\x02\x59\x0b\x5b\xdf\x67\xeb\x95\xb9\x13\xf3\xe8\xb0\x69\x9d\x2d\xa7\xf0\x0f\xff\x3e\x66\x3e\x9e\x9b\xa0\x01\xeb\x06\x1e\xe4\x4e\x9b\x3c\xa8\x78\xaf\xa1\x22\x09\x60\x3e\x08\xbe\x94\x11\xf1\xe0\xe0\x09\xb9\xee\x9d\x47\x6a\xd5\xdb\x12\xcd\x75\x7a\x12\x40\xae\xdc\xbf\xd7\xa6\xa9\x81\x7d\x48\x28\x31\x52\x12\x5d\x6e\xf7\x6a\xa5\x27\x26\x2b\xf4\xcc\x7d\x67\x48\xba\x6b\x56\x5f\x35\xcb\x54\x1f\x7a\x19\x48\x90\xab\xae\xd7\xf0\x30\x32\xbe\xf2\x72\xb9\xb5\x0d\xeb\xa1\xc5\x5c\xaa\xa6\xb4\x5b\x28\x4e\x12\x71\xd7\xc5\x62\x5b\x67\x8b\xdd\xd1\xff\x12\xa6\xd6\xff\x94\x3f\xe9\x9b\x6f\x59\xb3\xa8\xd6\xff\x08\xdc\x27\xff\x3c\x6d\xff\xbd\x3b\x7e\x7b\xfa\xbe\x8d\xff\x39\x7b\x7f\xfa\x87\xfd\xf7\xcf\xf8\x99\xee\xc0\x43\x04\x8f\x0a\x57\xc2\x3e\x38\xe4\x49\x7a\xac\x94\x2c\x4c\xfe\xfe\x69\xe0\xfe\x75\x33\xbc\xd6\xdf\x06\x33\xa8\x26\xe6\x5a\xe5\x8b\xe1\xf4\x7c\x32\xfa\x34\xbc\xd0\x9f\x86\x57\xe3\x6f\xfa\xf0\x80\xff\x74\x70\xa4\x47\x53\x4d\x25\xe1\x8a\xe8\x07\xfb\x28\xd7\xf4\x74\x38\xd3\x97\xe3\xc9\xec\x8b\x1e\x5d\xef\x7b\x61\x4c\x59\xa1\xc2\x57\xf8\xb5\xf4\x97\x83\xa3\x14\xc8\xe8\xb8\x96\x95\xc9\xf0\x7c\x83\x47\xd7\x50\xb4\xfb\x75\x70\x7d\x3d\x9c\x10\xbf\xa0\x02\xf6\xc2\x73\x20\x93\xdc\xdb\x4a\x4f\x60\x07\xef\xc1\xb7\x8c\xae\x2f\x46\xe7\x83\xd9\xd0\xfd\x63\x42\x4f\x00\x3a\xc5\x4f\xdf\xdb\x2f\x02\xe6\x3e\x41\xc5\xd7\x2d\x81\xd6\x9f\xb0\xdc\x7c\x7c\x71\x8b\x1c\x89\xbe\x0e\x59\xb5\xea\x90\x8f\xa2\x2e\xa5\x7a\x74\x09\xad\xe1\xaa\x61\xec\xc8\xe0\xea\x8a\xdb\xdc\x4b\x74\x17\xf7\x27\xe1\x6f\x3f\x3d\x60\xa9\x52\x7f\xe3\x3a\x3a\xf1\x75\xa3\x1f\x85\x23\xdf\xae\x58\x63\x56\x5e\x70\x1a\x3a\xe0\x7f\xcf\x38\xce\xbc\xb1\x1f\x30\x74\xe0\x9a\x40\x26\x8a\x8c\x2d\x61\x0b\x5f\x59\x6e\xde\xf9\x9b\xf3\x7f\xfd\x57\xb8\x68\x2e\xab\xba\xa9\xb3\x92\xaf\xba\x5a\x71\xb9\x9a\x5b\xb7\x9e\x25\x83\x05\xdd\xb3\x5a\x94\x56\x8a\x17\x10\x7c\x4d\x9a\x10\xa4\x47\x08\x64\xfc\x09\xa5\xd3\x6c\x23\x20\xfe\xd9\xd2\xb4\x90\x46\x1e\x82\x36\xdf\x51\x8b\x01\xd0\x4c\x0a\x93\x91\x44\x03\x14\x3c\x9c\xe8\x83\x01\x02\x4e\xdc\x97\x6e\x50\xde\x00\x0b\xa1\x0f\x20\xd4\xf3\x41\x1f\x66\x47\x1c\xdc\x58\x40\x09\x17\x64\xf7\x69\xc2\xe8\x22\x86\xcc\x74\x55\x2b\x77\xf9\x53\x3e\xe3\x30\x3f\xf2\x0c\xf7\x2b\xcf\x08\xee\x75\xbb\xca\xea\xd1\x99\x07\xee\x59\xd9\xaa\x31\x21\x4f\x91\x60\x84\x53\x21\x98\x41\x26\x33\xe8\x95\x6e\xc8\x0f\xf3\xdc\xab\x59\x38\x4f\x84\x83\xa7\xeb\xac\x69\x28\x78\x23\x19\x2f\xd4\x98\x3d\xce\x73\xf0\x4d\xe7\x10\xc7\x0c\x8b\xa2\x5d\xda\x4a\xb9\x80\x24\x10\x84\x08\x22\x10\x29\x07\x1c\x3d\xd7\x9b\x35\x52\xfa\x03\x99\xfd\x0e\xe7\x7d\x63\x48\x28\x35\x25\x46\x50\xff\x3d\x46\x50\xf9\x18\x71\x6b\x04\xe1\x85\xcf\x0f\x5f\x5e\x22\x27\xe5\x57\x69\x8d\x27\xaa\xc9\x7e\x98\x32\xe2\x2c\x11\x6e\x1f\xae\xde\x68\x3c\x52\xb7\xc0\x4e\xf5\xc1\x39\xb3\xff\x57\xf5\x81\xc8\xf8\x85\x64\x22\xa1\x25\xb0\x41\x24\xe0\x8e\xb4\xde\x34\xd6\x96\x93\xf6\xf0\x57\x32\x11\xbf\xb6\x14\x77\x4f\xd2\x33\xf7\x2e\xac\x19\x76\xef\x3f\x10\x29\x9a\xd6\x02\x88\x7b\x26\xbc\x26\x4c\x26\x56\xab\xd6\xcc\xb2\xde\x48\xeb\x7b\xb4\x28\xb0\xb6\x1a\x0a\x7b\xc1\x60\xe6\x02\x7a\xa0\x19\xab\x56\xd0\xb6\xb7\xfa\xe0\xc2\x6c\x8a\x6a\xe7\x5b\x45\x4b\x2c\x88\x67\xb5\xa4\x99\x64\x57\xc8\xd9\x6f\xee\xb3\x12\x08\x9f\x61\x7a\x72\x2c\xdd\x85\xa2\x62\x93\xd5\x20\x2e\xbe\xe4\x04\x0e\x78\x75\x87\x93\x7f\xb9\x38\xe2\x56\xde\x30\xc6\xe9\x96\x64\xeb\x54\x3b\xb1\x26\x40\x94\x09\x26\xfb\x58\x22\x89\xdf\xb4\x6d\xb5\x92\xa6\x82\x9a\xaa\xfc\x2e\xe0\x15\xc4\x89\xfa\x90\x32\xfe\x0f\x4f\xbd\x6f\x36\x0d\xb8\x1f\x93\x7f\xb9\xe0\x84\x90\x6c\xa6\xc2\x66\x06\x31\x60\x94\x40\x91\x72\x28\x61\xec\x3a\x32\x52\x3d\xed\x9a\xef\x60\xfd\x63\xc9\x59\x84\x26\xa2\xcc\x23\xba\x2f\xb5\x5e\x67\x65\x09\x18\x81\x93\xf4\x9d\x3e\xb8\xca\xea\x3b\x53\xeb\x6f\x55\xfd\xc3\xaf\x5e\x92\x60\x85\xf3\x9c\x7c\x4c\xdb\x9a\xaf\xba\xb3\x0c\x14\xec\x10\xf0\x7a\x01\x7c\xd1\x42\x4a\xc4\x89\x17\x41\xeb\x9f\xbe\xd7\x07\xd1\xba\xc3\x66\xe0\x04\x2d\x31\x66\xa3\x9b\x2a\xd1\x4b\x53\x18\x0f\x52\xf4\x8b\x13\x2f\x11\xf7\x01\xd4\x34\xdd\xce\x51\xe5\xc4\xeb\xf3\x7a\x71\x79\x4e\x71\xc4\x5b\x05\x09\x08\x28\x1b\xd2\x3e\x11\xe2\x7d\xa3\xf7\xee\x9b\x3d\x0f\x10\x1b\x48\x3d\xb5\x81\xf4\xb7\x7b\x53\x52\xb1\x8c\xe5\xa8\xe1\x92\xe4\x46\x4d\x4d\xa4\x14\x50\x24\x93\xe8\x4c\xc9\x97\xe8\xdc\xe2\x15\xd6\x1a\x2e\x58\x2e\x72\xc0\x3c\x06\x06\x95\x2b\x56\x3a\x83\x07\x4a\xa9\x76\x39\xc3\x1f\xb9\xed\xee\x68\x77\xcf\x2e\xcd\x23\x16\x17\x79\xb9\x97\x18\xad\xa4\xab\x55\x28\x5c\x24\x93\x23\x04\x60\x6c\xd0\x66\x02\x4c\x27\xea\xc7\x20\x54\x4e\xbe\x16\x16\xc4\x4f\xfa\x20\x1a\x66\x5e\x97\xae\x9b\x58\xf7\x0d\xd6\xcb\x39\xd5\xfb\x78\x4a\xc9\xd0\x34\x62\x9b\x54\x1c\x89\xed\x42\xd8\xbd\xfd\xd0\xa3\xb8\xd1\x0e\x05\xe0\xfb\x94\x7f\x5f\xb9\xd3\xdb\xcd\x92\x8f\xf1\xed\xe6\xae\xce\x96\x58\x74\xce\x5c\x13\x28\x33\xeb\xd5\xd2\x3a\xef\x56\x4f\xbc\xdb\x0b\xa0\xfb\xf2\xfa\x80\xc3\x47\xe4\x1d\xa3\x8d\xf1\x21\x8a\x15\xfa\xb8\x7c\x33\x94\x54\x1d\x5a\x90\x7b\x85\xbf\xba\x96\x84\xcb\xba\x69\x15\xa6\x91\x6d\xb7\x44\x61\x24\xf8\x82\x1c\x65\xe0\xf9\xfa\x5d\x63\x09\x13\xfa\xb3\x3e\x90\xa7\x33\xcf\x27\x25\x9f\xa3\x83\x05\xa8\x25\xe0\x04\x24\x42\x38\x0a\x69\xba\x93\xf4\x3e\x07\x86\x04\x92\xc4\x82\xc7\x25\x7a\x03\xbc\x5e\xa6\x07\x84\xce\x91\x1d\xcb\x41\x6f\x7a\xe4\x2b\x78\xb3\x6a\xbf\x39\x2f\xdd\x0b\xc8\xe4\xd0\x8b\x6c\x93\x2d\x20\x1a\x65\x03\xcb\x5d\x9d\x30\xb1\xa9\x49\xf4\xda\xa0\x4c\x84\x08\x96\x29\xe6\x5c\x81\xeb\x00\x68\x52\x1a\x16\x55\xa3\x0a\x38\xd4\x00\xd9\x73\x6b\x1c\x86\xc6\xbb\x8e\xc6\xdd\x39\x0a\xc0\xb6\xbf\x6e\xb3\x02\xb4\x2b\x6c\x74\xeb\xc1\x58\xff\xa2\x0f\xc4\xcc\x49\x1b\xe1\x7e\xbb\x06\x4a\x62\x12\x3b\x0f\x75\x87\xbd\xdb\x47\x71\x9d\x8a\xdd\xe6\x8d\x87\xeb\x51\x0c\x3e\x8e\x63\x02\xcb\xa8\xdc\x34\xee\x4e\xf5\x81\xfb\x86\x8f\x18\x9b\x60\x46\x02\x4e\xaa\xc0\x11\xe4\x63\xd2\x42\x18\x9c\xcf\x3a\xbb\xa8\xf3\x4d\x43\xf6\x3d\xe8\x72\x42\x06\x9d\x96\x6b\x40\x17\x12\x57\x84\x88\xd6\x49\x19\xde\x43\xb1\xd2\x8f\x60\x90\x4e\x8e\xf5\xc1\xf7\x6a\x7b\xe0\xba\xec\xfe\x43\x18\x6e\x72\xed\xb9\x39\x24\xc8\x0b\xd9\x70\xa4\xda\x17\x50\x2c\xaa\x4f\xb5\xf3\xd2\x23\x65\xe0\x6b\x00\xdf\x6c\xbf\xcf\x1b\x27\x00\xa4\x84\xa7\x2b\xbe\x71\xa1\x93\x36\x41\xbd\x0d\xc2\x0c\xb8\x1d\x9f\x50\x11\x21\xbe\x93\x90\x23\x3c\x26\x28\x4a\xfa\xbd\xda\x52\x95\x81\x3a\xa0\xbf\xb4\x8f\xcf\x4d\xf5\xe8\xd6\x6d\xd7\xde\x00\xde\x5d\x40\x5a\xc2\xe7\xf0\x97\x24\xc3\xb2\xce\xca\xec\x8e\x34\xf7\xe8\x44\xc1\x46\x87\x4c\x98\xe0\x1c\x8a\x18\x3b\x90\x5c\x7a\x7e\x04\x8e\x4f\xcd\x1c\x42\xab\x7c\xd5\x80\x91\xbc\x00\x4b\xee\xdd\xf1\xff\x38\xd2\x44\xbe\xec\xc9\xd0\xb7\x8d\xbb\xcb\x61\x49\xd9\xfb\xac\xc6\xf3\x76\x6e\x4a\x43\x08\xdf\xe8\x81\xa2\x4d\x58\x32\x7e\xe3\xf1\xad\xb7\xd6\xd8\x8f\xfa\x3c\x64\x80\xfe\x45\x4f\x44\x69\x7c\xfa\x02\x3e\x47\xd5\x11\x0f\xa4\x23\x2f\xe6\x6b\x84\xe1\xf7\xcc\xe8\xcc\xf5\xe9\xee\x0a\x74\x4e\xa0\x04\x4a\x75\xb4\xfe\x98\x01\xa5\xd7\x40\x11\xe4\x8e\xed\x82\xa7\x9e\x2a\x27\xd0\x5f\x8a\xdc\x3e\xe9\xdc\xef\x73\x86\xa9\xb7\x94\xb8\xb2\x0a\xfc\x26\xbe\xff\x5a\x0d\x42\x89\xd1\x76\xb9\xc6\x69\x7a\xe2\x25\x31\x63\xdf\x32\x61\x7a\x49\x4f\x3b\xc9\xb0\xb5\x76\xea\x88\x5f\xa4\xf0\x45\xac\xd1\xc9\xe6\x7b\xcb\xb8\x12\x37\xc3\x7e\x7f\x41\x49\x7f\xa1\xd7\x53\x88\xab\x7f\xf3\x12\x69\xea\xe1\x44\x29\x17\xe6\x83\x52\x6e\xdf\x70\x81\x11\x71\x4d\x12\xba\x8b\x9d\x67\x22\x3f\x5a\x78\xfe\xb0\xd8\x4a\x8c\x92\x82\xca\x73\x66\x46\x3a\xe6\x4c\xd5\x4f\x23\x42\x44\xd7\x22\x32\x43\xe8\xfa\x9d\xce\x36\x1b\x03\x52\x53\x5d\x0f\x1d\x8d\x87\x1f\xc6\x6c\xdc\x60\xb8\x7d\x98\x79\x8a\x7c\x8f\x5c\x6b\xb7\x2d\x73\x9d\x22\x00\x95\x5c\x98\x84\xf7\x77\x1b\xf7\xe9\xde\x4b\x1e\xf4\x48\x68\xb8\xb9\x47\x75\x05\xfe\xbb\x6a\x19\x6e\xd1\xf5\x8b\xdb\x40\x96\x54\x7f\x8f\x84\xd3\xb1\x6f\xb4\xc2\x40\x50\x1f\x33\x72\xee\xfc\x0a\xea\xab\xe4\x65\x94\x5d\x13\x06\xe3\x0a\xc0\x02\x5e\x05\x75\xd6\x58\xaa\x8c\x0a\x4f\x84\x4c\x2b\xa3\xe6\xdc\x2e\x87\x53\x37\xd1\x41\x65\x3a\x00\xe8\xf1\x40\x26\x79\x6e\xf5\x3e\x55\xea\x70\x71\x04\x56\x3d\x28\x45\x21\x31\x59\x36\x77\xab\xd5\x64\x28\xe0\xba\x0b\xd4\xe9\x74\x15\xf8\x75\xd2\x1e\x4a\xd4\x76\x5f\x14\xf9\xe2\xc7\xeb\xc7\x3a\xdb\x10\x52\x93\x23\x6e\x24\xb3\x6c\x75\xb6\x5a\xe5\x90\xfb\x79\x30\xb2\xd8\xd2\x9d\xcb\xee\xbb\x79\x79\xa7\x88\x81\x74\x44\x7f\x3f\xd0\xf3\x6d\xd3\x60\x94\x82\x4b\x92\xd6\xc6\xb9\x54\xb9\x5d\x03\x43\x54\xcf\x7b\x29\xd1\xc8\xee\xf5\x92\xca\xb8\xb6\xd6\x23\x90\x9d\xdb\x12\xa7\x5e\xc1\x66\xb6\x51\x3e\xb4\xeb\x94\x2b\x5e\x53\x68\x26\x49\x23\xa3\xed\xfd\x1e\xb5\xd9\xfb\x92\x58\x33\x55\xc5\x63\xd1\x08\x31\x78\x67\x64\x18\x40\x97\xdb\x26\x6f\x20\xfa\xd2\xad\x4c\x95\xd6\xb8\x72\x67\x81\x73\x22\xf9\x3c\xdc\x5a\x53\xa3\x08\x5e\x28\x4e\x69\x9b\x92\x90\xed\x05\x47\x5b\xe7\x2b\xff\x2d\x41\x4a\x88\x0a\xd2\x6e\x7f\xb6\x8b\x61\x7b\xa0\x0a\xc1\x98\x3e\x4d\x4f\x7f\xdf\x31\x8b\xd1\x99\xa8\x9d\x89\xfa\xdb\xce\x3e\x06\xac\x11\xc5\x7c\xab\x9d\xb4\xfa\xb5\xbb\x08\x60\xef\x93\xc7\x4b\xb7\x51\x7b\xf3\xb7\x07\xed\x63\xeb\xa8\x59\x6e\xb1\x4e\xb0\x73\x9d\xe5\x82\xa0\x8d\x53\xc5\x90\x49\x4e\x28\x67\xea\x4e\x3b\xb7\x65\x86\xbf\x81\x86\xb7\x1e\xf8\x8e\xa1\xff\xba\xea\x75\x22\x8b\xa2\x2f\x28\x88\xc5\xc9\xde\x24\xf2\x81\x6d\x24\xac\x00\x73\xa9\xae\x77\x1d\xaa\x08\x8b\xe0\x16\x58\x2f\x59\x83\xea\x31\x10\xa7\x58\x62\x99\x23\x7c\x9b\x21\x8d\x60\x1d\x90\x5f\x89\x9f\xfa\x88\xe7\x87\x1f\x0b\xd0\x44\xdb\xd7\x60\x9c\x58\xb3\x8c\x5b\xee\xa9\x9c\x55\xab\x6c\x7b\x7f\x30\xa6\xed\xf6\x72\xd8\x8e\x4c\x1b\x6b\x1a\xb5\xaa\x6a\x00\xa6\xf8\xc9\x3e\xc3\x02\x92\x04\x13\xed\xd6\x4b\xc6\xbb\x9d\x46\x2b\xae\xb3\x3b\x50\x1d\xa1\x78\x30\xea\xf0\xe4\xf4\x48\xaf\xab\xb2\xb9\xb7\x21\x46\xc1\xc3\x01\xae\x40\x56\xd0\x63\x90\x65\x0d\x0e\x3c\x38\x52\x73\x7c\x97\xa9\x41\x9b\x47\xd1\x49\xba\x81\x9b\x0c\x0e\xda\x16\x22\xa5\x35\x7a\x4f\x8c\x9c\x0a\x82\x17\xe0\xec\x1e\x9a\xf4\x2e\x0d\x16\x1a\xd1\xad\x3c\x9a\xb9\xb6\x79\x63\x8e\xdc\x5c\x2d\x8f\xdc\x26\xff\x1e\xfa\xdc\x3e\x0d\x84\x03\x92\x48\xcf\x04\x7d\xb0\xb2\xd8\x25\x7e\xb2\x55\x38\x43\xdb\xab\x2a\xf1\x31\x76\x78\x2c\xe1\x3c\x42\x04\x91\xab\xc0\xda\x8c\xe6\x89\x8a\x56\xe3\x33\x1b\xb1\x87\x9b\x20\xac\x99\xb6\x19\xcc\x48\xa5\x8e\x8e\x88\x5b\xdc\x54\x27\x59\xe9\x6a\x0e\x66\x43\xfb\x4e\xfe\xa8\xd0\xc2\x30\xdd\x78\x04\x3b\xa7\x9d\xc6\x51\x89\x83\xc4\xc7\x61\x13\xbf\x83\xac\xf6\x63\xd9\x65\x88\x6d\x9b\x78\xd0\x8c\x2e\x13\xad\x8f\x4d\x61\x47\xcb\x4a\x03\x38\x8a\xe5\x86\x1f\x8c\xb4\xc5\x58\xcd\x48\xc4\xfe\x21\x7a\xfd\xc4\xee\x02\xc3\x2f\x9a\x88\x88\xfb\x94\x0b\x5d\x48\x18\xb4\x4b\x0a\x0a\x6c\xbd\x58\xf3\xa4\x28\xd6\x8b\xb9\x0a\x8c\x7c\x34\x18\x3a\xf1\x9a\xe1\xc4\x11\x79\x9a\x9e\xc1\x47\x43\x0c\x49\x56\xc0\xc3\x9d\x79\x07\x24\x02\x64\x1e\xdd\x03\x70\xec\x89\x6e\x2a\x3a\x0e\xc4\x09\xc1\x88\xaa\xbc\xee\x4d\x13\xf4\x4d\xa3\x35\x10\x1c\x6f\xee\x15\x0a\xdd\x3b\x57\x46\x67\xd6\x6e\x6b\x50\xa8\xd6\xc8\xc7\x1e\x68\x71\xa8\x41\x94\x8c\x68\x8d\x7a\x23\x9f\x8f\x61\x3a\x7f\x43\x78\xc5\x6a\xf0\x7c\xd1\xe5\xf1\x71\x8e\xa7\x2a\x64\x9d\xbd\x1a\x86\x93\xfc\xca\x27\xe7\x9f\xcd\x76\xac\x69\xcc\x99\x8d\x15\xf3\x52\x90\xd6\xa0\x6c\xd7\x1c\xd0\x79\xad\x09\xa3\x00\x83\x47\x33\xca\x24\x1b\x1e\x87\xa1\xad\xaa\xd3\x56\xe1\x6e\x13\xc3\x93\xbf\x9c\x01\x1c\x14\xc2\x16\x4d\x28\x57\x77\xbb\xcf\x4f\x21\x57\xa0\x0b\x4b\xd7\xad\x1b\x72\x6f\xdd\xd4\xac\x49\x8b\xdb\xcd\x71\x55\xda\x3c\xf4\xcf\x9a\xc5\xb6\x36\x62\xb8\x9e\x1c\xd8\xd2\x18\xb0\x1a\x51\xec\xa7\x47\x86\x1e\x93\x17\x0a\x93\x17\x2d\x49\x7a\x88\x8f\x53\xc5\x57\x53\xb9\x5b\xb0\x7a\xe4\xbc\x47\xeb\xc8\x8f\x4d\x1d\x54\xc8\x86\x73\xbf\xdb\x01\x4a\x2d\xc6\x14\xd3\x73\xb3\xaa\x22\x05\x71\x1c\x3d\xd5\x8a\x57\x9f\xa5\xf8\xd4\xcf\xb0\x2f\x40\x0a\x19\x44\xbb\x97\xa6\xe6\x78\x14\x19\xa7\xed\x69\x49\xe2\x4d\x44\x33\xa0\x28\x91\xd9\x17\x1b\x16\x33\x82\xc5\xd2\x71\xda\x18\x0d\x33\x4e\xfc\xa0\xbe\xef\x13\xb2\x11\xda\x07\x0c\xc2\x11\xba\x37\x42\x20\xfc\xd6\x27\x67\xf7\x30\xa4\xf2\x68\xee\x8e\xa8\xa6\x87\x53\x9e\x10\xcd\xa2\x23\x2c\xe9\xa6\xa2\xf7\xdb\xb1\x1d\x4e\x13\xbc\x6d\x55\xd7\x6e\xe3\x33\xc7\x66\x6e\xd1\x2e\xaa\x0d\x6d\x59\xb4\x20\x33\x1b\x02\x22\x7e\xf4\x91\xd3\x86\xec\x1a\x0b\x56\xac\xfb\xca\x69\x7a\x9a\x2a\xf5\x36\xd5\x22\x4f\x66\x53\x6f\x82\x33\x49\xb6\xfc\x33\x06\xc2\x98\xed\x24\x3a\xf6\x80\x35\x82\xb9\x5f\xfe\x96\x44\x59\x1f\xc8\x16\x5f\xa9\xbe\x79\x65\x2d\xb7\xbf\x0b\xcf\x26\x0c\x2b\x11\xd5\xfb\xb6\xc2\xa8\x4f\x5a\x66\x25\xa0\x06\xd1\xeb\x85\x3d\xb0\x46\x4d\xff\xf6\xeb\x6b\xd0\xdb\x5b\xe5\x10\x89\x64\x86\x86\xb6\x59\x07\x17\x1a\x1e\xfb\x22\x39\xfc\x2e\xd5\x57\x81\xbd\xc6\x9d\x6d\xb4\xb0\x7c\xbc\x74\xe8\x5d\xea\x70\x4d\x81\x03\xb9\x94\xb6\xe6\x69\xe2\x2e\x65\xbe\xde\xe0\x09\x0c\x25\x60\x90\x25\x06\x03\x8a\xdc\x1d\x2f\x20\xc6\x1b\x68\x35\x44\xb8\x2e\x2f\x53\x15\x2f\x17\x0a\x0c\xc9\x39\x86\xe9\xa5\x31\xf1\x89\x35\x20\x78\x90\xe7\x11\xda\xad\x9c\xce\xc1\x1b\x9c\xfe\xe1\xbe\x8f\x9b\x94\xca\x02\xe0\xf0\x74\x97\x44\x6d\x08\x48\xfe\x3e\xd5\x83\xf0\x64\x10\xcc\x14\x4b\x0b\x65\xa7\xb9\x04\x37\x60\xae\xef\x5d\x2b\x81\x02\x0a\xec\x24\xcf\x12\xb0\x4b\x14\xd1\xd3\x61\x52\x62\x5d\x02\x19\x78\x2d\xee\xa2\x16\x87\xc0\x9b\x90\xcb\xc3\xcd\x0b\x07\x97\x75\x1d\x54\x41\xa6\x8e\xd7\xc0\xe1\x41\xbb\xb1\x07\xc0\x7d\x48\x78\x09\x88\xdc\x86\xd0\x49\x3b\x3f\x9d\xea\x2f\xac\xef\xc2\x3d\x44\x31\x4d\x00\xaa\x54\x94\x50\x77\x06\xdc\xdc\xdc\x67\x00\x60\x86\x23\x13\x7e\xdd\x73\xef\xa0\x3d\x05\x71\x20\xff\x95\x60\xa0\x75\x0d\x85\x34\xac\x7b\x32\x47\xa3\x50\xcf\x2b\xab\x82\x29\xe8\xad\x33\xd8\x39\xed\x5e\x4b\x4b\x4c\x4b\x4b\xcc\x87\xa8\x14\xdf\x9a\x68\x5a\x55\x3c\x1d\x70\x84\x99\x15\xd0\xb9\x94\x4b\x28\x0f\x88\x2c\x0a\x08\x96\x49\x93\xe2\x3e\xab\xd7\xce\x0a\x55\x9e\x2a\xc1\x4f\x65\x5e\x2e\xb6\x75\xed\x61\x30\xac\x59\x67\xad\xa9\xa1\x36\xed\xce\xd9\xb2\x8d\x18\x0f\xe8\x8b\x34\xe4\xe6\x9e\x31\x9f\x9c\xcf\xde\xde\xa6\x4a\xfd\x94\xea\x5f\x5b\x55\x88\x7e\xeb\x8a\xc5\xfe\x02\xed\xfd\xce\xb9\xd2\xa3\xb2\x1f\x49\xdc\x7b\x99\xef\x5e\x9d\x7b\xd5\xd6\xb9\x1f\x97\x8b\x76\x80\x33\x90\x94\x7b\xfa\x1a\x5f\x04\xe9\x2e\xc9\xc5\xb6\xc8\xea\x20\x38\xdf\x76\x89\xfd\x6e\x14\x05\x8e\x54\x46\xbd\x4f\xa2\xc2\x8b\x65\xf2\x77\x41\x1a\x31\x6c\x67\xf7\x75\x18\xea\xb8\xa1\x3d\x8f\xc3\x49\x99\x5b\xf3\xd7\xad\xdb\x92\x51\xad\xa6\x18\xc4\x48\x07\x94\x51\x71\xd7\xb4\x31\xc3\x6d\xcc\x27\x60\x66\x95\x37\x02\x51\xcd\x15\x82\x44\x22\x06\x15\x4c\x80\xa6\x8a\x0f\x79\xbc\xef\x96\xc2\x38\x51\x21\x36\xf5\x73\x24\x93\xa4\xc7\x13\x3d\xbd\xbd\xb9\x19\x4f\x66\x5c\xfe\xda\xf2\xe3\xc8\xe3\xea\xab\x86\x52\x9b\xda\xbc\x26\x20\x84\x33\x4f\x1a\x63\x1b\x83\x6a\x0f\x6e\xcb\xaf\xb6\xa8\x90\x62\x1b\x2a\x7e\xb0\x4f\xbf\x42\x11\x53\x09\x81\x10\xb6\x05\x31\x8a\x00\xab\xd3\x96\x12\x4b\x45\x85\xb5\x30\xcb\xac\xc9\x88\x3f\x18\x9d\x4d\x54\xd3\x2f\x0c\x14\xb5\xab\xd0\x6a\xc2\xd7\xe7\x86\x4e\xed\x17\xf9\x58\xa1\xe2\x3a\x32\x24\x93\x3d\xf7\x27\x24\x01\x31\x84\x44\xc7\x20\x0a\x3e\x34\xee\x5a\xaa\x73\xfb\x03\x74\xcb\xd5\xf9\xf8\x57\x10\x9d\x3e\x1f\x5f\x80\x58\x3c\x29\xb2\x5f\x78\xb1\xa9\xc1\xf5\x45\x47\x8a\x3d\xd1\xb7\x37\x9f\x27\x83\x0b\xd4\x1b\xa2\xb9\x52\x42\x9f\x1d\xbe\x45\xb8\xe2\xf0\x9f\xaf\x58\xad\x7e\x3c\x39\x9c\x1e\xe9\xc3\xf3\xf1\xd5\x15\x2a\x9a\x5f\x7d\xd7\x93\xe1\xe5\x70\x32\x01\x95\x6c\x35\x98\xea\x03\xfc\xca\x01\x08\x14\x81\x98\x0f\x92\x3a\x03\x32\x78\x3a\x24\xe5\x9e\x9f\xe1\xe9\xbf\x1c\xc1\xff\x0d\xae\xae\xf4\xf9\xf8\x1a\x71\xbb\xe3\xc9\x94\xe5\xaa\xae\xbe\x2b\x56\x99\x82\xcf\x08\x79\x2c\x52\x1e\x0f\x38\xdd\x3e\x8d\xab\xdf\xab\x27\xdf\x79\x78\x8f\x86\x55\xe2\x46\x6d\x3a\x98\x8d\xa6\x97\x83\x73\x10\xef\x22\xc9\xf8\xc4\x7d\x38\x52\xb7\xea\x61\xb8\x86\x0f\xa1\x58\xf8\x39\x3e\xea\xdf\x6f\x47\xc3\x99\x1e\x5e\xff\xdb\xf8\xfb\xd7\xe1\xf5\x2c\x81\x81\xb9\x1e\x5f\xb3\xb6\x95\xfb\x25\xe2\x94\x3b\xf2\x56\x62\xbe\xd4\x70\x70\xfe\x45\x8e\xa5\xbe\x18\x83\x64\x97\x5f\x02\x7a\xf0\x79\x30\xba\x9e\xce\x50\x18\xea\x72\x38\x19\x5e\x9f\x0f\xbd\x88\xfd\x24\xb4\x80\x81\xcf\x72\x9d\x25\x20\xc8\x05\xbf\xbe\xbc\xbd\xa6\xa9\x74\x6f\x43\x81\x73\x82\xa5\x47\x2b\xf3\xdb\xe8\xea\x4a\x7d\x1d\x0e\x67\xf8\x78\x52\xa8\x77\x2f\x98\x8a\xa7\xa1\xc6\x39\x29\x35\xf5\x3e\x43\x7f\x1a\xea\xdb\x6b\xaf\x66\x35\xbc\x50\xe3\x89\x1e\x4e\x26\xe3\xc9\xeb\xcb\xc9\x10\x55\xa6\xe0\x71\x28\xb6\x3f\xdd\xdb\x18\xf7\x20\xd2\xd2\x1f\x5e\xc0\xf1\x35\x9e\x0c\xae\xdc\xd3\xbe\x4d\x46\xb3\xd9\xf0\x5a\x6a\x62\x81\x76\xd5\xc5\xaf\xa3\xf3\xa1\xfe\x3c\xfa\x75\x08\xd8\x73\x1c\xed\x44\x0f\xfc\xb8\xdf\xce\xbe\x8c\x27\xa3\xff\x6b\x78\x11\xc9\xa0\xfd\x0a\x92\xf3\x28\xad\x1f\xe6\x03\xf5\xc5\xce\x27\xc3\xc1\x6c\xa8\x07\x7e\x63\xa6\x94\x2c\x96\x54\x85\x7d\x51\x0e\xae\xf8\xe2\x32\x20\xa6\xc2\x61\x12\x92\x4d\x70\x41\x75\xb9\x5d\x14\x26\xab\x05\xef\x70\xa2\xb3\xbc\x5e\xd4\xd9\xaa\x51\x65\xf6\x40\x76\x61\x22\xaa\x0b\x81\xb6\x01\x28\xe8\x2d\x1e\x4f\x39\x28\x9c\xac\x56\xf9\xc2\xa3\x0e\xd6\xd9\xe2\x1e\xe0\x81\x4c\x78\xa4\x00\x00\x0c\x51\x6e\x3c\x5b\x7b\xe3\x3f\x78\x06\x17\x26\x03\x93\x76\x69\xb2\xe6\x3e\x09\x2c\x75\x48\x05\x95\xa0\x1c\xca\x03\x30\x26\xde\xef\x2c\x30\x0a\x02\x9c\xf6\x21\xaf\xab\x92\x28\xdd\x90\x2c\x2a\x55\xea\x97\xbd\x92\x6e\xa9\xa6\x42\x8a\xe1\x9f\x67\x6e\xe3\xb8\x0d\x70\x33\x19\x7f\x19\x7d\x82\xbd\xff\xe9\xbb\xbe\x1a\x7c\x73\xc7\x83\x9b\xff\xe1\xaf\x6e\xb9\xe3\xc4\x70\x49\x45\x77\xe2\x82\x1c\x1c\xeb\xbb\x5d\x8c\xdc\x22\x4a\x7a\x75\xde\xd4\xe8\x9a\xff\x1c\x4b\x8d\x79\x8d\x35\xaf\xfb\x26\x0f\xdf\xc9\x08\xea\x1f\xdc\x91\x3d\xbe\x74\x9f\x9d\x0c\xaf\x06\xb3\xd1\xf5\x67\x2c\x0c\x19\x4d\xbd\x18\xe9\x78\x82\x1b\xea\x16\xff\x7b\x74\xcd\xfc\xfa\xb3\xb1\xaf\x4d\x88\xb7\x2e\x0b\xed\x8d\x27\x6e\xb8\x94\xd7\x60\xfb\xf6\x65\x88\x62\x76\xd7\x17\x43\x77\x5a\xcd\xbe\x0c\xdd\x71\x36\xbe\xc4\xee\x0f\x5c\x1f\xc2\xfd\x31\x1b\x4f\x66\xb2\x3e\xe3\x7a\xf8\xf9\x6a\xf4\xd9\x1d\x22\x47\x89\xc2\xa2\x8c\xd9\x34\x4c\x84\xef\xef\xb7\x91\xdb\x33\xa4\xf7\x26\x86\x79\x7a\xdb\x3a\xb0\xbe\x0c\xa6\xfa\xd3\x70\x78\xfd\x94\x26\x9c\x3b\x7a\xdd\xf7\xbc\x6e\x1b\x1e\x96\x33\x77\x8c\x4d\x67\x83\xeb\x0b\x16\xa1\xbb\x1c\x8c\xae\x6e\x27\x43\x77\x96\x0d\xa7\x53\x9a\x02\xaf\x2f\x78\x49\xd2\x85\x5f\x87\x17\xdf\x5f\xa6\x2f\x17\x96\x9b\x92\xcb\xed\x39\x7d\xb9\xa7\x26\x3d\x51\x53\x3f\xb5\xfb\x25\xe6\xbe\x8f\x6f\xc1\xbb\x2f\x2b\x50\x5b\x60\xb5\x24\x1f\xd4\x20\xc8\xa9\x30\xf6\x5f\x59\xdd\x54\x6e\xbb\xb4\xe3\x92\x98\xb8\x29\x78\x1f\xc5\xf1\x1b\x4f\x29\xa4\x7c\xcc\x6d\xbe\x93\xe6\x61\x91\x3d\x1e\xf5\x04\xaa\x20\x47\x6e\x30\xbb\x95\xad\xab\x2d\x46\x30\x57\xf9\x83\xd1\xf7\xdb\x72\xe9\xce\xaf\x65\x55\x14\x59\x6d\xf5\xe1\xff\xfe\xee\xf8\x38\x3d\x3e\x06\x5c\xd6\x71\xaa\x67\x5e\x4f\xa9\x55\xec\xd2\x62\x09\xf4\x0c\x81\x56\x66\x61\x83\x1a\x93\x6a\xa9\x31\x1d\xe0\xe0\x1c\xb0\x99\x45\xbd\xdc\xab\xde\x34\x37\x45\x55\xde\x41\xc8\xaf\x62\xf7\xfe\x70\x51\x41\xd8\x2b\x7f\x30\xc5\x8e\x9f\xa8\xbf\xba\xaf\x1f\x00\x78\x89\xb1\xd7\x5e\xf4\x29\x7a\x68\x78\xa6\xa2\x0f\x8a\x09\x3a\x94\x65\x04\xfc\x4c\xb0\xe2\xe5\x6b\xdc\x03\x3b\x9f\x53\x64\xa6\x12\x48\xee\x29\x81\xa9\xb8\x9c\xbf\x83\x06\x51\xf0\xf8\x5e\x58\x7e\xe0\x1e\xd9\xd4\x79\x55\xfb\x12\x6b\x41\xc2\x19\x5c\x4d\x34\x6e\x7d\x33\x01\xe6\x1e\x56\x8d\x9b\xe9\x93\x54\x8f\x19\xbc\x95\xea\x16\xfe\xaa\x13\x93\xee\x0b\x85\x76\xf2\x12\x88\x4d\x41\x01\x74\x8e\x0b\x35\x79\x43\x16\xb3\x90\x6f\xe7\x40\x4a\xa7\xe0\x01\x71\xad\xf3\x9d\x6a\xbb\xca\xde\xcd\xfd\x5b\xdf\xd1\x53\x44\xd3\x5b\x6a\xc1\x6f\x86\x40\x7e\x4f\x38\xe3\x90\x16\x5b\x1c\xb6\x3a\x38\x42\x37\x05\xf3\x6a\xb4\x4c\xa2\xc7\x82\xfb\x4c\xf5\xd0\x2d\xf2\x19\x1c\xf2\x36\xe8\x47\x3a\xf4\x89\x06\x15\x83\x4e\xe0\x2a\x11\xbe\x2c\xc7\xca\x5d\x13\x54\x6f\x13\xfa\xe6\x0e\x7b\x19\x18\xc8\xd0\xed\xa4\x35\x59\x59\x0f\x4a\xe7\x02\x27\x71\x0c\x00\x14\xd1\x07\xc7\x08\x84\x21\xb8\xb7\xd6\x1a\xf2\x58\x05\x29\x63\x9f\x46\xf2\x9b\x6e\xe5\x9d\xa6\x27\xd1\xaf\x5a\x25\x75\x94\x93\x6f\x11\xfa\xfa\xa4\x08\x8e\xa8\x97\xe6\x24\x84\x44\x3c\xb4\x0c\x6c\x61\xd5\x08\xcc\x0c\xf7\xf0\x07\x7b\xc4\x12\xe2\xb4\xbb\xb0\x40\xff\x1d\x67\x46\xc1\x2c\xa3\xf4\x27\xd7\xa0\x9c\x1d\xeb\x65\xb6\x03\xa7\x75\x6e\x16\xd5\x1a\xb0\xb7\x50\xf3\xc7\x78\x48\xfc\x3c\x61\x2b\xf2\xf5\xda\x2c\xf3\xac\x71\xa7\x17\x99\x88\x78\x7d\x30\xb1\x42\x5e\x2f\xb6\x6b\x0c\x13\xbb\xa3\xc2\x2e\xea\x7c\x1e\xc7\x60\x4f\xce\xd2\x77\x87\xf3\xa3\x8f\xaa\xaa\x11\xa3\xf0\x82\xae\xc3\x3a\x82\xae\xe6\x6b\xa3\x97\x5b\x8f\x2b\x74\x5d\xe7\x60\x86\xf2\x8b\x03\x10\xcf\x58\xc0\xa1\x33\x7c\xab\xbb\xa3\x28\xee\x1a\xa5\xc5\x24\xbb\x02\x24\x57\xea\xca\x5a\x85\x49\x38\xc8\x36\x80\x4a\x13\xfc\xfb\xa8\x27\x22\xd6\x8e\x10\xc2\xea\x38\xd5\x43\x64\x75\xaf\x56\xf1\x3a\xb9\xdd\x38\xaf\x3c\xfc\x06\x63\x43\x21\xc4\x27\x06\xd7\x36\xd5\x06\xb2\x61\x2b\x62\x5b\x8a\x32\x1c\x5d\x74\x53\x12\x57\xfa\x44\xb1\x7e\x1f\x95\x32\x5d\xbc\x1c\x98\xce\xb6\xa9\xab\x5d\x0b\x7f\xd8\xf9\x34\x57\xd5\x29\xcf\xc8\x5d\x59\x6b\x88\x8e\xc0\xe7\x65\x52\x3d\x28\x0a\x51\xb1\xe5\xa9\x32\xba\xcf\xba\xcf\x1e\x8c\x62\xf1\xbf\x8d\xa9\x8b\x9d\xdf\x2c\x78\x41\xb8\x6f\x86\xc1\x22\x0b\xc5\x6e\xeb\x07\x40\x64\x95\xbb\xe8\xaf\xad\xc5\x9f\x22\xdf\x9e\x48\x8b\x27\x94\x1d\xc9\x6b\x64\x23\x34\x09\x83\xe7\x50\xe5\x12\x20\x3e\x38\x6f\x73\xb3\xab\x4a\xc4\xd9\xc4\xaf\x88\x0f\x92\xa8\x41\x12\xfa\x32\xc7\xf5\xeb\xa5\x54\xdd\xfd\xcf\x59\xa1\xb3\x44\xbf\x4b\xf4\xcf\x89\xfe\x25\xd1\x27\xc7\x89\x3e\x39\x49\x34\xac\x19\x37\x1b\x27\x67\x70\x5f\x63\xda\x92\x03\x97\x44\x75\x4b\xd7\x0d\x62\xd3\x56\xc4\x1b\x61\x4a\x4b\xd3\x1f\x85\xeb\xd9\x12\xe3\x00\x60\x55\x37\x8c\x75\x85\x55\x8e\xe4\x2a\xd0\x21\xee\x9f\x33\x29\x64\xe7\x72\x20\x7f\xa8\x6a\xe4\xf1\x42\x8c\x06\x4b\x05\x53\x22\x61\xff\xd0\x28\x6e\x3b\xef\xe6\x4d\x6d\xfe\xb2\x5d\xe6\x8b\xb8\x1b\xda\x73\x61\xd6\x66\x6d\x90\x05\x92\xcb\x7a\x48\xe9\xd1\x8d\xc8\xd7\xdc\x2e\x4c\x51\x64\xa5\xa9\xb6\x50\xc6\x78\x96\x9e\x48\xfe\xba\x61\x09\xf8\xec\xba\x2f\x82\x07\xac\x44\x07\xa2\xa2\x23\x6f\xcc\xfa\x00\x8a\xe5\x00\xc5\xb7\x74\xcb\xf9\x72\x30\xd1\xa7\xe9\xc9\xf1\x49\x2a\x1f\xeb\x35\xce\xb0\xb3\x44\x88\x89\x54\xb2\x74\xb8\xd3\x11\x18\x7b\xd4\x04\xbe\xc1\xea\x59\xa0\x70\xe3\xd4\xc8\xd6\xba\x93\xae\xce\x8b\x9d\xc0\x93\x54\x82\x2b\xa4\xd5\xae\x78\x41\xc3\x2d\xc3\xcf\xd8\x89\xaa\xe6\x90\xd9\x2e\xdb\xed\x44\xca\x5b\xaa\xe2\xce\x85\x4e\x50\xcf\xf4\xba\x51\x70\x2b\xf1\xe4\x44\x1f\xce\xfc\x63\x2e\xb2\x06\x4a\xc3\x96\xf8\xb7\x53\x7d\x78\x4e\x25\x5a\x5e\xf6\x9e\x84\x09\xdc\x9a\xbc\xf0\x54\xe9\x6e\x2e\x2f\xcc\x8a\xa2\xcb\xf5\xe2\x3e\xb3\xc6\x26\xfa\x02\xc6\xfa\xdd\x69\x7a\x7a\xfa\xd3\xeb\x9f\x8e\x4f\xde\x89\x77\x29\x20\xe5\x7b\xfd\x1a\x78\xf9\xa8\x6b\xa3\xc6\xac\x51\xf9\x40\x9f\x9e\xfe\x94\xfe\x74\x7a\x7c\xfa\xfa\x4c\x1f\x4e\xfc\xf8\x8b\xcf\x72\xc3\x3c\xa2\x13\x8d\xd1\xd6\x2f\xf5\x85\x04\x36\x1d\xa5\x7a\x00\xe3\x90\x97\x77\x85\xb3\x57\x8a\x42\xdf\xa6\xd3\xb4\xb5\xbe\x14\xac\x2f\x9f\xe4\xef\x64\x64\x7b\x66\xdb\xe3\x53\x7c\xc2\xd0\x2d\xdc\x53\x3d\x11\x4a\xc8\x6e\x90\x6e\x30\xcf\xde\xb2\x22\xa4\xd9\x05\x38\xd3\x7a\x8b\xe5\x7c\x58\xdf\x5b\xde\x29\x77\xb7\xf5\x89\x28\xc7\x0a\xca\x91\xaf\xc2\x90\x28\x2c\x2c\xe1\x02\x1a\x77\x3d\xb0\xd0\xb2\xfb\xf8\xba\x2a\xef\xdc\x09\x9f\xec\xbf\xe7\x02\x92\xda\xb7\xd3\x97\xf2\xa9\x20\x81\xd2\xd4\x59\x2d\xaa\x3b\x7c\x70\x1b\x8e\x62\xc8\xb2\xf2\xe5\x85\x88\x74\x84\xcf\x4a\x20\x0a\x8c\xd9\x99\x1e\x09\x36\xa1\x8b\x80\xc6\x77\x87\x65\xbf\x2c\x35\x34\x2b\x5f\x6f\xb2\xbc\xf6\x3e\xad\xea\xf6\xe3\x95\x0d\x39\x0c\x9a\xdb\x24\x40\x1a\x08\xf7\x9f\x20\xbb\x12\x34\xca\xb3\xbf\xc2\x09\x9c\x37\x09\x8a\x06\x36\xdd\xe2\x77\xdc\x89\xa8\xba\x55\xd5\xc1\x7d\x82\xab\x8f\x50\x09\x1e\x60\xa0\x04\x78\x9a\x99\x8c\xac\xce\x30\x66\x16\x98\xbb\x91\x82\xc8\x50\x9d\x4e\x0b\x66\x2a\x72\xf9\xce\xa5\x78\xe2\xed\x3e\x79\xca\xfd\xf3\xb0\x09\xea\x4c\xd4\x11\x9c\x83\xb7\xfa\x5b\x96\x3f\x98\x1a\x6a\x60\x08\xcb\xec\x4c\x9a\x4b\x8a\xd0\x3d\x0d\xb0\xaa\x58\x5f\x5a\x3d\x2d\xd6\x2d\x57\x3d\xc9\x88\x67\x28\x4d\x0e\x65\xff\xab\x2d\xac\x69\x7a\x16\xd0\x47\x72\xc6\x2c\x5a\xe7\xfe\x05\xa9\x1e\x94\x3b\x54\x90\x76\x77\xcc\xdd\x96\xea\xbb\x30\xcb\x4e\x87\x21\x8e\x8a\x42\xf2\x88\x20\x7f\x9c\x85\x52\x24\x2f\x5f\x2d\x76\x22\x99\x82\x00\x37\xad\x91\x5d\x80\x5b\xaf\x84\x5c\x7c\x5c\xc6\x78\x96\xbe\xd3\x53\x90\x46\xc1\x08\x4a\x0a\x15\x55\xa3\x95\x27\x99\xa2\x6c\xaa\x7b\xf7\x16\x4b\x5b\x69\xce\xcb\x26\x22\x87\x57\xab\xbc\x5c\xda\xa7\xa5\xcf\x13\x51\x62\x1d\x72\x41\xa8\x6b\x1c\x0b\x9c\x63\xa1\x5e\xeb\x41\x26\x9e\x95\xb9\x1f\xf7\xe5\x53\x62\x00\xa8\x4a\xa3\x6c\x05\xc5\x26\x15\x5b\x54\xe0\x28\x2c\xaa\xb2\x5a\xe7\x0b\x2a\xbf\xa2\x8a\x21\x94\x3d\xe7\x57\x12\xe8\x28\x09\x5e\x14\xd8\x66\x4b\x53\xf7\xc0\x46\x25\x69\x6c\x5e\x42\x46\x4f\x43\x0b\x31\xc1\x05\x6f\x4e\xa1\x6c\xec\xba\x6a\xdc\x9e\xe1\x52\x30\x12\x8a\xa9\xcd\x5d\x85\x3a\xd1\xab\x56\x44\xca\x8d\x05\x20\xbf\xad\xac\xf4\xb0\xe8\x85\x39\x1f\x13\xb3\x87\xb8\xe9\x59\xbf\x07\xfd\x17\x74\xce\xb8\x3a\x41\x07\x34\x10\x1f\x11\x67\xb8\x21\xc1\x6d\x42\x0c\x64\xac\xbd\xee\x3a\xda\xe6\x80\xe5\xa7\x24\xbd\xa7\x5c\xf0\x1a\xbc\x57\xe9\x61\x04\x58\x53\x21\x3e\xe2\x9c\x70\x1e\x34\x2e\xa9\xd8\xe7\x1c\x74\x3d\x03\xd7\xb8\xbc\x09\x0c\x1b\x4f\xfb\x02\xb0\xe2\xdf\xeb\x8b\xdc\xba\x2b\x58\x4f\x8c\xad\x8a\x6d\x13\xf6\x65\xde\x50\xca\x20\xe0\x29\x97\xf4\xd9\xda\x7f\x56\xd3\xdd\xa4\x98\x9a\xc3\x07\x52\x0a\x02\xc2\x56\x7d\x66\x79\x93\xfd\x30\x24\x87\x40\x56\xda\x75\x05\x9e\x54\xe9\xda\x03\xf3\x09\xf5\xbb\x59\x91\xaf\xaa\xba\xcc\xb3\x70\xa7\x89\x97\x10\x0a\x83\x43\x54\x6c\xac\x71\x96\x21\xda\x92\x0c\xd2\x7b\x30\xb8\x20\x11\x9b\x07\x20\x24\x74\xc5\xcd\x12\x88\x22\x61\x6b\xdb\x40\xca\x96\x35\xbe\x45\x51\xd5\x43\x37\xb0\xe2\xac\x5b\x21\x7e\xc4\xf3\xf6\x32\x2d\x7b\xc5\x90\xab\x48\xcf\x5e\x47\x7a\xf6\x3a\x97\xf8\x29\x12\x16\x59\xe2\x3c\xfe\xa4\x87\x98\x32\xf6\x92\xe5\x1f\x75\x24\x75\xd1\xb2\x60\x64\x75\x0c\xae\x72\xf7\x6d\x01\x91\x61\x9b\x43\xec\xfb\xbe\xaa\x8f\x36\xf5\x0a\x13\x1e\xcc\x64\xd9\x95\x3f\xa1\x9f\x52\xd7\xa0\x71\x9a\x36\x50\x77\xcf\x27\x0c\xfc\xd3\xb9\x8f\x72\x29\x50\x85\x16\x4c\x0e\xf3\xd3\x87\xbf\xc3\x11\xb1\xa8\xca\x05\x75\x7e\x51\x95\xab\x02\x0e\x08\x67\x5c\x81\x0c\xca\x37\x49\x5f\xa3\x8b\x6a\x91\x09\x79\x64\x38\x69\xa9\x54\xe8\xdf\xb7\x66\x6e\x16\x89\x3e\xcf\xca\x6c\x99\x25\x2d\x06\xa6\x05\x50\x14\x2a\xa2\x69\xfa\x00\x2b\x80\xc7\x2a\xac\xcd\x55\x0e\xb6\x04\xe6\xf7\x88\x0c\x92\x18\x1f\x19\xb1\x1e\x79\x67\x0c\xf4\x6c\x43\xfd\x2d\xdc\xbb\x70\x9b\x41\x5b\xbd\xce\xff\x95\xb1\xfe\xb5\x55\xd9\x68\xf3\x5b\x7e\xf7\x5f\xff\xa9\xff\xba\x35\x0a\xd0\x82\xff\xf5\x9f\x96\xf1\xef\x75\xd6\x68\xe3\xe6\x6e\x6b\x75\x61\xac\x78\xf6\xa2\x2a\x4b\xf3\x9b\xb1\xda\x56\xc8\x49\xf9\x5f\xff\xb9\xcc\xff\xeb\x3f\xad\x36\xa5\xce\xca\xbb\x22\xcb\x6d\xaa\x86\x7f\x86\x9c\x9a\x1e\xa4\x4a\x1d\xdc\x30\xfe\x3b\x68\x68\x1f\x2e\x8e\xf4\xc9\x2f\x3f\x9f\xbd\x3e\x3d\x3e\x3e\xa5\x5d\x9a\xe8\x51\xb9\xc0\xc0\x03\xf9\x05\x13\x63\x4d\xfd\x00\x2b\x17\xd6\x24\x54\xed\x78\x74\x7e\x27\x9a\xea\x8e\xe5\x0e\xf8\xb3\xf5\x29\xab\xc8\x31\xf3\xa1\x59\x3e\x03\x5b\xd2\x7f\x2f\xe6\xe9\x52\x27\xe9\x31\x89\x1e\xd2\x5f\x5e\x1d\x05\xec\x9e\xb3\x82\xbc\xdc\x37\xb4\x9f\xd6\x24\x92\x0a\x01\x1b\xf7\x22\xd0\xa0\x7b\x0c\x8d\xfe\xf4\x9d\x48\xcf\x20\x07\x74\x39\xba\x02\x96\x34\x3d\xf8\x3c\x19\x0e\xf5\x6c\x0c\xc0\x87\x97\x10\xad\xa9\x41\x44\x99\x7a\x15\xd0\xd3\x3d\x22\xbb\x9d\xf8\x74\x8b\x06\x85\xd8\x26\x01\xc6\x14\x2a\x43\xb2\x46\x3f\x3e\x3e\xa6\x16\xf1\x46\x8b\x6a\xfd\x86\xb5\x15\xea\x37\xd5\xc6\x94\xc8\x31\x46\xaa\x01\x3d\x31\xf0\x22\xc8\x6d\xf7\x94\x73\xc8\x56\xb7\x3e\x41\x45\x8c\xaf\x00\xd9\xf2\x4a\xcf\x33\x9b\xdb\xa4\x03\x6e\x89\xb2\x6a\x7a\x38\x82\x8c\x5b\x0f\x2a\x44\xb5\x30\x2e\x1d\xf8\xc9\x97\xe1\x64\xf8\xe9\xbb\x8e\xb0\x27\x90\x6f\x0c\x18\x11\x01\x2d\x51\x5d\x8a\xba\x44\x0b\xa1\xf4\xd1\xb0\x17\x3f\xb2\x17\x23\xf2\xff\xb1\xf7\xaf\xcb\x6d\x23\xe9\xba\x20\xfc\xfd\xce\xab\xc8\xcd\xf8\x66\x4a\x9a\x80\x60\x1d\x7c\x28\xbb\x76\xac\x18\x9a\xa2\x6c\x76\x49\xa4\x16\x49\xd9\xad\x3d\x31\xb1\x36\x48\x26\x45\xb4\x41\x80\x8d\x04\x25\xb3\x7f\xcd\x45\xcc\xdd\xcc\x8f\xb9\x97\xb9\x81\xb9\x85\x89\x7c\x0f\x79\x00\x40\x49\xae\xae\x72\xad\xb5\x97\xf5\xa3\xdb\x25\x91\x40\x9e\xf3\x3d\x3c\xef\xf3\x08\x8b\x11\xa9\x61\x42\x4c\x1f\x86\xa3\xe1\x91\x0f\x09\x89\xe5\x35\x12\x4e\x6b\xd2\x3c\xb2\x30\x3b\x4a\xca\x58\x79\x40\x6b\x2b\xdf\xd9\x4b\xc0\x15\x05\xf8\x62\x93\xcd\xe9\x88\x3b\xff\x89\xd8\x44\xe3\x17\xb7\xd7\x97\x47\x27\xf1\xc9\x1f\x45\xfe\xf9\x24\xff\xe7\xe9\xc9\xd9\x9b\xd3\x1a\xff\xe7\xe9\xab\x37\x67\x3f\xf8\x3f\xbf\xc7\xcf\x6d\xb2\x2a\x8a\xff\x52\xbb\x03\x22\x86\xc3\xca\x93\xf8\x44\x1e\xdc\x5e\x5f\x1e\xd2\x55\xd5\xfa\x71\xe2\xf4\xed\x58\xd3\xab\x73\x88\x91\x4d\x8a\xe4\x84\xb0\x63\x4e\xbb\x68\xe1\x00\x99\x94\x7a\x02\xbf\x97\x5e\x61\x2e\xcd\x48\x26\xf2\x5c\x65\x90\xf1\xf1\x19\x66\x8c\x0d\x81\xea\xa9\x9e\xba\x98\x68\xa8\x8b\x99\x13\xfc\xcd\xf1\x89\xbc\x48\x4b\x5d\xc9\x2e\x58\xbe\x91\x9c\x6c\xf3\x7c\x77\x9f\x64\x2a\xf2\x6d\xa6\xb7\x2f\x8f\x7f\x7e\x2b\x0f\x3a\xf8\xf6\xce\x21\xc6\x88\x99\xfe\xda\x9e\xe3\x24\x7c\x79\x9f\x26\xae\x60\x32\x08\x82\xf8\x8c\x91\xb1\x7c\x4f\x12\x25\x22\xac\xe4\x86\xf0\x55\x93\x89\x25\xe7\x1a\xa9\x03\xe0\x52\x39\x74\xb9\x17\x1f\x34\x8b\x81\x70\x3b\xd6\x31\xa8\x9f\xd5\x0b\x72\xd0\x03\xde\x72\x01\xcb\x3a\xd5\x64\x53\x6e\x37\x45\xbe\x9f\x03\xc4\x45\x05\xa9\xea\xd5\xb7\x7e\xb1\x35\x89\x26\x03\x50\x23\x0f\xfe\x49\x8c\x85\x41\x08\x87\x67\x43\x88\x6d\x39\x60\xa8\x3c\xaa\xe7\xbf\xf7\x57\x82\xfb\x3d\x8b\x78\x29\xa0\x29\x69\xeb\xf2\x0a\xcc\xb9\x11\xc8\xd9\x63\xb9\x03\xef\x4f\x7b\xf4\xf4\x2d\x39\xf1\x60\x22\x44\xf2\x18\xdd\x08\xfe\x27\xc8\x0a\x63\xcd\xad\xc7\x20\x5f\x90\x18\x31\xd7\xed\x10\xbd\x54\x24\xb0\xf6\x95\x90\xf2\x8d\x12\x5d\x2f\x64\x1f\xb2\x1f\x42\x8d\x18\x46\xda\x91\xd2\xa9\x39\xd1\x91\x57\x3f\x0d\xb5\x55\x01\x77\x9c\x59\x3f\xb3\x32\x5d\xb8\x7a\x3a\xff\x8d\x82\xd3\xef\xc6\x7e\xc3\xa4\x83\xff\xfe\x5f\x3a\x72\xc5\xb5\x0b\x90\xd5\x33\x06\x1d\x78\x07\x8b\xc6\xa0\x61\x34\xc6\xd3\x60\xcd\x89\x31\xc3\xf1\x9d\x05\x7d\x65\x25\xcf\xf0\x8d\x71\x07\xb9\x25\x8f\xe4\x60\x69\xfd\x90\x70\x47\x24\xc8\x47\x10\xa0\x05\x02\x9e\x29\xbb\xf1\x04\x13\xf5\xdc\xd6\x84\x2d\x6d\x23\x28\x7e\x55\xe3\x95\xf3\x6d\x63\xf8\x2a\x1e\x2b\xb0\x59\x03\xb9\xa7\x59\xca\x20\x84\xda\xeb\x99\xf8\xb2\xa8\x2d\x5d\xca\xef\x41\x34\x87\x92\x96\x28\x4b\xa5\x11\xb4\x00\xbe\xf5\x23\x0f\x4c\xed\xe0\xc2\xae\x56\xb5\x74\x29\xa4\x8b\xdd\x42\xa9\xbf\x1c\xa9\x34\x8f\xec\x9a\x7a\x74\x18\x42\x12\x12\xb3\x53\x7c\x7a\x7f\x22\xe2\x10\x8e\xb5\xc0\x95\xb4\xec\xab\xb6\x0f\x56\xec\xc2\x55\xa5\x50\xea\x49\x24\xd2\xa2\xcd\x03\x32\x10\xfb\x3d\xb4\xdc\x61\x46\xfc\x6e\xc7\xf2\x73\xe8\x7f\x8b\xdf\xd6\x99\xc7\x9a\x8c\xc7\xbe\x8d\x90\xc2\x76\xc9\x5d\xa5\xdd\x43\xc2\x69\x14\x57\x48\x80\x1f\xc4\x93\xaa\x19\x20\x71\xa3\x0f\x80\x36\x4b\x3f\xb6\xd0\x11\xaa\x1f\xf1\xe2\x0f\xaa\x30\x5b\x10\x26\x8d\xd3\xc0\x7c\xb1\x03\x31\x43\xdb\xc4\x55\xa1\x74\x07\xaa\xff\xb1\x39\x69\x1e\x4a\xa9\x10\xf7\x91\xf9\x26\x83\xcc\x16\x50\xcc\xbe\xf7\x50\x0e\x46\x82\x63\x12\x74\x0a\x62\xbc\xad\x59\x9b\x18\xd7\x03\x9a\xb2\x16\xd0\xb4\xfd\x0e\x9a\x2f\xea\xcd\x8f\xec\xd8\x98\xbd\x50\xf3\x63\x03\x2d\x52\x17\x1b\x0e\x8a\x1c\xe5\x9b\x26\x83\x4c\x96\x71\x10\x2f\x40\xee\xb8\xb5\x87\x11\xe8\x00\x3d\x54\x7b\x5b\xb1\xb4\xc1\x32\xa0\xdf\x4c\x60\x21\x43\xd4\xac\x58\xca\x9c\xe3\x78\xce\xb8\x20\xfe\xd8\xdf\xbc\x21\x99\xbb\x10\x0e\x3c\x6c\x57\xb0\x9e\xed\x0e\x03\x07\x96\x6d\x16\xaf\x52\x0d\xb1\x38\xa8\x59\x5d\x3f\xce\x6b\xc1\x85\xf6\x3d\x03\xe5\x5f\x14\x33\x7e\x72\xfb\xa2\xba\x5f\x9d\xca\xb5\xde\xef\x70\x89\xb7\xf6\x12\x5a\x20\xa8\x05\x8c\x01\xa4\xd2\x26\x4b\xb9\x4b\x2b\xb0\x55\x64\xc5\x2e\xa0\x20\x2a\x21\x6c\x60\x60\xcf\x21\x00\x3b\x95\x6f\xd7\x7a\x39\x69\x32\x83\xd0\xaf\xca\x76\x12\xf0\xe6\xc2\xd6\xd2\x85\xf2\x32\xb0\x73\x28\x00\x4c\xbc\x10\xed\x9d\x27\xab\x18\xb0\x62\xc2\xb1\x22\xb8\x15\xb9\xaf\x1a\xcf\xe7\x45\xe0\x1d\x63\x43\x3f\x80\x57\xcb\xea\xd0\x52\xcb\x0a\xe5\x2d\x0e\x78\x65\x83\xf6\xcf\x9e\x29\x48\x0d\x0a\x6b\xa1\xb6\x74\xfc\xe2\x53\x3a\x70\x5a\x77\x54\x51\x86\xcf\x14\xfe\xfa\x6a\x81\x29\x06\xcf\x35\x9d\xdd\x07\xd5\x8a\xcf\x88\xe3\xf7\x08\x63\xbb\xee\x95\xb6\xc3\xe0\xe8\x53\x51\x3c\xa7\x52\xbd\xcd\x45\x2c\x37\x8c\x1d\xc2\x20\x70\xb6\x73\xa5\x9a\xc0\xb3\x7a\x90\xc6\x2a\xe6\xa3\x84\xc4\x5e\x3c\xe5\xcf\xa0\xaa\x89\x2a\x9f\x02\x53\x8f\x8f\xb0\x60\xc9\x1f\x7a\x06\x2c\xae\x18\x24\xd1\x29\x0a\x48\xc6\x49\x29\x4f\x63\x39\xc1\x72\x57\x21\xd8\x12\x4e\x4c\xb7\xbc\x2a\xd7\x40\xa3\xc7\xa2\x22\xa8\x4a\x16\xc9\x5b\x91\xc7\x15\x8f\x70\x9b\x92\xb6\xf8\x0d\x37\x66\xf6\x8c\xa4\x77\x41\x5a\x14\xd9\xc4\x69\x92\x32\x9f\x12\xc5\x42\xab\xf3\x1d\x15\x7c\x2b\x32\x47\x6b\x9b\x1d\x3b\x73\x16\x43\x64\xdf\x56\xd5\x5f\x73\x55\x3d\x15\xdf\x8b\x33\x70\x14\xfa\x8e\x56\xda\x67\xe8\x71\x51\xff\x10\x31\xeb\x9b\xfa\x96\x9d\xec\x24\x3e\x01\xb6\x0d\xc6\xaf\x5a\xac\x17\x4a\xc0\xce\x28\x95\xaf\x83\x02\x6a\x82\x5d\x26\x65\x8a\x48\x15\x56\x1b\x17\x0d\xdb\xee\x39\x80\x01\xf5\x75\x95\x6c\x35\xfd\x5b\x57\xc5\x66\xa3\x80\xf0\xd4\xe7\xb0\xf0\x10\xb6\x21\xb1\xe8\xe3\xb2\xf6\x90\x0d\xe6\x15\xb5\x6f\x5c\x5a\x4e\x10\x8a\xc7\x97\x2e\xf6\x7c\x86\xf6\x77\x4e\xfa\x41\x2e\x98\xea\x9f\x54\x64\xda\x07\xfb\x13\x04\x1b\xa1\x4e\xd2\x63\xf5\x69\x63\xce\x0b\x49\xc8\xed\x64\x45\x84\x75\x8c\x1c\x90\x9c\x08\x24\x9c\xd2\xa5\x60\x9e\x29\x2f\x99\x87\xf9\x1e\x3e\x99\x9c\x87\xe1\x19\x68\x80\x5b\x08\x89\x04\x45\xed\xf3\x94\x08\x0a\xb4\xa4\x37\x38\x2c\x8e\x5e\xd5\x93\xdc\x74\xec\x82\x9c\x98\x45\x4c\x67\x80\xac\xcf\x8a\xbb\x82\xda\x0a\x54\x5d\x6c\xe3\x27\xc8\xa5\xe6\x28\x60\x6b\xe7\x03\x4c\xc3\x19\x1f\x60\x8d\xf3\x1a\xad\x34\x33\xc6\x61\x29\x80\x85\xa1\xfd\xa4\x01\x79\x1f\x41\x03\x22\x5b\x13\x00\xed\xb2\x79\x22\x87\xad\x0b\x04\x12\x7c\xa0\xae\xa5\xbb\x02\x36\x08\x29\xe5\xcb\x58\x9e\x5b\x96\x46\xd3\xea\xcf\x56\xa9\x5f\x88\x50\x09\xe4\x99\xc5\x98\x7e\xbc\x3a\x96\xb7\xdd\x8f\xa3\xd1\x7f\x11\x57\xdd\x5f\xa1\x60\x2f\x88\x35\x73\x89\x0e\x05\xb3\x23\x57\xe0\x38\x1a\xcb\xc9\xb4\x3b\xbd\x81\x0a\xc4\x71\xff\x43\x77\x0c\xb5\x2f\x8d\xca\x21\x5f\x06\x05\x6a\x94\x2e\x06\xbd\xee\xe5\xe5\x6d\x44\xef\x6d\xd6\x09\xda\xda\x3c\xdb\x2f\x28\xe5\x7b\xdf\xc7\xaa\x3b\x79\x31\xee\x43\x01\x0f\xd4\xd4\x5d\xf7\xc7\x17\xa3\xf1\x15\x8a\xa0\x84\x75\x7a\xac\x88\xc2\x15\x59\x1f\xa0\xf4\x6d\x32\x15\x54\x9a\x05\xc5\x35\x5e\x4d\x16\xb5\xc7\x6f\xa4\x8d\xc4\x4f\x20\x14\xdf\xac\xd8\x14\xdf\x12\x5f\xb7\xf5\x3f\x07\x5c\x8d\x44\xaf\xfc\xd8\x3d\xc7\xca\x23\x2c\x00\xc4\xd2\x23\x88\xfb\xd3\x37\x0e\xdb\xab\x32\xa1\x78\x72\xdc\x37\x2d\x9e\xca\xda\x68\x47\x02\x44\x61\x46\xe7\xd0\x17\x4c\xdc\x40\xe5\xd5\x74\x64\xd7\x44\xfd\xbb\x9e\xa4\xd0\xc5\x68\xdc\xff\x30\x1a\x0c\x3f\xe0\x1a\x0c\x78\x35\xcc\x1a\xbc\xe4\xda\x1e\x21\xbc\x5a\x36\x9c\x13\xea\xd5\x63\x75\x6b\x8f\x56\xb0\xf5\xff\xda\xbf\xba\xbe\xec\x8e\x6f\xa3\x66\x41\x53\x5b\xf1\xda\xa3\xa2\x3d\xe2\x72\x34\x81\x8f\x5f\x8f\x47\x17\x83\xe9\x24\x92\xfc\x8b\x9b\x49\x3f\x92\xef\x6f\x26\x03\x98\x2c\xbb\x70\x20\x8b\xc2\x9f\x39\xef\x4e\xbb\x91\xec\x8d\x26\x53\x39\xba\xc0\xca\xe7\x43\xb3\xd6\x7a\xa3\xe1\x10\x2b\x8a\x71\x20\x4d\x07\xf7\x96\xd0\xf1\xf0\x5e\xdc\x8c\x87\x83\xc9\x47\x28\x0a\xa6\x75\xdb\x1d\xf6\x60\x2d\xfb\x62\x4e\xbc\xea\x69\xd0\xb0\x7e\x0b\x2b\x6e\xe5\x07\xb3\xee\xfa\xe7\x90\x28\x82\xb2\xb9\x48\xf0\x16\xed\x5e\x5e\xf6\x3f\xf4\xcf\x65\x77\x22\xbb\xf2\xfd\x18\xea\x71\xbd\x52\x3a\x28\x53\x85\x0a\xbc\x1b\xa8\x9c\x3d\xbf\xa1\xf1\x6f\x94\xd3\x61\x9a\xaa\xb1\x44\xb1\x38\x4e\x3e\xbf\x38\x0e\x57\xce\x6b\xac\x8a\x80\x4b\xc5\xc3\xb8\x0b\xf1\x1a\xac\x8c\x69\x3d\xdc\x50\xc3\xea\x10\x2c\x68\x9b\x03\x41\x1a\x84\x4d\xf3\x2a\xf5\xca\x22\x16\x52\x25\x65\x96\xaa\x52\x6c\xb6\xa5\xde\x26\x0c\xbe\x48\xb5\x3d\x49\x5f\x03\xfd\x09\xdd\xb0\xae\x12\xe1\x16\xa2\xc7\x45\x96\x50\x4c\x70\x6f\xe8\x84\xac\x30\x63\x94\xd8\xd7\x36\x43\xbf\xaf\xe1\xf2\x30\xb6\xc4\x7e\x9e\x2b\x86\x9c\x58\xf4\x4d\x10\x03\xf6\x24\x53\xea\x5e\x90\x37\x72\x16\x65\x95\xe6\x81\x08\x83\x57\xa5\x86\x37\xff\x5a\x2d\x80\x96\xc9\x66\x51\x5d\x70\x24\xa9\x18\xeb\x66\x2c\x4d\x84\x82\xb7\x99\x2b\xd0\x2d\xe3\x2e\x4f\x5b\x20\xdc\xb5\x59\x83\xd0\xa2\x03\x71\x79\x64\x73\x28\xff\x69\x4c\xdd\xda\xdd\xce\x34\x4e\xee\xca\x3b\x39\x8c\xfc\x6f\x32\xcd\x19\x69\x92\x80\x0b\x61\xfe\x8d\xdd\xf8\x49\x0b\x57\x62\x78\x60\x01\x54\x2f\xa1\xff\xaf\x0e\xa3\xa0\xd5\xf6\x25\xaf\xa1\x7c\x2e\x80\x8a\xdb\x3f\x8a\x37\x56\x5b\xca\x27\xcb\x4b\xbd\x72\x82\x36\x30\xbb\x3f\x5e\x52\xca\x37\x35\x24\x3a\x25\x6c\xba\x2d\xf4\x7f\x16\xee\xe2\xa5\x66\x42\x84\x5b\x1d\xe9\x22\x5a\x90\x2e\xcd\x19\xc1\x52\xad\x8d\x2a\xb5\x5a\x50\xac\xc5\xea\x86\x04\x45\xd7\x3a\x12\xa1\xb6\x86\xa6\x70\x3e\x47\x8c\xb4\x23\x95\x00\x74\x46\x64\x31\x67\x14\x75\xa1\xea\xbc\xc8\xc2\xaf\x1e\x83\xe9\xe8\x24\x5d\xd4\x5a\x8f\x68\xa5\xb2\x06\x76\xf6\x1e\x22\xdc\xf6\x49\xc9\xb0\x03\x8e\x3a\x87\xf4\x75\x52\x08\x16\x10\xd8\xba\x3e\xc5\x3e\x8c\xb4\xfc\x76\x8c\xb4\xd8\x8b\x91\x6e\xc3\x2b\x21\xbf\x31\xf9\x97\x91\x0b\xeb\x45\xb2\x28\x85\x8b\x99\x35\x5d\xc1\x54\x93\x26\x3a\x06\xc3\xd2\xfc\x3e\xc9\xd2\x85\x99\xa3\x2c\x79\x58\x6e\x33\xdc\xb9\x1e\x46\x93\xeb\x3d\x11\x6b\x19\xb5\x0e\x45\x30\x0c\x60\x1a\x13\x7d\x30\x0c\xee\xba\xd0\x95\x9c\x67\x85\x56\xd9\x4e\xe0\xf9\xbb\x4d\x18\x9c\xe5\xa3\x30\xc3\x23\x6a\x82\xcc\x5f\xd0\xbe\x7a\x37\xc3\x5e\x72\x1b\xb0\xde\xde\x2b\x10\x45\x0c\x27\x44\x6a\xb0\x7a\xc4\x0f\x7f\x82\x06\x2c\xef\xc9\x88\xf4\x0b\xc2\xfb\x02\xc7\x08\x5b\x80\xd4\x25\x76\x58\xac\x66\xdd\x36\xcb\x94\xae\x02\x28\x6a\x55\x21\x47\x5c\x66\xa1\x69\xcd\xf1\x02\xb7\x61\x53\x2a\xd6\xe2\x0f\xc7\x2f\x2c\x90\x10\x75\x3c\x19\x23\xc7\xfc\x2c\x27\x47\x70\x43\xac\x59\xb1\x94\xdd\xb5\x2a\xd3\x79\x62\x95\x5d\x05\x1e\x9f\xe8\x26\x20\x7c\x8c\xd0\x63\x9c\x70\xcd\x14\x15\xb4\xdc\xc4\xc3\x78\x1f\xaa\xcf\x78\x4b\xe2\x29\x54\x1f\x5e\x4f\x70\x92\x07\xc8\x64\x6f\x9a\xbb\x5e\xd8\x56\x18\x1f\x1d\xce\xe6\x6d\xcb\x92\x30\x8b\xa1\xc8\xee\xdd\x79\x6d\xf7\x0f\x26\x07\xf5\x76\xa6\xd3\x45\x9a\x94\x66\x8f\x5b\x5c\xde\x63\xc1\x65\x1a\xce\x67\x84\x7c\x03\x8c\x1e\x1c\x42\x08\xb6\xc4\x38\x60\x9a\xcb\x49\x92\x57\x89\xec\x65\x49\x99\xc8\x5e\xb1\xcd\xab\x9d\x9f\x83\x86\xe2\x2a\x0a\xd1\x53\xb4\x93\xb5\xdf\xa2\x30\xea\xa3\x2d\x4b\xac\x32\x07\x01\x10\x07\xb5\x9c\x40\x04\xd4\x32\x07\x10\x67\x31\x5d\x0c\x31\x6a\xd7\x68\xe7\xe0\xc6\x7d\x91\x6d\x73\x20\xee\x2f\x40\xf8\xc2\x52\x6d\x08\x5c\x06\x41\x41\xd9\x0e\x12\x23\xc5\x52\x6a\x9a\xd8\x44\x6b\x65\x4e\xed\xb5\x02\xbe\x39\x04\xdd\xea\x22\x4b\x17\x14\x20\xe1\x65\xf6\x68\xbd\xb5\x1f\xd4\x04\x8f\x77\x5b\x6e\x0a\x24\xff\x82\x71\x41\x43\x89\xc6\x80\x64\x3c\xb8\xa3\xb6\xb6\x8b\xb2\x6c\xf8\x50\x3b\xe1\xf7\x85\xd9\xad\x33\xe4\x60\x2e\x10\xf0\xeb\x90\xfc\xc6\x43\xf7\xae\xe2\xe6\x22\x43\x9d\xbf\xc4\xfa\xe0\x8e\xa5\x94\x2d\x20\x9f\x40\xca\x9b\x91\xad\xae\xc8\x8a\x32\xfd\xa5\xf0\xf0\x4c\x39\x45\x0d\x5b\xb3\x10\xc9\x5c\xdd\x65\x24\x60\xb2\x50\x99\x99\xf0\x9d\xa0\x57\x7a\x35\x0b\x75\xbb\xa7\xb5\xb1\x66\xe5\x37\xdb\x28\xbc\xb2\xd5\x68\x4f\x4d\x0f\xe8\x91\x70\xb5\x03\xb6\xd5\xaf\x79\x40\x3d\x28\x1c\x05\x41\x6f\x68\x0f\x41\xe5\x0b\xf7\x06\x0a\x2a\x99\x45\xe3\x19\x6f\x70\x84\x82\x5d\xb8\x84\x75\x61\x17\x67\x98\x5b\xae\xf7\xcd\x15\xef\xf9\x8d\xb1\xe1\x5e\x50\x3d\xf4\x48\xc6\xa8\xe4\xf6\x87\x62\x34\xfe\xc4\x2f\x46\xbd\x64\x9d\x1d\x5d\x7e\xb8\xbe\x3c\xca\xd2\xfc\x4b\x9a\xdf\x1d\x59\xbd\xff\xdf\x07\x14\xf6\x38\xfe\xeb\xf8\xe4\xf5\xe9\x59\x0d\xff\xf5\xe6\xf8\xf8\x07\xfe\xeb\xbb\xfc\xc0\xec\x4b\x33\xfb\xf2\x12\x67\x9f\x62\xf0\xe0\x2e\x03\xd1\x32\x60\x2a\x93\x4c\xda\x55\xc1\xd7\xe4\x87\xe1\x8d\xbc\x54\x5a\xab\x92\xc5\x7c\x1b\x38\xb2\x1d\xe1\x85\xcd\xca\x8a\x90\x1c\x1c\x0b\x51\xcc\xa1\xb6\xcb\x93\x35\xfe\x67\x24\x13\xd9\x81\x5c\x0b\x53\xc8\x91\xea\x27\xb4\xae\x57\x80\x5e\xad\xae\xd4\x5a\x76\x38\x09\xc9\xf4\xff\x01\xb4\x36\x20\x10\x6c\xfb\x3a\xa6\x4b\x48\x10\x36\x20\xaa\xf7\x30\xd8\x66\x10\xea\xe4\xde\xcd\x47\xb5\x40\x7c\x20\xfa\x1b\x3e\x92\x0e\x43\xf6\xf2\x77\x7e\xae\x92\xaf\x28\x32\x4f\x00\x76\xe2\xc8\x29\x7d\xba\x5a\x99\xa5\x9a\x50\xef\x88\xb9\x97\xaf\xf9\x1b\x4f\x4e\x02\xa0\xd0\x3a\xbf\x75\xc0\x3a\x91\x7c\x50\xa8\x57\x49\x2e\x98\xf9\xdc\x36\xb7\x42\x11\xcd\xaf\x80\xd4\xa7\x7b\xc5\x6c\x27\x07\xc3\xf1\xa0\x2b\x11\xa4\xd4\xd0\x4e\x7e\x64\xb2\x48\xa0\xad\x1d\x3c\xed\x99\xe9\x1e\xf6\x9d\x86\xe7\xf4\x1b\x86\x07\x8c\x6f\xb7\xb8\x6d\xf0\x9d\x20\x51\xec\x5e\x70\xa6\x8f\xb5\x21\x13\xc4\xf2\xac\xb0\x92\xa3\x3e\xef\x6b\xb8\x7e\xe0\x2a\xbd\xe7\xcc\xed\xf3\xda\xf3\x7d\x2f\xa6\xf8\xc5\x46\x2f\xcb\xe4\xee\x0f\x84\xff\x3e\x75\xfe\x1f\xbf\x39\x7b\x53\xd7\xff\x3f\x39\x79\xfd\xe3\xfc\xff\x1e\x3f\x34\xfb\x8b\xea\xab\x5f\xc6\xd2\x3b\x94\x27\x6f\xdf\xbe\x96\xbd\x32\x49\xef\xe4\xfb\xa4\x2c\x93\xaa\x8a\xe4\x55\x3a\x5f\x25\x2a\x93\x3d\xc2\x7c\xe2\x11\x78\x9e\xdc\xa7\x0b\xd9\x4b\xca\x2c\xd5\x40\x7e\xe4\x52\x9b\x90\xb8\x2b\x6b\xe5\x2e\xc8\xb8\x57\xdf\xd8\x2c\xee\x59\x6c\xe8\x24\x4d\x9d\x1f\xbc\xd5\x6a\xb9\xcd\x50\xf6\x9b\x82\xed\xc2\x2b\x39\xb8\xfd\xc5\x1e\xa5\xea\x9e\x42\x20\xc4\x92\x6d\xa9\xa3\xcd\x79\x50\xcb\x99\x98\xe3\x88\xb2\x26\x62\x5f\xd6\x24\x96\xe7\x45\xfe\x53\x25\xe7\xc5\x1a\x0b\x9c\x33\x8e\x15\x14\x72\xab\x65\xba\xc4\x1b\x8e\x09\x66\x53\x2d\x60\xf7\x03\xaa\x09\x61\x08\xe6\xdb\xe6\x66\xfb\x2f\x72\xb0\xf4\xca\x65\x52\xed\x0e\x42\x94\x49\x28\x72\x05\x1d\x74\xe8\x43\x10\xe8\x2d\xb4\x62\x1d\x79\x76\xdf\xd3\x92\x3f\x60\x1d\x0a\xf5\x75\x93\xa5\xf3\xb4\x72\xbc\xe2\x1f\xfb\xe3\xfe\x33\xce\x92\xf8\xc5\xfb\xc9\xf9\xd1\xcb\xa3\x1e\x9c\x9b\x47\x37\xbd\x3f\xe0\x20\x78\x62\xff\x9f\x9d\xbd\xaa\xdb\x7f\x2f\x4f\x4e\x4f\x7e\xec\xff\xef\xf1\xe3\xcf\xbe\x3c\xb8\xc9\x53\xb8\x95\xab\x5a\x49\xe1\xd1\x84\xea\x6a\x0e\x85\x70\xc7\xc4\xff\x76\x9f\x94\x10\xdc\xdd\xa9\xa4\xd4\xff\x3b\x44\x83\xc6\xea\x8e\xc9\xd1\x29\xd0\xd4\xfa\x40\x08\xe9\xb0\xc3\xe8\x1d\x10\x63\x15\xe0\xc6\x20\xf5\xa2\x7d\x20\xa7\xf9\xcd\x2c\xcd\x93\x12\xe5\xbe\x75\x53\x44\x31\xe0\x1d\x02\xa4\x84\x93\xb1\x0b\xd1\x61\xb5\x62\x46\x2f\xec\x57\x1a\x93\xa7\x7a\x27\xc4\x49\x2c\xc3\x26\x41\xcf\x7c\x00\x93\x2f\x1b\x08\x5b\x77\x56\xdc\x7b\x6a\x88\xac\x6c\x84\xa9\x1b\x63\xc6\x61\xd9\x7c\x10\x62\x0c\x1b\xe2\xd4\x11\x51\xe6\xb3\xde\x80\x34\xf7\x47\x80\x1b\xc0\x66\xed\xef\xdd\x06\x3e\x98\x03\xc1\x25\x11\x70\xeb\xaf\x93\x4a\x95\x69\x92\xb5\xd5\xde\x05\x00\x5e\xd0\x12\x31\xb7\x43\xb2\xb8\x57\x65\x85\x61\x3c\xf7\xed\x35\x46\x10\xcd\x2f\x97\x0a\x48\x90\x50\x7f\x9a\x01\xdd\xe6\xee\x60\xd0\x07\x60\x4e\x48\x47\xa3\xd6\x76\x8f\x56\xd6\x3c\xf1\x1d\x1a\x78\x44\x32\xe1\x70\x1f\xae\x36\x8f\xaa\xfa\x20\x1c\xfb\xd8\xa2\x8d\xe4\x7b\x55\x7e\x51\x99\xda\xd1\x01\x4f\xea\xb5\xc8\x23\xa1\x51\x46\x63\xe8\x99\xc9\x40\x8a\xd8\xdc\x09\x79\xe1\xfe\xac\x5d\xd5\x82\x7b\x12\x28\x40\xfe\x36\xc2\x43\x7f\x8c\x38\xc8\x66\x8b\xe2\xc2\x48\x1b\x33\x22\xc0\xc4\x40\x39\x66\x2b\xa6\xe3\xfd\x2d\xe4\x5c\xc7\xfd\x0f\xfd\xe1\xd4\x96\x65\xba\xf2\xc1\x9f\xa8\x4e\xf1\x27\xac\x2e\x1c\xde\x8a\x66\x11\x62\x7b\x29\x61\x24\x9f\x60\xa9\x16\x8f\xd6\x14\xc2\xfb\x9e\x84\x3d\x98\xee\x30\xa0\xa2\x7f\x1e\x07\xc0\x01\x24\xc1\xf5\x7b\x87\xa9\x7f\xd7\xb9\x67\xc0\x09\x44\x1b\x9c\x40\x3e\x07\x4e\x70\xd0\x1c\x09\xe1\x8f\xc4\xf5\x78\xd4\xbb\x19\x5b\x2e\xec\xc9\xcd\xfb\xc9\x74\x30\xbd\x99\xf6\xe5\x87\xd1\xe8\x1c\x39\xcd\xfb\xe3\x4f\x83\x5e\x7f\xf2\x4b\x08\x30\x00\x04\x81\x18\x8d\x19\x7f\xf0\x8b\xf9\x6c\x2b\xea\xe0\x50\x7e\x1c\x7d\xee\x7f\xea\x8f\x65\xaf\x7b\x33\xe9\x23\x23\xfa\x68\x08\x5d\xb5\xd4\xb8\xc2\x52\xbf\x3a\x70\x0e\xe2\x11\x88\x30\x77\x32\x1d\x0f\x7a\x53\xe9\x7d\x8c\x12\xff\xed\xdc\xb9\xc2\xa7\xc9\x3d\xb4\x20\x86\xc1\x90\x0a\x49\x6f\x19\xcf\x10\xe0\x43\xbc\x05\x6a\xa9\x75\x9f\x4f\x9b\xfb\x23\xe0\xd7\xfa\x13\xbf\x58\xa8\x4d\xa9\x80\x00\xe0\xdf\x3e\x5c\x5f\x1e\x9d\xc5\xc7\x47\xe6\xe0\x38\xfa\xd0\xeb\xfd\x4e\x81\xc0\x27\xec\xbf\xd7\xaf\x5e\xbe\x0c\xed\xbf\xd3\xe3\xd3\x37\xaf\x7e\xd8\x7f\xdf\xe3\xe7\xff\xfd\xbf\xfe\xef\x34\xd7\xaa\xac\xe4\x87\xeb\x4b\x79\x7f\x26\x2b\xf5\xb5\x02\xec\x88\xfc\xd0\xeb\xc9\xf1\xcd\x70\x3a\xb8\x32\x87\xe0\xfb\x71\x77\x7c\x2b\xfb\x7f\xed\xf5\xe1\xdc\x10\x82\x4b\x44\xcf\xe2\x93\x48\x9e\x9d\xc8\x2b\x50\xa4\x3e\x3d\x3e\x7e\x2b\x04\x87\x36\x3c\xdd\xc4\x77\x72\x55\x55\x9b\x77\x2f\x5e\x3c\x3c\x3c\xc4\x77\xf9\x36\x2e\xca\xbb\x17\x0c\x5a\x79\x71\x37\x9f\x7b\x8b\x6d\x55\xad\x33\xdf\xd0\x34\xfe\xa8\x79\xb0\xbc\x28\x95\x07\xfc\xbc\x28\xb6\x39\x27\x94\x80\x63\xe1\xbf\xd2\x2b\x96\x7a\x09\x8f\xff\x17\x21\xfa\xf7\xaa\x04\xd7\x2a\xf5\xe5\x8c\xa9\x7e\xaf\x1e\xc1\xbb\x57\xe5\x2c\xa9\xd2\x75\x40\x34\xe9\x70\x99\x82\x6d\x20\xf4\x44\xc1\x2b\xc3\x32\x54\x5b\xe5\x66\x6c\x10\xe7\xe9\xc2\x08\x6e\x73\xa0\x05\xbd\x4c\x67\xa5\xb1\xd9\x6c\x74\x55\x1e\x74\xec\xbf\xa9\x60\x36\x0f\x74\x98\xec\xf5\x4c\x12\xfc\x9a\xab\x5a\xfc\xd8\xd6\xbe\xc0\x2b\x07\xd7\xce\xe4\x41\xe7\xc3\xf5\xe5\xfd\x59\xe7\x30\x96\x83\x8a\xb9\x3a\x00\xbb\x43\xa2\x33\xe0\x8f\x02\xd3\x43\xa7\xd6\xd8\xce\x21\x71\x8c\x18\xfb\x5e\x26\xcc\x7a\x0a\x85\xb6\xd6\x5a\x72\x66\xe6\xaa\xc8\x16\x36\x81\x86\x8f\x0d\xe4\x20\xed\x6f\x53\x1d\x30\xa1\x40\xfb\x84\x57\x62\x02\x83\x6e\x07\x07\xf9\x4a\x10\x76\x6c\x6c\x41\x33\xaa\x04\x5f\x05\x5f\xdb\xd8\x42\x77\x65\xb2\x8e\xe0\x2f\x28\x8a\xb2\x9e\xa5\x79\xa8\xd0\x38\x57\x25\x08\xa5\x98\xcf\xac\x54\x62\x1a\xea\x54\x6a\x4b\xea\x77\x06\xfd\xb6\x18\x12\xec\x1e\x95\xa5\xd0\x5b\x30\xe9\x4d\xd5\x77\x16\x35\xe5\x66\x35\xd5\x4e\xb6\x0f\xbf\xeb\x14\x0a\x8a\xfc\xc8\xec\x32\x8f\xd5\xd5\x53\x48\x3f\x14\xf4\x06\x6d\x25\xe3\x18\x99\xf1\x90\xec\xb0\x6a\xed\x19\x0d\xa7\x78\x23\xce\x4e\x6d\x18\xa5\x94\xc7\xb1\x3c\x57\x4b\x4c\x7b\xe6\xc6\x64\xed\xda\x29\x01\xdd\x6c\x0f\xe0\x72\x55\x2c\xb6\x99\xea\xc8\x14\x48\x95\xc8\xac\xb5\x55\x02\xa6\x39\xb5\xe5\x02\x75\x89\x18\x08\x05\xe7\x0d\x68\xc7\x12\xe0\x38\xe4\x51\xb8\x2e\x8b\xb9\xd2\xc8\x1c\xb7\x4e\xbe\x28\xcd\xd6\x3d\xd4\x7e\x32\x48\x9a\xdd\x08\x5e\x62\xb5\xf7\xe0\xf6\xa3\x2d\xe7\x4a\xaf\xad\xb2\x64\xcb\x57\x62\x21\x3a\x1f\x7a\xbd\x0e\x44\xb2\xcd\x52\xae\x05\x9f\xcd\x56\xc2\x76\xaa\x52\xf6\x88\x05\x9d\x13\xd5\xfb\xbc\x4b\x1d\x09\x7f\x19\x7b\x5b\x0e\x02\xdd\x64\x76\xab\x85\xcc\x8c\x8b\xc3\x7f\x3f\xdc\xbf\x7d\x2d\x61\xd0\xc1\x87\xeb\xcb\x43\xb7\x06\x8b\x0d\x2f\xa1\x2d\xf1\xe7\xfa\xb2\x49\x56\x7c\x2a\xd0\x49\x82\x14\xea\xc5\xe4\x02\x7a\x7e\x7d\x79\x64\xd6\x62\x52\x81\x32\xbb\xad\x50\x97\x81\xb7\x80\xa1\xa6\xa0\x20\xdb\x2c\xcf\x84\x75\x33\xfc\xae\x0b\xf6\xcc\x1f\x50\x96\x18\x4e\x56\xda\x77\x0c\x18\xac\x56\xb0\x21\x2d\x54\xc5\xf5\xc7\x2b\xde\xfa\xd0\xeb\x99\x16\x4e\x93\xf2\x4e\x55\x40\x9e\xd2\x41\xb5\x7e\xd8\x05\xc5\xb6\xda\x6c\x2b\x92\x24\xce\x77\xbc\x19\x4b\xac\x3c\x91\xa5\x42\x40\xc6\x7d\x5a\x42\xb1\x44\x05\x4f\x31\xfb\xc8\x2c\x32\xf3\x91\x72\xbe\x4a\x2b\x35\x47\x42\xdd\x34\x6f\x4a\x13\x97\x52\x6f\x53\xfb\x0b\x99\xe6\xe6\x7d\x80\x66\x02\x10\xc3\x7a\x96\xa9\x32\x12\x59\x91\x80\x60\x68\x96\xe6\x5f\xa0\x66\x07\xbc\x5f\xb7\xd4\x37\x2b\x92\xa4\xaa\xd7\x3d\x26\x55\x24\xbd\xbe\x41\x44\x50\x50\xfd\x10\xf0\xb0\x02\x0f\x2a\xe5\xc3\xa9\xd2\x8d\xd3\x1e\xe0\xfd\x91\xa6\x26\x75\x1b\xb6\x08\xb1\xa5\xc9\x10\x42\x07\xe0\x7f\xf8\xca\xd2\x52\x2a\xc2\x5a\x79\xd6\xb7\x89\xc5\xa6\xd3\xb2\x57\x3b\x84\xa9\x28\xca\xb5\xc6\x90\x87\x2d\x93\xb2\xcf\xc0\xf8\xad\x39\xdf\xfc\x77\x08\x26\x61\x81\x02\x2e\x00\xb2\x40\xe3\x56\xdb\x75\x92\x1f\x39\xc0\xc7\x02\xcb\xe5\x5f\x20\x0e\xe5\x2f\xc9\x7d\x22\x3f\xd1\x8c\x5e\xa1\xfa\x8a\x98\xed\x2a\x45\x9f\x84\x72\x24\x6f\x4c\xcd\x81\xbc\xd5\x48\xf0\x6a\x55\x56\xe9\x54\xf1\x03\x35\x77\xb0\xd5\x8c\x7b\x2d\x10\xd6\xa5\xec\x3a\x41\xc9\x56\x1f\xfc\x40\x55\xd7\x7e\x45\x7b\xdb\x31\x26\x34\x10\x65\xed\xf9\xb3\x9c\x27\xb9\xad\x59\xd4\x55\x51\xc0\x74\x1a\x7b\xb3\x4a\xdd\x55\xa7\x68\x95\x33\x09\xb6\x6b\x27\xa1\x1b\x5c\x33\xe1\xb8\x6e\x7b\x51\xaa\x65\xa7\x9f\xa5\x77\x66\x7b\xf3\x81\x9d\x6a\xb9\x30\x86\x0f\x1e\x19\x1f\x7a\xbd\x88\xca\x06\xe9\x34\xa3\xaa\xad\xda\xd9\xa0\x2d\x49\x45\x51\xd6\x1e\xc4\x47\xa0\x3b\x83\x20\x63\x0b\xc7\xae\x28\x72\xd8\xca\xa1\xd6\x2d\x7e\x92\xae\xbd\xb6\x13\x08\xf6\xf8\xa6\x4a\xd7\xe9\x3f\x30\xb9\xf6\xa1\xd7\x13\x8f\x2c\x53\x4d\xe7\x8d\x99\xa9\xbf\x6f\x93\x0c\xb4\xff\xe1\xe6\xe2\xde\xfb\xc3\x23\x68\x78\xe2\x06\x51\x85\xa7\x01\x78\xed\x47\x41\x40\x7e\x36\xb9\x57\x9e\xf1\x45\x29\x63\x38\x06\x01\xfb\x62\xfa\x5c\x2c\x83\x5d\x6d\xf6\x06\xde\x01\x56\x16\x55\xb4\x5c\x42\x38\xe3\xcd\x2b\x56\x47\x98\xb7\x48\x19\x4f\xe3\x4e\x5d\xec\xaf\x70\x97\x5c\x2b\x76\x1c\x0c\xa8\x7a\xed\x6b\x92\x65\x41\x23\x1f\x12\xcd\x6b\x0b\x6f\xd6\xb6\x21\xe3\x15\xa5\x3c\x9d\xce\x6a\x85\xb0\xac\x7b\x45\x0a\x8a\x89\x7f\xd0\x8b\xc7\x32\xdc\x4e\x6e\xb3\x7e\xf8\x03\x80\x6f\x49\x8c\x7f\x76\x40\x04\x0d\x88\x2d\x80\x1c\x16\xf2\xb3\x4a\xbe\xa8\x9c\x3e\x6f\x2e\x14\xe3\x17\x64\x6a\x59\xd1\x99\x45\x50\x73\xd2\xff\x6c\xd8\x63\x4e\x28\x1b\xaa\x9d\xcc\x22\xbb\xa3\x4b\xd7\xac\xac\xed\x1a\xa1\x0e\x4c\x43\x57\x2e\x8e\x10\x61\xa5\x3d\x02\x8b\x6d\x8e\x30\x25\x97\xc6\x9d\x53\x1b\xc2\x2c\x3d\x41\xc7\xea\xd7\xdb\x9f\xed\xe3\x3d\xf6\x13\xbf\x18\x4f\x7a\xd7\x97\x7f\x64\xfa\xf7\x09\xff\xff\xd5\xf1\xab\x57\x2f\x1b\xfc\x4f\x3f\xf2\x3f\xdf\xe7\x67\x9c\xce\x8b\x95\x9c\xe0\x3d\x09\xe7\x44\xe8\x49\x3a\x3f\xff\x24\x3e\xe6\x73\x34\xf4\x20\x4e\xe2\x93\x58\xfa\xea\x3e\x6c\x65\x83\x92\x07\x53\xa4\x80\x30\x25\x14\x8d\x6a\x4b\xc2\x0a\x5e\xb7\xa5\x24\x40\x5c\x3c\x22\x4c\x43\x42\x09\xe0\x8a\x09\xdf\xc1\x0c\x55\xfc\x2e\x72\xd5\x66\x41\x95\x44\x8d\x96\x2f\xc2\x00\x78\x4d\x1a\x19\x6c\xa6\xd9\x0e\x1c\x95\x1a\x85\xb8\x79\x42\xbb\x8c\x0d\x52\x12\x5b\x79\x55\x51\x53\xd9\x88\xcf\x62\x73\x21\xab\x79\x55\x16\x79\x3a\x27\x06\x55\x4a\x6a\x5d\xa9\xf9\x2a\xc9\x53\xbd\x76\xde\xc8\x83\x9a\xe9\xb4\xaa\xf1\xa1\xaf\xf9\x73\x82\x0e\x2c\xd0\xdd\x34\xe7\x9a\x4b\x97\xd7\x93\x18\x54\xe9\x01\xb5\x16\xd5\xce\xd6\x51\x2b\xdb\x14\x61\x01\xb2\x24\x04\x8a\xe4\x14\xa6\xb9\xce\x34\x46\x33\x1c\x1b\xf7\x81\x3d\x1c\x92\x0f\xb0\x96\x6a\xa0\xbc\xea\xd6\x0f\x96\xe4\xc7\xb2\x13\x7c\xd1\x9f\xa6\x90\x2a\xb1\x49\x6e\x59\xd6\x27\x53\xb4\x4d\x66\x0b\x8f\x23\x18\xf8\x66\xcd\x81\x42\x9f\xe7\x64\x73\x18\xc0\x49\x76\x9f\xc4\xaf\x63\xd9\xf1\xe4\xb0\xbd\xb9\x30\x17\x3c\x02\xfd\x29\x8e\x50\x1f\x04\x47\x5c\x6d\x1f\x89\x9c\x12\xdf\x26\x79\x0e\xcd\x78\x63\x9a\x01\xff\x9d\x80\xed\xe6\x86\xc9\xf2\x15\xdc\x21\xd4\x62\x0f\xad\x75\x81\x9c\xd6\x91\x60\xe4\x36\x05\x5a\xc0\xf0\xa0\x81\x83\xcd\x9a\x64\x54\x4e\x0c\x3e\x0f\x3b\x8f\xb0\xa6\x50\xfa\xcc\x56\x6b\x0b\x22\xd3\x72\x94\x31\x74\xfd\x53\x55\x59\x4a\xb1\x04\x38\x0c\x7e\xb6\x1d\xf0\x5a\x9f\x3a\x66\x55\xe8\xe5\xdb\x38\xa4\x7f\xd2\x76\xb8\xcd\x1b\xbd\x7a\x32\xc4\x3a\x83\x0a\x93\xab\xd0\x30\xad\x05\xcd\x1e\x20\xa2\x07\x76\x77\x92\x5d\xf4\x72\x6d\x8d\x55\x85\xec\xe3\x54\x7e\x54\x23\xa8\xf9\xbc\x52\xb9\xa8\xad\x6c\x2d\x49\x8e\x97\x9c\x2e\xad\x4a\x8a\x01\x42\xb8\x25\x92\x49\x9d\x3f\x8a\xc4\x91\xba\xcf\xe9\x83\x39\xef\xd8\x46\x48\x1a\x68\x43\x6e\xbc\xb0\xeb\xab\xbd\xe1\x28\x73\x64\x5e\x98\xab\x07\x7c\x0a\x29\xfe\x52\x6d\x57\x9d\x86\xab\x31\x2a\x7b\x1f\x7c\x12\x9f\x1c\xc7\xb2\x13\x7c\xc1\x5f\x8e\x9d\xeb\x2c\xa9\x60\xdf\x9b\x43\x65\xe0\x02\xbb\xb2\xeb\x38\x9f\x75\x87\x8e\x02\x41\xb4\xb4\x6e\x4c\x5b\x44\xf4\x66\x3b\x39\x9e\x7c\xc2\x77\x9f\xc8\x0e\x89\xe6\xf7\x40\xe8\xdb\x5f\x20\xa4\x8c\x04\x09\xe9\x03\x7d\x18\xc9\xbc\x78\x90\xc5\x43\x8e\xf0\x74\xb3\x22\x29\xd4\xc4\x0b\x59\xb8\xbd\xcf\x4e\x8b\x63\xfc\x8c\xe4\x5a\x55\xab\x62\x01\xf6\x32\x06\xa3\xa0\xc0\x60\xb3\x49\xca\xa4\xda\x6a\x52\x1a\x8f\xe8\xac\x13\x1b\x5f\xcb\x1f\x8e\x47\xda\xd4\xb0\x9b\xb8\x12\xc0\x53\xe8\x2a\x55\x55\x60\xa7\xcc\x9d\x35\x9e\x7c\xe2\xbe\xd0\x5d\x9b\x66\xe9\xbc\xc8\xe5\xa7\x24\xcb\xd4\x2e\xb2\x44\x87\x5e\x99\x8e\x4f\x0a\x86\xae\xda\x72\x09\x1c\x04\x49\x25\x4f\x7f\xfe\xf9\x54\x4e\x4c\x8b\x3f\xa6\x59\x26\xc7\x45\xb2\x88\xe4\x64\x6b\x6e\x8f\x93\x93\x57\x91\xbc\x52\x79\x56\xc8\x6b\xe0\x54\xe8\x75\xe5\xdb\x97\xc7\xa7\xaf\x8e\xde\x1c\x9f\x9e\x62\x93\xcc\xc5\xe4\x9d\xd6\xfe\x0c\x6f\x20\xee\x52\xa2\x93\xbe\xb6\x51\xaa\x60\x97\x2c\x31\x6e\x67\x1c\x9c\x20\x12\x06\x02\x51\x55\x9d\xc9\x62\x8d\xd6\xbc\x4c\xdd\x0a\x8d\xe4\x26\xdb\xd2\xbe\xa7\xea\x35\x50\x93\xe1\xd0\xdf\xc2\x9a\x16\xbc\xed\xf4\xbc\x4c\x37\x95\xb6\xc9\x70\x16\x66\xf5\x83\xab\xc8\x22\xa5\xab\x24\xcb\xec\x8d\x51\xbb\xcf\x08\x7d\xca\xe8\x07\x3f\x32\x60\x75\xda\xd2\x04\x1f\x9b\x94\x29\x80\x3b\x49\x46\x41\x3c\x7e\xcc\x10\xa7\x97\xca\x32\xf9\x25\x2f\x1e\xf2\xc8\xe3\x10\xae\x5d\x1c\x58\xd8\x10\x4a\x7c\xa0\xaf\x84\x61\x65\xdf\x0e\xa3\xe0\x41\x9a\x53\x08\xa7\x34\x6e\x19\xac\x78\x88\x6a\xdd\x27\x19\x54\x03\x06\x6e\x1f\x10\xb0\x43\x48\xd9\xf8\x88\x0b\xc5\xdf\x23\x76\xb9\x85\x3a\xc2\xef\x9a\x09\xf2\x1d\x9c\x87\x74\xa1\xb2\x9d\x57\xb5\xbb\x04\x1d\x72\x39\x5f\x99\x1b\x12\x57\x8e\xb1\x11\x6e\x8b\xad\xdb\x98\x75\xfa\x4a\x2a\x4a\x24\x83\xaf\xc9\x28\x04\x27\x00\x92\x2d\xd7\x64\x08\xbc\xfb\x86\x6f\xca\xa8\xa1\x8a\x97\xb0\xc0\x86\x0b\xdd\xd6\x34\xa1\xb4\xde\xda\x83\xc6\x95\x61\x9f\x60\x50\xc2\x6b\x1c\x48\x38\x60\x5f\x18\x0d\x02\x54\x72\xd4\x72\xbe\xfb\x61\x99\x69\xd0\x27\xa7\xff\xc8\xe0\x46\xc7\xd0\x88\xb6\x14\x34\xeb\x75\x91\xdb\x55\x09\xdb\x15\x98\x76\x2e\xda\x48\xfa\xdc\xf2\x8e\x64\x87\xbe\xc3\x23\x6a\xee\x12\xd8\x87\xc5\x83\x2a\x23\xb9\x48\x4b\x35\xaf\x04\x04\xc5\xf0\xdf\x60\x03\xa0\xac\x3b\x42\x6b\x4a\xea\x24\x6c\xca\x3c\x71\xdc\x8f\xe0\xa6\x33\x2b\x22\x19\x06\x02\xd9\xd8\x51\x33\xc4\xe7\xa2\x81\xfe\x98\x7b\xa5\x60\xc1\x4a\xbc\xf4\x96\xd5\x4e\x6e\x54\x39\x07\x21\xba\x57\xc7\xff\x13\x94\x30\xaf\x8b\x52\xb1\x3d\x56\x6c\x2b\x1b\xea\xd4\xab\x84\xe0\x3a\xa8\x9f\x01\x15\x03\xc1\x03\xbd\x36\x39\x7e\x23\x6f\xbd\x3b\xab\xe8\x34\xb6\xb1\x1a\xb8\x3f\xcd\x25\x61\xfe\x87\x39\x6c\x88\x08\x14\xb8\xa1\x8c\xb9\x96\x2d\xcc\xfa\x8d\x1e\xe3\xf2\x14\x56\x36\x27\x28\xf5\x4b\xcb\x05\x15\x54\xb5\x93\xee\xe0\x55\x40\xf7\x3c\x67\x65\x3c\x7a\x1b\x4b\xff\x09\x8e\x0d\x62\x71\x92\x2a\xbd\x57\xa8\xd9\x0f\xeb\x98\x40\x4a\x11\xcb\xea\x44\xc2\xe9\xcf\xb5\xb1\x84\x86\x27\xcc\x41\x8b\xb1\x79\xc8\x59\x09\xc1\xb7\x5b\xcd\x0e\x36\xbb\x45\x5b\x3b\x20\x91\x9e\x9d\xfb\x0b\x18\x78\x60\x46\xe0\xfa\x0d\x6e\x5d\xab\x3e\x68\x2d\x57\x3c\xec\x39\x94\x07\x7a\xd5\x59\x46\xc1\x98\xc0\x6a\x81\xc5\xb9\x4e\xbe\x28\x12\x24\x32\x9e\x52\x84\x03\xb6\x31\x4b\x0e\xe2\x41\xe6\xcb\x78\xdd\x02\xa1\x19\x1c\x33\x1a\xa8\x78\x49\xac\xc4\x05\xba\xcc\xb0\x15\x8e\xca\xf3\x19\xa3\x02\x2b\xe7\x34\x0e\xb4\x7d\x60\x15\xc5\xb2\x5f\xd3\x52\xfd\xa6\x95\x24\x82\x95\x24\xff\xe3\xac\xa4\xd0\xaf\xc2\x27\xc3\xc4\xd6\xe5\x5f\xcd\x78\x8a\xe6\x2a\xe3\x9a\x7b\x60\xa3\xf7\x4a\x3e\x88\x90\x1e\x17\x21\x7c\xa4\xce\xa7\xdf\xe2\x31\xfd\x21\x0b\x32\xaa\xad\xc8\xa0\x1d\x22\x70\xd6\xfd\xee\x52\xc7\x2c\x8b\x1e\x65\x1e\x1a\xe9\xab\xb4\xd2\x81\x02\x2f\x87\x42\x82\xe5\xc7\x47\x9b\xf7\xed\x43\x6f\x33\xc0\x44\xe3\xba\xaf\xad\x79\xe1\xed\x13\x1f\x4f\x59\x5b\xfe\xef\xe4\x41\x7a\xf8\x58\x18\xc2\x6f\x61\xeb\xc6\x80\x21\x96\x07\x69\x7a\xd8\x16\x26\xd9\xff\x64\x3f\xaa\xd1\x3a\x20\xf2\xd9\x03\x62\x49\xe0\x82\x48\xc8\xc8\x55\x34\x03\x36\xf4\x24\xf6\x9d\x09\x64\xfc\xf1\xc4\x65\x6a\xd2\xbf\xc8\x16\x6e\xb9\xc8\x48\x9f\x1a\x35\xfa\xe1\xd7\x36\xc4\x84\x4c\x6f\xcf\xf1\xc9\x7d\x0b\x96\xe1\x93\xce\x75\xb0\x56\x05\x9c\x33\x75\x83\xcd\x4b\x29\x87\xab\x9f\x8b\xb5\x03\x85\x87\x47\x08\x74\x1f\x37\x7a\xc2\xcf\xb0\x7f\x25\x1a\x66\x4f\x3b\xfb\x2e\x18\x93\x1e\x6b\xe7\xa5\xcf\xe9\xa7\xee\x55\xb9\x13\x21\x15\x9c\xeb\x5f\x48\x4c\x1a\x6a\x81\xe0\xd2\x36\xdb\x68\x0d\xcb\xd6\xb2\x1a\xa2\x96\xc5\xae\x75\xa0\x28\x4d\x51\xa9\xb2\x26\x64\x55\x39\x25\x21\x63\x8c\xb2\x22\x49\xcb\xf8\x20\x81\x03\x73\x59\xfe\xc4\xa6\xa6\x25\xef\x88\xe5\x47\x26\xb6\xe6\xe6\x5a\x1a\xe2\x00\x6d\xc3\xe1\x0a\xec\x09\x93\xd6\xfa\xe5\x78\xf8\xe4\x36\x26\x4a\x71\x16\xbf\x42\x3e\xbd\x58\x76\x6b\xd9\x08\x3f\x32\x06\x8e\x7b\x10\x43\x68\x5f\xc3\xc2\xfb\xb5\x5b\xc3\x5c\xea\x01\x3b\xd4\x59\xea\x69\x10\x7d\x43\xd7\xcd\x2e\x2c\xd1\xbe\xb0\xdc\xc1\x6e\x89\xf3\x20\xdf\xc6\xb9\xb4\xd0\x73\x72\xe3\x5f\x02\xf1\x3d\x64\xdb\x9e\x08\x6d\x12\x37\x90\x39\x5f\x61\x4f\x16\x6b\x2a\x05\x85\xc0\x9d\xd8\xf3\x06\xd7\x2d\x3c\xb2\xd2\x65\xbd\xb7\x8d\xf7\x8b\xf6\xf7\x47\x0c\x8b\x07\xed\xdc\xd0\xaf\x49\x2a\x69\xf6\x4c\x25\xab\x07\x95\xdd\x2b\x79\x70\x72\x7a\x28\xd7\x45\x5e\xad\xb4\xc0\x40\x02\x58\xd7\x66\x3a\xd2\x8a\x63\x67\x99\xd9\xc2\x73\x33\x52\xf6\x61\x68\x67\xf1\xc3\x74\xfa\x55\x1e\xbc\xe6\x07\x21\xf8\x45\x24\x2d\x30\x0d\xc9\xa2\x80\x2e\x7c\x1c\x2e\x8a\x55\xa2\x25\x08\x0f\x87\x7d\x17\x4c\x24\xeb\xd6\x7b\x6c\x09\x6e\x4b\xa5\x37\x45\x0e\x91\x40\x4c\x84\xe7\x9a\x65\xa8\x29\x1e\xe8\x2d\x12\xc1\x2d\xc1\xe1\xd1\xde\xf8\x70\x1e\xd2\x7c\xe3\xe9\x49\x4e\xcd\x1d\x9b\xb2\x92\x39\xc4\xd0\x3d\x4b\x08\xb9\x0d\x63\x79\xae\xd0\x85\x6f\xbb\x6f\x62\x77\x40\xa1\x63\x63\x5c\xc1\xf0\xf4\xb4\x67\xfa\x2e\xdc\x0f\x14\x0a\x80\xf9\xc5\x50\x18\xef\x61\xde\xbd\x5c\x36\x75\xcb\x2b\xcf\x7c\x05\xf6\x19\xa6\xfb\xc2\xf7\x70\xc0\x7f\x41\xb4\x29\x8e\x6d\x3f\x6e\x3b\x45\x41\x55\x21\x57\x79\x25\xa0\xe0\xca\xe9\x5b\xd4\x2d\x2f\xc8\x9f\x23\x48\x9f\x9d\x3a\xac\x7f\x66\xb7\x2e\xdb\x45\xe8\xe7\x84\x51\x40\xeb\xd6\x63\x98\x8c\x62\x1c\x7c\x39\xf9\xe5\x05\xe6\xaf\x69\x6e\xfd\x47\x6f\xa6\xd1\xdb\x06\x69\x74\x3c\x86\x59\xb7\x3c\x7f\x64\x9f\xe3\x59\x1c\x6a\x6f\x61\x54\x25\xf5\x4f\x2c\x3e\x09\xd1\x15\x84\xa6\x83\x5b\xe9\xfb\x7c\x8d\x00\x92\x0d\x1c\x9f\xc5\x2f\xf7\x31\xc2\x5e\x01\x43\x13\x5a\x04\x2f\x8d\x4d\x30\x85\x35\x75\x0d\xd6\x35\x9a\x85\x31\xcb\x06\x80\x09\x65\xcb\x3d\xe8\x46\x21\x43\x1c\x4d\x6e\x46\x96\xf1\x7b\x44\xc8\xa8\xca\xcc\x27\xb4\x11\x59\xde\x34\xc9\x88\xa0\x6c\xce\xee\x86\x31\x7d\xb6\x55\x9a\xa5\xff\xc0\x59\xf5\x48\xd9\xe9\x58\x3d\xa4\x72\xf7\x70\x9d\x00\x9e\x16\x96\xa7\xcd\x80\x87\xb1\x27\x8f\xd7\xbf\x4a\xab\x4c\x2d\x64\xe7\xb2\xff\xa1\x7b\xd9\x61\xc2\x61\xd6\x4b\xc1\x35\x0d\xda\xef\xbc\x56\xb1\xa3\x68\x12\x7b\x7f\x4e\x73\xa1\xb7\x4b\xe3\x84\x03\x19\xb2\xaa\x40\x66\x1f\xc7\xc6\x9e\x1e\x58\x5d\x69\xc6\x0e\xcf\x67\xde\x4f\xf3\x0a\x46\xd7\x74\xa5\x98\x01\x64\x12\x4e\x1d\x37\xc8\x78\x46\xe2\xa6\xfa\xa2\x9a\x04\xf0\xbe\x84\x56\x78\x61\x0a\x8f\x66\x14\x2f\x64\x24\x64\x31\x7b\x69\x63\x76\x85\x2d\xa4\x54\x12\xc6\x80\xb0\x89\xb9\xaf\xfe\xce\x2f\xf6\x39\xe6\xbc\x18\x70\xbe\xf0\x25\x16\xd1\x3d\xd1\x95\xda\x68\x79\x80\xe0\x05\x40\x03\xa4\x4b\x88\x3e\xd1\xbe\x12\x7e\xd4\x6c\x9d\xa4\xe0\x4e\x64\xa9\x46\xba\x94\x5c\x3d\xe8\xbb\xb2\xd8\x6e\xf4\x21\x95\x7d\x27\xb3\x6c\x27\xe7\x49\x66\xd6\x0c\xc1\x89\x11\xe9\x8c\xe2\x00\xe2\x61\x55\x98\x71\x56\x50\x98\xd3\x0c\xa2\xc2\x4c\xe4\xea\xc1\x1b\x53\x7b\xe6\xe3\x90\xab\x45\x4c\xb4\x81\x02\x69\x03\x03\x36\xf3\x5a\xa6\x12\xe8\x61\x19\x26\x43\x98\x33\x62\x7e\x4d\x88\xcd\xae\xd0\x2c\xd9\xed\x0f\x6c\x84\x60\x8d\xd0\xac\x36\x2f\x80\x5f\x17\xec\x71\x73\x5e\x56\xa3\x90\x36\xb1\xc1\xcd\x14\x06\x52\xe1\xb3\xb6\x23\x40\x54\xe4\x7b\xc3\xab\x04\x83\xbd\xb8\x30\x0f\x1a\x2a\xf4\xc2\xa9\xd0\x3f\xea\x39\x1f\x06\x8a\x9a\xcd\x76\xc3\x19\x2d\xc2\x61\x68\xae\x23\x2a\xfd\xb2\x04\xf6\xb8\x35\xac\x12\xbd\x05\x6e\x50\x20\xc2\x9a\xa4\xb0\xaa\x6d\xb8\x9a\x82\x96\x5e\xaa\xa5\xa5\x3d\x78\x7a\xd5\xc2\x11\xdd\xeb\x81\x3d\xbb\xea\xbc\xfb\x88\xff\xf6\xdc\x1f\x82\x03\xaf\x91\xae\x9b\x03\xe4\x6c\xd4\x17\x0f\xbe\x98\x29\xe5\x48\xd8\x2b\x42\x93\xc0\x2e\x55\x9f\xf6\x57\xa4\xa6\xef\xee\xba\xea\x5e\x0f\xbc\x73\x0b\x14\x04\xf8\xf0\xaa\x90\x27\xd9\x65\x7a\x1a\x2b\x08\x7a\xf9\x2a\x96\x63\x44\xc1\x2c\xe4\x10\xc9\x92\xbd\x1b\x73\xb1\xc5\x1e\xe1\x3d\xe1\xee\x9f\xfe\x57\x90\xb0\x95\x5d\xce\xda\x62\xe5\x74\xd3\xef\xf0\xa8\xad\x7c\xf5\xff\x7c\x17\x5e\x4e\x36\xd7\xed\x25\xa0\x20\xf6\x49\x42\x97\xf6\xba\x6a\x71\x17\xfc\xa5\x15\x5e\x57\x72\xb0\x14\xce\x3c\x5f\x48\xc2\xcf\xad\x8b\x32\xbc\xe4\x21\x2d\xc5\x1e\x46\xb2\x58\xe0\x8a\x80\x0b\x1a\x92\x89\xbe\x8f\x4e\x89\x5c\x1a\x8a\xc0\xa1\xb0\x83\x02\x8b\xc4\xd5\x15\x70\x96\x17\xc0\x68\x4c\x6a\x85\x0f\x10\x60\xff\x78\x57\x58\xe0\x0d\x80\x59\x84\x24\x75\xc0\x7e\xc6\xc9\xd3\x08\x51\x5d\xf5\xfb\x4a\x78\x0f\xc6\xcc\x03\x68\x83\x82\x8b\xcf\xa7\x67\x02\x3e\xe7\x7d\x62\x6e\x16\xb0\x5f\x8a\x12\x15\x83\x0e\x69\xb4\x91\xf3\x5a\x20\x52\x6f\xa6\x64\x96\x7e\x51\x48\xeb\x96\x15\xc5\x17\x8c\x7f\x20\x8c\x0c\x5f\xe4\x3c\x49\x64\xbf\x87\x1c\xaa\xf1\xc2\x68\xe6\x0b\x81\x69\x08\x63\xe6\x29\x30\x6f\x23\x5b\xd6\x1f\x31\xd7\x7d\x04\xdc\x8c\xeb\x9c\xae\x6d\x47\xd1\xe9\xb3\xa6\x55\x85\xf0\x27\xd0\x13\x41\xa8\xfb\xec\x2d\x7e\xa3\xa7\x7c\x83\x2a\x1d\xa5\x30\x7b\x10\xc5\x89\x22\x2b\xc6\x10\xe8\x15\x99\xfb\xa5\xa9\x38\x1e\xd7\x24\x25\xd2\x4a\xd4\x55\x25\x10\x56\x81\x38\xef\xf9\xea\x37\x75\x57\xa4\xba\x55\x36\xc2\xc5\x05\x28\x08\x6a\x55\xc6\xe8\x91\x4b\x67\x6f\x42\x40\x20\x58\xbc\x2c\x05\xee\xde\x98\xe6\xf3\x2d\xf3\xca\x51\x7f\x1b\xf1\x45\x5a\x36\x7a\x9b\xc1\x71\x69\xbb\x23\x9e\xea\x8e\x53\x46\x80\xae\xc0\x79\xf3\xba\x16\x45\x6a\xe6\xfa\x38\x2e\xe5\x81\x18\xbd\xd0\x28\x4f\xb4\x60\x44\x4b\xfd\xdb\x98\xfe\x34\x13\x4d\x9e\x50\x1d\xe4\xe7\x51\xc7\x1e\x9d\xc5\xaf\xc0\x0a\x15\xe8\xb2\x29\x16\x2f\xa8\xfb\x17\x11\x7b\xb4\xa8\x29\xd4\x70\x23\x78\xd7\x51\xc5\x8c\x68\x73\xdc\x1a\x55\x0b\x75\x04\x83\x33\x89\x6a\xb1\xa5\x7a\xec\x24\xc8\xd4\xd2\x19\x64\x3d\xb4\x55\xf1\x80\x7c\x6d\xf6\xf0\x04\x33\x7b\xb9\xcd\x96\x69\x96\xa9\x05\xdc\xff\xfe\xbe\x0a\x86\x84\x22\x63\xd4\x1d\x8e\x5a\xcc\x8b\x5c\x6f\xd2\xf9\xb6\xd8\xea\xcc\xc6\x60\xc0\x26\x79\xae\x5b\x12\xb5\x3b\x25\x78\x09\x66\x50\x62\x91\x64\x7b\x5c\x94\x27\xce\xfc\xa6\x9b\x82\xea\xe4\xe1\xba\x01\x9f\x78\x9f\xcb\x54\x8f\xf9\xd5\x74\x6a\x44\x5d\xa7\x06\x1b\x89\xc5\x4a\xe8\xc4\xe2\x52\xb7\xb9\x68\xaf\xa0\xdb\xce\x99\xad\x8b\xd9\x2f\x6e\x23\xf7\x88\xdb\x5c\x7a\x69\x02\xbb\xb4\xb8\x71\x7c\x75\xee\xeb\x9d\xc5\xd0\x1a\xcf\x6c\xbd\x81\x94\x07\x2a\xab\x98\xbd\x9d\x71\xc8\xc4\x8e\xb2\xe3\x02\xb4\xda\x0b\xcd\x35\xec\x08\x58\xf1\xa3\x4e\x7b\x90\xcb\x9e\x6c\x46\x90\x9c\xbd\x67\xce\x05\x0f\xbd\x1b\x4a\xb6\xeb\xac\xe4\x3c\x1d\xbb\x0d\x31\x1f\x69\xc5\x7c\x70\xf4\xc8\x03\x4b\x31\x70\x5f\x9f\x10\xb1\x4f\x99\x27\x62\x59\x9e\xc7\xce\x7f\xff\xf4\x15\xcf\x3b\x7d\xe5\x73\x4e\x5f\xf1\xd4\xe9\x6b\x6f\x95\xb6\xc3\xf5\x4d\xec\x27\x67\xbc\x03\x94\x02\x94\x41\xee\x26\x40\xbc\x87\x1b\x40\x78\xd9\xa1\x6f\x83\xc5\xb5\x64\xb2\x84\xff\x4e\x04\x67\xa5\xf9\x5d\x66\x59\x10\xc0\x59\x62\x68\x3a\x48\x6e\x87\x17\xac\xde\x96\xaa\x71\x90\x37\xc2\xc9\x66\x36\xed\x19\x67\xcd\xc9\x96\xf0\x05\x44\x2e\xec\x0d\x55\x00\x7e\x3e\xdb\xc9\x73\xb4\xb3\x26\x55\x52\x6d\x31\x94\x3b\x56\x77\xdb\x8c\xeb\x6b\xac\x41\x07\x21\x72\x17\xaa\x33\x4d\xad\xa9\x71\x38\x42\xb8\xd6\x11\x12\x0d\x82\xeb\x62\x8d\xd9\x02\x87\xa3\x08\x4f\x23\x32\x01\xb5\x6b\x5a\x69\x9b\x26\x2a\x96\x63\x33\x03\xf6\x0e\xc2\x48\x7e\x63\xf6\x4f\x54\x2b\x22\x51\x70\xe7\x28\xeb\x34\x3b\x0c\x23\x45\xbe\xf4\x32\x87\x31\x50\x09\x0a\x24\x5b\x00\x67\x8f\xbc\xce\xc2\xbf\x96\x1c\x73\x6a\xa8\x02\xe3\xb9\x77\xad\x22\x51\x67\x31\x30\xb3\x8b\xc6\xf7\x2d\xf0\xa4\xc1\xee\x52\x3b\xb0\x62\x16\x25\xc2\xee\x0a\x06\x5e\x96\x05\xd8\xea\x94\x51\x6d\x1b\xd9\x08\xd7\x64\x5b\x37\x5c\x78\x26\xdb\x09\xf4\x42\x69\xcd\xf9\x11\x9a\x62\x29\x8b\x72\x81\x5c\x2f\xfa\x4b\x9a\x65\xcc\xc0\x4a\xae\x80\xe3\x4c\x97\x69\x65\x35\x33\xa6\xac\x00\x23\x6f\x74\x02\xe8\x9d\x57\x90\x59\xf3\x38\x57\xae\x98\x73\xe5\x1b\xe9\x58\x44\x11\xe8\x6b\xd6\xd2\x5c\xe0\xee\x3d\x8f\x92\xa5\x33\x5d\xa5\x5a\x3c\x83\x93\x05\xce\xb5\xbd\xb8\xb9\x8e\xe9\xdb\x69\x2c\xfb\x48\x90\xb2\xc6\xa0\xf8\xd4\x72\xab\x74\xe0\xab\x51\x87\xfe\x51\x7f\x46\x07\x56\x20\x41\xf4\xb6\xba\x12\x54\x01\xf6\x08\xef\x4a\x4b\xf6\x13\x82\x44\xfe\xa1\xf9\x08\xbb\xb1\x57\x57\x84\xee\x01\xcc\xce\x19\xe8\x85\xc2\x50\x0c\x4d\xbb\xe3\xf6\xd7\x98\xc6\x06\xef\xe1\xec\x9b\xb1\xaf\x12\xb0\xcc\xb0\x9f\x1d\xa0\x98\xa1\xda\x1d\x50\x9b\x94\xfc\x07\xd4\x44\xa2\xdd\x93\x96\x34\x4e\x8c\x23\x69\x34\x58\xb4\x35\x18\x05\x36\x5c\xef\x03\x09\x7e\x50\x6f\x38\x89\xe5\x50\x3d\x78\x66\xb8\xb9\x9a\x4c\x7b\xa8\x42\x55\x96\xea\x3e\xd5\xc8\x6a\xfe\x02\x43\x6c\xae\x8a\x35\x7c\x1e\x49\xe2\xa5\x6b\x3c\x6f\xd2\xb5\x22\x38\x07\x5f\xf7\x4c\x12\x87\xc5\xec\x09\xec\xe7\x34\xbf\xdb\xa6\x7a\x65\x96\x1e\x7f\x2c\xdf\xae\x67\x70\xc7\xbd\x86\x05\x83\xb4\xc3\xc5\xb2\xd6\xce\x91\x31\xa1\xc2\x65\x6d\x43\x73\xae\xba\x96\x2c\x0c\xe1\x79\xdd\x35\xcb\xdc\x9a\x6c\x36\x26\x90\x3d\x24\x3b\x1d\xb0\xc6\x03\xb1\x55\x65\x03\xc9\xc1\x29\x9b\xd8\x74\x51\xec\x3d\x42\x17\x9e\x8b\x6c\xbe\x0e\xe7\x4b\x8b\xe1\x19\x3e\xae\xbd\x5c\xb8\xd6\xd4\xa0\x78\x18\x21\x57\x43\xe3\xee\x2a\xe1\xe1\xfc\x01\x84\x95\xd4\xf0\xe9\x5e\xd0\xd6\x49\x1f\x52\xea\xb6\x1e\x50\x11\x1c\x48\x69\xc2\x81\xad\x8c\x45\xab\xee\xd4\x2e\x16\xe2\xc3\xe8\x53\x7f\x3c\xec\x9f\xcb\xde\xe8\x3c\xe4\x28\x02\x55\x1a\xa4\x88\xb9\x1c\xf4\xfa\xc3\x49\x1f\x39\x6c\xac\x20\xd5\xfb\xee\x64\x30\x89\x2c\x79\x60\x9b\x26\x55\x24\xfb\x03\x5f\x76\xaa\x7f\xee\x11\x18\x05\xac\x45\x4d\xbd\x9f\xc8\x67\x2a\xb2\x52\x52\x8d\xf6\xa2\x88\xd4\x85\x3c\xef\x5f\xf4\x7b\xd3\x49\xe4\x31\x1a\x5d\xf6\x41\xc2\x49\x5e\x8c\xc6\xa2\x95\xc7\x68\x34\x96\xc3\xd1\xf0\x88\xa4\x98\x06\xc3\x0f\x31\xbc\xa3\x3f\x9c\x0e\xc6\x7d\x39\x1e\x4c\x7e\x95\xdd\x09\x8b\xfe\xfc\xeb\x4d\xf7\x72\x30\xbd\x05\x4d\x9d\x40\xf4\xe7\xa2\xbd\x61\x20\x27\x74\x3b\xba\x89\xe5\xe4\xe3\xe8\xe6\x12\x68\x9c\xc2\x4f\x09\x33\xd6\x7d\x6a\xf9\xe0\x53\x9f\xc9\x7a\x48\xcc\x29\x32\xdf\x96\x07\xc3\xd1\x14\xd6\x48\xa0\x22\xe4\x11\x2a\x1d\xca\xee\x64\x72\x73\xd5\x07\x05\x31\x12\x38\x82\x4f\x0e\xfb\xbd\xfe\x64\xd2\x1d\xdf\x12\xa3\x11\x8c\xf3\xb8\x7f\xdd\x1d\x8c\x91\x3f\x69\x3c\x46\xe5\xa3\x18\x67\xd9\x32\x3a\x8d\xc5\xe8\xc2\x49\x8c\xf5\x46\x43\xa2\x48\x9a\x98\xd9\x37\xb3\x88\x94\x4b\x66\x40\x2d\x8b\x10\x2d\x91\x58\x0e\x47\xcc\x2e\xe4\xf7\x57\xf0\xa8\x74\x6f\xa6\x1f\x47\xe3\xc1\x7f\xf3\xa5\x8f\x88\x01\xc5\x5f\x71\xae\x2d\xb8\x84\x7f\x0e\x94\x73\x62\x21\x7e\xa6\x24\x56\xdd\x0b\xb3\xae\x4f\x53\xb2\x07\x0e\x35\xa7\xd8\x93\x6c\xab\x62\xcd\xdc\xc9\x82\x82\x08\x4b\xc8\xea\x84\x96\x23\x6e\x40\x2c\xd2\x80\xb7\xd8\x0f\x19\x13\x18\x8e\x8b\x59\x09\x35\x32\x28\x50\x27\xce\x8e\xe5\xc2\x1c\x4c\xc5\x52\xce\xd4\xbc\x00\xd1\x1b\xd4\xdb\xa7\xe3\x01\x3f\x8e\x76\x82\x83\x9b\xe9\x56\xb7\x59\xb8\xe8\x33\x86\xef\x3d\x61\x42\x4c\xca\xb0\xa0\x0d\xbb\x58\x75\x51\x1b\x7b\x16\x5c\x7b\x4a\x38\xe6\xa1\x11\xf9\x0c\x70\x65\x61\x04\xd3\xcf\xf0\x3b\xd1\xa6\x99\xda\x15\x34\xba\x6d\xf2\x46\x3c\x03\x41\x73\x60\x8e\x4e\x6d\x52\x11\x53\xfe\x95\xe2\xc2\x03\xc6\xa0\xad\xd1\x97\xac\x58\x7b\x93\xe0\xe1\xd6\xcb\x0b\x91\x58\xf4\xdb\x1a\xe0\xdb\x7e\x09\x72\x6e\x30\x8d\xc0\x93\x02\xce\xcb\x9c\x33\x01\x16\x89\x5f\x15\x32\xd1\xa2\x73\x0d\x17\x4d\xba\x49\xf2\xaa\x73\x68\xac\x56\x75\xc7\xc9\x7d\x82\x14\xc2\x03\xbc\x8f\xfd\xa4\x9b\x50\xf5\x36\xe4\x56\x7b\x42\x5a\x70\x97\xfd\x02\x0c\x8a\x19\xfb\x92\x8e\xb5\xf5\xcb\xd0\x42\xaf\x1d\x82\xb4\xa3\x03\x78\x92\x96\xa7\xf1\x09\xdf\xfd\xa7\xf1\x69\xc3\xb3\x80\xd9\x89\x50\xa8\xea\x35\xad\x50\x0a\x77\x83\x39\xe0\xbd\xc0\xdb\x25\x9b\xb2\x00\x97\x28\xbd\x57\xd9\x2e\x62\xf9\xae\x74\xc9\x62\x8c\xfc\x24\xcc\x14\x42\x82\x6e\x03\x65\xf7\x14\x7e\x32\xed\x44\x68\x0c\x62\xee\x30\x30\x1a\x6a\x35\x6c\x92\x5d\xf0\xf6\x44\xae\xb7\xd5\x16\x6b\xf3\xcc\xc7\x01\xa9\x61\x53\x2f\x8a\x91\xa4\xec\xe9\x95\x72\x93\x68\x54\x43\x20\x60\xd7\x76\x1f\xc6\x15\xd7\x8e\x68\x87\xe7\xd5\x87\x19\x31\xdc\x69\x8a\xd0\xe0\x45\x99\x3c\xe0\xdb\xbc\xd5\x0a\x77\x6a\xc3\x75\xdc\xf7\xde\xd6\xc5\xc2\x6b\x17\xc4\x85\xbd\xb7\xc3\xce\xa9\x0d\xb2\x1d\xd6\x08\x89\x3a\xea\x03\x02\x1c\x0c\xc9\x0e\x44\xd7\xe1\x8a\xbf\x73\x5a\xa5\xc6\xa6\x0d\x87\x75\x81\x6b\xc1\x9b\x0b\x0a\x21\xb0\xe6\x13\x8d\x56\xbd\xbf\x9c\x40\xe1\x51\xc9\xa3\xb6\x73\x77\x16\xce\x29\x2e\x59\xf1\xf8\x92\x0d\x8e\x64\xff\xa8\x46\x2b\x5a\x7d\xdd\xa4\x2c\xeb\x8f\x55\x1f\x38\x30\x96\x43\x49\x95\x69\xb1\xf0\x38\x62\x80\xb3\x93\x0a\xbc\xc0\x60\xb3\x44\x0c\xab\xa4\x5c\x58\x4a\x86\x85\xba\x4f\x3d\x86\x1c\x96\x66\xa7\xd1\xf0\x57\x84\x6f\xb7\xfd\xc6\xd3\xc1\xe1\x55\x44\x70\x3c\xc8\x27\x8e\x87\xda\xf0\xba\x36\xd6\x17\x4e\xcb\xb1\x80\xfd\x5f\x98\x31\x86\x7f\x42\x9e\xe6\xbe\xf8\xa2\x16\x4e\x24\x45\x26\xb6\xd6\x1e\xd0\x3a\x78\x8c\x96\x10\xee\x21\xd4\xf9\x22\x92\xba\xc8\x00\x71\x63\x51\x97\x30\x80\xab\x64\x41\x9f\xaa\x8f\x80\x78\xa2\xdc\xd7\x5f\xf0\xe6\xc2\x38\xb3\x17\x46\xa2\x81\x41\x2d\x69\xbd\x30\x08\xb1\x41\x5b\x27\x38\x3b\xe8\x1c\x17\x56\xb1\xfb\x0f\x3e\xc1\x29\xa2\x8f\xe8\x5c\xde\x1e\xa5\xd2\x45\x76\xaf\x16\x2e\xc3\x37\xf3\x33\xe1\x52\xab\xaa\xc2\x84\xf1\xa1\x40\xdf\x90\x8e\x0d\xba\x26\xe9\xfa\x7e\xfc\xae\xa4\xc5\x81\x31\x38\x3e\x0b\xc4\x7d\x92\x6d\xed\xe9\xd7\x10\x30\x6c\x39\xe6\xda\xae\x11\xdc\x8f\x4e\xcb\xa9\x4a\xbe\xa8\x9c\x44\xab\xe7\xf3\x62\x0b\x8d\x92\x0b\x85\x5b\xd4\x22\x3b\xd7\xf0\x97\xa2\x94\xb6\x11\x38\x4e\x78\x22\x41\x12\x8a\xdd\x92\x9f\x11\xab\x84\xfb\xfa\x9e\x95\xc8\x3c\xeb\xa5\xd6\xaa\x9f\xb1\x55\x3f\x9b\x53\xc2\xec\xea\x08\xee\x4a\x95\x2f\x04\x88\x01\x5b\xc4\xbe\x95\xb7\x93\x07\x50\x5e\xb0\x20\xe6\x5d\xc7\x03\x8b\x9a\x8a\x5a\x65\x99\x2a\xf5\x21\x85\xa3\x5d\xb6\x09\x74\x09\x3c\x1b\x8b\x62\xd0\x14\x24\xf6\x9e\xe4\x59\x96\x6e\x0a\x3d\xeb\x28\x34\xce\xaa\xc0\x7a\x95\x52\xbe\xdd\x2b\xc4\x1a\x0b\x81\x96\xf0\x70\x24\x7b\x83\x71\xef\xe6\x6a\x32\x35\x9e\x06\xf2\xc4\xda\x3f\x61\x94\x0e\xf9\x44\x1d\x85\x68\x8d\x20\x54\x38\x82\xd0\xc3\xc8\x23\x17\xf5\xc9\x42\x23\xe2\x6c\x1d\x4f\x3e\x45\x60\xb4\x7b\xce\x45\x24\x2d\x45\xeb\x84\x7f\x67\xbc\x83\xc0\x8f\xb1\x1f\x9a\xdc\x5c\x1b\xcf\x6e\xcc\xd6\xbf\x15\xbf\x35\xae\x57\x7f\x12\x79\xd4\xaf\xd3\x91\xf1\x6e\x44\xe0\xd4\x5c\xf7\xc7\x93\xd1\xf0\x11\x91\x59\xcb\x04\xeb\xd3\xc3\xd6\xa9\x60\x45\x4d\x59\xb6\xf7\xb1\x6b\xfa\x0c\xf4\xaa\x8f\xb9\x9b\x96\x42\xd6\xbc\x9f\x98\x5f\xc5\x87\xd1\xe8\xfc\xf3\xe0\xf2\x32\x92\x9f\x47\xe3\x5f\xe5\x64\x3a\xba\xbe\xee\x7e\xe8\x9b\xa1\xbc\xba\xbe\x31\x0f\xbd\xe8\x0e\x2e\x6f\x50\xe4\xf5\xaa\x7b\x79\x71\x33\xec\xe1\xd3\xa8\x13\xc0\xdf\x7b\x79\x89\x3d\x14\xbd\xd1\x95\x71\x4f\x03\xfd\x5b\x7c\x99\x19\x1d\x56\x6a\xb5\x63\x76\x4b\x33\xf3\xb1\xfb\xa9\x8f\xa2\xad\xac\x2b\x2c\x9e\xa1\xda\xca\x8e\x19\xf7\xd0\x7c\xc0\xb2\xc9\xd2\x93\x87\xa3\xa9\xe8\x5e\x5f\x5f\xde\x9a\x09\x71\x7f\x34\x43\x70\xde\xef\xa2\x1e\x2e\x4e\x4b\xf7\x52\x0e\x86\x7f\xb9\x01\x8d\xe8\xc9\xcd\x25\xc8\xe1\x5e\x8c\x47\x57\x5e\x6b\x7f\x9a\x78\xcb\x8d\xdd\x66\xd6\x68\x36\x2b\xa3\x07\x53\x7f\xd9\xfd\x2c\xaf\xc7\xa3\x8f\x83\xf7\x83\xe9\x04\xbf\xee\x1a\x19\xcb\xc9\xe8\xaa\x2f\xff\x72\x33\x1e\x4c\xce\x07\x30\x96\x13\x71\x3e\x02\x46\x63\xd0\x79\xa6\x87\xf6\x2e\x6f\x26\xd0\xa7\x71\xad\x87\x6e\x69\xec\x25\x09\x8e\xc4\x64\x84\x11\x05\xf7\x1c\x33\x4f\xde\x83\xae\xba\xb7\xf8\x4a\x1e\x1b\x70\xe4\xc3\x2e\x99\x27\x80\x64\x82\xd7\x9a\x0b\x3b\xaf\xdd\xf7\xc6\xb7\x1f\xa0\x22\xf6\xa7\xee\xe5\xe0\x1c\xfd\xf9\xee\x87\x71\xbf\x8f\x6f\xaf\xeb\x2d\x8b\xf1\xe4\xd3\x4f\x13\x6f\x1a\x70\xaf\xb3\x00\x31\x30\x18\xe3\xa4\xc2\x43\x80\xc3\xd8\xb8\xce\xfd\x73\x79\x31\xf8\x64\x1e\x3a\xba\x99\x98\x8e\x9c\x8f\x2e\x2f\xbb\xe3\x89\x38\xf8\xff\xbf\x8a\x8e\x8f\x8f\x0f\xe3\xf6\x08\x85\x69\xd9\x60\x38\xed\x0f\xcf\xcd\x13\x48\xbc\xb8\x45\x13\xb9\x3b\xbc\x15\xc3\x9b\xde\x65\x7f\x1c\xc9\xee\xa7\x01\x6d\x97\xab\xee\x64\x22\xa7\xe3\xee\x70\x32\x00\x4d\xe2\xab\xfe\xf9\xa0\xd7\xbd\xe4\x99\x9e\xd2\xec\xb8\xed\x3d\x18\x1a\x8f\x7f\x38\xbd\xbc\x15\xe7\xdd\xe1\x87\xfe\x78\x74\x33\x09\x3e\x0d\x83\xd2\x83\x58\x09\xae\x31\xd3\x18\x58\x86\x51\x7d\x11\x46\xb2\xd7\x9d\x76\x27\xd3\xf1\xe8\xfa\xe3\xa0\x47\x5b\x1e\xf7\xe0\x64\x22\xcf\xfb\x93\xe9\xf8\x86\x36\xa2\x19\x90\xda\xc0\x0f\x29\x2a\x65\xdc\xc9\x21\xb5\xd1\x3b\xf4\x84\xb7\xeb\xcc\x9f\xdc\x84\x70\x64\xa5\x3b\x35\x5b\x1e\x04\x9a\xa9\xa5\xf4\x17\x58\xcd\x4e\x03\x3a\x0c\xaf\x11\x67\xd6\x71\x2c\x6f\xe2\x49\x4c\x6e\x3e\x5c\xea\xfd\x7c\x21\x6f\x34\x02\x74\xa7\xad\x20\x04\xd9\x99\x17\xeb\xb5\x2a\xa1\x06\x34\xad\xd4\x3a\xea\xa0\x26\x7f\x82\xde\x9a\x4c\x03\xc9\x9e\x97\x3f\xcb\x5e\x7c\x11\x8f\x63\x71\x1a\x9f\x1c\x9f\xc8\x83\xd1\xbc\x8a\xe5\xc9\xdb\xb7\xaf\x0e\x2d\x83\x14\xd5\x77\xf9\x0f\x9e\x17\xeb\xcd\xd6\x38\x72\xda\xd2\x19\x42\x34\xdf\x7d\x44\x34\x3e\x12\x42\x07\xb0\x59\x5e\x2a\x34\x29\x29\xf6\xef\xb7\x4a\x9e\x9c\xc6\xa7\x27\xa7\xe2\x60\xa2\x36\xdc\x2e\x08\xd0\x07\xcc\x56\xf5\x8f\x43\x5b\xdc\x2f\x4f\x4f\xdf\xc4\x6f\x4e\x8f\x4f\x8f\x4e\x64\xb5\x2a\x8b\xed\xdd\x4a\xd8\x5f\xbd\x94\x07\x7f\xd9\xe6\x8a\x7b\x6c\x6e\xe2\xbd\x63\xce\x1c\x07\xad\xc9\xd6\xdc\x38\x22\xc0\xe2\xd8\x48\xa9\xfb\xb4\x1d\x27\x27\x35\xa9\x60\xa6\xab\x75\x35\x45\x84\xa2\xb4\xb4\x3a\x88\x96\x4c\x7c\x2d\xe1\xb9\x2a\xc1\x98\xaa\xa9\x02\x33\xc3\x0a\x29\xcf\x3a\xfd\xd5\xba\x8b\x9f\x6a\xb9\x52\x19\x6b\x0a\x06\x6a\xb2\x91\xa5\x41\xc3\xef\x3a\xdb\xae\x54\x44\xb5\x86\x7d\x2d\xc8\xd5\x82\x69\xf0\x41\x8e\x36\xc1\xef\x3d\x15\x43\x70\x22\x0c\x00\xcd\xc2\xba\x30\x8f\x83\x01\xa5\x4e\x6d\x10\xea\x40\xf9\x49\x40\xce\x75\x7a\x91\x6e\xd4\xc4\x84\x5e\x5b\xa0\x86\x76\x05\x7d\x87\x80\xc9\x25\x1b\x8f\xf8\xfe\x41\x56\xf5\xa8\x58\x1e\x65\xc9\x83\xa7\x37\x49\x0c\xb3\xe4\xd8\xea\xed\x6c\x9d\xc2\x7b\x37\xaa\xd4\x50\x8a\x14\xc8\x93\xa6\x79\x4d\xe0\x55\x2c\xb7\x25\x96\x37\x22\xae\x8b\x11\x0d\x58\x5f\x61\xec\x5c\xc2\xb3\x92\x8c\x2a\x9a\x85\x1e\xe6\xbf\xa1\xbf\xea\xc6\x7f\x06\x4b\xb7\xe2\xe4\xeb\x05\x69\xa2\xf6\xac\x14\xaa\xf9\xed\x90\xe4\x50\x09\xa5\x85\x69\x16\x4f\x45\x41\xfc\x16\x69\x54\x33\x24\x59\x01\x0d\x26\x7e\x36\xd3\x26\x31\x6b\x96\xbe\xcc\x0b\x5d\xe9\x96\x3a\xbe\x80\x02\x04\xc4\x5b\xf1\xa3\x64\x64\x5b\xa7\x24\xa9\xaa\xa2\xcc\xd5\xee\x27\x2d\x97\x8a\x68\x76\xd5\xd7\x0d\xf8\x26\x4d\x8a\xcf\x24\xdf\x55\x2b\x0f\x46\x84\x15\xf6\xe5\x8e\x76\x5c\x24\x38\xf3\xa5\x95\xfa\x22\xd3\xfc\x6f\x50\x60\x70\x0f\x85\x7b\xa9\x5a\xfa\x83\x9e\x70\x68\xb6\x4d\xd4\x16\xa8\x48\xb0\xd5\xa0\xdd\xb1\xde\x28\x58\xf5\xfe\x5a\xc0\x51\x4a\xc2\x0a\xca\xca\xc9\xfd\x0e\xc9\xab\x75\x62\xbd\xa2\x2e\xd6\x0b\x1f\x7f\x4c\xac\x17\xa4\xd2\x80\x53\x22\xdb\xd1\x8a\x56\x0b\xa8\x6c\x13\x24\xee\xee\xf2\xdf\xbe\xa8\xf9\x42\x69\x0f\x77\x44\xbc\xa0\x58\x0c\x6c\x49\x09\x78\x99\x09\x4f\x2e\x9b\xdc\x66\x28\xcc\x29\x31\x70\xb7\x4f\x2f\x38\xc8\x23\x9d\x80\x70\x0a\xad\x0c\x44\x6a\x98\xee\x51\xf9\x88\x10\x94\xd3\x4f\x73\x00\x8c\x68\x86\xae\x12\x99\x47\x50\x2a\x9e\x68\x88\xa2\x33\xfb\x88\x0b\xb6\xbb\xf2\xbf\x97\xd1\xde\x4a\xac\x45\xb2\x06\x06\x54\xda\x6e\xfb\x4b\x80\x0a\xa4\x00\x85\xb0\x9d\x5f\x68\xe2\x24\xeb\x9b\x39\xb3\x28\x24\x3d\xc6\x1c\x27\x2e\x90\x4d\xaa\x00\xe2\x12\x5e\xcf\xae\x08\xcf\x55\xb1\xa1\x53\x0e\xfb\x51\xc3\x07\x6c\xe9\x02\xc4\x5a\xb1\x2d\x69\x7e\x87\xc0\x22\x6c\x0b\x15\xf1\x13\x48\x9e\xe0\xc0\x4b\x54\x43\xa7\xaa\x34\x46\x95\x22\x9f\x16\xa0\x2d\x98\x44\x91\x35\xd6\xab\xc2\x07\xfa\x94\xe1\x74\x61\xd9\xb9\xfa\x3b\xd3\xf3\x42\xd5\x79\x2c\xfb\x7f\x05\x63\x5c\x76\x85\xe8\x4c\x6b\xc4\x4a\x4e\x5e\x2b\x29\x1b\xa2\xce\x4f\x32\xdd\x79\x44\x77\x44\x87\xce\xbc\x56\x87\xbf\x58\x21\x4b\xb3\xec\x90\x80\x83\x5f\xa5\xdc\x4a\xb2\x28\x3c\x61\x91\x33\xb6\x80\x99\xb3\xb8\x58\xe0\x11\x94\xe1\xba\x1c\x6c\x52\xf9\x2c\xf9\x65\x8a\x95\x42\xc0\x65\x3f\xbe\xbe\x14\xc2\xf2\xa6\xb6\x4b\x22\x7a\x77\xab\xff\x01\x1c\x49\x4e\x85\x62\xf5\xbe\x60\xaf\xb2\x3d\x15\x4a\x15\xa2\xb4\xd5\xa9\xb0\x37\x4b\xcd\x56\x9f\x28\x15\xbc\x8c\x25\xbe\xad\xca\x8c\xdd\xdd\x78\xb3\x7a\x0c\x30\x66\xcd\xf8\xf8\x9f\x46\xcb\xd9\x12\x99\x33\x61\xa9\xab\xbe\x7c\x26\x22\x44\x5e\x73\x19\x3a\x65\x9a\xc5\xe3\x1f\x37\x83\xd9\x10\xbe\x7b\x75\x74\xf2\xf6\xed\x5b\xcc\x79\x8d\xb1\xe9\x63\xa7\x51\xe5\x1d\x0e\x07\xfa\xf0\x9d\xfc\xb7\x67\xfd\xc4\x9d\x7f\x97\x3c\xa0\xf1\x8b\xc1\x3a\x4b\x67\xa7\x7f\xa2\xfe\xe3\xd9\x9b\xd3\xd3\x3a\xff\xe7\x9b\x97\x6f\x7e\xf0\x7f\x7e\x8f\x1f\x9c\x7d\xc7\xf6\xe9\xe8\x90\xd1\x42\x77\x34\x29\x6a\x11\xc9\xa5\x39\xd3\xcd\xf5\x02\x05\x19\x11\x55\x79\x93\x65\x4a\x47\x1b\x93\x8e\x6f\x76\xa2\xa1\xda\x05\x79\x43\x57\x47\x55\x2b\xe0\x01\x55\x03\x3c\x79\x2d\x45\x3d\x52\x69\x2c\x14\x42\xbb\x11\x9a\x17\xca\x5b\xf9\x45\x5a\x8f\x9b\x7d\x5e\xea\x47\x30\x05\x8b\x69\xa7\x63\x5f\x01\xbd\xfa\x88\xa1\x30\x7e\xf2\x20\xf2\x92\xdf\x96\xae\x43\xab\xcc\x38\x99\x4e\x2b\xc4\xb5\x8e\x6b\x57\x98\x1a\x1f\x87\x48\xdb\x6a\xf8\xa0\x27\xe6\x2a\xd9\x96\x39\xa0\x6f\xe0\x52\x2c\xa4\x2e\xa2\xfa\x05\xd6\x26\x55\xf7\x8e\x38\x90\x5b\x05\xdf\x5c\xe1\x94\x87\xe2\xe2\x32\x03\x36\xe9\x3d\x40\xa5\xf0\xaa\x2c\x6b\xdd\xb1\x82\x67\xbd\xda\x3b\x34\x44\xc6\x2d\xfd\x21\x8b\x0c\x5b\xa9\x14\x63\xc3\x59\xf0\x5f\xa0\x81\x8f\x78\x2d\xe6\x5d\xf6\x16\x89\x05\x5c\xa1\x2b\xbe\x14\x79\x11\x94\xcc\x36\x56\x55\xaa\xeb\x34\x01\xdc\x8c\x58\x5e\xb9\xda\x58\x7c\x86\x68\x7e\x8a\xf8\xb7\xc2\xe2\x6a\x7a\x23\xda\xc4\x75\x55\x35\xb4\x47\x3d\xe0\x28\xb0\xef\x27\xc4\x2c\x08\xa4\x9d\xaa\xde\xad\xfb\x34\x41\xa0\xae\x97\x0c\xb5\x14\xaf\xf2\xa0\x8d\xa2\x15\xd8\x0e\x64\xae\x2a\x24\x1d\x2f\x91\xa5\xe1\x50\x26\x1a\xe9\xe6\x12\xcd\xb5\xbf\x49\x4e\x14\x1c\x40\x12\x80\x66\xf1\x4a\x09\xea\x04\x94\xfa\xff\x7d\xab\x74\x45\x38\x94\xfa\x2c\x4a\xb8\xdc\x34\xf1\x3f\x3c\xfe\x24\xf7\x30\x6e\x87\x59\x02\xba\x52\xc9\x82\xa7\x26\xa2\x6f\x86\xd0\x4f\x2e\x9f\x11\xad\x82\x7e\xa9\x15\x98\x6e\x2c\xb1\x48\x5e\x25\xf9\x36\xc9\x74\x44\x26\x5b\x4a\xf9\xe3\xab\xa4\xfc\xa2\xa0\x5a\x86\x97\x9b\xb6\xc9\x8f\xe0\x68\x09\x75\x09\x29\x30\x01\x78\x4b\x8f\x84\x33\x68\x4f\x1c\x86\x44\x5c\x05\x04\xbb\x1c\x7e\x8e\x16\x57\x71\x96\xe6\x5f\x2c\x2e\xc6\x09\xb2\x84\x62\x26\x7e\x97\x0f\xf6\xea\xa1\x1f\xa2\xc4\x89\x1f\xe5\xb0\xdf\xe2\xe7\xc5\x42\x5c\x03\xf7\x8b\x71\x2d\x31\x65\x3f\xba\xbe\x1d\x0c\x3f\x1c\x5d\x5f\x76\x07\x43\x02\x13\x83\x60\xed\x91\xca\xef\x00\x76\xa9\xbe\x6e\xb2\xa4\x06\xb9\x21\x5c\x05\x6f\xf0\x14\xcc\x69\x50\x04\xec\xb7\x0b\x02\x92\x21\xe9\x12\x13\x7b\xd0\x74\x56\x05\x50\x34\x41\x74\x2d\xca\x7f\x10\xf7\x7d\x54\xf0\x2f\x7a\x52\xae\x17\x02\xa8\xc3\xd1\x90\x50\x72\x10\x76\x8e\x65\xbb\xe4\x1f\xa2\xbb\x26\xa2\x29\xf1\x07\x68\xae\xc8\xcf\x7a\x60\x50\xb8\x5d\x05\xaf\x3b\x94\x5d\x08\xdf\x8a\xd1\x85\x97\xb5\x82\xe4\x56\x98\xba\x62\x9d\xbb\x8b\xf1\xe8\x2a\x62\x89\xbb\xd1\xb8\x25\x8c\x1d\x0e\xfe\x68\xec\x84\xf0\xb8\x2d\xe7\xfd\xee\xe5\x60\xf8\x61\x62\xbe\xec\x7f\xf8\x5b\xd9\xe6\xe3\x17\xdd\xb2\x4a\x75\x95\xce\x8f\x4e\xe2\xe3\xa3\x79\xf6\xf3\xef\x6f\x09\x3e\x6e\xff\x9d\x9c\x1e\x9f\x9e\xd4\xf5\x7f\xcf\x5e\x9f\xfd\xb0\xff\xbe\xc7\x8f\xb1\x1e\x78\x05\x78\x56\x60\xa9\x92\xf5\x2c\x53\x68\x5d\xe0\x91\xe0\x38\x2c\x99\x2a\x09\xa5\xae\x80\xfe\x84\x63\x5f\xac\x1d\x44\x28\x46\x84\x03\xca\xeb\x64\xfe\x25\xb9\x53\x82\x88\xb0\xc0\xc4\x58\x50\x94\xd7\x06\x85\xdc\xb1\xff\x11\x75\xc4\x98\x5a\x46\xe3\xb5\x09\x62\x3c\x50\xe2\x56\x2c\x45\xc2\x4d\xe6\xfa\x77\xe3\x6a\xe2\xad\xec\x11\xa1\x93\x11\xb3\xc1\xd7\x43\xd1\x5d\x06\x86\x07\x5f\xf2\x5b\xad\x4a\x2d\xc2\x8f\x85\xe0\xe6\x6d\x3b\xb5\x1e\xf5\x08\x6b\xa4\xd7\x45\xa9\x8e\x8a\xf2\x28\x53\x5a\x8b\xf9\x56\x57\xc5\x1a\xd4\x79\x13\xbd\x02\x9b\x14\x18\x6f\x43\xc8\x74\xf2\x25\xb4\x03\x6a\xd4\x01\x1e\xc1\xfe\x3b\x21\x3a\xf4\x36\x5f\x19\x09\xc7\x9b\x75\xaa\x2c\x4b\x75\xe0\xf7\x13\x28\xa8\x3e\xb0\x48\x0a\xe3\x18\x06\x1d\xe4\xbc\xed\x81\x0c\xd8\xa6\xb4\x05\xf0\x99\x6c\x93\x2c\x68\x72\x2c\x44\x67\x52\x25\xf9\x22\x29\x17\x8e\x98\xdf\x35\x96\x4a\xb3\xec\xa0\x41\x25\xd4\x0a\x99\x38\x88\xea\x88\xb8\x05\x23\x59\x94\xc2\x11\x20\x31\xe3\xa0\xd5\x90\x0a\x4b\x1c\x1f\x8c\xc5\xac\x9d\x40\x4f\xd8\x4f\xd3\xaa\xfa\xef\x40\xf2\xea\x61\x55\x28\xb3\x5c\xcc\xe5\x97\xac\x5d\x2d\x91\xb3\x9f\x21\x8c\x4c\xff\xa1\x6d\x84\x83\x16\x88\x79\x2e\x92\xc7\x42\xb8\x2c\x22\x15\xf8\x9f\xc0\x0e\x48\x73\xb4\xc7\x66\xc6\xf5\x30\xcf\x20\xda\x4c\x67\x2c\xb2\xa5\x71\xed\x9e\x36\x76\x2b\x81\xbf\xb2\x54\x8a\xda\x9a\x54\xd0\x58\x60\x3f\x4a\x72\xf9\xb7\xad\xae\xd2\xe5\x8e\x43\x7e\x10\xcd\x31\x23\x00\xa6\xa1\x98\x17\xba\x8a\x2c\xe7\x02\xc0\xe0\xc0\x55\xd3\x91\x25\x84\xdf\xa8\x62\x03\x64\x18\xf7\x00\xfb\x41\x47\x05\x2a\xdb\x63\x79\x70\x5b\x6c\x11\x7b\x9c\x17\x15\x06\xd7\x89\xd8\xa1\x2a\xec\x9b\x53\xeb\x91\x34\x56\x56\xc3\x6a\xc1\x0c\x9c\xb1\xd0\x9c\x28\x81\x31\x95\xb0\x9e\x5f\x9b\xcd\x03\x36\x1c\xae\x3f\x72\x0d\x12\xdc\xc9\x4b\xa5\xe2\x43\x21\x3a\x17\xa5\x52\xd9\x8e\x99\xd5\x7c\x92\xfc\xc4\x98\x88\x40\x0a\x90\x6a\xea\xa8\x2b\xdc\x4b\x2b\xb5\x36\x16\x8d\xca\x80\x4c\x18\x72\x6e\x40\x14\xc3\x7c\x7c\x10\xdd\xe7\x61\x30\x6b\x60\x95\xe4\x8b\x8c\x8f\x06\xf3\xf5\x58\x0e\x88\x12\xc3\x7b\xa3\xab\x25\xe6\x83\x03\xde\x64\x1e\x5a\x2a\xef\x98\xe0\xd2\x0e\xb4\xde\x92\x75\x70\x3e\x42\xb1\x9b\x8d\xb3\xa6\xc8\x92\x6f\x63\x84\x70\x3c\x98\x69\xb9\x03\xb0\xdb\x43\xb2\x6b\x97\xa6\xf4\xbd\x14\x4b\xd8\xcd\x1b\xd1\xc6\x33\xf9\xdc\xe6\xed\xd7\xea\x37\x87\xda\x41\x66\xb1\x39\xe2\x8e\x24\xcb\x2c\xe5\xaf\x25\x85\xa9\x1b\xe9\x0d\xdf\xde\x56\x71\x68\x94\x31\xb7\x65\x2c\x60\x41\xcf\xb6\x77\x72\x99\x7e\x35\x0b\x73\x53\x94\x15\x57\x53\xc2\xaf\xbc\xd8\x72\x48\x32\x4e\x34\x5a\xc2\x96\x0e\x53\x04\xf7\xbc\x00\x10\x78\x51\xba\xa2\xe2\xc6\x61\x60\xec\x45\x1a\x00\xef\x58\x11\x74\x34\x99\x21\x26\x10\x54\x45\xf5\x44\x9e\x0c\x98\x3f\xac\x7c\xbe\xa1\x98\xb9\x8d\xea\x5a\xe2\x4e\xaa\x86\x41\x19\x24\x9f\x69\xd1\xbf\x32\xf2\x1d\x6a\x3a\x86\x05\xdd\x3b\xc0\x9e\x33\x94\xb0\x4e\x0c\x60\xc5\x2d\x80\x93\x6c\x11\xea\x6b\x7a\x25\xfb\x39\x12\xa5\xd1\xa7\xe0\xc1\x48\xf6\x83\xaa\x67\x8d\x69\x2e\x1c\x87\xdd\x68\xd8\xe7\x55\x64\x83\x0d\xef\x84\x48\x0e\x51\xf2\x13\x3b\x15\x4e\x09\x1d\x9d\x8d\x89\xf0\x06\xc4\x2c\xe6\x6a\xa5\xd6\x12\x37\xb2\xe8\xba\xd4\x83\x87\x38\xdc\x14\x98\xe5\xd7\x49\xba\x90\x0d\x6e\xf9\x1b\xad\x72\x85\xe5\xe6\x98\x13\xb8\x4f\x32\x95\x57\xc2\x9c\x7a\xdb\x35\x00\x3b\x4d\x13\x79\xf3\x86\xdf\x2f\xe0\x92\x4e\xfe\x66\xa9\xd3\x95\x04\xb5\x15\x7e\xfb\xb2\xda\xc4\xdb\x6d\x9c\xab\x0a\xdc\xf8\xd9\x0e\xe5\x3b\xf9\x61\x0d\xc3\xa4\x72\x14\x39\xfb\x47\xa4\x7d\x1b\x2a\xef\xd8\x47\x22\xb4\xd9\xa1\x64\x42\x6f\xbb\x2e\x79\xa9\xc0\x49\x4a\xb8\x6a\x5a\x50\x4e\x18\xc0\x0c\x72\x79\x97\xe4\x94\x27\x8a\x85\x98\x1f\xca\x52\x21\xe7\x0c\x70\x2a\xe4\x47\x9a\x17\xad\xd3\x3d\x34\xd6\x14\x26\x8b\xa0\xf2\x6f\x51\xc0\x25\xcc\xd9\x68\xbc\x5b\xf9\x6b\xc2\xfb\x9a\xa5\x2c\xb0\x34\x41\x33\xe7\x8b\x06\x8b\x0b\xb4\x33\x40\x4c\xc1\x4c\x7e\x0e\x64\x4e\xc6\xfa\x03\x5e\xc2\x04\xf8\x65\x5a\x5b\x46\x36\x48\xa6\x92\x32\x73\x0e\xbc\x86\xb5\x9d\x56\x54\x85\xaf\x61\x8b\x8b\x3d\x3b\x12\x87\x74\x71\x88\x8b\x0e\x8f\x10\x3f\x4c\x23\x3d\xa4\xb9\xa7\xf1\xda\x62\x39\xbc\x6c\xa5\x0e\xc1\xfa\x48\x52\x69\x6d\xd9\xd8\x05\x06\xec\xe6\x04\xd7\x75\x7d\x6b\x52\xf5\x7f\xd3\xf6\xf3\x9a\x90\x34\xfa\xcd\xdf\xf1\xe7\x18\x33\x2d\xa8\x3a\x47\x3a\x0a\x55\x71\x87\x3c\xf0\xc8\xe4\x9b\x23\x17\x10\x82\x1b\x68\xcd\x7a\xb3\x05\xcd\xb7\xfb\xec\x50\x42\x36\x57\xa1\x62\x1f\xc6\xb6\x9a\x4b\x3c\x16\x62\x76\x08\x86\xda\x7a\x03\x05\x3e\xb5\x20\x99\x1b\xf0\x35\xca\x3a\x1e\x95\x2a\x59\x24\x28\x3b\x88\xe1\xa5\x60\x8f\x60\x4b\x9b\x5b\x0c\x97\xba\x7b\xcf\xa3\xab\x9d\xdf\x99\xc2\xee\xc1\x1c\x23\x04\xf9\x1a\x1b\x34\x58\xec\x9e\x93\xb0\xf7\xd1\xc1\x1f\x60\x3b\x91\xba\x41\x6d\x09\xf3\x83\x98\x90\x62\x0e\x76\x87\x3f\xda\x1a\x28\x06\xbd\xf1\x7e\x74\xba\x1e\x9b\x8b\x3f\x64\x33\xbc\xf2\x29\x9a\x88\x8a\xa9\x6c\xb5\x59\x2d\x43\xc5\xa2\xc6\xd0\x13\x9a\xbc\xf5\xa7\xe5\x3b\xf8\x32\x5e\x5c\x50\xe0\x8a\x2c\x51\x40\x0e\xd4\xf8\xba\xcf\x3c\xdc\xe0\x86\xaa\xed\x49\xb0\xff\x3c\x36\xa7\x5d\xdb\xa6\x76\x5f\x00\x42\x9a\xbb\xbb\x52\x81\xda\xa3\xc7\x61\x71\x40\xb4\x06\x40\x78\x41\xf8\xb2\x43\x77\x16\x04\xec\xe6\x60\xdd\x96\xa2\xfd\x2b\xba\x91\xc2\x0d\x02\x94\xfe\xc1\x00\xf1\x46\x2a\xcd\x57\x22\xe8\x17\x98\xce\x1c\xc3\x64\x02\xba\xe2\x21\x87\xfa\x66\x80\x81\xb0\x6c\x4a\xe3\x24\xc0\xd8\x6c\x8a\x32\x47\x56\xef\xd6\x6a\xc6\xe2\xef\x49\x92\xd4\x9a\x53\x7b\x0f\x3d\x6e\x66\x50\x0d\xb3\x34\x86\x94\x33\x7e\xad\xad\x28\x6a\xdf\x46\x7f\x61\xa6\x40\xf9\x9b\x32\x23\xe0\xec\x58\x9d\x4a\x30\x1c\xf0\x76\x21\xab\x5d\x17\xd9\xc2\x1b\xd0\x6c\x87\x7b\x8e\xfe\x6a\xe7\x6e\xe1\x29\x89\xbb\x2b\xf7\x4d\x2c\x7b\xd0\x55\x55\x42\x35\x63\x59\x18\xe7\xc4\x1f\x93\x19\x98\x6e\x34\x6a\xf9\x17\x30\x12\x19\x60\xc2\x7d\x46\xe8\xd1\x63\x6a\xb1\xc1\x4b\x7f\x8e\xbb\xd4\xaa\x7d\xd6\x38\x2a\xbc\x30\xb0\x31\x58\x18\xa9\xe6\xd2\x71\xab\x5e\x2f\xc2\xc5\x42\x71\x8c\xe6\x75\xa4\xa5\x5a\xcf\xd4\x62\xa1\x16\xbf\xb0\xa6\x30\x10\xe2\xe5\xc6\x69\x2a\xcc\xb2\x12\xcc\xe7\xc3\x19\x14\x0e\x4d\xf8\x0f\xfa\x49\x3b\x65\x6e\x2d\xef\x53\x4b\x44\x07\x77\x0e\xca\x40\x97\xec\x1f\xec\xe9\x06\x12\x7a\x60\xc9\xba\x45\xef\xd0\xe0\x11\xd0\x47\x53\xe9\xbe\x25\x43\x6d\x0e\xe4\x5b\x47\xed\xb0\xcf\xe7\xf7\x29\x11\xf6\xb3\x38\x30\xf1\x84\xf5\x28\x3c\x6e\x1f\x5d\x4f\x2f\x5a\x5c\xc3\x3e\x26\x07\xe3\xbb\x1d\x13\x82\xfd\xba\xdb\xfb\xb5\xfb\xa1\x35\x5e\x0e\xb1\x69\x0e\x99\x23\x14\x9b\x03\xe4\x5c\x65\xee\x85\xbf\x23\xf1\x44\x05\xc0\xf4\x63\xbf\xe5\x6b\x7e\xd4\x9c\xb1\xf6\xdd\xe1\xb9\xa0\xc0\xb9\xdc\x17\x38\xc7\x91\xed\xe7\x8b\x7f\x97\x20\x85\x1f\x3f\x7f\xd8\x4f\xfc\x62\x74\x71\x09\xa1\xff\xf1\xc5\xf0\x0f\x02\x81\x3c\x81\xff\x78\xf3\xf2\xa4\xae\xff\x7a\x76\xf2\xe6\xf4\x47\xfc\xff\x7b\xfc\x4c\x06\x97\x72\x74\xdd\x1f\xca\x8b\xd1\x70\xca\xcc\x08\x81\xe8\xab\x3c\x92\xa7\xa7\x72\x58\xdc\x2b\x00\x17\x9e\x1e\x1f\xbf\x12\xe2\x7a\xdc\xef\x5e\xbd\xbf\xec\x63\x82\xe0\xae\x48\x32\x1b\x92\x1a\x6d\x54\x2e\x2f\x0a\x2b\x99\xa7\xe4\xc1\xe8\xe2\x12\x2b\x39\x21\x5d\x90\xae\x81\x36\xd9\xe9\xed\xf8\x31\x7b\x01\xe0\xc5\x62\x63\xae\x7f\xe3\xa8\x2f\x0b\xe4\x5a\x32\x7e\x15\x38\x31\xd6\x2a\x44\x37\x29\xaf\x2c\x3f\xb1\x54\xcb\x65\x41\x38\xe4\x64\x9e\x2c\xd4\x3a\x9d\x0b\xba\xc8\xef\xb6\x9c\x2e\xc0\x28\x24\x48\x80\x31\x42\x83\xdd\xd6\x5c\x16\xa6\xed\xcb\x32\x59\x2b\xc8\xb8\x5b\x32\x41\xf3\x1e\xcd\xe9\x0b\x90\xba\x5a\x20\x22\x62\x6d\xbe\x8c\xd1\x43\x73\xfb\x33\xf5\xb9\x33\x1c\xb9\x4a\x62\x74\x71\x89\x51\x05\xed\x17\x3b\x2e\xf0\xc9\x0c\x82\xc7\xb2\xd5\x6a\xbb\x80\x48\xb8\x0d\x07\x20\x40\xd9\x97\x0f\x59\x62\x48\x34\xd1\x12\x4c\xa7\x84\x02\x8a\x5c\x3b\x0d\x36\x12\x46\xff\xd7\x5a\x65\xf7\x8a\x30\xe5\xf0\xb2\x80\xfa\x31\xdf\x89\xba\xd4\x50\xc4\xca\x73\xb3\x6d\xbe\xc8\x4c\x43\xd8\x8c\x88\xc2\x56\x50\xe0\x38\x73\x59\x75\xd1\x48\x52\x3b\x13\x05\xa6\x0a\x63\x0e\xc5\xb2\xa9\x6f\x64\xbe\x44\x31\x2b\x68\xab\xc0\x81\xa9\x65\x2a\x22\xb9\x62\x43\x7e\x9e\xe4\x74\xcf\xd7\x24\x26\x9d\x80\x6e\xb5\xdb\x40\xb2\xc8\x55\x72\x9e\xf7\x2f\x06\xc3\x01\x16\x6a\x89\x0e\x2c\x52\x8b\x34\xf2\xf2\x15\x3e\xc5\x41\x8b\x43\x2e\xa5\x3c\xc2\xfe\x80\x41\x4d\xbf\x58\x24\x55\x12\xfc\xc2\xc3\xac\xd0\x6f\x66\xdb\x34\x5b\xb0\x65\xce\x5f\x0b\x18\xf6\x45\x87\x81\x86\xb8\x85\x86\xc9\xba\x91\xf6\x09\x9a\x6d\x39\x86\xb5\x52\xb9\x99\xf3\x2d\x96\x89\xe4\x0b\xe1\x06\x02\x87\xdd\x7c\xc8\x95\x9b\x5b\xa1\x0b\x17\xc9\xb5\x42\x06\x4f\xe5\x73\x9a\xc9\xa7\xb0\x4d\xc6\x31\x2f\x72\x70\x2b\x13\x2d\x9e\x91\x92\x32\x2f\xbc\xe2\xe5\xde\xf2\x42\xf0\x28\xdd\x92\x81\xb1\xb7\x6b\x8d\x8b\xb4\x93\x05\x82\x77\x8a\x48\xa0\xfe\x2a\xeb\x43\x6d\x67\xba\x4a\x2b\x4c\xbd\xfc\x3f\xff\xc7\xff\xc9\x9b\x15\x01\xd8\xc6\xe9\xc8\x94\x3c\x3a\xf2\x58\xf7\xfc\x0e\x50\xf5\x7e\x7d\x38\x80\x8f\x04\x16\x2c\x78\xbe\x40\x91\x8d\xf2\x77\x3b\x54\x42\x22\x9f\x3f\x18\x18\x01\x28\xff\x5c\x3d\x48\x95\xdf\xa7\x65\x91\xf3\x60\x77\xb7\xd5\xaa\x28\x9b\x3d\xd6\xe9\x5d\x6e\x16\xbb\x32\xaf\x51\xe6\x5f\x4c\x0a\x6e\xfe\x5d\xa9\xf9\x2a\x37\x2e\x17\x18\xa5\x50\xc4\x41\x45\xff\x04\xc8\x7b\x58\x15\x9e\x62\xc6\xa2\x75\x01\xc5\x42\x5c\xf7\xc7\x57\x83\x09\x14\x05\xfe\xcf\xb2\x37\x1a\x9e\xf3\x0e\xf9\xfd\xc1\x80\xb5\x97\x47\x56\x0a\xcd\x9c\x7a\x3b\x0b\xc7\x43\x18\x1e\x9c\x3b\x0e\x9c\xe7\x1f\x3e\xe8\xf4\x69\x95\x65\xe1\x31\xe9\xa9\x94\x85\x89\x92\xda\x6b\x43\x68\x9d\xd8\x03\xad\x3b\x39\x94\x43\x4f\xfb\xb3\xb6\xf1\x58\xac\x7b\x49\xb8\x19\x2b\x86\xe9\x56\x0f\x88\xc8\xda\x40\x93\x95\xba\x76\x8b\x5c\x47\x81\x5f\x3b\xdb\x71\xc4\x42\x88\xd3\x43\xb7\xe8\xda\xbe\xd9\xda\x33\x7e\x9a\x3d\xbb\xc3\x7b\xa3\x71\x62\x7b\x34\x13\xe1\x91\x8d\xa9\x86\x62\xb3\x73\xda\xc2\x55\x13\x68\x28\xea\x40\xc3\xcc\xd3\xeb\xd2\x9e\x86\x29\x61\x0c\x59\x78\x4d\x63\x88\xf9\x08\x15\xd8\x2a\xf5\xb5\x12\x14\xa5\x5c\x6d\xd7\x49\xee\xe2\x82\x2b\x95\x2c\x48\x1e\x8a\x62\x94\xa1\x54\x43\x2d\x8c\xb8\x56\x55\x62\xce\x61\xb1\x4c\x55\xb6\xd0\x1c\x3b\x07\x0d\x0e\xb3\x37\x91\x4a\x11\xc3\x20\xc1\xe5\x09\x21\x27\xfc\x0e\xb5\x59\x25\x3a\xcd\x76\xf2\x3e\x55\x0f\x8c\xdd\x42\xbc\x40\x2c\xc4\xd9\xa1\x1c\x16\x8d\x19\xd9\x3f\x21\x1c\xe0\x6f\x9e\xed\x07\xfa\x30\x12\x2d\xe7\x91\x65\xaf\x51\x5f\x37\x00\x78\x6b\x63\x10\x4c\x03\xae\x04\xb3\x8e\x9b\x59\x2f\x40\xb1\x05\x32\x06\x10\xe8\xc0\x33\x26\xcb\xf0\xc4\xc1\x90\xa4\xae\x8a\xd2\x26\xc3\x45\x63\xc3\x60\xae\xc4\x5e\xe5\x6b\x95\x6f\xe9\xf2\xb1\xd9\x3a\xf8\x83\x4f\x77\x89\x43\x1a\x79\xbc\x50\xec\x94\x7b\x9a\xbb\x14\x57\xc7\x0b\xd5\xf8\xe1\xd6\x70\x7a\x79\x68\x1d\xfe\x03\x7d\xb8\xd7\xe7\xa7\x84\x2f\x1e\xa2\xde\x07\xc3\xb3\x37\x08\x3c\x70\x33\x28\x20\x10\xf9\x41\x02\x1b\x72\x83\x0d\x52\x9f\x65\xd6\xd6\x80\xb3\x7c\xee\x4b\xcf\x28\x77\xd6\xa2\x22\xc0\xde\x06\x33\xfd\x97\x6d\xb1\x60\x81\x3d\x0c\x54\x3f\x32\xe9\xb1\x10\xaf\x70\x54\x6a\x13\x64\xcf\xbd\xa2\xf4\x4e\xc1\xa8\xed\xb2\x8b\x38\xd1\x1e\x5c\xcd\xa8\xf0\xe9\xef\x62\x17\x77\xa3\x51\x6b\x56\x9d\x58\x1b\xc3\x33\xb2\xa6\xe6\x3a\x19\x42\x98\x82\xca\x39\x98\xf1\x02\x18\xc6\x94\x96\xf9\x36\xcb\xe0\xd9\xf7\x45\xba\xa0\xa2\x49\x1e\x2c\x3e\x61\x6c\xaa\xdc\x12\x02\x29\x73\x55\x7a\xc4\x6f\x00\x92\x03\xb7\xe5\x77\x80\x29\x8a\x56\xae\xbf\x36\x98\xa2\xf9\xea\xe3\x30\xc5\x27\xa3\x2d\x6d\x30\x45\x09\xe8\xc1\xeb\xdb\xf1\xe0\xc3\xc7\x69\x24\xaf\xbb\xd3\xfe\x70\x1a\x89\xe9\xb8\x7b\xde\xbf\xea\x8e\x7f\x75\x3c\x18\x12\x3e\xb2\x0f\xd6\x68\x9f\x21\x3f\x8e\x2e\xcf\xfb\x63\xc7\x63\x21\xbe\x01\xdf\xe8\x46\x00\x98\xf1\xfa\xc3\xfe\xb8\x7b\xe9\x48\x2d\x84\xe3\xb9\x78\x8c\xde\xc2\x92\x18\xb4\xe2\x25\xa5\x8f\x97\x14\xcf\xc5\x4b\x7a\x48\xc8\xc1\x90\x6b\xdd\xa7\x48\xe4\xc7\x0b\x42\xf8\xd0\x49\x20\x7e\x68\x07\x4d\x06\x8b\xe7\x5b\x91\x93\xff\x63\xfc\xc4\x2f\xde\x4f\xce\x8f\x4e\x8f\x7a\x59\xb2\xd5\xea\x08\xc5\x57\x7f\xe7\x38\xd0\x13\xf1\x9f\x57\xc7\x27\x75\xfc\xe7\xab\xe3\xb3\x97\x3f\xe2\x3f\xdf\xe3\xc7\xab\x7d\x9b\x1f\xca\xff\x7a\xdb\xef\x8e\xff\x45\xfe\xd7\xfa\x21\x32\xf9\x17\x21\xc6\x2a\x4c\x1e\x62\xe4\xdf\x5c\x2a\xe4\xe8\x9a\xdf\xb0\x85\x55\x94\x6b\xab\x10\x5c\xda\x50\xba\x9f\xc5\x8d\x80\x3d\xdf\x26\x35\x5a\x23\x06\x4d\xa3\x1c\x6e\x83\xb5\xaa\xde\x01\x5e\x2a\x6c\x12\x2a\xcf\x7a\x85\x22\x44\x10\x89\xea\x0a\x7b\xab\x64\x22\x41\x77\x9e\xa6\xd2\x6a\xf7\x2e\xba\xa6\x5d\x43\x1c\xa8\x09\x31\x4d\xf5\x06\xa4\xb9\x3f\x02\xdc\x00\x4a\xac\xfd\xee\x6d\x60\x93\x38\x0c\x21\xf8\x52\xc2\x1e\x9b\x77\x58\x02\x51\x4f\xcd\xc7\x42\x4c\xc2\x6a\x23\x62\xc4\x00\xb1\x7e\xdb\x1a\xce\xc9\x58\x03\xc1\xba\x09\xd8\x9b\x15\xd8\x37\x24\xf1\xbf\x4f\x6d\x1b\x5e\x00\x2c\x15\x80\x7f\xf3\xea\x43\xbd\x02\x67\x96\xa6\x48\xcc\x12\xd9\xa8\x6a\x9b\x64\x91\xaf\xd0\x1d\x68\x72\x9b\xff\x3c\x62\x37\x34\x54\x81\x4f\xcb\x52\xdd\x17\x40\xd1\x20\x98\xc3\x61\x59\x94\x50\xd1\xbd\xa5\x88\x64\x52\xa5\x9a\x08\x8c\xf7\xf7\xf5\x90\x19\xce\xb8\x65\x7b\xe5\xce\x5d\xf9\x0c\xa8\x3e\xe3\xff\xa6\x6b\xd4\xb9\xb1\xc6\x32\x60\xa3\xb8\xd2\x47\x04\xa9\xa7\xc8\xe7\x69\xb3\x6c\x61\x64\xb7\x3b\x74\xa5\x19\x42\x6a\x13\x6a\xa4\x45\x32\xc9\x8c\x2b\xb4\x13\xc4\x12\x02\xc6\xa0\xa7\x8d\x47\xbf\x8d\xe8\xa1\x58\x56\xbd\x63\xb5\xe6\x70\x12\xad\xb8\x18\xab\x56\x01\x8f\x84\xb1\xc5\x88\x67\x23\xf5\x78\x00\x8d\x03\xc2\xda\xe6\x60\xc1\xf6\x6a\x96\xf0\x41\x10\xf4\xf4\xb0\xb5\x58\xab\x1e\xbc\x19\xa3\x57\x66\x82\xed\x5f\x50\x4c\x70\xe1\x4d\x8d\xd7\x34\xf4\xb2\x19\x41\x52\xfa\x3b\xf0\x10\xf5\x38\x7e\x11\x45\x89\xcc\x8a\x35\xed\xeb\xf6\xc6\x3a\x7c\x31\x94\x5d\x2d\x65\x02\x76\x3a\x44\x76\xad\x1a\x69\xa8\xb2\xc1\xdf\x4c\xb4\x69\xa6\x47\x5e\xf7\xc4\xb0\x46\x32\x5d\x46\x82\x0e\x3c\x24\x39\xf7\xb9\x37\x39\x03\x8c\xd1\x57\xf4\xc1\xb8\xd4\x0e\xf8\x3c\x74\x43\x6a\x5b\x60\x2c\xb9\x75\x96\x98\x59\xc4\x5f\xc7\x6d\x74\x0a\xce\xaa\xf7\x1e\xcc\x6a\x28\x4e\x1d\x2e\x6c\xa8\x23\x55\x48\x7c\x8e\x08\x08\x2a\x2e\x98\x08\x2f\x2f\x78\xaf\x3b\x86\x3d\x84\x74\x21\x47\x89\x0d\x2c\xb4\x8e\x96\xef\xf1\x36\xcf\x0a\xd8\x36\x7e\xd9\x7a\xb6\x8b\xe4\x6c\x07\x82\x77\x7c\xe9\x48\xa5\xab\x62\xb3\x51\x59\x80\x51\x6c\xf8\x15\x83\x49\xbb\x4f\xf1\xfe\xb6\xd5\xc6\x46\xb6\x3b\x8f\x95\x69\xc2\xde\x07\x30\x70\x3f\x9d\xec\xf5\xe9\xde\x9a\x2e\x07\x24\x7b\xc5\xe3\xc9\xde\xae\x4b\xf6\xca\xa7\xdc\x0f\x61\xba\x65\x3b\x7c\xfe\x5c\x4f\x62\x42\xf6\xbd\xeb\xe4\xfb\xbe\xa8\x95\x4e\x35\x79\xf0\x7c\xff\xc0\x72\xe2\xf5\xff\xda\xbf\xba\xbe\xec\x8e\x6f\x1f\xa1\xc4\x3b\x78\x62\x4c\xae\xc7\xa3\xde\xcd\xd8\xfa\x4e\x93\x9b\xf7\x44\xfd\x2d\x3f\x8c\x46\xe7\x50\x77\x86\x5c\xe2\xfd\xc9\x2f\xcc\x91\x67\xbc\x04\xe3\xf8\x4c\xbb\xf0\xe2\xeb\xf1\xe8\x62\x30\x9d\xfc\x62\xfe\xfd\xfe\x66\x32\x80\x51\x1b\x0c\xa7\xfd\xf1\xf8\xe6\xda\xb8\x28\x87\xf2\xe3\xe8\x73\xff\x53\x7f\x2c\x7a\xdd\x9b\x49\xff\x1c\x86\x77\x84\xcc\xe7\xc8\x66\x18\x10\xd5\x05\x7e\x8e\x2b\x05\x9b\x4c\xc7\x83\xde\xd4\xfb\x98\x71\x36\x6b\xe4\x87\xd2\x63\xa3\xf3\xbd\xa0\x43\xeb\x05\x11\xe1\xfa\xe7\xee\xad\xe7\x0a\x09\xcb\xdf\xe5\x2d\x59\xc7\xce\xd7\x3d\xff\x34\x00\x22\xfb\xa7\x18\xf8\xfe\x73\x3a\x3f\x3f\x7e\xfe\x7f\xf1\x8b\xa1\xaa\x7a\xe7\x17\x7f\x26\xff\xc3\xab\xb3\xba\xff\x77\xfa\xfa\x47\xfe\xff\xfb\xfc\x38\xff\xef\xe4\xed\xdb\xb3\xa3\xd3\xe3\x93\x97\xf2\x26\x4f\x41\x23\xa4\xda\xc9\x9e\x07\x38\x37\x66\x73\xb7\x5a\x17\x7a\xb3\x52\x65\x3a\x87\x68\x76\x52\xce\x57\x2f\x6e\xf2\x14\x82\xee\xc2\x72\xaf\x34\xaa\xbb\x1f\x54\x5d\xd4\xa7\x42\x5e\x2a\xc8\x9a\x5e\x63\x52\x8b\xb9\xb3\xdd\xfb\xc5\x73\xde\x1f\x0b\xd1\x9d\x1b\x6b\xc7\xfa\xa4\x8d\xd7\xa3\x8d\x03\xc2\x5b\xaa\xe6\x4e\xf9\x3a\x86\xc6\xee\x74\x9a\x4a\x69\x7e\xa7\xb9\xcc\x0a\x02\xff\x60\x3d\x01\x85\xaf\x67\x87\xd8\xba\xbe\xc8\xba\xb9\x04\x67\x15\x44\x46\xe6\x92\x5c\x21\xd9\x04\x08\xe7\x45\x52\xe5\x2b\xa8\x6a\x6b\x54\x19\xfa\x1e\x01\xb8\x54\xb5\x2c\x28\x26\xce\x2b\x64\xdc\x8b\x2c\x43\x03\xe1\x23\xc0\x55\x6c\x08\xe4\x26\xf9\x4e\x6c\xb6\x25\x8c\xc3\xc3\x2a\xa9\x74\x81\xd9\xf4\xba\xf7\x9d\x6a\xa9\xf2\x2a\x2d\xad\x8e\x23\xea\x06\xe9\x50\x8b\x5b\xd8\x2a\x24\x76\x5c\x9a\x79\xfd\x7c\xb1\xb7\x45\xb1\xbc\x40\xaa\xba\x48\xde\xf4\xba\x63\x41\xb4\x02\x3a\xc0\x35\x96\x72\x5e\xaa\x45\x5a\xc1\x47\x78\xa9\x71\x11\x0d\x32\x38\x70\x99\x08\x56\x67\xe9\x6d\xe6\x01\x57\x5b\x97\x03\xc6\xc2\x7d\x1a\x00\xc4\x47\xb2\x0c\x55\x7d\xec\x33\x2c\x1f\x23\x41\x64\x22\x02\xc8\xbd\xa5\xe3\x6b\x4e\x99\x76\x32\x41\x08\x35\xd7\xc1\x16\x44\x1d\x9f\x48\xed\xf0\x15\xb8\x8a\x92\xfa\x45\xf2\x72\x2d\x2a\x54\x30\x8d\x8c\x61\x84\x65\x66\x61\x97\x66\xda\xaa\x1d\xa7\x8f\x2c\x78\xb1\x3d\x7d\xc4\x6a\xe3\x38\x5e\xfe\x08\x7b\x8b\x1d\x8a\x3d\xdc\xb6\xa0\x81\x0e\xa7\x03\xc7\x84\x06\x04\x49\x4c\x18\x56\x63\xe7\xd1\xe5\x1c\x59\xf4\x75\x5e\xe4\x66\xb6\x20\x51\x5f\x95\x94\x2e\x06\xc1\x42\x9d\x9a\x77\x51\xad\x6f\xbe\x93\x5f\xd2\x9c\x22\x17\xa5\xba\x4b\x4a\x9b\xca\x46\x87\x1b\xd1\x42\x14\x94\xda\xa8\x12\xd2\xf1\xf9\xbc\x39\xf3\x22\x47\xee\xeb\xfd\x6d\xdb\x6e\x16\x49\xa5\x74\x84\x0a\x55\x98\xa1\x0d\xd5\xa9\x4a\xd9\x99\x6d\xef\x04\x54\xaa\xc5\x9d\x27\xbc\x05\x1c\xa5\xe1\xc0\x98\x9c\x01\x10\xb4\xdd\x27\x10\xdf\xe6\x13\x3c\x01\x00\x25\x73\x53\x3c\xc7\x27\x90\x4f\xfb\x04\x7e\x5f\x5a\x58\x13\x3c\xc2\x6b\xb4\xfd\xf7\xa6\x03\x2c\x4f\x37\xfe\xa7\xf8\xfc\xb1\x3b\x9d\x8c\x8c\x99\x5d\xe7\x6b\x6e\x98\xed\x9e\xd5\xfe\x1c\x12\x86\x16\xa3\x1a\x0c\xef\x01\xd0\xf9\x32\xe9\x2e\x19\xd8\x7b\x08\x19\x80\x29\x0d\x19\x23\x7a\xbd\xfe\x64\x12\x71\xfa\xa1\x21\xac\xe4\xad\x83\xff\x30\xf6\x74\xfc\xe2\x1f\x59\x3a\x3b\xaa\x09\xf4\xfd\xbe\xd6\xe0\x13\xf6\xdf\xe9\xc9\xab\x57\xf5\xf8\xff\x9b\xb3\x57\x3f\xec\xbf\xef\xf1\x13\xc6\xff\x4f\x8f\x8f\x4f\x8f\x4e\x8f\x8f\xdf\xc8\xde\x2a\x29\xb3\x54\xc9\xeb\xa2\xc8\x94\x10\xed\x1f\x7b\x29\xff\x02\x57\xde\x67\x90\xfb\xfb\x92\x96\x5f\x22\x79\x95\xce\x57\x89\xca\x64\x2f\x96\xd3\x87\x22\x92\xdd\x4c\x7d\x55\xa9\xec\xc6\xf2\x53\x51\x16\x79\xa5\x8b\xfb\x96\xc7\x1d\x9b\xc7\x9d\xca\xeb\x55\x9a\xa5\x1b\xf3\xe1\x5e\x99\xa4\x77\x94\x3e\xf6\x89\x9e\xac\xa1\xf2\x53\xa2\x8f\x52\xfd\x53\x68\x75\x35\xf9\x0a\xad\xd6\x78\x2c\x06\x50\xf8\x80\x02\x0e\xa8\xaf\xb5\x52\x1c\xda\x33\xf7\x31\xd0\x11\x67\x69\xc2\xcc\x9d\x60\x6e\x85\xec\x9d\xb6\xbe\xb8\x95\xc3\x28\xae\x23\xa6\x3c\x01\x94\x24\xdf\x01\xd4\xa5\x70\xec\x91\xb6\x5b\xfc\x32\x32\xcc\x3c\x80\xa6\xf0\x2e\x76\x8f\xd7\xd5\x61\x57\x51\x7c\x39\xad\x1a\x18\x51\xf3\x3b\x44\x89\x5a\xb0\x93\x68\xf0\x88\x79\xb8\x10\x8d\x19\x95\xa9\xad\xf1\x6e\x5a\x4d\x90\xcd\x20\xdb\x65\x9d\x6a\xcb\x12\xad\x16\x44\x8f\xc9\x7f\x47\xa5\x21\x5b\xc9\xf4\x50\x16\x04\xf1\xb0\xd5\xe3\x76\xc4\xe4\x00\x6a\x97\x5a\x06\x05\x98\x35\xc8\xc6\x31\xe6\x6f\x9d\x46\xec\x80\x59\x8f\x6c\x77\x0e\x39\x1f\xc2\x46\x5d\x68\xfe\x02\x0e\x06\x03\xe0\xb1\xe7\xaa\x3c\x6b\x03\xa0\xf6\x4a\xeb\x16\x10\xbf\x69\x0b\xb4\x3e\x10\x37\x81\x68\x6c\x82\xd3\x58\x76\xcd\x3c\xab\x05\x47\xb9\xad\x35\xc2\x64\x6a\x40\xf3\x94\xed\x90\x4d\x61\xc1\xb4\xe6\x04\xe0\x70\xf3\x26\xc2\x79\x83\xd2\x6b\xc5\x50\xc5\xe6\xec\x00\x44\xf5\x8c\x40\x44\x2c\xe8\xee\x0c\xd8\x52\xad\x01\xfc\xcc\x22\xe0\x5c\x47\x83\xb8\x32\x68\x68\x98\x63\xfa\xb3\x0f\xbb\x1f\x3f\x8d\x9f\xf8\xc5\xa4\xd7\xef\xfe\x91\xd1\x9f\x27\xf9\x9f\x5e\x1d\x37\xea\x3f\x4e\xcf\x5e\x9e\xfc\xb8\xff\xbf\xc7\x8f\x99\x7d\x39\xc1\x8a\x06\xe2\x46\xe6\xb2\x8d\x93\xf8\x58\x88\xa9\x4d\x03\xf7\x7c\x64\xac\x94\xf2\x24\x96\x35\x9a\x22\x07\xa5\xc7\x78\xcb\x5a\x25\x79\x10\x1f\xa0\x5b\x2a\x6b\x92\x7f\xba\xdc\x4d\x9a\x53\x3b\x44\x51\xca\x11\xa6\xa4\x2f\xa0\x78\xbe\xc6\xf1\xe8\x25\x80\x5a\x3a\xc1\xd9\xad\x03\x47\xe2\x1c\x09\xaa\x82\x04\xac\xee\x3c\x21\xdc\x64\xd2\xe4\xcd\x04\x6a\x8d\xba\xd2\x38\x53\xad\x00\xc2\xdf\x1c\x79\x55\x95\xcc\x57\x74\xfc\x71\x2d\x7a\x9d\x3d\xd2\x7c\x38\x16\x82\x1a\x51\x94\xc1\xd0\x4c\x8a\x7c\x07\xe2\xf1\xa0\x51\xd1\xcf\x2b\x55\x1a\x77\x1c\xae\xb7\xee\x5a\x95\xe9\x3c\x21\x96\xe2\x03\x52\xf4\xec\x98\x9e\x76\x0e\x85\xe8\xd0\xc8\xf4\x8a\x85\xea\x80\x4f\xea\x0d\x55\xf0\x12\x08\x46\x15\xe5\xda\x0f\x8f\x50\xc6\x0d\xb2\xcf\x24\x02\x6f\xfc\x62\x48\x46\x03\x92\x9d\xd2\xa3\x1e\x59\xb6\x5f\x35\x32\xdb\xe2\x7d\x02\xcc\xaa\x8e\x16\x1d\x28\xd2\x91\x01\x41\x30\x03\xc2\xbc\xc8\xed\x5d\x55\x15\x16\x26\x6a\xd6\x14\xb0\x8a\x2d\x88\xb0\x87\x90\xbc\x54\x5e\xcf\x94\x52\xee\xf5\xd8\x47\xfa\x85\xdf\x47\x48\xbe\xc3\xa5\x6f\x6e\x40\xe8\xb2\x69\x22\x16\x10\x83\x7c\xe0\x7c\xae\x36\x95\x5a\x88\xb4\xb6\x16\xd3\x7c\xb1\xd5\x55\xb9\x7b\xa2\x67\x2e\x86\xe8\x90\x25\x91\x08\x4d\x0b\xfc\x53\x44\x68\x65\x06\x4d\x2c\xd3\xbb\x6d\xe9\x51\xdb\x5a\xde\x28\xd3\x95\xdb\x62\x1b\x2e\x06\xa8\x3a\x06\xfa\x4d\x0f\x49\x0e\xb1\x10\xac\x0e\xde\x80\xb0\x44\x41\xa4\x6a\xea\x5e\x95\xc0\x29\x11\x30\xad\xed\x88\x83\x5e\x7d\x35\x36\xa3\x6e\x47\x56\x04\x34\xf9\xa7\xb1\xdd\xee\x1f\x4a\x14\xb6\xe3\xa5\xda\x44\x6d\xdc\x16\xdb\x3a\xea\xbf\xce\x51\xdb\x86\x1a\xa9\x6b\xaf\x46\xd0\x49\x87\xcb\x68\x80\x39\x3c\x98\x87\x07\xfe\x48\xf2\x85\xf0\xb1\x1d\x76\x8b\x73\x74\xd5\xd5\x09\x10\xe0\x26\xe4\xef\xb5\x6c\xaf\x14\x20\x12\xc8\xca\x65\xd5\xea\x27\x9e\xe5\x49\x9b\xa9\x28\xa5\xb7\xe4\xa4\xb5\x87\x86\x05\xd2\x82\x9b\x57\x5f\xa4\xe4\x2e\x10\x74\x4e\x18\x3f\x43\x7d\xc5\x5a\x26\x4b\x46\x45\xd3\x60\x41\x14\x35\x69\xc4\xda\xa0\xba\xd9\x12\x81\x90\xb8\xa7\xe8\xe1\x13\x75\xe1\x79\x65\xbd\x08\x4c\xef\x7b\xee\x42\x04\xe2\x13\xc2\x1d\x73\x1b\x63\x91\xcf\x99\x45\xa6\x42\xb6\x29\x2e\x16\x22\x79\x10\x24\xe4\x42\x36\x34\x8b\x57\x49\xd7\x9b\x24\x45\x32\xb4\xe2\x81\x8b\xdd\xa8\x6f\x24\x38\x4c\x0b\x61\x12\x50\xa3\x62\x55\x02\x97\xf9\xc3\x71\x4d\xc1\x68\xe6\x95\x82\x57\xfb\xa0\x8e\x17\xec\x99\xd5\x98\x88\x71\x12\x5e\xc6\x01\xf6\xc0\xec\x2d\x78\xea\x83\xca\x10\x62\xec\x43\xb1\xa1\x6d\x4c\x91\x15\x30\x89\x44\xb2\xd8\x54\xe9\x9a\x28\x74\xa0\xbe\xb0\xc8\xe0\x74\x0f\x37\x38\x55\xe2\x40\xef\xa8\xe6\x0f\xf9\x5d\x36\x8c\xcf\xf2\xa3\x8e\x10\xf3\x9e\x17\x58\x7c\x16\x0c\xc6\x01\x57\x4d\xdd\xab\x6c\x27\x3b\x41\x17\x3a\x87\xb1\xbc\xa6\x4a\x13\x4f\x09\xde\xed\x1b\xc1\x12\x13\x4b\x52\x56\xf0\x84\xd7\x03\x9e\x66\x84\x06\x85\xac\x44\x0f\xc5\x36\x5b\xb8\x39\x30\xcf\x72\x3c\x1a\x14\x9d\x06\x3e\x3d\x00\xe7\x17\x39\xc9\x6a\x86\xe0\x18\x6d\x67\x0f\x85\x56\x90\xf9\x00\x2f\x90\x25\x04\xd5\x61\x0f\x17\x39\x93\x26\x78\xd3\x66\xb6\x10\x7a\xdc\xf7\x45\xba\xe0\xe8\xec\xa2\xd8\xce\x2a\x60\xd0\x03\xf1\xdd\x8c\xdc\x54\xad\xf2\xc5\x23\xaf\x77\x6a\x1b\x8b\x02\x38\xa3\x0a\x79\x5f\x64\xdb\xbc\x42\xbc\x0b\xe4\x4a\x4a\x26\x7a\x14\x75\xa0\x8a\xeb\x05\xa7\x4c\x36\x49\x89\xaa\x46\xc8\x27\xf3\xc8\xbd\x1c\x09\x73\x1f\xb7\xd6\x3e\x79\x67\x50\x40\xf8\x67\x19\xbf\x70\x05\xda\xd4\xc3\x3a\xc9\x73\x55\xc6\xb8\x6e\xbd\xf8\x1b\x9d\x12\x34\x24\x48\x05\x87\x33\x42\xb7\xf2\x23\xe3\xd2\x44\x25\x69\x0f\xdf\x63\x8f\xd8\xac\x6d\x37\x36\x07\x02\xcb\x85\xcc\x13\xed\xeb\x83\x22\x0a\x3c\xbc\x4a\x7e\x2e\xd0\x3c\xc0\xec\xa4\x39\x66\xa2\x8c\xe7\xbc\x48\xf5\xbc\x54\x88\xf8\xc4\x6f\xb3\x14\xa7\xb2\x36\x5f\x51\xc2\x23\x3d\x5e\x2d\x78\x2e\x2e\xc3\x45\xad\x3f\x66\x69\x05\xbb\x2a\xf2\x0a\x1b\xa8\xda\x21\xa2\x9b\xd3\x16\x45\xcc\x76\xd0\xb4\x58\x4e\x56\xb0\x11\xa0\xd3\x76\xb9\xf1\x5b\x31\x39\xd1\x18\xc1\xc6\x62\x8e\x64\xca\x6a\x35\x40\xd5\x2e\xcd\x7c\x55\x5a\x14\x0f\xb9\x2c\x53\xfd\xc5\xd6\x4d\xc0\x1b\x80\xa6\x27\xbd\x57\x9c\xc8\x2a\x4a\x4c\xcb\x24\x19\x88\xf3\x7e\xb1\xf5\x7e\x04\xe5\x72\x67\x20\xdb\x2c\xd6\xd4\xac\x5b\xaa\x1e\xb1\x8d\xab\xa2\xb8\x45\xa6\x30\xbf\x07\x49\xa9\x84\x67\xcf\x36\xba\x03\xd5\xc3\x0f\x48\x7c\x67\xce\x4f\x8f\xca\xa4\x76\xb6\x98\x0f\x89\xd6\x52\x90\x27\x41\xa3\x56\x0a\xc5\x66\xfd\xd2\xa5\x78\x64\xa2\xf1\x2e\xae\xd4\x1d\x32\xc1\x34\x9a\x2d\x41\x52\x36\xd8\xac\x22\xdc\xac\x68\x3c\x33\xd5\x3d\x74\x2c\xac\x78\x85\x4b\xac\xd1\xcf\xbc\x78\xf0\x78\xc1\x45\xdb\x78\xe6\xb4\x84\xf8\x58\x85\x07\xb0\xe5\x84\x57\xd4\xab\x3a\x3c\xd8\xb9\x36\x60\x4e\x08\xcb\x82\x14\xc4\xed\xf6\xc9\x09\xd4\x28\xed\x4a\xbf\x2c\x5a\x50\x12\xd8\x7b\x03\x08\xdc\x5c\xb4\x90\x8e\xdd\x16\xdb\x77\xcc\x0d\x95\xc4\x66\x84\x70\xe9\x87\x64\x85\x56\x90\x86\xd2\xce\x4d\xba\x47\x24\x8a\x43\x4f\x8d\xa9\xec\x62\x39\x58\xa8\x1c\x48\x42\x6b\x9c\x78\xb8\x38\x1f\x14\x97\xeb\xd6\xa6\x52\x88\x79\x5b\x53\x70\x83\xf9\x17\x71\xc3\xd1\x0a\x16\x67\xf0\x52\xc1\x75\xc1\xb7\xc5\x16\x5a\xf8\xba\x6d\x42\x3c\xb7\x49\x08\x92\x73\xfe\xa7\xe7\x83\x93\xf2\x22\x7c\x01\x62\x77\x0f\x80\x76\x89\x99\xfc\x78\x61\x1b\x47\x5a\x9b\x2d\x7e\x57\x14\x0b\x1d\xc9\x34\x56\xb1\x65\xd7\x09\x62\xbf\x87\x02\xd6\x7d\x60\x00\x82\x17\x94\xc8\xc5\x16\x33\xc6\xfe\x79\x16\xb6\x1f\xbc\x97\xd0\x1a\x17\x8d\xb9\x8d\xd8\x12\xac\x7c\x6c\x7d\xcd\x26\xc2\x45\xfe\x06\x8c\xe1\xcf\x14\x63\x7f\x84\x34\x1e\x40\x73\x36\x03\xfa\xbe\x3b\x19\x4c\xa2\x80\x0d\x67\xdc\xbf\x1e\xf7\x27\xfd\x21\xf2\xdb\x40\x3d\x56\x98\xd5\xf4\x4a\xb6\x50\x11\xb3\x99\x3e\x8d\x9e\x90\xcd\x15\xcd\xda\xad\xe9\x60\x7a\xd9\x8f\xe4\x70\x34\x3c\xf2\xab\xb1\xa2\x26\xf7\xfc\x68\xec\x27\x51\x45\x3b\x8b\x0e\x88\x77\x8e\xcd\x18\x5c\xf6\x2f\x41\x7e\xf6\x7a\x34\x9c\x0c\x38\x4f\x7a\xde\xc7\xe2\xb8\xc1\xf0\x03\x66\x14\xaf\xaf\xc7\xa3\xeb\xf1\xa0\x3b\xed\x03\xaf\x3d\xa4\x3a\xa1\xf5\x57\xa3\xf3\xc1\xc5\x2d\xa4\x25\xc7\x72\xdc\xb7\x92\xc6\xfc\x4d\x3b\xc8\x90\x4c\x9e\x4c\x6e\xae\x50\xff\x73\x3c\x98\xfc\x3a\x31\xbf\x18\xf5\xcc\x53\xcf\x31\x7b\x79\x3b\xba\x31\xe3\xd5\x1f\xf7\x06\x88\x17\x74\x25\xdf\x13\x52\x6e\x25\x01\x5e\xe0\xff\xc0\xb9\xfd\x79\xaf\xea\xf3\xb7\x8b\x3e\x83\x66\x2c\x4f\x1c\xca\x05\xbb\xba\x34\xe2\xfe\x1f\x79\x7f\xa4\x0c\xf1\xf4\xe3\x60\x7c\x4e\xbf\xda\x0f\x31\x0d\x92\xcc\x91\xd8\xa7\xbc\x6c\x41\xa7\x36\x0f\x0d\x63\x63\xe6\xa8\xdf\x9b\x72\x69\x1f\x6b\xb6\x5e\x8e\x26\x13\x00\x6a\xe2\x87\x5d\x9a\xd8\x0a\xdd\xb6\xa8\xcf\xe2\x20\xf6\xa7\xd3\xfe\xd8\xe9\xde\xda\x44\xb5\xb8\x18\x99\x25\xde\x87\xb4\xf9\x68\x2c\x6f\x86\xde\x2f\x5a\x25\x95\x3f\x76\x27\xa8\xa5\xbc\x1f\xc8\x29\x18\xc8\x19\x34\x5c\xda\x86\xa3\x9e\xae\xdb\x04\x93\x9a\xb4\x72\x7f\x6a\x46\x76\x6a\xbe\x4f\x50\x06\xea\x10\x26\xfd\xad\xa8\x30\xd4\xcb\xdd\x5c\x5e\xf6\x27\x53\x16\x15\xe6\x45\x64\xba\xd3\x9d\x82\x56\x32\xcd\x11\x48\xc9\x5e\xc1\xd0\x8b\x71\xff\xc3\xcd\x25\xbe\xda\xaa\x89\x7f\xb0\xca\x60\x97\xc9\x03\x47\x17\xb5\x31\x3d\xab\x42\xfe\xc5\x93\x34\xa4\x0c\xa0\x53\x42\x6c\x95\xed\x04\x3b\xde\xdc\xfc\x9b\x52\x55\x7b\xe9\xc2\x45\x96\x3c\x68\x8f\x25\xb9\x52\x35\x61\x4a\x4f\xa1\x13\xae\xca\x59\xb1\x80\x6b\x28\x4b\x1e\x7c\x9d\xc6\xf9\xaa\x48\xe7\x4a\xe0\x1f\x58\x09\x2f\x10\x5a\x84\x87\xc3\xab\x28\x8c\x07\x02\x89\xec\x59\x23\x8e\x67\xae\x14\x86\x9c\x50\x52\x53\x00\xd0\x07\xc4\x4a\x5b\x3c\x40\xd7\x7f\xc4\xaf\x24\x8b\xbf\x6d\x17\x44\xce\x8c\x64\x8b\x1b\xe0\x06\xc5\x2c\xa5\x70\x6a\xef\xfb\x94\x3b\x27\xdb\x8d\x02\x3a\xb3\x1e\x4b\x4a\xa2\x97\xb4\xcd\x2b\xe8\xf2\x24\xc9\xe5\x55\x52\xa9\x22\x12\x2d\x23\xc5\x15\xd7\x61\x77\xad\xdc\x27\x3e\x93\x43\x1f\x0d\x39\x50\x11\x3c\x2b\x96\x7d\xab\x79\xe9\x54\x4f\x29\xf6\x84\xe2\xa7\x9a\x48\x11\x9c\xf8\x2a\xf9\x31\x22\x50\x42\x85\x82\x62\x50\x15\x2d\x96\x6c\x4b\x83\x2e\xe9\x12\x10\x55\x90\x5b\xd5\x2c\xf4\x8f\xb5\x14\x24\x9b\x39\xc8\x05\x97\x55\x50\x49\x13\x6a\x8c\x52\x2b\x1e\x12\xbe\xd4\x1d\x83\x7f\x22\xff\xb6\x2d\x77\xb2\x2a\x41\xe3\x98\x40\x5c\x73\x0e\xa5\x7a\xf3\xbb\x57\x55\xd5\x29\x2c\xbb\x44\xe0\x90\xe2\xcf\x45\x59\x37\x55\xc2\x68\xac\x9f\x41\x3f\x3d\x3e\x7e\xf5\x68\x28\xd9\x18\xc1\x1c\xd6\x0b\xac\xf5\xfd\xb1\xff\x48\x3e\x26\x86\x28\xbe\x4d\x0c\x51\x3e\x25\x86\x28\xf6\x89\x21\xbe\x13\x82\xe4\x10\x4b\xc6\x7a\xea\xb9\x4a\xe2\x79\xb1\x7e\x61\xfe\xf1\x6f\x48\xc5\xf4\x6f\x68\x86\xfe\x1b\x97\xa0\xaf\xaa\x75\x26\xc4\x0d\x22\xe0\x2c\x83\xfd\x6c\x27\x43\xb9\x5e\xf0\x11\xcd\x6c\x60\x58\x27\x07\x8c\x1c\x60\xd1\x9a\x1c\x9d\x8a\x80\xa1\x41\x03\x1f\x95\x59\xac\x99\x38\xbe\xd5\x31\x16\x8e\x64\xe5\x9f\x91\x5d\x84\x43\xed\x31\xd9\x45\x07\xf6\x7b\x96\xf6\xe2\x9f\x9d\x8b\xfa\xf1\xf3\xfd\x7f\xe2\x17\xbd\xeb\x11\x10\x00\xfe\x71\x12\x90\x8f\xe7\x7f\x4f\x5f\xbf\x6c\xe8\xff\x9c\xbe\x79\xf9\x03\xff\xf5\x5d\x7e\xa6\x2b\x16\xc3\x45\x8e\x3d\xa4\xef\xb3\xcc\x7d\x66\x71\x1c\x9a\x4b\xe0\x34\x14\x05\xf2\x42\x04\x78\xdc\x68\x12\x2e\xd6\x96\x9a\xf5\x73\x51\x7e\x21\xe8\x88\x77\x60\xda\xac\x1f\xf2\xcf\x14\x0f\x82\xab\x02\x90\xf7\x8a\xa9\x72\xfc\x30\x86\x39\xba\xfa\x8e\x26\xfe\x02\xe8\x7b\x6c\x54\xc3\x51\x2f\x0b\x7e\xad\xbd\x90\x3d\x29\x6c\x2f\x08\x4b\x94\x7c\x20\x55\xb0\x29\xd2\x1c\x40\xf3\x2d\x69\xac\xfa\x7d\x54\x2a\x26\x7f\x7b\xb2\x75\x44\x22\xc4\x10\xef\x3d\x30\xae\x5f\xbe\xf1\x71\x01\x99\xd3\x2f\x90\x11\x6b\x3e\x80\x3e\x6b\x43\x9f\xc6\x62\x05\x0d\x9f\x06\x38\x3f\x16\xe2\xc8\xb8\xef\x80\xd7\x42\xa3\x29\x65\x25\x8e\x48\xde\x6d\x13\x48\x52\xa9\x88\x35\xf5\x18\x4a\xe7\x55\x0e\xf8\x90\xbc\x18\x46\xb5\x15\xac\xd7\x01\xb0\x5e\x07\x5e\xc8\x8a\x53\xf3\x4c\x35\xc3\x39\x30\x7b\x7b\x18\x67\x40\x5b\x9c\xa4\x39\xd5\x42\x30\xee\xcf\x11\xe9\xfc\x04\x69\x1f\xe3\x46\xd4\x96\x28\x56\x33\x00\x40\x69\xa6\xaa\x07\x85\xe1\x13\x54\xbe\x0e\xb3\xad\x18\xf8\x20\x0c\x7d\xa9\x12\x00\xe1\xd5\xe5\x2c\x40\x35\x3f\x5c\xe8\xae\xb6\x79\xb3\x2d\xf5\x36\xc9\xab\xba\x2c\x39\xcc\xd6\x13\x2f\xc4\x2c\x6e\x81\x3a\x07\xf6\xd1\xf5\xf0\x2a\x39\x05\xc2\x6e\x52\xa6\x8f\x3b\x74\x66\x1e\x46\x62\x3e\x8f\xc6\xbf\xca\x83\xee\x44\x02\xef\x61\xff\x5c\xbe\xef\x5f\x8e\x3e\x1f\x06\x81\x19\xf6\xfe\xfb\x72\xda\x1f\x5f\x4d\x2c\x92\xb9\x37\x3a\xef\x9b\x4f\xfd\xa5\xdf\x9b\x0a\x60\x08\xa5\xe0\x80\x3c\xe8\xd0\xbf\x3a\x87\xe8\x5c\xc2\x6b\xf0\x99\xd3\x7e\x6f\x8a\xc8\x77\x57\x3d\xda\x1d\x9e\xbf\x60\xf4\xb5\x30\xfe\xe4\xa0\x07\x1e\xf0\x65\xf7\x73\x0c\xb6\x8f\xad\x61\xa4\x47\x11\x4e\xfb\x63\x77\x28\xbb\x13\xd2\xe9\x1b\xfc\x37\xaf\xad\x2e\x52\x21\x00\x63\xce\x6f\x32\x1e\x28\xb6\x03\x34\xc2\xfb\xe7\xb1\x10\xef\x6f\x39\xf0\xc1\x6c\x36\xf0\xd9\x89\x55\x1c\x34\x6f\xb4\xa3\xf1\xb1\x3f\xee\x0f\x86\x11\xc6\x71\x7a\xbd\xfe\xf5\x14\x03\x2c\xc6\x97\x17\xd3\x91\x7c\xdf\x97\xef\x47\x37\x43\x5b\x09\x1c\x8e\x19\x87\x4f\x3c\x7d\x41\xf9\xc1\x98\x7d\x13\x78\xa0\xf9\x2d\xbe\xdc\x18\x80\xd3\x2e\x4c\x09\xbe\x91\x82\x09\x93\xc1\x79\x7f\xdc\x65\x72\x1c\x88\xda\x60\x2b\x18\x64\x0e\x9e\x3e\xbe\x94\x4a\x8e\xc9\x8e\x8c\xc5\x00\xbe\x20\xcf\x47\x50\x29\x00\x2d\x86\x98\x86\xeb\xc5\xb3\x1a\x0f\x7d\x17\xbd\xee\xd0\x3c\xe5\xaa\xfb\x6b\xbf\x6d\x8a\xe2\x16\x04\x50\x2c\x44\x12\xcb\x0e\x6d\x6d\x4d\x2a\x4d\x91\xf4\x53\x9e\x11\x84\x74\x13\xfa\x88\x2d\x4a\x99\xed\x68\x07\xd3\x0e\x40\x0a\xb1\x99\xd2\x62\x55\x3c\x3c\xef\x3a\x60\x6f\xd3\x1e\x20\x7c\xfa\x02\xc2\x87\x78\xdb\x66\xa6\x7d\x44\xb5\xc8\x8a\x4e\xf5\x0d\x49\x5b\x11\x02\x00\x7b\x77\xa2\x68\x4d\xd0\xc6\x10\xc6\xee\x9c\xbb\x63\xd6\x7c\x8b\x5f\x95\x20\x9d\x00\x0a\xf6\x6f\x37\x54\x58\xf6\x99\x94\x5d\xc3\x5f\x98\xb3\x82\x98\x1c\x4b\x75\xa4\xbe\xa6\xa8\x8d\xc3\xa7\xf6\x22\x96\x9d\xfa\x08\x10\x79\xa4\xf3\x91\x3d\x31\x0b\x9f\xf7\x2e\x0a\xa1\x29\xb6\xb0\xcc\xfa\x49\x8e\xc7\xb4\x01\x81\x82\x2b\x5d\x08\x15\xcb\xce\x35\x9d\xc3\xc1\x48\xd2\x79\x6f\x33\x2a\x0f\x6a\xa6\xd3\x4a\x45\x72\x9d\xdc\x25\xff\x48\x73\x15\xc9\xde\xf9\x11\xb0\x39\x9d\x7f\x3a\x77\x74\x95\xa8\xe2\x43\xe4\x6f\x40\xa1\x89\xeb\xc0\xdd\xe7\xae\x54\x89\x22\xfa\xb1\x10\xcb\x58\x86\x10\xa1\xc7\x08\x4a\x7d\x5e\x98\x06\x3e\x07\xc9\x07\x2d\x29\x1c\x5d\x97\xe6\x21\xf5\x51\x8e\x85\xb8\x33\xaf\x7d\x5a\xec\x0e\xdb\xfd\x7b\x29\xdd\xd1\xbd\xc6\x03\x8b\x8b\x38\xb2\x19\x43\xb8\xf3\x10\xc9\x4b\x53\xb5\xdc\x66\x99\x97\x7b\x0d\xbf\x18\x0b\xb1\x8a\x65\x07\x57\xe7\x6f\xd2\x14\xb4\xd3\x1f\x89\x50\x36\x39\x80\x8c\xd5\x47\x8f\x56\x22\x90\x2f\xbb\x65\x16\xd5\xa0\x80\xe2\x61\x95\x56\x6a\x93\x6c\x88\x0a\x04\x1b\x4e\x67\x46\x2c\x44\x1a\xcb\x50\x7f\xaf\x81\x99\xe2\xeb\x34\xd5\x2b\x64\x84\xb5\x66\x25\xef\x2e\x86\x48\x29\x01\xca\x19\x8f\xa1\xa4\x4e\x63\x79\x91\xa4\xa5\xbc\xd1\xea\x05\xff\x03\xe1\x3f\x3a\x96\xc3\xa2\x5a\xd9\x51\xdf\x6f\xe9\x96\x0a\xf0\x48\x02\x1c\xf0\x08\x2d\x19\x0a\x96\xc1\xde\xc3\xd7\x07\x45\x06\x4b\xf3\x2a\xc0\x14\xc0\xbf\x16\x2a\xc9\x20\x36\xb1\x4c\x4b\x5d\x49\x9d\x64\xca\xda\x25\x81\x5f\x4f\xc7\x88\x8d\x91\x49\x47\xb4\xd2\x96\xfb\x84\x2e\x7b\x29\x20\x8a\x8b\x50\x02\x28\x88\x97\x68\x94\x3c\x0b\xf1\x62\xf2\x5b\x68\x83\x6c\x74\xc9\x1c\xa1\x74\xe2\x87\x28\x33\xc0\x75\xf8\x00\xb0\x90\xcd\xa7\x06\x14\xb3\xe8\x30\x71\xc0\xe7\xff\x82\x21\x77\x4c\x27\xe8\xba\x60\x3b\x79\xe8\x43\xc7\x78\x21\x78\x30\x2d\x91\xfa\x47\xb1\x66\x0a\x93\x99\xca\x8a\x87\x77\x70\xcb\x71\xfc\x8a\x97\x95\x55\x01\xba\x0f\xa9\x40\xfd\x6b\xab\x28\x1b\xfb\xc1\xbc\xe8\x96\x94\x5b\x02\xc7\x00\xef\xaa\xdf\x41\x31\x2f\x2c\xf0\xac\x1e\x95\xcc\xa3\xb3\x41\x76\xe9\x12\xf5\x8e\xa4\xba\x4a\x9e\xd8\xa7\x92\xd7\x18\x08\xc6\x0c\x00\xc5\xad\xbf\x54\xea\xd7\xe6\x5e\x25\xbd\xdb\x86\x92\x1e\x34\xef\xc0\x0f\xd6\xbb\xf3\xe1\x50\x38\x7d\x3d\xef\x2c\x4f\x64\xed\x56\x6e\x49\x8b\xb7\x68\xef\x89\x67\x6a\xef\x91\xae\x0a\x29\xf0\x95\x80\x5f\x69\x4a\xf0\xe1\xcd\xbd\x47\x56\x6c\xdf\x12\x6a\x58\x3a\x80\x3d\xc0\xbc\x3b\xaf\xab\x5a\xdf\xe4\x6f\x13\x31\x12\x2d\x22\x46\x7b\xbe\xd2\x2a\x62\x84\x96\x81\xe7\xde\xc1\xcd\x31\xdf\x6a\x1d\x78\x77\xd6\x83\x0b\x70\x51\x74\xaf\x20\xe8\xcf\x8c\x8f\x78\xd2\x03\x94\x8f\x79\x80\xd8\x10\x7c\x9c\x40\x0e\x38\xed\x1d\x7e\x3e\xe2\xc6\x5e\x2d\x8d\x6d\xdd\x36\xf6\xc2\xdf\xd3\x7b\x9d\xbd\xd9\xb6\x92\x7e\x94\xbc\x54\x9b\x42\x57\x41\x07\xac\xf9\x03\x8b\xdd\x5b\x0d\xd0\xff\x2f\x3e\xd4\xdd\x5f\xe0\x51\xd0\xed\x40\x93\x46\xb4\x5a\x09\xb1\x10\x5d\xe8\xaa\x53\x3b\x2a\xe0\x98\xd8\x66\x35\xe1\xa3\xdb\x56\xe1\xa3\xe0\x14\x13\x2d\xa7\x58\xb8\x2f\x1b\xfa\x3e\x6d\xe2\x48\xe6\x93\xc2\x1e\x0d\xf4\xe1\xfd\x31\x98\xe0\xac\x78\x19\x13\xd4\xd6\xa5\x13\x7e\xd3\x1d\x64\x36\x74\xfb\x25\x44\xa0\xdc\x6f\xa6\x9e\x13\x7b\xa9\xe7\x24\x53\xcf\xb9\xdb\x84\x2d\x06\x8d\xd6\xd6\xf3\xe9\xe5\x1e\x67\x92\xf3\xed\x74\x40\x20\xb9\x0a\x3f\xdc\x12\x7c\xf5\x31\x02\x39\xcd\xe5\x84\x0c\xbe\x33\x62\x27\x4c\x7d\xfe\x2e\xf3\x66\xe1\x4d\x8d\xcd\x23\x38\x63\x70\x6f\x41\x21\xdd\x94\x08\x5b\x26\x84\x1f\x16\x8d\xf9\x8c\xbf\x4d\x4d\xd9\x88\x06\x03\x58\x01\x16\x6a\x9d\x94\x5f\x88\x01\xc3\x21\x52\x9e\xa1\x3b\xeb\xb0\xc7\xc8\x5e\xc1\xd4\xd6\x4f\xdc\xca\xee\xf2\x0d\x1a\xee\x68\xa1\x1d\x86\xd3\x5c\x32\xe9\x1a\x58\xd3\x2c\x6f\x06\x3b\x2c\xb6\x7a\x51\x30\x26\x0f\xf5\xd9\xe6\x4d\x15\xab\xae\x3d\xf5\x9e\xd6\xae\x92\x75\xed\x2a\x77\xb5\xc3\x9b\xf7\x9e\x0e\xed\x3e\x84\xbb\x93\x82\xce\x22\x69\x21\xe8\x6a\x90\xb9\x9a\x57\x84\x2e\x77\xe9\x62\x2f\xc2\xbb\x28\x40\x0f\xb1\x12\xd6\xae\xdd\x01\xac\xbd\x58\xcb\xd0\x3f\x60\x7f\xb7\xed\x59\xe6\x02\x46\xfd\x50\x52\xd0\x6b\xd7\xca\x43\x78\x2c\x66\x84\x53\x2e\x60\xd4\x45\x46\xf4\x76\xf0\x24\x4b\xa4\xcf\xd2\xcf\x91\x70\x82\x21\xe6\xb3\xd4\xb9\x05\x77\x0e\x8a\x42\xd5\xde\xdb\xf9\x91\x5b\x98\xd6\x51\x9e\xed\x9e\x8a\x0f\xe0\x9e\xbd\xe5\x52\xd9\xb4\x8e\x77\x8b\xbc\xbc\x3a\x5c\x8a\x63\x45\x00\x3b\x82\xd5\xa5\x58\x3c\x13\x02\xb8\xf0\x82\x57\xf7\xaa\xdc\x05\x69\xd4\xe6\x31\x5d\x06\x76\x83\x69\x87\xaf\x2b\x6a\x9c\xa2\x5c\x6f\x19\xb2\x4f\x05\xcb\x8e\xa3\x13\xee\xca\x86\x05\x5b\x1f\x07\x58\x45\x1e\x83\x4b\xeb\x40\x38\xa6\xc1\xda\x43\x85\x1d\xdc\x17\xae\xf6\xc2\x3c\x37\xd0\x7c\x24\x86\x4d\xcc\x8e\x16\xc4\xd3\x4e\x2f\x72\x96\x3b\x31\x56\x66\x28\x8c\xe1\x1c\xae\xfd\xad\xe2\x5a\x0d\x2b\xf0\xfd\x93\x73\x13\x69\x50\xc9\x99\xe2\xc3\xd3\x02\x2d\xc2\xf6\x69\xb0\xb1\xd1\xc3\xb0\xfb\x84\xe7\x5d\x7c\x51\x6a\x63\x2e\xd7\xc4\x78\x7f\x78\xfd\xc1\x41\x46\x05\x5a\x36\x88\x53\x83\x61\xd2\xe5\xe6\xd1\xbf\x16\x4b\x41\x21\xf9\xd4\xb7\x5e\x4c\x0b\x9e\x5a\xbe\xe1\xe8\xc2\x12\x12\x38\x8a\xf3\x55\x5e\x64\xc5\x1d\xc8\x8a\xac\x55\x62\x16\x04\x35\x0d\x20\xb0\x45\x06\x15\x55\x98\x9c\xae\x07\xc1\x53\x14\x5a\xce\x73\x55\x8a\x34\x87\xcb\x5f\x57\x58\x6e\x4f\x71\x8c\x7d\x97\xfa\xb2\xe5\x0c\x0a\x7c\x76\x28\x2f\xc8\x32\x75\x97\x00\x99\xea\xba\x28\xd1\xd5\x87\x6a\x8c\x8d\x72\x00\x0f\x90\x70\x2e\x72\x92\x55\x75\x30\xde\xc7\xbf\xcd\x3c\xb9\xde\x11\x92\xea\xe0\xda\x73\x7e\xa4\xfa\x0a\xfa\x53\xe0\x11\xfb\x65\x39\x58\x05\x47\x8a\xcd\x30\xb3\x48\xe0\x9a\x3c\xe0\x36\x29\xd5\xdd\x36\xf3\xb9\x8a\x9c\x6f\x47\x73\x8b\x0e\x27\x70\xb5\xc2\x85\x01\x9b\x6f\x13\x9e\xb7\x20\xf0\x39\xe6\x1a\x6e\xae\x5b\xf9\x6c\xd7\x01\xac\x95\x73\xc7\x53\x8c\xc1\x5d\x2f\x44\x1f\xb2\xe3\x8b\xce\xe7\x8f\x7d\xc0\x6a\x22\x2f\x8d\xf9\x7d\xf7\x53\x77\x70\xd9\x7d\x7f\xd9\xef\x44\xcf\x17\x2c\xac\xc3\x1a\xc6\xf2\xc3\x4d\xd7\xfc\xad\xdf\x9f\x00\x2e\x32\x62\xea\xf6\x71\x64\x01\x8b\x97\x97\x00\x58\x94\x83\xa1\x1c\x4c\x27\x48\xf3\x62\x21\x9c\xc2\x05\xf6\x43\x68\x26\x72\xe3\xd7\x7e\x39\xb9\x19\x38\xac\x66\x7f\xda\x8b\x39\x00\x4f\xad\xbe\xbc\xb5\x1c\x9f\x13\x78\x31\xfd\x3e\xb2\x7d\x19\x8d\xe5\x64\xda\x9d\xde\x4c\x01\xaf\xe8\x77\xcc\x8b\xb3\xfb\xed\x6b\x93\x65\xdc\xf7\xbd\x36\x9d\x00\xef\x17\x97\x7d\xf1\xaf\x37\x5d\x24\x66\x1c\x3f\x49\xd6\x13\x31\xce\xce\x97\x34\x00\x24\xab\xf9\x43\x03\xcb\x0a\x74\x93\x1f\xbb\x53\x97\xef\x38\xa0\xef\x5f\x03\x17\x0e\x90\xe1\x8f\xfb\xa3\x0b\xc8\x0c\xf5\x46\x63\x84\x55\xde\x4c\xfa\x17\x37\x97\x91\x7c\x7f\xf3\xe1\xe8\x62\xdc\x37\xcf\x16\xf8\xff\x17\xf2\xd3\x60\x7c\x33\xa1\x89\x95\x57\x37\x93\xa9\xbc\xee\x4e\x26\xb8\xd6\x1c\x95\xaa\x1c\x0d\xe5\xe7\x8f\xfd\x21\x50\xfb\x40\x72\x82\x61\xac\x7d\x97\x9f\x02\x58\xec\x78\xf0\xa9\x3b\x1d\x7c\xc2\x5f\x4d\x50\xa9\x75\x90\x2f\xd4\x3a\x4f\xab\x5d\x6d\x97\x2d\xd4\x52\xe5\xa0\x6c\x01\x7f\x5f\x22\xfe\x6f\x55\x64\x0b\xb9\x4a\xca\x35\xa0\x7e\x9c\x81\x23\x38\x82\x68\x43\x96\x4c\x52\xb0\x90\xc9\x9d\x71\x0b\xd1\xb0\x61\x0a\x65\xbd\x4d\x2b\x1d\xc9\xac\xd0\x1a\xc3\x94\x40\x00\x12\x01\x31\x48\x9a\xa1\x72\x9c\x98\x17\xba\x22\xe4\x9f\xfa\xba\x41\x12\xdb\x03\x67\xe8\x78\xda\xc8\x70\xe6\x48\x2c\x17\x2e\xca\x5c\xed\xf4\x4f\x72\xa9\x94\x3e\xa4\x52\xdc\x34\xbf\x13\x1c\xf7\x06\xa8\x18\x05\x2c\x81\x8b\xaa\x76\xbc\xda\xc8\x77\x0d\x99\x9b\x3b\x64\x6e\x2c\xfb\x7f\x85\x7c\x0f\x65\xb7\x08\xa9\x39\xee\xff\xeb\xcd\x60\x8c\x89\xb9\x30\x03\x17\x09\x9f\xe8\x09\x50\xba\x5e\xf2\x6a\x84\x99\xc1\xeb\x9b\xf7\x97\x83\xc9\x47\x5f\x4c\xc2\xbc\xc0\xcc\x28\x91\xa1\x02\xd6\x57\x10\xd6\xb7\x85\x11\xca\x01\x71\x43\xb0\xae\xbc\xbe\x19\x0e\x60\xe2\xdb\x00\xba\xa2\x46\xcd\xe4\xe7\xa9\xb8\x6d\x8d\xe4\x61\x20\x21\xc1\x98\xda\xe9\xc7\xbe\xd8\xd7\xa7\x67\x80\x6c\x6b\x6c\xa9\x0e\xc8\x3a\x85\x4a\x26\x06\xc4\x27\x35\xbc\x03\x2f\xbd\x7d\x56\x03\xd1\xd0\xd0\x33\x54\xa8\xa2\x2c\x20\x25\x64\xd6\xc1\xac\x84\xe0\x13\x79\xe8\x04\x60\x34\xdf\x6a\x96\xd6\x0c\x6c\x1c\x5c\xdb\x40\x78\xaa\xb4\x78\x58\x15\xe8\x48\xa2\x3d\xa7\x16\xf5\x98\x11\x95\x84\x9b\x17\x34\xa3\xe0\x9e\xec\x1e\xd4\xff\xd8\x92\x03\xe4\xcf\xb6\x3c\xce\xb6\x27\x1e\x9d\x3f\xdc\x81\x69\x7b\xb3\x8c\x33\x98\xa4\xb9\x48\x73\xcc\x57\x34\x31\x83\xc6\xba\xe3\xc7\xc7\xec\xa8\x6a\x79\x12\xc9\xd3\x48\xbe\x8e\xe4\x9b\x48\xfe\x1c\xc9\xb7\x91\x3c\x39\x86\xe0\xcc\xc9\x09\x8e\xa9\xde\x96\xf7\xe9\xbd\xb3\x0c\x03\xce\xef\xc0\xf2\x98\x01\x07\x8d\xe9\xf7\xac\x74\x6a\x65\xe4\x86\x3a\xf7\x93\xdd\xf3\xc2\x17\x18\x64\x62\xed\xb5\xe5\x60\x17\xc1\x91\xe2\x31\x57\x17\xf7\xb5\xcf\x63\xac\x1b\xa1\x17\xbe\x8a\x1d\xef\xf6\x08\x33\x13\x16\xee\x67\x66\xa7\x5e\x20\x16\xd8\x0d\x2a\x5f\xe8\x70\x05\xa1\xb3\x59\x0b\x8e\xa0\x8b\xdf\x16\x22\x89\x1a\x29\x0c\x1b\xff\x90\x07\xcb\x02\xcb\x7e\x9f\x13\x5f\xf7\xd3\x85\x87\x90\x23\x31\xb3\xc9\x9c\x9a\xe0\x1f\x11\x1d\xb8\xe7\xfc\x96\xa8\x8d\x55\x83\xd9\x92\xb6\x63\x3d\x05\x6b\xd5\xa3\x5c\xb8\x04\x0d\x4b\xe4\xdd\xaf\x8a\x8d\xe7\x32\xfa\x9e\x27\x3a\x36\xc0\xb4\xfe\x8b\x5d\xa3\x76\x79\x83\x59\x26\x6c\x60\x50\x71\x26\xcc\x46\xa9\xa0\x89\xc0\x01\x9f\x56\xab\x45\x99\x3c\x84\x43\x76\x10\xac\x0e\xdb\x34\x63\xeb\x71\xa6\x0f\x7c\x3c\x8f\x8a\x08\xa5\x3f\xa3\x06\xad\xf9\x1e\x53\xf9\x30\x12\x56\x6b\xcd\xf9\x7f\xb0\x75\xf2\x2a\xcd\xb7\x10\xaa\x86\xbd\x84\x50\x72\xb8\xa1\x96\x4b\x33\xff\xc4\x08\xe9\xf6\xa8\x70\xc1\x28\x98\x0e\xd2\xb1\xb6\xf7\x24\xb3\xc5\x07\x88\x6c\xc8\x9b\x32\x9b\x44\x78\xad\xda\xc8\x5f\x44\x59\x25\xd8\x03\x69\x39\xdf\xae\x91\xcc\x51\x47\x08\x62\xd2\x1b\xe3\x19\x38\x9a\xad\x85\x17\x34\xc4\x4a\xa6\x7c\x67\xef\xdb\x9d\x4c\x73\x61\xbe\xa3\xe6\xd6\x10\x66\xbb\x7c\x9d\x54\x15\x67\x9b\xfd\x53\x70\x1a\xb4\x6b\x9d\x7c\x81\xe0\x84\xc5\x2f\x09\x1f\xbf\x04\x71\x91\xdc\x4e\x74\xb5\x0a\xf3\x84\x41\x38\x93\xc8\xc1\x28\x3e\xc8\x74\xaa\x00\x15\xa7\xa3\x1a\xaf\xfb\x6a\xa5\x0a\x54\x20\x08\x48\xc4\x7c\xc2\x55\x67\x2c\x70\xc0\xc6\x25\xf1\x60\xe0\x88\xc1\x22\xe2\x5a\x51\xf8\x4a\xba\x30\x36\x7f\x46\xcc\x1a\x5a\xfd\x7d\x0b\x0a\x6a\x59\x83\xa7\x2c\xe8\x96\x60\x77\x32\x6b\x1f\xa0\xf6\xad\x37\x87\x8d\x47\x70\x27\xeb\x54\x7b\x41\x69\x8a\x92\xba\x1d\x65\xbb\x82\x1e\x2d\x62\x44\x4e\x62\x79\x95\xea\xb9\xca\xb2\x24\x57\xc5\x56\x37\x6f\xc9\xd6\x92\x0e\xf3\x42\xbf\x5e\x23\x2b\xe6\xc1\xb9\xb3\x52\xc9\x42\x14\xcb\x65\x3a\xaf\x47\xd1\xcc\xfe\x0a\x7e\x91\xd6\x58\x35\xa2\xe0\xe1\xfc\x60\xf6\xf0\x37\xa5\x19\xe7\x4d\x92\xc9\x4d\x96\xe0\xc3\x4b\xa5\xcd\xc0\xd7\xdf\x64\x2f\x0f\x22\x92\x45\xbe\xd0\x46\x54\x01\x52\xc1\xf7\x49\x96\x92\x34\x1b\x55\x79\x78\x1c\x36\xee\x0c\x15\x59\xf2\xe0\x15\x17\x03\xcf\x2c\xee\x5e\xf3\x5a\x78\x88\xd9\x11\x70\x85\xd2\x53\x70\x8f\x70\x78\x02\xee\x53\x44\x60\x88\xbd\x87\x48\x44\x59\x39\x9c\xac\x25\x56\xe3\x72\x75\x0a\x8d\x3d\x6f\x7b\x5a\x3a\x8e\x87\x02\x4e\x46\xd7\x5b\x3b\x79\xa5\x5a\x16\xe5\xda\x89\x8c\xae\xd3\x3c\x5d\x6f\xd7\x52\x7d\x85\x7b\x93\xf5\x28\x76\x1c\xd8\xae\x3f\x08\x47\x08\xa3\x50\x76\x80\xf0\x06\x1b\x16\x64\xed\x94\x8f\x0c\xb3\x6d\xc8\x42\xa9\x35\xf0\xfe\x81\x99\x63\x1e\x98\x17\x64\x42\x71\x82\x04\x5b\xc9\x14\xb9\xa6\x1d\xf0\xe9\xd2\xee\x2b\xbf\xd0\xc8\x15\x06\xe0\x81\x00\x44\x10\xc2\x1b\xa6\x1d\xc9\x37\x63\x16\x80\x68\x6a\xdb\x9f\x8a\xd1\xd6\x60\xf5\x9b\xbf\x80\x3a\x2d\xed\x3f\xa2\x5d\x4e\x6c\xc5\x0f\x23\x16\xfd\x59\x81\x78\x0d\x1f\x8a\xbe\x11\x60\x61\x88\x48\x18\x04\x3b\xbd\x54\xa4\xa1\x27\x43\x6e\xeb\xc8\xbd\x04\x28\x2f\xca\x30\xa8\xc0\x74\xbb\xcd\x97\xc0\x4d\x68\x95\x84\xbd\x37\xb1\xcb\x15\x1c\x9a\xb3\x62\x9b\x53\x95\xd6\xce\xaa\x97\x98\xed\xc5\x53\xd9\x1a\xa7\x47\xfb\x09\xc4\xba\x69\x7f\xb2\x7d\x5a\x1b\x3f\x2f\x68\x6e\x33\xd6\x7e\x0c\x7c\xbd\x05\x03\x86\x83\xe0\xb6\xcb\x22\x3c\x35\x28\x32\xfb\x9f\xae\x08\x22\x7e\xf1\x97\xeb\xe1\xa0\xf7\x87\x12\xc0\x3d\xc5\xff\xff\xe6\x4d\x9d\xff\xf5\xf4\xd5\xf1\x0f\xfd\xb7\xef\xf2\xf3\x97\x64\x93\xe4\x72\xa8\x2a\x00\x27\x0e\x72\xc7\xff\xd5\x03\xc8\xb4\xdd\x67\xfb\x28\x5b\x83\x07\x88\xe6\x03\x62\xd9\xcd\x32\xf6\x80\xc9\xd2\x58\xc4\x42\xbc\xdf\xf9\x8a\xa3\xcb\x34\x53\x11\xf2\x57\x71\x98\x67\x6f\x26\x57\x2b\x28\x2e\xac\x56\x72\xa6\xb2\xac\x78\x90\xb1\x10\x1c\x14\x68\x83\xc6\x22\xda\xdf\x25\x29\xb9\x47\x6d\xd4\x76\x18\x8f\xb5\xea\xbb\x49\x8b\xa7\xe1\x63\x11\xe1\x4c\x7a\x72\x08\x0f\x3a\x12\x36\x99\xec\x1c\x46\x32\xc1\xcf\x2b\xad\x04\x67\x2d\xa1\xec\xf0\xd7\xe2\xcb\x56\x27\xe9\xd1\xaf\xc5\xf6\x6e\x57\x6c\x8f\x7e\x4d\xf2\x45\x22\xdf\x67\x8b\x3b\xf9\xfa\x22\x92\xa7\x47\x67\x47\x2f\xe5\xcd\x7c\x95\xe2\x5f\x22\xd9\x5b\xa5\xbb\x62\x91\x1c\x7d\xd9\x46\x62\x5a\x7c\xd9\x15\xf2\xe4\xf8\xe4\xc8\xec\xa1\x88\x9a\x14\x03\xa5\xeb\x8d\xb9\xb5\xaf\x3c\x54\x10\x74\xb9\x56\x5e\xe8\x05\xaf\xea\x65\x87\xc0\x55\x43\x27\xab\x60\x9e\x03\x73\xc8\x1a\xef\x2e\x94\xff\x7b\x11\xaa\x6f\x69\xf2\x21\x49\xe1\xaf\x19\x57\x68\x65\x17\x6c\x53\xd6\x7b\x4a\xd9\xaf\x49\x4f\x81\x52\xc5\x3b\xe1\x6e\x14\x88\xa1\xf8\x0f\xc1\x35\x17\x18\x11\x7b\xda\x73\xd6\xc6\x1c\xf1\x84\xd0\x5f\xbd\xa8\x33\x0a\x41\xfb\x6d\x6f\x8a\x5a\x05\xfd\x64\xbb\xa0\x9f\x78\x42\xd0\xcf\xf2\x2d\xf9\x95\xaf\xd4\xe6\x5a\x3a\x55\x89\x4e\xbd\xb5\x75\x58\xa8\xdb\x3d\x5c\x66\xf8\x4e\x76\xf6\x11\xd8\x3e\xb9\x21\xda\xcf\x84\x0e\x60\x3b\xfc\xdc\x38\xee\x9a\x7f\x2e\x2d\x9e\x6a\xc7\x11\xc2\x76\x81\xad\x99\x0c\x13\xe4\x20\x2d\x7e\x6f\xdc\x2b\x7e\x35\x82\x28\x5c\x36\xe5\xc5\x1e\x42\x84\x77\xf2\x51\x15\x00\x78\x98\x78\x9a\xfe\xff\x99\x92\x60\xe2\x9b\xe8\xff\x1f\x95\x04\x13\xcf\xa7\xff\xc7\x11\x69\xf2\xfe\x13\x0b\xc3\x1e\x49\xe0\xe7\x48\x7e\xc9\x16\xc9\x2f\xf1\xdb\x24\xbf\x64\xbb\xe4\x97\xf8\x0d\x92\x5f\x72\x9f\xe4\x97\xf8\x2d\x92\x5f\xf2\x51\xc9\x2f\xf1\x0d\x92\x5f\xf2\x51\xc9\x2f\xf1\x2d\x41\x6c\xb0\xff\xae\x27\x17\x47\xa7\xf1\xf1\x1f\x68\x01\x3e\x61\xff\xbd\x7c\xf9\xea\xb4\x61\xff\xbd\x7a\xf3\xc3\xfe\xfb\x1e\x3f\xd7\xb7\xd3\x8f\xa3\xa1\x3b\xb9\x2e\x46\x37\xc3\x73\xac\x40\x62\x9b\xea\x53\x7f\x3c\x31\xff\x7d\x4a\x0c\xf1\xe6\xbe\xa4\x3f\x59\x8e\x13\x04\xe2\x38\x47\xf5\x7a\x57\xad\x8a\xdc\x9d\xbc\x17\xc6\x09\xc4\x73\xf3\xa0\x73\x3d\xb9\xe8\xd8\x40\xa6\xf2\x72\x16\xe6\x3c\x1f\x95\x77\x49\x4e\x84\x8c\x8e\xbd\x57\x75\x0e\x09\x77\xc0\x7e\xb8\x83\xbe\x81\x19\x19\x2a\xa8\x9a\x97\x40\x0b\x3a\x87\x7b\xb5\x41\x2d\xfb\x9f\x0f\x1e\xab\x31\x1c\x9d\xfe\x26\x6c\xa1\xe3\x78\x88\xe4\xf5\xe4\x82\x42\xa7\x82\xd0\x85\xdc\x23\x99\xc8\xbc\xc8\x3d\x20\x61\x88\x1e\x04\xc0\xe1\xd1\x43\xba\x08\x88\x4e\x1d\xb7\xa9\x48\xf2\x24\xdb\xfd\xc3\xd8\x15\x4a\x57\x11\x13\x50\xb2\xb5\xc0\xcc\xa6\xcc\x7a\x1a\xc9\x4d\xa9\x36\x80\xa5\xaa\x55\x81\x46\xc2\x67\x49\xad\x0f\xad\x9d\x4a\x10\x52\xf5\xa0\x6f\xde\x63\x08\xb1\xec\x20\xd5\x91\xb0\xf9\x22\x70\xed\xaf\x27\x17\x3f\xb5\x8c\x0e\xbc\x0c\xff\x46\x38\x6b\x5f\x0d\x16\x39\xb0\x22\xd1\x34\x33\x4e\x22\xa0\xdf\x87\xff\x3d\x83\xff\x7d\x09\xff\xfb\x0a\xfe\xf7\xf5\x23\x8b\xef\x17\x61\x0c\x0f\x2c\xde\x00\xfd\x30\x63\x78\x74\x20\x3c\x82\xd6\x24\x02\x22\x9f\xdd\x65\x41\x83\x0a\xf1\x0d\x9e\x58\x34\x18\x07\x54\x87\x71\xef\x21\x55\x15\x4f\x02\x78\x16\xe1\x3c\x48\x26\xa7\xc6\x02\x31\xe4\x89\xf1\x78\xc2\xb4\xa0\x56\xf9\xe0\xb9\x40\xfc\xeb\x81\xc1\xab\x10\x5e\x03\x83\xb0\xf6\x0a\x1b\xbc\x15\xcc\xc5\x0c\x86\xb2\xb5\x24\x31\x94\x03\xf1\xd1\xdc\xb5\x99\x22\xff\x8c\xec\x72\xf4\x62\x38\x2c\xc8\x39\x89\xcf\x97\xb3\x32\x55\x4b\xa9\xb7\xeb\xb5\xd9\x66\x5c\x73\x02\x40\x78\x6d\x99\xdf\xb0\x23\x04\xe5\x9d\x5c\x98\x4e\x53\x98\x99\x07\xde\x0f\x32\xdb\x76\x84\xfc\x1a\xb3\x44\xa7\x1a\xbf\x7f\xd5\xfd\xb5\x3f\x11\xc3\x51\x9d\x43\x4c\x06\x1c\x62\x51\x8b\xc1\x15\x1b\xeb\x0c\xae\xd7\x0b\xd9\xff\x6b\xf7\xea\xfa\xb2\x0f\xd6\x96\xb0\x96\x07\xc1\x3a\xec\x6b\x8c\x55\x64\x2c\x02\x0f\x4b\xd2\x20\x2f\xf3\xde\x0b\xc6\x42\xdd\x20\xab\x23\x3c\x86\xb7\x6d\x82\x4c\x3e\x68\x03\xaf\x7c\x41\x87\x35\x64\xe9\x4d\x0b\x19\xe5\xd1\xe0\xca\xc2\x2a\x53\xb4\x5e\x4d\xd3\xd1\x82\x33\x5f\x09\x12\xf8\x74\x8c\xf7\x19\x4e\x82\x85\xb7\x37\x13\xd0\x7a\xbd\x90\xf4\x3a\x6a\xa3\x68\x35\xeb\x1e\xd3\x78\x02\x0b\xac\x3b\x91\x5d\x92\x75\x02\xe3\x94\x79\xcd\x22\xe1\x73\x9a\x45\x41\xde\x1e\x49\xd0\xe8\xfd\x16\xec\xe2\xa1\x44\x08\xaf\xf2\x2c\xab\x87\x3e\x8b\xc0\xa9\x69\xeb\x31\x8d\x29\xb4\x20\x77\xea\x65\xe5\x31\x0f\x6f\x3d\x2f\x8e\x25\x17\x4b\xb8\x3d\xda\x2e\x04\xc4\xaf\xec\xab\x0d\x6b\x21\xb3\xa2\x98\xb5\x57\xaf\x02\x15\x99\x84\x16\x5b\xa5\x1b\xf3\xb6\xe4\x4e\xe5\x73\x73\x90\x27\x65\x45\xdc\xcb\x90\x4d\xfc\x5b\x91\xe6\x95\x34\xe7\xcc\xb6\x54\xf6\x16\x36\xd3\x6e\x5a\x65\x4f\xa5\xa0\xef\xc2\x35\x82\xa1\xbb\x98\x82\xf4\x05\xe2\x08\x83\x67\x9e\x64\x13\xe1\x98\x63\x35\xff\x85\x5e\x1a\xb0\xf7\xd8\xbf\x4a\x6d\xcb\xaa\x1e\xf1\xd0\x8a\x12\x12\xa9\xe0\xa7\x83\x17\x85\x2d\x04\xe4\x1e\xe4\x92\x56\x69\x89\x05\x03\x3b\x04\xbb\xbc\x47\x64\x2b\xd4\xbf\xa5\xb9\xae\x92\x2c\x23\xa5\xb8\x9a\x15\x40\x07\x48\xe4\x5d\xb2\xf6\xd4\x9a\x29\x61\x43\xd1\xdf\x7e\x93\xff\x8f\x1a\x18\x8e\x5f\xf4\xca\x42\xeb\x87\xa2\x5c\xfc\x49\xfc\x2f\xc7\xc7\x6f\x5e\x1e\xd7\xec\xff\xb3\xd7\x27\x67\x3f\xec\xff\xef\xf1\xe3\x19\x57\xbd\x43\x79\xf2\xf6\xed\xab\xa3\xd3\xe3\xe3\xb7\xf2\x83\x2a\x17\x72\xa8\xb6\x77\x6a\x96\x6c\x55\x29\xc4\xfc\x61\xb3\xfd\xc7\x3f\x32\x15\x2f\xaa\xaf\x75\xe6\x2b\x0a\x5b\xad\x8a\x8d\x62\x74\xbe\x2d\xfa\xdb\x6a\xb5\xdc\x66\x11\x54\x44\x11\x60\xd2\xa7\xe1\xbc\x85\xf4\x5e\x62\x53\xb7\xf6\xb1\xa8\xaa\xa1\x36\x18\x21\x42\xc4\x00\xe6\x3a\x9d\x9a\x16\x83\x52\x6c\x2e\x9c\x4e\x14\x3c\x0b\x90\x6a\x79\x09\xac\x02\xa4\x2d\x42\x08\x0e\x6d\x2d\xa8\x74\xbe\xcd\x12\x0b\x1e\x36\x07\x10\xc9\x96\x02\x34\xdb\xc6\x81\x57\x4a\xea\x64\x67\xfc\x0b\x2f\x1d\x18\x0b\x11\x0b\xd1\xbf\x57\x25\x34\xc6\xd3\xfb\x0a\xcf\x50\x5f\xf5\xb5\xa9\xd3\xe5\x8f\x6b\x24\xbc\xa2\xc4\x54\x37\x85\x49\x80\x53\x85\xcc\x56\xcb\xcd\x1b\x56\x7c\x92\xb4\x05\xea\x9b\x3c\x7d\x6a\xc5\x2f\xc6\x93\xee\xd1\xd5\xf9\x9f\xa8\xff\x7c\xf2\xea\x65\x33\xff\xf3\xea\x07\xff\xd3\x77\xf9\x69\xec\xff\x93\xa3\xd3\x48\x8e\x27\x5d\x79\x9e\x54\x89\x9c\xa8\xf9\xb6\x04\x3a\x20\xa0\xd2\xee\x81\x75\xb2\x80\xcf\xed\x4b\xec\x5c\x3a\x6f\x15\xca\x51\x58\x94\xb9\xaa\x4b\xf9\xd9\xdd\x12\x14\xe2\xa6\xa8\xd0\xc3\x05\x2f\x80\x52\x32\x7b\xbc\xb3\xaf\x4d\x57\xe7\xaf\xe4\x95\xd2\x3a\xb9\x53\x47\xe7\xe9\x9d\xd2\x95\xec\x66\x77\x45\x99\x56\xab\x75\x87\xf5\x8a\xd9\x78\x13\xe6\x2e\x4f\x0b\x16\x9a\x85\x20\xb7\xca\xe7\x36\x0f\xe5\x4b\x04\x63\x62\x6a\x9b\xcf\x29\x18\xe0\x01\x3a\x40\x12\xd7\xd3\xf0\xc0\x7a\x4d\xea\x68\x43\x03\x39\xec\xa0\x71\x97\x04\x9d\x32\x66\x20\x6c\x4f\x8d\x2b\xd6\xe1\xec\x8a\x2d\xea\x7a\x7e\xb7\xc5\xfe\x6e\xcb\xc7\xba\xad\x82\x94\x4e\x2c\xc4\xbe\x57\x5a\x20\x55\x1d\x29\x30\x2f\xf2\x39\x51\x0e\x12\x83\x21\x64\xde\x55\x69\x3c\x3f\xae\x54\x17\x6d\x32\xcc\x88\xe6\xb2\xac\x53\x4d\xd1\xc1\xa5\xe7\xee\x86\x87\x75\x2c\x06\x55\x9d\x64\x4a\xa6\xba\x63\xa3\xfc\x8f\x88\x41\x72\x5e\xeb\x4b\x9a\x2f\x90\x0d\x4c\x2b\x9b\x3a\x62\x4d\x3d\x3f\x22\x10\x32\x69\x87\xc5\x6b\x50\xfe\xe6\xc5\x8d\x04\x85\x60\x9c\x8c\xde\x9f\xbd\xc9\x1f\xf9\x89\x5f\x4c\xaf\x92\x4a\xfd\x99\xf9\xff\x97\x6f\x4e\xcf\x1a\xfa\xff\x3f\xf8\xff\xbe\xcf\xcf\x74\xa5\x24\xac\x00\x24\xfe\x0b\x69\x60\xc9\x67\xcc\xbc\xaa\x3d\xc2\x84\x99\xc3\x65\xe3\xa9\xfd\xc3\x23\xc4\xe4\xd3\xf0\xd7\xb4\x92\x59\x3a\x2b\x93\x72\x17\x11\x8b\x0f\x82\x8f\x2a\x40\x82\x95\xb9\x71\xae\x8f\xd6\x49\x9a\xd3\xe6\xc2\x0f\x9b\xc7\x1e\xa8\xf8\x2e\x96\x1f\x92\x7c\xb7\x56\x0b\x31\x99\x7c\xe4\x07\x1d\xc6\x02\xe2\x76\xd5\x4a\xb5\xf0\xf8\x90\xf0\xd8\x3c\x4b\xb4\x06\xce\x22\xb9\x49\xe6\x5f\x92\x3b\x73\xbe\xdc\xc5\x55\x7a\x57\xa6\x3a\xd6\xdb\x19\x85\xec\xe2\xbf\x25\xf7\xc9\x2a\x13\x54\x90\x3d\xb9\xcf\x7b\x59\x4a\xf8\x6d\x8d\x47\xf2\xbc\xb8\x57\xa5\x07\x43\xe4\x73\x3f\x97\x7f\xe9\x7e\xea\x7e\xbc\x3c\xe2\xf0\x37\xd0\x40\xd8\x1b\x54\x50\x78\xf2\xe5\xd1\xe9\xf1\xc9\x29\x8d\xaa\xd3\xbf\x69\xbf\x2d\x6b\x79\x65\xbe\x43\x82\xb4\x7a\x90\x53\x8f\x88\xd0\xa1\xb4\xe7\x9c\x6f\xff\x45\xc2\x74\xc0\xe5\xdc\xeb\xba\xfe\x7e\x26\xd7\x73\x7b\x01\x80\xae\xaa\x77\x42\xfc\x2f\xb5\x4c\xb7\x7e\x2a\xf5\x8e\x78\xf2\xba\xa5\x4a\xd9\xee\x2c\xd5\x15\x06\x75\xdd\xab\x28\xea\xef\xda\xe1\x2a\x1a\xe3\xb6\xf7\x3f\x9d\x6a\xdf\xd3\x04\x41\x98\xd7\x6f\x6a\x42\x6b\x0a\x5e\xb4\xa7\xe0\xe5\x13\x29\xf8\x3d\xbd\xb1\x9c\x17\x7c\xd1\x30\x0b\x22\xd1\x30\xa4\x5e\xc2\xbc\xc8\x25\x50\xa0\x15\x02\x31\x27\x58\x22\xa1\xaa\x70\x23\x30\xf9\x8d\x0e\x44\xb7\xb6\x66\x3b\xd0\x96\x64\x5f\xc1\x27\x5c\x14\x2d\x1f\x7f\xf4\x29\x98\x9c\x6f\x2c\x06\xbc\xf2\xc5\xac\x29\x99\x18\x42\x38\x4a\xe8\xab\x0d\xed\x2e\x41\xf5\x47\xae\x0b\x7c\x13\x03\x39\x34\x20\xf3\x82\x6f\x6e\xb2\xad\x86\x6c\xc9\x1a\x68\x02\x96\x4a\x79\xc2\xb6\x33\x45\x3a\xc7\xbe\x5b\xe5\xc0\xb5\xc2\xab\xc5\xf2\x02\x74\x80\x8e\x48\x72\x8f\x26\x8d\xe0\x20\xad\xe3\x0b\x0c\x67\xa2\x7e\xfc\x80\x69\x62\x8c\x2c\xa2\xd2\x48\x2b\x2e\x37\xd5\xb1\x1c\x78\x81\x35\x8e\x97\x7b\x5f\x06\xb9\x2c\xfe\xa2\xf1\x52\xa1\x2a\x17\x37\xe9\x6e\x43\x21\x48\x3b\x59\x68\x4e\x25\x7f\x03\x20\xe9\x7a\x53\xe4\x50\x3f\x82\xd1\x75\x51\x6c\x40\x82\x2b\xbf\x93\x7a\xa7\x2b\xb5\x36\x6b\xc6\xd1\xa7\xd5\x3a\x28\xcb\x2d\x84\x27\xeb\x0b\x33\x58\x97\x7c\xb0\x78\x03\x8a\x25\xf6\x61\xdf\x79\x9d\x88\xc6\x6a\x33\x56\x19\xd2\xc6\x50\x61\x3c\xb0\xe3\x40\x9e\xa0\xac\xbd\x16\xa8\x26\xb2\x74\x5e\xa1\x30\x1f\x1e\x5b\x62\xb6\x6b\x1c\x9f\xd7\x44\x46\x00\x43\x3c\xaf\x6a\x7f\x97\x60\x58\x6f\xcc\x95\xf4\xbf\xea\xfb\xfc\x4b\x5a\xc5\x73\x63\x40\x17\xe2\x4e\x55\x04\x35\xb6\x4e\xb9\xb1\xf8\x1e\x83\x6b\x4c\xaf\xba\x53\x4f\x61\xe3\xbf\xff\x77\x48\x39\xfc\xf4\xd3\x23\xc8\x0d\xf1\x3c\xe4\x86\xfc\x26\xe4\x46\x24\x9e\x55\x08\xda\xd4\x2e\xa9\x81\x39\x84\x68\xa2\x39\x6a\x7d\xdc\x0b\xeb\x90\xad\xb0\x0e\xf1\x5b\x61\x1d\x6d\x03\x22\x7e\x33\xac\x43\x36\x60\x1d\xe2\xb7\xc3\x3a\x64\x2b\xac\x43\xfc\x33\xb0\x8e\x20\xa9\x71\x28\xfe\x09\x58\x47\xad\x36\x51\xec\x87\x75\x7c\xa3\xb7\x11\xbf\xe8\x0d\xc7\x83\x23\x4a\xc9\xfd\x31\x5e\xc0\x13\xf6\xff\xeb\x97\xaf\xeb\xf1\x9f\xb3\xd7\xaf\x4e\x7f\xd8\xff\xdf\xe3\xc7\xcc\xbe\x04\x7a\xdf\xc9\xe8\x66\xdc\xeb\x37\xa1\x1d\x42\x0c\xae\xae\x47\xe3\x69\x77\x38\x7d\x27\xaf\x2f\xfb\xdd\x49\x5f\x8e\xfb\xdd\x73\x54\x84\x19\x5d\x5e\x8e\x3e\x03\xb3\xae\x85\x82\xf4\xba\xe3\xfe\xc5\xcd\xe5\xe5\x2d\xb2\xef\xf6\x2e\x07\xbd\x5f\xa1\x88\x77\x28\x3b\xc8\x46\xdb\x91\x44\x3a\x30\x3c\x1f\xf4\xba\x53\x26\x26\x86\xdd\x44\xd4\xc1\x70\x58\x0c\x86\x93\x69\xf7\xf2\x12\x55\x90\x44\x7b\x7a\x50\x9e\xc4\xaf\x23\x39\x53\x55\x22\x4f\xbc\x7d\xc3\x42\x4c\xe7\xa6\x51\xe6\x98\x91\x1f\xbb\x9f\xa8\x57\xe7\xac\x38\xd4\x86\x16\x6e\xd4\x19\xdb\x8e\xc5\xdf\x80\x7f\xe9\x51\xda\x1e\xc4\x7f\x8b\x52\x0e\x13\xaa\x7a\x18\x93\x90\x85\x18\xe4\x69\x95\xa2\x5c\x18\x70\x3c\x21\xae\x45\x52\x49\x53\x52\xc9\x93\x9f\xdf\xbe\x92\xd7\xa5\xd2\x55\x91\xcb\xcf\xab\xb4\x52\xf2\xbc\x04\xa0\xc8\x18\x7e\x17\xc9\x4f\x5d\x79\x7a\x7c\xf2\xf6\x44\x1c\x74\xcc\x34\x02\xba\xf8\xf7\xc1\xd4\x08\x3f\x9b\x16\x8c\xb0\x27\x9f\xfc\x6c\x58\x8d\xa8\x49\x7d\x27\x9a\xeb\x3a\x17\x92\xbc\x92\x87\x87\x87\x78\x83\x67\x50\x51\xde\xc9\x41\x6e\x5c\x45\x73\x73\x9b\x6e\x17\xb9\xec\x6e\xef\x8c\xb1\xf7\x32\x12\xa7\xc7\xc7\xc7\x16\xde\x63\x9a\x36\x3b\x01\xe2\xeb\x7f\x1e\xaa\x03\x5b\xe1\x31\xac\xce\xd1\x7f\x18\xb0\x0e\x0c\xcb\x73\x20\x3b\xa2\x51\x03\x4b\x90\x1d\x33\x18\x6d\x29\x6b\x28\x5d\x6d\x20\x65\xe0\x7d\x91\x78\xfa\x85\x72\x0f\x60\xa6\x9b\x41\x6c\xa0\x02\x8e\xe8\x34\x97\x59\xaa\xa0\xd2\x7d\x4f\x33\xbc\x04\xef\x3a\x01\x6e\x3b\xaa\xa1\x02\x8b\xd8\xf9\x75\x95\xfa\x5a\xc9\x83\xc2\x58\x95\x1c\xeb\xfc\xfb\xb6\xa8\x94\x3e\x7c\x27\x3b\xcd\xd5\x1d\x21\x14\xc5\x97\x99\x17\xcf\x10\xb8\x36\x0d\xde\xd3\x50\x3a\x2f\xec\x7f\x0b\xa2\xa6\x86\xaa\x43\x84\xf9\xe0\x76\xa5\xf5\xbe\xb5\x5c\x89\xae\x13\xdb\x3c\xfd\xfb\x16\xd9\x4e\x99\x4f\xc7\x06\x8d\x4b\x71\xf0\x25\x07\xf6\x50\xe3\x21\xad\x92\x7c\x91\xa9\xc3\x77\x70\x76\xc4\xa7\xa7\x2f\x4e\x8e\x4f\x4e\xea\x4d\xc0\x42\xab\x4c\x43\xcd\x5a\x50\xc9\x20\x80\xb2\xec\xeb\x0e\x93\x64\xe5\x23\x8d\xbb\x19\x5f\xbe\x23\x65\x9e\xd5\x22\x8b\xf1\xbd\x71\xae\xaa\x17\xfe\x9b\x3b\x7f\x30\x12\x0a\x57\xf9\xef\x85\x87\x42\xac\x3c\x90\xa3\xfe\x26\x4c\x14\xa6\xdc\x98\x7e\xd4\x81\xa2\x2a\x00\xb4\x03\x36\x83\xf0\x50\x61\xc2\x2e\x44\x45\x61\xa7\x10\x1b\x05\x07\x52\x03\x1c\x45\x7b\xfb\xd9\x10\x29\x01\x8f\xb1\xe0\xa5\x7f\x06\x23\x25\x7c\x8c\x94\xac\x63\xa4\xc2\xf7\x3c\x05\x92\xf2\x04\x1e\x6f\xdb\x50\xeb\xdf\x04\x92\x12\x9e\x01\xed\xcc\x82\xd9\xc9\x37\x42\xa5\xa0\x07\xbf\x0d\x2b\xe5\x6b\x32\x0a\x6e\xf0\x3f\x8d\x98\xda\x27\x08\x19\xc8\x41\xfa\x1d\x7e\x0c\x2c\x25\xda\x7d\x89\x7f\x1f\x60\xa9\x3d\xef\x7a\xb6\xdc\x5f\x96\x71\xa9\xaa\x16\xae\x7c\xbc\xa1\xf6\xf7\x29\x2d\xef\xd2\x9a\xd6\xdf\xbc\xc8\x97\x59\x8a\xec\x02\xe6\x3b\xae\x30\x35\x16\x7f\x2e\x86\x0b\xd6\xe3\xef\x03\xe2\x82\x47\xfd\xf9\x28\xae\x2c\x9d\xc3\x59\x46\x57\x8b\xf5\x07\x66\xdb\xaa\x82\xb8\x95\xf2\xe1\x0b\x11\xa9\x01\xb4\x80\xbf\xc4\x5e\xf0\x17\x6f\x84\x56\x08\x98\x6c\x42\xc0\xc4\xf3\x21\x60\x02\x9b\xfb\xef\x39\x9f\xf7\xad\x3f\xf1\x8b\xd1\xf9\x0c\xf4\xbf\xfe\xb8\x14\xe0\xe3\xfe\xff\xeb\xe3\x57\xaf\x1b\xf5\x1f\x6f\x4e\x7e\xf8\xff\xdf\xe5\x67\x74\xde\xc3\xcc\xdf\x79\x52\x25\xc6\xe0\x72\x64\x36\x66\x61\x1c\x4a\x5f\xf5\x4b\x3d\xfe\x51\x20\xbd\xb5\xc9\x42\xe7\x32\x34\x24\xbf\xb6\x9a\x4a\x0b\x29\x72\x0f\x32\x8e\x0c\x91\x8a\x42\xc4\x88\x7d\xd9\xc3\x2a\xcd\x50\xb4\x8b\x19\x1d\x21\xc5\xa4\xcd\xf9\x65\x9e\xb3\x28\xd6\xe0\x6a\x23\xae\x3d\x96\x57\x48\xbd\x82\xdf\x6e\x24\xf6\xbc\x32\x03\xf2\x99\x81\xc0\x42\x89\x20\x9f\xef\x51\x5b\x01\x44\xa0\x24\xd9\x87\x49\xb1\x56\xd2\x17\x1f\xd5\x11\xb4\x2c\xdb\x71\xea\xa3\xbf\x2d\x8b\x8d\x4a\x72\x71\x93\x83\xcf\x0b\xbc\x36\xb6\xee\x90\xf2\x80\x44\xab\x69\x6c\x6d\xdb\x50\x6c\x8f\x46\x7b\xd4\x8c\xab\x4c\x16\x8b\x52\x69\x8d\x32\xef\xb6\x11\x91\xac\x8a\x22\x96\x17\x29\x64\x54\x23\xf7\x71\x86\xa7\x24\x79\x30\x07\xc8\x1b\x95\xcc\xa1\x76\x9a\x66\x80\x8f\x3a\x3b\xc6\x66\x86\xe6\xf8\x69\x14\x10\x95\x0f\xc9\x0e\xfc\x9b\x52\x55\xdb\x12\x63\x19\x2e\x66\x00\x13\xc0\x5f\x8e\x85\xfd\x27\x0a\x96\x51\x32\x44\x26\x12\x1c\xe3\xfb\xa4\x4c\x15\x41\x3c\x76\x1b\xbc\x34\xcc\x47\x4c\xf3\x0e\x52\x62\xd9\x4b\xb6\x8b\xd4\xdc\xbe\xdb\x24\x13\x6c\x43\xf0\x88\x6c\x81\xe0\x2a\xcb\x78\x88\x61\xe6\x79\xdc\x22\x68\x9a\xfa\x9a\xac\x37\x99\x3a\x6c\x0c\xa2\x80\x34\x04\x4b\xd5\x79\x9c\x6c\xc5\x3d\xa1\x55\xce\xed\x83\x90\x32\xa4\xa2\x7c\x14\x34\xd0\xd2\xd0\xf0\xa7\x84\xa3\x93\xc9\x76\xb1\x55\xfe\xd7\x52\xaf\x8a\x6d\xb6\xb0\xdc\xa5\x30\x23\x55\x71\x87\xf8\x43\x24\x06\xcd\x43\x7a\x28\x4e\xde\xf1\xab\x22\xa6\xaf\xb1\xef\x26\x75\x77\x33\xe4\x99\x82\xf2\xf7\x62\x19\x2c\xa1\x2d\xf2\x05\x67\x3b\x01\x8b\x09\x47\xa9\x08\x9f\x02\x4c\x35\xcd\xc7\xae\xb7\x59\x95\x6e\xf0\xb1\xd0\x4b\x5b\xf0\x2e\x78\x9d\x35\x3a\xc7\xf2\x4c\x40\x68\x64\xc9\xed\x60\x6c\xf1\x57\xf6\x15\xdc\x73\x56\xd4\xf0\x64\x5a\x4a\x35\x2f\xca\x05\x05\x0b\xb4\xd9\x4f\x38\x2c\xa0\xdb\x00\x0f\xc9\x92\xd2\xb8\xb8\x3a\x78\x0d\xd4\xe7\xc7\x42\x98\x1d\x58\xa5\x6b\x4a\x59\xfa\xd3\x94\x78\x6b\x82\x45\x41\x78\x7d\x33\x27\x34\x69\xe4\xd1\x79\x60\x0c\x46\x7c\x39\xbd\x04\x78\x77\x68\xd7\xa1\x07\x28\x0f\x50\x02\xc3\x38\x86\xc6\x85\x54\x76\x3b\x69\x62\x89\x93\xc6\x72\x12\x76\x39\x19\xb3\x2a\x42\xbb\x29\xbd\x4f\xe6\x56\xe3\xe5\x05\x0a\xdf\x6c\xca\xa2\x22\xce\x29\x7f\x21\x7a\xa9\x5f\x61\x4b\xdb\xb1\x6b\x6e\x4d\x03\x4b\x42\xa9\x64\xb2\xb8\x4f\x35\xa7\xf6\x59\x6c\x00\x69\xf9\x0a\x80\xc4\x6e\xb3\x0a\xfb\x65\x03\x70\x60\xb5\xcd\x33\x95\x94\x61\x87\x67\x70\xf6\xc9\x45\x01\x91\xc0\x79\x95\xde\x23\x3f\x9f\x19\x88\x00\x0d\xe1\x2a\xd8\x63\x21\x8e\xe0\x07\x2f\x06\x5e\x24\xf2\x20\xd1\x72\xa1\x96\x28\xd5\xa4\xb2\xe2\xe1\x50\x08\x10\x2a\xbc\x2d\xb6\xed\x7f\x04\xc2\x87\x44\x53\xc4\x43\xbf\x23\x6d\xb1\x63\x5f\x5c\x0c\xf5\xa7\x37\x69\x95\x64\xd0\xe7\xcf\x45\xb9\xd0\x42\x74\x7a\x56\x5c\xcc\x6e\xcd\x8e\x3c\x92\x57\x24\x49\xe5\x9f\x6d\x69\x2e\xb7\xb9\xa5\x88\xc1\xf0\x9b\x93\x8e\x4c\x6a\xca\x47\x69\xbe\x50\x1b\x73\x6d\x19\xe3\xda\x1e\x6b\x38\x27\x6b\xad\xb2\x7b\x9b\xae\xe5\xcd\x0d\x53\xa2\xb5\x32\x97\xe5\x42\x80\x78\x42\xe2\x89\x9f\xc9\x87\x55\x91\xa9\x58\x76\xbd\x18\x87\xcf\xfd\x93\xc8\x96\xbe\x38\xba\xc5\x50\x4c\x21\x90\x33\xf1\x0e\xe0\x4e\xaf\xc8\xef\xd5\xce\x0c\x41\xd7\x3c\xf2\x5e\x95\xb3\x88\x04\xba\x6e\x6c\xf4\xc6\x3b\xea\xda\x9e\x03\xca\x54\xfe\xe7\x64\x20\x0c\xd2\xd6\x4c\x5f\x73\xc5\x74\x4c\x41\xc2\xdd\xb4\xe0\x5a\x95\x1a\x19\xc8\x20\x0a\x53\x94\xcc\x40\xe9\xc1\xe9\x82\x77\x99\x0b\xa6\xb5\x77\x12\xfb\x66\x6c\xff\x46\x66\x1d\xbc\xc1\xc4\xe3\x70\x43\xc9\x37\x59\xad\x40\xf6\x1c\x26\x82\xb4\xb1\x73\xa4\x25\x80\xbd\x09\x8e\x9a\x79\xa0\xd9\x59\x38\x3e\x89\xbc\xc6\x98\xed\x82\x64\x62\xd0\x25\xc9\x0b\xa7\xb0\x00\xa3\xe0\x33\xad\x7b\x6d\x17\xad\x6d\x97\xc5\x7c\xbe\x2d\x35\x4d\x10\x6c\x67\x33\x45\xd3\xc6\x05\xe3\xad\x57\x46\x4f\x51\x17\x59\xaa\xce\x9e\x0f\x91\xf0\x97\x28\x06\x87\x65\x03\xa3\xc2\x0b\xd0\x97\xf3\x70\x23\x7a\xe1\xae\xcc\x48\x3c\x76\xdd\xc9\x39\x1c\xfc\x33\x25\x97\xc9\x1c\xf8\x94\xe0\x14\xb3\x70\x79\x3e\x1c\xe9\x1a\x17\xde\x35\x2e\xdd\x35\x5e\xa9\xaf\x28\x7e\x85\x77\xb9\x19\x0e\x7f\xd3\x76\x6b\x5b\xd0\xf6\xe1\x00\x33\x2a\x74\x0e\x4a\xc0\x70\xde\x91\xdf\x4f\xa0\x87\xa4\x4a\xe7\xc6\x25\x5c\xab\x6a\x55\x2c\x80\xbc\xdc\x2c\x46\x8c\x14\xb8\x9b\x9a\x6d\x97\x59\x06\x5c\x9b\x40\xf0\x58\x16\x79\x3a\xf7\x46\x0e\xb0\x1e\xc0\x30\xff\x34\x1d\xa3\xdf\x05\x79\x9e\x96\xb8\x2f\xdc\x09\x64\x7f\x25\xdf\xbe\x7e\xf1\xf6\x45\xbf\x67\xc9\xf9\xc9\x3c\x94\xd7\x49\x99\xa5\x09\x84\x86\x21\x9a\xef\x84\xf8\xe7\x29\xdc\xe1\x27\x27\xf2\x2a\x29\xe7\x2b\x79\xf2\xf6\xed\x6b\xf6\x9b\x91\x66\xd0\xbb\x44\xcc\xc5\x6d\x2d\x48\x91\x68\x69\x1e\xb9\x40\x79\x03\xbd\x9d\xcf\x95\x02\x81\x56\xaf\xb5\x50\x04\xeb\x5a\xea\x90\x69\x48\x4a\xec\x00\xc8\xbd\x55\xb2\x31\x1b\x67\x30\x18\xc8\x83\x8e\xde\xfe\x7f\xec\xbd\xeb\x72\xdb\xc8\x96\x26\xfa\x3f\x9f\x22\x43\x11\x3d\x16\xe7\x40\xb0\x2e\xbe\x54\xb9\xa6\xe7\x0c\x2d\xd1\x36\xa7\x25\x52\x4d\x52\xe5\xed\x33\x31\xd1\x03\x92\x49\x09\x5d\x20\xc0\x8d\x04\xa5\x52\x9f\x38\x4f\xb4\x1f\xa1\xff\xed\x27\x3b\x91\x6b\xad\xcc\x5c\x99\x00\x75\xb1\xab\x6a\xf7\xee\xb0\x22\x7a\x77\x59\x22\x81\xbc\xe7\xba\x7c\xeb\xfb\x72\xa4\x26\xcc\xf5\x5e\x8f\x4c\x04\x6b\x90\xb5\x47\x02\x0e\x7c\xdb\x14\x14\xea\xc0\x7d\xb4\xa9\x48\x9b\x71\xad\xd6\x73\x55\x23\x0f\xa5\xee\x81\xf6\x5b\xbc\xe8\x07\xbf\x36\x76\x6f\x23\x73\xcd\xc1\xb6\xc9\x8b\x5c\x07\x7c\x80\x70\xba\xe2\xe1\x31\xdd\xce\x75\x93\x01\x2f\xa2\xe0\x12\x13\xa7\xce\xc0\xca\xb4\xbc\x53\x45\x01\x41\xf3\xf2\x5e\xea\x7c\x9d\x17\x99\xbb\x0c\x7d\x68\x95\xfa\x55\xab\x42\xdd\x66\x65\x23\xb8\xc5\x4f\x4b\xc3\x6a\xa7\x1c\x1d\xa6\xaf\x60\x7c\xdb\xbb\xdf\x0f\xb2\x37\x4d\x62\x19\xc8\xd0\xfa\xb4\xdd\x47\x4a\x7e\x33\x5e\x85\x4d\x9d\x2d\xb3\x8d\x4b\xa3\xe1\x3e\xc0\x7c\x48\x00\x02\x0c\x59\x6a\x41\x02\x21\xe0\x38\xe4\x87\x2d\x9c\x66\x6c\xc8\x64\xd7\x90\x51\xdc\xc9\xb6\x0b\xaa\x79\x44\x8e\x67\xb0\x15\x83\x69\xaa\xc4\x4d\x15\xc2\xcc\xdd\x4c\xd9\x8b\xa7\x7b\x92\xe0\x8d\x22\x7a\x23\x6e\xee\x52\xdd\x05\xd7\x9b\x5f\x0a\xfc\x96\x47\xc0\x63\x56\x12\x3f\x6f\xa3\xd6\x9b\xaa\xce\xea\xfb\xf0\xc8\x2e\x8a\xa7\x2d\x0f\xac\x2f\x0a\x84\x29\x89\xbc\x0e\xef\x51\x9f\xde\x22\x2d\x69\x9b\x4f\x8d\x0c\x8f\xb6\x23\x0c\x53\xab\xe5\xbc\x82\x0b\xca\xfe\xdd\xdb\xf2\x50\x19\x90\xf1\xb2\x1f\xe0\xf2\x0f\x76\x2c\xe9\xdd\xec\xf0\xed\x7c\x6b\xaa\x3a\x1c\x21\xbc\x87\x5b\xb2\xa6\xee\xe1\xed\x83\x4e\xc4\x07\x1d\x3e\x82\xaf\x66\x48\x6b\x60\x8a\x99\x4e\x24\x7c\x0b\x8c\xf3\xbc\x5a\xc2\x0d\x89\xbf\x33\xbd\xa2\xfc\x8d\x08\xd3\x39\xf0\x68\x7e\xe7\x9a\x37\x90\x58\xaa\xb3\xba\xb3\x12\xef\x96\xc0\x43\xec\xb8\x5a\x04\x5e\x2d\xbd\xf8\x20\xdb\x3e\x65\x0d\xc6\x2b\x41\xec\xdf\xe6\x99\xb9\x62\x20\x63\xef\xaf\x88\x3f\x6f\x55\x7d\xdf\x93\x9e\x60\xe8\x69\x06\x15\x37\x46\x1f\xb3\xa8\x60\x50\x28\x1b\x6c\xc6\x83\x34\x56\x2b\x9a\x47\x4d\x2d\x01\xdc\x24\x71\xd1\xe2\x0c\x92\x5a\x1e\x2a\x75\x98\x2b\x0e\xc1\x99\x1e\x65\xf9\xfa\xf0\x1f\x50\xfa\x51\xdf\xe4\x1b\x8a\xaf\xc2\x16\xaa\xee\x50\x78\x64\x09\x87\xb7\x44\x6a\x6f\xe6\x0b\xd8\xb9\x10\x76\xb1\x59\xf2\x5a\x62\x57\x75\xb6\x08\xb9\x1e\x59\xd9\xf4\x4c\x37\xc2\xf3\xda\x77\xc6\xc1\x0d\xe1\xaa\x87\xa8\x70\x90\xd4\xe2\xf9\x38\xd8\xbb\xe2\xf1\x19\xb3\x9d\x89\xb9\xc3\xd0\xd6\x4c\xcc\x9f\x8d\x6b\x9b\x97\xd7\x09\x38\x7d\x65\x91\x63\xc2\x1a\x87\x13\x49\xcb\xcc\x33\xcd\xc1\xe1\xd1\x82\x7b\xec\xbd\x7e\xfd\x6b\xd6\x18\x73\x53\x58\x03\xe1\xcf\xdb\x0c\xf5\x47\x2b\xb3\x54\xb2\x82\xfe\x13\x6c\xd0\x39\x11\x91\x9b\xe3\xce\x9c\x03\x08\xa9\xad\xd5\x06\xeb\xaa\xc0\xc3\x73\x06\x0d\xbf\xf9\xf8\x71\x9a\x79\x27\x45\x47\x87\x99\x6e\x8d\x08\x64\x7b\xd7\xd5\xb6\x74\x29\xec\xc7\x9e\x9a\x89\x47\xaf\x03\x21\xf6\xae\xc8\x68\x8b\xdd\x0c\xf2\x21\x01\x6b\xdc\xb8\x54\xae\x55\xdf\x89\x82\x6f\x66\x56\xe3\xf3\xcd\x15\x6b\xe2\xcd\xe8\xd4\xc1\xe8\x2c\xe6\x57\xdb\x4f\xe1\x6d\xd9\x66\x52\x0e\x58\xc0\x13\x9f\x47\xb0\x40\x0b\x0b\xc4\x08\x7f\x49\x70\x0c\x58\x25\xe6\x05\x98\xaa\x06\x9c\x78\x5c\xda\x15\x5d\xa8\x81\x69\x81\xe1\xcc\xd8\xe9\x32\x07\x3c\x81\x00\x40\x6c\x87\x32\x68\x8e\x1f\xd7\x26\x6c\xf2\x06\xaf\x40\x4f\x40\xb8\x26\xbd\x32\x74\x01\xcc\x1c\x80\x0a\xae\x3f\x8e\xe9\x8c\x27\xcd\x22\x10\xa2\xd8\xa5\x6b\x2b\x51\x10\x00\x6f\xf0\x4d\xad\x6e\xf3\x6a\xab\x8b\x7b\x71\x9b\x57\x05\xac\xc4\x9d\x26\x6f\x27\x2d\x2c\x3f\xe9\xec\xa3\x85\x93\x1a\xb0\x85\x58\x2c\x2b\xe5\xac\x4b\x17\x37\xe0\x52\xac\xad\x66\xbb\xda\xbb\xa5\xd2\x9b\x1c\xf4\x3c\x6d\xa3\x25\x36\x19\x37\xaa\x94\x18\x19\x70\x21\xc2\xbc\xbc\x86\x9a\x31\xeb\x28\xc2\xa1\x52\xc0\xa5\x65\x66\xf6\x36\x5f\x20\x34\x25\xc3\x2f\x1f\xa7\x87\xf2\xb3\x53\x72\xf3\x14\xbd\xe6\x23\xf4\x81\xa3\x54\x9e\xc3\x5d\x47\xb4\xea\x71\x09\x58\x94\xca\xcc\x29\x9e\x21\xa5\xcc\x8c\xf3\xcf\x6e\xfd\x4e\xea\x7c\x08\x3e\xaa\xfc\xfa\x66\x5e\x6d\x6b\x3f\x85\x3f\xd9\x87\xcc\xa3\x87\x04\x97\x38\xec\x20\xd8\x14\xf6\xe3\x8b\x54\xf6\x77\xc5\x81\x6d\x96\xd1\xca\x3e\xf2\xe9\x00\x40\xd5\x31\xf5\x94\xa6\x83\x02\x41\x2d\xfe\xe2\x5b\x6b\x4c\x14\xfc\xd3\x91\x4f\xc0\x74\xa2\x51\x18\xd0\x95\xcd\x98\x16\x86\x47\x42\xd7\x00\xc4\xcf\x4b\xc9\x7b\xb6\xb5\x37\x8e\xf8\xd8\xb9\x0e\xe6\x94\x60\xf1\x46\x55\x90\xec\x42\x6b\xcb\xce\xb7\x2c\x7f\x0a\xdd\x11\x21\xa7\xa4\x0b\xea\x31\xe3\xd4\x5f\x77\xb1\xe3\x9e\xca\xa9\x52\xd6\x2f\x10\xc7\xe9\x2b\x88\x4c\x2f\x55\x93\xe5\x85\x66\xfd\x86\x5c\xf3\x2d\x96\x3e\xd9\xa9\x88\x52\x0a\xa6\x65\x60\x49\xfe\xa2\x0a\x20\xce\x86\xd6\xbd\x0b\x27\xdd\x1c\x0b\x60\x82\xe9\xc5\x8d\x5a\x67\x2e\x6e\x40\xc5\x1c\x4d\xbd\x5d\x34\xdb\x5a\x85\xfe\x02\x3a\x9b\x00\x0b\x0c\xfd\xa8\xd0\x11\x59\x18\x43\xb3\xd0\x55\xb0\x7f\x7c\xb6\x00\x82\x3c\xc8\xe3\x45\xfe\xd2\x52\xfd\xaa\xf4\x4f\x2e\xe8\x2a\x55\xd9\xd4\xe8\x86\x57\xdb\x66\xb3\x6d\xa4\xbe\x51\xaa\xd1\x3f\xb9\x05\xf7\x21\x57\xc5\x12\xa2\xa5\x60\x73\xba\x11\xd6\x4d\x55\xfb\x42\x12\xfb\xca\x9f\x80\x72\x3d\xba\x31\x5a\xbf\xc0\x9a\x03\x20\x1e\x5f\x76\x5c\x7a\x6d\x27\x52\x3c\xe8\x44\xee\xf0\x88\xe2\x97\xc2\x58\x6d\x36\xc5\xbd\x50\xb7\xaa\xc4\x92\x87\x06\xf3\xd9\x50\x34\xdb\xb1\x9e\xfc\x92\xe9\x7c\x58\xa1\x2b\x81\xfa\x60\xf6\x61\x7e\x05\x22\x65\xd5\xba\x0a\x6a\x85\xbd\x79\x69\x7c\x84\x5a\x49\xad\x28\xf8\x63\x8e\x84\x30\x6e\xe2\x62\x75\x77\x10\xda\xc1\x68\x1a\xca\x93\xe0\xed\xdd\x71\x3a\xd1\xd1\xb2\x80\x58\x1c\x3a\x1c\xe4\x18\xea\xd0\x25\x79\xe8\x68\x61\x39\x24\xd1\x8a\x48\x0d\x5d\xa6\x29\xe0\x02\xb6\xd9\xa8\x30\x4d\x0f\xfa\x48\x08\xcc\x10\x24\x4a\x97\x69\xb3\xd0\x0a\x0b\x4f\x8c\x5c\x18\x38\xc0\x4f\xec\x18\xb3\xe0\x76\x87\x76\x8f\x3b\x11\x9c\x42\x9b\x0b\x21\x5a\xc1\x64\xa4\x23\xa5\x25\x4a\x26\x6c\x55\xdb\x82\x9c\xf6\x9e\xc2\xd5\xdb\xfd\x16\xcc\x02\x22\x90\x8d\x42\x70\xad\x53\xa7\xaa\xa3\xc7\xd9\xd9\x78\xec\x91\x0c\xf7\xc1\xc8\xee\x5c\xd1\x1a\x73\x3a\xcc\x71\x35\x61\x98\x15\xd3\x6f\xee\x92\xb7\x8f\x60\x76\xc4\xe6\x8d\x5a\xbb\xb2\x24\xf7\x2d\x4a\x03\xb2\x09\xf1\x47\x17\xda\x41\x2c\xc3\xc0\xb3\x12\x4c\x24\x43\x74\x48\xc3\x46\x79\x94\xc4\x66\x5a\x30\xeb\x02\xa6\x10\xda\xde\xf6\x69\x56\x38\x45\x3c\x30\x52\x74\xd9\xec\x33\xf7\xaa\x75\xb8\xd4\xfc\x16\x05\xbd\x71\x36\x06\xbb\xba\xbd\x2b\xec\x2a\xf3\x15\x2e\xa3\xaa\x14\x19\x0b\xcc\xac\x28\x96\x1a\x05\x3f\x63\xe9\x4f\xb7\x77\xd9\x2a\xb5\x57\x22\x65\x94\xfc\xf4\x50\x8e\x15\xef\x07\x8c\xe8\x32\x15\xa7\xea\xae\x94\xda\x18\xba\x59\xe3\x35\x97\x30\xa4\x5c\x2a\x41\xc9\xc7\x82\xdf\xfa\x60\xe8\xfb\x4c\x63\x9c\x51\xc5\xf7\xe1\xb6\x3b\x49\x0f\xed\xf8\x11\x6d\x82\x10\x27\xe9\xd1\xd7\x29\x37\x07\xa7\x09\x22\xb5\x85\xd3\x6c\x66\x42\xcd\x21\x46\x3b\x02\x70\x13\x64\x0d\xc4\x99\xcd\x3d\xeb\x05\x5c\x85\x8d\xe9\xfd\xd8\xe3\x68\xee\x2b\x1d\x5d\x7f\x36\x71\xcb\x25\x91\xc2\x93\x53\x3c\x18\xc9\x81\xfd\xe3\xad\x5d\xac\x83\xcb\x1b\xc0\x10\xe0\x6d\xeb\x25\xd7\xc5\xd6\x5e\xc9\xcb\x8a\x8a\xa9\x49\x3c\xd6\x78\xd1\x70\x87\x56\x2b\x69\x2c\x92\xec\xb6\xda\xd6\xa9\x9c\x55\x54\xfe\x07\xf9\x75\x57\x8d\x97\x97\x82\x47\x34\x03\x83\x23\x09\x40\x0e\x76\x73\x5a\xa3\xdc\xc1\xec\x8c\x1f\x96\xc1\x45\x80\x8e\x88\xf7\xd8\xca\xea\x4e\x22\x1a\xd9\xe6\x56\xfc\xea\x5f\x6d\x8d\x11\x82\x8b\x61\xd6\x96\x44\x83\xf5\x14\xe4\xf0\xd1\x4a\xfc\x86\xd8\x2f\xbf\xb6\xdd\x69\xc4\xed\x68\x20\x33\xa1\xc7\x74\x44\x6d\xfc\x67\x17\xe1\x67\x3b\xc2\x35\xe6\xb3\xcb\xf0\x53\x3e\x0a\x89\xc7\x11\xc5\x27\x6d\x4d\x00\x2e\xed\x20\xb0\x88\xbe\x2c\x50\x2a\x9a\x91\x05\x1c\xbc\xeb\x1a\x94\xb5\xd7\x0d\x17\x0e\xa2\xe5\xd6\xd5\x74\x18\x0c\x90\xa0\xa6\xd0\x6a\x67\x9b\xf1\x36\x57\x40\x70\xed\xc2\x25\x49\x28\xbb\x91\x58\x6f\x38\x91\x85\x02\xdd\x90\xa4\x15\xad\xb1\x27\x2e\xac\x87\x72\x11\xa3\xa9\x77\x74\x52\x3e\xa5\x93\x62\x77\x27\x83\x3e\xee\x9a\x17\x7b\xfa\x1c\xcb\x53\x73\x7b\x17\xba\xaa\xef\xdd\xa6\x06\x83\x59\x69\x4f\x95\x9e\xdd\x56\xf9\x32\x23\xa1\x9f\x65\xb5\x9d\x37\xb8\x0a\x47\x55\x79\x70\x97\xe5\xb7\x64\x0d\xed\x7e\x10\x40\xdd\x2b\x1d\x61\x83\xb0\x8f\xf9\xe2\x46\x34\x81\xc0\x12\xb6\x97\x8e\x29\x20\x56\xb0\xe9\xca\xf2\x1e\x32\x22\xdb\xa6\xc2\xf5\xd3\x7a\x27\x94\x6f\xc3\x5b\xa5\xd7\xb5\x46\xc9\x9b\xe8\x7c\x0c\xc4\x9d\xdc\xf9\xd7\x6a\x05\xb2\x78\xfa\xa6\x58\xde\x15\xe7\x93\x7b\xf5\xc1\xa6\xbd\x7d\xdb\x01\x06\xb4\x75\x3e\xff\x06\x83\x06\xfb\xf7\xb7\x1a\x34\x7a\xab\x20\x00\x48\xe7\x88\xc1\x2f\x1f\x1b\x2f\x19\x8e\x97\xf8\xe6\xf1\x32\x3b\x23\x01\x6b\xee\xe7\xaa\xd8\x96\x4d\xd6\x35\x54\xb3\x1d\xed\xdc\x3d\x3c\x89\xf0\xf1\x34\x96\x07\xad\x6a\x27\x36\x80\x75\x19\x8e\x1f\xc2\x3d\x1e\xd0\x7c\x94\x9e\xa3\x94\x37\xee\x2f\x60\x0e\x58\x00\x96\x0b\x25\xb6\x97\xeb\xbc\xcc\x75\xa3\x6a\x2d\x6f\xa3\xb6\xfb\x21\xd7\x89\xbc\xcd\x33\xa2\x40\xc2\xaf\x27\x54\x75\xf2\x0d\xc3\x06\x15\x26\x27\xfe\x46\x89\x35\x03\xa3\xfc\x86\x0f\xa6\x81\xa5\x91\xec\x12\x0c\x84\x54\x72\x2b\x26\x1d\xb8\xc7\x39\xa3\xf1\x90\xa3\xaa\x51\x76\x08\x23\x03\x57\xcc\x3d\xc8\xea\xc0\x46\x29\x1c\x96\xe7\x4b\x00\xdb\x01\xae\xdc\x8a\x88\x90\x31\x65\x91\x51\x61\x54\x7e\xab\x84\x03\x23\xae\x2c\x3b\x15\x8b\x39\x78\x43\x8a\xa7\x24\x13\x34\xd0\x22\x70\x93\xa0\x88\x5c\x71\xef\x86\xd6\x95\x63\x55\x35\xf9\x96\x8e\xa2\x44\x4a\xf9\x2a\x3d\xe4\x22\x29\xd5\xca\x58\x43\x42\xbc\x4a\x8f\xba\x2e\xf3\xbc\x74\x6d\x38\x21\x72\x0e\xf3\x48\xff\x52\x28\x79\x61\x85\x55\x5f\xaa\x6d\x2d\x50\x3c\xdb\x25\x15\x9a\x5d\x5c\x25\xe8\xf8\x59\xe3\x09\x4a\x11\xcd\x4d\x6b\x6e\x7d\xf6\x31\xd1\xa9\x79\x96\xa3\xd2\xe7\x2a\xcb\x0b\x80\x9f\xc2\xf3\x01\xd2\x93\xc0\x1f\x2c\x69\x61\x5e\x3e\x58\xc1\x00\xe5\x39\xc7\x24\x95\xa1\x9d\x80\xa8\x4d\xd8\x10\x52\xa5\x95\x1b\xea\xbe\xc7\x00\x30\xff\x2c\xb8\x0d\x15\x23\x59\x41\x79\xbc\xa3\xce\x2a\xb3\x9e\xbc\x15\xfb\x40\x04\x17\x8e\xaa\x00\x84\xc8\xa8\x17\xc2\xb4\xf6\xab\xf4\x15\x9e\xe4\x43\x32\x49\x39\xf2\x25\x54\xbe\x84\xd8\xb7\xb7\x7d\x13\x96\xe2\x7c\xe0\xe9\x3d\xb8\xf7\x1b\x2d\xaf\x10\xc3\x28\x27\x8a\xca\x4a\x87\xae\xc6\x4d\xee\x5f\x4d\x86\xbd\xb6\xbf\x6a\x06\xae\x33\xdd\xe6\x6d\x24\xc8\xb5\xc6\xf0\x84\xee\xaf\x09\x66\x9a\x38\xfb\x38\xa8\x5c\xf5\xe1\x8f\x7f\xe2\x12\xfe\x71\xf4\x32\x34\xf3\xbd\x22\x0d\xc2\x4a\x23\xa9\x7f\x11\x49\xfd\xa3\x42\xdc\x70\x45\x3c\x78\x10\x9e\xb7\xc6\x7b\x53\xc9\x0d\xa9\x9a\x39\xf9\x50\xfb\x44\x88\xe9\x30\x92\xb4\x55\x5e\x28\xb1\xdc\xc2\x97\x72\x88\xa7\xb9\x38\x60\xb0\x78\x82\xc8\x5e\xf0\x30\xa7\xb8\xb8\x6f\xf3\xd2\x19\x1b\x17\x48\x12\x56\xf5\x7d\x8f\x00\x52\x08\x28\xbe\xb3\x30\x21\x0c\x59\x9a\x97\x17\x55\x45\xea\xfd\x0d\x6c\x9b\x13\xda\x36\xf0\x3b\x3c\xe3\x28\x34\xb8\xef\xbc\x5c\x6b\x49\x53\x59\x72\x27\x32\xcb\x83\xc0\x68\x2c\x58\x0f\xf8\x09\xf4\x2a\x3d\x4e\xe5\x27\x5b\xdb\x9a\xaf\x20\xb0\xe4\x76\xaa\x71\xea\x32\x11\x41\xbe\x5a\x63\x93\xd9\xe7\x76\x45\x4f\xc2\x56\x39\xba\x99\x7b\xb9\xc8\x0a\x33\x17\x21\x45\xe0\x7d\x90\x89\xdf\x6a\xbc\x17\xd5\x9d\x4e\x28\x26\xa6\x20\xee\x81\x70\x36\x4c\x69\x59\xc9\x58\x5f\xee\xa2\x7e\x45\xfc\x0c\xd9\xd9\x41\x0b\x64\xe6\xb9\x7b\x68\x40\xe5\x5d\xa6\x45\xa8\x59\x15\xde\x65\x3b\x72\xd6\xbb\x4e\x25\xb1\xe3\x54\xc2\x00\x8b\xe3\x70\xf4\x37\x67\xe7\xbd\x0d\xde\x1d\xb8\x7a\x34\xba\x68\xde\x44\xc5\xbb\xa8\xe6\x9c\x35\xb9\x5e\xdd\xdb\x59\x88\x0f\x91\x93\x77\x02\x1c\xbc\x2c\x07\xb3\xd1\xb3\x27\x41\x57\xcf\xfa\xb3\xfe\xfb\xfe\x74\x20\x47\xfd\x8b\x01\x8b\x8e\x87\x75\xbe\x88\xf2\x45\xff\xbf\x79\xa4\xd0\x21\x15\x22\x78\xa8\xc5\x45\x03\x67\x20\xa8\x86\xb2\xe5\x61\xb5\x8c\xda\xf1\x59\x79\x73\xbf\x51\x75\x91\x97\xbf\x58\x87\xe9\x6a\x32\x8c\x3f\x9a\xca\xbd\xce\xa6\xec\xd9\x97\x7a\x94\xfd\x43\x8f\x83\xb1\x6c\xab\x85\xaf\xfc\x97\xb4\xe3\x69\xb3\xe7\x0d\x6c\x04\x41\xaf\x09\x13\x68\x40\xfe\xe5\x1e\xc9\x8e\xa3\xab\xc9\xf0\x85\xf6\x9d\xc7\xcb\x9f\xa6\x97\x2c\x89\x57\x72\x7a\x03\x58\x59\x73\x46\xe0\x3a\xe8\xef\xf0\xf0\x60\x31\x7d\x89\xf7\xab\xa5\x7d\xea\xba\xeb\x44\xb5\x72\xf9\x36\x29\x65\x1e\xc6\x46\x7f\x12\x22\xcf\x21\x81\x66\x2e\x77\x57\x93\xde\x92\x12\x25\x3c\x58\x5e\x4a\xbd\xc9\xeb\xbc\x91\xd1\x21\xfd\x93\xac\x6a\xfe\x16\x7c\x28\x90\x35\x35\x70\x52\x17\x6e\x95\x93\x69\xe0\xe2\x48\x66\x6a\x3b\x7a\x8a\xdd\x80\xea\x79\xd2\xbb\xb5\xb6\x1e\x31\x77\x02\xa4\x58\xee\xe7\x79\xde\x63\x07\x14\xda\x4c\x7e\xbc\xd9\x7d\x9f\x35\xac\x15\xf3\x87\x7c\xdc\xe4\x51\x44\x00\x0f\xb2\x3c\x05\x85\x41\xe0\xe7\x52\xdd\x31\xe8\xbd\xee\x06\xc7\x08\xc7\xe4\xc5\x3b\xc3\x2c\x04\xd4\x80\xed\x8c\x72\x80\x7e\x08\x3f\xfc\xb4\x99\x87\xae\xf1\xcd\xb5\x5b\x43\xe2\x4a\x5b\xa4\x45\xf5\xf0\x8b\xcd\x6d\x11\xdd\x3a\x2e\xac\x05\x9e\xcb\xae\xd9\x64\x6f\x33\x2b\x76\x89\x97\x3a\x2e\xfb\xbe\x59\xf6\x78\x00\x78\x2d\x54\x9f\x55\x7a\x68\x9a\xec\xb4\x0b\xaa\x4f\x08\x20\x6b\x9d\x03\xd4\x32\xb7\x24\x79\x60\xc8\xe0\xe1\x57\xac\x70\x4b\xe8\x29\x2e\x17\x80\xb1\xe3\xc5\xae\x79\x19\x0c\xa0\x4e\x80\xd4\xdb\xdc\x57\x96\x57\xa0\xa9\xe4\x52\x61\xe0\x55\xb1\xed\xe2\x1d\x9b\xae\xf6\xc2\xee\xc2\xda\x95\x7b\xb9\x34\x56\x2e\xfa\xeb\xee\xf1\x4b\x7c\xfa\x0b\x4d\x01\x27\x01\x60\xd2\x35\xe5\x66\x91\x44\xdc\x8e\x64\xd6\xb1\x4b\x29\x84\x0c\xc3\xdb\x2a\x9c\xa5\x54\x70\xc7\xce\x7e\x95\xbe\x96\x20\x07\x07\x1b\x8e\x4d\xae\xc5\xf4\xc0\x91\xe8\x72\xce\xbc\x53\x14\xc3\xc5\x98\x3d\x85\x64\xdd\xbd\x87\xe6\xfc\x63\xeb\xc0\x1e\xd6\x5c\x47\xbe\x70\x52\x9d\xf6\x72\x16\xf1\x52\x08\x95\xa9\xf1\x6c\x62\x58\xbc\xc8\x7d\x8d\xb0\xf8\x82\xe3\xfd\x71\x5c\x2c\x5e\x1b\x73\xd5\xe1\x29\xda\x40\x9d\xb8\xe7\x0c\x0d\x9e\x2d\x76\xe1\xfc\xc3\x98\x1e\x1e\x2b\x2d\x5b\x03\x7d\x92\x2b\xaf\x1f\xfa\x04\x04\x9e\xdc\x85\xc0\xeb\x36\x67\x78\x21\x77\x74\x06\xf8\xbc\x91\xfd\x7b\xd7\x18\x19\xfb\x96\x6b\x2f\x72\x97\xca\x39\x12\x57\x04\x05\xe9\x3e\x46\x4a\x4b\x98\x0a\x67\x13\xf8\x26\x61\xd2\x9e\x3c\x84\xa6\x12\x1c\x2d\xc7\xeb\x19\x7d\x63\x57\x59\x51\xb0\xeb\xf2\x81\xf5\x09\x8b\xfb\x8d\xec\x63\x4a\x75\xc7\xd9\xd2\xf6\x7a\xc1\x96\xee\x3c\xe2\x61\xae\xc3\x31\x04\xd3\x6c\xc7\x5c\xb9\xeb\x0d\xa0\x07\x80\x56\xc5\xb8\xce\x22\xdf\xe4\xa8\x56\xbd\xda\x79\x93\x56\x75\x6c\x0f\xa3\xc7\x9a\x23\x2d\xc1\xe2\xc6\x9c\x3d\xb5\xca\x96\x96\x84\x72\xcd\x6d\x86\x0c\x37\x2f\x89\x70\x77\x3c\x1f\xaf\x7e\x40\xe1\x00\x9f\x22\x99\x5f\x51\x2a\xcc\x43\xae\x3d\xbf\x47\xec\x82\x42\xd2\x18\xca\x15\x84\x47\x40\xc6\x5f\x8e\xbf\xc7\x01\xb1\x99\xa5\xfb\xee\xf1\x80\x79\xa4\xb2\xed\x41\xef\x24\xb2\xfd\x8b\x92\xdb\x0d\xb4\x15\x81\x92\x18\x10\x5b\xa8\x90\xbf\x2a\xb8\x9d\x77\x0c\x35\x12\x67\x77\x4e\xc2\x3e\x09\xdb\xa7\xe0\xde\xfb\x0e\xe1\x98\xd1\x5f\xe7\x69\xcf\x53\xa0\x3a\x26\x96\xac\x09\x59\x41\x8d\xd3\xe9\x18\x3c\x7d\xee\x04\x98\x42\x71\x8f\xdd\xdc\x6b\x28\xf8\x08\x89\x56\x21\x41\x55\x2b\xd4\x14\x03\x65\x76\x73\xde\x71\xd5\x0a\x9f\xa8\x24\x82\x1b\x6b\xa1\xbe\x95\x33\xb5\xb8\x29\xab\xa2\xba\x86\x07\xaf\x55\xa6\xb7\x35\xd9\x1b\x6c\x6c\xd1\xe2\x7c\x00\x39\x00\xd1\x25\xb3\x9a\x8d\x13\xbe\x36\x27\x81\xdc\x27\xde\x61\xdd\x8e\xd7\xbd\x4a\xdf\x0a\x33\x26\x90\xb1\x47\x43\x8e\xd2\xf7\xdd\xad\x69\x97\x0e\x74\x9d\x43\xce\x91\x7b\x06\xb8\x85\x6c\x04\x33\x6d\x66\xb9\x5b\xf0\xe6\xee\x90\x92\xab\x38\xe8\xb4\x1e\x72\xac\xfa\xb9\xc9\x6e\xf1\x3a\xb5\xc8\xb9\x1a\x4b\xc3\xb1\x9c\x95\xde\xe1\x36\x81\x27\x84\x07\x50\x04\x39\xcd\x1e\x24\x28\x30\x67\x40\x15\xd9\xb0\x25\x2f\xb3\x3a\x2b\x0a\x55\x44\x42\xb8\x36\xc6\x4a\x33\xe0\x86\x76\xe7\xb0\x8a\xdd\xc3\xda\xf6\x8f\x1f\x1e\x56\x11\x0c\xeb\x7e\x26\xf7\x26\x1e\x09\xeb\x0a\x44\x7a\x1e\x51\x70\x8b\xe6\x7e\x78\x22\xbf\x7d\x25\xb3\x14\x4b\x98\xe9\xce\x86\x93\x11\x43\x0a\xbb\x4a\xd1\x76\x5d\xaf\x31\xe7\x91\x3b\x56\xed\x33\x3a\x5a\xd8\xf2\xa9\xb2\xc8\xc3\xb7\xd0\x5b\xb6\x3b\x56\xca\xfa\x5b\xed\x8f\xe3\x61\x8c\x80\x5e\x58\x6b\x6c\xcf\xe0\xa2\x93\xed\x45\xd7\x0e\xe9\x3e\x71\xd1\xc9\xae\x45\x27\xbe\x66\xd1\x49\xbe\xe8\xe4\x7e\x56\xca\xbd\xab\xd2\x63\x9b\x85\x9f\x51\xba\xe2\x73\xec\xbf\x92\xfc\x63\x81\xa3\x60\xfc\x34\x95\x99\xcb\x4e\xf3\xea\xb4\x78\x72\x30\xfe\xb6\x01\x37\x6d\x81\xa5\x0f\x66\xa0\x48\x1c\xa3\x63\xca\xd0\x6d\x7a\xd4\x9d\xc8\xee\x25\x44\x2c\x9e\x61\xf9\x99\x43\x79\xdb\xdc\x98\x85\x8a\x24\x66\xaa\xbc\xcd\xeb\xaa\xc4\x42\xa4\xb9\xba\xc9\x21\xba\xb1\xc9\x50\x56\x2a\xb1\x5c\xe5\x58\xae\x87\xbe\xb5\xc5\x6b\xd9\x4a\x05\xca\x65\x86\x74\xe5\xa6\x81\xd6\x54\x7e\xfa\xb2\x78\x64\x55\xfc\xce\x8b\x02\x6c\xa7\x1f\xa8\x2d\x94\xa5\xb7\x8c\x14\x76\xc0\x4d\x87\x34\x58\x4d\x3e\x26\xe0\xc2\x3d\x83\x6c\x71\x23\x9b\x7c\xad\x20\xfa\xe2\x73\xf1\x71\xfe\x29\x38\x7b\x1e\x3b\xd0\xa1\x02\x65\x57\x1e\xdd\xeb\x29\xa9\x22\xa8\xe5\x8d\xf2\xa2\xb6\x6c\xa8\x12\xe1\xb1\x91\x71\x94\x4c\x78\x08\x31\xa2\x86\x4e\x68\x4f\xa6\xc3\x2a\xa3\xc8\xb5\x21\xd9\x27\x22\x0b\x57\xe5\xaa\xaa\x17\x98\x0d\x5a\x6f\x8a\x1c\x96\xf3\x9c\x13\x0d\xe5\x54\x04\x10\x1d\x13\xc6\x35\xb1\x63\x8f\x0f\x51\x7c\x85\xb8\xb5\x06\xcb\x02\xa1\x60\x5d\x6b\xdf\xb7\x4e\x57\x05\x12\x8e\x87\x0d\x6c\x8b\x31\x45\xa6\xbd\x60\x89\xc1\xa5\xcf\x75\xfa\x74\x0c\xc5\x86\xb1\x3d\x35\x45\xd9\x83\x4b\x0c\x70\x9a\x70\x91\xc1\x7c\xae\xb6\x35\xe6\xf6\xec\xa2\x85\xb7\x52\x62\xd7\xae\xcf\xee\x64\xaa\x79\xed\x6a\x95\xd7\x6b\x97\x96\x69\xa3\x25\x5f\xa7\x87\xf2\xa2\xaa\x1d\xaa\x5b\x88\xd7\xe9\x51\xf0\x1b\xb2\x7d\xb4\xb2\x56\x19\xa0\xc1\xd7\xec\x13\x3c\x1d\xc3\x47\xbd\x02\xc6\xf8\x40\xfd\xc6\xbb\xf5\x5d\xf7\x59\x53\xc9\xca\xa3\xc5\x8c\xeb\xb5\xb6\x99\x6b\x81\x89\x07\x1f\x21\xdf\xd4\xea\x5f\xb7\xcb\xdc\x0a\x04\xc0\x33\x5f\x68\x79\x53\x95\x66\x5c\x51\x84\x6b\xb3\x6d\x3a\xca\x25\xc5\x52\xd5\xd5\x75\x06\x20\x02\xf7\x12\xef\x93\x87\x18\x85\xcc\xc6\xaa\x21\x17\x0f\xad\x0e\xbb\x1e\x27\xeb\xb3\xa2\x10\xfc\x13\xb8\xf8\xdc\xa7\x5c\x2a\x38\x4e\x59\x59\x19\xfe\x6d\x51\x28\xdd\x10\xac\x4b\xb8\xcc\x50\x9b\xf1\xac\x13\xe1\xd5\x51\xb3\x4a\xd9\xbd\xd5\x8e\x1e\x44\xdf\x30\xb3\x9f\xc5\x65\xb1\xc1\x2b\x44\x94\xb4\x62\x43\x40\x3c\x5c\xe8\xb0\x02\x55\x42\xdd\xd0\x9e\x61\x2f\x6c\x81\xa3\x05\x72\x39\xda\xe1\x93\x20\xd4\x00\x39\xaa\x70\x20\xbb\x46\x48\x46\x23\x24\xbe\x66\x84\x9c\xb3\xde\x9e\x7f\x67\xe5\xf3\x35\x50\x87\x58\xe8\xb0\xbf\xd0\x66\xf1\xc0\xe0\x82\xde\x07\x8f\x70\xc1\xa2\xf0\x82\x1b\x79\x1d\xf4\x1b\x51\x9e\x16\x1f\x9d\x21\x03\x5e\x2b\x89\x20\x04\xd2\xe7\x9b\xc6\x28\x8b\xc1\x88\x29\x8c\xfc\x5d\x6b\xdc\x16\x8b\x6e\xdc\xb1\xb2\x85\x0d\xa0\xf2\x39\x00\x2e\x56\x08\xfb\xe8\xed\x5c\x83\xf0\x46\x3c\x9b\x8e\xed\x25\x78\x35\x9e\x36\x6f\xd2\x43\xf9\x21\xcb\x6b\xb9\x54\x59\x01\x48\x33\xf7\x2d\xf4\x9a\xb0\x2a\xc2\xb1\xde\x06\x74\x2d\x70\x93\xab\xa5\x10\x6f\x00\x94\xd0\xe9\x8f\xe1\x6d\xdf\x75\xf4\xe3\x09\xe0\xee\x40\x70\x17\x7c\x8d\x47\x71\x2f\x60\x57\x92\x57\x1b\xa2\xe3\xcd\x92\xe2\xf9\xbd\xad\x3d\x71\x83\xb0\x94\x77\xd0\xdb\x55\x6a\x16\xea\x68\xbb\xd8\xba\x47\x31\x91\xec\x0b\x68\x82\x80\xfd\xca\xfb\x17\x10\x94\x06\x9c\xab\x27\x36\xf0\x11\xc0\x95\x65\xa3\x69\x94\x0b\x4c\x05\xb1\xff\x28\x62\x25\xf2\xa2\xd8\xea\x86\xb1\x58\x37\x0a\xe2\x27\xd7\x58\x6d\x92\xe3\xd1\xbd\x00\xac\x48\x56\x2f\x6e\x70\x6a\x1e\x4a\x26\x08\x7c\x05\x84\xa9\x34\x89\x8b\xd9\x0d\x43\x28\xa2\x1a\xad\x13\xd8\x6a\xcb\x7c\x91\x23\xcf\xc1\x42\x2d\x11\x3e\x3a\x4f\xa3\x25\xb2\x32\xff\xda\x32\x6f\x80\x80\x0d\xea\x1a\x02\x67\xb5\x5a\x54\xd7\x25\x44\x89\x59\x59\x20\xc0\x4c\x69\xb8\x05\xb0\xb7\x62\xe5\x83\x0d\x1a\x07\xf9\x7c\xaa\xa2\x0f\x66\x5c\x03\x43\xe6\xf1\x93\x17\x1a\x52\x4b\xae\xb6\x85\x74\xdc\x67\x34\x4e\x70\xba\xb8\x51\x52\x61\x4d\xa7\xec\xac\xe9\x4c\xa4\xba\xcd\x8a\x2d\xd8\xde\x54\x6c\x0a\x83\x06\xb8\x2e\x81\x25\xa7\xf4\x8b\xc4\x0b\xa8\xd9\x89\xbd\xbb\xc9\x1a\x5d\x51\x3a\xdc\xdd\xcc\x0b\x97\x70\xef\xb4\x57\xf6\x59\xbc\x22\xd8\x7b\xad\x2a\x85\x44\x6a\x5f\xfe\x24\x8f\xd3\x57\x3d\x70\x80\xc4\x6f\x52\xe3\x8a\xe3\xd1\xe2\x0a\x80\x6b\x13\x53\xfc\xcf\xab\x75\x7d\x42\x32\x0b\x8f\xa6\xb7\xe9\xa1\xfc\x8c\xe2\x71\x39\x05\x82\xce\x9c\x66\x90\x10\x6f\x09\x08\xc5\x1d\x3b\x57\x91\x46\x97\xb3\xbb\x07\xad\x4e\x1d\xdc\x6b\xd6\x6f\x06\x8b\x1b\xc5\xe9\x04\x13\xa7\x4b\xac\xa0\x1e\x81\xa7\x12\x2b\x65\x87\xcb\xbd\xc6\x32\xcf\xb9\x45\x3e\xaa\x44\x2e\xb6\xba\xa9\xd6\x89\x5c\x54\xdb\x5a\x2b\xd0\xd2\xb1\x5b\xc5\x71\x7e\x6e\x75\x76\xad\x7c\xba\xc6\xf1\xd2\xc1\x8e\xb1\x5a\x48\x58\x41\x07\x21\xaf\xa2\xb0\xaf\x15\x77\x7e\x10\x00\x62\x19\xa0\xf4\xf3\xa6\x20\xa0\x3d\xdf\x50\x80\x6c\xd8\xd6\xd9\xc2\xa1\x32\x0b\xd5\xa8\xd2\xf4\x06\xc3\xd6\xa0\x25\x88\x44\xf2\xd9\x9c\xfe\x73\x25\x55\x5d\x57\xb5\x4e\xe4\x2a\x6f\xcc\x67\x71\x21\x77\xe8\x00\x26\xb1\xd0\x60\x12\x70\x83\x76\x91\xf5\x85\x37\x1d\x03\x7a\xd2\x92\x0b\xd5\x02\x01\x45\xa9\x29\x7f\xe1\x3f\x68\xad\x71\x57\x79\xf1\xa5\xda\xe2\x62\xf9\x21\x3d\xc4\xcc\x90\x5b\xc4\x45\x6e\x45\x10\xc5\x0f\x61\xd5\x83\x19\x63\xf7\x57\x1b\xa3\xc5\x07\xcf\x95\x45\xf9\x83\xb1\x6e\x79\x36\xe6\xf7\xe6\x28\x01\x0b\x41\x70\xb0\x26\x72\x71\xd8\xa8\x36\x9e\xc5\x1e\x72\x47\x4f\xd2\x08\x08\xf4\x6f\x34\xa3\x5a\x54\x5a\x9b\x31\x5b\x66\xeb\xec\x5a\xf9\x9d\x64\xd6\xe7\x8d\x2a\xe1\x1f\x8b\x6c\x4b\x88\x13\xba\x27\x09\xd5\xbd\xd5\x5d\xf0\x0e\x8f\x3a\xf5\x3e\x0e\x7e\xc1\x5e\xb1\x89\x7d\x3c\x7c\x8a\x9e\x4e\xcf\x5c\x65\xc0\x5c\x86\x56\x26\x27\x07\xf1\xae\x68\x6d\xba\x4b\xbe\x47\x30\x77\xbe\x67\x01\x59\x89\x0c\xc9\x4a\x44\x53\x21\x1e\x0f\x56\x7e\x56\xc0\x49\x08\xbe\x88\xf9\x6f\x27\x27\xdc\xc0\x9f\x36\xdb\x32\x6f\xa0\x66\x04\xae\x0d\xb5\xde\x14\x59\x7d\x4f\xa3\xa5\x85\x8d\xc8\x9b\x51\xc4\x48\xe6\xad\x2a\xb7\x0a\x0b\x94\xcc\x5b\x9a\x7c\x91\x6f\x32\x52\x63\x5b\xe5\xb6\x14\xa9\xa8\x74\x23\xe7\x5b\x9d\x9b\xd5\x8d\x5d\x11\xbe\x2b\x36\x6f\x06\xb5\x84\x79\xd4\xfd\x9b\x4c\xcb\xb9\x52\xa5\xa3\x80\xa3\xf1\x41\x6b\xd7\xa9\x6d\x42\xcb\xa8\x99\x40\xc1\x7b\x6c\x0c\x7d\x3f\x42\x5d\x0b\xcd\xae\xae\x9c\x2a\x4f\x2d\xb7\x8b\x24\xde\x27\x28\x41\x01\xb7\x54\xac\xf2\x32\x2b\xe1\x82\x86\xae\x37\x41\xc5\x09\x7e\xdf\xcf\xeb\xa6\x86\x52\xc5\x52\x5d\x17\xf9\x35\x6e\xf1\xdd\xf3\x8b\xdb\xe8\xc7\xf4\x50\xce\x88\x58\x9a\x66\x17\xbc\xe2\x9d\x45\xed\x42\xfc\x98\x1e\x01\x98\x04\x31\x9b\x11\x98\xf8\x49\x7a\x10\x01\xaf\xb5\x70\xbc\xd6\xba\xa3\x06\x3e\x5f\x43\x29\x4c\xe3\xc2\x48\xfc\x40\x27\xa8\x12\x1d\x0b\xc6\x75\x10\xbb\xe2\x70\x96\xd2\x03\xeb\xe6\x6f\x95\x74\x85\xf3\x3b\x22\x3e\xe2\x49\x41\xfc\x4e\x58\x97\x6e\xe1\xba\xc4\xa3\xe4\x6e\x90\xaa\x33\xe3\xd8\x45\x23\x60\x8c\x7d\xb3\x86\x6c\x70\x3f\xaf\x19\x67\xaa\x1d\xbd\x40\x87\x50\xa1\xbd\x06\x2a\xbf\x25\xf8\x6b\x3c\x9e\xe3\xc2\x37\x82\x87\xf3\xc2\x54\xbd\x8b\xe6\xf9\x08\xf9\x0f\x6d\x70\x13\xfd\x51\xcb\xa3\x44\x1c\x27\xf2\x6d\x22\x7f\x48\xe4\x8f\x30\x49\x47\x87\x84\x2b\xdb\xd6\xb7\xa6\xab\x36\xe3\xc2\x56\x5a\x14\x0b\xf9\x11\xf7\x0e\x0f\x4f\xe5\xa5\x5d\x66\xc1\xfa\x7a\xb8\x5a\xcd\xf1\xf9\x79\xc6\xf4\xf6\x9a\x06\xa4\xe4\x8f\xe9\x89\xbc\x42\xf5\x71\x36\x8e\x61\xbf\x7f\x4c\x8f\xa2\x82\x40\x26\xab\x4c\x15\x71\x56\x23\x3d\xa8\x52\xf3\xb6\xec\x8e\xea\x7a\xf3\xfe\x57\x72\xa2\x80\x70\xdb\x83\x29\x6c\xcc\x67\x88\x30\xca\x85\x42\x30\xdb\x7d\xe7\x48\x84\x3b\xad\x1d\xbd\x07\x1c\xea\xbd\xe9\x3d\x2c\x82\x07\xb8\x2a\x08\x95\x5d\xdb\xe6\x2c\xd1\x63\xba\xb4\x44\xed\x48\xed\x66\xec\x4a\x7f\xb1\xfa\x92\x2b\x3e\xb3\xdb\xb2\xc9\x31\xf3\xf9\xe6\xb0\x31\x87\xe3\xbd\xcc\x56\x8d\xaa\x05\xb0\x6f\xd8\xf1\xc1\xde\x60\x68\xe4\xd2\x3e\xc7\x58\xd7\x65\xc7\x57\x65\xc7\x57\xad\x6e\xbc\x17\xd4\x61\xb8\x50\x73\x34\xac\xf2\xb6\x61\x88\xa9\xe5\x45\xf8\xca\x7c\x25\x9f\xf0\x55\x3b\xf0\x8e\x0b\x83\xf4\x37\x89\x04\x60\x95\xd7\xba\x71\x41\xe5\xe8\x90\xa1\x93\xaa\x5a\xf9\x6f\xb7\x4e\x45\x87\x76\xb2\x2f\xc4\x2b\xcc\x3c\x6c\xb1\x25\xe8\xad\xff\xf6\xa6\xce\x31\x5c\x77\x72\x68\x86\x49\xd3\x38\xc1\x54\xc3\x6b\x37\xee\xc4\x77\xd0\x40\x7b\x08\x3e\x3a\x83\x9e\x2e\xcb\xe9\xca\x16\xf9\xb5\xcd\x99\xcc\x95\xc8\x78\x68\x1a\x02\x7d\xc8\x37\xe9\x0f\x91\xd6\xe1\x01\xcb\xfd\xb5\x1c\x55\x8d\x39\x7e\xcc\xa9\xba\xf4\xd1\xff\xea\x96\x07\xb1\x82\x72\xaa\xae\x92\x13\xb1\xb3\xe4\xc4\x45\xc9\x5d\x02\xb2\xa3\xf2\x44\x76\x54\x9e\x88\x30\x43\x30\x81\x97\xc5\xbc\x32\x8f\xbf\xce\xbc\x6b\x93\x97\xd7\x78\x1c\x44\x0c\x49\xc1\xa3\xdc\xa9\x6e\x86\x63\x59\x67\x77\x2d\xb0\x3f\x8b\x97\xfa\x34\x46\xd6\x38\xcb\xc4\x62\x96\x39\x3c\x69\xae\x92\x16\xac\x2c\x3a\x35\xed\xa1\xdf\xf3\xd5\xda\xe1\x29\xb0\xa8\xca\x26\x2f\xb7\xca\x5d\x1d\x36\x9a\xbf\xb4\x97\xf0\x36\x3e\x33\xcd\x05\x87\xa7\x06\x4e\x26\x1a\x17\x47\x87\xe9\xa1\xfc\xa8\x4a\x55\x67\x85\x10\x47\x87\xe9\x91\x39\xd4\xc0\x51\xb6\xa7\x4a\x6b\x17\xe4\x5a\xde\xa8\x82\xfa\x22\xf3\xf2\x36\x2b\xf2\x25\x52\x6f\x51\x5a\x01\x0a\x1f\x50\x0f\x13\x90\x0d\x2c\x18\x00\x5b\xc4\x7c\x81\x42\x1e\xee\x1b\x4c\xf8\x1c\x28\x1d\xb2\x1c\xb1\xa0\x58\xb8\xfa\x34\xa3\xc5\x74\x3f\x03\x75\xcd\x35\x81\x51\x5a\xbd\x70\xf7\xa9\x13\xac\xc0\xe6\xc3\x77\xb1\x2d\xcb\x5d\x41\x54\x27\x27\x8c\xd6\x61\x0a\x03\x76\x1c\x13\xdd\xa0\xf9\x87\xc8\x99\x36\x15\x84\xb5\xf5\x80\xd0\x99\x51\x08\xb9\x34\x74\x98\x9d\x00\x38\x76\x07\x51\xc6\xb0\xb1\x18\x6b\xf4\x4f\x55\x56\x17\xb9\x22\xf6\x33\xbb\x73\x75\x22\x5c\x03\x34\x66\x0d\x43\xc1\xfa\x87\x38\x8c\xb0\x77\x27\xfc\xba\x7f\xea\x55\xef\x4a\x88\xac\x55\x5d\x82\x4b\x6c\xdc\x0d\x73\x44\xb8\x0b\x64\x67\x59\x0e\xb1\x4c\x00\xbe\x9a\xa2\x00\xde\x94\x8d\x2c\xe4\xa3\xc3\xf4\x95\x3c\x75\xe5\x62\x66\x5e\xc2\x19\x69\x40\xae\x9f\xb6\x45\x5e\x92\x79\xda\x96\x53\xa1\xb8\xb8\x7e\x38\x30\xce\xcb\x31\xfd\x2b\x70\x75\x42\x4a\x6c\x8b\x67\xa1\x80\x7e\xe3\x7a\x72\x9c\xe3\x30\x31\x59\xbd\x04\xad\x7f\x4e\x79\x18\x9e\x07\x5d\x9c\x23\x10\xb2\xef\xe2\x41\x7c\x28\x0b\xc1\x58\x80\x3c\x20\x81\x02\xe6\x4e\x25\xa5\x13\xdd\x6a\x8b\xe0\x5b\xdf\x83\x5e\xb2\x0a\xb7\x60\x4f\x99\xe9\xaa\x97\x08\x53\x5b\x2b\xf5\x00\x52\xe6\x99\xf2\x9c\xbf\xfb\x4f\xfa\xf2\xf4\xf4\xe0\xfd\x97\x83\xd1\xe9\xc1\xb4\xff\x3b\xc9\x80\x3c\xac\xff\x71\x72\x74\x7c\x72\x18\xeb\x7f\xbe\x3e\x7a\xf5\x5d\xff\xe3\x8f\xf8\xc1\x42\xab\x5b\xe3\x36\xae\xd7\xe6\x68\xec\x37\xce\x2e\x38\x18\x55\xe5\xa9\xa3\xa0\x38\x00\x88\x33\xc2\xd7\x8f\xd2\x43\x79\x3a\x19\xa0\xbe\xd4\xe9\xf8\xe2\x62\x3c\x9a\x8a\xd3\xf1\xe4\x72\x3c\x01\x71\x2f\x39\x9c\x82\x82\x56\x5f\x9e\xf7\x3f\xcb\x0f\xc3\xc9\x05\xea\x81\x8d\x07\xf8\x7b\x52\x5b\x96\xe7\x83\x8f\xfd\x73\x27\xee\x9b\x32\x5d\xab\xf1\x48\x58\x21\xce\xb3\x49\xff\xc3\xcc\x49\x6e\xba\x67\xc0\xfb\x07\xb2\x3f\x92\xfd\xd9\x6c\x3c\x19\x0d\xbe\x1c\x9c\x9e\x0f\x07\xa3\x99\x9c\x0c\xce\x51\xdc\xec\xd3\xf0\x32\x75\xed\x14\xd4\x4e\xfb\xf2\x29\x3e\x7d\x38\xfa\x30\x9e\x5c\x60\xab\x41\x0f\x58\xee\xf5\xa7\x07\xc3\xe9\x9e\x7c\xdf\x9f\x0e\xa7\x69\xab\x9f\x28\x71\x26\x46\x63\x2e\xde\x3c\x19\x7c\xec\x4f\x40\xfd\x17\xd4\x9d\xd9\x33\xad\xb0\x74\x12\x29\xa2\x39\x0d\x61\x50\x0b\xb3\x1a\x60\x28\xfb\x65\x9e\xf3\x61\x32\xbe\x90\xc3\xd9\x54\x5e\x4d\x07\xa9\x10\x2e\xc4\x61\x9e\xff\x79\x3c\xf9\x27\xb9\xdf\x9f\xca\xb3\xc1\x87\xe1\xc8\xca\xa7\xf6\x02\x1d\xeb\xab\xd1\xd9\x60\xc2\x54\x4e\xed\x68\xb6\xa6\xed\xf2\xea\xfd\xf9\xf0\xd4\x8d\xef\xfe\xde\xe9\xe9\xe5\xf9\x9e\x1c\x4f\xe4\x1e\xfd\x6e\xaf\x97\x4a\xf7\x5a\x7c\xc7\x6c\x70\x3a\x43\xb1\xec\xd3\xf1\xe5\x17\xd0\x50\x33\xfd\x7b\x69\x65\x5a\x65\xff\xf2\xf2\x7c\x78\x0a\xe2\x69\xe7\xfd\xcf\x29\x68\x92\x39\x85\x63\x7a\x14\x7e\x72\xf6\xc9\x4c\xe1\x54\xf6\xaf\x66\x9f\xc6\x93\xe1\xff\xc3\xda\x3e\x9c\x0a\xdb\x2c\x7c\xed\xa7\xe1\xfb\xe1\x0c\x14\xad\xdf\x7f\x91\x83\x3f\x0d\x26\xa7\xa8\xa8\x0c\xf2\x72\x20\xe4\x26\x49\xda\x15\x5e\xe0\x06\xe3\xd3\xc0\x69\xc2\x82\x82\x13\x2a\x79\x7f\x9c\x0c\x06\x72\x36\x16\xef\x07\xf2\xfd\xf8\x6a\x84\xda\xdf\xad\x01\xa3\x16\xe0\x10\xe0\x3f\xc6\x13\xf9\xd1\xcc\xfc\x14\x1e\x69\x7e\x8f\x2f\x17\xa7\xe3\xd1\xac\x0f\x33\x42\xfa\xb6\x20\xf5\x36\x3c\x1b\xd0\xb6\x18\x7f\x30\xdf\x98\x50\x2b\xfa\x20\x11\x4d\xea\xcd\x5d\x5a\xb4\x64\xaa\xa6\x5c\x09\x01\x3c\x5f\xae\x7b\x80\x94\xb9\xc4\xae\x21\x91\xdb\xde\xa1\x84\x8d\xed\x96\x13\x21\x7a\xae\xf5\x16\xe2\xae\xcd\x4d\x55\x54\xd7\x90\x2c\x52\xe5\xe2\x7e\x51\x54\x1b\xb5\xcc\xb3\x24\xbc\xe3\x01\x3c\x9d\x97\x50\x3d\x8a\x56\x1d\x04\x55\x63\x11\x85\x04\x64\x46\x31\xad\x29\x33\x59\x6e\x2d\x61\x00\xa6\x89\x00\xe0\x65\x41\xb9\x89\x57\x3c\x00\x62\x00\xcb\x36\x44\x34\xed\x36\xdd\x2a\x90\x5b\x33\x10\x5b\x48\x42\x7d\x05\xf9\x5c\x7d\x85\x10\xe4\x0f\x7d\xe3\x96\xda\x2e\x6d\x05\xf8\x60\x87\x6a\x85\xcd\x8e\x73\x80\x7f\x14\x32\x9a\xa7\x72\x2f\x7a\x52\x38\x4d\x31\x07\x38\xbc\xcb\x78\x13\xc1\x2f\xb2\x72\x29\x70\x28\x37\xb5\x3a\x50\xbf\xe6\x1a\x89\x77\x91\xf0\xdf\x4f\x74\x40\x13\xbe\xde\x22\x24\x3a\xa0\x08\x5f\xd6\xd9\x3a\x6b\x48\x06\x38\x11\x2b\x34\x95\xb2\xc2\xfe\x46\xae\x2b\x74\xdf\x73\x28\x14\x76\x1a\xb1\x48\xd7\x4f\x82\x2d\x90\x48\xca\xea\x90\xc8\x26\x11\xd9\xbc\xce\x97\xd7\xf8\x1e\xe3\xa8\xa8\x52\x77\x51\x91\x43\x85\x77\x7b\x95\x11\xd5\x50\xad\x16\x99\x6e\x12\x81\xb4\xdd\x55\xbd\xb6\x69\xae\x65\xb6\x01\x35\x38\xc2\x4e\x23\x3a\xf9\x09\x3a\x1a\xe2\x79\xf3\x1c\x4d\x6a\xc7\x9c\x2e\x52\xc9\xf8\xb5\xd7\x8e\x5d\x3b\x0f\xe4\x96\x15\xd2\xff\xc6\x5c\xdb\xf0\x0e\xe7\xf8\x8a\x5d\x82\x02\x88\xb2\x5d\xa6\x72\x6f\x6c\xa9\x6f\xfb\x00\x04\x79\xf4\x85\x77\x37\x95\xab\x4f\xb3\x2f\xc4\x6a\xad\x3d\xbe\xfa\x1a\x4e\x6e\x89\xe8\x5d\x58\x79\x2b\x02\x9c\x20\x31\x74\xb7\x00\x42\x1c\xc5\x4b\x85\x58\xa5\x12\x89\x68\x2d\xc1\x4f\x77\xe3\x9e\xc2\x4a\x2b\xba\x59\x69\xe5\xf3\x59\x69\x85\xed\x3f\x67\xa4\x95\x5f\xcd\x48\x2b\x76\x07\x27\x1f\x61\xa4\x3d\x26\xbc\xc2\x15\xa3\xfd\x8a\x45\x25\x0b\xef\x42\x73\xad\xb4\x5a\x81\x76\x34\x26\x61\x20\xa9\xe9\xc0\xaf\x0c\x59\x60\x73\xc0\xd0\x7e\x0f\x86\xc0\x90\x9f\xce\x0a\x46\x6f\xed\x01\x10\x5a\x38\x8c\x60\x40\x70\xe3\x7c\x40\x06\x80\xb8\x2b\xad\x7b\xcd\x7e\x0b\x38\x2a\x7a\xae\x68\x43\x23\x4e\x52\x37\x3e\x1f\x8d\xcb\xf4\x55\xda\xdc\x3e\xea\x26\x48\x6e\x97\x15\xea\x3d\x9d\xe8\x6d\xa3\xea\x8d\x82\xdc\xd5\x7e\x57\x2c\x1c\x82\x7c\x1d\x7e\x67\xc0\xfd\xc6\xa0\xbe\x2c\x64\x2e\xfc\x21\xed\x42\x4c\x70\x3f\x60\x78\x9a\x2b\x80\x4b\xbf\x1e\x01\x6e\xc2\x2b\xee\xdc\x55\xdb\x54\x92\xf4\xb3\xa1\xfc\x25\x3a\xc7\x2c\x83\x61\xd7\x53\x41\x7b\xc5\x3f\xd4\xb1\xae\x45\x57\x5e\x40\x7f\xc6\x85\x4a\x97\xec\x99\xd1\xa9\x68\xbe\xb3\x48\x91\x18\xde\xd6\xce\x38\xed\x9e\x5a\x6e\x6e\xaa\xb2\xc2\xab\xc1\x4c\x60\xd2\xa5\x65\x4e\x62\xe7\xee\x37\x48\xaa\x1d\xfd\x16\xc5\x40\x32\x0b\x9a\x5d\xe6\xd7\x79\x63\x6e\xb0\xed\x32\xaf\x02\x3e\x76\x3e\x62\xae\xe8\xa9\xdd\xfd\x8e\xae\x2f\xff\x43\x75\xa3\x63\x9c\x67\xae\x64\xfe\xa9\x1c\x7c\x72\x27\x07\x9f\x39\x2f\xcc\xb6\xc1\xd8\xfb\x52\x41\xa2\x18\x6b\x11\x82\x57\xf0\xc2\x7e\x17\xcf\x06\x30\x1b\xd8\x16\x01\x9e\x19\x8a\x10\xea\x07\x88\xcb\xbb\xf7\x89\xf4\x62\x1a\x41\xa3\x53\xd1\xf7\x79\x1f\x24\x35\x7c\x8c\x96\x88\x0e\x02\xc6\x4e\xf4\x2a\x75\xd5\x0f\x80\x24\x84\x1e\xc6\xe9\xc2\x0e\x46\x22\x00\x0e\x70\x42\x22\xae\xf4\x0e\xf9\x79\x8f\xb7\x68\x02\x5e\x0a\x8e\xb5\xc6\x9d\x6e\xc1\xd9\x5c\x9b\x3f\x66\x93\x6f\x93\xce\x23\x6d\x9e\xff\x18\xac\x94\xe2\x5e\xd8\x25\xe5\x6d\xc2\x27\x90\xfa\xf8\x84\x0c\x67\x2e\x11\xae\x3a\xc8\xe5\x7d\x1f\xe2\xd9\x01\xdc\x48\xfb\x5a\x55\xb7\xaa\xbe\x17\xf8\xa0\x60\xab\xd8\xf3\x13\x5a\x09\xd5\x1a\x4f\x1a\x00\xf1\xf0\x00\xd8\xf1\x09\x41\xef\x58\x06\x5a\xd5\xb6\x8c\xcb\x55\xc9\x09\x7e\x24\x04\x85\x6b\x1d\xc5\x22\x9d\x41\x57\x5e\xcd\xa0\x5f\x88\x47\x70\xf3\x66\x09\xc2\x64\x3c\x58\xd0\x81\xb6\x97\x9b\x8f\x5f\x38\x61\x10\x9a\xa3\x11\x11\x50\xcc\x31\x61\x0f\x7b\x4a\xd6\x58\xa8\x59\xb5\x62\xb0\xa4\xb0\x05\xcf\x5c\x7d\xe2\xc1\xc1\xf7\x43\x4a\x12\x1f\x3b\xcb\x10\x01\x7f\x6f\xeb\x78\xa8\xac\xa7\xaa\x3d\x0c\xd6\x7b\x92\x99\x5c\x67\x65\xa9\x50\xfd\xa5\xd4\xb9\x46\x72\x9a\x80\xbc\xa2\x55\xcd\xe3\xe5\x97\xd9\xd9\x15\x54\x95\xef\xbc\x02\xdb\x3e\x1f\x2b\x53\xef\xa4\x0f\x8a\x5d\xc4\x0c\x90\x11\x2e\xfb\x89\x1d\x01\x0d\x49\x4a\x02\xc5\x4c\x66\xbb\xe3\xbe\x36\x9f\x80\x77\x6e\x57\xd3\xc0\xef\xa3\x6c\x2c\x96\x47\x97\xec\xf4\xb3\x4b\x29\x89\x80\x36\xb6\x24\x0c\x32\x4f\xc8\x08\xce\xb4\xbb\xe2\xfe\x00\xb7\x15\x55\xfc\x42\xfe\xd1\x9c\xf1\x1c\x56\x65\xbe\x65\xfd\x0e\x81\x7e\x07\x10\x7b\x99\x51\x52\xba\xa1\x98\xbe\xef\x48\xdb\x8d\xea\xee\x88\x78\x56\x47\x64\xdc\x91\xe8\x1d\xe2\x79\x1d\x91\x9d\x1d\x01\x17\xfd\xf7\x39\xba\xdb\xbe\xe5\xf3\xcf\x70\x91\xc7\x94\x6b\xdf\x70\x86\x0b\x38\xc3\xe5\x8e\x33\x1c\x32\x4c\x71\x8b\x77\x9d\xe7\xe2\xb9\xa3\xf2\xc0\x79\x2e\x3a\xce\x73\x57\xd7\x1c\xd9\x47\x8f\x9e\xed\x5d\x85\x80\xd1\xd9\xfe\x58\x4d\x94\x3b\xdb\xd1\xb8\xfb\x6d\x8e\x6f\xe1\x8f\x6f\xf9\xcd\xc7\xf7\x13\xef\xce\xae\x11\xdc\x71\x92\x8b\xe0\x24\x97\xdf\x78\x92\x8b\xdd\x57\xed\x53\x4e\xf2\xd6\x3e\x6f\x1b\xf6\xdf\x70\xa8\x8b\xe8\x50\xef\x1c\xa5\xa7\x9d\xef\x1d\x81\x90\x45\x38\x9f\x6e\xa9\x41\xf8\xab\x73\xb9\x11\x44\xab\x6d\x9d\x0a\x2a\xc2\xa4\x51\xb6\x2a\x4a\x9b\x3a\x5f\x67\x75\x0e\xa4\x31\x14\x27\x58\xe1\x69\x87\x90\x4c\x78\xe4\x5d\x56\x2f\x39\x73\x78\xb6\xbc\xcd\xca\x26\xbb\x86\xfd\x60\xeb\x3f\xd6\x55\xa9\x80\xa6\x75\x51\xad\x37\x36\x58\x47\xdc\x17\xbf\x2e\x6e\xb2\xf2\x3a\x9c\x73\x27\xac\xee\x29\xcd\xd5\x92\x34\x90\xb8\xc7\x63\xfd\x9d\x55\x5e\xa8\x03\x7d\x83\xaa\x49\x1c\x8e\x4d\xf0\x83\xb2\x6a\x44\x18\x8e\xb3\xa0\x8a\xa7\xf6\x4b\xf2\x7e\x89\x07\xfb\x95\x04\xf0\x43\x27\xc8\xb1\xc9\xee\x1d\x49\x10\x54\xa1\xe1\x57\x05\xff\x2a\x15\xe6\x97\x8a\x69\xcb\x36\xd1\x20\xb5\x46\xc4\x71\x38\xde\x3f\xd9\x24\x7e\xbe\x4f\x50\xc7\x7c\xa2\x78\x48\x56\x75\xcb\xf3\x4d\xc2\x73\x4c\xb0\x73\xcc\x07\x74\xec\x89\x66\x63\xa0\x36\xf6\x2c\xaf\x73\xaa\x95\x8e\x2e\x53\x73\xff\x2f\xf3\x46\x30\x76\x0e\xda\x1f\x5e\xa8\x0b\x97\x85\x45\x51\x40\xe9\xc5\xbf\x51\xbd\xc2\xc2\x8a\xf9\x22\x0c\x2c\x5b\x2b\xb1\x6f\xba\xae\xd5\x76\x59\x95\xf7\x6b\xe0\xde\x72\x61\x99\x9e\x5d\x8c\x71\x23\xf2\x95\xd4\x5b\x38\x42\x96\xa8\x3a\x03\x80\x0b\x11\x1c\x57\xfc\x23\x96\xb8\x28\xeb\xe0\xdd\xc1\xb3\x24\xa3\x8e\xd9\xd2\xd4\x7b\x8b\x98\xea\x38\x06\xbb\x8e\x8f\x7d\x95\x5e\xa7\x89\xdc\xfb\x60\x4c\x93\x1b\x1e\x96\xb7\x90\x1e\xf8\xd8\xfc\xbe\x65\x9d\xec\x99\x21\xdb\x9b\x2e\x6a\xa5\x4a\x88\x3d\x60\x7e\x00\x4a\x57\xe8\x93\xf1\x57\xc9\x42\xdb\xeb\xa5\x72\x6a\x0c\x20\x6a\x3a\x85\x0d\xf2\xf5\x06\x45\x8f\x14\x23\x36\x75\xb3\x85\x67\xcb\x4f\x6e\x6f\x24\xe2\xc6\xb2\x64\xe2\x79\xf3\xc8\x50\x75\x2c\xb5\x44\x42\x60\x7e\x9d\x97\xf9\x7a\xbb\x46\x64\x3c\x35\xe9\x8e\xc8\xa0\x54\x56\x13\x63\xa8\xcf\x0a\x00\xbd\x56\x0d\x8d\x62\x11\x68\xfa\x22\x7e\x47\x3b\x76\x56\x7b\x26\x72\xde\x84\x4d\x5d\xad\x73\x40\x0a\x66\xa4\x45\xfc\xc0\x83\x05\x3e\xd8\x16\x38\xcb\x49\x88\x0d\x4a\x1e\xaa\xf3\xc9\x52\xf9\xfe\x1e\x4d\x17\xbb\x74\xdd\xf1\x48\x65\x6d\x16\x0a\xd8\x05\x2d\x61\x28\x42\x7a\xa7\xa6\xea\xd6\x1a\x23\x9b\x66\xe0\x9d\x5d\x3c\x57\x1a\x0e\x27\xfb\xad\x17\x1a\x22\x3b\x85\x5a\x5e\x2b\x82\x54\xb2\xe9\xcc\x4b\x73\xe3\xdd\xbf\x13\x22\x4f\xc3\x4a\x01\x28\xb4\x53\x58\xc6\x13\xc2\x7d\xa1\xed\x41\x00\x07\x6e\x26\xf8\x1b\x39\xb3\x36\xf2\xed\x2c\x23\x6b\xd8\x20\x28\x0c\x3f\x8a\x95\x6d\x4f\xb5\xad\x5c\x05\x24\x61\x51\x6d\x61\x78\x35\x2f\xf2\x6b\xdc\x29\x0d\x9c\xce\xb8\x62\x1d\x93\x79\x07\x89\xbc\x58\x29\xf3\x87\x5a\x69\x48\x37\xe8\x30\xdb\x44\x07\xbc\x76\x34\x24\x2a\xe2\xef\x72\x82\x47\x41\xc8\x3b\xf1\x7a\x39\xf6\x80\x66\x32\x32\x40\xc9\x50\x95\x10\x01\xaf\x9d\x22\x8c\x7f\x29\x45\xcd\xf1\x4e\xf1\xd4\x04\x54\xfb\x64\xf3\x54\x72\xa9\x56\x99\x17\xf2\xbe\xcd\x2c\x54\x8f\x44\x6c\x7c\xd0\xbe\xa9\xea\x06\xb2\x0a\x79\xf9\xaf\x5b\x9c\xa4\xe8\xc9\xe8\xc8\x0c\xfe\x84\x89\xed\xa9\x1c\xfc\xe9\x72\x32\x98\x4e\xcf\xbf\xc8\xe9\xac\x3f\x1b\x9c\xc9\xe1\x28\xc8\x64\xcb\xf1\x04\x53\xef\x9f\x87\xd3\x01\x66\xc1\xe1\x33\x9f\x27\xc3\xd9\x70\xf4\x51\x8c\x27\x72\x32\xf8\xe7\xab\xe1\x04\x13\xfc\x61\x26\x3f\x09\x90\x00\xf4\xc4\x33\x8f\x9c\x90\x0e\x39\x91\xc8\xcf\xc3\xd9\xa7\xf1\xd5\x4c\x30\x9c\xc4\xf8\x03\xe4\xea\xff\x69\x38\x3a\x4b\xe4\x60\x08\x00\x00\x6a\xaf\x69\xd6\xf0\xe2\xf2\x7c\x08\xad\x39\x3d\xbf\x3a\x1b\x8e\x3e\xba\x87\xc8\xf3\xe1\xc5\x70\x06\x59\xf4\x44\x98\x47\xec\x04\x5f\x9c\x8e\x47\xb3\xc1\x68\x06\xcf\xeb\x9f\x9e\x5e\x4d\xfa\xa7\x5f\x38\xec\x00\x2a\x37\x83\xfa\xac\x52\x9e\xdb\x9a\x18\x37\x8e\x04\x23\x18\xfc\x69\x86\x88\x92\x9d\xe3\x21\xfa\xa3\x33\xfb\x25\x8e\xe4\xe8\x4f\x10\x9a\x00\x38\x0e\x07\xf6\x30\xcf\xed\x9b\xd9\x98\x9c\xc9\xcb\xfe\x64\xf6\x25\x42\x7c\x88\xf7\x93\x41\xff\xf4\x93\x6b\xaf\xef\xe4\x70\x24\xa7\x83\x53\x40\x11\xbc\x4e\xcc\xbf\x46\x63\x39\xf8\xd9\x34\xee\xf3\xf0\xfc\xdc\x03\x13\xde\x0f\xe0\x6d\xe7\x03\x31\x1b\x03\x3c\x01\xa6\xe6\x0b\x41\x6d\x66\x9f\x06\xe3\xc9\x17\x68\xa8\xf9\xe5\xf4\x72\x70\x3a\xec\x9f\x9b\xe7\x9d\x0e\xcf\x06\xa3\x99\xf9\xef\xd3\xf1\x68\x3a\xf8\xe7\xab\xc1\x68\x06\x7f\xba\xbc\x1a\x0d\x01\x3f\x33\x36\x53\x35\xb8\xb8\x3c\xef\x4f\xbe\xb4\xba\x69\xa6\x28\x42\x4c\x98\x09\x30\x9d\x88\x60\x1f\x09\x34\x5b\x0c\x3f\xf8\x36\x7f\xea\x4f\xe5\xfb\xc1\x60\x24\xfb\x67\x3f\x0f\x61\x39\xe1\xc7\x2f\xc7\xd3\xe9\x90\x06\xce\xe2\x24\xe8\xc5\xb6\x2c\x93\x57\x08\xb5\xa9\xb8\x2c\x7b\xd9\xae\xa3\x08\xaf\x25\x5f\x8b\x11\x56\xff\x40\x1c\x23\x7b\xb8\x9c\xa8\x1d\xe6\x71\xc9\x4f\xed\xb2\x9f\xc0\x4b\xd2\xaa\xee\x79\x8a\xed\xd6\x55\x7c\x23\xdc\x7d\xe2\x2e\xec\xa0\x0c\x47\x3e\xa1\x0c\x07\x2e\x49\x9f\xa7\x85\xf2\x3f\xdb\x54\x42\x11\x3f\x50\x9d\x63\xfc\x75\xcf\xfa\xc9\x0a\x6d\xe4\x71\x22\x5e\x27\xf2\x0d\x94\xdb\x98\xc1\xff\xe1\xb9\x85\x36\xf3\x56\xaa\x10\xfd\xc4\xae\x84\x61\xc2\x2f\xaa\x10\x39\x9c\x6b\x11\xe6\xfd\xe4\x53\xf3\x7e\xfc\x6e\xec\xa5\x71\x4d\x80\xf8\xaa\x9a\x00\x9e\xfa\x77\x00\x7d\xf1\xb4\x7a\x00\x6f\x8c\x63\xda\xb7\xc9\xd7\x8a\x19\x6d\x76\x0d\x20\xe8\x1c\x4a\x1a\xcd\xd4\xaa\xc2\x79\x2c\xb4\x32\xa0\x89\xe6\x15\xff\x79\x31\xfd\x3f\xa4\xf2\x22\xd7\x0b\x55\x14\x59\xa9\xaa\x2d\x42\xa5\x02\x3e\x25\x9e\xfc\x7b\x62\xf8\x1b\xca\xcf\xa2\x10\xc2\x2e\x62\xa4\x30\xdc\xd4\x26\x46\xa2\x48\x20\x42\xa2\x8d\xcb\xb3\x83\x14\xa9\x73\x5d\x53\xb0\xa0\x93\xaa\x67\xfe\xd5\xfd\x6c\x7b\x40\xe2\xf9\xfd\x0a\xfd\x93\xdf\xa3\x83\x8b\xf4\x49\xe5\x19\xbb\x6a\x32\x5a\xf8\x72\x61\x8b\x5c\x5d\x38\xe2\xeb\xeb\x34\x76\x87\xbc\x92\xa0\x24\xd4\x72\x35\x11\x1f\x81\xd5\x5d\xa7\x9a\x08\x8a\x1f\xfa\xc2\x05\x02\x77\xf9\xfe\xba\xc2\x0d\x60\x76\x5d\xfb\x72\x0d\xf2\xb7\x6c\x20\xdd\x19\xf4\x22\xc8\xe4\xfa\x07\xb5\x0a\x3f\xcc\x88\x60\xd0\x62\x54\x41\x4f\x30\x54\xb4\x6b\xa0\x5d\x43\x96\xa6\xa5\x44\xce\xb3\x24\x81\x0b\xab\x97\x02\x45\xd4\x76\x5e\x69\x03\x43\x3b\x3c\x4d\x0e\x7d\xc4\x3f\x2f\x2f\xe5\x5d\x9d\x3b\xdd\x07\x9d\x5f\x97\x6a\x29\xd8\x40\xdd\x53\x98\x08\x09\x3d\x89\x65\xbf\xfb\xa9\x08\x7c\x8a\xa4\x8a\x3d\x4c\xac\x79\x4e\xad\x8a\x88\x4a\x45\x60\x99\x3b\x7e\x07\x73\xe1\x80\x77\x51\x2b\xaa\x49\x8b\xab\x51\xfc\x2b\xb4\x78\x62\x35\x0a\xba\x66\xe6\xdc\x46\x6e\x06\xf7\x1e\x4f\xda\x60\x46\x4d\x10\xae\x6d\x0e\x10\x3d\xaa\x9f\x67\xb5\x0b\x6e\x12\xb5\xe7\x16\x20\x2f\x9c\x22\x02\x81\xda\x9b\xb0\xe6\x46\x34\x72\xac\x52\xdc\x81\x3f\xed\xb2\x86\x15\xb8\x85\x8b\xd6\x4c\x5e\xa3\x18\xf9\x51\xab\x70\x9f\xa2\xea\xa9\x10\x2d\xe0\x39\x55\xe8\x67\x7e\xa2\xdb\x5b\x69\x0d\x25\x2d\x65\xe5\xb8\x32\x18\x9b\x89\xd8\x11\xaa\x83\x4c\xac\x6c\xbd\x8e\xa3\x02\x89\x36\x81\x0e\x20\xa2\xca\x23\xaf\x0d\x47\x09\xa5\xad\x9b\x1b\x65\x9c\x4f\x4b\xa9\x42\xa5\xf5\x3b\x18\x55\x68\x7c\x04\xa3\x9d\x31\x5f\xba\xc6\x9a\xb3\xa4\x8b\x7a\xc0\x2d\x5f\x4b\x3e\xe0\x5e\x41\x28\xaf\xa8\x8f\x76\x8c\x2c\x29\x79\x67\x05\xe3\xaa\xaa\xd5\x35\x88\xf2\x37\x77\x95\xdc\x3f\xee\x49\xd8\x97\xe5\x42\xe9\x44\xe4\xab\xf6\xc8\x98\xfb\xde\x43\x23\x18\x43\x1b\x45\xc6\xe9\xf8\xf6\x31\x06\x9f\x34\x71\x07\x2a\xd8\xa1\x2c\xe0\x00\x9c\x4d\xce\xbf\xd7\x3c\xac\x91\x0a\x81\xd4\x47\x2e\xf6\x68\x91\x17\x0c\x87\x69\x4c\xd5\x05\x12\xd4\x84\xe2\x82\x4e\xb7\x0c\x63\x72\xda\x0b\x81\x7b\x73\xe4\xf4\xf4\xf2\x3c\x91\x25\x31\xa9\xe0\xbc\xc2\xf4\x6f\xc9\x3c\x73\xfe\xbe\xdc\x8b\x47\x63\x4f\x58\x3a\x49\x45\x10\x44\xf7\x59\x60\xce\xb8\xae\x80\x81\xa9\xbd\xba\xfc\xe6\xc0\x72\x58\xda\x1b\xf6\x5c\xec\xfa\x16\x0a\x61\xf8\x6a\xbb\x2d\xab\x7d\x86\x89\x0f\xec\xf0\xd6\x0e\x7a\x61\xde\x56\x1e\x2c\xb6\x35\x2a\x9c\xb9\x86\x02\xdd\x8b\xbc\xde\xe6\x4b\x55\xe4\x25\x60\xa9\x1d\xb4\x08\x86\x51\xdf\xa8\xa5\xa8\x10\xea\x7d\xa7\xe6\x3a\x6f\x54\x18\xb4\x8f\xb4\x52\xc0\x31\xa2\x44\x2a\x25\x52\x8c\xe1\x61\x66\x26\x5f\xab\xae\xcd\xed\x94\x7e\x21\xf6\x6c\x2e\x8b\x46\xde\x34\xcd\xe6\xdd\xcb\x97\x0b\xfa\xec\x82\x06\xa1\xaa\xaf\x5f\xfe\x47\xab\x92\xfa\xcf\xfb\x93\xbe\x9c\x6e\xaf\xb3\xfa\x74\x72\x71\x70\x94\x1e\xa5\x27\xbf\x43\xf9\xd7\x23\xf5\x5f\xaf\x8f\xdf\xbc\x3a\x8a\xeb\xbf\xde\x1e\xbd\xf9\x5e\xff\xf5\x47\xfc\x4c\xaf\x3e\xf6\x27\xa7\x93\x0b\x19\x95\x01\xf5\x7d\x5e\x16\x16\x08\x0a\x22\x4d\x11\x6e\x30\x40\xfb\x42\xde\x1e\x39\xf5\xcd\xdb\x57\x69\x9b\x63\x90\xf4\x84\xd1\x11\xb6\x05\xfb\xb2\xa8\xca\x6b\x55\x43\x52\xa6\xaa\x89\x89\x94\xf1\xb2\xa7\x42\xfc\x4c\xc2\x3c\xb0\x22\x11\x16\x69\x57\x29\xc9\x0d\x38\xcb\xc4\x7e\x74\x7f\x6f\x7a\x79\xbe\xd7\x93\x94\x8e\x76\x40\xe6\x8b\xea\xdf\xf2\xa2\xc8\xe8\x6b\x22\xfe\xda\x51\x7a\x94\x78\x93\x06\x8d\x4b\xcb\x86\xe5\xfa\x7e\x3a\xb9\x48\xbc\x3d\xd1\x77\xd6\x95\x98\x81\xd1\x9f\x97\x72\xf0\xeb\x4d\x3e\xcf\x1b\xf9\x1e\xa3\xcc\xce\x1f\x0a\xdf\xee\x1a\x7d\x94\x1e\x49\x52\x20\x5d\x81\xe1\x96\x35\xef\x04\x1d\x87\x77\x77\x77\xe9\x1a\xbf\x06\x47\xe1\xc5\xe5\xb9\xf9\x3f\xd8\x9d\x37\xcd\xba\xe8\x28\x09\x4a\x85\x30\x7f\x95\x7b\xa7\xb6\xd8\xc6\x17\x0b\x40\xe0\x8a\x17\x24\x20\x6c\xc7\xb2\x77\xd1\xa0\x3b\x27\x6f\x41\x0a\xc6\xc6\x70\xbb\xe0\xd0\x4f\x78\xc7\x71\xf8\x0e\x3b\x8a\x61\x61\xc1\x7a\x1e\x44\x77\x58\xce\xee\xb4\x5a\xaa\x04\xaf\x43\x11\x3c\x5c\x3a\xf6\x27\xc9\x1e\x9f\xb8\xf0\x5d\xf8\x61\xcb\x9d\x0b\xdd\xf1\x7c\x60\x82\x7d\x15\x5a\x7b\x02\xad\x45\x69\x79\xf3\x6a\xde\xcc\xa0\x4d\x66\x2c\xc2\x57\x90\x21\xc2\x3a\x23\xba\x3a\x03\x0d\x0c\xbe\x09\x35\x54\x30\xe6\x0b\x24\xbb\xb4\xd6\xe0\x06\xc2\xf8\xf8\xf6\x5a\x55\x2b\x68\xe1\xab\x54\xee\x0d\x18\x55\x23\xe7\x64\xb8\x50\x8b\x9b\xac\xcc\xf5\xda\x17\x0d\xad\xed\xaf\xac\x11\x59\xdc\x93\xbc\x0d\xaa\x43\x81\xd7\x5d\xad\x1a\x10\x80\x5b\xaa\x5b\x55\x54\x1b\xf0\x6b\xc8\xc6\x27\xba\x2f\x70\x7d\xfc\x5b\xb1\xda\x06\xb1\x29\xcb\xac\xc9\x5c\x09\xca\x51\xfa\xda\xb4\xef\x57\xb5\xd8\x42\x99\x88\x6d\x08\x1f\x53\xae\xe5\x2c\x99\x68\x3e\x1d\x14\xe6\x23\xd0\xd3\x37\xa9\xdc\x1b\x9a\xe5\x9a\x15\xf2\x0c\x5b\xa6\x1e\x2f\x68\x69\xb1\x03\x8b\xd6\x33\x6c\xb8\x8e\xbd\xd0\x42\xcf\x5c\x9c\x6a\x7e\xef\x36\x68\x1f\x5a\xf3\x36\x95\x7b\xe7\xc6\x83\xac\xbb\xca\xb2\xac\x3e\xbe\x99\x7b\x15\x75\xd7\xf8\xc5\xd1\x4c\x62\xe5\xdb\x82\x5e\x1c\x57\xd6\xef\xaa\x02\x77\x63\xfc\x83\x2b\x29\x62\x0b\x14\xa0\x2c\xa8\x3c\x09\x0d\xfe\x01\xb6\x37\x7e\x8c\x4f\x05\x65\xcf\x82\xb8\x23\x84\x53\x5c\x12\x71\x9d\xfd\xca\x62\x03\xc2\xd3\xf2\x5a\xc0\x38\x99\xcf\x60\xc0\xd1\x1a\xcf\x69\x90\x31\x19\x68\x5c\xcd\xed\x9c\x7c\x12\x58\x71\x38\xac\x89\xe0\xfc\x80\x61\xce\x0f\xb3\xfb\xe4\xb3\xe6\x25\xf4\xe1\xc7\x54\xee\x05\x7b\xc5\x57\x0c\x79\x97\x15\xf8\x25\x6b\xb9\x54\x85\x6a\x82\xaa\x1c\x22\x81\x5c\x00\xf9\x95\x13\xb3\x04\xf0\x5a\x4e\xcb\xae\x63\x57\x63\xc0\x88\xca\x72\xc2\xf3\x4c\x7e\xbe\x51\xa5\x08\xd7\xb2\xb6\x77\xd5\x12\x6b\xea\xb4\xaa\x73\xac\xed\x5b\xe5\x05\xd8\xcd\xc1\x43\x64\xae\xdf\x09\xf1\x1e\xcd\xf6\x52\xdd\xa1\xba\x89\x43\x51\x81\x1c\xa1\xf5\x24\x3b\x0f\x43\x0c\xb3\x74\x36\x4f\x88\x3e\x3e\xf7\xd1\x91\x59\x58\x16\x4c\x48\xd2\xc7\xa2\x34\x0e\x29\xf0\xe8\xfb\x8e\xd2\xa3\x43\x5e\x74\xc6\x8f\x4c\xbe\xbb\x00\xf1\xb2\xde\x6c\x1b\x73\x87\xdb\xd3\x06\x96\xbf\x95\x56\x14\x4b\xa5\x17\x75\x3e\xf7\x75\x28\x4f\xdd\x9d\x66\xd8\xc3\xeb\x02\xf3\xe3\xe6\xc1\x49\xbc\x54\x8d\xb7\xb2\x3b\xdb\xee\xe2\x09\x45\xad\xb2\xe5\xbd\xdd\xc6\x38\x0e\xe1\x26\x0d\xf6\x25\x0c\x83\xd9\x6d\x97\x19\x44\xd3\x4e\x81\x0b\x93\xaf\xd5\x0d\xfe\x01\x40\x01\xfb\xba\x97\x40\xcd\x45\x75\x57\xa2\x25\xe3\x6a\x2e\x84\xdb\x28\xed\xa0\x00\x2b\xc5\x4a\x48\x04\x28\x41\x9a\x5b\x4d\x65\x3e\xd9\x06\x6a\x63\xb7\x9a\xf8\xae\x13\x0b\x09\xa3\xb7\xfb\xb3\x40\xda\xc2\x28\xba\xf6\x8e\x4c\xe3\xd9\x80\xf3\x53\x76\x03\x58\xc5\x9a\x4a\x77\x3d\x63\x1c\xdb\x04\x2b\x47\x40\x24\x42\x2e\x7b\x10\x92\x0d\xc8\xdc\x8b\xc2\x98\x4e\xdb\x42\x69\x99\xfb\x25\x9f\xc8\x4d\xb1\xa5\x5d\xed\xe4\x52\x05\x68\xec\xac\xb2\x85\xc2\x4a\x5a\x5c\xd2\xb4\xab\xcc\x62\xd9\x34\x64\x05\x00\x05\x0a\x42\x10\xcd\x32\xcb\x0b\x1b\x3a\x31\x8b\x49\x37\x59\x51\xb8\xfb\x38\x33\x86\x97\xbd\x9d\x20\x3b\x41\x70\x58\x58\x8d\x2e\xd1\x62\x8e\x32\x44\x82\xe4\x40\x31\x95\x5d\x9b\x66\x36\xec\xe0\x10\x1d\x07\x07\x5e\x66\x77\xaa\x28\xb0\x9e\x26\x61\xfe\x6f\x78\x25\x78\xda\x3d\xb2\x3e\x5e\x68\x81\x32\xde\x68\x0d\xf2\xc5\x4f\x56\x1f\x00\x59\x4c\x9b\x6a\xa5\x35\x71\xf1\xd7\x8b\x9b\xfc\x36\x2b\xa8\xa8\xda\x26\x78\x04\xe5\xa9\xea\x6a\x53\x03\xd7\xe0\x52\xd9\xef\x11\xa9\xed\x52\x1d\xe0\x77\xa1\xa4\xda\x6e\xc8\x5c\xcb\x3b\xe3\xef\xdf\x33\x1a\xa9\x15\xd0\x66\x52\xf0\x14\xd7\xca\xb1\x2d\xde\xdc\xaf\x6a\xf8\xaf\x7a\xaf\xb7\xab\x90\x33\xa3\x28\xd8\xae\x82\x4e\x54\x11\x48\x28\xda\x1f\x88\x79\xb3\x1b\xc2\xde\x87\x49\x5b\xb4\x43\xae\xb6\xbc\xf0\xb8\x85\xe7\x85\x02\xf6\x98\x03\xef\x8d\xd9\xac\x1f\xaa\x9a\x37\x0e\xd0\x22\xd8\x2f\x4b\x04\x83\x2a\xf3\xb6\x4e\x16\x2f\x78\x58\x65\x1a\xa4\xdc\xe9\x1f\x05\x1c\x09\x36\xd1\x65\x8b\x1e\x01\xef\x61\x17\x25\x84\x5e\x2c\xa7\x63\xbb\xfe\xdb\xaf\xee\x44\xee\xd1\x77\xec\x0e\xdc\xcf\x7a\xb8\x0b\xab\x3b\x33\x4e\x44\xa3\x59\xa1\x34\xbf\xf9\x6f\xb8\xb5\x81\x33\x13\xd3\x95\x56\xfe\x01\x49\xc1\xca\xcc\x13\x54\x63\x92\x0f\xba\xe3\xae\x72\x81\xb0\x3a\x64\x95\xe6\xe1\x1b\xe8\xcf\xfe\xbc\x87\xb5\x9c\x54\xde\xcb\x24\xb6\x56\xf9\xaa\x81\xb8\xd3\xc2\x3c\x7d\xff\xf5\xe1\x3f\xf4\xac\xb9\x5b\x6d\x1b\x17\x4c\xd4\x37\x59\x8d\x8e\xc3\x5c\x95\x6a\x85\xdc\xdc\xc1\x23\x59\xab\xd0\xc2\x39\x4e\x83\xd5\x1f\x5b\x3f\xc7\xc6\xa3\xe0\x0e\x05\x16\x8b\x0a\x11\xa4\x80\x3d\x84\xc6\x1c\x22\x90\x88\xdb\x62\x68\x7b\xa3\xcc\x6f\xe9\x80\x44\xb3\x9b\x3f\x0d\x8b\xc5\x44\xbb\x6a\xf4\xe0\xd1\xb2\x51\x07\x30\x12\x66\xdc\x70\x21\x04\x17\x82\xc3\x0e\x39\x43\x0f\x0f\xcd\x04\x35\xad\xf1\x34\x52\x45\x41\x12\x30\xc1\x65\x2b\x02\x0f\x86\xb7\x98\x8e\xa4\xac\xa8\x4a\x70\x2e\x5e\xc2\xe2\x08\x9c\x2a\xa4\x1e\x6d\x34\xff\x9e\x73\x98\xf7\xb9\x7d\x6a\x27\x84\x7d\xbb\x97\xd8\xea\xbe\x04\xcb\x84\x4d\x13\x13\xaa\xad\x32\xc7\x83\xce\x0a\x95\x20\xd9\xbd\x69\x64\x62\x1b\xe1\x43\x81\xcb\x5c\x53\x50\xf6\x9d\x3c\xea\x3d\xe4\x9a\xf1\x06\xee\x77\x18\xce\xa8\x91\x24\x8f\x7b\x5d\x8e\xe3\xee\xe7\x72\x3f\xaf\x73\x34\xe4\x93\x47\x23\x15\x62\x7f\xd1\xe3\xc9\x48\xdd\x51\x32\xa8\xcd\x3a\x35\x7b\x17\x5a\x9b\x1e\x9b\x15\x61\x8e\x58\x4c\x4e\x03\x59\x7d\x89\x38\x7f\x73\x3e\xf3\x86\x60\x11\x36\x26\x2d\x3c\x91\x8e\x15\x7d\x8c\xaf\x5e\xd3\x9a\x65\xaf\x15\xc3\xf7\x54\xea\xf8\x66\x04\x1f\x00\x7e\xb9\xe1\x3c\x7f\x9e\xfa\xd3\x4c\x8c\xb0\x49\x0a\xb8\x0b\x5b\x0b\xed\x06\x28\x2d\x0a\xd5\x70\x41\xf0\x8e\x31\xfc\x49\x1e\xf7\x84\xe3\xe9\x78\xf8\x93\x27\x3d\xd4\x79\x67\xd4\xdf\x8c\x01\xf8\x9d\xcc\x7b\x82\x6f\xe6\x96\x52\x4e\xd7\x14\x9a\xe7\xe5\x5d\x0b\x44\x3c\x6d\xe1\xe1\x02\xc1\xbb\xdc\xdd\x8d\x56\x83\x8f\x98\x6f\x45\xfb\x06\xb7\xef\xef\x79\x1c\xde\x52\xdd\xe6\x0b\xa5\x7f\x32\xbf\x79\xf5\xc8\x91\x60\x4e\xe2\xd8\x4b\x46\xe0\x88\x63\x37\x7f\x5a\xf3\xcd\x92\xc8\xec\xcb\xba\x4f\x3f\xab\x45\xc6\x9c\x6f\x5a\x18\x96\xee\x7d\x9d\xd5\xbf\xf4\x98\xc1\x88\xad\x63\x61\x16\x54\xba\x4d\x7c\x0d\x38\x85\xc4\xee\x13\x06\x54\xb7\xf8\x74\x56\xe7\x98\x95\x4b\xc1\x80\x06\xed\x48\x8d\x25\xa3\x98\x13\x2a\x85\x8f\x70\xe7\x89\x20\xe8\x00\x04\x83\x8f\x33\xcd\xcc\x33\x9d\xeb\x84\xcf\x66\x14\x76\xc9\x22\x47\x1d\xcf\xad\x90\xdc\x98\xb9\xfc\x24\xea\x22\xa5\x3c\x49\xc3\xb8\xcb\xd8\x67\xa9\x80\xc8\xe0\x38\x95\x7d\xb4\xa0\x1c\x00\x80\x07\x37\xc0\x47\x0b\x9c\x42\xb4\x2e\x58\x85\x1c\x20\x7b\x04\xfb\xb5\x0b\xbb\x39\xf9\xcb\x28\xbf\x92\x07\x01\x14\xb4\xd5\x1f\x21\x0e\x91\x7e\xe4\x2c\xf8\xc2\x16\x5c\xeb\xd0\x50\xf6\xb2\xe7\xb5\xb8\x85\x82\x6c\x17\x44\x92\x8f\x06\xa3\x18\x01\x7c\x53\xc9\xbb\x9b\x6a\x0d\x45\x0e\x50\x3f\xdd\xfd\x16\xd7\x2b\x3c\xed\xf3\x55\xdc\x59\xd3\x86\x1d\xef\x15\xee\xbd\x09\x0e\x15\x21\xd3\xfc\x97\xe1\x94\xb3\x48\xf0\xe6\x4e\x15\xb7\x4a\xee\x1f\x1d\xf7\xe4\xba\x2a\x9b\x1b\xcb\x3c\xeb\x0e\xe7\xbc\xb1\xc1\x8d\xe2\x5e\xce\xd5\xc2\x8c\x92\x7b\x18\x72\xcd\xd8\x87\xe9\xfc\x57\xb9\xff\x26\x7a\x50\xc6\x42\x21\x22\x90\x8f\x0f\x42\x91\xe1\x82\x70\x6c\xed\x51\xc7\x6d\xd5\xa2\xaf\x4f\xc3\x82\x61\x73\x44\xb5\xb5\xcf\xf4\x96\x20\xe7\xe4\x05\xf3\x05\x62\x5b\x82\xc3\xc3\x84\x16\x05\xa7\x8f\x7f\x7c\x72\x73\x73\x12\xe5\xe0\xc6\xd9\x78\x6c\x88\x33\x3e\x49\xcd\x76\x51\xe8\xb0\x75\xdd\xd4\x29\xd3\xa6\x07\x3b\xd6\x58\xfe\xc1\xc6\x84\x65\x93\x2f\xc0\x86\xe6\x5b\x81\xfc\x3e\x98\x5e\x8c\x62\xd8\x08\x98\x8d\x70\x61\xc5\x8d\xa6\x22\xab\x25\x53\x68\x16\x74\x6e\x86\xfb\x1f\x6d\xe8\x0c\xf9\x26\xe1\x2a\x84\x07\xa4\xad\x2a\x79\xd4\x27\xc7\x0a\x02\x26\x1e\xee\x86\x3a\x8a\xf9\xc8\xa5\xaa\xf3\x5b\xe3\xd7\xa3\x81\x0e\xb2\x2b\xce\x86\x07\xcd\x15\x73\x4f\x86\x91\x17\x87\xbc\x24\x6b\xb1\x1d\xc8\x44\x0f\xd7\x3a\xd7\xb6\x2a\xc6\x1a\x0a\xf4\x79\x11\x04\x3e\xad\x43\xc1\xd6\x02\xba\x5f\xc6\x50\xa0\x78\x01\x85\x5b\x50\xb7\xb1\xbd\x3f\x11\x8f\x82\xa9\x6d\x3b\xe0\x59\x48\xf8\x09\x78\x32\x8a\xe8\x30\xb8\x17\x5c\x8d\xcc\xfa\x17\x1d\xf6\x0c\x9a\xf9\x27\xe9\xab\x54\x0e\xf9\xed\x75\x69\x6f\xaf\x0b\x90\xb1\xd4\x68\x66\xf3\xeb\xa1\x7f\x39\x44\x9e\xf1\xc0\xaf\x8e\xee\x17\x37\x7f\xa5\x85\x76\xc1\xa9\xb1\xa9\xab\xeb\x3a\x5b\xaf\x91\x63\xc7\xc6\x1d\xcc\xb8\xc4\x26\x90\xaf\xa7\xa8\x56\x91\x3d\xa5\x69\x99\xe2\x6e\xf4\x0c\xdc\xbc\x5a\xc2\x15\xd8\xe0\x5a\xe9\x5f\x0e\x93\xe0\x15\x5e\xc4\xda\xf2\x31\xc0\x91\x9d\x97\x48\x80\x41\xa3\x0c\x60\x0a\x40\x67\x9b\x65\x4f\x57\xfe\x0c\xf6\xdd\x25\x58\x4a\x68\x5e\xc4\xa3\x11\x75\x80\x48\xb1\x02\x8e\x6b\x11\xec\xdf\x17\xfa\x61\x13\x22\x82\x76\x76\x70\x79\x08\x46\xcb\xd1\xba\xd0\x03\xb7\xdc\xd8\xcc\x47\x66\x85\x1c\xa7\xc7\x1d\x63\xe2\xe9\x29\x1a\xf5\x6b\x83\xdb\xdd\x25\xd8\xf8\xc9\x16\xd0\x54\x23\x99\xae\xdc\x83\xc1\xda\xa3\xd5\x69\x57\xa6\x46\xa5\x7e\x33\x54\x6e\xf3\x93\xa1\xe9\xa5\xb5\xf1\xcf\x79\x29\xf5\x76\x65\x1c\x58\x33\x75\x4b\xd5\x64\xc0\x09\x0f\xe3\xe7\x05\x57\x01\x79\x61\xc6\x17\xaf\x39\x7b\x3e\x2d\x9a\xd6\x44\x54\x73\x8c\xf5\xc2\x90\xc4\x25\x3a\xe6\xee\x89\x0f\x90\xe8\x22\x00\x5b\x9c\x45\x4c\x5d\x31\x68\x3c\x76\x08\xf9\x32\x67\xd5\xc6\x9c\x3a\x68\xa4\x45\xeb\xc7\x52\xc4\x10\xb7\x4d\x30\xf4\xe0\x88\xb0\x0b\x88\xc5\x2a\xcb\x25\x21\x77\x9a\xec\x17\x65\x0d\xe6\x46\x6d\xb4\x97\x1c\x07\xf2\x79\x88\xe9\xf0\x78\xd4\x3a\xcb\xc1\xc9\x2d\x30\xeb\x5a\x8b\x52\xdd\xe9\xeb\xba\xda\x6e\x74\x8f\x6f\x9c\x45\x56\x98\xbb\x91\x00\x81\xb8\x05\x08\x4a\x7e\x77\x53\x85\x9a\x17\x41\xac\x16\x26\xa6\x54\x77\x6c\x64\xdd\x8d\x8a\x23\x0f\x39\x63\xe3\xc8\x45\xa5\x5c\x61\x6c\xc1\xd7\x5c\x51\x99\x95\xf7\x02\xa0\x40\xbb\xd2\x08\x39\xd2\xdb\xac\x04\x56\x6a\x3f\x0d\xaf\xc0\xfb\x43\xc7\x8b\x3f\x72\xae\x8a\x5c\xdd\xda\xca\xe9\x07\x4e\x2a\x38\x45\xc2\xbf\xbb\x1c\xb1\x4d\xb9\xee\xeb\x9e\xf5\xb6\xe3\x5d\xce\x56\x2b\x6d\xc4\xa0\x54\x2b\x4e\xba\xb4\x83\xda\x27\x29\x14\xba\xd1\xe6\x1e\x61\xad\x27\xbb\x08\x97\x5b\x3c\x3d\x71\xb3\xfb\x2b\xc3\x07\xe6\x29\xad\x29\x60\x89\xd1\x9d\x14\xd8\xc1\xc3\x15\x69\xbe\x70\xf5\x47\x28\xe4\xda\x36\xb8\x33\xd8\x4d\xc4\xd3\xb6\x81\xa5\x0b\xf7\xfe\x56\x61\xb0\x59\xfb\x44\x0f\xa9\x45\xb4\x6e\xee\xf0\xc1\x22\x93\x45\x45\xdb\xcc\x2b\xe5\x7b\x8a\x68\xbc\xa1\xab\xfa\xbe\x67\x6b\x10\x41\x8e\x4d\xa2\x7a\x28\x00\x01\x7f\x51\x20\xe6\x24\x8a\xaa\xc2\xb2\x3e\x7c\x8c\x15\x2a\x08\xc9\x2f\x96\x01\x5f\x17\x9f\x71\x33\x99\x54\x0c\x2e\xb2\xe5\x12\xb5\x0f\xe0\x3e\xcf\x74\x98\xe5\xb6\x89\x3a\xea\x44\x70\x10\xf8\xac\xa5\x67\x85\x80\xeb\x84\xcf\x17\x0f\x90\xe2\x95\x1f\xde\xe3\x36\xe5\xcb\xc7\x19\x7a\x2f\x82\x8b\x9d\xb3\x24\xf8\xba\x36\x7f\xc1\xd3\xef\xc0\x56\x20\x18\x5e\x78\xd9\xdb\xda\xf7\xc5\x4d\x55\x21\x34\x1c\xc2\x4a\x8e\xb5\x8c\x44\xf8\x33\xb9\x52\xa4\x50\x65\x41\x9c\x89\xc5\x82\x24\xc0\x02\xba\x2e\x41\xbf\xa8\x66\x4a\x45\x1c\x3a\x18\xb1\xa4\xf9\x76\x63\x0c\x81\x35\x49\x7e\xa2\xfa\x18\xd7\xb6\x65\x25\x75\x85\x5c\x1c\x55\x89\xca\x2b\xd5\x5d\x29\xe7\xea\x26\x2b\x56\x09\x21\x98\x41\x7a\x0a\x7f\x15\x59\x5f\xde\x5a\xb3\xa8\x40\xee\xab\xfb\xd5\x09\xa0\xeb\xbc\x31\xfe\x7e\x55\x6c\x1b\xb3\xa4\x16\x85\xca\xc8\x3d\x77\x45\x1a\xae\xff\xa2\xdd\x7f\xb9\xa3\xff\x66\x87\x59\x6e\x46\xaa\x47\x82\x68\xa1\xe3\x0e\xb1\x5c\x79\x80\xc1\xc5\xa3\x16\x1e\xb9\x7a\xc8\xee\x44\x76\x90\x20\x74\x45\x28\xd8\x40\x4f\x6b\x5b\xd7\x0f\x59\xb0\x76\xb7\xf0\xe7\xd0\x06\xd4\xdb\xa2\x61\xdc\x45\x9d\x53\x1e\x76\x19\xbd\x5c\xac\xb7\x5a\xa9\x1a\x0e\xb1\x37\x91\xaf\x5e\xad\xb8\x45\x4b\x31\x1b\xdd\x45\xea\x12\x2c\x0c\x91\x07\x96\x30\xa6\xc2\x48\x5c\x1f\xc1\xfd\x70\x50\xae\xed\xa2\xf2\x17\xc1\xd1\xc1\x49\xfa\x1a\xc1\xad\xe8\xd1\xa9\x86\xa8\x60\x23\xff\x23\xb1\xce\x2e\xf2\x3b\x58\x37\x83\x36\xb9\xf1\x31\x3a\x9c\x39\x11\x38\x73\x5d\xc9\xb9\x40\x44\xff\x31\x36\x19\xc1\x52\x75\xb4\xcf\x9d\xd3\x76\x53\xdd\x59\x01\xb6\x9a\x89\xc2\xac\xb6\xc5\x2a\x87\x2c\x08\xd8\xf9\x7e\xd7\x89\x60\x18\x8e\x31\xb1\x45\xbd\xb1\x41\x8c\x45\x55\xea\x4d\xbe\xd8\x22\x67\x27\x75\x7a\xd9\xf2\x43\xba\xe3\x04\xc9\x0e\x2f\x04\x60\x4a\x85\xf9\x4b\x9d\x15\xdd\x3e\x89\xe8\x38\xba\xf8\x31\xd5\xf2\x4b\xba\xd6\x07\x38\xc8\xae\x55\xdc\xb7\x8f\xf1\x1f\xad\x23\x91\x6a\x4b\x9c\xe9\x6d\x75\xca\x30\x07\x98\x50\xe4\x07\x8e\x46\x72\x70\x71\xbe\xbc\x54\x0b\xc5\x55\x39\xda\xbd\xad\x84\x9f\xd5\x4a\xb4\x51\xc0\xbb\xe7\x9f\xac\xe0\x2c\x28\xe7\xb6\xb7\x81\xe8\x88\xd4\x78\xf9\xd2\xa6\x51\xeb\x0d\x64\x5f\x20\x4f\x0d\x71\x91\x82\x8c\x59\x7f\xe0\xbe\xd0\xd6\x1a\xe9\xc8\xf2\xdb\x87\xba\x90\x31\x0d\x96\x56\x80\xf3\x6e\x6e\x1c\xfb\x69\x44\x90\x15\x47\x14\x3b\x1a\x6a\x07\xbc\xad\x75\x13\x9c\xc0\x62\xc7\x09\xdc\x30\xae\x21\xf2\x21\x72\x4c\x80\xc4\xd3\x00\xa1\x18\x3a\x6d\x45\x78\xda\x42\xe5\xc0\x03\x07\x61\xe7\xe5\x40\x09\xa9\x6f\x3f\x9a\x43\xd9\x48\xf1\xcd\x47\xb3\x8d\x90\x98\xcf\x88\xae\x93\xf7\x6d\xca\xa3\xa7\xec\x88\x75\x2c\x60\xec\xcf\xc8\xef\xb1\x9e\x23\x02\x25\x38\x79\x59\x00\xf7\x79\x88\x29\x12\x1e\xe4\x4b\x43\xf0\x57\x22\x5e\x27\x2f\xaf\x0b\x88\xb5\x2c\xb7\xe0\xa7\x95\xd6\x7c\x5b\x64\x56\x9f\xc5\x5f\xd0\xda\x2a\x57\xf1\xf3\xbe\x95\x74\x36\x4b\xc0\x1f\x8b\xd6\x98\x6a\xc7\x39\x20\xc4\xe1\x2e\x2f\x63\x1c\xad\x37\xc5\xbd\x3c\x43\x63\x76\x8a\xf2\xac\x28\x42\x7b\xbd\x75\xf4\xc0\xce\x6a\x06\x16\x2c\x1f\xef\x33\x2d\xb5\x62\x30\xf7\x9e\xb8\xe9\xa1\xd2\x63\x11\x97\x11\x81\xcc\x36\x6c\xdd\xa2\xf3\x32\x21\x3b\xdb\x29\xc7\x3a\xbd\x65\x90\x32\x21\xc2\x61\xdb\xd6\xd0\xfe\x7e\x07\xa1\x27\xde\xba\xdd\x13\x47\x64\xcc\x21\x10\xcd\x79\x08\x3f\xb9\x78\x55\x10\x62\x62\x54\xc5\xce\x9b\x37\x0b\xc6\x3c\xea\x9e\x4a\xf5\x88\xf3\x84\xdf\x6c\xf6\x2a\xe2\x97\x4f\xe4\x1e\x3b\x03\x5b\x04\x9e\xf6\x2b\xac\x2f\x8a\xbf\xef\xd0\x0b\x3c\x10\xa1\xbb\x1c\x20\x5b\xc4\x12\x93\xda\x55\x60\xc2\x53\xcc\xc4\xaf\x02\x3f\xb2\x54\xe7\xc7\xba\x21\x6c\x33\xbc\xdf\x57\xdc\x53\x9c\x82\xd6\x20\x17\x39\xab\x56\x12\x88\xd9\xb3\xfa\x5e\xea\x5f\xa0\xa0\x1d\x70\xcc\x28\x1d\xc6\x8b\xd1\x24\xa3\x3d\xe9\xfb\x80\x59\x07\x3a\x31\xac\xa2\xf7\x58\xf0\x05\x0f\xe1\xee\x38\x6b\x8c\xc7\x9a\x35\x4d\xb6\xb8\x41\x3b\x42\x74\xf9\x93\x8e\xca\x18\x2f\xfd\xf6\x7e\x7a\x93\x3a\x83\x4e\x06\x55\x64\x0a\xa5\xb7\x53\x39\xc0\x82\xcd\x6a\x25\x47\xea\x8e\x59\x7f\xe3\x72\x11\xad\x74\x17\x2f\x70\xd5\x2e\xf6\x0e\x11\x2c\x68\x1f\x19\x5e\x81\xaa\x13\xd4\xcd\x15\x77\xd9\xbd\xf6\xe5\xca\x98\x36\x33\xfb\x17\x83\x6d\xd1\x16\xc8\x1a\xfb\xc4\x94\x3d\x42\x57\xcc\x41\x32\x5f\xa7\x63\x99\xb5\xb6\xe3\x69\x78\x36\xdb\xcc\xc3\x8e\x96\xb2\xde\xcd\xef\x1d\x72\x3d\x15\x23\x72\x98\x18\x3a\xd7\x82\xe9\x6f\xb2\xa8\x68\x9d\x85\x94\xa8\x74\xd7\x97\xc8\x37\x55\x08\x97\xb4\x3e\x70\x67\xc1\xee\x1b\xcc\x14\x84\x0c\x07\x31\x77\x24\x91\xcb\x65\x1e\x81\x1f\xf4\x8c\x9d\x6d\xfb\xb8\xe0\xee\x69\x1c\xc1\x5a\x5f\x56\x81\xee\x12\xea\x30\xe7\x8d\x5b\xa6\x16\x8e\xf8\x7c\x18\x60\x8f\x5d\x15\xe6\xa0\xab\x15\xb8\xee\x60\xd5\x59\x53\x03\x04\xa1\xd1\xb8\x12\x9b\x9b\x1a\x0a\x1c\xf6\xec\xc0\xee\x25\x12\xea\x11\xa4\x4b\xc2\x97\x2b\xc0\x85\x14\xf7\x52\xe7\xeb\x1c\xe4\xab\xe1\x4b\x4e\x8a\x1a\x8a\x32\xcd\x99\x74\xcf\xdf\x62\x53\xd5\x4d\xc5\xca\x2a\x82\x4f\xa0\xed\xa2\xdb\xc6\x4b\x4f\xd8\x93\x95\xd7\x71\xa1\x63\xca\x6c\x21\xe8\x54\xb4\xa0\x0a\x5f\x30\x0b\x91\x4d\xb1\xdb\x58\xda\x59\x99\x91\xca\xfd\x0f\x39\xe2\x5f\xe8\x10\x06\x92\xaf\x5d\x0e\x75\xd2\x46\xc6\x72\x5b\xc5\x3e\x22\x0a\x92\x88\xe0\x4c\xf1\xb5\xdc\xf8\x16\x92\x0e\x61\x95\xca\x44\xea\x17\x23\x0f\x38\x4d\x41\xda\xb3\xcc\x22\x56\xab\x67\x30\x91\xe3\x0f\x96\x8a\xe5\x4b\x2a\xc4\xe9\xf8\xe7\xc1\x64\x70\x26\x4f\xc7\x67\x83\x4e\xcd\x1d\xce\x81\xf2\x00\x31\x8e\x7b\xa6\x78\x80\x16\x67\x70\xc6\x88\x71\x92\x47\x98\x71\x18\x61\x8c\x98\x7d\xea\xcf\x88\x10\x27\x6c\xee\x87\xc9\x00\x08\x59\xce\x06\x1f\x06\xa7\xb3\x69\x22\x2f\x06\x93\xd3\x4f\xfd\xd1\xac\xff\xfe\x7c\x90\xc8\x0f\x43\x24\xb2\xe9\x03\x41\xcd\xf0\xf4\xea\xbc\x3f\x11\x97\x57\x93\xcb\x31\x52\xba\x8c\xc6\xa3\x83\xe1\xe8\xc3\x64\x38\xfa\x38\x1c\x7d\x44\x59\x9c\xc1\x68\x36\x9c\x0c\xe4\x64\x38\xfd\x27\xd9\x77\x1a\x3c\xff\x7c\xd5\x07\xea\x96\xfe\xe8\x4c\x5e\x0e\x26\xa0\x89\x34\x3a\x1d\x08\x62\x77\x89\xdb\x65\xfa\x23\xbf\x8c\xaf\x52\x39\xfd\x34\xbe\x3a\x3f\x83\x21\x09\x3e\x64\x06\x7a\x40\xed\x1e\xfe\x3c\x90\xc3\x11\x50\x01\x4d\x06\xd3\xcb\xc1\xe9\x0c\x05\x7e\xf6\x47\xe3\x19\x89\x30\x0d\x67\xc3\xfe\xb9\x3c\x1b\xfc\x3c\x38\x1f\x5f\x9a\x59\x44\xd2\x1b\x94\x1d\x3a\x1d\x8f\x50\x6a\x6a\x3c\xe9\xc9\xfe\x74\x7a\x75\x31\x10\xd8\xaa\xe9\xcc\xd2\x14\x8d\x06\xa7\x83\xe9\xb4\x3f\xf9\x42\x12\x55\x30\xec\x93\xc1\x65\x7f\x08\x0f\x3b\x1d\x4f\x26\x48\xc9\x93\x92\x52\x95\x5b\x31\x82\xad\x18\x20\xd4\x99\x0d\x67\x57\xb3\xc1\xd4\x2c\x06\x33\xa9\xc0\xad\x03\x03\xdc\xd6\x19\x1a\x8d\x2d\x65\x0e\x1b\x00\x61\x47\x89\xc9\x24\x7d\x1a\x4c\x06\xb8\xe4\x88\x7f\x88\xad\x3f\xdf\x14\xc7\x8d\x31\x1b\x4c\x2e\x86\x23\x58\x28\xa8\x06\xee\x8e\x63\xcc\x89\x37\x66\xe3\x37\x36\xce\x34\x07\xf8\xae\xaa\xb1\x1a\xdf\x26\xc7\x38\xb8\x87\xb2\x29\xfb\xa8\x1d\x9e\x97\xd7\x62\xa9\x16\x45\xd6\x54\xf5\xbd\xb1\x25\x41\x0d\x86\xc8\x0e\x74\xcf\xa1\x6e\xbb\xbd\xa5\x10\x1a\xd2\x5d\xe9\x11\x1d\x09\xf6\x81\x90\x9d\x01\xa5\x63\x63\xde\xa1\xbd\xbf\xb0\xa1\x32\x8b\x77\x36\x76\x50\xa6\xe5\xde\x25\x5c\xf7\xf9\x26\x2b\x9b\xbd\x9e\x31\xec\xd4\xb5\x0d\xc4\xbc\xc3\xc4\x1b\x3c\x80\x7d\xec\x45\x37\xb6\xac\x3b\xf5\xeb\xc6\x47\x0b\x8f\xd5\xa6\xd8\x35\xaf\x96\x88\xf8\x88\x6c\x3a\x8d\xbd\x36\x60\xc3\x10\x41\x56\x8d\x92\x04\xc7\xe9\x71\x37\x33\x03\x11\x30\xbf\x21\xf1\x5d\x4e\xc4\xcc\x5e\xe0\xb5\xcd\x8d\x91\x0a\x4e\x43\x7e\xab\x8a\xfb\xc4\x92\x35\xe4\x2b\xb0\x7e\x73\xff\x24\xcb\x39\x07\x0a\xbe\xe6\xdd\xf8\x68\x88\xae\x22\xfc\xe4\x9d\xdc\xcf\x7b\x14\x7a\x64\x64\x0e\x44\xe7\xc6\xbb\x97\x11\x67\x40\x41\x91\x4a\x14\xa3\x76\x74\x76\x82\xb0\x99\xd6\x19\xaa\xe5\x06\xb8\xfe\xca\xa5\x05\x09\x13\x1d\x63\x37\x8e\x2a\x1e\x4d\x70\x66\xf6\xf3\xbc\xe7\xd9\x6f\xe8\x32\x77\xeb\x1d\x17\x73\x17\x15\x43\xc7\xf4\x0b\xbb\xf8\xe2\x17\xc1\x96\x8a\x86\xcd\x0d\x54\x02\x66\xbb\x63\xec\xa3\x2e\xa2\x8c\x04\x71\x91\x32\xc1\x26\xa7\x6f\x1c\x0e\x14\x09\x46\xb1\xd1\x0d\x89\x44\x84\x2b\xa2\x8f\xba\x46\x86\x90\x1d\x80\x32\xe1\x61\x19\xb6\x12\x83\x35\xc2\x29\x59\x76\x2d\xc2\x80\x34\x8b\x93\x69\x35\xe4\x09\x6d\xf2\x3a\xa8\xa1\xc3\x81\xb1\x0b\x13\x15\xca\x18\xcf\x85\x65\xf4\x01\xb4\xa3\x31\x7c\x09\xb7\x97\xc8\x9b\xac\x5e\xe2\x7f\x55\x16\x90\x97\x70\xbb\xf6\xe1\xbd\x6b\x51\xb2\xbb\x70\x1b\x7e\xf3\xca\xce\xcd\x1b\x0e\x95\x1d\x9b\xae\xbd\xdb\x1e\x2f\xec\x4b\x00\x1f\xad\xd5\x6d\xf5\x8b\x5a\x7a\x18\xa9\xc8\x9c\xa7\xb3\x24\x61\x78\x87\x20\x5d\x22\x60\x77\x99\x48\x5d\x15\x80\x3c\x71\xf5\xb2\x30\x18\x37\xd9\x92\x3e\xf5\x00\xd2\x98\xaf\x53\x73\x01\x9c\xb8\x0b\x00\x4f\xfa\x07\x8f\x79\xbb\xe2\x83\x4d\x4c\xe7\x27\xe2\x6f\x7e\xfb\x93\x93\xc2\xd3\x88\xdb\xb5\x8b\xb8\x56\xba\x2a\x6e\xd5\xd2\x67\xf8\xe6\xf7\x3e\xf6\x5a\x4b\xad\x9a\x06\x51\x19\x3d\xe1\x94\xc8\x7d\x59\x9b\x75\x78\xbb\x7a\xea\xf7\x0c\x4d\x3b\x46\x87\xdc\xa1\x74\x9b\x15\x5b\x15\x19\xc9\x0f\x9f\xe2\x3b\x41\x11\xc2\x91\xde\x34\xd9\x2f\xaa\x24\x3d\xbb\xc5\xa2\xda\x42\xa3\x8c\xb7\x0f\x1b\xc9\xe9\x90\xaf\xe1\x2f\x55\x2d\x5d\x23\x70\x9c\xee\x91\x67\xc5\x39\x04\x30\xb3\x10\x8c\xc2\xdd\x77\x4b\x21\x82\x50\x05\x3f\x68\xd5\x0f\xd8\xaa\x1f\xcc\x5e\xc6\x24\xb7\x69\x9a\x2a\x97\x02\xb2\xa3\x0e\xee\xe9\x25\x95\xfd\x9d\xef\x57\x62\x55\x6b\x52\x12\xd2\xaa\x28\x54\xad\x7b\xe4\x30\xdc\x64\xb7\x4a\x80\xfb\x0d\xc4\x43\xa1\xba\x0b\x12\xae\x60\xda\xd2\x3f\x89\x31\xf4\xf9\x29\x64\x44\x7f\x38\x78\x96\x55\x8e\xfd\x05\x8d\x9d\x1f\x53\x66\x14\x1b\x43\xca\xf1\x2f\xa6\x42\xa0\x91\x34\x1a\xcb\xd3\xe1\xe4\xf4\xea\x62\x0a\x32\x8c\xa8\xbc\xe8\xfe\xc4\xc9\x12\x13\xf9\xf9\xd3\x00\x95\x2a\xc7\x93\x99\xdc\x77\x16\xb8\x18\x0d\x3e\x9e\x0f\x3f\x0e\x46\xa7\x83\x5e\x82\xf6\x64\xdf\x58\xa1\x9c\x5e\x33\x91\xd3\x4f\xfd\xf3\x73\x63\x99\x26\xdd\x56\x69\x62\xac\x3c\xd1\xb2\x49\x13\x6b\xad\x3a\x49\xd4\x31\xb8\x21\xdc\x1e\x76\x9f\x99\x5e\x5d\x1a\xf7\xc0\x7c\x00\x0c\x62\xcb\x95\x08\x06\xfc\x60\x9a\x78\x52\x48\xe0\x9f\x1c\x7d\x31\xe6\xf8\x74\x3c\x72\x3c\x90\xc3\xd1\xd9\x70\x02\x26\x74\x17\x23\xa4\x00\x5b\x97\x91\x42\x3a\xf6\x47\x6b\xa3\x7e\xea\x9b\xae\x0f\x26\x8f\xb9\x27\xf4\x3d\x90\x3c\x3d\x1f\x4f\xe1\x01\x1f\xc7\xe3\xb3\xcf\xc3\xf3\xf3\x04\x59\x45\xa7\xb3\xf1\xe5\x65\xff\xe3\xc0\x8c\xe8\xc5\xe5\x95\x79\xe8\x87\xfe\xf0\xfc\x6a\x02\xce\xc7\x45\xff\xfc\xc3\xd5\xe8\x14\x9f\x86\x8d\x07\x02\x4e\x33\xc6\x76\x0c\x2f\x8c\x3f\x13\xb4\x12\x5f\x66\x06\x62\xf0\xf3\x60\x24\x87\x6c\x78\xbe\xd0\x04\x7d\xea\xff\x3c\x10\xc0\x41\x89\xe2\xad\x4f\x23\xa1\xb4\x96\x7b\xe7\x5a\x13\xf8\x64\xd0\xc1\xbd\xbc\x3c\x07\xee\x4f\x4f\x04\x0a\x5c\xa1\x83\xfe\xec\x93\x69\x1e\x4e\x47\xff\x5c\x0e\x47\xff\xf3\x6a\x12\x93\x82\xc2\x3b\x05\xb4\xf6\xc5\x54\xfa\x55\x17\x91\x94\x86\xc4\xa4\x4e\x2e\x75\x8a\x4d\xf6\x8d\x4c\xc5\x74\x7c\x31\x90\xff\xf3\x6a\x32\x9c\x9e\x0d\x61\x2c\xa7\xf2\x6c\x8c\x0d\x3d\x3f\x1f\x7f\xa6\x87\x9e\x9e\x5f\x4d\xa1\x4f\x93\xa8\x87\x7e\x69\xec\x5c\x19\x89\x9c\x8e\x71\x70\xfc\x73\xcc\x3c\xb1\x07\x5d\xf4\xbf\x04\x63\x23\x8c\xeb\x67\xb5\xf9\xe5\x55\x3a\x4d\xe5\x47\xb3\xd8\x47\x17\xa6\x73\x03\xb3\x3d\xa7\x83\xc9\x34\x45\x3e\x88\x56\x5a\x54\xee\x31\x6e\xf8\xbc\x51\xeb\x64\x0f\x8b\xc6\x8d\x19\xa2\xea\xb5\xcc\xbd\x88\x67\x5e\xca\x57\x3f\xc8\xd3\xf4\x43\x3a\x49\xc5\x71\x7a\x74\x78\x24\xf7\xc7\x8b\x26\x95\x47\x3f\xfe\xf8\xba\x97\x58\x12\x09\xaa\xdd\xe1\x0f\x6e\x55\xbe\xee\xc1\x99\xc7\x3e\x22\xda\xc5\xb1\x41\x46\x13\x9b\x05\x17\x85\x57\x4f\xdf\xea\xa8\x55\xf2\xe8\x38\x3d\x3e\x3a\x16\xfb\x53\xb5\xb1\xed\x02\x38\x53\xa0\x9a\x13\x7f\x1c\xda\xe2\x7f\x79\x7c\xfc\x36\x7d\x7b\x7c\x78\x7c\xe0\x68\x3a\x84\xfb\xd5\x2b\xb9\xff\x3f\xb7\xa5\xb2\x3d\x36\xc7\x29\x0e\x39\x84\xc4\xe0\x36\x1c\x94\x4b\x79\xa5\x95\x39\xd6\xb1\x92\xb5\x2b\x95\x53\x1a\x93\x0f\x50\x5c\xad\x04\x9f\xab\xfd\x36\x53\x7a\x94\xca\x8b\xe1\xf4\x74\x70\x7e\xde\x1f\x0d\xc6\x57\xd3\x38\xc6\x1c\xa0\xb3\x14\xa6\x16\x54\xc3\xc9\xd9\x16\x55\xb9\x50\x35\x5c\x88\x56\x90\x61\x0d\xe8\x51\x69\x19\x15\x9e\xc2\x10\x78\xa3\x0a\x1b\x06\x0a\x18\x02\x63\xb6\x3d\xd1\x66\xdb\xc3\xbe\x06\xe1\xfd\x00\x0d\x6a\x83\x6b\x9c\x54\x0f\x68\xd4\x44\x8b\x38\x8f\x07\x1e\x4f\xb3\x22\x5f\x55\x75\x99\x67\xc0\x29\xcd\x18\xdb\x58\xf0\xcf\xbf\x33\x52\x5b\x4c\x80\x28\xbf\xbc\x77\x19\x63\xed\xc3\x7d\xbd\x44\xfa\x7b\x3a\x47\x84\xd8\xaa\xc8\x17\xcd\x41\xb5\x3a\x28\xb2\x3b\xe1\xdf\x95\xca\xcf\x91\xe7\xb3\xcc\xf5\x06\x98\x41\x5c\xce\xdd\x41\xe3\xab\xd2\x42\x2b\x61\xe3\x2d\xf2\x26\xff\x37\x65\xac\x7b\x52\x7b\xb5\x75\x96\x8b\x9b\xac\x6e\x60\xc1\x60\xc2\xc3\x2c\x5d\x02\x97\x2e\x2b\x39\xdf\xea\xbc\x04\x47\x13\x2d\x95\xab\x12\xd2\x24\xd3\x26\x6b\x14\xa4\xe1\xfa\x6b\x55\xe7\x8b\x2c\xa1\x64\xa7\x73\x67\xc2\xdc\x7e\x17\x2f\x61\x28\xd8\x21\xfe\x75\x5b\xe7\x7a\x99\x2f\x38\x29\xc9\x07\xb5\x04\x44\xc1\x69\xb5\xad\x3d\x5b\xcc\xa8\x02\x8a\xc6\x92\x60\x26\x98\x5d\xf0\x13\x94\xe0\xa2\xbf\x55\xe5\x56\x49\x2c\x6f\xcd\x4b\x39\xcd\xca\x26\x93\xa7\x45\x56\x67\xe6\x71\x80\x6e\x61\xdf\xf1\xf9\xb1\xa2\x82\x6a\x59\x18\x3a\x11\x23\xfc\x17\x95\x6e\xf4\x63\xa5\xe2\x0b\xd3\x5a\xfc\x28\xd9\x5a\xce\x36\xcd\x9a\xa6\xaa\x4b\x75\xaf\x5f\xc8\x95\x22\xea\x7a\xf5\xeb\x86\x38\x7a\x67\x9e\xed\x96\x8f\x02\x8d\xf9\x88\xdc\xe7\xd3\xaa\x34\xe6\x22\xb8\x6a\x25\x1a\xef\xd9\xa2\xf1\xa2\x10\xc3\xb2\x51\x35\x1a\x5a\x59\x21\xa7\x19\x42\x01\x3f\x56\xd5\x52\x87\x7a\x7a\xb8\xec\xd4\x12\xca\x63\x04\x89\x85\xb2\x64\x22\x2e\x28\xb7\x62\x3d\x4a\x21\x2b\xaf\xb7\xd9\x35\x09\x0e\xb8\x62\x56\x3b\xb1\x40\x9e\xd6\xd4\x5b\xe3\x24\x92\x3b\x02\xde\x52\x8d\x91\x09\xc6\xe5\x09\xb9\x80\x68\x7d\xd0\x49\x74\x9c\x42\xc0\x70\x3c\x72\xb7\xba\xb9\x8a\x51\x95\x3d\x15\xa2\xaf\x1d\x0d\x64\x77\x42\x3e\x0a\x09\xd8\xc2\x53\xb7\x21\xd8\xc4\x02\x36\x08\xcb\x53\x31\x7f\x1d\xb2\xf9\xed\x2e\x20\x30\xf3\x4e\x0c\x07\xa8\x9a\xe1\xfc\xe7\xdd\x42\xb4\x56\xb0\xc8\xa1\x0b\xee\x9c\xe6\x4f\x1b\xbe\x16\x81\xe1\x75\x24\x8c\x49\x75\x29\xd4\x11\xc2\xa0\x41\x05\x81\xfa\xf3\x36\x47\x34\x06\x94\x64\xa5\xc2\x8a\xd9\xe2\x69\x1f\x68\xd8\x5a\xc4\x72\x18\x80\x67\x24\xf8\xc8\xfc\x41\x82\x98\xa6\x77\x0e\xd2\x40\x73\x75\x92\xca\x0b\x63\x08\x5d\x9e\x0f\x0e\x1c\xd7\xbc\x31\x7d\x53\xd1\x11\x20\x04\x48\x8f\xd2\xf9\x35\x46\xb5\x58\xe5\x67\x2b\xf7\x9d\x69\xb9\x77\xb1\x2d\x9a\x7c\x53\xa8\x03\x1a\xc1\xe5\x5e\x2a\x3a\x7e\xe9\xe8\x13\x68\x8d\xb6\xdf\x8b\x8c\x7d\x1a\xb2\x53\x4d\x45\x33\xa6\xc4\x83\x0d\xc0\x09\x64\x38\x21\x97\x53\xbe\x3c\xb7\xf4\x43\x80\xb9\x29\x21\x7f\x66\x69\x0d\xb5\x3f\xef\x7d\xc0\x64\x27\xea\x83\x4e\xd6\x76\xde\x9b\x01\x4b\x77\x11\x6b\x01\xf7\x96\x3c\xf0\x1f\x45\xbb\x8b\xb3\x8d\xc0\xf2\x83\x87\x67\x75\x4b\x25\xe9\x11\xc2\x2e\x81\xcf\xdf\x77\xdc\x37\xbd\x9f\x02\xf5\x24\xac\x81\xb7\xcf\xa7\x8b\xb0\x1b\xfe\xe4\x32\x37\xee\x01\x08\x0b\xf7\xc2\x69\x41\x96\xd4\x33\x0f\xde\xdd\xdd\xa5\xda\x34\x73\x51\xaf\xd3\x45\xb5\x7e\x39\xbd\x3c\x17\x53\x67\xb5\xf9\x10\x0b\x83\xda\x31\x53\x82\x7f\x00\x37\x87\x4d\xf3\x60\xb5\xa2\x88\xd3\x3c\xa1\xfa\x01\x15\xec\x59\x29\x6a\x54\x42\x2b\x72\x73\x68\x4e\x95\x0a\x5e\x66\x75\x8b\x1d\x33\x99\x3b\x27\xd1\x90\x60\xa2\xda\x4e\xb9\xd4\x32\x6b\xc5\x2d\x27\xfb\x39\xcc\xb6\xe5\xfa\x9d\x9f\x30\xc6\xf4\x86\x9f\xed\x08\xc5\x77\x91\xd9\xe4\x9a\xd1\xa5\x0d\xcb\x45\x2a\xc4\xa5\xdd\x02\xac\x12\xd4\xbd\x07\x31\xf1\x96\x76\x7d\xff\xb4\x27\x8f\x0f\x0f\x5f\x45\xcf\xf8\x49\x80\x48\x2c\x4a\x67\xcb\x89\xd7\x7d\x65\xa7\xd7\xbe\xee\xbd\x93\xff\xf2\xa4\x9f\x54\x88\xff\x35\x1a\xcf\x06\xef\xe0\x46\x84\xe2\x13\xbb\x90\x7d\x1e\x11\xa1\x81\x90\xe5\xd4\x85\x79\x71\x71\xef\xd3\x9d\xfe\x3b\x16\xd8\xa0\xbb\x58\x6e\x80\xda\xa4\x73\x9c\x70\x99\xea\x1b\xc0\x9c\x13\xd5\x83\xd8\xd1\x92\x3a\xf3\xc1\x4d\xf7\x72\xa4\x8c\xa3\x77\x86\x53\xc0\x71\xa4\x2e\x72\x1e\x16\xe8\xfd\x6f\x21\x9e\xba\xe5\xdf\x0b\xe1\xc9\xee\xe4\xac\x8d\x07\x78\x30\xff\x0b\x27\xf8\xd0\xc2\x34\xd2\x04\xd6\x92\xd9\x7f\xfe\x91\x84\x83\x0c\xd9\x82\xd8\x32\x8a\x1b\x78\xd0\x26\xdf\xc3\x0b\x86\xdd\xf7\x9d\xe7\x6c\xdb\x0c\x18\x0e\xd9\xd1\x07\x9b\xa6\xba\xae\x62\xa7\xc4\x21\x22\xb1\xd6\x82\x05\x81\x09\xbc\xd1\x70\xf2\x58\x9e\xff\x87\xf2\x62\xf3\x57\xf6\x2b\xf3\x06\x2d\x6d\x45\x26\xaa\x2b\xc3\xd7\x80\xaf\x25\x42\x2c\x05\xf3\x2a\x62\x82\xba\x54\x08\x8b\x6d\x07\x7c\x2d\xe3\x88\x02\xe0\x2e\x49\x41\x43\x7c\x9d\xa1\x78\x13\x5e\x19\x14\xde\x4a\xc2\xd6\xa9\x33\xbc\xa5\x19\x96\x56\x1d\x32\x3f\xf5\x50\xc6\x13\xa0\x77\x96\x4f\x28\x6b\x7c\xf5\xae\xe5\x10\xb1\x5d\xc9\x48\x85\xd3\xe2\xa1\x2b\xa2\xca\x83\x28\xa3\x2f\xd4\xd3\xa0\x80\x05\x99\x24\x18\xc1\xcb\xea\xce\x02\x30\xc3\xc1\x44\xe8\x98\xe7\x07\x08\xb5\xcc\xec\x48\x42\x29\x34\x72\xdd\x13\xef\xbc\x71\x30\xa2\xf2\xdd\x18\x1a\xc7\x3a\xc9\x5e\x8b\x47\x52\xcc\x43\xc5\xa1\x61\xc2\xd3\x4c\x6c\xee\x21\x08\x6b\xe7\x26\x09\x3a\x23\xdb\x9d\xb1\xa0\x2f\xe3\x91\x11\x72\x2b\x43\x8e\x62\x0a\xac\xce\x15\x56\xb7\x20\x7b\xae\x79\x1a\x40\x43\xe7\x55\xd3\x54\x6b\xb9\x50\x65\x83\x27\x73\xc7\x98\x0a\x1c\xd3\x6e\x82\x68\x8a\xf9\x82\x25\x9d\xaf\x55\x19\x60\xae\x5c\x83\xdf\xb3\x06\x8b\xa0\xc1\xce\x2f\x3c\x3a\x7c\x23\x7f\x95\xc7\x27\x72\x93\xff\xaa\x0a\xa2\x58\xa3\x0e\x2c\x8a\x7c\xe1\xa4\x01\xd8\x28\x88\x68\x14\xf2\x86\x2a\x92\xc0\x16\x06\x14\x87\x9c\x67\x8b\x5f\xcc\xd2\x8e\xaf\xed\x55\x55\x5f\xab\xb4\xaa\xaf\xc3\x81\x16\x9d\xab\x81\xd7\x8f\xd3\x10\xcb\x70\x88\x51\x12\xcf\xcc\xaa\xa6\x01\x16\x34\xb6\x34\x16\x9d\xeb\x74\x77\x2f\xe3\x26\x00\x3d\xf6\x93\x3b\x47\x36\xc9\xef\x4d\x84\x9c\xbe\x2c\xf2\x79\x93\xaf\x56\xbf\x07\xf1\x2f\xfd\x3c\xcc\xff\x7b\x78\x7c\xf4\xe6\x55\xcc\xff\x7b\xfc\xea\xed\x77\xfe\xdf\x3f\xe2\x87\x19\x60\x8b\x9e\x3c\xfa\xf1\x87\x1f\x0e\x8e\x7e\xfc\xf1\xad\x9c\x66\x6b\x79\xae\x56\xab\x42\xd5\xc6\xd6\x0a\x3f\xf4\xe3\x11\x7d\x28\x2f\xf2\x45\x55\xca\x8f\x75\xb6\xb9\xc9\x17\xda\x99\x7d\xc6\x21\x42\x82\x32\xcb\x2d\x62\x36\x43\x40\x2b\xe2\x44\x31\xa1\xf4\x54\x99\x9d\x67\xae\x5e\x17\x34\x45\xb8\xaa\x16\xed\x62\x36\x88\xf1\x11\x35\x7c\xae\x09\x54\xef\x72\x4a\x4e\x6d\x43\xc5\x55\x14\xc2\xde\x28\xa8\x28\xd4\xd6\xbe\x74\xf2\x34\x1b\xdf\x7e\x3a\x3d\x98\x66\x82\xbb\x41\xed\xfd\x16\x34\xb9\xb3\x8a\x25\x09\x6f\xaa\x32\x5b\xe3\xfd\xcb\x07\x19\x2e\xdb\x68\x3c\xb9\xee\x82\x0d\x11\xa3\xcf\x7c\xab\xea\x06\xb9\xd7\x9c\xbc\x0b\x68\xd4\x51\x68\x4c\x90\x21\xe0\x9a\xc6\xf9\xe8\xad\x17\x91\x84\xcc\xf4\xbc\xd7\x4f\x68\x9b\xb1\x95\x3e\x0d\xe4\x74\xfc\x61\xf6\xb9\x3f\x09\x71\x70\x7b\xfd\xe9\x81\xf1\x83\xfa\xa3\xb3\x16\xd6\x2d\x92\x80\x43\x90\x5b\x22\xac\xf2\x5b\x98\x3c\x73\xe9\xa4\xce\x6c\x12\x93\x81\x83\xc7\x7a\x1c\x1b\xe6\x5f\xc6\x13\xf9\x61\x38\x1b\x0d\xa6\xd3\x16\xa0\x4d\x12\xa0\x2d\x15\x82\x4b\xa9\x61\xc6\x66\xda\xbf\x90\xe7\x83\x0f\x1f\xce\x11\x33\x36\x1d\x9e\x0f\x4f\xc7\x23\xf9\x71\xd2\xbf\xfc\x34\x3c\x9d\xb2\x6c\x5a\xac\xa3\x26\xb8\x8e\x9a\x4d\xaa\xc9\xc7\xd2\x67\x38\x14\x36\xdf\x47\x29\xb2\xcf\x9f\xfa\xb3\xe9\x78\xf0\xf3\x60\x12\x67\x83\x6c\xe2\xec\xca\x8c\xd0\x59\x7f\xd6\x87\x0c\xd2\x64\xfc\x61\x38\x9b\xfa\x64\x25\x20\xf5\x66\x56\x51\x4d\x74\x27\xb3\xf0\x65\x09\x4c\x14\xe9\xc4\x91\x42\x1c\x4f\x64\x25\x5c\xe5\xcd\x3c\x69\x3c\x91\xc3\x91\xe9\xd3\x88\x14\xe9\x00\xba\xe7\xb4\xde\x26\x1c\xed\xe7\xf0\x6d\x76\xa5\x7c\xe7\xf6\xff\x8f\xf4\x93\xbe\x1c\x02\xb9\xf8\xe1\xdf\xec\xfe\x3f\x7e\xf3\xfa\xe8\x6d\x74\xff\x1f\xbf\x7e\x73\xf8\xfd\xfe\xff\x23\x7e\x86\xef\x77\x52\xea\x1f\xa5\x87\x78\xc6\xf7\x4f\x4f\xc7\x17\x97\xfd\xd1\x17\x73\x04\x5c\x4e\xc6\x1f\x27\xfd\x8b\x4e\xdc\xf3\x00\x30\xa6\x53\xb7\xe5\x87\xef\x2f\x84\x88\x84\x05\xf6\xf7\x40\x71\xf4\x62\x30\x9a\xed\xf5\x52\x38\x72\xe0\x20\x9b\x0c\x2e\x27\xe3\xb3\x2b\x3c\x4f\xc6\x13\x8f\x7b\x18\x8e\x47\xc2\x1d\x5f\xf4\x72\x8e\xa8\x9d\x0c\x4e\x87\x97\xc3\xc1\x68\xf6\x62\x6a\x5a\x3a\xb8\x9c\x05\xc7\x8e\x7b\x5b\xea\x98\xf3\x07\x1f\x00\x85\x31\x1e\x4d\xe1\x57\x9e\xd2\xde\x73\xd9\xbf\x03\xed\xb8\x48\x02\x39\x4c\x7f\xbc\xb7\xf9\xab\x8b\x6c\x71\x43\x4c\xe1\xa8\x53\x8f\x7a\x04\xc3\xf7\x17\x7b\x3d\x70\xab\x3c\xbd\xec\x25\x32\xd3\x24\x8e\x7d\x4c\x4a\x39\x6f\xbd\x27\x26\xb2\x4c\xec\x47\xa5\x94\x79\xea\x78\x90\xe8\x8e\x0f\x9f\x99\xe7\xa9\xf3\x84\xe2\x8f\xfc\x14\xe0\xa9\xe8\x29\x04\xe4\xdb\xf5\x1d\x41\xde\xbb\x65\xff\x03\x04\x6b\xdd\xf2\x90\x63\x02\xac\xa0\xf4\xb1\x2f\xf9\x08\x8b\x17\xee\x91\xfa\x05\x3d\x34\xc4\xfa\x43\x4d\xdc\x5d\xa6\x4d\xa3\xbc\xca\x19\x35\xa8\x8b\x7b\x46\x90\x32\x11\x1a\x87\xc0\x9d\xb9\xc0\xec\x7d\xd9\xfa\xec\x0b\x4d\xb5\xfd\x69\xd0\x2a\x4d\x85\x18\xc2\x15\x6b\xef\x18\x10\xcc\x5d\xbd\x13\x60\x4d\x42\xdc\xdb\xb2\x23\x5a\x2e\xe4\x6a\xc5\x52\xff\x6c\x98\x50\xbb\xe9\x5f\xb7\xa5\x17\xa8\x62\x13\x2b\x65\xf0\x16\x17\xb7\xcd\x91\xa2\xa0\x05\xc2\x62\x36\x25\x01\x45\xc3\x87\x2d\x7d\xed\x0d\xca\xf4\x93\xb5\x4a\x2f\x48\xa3\xa5\xef\x15\x23\xcc\x89\x00\xb3\xec\x24\x8d\xb9\x7c\x84\xef\x90\x8e\x1e\x67\x23\xf9\x4b\x62\x45\xd4\x12\x9f\x18\xf0\x65\x5b\xad\x2a\x4b\x5c\x1d\xce\x3c\xe5\x99\x6b\x25\x6c\x62\x3d\x67\xc8\x40\x97\xe8\xd8\x12\xd0\x8f\xf2\x8f\x01\xfd\x27\x50\xce\x15\x44\x10\x71\x77\x03\x82\x4b\x40\xe4\xbf\xf4\x79\x58\xd6\xe6\x78\x67\x72\xb2\x6c\x17\xb7\x8a\x22\x45\xde\xde\x5f\x00\xad\x74\x49\x12\xf1\xb9\x96\x7d\x87\x56\xc8\x18\x97\xfc\xfc\xde\x0c\x2a\xcf\xed\x32\x9e\xea\x44\x56\x98\x37\x59\x10\x6d\x99\x88\x5c\x07\xcc\xf7\xd0\x7c\x75\x34\x33\xee\x42\x48\x74\x45\xd1\xc2\xbd\x89\x2d\x17\x64\x4c\xe6\x66\x94\x18\xf7\x8e\xee\x5c\x80\xbc\x57\xac\x0b\x02\x89\xdd\x7c\x06\xd1\x11\xfe\x7e\x34\xf6\xb8\x39\x7e\x27\xc3\x8f\x9f\x66\x53\x38\x48\x23\x49\xd7\xb0\x50\x94\x3d\x7e\x07\x85\x2f\x3a\x77\x5a\x4c\x98\x04\x65\x40\xd7\x9b\x20\xaf\x6f\x9b\xd6\x97\x79\x79\x4c\xb3\xd2\x13\x5d\x8a\x4d\x6d\xb6\xaf\xea\xda\x2e\x09\xd7\xcd\xb4\x34\x98\xf6\x37\x8e\x0f\xd3\x6f\x08\x24\x51\xf2\xf4\x98\x41\xa2\x98\xd6\x4f\x7c\x1a\xf9\x74\x1e\x7e\x19\x0a\x41\x6d\x4b\x04\xb4\x04\x22\xbc\x9c\xd8\x1c\xb5\xd4\xfc\x9a\x31\xed\xe8\x54\xce\xfd\x03\x87\x39\xe2\xa2\xc5\xc5\x63\x0f\x04\x61\x0f\x84\xdd\xdc\xc3\x4d\x45\xff\xcc\xd7\x9b\xaa\x46\xa0\xbf\x2f\x5b\x73\x12\x25\xe6\x32\x7d\xfa\x90\x3e\x69\xdc\x20\xe0\x1f\x35\xbf\x23\xa9\xd0\xa1\x6b\x13\x9e\x39\x14\xef\xb7\xdb\x27\x5f\x85\x7a\x05\xad\x2f\xe4\xf6\x7a\xa3\x43\x2d\xb8\xef\x11\xd9\x6c\xa3\xfa\x5d\xef\x03\x76\x45\xdd\xa2\x34\xb6\xfa\x98\x14\xcc\x9e\xdf\x0b\x96\xfa\x73\x27\x33\xe2\x41\x3a\x3b\x1d\xa0\x27\xfc\x15\xc0\x5e\xa1\x89\xd0\xc2\x5e\x94\x71\xd3\x40\x44\xd4\x22\xf5\xcd\x3e\x91\x18\xa7\x09\xf4\x32\x61\x81\x38\x82\xc0\x45\x2a\xfd\x9a\xf3\xe5\xca\x94\x74\xcf\x8a\xe6\x06\x34\xa6\x5a\xcb\x96\x98\xbd\xcd\xaa\xa0\x27\x79\xd1\xeb\xaa\x75\x2f\xb4\xb1\x69\x40\xa3\x9c\x69\xbd\xad\xb3\x72\x81\x02\x55\xf6\x41\x9c\xaf\x31\xe2\x72\xf0\x50\x00\x3b\xd9\x2e\x4f\x64\xaf\x2a\xde\x24\xcf\xc6\x8b\x43\xf9\x20\x07\x1f\xc1\xba\xf9\xbd\xeb\x46\x69\x10\x77\x1f\x68\xcb\x08\x5c\xc2\x99\x7a\x9a\x8a\x0d\xa7\x87\xa0\x38\x83\x13\xa0\x80\x8d\xed\x59\x70\xc7\xcf\xe1\xc2\x82\xfa\x12\x86\x8b\x07\x01\x46\xdf\x6a\x36\x46\x61\xe3\x19\x4f\x78\x2a\xfb\x1a\x21\x3c\x3e\x35\xc5\x14\x03\xd8\xf8\x04\x89\xeb\x08\x52\xef\xa5\x25\x71\xf2\x7d\xb7\x2c\xcb\x91\xd6\xdb\xb5\x72\x5d\xd3\x55\xa1\x62\xdc\x0a\x1c\x2d\x8b\x6d\xad\x58\x6f\x1f\x9a\x03\xfb\xac\x52\x29\x10\xd8\xa6\xfb\x17\xe8\xfe\xd5\xaf\xd9\x7a\x53\x28\xfc\x65\x40\x4d\xdf\x22\xe3\x76\xdd\x63\x94\x8a\x59\x51\x54\x77\xac\x13\x21\xe8\x26\x30\xe6\x81\x15\xc2\x3e\x63\xc2\x29\x57\x5a\xbd\xb3\xe8\x4c\x58\x96\xb6\x01\x73\xb5\xaa\xfc\x6a\x6e\x29\x8a\x07\x56\xa0\xf9\x40\xda\x5e\x5e\x11\x61\x9e\xdd\x52\x9e\x86\x2f\x07\x6d\x70\x37\xf6\x9e\xa4\xce\x5f\xba\x96\x5a\xb2\x6c\xed\x46\x7f\x4c\x73\x2e\x3b\x77\x22\xb4\xae\xed\x36\x71\x8c\xbb\xd0\x52\x4b\xe4\x3c\x19\xfc\xf3\xd5\x70\x02\xde\xde\x54\x88\x7e\x44\x7e\xc8\xa9\xc9\xba\x87\x1d\xea\xc9\xa3\x1b\x82\x2a\xf0\x4c\xf3\x77\xd8\xe1\x41\x90\xf9\x9d\xed\x81\x71\x1f\x1b\x82\xab\x90\x8c\x30\x2f\xab\x0f\x15\xb1\x5b\x77\xf4\x4f\xb1\x87\xd8\xe8\xf6\xab\xdf\x09\x91\xa7\xbe\x7e\x08\xed\x14\x3a\x11\x02\x0a\xb3\xd8\x56\x83\x5f\x10\x15\x57\x8e\x3e\xa0\xe0\xb2\xfa\x16\x93\x02\x31\x78\x04\xa5\x04\xc8\x44\xff\x4d\x54\x91\xe3\xdd\xc8\x9b\x02\x2d\x21\x63\x39\xf0\x53\x24\xe1\x8f\x7b\xf0\x19\x6b\x55\x1b\xef\xb4\xb1\xf4\x36\x50\xf5\x97\x37\xe0\x6c\x23\xf9\x05\xf3\x34\x29\x13\xf0\x13\xba\xbe\x7c\x30\x08\x84\xf8\x94\xb1\xf0\x67\xa7\x79\x3e\xc1\xf4\x38\x81\x96\xd5\xe7\xf0\x4a\x1d\x5d\xf2\xbd\x34\xab\x6d\xfd\x5e\x7b\xa3\x6b\x59\x54\x1a\x58\x41\x56\x79\xa3\xa1\xcd\x79\x8a\x4a\xf6\xda\x53\x13\x31\x08\xf0\x0e\x7e\x22\xe6\x67\x84\x0c\x45\x2d\xfe\x7b\x27\x25\x61\x19\x8b\xfc\x21\x08\x07\x17\x2d\xb4\xfc\x36\x6c\x06\xb7\x9b\x2c\xfa\xd3\x6d\x12\x4e\x42\x06\x6d\x6a\x99\x60\x02\xc9\x8c\xcd\xfe\x71\xeb\x56\x69\x60\x1d\x6b\x2a\x0b\xcf\x02\x32\xee\xb0\x24\x72\x9d\x95\x25\x92\x98\xc3\x3b\x11\xb3\x9e\x01\x91\xf9\x76\x2d\x17\x5b\xdd\x54\x6b\x74\x0a\x21\x1d\x02\xfc\x8c\xd6\x1b\x53\xbf\x12\xbf\x33\x6c\x9b\xcf\xb6\x7c\x8b\xb5\xba\xcd\xb2\x1e\x75\x73\x1d\xed\xde\x1d\xf4\xec\x5d\xae\x11\x8d\xe3\x3c\x0d\x50\x67\xc1\x54\x75\x93\xcb\xa0\x58\x20\xc3\xa9\xf9\xa3\xb9\x75\x22\x07\xd4\x97\x80\xec\xab\xcc\x8d\x42\x38\xe4\x8c\x33\xb0\x79\x22\x4c\x0c\x2e\x09\x7a\xec\xbb\x20\x9b\x77\x0a\xd9\xbc\x37\x89\xf9\xdf\x1f\x9f\x15\xdf\x72\x06\xba\x4e\x77\x00\xb4\x02\xec\x43\xcb\x74\xc3\xae\xa0\xbe\xdf\x7d\xa4\x2c\x6d\xe3\x43\x55\x4d\xee\xbd\xe8\xbe\x38\xa0\xcf\xb4\x64\x60\xd5\x32\xba\x59\xb8\x6a\x35\x27\x4d\x71\x97\x28\xb0\xa7\xba\x57\xb7\x5f\xd8\x32\x68\x2d\xbf\x13\x2f\x2d\x0a\xa2\x93\x4c\xdb\x23\x28\x87\xe3\x91\x20\xa0\x7f\x01\x9e\x7d\xb9\x50\x35\x6c\x80\xe0\x2a\xef\xd2\x9a\x57\xe5\x12\x81\x05\x89\x47\xcb\x9b\x5d\x5b\x5a\x48\x08\xd6\x21\xfe\xa2\x52\xf9\xf9\x06\xb5\xe7\xbc\xa1\x6d\xec\x07\x07\xc5\x6d\x2a\xb9\xca\x16\xe6\x3d\x96\xe4\x95\x15\xb5\x6c\xbd\x1e\x89\xb3\x3f\x22\x97\x44\xdc\xdd\x38\x12\x6b\x1d\x5f\x99\x19\x7f\x18\x91\x6f\xe1\xa1\x84\xb2\x41\x80\x74\x43\xea\x4d\xe0\x68\xa5\x29\xa3\xb3\xcd\xda\xce\xc4\x09\xb3\xa9\x1a\x3a\x3b\xc3\x43\x19\xcf\xac\x30\xe2\x00\x9a\xfb\xc6\xce\x21\x83\x2c\x64\x0c\xf9\x8a\xc6\xd2\x39\x1d\x90\x11\xec\xb1\xd9\xe5\xe1\xb2\x9e\xe4\x4c\x9b\x88\xa0\x56\x2b\x05\x91\xb3\xa5\xa7\x76\x13\x48\xe0\xd6\x6a\xbe\xdc\xdf\x1b\xd2\x67\x72\xb5\x8c\x9e\x6c\xd1\xed\x60\xd7\x57\x1a\x70\xbf\x74\x95\x08\xbc\x64\x74\xa3\xe5\xfe\xa2\x02\x23\x16\xaf\xbb\xbd\x73\xf8\xa0\xf9\x36\xc2\xcb\xf1\x6c\xb6\xea\x48\x45\x76\xa7\xb7\xb9\x95\x62\x07\xbd\x28\x54\xcc\x22\x86\x86\xc0\x2d\x08\x4c\x5b\x0e\xb5\xdf\xd1\x64\x11\x96\xc5\x38\xd1\x17\x4c\xb7\x2f\xc8\x37\xa0\xec\xb2\x66\x5e\x7b\xd7\xc8\x76\x09\xf9\x9b\x86\x2f\x23\xea\xcf\x27\x4c\xac\xb0\x13\x4b\xba\xbc\x8c\x46\xd6\x5a\x91\x9a\x5e\xe3\x79\x78\xbc\xef\x6b\x6d\xa9\x5a\xe2\xd8\x0a\x5e\x7a\x02\x89\x78\xf4\x20\x90\x64\x4d\x5d\x43\x90\xb7\xcb\xb3\xe0\x76\x10\x80\x95\x80\xb5\xc8\x8c\xda\x9f\xb7\x59\x01\x90\x88\xac\xdc\x35\xb8\xc4\xb8\x96\xf5\xa4\x63\xfe\x46\x2a\x6e\xda\xa4\xae\xf2\x2c\x22\xcc\xb1\xfc\x00\x0e\x92\x66\x7a\x83\x56\xd8\xbc\x47\xbe\x48\xf8\x84\x78\x4a\x49\xbf\xcc\x4a\xba\x99\xce\x98\x2d\xea\x6c\xd9\xee\x6f\xca\x9c\xc0\x6e\xb0\x1d\x34\x5a\x83\x5c\x42\xdf\x57\x68\xcb\x52\x5d\x57\x54\x94\x4d\x51\x89\x9d\x83\x90\xdd\x93\xd9\x97\x1b\x5f\xcb\xca\x21\xb2\xda\xf0\xac\x91\xd6\x4a\xa7\xc2\x97\x54\x88\xc0\x6b\x0b\x4f\x88\x35\xdc\x81\xfc\x3a\x7d\xea\x6a\x4a\xcc\x27\xe1\xe0\xf8\x93\x69\x74\x64\x72\xe5\x70\xe6\x94\xf0\xb6\xae\xf1\x49\xe5\x70\x65\x15\x2b\x3a\xc7\x0f\xbe\x8d\x64\xed\x14\x66\x04\xbc\xbb\xdd\xc9\x70\x4b\x01\xe7\x93\x37\xa2\x85\x1d\xdb\xa6\xf2\x6d\x4b\xa8\x32\xaf\xfd\x10\xe4\x7e\x65\x0e\x40\xad\xe2\x1d\x29\xc2\x9c\x49\xe4\x76\x82\x59\x99\xca\x2b\x6f\x09\xd1\x3e\x4a\x1e\x5a\x52\xc8\xb3\x0d\x4c\xb3\xfe\xb4\xb4\x2d\x62\xa7\x4c\xfb\xac\x97\xac\x7f\xd0\x29\xf1\x68\xa7\x1c\x05\x6f\x46\x65\x53\xe4\x89\x6b\x66\x02\x47\xeb\x7d\x93\xa1\x7d\xec\xea\x74\x3c\x43\xe6\x43\xfd\x42\x63\xc6\x7c\x19\x9b\x46\x5f\x77\x54\x7b\xa3\xb1\x67\x7a\x12\x44\xd5\xd3\x9f\x5a\xec\xcb\xf9\x17\x39\x1d\x00\xe5\xd2\xec\x93\x1c\x8e\xa2\xac\x65\x12\xe4\x3d\x79\xd2\x75\x3c\x12\x8f\x32\x4b\x0d\xb1\xfa\xf9\x74\x3c\x3a\xc3\x84\xa7\x7c\x80\x69\x4a\x78\x9e\xa9\xc7\xea\xb8\x19\xf2\xa6\xeb\x15\x62\x36\x9c\x9d\x0f\x12\x4e\x15\x45\x9d\x89\x20\x3a\xf2\x49\x10\x9d\x41\x18\xfa\x01\x94\x58\x61\xae\xbc\xb8\x86\xae\x45\x9a\xe0\x75\x0a\xc0\x76\xaa\x56\x02\x58\xd8\x42\x32\xd1\x28\x26\x82\xc9\x2f\x8c\x2b\x11\x59\x8f\xfe\x45\x33\x2d\x53\x77\x23\x09\x27\x91\xd1\x59\x98\xd5\x95\x36\x91\xf3\x2d\xe0\xcd\xb0\x46\xc3\x25\x37\x05\xbd\xc3\x5d\xed\xd5\x4a\x92\x8a\x89\x54\x75\x0d\x55\x66\x71\xe5\x4b\x58\x07\xea\x0c\x04\x81\x3a\xc1\xc6\x6a\x90\xa4\xe8\x9d\xd8\x67\xc1\x55\x66\x76\xc1\xc6\x3b\xe4\xdb\x32\x0b\xe4\xad\x08\xe1\x5a\x6f\x37\x16\xcf\x8c\xc7\x3e\x25\x92\x90\x99\x31\xa4\x46\xf3\x15\xef\xcf\x5f\xdd\x23\x5a\x83\x2e\x8b\x2f\x47\x54\xd6\xcf\xc8\x10\xa6\xac\x48\x1f\xd6\x5e\x58\x46\x8f\x34\x09\xc8\x5f\xe0\x99\x0c\x38\x81\x81\x63\x35\x18\xfc\x69\x70\x71\x79\xde\x9f\x7c\x49\x76\xa3\xb2\xf6\x1f\x42\x9d\x89\xf3\xf1\x74\x66\xd1\x56\xbd\x44\x7e\x1a\x7f\x06\x8c\xd6\x69\xff\x6a\x3a\x38\x7b\x14\x48\x65\xd1\x59\x08\x9f\x42\xc2\x08\x61\x5c\x89\xd3\x19\xff\xd8\xb8\x45\x36\xc1\xcb\xfe\x39\x46\xae\xe7\xb0\x59\x43\x78\xad\xf8\xdc\xff\x22\x4d\x93\x09\x31\x41\x80\x2c\xee\xaf\xc8\x08\x4c\x31\x9e\x50\xc1\xbf\xf1\x6d\x3c\xf1\x18\xa5\xef\x20\x9d\xc7\xc9\xc6\x3c\x89\x02\x61\xcb\x9e\x42\x94\x60\x39\xf5\x3e\x0e\x46\x83\x49\xff\x5c\xec\xae\xd5\xf6\xfe\x32\x94\x12\x02\x65\x08\x10\x45\xf2\x6a\x6d\x4b\xdf\xe9\xb6\x80\xc0\x52\xe8\x86\x67\x31\x90\x1e\x14\x70\xf2\xe6\x21\xb4\xba\xdd\x53\x9c\x9c\x1b\x92\xbc\xac\xb3\x1c\x9e\x49\x42\x46\x3b\x73\x67\x70\xc9\x58\x8c\xe9\xb6\x46\xbd\xce\x85\xa5\x4c\x6b\x3c\x11\x13\xb8\x07\x4d\x45\x2e\x85\xef\x68\xbb\xb0\xdc\x4a\xb5\xe7\x25\x67\xc8\x6d\xd7\x96\x03\x3b\xb3\x7f\x10\x0e\x0d\xd4\xf9\xb2\x8a\x73\x18\x5a\x76\x58\xda\x62\x4b\x96\xe4\x72\x95\xd4\xce\xcd\x68\x4b\x26\x92\x17\x0a\x55\x08\xf6\x9b\x61\xed\x8f\x97\x53\xe4\x3c\xf3\x8b\xba\xd2\xfa\x00\x0d\x32\x08\xec\x6d\xcd\x69\x02\xff\x06\x93\xcd\xfa\x21\x3d\x46\xac\x14\x0b\x2f\x31\x7a\x98\x56\x3c\x8b\x44\xd3\x44\x94\x2f\x8a\xd7\x0e\x69\xd9\x78\x2e\xaa\x90\x5a\x09\xa6\xc4\x0f\x84\xa0\x3a\xc3\x65\x54\xb1\x91\x3f\x7f\x24\xcb\x7b\x41\xa9\x94\xa7\x0e\x8b\x0c\x86\x25\xe4\xa4\x0b\x53\x8a\x18\x24\x61\xdc\x3b\x3c\x2b\x17\x7b\x44\x1d\xc2\x97\x02\x88\xa2\x30\x31\xd7\x63\x6c\x57\x30\x1a\x3c\xc7\x80\xfd\x03\x6d\x73\x98\xa4\xd6\x07\x22\x39\xa8\x50\x91\x19\x18\xae\xbe\x76\x02\xa8\xdc\xaf\xf5\xae\xa7\x4d\x33\x42\x87\x56\x59\x5e\x18\x7f\x5c\xec\xa0\xcf\x5e\x67\x8d\xaa\x73\x57\x7f\xd6\x8e\x61\x47\x21\x56\xc0\x64\xd8\x28\xc5\xd6\x9a\xca\xe6\x2d\xdb\x5a\xb5\x62\x98\xc4\x67\x06\xb1\xf0\xb5\x55\x81\x9a\xab\x45\x05\x7a\x64\x19\x4e\xc4\xca\x2a\xd7\x94\xfe\x5a\x07\x36\xae\xec\x19\xbd\x77\xfd\x4e\x78\xca\xde\x45\x23\x16\xa8\x8c\x1f\x73\xa7\x77\x78\xcf\x99\xb1\xa8\xcc\x2a\xd6\x2c\x84\x26\x36\xb5\x39\xd7\x16\xc8\x63\xe1\xca\xcd\x78\xe3\xb8\x3f\xdd\xd9\x42\xf2\xfc\x44\xd7\xd6\xf6\x4d\x8e\xc5\x1a\x6c\xb3\x70\x76\x1d\xdf\x32\x22\x24\x80\xf2\xc9\x9c\x72\xef\x2f\xd0\x27\x44\xd2\x63\x50\x88\xba\xb5\x84\xd1\x6c\xef\xd5\x8a\x62\xe9\xbd\x8e\xa9\x5d\xd5\xd5\x5a\x60\x7e\xbe\x82\xe9\xa2\x34\x18\x7b\x98\x1d\x2b\xff\x25\x10\x06\x9b\x2b\x79\x9d\xdf\x82\x97\xb7\x44\xaa\x98\x6d\xae\x6f\xf2\xf2\xda\xd5\x95\x95\xdb\xf5\x5c\xd5\xe8\xd4\xda\x1e\xb1\x76\x05\x99\xe9\x1e\x27\x98\x9e\x07\xb0\x31\x11\xd5\x55\xef\x6c\x16\x4e\x00\xe5\xe6\x11\x3f\x67\x45\xb5\xa2\xfa\x28\xab\x65\xf9\x60\x2f\x73\xed\xf9\xa4\x93\x96\x27\xae\x0a\x6c\x52\xac\xd6\xd0\xd1\xd1\x56\x1a\xbe\xc7\x8a\x92\x59\x13\xba\x88\xaa\xcd\x24\xef\xe6\xa8\x0e\x72\x80\x72\xe0\xe4\xbc\x1c\x0f\x05\x8a\x39\x46\x5a\xce\x4e\xc9\x99\xa9\x29\xf3\xb5\x48\x58\xa8\xb2\x62\x69\x6d\xbb\x7e\x85\xa3\x92\xeb\x8a\xf2\x50\xf2\xbe\x2d\x8a\x17\xdb\x10\x56\xb0\xdd\x35\x34\x31\x1b\x02\x52\x63\x0b\x42\x7d\x29\xdd\x54\x9b\x8d\x2a\xe2\xa4\xba\x27\x0f\xcd\x83\xfc\x86\x30\x87\x93\x27\xe0\x08\x4f\xe6\x8e\x9c\x51\xed\x03\xf5\xb3\x96\xd9\x15\x2b\x32\x98\xcb\xc9\xf1\x13\x34\xa4\xa8\x39\x52\x77\xf2\x0b\x48\x2f\x50\x20\x3a\x80\x08\xb8\x41\xe1\xdf\x0d\x28\x5e\xa4\xa7\x78\x01\xc8\x08\x06\x1b\x2d\x67\x87\x6b\x0f\xea\xf0\xcd\x6b\xbc\x47\x79\xc8\xb2\xbb\x73\x5e\xd6\xde\xac\xa5\x7b\x95\xd5\x4c\x88\x0f\x35\x49\xcd\x3c\xe1\x13\xb2\xba\xd2\x76\xcf\xe3\xfb\xef\x32\x98\x7d\xb3\x68\x7d\xa9\x6f\x26\xff\x75\x6b\xec\x30\xb8\x34\x30\xf0\x24\x30\x2c\x80\xca\x77\xf6\x1a\xfb\x3b\x2c\x6d\x48\x5f\x9e\xe7\xf3\xa6\xaa\x8a\x03\xe4\x58\x30\xbd\xf8\xad\x2b\x01\x1e\xa9\xff\x3b\x3c\x79\xfb\x26\xc2\xff\xbf\x3e\x3e\x39\xf9\x8e\xff\xff\x23\x7e\x00\xa5\x43\xb9\x6c\xe9\x96\x80\xbd\x6c\x3e\x8e\xae\xe4\x47\x55\x02\x53\x52\x58\x25\x00\xc6\xf1\x7d\xb5\x0d\x91\x14\x8e\x0f\x84\xcb\x6e\xdb\x40\x06\x9c\xa3\xf3\x1a\x3c\x1a\x63\xd6\xe7\x5a\xce\xb7\x79\xd1\x48\x8c\xc9\x98\x77\xd1\x5a\x4c\x1c\xd1\xbf\x8f\xce\xda\x47\xfb\xbb\x03\x0a\xbb\x43\x81\x50\xb0\xe7\x2c\x47\x3e\x98\x3e\x36\x79\x5d\x2b\xdd\x78\xa5\x66\x9b\x62\xfd\x5b\x8f\xfe\xdf\xfe\x27\x7d\x39\x3a\x1f\x9f\xfd\xbe\x05\x40\x8f\xd4\xff\x1c\xbe\x7d\x73\x1c\xd7\xff\x98\x8f\x7f\xdf\xff\x7f\xc0\xcf\xa8\xaa\xef\xd4\x75\x9e\x95\xb8\xb1\x17\xb8\x63\x80\x02\x86\x51\x01\x9e\x65\x4d\x26\xf7\xcd\x4a\xe9\x09\x71\x59\x2b\xa8\x7f\x07\xbe\x26\xf8\x0e\xd9\x10\xf4\x2f\x0b\xcb\x04\x3a\x24\x6e\xb8\x61\x0d\x70\xcb\x21\x51\x5c\x10\x39\x11\x0e\x4e\x65\xbe\x9f\x2d\xb8\xc2\xb1\xf2\x82\xe1\x96\x6d\xb6\x5b\x83\x28\x84\x57\x09\xdd\xe4\x1b\xd2\x9e\xb5\x69\x3f\x6a\x6b\x2a\xdf\xdf\xd3\xf9\xc3\x55\x99\x77\x02\x3e\x04\x7d\x2f\xa1\xd6\x21\x3f\xdf\x2e\x58\x57\x1b\xb3\xe6\x5e\xdb\xd7\xc2\xfc\xb5\xda\x36\x5c\xf1\xf7\x6d\x42\x29\x7d\x73\xc6\xb6\x10\x9e\x96\x3d\x3e\x4c\x8c\x1b\xbb\x06\xb2\x88\x3e\x9a\xc5\xbb\x82\x2a\x7f\x04\x58\x0d\x94\xa7\xb5\x03\xd1\xa4\xd1\x04\xfa\x20\x1a\xc8\x52\x29\xc2\x97\x7a\x56\x21\x62\x38\xf0\x06\xf2\xaa\x56\x6a\x59\x41\xc4\x4c\xf8\x1e\x28\x7e\x5c\xfb\x95\xf6\x01\x3f\x8c\x25\x55\xbe\x41\xfd\x45\x63\xa9\x80\xd1\x05\x28\xd4\x75\xae\x91\x31\x0e\x43\x0d\x36\x52\x7f\x4d\x57\x12\xa2\xf1\x8d\xfb\x0d\x4b\x0c\xec\xba\x85\xd2\x1a\x65\x67\xe1\x6f\x1a\x04\x5f\xc3\x15\x66\x21\xbc\x88\x9e\xc1\x34\xb9\xfa\x55\xad\x37\xd4\xb9\x3a\xe8\x6b\xbc\x78\x58\x4f\x18\x94\xa6\xbf\x68\x52\xf9\x01\xe3\x81\x6c\x12\x9f\x3e\x98\xd6\x47\x56\x2f\xb4\x1d\x4d\xa8\x05\x43\x93\x1e\x79\x0f\x17\xd5\x75\x99\xff\x1b\xda\xe5\x45\x76\xe7\x2b\xda\xd4\x0a\xc8\xad\xcd\x5a\x17\x7f\xfd\x8b\xd9\xad\xf3\x4c\xab\xbf\xfe\x3b\xbd\x1c\xca\x70\x32\xc8\x05\xcc\x33\x2a\x9e\xb1\x2a\x34\x75\xd5\xa8\x45\x3b\x88\xf3\xea\xc4\x4e\xa5\x9f\xb7\xb0\xb7\xe6\x4d\x6c\xfa\xc2\x97\x35\xea\x57\x60\x33\x44\xf4\x1b\x34\xbd\x36\xde\x20\xa4\x29\x9a\xcc\xec\x0c\x8f\x17\xc6\x8a\x0b\xb1\xab\x29\x47\x8c\x9d\xb1\xab\x25\x89\xe4\xa5\x43\xbe\x47\xc2\x12\x48\x3b\x34\x5d\xb6\x5c\xc2\x60\x96\xd7\xb8\x25\x98\x40\x84\x44\x81\x88\xbf\xfe\xa5\x54\xf9\xf5\xcd\xbc\xda\xd6\x9e\x54\xeb\xaf\xff\x2e\xf3\x52\x9c\xde\x64\x1b\xe3\x47\xbc\x7e\xa4\x39\xdc\xf7\xb5\x23\x8e\x27\xc3\xe6\xa6\x6a\x8c\xe1\xb1\xb9\xd1\x3d\x84\xc8\xf9\x56\x77\xb1\x8d\xb1\xf3\x02\x66\xfa\xaf\x7f\x31\x2f\x0a\x07\xda\x96\xb2\x58\xa8\x97\x59\x5c\x54\x10\xf2\xd7\xbf\x90\xad\x66\x16\x82\x79\xdb\x5f\xff\x72\x5f\x6d\xc3\xaf\x97\x59\xb3\xad\x11\xc1\x80\xae\xd5\x46\xd5\x1a\xc2\x39\xf1\x99\x28\x3a\x5b\x65\xdf\x51\xd5\xd1\xfc\x03\xcd\x41\xe7\xb3\x71\xef\x61\x7a\x3b\x38\xa8\xec\x71\xbb\xeb\x4d\x4e\xfa\x35\x5e\xd8\x08\xc4\x20\xbc\x24\x62\x72\xa2\x83\x2e\x3c\xcf\x39\xb0\x33\xc0\x02\x27\xae\xd2\x04\xd2\x6d\xeb\x6d\x09\x22\xcb\x50\xe4\x63\x1a\xaf\x12\xa9\x6f\xaa\xbb\xc4\x57\xff\x40\xd1\x8a\x28\x2c\xea\xa7\x46\x34\xf2\x5f\xff\x72\x15\xef\x3e\x2e\x59\x6c\x1b\xeb\x74\xa9\xe9\x6e\x24\xc0\x73\x76\x47\xa9\x6a\x20\x0b\x75\xa4\x0c\xc2\x51\x90\x81\x02\xa9\x5d\x85\xee\x8b\xae\x00\xeb\xdc\x5f\xca\xfe\x20\x4e\x62\x7e\x3e\x7e\x02\xb5\x4e\x43\x3e\xf6\x09\x88\x58\x5b\xb6\x2b\x3e\xb0\x31\x19\x07\xe2\x9e\xa4\x0d\xda\xe1\x11\x30\xbf\x47\x50\xe5\x7f\x85\x96\xda\x13\x3c\xbe\xa1\x5a\xc9\x58\xfe\x81\xa6\x22\xa8\x61\x22\xc4\x7f\xa5\xf0\xcf\x8e\x07\xbd\xac\x6a\x26\x3d\x19\x7f\x80\xc5\xc4\x83\x0b\xc1\x62\xad\x7d\x1b\x5b\x6d\x62\x35\xb3\x4b\xe9\x5e\xa2\x96\xfc\x41\xa9\x69\x1e\x5c\xa4\xc0\x8b\x1b\x95\x4e\x99\x43\x1d\x56\xce\x46\x41\xd8\x08\xf6\xbf\x2d\xa7\xf2\x86\xc1\x2c\x6c\xb3\x30\x5e\x50\x44\xff\x41\x70\x58\x80\x45\xc3\xe7\x00\x93\x6f\xc6\x69\x09\x00\x06\x18\x05\x3c\x5a\x28\x56\xb9\xa8\xd6\x4a\xe0\x87\x2c\x27\x24\xa8\xa8\xe0\xeb\xec\x31\xc1\xae\x2a\xbd\x9d\x1f\x30\x4d\x05\x56\x80\x15\x1f\x4a\x27\xa9\x1c\xb8\xbb\x13\x7e\x33\x63\x97\x9f\xd7\x94\xf5\xb8\x2a\x88\x16\x21\x6e\xaf\xc5\xb0\xe6\x8d\xc5\xad\x56\xef\xcc\x78\x06\xf3\x07\x7d\xb2\xaa\x64\x74\x9e\x00\xca\xba\xc9\x58\xcd\x53\x74\x3a\x5f\xd2\xc7\x04\x58\xb1\xe6\x84\x26\x85\x1b\x68\x06\xce\x95\x31\x35\x9a\x7c\x9d\x35\xc4\x6b\xea\xfc\x46\xb0\xc0\x2a\xbd\x25\x7a\x17\xca\xf8\x99\xbb\x6a\x41\x37\x09\xed\xc3\xa0\x31\x71\xc3\xa3\x32\xe0\xdb\xbc\x2a\x5c\x29\x59\x46\xb2\x90\x55\x1d\xe8\x7c\x03\x4e\x1a\x62\x74\x62\x51\x95\x2b\xc4\xab\x82\x95\x17\x3f\xdc\x92\xed\xe2\xd6\x25\xbb\x87\xb5\x7b\xb3\xad\xf5\x96\x8e\x19\x4c\x93\xfa\xd8\x2c\x5b\x68\xc4\xd0\xaa\x55\xa9\x73\xa8\x83\xec\x32\xdd\x46\x8e\xfc\x57\x2d\xb6\xb5\x31\x39\xfb\x8b\x26\x6e\x50\x70\xd2\x78\x1c\x21\x59\x8b\x5e\x3a\xd2\x99\xb9\x56\xa3\x0f\xf8\xe1\x72\x8d\xe2\x2a\xac\x5e\x93\x5b\x94\xf1\xcb\xbc\xd5\x00\xc7\xfe\x43\xb5\x55\x3e\xae\xec\x0e\x4d\xac\x54\x68\x5f\xf9\xb0\xd5\x16\xc6\x68\xf1\x80\x8b\xa7\x18\x00\x02\xec\x11\x0b\xf6\xf7\xd4\x80\x09\xe5\xd4\x88\x07\x18\x48\x6a\xe9\x55\x09\x60\x42\x60\x63\xb9\xdd\xa0\xcc\x0a\x2f\x44\x56\x1a\x9b\x51\x01\x2b\x5b\xe3\xf4\x26\x83\x0d\xa1\x6a\x15\x8c\xe5\x0b\x8d\x3c\x6a\x5e\xf2\x52\xd5\xeb\xac\x04\x09\x51\x80\x03\x5f\xd7\x64\xca\xba\x50\xb6\x7f\x1c\xe6\x57\x2d\x85\x9f\x62\xd8\xe8\x0e\xcf\x42\x74\x0c\x11\x80\x6e\xea\x26\x5f\x14\x4a\xce\x95\xb9\x4e\x02\xc4\x64\xc3\x31\xd5\xc3\x55\xb8\x08\x4c\x8b\x5b\x08\x7d\xdf\x36\x48\xbe\x85\x5b\xdc\x7a\x9f\xd8\x0a\x96\x40\x42\x82\xa7\x22\xd7\x4d\x12\xac\x1d\x04\x6a\x61\x5e\x8c\x88\xdf\xba\x3a\xe6\x17\xbe\xbb\x02\x21\xcb\x0e\x7a\x8d\xad\x4b\xc7\xe7\xce\x6e\xd0\xb2\xbe\x51\x74\xe2\x6a\x01\xd9\x3e\x14\x68\xb5\x38\x68\x40\xbf\x51\x8d\x63\x55\x31\x85\xee\xc8\x64\x09\xfb\x2b\x58\x6b\x1c\x1e\x1d\x99\x35\x21\x90\x3e\xaf\x01\x61\xcf\xa5\x69\x02\x0b\x60\x01\xe7\x5c\xcb\x04\x70\x1e\xc7\x6e\x55\xf1\xc8\x95\xb6\x39\x34\x77\x5f\x05\x3a\x33\xb1\xdc\x38\xc2\xcc\x01\x75\x1c\x34\x91\x59\x17\x58\x38\x0f\xf7\x14\xae\xfa\xf6\x43\x6c\x1a\x94\xb3\x6e\x86\xd7\x3a\xb2\x83\x5b\x45\xa5\x7c\x6d\x6e\xc8\x0c\x54\xbf\x63\xa8\x06\xf2\x79\x41\xb3\x2d\xdd\x06\x49\x44\x63\xfb\x92\xc0\x17\xa3\x32\x05\xf6\xbc\x2e\xf8\x07\x71\x84\x35\xd9\x2f\xca\x18\x7b\xe6\xd0\xc5\x04\x6c\xb6\xd5\xa0\x58\x1c\x56\x53\x22\xb0\x3f\x95\xef\x15\xa6\x23\x82\x18\x49\x57\xff\xec\x5e\xf6\x92\x6d\xcb\xaf\x59\xd7\x66\xdb\xdc\xe6\x75\x03\xea\x41\xed\x05\xf5\x3a\x95\x7d\x46\xde\x19\x58\x8f\xb6\x22\x3a\x38\x19\xdc\xce\x35\x5b\x20\x26\xa3\xf6\x7f\x2c\x97\x9e\x53\x03\xdd\x2d\x58\x8e\x36\xd1\xe3\x0d\x9f\x48\x38\x19\x93\xcf\x45\x71\xef\xb4\xa2\xa3\xb9\xc1\x36\x51\xb8\x08\xf4\xf7\x4b\x60\x52\x9c\x57\xb0\x80\x59\x3c\xc3\x66\xa8\xa8\xdc\xa7\x3d\x34\x3b\x8e\x23\xb0\x84\x5c\xcf\x6e\xaa\x3b\x7e\x84\x69\x8f\xe4\x41\xe5\xad\xe0\x96\xb2\xa6\x54\xbd\x86\x2e\x68\x57\x77\xe1\x4a\x76\xde\x81\x3f\x47\xa6\x0c\x58\x30\x5d\x17\xae\xdd\xca\x5d\x51\xb9\xa5\x8f\xca\xc5\x7c\x2c\xff\x0b\x04\x6b\x6d\x84\x4e\x57\xf5\xff\xfe\xeb\xbf\xef\xe8\xa4\xef\x60\xe7\x51\x84\x1d\x01\xed\x8b\xb9\x6a\x39\x69\x99\xe7\xa4\x8e\xa5\x7b\xdd\xd9\xb9\x58\xa5\xde\x97\x3f\x8c\x56\x2e\x3c\x5e\x80\x2e\xb2\x1d\xa3\x5c\xfb\x96\x76\x6d\x03\x6b\x86\x77\xee\x81\x42\x65\x35\x70\x86\x2c\xc1\x75\x43\x14\x8d\xe5\xba\x81\xb3\x17\x1e\xe1\x75\xd1\xfc\x13\x1c\xba\xf1\x12\x0c\x07\xb3\x8b\x3a\x77\x81\xa7\x27\x8f\x0e\xed\xb8\x1c\x09\x49\x03\xb5\x5c\xe7\xba\x50\x19\xb0\x66\x94\x55\x2d\xa9\xaa\xb6\xfb\xfb\x66\x1e\xab\xba\x41\x27\x23\x2f\x17\x55\x5d\xa3\xd2\x89\x79\x6c\x2a\xc4\x88\x68\xc3\xa3\x3b\xbf\x74\xb1\x14\x1e\x21\x7d\x61\xa9\x06\x6b\xce\x52\x4c\x75\x68\x02\x5c\x0a\xc0\x53\x6d\x36\x55\xdd\x60\x94\x66\xbd\x36\xbe\x2c\x64\xf9\xeb\x5f\x54\x74\x98\x5b\x7f\x0f\x23\x0e\x1a\xd5\xd6\xea\xdb\x7c\xa1\x34\x01\x6b\xdb\xfb\x8a\xb4\x74\x29\x90\x89\x7e\xab\x0b\x60\xe2\xf8\x46\x37\x9f\x23\x0a\xf8\xeb\x5f\x32\xe3\x4a\xfd\xf5\xdf\x5b\x5e\x11\x56\xf3\xe2\xe6\x21\x80\x2c\x1c\x34\xae\xc4\x24\xf5\x5e\x88\xae\x6a\xaf\x34\x51\x56\x01\x42\x9c\xc3\x44\x02\x0c\x8a\x20\x9e\x7b\xcb\xe9\x68\xfc\xf4\x5d\x27\xc7\x6c\x77\xc4\x36\x8c\xd4\xfa\x86\x02\xf6\xdd\x8c\x60\x84\x2a\x16\x1d\xae\x6f\xd3\x21\x9e\x0f\x82\x03\x0d\x0f\x04\x06\x8d\xf0\xeb\x74\xae\xa0\x0d\x16\x1f\x8d\xbc\xb3\x4c\x6c\x82\xaa\x8b\x38\xd2\xdd\x5c\xf1\x3b\x2e\x10\xac\x2b\x89\x6b\x73\xac\xcf\x5c\xd5\xee\x46\x8c\x29\x91\x3b\x97\xc5\x0f\xa9\xfc\xb8\xcd\x00\xa8\xa0\xb4\xac\xd5\x75\x56\xbb\xa0\x99\xb4\x11\x6d\x88\x79\x43\x50\x37\xf7\x4b\x86\x1d\xed\xce\x64\xde\xd4\xd6\x04\x61\x03\x01\x1e\x51\xae\xf5\x16\x5d\xf8\xcd\x06\xcb\x4e\x40\x29\xdf\x9c\x36\xa0\x66\x27\xfc\xab\xd5\xaf\x1b\xf4\x25\x08\x06\x0d\xb5\x73\x0f\xb7\x27\x95\x53\x63\x3f\xb0\xc7\x31\x80\xa7\x79\xae\x5a\x9a\xd1\xa5\x03\xc9\xf8\x55\x39\x85\xdd\x58\x59\x6e\x8e\x6c\xcc\x14\x56\xb7\xa9\x53\x7f\xdb\x55\x84\x23\x5a\xba\x6d\xa4\x83\xb4\x01\x0a\xcb\x93\x02\x7a\x29\x57\xdb\xa2\xc0\xe2\xd8\x2d\x10\x75\xd8\x57\x0b\xdf\xca\x54\xbe\xb7\x54\x0f\x8e\xc0\x8a\xd5\xb4\x07\xa3\x08\x30\x2b\xba\x66\xaf\xdd\x8c\x89\x28\x89\xd3\x5a\x2c\x65\x77\x52\x04\x8b\x99\x2d\xfa\x8a\x4a\x26\x76\x67\x4a\x9c\xa0\x1f\x4d\x38\x50\x2e\x35\x6e\x31\x04\x37\x9a\x02\x2b\x37\x2c\xef\xcf\x4a\x99\x2d\x8d\xe3\x16\x86\x6d\x40\x1c\x85\xb3\x5d\x38\xeb\x3f\x70\x32\x22\x23\x42\x57\x6b\xc5\x62\xd6\xfe\xa8\xb2\xb7\x61\x11\xb5\xb2\x50\x62\x7e\xef\x84\x6c\xc8\x33\x0c\x72\xd6\x14\xdf\x71\x4d\x31\xed\xf5\x65\x0b\x8f\x3e\xd0\x5c\xae\x38\x00\x70\xa8\x17\x15\x65\x05\xfa\x1d\xdf\x94\xec\x9b\x71\xb0\xd6\x57\x12\xd3\xf7\xb4\x0d\xdb\xad\xb0\xba\x8d\x8f\xd1\xbb\x96\x29\x62\x67\x67\xff\xd6\x93\x07\xf6\x20\x5c\x87\x81\x14\x28\x43\xca\x98\xd2\x52\x3b\xac\x43\x05\x78\x4c\x1e\xc6\x45\xcf\xdf\xc9\xd3\x5a\xe1\x0a\x3e\xad\xd6\x6b\xb3\x8a\x98\xa9\xea\x5f\x0e\x79\x21\x66\x8a\x1c\xa5\x87\x89\x3c\xc6\xff\x79\x4d\xd5\x0e\x1b\xbc\x5d\xe9\x23\xe2\x24\x3d\x44\x38\x98\x7d\x83\xb4\x6f\x18\x65\xb7\xe5\x75\x7e\xab\x0a\xad\xe4\x49\x7a\x68\x6c\xb2\x6b\xf5\xbc\x2e\x75\xf7\x05\xc6\xee\x2c\x6b\xb2\xdd\x9d\xd1\xd1\x48\xda\x04\x9d\x07\x7f\xb7\xce\x3d\x4a\x99\xd1\xe4\xe1\xde\x9a\x2b\x42\x09\xdb\x05\x40\x77\x0c\x5b\xd5\x6e\xdd\x21\xd5\x1c\x5d\x7b\x5e\x87\x6f\xc4\x61\x95\x3b\xdd\x4b\xb0\xbf\x02\x82\x8d\x2e\x03\x69\xd7\xce\x42\x86\x0d\x73\x5f\x96\x1d\x6f\x6b\xd9\xc2\x9d\x19\x6a\x66\x0b\x0b\x73\xe0\x7b\x4f\x84\x17\x09\xad\xf3\xd2\xec\xbd\x7b\xb9\xbf\xd8\xd6\x35\x04\x45\xe0\x33\x17\xf6\xf7\x20\x67\xe5\x1e\xda\x5f\xd2\x17\x28\x4e\x3c\x51\xa8\x23\x60\x96\xcb\xcd\xb6\x5e\xdc\xc8\xfe\x6a\x95\xe5\x28\x75\x8a\x7c\x03\x5a\xf9\x0e\x18\xdf\x7f\x85\xca\x07\xc6\xa6\x02\x7a\x94\xac\xb0\x02\xdb\x22\x38\x63\xef\xa8\xe6\xaf\x33\xae\xdd\xc5\x3c\xe0\xd2\x8b\x64\x7f\x1b\x37\x43\x80\x3d\x8f\x98\x47\xa2\x71\x80\x3a\x29\xb6\x94\x62\xf3\x5c\xb2\xf8\xb2\x97\xea\xfb\xe8\x64\x65\x8a\xec\x0e\xa9\x79\x20\x83\x03\xca\x67\xe1\x0d\x1c\x84\x13\x51\x2b\x6c\xcd\x48\xaf\x49\xd8\x15\xa5\xe4\x32\x56\xee\x87\x35\xca\x5d\xb5\xbe\x40\x3d\x13\x49\xbc\xb9\x97\xf1\xcb\x95\xb2\xb2\xf3\x7b\x96\x91\x35\xd6\x10\xda\x7e\xbe\xc1\xfe\x4b\x91\xd5\x0c\x51\x23\x63\x0c\xb0\x0f\x87\x96\xa3\x58\x67\xf7\x89\xad\x88\x30\xb7\x39\xb0\xe0\xc4\x51\xc6\x3a\x57\x60\x53\xd8\x80\x9e\xdf\x06\x10\x7b\x35\xce\x29\x56\x40\x64\x8d\xe7\xd3\xda\x28\x2c\x22\xf0\xaf\x76\x64\x9c\x7c\x53\x06\x00\x4a\xa8\x1b\xa8\xef\x31\xee\x27\x76\x23\x51\x2d\xa7\x52\x0d\x3e\xef\xf5\x8d\x13\x25\x5c\xc6\x98\xa7\xf4\xe5\xfb\xe9\xd9\xc1\xab\x83\xd3\x22\xdb\x6a\xf5\xfb\x60\x80\x1e\xc1\xff\x9d\x1c\x1d\xc7\xfc\xbf\x27\x6f\x8e\xbe\xe3\xff\xfe\x90\x9f\x90\xda\xff\xbf\xdd\xab\xac\xfe\xef\xf2\xbf\x41\x86\xf1\xbf\x07\x70\x63\x06\x18\x9e\xa8\xc0\x82\xc9\x90\xa5\x82\xf1\xa9\x40\x89\x39\xee\x2c\xa0\x80\x49\xdc\xc6\xb6\xa1\xb3\x35\x53\xb3\x49\x04\x11\xc5\x91\x4f\x13\xf0\x29\x45\xc6\x09\xb3\x23\x81\x54\x43\x35\xef\x84\x38\x4a\x65\xd8\x24\x62\xde\xf0\xdc\x2e\x24\xfe\x01\xee\x62\xb3\x53\x01\x20\xb1\x57\x23\x42\x05\xf9\xbb\x28\x80\xe4\x1b\xe2\x2d\xf1\x54\x88\xe3\x76\x03\xf2\x92\x8f\x80\x6d\x00\xd1\x4e\xfe\xe6\x6d\xb0\x59\xbd\x80\x3a\x54\xd0\x69\x82\x27\x8e\x2d\x7a\xd1\x7e\x7c\x5d\xa4\x97\x37\x3d\x15\xe2\x04\x27\x9e\xab\x0c\xf8\x6f\xaf\x51\x20\x12\xf8\x25\x14\xb8\x31\x10\x07\x70\x1e\x23\xd7\x70\x30\xbd\x16\xc4\x9d\x19\xb5\x9d\x01\xbb\x88\xca\x0a\x32\x87\x68\xe3\x40\xf9\xba\x23\xf0\xf0\x64\xba\xa4\x3f\xe6\xae\xf6\xaa\xbe\xce\x4a\x12\x47\x94\xa9\x10\xaf\x8c\xbd\xe2\xe3\x23\x36\x06\x16\xa4\xc9\xe5\x4d\x55\x2c\x21\x68\xeb\x3f\xa4\x2d\x8d\x2c\x0f\x9e\x04\x99\x57\x8c\xd9\x56\x35\xa6\x43\x37\x75\xb5\xae\x1a\xe5\x03\x21\xc0\xd9\x69\x33\x70\xe1\x18\xd0\x8a\x17\x2e\x4e\xb6\x4b\x74\x01\x04\x15\x18\x4f\x7e\x50\xec\xfd\xfe\x8b\x3c\x1d\x5f\x7e\x81\x9a\x4c\xf9\x69\x7c\x7e\x36\x98\xb8\xd2\x6f\xd0\xbf\x1e\x7d\xb1\x15\xb7\xd2\x97\x71\x0b\x5f\xa3\x9d\xf0\x92\xee\xf7\x57\x33\x10\x07\x80\xb2\xd6\xc1\x99\x9c\x8d\x49\x9c\x9c\xaa\xbf\x79\x69\x77\x5b\x56\xc1\xbc\xef\xb1\xa2\x6d\x69\x3a\xe0\xaa\x84\xcf\x52\xd9\x56\x59\x70\xfd\x11\xd4\x9f\xb6\xac\xc2\x83\x45\xbd\xb2\xa3\xa8\x77\xb7\x52\xf9\xfe\x23\xdd\xbf\x9c\x8c\x4f\xaf\x90\x3a\x0e\x8b\x57\xdf\x13\xc1\xb8\xf8\x38\x1e\x9f\xc1\xa0\x4e\x07\x93\x9f\x87\xa7\x83\xe9\x4f\x6d\x05\x86\x84\x49\x30\xfc\x64\xfe\xfb\xfd\xd5\x74\x08\x03\x34\x1c\xcd\x06\x93\xc9\xd5\xe5\x6c\x38\x1e\xf5\xc4\x6f\x50\x2d\x2c\xb1\x5a\x58\xfc\x26\xd5\xc2\xf2\x73\xff\x8b\x88\xab\x85\x23\xbd\x86\xe7\xd4\xfb\x0a\x1c\xee\xef\xc0\xea\xbf\x9b\x9f\xf4\xe5\xe0\xf2\xfc\xe0\xf8\x6f\xa8\xff\x70\x72\x72\x72\xd2\xc2\x7f\xbf\x7e\xf5\xe6\xbb\xfd\xf7\x47\xfc\x0c\x16\x45\xbe\xd1\xaa\xad\xb4\x78\x2b\x8f\xbf\x59\xff\x61\x70\x7a\x3e\xbc\x9c\x0e\x24\x4a\x40\x88\x6f\x91\x80\x88\x48\x0b\xc4\x1f\xa2\x00\xd1\x8b\x95\x19\xd0\xe3\x42\x35\xd4\x80\x72\x9a\xff\xc1\xa6\x0e\xce\x58\x11\x67\x77\x1d\x20\xe7\xf8\x6c\xbd\x0b\xb2\xe5\x8c\xbf\x8e\xbd\xef\x1d\x17\x84\xe8\x3d\x2c\x08\xe1\x3f\x98\xf7\x76\x2b\x43\x08\xf1\x7c\x69\x08\xd9\x2d\x0d\x21\xce\xbe\x5a\x1a\x42\xee\x79\x69\x88\x3d\x2c\xce\xfd\x56\x69\x08\xe9\xa4\x21\xc4\xb7\x4a\x43\xb8\x62\x24\x1a\x1f\xf1\xd0\xd8\x60\x02\x10\x85\x19\x48\xbb\x53\x2d\xe5\xe7\xaa\xfe\x45\xef\x96\x5e\x80\xe4\x1a\x82\x64\xab\x50\x76\xe1\xec\xe9\xb2\x0b\x7f\x07\xaa\x0b\x1d\x2a\x06\xe1\x80\x9f\x85\x78\xb9\x36\xcc\x28\xa2\xff\xfd\x6d\xe4\x0d\x68\x91\xc8\xa9\x32\x6e\x97\xf1\xdd\x5c\x30\x36\xe3\xca\xb7\x3d\x1e\xf3\x8a\x34\x10\xf6\xce\xbc\x90\x00\xcc\xf6\x5e\x0c\x55\xbe\xab\xea\x5f\x5c\x09\x30\x64\x71\x98\xc4\xaa\x73\xd7\x00\x5e\x2c\x5c\x9d\x9c\x0d\x08\xed\x03\xcb\x91\x77\x36\x7a\x41\xa7\x08\x11\xca\x20\x76\x6a\x99\x37\x95\x71\xdc\x84\xab\x83\x37\xe7\x42\x59\x35\x56\x11\x56\x15\xd9\x9c\x48\x3d\x89\x5b\x0c\xdd\x45\x2e\x37\xeb\xa9\xa0\x13\x99\x69\x91\x99\x61\x05\x3e\xb5\xd2\x8b\x64\x40\x3e\xa4\x5a\x11\x88\x4f\xdf\xe4\x1b\x33\x1a\xe1\xca\xef\x1c\x8b\x07\x87\xc0\xf2\x7a\xea\x6d\xd1\x68\x41\xc7\x0c\xd7\xbb\x4d\xe4\x52\x15\x0a\xe1\xc8\x75\xb5\x4e\x10\x64\xed\xdb\xee\xfd\x3f\xae\x5b\xee\xe8\x50\xd9\x4c\x26\x30\x74\x84\x65\x86\xcf\x2d\x8a\xac\xc6\x9c\x1f\x46\xa6\xa1\xfe\x30\x6a\xad\x69\x24\x4e\x93\x83\xa5\x02\x73\x60\xf8\x3a\xb7\xf8\xa3\xa3\x80\x17\x87\xe0\xe1\x82\x9a\x0f\x92\x3f\x11\xc1\x17\x4b\x65\x9a\x63\xe7\xc9\xa9\x90\xea\x44\x36\xf7\x1b\xf3\xff\x16\x45\x86\x44\x91\xba\xa9\xb7\x0b\x70\xcc\xa1\xd4\x25\x50\xa2\x76\xd4\x0a\x18\x18\xce\x49\x81\x17\xee\x9c\x9c\x68\x09\x01\x27\x8a\x58\x9a\x04\x52\x93\xe6\x04\x30\x6e\x32\x3c\x4e\x6f\xe7\xf0\xa6\xe8\x26\x88\x3b\x06\xd8\xda\x6a\x05\x3b\xc2\x6d\x66\xbe\xe1\x33\x42\xae\x65\xbd\x10\x68\x5d\xd5\xe6\x2e\xa4\x48\x78\x40\xd6\x9b\x95\xf7\x82\xc3\x2b\x14\xf0\x6d\xe0\xd3\x1c\x40\xb9\x5a\x11\x01\xaf\x79\x33\x9b\x28\xfe\x6a\xa7\x55\xec\xda\xbf\x71\x65\x20\x2b\xc8\x77\xc2\xcb\x83\x2d\xc0\x6b\x06\x3a\x38\xbc\x9c\xbb\x1f\x28\xbb\x84\xda\x95\xf8\xa7\xc4\xb2\x6d\xaf\xf2\xeb\x2d\x91\xe9\xc2\x14\x41\x83\xe3\x93\xc7\x36\x9b\x45\x35\x1e\xaa\xc9\xb5\xd2\x5d\xc7\xe9\x21\x4c\x16\x60\x10\xb2\x46\xd5\x51\x56\xc5\x13\xc5\xf3\xa3\xcc\x7c\xda\x95\x00\x43\x54\xc7\x6b\x75\x0b\x1f\xa8\x00\xb4\x00\xf1\xe7\x32\xc4\x57\x87\x5d\xf4\x80\x26\x4c\xef\xef\x40\x13\x26\x3e\xca\x9f\xac\x09\x73\xf6\x5b\x6b\xc2\xf8\x96\x08\x6b\x42\xcc\xff\x96\x23\xf8\x1f\x55\xee\x65\xe7\x3d\x92\x42\x6c\x51\xfc\x26\x3a\x2f\xfc\xfe\xf8\x36\x9d\x17\xa4\xb2\xfa\x4d\x74\x5e\xa0\x51\xff\x71\x75\x5e\x16\xbd\x6f\x55\x78\x09\x38\x58\xbe\x4a\xda\xe5\x21\x4d\x17\xf1\x34\x4d\x97\xa7\x89\xb9\x88\x07\xc4\x5c\xbe\x4e\xc5\x45\x78\x15\x97\xdf\x40\xbe\xe5\xdb\x74\x5b\x98\x60\x4b\x9b\xd7\xe9\xa9\x82\x2d\x5d\x4a\x2d\xe2\xb9\x4a\x2d\x0f\x4a\xb4\x88\xc7\x25\x5a\x1e\xd3\x66\x61\xc7\x78\xd3\xd2\x66\xf9\x06\x51\x96\x07\xd4\x58\x96\xbd\xaf\xd6\x61\xe9\x14\x60\x11\xcf\x15\x60\x79\x48\x79\x45\x74\x29\xaf\xa8\x9e\x1c\x55\x8d\x71\xcb\x60\x47\xdb\x2e\xb9\xcb\xa8\xd3\xa1\x82\xdd\x19\x72\x4a\xfd\xa2\xb4\xf0\xe6\x86\xdb\xf8\x78\x38\xf9\x69\xd9\x67\x55\x3c\x88\xc1\x79\x40\x18\xa6\x27\x18\xae\xd1\x5d\x1e\xe1\xc4\x2d\x54\xbe\x69\x62\xf3\xd8\x23\xb1\x6d\x3f\x44\xd6\xe5\x16\xe6\x2b\x96\xb7\x6c\x7f\xc9\x01\xf4\x4e\x7a\x3b\x34\x6a\x30\x34\x73\x92\x1e\x01\xf7\x5b\x30\x24\x3b\x5c\x7e\x5e\xe4\x8b\xf4\x7c\x18\xa9\xe2\x1f\x81\x6c\x23\x40\x02\xdb\xe2\x15\x99\xe6\xb7\x64\xd2\xe1\x5e\x0b\x4b\x89\x7e\x92\x1e\x27\x2e\xed\xd8\xe2\x3b\x76\xea\x87\xc1\xab\x91\x6b\xcf\xc3\x21\xfd\xc1\x1a\x79\x4d\x61\x9f\xf4\x23\xf2\x1a\x09\xd5\x11\xa0\xa2\x88\x97\x72\xf8\x3a\x49\x11\x99\x89\x67\x49\x8a\x58\x71\x8f\x5e\x7b\x24\xb2\x7b\x36\x51\x1d\x6b\x28\x73\xdb\xc8\xe3\x1e\xcd\xe2\x15\x71\xff\xc2\xac\x37\xf1\x23\xc2\x37\xdf\x09\x91\xf7\x9e\x2a\xf3\xd3\x41\x9d\x1d\x8a\xfd\x88\x10\x8e\xf9\x2d\x62\x3f\x02\xc4\x7e\xe4\xdf\x48\xec\xa7\xf7\x44\xb1\x9f\x1d\x23\xe2\x31\xe8\x5c\xf2\x47\x7e\xb3\xe4\x8f\x70\x8f\xda\x2d\xf9\xd3\x63\x75\xb1\x4d\xa3\xd6\x1b\xac\xcd\x34\xee\x24\x6a\x09\x10\x5f\x99\x39\x9e\x68\xa1\xbf\x88\x68\xdf\x70\x37\x09\xd8\x4d\xb8\xd2\xd8\xae\x75\xa2\x3e\xbd\x90\xf4\x9c\x45\x93\x1f\xa2\x83\x24\xcb\xc2\x11\xb2\xcd\x7d\xb5\x87\xf7\x63\xcc\x22\xcd\x9a\x5c\xaf\x72\x3a\x9f\xe8\x4d\x6b\x1f\xf6\x60\xea\x0a\x27\xa9\x3f\xeb\x8e\x3b\xc5\x79\x78\xc8\x2f\x3c\xa3\x28\x12\xff\x2c\x39\x1e\x88\x03\xe5\x61\xb7\xf6\xf3\x9e\xcc\x75\x14\x99\x0c\xc1\x11\x78\x7a\x38\x40\x34\x04\x7c\x5c\x08\xa5\xeb\xb5\x5d\xd7\x02\x53\xe6\xdd\xe1\x17\x9b\x59\xcf\x16\x37\x3e\x80\xcd\x67\x13\x40\x09\x58\x51\xb6\x54\x7a\x51\xe7\x73\x0c\x82\x0e\x7e\xbd\xc9\xe7\x79\x23\xfb\x5d\x2e\x5e\x13\x8d\xa8\x05\x2f\xec\x18\x2a\x76\x45\xc1\x2a\x6d\xf5\x41\x27\xee\xc8\xfb\xed\xf4\x8c\x4e\xd2\x93\x70\x1f\x9a\x46\x9a\x4d\x50\xab\x75\x75\xab\xfc\xd2\xc7\x08\x1a\xd9\x21\xb6\x74\x36\xf1\x35\x2c\x89\x60\x75\x58\x34\x58\x3a\x09\xd0\xf1\xd5\xca\x9e\x3a\xf7\x49\xcc\xe8\x12\x54\xa0\xec\xef\xd1\xf7\xf7\x7a\x36\xe0\x46\x5d\x09\x09\x16\x6d\x8e\xe3\xbe\xab\x73\x18\x71\x35\x56\x22\xbf\x0e\xe2\x43\xbd\xd5\xf7\x6c\xb9\x94\x5e\xe2\x99\xc1\xbe\x05\xb5\xe9\xbb\xf4\xd0\x77\xe9\xa1\xef\xd2\x43\xdf\xa5\x87\xbe\x4b\x0f\x7d\x97\x1e\xfa\x2e\x3d\xf4\x5d\x7a\xe8\x0f\x96\x1e\xea\x8f\xce\xe4\x6c\x4c\xea\x20\xb3\xc1\x68\x26\x2f\x07\x93\x8b\xe1\x6c\x36\x38\x13\xef\xbf\xc8\xfe\xe5\xe5\xf9\xf0\x14\x10\x9b\xe7\xfd\xcf\x0f\x29\x15\xc9\xa7\x28\x15\x89\x27\x2b\x15\xc9\x27\x2b\x15\x89\x47\x94\x8a\xe4\x33\x94\x8a\xc4\xa3\x4a\x45\xf2\xa9\x4a\x45\xe2\x71\xa5\x22\xf9\x34\xa5\x22\xf1\x24\xa5\x22\xf9\x54\xa5\xa2\x87\xb3\x9c\x18\xfd\x7d\x86\x52\x91\x78\x48\xa9\x48\x3e\x4f\xa9\x48\x3c\xac\x54\x24\x7f\x6f\xa5\xa2\x67\x6e\x86\x9d\xc2\x46\xf2\x49\xc2\x46\xe2\xab\x31\xd0\x2d\x61\x23\xf1\x24\x61\x23\xf9\x14\x61\x23\xf1\x35\x50\xe5\x87\x85\x8d\xc4\x33\xa0\xca\x8f\x08\x1b\x89\xe7\x08\x1b\xc9\xc7\x85\x8d\xc4\x77\x61\xa3\xbf\x77\x61\xa3\xf2\x5e\x76\xc8\xf1\x88\xaf\x94\xe3\x09\x2d\x35\x00\x16\x8a\xaf\x97\xe3\x91\xdd\x72\x3c\xe2\x6b\xe5\x78\x64\xa7\x1c\x8f\xf8\x0a\x39\x1e\xf9\x5d\x8e\xe7\xbb\x1c\xcf\xf3\xe4\x78\x06\xb7\xaa\x06\xc4\x65\xae\x59\x4a\x8c\x88\x4d\x63\xbe\xef\x45\xb5\xc9\x55\xe7\x21\x34\xdf\x36\x82\xe3\xd0\xb2\xdb\x2a\x5f\x02\x0f\x4e\xa9\x73\xdd\xa8\x72\x81\x47\x51\x70\x98\xba\x50\xa1\xc2\x53\xc3\xf8\x6b\x55\x59\xdc\x8b\xb9\x22\x10\x97\xe7\x6e\xf6\x15\x68\x44\xa9\x03\x9e\x9f\x7f\xdc\xb4\x51\x77\x59\xbd\xb4\xe5\x8e\x4c\x7a\x46\x58\x52\xe9\x6f\x11\x1b\x82\x45\x28\x9c\xd8\x50\x5b\xf1\xa6\xe9\x6c\xcd\x43\x1a\x38\x82\x69\xe0\x98\xbe\x58\x44\xff\x87\x6a\x5b\x2e\xdd\x76\xe6\x91\xe8\xd6\xf3\x83\x2f\x0a\xf6\x45\x88\x1c\x6a\x20\x2b\x0c\x4a\xe9\x5d\x9a\x1b\x06\xc9\xea\xb6\xb7\x9e\x8b\xea\x71\xe6\x20\x85\xad\xe8\xe2\xea\x01\x16\xe2\xe9\x5a\x4b\x22\xd6\x5a\x92\x5f\xad\xb5\x24\xbc\xd6\x12\x4f\x3c\x7c\x85\xd6\x92\x78\x50\x6b\x49\x3e\x5f\x6b\x49\xec\xd2\x5a\xda\x95\x68\x7c\x50\x6b\x49\xec\xd0\x5a\x12\x1d\x72\x49\xf2\xeb\xe5\x92\x44\xa7\x5c\x92\xfc\x2a\xb9\xa4\x56\x6a\xd4\x62\xa5\x9f\x2d\x97\x24\x76\xca\x25\xc9\xaf\x96\x4b\x1a\x55\xcd\x0d\x52\xa7\x76\x9a\x75\x3e\xe8\x3d\x57\xdc\x7c\xb1\x49\x35\x06\xea\x17\x96\xf6\x34\x18\x82\xaa\xf6\xc3\x0b\x07\x04\xc4\x43\x0f\x30\x1e\x3a\x57\xa5\x02\x16\x89\x3a\xa8\xf1\xc7\xf8\x75\x77\x95\x09\x5a\xa8\x3e\x79\x74\x20\x3f\x10\xfc\xb5\x9d\xf4\x91\x23\x48\x3b\x08\xb1\x07\x95\xb8\x3c\x63\x8f\xfa\x64\x9d\x88\x02\xbf\xc2\xfc\xe1\xea\x9e\x2d\xdc\xb3\x2d\x43\x06\xbf\xdd\x1d\x47\x51\xe0\xd9\x45\x88\x0e\x7f\x32\xc5\x70\xd7\xdb\x54\x1e\xa7\x87\x18\x42\xa2\x5c\xe4\xf2\x9d\xfc\x7f\xa1\xee\x97\xd6\x20\x58\x4d\xb4\xea\xe1\xbf\xc1\xac\x74\x20\x57\x11\x80\x5c\x25\x07\xb9\x1a\x2b\xf7\xff\x4b\xf7\x84\x98\xe6\x6b\xe4\x55\x62\x72\x8e\x9d\x19\x31\x9e\x3d\x86\xbf\xf8\x51\xc7\xa9\x16\x0c\xa2\xc3\x19\x6e\x23\x74\x84\xb3\xdf\xa2\xe9\x41\x13\x18\xd1\x47\x40\xfd\x42\xbc\x88\x12\x8a\x02\x74\x5e\x5b\x69\xce\xcd\xb6\xe1\x69\x44\x30\x89\x58\x16\xdd\x98\x76\x89\x00\x53\xf2\x4b\x4b\x67\x27\xfc\x56\x51\x11\x8c\x7e\xdf\x66\xb3\x33\x69\xcb\xb8\x2c\x1c\x3e\x13\x8e\xc8\x1c\x33\xe5\x55\x7d\xdf\x23\x6a\xda\xcc\xa7\xb0\x25\x86\xe0\xe6\x98\x36\xc2\x48\x77\x51\x55\xbf\xb0\x45\x60\xd9\x39\x61\xc9\xda\xa6\x65\xcb\x25\x9f\xa2\x6c\xb1\xd8\xc2\x25\x42\x29\x32\xac\x92\xb7\x98\x25\x20\x2e\xc0\xe2\x83\xbf\x75\x65\xdd\xdf\xc7\x4f\xfa\x72\x36\x9e\xfc\xf3\xd5\xe0\xe0\x28\x3d\xfa\xbd\x4a\x40\x1f\xe1\xff\x78\xfb\xe6\xa4\xc5\xff\x71\xf4\xfa\x7b\xfd\xe7\x1f\xf2\x83\xb3\x2f\x6f\x8f\xd3\xd7\xff\x97\x9c\x5a\xcf\xd4\x02\xdc\x6e\x8f\xd2\x23\x19\x52\x84\x1c\x1f\x1e\x1d\x1e\x1c\x1f\x1e\x1d\xc9\xfe\x32\xdb\x58\xc6\xac\x0d\x04\x27\xc5\xc0\xb8\xd1\x9b\x3a\x87\xac\xe1\xb0\x5c\x74\x33\x88\xc8\x2b\x1d\xe5\x8b\x89\x30\x0a\xc0\x8e\xcb\x10\x75\x49\x0d\x74\x4e\x33\xb6\x14\x28\x89\x82\xc2\x06\x44\x7f\x02\x3a\x9d\x08\x2d\xe1\x60\xc1\xaf\x0b\x4a\x65\xff\x79\xab\xb4\xe5\x6e\xb5\xa7\x91\x5a\x67\xc6\xd5\x65\x00\xf0\xf5\xb6\xa4\x08\x0a\xbd\x1c\xbe\x0d\x30\xef\xaa\xfe\xf3\x56\xc1\x3f\xff\x87\xde\x6e\x54\xbd\x28\xb6\xba\x51\x75\x5a\xd5\xd7\xa9\xb8\x82\x8f\x2d\xb2\x12\x6f\x4a\xbd\x9d\x23\x7c\xc3\x3e\xda\x7c\x4f\x9a\xb7\x21\xcd\x9a\x6e\xcc\x23\x6f\x9a\x66\xf3\xee\xe5\xcb\xbb\xbb\xbb\x34\x7e\xe2\x4b\xf3\xd9\x75\x56\xbe\x2c\xc0\xea\x5d\x55\x2f\xd9\xfb\x53\x71\x0a\xd8\x35\xf3\x4a\x0c\x15\x53\x63\x09\x51\xad\x2b\xb8\x17\x3d\x43\x9d\x26\x58\xc4\x45\x95\xcd\xe5\xbc\xce\xc0\x4e\x71\xd2\xc0\xe0\x9c\xb4\x67\x14\x27\xd1\x74\xe9\x5a\x35\x6e\x2e\xec\xf8\x76\x7f\x47\xdc\xe6\xd9\x3b\x21\x06\xa6\xf5\xef\x68\xc8\x0e\xe8\x3b\xff\x23\xa3\x8f\x2f\xec\xa7\xd3\x45\xb5\x4e\x85\xb8\xbc\xa9\x4a\xf5\x4e\xee\xff\x70\x78\xd4\x93\x6f\x8f\xde\x1e\x9c\xbc\x3d\x3c\x14\xe2\xb3\x9a\xbf\x93\x66\x6c\x3a\xbf\x07\x7f\xa1\x01\xab\x15\xd6\xd7\x68\xf3\x07\x4e\x51\xa5\x09\x26\xaf\x39\xd8\x80\x2d\x7b\x26\x64\x6d\xfe\xb2\x67\x37\xc1\x5e\x4f\xa2\x8e\x5c\x2d\x74\xde\x28\x0c\x55\x2f\x3c\xb5\x15\xd6\x8b\x59\x40\x05\x2d\xb0\x5a\x75\x39\xf6\x6e\x5f\x35\x95\xa0\x18\x50\x6e\xf9\xb0\xec\x33\xf5\x51\x2a\xcf\x5b\xa5\x3a\xd4\x4e\xf3\x5d\x98\xd2\x88\x42\xcd\x7a\xf2\xb8\xa5\x90\xab\x34\x6e\x00\xef\xea\x03\x14\x3d\xe2\x41\x8a\x1e\xf9\x10\x45\x0f\xa0\xec\x56\xa1\x05\x28\xda\x4c\x3d\x29\x30\xf5\xf4\x01\xce\x1b\x37\xf2\xf9\x64\x3d\xc2\x82\x50\x3c\x93\xcc\x1a\xa1\xcf\x16\xc3\x93\x97\xc6\xe8\xc9\x40\x70\x47\xbe\x4e\xe4\x03\xc4\x3a\x70\xd2\x30\x3a\x9d\x5d\x0f\x41\xae\x9f\x8e\x2e\x7c\x2d\xdd\xcf\x33\x7b\xf1\xea\x37\xe9\x45\x27\x5b\x90\xe4\x6c\x41\xe2\x79\x6c\x41\x1d\xe4\x47\x16\xa2\xec\x50\x62\x16\x2e\x9c\x5b\xa5\x86\x80\x29\x14\x61\xbc\x82\x60\xbc\x10\x84\x53\x4d\x50\x4d\xc7\x4e\x73\x47\x2c\x17\x16\xa9\xc6\xe5\xea\xa2\xa9\xe8\x0b\x18\x18\x68\xad\x31\x2a\xaa\xe3\x10\x36\x3b\x32\xc1\xf2\xac\x05\x67\xbe\x86\x86\x94\x15\x13\x9a\xc5\x6b\x03\x67\x24\xf8\xe6\xa6\xd8\xa2\x10\xcc\x1a\x4a\x64\x57\x4a\xa1\xec\x13\xd4\xc0\xc6\x6d\x6f\xd7\x92\x4f\x39\x8f\x92\x69\xa6\xb9\xdd\x20\x99\xe8\xde\x92\x11\x21\xa8\xc7\x6b\xb2\x68\x80\x95\x66\xea\xb9\x3d\x5d\x2b\xf3\xbd\x05\xcd\xdc\xab\x6f\xe1\x79\x8a\x9a\xf7\x28\xcd\x13\xb1\x3c\xed\xd1\x14\x82\xea\x4a\x5c\xa8\x3b\xde\xa8\xf2\xf2\xfd\xd4\x6a\xd7\x64\x3a\xa4\x7c\x1a\xf5\xa7\x7d\xd9\x5f\x2b\x2d\x27\x4a\xab\xac\x5e\xdc\x88\x53\x65\x2c\x8e\x44\x9e\x67\x77\x48\x2b\x7f\x9e\xdf\xaa\x1a\xa6\xc6\x49\x95\x9c\x63\x81\x73\x55\x53\x45\xdd\xcf\xaa\xce\x97\x79\x56\xda\xd5\x04\x54\x92\x84\xc0\xe4\x86\x4f\x2a\x8f\x02\x7d\xba\x69\x55\x6c\x09\x33\x0d\xb7\xe2\xcf\xb9\xce\x9b\x9d\x57\xd0\x4b\x4b\x0e\xf5\x12\x00\xc6\xd0\xa4\x80\xd4\x71\x6e\x26\x84\x2d\xe8\xa6\x92\xcb\xea\xae\x2c\xaa\x6c\xe9\x96\xed\x87\x50\xba\x4e\xe0\x97\x82\x1b\xdc\x71\x50\x21\x3f\xad\x8d\xc8\x3c\x7a\x49\xfb\xed\x94\x48\xad\xd4\xee\x4b\xd6\xb8\xc0\xaf\xe3\x44\xaa\x05\x15\xc8\xdd\x94\x55\x36\xdf\x1f\x25\xfa\xbf\x08\x96\xd8\x4f\x77\x10\x57\xc9\xa7\x11\x57\x89\x67\x11\x57\x25\x8f\xb2\x56\x25\xc0\x6d\x15\x63\x01\x80\xcb\xca\x27\x89\x1f\x66\xb5\xea\x9f\xf5\x2f\x67\xc3\x9f\x07\xe2\x74\x7c\x71\x79\x35\x1b\x8e\x3e\xca\xc1\x68\x36\x98\x5c\x4e\x86\x53\xea\x4c\x2a\x4f\xc7\x93\xcb\xf1\x04\x11\x0a\x72\x38\x9b\xca\xfe\x87\x0f\xc3\xf3\x61\x7f\x36\x38\x93\x48\xb5\x02\x1d\xc7\xfc\xa5\xb8\x4a\xa7\xa9\xfc\x38\xfe\x79\x30\x19\x21\x3d\x15\x26\x86\xc7\x1f\xf0\xab\x1f\x07\xa3\x53\xd3\xe1\x5d\xf4\x59\x30\xac\x36\x79\x2c\x9e\x9b\x3c\x7e\x88\x40\x4b\x3c\x89\x40\x4b\x3e\x89\x40\x4b\x3c\x89\x40\xab\x3b\x2b\x1d\x12\x68\x89\xdf\x22\x2b\xcd\x08\xb4\xc4\xb3\xb3\xd2\xbb\x08\xb4\xc4\xe3\x04\x5a\xd2\x12\x68\x85\x06\xac\x0b\x83\xef\x10\x66\xbf\x6a\xb2\x9b\x84\x9d\xf2\x4c\x64\x23\x6f\xb4\x58\xdc\x54\x39\x09\xb6\x66\x77\xb2\xde\x16\x4a\xa7\x72\x54\x35\x4a\x1e\xbd\x93\xfe\x40\xf6\x87\xad\x25\x5a\x50\x59\x5d\xe4\xde\x24\x35\x46\xe4\x89\xf0\x07\x75\x6a\xbf\xec\xa4\x19\xd8\x79\xad\xee\xab\x72\xe9\x8e\x74\xf3\x4d\xbc\x86\xf9\x6f\xac\xfd\x0a\x87\x97\xfd\x83\xb3\xc7\x8d\xdb\x31\x57\x54\xdb\xa3\x96\x32\x33\x17\x08\xf3\x97\x36\x73\x0d\x6c\x09\x70\xdc\x4e\x94\x3e\xcf\xe7\x53\xb8\x16\x26\x80\x9b\x4a\x33\xbd\xf9\xf5\xff\xfe\x45\xdd\xdf\x55\xf5\x52\xff\x63\xb5\x51\xe5\x66\xae\xff\x4b\x5e\x2e\xb7\xba\xa9\xef\xff\xb1\x5f\x14\xff\x65\x53\x57\xc2\x1c\x9f\xff\x42\x3a\x06\xf0\xcb\x45\xd6\xa8\xeb\xaa\xbe\xff\xc7\x0f\xb5\x52\xff\x70\x7c\x68\x2f\xba\x7f\x38\x3e\x3c\xa3\x13\x5a\xff\x17\x48\x51\xfd\xcb\xfc\xfe\x1f\xa1\x08\x06\x0c\xf0\x1a\xe4\x71\xac\x93\x84\x0e\x66\xac\x4f\x4b\x7f\x75\xfd\xd6\xf2\x4e\x99\x3b\x18\x33\x28\x76\x08\xac\x59\xff\xfb\x07\xb1\xd2\x97\xe3\xf3\xb3\xfe\x25\x30\x80\xfd\x5e\x01\xa0\xc7\xf8\x5f\xdf\xbc\x3d\x6a\xc5\x7f\x8e\xdf\x7e\x8f\xff\xfc\x11\x3f\x76\x47\x9a\x45\x10\xd1\x49\x08\xc1\xe8\x24\xd2\xa3\x44\x1e\x1f\xc9\x33\xb5\x50\xeb\xb9\xaa\xe5\xd1\x8f\x3f\xfe\xc8\x22\x43\xe6\x9f\x89\x0c\x1e\xe6\xd3\x88\x89\x71\x10\xee\xaa\x6a\x29\x4e\xf3\xe6\x3e\x91\xa7\x59\x91\xaf\xaa\xba\xcc\xb3\x44\x5e\x4d\xfb\x68\x85\x4e\x30\x48\x34\x79\x94\x66\xb6\xc5\x32\x0a\xb6\xb3\xc7\xbc\x85\x5e\xcd\x3e\xf3\xe7\xbf\xc5\xc7\x6d\x76\xd0\xd0\x8a\xaf\xa5\xa1\xf5\x9e\xa0\x17\x65\xb0\x82\x10\x58\xfa\x11\x3f\xcc\x57\x75\x5a\x62\x98\x28\x11\x61\x7b\xfe\x9f\x92\x91\x76\x66\x09\x5d\xf7\xec\x0a\xdb\xc3\x3e\x90\xcc\xc9\x33\x68\x5a\x85\xa7\x69\x9d\x46\x34\xad\x3b\xd9\x59\xad\xd3\xd3\xb1\xbc\x53\x40\x7a\xb7\xbf\x92\xc8\x4d\x01\x98\x0f\x98\xae\x45\x23\x57\xee\x2b\xff\xc3\x5c\x46\xc5\x32\xdb\x60\xe0\xd0\x78\x62\x97\xbb\xb9\x64\xa7\xbc\x90\x87\xba\xbb\xc8\x8a\x42\x2d\xf9\x60\x94\x98\x2e\x16\xec\x57\x28\x40\x44\x53\x91\xd7\xc4\x75\xfb\xdc\xae\x32\x40\x40\xea\xfb\x0f\x0e\x9c\xab\xc8\x7a\x70\x78\xc0\x7d\xd8\x42\x9a\x72\x09\x48\x36\x1b\x7a\x85\xac\xbe\xf5\x76\xfd\x29\x54\x57\x90\x84\xdf\x67\x57\x3d\x1f\xaf\x97\xbd\xc7\xa8\x72\x8d\x71\x35\xbe\x1c\x8c\xb0\x25\xe3\xab\xd1\x19\x42\x1c\x8d\xb9\x18\xa0\x2f\xff\xcf\xff\xe9\x4f\xc5\x70\xfa\xe2\x45\x4c\xa2\x6b\x8c\xb4\xe7\x7a\x23\xc6\x0c\x16\x4f\xf6\x46\xe4\x53\x68\x74\xc5\xe3\x34\xba\xbb\xfa\x6a\x9a\x3f\x9b\x06\xdd\x15\xbf\x01\xc3\xee\x53\xd0\xa5\xcf\x64\xd8\x75\x0e\x82\xf8\x76\x86\x5d\xeb\x20\x88\x6f\x67\xd8\x65\x1f\x13\xdf\xc6\xb0\xcb\x1c\x04\xf1\xad\x0c\xbb\xf2\x37\x66\xd8\x45\xfe\xff\x13\xe2\xff\x3f\x18\x55\x07\xa3\x2d\x88\xa8\x1d\x7c\xa6\xf2\xc9\x6f\x37\x0a\x1f\xb3\xff\x8e\x8f\x4f\x22\xfb\xef\xed\xc9\xeb\xd7\xdf\xed\xbf\x3f\xe2\x27\x4e\xee\x1d\x9e\x1c\x1c\x1f\x1e\xbe\x96\xd3\x6d\x29\x2f\xf2\x45\x5d\xe9\x7b\xdd\xa8\x35\x4f\xe7\x3d\xd9\x52\xfb\x9b\x09\x02\x1c\xfc\x26\x19\x86\xc4\xa6\x58\x9e\x2b\x07\xd0\x7a\xfd\xdf\xb3\xe9\x75\xd0\x49\xa9\xbf\x63\x79\xc4\x9c\xfa\x7f\x6b\x3e\xfd\xe0\x9b\x39\xeb\x2d\x06\x27\x93\x3d\xb7\xfe\x32\x57\x2e\x6e\x71\x69\xbf\xe4\xe5\x32\x95\xe6\x8a\x25\x9b\x40\x30\x8b\xc0\x17\x11\x21\x6d\xf1\x60\x6a\xae\x4c\xac\x2a\x32\x77\x4e\xa7\xc5\x00\xf7\x41\x44\xcd\xff\xe5\xab\x02\x95\xe6\xca\x69\x95\x2c\x81\xb1\xf0\x69\x30\x19\xbc\x37\x66\x8c\x79\xa7\xb1\x18\xa6\x57\x23\x79\x31\x3c\x9d\x8c\xa7\x5f\xa6\xb3\xc1\x85\x0d\x41\xee\xef\x4d\xaf\x46\x7b\x3d\x68\xac\xb1\x13\x10\xd4\xe3\x2a\x52\x84\xb9\xbd\x3b\xcc\x05\xba\xeb\xa7\x57\x1f\xfe\x7f\xf6\xde\x6d\xb9\x71\xe4\x5c\x17\xdc\xd7\xf9\x14\x19\x8a\x98\x68\x31\x02\x62\x97\xea\xd0\x6d\x57\xad\x58\x11\x2c\x89\x55\xa2\x2d\x91\x32\x49\x75\xb5\xd6\xd5\x06\xc9\xa4\x04\x17\x08\xd0\x48\x40\x6a\xfa\x6a\xde\x61\x1e\x62\xde\x63\x1e\x65\x9e\x64\x22\xff\x43\xe6\x9f\x00\xa8\xaa\x5e\x7b\x2d\x3b\x66\x87\xfb\xc2\xe1\x12\x71\x48\xe4\xf1\x3f\x7c\xff\xf7\x7d\x1a\xcf\xd1\xd8\x22\x38\xd0\x58\x8f\x16\x7a\xa4\xe7\xe3\xc5\xdd\xf5\x12\x8f\x6e\x30\x05\x6e\x66\x97\x93\x4f\xf7\x93\xe9\x67\x15\x55\x6b\x4c\x3f\xb7\x42\xc7\x64\xaf\x5c\x8e\xe7\x93\x5f\x46\xcb\xc9\x2f\xe3\x45\x6c\xed\x7c\x99\x5c\x5f\xc3\xc7\xcc\xe6\x2a\x6e\x70\xb7\x99\x50\xca\x32\x77\xf7\xdd\x8d\x13\xb2\x1a\xa0\x58\x84\x0d\x89\x4f\xd0\x16\x8e\x88\xb2\xe9\xe3\xcd\x9d\xc8\xc0\x91\x26\x11\x18\x21\x77\xd3\x89\x6b\x1f\x77\x46\xd2\x67\x73\xcc\xc7\x9f\x47\xf3\xcb\xeb\xf1\x62\xc1\x67\x79\xaf\xf9\xc1\xb6\x42\x27\x82\x08\x73\x6d\xca\xa6\xe2\x72\x06\x7f\x3e\x62\x34\xb8\x4e\xb9\x1a\xb9\x7e\x18\x4f\x5f\xb0\x20\x54\xb7\x74\xe5\xbe\x6c\xa4\x10\x07\xef\xaf\xad\x45\xe3\x3c\x0e\x54\x2c\x6f\x09\x23\x6e\x29\x1f\x94\x15\x98\x79\x84\x6b\x12\x54\x3d\xab\x1a\xaa\xc9\xf4\x35\x59\x28\x2a\x0a\x37\xb3\x96\x26\x10\xab\xa2\xb9\xc1\x1c\x01\x87\x7f\x01\xb7\xfe\xa1\xff\x0d\x7f\xfc\xfc\xe9\xf2\xfa\xec\x7c\xf8\xe6\xac\xac\xce\x00\x52\xf3\x5f\x1e\x05\x7c\xd9\xfe\x7b\xf7\xf6\xcd\xcf\x6d\xfc\xd7\xdb\xb7\xaf\xfe\xa5\xff\xf4\x0f\xf9\xef\xf3\xf4\x4e\x7f\xaa\x8c\xd1\x97\x51\xd8\xac\x13\x02\x3c\x1f\xbe\x49\xf4\x1b\x3d\x2d\x9f\x30\xfe\xf7\xfa\xd5\xab\x3f\x48\x64\xd8\x05\x18\x8f\xaf\x12\xf7\xbf\xe7\xf0\xbf\xaf\xe1\x7f\x7f\x4e\xf0\x52\xf7\x0e\xe5\x03\x19\x32\x36\x08\x86\xc3\xbf\x91\xaf\xbf\xb5\x5b\x70\xf1\xff\xfd\x77\x56\x94\x3c\x99\x6a\x95\xd6\xd9\xae\x5d\x5a\x42\x81\x74\xc5\xb6\x10\x54\x98\x20\x81\x3b\xe2\xe5\x79\x83\x03\x4e\x02\x96\xc0\x7b\x35\xd4\xb7\xf3\xf1\xe8\xe6\xe3\xf5\x18\x45\x0e\x89\x77\xca\x3f\xf6\x3a\x70\x08\x72\x0d\x1b\x70\x8b\x34\x69\x9e\xe8\xda\xfc\x56\xaf\xca\xf2\xab\x60\xd3\xde\x36\xc5\x9a\x78\x74\xc9\x38\xde\x36\xb9\x37\xd0\xf4\xc9\xb6\x32\xe6\x84\xed\x36\x0b\x8f\x2e\xb7\x90\xee\xdf\x94\xbb\xf7\x50\x08\x63\x6d\x53\x81\xcc\x3e\x76\x4a\xfd\x68\x94\xe7\xbf\xe2\x2b\xa3\xde\x91\x48\x3a\x9d\xd5\x47\x4c\xee\x03\x76\x43\xa2\xc8\xc8\x0b\xd4\x03\x39\x54\x15\x62\x49\x94\xff\xd3\xd0\xc3\x92\xb3\xfc\x90\xc4\x9d\xb1\xe7\x9a\x19\xc5\xf4\x6e\xc8\x05\x0e\xad\xe1\xfa\x86\x0a\x2c\x2d\x00\xff\x3e\x98\x9a\x43\x42\x74\x43\x56\x79\x76\xf4\x2c\x07\x84\xaf\x62\x09\xcb\xc2\x66\x1b\x40\x3e\xb5\x2a\xa9\x5b\x38\x0a\xd6\xf5\x86\x6e\xb7\x6c\x02\x8a\xe1\x4a\xc1\xae\x73\xbd\x7b\xe2\x7a\x2a\x37\xdb\xfa\x24\x21\xc0\x01\x33\x44\xa7\x35\x1a\xa0\x48\xfd\xfb\x4c\xd4\xbf\x4a\xda\xd4\x68\xc3\xd7\x8f\x66\x67\x4d\xfe\x64\x2c\xa3\x33\xfc\x18\x3a\x3b\xd9\x22\x34\x6b\x52\x13\xa0\x65\x47\x1c\x8e\x46\xbd\xc4\xe1\x4c\xac\xab\x96\xa2\xbb\xae\x85\x81\x43\x8e\x8f\xe1\x2d\x61\x1d\x15\x1f\xd4\x43\xa5\xbe\x18\xe4\x37\xf0\x17\xc5\x53\x55\x54\x55\xc1\xa1\x5d\x13\xd7\xb5\x9b\xb4\xd6\x3f\xd0\x9f\xfc\x89\x5a\x19\x20\x53\x89\xff\x0c\x9c\x9b\x16\xff\x16\x39\x18\xef\x75\x8a\x7f\xdd\xfb\x72\x31\x4e\x80\x51\x19\x38\xbf\x0a\x8d\x70\xae\x65\x87\x9e\xa2\xf9\x6b\x83\x87\x17\x44\xbf\x4a\x63\x87\xfa\x63\x83\x86\x89\x12\x43\x79\x8c\x82\x9b\xde\xf3\xc1\x7d\x22\xa5\x10\x3d\xb5\x1f\xd0\x15\x9a\xdf\x80\x06\x15\xa7\x1a\xca\x3a\xe6\x54\x74\xcf\x05\x40\xbb\xb4\xae\x4d\x45\x6a\x06\x48\x44\x1a\x97\xe9\x20\x14\x7e\x5f\x39\x7b\x66\xa3\xdc\x72\x1f\xea\x2f\x46\x48\xa8\xb7\x96\x46\x56\xac\xb3\x3d\x2c\x2a\x20\xe8\x87\x39\xf5\x8c\x14\x19\xb4\xb7\x40\xf9\x88\x37\x9c\x14\x60\x61\x29\x8f\xeb\x85\x4b\xb8\xc8\x3c\x44\x10\x23\x29\x93\x68\xb2\x43\x0d\xb1\xf1\x14\x9a\xd8\x2b\x61\x4b\xc2\xaf\x27\xa4\x16\xb2\x21\x26\x11\xed\xbc\x55\x8c\xc7\xd7\xfb\x3c\x5d\x87\xa4\x73\x47\x4a\xcd\xa6\xb4\x8b\x70\x77\x6f\x44\x49\x15\x97\xf4\xb4\x2b\x8f\xaf\x19\xb9\xb8\x90\xd0\x7f\xe6\xfd\x4c\x91\x7a\xfa\xac\xcb\x3d\xad\x3c\x71\x79\x53\xf0\xe8\x67\x85\xde\x10\x97\x7a\x12\xc4\x67\xd3\x1a\xf5\x05\x42\x7d\x8a\x70\xa0\xb1\xd4\x49\x21\x59\x30\x66\x17\x4e\xf8\x08\x3c\x49\x50\x49\x39\xc1\x11\xf0\x5d\x08\x45\x0a\xa1\x1f\xdd\xc3\x11\x0c\xb8\x83\x33\x91\x85\xce\x91\x0f\x1c\x57\x30\xab\xe3\x12\x23\x08\x70\x41\x57\xc6\x5a\x9c\x40\x27\x87\xb2\x39\x19\x6a\x34\xc3\xa1\x1c\xab\x0e\x44\xc7\x2a\xdb\xea\x43\xd9\x40\x77\x27\x5c\xf0\x57\x56\x6d\xc9\x6d\x96\x50\xc0\x6d\x15\x89\x46\xdc\x68\x88\x78\x3e\x0e\x81\x20\x76\x05\xc5\xf8\x91\x0e\xea\x0c\x74\xca\x9f\x70\x18\xff\xd2\x6f\x73\x5e\x97\x04\xde\x43\x53\x83\xd7\x2e\x5f\xa6\x90\xa7\xb1\xac\x38\xd8\xe2\x8e\x1b\x7f\xa0\xec\x33\xd4\x5b\x86\x03\x3a\xe1\x13\xa8\x1f\xbc\x07\xd4\xdf\x40\xb7\xa2\xb2\x02\xba\x9d\x74\x8d\xd3\xe2\xa1\x49\x1f\x0c\xb6\x3b\x94\xc6\x50\x9d\xda\x09\xf6\x76\x91\xee\x5c\xc7\xee\xf7\xa6\xd8\x64\xbf\x01\x37\x92\xde\x56\x65\x51\x9f\xd1\x7a\x66\xc6\x25\x12\x81\xf0\x9f\x49\x7b\xbe\xdb\x9d\x3c\xfb\xb9\xcc\xda\x63\x49\x6c\x59\xd8\xc7\x6c\xaf\xe5\x30\xbb\x13\xcd\x82\x6e\x08\xca\x5e\x74\x3a\x90\x92\x1b\xfc\xef\x1f\xac\x2e\x9f\xdc\xb6\x9f\xfb\xad\xe6\xb4\xac\x90\x7f\x1e\x59\x66\xb0\xa5\x76\xc0\x3c\x9d\xa8\x29\x51\x50\xd5\x19\x2d\x50\xb7\xb1\x6e\xdd\x43\xb0\xe0\x86\x9a\x0a\x67\x4f\x5a\xb7\xdf\x30\x54\xa7\xcb\xc7\xc6\x26\xcc\x87\xe8\xdb\x06\x3b\x0e\xaa\xcd\xa7\xde\x6a\x01\x4e\xce\xd4\x9d\x6c\x69\x9d\xad\x6d\xa2\x25\xc3\x21\xd7\x94\x73\x22\xca\xfc\xb6\xcf\x53\xde\x43\xc2\x4d\xc3\x01\x2c\xa8\xa8\xd7\xd6\x9c\xf4\x49\xfd\xe6\xba\xd5\x8f\x99\xad\xcb\x2a\x5b\xa7\xb9\x6a\xd3\x6e\xc1\x21\x40\x5d\xc4\x53\xa6\xd5\x47\xc4\x47\x84\x12\xba\x89\x30\x5d\x12\xb5\x7f\xcc\xf2\xd2\x96\xfb\x47\xf7\xec\x44\x9b\x1a\xfe\x0f\xc4\x9a\xca\x3c\xab\xe1\x1f\xfb\xd2\x22\xc5\x75\xd0\xff\x77\x5f\x30\x44\x93\xef\x64\x52\x3c\xa5\x55\x96\x16\xb5\x2f\x86\x3c\xc1\x62\x3b\x42\x7c\x77\x7a\x85\x37\x74\x00\x84\x60\x38\x12\x8f\x62\xd7\xe6\x44\x01\x44\x06\x5f\x42\xa6\x64\xf7\x0d\x09\xdb\x0f\xb4\x1b\x12\xcd\xe6\x41\x1c\x8c\x7e\xcd\x01\x7f\x35\x24\x18\xa3\xba\x45\xbf\xaf\x02\xa1\x70\xa0\x18\xa3\x82\xf9\x6d\x56\x8b\x80\xe3\xc6\x6c\xa1\x28\xd8\x9d\x37\xb2\x20\x10\x6a\xc3\x3a\xc6\x31\x55\x35\x86\x8f\x72\x7b\x98\xff\x08\xdc\x44\x7d\xf3\x40\x0e\x9c\xf2\xd4\x7f\x37\x55\xd9\xf3\xb5\xd0\xc6\x68\x46\x06\xd2\x75\x94\x97\x00\x60\xab\xea\xde\xa9\x99\xef\xb2\x32\x24\xb2\x54\x18\x1e\xb7\x0b\x37\xfd\xf5\xd2\xfc\x56\xb7\x06\xcc\x3e\x96\x55\xad\xf7\xa9\xb5\xc0\xb0\xe4\x56\xaa\xf9\xad\x0e\x4a\x4d\x79\x66\xdd\x40\xb9\x8f\xfa\x04\x9b\x06\x3c\x49\xc1\x93\xdc\xcc\xf9\x98\xae\xbf\x9e\x89\xa7\xff\x8e\xc1\xd2\x62\xb0\x54\xdf\x60\x8d\xe4\x2b\xe1\xf1\x2c\xcc\x9d\x3a\x43\xdd\xd6\xfa\x9d\x06\x18\x13\xa9\x6a\x8b\xc6\xa8\xbe\xab\x5f\xd3\xe5\xb8\x5f\x2e\xdd\xae\xba\x4f\x2b\xd0\x47\x92\xf4\x95\xed\x7d\x5e\xef\xd2\xf5\x63\x56\x98\xb3\xca\xa4\x1b\x00\x3b\xe3\xe9\xe3\x29\xc8\x61\x5f\x76\xbb\x2a\x40\x52\x69\xc2\x7b\x09\x72\x2f\x78\xe0\xb1\xd2\xb4\xfd\x3d\x90\xad\x8b\x47\x23\xd9\x19\x99\x55\xbe\x34\x7c\x0b\xe6\xce\x53\x20\x99\xf7\x86\xb6\xad\xab\xd4\x9d\x5a\xdb\xb2\x7a\x76\x86\x1a\xed\xca\x2c\xf5\x0f\x43\x88\x2a\x47\x50\xcc\x79\xea\x9e\x94\x21\x87\x96\xb3\xba\x4b\x20\xc4\xdf\xea\x7d\xf6\x9b\xc9\xed\xc0\xdf\xb7\x4f\xb3\xa2\x8e\xd8\x86\xe0\xce\x4d\x95\x3e\x67\xc5\x83\x1d\x28\x5b\xee\x8c\x76\xe6\x47\x7e\x10\xdf\x43\xbf\xd3\x1b\x99\x1d\x1b\x45\x9a\xa2\x8f\xc9\x0a\x28\xc2\x2c\xa1\x81\x0a\xbb\xab\xc6\xb3\x02\x0d\xd1\xa6\x2e\x61\xb3\xf4\x47\x1e\x91\xed\xa7\xda\x4d\x76\x83\x71\x68\xbc\x2f\x7e\xb4\x8a\x1e\xad\xc3\xa3\xdd\x2c\x82\xc1\x05\x27\x08\x76\x65\x21\xaa\x21\xe6\x00\x56\x6e\xe2\x8d\x0a\x87\x70\x97\x56\x5f\x9b\x3d\x6c\xa8\xe9\xca\x1a\x8a\xcf\xf1\x5f\x3d\xbc\x0f\x42\xe4\x0f\x5c\x2c\xf5\xec\x4e\x0e\x52\x30\x28\x9b\x2a\x7d\x30\x4a\x30\x0c\x47\xe0\xee\x95\x33\x4d\xd2\x8d\xeb\x00\xda\x53\x44\x7b\x9c\x11\x85\x63\xc6\xf3\x2a\xb3\xaa\x75\x8d\x3b\xbc\x22\x2b\xde\xbd\xa9\x4e\x91\xae\x33\xdd\x95\x0d\xea\x1c\xb8\x2e\xf1\xfd\xc0\xb3\xcc\x3d\x2a\x5e\x03\x99\x15\x00\x8a\xf4\x6f\x8d\x39\x81\x8a\x78\xe0\xea\x23\x3f\x20\x74\x38\x8c\x00\xc0\xa5\x45\x73\x28\xce\xc0\x75\xb3\x78\x0c\x8e\x16\x17\x93\x89\xcf\x50\x70\xef\x2d\xcd\x6f\x59\xb1\x2d\x69\x4a\xe0\x03\x13\x7d\x9d\x2e\xcd\xaf\xad\xbf\x2d\x3e\xdf\x5c\xbb\x0e\xfd\xf5\xe6\x9a\xe9\xbf\xbc\xba\x8c\x0a\x93\xf0\x72\x79\x49\xda\x30\x75\xea\xf6\xeb\xcd\xd9\xba\x04\x90\x38\x70\x9e\x66\xee\x23\xf4\xd5\xf2\xe6\x3a\xd1\xb7\xa5\xad\x17\xeb\x0a\x18\xee\x2b\x7d\x7b\xf9\xc9\x3b\x87\xe0\xa3\x3f\x36\xbb\xb4\x88\x06\x6a\xa8\x65\x2f\xd4\xb2\xff\xc5\xf8\x84\xef\xbe\x9d\x7e\x4e\xd4\xaf\x17\x9f\xa0\x39\x7f\xba\xfd\x3c\xd4\xd8\x9f\x9d\x0b\xa5\x4c\x3e\xff\x86\xc6\x0c\xba\x0c\x6e\x76\x40\x0d\x8b\x5b\x59\xa0\x61\x91\x1f\xdc\xac\x91\xf7\xb9\x1d\xcd\xfd\x61\x6d\xac\x05\xa2\x31\xd9\x5f\xb1\xee\xd9\xe5\xf2\x92\x33\x5e\x74\x03\x12\x9a\x94\xb9\xf5\xaa\x7c\xb4\x29\xc9\xf5\x1d\xe8\xee\x79\x23\xc4\x8b\xdc\xbe\x77\xac\x47\x29\x8d\x07\xee\x11\x6e\x1a\x71\x33\x91\x42\xb6\xa9\xdd\x40\xb3\xba\x98\x72\x9f\xc7\x07\xd6\x12\x58\xd4\x6f\xd3\x07\x56\x7b\x4a\x98\xf8\x1c\xbd\x4b\x8d\xc1\x24\x70\xa1\xe0\xd2\x7d\x0a\xa2\x0f\xd6\xe4\xdb\x04\x6b\x4c\x80\x40\x29\xe4\x02\xf7\x9e\x42\x90\x1c\x76\x5c\xb1\xce\x5d\x4b\x9c\xb5\x94\xad\x30\x78\x23\xb9\x77\xc4\x71\xa4\x3c\x5d\xa1\xdb\x8f\x24\x86\x48\x34\x00\x8b\x13\xd0\x91\xcd\x0a\x3f\xa6\xcc\xac\x0b\x3d\xfc\x98\x3e\x19\x50\xd4\x13\xed\x4e\xb1\xb5\x49\xcf\x77\xe3\x1b\xdc\xa6\x56\xb8\x57\x42\xfb\x88\x3b\x7d\x97\x15\xce\xa8\xc0\xc6\x70\xfa\x80\xdd\x9f\x1f\x2c\xbe\x20\xd1\xfb\xca\xac\x8d\x0f\x2d\xac\xcc\x43\x56\x14\xc4\x43\x0a\x7f\x28\x37\x7c\xf4\x29\xd8\x29\x68\x04\xbc\x29\xff\x6d\x21\xc6\x8d\x50\x65\x90\xb1\x46\xe9\x4c\x94\xc2\x0d\x84\x03\x98\xad\xb0\x93\x71\x01\x0d\xdd\xe8\x5f\xef\xff\xc3\xbf\x8b\xdc\x16\xdb\xac\x9a\x22\xab\x3b\x47\xb3\x30\x2a\x39\x48\x07\x99\x4c\xb3\xce\xac\x3b\x9c\x7e\xbd\xff\x0f\xe2\x4c\x42\x57\xc1\xfd\x1b\xcd\x7a\x53\xd4\x8f\xc6\x1a\x2b\xb2\xc4\xde\xe2\x51\xde\xd3\xf2\x77\x74\x7c\x2d\x7d\x7a\xe5\x0c\x2c\xf7\x33\xa9\xf5\xe0\xbc\xf4\xa9\x57\xfa\x2e\x05\x59\x61\x2a\x18\x02\xe8\x37\x38\xcf\xcc\x18\x70\x32\x8a\xb5\xde\xed\x49\xa2\x4f\x2e\xcd\x86\x7d\x3f\xf7\xcf\x31\x26\x83\xe9\x67\x77\x90\x9f\x5c\x81\x6f\x70\x38\x71\xce\x44\xa9\x4f\x6e\x29\xba\x88\x28\x6a\xd7\x1b\x27\x9e\x5e\x36\xd8\xb9\x40\x32\xe1\xbc\x66\x4f\x90\x23\x06\x46\xc4\xf7\xb2\x9a\x98\xd1\xac\xb8\xb9\x35\x3c\x28\x8b\xe1\x89\x90\x32\xab\x82\xb9\x4c\x33\x27\x3c\x5a\x70\x28\x30\x70\x46\x5f\x0a\x3e\xf2\x02\x3a\xbe\x94\xf6\x22\x2e\x15\x08\x44\x58\x15\x52\x6f\x3d\xf1\x1b\x39\x1f\xc0\xcc\xb6\x47\xde\x92\x56\x46\x89\x58\x29\xda\xeb\xbe\xb8\x0d\x0e\x61\x2e\x0d\x60\xfe\x12\x1f\x77\x5c\x35\x35\xee\xba\x40\x66\xe3\x3c\x22\xab\x18\x54\x10\x0b\x41\xbc\x97\xfa\x3c\x81\x85\xc5\x9b\xbd\x47\x5a\x07\x2e\x01\x44\x28\x33\xab\x81\xd7\xc9\x6d\xb6\xce\xb6\x28\x4a\xd2\x72\xd0\x25\x6e\x33\x6e\xa4\xfc\xba\x15\x76\x32\xeb\xc9\xfd\x32\x9e\x7f\x1c\x2d\x27\x37\x20\x22\x3f\x99\x7e\xc6\x54\x26\xba\x1c\xdd\xe4\x40\x6c\x89\xc7\x11\xaf\x9e\xb0\xb7\xea\x86\xbd\xdb\x4c\xee\x71\xcf\xc5\x41\x31\x4f\x47\xcf\x15\x99\x1c\xbc\xa5\x61\xa7\x68\xd9\xf7\x8c\x35\x51\xcf\xf0\x09\x03\xa6\x37\x50\x70\xed\x3d\xc9\x2c\x34\xc7\x4d\xf8\x74\xb3\x71\xfd\xc8\x32\x5e\x3e\xd0\xf5\xfc\x98\xd6\xb6\x34\x4f\x18\xf9\x65\xdf\x53\xc5\xee\x07\xf7\x9e\xdb\xb4\x21\x78\x66\xd6\x8f\x05\x38\xc9\x3b\x93\xda\x86\x8e\x82\x72\x85\xe1\x49\xde\x6e\xaa\x32\x87\x05\xe6\xce\x6e\x92\x6e\x64\xe2\x40\xd7\x1d\x62\xe3\xa5\x9d\x12\x16\x66\xfa\xd5\xc4\x61\xac\xc0\x66\xa6\x0e\xcc\xf9\x41\x6c\xf5\xe5\x6e\x6f\x0a\x9b\x32\x88\x86\xf5\x58\xb0\xf2\x1a\x9e\x09\x3e\xa4\xbb\x4d\x8c\x77\xaa\xf3\xb4\x7a\x30\xca\x14\x20\xf6\x82\xe4\x50\xc4\x13\xe2\x9b\xe1\xc1\xd4\xb8\x39\xb6\xe3\x83\xce\x5f\x14\xda\x15\x9e\x8c\xc4\xdd\x91\x03\x77\x30\x0d\x42\x88\x2e\x42\x24\xbb\x13\x62\x64\xce\x24\x37\x58\x87\xb2\x81\x45\xd0\xd6\x10\xe4\x6f\x61\x8d\x20\x9a\xd5\x7a\x32\xd5\x7f\xb9\x1b\x4d\x97\x40\x58\x4a\xdf\xc9\x14\x64\x6c\x1c\xd0\x37\x9d\xfa\x1e\x71\x4d\x77\xb3\x3b\xe5\x60\xd1\x6e\x07\xcb\x1a\x56\x1e\x07\xac\xb1\x22\x7e\xd0\x3e\x6c\x12\xea\x2c\x94\xbf\xe4\xfa\xd6\xf3\x57\xaf\x82\x61\x24\x22\x59\x1c\xa8\xa4\x89\xed\xad\x86\xc8\x47\xf6\x9d\x6d\x8a\x75\x5e\x5a\x23\xe7\x03\xc0\xe0\xa1\x34\x9f\x4c\xc1\xaa\x3a\x24\x0a\xf0\x00\x39\xae\x62\x6f\xac\x00\xb1\x20\x6c\x2d\xe2\xe9\xef\x3b\x5e\xb3\xe5\x1d\x04\xc2\x7e\xf8\x99\xd8\xf6\xb6\xf7\xce\x17\xae\xd2\xf5\x57\x6c\xc5\x50\x7f\x2c\xeb\x47\x6e\x91\x40\xdb\x63\x7b\x94\x68\x4f\x88\x4f\xc0\xd2\xb3\x71\x40\x90\x7a\xd5\x1a\x3f\x47\x97\xdc\x22\x7c\xba\x42\xd6\x66\x74\xa9\xb1\xb9\x8d\xfb\x3e\x30\x88\x90\x1e\x31\xcf\xd1\x81\xe7\x11\xc2\xdf\xcc\xdf\x1a\x30\x58\x85\x45\x54\x6c\xb4\x73\x9b\x81\x15\x50\x52\xe6\xb4\x84\x4d\x4a\x2e\x53\x86\x8f\xcb\x02\x45\xd9\x10\xb2\xb8\x59\xf1\x80\x49\x1a\xd6\xfe\x6e\xb1\xfe\xe2\x7d\x09\xca\xd9\x38\xbf\x04\x3e\xf9\xe0\x73\x7e\xa2\x8d\x94\x29\x0b\x7b\x98\x73\x54\x80\x9d\xe9\xe0\x7b\x25\xa8\x0f\x91\xf9\x5f\x23\x83\x95\x7b\xae\x4c\xe5\x42\xbb\x32\x72\x63\x35\xc9\x53\x10\x0f\x52\x1d\x34\x67\x36\x60\xd7\xa0\x79\xe2\x37\x74\x37\xd2\xc8\xb9\x50\xea\xa7\x32\x6f\x76\x59\x51\x36\xb0\x8f\x6d\xb3\xda\x4f\x2c\xd8\x72\x28\x55\xc5\xb4\x49\xdb\xac\xb2\xee\x28\x32\x96\x62\x42\xa0\xff\xbc\x03\xd6\x7d\x0b\x77\x07\x5a\xc6\x01\xf7\x2c\xf2\xf1\xcb\x19\xe7\x99\x12\x89\x3a\xcf\x3d\xd2\x19\xd4\x9b\xbf\xa6\x6b\xd7\x31\x7b\x62\xea\x6e\x2d\xec\x38\xc4\x4f\xee\x54\x64\x6a\x86\xbe\x8d\x57\xab\x0a\xab\x35\xac\x3a\xb2\x18\xc9\x36\xe9\x89\xf0\xb4\xbc\x5a\x24\x58\xa7\xd9\x00\x62\x2e\xa1\x09\x28\xa5\x02\xfb\x1a\xe6\x13\x75\xef\x55\xc8\x60\xbf\x6f\x6a\x53\x9d\x15\xa6\x76\x26\xba\xf2\x44\x52\x00\xe9\x0b\x8e\x1a\x47\x86\xe8\xba\x33\x74\x7b\x29\x85\xe2\x6c\x03\x77\x14\x58\x2b\xab\xa3\x95\xbc\xe6\x8c\x7d\x60\x7e\x82\x5b\x1b\x75\xb9\x06\x47\x2f\x10\x09\x74\x3e\xb2\x65\xb4\x27\x98\xbb\x2c\xb7\x24\xd6\xc9\xeb\xc6\x1f\x2f\x0d\xed\x5c\x39\xc5\xae\xf7\x98\x6c\xf2\xfd\x5c\xa7\x5f\xe1\x20\xa4\x69\xa1\xf7\x55\xb3\xc1\xf0\x95\xd9\xdb\x24\xd8\xa5\xe0\x93\x74\xd8\x3f\xe3\x51\xce\x0a\xf5\xb7\x26\x05\xa7\x23\x41\xa4\x24\xe4\xfe\x83\xe5\xd1\xf9\x1a\xa8\x0f\x45\x83\x56\xd7\x8f\x0d\xf7\x9a\xdb\x15\x14\x27\x54\xf1\x34\xf2\xe3\xd0\x14\x75\x96\xeb\xd4\xad\x84\x14\x67\xbb\x3e\x38\xaf\x0b\x09\x0b\xf1\x53\xdd\x77\x65\x3b\xd3\x3a\x5f\x55\x5a\x44\xa3\x7d\xea\x93\x10\x42\x61\xed\x50\x36\x95\x4e\x1f\x50\x0c\xaa\x42\xb0\x6d\x1e\x8e\x9c\x14\x83\x76\xce\x79\x68\xbb\x4b\x93\x9a\xa5\x19\x0d\xc6\x63\x99\x88\x9c\x17\x7b\x12\x8c\x1e\xae\xac\x09\x60\x83\xce\x1a\x51\x50\x5f\x89\xca\x8b\x11\x3b\x0a\x09\x1e\x83\xa9\xd0\xb1\x11\x50\x14\x31\xc3\x8d\x6d\xe7\x66\xd2\x23\xf0\x99\xd7\x25\x5b\x82\xf0\x7e\xa2\xb2\xd5\xcd\x7e\x03\xbd\xdb\x62\x78\xbc\x0c\x05\x59\x28\xe3\x03\x60\xc8\xc9\xc5\x88\xf2\xb5\x2f\x19\xad\xa9\x6e\x67\xe7\x3a\xab\xbf\x2f\xb1\x09\x5c\xb6\x9e\xbc\x11\x1e\xfa\x86\x4d\x90\xd8\x86\x75\xed\xa7\x98\x34\x3c\xa3\xfd\x3a\x8a\x53\x07\x47\x33\x36\x7a\x7d\x92\xa6\xd3\xcc\x6d\x96\xe7\x5e\x2b\xb4\xec\x9e\x08\x09\x4e\x51\xb4\x1e\x08\xba\x1c\x83\xc7\xfb\x04\xdc\xf9\x35\x1e\x91\x54\x97\xce\x35\x06\xc3\x76\x0f\x12\x29\xce\xd3\x0d\x15\x71\x59\xdd\x62\xe2\xf4\x4b\x75\x53\xe2\x39\xa4\x20\xa5\xe6\x99\x21\xdb\xdf\xf1\x5e\xa9\x11\xf2\xea\xd0\x05\x21\x5e\xa1\x4f\x41\xc9\xa6\x88\x8e\x46\x54\xd3\x1c\xe8\x94\xce\x41\xa4\x2a\x5d\x23\x03\x03\xfa\x77\x1d\x6b\x0b\xc4\xee\x10\xe3\x4c\x39\xa1\x7d\x65\x9e\x32\x77\x4e\x05\x7a\x59\xf2\x13\xe1\x8c\x72\xaf\x51\x98\xf7\x78\x36\x28\x94\x9a\x20\xa5\x9e\xad\x03\x7d\x09\xb9\xce\xad\x74\xa7\x7f\xef\xc0\x5b\x0a\x8a\xb7\x35\xb0\x5d\x49\xce\x0f\x81\x0d\x71\x33\x38\x77\xe8\xe5\xfe\x5b\xc6\x4e\x5a\x2b\xbe\xd2\xad\x1a\x1b\xe3\xb0\x3f\x0e\xf5\x35\x60\xd8\xdb\x1d\x09\x06\x05\x2d\xdc\x04\xa9\x70\x89\x2a\x03\xa3\x2f\xd6\x87\x5f\xdc\xbe\x28\xa0\x3f\x8a\x62\xe8\xee\x46\x91\x93\x8d\x73\xca\x47\x06\xd6\xad\xed\x07\x04\x75\x80\xea\x95\xdf\x03\xb7\x6e\xbd\x73\x76\x97\x11\x1b\xc7\xf6\x15\x7d\x4a\xb4\x47\x59\x6d\xc3\xd5\xca\x7f\x0c\x72\x5f\xbb\x13\x6c\x6b\x9e\x99\xdd\xd7\xbd\x61\x00\xc8\x05\x63\xc9\x82\xe2\x25\xe8\xa6\x67\x80\xbb\x0b\x31\xbd\xa1\x52\x17\x43\xbd\x80\x43\x37\xea\x40\x08\xa7\x49\x50\x7e\x9f\x11\xda\xfd\x7a\xd5\x36\x57\xbd\x34\xdf\xe5\x50\xfb\x28\x0b\xd9\xdb\x5d\xbf\xb6\x67\x6f\x1b\x0f\xf5\x68\xe3\xbc\x79\x29\x63\xd1\xb9\x13\xac\x33\x38\x16\x5a\x99\x7f\xb6\x87\xea\x12\xb6\x89\xd2\x3b\x90\xd1\x7b\x87\x4a\x7d\x72\x2b\x1a\xec\x98\x44\x67\x3b\xf0\x71\x6a\x48\xcf\xf8\x23\xab\xcf\x0b\x6f\xfb\xdf\x0f\xd9\x93\xb3\x2a\x05\x52\x43\x40\x25\x3c\x78\xa4\x67\x5f\xeb\x11\xcf\x93\x90\xa4\x24\x50\x4c\x57\x80\x7e\x7a\x2e\xf8\x2f\xa3\xcd\xc6\x14\x9b\x66\x87\x91\xb1\xa1\x52\x9f\x45\x4f\x73\xd6\xbe\xd5\x4c\xef\x15\xb8\xa5\x6d\xfb\xd3\xc5\x10\x62\xf0\x36\xb0\x74\x6e\xb0\xb2\x92\x5e\xdf\x75\xd9\x98\x68\x53\x5f\xf9\x2e\xd5\xa9\xdb\xf1\x41\x7f\x0f\xbd\xca\x43\x4f\xf4\x65\x22\xda\x8d\x50\x45\xdc\x60\x7c\xe0\xcc\x47\xed\x12\xf1\x81\xb5\xc5\x19\x9b\x30\xcd\x91\x1b\xea\xcc\x79\x06\x3a\xab\xcd\x0e\x4c\x13\x38\x8e\x79\x21\x7a\x67\x22\x01\x9b\x24\x01\xea\x62\xbf\xb2\x62\x38\x21\x1d\x2e\x9d\xd1\x4a\xb9\x13\x3a\x9b\x0e\xa7\x9d\x19\xdd\xde\xf9\x0a\xe5\xbf\xa2\xdd\x83\x09\x4b\xc5\xb9\xad\x8a\x9b\xdd\x69\xad\x6c\xa9\xea\x2c\xc8\xe0\x18\x89\x16\xfa\x3e\xa2\x6d\x11\x55\x9c\x70\x51\x41\x1f\x91\x14\x24\xcf\xdc\xbe\xcf\x0d\xec\xcd\xb8\x81\xd1\x0e\x0e\x69\x5b\x04\x91\xfd\xa9\x35\x7c\x6c\x32\x07\x5e\x3b\x96\x84\xee\x9d\x3f\xb0\x82\x71\xcd\xa8\x60\x96\xa7\xc7\x8c\xeb\xd6\x39\x97\x67\x5f\x0d\xca\xfb\xf7\xbc\xd9\xaa\x17\xde\xd8\x39\x12\x89\x72\x9b\xd5\xce\x39\x24\x8a\x39\x70\x45\x68\x35\x7a\x54\x18\x4b\x1a\xe6\xe0\x26\x97\x3b\x37\x09\x3b\x6d\xa1\x28\x37\xb8\x2d\x88\x22\x4b\x23\xe0\x9f\x3f\x2e\xdc\x5e\xe6\x46\xdc\xb2\x79\x19\x07\x1a\x29\x41\xe3\x85\x48\xd5\xb1\xc3\x33\x10\x8d\x67\xb5\x80\x9c\xf5\x1c\xa4\x7f\xc6\xac\x0b\xe4\x3f\x3b\x4b\xaf\x13\x66\x77\xaf\x6e\x05\xda\x79\xf8\x55\x58\x12\xd4\x04\x2f\xa2\x05\xcb\x2b\xda\x9c\xc2\x3a\xe7\x53\x81\x92\xaf\x58\xd9\xa7\x6a\x38\xb8\xb7\xe8\x07\xfa\x88\x9f\x50\x3b\x6d\x35\x8c\xc1\x5e\x9b\xd0\x34\x22\x78\xaf\x09\x8f\xa7\xd4\x75\xcf\x59\xd4\xb3\x01\x76\x66\x5a\xd8\xc2\xb8\xea\x1d\x32\x3d\x24\x8c\x88\x7f\x21\x84\xce\xd0\xcb\x73\xa3\xf5\x6f\xb9\x7c\xcd\x6d\xa8\x4f\x69\xce\x01\x58\xd0\x99\xf0\x41\x75\x05\x78\xa9\xb8\xd3\xf8\x81\x4a\xdd\x0c\xf5\xa5\x01\x8f\xb3\x7f\x8c\xa2\x3c\x87\xc7\x3e\xf2\x75\xa2\xbe\x9f\x83\xf6\xea\x88\x11\x33\x54\x6a\x3a\xd4\x97\x25\x79\x46\xac\xc4\x7c\xd0\xe6\x37\xa4\xc8\x0f\x6d\x83\x24\xc0\x91\x26\xc0\x27\x97\x6a\x5d\x16\xdb\x3c\x5b\x43\x74\x5c\x46\xa1\x8a\x43\xb7\xd3\xbd\xb9\x30\x93\x43\x54\x1c\x7a\x63\xfe\x21\x54\xd3\xd9\xb1\xbc\x4a\xa6\xdb\xdc\xfb\x50\x7a\x30\x1e\x04\xe6\x5b\x1b\x8c\x11\x2a\x12\x2d\x04\x89\xe0\x2e\x00\x4b\x60\xe6\x80\xa2\x8f\xa3\x5f\x04\x42\x24\xfb\x4a\xcc\x97\x10\x71\x46\xaa\x4f\x72\xec\x03\xc6\x09\x53\xba\xa8\xb2\x18\xe2\x7a\xbe\x85\x29\x4a\xf9\x20\x00\x4a\x2d\x4b\x74\x2e\x32\xb7\xf7\x7b\x6d\x57\xc2\x83\x91\x9f\xcb\xc5\x9c\x3d\x93\xb9\x35\xd4\xec\xe9\xf4\x1c\xdb\xb8\xdf\xd1\x83\x99\x1d\x30\x72\x38\x44\x8a\x86\xb3\x74\x7e\x92\x46\xcc\xda\xdf\x9a\xa4\xc2\x6d\xcc\xea\x0e\x20\x51\x39\xe7\xdc\x88\xeb\xdd\xa7\x41\x47\x76\xc6\x7b\x75\x00\x64\x8b\xdb\xc8\x49\x48\xe8\xec\x6c\x2b\x24\x12\x95\xe0\x41\x71\x8e\x90\x31\x08\x09\x32\xcf\xb8\x2e\x29\x8e\x01\xab\x39\x00\x52\x9c\xc1\xf9\x84\xb9\xad\xb4\xd0\x65\xf5\x90\x16\xd9\xdf\xa9\xe2\xd5\x8a\xb8\x00\x88\xff\x46\x88\x37\x08\xf6\x78\x08\x45\xa7\x5b\x08\x27\x06\x4a\x6c\x7b\x8c\x1a\x62\x31\xc0\x86\xc4\xf9\xda\xa1\x67\x46\x66\xd1\x8d\xca\xdf\xc8\x58\x2c\xbc\xad\x15\x87\x4e\x78\x5e\x18\xac\x4a\x90\x53\x44\x18\x74\x47\xb7\x01\x3d\x2b\xf2\x03\x98\x23\xa2\xc1\x1d\x2c\x19\xba\xab\xf0\xdb\x31\xe0\xd8\x86\x32\x84\xa7\x52\x26\x1f\xe1\x3e\x38\x26\x54\x5a\x31\xc0\x99\x55\x04\x15\x8f\x49\x3b\xe0\x9b\x57\x26\xdd\x1c\xc2\x02\x4f\x29\x1a\xcb\x78\x25\x99\x2d\x81\x68\x29\x9f\xf0\xf9\x41\xf9\x76\xb8\x85\x59\x56\x30\xae\xa1\x15\xbe\xbe\xc3\x3f\x81\x72\xf3\x10\x86\xaf\x20\x0a\x0b\x69\x27\x16\x81\x57\xe5\x96\x3c\x7f\xda\x5a\xd1\xa6\x82\x85\xf1\x01\x22\x4b\xfc\x63\x65\xc0\x6e\x40\x2f\x37\x87\xee\x72\x1e\x29\x40\x5c\xb3\x75\x56\x2b\xe1\x25\xf8\x7d\xc4\x9b\x26\xe1\x44\x47\x38\xe1\x06\xc3\x2c\xfe\x51\x94\x2f\xc6\xb9\x78\x6a\x07\xb1\x11\x7b\xda\xcd\xc4\x30\x84\x62\x15\xc7\x5d\xe0\x9c\x54\xbd\x0e\x8b\xe7\x77\x09\x56\x9a\x17\x30\xae\xa8\x84\xc8\x20\x60\x0b\x05\x0d\xc4\xb2\x55\x54\x8c\xd9\x73\xca\xa0\x8e\xe4\xc5\xec\xe6\xe3\x64\x3a\x99\x7e\xd6\x97\xb3\x8b\xbb\x9b\xf1\x74\x19\x85\xaf\x40\x51\xbd\x05\x5b\x08\x82\x57\x8c\xe5\x7b\x11\xb0\x9a\xa8\xb6\x7f\x05\x4b\x15\x0f\x72\xde\xa3\xde\x12\x6e\x35\x14\xfe\x84\xa0\x9b\x0d\x3b\x95\xf2\x01\x2e\x8e\x7b\x67\x1c\xab\xf1\x0a\x5d\x92\xb5\xb8\xdf\xb0\xc0\x0b\x54\x14\xf6\xf0\x9f\xe2\x2c\x0d\x6e\x01\xdb\xb7\x54\x11\x04\x37\x4a\x64\xac\x7f\xaa\xe2\xcd\x31\x68\xd0\x13\x7a\xdf\xd9\xff\xf1\x26\xdf\x4a\xef\xee\x5b\xc6\x50\x56\xa9\x23\xe7\xed\xd2\x7f\x27\x3f\xbf\x30\x0c\xa8\xe2\xb3\xd1\x2d\xdf\x3e\x17\x0f\x5f\xba\x6b\xf2\x3a\xdb\xe7\x46\x61\x96\x6b\x9d\xe6\x7d\x3d\x44\x1b\x07\xad\x1b\x22\x10\x48\xb5\xcd\x8a\x07\xc2\x8d\x06\x47\x0b\x59\xb2\xe8\xb1\x7d\x0f\x0b\x90\x6f\xb7\xa8\x21\xa0\xe1\x16\xe7\x26\xdb\x02\x5e\x01\x0f\x1e\xe8\x77\x05\x09\x64\x99\x6e\x42\xbb\x13\x80\x20\x3c\x4f\x9a\x22\xfb\x5b\x83\x9a\x2b\x9b\x0d\xb9\x96\x62\x93\xcd\x40\xaa\x43\x09\x88\x4c\xd2\x09\xa4\xf8\x21\xa7\x22\x36\x5e\x54\x32\xe6\xe5\x8f\xd6\x6c\xab\x9d\x89\x5b\x80\xb5\x6f\x72\x6b\x74\xca\x6d\x60\x69\xa2\x1b\x6e\x36\x7c\x61\xba\xf9\x6b\x63\x6b\x09\x17\x8a\x4f\x69\x9e\xb0\xdf\xb6\x16\x5a\x61\x03\x6f\x7e\xe3\x04\x80\x22\x27\x67\x84\x75\xe6\xbf\x08\x88\xf2\xfa\x15\x26\xab\xed\x71\xe9\xe9\x8d\x8a\x4f\xf1\xbe\x45\xc1\x28\x44\xf0\x8f\x8f\x06\x07\x3e\x78\x67\x50\x7d\xe3\xdd\x3d\xd0\x21\x26\x7f\xee\x5c\xad\x22\x5f\x87\xdc\x3c\x08\xf8\x92\x45\x9e\xe7\x7d\xaf\x88\x4d\x72\xd6\x0d\xbd\x98\x5d\x5f\x8f\x2f\xbc\x4c\x6c\xcf\xae\x47\x55\x9f\x2c\x84\x5e\x16\x9a\x44\xca\x04\xee\x21\x4a\x82\x1e\xdb\x0c\x7b\x00\xe1\x09\x55\x70\x86\x23\x29\x2b\x36\xd9\x53\xb6\x69\xd8\x98\xed\x14\x52\xb5\x47\x27\xbc\xa7\xbb\x30\x3d\x64\xb9\xcd\x7b\x1d\x3e\xa6\x6f\x33\x15\x48\x09\xe0\x10\xed\x34\xc1\x6d\xcb\xed\xf4\xad\x70\x0c\xa3\x0a\x4a\x4c\x42\xbb\x2d\xb6\x9d\xdb\xe5\x0e\x36\xbf\xd5\x55\xba\xae\x43\xd3\x3d\x26\x1c\xce\x5f\x42\x7e\xc9\x26\xb7\x52\x28\x59\xad\x42\xb7\xe5\x87\xbe\x43\x27\x18\xb7\x78\x5a\xc0\x09\x99\xf6\xee\x8d\x58\x90\x54\xa3\xd4\xbc\x6b\x98\xe0\x1a\xa4\x48\x3e\xf7\x4f\x3c\x2a\xdd\x8f\x54\xa1\xe2\xa4\xaf\xbb\x10\x68\x18\xe5\x8e\x7e\x1e\xea\xd1\xe7\xcf\xf3\xf1\x67\x24\xf7\xfa\x32\x01\x8d\xda\xcb\xf1\xed\x78\x7a\x09\xec\x18\xb3\xf9\x9f\x17\x4a\x8d\x20\xe3\x99\xe5\x69\x5f\xd8\x1f\x4e\x7e\x26\x57\x01\x6b\xd8\x46\xb2\x94\xac\xce\x86\xae\xf2\xc6\x38\xc7\xcb\xd9\x06\x61\xc4\x18\xf0\x99\x50\xf6\xd7\x9d\xa2\x98\x5b\x37\x6c\x4d\x97\x15\xd8\xa0\x55\x9c\xd4\x21\xb4\x95\x0a\xb8\xeb\xb4\xd0\x27\xe9\xc3\x83\xeb\x88\xda\x9c\x70\x7a\x21\xc4\x6f\x51\xfa\x1a\xd8\xc7\xd9\xd8\x92\x9f\x46\xa8\x6e\xe6\x92\x01\xb4\x02\x6e\x87\xe6\x21\xf5\x8a\x23\x61\x33\xe4\x1b\x7f\xb0\x24\x84\x41\xf4\xb4\xcf\x00\x85\x8c\xd7\x17\x62\x5a\xb1\xe4\x7c\xa8\xbf\xb0\x6c\x55\x5c\x36\x15\xd6\x4d\x5a\x68\xff\x21\x49\x84\xab\x0a\xe5\x2c\xe9\x7e\x8f\x82\x47\x21\xc0\xed\x91\xb3\xe0\xa3\xf0\x03\x28\x33\x9e\x56\x80\xaa\xd1\xa2\xc0\xb8\xa7\x22\xb9\x1d\x87\x27\x4f\x5b\xd8\xfd\x22\x8d\xa0\x43\x62\x50\xbf\x81\x22\x8d\xa0\xca\x5c\x53\x46\x2c\x6c\x2d\x9d\x84\x9d\x29\xfa\xca\xc7\x28\x8d\x91\xa2\x45\xe1\x0c\x6e\x6e\x96\x33\x1c\x2a\x13\xf7\x4c\x14\x89\x96\xd1\x6a\x32\x25\xc8\x90\x28\x63\x54\xd0\xaa\x4a\xd7\x5f\x4d\xab\xf8\xc9\x97\xbb\xc9\x57\xf8\xf8\x8d\xdb\x10\xaa\xb2\xc8\xd6\x32\x94\x03\xb9\x5d\x44\xbf\xb4\x32\xc4\x58\x07\x27\xee\x72\xa7\xd8\x50\xcf\x7c\xed\x04\x24\x6a\x10\x10\x84\x68\xe8\xb2\x10\xf8\xab\x4e\x53\xe1\x53\x9f\x1f\xcb\x5c\x34\x0e\x97\xf1\x1f\x86\x7a\x39\x1f\x4d\x17\xd7\xb0\x8c\x95\x5a\x8a\xda\x0f\x10\xb2\xf4\xd0\xcd\x50\xa7\x1e\x73\x94\xda\xd2\x7b\x2c\x12\xe1\x18\x9e\x63\xd5\xf1\x34\xb1\xcf\x5b\x78\x7b\x7a\xa8\xe7\x70\xc8\xa0\xd4\x4b\xc7\x5e\x45\xb3\x4c\x3c\x3c\x80\xbc\x00\x04\x1c\x49\xa6\xf9\x95\x9a\x55\x9d\x1a\x61\x9b\x28\xe9\x6c\x79\xb9\x31\xf9\x68\x20\xe9\x0a\xc1\x96\x7e\x93\x87\xf3\xb9\x0c\x1b\xf0\x46\x88\x54\x4d\xc1\xc9\xdc\x57\x70\xd6\xd6\x3b\x4b\x65\x13\x54\xaf\x35\xcc\xd1\xc7\xd8\xd0\xb2\xdd\xd4\x00\x1b\x26\x6c\x97\x2b\x61\x97\xf7\x25\xdf\x01\x5c\x26\x85\xd7\xfc\xb7\x8c\x8b\x07\x80\x02\x05\x38\x41\xbc\xaf\x30\x16\xef\xc8\xc7\x97\xa2\x95\x74\x24\x7a\xff\x40\x4f\x0a\xb5\x4e\x2d\xed\xd7\x9b\xcc\xa6\x5e\xbf\x70\x65\xea\x67\x43\x9b\x9d\x2c\x4a\x3a\xf6\xb6\x4e\xb3\x20\x6c\xce\x76\x68\x25\x5e\x9b\xf4\xdf\x0f\xa8\x15\xe7\x42\xa7\x59\x8e\xdb\x57\x88\x46\xb5\x13\x01\xd9\x37\xac\xc2\x38\xce\x1d\x01\xc8\xf1\xed\x72\x2b\x3c\xf5\xf3\x7f\xe0\xf6\xbe\x6e\xa6\x2a\x5c\x71\x3e\x50\xd0\xcc\xfa\xb0\x77\x8e\x50\xce\x25\xd6\x26\x90\x88\xd4\x1e\xfd\x85\x2e\x09\x2e\xf5\x3f\x0e\xf5\x72\x3c\xbf\x99\x4c\x69\xa9\x4b\x88\xad\x2c\xe9\x4e\xb4\x05\x5f\x1d\x27\x5c\xb7\xbe\xdb\xf7\x80\x61\xc1\x4e\x15\x74\x2b\xfd\xa4\xea\xad\x29\x2c\x0e\x3a\xad\x6b\xb3\xdb\xd7\xa2\x0e\x8c\x28\x42\xfc\xeb\xd5\xf1\xd7\x63\x01\xe8\x53\x99\x6d\x58\x1d\x3c\xcf\x43\xe1\x1a\x74\x46\xd0\x7a\x06\xa1\xa4\xae\x3c\x72\xc8\x1d\x7a\xc9\x62\xae\x6b\x87\xb4\xb7\x5b\x5d\x4f\x59\x29\x2d\x96\x16\xb4\xba\x40\x97\x99\x97\x1f\xa0\x29\x22\x39\xc3\x0e\x1f\x01\xe4\xcf\xb3\x82\xf2\x61\xa7\xe9\x20\x88\x94\x23\x98\x9b\xf2\xef\x69\xe1\x6c\xef\x3a\x6b\x67\xba\xe9\x31\x1c\xf9\x21\x28\xea\x36\x2b\xe2\x4f\xb6\x51\xc3\x50\xd9\xe5\x74\x35\x80\x1d\x31\x2d\x4c\x51\xbb\x57\x75\x0c\x1b\x7a\x38\x8b\x62\xc3\x7a\x21\x1c\x29\x27\x83\xb8\x3b\x14\x57\x14\x09\x39\x6b\xac\x61\x40\xce\xbb\xba\xd4\x3f\xbd\xd2\x9b\xf4\x60\x65\x0a\xdc\x58\xcb\xbc\xbb\x37\x65\x65\x30\xc2\xd6\xe9\x42\xfd\x7b\xba\x50\x7c\x91\x3a\xf6\x41\xf0\x1d\x8c\xae\x6e\x7f\x89\x3e\xf6\x25\x64\x30\x91\x40\x31\x02\x2f\x3d\xe4\x0c\x10\xcb\xac\xab\x2b\x1c\xdc\xa3\xf3\x45\x9d\x72\x75\xa0\x33\x91\x06\x7c\x20\xa5\x75\xa7\xb9\x1e\x8f\x8d\x0a\xe2\x71\x63\xa1\x77\xdd\x01\xf3\x26\xea\x5d\xe8\x43\x68\xce\xde\x27\x80\xbc\x60\xe5\x92\x66\x05\xb5\x0a\xaf\xed\xac\x86\x4e\x39\x76\x58\x3f\xe2\x88\x81\x23\x9c\xc5\xf6\x9f\x1f\xcb\x56\x47\xb0\x91\xe6\x5f\x00\x9f\x09\x20\xc5\x9e\x75\x37\x89\x1b\x03\x8f\x82\xd0\xb9\x7f\xf5\x86\x69\xc7\xe5\x38\x8b\xe1\x4f\xf8\xa3\x21\x4a\xe8\x7d\xa3\x6e\x62\x04\x43\x1b\x3e\xe9\xe2\x3f\x12\x70\x74\x70\xe2\x15\x2c\x5b\xab\x3c\x0b\x0d\x71\x9b\xbc\x1a\xea\x4f\x77\xcb\xbb\xf9\x58\xcf\xc7\xbf\x4c\x16\xec\x77\x03\xe5\x1d\x31\x0c\x62\x68\x0b\xc8\xaa\x7a\x88\xa4\xb4\x07\xd6\xa3\x3e\x77\x82\xf5\xc4\x22\x3e\xc8\xad\xfc\x3c\xbd\x53\xc7\x29\xaf\x82\x4c\xb7\xf6\x32\xdd\x90\xa6\x8b\x34\xbf\x59\x90\xc3\x66\xbb\x2c\x4f\x2b\x95\x15\xda\xee\xb3\x2a\x0b\xd5\x5f\x04\xee\x7e\x62\xcc\x91\x33\x7f\xd0\x6a\xdb\x6e\x91\xa3\x73\x03\x98\x48\x88\xcc\x22\x29\x88\x7b\x85\xda\x57\xe5\x2a\x37\x5e\x07\x7f\x6d\xaa\x02\x32\x95\x46\x2a\x05\x3e\x14\x0d\xd0\x64\x31\x41\xd0\x8f\x43\xa5\x40\x4c\xbb\x05\x40\x14\x6c\x39\x98\x5f\xff\xa6\x82\xf6\xa4\x55\xcc\x46\xb5\x5e\x94\x7e\x8b\x77\x0d\xbc\xa7\x0d\x7b\x14\x06\xc1\x49\x59\x29\xc4\x58\x0a\x5d\xbb\x13\x59\xed\x92\xd5\x49\x58\xea\x60\x24\xec\x79\x09\x89\xa2\x35\x36\x5d\x99\x13\x83\x2b\x2c\x08\xdc\xec\xa3\x71\xd4\x56\xd1\xa0\x8a\x69\x06\xa3\x26\x60\x2a\xd1\x27\x91\x42\x6e\xff\x14\x9c\x35\xeb\xba\xa9\x4a\xb7\xf5\x80\x53\x0d\xc7\x26\x5d\xb7\xbf\xfc\xa4\xc7\xc6\x1c\x9c\x83\x1c\x75\x71\xf7\x8c\x63\xa3\x78\xfd\x58\x96\x16\xeb\x25\xf9\x16\x44\x37\xfe\xe7\x9b\xa7\xda\x04\x0b\xdd\xe1\xac\xca\xdf\x0e\x80\xc2\xdf\x98\x75\xb6\x61\x07\x74\xdb\xd4\x6e\x5f\x14\x4b\x27\x36\xf5\x04\xaf\x12\xc1\x71\xe1\x41\x3f\x58\xc6\x54\xf9\x64\x1e\x0c\x00\x94\xf3\x78\xd6\x47\x0f\x15\x94\xfb\x0d\xa5\xe9\xfe\x4e\x27\x88\x33\x53\xa0\x3f\xf0\xe9\x7c\x07\x67\x8f\x62\x64\xed\xf9\xf9\x50\xcf\xc7\xb8\x4d\x40\x35\xd8\xc9\x4d\x6a\xad\xdb\x75\x6e\x9a\xbc\xce\x28\x82\x7b\x51\xe6\x39\x4a\x81\x81\x9a\x57\x56\x9b\x13\xc8\x76\x9d\xdc\xdc\x5c\xe0\x3f\x07\xa2\xfc\xf3\x4b\x59\xe5\x1b\xfd\x25\xdb\x18\xf5\xc5\xac\x50\xe8\x9e\xb2\x3b\x3c\x20\x36\x1c\x2b\x70\xa2\xa1\x5f\x8e\x3e\x83\xf5\x40\x61\x2b\xaa\x35\x88\xe4\x32\xa3\x2c\x4d\x5a\x1c\xa0\x24\xb5\x2e\x01\x0d\x4d\xa6\x3b\x6a\xda\xe8\x11\x77\xe5\x73\xf6\x35\xa3\xe1\xa2\xeb\xd7\x69\x01\x75\xd2\xe0\xc6\x17\x9c\x41\x8d\xca\x21\x2b\x28\x68\x19\xe9\x6f\xf7\xc4\x89\xe2\x4e\x38\x19\xc4\x92\x81\xb0\xa5\x67\xb5\x11\xbd\x62\x0d\x39\xd2\xdd\xef\xae\x1f\x1b\xab\xc2\x5c\x25\xd8\x95\xeb\x5b\xf7\x8c\xa1\x52\x27\x17\x17\x67\x1f\xef\xcf\x16\x23\x59\xee\x7b\x51\x99\x94\x95\xc9\x76\x6e\xa6\x8d\x6a\x1f\x36\x3a\x5b\x3c\xba\xf9\x3c\xca\xb3\xaf\x46\xbf\x19\xbe\xf2\x05\x47\xe1\x2d\xab\x43\xf7\x09\x17\x65\xb5\x2f\x99\x0d\x0a\x1c\x92\xb3\x6d\x59\x9d\xed\xab\x72\x0b\x19\x6c\xff\x2b\xc1\x3f\x05\xd6\x13\xe3\xad\xe5\x56\xaf\x1a\x9b\x15\x6e\x4b\xce\x0a\xbd\x48\x0b\xfd\xa9\x4a\x8b\x75\x66\xd7\x65\xac\x5e\x22\xe4\x7b\x70\xc5\x28\x4f\xd9\x16\x9f\x3a\x02\xdf\x17\x35\x9e\x38\x43\xe0\x24\x0d\xa9\x6b\xd7\x59\x93\x82\x5b\x1a\xca\xa3\x4b\x59\x24\x52\x19\xfe\x47\x2a\x9c\xd0\xac\xa0\xc8\x03\x70\x50\xc0\x6e\x0d\x88\x4f\x46\xad\x70\x91\xaf\x58\x40\xa3\x02\x46\x29\xb3\xfa\xc4\xe4\xd9\x43\x16\xf8\x38\x3c\x44\xfb\x84\xe0\xac\x81\x51\xb1\x3f\x85\x07\xa1\xc3\x2d\x57\x2f\x7d\xa5\x5d\x06\x90\xca\x68\xdb\x85\x8f\xef\xde\x0e\x16\x05\xca\x86\xa3\x08\x25\x89\x2b\x66\xd6\xb5\x8f\x18\x0f\x3c\xbf\x04\x2a\xb2\x73\x17\x6d\xfa\x3e\x5c\x73\xc4\x56\xc1\xfd\xa7\xe7\x03\xfd\x98\x42\x95\x64\xc8\x47\x5b\xbc\x9e\x23\x05\xd6\x13\xf1\x80\x35\xff\x7a\x80\x8d\x07\xc0\xba\x7c\x9d\xf2\x16\xb8\x67\xc4\x44\xd6\xcb\x3f\x50\x06\x0e\x69\x6f\xf9\xfc\xd1\xbc\xc5\x70\xaa\x99\x47\x0e\x7f\xe9\x5f\x75\x48\xdb\xc5\x8b\x86\x17\x14\x32\x0b\xba\xdf\x71\x43\x40\x53\x85\x00\x68\xa3\xe6\xa1\xb1\x35\x35\xe5\x8f\x51\xd0\x01\x3a\xc1\x0d\xe0\xb1\x31\x1e\xea\xd1\xe5\xe5\x78\x7a\x79\x77\xf3\x5e\x5f\x81\x1c\x27\x65\x96\x5b\x01\x7e\x70\xf4\x7c\x4c\x58\xa9\x65\xcf\x75\xc0\x11\xe3\xc3\xf5\xfe\x80\x27\x92\xee\x44\x84\x5f\x64\x31\x4e\x9c\xc9\x08\xf7\x63\xae\xbc\xcb\xfc\xce\x26\x3d\x66\x5f\xa3\xe8\x8c\xfa\x2b\x44\xeb\xbc\x57\x14\x08\x08\xde\x2b\x15\x73\xde\xdf\x8f\x47\x73\x7d\x3f\xbb\x9b\xeb\xe9\xe8\x66\xac\x87\xfa\x36\x44\xb4\x9c\xdd\x54\xa5\x85\x20\x1e\x4d\xa2\x1a\x0d\xc0\xb1\x29\x5f\x6b\x2e\x34\x78\xfa\xd1\xc2\x60\x7c\xbe\xc0\xb7\x9a\x48\xbe\x55\x4d\xbe\x4c\x6c\xba\xb4\xb6\x8f\xe3\x87\xff\x07\x8c\xde\x15\x7d\xcc\x4b\x3a\x71\x7f\xef\x16\x4f\x26\xe4\x0a\x74\xaa\x25\x95\x27\x55\xf1\x18\x15\x6f\x59\xb6\x93\x48\xec\xe4\x18\x1f\xaf\xe9\xff\x68\x1e\xef\x93\x50\x03\x07\xb3\xa4\x8f\x16\xab\xdb\xd4\xbe\x9a\xce\x84\x53\x66\x10\x81\x3d\x71\xdf\x3f\x1c\x0e\xe1\xa7\xe1\x89\xce\xb3\xc2\x70\xa2\x39\xb3\xef\x95\xf2\x49\xe7\x9e\x0e\x42\xaa\xae\xeb\xc9\x62\xa9\x97\x57\xe3\xc9\x5c\x2f\x27\xcb\xeb\xf1\x42\xd4\xbd\x74\x39\xa2\xc2\x3d\x1c\x2f\xa1\x4b\x3b\xb5\xa7\xe1\xca\x6f\x7e\xbb\xa7\x6b\x8d\xbe\xb3\xac\xc8\xff\xe2\xea\x75\x4e\xeb\x72\xf4\xb7\x7e\xac\x8c\x49\xf4\xce\x54\x50\x24\x00\x86\xd4\x73\xa9\x01\x1c\x59\x50\xf2\xa7\x2e\x81\xe7\x86\x77\x9c\x86\xcf\x1e\x76\x19\xfd\x5c\x16\xa8\xaf\xa2\xae\xb2\x27\xe7\xdd\x19\xc1\x13\xc3\x94\x9f\xeb\x72\x63\x12\xfd\x2c\x68\x30\x15\x26\x39\xc9\x8a\xb7\x26\xdc\x46\x92\xc4\x79\x6e\x72\x5a\x2b\x88\x8c\xf0\x52\x85\x31\xed\xa8\x8f\xb2\x30\xab\x04\x2f\xa6\x63\x34\xaa\xee\xb0\x84\x14\x0e\x45\xa4\x49\x90\x22\x7a\xea\xbf\xb8\xc6\xff\xc7\xf0\xc7\xd9\xe2\xfa\xec\xf5\x7f\x9b\xf6\xdf\xff\xf8\x26\xff\xf7\xeb\x37\xaf\x5f\xbd\x6d\xf1\x7f\xbf\x7e\xf7\xd3\xf9\xbf\xf8\xbf\xff\x11\xff\xb1\x64\x5f\x38\x41\x68\x05\x3d\x0d\xf5\xeb\xe1\x39\x71\xca\xf6\x5e\x41\x7a\xf9\xbc\x8b\x0f\xda\x8c\xb3\x3e\xde\x0f\x20\xa4\x72\xab\x44\xbd\x16\xde\x3a\xe3\x2b\xbe\x94\xd5\xd7\x93\x01\x51\xdd\x94\xcf\x85\xa9\xa2\x87\x97\xd5\xc9\x00\x30\x9f\x94\x21\x74\xc6\x42\x30\x04\x28\x30\x28\x2b\x82\xe2\xd8\x41\x6f\x25\x92\xfb\x81\xdf\xaf\xdc\xfb\xdf\x2b\x3e\x90\x36\xe2\xf0\xee\xff\xf2\x27\x2f\x8c\x78\xae\xd4\xf9\x40\x7f\x76\x46\x02\x42\x36\xf9\x55\x3e\x0c\xcf\x9f\xa0\x9d\x65\xbb\x3a\x30\xc3\x2d\x90\xbe\x1e\x65\xb9\x4d\x54\x51\x16\x67\x9e\x8b\x34\x71\x7b\xd9\xde\xd4\xc0\x2f\x1e\x02\xf6\xe0\x7d\xf1\x49\x5c\x13\xf8\x58\xd8\x48\xef\x19\xaa\x9d\x0e\x90\x62\x54\x4a\xce\x44\x9d\x8f\x54\x0c\xfb\xcc\xd8\x0f\x4a\xad\xe0\xea\x7d\x65\xf6\xc8\x61\xd9\x4a\x3c\x9f\x9e\x5c\x86\x3f\xb9\x9b\xed\xc9\x80\x6a\x31\x9a\x3d\x59\xa9\x51\xcf\x7e\x50\x6a\x0d\x8f\x14\xa6\x53\x5c\xd0\x1e\xb7\xc5\x9d\x9d\xed\x57\xc4\xac\x4a\x49\x38\xbb\x31\xb4\x5f\xfa\x30\x2f\x3d\x35\x7e\x62\x59\xf5\x3c\xd0\xdd\x70\x5f\x36\x4a\xb4\xca\x3e\xa6\x18\xd7\xeb\x78\x39\x47\x66\xc2\x07\xee\xe1\xcd\x80\x4e\x1c\xa8\xfe\xea\x7e\x13\x53\x7e\x7c\x80\xac\x03\xdd\x64\xb8\x57\xbc\x72\x7a\xff\x4d\x43\xa5\x5e\x8b\x49\x76\x9b\xd6\xee\x54\xfe\x47\xcf\x30\xe6\x3a\xd9\xe3\xeb\x21\xb7\x67\x61\xb5\x6e\x54\x60\x84\xc9\x83\x65\xea\xdb\xe5\x29\x36\xcd\x6e\x55\x6e\xb2\x60\x2a\xb6\xc6\xdd\x79\xd1\x55\x01\xd6\xad\x6a\x3d\x23\x61\xa2\xfd\xc4\x9d\xe4\x89\xb6\xe0\x76\x43\x86\x7c\x6b\x90\x52\xd1\xa6\x79\xdf\xcc\x76\xfd\xdd\x1e\xfc\xa1\x52\x6f\x44\x87\xa2\xf8\xbb\xbe\x28\x37\x26\xf4\xea\x92\x4c\x77\x7d\x22\x7e\x96\xa1\x8b\x3d\x94\xea\x54\xc8\xa5\xb7\xeb\x9f\xca\x48\xb1\xfe\x15\x19\x1a\x64\xd5\x23\xc4\x3e\x7d\x7e\xd9\x13\xd0\xa9\x58\xbd\x34\x54\x7d\xe9\x47\x74\xc9\x02\xaf\x55\xfc\xa6\xce\x2c\x50\x90\xd8\xc5\xa0\x01\x55\xac\x1f\xa1\xf7\xd4\x5e\xcf\x3f\xf4\x42\xeb\x63\x14\xf6\x24\x50\x7f\x04\xca\x07\x79\x73\xfc\xd9\x30\xe0\xbe\x41\x82\x33\x6d\xa8\xfc\x5f\x59\x2d\x00\xb3\xb3\xb0\x67\x3a\x83\xd4\x33\x85\x64\x56\x97\xab\x3c\x7b\xf0\x09\x24\xc6\x29\x74\x3f\x43\x1d\xfb\x0c\x84\xe7\x48\xd9\xfd\xca\x00\xed\x6f\x59\x1d\x04\x89\x87\x5e\xa7\xf9\xba\x41\xda\xe9\x60\x37\x66\x85\xf9\x6d\xef\x7c\xe3\x27\xc3\x85\x25\x4f\xa6\xc8\xc0\x23\xc5\xea\xb7\xd5\x01\x16\x19\x84\xf2\x02\x31\x0a\x7f\xa1\x62\x02\x10\xdb\xda\xfb\x3a\xfd\x85\xee\xc2\xca\xe7\x2f\x7c\x56\x99\xf2\x02\x10\x7d\x4d\xeb\x63\x1f\x02\xde\xf6\xf7\x9f\x82\x4a\xf2\xd5\xb6\x98\xa7\xe2\x39\xa5\xd4\xdb\x81\x1e\xe3\x16\xe1\x26\xed\xa7\xaa\xdc\xf9\x33\x10\x56\xcf\xb0\xa3\x0e\x06\xbb\x6f\x58\xb5\x85\x94\x04\x63\x98\xb9\x94\x05\xeb\x7d\x33\xde\x07\x46\xc4\x96\xec\x77\x2f\x35\x0a\x11\x1b\x92\xeb\x06\x8e\x4d\x9b\xe8\xff\x25\x69\xb1\x78\x92\xb3\xbb\x45\x49\xf6\x6f\xaa\xa4\xf2\xa7\x82\xa0\x3a\x8c\x1c\xc8\x21\xc9\xb0\x16\x1f\x2a\x1b\x63\x76\xd8\x40\xd8\xa1\x45\x3a\x0c\x3a\xc1\x7f\x60\x12\xc6\xca\x26\x0a\xb7\x5b\x9b\xe0\x05\xce\xbb\xae\x0c\x86\xad\x04\x0b\x5b\x51\x1b\x80\x41\x36\x69\x0e\x94\x99\xa6\x42\x02\x59\xbf\xda\x10\x3d\xa0\x52\xab\x03\x7a\x80\xb2\xbb\xcc\x81\x3f\x2d\x79\x6b\x17\xce\xbd\x08\x7f\xb4\x76\x5f\x05\xc1\xad\x2d\xf2\x8a\xc1\x76\x8c\xbb\xbb\xaf\xe0\x01\x12\xc5\xf8\xac\xa0\x99\x92\x46\xd0\xe5\x8d\xa2\x9f\x05\xe0\x9f\x2b\xf3\x5e\x43\xb3\x70\x77\x88\x5b\x43\x28\x15\x3f\x27\xc2\xb7\x2a\xf3\x84\x68\x35\xe2\xeb\x87\xa0\x7c\x65\x3a\x71\x8a\xd6\xfe\x19\x86\x2f\xce\x29\xfb\xe1\x73\x9d\x5c\xed\x2b\x43\x0d\xd8\x57\xe5\x63\xb6\xca\xc4\x3e\x07\x53\x2a\xd0\x5a\xe0\x69\x19\x20\xec\x98\xc2\x0a\xf3\x2e\xa0\x79\x0e\x2f\x6e\x9f\x01\xbb\xf1\x0c\x34\x45\x10\x28\x48\xb1\x53\x14\x80\x1f\x19\x62\xf1\xce\xad\x56\x70\xf0\x73\x7d\x69\xf6\x79\x79\xf0\x8c\x81\x74\x94\xf5\xfc\x2c\x8f\xb4\xc6\x76\xb0\x9b\xaa\x77\x83\xef\x33\xa8\x88\x59\xef\x39\x25\xa5\x04\x5f\xb2\x15\x2f\xb0\xbe\x5b\xe5\xfa\x85\x4a\x2e\xd0\xb8\x11\xd3\xe5\xbe\x6c\x12\x2f\xc5\xe1\xcc\xff\x6f\x37\x07\x6c\x57\x21\x44\xe1\xd9\xef\x04\xb5\xc4\x2e\xdd\x18\x41\xac\x9b\x5a\x22\x31\xf0\x94\x86\x1d\xad\x33\xa4\x95\xf2\xfc\x46\x5c\x3c\x3c\xd4\x23\x77\x2f\x43\x73\x42\x92\xd2\xfb\x1a\x64\x94\x95\x5b\xbf\xba\xdc\xba\x83\x39\x92\xa0\xa9\xe6\xce\x6b\x9f\xe7\x51\x3d\x23\xc5\xe7\x0d\xa4\xe1\x5b\xdf\xdb\xd9\x65\xd2\x78\x14\x21\x78\xde\xb1\x6e\x9d\xa7\x96\xe7\xc7\x98\x0d\x04\x0e\x0e\x08\x47\xc1\x16\xc1\x92\x54\x0f\x8f\x3a\x5d\x0f\xb4\x2f\xda\xfd\x69\x20\xd3\x37\x24\x14\x2a\x80\xf8\x28\xb9\xe9\x89\x12\x5a\x06\x87\x9b\x3c\xe1\xab\x54\x6c\xa5\x53\xe1\x7d\xc2\x04\x88\xb8\x3d\x26\xbc\xc1\x94\xe2\x80\xf0\xd8\x37\xc6\x23\xaa\x17\x2c\x1b\x3e\x7f\x43\x22\x07\x44\xe9\x02\xd7\x45\x58\xcf\xce\x90\x74\x3f\xa2\x51\xb6\x87\xae\x87\x92\x36\x22\x83\xcb\xd0\x33\x75\x7d\x41\x33\xe9\x44\xf6\xc6\x14\xa1\x22\x27\xbe\x3b\x14\xca\xeb\xb4\x7b\x82\x21\x2c\x47\x1d\x16\xe6\x20\xa8\x4b\x64\xcc\xd3\xa9\xf2\x19\x46\xdd\x7d\x63\xbf\x9d\x03\x06\x28\x98\x13\xba\x32\xeb\x6c\x9f\x91\x36\x51\x5a\x03\x52\x0d\xf6\x18\x5f\x61\xd5\x67\x19\xfc\x3c\x08\x05\xbf\xce\x27\xa9\xca\x27\x12\xf6\x03\xf7\x2d\xa8\x91\x96\x5b\x7f\xa1\x30\x52\x89\x4d\x94\x5e\x19\x7b\xe9\x19\x61\x0e\x7b\x0c\x03\x0f\x46\xa4\x71\xa7\xe3\x93\xcf\x05\xec\x7d\xe7\x3b\xf8\x17\xb9\x6d\x00\x7c\x94\x8e\x57\x42\x3f\x06\x67\x07\x5e\x79\x2f\x70\x34\x46\xf5\xae\x87\x10\xd8\xed\x9a\x03\xc2\xb4\xf1\x55\x7d\xa5\x15\x5f\x87\x20\x86\xa8\xf9\x43\x67\x63\x21\xb6\xaf\x7b\x3a\xd3\x5a\x91\x76\x1d\x70\x4b\x03\xcd\xb1\x62\x72\x87\xa4\xcf\xa5\xb7\x2f\xe1\x03\x01\xbc\x5f\x90\x10\xea\x89\xfe\x38\x5a\x4c\x16\xd0\xb4\x2f\x93\xe5\xd5\xec\x6e\xc9\x12\xa6\xf7\x9e\x23\x95\xf7\x36\x2a\x20\x84\xc2\x37\x3c\x53\xb3\xe2\x21\xf1\x86\x13\x60\xf1\x49\xc7\x17\x80\xd0\x9e\x37\xd6\xf5\x46\x47\xb5\xb4\xa3\x8b\x5e\x56\x47\xe5\x4f\x15\xc9\x9f\x0e\x41\xdb\x72\x3c\x5d\x4e\xe6\x63\x3d\x9f\x2c\xfe\xac\x47\x0b\xbd\x9c\xc1\x5f\xff\x72\x37\x62\xbd\x6c\x90\x46\x9f\x4f\x3e\x4f\xa6\xa3\x6b\xa8\x90\xd0\x93\x05\x96\x4e\xdc\xcf\xee\x86\x18\xd9\xf2\xe2\xea\x73\x77\x87\x17\x65\x05\x0d\xcb\xac\x06\x9a\xe7\xb4\xd0\xc6\xba\x8e\x06\xb8\xb3\xaf\xfe\x97\x20\xab\x69\x29\xc3\x30\x9d\x61\x90\xd3\x13\x47\x82\xc0\x9c\x62\x58\x22\x05\xe1\x3f\x0c\xf4\xb5\xef\x46\xb4\x6d\xd2\x15\xca\x63\xea\xbb\x02\xe1\x76\x7a\x9d\x55\xeb\x66\x87\x3c\x0c\x98\x0f\x69\xf8\x27\xac\x82\xa8\x1f\x4d\x59\x1d\x12\xe5\x25\xac\x0a\x5d\x97\x55\xad\x4f\xfd\xa8\xe9\xc2\x3c\xe4\xd9\x83\x9b\x41\x83\x04\xe7\x6e\xba\xae\x83\x70\x9d\xb3\x3a\x12\x3a\x37\x42\x86\xae\xac\xf0\x10\xe1\xda\x01\xc1\x96\xcd\x9b\x17\x52\xc2\x25\x50\x56\x81\xff\x8f\xf0\xe2\x30\x65\x60\xc3\x4c\xf3\x84\xc2\x06\x94\xd1\x05\xcc\x58\xba\x63\x71\x0e\x70\x14\x1e\x53\xa8\xb4\x71\x2b\x15\xb5\x21\x00\xfd\x82\xc5\x21\x1d\xf4\x1f\x9d\xb4\x8d\xed\xdf\xe5\xbf\x31\x59\xfd\xbb\xb7\x65\xa5\xf2\x12\xf5\xc0\x1e\xca\x72\xf3\x9c\xe5\x79\x82\x41\x4c\x5b\x97\xfb\x3d\x10\xb4\x78\x03\x60\x9b\x66\x79\x53\x21\x71\x55\x9a\xb3\xd0\x5f\xc2\xf6\x39\x1c\x1a\xbe\x00\x28\x70\x0a\x87\x2f\xad\x74\x0e\xf4\x65\xce\x4c\xcb\xac\x68\x11\x9e\x3e\x34\xee\x38\x08\x2a\x2a\x26\x09\x3f\x82\x74\x85\x49\x51\xdf\x0f\x87\x22\xcd\x75\x56\xfc\xb5\x01\x3f\x37\x2a\xa5\xe1\x31\xfc\xc1\xaa\x30\xfa\x3a\x94\x36\x81\x7f\x1b\x6a\x43\xf2\xf4\xd9\x9b\xba\x48\xdd\x2e\x9a\x38\xd4\x8b\x72\x67\xf4\x5f\x9b\x2a\xb3\x9b\x8c\x8a\x06\xa8\x72\x39\xf5\xc5\x62\x86\x3d\x48\xf8\xd8\xe8\xfb\xc2\x64\xd0\xc7\xe6\x42\xa2\x2c\x72\x2a\x88\xe7\x60\xc6\xd7\x3f\xc8\x17\x77\x73\xcf\xdc\x97\xcd\x50\xa9\x3f\x0e\xf4\x28\x20\x8f\xdc\x3d\x02\xa5\x09\xd0\xad\xfb\x98\x38\xf8\x85\xa0\x24\x4a\x5c\xb5\xce\xe4\x24\x98\x36\x54\x0d\x28\xf0\xad\x66\xbb\x75\x8b\x4d\x90\xf4\xc9\xf5\xaa\x80\x4f\xd9\x2b\x90\xf3\xde\x9a\xc2\x46\xe3\x5a\x20\x4f\xe5\xf2\xb8\x6d\xe6\xfd\x16\x05\x65\xa7\xab\xa6\xc5\x22\x7e\x0a\xf3\x90\x4a\x8e\xc8\x89\xed\x42\xfe\xc3\x69\x59\x6c\xdc\x37\x0d\x94\x88\x21\xc6\xd5\xe6\x64\x7c\x74\xac\x93\x23\x01\x60\xdf\x79\xce\x2d\xff\xcd\xcd\x7d\xf2\x78\xa8\x93\x5b\x07\xb8\x70\xfd\xce\xe9\x34\x0f\x85\x15\x04\x66\x57\x18\xe9\xb6\x65\x7b\x17\x3d\xd2\x45\x2f\xf7\x81\x3a\xda\x07\x00\x96\x90\x50\x7b\x58\x03\x68\x48\xdc\x0d\x17\x43\x1d\x29\xaa\xc1\x09\xac\x44\xbd\x51\x9e\x3e\x43\x53\x78\xe5\x37\xce\x30\x60\xda\xee\xd5\x01\xdd\x49\x9c\x8b\x6e\xaf\x76\xdd\x7a\x00\x57\xad\x02\x2c\x47\xe2\xac\x18\xea\x31\xe6\xaa\xec\xef\x33\x32\x5a\x7a\xbb\x0e\x7f\x80\xca\x08\xe3\x0c\xbb\xaa\x85\xc5\xeb\x94\x95\x08\x52\x3b\xec\xcc\x18\x72\x89\x9b\x94\x8a\x43\x1b\x01\xc4\x1c\xb1\xb2\x11\xc0\x1a\x17\x27\x44\xc7\xe0\xe0\x8b\xe6\x80\x3a\xfe\x3d\x6d\xe6\x03\x98\x5a\xf0\x09\xbc\xe5\x82\xa4\x05\x07\x98\x28\x0f\xa0\x64\x37\x44\xce\xc9\xf9\xab\x81\x5c\xff\xb0\x67\x52\x24\x7d\x44\xc4\x50\xcb\x6e\xd8\x26\x7c\x5b\x54\xf8\xa0\x68\x92\xbc\xfc\x75\x2f\x8c\x56\xeb\xeb\x54\xea\xb7\x9d\x8d\x7b\x19\x98\xf9\x90\x42\x87\x9d\x0b\x78\x2d\xca\x42\xd8\x5b\xce\x07\xad\x4a\x6b\xcf\xc0\x68\xc0\xcd\xb3\x71\x33\x0a\xfe\x9d\xa8\xf4\x21\xcd\x0a\x5b\xc7\xd6\x6e\x71\xf0\x82\x84\x6e\xa0\xcd\x83\x97\x94\xeb\x3b\x2c\xb7\x55\x56\x3c\x18\x0b\xc5\x16\x35\xc5\x11\x32\xeb\x7b\x04\x91\xf2\x54\x57\x41\xbd\x15\x36\x61\x34\x04\xa8\xdd\xfe\x65\x14\xcc\xf2\x0f\x67\xaf\x56\x00\x18\x8e\xe4\x84\x64\xa1\x2a\xe5\x60\xdc\xae\xf2\x98\x56\x1b\x92\x3f\x3d\x3f\x1f\xe8\x3f\x89\x83\x28\xd1\xbf\x98\xa2\xc1\x59\xfd\xd9\xb9\xed\xa0\x28\x70\x9d\x3e\x53\x65\x0c\x51\x63\x56\x88\x81\x40\xad\x3a\xd0\x7a\x88\xa3\x77\x14\x9a\x58\x01\x23\x0a\x29\x24\xf8\x6a\xe9\xa6\xa2\x50\x57\x74\x04\xea\x67\xf2\x02\x23\x93\xa9\x32\x16\xd0\xa0\x88\x4f\x43\x98\xad\xff\xd1\xad\x30\x08\x4f\x12\x9b\xe4\x2e\xad\x0e\x1e\x84\x98\x04\xe3\x0e\x05\x05\x68\x67\x81\x91\x8b\x5e\x0c\x27\xe4\x06\xc5\x38\x21\x08\x01\xac\x4e\x67\xe5\xf6\x8c\x8e\x71\x1c\x2d\x64\x24\x57\x32\xd0\x41\x9d\x7e\x57\xc0\x0e\x37\xa5\xa1\xb8\x80\x90\x37\x5e\x50\xb8\x7f\x81\x7d\x68\x7d\x50\x63\x22\xf7\x30\xb5\x48\x11\x84\xfa\xb9\x2c\x37\x36\xde\x3d\xb1\x61\x66\x83\x7d\x7f\xd4\x42\x2b\x9b\xda\x75\x12\x7c\xa5\x5d\x97\xfb\xee\x1e\x55\x32\x43\x31\xef\x50\x3c\x15\x7d\x70\x83\x45\x03\x09\xfa\x27\xea\xbe\x70\x33\xdb\x9b\x22\xcd\x6b\x71\xce\xc3\x5e\x1e\x12\xb7\x23\x67\xad\x9e\xff\x0c\x7f\xbe\x18\xea\xff\xe7\xff\xd6\xe7\xaf\xce\xb5\xa9\xb5\x35\x7f\x1b\xa2\x4b\xf3\xbd\xbb\xfc\xb1\x2d\x3e\x54\x82\x50\x74\xd1\x36\xd5\x53\xc6\x2c\xea\x71\x25\x49\xab\x8a\xea\xfc\x35\xc4\x58\xca\xaa\x30\x07\xab\x3f\x19\x50\x40\xc0\xc0\x5b\xea\xf9\xbe\x8c\x73\xec\xd7\xe6\x85\x23\xb1\xac\x94\x35\x06\xf2\x52\x6c\x88\x86\x15\xe0\x66\x6f\x5d\x26\x9c\xe4\x7a\x4a\xb3\x1c\x55\x85\x2a\xb6\x43\x5d\x3f\x7b\x78\x57\x5d\xaa\xca\x20\xa2\x12\x67\x9d\xa5\x9e\xc6\xf4\x89\xb1\xdf\x72\x13\x85\xd5\xa4\x52\xfe\xb6\x1f\xf4\xd6\x18\x3e\x7e\x2c\x2a\x49\x35\x15\x11\xbb\xb5\xc5\x22\x11\x14\xd4\xde\x23\x21\x5a\x03\x15\xbb\x79\xc0\x46\xcb\xad\x9e\xa3\x58\xdf\x35\x08\x4a\x0c\xc2\x9b\x81\xbe\xc9\xec\xda\xe4\x79\x5a\x98\xb2\xb1\xad\xa3\xc3\xcb\xe5\x59\xda\x27\x88\x85\x3c\x18\x5e\x54\xd9\xc1\x74\x8e\x2d\xd9\x61\x37\x00\xe5\x16\x25\x1c\x8b\x83\xd8\x65\x7b\xf4\xc7\x1f\x4d\x4e\x42\x2f\xaa\x29\x68\xe0\x51\xca\x0a\xbe\xb7\xbd\x43\x03\x63\xcb\xb6\xac\x76\x4c\x09\x13\x1b\xfe\x85\x81\xfa\xb1\xea\xa0\x58\xd7\x3c\xab\xb5\x78\xaa\xfb\xf8\xb7\x03\x7d\x19\xb1\x68\x9d\xdc\x97\x0d\xb0\x83\x2c\x23\xc3\x14\xff\x4c\x5c\x52\x65\xd3\x56\x4d\x21\xaf\xd4\x1d\xd8\xcd\x7e\x8f\x62\xcb\x79\xf9\xec\x56\x51\x6a\x01\xba\x86\xa0\x73\x59\x9a\x0f\x46\x38\x3a\xb7\x44\xfc\x24\x2c\x24\x0a\xaf\x50\x48\x15\x27\xce\x6e\x9f\x03\xab\x82\x17\x55\x60\x78\x1c\xad\x8a\xa4\x65\x4c\x7f\x72\x8d\x08\xcf\x77\x2b\x59\xf1\xe7\x31\x9b\x55\x71\x88\x14\xa1\x28\xef\xed\x66\xb9\x8d\x93\xe0\xc8\xfd\xc8\x05\x60\x28\xc4\xa1\x58\x38\x05\x5a\x74\x28\x1b\x7c\x27\x0b\x83\xf9\x11\x0e\x3c\x65\x89\x3e\xa1\x7b\x38\x52\x7f\x9a\x0d\x60\x6b\xdb\xbb\xde\x4a\xc8\xd7\xc6\x73\x85\xbd\x6d\x88\x0d\x72\x74\x11\xff\x48\xa7\xdd\x2e\x2d\xd2\x87\xc0\x08\xe0\xe6\x08\x7e\x4d\x88\x13\xac\x0e\x3e\x14\xd0\x8a\x04\x94\x95\x3e\xcd\xb2\x01\x42\x74\x98\x78\x79\x9b\x6d\x6b\x08\x00\x00\x8b\xef\xe9\xbb\x57\xff\xc7\x40\x31\x8d\x33\x93\xe9\x34\x35\x10\xad\x01\x2f\xe1\x63\x5a\x19\xcb\xcf\xca\x06\x7a\x65\x0a\xb3\xcd\xc0\x29\x8e\x9e\x2b\xda\xe6\xa6\xdd\xbb\x01\x06\x94\xdd\xb7\xdd\x49\xd1\x1a\xfe\xcc\x0e\xa0\x05\x60\xe8\xe9\x01\xeb\x71\xfc\x57\xa8\xca\x38\x87\x0f\xf8\x3b\x4a\x21\x95\xc3\x11\xc2\xf8\xb0\x59\x1d\xd0\xb8\x77\xd3\xc9\x9f\xd6\x10\x6e\xb5\x06\x39\x28\x20\x90\x5a\x9b\x6a\x0b\xa4\xdc\xa4\xb1\x0f\xcb\x2c\x16\xaa\x87\xcf\x69\xdc\x18\x63\x18\x9f\xc5\xe9\x45\xb2\x4d\x00\x93\x2f\x06\xfa\xf5\xab\x57\x6f\xce\x5e\xbf\x7a\xf5\xd6\x19\x2d\x28\xda\x34\x1e\xea\x79\x69\x4d\x31\xd4\xa3\xdc\xb3\x5c\x50\x22\x7d\x33\x54\x31\x72\x59\xa2\x41\x02\x80\xb9\x2b\x8e\x24\xda\xc0\x9b\x73\x24\x09\x18\x37\x53\x70\x54\xfa\xf8\x30\xdf\x26\x3d\xd9\xde\x8c\xa9\xc2\x03\x82\xbf\x12\x86\xfb\x5f\x20\xcc\x7f\xe6\x7f\xc3\x1f\x2f\x6e\xaf\xcf\xce\x87\xaf\xfe\x79\xf8\xcf\x9f\xde\xfe\xf4\xba\x83\xff\x7c\xf7\x2f\xfc\xe7\x3f\xe4\x3f\x2c\x9a\x6a\xa1\xa7\x75\xa8\x42\x78\xa5\xd4\xf2\x6a\xac\x47\x17\x17\xb3\x9b\xdb\xd1\x14\x64\xa9\x6e\xe7\xb3\xcf\xf3\xd1\x8d\x9e\x2c\xdc\xff\xfd\x65\x72\x39\xbe\xd4\x77\xd3\xcb\xf1\x1c\x22\xee\xcb\xf1\xfc\x26\xd4\xee\x5e\xcc\x6e\x6e\x66\x53\x7d\x7b\xf7\xf1\x7a\x72\xa1\xa8\x92\x57\x9f\x9e\x8c\x3e\xcf\xc7\x90\x00\x38\x19\x0c\xf5\x68\x7a\xaf\xef\x16\xe3\x44\xcf\xc7\xb7\xf3\xd9\xe5\x1d\xf0\x6e\xe9\xd9\x5c\x5f\x4e\x16\xcb\xf9\xe4\xe3\x1d\xfe\x1b\x23\xfa\xf4\x76\x75\x31\x9b\x2e\x96\x93\xe5\xdd\x72\xbc\xd0\xf3\xf1\xc5\xe4\x76\x32\x9e\x2e\x7f\x58\xb8\xa6\x8e\x6f\x97\xa3\xe9\xc5\xd8\x37\xc2\xbf\x6c\xa8\xcf\x87\x4a\x5d\x8e\x3f\x4d\xa6\x13\xd2\xe0\x38\xb9\xe0\x8c\x0d\xd4\xa6\xc2\x09\xfb\x5e\xa9\x74\xe0\xbd\xbc\x34\x78\x2b\x70\x24\xa7\xb9\xbe\x08\x59\x9e\x24\xfa\x61\x5d\x6e\xd0\xe3\x8c\x70\x5c\x4a\xe6\xa1\x45\xcc\x7f\xc4\xf6\x60\xe2\x51\x81\xab\xce\x7b\x89\xdd\xce\xeb\xea\x8a\x77\x7b\x7c\x67\x36\xf0\xc2\x4d\x64\xcf\xdd\x22\x24\x3f\x91\x70\x43\x77\xd8\x32\x7f\x4a\xfb\xc2\x0f\x4a\x61\xe9\x15\x1c\x53\xfc\x30\x22\x6a\x3e\x76\x13\x43\x7c\x6b\xe6\x14\x28\x36\x40\x5d\x24\x3f\x97\x8b\xdc\x44\xdd\xb0\xf8\x82\xa1\x1e\x69\x39\x00\xfa\x07\xff\x48\xe7\x01\x20\xd7\x83\xb8\x9e\xea\xd0\x9e\x53\xcb\x1c\x9b\x71\x83\x56\x84\x3d\x88\x6e\x01\x22\x6e\x8d\xb5\xc8\x65\x21\x49\x42\xdb\xd7\xfe\x60\x89\x37\x74\x18\xb5\xca\x32\x1b\xa7\xaf\x5b\xe2\x0e\x51\xad\xf7\x83\x5b\xff\x1e\x2c\x34\xc8\x2d\x32\xa7\xd6\xae\xdc\x30\x63\x9a\x2f\x69\x90\xbd\x94\x81\x61\xf8\x57\xca\x1e\x84\x04\x23\x3f\xd7\x87\x38\xb3\xca\x9d\x9a\xfe\x34\x4e\xa3\x19\x84\xc6\x19\x93\x47\x1d\x63\x8c\xa2\x67\x0e\xe5\xdc\x2f\x7f\xa7\xf4\x69\xeb\x39\x1e\x38\x8d\x01\x35\xab\xf1\x69\x2d\xf8\x0f\x36\x1a\x82\xe3\xab\x83\x8e\xc7\x55\xf0\x5e\x91\x0b\x92\x41\xa0\x05\xe3\x44\x3e\x79\x4b\x00\x15\x4b\x91\x06\x67\x4e\x44\xd3\x27\xcd\x49\x44\xe4\xf9\xd1\x14\x2a\xd0\x60\xb6\xfa\xd3\xb5\x99\xfe\x6f\x54\x8c\x1a\x8f\x79\x34\x3e\x24\x07\x0a\x81\x53\x5f\x44\x14\x56\xb0\x7b\xe2\x9c\x43\xf6\xa2\x2f\x5d\x73\x9e\x1f\x4b\x66\x6f\xb0\xbd\xa3\x1a\x6f\x05\xc2\x7f\xcd\xa3\xad\xc6\x0e\xf5\xeb\xa1\x52\x9f\xe7\xa3\xe9\xd2\xed\x6d\xf3\xc9\xe7\xab\xe5\x02\xf6\xaa\x45\x14\xf4\x68\x39\xfd\xe2\xd9\xb0\x99\xc8\x7e\x8f\x20\xc3\xca\x7f\x01\x00\x0a\x23\x78\x30\xe0\x88\xbb\x30\x62\x19\x04\x0f\x19\x50\x8f\x34\x4f\xd4\x51\x18\xb9\x73\xbe\xda\x42\x88\xe2\x2f\x04\xa5\x4e\x62\xe1\xa9\x8d\x48\xd7\x77\x86\xcc\x3b\x0d\xd1\xf6\xcc\x92\x06\x78\xf3\xfa\x51\xb4\x44\x05\x36\x3b\x8b\x08\x0c\xbf\x7f\x97\xd8\x9f\x6b\x42\x64\xb8\x19\xb3\xfa\x67\x76\x73\x0b\x99\x87\x33\x87\x97\x9d\xe2\x65\xd7\x45\xe9\x25\x31\x46\x2f\xd1\xd9\x6e\x5f\x56\x82\x90\x12\x49\x81\xaa\xb4\xb0\x5b\xc2\x3c\x7c\x7f\x97\x7e\x57\xbf\x81\xf7\xd0\x6a\x3e\xc6\x22\x22\x56\x3c\x49\xcd\x5b\x6e\xbb\x63\xcb\x6a\xaa\xbc\x76\xb2\x6d\xc2\xac\xae\x48\xd6\xd1\xbe\x21\xb3\x81\xd4\x3a\xfa\xb1\xac\xb8\x8a\x8c\x76\xf1\xde\xf7\x81\xfb\x4c\x09\x4f\xd9\x36\xa4\xd3\x87\x70\x17\x3c\x5b\x05\x4c\x49\xd8\xff\x10\x72\xd7\xfb\xd1\x51\x9e\x32\x20\x38\x65\x04\x5c\xe1\x66\x28\xa9\xc1\x64\xd3\x00\x12\xc9\x81\x6f\xb7\x4e\x34\x7a\x8f\x1e\xc5\xe2\x61\x06\x43\x28\xbc\x08\xb3\x0d\xfe\x48\x52\xce\x08\x34\xcb\x9d\xe3\xf6\xf0\xd8\x9d\xb0\x0f\x8c\xce\x11\xac\x34\x80\x59\xb7\xad\x5d\xd2\x1a\xe0\xf4\xae\x1f\x7d\xce\xa9\x00\xaa\xe9\xa6\x22\x5c\x42\x65\x02\x0c\x05\xb1\x7d\xf2\x45\xca\xa7\x1f\x78\x60\x3d\x83\x06\x6f\xfe\x12\xef\xc3\xe1\x88\x7e\xc4\xab\x0a\xbc\x8f\xa1\x67\x99\xa6\x7c\xdc\xfe\x44\x46\x5c\x58\x4a\x8c\x70\x32\xbd\x2e\x43\x97\x81\xce\x14\x5d\xc5\x29\x00\xfa\x08\xf9\x74\x2f\x45\x12\x67\x36\x20\xc1\x1d\xda\xa9\x3c\x32\x97\xdb\x29\x82\x2b\x88\x20\x14\xc0\xc1\x90\x30\xf5\x62\x6a\x78\x97\x5b\x09\x3c\x26\x5d\x68\x09\x6d\x3e\x61\xd0\x69\xeb\x71\x43\xb2\x73\x13\xba\xcc\x45\x6c\x02\xbe\x58\xc1\xe6\x00\x44\x48\xdf\x82\x14\x53\x13\x50\x53\x9e\x37\x02\x0c\x61\x79\x1e\x7f\xf7\x47\xb7\x23\x56\x1b\x0a\x19\x77\x51\xc5\x41\xb7\xb3\x24\x9c\x40\x68\x6f\x84\x95\x57\x91\x2d\x8b\x0c\x04\xfe\xd2\x1f\x6c\xeb\x43\xe0\x71\x6b\xa4\x67\x8b\x38\x17\xb0\x3c\x5e\x45\xe2\x7f\xb1\x39\xb0\x19\x74\x27\x48\x14\xc6\x4d\x31\xd2\x53\x5b\xed\xb9\xe7\x58\xe0\xcb\x36\xdb\x6d\xb6\xce\x58\xfe\x06\x81\xb9\xd4\x53\xc4\xed\x2d\xd7\x4c\xd8\x3f\x3d\x12\x3c\xc6\xbf\xf9\x0d\x83\x97\x96\x62\x4c\x72\x30\x37\x40\x95\x78\x3e\xfe\xcb\xdd\x64\x3e\x26\x62\xe2\x51\xd4\xf8\xc0\x28\xd3\x53\x7d\xe0\x37\xd1\xa2\xb3\x61\x53\x9e\xc9\x35\xfa\x88\xa1\x19\x31\x19\xa2\x0b\xe2\xbc\x25\x94\x6b\x86\x62\x02\x6f\x6e\xf5\xa5\x90\xbb\xe7\xe5\x87\xc8\xfb\x11\x4c\xe8\xfe\xa5\xef\x95\xca\x06\xa4\x11\x9e\x3d\x19\x34\x18\x18\x54\xce\x5c\xff\x9a\x38\xdb\xa5\xc5\x44\x31\x40\x8f\x40\x73\x2f\x92\xf2\xb3\x1e\x77\x51\x6c\x7a\x40\x6d\x11\x76\xad\x6a\x7f\x03\x28\xf2\x63\xbd\x7c\x71\x26\xd7\x7d\x22\x1f\xf7\xe2\x33\x76\xa6\x72\xae\x56\x4d\x5b\x8f\x42\x9e\xb9\x1a\x98\x47\x50\x85\x48\xb8\x4d\x14\x23\xfe\xa0\x54\xd6\xea\x0c\xca\xae\x7d\x4f\x5f\xb4\x30\x43\x0c\xb1\x09\x9f\xfc\x5d\xc8\x2d\x1e\xd2\x5e\xb4\x0e\x15\x68\xe7\x25\x68\x1c\x97\xdb\xac\xb6\xd0\xe6\x6c\x40\x62\xf7\x1e\xe4\x2c\x32\x92\xe4\x00\x10\x3b\x56\x00\xc9\xfb\x49\x82\x40\x4e\xc0\xd2\x53\x71\x58\x1a\xf9\xc2\x64\xfa\x33\x95\x59\xb4\x49\xc3\x36\x44\xb3\x2c\x7b\x8a\x9b\x21\x0d\x18\x4e\x6b\xfa\xe5\x61\x43\x65\x96\x20\x9d\x8e\x2c\x09\xcc\xf3\xb9\x95\xe3\xe7\xad\xb1\x5c\xad\x45\x08\x9f\x0c\x31\xad\x11\xfb\x5d\x5a\x14\x06\x88\x64\x83\xde\x86\x4a\x89\x28\x59\xaf\x1b\x5b\x97\x3b\xf4\x81\x00\x14\x0f\x01\x64\x76\x1c\x59\x06\x7d\xa8\x94\x67\x27\x16\x4d\x06\x8d\x8c\xd0\xee\x96\x91\xe6\x5a\x2a\x17\x2d\xab\xc7\xb4\xee\xea\x73\x4d\xa2\x75\xda\x22\xc9\x0e\xe3\xc4\x0f\xf4\xe5\x16\xfd\x05\x63\x61\xeb\x8d\xe6\x28\x87\x97\x2b\xb3\x2b\x9f\x88\x5f\x0e\xf0\x7f\xc5\xa1\x47\x8b\x30\x10\xa7\x20\x21\xb0\x8a\x9f\xdc\xd9\xd1\xa1\x6d\x5e\xbb\x9b\x02\x03\x44\x26\xc0\x81\x07\xe4\x6c\xe9\x6c\xda\x4a\x18\xbd\x29\x0f\x1f\xcc\x20\x81\xaf\x86\xb3\xcc\xca\x68\xcd\x3c\x82\x71\xf1\xab\x55\xf7\x85\x5d\x2b\xef\xad\xeb\x9b\xd9\xcd\xcd\x78\x7e\x31\x19\x5d\x47\xb1\x30\xd7\x69\x01\x49\xc8\x7b\x3b\xa9\x54\xfa\x79\x22\x95\xf4\x4d\x05\x33\x31\x3a\x2f\x79\xab\x56\xc4\x4b\x4e\xa5\x53\xc8\x90\x9d\x04\x0e\x24\xb7\x7c\x0a\x53\x59\x0f\xbe\xce\xb3\xaf\x66\xa8\xbf\x3c\x66\x79\x2b\x7f\x90\x59\xe5\x2b\x26\xea\x52\x13\xdd\x15\xd3\x1b\x0a\xf4\xa3\x40\x00\xf8\xd3\xbd\x65\xa4\x2b\xe7\x36\xfb\xac\x5b\xeb\xd4\x4a\xe5\xc3\xa8\xb6\x0b\x77\x07\x4c\x31\x41\xa1\x0c\x82\xc4\xb2\x42\xf9\xf1\xa2\x4d\x86\x2d\x4c\xc2\xb2\xed\xcb\x9a\x36\xb1\x78\x77\xc4\xcd\x23\x72\xc0\x55\xc0\x67\xc1\x29\x1e\x07\x9a\xfe\x33\x8d\xa5\x0d\x53\x3e\xe7\xf4\x44\x8c\xae\x0c\xd1\x0c\xbc\x31\xe7\x6b\x3b\x37\x66\x6b\x8a\x8d\xe7\x6c\xdf\x15\x6e\x76\x99\x27\x53\x1d\xba\xcd\xd7\xa7\x27\x13\xba\x26\x03\xbd\x48\xf9\x64\x06\x0c\x81\x2d\x0c\x80\x54\x8f\x88\x55\x21\x09\x7f\xca\x74\xfb\x70\xee\x9c\x5c\xc3\x85\xee\x6e\x82\xe7\xc2\x26\x89\x07\x73\x02\xd8\x88\x26\x23\x30\x00\x52\x3a\x61\x6e\x35\x65\x92\x15\x61\x51\x47\x16\x23\x37\x06\x31\x26\xbd\x4d\x56\x71\xe2\x1a\xdc\x35\xef\xeb\x01\x48\xc5\x8d\x20\xa5\x9e\xac\xf0\x63\xfb\x7a\x56\xf5\x60\x0a\x80\x2a\xbf\xa5\xd3\xfd\x1d\x03\xab\x78\x60\xd1\x07\x0c\x25\xac\xd6\x57\x96\x05\x16\xd0\xae\x37\xc8\x46\x4d\xa5\xb1\x6f\x95\x00\x26\x31\xca\x83\x33\xe1\x79\x6e\x1e\xcc\xe6\x88\xa5\x2e\x0d\x12\x80\x88\x94\x15\xe0\x87\x4a\x4d\x12\x6a\xce\x4a\x39\xd6\xb9\xb0\x51\xbe\xd7\xc8\x9c\xbb\xdb\xd7\xf9\x81\x79\x6a\x71\x91\xf2\x47\xab\x78\xfa\x43\xd2\x8f\x44\x0c\xd0\x71\x06\x30\x1a\x22\x1e\x07\x02\x11\x7c\x64\x14\x20\x45\x09\xa9\x6e\xce\xdf\x23\x8d\x96\xa8\xb8\xe8\xbf\x53\x3b\xbf\x13\x52\xdd\x6e\x39\x58\x34\xcb\xa0\xbc\xd2\x60\xb5\x8b\x35\x75\x9d\xe3\xf9\x54\x98\x87\xb2\xce\x52\x0f\x67\x3c\x3a\xc3\x90\x51\x14\xec\xaf\xcc\xb9\x30\x8a\x0a\xdc\xc2\x97\xe9\x14\x64\x1e\xc1\x50\x26\xb0\xcb\x50\x29\xe9\x0c\xb5\x76\x88\x1d\xd5\xb7\x04\xc7\xfe\x7b\x67\x53\xe2\xae\x84\x8d\xe3\x57\xd7\xe8\x96\xed\x83\xfc\xb9\x05\xbc\xad\xaf\x7f\x48\xa4\x0b\xee\xea\xed\x3f\xb8\x7b\x97\x7e\x45\xc1\x49\xa8\x32\x2e\x9c\xc5\x40\x2b\x99\x4b\x3d\xad\xb0\x66\x15\xf7\x2d\x30\x68\x53\xdb\x92\x50\x63\xd7\x7a\x08\x32\x22\x09\x4b\x9c\x73\x0d\xfd\xb3\xa9\xeb\xdb\x81\x7d\xc7\xe5\x0f\x72\x1d\x25\x2f\x4d\x29\x51\x32\x19\x76\x4b\x6e\x91\xd8\x65\xba\x7b\xbd\x16\xdf\x07\x1f\xa5\xbe\xf9\x51\x64\xf8\x23\x4b\x6e\x53\xd5\x81\x2d\x3f\xd8\xa2\xad\xf9\xbe\x4f\xd1\x50\x65\x14\x96\xa8\x6f\x78\xe9\xbb\xd0\x92\xd9\x03\x6b\x84\x6b\x1a\xdd\x3e\xd4\xef\x86\x4a\x4d\x67\xbe\x90\x45\xa9\xf1\xaf\x17\xe3\xdb\xa5\x1e\x2d\xf4\xf8\xd7\xdb\xf9\x78\xb1\xb8\xbe\xd7\x8b\xf1\x52\x7f\x9a\xcd\x41\x43\xa4\x95\x21\x4b\x64\x8e\x2d\xca\xf0\xcd\xa6\x6a\x34\x8d\xeb\x85\x92\x76\xb1\xd0\x64\xbc\xd0\xb3\xb9\xbe\x98\x4d\x2f\x27\x5e\x3b\x67\x34\xbd\xd7\x7f\x9e\x4c\x2f\x13\x3d\x9e\x2c\xaf\xc6\x73\x6e\x88\x9a\xcd\xf5\xe4\xe6\xf6\x7a\x32\xbe\xd4\x93\xe9\xc5\xf5\xdd\xe5\x64\xfa\x39\x3c\xf2\x7a\x72\x33\x59\x02\x79\x7a\x02\x8f\x78\xe1\x15\x0a\xc8\xb9\x92\xef\x28\x2e\x9a\xcd\x8f\x16\x17\x69\x2e\x2e\x42\xb3\x31\x04\x24\x32\x0c\x9a\x00\x27\x72\x0c\xe9\xd8\x18\xc4\x89\xf9\x7a\xfd\x20\x7f\x5d\x50\xdd\x7e\xc3\xa5\x83\xfa\x58\xf0\x01\xb3\x66\x14\x9d\x49\x01\xd6\x61\xbf\x42\x25\x40\xb9\xce\x60\x02\xf2\x71\xa4\x3c\xbc\xb8\xdc\xf6\x90\x4b\xf7\xa5\x10\xa0\x20\xc0\x1d\x32\x00\xb7\xf3\xf9\x32\x45\xef\xf0\xe7\xba\x20\xf1\x32\x55\x05\xe2\xc5\xe8\xcd\x87\x7c\x47\x5c\x13\xe2\xad\x03\x28\x64\xc0\x1a\x16\xf7\x94\x4d\x5a\xa7\x09\x3f\x0b\xe5\xdb\xff\xd6\x64\xfb\xe0\x16\x37\x05\x39\x19\xb8\xaa\x4b\x8c\x34\x55\x55\xb3\xe7\x6a\x63\xdc\xf3\x71\x7b\xfe\x69\xa8\x54\x5c\xa2\x75\x3d\xa1\xb1\xfc\x4f\x4c\xed\x29\x4d\x40\x9f\x2e\xd6\x53\x37\x09\xa6\xf7\xea\x62\x36\x45\xe3\x7a\x36\x5f\xe8\xc5\xd5\xe8\xfa\x5a\x5f\x8d\x7e\x19\xc3\xc4\xf3\x6f\xc4\x29\x33\xbd\xd7\x97\x93\xf9\xf8\x62\x99\xe8\xc9\x34\xfc\xbf\x8b\xc9\xe5\x78\xba\x1c\x5d\x27\x6a\x71\x3b\x76\x06\x7b\xa2\xc7\xbf\x8e\x6f\x6e\xaf\x47\xf3\xfb\x84\x66\xec\x62\xfc\x97\xbb\xf1\x74\x09\xd6\xfc\xe8\x66\xf4\x79\xbc\xd0\xa7\x7e\xe6\xf7\x4c\x7c\x75\x3d\x5b\x2c\xdd\x0a\xfc\x34\x59\x2e\x06\x89\xbe\x9a\x7d\x19\xff\x32\x9e\xeb\x8b\xd1\xdd\x62\x7c\xa9\x47\x53\xb7\x2a\xa1\x45\xcb\xab\xf1\x6c\x7e\x1f\xf5\x4f\xa2\xbf\x5c\x8d\xe1\x73\x27\x53\x0d\xdf\x37\xba\x58\x26\xca\x39\x11\x17\x4b\x79\xd9\x6c\xae\x97\xb3\xf9\x52\x36\x65\x3a\xfe\x7c\x3d\xf9\x3c\x86\x1c\xfa\x5c\xcf\xdc\x53\xbe\x4c\x16\xe3\x81\x1e\xcd\x27\x0b\x77\xc1\x04\x5e\xab\xbe\x8c\xee\xb5\x6b\x32\xa5\xe6\xef\x16\xe3\x6f\x64\xed\xe1\x65\x57\x63\xd7\x35\xf3\x8b\xc9\x62\xcc\xfb\x03\xa5\xb2\x20\xb5\x35\xbe\xd4\x57\xe3\xf9\x18\x10\x05\x89\x1e\xff\x32\x9e\xea\xc9\x27\x3d\xba\xfc\x65\xe2\x3e\x9a\x9f\x37\x5b\x2c\x26\xbc\xa8\x3f\xe9\xc5\xdd\xc5\x15\xf7\xe9\x50\xff\x3c\x54\xea\xf3\x78\x3a\x9e\x8f\xae\x51\x56\xa2\x17\x44\x19\x5c\xd6\x0c\x55\x5c\xf3\x0c\x10\x61\x11\x8c\x92\x16\x58\x98\xfc\x0a\xe0\x60\x59\x2d\xc3\xf9\x10\x8a\x81\x35\x0d\x0f\xa1\x79\xed\x9f\x42\x33\x9d\xca\x01\xcc\x2e\xcd\xe0\x99\x54\xfd\x70\x34\x89\xc4\x14\x82\x65\x53\xeb\x6d\x53\xc1\xe9\x41\x18\x5f\x32\x73\x99\x23\x9e\x00\xbb\xea\x9b\x88\x4f\xb2\x99\xdd\x96\xb5\x6b\x76\x1d\xd0\x27\xe7\x8f\xe0\x60\x56\xe1\x41\xd8\x35\x00\xe9\x8d\xa0\xa0\x93\xad\xdc\x26\x43\xc5\xa4\x0f\xf8\xd6\x4c\xdf\xe2\xbd\x8b\x38\xe9\xeb\xf6\x15\x72\x3e\x15\x48\x89\xd3\x9d\xb1\x36\x91\x77\x68\x4f\xbf\xb3\xfc\x01\x2c\x35\x76\x3f\x06\xac\xa6\x5e\xb4\x23\xd1\x21\x7a\xde\x17\x4f\x02\x76\xc4\xf5\xa3\x6a\xa5\x4f\xda\x73\xa7\x53\x26\x12\x17\x72\x50\xc1\x1c\x77\x84\xca\xac\xde\x66\xb9\xd9\x20\x6a\x9b\x12\x50\xe0\x4b\xfe\xde\x9e\x2c\x0e\x8a\x92\x0f\xdf\xdb\x2d\x3a\xea\x96\xb8\x02\x24\xce\xad\x61\x60\xe4\x34\x94\x13\xf4\x15\x68\x78\xcc\xc3\xcb\xa5\x19\x83\x50\x4a\x82\xbd\x21\xe3\xf7\xf8\x7d\xa7\x96\x07\xa9\x73\x01\x81\x7a\x79\xa0\x70\x08\x3c\x3b\xc8\xe9\x6a\xf0\x9f\x1e\x00\xa5\x46\x79\xde\xf3\xae\xef\x1b\x66\xc4\xa1\xb0\x8a\x87\x42\xa4\x71\x50\xcd\xa6\x16\x78\x2d\x04\x5a\xe4\x9d\x18\x72\x2b\xc4\x59\x6c\x54\x08\x4e\x34\x6c\x21\x73\xbd\x53\x3b\x86\xb8\x37\x55\x56\xa2\x6a\x70\xb6\x33\x54\x17\xb1\x32\xeb\x12\x24\x18\x53\x1c\x08\xf2\xc4\x8a\xb2\x08\x07\x3a\x22\xcb\x7f\xc7\xd7\xfb\xef\x4e\x64\xee\xda\x07\x21\x50\xca\xa5\xa1\x12\xb2\x97\x9c\xe6\xd4\xd9\x52\x25\xf0\x23\x84\xb0\x99\xda\x57\x6e\x5f\x83\xf5\x3e\xd4\x5e\x27\x46\x36\x4e\xba\xd1\xbd\x2d\x24\x87\xaf\x9b\x18\x5b\x1d\xc4\xca\x92\xce\xb4\x6c\x16\x8e\x2e\xf3\x35\x11\x54\x00\xaa\x01\x86\x4a\x8d\x9f\x4c\x05\x38\x8e\x8c\x55\xe1\x5e\x80\xd3\xb6\xc4\x19\xc5\x76\xbe\x6a\x6a\x95\x91\x1b\x0e\xce\xfc\x53\x99\x6d\x80\x54\x1a\x54\x23\x4d\xb1\xc6\x4d\x3d\x3a\x96\x7c\xc8\x93\x54\x3a\x9c\x4b\x5a\x16\xf9\x41\x49\xf8\x2d\x01\xc6\x02\xdd\x13\x46\xbb\xd0\xb9\x0d\x8f\x5b\xd4\xe6\x39\xad\x36\x3d\xc4\x5b\x4a\x30\x8b\x47\x32\x17\x62\x67\x01\x35\x0d\xf7\xc7\x41\xcf\xc4\xf5\x9a\x19\xca\x6b\x66\x4c\x4b\xdd\xe2\x70\xa9\x7b\x5b\xf3\x98\xb6\x18\xc0\x04\x9b\xb2\x12\xf9\xae\xc9\xc7\x1b\x96\x89\x61\xb0\x5d\xe7\x61\x78\x15\x84\x3d\xad\xcd\x1e\x0a\x3a\x70\xbb\xb9\x4e\x10\xd2\xb5\x47\x5a\x04\x07\x91\xdb\x22\x61\x91\x79\x08\x57\x94\x47\x2e\xcc\xb3\x6a\x69\x6d\x84\x07\xb1\x38\xc8\x77\x4a\x6e\x2c\x1f\x8d\xe2\x89\x28\x3a\x3c\x4a\xb3\x0f\xf0\xab\x72\x80\xb3\xaf\x62\xec\x58\xab\xe0\xe9\x68\xb3\x70\xdd\x10\xb6\x00\x31\x74\xac\x29\xd3\x3a\x8d\x70\x27\x49\x95\x98\x0b\xdd\xc7\x65\x41\xf5\x7a\x93\x74\xe2\x26\xa0\xa6\x77\x3c\x97\x2b\x3f\xb4\x83\x29\x18\x88\x8a\x5e\xd1\x04\x41\x93\xa1\xfa\x68\x32\x3c\x63\xf2\xeb\xd3\x14\x05\xb6\xe1\x7c\x00\xc5\xe8\x24\xda\x04\x08\x8a\x55\x94\x7c\xbc\x94\x55\xb0\x09\x68\x6b\x38\x4a\xa9\xd5\x02\x30\xf4\x7b\x60\xbe\x96\xc2\x37\x34\x81\x9a\xdf\x9d\xaf\xb8\x4b\xb4\x01\x36\x01\x93\xb7\x61\x00\x01\xd9\x4f\x25\x84\xdc\x67\xee\x54\x08\x1f\x1e\x1f\x89\x3d\xc9\xb2\x50\x17\x80\x18\x9c\x68\xe8\x1e\xa0\x22\x32\x44\x4c\x43\x4d\xa1\xd1\x0b\x88\xd8\x97\x5b\x3d\x35\xcf\xfa\x5e\xb2\xae\xf4\xa3\x19\xe4\xbd\x54\x40\xb8\xc0\x0c\x5b\xb9\xd5\xa3\x9d\xa9\xb2\x75\x4a\xf4\x62\x55\x4d\x80\x1f\xd9\x1e\x54\x58\x5b\x55\x68\xc0\xc8\x10\x71\xff\xc7\x41\x65\x89\x57\x9d\x3c\x98\xb4\x0a\x4c\xef\x44\xaa\x03\xa2\x23\x68\x2f\x55\xa5\xeb\x55\x58\xb5\xf8\xfe\xe7\x14\x46\xdf\x4d\xbb\xc0\xbe\x06\x15\x9c\x07\x5d\xc3\x69\x8d\x81\x3e\x15\x88\x13\x82\xfd\xf0\xbf\x5b\xb5\xc2\xf0\xc7\x8b\xf1\x7c\x7a\x36\xbb\xba\x3e\x3b\x1f\xbe\xfe\xef\x29\x02\xf8\x06\xfe\xff\xfc\xe7\xb7\xe7\x2d\xfc\xff\x9b\xd7\x3f\xff\xfc\x2f\xfc\xff\x3f\xe2\x3f\x37\xfa\x7a\x76\x75\xad\x9f\xce\x87\xaf\x95\x7a\xfd\xea\xfc\xcd\xd9\xab\x3f\x9e\xbd\xfa\x49\x9f\x69\xf7\x5b\x02\x04\xeb\x4f\x69\xa2\x17\xcf\x59\xfd\x77\x53\xe5\x90\x03\xc6\xdb\xf6\xa6\xd0\x57\x0c\x44\x03\x0c\xdc\xda\xd0\x83\x6e\x2b\x93\xee\x9c\xbb\xac\x96\x98\xdc\xc6\x45\xfc\xc2\x7d\xa7\x27\xdc\x96\x93\x81\x3f\x75\xce\x87\xaf\x13\xbc\xe9\x19\x14\x77\x54\x44\x67\x5a\x97\x25\xe8\x67\x6d\x4b\x5b\x03\x86\x4e\x0a\xfc\x10\xe3\x19\xee\x2a\xbb\xb2\x78\x08\x98\xb9\x8d\x71\xd6\x81\xa1\x7c\x9e\xf6\x7d\x20\x0d\x2e\xf8\x2b\x94\x2b\x93\xe9\xf7\x6c\xf2\x75\x89\xaa\x60\x5c\x71\xc6\x37\x82\x9a\x7c\x53\x78\x83\x0c\xf9\x60\x0b\xb7\xe9\x33\xa4\xa0\xc7\x28\x26\x28\x77\xdc\x1b\xd8\x34\x3b\x54\x23\x1f\x31\xf6\xec\x87\x7e\x43\xd7\x73\x94\x0e\x77\x0f\x6a\x7d\x94\x15\x67\x27\x37\x4f\xf8\x14\x9e\xd6\x08\x58\x8d\x82\xf2\x79\x2c\xeb\x80\x74\x01\xa8\x15\x8d\x0f\x2d\xca\x0a\xd2\xa6\x2a\xab\xe1\x10\xc3\xa0\x75\x56\x3c\x95\xf9\x93\xaf\xe2\x87\xf7\xb1\x78\x87\x79\x32\x79\xb9\x8f\xea\x0c\xfd\xb7\xa9\xf3\xa1\x28\x21\xb5\x24\x4f\xcf\x85\x77\xcc\x66\x25\xe8\x4b\xc1\x7b\xf2\x1a\x61\xc2\xd0\x35\x69\x91\x15\x0f\xf6\x3d\x63\xd0\xd7\x82\xa1\xd7\x4f\xb7\xab\xeb\xa1\x52\x27\x91\xf6\x04\x5f\x65\xd7\x8f\x06\x48\x1d\xf4\x26\x4b\x21\x64\x99\x70\x33\x13\x24\x6c\xc9\x00\x74\xc8\xff\x77\x55\xa6\xd5\x46\xe5\xe9\xa1\x6c\x6a\x9b\xe8\x9d\x59\x3f\xa6\x45\xb6\x4e\x73\xbd\xa9\x52\xd7\x24\x9b\xe8\x6d\x5e\x3e\x03\x73\x11\x65\x3e\xdb\x7c\x71\x89\xc8\x87\x9a\xdf\xf6\x79\x0a\x18\x80\x83\x70\x16\x49\x9d\x5d\x08\x50\x92\x95\x93\xb2\x74\x44\x1f\x5a\x83\x58\xd4\x3a\xfe\x25\x75\x0c\xba\x03\xb1\xec\x08\x91\x1b\x50\x62\x8b\x54\xba\x05\x00\xbd\x27\x7a\x1c\x88\x8f\xb2\x9c\xea\xb3\x3d\x4e\x8e\xe3\x03\x85\xde\xa7\x7b\xe7\xc2\x6d\xb3\x7c\xc7\x54\x48\x0a\x67\x33\x10\x84\x74\xc6\x43\x5f\x97\xeb\x68\x60\x52\x9d\xd3\x5f\x90\x4d\x41\xd7\x92\xba\x4d\x70\xc1\x47\x8f\x41\x38\x0e\x9a\xb8\x8f\x46\xaf\x4c\x9e\x19\x94\x39\x47\x8b\xdc\xa3\xcb\x91\xc0\xd7\x07\xf2\xd3\x5a\xbb\x05\x55\xa3\x6c\x06\x98\x14\x9e\xa9\x93\xa5\x8b\xd6\xe5\x6e\xd7\x14\xcc\x97\x10\xd1\x91\x77\xf4\xce\xcb\x6d\xdc\x2e\xaa\x37\xd8\x34\x6b\x5f\x1b\x40\xa4\x6a\x69\x41\x52\xd9\x9e\x31\xca\x2b\x35\xb9\x99\xf8\x94\xad\x8d\x5e\x35\x59\x5e\xeb\x86\x71\xa0\x2a\xee\x39\xda\x60\xfc\xe6\xd3\x79\x31\x81\x93\x8d\xac\xf0\x28\xd2\xba\xa9\x30\x8d\x8c\xf6\x16\x95\x7c\x74\xca\xa9\x85\x05\xa6\x78\x22\xf9\x67\xc6\x55\x23\xc7\x9e\x89\x55\xd2\x00\xb5\x40\xd2\x4d\x6c\xa9\x6d\xa9\xc1\x74\xe4\x9d\x42\x87\x9b\x16\xfd\x3b\xd4\x25\xc5\x62\xb5\x96\x7d\x3d\xb4\xd8\x5a\x7d\xd4\x66\x08\x3a\x82\x48\x0c\x1f\x38\x62\x48\x37\xa1\x68\x48\x24\x25\xdd\x19\xd6\x5b\xd2\xa9\x60\x39\x76\xcf\x83\xa1\x72\xe7\x96\x9b\xdd\x77\x01\xdf\xb2\x4b\xed\xba\x01\xed\x99\x07\x03\xcd\x88\x60\x22\x5b\x03\xf9\x23\x02\xae\x19\x58\x59\x78\x1d\x81\x12\xad\x32\xbb\x7d\x5e\x1e\x9c\xa3\x87\x59\xa8\x18\x58\x53\x99\xd4\x2d\xd5\xa1\x52\x4a\xbd\x1e\xea\x11\x45\x4e\xd1\xd9\x55\xaf\x87\xe7\x92\x9b\x60\x6d\xc8\xf0\xf7\x74\xaf\xc8\x35\x0c\x09\xe6\x58\x68\xbc\x3d\xdd\x55\xdc\xfd\xbd\x51\x9e\x78\x2d\x7a\xaf\x61\x97\x16\xcd\x36\x5d\xd7\x08\x30\xde\xa8\xf6\xad\xb4\x32\xec\x50\x7f\xec\x50\x1e\xe1\xe1\xd7\xe3\xeb\xf0\x51\x21\xf1\xf7\x46\x67\x55\x65\x9e\xca\x35\x82\xb1\x00\xfa\x04\x5f\x6a\xfb\x07\x7e\xe8\x3a\xe8\x75\xab\x83\xb2\x56\x58\xd8\x48\x22\xf3\xca\xac\xeb\x50\xb3\xc0\xaf\xc5\x2a\x3b\x59\xd4\xe0\xcb\x38\xa2\x28\xbe\xa0\x2c\x73\xc7\x24\xc4\x49\x96\xb2\xf9\x21\x74\xa1\x3c\xac\x6a\x6d\x04\x5c\x1c\xe1\xc2\xb6\x59\x9d\xd1\x6f\xf8\x0d\x6f\x5a\xdf\xe0\x0f\x7c\x88\xf0\x6f\x64\x10\xdd\x6d\xca\xd5\x0e\xff\x1f\xc4\x23\x37\x46\xe7\x65\x8a\xbc\xc8\x75\xa9\x28\x75\xb7\x83\x73\x05\x37\x20\x06\x67\x4a\x96\x5e\x04\xcc\x74\x0b\xd6\x5a\xdb\xf1\xf1\x9d\x49\x73\xfc\x9f\x47\xdf\xcb\x32\x83\xad\xd0\xd3\x5c\xc5\xcd\x8d\x8f\x46\xf2\x88\x0d\xb1\x60\xc4\xe1\x90\xf6\xf1\x87\xbe\xa1\x3a\xf6\x0a\x2d\x5e\x11\xaa\x63\xe2\x00\x4b\x94\x08\xc5\x67\xab\x23\x93\xeb\x0d\xf2\xca\x7c\xc7\xea\xd2\x2f\xaf\x2e\xd5\xe9\x5a\xf7\xf0\xf3\xd6\xec\xc1\x09\xf8\xd5\x98\xbd\x1b\xca\x74\x5d\xc7\x64\xb9\xb8\x1e\x03\x65\x36\x81\x28\x13\x45\x79\x2c\x18\x69\xd4\x34\xa0\x10\x69\xff\x11\x1d\x64\xf1\xf9\x26\x82\x41\x6e\x0d\xa1\xb2\xc4\x4c\x14\x44\xae\x9b\x88\x13\x56\x40\x41\xbc\x3c\x44\x8b\xa1\x3b\xde\xc4\x87\xfa\x8a\x3f\xb1\x25\x1f\x57\x23\x5f\x8a\xbb\x0b\x91\x6f\x12\x67\x1a\xf7\x1a\x6c\xd6\x36\xd4\xd7\xe2\x94\x4e\x8e\xcc\x51\x92\x36\x25\xe8\x62\xeb\x2c\x52\x3d\x67\xbf\xc1\x51\x7f\xdd\xb3\xac\x51\x3c\x4e\x3c\xe7\xa5\x51\x87\x83\x64\x95\xd6\xd9\x4e\xc5\x9c\x84\xad\xe6\xb5\x0c\xb7\xd6\x44\x8d\xa8\x8f\xbc\x38\xae\xa4\x6f\x76\x73\xc8\x35\xf8\x4d\x4f\x83\x85\xd2\x44\x67\xe1\x82\x9d\x52\x56\x38\x79\xa9\xf7\xb9\x2c\x00\x71\x46\xc0\xd6\x26\xe7\xfc\x91\x2f\xa8\xbb\x13\x18\x32\x90\x72\xe3\x68\x1d\xe6\x2d\x48\x76\x7a\x64\x9a\x0a\x12\xf2\xac\x26\xc1\x5a\x65\x52\x9b\xe5\x07\xb4\x2d\xb9\x1e\x29\x08\x15\x05\xb2\xb4\x62\x6d\xe2\xa6\x7d\xf7\x04\x78\xc1\x18\xa3\xe3\x2b\x74\xfe\x5b\x58\x4a\x09\x5a\xb8\xca\x17\xc5\xac\x0e\xfe\x9a\xb7\xc3\xf3\x04\xe1\x91\x9e\x0f\x12\xf9\xc6\x68\xd7\x14\xe9\x12\x79\x52\x29\x91\x9c\xb6\xd6\x54\xb5\x76\x6b\xb2\x65\xd1\x81\xe9\x6b\x1e\x4a\xe0\x76\x22\x15\x1d\xda\x82\x21\xac\x59\x67\xb9\x4e\x15\x43\xbb\xb2\xa8\x20\x16\x66\xcd\xdb\xde\x69\xfe\x9d\x13\xfc\x85\x01\x3e\xad\x09\xe6\x9a\x85\xa0\x34\x6e\xee\x18\x21\xbc\x0e\x1c\x76\xb6\x14\x09\x2f\xff\xf9\x03\xb7\xa7\x41\xa8\x3c\xaa\x55\x71\x0b\x19\x3a\x46\xea\x22\xc9\xcc\x9d\x58\x16\x28\x83\x14\x38\x74\x8e\x8c\xa8\xe7\xe0\x0e\x0c\xdc\xbc\x29\x3a\x97\x2d\xca\xae\xfa\x66\x3b\xef\x25\xe2\xd6\x6e\xad\x09\x7f\x98\x42\x02\x33\x72\x21\x03\x1f\x7f\x24\x27\x83\x0a\x4b\xdf\xdf\xda\x14\xe2\xea\xfd\xeb\x86\xe5\x41\x48\xe8\xdf\x2f\x8e\xf8\x6a\xdf\xb1\x00\x94\x2e\xcc\x07\x28\xa1\x42\x16\x54\xbf\x3e\x5f\x68\x8a\xb4\xa8\x73\xf3\x64\x80\x99\x29\x5d\x59\x60\x1d\x02\x77\x80\xce\x85\xa3\x1b\x5f\x2d\x25\x78\x34\x0a\xa3\x1c\xd5\xdb\xc1\xda\x45\x7d\x6a\x86\x0f\x43\xcc\x2b\x60\x29\x32\xdd\xc6\xf8\xfb\xd1\x25\xc6\x94\x52\x2b\x4e\xf9\x01\x93\xb9\x21\xde\xf8\xc9\x14\x35\xee\x71\x74\x33\xf2\x6c\xef\xab\xcc\xd4\x69\xc5\x05\x02\xf4\xdb\x53\x66\x9e\x51\x23\x19\x32\xc3\xf8\xf4\x58\x5c\x4a\xa5\x85\x9e\x2d\x26\x67\x00\x1e\x7b\x32\x41\xca\x94\x06\x40\x3c\x1b\x6f\x77\x5b\x19\x21\xd7\x33\xae\xc9\x30\x03\x2d\xab\xa2\x5f\xdc\x7f\xbe\xe5\x06\xb1\x9f\xa7\xdd\x61\x89\xce\x77\xe8\x8c\x04\x10\x04\x52\x90\xb4\xe5\x3c\xb9\xbe\xe3\xb0\x82\xb5\x0d\x16\xeb\x40\x2c\xcd\x6d\x19\xef\xc4\x96\xb1\x36\x82\x54\x2b\xae\x83\xf6\x96\x6f\x10\x6d\xa0\x0a\x67\x28\xcb\x7b\xc8\x6c\x0d\x75\x40\x1c\x9e\xf2\x16\x04\xb0\xa1\xad\x0e\x89\xa4\xdd\x25\xc2\xad\x72\x8b\xb2\x99\x6c\x3b\x7b\x22\x02\xb9\x71\x26\xea\x08\x1f\x9a\x87\xc6\x88\xca\x85\x16\xb3\x67\xd7\x39\xc1\xf0\x62\x4c\x64\x18\xf6\x98\x77\x82\xb3\x10\x08\xa9\xdc\xc1\x14\xc1\xf4\x20\x16\xc0\x67\x7f\xd7\xed\x3f\x32\xca\x38\x37\x3a\xde\xcb\x50\xa9\xb7\x43\x7d\x13\xfb\x62\x1d\x37\x8e\xad\x71\x77\x71\xdb\xbe\x04\xab\x40\xdc\x1f\x1d\x7c\xfe\x4e\xdd\xb7\xf5\x26\x92\x5d\xe4\xd8\x33\x50\xd6\x88\x11\xb3\x7e\x0e\x74\xfb\x35\xde\x4e\xbd\xce\x7a\x5d\x62\x99\x51\x74\x54\xc2\x1b\x43\xdb\x0a\x6d\x52\x7b\xa0\xa8\x45\xb9\x55\x14\x08\x42\xe8\xcc\x31\xb3\xf1\x78\x67\x27\xf1\x56\x01\x52\xdb\xa0\x91\xde\x40\xc9\x57\x18\x6c\xd7\x9f\x6d\xb3\x10\x61\x67\x59\xac\xc6\xe0\x4c\xab\xa0\x92\xf0\x58\xc2\x69\xc1\x14\xbe\x1b\x77\x8e\xab\xe7\xcc\x3e\x22\xcb\x02\x24\x32\xb1\x6b\xa4\x36\x54\xba\x62\x36\xae\xfa\xb0\x37\x89\xfe\x5b\x93\x22\x52\x08\x46\x9c\x33\x73\x04\x31\xa7\x33\xc5\x77\x51\xe7\xa8\x3a\x7d\x4c\x61\x6b\xf7\x83\xb6\x51\xea\xdd\x30\xa8\x3f\x20\x19\xb7\x0f\x39\xbc\x73\xf3\x46\x60\x36\xff\xdf\xff\xf3\xff\xea\x89\x3c\x32\x40\xff\xd8\xf1\x20\xaa\xc6\xd5\x89\xeb\x01\x7b\xe2\xef\xe9\x0a\x11\x44\x18\x6c\x41\x36\xd9\x8a\x5f\xaa\xba\x4c\x7a\xeb\x32\x3b\x95\x98\x09\x4c\x1d\xd0\x22\x4b\xd7\x10\x9d\x85\xaa\x09\xf7\x43\xbb\xda\x13\x0f\xe4\x50\xbb\x42\xba\x4d\xfa\x7b\x6a\x39\x35\xa9\xca\x10\x1d\x0c\xba\x47\x60\xa1\x73\x49\xd6\x71\xab\xf9\xb8\x5b\xed\xfa\x88\xed\x43\xb5\x94\x01\x0c\x44\xf8\x17\x65\x2b\x64\x1b\x38\x80\x5b\xef\x39\x32\xe9\x55\xfc\x92\x04\xe3\x0d\xe0\xd0\x93\xd5\xe9\x6b\xf7\x03\xea\x2e\x91\xb2\x2d\x52\xcb\x4a\xf9\x52\x2b\x79\xd4\xc1\x85\xb8\x60\x30\x40\x0a\xb8\x68\x70\xde\xca\x10\xbc\xf2\xa3\x82\xcc\xae\x1e\x9f\xaf\xa4\x91\x1c\xf6\x59\x6f\x59\x05\x13\x92\xea\x45\xa3\x9d\x12\x83\x29\xc1\x5f\x55\xc1\x5f\x3d\x40\x51\xe8\xcb\x8a\x10\xe4\xf6\xa6\xc7\x54\x80\x58\x06\xed\xdb\xe7\x47\xbc\x5f\x44\x9a\x29\xce\x9c\x81\x8c\x0c\x18\xf9\xeb\x9a\x2b\x48\x0a\xdb\xec\x80\x43\x73\x9f\xae\x91\x39\xf1\x9d\xdb\x78\x02\xa8\x38\x02\x09\xfb\xd5\xe9\xa7\x08\xf6\x15\xe4\x5a\x8a\x8e\xc4\x00\x56\x04\xab\x97\x55\x1d\xe2\xc2\xe0\x44\x9b\xdf\xcc\x6e\x9f\x83\x69\xb4\x6f\x8a\x0c\xec\x2e\x1e\x72\x75\x54\xf0\xe1\x1b\x94\xb1\xfb\xaa\x5c\x37\x95\xe0\xb1\x5c\x51\x62\x4b\x3d\x00\xfb\x70\xd0\x88\xb3\x89\x07\xa7\xc3\x94\xd9\xa4\x75\x4a\xca\x70\xdb\x8c\xb4\xb4\x7d\xa9\xa3\xc4\xa2\x27\xea\x11\x7d\x2b\x2e\x2e\x83\xb4\x0d\x7a\xdc\x28\xad\xe1\x9e\x19\x44\x33\x78\x86\x24\x2f\xaa\x6c\x28\x2e\x00\x0c\x5d\x1b\x73\x6c\x72\x29\x9d\x90\xd3\x82\xfd\x20\x8f\x62\x45\xad\x05\x79\x6c\x1b\x45\xfe\x2e\xbf\x5c\x5e\x3a\x79\xe5\x8a\x49\xbc\x86\x5a\xba\x79\xca\x80\xda\x82\x8c\xd1\xd2\xfa\x82\x1c\x9f\xd6\xa3\xca\x6f\x1f\xef\x8d\xfd\x79\xf5\x58\xe6\x9b\x68\x7d\x9d\xda\x01\xea\x70\xbb\x1b\x1e\xd3\x6a\x07\x3e\x27\x31\x88\x09\x26\x8e\x04\x8b\x13\x92\x50\x5b\xee\x29\x81\x7b\xa8\x85\x3d\x4d\xc7\x41\x6c\xc7\x74\x20\x44\xdd\x07\xa8\xde\x06\x4a\xb5\x7e\x1a\xb2\x7e\xb8\xfb\xff\xe7\x1e\x61\xc4\xcb\x95\x56\xa8\x88\x36\xf6\xf0\x6d\xd4\xed\xc8\x2b\x2c\x49\xcc\x92\x4a\x16\x09\x9c\x38\xcc\xb4\x03\x9a\x91\xce\x7a\xed\x63\x0a\xe9\x30\x9a\xb4\x02\xce\xd0\xf4\xb6\x39\x11\x7c\x7e\x62\xc9\x02\x7b\x15\x3c\x24\xb6\xa5\x05\x34\x15\xb5\x1a\x4f\x05\xd9\xd4\xba\x2a\x8b\x03\x79\x05\xe9\x6a\x55\x99\x27\xaa\x92\x1b\xb8\x43\x13\x87\x18\x2a\x3d\x1e\x4a\x1b\x81\xc9\xa2\x18\x79\x66\xd5\xd7\xa2\x7c\x2e\x12\x6d\xdd\x1e\x02\xd5\xe7\x7a\x9b\x56\x08\xf9\x0c\xb4\x1f\xfd\x7e\x37\xd0\x83\x23\x8c\x9d\x91\x96\x8a\xbe\x26\x7c\x88\xdf\xce\xb7\x54\x0c\x19\xc4\xcd\xb2\xc2\xed\x5a\xe0\xa3\x69\xdb\x3c\x3c\x18\xaa\x68\xfd\x9a\x81\x54\xac\x92\x29\xef\x1e\x3d\x28\x60\x5f\x87\xac\x55\x61\x3c\x57\x70\xff\xda\xea\x9c\x81\xf4\x6f\x7a\x93\x84\x7a\x7d\xf3\x4d\x2a\xb8\xb3\x00\x36\x14\xe1\xb2\xe3\xa7\xbc\x3f\xe1\xd5\x4f\xc3\x37\x43\x4c\x75\x43\xc5\x22\x01\x39\x9b\xfd\x06\x2c\x46\x0f\xe6\x6c\x9f\x51\x38\x78\xa8\xc9\xe6\x9d\x71\xf5\x40\x7a\xfa\x82\x9a\x21\xa5\x6c\x3a\x3d\x09\xcd\x2a\x62\x6a\xc8\x0a\xbd\x71\x4f\xc8\x79\x98\xd1\x18\x0d\x63\xad\x30\x43\xcc\xa0\xe5\x21\x80\xca\x7c\x9b\xa2\xc4\xac\x7d\xe4\x62\xa7\x54\x37\x45\xf6\xb7\xc6\xb4\xb1\x92\xee\x5b\xdf\xb6\x72\x1d\x6d\x64\x36\x56\x4b\xb1\x10\x05\xf1\x64\x24\x18\x90\x64\x52\x5a\x0c\x71\x28\x99\x9b\x91\x58\x86\x32\x54\xf0\x65\xdb\x78\x4b\x63\xc4\xb7\x6e\x21\xbe\xd5\x0b\xa2\x19\xc8\x03\xdd\x7a\x10\x82\x58\x9d\x29\x1e\x01\xde\x08\xde\x1f\x64\x03\x3a\x7b\xbf\x34\x0f\x18\x08\xff\xae\x8d\x60\x76\x6b\x7d\xbf\xcf\x0f\xdf\x84\xab\x0d\x7f\xfc\x4b\x7d\xf6\xf9\xf6\xfa\x0c\xb5\x54\xb2\xb2\xf8\xaf\x27\x83\x7d\x19\xff\xf5\xea\xfc\xe7\x57\xef\x5a\xf8\xaf\x77\xe7\xaf\xdf\xfe\x0b\xff\xf5\x8f\xf8\xcf\x9d\x20\x7f\x81\xb2\xe0\xbd\xdb\xbd\x3e\xdf\x5e\xd3\x19\xe8\xe9\x5f\xc5\x3f\xdf\x2b\x05\x24\x55\x64\xf5\x69\x3f\x67\x12\xaf\xf4\x42\x81\xa9\x54\xe7\x69\xf5\xe0\x4e\x08\x10\xef\x80\x9d\x86\xc8\x3a\x88\x6d\xa3\xa9\xf7\x4d\xb0\x9b\xa5\x14\x45\x27\x50\x9c\xd6\xf8\x18\x32\x90\xb9\x5e\xea\x50\x36\x95\x5e\x3f\x96\xd9\xda\x24\x6e\xf7\x61\xfd\x65\xf7\xf8\x67\x52\x5e\x8b\x98\xbf\x63\xed\x5f\x67\xf6\x31\x6b\x57\x6f\x1b\xfa\x1e\x29\xc8\xc9\xb8\x4a\x06\x37\xcc\xda\x7f\x92\x27\x85\x6f\x7f\x6b\x20\xb5\x89\x15\x46\xb1\x84\x9c\xc3\xac\x32\xd4\x40\xc4\x83\x61\x04\x5e\x7f\x63\x04\xc0\x6c\x6f\xe9\x35\x21\x07\x66\xf7\xc5\x98\x7c\xcd\x9b\x07\xd7\xcc\x1e\xbd\xfb\xfe\x7e\x46\xfc\xdd\xa6\x41\x59\x1a\xf3\x9b\x59\x37\x35\xc5\x05\x8b\x17\x38\xc6\x05\x34\x43\xdc\xf4\x8d\xb7\xb5\x92\x1b\xe2\x3e\xe6\x98\x49\xd7\x6b\x98\xb8\x19\xe5\x72\x3a\x61\xf8\xc0\x09\x02\x3a\xa7\xd6\x54\x3e\x95\x26\x1e\x57\x07\x27\x53\x52\xe5\xf0\x76\x2b\x7a\x2d\x11\x12\x2b\x70\x64\x8a\xcb\x3d\x47\xf0\xc6\xec\x4d\xb1\x41\xa4\x32\xd0\xbe\xe2\x89\x29\xaa\xb4\xd0\xd3\x81\x92\x28\x3f\x6c\x00\xe9\xea\x7d\xe5\x31\x7d\x2b\x2f\xfc\xfb\xbf\xb0\xfe\x87\x3f\xba\xcd\xff\xf5\xf0\xd5\x59\x59\x9d\x41\x60\xf7\xbf\x1e\x03\xfc\xf2\xfe\xff\xf6\xf5\x9b\xd7\x3f\xb5\xf6\xff\xb7\xaf\x7f\xfe\xe9\x5f\xfb\xff\x3f\xe2\xbf\xcf\xd3\x3b\x4d\xa5\xb2\x44\xd2\xad\x89\xa4\x5b\x29\x66\x01\x7f\x9d\xe8\x3f\x35\x85\xd1\xe7\x7f\xfc\xe3\xb9\x52\xb1\x48\xc1\xf9\x1f\xff\xf0\xc7\x04\x7e\xd1\x9f\x9c\x4b\xb7\xe0\x5a\xcd\x4f\x65\x53\x6c\x68\x02\x4f\x8a\xf5\x50\x2b\xf5\xce\x5d\x93\x16\x5f\xf3\xac\xd0\x8b\xba\x32\xa6\x4e\xf4\xa7\x6c\x5b\x3f\xea\x4f\x79\x59\x56\x89\xfe\x58\xda\xda\x5d\x7f\x33\xd2\xaf\x5e\x9f\x9f\xbf\x3a\x3b\x7f\xf3\xea\x3c\xd1\x77\x8b\xd1\xef\xac\xc2\xe2\xec\x79\xbb\x1c\x8b\x56\x8c\x62\x76\x6e\x5c\x98\xb0\x14\xb1\x12\x85\xcf\x0c\xa0\x2a\x81\x34\xa7\x04\x32\x07\x2e\x4c\x4c\x34\x95\xb6\x0e\xc5\xa9\x02\x58\x8c\xf1\x7b\xc8\x85\x39\xf7\x1d\xb6\x34\xe7\xf0\x6e\xdc\x01\x50\xa2\x02\x06\x92\xea\xc0\x26\xa0\xb3\x1a\xa0\x4f\x18\x4a\xb0\x44\xfc\x00\x23\x43\xc6\x78\x8b\x9e\x3d\xb3\x5a\xd0\x2c\xa9\x87\x26\x05\xaf\xd4\xf4\xbf\x49\x8b\x37\x81\xdb\xcd\x4d\x3e\x3b\x0b\xf5\xbe\x88\xb0\x54\xfe\x6b\x32\x8b\xd7\x6e\x91\x68\x06\xce\x28\xd8\x3e\xc9\xfa\x3e\xd2\x32\xd8\xb7\x20\x14\xaf\xa0\x77\x68\x4f\x3c\x36\x35\x7e\xb0\xa2\xff\xf0\xfc\x10\xac\x6d\x9e\x53\xbb\xb4\x46\xa5\x4d\xfd\x58\x56\x16\x12\xcc\x59\x8d\x28\x6c\x1c\xb3\xa1\x3e\x05\x15\x4a\xbc\xeb\xd8\xab\x42\x6d\x2a\xa0\xbc\x99\xbe\xd5\x77\xf5\xb5\xb1\xd6\x54\x47\x7b\xbc\xb0\xb5\x49\x37\xc3\x01\x2a\xb3\x91\x4a\xf8\x41\x61\x4b\xa0\xdb\x99\xf3\xc0\x9d\x91\x25\x53\xb3\x3d\x1b\x77\x54\xa7\x5f\x41\x27\x45\xf6\x7d\xe2\x7e\xc2\x2a\x1d\x01\xb8\xa1\xa1\x4b\x60\x0e\xee\x2b\x38\x03\x67\x4d\xa5\xfa\x5b\x65\x3b\x73\x4e\x0e\x66\x5a\x87\xb3\x05\x92\xfd\xf8\x6c\x15\xb3\x41\x86\x05\x12\x35\x4f\x9f\xd2\xa4\xa9\x1e\x98\x16\x0f\x72\x57\x10\x51\x73\xbe\xcc\xa1\x6c\x20\x0f\x31\x48\xc2\xab\x38\x1f\x11\x1d\x8a\x15\xf4\xd6\x83\x81\x80\x25\xde\xa8\x9f\xd3\xc2\xfd\x33\xdc\xaa\x20\xa7\x89\x53\x14\x8f\x55\x6a\x06\xc5\xc7\xf7\x99\x21\x39\x6e\xa4\xd2\x2b\xcc\x33\xb6\x97\x3b\xfd\x03\x05\x9f\xd2\x5a\xb9\x17\x7c\x2d\xca\x67\x78\x93\x7b\xee\xa6\x64\x08\xe0\x63\x56\x3c\xd8\xa1\x52\x4b\x30\x62\x6a\xb3\xae\x71\xe8\x38\x64\xff\x6c\x80\xd9\xd4\xf7\x24\x2b\xc5\x20\xf5\x3d\xa5\x7c\x57\x50\x0a\x0f\x5b\x51\x5d\xaa\x8d\x29\x60\x81\xd3\x2b\x02\x52\xcf\x4d\x65\xfb\x15\x7f\x2a\xdd\x98\x54\xc6\x1f\xe3\x2c\xfb\xbc\xc4\x7b\xc4\x5b\x14\xc4\x87\x72\x96\xf7\x3e\xc6\xda\xe6\x46\xc4\x3d\x99\xfa\xb3\x6f\x3c\x95\xec\x47\xf6\x40\xc1\x4a\x47\x5c\x4f\x56\xb7\xa9\x8a\x5e\x78\x18\x69\x67\x71\x77\x07\x29\xfe\x87\x2a\xad\x33\xf7\xbd\x0a\x53\x1c\x5b\x63\xc8\x17\x70\x16\xda\x03\xcb\x69\x09\x31\x53\x92\x12\xf6\xa5\x57\x72\x9e\x82\xa6\x8f\x0a\x7a\xaa\x61\x26\xd7\x8f\x06\xe2\xaa\x65\xe2\x67\x99\x98\x59\x2d\x4b\x6c\xa8\x47\xa8\x3d\x89\x8f\xb2\x8f\xc8\x3a\xb5\x8b\x90\xa0\x20\x2a\x6b\x0e\x38\x55\xb0\x1a\x83\x86\x45\xa9\x2f\xa6\x6f\x7e\x50\xf6\xe0\xb9\xd4\xb6\x36\x7b\xfb\x5e\x9f\x9e\x0f\x04\xba\x2e\xee\x6f\x60\xe3\x7f\x3d\x40\xfe\x26\x9a\x20\x52\x68\x07\x3c\xa2\x07\x28\x44\x73\x3f\x7a\xc0\x74\x64\xb9\xef\x0f\x6d\xfa\xf3\x1f\xd9\x3d\x38\x44\xef\x83\x62\x76\x5b\x62\xb9\x09\xe4\x40\x71\xbb\xfc\xc1\xf2\x87\xb0\x53\x53\x36\x15\x4e\x74\x58\x83\x3c\xd1\x79\xa2\xc1\x02\x32\x7c\xd2\x76\xe8\xa2\x01\x97\x83\x47\x64\xc8\x87\xf8\xdd\x21\xda\x40\x88\x71\x4a\x2c\xe5\x4c\x80\x5e\x56\x07\x6d\xcb\x9d\x71\x2f\x01\xd9\x5a\x94\x44\xb7\xe8\x8d\x85\xe6\x41\x89\x9e\x9f\x3a\x6e\xe7\xa2\xd1\x72\x1e\x21\x4f\x0b\xdc\xe1\xe8\xdc\x96\x88\x95\x04\xc7\x38\x50\x8d\xae\x72\xb3\x83\x93\x13\x1d\x18\x40\x26\xc0\xa1\x61\x43\xe2\xaa\x32\x5b\xa8\x5c\x25\x19\x5b\xef\x96\xd1\xf1\xf3\x83\xae\xcc\xbe\xa1\x42\x07\xb7\x80\xdc\x8f\x39\xe4\x9f\x0e\xd1\x8e\x84\xb5\xca\xe0\x0c\xbb\xbd\x19\x0a\x6f\x52\x80\xb5\xc3\xb7\x53\x9f\xec\x99\x2e\xfc\x8b\xf1\x59\x5d\xac\x0b\x47\xf8\x0f\x88\x8a\x12\xba\xb2\x4d\xf3\x98\xc6\xef\x83\x2f\x08\x52\x69\xf9\x41\x11\xf9\x68\x8b\xf3\x02\xc2\xe1\x18\x14\x63\xa4\x0c\xa1\x4c\xe0\x31\x22\x05\x37\xd4\xb0\x4f\x32\xe0\x25\xc3\x79\x13\x7c\x95\xac\xd6\xeb\xdc\xa4\x95\xe8\x63\x7c\x15\x7b\x67\xde\xa9\x84\x59\x49\xb3\xea\x07\xab\xa0\xdd\x14\xd5\xc5\xec\x2c\x5d\x07\x8c\xe4\xf9\x10\x4d\xad\xbd\x1b\xf9\x23\xc0\x6d\x78\xa2\x07\xae\x47\x69\x0c\xa8\x92\x17\xd0\x1f\x85\xd5\x42\xee\xa1\x20\x4c\x33\x9a\x5e\x4a\xf2\xa8\x4f\xc0\xcc\x73\x7b\x0f\xd4\x53\x11\x71\x8d\xbb\xf0\x66\x76\x39\xf9\x34\xb9\x40\x32\x1e\xf5\xaa\x25\xf3\x17\x8c\x1d\x9e\x61\x24\x8a\x42\xa6\x48\x5f\xec\x23\xe5\xd8\x23\x95\xaf\x90\x05\x12\xb6\x91\xc7\x32\x07\x90\x60\x7a\x20\x8b\x94\xc0\x34\x7d\x12\x32\xd4\x39\x8a\xcd\xdb\x7e\x33\x01\xd3\x04\x5e\xef\x22\xd1\x2b\x93\x97\xcf\x09\x5a\x1e\xbe\xf5\xcc\x1d\xe3\xae\x51\x25\x36\x9e\x90\xbe\xfa\x04\xbe\x44\x44\x4b\x7c\x1d\x77\xab\x9a\xa5\x8e\xb4\x61\x20\x2e\xda\xd2\x7d\xf0\x62\x78\x42\x3a\xf9\xbd\xaf\x78\x72\x27\x65\xea\x56\x13\x5e\x4b\xbd\xc6\x75\x2f\xf2\xc9\x1e\x7e\x0a\x36\x41\xc2\x0d\xf0\x86\x3f\xa3\xcb\x23\x14\x98\xcf\x87\xf1\x21\xbb\x51\x59\x01\xdf\x8f\x03\x96\xa7\xc5\x43\x93\x3e\x98\xa1\x3e\xbd\x02\x32\x7b\x28\x2b\x4e\xfc\xf5\x24\x2b\x10\x31\xdb\xc6\x89\x49\x8e\xe4\xbb\x71\xd1\x27\xf2\xe5\x27\x43\x62\x18\xcf\x05\xfc\x23\xdd\x6c\x08\xbb\x9e\x5a\x7d\x72\x28\x9b\x13\xb7\x93\xaf\xeb\xec\x09\xcf\x79\xc1\x9e\xf0\x7d\xb3\x1d\x2c\x42\xac\xf4\x7b\x0a\x4c\xc9\x61\xce\x7e\xc0\x2d\x13\x4c\x2b\xd4\x5a\x85\x4d\x16\x20\x4a\x38\x4f\x52\x04\x1d\x54\x4d\x51\xb4\x88\xca\x14\xed\xb1\x41\x3f\x2f\xa4\xfc\xe2\x10\x57\x44\x47\xcc\xb6\x36\x2a\xe7\x42\x94\x1c\x44\x10\xc1\x1a\x90\x05\x89\xfa\xe8\x2c\xd3\xa7\x32\xa8\x02\x45\x8f\x4f\x40\x6e\x66\x4c\xa1\x60\x2f\x5a\x1d\xfa\x5a\x3c\x18\xea\x2f\x64\xa8\xf8\x19\x56\x35\xce\x64\x76\xcf\x82\x42\xb5\xe7\x96\xfc\x00\xd4\x4a\x62\x85\x22\xeb\x0b\x7e\xb7\x83\xe9\x1f\x02\x6e\x8d\x37\x47\x54\x6a\x23\xf3\x38\xab\x3b\xc0\xed\x18\xa6\x0a\x86\x6b\x59\xd8\x7d\xb6\x6e\xca\xc6\x92\x96\xb6\x20\x97\xcb\x0f\x8a\xb3\x3c\x65\x21\xa8\x95\xd1\x2d\xe1\xab\x3a\x7c\xc9\xfc\x11\x5d\x14\xfe\xe1\x83\x6a\x97\x0d\x40\x8e\xb0\x83\xef\x8f\x53\x10\x36\xc2\xf7\xa7\x2b\x6b\x18\x7a\x01\x89\x6b\x7a\x34\x5c\x03\xa6\x60\xf0\xed\x84\x41\xd8\x66\x88\x89\x78\xa5\xbd\xd2\x78\x0a\xa1\xd8\x1e\x1d\x1f\x3f\x4a\xe8\xab\x80\x09\xea\xf3\xb7\xfb\xc7\x83\x85\xea\x4c\x9a\xd5\x9c\x7d\xad\x02\xe0\x2b\x61\xa1\x72\x45\x85\x5e\x60\xf1\x95\x7b\xda\x5c\xdc\x37\x7b\x53\x47\xd8\x52\x59\xe1\x69\xb8\xb5\x37\x7d\xa1\x16\xc7\xcf\x1b\xb2\xd3\x30\xa0\x09\xdf\x54\xf5\x4f\x97\x36\xa2\x1e\xb7\x34\x55\x3f\x36\x70\xd0\x11\xb8\xf9\xe8\xea\x60\xae\xd4\xee\x2c\x45\xb4\x5d\x84\x83\xa5\x9d\xbd\x2f\xa6\x18\xd4\xe3\x89\x32\xa3\x3b\x2b\x01\x70\xbd\x33\x06\xa6\x08\x21\x91\xad\x2c\x3a\x45\xe5\xb4\x7b\x76\x00\x7a\x10\xc9\x58\x36\xfa\xbd\xb8\x69\x58\x0a\xd0\xcb\xb8\xcf\x84\xa2\x53\x8f\x8f\x0e\xc8\x11\xa4\x44\x5f\x75\xde\x0f\xb3\xd1\x7d\xb4\xff\x0e\xd1\x47\x20\xbe\x0a\x6b\x89\xdc\x51\x10\xe7\x2e\x73\xd0\x48\x06\xf3\xa9\x12\xe1\x7c\xe4\x5a\x8d\xf2\x08\x7d\x03\xe9\xee\xa1\xba\x88\x84\xc4\x79\x83\x91\xe3\x8c\x00\x7c\x43\xea\xbe\x9a\x67\x2e\x4a\x61\xc4\xd8\x85\x63\xa1\x5f\xa1\x45\xbc\x1e\xe8\x49\x2b\x55\xbc\xf7\x7c\x21\xd5\xce\x59\x82\x50\x23\x88\x91\x13\xb0\xe5\x01\xe4\x92\x32\x89\xf3\xf3\xa3\x29\xdc\xe6\x99\xa8\x43\xdc\x6d\x6e\x9f\x82\x1f\x6d\x9d\x56\xce\xec\xe0\x1d\xd6\xab\x99\x8a\x07\x81\x3d\x47\x87\xdf\xae\xb4\xb5\x2a\xab\x4d\x56\xa4\x15\x00\x58\x28\x6d\x90\xa1\x80\x0b\x69\x3d\xc1\x6e\x55\x14\x65\x53\xac\x89\x95\x44\xc4\xc7\xe5\x3e\xa6\x7a\xf7\x31\x36\xa4\x5e\xf0\x4c\x4e\x9d\xd9\x99\x83\x12\x12\x5a\x53\x7e\x4a\x05\x0a\x01\xbe\x78\xe0\x03\x08\x94\x25\x70\x2b\x58\x18\xdd\x26\xb2\x92\x7d\xbd\x75\x34\xf9\xe9\x38\x34\x79\xce\xe7\x90\x7b\x14\x6b\x01\x3c\x65\xe6\xb9\xcd\x9a\xef\x87\xf1\xd4\xe7\x78\xde\x73\xa6\xb8\x45\xc6\x96\x45\xe3\x86\x29\x78\x4e\x46\xf9\x81\x86\x3e\x26\x05\x86\xb8\x77\x13\xdc\x87\x8e\x1f\xb1\xfe\x70\x0f\x10\x0d\x7c\x5a\xeb\x41\xc3\x01\x98\xe7\xb6\x55\x5e\x14\x69\x39\x05\x61\x58\x20\x8f\xf1\x13\x1e\x78\xc7\x88\x03\x3f\x03\x32\x45\xcb\x9c\x3d\x2c\x67\x8f\x77\x90\x11\x73\x6c\x9d\xd1\x8e\x07\x25\x3d\x92\x47\x0c\xa8\xb4\x36\x06\x45\xc2\x83\xc1\x00\xc9\x3c\xa6\x71\x42\xf1\x31\x9c\xa9\x3b\x6b\xf2\x27\xe7\x12\xd5\x28\xa3\x20\xe4\xa9\x51\xd7\x81\x13\xfa\x49\x87\xab\x1b\x51\xe9\xbe\xf9\xb0\x4e\x5a\x3b\x0b\x84\x1c\x52\xab\xe2\x57\x0f\xf5\xc7\xa6\x3e\x76\x3d\xd6\x43\xf8\xa7\xa6\x36\x54\x83\x63\x0f\xb2\x34\x94\x7d\xf9\x40\xa8\xfb\x19\x27\x68\xdb\x21\xff\x4c\x95\x45\x4f\x52\x49\xe8\x73\x13\x91\xb3\xe7\x50\x0f\x9c\xf8\x41\xe8\x02\x0b\x4c\x3d\x6a\x1e\x93\x68\xf0\x1a\x36\x0e\x9b\x00\xcc\x06\xe4\x16\x54\xe8\xc1\x67\x55\xe6\x21\xad\x36\x58\x70\xb4\x05\xac\xf3\xb3\x3b\x60\x15\x84\xa6\x96\x8f\x8d\x4d\x44\x44\xbe\x26\xfa\xa1\xa2\xee\x40\xe9\xdd\x61\x02\xfc\x86\x21\xfa\x06\x06\xa6\xc5\xc3\x5c\x60\xa8\xd0\x23\x23\x10\x08\x36\x16\x3d\xf2\x43\xd9\x7c\xd0\x55\xea\x3e\x2e\x91\xaf\x42\x9f\x84\x79\x77\x55\x2d\x89\xca\xb8\xb0\xa0\xaf\xb3\x85\xd7\x53\x22\x31\x09\x92\xe6\xd3\xf4\x83\x51\x53\xf1\xa8\x0d\x81\x06\x23\x90\x70\xed\xa0\xf0\xe2\xe1\xc1\xf5\x92\x07\xe8\x15\xc2\xb3\x04\x99\x93\xbe\xa5\x0c\x9a\x0e\x91\xf9\xcc\xde\xd0\x0b\x93\x66\x00\xd0\x46\xfd\x54\xe6\xcd\x0e\x0f\x55\x6d\xeb\xb2\x4a\x1f\x80\xcc\x31\xfa\x3e\x12\x29\xf1\xdb\x0f\x32\x37\xd5\x9e\x45\xbb\x65\x60\x44\xf5\x0f\xe2\xe4\x7a\xf3\xb2\x89\xdd\xfe\x80\x76\xdb\xdd\xf1\x14\xd1\x41\xaa\xd7\x83\xb6\xa0\x11\x84\x37\x7d\x9a\x37\xc8\x1b\xf5\x1a\x3e\xd6\x59\x3e\xc5\x46\xbf\x46\xfb\x47\x1d\x31\x7f\x36\x44\x6c\x87\x2b\xca\x73\x91\xa0\xe5\x33\xa2\x84\xf4\x01\x18\xd6\xd8\x5a\x05\xac\x90\x01\x8b\xbc\xc2\x58\xee\x06\x49\x3c\xd6\x8f\x59\x61\xce\xdc\xf1\x8c\x5c\x73\xc1\x69\x48\x68\xa5\x73\x2c\xe5\x05\xf7\xff\xf8\x27\xe0\x90\xe2\x70\xa9\x97\x35\x65\xe0\x6c\x41\x1b\xea\x83\x2e\xab\x04\xec\xa8\xee\xd7\xa4\x7e\xf5\x80\x69\x9c\x10\x35\xec\x31\x0e\x0d\x94\xb8\xca\x9e\x8c\x42\xd0\xac\x47\xc9\x27\x64\x34\x93\xed\x53\x94\x82\xd4\x8b\x0c\x66\xcc\x1e\xb1\x05\x1f\x14\x21\xb3\xe2\x41\x51\x47\xc9\x59\x99\x20\x7f\x3e\xf6\x73\xa7\x67\x65\x69\x47\x34\x08\x4a\xf6\x39\x55\x90\xff\x67\xfb\xfa\x7b\xf5\x7b\xba\x7d\xbd\x3e\x36\x73\x64\x55\x87\xf0\x21\x37\x02\x07\xef\xf5\x1d\x45\xa4\x38\x9e\x67\x51\x68\xfc\x14\x42\x58\x20\xaa\x43\x35\x70\xf0\x4f\x48\x77\xa2\x8f\xbe\x85\xb0\x5c\x11\xc4\x08\x54\x27\xe4\xc0\xbe\x7c\xd4\x24\x69\x20\xbd\xb4\x0e\x15\xac\x43\x04\x7e\x92\xa5\x42\x93\xc9\xab\xac\xe2\xaf\x8b\x66\xc5\x5b\xfc\x0a\x3b\x99\x8c\x8f\x8e\x68\x13\xed\x0d\x41\xc9\x35\x2e\x0c\xf4\xc7\x9f\xbb\x28\x94\x08\xaa\x38\x38\x04\x25\x82\xa8\x65\x17\x41\x5b\x28\x14\xe6\x27\x97\x7c\x39\xb1\x9f\xe4\xb9\x6a\xa3\x41\x38\x71\xca\xca\xbf\x59\xf0\x22\x12\xbd\xcf\x1b\xe4\x4c\x11\x2c\xef\x30\x2b\xb6\xe9\xda\xa8\x8d\xa7\x46\x42\x7f\x87\xae\xc7\xbd\xb4\xca\xf6\x98\x8a\xdd\xc8\x33\xc8\x35\x2e\xcb\x03\x76\x29\x2b\x6c\x9d\xe6\x79\x2a\x2b\x46\xc3\x17\x09\x60\x4d\x7a\x04\x4d\xd4\xfe\x1c\xb1\x26\x14\xe4\xc8\x22\x39\xe4\xe2\x00\xb9\x35\x1f\x65\xf1\x06\xa9\x5c\x4a\xa7\xce\x67\xce\x88\x27\x18\x9e\x5c\x56\x6a\x85\x4e\x82\x1b\xa5\x41\x98\xf6\xbb\xf4\xaf\x70\x6c\xee\xf6\x65\x01\xe6\xe5\x29\x7e\xa0\x6b\xf1\x57\x53\x15\x86\x04\x42\xac\xdb\x8b\x07\x5c\x20\x47\xc4\xf1\x6e\xc6\x1f\x6c\x6d\x76\x18\xdf\x61\x84\xb2\x18\xd0\xaa\x29\x02\xdd\x04\xe1\xb5\xe8\x55\x64\x6e\xab\x80\x2c\xb2\xed\xce\x03\xde\xeb\xf6\x81\x2f\x9e\xee\xac\x24\x31\xf7\x59\x91\x6b\x75\x10\x60\x24\xa8\x3a\x43\xe2\xe0\xfd\x81\xeb\xd8\x31\x93\x0b\x93\x01\xa2\xc3\x64\x97\xfa\xbb\x9c\xbd\xfd\x94\xe6\x60\xd2\xf2\x03\x3c\x03\x82\x8a\x26\x1f\x1b\xcc\x60\x4f\xc2\xc3\x90\x09\x1a\x6c\xca\x3e\xcb\x30\x3a\x7a\x00\xfc\x4f\xca\xa0\xb1\x3f\x1a\xc2\x8b\xbb\xbd\xc9\x73\x81\xc0\x10\x0f\x09\xb1\x1a\xd4\xb9\x0a\x9d\x81\x35\x88\x7c\xea\xe3\x83\xf6\x07\xaa\x33\x3a\x24\x42\xdc\x37\x69\x55\x17\x4a\x6b\x00\xa7\xa9\x4a\xad\x60\xc3\xf4\x87\x75\xbb\x8a\x06\x28\x35\xdd\x4a\xab\x6b\xb3\xdb\x4b\x34\xa0\x4f\xb1\xd1\xdb\x95\x90\x16\x3e\xfe\xf2\xcc\xea\xa7\x32\xdb\x30\x3d\x7b\x0e\xa9\xa1\x12\x38\xc4\x60\xc6\x7b\x20\xb2\x92\xa9\xc3\xbe\x56\xf9\x35\xc8\x9d\x8b\xd5\x7e\x4f\x26\x6c\xa9\x18\x2e\x82\x7a\x2b\xce\x51\xc3\xd0\xba\x7d\xb7\xfb\xc8\x90\xc5\xe2\xa4\x7f\x26\x79\x4d\xb9\x61\x1b\x25\x90\x8d\x18\xf6\xa7\x06\x20\x37\xbd\xdb\x86\xb7\x4d\x9e\x0b\x05\x08\xa8\x22\x82\x71\xe3\x09\x10\x29\x78\xa2\xc6\x58\xec\x3e\xd8\xac\x58\x9b\x80\x40\x70\xf7\x20\x4e\xc1\x99\xf7\xe1\xdb\x9d\x41\x0b\x73\x3b\xb7\x86\x45\x67\xc1\x43\x8f\x52\xa1\x14\x4a\xeb\x8c\x8a\x4c\x09\x20\x5d\x5d\x2c\x32\xcd\x29\x76\x16\x9c\xa2\xb2\xc2\xc7\x6c\x95\x51\x85\x6c\x9e\x3e\x33\x9c\x81\x5d\xbc\xee\xd7\xc0\x63\x58\xf6\x6b\xc5\x91\x3d\x10\x3a\xaa\x8e\xea\x7a\xa8\x53\x8a\x06\x1d\x37\xb9\x31\x55\xce\xc5\x9d\x68\xf8\xe0\xeb\x41\x76\xa3\xe5\x92\x01\x72\xa3\xd4\xb6\x0c\x04\x2c\xc7\x10\xe7\xc7\xf2\x63\xd8\x62\xdf\x7c\xd5\x8a\x5d\x09\xe7\x04\x2d\x6c\x2c\x91\x81\xb4\x05\xd0\x5e\xe1\x79\xff\x92\x91\xfe\xf2\xf7\xaa\x08\x0c\xd0\x5a\x39\x9e\x97\x37\xf5\x69\x72\xbf\x8f\xf9\x3c\x2c\x13\x14\xaa\x9e\x04\xb9\x8e\x93\xe3\x9e\xdc\x3b\x62\x45\x39\x4a\x05\x25\x77\xa5\x6c\x07\xd5\x99\x90\xd4\x25\xe5\x85\x08\x0b\x52\x16\x2d\x58\xc3\x0f\x5a\x68\xb3\xa8\xba\x5b\x1c\x8e\xe2\xc8\xed\x35\x14\xcb\xc9\xa0\xb8\x02\xd1\xed\xd3\xca\x53\xed\x72\xa6\x76\x04\x7e\xa8\xd4\xcf\x43\x3d\xd9\xd2\x51\xee\x6b\xef\xd6\x46\x96\x31\xfc\xb5\xd9\x3c\xec\x48\x40\x19\x78\xff\xbd\x4b\x49\x39\xdb\xb8\xa2\xb5\x42\xf3\x45\x84\xeb\x53\x5b\x16\xfa\xb4\xc5\x05\xc8\xf7\x5a\xdb\x18\x3b\x48\xe4\x04\x04\x3b\x17\x7a\x11\xfc\x5c\x37\x71\x4e\x19\x34\xb2\x3a\x50\xab\x80\x0b\x3d\x09\x32\xaf\x51\x25\xdc\x20\x20\xa9\xab\x74\x93\xa1\xc0\x86\x3a\xc6\xda\x66\xf1\xb4\x3c\x70\xa0\xc6\xfc\xb6\x6e\x2c\x4e\x58\x3f\x89\xa2\x7b\x55\xbc\xc0\x27\x5b\xc6\x0b\x41\xe0\x49\xc4\xd0\x4b\xb2\xb5\xb1\x1a\xf8\xa0\x6d\xb6\x6b\xf2\x3a\x2d\x0c\xa6\x66\x20\xc2\x70\x84\x9e\x5e\x26\x49\x04\xae\xcd\x54\x35\x86\xbc\xc5\x6d\x2c\x52\x61\x55\x3c\x86\x07\x31\x2b\x8f\xac\x3b\xca\x9a\xeb\x36\x98\x27\x55\x2d\xe1\x65\xd4\xc2\x02\x68\x19\x00\x28\x63\x85\x79\xb1\xae\xbb\xc4\xfd\x6e\x1a\x62\x74\xba\x04\xf4\x4a\x28\x3e\xa7\x8c\x86\xa7\x46\x83\x92\x95\x40\x94\x46\xe4\xaf\x87\xb2\xf1\x51\x36\xa3\xc0\x7d\x20\x64\xa4\x9b\x0a\xf9\xc6\xf7\xee\xaa\x04\xad\x23\x8a\x1d\xc9\xb3\x0d\x2e\x5b\x19\x2c\x7c\xdf\x56\xee\xa0\xe2\x08\x0e\x52\x35\xbe\xd0\xfc\x61\x90\x81\x09\x39\x96\x28\x86\x94\x59\xe4\x8e\xf8\x96\x0e\x4c\x71\x50\xa2\x8c\x1b\x68\x41\x77\x16\xb6\x6b\xb4\x99\x57\x69\x1e\xf6\x6e\x23\x1f\x2f\x85\x31\x31\x8c\xc8\x92\xf6\x7c\x91\xc8\x0c\xf4\x5e\xef\x9c\x2a\x14\x8b\x17\xaf\xb5\xee\xdb\xa2\x28\x99\xaf\x2d\xef\x86\xc9\xb2\x02\x90\xfb\x04\x4a\xeb\x29\xd2\xb6\x71\x31\x76\xd0\xfc\x16\xc2\x84\xe4\x76\x18\x5b\x0b\xb9\x9b\x6d\x4b\x1a\xcf\x7e\x50\xd1\xcb\x99\xe6\x1f\xe4\xc7\x45\x0b\x39\xa5\x46\x67\xa7\xfb\xe8\x87\x4a\xc8\xe5\xb8\xa9\x19\x50\xa9\xd1\x10\xa3\x91\x9f\x68\x1f\x12\xcd\xdc\xd4\x77\xfb\x08\x1e\xed\xc4\x3b\xc4\xb3\x9f\x44\x26\x5c\x87\xdd\xc0\x07\x9b\x72\x9f\x4b\x3c\x0b\x14\x72\x94\x0d\xaa\xca\x06\x81\x7b\x72\xb3\x81\xcc\xaf\x82\x7c\x9f\xd0\x58\x55\xd2\xc1\xa9\x3d\xd3\x71\x5a\xb3\x0b\x82\xe5\x5b\x28\xa3\x55\x02\x67\x1e\x8a\x3d\xd4\x51\x2d\x06\x45\xbf\x15\xde\xf4\x81\xc2\x9e\xcd\xde\xa7\x56\x01\x7d\xf4\xe3\xa6\x2c\xb0\xff\x37\x66\x0d\xa9\xfb\xad\x86\xb3\x51\xdb\x47\xa4\x28\xce\x28\xf5\x50\xaa\x68\x07\xa3\xde\xe3\xf6\x85\xad\x88\x1a\x89\xf9\x14\x0f\x4c\xa0\x4d\x10\xb7\x6f\xa4\xba\xa1\x82\x0c\x62\x92\x3f\x32\xab\x89\xb8\xab\x84\xb7\xe4\x07\x42\x07\x3d\x93\x4f\x48\x64\xac\x4c\xd3\x97\xaa\xd6\x51\x45\x45\x22\x75\x37\x39\xa2\xfe\x30\xe4\x1c\x57\x3b\x12\xf1\x23\x01\x44\xdb\xda\x9c\x56\xa0\x14\x80\xab\x10\x01\x6e\x0a\x9c\xa0\xca\x6d\x58\xe4\x89\xae\x0e\x92\x5a\x66\x75\x88\x14\x37\xbc\x4b\x8e\xdb\x73\xb0\x42\x82\xcc\x3b\xc1\x75\xdc\x8e\x08\x6e\x56\x2c\xfe\xda\x73\x16\x40\x96\x79\xb3\xc1\x10\x03\x96\x15\xeb\x07\xe3\x2e\xdf\x3f\x3a\x43\x28\x0e\xb6\x08\xc6\x48\x59\x78\x52\x5a\xf2\xe7\x2a\x28\x70\x66\x9c\x5b\x74\x6b\x66\x55\xc0\xc9\x63\xc0\x06\xd9\x21\x80\x0b\x3b\x74\x04\x6e\x1b\x8d\x65\x15\x71\x14\x83\xc0\x95\x9c\xe2\xb1\x2a\xf2\xf0\x59\xb1\x2e\xab\x7d\x59\xa5\x4c\x75\x26\x5a\x98\x5a\x37\x23\x39\x40\x48\xc9\xc0\x55\xb9\xe9\xc9\x77\xa9\x3f\x22\xda\xe4\x28\x5a\x5b\x56\xb2\x82\xf4\x08\xd6\xdf\xbb\xf1\x8e\x14\x4a\xc8\xda\x3a\x02\xdb\xf6\xba\x24\xda\xeb\x92\x2c\x9a\x75\x4b\xe4\x84\x6b\x50\x6d\xb6\xcb\xf2\x14\x92\xbe\x76\x9f\x55\x99\xe7\xd1\xe3\xfa\xed\xa8\xfe\xd5\x35\xb0\x53\x03\xeb\xb6\x6a\x84\xf4\x80\x42\x88\xc7\x1c\x62\x46\x62\x6d\x2a\x00\x0d\x82\x3d\xcd\x95\xad\x99\xfd\x5e\x9d\x90\x49\x3c\xc7\x99\xd0\xcf\x59\x0c\xf1\xa5\xed\xee\xa6\x1d\x52\xc0\xd5\xe8\x80\x3d\x81\x72\x7b\xc9\xe6\x74\x82\x59\x60\x0f\x1a\xf7\x38\x08\xc9\xc6\x7d\x8c\x3f\x8a\x96\x14\xa7\xf2\xe8\x91\x0a\xf5\xad\x3b\xaf\x12\x35\xbf\x04\x82\x3b\x36\x19\xf8\xd3\xbd\xb7\xe7\x33\x0f\xd8\x07\x07\xfd\xad\x1e\x10\xf5\x89\x8f\x25\x54\x13\x14\x07\x7f\x0b\x50\x3c\x7c\x7f\x63\x94\x3a\x7f\xe5\xed\x45\x06\x6d\x8a\x65\x11\x91\x36\x09\x7d\xd7\xba\xa4\x4d\x37\x02\xae\x2b\x4c\xb3\x45\x2b\xb7\x65\x46\xe3\x2c\x83\x1c\xae\x5b\x5b\x26\x3e\x14\x18\x68\xbe\x2d\x2b\x15\x9c\x66\xb4\x06\xfd\xce\xef\x8f\x48\xb9\xbb\x7d\xe3\x43\x13\x15\xbd\xed\xd8\x65\x1f\xa0\xc6\xa1\xdc\x19\xb7\xbc\x2c\x9e\x01\x3e\x8e\x68\x3d\x3a\x78\xa8\x66\x4d\x05\xe7\x96\xc5\xe2\x43\x92\xc8\x69\x20\x68\x43\x4d\xa9\x9f\x4b\xfd\x50\xa6\x39\xd1\x13\x01\xdd\x3d\xcf\x38\x44\x17\xd7\x69\xdd\x00\xde\xd1\x19\xa3\xc1\xdb\x87\x1b\xb8\xf6\x25\x2e\x29\x41\x1b\x63\x57\x7a\x13\xc3\x6b\x02\x40\x5d\x7a\x63\x51\x23\x8b\x6f\xa1\xf2\xf7\xfc\x30\x04\x8e\xc0\x48\x4a\xf5\xfc\x7c\xa8\x3f\x8e\x41\x7c\xb1\xad\x92\x4a\x35\x53\x97\xfa\xd3\x7c\x0c\xa2\x86\x17\x57\xa3\xf9\xe7\x31\xa8\xa9\xce\xc7\xee\x0a\xf1\x24\xfd\x69\x36\x57\xe2\x01\x89\x5e\xce\x48\x15\x71\x39\x9e\x2e\xf5\xed\x78\x7e\x33\x59\x2e\xc7\x97\xfa\xe3\xbd\x1e\xdd\xde\x5e\x4f\x2e\x46\x1f\xaf\xc7\xfa\x7a\xf4\x65\xa8\x49\xf4\xf2\xcb\xd5\x78\x1a\x84\x19\xd5\x62\x39\x5a\x82\x8c\xaa\xfe\x32\x9f\x2c\x27\xd3\xcf\xf0\xbc\x8b\xd9\xed\x3d\x28\x2b\xea\xab\xd9\xf5\xe5\x78\x0e\xe8\xd7\x1f\x59\xd1\x11\xb5\x4f\xc7\x5e\xe2\x55\x7e\x93\x62\x9d\xd7\x96\xc0\xeb\xfd\x4b\x82\xae\xe3\x4b\x1d\x24\x5d\x13\xa1\xe9\xaa\x3e\xde\x2d\xf5\x74\x46\xd2\x96\xe3\x4b\xbd\x9c\xa1\xce\x2c\xcb\xbf\x4a\x6d\xd7\x4f\x1d\xd1\xd6\xd1\xf4\x92\x55\x5b\xd5\x51\xd5\x56\xec\xc0\xe9\x72\x32\x1f\xeb\xf9\x64\xf1\x67\x3d\x5a\x70\xb7\xfe\xe5\x6e\xe4\x9f\x73\x3b\x9e\x7f\x9a\xcd\x6f\x46\xd3\x8b\xb1\x6a\x49\x53\x4e\x16\xf0\xb5\xfa\x7e\x76\x37\xd4\x8b\xab\xd9\xdd\xf5\x65\xf4\xbb\xeb\xa6\xb1\xbe\x1c\x7f\x1a\x5f\x2c\x27\xbf\x8c\x13\x77\xa1\x1e\x2d\x16\x77\x37\x63\x85\xbd\xbd\x00\x25\xcc\xd1\xf5\xb5\x9e\x8e\x2f\xc6\x8b\xc5\x68\x7e\xaf\x17\xe3\xf9\x2f\x93\x0b\x80\x17\xcf\xc7\xb7\xa3\xc9\x1c\xb5\x40\xe7\x73\xf7\x94\xd9\xd4\x6d\x27\xaf\x87\x6e\xe0\xa6\x33\xd0\xba\x5c\xea\xbb\xe9\xf5\x78\xb1\xd0\xf3\xf1\x5f\xee\x26\xf3\xbe\x49\xe0\x9e\x00\xaa\xa6\xae\x23\xc5\x98\xab\x2f\x93\xeb\x6b\x18\x9d\xf6\xc0\x83\xc8\xa7\xfb\x21\x0c\xfc\xbd\xfe\x72\x35\xd3\x37\xa3\x7b\x04\x39\xdf\xf3\xd4\x98\x8f\x3d\x0a\x7a\x2c\x27\xa9\xeb\xcf\x30\x31\x47\x1f\x67\xae\x07\x3e\x8e\x81\x4a\xe8\x7a\xec\x1a\xe2\xba\xc3\x0d\x0f\xc9\x70\x8a\x09\x00\x5a\xa1\x54\x65\x98\x68\xaf\x8f\x1a\x44\x53\x8f\xeb\xa3\xb2\xe0\x68\xac\x32\x0a\xd2\xc1\x53\x9e\x1f\xcb\x99\x6e\x2f\x49\xa1\x65\xda\x9d\x7b\xfa\x7a\xb6\x80\x89\x76\x39\x5a\x8e\x14\xb4\x78\x39\xd2\x1f\xc7\xee\xea\xf9\x78\x7a\x39\x9e\xc3\x52\x1a\x5d\x5c\xdc\xcd\x47\x4b\x90\x34\x75\x77\x8c\x17\x7a\x71\xb7\x58\x8e\x26\x53\x1c\x14\xf7\xbd\x20\x67\x3a\x99\x5f\xf2\x5a\x52\x30\x3d\x3f\x8d\x26\xd7\x77\xf3\x71\x5b\xfb\x74\x39\xd3\xb3\xdb\x31\x3c\x12\x26\x9a\x18\x10\xbc\x62\x31\x08\x7a\xa7\x8b\xbb\x8b\x2b\x85\xa3\xa7\xa3\x15\x7b\xaf\xaf\x46\x0b\xfd\x71\x3c\x9e\xfe\x1e\x4d\x54\x35\x9e\xe2\x75\x3d\x20\x78\xa5\xae\x10\xa2\x34\x02\x37\x13\x43\xa6\x4b\x38\xe1\xeb\x52\xdf\xbb\x7d\x75\x6a\x9e\xf9\x28\xb3\xe0\x4b\x03\x76\x05\x35\x3e\x88\x4d\x74\x2f\xb1\x39\xa2\xca\x8b\xec\x7d\x3a\x0f\x1f\x50\x07\xa0\x26\x26\xa1\xdc\x00\xbd\x4b\xc4\x14\x4b\x8e\xb4\xbb\xe8\x39\x45\x61\xfc\xf5\xa3\x73\x1d\x3c\xb7\x08\xfb\x1a\x59\x1d\x6f\xf8\x94\x33\xf7\x05\x2c\xeb\xb4\x88\xc3\x95\xa2\x12\xd2\x27\x76\x39\x20\x88\x75\x61\x1c\x60\xad\xeb\x94\xf2\x46\xc1\xf0\xf1\x70\xd8\x52\xe6\x3a\x87\x1a\xdd\x6f\x9b\x6e\x5d\x93\x5d\x73\xe1\x66\x85\x25\x47\x78\x2d\x40\xe8\x20\x4f\x94\x02\xf3\x38\xe4\x49\xb6\x19\xea\x9b\x42\xa5\x24\x96\x64\x20\x24\x6f\x5d\x16\x4f\xe6\x40\x79\x27\xa0\xc4\xc4\x2c\x5e\x0c\xa9\x85\x47\xc1\x33\xec\x63\x50\x39\x17\x69\x78\xa3\x4f\xfc\x79\x7f\xa2\x73\x56\x19\x48\xd5\xbe\x04\xcf\x06\x10\x31\x5e\x5c\x03\x42\xfe\xcc\xfd\xea\x0e\xee\xa6\xd8\x0c\x95\xfa\x37\xd7\x91\x70\x2f\xa5\xf2\xe5\xb7\xff\x60\x81\x47\x88\x02\x5c\x3a\xdb\x98\x14\xa1\x3c\x81\x9f\x6c\xf8\xef\xed\x92\xe1\x7f\x3b\x1c\x0e\x87\x7f\xd7\xff\x06\x77\xba\xa3\x1c\xec\x98\x7f\x27\xdf\x52\xd4\xcf\x44\x63\xfb\xc1\xd7\xf3\x45\x23\x8a\x96\xac\x28\x8b\xca\x6a\xa1\x86\x22\xa0\x4d\x2f\x16\xd4\xa6\xf6\x1b\x06\xa0\x92\x06\x4f\xa8\x35\xc0\xf2\x68\x7e\xc1\xb5\x48\x5d\x9d\xc6\x48\xe2\x41\xb0\x7f\x59\xa0\x6f\xd8\xfd\x60\x19\x4c\x20\xf7\xe9\xb1\xdc\x1b\xcf\xf7\xc6\x56\x53\x63\xcd\xb6\xc9\xd1\x0f\xa1\x03\x5a\x09\x89\xf4\xfb\x0f\xbe\x32\x81\x32\x79\xa6\xcd\x7a\x08\x2e\x59\xfb\x9c\x2d\xab\xef\x38\x66\x17\xc6\x7c\xab\x37\xb1\x36\x1a\x4a\x53\x9d\x57\x64\x09\xa5\x2d\x67\x69\xc0\x31\x44\xd0\x8c\x97\x86\x48\x26\x15\x43\xb7\x7d\x70\x2e\x67\x51\xb6\x6d\xe3\x97\x6b\xd1\x13\x2d\x4a\xd1\xd5\xef\x2c\x45\xa7\x5a\x3b\x70\xe2\x25\x3c\xa3\x2c\x18\xe9\x09\x79\x7e\xac\x1d\x74\x93\x09\xa4\x10\xab\xb2\x20\x0e\x6c\x90\xc6\xd1\xbb\x34\xcb\x31\x2a\x19\xc1\x26\x22\x90\x67\xe2\x77\x39\x2a\xaf\x48\x5d\x1f\x56\x1e\x06\x9b\x67\x5f\x69\x4f\x7c\x7e\x34\x85\xca\x6a\xdc\x66\x2c\x56\x17\x44\x70\xd1\x5d\xb9\x31\xef\x95\xfa\x5c\x94\x3b\x2f\xea\x4c\xd3\xf7\xa7\x3f\x26\x3a\x5e\xa0\xa0\xa8\x17\xaf\x4e\x2d\xef\x5c\x97\x3b\x63\x15\x24\xeb\x47\x1f\x17\xb3\xeb\xbb\xe5\xf8\xfa\x5e\x1a\xb8\x1f\x58\x1d\x1f\xc9\x92\x0e\x7b\xa3\xff\x27\x54\x61\x3e\xff\x40\x25\x54\xed\xd5\x8d\x78\xcb\x03\x25\x47\x84\xd4\x56\x7b\xb1\x53\xf9\x10\xd5\x2b\x06\x4f\xe9\x83\x78\x8d\x5a\xff\x20\x1b\x40\xf5\x64\x8f\x87\xbd\xf3\xbf\x20\xdb\x14\xb0\xd0\xdc\x2e\x18\x1a\xfc\xc7\xfa\x07\x9e\xaa\x5c\x39\x1a\xa1\x91\x23\xf7\xee\x58\xc5\xd5\x6c\x0b\x29\x0e\xca\x4a\x84\xd7\x41\xe2\xd6\xeb\x0e\xa8\x75\x0a\x39\x74\x70\x9f\xc0\xe7\x17\x05\x3f\xbd\x2d\xa3\xfa\x1d\x8c\x99\xc3\xe2\x06\x21\xd8\xc6\x9a\xb3\x75\x9e\xad\xbf\x42\xfc\x76\x67\x8a\x46\x67\xb5\xd9\xd9\xb3\x33\xb7\x15\x83\x83\x6b\x9b\x0c\x53\xab\xbe\x52\x3d\x5e\x96\x80\x6d\x7b\x30\xb4\x6b\x91\xe6\x4c\xa5\x4f\xb9\x64\xdb\x23\x79\x59\x20\xc4\x54\x03\x8d\x65\xc8\x95\xb6\xce\xad\xce\x13\x95\x81\x9f\x0f\x38\x2a\xd0\x5f\x4d\xc5\x09\x24\x2a\x4f\x4e\x42\x81\x06\x1b\x0d\x6e\x15\x33\xd7\xf2\x50\x5f\x19\xac\xd3\x4f\xb5\x85\x7c\xc6\x07\x04\x2c\xc1\x2d\x40\x5c\xf7\xde\xb5\xfd\x50\x6e\x0e\x85\xe1\x25\x4d\x9c\xf1\xfc\x16\xdb\x12\xbf\x80\xd5\xe0\x0e\x68\xcf\xb5\x86\x4b\xee\x7f\x8a\x99\xfd\x83\x3a\x65\xa5\x93\xaf\x20\xbe\x6d\xa1\xc8\xbe\xd6\x8c\x3e\xb1\x03\x1f\xde\x5a\x1d\xf4\x9f\x80\x42\xef\x2a\x5d\x7f\x05\x6a\xb2\x7f\x43\xf4\x06\x70\x2b\x6e\xf5\xf2\xa0\x2f\xca\xb2\xf8\xf7\x44\x9f\xeb\xd1\xbe\xca\x72\xa0\xca\xe0\x3f\x27\xfa\xb6\x32\x36\xe3\x7a\xa6\x5f\xdc\x72\x96\xbc\x0a\xaa\xb5\xfb\xf9\x88\x07\x65\x6e\x42\xbc\xc1\xcd\x1a\x39\xaa\x18\x69\x10\x65\x9c\xac\xe8\x62\x39\x68\x51\xc9\xed\x26\xd5\xb6\x59\x55\x65\x53\x67\x70\xcc\xaf\x2a\xe0\xe9\xf4\xd1\x12\x02\x54\x43\x1d\x62\x59\x81\xb1\xb6\x6d\x20\xce\x45\x0d\xc9\xb3\xe2\x2b\x09\x08\x78\xea\x56\x11\xd9\xb6\x01\xd3\x43\x0f\xa7\x60\x4e\x66\x15\xec\x5b\x84\xac\xe4\x6a\xe4\x4d\x99\x78\x75\xbd\xef\x66\x65\x50\x9d\xf0\xe2\x3f\x9b\x55\xe5\xff\x3f\xff\x0d\x7f\xbc\xb8\x38\xfb\x78\x7f\x36\xbd\x3c\x7b\x3d\x7c\xf7\x4f\xd1\xff\xfc\xf9\xd5\xcf\x5d\xfd\xcf\x37\xaf\xff\xc5\xff\xf3\x8f\xf8\xef\xc2\xf9\x63\xce\x42\xb8\x28\x77\x3b\xb7\x5e\x47\xb5\x0f\x44\x9e\x4d\xcb\x4b\x53\x65\x4f\x56\xbf\x1e\xbe\xd3\x17\xf3\xf1\x68\x39\xf9\x65\xac\x2f\x66\x37\x37\xb3\xe9\x42\x5f\xcc\xe6\xb7\xb3\x39\x72\x0a\x4f\x16\xca\xf9\xd8\x23\x08\x4f\x7c\x9a\xcc\x6f\xc0\xc5\xbc\x9c\x8d\x17\xe0\x7b\x73\x84\xe9\x7a\xfc\x79\x74\x4d\x21\x91\xf1\x62\x18\x17\x5c\x83\x17\x1b\x62\x69\xca\xdf\x0d\x6f\x1e\xeb\xd1\x54\x8f\x96\xcb\xd9\x7c\x3a\xbe\x3f\xbb\xb8\x9e\x8c\xa7\x4b\x3d\x1f\x5f\xc3\xfb\x17\x57\x93\xdb\x61\xb7\x85\xf4\xda\x85\x82\xe7\x4e\xa6\x10\xf9\xc1\x77\x4d\xdd\xe3\x4e\x46\x8b\xb3\xc9\xe2\x44\x7f\x1c\x2d\x26\x8b\x9e\xfb\x6f\x46\x7f\x1e\xcb\xc8\x9d\x73\xf0\xe7\xe3\xcf\xa3\xf9\x25\x47\xd8\xe4\x33\xe9\x6d\x97\x09\x7e\x3b\x31\xa0\x2f\x04\xd9\xb2\x88\x8e\xe8\xf9\x78\x71\x77\x0d\x51\x9b\x4f\xf3\xd9\x8d\x9e\x2c\x17\xfa\x6e\x31\x1e\x2a\xce\xb4\x28\x08\xbe\x7c\x99\xcd\xff\xac\x4f\x47\x0b\x7d\x39\xfe\x84\x71\x87\xf1\xf5\xec\xcb\x40\x4f\xfc\xc7\x5d\xea\xbb\xe9\xe5\x78\x0e\xad\x41\xe7\x9e\xfb\xb1\xfd\x39\x2a\xe6\x77\xd2\xa7\x27\x17\x17\xb7\xd7\x27\x7a\x36\xd7\x27\xf4\xb7\x93\x01\xc6\xd1\xe0\xb5\xf8\x8e\xe5\xf8\x82\x22\x91\x21\xa8\x84\xa1\x22\x85\x31\x89\x76\x80\xd2\x39\x22\x77\x0b\x1f\xfc\x80\x47\xe1\x95\xcb\x2b\x37\x84\x0b\x3d\xba\x5b\x5e\xcd\xe6\x93\xff\x10\x6d\x9f\x2c\x14\x37\x8b\x0a\xf2\xf1\x4d\x6e\x3a\x61\x3b\xae\x26\x1f\x27\xcb\xf1\xe5\x50\xa9\x8f\xf7\x7a\xfc\xeb\x78\x7e\x81\x81\x21\xf7\x3a\xb8\xd6\x87\xfb\xe0\x8d\xbe\x77\xae\xc6\x73\x0e\xd5\x5d\x40\xe4\xd4\x0d\x0e\x44\xcf\xf4\x72\xa6\x3e\x8e\xf5\xc7\xd9\xdd\x14\xbe\xaf\xdb\x83\xd4\x24\xec\x13\xfc\xc7\x6c\xae\x3f\xbb\xa9\xb0\x80\x47\xba\xbf\xe3\xcb\xd5\xc5\x6c\x4a\xa1\x21\x8c\xf8\x4e\x21\xa0\x35\xb9\x1c\xcf\x3d\xeb\xf6\xfd\xec\x6e\x4e\xad\x18\x4d\x2f\xc6\x3e\x46\xd3\x17\x93\xc1\xf0\x73\x5b\x27\x35\x1d\xea\x93\x8b\x50\x4c\xf2\xa5\xac\xbe\x06\xc1\x4c\x84\x29\x23\xa4\x1a\x0c\x35\x53\x65\xe5\x06\xcc\x5d\x40\xe8\x24\x3a\x2d\xea\xc7\x32\x2f\x1f\x0e\xba\xac\x94\x29\xd6\x87\x75\x5e\xee\xcd\x26\x4b\x13\xac\x7a\x64\xa8\xec\x17\x60\x4f\x44\x62\x42\xc4\x58\xd4\x90\x3d\x6c\x49\xdc\x26\xe8\x94\x29\xaa\x0c\x08\xa9\x17\x42\x29\xc8\x34\x7a\x12\x4a\xbd\x01\xa0\xcb\x35\x51\x08\x56\xf6\xb5\x5a\xaa\xb7\x3c\x0b\x62\xf9\xd6\x9a\xdd\x2a\x27\x99\x3a\xf0\x1b\x43\x51\x0d\x16\x97\x8d\x44\x95\x67\x28\x2c\xb7\x2a\xd5\xad\x3e\x0b\x40\xc9\x95\xd1\xa2\x68\x2c\xd5\x97\x01\x40\x08\x17\x9e\xa6\x56\x03\x1c\xdb\x6c\x90\x36\x61\xa0\xbc\xe9\x8a\x20\x86\x0e\x0e\x69\xa8\xd4\x6a\xa8\x4f\x5a\x4f\x8a\x87\x89\xe0\x71\xc0\x49\xeb\x3b\xbc\xac\x5a\x7f\x48\x8b\x8d\x62\x2c\x86\x39\x33\xbf\x61\x7a\x10\x51\x7a\x72\xa0\x05\x3d\x41\xa2\x77\x0d\x55\x3c\x57\x00\x56\xc0\xda\xbf\x4d\x95\x3a\x2f\xf5\xef\x94\xd8\xd9\x22\x8e\x2d\xcd\xf9\x2f\x7a\x57\x82\x0f\xbb\xcf\x90\x1b\xdc\x67\x3a\xad\xf3\x9c\x9d\xb7\x0e\xe5\x9c\x0f\x6e\x28\x6a\x60\xb4\x66\xe9\x88\x44\xa5\xab\x2a\x43\x70\x19\x02\xc0\x4c\x61\xe9\xa1\x11\x84\x0c\x70\xf8\xdd\x59\x46\xec\x16\x95\x59\xa7\xb6\x4e\x14\x16\x68\x97\xd5\xce\x6c\xf0\xfe\x4d\xba\x07\xa2\x01\x4c\x29\x11\xd5\x48\xff\x38\x6b\x39\xce\xea\xf7\x8d\x73\x6b\x50\xbb\x63\xfa\x89\x2e\x00\x76\x16\x46\xf8\x6c\xca\x66\x55\x27\x22\x86\xf6\x85\x68\x47\x53\x3f\x0c\x00\x2c\xb7\x19\x93\x36\x43\x7f\x2a\xd1\x9f\x10\x1c\x3c\x14\xeb\xc7\xaa\x2c\x68\x34\xd8\xb7\xe4\x55\x58\x67\x3b\xb3\x39\xf3\x24\xc0\xb4\xda\x9c\xcf\x52\x3c\x28\x20\xe6\xd6\xa7\x27\xf0\x8c\xac\x78\x38\x19\xf8\x28\xd1\xef\xfc\x60\xd5\x9a\xc4\xeb\xa1\xee\xc8\xbc\x22\x44\x87\x39\x66\xa0\xac\x03\x85\x45\x48\xaa\x09\x09\x45\xb8\xed\x3e\xc4\xaa\x7a\x4b\x0c\x87\xac\xc2\xb5\x19\xea\x93\x19\x43\x2b\x46\x10\x6f\xf8\xe6\x0b\x9f\x1f\x4b\x2f\x74\xc3\x2f\x1c\x2a\x65\x86\xfa\x44\x2e\xb7\x5a\x72\xab\xf8\x62\x8e\x10\xd7\xb0\x8f\xd9\x1e\xdb\xfd\x02\xad\x4a\x68\xef\x76\xa8\x4f\xee\xcb\x26\xa8\xde\xf6\x37\xee\x25\x15\x5d\x8f\xe6\x65\x6d\x17\xa4\x7a\x33\x4f\x19\xe2\x09\x9f\xb2\x32\xf7\x5f\xd5\xdb\x6f\x38\x03\x58\x20\x84\x94\x59\xbf\xc0\xe6\x2f\x24\x63\x7c\x84\x8d\xd5\x52\x04\xa2\xda\x23\x22\x3d\xcb\xb4\x2c\x72\x3c\xda\x64\xbd\x31\x76\x9f\x01\x55\x07\x37\x98\x9a\x8b\xe1\xcc\xd7\x43\xfd\x29\xcd\x2a\x7d\x67\x8d\x9e\x13\xc5\xd9\x94\xf0\xdd\x59\x11\x13\x60\xb5\xa0\x43\x95\xd9\x34\x6b\x93\x20\x9a\x04\xf1\xee\x84\xdf\x91\x4a\x19\x2c\x8d\x00\xed\xdf\xba\x57\x81\xaa\x01\xea\x33\xdb\x34\x0f\xba\x12\x02\x96\x62\xb9\xce\x32\xa8\x4b\x71\x9d\xe8\x36\x9e\x1f\xba\x7c\x2e\x4c\xd5\xc7\x50\x13\xf4\x2a\xa4\xf8\x67\xfa\x4c\x22\x9f\xdc\x3f\x9f\xab\xb4\xa8\x87\x7a\x11\xcb\x30\x7e\x5b\x72\xd8\x7d\x84\x97\xee\xa3\x38\x06\x61\xe1\x01\x2f\x1c\xe4\x64\x93\x08\xb3\x99\xc4\xaa\x59\x89\x1b\xe3\xbd\x01\x4a\xfc\xd3\x6d\x89\x21\xf0\x4d\x13\x13\xca\x8b\x0f\xf0\x9f\x28\xc4\xc3\xc2\x3c\xd0\x02\xc5\x9c\x15\x2a\x9c\x4a\x96\xd5\xc8\xe1\x40\x7c\x0f\x56\x49\x5d\xfa\x53\x21\xec\x84\x49\x1b\x19\x21\x76\xb5\x9a\xaa\x28\x29\x52\xdc\xda\xb8\xad\xa7\x13\xee\x3e\x15\x60\x46\xe1\xa1\x3e\x52\xde\x3a\xe3\xed\x07\x38\x87\xfb\xd9\x0e\x2b\xbd\x7f\x2c\x8b\x12\xf7\x61\x0b\xd2\x60\xcc\x4a\xc0\x12\xe1\x09\xd7\x1b\x86\xbf\x28\x21\x32\x13\xa4\xc4\x57\x41\x4d\x0a\x30\x3c\x0f\x59\x0d\x7c\x61\x9b\xac\xc4\x93\xd9\xd7\x31\x84\xaf\xf7\x9a\x0b\xdd\x4f\x69\x7f\x86\xdf\x25\xd7\x88\xe9\xf8\xf6\x21\xf4\xfc\xd2\x21\xf4\x5e\xa9\x6c\xa8\x6f\x83\x52\x8e\x9e\xc3\x84\x72\xdd\x72\x07\x13\xff\x63\x9e\x16\x5f\x4d\xed\x49\x26\x87\x42\x8e\x2a\x05\xac\x45\xb4\x98\x94\xa8\x87\x86\x96\x07\x72\x40\xc9\x46\xe6\xfa\xfc\x29\x4b\xd1\x2c\xf5\xef\xa6\xe9\x65\xcb\x75\x66\xea\x83\x42\x79\xbe\xd1\xe2\x62\x74\x9b\xe8\x8f\x37\x93\x44\x2f\xc6\x8b\xd1\xc5\x80\x67\x3d\x53\x1f\x86\x5c\x61\xf4\x34\xa6\xf2\x58\xf3\x28\x28\xf9\x2b\x3e\xfc\xd9\xac\x9c\xa5\x31\x90\x87\xec\x50\xa9\x2c\x1b\xea\x9b\x20\xe6\x3f\xa7\xfd\xa6\xd8\xe8\x45\x9d\xd6\x0d\x28\x40\xf9\x8e\xfa\xaf\xee\x11\x18\xa6\x56\x5f\x40\x65\x89\xaf\x07\x53\xe9\x83\x29\x58\xbe\xf0\x0a\x88\x53\x3e\x95\xbf\xe9\xd1\x83\x33\xe2\x3b\xdd\x03\xe8\xd6\x30\xbf\x91\xb2\x14\x79\xd9\xdd\xce\x19\x96\xf2\xe9\x09\x90\x33\x79\xf0\xd7\xa0\x55\x83\xdd\x51\x94\x05\xf1\xff\xdc\xba\xde\x60\x2a\x5d\xa1\x36\x77\xfe\xb3\xbe\x5b\x5c\x04\x1e\x99\xf3\x77\xdc\xcb\x77\x0b\x91\x62\x18\xad\x6b\xa8\x15\x81\x4e\x0b\x25\x6d\x59\x41\xc6\xee\x5f\x9b\x2a\xb3\x1b\x2a\xb5\x18\x0c\x95\xda\x0c\xf5\x17\x1c\x36\xb7\xf9\x7f\x6b\x6c\x5e\x58\x24\xaa\xcf\x52\xeb\x98\xb8\x2f\x0e\xae\x2f\xff\x57\xbf\x7f\xba\x9f\xb5\x86\x18\x87\x73\xe1\xde\x3f\x26\x2e\xa1\x41\xa2\x8e\x4e\x75\xde\x5a\xbe\x6f\x52\xfb\xb1\x53\x47\xc7\x4e\xbf\x34\x76\x6f\xfb\xc6\x4e\x1d\x1d\x3b\x7d\x64\xec\x80\x52\x0c\xea\xa3\xe9\xe3\xc9\xe0\xe7\x53\x06\xf6\x3c\xa8\x93\x75\x7e\x28\x8a\xa6\x41\x4a\xcd\xfa\x7e\x2d\xca\x67\xe0\x7d\x04\x24\xa1\x1b\x40\x60\x65\x03\x6d\x72\x6b\x36\xc4\x5a\x26\x5f\xc1\x65\xa9\xb5\x64\x6b\x20\x42\xd1\x0e\x21\x52\x8a\x20\xbb\xda\xac\x1f\x0b\x2a\x44\x8a\x44\x1f\xfb\x8f\x43\xfa\xdc\x4e\xa3\x13\xb5\x6a\x64\x8d\xa1\xa8\x7f\xd3\x81\x86\x02\xda\xd2\xb2\xc8\xed\x50\x8f\xf2\x9c\x2f\x2a\xca\x5a\x85\xe2\x46\xa1\x47\xef\x27\x27\xaa\x5d\x82\xa9\x80\x40\x39\x60\xab\x7e\x3b\xd4\x73\x51\xa8\x84\x9d\xc3\xc3\xcd\x8f\xc9\x0a\x3f\xce\x6f\xa8\xe7\x32\x59\x4b\xb9\x4b\x37\x46\x89\x95\x8f\x02\x7f\xbb\x4c\x80\x06\x03\x28\x42\xd6\x45\xa1\x2d\xc0\x85\x54\x72\x1f\xf1\xa7\x25\x1d\xb3\xe2\x2f\x34\x9d\x93\xb0\x7d\xc3\x65\x30\xd7\xf3\x03\x6f\xe1\xc2\x4d\x2e\xf2\xc3\x51\x4a\x7c\x6f\x4e\xb9\x36\x7b\x1a\x28\x9a\x10\xca\x27\x9b\xe1\x65\x30\xb9\x8b\x0c\x9e\x3e\x37\x84\xc9\x98\x10\x3b\x0d\x7a\xac\x49\x8f\xe1\x0d\xe8\x12\xc5\x84\x5e\x72\x9f\x95\x7e\xdb\x7d\xc4\xed\xf2\x52\x07\xa8\x97\x3b\x80\xfb\x27\x2e\x9b\xc5\xa2\x7f\x14\x40\xe4\x4a\x35\x72\x5a\x84\xa1\x81\xde\x32\x64\xce\xa4\x45\x7d\xdc\xb3\x60\xd9\xab\x50\xd7\xa6\x44\x5d\x9b\x3e\x52\xd7\x06\x83\x11\xb7\x4f\x94\xd2\x86\x53\xd6\x8f\x47\x9b\x6b\xee\xf7\xf1\xcc\xf5\xea\xf2\xc1\xd6\x7f\xdf\x5b\x2c\xf5\x5d\xb3\x4f\xbd\xd8\xf9\xa1\x4b\x59\xef\x07\x37\x8c\x32\x2f\x1f\xc0\x60\xd8\x99\xd4\x36\x15\x7d\x82\xe2\xaa\x7c\xaa\xd2\x8e\x6b\x14\xd8\xad\x4f\xf5\x2e\x2d\x0a\x54\xba\x0b\x55\x21\x3e\x5d\xd6\xeb\x82\xea\x11\x97\xca\xc9\x6d\x4f\x00\xbb\x5f\x30\x92\xbb\x61\x30\x04\x90\xc0\xf3\x7d\x7e\x91\xea\x7a\xfb\x2c\x6a\x9d\x02\x6b\x4f\x6c\x42\x10\x3b\x15\x62\xbc\xa0\x8c\xc6\xf6\x79\x3f\x6d\x57\x5a\x4f\xb6\xc2\x2c\xe9\x6b\x1a\x84\xc2\x08\xe8\xe0\xa5\xe1\xfc\xee\xc7\x53\x29\xd1\xb1\x5e\x2f\x15\xf9\xa0\x16\x6b\x65\x76\xae\x7b\xbc\xb7\xdb\xf9\x9e\x02\xf4\x6a\x36\x59\x1d\x89\x93\xad\x0e\x7a\x9d\x03\x03\xda\xdb\xd3\xd5\x20\xd1\xa9\x05\x69\x76\x63\x51\xf7\x7c\xe5\xc1\xdf\xff\x5d\x1b\x5c\xd5\x71\x02\x12\x7d\x74\xed\xb4\xc9\xd1\xac\x0f\x50\x72\x0c\x91\x6b\xe3\x13\x21\xc3\xe5\x99\xba\x90\xaf\x04\x40\x03\xce\x87\xe1\xf2\xd4\xa6\xce\xf2\xec\xef\x40\x6b\x73\x9a\x0d\x7c\xde\x9d\xe7\x70\x2b\x5a\x03\x26\xc1\xde\x9a\x66\x53\x16\x07\x4c\xe6\x0b\xf9\x6c\xf7\x4f\xdb\xc0\x1c\xdd\x24\x4c\x62\x7d\x9a\x65\x03\x66\x3a\x6b\x3f\x8d\x2e\xf1\x83\xed\xed\x60\xcf\x7f\x04\x1c\x32\xb0\x64\xa9\x28\x16\xed\xa0\x54\x43\x41\x2d\x94\x20\x52\x54\x30\x61\x60\x17\x14\x99\x43\x78\x26\xd1\x7f\x2d\x9b\xaa\x48\xf3\x01\xf1\xd6\xf8\x28\xb5\xca\x0a\xff\xd6\x1f\x6c\xa7\x6b\x93\x30\x99\x99\x09\x1f\x6b\x86\x64\x91\x2c\xea\xd3\xb8\xce\xc4\x6a\x67\xee\x36\x5f\x68\x8f\xc7\x06\xb6\xfb\x03\x2e\x91\xac\xce\x5b\xdb\x43\xe8\x31\x14\xf8\x8e\x67\x79\xa0\x3c\x8b\x26\xfc\xb7\x4e\x34\x37\x30\x0a\xf1\x19\x6e\xa3\x0d\x92\x9f\x5c\x49\xc2\xa5\x59\x81\x94\xc4\x6f\x47\xb4\x28\x91\x32\x03\xbe\xe5\x6e\x3e\x51\x62\xdb\xf0\x9b\x76\x0f\xef\x68\xc9\x34\x04\x18\x09\x0a\x98\x29\x39\x55\x87\x0a\x4a\x73\x68\x41\xb2\x84\xb8\x28\xe9\x23\xce\x54\xd9\xcd\xb0\x81\x7e\xf0\xe4\x0f\x89\x26\xc5\xce\x44\x31\x95\x23\xb4\x27\xb5\x54\x0c\xdd\xd9\x65\x20\x9a\xbc\xcb\x8a\x6c\xd7\xec\xa8\xe6\x09\xdf\x8f\xcc\x0e\xfb\xbd\x49\x2b\xf2\x1a\x42\x28\x1b\x98\x41\x2a\x68\x81\x88\x22\xf2\x4e\x02\xf7\x58\x96\x8c\xf7\xbb\x3c\xe3\x32\x9d\xc1\x19\x48\x2f\x99\x81\xe1\xdb\x0f\xc6\x38\xc0\x3b\x67\xdf\x49\xe9\x5e\x9b\xb0\x10\x73\x46\xc4\x98\x97\xe1\x78\x54\x04\x25\xf7\x75\x02\xfa\xe6\x6e\x79\x37\xba\xbe\xbe\x17\xf8\x71\xca\x7c\x71\x31\x40\x80\x93\x27\x21\xe5\x35\xfb\xf4\x69\x3c\x5f\x84\x8c\x24\xe4\x4d\x91\x21\x9b\x53\xa4\xf3\xf1\xed\x7c\xbc\x18\x4f\x51\x64\x76\xa1\x67\xf3\x16\xaa\x9f\xab\x06\xf4\xc5\x6c\x7a\x31\x9e\x4f\x27\xd3\xcf\xf0\xc0\x9b\xd1\x72\x3c\x9f\x8c\xae\x17\x09\xd7\x11\x24\xa1\x86\x60\xb1\x1c\x2d\xef\x96\xb3\xf9\xbd\xc7\x40\xbb\xcf\x90\xb5\x05\x1e\x00\x19\x14\x6e\x93\xd6\x9b\x97\x93\xe5\xf5\x38\xf1\x70\x47\x82\x48\x27\x0c\x76\xd4\x6d\xb0\xa3\x22\xb0\x63\xa2\xa7\xb3\xe9\x64\xfa\x69\x3e\x99\x7e\x1e\xdf\x8c\xa7\xcb\x04\xf1\xde\x63\x3d\xfa\xb8\x18\x53\x06\xef\x7a\x04\x35\x1b\x1e\xa2\x8d\xf5\x01\x8b\x44\x23\x7c\xfc\xe2\x3e\x51\x74\x13\xf6\x0f\xde\x25\x1e\x30\x9e\xcf\x67\xf3\x45\xa2\xbf\x5c\x8d\xe1\x01\xb3\x39\x24\xbd\x2f\x27\x8b\x8b\xd9\x2f\xe3\xf9\xe8\xe3\xf5\x78\xa8\x17\xb3\x9b\xb1\xfe\xd3\xdd\x7c\xb2\xb8\x9c\x5c\x20\x68\xfb\x72\x06\xd7\x8d\xae\xaf\x67\x5f\xa8\x7a\xe4\xe2\xfa\x6e\x41\xb9\xc6\x6e\x65\x45\xa2\x17\x33\xcc\x37\x86\x0b\x6f\x46\xf7\xee\x21\x6a\x74\x7b\x7b\x7d\x4f\x18\x7e\xe4\x7c\xb8\x0e\x65\x7d\xa5\xdb\x14\x49\x92\xd5\xd7\x9f\xc4\x15\x2b\xc7\x6b\x15\x12\x25\x4b\x1b\xa0\x40\xc1\xcf\xaa\x4e\xf5\x00\x64\xe5\xef\x09\x25\xb0\xbc\x1a\xbb\x71\xff\x44\x95\x0b\x5c\x35\xa0\x42\xd5\x40\x12\xd7\x0c\x24\xfa\xf6\x6e\x3a\x81\x8c\xf7\x6c\xae\xc7\xbf\x8e\x6f\x6e\xaf\x47\xf3\xfb\xe3\xa5\x04\x71\xd2\x99\x4a\x0b\x64\xde\x3a\xa0\xf1\x7d\x9b\xbf\x03\x7b\xaf\x3a\xd8\x7b\xb7\x72\x7f\x1e\x02\xa4\x3e\x2b\x90\x93\xc9\x39\x4a\xcb\x8e\x81\xfb\x82\x7d\x8d\x3b\x52\x90\xb9\x8c\xb8\x33\x14\x58\x4b\x6e\x87\x5a\x55\x00\x0b\x5f\x1d\xe0\x28\xa7\x33\xe5\x98\x0d\xe6\x03\x16\xd6\x27\x2f\x32\x63\x55\x97\x87\xa6\x6d\x8f\xa0\x4d\x75\xdf\xcb\x42\x13\x36\x61\x68\xb2\xfa\x36\x1f\x4d\x20\xef\x21\x56\xd9\xde\x66\x11\x3b\x8d\xea\xb2\xd3\xf0\x29\xe5\x1c\xa1\xdc\x47\x2d\x03\x4d\x5b\xa2\x5f\x27\xfa\x5d\xa2\x7f\x4a\xf4\xcf\xe8\x19\xfe\x01\x9b\x66\x9b\xea\x89\x79\xa9\xeb\x30\x38\xfd\x19\xdd\x56\x54\x1f\x4d\xef\x7e\xb9\xcf\xba\xc7\xe9\x26\x82\x5a\x15\x87\xe8\xf5\xf7\x86\xe8\xf9\x2c\x73\xdd\x3f\x80\xb4\x8a\xfb\x68\x10\xe7\x60\x22\x17\x62\x6d\xf6\xc7\x3a\x85\x05\x6c\x1c\x07\xa9\x8c\x3b\x86\x4c\x3b\x4b\xe7\x8b\x0c\x95\xf7\xdb\x70\xd2\xc0\xa9\x6e\xeb\x72\xdf\x25\xba\x41\x03\x93\x74\x8d\xb3\x9d\xe9\x39\x88\x95\xd7\x86\x80\xa1\x05\x28\xb4\xaf\xff\x03\x47\xd1\x35\x11\x0a\x11\xb2\xfa\x71\x53\xa5\xcf\xb1\xbf\x73\x2a\x73\xc8\xa1\x69\xee\xa1\x8f\xa9\x05\x02\xf8\x84\x48\x99\x25\x23\xd1\xca\x24\x1d\x59\xf5\x23\x14\xca\x83\xa4\x87\x6b\x22\x93\x5a\xaa\x3c\xe1\x80\x0b\x02\x2b\x2f\x50\x3e\x83\x09\xc4\x02\xb1\x52\xc8\x8d\x20\x5d\x1d\xac\xfc\x3f\x0c\xf5\x4d\x66\xd7\x26\xcf\x91\x34\x04\xd6\x7e\xe0\xd4\xb9\xef\xe7\xa3\x7e\xd9\x0f\x4d\xa2\xf4\x9d\xe2\xcc\x6b\x19\xbb\xef\x82\x49\x47\xfa\x86\x65\x90\xfb\xed\x9d\xc0\x2a\xb5\xbd\x53\x18\x8b\x81\xfa\xb8\xac\xd8\x2b\x22\x19\x0c\xc2\x89\xb7\x9d\x57\xc8\xf9\xbd\x4c\xaf\xe1\x67\xbe\xca\xd3\x67\xa0\x7f\x0d\xaa\xd6\x29\xf6\xba\x6b\x59\xe0\x9d\x60\xd6\x1c\x93\x06\x55\x72\xec\x03\xb7\x59\x6c\x00\x8f\xd2\x2e\x05\x69\xc7\x89\xb8\x58\x82\xa9\x7e\x48\x8a\x97\x42\x5d\x2d\xde\x1d\xe5\xd9\x6a\x12\xaf\x99\x41\xdf\xeb\x75\xa9\x81\x2a\x6a\x67\x7c\xc4\x82\x0d\x4c\x32\xdf\x7d\x7c\x51\x45\x71\xc9\xf0\x20\xec\x23\x98\x69\xa1\x8b\x30\x25\x3f\x2d\x51\x5b\x02\x05\xec\x8f\x74\xb4\x6f\xc8\xc6\xb5\x74\x83\x81\x6c\x7c\x60\x51\xd2\x11\x81\xf4\x0b\x3c\xae\xd2\xb0\x87\xab\x2b\xaa\x59\x87\xc2\x77\xff\xbc\x0c\x25\x94\xb9\x7c\x96\x08\xbd\x44\x47\x1d\xc8\x85\x40\x5e\xcf\x8d\x60\x79\xec\x3c\x15\x03\xfb\xd1\x19\x28\xc1\x1c\x75\xa0\x13\x0e\xfc\x40\x2b\x53\x3f\x1b\xaa\x68\xf1\xac\x69\x59\xfd\xa8\x42\x36\x3c\x4c\x73\xcf\xb8\xee\xb6\x5e\xa2\xf0\x22\xee\x25\x21\x6d\x94\x15\x0f\x56\x50\x10\x59\x25\x25\xdb\x25\x86\xb9\xef\x15\xa1\x06\x3d\xf3\xef\x09\x6e\x15\xa8\xdf\x13\xfa\x64\x05\x59\x86\xd5\x01\x59\x1f\x89\xe4\x37\x96\xd9\x86\x5d\x0d\xe8\x21\xc0\x85\x60\x7f\x67\x5d\xee\x76\x4d\xe1\xd5\x6c\xe8\xe0\x6d\xf5\x1c\x47\xbd\x56\x92\x7c\x9b\xa6\x35\xcc\xc0\x06\x8e\x1c\x06\xaf\xfb\xcf\x55\x51\xe9\x12\xfa\xde\xf0\x78\xa5\x3a\xc8\x50\x96\x46\x0c\x03\xdd\x5d\x4a\xff\x1f\x7b\xff\xba\xdd\xb6\x92\x9d\x0b\xc3\xff\xeb\x2a\xea\x53\xbe\x77\x2f\xb1\x07\x44\x4b\xf2\xa9\xdb\xce\xc8\xd8\x34\x45\xd9\x4c\x24\x51\x4d\x52\xcb\xcb\x3b\x23\x23\x1b\x24\x8b\x12\xda\x20\xc0\x00\xa0\x64\xf6\xaf\xdc\x43\xae\x22\xb7\xf1\xe6\x4e\x72\x25\xef\xa8\x79\xa8\x9a\x05\x80\x94\xbc\xba\xd7\xea\xa4\x23\xfd\xe8\x5e\x96\x48\xa0\xce\x35\x0f\xcf\x7c\x1e\x04\xce\x4b\x12\xf6\x87\xbb\xb8\x2a\x73\xb8\x0b\xb0\x60\x23\x73\x57\x80\x70\x2d\xbb\xba\xf1\x3a\x89\xdd\x49\x13\x0e\x5a\x80\x55\x53\x28\x66\xd9\xdf\x6a\xb2\x7b\x50\x40\xab\xba\x33\x39\xb2\x49\xc2\x2f\x17\x31\xc8\xd6\x8b\x36\x44\x82\x65\x9e\xc6\x47\x49\x06\x8b\x6c\xcb\x15\xe0\x11\xb3\x62\xc2\x57\x00\xa9\x8f\x18\x0f\x47\x5b\x52\x25\x71\xea\x5e\x41\xd0\x84\x5a\x1f\x79\x8c\x58\xa9\xb5\x7e\x6f\x53\x2c\xbd\x30\xb7\x39\xfc\xeb\x21\xd7\x87\xa7\x1d\x0d\xfb\x32\x9b\x9b\x12\x2a\x2a\x1a\x23\x73\x17\x30\x1f\x32\x9f\xba\x59\x70\x30\x8e\x8e\x6f\x37\xa7\xce\x86\x8c\x94\x3b\x50\xb1\x56\xd0\x27\x1c\xa0\x54\x5e\xb0\x58\xe5\x4b\xf7\x7d\xa7\x40\xec\xdc\x75\x4e\x06\x08\xb4\x14\x91\xd8\x91\x8e\xa1\xc8\x5a\x31\x3d\x3f\x67\xdc\x54\x8b\xd4\x70\xbf\x7f\x7d\x11\xe9\x8c\xea\xea\x70\x5e\x61\xfa\xb9\x14\xa0\x2a\xe2\x85\x59\xc5\xc5\x57\x7d\x50\x1f\x8d\x03\x16\xe2\x07\x80\x94\x3d\xcd\xdc\x67\xf3\x42\xa7\xf9\x6d\x6e\x9b\xd7\xb2\xba\xfc\xe6\x58\x17\x49\x5e\xf0\xde\xe0\x73\xb1\xed\x5b\xc8\x24\xe9\x59\x55\x36\x6c\x2b\xe0\xd1\x58\xb3\x48\x1b\x3b\xe8\x07\xfb\xb6\xec\x68\x0e\x5a\x80\x95\x68\xe8\xa6\x8c\x6f\x89\x0b\x21\x4d\x32\x40\x3c\xba\x44\x99\xab\x4b\x54\x39\x02\x32\x1f\xcc\xac\x4c\x2a\x13\x70\xa5\x61\xe4\x35\xbe\x8f\x93\x14\x6f\x53\xeb\x0e\x50\xd0\xb2\x85\x04\xa5\x65\x73\xd3\xdb\xa8\x74\x0d\xb5\xb8\xee\xaa\x6a\xfd\xee\xc5\x8b\x39\x7d\x76\x4e\x83\x90\x17\xb7\x2f\x9e\x4b\x2c\xfe\x4a\x7e\xba\x2f\x7a\x1f\xaf\x2f\x8e\x4e\x7e\x49\x01\xe8\xfd\xf5\x1f\x2f\xdf\xbc\x3d\x39\xae\xeb\x3f\xbf\x7c\xd6\x7f\xfe\x75\x7e\x7a\xe7\xe7\x83\xf1\xe8\x51\x09\xe8\x93\x48\x5f\xc6\xc5\xfc\x4e\x9f\x1e\x1f\x9f\xca\x82\xee\xff\xf7\xdf\xe1\x57\xba\x67\x3d\x90\x1c\x4a\xf1\x94\x7a\x7d\x72\x6c\xcd\x93\x62\x41\x32\xcf\xfa\x48\x4f\x36\xf6\xcc\x3a\x3d\x7d\x1d\xe9\x49\x9c\x41\xf1\xed\x3c\x29\xe7\x79\xa4\xfb\x3d\xfd\xbb\x57\x27\xc7\x6f\x49\xe7\x79\x5a\x43\x09\xc6\xde\xa0\xe1\x8a\xd5\xc7\x8b\x85\x3d\x3f\xd7\xf7\x69\x54\xc3\x31\xca\x86\x49\x52\x08\xcc\x64\x57\x71\xca\xfc\xf4\x70\xd1\x71\xce\xa7\x35\xe5\x98\x04\xd9\x9a\xb7\x94\xe7\xf3\xfa\xb5\xf6\x97\x48\x4c\xbf\xa9\x4c\xa1\x33\x53\x3d\x20\xe2\xe8\x7f\x9c\x9e\x35\xad\x90\xc7\x25\xad\xad\x57\xf4\xe7\x91\xb4\x6e\x08\x90\xee\x95\xb4\xde\x29\x65\x4d\x82\x46\x4b\xea\xc2\xd3\x45\xab\xf5\x0e\xd1\x6a\x55\x17\xad\xa6\xb1\x91\x4d\x6d\x93\xa8\xc6\x0a\xca\xda\x10\xaa\x47\x34\xaa\xf5\xaf\xa0\x51\x6d\xc7\x6f\x87\x48\x35\xea\x65\x3d\x4b\x54\x3f\x4b\x54\x3f\x4b\x54\x3f\x4b\x54\x3f\x4b\x54\xc3\xa0\x3c\x4b\x54\x3f\x4b\x54\xff\xcf\x94\xa8\xde\x6b\x05\x3e\x49\xa9\x5a\x49\xa5\x6a\xfd\x67\x50\xaa\xe6\x00\xd2\x9f\x47\xa9\xba\xae\xa9\xf0\x27\x29\x55\xfb\xbb\x96\xcb\x5e\xff\x34\xa5\x6a\x19\xeb\x7c\x56\xaa\x96\x5f\x79\x56\xaa\x7e\x56\xaa\x7e\x56\xaa\x7e\x56\xaa\x7e\x56\xaa\x7e\x56\xaa\x7e\x56\xaa\xfe\xab\x51\xaa\x5e\x74\xea\xb4\xf9\xe1\x15\xb7\xa0\x18\xa9\xac\x45\xe7\xc6\xe3\x19\x8e\x63\x4c\xd2\x19\xaa\x19\xca\x45\xa0\xef\x32\xe2\x25\xc5\x41\x6a\xf9\x12\xf4\xbd\x60\x88\xdd\xc8\x30\x6f\x8a\x6c\xdb\x43\xcc\x62\x00\x60\xa9\xac\xed\x31\xbb\xc9\x12\x4c\xb6\x73\x3a\x2f\xac\x29\x46\xf7\x51\xc1\xb3\x1b\x57\x7b\x9b\x64\xa5\x88\x7d\xe0\x28\x42\x8d\x04\x46\x8e\xe2\x39\x60\x68\x14\x6b\xcc\x15\x3b\x63\xef\x35\xd1\xb0\xdd\xa7\x3d\xc6\x37\xf0\x76\x8a\x33\x59\x33\x28\xbb\xc7\x21\x59\x1c\x6c\x31\x46\x38\x07\xd0\x14\x36\x7b\x9c\x8a\x49\x73\x2a\xc4\x28\x25\x2b\xa8\xcd\xab\x4c\x38\x5e\xb3\xad\xfe\x34\x9d\x5e\xb3\x62\x64\xab\xa6\x67\xbe\xdc\xd5\x77\xf6\x9a\x6a\x9e\x42\xf7\x59\x11\xfd\x59\x11\xfd\x59\x11\xfd\x59\x11\xfd\x59\x11\xfd\x59\x11\xfd\x59\x11\xfd\x59\x11\xfd\x59\x11\xfd\x59\x11\xfd\x59\x11\xfd\x59\x11\xfd\x59\x11\xfd\x59\x11\xfd\x59\x11\xfd\x59\x11\xfd\x59\x11\xbd\x7a\x56\x44\x7f\x56\x44\x7f\x56\x44\x7f\x56\x44\x7f\x56\x44\x7f\x56\x44\x7f\x56\x44\x7f\x56\x44\x7f\x56\x44\x6f\x51\x44\x17\x45\x34\xdf\x21\x80\x0e\x0f\x0d\x71\x75\x75\xf9\xa8\x9f\xa3\x83\xae\x9d\x0e\xba\xfa\x13\x75\xd0\xb5\xd0\x41\x57\xcf\x3a\xe8\x7b\x75\xd0\x71\x1e\xa9\x1c\xa9\xd6\x53\x4e\x2f\xa8\x9f\x2b\x7b\xae\xeb\xb2\xe7\x6a\xe7\xbb\x3d\x5c\x09\x42\xfc\xf4\xfd\xba\x20\x5f\x3d\x45\xea\x4d\xd0\x10\x7f\x20\xdf\x4b\x0b\x76\x57\x25\xd6\x0f\xe5\xbe\xc2\x2e\x1e\xcb\x97\x76\xdf\xde\x25\xb7\x90\x9d\x12\xce\xbb\x1c\xf0\xa0\x4e\xec\xfa\x82\x63\x73\xed\xfe\xa1\x2a\x37\x33\x80\x3f\x27\xe0\x79\x89\xc0\x92\x4b\x6d\xd6\x8a\xae\xfe\xaa\x84\xe0\xe5\xd4\x8b\xa7\x6f\xca\xf7\xea\x69\xf2\xee\xfa\x71\x79\x77\xf5\x44\x79\x77\xfd\x44\x79\x77\xf5\x34\x79\x77\xfd\x2c\xef\xfe\x2c\xef\xfe\x2c\xef\xfe\x2c\xef\xfe\x57\x2d\xef\xfe\x73\xeb\xbf\x59\xff\x71\xd2\x3b\x7a\xd5\x3d\xfe\x4b\xe8\x3f\xbe\x7a\x79\xfa\xf6\x75\x53\xff\xf1\xf5\x73\xfd\xff\xaf\xf1\xb3\x57\xff\x71\x72\x17\x17\xa6\x07\x32\xd3\xaf\xba\xc7\x7a\x98\x51\x8a\x1c\x98\x8b\xea\xdf\x54\x7d\x56\xa4\xcd\x33\x7d\xd8\xe4\x69\xe9\x78\x02\xa1\x34\x7e\xd0\xcb\xa4\x40\x37\xdb\x4b\xdb\x12\xd4\x15\x0a\x0d\x15\x15\xf2\x82\x13\x8a\xa5\x87\xf1\xe2\x1e\x8a\x8d\xcf\x6a\x51\xad\x46\x17\xc2\x30\x47\xe9\x59\x6a\x49\x04\x03\x1a\xb0\x35\xc5\xd1\x3c\x4d\x64\x8c\x55\xb3\xc6\x56\x79\x97\xac\x5b\x18\x89\x80\xdc\x48\x25\x55\xe9\x53\x48\x68\x65\x70\x81\x8e\x47\x26\x78\x2a\x16\xf0\xca\xf5\x41\x5c\x1e\x25\xe5\x81\x9e\xc5\xa5\x35\x96\xf8\xd1\x8a\x1f\x8d\x65\x96\x1e\x12\x8c\xb9\xa7\xdb\x18\x24\x29\xb4\x7c\x25\x62\x49\x57\xd6\x83\x48\x5c\xf4\xdf\x2c\x94\x83\x65\x24\xc5\x0e\x56\xc2\x1a\x4f\x8e\x68\x6e\xb3\xaf\x2a\x94\x51\x4e\x99\xff\x13\x75\xb5\x89\xf3\xa8\x30\xe5\x26\xad\x9c\x20\x13\xbe\x7b\xe3\xc9\xe6\x96\x9b\x34\x35\x65\xa5\x98\x9b\x3b\x2f\x21\xb2\xdf\x55\xea\x06\x98\x80\x1b\x03\x1c\x1a\xfb\x65\x0b\x4d\x4d\x6d\x6a\x05\x3c\x1a\x8a\x40\xe3\x62\xa1\x4b\x83\x01\x93\x36\x23\x1f\x23\x37\xf6\xa1\x39\x51\xf4\xd2\xc4\x63\x6a\x02\x43\x17\x88\xa8\xa6\x7e\x20\xdd\x80\x0b\x73\x60\x3e\x28\x5f\x2a\xc1\xcf\xeb\x1f\xe3\x66\x45\x24\x58\x3c\x24\x1c\xda\x42\x55\xac\xf2\xb5\xca\x33\x88\xb1\x36\x75\x18\xa7\x83\x2a\x38\xac\x79\xf2\xde\x27\x23\x3b\x63\xef\x1f\x2c\xa1\x0e\xc0\xcd\x6a\x9c\x0a\x8d\xc2\x0c\x2a\x40\x29\xcd\x62\xbe\xdd\xc5\x9b\x12\x25\xe6\x71\x0b\xc2\xaf\x51\xd7\x88\xe0\x95\xf9\xc6\xf1\x2d\x5a\x5f\xbd\x1f\xbe\x6e\xe9\x28\x9d\xf3\xa2\x7c\x07\xc6\x7f\x7d\x6a\x18\xd7\x03\xb1\xb0\x25\x45\xa5\x66\x5b\x55\x09\x66\x84\xe4\x8f\x18\xfd\x72\x55\xd8\x5e\xd5\x47\xe4\x3a\x51\x30\x9d\x86\x36\xc9\xf4\x43\xbc\x2d\x7d\x56\x44\x89\xb8\x96\x8c\x56\xed\x1c\x6f\xf4\x55\xc2\x76\x16\x85\xb9\xcf\xe7\x08\x66\x60\xde\xab\x92\xa5\xd1\x0b\x13\x23\x79\x9e\xaf\x36\xde\xed\xfc\x93\xbb\xc7\xcc\x1c\x28\xd7\x8e\xde\xf3\x0c\xf2\xa5\x18\xba\xc6\x6d\xed\xd9\xe2\xca\x40\x87\xbd\x34\xf3\x4d\x11\xf0\x73\x79\xce\xc0\xfa\x53\x72\xd9\x19\x8e\x7b\x89\xb1\x9c\xc7\x19\x39\x42\x88\x23\xa1\x71\x8c\x4b\x65\xbe\xad\x8d\x1d\xb6\x96\x56\x40\xa0\x12\xa4\x40\x88\x27\xdf\x7d\x8f\xd4\x1d\x24\x15\xaa\x73\x88\x51\xda\x9f\xdd\x6c\x1c\xf3\x7e\xff\xc8\x15\x94\xf0\x43\xe0\x2c\x72\x4f\xdc\x78\x32\x30\x08\x01\x92\x73\xa9\x72\xa9\xe2\x16\x6c\xa5\xae\xbe\xb4\x43\x30\xdf\xb3\x26\xf5\x3b\xfd\x90\x7c\x4d\xba\x6d\xe4\x55\xe1\x5a\xfe\xe7\x65\x5e\xfc\xb3\xfb\x5e\xeb\x4a\xf7\xa3\xf9\x4e\x7f\xd8\x22\x87\x07\x43\x1e\xf3\xe6\xd2\x8f\x5c\xe8\x38\x2f\x14\x65\xf0\xf7\x2e\x6e\x31\x88\x0b\x31\x2e\x30\x24\xee\x70\x50\xad\x49\x5a\x8e\x11\xa5\x9e\xb6\x5e\x3c\x9f\x6e\x5c\x2f\x68\x43\x49\x4c\x85\xe9\xcb\xff\xfc\xd7\x7f\x5b\xca\x14\xd9\xcc\x60\x3d\x0d\x85\xa9\x04\x0f\xad\x9b\x15\xbd\x7b\x56\xfe\xf3\x5f\xff\xad\xba\x33\x99\xe2\xd2\x14\x5f\xa8\x71\xbb\x49\x63\x21\x1e\xe3\xd8\xf0\x82\x7d\x08\x03\x85\x61\x59\x01\xb1\x56\xf5\x2a\xdc\x5d\xbb\x9a\xa5\x41\x53\xc7\x7a\x17\x97\x7c\xca\x40\x01\x05\xce\x44\x17\xd4\x09\xc3\x4d\x2a\xc6\xdc\x9e\xfc\x65\x95\x30\x8d\xa7\x3b\x58\x96\xc2\x46\xb0\x23\x57\x46\xca\x17\x01\xb9\x61\xc3\x42\x7d\x08\x1a\x0a\x51\xc1\x22\x6c\x27\x97\x1e\xd1\x2b\xbb\xba\xa7\x5c\x9b\xa1\x18\x0f\x68\x25\x08\x7f\x46\xe5\x0c\x52\xee\xb5\xfc\xea\x70\x65\xa0\xff\x00\xa8\xc9\x12\xe5\x37\x8a\xaf\x66\xa1\x50\x31\x61\x5e\x24\x33\x20\xfc\xe9\xa5\x84\x5b\x0a\x40\x2a\xb3\x6d\x70\x70\x60\xa4\xd0\x1e\x85\x26\x9b\xe7\x9b\x22\xbe\x65\x5d\x46\x22\xbd\xb4\x87\x36\xcb\x60\x94\x24\x36\xe7\x99\xf8\x77\x6f\x48\xb1\xee\x7f\xce\x8e\x34\xad\x56\xc0\x93\x6d\xd4\xd0\xa0\x50\xea\x43\xa0\xcd\x59\x39\x92\x44\xb3\x60\x59\xb1\xc3\x50\xed\x17\x85\x37\x08\x00\x03\x49\xa1\xdb\xc2\x00\xab\x8a\xe4\xf4\xdc\x7f\x19\x24\x65\xd3\xd2\x69\xef\x81\x7a\xac\x07\xfa\xf0\x20\xfc\x05\x08\x76\x07\xda\x10\x95\xa7\x32\x52\x32\xc3\x32\x23\x94\xed\xba\x30\x15\xd7\xf6\x21\x92\x60\x5e\x45\x0e\x84\xe1\xa8\x7e\x9b\x43\x43\xd4\x96\x7e\x9e\x6c\xef\xbe\xb4\x01\x74\x76\x21\x4a\x5c\x11\xb6\xbb\x62\xa5\xca\x25\x2c\x70\xbf\x47\x1a\xaf\x9a\x99\xcc\x2c\x93\x2a\xe4\xb6\x54\x0e\x22\x03\x26\xa8\x60\x8b\x70\xad\xbf\x74\x37\x9e\xa7\x47\x64\x5b\x59\x36\x54\x49\xe8\x8b\xf2\x25\xa6\xff\xf9\xaf\xff\x26\x45\xb8\xbb\x40\xdf\xdc\x43\x5d\x62\xff\x70\x84\xbd\xb6\x19\x80\xfd\xe0\xe8\x9a\x50\x72\x85\xc6\x94\xe1\xa1\x41\x5d\x4f\x5e\xd4\xf5\xa1\x5b\x3a\x83\xf2\x12\x0e\xcc\xa9\x9a\x1f\x81\x1a\x72\xa6\x0f\x88\x10\xe0\x0c\xff\x81\xca\xd0\x0b\x62\x0b\x10\x6a\xcb\xde\xa6\x72\x81\x7d\x29\x61\x81\x87\x87\x1d\x60\x71\xc5\x08\x16\xcf\xb6\x8e\x2a\xda\x57\x00\x25\xa0\xad\xe2\x88\x45\x21\x36\xdd\xd0\xd1\x0e\x57\xb8\x50\xb6\x6c\xef\xa3\x97\xb9\x44\x54\xb2\x90\xc7\x8b\x9c\xe4\xb2\xd4\xf7\xa3\xb9\x53\xc1\x43\x52\x30\x2a\x49\x6b\x74\x21\xd4\x34\x5b\xdf\x09\x6a\xcb\x64\xaf\x27\x2b\xb3\x50\xed\xea\xcc\x1a\xd4\x99\x91\x1d\x1b\xdf\x6a\xef\x67\xb7\x2b\x1d\x36\x9b\x0d\x7d\xd8\x85\x5c\x4f\x05\x5b\x6b\xef\x98\x26\x19\x7e\xa8\x91\x9d\x6f\xac\x4e\x07\x23\x97\x74\xf9\x4c\xcd\xb1\xe3\xcc\xaa\x51\x73\x00\xfb\x34\x04\x8a\xec\x21\xb6\x8e\x2b\x00\x69\x85\x7d\xf1\x30\xb5\x34\x29\x89\x44\xb4\xed\xb8\x9f\xbb\x07\xb8\xfb\x47\x41\x19\xed\x3d\xde\x4c\x8d\xe3\x32\x2e\xb5\x29\x4b\xc3\xd9\x99\x2a\x54\x1f\x0c\x5b\x2c\xea\x69\x16\xdd\xbd\xbb\x8f\x5a\x1d\xd8\x16\x2f\xec\x8a\xa1\x4f\xd1\x61\x34\x4f\xf3\xd2\xa4\x5b\xe5\x08\x66\xf3\x80\x96\x9f\xac\x80\xc8\x51\xca\x7a\xf3\xa8\xb6\x18\x67\x45\x1e\x2f\x50\xe7\xbc\xa9\xab\x6e\x5b\xb7\x49\x30\xef\x95\x94\xfa\x2c\xae\x62\x7b\x08\x50\x53\xfd\xd3\x31\x2a\x60\x1b\x41\x9c\x51\xca\x89\x23\x1b\x9d\xc6\x33\x93\x9a\x05\x12\x4f\x55\xe6\x16\x3d\xac\x27\xee\x33\xf1\xac\xc0\x23\xf5\xc4\x87\xb3\xce\xe1\x49\xe7\xe8\xf0\xb4\xe3\x3c\xc9\x7d\xc3\x8b\x72\xdc\x03\xe0\xf1\xb1\x93\x39\x0d\x14\xd3\x2e\x59\x31\x8d\xb7\x41\x8e\xcb\xc8\xcb\xa8\xb9\x92\x5a\x41\xd7\x80\x10\x1c\x6f\xd7\x45\x92\xf9\x1a\x41\x40\xf7\x46\xd0\xfe\xa7\xf1\x43\xa9\x97\x9b\x74\x49\x38\x10\x81\x2f\x23\xcb\xb2\x57\x54\xc9\x3c\x35\xfa\xe4\xc4\x29\x30\x0d\xaf\x47\xa2\x63\x53\xbb\x18\xb7\x3a\x5e\xe4\x6b\xc4\x0d\xe8\x33\x33\x37\x90\x6e\x3d\x3d\x06\x5a\xc9\x37\x4e\xd5\xca\xa7\xce\xe5\x1d\xee\xc9\xc5\x51\x42\x7c\xe0\xf3\x67\x76\xd4\xbc\xd4\x0a\x0f\x86\x90\xb6\xb6\xff\xb5\x30\x71\xca\x8b\xe4\x45\x20\x88\xb0\xc7\x2c\xdf\xbb\xf0\xd1\x7a\xf4\x79\x70\x7b\x8c\x28\x81\x1a\x69\x1c\x7a\x5d\xa5\x6e\xbd\xce\xf5\x20\xa5\x1a\xd7\xe6\x11\xc6\x6a\x5a\xa6\xe4\x33\x80\x26\x91\x75\xb0\xe2\x66\xf0\xab\x8d\x04\xa8\xf1\xaa\xf6\x55\x0b\x0b\x51\x18\x53\x70\x98\x79\x83\xaa\xab\xd4\x5d\xb7\xe5\x08\xf7\xed\x8e\x8b\x2a\x29\xab\x64\x8e\x03\x58\x19\x20\x58\xc4\x8b\x64\x41\x5b\xd0\x5f\x8d\xca\xdd\xef\x55\x2e\xea\x28\x3c\x79\x3a\x4a\x76\xed\x38\x3f\x93\x6e\xc3\xda\xf4\xed\xa8\x81\x63\x89\xe9\xbc\x55\x4b\x2f\xb4\x55\xf6\x5c\x9b\x00\x76\x28\x8c\xc4\xa7\x5a\x8f\x21\x58\x19\x6a\xd7\xca\xf0\x77\xd0\xbe\x75\xe1\xb9\x08\x02\xb3\xae\xee\x7b\x89\x9c\xf9\x1f\x04\x43\x7e\x9b\xc6\xff\x61\xd9\xf1\x4a\xfa\x87\x89\x29\x3b\x38\x28\xad\x62\xfa\xaa\x31\xc8\x5f\xbb\x38\xfd\xfc\xec\xdc\x85\x08\xe5\xdc\x09\xaf\x84\x28\xf9\x49\xc2\x1b\x40\x7e\x73\x2e\x82\x51\xe4\x2e\x95\xed\x06\x4f\x6d\x36\xbd\x8f\xc6\xa2\xe5\x74\x07\xe0\xb5\x54\x13\x06\x0c\xaf\x86\xb0\x6e\x6f\x91\x94\xa5\x61\x35\x9a\x28\x54\x00\x88\x80\xed\x63\xb5\xce\x0b\xbe\x63\x88\xd8\x06\xfc\xc6\x55\xd3\xd8\x0d\xbb\xeb\xbd\x56\x0a\xa4\xa1\x09\xba\x82\x03\xcd\x45\xaf\xe8\xc3\x00\xff\xa0\xba\x1a\x19\x3b\xa2\xea\x1c\xac\xa2\x01\xaf\xc8\x7a\xde\xd6\x12\x52\x81\x08\xf2\xdc\x1e\xea\x2c\xa4\xb1\xea\x2a\x95\x76\xf7\x5d\x72\x34\x09\x5c\xb3\x1c\x32\x4a\xe1\x8a\x75\x21\x67\x04\xb8\x9e\x01\xaa\xd6\x5e\x2e\xbf\x7b\xf3\xe2\x77\x2f\x06\x7d\xee\xc0\x60\x63\x2f\x8a\x38\xd3\xd7\x71\x91\x26\xf1\x8a\x8b\xde\xe9\xcf\xfd\x7c\x93\xcd\x93\xd4\xfe\xf3\xe4\x44\x21\xb3\xb1\x3d\xc8\x19\xc6\x4e\x5c\x87\x9e\x44\x27\x5f\xba\xe3\x00\xd9\xd9\xed\x23\x17\x1e\x92\x55\x6e\xe6\x73\x63\x16\x20\x70\x58\xea\x07\x93\xa6\xf6\x43\xd8\x05\x69\xb9\x08\xab\xc5\x11\xef\x6f\xd1\xd8\xa4\x73\x12\xa4\xfe\xbb\x4a\xb1\xe0\x6b\xcb\x16\xf1\xfb\xe3\x31\x6f\x96\xd9\x3f\x9a\xc7\x11\x6e\xed\x3b\x72\x03\x83\x1a\x5c\x13\x67\x49\x76\x2b\x7c\xa0\x53\xf0\x81\x26\xc0\xbc\x05\xb0\x89\xd8\x5f\x05\x18\x54\x01\x16\xaa\xc9\x8e\xc3\xea\x71\xe3\xb2\xa6\x66\x43\xb2\xc6\xc2\x37\x8c\x71\x58\x1e\x50\xc5\x52\x60\xb4\x23\x9d\xe5\xd9\x91\x2b\x53\x42\x19\x44\xfb\x2b\x27\xd8\x1d\x29\x11\xdc\x95\x72\x38\x81\xb0\x73\x7d\xe0\x92\x1d\x7e\x97\xaa\xf2\x77\x2c\xc8\xaf\xb5\xee\x75\xdd\x5e\xc7\x8d\x80\x67\x4f\xeb\x57\x23\xc9\xd7\xa3\x89\xaf\x07\xd5\x1d\xfd\x03\x3f\x74\xd9\x07\x89\xfc\x93\x23\xf1\xe8\xba\x69\x8f\x44\x4e\xbb\x2d\x8a\xbd\x7a\xe8\xe4\xe6\xf8\x6f\xab\xba\x3d\xd2\xb8\x09\xa2\xd6\x5b\xd8\x65\xd8\xe0\xf3\x48\xfc\x01\xba\x46\x39\xc5\x1f\xd9\x6c\x5e\xd9\xc7\x81\xff\xb1\xab\x50\xa7\xcb\xa3\xf1\x12\x05\xd3\xd0\x1c\x40\xcd\x9b\x76\x13\x20\xd9\x61\xaf\xbe\x39\x8c\x3b\x58\x5e\x77\x59\x97\xe9\x7e\xef\xf5\xbe\xeb\xbc\x7b\x44\x94\x2d\x8c\x90\xbc\xf0\xd9\x8a\x12\xba\xf5\x84\xd5\xf3\xb3\x24\xcd\x49\x8f\x3d\x3c\xd2\x77\xb5\x34\x50\x29\x5f\xe4\xaa\xcc\x6b\x8d\x26\xf9\x7a\x36\x1a\xad\x11\x4a\xd8\xd6\x5c\xc7\x65\x69\x0a\x64\xc4\x74\x51\x4a\x77\x61\xab\x2a\x67\x16\xe1\x2f\x5c\x2d\xc2\x91\x95\xa7\x34\x46\x8e\x8d\x6a\x5c\x92\xfe\x06\x7a\xd2\xc3\xbc\x51\xaf\x1e\x73\x25\x9e\xe8\xe7\x94\x89\x5d\x85\x8a\x7a\x54\x9b\x7e\x9f\x96\x62\x3e\x42\xef\xfe\xc4\x9d\xc3\x57\x1d\x9d\x99\x7b\xac\x05\xb0\x5b\xb3\x6c\x44\x13\xdc\xfa\x7d\xdd\xd5\x67\xf9\x43\x56\x56\x85\x89\x57\xa2\x30\xaa\xab\x54\xaf\xab\x47\x80\x98\x75\x85\x38\x6e\xd2\xec\x49\xdb\xb4\xbe\x35\xb0\xc5\x8b\x3a\xb1\x9a\x3d\xe6\x63\x19\xbb\x0a\xc8\x98\x21\xae\xf9\xc6\x47\x26\xac\x51\xef\xff\xd4\x70\xc1\x87\xae\xee\x79\x9d\xa3\x5d\x6f\xb7\xfd\x6d\x9c\x69\xf5\xee\x02\xf7\x7a\x3d\xa6\xe1\x24\x08\xbf\xbb\xcb\xea\x89\xa7\x7f\xe3\x95\x7e\x28\x44\x4e\x99\x01\xd8\x8d\xf8\x8e\x8b\xe6\x74\x95\xea\x83\x72\xd7\x42\xae\x07\xa9\xd2\xff\x98\xb4\xbb\x17\x8c\x42\xea\x11\xc2\x81\x7a\x8d\x3e\x39\x21\xa8\x88\xc7\x05\x35\xdb\x5d\x1e\xb8\x72\x1e\x78\x95\x47\xbb\x42\x5d\xf6\xa6\x40\xc2\x04\xd7\xe2\x52\xd7\x25\xe1\xdd\x2a\xa4\xe1\x23\x93\x7a\xe7\x6a\x95\x97\xd7\x1b\x18\x18\x93\x2d\xf2\xa2\x24\x61\xf3\x2b\x2a\x80\x4d\xb2\xd6\xe3\x5e\x8a\x84\x51\xca\x64\x46\xbf\x2d\x36\xa8\xc1\x17\x66\xd8\xe8\xac\xc3\x11\x85\xe8\x51\x5c\x71\xc0\x3b\x42\xc9\x7b\xfc\x45\xab\xab\x23\xc3\x84\x11\x6b\x3b\x11\xa3\x2a\xc6\x17\x51\x72\xda\x1e\xdb\xd4\x0d\x0c\xa6\xb2\x2b\x97\x2f\x97\x09\xe4\x72\x10\xdd\xaa\x66\xdb\xd0\xdc\x71\xde\x65\x29\xcb\xdd\x2b\x5f\x4f\x26\x04\xaa\x75\x5c\xfa\xba\xee\x24\x73\x16\xda\x4b\x7b\x36\x9d\x74\x0e\x7b\x9d\xc3\xa4\x83\x27\xd0\xac\xab\x47\x32\xe9\x0d\x26\xda\x65\x5e\xc4\xa9\x2b\x9c\x66\x77\xc5\xf9\x9f\x28\xe4\x44\xf5\x46\x1e\x2e\xd0\x50\x6c\x6a\x38\x5e\xd6\xe6\x2a\xb0\x96\x18\x7e\x0f\x5f\x5f\x17\xc9\x7d\x3c\xdf\xba\xb0\x05\x15\xd8\x90\xbf\xb9\x36\x45\x69\x17\xb4\xbd\x6f\xb0\x41\xef\xbd\x70\x68\x4d\xd4\x9d\x80\x23\xb5\x71\x6b\xbb\xdf\x54\xf3\x7e\x93\x79\x85\xb6\x28\xb4\xcf\x62\xa3\x97\xdc\x26\xd2\x07\x56\x81\x7e\xc2\xd5\x8f\x35\x11\xb0\x8d\x39\x96\x8e\x16\xda\x35\x16\x1e\xc2\xc5\xee\x74\x9f\x44\xe4\x6e\xc7\x38\x37\x8f\xd5\x97\xf5\x84\xcf\x63\xa3\xb3\x95\xfc\x4c\xc0\xba\x44\x16\x74\x62\x4a\x27\x27\xe7\x72\x75\xbb\xf6\xb6\x8f\x43\x92\x09\x23\xcb\x1b\x25\x3b\x1e\xf2\x3a\xc1\x91\x31\x4f\x4c\xb5\xf5\x65\x82\xc0\xa4\x94\x55\xf6\x5e\xa7\xf6\x21\xc5\x8f\xdd\x16\x55\x5e\x10\xeb\xe8\x6a\xbd\x49\xcb\xbc\xd8\x2a\xaf\x18\x5e\xce\xef\xcc\x0a\xf4\x6a\xc1\xac\xa2\x8a\xbf\xb8\x34\x35\x9d\x33\xcf\x7d\xe0\xa4\x4f\x5d\xf7\x95\xe8\x3e\xae\x08\x1e\x03\xe1\xe8\xbc\x94\xd7\xaf\xee\x4b\x9b\x14\x8e\x87\x47\x06\xc7\x5a\xa2\xbe\x0d\x50\x41\x57\x0b\xe0\x38\xf8\x8e\xaa\x1b\xbc\x71\x57\x86\xb1\x70\xb7\x0e\x21\xbf\xb6\xcf\xa7\xd0\x87\x81\x3f\xef\xa9\x4b\xf3\x62\x45\xb9\xcb\xd5\xa6\xac\xde\x81\xc9\x51\x18\x22\xd0\x97\x30\xa2\x64\x49\xa5\x75\xac\x37\xdf\xd8\x1e\x2e\x5b\xd0\x38\x11\xdf\x41\x4c\x8b\xd9\xeb\xe6\x81\x86\x2d\x81\xac\x20\x9a\xb3\x2f\x76\xe4\x62\x99\xa5\x7a\xf4\xf4\x8b\x76\x4a\xc0\x73\x9e\xdc\xd7\x1a\xb8\xe6\x8b\x11\x9a\x6d\xf5\xba\x34\x9b\x45\x9e\x6d\x57\x70\xb5\xb9\x17\x76\xde\x0b\x1f\x4c\x6b\x9d\x24\x5d\x22\xc0\x94\x6c\x9e\x8d\x0f\xc1\xa7\x24\xb9\xa7\x27\x2a\x6f\xd9\xbc\xf5\xaf\xdf\xef\xfb\xb6\x69\xa7\x3f\x4e\x4c\xf9\x5e\x29\xf8\xe6\xcd\x78\x08\x45\x30\xdb\xb5\x29\xd2\x24\xfb\xca\xdf\x6b\x8e\x73\x78\x9a\x7a\x76\x40\x2e\x00\xb5\x03\xf9\x1e\x0c\x36\x47\xbc\x90\xe0\xd2\x73\x0b\x6a\xf7\x04\xd2\xaa\x8a\x33\x27\x01\x88\xfc\x3a\x48\x37\x6f\xee\x93\x7c\x53\x86\x46\x36\xf9\xbc\x7d\xf1\xba\x9d\x89\xb6\xc7\x8f\x44\x74\x36\x99\x77\x07\xcd\xd4\x6f\xf6\x26\xa3\xab\xdd\xb4\x0d\x54\xab\x17\x1b\x72\x22\x73\xf9\x75\x68\xed\x49\xff\x92\x2e\xdd\x9d\x8b\x52\x05\x8c\x0f\x4c\xa0\x0d\x01\x1d\x26\x42\xce\xa0\xad\x2e\x8f\xfb\xc8\x6e\xef\xd6\xc4\x50\x1c\xf1\xbe\x78\xb5\x28\xcb\xaf\xb5\x7c\xc6\x94\x30\x50\x1d\xa3\xda\x96\x4f\x6c\x0f\x4e\x64\xac\x21\x82\x61\xae\x98\xba\x33\x1e\x3a\x22\x81\xa3\x70\x1f\x0d\x97\x8d\xfd\xe7\x8e\x0f\x7f\x08\x31\xd5\x28\xec\xf8\x25\x85\xb4\x3c\x62\x96\x1f\xaf\x66\xdb\xfa\x08\x1f\xf6\x3a\x4f\x5a\xc3\xa4\xd3\xed\xa3\xff\x82\x3d\x90\x1f\xb0\x7b\x2a\x23\x5e\xf4\xf0\x00\xd5\x30\xfe\xbf\x20\x1b\x2f\x06\x64\xaa\x3a\x16\xd3\xd5\x69\xa5\x65\xee\xac\xfe\x13\xf4\xc8\xf7\xb8\x06\x8e\xcd\x2e\x6e\x26\x3d\x1d\x49\x01\xd3\x06\x01\x75\x51\x3d\x31\x42\x4b\x59\x70\x94\x42\x75\x21\xfa\x00\x3b\x13\xb6\x62\xad\xdb\x06\xfc\x8c\xed\x23\xba\xa5\x9a\x1e\x4f\xcb\x36\x82\xa2\x33\x1a\xa7\x5f\x64\xcf\xb4\x84\xc6\x5e\x7e\x8f\x6b\xa5\x1f\x73\xad\xd4\x53\x5d\x2b\x1d\xb8\x56\x8d\x95\x44\xa9\x05\x74\xa7\x1a\x46\x45\x2d\x13\xe4\x7d\xce\xfd\x1e\x26\x2f\xe5\x57\x18\xac\xdd\x1d\x65\x47\xd9\xaf\xfa\x19\xe3\x3c\x5f\x5c\x08\xfb\xa2\xf4\x41\x8a\x48\x3d\x9a\x22\x7a\x07\x80\x99\xe5\x9e\x28\x64\x10\x61\x39\xe9\xc8\xc0\x6f\x25\xe9\x45\xcd\x37\x44\x2b\x29\x80\xb3\xee\x08\x90\x82\x85\x68\x97\xbe\x28\xe8\x0c\x39\x2e\x50\xe5\x94\x92\x8a\xb0\xb1\x38\xb4\xff\x1e\x0e\x10\x3a\x06\x1c\x95\xdb\x13\x1e\xc8\x0f\xf0\x4f\x4e\x32\x15\xfb\x5f\x07\xab\x15\xf0\x81\x7b\x73\xfd\x4c\x0b\xe2\x1e\xa0\xbe\xeb\x01\xfa\x90\x9d\x90\x04\x5a\xe2\xf2\x06\xdc\xba\x8e\x4a\xca\xc6\xb2\x94\x91\xb9\x65\x2d\x8e\xe6\xcf\xc9\x59\x87\xae\xef\xb9\x38\x3e\x64\x5c\x77\xff\x21\x1b\x9c\xb1\x34\xb4\xea\xa9\x73\x15\x0c\x09\x49\x83\xed\x5a\x53\x41\xe8\xee\x15\x5a\xb7\x4c\xcc\x2c\x8b\x4e\x0a\x03\x59\x2c\x5c\xc6\x3b\x48\x6b\x6a\x01\x88\x16\x6c\x50\xb8\x7b\x14\x21\x9f\xf7\x63\x23\xb8\x71\xaf\x11\x61\x16\x58\x7b\x9f\x7d\x15\x48\x18\x91\xd7\xa0\xcb\x4c\xc5\x18\x08\x45\xbb\x41\xd2\x3e\xcf\xe2\xc6\xec\xca\x29\xf9\x5e\x55\xfc\xd5\x25\xe1\xc4\xbd\xbc\xc3\xc7\x56\x61\x6c\x62\x89\x26\x69\xbb\xf9\x57\x1e\x25\xd8\xc0\xb8\x3c\x72\x09\x47\x21\x04\xae\xb2\xbc\xa1\xa5\x9e\x17\xb2\xc6\x85\x0c\xc5\xaf\x09\x1e\xed\x73\x53\x64\x3b\x01\x7c\x91\x62\xdf\x93\x9c\xac\x08\x02\x3a\x89\x59\x44\xde\x89\xf4\xc9\x7a\x52\x42\x62\x1b\xa6\x15\x9f\xa3\xc2\xa6\x54\x49\x65\xdb\xbf\x42\x2e\xd2\x8a\x86\x39\xd2\xcb\xa4\xca\xec\x18\x23\xb1\xa6\x60\xbb\xa1\x3d\x82\x29\x27\x49\x18\x15\x29\x02\xad\xd8\xc7\xa6\xe8\xfb\x0b\xfa\x70\x7b\x6b\xd8\x0b\x6d\x3e\xdf\x14\x10\x22\x61\xa4\x2c\x0c\x15\xf0\x40\x6a\xff\x00\x65\x8a\x22\x2f\x84\xef\x4d\xa2\x54\x90\x41\x20\xc2\x35\xd0\xae\x41\x28\x2e\x9e\xee\xde\x7d\x28\x43\xff\x41\x71\xb8\x81\x29\x4e\x99\xdc\xce\x67\xa5\x68\xfb\x08\x0f\x84\x6f\x50\x99\x0f\x42\x73\x6b\x57\x30\x22\xc9\x74\x96\x6b\x50\xe6\xc2\x72\xf0\x60\x5d\xd5\x35\xdd\x55\x9b\x8c\xfb\xe1\x23\xe0\xaa\xcc\xdc\xa6\xc9\xad\x1d\xa4\x4e\x88\x5e\x74\xfa\xef\x10\xa3\x08\x94\xdc\xf9\x57\x5e\xd3\x3d\x0a\x15\xdd\x23\xbd\xde\x64\x09\xd6\xc6\x98\x6f\x66\xb5\x4e\xe3\x62\x1b\x79\x12\xa0\x34\x2f\x21\x07\x3c\xcf\x01\x96\x6d\xbe\xad\x09\x40\x2d\x0a\xa3\x48\x0c\x5e\xdb\x06\xb7\xc7\xc7\x55\xbe\xff\xd2\x8c\x60\xe4\x58\x60\x21\xc0\x55\x90\xec\x2c\x32\x82\xd0\x05\x86\xc3\x8e\x15\x5a\x2c\x85\xf8\x84\x86\xf2\x5a\x89\xc5\xb0\x5a\xdf\xcd\x97\x7b\x85\xf2\xb1\xbb\x97\x8a\xc0\x1e\x05\x4b\x45\xb9\xa5\x32\x47\x5b\x78\x97\x57\x0b\x87\x46\x1a\x9c\x73\xbe\x15\x2e\xe4\x89\x34\xd4\xa8\x60\x5f\x03\x34\x4b\xa0\x2a\xa2\xc7\x76\x05\x11\x41\xe6\x96\x41\x7d\x00\x3b\xfc\x96\xac\x80\xbd\x25\xce\xec\xae\xcb\xd3\x4d\x15\x34\x14\x78\x2d\xe3\xe4\x1e\xdb\x1c\xd4\xc3\x89\x73\xfc\x0d\x9c\xe3\x53\x43\x65\x8d\x53\x22\x97\x44\x2f\x29\xde\xaf\x31\xcb\xd6\x91\x4f\x73\xee\x80\xd3\x32\x6e\xd8\xf9\xc5\x76\xfe\x04\x79\x24\x5d\xaf\x4b\x22\x61\x09\x2f\xe6\xf6\xbc\x7b\x86\x77\x5f\x93\x96\xb3\xd6\x56\xc7\x96\x19\x26\x5c\xf0\x14\xc0\x75\xe4\x1f\x24\x2b\x5b\x9a\x17\x07\x50\x5f\x39\xf2\xcd\x1a\x67\xf9\x1b\xf4\xc5\xec\xd5\x0c\x9c\xbd\x95\x29\xdf\x81\x2b\x15\xe6\x79\x62\x69\x11\xe0\x8b\xee\x93\xdc\x4b\x9f\xcd\x37\x10\x92\xf7\xd1\xf2\xca\xfd\x16\x84\x37\x92\x4c\xbf\x3c\xd6\x0b\x28\x25\x23\x1c\x3b\x1f\xa3\xce\x3f\x75\x0f\x7c\x6f\xcd\x14\x8a\xde\x9c\x76\x11\x97\x4d\x97\x90\x6f\x26\x80\x4c\xea\x10\x67\x58\xf8\x4f\x36\x54\xde\x1c\xce\x3a\x22\x99\x8e\x12\x88\x22\x86\x29\xcf\x02\xbb\xcf\x90\x9f\x26\xd7\xa5\x31\x5f\xad\x7f\x6d\x16\xbc\x9a\xa0\x43\xae\xfd\xf5\x34\x5d\x88\x91\xdd\xdf\xbc\xda\x2b\xc1\xc1\x25\x86\xed\x56\x84\x04\x95\x2d\xb1\xc4\x43\x6b\x8a\xaa\xd0\x65\x95\xaf\x9b\x44\xa1\xcd\xa7\x91\x6c\x63\x95\xac\x8c\xc8\x0f\xb8\xa4\x94\xe3\x77\xf5\xab\xb3\x3d\xb2\xa3\xb5\x36\x5d\x41\x54\x1e\xe9\xd7\x91\x7e\x13\xe9\xb7\x68\xae\xfc\x56\x97\x9b\xe2\x1e\xaa\x10\xfd\xbe\xdd\x9d\xdb\xe4\xf9\x7a\x0b\x7b\x1e\xf3\x2c\x53\x97\x1d\x0d\x02\xc7\x71\x2d\x2b\x8f\x87\x17\x21\x56\x5d\x05\xc9\x53\x3c\x51\x09\xfa\xf3\x90\x30\x0c\xb9\x7c\x01\xfa\x5b\x30\x04\x7d\x04\x1a\x52\x22\x0b\x82\x9f\xdb\x17\x20\xf0\x9f\xc2\x06\xbe\x98\x31\xc9\x6e\xa9\x3c\xd8\x01\x55\x45\xf1\x71\x7b\x32\x0c\xca\x00\xab\xd8\x13\x79\x42\x16\xc3\xcd\x3a\x22\xc4\xb2\x50\x75\x84\x76\xd5\xf7\xa1\xce\x79\xa8\x7f\x0b\x43\x3d\xe4\x13\x5f\x1c\xac\x8f\xee\xae\x1d\x60\x15\x22\xcc\xe6\xf9\x50\xb5\x0b\xa5\x02\x21\x5f\x74\x2f\xe1\x62\x8a\x5c\x0a\x34\x12\x31\x84\x20\xf3\xca\x3a\x3f\x6a\x67\xcc\x9b\x18\x3c\x37\xe9\x42\xa7\xf1\x83\xbd\x4c\xb7\x58\xba\x45\xc2\xf3\xd6\x64\xa8\x83\x0d\x5b\x01\x5c\xfb\x8d\x2f\x8e\xbf\xe6\xf7\x49\xb9\x7b\x25\x63\xe5\x89\x3d\x36\x54\x40\xed\x08\xc7\xaf\xbb\x65\xeb\xf9\x75\x2c\x18\x71\xca\x36\x49\x96\xac\x36\xab\xd6\xb4\x19\xe0\x57\x92\x4a\x8b\x47\xbb\x82\x45\xdf\x36\x22\xd7\x83\x38\x26\x17\xa3\xc8\xf7\x97\x06\x05\x22\x29\x8f\xdf\xe2\x90\xd1\xb8\xe1\x79\xc9\x6b\xd6\xbd\xd4\x99\x45\x18\xc5\x5c\xb1\x4e\x67\x3b\xf8\x68\x0e\x09\x69\xbc\x88\xc5\xa1\xb5\x6b\x04\x99\xe9\x08\xec\x03\xac\x12\xce\x72\xb8\x7f\x41\x7f\xde\x5d\xc1\x60\x63\x32\xb4\x77\xc7\x4e\x05\x1e\xc0\xc6\xfd\xb1\xf8\x99\x19\xf1\x46\xb5\x97\xb0\xf1\xec\x05\x16\x71\x16\x0e\xcc\x9a\x88\x16\x4c\x72\x9f\xa4\xe6\x96\xec\xb1\x04\x0e\x19\xe4\xd8\x0d\x70\xc1\x01\x9a\x02\x6f\x9b\x20\x7c\xc0\x88\x0b\x87\xa3\xb4\x8b\xc2\xbb\x7b\x7f\xd8\x14\x49\xb9\x48\xe6\x8c\x5c\x77\xc8\xa3\x6e\x4b\xb1\x9f\x63\x8d\x00\x99\x0c\x64\x6d\x6b\x10\x01\xc0\x18\xd9\x75\xc0\x07\x5a\xd4\x84\x99\xdb\x71\x31\x29\x65\xe3\xb0\x2b\x54\xc3\xdb\xf2\x40\x84\x5f\x71\x22\xa2\x72\x24\x6d\x78\x70\xc1\x44\xe4\xa4\xb9\x0f\x9c\xa3\x6e\x21\x08\xc5\x25\x3b\x02\x07\x6e\x26\x0f\x08\xc8\xf6\x8d\x0f\xc2\xc7\xd9\x0d\x60\x7b\x2e\xe8\x94\x0f\x71\xbc\x8b\x1c\x88\xc9\x5d\x74\x50\xf5\xfb\xc7\xbc\x2e\xce\xf0\x6f\x67\x86\xf3\x31\x0c\x10\x74\x76\x26\xe7\xba\x05\xed\x28\x67\x6f\x80\x03\x3b\xae\x44\xe7\x4b\x24\x41\x70\x35\xda\x8f\x11\x6e\xc0\x8c\xca\x02\x7d\x4f\xba\x48\xab\xbb\xf9\x80\x3c\x4d\xe6\x76\x99\x79\x3e\xba\x1d\xa5\x43\xfc\xc9\xa8\x39\x7a\xde\x6e\x62\x10\x17\xbc\x4c\xb8\x59\x3e\xf3\xde\xa4\x27\x51\x01\xbd\xb3\xff\x64\x6e\x5d\xbe\xdb\xbc\x95\x68\x84\x0f\x1e\x58\x3f\x45\x62\xf7\x13\x52\x3d\x2a\xda\xee\x8f\x95\x07\x61\x9d\x63\x46\x57\x1c\xd6\x8e\xd9\x1b\x24\xf3\x38\xb4\xa6\x24\x07\x25\x50\xda\x16\x6d\xd0\x87\xbd\xd7\xbd\x0a\xaf\x7b\x11\x7b\xa1\xf1\x6a\xd4\x46\xef\xbd\x68\xf1\x8a\xb2\x97\x3f\xd0\x76\xfa\xb9\x08\x38\x25\xaa\x06\xb7\x45\xd9\xb6\xe3\x3d\xa4\xa7\x8a\xe7\xbb\xcb\xc8\x7e\x3e\xe9\xd1\xf3\x8f\xfb\xe9\xbe\xe8\xad\xe3\xf9\x9d\x39\x3a\xfd\xa5\xd8\x9f\x1e\xe3\x7f\x3a\x7d\x75\xf2\xea\x6d\x9d\xff\xe9\xe5\xc9\xcb\x67\xfe\xa7\x5f\xe3\x07\x67\xdf\x57\xc8\xff\x48\x79\xc4\xd3\xee\x71\xa4\xff\x3e\xce\x36\x71\xb1\xd5\x76\x66\x94\xba\xab\xaa\xf5\xbb\x17\x2f\x1e\x1e\x1e\xba\x31\x7c\x0b\x0e\x64\xde\xc8\x2f\xf4\x4e\xf1\xfa\x9b\xc9\x00\xd8\xf1\xc6\xa3\xb3\x1b\x60\xc5\x8b\x94\xfd\x94\x94\xb2\x07\x07\xed\xa4\x5b\x2b\xb4\x46\x87\x5b\x29\xba\x44\xcd\x01\x19\x85\x2b\x13\x67\xbb\x11\xa9\xc4\x35\x13\xd5\xca\x70\x02\x31\x35\x28\x15\xb3\xb7\x2b\x15\xfb\x6f\xa5\x86\x15\xb3\x42\xff\xce\x19\x7d\x8b\x7c\xbe\x01\x70\x62\xa3\x4d\x79\xd1\x68\x94\xa0\x7e\x78\xc8\x30\x5a\x4b\xd5\x1a\x75\x74\xb1\xf8\xac\xc2\xcf\x72\x3d\xb8\x2b\x79\x12\x5e\x44\xf0\x72\x30\xac\x06\xf0\xd8\x46\x03\x36\x99\xc8\x9f\x90\x8e\x26\xb7\x80\x64\x32\xa8\x32\xc5\xfe\x32\x31\xcc\x8b\x84\xca\x49\x88\xfb\xa3\x7f\xa4\xd0\x54\x74\x0e\x0b\xe3\x24\xf1\xed\x19\xec\x94\x96\x28\xba\x14\x57\xf4\x92\xae\x4b\xcc\x34\xa0\xd8\x5e\xc7\x29\xd2\x07\xf4\x7d\x16\xe6\x3f\x4c\x3a\xf8\xa5\xfc\x01\x5c\x7c\x08\xd4\x2a\x41\x9e\x1f\xa1\x16\x33\x87\x95\xf0\x97\x64\x41\xae\xe2\x2c\xbe\x25\xc5\x04\x8a\x7f\x62\x63\x5c\xd0\x5c\x01\x37\x10\xf2\x1d\x04\xd1\x62\xe8\xdc\x61\x92\x74\x70\xba\x80\xd2\x29\x5f\xea\x65\xb2\xac\x80\x89\x64\x6e\x1f\x7a\xf8\xfa\xf8\xff\xe9\xa0\x9a\x46\xe1\xbc\xbb\x7c\x53\xf1\x85\x8a\x26\x52\xc9\xcf\x4a\x3a\x44\x57\x00\xc0\xcf\xe0\xb9\xa2\x6d\x72\x42\xbf\xe4\x9b\x03\xd0\x0b\xb1\xff\x55\x1c\x74\xe4\x9c\x12\xb6\xc6\x17\xff\xc8\xd9\x97\x25\x40\x92\x37\x85\xf3\xc7\x35\x59\x7d\xf9\xce\x09\x40\x3d\x0e\xf0\x8e\xae\xad\xa1\x9a\x5c\x98\x97\x08\x0b\xb1\x3c\xc2\xea\x57\x9c\x74\x14\xe5\x86\x8e\x77\x35\xd0\x94\xe3\xdd\x84\x41\x16\xfc\x93\xcb\xee\x2f\x93\xdb\x0d\x92\x3e\x28\x90\xfa\x92\x0d\x1e\x01\x98\xae\xd9\x60\x50\x25\xb1\xbf\xab\x31\x92\xad\xcc\xfc\x2e\xc6\x0a\x03\x47\x75\x40\x41\xee\xc2\x71\x23\xb0\x90\xa4\xc6\xe1\x80\x07\x49\x67\xa6\xa5\x5b\x24\xbd\xb5\x20\x21\x27\x85\xdd\x42\x6e\x59\xfb\x91\xa0\x83\xae\x67\x8e\x23\xd9\x11\x00\x63\x81\x48\xb5\x5d\x87\xdd\xfc\x9c\x17\x5f\x1b\x9b\x1a\x34\x64\x6c\x3b\x1d\xf1\x98\xcf\x07\x25\x19\x37\x3e\x2f\x34\x0e\x12\x76\x43\x41\x5c\xa1\x85\xf8\x42\xa0\xa7\x4a\x07\xc3\xc2\x48\x54\x53\x8c\x1f\xf0\x0a\x3e\x95\xb6\x60\xda\xf4\xaa\x8a\x81\x05\x81\xf5\x00\x6c\x0b\x0f\x81\xc2\x09\x10\x4a\x3a\x09\xc0\xca\x88\x61\x58\xaf\x4d\xb6\x48\xbe\x29\xa4\x57\x91\xbd\x3e\xf3\x4a\x45\x76\x00\xca\x83\xfa\x0c\x63\x55\xee\xe3\x7d\xe6\x33\xd4\x41\x49\x0e\xf3\x22\x20\xd8\xc0\x73\xe6\x33\x8b\x37\xdb\xb5\x2d\x44\xd1\x16\x49\x95\x17\xc8\xbd\x83\x01\x8a\x32\x52\x10\xa1\xe0\x15\x6f\xd2\x78\x46\x3c\x87\xa5\x4f\x37\xd6\x0a\x49\x5c\xda\x33\x12\x22\x16\x76\x29\xa8\x80\x4b\x2e\x9c\x51\x6f\x62\x37\x4e\x4e\x37\x5f\x7e\x98\x14\x0c\x93\x08\x28\x32\x62\x01\x49\xea\x08\x52\x08\xae\x20\xc6\xe5\x40\x55\xa7\xc8\x57\x48\xbf\x65\x40\xe9\x15\x10\x3d\x87\x28\x3b\x07\xf3\x9f\xc5\x2b\xe3\xe0\x56\x9e\xee\x1f\x42\x04\xc1\xb0\xd5\xe7\x4b\x93\x8c\xbc\x9c\xd3\xbe\x60\xa6\x68\x9d\xcf\xfa\x8a\x16\xc5\x41\x52\x5d\xc0\x51\xa8\x2f\xc3\x36\x40\xe5\x6e\x30\xee\x76\x5d\x2e\xd8\x12\x20\x75\x6c\xfc\x7c\x5e\x34\xc7\xce\x2b\xdf\xd3\x9a\x41\x91\x5b\x08\xc2\xa6\x5b\x5d\x6e\x66\xe4\xb8\x56\xb9\x8f\xe0\x2e\xe1\x4e\x82\xf2\x42\x40\x32\x29\xd7\xa4\xfa\xa5\xee\x0d\x00\x08\xf1\xee\x3b\xc5\x85\xc3\x67\xcf\x4d\x78\xb1\x5d\xbb\x33\x73\x17\xa7\x4b\x0f\x86\x08\x9e\xbc\x67\xbd\x88\x9b\x56\x1d\xb8\x7e\xf0\x5d\xeb\x0e\xcc\x7c\x89\x21\x91\x22\xcf\x92\x79\x64\xc7\x79\x46\xf4\x6c\x2c\x5a\x10\x14\x1f\xab\xd2\x31\xa2\x87\x05\x0c\x49\x55\x06\x99\x7e\xd0\x90\xde\x77\x86\xaa\xe0\xb9\xb6\xa7\xbe\x1d\x7a\x15\x27\xc0\xd6\x90\x26\x48\x7d\x25\x74\xfc\xd8\xe8\x40\x9d\x8e\x92\xd0\x9f\x65\xb9\x01\xef\x7e\xfe\xd5\x6b\x1d\x72\xcc\xaa\x30\x64\x1d\x38\x4b\x46\x0e\x6b\xad\xf4\x74\x19\x8e\x27\x38\xb8\x49\x39\xdf\x94\x25\x73\x8a\x27\x2b\x38\xd3\x68\x85\x7e\x86\x33\xc9\x76\xcf\x8b\x51\x84\x23\xc6\x2b\x6b\x9e\x67\xe5\x3a\x99\x6f\x50\x23\x09\xa9\xba\x02\x3b\x44\x56\x7f\x24\x19\x8c\x3f\x81\x96\xdb\x0c\xc5\xb8\xd4\x07\x57\x10\x16\x93\x7b\xac\x7b\xd0\xb6\xf9\x6a\x36\xaa\xaf\x6a\xa4\x1d\xb4\x67\x59\xba\xa1\x52\xa8\x47\xbd\xaa\xbd\xd0\x67\xa4\x9d\x42\xdf\x6c\x1b\xbe\xa1\xdc\xcc\x28\xbb\x0e\x82\x1b\x8e\x1e\xdf\xa5\xe1\x78\x1c\x11\x93\xf8\x11\x69\xe0\x96\x22\xff\xe9\x6a\x96\xbf\xa3\xc2\x58\xb9\x03\x13\x74\xb6\xc5\x58\xe8\xb0\xbc\x98\x98\x16\x62\x6b\x3c\xad\x4d\xb5\xb1\xcb\x5f\x14\x1b\xd7\x6a\x89\xb3\xfc\x08\x05\x7a\xeb\x65\xc8\xb2\xc8\xd8\xef\x52\x51\x6e\x2c\xc0\x6a\xeb\xc2\x1e\xc7\x46\x35\x4e\x50\xbb\x1c\x31\x3e\x82\x42\xa1\x92\x2f\xc0\xcb\xfd\x86\xa2\x90\xa1\x46\xb4\x0a\x8e\x47\xb0\x35\x1b\x6f\xd9\x75\x73\x22\x5e\xd2\x8d\x3f\x55\xac\xfc\x9c\xc1\x77\xb7\x95\xfa\xf5\x07\xff\x10\x39\x51\x40\xc9\xb1\x8a\x1d\x01\x89\xd7\xe8\xe9\x90\xbc\x8d\x12\x93\xb3\x8a\xbf\x9a\xc8\x0b\x1f\x45\xe8\x3f\x3a\x1d\xe1\xd2\xa4\x69\x44\xff\x8b\xd4\x0b\x91\x67\x7d\x85\x10\x27\x9a\x97\x64\x5b\x7d\x66\x43\xc5\x1a\xbe\x00\xc5\xa8\xa5\xfb\x81\xe4\xd0\xe9\x4a\x90\x26\x19\xd2\xed\x2a\x5f\xc8\x6e\x77\x12\x7c\x5d\x8e\x9f\x3b\xd3\x38\xd1\x92\xc0\xae\x42\xe4\x11\xbb\x95\x49\x11\x6c\xd2\xc3\xb2\xa3\xe2\x14\x62\xdd\x24\xe8\xb3\x9a\x05\x29\xce\x96\x2f\x78\x30\x1f\xac\x26\xc7\x77\x62\x1b\xa4\x1a\x9f\x05\xd9\x4c\xba\x63\x5c\xdd\x4a\xc2\x59\x09\xed\x54\xd7\x2a\x82\xd7\xe9\xf8\x36\xb6\x7f\x06\x61\x10\x72\x4d\x45\xa1\x46\xac\xe7\x45\x5e\x96\x47\xa8\x61\x0f\x69\x98\x0d\x28\x44\xc3\xbf\x01\xe9\x91\xc6\x0f\xe5\x26\xa9\x3a\xa8\xdd\xe7\xa2\xd6\xae\xc1\x80\xd4\x0a\x4e\x2a\x79\xf4\xe8\xda\xd1\x13\xa4\x50\xbc\xe7\x39\xf7\x03\xbf\x6d\x93\x05\x64\x89\x3a\x27\x16\x56\x63\xb3\x74\x44\x2e\xaa\x45\xf6\x68\xc9\xb3\x09\x0d\xc0\xf3\x59\x60\x2c\x42\x78\x03\x2d\x23\x1e\x3f\x6b\x8d\x5b\xef\x68\x81\xf5\xed\xe3\x40\xa8\xce\x63\x9e\x43\x6e\x02\xa1\xdb\x42\x12\x75\xd2\x9c\xca\x8b\xe6\x79\x44\xe6\x11\xa3\xb5\x19\x8e\x0d\x4b\x83\x2a\x83\xf2\x4d\x55\xf7\x08\xb1\x1e\x63\x87\x75\xae\x43\x0d\x79\xa4\xb8\x30\xd5\x4e\x40\xfd\x3b\xa5\x0e\xe3\x8e\x87\x9a\x02\x53\xb0\x94\x61\xe4\xb2\xea\x5a\x67\x9a\xc7\x1e\x3a\x36\xaa\x76\x44\x11\x9a\xf5\x70\x26\xde\x81\x31\x06\x6f\x5b\x5a\xb7\xc1\xba\xa2\x18\x7f\x28\x0a\x48\xac\xae\x50\xb0\x10\x5d\x24\x3c\x6b\x98\x97\x13\x38\x02\x90\x97\x13\x93\x40\xf0\x6d\x7e\xd3\xbc\x23\x4b\x22\xaa\x38\xc9\x1c\xd1\x95\xf0\x40\x39\x55\xd6\x32\x27\x34\x6c\x7e\x3a\x23\x05\x44\xa0\x7c\xeb\x44\xb4\x18\x23\x9f\xc5\x20\x7d\x54\x51\x48\xca\xed\x76\xa9\x3a\x7c\xb7\x92\xe2\xe0\x78\x8e\xd5\x55\xb6\xf8\x9b\xa8\xaf\x95\xb3\x7a\x22\xd6\x96\xe5\xb4\x19\x8a\x8a\x6d\xf5\x7a\x07\x78\x18\x16\x1d\xce\x04\xc3\x8c\xb9\x52\x93\x58\x1f\x5c\x8d\xa6\xc3\xfe\xe0\x00\x73\x65\x76\xec\xa0\xec\x95\x72\x08\x20\x6a\x2b\xd9\x72\x94\xdb\x83\x4f\x19\xab\xb0\xde\x21\xd6\x81\x1e\x3e\xb7\xb9\x6d\xa0\x48\xaa\xdc\x9f\x1d\xb0\x25\xb1\xa9\xd0\xc8\xc6\x48\xa9\x27\x8e\x94\xde\x31\x52\x58\xee\x56\xe9\xd4\xc4\x65\xa5\x28\x55\x19\xee\x13\x14\x58\x7b\xc7\x4d\x8a\xb9\x3d\x7e\xe4\xa4\x1a\x1f\x8d\xe2\xee\x99\x11\xa7\x62\xb0\x14\x8b\x7a\x44\x23\x59\xba\x7d\xac\xbc\xb6\xf5\x8e\xa7\xe6\x45\xe4\x1b\x48\x56\x8d\x08\x96\x90\x81\x5b\xf7\xcd\x08\xc4\x40\x54\x8c\xf7\xa6\xc0\x01\x07\xe5\xd7\x23\x4c\x05\xf3\xf8\x3a\x6d\xf5\x78\xbd\x36\x71\x81\x80\x1b\xc6\x8d\x73\x6f\xc5\x4c\x31\x59\xba\xde\x43\x96\x2e\x79\xd1\xbd\x82\xae\x92\xf4\x39\x4e\xb8\x0e\xb1\xe3\x0f\x59\xeb\xba\xa1\x9e\xd7\x87\x45\xb5\xed\x63\xd4\x09\x2f\x93\x05\xe7\x50\x63\x28\x60\x32\xd9\x62\xb3\x62\xbb\x2b\x98\x61\xda\xbc\x0a\x77\x6a\x78\xb4\x62\x75\xb7\xc7\x14\xb5\x2e\x6a\x07\xbd\x08\xea\xe7\xbd\x9a\x73\x18\x7e\x6e\xed\xb4\xb7\x76\x3d\x0a\x8e\x09\x63\x6a\xe4\x1a\x80\x0b\x77\x70\x4e\xb5\x0b\xf0\x94\x0a\xc4\xe1\x13\xa3\xfb\x2a\x90\x9d\x16\xdc\xb4\xb5\xbb\x49\xe8\xf8\xb6\x1b\xc7\x20\x37\x4b\xc1\x1a\x37\x9e\x9e\xfc\x66\x7f\x4a\x21\xbc\x83\x9c\x71\x88\xda\xc5\xb4\x16\xea\x05\x12\x35\x23\xd5\x0f\xf6\x6b\x30\xb9\x19\x08\x04\x0e\x91\xa0\xf9\x74\xb8\x7f\x3b\x27\x2c\x9b\x98\x6e\xf1\x71\x32\xb8\x1d\x67\x5b\x55\xb3\x83\xda\x43\x1c\xf5\xb0\x86\x96\x61\x0d\x2a\x7d\x0f\x2a\x6b\x1d\x40\xe7\x89\x0c\x21\x9e\x99\x0e\xed\x06\x55\x03\xbd\xb5\x20\x05\x1b\xb0\x0e\x3c\x9e\x67\xf9\xbd\xf1\x42\xe9\x88\x3f\x23\x54\x70\xb9\x59\x9b\xa2\x34\x8b\xba\xf4\x35\x3d\x9c\x44\x59\x19\xa6\xe6\x0c\x73\xa7\xb7\xbc\xcd\x37\xca\x21\x2b\xcd\x37\x33\xdf\xb0\xb9\xe8\xbd\x5a\x8f\x8d\x0b\xcd\x73\xca\x5a\xbd\xe9\xea\x29\x5f\xbc\x25\xe1\x7e\x1b\x44\x49\xc8\x76\xde\x4e\x05\x0f\xd7\x36\x04\xe2\xca\x48\xb9\x3b\xbc\xb4\x1e\x08\x68\xa2\x68\xfa\x67\xce\x34\x34\x15\x7e\x38\x44\x93\xdb\x63\xd7\xfb\x42\xae\xbc\x72\x99\x17\xb2\xec\x0e\xe6\x6a\x53\x56\xf9\x2a\x2e\x50\xf4\x02\x54\x1c\x81\x3e\x3c\x0c\xc3\xe9\x5a\xf0\x4d\xf1\x5e\xe0\x8f\xd1\x89\xab\x9b\x07\x2e\x2a\x72\xb7\x96\xb8\x6c\xdd\x42\x96\xd4\xe4\x82\x79\x3e\x8d\x1f\x1c\x34\x11\x02\x47\x3e\x36\x12\xf9\x29\xa1\xad\x5a\xfa\x16\x1e\xda\x9e\x35\xdc\x4f\xf7\xb9\xa4\x2a\x83\x6d\x51\x76\x58\xa9\x85\x94\xd1\x3e\xf4\x26\xc3\x49\x54\x17\x48\x03\x09\xb3\xb1\x4c\x70\xa2\x60\x9a\x42\xc1\x34\x52\x7e\x64\x68\x30\x51\x8e\x40\x85\xca\x23\x48\x10\x08\x88\xfa\x1a\x8d\x1a\x5e\x76\xa9\xa7\xc3\xe9\xc5\x20\xd2\x57\xa3\xab\xa3\xe1\xd5\xf9\x78\x78\xf5\x71\x70\x39\xb8\x9a\x46\x75\x35\x35\x58\x15\xa4\xa6\x06\x42\x74\xed\x6a\x6a\xcc\xf7\x5d\xe6\xa9\x41\xbe\x84\x40\x77\x7d\x61\xd0\x13\x71\x3b\x6e\xbd\x2e\xf2\x75\x91\x58\xbb\xd2\x94\x70\xa7\x92\x08\x42\x11\xa8\x64\x8b\xa8\x18\xd5\x05\x95\x9b\x95\x21\x04\x73\x09\xc7\x6b\x99\xcf\x13\xe7\x82\x21\xf1\xa8\xac\x80\x14\x29\xac\x16\xad\x58\x54\xbe\xdd\x55\x0e\xa5\x87\xa2\xe6\xc4\xe9\x75\xd8\x5f\xc9\xb2\x12\x9f\x11\x04\x33\xac\xa8\xa4\xe7\x29\x4a\x4a\x22\x41\x8f\x1e\xe6\x0b\x37\x8d\x05\xab\x6a\x0b\xf6\x90\xa9\x55\x16\x26\x4d\x66\x60\xe8\x40\x83\x6e\xad\x5b\x9b\x6e\xdd\x6b\x2a\x1d\xcf\x2b\x24\xbc\x6c\x5f\xe0\x78\xa8\xd9\xf1\x93\xab\xb8\x5e\x3d\x23\x55\x79\x64\x46\x4e\xd6\xc0\xf8\x2c\xaa\xa8\x86\xf1\x35\x30\xb8\xe0\x7c\x19\x8c\xab\x65\xc1\x23\x53\xcd\xef\x62\x3b\x14\x00\x2b\xc2\x64\x23\xa4\x35\x30\xe1\x56\x3f\xe2\x61\xbc\x36\xee\x24\xd8\x94\x44\x79\x47\x13\xa5\xc4\x59\x87\x7b\x75\x6f\xb6\x8d\x5b\x02\xfa\x1e\x79\x09\x4d\xba\xcd\xf3\xc5\x43\x92\xa6\x91\x82\x2c\x42\x59\xe5\xeb\x75\x7c\x6b\x22\x24\x10\xb1\xcd\x24\x08\x26\x26\x87\xd3\xe5\x26\xa3\x3b\x9b\x6e\xff\x30\x11\x3e\xcf\x57\x2b\xbb\x06\xe3\x54\xb9\x7e\x73\xa9\x4f\xc7\xd7\xe2\x34\xa2\x31\x2d\xf5\x38\xba\x56\x8f\xa3\x38\xe7\xcb\x35\x37\xa8\xf4\x0b\x94\xf9\xb6\xc3\x7c\x0e\xda\x17\x0a\xbe\x2c\xb1\xaa\x3f\xdf\x59\x9b\x75\xc7\x36\x53\x6d\xae\xae\x4b\x6b\x7c\x09\xe5\x5f\x2b\x42\xee\x53\x4a\x12\x62\x69\x3a\xd6\x4b\x03\xbb\x3e\x52\x21\x91\x7f\xb9\x59\x63\xa8\x8b\xce\xa5\x2d\x2c\x22\xb3\xca\x20\xad\xee\x0b\xa2\x5c\x99\x8e\x24\x57\x26\x56\x1e\xa6\xd0\xf6\x22\xdf\xbe\x16\xc5\xd9\xd2\xbe\x7a\x25\x23\x2d\x01\x77\xb7\x8a\x47\x46\xde\xfc\x9c\x93\x4e\x48\x9e\x79\x33\x94\x22\xfa\x10\x96\xa3\x5f\x83\xb2\xba\x3b\xda\xa8\x96\x0f\xea\xc0\x33\xe5\xf3\x2a\x3e\x98\x20\x66\x96\xe2\x7b\xa0\x11\x8d\xd1\x2c\x16\x7e\xe0\x31\x58\x6e\x23\x28\xe4\xcb\x16\xc0\xfe\x0c\xda\x51\x2d\xb1\xe6\xb8\x58\xa5\xae\x74\x30\xdb\xca\xd2\xaa\x6c\xbe\x29\x0a\x9f\x95\xa0\xf8\x1f\x32\x17\x59\x6f\x0d\x43\x64\x51\x73\xd5\xcd\xb8\x70\xde\x36\x7f\xeb\x15\x18\x30\x45\x41\x96\x2d\x4f\x9a\x12\x19\xb1\x58\x56\x2e\xe9\xc1\x15\x4a\x0b\xb6\xc0\x76\x94\xea\x5d\x5f\x0f\xae\xce\x86\x3f\xbd\xb3\xb3\xe3\x01\xb3\x98\xc3\x95\x90\x21\xfb\x37\x68\xc3\x03\x86\xf0\xa7\x4f\xfc\x68\x44\xf9\xe3\x9a\x47\x3b\xcb\x93\xd4\x14\xeb\x34\xae\xd8\x7f\x8e\xbc\xd9\xbc\x4c\x4c\xba\x28\xb5\xc9\xa0\x7a\x0b\x2c\x85\x59\x11\xcf\xbf\x9a\xaa\xd4\x07\xff\xf8\x4f\x07\x5c\xcd\x4b\x97\xcb\x96\xd7\x06\x51\xd4\x58\x8f\x46\x05\xb2\x67\x87\x67\x79\xf6\x43\x48\x7f\xc0\x0f\xfc\xff\x75\x3c\x5e\x97\x44\x91\x66\xc6\xbf\x9a\xd2\x7e\xe2\x62\xc4\x43\x24\xab\x74\xb9\xcd\xaa\xf8\x9b\xc3\xda\x82\xc7\x89\xef\xec\xea\xcf\x06\x0b\x68\x0a\x83\x9f\x46\x5f\x4d\xc5\xf8\x29\x5c\x05\x65\x89\x64\xd9\xe0\x5d\x80\x25\xe6\xc4\xa7\x39\x2d\x05\xf0\x6e\x4a\xc6\x13\x57\x02\x90\x43\x1c\xac\x0b\x6b\xde\x2f\x94\x3d\x0c\x0f\x98\xdb\xab\x91\xd0\x07\xd1\x9f\xb8\x4c\x4c\x51\x67\xef\x71\x11\x00\xe7\x65\xab\xb8\x98\xdf\x25\xf7\x24\x02\xc6\x0f\xfa\xc7\xed\x76\xbb\xfd\x27\xfd\x8f\xcc\xea\x5d\x4b\x4c\xfe\x93\xf2\x34\x82\x82\xc0\x20\x58\x0d\x91\x16\x58\x33\x7d\x28\xc0\xd2\xe6\xa0\xf3\x5e\xa9\xad\x20\x6e\xc0\xdb\x82\x82\x9e\x6c\xd5\x02\x78\xd6\x9a\x57\xa1\xa8\x41\xd3\x5d\xcd\x67\x48\x51\x03\xad\xac\x95\x5c\xea\xb8\x7a\x14\xd9\x46\xea\xbf\x47\xa7\xdd\x63\xa5\xbe\xcf\x5a\xd5\xc1\x65\xce\xc2\xc5\x4a\x46\x65\x1a\x98\x0c\x9d\x94\x41\xd8\xa6\xcd\x2e\x55\xea\x89\x86\xa9\x7e\xc4\x30\x85\x0a\x9b\xa0\x4e\xcf\x2d\x5c\x22\x55\x9d\xeb\x34\xce\x6e\x37\xf1\xad\xd1\xb7\xf9\x3d\x81\x84\xa5\x99\x06\xf1\xbc\x54\x90\xc6\x36\x7a\xf4\x8c\xd4\xfd\x2f\xfb\xd3\x7d\x31\xbe\x9e\x5c\x1c\x9d\xfc\x72\xe8\xdf\xc7\xf0\xbf\x6f\x4f\x5f\x1f\x1f\xd7\xf0\xbf\xa7\x6f\x8f\x9f\xf5\x5f\x7f\x95\x9f\xb1\x89\xd3\x2b\x53\x21\x64\x88\xea\x47\x28\xf6\xcb\xe7\x01\x1f\xd3\x27\xf6\xf8\x3b\x1c\x9b\xfb\xae\x3e\xb3\xf7\xdd\x68\x5e\xe5\xa0\x82\xf1\xdb\x48\x9f\x1e\x1f\x9f\x76\xa0\x4a\x97\x85\xfb\x25\x92\x37\x8c\x81\x08\xdd\x09\x2a\x52\x03\x61\x7c\x67\x50\xda\xb6\x28\xcc\x36\xca\xd6\xb1\x38\x7d\x50\xe3\x40\xb9\x43\x44\x9f\xa6\x66\x8e\x39\x65\x77\x5d\x70\x96\x5c\x1d\x7a\xb8\x6e\x07\xb9\x29\x7c\x5a\xdd\xc3\xe3\x30\xdc\x6c\x5f\x4c\xd1\xfe\xd2\x33\xb4\x91\x61\x31\xdb\xfa\x00\x98\x30\x2b\xd0\xe6\x12\x5d\x01\xb7\x24\x2e\xf5\xc1\x88\x31\x4c\xfd\x7c\x61\xaf\xe4\x6c\x11\xe6\x8a\x98\x7d\xaf\x25\xb9\xce\x5e\xd5\x13\xe6\x88\x01\x52\x27\xf6\x2a\x05\x3e\x7a\x06\x5d\x38\x66\x28\x72\x0a\x3a\xfa\xd0\x5f\xb3\x3e\x10\x10\x88\xc3\xd9\x99\x01\x8b\x52\xed\x30\xd4\x39\xf4\x66\x52\xa6\x80\xc7\x40\x64\x23\x9e\x15\xc1\x9d\x1b\x51\x24\x2e\x88\xd2\xe2\xa5\xe3\x10\xa2\x04\x22\xf2\xa2\xff\x08\x63\x83\x60\x7e\x89\x30\x66\xd6\x39\x5d\x17\xf9\x5d\x32\xb3\xee\xa1\x9a\x6d\xe1\xca\x25\x1b\x9d\xe2\xf5\x24\xd7\x16\xb6\x7d\x6a\xbb\xbf\xcc\x0b\x13\xd9\x2b\xdb\x45\xb8\xb1\x81\xd6\x30\x0c\x22\xc8\xe4\x61\xb9\xd6\x1d\xd2\xaa\x83\x69\x0d\x38\xaa\xf8\x23\x44\xb7\xc8\x58\x4a\xb5\x6d\x53\x46\x13\xbb\x00\x48\xbb\x75\x99\x47\xce\x15\xdd\xcd\x88\x2e\x78\xcc\x48\xa8\x8f\x9d\x91\xe6\x62\xe1\xe7\xcf\xb6\x7a\x9e\x26\x73\xa7\x87\x86\x1e\xa7\x9a\x6d\xaa\x0a\x21\xd3\x8b\xfc\x21\x4b\xf3\x78\x51\xef\x6b\x57\xf7\x4a\xd4\xe4\xac\xc5\xa4\xa1\x0a\xff\x44\x1f\xf4\xbc\xb9\x43\x18\x11\x24\x25\x40\x70\xd9\x3b\x0d\x34\x3f\x04\x85\x8f\x1d\x5f\x8e\xdf\x35\x60\x94\x22\x3e\x19\x18\x66\x1c\x1f\x2d\x09\x0e\x5b\x3b\x37\x46\xce\x1f\xd8\xd7\x87\x09\xeb\x0d\x81\x6d\xe5\xe9\xd2\xe3\x39\xae\xd7\x08\x30\x51\xa8\x69\x58\xe8\xb8\x2c\x93\xdb\xac\x86\xd9\xb3\x23\x0a\x18\xef\xbd\xd0\x09\x88\x69\x29\x0f\x75\xb6\x5d\x08\xf6\xaf\x46\x18\x05\x56\x79\xb2\x05\xea\xb0\x14\x98\x17\x47\x96\x5b\x36\xf5\xd0\x07\x5c\xd8\xff\x7e\x8f\xad\x98\xb5\x8d\x0e\x6f\x43\xfb\xeb\x9d\x23\xa3\xbe\x7f\x64\xf4\x8e\x91\x01\xdb\x38\x18\x14\x3f\x10\x87\x92\xda\x95\xc3\x46\xe9\xb6\xe3\x46\x48\xfb\x11\x82\xf8\xdd\x65\x98\x63\x41\xbe\x21\x07\x38\x69\x1b\xa4\x60\x50\x81\x28\xef\x54\x1f\x08\x96\xba\xf0\x74\x93\xa8\x45\x91\x06\x75\x58\x0b\x12\x1a\xca\x33\x3d\xf8\x06\x07\x83\xfa\x80\xf8\x64\x6d\x0d\xfb\x92\x2c\xfb\x3b\x93\x26\xdf\x08\x9b\x57\x6d\x49\x87\x0c\x22\xd6\x2f\xd0\x8d\xf0\xa1\x2b\x8a\x6b\xe0\xe3\x59\x9e\x19\xcb\x9f\xd9\x5f\xaa\x01\xdd\xbc\x99\xdf\x4c\x59\x00\x7f\x81\x29\x56\x76\xd8\x39\x4e\x0e\x32\x43\x04\xab\xd8\xd9\x6f\x8c\x0a\x13\xec\x11\x6a\xa0\x99\x2a\xc0\x7f\x45\xd5\x2e\x02\x86\x1b\xc2\x06\x86\xb1\xee\xd3\x57\x61\xfd\x32\xdd\x20\xe0\xc2\x0b\x13\x2f\x12\x79\x01\x0a\xd8\x06\x7c\x1a\xbd\x56\x70\x08\x24\xe0\x0a\xee\xd7\x7a\xd2\xc7\xb1\x96\xec\x6a\x59\xde\x08\xe5\x9e\x74\x5f\xea\x10\xa5\xe8\xe7\x19\xe9\xa1\x45\xed\x8c\x97\xee\x36\x9c\x24\x72\x4a\x53\x3c\xb0\x50\x23\x88\x9e\x72\xb0\x26\xe1\x5d\xaf\xec\xbb\xfc\x50\x1c\x08\x69\x95\x60\x39\x46\xba\xbe\x9e\x61\xce\xdc\x0a\xb6\xbb\xb0\x76\x28\x10\x8e\xf2\xb2\x81\x83\x79\xe1\x34\xd7\x41\x46\xd5\xde\x6a\x44\x6f\x26\xe1\xd2\x27\xdd\xd7\xfa\xe0\xcc\xac\xd3\x7c\x7b\xe0\x75\x8b\xe0\xf6\xf4\x48\x3f\x1d\xde\x9d\xc1\xac\x7a\xa9\x1c\xe5\xb8\x3f\x48\x82\x2c\x05\x2e\x64\x10\xb8\xc1\x78\xc2\xbd\x49\xf3\x35\xc4\x29\x0e\xc7\xff\xeb\xac\xc3\xad\xbc\x26\x3a\x6e\x7d\x53\xa3\x54\x2d\x77\xa6\x2b\xdc\xbd\xc5\x6f\xda\xd4\x5a\xe9\xf2\x96\x58\xbf\x0f\x4d\xa5\x00\x03\x34\x71\x66\x4f\x13\x72\x47\xf3\xe2\x36\xce\x92\x3f\xe2\xfc\x19\x5f\xad\x3c\xfe\x5f\x67\x1a\xd1\x38\x41\x33\xd5\x0d\xd5\x2e\xb0\xd4\x0e\x9e\x52\xf2\xc4\xf2\x63\x47\x47\xd6\xde\x76\xf9\x1c\x27\x6c\xd7\xbb\xa4\x58\x50\xc1\x79\x22\xea\x4b\xb0\xd2\x28\x33\x05\xcc\xda\x1b\x5d\x2f\x5a\xe0\xe9\x23\x77\x1b\x37\x84\x9c\x28\xe2\xa5\x0a\x8d\x1c\x42\x87\xdd\x64\x10\xf1\x9e\x00\xe5\x8d\x04\x91\xc6\x0f\x11\x71\x69\x38\x80\x1c\x9b\x22\x64\xa7\x52\x0f\xc3\xc8\x7f\x8d\x48\xaf\xde\x90\xda\x6a\xa5\x26\x03\x02\xbc\x42\xd4\x1d\x10\x8f\x36\x52\xf8\x2f\x44\xed\x0c\x18\x09\x30\x66\x74\x66\x52\xa4\xa0\x5b\x8f\x49\x43\xd4\xcb\x2f\x29\xd7\x7e\xb6\xb6\xed\xee\xa2\xdf\x8b\x66\xef\x6d\x32\xc0\x87\xf1\x74\x0c\xf8\xd6\x29\x4a\x61\x6a\xca\xbc\x35\xfb\x08\x26\xf0\xad\x3e\x18\x7c\xc3\xc5\x9b\x6e\x75\x63\x07\xe2\x2f\x9a\x83\x47\x2b\xe2\x21\xa6\x53\x69\x15\x6f\xd5\xcc\x90\x52\x16\xa2\xba\x37\xa5\x3b\xac\xe1\xc6\xf2\x5a\x56\x40\x95\x00\x7f\x16\xda\x64\x98\x94\x86\xe4\x6e\xa9\x70\x0d\xb6\x7d\x8d\x1f\x2c\x1b\x90\x43\x8e\xe9\x9e\x28\xd6\x39\x07\xeb\x9e\xa1\xea\xcf\xe0\xfa\x99\x66\xaf\xc2\xa8\x93\x80\xa7\x16\x15\x14\xdc\xd7\x6a\x89\x08\x9e\x82\xc6\xa0\x47\x16\x48\xb5\xff\x1c\x9a\xe5\x73\x32\x19\x3a\x31\x91\xe2\x8e\x88\x21\xe0\xee\xd7\x31\xf1\xd8\xb7\x46\xbf\xe4\x99\x87\x04\x63\x27\xdd\xdf\x76\xf5\xc1\x90\x2b\x56\x78\x1e\x7d\x09\x4b\xa4\x39\x0b\x54\x46\x24\x24\x09\x1d\xa3\x98\xab\xaf\x98\x28\x23\xd5\xbb\x1e\x96\x91\xbe\x33\xb1\xdd\x98\x00\xdf\x8b\xf4\xc7\x9b\xe1\x59\x19\xe9\x1f\x8f\xa6\xb6\xff\xfe\x80\x5f\x17\x79\x95\xcf\xf3\x94\xc4\x83\x58\x1b\x7e\x9d\x18\x64\xef\x63\x5b\x30\xd2\xcb\xa4\x58\xb1\xb3\xc3\x56\x21\xd5\x93\x31\x9b\x0f\x6e\xe3\xca\x40\xf3\xec\xbf\x89\x14\x00\xf5\x07\xf9\x99\x7a\xff\x33\x61\x34\x7e\xa7\x0f\x82\xfd\x72\xe0\x2b\x6f\x04\x29\x72\x64\x87\xd8\xc0\x3f\xb0\x34\x88\x3a\x85\xf0\x45\xfb\x01\xa4\x1e\x46\x82\xce\xb9\x3b\x88\xcb\xaa\xd8\xcc\x2b\x48\xb0\x2d\xdb\xee\xd0\x80\xfe\x3b\x3c\x6a\x54\xed\x42\xd5\x3b\x2f\xd4\x1d\x0f\x10\x37\xab\xda\x77\xb3\xea\xcf\x77\x50\xc0\x82\x8b\xbb\x30\xa9\x01\xc7\x0d\x12\x97\xa5\x29\x08\x01\x4b\xb3\x1b\x07\x66\xac\x4e\x4a\x74\x64\x6a\xc3\x05\xf7\x88\x1c\x30\x89\x7c\xc0\x64\x29\x3c\x50\x89\x83\x59\xee\xb2\xf7\xdc\x76\xeb\x06\xd8\x67\x67\xe6\xc1\xc5\xfe\x19\xd2\x2a\x09\x33\xed\x02\x72\xfb\x87\xe3\x0b\x0e\x68\x55\x6a\x57\xb9\x8b\xd1\x0a\x01\x29\x94\xaf\x85\x05\x71\x72\xdc\x88\x46\x50\xe5\x6d\xdc\x91\x98\x3f\x3c\x6d\x6d\x4f\xda\x43\x33\x71\xe9\x0a\xb3\x58\xe6\xc0\x9f\x0a\xd2\x28\x6e\xe6\xef\x6b\x05\x5e\xaa\xfe\xc6\x6c\xab\x37\xeb\x05\x9b\x78\x9b\xf5\x6d\x11\x2f\x30\x52\x24\xe3\x2b\x25\x07\x58\xca\xda\xdb\xd5\x63\x6f\x77\x6a\x95\x2e\x71\xeb\x39\x78\x02\xcb\xde\x07\x79\x00\xda\x3e\xbf\x63\x9f\x4d\x1c\x09\xa4\x6d\x80\xd9\xb6\xbc\xf8\xea\xfd\x3b\x00\xcd\x60\x40\xc7\xae\x3e\xe5\xea\x45\x61\xc5\xc0\x17\x64\xcf\x21\xd5\xf8\xf4\x11\x55\x8d\x7b\xec\xe4\x44\x1f\x48\x03\x8e\x27\x96\xa8\x3c\x82\x63\xbe\x51\x89\x46\x10\x90\x65\x5e\x28\xfb\x5c\xf4\x23\x9d\x3c\x0b\xc9\xb8\x54\xec\xf4\x66\x47\x3e\x57\xee\x10\x93\x5d\xdd\x93\x8f\xfc\xa1\x54\x6d\x6f\x4e\x32\x2d\x5e\x30\x8f\xd7\xf1\x1c\x2a\xdf\x58\xaa\x29\x99\x9b\x22\xd2\x66\x65\x2f\x5d\x03\x34\xac\xab\x99\x29\x22\x25\x29\xc4\x18\x92\x81\x55\x67\xf1\x2d\xe1\x8d\x40\xc3\x70\x4d\x45\x99\xd1\x4e\xc3\x52\x1d\x8a\xc6\x03\x89\xaa\xec\x8e\x60\xde\xfb\x97\x4d\x9c\x26\x4b\x68\x9b\x1c\x57\x1c\xec\x53\x7d\x20\x66\x4f\xfa\x11\x77\x9b\x55\x9c\x79\x48\xb1\xc3\x71\xef\xd8\x48\xec\xab\x95\x9b\xa4\xe2\x2f\xb4\x56\x59\x23\xe9\x91\xdc\x3c\x50\xcc\x95\x2f\x36\x29\x40\x99\xf8\xb4\xb1\xf7\x5a\xba\xc1\x63\x40\x20\x6d\xdc\x15\x28\xee\x38\x3e\xf6\x30\xbd\x58\xf2\x75\xac\xb8\xbe\x0e\x97\x2c\x15\x6b\x80\xed\x59\x56\x71\x2a\xca\xa5\x33\x42\xc7\x61\xd1\x8d\x58\xed\x1d\x1c\xa5\x97\x1a\x6b\xda\x5d\x49\xbb\x73\xee\x6a\xf5\x66\x31\xa1\x73\x9a\x8a\x96\x18\xfd\x68\xa9\x9d\xc0\xba\x47\xf1\x35\xb8\xc6\xeb\xef\x0b\xac\x4d\x7c\xba\xf2\xd1\xdd\x22\x4f\xcb\x88\x0a\xf3\x6a\x4c\x07\x49\xb9\x9b\xe8\x20\x72\x56\x54\x61\x54\x83\xc2\x20\x6e\xa1\x30\xd0\x4f\xa0\x30\x50\x4f\xa2\x30\xd0\xfb\x29\x0c\x66\x82\xc1\x40\xed\x67\x30\xd0\x3b\x19\x0c\xa0\x44\xa8\x85\xba\x40\x35\xa8\x0b\x4e\xbb\x76\x6f\x10\x78\xf4\xa6\x34\xe5\x7b\x41\x7c\xa8\xff\x97\x1e\x07\x0a\x67\x4f\xa8\x1e\xab\x97\x66\x08\x78\x5f\x43\x11\x34\xd2\xc6\x51\xef\xe7\x99\xaf\x93\x81\xb0\x56\x33\x74\xad\x0f\xef\x93\x38\x88\x78\x82\x05\x5a\xbf\x9d\x43\xdb\x53\x30\x62\x3d\x12\xcc\xed\x44\x8f\x29\x94\xba\x2a\x36\xd5\x28\x0e\xac\x13\xd5\x02\xa4\x0d\xfb\xfd\x83\x70\x03\x4b\x8c\x01\x05\xb6\x96\x42\x5b\x0b\x43\xc9\x01\x8e\xe2\x9d\x9d\x9f\x93\x66\x21\x50\x24\xca\x0a\xb9\x9a\x90\x50\xb2\x58\xd3\x0d\x1e\x8f\x1c\x13\x0f\x83\xa6\xf3\x2a\x43\x94\x0b\x33\x9f\xd5\x0b\x74\x9c\x1e\xcc\x42\x94\x1f\x91\x20\xa6\x2f\x3b\x0a\xed\xbd\xb0\xc0\xd5\x55\xd6\x69\xc4\x56\x18\x90\x8c\x62\xc8\x3a\x61\xae\x25\xb7\xb5\xbc\xab\xab\x3b\xc3\x75\x00\x8c\xd1\x68\x58\xa6\x0b\xfd\xd5\x98\xb5\x3d\x16\xed\x46\xa2\xea\x79\x78\x38\x5d\xf2\xf5\xd6\xb1\x36\x8f\x62\x61\x1f\xaf\xe8\x13\x14\x0e\xf9\xb2\x12\x8f\x34\x10\x8b\x10\x4c\x79\x03\x04\xb3\xfc\x77\x71\x91\xa8\xfa\x7d\x89\x15\x08\x92\x2a\xa3\x51\x2e\x90\x2d\x5a\xf5\x2d\x94\xd0\xb7\x20\xef\x37\x6b\x9a\x1d\x58\x4a\x98\x56\x58\xa1\xee\xf4\x28\x6a\x40\x3e\x18\x42\x5f\x66\xf5\x83\x97\x52\x2b\x0c\x9c\x92\x12\x65\xec\x99\xde\x02\x4e\x5f\xfd\xe6\x7d\xad\xf0\x69\xb1\x41\xb7\xb1\xb1\xfa\x93\x4a\xf0\xb8\xa5\xf6\x2a\xb5\x57\x42\x52\x12\x15\x2d\x4e\x94\x4a\x5c\xa8\x57\xf7\xdc\x8a\x44\x33\x7a\xd9\x6a\xca\xa6\x29\x86\x9c\x9a\x8e\x84\xf2\xc7\xf1\xcf\xab\xf6\xd2\xa2\xda\x4b\xb9\x6a\x2f\x32\x35\xe9\x58\x22\xdb\x16\x3f\xf5\x1e\xab\x9f\xdc\x58\x00\x4b\xe6\xae\x06\x37\xe2\x13\x66\x51\x0b\x83\xb4\xe4\x31\x5b\x63\xb3\x3b\xad\x70\x3e\x88\x14\x1d\xaf\xa5\x81\xd0\x5b\x75\x17\x88\x37\x68\x60\xec\x88\x10\xc8\x56\x6a\x28\xfa\x89\x4b\xc8\x46\x35\xe3\x24\x8a\x4f\xd3\xea\xc1\xa4\xf7\x46\x1f\x9e\x9c\x76\xf4\x2a\xcf\xaa\x3b\x51\x71\xc6\x23\x03\x16\x09\x64\x8c\xed\x63\xb0\xae\x12\xee\x69\xbb\x55\x54\x82\xef\x32\x05\xe6\x2a\x09\x8a\x85\xf4\x34\x20\x00\x54\x4b\x28\xd6\x06\x12\x06\x91\x47\x2e\xcc\x54\x08\xc6\x01\x18\xdf\x43\xd3\xbd\xed\xba\x4b\x82\x45\xce\x1f\xcc\x4c\x97\x49\x65\x58\xf7\xe2\xd0\x38\x11\x8b\x96\xd3\x12\xa8\x51\xbc\x2d\x14\x49\x23\x09\xcd\xc1\x2c\xdd\x7a\x4d\x24\xe5\x4f\x8c\xfa\x22\x73\x45\x81\xe8\xbf\x56\xa5\x49\x97\x32\xe0\x99\x58\x43\x33\x6d\xa1\x9b\x51\xc1\xe2\xac\x0d\x47\x5b\xd4\x67\xe7\xba\xa9\x5f\xc8\x24\xdc\x2c\x44\x9b\xf2\x4c\xdf\xe5\x0f\xbe\x4c\x0b\x3c\x64\x44\x5b\xd5\x8f\x9b\xae\x72\x0b\x1e\x10\x70\x12\x73\x47\x05\xa2\xd0\xa0\x2b\x4c\xb7\x07\x8b\x30\xd8\xeb\xd6\x6f\x3c\x88\x67\xf9\xa6\x3a\xd0\xb3\xfc\x9b\xb7\xa9\x25\x16\x0f\xa5\xe9\xb1\x4d\x0c\xf1\x0d\x41\x70\x94\x4a\x86\xac\x7e\xa4\xc2\xd0\xea\x3a\x9e\x7f\x8d\x6f\xc1\x0c\x27\xf2\xc3\x12\x0c\x9e\x53\xae\xb6\x61\xda\xd6\xf9\xd7\x2c\x7f\x48\xcd\xe2\x96\x62\x16\x98\x96\xa5\x73\xf5\x0e\x48\xc4\x82\x14\x64\x1d\x1f\xca\x5b\x2e\x48\x67\xe1\x81\x98\x14\xad\x59\x83\xb6\x39\x74\x63\xa5\xb0\x14\xc6\x9a\x1c\x00\xbd\x2f\x90\x9a\x94\x72\xe6\x58\xcb\x24\xdd\x49\x0a\x47\x37\xea\xcb\x81\x4f\x54\xbe\xc1\x1d\xc9\x9c\x25\x44\x33\xb7\xa6\x6b\x61\xfd\x0c\x50\x58\xdc\x20\xe9\xeb\xda\x14\xd5\x96\xad\xf8\x00\x69\x4b\x46\xe4\xfe\xc1\x71\xd7\x7c\x08\x9c\x55\x02\xf3\x4e\x19\xe3\x19\xf0\xb5\x55\x9c\x1d\x0b\xa0\x21\x2e\x59\x2f\x0b\xb7\x35\x09\x9d\x72\x6b\x55\xad\xb5\x81\x21\x08\x09\xf1\x58\x50\x01\x7b\x0d\x50\x3e\x41\x9d\x96\xff\x42\x35\x2a\xc0\xc5\x45\x09\xe2\x3d\x68\xca\x52\x65\x44\x0b\x44\x19\x09\x07\xe6\x9b\xc2\x28\xdf\x99\x7d\x43\x0b\xf2\xea\x50\x62\x02\x43\x8c\xce\x91\x57\x89\xb3\xfe\x27\xe4\x33\x14\xe6\x33\xc2\x4a\x75\x8c\x8c\x09\xdc\x87\x54\x3a\x45\x5a\x04\x4c\x44\x09\xf2\x03\x6b\x15\x90\xb4\x72\x5e\xe8\x32\x4e\x4d\x63\x4d\x46\xc4\xb7\x8f\x8a\x00\x8d\xfe\x51\x7e\x1a\xd9\x04\xa8\x25\x87\x65\x07\x36\xd9\xcb\x9f\xc5\x34\xb1\xc3\x57\x50\x4f\xf2\x15\xf4\xd3\x7c\x05\xf5\x14\x5f\x41\x7f\x9f\xaf\xa0\x42\x5f\x41\xf0\x60\x04\x6e\x43\x7d\xd6\xf0\xa4\x16\x7e\x82\x07\x65\xa8\x00\x94\xd1\x3a\x8d\xb5\xc9\x23\x5a\x1b\x3b\xb3\x8d\x79\x54\x61\x51\x69\xdd\xfa\x87\xfb\xbf\x2e\xff\xb4\x2b\xe1\x82\x6a\x6c\x05\x52\x8c\x94\x50\xae\xc3\x6c\xc9\x1c\x57\x20\x34\x4c\x7d\xbf\x45\xe1\x09\x49\x5b\x8b\x4f\x82\x66\x80\x40\x38\x25\x58\x68\x57\xc7\x82\x00\xd9\x82\x4b\xf2\x81\xfe\x48\x8d\x6d\x44\x4c\x85\x12\xfc\x22\xce\xb9\xd3\x90\x09\x0f\xe7\x03\x7a\xb7\x0b\x1e\x03\xa7\xc3\x13\x76\x33\x22\x36\x38\xc3\xcd\x81\x09\x74\x7a\xdd\x64\xc2\x3c\xd6\x36\x21\x4d\x31\x13\x94\x3c\xc1\xe7\x8b\x24\x73\x8c\xf0\xff\x9a\xa6\x32\xdf\x3b\x80\x32\x2f\xe7\xf9\x1a\x57\x0d\x19\xed\x71\x29\x97\xa2\x03\x4e\x04\x3e\x40\xa9\xad\x43\x6a\xbf\x74\xda\x3d\xad\xb1\x2e\xb4\xcf\x51\x52\x01\x2e\xae\x4c\x16\x49\x5c\xb4\x4e\xd1\xe3\xdb\x08\x1f\x24\xe8\x61\x9c\xd3\xbd\x6f\xc6\x94\x9f\xb1\xa7\x9c\xbf\x7b\x66\x4c\x3d\xbe\xfd\x9e\x38\x63\x92\xee\x81\x3c\x76\xc8\xf8\xdc\x0b\xbf\xe5\xd0\x3e\x53\x8e\xe1\x0b\x42\xd5\xc9\x61\xec\x48\x54\x81\xaa\x11\x83\xb4\x39\x49\x32\x01\xce\x7c\x79\x60\x25\xb1\xf8\x15\xcb\x3f\xaf\x36\x69\x95\xac\xed\x6d\x90\x90\x67\x1e\xd0\x92\x78\x17\x10\xed\x24\x06\xf6\x23\x05\x95\x37\x2a\x25\x55\x9f\x97\x65\xc7\x80\xc2\x7d\x62\x1e\x58\xf4\xa8\x76\xdf\xec\x2b\x21\x83\x80\x68\x7a\x9b\x17\x49\x75\x87\xe9\x83\x24\xbb\xc7\x2a\xe8\x92\xe9\xce\x3d\xe7\x34\xb0\x3c\x90\xf5\x1d\xbe\xa4\x85\x1e\x0c\xeb\x75\xc8\x72\x54\xec\x71\xd0\x71\xcd\xf8\x2d\x02\x5f\x95\xf8\xb9\x00\x5e\x10\x8a\x95\x33\xaf\x37\x2e\x43\xfe\x3a\x95\x02\xed\x33\xdc\x90\x08\xa6\x5e\x09\xe6\x79\x0a\x10\x39\xa3\xe3\x46\x62\xde\xf1\x01\x89\x60\x98\x87\x6a\x38\xe3\xf9\xe7\x65\xd9\x61\x9b\xd7\x1c\xb4\x06\x32\x80\x62\xc2\x95\xb9\x45\x42\x08\xaa\x69\x86\xfb\x01\x2e\x1b\xca\xbf\xe0\x8d\x13\xa9\xd0\x71\x2e\x37\x04\x9b\x23\x2b\x66\xe5\xc9\x60\x64\x3b\x0a\xa3\x97\x9b\x74\x99\xc0\xe6\xa4\x69\x6c\xdc\xe7\x12\x7e\xe0\x6a\xe8\xc2\xa0\x7b\x1d\x57\xf4\x8a\xa3\x6c\x21\x71\x4c\xbd\x93\xb0\xc6\xb6\xb5\xf0\x0d\x91\xdd\xdb\x37\x7b\x37\x5f\xe1\x19\x1c\xb9\xfb\x16\xc8\x08\xb4\x57\xdc\xf2\xd9\x3e\x0c\x55\x07\xdb\xa5\xbe\x64\x99\xd5\x1e\xbe\xe8\xd9\x0e\x73\x2c\x21\xa5\x0a\x1d\x4f\x50\xa9\x63\xbb\x75\xb8\x32\x10\xcd\xc1\xf0\x9e\x54\x8f\xc4\x16\x58\x01\x23\xc0\xd0\xc9\x08\x91\x27\x04\xf5\x92\xa5\x5d\xd2\xa2\x05\xc7\xb0\x3d\x26\xe2\x9d\x54\xde\x83\xb5\x21\x16\x0d\x83\x4b\x8a\xac\xc6\x46\xee\x98\x6a\xdb\x71\x87\xfb\xbb\x09\xda\xfd\x32\x42\x6e\x01\x98\xd7\xd3\xdd\xc0\xbc\xb2\xab\x27\x8c\x0c\xe6\x2c\x0c\xa5\x15\xef\x0d\xe6\x15\x45\xd2\x2a\xdd\x2a\x82\x5d\x11\x24\x0f\xb4\x4a\x50\x28\xa6\x91\x24\x6b\x40\xd0\xed\x60\x7a\x48\x4c\xcb\xc1\x77\x59\xe7\xbf\xc4\xa1\x6f\xb2\xc9\xd8\x73\x11\x48\x9c\x11\xa3\xa2\x08\x75\x13\xc0\x49\x9c\x0d\xd7\xb6\x35\x1a\x8b\x3a\xa7\x4b\x41\xa5\x76\xbd\x34\xde\x89\x4c\xd2\x20\xa2\x57\x05\xc9\x72\x36\xe2\xdb\xe6\x02\x76\x94\x6d\xaa\x27\x49\x73\xc1\x41\x3b\xc6\xef\x42\x60\x36\x0e\x7f\x54\xc3\x46\x39\xf8\x2d\xa7\xd8\xd2\x24\xfb\x4a\x9a\x3e\xe2\xa4\xc1\x84\x4e\x5e\x04\x34\x3c\xb0\x7a\x04\xac\xc5\x2e\x22\xb0\x3f\x55\xed\xa5\xec\x6e\xae\x4c\x75\x97\x2f\x1c\xb4\xd2\x6e\x24\x24\xd6\x60\x27\x46\x60\x56\x77\xc2\x23\x77\x50\x5d\x2c\xf3\xc2\xdc\xe6\x80\x53\xb7\x5b\xb1\x15\xcb\x49\x6f\x52\xfb\xe0\xe0\x5d\x3d\xbd\xdb\x10\x96\xd1\xde\x7b\x45\xf3\x1c\xe6\xc7\xf1\xb1\xa0\x58\xee\xa3\x49\x17\xa7\xc7\xd7\x93\x0b\xb4\x36\x64\x8b\x3a\x68\x5a\x37\xf7\x8d\x92\xa5\x65\xc4\x38\xe9\x77\x87\xf6\xbb\xa3\xac\xef\x2a\xc1\x48\x54\x23\x08\x42\x96\x1f\x37\x3e\xf2\xf8\x77\x15\x26\x52\x43\x71\xe7\x66\x56\x0f\x10\x51\xcc\x8b\x45\x92\x21\x26\x1c\x7d\xe0\x96\x65\x66\x27\x13\x08\x73\xdd\xc2\x81\xf5\x4f\xab\x1f\x10\x09\x8a\xfe\x14\xa0\xc0\x1d\x2a\x17\x54\xb3\x42\xef\x76\x67\xbb\x6a\x6a\xef\x2e\xa0\x64\xbf\x74\x99\xff\x31\x49\xd3\xb8\x2e\x04\x74\x7f\x62\x4d\x6c\xdb\xfa\xd2\x7d\x04\x00\x08\x78\xe0\xbb\x0d\x0f\xbb\x5c\x26\x57\x9e\xd2\xd0\xcb\xeb\x8b\x48\x27\x4b\x75\x79\x7d\x71\xe4\xae\x0e\x06\xd7\xec\x80\x1b\xd3\xf7\x6a\x9f\x47\xf9\x2b\x92\xdc\x72\x8d\xca\x0b\xde\xa5\x4e\x07\xc5\x99\x1d\x75\x63\xe3\xf2\xfa\x02\xe7\xff\x96\xaa\x8d\x90\xd4\xc6\x05\x2c\x4b\x7f\xb3\x40\xbd\x41\xae\x0d\xd2\x9d\xb4\x1d\xb9\xf8\x3a\xb9\xe1\xb1\x26\xb7\x68\xdb\xcb\x31\x97\xa8\xc3\xe3\xf2\xb5\x61\x02\x73\xde\x37\xbe\xa4\x46\x90\x6a\xa8\x3a\xa9\x06\x67\x74\xb7\x42\x3d\xdb\x4d\x42\x73\x1c\x93\x92\x25\x38\x95\xf0\x5b\x04\x81\x25\x98\x48\xae\x82\xc3\x5e\x5f\x2f\xf5\x25\x48\x7b\xde\xde\x16\xe6\x56\xa4\xed\x3d\xfe\x00\x45\xe8\x64\x2d\x4b\x73\x58\x1a\x56\xd2\x21\xe1\x42\x31\x88\xf1\x75\xf7\xf7\x91\x4f\x45\xdf\xe7\xe9\x66\x45\x70\xa2\xb2\xca\x8b\xf8\xd6\x34\xb8\x9a\x90\x57\xd0\x07\x19\x67\x85\x63\x9e\xf1\x8d\x15\xd7\x3b\xb8\x9f\x35\x9e\x57\xc7\x3a\xc9\x88\xc1\x46\x7f\x20\x5e\x28\x8e\x32\x76\x8f\xe8\x3a\xb0\x57\x0f\x2d\xbc\x00\xd4\xc8\x18\xb4\x74\x1b\xc4\x50\xed\xab\xe0\x00\x74\x1b\xf4\x3e\x89\xbd\x54\x9a\x02\x18\x13\x74\x83\x85\xe1\xb7\x1d\x2a\xe5\xdf\xdf\x88\x80\x8a\x32\xae\x9f\x7a\xfb\x0b\xc5\x02\xf2\xa8\xc1\x37\xe2\x72\x2a\xf5\xb9\xbd\x7b\xf9\x90\x80\xe8\x4b\x53\x53\x8c\xff\xec\x58\x9d\x48\x18\xae\xca\xc9\x3d\x77\x32\x94\x18\xa1\x16\xb4\x44\x3e\x47\xcd\xd4\x83\x25\x71\x0f\xda\x8d\x58\x98\x8a\x85\x89\xf6\x86\x3f\x64\x22\xb7\x25\x30\xed\x4d\x48\x17\x7f\x57\x81\x00\x21\xe8\xb6\x61\x84\x3f\x09\xf8\x37\x2b\xa9\xfc\x54\x3e\xf2\x1e\x15\x70\x7d\xe0\x37\xb0\x3c\xc6\x73\xdf\xd7\x97\xd6\xce\xc1\x6c\x57\xaa\x45\xd0\x2b\x66\x34\x3c\xa9\xb8\x9d\x22\x0f\x57\xc7\xd5\x5e\xd3\x80\x14\x0a\x78\xde\xda\xa6\x53\x12\x0e\x6e\xdf\x2f\xe7\xa6\xe1\xe5\x06\x76\x69\xec\xa5\x59\xf9\xac\xaa\x97\xee\x34\xe9\xd0\x7c\x0d\x03\xa1\xfb\x6b\xd6\x40\xe0\x6c\x08\x8f\xd1\x2f\xfb\x9d\xa9\x87\x30\xfe\x86\x30\x05\x0c\x0b\x7b\xbe\x0a\x55\xe7\x55\x5d\xfa\xa5\xec\x68\xfb\xdd\x3f\xed\x33\x70\xb1\x26\x19\xc6\x3d\x72\xa4\x40\xb4\x8b\x10\x42\x10\x57\x79\x4b\xfc\x9b\xd7\x4a\xa8\x5e\xd9\x04\x02\x84\xbd\x77\xcc\x82\xe1\x87\x5a\x8a\xc0\x6a\xd0\xdc\xd7\xdd\x93\xa7\x33\x84\x85\xbb\x2e\x60\x08\x83\x6f\x93\x92\x05\xf3\x85\xf9\x7a\x2f\x37\x28\xbe\xf4\x55\x5f\xc6\xa0\xab\xc0\xaa\x37\x22\xb3\xd6\xef\x40\xaa\x9f\xaa\x1f\xa4\xf8\x99\x7f\x38\x64\x80\x33\x48\x8b\xd1\x07\x65\xfc\xc1\xee\xbe\xf0\x45\x8a\x62\x2a\x8c\xf4\x36\xd9\x22\x2f\x70\x11\xad\x8b\x7c\x95\x57\x86\x5d\xfd\x16\x27\x36\x18\x54\x09\x62\x0f\x50\x06\x35\xb5\x44\x3f\xaa\xfa\x3a\x4f\x93\xf9\xb6\xa5\xab\xaa\x8f\x14\x6d\x82\x6b\x07\x94\x5b\xbb\xfb\xc9\x72\xaa\xbc\xc9\x97\xe3\x89\x71\x94\xe3\xca\x71\x0c\x39\x68\xcf\xb4\x50\xe3\xf0\x9e\x22\xb4\x6f\x9d\x20\x47\x39\x17\x4c\xdc\x73\x3e\xd0\x2c\xb3\x4a\x49\xa6\x0f\x0f\xea\xfd\x38\xe8\x38\x97\xa3\x50\x80\xf5\x0a\x39\x72\xc3\x83\xcb\x55\xf4\x72\xe7\xa1\x26\x75\x17\xbb\x8e\xa2\xe0\xfc\x6e\x76\x1d\xae\x8c\x0c\x94\x0b\xf6\x86\xad\x5c\xf0\x84\xf2\xc6\x01\xdc\xe4\x87\x52\x50\xf3\x61\x5e\x95\xf9\x6d\xea\xfd\xd6\x50\x6d\x09\xe7\xa5\xbb\xa0\xa1\x06\xd1\xc3\x64\x38\xf5\xb6\x93\xc9\x47\x3b\x22\x1f\x27\x08\x00\x51\x6e\x80\xec\x7c\x3f\xad\x8f\x67\xf5\xd1\xcc\xea\xa3\xda\x42\x79\xfb\x09\x7e\x76\xf6\x18\x59\xf5\x7e\x64\x55\x99\x90\xd7\xa4\x1b\x9e\x8a\x1c\x6a\x02\x4d\x13\xd4\x29\xb5\x6b\x30\x33\x0f\x5c\x1f\xde\xcc\xf6\xe3\x5e\x4c\x56\x58\x68\x9c\xac\x4c\x57\x0f\xe2\xf9\x9d\x2b\x28\x67\xc5\xcb\xdb\xc4\x5e\x99\x40\xed\x6a\x2d\x9e\x4d\x52\xda\xbb\x50\xf1\xc7\xb2\xcd\x6a\x66\x8a\xae\x1e\x65\xf3\xfa\x59\xe9\x50\xd8\x5e\xf6\x91\x9d\x4e\xb8\x16\xe6\x9b\x34\x2e\x42\xf1\x0f\x99\xf2\x73\x1b\x36\xcf\xaa\x24\xdb\x18\x3e\x21\x93\xaa\x1d\x01\x13\xbb\x62\xf8\xae\xe7\x92\x4a\xcb\x5c\xec\x78\xfb\x75\x18\xec\xb0\xa1\x2d\x8f\xc3\x69\xe1\x2a\x7b\xd7\xdb\xfa\x20\xfa\x9e\x89\x33\x19\x0e\xcb\x5a\x81\x8f\x5b\x71\x77\xc4\xda\xe3\x2e\xeb\x06\x8b\xa5\xe0\x9b\xa9\xf2\xd0\xc8\xc5\x30\xef\xa2\x1d\x28\xfe\xdb\xae\xbe\x1a\x31\x61\xcc\x17\x3d\x1a\xeb\xc9\xcd\xf5\xf5\x68\x3c\x45\x5f\x2a\x0c\x2e\xd0\xb8\xda\x2d\xd9\x12\x84\x54\xeb\xc2\x1c\x51\x45\x45\xa4\x37\x59\x65\xca\x0a\xca\x8d\x0b\x54\x7d\x04\x5d\x63\xfc\xa5\xa8\xe3\xdf\xf9\x0a\x65\x8a\x22\x2f\x4a\xa9\x8e\x8c\xb1\x54\x62\x71\x73\x74\x6c\x90\x54\x88\xab\x38\x72\x64\xb2\x48\x85\x94\x5b\x1b\x1c\xaa\x67\x94\x6f\x75\x3c\x9f\x6f\x8a\x78\x9e\x18\x3a\xdc\x9f\x04\xdc\xf0\x72\xa1\x2a\x8c\xb3\xed\x8c\x0f\x97\x1a\x41\x60\x74\x24\xc2\x89\x81\x21\x96\x22\x29\xbf\x76\xf5\xf4\xd3\x40\xf5\x47\x3f\x0e\xc6\x83\x33\xdd\x1f\x9d\x0d\xf4\x70\xa2\xaf\xc7\xa3\x1f\x87\x67\x83\x33\x47\xeb\xd3\xbb\x3a\xab\x73\x4d\x7e\x89\xf4\xcd\xf5\xc7\x71\xef\x0c\xa9\x7d\x68\xae\x94\xe0\xf5\x81\x6f\x21\x3b\xd1\x68\x1c\xfc\xe3\x87\x89\xfb\xcf\xc3\x49\x47\x1f\xf6\x47\x17\x17\x83\xfe\x74\xf8\xe3\xe0\xe2\x8b\x1e\x0f\xce\x07\xe3\xf1\xe0\x4c\x4d\x47\xba\x37\xd1\x07\xfc\xc9\x03\x50\xeb\x9b\x7e\x1a\x30\x4f\x24\x90\x08\x4d\x06\x7d\x24\x14\xfa\x2d\xbc\xe1\x77\x1d\xf8\xbf\xde\xc5\x85\xee\x8f\xae\x50\xc0\x6f\x34\x9e\xa8\xc1\x4f\xd7\xe3\xc1\x64\x72\xf1\x45\x9f\x0d\x27\xfd\x8b\xde\xf0\x12\x3e\x23\xe8\x89\x7a\x57\x67\x2f\x02\x8a\xa2\x48\xd3\x97\x6c\xf7\x86\x97\xd7\x17\xc3\xc1\x59\xa4\x87\x57\xfd\x8b\x9b\xb3\xe1\xd5\xc7\x48\x7d\xb8\x99\xea\xab\xd1\x54\x5f\x0c\x2f\x87\xd3\xc1\x99\x9e\x8e\x22\x68\x1e\x7d\x76\xef\xc3\x6d\xd3\xeb\xdc\x98\x76\xec\x26\xbd\xe9\x70\x72\xde\xeb\x4f\x47\xe3\x2f\xfa\xf7\x37\x3d\x24\xcd\x1c\x9d\x4b\xd2\x4c\xdd\x46\x9a\x09\x1f\xea\xf5\xfb\x37\xe3\x5e\x1f\x1f\xf5\xfb\x9b\xe1\x60\xaa\x07\x57\x7f\x3f\xfa\x82\x5c\x9c\x76\x60\xae\x46\x57\x92\xa0\x13\x18\xd6\x3e\x0d\xc7\x67\xf0\xc4\x2f\x7a\x3c\xfc\xf8\x69\x3a\xe9\x06\xb3\xa6\x06\xbd\xfe\x27\x39\x9a\xfa\x6c\x34\x98\x40\xcf\xa9\x87\xba\xf7\xb1\x37\xbc\x9a\x4c\xf5\xf0\x6a\x3a\x18\x9f\x0f\xc6\x83\xab\xfe\x00\xd6\x8b\xfe\x32\xba\x19\xfb\x36\x28\x78\xdd\x40\xcb\xf5\x66\xc7\xac\x37\x85\x5f\x9f\xdf\x5c\xd1\x64\xda\xb7\xf5\x86\x57\x83\x33\x3d\xbc\x6a\x7c\x43\x7f\x1e\x5e\x5c\xa8\xcb\xc1\x60\x8a\x8f\x1f\x0f\x7e\x7f\x33\x1c\x43\x7f\x26\xe2\x69\xa3\xeb\xc1\xb8\x67\x1f\xa7\x5b\xde\x0a\xcf\xd0\x1f\x06\xfa\xe6\x0a\x1a\x3d\xbe\xb9\x9e\x0e\xce\xd4\x68\xac\x07\xe3\xf1\x68\x7c\x74\x3e\x1e\xd8\x21\x1d\xe3\xe3\xce\x06\xe7\x83\xfe\x74\xb2\xb3\x31\xf6\x41\xfd\xd1\x78\x3c\xe8\x4f\x07\x67\x70\x8c\x8d\xc6\xbd\x0b\xfb\xb4\xcf\xe3\xe1\x74\x3a\xb8\xd2\x67\xa3\xfe\x8d\x6d\x20\x34\xc8\xae\xa2\xf3\xd1\xf8\x92\x5a\x37\xd6\xbd\xb3\x1f\x87\xfd\x81\xfe\x38\xfc\x71\x70\xa5\x3f\x7c\x71\xc3\x1f\xe9\x9e\xfb\x6f\xd5\xbb\x99\x7e\x1a\x8d\x87\xff\x67\x70\x06\x6a\x95\x83\x09\x3e\xee\xc7\x01\x3c\xe1\xea\x4b\x30\x45\x93\x4f\xb0\x05\xc6\x83\xde\x74\xa0\x7b\x6e\xcf\xc2\x49\xa3\xe4\xf9\xe2\x74\x29\xea\x11\x1d\xc4\x53\xd5\x4a\x26\xa1\x48\xe6\xf6\x0e\x8e\x0e\x20\x3d\xb9\xc7\xea\x06\x25\xf8\x63\x9b\x09\x4e\x0c\xec\xa2\x80\x50\xc4\x5c\xde\x4c\x78\xb9\x76\xf0\x0a\x6b\x0b\xc0\x1b\xe3\x6c\x0e\x78\xe3\x6c\x33\x4f\x4d\x5c\xe8\x65\x3c\xb7\xd6\x0b\x94\x51\xc4\x49\x31\x2f\xe2\x65\xa5\xb3\xf8\x9e\x6c\x56\xf1\xcb\x50\xb6\x89\x55\x98\x20\xcd\x94\x80\xb3\xb0\x5c\x26\x73\x57\x31\xb1\x8a\xe7\x77\x50\xd8\x0b\x57\x08\x64\x35\x62\x72\x61\x1c\x3f\x67\x13\xd0\xa6\x48\x1f\xdf\xc4\xc8\xff\x69\xe2\xea\x2e\x72\x15\x49\x3a\xc9\xfe\xb0\x29\xb0\x52\x03\xa5\xe1\xf5\xfa\x6e\x5b\x82\xca\x1f\xd0\x05\xdc\x27\x45\x9e\x01\x1e\x92\xd9\x3c\x85\x31\xc4\x98\x32\xaa\x0a\x69\xf0\xa1\x39\x9b\x1e\x4b\x03\xab\x8c\xac\x3c\x05\x56\xc1\xa6\x64\x02\x4f\x38\x92\xdc\xe2\xbf\x18\xd2\x11\xd3\xd5\xd3\x11\xac\xe0\xc1\x4f\x53\xbb\xfb\xed\x1e\xbe\x1e\x8f\x3e\x0d\x3f\xc0\x01\x66\x57\x5e\xef\xb3\x5d\x9d\x76\x09\x0f\x7e\xb4\x3b\x16\x17\x92\x3b\x0f\x5a\x96\xda\x87\x01\xbc\xe0\x62\x80\x67\xd3\xd5\x17\x7b\x46\x0e\xcf\xec\xea\xbc\x88\xf4\xe4\x7a\xd0\x1f\xda\xff\x18\x5e\x9d\x0d\xed\x06\x51\x78\x0e\x4e\x06\xbf\xbf\x19\x5c\x4d\x87\xbd\x0b\x7d\xd6\xbb\xec\x7d\xb4\x87\xe4\x78\x38\x19\x5e\x7d\xd4\xf6\x92\x19\x9d\xdb\x57\x8d\x07\x17\xbd\xa9\xfd\x15\x34\x7b\xc8\xb7\x06\xac\x78\xbb\xf5\xd5\x0d\xfe\xf7\xf0\x8a\x3a\x68\x3f\x68\x7f\xd7\x3c\x64\xa8\x69\xf6\x8e\xb2\xa3\x32\xfd\x34\x18\x0f\x46\xe7\x91\xfe\xfc\x69\x60\xff\x5b\xdd\x5c\x9d\x0d\xec\xc9\x3a\xfd\x34\xb0\x47\xef\xe8\x1c\xfb\xd8\xeb\x4f\x23\x71\xe3\x4d\x47\xe3\xa9\x3e\x74\x77\x80\xbe\x1a\x7c\xbc\x18\x7e\x84\xe3\xce\x6e\xba\xe9\x78\xd8\x9f\x2a\x37\xdc\x9d\x48\x93\xaa\xec\xc4\xcf\x81\xfd\xe0\xc8\xbe\xf2\xf3\xd0\x9e\xda\x76\x94\xf5\xf0\x3c\x18\xe1\xc9\x4d\x78\xe0\xaa\x4f\xbd\x89\xfe\x30\x18\x5c\xc1\x41\x31\x19\x9c\xf1\x89\x76\x3d\x9a\x4c\x86\xfc\xd8\x73\xfc\x9e\x1b\x4d\x38\xed\xa7\xf6\x14\x9e\x4c\x7b\x57\xd0\x5c\x7b\xd7\x9f\xf7\x86\x17\x37\xe3\x81\xfd\xfc\x60\x32\xa1\x29\xa0\x4b\x84\x59\xf9\xec\x61\x7a\xf6\xa5\xab\x27\xa3\xcb\x81\xfe\xfb\x9b\xf1\x70\x72\x36\xa4\x93\xf9\x6c\x04\xab\xa6\x77\x71\x31\xfa\xac\x6c\x1b\x76\x2c\x35\xfb\x0f\xbf\x0e\xf4\xae\x49\x8f\xf4\x04\xa7\x56\x89\xe7\x5c\xf6\xbe\xe0\x4b\xae\xaf\x2f\x60\x4a\xbf\x8c\x6e\x42\xfa\x64\x8c\x5c\x09\x54\x4f\x95\x57\x92\x3e\x54\xa2\x30\xed\x27\x99\x36\xf7\x30\x74\xd5\xc9\x42\xdb\xcd\x96\xd8\x69\x31\x55\x21\xd6\x47\xd2\x29\xf1\x2a\xdf\x10\xa7\xb8\xc9\xf4\x22\x4f\xd3\xb8\x28\xf5\xe1\xff\xff\xe4\xb8\x7b\x7c\x0c\xa5\x66\xc7\x5d\x3d\xe2\x2a\xa5\x46\x9d\x51\x03\x8d\xd9\x56\x15\xda\x40\xe5\x62\x0d\x0b\xc4\xdc\x1d\x84\xa3\x4a\x2a\x86\xca\x65\x95\x29\x0c\x94\x7b\x70\x68\xa0\xc1\xfe\x81\x45\x9c\xb3\xad\xaa\xfb\x76\x5d\x49\x23\xff\x7d\x6f\x69\x16\xb3\xb4\x33\x8f\xf0\xbb\x75\x4d\xea\xae\x2d\x24\x14\x06\x00\x0f\x3a\x91\xd7\x0d\xf3\xc1\x9c\xe0\xe1\xe0\xf5\x91\x68\x84\x0b\x77\x03\x70\x21\x08\x4d\xcb\xd4\xa3\xf4\x44\x23\x6b\x2c\xb7\x84\xe6\x22\xe1\x84\x31\x36\x69\x5f\x33\xda\xe6\x11\xfb\x5b\x0b\x9a\x82\x1b\xab\x90\xca\xa0\x86\xee\x09\x09\xab\x45\xe8\xc7\x76\xcf\xb7\xc3\x2e\xa4\x95\x06\x4c\x77\x8a\xe2\x96\x27\x27\x5d\x70\xc1\x29\x12\x68\x57\xe1\x49\xf7\x04\x7e\x05\xe3\x27\xff\x46\x2c\xb2\xac\xaa\x23\xde\x99\x94\x02\xa7\x46\x9c\xe2\x4e\x00\x0a\x74\x38\x7c\xe4\xd4\xa4\xf9\x43\x9d\x46\x8f\x0a\x4c\x28\x82\xd4\x80\x1b\xe3\x4c\xb9\x07\x12\x24\x32\x98\x32\x87\x46\x60\x5e\xd8\x20\xb8\x4a\x55\x0e\xf6\xa2\x66\xd1\x5b\xfa\x8a\xe2\xc2\x22\x2a\x81\x6e\x00\x40\xdc\x77\x36\x2c\x81\x36\x2b\x60\x97\x51\x3e\xf7\xe5\xb1\x5e\xc4\x5b\xeb\xcd\xa9\x99\x99\xe7\x2b\xc8\xdb\x63\xa8\x74\x29\x3f\x4f\x05\x56\xc9\x0a\x94\x72\x2b\x03\x84\x5d\x98\xc4\xbe\x17\x52\x03\xf3\xa4\x98\x6f\x56\x88\x0f\x6a\x47\x15\xe8\x93\xd3\xee\xeb\xc3\x59\xe7\xbd\xca\x0b\xc4\xa1\x7d\xf7\x40\xc0\xca\x85\x8e\x27\x2b\xa3\x17\x9b\x02\x45\xc7\xda\x27\x37\x22\x36\x60\x20\x4c\x20\xf2\x3a\x38\x2b\x5b\x54\xc4\x9c\x18\x9a\xdf\x9f\x02\xcc\xb6\xdd\xa1\x85\xa6\x5b\xc4\xd0\xa8\xb2\x68\xb3\xce\x33\xa7\xdf\xf9\x9d\x3d\x72\x61\x86\x66\xb8\xe5\xfb\x7b\xe4\xb9\x74\x08\x7b\xce\x62\x6d\xbb\x8c\x62\xac\x72\x39\x0c\xb4\x34\x5d\xbc\x5d\x84\xd6\x55\x5b\x68\xbd\xe3\xda\x50\x4a\x49\xb6\xa7\x0c\xa6\x6a\x19\x4c\xdc\xd5\xa7\x7a\x00\xe0\x71\xd0\x60\x90\xdb\xfa\xc6\x0e\x72\xe5\x7f\x13\xd5\x58\xc2\xc5\x92\x2d\xab\x7c\x0d\x5b\x66\xb9\x29\xe0\x76\x6c\x91\x92\x91\xf5\xde\x51\x48\x5d\xd4\x10\xae\x6f\xab\x01\xa1\x8b\x68\x61\xca\xaa\xc8\xb7\xb5\x6a\xcb\xc6\xa7\x59\x45\x50\x25\x19\xa6\xa0\xd7\x40\x75\x5f\x92\x97\x40\xe6\x7b\x57\xf7\x40\x51\x65\x56\x2b\x4d\xa9\xe5\x89\xc1\xae\xbf\x8b\xef\x8d\xc2\x58\x1e\x24\xf4\xd2\xad\x3b\x91\xd6\x45\x92\x83\x8c\xa2\x18\x2d\xcd\x6a\x2d\xc5\x3d\x0b\xba\xc9\xbf\x02\xd0\x49\x5e\x21\xd7\xf6\x24\xc4\x38\x27\xbc\x2f\xf2\x4a\x87\x59\x5c\x6d\x0a\x13\x71\x65\x18\x29\x1e\x27\x19\xa1\xfe\xf5\xcc\x6c\xf3\x6c\xe1\x76\x6a\x80\x64\x69\xe4\x3d\xa9\x41\x8f\x68\xd7\x3a\xd8\xd8\xcb\x48\xbf\x8e\xf4\x6f\x23\xfd\xbb\x48\x9f\x1c\x47\xfa\xe4\x24\xb2\x27\x0d\xa2\xc9\x4e\x5e\x42\x9c\x0f\x57\x3e\x07\x4b\xbd\x6e\x83\x2b\xee\x50\x94\x99\x5e\x9b\xac\x64\x7d\x2d\x99\x45\x08\x95\x18\x74\x99\x17\x15\x93\x36\xd4\x35\x18\xb8\x7f\x70\x32\xc9\xab\x06\x50\x0b\x79\xb1\xf0\x54\xd9\x8e\x6d\x92\xf2\x1b\xbb\x87\x46\x71\xdb\xf9\x90\x5c\x17\xe6\x0f\x9b\x05\x28\x83\xe7\x52\x8b\x0f\xf9\xbf\xad\x61\xb3\x32\x8b\x2d\xb7\x17\xfa\x4f\xf7\xe6\x69\x57\x5f\x26\xe5\xdc\xa4\x69\x9c\x99\x7c\x03\xc4\x6c\xa7\xdd\x13\xfd\x11\xf0\x1d\x70\x74\x0c\x32\xa8\x26\x2f\xda\x22\x86\x09\xc8\xc3\x09\x0e\x87\xa4\x32\xab\x03\xd4\xd9\x80\x3c\x8f\x5d\xcf\xe7\xbd\xb1\x3e\xed\x9e\x1c\x9f\x74\xe5\x63\xdd\x81\x81\x9d\x9d\xdf\xa1\x2c\xfc\x22\xae\x62\xbe\x41\xc3\xcc\xae\xa2\x72\x3e\xac\x52\x43\x30\x1a\x18\x11\x9c\xb1\x21\xd1\x9c\x44\x02\x03\x68\x7f\x60\x49\x66\xad\x5d\x75\x38\x56\x52\x0a\xe1\x1d\xd1\xa7\xd4\xcf\x59\xad\x9d\x60\x9a\x31\xb2\xad\x26\xae\x5e\x9f\x5e\x3b\x0a\x76\x25\x9e\x9c\xe8\xc3\xa9\x7b\xcc\x59\x5c\xc5\x88\xd2\x82\xbf\x9d\xea\xc3\x3e\x71\xcb\x28\x06\x34\xc2\x9f\x11\xe9\x7c\x66\xec\xdc\x71\xbd\xd4\x99\x59\x52\x44\xbb\x98\xdf\xc5\xa5\x29\x23\x7d\x06\x63\xfd\xfa\xb4\x7b\x7a\xfa\xf6\xe8\xed\xf1\xc9\x6b\xf1\x2e\x65\xdf\xa5\x8f\x8e\x74\xdf\x77\x6d\x58\x99\x55\x89\xef\x3f\x3d\x7d\xdb\x7d\x7b\x7a\x7c\x7a\xf4\x52\x1f\x8e\xdd\xf8\x8b\xcf\x72\xc3\x1c\xd2\x52\x01\xda\xac\xf6\x4b\x7d\x26\x6b\x1f\x3b\x20\xac\x01\x48\xae\xdb\x74\x8b\x90\xb9\x9b\xee\xa4\x5b\x5b\x5f\x0a\xd6\x97\x2b\x42\x6a\xa2\x5e\x9a\xb3\xed\xcb\x11\x09\x6c\x00\x0b\xf7\x54\x8f\x0d\x52\x62\x58\xe7\x43\x83\x68\x2e\x64\xb3\x6b\xa6\x9a\xb4\x99\x9d\xd0\x9a\x5d\x1e\xc8\x58\x08\x7c\x6d\x40\x66\x32\xdf\x46\xb0\x5f\xc8\x9d\x89\xf4\x1f\xf2\x04\x28\x7c\xb3\x8a\xb4\x4c\xfc\x76\x63\x76\x11\xa4\xc1\x60\xba\x8f\x04\xb4\x2d\xaa\x07\x7b\x12\xdb\x8f\xaf\x72\x64\xe9\x8c\xf6\x65\xe1\x7c\x8a\xcc\xb5\xd4\xb1\x10\x31\xac\x90\x59\x2b\x3d\x1b\x85\x0b\xa7\xc3\x61\x0c\xf1\x13\xbe\xbf\xb0\x00\x1f\xcb\x9f\x64\x25\x1d\x8c\xda\x4b\x3d\x14\x8c\x2e\x67\x9e\x91\x70\x37\x28\x05\x9a\x95\xac\xd6\x71\x22\x8b\x9e\x94\x4b\x91\xd0\x54\x46\xbe\xbc\x83\x30\x85\x24\xea\x0b\x2d\x28\xf9\x97\x28\x75\x56\x45\xa8\xc2\x5d\x51\x32\x2c\xc0\xa9\x7b\xf4\x82\x17\xd9\xa2\xf4\x04\x55\x64\x78\xac\x68\x5e\xe8\x32\x59\x25\x69\x5c\x78\x82\x31\x15\x97\xa1\x6a\x10\x1e\xf0\xc4\xe7\xd5\xa0\x98\x6c\x82\x75\x7d\x0b\x54\xa3\x05\x2e\x57\xcb\x7d\x74\x65\x23\xd4\xa1\x80\x2a\x12\x07\xfd\x95\xfe\x1c\x27\xf7\xa6\x00\x92\x0e\x17\x1d\xec\xea\x73\x0a\xc3\x3d\x56\x16\x9a\x6b\x93\x2d\xf3\x62\x8e\x45\x89\x6b\xbe\x8e\x5b\x38\x0e\xfc\x52\x47\x04\x91\x8e\xf5\x03\xbc\x1a\x22\x6a\x1b\x58\xc8\xf4\xac\x95\xc3\xec\xc5\x55\xb8\xb8\xdd\x0b\xba\xba\x97\x6d\x59\x56\xa1\x30\xb7\x1b\xa2\xa0\x41\xab\x43\xc8\x7e\xc5\x15\x5c\xf1\x4e\xab\x80\x58\x81\x88\x2d\xc5\x01\x71\xc4\xf6\x23\x1b\x15\x22\xa7\x05\xf2\xe6\x72\xeb\x15\x49\x98\xe4\x0d\xce\xc0\xd3\xee\x6b\x3d\x31\xf7\xa6\x70\x32\x2a\xd6\xab\x1a\x2e\x5d\x26\x98\x12\xb7\xf6\xdd\x1b\x04\x15\xd3\xcc\x67\x95\xfe\xc3\xa6\x48\xca\x05\x72\xa2\xa8\x65\x92\x2d\x4a\xbd\x77\x34\x11\x9b\x5c\x4f\x38\x21\x98\x73\x93\xd1\x20\x42\x55\x1a\x02\x9d\x6b\x0f\x32\xe1\xac\xcc\xdc\xb8\xbb\x8b\x6a\x15\x7f\x4b\x56\x9b\x15\xe3\xab\x99\xbe\x7b\x96\x1a\x55\xe6\x40\xa7\x91\xb3\x19\x05\x4e\xd7\x3c\xcf\xf2\x55\x32\x27\x86\x18\xaa\x90\x4a\x02\xd9\x37\xa6\x0b\xf4\xfe\x29\x18\x64\x0b\x53\xb4\x94\x93\x83\x95\x4a\xc9\xdb\x24\x83\xb4\xa1\x86\x16\x62\x16\x0d\xde\xdc\x05\x66\x9b\x1a\x38\x5a\xd5\xc0\xd1\xc9\xb2\xae\xc2\xc1\x10\xab\x52\x92\x5b\x20\x4b\x39\xf8\x42\x98\xa2\xa4\xad\x1f\x50\xfc\xa2\xa3\x9b\xb0\xa8\x69\x58\x23\xf0\x22\x2f\xf4\x4b\x3c\x14\xc0\x05\x2d\x09\x52\x4d\x53\xe1\x24\x9f\x88\x4e\x13\xba\x6c\xef\x11\x7e\x4a\xd4\x7a\xb0\x79\x5f\x41\x28\x40\xe3\x91\xac\x90\x59\x44\x7c\x64\x91\x94\x6e\xd0\x44\x19\x41\xab\x4b\xd0\xf4\x07\x14\x94\x18\x79\x1d\xf1\xfd\x1e\x00\xac\xf8\x37\xfa\x2c\x29\xed\xbd\xab\xc7\xa6\xcc\x53\x12\x99\x86\x7d\xe9\x15\xbd\x1d\xa2\x65\x41\x9f\x2d\xdc\x67\x35\x5d\x48\x8e\x74\x5a\x84\xc0\x52\x42\x49\xe6\x6d\xd6\x78\x15\x7f\xe5\x52\x7e\x96\xa5\x35\x71\x55\xd9\xf5\xfe\x39\x06\x94\x41\xc5\x32\x9c\x8d\x47\x13\xd8\x03\x44\xcd\x32\x17\x0f\x74\x49\x84\x60\x2b\x72\xdd\xe9\xbd\xc1\x85\x88\xe9\x14\x94\xd2\x84\x70\x86\x59\x00\xca\x18\xb6\xb4\x00\xa5\xc7\x95\x1d\x19\xa4\x4d\x81\xb5\x42\x15\xfb\x75\x9e\x18\x34\x65\x25\xaa\x94\xe6\x8b\x28\x5f\xaf\xc8\xc1\xed\xe7\x5c\x95\xa6\xf3\x0c\xcf\xdf\x78\x5e\x95\x8a\x4b\x5e\x86\xc8\xb4\x4b\x20\x90\x49\x8c\x7c\x27\x1f\xf3\x7c\x51\x5a\xdb\xd8\xe7\xb7\xd1\x81\x06\x75\x97\x93\xd3\xee\x5b\x3d\xf8\x66\x4f\x91\x17\x43\x2c\xf2\xbd\x88\x1f\xd8\x42\x71\x66\x71\xa8\x41\x60\x07\xdf\xc0\x77\x44\x71\xb0\xb2\x9e\x31\xd5\xe1\x79\x6a\x27\xfa\x05\x1f\xcc\xce\xdf\x04\xcf\x1a\x49\xae\xf1\xac\xde\xe6\x1b\x5d\x98\xb9\x49\xee\x4d\xa3\x8a\xc5\x4f\xe1\x6e\x4d\x42\x93\x95\x1c\xa1\x60\xe5\x5c\xa0\xfb\x57\xd8\x50\xeb\x50\x1f\x51\x9b\x31\x9d\xd3\x56\xcf\xec\x18\x78\x91\x9a\x8b\xe5\x33\xe9\x6c\xb5\x66\xfa\x7d\x92\x4b\x96\x33\xc2\xde\xc8\x1e\x47\x10\x22\x08\xef\x23\xbc\xed\x5d\x71\x4f\x9a\x2a\x26\x99\xdf\xea\x78\x53\xdd\xe5\x05\x51\xd0\x91\xcb\xf3\x5b\x3d\x40\x88\x40\x8f\xe1\x4d\xef\xc9\x48\xb5\x3d\xbc\x88\xeb\xc1\x3e\x09\x0a\xf6\x35\x1c\xca\x83\xa3\xd8\xe6\x13\x47\x70\xb0\x24\x79\x03\xf0\x24\xaf\xe2\xca\x5e\x78\xcc\x94\x39\x15\x50\x6a\x7f\x59\xd6\x61\xf7\xd8\xef\x60\xe9\x12\x5b\x31\x1f\xf6\x13\x94\x9f\x5d\x8a\xfd\xd9\x55\xea\x73\xc0\x71\x9f\xe6\x73\x2f\x79\x4b\xcc\x14\x54\x28\xff\xfb\x8d\x99\x99\x79\xa4\xfb\x71\x16\x2f\xe2\x48\x57\xa1\x2a\x7c\x1a\x6f\x4a\xa3\xa8\xba\xe3\x1d\x6c\x2a\xee\xab\xdf\xee\xcb\x04\x8c\x33\x8c\x2f\x91\x90\x6b\x61\xfe\x65\x83\x60\x14\xfa\x83\xf0\x6e\xb9\x1c\xbc\xce\xa6\x52\x82\x09\x03\x86\x01\xe2\x07\xb3\xdb\x34\x29\xef\xba\xfa\xc2\x94\xee\xb5\x79\x56\x69\xf3\x2d\xb9\xfd\x8f\x7f\xd7\xff\xb2\x31\x2a\xb5\xdd\xf9\x8f\x7f\x2f\x3d\x55\x61\xa5\x8d\x1d\xfb\x4d\xa9\x53\x53\x8a\x67\xcf\xf3\x2c\x33\xdf\x8c\xdd\x81\x09\x54\x8a\xfe\xc7\xbf\x2f\xec\x63\x4a\x0d\x62\xe6\xb7\x69\x9c\x94\x5d\x35\xf8\x09\x32\x87\xba\xd7\x55\xea\xc0\xab\x6f\x1d\xce\x3b\xfa\xe4\x77\xbf\x7b\x7d\x74\x7a\x7c\x7c\xda\x22\x92\x22\x4b\x7f\x53\x3a\x10\x4b\x8c\xe6\xa0\xaf\xa5\xc6\xa6\x34\xc5\x3d\x1c\x10\xd3\x1a\x81\xa9\xd3\xd9\xf2\x57\x38\x32\x1a\x39\x08\xb4\x97\xf0\xa3\x8f\x15\x8d\x22\x24\xc0\xc0\x09\xf1\x11\xae\x1b\xfa\x3e\xb5\x19\x14\x05\x1b\x5f\x4f\x2e\x0e\x3a\x92\x79\xf8\xc9\xc4\xfe\xc5\xba\xe4\xd0\x3a\xe8\x89\xc1\x62\x70\xc5\x28\xdc\x35\x01\xef\x0a\x1a\xd8\xe7\x67\xd6\x2b\x86\x44\x1b\x49\xb8\x6c\xdc\xff\xf9\x6d\x9c\x97\x69\xa4\x9a\x09\x72\xfb\x48\xb4\x0f\xc0\x18\x15\x92\xe3\x69\x99\x4b\xb4\x64\x28\x97\xcd\x72\x0d\x08\x16\x97\xfd\xe9\x06\x5c\x61\xdf\x21\xa9\xa6\xa0\xdc\xcb\xba\x89\x09\xe8\x0d\x32\x9c\xfc\x3e\x4e\x93\x05\xb7\xb3\x0a\xd5\x7a\x6a\x20\x35\xbf\x5a\x14\xf7\xad\xab\xaf\x01\x3e\xa6\x4b\xd2\x1f\x13\xdf\xa0\x17\xe2\xb3\xf9\xf6\x73\xc5\xd4\xa1\xcc\xa4\x96\xd2\x63\x5e\xa1\x4c\x58\x45\xe1\xea\x36\x2c\x49\x3c\x75\xbd\x4f\xca\xa0\x02\xf0\x93\x9d\x2c\x7d\x76\xd5\xd3\x53\xe7\x85\x75\xc3\xde\xa1\x88\x89\xab\x5c\x2b\x1a\x58\xf0\xb9\x23\x76\x7d\xc8\x6a\x2a\x7c\x2e\xd2\xe4\x48\x7d\x12\x56\x36\x58\xc8\x66\x3d\x79\xff\xd5\x98\xbb\x11\x19\xb7\x30\xca\xaf\x46\x94\x90\xfb\x01\xb0\x66\x3f\xe8\x59\x5c\x26\x65\x43\xda\xf8\x4b\xa8\x18\x37\x18\x4e\x3f\x0d\xc6\x8c\xd0\x52\x12\xa1\xd5\xbb\x3a\xd3\xe3\x41\xef\xe2\x6a\x30\xfd\x3c\x1a\xff\xc3\x44\x7f\x1a\x8c\x07\x1f\x3c\xf0\x6b\x02\xc8\x2f\xc8\x95\x7b\x84\x96\x00\x76\x39\xed\x3a\x9f\x91\x8e\xe0\xcd\x52\xcb\xae\x89\xde\xda\x89\xd0\x52\x0e\xa1\x55\x43\x64\xe9\xd1\xb8\xa1\x98\x0c\x32\x86\xce\xb1\x3d\x2c\x3b\xef\xf4\x3f\x3f\xe1\x47\x29\xbf\x16\x5c\xcd\x1e\x22\x7e\xff\x21\xa9\xf4\xd4\x94\x95\x9e\x6c\x92\x0a\x58\x81\x2f\x72\x32\xf3\x0e\x93\xa5\x3f\x6e\xdc\x29\xa3\xec\xb2\xe6\xf7\x1e\x28\xd5\xa4\xbf\x7a\x27\xd6\x60\x3f\x4d\x30\x99\xe9\x5e\xcf\x0b\xa1\xab\xc3\x2b\x21\xb8\x08\x14\xaa\x65\xb9\x6b\x02\x8f\x7f\x5a\x80\x85\x3f\xfe\xf9\x8a\xf9\x60\xc7\x65\x57\xbd\xb3\xdb\x83\x8f\x1f\xe0\x60\xeb\x2a\x7f\x69\xa7\x49\x59\x49\xc9\x2f\x70\x3b\x73\x20\x8a\x9c\xb7\xdc\x10\x4e\x91\x1d\x69\x22\x51\x62\x4c\x9d\xbe\x46\x89\x31\xa7\xbd\xdc\x60\xde\x81\xbe\xf4\xe6\xf1\xc2\x58\xff\xf4\xbc\x30\xfe\xb4\x56\xa4\x3b\xe9\x62\x86\xe2\x0f\xeb\xd4\xb4\x77\x43\xa9\x5e\x51\x25\x65\x95\xcc\x5d\x3a\x5a\xf5\x2a\x5f\xb3\xd6\x63\x7a\x2d\x37\x46\x4a\x7d\x98\x9c\xf9\x0f\xf7\x91\x3b\x36\xac\xd0\x3c\x51\x6a\x90\x2c\x97\x26\xd5\xe7\x79\xb1\x59\xf9\x97\x7d\xbc\xba\x71\xca\x69\xb5\xa2\xce\xc3\x8f\xd7\x17\x9d\x13\xfc\xc8\x45\x32\x03\xe5\x98\xbc\xd0\x07\x17\xa6\x2c\x4d\x71\xb0\xf3\x6b\x17\xf4\xbd\xe1\x87\xcb\xda\xdf\x94\xb2\x8e\x44\xaa\x47\x6b\x93\x35\xba\xfd\xf7\xf1\x6c\x66\x8a\xf6\xbf\x5d\x0e\xa7\xbe\x83\x97\xc3\xe9\x78\xa0\xfb\x79\x9a\xc6\x33\x60\x5e\xbe\x37\xfa\xc7\xa4\x80\x6c\x36\x04\xb1\xd6\xb1\xb8\xd6\x0f\xfb\x3f\x7e\x76\x14\x48\x4a\x5d\xe6\x55\x5e\xe6\x8e\xf1\xc5\x3e\xae\xbd\xa4\x15\xae\xd8\xcb\xeb\x8b\xce\x9e\x4f\x9c\xf0\x27\xae\xf2\xaf\x49\xdc\xde\x74\xf8\xe5\xc7\x22\xdf\xac\xc5\x5e\xf5\x7f\xbe\xde\x56\x77\x79\xe6\x97\xc8\x79\xbe\xc9\x16\xb8\x87\xdd\x67\xc6\xc9\x3c\x0f\x19\x34\xeb\xc3\x3a\xd9\x64\x7a\x98\x2d\x36\xa5\x75\x7c\x26\x55\x9c\x2d\xe2\x62\x51\xd6\x2d\x9c\xc3\xc9\x70\x32\xb1\xcd\xb5\x1f\xaf\x3f\xe2\x26\x4b\x60\x47\x20\x00\x6d\x98\xa6\x49\x96\x27\xe5\x8b\xab\xfe\xa4\xd7\xde\xb1\x1f\xf3\xfb\x64\x11\x37\x16\xb7\xbe\xef\xa2\x60\xdf\xe7\x97\x7d\xff\xe1\x9f\xba\x57\xa6\xf2\xff\xfc\x3f\xf9\xba\xd9\x89\x3f\xa6\xc9\xec\x45\x9a\xcc\xd6\xb0\x79\xe9\x97\x27\x57\x79\x65\xde\xe9\x99\x61\xb6\x4c\x2f\xae\xe7\xf9\x28\xe6\xa6\x00\xa3\x04\xca\x37\x8a\x7c\xee\x92\x19\x58\x07\x69\xad\x13\x88\xd3\x01\x7b\x4a\x51\x21\x8f\x5a\x65\xb2\x05\x17\x63\xb4\x95\x84\x23\x8d\x22\x5b\x2e\x33\xa9\xfe\xe6\xa0\x43\xf5\x3a\xc8\x30\xea\x4a\x47\x5a\x2a\xcb\x1a\x90\xfb\x17\x2e\xe9\xf0\x7c\x56\x5e\x85\xad\x59\x86\xcb\xdd\x6f\xc0\xd8\x21\x61\x30\x6b\x3c\xeb\xa9\x27\x66\x2f\xdb\x6a\xeb\x8f\xad\xd6\x95\x97\x5a\xce\xf2\x0c\xed\x20\x9e\x04\xca\xd6\xf9\xcc\x64\x53\x98\x07\x8e\xd0\x8f\xd7\x17\x51\xa3\x30\x40\x86\x07\xd4\x32\x2f\x66\xc9\x62\x61\xb2\xd6\x62\xe5\x76\x6f\xbb\xf0\xb5\xd3\x3b\xaa\xfb\xa9\xba\xdb\x15\xb0\xa1\x27\x6d\xa4\x18\x0e\xdb\x75\x8f\x14\xbe\x83\x4f\x62\xbf\x5b\xd6\xee\x87\x04\xc5\xbe\xf4\x3c\xce\xec\x70\x2f\xed\x2e\xd5\x71\xf5\xee\x67\x08\x7d\xf9\x9b\xaf\xaf\x94\x9c\xa4\x1f\x44\x15\xd9\x1a\xaa\xc8\xba\xe1\x07\x28\xa9\x57\xd6\xbc\x53\x51\x62\x3a\xcf\xa1\xbc\x35\xb9\xa7\x1c\xed\x41\xb3\x40\xad\x3c\x78\xa7\x0e\xe4\x53\x0f\x22\x0d\xff\xbe\x4e\xe3\xad\x29\xf8\x5f\x7f\xbf\xf9\x6a\x66\xf9\x37\xfe\xe7\x04\xf0\xb6\xfc\xaf\xde\x66\x91\xe4\xfc\x8f\x1f\x93\x85\xc9\x0f\x22\x7c\xe8\x28\x33\x3a\x7c\xd0\xa5\x59\x24\xb1\xfd\x07\x18\x16\x07\x61\xb4\x5d\x56\xc7\x06\xe5\x84\x2a\x28\xf9\x0b\x9c\x89\xda\x98\xb4\x74\x91\x6a\xf0\x0e\x34\x2e\xb7\x52\x06\x2b\x5b\x06\x44\xb5\xd1\x08\xcf\xb6\x14\x62\xd6\x14\x66\x13\xee\x09\x22\xb2\x00\xbc\x52\x36\x1d\x90\x1f\x54\xc0\xb2\xe4\x1a\xb5\x29\x41\xc9\x78\x93\x2c\x4c\x0a\xb3\x88\x6e\x17\x70\x64\xe6\x10\x22\x88\x2b\x6d\x97\x51\x61\xe2\x34\xe3\xde\xce\xf3\xd5\x8b\x24\x5b\xe6\x2f\x60\x71\xa5\xf9\x6d\xde\xbd\xab\x56\xe9\x7f\x7f\x61\xe3\xee\x8b\xcb\xe1\xf4\xe8\x17\x14\xff\x7d\x54\xff\xf7\xf8\xe4\xcd\xe9\xcb\xba\xfe\xef\xab\x93\x67\xfd\xdf\x5f\xe5\xc7\x9a\x74\x57\xb9\x96\xa6\xad\x77\x2a\xfe\xf6\xcb\xa0\x37\x2e\xfe\x4e\xff\x6d\x7f\x74\xfd\x05\x2a\x57\xf4\xa7\xd1\xc5\xd9\x60\xfc\x77\x4a\x5d\x7b\xa9\xd7\xa4\x0c\x48\x37\xcd\x22\x42\x72\xc4\x7c\x49\x35\xb3\x91\xd3\xfa\x25\x55\xbf\x19\x6b\xe3\x20\x53\xba\xe7\xed\x90\x28\x0d\xa1\x60\x11\xd2\xa0\xa3\x3b\x8c\x81\x17\xb6\x7b\x0e\x3a\x11\xd5\x0a\xa4\x8a\x73\x05\x92\x4f\xc3\xde\x93\x22\x88\xfb\x84\x6b\x94\x78\x6b\xdb\x74\x6c\x23\xbd\x32\xd0\x2d\xaa\xee\x0b\xd8\xf9\x04\x60\xca\x29\x15\x95\x26\x4d\x55\x88\xc7\x9a\x38\x05\x27\x82\x6e\xe1\xa1\x47\x43\x04\xae\xd2\xc3\x1d\x15\x43\x4f\x44\x94\x7e\xb9\x29\x32\x28\x28\x54\xac\x20\x6b\xef\xcb\x4f\x03\x3d\x19\x9d\x4f\x3f\xf7\xc6\xad\xe5\x65\x8f\x3a\xfb\xae\x0e\x4b\x35\xeb\xb0\x74\xb3\x0c\x0b\xb0\xf1\x4f\xf3\xd6\xd5\xae\x7a\xaa\xb6\x6a\xa9\xae\xac\x8c\xa0\x12\x1b\xfb\x2a\xac\xcc\x99\x60\x65\x43\xb8\x14\x27\x2d\xe5\x11\x10\x85\x88\x1c\x50\x9f\xeb\x01\x3c\x76\x3e\x52\x54\x95\x60\xdf\xd7\xbb\xd2\xbd\x3e\xc3\xeb\x7d\x4d\x02\x54\x22\x84\xa5\x04\x5c\x3f\x71\x3e\x1e\x5d\x46\x54\x45\x01\x91\x91\x2b\xfb\xbd\x2b\x2c\x94\xc3\xb2\xac\x60\x46\xa8\xaa\x8e\x6a\x29\xb0\x2d\x67\x83\xde\xc5\xf0\xea\xa3\x2b\x79\xe2\x0f\xff\xca\x57\x4a\xf7\x45\xbf\x7f\xf4\xe1\xcb\xd1\x69\xf7\xf5\x2f\x76\x07\xec\x3f\xff\x5f\x1e\xbf\x39\x79\xd5\xd0\x7f\x7f\x79\xfc\x7c\xfe\xff\x1a\x3f\x7d\x40\x20\xdd\x83\x39\xbe\xb2\xe7\x8e\xbc\x09\x4e\xbb\xaf\xb1\xc2\x6d\xf8\xe3\x40\xf7\x47\x97\x97\x58\x39\x38\xbe\x1e\x51\xdd\xdf\x10\xab\x14\x7b\xfa\xa2\xf7\x59\x9d\x0f\xc7\x97\xb0\xa9\x5d\xf5\x22\x1d\x43\xfa\x62\xf0\xb1\x77\xa1\x27\x83\xf1\x8f\xc3\xfe\x60\xd2\xd5\x67\xc3\x09\x56\xde\xb8\xda\x41\x51\x79\x64\xbf\xad\xec\xb7\xb9\xb6\xee\x4a\xf7\xa6\xd3\xd1\xf8\x6a\xf0\xe5\xa8\x7f\x31\xb4\x07\x03\x56\x2d\x8d\xae\x26\x9f\x86\xd7\xdd\x66\x0b\xe9\xb5\x13\x2c\x7b\x09\x2a\x01\x61\xb7\x1f\xf4\x26\x47\xc3\xc9\x81\xfe\xd0\x9b\x0c\x27\x2d\xdf\xbf\xec\xfd\x03\x74\x40\x9e\x70\xe3\xc1\xc7\xde\x18\x82\x97\x50\x80\x2a\x9e\xc9\x67\x2d\xc6\x45\x7d\x0c\xd4\x17\xea\xd8\x63\x89\xcf\xa2\xf1\x60\x72\x73\x31\xe5\x43\x44\x0d\xa7\x13\x7b\x2c\x74\x95\x72\xfe\x37\x1c\xad\xa3\xf1\x3f\xe8\xc3\xde\x44\x9f\x0d\xce\xa1\x48\xf3\xc3\xe0\x62\xf4\xb9\x13\x1c\xed\x58\x4f\x65\x3f\x3d\x1d\x8c\x2f\x27\x6e\x1c\xeb\xdd\x51\xd7\x37\x1f\x2e\x86\x7d\x37\xbe\x87\x07\xfd\xfe\xf5\xc5\x81\x3d\x89\xa8\xf2\x77\x70\xd0\xe9\x6a\xf7\x5a\x7c\xc7\x14\x2a\x2d\xf5\x87\x2f\xe2\xc0\xc5\x1a\x5b\x85\xe7\x57\xef\xfa\xfa\x62\xd8\x87\x63\xf7\xa2\xf7\xb9\x0b\xe7\xee\x0d\x16\x38\xb9\x47\xe1\x27\xa7\x9f\xec\x14\x4e\xb4\x28\xaf\xe4\xb6\x43\x55\x92\x2b\x38\xf3\x6f\xba\xe8\x7d\xa6\x76\x50\xe5\x5c\x57\xa9\x0f\x5f\xf4\xe0\xa7\xc1\xb8\x8f\x47\x30\x14\x51\x41\x2d\xad\xbb\x8e\xec\x1b\xdd\xe8\x7c\x1a\x8c\x07\x91\xfe\x32\xba\xd1\xbd\x7e\x7f\x70\x3d\xc5\xa2\xe5\x8f\xe3\xc1\x40\x4f\x47\xea\xc3\x40\x7f\x18\xdd\x5c\x41\xff\x9a\x23\x48\x4d\xc2\x31\x71\x65\x63\x1f\xed\x52\x98\xc0\x23\xed\xef\xf1\xe5\xca\xd7\xd1\xda\x37\xd2\x4d\x30\x19\x9e\x89\xca\x58\x28\xa1\xc5\x56\xf4\xa0\x8e\x8d\xea\xc8\xf0\xa5\xb6\x5d\xbe\x6a\x99\x70\xb2\x5d\x7d\xe6\xd5\x28\x95\x8a\xbb\xfa\xa0\xef\x7c\xca\x40\x69\x16\x69\xb8\x88\x59\x0a\xe0\xc0\x6b\x53\x24\xf9\x02\xe0\x9e\x49\x59\x6e\xc0\xc0\xa8\xee\x18\xcc\xa6\x4c\x36\xdf\xce\x21\xb4\x92\xc4\x91\xcf\xce\x5b\x33\x03\x08\xa6\x88\x39\x07\x13\xcc\x28\x7f\xbb\xc9\xbc\x32\x0a\x70\x11\xc7\xd6\x29\x24\xb6\x2c\xe2\x77\xb0\x66\x0d\x73\xc5\x66\xee\x04\x29\x23\x9f\xb9\x06\x8d\x29\x66\xd8\x41\xa7\xce\x45\x7c\x14\x65\x55\xc0\xf2\x5a\x95\x26\xbd\x07\x04\x91\x35\x04\xcb\xd2\xac\x66\xa9\x13\x9a\x15\xbe\x35\x92\x12\x74\x75\x0f\x09\xc2\x58\x09\x91\xf3\xe4\x2a\xd6\xb5\x31\x6b\xe0\x30\x93\x05\x04\x48\x9a\xa4\xb8\x87\x1e\xba\x8b\xb5\x37\x1d\x55\xa3\xfe\x6d\x23\xdd\x9a\x75\x77\x0a\x02\x07\x6c\x69\x50\x9f\xe1\x06\x1c\x84\x0e\xe5\x2f\x3c\x4f\xf8\x1a\x20\x0d\x44\x1b\x4c\xf9\x5d\x3f\xd1\x2c\xc2\x8b\xf5\x03\x1b\xac\x80\x85\xea\x55\xac\xc2\x88\xf4\xa2\x88\x57\x71\x45\xc8\x83\x48\x2d\xd1\xf6\x8d\x53\xfe\x8d\x5e\xe5\xc8\x71\x96\xa0\x94\x27\xc5\x5a\x22\x5d\x42\x60\xa5\x30\x84\xa5\xb5\x53\x51\x85\x05\x0b\x2a\x9e\x15\xc9\xe2\x16\xdf\x33\xcf\xed\x2c\x32\x78\xbd\x89\x52\x6d\xae\x32\x57\x17\x38\x8f\xcb\x2a\x52\xd0\x15\xfb\x51\xe2\x90\x88\x17\xf1\x1a\xfc\x08\x8a\x09\x20\x5a\xa9\x7d\x9e\xb5\x9c\x67\xf5\x7d\xf3\xdc\xc2\xe7\x1c\xce\xe9\x39\x7d\x20\xbe\xcf\x93\x05\xd3\xf9\x2f\xf2\xcd\xac\x8a\x58\xf1\xc4\x6d\x1c\xdb\x12\x9e\x86\x79\xbe\x5a\xe7\x65\xc2\xc8\x28\x18\x4f\x25\xc6\x13\xa0\x18\xdb\x6c\x7e\x57\xe4\x4e\xf5\x9a\x1c\x03\xde\x85\x55\xb2\x32\x8b\xa3\xc2\xa4\x42\x37\x3f\xd6\xab\xfc\x3e\xc9\x6e\x55\xb2\x8a\x6f\x8d\x3e\x3c\x80\x67\x24\xd9\xed\x41\xc7\x61\xfc\xbe\xb3\xc3\x75\x92\x90\x79\xd7\xc7\x72\xa4\xb6\x61\x28\xda\x27\x45\xd9\x81\x74\xa7\xf4\x6d\xf7\x79\xae\x5d\xec\x74\x1a\x7e\x16\x5d\xa1\x47\xda\x03\x90\xcc\xa3\x2f\x7c\xb8\xcb\x1d\xc7\x09\xbf\xb0\xab\x94\xe9\xea\x03\xb9\xdd\x82\x7c\x2b\x64\x40\x61\xe9\xe4\x4b\x02\xe3\x10\x5c\x1b\xc9\x82\x1e\x51\xbd\xe9\x2a\xb5\xec\x92\xb8\xe0\x0e\x09\xc3\x5d\xd2\x85\x2d\x55\x8a\xca\xf6\xe0\x2e\xc6\x08\xa9\xe0\x16\xa4\x60\xe9\x62\x37\xab\x5f\x1d\xce\xa3\xb8\xff\x08\x3d\xa2\xc7\x12\xc2\x6a\xe1\x4a\xdb\xd7\xde\x4f\x77\xe4\x5a\x2e\xfa\xe6\x95\x4c\x8c\xda\xd9\x64\xbd\x30\xe5\x3a\xa9\x50\xa4\x88\x04\x79\x1d\x4a\x0a\x85\x00\xcf\xe3\xa4\xd0\x37\xa5\x21\x78\x49\x13\xc8\x2d\xd8\xd6\x1c\xe5\x41\x95\xeb\xc2\x20\x6e\x19\x5c\x6f\x60\x11\x70\x32\x64\x82\xf8\x2c\x2e\x70\x50\x11\xb7\x69\x5f\x05\x1e\xf9\x32\x29\xca\x0a\x15\x2c\x1c\xf8\x50\x60\x01\x14\x9d\xa9\x5e\x43\x83\xe9\xfa\x97\xe1\xfa\x40\x91\x43\x27\xf9\x28\x64\xd7\xdd\x73\x55\x08\x2e\x2d\x51\xcc\xa2\xc6\xa8\xf8\x27\xc9\x96\xa8\x86\xc4\xe1\x93\x25\x05\xa5\xdc\xc1\xe1\x92\x14\xdb\x16\x9b\x22\x38\x55\x44\x07\x5c\x17\x3b\x92\x41\x94\xd7\x81\xac\x29\x25\x01\x3d\xa6\x69\x27\xba\x45\xb8\x10\xdf\x81\x55\x02\x53\xc8\x22\x7f\x7e\x3d\x42\x3a\x87\x15\x59\xe5\x11\x99\x39\x6a\x32\x94\xa1\xac\x1d\xdc\xa5\x0b\x86\x34\x9f\x8a\x9a\x57\xee\xa1\x82\x88\x31\xb8\xe3\xcb\xf7\x7c\xbc\xcc\xa0\x79\xcc\x7b\x1f\xc8\x11\xd6\xe1\xf6\xef\xe1\xd8\xab\x72\xa9\x84\xc0\xd1\x9a\x42\xaf\xef\xf2\x2c\xc7\xb3\xbb\x04\x89\x12\x12\x67\xd0\xac\xbc\xe6\x54\x1a\xfc\x6f\x00\x98\x52\xff\xad\x9e\x6d\xe9\x04\x01\x70\xfa\x22\xb9\x4d\x2a\x7b\x65\x6f\x16\x49\x8e\xb7\x39\xef\x54\x31\x62\x4e\xd1\xbf\xd9\xfd\x96\xae\x2f\xfe\x4b\x75\xa3\x21\x47\xc0\x73\x43\x0a\xae\x8f\xdf\xac\x0f\xfb\x6e\xd6\x77\x4a\x25\x20\x42\x0a\xda\x11\xf6\x11\x63\xd8\x25\xb6\xc3\x37\xb0\x9b\x3f\xa4\x71\xf6\xd5\x67\x3c\x4b\x51\x8b\x0e\x35\x09\x65\x78\x42\xf8\x82\x12\xb2\x32\x7d\xb1\x8b\x3f\xf0\x53\x48\xbf\x03\xdb\x2b\x0f\x0d\xbc\x9b\x2b\x85\xf2\x79\x62\xaa\xad\x42\x35\xb9\xde\xa4\xdf\xbb\x8e\xf4\x87\xcb\x61\xa4\x27\x83\x49\xaf\xdf\xe1\xad\x9c\x08\x54\x05\xd5\x8b\xc9\xa7\xd9\x09\xc3\xdf\xd2\xf8\x2a\xf9\x57\x7c\xf8\x83\x99\x59\xf3\xa9\x23\x2d\x87\xae\x52\x49\xd2\xd5\x97\x66\x7e\x17\x63\xcd\x97\xd0\x32\x99\x54\x71\xb5\xa9\xf2\x62\xeb\x07\xea\xcf\x3d\x22\x30\x4d\xee\xe0\x86\x92\x26\xd4\x4c\x2f\x93\x5b\xaa\x6b\x07\xd1\x66\xec\xc1\x27\xd0\x57\x3c\xcf\xbf\xe9\x1e\x7c\xb4\x31\x3a\x10\x34\xf6\x0b\x17\xb5\x16\x71\x4b\x53\x5d\x3f\x5b\xec\x07\x28\x8f\x4a\x26\xec\x41\x27\x2c\x9b\xc5\xb0\xac\x3c\x9e\x41\x54\x3d\x2d\xed\x60\x70\x46\x90\x0d\x8b\xd9\x56\x9f\xbc\xd5\x37\x93\xbe\xaf\x1e\x3f\x79\xed\x70\xaf\x13\x11\x20\xef\xcd\x2b\x60\x44\x86\x31\xfb\x97\x4d\x72\x1f\xa7\x58\x0b\x4d\x06\xbc\x44\x99\x83\xbc\xd5\xb2\xab\x3f\xe3\xac\xd9\x0b\xed\xb1\xa9\xd9\xb3\x47\x54\x9b\xf5\xd9\x30\xdb\xf7\xce\xad\x63\x98\x53\xdf\xbf\xda\x8f\xc2\xd5\x4e\xd3\x39\xb1\xef\x1f\x7c\x43\x99\xcb\x0e\x8b\xf2\xb4\xac\x74\x3e\x33\x9e\xb6\xa6\xa3\x06\xba\xb4\x31\x77\x7a\xdf\xdc\xbd\x6a\x9b\x3b\xb5\x73\xee\xf4\x8e\xb9\x03\x0c\xff\x2c\xf7\x86\x04\x39\x31\x7c\x73\x2e\x58\xe6\x16\x4a\x35\x58\x2a\x67\x15\x57\xa5\x1b\xd7\x2c\x7f\xd0\x5f\xb3\xfc\x01\x04\x9f\xed\x04\x62\xd9\xd1\x02\x59\x19\xa9\x4c\x40\xbe\x42\xaa\x24\x7a\x42\x40\xd4\x3d\x99\xdf\x85\x2a\xe1\xf6\x8a\x00\x0e\x77\x2e\xc1\x4c\xb7\xda\xa3\xd0\x77\x5e\xf1\xd4\xdd\x46\xa3\xbb\x4a\x00\xc6\xac\xb5\xea\xcb\x0b\xb8\xb2\x5b\x16\x8d\xd9\x37\x93\x0d\x23\xd0\x65\xaf\xba\x35\x1d\xe8\x69\x0b\x97\x69\x20\x33\x8a\xdd\x0f\xaa\x19\x00\xcc\x18\x70\xb0\x2f\x5c\x35\x36\x21\xd3\x7d\x1a\x5e\x22\xf5\xd1\x48\x71\xe5\x72\x75\xe9\x95\x39\x16\xd3\x90\xd0\x12\xff\xc6\x29\x2e\xb9\x23\x18\x3e\x06\x0b\x36\xdd\x2a\x59\xfe\x87\xfe\x7b\x96\x6e\x1f\x57\x5c\x75\x52\xbd\x42\x27\x58\x39\x9d\xe0\x88\x41\x11\x37\x59\x02\x4f\x1f\x1b\x62\x95\x1f\x2e\xac\x73\xb1\x4c\xd0\x95\x6e\x54\x0f\xb1\xa0\xb0\xc2\x07\x05\xb7\x7c\xe0\x50\xd6\xa5\x83\x77\x0f\x80\xda\x3f\x00\x3c\x3e\xdd\x56\xe5\x61\x5d\x57\x1e\x56\xd2\x9a\xd9\xa9\x38\xbc\xcb\xe5\x61\xe4\xaf\x97\x1f\x56\x6e\x11\x53\xef\x76\xd1\x9f\x84\xed\xf3\x39\x39\x71\x53\xba\xf9\xd8\x25\x07\xed\x95\x9f\x1b\x05\x4a\x64\xa7\x82\xa9\xed\xd4\xa8\xad\xeb\x48\xfc\x61\x8e\x74\x92\x5b\xf0\x9d\xab\x4f\xed\x1d\x7c\x3f\xa4\x4e\x2b\xc1\xe1\x43\xe1\xd2\x5f\x99\xb8\x04\xde\x4c\x00\x5c\x31\x1d\x5b\x3c\x9f\x13\xdb\x99\x40\x47\x73\xbc\x21\xd6\xab\x38\xcb\xe0\xf0\xf7\x6c\xc4\x35\x51\xbf\x46\x09\x9f\x2b\x5f\x91\x67\x57\x0d\xed\xb9\xc3\x7a\x6f\xc6\xe7\x90\xd9\x0e\x9e\xef\x40\x44\x4c\x09\xde\x62\xea\xeb\x18\x40\xdb\xa1\x1d\x40\x14\x22\x58\x23\x09\x44\x48\x4f\x62\xcc\x67\xf5\x00\xbc\x46\xda\x9a\x06\x31\x3a\x49\xa6\x62\x07\xdd\x9d\x7e\xbc\x94\xea\x72\xd6\xeb\x22\x9e\x57\xe8\x77\x45\xaa\x30\x2b\x3b\x3c\x42\xa8\xa9\xd6\x9f\x0c\x74\xba\x16\x09\x80\x60\x24\x67\x16\x56\xbe\xe8\x57\x87\xb3\x4e\xa4\xe3\x52\xb9\x7a\x96\x5a\xc3\x9b\x11\x9f\x47\x1a\xae\x9e\xd2\x70\x5d\x6f\x78\x43\xc2\xcb\x35\x5c\xed\x6f\xb8\x2f\xc4\xc1\x70\xe9\x70\xd9\x2e\x8a\xf5\x67\x3a\x99\x5b\x65\x8b\x60\xfd\xd7\x5d\x27\x2f\xc9\x0c\x87\x81\x12\x87\x41\x53\x38\x98\x8d\x19\x8e\xd6\x72\x19\x72\x44\xc5\xbf\xbe\xe8\xc1\x90\xb6\x85\xdd\xcd\xe8\x32\x31\xde\x6e\x53\x25\x69\xf2\xc7\x24\xbb\x7d\xa7\x0f\x93\x0e\x7c\x14\x38\xd6\xeb\x75\x04\x18\x17\x03\x43\x65\x5d\x9a\xcd\x22\xcf\xb6\xab\x48\x05\xe5\xae\x1d\x94\x2b\x80\x4d\xb7\x70\x90\x83\xc3\x24\xe9\xb0\xf6\x4d\xfd\x69\xf4\x11\xb7\x08\x9c\x75\xee\xf4\x41\x10\x35\x45\xca\x48\x76\x2f\xa3\x75\x16\x6b\x40\x09\x02\x0f\x30\xc5\x5f\x1d\x08\xc2\x5e\xbe\x18\x08\x8b\xd4\x1f\xf2\x4d\x91\xc5\x69\x07\x6d\x78\x91\x51\x4c\x32\xc9\x29\x57\x1f\xda\xc8\xef\x4e\x6b\x41\x24\x73\x20\x7d\x98\x39\x82\x11\x3f\xba\x30\x98\x51\x30\x6c\x60\x10\xd5\xdb\xfd\x1e\xf7\x7c\x52\xa5\x46\x05\xe7\x9d\x1f\xb1\xf7\xb5\x95\xef\xde\xb2\x0d\x37\x81\xb8\x9e\x55\xcb\xf5\xcc\xf2\xbb\x51\x4d\x8a\x81\x4a\x8b\xf1\x38\x9c\x19\x89\x6a\x01\x2a\x2d\x6f\xe4\x12\xb4\x1d\xfa\x71\x33\x1e\xca\x33\xd0\xdd\x40\xa6\x31\x66\xc8\x33\x4f\x28\x5b\x25\x75\x14\xe5\x32\x7d\xcf\x30\x3a\x78\x44\x4c\xd2\x85\x2d\x82\x5d\x7c\x00\x25\xd8\xb1\x2d\xd7\x5a\xb7\x5c\x18\x6d\x27\x01\x2c\x93\x48\x1f\x9c\x17\x26\x9b\xdf\xc9\x14\x05\x93\x2a\xb3\xe8\x60\x6d\x4d\x46\x00\x49\x3c\x98\xcc\x0b\x63\x32\x08\x4b\x38\x65\x99\x9c\x3f\x59\xff\xaa\xa2\xa0\x71\xa7\xab\x27\x20\xac\x82\x4d\x67\x56\xe8\xd5\x3a\x85\xab\xc9\x2b\x9c\xc9\x05\x04\x77\xdd\x7b\xc7\xa1\x12\xa9\x3b\xa6\xc2\x67\xe1\xbd\xbd\x43\xd5\x72\x88\x20\x9d\x96\x5e\x25\x59\xb2\xda\xac\x90\xbd\x8e\x9a\xc4\x65\x5c\x26\x2e\x28\xb8\xe1\x33\x24\x00\x51\x2e\xb0\x68\xcc\x07\xa7\xf9\x1e\x80\xef\x60\x9d\x93\xbc\xa3\xe3\x4a\xa7\x26\x2e\x59\x52\x8f\x94\xe3\x63\x5a\x3d\x7b\x1e\xac\xf0\xc1\x18\x89\x79\x6d\xad\x73\xe2\xf9\xe0\x32\xd6\xcf\xce\x7e\x81\x25\x73\xe6\x8d\x1b\x75\x73\x75\x01\x20\x21\x06\xc4\xe8\xcb\x9b\xe9\x4d\xef\xe2\xe2\x0b\x26\x56\x01\x18\x44\x09\x55\x80\xfb\x0c\x00\xdc\xf2\x79\x3c\x9c\x0e\xaf\x3e\x46\x82\x80\xf3\xfc\x7c\x30\x9e\xf8\x44\x37\xa4\xe3\x21\x11\xea\x32\xef\x92\x7f\x17\xc8\x9c\xc7\x35\xb8\x91\xa3\xc0\xee\x8f\xae\xfa\x83\xf1\x15\x67\xe6\xed\x03\x1d\x9e\x29\xf2\x35\x4b\x93\x69\x6f\x7a\x03\x9c\xcf\x21\xa4\xc7\xb3\x4d\xeb\x96\xaa\x24\x15\xbe\x74\x3a\x9c\x5e\x0c\x22\x07\x75\x1a\x3e\x56\x98\xe4\xa9\xa3\x6b\x38\xa7\x48\x11\x24\xa8\xf7\x61\x32\xa0\x9c\xf0\x45\x6f\x4a\x25\x4b\x0c\x10\x02\x4a\xe4\xc8\x73\x4e\x33\x8e\x08\x87\x06\xbf\x45\x0f\x50\xa3\x73\xe4\x55\x9e\x38\xc2\x55\x2c\x7e\x9a\x02\x22\x61\xf4\xe3\x60\xdc\xfb\x70\x31\x78\x94\x70\x14\x08\x4c\x07\x3f\xf5\x2f\x6e\x26\x94\xbd\x6e\x72\x6d\x03\xa3\x28\x64\xb0\xfd\x07\x5b\x09\x45\x41\x67\xe3\xc2\xa3\xea\xa0\x98\xc2\xf1\x66\x0c\x7e\x82\xbc\x7c\xc8\x97\x4b\x4c\xd3\x90\x98\x0f\x11\x06\x91\x92\xd0\x30\xe0\x84\x76\x0b\xca\x23\xc0\xf0\xcd\x88\xf3\xf8\x42\xb8\x13\x22\x9c\x65\x70\x18\xf3\xe5\x2a\x49\xa2\x1b\x50\xa7\x46\xfa\xfa\xe6\x6a\xc8\xc4\xcf\x83\x9f\x06\x97\xd7\x17\xbd\xf1\x97\x5d\x34\xba\x75\x18\x83\x83\x7a\x79\x24\x44\x0b\x0b\xed\x13\x18\x67\x55\x8d\x71\x16\x37\xed\xdb\x80\x7b\x12\x3c\xdc\x3f\x85\x17\xb2\x46\xe2\x09\xd6\xa2\x3d\x9c\x88\xb0\x91\x94\x34\xe8\xe8\xdf\x65\x3c\xbb\x70\x51\xe9\xd2\x61\x89\x29\x29\xd7\x05\xf5\xd7\x94\x95\x7a\x8a\x2d\xe6\x84\x7f\x45\x2e\x4a\x39\x47\xda\x1d\xd3\x2e\xc9\x0b\x6f\x40\x2e\x38\x4f\x54\xe7\x78\x34\x3d\x4b\x16\xc9\xc8\xba\xa6\x2a\xd1\x54\x41\x1b\x07\x24\x24\xcd\x2a\x58\xeb\xd5\xa6\x2e\x8c\xec\x48\x41\x4e\x22\x7d\x1a\xa9\xd7\x91\x7e\x13\xe9\xb7\xe8\xe6\xff\x16\x9b\xb6\x9b\xdb\xae\x05\x37\x50\xcb\x1d\xa1\x1f\xd5\x96\x41\x0a\x94\xd0\x83\xc9\xd5\x49\xa9\xc2\x44\x90\x7e\x6a\x22\x88\x6f\x3b\x3b\xfc\x9d\x86\x10\xa5\x72\x2d\x8a\x24\x73\x07\xc4\x78\x6a\x52\x15\xa4\x08\x51\xcf\x05\x3b\x4a\x56\x15\xd6\x2a\x63\x06\xb2\xac\xf2\xb5\x20\x38\x24\x0e\x4a\x34\xae\x3d\x3f\xa5\xb8\xaa\x79\x0d\xa8\x50\x11\xc6\xa4\x14\x44\x72\x2b\x03\x9a\x08\x48\xda\xa4\xba\x5b\x14\xf1\x43\x4d\xe8\x5f\x22\x15\x7c\xd3\x50\xc8\x15\x95\x49\x22\x12\xd9\x75\x3e\x0d\x18\x71\x51\x83\x4e\xb8\xb6\x35\x78\xb9\x76\xb8\x86\xf7\xbb\x59\x6f\xda\x09\x61\x29\x03\xc7\x22\xb5\x5a\xeb\xdf\xd6\x18\xf5\xe0\x3c\x00\x99\x16\x20\xf5\x0c\xc3\x3e\xfb\x23\x3a\xa1\xe3\x54\xcf\xcd\x45\x61\xe6\x98\x93\xfe\x79\x18\xa0\xd1\xb1\xcc\x29\x8a\x18\x19\x22\x1e\xe2\x15\x83\x02\x6a\x79\x51\xd2\x3c\xa9\xaf\xeb\x9d\x02\xff\xb8\x6b\x7e\x66\x3f\x9b\x76\xaf\xfa\xfe\x7e\x85\x56\xe9\x2f\xd1\xc1\x39\xf8\xc7\xfb\xe9\xb6\x20\x9f\x8e\x75\xf8\x79\x11\x72\x42\xb1\x94\x8e\xdb\xef\x2a\x8d\x1f\x22\x9d\x30\x19\x96\xdd\x20\xb1\xe7\x76\x82\x87\x10\xe3\x64\x48\x67\xe4\x22\x6d\x4c\xe4\xc4\x3a\xc4\x7b\x42\x9d\x8c\xa9\x67\xc6\x53\xe2\x8b\xa5\x68\x2d\x3b\x95\x14\x54\xf3\x34\x26\x04\x6f\xf2\xfd\x75\x54\x24\x85\x41\x78\x90\xf3\xab\xd1\xca\x66\xa7\xcd\xc5\xb9\x55\x10\x1f\xf7\x0f\xc2\x31\x42\x6d\x16\x37\x44\x5d\x48\x98\x5e\xe5\x44\xe1\x5b\xec\x19\xe8\x9a\x2c\x22\x26\x54\x16\xac\x76\x8d\x97\xa5\x22\xb2\x21\x6c\xa5\x74\xe7\x98\x00\xad\x70\x7c\x44\x42\x19\x10\xa8\x7a\x99\xe8\xd5\x3a\xe2\x66\xa1\xc4\x40\x6d\xc9\x71\xc4\x52\x0a\xaa\xfe\x6f\x7f\x2a\x22\x61\x9e\x40\x1c\xa3\x1f\x27\x8e\x51\x35\xe2\x18\x58\xe6\xae\xbe\xd1\x5e\x38\x10\xf2\x2b\x50\x5b\x3d\xcb\x71\xb9\xf1\x9d\x01\xa2\xf5\xf4\x8a\x12\x71\x1d\x81\x9f\xd1\xca\x4d\xf3\x99\x45\x49\xd9\x67\xe6\xf7\x78\x67\xfa\x0e\xa8\x75\x10\xd9\x35\x83\x6c\x17\x89\x30\x7b\xc9\x40\x3f\x89\x14\xc0\x05\xce\x0c\xf4\xbd\xc8\x0f\x0c\x44\x2c\x14\x9b\x1b\xb5\x91\xe3\xc0\xed\xcc\x68\x07\x7f\xe4\x65\x0d\x2b\x70\x03\x17\x2d\xf3\x2c\xbb\xee\xaa\x80\x7b\x0d\xa3\x2d\xf0\x78\xa5\x1a\x60\x6b\x52\x01\x89\xfd\x44\x37\xb7\x92\x5d\xcd\xf6\x63\x5e\x99\xe2\xe1\x2e\xae\xca\x1c\x6e\x40\x20\xec\xc8\x32\x77\xf1\x55\x1e\x63\xd7\xd5\x8d\xd7\x49\x5c\x9c\x27\xa2\x05\xfb\xae\x50\x8e\xab\x55\x93\x05\x88\xc4\x92\xd5\x9d\xc9\x8b\xad\x4b\xc6\x32\x19\xad\x6f\x43\x4b\x29\x8d\x12\xa5\x34\xf6\x4b\xa4\xd2\x1b\xe1\xc4\xda\xff\x48\xb2\x39\x44\x18\x10\x3f\x05\xcb\x17\x74\xb4\x92\xd8\x4b\x09\x10\xec\xa7\xd6\x47\x1e\x23\x27\xb7\xbb\x57\x36\x5b\x57\x0f\xb9\x3e\x3c\xed\x68\xd8\x97\xd9\x1c\x94\x54\x96\xcd\x91\xb9\x93\xba\xa2\x1c\xfc\xb0\x33\x4e\xf1\x64\x3a\xbe\x03\x76\x31\x58\xf0\x91\x72\x07\x2a\xb2\xa2\xf8\x9c\x19\xb0\x7f\x08\xdd\x3f\x51\xf6\xd8\x55\x6a\x80\xc8\x46\x36\xd3\x38\x9f\x25\x90\x88\xc4\x6c\xe0\xe8\xd1\x5c\xf6\xd4\x91\x67\x53\xe6\x57\x35\x29\x26\x74\xbf\x7f\x7d\x11\xe9\x8c\x6a\x6f\x05\x07\x71\x43\x42\x52\x1f\xd4\x47\xe3\x40\x39\x2e\x43\xc2\xa4\x49\x41\xc8\x34\xbf\xcd\xa1\x0e\xb8\xb9\xba\xfc\xe6\x40\xce\x67\xda\x1b\x7c\x2e\xb6\x7d\x0b\x8b\x9f\x7d\xc1\xe7\x46\xb0\x15\x36\xd9\x68\x1a\x3b\xe8\x07\xfb\xb6\xec\x88\xe9\x86\x76\x97\x79\x46\x42\x8d\xc2\x69\xb2\xa9\x1c\xc1\xce\x0f\x66\x56\x26\x55\xc8\x55\x8a\xc9\x03\x4f\xa1\x02\x8e\x11\x85\xaf\x5b\xa4\xf1\x5a\x36\x37\xbd\x0d\xca\xe3\xe7\x54\x58\x7a\x57\x55\xeb\x77\x2f\x5e\xcc\xe9\xb3\x73\x1a\x84\xbc\xb8\x7d\xf1\x97\xa9\x25\xed\xbe\xf8\x90\x6e\xcc\x28\xfe\x7a\x74\xd2\x3d\xee\xfe\x32\x75\xa0\x8f\xd4\x7f\xbe\x3c\x3e\x79\x5b\xab\xff\x79\xf9\xe6\xf8\xf4\xb9\xfe\xe7\xd7\xf8\xf9\x1b\x6d\xe7\x5f\x8f\xe2\xaf\xfa\x32\x5f\x98\x54\x10\x4b\x78\x92\xab\xee\xb1\x52\x7f\xf3\x37\xfa\x1a\xcf\x26\xa2\x28\x72\xa6\x2c\x20\x4b\x20\x0b\x9d\x67\x40\xdc\xb2\x02\xd3\xcb\xe3\x4e\xad\x03\xe6\x72\x95\x41\x9d\x27\x88\x5c\xe4\xc8\x38\x1a\xe9\x87\xbb\x04\x08\xd4\xf2\xca\x9e\xf5\xc0\xcf\xe0\x88\x7a\x4a\x56\x48\xe6\xf8\x11\xb4\xa8\x87\x52\xec\xd9\x1c\x38\x4d\x74\x5e\x2c\x30\x50\x4e\xf1\x86\xe0\xa6\x88\x20\xd5\x04\x29\x1e\xcf\xd2\x5f\x95\xba\xd8\xa4\x86\x80\x09\xf0\x9f\x0e\x13\xed\xa8\x68\x0a\x6b\x6b\x54\x77\xc1\x61\xce\x27\x6d\x5c\x09\x5b\xaa\x66\xf3\x57\x39\x50\x6b\xaa\x40\x19\x1e\x1a\x00\x09\x61\x28\x89\x45\x98\x6c\x73\x64\xe8\x90\x2f\x92\xdb\x5b\xe0\xaa\x86\xb6\xa1\xc3\x6b\xbb\x31\x8f\x33\x48\xbb\x7b\xca\x5a\x82\x40\xe0\xb8\x78\x94\x8b\x02\x1f\x49\x0c\xa4\x8f\x91\xd8\xe7\x60\x0d\x29\x4c\xde\xfe\x96\x80\x8e\xb4\x92\xb4\x3b\x28\xb5\xe0\xe0\xf8\xfc\xfc\x20\xad\x03\xc5\x24\xd8\x24\x24\x36\x2a\x95\xcf\xba\x03\xc5\x04\x3d\xc0\x2d\x9f\x87\xbb\x5c\xdf\x1a\x7b\x7b\x32\x36\xc2\x91\xc8\xeb\x7a\x95\x30\x5a\x6e\xdb\x7c\x13\x11\x6d\xb7\x67\x60\x44\x08\x92\x3d\xf5\xd3\x92\x1e\x88\x1e\xcb\xb7\x4a\x30\x49\x38\x90\x41\xac\xd2\x24\xfb\x6a\x47\xe3\x6f\x99\x49\x62\x96\x6e\x4c\x1e\x7f\x9d\xe7\x9b\x6c\x9e\xa4\x70\x42\xd3\x17\x5e\xc0\x8e\xf8\x3b\xec\xd6\xe0\xdb\x7c\x03\x8c\x3a\xd0\x4e\xdb\x83\x2c\xaf\x30\xdf\x63\xc7\x57\x58\xf7\x6e\xee\xc0\x4e\xb0\x33\x86\x97\x1b\x9b\xf4\xff\x48\x23\xf4\x4f\x87\x7f\x43\x89\xc6\x8e\x8a\x78\xb2\x11\xa2\xb0\x95\xaa\xff\xd6\x45\x88\xbf\x82\xdf\x90\xa6\x2e\x55\x95\xea\xb2\x32\xeb\xb2\x26\xd8\x92\x64\x8a\x25\x57\x10\x71\x04\x89\x33\x78\x8b\x4f\xc2\xe6\xbc\x2c\xcb\x3c\x0a\x5f\x65\xb2\x45\x29\x29\x68\xb1\xeb\xd7\xa0\xaf\xf1\xcb\xaf\x30\xa1\xe5\x41\xd2\x6d\x40\xec\x68\x47\x45\x4c\x21\xe8\xc8\x18\xcd\x46\xad\x53\x38\xb7\x2d\x1d\x1b\xaf\x5b\xa5\xae\xf2\xa0\xb1\xf6\x31\x85\xb9\xcf\xbf\x86\xa7\x05\x2f\x5a\x1f\xb1\x56\xea\x37\xbf\xf9\x4d\xaf\xd4\xcb\xb8\x70\xde\x7c\xfc\x60\x07\x3f\x7f\x60\x5a\x5f\xd7\x23\xdb\x16\x70\xfa\x93\x32\xf2\xb4\xa0\xd9\xd6\x19\xf1\x0a\xcd\x5e\x3c\x2a\x58\x37\x39\x68\x58\xab\x62\x84\x5d\x60\x35\x53\x5c\x39\x2b\x2d\xaf\x35\x22\x2f\x6a\x07\x20\x45\x04\xb2\xad\xfe\x9a\x64\x0b\x4f\x1e\x0f\xc3\xda\xfd\xcd\x6f\x7e\xf3\xdf\x9e\xce\xe2\xf9\xe7\x3b\x7f\xba\x2f\x7e\x7f\x7d\x01\xb6\xdf\x2f\xc7\x00\xb2\xdf\xfe\x3b\x39\x7e\xf9\xa6\x51\xff\xfd\xfa\xcd\xc9\xb3\xfd\xf7\x6b\xfc\x4c\x3f\x0d\xf4\xef\x75\xad\x44\xf8\x5e\xf0\x9b\x0a\x8a\xc1\x3e\xb0\xce\xfe\xee\xe8\xf4\xf8\xf8\xb5\x9e\x16\x79\x9a\x56\x66\x7e\xa7\x7b\x93\x48\x5f\xe5\xc5\x43\x6c\xef\x85\x01\x5f\xe4\x89\xa4\xf1\x81\xdb\x68\xbd\xad\x61\xb2\xc3\x6b\x98\x39\x3e\x08\x69\x2b\x59\xe5\xc3\x02\xa2\x2a\xd7\xa6\xac\x62\x14\x34\x5f\x16\xc6\x2c\xac\x33\x96\x5b\x2f\x9c\x98\x43\xf0\xf6\x07\xb8\x81\x3b\x0c\x89\xab\x99\x21\xa3\xe2\x91\xde\x69\xce\xd7\x26\xd3\x84\xec\x58\x59\x6b\xb8\x5b\xb3\x75\x05\xb2\x0d\xa5\x78\xdc\x71\x9f\x79\x46\x13\xc2\x65\x00\x6f\xb9\x03\xa8\x3a\x9b\x48\xdd\xe5\xa9\x7d\x5f\x19\x6f\x9d\x55\xe0\x41\x0b\x92\xc7\xb3\x35\xb7\x60\xec\x6c\x85\x8c\x6d\x62\xb6\x08\x08\x21\x59\xbd\x51\xaf\x04\x31\x24\x94\xc0\xa0\xdb\x8b\x59\x45\x28\xee\xe5\x50\xf0\xb9\x7d\x60\x00\x2d\x6e\x48\x50\x35\x49\x4c\x1c\x3e\x24\x29\x16\x47\x24\xf6\xe5\xf9\xce\xd5\xba\xc8\x6f\x8b\x78\x55\x7a\x54\x47\xd5\xe0\x40\x59\x78\x25\x10\x90\x8a\xb0\x36\xba\xeb\x09\xd6\x8f\x6e\x4a\x53\xaa\xa0\xed\x4a\x7d\xa4\x50\x3a\x31\x1b\xab\x13\x4f\x6a\xe6\xa2\xec\x60\xed\x88\x92\xa9\xa6\xac\x4b\xbd\x50\x8d\x93\x4d\x40\x1b\xec\xfc\x05\x34\xf0\x9d\x59\x85\x91\x47\xe2\x8f\x16\x86\x7f\xed\x61\x5d\xfd\xf9\x2e\x4f\x01\xcb\x04\x11\xd6\x38\x7d\x64\x30\xa1\x62\x94\xa7\xb0\x32\xc4\x9b\xa7\xc1\x46\x75\xa0\x21\xff\x71\x8a\x6a\x42\x6e\xa3\x4c\x6e\x33\x34\x3f\x63\xe7\x1b\xd5\x37\x11\xd6\xec\x79\xf5\xfc\xb6\x8d\x29\x49\x67\x1a\x15\xe0\x42\xf0\x88\x75\x37\x28\xae\xbc\x8e\xe7\x5f\xe3\xdb\x40\x3f\xeb\xc8\x29\x68\x31\xe0\x17\x57\xe1\x91\xdf\x13\x91\x0f\xdc\x28\x06\xd9\x51\x8b\x08\x7c\x52\x12\x7a\x10\xd2\x8b\x6e\x53\x41\x85\xbc\x1d\x4d\xa6\xe1\x6d\x0c\xa5\x0a\xb9\x71\xb1\x6e\x8f\x7b\x0e\x79\x82\x00\x42\xcf\x81\xb6\x89\xe4\x21\x12\xe3\x02\x56\x71\xf0\x0d\x60\x6e\x8e\x35\xe5\xcf\xec\x5e\x2e\x7d\x95\xbb\x03\x4c\xfa\xb9\xe2\xf2\xed\x75\x5c\xcd\xef\xd8\xef\x74\xe8\x75\x15\x32\xeb\xb3\x08\x49\xf0\x46\x04\xb5\xd7\x14\x3f\xd9\xa9\x14\xe0\x6a\x80\x6c\x62\xb4\xbb\x0e\x60\xac\x11\x24\x61\x32\xed\xf3\x9d\xc9\x1e\x1b\x0d\x38\x47\x69\x0e\x44\xce\xca\xd3\x1d\x85\xdb\x4c\xc9\xaa\x45\xca\x12\x27\xa5\x4c\x7e\x3d\x69\x16\x75\x95\xab\x7d\x93\x80\x49\x54\x59\xc1\xde\x60\x59\x0a\x51\x00\xca\x7d\x8c\xd2\xfe\x22\xcc\xc7\x87\xae\x4b\x52\xdb\x3f\x53\x72\x21\xd4\x3b\xa3\x5e\x1f\x96\x1d\x0e\xf9\x37\x7a\x82\x15\x10\xcd\x02\x04\x16\xc6\x3e\x32\xdf\xcc\x7c\x83\x15\xca\x76\x09\x35\xdb\x0d\xc2\xa4\xf5\xcf\x2a\xf7\x59\xb7\x2d\x77\x75\x3c\x0a\xf7\x2a\xc6\x40\x8c\xa9\xa8\x8b\xb5\x6a\x09\xac\xce\x8b\xbb\x8d\x52\x85\xf6\xab\x9a\x17\x92\x3c\xcd\x70\x31\xb5\x3a\xf9\xc8\xb2\xcf\x50\x7e\x6e\xe9\xce\xa1\x80\xf8\x90\x75\xdf\xd9\xff\xf1\x51\x1d\x2c\x01\x4a\x8d\x18\xc9\xc2\xc4\x0b\xf8\x20\xdd\xdf\xc0\x45\xe9\x11\xfa\x7c\x02\x28\x79\x6c\xf2\x11\x05\x45\x3b\xa1\x22\x93\xf4\xd9\x30\xf3\x46\x42\x82\xf4\xf6\xb2\x02\x30\x3c\xe8\xb2\x21\x7b\x81\x21\x19\x2d\xd4\x2b\xf1\xa0\xbc\xda\xa6\x0b\x4e\x7e\xf3\x6d\x9d\xa2\xdd\x00\x21\x27\x4c\xfa\xee\x1c\xbb\x70\x73\x3a\x3a\x70\x7a\xf0\xce\x65\x02\x3b\xb7\xb9\xc0\x6b\xe9\x5b\x7f\x37\xbc\xf6\x2b\x96\x93\x05\x2e\xd9\x9d\x17\x8f\x2f\x39\x8e\x3d\x00\xdb\x3b\xdc\x59\x50\x7d\xbb\xc9\x02\x05\x14\x67\x11\x80\x0b\x1a\x50\xbe\xce\xb6\xb0\x4c\x05\xf4\xb7\x44\x2c\x59\x4d\xf8\xaa\xf5\x79\x91\x2e\xcc\xa6\x24\x7c\xcb\x6a\x9d\x67\xb0\xd6\x20\x17\x03\xbb\xd6\x0b\xe8\xb5\x5c\xac\xdf\xdf\x59\x38\xc0\x4b\x7a\x1a\x14\xd0\x65\x72\xb9\x05\xe2\x08\xbc\x1c\x65\xb1\x12\xc0\x4a\x20\x4b\x2a\x8a\x95\x1e\xdf\x38\x8f\x9c\x1f\xdc\x20\x9c\xfb\xb6\x3d\x64\x07\x84\x67\xf7\xb1\xbd\xa4\xe4\x5e\xc2\xe7\x3e\x61\x7b\xe8\xfa\xf6\xa8\x9f\x0c\xdf\xec\xe4\x25\x55\xea\x8b\xf8\x9a\xfd\x84\xb3\x9e\x66\x0a\x88\xf8\xa8\x92\xfb\xc8\x8f\xb1\x72\xf3\x05\xd9\xd2\x5d\x13\x86\x0f\x49\x32\x0c\xe5\xb6\x8c\x5f\x9c\x2d\x94\x3c\x3b\x60\x3c\x29\x2e\xec\xdb\x04\x4d\x9f\xf9\x38\x13\x84\xcb\x5a\x86\xa3\x54\x32\x43\x4a\x98\xbc\x6d\xe3\xeb\x41\x4f\x44\x8c\x07\x23\x5c\xa0\x46\xed\x90\x20\xbe\x17\x98\x71\xaf\xc4\xae\xa6\xc9\xa1\x44\x2b\x25\x0a\xbd\x80\x40\xe3\x62\x52\xf5\x3d\x4b\x99\x2d\x19\x77\x75\xef\x03\xe8\x4f\xe6\xc3\xe7\x80\x9c\xdf\xea\x3c\x33\xc0\x5b\xe5\xd5\x17\x20\xc3\xe9\xc2\x65\x4d\x39\xf9\xd6\xa6\x94\x98\x01\x66\x1b\x05\xdd\xa3\x52\x44\xbe\x96\x94\x9c\xde\x9f\x7a\xde\x6d\x66\xa6\xc8\x36\x8f\xe2\x4e\x79\x61\x7d\x91\x25\xe9\x82\xb1\x62\x55\x01\xd5\xaf\x49\xc6\xff\xf5\x3d\x79\xea\x48\xd9\x47\x53\xa9\x05\xe9\xcd\x80\x10\x6e\xbc\x80\xaa\x4e\x27\x8c\x06\x79\x0e\x87\xa8\x01\x43\x90\x1f\x41\x3c\x37\x2a\xac\x44\x48\xb2\xfb\xb8\x48\x98\x74\xc2\x17\x18\x38\xd5\x3b\x29\xac\x78\x95\x33\x74\x7b\x8b\x0e\x74\x60\xc3\xb6\x5f\xdf\x81\x61\x04\x4c\x91\x78\x0a\x7a\xea\x33\xc0\xa0\x7a\x9e\x48\xcf\x09\x29\x08\x20\x81\x4b\xf2\x6c\x30\x19\x7e\xbc\x8a\xea\x34\x90\x80\xea\x7e\x8c\x09\xb2\xab\x54\xff\x2e\x4f\xd0\x51\xb9\x88\x1f\x6a\x4e\x77\x52\x36\x84\x88\x2e\x48\x88\x88\xc2\x0e\xac\x4f\x56\x7a\x58\x4d\x69\xaa\x2a\x45\x20\xcd\xa8\x4c\x73\xdd\xb7\xc3\xde\xcf\x37\x45\xf5\xdf\x9f\xb3\xf7\xcf\xf9\xd3\x7d\x71\x9d\x9a\x6f\x9b\xf2\x97\x24\x00\x7e\x2c\xff\xfb\xea\xcd\x9b\x7a\xfe\xf7\xe4\xe4\xcd\x73\xfc\xef\xd7\xf8\xf1\xe1\x3d\xd0\x92\x3a\xec\x77\x48\x76\x79\x61\xee\xe2\x4d\x20\x1a\xa5\x85\x68\xd4\xd8\x04\x76\x2c\x5b\x13\xdf\xc7\xe3\x7b\x28\xd9\x7b\x55\x3d\x85\x17\x2a\xa2\xc3\x51\xe5\xe2\x89\xa1\x4f\x13\xda\x54\x3e\x0e\xa3\xec\x97\x56\xa6\x7a\x07\x41\xa1\xb0\xc9\x58\x64\x26\xae\x7b\xb8\xd9\x0a\x03\x02\x06\xfe\x36\x02\xc0\xed\xca\x99\x90\x64\xcb\x77\x55\xfd\x61\x98\x56\xb6\x86\x16\x85\x02\x83\x7b\x34\x29\x65\x74\xf3\xb4\xd9\x16\x6b\x96\x24\x59\x5c\x50\x10\x87\xda\x22\x29\x70\x10\x11\xde\x28\x98\x53\x9e\x13\x1f\x94\x46\x3d\xde\x94\xa5\x83\xdc\xb8\xf8\x60\x8a\x73\x45\xe4\x6c\x28\x2a\x0a\x24\x36\x80\xb8\x32\x45\x12\xa7\x42\x64\xda\xd9\xc7\x35\x6f\xef\x25\xda\x48\x50\x86\x77\x30\x4f\xe3\xb2\x04\xda\xa2\xf2\xc0\x47\x25\x66\x50\x3f\xb6\x40\x15\xd9\x45\x5e\x60\xc6\xce\xba\x48\x79\x65\x9c\xb8\xad\x5a\x98\x02\x40\x95\x14\x36\x49\xca\x26\x85\x73\x80\x2b\x92\x18\x83\x7c\x19\xac\x5b\x85\xe4\x19\xcd\x0f\x46\x7a\x8d\x10\x75\x82\xe5\xe8\x59\x3e\xfb\xdf\x73\x5e\xed\x79\x71\xab\xd1\x67\xbf\x66\xc5\xdd\x3d\x8d\x12\x08\xc1\x79\x9c\xa6\x66\x51\xeb\x7f\x96\x17\xca\x7e\x26\xfc\xad\x87\x22\xb2\x7e\x3d\xf3\xd7\x3f\xd2\x41\x25\x3b\xa8\xbb\xb5\xc7\x26\x28\x05\x7f\x9b\x94\x15\xb0\x9a\x09\xcc\x56\x38\x34\x1a\x5d\xbc\xb3\x8d\xe1\x22\x33\x52\xce\x9f\x21\x96\x03\xa2\x1c\xe1\x19\x70\xc8\xb0\x25\xff\xc2\xae\x1c\xb3\x17\x1d\x05\x24\xd4\xc3\x49\x3b\x0b\x35\x15\x85\xf5\x47\x67\x83\x4f\xbd\x1b\xc7\x79\x89\x1c\xb0\xa3\xf1\x44\xff\xdf\xff\x8b\xd2\x54\x3f\x20\x4d\xe7\xd5\x17\x45\x15\x5c\x83\x33\xed\x95\xa7\xda\xd5\xa4\xa2\x16\x7e\xea\x08\xde\x47\x5f\x53\x7b\x89\xaa\xa5\x85\xb2\xb3\x80\x4b\xdb\x1e\x31\xb5\xeb\xe0\xac\xab\xda\x69\xaa\x5d\x07\x6d\x9b\xa7\x93\xb0\x8f\x4d\x9a\xea\xb3\xe1\x78\xd0\x9f\x46\x6a\x78\x45\xff\xa5\x65\x49\x12\xd7\x29\xf9\x02\xa4\x08\x49\x52\x45\xa5\x92\x2b\x49\x3a\xf4\xc3\xa1\xda\x86\xe3\x7a\x3c\xea\xdf\x8c\x07\x28\x8a\x75\xae\x27\x37\x1f\x26\xd3\xe1\xf4\x66\x3a\xd0\x1f\x47\xa3\x33\x68\x30\xd3\xf3\xbe\xd7\x17\xa3\x09\x8c\xd4\xcd\x64\x10\xa9\xb3\xde\xb4\x07\x2f\xbe\x1e\x8f\xce\x87\xd3\xc9\x7b\xfb\xdf\x1f\x6e\x26\x43\x18\xb0\xe1\xd5\x74\x30\x1e\xdf\x5c\x4f\x87\xa3\xab\x8e\xfe\x34\xfa\x3c\xf8\x71\x30\xd6\xfd\xde\x8d\x9d\x39\x3b\xb2\x54\x89\x85\x35\x58\xd6\x98\xf4\x1c\xdc\x5a\x70\x70\x7b\xda\xed\xc9\x74\x3c\xec\x4f\xe5\xc7\x46\x63\xe4\xe2\xf6\x7d\xd4\x57\x83\x8f\x17\xc3\x8f\x58\xf8\x26\xca\xf9\x3a\xae\x34\x6b\x78\x45\x82\x62\x5f\x7c\x95\x96\xa8\xca\x12\x0b\xd5\x95\x66\xa9\xdd\x85\x58\x3a\x2c\xc4\xfa\x6b\xb2\x20\xbb\x2f\x7a\x67\x93\x8b\x5f\x54\xfe\xe1\x31\xfb\xef\xd8\xfe\x77\x2d\xff\xfb\xf2\xf5\x33\xfe\xef\x57\xf9\x99\xd6\x60\x2b\x28\x15\x54\xc3\xbe\x92\x8a\x80\xbb\xa4\x3c\xc7\x09\xe3\xb3\xbe\x26\xd9\x82\x08\x55\x28\xa5\x14\x79\x02\x07\x14\x4d\xa0\xc8\x4d\x2d\xcb\x14\xbe\x9a\xe0\xca\xb3\xad\x22\xdc\x75\x5e\xb4\x30\x87\x10\xae\x0e\xbe\xf2\xbe\x25\xbe\x4d\x48\x26\x4c\x81\xb0\x5e\xfd\xba\x48\x4c\x65\x2d\x2c\xb6\xe1\x02\x51\xa3\x3a\x7a\x07\x87\x01\x9f\x57\xe8\xfc\x21\xd3\x45\x52\x7e\x85\x32\x6c\xfb\x06\xa8\xbc\xc0\x68\x8f\x35\xa9\x9c\x96\x7c\x6f\x15\xff\x31\xcf\xf4\x19\xd1\x5b\x4d\x90\xc4\x80\x55\x59\x49\x91\x35\x5e\x2e\x93\xd4\xda\xc3\xa5\xaa\x57\x41\x6c\xf7\x36\xa9\x0b\x2a\x7f\xa7\xc7\xc7\x6f\x76\xbe\x48\xb5\xbf\x68\xf7\x89\xd5\x7d\x31\xba\x38\xeb\x5d\x1f\x9d\x76\xdf\xfe\x85\xf8\xff\x8f\x5f\x9d\xbe\x3c\x69\xf0\xff\xbf\x7d\xe6\xff\xff\x55\x7e\xac\xa1\x37\x5a\x9b\xcc\x2e\x82\x86\x14\x1c\x43\x80\x4f\xbb\x6f\x23\xfd\x56\x4f\xcc\xba\x32\x40\xf6\x7d\x7a\x7c\x7c\xf2\x3f\xdd\x09\x8c\x7e\x86\x27\xd7\x5a\x7c\xeb\x1f\xaf\xe4\xe3\xf5\x0e\xd7\x2e\x7a\x8a\x6f\xa7\xc2\x41\xfe\x59\xbe\x1d\xbc\x08\x72\x82\x2f\x9b\xfd\x84\x8e\x79\x5f\xf7\xde\x14\xb3\xb8\x4a\x56\x3b\x9d\xde\x60\x9d\x09\x75\x45\x7b\x5d\x14\x40\x7f\x17\xc6\x28\x9b\x15\x16\x58\xed\x09\x9f\xb5\xee\x2a\x25\xf6\x93\xec\x76\x03\xb5\x1c\x50\x08\xe6\x90\x4b\x48\x4a\x5f\x4f\x64\x49\xe7\x8d\xf2\x60\x01\xab\x15\xbf\x9c\x5f\x82\x35\x95\x8d\x7c\x19\x56\x1c\xcf\x28\x14\x2c\x3e\x8d\x65\x91\x3e\x93\xf6\xa8\x47\x34\xba\x1e\x5c\xe1\x88\x8c\x6e\xae\xce\x50\x31\xc0\x5a\xcd\x75\xe7\x41\x35\x1c\x24\xfd\x27\x38\x48\xaa\xe6\x20\xed\x57\xf2\xd9\xeb\x20\xa9\x1d\x0e\xd2\x0e\x1d\x9f\x96\xfe\x46\x8d\xce\x7a\x72\x0c\x10\x8c\x38\x9c\x74\x80\x14\xe3\xf3\xd5\x00\xff\xfb\x3c\x14\xd7\xd9\xe9\x57\x69\xe7\x57\xa9\x3f\x87\x5f\xc5\xa3\xa8\xfe\x2c\x7e\x95\x06\xbf\x4a\xfd\x79\xfc\x2a\x3d\x3a\x57\x7f\x15\x7e\x95\xe2\x48\x92\x4b\xdb\x11\x73\x0d\x21\xaf\xea\x49\xa2\x46\x84\x09\xc0\x1a\xf7\xa6\xa8\xb0\x74\x30\x28\xe8\xaa\x72\x17\x72\xc2\x5a\xed\x94\x71\x6b\x2e\x11\x64\xe2\x54\xb2\x96\xd7\xc3\x4f\x8a\x0a\x53\xe7\x91\x8f\xd0\x40\xbc\xc6\xc7\x69\xba\x7a\x9a\x54\xa9\x61\xc4\xa3\xa0\x57\x90\xcf\xc3\x3a\xd6\x40\xc0\x90\x90\x28\x70\x12\x37\x3a\xda\x45\x01\x5b\xd8\x3a\x7b\x03\x3d\x55\xfb\x31\x0b\xa2\xd7\xfc\x4c\xc6\x70\x9e\xe8\x1d\x87\x72\x64\x4f\xfb\x87\x3c\x5f\x40\xd6\x24\xd2\xfd\x38\x4d\x96\x79\x91\x25\x71\xa4\x6f\x26\x3d\x24\x06\xad\xc7\x84\xf5\x75\x50\xf0\xd3\x86\x2a\x93\x97\x44\x22\x0a\x6d\x3c\x9c\xc4\x61\x83\xfe\x9a\x5c\xec\xff\xd2\x3f\xdd\x17\xd3\xfe\xf5\xd1\x43\x11\xaf\xd7\x76\x9d\xfd\x22\x2e\xc0\x63\xfa\x8f\xa7\x27\x75\xff\xff\xd5\xc9\xf1\x73\xfe\xe7\x57\xf9\x09\x8e\x85\xd7\xd6\x88\xfa\x9c\x98\xaa\x34\xfa\x47\x93\x99\x55\xdc\xae\x1a\xaf\x27\xf9\x2a\x10\xe8\x00\x45\x46\xe5\x0a\x5e\x51\x77\x78\xe6\x19\xce\xe8\x1d\x25\xe3\xa9\xd9\x04\xd5\x0f\x71\xe9\xf0\x36\xe9\xd6\x17\xd3\x13\xce\x36\x49\xf1\x39\x41\x9b\xac\x5b\x3e\x48\xb2\xc5\x5d\x7e\x6f\xb2\x9a\x60\xb6\x17\xe9\x8f\xe0\x74\xbb\x02\xde\xe5\x34\xce\x16\xa0\x9c\x6c\x3b\x79\x0c\xa2\xf8\x27\xf0\xbf\xa7\xf0\xbf\x2f\xe1\x7f\x5f\x81\xf5\x6d\x47\x61\x77\x7e\x2b\x71\xf0\x70\xfb\x1b\x61\xe8\x97\xcd\x12\xb4\xc0\x75\x51\xfb\x5d\x97\x84\x05\x97\x9a\xf4\x7e\xf6\x7c\xdc\x20\xcc\x89\x68\x53\x81\x5b\x08\x4a\xae\xec\x29\xca\x43\x2a\x31\xdf\xee\xf1\x07\x50\x81\x74\x10\x50\x72\x58\xeb\x95\x4a\xdd\xcd\x82\x28\x7b\xb1\x0a\xcd\x45\x75\x22\xe5\x70\x15\x51\x8b\x3c\x26\x52\xc1\x34\xbf\x06\xc0\x24\x53\xcc\xef\xec\x3f\x09\xe9\x60\x5d\x88\x65\x52\x65\xa6\x14\x84\xee\x71\x51\x25\xf3\x4d\x1a\x17\x5c\xee\xfe\x7c\xdc\xff\xa5\x7e\xba\x2f\x3e\xf6\xfb\x47\x08\x3f\x49\xf2\xec\xe8\xf4\x17\xa8\x04\x7a\x34\xfe\xfb\xea\xb4\x7e\xfe\xbf\x7e\xd6\xff\xfd\x75\x7e\x86\x21\xba\x19\x80\x4a\xce\x90\x73\xa0\xd5\x8f\x57\x37\xfa\x22\x99\x15\xf6\xb8\xfb\x48\x18\xb3\x30\x58\x84\x67\xc2\x79\x61\x04\xf0\x48\xb8\xf9\x58\x24\xbe\x05\xaa\x23\x47\x75\x11\x18\x8c\x58\x80\x4b\x68\x44\x38\xf7\xeb\xca\xef\xf6\x92\xc1\xe8\xef\x3c\x5f\xcd\x88\x4e\x8d\x98\x64\x58\x2f\x8d\x31\xa0\x44\xcf\x1d\x04\x9b\x73\x2c\xeb\x40\xd4\xa9\x3c\x0d\x05\x08\xda\x3e\xda\x49\x0d\x05\xbc\xa7\xd4\x80\xae\x3e\xb4\xf7\x4a\xfb\x20\x04\x70\x6a\x28\xf0\x06\xa0\x9c\xe3\xd8\xa7\x48\x6f\xf9\x1e\x25\xf6\xbf\xc5\xab\x35\x31\xcb\x6e\xf1\xd6\x0c\x61\xed\x64\xcf\xdb\xd7\x46\xcd\x12\x1c\x80\x9a\x5a\xdf\xc7\x8e\x9c\xd3\xc7\xcb\x82\x91\xd0\xdd\xce\x23\x27\x6b\xf7\xc5\xc2\xac\x0b\x03\xb7\xcb\x3f\x7f\xbc\xbe\xb0\x07\xc0\x91\x1d\x9c\xa3\x59\x52\x22\x96\x1f\x4f\x86\x3f\xe1\x54\x78\xd4\xfe\x7b\x55\x8b\xff\x9e\x1e\xbf\x7d\xfb\xf6\x79\xff\xff\x1a\x3f\x1f\xec\x2c\xeb\x01\xcf\xb2\x52\x3d\x10\x12\x41\xfc\xa3\x76\xb3\x4f\xe4\x09\xf1\xd6\x13\x8d\xa7\x71\x71\x6b\x8a\x50\x93\xaf\x8a\x93\xac\xa4\x62\xfd\x02\x2c\x15\x5a\xc3\xf8\x9a\x75\x5c\x94\xa6\xd0\xe5\x57\x93\x9a\xaa\x5e\x56\xe6\xca\xc0\xbd\x84\x1c\x07\xdc\x80\x45\x61\x0e\x10\xc1\x48\x97\xb9\x4e\xf3\xec\x16\xab\xd8\xf8\x0b\x49\x99\xfd\x50\x39\xb2\x1e\x7e\x11\xc2\x61\x2b\xe0\xbb\x67\x6a\x20\x7e\x39\x70\xdc\x34\xe0\xc2\xf6\x23\x85\xc9\x97\x24\xa5\x19\xb6\xd7\x1a\xc3\x95\x29\x32\xa0\x6e\x49\xb7\x00\xc8\xdc\xe6\x1b\x45\xf9\x2d\xa8\xba\xa9\xa5\xb7\xea\x3d\xc6\x16\xfa\xd1\x3c\x74\x29\x26\x18\xe6\x0e\x73\xc4\x63\x00\xbd\x39\x0b\x58\x06\x87\x14\x82\x31\xe3\xb7\x83\xf1\x44\xa6\xb6\x72\x93\x56\x49\x76\xab\x70\xdc\xf3\x4d\xb5\xde\x54\xa4\x9b\x8e\x6c\x62\x2d\x94\x41\xf6\x90\xdf\x71\xae\x71\xfc\xa3\xbd\x59\xce\x04\xad\xff\x01\xcc\xfb\x78\xb1\xf0\xc0\xcd\x9d\x17\x44\x92\xf1\x14\xa8\xd3\xee\xa9\x9d\x74\x68\xfa\xb3\x61\xf8\x0b\xff\x74\x5f\x7c\x88\x8b\xe2\x2f\x9a\xff\x3f\x39\x39\x7d\xd9\xa8\xff\x3e\x79\xce\xff\xfd\x2a\x3f\xb0\x71\x13\x3c\xec\xa0\x74\x13\x93\x4d\xab\xd5\xa6\x42\x36\xab\x45\x12\x83\x25\xb1\x8a\xe7\x45\x5e\xea\xd9\x26\x49\x2b\xa8\xdf\xcd\xd7\xf6\xa3\x3f\x6d\x8f\xd6\xc9\x5c\xcf\xb6\xea\x32\x99\xdf\xc5\x26\xd5\x76\x3d\xe9\x43\xb3\x8a\x93\xf4\x9d\x9e\xc5\x45\xf1\xbf\xed\xff\x00\x4e\xac\xd3\xd5\xc3\xaa\x44\x4f\xba\xd4\x9b\xcc\x23\xf5\xed\x1f\xb8\x06\x7a\x59\x18\x93\x6e\x55\x50\x45\xb3\xc9\xb0\xa6\x7b\x11\x81\xe9\x94\xe5\xd9\x91\x6d\xa4\x29\xe0\xc0\x01\x68\xbe\xfb\xd7\x86\xf4\x3c\xf8\x1b\x2a\xa9\x5c\xdd\x45\x61\xb2\x78\x05\xaf\xcb\xa0\x46\x11\x4f\x9e\x58\x7e\xdd\x39\xd2\x3c\x20\x76\x74\xd2\x32\xf7\xee\x7b\xa4\x66\x9b\x4a\x0f\x91\xb1\xc4\xda\x78\x85\x81\xd4\x26\x15\xd7\x60\x15\x38\x94\x3c\x42\x14\xd4\x36\x78\x05\x1c\x67\x25\xf0\x13\x5a\xbb\x8f\xc9\x80\xad\x7b\x0c\xed\x0d\xa8\x14\x6f\x37\x31\x84\x41\x59\x82\x06\x8e\x5d\xd1\x9c\xdb\x3c\x5f\xb0\x37\x0d\xa4\x2a\x5d\x3d\x84\xc2\x03\x55\x81\xb8\x86\x4e\x48\xb8\xe5\x22\x9e\x9a\x9f\xf4\xa9\x89\xf8\xbf\xba\xc7\xbf\x83\x5b\xe2\x3a\x8d\x93\x4c\x4f\xcd\x4f\x70\xa7\xdd\xe5\x9b\xdb\x3b\x3d\x04\x69\x2a\x3b\xa9\x59\x4e\x54\xf9\x8a\xb9\xeb\xad\x9d\xe9\x39\x9c\x7a\x97\x93\xa9\xf9\x29\xa2\x97\xc2\x1f\xdd\x8b\x9f\x4f\xec\xff\x56\x3f\xdd\x17\x1f\xcf\xcf\x2e\x8e\x4e\xba\xa7\x47\x79\x96\x6e\xff\x02\xfc\x6f\xaf\xde\xbe\x7a\x55\xe7\xff\x78\xf9\xe6\xe5\xcb\xe7\xf3\xff\xd7\xf8\xb1\x46\x1f\x18\x65\x67\x01\x60\xa0\x85\x05\xee\x34\xd2\x57\xf9\xbd\xc3\x7f\x9c\xca\x94\xd2\x61\x1f\x70\x49\xc7\xd1\xe9\xf1\xf1\x49\x04\x95\x04\xbb\x2c\x3d\xc2\x42\xbd\x3e\xd1\xe7\x45\x9c\x7d\x4d\x93\x4c\x4f\xaa\x48\x9d\x27\xcb\xea\x4e\x9f\xa7\x79\x5e\x44\xfa\x43\x5e\x56\xf6\x93\x97\x3d\x7d\x7c\x7a\x72\x72\x7c\x74\xf2\xf2\xf8\x44\xdf\x4c\x7a\xdf\xc9\x2f\xd2\x4c\x38\x05\x79\x7e\x07\x92\x40\xe1\x29\xb8\x2f\x20\xfd\x57\x39\x62\xd6\x34\xcd\x1f\xa0\xe0\x41\x6b\x7d\xdc\xd5\xd7\xe3\x41\xef\xf2\xc3\xc5\x00\x13\x95\x3b\x54\xc3\x89\xa3\x04\xd8\x05\x40\xb0\x63\x13\xa7\x11\x50\x8f\xcd\xf2\x1c\xd5\x9a\x49\x1b\x7d\x93\x91\x20\xbb\xa2\x00\xf3\x72\x93\xfa\x6c\xd8\x81\xbd\x42\x0e\x38\x04\x53\x22\xd1\xd5\x92\x19\x4f\xde\x21\x93\x07\x14\x89\x3a\xf6\xb4\xea\xce\x28\xe4\x0f\x4f\xee\x8d\xe4\x46\x71\xa3\x13\x78\x28\x49\xb5\x23\x6c\xbd\xc5\x61\x88\x14\x01\xf2\xfc\xf5\x88\x7a\x90\x59\x9e\xc9\x5f\x01\x1f\x7e\x9e\x2d\xe2\x22\xf9\xff\xd8\x7b\xdb\xe6\xb6\x91\x64\x5d\x70\x3f\xd7\xaf\xa8\xe5\x97\x16\x37\x20\xb6\x65\xf7\xcb\xb4\x7d\xe3\x46\xd0\x12\x65\x73\x46\x22\x75\x48\xaa\x3d\xba\x37\x6e\xec\x01\xc9\xa2\x84\x31\x08\x70\x50\xa0\x65\x9e\x3f\xb4\xff\x63\x7f\xd9\x46\xe5\x4b\x55\x16\x00\x4a\x76\x4f\x4f\x9f\xb3\x73\xad\x98\x88\x69\x4b\x24\x50\xaf\x59\x59\x99\x4f\x3e\x4f\x7e\x68\x68\xd4\xed\x98\x29\xde\x2b\xe8\xa7\x5e\x84\xc8\x33\x71\xba\xab\xd8\x63\x0a\x5c\x07\xf7\xa6\x66\x5c\x3a\x7d\x21\xc3\x4b\x26\xf3\x03\x16\x65\xad\x96\x86\x40\x3e\xac\x74\x5e\x19\x10\x26\xca\xa8\x5e\xb0\x51\x2a\x0d\x70\x46\x59\x4b\xbc\x68\x4c\x57\xea\x09\xb1\x7a\x6e\xa4\x72\xb3\xa9\x7b\x7c\xd9\x62\x45\xf1\xb4\xc6\x5a\x00\x74\x8b\x1e\x51\xbd\x00\x11\x1f\x7e\xca\xc0\xcd\xa8\x1f\xcc\xd6\x9a\xfc\x93\xb1\xec\xcd\xf8\x39\x4c\xb7\x34\x91\xe0\xef\x60\xdd\x2d\x02\x8b\xdc\xcc\x1d\xbf\x80\x71\x5b\x32\xae\xcf\x74\x2d\x0c\xf5\x7c\x06\x59\xa3\xa1\xe7\xee\x7d\x9e\xf5\x66\xa0\xd4\x07\x83\x87\xb4\xff\x50\xbc\x54\x05\x69\x22\xb8\x65\x38\xea\xb8\x68\xad\x7f\xa0\x77\x8a\x12\xb5\x34\x78\xf1\x8c\xe9\x59\x0a\x63\xd6\x16\x7f\x17\x21\x8f\x5e\xb3\x27\xc4\x01\x29\xaa\x35\x58\x95\x5b\x83\x60\x2f\x7e\x15\xe6\x2c\xfc\x2d\xdd\x8d\x14\xad\x5f\x1b\x00\x5e\xfe\x7d\xeb\xd2\xd8\x81\x7e\x4b\x72\x71\x4a\x4c\x25\x46\xc4\x30\xc2\x58\x97\xe1\x1b\xf4\x9e\x37\xae\x8b\xab\xb4\xf0\x88\x01\x4e\x4a\xb8\xfd\xb9\x4f\x73\x85\x4b\xad\x32\xf7\x69\xb5\x06\x02\x6f\xa8\xd5\xc4\xfa\xed\x6d\x5a\x13\xbd\x86\x17\x4a\x05\x53\xe1\x09\x65\x29\x6c\x50\x65\x45\x6d\xd6\xca\x6d\xf7\x81\xfe\x00\x7e\xa1\xdb\x2d\x4d\x25\x00\xf7\xb9\x55\xb6\x83\x4d\xe5\x9a\x81\x6b\xea\x11\x03\x95\x64\x5b\x80\xe0\xdd\xd6\xd5\x1e\x2c\x05\x32\x69\x83\x96\xc2\x8a\x04\x00\xce\x06\x5e\x28\x25\xc0\x75\x2e\x46\x97\xe3\xc9\x18\xe4\x5d\x1a\x8b\xbd\xc1\x60\x84\xa3\x12\x4c\x12\xf6\x9e\x08\x65\x50\xbb\x2c\x89\xa3\x3b\xea\x39\x82\x23\x1d\x13\x1c\x85\xe1\x6e\x71\x1b\x1d\x27\x91\x27\x1e\x23\xff\x2a\x52\x45\x27\x45\xf4\xd3\xb6\x24\xba\x12\x1c\x77\x3c\xfb\x59\xe1\xc5\x2f\x12\x5e\xdf\xad\x10\x13\xb4\xdc\x57\x4d\xa1\xbe\x82\x42\xce\x24\xac\x6b\xea\xf1\xc1\xd8\x4b\x50\xf9\x3c\xc1\x19\x08\x24\x50\x20\xc4\xea\xc7\xf1\x11\xa8\xb7\x87\x30\x7c\xee\xac\xe4\x4a\x6b\xe2\x6e\x86\x1d\x4c\x8d\xa5\xa8\x6e\x06\x31\x12\xca\xc7\xa5\x56\xf7\x0e\xe5\xbe\x47\x24\x46\xc0\xe1\x23\x95\x03\x14\xc6\x9c\x08\x62\x1d\x22\x4f\x8d\xb8\xd3\xa3\x17\x75\x7c\x04\x80\xdd\xdf\xf7\x59\xe5\x66\x43\xc4\xdc\x71\x0a\x22\xbd\xfb\x81\x52\x43\xdd\xbb\xe6\x98\x18\x9d\xfd\x3d\x0e\xe2\x5d\x78\x33\x07\x26\x11\xe8\x0c\xdd\x7b\x04\xfb\x95\xfc\x18\x46\xd8\x76\x65\xc5\xc1\x6c\x77\xdc\xf8\x03\x65\x47\x51\x37\x38\xa0\x13\x3e\x81\x1a\x86\x9b\x70\x8b\x2c\x23\x66\xd6\x2a\x8a\x72\xe7\x69\x71\xbf\x4f\xef\x0d\xb6\x9b\xcf\xa0\x03\xab\xb3\x50\x51\x14\xdc\xf8\xa0\xec\xaa\x58\x67\x9f\x51\xdc\x62\x53\x95\x45\x7d\x4a\xfb\xd9\x12\xb5\x38\x29\x94\xf9\x6e\x92\xcd\x77\xd6\xc9\x53\xda\x30\xf3\x13\x86\xd9\x50\xda\x0c\x04\xbb\xe4\x34\xbb\x13\xcd\x42\x04\x94\xd0\x4b\xcd\x01\xa4\x4c\x0b\xff\xfb\x3b\xab\xcb\x4f\xce\xec\xe7\xde\xd4\x9c\x94\x44\x64\x8b\x9c\x65\xd8\x52\xdb\x57\x44\x31\x8b\x81\x56\x37\x0c\x9e\x44\x6c\x05\x86\x75\xe3\x1e\x82\x65\xec\x9e\xfb\x13\xff\xde\x78\xc3\x40\x9d\x2c\x1e\xf6\x36\x61\x8d\xc0\x0b\x01\xc2\xc9\x0a\x8c\xe1\xa6\xde\x6b\x41\xce\x09\x77\xb2\xa5\x75\xb6\xb2\x89\x4e\x75\x6b\xb8\x15\xd7\xc3\x11\xab\x09\x19\x18\xff\xa5\x41\x9f\xc8\x14\xc4\xa8\xad\xb8\xf2\x2c\xf5\xc6\x75\xa3\x1f\x32\x5b\x97\x55\xb6\x4a\x73\xd5\x45\x6e\xcf\x43\xc4\x4b\xa6\x31\x46\xe8\x60\x11\xb5\x65\x22\x5c\x97\x44\xed\x1e\xb2\xbc\xb4\xe5\xee\xc1\x3d\x3b\xd1\xa6\x86\xff\x80\x5a\xc4\x32\xcf\x90\x3e\x95\xc5\xe5\xe9\x08\xa0\x45\xbd\x25\x6c\x5a\x6f\x8c\x35\xf9\x45\xed\x25\x80\x7a\x70\x6b\x5f\x99\x0a\xa0\xb0\xad\x51\x61\x83\x0e\x1a\x84\x48\xdd\x10\xc4\xd0\x13\x05\x3a\x33\xf8\x12\x72\x25\xdb\x6f\x48\xd8\x7f\x20\x6b\x08\xd3\x69\xd3\x83\x38\x18\xfd\x9e\xcb\x6c\x27\x43\x93\xd4\x39\x4d\xfd\x82\xf7\x0a\x83\x9b\xac\x16\x55\xa6\x6b\xb3\x01\x96\x06\x77\xde\x6c\x44\x8f\x80\x05\xa2\xe5\x1c\x53\x40\x39\x74\xca\xd9\x30\xdf\x09\x34\xa2\xbe\x79\x58\x1d\x82\xa8\xe1\xff\x30\x55\xd9\xd1\x5b\xcf\x75\xe1\x57\xa4\x6f\x26\x8b\x12\xba\x95\xa5\xda\xdf\xc4\x06\xd6\x22\x92\x02\x0c\x15\x30\x6f\xe7\x90\x5e\x5b\x98\xcf\x75\x63\xc2\xec\x43\x59\xd5\x7a\x97\x5a\x0b\xe4\x12\x6e\xa7\x9a\xcf\xb4\xf7\xdd\xe7\xf2\xcc\x22\x8f\x8b\xd5\x97\x60\x34\xe0\x49\x0a\x9e\xe4\x56\xce\xdb\x74\xf5\xf1\x54\x3c\xfd\x2b\x26\x4b\x8b\xc9\x52\x5d\x93\x35\x94\xaf\x84\xc7\x73\x8c\x2c\x75\x8e\xba\xad\xf5\x8f\xce\x02\xaf\x29\xe1\x99\x8a\xc6\xa8\xae\x4f\xbf\xa4\x8f\xa3\xbd\x5c\x38\xab\xba\x4b\x2b\x77\xb6\x45\xa4\x1f\x4d\x3b\xdf\xe6\x85\xc1\xd3\xc7\x6b\x7a\x80\x5d\x26\x16\x34\x77\xbe\xc2\x52\x66\xac\x24\xc5\xf7\xed\xf3\x6c\x25\xc4\x9f\xa6\xec\x3e\xf3\x94\x36\x84\xae\xa6\xa3\xc5\x3b\xda\xb6\xae\x52\x77\x6a\x6d\xca\xea\xd1\x39\x6a\x64\x95\xe1\x89\xd9\x0a\xa7\xd0\xdd\x21\xca\x0a\xd4\x47\x40\x0d\x2b\x43\xfa\x10\x60\x05\x22\x5e\x8e\x5d\xf6\xd9\xe4\xb6\xef\xbf\xb7\x4b\x33\xd0\xbe\xa5\x24\x31\x7f\x73\x5d\xa5\x8f\x59\x71\x6f\xfb\xca\x96\x5b\xa3\x9d\xfb\x91\x1f\x44\x7f\xe8\xef\xf4\x46\x06\xe8\x13\x19\x9c\xec\x4c\x56\xec\xf6\x68\xfd\xcd\xe7\x5a\xe1\x70\xd5\x44\x81\x02\x8e\x28\x6b\xb1\x45\xca\x99\xee\xc4\xd3\x6e\xb1\x1b\x04\x39\xb1\xaa\xbc\x7c\xb4\x8a\x1e\xad\xc3\xa3\xdd\x2a\x82\xc9\x85\x4b\x10\x58\x65\x81\x89\x15\x6b\x00\xf3\xeb\xf8\x45\x85\x53\xb8\x4d\xab\x8f\xfb\x1d\x18\xd4\x74\x69\x0d\x51\x09\xf2\x6f\x59\x23\x4b\x03\x00\xe8\x9e\x09\xdd\x1e\x31\xfb\x07\x35\x09\xe5\xbe\x4a\xef\x41\xbb\x9d\xc1\xf2\x51\x82\x1b\xb4\xe2\x53\x40\xf2\x92\x4d\x11\xed\x71\x4e\x14\xce\x19\xaf\xab\xcc\xaa\xc6\x67\xdc\xe1\x15\x79\xf1\xee\x4d\x75\x8a\xfc\x2c\xe9\xb6\xdc\x13\x83\xa8\xf9\x5c\xfb\x71\xe0\x55\xe6\x1e\x15\xef\x81\xcc\xfa\x3a\xee\xe9\x2e\xfd\xfb\xde\xf4\x40\xa7\x03\xb2\xf4\x74\x0f\x08\x03\x0e\x33\xe0\x5e\x2b\x9b\x43\x71\x06\x26\x4d\xc3\x63\x70\x38\x3f\x1f\x8f\x7d\x0a\x8d\x47\x6f\x61\x3e\x67\xc5\xa6\xa4\x25\x81\x0f\xe4\x30\x6d\xfc\xbb\xf9\xbb\xeb\x2b\x37\xa0\x7f\xbd\xbe\xa2\x3c\x66\x1a\xc4\xda\xc3\x22\xbc\x58\x5c\xe0\xca\x03\x25\x94\xb4\x5a\x9f\xae\x4a\x50\x83\x75\xdf\xb0\xa0\x86\xaa\xdf\x2f\xae\xaf\x12\x7d\x53\xda\x7a\xbe\xaa\xb2\x1d\xcc\xd3\xcd\xc5\xa5\xbf\x1c\xc2\x1d\xfd\x61\xbf\x4d\x63\x26\xc0\x81\x96\xa3\x50\xcb\xf1\x17\xf3\x13\xfa\x7d\x33\x79\x97\xa8\xbf\x9e\x5f\x42\x73\xfe\x7c\xf3\x6e\xa0\x71\x3c\x5b\x1f\x94\x75\x79\xfc\x37\x74\x66\xf0\xca\xe0\x56\x07\xc4\xc8\xdd\xce\x02\xde\xd0\xfc\xe0\x56\x8d\xfc\x9e\xb3\x68\xee\x17\x2b\x63\x6d\xe9\x8e\x7f\x39\x5e\x70\xad\x82\xab\x33\x18\xb6\xc5\x05\xd3\x1c\xd0\x17\x50\x5c\xa5\xcc\x03\xa7\x12\x19\x25\xb9\xbf\x43\xc5\x0d\x1b\x42\x4a\x2c\x9b\xb5\x3a\x36\xa2\x54\xf1\x03\xd7\x23\x34\x1a\x71\x33\xa1\x65\x94\x97\xa5\xbb\x9e\x55\x10\x81\xa5\x03\x0b\x61\xe4\x37\xe9\xbd\xe9\xb1\xda\xf1\x06\x1d\x6a\xbc\x5d\x6a\x0c\x26\xd5\x2c\x6f\xac\x77\x90\x1c\xa0\xfc\xf2\x2e\xdf\xa3\xf4\x94\x0a\x45\x42\x3b\x54\xd5\xa1\xae\x1a\xb3\xc6\x1d\xeb\xae\x6b\x89\xf3\x96\xb2\x25\x06\x6f\x4c\x80\x67\xca\xe3\x48\x11\x59\x19\x5e\x7c\x24\x89\x81\x68\x00\xd1\x2e\xc0\x45\x36\x2b\xfc\x9c\xe2\x14\x50\x5d\x26\x24\x2a\x50\xd6\xcf\xb7\x9b\x94\x6b\x93\x8e\x7e\x6b\x4f\xdc\x5f\xb8\x57\x42\xfb\xdc\x61\xe6\x19\xf6\x14\x36\x26\x30\x9d\xe2\xf5\xe7\x3b\x8b\x2f\x48\xf4\xae\x32\x2b\xe3\x43\x0b\x4b\x73\x9f\x15\x70\x59\xa1\x0f\x2f\xcb\x35\x1f\x7d\x0a\x2c\x85\x3b\x1d\xd9\x45\xea\x8d\x0a\x78\xca\x5a\xff\xf5\xee\x7f\xf4\xfc\x89\x88\x77\x0a\xbb\x5f\xee\x8b\xac\x6e\x9d\x9b\xc2\xe3\xe3\x08\x1a\xa0\x32\xcd\x2a\xb3\xee\xe4\xf8\xeb\xdd\xff\x20\x3a\x29\xf4\xe3\xdd\xbf\xd1\xe7\x36\x05\xb0\xb7\x59\x51\xdb\xe5\xdd\x11\xe5\xaf\x41\xfe\x1b\xad\x8b\x90\x3e\x79\xef\xbc\x1f\xf7\x67\x30\x03\x04\xba\xf4\x87\x31\xf7\x4b\x01\x5d\x87\x6b\x6c\x56\x02\xaf\x12\xde\x6c\x99\x9d\xb4\x37\x5c\x7d\x2c\xca\xc7\xdc\xac\xef\x31\x3e\xd5\x4b\x74\xef\xc2\xac\xf9\x62\xe6\xfe\x39\x42\x26\x0f\xfa\xb3\x3b\x65\x7b\xef\xc1\x71\x3f\xf4\x9c\xa7\x5f\xea\xde\x0d\x85\xfe\x60\x70\x60\x5e\x7b\x9e\xf9\x2a\x38\xa1\x8f\x9e\x5b\x0c\x2f\xb3\xd1\x15\x4c\x04\xdf\xb2\x9a\x6a\x24\xac\xf8\x72\x63\x7a\xd2\xd5\xaa\x24\x9f\x9d\xa4\xe5\x82\x2f\x4b\x1b\x2b\x3c\x3a\x3d\x78\x3b\xc4\xcc\x59\x42\xee\xd8\xea\x02\x06\xbe\x94\xce\x1c\xae\x63\x88\x12\x58\x15\x52\x73\x1d\xc1\x15\xb9\x1e\x88\x23\xb0\xfb\x2d\x69\x65\x94\x08\x64\xa2\x33\xed\xb9\x1d\xe1\x84\xa4\x78\x8f\x2f\x23\xf1\x41\xc1\xe5\xbe\x46\x93\x08\xdc\xb8\xee\xba\x62\x15\x97\x02\x82\xd4\x82\x87\xe6\xbe\x16\xbc\xa5\x00\xdc\xa5\x13\x98\x7d\xd2\x23\xad\x03\x7f\x1d\xc2\x87\x99\xd5\x9f\x4a\x52\xd0\x73\x07\x7f\x51\xb2\x50\x25\x71\x39\xbb\x99\xf2\x9b\x2a\xd2\x31\xd4\x5a\xbf\x1c\xe8\x5f\x47\xb3\xb7\xc3\xc5\xf8\x5a\x9f\x4f\x6f\xee\xc6\x93\x77\x4a\x3d\x47\x40\x7c\x21\x58\x46\x65\x38\xaa\x23\x26\xad\xda\x31\xe9\x26\xf1\x69\x3c\x72\x75\x87\x92\x3a\x7a\xd1\xb2\x84\x8f\xa7\xdd\x73\x75\x3f\x3f\xd7\xc4\x91\xcb\xe6\x1f\xfc\x62\x20\x87\x76\x8e\x81\xf0\x0c\x81\x56\x7a\x0d\xa2\x0f\x0c\x92\xf7\x51\xa8\x40\x70\x87\x4f\xc7\x8b\xa1\x8a\xef\x06\x3c\x7a\xce\xa2\x42\x64\xcb\xac\x1e\x0a\xb8\xc1\x6e\x4d\x6a\xf7\x64\xa7\xcb\x25\xc6\x0e\xd9\xdc\x54\x25\xb0\xf0\x29\x77\xb0\xc2\x6c\x55\x5e\xa2\xd1\x0d\x87\xb0\x8a\xe4\xca\x20\x50\xe9\xa3\x89\x63\x4c\x03\xfd\x9e\x64\x78\x15\x23\x99\x28\x54\xe5\xbc\x6b\x53\x58\x0f\xea\x31\x9f\x89\x8c\x7d\x53\x56\x8c\x58\xf7\x8a\x23\x61\xbe\x09\x4e\xa6\x4c\x01\xa9\x68\x2c\xdf\x44\x28\x42\x68\x86\xe7\x58\x42\xe3\xd8\x0c\xde\xb9\xcb\x1c\x99\x85\x57\x83\xb0\xbc\xe0\x1b\xb9\xc1\xfa\x31\x98\x84\x10\xfa\x83\x30\x73\x2b\xfe\xc7\x62\xb7\x54\xed\x0f\x9b\x40\xc8\x89\x02\xab\x41\x40\xdf\x63\x7d\x2c\xad\x6a\x3d\x9e\xe8\x7f\xbb\x1d\x4e\x16\xe3\xc5\x1d\x88\xc2\xb8\x86\x53\x4c\xc8\x9f\xdc\xd4\xa7\x13\x3f\x22\xae\xe9\x20\xae\xc2\x91\x9c\xed\x16\xb6\x35\xec\x3c\x8e\x26\x23\x2f\x7b\xbf\x79\xd8\x24\x34\x58\x6e\xea\xb6\x25\x32\x86\x16\xfa\xec\xc5\x8b\xe0\xb5\x88\x30\x13\x47\x11\x69\x61\xfb\x23\x3d\xba\xc0\x1e\x02\x07\xe9\x2a\x2f\x3d\x49\x28\xb7\x94\x08\xe2\xc9\x4f\xab\xaa\x43\xa2\x56\xb9\x49\xab\x1c\x77\xb1\xf7\x24\x88\xf1\xd1\x1a\xf9\xf4\xd7\xad\x2b\xad\x65\x0b\x02\x31\x39\xec\x26\xb6\xbd\x79\xb5\xe6\x0f\x2e\xd3\xd5\x47\x6c\xc5\x40\xbf\x2d\xa1\x5e\xee\x93\xaf\x06\x44\x12\x2e\x6c\x8f\x12\xed\x09\xc1\x03\xd8\x7a\x36\x8e\xd6\x79\xde\x54\xbf\x46\x17\xdc\x22\x7c\xba\x82\x87\xd3\x7d\x17\x9b\xbb\x87\xda\x3d\xe7\xad\x20\x17\x7c\x9e\xe3\xed\xda\x8b\x65\xc3\xdf\xcc\xdf\xf7\x28\x3e\x1b\xdc\x95\x62\xad\xdd\x9d\x76\x99\x8b\x6d\xec\x6c\x41\x5c\x9e\xcd\xbd\xa5\xce\x09\x1a\xea\x01\x88\x32\x64\xc5\x3d\x66\x50\x48\xeb\x48\x66\x3d\xc2\xf7\x20\x70\x11\xf0\x92\xe6\xe0\x13\x72\xa2\x8d\x94\xc6\x0a\x36\xcc\xdd\x22\xd2\x3a\xb3\x78\x1c\x5b\x13\x95\x9f\x93\x6f\x5e\x03\x10\x14\xa2\x3d\x51\xf5\x37\x49\x36\xc6\x88\xe7\x01\x6c\x06\x0c\x9a\xb2\x92\x32\x4c\x29\x00\xa1\xd9\xa0\xbb\x99\x46\x02\xe1\x52\x7f\x2a\xf3\xfd\x36\x2b\xca\x3d\xd8\xb1\x4d\x56\xfb\x85\x05\x26\x87\xf2\x48\x3b\xd2\x1b\xdc\x64\x95\x75\x47\x91\xb1\x14\xb0\xd1\x27\xa0\xf7\x57\xc0\xd9\xb8\x01\xdf\x21\xb5\x65\x91\x2e\xf3\x43\x9f\x47\x36\x5d\x41\xc6\x47\xac\x38\x2f\xcb\x4c\x28\x4a\xf7\x48\xe7\xed\xae\xff\x96\xae\xdc\xc0\x80\x0b\x3d\x68\x6d\xec\x38\xfe\x4e\x77\x1d\x99\x73\x16\x63\x1b\xef\x56\x15\x76\x6b\xd8\x75\xe4\x31\x92\x6f\xd2\x11\x7e\x69\x5c\x39\x9d\x8d\x2b\x79\x35\x80\x6a\x7b\x68\xc2\x01\xd5\x04\x9c\x5d\xc3\x64\x9f\xee\xfc\x14\x42\xa0\x76\xfb\xda\x54\xa7\x85\xa9\x9d\xff\xac\xf2\x92\x9c\x04\x00\xc3\x87\x5b\x14\x87\x6d\xe8\x73\xa7\x78\x27\xa5\xfc\x86\xf3\x0d\xdc\x51\x60\x2d\xb2\xe3\x3e\x16\x79\x99\xae\x95\xfc\xcc\x29\x5f\x50\xf9\x09\x20\xf9\x56\xae\xe0\x16\x16\xc8\x88\x5b\x9d\x6c\x84\xe7\x13\x4c\x2c\x96\x1b\x42\x98\xf2\xbe\xf1\xc7\x0b\xc3\x63\x73\x0a\x2c\x4b\x20\x33\xe4\x69\xd3\x8f\x70\x10\xd2\xb2\xd0\xbb\x6a\xbf\xc6\xd8\x92\xd9\x31\x95\xb3\xfb\x30\x5c\x18\x5a\x8a\x0d\xf1\x2c\x67\x85\xfa\xfb\xde\xb9\x5a\xf5\x21\x41\x9a\xbb\xc0\xde\x0c\xe7\x76\xab\x37\x00\xab\xa2\xa2\xdf\xfa\x61\xcf\xa3\xe6\xac\x82\xe2\x6c\x27\x9e\x46\x7e\x1e\xf6\x45\x9d\xe5\x3a\x75\x3b\x21\xc5\xd5\xae\x0f\xee\x4a\x14\x24\xbd\x72\xf7\x7b\x60\x4d\x88\xcf\x57\x95\x16\xd1\x6c\x9f\xf8\x0c\x01\xa4\xd8\x2b\x38\x74\x01\x87\x9c\xde\x23\xf5\x72\x85\x34\x18\x79\x38\x72\x52\x8c\xa8\xb9\xcb\x43\x24\x47\xea\xb6\x43\xcd\x1a\xe9\x06\x83\xa5\x81\x8a\x17\x37\x7b\x12\x9c\x1e\xe6\xdd\x93\xc5\xdd\x8d\x3d\xa2\x1e\x0d\x90\xb8\x6e\x4a\xf0\xa5\x22\x69\x78\x10\xa6\x05\xbe\xe9\xa6\x8f\x00\xe3\x7e\x4f\xfc\xf0\x5b\xb7\x92\x1e\x40\x18\x10\xcb\xbe\x9d\x27\x88\xd4\x3d\xa8\xdb\xa1\xf7\xbb\x35\x8c\x6e\x54\x65\x22\x7c\x76\x38\xd8\x7f\x18\xe8\xeb\xe9\xc5\xf8\x72\x7c\x3e\xa4\x64\xea\x53\x4e\x6b\xaa\x9b\xa9\xb3\xd6\xee\xef\xca\x3a\x2a\x77\x27\xe2\x10\xf6\x4b\x78\xe8\x2b\x76\x41\xda\xe4\x46\x52\x62\xbf\xf9\x3a\x0a\x22\x87\x8b\x66\xec\xf4\xfa\x0c\x4a\xab\x99\x9b\x2c\xcf\xf9\x7e\x5c\x95\xed\x13\x21\xc1\x25\x8a\xde\x03\x11\x8e\xc4\xd5\x91\x5d\x85\x2b\xfc\x1a\x0f\x22\xaa\x4b\x77\x35\x06\xc7\x76\x57\x5a\x6b\xdc\xff\x04\x51\x66\x56\x0f\xb4\xa8\x47\x12\x5b\x75\x5d\xe2\x39\xa4\x20\xdf\xe5\xcb\x92\x9a\xfd\x78\xad\xd4\x70\xa0\x6f\xad\x07\x5c\x84\x60\x82\x3e\x01\x0a\xf8\x22\x3a\x1a\x91\x50\xb9\xaf\x53\x3a\x07\x91\x50\x64\x85\xfa\xae\x78\xbf\x6b\x79\x5b\xee\x31\x54\x1d\x44\x09\x9b\x5d\x65\x3e\x65\xee\x9c\xf2\x94\xe3\x27\x74\x4f\x84\x33\xca\xbd\x46\x61\x52\xe2\x11\x32\x13\xc5\x21\x41\x04\xbe\xad\x03\x7b\x3f\x5d\x9d\x1b\xb9\x48\xff\xde\xbe\xf7\x14\x94\x47\xfd\x3b\xdf\x15\xdb\x4d\xa8\x83\xb8\x19\x9c\xd8\xf3\xf4\xe8\x0d\x67\x27\xad\xbd\x72\x10\x56\x67\x09\x12\x03\xa5\xde\x0e\xf4\x15\x50\xcf\x34\x07\x12\x1c\x0a\xda\xb8\x09\xd8\x20\x80\xdb\x60\x79\xab\x05\x4e\x9d\x0a\x8a\x59\xa1\x22\x54\xe0\x72\x14\x05\xb8\xdd\x17\x45\xc2\xb4\x29\x6a\xd0\x39\xb1\x6e\x6f\xdf\x23\xe2\x02\xf4\x6f\xbc\x0d\xdc\xb8\xfd\xce\xa9\x57\x86\x53\x1c\xb3\x2b\xfa\x84\x2a\x52\xb2\xda\x86\x4f\x2b\xdf\x99\xcc\xfd\x05\x4e\xb0\x8d\x79\x44\x75\xcf\x02\xde\xd0\x4f\x58\xcd\x1d\x3c\x28\xde\x82\x6e\x79\x06\x5a\x50\xc1\xe5\x3f\x50\xea\x7c\xa0\xe7\x70\xe8\x46\x03\x08\xb1\xae\x9a\xd9\x52\x9b\x29\xe3\xe6\xbe\xf1\xbd\x57\x4d\x77\x75\xc0\x52\x1d\x17\x03\xed\xa3\x2c\xcc\xb0\xde\xd6\x7b\x69\xdb\xb6\xd1\x40\x0f\xd7\xee\x36\x0f\xf0\xe5\x72\x57\x01\x7e\xb9\x55\x7c\xec\xa6\xac\xad\x79\x13\xfc\xa1\xba\x04\x33\xd1\x28\xf3\x0e\x34\xb9\xea\x92\x90\xd6\x6b\x93\x48\x01\x49\x71\x64\x75\xdd\xc2\x9b\xf7\xef\x7b\x00\x55\x2b\x01\xa3\x88\x6b\x07\xf7\x47\xec\xe1\x31\xb1\x0b\xe5\x4d\x22\xad\x37\x94\x4e\x7a\x28\x1f\x0b\xfe\xcd\x70\xbd\x36\xc5\x7a\xbf\xc5\xc8\xd8\x40\xa9\x77\x62\xa4\x39\xa5\xde\x68\xa6\xbf\x15\xb8\xad\x6d\xbb\x73\xb9\x10\x62\xf0\x3e\xb0\xbc\xdc\x20\xf7\x2a\xbd\xbe\x7d\x65\x63\xb9\x4e\x9e\xf9\xf7\x7e\x64\xe1\x34\x2b\x40\xf9\x07\x2f\x97\x87\x8e\x20\xcc\x58\x34\x1f\xe1\x84\x68\x67\x7c\xfc\xcc\x07\xef\x12\xd1\xcf\xda\xe2\xc2\xa5\xfc\xe2\xda\x5d\x2e\x54\xe6\x2e\x08\xa0\x0c\x00\x1e\x0a\x9c\xca\xbc\x1f\xfd\x9d\x22\x01\xd7\x24\xd1\x85\x79\x0c\xd6\x22\x86\xfc\xd1\x19\xd3\x9a\xb4\x94\xc7\xa2\x65\x7b\x38\x35\x5c\x11\xd2\xab\xd5\x0b\xe5\x7b\xd1\x1c\xc8\x84\x0b\xd7\x9c\xc5\xe2\x66\xb7\x5a\x2b\x5b\xaa\x5a\xfb\x32\xdc\x8f\x44\x0b\xfd\x18\x91\x75\x84\x1c\x74\x8a\x7b\x0b\xc6\x68\x6d\xec\xaa\xca\x96\xbc\x80\xbb\xba\x4b\x8e\x1e\x35\xd9\x1b\x72\xd6\xac\x1f\x28\xf5\xe7\xc6\xf4\xb1\xe7\xcc\xbe\x61\x10\x07\xe8\x5c\x46\xb0\x91\x71\xeb\xa8\xe0\x9d\xa7\xc7\x7c\xec\xc6\x71\x97\x67\x1f\x0d\x32\xe8\x74\xbc\xd9\xaa\x27\xde\xd8\x3a\x19\xb3\x1a\x6a\xc2\x58\x05\x8e\x23\xa3\x98\xa7\x56\x84\x28\xa3\x47\x85\xb9\xa4\x69\x0e\xb7\xe5\x72\xeb\x16\x61\xab\x2d\x14\xec\x86\xdb\x0b\x22\xbd\xd2\x08\x9c\xe7\x4f\x0d\x67\xd2\xdc\x8c\x5b\xf6\x32\xe3\x78\x23\x25\x51\xca\x8a\xce\x50\x75\xec\x0c\x35\xe1\xb0\xad\x05\x2c\xac\xe3\x3c\xfd\x0b\x66\x46\x20\x47\xd9\xda\x7a\xad\x68\xbb\x7b\x75\x23\xde\xce\xd3\xaf\xc2\x96\xa0\x26\xd0\xf3\x68\x7b\x45\x36\x2a\xec\x73\x3e\x1c\x28\x41\x8a\x0c\x16\xaa\x86\xf3\x7b\x83\xd7\x41\x1f\xf8\x0b\x1a\xb4\x69\xa3\x61\x0c\xc8\x5a\x87\xa6\xe1\x82\x43\x07\x27\x73\x3d\xbd\xea\x38\x92\x3a\xec\x60\x6b\xa5\x05\x13\xc6\xd4\xd8\x90\x8d\x41\x88\x1c\x93\x65\x23\x8a\x66\xc0\x8f\xa1\x4b\x80\xd5\x04\x2d\x76\x76\xf5\x53\x9a\x73\x1c\x16\x45\x96\x39\xb6\xae\x82\x88\x74\x18\x17\x7a\xa0\x52\xd7\x03\x7d\x61\xe0\xe2\xd9\x3d\x47\x51\xba\xc3\xe3\x13\xf9\x73\x82\x0a\x9c\x63\xf7\xea\x88\x2f\x33\x50\x6a\x32\xd0\x17\xcc\x51\x4a\x1e\x1c\x90\x72\x20\x9f\x5d\x68\x1b\xe4\x02\x8e\x34\x01\xba\x5c\xaa\x55\x59\x6c\xf2\x6c\x85\x1c\x53\x22\x18\x55\x1c\xda\x83\xee\xcf\x8e\xa9\x9c\xa2\xe2\xd0\x19\xfa\x0f\x11\x9b\x96\xc5\xa2\x1e\x5a\x30\xee\x5d\x48\x3a\x98\x0f\x02\xdc\xad\xa8\x88\xc9\xdd\x8f\x73\xc0\xee\xd8\x2e\x90\x94\xc0\xb5\x39\xc3\xee\x83\x60\x04\x14\xf4\xf5\xf8\x7e\xbd\x84\xc0\x73\x54\x41\x1b\x70\x48\x98\x76\x75\x0d\xf1\x65\xc8\xd6\x84\x16\x02\xad\x2c\x83\x94\xd4\xa2\xc4\x3b\x46\xe6\x6c\xff\x7a\x1d\xad\x36\x0e\xa8\x31\x15\x63\xc7\x62\x6e\x4c\x35\x5f\x78\xda\xa7\x37\xd9\x3b\x7a\x30\x57\xa5\x45\xf7\x0e\x91\xa9\xe1\x64\x9d\x5f\xa4\x32\x5a\x98\x3e\xb7\x48\xc5\xed\x31\xab\x5b\xa0\x41\xa8\x61\x33\xe2\xf3\x5e\x6e\xa9\x35\xdf\xcb\x03\xa0\x4f\x9c\x21\x07\xea\x16\x63\x4f\x4f\x25\x81\x81\x12\x04\x99\xee\x3e\x64\x0c\xc2\x76\xcc\x23\xee\x4b\x0a\x67\xc0\x6e\x0e\xa0\x11\xe7\x77\x7e\x22\xde\xc6\x42\x97\xd5\x7d\x5a\x64\xff\x41\x52\x04\x56\x84\x07\x32\x2e\x44\xf4\x99\x3c\x88\xf9\x78\x98\x43\x6b\x58\x08\xcb\xe5\x3e\xb5\xdf\x61\xf0\x10\x01\xfb\x6b\xcc\x7e\xb7\x22\xd0\x8c\x9e\xa2\x2f\x2a\xff\x45\xc6\x4b\xe1\xd7\x1a\xe1\xe8\x84\xd7\x85\x29\xbc\xc6\x0f\x2f\x11\xe1\xd7\x1d\x35\x03\x7a\x5a\xa0\x88\x92\x6c\x70\x0b\xef\x85\xb7\x56\xf8\xdb\x31\x70\x17\xd7\x57\x9f\x88\x58\x0e\x41\x72\x70\x4e\xa8\xfc\xa1\x8f\x2b\xab\x40\xb1\xce\xfa\xe0\xbc\xa9\x46\xdc\x37\xaf\x4c\xba\x3e\x84\x0d\x9e\x52\x50\x96\x31\x45\x32\x69\x02\x41\x53\x3e\xe1\xf3\x83\xf2\xed\x08\xda\x6d\xa2\x15\xbe\x06\xc3\x3f\x01\x1b\x81\xd1\xf8\x0a\x82\xb1\x90\x7d\x2a\xf4\xd2\x3c\xa4\xf9\x46\x95\xa2\x4c\x1e\xe0\x86\xe0\x53\xc1\xc6\x78\x03\x01\x26\xfe\x63\x65\x50\x72\x0f\x6e\x22\x39\x0c\x97\xbb\x98\x7a\x81\x31\x25\x2e\x0b\xde\x8e\x78\xd7\x24\x9c\xe8\x08\xf9\x5b\xaf\x49\x30\x96\x1e\x45\x69\x63\x5c\x8b\x27\xb6\x1f\x3b\xb1\x27\xed\x84\x0c\xc3\x1c\x96\x71\xf8\x05\xce\x49\xd5\x79\x6f\xf1\x22\x10\xc1\x4b\x73\x23\x03\x08\x91\x8a\xca\x7c\x0c\x82\xaa\x32\xd0\x9e\x15\xdb\x56\x11\x1f\x69\xc7\x29\xa3\xb5\xfe\x71\xa0\xcf\xa7\xd7\x6f\xc7\x93\xf1\xe4\x9d\xbe\x98\x9e\xdf\x5e\x8f\x26\x8b\x28\x8a\xb5\x5d\x66\x45\xc3\xfd\x11\x84\x2a\x8c\xb7\x7b\x12\x54\x9a\xa8\xe6\x35\x0b\xb6\x2a\x1e\xe4\x6c\xa3\x7e\x20\x6c\xe9\xa6\x4b\x54\x2f\x58\x2a\xe5\xe3\x5c\x1c\xfe\xce\x38\x64\xe3\x29\x5f\x84\x41\x3f\xe2\x58\xe0\x07\x54\x14\xfd\xf0\x5d\x49\x84\x9a\x2d\xfb\xb7\x54\xb5\x03\x5f\x94\xe8\x55\xff\x54\xc5\xc6\x91\x46\x6c\xed\x11\xf6\xce\xff\x8f\x8d\x7c\x23\xcb\xbb\x6b\x38\x43\x59\xa5\x8e\x9c\xb7\x0b\xdf\x4f\x7e\x7e\x61\x18\xf4\xc4\x67\xa3\xdb\xbe\x5d\x57\x3c\x7c\xe9\x76\x9f\xd7\xd9\x2e\x37\x0a\x93\x5d\xab\x34\xef\x1a\x21\x32\x1c\xb4\x6f\x88\xfd\x37\xd5\x36\x2b\xee\x09\xdb\x19\x2e\x5a\x48\x9f\x4c\x8f\xed\x7a\x58\x80\x65\xbb\x4d\x0d\x71\x0d\xb7\x39\xd7\xd9\x06\x60\x0b\x78\xf0\xc0\xb8\x2b\xc8\x23\xcb\xac\x13\xfa\x9d\x80\x07\xe1\x75\xb2\x2f\xb2\xbf\xef\xc1\x50\xa4\xeb\x35\x5d\x2d\x85\x91\xcd\x40\xa6\x4d\x09\xa4\x4c\xd2\x8a\xa7\x04\x3d\x40\x2c\x34\xe3\x4d\x25\x43\x5f\xfe\x68\xcd\x36\x50\xf5\x5c\x80\xb7\x6f\x72\x6b\x74\xca\x6d\x60\x0e\xe1\x6b\x6e\x36\xf4\x30\x5d\xff\x6d\x6f\x6b\x89\xe2\x8f\x4f\x69\x5e\xb0\xcf\x7b\x0b\x8d\xe8\x81\x77\xbf\x71\x01\x40\x21\xd2\x00\x54\xf4\x1a\xeb\x5f\xc4\x45\x79\xff\x0a\x97\xd5\x76\x5c\xe9\x99\x14\x9a\x4f\xf1\xae\x4d\xc1\x48\x41\xb8\x1f\x1f\x0d\x0e\xbc\xf1\x97\x41\xf5\xcc\xbb\x3b\x10\x44\x70\xca\x76\x7d\x5a\x45\x77\x1d\xa1\x11\xb9\x26\x8f\x3c\xcf\xbb\x5e\x11\xbb\xe4\x60\xf0\x7e\x72\x06\xef\xea\x6a\x74\x0e\xe1\x7a\x10\xa6\x6b\x5b\x3d\xaa\xcc\x5c\x95\x79\x6e\x98\xf5\xa9\xb0\xe4\x7c\xb7\xee\xfa\x5e\x39\xb4\x6d\x0c\x3b\x40\xdb\x09\x55\x59\x86\x23\x49\xd0\x24\x36\xca\x50\x45\x11\x9e\x9c\x9d\xf0\x9e\xf6\xc6\xf4\xb0\xe2\xa6\xfa\x6b\xe8\x4c\x97\x31\x15\x80\x89\x6a\x9f\x77\x34\xc1\x99\xe5\x66\x16\x57\x5c\x0c\xa3\x2a\x47\xcc\x45\x3b\x13\xdb\x4c\xf1\xf2\x00\x9b\xcf\x75\x95\xae\xea\xd0\x74\x8f\xdb\x86\xf3\x97\x00\x60\xb2\xc9\x8d\x4c\x4a\x56\xab\x30\x6c\xf9\xa1\xeb\xd0\x09\xce\x2d\x9e\x16\x70\x42\xa6\x9d\xb6\x11\x8b\x86\x6a\x14\x56\x74\x0d\x13\x24\xf4\x14\xd0\xe7\xf1\x89\x67\xa5\xdd\x49\x15\xaa\x42\xba\x86\x0b\x2b\x86\xa2\x14\xd2\xcf\x03\x3d\x7c\xf7\x6e\x36\x7a\x87\xec\xde\x1f\xc6\x8b\xf7\x7a\x3c\xb9\x18\xdd\x8c\x26\x17\xa3\xc9\x42\x7f\x98\xce\xfe\x32\x57\x6a\x48\xbc\x67\x69\x57\xf4\x9f\x05\x1d\x42\xfd\x69\x44\x7b\xe6\xf5\xc6\xf1\xaa\xbc\x36\xee\xe2\xe5\x7c\x83\x30\x63\x0c\xca\x4c\x28\x09\x5c\x02\x69\x7b\x99\xef\xd1\x6c\x3a\x6f\xba\xac\xc0\x07\xad\xe2\xdc\x0e\x81\xae\x54\xc0\x46\xa7\x85\xee\xa5\xf7\xf7\x6e\x20\x6a\xd3\xe3\x2c\x43\x08\xe3\x7a\xf2\xa1\xe0\x6c\xc9\xae\x11\xf2\x9a\xf5\xc0\x00\xb4\x80\xe6\xd0\xdc\xa7\x9e\x6a\x34\x18\x43\xfe\xe2\x77\xc0\x1b\x02\x11\x1b\xd0\x99\x7d\x64\xe5\x79\xb1\xbf\x10\x77\x8a\x65\xe1\x24\x68\x5e\xb7\x4a\x9b\xc2\xbe\x49\x0b\xed\x3b\x92\x44\xf0\xaa\x50\x72\xe2\x35\xd8\x43\x9c\xdb\xa3\x5b\xe1\x8e\xc2\x0f\xa0\x04\x79\x5a\x01\xb8\x46\x8b\x22\xe0\x8e\xaa\xe1\x66\x38\x9e\x6e\xda\xc2\xef\x17\xd9\x04\x1d\xf2\x83\xfa\x15\x14\x52\x04\x15\x81\x9a\x12\x63\x11\xa5\x72\x9c\xb7\xf3\xda\xa4\xd1\x38\x50\x36\x23\x45\x8f\xc2\x39\xdc\xdc\x2c\x22\x22\x8d\x46\x26\x0a\x48\xcb\xa0\x35\xb9\x12\xe4\x48\x94\x31\x38\x68\x59\xa5\xab\x8f\xa6\x51\xa0\xe4\x4b\xd2\xe4\x2b\x7c\xfc\xc6\x19\x84\xaa\x2c\xb2\x95\x0c\xe5\x40\x8a\x17\x41\x30\x8d\x44\x31\xd6\xaa\x89\x6f\xb9\x53\x6c\xa0\xa7\x81\xf3\xdb\x8b\xee\x12\x62\x19\x94\xa2\x19\x86\xd5\x6a\x2a\x74\xf5\xf1\xa1\xcc\x45\xe3\x70\x1b\xff\x69\xa0\x17\xb3\xe1\x64\x7e\x05\xdb\x58\xa9\x85\xa8\xcf\x70\x7b\x23\x20\x38\x43\x2d\x79\x2c\x5e\x61\x4b\x7f\x63\x91\x40\xc7\xf0\x1c\xab\x8e\x67\x8b\x7d\xfa\xc2\xfb\xd3\x03\x3d\x83\x43\xc6\x6d\xb4\x0e\x7f\x15\xdd\x32\xf1\xf0\x80\xf5\x62\x9a\xae\x8e\x6b\x51\xd6\xa1\xc4\x8b\x6c\x37\xdc\x74\xaf\x07\x2f\x1f\x0d\x2a\x1a\x21\xd8\xd2\xed\xf2\x70\x5a\x97\xd1\x03\xde\x09\x69\x28\x35\xdb\x2e\x37\x33\x84\x7e\x03\x2c\x46\x34\x41\x75\x7a\xc3\x1c\x7d\x8c\x1d\x2d\xdb\x4e\x0d\xb0\x63\xe2\x05\x74\x85\x5f\xde\x95\x83\x07\x8c\x59\x50\xc6\x17\x7d\x19\x15\xf7\x80\x08\x0a\xa8\x82\xd8\xae\x30\x24\xef\x48\xe7\x4b\xd1\x4a\x3a\x12\xfd\xfd\x40\x8f\x0b\xb5\x4a\x2d\xd9\xeb\x75\x66\xd3\xfb\xca\xa0\x81\x58\x9a\xfa\xd1\x90\xb1\x93\x85\x43\xc7\xde\xd6\x6a\x16\x84\xcd\xd9\x0f\xad\xc4\x6b\x93\xee\xef\x03\x78\xc5\x5d\xa1\xd3\x2c\x47\xf3\x15\xa2\x51\xcd\x44\x40\xf6\x8c\x57\x18\xc7\xb9\x23\x1c\x39\xbe\x5d\x9a\xc2\x13\xbf\xfe\xfb\xce\xf6\xb5\x33\x55\xe1\x13\x67\x7d\x05\xcd\xac\x0f\x3b\x77\x11\xca\xb9\x0c\xda\x04\xa2\x8f\xda\x83\xc0\xf0\x4a\x82\x5b\xfd\x97\x81\x5e\x8c\x66\xd7\xe3\x09\x6d\x75\x89\xb4\x95\x65\xd7\x89\xb6\x70\x57\xc7\x05\xd7\xae\xc1\xf6\x23\x80\x7c\x78\x3a\xb5\x8a\x78\x97\x11\x0e\x88\x8b\x6a\x23\x34\x46\xa2\xda\x3f\x1f\x05\x4c\xeb\xda\x6c\x77\x35\xd3\x78\xf8\xd7\xab\xf0\xfa\xa7\xde\x4e\xc8\xed\x84\x48\xa0\xf3\x3c\x54\x99\xc1\xa8\x38\xd3\xe2\x6e\x16\x46\xc1\x05\x97\x0e\xe0\xae\x26\x31\xe6\x97\xa3\x80\xce\x52\x22\x46\x95\x54\xe5\x3d\xc4\x16\x78\x0a\xe0\x41\x09\xda\x16\x64\x7e\x6d\x3e\x32\x70\x4b\xc1\x53\xd0\x00\x51\x97\x6c\x68\xd8\x5a\x09\xce\x47\x70\x1e\xb9\x01\x84\x9f\xca\x0a\xcc\xbb\x02\x76\x2c\x4b\x03\x37\xc2\x8b\x81\xbe\xbc\x5d\xdc\xce\x46\x7a\x36\xfa\x75\x3c\xe7\x3b\x01\x08\x55\x5c\x8d\xcf\x47\x93\x39\x51\xb9\x1c\xe5\x25\xf4\xd8\x5f\xfb\xa0\x0b\x03\xc5\xff\xa8\xea\xdd\xd4\x97\x7f\x37\xb9\x55\xc7\x89\x74\xba\xf4\x6c\x20\x85\x50\x98\xc7\xf0\x28\x18\x8e\xa5\xd1\x36\xdb\x66\x79\x5a\xa9\xac\xd0\x76\x97\x55\x99\xbf\x6a\x32\xfe\xf4\x13\xc3\x22\x9c\x69\xc6\x13\xc5\x5d\xb7\x81\xf2\x00\x60\x5b\x10\x35\x42\x52\x01\xf7\x0a\xb5\xab\xca\x65\x6e\xb6\xa4\xb5\x5e\xac\x4c\x55\x40\x16\xc5\x68\x92\xf6\x7c\x7c\x7c\x1c\xdc\x17\x7b\x50\xf3\x64\x82\x91\xef\x07\x4a\x81\xe8\x4e\x03\x23\x25\xd8\x36\x30\xf7\x97\x4a\x29\x1e\xf2\x8d\x23\x19\x9e\x71\xa3\xb2\x9e\xca\x51\x98\xdf\x2c\x95\x94\xe0\xf8\x9d\x0e\xfe\x5f\x7e\x6d\x8f\xf4\xe0\xf3\xb4\x36\x15\x7f\xaa\x27\x01\xf9\x59\x8d\x77\x64\x5e\x55\x9c\x1b\x80\xda\x49\x5f\x57\xc3\xc7\x2a\xd7\xd4\x33\x08\x9c\xf0\x97\x3e\x52\x40\x6d\x15\x0d\xaa\x58\x05\x28\x6a\x02\xa6\x39\x7c\x80\x3b\xe4\x1d\x4f\xc0\x91\xb4\x6e\x98\xaa\x74\x53\xf7\x9f\x23\xc3\x6c\x8f\x97\x77\x47\xb1\x31\x6d\xa5\xa3\x76\x38\xc8\xf3\xb5\x3e\x94\xa5\xc5\x7a\x2b\xfe\x0a\x02\xb0\x7e\x7b\xf3\xd4\xf0\xe2\x62\x34\xb9\xb8\xbd\x7e\xed\x4c\x42\x08\x64\x36\xee\x93\x60\x4e\xfc\x15\x44\xa9\x45\xc7\xe7\xa0\x6c\xd8\xdf\x0e\xfd\x9c\x91\x0e\x40\x22\x4e\x7b\x09\x01\x8d\x2f\xce\x42\xcf\xbe\x10\x88\x60\xa1\x05\xc6\x1e\x0d\x06\xfb\x22\x67\x40\xfd\x0d\x9c\x43\x0f\x47\x09\x35\x69\xaf\x23\x82\xab\x55\x5f\xdf\x8d\x86\x33\x7d\x37\xbd\x9d\xe9\xc9\xf0\x7a\x14\x09\x9e\x04\xe1\x92\x60\xa5\x25\x30\x10\xb2\xa6\xca\x17\x38\x49\xcd\x93\x4e\x88\x0a\x92\xb1\x1e\x37\x27\x89\xe4\xe5\xd2\x94\x57\x8e\x17\x63\x98\xdf\x67\xa6\xf3\x0d\xfa\x8a\x45\x57\x2d\x7e\xe2\x7e\xdd\x02\xec\x27\x24\x83\xd6\x02\xe8\x0f\xd4\x30\x82\x11\x08\x05\xff\x66\xbc\x82\x4f\x69\xe3\x5d\x83\xee\x1e\xf3\x5c\xf7\x02\xea\x1a\x56\x48\x57\x5b\xdb\x95\x05\x5d\x55\x04\x09\x47\x67\xc0\xd9\xef\xb9\xce\x0f\x06\x03\x6c\x7f\x4f\xe7\x59\x61\x38\xa6\x99\xd9\xd7\x4a\xf9\xf8\x66\x87\x57\x8b\xcc\x0d\x57\xe3\xf9\x42\x2f\xde\x8f\xc6\x33\xbd\x18\x2f\xae\x46\x73\x81\xb4\x6c\x53\x06\x84\xef\x24\x5e\x96\x01\x3e\xda\xaa\x76\x08\x9f\x7c\xb6\xef\x9e\xbd\x2b\xea\x67\x59\x91\x5b\xce\xf5\x52\x1c\x41\xe4\x8b\x46\xfd\x50\x19\x93\xe8\xad\xa9\xee\x99\x20\xbd\x7e\x2c\x75\x1a\x58\x8e\xc1\x9c\xda\x3d\x5d\xd1\x6d\x56\xef\x59\x4f\x68\xbc\x89\x37\xb8\x4c\x30\x16\x75\x95\x7d\xca\x88\xea\x92\xcb\x86\x99\x01\x6a\x55\xae\x4d\xa2\x1f\x05\x2b\x92\xc2\x78\x1a\x19\x65\x6b\xc2\xd7\xb0\x28\x32\xcd\x73\x93\xd3\x46\xc1\x20\x3c\x50\x41\x33\x19\x5a\xe0\x78\x62\x67\x4c\x71\x1d\x63\xfd\x24\xad\x31\x64\xf0\x30\x5a\x40\xbe\x07\x69\x7c\x44\x4f\xfd\xd7\x26\xb4\x0c\xfa\x9f\x2f\x07\x67\xff\x24\x1a\xe0\xe7\xf4\x3f\x5f\xbd\x68\xea\x3f\xbc\x3a\x7b\x79\xf6\x8d\xff\xf1\x8f\xf8\xf9\x42\xfd\xcf\x97\x83\xb3\x44\x9f\xe9\xeb\xb4\x5a\x3d\x00\xd3\xe3\xff\xee\xea\x9f\x03\xd5\xa9\x88\x89\xd5\x67\x5e\x16\xf3\x98\x1a\xe6\x57\x0b\x87\xd6\x9e\x9c\xa7\x89\x97\xa5\xc0\x65\x5b\x27\xf4\x4b\x64\x42\xe3\xd9\x50\xbf\x49\x26\x74\xa0\xd4\x2b\x2c\x97\x83\x24\x5c\x8f\x57\x53\xaf\xad\xce\x07\x85\x31\x90\xb3\xd1\x48\xc1\x00\x62\x7c\xd8\x47\x0e\x6f\x9b\xb5\x0a\x98\xea\xa6\x00\x1f\xc9\xed\x79\xf1\xbd\xe0\x81\x3d\xa9\x7d\xf7\xc3\x40\xdf\x34\x5e\xa2\x3b\x5e\x22\x40\x5c\x81\x07\x84\x3b\x53\x00\x2d\xe2\x41\x89\x5f\x45\x24\x08\x3e\x89\xff\xb5\x4d\x55\x51\x53\x7f\x1c\xe8\x8b\xbd\x61\x06\x4c\xaa\x72\x5b\x1a\xba\x68\xd1\x35\x30\x6c\xd8\xaa\x44\xb6\x30\x71\x8b\x2b\x77\xa6\xc8\xd7\xe9\x0e\xae\x72\xfd\x81\x52\x3f\x0d\x8e\x09\xfd\x7d\xad\xfa\xaa\xf2\x52\xa7\xbf\x45\x7d\xd5\x34\xc4\x57\x55\x4c\xfd\xf7\x8f\x89\xaf\xaa\xd8\xe5\xfc\x47\xc4\x57\xa5\x16\xa9\xfe\xf7\x7f\x1f\xce\xd5\xef\x25\xbc\xaa\x17\xd3\x44\xfd\x3e\xc2\xab\x9a\x84\x57\xd5\x6f\x16\x5e\x85\xe6\x37\x75\x66\xbf\x40\x4c\x55\x7f\xad\x98\xaa\x7a\x42\x4c\x55\x7f\x9d\x98\xaa\x7a\x4a\x4c\x55\x7f\x95\x98\xaa\x7a\x42\x4c\x55\x7f\xb5\x98\xaa\x7a\x52\x4c\x55\x7f\x85\x98\xaa\x7a\x52\x4c\x55\x7f\x8d\x98\x6a\x2c\x19\xfa\x9b\x75\x42\x5f\xfc\xc1\x3a\xa1\xeb\x6f\x42\xa1\x7f\xdc\x0f\xfb\xff\x67\x83\x97\xff\x49\xfa\xff\x67\x2f\x5f\xbd\xfa\xa9\xa5\xff\xff\xd3\x37\xfd\xa7\x3f\xe4\xe7\x8b\xfc\x7f\x20\x7f\x3f\x13\xfa\xff\x67\xbf\xfc\xf2\x27\x1d\x59\x8a\x3f\x25\xc7\xac\x04\x48\x88\xaa\x96\x19\x98\x94\xb5\x79\xad\x17\xf2\xe4\xcf\x5a\xde\x99\xd1\xbd\x61\x55\x3b\x47\xc3\xb7\xaa\xa7\x52\x1b\x19\x0b\xef\x94\xde\x98\x2a\x77\x1e\xd1\x7d\x95\x6e\x01\xca\x74\xe5\x59\x91\x86\xd6\x03\xd2\x56\xc6\x12\x46\x25\xb3\x35\xe6\xb6\x7d\xc9\x39\x37\x24\xb8\x5d\x95\x49\xd7\x03\xa5\x62\xde\xf7\x0c\x00\x6d\x2d\xbf\x9e\x78\xdf\xb1\xd6\xbe\x8e\xb9\x49\xd0\x91\x21\x88\x80\xbe\x41\x29\x8f\x20\x98\xba\x03\x2c\x22\x44\x2d\xfc\x75\x26\x0c\xef\x7b\x24\x54\xde\xa6\x19\x45\x58\x20\xaa\x63\xcd\x76\x99\x13\xe9\x95\x4a\x79\x94\x98\xe4\x05\x61\xbb\xce\x55\x37\x9f\x4c\x5e\xee\xb6\xbe\xc5\x5e\xd8\x84\x09\xd5\xb1\xba\x0e\xfe\x02\x08\x0b\x15\x7f\x0c\x73\x70\xd0\x10\x8a\xf4\x76\x70\xf5\xdc\xb0\x38\x49\x01\xa2\x5a\x95\x39\x2d\xab\xd3\xdc\x58\xab\x56\x7b\x5b\x97\x5b\xb8\xd7\xa4\xf6\x01\xf1\x49\xf9\xde\xc6\x4f\x05\x44\x96\x2f\xc5\x6f\x14\x85\x0e\x94\xba\xf0\xd8\x6f\xfb\x5a\xa9\x1e\xbd\xad\x27\x4a\x6e\x62\x0c\x14\x84\x86\x40\xed\x4a\xae\x14\x0a\x84\x36\x07\x36\x81\x04\x80\xc4\xd6\x70\xe8\xbf\xeb\x81\x2b\xa2\xbd\x60\xa4\x35\xf1\x86\xc7\x7c\x79\x4a\xf5\xe6\x4c\x72\xe0\x59\x94\x43\x63\x09\x00\xe5\x07\xcd\xd7\x9d\xe2\xed\xc3\x14\x3a\x00\x54\xcb\x2a\xa4\x14\x3c\x70\xd6\x0d\x33\x50\x5d\xc1\xfc\xfb\x1d\xf0\xe8\x7c\x71\x1f\x42\x6e\xf6\xd3\xb5\xaa\xf9\x3b\x20\x3d\xe4\x9a\xec\xcc\x12\xaf\x99\xc7\x94\xf1\x87\x4b\x29\xe2\x0b\x74\x93\x62\x81\xb8\xe7\xde\x95\x7b\x78\xd4\xa1\xdc\xb3\x2c\xda\x77\x50\x56\x95\x15\x1f\x01\xc5\xb9\x74\x57\x22\x8f\x94\x92\x20\x23\x26\x56\xba\x09\x4f\x9b\x85\x95\xc0\x5f\xd9\x80\x14\x02\x72\x23\x41\x63\x81\x4b\x20\x2d\xf4\xdf\xf6\x16\x58\x5d\x3c\x37\x8c\xcd\x48\x88\x76\x9d\xa5\x6a\x55\xda\x3a\xf1\x02\xba\x00\xf5\x7b\x48\xab\x7b\x80\x8d\x66\x88\x7d\xda\x99\x72\x07\xc2\x92\x9f\xca\xfc\x13\x43\x82\x6d\x09\xd5\x69\x27\x77\xc0\x18\x80\x49\x4a\xb5\x94\xec\x25\xa5\x7f\x73\x48\xcf\xb5\x56\x56\x60\xe8\xf2\x4b\x74\xbb\x83\x3e\x2b\xd0\x58\x2a\x40\x22\xb7\x26\x46\x83\x14\xb9\x56\x2b\xc4\xcc\xa4\x5e\xb5\x88\x58\xef\x36\xc6\x0c\xfa\x4a\xf5\x2e\x41\x1f\x49\x0f\x99\x9e\xb0\x27\x59\xd2\x8a\xd2\x7d\x0e\x20\x29\xd0\xd1\xb5\x87\xed\x43\x31\x22\x97\xb6\xa1\xe4\x0f\x95\xa5\xb3\xee\x92\x81\x88\x2b\x0e\x83\x5b\x03\x0f\x69\xb1\xf6\xb4\x00\xee\xeb\xa0\x5a\x00\x21\x0e\xf1\xc6\xca\xac\xb2\x5d\x06\x29\x1e\x5a\x78\xf0\x26\xbc\x5a\x46\x98\xbe\x27\x88\x97\xa8\xae\x9a\xb2\xc8\x59\x3d\x80\x78\x4d\x0c\xd8\x2c\xd6\x48\xef\x90\x3e\xa6\x87\x6e\x69\x0f\xc3\xe1\x1c\x08\xa1\xd0\xaf\x78\x23\xaa\x5f\x1b\xf9\x44\xde\x7e\x7c\x61\x17\xe2\x9d\x5d\xa0\x0f\xaf\xc2\xac\xd3\x3c\x57\x4d\xac\x71\xbb\xe8\xba\x19\xf7\x8a\xa0\xde\x2f\x05\xf3\x0f\x20\xcc\x96\xfb\x7b\xbd\xc9\x3e\xbb\x85\xb9\x2b\xab\x3a\x25\xf9\x64\xf8\x95\xc0\xa0\xc6\x75\xd8\x8d\x80\x89\xe1\x03\xfc\xa2\x84\xb4\x38\x88\x37\xd0\x5f\x5a\xc6\xc0\xdd\x26\x69\x00\x84\x59\xa1\xc8\x39\xb0\xc6\xdb\x07\xc0\xdd\xd6\x94\x94\x96\x24\x75\x62\x58\x45\xc1\xc1\x2b\x51\xa0\xe9\x11\x58\x94\xf4\x22\xf0\xbc\x08\x87\xc9\x23\xa3\x38\xb8\x37\x76\x97\x01\x10\xb0\xd3\xf3\x27\x79\x61\xec\x02\xd1\xa9\x24\xf3\x85\xf4\xb5\x5c\xd9\xfb\x50\x3e\x62\x76\xe5\xc1\x14\x50\x29\xc6\x9f\x82\x07\x07\x45\xd5\x8e\x69\x2e\x43\x9d\xe8\x74\x32\xe2\x55\xe4\x83\x68\xaf\x95\x4a\xfb\x08\x78\xeb\x2a\x8d\x27\xd3\xd9\x9a\x08\x31\x20\x04\x27\xdf\x6a\xdc\xc8\x6a\x18\x78\x46\x39\x6f\xb1\x3c\xe8\x5d\x49\xc5\x80\x69\xb6\x6e\xbc\xa3\x2e\xf5\xad\x35\x85\xa9\x31\xf3\x27\xa0\x72\x8a\x39\xf2\xca\x4a\x33\x38\xac\x6e\x91\x2c\x00\xf8\x73\x9b\xfe\xcd\x7d\xbb\x5a\x3d\xb8\x3d\x65\xb3\xda\xf8\xb7\xef\xf7\x85\xa9\x07\xfb\xfd\xa0\x30\x35\x40\x39\x96\x07\x24\xfb\xe6\xc7\xb5\x5c\x93\x3a\xc0\xa1\x8e\x8f\x49\xf7\x46\x34\xc2\xf0\x63\x75\xe2\xb2\xef\x03\x46\x7e\x65\xf2\x62\x01\x5b\x4a\x10\x42\x5a\x52\xd5\xae\xac\x08\x35\x5b\x45\x65\x64\x03\xa5\x56\x7d\x52\x7c\x83\x25\x56\x94\x45\xe0\x1e\x32\x9f\xcd\x6a\x0f\x6c\xbe\xce\x9f\xd2\x5c\x44\x60\xb9\x7c\xc7\x17\x56\xc2\xe9\xca\x5f\x53\xe2\x6b\x5e\x20\xc6\x07\x7e\x97\xc6\x2f\xa8\x68\x79\x01\x3a\x8a\x30\xba\xa4\x14\xb1\x73\xfe\x1f\x14\xd1\xb9\x35\x7c\xa4\x65\xe4\x85\x10\xb9\x5a\x40\xf3\xba\xd5\x9d\x71\x8d\x85\x65\xb6\x92\xce\x3d\x89\x43\xba\xee\x13\x89\x1f\x02\xd9\xa3\xb8\xbd\xac\x14\xf3\x9e\x44\x87\xef\xf0\x43\xd8\xdd\x4d\x91\x53\xcf\x97\xdd\xde\xda\x25\x72\xf5\x43\x7c\x1d\x4a\x06\xb9\x6f\xc0\x7e\xdd\x69\x67\xbf\x68\x03\x46\xb4\x3b\xcd\x7e\x7b\x28\xab\x98\x63\xcc\xfd\xa3\x84\x35\x78\x72\x81\x53\x04\xf3\x0e\x42\x66\xc5\xea\x13\x5a\xb3\x62\xb6\xa0\xf9\x7e\xa7\x01\x89\xd8\x23\x1c\x9f\x24\x5a\xd4\xb5\xc4\x07\x4a\x2d\xfb\xe0\xaa\x6d\x77\xc0\x78\xdb\x88\x9d\x87\x01\x6f\x71\x7c\xd1\x49\x16\xef\x11\x6c\x69\x7b\x8b\xe1\x52\x0f\xef\x79\x72\xb5\xf3\x3b\x01\xec\x59\x21\x43\x0b\x20\xda\x5b\x1b\x34\x5a\xec\xe2\x9a\x70\xf4\xd1\xd1\x1f\x60\x3b\xa1\x73\xdd\x5c\xc2\x9e\xcf\x5d\x5c\xca\xb2\x42\x8e\x36\xd2\x23\x8a\xf1\x7e\x72\xba\x9e\x9a\x8b\x7f\xca\x66\xf8\x31\x6c\x06\xf4\xb3\x74\x2a\xef\x2f\xc2\x6b\xf5\xd4\xe4\x4d\x02\xb1\xd8\xe9\x6d\x3e\xad\x38\xc0\x97\xf1\xe8\x2a\x4b\x82\xd4\xd8\xfd\xce\x79\x07\xad\xaf\x4b\x36\x50\xe5\x1b\xc4\x6f\x8f\xf7\x24\x78\x80\x02\xcc\xd7\x05\x4a\x16\x5f\x00\x06\xd3\x00\x72\x0f\x55\x07\x27\xbb\x12\xe8\xca\x0e\x82\x89\xb5\x1f\x6c\x41\xca\x3a\xd0\x1b\xaf\x15\xad\xba\xbf\x12\x44\x9d\xe4\x08\x75\x1a\x06\xac\x03\xfd\x64\xdc\x6d\xd7\xa8\xa8\x5f\xc4\x81\x04\x59\x1e\x5f\xca\x5c\x3e\x16\x21\x01\x62\x81\xa0\xbb\xc3\x12\xc0\xb0\xe6\x19\x72\x19\x7a\x1e\x7d\xcc\x50\x21\x89\x77\x6a\x89\xab\x5b\x89\x02\xd2\x23\x46\x8f\x9b\x19\x81\x2c\x41\x96\x45\x92\x7f\xd1\x8a\x52\x8d\x6f\xe3\x8d\x61\x69\x00\xed\x88\x74\x59\x5b\xb8\xee\x78\xc6\x71\x70\x1d\xa8\xda\x0f\xfd\x76\x5b\xa2\xa0\x56\xa0\xbe\x55\xe2\xaf\x7e\xee\xd6\x01\xd6\x22\x8e\xdc\x9f\x07\xfa\x5c\xdb\xfd\xb2\x2a\xdd\xb5\x44\x8e\x05\x55\xf2\xe2\x68\x05\x85\xf9\x96\x81\x27\xf9\x30\x65\xb6\xfb\x1c\xca\xee\xc5\xc3\x80\xea\x32\xad\x32\xb4\x0e\x9c\xa2\xa1\xb0\x8c\x2f\x13\xe5\x4a\x59\x5e\x71\xe8\x78\x72\x26\x2e\xb8\x9d\x81\xbf\xa1\x39\x60\x29\x51\x78\xc4\x45\x03\x30\x95\x0a\xe6\x54\xdf\xa4\x55\x7a\x5f\xa5\xbb\x07\xfd\x53\x74\xe8\x00\x27\x80\x68\x31\x9f\xfe\x48\x5a\x1b\x35\x37\x2b\x14\x39\xaa\x2c\x23\x05\x4a\x66\x29\xe9\xa6\xd5\xa5\xde\x00\xf2\x12\x20\xcb\xf7\x95\xa1\x18\xb7\xb1\x44\x73\x29\x1f\x36\x50\xea\x4f\x22\x69\x7a\xe4\xc6\x2e\x33\x92\xc7\x13\xa8\xaa\x99\x40\x15\xb9\x4d\xdb\x4c\xa0\x7a\x22\xf0\x63\xe9\xc9\x81\x52\xbf\x0c\x30\xfb\x70\x33\x3c\xff\xcb\xf0\x5d\x9c\x3b\xeb\x0d\xe7\x7a\x3c\xef\x41\xda\xe4\xc3\x78\xf1\x7e\x7a\xbb\x90\x59\xb1\x23\x39\x31\x25\x32\x3f\xfc\x2d\xc8\xfc\x40\x26\x2a\xd1\xcf\xe7\xc4\xc6\x21\x27\xa6\x9e\xcb\x89\xe1\xc0\x8e\x8a\xf5\xb7\xdc\xc0\xb3\x3f\x83\xef\xd7\x66\x57\x19\x77\xaf\x5d\xff\xdf\x57\xef\x6e\xae\x4e\x5f\x0e\x5e\xfc\xce\x99\x80\xa7\xe3\xff\x3f\xbd\x78\xf5\xa2\x19\xff\xff\xf1\xc5\x0f\x3f\x7e\x8b\xff\xff\x11\x3f\xef\x26\xb7\xfa\x6a\xfc\x76\x36\x9c\xdd\xe9\x77\xa3\xc9\x68\x36\xbc\xd2\x37\xb7\x6f\xaf\xc6\xe7\x01\x20\xef\x61\x40\x89\xfe\xf3\xbe\x30\xfa\xec\x97\x5f\xce\x74\x2c\xfe\x0a\xbf\x7a\x5a\xf2\x55\xa9\x86\xe6\xab\x7e\x5e\xf3\x35\xf9\xcf\x15\x7d\xfd\x9f\xac\x8e\x5e\x7b\x8a\x61\xcf\x83\xd0\xc0\xc4\xb3\x43\xf1\xee\xe6\x0a\xa2\x64\xee\x59\x0c\x64\x7f\xa9\x49\x34\x53\x65\xb5\xbe\x2f\xd9\x05\xe7\x27\xbc\x0c\x85\xeb\x6b\x44\x00\xb9\x87\xfc\x2f\xa5\x6e\x2a\x93\x6e\xdd\x55\x09\xb2\x0e\xbe\x2e\x02\x29\x14\x6c\x2d\x20\x56\x95\xd4\xf7\x2c\x81\xd9\x16\xc3\x64\xe0\x05\x09\x1d\x58\xfb\x90\x56\x06\x5d\x72\x3c\xe1\xb2\x7a\xa0\xdf\x22\xbd\x40\x95\x5a\x2c\x18\x7c\x02\x32\x89\xe2\x21\x90\x00\x41\xf9\x10\xe5\xb5\xca\xbb\xdf\xa5\xc5\xbb\x22\x58\xe5\xe9\x29\xc7\xfd\x89\x29\x37\xa8\x96\xba\xc1\x83\xcf\x6e\xa8\xa0\x2c\xab\xa9\xf8\x93\xa5\x5b\x73\xc9\xe3\x7f\xc5\x43\x7f\x04\xe4\x29\x0a\x03\x30\x71\x82\xf5\x6f\xf9\x41\x09\xcd\xb2\xa3\x05\x20\x5e\xf9\x14\xf1\x54\xa5\xa0\xe7\xc1\x39\xa7\x42\x18\x6b\xbc\xda\xdf\xda\xac\xdc\xa5\xdf\x4b\xaa\xa2\x7b\xbe\x4a\x0b\x29\xb1\x0a\xa3\xe5\x9f\xe0\x6e\x37\xe5\x40\x29\xa8\x59\x7d\x84\x36\xa6\x1f\x5b\x00\x57\x80\xcd\xa2\xc0\xc0\xc6\x54\x15\xe9\x5c\xd0\x90\x27\xb0\x78\x77\x15\xd0\x0c\x4d\xf7\x95\x7a\x6a\x06\xe5\x6a\x91\x93\x90\xd6\x71\xe1\x04\x3d\x5b\xd5\xa5\xdc\x62\x61\x67\xc5\xf8\xdb\x13\x9a\xec\xea\x5e\x5c\x3c\xac\xa9\x3e\x41\xbc\x0e\x7c\x72\xf5\x98\xd9\x87\x7e\x22\xf9\x6c\x21\xe8\x1b\x01\xf1\xca\x0a\x46\xcb\xdd\xe4\xb2\x9a\xbe\xa8\x1f\x53\xa0\x66\x0b\x5f\x55\xee\x33\xc2\x51\xf3\xcd\x28\x11\xc8\xbb\xcb\x0c\x91\x5f\x66\x40\x8f\x85\x6c\x55\x41\x8b\xd6\xbe\xf1\x44\x1d\x10\x22\x04\xf5\x7b\x4e\x2b\x30\xe3\xac\x46\xc6\xd9\x01\x94\x2f\xec\xaa\xb2\x36\x2b\xe2\x9b\xe2\xfa\xa6\x47\x14\xd3\x11\x69\x2c\x1f\x46\xa6\x08\xf9\xa6\xac\x96\x20\x9d\x81\x1a\xcd\xa5\x5a\x9b\x02\x9d\x6b\x7c\x05\xd7\x3c\x13\xd7\xcb\x47\xfc\x53\xe9\xe6\xa4\x32\xfe\xce\x80\x9f\x62\x06\x29\xf9\x16\xe5\x85\x61\xc0\x26\x92\xb0\x9d\xa7\x5e\xcd\x72\xe4\x62\xa5\x55\xc7\xe3\xd9\x35\x9f\x4a\x98\x32\xe6\xbf\x13\xd2\x2c\x10\x97\xbf\x14\xcc\x4f\x4f\x3d\x4b\x47\xcf\x62\xc1\xdc\xfb\x2a\xad\x33\xd6\x3b\x53\x70\x47\x15\x7c\x16\x4c\xdf\x2c\x92\x0a\xbe\x8a\x93\x46\x09\x5d\x6f\xa3\xef\xdd\x12\x3d\x94\xfb\xc0\x16\xa1\x1a\x0b\xb9\x7e\x30\x40\xc6\x5d\x26\x7e\x91\x89\x85\x25\xb2\x05\x6e\xcd\x79\xd6\x70\x77\xd7\x51\xa9\x47\xab\xfb\x20\x80\xef\x89\x6f\x2c\x07\xf7\x7c\xfa\x98\x62\x5d\x78\xa7\xc4\x84\x8f\x12\x1d\x81\x28\x23\xb5\x0b\x9a\x51\x19\xf7\x32\x8c\x05\xb7\xdf\x83\x35\x29\xdb\x14\xf2\x67\xc4\xf1\xaf\x3c\x15\x19\x9a\x3c\xe4\x9a\xc0\x2a\x79\x3c\xc4\x06\x7a\x88\xaa\x15\xd8\x46\xfb\x80\xb4\x0f\x5b\x5e\xcd\x00\xa3\xc3\x78\xe7\x41\xc1\x8a\xc7\x48\x10\xad\x2e\xa5\xa6\xfb\x4a\x6f\x4d\xfd\x50\xae\x09\xb4\xef\x56\xbc\x7b\xb6\xac\x0e\x7c\x48\x2d\x54\x0a\x00\x55\xfa\x6b\x7d\x72\xd6\x17\x09\x10\xd9\x0b\x38\x6a\x4e\x5e\xf6\x75\x09\xf5\x69\xb8\xe6\x45\xca\x1f\x23\xa8\xc8\x97\x08\xa3\x0f\x24\x00\xbb\x16\x44\x28\x89\xc9\xcc\x01\xa6\x1a\xf4\x82\xf8\x75\x03\xa5\x86\xb9\x2d\x51\x29\x0b\x02\xab\xfe\x5b\x65\xf5\x9d\xf5\xbd\x71\x7e\xc6\xa3\x41\x8b\xc2\xdb\x96\xb7\x0d\x12\x9d\x93\xc3\x81\x04\x1f\xa4\xa4\xc4\x93\xe7\xd9\x47\x1f\x99\xc6\xc7\xdb\x3a\x30\x2f\xdc\x18\xd6\xb1\xa4\x7f\xab\xcc\x86\x78\x36\xa9\x82\x01\x19\x57\x4e\x29\xf5\x5d\x6a\x91\x15\x33\x34\x2e\x03\xb2\x11\xbf\x82\xea\x12\x8c\x14\x71\x5b\xfa\xb5\xc4\x02\x3d\xc4\x3b\xd0\x2a\xd7\x4d\xfc\xd2\x73\x67\x97\x2f\x05\xcc\x8a\x9a\x55\x6a\xbc\x36\x7a\xa8\xc8\xac\xcc\x26\x17\xf2\x3e\x0d\x52\x1d\xfb\x9d\xae\xcc\x6e\x5f\xfb\xf0\xe3\xa5\xfb\x23\xa8\x7e\x14\x87\x58\xf1\x1b\xdc\x27\x48\x9a\x17\x50\x20\x5a\x80\x40\x1f\xea\xb8\x79\x93\xbd\x4b\x81\x23\x68\xa0\x3f\x18\x38\x21\xc0\x12\x82\xe0\x10\x84\x09\xdd\xe2\xaf\xbc\x38\xca\x2e\x2d\x32\x99\xda\x47\xae\x09\x79\x10\x41\x2f\x24\x83\x88\x2a\x97\x30\xbb\xf8\x1e\xef\x4b\x11\xaf\x79\x56\xb0\x98\x11\x58\x52\xa6\xc2\x11\x61\x1e\x8c\x7d\x08\xd9\xb9\x20\xb1\xae\xe1\x60\x30\x9f\x50\x17\x24\xc3\x13\x01\xa6\x04\x15\x17\x29\x80\x2f\x26\x00\xdb\xc0\xe4\x7f\xd4\x16\xd4\xde\xe3\x85\xf7\x1d\xad\xa5\x3d\xde\xf4\x51\xd4\x1c\x3f\xa7\x53\x70\x51\x07\x4a\x5d\x3b\x27\xd0\xf9\x6a\xc1\x3f\xc0\x2c\x0c\xe4\x8d\x9c\xab\x23\xfc\x0b\x20\x29\xf8\x04\xfe\x28\xe1\x20\x82\xbb\x39\xb9\x3d\xe2\x2c\x70\x8a\xe3\x31\xb5\xb1\xca\xfc\xbe\xc6\xfc\x24\x1f\xa5\x83\x08\xc9\x83\xb0\x1a\xb8\x5a\x7c\xb9\x6f\xc6\x1b\x50\x38\x65\xbe\xf9\x03\xd5\x04\x0a\xfd\x7d\x9f\xd5\x46\xb0\x4c\xf9\xb8\x9c\xef\x55\x59\x98\x37\x10\x1e\xdb\x63\x5c\x18\xb4\x04\x81\x58\x06\x8a\x85\x89\x73\xa6\x2c\xbe\xab\x75\x6a\xed\x7e\x6b\xfc\x0c\xa1\xa8\x72\xc6\x5a\xb7\x3e\x5f\x9d\xfa\x54\x16\xbf\x44\x09\xb8\xf1\x03\x23\x58\xfc\xfc\x8b\xac\x0f\xd1\x56\xe7\xa2\x3c\x32\x9e\x20\x7c\x11\xed\x68\xb5\xcc\xf7\x95\x4f\x16\x64\x05\x09\xa5\xb9\xe5\x80\x7c\x38\x60\xb1\xb8\xea\x1f\xed\x20\xe1\x2a\x88\x35\x0b\xd8\x7d\x69\x72\xc0\x06\x5b\x64\x8e\x43\x1d\x0e\x77\x4c\x5c\x31\x32\x23\x3e\xea\x52\x71\x64\x53\xc8\x48\x96\xcb\x2b\xff\x57\xa4\xde\x20\x24\x12\x80\xa6\xe4\x1b\xe2\x93\x8c\x44\xce\x8b\x34\x2f\xef\x49\xd0\xa5\xda\x83\x06\x9f\x4a\x9b\x4b\x89\xa8\x43\x3d\x5e\x83\x7e\x2d\x02\xd6\x80\x31\x62\xd8\x0d\x29\xfc\xa4\xb9\xb2\xe1\x46\x40\xf1\x4a\x91\x48\xcb\x48\x5a\x24\x70\xab\x25\x3a\x95\xcc\x2c\x8d\x7c\xbe\x8a\x1a\x1f\xef\x96\xce\xa5\x8c\x72\x38\x40\x70\x4c\x45\xea\x03\xa5\xde\xe2\xb5\xcf\x5f\x41\xdd\xb4\x56\x88\x05\xe0\x59\x4d\xc4\x80\x3d\xf3\x0a\x30\x10\x61\xc1\xac\xb3\x35\xaa\x6d\x83\xe5\x42\x69\x72\x2e\xa9\xf0\x86\xd0\xdd\xc1\xb2\xe2\x3e\xe1\x1b\x28\x5e\x1c\x09\x13\x66\x2a\xab\xf8\x29\x5e\x2c\xc5\x6f\x39\xfd\x01\x82\xaf\x54\xb6\x49\x6e\x57\xfa\x31\x96\x2a\xdb\xc2\x89\xcf\x81\x48\x7a\x9b\x5b\x99\x35\xa4\x49\xfc\x9c\xed\x0b\x76\x58\x0d\x86\x93\x89\x30\xa9\x28\x8b\xd3\xc8\x27\xa7\xa8\xea\xda\xec\x2a\xf6\x05\x05\x28\xad\xb4\x71\xe0\x3d\x05\x68\x42\x61\x36\x99\xb0\x00\x78\x14\xd4\x69\xbd\x6f\xb8\xa1\x58\x6f\xce\xbc\x3c\x64\x53\x9e\xb6\x50\xb8\xcc\xfd\x6d\x97\xab\x05\xc3\x00\xca\x4e\x28\xdf\x34\xba\xfa\x09\x77\x20\xa3\x7c\x71\x6e\x98\x10\xd0\xfb\x54\x7c\x65\x86\x0c\x86\xeb\xac\x73\xc4\x91\xe6\x40\x3c\x4f\x5c\x74\xe2\xc7\x06\xa9\xea\xac\xe0\x6c\xb8\xc7\x70\x6d\x07\xea\xe4\x03\x99\x23\xa8\x1f\x77\x06\xe3\x01\x8b\xb6\xd3\xd5\x43\x66\x3e\x51\xb6\x27\x28\x08\x7a\x3d\xa9\xac\xd0\x0f\xa0\xce\x4b\xf9\x52\xe0\x81\xf1\xb6\x0d\xbf\xbc\xa6\x05\xdf\xf1\xdd\x3a\x90\x6b\x6c\xf6\x45\xc4\xfa\xac\x68\xd0\x49\x11\xfe\xa1\xdc\x19\x61\xff\x32\xf2\x42\x72\x67\xb0\x21\xaa\x6e\x9d\x27\xdc\x00\x32\xc6\x83\x40\x06\x98\x94\x4f\xc8\xcd\x6d\xd4\xf5\x93\x02\xdd\x01\xf6\xc3\x93\x02\x26\x24\x9a\x3a\xd0\x37\xe9\x41\xa3\x04\x5a\x5a\xd7\x28\x96\xc9\x48\xae\x90\xba\xf4\x86\x38\xd5\x3d\x60\x6d\x64\x76\x73\x69\x30\x7b\xc4\x31\x8b\x9f\x80\x9e\xee\x2d\xae\x47\x36\x94\x3d\x12\x1d\x2b\xab\xad\x11\xe2\xa0\x70\x23\x6e\x21\x7d\xc4\xc5\x2a\xcb\x63\x9d\x23\x80\x48\x00\xd1\x54\x24\x9a\xd1\x70\x94\x27\x65\x6d\xbc\xb0\x66\x66\x35\xa5\xe6\x28\xe8\xe2\x6f\x18\xc8\x41\x7d\xd4\x73\xc0\x4d\xa3\x1a\x9b\xa6\x4a\xeb\x07\xd6\xcf\xe0\xe4\x0e\xb3\x0e\x11\xa5\xea\x68\x76\x3d\xe7\x6a\x9b\x8b\x31\xb2\xf5\x5d\x42\xe5\x08\xe8\xe8\x25\xfa\x62\x3c\xc7\xb2\x14\x2e\xcb\x91\x42\x3c\x4a\xbd\x20\x8f\x83\x5f\x39\xf4\x64\x38\xc2\xa5\x80\x5a\xa1\x50\x1c\x8c\x3d\x42\x8f\xc6\x0f\x6f\xca\x5a\x78\xc4\x61\x45\x5d\x6c\xd2\x20\x79\x0c\x0f\xb3\x12\xff\x07\x25\xa4\x0e\xac\x0e\x99\xd5\x8c\xe7\x95\x98\xd3\x23\x0a\x14\xcf\x98\x1d\x75\x82\x85\x84\x54\x85\x26\x29\x13\x7a\x7d\xac\xc5\x62\x5f\x02\xcf\x36\xa4\xfa\xc0\x4c\x65\xef\x50\xee\x7b\x28\xf1\xee\x17\x1f\xeb\xd6\xc6\x88\x56\x3f\x36\x61\x83\x32\xc1\x7b\x5a\x83\xa2\xcc\x2e\xad\x90\x7e\x25\xb5\x7e\x29\x14\x9f\x4c\xe1\xee\x23\xf9\x81\x0f\x5a\xf4\x1c\xda\x87\xb6\x57\xc2\x71\xc6\xd0\xb9\x0a\xc1\x8a\x47\x6f\x84\xd7\x01\xa1\x0f\x00\xf7\x04\xa2\x80\xd5\x90\x69\xb8\x7a\x09\x2b\xd5\x06\x30\x2d\x16\x84\xad\x1e\xda\x33\x4d\xa4\x77\x34\xe3\x0f\xa9\x55\x80\xa2\xed\x9c\x1e\x36\x1a\x03\x3d\xec\xd8\xc5\x3c\x5d\x3c\x90\x48\x11\xa2\x64\xf4\x91\xb3\xfc\x31\xd9\x1b\xbd\x20\xac\xa6\x3c\x7d\x7c\xed\x49\x1c\xeb\xd2\x2d\x9e\x44\xa7\x40\xf6\xc9\x6b\x92\xdd\x01\xf9\x64\x00\x05\xd2\xac\x65\xb5\xd7\x40\xf5\xb1\x6e\xd6\x75\x8b\x50\x21\x7c\x51\xf6\xe1\xa1\x75\x87\x6e\x3e\x5c\x6c\x8e\xe8\x08\x67\x05\x04\x21\x92\x88\x6a\x4b\x92\x39\xb0\x8b\x08\x2c\x7e\xa9\xa4\x7f\x72\x83\xa9\x7b\xb2\x39\x3d\x00\xaf\xce\x43\xc8\xa5\x27\xe4\x1a\x84\xd4\xf3\x0e\x83\x9b\x78\xd1\xf0\x28\x4e\xf8\x10\x44\xbe\x31\x20\x12\x77\x14\x38\x5f\x48\x61\x21\x98\x46\x1f\x98\x89\x8a\x7c\x71\x27\xb0\x1c\x82\xf8\x0b\x45\x9b\xd5\xb6\x5c\x03\x47\xa6\x20\x4d\x27\xcc\x3a\xca\x09\x7a\x48\xa7\x73\x0c\xaa\x4d\xba\x8a\xb8\xc9\x09\x5b\xe4\x3e\x0f\xeb\x83\x51\x07\x9c\xbf\x65\x80\xbe\xe4\x44\x44\xde\x46\x5b\xa7\x79\xcc\xff\x28\xc2\x1a\xce\xc3\xc3\x30\x5e\x19\x6c\xeb\x97\x9d\x66\x42\x0a\x01\xac\xb8\x6a\x30\x53\xbf\xc1\x28\x02\x44\x4e\xf7\xb5\xcd\xd6\x48\xa7\x65\x57\xe5\x0e\x09\xeb\xdd\x31\xee\x9a\x44\x3e\xbb\xb8\x59\x04\xdf\x95\x17\x2b\x85\x21\x82\xb7\x87\x1e\x34\x29\x9d\x4b\xfa\x4f\x11\x1f\xe0\x86\xc1\xd1\x95\xa1\x3e\x13\xd3\x06\x63\xc4\x20\xab\x11\xe9\x75\x74\x67\xea\x13\x41\x7c\xc9\x91\x4c\xef\x7b\x8b\xf6\xc1\xe5\xa1\x2c\x73\x94\x86\xaf\xb2\x1a\x6d\x77\x1f\xf8\x22\x6b\xcf\x03\xee\x76\x67\xb5\x77\x33\xeb\x9e\x69\x15\x20\x8c\xa8\x32\x83\x9f\x05\xac\x3c\x29\x71\x51\x46\xd1\x82\xf8\x7c\x97\x9f\x8f\x81\xcd\x5f\x9c\xbf\xf2\x0f\xf9\xce\x36\x97\xb5\x82\xc5\x9b\xda\x28\x9a\x8e\x3c\xc9\x91\x6c\x72\x1b\x50\xe3\x46\x76\x97\xad\xf6\xc0\xdf\x0e\x7a\x20\x42\x0c\x2a\x0f\xbc\x57\x25\x23\x6d\xb1\xb5\x4f\x4b\x46\xc5\xb4\x75\xce\xe0\x73\x98\xec\x8d\xfe\x68\xcc\xce\xed\x1a\xe0\x86\xa5\x1d\xc8\x70\x69\xc2\x92\x6f\x58\xf4\xb8\x49\x9a\x87\x4a\x53\xe9\xd2\x1a\xd2\x79\x47\x2c\x06\x3f\xba\x25\xc5\xd7\x45\x04\x8b\x3a\x99\x28\x21\x26\xc6\x54\x30\xd7\x76\x60\xa7\x8c\xde\x3d\x1c\x2c\x70\x69\xd3\x3e\xc0\x20\x11\x25\x60\x52\x8a\x4f\x4a\xb1\xe0\x86\x24\x05\xc6\x3e\x7d\xb4\x30\x44\x21\x5b\x02\xc9\xf0\xde\x18\x1e\xde\xc6\x4f\x57\xdd\x2b\x83\x4f\xa0\xf8\xa4\x50\x10\xe0\xe2\x88\xd6\x13\x1b\x88\x05\x50\xdb\x0b\x12\xf6\x6b\x6c\x6f\xf9\x64\xed\xf0\x6e\x58\x99\xe5\xec\xb8\x84\x21\x55\x10\x98\x5a\x20\xe9\x23\x8d\xd9\xd7\x0c\xd5\x4b\xf1\x82\xe0\xc3\xa6\x78\x54\xec\x2d\x6b\xf4\x00\xc0\xa9\x75\xf0\x23\xea\xd2\x93\x48\xe3\xc5\x17\x53\xb8\xa0\xba\xc1\x4f\x73\xd6\x38\xad\xaa\x43\x0b\x5b\x6e\x85\x42\x14\x25\x87\x02\x7e\x9c\x1f\xc3\x81\x81\x35\xa8\x4a\xe1\x7a\xc4\x4f\x21\x1a\xb3\xe3\xfd\xc8\x2c\x2a\x4f\x34\xf4\xa9\x64\x68\xaf\x28\x79\x11\xba\x73\x39\xcf\x55\xfd\x90\x55\x6b\xcf\x78\x77\xdc\x9f\xe4\x40\xd4\xba\xaf\x81\x8f\x71\x93\xae\x30\xb0\xc2\x50\x56\xee\x36\xaf\x17\xe1\x42\x79\x77\x0c\x9d\x0d\x8c\x99\x94\x1b\x05\x6e\x20\xb6\x51\xe2\xc2\xd0\x06\x34\xbd\xbd\x86\xd5\xe3\xf7\x27\x78\x62\xa1\xd2\xad\xbb\xe3\xba\x03\xe9\x1e\x2b\xe6\x28\xe4\xfd\xc8\x4c\xbd\xa1\xcd\x58\x89\xf2\x11\xa5\x43\x49\x88\x15\x46\x73\x9b\x7e\x34\x2a\xd5\xf7\x65\xb9\xd6\x9b\x14\xb4\x6c\x37\x9b\xb2\xaa\x1b\xaa\xab\x5e\xda\x0d\x03\xb3\x8d\x16\x07\x3e\x35\xd7\xab\x03\xde\xb6\xe5\x18\xd4\x88\xc7\x8f\xda\x84\x95\x10\xee\xd6\x9f\xd6\xac\xe5\xbe\x33\x95\xdb\x5b\xa1\x2e\xc9\x8b\x0c\x81\xc6\xe0\xbe\xda\x95\x90\xac\xdb\xc2\x5d\x83\x34\xf2\x37\xfb\x7c\xa0\xd4\x49\x94\x48\x13\x53\x00\x47\x94\xb8\x7f\x91\x30\xaf\xb6\x7f\xdf\x43\xee\xb7\x2c\x29\x03\x93\xf2\x0b\x14\x1f\x59\xc8\xdd\xeb\xee\x7f\x26\xcf\x4f\x83\x0c\x83\x3c\x19\xf1\x62\x1e\x06\x03\x8e\xf8\x0a\x64\xb0\x12\x3d\xdf\x2f\x99\xce\xfe\xe5\x3a\x50\xc6\xfa\xd8\xb5\xf8\xde\xa9\x5f\x11\xad\x81\x43\x67\x87\xdd\x0c\xfe\xb3\xe2\x88\x37\x9a\xc5\x34\x7f\xcd\x7c\xbe\x4f\x4c\x0d\x65\x7c\xa3\xde\x37\x9e\x88\xf3\xd2\x35\x4a\xce\xe3\xe4\x74\xa9\xe7\x10\xb5\x31\xa7\x73\x6c\x5b\x60\x54\x61\x9b\x42\xfa\x86\x34\xc3\x01\xbf\xa8\x6c\x24\x5d\x05\x00\x40\xf7\x0d\x72\xae\x5a\x95\xab\xb1\x5d\x45\xcd\xec\xa0\x36\xac\x04\xae\x51\xce\x0f\xc4\x6a\x39\x6a\x2c\x99\xa6\x29\x6a\x45\xdb\x21\xd6\xdf\x00\xff\xb1\x46\xc6\x4c\x9b\x78\x04\x6a\xe8\x66\x29\x95\x8f\xbc\xb0\x71\x0c\xe3\xdf\xea\xd4\xaa\xf8\xd5\x03\xfd\x76\x5f\x1f\xfb\x3c\xc6\xc4\xa5\x9e\x52\xc0\xfb\xc2\x08\x2a\xbc\x77\x41\xe8\xf5\x89\x63\xa7\x85\x89\x67\xfb\x08\xc6\x92\xd6\x8c\x2a\x8b\xe3\x46\x2f\x41\xfc\x85\x48\x1b\x62\xb0\x87\x51\x1a\x78\x4f\xb6\xda\x7c\xae\x0d\x88\x9e\xa1\x61\x40\x9e\x6b\x78\x0d\x87\x79\x31\x36\x0d\xce\x8e\xfb\x05\x64\x63\xb0\x5b\x18\xe0\x02\xd6\x6c\xe7\xd2\x3c\x94\xfa\xd1\x1d\xe3\x0a\x52\xe2\x8b\x87\xbd\x4d\x04\x82\xa8\x6e\x17\x09\x0b\x4d\x2f\x70\x8d\x44\xd2\x1f\x3c\x5d\x8b\x2e\x83\xe2\x2c\x77\x49\x57\x57\xc2\x67\xfa\x8d\x8d\xa8\xdc\x37\x14\x62\x49\xe4\xab\xf0\x42\x69\x3e\x9b\x6a\x85\xe8\x68\x51\x60\xcb\xb7\x8e\xae\xc1\x96\x51\xf0\xca\x47\x08\x3c\x5b\x39\xcc\x9a\x8a\x67\x0d\x75\x29\x82\x50\xef\xd6\x08\xc6\x70\x56\x68\x2a\x02\x5d\x3a\x82\x58\xbb\xdc\xf6\xa6\x2f\x06\xb0\x7f\xca\x44\x1c\x5d\x34\xfd\xa3\xfc\xf5\xaa\x9b\xbf\x3e\x58\x95\x65\xe5\xa3\xed\xa1\x75\xa2\x2e\xd1\x5d\x7a\x74\x43\x26\xb4\x51\xda\x86\x54\xbc\xb4\xbb\x9a\xbc\x8d\x32\xa9\x76\x2c\xb8\xe3\xae\x7a\x26\x5d\xb7\xbc\x53\x38\x89\x91\xe8\x47\xb2\x28\xf2\x98\x6b\x29\x52\xc6\xe7\xa1\x02\xb2\xbe\xaf\xf0\xa6\x93\x18\x87\x20\x3e\xe3\x06\xef\xd9\xc6\x27\x01\xb6\x96\x68\xd9\x91\xb2\xe1\x87\x9c\x80\x13\x52\x80\x90\xae\x20\x48\x2d\x9e\x82\xbd\x1d\x1f\x32\x38\xee\x80\x6e\x29\xf2\x08\x9c\x59\x65\x4a\x54\xe8\x93\x97\x63\xa4\x96\x31\x76\x28\xb3\x0f\x83\x3e\x89\xee\x29\x2a\x27\x65\x18\x17\x23\xe1\x0a\xf2\x43\x83\x7a\xed\xb4\x58\x51\x78\x9c\x3f\x43\x62\x5a\x70\x44\x87\x99\xe2\xbd\x9f\x55\x95\x81\x16\x70\x1c\x95\x32\xd6\xbb\x43\xa2\x6c\xf9\xa5\x9d\x8d\x22\x98\x79\x2e\xd9\x8e\xd0\xf1\x6f\xd4\xab\xd3\x3e\x85\x86\xd1\xe9\x43\x6f\x65\xb8\x1c\xdd\x43\x32\x88\x42\x6c\xf6\x79\x30\xe9\x9c\x6b\x87\xf5\x26\xf5\x11\x11\x87\x15\x2d\x40\x94\xd1\x48\x63\x77\x8f\x31\x93\xc2\xf7\xfe\xe1\xe9\xfb\x6d\x73\xb3\x8b\xd8\x56\x15\x67\xe4\x54\x06\xb2\x90\x6e\x6f\xf2\xad\xe2\x65\xff\xc9\xa2\x32\x0c\x19\xb5\x7d\x64\xe5\x89\x32\xcf\xa0\x39\x2f\x89\x4c\xad\xe3\x6e\xe2\x6b\xa8\xb2\x3a\x84\xcd\xfd\x95\x3b\x2a\x98\x52\xc7\x8a\xb6\x88\xe2\x32\x54\x07\x3e\x1b\x14\x3e\xd6\x40\x2c\xd5\x44\x1b\xc6\x4c\x0a\x19\x64\x59\x29\x11\x1f\x30\x93\x45\x6d\x2a\x7f\xff\x18\x6f\x5a\x66\x5e\x0e\x5a\xe6\x45\xe1\xf0\x72\x0a\x77\x43\xaf\x0b\x0b\xb3\x86\x52\x84\x22\x1b\x8f\xea\xac\xb4\xf9\xfc\xb7\xa4\xe2\x66\xfc\x80\x56\x78\x8d\x1d\x23\xe7\x37\xe0\xc3\xb4\x4d\xeb\xcc\x12\x0f\x74\x4c\xf4\x1e\x03\x0e\x1b\xcf\x4a\xc0\xab\x0f\x45\xec\xf2\x82\x14\x82\x5d\xdb\x9d\x81\xf0\x79\x47\x83\x42\x1c\x00\x37\x65\x18\x1a\xac\xed\x1a\xc6\x8b\x5c\x50\x9b\x36\x72\xc6\x8d\x0b\x77\xe4\xd8\x2c\xf7\x20\x50\x21\xa1\x96\x78\xa6\xf3\x6b\x79\x17\x2c\x0f\xc4\xf5\x8a\x31\x41\x77\xdc\x55\x51\x68\xdd\xdd\xe3\x85\x00\x4b\x67\x12\xe9\xca\x27\x91\x48\x9a\x14\x93\xdc\x99\xdb\xf6\x65\xce\x22\xc1\xb0\x5b\x55\xda\x0a\x53\x37\xdb\x4e\x97\x5b\xbc\x16\x40\xf5\x92\xf5\xc1\x41\x79\x4e\xaa\xc6\xe5\xd3\x27\x7c\x73\x0f\x2f\x78\xaa\xb1\xed\xb1\x40\x7a\x0d\x77\x4b\x54\xcd\x3a\x58\x70\x24\xdb\x29\x7b\x6f\x4b\x38\xc5\x2d\xc5\x2e\x69\x6e\x3c\x35\x01\x3b\x10\x49\x94\xa3\xfa\x92\xb4\x9c\xa8\x5c\x45\x4c\x08\x8d\x4d\x94\x1a\x93\x6c\xf9\x6c\xb2\x7e\x42\x46\x18\xf2\xce\x61\xd3\xca\xad\xe9\x5a\x06\xd7\xcf\x38\xeb\x01\x40\xe0\x67\x06\x0f\x7e\xe3\x95\x52\x69\xc3\x8a\x94\x2d\x46\x2f\x32\x1b\x19\xf6\xc8\xef\x96\x36\x81\xa3\x5d\x18\x63\xa1\xe2\xb1\xe6\x42\x69\x8c\xa3\xdc\x87\xad\x0d\x8f\x8b\x4d\xc6\x55\x09\x4c\x5f\xed\xdd\x1f\x95\xf1\x40\x6c\xed\x76\x08\x84\x97\x8a\x9a\xef\x84\x98\x11\xc1\x6b\x93\xd8\x0b\xe5\xbe\x8e\xbb\x01\x20\x55\xe5\xbf\xe1\x5e\x81\xa1\xa1\x70\x24\xc1\xfc\xd5\x0f\x95\xb1\x0f\x65\xbe\x0e\x68\x3d\x0c\x6c\x50\x73\x08\x3d\x0d\xf9\x63\x80\x86\xfb\xda\xb4\x3c\x7d\x44\x8b\x8a\x81\xeb\x42\xe2\x3c\x71\x0e\x20\x6e\x5d\xec\xb7\xa6\x82\x30\xa1\xbb\x42\x6d\x4d\x0d\xe2\x21\x10\x41\xc1\x4a\xd5\x7d\x65\x74\x9e\x1e\xdc\x36\x82\x13\x1c\xed\xa5\x17\x46\xb7\x5b\x77\xd8\x6f\xd3\x55\x55\x5a\xf1\x8b\xac\x00\x4a\xea\x90\x2f\x3b\x71\xf7\x81\x1c\x8a\xd5\x9c\x99\x30\x16\x24\x46\x73\x53\xdc\xd7\x08\xac\xa6\x58\x8a\x08\x7e\xcb\x06\x3b\x27\xa0\x90\xe1\xf9\xe8\x66\xa3\x18\xa7\x9b\x91\x4a\xd0\x3d\xcc\x4f\x6b\x1d\x0c\xf4\xc9\x48\xd4\xfd\x46\x99\x2b\xe7\x70\xc0\x0b\x31\x32\x0d\x99\x13\xde\x87\xcd\x4d\x0b\x89\x7e\xbc\xc0\x8b\x12\x49\xbf\x75\xdc\x05\xde\x8b\xf9\x24\xd1\xd2\x78\xda\x1a\x74\x95\xb5\xaa\x27\x57\xfc\x13\xa1\xcc\x9f\x50\x8d\x43\x6c\x50\x15\x75\xd8\x87\x02\x72\x5b\x76\x76\x23\xc0\x9f\x09\xcb\xe7\x13\x2e\xb8\xb2\xd5\x3a\xab\xcc\xaa\x26\x6a\x83\x38\x5f\x81\xe5\xba\x50\xc4\x3a\x84\xe0\x19\xaa\x89\x08\x24\x42\xd0\x50\xc6\x80\xab\x17\x46\x46\x2e\x5a\x38\x52\xf8\x44\x61\x93\xa2\xbe\xd4\x1e\x23\xea\x11\x38\x68\xe9\x42\x26\xba\x7e\xc4\xba\xb6\xe4\xdc\xc2\x10\xd1\x28\xf3\x08\x0b\x36\xef\x26\xf9\x47\x98\x09\xc2\xdc\x44\x29\xad\x66\x56\x10\x9c\x34\xf0\x8f\x4c\xf5\x9d\xd5\xe5\x23\xd4\x5a\x28\xc4\x47\x3b\x97\xdc\xdd\xf7\xef\xb3\xc2\xa0\xd7\x02\x46\xd8\x2c\xf7\xf7\x80\x6b\x6b\x07\xb8\x39\x23\xe0\x31\xe9\x2d\xf6\x11\x18\xa8\x90\x15\x89\x62\xba\x8d\x3c\x91\xca\x28\xfb\x87\x88\x42\x2f\x0e\x2a\x87\x99\x23\x38\x40\xaf\xf5\xc4\xa9\x12\x9a\x45\xe1\xb1\xee\x44\x87\xc7\x1e\x43\x83\xd6\x7b\x74\xd5\x60\xfd\x42\x8c\x2d\xb3\xbb\x3c\x3d\xb8\x65\xdc\x60\xad\x11\xf0\x76\xa9\x6f\xd4\xca\xf2\xf0\x98\xfb\xf6\x6f\xcb\xe2\x5e\x51\x69\xb2\x85\xf0\x23\xc6\xd2\xe0\x7e\x09\x29\x1b\x5c\xe3\x92\x69\x2c\x90\x22\x75\xf4\x80\x90\xdc\xbe\x39\xeb\x92\x75\x90\x65\x5d\x06\x92\x41\x0c\x23\x82\x85\xd8\xc9\xea\x76\xdd\x8f\xf1\x2d\xa8\xc8\x30\x84\xa4\x21\xa3\x6a\x3d\xfd\x14\x03\x9d\x1e\x4d\x65\xfc\xec\xfa\xb7\x23\xec\x41\x1d\xf7\xfd\xbb\xdd\xfd\x3e\xe4\xb1\xda\x76\x2e\xf2\x85\xa4\x63\x18\x6d\xba\x76\x97\x5b\x9d\x7c\x6a\xef\xc3\xc4\x49\xf3\x48\xe8\x81\xc8\xef\x16\xb1\x03\x98\x42\xa8\xc1\x11\x40\x7c\xb9\x9e\xe1\x24\xe2\x1a\x07\x69\x46\x7c\xc8\x55\xf4\x2a\x58\x15\xd5\x95\xac\x18\xe8\x13\x2c\xaa\x23\x40\x7e\x59\xae\xe3\x86\x40\x48\x8e\x27\x05\x07\x01\xf3\xc7\x0a\x22\x5c\x9e\x3e\x8e\x92\x37\x59\x33\x0a\x45\xa8\xf7\xc2\xb8\x33\x19\xef\x58\xce\xff\x21\x8d\x3d\xae\xb1\xc0\x33\x44\x86\xab\x83\x8a\x73\x68\xb3\x78\x9d\x3b\xc0\x96\xc7\x17\x68\xea\x03\x7c\x70\xa1\x4a\xf4\xa7\x34\xcf\xd0\x43\xf1\x1c\x28\x20\xd2\xa0\x0f\x26\xad\x6c\xa2\xea\x32\xd4\xc8\x40\xfc\x15\xf7\x11\x10\x88\x30\x5d\x77\x10\xac\xc9\x0a\x11\xd0\xd7\x3f\xa5\x09\x1f\x11\x58\x7b\x43\x79\xa6\xa2\x04\xc6\x3e\x74\x85\x71\xe8\x90\x4b\x9c\x92\x1b\xfe\x54\x6f\xb0\x7e\xaf\x20\xd1\xd4\x19\xba\xa5\x85\xfb\x9b\xef\x98\x98\x31\x7d\xfa\x6e\x89\x17\xe4\xd0\xd9\x30\x00\x9e\x0f\x07\x46\x08\x1e\x89\x79\xb1\x5f\x4d\xe5\x23\x45\x7e\xe1\x40\x68\x89\x84\xcf\x3d\x03\x59\xa4\x37\x63\xe5\xe8\x02\xf7\x9d\x2c\x93\xe3\xef\x5a\x2e\x00\xc0\xc7\xa6\x1c\x81\xb9\x24\x92\x26\xbf\xd6\x23\x55\xb3\x18\xe5\xf2\xa4\xbb\x0f\xe1\x3e\x2f\x88\x53\x1c\xd0\xb7\x04\xde\xfd\x06\x1a\x1f\x0a\xd2\x28\x40\xc0\x1c\xf2\x6c\x78\x25\x03\x8f\x1b\xfe\xac\x16\xd0\x6a\x30\xd9\x8c\xd4\xf3\x8e\x46\xd2\x72\xed\xa5\x41\x73\xef\x02\xc9\x4b\xd1\x34\x44\xd0\x87\x00\x51\xb5\x05\x37\x52\x7e\xed\x24\x2b\x18\xc5\xc4\x54\x37\x15\x31\xe0\x03\x35\x50\x5f\x72\xe3\xfc\x0d\x02\xd3\xdb\x5d\x59\x40\x02\xe7\x84\x76\x63\x95\xe8\x8f\xa6\x2a\x4c\x2e\x48\xfb\xbc\x1e\x3b\x26\xea\x9c\x41\xb1\x07\x5b\x9b\x2d\x92\xc4\x64\xab\x87\xc6\x30\xe8\x6a\x5f\x80\x28\x38\x4b\x62\xd6\xe1\x55\xfe\x2e\xb1\xf2\x65\x27\x2a\xfe\xb6\xbb\x19\xa0\x04\xd7\x43\xba\xdb\x99\x42\x80\x58\x65\x38\x03\xeb\x6b\xd7\xd9\xaa\xe6\xbb\x25\x93\x9d\x8b\x62\xc1\x72\xa3\x30\x22\x29\xea\x4c\x9a\x38\x5f\xca\xed\xf8\x21\x8d\xb9\x85\x7c\x9f\x35\xf6\x79\xa0\xe6\xac\xb5\xcb\xef\xc7\xa0\x78\x5a\x58\x0e\xa0\x32\xfa\x7b\x59\xe2\x70\x6f\x7d\x66\x3b\xf8\x80\x44\xbc\x83\x9a\xa9\xcd\x7b\x79\x9c\x1a\x42\x4e\x11\x0e\x00\x62\x98\xc7\xb3\xad\x60\x2a\x35\x02\x2d\x3f\x85\xe9\xb1\xd9\xda\x9c\x2e\x0f\xa7\xee\xff\xe1\xe5\xac\x27\x9c\x37\x5a\x26\x79\x69\x3a\x5e\x26\xc0\x4f\x7a\x79\x50\x6d\xa5\xc8\x26\xda\x41\xd4\x0a\x78\x34\x59\x5b\x70\x82\x93\x65\xea\xa8\x0d\xec\xec\x55\x5a\xac\xfd\x1a\x3d\xd2\x62\xe7\x32\x06\xc6\x38\x5f\xf2\xfe\x04\x67\x1d\x39\x45\x8f\xe5\x13\x8e\x51\xb3\x4f\x7c\x06\x49\x0f\x16\x4c\x66\x1b\xc5\xec\x9d\x8c\x7d\x11\xaa\x28\xe0\xdb\x8d\x6a\x68\xd9\x0b\x82\xe8\x76\x78\x41\xea\x88\xea\x55\x7c\x95\x41\x1c\xc7\xbb\xe3\xfe\x77\x67\xa7\x98\x2f\x2c\x5d\x11\x8b\x26\x45\x3f\x54\x56\x3f\x9b\x8b\x84\xa4\xdf\xe7\x5d\x4e\xf7\x1b\xcf\x29\xb5\xc9\x68\x4b\xf8\xed\xe6\xec\x8a\x18\x0b\x69\xc4\xfd\x10\x22\xc9\xcb\x97\xc9\x47\x82\x97\xe4\x3a\xd5\xa5\x24\xc9\x17\x09\x2f\x24\xa9\x3b\x84\x24\x8f\x89\x48\xb2\x7c\x64\x58\x4f\x75\xa9\xfe\xb1\x86\x44\x9a\x92\xea\x29\x4d\x49\xfd\xb5\x9a\x92\xea\xa8\xa6\xa4\xfe\x4a\x4d\x49\xf5\xb4\xa6\xa4\xfe\x2d\x9a\x92\xbf\xe0\x74\x72\x8c\x59\xb2\xc1\x3a\x0f\x65\x57\x37\x53\x6d\x59\x81\x34\x91\xa2\x02\x03\x82\xc1\x2a\x3a\x76\x8b\x12\x0f\x4c\x28\x05\x05\x62\x7b\xb4\xce\x71\x1d\x2c\xb9\xd9\xad\x59\x51\x02\x00\x16\xab\x84\x73\x16\x1f\x31\x10\x29\xef\xad\x0a\xf6\xd3\x43\xb6\xcc\x6a\x1f\xe1\xe2\xf2\x7c\xc6\x0e\xb4\x7b\x13\xe1\x44\x96\x87\xb8\xec\xac\x41\xe7\x1b\x96\xec\x09\xa1\xd2\x8e\xe7\x72\x13\xe2\xf9\x5c\x23\xb9\x2a\x2c\x18\x7c\x3d\x91\x5b\xc7\x5a\xee\x35\x24\x41\xdd\xd5\x90\x25\x7e\x3d\xf2\xe1\x0b\x0b\x3e\xb0\xc5\xbe\xf9\x4d\x14\xb7\xc8\x7a\xbb\xa6\x22\x17\xed\x0b\x02\xdd\x03\x69\x30\x02\x2d\x9f\x4a\x69\x3d\xdd\x61\x4c\xcd\x73\x59\x6f\x63\xeb\xd0\xb2\xb7\x10\xbf\x94\x6a\x2c\xb2\x08\x17\xff\xe2\x5c\xd1\x76\x79\xb4\xd8\xc2\x3a\xae\x92\xf6\xc7\xea\x1e\x6f\x79\x5e\x3c\xbc\x4b\x06\x33\x36\x5c\xd9\x16\x80\x4c\x50\xdc\xbb\xaf\x58\x12\x5f\xb8\x2e\x85\x8e\x3a\x65\xbf\x53\x0c\x44\x60\xb3\x48\x46\x80\x75\x12\x1f\x00\x5f\xde\xdc\x4f\x44\x59\x40\xe9\x53\x53\x6c\xca\x6a\x45\x6c\xc9\xb4\x0b\x29\x24\x22\x32\x3e\xad\xd4\xb3\x3a\x3b\x1b\xe8\xf1\x86\xdc\xd9\x55\x59\x60\xfa\x94\x60\xa3\x7a\x55\xee\xab\x5a\xff\x6d\xbf\xbe\x67\x6d\xfd\x34\xcf\x05\x70\x81\xea\x73\xb3\x62\xe3\xee\x2c\xe0\xbf\x29\xe4\x2b\x10\xa7\x1d\x95\x7a\x9e\x60\x65\xee\x36\x23\x42\x1a\xfe\xae\xb5\x7b\x63\xfb\x49\x24\xc7\x54\x19\x1a\x46\x40\x53\xb8\x45\x74\xc2\x61\xc1\xe5\x81\x5a\x05\x6c\x6a\x89\x0e\xd2\xce\x92\x3a\xb6\x1f\xb2\x51\xe8\xcb\xc1\xee\x17\xaf\x68\xe1\x62\x20\xce\x48\x5b\xda\x7c\x5e\x39\x37\xcf\xbd\x57\x08\xf3\x8b\xef\xaa\x56\x04\x49\x78\x88\xd2\x43\xe2\x6a\x10\xcc\xde\x39\x37\x6d\xbb\xcf\xeb\xb4\x30\x08\x24\x06\x1c\x4b\xb9\xcc\xb3\xfb\x54\x92\xdf\xb7\x20\xbd\x61\x30\x77\xa6\xaa\xf1\x74\x17\x5f\xa3\x50\x76\x6a\x55\x3c\x87\x07\xb1\x2c\x8f\xec\x41\xaa\x90\xd6\x4d\xaa\x8a\x54\xc5\xf5\xdf\x54\x6c\x08\x91\x7f\x0c\x32\x56\xe5\x21\xcd\xeb\x03\xd6\x24\x56\xa6\xcb\xb1\x63\xcb\x86\xa4\xb8\x04\xae\x72\xa7\x16\x63\xaf\x09\x9d\xeb\x63\xba\xce\x2c\x17\xfe\x5f\xcc\x1b\x0f\x4c\xe9\x1c\xac\x47\xe4\x3b\x11\xf6\xb8\xa5\x90\xaf\xfd\xe8\x82\x5f\xee\xe3\x86\xf2\xa0\x63\x91\x02\x08\x50\x6c\x2a\x77\x6a\x31\x4e\x08\xef\x76\x4f\x34\x9f\x54\xbb\x9b\xe9\x4b\x81\x54\xca\xac\x7e\x30\xf9\x5a\x67\x05\x06\x25\x40\x8e\x09\x77\xa4\x41\x90\x1f\x4c\x6b\x5a\x1c\x94\x50\xef\x5d\x65\xd5\x6a\xbf\xb5\x60\xbb\xf1\xde\xb8\x4c\xf3\x60\xc8\x8d\x7c\xbc\x2c\xac\x04\x38\x0d\x22\xd9\xe4\xa7\x02\x1e\xaf\xf3\x0b\x00\x06\x40\x10\x87\x78\xaf\xc5\x4b\x99\x00\x63\x31\x10\xb3\x03\x8d\x95\x15\x10\x95\x22\xca\x15\xde\xf4\xa2\x50\x1f\xd0\xce\xe1\x5e\x66\xaa\xfa\x40\xb8\x2a\x00\x72\x31\x6f\x0b\xa3\xb8\x60\xb0\xdc\x65\xdc\x6b\x55\xad\x1e\xe8\x93\x6f\x54\xf4\xf2\x07\x12\xa8\xb4\xae\x77\xa2\x85\x82\x73\xa3\x26\x74\xd7\x7d\x45\x4f\xac\xa9\xfc\x53\x75\x93\x66\xd2\x4d\xd7\x03\xef\x32\xb7\xf4\x9d\x1d\xc1\x73\xbe\x51\x85\xbe\xab\x9c\x4b\x00\xe3\x75\x0d\xfd\x45\x26\xfc\xc0\x5d\x00\xa4\x93\xe5\x1e\xf3\x3b\x41\xaa\x8e\xc2\xb6\x8f\xd9\xda\x68\xe0\x4b\x95\xb5\x64\x4a\x5e\xf2\xbd\x48\x02\x08\x29\x63\xe3\x32\x0c\x0a\xe2\x9a\x28\x90\xdf\xd1\xd6\xbe\x72\x4f\x06\xf8\xd3\x9a\xee\xee\x6f\x28\x1f\xb5\xdf\xf1\xcb\xb1\x0a\xef\xfb\x75\x59\xe0\xf0\x13\xe7\x52\xb6\xd1\x70\x4e\x6a\xfb\x00\x2b\xc6\x39\x83\x58\x0f\xaf\x22\x0b\x46\x83\xc7\xed\x0b\xa6\x88\x1a\x89\xc5\x9a\xbe\xc4\x8e\x8c\x20\x9a\x6f\x8c\xff\x60\xd6\x82\x11\x36\x47\x56\x35\x71\x7d\x97\xf0\x96\xfc\x40\x4c\x10\x8f\x14\x17\x59\x9a\x1c\x6b\x68\x31\x11\x99\xaa\xc6\x51\x85\x27\xaa\xad\x3b\x40\xde\x67\x2f\x7d\x88\xbf\x59\xfb\xf3\x3d\xd1\x1f\x35\x0b\x5f\xac\x28\xca\x71\x93\x40\x7c\x0b\x6a\x55\xee\xdd\xe4\x1a\x2f\x7c\xbd\xf4\x2b\x5f\x97\x74\x34\x51\xf4\x5f\xd6\x3c\xd9\x24\x76\x49\x02\xa5\x29\x15\x4c\x3a\x93\x08\xd7\xff\xb8\x08\xa6\xe3\x30\x80\x64\xd5\x7a\x8d\xb1\x05\xb7\x04\xb2\x5a\xdf\x9b\x12\xe8\x3a\x9d\x57\x14\xdf\xaf\x45\xad\x99\xf9\xcc\x71\x79\xb4\xc2\xbe\x2b\x21\x50\x1d\x7d\x35\xb3\x2a\xd0\xc7\x61\xb1\x11\x22\xde\xb7\x25\xa0\x2f\x78\x20\xd0\x6c\xec\x2d\xbd\xc0\xac\x07\x7a\x5c\xd0\x4e\x4e\xf1\x5c\x0d\xe8\x40\x59\x76\xcd\xc1\x1d\xdf\xc2\xd4\xba\x25\xc9\x41\x5e\x8a\x3a\x2f\xcb\x75\x47\xbe\x43\x9d\x91\x8c\xe2\x17\x69\xd1\xb3\x0c\x3d\x4d\x78\x24\x23\x4f\xd5\x4f\xcf\x54\xb6\x7f\xb1\x22\xbd\x0a\x8a\xf4\xfa\x77\x51\xa4\x57\xee\x15\x9d\x8a\xf4\x0d\xbd\xf9\xaf\x15\x98\x0f\x1e\x2e\xeb\xcb\xab\xe7\x84\xd2\x59\x93\x47\x8a\xc7\xc3\xee\xef\xb5\x25\xe6\x13\xf5\xe5\xa2\xf2\xcd\xbb\x48\x43\x54\x9e\x1e\xa9\x8e\x49\xc9\x7f\xb1\x7a\xb7\xd7\x8a\x8f\x8a\xd2\x62\xa9\x78\xb6\xf7\xf1\x48\x34\x25\xe2\xb5\x90\x88\x57\x0d\x89\xf8\x67\x15\xe1\xd5\xd9\x0f\xde\x63\x64\x4c\xa1\xd8\x17\xe0\xab\xb7\x92\xff\x80\x27\x44\xb3\x1b\x71\x40\x28\x84\x73\x47\x5b\xb7\xe9\x48\x17\x10\x87\xa9\xe1\xaa\xc0\xb1\x20\x40\x82\x57\x19\xd2\xa0\x85\x43\x42\x11\xab\x9a\x73\xe0\x05\xcf\x2d\x78\x87\x81\x31\x88\x8f\x4c\x69\xec\xba\xba\xad\x24\xaf\x65\xf4\xb6\xa3\x02\xeb\x40\xe8\x57\x6e\x8d\xdb\x64\x16\xcf\x04\x1f\x5b\xb7\x8a\xe1\x28\x40\xda\x07\xe7\x98\x45\x66\x78\x94\xdd\xb8\xdf\x43\x74\x87\x9a\x52\x3f\x96\xfa\xbe\x84\x3c\xc4\x46\x12\x49\x04\xbf\xc0\xf3\x5e\x38\xe7\xb4\x21\x6a\xc4\x6c\x13\xb1\x38\x2f\xba\x1c\xdb\xd2\x7b\x1c\x44\xe3\x41\xd9\x73\x3a\x4b\xfc\x57\x90\x89\x3a\xcf\x0f\x48\xa8\x3e\x99\x32\x63\xef\x9d\x52\x67\x3f\x0e\xf4\xdb\x11\x28\x2b\x02\xa7\x2f\x33\x8b\x8e\xe7\xcc\x26\x7a\xa1\x2f\x67\x23\x10\x38\x3c\x7f\x3f\x9c\xbd\x1b\x01\xf7\x2f\xea\x73\x8a\x27\xe9\xcb\xe9\x4c\x89\x07\x24\x7a\x31\x85\x07\x8e\xfe\xba\x18\x4d\x16\xfa\x66\x34\xbb\x1e\x2f\x16\xa8\xe5\x39\xbc\xb9\xb9\x1a\x9f\x83\x68\xe5\xd5\xf0\xc3\x40\x8f\xfe\x7a\x3e\xba\x59\xe8\x0f\xef\x47\x93\xa0\xba\xa8\xe6\x8b\xa1\xfb\xfc\x78\xa2\x3f\xcc\xc6\x8b\xf1\xe4\x1d\x3c\xef\x7c\x7a\x73\x37\x1b\xbf\x7b\xbf\xd0\xef\xa7\x57\x17\xa3\x19\x70\x12\x7c\xcf\x72\x8d\xc8\x2d\x3c\xf2\xf4\xc7\xb2\x4f\x8a\x99\x90\x99\xcf\xd8\xb7\x7d\x7a\x09\x8c\xc8\x7f\x19\x4f\x2e\x12\x3d\x1a\xc3\x83\xba\x44\x43\xa5\x52\xa8\xea\xd2\xc3\xfc\x4d\x4a\xa1\xea\x09\x56\x64\x37\x80\x93\xc5\x78\x36\xd2\xb3\xf1\xfc\x2f\x7a\x38\xe7\x61\xfd\xb7\xdb\xa1\x7f\xce\xcd\x68\x76\x39\x9d\x5d\x0f\x27\xe7\x23\x45\x2a\x93\x62\x1a\x5d\x6f\xf5\xdd\xf4\x76\xa0\xe7\xef\xa7\xb7\x57\x17\xd1\xdf\xdd\x30\x8d\xf4\xc5\xe8\x72\x74\xbe\x18\xff\x3a\x4a\xdc\x07\xf5\x70\x3e\xbf\xbd\x1e\x29\x1c\xed\x39\xc8\x5c\x0e\xaf\xae\xf4\x64\x74\x3e\x9a\xcf\xdd\xb7\x50\xd3\x13\x48\x1f\x66\xa3\x9b\xe1\x78\x86\x0a\xa2\xb3\x99\x7b\xca\x74\xe2\x8c\xcb\x4f\xb1\xae\xe9\xed\xe4\x6a\x34\x9f\xeb\xd9\xe8\xdf\x6e\xc7\xb3\xae\x45\xe0\x9e\x30\x7c\x37\x1b\xc1\x40\x8a\x39\x57\x1f\xc6\x57\x57\x30\x3b\xcd\x89\x07\xf5\x50\xf7\x87\x30\xf1\x77\xfa\xc3\xfb\xa9\xbe\x1e\xde\x21\xf5\xc4\x1d\x2f\x8d\xd9\xc8\x73\x53\x8c\xe4\x22\x75\xe3\x19\x16\xe6\xf0\xed\xd4\x8d\x40\x10\x54\x5d\x4c\x61\x38\xdc\xf4\x90\x20\xaa\x58\x00\xee\xd5\x8a\xf8\x77\x85\xaa\x6a\x90\x5a\x6d\xa9\xaa\xf2\x43\xbc\x9a\x68\x90\x10\xd5\xb7\xf3\x91\x72\xeb\x6c\xc2\xeb\x63\x31\xd5\xcd\x2d\x29\x84\x4a\xdb\x6b\xcf\xab\xab\x5e\x0c\x17\x43\x05\x2d\x5e\x0c\xf5\xdb\x91\xfb\xf4\x6c\x34\xb9\x18\xcd\x60\x2b\x0d\xcf\xcf\x6f\x67\xc3\x05\xe8\x9b\xba\x6f\x8c\xe6\x7a\x7e\x3b\x5f\x0c\xc7\x13\x9c\x14\xd7\xdf\xe9\x4c\x2f\xde\x8f\x67\x17\xbc\x97\x14\x2c\xcf\xcb\xe1\xf8\xea\x76\x36\xd2\x8d\x05\xb6\x98\xea\xe9\xcd\x08\x1e\x09\x0b\x2d\x4c\x08\x2b\xa1\xf6\x83\x14\xea\xfc\xf6\xfc\xbd\xc2\xd9\xd3\xd1\x8e\xbd\xd3\xef\x87\x73\xfd\x76\x34\x9a\x7c\xb9\x5c\xea\x7c\xa0\x46\x13\xfc\x5c\x07\x35\x09\x00\x5b\x9d\x9d\x1f\xc2\xad\x13\xe3\xa9\x0b\x38\xe7\xeb\x52\xdf\x39\xbb\x3a\x31\x8f\x74\xb0\x39\xb7\x43\xd1\x59\x48\xa4\x35\x58\x09\x11\x33\x62\x09\x4e\x53\xba\x00\xd0\xf1\x78\x8f\x10\xd8\xda\x53\xb2\xa8\xbd\xf5\x87\x0c\x5e\xe1\x80\x63\x0e\x40\x09\x5b\x03\x54\xff\x1f\x89\xc2\x38\xb6\xee\x11\x97\xa1\xbb\xc4\xa8\x28\x6c\x19\xa8\x79\x03\x43\x2d\xc4\x56\xe1\x0a\x80\x8e\xb2\x7b\x6e\x23\x0e\x42\xe2\xcd\x82\x4f\xf2\xa4\xac\x12\x0d\x85\x28\x45\x8a\x4c\x54\x49\x77\xa1\xea\x51\x8e\x2b\x76\xa6\xfb\x48\xb4\xea\x8b\x6b\xf8\x15\x89\x4e\xeb\x3a\xa5\xdc\x6d\x70\xb7\x7c\xb9\x4b\x44\x8b\xc9\x04\xcc\x36\xdd\x18\x5b\xc3\xf1\xef\xbf\xbc\xe5\xcf\xda\x9a\x40\xb1\x00\xe2\x62\xdd\xb0\x0c\xf1\x1e\xc0\x92\x25\x89\xb5\x80\xf5\xe4\x40\xb9\xdf\x55\xbe\x67\xea\xe7\xb8\x00\x1d\x1e\x85\x3a\x54\xa8\x20\x89\x00\x81\x80\xe4\x30\xba\xe7\xfd\x8b\x9e\x02\x60\x27\xde\x34\x77\x25\x5c\xac\x50\xf2\xc1\x90\x9a\x01\xe4\x1f\x58\xed\xca\xea\x8d\xf3\x28\x06\x4a\xb9\xb9\x84\xaf\x4a\x30\x48\xee\xe9\x01\x48\xee\x08\xae\x53\xd9\xda\xa4\x58\xaf\x86\x3c\x3f\xc4\x40\x10\x73\x77\x1f\xdc\x9d\x94\x65\x08\xc8\x65\x62\xbe\x3d\x7f\x77\x8c\x16\xd6\x1b\x5f\x7c\xd3\x54\x78\x8b\xa9\x39\x59\xf2\x4d\xb5\x96\xc1\xf3\xdc\x80\x50\x50\xd8\xe5\x80\xaa\x4e\x17\x2b\x10\xa2\xc4\xc5\x45\x3e\x14\x5a\x56\xfa\x24\xae\xcb\xef\xab\x96\xdf\x3d\x68\x77\x5c\x86\x33\xe8\xfe\x06\x7c\x55\x4c\x9d\xc4\x7e\x1a\x56\xd6\xe0\xfd\x87\x5c\x02\x85\xea\xce\xe8\x16\xbc\xf1\xf0\x65\xc2\x4c\x43\x34\x18\xea\x67\x3d\x33\x40\xb9\x69\x9d\xec\x65\xf5\x05\x07\xfb\xdc\x98\x2f\x1d\x55\x24\x0f\xaf\x8c\xc2\x5b\x19\x23\x1d\xe5\x7a\xed\x06\xc1\x7c\xc1\xc3\x55\x54\x56\x11\x86\xf1\x8d\xbb\x03\x17\x65\xfd\x85\xfe\x32\xd2\xc5\x27\xbf\x95\x2e\x9e\x48\x60\x21\xa2\x90\x15\x9b\xb2\xda\x52\x44\xc9\x13\x9f\x01\xd6\x0c\x69\x9c\xdd\xc2\x32\xb9\x59\xd5\x55\x59\x64\x2b\xa2\x61\xdd\xa1\xd8\x6a\x1e\x8f\x0d\xc0\x69\xef\x0d\x2d\x21\xb3\xdd\xe5\xe5\xc1\x54\xfa\x84\x4b\xcc\x7c\xf9\x30\x5d\x63\xb6\xa6\xea\x6b\x26\xfa\xb6\xee\x8e\x95\x27\x2a\x83\xcb\x5e\x02\xd1\xf3\xec\x1e\x10\xfe\x01\x5b\x19\x68\x33\x7a\x41\x30\xc4\xf3\x2d\x6e\x3c\x38\xed\x30\xd0\xef\x4d\x05\x75\x08\xa9\xb6\x10\xde\x7e\x83\xe6\x17\xbe\x02\xba\x4b\xaf\x5d\xdb\x0f\xe5\xfa\x50\x18\x1a\x4f\xc8\xb8\x2c\x0f\xfe\x2d\x48\x82\x13\xde\x0e\x06\xc8\x00\xf0\x53\x49\x1e\x68\xfd\xef\x97\x55\xb9\xfc\x4e\x9f\x84\xa2\x74\x68\xdc\xa3\xc1\x53\xe7\x63\x51\x2e\x6d\x9f\x63\x1c\x4a\x2d\x0f\xfa\xcf\x20\xa4\x36\x4b\x8b\x75\xb9\xd5\xef\xd3\xd5\x47\x20\x03\x44\x90\xd7\xbe\x02\x3b\xb3\x38\xe8\xf3\xd2\x4d\xe0\x99\x1e\xee\xaa\x2c\xd7\x67\xbf\xfc\xf2\x42\x29\xff\xeb\x9b\xca\xd8\x8c\x2b\xd6\x7f\xcd\x56\x40\x82\x9f\xd6\xdf\x79\xea\x1e\x64\xe1\x85\xfb\xfa\xff\xf9\x4d\xe7\xe3\x37\xff\x0c\xbe\x7f\x5b\x96\x75\x5e\xa6\x6b\x53\x9d\xfa\x5b\xe9\xef\x2b\x00\xf2\xb4\xfe\xc7\x8b\x17\x3f\xff\xfc\xa2\xa9\xff\xf1\xf3\xd9\x37\xfd\xef\x3f\xe4\x27\xcc\xbe\x1e\xf9\xc2\x82\xa8\xba\xdb\x7b\x9e\xa2\xba\x9e\x0e\xc2\xa7\xca\x84\x43\xfc\x05\x83\x78\x04\xd7\xe0\x5c\x69\x0c\x6d\x80\x8c\x75\xe9\xac\xea\x12\x00\x1f\x54\x06\xb7\x0c\x8d\xc3\x58\x04\x92\x98\x31\x84\x17\xb9\x31\x96\x59\x41\x79\x46\x01\x02\xe3\x50\x92\x57\x6d\x88\x32\x85\x18\x2b\x6e\x7c\xd3\x1d\xcd\xce\x21\x10\x79\x6d\xf7\x21\x24\x97\xa6\x7c\xa9\x8f\xab\x03\x85\x9d\x6b\xc6\x40\x9f\x2c\xdc\x48\x74\x9f\xb6\x51\x8e\x7c\xdd\x4a\x5a\x55\x50\x02\x55\xdb\x37\x98\xed\xe6\x4c\x25\x12\xc4\x83\x82\x77\x57\xd1\x03\x31\x8c\x45\xb8\xb5\x0c\x15\xf0\x0a\x62\x8a\x0e\x72\x5d\x02\xc9\x26\x40\x8b\x7d\x6f\x31\x07\xdf\x9f\x9f\x9f\xbe\xbd\x3b\x9d\x9c\x9f\x4e\x2e\x4e\xcf\x7e\x77\xed\x9f\xff\xe3\xd9\xfd\xff\xf2\xc7\x97\x3f\xfd\xd0\xd8\xff\xaf\x7e\x7c\xf9\xc3\xb7\xfd\xff\x47\xfc\x9c\xbb\xcb\xa6\xdb\x9e\xe7\xe5\x76\xeb\x56\xe9\xb0\xf6\x2b\xea\x74\x52\x5e\x98\x2a\xfb\x64\x4f\x27\x65\x71\xee\x05\xe6\xf4\xd9\xe0\x85\x3e\x9f\x8d\x86\x8b\xf1\xaf\x23\x7d\x3e\xbd\xbe\x9e\x4e\xe6\xfa\x7c\x3a\xbb\x99\xce\x90\x9d\x13\x82\x79\x0b\x3d\x84\x50\xcc\xe5\x78\x76\x0d\xd7\xe9\x8b\xe9\x08\x7f\xcf\xd1\xb4\xab\xd1\xbb\xe1\x15\x85\x7f\x46\xf3\x41\x4c\xf9\x09\x37\xf6\xf1\x5c\x5d\xcc\x86\x97\x0b\x8e\x1e\x86\x67\xc0\xfb\x47\x7a\x38\xd1\xc3\xc5\x62\x3a\x9b\x8c\xee\x4e\xcf\xaf\xc6\xa3\xc9\x42\xcf\x46\x57\xd0\x8a\xf9\xfb\xf1\xcd\xa0\xd5\x4e\x45\x2f\x9f\xa3\xc4\xd9\x78\x02\xb1\x2e\x7c\xe3\xc4\x3d\xae\x37\x9c\x9f\x8e\xe7\x3d\xfd\x76\x38\x1f\xcf\xdb\xdf\xd7\xd7\xc3\xbf\x8c\x64\xac\x72\x3c\x9a\xab\xd9\xe8\xdd\x70\x76\xc1\x31\x45\xf9\x4c\xd6\x4d\x4b\x70\x04\xc6\xf3\xf3\xab\xe1\xf8\x7a\x0e\x31\x21\x74\xf0\x45\x3c\x48\xcf\x46\xf3\xdb\x2b\x88\x53\x5d\xce\xa6\xd7\x7a\xbc\x98\xeb\xdb\xf9\x68\xa0\xf8\x76\xac\x20\xdc\xf4\x61\x3a\xfb\x8b\x3e\x19\xce\xf5\xc5\xe8\x12\x23\x2d\xa3\xab\xe9\x87\x7e\x24\xd3\x76\x3b\xb9\x18\xcd\xa0\x35\x18\xce\xa0\xd1\xec\x18\x8e\x48\xeb\x49\x9f\xf4\xce\xcf\x6f\xae\x7a\x7a\x3a\xd3\x3d\xfa\x5d\xaf\x8f\x91\x43\x78\x2d\xbe\x63\x31\x3a\xa7\xd8\x6b\x08\xa3\x61\x70\x4c\x61\x14\xa6\x19\x92\x75\x17\xa1\xdb\xb9\x0f\xf7\xc0\xa3\xf0\x93\x8b\xf7\x6e\x0a\xe7\x7a\x78\xbb\x78\x3f\x9d\x8d\xff\x87\x68\xfb\x78\xae\xb8\x59\xf8\xda\xf7\xe3\xb7\xe3\xc5\xe8\x62\xa0\xd4\xdb\x3b\x3d\xfa\xeb\x68\x76\x8e\x91\x2f\xf7\x74\x68\x84\x8f\x67\xc2\x0b\xfc\x60\xbc\x1f\xcd\x38\x16\x79\x0e\xa1\x61\x37\x17\x10\x1e\xd4\x8b\xa9\x7a\x3b\xd2\x6f\xa7\xb7\x13\xe8\x4e\x7b\xc0\xa8\x05\x03\x0a\x53\xb9\x7f\x4c\x67\xfa\x9d\x9b\xf9\x39\x3c\xd2\xfd\x1e\x5f\xae\xce\xa7\x13\x8a\x7d\x61\x48\x7b\x02\x11\xbb\xf1\xc5\x68\x36\xe4\x25\x7d\x37\xbd\x9d\x51\x2b\x86\x93\xf3\x91\x0f\x42\x75\x05\x9d\x30\xbe\x7e\x36\xd0\x17\xa1\x9e\x44\xa9\x74\xa0\x7b\xe7\x81\xa3\xe5\x43\x59\x7d\x0c\xf4\xae\x58\xf3\xcd\x3a\xce\xa9\x3b\x65\xb3\x72\x0d\x45\xa9\x00\x49\x72\xa7\x46\xfd\x50\xe6\xe5\xfd\x41\x97\x95\x32\xc5\xea\xb0\xca\xcb\x9d\x59\x67\x29\x94\x8a\x07\x7c\xfc\x07\x28\xe1\x28\x00\x5c\x87\xa0\x12\x64\x12\xdb\x17\xbe\xcc\x05\x05\x7c\xe1\xce\xa7\x08\x49\x1c\x72\x6c\x84\xca\x90\xb8\x81\x24\x50\x39\x02\x42\x9d\xa9\x86\x90\xfd\xd2\x53\x20\xa9\x4e\xd6\x23\x48\x56\x58\x6b\xb6\xcb\x5c\x1e\x6d\x81\xab\x06\x39\x9b\x86\xa2\x04\x2f\x10\x47\x5a\x95\xea\xc6\x98\x85\x92\x9f\x58\x63\x32\xd5\x17\x01\x3e\x09\x1f\x3c\x01\xed\x03\xaa\x06\x36\x79\xf9\xd8\x57\x9e\x18\x10\x41\x1b\x5d\x2c\x6c\xcb\x81\xee\x35\x9e\x14\x4f\x13\x61\x03\xf7\x3b\x82\xce\xc1\xbb\xca\xaa\xf1\x8b\xb4\x58\xfb\x9a\x00\x73\x6a\x3e\x63\x16\x14\x31\x8a\x72\xa2\x05\x41\x6b\xa2\xb7\x7b\xa2\x2b\x0c\x6a\xb6\x89\x5e\x57\xa9\xbb\x08\xa3\x34\x76\xa2\x36\xe8\x95\xa4\x39\xff\x46\x6f\x4b\x24\x73\xcb\xb0\x52\x59\x68\x87\xec\x49\x65\xa6\x5a\x03\x92\x12\xe9\x90\x48\x74\x12\x1e\x96\x2e\xab\x0c\xd1\x74\x88\x78\x33\x85\xa5\x87\x46\x98\x39\x00\x49\xb7\x57\x19\xd5\x9a\x57\x66\x95\xda\x3a\x51\x5e\x82\xc3\xac\xf1\xfb\xeb\x74\x07\xd8\x77\x42\x3f\x63\xe5\x40\xf7\x3c\x6b\x39\xcf\xea\xeb\xe6\xb9\x31\xa9\x1d\x73\xba\x1a\xe8\xde\x15\x21\x2f\x7b\x82\xb1\x36\x08\x8d\x80\x0f\x5b\xd4\x59\x4d\x45\x46\x25\x0a\x74\xfb\xae\xfa\xa0\xa8\x3a\xc6\xde\x47\x12\xc5\x03\xdd\x9b\x32\xb2\x62\x08\x5e\xf4\xb3\x2f\x84\x02\x38\x08\x1d\xaf\xfd\x0b\x07\x4a\x99\x81\xee\xc9\xd5\x57\xcb\x72\x4e\xc0\x71\x31\x01\x04\x79\xeb\x0f\xd9\x0e\xdb\xdd\x26\x2a\x51\xed\xf6\x6e\x06\xba\x77\x57\xee\xfd\xda\x2e\xba\x1b\x47\x60\x50\x88\x26\x1f\x03\x83\x13\xf4\xdb\x57\xe2\x7f\xca\x10\x4f\xf8\x29\x2b\x73\xdf\xab\xce\x71\x43\xcf\x9f\xbc\x69\xa6\x0a\xfd\x00\xb6\xb0\x44\x20\xca\x03\x70\xd4\x53\x5c\x8b\xc0\xf3\xf2\x0e\x22\x58\xdb\x70\x7e\x23\x2a\xad\xa3\x4d\xd6\x6b\x63\x77\x19\xf0\x8d\x72\x83\xa9\xb9\x18\x4c\x7c\x39\xd0\x97\x69\x56\xe9\x5b\x6b\xf4\x8c\xf4\xbb\x26\xa5\xd7\x17\xa9\x1b\xa2\x26\x12\x3a\x54\x99\xf5\x7e\x05\x60\xde\x6d\x86\x2a\xfc\x7c\x99\xc0\x5b\x0a\x36\x29\xad\x70\x50\xa1\xfd\x1b\xf7\xaa\xbd\xbb\x7c\xa1\x56\xa1\x4d\xb1\xf0\x9b\xeb\x33\x18\x95\x62\x99\xcd\x8b\x42\xd9\x9f\x82\x04\xd9\x26\x5e\x1f\xba\x7c\x2c\x4c\xd5\x45\x62\xed\x9f\xab\x08\xb5\x05\xa5\xa9\xe9\xa3\x45\xb2\x2c\x1e\x9f\x77\x55\x5a\xd4\x03\x3d\x8f\x10\xc7\xdd\x08\x89\x16\x78\x95\xa7\x42\x51\xe0\x8a\x80\xf1\x00\x18\x76\x8b\x36\x5f\x3f\x66\x6b\x93\x44\x98\xcd\x04\xc4\x18\x7c\xbf\x12\x37\xc7\x3b\x03\x22\x04\x27\x9b\x12\x03\xd1\xeb\x7d\x15\xdd\xa7\x44\x07\x7c\x17\xfb\x7e\x5a\xc4\x3a\x90\x30\xe6\xac\x50\xc1\x48\x23\x5f\x28\x9f\x0f\xaf\xe1\x90\x86\x29\xe4\x9a\xd7\xb0\x1e\x1b\xb8\x08\x71\xd4\xd6\x54\xe0\x8c\xf1\xd9\xa6\x1d\x0b\x37\xd9\xf6\x53\x51\x98\xa6\xa5\xfd\xd0\x3c\xf2\xec\x1b\x38\x96\xba\xa5\xfc\x2a\xbd\x7b\x28\x8b\x12\xcd\xbc\x9b\x8c\x84\xab\xc4\x29\xe5\x94\x1f\x12\x2e\x08\x0d\xbf\x51\x82\x03\xd3\xff\x16\x8a\x03\xc0\x1a\x00\xdc\x7a\x9d\xdd\x67\x35\x08\x47\xad\xb3\x12\x0f\x2a\x7f\xf3\x0f\xbd\x27\x20\x97\xea\xe8\x4a\x47\x37\x16\xbe\xfe\x93\xa6\x83\xce\x10\x9e\x29\xf8\x1e\xd0\x69\x38\xd7\x06\x46\x0e\x03\xc1\xd6\x33\x31\x14\xe5\x23\x88\x69\x01\x06\xc7\xad\x30\xd4\x5b\x5b\x23\xae\x8a\x78\xaf\xe5\x2b\x64\x3d\xbc\xe7\xd5\x23\xc9\xb9\x16\x41\x6e\x8a\x30\x95\xda\xac\x1e\x0a\x02\xf6\xfb\xe8\xed\xf1\x25\x45\x3b\xb5\xd5\xe8\x81\x1a\xe6\x39\x7f\x0c\xb1\xdc\x5c\xfe\xc3\x70\xfa\xe5\x21\x98\x2e\xf7\x66\xda\x33\x88\x10\x01\x31\xd3\x1f\x06\x7a\x26\xc2\x11\xd8\x43\x5e\xe5\xfc\x98\xac\xf0\xac\x15\xaf\xa8\xfb\x99\xac\x36\xda\xa6\x6b\xa3\x44\xfd\x00\xaa\x83\x6f\x33\x81\x96\x09\xd9\x39\x19\xfd\xc0\x4d\x71\xd7\x22\xe5\x48\xc2\xb2\xa1\xf5\x26\x7e\x43\x2b\x0b\xac\xb8\xf8\x18\xac\xa7\xfc\xa0\x78\xe1\x05\xf7\xa9\xc8\x0f\xcf\x31\xe4\xe2\x3e\xba\x6b\xb0\x1c\x28\x9f\xeb\x80\x97\xb9\x6f\xdf\x16\x19\x3c\x7d\x66\x28\x39\x38\x26\x32\x50\xf4\x64\x92\x8e\x13\x08\x52\xad\x8a\x59\x9a\xc5\x86\x62\x53\x03\xad\xbc\x8b\xea\x25\x9f\x1a\x00\xf5\xf4\x00\xf0\xf8\xc4\xa5\x1a\x58\x3b\x5d\x56\xb2\x66\x83\x4e\x6f\xb1\xe3\xd0\x8b\x82\x9c\x81\x3c\x5a\x8e\x1f\xb1\x34\x2a\x5f\x59\xe1\x01\x93\x11\xb7\x2f\x14\x9b\x09\x37\xc5\xcf\x47\x93\x22\xfc\x8b\xe9\xc1\x19\x0b\xdb\x26\x1e\x87\x4a\xc4\xbb\xce\xaa\x81\x2f\x5a\x7d\xea\xc9\xc1\x0f\x43\xea\xeb\x21\x61\xd7\xbb\x4b\x16\x78\xe1\x5b\x93\xda\x3d\x93\xe8\x2a\x26\xe2\xa4\x82\xf6\x18\xab\xcb\x97\xae\x54\x6f\xd3\xa2\x00\xf4\xa4\x80\x47\xfb\x92\xc7\x4e\x5f\x2c\x28\xa0\x48\xdb\x25\x70\x8d\x4f\x9c\x16\xed\xeb\x11\xe6\x31\xb1\xea\x9f\x01\x85\x54\xed\xd6\x75\xb4\xe8\x14\x8a\x2c\x7d\xe1\x3d\x76\x04\x6b\xa7\x11\xdb\x00\x78\x72\xdb\xe5\x06\x74\x51\x97\x00\x1a\x01\x7c\xd9\xae\xa6\xc1\x15\x89\x89\x48\x80\x42\xa0\x10\xd6\x8f\x97\x52\xc2\xaf\x01\xda\xd7\x9a\xd1\xee\x50\x81\xaf\x2a\xb3\x75\xc3\xe3\xdd\xbe\x56\x7f\x8a\x83\xa0\x2e\x01\x2d\xd6\xd5\x43\x78\x07\x6d\x06\x76\xd1\x15\xba\xe8\x09\x2a\x21\xfd\x7d\x6f\x6c\x0d\x26\x77\x19\xaf\x3b\xbf\x5f\xe0\x4a\xd4\xb9\x67\x10\x4d\xd2\x61\x86\x15\xb3\xf9\xe3\xc2\xe0\xd2\xfa\x5d\x95\x11\x23\xa0\xf7\x1d\x37\xd8\x3e\x2c\x38\x81\x47\x3e\xa6\x15\x04\xd5\x29\x7e\xa7\xd2\xf5\xa7\xb4\xa8\xd3\x7b\xd8\xd4\x3b\xb8\x05\x19\xbd\x2d\x0b\x2c\x38\x07\xe2\x3c\xba\xc0\x31\xf5\x19\xd1\x5f\xca\x65\xea\x09\x76\x95\x44\x4c\x52\xf1\x9c\x70\x00\xf8\xf8\xdf\x64\xb9\x39\x65\x81\x30\x59\xd5\xa4\xed\x03\x6d\x74\x15\x5f\xd1\x70\xe1\x7c\x79\xbf\xb4\xec\x97\x7a\xb2\x5f\x51\x35\x77\x10\xf4\xdc\xa5\x07\x96\x97\x82\xb1\xa6\xaf\x2a\xf9\x55\x80\xce\x97\x45\x41\xd3\xe3\x37\xa5\x1c\xa4\xd6\x88\xe0\xe5\x71\xdc\x14\xcb\xfd\x7d\x0f\x3f\xbc\x6a\x37\xbd\xa5\x44\x1f\xb5\xad\x01\xb2\xcf\x56\x96\xef\xc0\x1c\x7b\x08\xf8\x92\xc6\x6d\xd4\xed\xce\x75\x56\x07\x42\x6b\xce\xea\x2b\x22\xab\x74\x6e\x2c\x2c\x01\xae\xef\x03\x8e\x8a\xff\x00\x75\x38\x86\xd3\x30\xde\x14\xb0\x27\x27\xae\x9b\xd6\xec\xd7\x65\x71\xd8\x42\xb1\x96\x77\xcb\xfb\xcc\x2f\xd5\x6c\x44\xb6\xf1\xb4\xf4\x6f\xd0\xa2\x64\x75\xde\xb0\xa6\xe1\x23\x88\x6f\x57\xd4\x72\xf2\x18\x65\x85\x0c\x6d\x31\xd1\x27\xdc\x6d\x6f\xfc\x6a\x49\xf4\x03\xd7\xec\x22\xb7\x1e\x11\xa6\xa4\x96\x6a\x0b\x5b\xb6\x0a\x62\x15\xdb\xac\xc8\xb6\x7b\x52\x3e\xa1\xf7\x63\xd5\x34\x50\xda\x22\xe4\x47\x09\x46\xda\x72\xbb\x4b\x2b\x68\x81\xb8\x94\xd3\x17\xf1\x3b\x96\xc2\x66\xe1\xac\xf0\x30\xa3\xd4\xaa\x50\x2e\xcf\xd5\xcd\xcf\x3f\x18\x83\x0f\x3f\x3a\x2f\x91\x40\xfd\x5c\x87\xf7\xc1\x9f\xa3\xf0\xd2\x8b\x70\xc8\x3a\x9f\xee\xad\xe0\x77\x89\xac\x03\x55\x1b\x91\x62\x7e\xc7\xed\x39\x5c\xf1\xe0\x52\x03\xef\xc4\x32\x54\x3a\xb9\x2d\x51\xf9\x93\x21\x5f\x52\x2d\x0c\x7f\xeb\x3b\x0b\x1e\x7c\x6e\xd6\xf7\x86\xe4\x92\xc5\xdc\x65\x85\x3b\xae\x0e\xaf\x95\xca\x06\xe1\x45\x0f\x29\x14\xeb\xec\x21\x06\x14\x9c\xea\x4c\xb8\x46\x91\xa3\x0e\x86\x99\x90\x18\x18\xa5\x60\x09\x64\xf6\x6e\xd8\xff\xa0\x0a\x42\xf8\x68\xfa\xb8\xd9\xe7\xfa\x4b\xfd\x23\xc5\xe9\xc7\x3b\x2c\x2f\x00\xa6\x1c\xb7\x18\x7c\x31\x24\x96\x96\x1e\x70\x79\xc2\x75\x17\x8a\x5c\x80\xf3\x3e\xb7\x25\xd0\x84\x90\x46\xa4\x71\x7f\x00\xf0\xc4\x1e\xe9\x6a\x64\x9d\x25\xda\x37\x77\x83\xca\x32\xb4\xed\xd0\x63\x7f\xc4\xfb\xf2\xb7\x28\x0a\x00\xfa\x4f\x6b\xb3\x4d\xdd\x82\xc6\x59\xcd\xb8\x08\xce\x26\xce\x3a\x6e\xcb\x02\x82\x02\x81\xd4\x5c\x54\xca\x62\x20\x01\x4d\x6a\xa8\xdc\x25\x21\x13\xaf\xed\xb3\x36\x9b\x74\x4b\xc1\xc9\xac\xf8\x94\x32\xc2\x0e\xec\xf8\xea\x10\xe2\x18\x35\xd4\x2b\x82\x6a\xef\xdf\xf6\x38\x49\x8d\x27\xe3\xc9\x4b\x30\xf0\xe1\x9c\xc1\xd7\x57\x77\x3a\x80\xc0\x65\x70\xdf\xa3\x47\x3f\x8c\xe7\x23\xc6\x0d\x0b\xd0\x30\x60\x7e\x8f\x41\x8d\x93\x28\x39\xe2\x51\xee\x3e\x99\xa4\x7d\x32\x29\xf1\xb8\xb0\x18\xcc\x7d\x0c\x2c\x2e\xa0\xe2\x02\x29\xee\xf1\xe6\x80\xd6\x85\xc4\x42\x22\x81\x66\x63\xc8\x23\xc9\x7c\xd4\xf9\x74\xb2\x18\x4d\x16\xf0\x3c\x44\xec\x9e\xdf\xc9\x4c\x0c\x92\x0b\x5e\x85\xa2\xa5\xb2\xd0\x57\x59\x0a\xba\xf1\x07\x3f\x8e\x31\x00\xff\x89\xf1\x50\xc3\xc9\x05\x7f\x49\x26\xb7\x18\xa7\x0c\xa9\xad\x90\xff\x5a\x4c\xf5\x50\x20\x84\xef\x42\x12\x0c\x3e\xa9\xde\xce\x46\xc3\xf3\xf7\xbe\xbd\xa1\x93\xe3\x89\x9e\x23\x42\x5c\xff\x98\x44\xf0\x70\x00\x79\xfb\x5c\x8d\x47\x60\x2b\x42\x60\xc3\xd4\xdc\x51\xf6\x71\xf1\x7e\x34\x9d\x61\x16\xce\xfd\xb2\x03\x79\x9d\xc4\xb8\xeb\x44\xdf\xdc\x4e\xc6\x8b\xf1\xaf\x00\xb1\x1e\xfd\x75\x74\x7d\x73\x35\x9c\xdd\x1d\x87\x63\xc7\xeb\x8c\xe0\xd9\x72\xfc\x11\xd1\xac\xc6\x97\xa1\xcd\xbf\x09\xbf\xec\xcc\xf7\xcf\x03\x80\x25\x13\xb0\x01\xec\xf3\xa2\x75\x57\x7a\xc2\x14\xe1\xb1\x14\xe8\x3b\x22\x6e\x02\x05\x8e\xb7\xdb\x6c\xcb\x0a\xa0\xae\xcb\x03\x98\x2c\x32\x6f\xc7\xdc\x79\x1f\x0f\xb6\x3e\x20\xdc\x4d\xf4\xd1\x74\x5d\xd0\x3d\xbf\xeb\xa4\xf9\x10\x27\x31\xd4\xa8\x39\xeb\xf5\x0c\xe1\x87\x77\xf9\xe0\x40\xcc\xba\x9b\x45\xf4\x1f\xaa\x4d\xff\xc1\xae\x9e\xbb\x53\xf3\xe3\x07\x82\xc8\x2f\xd1\x2f\x13\xb7\x12\x7f\x4a\xf4\xcf\x18\x64\xf8\x13\x36\xcd\xee\xab\x4f\xae\x4f\x7c\x11\xa7\xc9\xe9\x4e\x1a\x35\x22\xa5\x78\x8b\xeb\x8a\x97\x26\xf2\x50\x8a\x26\x92\xca\x1c\x45\xd8\x53\x7f\x69\xd8\x53\x9e\x83\x7d\x08\x55\xbb\x4e\x83\xfe\x3d\x33\x65\x10\x83\x9c\x38\xb9\x21\xc2\x64\xe3\xb8\x18\x1f\xfa\x8d\xcc\x87\xd7\xeb\x56\x3e\x04\x80\x8b\x06\x6e\xf5\xb6\x2e\x77\x6d\x26\x11\xf4\x45\x31\xea\x5d\x67\x5b\xd3\xe1\x8d\x29\xaf\x4f\x83\x4c\xca\xb9\x77\xce\x29\xf7\x03\x4d\x04\x70\x75\x56\x3f\xac\xab\xf4\x31\xbe\x3a\x9f\xc8\x03\x2b\x34\xcd\x3d\xd4\xf9\x0b\x4b\x63\x30\x95\x15\x48\xbd\xe8\x76\x92\xf8\x81\x3f\x12\x75\xf2\xb8\xf6\xa4\xa3\x7e\x1f\x65\x6b\x8a\x3a\x2b\xf6\xc6\xf3\xcd\x40\x7d\x3d\xa2\xc9\x51\x92\x9e\x89\xc9\xfc\x42\x56\x21\xde\xcc\x34\x49\x5a\xeb\x3f\x0d\xf4\x75\x66\x57\x26\xcf\x91\x88\x01\xf6\x7e\xe0\x2c\x89\x83\x4e\x4f\xc7\x93\xe2\x3b\x45\x33\x12\x9d\xc4\x79\x12\x4e\x71\x95\x71\x78\x48\x94\x1d\xca\xd8\x03\x85\xa0\x80\x02\xbe\x33\x0b\x90\xda\xce\x75\x4d\xf7\xe2\x0e\x06\x21\xd8\x35\x4c\x65\xe0\x16\x86\xed\xd8\x5b\xa4\x27\xf5\x24\x8f\x81\xdf\x0e\x2a\x4f\x1f\x41\xd1\xc1\x5f\x4c\x75\x8a\x53\xe1\x5a\x16\xea\xfb\x99\x9f\xc4\xd0\x51\x19\x4a\xb6\x9d\x05\x59\xa3\x8e\xf3\x33\x71\x48\xf6\xfc\x98\x54\x05\x39\x7a\x38\x94\xda\x60\x38\x51\x9e\x16\x84\x52\xbf\xa1\xbf\xd8\x54\xc8\xa2\x62\xea\xd4\xcb\x1b\xd1\xd5\x83\x82\x20\xde\xb7\x55\x51\xf0\x3a\x3c\x08\xc7\x08\x96\x5f\x18\x22\xbc\xbe\x4e\x4a\x54\xf5\x84\xa0\xc1\xb1\x81\xf6\x0d\x59\xbb\x96\x3a\x4f\x1e\xa1\xe4\xc5\xda\x5d\xb0\xf1\xdc\xc0\x3a\x77\x9e\x57\x5a\xdf\xd0\x0e\xf8\x74\xc5\x9e\xa1\x6b\xb0\x7f\x5e\x56\x78\xb5\x46\xd4\xb3\x07\x1a\x25\x31\x50\x5e\xab\x18\x58\x2d\x89\x9e\xac\xfb\xa9\x03\xa5\xd6\x8d\x83\x51\x26\x91\xeb\xa0\x0e\x14\x88\x58\x58\xe4\x59\xce\x0b\x88\xd7\x84\xb4\x63\x58\xe6\x5e\xd0\xcd\xd9\x63\x22\x4e\x22\x96\x1b\x66\x30\x45\x93\x6a\x05\xd7\x8b\x55\xf2\x22\x24\x31\x8d\x5d\xaf\x08\x25\xbe\x99\x7f\x8f\xdf\x94\x30\x6a\x8a\xb2\xde\x4b\x48\xe0\x2f\xf1\xf6\xc0\xa8\xce\x34\x0f\x93\x48\xd1\x55\x28\xc3\xc7\x0b\x29\xdd\x84\x9d\x67\xbf\x2f\xbc\x28\x36\x9d\xc6\x8d\x91\xe3\xe8\xd6\x52\x6a\x69\x09\xa6\xf6\xed\x1e\xce\x21\xae\x81\xf7\xdd\x55\x51\x85\x46\x59\x71\x5c\x7e\xa0\x54\x0b\x94\xe6\x55\x46\xfc\x44\xb7\xb7\x92\x5b\xcd\x10\xc5\xf1\xe5\x14\x8f\x0f\x69\x6d\x4b\x38\x20\x8e\x04\x6d\x20\xf8\xac\x5b\xaf\x93\x98\x81\x3c\xe3\xe8\x06\xb8\x3a\x95\x42\x66\x10\xb8\xc0\xe0\x28\x01\x49\xba\x7b\x5c\x49\xd0\x78\xe4\xe6\xdc\xa6\xc0\x0f\xec\xdb\x90\x48\x1a\x61\x1c\x1f\x25\x99\x02\x8a\x03\x97\xd6\x26\x4c\xc1\x09\x5f\x01\x14\x3c\x26\xd3\x3d\x3f\x44\x9d\xa5\xb9\x7f\x05\xe5\x80\x1b\x7d\xe4\x31\xca\xd9\x0f\x6b\x1c\xe6\x94\xab\xa9\xcc\x7d\x09\xff\x7a\x2c\xf5\xc9\xcb\x3e\xb0\x98\x9a\x62\x65\x2c\xd4\x2a\xb4\x46\xe6\x21\xe2\x9e\x63\x79\x34\x90\x81\x47\xa2\x4c\x1b\xcf\xa9\x77\x2c\x13\xe5\x0d\x2a\xb1\xa6\xfa\xbb\x37\xd4\x20\x0b\xba\x20\x71\xc3\x1f\x28\x85\xa8\x64\x51\x0f\x41\xf8\xe1\x80\xd2\x20\xea\x30\xa4\xf9\x20\x08\x07\x44\x1e\x3c\x51\x23\x46\x82\xac\xf2\xdb\x32\x9c\xd6\xe7\xe7\x37\x57\x89\x2e\xa8\x7c\x08\xe7\x15\xa6\x9f\x59\x7d\xfd\xd5\x57\xf7\x9a\xa3\xd1\x53\x34\xd9\x0c\x4c\x0e\x9f\x2d\x2b\x9d\x97\xf7\xa5\x6b\x5e\xc7\xea\x0a\x9b\x63\x57\x65\x24\x43\x5b\x9b\x82\xed\x62\xd7\xb7\x90\xcb\x2f\xb0\x57\xec\xd9\x81\x40\xd3\xd8\x70\x53\x5b\x3b\xe8\x3b\xf7\xb6\xe2\x74\xb5\xaf\x2a\xa0\xa9\xf5\x0d\xdd\xdb\xf4\x9e\x8a\xcc\x41\x53\x00\x62\xd8\x14\x1b\xf3\xe5\x57\xaa\x44\x20\xd8\xa3\x59\xda\xac\x36\x71\xf8\x16\x22\xfb\xe9\xa7\x34\xcb\xf1\x34\x75\x77\x04\x0a\x82\x77\x70\x4c\x74\x6c\x6e\x7a\x1b\x55\xe5\xa0\x0a\xe6\x43\x5d\xef\x5e\x7f\xff\xfd\x8a\x3e\xbb\xa2\x41\x28\xab\xfb\xef\x07\xdf\xaa\x3d\x7e\xc7\x9f\xc1\xf7\xb7\x37\x57\xff\x24\xdc\x37\xff\x3c\x53\xff\xf1\xea\x87\x1f\x5f\x35\xf0\xdf\x2f\x7f\xfc\xe9\xa7\x6f\xf8\xef\x3f\xe2\x47\x94\x82\xae\xfa\xfa\x7f\x1e\x4c\x5a\xfd\x2f\xfd\x3f\xc3\x85\x10\xc9\x7c\xec\xff\x82\x60\xe1\x6d\xe1\x1c\x29\x9b\xe6\xfa\x86\xa0\x53\x9f\x7c\x85\xa5\x3a\xb9\xbd\xb9\xea\x27\xfa\x57\xaa\xc0\x3c\x1b\xbc\x50\xaa\x71\x9b\xf5\x7e\xbe\xb6\x06\x4c\x7a\xfd\xc0\x7a\xfe\x02\x8b\x95\x59\x2d\x11\x3f\xe0\x25\xe2\xa9\x6b\x2a\xeb\x5c\xce\x25\xeb\x4f\x34\xc4\x0f\xb8\x3c\x35\x91\x22\xed\xeb\x72\x05\x5a\xb3\xa9\xe0\x47\x42\x5d\xdb\x93\x00\x1f\x25\x25\xbf\x1e\x57\x23\xf6\xfa\x09\x56\xbc\x96\x1b\x2f\x09\x5d\xac\x03\xe3\x99\xe7\x9e\x0c\x29\x94\x38\x90\x3c\x0f\x4d\x21\xa6\x3b\xfe\x06\x31\xd0\x71\xa4\xf4\xb1\x40\xb9\x27\xf7\xb6\x9c\xc3\xb8\x70\x0b\x59\x1e\xb0\x9e\x38\x6f\x9d\xa5\x58\x1b\x02\x84\xa1\x78\x6c\x9d\x64\x7d\x2c\x4f\x09\xe0\x5c\x5f\x57\x99\xa2\x58\x89\x67\xe4\x2a\xbd\xff\x4e\xb4\x22\xe0\x22\xf3\x4b\xb0\x4e\x36\xa3\xe7\x5d\xb9\x9e\x57\x14\x8c\x39\x49\xad\x8a\x71\xb0\x09\x12\x6f\xa5\xb9\xeb\xf5\xb2\xac\x1f\xe0\x22\x7a\x92\xf6\xdb\x43\xa0\xd4\xc9\xb2\x8f\x77\xb4\xcc\xac\x62\x42\x11\xaa\x19\x7e\x48\xab\x35\xa9\x38\x5b\x01\x62\xca\xab\xfb\xea\xb1\xfa\x68\x9d\x7d\x82\x24\xa2\xf3\x4b\xca\x82\xae\x74\x48\xcf\x14\x1c\x3a\xdf\xed\x13\x14\xf1\xd4\x3d\xd1\x87\x1e\x96\x57\x33\xf8\xd4\x33\xba\x64\x82\xe0\xac\x63\x4c\x6c\x3f\x51\x3e\x44\x2f\x30\x2d\x1d\x0e\x9d\xa4\x7e\x12\x61\x36\xcf\xd2\x49\x39\xed\x96\x76\x9f\x80\x5b\x25\x21\xf1\xd7\x21\x9c\x37\x97\xc4\x2d\xce\xe3\x4d\x14\x00\xfe\xac\xc9\x73\xa6\xcd\x07\x59\xb8\x14\x28\x0f\xb7\xbb\xb2\xaa\x13\xe7\xb1\xc1\xff\x7b\x66\x37\x7c\x36\xfc\xd3\x96\xf9\x3a\x1e\x0e\x4f\xff\x1d\x46\xee\xc4\xf6\x3d\xfe\xac\x81\xdf\x08\x2e\x24\x2f\x69\xcf\xeb\x0e\xf5\xfb\x81\x3d\x0f\xae\xc1\xa1\xc2\xda\x5f\xcc\x1b\xa8\x80\x80\x1f\xf2\xe6\xe2\xb5\x44\x7c\x75\x2a\xce\xfb\x37\x66\x42\x1f\x5f\xd8\x14\xfa\x28\xe8\x2a\xa8\x90\x90\x4b\xe3\x24\x3f\xc0\x7e\x6e\xae\x3c\x63\xb5\x5f\x5f\x84\x26\x0b\x60\x39\xbb\x5f\x3a\x47\xda\xf9\xe1\xaa\xa9\x6d\xc4\x03\x39\xc0\x72\x0d\x66\xae\x88\xea\x33\x28\x31\x90\x3c\xc7\x1e\xe3\x33\x01\xaa\x4d\x1a\xd3\xc5\xdb\xd1\x88\x91\xb7\xa9\x62\x92\x67\xcb\xc9\xa1\x0a\x61\x32\x9d\x8c\x27\x97\xb3\xf1\xe4\xdd\xe8\x7a\x34\x59\xc4\xf4\x2b\xf3\xf7\xc3\x2b\x88\x9c\x53\xd5\x06\x70\x7a\xb4\x99\x74\x02\xf5\x09\x47\xd7\xa1\xf8\x25\xf1\xa1\x72\x4f\xda\xe1\xb3\x01\x89\xfa\xf0\x7e\x04\xbf\x1a\x43\xfe\x64\x78\xce\x85\x13\xe7\xd3\xc9\x62\x36\x3c\x5f\x24\x7a\x31\x9d\x2d\xa2\x8c\x4d\x12\xa5\x16\x12\x8a\xbc\x23\x01\x8a\xfb\xde\x84\xb2\x04\xc0\x28\x12\xcd\x88\x8c\xc7\x73\x5b\x2e\x46\xc3\xab\xf1\xe4\xdd\x1c\x93\x44\xe1\xc3\xff\xa2\x6e\x27\xd7\xff\xbd\xfc\x27\x7a\x80\x4f\xfb\x7f\xaf\x5e\xbc\xfc\xb9\xe5\xff\xfd\xfc\xad\xfe\xef\x8f\xf9\x79\xaa\xfe\x4f\xbf\x7c\xa6\xd0\x4f\xcb\x42\x3f\xf5\x8f\x15\xfa\x45\x25\x7e\xea\x1f\x29\xf1\xd3\x51\x89\x9f\xfa\x5d\x4a\xfc\x42\x4a\x55\xfd\x4e\x25\x7e\x98\xdd\xfc\x56\xe2\x27\x72\xa3\xe1\x4d\x57\xc3\x0f\xdf\x6a\xfe\xbe\xd5\xfc\x7d\xab\xf9\xfb\x56\xf3\xf7\x9f\x5b\xf3\x77\x49\x1f\x48\x3f\x95\xd9\x9a\x69\xcc\xd7\xe5\x7e\x59\x27\x82\xa8\xeb\x83\x17\x24\xe5\x69\x00\x05\x29\x8b\xb1\x0e\xd4\xd0\x2b\xd6\x4a\x8c\x27\x24\x41\x0f\xc5\xea\xa1\x2a\x0b\x9a\x8d\x26\x08\xbc\xce\xb6\x66\x7d\x0a\xa1\x65\x9f\xb3\x48\xf5\xb6\xfc\x04\xb1\xfe\x6d\x7a\x6f\xf4\x49\x0f\x9e\x91\x15\xf7\xbd\xbe\x8f\x06\x7f\x65\x87\x9b\x0a\xce\xdf\x8a\x1c\xbf\x15\x39\x7e\x2b\x72\xfc\x56\xe4\xf8\xff\xe3\x22\x47\x34\x2f\x58\xea\x88\xc6\x82\xe8\x83\xf8\x99\x0d\xab\xe8\xbe\xb3\xfa\xd7\x28\x8c\x5c\xff\x97\xea\x46\x73\x9c\xbd\xe9\x37\xc8\xbe\xfd\xfc\xc9\xfa\xf8\xd4\xc9\x8a\xd0\xee\x1b\x6c\x1e\x3c\x62\xc6\xd8\x68\x7d\x0b\xbb\xf9\x6d\x9e\x16\x1f\x4d\xcd\xdb\xcd\x0a\x88\x04\x80\x42\x6c\x6c\x21\x94\xc7\xaf\x91\x97\x19\x84\xbb\x83\xc1\x47\x45\x97\x4f\x59\x8a\xbe\xb6\x7f\x37\xed\x19\x5b\xae\x32\x53\x1f\xd4\x89\x19\xdc\x0f\xf4\x70\x7e\x3e\xbc\x49\xf4\xdb\xeb\x71\xa2\xe7\xa3\xf9\xf0\xbc\x9f\x04\x00\xb7\x38\x8d\x21\x5f\x2d\x9f\x16\xf0\xf3\x34\xbe\x4a\xfe\x15\x1f\xfe\x68\x96\xce\x7d\xea\x4b\xcf\x61\x80\xd0\xee\x6b\xb3\x7a\x48\xa1\xf2\x94\x4c\x32\xec\x80\x79\x9d\xd6\xfb\xba\xac\x0e\x61\xa0\x7e\xef\x11\x81\x69\xf2\x86\xfb\xde\xdd\x36\xa0\x6a\x27\x48\xbc\xba\x5f\xd6\xd4\x83\xf7\x69\x55\x1d\xf4\x65\xf9\x59\x0f\xe1\xa3\xad\xd1\x81\x8c\x81\xa8\xa3\x0c\x85\x61\x8d\x62\xb3\x93\x1e\x12\x66\x31\x57\x7f\xbf\x11\x3d\x4f\x9a\x61\xe6\x0e\xec\x3c\x3b\x16\xcb\x83\x3e\xfb\x59\xdf\xce\xcf\x7d\x11\xd6\xd9\xd9\x8f\x3c\xc8\xb7\x73\x1d\x72\x66\xc3\x55\x0d\xe0\x41\x18\xb3\xa0\x56\x9b\x15\xe4\xc0\xff\x6d\x5f\x65\x96\x54\x37\x6d\x1f\x3d\x89\x0f\x38\x6b\xee\x40\x7b\x6e\x6a\x9e\xd8\x23\xaa\xcb\xfb\x6c\xb9\xed\x4f\xce\xad\x47\x6b\xaa\xaf\x5f\xed\xa7\xf1\x6a\xa7\xe9\x9c\xbb\xf7\x8f\xa8\x10\xaa\x9f\xa8\xa3\x2b\x9d\x6d\xc6\x97\xad\x69\x3f\x77\xea\xe8\xdc\xe9\xa7\xe6\xee\x87\xae\xb9\x53\x47\xe7\x4e\x1f\x99\xbb\x6f\x45\xe7\xdf\x8a\xce\xbf\x15\x9d\x7f\x2b\x3a\xff\x56\x74\xfe\xad\xe8\xfc\xbf\x6c\xd1\x79\xdc\x91\x76\x04\xa8\xbb\x23\xea\xab\x3a\xa2\x9b\x1d\x69\xbc\x43\x7d\x5d\x47\xf4\xf1\xea\xf9\x3f\xa4\x62\xba\x79\x4b\x71\xbf\x7f\xa6\x8a\x5a\x75\x55\x51\xeb\xdf\x5a\x45\xad\x5a\x55\xd4\xfa\x37\x56\x51\xab\xa7\xaa\xa8\xf5\x57\x55\x51\xab\x23\x55\xd4\x6f\x1a\x0b\xc3\xb7\xfd\x10\xaf\x11\x71\x9a\xa9\x8e\xd3\x0c\xf5\x38\x81\x0a\xdd\x19\xd9\x80\x5c\x67\xe5\x2e\x16\xc5\x0b\x48\x2e\x00\xb6\x06\x9f\x50\xd6\x0d\xdc\xce\xc6\xd2\x64\x78\x83\xdd\x81\x16\x29\xb9\x38\x0c\x21\xd3\x81\x1f\x5e\xce\xda\x1b\xae\xae\xae\xa3\xea\xee\xd6\x5e\x4a\xb9\x28\x9b\x90\xd0\x5e\x4f\xb8\xc3\xbe\x76\x6c\x14\xf4\x79\x13\xdd\xbb\x74\x3b\xe5\x41\x46\xf4\xe9\xdb\x18\xcf\x5e\x1e\x5a\x9b\xa5\xe7\x3a\xd2\x9b\xaf\x2a\x63\x0a\xb8\xc5\x7b\xa9\x61\xaf\xc8\xd7\xfc\x2a\x19\x8c\x5e\x9f\x84\xde\xfe\xa1\x42\x78\x15\x15\xc2\x3f\x3b\x54\x1d\x7b\x2a\xae\x8d\x57\x4f\xd6\xc6\xeb\xaf\xab\x8d\x57\x4f\xd4\xc6\xeb\xaf\xaa\x8d\x57\xff\x40\x6d\x3c\xa9\x14\x85\xca\xe2\xeb\xdb\xc5\xed\xf0\xea\xea\x4e\x48\x13\x51\xfe\x91\x75\xa6\x42\xd1\x71\x12\x12\x8f\xd3\xcb\xcb\xd1\x6c\x1e\xf2\xc2\x90\xbd\x86\xbc\xa1\x4f\x54\xcf\x46\x37\xb3\xd1\x7c\x34\xc1\x7a\x60\x40\xd6\x74\xd7\x18\xeb\xf3\xe9\xe4\x7c\x34\x9b\x70\x22\x9b\xea\x4f\x11\x66\x94\x04\x65\xaa\xf9\x62\xb8\xb8\x5d\x4c\x67\x77\x0d\xa4\xcd\x33\x75\xc8\xf1\x4b\x17\xe3\xc5\xd5\x28\xf1\x08\xa4\x71\x03\x81\xa4\x8f\x21\x90\x92\x26\xfc\x28\x51\x84\xd4\x19\xbe\x9d\x8f\x28\x85\x7a\x35\x84\x42\x64\x81\xdb\xb9\x1c\x9d\x2f\xe6\x89\x2f\x71\x4e\x18\xde\x83\x43\x83\xdf\xa2\x07\xa8\xe9\xa5\x1e\xcd\x66\xd3\xd9\x3c\xd1\x8c\x38\x9a\xce\x00\xb3\x70\x31\x9e\x9f\x4f\x7f\x1d\xcd\x86\x6f\xaf\x46\x03\x3d\x9f\x5e\x8f\xf4\x9f\x6f\x67\xe3\xf9\xc5\xf8\x1c\xc7\xf6\x62\x8a\x98\x87\xab\xab\xe9\x07\xf7\x7c\x35\xfa\xeb\xf9\xd5\xed\x9c\x92\xbd\x6d\xbd\xae\x44\xcf\xa7\x98\xf0\x0d\x1f\xbc\x1e\xde\xe1\x43\x6e\x6e\xae\xee\x48\x19\xea\xf7\x2e\xc3\xfe\x82\x8a\x68\xfd\x15\x15\xd1\xea\x0b\x2a\xa2\xf5\x97\x56\x44\xab\x2f\xa9\x88\xd6\x5f\x59\x11\xad\xfe\xf5\x2a\xa2\xbf\xc4\x35\xe9\xaa\x92\x56\xdd\x55\xd2\xfa\x1f\xa9\x92\x56\xed\x2a\x69\xfd\xdb\xaa\xa4\x55\x47\x95\xb4\xfe\x56\x25\xfd\xad\x4a\xfa\x5b\x95\xf4\x3f\xb5\x4a\xfa\x37\xf6\xb3\xed\xf7\xaa\xaf\xef\x57\xec\x95\xfe\x33\x3a\xb8\xfa\x56\x06\xfe\xcf\x2f\x03\x5f\xff\x8b\x95\x81\x9b\x6f\x65\xe0\xdf\xca\xc0\xbf\x95\x81\x7f\x2b\x03\xff\x56\x06\xfe\xad\x0c\xfc\x7f\xc7\x9f\xc1\xf7\x6f\xe7\x17\xa7\xaf\x4e\xcf\xf3\x74\x6f\xcd\xe9\xa4\x3c\x9d\xec\x57\xb9\x49\xab\x53\xf6\xac\xfe\xf1\xaa\xa0\xe7\xea\xbf\x5f\xbe\x3a\x6b\xd4\xff\xfc\x7c\xf6\xf2\x9b\xfe\xdf\x1f\xf2\x13\xb0\x2c\x67\xbf\xfc\xf2\xc3\xe9\xcb\x17\x2f\x7e\xd1\xf3\x7d\xa1\xaf\xb3\x55\x55\xda\x83\xad\xcd\xd6\xa2\x80\xa8\x1e\xe6\x1e\x4c\x34\x0b\x19\xfe\x59\x2c\x0e\x0d\x65\xd2\x16\x8c\x11\xc5\xfc\xdd\x6f\x96\xa8\xf9\xec\x7c\x52\x9b\x90\x4e\x5f\xe5\x2d\xa0\x44\x31\x24\xca\xf9\x47\xc1\xc0\x09\x9e\x5e\xb2\xe2\x1d\xf5\xa1\x88\x7b\xd8\x9a\xfa\xb5\x52\xff\x97\x6e\xb4\x08\x4a\x8d\xa1\x25\xab\x72\x6d\x30\x87\x53\x99\x3a\xa5\x4b\x7c\x77\x51\x29\x26\xda\x55\x9e\x21\xe3\xa8\x7c\x13\xc5\x8b\x42\x33\x42\xfe\x77\xd0\xf1\xfa\xac\x90\xbd\xe7\xd7\x4b\x74\xe3\x91\x16\x28\x3a\xb7\xbf\xaa\x05\x1c\x9a\x88\xaa\xde\x15\x55\x58\x13\xd0\x23\xad\x4d\x95\xa5\xb9\x0d\x63\xeb\x1d\x21\xd9\x72\xe8\xcc\x24\x94\xf2\x7a\x89\xe8\x23\xcb\xa3\x14\xea\xb3\xd4\x62\x7c\x56\x59\x59\x45\xc6\x7d\x6f\xd1\xd9\x37\xc5\xba\xac\x2c\xf1\x4f\x97\xdb\xb2\x76\x47\x20\xd4\x16\x58\x0d\xc5\xd1\x66\xcd\xd9\x45\x51\xd7\xef\xfd\x25\x72\x78\x57\xf1\xb9\x29\xa0\xce\x5c\x65\xec\xbf\x99\x89\xde\x62\xed\x6d\xd2\x0b\xaa\x8f\x91\x02\xb3\x3b\xc9\x3f\x66\xc5\x7a\xa0\x87\x57\x57\x1c\x1a\x57\x82\x8b\x33\x54\xeb\x24\xad\xc0\xfb\x70\x12\x87\x7e\x23\x81\x7f\x7e\x82\x92\xc5\xbe\xc7\xea\x73\x8f\x46\xc7\x31\x50\x3d\x39\x8d\x03\xe4\xc3\xd9\x08\x2a\x90\xa0\x4a\xca\xbd\x73\x74\x31\xd0\xf3\xdb\x89\xbe\x1e\x9f\xcf\xa6\xf3\xbb\xf9\x62\x74\x8d\xed\x19\xe8\x93\xde\xfc\x76\xd2\xeb\x43\x63\xc7\x8b\xb9\x0f\xb2\xce\xb1\xb2\x17\x8a\xef\xda\xc5\xbb\x1c\xce\x9d\xdf\x5e\x5e\x8e\x28\xe6\x4c\x61\xdc\x11\x94\x77\x51\x6d\x9b\xeb\xd4\xed\x1c\x52\x04\xd7\xd3\x8b\xf1\xe5\x1d\x51\xa8\x86\xa2\x3f\xe0\x25\x1d\xcf\xa3\x3a\x5c\xd7\x8e\x8b\xd1\x6c\xfc\x2b\xd4\xae\xcd\x07\x6d\x42\x4f\xd7\x99\xe9\x4c\xc5\x0d\x6e\x37\xf3\x6a\x3a\x5f\xe8\x99\xfb\xde\xed\x28\xd1\x37\xb3\xe9\xe5\x18\xb2\x04\x17\xc3\xc5\x10\x52\x02\x50\x8d\x37\x9e\x8d\xce\x17\x89\x1a\x4f\xe8\xbf\x02\xf1\x67\x23\xb4\x1d\xa2\xde\xee\xbb\x3e\xd0\x4d\x83\x91\xe8\xf7\xd3\x0f\xa3\x5f\x47\x33\x75\x3e\xbc\x9d\x8f\x2e\x60\x48\xb1\x54\x10\x73\x3f\x18\xa4\xa6\x90\xfa\xf4\x52\x54\x3a\xb7\xc3\xe2\x1c\x06\xc7\xca\x65\xc1\x8f\xea\x7e\x1d\x0d\x58\x88\x8f\xbb\x41\xf9\x6d\xa1\x71\xc8\x28\xaf\x02\x7f\x32\xd9\xd7\xc6\xa6\x01\xe4\x8a\xc1\x5b\x76\x12\xee\xb3\x65\x15\xf1\xb2\x2b\xb2\xf8\x60\x42\xe0\xd3\x54\xf7\x55\x51\xb5\x90\x2e\x77\x86\xe3\xaa\xa0\xad\xed\xbe\xcc\x80\x46\xb7\xe1\x0a\x74\x3a\xf4\x26\x5d\x61\xbe\xe3\x9b\x77\xf7\xc7\xfc\x0c\xbe\x3f\xcf\x53\x6b\x77\x69\xfd\x10\xe4\x9f\x7f\xe7\x6a\xf0\x67\xfc\xbf\xb3\x9f\x5e\xfe\xdc\xf0\xff\x7e\x7a\xf1\xc3\x37\xfe\x9f\x3f\xe4\xe7\x2a\x2b\x3e\x62\x18\x20\xe8\xf5\x43\xdc\x9c\x00\xa4\x65\xa5\xd7\x87\x22\xdd\xd2\x3f\x85\xc4\xf2\xb6\x5c\xef\x41\x87\xd9\x5d\xdd\x3e\x32\x1d\x0f\x69\x0d\x8b\x6a\xc7\xb2\x88\x1e\x3e\xd0\x8b\x87\x3d\xe5\x65\x8e\x97\xc8\x3c\xa5\x2d\x4d\xd2\xc8\x50\x1e\xf0\x50\xe6\x91\x94\xf3\x40\xa9\x21\x20\xa1\x31\x72\xa2\xfd\x92\x4e\x1a\x68\x10\xe2\x35\xf2\x81\x4b\xee\xba\x97\xaa\xee\x10\xa8\x8e\x3e\x08\x23\x21\x4a\x58\xfd\x78\xd4\xa5\x66\xef\x2e\x2d\x84\xe8\x72\xa2\x2b\x73\x9f\x56\x6b\x08\x73\x52\x27\x1b\xf9\x1d\xf8\x25\x98\xd2\xd6\x63\x7d\x65\x0c\x00\x3d\x3b\x98\x61\x2a\x63\xf7\x39\x44\x3f\xc2\x2b\x39\xc0\xc1\x4f\x3f\x94\xfb\x4a\xaf\x1e\x4a\x70\x70\x63\xcf\xda\x75\x39\xcd\x6d\xa9\xb7\xc6\xd4\x09\xea\x51\x23\xfb\x10\x69\x49\x37\x5b\xf4\xfc\x0c\x72\xe7\xe0\x9f\x29\x7f\x6f\xa0\x87\x45\xc7\xe3\xa8\xc8\x03\xff\x1b\x8b\x45\xfd\xf1\x23\xfc\xc1\xb2\x3a\xb6\xaa\x08\x2a\x06\x77\x89\x43\xf4\xb7\x04\xff\x90\x1e\x30\xfa\x4d\xf9\x25\xbf\x32\xdc\xa0\xc2\xc0\x50\xe9\x40\x68\x3e\x7d\x7b\xb9\xa7\xe1\x81\xc0\x6d\xcd\x41\x2a\xf4\x64\xd7\xa5\xb6\x65\x00\xaa\x95\xf0\x89\xc7\xcc\x3e\xf8\x3f\x26\x7a\x6d\x80\x8e\xa6\xf1\x5a\x48\x4e\x41\x4c\x19\x7a\x26\x9b\xf0\x07\x9e\x7e\x83\xef\xa7\xef\xae\x4e\x6f\xff\x72\xfa\xea\x9f\x47\x00\xf2\xb4\xfd\x3f\xfb\xe1\xec\xc7\xa6\xfd\x7f\xf5\xe2\xe7\xb3\x6f\xf6\xff\x8f\xf8\x99\xee\x4c\xa1\xdf\x39\x83\x5a\xc0\x5a\x04\x1b\xbb\x32\xfa\xd3\xab\xc1\x0b\x72\x12\x2b\xa3\x4d\xb1\x2a\xf7\x55\x7a\x4f\xa9\x1a\xcb\x05\x75\xa7\x1c\x1e\x1d\x0b\x20\x1d\x6b\x13\x89\x60\x20\xa8\x5c\x84\x38\x34\x20\x4f\x81\xef\x0c\xea\x0d\x72\xf3\x39\x5b\xe6\x07\x0e\x0c\x14\xee\xf7\x7a\x63\x1e\x85\x4d\x19\x28\x75\x0b\x35\xa0\xf2\x45\x22\x0d\x48\x8f\x75\x9f\x8a\x15\x78\xd0\x54\xa6\x75\xea\xcc\x06\x65\xde\xf9\x06\xdc\x28\x31\x78\xba\xc1\x27\xae\x9b\xdf\x89\xd7\x7f\xd7\xe7\x90\xb3\xb1\xb8\x7b\xd3\x95\xdb\xdb\xec\xd6\x46\xe6\x51\x09\xf3\x08\xf5\x93\x54\x4f\xe2\x23\xe4\x54\xf7\x79\x78\xba\xee\xd3\x03\x16\x1a\x25\xa0\x8a\x5b\x49\xb3\xd3\x9c\x92\x56\xed\x53\x47\x63\x44\x5f\x3d\x94\x92\x12\x9e\xd0\x3b\xd7\x82\x75\xb9\xa5\x51\x87\x32\xdc\xb5\x49\x73\x92\x73\xe2\xb2\x5c\x4e\x8d\x30\xa6\xce\xd7\xd8\x56\xcd\x59\xf0\x96\xd0\x86\x82\x8e\x94\x27\x9b\x17\x1e\x90\xf0\xd5\xe5\x6b\x48\xde\x23\x87\x1a\x85\xa3\x13\x79\x00\xc2\xd9\x88\x95\x87\x75\xb3\xf3\x58\x10\x0a\x8c\x02\x1d\x7f\x32\x9f\x77\x79\xd9\xfe\x92\x90\x95\xa2\x55\xea\xc6\x3b\xfa\x25\x1c\x91\x9f\xd3\xed\xce\x9d\x85\x4b\x10\x89\x5a\x22\x2d\x61\x56\x4b\x3f\x49\x3c\x15\xe0\x11\xcb\x83\xc8\x00\x65\x00\x26\x81\xf1\x2d\x1f\x0b\x0e\x82\x40\x42\x01\x13\xd1\xe4\xd4\x78\xf4\xf1\x09\xe2\x21\xe9\xb0\x11\x42\x62\x10\x45\xea\xbf\x56\x2a\xbe\xd4\x19\x0e\x7e\xd1\xc7\x64\x1f\xf9\xcd\xf4\x56\x1d\xbf\xd5\xf5\x29\x34\x14\x60\xb3\xe4\x2a\xe2\x7b\x53\x41\x14\x14\xce\xb2\x90\x8b\xa4\x9c\xac\x78\xa1\xba\x41\x97\xa3\x3a\xb1\x50\x9e\xc7\x85\x9e\xbb\xd2\xda\x0c\x3c\x24\xf2\x49\x00\x3e\xe0\x1c\xae\x32\xda\xdd\x6f\x94\x1a\xb7\x7b\xc1\x0f\x0d\xab\x36\x3c\xc5\x07\x8a\x3a\x1b\x9b\xa8\x03\x0f\xeb\xde\xb3\xd9\x51\x4c\xed\xb5\x52\xe7\x65\x51\xa7\x59\x61\x39\x8f\x64\xcd\xaa\x86\x8b\x6f\x78\x77\x47\x26\xe9\x88\x41\x55\xce\xa0\x0e\xa0\x03\xec\x4b\xec\x5b\x06\x0d\x1c\x01\x6b\x3e\x81\xd3\xdb\xd5\x47\xde\x2a\x50\x3e\xa8\xb6\xce\xe1\xdb\xe5\x46\xf6\xce\x27\x49\x19\x8c\x9d\x3f\x33\xcd\xe0\x1d\x41\x7c\x8e\x6b\xcd\x52\x80\x53\x97\x95\x7e\x38\xec\x4c\xc5\x13\x91\x3a\x0f\x13\x97\x12\x33\x70\xe0\xe8\xa0\xf3\x49\x78\x1f\xd1\x12\xe5\xc7\x19\x49\xff\x9c\x63\x0b\x51\x05\x20\x25\x4c\x8b\xba\xab\x2e\x9e\x2d\x10\x00\x78\x71\xa8\x36\x69\x96\xa3\xe3\xbb\xdd\xd1\x0d\x44\xd5\x0f\x66\xdb\x85\xda\x43\x57\xae\xe3\x60\xf0\xac\x24\x36\xdb\x66\x79\x5a\xf9\x03\x43\x94\xb2\xc9\x8c\x25\xe1\xe5\x9c\xb7\x18\x01\xfe\x20\x13\x69\xb6\x3b\x22\xe6\xe9\xb6\x9a\x70\x3f\x41\x93\x85\x94\xa5\x90\xa5\xad\x53\x0e\x91\xc4\x16\xa8\x75\x74\x32\x3b\xc4\xd2\x98\x82\x4a\x76\xb0\x81\x8f\x29\xec\x76\x5c\x8e\x3e\x9a\x02\xc1\xdf\xd2\xee\x2b\xa3\xb0\xdf\x72\x81\x52\xc5\x4f\x6e\xee\x33\x06\x96\x9f\x84\x4d\xed\x1a\x73\x49\x66\xbd\xdc\x44\x5b\x75\xb8\xaa\x43\x21\xc3\xed\x5f\xb0\x46\x75\x55\xd6\x79\x5a\xac\xfb\xae\x31\x14\xbf\xe7\xf3\x84\x13\x96\xc7\x76\xe7\x1b\xa5\xd6\x66\x97\x56\xf5\xd6\xa7\xb1\xe3\x6d\x55\x56\xf7\x69\x91\x91\xc6\x5e\x5e\xde\x97\x16\xe8\x32\x6d\x1d\x02\xde\x50\x19\xab\x87\xd5\xd6\x2a\xe2\x85\xf1\x45\xb0\x14\x5d\x07\x66\x8e\xda\xdc\xbb\xfd\x03\xc5\x41\x58\xa1\x4e\xc1\x70\x3e\x84\xac\xa9\xf1\x50\xd8\x66\x79\x06\xda\x80\x59\x61\xb3\xfb\x22\x4b\xf1\xd7\x52\xa4\x8a\x19\x3c\x8f\x19\x1d\x86\x24\x00\x62\x3c\xa3\xf0\x36\x99\x85\x37\x8a\xca\x80\x5d\x9b\x00\x1d\xb6\x47\xbc\xc5\xce\x84\x47\x4b\x3c\x00\x72\xc3\x5a\xd2\xdb\xd2\xdb\xd4\x53\x22\x60\x54\x8d\x38\x3a\xde\x20\xa3\xaa\xd6\x94\x79\xaf\x0f\xbe\x8b\xd6\xf3\x03\xb9\x16\xbf\xad\xb2\xda\x5d\x45\x6e\x52\x6b\xdd\xa6\x53\x6a\xe2\xbc\x06\x0c\xbe\x03\xf8\xe2\xc8\x0a\x46\xd5\x33\x30\x54\x4c\xc3\x71\xcc\xb5\x00\x98\xfd\x63\x7a\x40\x74\xa1\xdd\xdf\xdf\xd3\x9c\x81\x2c\x5c\x06\xb7\x70\x67\x09\xf6\x88\x5f\xe4\x2c\x4e\xe7\x60\x12\x3b\xaf\x77\x8a\x38\x4d\x70\x00\xc8\x05\x5a\x31\x51\x59\x21\x9e\x31\x70\x5d\xf3\x61\x7c\xf4\xad\xa2\x56\xda\x60\xab\xbf\x4b\x9d\x91\xfc\xce\x2f\xab\x27\x9a\x12\xe8\x39\xc0\xd5\x5a\x1b\x8b\x88\x85\x66\x15\x40\x28\xfa\x4b\x22\x0c\x03\x5a\x6b\x04\x86\x65\x06\xaa\x6d\x99\xd0\x87\x6b\x99\xa3\xed\x4f\x60\xad\xf4\xb3\x04\x6b\x85\x64\xd8\xf2\xa0\xf3\x94\x5d\xc7\x2f\x69\xb6\xbf\xb3\x12\x7c\x85\x61\x29\xa6\xaa\xca\xca\x4d\x88\x2a\x29\xc8\x61\x3b\x8c\x13\x22\xac\x3c\xfa\x2d\xa0\x60\xf8\x31\x79\x69\x61\xfd\xfe\x6d\x5f\x1d\x14\x6c\x2e\xa0\x25\x12\x49\x14\xbd\x4a\xf7\x64\xbd\xb2\xda\xba\xc9\xc3\x42\xc1\x27\x0f\x70\x75\xbf\x4f\xc1\x2c\xb3\x0e\x1d\x82\x3f\xd7\x58\x83\x74\xe8\x9e\x7e\x3c\x72\xdd\x2e\xba\x4a\x1f\x1b\xeb\x3a\xb3\xfa\x1e\xfe\x1c\x0c\x7d\x9e\x3e\xfa\x40\x85\xac\xf4\x8e\xb9\xaa\xba\x9c\x17\xb0\xcf\xae\x33\xbb\x2a\x2b\x56\xd9\xce\x6d\xe9\x3c\x45\x0f\x6b\xe9\xce\x74\xe3\x06\x85\xe0\x6c\x42\xe5\x54\x38\x46\xea\xd8\xb2\x1b\x28\x15\x11\xbf\x8d\x8b\xc6\x29\x16\x2e\x15\xe0\xb8\x7b\x30\xb7\x48\x06\x6e\x4d\xea\x86\xc1\xbe\x56\x2a\xba\xae\x50\x25\x99\x3c\x1d\x76\x55\x59\xa3\x98\x2a\x54\x93\x09\x5f\x7d\x79\x68\xb8\xeb\xea\x24\xf2\x77\xf3\xac\x36\x10\x06\x03\x5a\xeb\xaa\x76\x1e\xc9\x8a\x29\xca\xdc\x84\x21\xff\x98\x3b\xf4\x60\x11\x85\x04\x6c\x5f\x31\xef\xd2\x86\xea\x50\x8f\xd5\x4e\x53\xa7\x07\x71\x3f\xfc\x58\x7d\x27\xb8\x9e\x98\x19\xbc\x71\x8c\xa0\x23\xc8\x27\x9d\x9c\xcc\xb6\x87\xe0\x5e\xe3\x85\x25\x3d\xd1\xd3\xa1\x7b\xa5\xe2\x0a\x79\x20\x33\x4b\xc6\x1f\x11\x69\xd0\x3b\xd5\x75\x4d\x3d\xd2\x3f\x4e\x9c\xfe\xc5\x98\x1d\xf2\xe8\x51\xb8\x73\x86\x5c\x2d\x89\xa7\x8c\xea\x7e\xd7\xb1\x8b\xde\x79\xe5\x6e\x14\xd1\x45\x58\xe1\xef\xe2\x99\x45\x2b\x75\xe4\x21\x4f\xdd\xa3\x55\x04\xfd\xd6\xa9\xc5\x34\x11\x51\x8c\xa7\x2b\x72\x09\x69\xc3\xc1\xab\x93\xa3\x08\x70\x31\x0b\xb7\xd6\xf0\x04\xac\x4b\xd6\xc2\x4c\x57\x75\x08\x0b\x72\xe5\x78\xc7\xc2\x8d\x9b\x08\x34\x19\x74\x04\xc7\x30\xe4\x50\x60\x49\x20\xc7\xc0\x82\xb0\x27\xea\x6d\xf2\x87\x6d\x17\x4c\x4f\xe2\xef\x13\x68\x01\xd2\xe4\xb9\x5b\x26\xfc\x17\xc6\x21\xa1\xf5\x1e\xda\x24\x88\x19\x54\x44\xcc\x00\xe9\xb3\x1a\x8f\x52\x0f\xfe\x77\x8f\x80\xc5\x81\x13\xe3\x46\xe6\xae\xdc\x7f\x97\xe8\xef\x0e\xe5\x1e\x4f\x2f\xf7\x5f\xd1\x3e\x28\xd2\x7a\x5f\xa1\x77\x85\x70\x44\xdc\x18\x78\xef\x2c\xd7\xe8\x3e\xc2\xaf\xac\x0a\xfc\x4c\x65\x25\x6b\xb3\x13\x9a\x3a\x41\x63\xd6\x71\x34\x9c\xf0\xc0\xd6\x0f\x46\x35\x4e\x5a\x24\xe8\x37\x6b\xd2\x6a\x76\x77\xe5\x16\xf3\x98\xc4\x8e\xf5\x65\xe5\x4a\x58\x08\xc3\x25\xc3\xe3\x8e\xdd\xa9\xe0\x1c\x9c\xa4\x04\x64\x1d\x56\xab\x07\x60\x39\x79\x00\xf6\xc6\x4f\x06\x58\x2e\x1b\xf7\x0a\x20\x4e\x2c\xcb\x1c\x51\x08\x70\x9a\x75\x19\x79\xdf\xe7\xd8\x49\x0d\xbe\x9d\xe6\x2a\x4f\x11\x08\xc3\xe3\x24\xab\x3a\x2c\x0d\xa4\x46\xb6\xce\x44\xb9\xae\x70\x1f\x75\x77\xfb\xb3\xe2\x53\x56\x9b\xe6\xbd\x73\x59\xae\x33\x63\x55\xf9\x58\x90\x41\xcb\x30\x66\xf0\xd4\x16\xb5\x0d\x61\x5a\xd9\xca\x4e\x1b\x15\xd9\xc3\x45\x64\x95\xdc\xf7\x63\xcb\x04\x03\x1d\x19\x24\x1e\x9c\x0e\x6b\xa2\x9e\xb1\x26\x24\x85\x20\xad\x05\xab\x8f\xd7\xe2\x6e\x81\xe6\x35\x9a\x87\xcc\x76\x46\x05\x8f\x99\xdb\xcc\x82\xfa\x84\x5b\x5b\xc4\x6f\x76\xfb\x97\xd6\xe2\x82\xab\xf9\x65\x95\x6e\xcd\x23\x92\x2a\x81\x3f\x91\x59\x9f\x24\x78\x35\x78\xe1\xeb\xa9\xbb\x57\xe7\x91\xd9\x75\x57\xed\xa4\x8d\x88\x4c\x90\xac\x55\x17\xe6\x91\xdf\x61\x9f\x7b\x81\x0c\x26\xa4\x79\x65\xd2\xf5\xa1\x23\xa8\xc0\x0b\x30\x70\xf7\xc5\x79\x0e\xf7\x74\xd5\x7e\x7a\xd2\x1c\xc2\xb4\xf6\x43\x18\xd7\xe4\xd4\x25\xc4\x13\x0e\xfe\x96\x4f\x51\xcf\x0a\x89\x7a\xd2\x3a\x03\x02\x46\xbe\x2c\x3e\xc9\x38\xcd\x29\xbe\x1f\x06\x2f\xbc\x0e\x01\x74\xff\xc2\xb9\x12\x4f\x7c\x23\x01\x01\x0a\xd7\x52\x3c\x25\x3c\x2f\x90\xe7\xfb\xe9\xd8\x1d\x04\x61\x67\xfb\x99\xc2\x85\xb2\x6d\xeb\x32\xcb\x84\xa4\xe4\xd0\xe3\x45\x82\xb6\x36\x21\xa4\x60\x8c\x7c\xd5\xdb\xca\xdd\x04\x60\x6e\x64\xf4\x40\x3b\xbf\xc4\x6e\x0e\xcd\x20\x2c\x15\x88\x4c\xdf\x5d\x61\x03\xdc\x17\x45\xb8\x03\x17\x3e\xf1\x1b\x8a\xb5\x35\x7d\x77\xf5\xc9\xad\xc3\xcc\xd2\x18\x79\xd7\x51\x31\x10\xd8\x1d\x1b\x97\x54\x54\x02\x6e\xd9\xe7\x3a\x41\x1d\x6d\x8a\x0f\xa1\x01\xbb\xdf\x13\xbf\xd4\x2a\x2d\xdc\x49\xb5\x81\x5a\x01\x32\x81\xd1\xf6\x50\x1d\xdb\x03\x2c\x14\x55\xac\x76\x5b\x34\x42\x0c\x7f\x43\x75\xfc\x97\xfb\x41\xfc\xef\x19\xe1\x7f\xff\x39\x19\xc0\x67\xf0\x1f\x2f\x5f\xfc\xf8\xb2\x99\xff\xfb\xe9\xc5\x37\xfe\xff\x3f\xe4\x27\xd6\x7f\xfa\x6f\x07\x93\x56\xff\x5d\xff\x37\x60\x44\xfd\xef\x5a\x10\x80\x55\xff\x75\x11\xbf\x67\x83\x06\xe6\xd6\xfe\x46\xcc\xef\x6f\x42\xdc\x82\xca\x8b\x04\x33\x4a\x8e\xfe\xb7\x77\xfa\xad\xa9\x3e\x9a\xdc\x1c\x82\x74\xcf\x05\x21\xe4\x00\x35\xcb\x0a\xf1\x40\x4f\x3f\xb9\x53\x1d\xda\xef\x9d\x78\xd2\xa4\x43\xfd\x05\xa5\xe8\x1b\x20\xd3\x6e\x19\x18\x78\xdf\xb3\x48\x53\xd7\x1d\x16\x34\x18\x5d\x0c\x54\x5b\x04\xe6\x99\xde\x75\xa0\x48\x5b\xc8\x4b\xc9\x2b\xe0\x51\x98\x9e\x45\x20\x41\x61\x00\x81\xc9\xf4\x40\xd4\x93\x30\x18\xaa\x6b\x30\x6e\x66\xd3\xf3\xdb\x19\xe0\x63\x91\x73\xff\xed\x7c\x31\x5e\xdc\x2e\x46\xfa\xdd\x74\x7a\x01\x43\xcc\x92\x14\x6f\xf4\xd5\x14\xe1\x9a\xb7\xf3\x51\xa2\x3c\x56\x14\xe1\xa3\xf3\x37\xee\xbf\xdf\xde\xce\xc7\x30\x5c\xe3\xc9\x62\x34\x9b\xdd\xde\x2c\xc6\xd3\x49\x9f\x01\xa0\x5a\x00\x40\x89\x4e\x01\x51\x9f\x2a\x46\x7d\x0a\x7d\x9b\x20\x69\x33\x5f\xcc\xc6\xe7\x0b\xf9\xb1\xe9\x0c\x75\x6e\x42\x1f\xf5\x64\xf4\xee\x6a\xfc\x0e\xd9\x2b\x04\x27\x47\xdf\x03\x49\xc7\xf8\xda\x0f\xc3\xbb\x36\xa6\xf4\x08\x7e\x54\x7d\xb1\xbe\xfc\xb7\xa3\xfb\x5f\xf3\x67\xf0\xfd\x74\xfe\x9f\xab\xff\xf8\xf2\xec\xd5\xd9\x8f\x6d\xfd\xc7\x17\xdf\xce\xff\x3f\xe2\x67\xc1\x17\x2c\x6f\xc0\xf9\x0a\xf6\x69\x80\x1a\x8e\x70\x45\xea\xfe\x08\x60\x62\x48\x2d\xc0\xf4\xfa\x92\xf8\x0f\x42\x6a\x1c\x6c\x23\xf2\x7d\x25\x08\x9b\xf0\xab\x53\xc9\x0a\xd0\xeb\xeb\x47\xb8\x41\x21\x1f\xbb\x7c\x78\x59\xf5\xfa\x10\x6d\x80\x48\x3b\x1c\xc6\x2a\x1c\xc6\xc4\xec\x95\x6d\x81\xc3\xb4\x36\x00\xce\xe0\x3f\xd6\x5d\x24\x60\x9b\x26\x97\x9e\x7b\xff\x6b\xa5\xb8\x2f\xad\x84\x7e\x7b\x74\x82\xcc\x65\xcf\x8b\xf7\x00\xd3\x8c\x55\xea\xac\x8f\x9c\xf0\x50\xc1\xe9\xdf\xed\xf9\x5f\xa2\xb2\xd8\x4e\xce\xf7\xd3\x0e\xf0\x8f\x3a\x46\xfa\x8e\x58\xa0\xc0\x70\x89\x2c\xf5\x81\x7e\x61\x5d\xb6\xa0\x0d\xc8\xc2\x9d\xf6\xdb\x54\xeb\xd1\x8c\x60\x49\xe9\x2e\x33\xf6\x8d\x52\xcb\x3e\x42\x5b\xcd\xce\x8d\x43\x4b\xc2\xf0\xa4\x29\x7d\x62\x7b\xfd\xa6\xde\x49\x34\xdc\x6f\x94\x5a\xf5\x8f\xb0\x95\x6f\x3a\xda\x02\xf4\x5a\x4d\x3e\x9c\xa8\xd2\x37\x51\xfe\xb6\x8c\x45\xed\x25\x43\x15\xf8\xa9\xf1\x13\xcb\xaa\xe3\x81\xee\x0b\x77\xe5\x5e\x89\x56\x79\xf2\x81\x63\x70\x8f\xe6\xea\xf0\x1c\xf4\xeb\x3e\x05\xe0\x3c\x61\x48\xdc\x02\x66\xdd\x08\x19\x5d\xad\xb5\xe1\x51\x01\x5e\xb7\xe3\x5f\x1a\x28\xf5\x52\x2c\xb4\x1b\x14\x16\xfd\xcf\x58\x65\x1c\xd6\x27\x6d\x53\xf0\x8c\x21\x52\x89\xa5\x22\x44\x3f\x9a\xb7\x61\x16\xc4\x08\x5b\x19\x6d\xb6\x10\xdf\xf4\x41\x87\xa8\xcb\x2a\xb5\x7a\xb3\xaf\x0a\xa8\x42\x6e\x3d\xe3\x24\xec\xda\x73\x78\x73\xaf\xcf\x2c\xc9\x89\xf6\xea\x98\x58\x5f\x0e\xd1\x43\x16\xc8\x6c\xbf\xe8\x8f\xdd\x9b\x61\x15\x35\x3a\xa0\x9e\x6a\xbe\xd7\xf7\xec\xa2\xd7\x7f\x25\x16\xc4\x1c\x6f\x40\xe7\xee\x06\xe4\x57\xc5\x82\x82\x7a\xba\x27\xfe\x2c\x65\x53\x76\x40\x9f\x58\x99\xb5\x82\x35\xdb\xb9\x15\x37\x50\xc4\x03\x60\xb0\x88\x81\x1a\x84\x1f\x6a\x2f\x75\xeb\xf1\x94\x2a\x16\xe1\x5d\x1b\xbb\xaa\xb2\xa5\xfb\xfa\x43\xf9\x08\xa7\x05\xc2\x54\x80\xbf\x81\x01\xdc\x47\xa7\x86\xa5\x32\x80\x42\x82\xf1\xf6\x04\xf8\xda\xa6\xab\x87\xac\x30\xa7\x95\x49\xd7\x9e\xb4\x29\x08\x73\x86\x01\x21\x7a\xc5\x86\x89\xc9\x4b\x62\x65\x40\xf0\xbb\xfc\x72\xfc\xc9\x98\xb4\x32\xd8\x0a\x3b\x50\xcf\x70\x3e\x85\x10\x20\x64\x4a\x18\x2b\xe0\x56\xb5\x3b\xdc\xb0\x8e\xa2\xd9\x0d\x75\xac\x1b\x90\xbc\x8a\x72\xba\x95\x01\x79\x84\xb2\x3a\x48\x6a\xce\x55\x9a\xaf\xf6\xc0\x4e\xa0\x42\x46\x20\x2b\xcc\xe7\x9d\x29\x2c\xd2\x6e\xad\x91\x4f\xb4\x40\xfe\x1e\x9c\x10\xa2\x33\x83\x7c\xbf\xd5\x30\x3a\xa9\x0d\x13\xc1\x21\x60\xdb\x30\xe3\xad\xf1\xc2\x84\xda\xf2\xc0\xe0\x4d\x3e\x98\xd3\xf5\xba\xc2\x72\x08\x45\x34\x92\x9d\x1d\x81\xc4\xd8\x97\x9f\xf2\x8a\x3e\x8a\xc6\x25\x26\x23\x8e\xd7\x94\x52\x3f\xf4\xf5\x08\xf7\xad\x5b\xbf\x97\x55\xb9\x6d\xca\xba\x34\xa5\x6c\x8e\x50\xdc\xb8\x71\x45\xd8\x8c\x50\xae\xa9\xcb\xc0\xb1\x60\x93\xd0\x42\x9b\x34\xb1\x3e\xd6\xac\x2a\x53\x5b\x82\xa9\x3d\x89\x1b\x12\xc4\x18\xac\x8f\x15\xd1\x71\x10\xeb\x95\xdb\x25\x59\x31\x50\x93\x92\xed\xb2\x10\xe1\x11\x80\xb9\xa6\xa1\x61\x56\x27\x58\xac\xee\x17\x68\x9a\x89\x9a\x86\x18\x96\xa4\xa1\x67\x79\xdf\x87\xb4\xe8\x32\x66\x5e\x48\x4d\xd0\xbc\xbf\x84\x66\x11\x99\x5a\xd4\x9a\x5a\x72\x6d\xd8\xb8\xaf\x9f\x4c\x81\x4c\xb4\xab\x07\xc4\x46\x21\x9e\x90\x44\x7a\x55\xd7\xc9\xf1\x05\xd3\xe7\x06\xb9\xda\x55\x86\x1a\xb0\xab\xca\x87\x6c\x99\xd5\x61\x1f\x43\xae\xc6\x73\xc6\x36\x39\xda\x28\xdb\x11\xaa\x95\x03\xb1\xe0\x21\x76\x78\x1a\x46\x23\x40\x43\x1e\xcb\x7d\x4e\x6a\xcc\x69\x30\x14\xb9\x67\xb6\xfa\xd1\xad\xd1\xda\x54\xae\x53\x17\x66\x97\x97\x87\xc0\xb8\x8d\xb6\xbc\xe3\xcf\xd2\xa6\x23\x2e\x3b\xaa\xee\x56\x9d\x66\xad\xcb\x23\xa2\xfc\xf8\x63\x4a\xbc\x71\x3e\x2c\x17\x77\xae\xeb\xab\x94\xf7\xf6\x18\x46\x04\x7c\x30\x09\x11\x08\x01\x85\xa5\x73\x57\xee\x43\xba\xfe\xcb\x9a\x06\x8e\xa8\x37\x3b\xb4\x7e\xdc\x0d\x82\x72\xdc\x89\x6a\xe0\xfa\x53\x10\xef\x92\x20\x67\x59\xc6\x8a\xe3\xf4\x89\xd3\xb5\xbb\x7d\x6d\x2a\x5d\x98\x1a\x14\x16\x15\x37\x5e\x9c\x37\xce\xbe\x03\xe3\x73\x34\x9d\x6b\x93\x03\xd1\x14\xc1\x60\xe8\x36\x14\xf7\x56\x01\x81\xd2\xd0\x62\x89\x18\x2a\x75\x05\x75\x7c\xbe\x9e\x90\xf3\x51\x6e\xfc\xd6\x0d\x44\x3a\xe8\x92\xb8\x23\x30\xf0\xfa\x75\x2c\x03\x36\xe1\x4d\x42\xae\x54\xb7\x82\xb8\xc8\x16\x25\xdd\x5c\xd7\xf2\x3c\xff\x02\x71\x03\xeb\xdc\x06\x38\xd4\x71\x9f\x53\x42\x48\x9d\x9d\xac\xfa\xde\x10\xa9\x9f\xfa\x4c\x97\x7b\x68\x90\xe5\xba\x47\xf2\x9f\x06\x81\xf4\x93\x42\x98\x73\xbd\x78\x3f\x5c\x40\x80\xca\x4b\x84\x2a\x88\x76\x79\xcd\xeb\xe9\x6c\xfc\x6e\x3c\x19\x5e\x79\x09\xd3\xe9\x87\xc9\xc8\xcb\x7b\x06\x2a\xdd\x59\x78\x14\x7f\x45\xf1\x57\x7c\x81\xba\xac\x6d\x9f\xce\x48\xac\x74\xa8\x7f\x1d\x5e\x8d\x2f\xf4\xf9\xed\x6c\x36\x9a\x2c\xbc\x9c\xea\xe5\x6c\x7a\xdd\x68\x9a\x7b\xf7\xcc\x33\xb6\x0e\xe7\x4c\x22\x70\x75\x07\xbc\xba\xa3\x0b\xd6\x96\x1e\x5f\x5f\x8f\x2e\xc6\xc3\xc5\xe8\xea\x4e\xdf\xcc\x46\xe7\xa3\x11\x44\xfa\xe6\xa3\xc9\x62\x34\x39\x1f\x25\xaa\xb3\x6b\x2d\x05\x58\x21\x9e\xeb\x05\x6e\xb5\x17\xb8\xf5\x4c\xbd\x9e\x76\x20\xd1\xa3\x31\x04\x21\xdb\xc1\xe6\xe7\x18\x7e\xa5\xc0\x38\x84\x36\x9b\x4c\x04\x0d\x06\x84\xf6\x70\xfb\x6e\x84\x88\xf4\x15\x44\x34\x2f\xc7\x8b\xa3\x91\x68\x94\x62\x1d\x4d\x16\xe3\xd9\x48\xcf\xc6\xf3\xbf\xb8\x51\xa5\xa9\xff\xb7\xdb\x21\xc7\x2b\x17\xef\xdd\x93\x1a\xef\x01\xd9\xef\xbb\xe9\xed\x00\x47\xca\xc7\xb3\x67\xee\x1b\x9e\x89\xe1\x7c\x3a\xa1\xe8\xf0\xdc\x8d\xe0\x68\x3e\xc7\x68\xb3\x72\x8d\x69\x2b\xc3\x4e\xa6\x7e\xc8\x17\xd3\x76\xdf\x40\x2b\x96\x34\x61\x71\x96\x70\x31\x28\x31\x65\xa1\x21\x03\xa5\x7e\xee\x47\xcc\xbf\x1b\xc9\xfc\x8b\xdf\x99\x4c\xf5\xf9\x78\x76\x7e\x7b\x3d\x07\x15\x59\xa4\x9a\xf0\x7f\x92\xd4\xbd\x41\x44\xfd\x78\x08\xb9\x9f\x88\xf0\x73\x4c\xf1\x1c\xd4\xdd\x79\x07\xa8\x88\x30\x78\x38\xb9\xd3\x37\xa3\xd9\x7c\x3a\x69\x06\xf5\x75\x07\x9d\x82\x8c\xee\x4f\x67\xaa\x3b\x92\x4f\x04\xd5\xe7\xef\x87\xae\x41\x6e\xb3\x51\x48\xbb\x41\x2b\x21\xe7\x40\xb5\xa9\x83\x1b\xd3\xf0\xf4\x42\xe6\x77\x5f\x4e\x67\x8a\x83\xff\xef\xa6\xd3\x8b\x0f\xe3\xab\xab\x04\x9f\x30\x5f\x4c\x6f\x6e\x86\xef\x46\x6e\xac\xae\x6f\x6e\x5d\xc3\x2e\x87\xe3\xab\x5b\x64\xac\xb8\x1e\x5e\x5d\xde\x4e\xce\xf1\x69\x34\x10\xc3\xc9\x85\x72\xa3\x87\x94\xd4\xe7\xd3\x6b\xb7\xc8\xa3\x9e\xce\x20\xd3\x30\x9a\x4b\x0a\x87\xf3\xf7\x3c\xa0\x38\xf6\xef\x87\xbf\x8e\x80\xd1\x81\xb4\xab\xbf\x24\x3e\x3f\x1f\xf0\xe8\x70\x17\x23\xba\x09\x85\x4f\x8e\x38\xa7\x1b\x02\xd5\xa3\xe1\xe2\x3d\xe4\x3c\xa0\x29\xc3\x2b\x3d\x9e\xfc\xf9\x76\x76\xd7\x50\xac\x86\x77\xc2\xa6\xb8\xfb\x6e\x2e\x16\x54\x83\x98\x3a\x26\xa3\xf6\x42\xce\x73\x6c\x72\x68\xe4\x40\x7d\x01\xc3\xb6\x20\xce\x76\xe3\x17\xf5\x30\xac\x2f\x75\x2c\x51\x04\x04\xdc\x30\x38\xe1\x39\x6e\xf3\x88\x07\x35\xf9\xb8\x15\xf2\x71\xff\xa9\xaf\x87\xa1\xa6\xcf\x1d\x59\x82\x4a\x3a\xb8\x96\x26\xb7\x26\x48\x97\xc4\x74\xb9\x78\xe4\x33\xb3\x5b\x9b\x47\xb2\x49\x7b\xd8\x97\x11\x87\xb8\x06\x9d\x24\x3d\x82\x17\x84\x9a\x89\xc7\x82\x6c\xe2\xe2\x45\xe5\x5a\x66\xbb\xab\x7d\x59\x32\x5f\x1d\xb8\xd4\xf1\x98\x04\x4f\x47\x37\x3a\xe8\x30\x65\x37\x14\x74\x23\x52\x70\x62\xa7\x1a\x7d\xbf\xdb\xc1\x7c\x10\x0b\x6d\x22\xd8\x48\xa8\x70\x11\x3c\x5b\x71\x19\xe1\xbe\xa8\xab\x8c\xab\xe0\xa1\x82\x0e\x3c\x1d\xc2\x99\xd4\x6e\x64\x0e\x44\xb0\xb9\x29\x2b\x28\xc8\x93\x72\xac\x70\xa5\xea\xd4\x0b\x22\x42\xc7\x70\x37\xb1\xfa\x0c\x5e\xf2\x92\xfc\x96\x84\xfe\x8e\x95\x9e\xee\x1f\x95\x6a\x16\x7a\x36\xe8\xc4\x9d\xcf\x54\x6e\x00\x23\xde\x55\x1f\x4f\xa8\x23\x56\x9d\x43\xcf\x2c\x10\x8c\xcb\x0b\xae\xfb\xe2\xc1\x8b\x08\xc1\x05\xdc\x54\x41\xc7\x4b\x94\xff\x61\xb7\x54\xa3\x5b\xcb\x43\xdc\x3a\x58\x24\x77\x50\xcd\x99\x66\xf9\xbe\x82\xf8\x30\x28\x46\x45\x51\xd3\x30\x1a\x0d\x0f\xee\x97\xbe\xbe\x46\x1e\x4f\xb1\x11\xc0\x5d\xa5\xe8\xe3\x70\x85\x5b\x63\xd1\xbe\x6a\x1d\xa3\x50\xf7\xca\x58\x5f\xd8\xc7\xe6\xd4\x35\xfa\xa8\x32\x14\xc0\xd9\x64\x39\xd4\x11\xa6\x8f\x76\x4f\xd8\x5a\xa0\x32\xdd\x57\x20\xdb\x62\xee\x31\x6c\x40\x9e\xf3\x74\x3e\xd6\xe7\xa6\x22\x16\x4b\x00\x69\x22\x80\x40\x79\x36\x1c\x2e\x6b\x6e\x04\x81\xa1\x0e\x22\xb0\xc7\xd6\x69\x56\x78\x3e\x8d\x5e\x7b\xb0\x54\x6b\xb0\x7a\xee\x1a\x8d\x00\x8a\x4d\x95\x15\x40\xe5\xd9\xba\x62\x87\x38\xa9\xb5\xc4\xfb\x59\x97\x6a\xcf\xfc\xdb\xdc\xc8\x81\x52\x67\x2f\xfa\xfa\xcf\xa2\xa0\x21\xd1\xbf\x9a\x62\x8f\x0b\x33\xaa\x91\x18\x84\x1b\x44\x18\x07\x1e\x2e\x26\x13\xc5\x3e\x42\x30\x2b\x17\xdc\x9a\x5d\xf7\x68\x60\xf5\x49\xf9\xa6\x8f\x01\x99\x7d\xe5\xf5\x76\x55\x54\x65\xf1\x88\x4b\x2a\x0e\xe4\x56\xc6\x66\x6b\xbc\x4d\xf9\x2a\x0c\xff\x47\xb7\x7f\x80\x1f\x2c\xab\xad\xda\x55\xd9\x36\xad\x0e\xa2\xde\x02\x50\x28\xfe\x9e\x12\xaa\x3b\xd2\x3a\x2e\xef\xc0\x3a\x1e\x2c\xbd\x85\x2b\xd7\x26\xcf\x56\xf5\x69\xb9\x39\xcd\xd3\x47\x15\xb8\x70\x49\xcf\x4a\xdc\x14\x59\x43\xb0\x00\x33\x36\xa1\x88\xe7\x39\xc4\xcc\x18\xfd\x76\x5e\x16\x75\x95\xae\x6a\xeb\xe5\xe2\xc7\x91\xa1\x9a\x83\x58\xf1\x46\xbf\x2b\xcb\xb5\x8d\x4d\x24\x15\x18\xad\x91\xe1\x33\x00\x75\x1b\x21\xca\x72\x5f\xbb\x41\xc2\xca\xde\x55\xb9\x6b\x5b\x20\x67\x84\x41\x55\x90\xed\x0f\x6f\x53\x7f\xbf\x6b\x54\x83\x53\xf1\x26\x96\x8f\xa1\xe0\x6b\x41\xb2\x8d\xdc\x67\x67\xb0\x23\xd5\xcb\x44\x9f\xfd\xac\xdc\xaf\xcf\x07\xfa\xff\xfd\x7f\xf4\xd9\x8b\x33\x6d\x6a\x6d\xcd\xdf\x07\xc7\x4c\xb9\xee\x34\xe5\x91\x1d\x57\xc1\x8e\x03\x48\x77\x15\x9a\xed\xe5\x01\xf8\xa0\x3a\x2e\x0f\x70\x76\xd6\xd7\xc3\xba\x2e\xab\xc2\x1c\xac\xbe\x34\xc6\x0e\xf4\xb8\xe0\x22\x02\x3a\x4b\x89\xd5\xfa\xf8\xa5\x56\x97\x95\xb2\xc6\x40\x8c\x9b\x19\x76\xc3\x1e\x70\xab\xb7\x2e\x13\x0e\x98\x7f\x4a\xb3\x1c\xeb\xf7\xaa\xfa\x10\x76\x04\xd4\xe6\xfd\x7f\xec\xbd\xfb\x73\xdb\x3a\x96\x2e\x7a\x7f\xc6\x5f\x81\xeb\xba\x67\x62\x4d\x31\x4c\x6c\x27\xd9\x8f\xf4\xed\xba\x8a\x4d\x27\xea\x71\x24\x8f\x24\xef\x74\xce\xa9\x53\x33\x94\x04\xd9\xec\x50\xa4\x86\xa4\xec\xad\xf9\xeb\x6f\x61\x3d\x80\x05\x92\xb2\x9d\x7e\x9e\x99\xda\xae\xea\xea\x6c\x5b\x22\x41\x10\x58\x58\x8f\x6f\x7d\x5f\x0e\x96\x0a\xb4\xdf\xef\xe9\xa5\x2c\x4b\xee\x6a\xc4\xfc\xab\x91\x4d\x80\x91\x03\x49\xf9\x76\x83\x48\x48\xf1\xa8\x94\x9f\xed\x85\x5e\x1b\xc3\x87\x4b\x8d\x62\x91\xbb\xaa\xc2\xfd\xd7\xa6\x39\xc6\xb6\x40\xb2\x08\x42\x55\xb8\x20\xb2\x67\x38\xb1\xc4\x87\xfe\x9c\x97\xa0\xc4\x4b\x38\x1d\x84\x44\xfb\xad\x23\xc1\x75\xd0\xb1\x56\xfb\x66\x0b\x1c\x29\xde\xb3\x58\x96\xc5\x12\x8d\x15\x38\x27\xbc\x66\x37\xd6\x8f\xc1\xea\x4c\xb9\x7e\x1e\xe3\xfb\x9d\xc9\x49\x88\x40\x05\x8c\xef\xcf\x60\x4f\x07\x2e\x8a\x50\xef\xaa\x4b\x9d\x9e\x35\x2d\x92\xf4\x93\xb3\x81\xc0\xe2\xda\x21\xa1\x7a\x7c\x56\x04\x93\xc0\xa2\xf2\xcd\x5d\x55\xee\x6e\x89\x0b\x58\xa6\x55\x28\x19\xa6\xb2\x42\xef\xb6\x5b\xb4\xc3\x79\xf9\x60\x77\x51\x6a\xff\x7e\x40\x8d\x3e\xa5\xde\x8f\x43\xaa\xf4\x8a\x12\x48\xb8\x70\x36\xdb\x7c\xcf\x5c\xd4\xec\xb9\xc8\x5d\x11\xb5\xc4\x4b\x2e\x5d\x6f\x09\x8b\x81\x44\x8a\x1f\x8f\x5b\x24\x8b\x3d\xdf\xdc\xb5\x8a\x57\x65\x6e\x57\x79\x1d\x16\x03\x59\x2f\x82\xb5\xd7\x37\x1b\xc0\x2e\xa3\x5a\x21\x8c\x68\x5f\xee\xf0\x9e\xc4\xf4\xec\x37\xea\xca\xcd\x70\xa4\x8f\xe8\x3b\x9c\xf4\x3c\xce\x06\x60\x3b\xb7\x76\xb6\x22\xea\x43\xc1\x73\x05\xff\x0d\xf2\x76\xd0\x9b\x08\x0f\x8b\xbf\x74\xf4\x74\x45\x7a\x8b\x8b\x90\xf7\x04\x3e\x8d\x4f\x4f\xa2\xf8\x1a\x98\xfa\x20\xf7\x07\xcf\x73\x9c\x65\x03\xc4\x30\x00\xd2\xa1\x5c\xeb\x75\xb6\x6e\x80\xb5\x79\x09\xd2\xc7\x6f\x5f\xff\x8f\x81\x62\x09\x74\xee\x6b\xd8\x35\x8e\x92\xbb\xbe\x4b\x2b\xe8\x24\x85\x6b\x65\x03\xbd\x30\x85\xa1\x56\xda\xe0\xba\x62\x6c\x01\x85\x07\xae\x7b\x01\xed\x3c\x1f\xe8\xd3\xd7\xaf\x4f\xed\xb1\x8f\x9a\x7c\x49\xac\xa7\x65\x6d\x8a\xb8\x1f\xe3\x79\xed\x03\x0f\xd8\x40\xbe\x14\x6a\x1e\x21\xa1\x12\xb7\xef\x03\x7a\xc6\xe1\x08\x9f\x22\x8c\xe7\xb4\x68\x97\xdd\xd3\x06\x06\x68\x47\x03\x05\xff\xdf\x20\x6a\x7f\xc6\x4f\xfc\x6a\x65\x4d\xb1\x8d\x6d\x56\xff\x76\xf5\xf1\xfa\xea\xe5\x69\x7c\xf2\x57\xc6\x82\x3d\x8e\xff\x7a\x77\xfa\xe6\x5d\x9b\xff\xe9\xed\xeb\xdf\xf0\x5f\x7f\x9f\x9f\x8f\xe3\x1b\x7d\x95\xcc\x66\xc9\x54\x7f\x4c\xc6\xc9\x74\x78\xa5\xaf\x6f\x3e\x5c\x8d\xce\x5d\x9e\x4d\xfd\x42\x50\xa7\xd3\xf8\x24\xd2\x97\x66\x51\xed\xac\xeb\x7d\xf2\xd3\x4f\x3f\x29\x15\xda\x98\x93\x9f\x7e\x3a\x89\xe0\x2f\x40\x2b\xe1\x71\x31\x97\xe5\xae\x58\x91\x2b\x33\x2a\x96\xb1\x52\x6f\x4f\xf4\x65\x95\x16\xdf\x72\x1b\x6b\x36\x15\x90\xce\x5d\x66\xeb\xe6\x4e\x5f\xe6\x65\x59\x45\xfa\x43\x59\x37\xf6\xe3\x9f\x87\xfa\xf5\xe9\xc9\xc9\xeb\x97\x27\x67\xaf\x4f\xf4\xcd\x6c\xa8\x54\x72\x6f\x2a\xa8\xa7\x64\xb5\xc0\x8d\x1f\x30\x4b\xf7\xa6\x5a\xa4\x4d\xb6\x09\xb0\x45\x22\xfc\x66\x68\x02\xf2\xbc\x81\x74\x39\x13\xf3\x10\xb5\x43\x6e\xcf\xdc\x55\xac\xd4\xff\xe2\x26\x30\x80\x53\x65\x15\x80\xca\x41\xc1\x69\xd5\x6e\xaa\xba\xb2\x71\x5a\xa5\x3f\x5e\x5f\xc5\x7a\xd4\x20\xb3\x1e\xb8\xbe\x2c\x6d\xa3\xea\x1d\x54\xc5\xca\x4a\x12\x1e\x5e\x11\xb9\x60\x48\x78\x18\xb9\xab\x9f\x46\xfa\x0e\x79\x9e\xee\x1c\x04\x4d\x15\xbb\xcd\xc2\x54\xf6\xf5\xc4\xff\x5b\xa9\xeb\xca\xa4\x1b\xeb\x27\x2a\x21\xb5\x8d\x54\x1e\x9b\xb2\xf6\xa1\x22\x16\xcf\x8c\xef\xd9\x6d\xac\x2f\x93\x3e\xa4\xfb\x90\xee\xa9\x29\xf1\x3c\x82\x38\x1d\x95\xdd\x75\xd6\xc4\xfa\x03\x1f\x81\xa0\x15\xfb\x28\x61\x23\xd7\x69\xa9\xd2\xd6\x94\xa2\xc1\xbf\xf7\x5e\x5a\xdc\x0b\x18\xa0\x78\xd0\x2f\x5f\x7a\xbd\x1a\x24\xfe\x50\x92\xad\x16\x3e\x0b\x60\x85\x3c\x67\xbe\x81\xaa\x6e\x1d\x8d\x51\xf0\x82\x7a\x07\x1c\x49\xd4\x40\x5d\x6e\x0c\xf3\x49\xe6\x7b\x85\x53\x06\x15\x76\x77\xeb\x6d\xba\xfc\x66\x23\x84\x97\x2f\x9b\xfd\x96\x5a\xbd\x90\x3e\x30\xb3\xbf\xa4\x17\x7c\x68\x4b\xc0\xcc\x62\x74\x44\x00\x49\xfd\x70\x57\xea\x95\x59\x42\xa0\xc7\xed\xc1\x18\xaf\x2f\xd3\x82\xdb\x85\x9b\xb2\xc4\x45\xfb\x60\x98\x77\x03\x08\x8d\x70\x65\x36\x77\x59\xf1\x4d\x2f\xd3\xca\xac\x77\xc0\x61\x05\xdd\xb4\xbe\xbe\x2a\x4e\x62\x0a\x55\xcb\x6a\x85\x4d\x1b\x34\x29\xaa\x45\xbb\x49\x0b\x7f\x61\xc0\x03\xaf\x9b\x2a\x6d\xcc\xad\xef\x5f\x2e\x34\x4b\xa2\x64\xcb\x5d\x9e\xb2\x93\x0a\xd9\x49\x56\x01\x37\xbf\x6e\xf3\xb4\x48\x43\xea\xb1\x2f\x77\xa6\x80\x67\xd8\x9a\xf4\x1b\xb8\x4b\xf2\x95\x47\xf6\x4f\x76\xc2\x10\x97\x44\x29\x88\xb5\x67\xad\x01\xe4\x02\x32\x1e\x65\x4b\x13\xab\xc9\xee\xd0\x6b\xad\x3b\x6b\x5e\x2e\x25\x22\xc1\xf4\x8c\x0a\x78\x0b\x75\x08\xa1\x18\x8c\x52\x1f\xd3\x92\xad\x6e\x19\x5d\x0a\xd1\x13\xd4\x87\x89\xc9\x48\x3d\x64\xf5\xdd\xe0\xbd\xbf\x15\xc9\xfc\x05\xad\x2a\x65\x05\xaf\xf8\xd6\x34\x60\x82\xb0\xc1\xf3\x21\x2d\xec\x7f\xfa\xaf\x2a\xfb\x19\xda\x20\x10\x1d\xb9\x4d\x4d\xcd\x38\xdb\xcc\x2c\x71\x98\x98\xfb\x2a\xcc\x03\x0e\x78\x5b\x95\xb7\x55\xba\x41\x0e\x19\x54\x07\xe7\x16\x52\x04\xdf\x48\x42\x50\x7b\x17\x44\x8f\x62\xa3\x6d\x71\x0b\x9b\xa9\x64\xe2\x08\xdc\xbd\x8c\x68\x79\x30\xba\x30\x62\x5e\xa5\x12\x3f\x5e\x73\x5d\x56\x8b\x4c\x58\xe7\xb2\x02\xa8\xdb\xca\x14\x60\x74\xe8\x46\xe4\x8d\x62\xbb\x75\x5a\x7f\xc3\x3f\x95\xf6\x3d\x55\x86\x53\x3c\x41\x0f\x27\xfc\x97\xb8\x9b\x62\x21\x5d\xd8\x3e\x4b\x53\x41\xe7\x4f\x65\xea\x6d\x59\xd4\x99\x63\x63\x59\x23\xa7\x0c\xcf\x72\xdf\x5b\x86\xd8\x93\x29\x5f\x51\x2b\x59\xb0\x8c\x82\x30\xec\xa5\xe4\xc5\x78\xe4\x52\xba\x91\xa4\xa2\xbc\x11\x6f\xab\xb4\xc9\x6a\x6a\xf3\x57\xa9\x0d\xe9\x89\xaf\x74\x57\x37\x5e\x38\xda\x2b\xe0\x83\x6d\x13\xd9\x50\x6c\x5b\x35\xfa\x36\x45\xe2\xda\xd8\x29\x55\xab\xd6\xea\x6e\xee\xcc\x3e\x42\xab\xc1\x2b\x4f\xac\xb6\xe6\x2e\x58\x88\x8e\xd2\x34\xcf\x8a\x6f\x2e\x0d\xbf\x12\x7d\xbc\x21\xbb\xea\xae\xf6\xbc\x6b\x2e\x9a\x2f\x31\x66\x5f\x67\xb9\x03\x60\x29\xff\x24\x91\x66\x80\x2e\x10\x38\xd9\x81\x54\x86\x88\x76\xcd\xa6\x73\x23\xca\x6a\x11\xee\x10\x17\x7f\xcd\x2c\x3a\xee\x33\xd0\x8d\x6f\x07\x80\x19\x19\x6b\x36\x87\x9c\x44\xb7\x63\xac\x01\x71\x48\xf4\x61\xae\x57\x19\x06\x62\xf6\xea\x5b\x81\x7f\xcd\x78\x55\x5b\xf3\x64\xfa\x96\x3b\xc5\xcb\xba\x79\x28\x5f\xd6\x8d\xd9\xea\x8d\x69\xee\xca\xd5\xcf\xfa\xf8\x64\x60\x5f\x87\x8f\x4d\xe4\x5c\x81\xa9\x3f\x3e\x85\x4f\x20\xc8\x0a\x97\xbd\x3c\x9d\x30\xef\x79\x0b\x7d\xb3\xf0\x02\x98\xc8\x41\x96\x82\xca\xed\x3e\x52\x21\x01\xe2\x2b\x38\xe1\x1d\x78\x92\x89\x71\x83\xfd\x0a\xa8\x46\xb1\xfd\x60\xd3\x82\x75\x11\xc9\x0c\xeb\x5d\x69\xa4\x63\xe7\xb7\xc3\x64\xf0\xca\x09\x25\x70\x7e\x13\x8c\x8a\x23\xe1\x1d\xe6\x75\x09\x9b\x40\xbe\x93\xac\xf6\x01\xde\x62\x0f\xe7\x69\x59\x18\x05\x55\x33\x48\x37\xa6\x08\x0e\x22\x8e\x66\xb1\xd4\xeb\x3b\x40\x46\xd1\x5b\x81\xf6\x6c\x5e\x2d\x60\xa6\xd1\x43\x53\x01\xb1\x07\x79\x45\xc1\xe2\xf2\x7f\xc5\x03\xf6\x85\x8d\x75\xb7\x3b\xaa\xb6\x0b\x99\x2f\x85\x84\x97\x38\xd0\x6d\x55\x2e\x72\xc3\xc9\xf7\x0d\xbc\x4c\xc4\x8b\x21\x5e\x1e\x3e\x04\x3b\xc3\x2e\x93\x4b\x7b\xfd\x7c\x1f\x49\xaf\x00\x10\x7e\x1a\x04\xaa\x52\x24\xc4\x87\xa9\xbe\xab\x4c\xda\xf8\xb4\x52\x56\x37\x46\x50\xe1\xdb\x19\x55\x64\xa6\x63\xfd\xc5\x38\x36\xe1\xd6\x76\x46\x8c\x12\x14\x35\xd2\xc2\x0e\x1f\x95\x30\xb3\x7b\x93\xef\x9d\x35\x84\x2d\x07\x5e\x10\x52\xa1\xc9\x33\x00\x86\xbf\xe0\x82\x45\xea\x2d\xe8\xbd\x87\x28\x03\xac\x2d\xe5\x62\x04\x92\x66\xdb\x38\xde\xd5\xd9\x1e\x0c\x90\xa7\x81\xc3\x41\x35\x84\x16\xda\xd0\xb1\x81\x80\x63\xd6\x72\x94\x15\x2f\x12\xd8\x9c\x28\xff\x54\xc3\x84\x34\xde\x00\xa0\xe2\x67\x70\xe2\x0b\x3a\x25\x02\xf6\x29\x8f\x97\xfb\x6c\xfd\x5c\xeb\x8e\x7a\x1f\xc2\x73\xac\x81\x3b\xe7\x9c\x33\x4a\x49\xdd\x1b\xc1\x54\xe3\xfd\xa0\xf1\x8d\xea\xf7\x24\xc2\x12\x9e\xf7\x7f\x1f\xf7\x2a\x95\xf0\x2a\xf9\x50\x12\xee\xa4\x18\x14\xa4\xc6\x6b\xfd\x1f\xbb\xac\x31\x02\x6a\xe8\x68\x54\x78\x88\x07\x87\xf7\xc5\x10\x59\x9b\x70\xf3\xec\xfc\xf3\x6d\xdd\xbd\xec\xf4\x95\xd5\x0a\x39\x35\x08\x17\xec\x88\x3e\x89\xcf\xc0\x7f\xb4\x29\x01\xcf\x1e\x78\x12\xec\xc1\xa5\x6e\x5d\xc1\x3d\x81\x36\x9c\x8c\x64\xe7\xd4\x0b\x09\xe6\x91\xb3\x22\x45\xdf\x7f\xa5\xdc\xa7\x29\x33\xbc\x08\xd2\xcc\x06\x34\xea\xb2\x1a\xed\x62\xbe\x47\xb7\xb1\x87\x7e\x3e\xd2\xa9\x12\x5d\x2a\x9c\x67\x63\x4b\x20\xe8\xe8\xbb\xae\x6f\x9b\x71\xbe\xe1\x05\xaf\x70\x8a\x88\x66\x8f\x27\x0a\xd2\xc4\x64\xf5\x48\x31\x52\x8e\x7b\x9d\x61\xd9\x4a\x2f\xab\x0c\x98\x87\xd9\x7d\x5c\x95\x9b\x18\x69\x80\x1f\x5b\x37\x9a\xef\x09\xf9\xc2\x3c\xfd\xd5\x5f\x67\x2d\x68\x59\x51\x96\xb7\xf7\x8c\xc6\x53\x6c\x89\x9e\x83\x58\x11\xd8\x61\x05\xf7\x3e\x3a\x74\xf3\x85\xc1\x34\x69\xd6\x20\x3f\x9b\xfd\xb8\x6a\xfc\x91\x42\xf8\x52\x6b\x53\x5d\x18\xc7\x48\xe0\x27\xa6\xd5\x86\xc6\x0a\x42\x63\xf2\x1c\x18\x4a\x1c\xba\xd6\x4c\xe5\x53\xe1\xcd\xd1\x4e\xea\x74\x75\x9f\x16\x0d\xd0\xcd\xdd\x93\x7a\xbf\x01\x56\xd4\xee\x02\x25\x0f\x71\x95\xd5\xee\x4b\x18\x0a\xe0\x71\x93\xd6\x25\xc4\x1f\x9c\x0c\x7e\x62\x73\x51\xf7\x43\x21\x42\xbc\x58\x7f\x62\x99\x6d\x11\x5b\xf2\x2c\xf3\xc3\x29\x71\xf7\xac\x70\x5b\x91\xa5\x0a\x96\x59\xb5\xdc\x6d\x6a\x80\x15\xd4\x6d\xbf\xb2\x2c\x74\x65\x47\x5c\x2e\x97\x69\xed\x84\xad\x2b\xe3\x20\xb6\xee\x32\xec\x82\x3b\xca\x6e\x30\xb3\x0f\x76\x00\x8d\x63\xda\xe5\xfa\x62\xda\x32\x08\x7b\x7f\x6c\x66\xd6\x1c\x2f\xcb\x8d\x9d\x2a\xbd\x32\x2f\xd7\xe9\x12\xc4\xa7\xd3\x62\x95\x56\xab\xd8\x7a\x15\xe9\xf2\x2e\x33\xf7\x68\x65\xa2\xae\x61\x70\x36\x9d\x32\x28\x92\x41\xd2\x7b\x0c\xb0\xaa\xd5\xba\x42\x41\x4b\x08\x1a\x31\xd2\x84\x23\x4e\xba\x17\xb8\xfe\x1a\xd2\x0d\xd6\x7f\x2a\x17\x3a\xb5\x7e\xd8\xca\x1e\x78\x00\xcd\xe5\x21\x28\xf1\x66\x98\x42\x0f\xa3\x51\xe7\xcb\xe4\x59\xd3\xa0\x9e\xe7\xad\x7d\xfc\xc5\x1e\xcb\x6d\x4e\x11\x53\xdc\x57\x51\xbc\xe9\x57\xa4\xdd\xef\x30\x53\x62\xd5\x3c\xba\x85\x63\xa0\xf2\x23\x2f\x3a\x85\x82\x5f\xe8\xd0\x01\x93\x94\x0c\x9e\x9d\xf3\x54\x74\x27\x56\x21\x71\x95\x7d\x31\xb7\x80\x09\xaa\x34\xe5\x80\x80\xde\xab\xdc\xe6\xc6\x5f\x33\x87\x90\x94\xc9\xbf\x82\xe7\x80\xc2\x8a\x72\x6b\xac\x3b\x22\x3e\xd6\xce\x5d\x62\xaa\x6f\x38\xc4\xa3\x55\x2b\xd8\x14\x60\xa4\xc2\x41\x34\x4e\xa9\xc3\x5e\x8c\xa4\x80\xec\x51\x0c\xfa\x61\x00\x1f\x7e\x80\x16\x27\xb4\x92\xf7\x69\x95\xa5\x45\x13\x29\xba\xfd\xab\xab\xac\xd8\xfd\xda\xf9\x5e\xac\xd4\x30\x6f\xee\xca\xdd\xed\xdd\xd3\x2f\xc0\xbe\x72\x30\x1e\x64\xb6\xc4\x89\x00\xde\xd1\x0b\x45\xc6\x2b\x72\x86\xce\x14\x41\xe8\x04\x9f\xc3\x3d\xc3\xe7\x9c\x47\x84\xf8\xc3\xce\x6e\x36\x9e\x2c\xe6\xec\x63\xbb\xc8\x34\x12\x00\x7e\xb0\x9f\x06\x14\x87\xae\x76\x44\xfc\xcb\xd7\xe5\xf3\x90\xbd\x66\xd5\x4e\x2e\x7a\xd7\x1e\xeb\xcf\x00\x94\xe9\x95\xe2\x80\x33\x9f\xd9\xe9\x3a\x88\x6f\x59\x9d\xa1\x7e\xda\x58\x5f\xa7\xd6\xfb\x07\x9f\xb5\x69\x08\xda\x40\xbe\x2a\x7b\x22\x4b\xe3\x80\x5f\xa9\x3e\x6a\x6b\xbd\x38\xa7\xee\x08\xd1\x50\xf4\x09\x78\xc4\x5d\x6d\x6a\x69\x00\x8e\xf0\xfc\x85\xc4\x43\xe5\x39\xa5\xe1\x14\x23\xe1\x0f\xe5\xbc\x1e\xe9\x46\x58\xb3\x4d\x50\x0f\x48\x47\x79\xff\x91\x5d\x80\x76\xf8\x98\x15\x0a\x1c\x1d\x9a\x72\x3b\x7b\xc9\xf4\x33\xe2\x68\xbd\xa4\x1b\x60\x21\xcf\x27\xd7\x5f\x01\x38\xea\x35\xcb\x08\x33\x08\x8a\x66\xa3\x73\x40\x0d\x2a\xf5\xba\x55\xd5\x1e\xba\xea\x75\xab\x13\xda\x59\x0e\x91\x4a\x40\x6b\x40\xef\x5c\x61\xd4\xe7\x26\xc0\xb5\x3b\x51\xc3\xf3\x62\x1f\xb6\x38\x91\x2b\xee\xaf\x43\x34\x6c\xff\x69\x56\x8a\x50\x08\xe9\x9e\xf2\xd8\x74\x44\xc8\x46\x89\x83\x88\xfe\x60\x0f\xb5\x13\x80\xc7\x98\xc6\x4e\xa1\x78\x7b\x24\xcb\xc2\x47\x03\x52\x97\xa7\x33\x0f\xe5\x5c\xb0\xb9\xcb\xac\x74\x5a\xab\xa3\x7d\xb9\x3b\xb2\x5b\x56\x1f\xb9\xd5\x41\xf5\x6b\xbd\x24\xe9\x7c\x16\x6b\xa4\xb9\x5a\xef\x8a\xa5\xe3\x5f\x79\x45\xdc\x8e\xdc\x80\xbc\x52\x75\x09\xa9\xf4\x92\xa2\x06\xea\x5c\x83\xcc\xab\xf0\x3d\x05\x80\xc7\xd9\xab\x63\x9c\x6c\x08\x23\xca\x8d\x51\x8e\xba\x2b\xb8\x23\xdc\x0e\x3a\x49\xa1\x11\xd2\xab\xea\x10\x9d\xb9\x3e\xa2\x7d\x78\x14\x61\x2a\x33\xc2\x14\xa5\x7f\xe9\xd6\x45\xec\x7b\xf3\xb0\x1d\x1c\x85\xa8\x02\xf6\xcc\xde\xb7\xc3\xbb\xda\x1e\x93\xdd\x6d\xc6\x76\x80\x27\x12\x89\xc8\x94\xf8\x0b\x93\x9e\xb7\x9a\xb5\x5d\xb9\x5d\x20\x30\x7f\x76\xd6\x0c\x7a\x14\xf7\xd6\x7b\x86\xcf\x06\x98\xb6\xf0\xca\x7a\x5b\x56\xfc\xd6\xb2\x26\x62\x26\x34\x57\x71\x61\x8a\xf0\xa0\x47\x94\xc5\x28\x5d\x8a\x6e\x05\xa9\x64\x3b\x8e\x75\x59\x3d\xa4\xd5\x2a\xdf\x63\xa4\xc1\xa8\xd3\x3c\x2d\x6e\x77\xe9\xad\x89\xf5\xf1\x27\x40\x8d\x41\x22\x28\x72\x57\xb0\xc6\x0b\x84\xfd\x11\x40\xd5\x83\x9f\x61\x40\x1a\x36\x4b\xc9\xe1\x1c\xc5\x03\xa5\xb8\x15\x76\x09\xad\xb0\x18\xa6\xc2\xb3\xf7\x74\xc5\x6a\xd9\x15\xfb\xf0\x58\x33\xac\x82\x66\x58\x04\x2f\x88\x10\xc8\x25\xc7\x02\x82\x22\xdc\x09\x94\xd9\x93\x7f\xa1\x6a\x86\x72\x6a\x5b\x9e\x79\x3f\xd2\xdb\x7c\x87\x68\x8b\xb4\xae\xcb\x65\x06\x93\x09\x88\xaa\x75\xba\x34\x02\x20\x81\x19\x38\xfc\x3c\xa2\x69\x96\x55\xb6\xc5\xfa\x08\x15\xce\x10\x72\x81\x89\x33\x4f\xfe\x9c\x15\x75\x93\xe6\x79\x10\x7e\xf9\x98\x62\x68\xcf\x51\x4c\xa5\x8a\x3e\xae\xe7\x1d\x37\x8e\x99\x9a\x82\x6f\xd5\x82\x71\xbe\xc7\x34\x0f\x78\x5b\x04\x79\x83\xb0\x6b\x59\x6e\xa9\x8b\x19\xb0\x17\x6b\x6b\xca\x29\x7f\xc1\xa6\x14\x8f\x4f\xb9\x58\xa9\x92\xe7\x69\x63\x31\xc2\x2e\x77\xcd\x76\x47\x51\x35\x42\x9f\x64\x08\xcb\x03\xe3\xe0\x8e\xf0\x82\x98\xd3\x81\x64\x4e\xd6\x40\xea\xad\x23\x76\xe6\x6f\x7c\x2c\x85\xae\x28\x9b\x2c\x08\xcc\x85\x57\x45\xac\xa4\x6b\x92\x33\x45\xd3\x3d\x88\xf5\x17\x57\xb0\xa1\xdd\x59\xed\xec\x9b\xb5\xd7\xac\x15\x00\x29\xc9\x3d\xb9\x92\x4e\xb2\x7d\x3a\xf7\x97\xc0\x5d\x71\x07\xb0\xfc\x7c\x0c\x24\x5a\x0c\xc2\x7d\x76\x15\xd5\x5d\xe4\x45\xdd\x5e\xd6\x18\x87\xa6\x75\x50\xe7\xb0\x36\x82\xca\x44\xcc\xb3\xdb\x15\x21\xb3\x33\xbb\xcd\x96\xbb\x72\x57\x23\x00\x5a\xa5\xdb\x6d\x55\x6e\x2b\x82\x44\x53\x07\xb1\x9d\x69\xdf\xa3\x8d\x4d\x7d\xfc\xa9\x2e\xdf\x07\x3d\x0d\x75\x9b\x59\x83\xcf\x89\xcc\xf7\xfa\x9b\x31\x5b\xbb\x6b\xec\x7a\xe2\x1d\x88\x5f\xa3\x28\x04\xb6\x7e\x07\xf7\x8a\x72\x6c\xf0\x46\xd3\x45\x2d\x13\x78\xfe\xd2\xad\x49\x4c\x45\x43\xb9\xbc\x92\xeb\x3a\x57\xa1\x77\xe7\x5e\x08\x96\x95\xa0\x38\xe0\x12\xaf\xdb\xbb\x7d\x0d\xf2\x1e\xb4\x0f\xc0\x1a\x72\x85\x2c\x25\xad\x1c\xc2\x8f\x83\xbc\x47\x4a\xf9\xeb\x72\x4b\xbb\xd9\x3e\x95\xcb\xe7\xb2\x5f\x8c\xc6\xd2\xfc\xca\xd5\x57\x30\x5e\x6b\x63\x23\x98\x53\xbf\x44\x28\xcf\x8c\x7a\x72\xf0\x4c\x55\xff\xca\xe0\x13\x28\x3c\x29\x54\x73\xb7\x03\xdf\x74\x83\x83\x3d\xb8\x81\x18\xa4\xd6\x5d\x90\xd8\x04\x1c\xd8\x5b\x3e\x59\x7b\x9c\x1b\xee\x3b\x3e\x41\xea\xb7\x47\xc5\xef\xc0\xdc\x3a\x29\x3e\xef\x4b\x4b\xda\x14\x6b\x7f\x3c\x68\x09\x8e\x0a\xeb\x7f\x66\x4d\x6d\xf2\x35\xc5\xe3\xad\x83\x3f\x06\x06\x15\xa7\xe3\xe3\xb1\x67\x58\x1d\x71\x57\x03\x5c\x5a\x55\xc1\x1b\xd9\x64\x05\x40\x0e\x69\x35\x42\xd6\x8c\x50\xeb\x50\xb5\xc3\x97\xb4\x12\x97\xe1\x10\x63\x05\xbc\xce\xb8\x1e\xf1\x53\x31\xd0\xad\xf4\xdc\x1f\x23\x33\x79\xa2\xa1\x4f\xe5\x70\xee\xa9\x1d\x01\x2f\x42\x6c\x09\x55\x5e\x22\xc3\xbe\xf3\x27\x1a\x44\x63\xa5\x56\x03\x80\x6a\x3a\x7d\x57\x3e\x91\xdd\x63\xf3\x7a\x11\x2e\x94\x73\xc7\xd0\xd9\x40\x45\xc3\x72\xad\xc0\x0d\xc4\x31\x82\x20\x40\xc6\x1d\xc5\x7d\xde\x5e\xcb\xea\xf1\xfd\x23\x4a\x97\xc1\x89\x45\x5d\xc1\xd5\x2d\xaa\x84\x50\x3d\xc2\x51\xc1\xfa\x31\x03\x35\x73\xf9\xcd\x9e\x1f\x0d\xf3\xb4\xc2\x6c\x6e\xd2\x6f\x46\xa5\xfa\xb6\x2c\x57\x7a\x9d\x02\x7f\xc4\x7a\x5d\x56\x0d\x26\x62\x5c\x1c\x19\xf1\x63\x9b\x7b\x08\x12\xc2\x11\x3b\xf5\x0d\x94\x39\x50\xb0\xc4\xe5\x1c\x90\x8c\x64\x30\xa6\xba\xc9\xf2\x9c\x62\x63\xce\x1c\x13\xdf\x4c\x0d\x47\x80\xb9\x37\x95\x62\x2d\x14\x90\x2d\x40\x20\xa5\xae\xcc\x06\x42\x0d\xd2\x0b\x58\xef\xf2\x58\xa9\xe3\x20\xeb\x24\x5e\x01\x1c\x51\xec\xc3\x92\x1a\x0f\xec\xc3\xff\xd8\x41\x71\xbe\x2c\x1b\xe2\x83\xe6\x1b\x28\x3e\xb2\x30\x23\x9a\xef\x21\xc8\x7f\xe9\xd9\x00\xe4\xc9\x08\x0f\x25\x25\xaf\x64\x2f\xcf\x6c\xb7\xe0\x86\xe2\xd3\x15\xc3\xd5\x6b\x5f\x70\x10\xdf\x7b\xe9\x56\x44\x67\xe2\x5c\xeb\x39\x2c\x4d\xfe\xb3\xe2\xc0\x11\xcd\x62\x9a\xff\xcc\x89\xdc\x47\x5e\x0d\x9c\x64\xe0\x47\xf9\xa7\x6f\x5d\x11\xdf\x4b\xdf\x2c\x59\x8f\x93\x4b\xd6\x12\x78\x0f\x17\x66\x05\x90\xc0\xb6\xc0\xac\xc2\x36\x85\xaa\x2c\x8a\xbe\xac\x41\x8a\x43\xd5\xdc\xb5\xc4\xdd\x0e\xf8\x0d\x72\xae\x5a\x5a\xea\x6d\xbb\x8a\x64\xbf\x9e\x26\x44\x41\xf5\x65\x65\xaa\xd6\xfb\x81\xee\x70\x1b\x76\x59\xab\xf2\xc0\xac\x00\xcd\x9d\xd9\xd4\x26\xbf\x37\x35\x6d\x87\x00\xbd\x0c\xa5\x4e\xd7\x02\x15\xb1\x34\xa6\x78\x4c\xbb\x08\xdd\xf0\x1d\xef\x71\x48\x23\xb2\xb1\xb1\x63\x78\xeb\x58\x7f\xd8\x35\x87\x3e\x8f\xa9\x41\x77\xd5\xb4\x16\x32\x40\x30\x83\xca\x89\x08\x3c\x7a\xec\x34\x2d\x31\x7c\x67\x1f\xc1\x58\xd2\x9a\x61\x54\xcb\x81\xae\xf8\x07\xa6\x22\x70\x12\x2b\x6b\x17\xae\x73\x9c\x5c\x93\x26\x29\xd7\xb1\xa9\x7a\x00\xb7\x21\xc9\x57\x7b\x54\x5a\x33\x62\x9d\x1d\xe8\x19\x80\xfa\x2c\x3c\x56\x28\x28\xfb\x70\x57\xea\x07\x7b\x8c\x2b\xc0\x25\xa0\xcc\xae\xc7\xb1\xd9\xcb\x67\x85\xe7\x52\x17\xe8\x7e\xbb\x9f\xad\x6b\x24\xa0\x17\xe0\xe9\xd6\xe8\x32\x28\xcf\x66\x82\xa1\x2b\x21\x72\xdd\xc6\x5e\x80\x2b\xf0\x5e\x57\xa9\x7d\xb8\x48\xde\x0a\x03\x4a\xee\xe6\x52\x8d\xa4\xc2\xe1\xa8\xa3\x6f\xb2\x65\xe5\xa6\x72\x19\x02\xc7\x36\x16\xa0\x8a\xbc\xc7\x34\x2a\x74\xba\x5a\x11\x28\x7c\x63\x2a\xa3\xd3\xdb\x5b\x3b\x4b\x7c\x59\xd7\xc9\x68\x9f\x03\x6a\xbe\x7d\x6e\x7b\xdb\x17\x83\x26\x48\xaa\x65\x1d\x5c\x34\x03\xfb\xdf\xa9\xbe\x2f\xf3\xdd\x86\x92\xeb\x75\x53\x56\xe9\xad\x51\x2d\xee\x0d\x16\x9f\x70\x56\x65\x51\x71\xc4\x22\x46\xe7\x0f\xd5\xa0\xcf\x47\x34\x59\x9c\x79\x87\xac\xc4\xce\x4e\xda\x5d\xe1\x9a\x0c\x2b\x9a\x07\x12\xa4\xca\x86\x7a\x26\x5d\x75\xbc\x53\x38\x89\x6f\xb3\x7b\x53\x04\x74\x48\x57\xae\x7c\x46\x04\x73\x59\xed\x91\x20\x2a\xcd\x1b\x53\x7d\x87\x37\xdd\x82\x82\x88\xcf\xd8\xc9\x7b\x72\xf0\x01\x40\x52\x3e\x48\xd9\xf2\x43\x8e\xc1\x09\x29\xcc\x83\xf1\x72\xbf\xe0\x02\xb8\xef\x7f\xcf\x94\xc1\x71\xb7\xdd\x9a\xb4\x0a\x3c\x02\x6b\x56\xb1\x3c\x4d\xfd\x0f\x7c\x71\x1e\x19\xa3\xba\xb2\xfa\x2e\x1e\xe8\x0b\x30\x8c\x08\xd6\x11\xca\x99\x84\xb4\x2c\xc8\x0f\xa5\x39\x8c\x95\x9a\x20\xfe\xd3\x46\xa8\xf4\x99\x1a\xe5\x4b\xe1\x88\xf6\x6f\x8a\xf7\x7e\x56\x55\x06\x46\xc0\xca\x4d\xcc\x89\xb7\x8f\x14\xe2\x5e\x9e\xf3\xb0\x41\x46\x13\x5a\x81\x16\x35\x97\x6c\xc0\xf1\x47\x7e\xfd\x36\x2b\x20\x0c\x8c\x4e\x1f\xba\x2b\xc3\x31\x29\x0e\xc9\x20\x0b\xb1\xde\xe5\xde\xa4\x33\xe0\x01\xd6\x1b\xdb\x6f\x4c\x7f\xae\xda\xb1\xb3\xc2\x54\x51\x27\x27\x0f\x67\x8d\xf0\xbd\xdf\x3c\x1e\xdf\xb6\x37\xbb\xc8\x6d\x55\x81\x2d\x5a\x2b\x7b\xf6\xe3\xde\x74\x6c\x46\x03\xa8\xa2\x23\xd8\x89\x51\x7c\x42\x85\x1b\x52\x46\x5d\x1f\x59\x75\x3a\x8e\x91\x97\xba\x27\x36\x59\x32\xd4\x23\x6b\xa4\xea\x1e\x85\xdc\xcb\xb2\x42\x6c\x1b\xb4\x74\x75\x28\xd0\x44\x3a\x89\xd1\x45\xec\xf4\x3c\x9e\x13\x3e\x34\x40\xb0\x73\x64\xc3\x96\xbb\xba\x29\x37\x69\x95\x71\x0d\x0e\xd8\xe9\x1c\x26\xb7\x68\x4c\xe5\xe2\x8f\xd1\xba\x63\xe6\xe5\xa4\xf1\x3a\x5e\xec\x31\x38\x85\xd8\x10\x79\xc8\x78\x31\x10\x1c\xc5\x83\x26\x14\xe4\xc7\x69\xf3\xb9\x6f\x89\xee\xc3\xd6\x05\x3a\xe9\x35\x76\x8c\xac\xdf\x80\x17\x23\x86\xb6\xcc\x04\xd2\x96\x1b\x62\xf2\x69\xbb\x1b\x72\x6e\x81\xa0\x0a\x2b\x52\xad\x00\xc9\x27\xbb\x36\x5b\x93\xe7\x02\xad\x2e\x2e\x22\xd8\xe7\x60\x53\xfa\xa9\x89\x95\x7a\x1b\xeb\x61\xb8\xc8\x5d\xad\xa0\x28\xc3\x15\xda\x0e\xb8\x03\xc7\x66\xb1\x6b\x14\x34\x4f\x79\x10\x2c\x9e\xe9\x7c\x5b\xde\x05\x8b\xbd\x5e\x18\xe4\x5c\xdf\x6c\xb3\x1c\xd9\x9b\x64\x6a\xdd\xc6\xf1\x50\x57\x85\xe7\xe9\xaf\xf2\x5c\xb9\x2a\xcf\x0c\xf3\x6b\x08\xcc\xc8\xec\xb6\x2f\x73\x6a\x08\x20\x14\x57\xda\x49\x53\xb7\xc7\x4e\xc1\x2d\x86\x05\x7a\x9d\xe6\x79\xdd\xdb\x0f\xab\x5a\xc1\xa7\x2b\xce\x33\x54\xe2\xf1\xc1\x76\xe7\x02\x99\x17\x6c\x94\xa8\xc4\xb6\x76\x3a\xd7\xba\x0b\x33\x71\xb6\x44\xc0\x27\xdc\x0b\xa3\x77\x53\xab\xf0\xc3\x83\x88\x1c\x28\x3c\x92\x9e\x53\x37\xf3\xa3\x51\x88\xce\xa6\xb9\x09\x10\x4d\xb2\x7b\x8f\x4d\xd6\x3b\x64\x89\x63\x82\x82\x75\x0f\x3b\x18\x36\x97\x05\x55\x0f\xc2\xf9\x3c\x3a\x79\xf0\x1b\xa7\xb0\x4d\x1b\xf6\xce\xa4\x20\x1a\x9d\xd1\xb4\xd9\xd1\x4a\xc3\x1e\xf8\xdd\xd2\x26\x70\xb6\x0b\x73\x2c\x8c\x75\x68\x2d\x94\xd6\x3c\xca\x7d\xd8\xd9\xf0\xb8\xd8\x64\x5e\x95\x5a\x3a\xaa\x9d\xfd\xa3\x32\x0e\xe9\xaf\x41\x12\x74\x9d\x2d\x01\x7c\x2d\xd2\x23\x14\x36\x89\xbd\xc0\x2d\x6b\xee\x31\x00\x29\xac\xdc\x37\xb2\x9a\x53\x43\x69\x88\x3b\x6a\xee\x2a\x53\xdf\x95\xf9\xca\x63\xc6\x31\xb1\x41\xc3\x21\x5c\x3b\x14\x78\xa1\xf7\x00\x63\x67\xa7\x03\x39\xe2\x9e\xdd\x42\x62\x6d\xf1\x1d\x40\xde\xba\xd8\x6d\x4c\x05\x69\x42\x1b\x42\x6d\x4c\x63\xaa\x9a\x74\xf9\xea\xa6\xda\x2d\x9b\x1d\x40\x8a\xf6\x76\x1b\xc1\x09\x9e\x52\x57\x0a\xa5\x12\xea\x8d\x3d\xec\x37\xe9\xb2\x2a\x6b\xf1\x8b\xac\xc8\xb3\x42\xd6\xcb\x8e\x1b\x90\xb5\x2a\xb0\x7b\xdf\x46\x24\x2a\x2b\x74\x6e\x8a\xdb\xe6\x6e\xe0\xc2\xc3\x20\xf9\x2d\x07\x0c\x2d\xa0\x32\x3d\x1f\x44\x36\x5e\xc4\xad\x91\xc0\xaf\xce\x3a\x88\xf5\x71\xe2\xd7\x6b\x87\x8d\x01\x6f\x88\x99\x69\xa8\x9c\xf0\x3e\x6c\x6f\x5a\x00\x84\x62\x00\xbf\xf6\xfc\x67\x6e\xeb\xd8\x00\x7e\xe2\x3b\x3e\xe5\xd2\x78\xdc\x1a\x44\x8e\xcb\xc3\x9f\x22\xea\xd1\x15\xff\x48\x2a\xf3\x1d\x12\x05\x88\x0d\xaa\x82\x07\x76\xa9\x80\xbc\x2e\x7b\x1f\xc3\xa3\xf1\xca\x8a\x03\x44\x2c\xb8\xe0\xca\x56\x4e\xbd\xad\x63\x0f\x71\x31\xc7\x4a\xbd\xf3\x1c\x76\x24\xe6\xce\x19\x0c\xe7\x3a\x50\xc2\x95\x9f\x9c\x3a\xa1\xa0\x48\xcf\x27\x0a\x9b\x14\xf5\x5c\x7b\x8c\xf0\x33\xe0\xac\xa6\x80\x4c\x3c\xfa\x01\xeb\x1a\x75\x5d\x3e\x9e\x22\x9a\x65\x9e\x61\xcc\x6a\xdf\x95\xd9\x52\x24\x8a\x95\xc3\x81\xe0\xe7\x08\x2a\x19\x94\xb4\xda\x55\x41\x70\xd2\xc0\x3f\x02\x78\x5c\xf9\x00\xad\x3b\x0a\x31\xea\xd6\x25\xb7\xf1\xfe\x6d\x56\x18\xf4\x5a\xc0\x08\x9b\xc5\xee\x16\x1a\xd0\xba\x09\x6e\x29\x03\x0f\x8d\x01\xed\x0c\xf1\x01\xe6\x5a\x6f\xad\x03\xbf\x99\xaa\x7f\xf6\x2c\x6e\x5c\x33\x48\x30\xcd\x9c\xc1\xd9\x91\x72\xf7\xa1\x53\xc5\x0f\x8b\xd2\x63\xfd\x85\x0e\x48\x5e\xb9\x01\xad\x76\xe8\xaa\xc1\xfa\x25\x49\xc5\x6d\x9e\xee\x6b\xd5\xae\xde\x88\xc0\xd2\x69\x94\x37\x8f\xb1\xba\xbb\xf1\x6f\x4a\x64\x0f\x08\x31\x46\x29\xc6\x97\xa8\x78\x8c\x8d\xdf\x14\x7d\x03\xc4\x87\x16\x70\xef\x13\x28\x04\xb8\xbb\xe1\xac\x4a\x0d\xbc\x8e\x5c\x2d\xc0\x1e\x99\x9f\x95\x4a\x81\x39\x8a\x9c\x76\xf7\xcc\x4f\xb8\xee\x5d\xf6\x62\x59\x4c\x6b\x3f\x9d\x87\x34\x73\x9a\x97\x9b\x22\xf4\x83\xa9\x8c\x7b\xbb\xee\xee\x08\x7b\x50\x87\x7d\xff\x7e\x77\x7f\xf0\x1e\xb5\xfa\xdb\x76\x2e\xf0\x85\x5a\x10\x28\xbf\xe9\xba\x8f\xdc\x79\xc8\xc7\xf6\x3e\xbc\x38\x69\x1e\x09\x3d\x10\xf8\xdd\x12\xe9\x6f\x5f\x21\x74\x47\x89\x56\x08\xb9\x9e\xe1\x24\xe2\x36\x13\x69\x46\x5c\xca\x55\x3c\x95\xb7\x2a\xaa\xaf\x58\x11\xeb\xe3\x51\xe3\xe8\x0b\xea\xa6\x2c\x57\x2d\xb8\xd8\xc3\x5d\xe9\x5e\x4a\x43\x52\xc6\xcc\xa3\xeb\xcb\xf3\x35\x15\x6f\xb2\x76\x16\x8a\xfa\x12\x98\x72\xc2\xc6\x58\xd6\xff\x59\x20\xb4\x8e\xfb\x5c\xf0\x0c\x91\xe9\x6a\x81\xbb\x73\x63\x16\xb7\xb3\x07\xd8\x62\xa0\x6f\x00\x1f\x58\xef\x32\x7c\x58\x44\x5f\xbb\x1c\xff\xc6\xd8\x81\x67\xf5\x26\x00\x19\xb7\x5f\x70\xac\x87\xca\x5d\xc1\x7f\xc5\x9e\xb6\x05\x99\xd8\xe3\x93\x01\xbe\xd7\xb4\x41\xa8\x5b\xb6\x09\x4b\xa1\x1e\x68\xc9\x22\x86\xc4\x0d\xc2\x09\x36\x82\x17\x3b\x4a\x56\xc6\x0d\x4a\x6f\x99\x50\x07\xee\x52\xde\x35\x81\x04\x41\x13\x38\xcb\x78\x16\x40\x1f\x8e\xa8\x9e\x10\xc3\x32\x1f\x78\x87\xf1\x77\x0e\xcb\x91\x79\x04\x21\x43\x25\xe0\xc1\x23\xc9\x96\x2d\xdf\x82\xbb\x12\x94\x92\x08\xa8\xf1\xb2\x4f\x25\x51\x64\xa7\x1a\x61\x40\x52\x8a\x91\xed\xe7\xb0\xa2\x77\xc8\xcc\xa4\x2e\x4d\x0b\x61\x71\xa4\xef\xd3\x3c\xa3\x26\x8c\x46\xe7\x26\xad\xb1\x13\xc5\xe8\xbd\x49\xab\x3a\x02\xfe\x6a\x6e\x37\x83\x2c\x3a\x5a\x43\xd0\x23\x47\x6f\xbe\x0e\xbb\x2e\x7c\x59\x46\xbf\x4b\x23\x3e\xe8\xb1\x8d\x8d\xaa\x85\x45\x89\x78\x50\x87\x08\x5f\x96\x28\xae\x45\x25\x2a\xe7\x9b\xc9\xe0\xc3\x95\x0b\x7b\x13\xf0\x64\x7e\xfe\xec\x4c\x01\xd6\xbd\x1f\xcf\x10\x60\x9a\xc3\x3f\xac\x9f\x00\x7b\x59\xe5\x66\x08\x2e\x19\x2b\x65\x06\xfa\x17\x53\xb9\x7c\x9f\x5b\x13\x90\x20\xa4\x35\x4d\x20\x88\x55\xb8\xf4\x6b\x39\xbb\x65\xa5\xc2\x36\x54\xfe\x2e\x6c\x06\x98\x27\xb8\x6c\xca\x79\x34\x80\x16\x15\xc1\xc2\x16\x29\x8b\x10\xab\xf4\x68\xd0\x06\x49\x5b\x3e\x5b\x01\x31\xc6\xca\xdd\xbb\x06\xeb\x8c\x0e\x3c\x57\x18\xc3\x74\xc9\xac\x1c\xc2\xc7\xa7\x88\x46\x61\xfa\xb3\x46\x00\xe3\xe1\xe0\x65\x90\xba\x73\x17\xa3\xd6\x02\xc3\xe8\x47\x1c\x4d\x0a\xf0\xec\xd6\x0a\x8a\xe1\x35\x77\xce\xc7\x85\x18\xa9\xda\x40\x40\x20\x4f\xb4\xe3\xac\x60\x3c\x1a\x9d\x15\x65\xa5\x84\x28\xdd\xc0\x6f\xb5\x4d\xfa\xa7\x12\x1b\x08\xca\x02\x4a\x71\xc7\x64\x57\xab\x48\x7f\x33\x55\x61\x72\x8a\x85\xec\x61\x3f\xe0\xc6\xa5\x36\x1c\x59\x97\x52\x38\x5e\x1c\x22\xd5\xae\xf0\x7a\xf0\x94\xb9\xa1\x5b\x91\x23\xad\x38\xbf\xc7\x39\x27\xff\x6d\x1b\xe3\x21\x82\xf3\x2e\xdd\x6e\x8d\xb3\x07\x20\x82\xed\x13\x53\xd8\x89\xbf\xca\x96\x0d\x67\x09\x98\x66\x49\xb4\xe0\x3a\x3a\x45\x04\xca\x98\xc6\xce\x85\xef\xee\x81\x2b\x53\x95\xce\x4d\x69\x1a\x58\x97\x2e\x04\x9b\xd2\x3a\xfe\xfe\x58\xde\x48\x8b\x9a\x53\xe1\xf6\x72\xf6\x30\x02\x79\x56\xac\xe8\x11\x46\xc1\x7b\xf3\xb7\x8e\xe7\x28\x58\xcd\x3e\x01\xea\xdf\x6c\xac\xd4\x0f\x3e\x95\x8b\x09\x3b\x3e\xb2\xa8\x28\xee\x1e\x06\x1a\xa2\x1f\x41\x67\xd5\xd9\xca\xbc\x5c\xec\x5f\xda\xff\x87\x9b\xeb\x3a\x2b\x6e\x73\x23\xea\xdc\x38\x32\xd2\x2f\xa4\xca\x5d\xe7\x66\x02\xc6\x86\xe2\xfe\x01\x37\x76\x0f\x6e\x45\x74\x2a\xb9\xb3\xa4\x2b\x7b\xc8\x65\x4f\x75\xd0\x0e\xf6\x3e\x15\x0a\x85\x88\x6a\x52\x77\xc4\xd6\xf9\xf7\x7c\xe5\x8e\x42\x83\xd0\x03\x9d\xf4\xb3\x6f\x01\x7f\x28\x1f\x71\x71\xdb\xcf\xc4\xe7\x90\x3c\xe9\xc1\x6c\x76\x01\xe3\xce\x5d\xdc\x15\x21\x80\xdb\x17\x44\xba\x4f\xc1\xea\xbd\x5d\x7f\x56\xf5\x02\x52\xda\x41\x29\x22\x72\x3e\x1e\x8e\xa4\x7a\x1f\x8a\x2e\xb5\x4e\x97\xd4\xf2\x48\x79\x2c\x95\x35\x4f\x56\x95\x89\xf2\x2d\xa7\x48\x15\x60\xec\x00\x30\xce\x68\x4b\xb8\xed\x86\xdc\x8b\xee\xe6\xd2\x90\xbb\x29\x8c\x95\xfa\x31\x16\xd4\x99\x54\xd4\x21\xcf\x37\xd2\x5e\x75\x06\x33\x9f\xf0\x50\x51\x20\x04\x10\x14\x3e\x54\x9f\x98\x84\x5b\x0d\x42\x21\xdc\xc5\x73\x43\xc1\x2b\xeb\xd7\x53\x53\xaa\xbf\x6c\x20\xa0\xb3\x5d\x66\xb8\x1e\x15\xb8\x68\xa1\x8c\xb2\xa7\x12\x95\x1d\xd9\x7d\x23\x74\xc7\x0f\x65\xe2\x95\xf5\xc8\xe1\x6c\x75\xe7\x31\x96\xaf\x60\x38\xcc\x64\x00\xa7\x97\x5d\xf9\xdd\x4b\x3a\xaf\x5c\x31\x51\x44\x56\x79\x96\x15\x37\x30\x38\x2d\xd8\x03\x44\x9a\x39\x2a\x05\x20\xec\xc6\xfa\x4f\xd0\xd6\xca\x42\xcd\xe0\x47\xfc\x44\x9c\x9c\x54\x2d\x70\xe7\x38\x29\xe4\x6c\xdb\x04\x71\x75\x66\x63\x58\xe7\x2e\x00\x40\x05\xd2\xfa\x2a\x38\x7a\x0b\xc9\x53\x4c\xf4\xc2\xfb\x0e\xbd\x30\x05\x4c\x9d\xb7\xa2\x04\x94\x2f\x6b\xea\x4e\x8d\x8f\xdb\xeb\x52\xde\x5b\x95\x69\xf1\xfd\xe6\xe9\x03\x53\x60\x30\x0a\xa4\xfb\x34\x6d\xf6\x5e\x1c\x0e\x34\x36\xca\xdc\x74\x88\xec\x55\xc7\x84\x2f\x3c\x5c\x95\xc7\x68\xdd\xf1\xf7\xc2\x82\x39\xcc\xdf\xab\x98\x1e\x39\x72\x4c\xbe\x87\x68\x7c\x0f\xf5\xd6\xe0\x88\xdd\xf0\xdb\x78\x7c\x81\x5f\xb0\x43\x05\xa8\xc6\xc9\x6b\x6a\x9f\x80\xd8\x08\x21\xb3\x8f\x15\x27\x1f\x7f\x60\x04\x59\x70\x17\x7d\x6b\xeb\xd0\xb2\xaf\x21\x13\x2d\x7a\xbc\x9b\xb0\x37\x96\x04\x7e\x98\x6a\x40\x2c\x09\xb1\x85\x75\xc8\x38\xe0\x8e\xd5\x80\x5e\x94\x7b\x18\x54\x9b\x04\x59\x1a\xae\x6c\x83\x4d\xf2\xc5\x5e\xaf\x49\xad\x3c\x74\x5d\x0a\x1d\x3c\x54\xfd\x42\x39\x82\xe0\x7e\x72\x60\xa2\x2c\x6e\xed\x27\x22\x00\xa1\x42\x38\xb2\x36\xda\x77\xe4\x77\x21\x25\xb7\x44\xed\x8e\x8e\x82\x16\xc7\x68\xac\x47\x6b\x72\x6a\x97\x65\x81\xa5\xf0\x25\xf7\x54\x02\xc9\xf0\x9f\x76\xab\x5b\x24\x11\xac\x90\x70\xd8\x25\x09\xa9\x41\x9e\xf9\x7e\x41\x56\x1d\x09\x40\xc4\x79\x47\x7d\xa9\xc7\x76\xe0\xd0\xc9\x40\xd2\x23\xf4\xdd\xba\xde\x99\x7a\x10\xb5\x15\x91\x71\x22\x01\x19\x63\x97\xd1\x71\x40\x58\x68\x47\x05\x2d\x50\x91\xe0\xd9\x94\xf4\x85\x03\xc1\xd7\x08\xde\x1c\xec\xff\x40\xa8\xbe\x65\x81\x20\x67\x4c\x9b\xda\xfc\xba\xb4\x8e\x1e\x50\x10\xf1\x92\x6a\x8b\xdc\xb7\xb2\x81\xc2\x47\x94\x3e\x12\x77\xf6\xb0\x56\x56\x9d\x6d\x76\x79\x83\x44\xa2\x39\xc2\x8e\x95\x97\xce\xea\xb3\xfc\x8e\xf6\x9c\x3c\x5e\x53\x35\x78\xbe\x8b\xaf\x51\x59\x22\xad\x55\xf8\x0e\xf7\x62\x61\x1e\xd8\x85\x29\xa0\x84\xb1\xb7\x43\x72\xbf\xa4\xaa\x45\x7e\x80\xd2\x3e\x50\xc5\xc1\x84\xb1\x94\x8d\x93\xbb\xbc\x5b\xab\x55\x8b\x3d\x21\x68\xec\xd6\xb0\xe7\x16\xe3\xe8\x09\x69\xed\xf2\xf3\x82\xd7\x12\xd0\x3f\x40\x27\x6a\x1f\xc3\x17\x5e\xb0\x8b\x81\xc8\xbd\xec\x52\xc8\x57\x6e\x76\xc1\x33\x77\x39\x60\x79\xd4\xc1\xc7\x16\x94\x6c\x5a\x57\xf6\xdc\x62\xcc\x17\x46\x78\x8f\x0c\x1f\xab\x53\x9d\x52\xb4\x40\x9d\x31\x35\x6b\x56\x60\x6a\xa2\xac\x74\xc0\xcf\xea\x09\xb6\x95\x64\x95\x12\x6d\xd2\x18\x3d\x2e\xd2\xdc\x9b\x72\x23\x2f\x2f\x28\xc7\x10\x1a\x85\xa8\x44\xf9\x29\x8f\xad\xec\xfd\x02\x00\x3b\x10\x90\xd3\x6a\xcf\x1e\x05\xc0\x3a\x06\xd5\xf6\x20\xeb\xb2\x02\x32\x8c\x44\x62\xc4\x9b\x5e\x30\x65\x00\x72\xdd\x47\x66\xa0\xf1\x85\x79\x6d\xd6\xd7\xaa\x18\x2d\x67\xea\x06\xf3\x38\x19\xea\x80\xb9\x36\x33\xfc\xe4\x7b\x15\xdc\x9c\xfb\x4f\x6b\xfb\x74\x62\x84\x8c\xf5\xa7\xb3\xd4\x3e\xf4\x6d\x45\x57\x6c\xa8\x5f\xd5\xf3\xaa\x05\xef\x98\x62\x5d\x07\xa2\xcc\xec\xd2\xb7\x76\xc4\x78\x79\xb7\xa5\xe8\x7c\xb7\x4e\x01\xcc\xd7\x67\x78\x5e\x6c\x0b\x06\x67\x05\x12\x38\xb7\xa6\x30\x55\xb9\x23\x56\x58\x27\xdf\x4e\x09\xbb\x87\x6c\x65\x74\x05\x18\x27\xd1\x17\xa8\x02\xc5\x27\x5a\xec\xc8\x82\x8e\x83\xcb\x30\xc1\x8b\x6b\xa2\x90\x8c\x22\x1d\x3a\xef\xb4\x51\xf8\xa5\xf7\x54\x5b\xdc\x6d\xf9\xe6\xd8\x50\xf9\x6a\x85\xe4\xf8\x8e\x8e\x2d\x5b\x6b\x38\x29\x75\x7d\x07\x2b\xc6\xba\x83\xc8\x49\x16\x28\x86\x7a\xd2\x78\x1c\x9f\x37\x45\x34\x48\xec\x8c\x75\xed\x92\x64\x04\xd1\x7c\x63\x16\x08\x2b\x50\x8c\x96\x3a\xb0\xaa\x01\x35\x66\x07\x6a\xef\x92\x33\x6d\xcf\x03\x65\x46\x16\x26\xcf\xcc\xbd\x21\xf6\x63\x9d\xaa\xd6\x51\x85\x67\x6a\xdd\xf4\xb1\x68\x9f\xba\x72\x4d\xbb\x8f\xeb\x15\x2b\x65\xad\xdb\x4e\xbb\xaf\xe0\x0a\x82\x03\xe5\x28\xbf\x39\x21\xb3\x70\x2b\xdf\x4e\xe4\x62\xef\x2b\x39\xb2\x7f\xad\x8e\x42\xa7\xc4\xcb\xfb\x51\xef\xab\x35\x89\x90\x00\x08\x1b\x9a\x7a\x0e\x03\x28\x3c\xae\x56\x24\xb6\x95\x67\xcb\xac\xd1\xb7\xa6\xbc\xad\xd2\xed\x9d\xf5\x8b\xc2\x08\x5b\xf4\x0d\x7a\xb6\x78\xb4\xc2\x82\xbd\x9c\x8b\x0e\xc1\x57\xb3\x5a\x79\x42\x4a\x6c\x1c\xc3\xee\x85\x4d\x09\x48\x1a\x9e\x08\x34\x1b\xbb\x5a\xb0\xbe\x8f\x0a\xda\xc9\xc4\x53\xe0\x91\x9e\x3a\x2b\x96\x65\xb5\x2d\x2b\x04\x6c\x40\x7a\xc7\x8d\x30\xad\xed\x92\xe4\x54\x2f\x55\x10\xb8\xdb\xbf\xfd\x4e\xcf\x10\x75\x70\x88\x88\x10\x53\x2a\xd4\x5f\x55\x99\xfb\x0c\xba\x3f\xf0\x85\x17\xe6\x81\x73\xd2\x8e\x17\xed\xf1\x8e\x7b\xf4\x01\xac\x43\x6b\x77\x54\xb6\x31\x04\x02\x0a\xae\x64\xb7\x0f\x50\xd2\x67\x9b\xcc\x5a\x77\xe0\xc3\xc8\xaa\xcc\xd1\x23\x71\x29\xc0\xd1\x3a\x2d\x76\x0d\x95\xd0\x21\x91\x0b\x14\x3a\x4d\x9a\x41\x27\x3d\x75\x1c\x2b\x7b\x0b\xc7\xde\x84\x60\xe6\xa5\xa9\xa0\x82\x0a\x6e\xb6\xc8\xc2\x23\x5e\x12\xd5\xd0\xb2\xe2\x76\x47\xe2\x94\xfc\x09\xe4\x55\x70\x5b\xc1\xb9\xb8\x94\x1a\xb6\xae\x43\xf8\xd1\x0e\x7e\x16\x4d\xa5\x40\x4f\xd2\x49\x7b\x84\x72\x0b\x8d\x47\xa2\x1e\x45\x2a\x20\x20\x74\x8d\x5a\x2d\x9d\xcb\xde\x60\x84\xb6\x16\x77\x01\x30\x37\x28\xd2\x8b\x76\x6e\xc5\x6f\xd9\x77\x96\x1f\x5a\x13\xfc\xe8\x2a\xe8\x2f\x84\x48\x93\x20\xae\x3e\x90\x08\x67\xc2\xd7\xfc\x97\x77\x25\x7b\xf7\x3c\x2e\x28\x57\x3e\x7f\x10\x4a\x9d\xbc\x71\x0e\x23\xc3\x43\xc5\xb6\x00\x67\xbd\x83\xe3\x80\xca\x8f\x60\x94\x71\xfc\x19\x88\xcc\x0f\x76\x6e\xdb\x8f\x2e\x7a\x8a\x32\x00\xea\xaf\x32\x64\x15\xf4\x67\x84\x22\x9a\x42\xeb\xbf\xfb\x90\x1a\x9d\x43\x77\x10\xb8\x13\x53\xda\xba\xbe\xc7\x56\x92\x2b\x37\xb8\xdb\xa1\xd9\x79\x0f\xe4\x99\xe5\xc6\xd8\x4d\x56\xe3\x91\xe0\x12\xec\xac\x44\x91\xd5\xb1\x9e\xec\x2a\x38\xc6\x6a\xc7\x7a\xb6\x30\xfa\x76\x07\xe9\x1d\x1a\x4a\xf3\x50\xea\xdb\x12\x8a\x11\x6b\xdc\x7b\xd5\xbd\xe4\x44\x51\x75\x93\x36\x3b\xe4\xe0\xc9\x73\x91\x0b\x40\x89\x87\x5d\x9b\xbb\x87\x92\x91\xdb\xaa\xdc\x94\xce\xe1\xa8\xef\xd2\x0a\xc5\x07\x56\xba\x32\x74\x94\xb8\xaf\xdc\xa2\x39\x01\x7d\x6b\xad\xf5\x78\xe2\xf5\xe6\xd4\xc9\xdb\x58\x7f\x48\xce\x87\x37\xb3\x84\x14\xca\x3e\x4c\x87\xd3\xaf\xda\xcb\x82\x5d\xe8\xcb\x69\x02\x8a\x60\xe7\x9f\x86\xd3\x8f\x09\x28\xd6\x4d\x13\xfb\x09\x71\x25\x50\xfd\x12\x17\x88\x5a\xf2\x55\xd7\xc9\xf4\xf3\x68\x4e\x42\x80\xa1\x96\x95\xd3\xf5\xfb\xf2\x29\x19\x7b\xdd\x34\xe5\x95\xfd\xbe\x4c\x47\x20\x97\x15\x88\x02\xea\x4f\x93\xab\x8b\x64\x0a\x74\x13\xaf\x58\x70\x0d\x95\xee\x12\x27\xe9\x27\x9f\x49\xb1\x88\x1f\x8b\x97\xb9\xb1\x93\x5a\xda\xbf\x8c\xc6\x17\x6d\x25\xbf\xe4\xe2\x80\x96\x9f\xfa\x70\x33\x07\x85\x2b\x10\xbd\x4a\x2e\xf4\x7c\x12\x91\x04\x21\x7c\x56\x4a\xf6\x4d\x2e\x85\x36\x1f\x0a\x84\x0d\xc7\x17\xfa\x72\x34\x1f\x27\xb3\x99\xfa\x4b\x34\xfa\xec\x75\xae\x93\xe9\xe5\x64\xfa\x79\x38\x3e\x4f\x14\xc9\x9a\x89\xd7\xe8\xd5\xfa\x66\x9f\x26\x37\x57\x17\xc1\xdf\xed\x34\x25\xfa\x22\xb9\x4c\xce\xe7\xa3\x5f\x92\xc8\x7e\x50\x0f\x67\xb3\x9b\xcf\x89\xc2\xd9\x9e\x81\x4e\x1c\x48\x9d\x25\xe7\xc9\x6c\x66\xbf\x35\x4b\xa6\xbf\x8c\xce\x81\xcf\x63\x9a\x5c\x0f\x47\x20\x03\x79\x3e\x99\x4e\x93\x73\x94\x20\x53\x27\xef\x62\xfb\xe2\xc6\x13\x10\x65\x9b\xeb\x9b\xf1\x55\x32\x9b\xe9\x69\xf2\xaf\x37\xa3\x69\xdf\x22\x00\xbd\xb7\x8f\xd3\x04\x26\x52\xbc\x73\xf5\x65\x74\x75\x85\x5a\x76\xad\x17\xef\x24\xe2\xfc\x8b\xff\xaa\xbf\x7c\x9a\x80\xf4\x18\xb0\x8a\x7c\xe5\xa5\x31\x4d\xbc\x12\xa5\x5c\xa4\x76\x3e\xfd\xc2\x1c\x7e\x98\xd8\x19\x08\xa4\xf9\xec\x74\x80\x96\x1b\x0b\x9f\x79\xe9\xbf\xe1\xf8\xab\x22\x82\xef\x5e\x75\x3e\x7d\x48\x3d\xcd\x69\xf1\xd9\x35\x48\xef\xeb\x06\xe5\xf7\x46\x63\x5e\x1f\xf3\x89\x6e\x6f\x49\x21\x3b\xd8\x5d\x7b\x9a\x15\xf7\x2e\x86\xf3\xa1\x82\x11\xcf\x87\xfa\x43\x62\x3f\x3d\x4d\xc6\x17\xc9\x14\xb6\xd2\xf0\xfc\xfc\x66\x3a\x9c\x27\x5e\x36\x4f\xcf\x6e\x66\xf3\xe1\x88\xb4\x3d\xed\xf3\x82\x0c\xe0\x68\x7a\xc1\x7b\x49\xc1\xf2\x74\x3a\x7d\xe1\x02\x9b\x4f\xf4\xe4\x3a\x81\x4b\xc2\x42\xf3\x2f\x64\x36\xb9\x9c\x7f\x19\x4e\x93\x41\x28\xcc\xa7\xf0\xed\xe9\x60\xc7\x7e\xd5\x9f\x86\x33\x10\xe8\xd3\xc3\x8b\x5f\x46\xb3\xe7\xe9\xf3\xa9\x64\x8c\x9f\xeb\x61\x9d\x01\x8c\xb2\xb5\xf3\x43\x08\x3a\x31\xa1\x3a\x87\x73\x1e\x55\xae\x2a\x3d\x36\x0f\x74\xb0\x59\xb7\x43\xd1\x59\x48\xdc\x68\xd8\xd4\xe2\x8b\x49\xac\x1b\x46\xc4\xc1\xe4\xff\xd3\xf1\x88\x9c\x51\x82\x0d\x0c\x75\xa4\xc8\xdf\x02\x27\x0e\x78\x1d\x01\x5f\xb2\x31\xc5\x8a\xe9\x2d\xb2\xa6\x65\xdd\xc1\xd5\x30\xcc\xc6\xbe\x4c\x0b\x15\xe4\x2d\x3d\x8b\xb7\xe7\xae\x46\xed\xb9\xc5\x9e\xab\x4e\x20\x4b\x12\xa6\x41\x9c\x22\x9d\x23\x35\x3a\x2e\xab\x48\x43\x4f\x51\x91\x22\xc1\x65\xd4\xdf\x73\x7c\x90\x72\x8e\x7d\xe9\x01\xf2\xa1\xba\x3e\x29\xbe\x45\xa4\xd3\xa6\x49\xa9\x78\xeb\xdd\x2d\xd7\xb9\x14\xb0\xcc\x02\xa5\xbb\x8d\xc9\xd2\xb5\xa9\x1b\x38\xfe\xdd\x97\x37\xfc\xd9\xba\x21\x7c\x33\xe0\xf1\xa8\x06\x8d\x00\xe8\x12\x99\xd8\x25\x5f\x27\x10\xd8\xec\x15\x16\x7f\x49\x8e\x5c\x07\x34\x05\x50\x3b\xb2\x97\x82\x6b\x10\x33\x2a\xa2\x04\x3c\x9c\xc3\xe8\x23\xe7\x5f\x1c\x29\xc0\xe8\x62\xa0\xb9\x2d\x21\xae\x02\xb8\x3f\x56\x9d\x98\x57\x93\x65\xd5\x6b\xbd\xb6\x1e\x45\xac\xd4\xef\x00\xbb\x03\x5f\x96\x98\x90\xdc\x71\x3d\x14\xe9\x86\x13\x6c\x3a\x5b\x99\x14\x9b\x0f\x91\x33\x0e\xe8\x24\xf4\xef\xdb\xca\x00\xbf\x03\x94\x89\xfe\xbd\xfe\x1d\x7e\xdb\xfa\x0f\xe0\x3c\xd9\x8f\x12\x97\xa6\x0b\x23\x83\x45\xf6\xde\xf5\x54\x05\x6b\x0b\xbd\x68\xc1\x79\x9b\x1d\x90\x32\x7c\x06\x31\x27\xb4\x89\xf6\xf9\xa2\xaa\xd7\xdb\xf2\x34\x37\x2c\x8b\xe0\x1d\x4f\x4a\x8b\x96\x95\x3e\x0e\xf9\x16\x06\xaa\xe3\x84\xc7\xdd\x27\x97\xa9\x0d\x8a\xe5\xee\xca\xad\x71\x8c\x7c\xec\xb4\x61\xc7\x14\x06\x43\xac\xee\x6b\x6d\x19\xfb\x08\xef\x1d\x2c\x9d\xb0\xf0\x90\x19\x86\xbe\x68\xc7\xf8\x50\xae\x3b\xc7\x7c\x59\x3d\xe3\x94\x9f\x19\xf3\xcc\x69\x5d\x93\xc6\x8d\xc2\x08\x8d\x01\xac\x72\xed\xf6\xa3\x62\x9e\xf3\xca\xf2\xb2\xb8\x55\x3e\x37\x4f\x93\xf8\xde\x46\xc3\x45\xd9\x3c\xd3\x75\x46\x35\x8a\x48\xbf\x3d\x51\x7f\xa6\x1a\x05\x50\x1e\x43\x72\x01\xe9\xd3\x91\x8e\xa8\x2c\xf4\x1d\x1a\x74\x80\x10\x22\x75\x34\x68\x52\xe6\x66\xd9\x54\x65\x91\x2d\x89\xfa\x78\x0b\x94\xd6\x59\x1e\xce\x0d\xa0\xa4\x6f\x0d\xad\x20\xb3\xd9\xe6\xe5\xde\x54\xfa\x98\x3b\x07\x5d\x57\x38\x85\x34\x1b\x53\x0d\x34\xb2\x99\x57\xba\xb6\xf1\x56\x1e\xa9\x0c\x02\x3f\x50\x3a\xaa\xb3\x5b\x68\xdc\xf0\x90\x59\xcf\x86\x72\xe4\x90\xa5\x12\xd7\xe6\x64\xae\x62\xfd\xc9\x54\xd0\x5e\x92\xea\x1a\x32\xdd\xef\xd1\x14\xc3\x57\xec\x66\xae\x7f\xb6\x63\xdf\x97\xab\x7d\x61\x78\x42\x49\x32\x88\xef\x82\xdc\x46\xfe\xee\x60\x8c\x0c\xe0\x79\x55\x40\xb1\xfe\xef\x97\x55\xb9\x78\xa1\x8f\x3d\xd7\x00\x0c\xee\x81\x28\x5e\xbf\x15\xe5\xa2\x1e\x38\x39\x55\xb5\xd8\xeb\x3f\xd8\x11\xe8\x69\x5a\xac\xca\x8d\xfe\x94\x2e\xbf\x99\x0a\x6c\x18\xe2\xbe\x76\xa8\xb0\x34\xdf\xeb\xf3\xb2\x2c\xf4\xef\x75\xa4\x4f\xf4\x70\x5b\x65\xb9\x3e\xf9\xe9\xa7\xd7\x4a\xd1\x5f\x22\x7d\x8d\xea\x83\xd8\x1d\xfd\x4b\xb6\x04\x01\x8d\xb4\x79\xe1\x68\x99\x90\x37\x12\x02\xf8\xff\xfb\xbf\x8f\xd2\x50\xfc\x6a\x72\x75\x31\xbc\x7e\x79\x12\xbf\xf9\x2b\xab\xfe\xf8\x9f\xc7\xf5\x7f\x4e\xce\x4e\x7f\x38\x6b\xe9\xff\x9c\xfe\xf0\xc3\xe9\x6f\xfa\x3f\x7f\x8f\x9f\xf9\x9d\xd1\x93\xad\x29\xec\x22\x68\xf7\x37\x3b\xe5\x9f\x93\xf8\x4d\xa4\x4f\x7e\xd4\x7f\x48\x0b\xa7\xfd\x23\xe4\xc5\x4e\x7e\xfa\xe9\xc7\x97\xf6\x77\x91\x0e\x2e\x27\x13\x38\xc3\x3c\xd7\x53\x2c\xd1\x4e\x59\x66\x4c\x8f\xcb\xc6\xfc\xac\xdb\xba\x65\x1d\xd2\x8a\xa3\x61\xd5\x64\x75\xe3\x47\x76\xa4\xd2\xf0\xac\x74\x70\x9d\x6b\x53\xe5\xfa\x9a\x8c\x22\x0a\x9d\x32\x79\xdc\xb0\x0e\x3a\xba\x3c\x97\x65\xad\x80\x83\xdd\xf1\x4d\x23\x4c\x3d\x77\xfa\xa6\x5c\x05\xab\x4c\x6a\xdd\xa3\xeb\x69\x32\xfc\xfc\xe1\x2a\x41\x12\xc0\x16\xa3\x02\xab\x09\x31\x91\x5e\x93\x36\xa6\x5d\x08\x45\xcf\x95\xf2\x82\xfa\x1a\xb5\x63\x14\x35\xb7\x41\x6d\x6f\x45\xd2\x84\x0e\x0a\xe6\xe7\xfa\x13\xe6\xbe\x59\x6c\xb5\x26\x79\x1a\xb3\x59\x70\x11\x4c\xa5\x3c\x5b\xcc\xaf\x00\x04\xc9\x90\xc9\xc7\x68\x61\x23\x38\x57\x48\xba\x06\x1a\x83\x73\x63\xbd\x3d\xd9\x0c\xe1\x9a\x68\xe8\x63\xbe\xd2\xee\x08\x66\xbb\x7d\xd4\xf4\x44\xd8\x8f\x6e\xcf\xff\x97\x65\xf5\x12\x5a\xc2\xb8\x59\x78\xaf\xd7\x69\x7d\x07\xe7\x2f\x34\x62\x05\x57\x25\xed\x10\xd6\xbb\xec\xf4\xc0\x78\x65\x45\x7b\xf0\x1c\xd1\xdd\x8e\x04\x73\x10\xce\xb7\xe4\x94\x44\x7c\xbd\x5c\x31\xe4\xe5\xb5\x27\x36\x6a\xb5\xb1\x7b\x5e\x95\xbe\x0b\x62\x5f\xa8\xa8\x42\x99\x5f\x41\xef\x37\x54\xbd\x53\x47\x33\x62\x4d\xd6\xb4\xa1\xe4\x60\x09\x10\xe8\x26\x0d\x14\x5b\xee\x52\x22\x86\x30\xa6\x70\xe0\x71\xeb\x56\x02\xe7\x40\xf0\x5b\x98\xe6\xe5\xb2\xac\x56\xf0\xfe\xdd\x4e\x78\xb0\xde\xac\xf3\x81\xdb\xcf\x69\x47\xd5\xfe\xdd\x11\xd4\xb3\xee\x4a\xc8\xcd\x66\xe8\xe6\x0b\x2d\x5f\xa7\xb5\x27\x98\x23\x01\x04\xa3\xc4\x02\xb1\xd7\x45\x31\xc8\x1a\x0b\xd0\xe8\xb1\xbc\xa8\xb0\x37\x06\xbb\x6f\x41\x89\x88\x01\xfb\x5d\x74\x4f\x56\xf3\x6c\xd8\xab\x4d\xfd\x4a\xe0\xaf\xac\x8d\xa1\xb1\x52\xdf\x0b\x47\x08\x7f\xda\xd5\x0d\x60\x98\xa8\x0c\x92\xd6\x19\xcc\x00\x08\x6a\xab\x65\x69\x37\xf9\x6a\xe7\x6b\x80\x88\x52\xaf\x23\x2c\x53\x78\xf2\xe4\xac\xb8\x2f\xf3\x7b\x06\x44\x02\xee\x37\xd6\xc7\x5f\x21\xf7\x4c\xe8\xaf\x85\x09\xe0\x59\x7c\x67\x5f\xb8\xe8\xac\x2c\x70\xd6\xa5\xa0\x28\xf6\x33\x10\xfc\x64\xb3\x2b\xb2\x06\x80\x05\x48\xd8\x0c\xde\xdd\x26\xad\xbe\x19\x82\x19\x12\xcc\x31\x25\xd9\x0d\x63\x80\xb9\xd2\x3a\xb6\xf9\x5e\x0f\xef\xd3\x2c\xb7\x73\x74\xe4\x38\x2b\x91\xb5\x6b\x8d\x54\xac\xf8\xa0\x2b\xe7\xe9\x65\x50\x27\x05\xf0\x71\xe4\x3b\xd6\x05\x9f\x38\x28\xcb\xf2\x34\xd8\x35\x70\x97\x16\xab\xdc\x55\x8c\x1b\xb3\xf1\xba\x66\xe2\x8e\x1e\xa0\xc3\x86\x03\xee\x64\x2f\xda\x8e\xde\x04\xbd\x89\x0d\x08\x85\x7d\x24\x0a\x10\x0a\x0c\x10\x20\x25\xa8\xe7\x90\x27\x63\x85\x81\x29\xe8\x95\x1d\x20\x27\xe4\x98\x5b\x60\x27\x79\x23\xba\x93\x8d\xed\x36\x6f\x3f\x0e\x9b\x04\xfa\xa8\x8f\x2c\x8e\x17\x91\x11\x64\x71\x3d\x95\x4a\x97\x3f\x80\x60\xd9\x73\x74\x7a\xe7\xbb\x0e\x79\xf5\x30\x2f\xb1\xd8\xdd\xea\x75\xf6\x2b\x30\x76\x96\x55\x93\x2e\x10\x82\x0f\xbf\xd2\x5e\x2c\x2c\x30\x8c\x5d\xb6\x64\x3a\xcc\x2f\x4a\xc0\x1b\x96\x95\x3f\x4f\x3b\xc6\xc0\x46\x7a\x34\x01\xc2\xac\x28\x32\x4d\x76\x8a\x49\xff\xb7\xa1\xf8\x53\xf0\x44\xc9\x69\x65\xfb\xd6\xe2\xa6\x71\xc8\xd0\x2e\x6d\x60\x6b\xfa\x89\x1d\xf2\x21\xdd\xb7\x3b\x2f\x11\xc4\x57\x9b\xaa\xc1\xa8\x27\x84\xeb\x66\x4c\x06\x49\x84\x78\x98\x23\x21\xba\x3c\x1b\x89\x21\x21\xa6\x29\x5a\xb4\x79\x29\xf6\x1f\x3f\x02\x7c\x76\xc9\x95\xc9\x38\x71\xf8\x08\xce\x0f\x21\x0a\x1a\x41\xe8\xf0\x50\xe1\x2b\x21\xd3\xd9\x79\x11\x62\x42\xb0\x7c\x6f\x36\x1a\x37\xb2\x72\x1b\x99\x3c\x00\x6b\xed\xf7\x7a\x5b\xd6\x88\xba\x4f\xb3\x55\xeb\x1e\x4d\xa9\x6f\x6a\x53\x18\x84\x99\x15\xa2\xb1\x45\x31\xc7\x66\x59\xc1\x10\x79\xf3\x86\xdf\x47\x2e\x0f\xe8\x80\x48\xab\xe5\x1d\xc8\x91\x65\x0e\xa7\x5e\xeb\xdd\xae\x30\x4d\xbc\xdb\xc5\x85\x69\x22\x85\xe5\xfa\x54\x56\x23\x3b\xae\x09\x56\xe6\xa0\x55\xe3\xf0\x9c\xf4\x6f\x44\x23\x0c\x3f\x72\x2d\x2e\x06\xdd\x4e\x36\x5e\x2c\x08\x69\xca\xec\xb9\xc2\x4b\x0a\xcb\x81\x44\xdb\x52\x56\xb7\x69\x91\xfd\x27\x9f\xc2\xcb\x81\xae\x0c\xa5\xae\xf6\xc0\x62\xcf\x62\x06\xb2\x89\x9a\xa4\xa0\x30\xb0\x65\x64\x1b\xcb\xc4\x93\x94\x36\x8f\x5d\x7c\x2d\x20\x56\x01\xab\xb8\xf0\x44\x2e\xc1\xf2\xb2\x61\x34\xf3\x99\x6d\xac\x3f\x9d\xeb\xad\xf5\xff\x00\x90\x68\xd7\xf0\x81\x91\x91\x17\x92\x9b\xb4\xca\xf7\xce\xcf\xac\x61\x75\x67\xec\xce\x8a\x06\xa5\x9e\x3d\x89\x53\xba\x1a\xe0\xb2\x43\x23\x12\x82\x3b\x2a\x40\xdb\xe0\x85\x9d\x27\xd1\xe3\x3b\x08\x36\x9d\x96\xf3\xe7\xfa\x84\x7a\xb6\xf6\x41\x86\x1c\xfb\xf0\xbd\x64\xb0\xcf\xdb\x80\x01\xc5\x6a\xfb\xb9\xf9\x3b\xf2\x1d\xdb\xd7\xe1\xf2\x0b\x48\x8d\xec\x9a\x50\x90\xdb\xa4\x40\x76\x04\xe4\x36\x60\xae\x4a\xff\xb6\x60\xf8\x6e\xa7\x0d\xb0\xf7\x87\xc0\xfc\x2c\xa6\xd6\x5e\xe2\xd8\x6e\x10\x36\xd4\x04\xb3\x2f\x1a\x92\xfa\x19\x7c\xc2\x3d\xa2\x58\x1f\xbb\xea\xb8\xc8\x4b\x79\x9f\x47\x57\x3b\xdf\x33\xab\x5a\xad\xc8\x9d\x0d\x1a\x2c\x76\x11\x26\x1c\xbc\x74\xf0\x07\xd8\x4e\xe8\x5c\xb7\x97\x30\x5f\x48\x04\x64\x76\xb1\x88\xd9\x86\x02\x80\x9c\xef\x47\x5f\xd7\x63\xef\xe2\x6f\xb2\x19\xde\x0a\x6a\x29\x66\xea\xad\x7a\xbd\x56\x07\xf1\xed\xe2\x26\xa5\xd3\xdb\xbe\x5a\xb1\x87\x2f\xe3\xd1\x05\x50\x0a\x20\x59\xda\x6d\xad\x77\xd0\xf9\xba\x04\x56\xab\x1e\xea\x60\xb9\x27\x91\xc7\xc1\x77\x0a\x74\xf9\x29\x82\x2f\x40\x93\x14\x11\xea\x19\xd9\x14\x75\x4c\xa5\xa4\x3d\x68\xb8\x9b\x6a\x99\xa5\xf9\xc0\xdb\x82\x80\x86\x11\xfc\xdb\x4a\xf5\x7f\xa5\x1f\x75\xd8\x6b\x18\xa0\x8f\x60\x75\x6f\x6c\xb4\x6b\x54\xf0\x5c\x9c\x1a\x5d\xed\x90\x1b\x19\xf3\xf0\x0f\x05\x32\x56\xcc\x05\x01\x7a\xc7\x12\x78\x4a\xd9\xd4\x2e\xc3\xed\x0e\x1c\xfa\xb2\xe2\x4e\x71\xf8\x3d\x12\x87\x7b\x57\xeb\xa0\xd1\xe3\x61\x06\x10\x7c\x41\xc6\x11\x44\x56\xaa\xf5\x6d\x8c\x18\x16\x06\xda\x48\xa0\x70\x53\x6e\x20\xdc\x41\x84\x04\x06\x9e\xc0\x6d\x00\x25\x3a\xf0\xdb\xeb\x32\x5f\x89\x09\x65\xc4\x2b\x33\xe7\xf0\xbb\x5b\x09\x54\xbb\x3f\x72\x7f\x88\xf5\xb9\xae\x77\x8b\xaa\xb4\x61\x89\x9c\x0b\x24\x78\xa4\xd9\x82\x4e\x7f\xea\xaa\x6e\x19\x78\xd2\xd7\x50\x66\xb3\x03\xf5\x4d\x79\x31\xfb\x65\x90\x76\x01\xeb\x20\xa8\x6c\x82\xab\xa0\xa3\x49\xba\xf0\xde\xcd\x54\x9e\x2d\xa8\x3d\x41\x2c\xe4\x24\x5a\x7a\xcb\x35\xbd\x3a\x78\x87\xfa\x3a\xad\x52\xc0\xfa\xe9\x77\x81\x5b\x69\xea\x70\x84\x7c\xda\x7b\x5d\xd5\x85\xb9\x4b\xef\x33\xaf\xd1\xdc\xf5\x53\x11\x44\x8a\x48\x69\xc7\xf4\xd4\x94\x7a\x0d\x90\x34\xc0\x57\xde\x56\x86\x9a\x6c\x4c\x8d\x11\x73\xcb\xd5\xf9\x31\xf6\xb5\x89\x47\xa6\xbc\xf3\xca\xe4\x94\xa3\x9a\x85\x7f\x18\xf5\x17\x4d\xb7\x96\xd3\xad\xdc\xb6\x2a\x56\xdf\xb7\xa2\xbb\xa6\x4d\xf2\xf3\x6c\x85\x8c\x22\xf3\x0b\x60\x01\xc3\x81\xa6\x3a\x4f\x4c\x0b\x79\x57\x9b\x15\xc1\x87\xda\x69\xc0\x56\xf4\xf6\xe8\xe6\xe0\x26\x2d\x95\xb2\xca\x43\x86\xd9\x29\xc7\x1d\xbc\x6e\x8d\x08\x6a\x74\x2c\xc7\xe7\xba\xda\xb7\xa1\x3d\x85\x46\xae\x39\x39\x91\x87\x32\x30\xae\xc5\x80\x1e\x07\xa9\xa2\x57\x65\x85\x82\xcc\x88\x98\x02\x21\x48\x6b\xc5\x3a\x59\xd1\xac\x0e\xa7\xc9\x3e\x36\xa1\x12\x97\xf6\x39\x48\x47\xa0\x31\x85\xc4\xa4\x61\xab\xd1\xfc\xd3\x68\xa6\xaf\x87\xe7\xff\x32\xfc\x08\xc0\x28\x42\x1f\x5d\x68\x86\x1c\x0d\xc7\x17\x0e\x76\x34\x1c\x7f\x65\x74\x91\xc0\x16\x09\xbc\x50\xa4\x3c\xcc\xc8\x7d\x0b\xa0\x1e\xa0\x92\xf3\x1c\x98\xd1\xc8\xc3\x8c\x14\x15\x20\xf5\x23\x30\xa3\x3b\xa3\x93\x62\xf5\xdf\xa7\x06\xf3\x8f\xfc\x89\x5f\xcd\x1e\xb2\x75\xf3\xd2\x01\x06\xff\x06\x55\xa0\xc7\xeb\x3f\xaf\x5f\xbf\x3d\x7b\xd3\xaa\xff\xbc\xf9\xe1\xe4\x87\xdf\xea\x3f\x7f\x8f\x9f\xe9\xae\x80\xe4\x27\x63\x66\x93\x36\x91\xd7\x70\x9b\x2e\xef\x8c\x3e\x8d\x5f\x73\xf5\xe5\x67\xad\x54\x8b\xf5\xcb\x09\x5f\x3b\xd1\x51\x77\xa0\x11\x57\x7c\x96\x1b\x36\xa5\x9e\x8c\x0f\xc2\xe2\x80\x84\x4d\x7e\xd3\xfe\xcf\x6c\x16\x66\xb5\xf2\xfe\x86\xd1\xc4\xe1\xc0\xde\x1d\xf1\x39\xd5\xbb\xbc\xf1\xee\x6b\x90\x6b\xc4\xee\x5b\xfa\x38\x9b\x4a\xf4\x02\x20\x1b\xdd\x08\x97\xbf\xa6\x9e\x27\x9f\xa1\x91\x79\xde\xc5\xde\x77\x90\xbf\x39\x4e\x07\x91\x7e\x73\x6c\x43\xba\x62\xa5\xdf\x1c\xaf\x06\x2d\x14\x48\xfc\x5f\xc2\x40\xc5\xaf\xfe\x30\x9b\x8c\xff\x66\xa5\x5f\xf8\x79\x62\xff\x9f\x9e\x9c\x9d\xb4\xeb\xbf\x67\x3f\x9c\xfd\xb6\xff\xff\x1e\x3f\xf6\xed\x3b\x50\x8d\xc0\x6c\x2d\x07\xfa\xf4\xf5\xeb\x53\x0d\xab\xa3\xac\x6e\x95\xba\xf6\xdd\xe2\xd0\xb9\x07\x00\x0f\x6a\xb7\x8d\x10\xb3\x55\xae\x29\x66\x8d\x58\x03\x6d\x6b\xaa\xda\xfa\x51\x42\x66\xda\x7a\x87\x2e\xd4\x09\x80\xe2\x32\x43\x4e\xc9\x01\x16\xd0\xb5\xfe\xe2\x31\xd4\x82\xd9\x3c\x1c\x41\x16\x40\xaf\x4c\x9a\x2b\x4e\x2a\xb6\x1d\xa2\x20\x8b\x2f\xf8\xd2\xba\x02\x61\xbe\x83\x58\xa1\x2f\x1d\xb5\xc8\x14\x36\x06\x1e\x8b\x60\x62\x61\x43\xb4\xe4\x37\x60\x7e\x32\x93\xe7\x2a\x2c\x47\xcc\x9c\x18\x35\x4a\x07\x71\x47\x28\x4e\x51\xcd\x11\x5e\xf8\x24\xa0\x54\x51\x15\x80\x4c\x13\xbd\xe9\x61\x8b\xb5\x00\x2c\x06\x72\x35\x73\x47\x65\xd4\x2b\x88\x04\x2f\x40\x70\x00\xd0\x9f\x30\x24\x00\xa1\x73\x12\x54\xcb\x0a\x45\xf0\x9d\x0c\xf9\x3d\xeb\xdd\x02\xa4\xcc\xb3\x34\xef\x90\x68\xf2\xd0\x49\x24\xcf\x07\x36\x7c\x59\xc7\x12\xfd\xb1\x2c\x57\x40\x4e\xa0\x93\x7b\x00\x40\x59\x47\x91\x71\xb8\x7d\x7e\x69\xf4\x14\x16\xde\xb9\xa9\xaa\x0b\x81\xef\x43\x21\xdb\x1b\x3e\x0a\x7c\x8f\x9e\xc4\xc3\x81\xaf\x3c\x9e\x8c\x47\xe3\xcb\xe9\x68\xfc\x31\xf9\x9c\x8c\xe7\x21\x98\x7c\xf6\x69\x78\x75\x05\xb7\x1a\xde\xcc\x3f\x4d\xa6\x80\x50\xee\xf6\x05\x78\x20\xf7\x25\x21\xc5\xcf\xaf\x86\xa3\xcf\x91\xc3\x61\x3b\x08\xb2\xfd\x18\x8e\x4e\x7d\xf9\x94\xc0\xaf\x46\x63\x3d\x1c\xeb\x21\xe0\xd9\xa1\xf7\x61\x32\x9e\x4f\x87\xe7\xf3\x48\xcf\x27\xd3\xb9\xfb\xea\x97\xd1\x2c\x89\x1c\xa0\xfb\x72\x3a\xf9\x1c\x11\xac\x1b\xe1\xdc\xf6\x7b\x63\x44\xc5\x23\x3e\x3a\x78\x23\x80\xb4\x06\xf0\xb7\x1f\xcb\x45\x32\xbc\x1a\x8d\x3f\xce\xec\x97\xe5\x87\xff\x6b\x1c\x7e\xbf\xfd\xfc\x5f\xf1\xab\x2b\xb3\x6d\xca\x22\x5b\xa6\xff\x20\xfc\xd7\xeb\x93\xb3\x37\x6d\xff\xff\xec\xed\x9b\xb7\xbf\x9d\xff\x7f\x8f\x9f\x10\xa6\x7d\xfa\xfa\xf5\x89\xf6\x0b\x42\x0f\xf3\x9c\x89\x35\x2a\x46\x6d\x71\x43\x72\x90\x12\xf9\x7e\xd8\x32\x68\xac\xc8\x96\x2c\x61\xca\x63\xa5\xc6\x25\x03\xc4\x25\x40\xa4\x64\xee\x96\xda\x93\x79\x60\x71\x1c\xfd\x8d\xb2\xf0\x3c\xa9\xa2\xd7\x19\xd0\x08\x2c\x0b\x29\xc6\x0e\xb5\x51\x90\x5c\xf4\x04\xd3\xf0\x94\x35\xb5\xe7\x3b\xd6\x01\xd7\x3d\x5f\x29\x24\x70\x41\x06\x08\xc7\xeb\xe6\x7b\xc2\xeb\x74\x0f\x45\xc4\xac\x60\x21\xc7\x58\x27\xdc\x22\x91\x79\x82\x12\x7f\xf0\x7a\x96\x15\xaa\x8f\xb7\x13\x5b\x3c\x68\x41\x79\x8a\xdc\x33\x9c\xc9\x42\x06\xe7\xe2\xa5\xff\x8d\xa2\x01\xd7\x82\x81\xd5\x7b\x09\x92\x5b\x05\x65\xed\x8e\x4f\x06\x02\xc3\xe0\x69\x0c\xa4\x46\xe9\xae\x6e\x38\x61\xb5\xc9\xea\xca\x50\x6b\xae\x59\xbd\xc7\x4b\x9c\x0e\x7c\x8d\xd6\x35\xf8\x32\x3b\x17\x90\x5e\xe5\x7b\x84\xb4\xac\x98\x15\x09\xda\x1a\x94\x3a\x3e\x1b\xe0\xfd\xc8\x05\x11\xa9\xb1\xca\x6c\xca\x7b\x14\x1f\x00\xd4\x31\x67\xc0\x50\x55\x99\x88\xfd\x3c\xbf\x26\xfd\x2a\xa4\x93\xfc\x47\xef\xb1\xff\x93\x7f\x18\xff\x7b\x1a\xbf\xfb\x47\xd9\xff\x37\x27\xaf\x3b\xf1\xdf\x0f\xef\x7e\x8b\xff\xfe\x2e\x3f\xcf\xc2\xff\x9e\xc6\xef\x22\x7d\xf2\x46\xff\x61\x57\x18\x38\x23\x94\x9a\x9a\x8e\xbc\xef\x4e\xf2\x9f\x3c\x2b\xae\x3b\x96\xd1\x9c\x62\x4a\x29\x0e\xcf\x64\x55\x3b\x42\x5a\x31\xc7\xad\xd0\x65\x4b\xec\x8b\x81\x94\xfd\xd2\xc6\x34\x3f\x03\x82\x2c\x1c\x72\x8d\x4d\xc7\x2d\xfb\x56\x19\x1b\xa8\x8a\x78\x09\x10\xbc\xa4\xd0\x57\xac\x84\x0c\xd3\x69\xf7\x82\x59\xa1\x05\xc3\x28\x5f\xd0\x51\x4c\x23\xf9\x08\x97\x84\xdb\x97\x57\xe2\xf2\x11\xf7\xb4\x20\x35\x87\x7f\x20\xa7\x81\x22\x1e\xd7\x83\xc9\xe8\xec\x55\xe1\x24\x53\x44\x4a\x98\x31\xc7\xb4\xea\x66\xd0\x9d\x0f\x2d\x0e\x5e\xad\xf5\x59\xf7\x19\x51\x3c\x14\x79\xb1\x75\x1a\x40\xef\xf6\x1d\x14\x34\x22\x45\xe6\x0e\x4e\x03\x83\xaf\xd2\x95\xb1\xa7\x80\x8b\x18\xf1\x9c\xaf\x9d\xd4\xab\x14\xb8\xaf\xdd\xb1\xa3\x16\x9e\xd2\x9c\xcb\xbe\x84\x1f\x95\xd4\x83\x5c\x38\x21\x64\x61\x6e\x22\x5c\x97\x3c\x01\x2b\x93\xe6\x59\x71\x8b\x29\x03\x99\x6d\x6c\x17\x51\x22\x5f\x3f\x81\x6a\x4a\x50\x45\x79\x1b\x1f\x42\xba\x53\xfe\xf1\x3e\xe3\x44\x68\x7e\x98\x0e\x23\x49\x97\x77\x0a\x3e\x4b\x49\x15\x41\x42\x41\x9a\xa6\x1d\x22\x0a\x2e\xee\x33\x2a\xca\x8d\x9f\x9a\xdf\x02\x29\x42\x4f\x03\x4b\xf7\x00\x8a\xa5\x4e\xdf\x24\xb2\x08\x39\x3d\x2f\xfe\xb4\x72\x74\xd7\x4c\x20\x02\x85\xa3\xde\x08\xfd\xc3\x57\x08\xff\x26\xd7\xc9\x18\x27\x64\x72\x33\xbe\x80\xfa\x0f\x77\xba\x62\x43\xf3\x64\x3a\xd3\xff\xfe\xef\xc3\x99\x1a\xcd\x5e\xbc\x80\x3f\x89\xfa\x52\xd0\xbd\x2e\x2b\x4c\xa2\x91\xbd\x27\x8c\x8f\xd4\x9f\xd5\xc8\x7e\xb0\xc2\xa4\xec\xc3\x5d\x8c\x66\x10\x7f\x27\x17\x87\xa2\xf9\x9e\x67\x8d\xf4\x68\x3e\x0b\x1e\x36\x52\x14\x35\x63\xec\x7f\x3c\x1b\x40\xec\xfc\x65\x9c\xe0\xbf\x2f\xc3\x10\xbb\x9b\x04\xb8\x18\x4d\x13\x1b\xc7\x8f\xc6\xf4\x2f\xe5\x7b\xb6\x45\x23\x77\xf2\xc7\xe4\xf3\xf5\x15\x30\x19\x1c\x6c\xe4\x3e\xee\xce\xa2\x92\x74\x00\xd7\xd3\xc9\xf9\xcd\x14\x32\x18\xd8\xbc\xfc\x61\x36\x1f\xcd\x6f\xe6\x89\xfe\x38\x99\x5c\x40\x02\x02\x5b\xe9\x93\xd9\x7b\xd7\xc0\x7d\x33\x4b\x22\xe8\xde\x86\x27\xbd\x9e\x4e\x2e\x47\xf3\xd9\x7b\xfb\xd9\x0f\x37\xb3\x11\xcc\xf3\x68\x3c\x4f\xa6\xd3\x9b\x6b\x3b\x43\x03\xfd\x69\xf2\x25\xf9\x25\x99\x6a\x20\x71\xb8\x80\x17\x02\x8b\x04\x16\xd0\x64\x6a\xe3\x00\xe5\x33\x1c\x5a\x64\x38\x7c\x52\x63\x36\x9f\x8e\xce\xe7\x22\x11\x02\xb9\x89\xc9\x74\x2e\xbb\xce\xc7\xc9\xc7\xab\xd1\xc7\x04\x68\x06\x44\xfe\x63\xe0\xf2\x1f\x23\xbc\xed\x97\xe1\xd7\x56\x6f\x3b\xfe\x53\x2c\x75\xd7\x13\xae\x9e\xdd\xef\x1d\x2b\xe5\xac\x03\xf4\xce\x39\xbb\xc7\x66\xaf\xb7\x4d\x46\x05\x5d\x35\x3f\xbd\x84\x80\xec\x80\xa9\x89\xac\x71\x7e\x28\xcb\x95\x3e\x07\x45\xe3\xf3\x34\xcf\xd6\x65\x55\x64\x69\xa4\x6f\x66\xc3\x03\x3d\x37\xd7\x01\xe9\x67\x8f\x16\xde\xaa\x07\x4f\xad\x3a\xcd\x2d\x14\xc6\xfc\xe6\x5c\xff\x17\xff\xf1\xfe\xff\xe9\x3f\xcc\xff\x3f\x7d\xf7\xf6\xb7\xfe\xbf\x7f\xd0\xcf\x33\xfd\xff\xd3\x48\x9f\xe8\xcf\x69\xb5\xbc\xb3\xfe\xff\xeb\xdf\xfc\xff\x5e\xbf\x98\xc4\xad\xd8\x39\x3e\xe4\x13\x7f\x77\xe8\xd0\x1c\x2c\xe4\x44\xea\x40\xa4\xf0\x9c\x40\x21\x7c\x1b\xea\xcf\x0d\x14\xce\x04\xd8\xe9\x88\xd7\xd2\x51\x90\x2f\x3a\x0c\x70\xd2\x6d\x80\x93\xf2\x00\xa7\x8e\x6f\x7e\x08\xd7\xf4\xf8\x91\xfa\x26\xd6\xd7\x87\x51\x54\xee\x26\x22\xe9\x44\x9a\x96\xe2\x61\x8a\x12\x00\x5b\x4a\xfc\x0a\x95\x7f\x69\x2a\xb3\x8a\x42\x9c\xef\x1d\xaa\x0a\x86\xfa\x36\xd6\x17\x3b\xa3\x97\x95\x59\x65\x8d\x68\x3d\x45\x96\x3a\xaa\xf6\xf9\xed\x5a\x95\x50\x05\x3c\xbe\x6b\x9a\xed\xcf\xaf\x5e\x3d\x3c\x3c\xc4\xe5\xd6\x14\xf9\x2a\xdd\xc6\x65\x75\xfb\x6a\xe0\x01\xaf\xff\x3d\x43\x95\xdf\xc2\x93\xef\x09\x4f\x60\xf8\xad\x00\x45\x3d\x23\xe4\xd0\xdf\x1b\x72\xa8\x47\x42\x0e\xfd\x7d\x21\x87\x7a\x2c\xe4\xd0\xdf\x15\x72\xa8\x47\x42\x0e\xfd\xdd\x21\x87\x7a\x34\xe4\xd0\xdf\x11\x72\xa8\x47\x43\x8e\xe7\x53\x4c\xfd\xf5\x42\x8e\xd7\x07\x1b\xf9\x7f\x8b\x39\xfe\x9b\xfd\xc4\xaf\x7e\xcd\x0a\xd3\xac\xfe\x96\x08\xb0\x27\xfc\xff\x33\xfb\xef\x56\xfd\xf7\xe4\xf4\xb7\xfa\xef\xdf\xe5\x67\x32\x1d\x7d\x1c\x8d\x87\x57\xcc\x9f\x49\x74\x1c\xb2\xba\x7b\xbc\x1c\x84\x64\x1f\xa7\xf6\xbc\xbf\x4e\x8b\xf4\x36\x2b\x9b\xac\xd6\xf3\x3a\xab\xb2\x5b\xfb\x4f\xc2\x1c\x61\xe1\xf6\xb8\xf7\x23\x03\x56\x20\x09\xd5\x47\x04\xe4\x2a\x34\x0d\xaa\x1b\x4f\x80\x0a\x49\x08\x10\xa3\xbe\x2a\x2e\xd3\x42\xbb\x2f\x79\x62\x6b\xd3\x2b\xe3\x7a\x00\x18\x65\x7e\x6d\x80\x33\xaf\x90\x9a\x8c\x2d\x81\x3a\x56\x2c\xe7\xda\x24\xf8\x4b\xfc\x71\x87\x99\x82\x01\x55\xdd\x30\xc9\x2b\x78\xf9\xce\x1f\x4f\xc2\x06\x21\xc4\xe3\x57\x89\x95\xfa\xdc\xee\x01\x0e\x27\x89\xfa\x1d\x84\x7d\x8d\x04\xf7\xb6\xa4\x5b\x08\x75\x2d\xdd\x05\xca\xce\x07\xf5\x36\x6d\x96\x77\x9e\x0a\xcf\x35\xbb\xbb\x5a\xba\x10\x5d\xf2\x31\x47\xba\xc2\x78\x24\xcd\xd1\x87\xc3\x6a\xf3\x09\xfa\xa4\x2d\xe6\x64\x46\x09\xb8\xe1\xa4\x35\x5d\x09\xe4\xa6\xf0\x3b\xeb\xac\xaa\x1b\x7d\x26\xe5\xda\xe8\x70\x6b\x5d\xed\x38\x8b\x8d\xfe\x1d\xfe\xc7\xef\xe3\xce\x3f\x06\xa8\x2b\x44\x6a\x3c\xbb\x82\x7a\xc2\x63\xa5\x16\xb1\x1e\x02\x9b\xa2\x97\x69\xe3\x91\x81\x04\x1b\x31\xaf\xf7\xdc\x12\xc9\xfe\x91\x17\xa0\xb9\x33\x2a\x10\x07\xce\xcd\xbd\xc9\xe9\x19\x1c\x23\x41\x56\x4b\x31\xb8\x2e\xfd\x3c\x8b\xcd\xb5\x1b\x3c\x4f\xf1\x42\xc1\x87\x5a\x8d\xd6\x30\x66\x6e\xc4\xbe\xcb\xea\x57\xf6\xed\x43\x8c\xb6\xd8\xd3\x83\x40\x1d\xa4\x41\x2a\x35\x1f\xdd\x09\x7e\x6e\xf1\x60\x30\x56\x68\xab\xc7\xbd\x85\x13\x22\x14\x55\x14\xef\xc1\x87\xca\x5e\xae\xdd\x39\xd5\x59\x63\x71\x60\x2b\x36\xe9\x37\x68\x19\xd5\x0e\x56\x90\x3a\xa5\x2e\x12\x57\x47\x99\x51\x44\x7b\xb4\xd3\x0c\xaa\x65\x00\x98\xa1\xd1\xc5\xae\x47\x69\xad\xb3\xfa\xc8\x19\x85\x14\xa4\xb3\x41\xe4\x0a\xe4\x33\x5a\xe4\x78\xed\x2d\xf6\x33\x37\x8e\xfe\xac\x4f\xe3\x93\xf8\xc7\xf8\x87\x97\xcb\x5d\x05\x4d\x40\x2d\x1a\x24\x48\xd8\x2e\xf6\x7a\x5a\x2e\xf4\x87\x2a\xdd\x15\x4a\xcd\x40\x4b\x47\x0f\x69\x2b\xb4\x2f\xf5\xd3\xb6\x32\x27\x6f\x52\x71\x21\xbe\xc6\xac\x31\xf7\x46\x7f\xac\x76\x8b\x05\x81\x6e\x32\x82\xdd\x9b\x6a\xdb\x30\x0e\x42\xdb\x25\x9c\xeb\x11\x90\x6f\x98\x80\x38\xc9\x6d\x52\x9c\xe5\xc8\x75\xee\x2b\x3c\xf4\x35\xc8\x89\x22\x93\x10\x46\x71\x1b\xa3\x8f\xdd\xd0\x11\x61\xcb\xe1\xdb\x5d\x76\x2b\x69\x0f\x71\x69\xd8\x9d\x39\xb2\xcb\xc9\xde\xdc\xe9\x2b\xf1\x35\xb9\xb5\x97\xbf\x63\xcd\x49\x71\x8b\x94\xd3\x28\x16\x9f\x86\x9a\xa2\x2a\x68\x1f\x8b\xf5\x87\x5d\xa3\x47\x7a\x95\xa1\x84\xca\xc6\x60\xbf\x15\x70\x6c\xe6\x69\xdd\xb4\x64\x56\xad\xc5\xb2\x3b\x78\x56\xba\x7e\x84\x87\xb4\x10\x7d\x01\x3b\x62\x21\x3f\x8d\xc7\xf1\x3f\xeb\xe3\xb1\xfe\xfd\xff\xab\xcf\x06\xed\xe1\xd9\xb5\xb4\xde\x35\xbb\xca\xf0\x34\x39\x34\x8b\xeb\x3f\xad\x4c\x6e\x52\xbb\xce\xc6\x25\x4b\x89\x8f\x74\xba\x09\x04\x03\x8c\x3e\x8d\x4f\xe3\x7f\x06\x26\xcd\xf7\x8a\xe1\x47\x20\x3a\x0e\x3d\x06\x45\xbe\x27\x06\x21\x20\x18\xd8\x21\x6b\xf8\x38\xdd\xb8\xd6\x6a\xf3\x6b\xc3\x77\xd2\xa7\xf1\x59\xfc\x1a\xbf\xaa\xa8\x2b\x15\x18\xf4\x08\xea\x84\x5f\xa7\xed\x62\xef\x4b\x1a\xce\xb0\xc4\xfe\xf9\xb0\xcb\x1c\xbf\x9a\x8d\x47\xc3\x7f\x24\xfe\xff\xed\xe9\xe9\x0f\xa7\x1d\xfc\xff\xbb\xdf\xfa\x7f\xfe\x2e\x3f\xb3\xf9\x64\x3a\xfc\x98\xe8\x71\x32\xff\x32\x99\xfe\x0b\x06\xa9\x17\x37\xb3\x39\xf0\x4d\xcf\x26\xe7\x23\x48\x1d\x28\x75\x7d\xf3\xe1\x6a\x74\xce\x6e\xa2\xe4\x86\x3b\xe1\x33\x5d\x30\x73\x01\x67\xcf\x89\x3e\x3a\xf7\x18\xb5\x9b\xda\xb1\x13\x85\xed\xef\x2d\x42\x14\x4f\x2c\x82\x8a\x9a\xe7\xe5\xca\xa8\x94\x79\x51\x00\xe8\x27\x14\xba\xf6\x70\xa7\x53\x7b\xa7\x82\x31\x82\x7c\x1b\xa0\xd3\x30\x45\x03\xf8\x40\x60\xcf\x40\xe6\x63\x92\x84\x20\xdf\xc8\x53\x86\xd9\xbf\x52\xdd\xfb\x73\xeb\xc0\x3d\x89\xcf\x82\x5b\x78\x26\x2f\x66\x3f\x62\xa9\xc8\x54\x6a\x21\x4d\xd8\x00\x9f\x03\x6a\x0f\x92\x82\x2d\xe7\x0d\x52\xa3\x90\x3f\x13\x97\xf7\x38\x8f\xf0\xc3\xac\x7a\xec\x84\x27\x11\x9e\xa8\xc4\x57\x61\xb0\x6f\xec\x60\xfd\xf4\xc9\x51\x06\x43\xb2\x33\x11\xde\xc1\x81\x27\xdd\xb3\xa8\xbe\x67\x81\xf1\x05\xdf\x8c\x3c\x09\x4f\x5a\x1b\xd1\x6d\xe1\x1a\x04\x80\x60\xaa\x5c\xc3\x00\xdf\xea\xa3\xc4\x53\xa1\x5e\xc8\xf5\xf0\x99\x55\xc4\x79\xd4\xa9\x10\x16\x77\xe2\x00\x84\x03\x35\x2b\x6e\xfe\xf0\xcc\x01\x82\xe4\xce\x13\x6b\x31\x2a\x54\x10\xb0\x36\x55\x5a\xd4\x6b\x14\xcd\x58\xa5\x4d\x1a\xd3\x3a\x7e\xa7\x8f\x7c\x9b\x32\x0f\x42\x4e\x27\xbb\xe5\xe8\xc7\x79\x0d\xf2\x19\x56\x13\xec\x47\xe0\x21\x7f\xd0\x47\x23\xbb\x1f\xd2\x5c\x5f\xe0\xa0\x4c\x25\x5f\x85\x75\x16\xef\xb3\xd5\x0e\x01\x9c\xb4\x50\x81\x83\xd4\xf9\xbf\xf6\x63\x74\x0d\xe5\xae\xe1\x48\x74\xfc\xfd\x38\x7c\x91\xbd\x6a\xc9\xaf\xa0\xc1\xa8\x87\x30\x98\x1f\xf5\xd1\x15\x30\x2f\xe8\x2f\x65\xf5\xcd\xcf\x2d\x2a\x86\x03\x79\x0d\xc9\x8d\xb6\x1e\xb6\xac\x3a\xaf\x10\x4b\x35\x4b\xba\xaf\xbe\xb5\x1f\x2f\x84\x88\x44\x90\xd9\xf5\xfa\x33\x30\xbb\x3f\xe9\x23\x66\x71\x74\x53\x11\x96\x47\x4e\xe2\x93\xd7\xfc\x21\xf9\x0a\xac\x43\x49\xb6\xc1\x91\x05\x42\x2c\x19\xf1\x0e\xde\xa4\xbf\x66\x9b\x9d\x3d\x85\x81\x94\x91\xf9\xcd\x23\xc5\xf8\x5e\x8a\xfd\x98\xee\x0d\x5f\x02\xbe\x21\xb8\x12\x37\xb7\x60\x7a\x19\x56\x19\xce\x67\xa4\x91\x4a\x65\x05\x9d\x30\xa1\xe4\x20\x72\x77\x7b\xcd\x41\x78\x82\x13\x7d\x14\x6c\x0f\x37\xe1\xc5\xde\x05\x45\xc4\x2c\xb1\x32\xb9\xc1\x28\x96\xfd\x36\xea\xaf\x59\x1a\x65\xc7\x03\xd4\x26\x44\x64\x4b\x51\x5c\xef\x46\x06\xff\xb7\x32\xf7\x59\xb9\xab\x5b\x06\x4c\x7f\xb9\x33\x85\x0a\xd7\x70\xcd\xae\xc5\x8a\xb4\xb9\x4d\x45\xdd\x4a\x44\x89\x93\x06\x17\xd1\x99\xf5\xf5\x86\x24\xfa\xfa\xd4\x13\x80\x58\x19\x05\x67\x29\xc6\x0d\x54\x17\xb3\xaf\x90\x87\xae\xdc\x02\xeb\x1f\xb6\x52\x1f\xf0\x7e\x36\x26\x41\xee\x74\xd6\x27\x04\xee\x4b\x06\x69\xf7\x9a\xdb\x47\xaf\x7b\x12\x9f\x9c\xea\xa3\xe0\xf3\xfc\x86\xe4\xae\x82\x92\xda\x66\xbb\x6b\x8c\xe0\x00\x80\x75\xcf\x7a\x2e\x6a\x65\xea\x65\x95\x2d\x3c\xf2\xfd\xb9\xbb\xd2\xce\x7a\x78\x3e\x28\x64\x29\xcb\x96\x77\x51\x7b\xa5\x66\x8d\x7b\x5d\x7d\x02\x57\xa4\x44\xc7\x7a\xf1\xf4\xa2\x71\x7a\xc3\xdd\x19\x0a\x42\xc5\x27\x67\xfa\xe8\x1a\x25\x0b\xcf\x81\xa8\x59\xae\x53\xd2\x32\x84\xa2\xe1\x71\x3d\x88\x74\x51\x3e\xe8\xf2\xa1\x40\x38\xb6\x5d\xed\xe9\xda\xce\x8c\xdb\x24\xea\xb1\x1e\xbb\x48\x6f\x4c\x73\x57\xae\x20\x19\xb3\x34\x35\x81\x19\xd3\x2d\x90\x61\xed\x6a\xd2\xb0\x8b\xc8\xba\xb2\x92\xa2\xb7\x03\x9a\xfb\x0d\xe9\x90\x3b\x79\xa3\x8f\xc4\x64\x4b\xcb\xba\x05\x7e\xcd\xb6\x04\x7e\xb0\xfe\xd7\x18\x75\xda\x60\xa8\xc3\xa8\x96\x35\xb2\x5d\xd0\xee\xf8\x4d\xb9\xda\x41\x7e\xc7\xaf\x3e\xe2\x2e\x85\x0d\xed\x0a\xdc\xca\xc9\x97\x21\xe5\x46\xe6\xfb\x17\x23\x47\x3a\xc3\xd5\x50\xe6\x67\xc5\xfe\x68\x87\xd6\x04\x3a\xa3\x34\xcf\xdd\xe9\x9b\x16\x3a\x11\x12\xff\x65\xd8\x44\xed\xf8\x28\xb2\x14\x2f\x95\x56\x19\x34\x14\xa6\xb7\x76\x98\x8d\xb0\x19\xaa\xc7\x66\xe0\xf9\xf5\x60\xf2\x5c\x7f\x2b\xca\x87\x22\xd2\xde\xd7\x0a\xcf\x01\x9e\x44\xe7\x6a\xbc\xa8\x15\x89\xd4\xe9\x79\x6b\xe1\x2f\xd3\x02\x5b\x08\x51\xeb\x1c\x02\x6d\x42\xf1\x03\xcb\x5c\x9a\xeb\x90\xf3\x0b\x22\x3f\x1b\x47\x96\xdb\x0a\x02\xc9\x95\xe1\xef\x91\x93\xb8\x32\x2f\xf1\xbb\xc0\x84\x27\xf2\x93\x0f\x36\x9a\xdc\xfb\x61\x43\x32\xa0\x28\xa9\x15\x15\x97\xca\x5b\x8d\xb4\xa4\xc7\x65\x05\xff\xaa\x8e\x06\x6e\xa1\xb7\xce\xe1\x54\xe7\xe6\x36\xcd\xf9\x3c\x26\x9d\x59\x68\x9b\xc0\x06\x51\xd8\x7f\x11\xc1\x55\x37\xdb\x7c\xcf\xeb\x5d\x8b\xb3\x81\xcf\xc0\x28\xdc\xa8\x70\x7d\x0c\x2e\xbd\x46\xd7\xba\xbd\x99\xeb\x9d\x13\xdc\xa6\x86\x73\xfd\x2e\x3e\x41\x45\x29\x31\x38\xd0\xa1\x23\xba\x55\x4c\xf4\xd4\xa0\x32\x40\x23\xe7\x43\x1d\x16\x99\xdd\x57\x35\xff\x47\x0e\xd6\x00\x56\x52\xc6\x7c\xc4\xd6\x55\x42\x1d\x2c\x58\x93\xd0\x9e\xf3\xb5\xdc\xe1\x4d\xb9\x9b\xc4\xa3\x19\xdc\xe2\x8e\xf4\x11\x7d\x87\x37\xe0\x71\x8a\xbd\x24\xdb\xf2\xc1\xce\x13\x0a\x93\x2a\x21\x52\x0a\xe7\x35\x92\xe5\x20\x9c\xa0\x62\x62\x5d\xbb\x25\x8b\xf4\xd6\x30\x43\x31\xf4\xee\xe3\xe3\x44\xdc\xa4\xa3\x40\x30\xb0\x68\xaa\x74\x19\xaa\xd7\xa2\xec\xc2\x62\x00\x26\xaa\xaa\xef\xb2\x2d\x70\xbf\x96\x28\x54\x62\x77\xe1\xba\x81\x8e\xe4\xa5\xbd\xfa\xf1\xdb\xd7\xff\x63\xe0\xa8\x3b\x77\x0d\x50\x95\xc1\xd2\xba\x4b\x2b\x8c\x11\x16\xa6\x30\xeb\x0c\x1b\x6c\xe4\x25\xc5\xa8\xc0\xa9\x39\x8d\x83\xb5\xef\xed\xab\x8d\xc2\xe7\xde\x83\xf3\x5e\xa0\xfe\x68\xed\x58\x7c\xe0\x8f\xb2\xb7\xba\x46\x05\x63\xf5\x50\x56\xf9\xea\xa5\x5d\xea\x51\xa0\x21\x1b\x41\xe3\x0f\x69\x86\xdc\xbb\x6a\x78\xab\x45\xd8\x45\x4b\xc0\x57\x0d\x44\xc6\xbb\x34\x57\x4e\x6e\x14\x4d\xef\xcf\x4a\xd9\x77\x87\xeb\x41\x7e\xb0\xa5\x4b\x5a\xeb\x63\xe1\xf5\x92\x9d\xb6\xfe\x35\xd7\x1b\x07\xc2\x6a\xdb\xd7\xd5\x7d\x44\xce\xf8\x3b\x8c\x8b\xef\xb4\x5e\x65\xf5\x36\x07\x02\x50\x53\xa1\x8d\xf0\xfd\xd5\xaa\x87\x6e\x3a\xb4\x69\xc7\x3d\xee\xea\x40\xb7\xa1\x45\x61\xe4\xc2\xc8\x97\x80\xa6\x4c\x38\xcb\xdc\xa5\xb4\xe0\xb9\xb9\x26\xf5\x4a\x3c\x32\x9d\xa6\xab\x73\x80\xf1\x5c\x89\xa8\xe5\x8c\xda\xc1\xe1\x9f\xeb\xd0\xf7\x89\x98\xf0\x3a\xf2\xa2\xa8\x11\xce\x0c\x6b\xa7\x46\xf0\xe5\x88\x94\xd4\x6c\xb8\x02\xe4\x6f\x69\xee\x9a\xcd\x95\x0f\x9f\xed\xdc\x95\x5e\x9a\xf3\x19\x53\x13\x2b\x75\xbc\x1c\x48\x20\x85\x6f\x51\x73\x18\x79\xda\x9e\xa7\xf1\x89\x5d\x1f\x76\x24\xc0\x7b\x51\x19\xaf\x61\x43\x9c\xcb\x6a\x65\x6d\x77\xf7\x7d\x63\xda\xde\xbf\xb9\x96\xeb\xd3\x03\xf5\x50\x2d\x5f\xe5\x78\x35\xd0\xe3\xb2\xb1\x6f\xd0\x6d\x55\x39\x30\x3b\xa0\x45\x79\x0f\x1b\x42\xb7\x54\x98\x7d\xed\xf8\x67\x7d\x32\x50\xd8\x3c\xb7\x22\x6f\xf2\x2b\xc8\x28\x01\xe7\xbb\x73\x5f\x83\xc1\xbd\xd7\xa7\x03\xcf\xd9\xd9\xf9\x8c\xc2\xcf\x94\x95\x3e\x1b\xc0\xbb\x91\xba\xde\x35\xda\x39\xbb\x32\x7e\xd6\xd9\xa0\x93\xa7\x6f\xbf\x29\xe7\x11\x67\xf4\xe1\xa7\x92\x0a\x92\x85\x4f\x96\x6f\x56\xe6\xde\x35\xaa\x9c\xca\x43\x9b\x4d\xcf\xec\x69\xfb\xa0\x5b\xf6\x21\x52\x10\xdf\xcb\x8b\xf5\x98\x2a\xfd\x4c\x53\xa5\x78\x4f\xff\x8d\x8c\x4e\x90\x4e\xf9\x33\xed\x0d\x6c\xfc\x96\xbd\x09\xf3\x25\x4c\x01\xbf\x20\x21\x66\x39\x39\xbd\x1b\x4e\xb1\x52\xa7\xf5\xf5\xf4\xae\x70\x85\x11\x60\x2b\x8f\xe4\xfb\x6c\xe5\x57\xd2\x56\x60\x4e\xbb\xff\x3b\xad\xd6\xf3\x8c\x56\xd4\xb2\x5a\xc1\x50\x54\x90\x86\x92\x4f\x4c\xcf\x96\xe6\x65\xc1\xe3\x03\x25\x60\xb1\x88\x91\xb0\xd3\x1a\x4f\xff\x3d\x97\x4c\x0c\x66\x8c\x4f\x5a\xf1\xed\x81\x30\x98\xf0\x3e\xd1\x36\xb6\xec\xa2\x12\xb6\x54\x82\x1a\x5b\x26\xd2\xda\x82\xc7\xf2\x6b\x72\x80\xbd\xaf\x12\x45\xb9\x4e\x7b\x37\xea\xe1\xeb\xca\x64\x5d\xef\x6c\xe8\x67\xcf\xc6\x13\xc6\xdb\x91\x15\x9d\xc6\xa7\x6c\xb8\xed\x3f\x1f\xb5\xdd\x72\x20\x68\xb5\xb1\x36\x17\x66\x72\xfb\x42\xaa\x27\x8d\xf4\xe9\xf7\x1a\x69\xeb\xcc\x7a\x43\x1d\xd8\x9d\xb4\x26\xa3\xbd\x92\xbc\xe6\x9d\x39\xb4\xb6\x5b\x75\x6d\x77\xef\x27\x9f\x36\xdf\x4a\x5a\xca\x16\x8f\xf6\xba\xf7\x15\x1e\xb4\xe4\xea\x79\x0b\xaf\xd7\xbc\x1f\x23\xef\x16\xfb\x2b\xaa\x1b\x99\xf1\xfd\x07\xb2\xf1\x0d\x0e\x04\x38\xa8\xde\x3c\x61\x12\xd0\x7c\x86\x09\x4f\xc4\x4c\xd4\x2c\x1d\xfe\xbc\xe1\xbb\x36\xc2\x20\xc3\x3b\x59\xe4\xd9\xad\x4b\xc5\x9c\xc5\x27\x20\x7b\x28\x4e\x44\x3e\xf5\xc1\x3f\x0e\xef\x84\x41\x0d\xa8\x09\x62\xe9\xac\x24\x51\xbb\x6c\x09\xf1\x8a\x48\xec\xc3\x22\x7f\x56\x6e\xb2\x87\x1c\x48\x09\x72\x20\xb1\x82\xbb\x91\xee\xbd\xa7\x99\x0e\xa6\xac\x8b\xc1\x50\x50\xf1\xeb\xd5\x2d\x7c\x3c\x42\xec\x7c\x86\x13\x77\xaa\x13\x23\xa2\x9f\x08\xc8\xdb\x1d\xc8\x6b\x61\xfd\xbf\x85\x45\x77\xda\xd4\x76\x71\x81\x7e\xa3\x92\xea\x6b\xf2\xf1\xc0\x3b\x72\xcf\x10\x90\x0b\x93\xd9\xc5\xf2\x39\x0b\x3c\xc3\x43\xa9\x12\x13\xe4\x7d\xf3\x04\x4b\x04\x5a\xf9\x21\xc6\x62\x2a\x02\xcc\xdb\x88\x1e\xd9\x43\xd1\x31\xe5\xf1\xbd\xd2\xc4\x0b\xf6\x0f\xac\x55\x86\x09\x11\x84\xc6\x3c\x5c\x9a\x08\x95\x16\x12\x92\xe2\xc0\x85\xf0\x24\x9c\x5c\x16\x1f\xa0\x2b\x07\x39\x3e\x9a\x6d\x75\x16\xbf\x85\xd5\x7b\xca\xea\x1b\x0e\x9a\x20\xeb\x00\x90\xbe\x0c\xf2\xa8\xdf\xb3\x82\x99\x3d\x01\xf6\x97\xcf\xcb\x64\x41\xad\x01\x73\x5c\xad\x75\xd5\x99\x37\xef\x76\x34\xac\xb9\x01\xb2\x28\x90\xfc\x95\x09\x26\xbf\xea\x2a\x7d\x6f\xff\x5e\x28\xae\xb5\xe8\x27\x6b\x36\x82\x87\x83\xf9\xac\xb0\xf8\x0e\xfe\x8a\xb8\x8b\xe2\xbb\xb8\xa7\xc2\xd3\x34\x5b\xb7\x1f\xd6\x8e\xe1\xc9\xfb\x46\x8a\x5a\x26\x00\xce\xe3\xbf\x0c\xa7\x88\xd3\xc7\x7c\x30\xf9\xbd\xd1\xc7\x27\xc0\x54\x51\x34\x77\xb5\xc6\x04\x26\x64\x21\x52\xd4\x25\xa1\x7a\x40\xbe\x57\x0b\xb3\x04\xb5\x00\x2f\xc9\x20\x2f\x56\x67\xbf\xea\xe3\x77\xad\x0b\xa5\x12\x9c\xee\x77\xaf\x6a\xd5\xeb\xc2\x05\xe1\x25\x7d\xc2\x07\x67\x71\x20\xbf\xd4\x61\xfb\x41\x53\x8b\x00\xde\xc0\x33\x9a\xa2\xde\x55\x0e\x60\xd0\xde\xc4\x3c\x12\x9c\x9e\x5a\xa4\xca\x40\x1e\x32\xc3\x6d\xff\xf4\xcb\xcd\xda\x70\x91\x76\x25\xf6\x2c\x3e\xd3\x17\x06\xf3\x9c\x7d\x8e\x50\xec\x4d\x13\xe6\x7f\xd2\x3c\x0f\xcd\xe6\xa1\x9d\xd0\xc8\xc6\x1a\x28\x05\xb4\xf9\xe3\x11\xc1\x55\xd3\x96\xc7\x4b\xe1\x0e\x53\x74\x2c\x85\xbe\xb3\x7f\xeb\xd4\x57\x20\xa5\x6a\x5b\xd6\xd3\x09\x8e\x28\xd7\x0f\xe4\x67\xba\x55\x25\xe1\x1e\x13\xce\x7c\xe5\x7b\x2d\x72\x5f\xf9\x3e\x42\x37\x24\x8c\xf8\x1c\x50\x89\x8e\xa9\x6e\x04\x8d\x89\x61\x89\x2e\x91\xec\xc2\xbd\x35\x42\x4e\xc4\x89\xa5\x10\xb9\xe8\x9d\x6a\x98\x5e\x40\xa5\xd7\x08\x28\x30\xd1\x79\x4f\xef\x56\x26\x2d\x19\x1b\xc8\x80\x43\xa6\x0a\xb2\x66\xaa\xc7\x5d\x04\xdf\xe0\x8d\x1e\xc9\xa8\xef\x9a\xa3\xbe\xcf\x69\xd3\xa0\x40\x8e\x7d\x8e\x39\xac\xb3\x6b\xf0\xbc\xd0\x5d\x89\xf5\x68\xdd\xf1\x09\x53\xbc\xc8\xb7\xa2\x7c\xc8\xcd\xea\x96\x3c\xc7\x94\x9d\x4c\x3a\x30\x83\x65\xfb\xa2\x7e\x3c\xec\x84\x42\x99\x57\x7a\xa2\x7c\xb0\x51\xa2\x02\xc8\x3e\x77\x5f\x10\x18\x1c\xd1\x35\xaa\xc5\x56\xd8\x51\x27\x03\x8c\xd6\x82\x6b\xcc\xaf\x28\x4d\xe3\x71\x79\x72\x43\x07\x00\x8a\x26\x6b\xa0\x5b\xe9\x2a\xf9\x38\xbc\x3a\x52\xf8\x56\xf8\x8d\x10\x34\xc1\xce\x98\x5b\xf4\xe4\xbf\x7a\xa8\x05\xfe\x39\x2b\x74\xbd\x5b\xaf\xb3\xa5\xb5\x35\x1a\x35\x5b\x15\xcd\x9f\xb3\x41\x08\xfd\xb3\xf3\x4b\x6c\x85\x4e\xe2\xb4\xf3\x3e\x90\xf4\x11\x89\x7e\xfc\x1b\x51\xde\xe4\xb6\x37\x4e\xcb\xfe\xa5\xfd\x07\xaf\x3e\x6b\xcf\x1d\x52\x0b\xda\x3d\xba\xb5\xbb\x8d\x58\x94\xec\x1d\x60\x4a\x70\x1e\xed\x0a\xf7\x24\x86\x72\x9c\x18\xdf\x78\x9b\xd8\xb8\xca\x56\x8c\xe1\xb3\xfc\xf0\xf0\x7a\xf4\xa2\xb3\xf4\x5e\xb4\x0a\x8c\xfe\x45\x16\xec\xd2\x80\xcb\xb0\x15\xc2\x84\xbe\x50\x64\x5f\xcb\x93\xeb\xb8\x5c\xb7\xe2\xa5\x9a\x5e\x34\x9e\x06\xa4\x36\xb1\xf7\xba\xad\x50\xc7\xda\x6c\x73\x61\xac\x86\xd7\xa3\x28\x7c\x72\x6e\x5a\x54\x3c\x60\x70\x19\x84\x92\x2d\x7b\xfe\x7e\x22\x29\xe6\x9c\x86\x38\xcd\x38\xb8\xae\x03\x71\x22\x62\x2e\xd2\x3e\x60\x81\x26\xc4\xd2\x86\x54\xdb\x5d\x55\xef\xd2\x02\xf4\xb3\xfd\xab\x7d\x03\x81\x2a\xc6\x88\xf2\x92\x0b\x93\x67\xe6\xde\xd4\x9d\x10\xa3\x3d\xf7\x70\x3c\x86\x7f\xf7\xc2\x5c\x84\xf0\x39\xae\x07\x9c\x18\x68\x4f\xbc\xd8\x01\x9e\x0f\x14\xb1\x01\x7d\x25\xff\x6e\x4d\xf5\x2c\x7e\xab\xa7\x6c\x2f\xc6\xd4\x2e\xea\xcf\x14\xaf\x1c\x06\x26\xdc\x59\x5f\x5f\x16\x66\x18\x8d\x9d\x6c\xd5\xf5\xc8\x61\xed\x65\x0d\x97\x7c\x19\xe3\x00\xd4\x27\xbb\x06\x37\x9b\x30\xea\x12\x25\x14\xf8\x8c\x70\x84\xee\x0c\x96\x3b\x6b\x8f\x32\x00\x19\xcc\xa2\x7b\x08\x86\x17\x56\xa9\xce\x4b\xda\xb9\xc7\xac\x15\x95\x42\x60\x72\x8f\xea\x9a\xf6\xb0\x2b\xab\xfd\x80\xc4\x58\x52\xd0\x93\x24\xe8\x23\x80\xbc\x6b\xbb\x94\xbf\x99\x7c\x6f\x67\x38\x2f\xcb\x6f\xa4\x6a\x02\x9a\x63\x78\x23\x78\x56\xef\x29\xaf\x40\x98\x9c\x44\xa5\x83\xb7\x6e\x5f\xa8\x75\x8d\x40\x43\x6d\xb5\x42\x14\x2a\x6a\x3d\xd5\x21\xb2\x8a\xa1\x22\xf4\x24\x81\x81\xf1\x80\x19\xbc\x98\x6b\xe9\x95\x2f\x4d\x16\xea\xf0\x08\xed\xb6\x22\xb4\x5e\x99\xc2\x29\x08\x0e\xca\x9e\xf8\x25\x38\x30\x1d\xeb\x5e\x8e\x22\x66\x4d\x19\x54\xf5\xa5\xe4\x0c\x28\xc2\x34\x25\x06\x31\x8e\x5d\xb6\xad\xfc\x12\x39\x70\x73\xc4\xd2\x31\x91\xca\x8a\x95\xd9\x00\x3e\xaa\xac\x74\x9e\xb9\x18\xc6\x07\xe8\x70\x61\x31\xeb\x7e\xdc\xed\x88\x37\x56\x9d\xa8\x0b\xc5\xfe\x21\xec\x2d\x61\x49\xc1\x13\x02\x36\x3c\x5f\x47\xdc\x50\x6d\xff\x86\xbf\x3a\xec\xcd\x50\x32\x48\xa6\x16\xfc\x12\x05\x05\x9f\xac\xd1\xe9\xa2\x2e\xf3\x5d\x03\x7a\xfa\x39\x2a\x25\xa6\x0d\xb5\x8c\x2e\xef\x54\xf7\xf9\xf5\x93\xcf\xaf\x41\x40\x72\x6d\x08\xbc\x01\x09\xee\xbc\x2c\x08\xab\x61\xff\x93\x32\xe0\xe9\x6d\x65\x0c\x75\x00\xd8\x4b\xae\x1f\xf3\xe3\x20\xe4\x0e\x8e\x30\xce\x76\xf9\x31\x1c\x7b\x28\x71\xf8\x87\xb4\xc2\x6a\x34\x78\x91\xbd\x9e\x8b\x22\xcd\x6d\xb9\x78\xda\xde\x97\x75\x00\x01\xc2\xfe\x88\xcb\x69\x8f\xd6\xb6\x3b\x23\xf8\xd6\x41\xf6\xff\xb9\x73\x4a\xed\xbe\x76\xc6\x60\x3e\xc1\x52\xbe\x0b\x03\x8d\x72\x2d\x3d\x50\x4a\x61\xd5\xbd\x52\x63\xad\xec\x94\xd0\x15\x21\xc4\x87\x5d\x73\x14\xd7\x90\xf7\xb6\xe1\x45\xeb\x0f\x9b\x93\x97\xd6\x5a\x43\xb6\x18\x03\x30\xd3\x28\xdc\xbf\xad\x78\x21\xe2\xd8\xf4\x2b\xc8\x10\xb2\x97\xc6\x8c\xc9\x24\x34\xd8\x8a\xbd\x54\x3b\x3f\xd4\xc1\xa0\x64\xc2\xed\x78\x2a\x31\x24\xc1\x35\x29\xd9\x11\x17\x64\x09\x89\x43\x32\x34\xf0\x50\xeb\x5d\xbe\xce\xa0\xda\x0f\x7e\xb9\x5b\xd5\x2a\x98\x05\x4a\x6a\x31\xf7\x22\xa5\x1c\x96\x65\x51\x6f\xb3\xe5\xae\xdc\xd5\xf9\xbe\xd3\x91\x24\x0e\x82\xbe\xb0\x21\x3a\x10\x34\x40\xe1\x2d\xb7\x7f\xa9\xd2\xbc\x3f\x84\x50\x3d\x96\xf1\xb1\x85\x7c\x50\x89\xae\x27\xd7\xd0\xce\xd1\xf5\x59\x5c\x8e\x10\x38\x2d\x5d\xae\xd1\x70\x21\xd2\x25\x22\xaf\x0b\x2c\x2f\xc5\xa3\xf8\xba\xbc\x2c\x8c\xe7\x16\x70\xe9\xc5\x90\xae\x02\xac\x48\x05\x6a\x5a\x00\x20\xc9\x42\xe5\xde\xfe\xbc\xa0\x68\x1d\xf3\xe2\xd4\x74\xd8\xa8\x9e\xec\xcd\xaa\x34\x04\x0a\x6b\x1a\xb3\xd9\x42\xa1\x0f\x72\x9a\x8e\x4a\x33\xcc\xa3\xbd\xa8\xd9\xe1\xe9\xc1\xb1\xf1\x45\x5d\x02\x9d\x26\xab\x36\x8d\x1d\x03\x48\xb0\x85\x8e\x10\x9d\xdc\xed\xe2\x59\xcf\x40\x79\xc2\xfd\x04\xf2\xd3\x05\x06\x5e\x3d\x6a\xe0\x71\xce\x28\xf4\xc9\xb0\x1c\xd4\x7e\x0d\xe0\x2a\x93\x31\x57\x81\x31\x47\xde\x87\xc3\x66\xb0\xff\xec\x41\xcb\xaf\xfe\x32\xcb\xaf\x3b\x96\x5f\xfd\x05\x96\x5f\xb7\x2c\xbf\xfa\xb3\x2d\x7f\x27\x90\x55\x2d\xcb\xcf\xc7\xaa\xee\x33\xec\x3f\xc8\x42\xa4\xb0\xe0\x94\xf1\x0c\xea\x94\x1a\xf0\x3c\x9b\x05\x42\x43\x83\xfd\x09\x20\x24\x2c\x5f\x7c\x1f\xd8\xb8\x4f\x96\x1c\x6f\xa9\xe0\x96\x08\x78\xcd\x8a\xdb\xdc\x11\x90\xc4\x7a\x54\xb0\xf7\xb9\x4c\xed\xa6\x0d\xfd\x8b\x7a\x47\x3a\x63\xf2\x38\xe9\x64\x59\xed\x12\xf3\x56\x97\x7d\xc1\x56\xda\xe3\x8d\xbd\x57\xea\x89\x8b\xcf\x01\x45\x06\xcc\x1f\x36\x16\x6a\xd2\x66\x87\x69\xe1\xa9\xb9\xdd\x21\x0c\x50\x78\xfd\x90\x6c\x77\x99\x3f\xc8\x93\x91\xc6\x0a\xc9\xa1\xc2\xab\x69\xc1\xd0\x7a\xf2\xfe\x95\xa9\xb7\x04\x00\x00\x0d\x79\xfb\x8a\x3d\x7e\x2d\x78\x0f\x14\x27\xd4\x38\xb2\x48\xff\x69\xb7\x22\x58\x54\x05\x50\x38\x08\xf9\x78\xa8\x10\x3f\x28\x9e\xbc\x9f\x21\x0b\x25\x47\x77\x78\x58\xbd\x28\x6e\xc5\x4f\xfb\xde\xa5\xae\x82\x6c\x93\xaf\xd3\x78\xce\x1b\xaa\x19\x9a\xbd\x4e\xa1\xc6\x19\xeb\x99\x75\x00\xe5\xa1\xc9\xc7\x9c\x3c\xd8\x5a\x19\x83\x03\xc9\x87\x37\x50\x57\xef\x7c\xdf\x01\x00\x3b\x24\x43\x9d\x00\x0e\x35\x76\xe8\x71\x15\x83\xd5\xab\x12\xa2\x0f\x4a\x23\xf9\x45\xe0\x67\x96\x34\x81\xfb\x1e\xc3\x87\xad\xf9\x5e\x61\xea\x86\xd6\x9f\xcc\xdd\x94\x6b\xfb\xc6\x90\x67\xa8\xfe\x96\xe5\xb9\x1d\xc3\xc2\x68\x4e\x37\x83\x29\x86\xc2\x2d\xca\x6e\xbf\x8d\xdb\x95\xb9\xd0\xc6\xcf\x83\xa5\x0f\xc2\x75\x35\x2e\x46\x91\xc9\x85\x87\xec\x01\xb9\xd9\x3d\xd8\x34\xe9\xf2\x8e\xdc\x93\xbe\x58\x98\x62\x19\x76\x26\x82\x08\x08\xd2\x87\xef\x62\xe7\x27\x76\xe4\x77\xd4\xbb\xf8\x44\x8f\xcd\x83\xf0\x24\xa1\x78\xd7\x94\x55\x7a\x6b\xf4\xd8\x34\x0f\x65\x05\x39\xb0\x51\xb1\xda\xd5\x4d\xb5\xd7\x43\x02\xf2\x42\x58\xdb\x80\xdc\xc8\x78\x34\x3c\x1a\x40\x60\x49\xda\x1f\x44\x99\xb3\xe2\x0c\x82\xe8\x97\x6d\x8f\xa1\x87\x49\x47\x25\x36\xb6\xe7\xb3\x8f\xfb\x68\x91\xdf\x27\x95\xac\x3a\x76\x5c\x2d\x46\x1d\xfb\x44\xa7\x3a\x81\x25\x6d\xef\x14\x3e\xdb\xa4\x58\xb6\xb6\xad\x2b\x2c\xd0\xc8\x1d\xa8\x34\xc8\x0a\xb4\x1c\x54\xe7\xb3\x38\x4d\xf2\xfc\x21\xdd\x23\x74\x34\x2b\xd0\x10\x90\xcc\x61\x6f\xc9\x29\x75\x85\x0f\x21\x6b\x0e\xbc\x58\x2e\x50\x45\xa9\x42\x38\x5e\xc4\x68\x7b\xae\xd6\x62\xfb\xe9\x1f\xa9\x78\x3a\x3a\x12\xa0\xa3\x51\x8f\x29\x70\x05\xcc\xa8\x93\xea\xb3\x7f\x83\x89\x09\xda\x48\x44\xca\x10\x4d\x93\x28\x44\xfa\xc8\x1b\x83\x79\xce\x45\x74\x61\xf8\xf0\x82\xce\xf4\x85\xa9\xb2\xfb\x14\x80\x15\x74\xfc\x05\x59\x0c\x60\x36\xb2\xfb\xa5\xc3\x96\xde\xde\x60\xea\x18\x37\x10\xb7\xaf\x42\x50\xb3\x2a\x03\xd9\x47\x54\x8c\x47\xcd\xc9\xa0\x31\xe1\xfb\x1b\x02\x06\xe2\xc8\xb3\x46\x9b\xd4\xb2\xc1\xfb\x65\x97\x0c\xd4\xb1\xd1\x09\x55\xdb\xbb\x2a\xad\x4d\xad\x8f\x9e\xb9\xa3\xa2\x23\xdc\x4e\xd1\x91\x76\xd8\x0e\xe8\x5b\x2d\x6e\xf3\xbd\xaa\xb3\x4d\x06\x4c\xfb\x70\x55\xa7\x33\xe9\x48\xb6\xf6\x72\x18\x8c\x80\x68\xe0\x53\xc6\xf5\xe5\xba\x4f\x28\xa9\x87\x1d\x3e\xa5\x3b\x46\x5a\x32\xec\x59\x23\x9d\x4a\x78\xea\xa0\x06\xed\xbd\x6e\xd7\x7f\x72\xd8\xeb\xa4\x85\x16\x12\xea\xc5\xfa\xf8\x32\xcb\x3d\xfd\x70\x6f\x09\xc7\x9b\xc8\xa8\xdb\xcf\x22\x1d\x47\x22\x7b\x7e\x34\x91\x25\xf4\x3d\xf1\x2e\x9b\xda\xe4\xf7\xa6\x06\x64\x82\x31\x1b\x2c\x69\x2c\x5a\xdc\x01\x6d\xaf\x26\x1e\x80\x36\xac\xe3\x9c\x9a\xea\xc9\xa5\xd3\x6d\x88\xf5\xf9\xe4\x97\x64\x9a\x5c\xe8\xf3\xc9\x45\xc8\xba\x75\x33\xbe\x48\xa6\x48\x6b\x44\x6d\xa3\x7a\x32\x56\xc3\xb1\xd3\x99\xfc\x30\x9c\x8d\x66\x4f\xaa\xfa\x8c\x80\x8d\xa9\x8f\x84\xeb\x49\xe9\x49\xc1\xb6\x35\xff\x34\x9c\x03\x81\x52\x7b\xb8\x97\xd3\x24\xd1\x93\x4b\x75\x91\x5c\x26\xe7\xf3\x59\x24\x48\xb9\xae\x12\x10\x00\x3a\x48\xc5\x65\x87\x32\x9e\x8c\x5f\x92\xf8\xcf\x68\xfc\x31\x06\x42\xa7\x64\x3c\x1f\x4d\x13\x3d\x1d\xcd\xfe\x45\x0f\x67\xac\x34\xf4\xaf\x37\x43\x47\xf2\x75\x9d\x4c\x2f\x27\xd3\xcf\x43\xa0\x8a\xba\xec\x1d\x97\x7d\x1e\xf5\x75\x72\x13\xeb\xd9\xa7\xc9\xcd\x15\x52\x91\x05\x1f\xb2\x13\x9d\x68\x1c\xf7\xe8\x97\x84\xd9\xa5\xa6\xc9\xec\x1a\x68\xbb\xbe\x4e\x6e\xf4\xf1\x78\x02\x8f\xad\x46\xe3\x11\xb2\x01\x27\xbf\x24\x57\x93\x6b\xfb\x12\x91\xee\x0b\x85\x7c\x04\x27\xd8\x40\x0f\x67\xb3\x9b\xcf\x09\x8d\x6a\x36\xe7\xf7\x31\x4e\xce\x93\xd9\x6c\x38\xfd\x4a\xa4\x5c\x30\xed\xd3\xe4\x7a\x38\x9a\x22\x05\xd8\x74\x8a\xe2\x41\x24\x31\xda\xbf\x60\x80\x2a\x0c\x59\xbe\x66\x7a\x38\x56\xf6\xa5\x22\x51\xb1\x9d\x60\x47\x84\x45\x2b\x26\xd6\xe3\x09\x73\xf2\x76\x26\x60\x34\x23\x5e\xe5\xd1\xff\x4c\x2e\xf4\xa7\x64\x9a\xc0\x92\x53\xc9\x1f\xcf\x93\xeb\xb9\x5c\x7f\x7e\x28\xe8\x37\xfc\x18\xeb\x79\x32\xfd\x3c\x1a\xc3\x42\x01\x0d\xde\x93\x96\x3b\x43\xbe\x64\xab\xc4\xe7\x40\x26\x78\x76\x5b\x0b\x90\x15\x10\xd3\x48\x45\x5c\x45\xa9\x22\x54\x01\x0e\xbd\x73\x34\x1a\xd8\x2b\x08\x77\x71\x1f\xda\x55\x74\x2e\x2e\x2a\xa8\x00\xd8\x8f\x43\xaa\x5d\xa8\x89\x83\x33\x81\x25\xb4\x85\x59\x96\x50\x4a\x4a\x11\xf4\x8b\x66\x04\xbf\x8b\xd2\x2d\x1e\xc8\xca\x4d\xce\x61\x0f\xa0\xaf\x20\x61\x00\x99\x3b\x41\x37\x32\x1c\xf5\xae\xba\xb7\xe7\x18\x87\xd8\x01\x12\x39\xab\x95\x33\x6c\xd7\x55\x89\xbc\x7d\x35\x37\xb0\xe1\x59\x0c\xbc\x88\x58\x56\x90\x00\x8d\xac\x20\xf4\xa1\x5e\x98\x7d\x89\x33\xad\x7a\x6e\xe0\xde\x46\x30\x1c\x78\x5d\xa7\x7c\xaa\x22\x60\xa3\xb1\xe6\xb9\xe1\xac\xed\x02\x7a\xb2\x4c\xd5\x60\xb6\x8c\x2a\x67\x12\xd9\x47\x35\x4f\x1f\x6b\xab\x95\x59\xe6\x69\x95\x36\x65\xb5\xb7\x01\xce\x2d\x7c\x2a\xc5\xb2\xed\xc0\x35\x53\xf5\xa7\x07\x42\xd8\x6f\xbf\xc3\xdb\x32\xdf\x7c\x41\xa8\xa2\xc2\x5a\xb1\x31\x07\x06\xa0\x4b\x4e\x3d\x73\x1b\x9b\x8d\xe3\xd3\x5a\x1f\x5d\x83\xdb\x96\x6d\xd3\xa2\x39\x1a\xd8\x68\xc3\xdc\x72\xe2\xf1\x67\x5d\xc2\xa9\x0d\x57\x10\x9f\x7b\xd1\x8b\x2d\x55\xfd\xd8\x04\x37\x45\xb2\x01\x90\x2a\x42\xd4\x00\x0b\x31\x4e\xb8\x29\x14\xd7\xbd\xc5\x6d\xed\x7a\xb3\x4f\xd5\x53\xfe\x26\xbf\xf9\x34\x3e\xed\x7f\xcd\x91\xda\x6d\xcb\x42\xbf\x7b\xad\x57\xd6\xf1\xa4\x03\x0e\x0e\xd6\xe0\x06\x6e\xeb\x6d\xab\x12\x42\xd9\xec\xde\xe4\x7b\x27\xc9\x93\xad\x79\x03\xf1\x95\x70\xdb\x54\x66\x69\xb2\x2d\x1c\x88\x74\x69\x3b\x4e\x84\x47\xfd\xac\x8f\xb3\x01\xe5\xf2\xbd\x80\x0f\xd4\xd6\xd2\xbd\xbc\xbb\x4a\xf5\x66\xd7\xec\xb0\x13\xdd\x7e\x1c\x36\xa7\xd8\xa7\x04\x7c\x87\x10\x0c\x7c\x89\x2d\xf0\x95\xd8\xed\x8e\xd8\x3e\x62\xcb\xed\x07\x56\xb7\x67\x13\x5b\x9b\xb2\x0c\x3b\x59\x56\x55\xfa\xc0\x6e\x99\x5b\xf2\xb8\x9e\x65\x64\xef\x93\x3f\x5d\x5c\x2a\xaf\xbe\xf6\x8d\xc0\x57\xc5\x69\x73\x2f\xa0\x5c\x93\x93\x11\xe9\xb4\xef\x11\x41\xc5\x35\xdd\xe3\x7e\xa9\xaa\x94\x77\x98\xb5\x2b\x40\xdb\x12\x4c\xd4\x0a\xdf\xae\x98\x5d\xf2\xda\x21\x24\x31\x8e\x81\xa0\xf3\x68\xe4\xd2\xf2\x04\x14\xb0\x2c\x55\x17\x81\xf1\xdd\x8b\x30\xb4\xdc\xc2\xa2\x63\xae\xd5\xfc\xba\xcd\xaa\xa0\x01\x03\x27\x86\x57\xcf\xd6\x54\x59\xb9\x12\x34\x36\x50\xbd\x06\x1b\x75\xc6\x36\x0a\x8d\xd1\xa3\x96\x88\xdf\x88\x1c\x3e\x6f\x70\x44\x61\x3c\x6f\x67\x1f\x40\x1d\xf9\x9d\xad\x44\x6b\x2f\xd6\x0b\x10\x57\xce\x93\x5c\x99\xba\xcc\xef\xcd\xca\xd7\x75\x41\x9f\xdd\xa1\x2f\x6b\xd3\x34\x88\x2a\x18\x28\x64\xb9\xa5\x75\x46\x86\x98\x26\xaa\xef\x49\xfd\x3b\x25\x9b\x82\xf9\x34\x5e\x51\xea\x3e\xcd\x77\xee\x20\xeb\x20\xda\xfb\xac\xcc\x41\x74\x8d\x72\x7a\x93\x4d\xfa\xcd\x14\xa8\x1f\x9c\x2e\x97\xe5\x0e\xd9\xdd\x56\x06\x5f\xb4\x03\x7d\x6e\xe0\x2f\x65\xa5\xdd\x20\x70\x9e\x60\x5d\xab\xb2\x12\x3c\xb3\x3f\x02\x66\x09\x17\xc7\x3d\xe5\x55\xe4\xe1\xd5\x1a\xd4\x8f\x38\x28\x7b\x64\x11\xb0\xc1\x8e\xcc\x20\x63\x76\xa5\x5c\xab\x89\xdd\x1d\x58\xa4\x12\x19\x60\x21\x7d\x56\x93\x30\x58\x6d\xf2\xdc\x54\xf5\x80\x8e\x6f\x57\xbe\xb2\xd3\x97\xad\xc4\x19\x4e\x39\x6e\x0a\xb6\xa4\x88\x9a\xf7\x62\xfc\x1b\x14\x0f\x00\x73\xa7\xf8\xf0\x17\x7f\x41\x69\x7b\xef\x61\x07\xcc\xa9\x31\x39\x5c\xe3\x89\x3e\x1f\x4d\xcf\x6f\x3e\xcf\xe6\xd6\xbf\x9d\x81\xc3\xeb\xfe\x84\x09\x36\x24\x5e\xf5\x02\x96\x87\x99\x54\x07\x91\x60\x61\x0d\x85\x2c\x91\xec\xf6\xeb\xe4\x26\xea\xf7\x70\xa3\x7e\xff\x36\xd2\x8e\xe8\x76\xc6\xbf\x43\xd1\x4c\xef\x5a\x02\xbd\xab\xfd\xcc\xec\xe6\xda\x86\x1a\x53\xf6\x3f\x99\x72\x15\x82\x81\x64\x16\x09\xc9\x8e\xf9\x04\x3e\x71\x9d\x4c\x67\x93\xb1\x63\xd3\xf5\xc2\x1d\x8e\x39\x57\xd2\xe9\x1e\x54\xeb\x60\x7f\xf7\xd3\xd0\x3e\x3a\xd0\xd1\x72\xa8\xa3\xfa\x42\x1d\xfe\x9e\xbd\x2f\x33\xe5\x7e\x9c\x4c\x2e\xbe\x8c\xae\xae\x22\xfd\x65\x32\xfd\x17\x3d\x9b\x4f\xae\xaf\x87\x1f\x13\x3b\xa3\x9f\xaf\x6f\xe6\xc9\x54\x5d\x0e\x47\x57\x37\xa8\xed\xf9\x79\x78\x75\x79\x33\x3e\xc7\xab\xd1\xe0\x81\x01\xf9\xea\xca\xcd\xe1\x67\x1b\x1b\x05\xa3\xc4\x9b\x25\xb3\x48\x31\x5f\xad\x9b\x9e\xaf\xf4\x82\x3e\x0d\x7f\x49\xf4\x87\xc4\xfe\x75\x6c\x83\x9e\xe7\x70\xd9\xce\x62\x45\x51\x40\xef\x52\xa3\x2b\xdb\xd8\x66\x78\x7d\x7d\xf5\xd5\xce\xbd\xff\xa3\x9d\x82\x8b\x64\x38\xff\x04\xfc\xc0\xf0\x3a\x86\x57\x6a\x34\xfe\xc3\xcd\x14\xa2\xa3\x9b\xab\x39\xeb\x9f\x8a\xd1\xbe\x98\x49\xfe\x5e\x8a\xd9\x92\x3f\xce\x93\x31\xde\x64\x74\x0e\x6f\xf9\x6a\xf8\x45\x5d\x4f\x27\x9f\x46\x1f\x46\xf3\x19\x7e\xdd\x0f\x32\xd6\xb3\xc9\xe7\x44\xff\xe1\x66\x3a\x9a\x5d\x8c\x60\x2e\x67\xfa\x62\x82\x03\xbd\xba\x9a\x7c\xa1\x8b\x9e\x5f\xdd\xcc\x90\x90\x59\x85\x4f\xe8\x97\xc6\xc1\x95\x11\xe9\xd9\x04\x83\x1a\x7f\x1d\xfb\x9e\xfc\x85\xd4\xe7\xe1\xd7\x70\x6e\x6c\x18\xa9\xd4\xc9\xeb\x58\xdf\xc4\xb3\x58\x7f\xb4\x2b\x7d\x0c\xac\xcb\x89\xdd\x9b\xb3\x64\x3a\xc3\xe4\x68\xa7\x3c\xad\x8f\x84\xcc\x60\xd6\x98\x4d\x74\xa4\xd3\x9a\x68\x34\x4d\xb5\xd1\xdc\x0c\x8e\x99\x87\x37\x3f\xea\xf3\xf8\x32\x9e\xc6\xd6\x14\xbf\x3e\xd1\xc7\x93\x65\x13\xeb\x93\x9f\x7e\x7a\x3b\x88\xa0\xa4\x8c\x09\x4e\x6b\x31\xc5\x85\x55\x87\x64\xe3\x08\x6c\x9d\xbc\x77\x97\x87\x23\x28\x2d\xc3\xb0\x10\xe7\x41\x19\xbc\xca\xeb\x45\xf9\x51\x9d\x9c\xc6\xa7\x27\xa7\xfa\x78\x66\xb6\x3c\x2e\x80\xae\xd9\x71\x21\xba\xb1\xb9\xf3\x1f\x57\xf4\x71\x50\x78\xf7\x4f\x76\xfa\x43\xfc\xc3\xe9\xeb\xd3\x97\x27\xba\xb9\xab\xca\xdd\xed\x9d\xff\xd5\x1b\x7d\x0c\x22\x69\xf4\xc4\xd6\xd0\xe3\x8c\x43\xce\x0d\x8e\x92\xa4\x58\xe9\x9b\xda\x58\x73\x8e\xbc\x19\xdd\x9a\x17\x66\xfa\x9a\xbb\xb2\xee\xa9\xb4\x7a\x96\x99\x93\x58\x7f\x1e\xcd\xce\x93\xab\xab\xe1\x38\x99\xdc\xcc\xc2\x00\x36\x00\xe1\x19\x0c\x41\x4d\x23\xce\x19\xfb\x3e\x96\xa6\xb2\x47\xa0\xe2\x6e\xf1\x0d\x80\x6e\x35\x31\x35\x59\xf7\x05\x59\x65\x4a\x66\x65\xef\x70\x15\xe8\x3b\x93\x73\x16\x69\x57\x98\x62\x5d\x56\x4b\xf0\x86\x23\xc5\xca\xfb\xf4\x5d\x77\x22\x57\x66\x5d\x56\x1b\x43\x14\x78\xe4\x3d\x50\x19\x24\xc0\x2f\x72\x5e\x4e\x5c\x35\x56\xf3\x6e\x5c\xb8\x08\x93\x9a\x9e\x94\x5a\xe7\xe9\x83\x1f\x41\x2d\xf3\x86\xa2\xf4\x22\x92\xbd\x79\xfa\x00\xdc\x81\x69\xb1\x77\x55\xfb\xda\x67\x0a\x07\x91\x60\xf8\xcb\x10\x08\xb8\xce\xb3\x65\xf3\xb2\x5c\xbf\xcc\xd3\x07\xe5\xef\x45\x0c\x9d\xed\xf2\x89\xd1\x37\x05\x14\x79\xc6\x54\xb3\x3a\x2f\x0b\xeb\x43\xc0\x07\x0a\x74\xe8\xd2\x65\x53\x2b\xae\x1d\x8e\x8a\xc6\x54\x78\xfa\xa6\xb9\x9e\xa5\x39\xf8\x26\x1f\xcb\x72\x05\xd0\x64\x22\xb1\xcc\xf7\x34\x30\xb3\xc2\x96\x13\xfb\xe0\x41\xf1\x88\x80\x0b\xee\x99\x3c\x96\x20\x2d\x6e\x77\x29\x42\x4c\x53\xcf\xac\xe0\x66\xd6\xee\xda\xa6\xda\x59\xc7\x16\x5d\x54\x40\x3e\xaf\x2a\x8c\xa6\x7c\x82\x11\x33\xd1\x4c\x15\x2a\x48\x66\x4e\x63\x48\x49\x4d\xc6\xce\xd6\x5b\x03\x0d\xe9\x98\x59\xac\x87\xb5\x5e\x98\xe6\xc1\x98\xe2\x40\xc9\xbc\x15\xc2\x70\x17\x32\xb5\x2b\xd7\x9d\x56\x08\x2a\x81\x43\x05\x38\xdd\xa4\x10\xcb\x62\xe1\xfc\x20\x22\x5f\x95\xbb\x86\x59\x76\x76\x4d\x96\x67\xff\xe9\xde\x58\x80\x0a\xe9\x94\x98\xc1\xb7\xe7\xfa\xff\x43\x59\x7d\x43\x66\xac\xfe\x07\x91\x0f\x01\xd2\xf5\xbe\x3e\x4d\x7d\x1e\x52\xd1\x16\x7b\xa8\xb4\xf9\x0f\xa0\x3d\xcd\x0d\xf6\x07\x03\xe1\x24\xd4\x86\x28\x81\x94\x21\x7a\x1d\x58\x69\xcb\xca\xbf\x35\x9f\xdd\x85\xf7\x97\x35\xbb\xc6\x28\x24\x9f\x12\x4a\x14\x0e\x5b\x60\xdf\xd3\x59\xac\x3f\xdb\xa3\xf1\xfa\x2a\x79\x49\xd9\x37\x74\x86\xe2\x9e\x07\x02\xc0\x8d\xa9\xb3\x5b\x8c\xc0\x43\x11\xf8\x30\xcb\x94\xd6\xfa\xe8\xf3\x2e\x6f\xb2\x6d\x6e\x5e\xd2\xec\xad\x8e\xe2\xbe\x5f\x3a\x0a\x1f\x5a\x9b\x5d\x20\x20\x4a\xc0\xd4\x50\x13\x69\x4a\x7a\x5b\x9d\x01\xf4\x55\x96\x04\x8a\xe7\x50\x53\x19\xc0\x62\x0a\x2c\xdd\x70\xf8\xe1\xcd\x81\x8f\xf0\x42\xdc\x44\x97\x98\xad\x5b\x3e\x0e\xb8\xd8\xde\xc4\x7a\x78\x7e\x9e\x5c\x83\x7b\xdc\xaa\xa2\xda\x33\x97\xbb\xad\xc8\x7f\xa7\x5c\x22\x4a\xd3\x50\xdf\xb3\x14\x45\x36\x9d\xd6\x8a\x36\x1f\x76\xac\x93\x3f\x82\xc3\xa2\x87\x58\x02\xed\xa9\x4d\x20\x1d\xaf\xe4\xed\x12\x94\xbf\x10\x24\x0a\xbe\x80\xde\x4b\x68\x4f\x09\xf9\x5a\x61\xf5\x94\x99\xde\x06\xef\x5d\x11\xcb\x9a\x8a\x1d\x2b\x8e\xc0\xd5\xc9\x26\x1f\x40\x43\xb9\xf1\x71\x31\x11\xdb\x0a\x82\x96\x46\x5f\x0b\x4c\x1b\xa5\x1e\x1e\x1e\xe2\xba\xc8\x52\x90\x40\xa9\x37\xd9\xab\x15\xbf\x9f\xfa\xd5\x32\xdb\xbc\x52\xca\x29\x91\x48\x05\x02\x5f\x7f\x14\xef\x42\x7e\x00\x37\x24\xd7\x2e\xb0\x5d\x5f\x3d\x5e\xbb\xa0\xa6\xbb\x2e\xd3\x70\xac\x67\xc6\x84\xa5\xe2\xb2\x82\xf7\xc8\xfa\x93\xde\x2e\xe3\xd1\xe6\x09\x88\xc0\x98\x48\xd8\x43\x67\xe4\xf4\x32\xc3\xf2\x51\x56\x6b\xfa\x7d\x4f\x6e\xb2\x8f\x59\x22\xab\xf5\xff\xb2\x81\xc2\x55\x32\x4f\xc0\xe1\xfc\xdf\x1a\xd4\x22\x9c\x15\x3b\xae\x07\x3f\xeb\x7f\x7b\xd6\x4f\xac\xd4\xd4\xa4\x2b\xc4\x10\x33\xa7\xb3\x90\x7d\x49\x1b\x2d\x44\x6c\x0e\xbd\xbd\x72\x6b\x8a\x7f\x43\xee\xab\x57\xbf\x89\x40\xfc\x55\x7e\xe2\x57\xc3\xeb\xd9\xd5\xcb\x93\xf8\xf5\xdf\x8e\x03\xf8\x71\xfe\xdf\x37\x6f\x7f\x78\xd3\xe1\xff\x7d\xf7\xc3\x9b\xdf\xf8\x7f\xff\x1e\x3f\x36\x44\x4c\x34\x91\xfb\xce\x26\x37\xd3\xf3\xa4\x8f\xe3\xf7\xb5\x7e\x49\xf2\x6f\x27\xef\x22\xd0\x89\xd1\xd7\xc8\x46\x58\xd9\x6d\x1d\x1c\xa6\xcb\xb4\x32\xeb\x5d\x9e\xef\xf5\xc2\x3a\xfa\x36\x50\x7b\x28\xf2\x32\x5d\x61\x26\x53\xd0\xb6\xc7\xfa\xc3\x5e\xfe\x95\x64\xe4\x7a\x74\xfa\xf7\x08\x99\x45\x67\x0b\x53\xf2\x6a\x61\xf4\xa2\xdc\x15\x4f\xd0\x8e\xda\x18\xc6\x7e\x9b\x00\x05\xd6\x41\x4c\x0b\xf0\x57\xd9\x6f\xe3\xda\x53\x0f\x2d\xc0\x16\x9f\x91\xbe\xcb\x23\x65\x04\x47\x23\x68\x67\x81\x66\x4e\x7f\x44\x7a\xda\xf7\x01\x15\xf2\x41\x98\x14\x85\x56\xb7\x55\xba\xf1\x3c\x0d\xe8\x45\x82\xaf\x3e\xdc\x6e\x81\x84\x0f\x03\xdf\x48\x8f\x8a\x65\xac\x8f\x8f\xe0\xd7\x47\x03\xc4\xbd\x2c\xf3\xbd\xb6\xcf\xb3\x2b\x96\x44\xa7\x1e\xf0\xfa\xd4\x0a\x2f\x42\x27\x35\xc1\xd0\xa4\x0b\xeb\x59\xe2\xb0\x35\xd8\xa5\xb5\xf3\x74\x89\x3e\x08\x5e\x81\x78\x69\xf7\x18\x2d\x62\x24\xc1\x23\x7f\x20\x4c\x65\x9b\x50\xd3\x5e\x3f\x00\xc7\x23\x82\xd1\x0f\x51\x75\xdf\xdb\x63\xe3\xbd\x17\xeb\xf1\x38\xa0\x6a\x75\x50\x0d\xe6\x66\x01\xba\x9c\xac\x61\x1a\x06\xc6\x6c\x75\x00\x59\xfe\x01\x8f\xbd\xb7\x62\xa3\x12\xc5\xc9\x03\xb9\x22\x7e\x26\x5a\xeb\xa1\x8f\x18\x89\x0b\x0c\x5d\x57\x44\x3b\x92\x17\x08\x3c\xc8\x98\x61\xa7\x29\xc4\x48\x9c\x38\x2c\x95\x8b\x2e\x22\xa8\x3a\x6d\x89\x54\xac\xac\x38\x77\x2e\x82\x47\xf2\x89\xb1\xa4\xf2\x70\x88\x7e\x13\xb9\x39\x17\x10\xde\xa4\xb5\x75\xce\x31\x04\xc0\xdb\x03\xee\x05\x6a\x48\x90\x58\xa0\x38\x69\x69\xbd\x0b\xdd\x8a\xff\x69\x39\x78\x76\xe5\x16\x91\xf5\xc2\xc6\x4b\x4f\x04\xef\x21\xdf\x12\xb3\x15\x3d\x4a\xde\xc6\xf4\x6c\xb2\x68\xf0\x5e\x76\x2c\x87\xd3\xaa\x08\x48\x2f\x67\x55\x1f\x98\x55\x2c\x52\x1d\x9e\x56\x75\x78\x5a\xf5\xa1\x69\x85\xdb\xf7\x4d\xaa\xea\x9d\xd4\x8c\x5a\xa0\x5a\xb4\x4e\x58\x9f\x40\xca\xa4\x0e\x5d\x12\xc6\x93\xc1\x2c\x79\xc2\xf3\x67\x10\x7c\x47\x9d\xbb\x75\xc9\xbd\xbb\xc4\xde\x69\x8b\xb3\xa2\x76\x3c\x4a\xa8\x46\xc3\xd5\xd6\x7e\x6e\xef\x33\x7d\x74\x61\xb6\x79\xb9\x77\xa3\xa2\xc5\x20\x78\xb5\x82\xf8\xa5\xd5\x94\xe1\x58\xbe\x94\x2b\x9e\x66\x98\x04\xc9\xa1\xfa\x01\xc7\x10\x84\xf7\x82\xe9\xfb\x78\xfa\x4f\x17\x83\x48\x74\xc9\x0b\x2d\x46\xc1\x41\xab\x64\x15\xdb\x5d\x75\xd7\x1a\x51\x5f\xaf\x08\x15\x45\x61\x38\x0b\x7b\x46\x99\xba\x56\x76\xbd\x55\xb7\x69\xc1\x09\x03\x0a\x65\xec\xb8\xa7\xff\x74\x81\x4f\x9d\xd6\xc8\xae\x0a\xcd\xaf\x95\x41\xd2\x4a\x4e\x3e\xf8\x39\xb1\x76\xf5\xa9\x31\x50\x40\x48\x47\x47\x48\xdb\x26\x18\xc9\x81\x45\xb3\x30\x8e\x0a\xfe\x1f\xcd\xfb\x0d\x74\xef\x3d\x6c\xd8\x6d\x32\xec\x28\x24\x92\x76\x8b\x0e\x89\x19\xec\x07\x30\x42\x62\x76\x6c\xfe\x7b\xc0\x90\x1d\xf6\x06\x7d\xb9\x33\x05\x0e\xb8\xcd\x77\xad\x9e\xc1\x77\xad\x91\x35\xeb\x69\xbe\x6b\xf5\x38\xdf\xb5\x1c\xd3\x7b\x1e\x35\x90\x61\x49\x6e\x6b\x76\x01\x54\xa8\x81\x13\x90\x50\xf3\xa1\x2b\x64\x69\x0f\x53\x62\xb7\xe0\xd2\xc0\x6c\xdf\x4b\x79\xdd\x6e\xf7\x81\x87\xe8\xf5\x4c\xec\xd4\x71\x3b\x75\xbe\x57\xad\x8e\x7d\x77\x96\x76\xd3\x65\x51\x8b\xbc\xa2\x7d\xbb\x62\xaf\x76\xdb\x15\xab\x33\xec\xb6\xb7\x55\xba\x42\x2f\x49\x3a\x1b\x35\x7b\x1b\x1d\xb2\x80\xf0\xd6\x2a\xbc\xb5\xeb\x9d\x72\x88\x68\x9f\x36\x15\x7c\xfb\xee\x1a\x54\x49\x60\x88\xe5\x9d\x49\x57\xc0\x61\x99\x9b\xe3\x7a\xe0\x98\xd8\xec\x38\x98\xe7\xff\x00\x0f\xf5\xdd\x6e\x93\x16\xe0\x22\x8b\xd6\xc4\x83\x93\x8b\x55\x15\x70\x90\x32\xd7\xcb\xc8\x3c\x0d\xdf\x45\x52\xad\x1e\x25\xa9\xd6\xdf\x41\x52\xad\x9e\x43\x52\x8d\x6f\x50\x1b\xdf\xdc\x75\x5c\xe2\xd1\x67\xb7\xde\x80\xf5\x07\x80\xa9\xd8\x11\x30\xff\x65\xfc\xcb\x2d\x27\xff\x30\x33\xb2\xbf\x9f\x3b\x17\x3c\x47\xb2\xfa\x8b\x39\x92\x01\x33\x1d\x91\x3f\xf2\x2c\x26\x64\xfd\x0c\x26\x64\xf5\x2c\x26\x64\xfd\x7c\x26\x64\x05\x66\xae\xc3\x7f\xec\xda\xba\xbf\x9b\x07\x59\x85\x63\x42\x4d\xb2\x6b\xa7\xcf\x7d\x53\x9b\xfa\xbd\x3e\xf7\x72\xd4\xff\xa4\xa7\xc4\xf4\x85\x31\xd1\x2c\x4c\x27\x52\xcd\x0e\x28\xb5\x9d\x7a\x77\x27\x1c\xc3\xdd\xd9\xe1\x1c\x8d\x3a\x54\x86\xc8\xeb\x03\xfe\x19\x24\x53\x55\xb7\x39\x8c\x63\xb9\x1e\x97\xe9\xbb\x29\x4c\xa3\x96\x1f\x5c\xae\x71\xa8\x2f\x6a\xdd\x8d\x14\xe8\x29\x49\xe3\x8a\x1c\x70\x96\xe2\x6b\x8d\xa4\x29\x6d\xec\xd9\x48\x49\xbd\x9f\x91\x56\x5a\x88\x2b\xb3\x6e\x22\x35\x31\xb4\x5a\xdf\x5a\x57\x6c\x31\x21\xab\x96\x9b\x57\x97\xb9\xc9\x05\x6a\xed\x49\xc7\xab\x2d\xad\x28\x78\x23\x90\xc6\x02\xec\x44\xb1\x34\x44\x2e\x4d\x02\xeb\x88\x64\xe1\xd8\x20\xe4\x66\xe9\xb8\xa4\x8d\x14\x05\x83\xee\x2b\xb4\x99\x48\x16\x6f\x1a\x1b\x70\x90\x30\x3b\x3f\x3d\x09\x9d\xd7\xee\x55\x38\x89\xb0\x40\xb6\xbb\xcd\xc6\x6c\xbf\xfd\xcd\x98\xad\x7d\x6e\xbb\xa9\xa8\xb6\x05\x57\xee\x8b\x84\xf0\x54\x01\x94\xa6\x0b\xb8\x69\x95\xbd\x47\xee\x98\x67\x33\xf0\xb9\xbf\xb7\x4e\xc6\xa0\x75\x03\x57\xae\xec\xa8\x0e\xf9\xf9\x04\xfd\xdf\x61\x8e\x3e\x4e\x76\x50\xbb\xa3\xbc\x9f\x27\xe7\x93\xdc\x7c\x4f\x11\xf0\xa9\x36\x01\x9f\x24\x7c\xf1\x9a\xfd\x2d\xb2\x42\xe6\xa7\x5d\x0e\x5c\x6d\x3a\x27\xdf\x7c\xb9\xdc\x55\x29\xfc\xa7\x63\xe8\xb3\x6f\xa2\xa5\x7a\xc9\x5a\x6c\x8e\xed\x55\xb5\x59\xbd\x60\x01\xc2\x43\xca\xaf\x46\xa2\x70\xd5\xdc\x75\x3a\xf4\x43\x62\x2e\x7b\x03\x7b\x14\x46\x9e\x03\xcc\xb7\xc3\x3b\x57\x2f\xad\x2a\x50\x01\x20\xaf\xc1\xd3\xe7\x70\x19\xa3\xbd\xcf\xe0\x45\x7e\x17\x15\x4c\xd8\x49\xa8\x9c\xe3\x04\xb0\xe8\xd6\x13\xd6\x08\x72\x07\x6a\xfa\x53\xb7\x1c\x30\x28\x6b\xf1\x1a\x74\x3b\xd3\x1f\xdb\xbd\x75\xda\x64\xb5\xb5\x31\x79\x4e\xbb\xd2\x19\x78\x41\x29\x60\xed\x53\xbb\xc5\xb4\x4d\x89\xd2\x53\xa7\xa3\x1d\x03\x45\x7f\x7b\x03\x30\x40\x38\x68\xd3\x12\x9b\x12\xb9\xaf\x03\xa4\x88\x0a\x7c\xad\xfb\x2c\x95\x8a\x4f\x41\x70\x75\x6c\xe2\xdb\xd8\x9f\x03\xa8\xa6\xa8\x1f\xcc\x42\xd7\x59\x63\x06\xbe\xaa\xd2\x9f\x1c\xc4\xe4\x56\x78\x8a\x71\x74\x4b\x47\x53\xd0\x1d\xef\x68\x23\xf5\xc2\xe4\xe5\x43\xe4\x02\xed\xb6\x44\xea\x21\x66\x97\x8e\x20\x84\xf2\x5c\x7a\xa2\x37\x0f\xa6\xaf\xc7\xc3\x7e\x6c\x36\x43\xe9\x0c\x21\xaa\x68\x57\x3f\x2d\x9b\x4e\x8d\xd1\xda\x81\x2e\xa1\xa2\x8b\x88\x78\x0f\x66\xae\xd8\x64\x2f\x83\x47\x06\x78\x5d\xd6\xea\x59\xd7\xca\xde\xcb\x54\xef\xd1\x12\xc0\xe3\xd8\xad\xb0\xde\x8b\xac\x15\xa7\x04\x38\xde\xa5\x53\xe2\xae\x7c\x80\xd9\xc1\x82\x60\xf0\x80\x2d\x7a\xdd\xc5\xde\xee\x21\x24\xb3\xde\x35\xfc\xea\xac\x5d\x72\x8a\x52\x4c\xd9\x24\x77\xef\xba\xdc\x15\x2b\x15\xd6\xa6\x52\x3b\xaa\x78\x59\x6e\x5e\xe1\x1a\xa4\x72\x54\xa8\xd0\x7a\xd7\x6c\x72\xb6\x6f\xab\x01\x8b\x51\xf6\x6c\x40\xe8\xe5\xf3\xae\x72\x24\x7d\x68\x47\x64\x12\x79\xfa\x52\x6f\x85\x34\x63\xb2\x39\x2d\x06\x57\x6b\x6a\x93\xaf\x65\xca\x21\x2b\xfa\xa9\x38\x22\x15\x24\x66\x5b\x8b\xe5\xbb\x98\x4a\x3a\xd5\x74\x24\xb5\x16\xf3\x58\x16\x2d\x86\x12\xff\xd6\xda\x47\x10\xd0\x07\xe0\xbb\x04\xa2\xfa\x1a\xfa\xf2\x01\x39\xb6\x32\x0e\x86\x4d\xbb\xa7\x46\xc0\x8a\x48\x20\xf4\x01\x87\x55\x80\x02\x6f\xa5\x73\xad\x55\x13\x34\x3e\xc4\xf4\x25\x53\xa6\x68\xeb\xe4\xd2\x4b\x43\x2f\x30\x74\x11\xbd\x4f\x28\x60\x07\x07\xbc\x40\x5c\xd7\x8f\xb1\x0f\x2a\x27\xb7\x14\x84\x25\xe8\xf5\x3e\x4e\x6a\xef\x58\x90\x8b\x15\xad\x3c\xd5\x4d\x3f\xf2\xcb\x06\x3e\xd8\x7a\x59\x6e\xf1\xf3\x0c\x8c\xaa\x9d\x1f\xeb\x26\x15\xe3\xeb\x36\x96\xde\x1e\x34\x82\x70\xfe\xf1\x19\x05\xbe\xb1\xdd\xa2\xce\x56\x59\x5a\xf5\x4e\x28\xf8\xdf\xe0\x7e\xab\xd0\xfd\xde\x9a\x6a\x6b\x60\xa2\xe0\x42\x55\x65\xee\x4b\x42\x6e\x3d\x6b\xda\xd5\xf3\xa6\x5d\x3f\x63\xda\x95\x98\x76\xdc\xb5\xe0\x89\xdb\x28\xd9\xf4\xa9\x0a\x90\x7b\x0e\x3c\x73\xf7\x42\x10\xf9\x78\x5d\x56\xca\x4d\x0e\x30\xe6\xb7\xe6\x67\xd0\x96\x24\x90\xaf\xb7\x27\xa5\xac\x44\x36\x30\x72\x18\xc5\x0d\xa1\x6d\x74\x93\x91\x63\xdc\x12\x15\x7f\x13\xff\x17\x65\xed\xf0\x6e\x1e\xbb\x2b\x7f\x2b\xf2\x0e\x27\xb3\x87\x89\x51\x91\xf6\x7e\x1b\xeb\x2b\x01\xc9\x28\x0b\xe6\x56\x77\x29\x8a\xc4\xb9\xc4\x3e\xf9\x04\x69\xbc\x80\x5f\xe2\x34\x52\x45\x49\x2b\x94\xea\x15\x5c\xce\xe8\xa2\x48\x22\xa4\x38\xf7\x70\x7f\x1f\x20\x67\x45\xdc\xe6\x45\xc4\xc5\x25\x5f\x31\xbc\x5d\x9a\x12\xe9\x87\xb4\x98\x26\xf1\x50\xc7\x6b\x23\x39\x2f\xfe\xdb\x7e\x1b\xb7\x77\x56\xe0\xa2\x2d\x73\xc0\xd4\x2c\x2b\x43\x6b\xea\x5d\xec\x74\xaf\xd3\x5c\xcf\xed\x5b\xff\x8b\xa8\xeb\xd4\xf3\xa9\xdb\xea\x40\xfb\x41\x30\x37\x12\xd6\x57\x39\x88\x11\xda\xbd\x56\x93\xb7\x6c\xf8\xcc\x0a\x7d\x7c\xd4\x7e\x8e\xa3\x81\xe7\xc6\x53\x4f\x71\xe3\x75\x19\xc9\x1f\xe5\xc6\x53\x74\xbc\xc1\xaf\x61\x56\x43\x70\xe0\x01\xee\x3c\x78\x2d\x82\x18\x0f\xcf\x58\xd5\xe6\x79\xf2\x08\xe0\x80\x20\xaf\xf3\xa6\x24\x61\x12\x59\x3f\x45\x84\x49\x4f\xb2\xdf\xd9\x20\x6b\x6d\xc0\xc5\x5d\xe9\xbb\x32\x5f\xf1\xda\x4c\xab\x0d\xb4\xe7\x59\xab\x17\xd2\x1b\x49\x5a\x22\x81\xe3\x84\xd6\x29\x8f\x3e\xa5\xeb\x2c\xf6\xd4\x38\xc4\xd9\xe3\xde\x27\x88\xa1\x71\xfd\x10\x43\x88\xf6\xcb\xf8\x19\xdc\x1e\x1d\x73\xd1\x25\xf7\xd0\xdf\x41\xee\xa1\x5a\xe4\x1e\xc8\xdf\x11\x66\x17\x9e\x45\xe0\x71\x88\x29\xdf\x2f\xb5\xa7\xa9\x3b\x74\x9b\xba\x43\x3d\x45\xdd\xf1\x94\x7c\x53\x8b\xbb\x43\x1d\x92\x32\x08\xc8\x3b\x68\xfd\x4a\xe6\x0e\x94\xfb\xe1\xb5\x53\xfb\x9e\xbf\xef\xa4\xed\xd0\x8f\xd2\x76\xfc\x08\x6d\xe6\x1e\xc3\x37\x85\xbe\x9f\xc9\x74\x8e\x28\xee\xf0\x61\x25\xf7\x1b\x50\xd8\x95\x39\x57\x6e\x41\x8e\x63\x5b\x99\x97\x54\x6a\xb2\xde\x48\x63\xea\x06\xaa\xc8\x15\x6c\x58\x44\xc6\xe0\x2f\xb1\x94\xf1\xc4\x3d\x94\xa9\x2a\x40\x0c\x63\x9d\x67\x97\xaf\x28\x63\xbc\x4e\xb3\x7c\x47\x29\xda\xbc\xac\xf1\x48\x4f\x9b\x14\x77\x27\x01\x1f\xb2\xc2\x01\xff\xcb\x4a\xf9\x61\x63\x8e\x65\x99\x31\x39\xad\x3f\x93\xd2\xa5\x67\x1d\x06\x33\x84\x7b\xdb\xde\x7d\xe7\x84\x5f\x54\x2b\xad\xd8\x7f\x2e\x42\x3e\x9d\xc9\x34\xc0\x8c\x81\x73\x59\x34\xf6\xbc\xa9\xb2\xfa\x1b\xd2\x25\x4c\xa6\xa3\x8f\xa3\xf1\xf0\xaa\xcb\x20\xc1\x60\xcb\xe1\xf8\xa2\xc3\x12\x11\xe9\x9b\xeb\x8f\xd3\xe1\x05\x76\x21\xd1\xfb\x52\x02\x7e\x89\xdd\x4b\x80\x6f\x72\xff\x7a\xc1\xc4\x02\x93\xe9\xf1\x6c\xa0\x8f\x2f\x27\x53\xec\x44\x42\x42\x07\xe8\x9a\x9a\x21\x89\xc1\x4c\xfd\x08\xdf\xfb\x29\x7a\xe2\x22\xc3\x69\xa2\xcf\x27\x57\x57\xc8\xc2\x70\xf5\x55\x4f\x93\xcb\x64\x3a\x4d\x2e\xa0\x23\x6c\xa6\x8f\xe0\x4b\x47\x03\x45\x14\x16\x57\x5f\x1d\x1d\x01\x34\x57\x09\x92\x8a\xe1\xf8\xe2\x15\xf6\xfd\x5c\x8c\x60\x0c\x11\xf3\x5e\x48\xd6\x0b\xd9\x0a\xf6\xe1\x66\x0e\xad\x3e\xd0\xfd\x03\xb7\x84\x66\x38\xfe\xec\xa3\x17\xb7\x0f\xeb\xc9\x2e\x00\x9a\xaf\xec\x54\x0e\xe7\xa3\xd9\xe5\xf0\x7c\x3e\x99\x7e\x0d\x48\x2b\x2e\x47\xf3\xb1\x1d\xca\x41\x3a\x0c\xfb\xa1\xf1\x64\x4c\x74\x18\xc9\xe7\x64\x0c\x2f\x64\xfe\x69\x34\xbd\xa0\x96\xb0\xe9\xe8\xe3\xa7\xf9\x2c\xa6\x29\xbd\x98\x24\x33\x18\x3e\x0d\xd3\xb3\x74\x70\x2b\xda\x0c\x3a\xf7\x86\xa3\x71\x72\xa1\x46\x63\xf8\x53\xb8\x5c\xbe\x8c\xae\xae\xf4\xe7\x24\x99\xeb\xaf\x93\x9b\xa9\x9e\x26\xff\x7a\x33\x9a\xc2\xad\x67\xd0\xc6\xe6\xae\x38\xb9\x4e\xa6\xdc\x67\xa5\x0e\x5c\xe7\x43\xa2\x6f\xc6\xa3\xf1\x3c\x99\x4e\x6f\xae\xe7\xc8\x35\x92\x4c\xa7\x93\xe9\xcb\xcb\x69\x92\xf8\xeb\x11\x57\x88\x1e\x8d\x1f\xb9\x12\xf1\x61\x24\x17\x60\x5c\x26\x53\xec\xe9\xfa\x32\x1d\xcd\xe7\xae\x17\x8e\x06\x34\xd5\xc3\x8b\x5f\x46\xe7\x89\xfa\x38\xfa\x25\x19\xeb\x0f\x5f\x69\x7e\xa0\x0d\x8f\x97\x9f\x67\xba\x98\x26\x76\x4d\x24\xe3\xf9\x10\x78\x3f\xb0\x19\xee\x7c\x9a\x0c\xe7\x89\x1e\xba\x0d\x62\xdf\x25\x51\x82\x7c\x19\x7e\xb5\x8b\x66\x9a\x0c\x67\x48\xeb\x31\x3b\x9f\x5c\x27\x8e\x6b\xc3\x73\xb9\x60\xc9\xa4\x45\x9f\xdf\x55\x8e\xa5\x5e\x6c\xd7\x79\xb0\x26\x44\x1c\xe5\x22\x6c\x2c\xe5\x0a\x83\xc5\x0e\x69\x75\xd6\xe9\xd2\x9e\xf3\x99\xa9\x23\x95\x66\xd5\xb2\x4a\xd7\x8d\x2e\xd2\x7b\xd7\x11\x4c\x62\xed\x54\x7e\xaf\xf7\x75\x63\x36\x35\x9a\x96\x0c\x74\xde\xd6\xeb\x6c\xe9\x8a\x6f\x9b\x74\x79\x97\x15\x06\xe8\x2a\xa9\x8a\x97\x52\x19\x8d\x0c\x63\x3f\xaa\x19\x2d\x68\x0e\xa8\xc5\x52\xaf\x4c\xda\xdc\x41\x90\x56\x5b\xaf\x41\x65\xc5\x9f\x76\xd5\x9e\xd4\xcf\xec\xe9\xa1\xb7\x77\xfb\x3a\x5b\xb2\x44\xfb\x7d\x56\x95\xd0\xc6\x95\xe6\xd4\x5d\x82\xa9\xd6\x9f\xac\xfb\xef\x7b\x29\x7e\x8a\x4f\xf4\x48\x80\x98\x5c\x27\x55\xef\x90\x80\xc8\x83\x98\xfa\x39\xa3\x58\xae\x53\xf4\x80\x14\xe4\xd0\x44\x13\xf5\xf1\xd1\x10\xaa\x5d\x66\x15\x5e\xe6\x68\x10\x79\x87\x06\x04\xa4\x7b\x5c\x72\x8c\x7f\x81\x3b\x8e\xd0\x0d\x9e\x1d\x74\x5b\x95\x4b\x17\x27\xa1\xb7\xec\x01\x5d\x54\x11\x62\xbe\x7f\xeb\x4e\x28\x46\x6a\x1a\xdd\x3f\xa2\xf7\x50\x83\x14\x87\x74\xff\xc7\x74\x5d\x2a\x81\x0e\x2c\x4a\x4a\x09\xf2\x63\x67\xc5\x2d\xa8\x56\x81\xd4\x99\xeb\xce\x87\x33\x85\x86\x49\x8e\x89\xbc\x45\xfb\x80\xf2\x15\xc2\x6c\x03\xba\x37\x50\x5e\x00\x2a\x02\x4e\x71\x6c\x4b\xd7\x9b\xe8\x50\x90\x84\x3f\x50\xc4\x56\x42\xd5\x45\x0a\x85\x28\x55\xac\xb9\x6c\x0f\x25\xf3\x35\x85\x67\x66\x23\x01\x1c\x2d\x7f\xe3\xa7\xf8\xf4\xbb\xbb\xa8\x71\x97\xa3\x2d\x70\x4d\xc7\xca\xb7\x19\xfb\x9e\x62\xd1\x68\x8c\xbd\xc7\x87\xbb\x8c\x87\xd3\xd1\x6c\x34\xfe\xa8\x27\x37\x60\xa9\x27\xd6\x80\x5e\x0d\xa1\x3d\x76\x3e\x69\x51\x37\x4d\xd1\xc2\xde\xe0\xbf\x47\x63\x6e\xb7\x9d\x23\x41\x8f\x34\x84\x0a\x7a\xa8\xb9\x8b\xd8\x1e\xcc\xf6\x31\xe7\x9f\x92\x69\x32\xb9\x8c\x34\x77\x7d\xe3\x93\x0e\xa9\x1b\x1c\x7b\xb0\xb9\xd5\xdb\x1d\xf3\xea\xd1\xde\xf0\xeb\xe9\xe4\xe2\xc6\x9a\x62\xdf\xfe\x1b\x36\x89\x73\x5b\x32\x4c\x9c\xfa\x34\x9c\x61\x2b\xb2\xb5\xb7\xb3\x67\x75\x22\xd3\xa9\x36\xb7\xfe\x87\x7d\x17\x30\x06\xeb\xb6\xb8\xde\xe9\x4b\x2d\x38\x8c\x98\x19\xea\x92\xb8\x98\x3e\x27\x17\x5f\x21\x4b\x51\x94\xc4\x16\x80\x3d\x5a\xbc\xea\x9a\xb2\x49\x73\xe5\xa3\x20\x4a\x56\x42\x22\x3e\xcf\x5d\x0b\x5b\x4f\x03\x9a\xf9\x75\x69\x88\x3b\x91\xd9\x0b\xa8\xc8\xaf\x56\x65\x9e\xa7\x55\xad\x8f\xff\x9f\xb7\xaf\xe3\xd7\xaf\x07\xd4\xfc\x3b\x67\xad\xcc\x36\x28\xd9\x91\x05\x63\x38\x0f\x28\xbf\xce\xd6\x72\x4a\x9b\x80\x7b\x83\xff\x02\x02\xb3\x5a\x13\x24\x39\xa2\x7f\x38\xc8\xb2\xfd\xcd\xe7\x74\xa9\x27\x33\xfd\x47\xf9\x6f\x3d\x33\xd5\xbd\xa9\x8e\x34\xc5\x80\xe4\xe9\xbb\xeb\xeb\xd6\xf5\x17\xc6\x5a\x04\x62\x62\x21\xb4\xee\xb2\x84\xe4\x1d\x70\xbe\xd0\x7d\xd5\x67\xfb\xe5\xa3\x01\x05\xc7\xf4\x49\xf8\x25\xbb\xc3\x2c\xbd\x6e\x8a\x55\x59\x61\x31\x73\x5b\x95\x9b\xb2\x71\x19\x25\xa7\xdf\xa3\xfa\xd5\x60\x95\x12\x71\x49\x50\xdf\x5c\xec\x09\x18\xa3\xa9\x6c\x2a\xda\x99\x52\xac\x60\xda\x28\x11\x71\x89\xfc\xfe\x03\x49\x41\x37\x03\x7a\x57\x43\xe7\xcf\x2e\x5b\x99\x1c\xa0\x79\x82\xaa\xa9\x84\xd0\xe1\x50\x55\x02\x50\x30\xaf\xfc\x37\xd7\x65\x75\x56\xad\x28\x75\x0d\x85\x09\x6a\x1d\x9e\x30\x94\x83\xe3\x60\x2c\xcd\xd7\x82\xe0\x27\x42\x6d\x19\x7a\xac\xc6\x54\x06\x4b\x83\x94\xa7\xe9\xfa\x05\xbd\xe0\x51\xa7\x0e\x58\x56\x3d\xe9\x0a\x06\xb4\x87\x15\x9b\x23\xc2\x72\x62\x54\x8f\xef\x31\xd4\x01\xcc\xa8\xed\x74\xd1\xa2\xde\xe2\x13\x54\xb5\x3b\x51\x9f\x3e\x1c\x23\x11\xe8\x3a\xc2\xc3\x9d\x4b\x77\x85\x03\xe8\x83\xb8\xe1\x03\x7a\x22\x6b\x0c\x4a\x69\x1d\x95\x9e\x39\x90\x71\xd5\x61\x55\x5d\xa4\xc4\xec\x83\x89\x41\x34\x77\x66\x43\x4b\x28\x76\x86\x43\x82\x30\x54\x50\x07\xc0\x67\xd9\x04\x25\x6f\x89\x33\x0d\xf3\xac\x21\xd0\x54\x51\x0a\xd7\xcf\x6e\xab\xa1\x40\x9c\x62\x5a\xeb\x93\xd3\x18\x32\x2d\x9e\x1f\xe4\x04\x44\xcf\xc5\xaf\xfe\x22\x5a\x35\xaa\xd0\x84\x6f\x98\x71\xbd\x92\x19\x8a\x10\xf6\x87\x69\xd7\x18\xf8\x40\x08\xbe\x4e\xde\xf9\x09\x16\x36\x7d\xe6\xd8\x90\x1c\xf1\x9a\x72\xc4\x6b\xe2\xf3\x8c\xfb\x10\x5e\x46\xd6\xe6\x8a\xb9\x33\x7a\x99\x55\xcb\xdd\x06\xb3\xd5\xfd\x3a\x47\xb5\xfe\x29\x3e\xe1\xac\xed\xc9\x59\xfc\xee\x78\x31\xb0\x7e\x10\x16\x4a\xbf\x6f\x46\x60\xc5\x03\x66\x38\xdb\x18\xbd\x62\xa9\x38\x2c\x6d\x77\xdb\x5e\x80\x76\x01\x01\xb6\x4c\x46\xb6\xf6\x6d\x09\x81\x37\x1a\x64\xe5\xf0\xf5\x4b\x8a\xda\x60\x21\xdc\x58\x6f\x4b\xb0\xc9\x44\x61\xff\xb4\x9c\xb2\xba\x29\xb7\x70\x34\xac\x77\x15\x98\xdb\x27\x16\x78\xef\x92\x16\xd9\x7b\xe5\xd2\x14\x07\x7c\x50\xd9\x5c\xf0\x18\x9d\x8f\x7d\x29\x28\xfe\x01\xd1\x43\xdd\x54\xe5\xbe\x05\x5e\xea\x2b\x1a\x1c\xb8\xeb\x31\x65\x67\xe9\xb6\x4a\x3d\x7a\xdf\x81\x6f\x02\x61\x42\xd4\x6d\x59\xd7\xa6\xae\x9d\xb6\x02\xc4\x46\x40\xfe\xa7\xba\xe4\x7f\xba\x87\xfc\xcf\x8b\x5f\x74\x28\x00\x99\x1a\x48\x75\xa8\x81\x9e\xe2\x05\xd4\x87\x79\x01\x55\x87\x17\xb0\xbe\x83\x88\xec\x11\x66\xc0\xc7\x6e\xa1\x82\x01\x49\x44\xec\x02\xf7\x03\xa2\xff\xf1\xd4\x77\x3b\xeb\x2c\xd2\x6f\x23\xfd\x63\xa4\x7f\x8a\xf4\xc9\xeb\x48\x9f\x9c\x44\x40\x0d\x02\x2f\xf6\xe4\x2c\xd6\x63\xea\xdc\xc5\x73\x99\x33\xb9\xd6\x4b\xcb\x1d\x4f\x39\xfa\x01\x28\x26\xbf\xd9\x9a\xa2\xa6\x45\xed\x2a\x13\x80\xe7\x27\xff\x8d\x33\xa2\x65\xd5\x30\xc8\xae\x45\xa8\xef\x1e\x92\xbb\xdf\xa4\xcc\xd0\x72\x59\x56\x2b\x6b\x2b\x94\x53\x8c\x86\xc3\x85\x6a\x26\x8f\x30\x27\xf2\xd8\xd9\x44\x6c\x2b\x03\xf4\xed\x46\x51\x1b\x81\x28\x8f\x20\xe8\x6b\x63\x56\x10\xa8\xca\x29\x20\x6b\x7f\x16\xeb\xcf\x59\xbd\x34\x79\x9e\x16\xa6\xdc\xd5\x48\x1b\x70\xa2\x93\x5f\xb7\xf6\xc1\xae\xd2\x07\x3d\xac\xeb\x5d\x05\x56\x2d\x14\x8b\xa5\x1e\x0b\x4f\xba\x6b\xf0\x3b\x70\xcb\x97\xf8\x1f\x5d\x08\xa4\x00\x92\xa5\xbb\xe6\xae\xac\xb2\xff\x44\x4f\x8b\x58\x34\x66\x0d\x40\xc6\xf3\xf4\xc1\x9d\x2c\x79\xfa\x50\xb3\xde\xe0\x9f\x76\x55\x56\xaf\x32\xe2\x53\x2c\x3c\x21\x79\xbb\xf1\x28\xad\xa9\x58\x62\x56\xe0\xac\xfb\xf4\x3a\x34\x3b\xa9\x9e\x56\x92\x9e\xcb\xf0\xb3\x2e\xf8\xe9\xb0\x86\xec\x9e\xcf\xac\x6c\xcc\xad\x80\x8b\xec\x18\x69\xb7\x52\xed\xb8\x3d\x10\x71\x07\x78\x74\x5d\xae\xb1\x39\x00\xc8\x63\xcc\x66\x91\x56\xb7\xa5\x59\x69\xa0\x2f\xab\xf6\x0c\xef\x6d\x4a\x45\x62\xab\x14\x98\xc2\xc7\xe7\x95\x49\xeb\x5d\x05\x80\xaf\xb4\x6a\x36\x58\xf4\xc9\xb3\x1a\x96\xd9\x6c\x6b\x96\xa0\x6f\xaa\x2f\x18\x05\xc7\x64\x24\x69\x8e\x9e\x3d\x5f\xc8\x7f\x1f\x1d\x04\xe0\xe2\xb1\xae\xc7\x1c\xb6\x41\xb9\xd6\x17\xa6\xc8\xd2\x5c\x4f\xaa\x95\xa9\x6a\xe8\xe6\x74\x39\x81\x76\x00\x8e\x14\x06\xd4\xd8\x80\x50\x10\x2c\xea\x05\x9a\x28\xb8\x63\xcb\x25\x95\x45\xa9\x9a\xef\x40\xe8\xe5\x1a\xf3\x41\x87\x26\xcd\xd7\xb2\xc4\x4c\x91\x18\x31\xfc\xda\xce\x02\x2e\xda\x53\xc1\xc9\xa3\x1d\x27\xcf\x73\x59\x90\x8e\x50\x9d\x70\xcd\xbe\xdc\xe5\x70\x8a\x8c\x47\x92\xea\xc7\x53\x15\xe1\x26\x5d\xde\x15\x90\x49\x5a\xa5\x4d\xea\xd4\x25\x8b\xce\x31\xe5\xd0\x85\x5d\x16\xa0\xe5\xae\xb6\xc7\x7e\x95\xe5\x7b\x81\xdc\x43\x73\x84\x70\xa4\xd6\xb8\x7a\xf8\xfa\xf9\x1a\x7b\x2d\x9e\x29\xf7\xb6\xa6\x35\x4e\xf0\xc2\xe9\x39\x54\x56\xfb\xdb\x66\x85\x52\xde\x2e\xa1\x93\x65\xa7\x01\x38\x93\x4e\xf4\xf1\xdc\x5d\xe7\x22\x6d\x48\x7d\x9e\xe9\x97\x38\x40\xd4\xcc\xc4\x30\xb0\x96\x37\x02\x63\x1a\xae\xba\x0b\xb3\xa6\x3a\x51\xb5\xbc\x4b\x81\x8f\xe3\x02\x26\xfb\xed\x69\x7c\x7a\xfa\xc3\xcb\x1f\x5e\x9f\xbc\x6d\xdf\x4b\xbd\x7c\x29\xe5\xea\x47\x8d\xd9\xd4\xa4\x7e\xcf\x3c\x4d\x67\xfa\x78\xea\x5e\x80\xf8\x6c\x67\x60\x0a\x68\x5b\x5b\xbf\xd4\x17\x12\x4a\x35\x88\xf5\x10\xe6\x01\x88\xcc\x7b\x49\x9f\xec\x02\x53\x7f\x1d\xd2\xa7\xb3\xf8\x4c\x4f\x0d\xf6\x5d\x90\xb4\x2a\x32\x22\x9a\x76\x50\x2f\x9d\x78\x41\xe2\x53\x93\x0c\xa2\xf5\x5f\x0b\x9d\xde\x9a\x62\xb9\x8f\xc0\xe0\x51\x3c\x18\xe9\x3f\x95\x19\xb4\xd4\x16\xd8\x54\x55\x89\x73\x82\x5b\x58\xb0\xd9\x22\xf5\xec\xee\x8a\x59\x7c\xb8\x2b\x12\x3c\x42\x5f\x29\x76\xa3\xf1\x46\x80\x16\x2e\xb6\x30\x54\xbe\xaf\x41\xb9\x62\x14\xd0\x08\x03\xd8\x81\xe3\x18\x84\x6f\xc3\x8a\x93\xa7\x09\xce\xcc\x1b\x3d\x2a\x56\x66\x6b\x0a\x30\x07\x17\x3e\x40\xf2\xb4\x39\xed\xb8\x0b\x86\x95\x6d\xb6\x69\x56\xb9\x90\xdc\xd5\x17\xe9\x5d\x45\x1e\x5c\x44\x41\x57\x84\x7e\x13\xdc\xde\x45\x62\x98\xfa\x6b\x22\x6d\x23\x78\xd3\xf4\x75\xbc\xda\x65\x5a\xe6\xe5\xed\x9e\x12\x0f\x98\x70\x40\x75\x68\xc4\x09\x79\x34\x56\x59\x69\xe6\xc4\x5f\xef\x8a\x25\x81\x38\x30\x21\xee\x4f\x51\x70\x3d\x1a\x43\xbd\x28\x2d\x94\xb1\xc4\x7a\x44\xe1\xdd\x55\x78\x77\x87\x4a\xe0\xe7\xf3\x88\x32\x7c\x98\xa0\x61\x13\x67\xfb\xad\xfe\x92\x66\xf7\xa6\x82\x3e\x0f\xec\xc1\x03\x37\xff\x92\xd2\xef\x0e\x8f\x02\xf9\x16\x60\xf0\xea\x67\x13\x53\x7d\x2b\x96\x08\x8c\x52\xfd\x00\x37\x81\xdc\x16\x32\xe7\xd2\xb5\x36\x2e\x9a\x4a\x9b\x60\x8d\x7a\x12\xae\x03\x54\x58\xfa\xfb\xa8\xb0\xd4\x61\x2a\x2c\x2d\xa9\xb0\xdc\xe8\x0f\x32\x61\x9d\xc5\xef\xf4\xcc\xdc\x9b\x8a\x2b\x05\x90\x82\x1f\xad\x1d\x5f\x0f\x41\x1a\xec\xbd\x77\xd8\xc3\x47\xef\xb7\x68\x02\x5f\x46\xad\xb3\x62\x55\x3f\xce\xcd\x16\x89\x0e\x4e\x5f\x90\xed\x25\x6a\xc3\x05\x18\x5e\xc8\x74\x3c\x48\xfa\xca\xaa\x5f\xa7\x07\x13\x61\x28\xd5\xa3\x6a\xa0\xab\xb6\xef\x1d\x7d\x79\x08\x7f\x97\x65\x51\x6e\xb2\x25\xb5\x13\x11\x04\x12\x4a\x48\x2e\x2a\xa6\x34\x55\xe4\xd3\x04\x10\x15\x58\x17\xa0\xd7\xaf\x75\xc8\x86\xac\x80\xc2\xba\xe6\x55\xb6\xa2\x3b\xc7\xe0\x27\x8d\xcb\xc6\xee\x0f\x6e\x6d\x52\xd8\x50\x53\x99\xdb\x12\x58\xc1\xb2\x75\x8b\x02\xce\x89\xf1\xd4\xb2\x0d\x02\x91\xd9\x10\x5b\x63\x11\x9f\x36\x38\x33\xf6\x80\x53\x85\x29\x07\x6b\x69\xc0\xa6\x7b\x9c\x24\x43\x4a\xce\x70\xeb\x43\x32\x00\x4b\x3e\xee\x55\x10\xef\x97\xf3\xbc\xe1\x91\xed\x71\xc0\x57\x89\x7a\x6d\x97\x8f\x9a\x05\x77\x31\x5a\x5d\x92\x95\x16\x1f\x59\x65\xb5\x9b\x34\xbb\x7c\x7c\x49\xbf\x2b\x90\xde\x0d\x6f\xa1\x18\xd5\x3c\x37\x0c\x85\x15\xff\x83\xbe\xc8\x6a\x7b\x7c\xea\xa9\x01\xf5\x36\xbf\x2f\x3d\xc3\xb3\x43\x69\xad\xe8\xb3\x95\xfb\x2c\xb3\xc3\xa9\xe0\x5c\x69\x49\x02\x76\x18\x01\x9b\xf4\x1b\x51\x58\xb0\x87\x35\x2e\x21\x91\x50\x90\xe4\xe4\xb2\xb1\xcf\xe2\x99\x02\xfd\x41\xe5\xef\x41\xe0\x26\xbb\xeb\xc5\x71\xc5\xb5\xc2\x70\x43\x32\x26\xf9\xde\xe0\x72\xc4\xf0\x00\xf0\x7d\x98\x5e\x32\x2b\xd0\x3c\x84\x8d\x5d\x73\x52\x09\x26\x92\x07\xd4\x43\xde\x1d\x3a\x6f\xff\x18\x3a\x41\x78\x8b\x3f\xea\x04\x51\x1b\x43\xc6\x8e\xbd\x27\xf7\xc6\xbe\x83\xab\xf4\xa1\xe5\x7b\x78\xd2\x39\x5e\xe3\xf6\xdb\xca\x23\xcf\xd8\x5b\x10\xbb\xbe\xb7\x67\xe4\x00\x31\xe5\x5c\x1e\x1b\xbd\x24\x90\x22\x14\x94\xf3\x44\x01\x23\xdb\x17\xf8\x4f\x1b\x2d\xca\x95\xc0\x24\x91\xf6\xe5\x2c\x4a\x0c\x86\x5b\x9c\x92\x9e\x3a\xd3\x51\x40\xc2\x9d\xf2\xf4\x21\x56\xea\x8b\x93\xe1\xb4\x9b\xc4\x87\x33\xf8\xb4\xd6\xce\x82\xff\xb2\xd6\xff\xba\x33\x0b\xb3\x8c\xf4\x79\x5a\xa4\xab\x34\x0a\x3b\xfd\xf4\x32\x4f\x77\xb5\x51\xc4\x18\xf3\x33\xac\x00\x9e\x2b\xbf\x36\xd7\x19\x78\x0d\x78\x84\xed\xd1\x31\xa9\xcc\x7f\xec\x10\x61\x44\x7f\x10\x09\x13\xc7\xe1\xdf\x6a\x0b\x40\x51\x18\x38\xcb\x90\xb2\xae\xb8\xcd\xb3\xfa\x2e\xd6\x57\xa6\xf6\x5d\x17\x45\xa3\xcd\xaf\xd9\xad\xd1\xff\xb1\x33\x0a\x70\xb8\xe8\xcb\xe1\x61\xd9\x68\x63\xdf\xdc\xae\xd6\xb9\xa9\xc5\x95\x97\x65\x51\x98\x5f\x4d\xad\xeb\x12\xa5\xb5\xcd\x2a\xbb\x35\xb5\x06\x59\x81\xdb\x3c\xcd\xea\x58\x39\x8a\xba\x58\xa9\xa3\x6b\x66\x1e\x38\x77\x7d\x7f\xc7\xcb\x01\x12\x0f\xf5\xd2\xe2\x0c\xf3\x5c\x93\x47\x3f\x35\xb5\xa9\xee\x6d\x20\x0f\xab\x44\x36\xe3\xd7\x5d\xb2\x0b\x6b\x93\x3b\x90\xf8\xd6\xa7\x82\x90\xca\x35\x93\xf7\xb0\xe2\x3d\x46\x5e\x23\xc9\x94\x40\x22\xe2\x05\xfd\xe5\xc5\xa0\x9b\x29\xf9\x6e\x76\x3c\x62\x63\x7a\x82\x1c\xef\xe9\x46\x16\xc0\xf0\x03\xa7\x53\xd6\x30\x7f\x93\x60\x64\x22\x05\xf8\x2e\x60\x8d\x57\x55\xfd\x3c\x6a\xbd\xd6\x27\x88\xec\xf2\x05\xc0\xbd\x5e\x10\xb7\xde\x77\xe9\x02\x05\xaa\x40\x1e\xf8\xf5\x29\x99\x26\x1f\x3c\xde\x6a\x06\x80\x2b\xa8\xee\x7a\x60\x94\xc0\x53\xf5\x89\x08\x29\x04\xd0\x38\x18\x55\x17\x34\x15\x3d\x8d\x8c\x0a\x85\x82\x00\x9e\xe4\xde\x59\xdd\x65\x02\xd4\x7f\x1e\x13\xa0\xea\x32\x01\x1e\x3d\xc1\x93\x17\xbf\x5a\xfc\x67\xb6\x3d\x05\x02\xb8\x77\x7f\x23\x0a\xb8\xc7\xf9\xdf\x5e\x9f\x9d\xbe\xfb\xa1\xc5\xff\x76\x76\x76\x7a\xf6\x1b\xff\xdb\xdf\xe3\x07\x4e\x6d\x62\xa3\x88\xf4\x11\x2c\x86\x23\x3c\x88\x04\x61\x44\x9e\x2d\x6c\x84\xae\x8f\xf2\x6c\xc1\x1f\xe1\x1d\xdf\x6a\x2b\xb3\x3b\xdb\x37\x6b\x1f\x9f\x83\xd1\x7e\xf7\xf2\xf4\xf5\xc9\x6b\xfd\x87\x9d\xb5\x5f\x7a\xaa\x67\xe6\x21\xad\x56\x68\xb5\x9d\xc6\x33\x59\x6d\xa5\xa6\x26\xa8\xe4\x20\x29\x1c\x38\x72\xde\x46\xe9\x05\xca\x58\xda\x98\xb9\xee\xb4\xb5\x87\xc5\x4f\x18\x93\xaf\xd3\x87\x2d\xaf\xad\x23\xd7\x37\xb4\xda\x2f\x6d\x4c\x03\x94\x5f\x3a\x1c\x12\x9c\x11\x34\x16\x68\x71\x21\x6d\x23\x94\x83\xbe\x33\xa8\xf3\x20\xa6\x81\x7a\xf5\x14\x71\x5e\xd6\x14\xda\xf9\x7b\x91\x3b\xe2\x07\xe2\x7b\xd8\x91\x5a\xc1\x5a\x5c\x24\x5e\x71\x71\x9e\x33\xb5\xdc\x34\x09\x42\x6e\x59\xed\x12\x2c\x66\x45\xb4\xab\xfc\x77\x04\x94\xb9\xc6\xe9\x87\xaa\xa4\x2e\x1b\xa6\x74\x11\xcc\x7c\x44\x9b\xe7\x0e\x23\x77\x37\x38\x5e\x28\x7b\x10\x41\x0a\xc9\xe1\x05\x37\x58\x1e\x64\x37\xc7\x7e\xa2\xd5\xae\xfe\x00\xb5\x9e\x05\x78\xb2\x95\xa1\xd5\xb5\xd8\x35\x3a\xab\x15\x26\x87\xb0\x0d\x13\xdb\x00\x87\x79\x03\x11\x09\x4d\xb5\x53\xd9\x64\xd5\xd3\x6d\x9e\x66\x45\xbe\xc7\x1c\xc5\x8a\x69\x5b\x08\xff\xec\x27\x45\x85\x93\x02\x92\x26\x86\xa1\x6b\xdd\x47\x87\x4e\xa8\x79\x4b\x9d\x0f\xab\x0f\x32\xc3\xff\x67\x40\x49\xe4\x34\xf2\x4a\x75\x56\x1e\xcb\x6d\x0f\x95\x5d\xa4\x85\x8b\xa6\xa1\xa6\x0e\x38\xac\xd9\xe4\x72\xfe\x65\x38\x0d\x01\xd2\x1f\xbe\x02\x7c\x09\xb1\xa1\xfa\xdf\xff\x1d\x0f\xd0\x17\x88\x55\x1e\x7f\xed\x39\x1d\x55\xef\xc1\x17\xe9\xef\x00\x12\xf7\xc0\x86\x9f\x07\x0f\x9e\x26\x5e\x88\xed\x22\xd6\xa3\xb1\x1e\x4f\x00\xa0\x35\x27\x74\xdb\xfc\x53\xa2\xe8\x59\xbc\xae\xc6\xa5\x93\xeb\x00\x1d\x0d\xaf\xa8\xd1\x0f\x7a\x4b\xfe\x98\x7c\xbe\xbe\x1a\x4e\xbf\x82\x86\x47\x3f\xec\xed\xf8\x89\x07\xbf\x9e\x4e\xce\x6f\x10\x45\x8c\x70\xb0\x0f\xa4\x58\xa7\x3e\x4e\x26\x17\x08\x38\x07\x09\xbc\x64\xf6\xde\xa9\x6d\xdc\xcc\x92\x48\x5f\x0c\xe7\x43\x00\xbe\x5d\x4f\x27\x97\xa3\xf9\xec\xbd\xfd\xf7\x87\x9b\xd9\x08\xa6\xc6\x41\x8b\x47\x93\xf1\x40\x7d\x9a\x7c\x49\x7e\x49\xa6\xfa\x7c\x78\x33\x4b\x10\xae\x3e\x41\xbc\xae\x07\xc4\x39\x58\x9b\x47\xcd\x8d\xc6\x02\x26\x37\x9b\x4f\x47\xe7\x73\x25\x3e\x36\x79\x4c\x4d\x25\x00\xc7\x0d\x1c\xfc\xcf\xc3\x84\x95\xf5\x7e\x08\x14\x47\xb2\x7b\xc1\xea\x13\x80\xba\x27\x11\x74\x0a\xa7\x3b\x56\x8a\x0c\x3f\x9a\xfd\x48\xff\xa9\x86\x7f\xfc\x7f\xf6\x28\x89\xcb\xea\x56\xc3\x99\xf2\x8a\x0f\x17\xc9\xf3\x18\xbf\xb3\x3b\xf0\x9d\x9e\x99\x6d\x63\x36\x0b\x53\x29\x7b\x92\xfc\x46\xfe\xfb\xd7\xfa\x89\x5f\x5d\x5d\xff\x8d\xe9\x7f\x9f\xf0\xff\x4e\x7f\x38\x39\xe9\xf0\xff\xbe\x7d\xfb\x9b\xff\xf7\x77\xf9\xb9\xda\x01\x1b\xd4\x23\x4c\xee\xd0\xe1\x30\x3c\x3f\x9f\x7c\xbe\x1e\x8e\xbf\x5a\x6b\x71\x3d\x9d\x7c\x9c\x0e\x3f\xf7\x6a\xbd\x26\xa0\xab\x39\x73\x76\x83\x98\x85\x99\x52\xf8\xf8\x68\xf8\x71\x9a\x80\x61\x05\x9a\xd5\xf1\x57\x34\x9b\xd3\x84\x80\xbc\xd4\x0e\xe1\xa4\x99\x08\x1e\x0d\x16\x86\x6e\x2b\xf4\x43\xd5\x34\x39\x1f\x5d\x8f\x92\xf1\xfc\xc5\x4c\x70\xea\xbb\xbb\xbb\x9b\x11\x7e\x21\xd6\x17\xc9\x25\xe8\x44\x4d\xc6\x33\xf8\xd5\x91\xe3\x33\xcf\xca\x82\x78\xbb\x7e\x66\xf6\x94\x34\x6e\xe3\x82\x7e\x37\x99\x7e\x1c\x8e\x47\xff\x13\x42\xc3\xdf\xeb\xe3\x23\xfd\xbb\xc9\x97\x71\x32\xfd\xbd\x3e\x1a\xb4\x10\x01\xd7\xec\x54\x43\x57\x3c\x5e\x70\xd1\xb9\x20\x40\xcc\x04\xa7\x7a\xc4\x1f\xd5\x5a\x67\x31\x51\x1f\x3a\x00\x4f\x78\xcd\x2c\x8b\x5d\xd7\x6e\xfb\x23\xef\x03\x6d\x37\xba\x0a\x93\x78\x1e\xf8\x8e\x22\x5f\xa8\x21\x04\x19\x78\xf8\x95\x11\x73\x64\x56\x47\x98\x5b\x4b\x1b\xd9\x81\x28\xc6\x1f\x2b\x35\xd4\x72\x4e\x75\x56\x77\x2f\x10\x0a\x66\x42\xe1\xf3\x38\x03\x9e\x8c\xac\x01\x30\x46\xba\x5a\x21\x71\x83\x18\x9e\x13\x80\x0b\x54\x90\x91\xf1\x02\xeb\x27\x65\x61\x00\xaf\x56\xdc\x3a\x76\x23\xf1\xd9\x17\xb5\x42\xec\x69\xe4\x59\x5b\x9b\x96\x3e\xa2\xf9\x75\x9b\x67\xcb\xac\xc9\x5d\xda\xb7\x8e\x42\x00\x4e\x90\xd7\x57\x67\xe7\x11\x77\x2c\xa7\xcb\xc6\x54\x42\x39\x04\xde\xf2\xa1\x89\x4f\xeb\x60\x92\xea\x58\x05\xff\xc9\x8c\xd3\x8e\x67\xe8\xc0\x1b\xc3\x4a\x16\xa9\x56\xda\xb7\x6d\xb6\x69\x95\x36\x46\x31\x15\x20\xc4\x29\x3d\x19\x19\x48\x27\x15\x7f\xa2\xba\xa2\xcf\x27\xf1\x75\x5d\x22\x21\xab\x54\xf9\x50\xe8\x8e\x48\x9d\x98\x43\x86\x6d\xac\xbc\xee\x39\x52\x34\xd2\x24\xd0\x35\x63\xa5\x8e\xc4\x54\x33\x47\x1e\xef\x1f\x86\x0e\x63\x1d\x80\xc8\xff\x1c\x69\xa3\x58\x40\x72\xf1\x00\xe3\x73\xd9\xbe\xcb\x85\x57\xba\xf3\x7c\xa7\x53\x6e\x80\xc6\x8b\xfa\xc9\xa8\xc3\x9d\x15\x2a\x61\xb7\xf7\x1d\xf7\x39\xa6\x55\x23\x9a\xff\x99\x39\x7a\x15\xb2\x41\x33\x60\x92\x3a\x99\x71\x0e\x99\xad\x32\xdc\x02\x0e\xde\xad\xb8\xe5\x26\x13\x9a\x8d\x2e\xa1\x4d\x20\xaa\x9a\xd2\xf6\x59\x13\x2e\x23\xcf\x22\xfc\x70\x67\x0a\x45\xbc\xae\xab\xce\xeb\xb5\x43\x6e\xdb\x29\x49\x5b\xe9\x62\xa2\x16\x35\x96\xc7\xb3\x2c\x97\xe5\x66\x9b\x16\x7b\x47\xe9\xee\xea\x02\x76\x69\x3b\xa2\xd5\xc5\xde\xbd\x5f\x09\xcd\x13\xa1\x73\x24\xe9\x6f\x54\x87\xdf\x8c\xd5\x57\x20\x27\xdc\x1d\x68\xfb\x21\x42\x9d\x1d\x8c\xd4\xbb\x6f\x4c\xa9\x23\xb7\x1a\x3c\x0d\x25\x58\x8f\x87\xbb\x12\x05\x62\xef\xc3\x75\x21\xe1\xde\x43\xbf\x07\xdc\x23\xa9\x34\xcf\x03\x81\x1f\x3c\x70\x4e\x63\xfd\x11\xfa\x1a\x27\x97\xd4\xf9\xa8\x54\x7a\x80\xfc\xd0\x11\xa0\xfb\xcb\xb7\x0f\x87\x90\xfa\x50\xf9\x25\xfd\x08\x81\x4a\x40\x4e\x23\x52\x12\x0e\x5b\x5e\x0a\xfe\x18\xb5\xad\xac\x05\x31\x7d\x7b\x39\xf2\xa4\x5b\x9e\xdc\x84\x7f\xe3\x58\x4e\x84\x2a\x0d\xb1\x2c\x09\x10\x7b\xb8\x58\x19\x37\x2d\x4f\x3f\x27\xb6\xe3\xc0\xff\x7e\x24\xea\x01\x71\x0c\x3e\x0f\xb4\xe4\xcc\xb3\x58\x43\x90\x11\x8a\x95\x5a\xfc\x23\xa7\x39\x24\xd0\xa0\xc5\xc3\x46\x42\x31\x05\x10\xb1\x75\x91\xa4\x4f\x6d\xf2\x3c\x22\xaa\xaf\xa6\xa4\xff\xcc\x36\x00\x92\x74\xac\x35\x80\xf9\x68\xaa\xf4\xff\x67\xef\x5f\x97\x1b\x47\x92\x6c\x51\x78\x7e\xc7\x53\x84\xc9\x6c\xef\x94\xb6\x41\x28\x49\x79\xab\xcb\xd8\xd8\xc7\xa4\xa0\x14\xbb\x29\x52\x43\x52\x95\xad\x19\x1b\x1b\x83\xc8\xa0\x84\x4e\x12\x60\x03\xa0\x94\x9c\x37\xfa\x5e\xe3\x3c\xd9\xb1\xf0\x4b\x84\x07\x00\x4a\xca\xea\xcb\x9e\x39\x56\xfa\xd1\x9d\x25\x91\x40\x5c\x3d\xdc\x3d\x96\xaf\x95\x57\x4b\x22\x27\x7b\xfd\x90\xbe\x6a\xdc\xf0\x8e\x29\x68\xbd\xe0\x17\x09\x8d\x16\xde\xbb\x01\x43\x80\x80\x3c\xb4\xf8\xc5\xbb\x26\x1e\x6c\x70\x20\x87\x4d\x19\x30\xde\x6f\xd9\x32\x62\x01\x5e\xa4\x58\x68\x76\x35\x23\x27\x81\x4d\x63\xd0\x65\x54\xae\x65\xd2\xe6\x8e\x36\x28\x28\xa1\xaf\x18\x2b\xe8\xda\x4b\xf8\x88\x39\x5d\x85\xd3\xb3\x9b\xe6\x3d\xd6\x7e\x98\xd4\x2b\x87\x29\x00\x86\xc0\x79\xed\x0e\x3b\xf1\xfe\x8a\x18\x69\xf9\xe0\x6f\xb6\x3b\xd2\x39\xe2\x46\xe1\xe4\x6d\x58\xba\x25\x3d\x2f\xb4\x43\xa3\x42\x3f\xa4\xe5\xe2\x89\x92\xa0\x1a\x85\x8d\x56\xdc\x25\x57\x79\x11\x2b\x35\x8f\xc5\x31\x09\xbf\x04\xc8\x44\xe5\x78\x21\x1f\x80\x49\xa8\xb5\x5f\x88\xef\x4e\x92\x6f\x29\x60\x28\x6e\x78\x39\x2d\x40\x9b\xed\x8e\x4e\x1d\x62\x98\xa5\xe8\x31\x3d\x0b\xf5\x54\x3b\xf9\x22\xe5\x32\xb6\xbc\x4c\x5c\xe1\x1a\x1f\x95\x74\xa1\x8c\xa0\x92\xf2\x39\xaa\x27\x66\xad\x24\xd4\xa8\xf4\x3b\x88\xc8\x43\x76\x91\xf3\xb1\x08\xba\x09\xca\xf5\xdc\x90\x29\x21\x3f\x77\x07\xa4\x4b\x35\x77\x22\xf0\x6a\xee\xe0\x6c\x04\x44\xb2\xa8\xa4\x80\x3a\x5f\xdf\x4e\xd5\xa2\xa4\x92\x70\x37\xdd\x6b\x72\x9f\x49\xa2\x64\x51\x60\x63\x03\x85\x96\x92\xb2\x24\xea\xb4\x1d\xf5\x93\xce\x7c\x2e\x55\xb5\x5d\x9b\xaa\x8b\x7a\x46\x81\x6d\x82\x2a\x19\xdf\xb1\x67\xb9\xb4\x72\x63\x16\x66\xe1\x4e\x72\xe0\x6a\x36\xdf\xd2\xf5\x66\x65\x22\x65\x7f\x19\x30\xd9\x37\x8c\x0f\xd0\xb6\x13\x35\x5f\x5d\xe8\x74\xb5\x2a\x9e\xa4\x2f\x57\x34\x75\xd0\x9c\xab\x86\xd5\xc4\x13\xc1\x7b\x13\x76\x44\x00\xfc\x70\x7d\xf3\x2b\xf1\xd6\xd3\xe3\xf6\x78\x44\xbd\xf3\xb4\xe8\x58\x20\x81\xdc\x66\x5a\x6b\x5a\xff\xbe\x94\x3e\x43\x4f\xb6\xda\x2e\x97\xd9\x3c\xc3\x3b\x73\x3a\x8c\x95\x07\x03\x37\xf7\x8c\x37\xdf\x75\xc1\x5c\x6a\x0f\x5d\xe7\xb8\xdb\x5a\x0e\xf6\xeb\x4e\x38\xf4\x45\xde\xc6\x01\x39\x82\x52\xbd\x58\x0b\x4f\xb9\xc1\xc8\xd4\xa0\xe1\x72\x66\x59\xe8\x0c\x78\x97\x48\x79\xef\xaf\x60\x9e\xca\x0c\x59\xd4\xba\x22\x87\xe0\x02\xe6\x67\x11\xf0\x9e\xc6\x76\x94\xf0\x9e\x9b\xf1\x20\xf5\x1e\x76\xe8\xf6\x41\xfe\x0b\x5c\x94\x64\xcb\xb0\xc1\x55\x33\xee\x91\x67\xa0\xb3\x10\x75\x9a\xdf\xb3\x82\xa4\x0d\xaf\x55\xc0\xd6\x1b\x74\x4f\x8c\xd9\x9b\x3d\x5d\x44\x55\x46\xc4\xcf\x60\xc1\x06\x6c\x33\x79\x27\xef\xc2\x74\x88\xe4\xdf\x42\xbb\xdb\x57\xe6\xaf\x78\x57\xc4\xc0\x76\x42\x77\xf0\xef\x7f\x06\x4f\xd3\x95\xbd\x13\xf4\x0b\x8d\x53\x50\x85\xd9\xf4\x5c\xe1\x17\x84\xcd\xcf\x30\x76\x55\x7e\xd8\x3d\x0d\x19\xa0\xf7\x98\x87\xcc\xfb\xf6\xe2\x9b\x08\x05\x93\xf3\x95\xd5\x2b\xf4\x0b\xad\x1f\x25\xad\x5f\x24\x1f\xf7\xec\x33\xd6\xa6\xb4\x51\x75\xcd\x70\x39\x00\x57\x65\x75\x4e\x9c\x52\x21\x35\x12\xe9\x1f\xfe\x02\xee\xa0\x1c\x0b\x42\x37\xbd\x66\x28\xbc\xad\x5f\xfa\x7a\x9e\x48\xf9\x1e\x33\x95\xbb\x27\x75\xaf\xb0\xc6\x02\x86\x05\x4a\x13\x88\xaf\x10\x52\x0a\xc0\x87\x94\x39\xfe\x88\x8a\x74\x72\x81\x75\xb5\x02\x18\xe6\x32\xab\x2b\x5a\x18\xf3\x18\x31\x64\x95\xa7\xea\xda\x34\x4a\xaa\xa8\xde\x54\xfb\x3b\x26\x11\x8b\x79\x02\x2f\xc5\x79\x9b\xc0\xeb\x82\x78\x91\xb9\xc4\x82\xb3\x8a\xcb\x7e\x3e\x91\xad\x0b\x4c\x05\x52\x04\x7b\x17\xc5\xdf\x5b\x12\xf8\x24\xaf\x36\xd9\x7c\x0b\x40\xa0\x82\xf5\x34\x72\x69\x9f\xdd\xb6\xef\x07\x77\xc5\xff\x7c\x9b\xf4\x26\xff\x12\x35\xf3\x6c\xce\xff\xad\xba\x91\x3e\x4a\xf5\xa1\x6c\x87\x5d\xbe\x0e\x9f\x1e\xdb\x4c\x22\x56\x82\x28\x55\xc4\xbb\x28\x1f\xa4\xf6\x9b\x60\x04\xac\x2e\x90\xb4\x99\xe4\x7f\x19\x1a\xd8\x91\x02\x82\x27\x89\x9c\x8f\x54\x33\xa9\xb0\xfc\xab\xf1\x1e\x3b\x78\xa8\xdd\xc2\xcc\xe2\x69\x55\xe4\xe9\xdd\x6a\xa7\xe0\xe4\xab\xa4\xe4\xd5\xc4\xd3\xcd\xd9\xc3\x86\xbb\xd6\xea\x50\xcb\x89\x8c\x15\x70\x8d\x71\xe3\x33\xe7\x18\x44\xac\x98\x05\xf5\xc7\x5e\x0a\x09\x05\xb4\x8a\xaf\x30\xd2\x5a\xeb\x77\x71\xa0\x05\x2f\x72\xb5\x4a\x89\x62\x8a\x85\x5f\x32\x61\x26\x0a\x88\xc5\x80\x98\x5f\xcf\x4d\x09\xb7\xe6\xc1\xd9\xcc\xc6\x5f\x09\x30\xa0\x41\x14\x40\x59\x45\x4e\x7e\xc7\x15\x2d\xf8\xda\xaf\xec\x2b\x88\xbe\x64\x2b\x13\xea\x4b\x66\x95\x72\x64\x35\x75\xc1\x5c\x34\xcc\xbd\x2d\x0a\x61\x04\x1e\xd6\x79\x12\xf6\x3f\xc4\xf2\x57\x4f\x0f\x85\x17\x93\x68\x9e\x8e\xf2\x61\x7c\x07\x0e\x5b\x10\x35\x15\xe0\xfe\x1b\xb9\xff\xb2\x5c\xb9\xd9\xa6\x9d\xcc\xde\x2c\x31\x6e\x6e\x8a\x9a\x6c\x45\x68\x84\x02\x07\xdf\xc6\x22\xa0\xa8\xcd\xde\x94\xdc\xa9\xbf\xa9\x99\x78\xa4\x28\xf9\x9c\xc3\x03\x31\xaf\x32\xbf\x76\x14\x50\x00\xa2\xae\xb1\x27\xfe\x73\x74\x80\x0a\x39\xee\xe5\x86\x3c\x3c\x18\xd0\x5f\x33\x13\x88\x23\x1f\x1c\x39\x78\x3d\xf8\xda\x80\x2d\x8e\xd8\x5c\x2a\x34\xa4\x55\x5d\x35\x39\x20\x86\xf0\x41\xfb\x6d\x94\x7b\x46\x8b\x88\x47\x5e\x04\x58\xd0\x6d\x26\x89\x77\x15\xd5\xb0\x10\x42\x5b\x7a\xec\x81\x47\x2a\xb1\xfe\x7b\x9a\xac\x42\xfd\x07\x08\x2e\x5d\xf4\x98\xce\xc9\x7b\xa7\x0b\xfd\x4a\x84\xe9\x5d\x63\xaa\x30\x39\x9b\x1b\x91\x9b\xb5\x0d\xef\x2a\x6f\x7e\x61\x4a\x15\x4f\x29\x01\x48\x04\x39\x26\x7b\x89\x15\xbd\x86\x32\xce\x2e\x44\xb5\x43\xcf\xee\x42\xa9\x71\x6c\x95\x44\x5d\x03\x77\x39\x7a\xfc\xc8\x55\x62\xee\x49\x5a\xa6\x1d\x09\x64\x21\x17\x52\xae\x8b\x12\x54\x7a\x0a\xfd\x97\x6d\xba\x02\xba\xc8\x34\xdf\x37\xb8\x60\xba\x7f\xd6\xe9\x11\xe0\x2b\x36\xf5\x6a\xc7\x0c\xe1\x68\xd8\xb8\xd3\x2a\x5c\xf8\x00\xa5\x20\x3e\x1f\x0c\xf3\x6d\x6f\xd0\x88\xdf\x1d\x51\x24\x11\x3e\x21\x98\x05\x62\x3a\x2a\x8b\x55\x44\x87\x37\xd2\x5a\x09\xf4\x65\xf7\x37\x1d\xfa\x7b\x81\xb5\x6b\x8a\x53\xdb\x8c\xb8\xad\x4c\x5d\x23\x3f\x90\xce\xcd\x7d\x51\x67\xc4\x1a\xae\x67\xfb\x57\x18\xb2\x54\x82\x67\x93\xd9\x10\x89\x39\x7e\x7d\xcf\x98\xd4\xc2\x7a\x89\xe6\xdb\x86\x6a\x4e\x64\xb0\xd5\xb0\x0d\x6b\x38\x75\xe5\x31\xfe\xda\xd5\x14\xd9\x4f\x82\xc9\xf8\x93\x6d\xb4\xc3\xb0\x53\xf7\xc1\xda\xe4\x70\xba\x75\x8d\x4f\xac\x07\x4b\x45\xae\x48\xe7\xf8\xc1\xb7\xd7\xe9\x57\x53\x71\x5e\x11\x2e\x5e\x78\x27\xc3\xa1\xb6\xb4\x66\xdf\xfb\x89\x8a\xc7\xb6\x2e\x7c\xdb\x22\x2a\x9f\x68\x3f\x44\xd6\x9f\x66\x94\x77\x68\xec\x48\x15\xfa\xde\x8d\xd8\x11\x1c\xa7\x58\xdf\xf8\xac\x30\xed\xa3\xe8\xb9\x25\x85\xe8\x27\x40\x68\x7b\x3b\xc9\x2d\x12\x56\x26\xf0\x41\x45\xcf\x5a\xdd\x51\x9d\xdd\x21\x47\x65\xe9\xea\x88\x28\x82\xae\x9a\xf9\x14\x60\xfd\x4a\xc1\xeb\x53\x4e\x2b\xdf\x57\xa5\x3f\xd7\x17\xf4\xa7\xec\x97\xb1\x51\xf4\x75\xf4\x0f\xde\x07\x74\x9a\x4a\x25\x7f\xea\x27\xd7\x33\xdd\x9b\x6a\x4f\x81\x38\x4d\x66\xfa\x62\x3c\x99\x5d\x6a\xa0\xf5\x93\x97\xb5\x51\x70\xdd\x2b\x6f\x99\xc7\x23\xd5\x1b\x39\x56\xc8\x4f\xbd\xe9\x60\xda\x82\x09\x0f\x90\x10\x32\xa4\x39\xdc\x07\x1b\x56\x1e\x18\x25\xc1\x50\x1d\x30\x60\xdd\x84\x01\x37\x5e\xa1\x66\x83\xd9\x30\x89\x5a\x30\xdf\xa8\x89\x95\xb2\xdf\x7c\x09\x2a\x15\xab\x24\xcc\xcb\x64\x15\xb3\x06\xb8\x85\x48\xf2\x60\x0b\x83\x55\x3f\x9c\xa5\x48\x37\x28\x8b\x93\xd6\x06\x7c\xa4\x62\x49\x3c\x6d\x21\x43\x46\x98\xd3\x20\x3a\x7d\x4c\xfa\x20\xff\x4f\xf5\xb5\x92\x08\x50\x3e\x85\x14\xa5\x99\x8c\x17\xda\x7c\xe9\x6e\xa4\x8b\x89\x01\x69\x5c\xe1\x1d\xee\x38\x2f\x96\x4e\x16\x0d\x29\x4f\xa3\x16\xe4\x3d\x2c\xd3\x72\x4e\x81\x42\x59\xbe\x90\x04\x55\x4a\xc6\xd9\xf5\xbf\xf1\x71\xe6\x36\x27\x31\x03\xe2\x8c\x26\x9d\xa3\x72\xbb\xe1\x9c\xb5\x63\x30\xa4\x15\xfd\x21\xf6\xc8\xb5\x49\x80\xcb\xfa\x0d\xab\x7b\x44\x6b\xd0\x81\x17\xf4\x08\x21\x6e\x0a\x70\x5d\xd6\x95\x1e\x4f\x98\xf0\xed\xb2\xf7\x6b\x02\x6b\xcf\x13\x9c\xbd\x0a\x10\xa7\x3a\x00\x71\xfb\x79\xe0\x0e\x9f\x83\xc0\xab\xe1\x78\x3a\x63\x40\xdb\x51\xa4\xff\x06\xb8\x35\x85\xb8\x35\xfd\x37\xc1\xad\xa9\x2f\xbd\x5b\xdd\xc4\xad\x3d\x8f\x21\x21\xda\xd7\xe4\x4f\x36\x86\x11\x74\x6d\x78\x47\x07\x77\x76\xc9\x39\x54\x0f\x00\xb0\xe5\x7b\x50\x6f\x3c\xa6\xb8\x70\x3e\xc6\xfa\x73\x32\x4a\x26\xbd\xa1\x52\xc4\x01\xd9\xae\xd8\xec\x85\x89\xa3\xc7\x74\x95\xa1\xc8\xb4\x2c\xd3\x64\xea\x67\xb7\x05\xd4\x2a\x7d\x82\x88\x4d\x5c\x30\xf8\x72\x4b\x78\x08\xad\xee\xb0\xc2\x90\x7d\x47\x57\x5b\xc9\x6c\x19\x7b\x2f\xc8\xe0\x78\x21\xbc\x2a\x13\xf2\x10\x2f\x10\xf9\xb8\xb2\x2c\xa9\x2e\x22\xa7\x10\x4d\x1d\x75\x15\x5a\x10\xa8\xac\x45\x0d\x69\x96\xcb\x1a\xd2\x40\x40\x98\x98\xfb\xe7\x0f\xbe\xa0\x17\x7b\x45\x2c\xc2\x6e\x64\x62\x18\x5a\x61\x2c\x7d\xed\x99\xcb\x26\xbb\x52\x43\x17\x5a\x84\xf7\xef\x8d\xd2\xbb\xb4\x21\x16\x4c\xb4\x2f\x2e\x82\x3d\x14\xca\x8b\x7a\x5e\x16\x55\x75\x8c\x4e\x18\xe4\xab\xb6\xd6\x9a\x20\xd8\x1a\x5c\x29\x8a\x3d\x10\x21\x94\xd3\x7d\x74\x48\xb1\x2f\x6e\x8f\x5a\x59\x1a\x26\xa1\x6c\xdc\xcd\x34\xd7\x0e\x55\x3e\xfa\x1a\x50\x87\xc0\x00\x2d\x1e\x4a\x13\xf2\x40\x28\xaa\xe6\x59\x34\x12\x27\xd9\xf7\x8f\x64\xbe\x53\x74\xb3\xf1\xda\x61\xd1\xc1\xb0\x60\xf0\xc0\x5a\x34\x2a\xf0\x44\x31\x4f\x73\x88\xf9\x3a\x44\xe8\xfb\xcb\xb2\x66\x14\x84\x55\x00\xb0\x3c\x2b\xc1\xdf\xc0\xd7\x5f\x47\x2e\x0e\xa1\x8b\x3f\x79\x39\x80\xfd\x3b\xac\x78\x92\x5a\x1f\x20\x41\x16\x9e\xa8\x90\x9d\xe9\xec\xf0\xee\xe8\x37\x4f\x80\x52\x90\xd3\x6a\xbd\xeb\x75\xd3\x8c\xa0\xa9\x65\x9a\xad\x2a\xd4\xeb\x0c\x38\xcf\xb8\x05\xeb\xb4\x36\x65\xe6\x34\xa6\xda\xa9\xd9\x46\xe2\x30\x5f\x28\x9f\x8d\x70\x94\x68\xcc\xac\x0b\xd3\xe7\x92\x53\xe0\x92\x66\xc5\x02\x53\xbc\x6b\xa3\x39\x6b\x84\x34\x69\x3a\xc5\x89\xa0\x30\x2c\x2f\x72\x7f\xac\x23\x31\xee\x77\xf4\xde\xf5\x3b\x92\xf7\xf2\x2e\xf7\x30\x87\x8a\xaa\x6d\x53\x4b\xa4\x23\x62\x4e\xad\x47\x55\xe4\x08\x57\x71\x59\xb6\x4d\x69\xed\x1a\xec\x77\xa1\xd9\x20\x1b\x27\x63\xe8\xce\x16\x52\xb4\xd7\xbe\x75\xbb\xdb\x89\x9d\x15\xd6\x2f\xfb\x66\xe1\xec\x8a\x12\xed\x05\x73\x5b\xc5\x4a\x31\x96\x46\x2a\x16\x48\x89\x02\xb9\xff\x40\xc9\xc0\xfe\xf2\xa8\x63\x7a\x97\x65\xb1\x56\x1d\xd2\x05\xe2\x61\x3c\x5e\xfe\x4b\xdf\xa9\x67\x30\x13\xbd\x12\xed\x0a\x2e\x84\x8f\x48\x63\xe0\x29\xdd\x61\xf9\xa9\x28\x09\x6c\x94\x56\xee\x6d\x16\xd1\x06\xe2\xb5\x39\xa2\x07\x09\xc1\xd3\x30\x6d\x8a\x74\xdd\x9f\xef\x65\x56\x79\x4d\x82\xa8\x15\x81\x83\x98\x9c\xdd\x66\x7b\xee\xc7\x44\x47\x5b\xb7\xdf\x42\x52\x4e\x36\x01\x6e\xe8\x1b\x7a\x07\x3c\xd1\xa4\x78\xa0\xdb\x8a\x07\xc1\xfd\x9e\xd7\x96\x51\xcf\x68\xcb\x54\xfa\xec\x90\x78\x78\xc0\x5c\x41\x91\x52\x14\xac\x49\x02\x3e\xe5\x85\x93\x9f\x2a\x75\x93\x44\xae\x3b\xc3\x43\xb7\xe8\x72\xbc\x3a\xc3\x02\xc5\xda\xb5\xcf\x70\xbc\x98\xaa\x2e\x36\x1b\xb3\x6a\x5e\x79\xfb\x62\x31\x12\x66\xe6\x51\xb7\x46\xca\x77\x3c\xb4\xd0\x1d\x37\x22\xa2\xd4\x6c\xd6\x72\xbf\x9e\xab\x21\xe7\x6a\x71\xfd\xcf\xd3\x59\x6f\x96\xfc\x8b\xcb\x3b\x77\x5f\xdc\xef\x2f\x3f\x2f\x96\xba\xb7\x36\x65\x36\x4f\x41\xed\x82\xd8\x5f\x8b\x46\x63\x15\xee\xb8\x12\x8f\x53\x99\xad\xec\xee\x1b\x88\xd0\xc0\xfa\xb1\xcb\x69\x67\xd2\x92\x2c\x31\x28\x94\xa7\x94\xda\xa6\x27\xa4\x65\x51\xf1\xb6\x27\x96\xbb\x14\x26\xdf\xae\x5b\x4f\xfe\x9b\xea\x3f\x6f\xad\x3b\x06\x67\x07\xe6\x9c\x14\x66\x07\x6c\xab\xfc\x69\x16\xff\x5e\x92\xf1\x3f\xf2\x27\xfe\xe1\x73\x46\x75\x6f\x7f\xb7\x02\x90\x17\xea\x7f\xcf\xde\x9f\x9e\xb4\xea\x7f\x3f\xfe\x5e\xff\xf1\x0f\xf9\xe9\x59\xd7\xbb\x2c\xf4\x3b\xe0\x24\xd0\xf7\xb4\x18\xd8\xea\x1f\x81\x6f\x0a\x9f\xb0\xb6\x31\x5b\xd6\xc7\x54\x1e\x8a\x27\x2d\xab\xea\xc0\xa5\x09\x9e\xfc\x90\xc7\x31\x05\x30\xe4\x17\xe5\x57\xba\x14\xe6\xec\x39\x1e\xc4\xf9\x02\x1f\x67\x1d\x89\xba\x80\x42\xd3\x65\x69\x1c\x29\xa6\x7d\x4f\x1c\x4a\x5c\xb3\xb0\x61\x69\x1a\x6a\xc7\xea\xde\xe4\xa6\x04\xee\x9d\x87\x74\xfe\xd5\xba\x00\xe9\x9d\x0d\x54\x29\x41\xfe\x94\xee\xe0\xf9\xab\xec\x2b\xb1\x91\xd9\xff\xa2\xdb\x0e\x4e\xc5\xda\x96\xe8\x6d\xa5\xd2\x7c\xe7\x68\xc2\x4a\x53\x6f\xcb\x3c\x56\xca\xb9\x81\x24\xe3\x69\x9f\x84\xa6\x97\x2f\xce\x76\xc4\xf4\x61\xf2\x79\xb1\x2d\xd3\x7b\x8e\x6f\xd3\xfc\xab\xde\x82\xfa\x28\x8a\xf8\xab\x94\x9e\x0a\x3d\x74\xa4\x11\x34\xc0\xa4\x7f\x51\xef\x98\xa8\x8f\x6b\x65\xef\x76\xee\x2e\x23\x05\x7f\xe6\xb8\xc8\xd5\x26\x9d\x7f\x4d\xef\x9d\x82\x2f\x9e\x11\xdb\xca\x2c\xb7\x2b\x7d\xb7\xb5\xfe\x1f\xea\xa4\xe1\x9b\x41\x66\x7f\x6d\x3f\x4a\x6e\x34\x0b\xd6\x42\x5d\x77\x64\xcf\xf9\x8d\x29\x1f\xd2\x4d\xa5\xff\x8c\xb5\xcc\x2b\x93\x3a\x2c\x19\x42\x66\xe0\xd8\x42\xba\x1f\x76\x56\x0b\x62\xdf\x42\xc4\x00\x4c\xba\x9a\xa7\xb9\x5e\x99\xb4\xcc\x9d\x16\xec\xda\x55\x13\xcb\xd9\x83\x53\xc7\xc7\x1e\x8c\xc7\x41\xf9\x5f\x7d\x9f\xae\x59\x60\x22\xab\x21\xcb\xe1\x4a\x87\x73\xd0\x49\xc6\x07\xae\x91\xeb\xc6\x2c\xdc\x28\x56\xc5\xda\x60\xe9\x0b\x57\xda\xd8\x97\xd6\x55\xa4\xee\xb6\x7e\xa6\x64\xad\xb1\x53\x59\xcf\xaa\x58\x7f\x31\xba\x2e\xed\x08\xd8\x4f\x12\x0d\x77\x7a\x07\x47\xe7\xb6\xd4\xb0\xd6\x8a\x0a\x45\x3e\x3e\xed\xf4\xf4\x21\x7d\xca\xf5\x65\x5a\xde\x97\x26\x7d\x34\x55\xa4\x4f\x7f\xd4\xe3\x79\x5d\xd8\x7d\x70\xfa\xd3\x4f\x3f\xc6\x4a\xf9\xbc\xe1\xcf\x28\xbd\xd2\x55\xc7\x4b\x29\xed\x17\x38\x2f\xd4\xb3\x62\x40\x1d\x95\xac\xf0\xc2\xe7\xb9\x2b\xd4\x4b\xb9\xe8\x48\x43\x66\x9b\xc5\x7d\x42\x0e\x0b\x59\xc3\xab\x5c\x0d\xaf\xee\x8f\xaf\x6f\x21\x97\xa6\x2f\xc7\xc3\xf3\x64\x32\x25\x29\x88\xf1\x28\x11\x69\x39\xd4\x51\xf0\x03\xd2\x56\xb5\xe0\xf4\x24\x67\xff\x5e\x2c\x87\x85\x0c\x62\x20\x00\xa1\x38\x57\x78\x31\x19\x5f\x45\x9c\x26\x1c\xf3\xf7\x46\x28\xf6\x04\xe3\x1e\xb6\x86\x52\x84\x94\x4c\x84\x07\xaa\xf3\xa4\x37\x1c\x8c\x3e\x4f\x35\x49\x11\xf1\x87\xff\xe7\x7a\x3f\xf1\x0f\x13\xa8\xff\x3c\xfd\xbf\x55\xff\x79\x7a\x72\xfa\xe1\xac\xc9\xff\x71\xf6\xfe\xc3\x87\xdf\xcf\xff\x7f\xc4\x0f\x44\x7f\x65\x31\x4f\x57\x8d\x1a\xd0\x48\x54\x61\x9f\x36\x50\x5a\x67\x27\x27\xa7\xc7\x67\x27\x27\x67\xda\x13\xaf\x5e\x6f\xcb\x6a\x9b\xd5\x6a\x90\xcf\xe3\xa8\x9b\x8e\xe9\x7a\x92\xf4\xae\xec\xf6\xc6\xb0\xeb\xba\x34\xe9\x1a\x94\xdb\x2b\x2d\xc1\x39\x4c\x86\x0f\x78\x28\xa0\x78\x60\x2e\x2a\xbc\x90\x64\xe2\x70\xa4\x0e\x44\x6f\x42\x48\x78\x4a\xce\x34\x77\x74\xd7\xcd\x17\x42\xb6\x1c\xab\x82\x5a\xf2\x3c\x33\x7b\x32\x42\xb4\x65\x1c\x91\x7d\xc8\xc8\x5d\x69\x4f\x33\x0a\xd5\x8b\x20\x24\xd4\xc8\xa1\x9b\x80\x72\x0b\x21\x55\xa2\x15\x1c\x7d\x8a\x87\x3a\x60\x38\x82\x92\x72\x08\xea\x8b\x25\x8a\x77\x96\xc5\x1c\x7c\x83\x41\xae\xcd\x37\x04\x91\xc1\x05\x20\x50\x59\xb8\xb4\xa4\xc3\x53\x85\x39\xb4\x7d\x8a\xbb\x75\x41\xff\x84\x4b\x6e\xe6\xb7\xb5\x51\x3a\xf0\x0e\x0a\x55\x70\x50\xfb\xb4\xee\x52\x3a\x9f\x9b\xaa\x02\xb5\x6d\x66\x38\x93\x27\x29\xb7\xd5\x46\xca\x77\x3b\xef\x9d\x28\xf3\x17\x90\x6d\xc6\x6f\xdb\x11\x11\x41\x66\x4b\x62\x9b\xfc\x93\x86\x2c\x79\x4b\x5a\x24\x52\xe7\xbe\x50\x89\x68\x4e\xed\xa3\x27\xdc\xa0\x7e\xb1\xde\x14\x39\x60\xe4\x96\x80\x84\x30\x73\x5f\x29\x93\xae\x1b\x3a\x32\x8a\x68\xbe\xac\x17\x9a\x7c\xab\x4d\x4e\x09\x34\x47\x91\x4a\x0a\xee\x77\x3b\xfa\x97\x75\x4f\x40\x88\xca\x7f\x9a\x18\xab\xf7\x0e\x39\x4c\x20\x72\x69\xa5\xd5\x03\x71\x73\x0a\x71\x75\xd9\x65\xba\xfa\x67\x74\x91\x2b\xcb\x73\xf5\x28\x8e\x90\x38\xab\xb4\xc9\x57\x69\x79\x2f\x84\x8b\x89\x67\x13\xaa\x8c\x1f\x4d\xb9\x2b\x72\xbb\xe6\x6e\x5e\x58\x11\xe4\x75\x23\x7c\xf8\xbc\x21\xc6\xdc\x7a\xaf\xf9\x96\xce\x6b\x74\xdb\x91\xe0\x1b\x13\x6f\x1d\x12\xa3\x2d\x02\x4f\x22\xb9\x74\x25\x8b\xa4\xe6\x4e\xf3\x85\xd3\xad\xd3\xfb\xfb\xd2\xdc\x43\xf6\xbc\x55\xc6\x0a\x65\x3c\xc8\xeb\x66\xe7\xc1\xdd\xf7\x82\xdb\x09\xea\x6d\x80\x41\x64\x31\x16\x76\x62\x1d\x11\x7e\xba\xe3\xba\x8b\x94\xab\xb7\x94\x03\x84\x2f\x8d\xc1\x22\xb2\x9b\x6a\x5f\xdf\x99\xb4\x95\x40\xc6\x42\x5a\xd8\x23\x84\x42\x99\x13\xc4\xe0\x4a\x8a\x56\xeb\x93\xfa\xa7\x23\x78\xc6\x5a\x0a\xef\xd4\x23\x25\xe5\xce\x49\x20\xeb\xa7\x87\xb4\xae\x0a\x30\x6b\x2a\x77\x70\x1b\xff\x04\x04\x56\xa2\xcf\x1f\xca\xeb\x22\x44\xed\xd1\xd5\xc0\xca\x6e\x29\xd7\xad\x45\x61\xaa\xfc\x4d\x0d\xc1\x9b\x17\x85\x28\x4a\x4d\x25\x53\xdc\x20\x94\xca\xd3\x1e\x13\x8d\x05\x44\x7d\x84\x2e\x8a\x0d\x41\xab\xb7\x3d\x80\xbf\x65\xc0\x42\xf2\x26\x5c\xac\x5f\x4d\xcb\x58\x10\x3e\xcd\xb7\x42\x89\xed\xeb\x37\x5b\xa7\xed\x79\xc1\x66\x46\x8a\x2b\x54\x3b\xb4\xd7\x35\x68\x1d\xae\x08\x2b\x4c\xea\x49\xab\x95\x1c\x0e\x4c\x9b\xc3\xae\xc1\x34\x7c\xd7\xd8\x60\x91\x49\xbf\x21\x84\xed\x17\x41\x51\x6a\xa7\x84\x5d\xa0\x08\x85\x9f\xf7\x6e\x69\x6c\x25\x6f\x2e\x48\xce\xaf\x24\x36\x78\x03\x05\xab\xaf\x34\x0d\x76\x81\xa2\x79\xa0\xf6\xb1\xc1\x69\x4c\x40\x67\xc7\xa0\xb9\x0d\x93\x19\x05\x92\x5a\x3a\x2f\xd6\x60\xe5\x6c\xa7\x29\x02\x23\xa9\x33\x6c\x71\x51\x41\xa5\x4b\xa0\x06\xd3\xba\xee\x51\x82\xfe\xe0\xd9\x0f\xea\x2c\x7f\x2c\x56\x8f\x42\xe8\x11\xc8\x72\x71\xf3\x5f\x39\xcd\xfe\x85\x01\x0d\x5d\xbc\xbf\x37\xc7\xe6\x1b\x5e\x7e\xb4\x38\xbe\xaa\x88\x00\xde\xfe\xbf\x8b\xd2\x31\x95\xd6\xe6\x9b\x23\xc8\xea\x9a\xf3\x79\xac\x7b\xa0\x77\x2d\xef\x88\x3b\x00\x62\x6e\xb3\x37\xc0\xc0\x91\xe6\x5a\x72\xc2\x9a\x89\x24\x08\xd3\x18\xe3\x79\xe3\xa1\x00\xa0\xe1\x22\x45\xc8\xbc\xe2\x5b\xdb\x38\x78\x4a\xe9\x8a\xab\xa9\x3b\x6b\x82\xf6\xee\x1d\x9e\x7d\x7f\xf8\x77\xdb\x86\x0e\xbd\xbb\x50\xf2\xc8\x5d\x04\xe2\x56\x99\x38\x56\x79\x3a\x57\xfc\x7d\x80\xf5\x91\xf6\xb2\xc8\x87\x74\xea\xca\x59\x15\xcf\x52\x2f\xc6\x5a\xa9\x00\x99\x47\x1d\x9f\xa7\x9b\x74\x4e\xbb\xcd\x7d\x1f\x5d\x25\x1e\x96\x6e\xc2\xfc\x9d\x7e\xcc\xca\x7a\xdb\xf6\x5b\x5f\xb9\x15\xb7\x15\xed\x43\x96\x23\xe8\xd0\x5e\xf3\x16\x72\xdf\x48\xfb\x1a\x76\xef\x5c\x87\xfc\x15\x44\x07\x08\x0c\x68\x55\xf3\x4f\x7c\x05\xb2\xa0\xab\x11\xff\xb7\x18\xfd\xdb\x90\x00\x0e\x60\x83\x38\xfc\xfa\xae\xa8\x1f\x78\x37\x48\xdb\x41\x2a\x7a\x29\x6e\x97\x65\xb6\x32\x0a\x2c\xe9\x42\x1f\xf4\x2f\x7b\xa3\xcf\xc9\xf4\x20\xa8\x95\x6a\xb2\xa1\x8a\xce\x11\xa9\xb3\xb4\x36\xb4\xb3\xbb\x4e\x0d\x3e\xd1\x85\xb5\xee\x3c\x36\xb0\x71\xd9\xda\xba\x8c\xec\xc5\x3d\x66\xa9\x75\x58\x12\xeb\x4c\x96\x45\x9e\xcd\xbd\xf3\x64\xff\x7c\x65\xec\xa0\x64\xd5\x5a\x73\xb5\xcf\xc5\xec\xda\xae\x98\xcb\xd9\xec\x5a\x2f\x8a\xa7\x7c\x55\xa4\x0b\x34\x01\x23\x8f\x6e\xf6\x8b\x6f\x29\xfd\x44\xb7\x79\x1b\x26\xb7\xd1\x55\x25\x1a\xea\xdc\x4d\x1c\x5d\x04\xfd\x66\x39\xdf\xc9\x83\x6e\x58\xaa\xef\xca\xcc\x2c\x29\x02\xdb\x88\x6b\x73\x25\xac\x35\x4e\x37\x9d\x62\xd6\xf1\xc6\x63\x6e\x5b\x99\x05\x97\xc8\x38\x35\x00\x28\xb0\x7a\x28\x9e\x44\xb1\xa5\xea\x9a\x6e\xa2\xf6\xdf\x6e\xec\x32\xaa\x70\x4b\x7f\x86\x6a\x47\xef\xd7\x10\xdf\x64\x78\x58\xa7\x58\x83\x7f\x8c\x45\xf8\x8d\xf2\x7c\x59\x93\xaf\xc2\x62\x7c\xf4\x60\x9e\xa9\x5a\x2d\x9e\x72\x54\xef\x21\x10\xf8\x0a\xb3\xdc\xb7\xc5\x56\xa1\x85\x8c\x04\x6f\x82\x60\x44\x60\x22\x04\x4e\x58\x7b\x06\x84\x28\x3c\x7b\x50\xc2\x36\x18\x58\x61\x49\xa3\x97\x4c\x69\xac\x14\x2b\xb3\x02\xe3\x92\x52\xa7\xf1\x89\xfe\x8c\xc9\xf0\x5f\x80\x89\x38\x9b\xf3\x4a\xf9\xdf\xfa\xdc\x46\x36\x99\xc3\x99\x73\x65\x6c\x57\xe4\xcf\xec\x4f\xca\x06\xfe\x87\xcc\x6d\x72\x70\xa4\x89\x88\x9a\x9d\x2b\x09\xb0\xc4\x03\x1c\xa9\x22\xd2\x4a\x3f\x99\xd5\x0a\x1c\xfa\x1c\x58\xf2\x81\x1d\x83\xe6\x16\x73\xbc\x10\xbb\x03\xae\x93\xb8\x42\xb0\x28\x22\xcd\x16\xc1\x63\xf1\x81\x87\x07\xbc\x9f\x0f\x8e\x80\x25\x32\x5d\x95\x26\x5d\xec\xc2\x32\x7d\x49\x8c\xef\x64\x9e\x84\xaf\xc9\xe7\xf4\x43\xb1\xb2\x03\xcb\x1d\x2b\xca\x83\x23\x45\x60\x73\x66\xb3\xf0\x3b\x5d\xc4\x17\x29\xec\xcb\xb9\xd1\x87\x58\xbb\x8e\x57\xab\x14\x31\x1e\xb9\x64\xb7\x72\x0b\x16\x99\x1d\x21\x46\xc4\x02\x09\xac\x90\x23\x0e\x97\xc0\x07\xd9\x33\xd7\xca\x6b\x57\x92\xba\x70\x53\xbe\xc4\xae\x28\x4e\x28\x00\x53\xe9\xa9\xee\x22\xd9\x81\xe9\x02\xde\x7a\x84\x03\x02\x58\xeb\xe9\xa1\x70\xf7\x37\xbc\xce\xc9\xa2\xd6\x85\xa2\xd4\xb9\xa3\x33\xb2\xb6\x8d\x97\x6a\x6c\xdf\x74\xa6\x0f\xd0\x30\x3a\x42\x16\xda\x16\x20\xee\x2a\x17\x7e\x28\x1e\xd2\xb6\xd2\xd2\xfd\x73\x8e\x69\x86\x44\xf5\x2b\xc8\x1f\xa5\xa5\xb5\x99\x58\x3f\x77\xcd\xfc\xfb\x37\xbc\xa5\x5c\x91\x13\x85\x76\x4a\xaa\x74\xd1\x12\x04\xd3\xe1\x9e\xd9\x35\x07\xc5\xb2\xa3\x65\xc4\xd3\x0f\x2d\x72\x65\x67\xe0\x0b\xdc\xa7\xb9\xab\xf4\x0b\x9b\xbf\xaf\xc1\x0a\x1b\xec\x77\x07\x96\x8b\x22\xfc\x98\xfe\x1d\xc8\x74\x3e\xd3\x42\xef\x91\xa1\x4d\xe2\x3d\x29\x1d\x39\xe9\x97\xc1\xa6\xcb\x73\x60\x79\x38\x8d\xdf\xda\xa9\x0b\xf3\x26\x20\x68\xd5\xb9\xc4\x32\xc7\x7e\x4e\xcb\x14\xb4\x8d\x7c\xed\x3a\x52\xde\x9f\xc6\xef\xf4\xc1\x8b\x87\x9f\xa7\x63\x5a\xbb\xf3\xd0\xdf\xdf\x61\x04\xc3\xc2\x55\x32\xe4\xf7\x4a\x3e\xfe\x96\xcc\x85\x1d\xc6\xbf\xd5\x31\xa3\x10\x0a\xdc\x95\xd6\xf2\x01\xcb\xc4\x66\x7c\xfa\xb2\x86\x77\x24\xe9\xd2\x7c\xdb\x32\x6f\x14\x14\x66\xae\x32\xcc\xdc\x9d\xc6\xef\xf5\x81\x37\xdd\x72\x9f\x35\x34\x78\xda\x09\x2a\x58\x22\xad\xfc\x94\x02\xa8\x0f\x54\xdf\x63\xb5\x3b\xf4\x1b\xc7\xbd\x29\xe4\xc5\xb5\xb3\xa7\xf1\x07\xed\xec\xb3\xa3\x45\x7a\xce\xb6\x43\xd3\x3f\xea\x83\xd6\x4a\x97\x3d\x70\x6b\xcb\x91\x84\x6c\xb6\x65\xb5\x4d\xf3\x0e\x11\xd8\x0e\x97\x6b\x55\x89\xf2\x48\xbb\xed\x36\xa5\x79\xcc\x8a\xad\xcc\xa9\xf1\x3c\x74\xd0\x7b\x88\x3c\x12\xb4\xf6\x47\xed\x2d\xb5\xa0\x7e\x6a\x19\x74\x0a\x65\x5c\x3b\xf8\xad\xab\x9d\xde\xe6\x74\x52\x34\xf3\x09\xc4\xf7\x44\x27\x50\x70\x60\xbc\x7c\xfc\x9e\xc6\x3f\xe9\x83\x50\xb5\x58\x0c\x62\x40\xd9\xc6\x01\xa4\xef\x7a\x8d\xda\x16\x28\x00\x6b\xa3\x22\x74\x99\xc8\xf7\x06\x7e\x18\xe4\xff\x77\x87\x6b\x55\x17\x65\x7a\x1f\x1c\x49\xed\xe8\xda\x3e\x09\x49\xd9\xf2\x1d\x80\xcc\xf8\x19\xfc\x6d\x18\x62\xa7\x86\xe0\x98\xb1\xba\x8c\x1f\x3f\x8c\x9e\xd6\x7c\x12\x1e\xb2\xa5\x01\x95\x95\x90\x9e\x44\xa7\xab\xda\x94\x21\x97\x98\x62\x11\xab\x94\x7d\xd7\x8e\xa5\x53\xeb\x72\x9b\x03\x1e\xd1\x2f\xf1\xd3\x13\x7d\x80\x27\xaf\x9c\x7e\xf2\x58\x9d\xa0\x32\x28\x56\x08\x05\x89\xd3\xf8\xf4\x54\x1f\xc8\xb3\x82\xbf\x4d\x30\xa8\xf6\xdb\xa1\xfc\x1d\x4c\xf1\x63\xb6\xd8\x02\x23\xf4\x0a\x3c\xfc\xa2\xd4\x76\xe6\x91\x18\xca\xe9\xbf\x44\x7a\x03\x3b\x9b\xeb\xe7\xf3\x63\x59\x31\x87\x39\xc1\x2a\xd6\x3d\xf9\xc8\x37\x95\xda\xfb\xfa\x2c\x97\x6f\x71\x41\x25\x78\x51\xba\x58\x2e\xb3\x39\xf0\xb5\xac\xed\x91\x6b\x4c\xa4\xd7\x40\x87\x1b\xa9\x4c\x48\x9e\xb1\x64\x15\x66\x06\xd2\x7b\x97\xdf\x9c\x17\xe5\xa6\x20\xf8\xc5\xde\x83\x4c\x1d\x8a\x1e\x14\x65\xa3\x4f\x47\xbe\x3c\x99\x8a\x36\x6d\xdb\xe4\x08\xe3\xb0\x9f\xe9\x83\x0e\xf3\x26\xb7\x86\x0d\xeb\x7c\x7d\x4e\xa4\x31\xd8\x80\x7f\x3c\x98\x75\x8a\x37\x3b\xe5\x32\x9d\x1b\x4c\xc8\x33\xf3\x04\xab\x40\xda\x95\x28\x74\xd0\xc8\x4b\x14\x50\x14\xd0\x9b\x73\x82\xe9\x7c\x3b\xa1\x5a\x95\xbd\x76\x68\x1e\x0d\xac\xe6\xea\x2b\xe8\x4e\x03\xd2\xde\xda\x79\x54\x78\xb2\x91\x0c\x70\x5c\xe5\x0b\xbb\x32\x3b\x8e\x5f\xb1\x1b\xdb\xd9\x40\x68\x63\x5d\xb4\x1e\x03\x9f\xf4\x07\x83\x82\x83\x01\x47\xef\xad\x1d\x3d\xf4\x1f\x78\xc8\xb2\xfc\xd1\x54\x52\x2a\xc9\x7c\xdb\x98\x32\xf3\x31\x35\x1f\x84\x9c\x88\x2e\x96\xca\x93\x37\x31\x86\x83\x02\x7b\xa7\x18\xd1\xbc\xa4\x6a\x04\xcd\xf6\x03\xae\xfc\xdc\x2e\x5a\x6a\xdf\x3b\x7d\x00\xfe\x9d\x70\xfa\x16\x66\x05\x0a\x6d\x9d\x0f\xfa\xa1\x9d\xee\xd3\x77\x3b\x85\x5f\xa6\xa5\x49\xea\x8a\xb9\xa9\x21\xe7\x5c\x13\x1c\xb6\x44\x40\x23\xff\x1d\x93\x96\xbc\xb1\xe0\x56\x83\x6f\x73\x54\xb7\x35\xe9\x7c\x3b\x76\xe3\xbd\x3e\xe8\x3a\xf9\x5c\x5b\x5e\x17\xdb\xa8\x57\xc4\x34\x54\xb3\xd9\x0a\x6a\xfc\xfa\x94\xa0\x67\x17\x82\xdc\xed\x5c\xe4\x8b\x2d\xfe\x60\x5b\xec\x82\x66\x69\x0a\x37\xa5\x59\x9a\xb2\xc4\x9b\x9f\x35\x8c\x12\x81\x7e\x02\x2e\x4b\x2e\xbb\x7b\xed\x40\xc9\x0a\x3e\xbb\x78\x99\x52\xd4\x6b\xd8\xd7\x4c\xe2\xb5\x59\x6d\xe9\xd0\xf3\x05\x83\xb8\xc9\xdd\x4e\xd6\x7e\x27\xf3\xfe\xa5\x6d\x0f\x5e\xa7\xa8\xb6\x86\x49\xc8\x56\x5e\xd6\x9b\x76\x8f\x8c\x44\x70\xe6\xb1\xf4\x80\xb0\x48\x3c\x51\x6a\xee\xaf\xfc\xdc\xbd\xe4\xab\x76\xfe\xdd\x36\x5b\x2d\x74\x6a\x77\x28\xec\x67\xba\xff\x56\x7b\xf7\xc9\xbe\xc5\xf5\x51\x1f\xdc\x16\xdb\x03\xfb\x77\xfb\x0f\x11\x85\xc9\xd3\x05\xb8\x6a\xe8\x9a\x19\x03\x32\xc1\xe0\x45\xf0\xeb\x76\x16\x14\xe9\xb3\xc4\xd7\xa0\xde\xb7\xf9\x3e\xef\x7e\xe5\x3b\x7a\x3a\x11\xcb\xd1\x20\xdb\xd9\xad\xc2\xd4\x06\x18\xab\x8c\xaf\x3f\xac\xdd\x2f\x72\x37\x27\x28\x2f\x09\x4a\xf2\xe0\x28\xab\x03\xfa\x0b\xf7\xed\x30\x45\x32\xdd\x4d\xf1\x64\x8f\xa9\x76\x68\x83\x3c\xb9\x29\xa7\x96\xf1\x97\x30\xbc\x10\x9a\xa4\x9e\x05\x0d\x7c\x70\x6c\xb4\x93\x04\xd5\xa8\x75\x05\x87\x5b\xe0\x6a\x44\xac\x85\x5c\x3c\x91\x7c\xa9\x9d\xaf\x65\xb6\xac\x21\xe2\x05\x72\xeb\xc3\xf7\x27\xff\xeb\xc8\xd9\x13\x9a\xce\x62\x5b\x3b\xfb\x58\x3d\xa4\x25\xee\x62\xbc\x33\xc5\x03\x50\x3e\x50\xb4\x09\xf4\x38\x4e\x74\x0f\x82\x15\xd8\xee\xe3\xa5\x9f\x9d\xdb\x3d\x00\x33\xa2\x3b\x09\xa5\xea\x32\xeb\xfb\xed\x38\x5b\x6c\xbf\x52\x65\xf7\xe0\xcc\xd4\x91\x7e\x40\xec\x82\xfd\x35\x40\x12\xcd\x8a\x49\x06\x2b\x00\xa7\x79\x85\x08\x8e\xbc\x81\xb4\x4a\x52\x70\xfa\x2c\x94\x8d\xef\xf1\x62\xce\xf3\x69\xa2\x0d\xcd\x28\x78\x35\x72\x5d\xab\x46\x16\x34\x80\x79\x4a\xb6\x67\x3d\x7b\x30\x95\x71\x1c\x1a\xc4\xdf\x07\xda\x89\xf8\xf1\x55\xfa\xa4\x08\xab\xc7\x0c\x13\xed\x91\x90\x1c\x26\x00\x1a\xc0\x24\x1a\xdf\x61\xe2\x8c\xf9\xd7\xc0\x5d\x9e\xe3\xe1\x81\x2d\x98\xfa\xd9\x68\xa6\xca\x5d\x0a\xd8\xd3\x73\x21\xc9\xe3\x5d\xb1\xcd\xd1\x29\x58\xad\xbc\xa2\x7a\x83\x66\x2c\xd6\x83\x0b\x7d\x3b\xbe\xd1\xe7\x63\xc0\xd6\x41\x19\x2f\xa2\xc5\x18\xec\x86\x84\xe7\xbd\xd1\xb9\x0a\x6b\xce\xa1\xec\x97\x73\x74\xf4\x75\x20\x3b\xbf\x1a\x9f\x0f\x2e\x6e\x23\xdd\x9f\x24\xbd\x59\xa2\xcf\x93\xc9\xe0\xd7\xde\x6c\xf0\x6b\x32\x8d\x82\xba\xd5\x44\x05\x18\x33\xdb\x92\xc1\x4c\x0f\xa6\x7a\x70\x85\x75\xa7\x24\x8e\x61\x9b\x37\x1b\xeb\xfe\xf8\xea\x7a\x78\xfb\x1b\xda\x36\xbb\x4c\x46\xf0\x90\x7e\x6f\xf4\xaa\x56\xaa\xa0\x95\x0d\x24\x9c\x7a\x1b\x9f\x50\xee\xd6\x1f\xcb\xfa\xc2\x06\x3d\xee\x44\xeb\xa6\x66\x6d\x11\xbc\xa9\xf0\xee\xd7\x65\xd6\x02\x7e\x56\xdc\x72\x41\x1a\x58\xe6\x7d\x1b\x49\x61\xe5\x92\xb1\xa2\xbe\x48\x40\x60\x9e\xcb\x09\x47\x8e\xa4\x1a\x8e\x12\xc5\x69\x96\xae\x6f\xd0\xa5\x1d\x09\xc0\xf8\x98\x6f\xcf\x4d\x57\xa3\xa7\x8c\x48\x15\xcc\x5a\x3f\xdb\x81\x3d\xc5\xa4\x97\x48\x3c\xf3\x06\x6f\x27\xa0\x45\xfe\xad\x91\x77\x6e\x7b\xb1\x1d\xd7\x24\x36\x1e\x81\x0b\x9a\xc6\x05\xc9\x9a\xb1\x1a\xf2\x14\x56\x1b\xc7\x8d\xf8\x36\x3e\x63\x0c\x40\x33\xf5\xa1\x0f\x53\x26\x47\x34\xe5\xfa\x35\x89\xa5\xa3\xfd\x91\xda\x62\x41\xd5\x73\x2e\xb6\x66\xc6\x9f\x20\xb4\xd6\x32\xb4\x56\x9c\x63\xee\xba\x7b\x7d\x1b\xbf\x25\x3e\x0f\xa6\xbd\x59\xd2\x0d\xac\x0d\x7a\x9e\x28\x30\x23\x46\xac\x3d\xb7\x03\xbc\x90\x22\x15\x72\xfb\x82\x7d\x5f\xa7\x0b\x4c\x58\xfe\x10\xc4\xca\x76\xe6\x8a\x7d\x41\x61\x51\xaa\xe6\x7d\x2b\x82\x46\x88\x0d\x22\xe4\x1d\x72\x1c\x71\x82\x15\x26\xab\x7c\x55\xb5\x02\x1e\x2d\x70\x9b\x28\x67\xf8\xdb\xdb\xf8\xec\x9d\x30\x0c\xe7\x3b\xbf\x61\xa9\xe2\xaa\x51\xcc\x46\x6e\x72\x58\xc2\xc8\xa5\x56\x52\x27\x49\x79\x14\xcf\xd2\x40\x1c\x53\x45\x4e\x38\x89\x43\x2d\x1b\x31\x33\x7b\x58\xe4\x25\xb3\x59\xbc\x1b\x56\x8b\x35\x33\x11\x57\x0c\xe8\x26\x09\x04\xb1\xf1\x3a\x22\xb7\xaa\xce\xe6\x55\xac\x67\x59\xbd\xb2\x7e\x06\xfb\x03\xd2\x1a\xa8\x67\xef\x90\x58\x2d\x72\xdf\xd5\x2b\x16\x7b\x62\x1d\xbe\xca\xf2\xe0\xae\xeb\x07\x14\x37\x68\x92\x8a\xbf\xdb\x6b\x5c\x83\x63\xf9\xd3\xae\x4b\x2b\x56\x50\x07\x66\xb9\xe2\xda\xe5\x0f\xfa\xce\xac\x8a\xa7\x97\x78\xb0\x5f\xb2\xb3\x2a\xb0\xb3\xba\xcb\xce\xc2\xde\x0b\x14\x19\x9e\xa5\xe6\x6d\xd8\x5b\xfd\x1b\xec\x6d\x47\xb4\xd3\xf6\xa9\xf7\xd9\xdb\x77\x7f\x23\x7b\x6b\x23\x45\x61\x58\xf1\xd6\x04\x0d\x46\x4b\xcf\xa2\x63\x33\x45\x0d\x53\xac\x9e\x35\xc5\x5e\xcc\x8f\x55\xa4\x41\x5a\x73\x9b\x63\x30\x68\x5f\x9b\x56\x98\x67\x4a\x2b\xc5\xc9\xbf\xa6\xa9\x86\x95\x76\xf6\x57\xdb\xc3\x40\xd8\xe4\x37\x99\x1b\x31\x6e\x62\x68\xd4\x5f\x6f\x0b\xb5\xb3\x85\xea\x37\xdb\xc2\x70\x29\x8b\x7b\xf7\x6e\x93\xf8\x3e\x3e\xd1\x09\x6e\x10\xfb\x07\xe1\x12\x19\xdc\xd3\x70\xf5\xcf\xf5\x47\x1d\xaa\xd6\x4e\x16\x5f\x39\x32\x60\xe0\x15\xf3\x58\x9a\x32\x5d\x98\x75\x0a\xd7\x0c\xee\x20\xad\x22\x9e\xb7\x08\x3f\xa0\x2b\x33\x2f\x4d\xcd\xda\x08\xea\x39\x0e\x67\x67\x65\x28\xa5\xd8\xa8\xf1\x35\x5c\x78\xec\xf1\x36\x8a\x0a\x8f\x31\x39\x20\x6a\x93\xf5\xb3\xb5\xc9\x6f\x61\xd7\xbc\x03\x46\x70\x66\x20\x05\x7e\x75\xee\x03\xf3\xce\x5a\xbb\xc8\xb4\xb3\x76\x3f\x4b\x52\x6b\xfb\xbe\xa6\x1f\xb3\x06\xec\x13\x42\x0f\x38\x29\x6f\x7b\xd8\x20\xe0\x58\x4a\x07\xb5\x89\xab\xa2\x6c\x0d\x18\x48\xfb\x3c\x78\xa7\x22\xba\x66\x20\xc9\x5e\x64\x95\x1d\x53\x10\x37\x1f\x51\xf9\xb4\x60\xd6\x74\x8e\xae\x9b\x20\x39\xb2\xaa\x6b\x64\x1f\x4d\xae\x33\x8a\x3c\xf1\x1b\x1e\xad\xe3\xd5\xa4\x3b\x3c\x99\x17\xd7\x10\x24\x65\x36\xa5\xa1\x76\x71\xc0\xe6\x7b\x0f\x63\xe1\x8e\x4d\xca\x42\xf8\x33\x18\xbd\x75\xcf\x37\xeb\x23\xad\x1d\x96\x71\xc1\xde\xf3\x63\xe9\xb6\x0e\x60\xd2\x14\x42\xa3\xbc\x1b\xb0\x72\x37\x2a\xef\xe3\x53\x38\x65\xfc\x42\xf1\xda\x92\x24\x31\x6c\x63\xb8\x06\x1d\x7d\x80\x10\x69\x9e\x61\xaa\x83\x9b\x9e\x26\x23\x2b\x99\xf1\xc5\x9a\x3d\xb7\x5f\xf7\xa5\x7b\xd4\xf7\x92\xd7\x3f\xb3\x6f\x54\x0b\x7f\xab\x03\xfc\xed\xf7\x51\xda\xb7\xa9\xe2\xbb\x28\xed\x9f\x1d\x26\x47\x0e\xad\x5a\xf4\xf6\x76\x42\xfe\x1a\x62\x7b\xd5\x20\xb6\x6f\x23\x6d\x5e\x4d\x6c\xaf\xea\x80\xd8\xbe\xcd\x9e\x23\x88\xed\x01\x84\x27\xd9\xec\xff\xbb\x92\xd9\xd3\xe9\x13\x12\x4a\xb4\xfd\x16\x26\xb4\x47\xf4\xe4\x5f\xc7\x64\xdf\x15\xfe\x7c\x88\x4f\xf0\xd9\x63\x01\x13\xee\xe5\x0b\x3c\x99\x2a\x28\x5b\x00\xc0\xf6\x82\xca\x78\x41\x12\x06\x79\xe3\xd0\x03\x41\xf3\xec\xa6\x4e\xd5\x45\x14\x6e\x3b\x61\x0b\x6d\xa7\x3b\x20\x9e\x72\xd2\xc4\x4e\xcf\x77\xea\x37\xde\xaa\x37\x38\x62\x45\x51\x87\xbf\x6c\xa6\xc4\x18\x5e\xd5\xa0\xa1\x87\x5f\x3b\x3c\x0c\x1e\x33\x0d\x5e\x88\x4e\xa0\x8e\x4f\x99\x47\xae\xce\x40\x82\x51\xd8\xe5\x7e\x17\xeb\x5e\x98\x61\xe3\xd6\xa8\x97\x5b\xc3\xea\xb7\xce\x8f\x7c\x01\x3d\x84\x99\x66\x42\xd8\x05\xbc\x27\x62\xe4\x9d\x64\x53\xc8\x6b\xf4\x11\xce\x53\x25\x03\x01\x99\x30\xf9\x0d\xa0\x3c\x15\x08\xe5\x84\xa0\x3c\xbc\x2b\x79\x76\xff\xd9\xb1\x28\x9e\x72\xe1\x6a\x7e\x1f\x1c\xaf\x9d\x05\x0d\x20\x7a\xaa\x03\xa2\xa7\xf7\x40\xf4\x5a\x73\xe8\xb0\xb6\xf6\x21\x38\x3b\x0a\x26\x8b\x4e\x3c\xc6\x4c\x12\x60\xb2\x2a\x80\x7f\xdc\xc6\xc1\xe9\x22\x03\x48\x33\xdc\x11\xee\x24\xc9\xf7\xb6\x32\x4d\x6f\xc4\x1f\x1e\xe2\xdd\x1e\x0a\x14\x3b\x70\xb0\x97\x8f\xd3\x81\x9c\x81\x03\x3f\xd8\xd0\x1a\x89\x99\xa5\x34\x41\xa3\x47\x7e\x34\x28\xbb\x0d\x1b\x93\x80\xf9\x28\x57\x84\x2e\x59\x01\x95\x6e\x3b\x5e\x84\x39\xc1\x31\x44\x05\x57\x29\xe3\x94\x06\x03\x4f\x37\xfc\xc0\xfa\x57\xcd\x5d\x02\xe0\x02\x8d\x59\x05\x81\x68\xf7\x44\x6d\x7b\xd6\xb8\xa2\x6b\xd2\xd2\xf1\xa6\xbf\xe1\x55\x25\x45\x70\x3e\xc4\xa7\xba\xb7\x1f\x66\x2b\x86\x17\xe7\x9a\xb1\x82\x2d\xc4\x66\xb3\xe2\x29\xea\x2a\x69\xdb\x7f\x03\xdb\xa8\x5f\x69\xd4\xa0\xc9\xf0\x0e\x12\x5e\xe9\xda\x60\xe5\x02\xd7\x62\x85\x01\xa8\x4c\xd6\xf9\x22\x27\xc2\xa6\xef\xaf\xd4\x78\x1e\xd5\xac\x1c\xb0\x0b\xe9\x9e\xba\xb0\xd4\x62\x32\xba\x5f\x11\x4e\x71\xb3\x9f\xce\xda\xd9\x68\x4c\x00\x33\xa5\x36\x14\xc4\xaf\xf6\xc3\x8e\x7f\xcb\x7e\x49\x61\x5e\x45\x7c\x67\x89\xe1\xf2\xaa\xc8\xef\x79\x90\xe8\x25\x8d\x65\x6f\x3f\x57\x6b\x6b\x10\x6b\x5d\x3f\x99\xd5\xa3\x51\x87\xa7\x67\x47\x7a\x5d\xe4\xf5\x43\xe5\x49\x75\x10\xf4\x2e\x27\x05\x0c\x36\x5c\xdb\x64\xf8\x22\x53\xc6\xa2\x4c\xd2\x51\xb7\x02\xa8\xc4\xe4\xd5\xb6\x64\xda\xbb\xd6\xe2\xe0\x81\xc3\x6e\x54\xa2\x1f\x1c\x1a\x40\xab\xdd\xcc\xa8\x3d\x78\xf3\xac\xc2\xbb\x69\x84\xc9\x34\x6f\x42\x63\x59\xd5\x03\xb9\xaf\x7b\xa3\x7c\xc1\x51\xb3\x51\x6d\x89\x12\x58\xe1\x7c\x5c\x64\x50\x9b\x8a\xb4\xb3\x08\x6f\x26\x86\x70\x28\xda\x29\x96\x7a\xb1\xf5\x49\xa9\x56\x25\x8e\x80\xe0\x3d\xf7\x39\xb5\xb7\x62\xe7\x43\x7c\xa6\xcf\x43\xec\x7a\xe0\x37\x88\xbd\x8b\x37\x91\xed\x7a\x89\xd7\x9f\xc3\x90\x35\x42\x00\x00\x66\x8e\x40\x74\xe0\x99\x3a\x05\x54\x82\xe9\x72\xf8\xb1\x40\xc2\x31\xf8\x2e\x9c\xd6\x0a\x6b\x45\x04\xf8\x31\xdb\x3a\xcc\x4d\x34\xca\x32\x60\xe4\x1a\x8e\x92\x2c\xcf\x70\x81\x41\x20\x8f\x56\x45\xaa\xeb\x35\x62\xac\x00\xd1\x47\x03\x46\xac\x8e\x00\x39\x30\xf9\x1c\x4b\xe8\xb0\x9c\x83\x48\xb9\x02\x68\x3f\x2e\x6b\xa7\x01\xc2\x82\xb7\x54\x20\xd2\x75\x52\x6d\xca\x62\x9d\x41\x05\x28\x24\x09\x20\x82\x70\xfb\x23\x9c\x2b\x27\x54\x68\x1d\x72\xbc\x50\x5e\xed\xe4\x9d\xf3\x6a\x17\xb5\x6f\x5e\xc2\x5b\x0f\x49\x7f\x9e\xa7\x6b\xd3\x88\xff\xd8\xc5\x69\xf3\x66\x77\x27\x17\xb3\x1c\xb0\x7b\x5d\x25\x0e\x00\xcb\x23\xf7\x81\xd0\x6b\xe4\xa6\x30\x2e\xb1\xeb\x24\x68\x58\x72\x64\xb6\x67\x4a\xf0\xb0\xb4\x26\xcb\xa9\xf4\x0b\xbe\x43\x45\xf4\x02\x83\x07\x81\x96\x4b\x62\xef\x33\xfb\x81\x41\x50\xeb\xbf\xbe\x00\x0e\xe4\x03\xe8\x04\x7e\xa9\xfe\x0d\x31\x7f\x1f\xe2\xb7\x7a\x20\x9d\xc0\x6b\x76\x02\xaf\xd2\xba\xc6\x5a\xc5\x14\xaa\x18\xca\x85\xbe\x86\x40\xab\x0f\xc1\x29\xf0\xcc\xb8\xea\x2b\x9f\x39\x40\xb7\x41\x4a\x5e\x06\x36\xf0\x4d\xf5\x5c\x1a\xbf\x19\xb5\x39\x02\xec\x76\xb9\xaa\xbe\xdb\x35\x2e\xf2\x3a\x16\xb8\x2b\x6a\xf2\x75\x4b\x9d\x16\x16\x42\x28\x32\x27\xc3\xe4\x73\x6f\x78\x40\xca\xb5\x34\xb3\x04\x83\x45\xea\x7f\xda\xe5\x18\x75\x12\xfa\xc7\xff\x39\xcb\x95\x90\x1d\x5b\x98\x3a\xcd\x56\x3c\x28\xce\x1b\x42\x7e\x47\x3b\x68\xfa\xe9\xc1\xee\x19\x44\xe4\xa4\xf3\xda\x0d\x6b\x71\x67\x4f\x11\x04\x55\x8b\xbc\x0c\x1c\x87\xc2\xf9\x0d\x9c\x62\x71\x64\x57\xae\xed\x32\xf5\x67\x1d\x2e\x1c\x28\x4c\x50\x39\x91\x07\xc7\x75\x68\x34\xf4\x1f\x07\xcd\xee\x20\x60\xc8\xdc\x64\x46\xba\xdc\xfc\x1a\x25\x74\x6b\x80\x19\x02\xe9\x52\xed\x67\x18\x47\x6b\x36\x95\x3e\x64\x64\x38\x4a\x49\x00\xd4\xc0\x33\xa7\xdb\x13\x73\x95\xe5\xf7\x6a\x95\x55\x98\xa1\xc8\xcd\x53\x75\x5f\x16\xdb\x4d\x75\x24\xf8\x42\xf5\x3c\x5d\xcd\xb7\x8e\x9f\x3f\xcb\xc1\xa3\xc2\x30\x46\x48\xc9\x2e\xf6\x58\x0b\xb0\x4d\x10\xff\xdb\xb9\xc8\xcd\x93\x18\xd5\x87\xb4\xd2\x77\xc6\xe4\x34\xe8\xc0\x56\x78\x17\x07\x56\xa8\x77\x3d\x70\x4b\xbe\x71\x75\x4b\x8b\x2d\x0f\x6e\x81\xe8\x66\x60\x6d\x3b\xe6\x81\x59\x87\x07\xbd\xeb\xc1\xc1\x11\xdf\x01\x37\xf7\x8e\xcb\xfa\x8b\xf4\x19\xac\x1c\x70\x68\x1c\x71\x6a\x90\x57\xcf\xd6\x1b\xd2\xb7\x80\x8f\xf6\xae\x07\x51\xe3\x34\xf1\x66\x17\xc8\x3f\x40\xcf\x40\xaa\x44\xf9\x09\x67\x59\x4a\x2a\xc7\x94\x07\xb9\xaf\xd1\xb4\xaf\x89\x44\x32\x1a\xb2\x59\x45\x13\xb9\xfe\x21\x7e\x7b\x98\x1e\x29\xe2\xbd\xb4\x4f\xb8\x33\xab\xcc\x3c\xfa\x34\xc3\xfe\xd8\x47\x93\x31\x2e\x3d\x0b\x03\x57\xc7\xa0\x24\x4d\x58\xf9\x29\xb6\x9b\xcf\xce\x7b\xf9\x3e\xfa\xdd\xbc\xc8\x1f\xcd\xae\x5d\xc0\x24\x2c\xe1\x3b\x9f\xd5\x40\x10\x34\x19\x3f\x8e\xe1\x66\xe6\x5b\x2d\xce\x51\xf6\x9b\x4c\xa3\x86\x03\x8f\x9d\xf0\xbc\xb0\x7e\x04\xe5\x2b\x81\x85\xe1\xbe\xdb\x20\x91\xcf\xd0\x18\x99\xb6\x7b\xa4\x9a\xee\x11\xb8\x73\x8f\x64\x1a\xdc\x79\xd4\x11\x7d\x49\x2e\xdc\xd6\x29\xbd\xa7\x73\x2f\x20\xc0\x91\xcd\x8e\x71\xe3\x47\xca\x3a\xa6\xd6\xf1\x40\x10\xfb\x72\x5f\x27\x21\x0c\x6e\x1e\xb9\xcb\x67\xdc\x87\x26\xfe\x8f\x2d\x25\x0d\x8f\x2c\x9a\x8a\xdc\xc1\x9a\x2e\xf0\x8b\xca\x3a\x1c\x0d\x1d\x30\xe7\x5c\x88\x73\xc2\x39\x95\xa8\x0e\xd0\x5d\xfc\xda\x59\x89\xe1\x26\x35\xed\xa8\xe9\xf4\x93\x05\xb7\x16\x83\x25\x65\x18\xed\xb9\xbf\x29\xb0\xd4\x05\xee\x07\x88\xa3\x82\xca\xdf\xa0\xa6\x54\x68\xec\x05\x41\x9f\x6d\xee\x62\x6b\x58\xfd\xd2\x21\x2f\x22\x05\xa4\xda\xad\xe3\x10\xac\xb0\x7c\xb0\x73\x15\x9d\x81\x4e\x21\x37\xf5\x68\xb7\x0e\x7a\x75\x45\xb9\x53\xf6\x45\x47\x14\x30\xa4\x98\x24\x71\xfc\x70\xab\xec\x2b\x5d\x07\xae\x8a\xe2\x2b\x84\x31\xf8\x2c\x5a\x32\x24\x0e\x2d\x9a\x2d\xc3\x7d\xb1\xde\x48\x65\xc8\x79\x82\x54\x0c\x56\xe4\x46\x1f\x9e\x52\x34\xa8\x24\xc3\x37\xe2\xd2\xb2\x3a\x83\x72\x26\x8a\x2d\x5f\x5f\xb9\x2b\x2f\x89\xf7\x55\xe9\xb2\xf7\xeb\x1c\xd6\x80\xff\x78\xe7\x42\x51\xb3\x50\xad\xdc\x55\xe7\x22\x08\x3e\xd0\x5d\xbc\xab\x82\xfc\x72\xb0\x71\x24\x48\xf8\xf9\xb2\x5f\xae\xff\x54\x85\x35\x09\xc8\x39\x3d\x45\x39\x34\xe8\x5c\xf0\x6d\xf2\x20\x77\x3c\x13\x6c\xa6\x82\xa9\x50\x40\x71\x6d\x1a\x4d\xee\x9a\xa4\x80\x86\xbd\x58\xba\xf0\x83\xde\xbf\x2b\xb6\xea\xce\x0e\x24\x73\x82\x34\x27\xde\x47\x13\xad\x16\x05\x73\x72\xb7\xd3\x9b\x02\xdc\x62\x85\x61\x91\xf3\x27\xac\xfb\xa0\xd1\x7f\x88\xd8\xb9\xd0\xe0\x5c\x44\xb2\x0c\xad\x72\x4b\x9a\x4a\x08\x4d\x7e\x9f\xe5\x86\xc8\x1c\x84\xdf\x71\x67\xa0\x0a\x60\xee\x1c\x8f\x85\xf9\xa6\x81\x6a\xd1\x46\xc1\xef\x75\xcf\x5f\x74\xce\x4c\xb9\xae\xbc\x57\xef\x25\x5e\x21\x77\x47\xda\x56\x0d\xa2\x91\xc8\x31\x8d\x44\xca\xf1\x8c\x74\xd3\x8a\x04\x84\xe8\x0d\xe8\xbe\xb7\xf5\x9d\xc8\x21\xc1\xcf\xc5\xad\x43\x65\x3c\xa0\xd4\x2a\xa8\x4e\xa2\x78\x62\x89\xce\xc8\x29\x55\x3a\xd5\x4e\xd5\x8c\xd6\xda\x77\x6d\xcd\x84\x5d\x56\x23\x49\x4b\x03\x21\xf0\x5b\x3a\x6c\xad\x25\xc9\x6b\x72\xd9\x09\xd0\x19\x45\x7c\x36\xa8\xf0\x32\xa3\xf0\x82\x78\xed\x18\xb3\xad\x90\xc7\x29\x34\x4f\xe1\x82\x40\xfb\xba\x2e\xca\xdc\xec\xec\x64\xc1\x3d\x7f\xc5\x50\x19\x8e\x0b\x49\xfe\xab\x62\x53\xec\x63\xfe\x39\xd5\x90\x28\x0e\x0c\xe6\xdb\xb2\x25\x74\x8e\xc3\xd8\x82\xa6\x08\x65\x28\x3b\x9d\xaf\x1f\x30\x4c\x08\x43\x00\x61\x07\x0b\x96\xe8\x07\xfb\xe8\xe5\x2a\x9b\xd7\x95\xfe\x62\x4f\xa8\x31\x38\xe7\xb4\x46\xaa\x58\x7f\xc1\x8d\x60\xc3\x4d\xbc\x99\xe5\x94\x52\x60\xb1\xee\x76\xca\x73\x68\x00\x13\x5a\x1b\x75\x08\x67\x3b\x41\x0a\x58\xe9\xb0\xd4\x55\xb6\xce\xec\xf1\x35\xcf\xca\xf9\x76\x8d\x60\xc1\x48\x2d\xa1\x52\xbd\x7d\x9f\xc2\x0f\x58\xc9\x54\xae\xb8\x6d\x11\x97\x6e\xa8\xf1\x68\x0d\xca\x43\x91\x17\x76\x70\x19\xc9\x1d\xba\xc0\xb0\x18\x9b\x9e\xbb\x8f\x96\x84\xba\xb2\x43\x49\x0f\x96\xcf\x50\x82\x38\xcd\x00\x0c\xdc\x60\x6c\x1b\x12\xca\xbc\x5b\x82\xbe\xa0\x4d\x4b\x91\x63\xd6\x84\xcb\x60\x89\xbc\xb0\x02\x67\x5e\x9a\xaa\x58\x3d\x22\x89\x83\x7b\x0b\x9c\xdc\x9e\xce\x0c\x84\x4b\x31\x69\xd9\x45\xf1\x84\xbc\x7d\xed\x1a\xf7\x29\x68\xc6\xf8\xb7\x39\xbd\x01\x0a\xae\x29\x07\xd4\x80\x5b\x34\xf3\x35\xb1\x52\x1f\xe3\x13\xe6\x30\x80\x61\x9a\x05\x50\x73\xd7\x39\xa9\xa2\x80\x59\x22\x21\x88\xa0\xe9\x70\x51\x84\xff\xe9\xc2\x28\xba\x47\x82\x9c\x6a\xdb\xff\x72\x21\x9c\x13\x14\x20\x28\x45\xe0\x3f\x75\xdf\x83\x08\x6f\x11\xd5\x11\xe4\xf4\x6e\x2b\xa3\xda\x0c\x6b\x6e\x25\xb2\xb0\x80\x78\x44\x55\x08\xc3\xbf\xad\xc8\xf1\x6a\xfb\xb4\x9d\x4b\x3f\xb8\x90\xea\x6e\xae\xe8\xa2\xac\x5c\xd2\x6d\x69\x03\x0f\xe2\xde\xab\x6d\xc0\xab\x35\xd4\xde\x69\x8f\x2f\x57\x25\x74\x54\xc9\xd8\x45\x70\xda\x70\xc6\x8b\x12\x85\x41\xb4\x43\xc2\xed\xb9\x28\x8a\x44\xbe\x77\x9d\xee\xd4\x82\x4e\xa4\x8c\x74\x2b\x29\xe7\x69\x7f\x53\x07\xaa\x40\x30\xfa\x4c\x2e\x49\x1c\x15\x6d\x1c\x49\x17\x00\xd1\x99\x86\xd2\x80\x53\x07\x76\xc1\x59\x14\xa2\x59\x76\xee\x39\xec\x3c\x20\x47\x5e\xed\x14\x1b\xb2\x46\x69\x76\xe4\x2e\x42\xba\x8e\xbd\xe0\xf9\x5c\x0e\xac\x70\xce\x31\xcb\xd4\x14\x95\xf6\x46\x28\xb7\x0d\xca\xd3\xb5\xab\x79\x5c\x35\x97\xac\x8d\x20\x38\xbd\xee\x10\x4f\x4d\x28\x59\x5b\x31\xc2\x39\x64\xf0\xd4\xa0\x78\x4d\x35\x7a\x87\x7e\xbe\x93\x93\x83\x2b\x41\x97\x62\xf6\x51\xe0\x66\x5b\x02\xf5\x8d\x28\x1c\xb4\x36\x30\x5d\xfc\x79\x5b\xb9\x7c\x3b\x85\x1f\x98\x51\x40\x5f\xb5\x58\x72\xa7\xec\x09\xeb\x5c\x27\xb1\x05\x21\x01\xae\x98\x72\xc7\x21\xa0\x70\x49\xef\xa7\x56\xc1\x83\x07\x24\x56\xed\xe7\xae\x87\xb1\x52\x3f\xc6\x27\xfa\x9c\xe0\x37\x58\xc7\xfe\x85\x8e\xd6\x98\x4b\x34\xce\xbb\x59\xa3\x41\x9b\x2c\xa8\xe5\x50\x20\xc4\xf6\x82\x42\xe2\xed\x73\x8a\x88\x92\x5b\x5a\xbd\x20\x89\x28\x98\xa5\x67\x97\xbd\x19\x14\x82\x74\xb6\xf8\x62\x92\x24\x6a\x7c\xa1\xcf\x93\x8b\xa4\x3f\x9b\x4a\x4d\xc4\x61\x12\xe9\x8b\xc1\x6c\x2f\xfd\xb4\x6d\x8f\xa0\x9d\x1e\x8c\x3e\xc7\xea\xe2\x66\x02\x4d\xb6\xff\x03\xcf\x17\x6a\x93\xfa\xaa\x77\x8e\x64\xd5\xbd\xe1\xd0\x69\x3b\x8a\x96\xda\x26\x39\x4e\xee\x73\xf5\x4c\xc3\xaf\x92\x64\x46\x42\x8f\xf0\x98\x29\xd5\xd6\x8c\x6e\xf5\x79\x32\xed\x4f\x06\xd7\x2c\x2d\x77\x9d\x4c\x2e\xc6\x93\xab\xde\xa8\x9f\xa8\xf1\x44\x8f\xaf\x93\x09\x0d\xd1\xb4\x37\x38\x87\xef\xf7\x66\xac\x13\x67\xdb\x36\xbd\x19\x38\x3d\xc8\x4f\xc9\x60\xf4\x59\xdf\x8e\x6f\x26\x7a\x92\x4c\xaf\xc7\x23\x56\x94\x8b\x89\xe1\x07\xab\x6d\xa0\xc1\x53\x29\x43\x79\x1b\xb9\xfe\x8d\xdd\xfc\x25\xe7\x11\x4e\x86\xfd\xa0\xd0\x13\x7c\x33\x55\xc9\x9f\x66\xc9\x68\x0a\x25\x40\xb6\x6b\xf0\x89\xe9\xac\x37\x3a\xef\x4d\x40\xd0\x2e\x6c\xa6\x7d\xeb\xde\x5e\xc6\x50\x9a\x94\x8c\x66\x83\x49\xa2\x27\x83\xe9\x1f\x75\x6f\xca\x7c\xe3\xff\x7a\xd3\x73\xfd\x14\x5f\x61\xc9\xbc\xd6\x38\xab\x01\x0d\xec\xed\xf8\x26\xd6\xd3\xcb\xf1\xcd\xf0\xbc\x63\x36\xec\xaa\x4f\x68\x05\x0d\x7e\x4d\x48\xfb\x0f\x86\x0c\xb4\x0f\x6f\xc7\x37\xea\x10\x49\xca\xe5\x84\xda\xe9\x40\x32\x71\x64\x10\x17\x43\x72\xa4\x7b\xd3\xe9\xcd\x55\x42\x94\xe5\xd3\x19\xef\x8b\x51\xd2\x4f\xa6\xd3\xde\xe4\x56\x4d\x93\xc9\xaf\x83\x3e\x6c\x80\x49\x72\xdd\x1b\x4c\x70\x39\x4c\x26\x48\x1b\x1e\xbb\x2d\xc8\xa5\x56\x61\x6d\xd5\x78\xa2\xbf\x0c\x86\x43\xdb\x24\x35\xbd\xb9\xbe\x1e\x4f\x66\xf8\x67\xd7\x2b\xdb\xe0\xc1\x94\x1e\x33\x1a\xeb\xf1\xa7\xe1\xe0\x33\xac\x1d\x3b\x9c\x83\xe9\xf4\x26\xd1\x37\xd7\xe7\xbd\x59\x42\xe3\x3b\x98\x2a\x5f\x11\xe6\xde\x72\xd9\x83\x4d\xf0\xc7\xd1\xf8\xcb\x30\x39\xff\x0c\x83\x9d\xc0\x22\xd1\xfd\xf1\x39\x6c\xa2\x5f\x07\x93\x9b\xa9\x93\xa3\xe4\x67\x44\xea\xd3\xcd\x4c\x9f\x8f\x93\x29\x8c\x1b\xad\x2c\xbf\x9d\x9b\xbb\x18\x68\xd4\x51\xe7\x30\x99\x4c\xc6\xc8\xec\x0e\x8f\x4e\xa6\x76\x51\x0c\xa6\x0d\xa1\x4c\xb7\x2f\xfb\xe3\xd1\x74\x36\x98\xdd\xd8\x9e\xf4\x46\xda\x2e\x55\xd4\xa0\xb4\x7b\xbe\x59\x93\x16\xab\xd1\x18\xa9\xd7\x2f\xba\x2d\x4a\xef\x66\x76\x39\x9e\x0c\xfe\x4d\xaa\x34\x6a\x52\xe2\x14\x66\xd1\xb7\x25\x56\xea\xa7\xf8\x44\x0f\x1d\x1a\x0b\xcf\x23\x97\xf5\x71\x33\xd0\x1f\x4c\xfa\x37\x57\x76\x5f\xf4\xa1\xa5\xe7\xfe\x4f\x98\x95\x46\x91\xcb\x48\x31\x01\xfd\x7e\xd5\xca\xa3\x48\x50\xd3\x07\xac\xf4\xda\x73\xe5\xf3\x1c\x46\xaa\xb1\x63\x23\xed\x74\x3e\xa7\xfc\xbb\xce\xf1\x70\x1f\xb4\x4b\x6c\x38\x48\x26\x8a\xd6\x31\x2b\x52\x82\x55\x4d\xa6\x91\x67\xd8\xb7\x6b\xc9\x7e\xe2\x3a\x99\x4c\xc7\x23\xa7\x28\xea\x95\x44\x59\x3d\x54\x09\x49\xd1\xfd\xf2\xa1\xf4\xbe\xfe\x65\xcf\xf6\x15\x48\xf9\x9f\x3b\x38\x14\x7f\xcf\xbe\x77\x38\x9e\xc2\x03\x3e\x8f\xc7\xe7\x76\xb3\x44\xfa\xcb\x78\xf2\x47\x3d\x9d\x8d\xaf\xaf\x7b\x9f\x93\x08\xcc\xd2\x8d\x7d\xe8\x45\x6f\x30\xbc\x41\x66\xfe\xab\xde\xf0\xe2\x66\xd4\xc7\xa7\x51\xe3\xd9\xe6\xf3\x3e\xbf\xb2\x87\x4c\xd0\x4a\x7c\x99\x1d\x08\x96\xf3\x74\xc3\x73\x8b\x33\xa2\x40\x6e\xf5\x53\x62\xff\x3a\xb2\x96\xeb\x75\x52\x9f\xbc\x76\xb9\x87\x7a\x7c\xa1\xbc\x5e\x2b\xce\x35\x54\x8f\x5e\x5f\x0f\x6f\xed\xd8\x87\x62\xae\xe7\x49\x6f\x76\x69\x9b\x87\xd3\xd1\x1b\xea\xc1\xe8\x0f\x37\x13\x30\x6e\x37\xc3\xd9\x60\xf4\x59\xf9\x6d\x07\xad\x7d\x33\x95\xe2\xa8\x64\x78\xc1\xbe\xe3\x4b\x06\x7d\x98\xe5\x61\xef\x8b\xb5\x9b\xe0\x0e\x4d\xf1\xeb\xbe\x91\xb1\x9a\x8e\xaf\x12\xfd\x87\x9b\xc9\x60\x7a\x3e\xe8\x63\x6d\x28\x97\xb9\x0e\x87\xe3\x2f\xf4\xd0\xfe\xf0\x66\x0a\x7d\x9a\x84\x3d\x14\x6a\xb3\x6a\xdf\xca\x88\xf4\x14\x8d\x96\x78\x8e\x9d\x27\xf1\xa0\xab\xde\x6d\x30\x36\xca\x1e\x03\x4a\x9d\x9e\xc4\x27\xfa\x32\xbb\x7f\xd0\x93\xac\xfa\xaa\x7b\xf3\x3a\x7b\x84\xda\xae\x78\xbf\x9b\x61\x1f\x73\xd1\xbb\x19\xce\x8e\x67\xe3\x61\x02\x86\xac\x37\x3a\x57\xf4\x97\xf3\x64\x3a\xf8\x3c\xb2\xe7\xe3\x55\x6f\x74\x73\xd1\xeb\xcf\x6e\x26\xf6\xbf\x40\x0b\x62\x96\x8c\xac\x47\x65\x67\xa3\x4b\x3e\xb6\x37\xd5\xe3\xd1\xf1\x70\x30\x4a\x50\xa3\x77\x3c\xd4\xc9\xbf\xde\x0c\xae\xaf\xec\x80\x0f\x46\xfa\xb2\xf7\x6f\xbd\xc9\xf9\xf8\x66\xaa\x93\xd1\xaf\x83\xc9\x78\x64\xff\x30\xd5\x13\xfb\xa1\x09\xa8\x4f\xf4\x06\xc3\xe3\x69\xef\x22\x91\x47\x62\xa4\x60\x4a\x7a\x4e\x4f\xc2\x39\x0e\x76\x78\x47\x37\xfd\x61\xd2\xb3\xcb\xbe\x6f\x97\x0a\x6c\xe0\xde\x60\xd2\x9f\xf4\x2e\x66\x7a\xd4\xfb\x95\xcf\x09\x74\x50\xae\x6e\x46\x83\x3e\xfc\x62\xaa\xa6\xb7\xd3\x59\x72\x85\x1f\xd7\xb3\x49\xef\xe2\x62\xd0\xd7\xd4\xee\x88\x64\x83\xf5\x70\x70\x91\x68\x3e\x94\xae\x7a\xfd\xcb\xc1\x88\x0a\x90\xbf\x24\x3d\xeb\x85\x68\x7e\x8c\x1a\x8c\xf4\x97\xcb\x41\x1f\x05\x32\xdc\x2e\xdc\x73\x9c\xeb\x3e\x1e\xe0\x49\xef\x9c\x5e\x85\x4b\x1e\x16\x79\xa4\x1a\x4b\x1c\x5e\x38\x4d\x7e\xb5\x8e\xdc\xf5\xe5\xed\x74\xd0\xef\x0d\xc1\x9b\xf1\xc3\xe8\x56\x93\x3e\x3c\xb8\x1c\x7c\xbe\x24\x7f\xc3\x7a\x01\x30\x2a\x07\x47\xc2\x51\xb2\x8b\x2b\x54\x51\xb6\x86\xec\xc2\x3e\x76\x78\xeb\x8e\x03\xb0\x17\x6d\x87\xd7\x4b\x96\x8f\x2f\x02\x8d\xee\xae\xd7\xda\x35\x7a\x1a\x9f\xe8\x49\x88\xc5\xb6\xb1\x06\xa3\x11\x7a\x36\xfe\xaf\x9f\x8c\x09\x4b\xfb\x1a\x94\xbd\x26\x9d\x3f\x70\x2d\x71\xd5\xd2\xf7\x16\x0a\xef\x4e\xa2\xbd\x04\x34\xfc\x5e\xcc\x8b\x2a\xb6\x90\x5e\xc9\xea\x4a\x6f\xeb\x6c\xe5\x78\xea\xba\x14\xbb\x3d\x13\x96\x0d\x79\x5d\x51\xe5\x6a\xb5\x73\x35\x01\x95\x92\x52\xf9\x9e\x40\x26\x2c\x15\x68\xe6\x61\x30\xed\xb2\x49\xcb\xf4\xbe\x4c\x37\x0f\xc0\x53\x5e\x40\x9e\x9d\x58\xe6\xe6\x45\xfe\x67\xaa\xd2\x64\xb9\xd2\x45\xa3\x7e\xcc\x3e\x50\x84\x46\x63\x17\x1a\x65\x18\xc8\x31\xee\xec\xc7\x88\xde\xed\x0e\xf7\xf1\x52\x9f\xd3\x70\x79\xa8\x81\xfe\x49\x00\xa2\xfc\x63\x89\x59\x19\x42\x56\x3b\xe4\x5d\x56\x47\x3e\xe5\xf4\x04\xe1\x8e\xcd\x54\x06\xa4\x7a\xdd\x73\x91\xf5\xb2\x6b\xe4\x0c\x02\x8a\x78\x3a\x45\x6c\x4f\x59\x29\x08\x6e\x19\xb2\x88\x08\x6c\x97\x41\x06\x8a\x1c\x81\x24\xeb\x58\x52\x8d\x72\x02\xe2\xc0\x0e\xea\x1e\xb0\x28\xd0\x46\xbb\x08\xc6\xc5\x9a\xc0\xae\x6c\x5d\x77\xb2\xd1\x93\x06\xbb\x02\xae\x1f\x23\x1e\x5e\x3b\x3e\x5c\x84\x84\xa5\x32\x81\xc4\x87\x8d\x81\xc3\x72\x36\x4a\x59\x92\xd6\xb0\x42\xfa\x34\x4e\x03\x42\x2c\xce\x6e\x9a\x52\xa7\x67\xf1\x09\xdc\x69\x90\x08\x70\x1c\xa4\xf7\x1c\x20\xbd\x01\xcc\x71\x00\x5f\xcc\x2a\x3a\xf2\x68\x95\xad\x01\x3c\x58\x9b\x55\x83\x21\x9f\xef\x48\x45\x7a\xb8\x1b\xbf\xa2\x4f\xdf\xc6\x1f\x74\x51\x42\xf5\x47\xa0\x4f\xef\x2a\xab\x2a\x89\x56\xc6\x4c\x38\x24\x56\x90\x64\xca\x36\xd9\xd1\x85\xe2\xd6\x23\x15\xdf\x8c\xaf\x6f\x7d\x95\x5c\xa4\xdf\x71\x49\xe2\x07\xb8\x3a\xda\x94\xd0\x5e\x4c\x3c\xb4\x85\xbe\xa1\xbe\x8f\x59\x88\xf8\x31\xee\x7e\x82\x2e\x63\xc5\x18\xd8\xe5\xeb\xc5\x67\x77\x4d\xb6\x34\x25\xc0\x5a\xa7\x67\xf1\xa9\xee\x31\x29\xb7\x9c\x13\x7d\xb3\x29\x72\xfd\xa9\xb4\x96\xad\x63\x7e\xda\xc0\x29\xb5\x6f\x7e\x1a\xa4\xdf\x19\x26\xf4\x96\x80\x5f\x02\xc5\x34\xa7\x75\xec\xd3\x86\xb4\xe4\x80\x56\x98\x3f\xe8\x14\x8c\xef\xa0\x51\x7c\x4b\x58\x3f\x64\xd6\xec\x1e\xbe\x3d\x39\xd2\x8b\x74\x57\xe1\x2d\x42\x53\xb6\xd8\x3e\xfa\x8e\x3a\xd3\x5b\xad\x44\xbd\xc0\x33\x04\xe6\x0e\x24\xc3\x12\x0a\x4e\xa2\x05\x17\x3f\xa9\xfa\x6a\x46\xcc\xf3\xd0\xb5\xe4\x42\xae\x7d\xd1\x36\xc2\x5c\x00\x64\x66\xb2\xd2\x09\xe1\x50\xe2\x10\xd0\xce\x59\xce\xa2\x35\x77\x66\x57\xd0\x60\x3f\xf3\xfc\x48\x05\xcd\xc1\x69\x3d\x6b\x4f\x26\xd2\xd2\xd3\x03\xae\x11\x10\x34\x10\x55\x5e\x0e\xf9\x80\xf7\xdf\xb5\x91\x4a\xd7\x58\x83\x65\xbf\x0f\x3c\xba\x84\x27\x92\x45\x62\x04\x54\x13\x3a\xdf\x0b\x33\x5f\xa5\x65\x5a\x17\xe5\x4e\xff\x79\xbb\xb8\x47\x6c\x37\xae\xdf\x23\xc5\x64\xf8\xc1\xbd\x5f\x70\x5b\x75\xb8\xa7\x96\xd3\xf1\xe8\x03\xc8\xcd\x9a\x56\x00\x2d\xe0\xf5\x58\xce\x37\x64\x70\x10\x13\xab\x56\x5d\xb0\x15\x4b\x2b\x60\x67\xdb\x14\xc0\xb6\x77\xd0\x10\x2e\xef\x48\xa7\x77\x1f\xd0\x42\x86\xdc\xd3\xfc\x0b\x6d\xf8\xd0\x86\x29\xa1\x1f\x4d\xa2\xe4\xdc\x82\xb0\x92\x4a\x94\xd2\x16\xa5\x7e\xd7\xb2\xd9\x30\xd1\xca\x6f\xad\x4d\x59\x70\xf5\x23\x2b\x18\x55\xd9\x37\xbb\x1d\x3e\xf0\x76\x20\x8c\x0d\x18\x2b\xf1\x5a\x09\xae\x51\xd7\xa0\xfd\x7d\x70\xa4\xb7\xf9\xca\x54\x95\xdf\x5a\x69\xcd\xa9\x55\xfc\x08\x96\x76\x92\xea\x0b\x1c\x67\x59\xee\x84\x0d\x0f\xb3\x23\x55\x17\x7a\x93\xee\xe4\x8b\x52\xbd\xde\xd6\x5b\x24\x87\xb5\xdf\x00\xcb\x2a\xae\xc1\xa9\x96\xc8\xb3\x06\x6f\xd2\xaa\xb6\xb6\x98\xf9\xc4\xf7\xf1\x6a\x40\x35\x41\x7b\x40\x91\x4d\x2a\xcb\x8e\xa0\x17\x8b\x32\x7d\x52\x94\xe1\x76\xfc\x7b\xb8\x50\xc1\xe4\x50\xf5\x68\xf7\xe5\x04\x2f\xb3\xc6\x1b\x62\x35\x58\xf2\x10\x01\x1d\x42\x38\x44\x81\xaa\x3a\xf7\xce\xae\x07\x56\xab\x01\x77\x82\x0a\x2b\x99\x67\x2a\x1c\xa3\x05\x4e\xa5\x18\x5b\x72\xa4\xb8\x3a\x8b\x60\xfd\xcd\x3e\x29\xba\x5b\xe0\x9e\xe7\x51\x37\xc2\xd5\xef\xb9\x7d\xab\x2f\xcd\x17\xea\xdd\x3e\xb9\x06\xbe\xc6\x33\xdf\x36\x99\x4f\xd9\xb7\x87\x02\x2d\xd1\x5b\x3d\xf1\xe3\xf1\x6b\xba\xc2\x8b\xde\xf0\x42\x8f\x0c\x4f\x4a\xc2\x19\x5d\xe6\x85\xae\xbb\x79\x4e\xe4\x0a\xeb\xdc\xc1\xfa\x85\x1d\xac\xba\x76\xb0\xac\x5f\x70\x7c\x03\x74\x5f\xba\xf0\x78\xa6\xbb\x9d\x16\xbc\xd8\x95\xa9\x6b\xc4\x4a\x1e\xa9\x4d\x99\x79\xf8\x17\xd9\x51\x1a\x9f\x2e\x93\xe9\x27\x90\x6c\x07\x16\x37\xf1\x70\xa9\x47\x1e\xae\xce\x22\x4c\xbb\xf8\xed\xa0\x8b\xb1\xe8\x9a\x48\xfd\x8e\xec\xc6\x9d\x01\x10\xad\x5d\x58\x48\x67\x56\x6c\xa1\x41\x7a\x61\x70\x6e\x5d\xf9\xc2\x1a\xfe\x52\x94\xda\x35\x00\xc7\x88\xe4\x96\x4a\xe5\x0b\xbe\x4f\xcf\xe2\x77\x7a\x54\xe8\x89\xa9\xcb\x22\xc5\x42\xec\xc4\x69\xae\x05\x5e\xde\xa0\xe9\x9c\x89\x13\x4a\x50\x28\xb1\x53\x66\xed\xa7\xc9\x17\x08\x0d\x73\xbc\x1c\xcc\x00\x56\xc9\x93\x46\x9e\xe5\xce\x6d\x2e\x4a\x84\x75\x96\xa6\x32\xab\x95\x29\x59\x05\x0c\xd0\x9d\x70\xa9\xfb\x98\xae\xb2\x85\x90\x1b\x27\x00\x08\x61\x36\xc4\x83\xbc\xf3\x29\x66\x58\xb4\x3e\xf4\x07\xc4\x5f\x10\x06\x7a\xfa\x36\x3e\xd1\x57\x59\x35\x37\xab\x55\x9a\x9b\x62\x0b\x2c\x83\xc0\x05\x15\x4f\x63\xfd\x19\xea\x52\x61\x68\x93\x7c\xa1\x6f\x2a\x53\x56\x32\x3c\x69\xa8\x84\xa5\xfa\x40\x90\xbc\x66\xb5\x59\x47\x07\x6a\x1f\x2d\x53\x96\xeb\x77\x3f\xea\x7e\x7c\x11\x4f\x62\x7d\x16\x9f\x9e\x9c\xea\xc3\xf1\xbc\x8e\xf5\xe9\x4f\x3f\xbd\x3f\x8a\x38\x5e\x00\xae\xf2\xa5\x7c\xb0\x72\x44\x9a\x95\x63\xd9\xb4\xa3\x29\xdf\xdd\xfa\x48\x08\x4f\x8d\x80\x91\xdc\x6e\x1a\xe5\x09\xb1\x39\x74\xf4\xad\xb2\xde\xca\xe9\x99\x3e\x9c\x9a\x0d\xb7\x0b\x40\xd2\x41\x1c\xe3\x3e\xae\xe8\xe3\xb0\xb0\x7d\xcf\xce\x3e\xc6\x1f\xcf\x4e\xce\x8e\x4f\x75\xfd\x00\xe5\xed\xfe\x57\xef\xf4\xe1\x1f\xb6\xb9\xe1\x1e\xdb\x99\x6a\x0c\xbb\x72\xc3\xee\xa0\x6e\xed\x91\x87\x66\xc0\x25\x32\x7a\xe2\x64\x55\x9b\x94\x02\x38\xb3\x67\x7a\x62\x90\xee\x92\x2b\x35\xae\xd1\x74\x37\x7c\x69\x70\x95\xad\xc9\xbe\x43\x2d\xad\xba\xdc\xa2\x76\x1d\x22\x93\xf3\x7b\x05\x0a\x6a\x26\x9f\xef\x22\xb0\xfe\x54\xfb\x11\xe9\x3f\x17\x19\x5c\xe5\xe7\xe8\x40\xd2\x9a\x0d\x8b\x02\x3b\x04\x6b\x28\x97\x61\x3f\xbe\x2e\xf0\xf6\xd7\xb3\xb2\x45\x1d\xd8\x2b\x1f\x68\xb8\xb6\x3a\xd0\x36\xab\xda\x21\xad\x63\x29\xb8\x1e\x1d\xfd\x43\xf4\x6a\xe1\x1e\x1c\xb8\xb7\x7a\x20\xc8\x90\xcf\x3d\x6b\xfc\x7e\x62\x15\x68\x57\xb6\xde\xa4\x59\x29\x68\xe0\x94\x03\x25\xd0\x94\x46\xfe\x92\x9b\xc8\xe8\xa1\x6c\x98\x29\x29\x23\x60\xe8\x30\xe8\x3f\xc8\x4a\x7e\x33\x7f\xc8\x8b\x55\x71\x0f\xca\x72\x84\x3e\xa2\xcd\x46\xa5\xc9\xbe\x7a\x53\x80\x92\x1c\x7b\x95\x4e\xab\xb0\xa3\xb0\x6d\x4c\x8d\xca\x04\x51\x57\x05\x39\xe2\xe8\xb8\x91\x9e\xb8\xa8\xab\x81\x38\x6c\xef\x60\xc3\xd8\x21\x9b\x15\x14\xb5\xd9\xf1\xd2\x5f\xd2\xec\xd1\x94\xb1\xbe\x48\xb3\xd5\x16\xeb\x8b\xf7\x39\xd5\x40\xa6\x03\xb1\xa7\x22\x69\x10\x8c\x59\x3a\x6a\x8e\xfd\x9a\xa5\xe0\x3f\xd5\x4f\xf0\x22\xfb\x59\xf2\xdb\xe8\x59\x4c\x1f\x81\x22\xd3\x72\x91\xba\x17\x60\x0f\xde\xeb\x29\xe8\xfd\xf1\x65\xce\x2c\x2c\x6d\xa7\x15\xc7\xc4\xf1\xeb\x0d\x96\x32\x39\x3e\x48\x90\xda\x2c\x73\x66\x98\x60\xc6\xaa\x35\x54\x1b\x69\xe2\xef\xb1\x7e\xc6\xf3\x7d\xcb\x2a\xfd\x60\x56\x0b\xa4\x97\x54\xdb\xdc\x45\xe3\x2b\xa0\xc1\x9a\x3f\x88\xef\xba\x0c\x08\xd0\x5e\xae\x81\x36\xa3\xc5\x61\x14\x10\xb7\x31\x8a\x43\x3c\x15\x3b\xff\x41\x0f\x72\xc1\xd7\xd1\xc7\xa0\xf8\x1c\x71\x0a\xd3\x3a\xad\xa9\x70\x6c\x62\xee\xb7\xab\xb4\x01\xf6\x86\xba\x6d\x5f\x92\x4a\x64\x14\x32\xb0\xf6\x0c\x9c\x7b\x72\x41\x4d\x5f\xb8\x2a\xd6\x50\x63\x6c\x3b\xb8\xb7\xc2\x99\x90\x89\x15\x36\x2f\xb2\x21\x1e\xd1\xae\x96\x40\xdf\x01\x09\x13\x6e\xaf\x40\x8f\xcf\xd3\xdc\xae\x9e\x40\x13\xbe\xb1\xe7\x84\x72\x04\x0e\xd0\x47\x9d\x7c\xdb\x14\x25\xf8\x7d\x90\x82\x11\xf5\x8d\x98\x6d\xe3\xdc\x0c\xe3\xe9\x45\x6f\x58\x39\xc2\x2e\x8e\x90\xe3\x1e\x2c\x03\xe4\x61\x0d\x3c\x1e\xfe\x09\xed\x76\xff\xbd\xa7\xf3\x44\xb0\x0a\x3e\x01\x66\x79\x64\x09\x8c\xdd\x4e\xce\x6e\xd8\x4d\x77\x93\x43\xce\xd0\x4e\x25\xa5\x11\x71\x13\xf8\x6c\x93\x5a\xa5\x4f\x24\xaa\xea\x06\xad\x02\x16\x38\xd1\x7c\x8d\x42\x68\xbe\x07\x58\x59\xd4\x6c\xa6\xf2\xd5\xd9\x5c\xb8\x0c\x3b\x85\x0a\x34\xee\x4c\x3b\x45\x6d\x57\x4b\x06\x6c\x8b\xb8\x62\x56\xab\x17\xdb\x06\x13\xf3\xa3\xee\x95\x77\x59\xcd\xbc\xf4\x7f\xd8\x96\x59\xb5\xc0\xf9\xd1\xff\x5b\xff\x6a\xf2\xad\x69\xec\x65\xb7\x6d\x04\x1d\x87\xea\x17\xab\xa2\x4c\x17\x05\xe7\xdc\x38\x5d\x72\x48\x05\x41\xe1\xa6\x0a\x73\x74\xcc\xe4\xe2\x94\x25\x2b\xe5\x06\xe8\x08\x4a\x8a\x18\xdd\x8e\xf5\x3a\x00\x78\x3c\x2e\x96\xc7\xe1\xbb\xe2\x26\x6f\x91\x1d\x31\xe5\x10\xc6\x8b\xac\xb2\xbe\x4e\x50\xe9\xd2\xcd\xcd\x54\x6d\xef\xd6\x59\x4d\xb0\xa6\xbb\x0c\xf9\x89\x53\x3f\x4a\xca\x23\xf4\x4a\xa0\xe3\x86\x9d\xb1\x29\xcd\x23\x81\xca\x69\xc7\xf5\xd6\xa6\xcc\xe6\x69\x2e\x47\x58\xf7\xfc\x61\x8e\x59\xe5\xe5\xb6\x14\xe1\x38\x16\x6b\x2d\xd2\x75\xa5\xfb\xd6\x87\xdf\x45\xda\x0d\xed\xcd\xb4\x07\x6a\x28\x90\xcc\xb2\x9e\xc3\x16\x73\x79\x58\xd3\x04\x6e\x9a\x68\xa5\xfd\xdc\xdc\x18\x68\xfc\x9f\xe5\xac\xa6\x15\x6f\x39\x89\x8e\x6f\x10\xbb\x2b\x0c\x9a\x98\xfe\x97\x07\xaf\x8b\x0c\xfb\x0f\xdb\x05\x45\x43\x10\xf4\x42\xf6\xe4\x29\x2d\x17\x18\xe0\x67\x79\xd0\x28\x7a\xb3\xc9\x6b\x40\x6c\x03\xe8\x1a\x8d\xa9\x13\x4a\x9c\x17\x5b\x24\xc4\xa3\x63\x36\xaf\x83\xf6\xa3\x36\x34\x3f\xd3\x25\xb2\xf1\x95\x8c\xcb\x7e\x53\x01\x32\x9b\xae\x33\x2a\xe2\x63\x12\xed\xa0\xea\x61\x31\x69\x54\x8a\x4f\xf0\x37\xca\x91\xe0\x95\xd0\x32\x03\x36\xfe\x26\x71\x1d\x34\x1b\x16\xa5\x5c\x1c\xd8\x10\x08\x2b\xcd\x57\x97\x51\x66\x57\x83\xe9\x91\x31\x12\x85\x8f\x02\x72\x77\x9e\x3d\x66\xab\x8e\xae\x2b\xd9\x75\xcc\x06\x34\xdb\xec\x17\x2e\x50\x40\xad\x58\x03\xda\xc5\xec\x7e\x50\x54\x38\x28\x18\xa3\x74\x90\x54\x92\xb5\x1b\x51\x49\x41\xbf\xc8\xad\x9f\x0a\x1f\xc8\xd1\xe7\x48\xe7\x75\xa5\x98\x9d\x60\x80\x9a\x4e\x54\xec\x30\x4d\xb1\xbe\xeb\x73\x51\x2c\x2a\x50\x45\x76\x5b\x12\xb7\xb2\x59\x10\x1f\x43\xbe\xf0\xf4\x6b\xfe\x43\xe0\x89\x34\x48\xf5\x52\x0d\x42\xb7\x75\x09\x11\x53\x4e\xd7\x5e\x3e\x79\xe2\x9c\x87\x6e\x6e\xd4\x70\xc1\xf6\x72\xe0\xc4\x0e\xcf\x37\x72\x08\xc9\x00\x79\x3a\x88\x55\x9a\xdf\x6f\xd3\x7b\x48\x42\xa7\x9e\xff\xdc\x8d\xb9\x70\xfa\x85\x38\xe8\xa2\xc4\xea\x57\xfc\x18\x60\x51\x01\xac\x4a\x36\x47\x79\x8c\xec\xe9\xdb\xf8\x27\x9d\xe4\xb5\x8d\x59\x7a\xec\x0d\x35\x2c\xae\xbf\x97\xe1\x2b\x06\xf8\xb8\x77\x9e\x28\x2a\x50\x32\xc5\xd4\x3c\x44\x9f\xf1\xaa\x1c\x58\x53\xc1\xde\xa2\x1c\x10\x30\x92\x06\x62\x91\xdf\x59\xc1\xa7\xf6\x57\xf0\x05\x04\xfe\x69\x93\x86\xc9\x94\xa6\x2e\x64\x2d\xe9\x3a\xdd\xa9\x3b\xe3\x41\xc3\x69\x85\xc4\x5d\xdd\xc4\x4b\x9e\x38\xe9\x54\xa9\x50\x35\xff\xf4\xa7\x9f\x7e\xda\xa3\x9a\xaf\x9f\x53\xcd\x47\x1a\xc4\x6b\x93\x23\xaf\x54\xf7\x97\x95\xba\xc1\xf4\xab\xf9\x66\x77\x54\x06\xa2\xdc\x73\xaa\x1c\x15\x5c\x69\x8b\x06\xd1\xa1\xef\x82\x7b\xae\xe2\xe7\xf2\x12\x38\x3c\x98\x5d\x0f\x0f\x8e\x18\x53\xaf\x4f\xe3\x13\x3b\x74\xf7\x00\xab\x2e\x23\x17\xc5\x71\xa1\x0f\xaa\x9b\x67\x2b\x03\x19\xca\x2a\xa4\xfa\xde\x8f\x8d\x3d\x3c\x98\x34\x5e\x73\x1a\x61\x21\x0a\x83\xcf\x95\x43\xe0\x8b\x49\xb8\x73\x58\x5a\x71\xad\xc5\x7c\x26\x40\x6b\x54\x92\xa0\x2d\xb5\x0a\x96\x12\x98\x58\x85\x9a\xe0\x48\x5a\x18\xb2\x13\x21\x6b\x14\xad\x02\xb8\xac\x0e\x7d\x9c\x7a\x0f\x6b\x39\xdf\x17\x21\xb4\x97\xdb\x82\x9e\x96\xe0\x61\x02\x3a\x57\x18\xf5\xeb\xa1\xbb\x13\x9b\x5c\x0f\x29\xb5\xce\x65\x30\x07\xa4\x2b\xd8\x9e\x1b\x3b\xe7\x3a\xad\xf5\x43\x5d\x6f\x7e\xfe\xe1\x87\xa7\xa7\xa7\xb8\xe6\x0f\x6d\xf0\x33\xf1\xbc\x58\xc7\x4a\xc1\x8d\x55\x4b\x3c\x3d\x58\xbd\xfc\x3a\x3a\xe1\x91\xc1\x10\x3d\x62\x2c\xc4\x4a\x73\x7d\xd0\x9b\xaa\xc1\xf4\x00\x6f\x8a\x7f\x3b\xa4\x18\x00\x1a\xb3\xa4\x7f\x39\x1a\xf4\x7b\x43\x75\x7d\x33\x99\xde\x0c\x66\x7a\x30\xea\xc7\x00\xe4\xfb\x74\x2b\xb1\xae\xc3\x21\x82\x96\x3c\x7c\x37\xf2\xd0\xb2\x4e\x64\x99\x80\xc7\x0e\x10\x98\xe6\xa1\xc6\x00\xb8\x8a\x02\x60\x47\x17\xe2\x38\xd2\xff\x7a\x33\x48\x66\x2a\x19\xfd\x61\x7c\x7b\x95\x8c\x10\xbb\x27\x30\xc8\x89\xfd\x65\xac\xa7\xc6\x84\xa3\xb7\x14\xb7\xb8\xce\x76\x93\xa7\x6a\xc3\x87\x80\xb9\x90\x91\x0a\x55\xc7\x3c\xc4\xea\x9f\xfe\x51\x3f\xf1\x0f\xfd\xd1\x64\x70\x7c\xbd\xab\x1f\x8a\xfc\xf8\xf3\xf5\xf0\xd8\xc6\x8f\x69\x0d\x3a\x77\xf5\xb7\xfa\x6f\xf1\x8e\x93\x93\x93\x93\x0f\x1f\xde\xd9\xff\x3f\xfd\xf8\xfe\x44\xfe\xbf\xfd\xf9\xf8\xe1\xdd\xdb\x7f\x3a\x7d\xfb\xe1\xec\xe4\xe4\xdd\xc7\xd3\xf7\xa7\xff\x74\x72\xfa\xe1\xed\xbb\x0f\xff\xa4\x4f\xfe\x16\x2f\x7f\xe9\x67\x5b\xd5\x69\xa9\xf5\x3f\xad\xd2\x65\x99\x7d\xad\xf6\x7e\xee\xa5\xbf\xff\x0f\xfd\xb1\xb3\xaf\xc7\xd7\xc9\x48\x4f\xc7\x37\x93\x7e\xa2\x61\x09\x10\x10\x7c\xe8\xe0\x5d\xa8\x7b\x61\xd7\xbd\x52\x83\xab\xeb\xf1\x64\xd6\x1b\xcd\x7e\xd6\xd7\xc3\xa4\x37\x4d\xf4\x24\xe9\x9d\x23\x36\x6c\x3c\x1c\x8e\xbf\xd8\xbd\xe9\x3e\xaf\xfb\xbd\x49\x72\x71\x33\x1c\xde\xc6\x4a\x7d\xba\xd5\xfd\xe1\xa0\xff\x47\xfb\x89\xf1\x48\x1f\xf4\xfa\xfd\xe4\x7a\x76\xa0\xbf\x20\x90\x7f\x74\x3e\xe8\xf7\x66\xc9\xb9\xfe\x94\x0c\xc7\x5f\x60\xdb\xd9\x6f\x8c\xaf\x6f\x01\x49\x3a\x18\x4d\x67\xbd\xe1\x10\xbe\x3c\x51\x0e\x4c\xab\x6f\xa6\xf6\x57\xd7\xb7\xb3\xcb\xf1\x48\x9f\xc6\x1f\xe2\x53\x01\x8d\xbd\x1d\xdf\x20\xe4\xdf\x36\xe7\x5c\xcf\xc6\x1a\x20\x9e\xd0\xbe\x73\x42\x4e\x2a\x27\x93\xa1\x9f\x91\xc9\x70\x5d\x02\x95\x1f\xf2\x92\x9a\x7f\xb3\x26\x94\xf3\xa4\x76\x4b\xf7\xbd\xf0\x1a\xd8\x87\x11\x7b\xaa\xac\xf2\xa5\x06\x74\xd1\x03\x54\x84\x0f\x29\x85\x3d\xa4\xf8\x66\x4d\xfc\xe9\x8f\x3f\xbd\xd7\xd7\xa5\xa9\xea\x22\xd7\x5f\x1e\xb2\xda\xe8\xf3\x12\xf4\x8d\x27\xf0\xbb\x48\xff\xda\xd3\x67\x27\xa7\x3f\x9d\xaa\xc3\x03\x3b\x9f\x07\x47\x1e\xe6\x34\x08\x04\x87\xc6\x52\xb6\xd4\x49\xfb\x82\xb6\x2f\xaa\x5b\xc2\xbb\x17\x42\x10\x1d\xaa\x8c\x34\x9a\x07\x1a\xdb\x4a\x90\x1d\xd1\x01\x5a\x94\x36\x56\xb5\xc1\x09\xa4\x34\x59\x40\x4c\xc8\x41\x05\xb9\x7d\x90\xd0\x79\xa5\x06\x48\x18\x27\x3b\x2f\x35\xd2\xb0\x72\x11\x74\xc5\x24\xbf\xdc\x1f\x28\xf5\xcf\xf7\x08\x41\x47\x82\x9c\x52\x52\x02\x79\xfa\x48\x95\xe6\xe9\x6a\xf7\x5f\x26\xd2\xb5\xa9\x6a\x47\x22\xc9\xb8\x1b\x62\x6d\x72\xca\xa0\x91\x8d\x8a\x36\x8e\x8c\x0a\x4b\x4f\x41\xe4\x2b\x52\x52\x8b\x27\x18\x58\x70\x49\x82\x61\x85\xca\x61\x22\x78\x82\xb0\xd7\x3f\x8c\xdc\x9e\x88\xe9\x3a\x16\x4e\x1d\x28\xc2\x60\xc1\x8e\xc5\x9b\x8e\x51\x42\x68\x18\xfe\x91\xee\xf2\x21\xc0\x23\xb7\x34\x52\x59\x6c\xe2\x48\x1f\x78\x47\xf5\xff\xf9\xff\xc3\x55\x87\xf5\x53\x4f\x5f\x5e\xbc\x5a\x2c\xde\x5f\x54\x87\xfb\x7a\x40\x3c\x31\x9e\xa2\xe3\x95\x7d\x66\x57\x8f\xc7\x56\xdc\x3c\x1b\x1b\x46\xad\x30\xea\x33\x76\xf8\xb3\x5c\xaf\x32\xb3\x05\x46\xf6\x3d\x03\x11\x29\xb7\x36\xac\x3f\x06\xf2\x20\x10\xd4\x20\x75\x1b\x93\xfe\x23\xe9\xc6\x61\xb1\xce\x6a\x97\xbe\xfb\xcb\xb6\xa8\x4d\x75\xf4\xb3\x3e\xc0\xa6\x2b\x6c\x3a\xd0\xea\x05\x94\x84\xd5\x2b\xd6\x73\x96\x37\x9a\xa8\x9a\x71\x57\x4f\xa8\x14\xdd\xe3\x7d\x08\x38\x9c\xc1\xb8\x31\x48\xb0\x98\xa3\x7a\x33\x32\xaf\x61\x28\x6c\x6a\x8d\x9b\x36\xec\xd9\x36\xcf\xfe\xb2\x35\xb0\x98\xf9\x6e\x2c\x5b\xd8\x60\x6e\x99\x99\x52\x1f\x7e\xcd\x8b\xa7\x1c\x4b\xbc\x1f\xd2\x7c\xb1\x32\x47\x3f\x2b\x6b\x78\xe2\xb3\xb3\x1f\x4e\x4f\x4e\xdf\xb6\x5a\xe7\xea\x4a\xef\x8c\xa3\x28\x22\x55\x57\xeb\x43\x7e\xdb\x69\x58\x01\xe5\xab\x1a\x77\x33\x19\xfe\xcc\xae\xec\xc3\x62\x15\x63\x13\xe2\xdc\xd4\x3f\xc8\x46\x1c\x80\xae\x48\x78\x15\xec\xe6\x95\x16\x4a\x05\x34\x17\xc1\x3e\x74\x75\x99\x8e\x9f\x1a\x56\x1c\x6b\x62\x9a\x4a\x05\x83\x4b\x51\x21\x48\x23\x38\x9d\x01\x3b\x8f\x4f\xc8\x24\x4e\xa9\x78\x08\xb5\x1b\x2f\x12\x2c\x54\xc4\x62\x0f\xa1\x8a\xf3\xa9\x99\x38\x1c\x92\x76\xae\xe5\x92\x24\xa0\x42\x96\x00\x47\xfc\x91\xe6\x3b\xe4\xdb\xc2\xe7\x93\x40\x7f\xb5\x5d\xaf\xad\xb5\x65\x90\x22\xf1\xf7\xc1\x82\xac\x8b\x60\xad\x80\x92\x03\x1a\x4b\x58\xb2\x5f\x5b\xf6\xdc\xaf\x60\x0f\x64\x31\xde\xeb\xd7\xce\xeb\x8f\x15\x3c\xe6\xaa\xf7\x47\xa8\x16\xd2\x93\xc4\xba\xf7\xc9\x08\x7d\x6f\x70\xf3\xa5\xa3\xde\xf6\xfe\x63\x7b\x9c\x7f\xe9\xd9\x60\x41\x25\x7f\xea\x5d\x5d\x0f\x93\x48\x7f\xba\x99\x01\x3c\x5f\x16\x16\x86\xef\xb1\xe7\x72\x58\x00\x17\xbe\x59\xf9\x17\xdf\x76\x78\xfc\xb6\x01\x81\xcf\x3f\xba\xdd\x53\x67\x38\xbb\xec\xcd\xa0\xb0\x8d\x2a\x8f\x02\x97\x82\x0b\xb9\x34\x47\x01\xf0\xa0\xd9\xe5\x60\x72\x4e\x15\x24\x93\xc1\xe7\xcb\xd9\x14\x78\xec\xb1\x07\xbe\xf0\x23\x28\xbc\x21\xa7\x21\x09\x0b\xd3\x6e\xa6\xc9\x64\xda\x7c\xab\xf2\x95\x39\xbe\x0c\x87\x6b\x73\x9e\xa9\xc7\xa1\xb2\x9a\xde\x54\xf7\xa8\x88\x44\xd9\x81\x01\x49\x2f\xf0\xa5\x7c\x75\x83\xfd\x2f\x59\x9b\xd4\xe1\x4e\xf9\x4a\x24\x27\x02\xa6\xa0\xf6\x72\x7c\xe1\x4b\x69\x7a\xe7\xbf\x0e\xa6\xdd\xe5\x32\xf4\x59\x20\x7e\x08\xb3\x4b\xde\x9e\xc0\xc5\xe0\x3e\xcc\x10\x26\x77\xf5\x3a\xad\x0d\x64\xe1\x10\x8d\xa9\x08\xe3\xde\xa9\xdb\xa6\xd4\xc7\xbd\xef\xea\xba\x45\x40\x8b\x64\x16\xa0\x0c\xd4\xad\x4a\x03\x79\xbb\x20\x49\x89\x57\x32\x92\x04\xa7\xcd\xfa\x1d\x3c\x38\x50\xb7\x02\xab\x12\x35\xae\x27\x60\xb3\x03\xc4\x80\xbf\x63\x5f\xeb\x44\x01\x20\x95\x17\x71\x7b\xb1\x45\x0a\x1d\xcd\xf5\xba\xc8\x9f\x4c\xba\x42\xbe\x9b\x5f\xb3\xf2\x3e\xcb\xb3\x54\xde\x61\xf0\xef\xde\xf8\xab\x0c\xb8\xe9\x0f\xaf\x32\xd4\xa8\xa8\x6d\x37\x02\xf9\xd8\x65\x51\x9a\xfb\xc2\x11\x9b\xeb\xd2\xdc\xa7\xe5\x02\xe5\x5f\x43\xa7\xc7\x5b\xd9\xe0\xbc\x44\x1b\xec\x8d\x2e\xd0\x82\x57\xd6\x64\x83\xe9\x71\x53\x0b\x9f\x7b\x02\xa3\xe9\xf4\xbb\x25\x89\xaa\x8f\x96\x3f\x8f\x6e\xf4\x67\x92\x72\x6a\xa6\x92\x3e\x5f\x0f\x8f\x22\x31\x44\xba\x63\x88\x14\x0f\x07\xad\x07\x5c\x0c\x7b\xfc\x4d\xbc\x9e\x45\xbe\xee\xac\xaa\xb6\xbe\x0c\x83\xd0\x47\x44\x4a\x24\xb3\x9e\xd7\x5c\xfb\x50\xe9\x77\x91\x7e\x8f\x87\xc8\xc7\xfd\x3e\xad\x43\x29\xa8\x26\x4a\xa1\x63\xe9\x0a\xe4\x3c\x73\x8d\xed\xe8\x7e\xc9\xe3\x46\x08\xfc\xa1\x02\xf0\x47\x51\x86\xf8\x0f\x17\xaf\x80\xcd\xf2\x89\x71\xd3\xbc\x7c\x73\xad\x50\x6e\x39\xe2\xf5\x4f\x4b\x8a\x12\x1f\x25\xc5\x4e\x4a\x92\x9e\x01\x76\x03\x48\x85\xb9\xbf\xaa\x8a\x5d\x70\x93\x2f\x8a\x12\x71\x71\x9b\xb2\x58\x17\x08\x52\x45\xcc\x04\x5c\x6a\x94\x8f\xc8\x28\xea\x20\x9d\x1e\xbc\x22\x24\xf9\xa0\xa6\x5e\x7f\xda\xe9\xf9\x2a\x9b\xc3\x79\x47\xbb\xd0\xc5\x9b\x77\xdb\xba\x76\x84\xc3\xac\x24\xb9\x88\xe8\x86\xd4\x6e\x52\x58\xe9\xa4\x3c\xdb\xba\xfa\x6d\x07\x45\x91\x88\x3d\xdc\x31\xce\x1a\x93\x81\x64\x80\x7a\x6d\x84\x13\x6b\x6c\xed\xdf\x37\x17\x14\xff\x30\xcd\xd6\xd7\xc3\xe3\xb3\xf8\xe4\x6f\x95\xee\x69\xfd\xbc\x90\xff\x79\xf7\xf1\xc3\xfb\x46\xfe\xe7\xed\xe9\xd9\xd9\xef\xf9\x9f\x7f\xc4\xcf\x14\xb8\x3a\x5b\xf6\x13\x16\xc5\x91\xbe\x2e\x4d\xba\xb6\xee\xac\x02\x43\xd0\xfd\xe1\xb3\xf8\x84\xbe\x00\xff\x84\x2c\xe8\x43\x51\xd6\x47\x88\x37\xdc\xac\x52\x1b\xa0\x71\x3a\xd4\x71\x83\xe2\x8d\x65\xb1\xd4\x9f\xf1\x8b\x78\x21\xf8\x54\x94\x0b\x62\x76\x66\xbd\x21\x14\xf9\xb2\x1b\xe8\xbe\xb0\x67\x73\xe5\x21\x53\xc7\x40\xab\xb9\x4d\x01\x82\x89\x08\x16\x20\x70\x02\x34\x1e\x1c\x5b\xa5\x31\x0b\x24\xb3\x05\x91\x5f\x66\x3b\xcb\xef\x05\x48\x84\x90\x3d\x36\x14\x7d\x2a\x40\x38\x5d\xa5\x77\x05\xbd\x73\x6d\xd2\x5c\xdc\xab\x43\x3f\xe1\x64\xd9\x11\xd3\x93\x97\x53\xd2\x19\x5c\x18\x35\xaa\xa8\x94\xeb\xdf\xf3\x63\x7d\x16\x9f\xe0\x15\x18\x0e\x25\xdc\x8c\xfa\x02\x13\x6e\xec\x9b\x8a\x73\x2e\x90\x4e\xc0\x88\x73\xce\x1c\xd3\xf3\x62\x4d\xb7\x6f\x4a\xde\x61\xda\x23\x75\x80\xd0\x55\xd0\xac\xd2\x87\x82\x90\xc7\x5b\xe9\x23\x29\xf0\x40\xef\x85\xc6\x28\x69\x14\xa5\x9a\x4c\xa4\xbd\xd8\x78\x3b\xec\xa2\x21\x13\x60\x1c\xfb\xf8\x7b\x43\x1c\xa8\x8c\xdd\xb7\x6f\x63\xbc\xdd\xcf\x00\x79\x3d\xd6\x37\x55\x08\xe4\x71\x5c\x68\x04\x13\xf8\x85\x3e\x77\x65\x23\xb1\x96\x07\x02\x7e\xa1\x3e\x44\x72\xd9\x4a\x5b\x6f\x12\x70\x66\x07\xe7\x24\x0f\xf8\xa5\x28\xbf\x1e\x1c\xf1\x43\xfa\xc5\x66\xd7\xd4\xec\xcb\x6a\x47\xfc\x2d\xbf\x14\x2b\x35\x20\x35\xe3\x6e\xc4\x11\x16\xa2\xc8\xaf\x08\xd2\xc0\x7b\xdb\xc4\xbb\x74\xfe\x95\x21\x00\xf3\x62\xbd\xde\x02\x61\xda\xdd\x8e\xbb\x7e\xcd\x04\xe8\x2b\xe4\x09\x27\x07\x8c\xb9\x0b\xe1\x92\x93\xe2\xbd\x1d\xb1\x1f\xff\xa2\xd4\xb1\x1e\x1a\xcc\x1d\x12\x40\xce\x14\x9b\x95\x01\x47\xaf\xc5\xcf\xcd\xcc\x6d\xa2\x06\x92\x4a\xc2\x28\x1d\x46\x88\xdb\x2c\xb7\x9b\x77\x8e\x8f\x87\x32\x24\xe7\x0e\x8a\x8b\xb3\x88\x84\xd3\x49\xce\x3d\x0a\xf5\xda\xdd\x6f\x91\x5b\x92\x48\x87\x95\x57\x83\xaf\x88\x3d\x0c\xa1\x90\x18\xa7\x9b\xb4\x82\xeb\x6a\xbb\x54\xec\xf7\xee\x4c\x25\x18\xa2\xb0\xb7\xd0\x52\x04\xe6\x80\xeb\xf0\x68\x4a\xd8\xc1\x04\x62\xc7\x6d\x4a\xb7\x87\x75\x9a\x13\x27\xa7\x23\x4b\x82\x0e\x1e\x22\x6e\xa5\x62\x13\x74\xe4\x55\x7b\x48\x5f\x96\x01\x32\xa5\x40\x8e\xf1\xd6\xa0\xdd\xc5\xc1\xbd\x5f\x4d\x79\xb5\xc9\xe6\x5b\x74\x5d\xd3\x3c\x2f\xb6\xf9\xdc\x55\x18\x20\xea\xae\x4d\xf3\xe6\x09\xe4\x62\xb0\x02\x25\x32\x0e\x57\xc5\x1a\x6e\x2e\xf3\x7b\xda\xc6\x6e\x2d\xa1\xf1\x31\x25\x2f\x1b\xde\x5a\x9e\x0a\x67\x90\x4c\xad\x47\x99\xbb\x65\xf3\x35\xcb\x17\x30\x78\x83\x70\x63\xba\x4a\xd4\x1d\xd4\x6f\xc1\x67\x9f\x52\x66\xbb\x4c\x77\xe8\xfb\x96\x66\x0e\xd4\x9d\x24\xed\x4e\xdf\x51\xdb\x0d\x8f\x07\x01\xff\x41\x9b\x3c\xcd\x16\xb0\x65\x71\x1b\xe2\xac\xfe\x97\x29\x0b\xcd\x5a\xe0\x19\x12\x39\x6e\x52\x90\x11\x83\x1e\x1e\xc5\x4a\xde\xdd\xf2\xfb\x3c\xe8\x93\x5e\x29\xc3\x2d\x44\x53\xd3\x06\x3f\xb0\x96\x17\x6f\x8a\xb3\x74\xa5\xe8\xe3\xf1\x81\x3e\xb4\x66\x15\xe4\x04\x50\x37\x68\x9b\xd7\xe5\x8e\xbc\x3f\xdb\x9a\x55\xf6\x68\xdc\x7b\x51\x95\x6b\x87\x40\x48\x08\xe3\xd4\x0e\x6b\x80\x18\x64\xc9\xde\x39\x8c\x51\x45\x48\x2e\xf7\x75\xc6\x5a\xec\x8a\xad\xb5\x30\xde\xa2\x73\x5d\x65\x65\xfd\xe5\x8d\xc1\x9a\x1d\x77\xc7\xcc\xb3\xeb\xab\x15\x68\x7d\x19\x6b\x86\x64\x5c\xac\xb2\xe5\xcf\x76\x16\x6f\x85\xa6\xfa\x5d\x86\xf5\x4c\xe0\xe5\x36\xcd\x8c\x76\x66\xe6\x80\x17\xbe\x7c\x91\xa9\x14\xd8\xe4\x42\x7f\x35\x66\xa3\x49\x19\x8f\x14\x6c\x97\x78\xd4\xc1\x0b\x8e\x60\xf1\xf4\xf0\xa4\x74\x75\xa7\x3b\xae\x66\x6d\xc9\x8c\x55\xcf\xb0\xca\x81\x52\x84\x1d\x96\x58\x39\x9d\x2a\x86\xf4\x70\x6a\x54\x09\x56\x50\x5e\x24\x7e\x17\x3c\xa5\xb2\x4c\x19\x87\xb8\x36\xdf\xea\x5f\x74\x56\xbf\xa9\x04\xdd\xbf\x35\x2d\x24\x12\x25\x56\xb7\x7f\x10\x20\xac\x1e\xcc\x6a\xb3\xdc\xae\x62\x3d\x2b\x74\xfa\x58\x64\x0b\xe6\x58\x2b\x72\x91\x6c\xc7\xd5\x4b\x7a\x19\xa2\x43\xc1\x63\x4d\xee\x36\x0e\x60\x10\xac\x47\x12\x4c\x2c\xb5\x77\xb3\x32\xaa\x4d\x0f\xe6\x3b\x73\x68\xdd\x9e\xa5\x31\x2b\x3c\x22\x01\x8c\xde\xd0\x34\x90\x8f\x55\x59\xa5\x0f\x5c\xec\xed\xdf\xd1\xf0\x37\x0e\x8e\x82\xdb\xe5\xf8\x87\xfe\x4d\xef\x78\x7c\x3d\x3c\x3e\xfd\xbb\x45\x00\xcf\xfb\xff\xef\xdf\xbf\x3f\xfd\xd8\xf2\xff\x3f\xfe\x7e\xff\xfb\x0f\xf9\xe9\xdf\xf4\xf4\x18\xaf\x1a\x1b\x6b\x51\xa0\x7d\xb0\x0e\x29\xd6\xe7\xfe\xd4\x86\x3b\xd0\x93\xf8\x34\xd6\x07\x7d\x5f\xd3\x73\x53\x99\x03\xf0\x98\xab\x50\xd9\x27\x88\x9e\x85\x3c\x45\xdf\x5a\x78\xb3\x40\x45\xe3\x20\x0f\x1d\x8a\x14\xd9\x97\xe1\xab\x5c\xc9\x01\xbf\x07\x40\x61\xa4\x3f\x09\x7b\x02\xd3\x21\x95\x53\x88\x03\x1f\xcd\x1d\xda\x4c\xda\xaf\x5a\xda\x40\xf6\x1d\x67\xe1\x3b\x78\x0c\xf8\x5d\x64\x4b\xef\x82\x5a\x6a\xa3\xc7\xac\x08\x80\x8c\xd8\x50\xe4\x15\x0a\x16\x62\xe1\x12\x68\x2f\xb5\xaa\x63\xea\x96\xae\x0d\x17\xa7\x22\x2a\xd0\x31\x85\x2a\x49\x95\x68\x5b\xfb\x16\x5a\x0b\x23\x08\xaf\x96\xcd\x0c\xda\x64\xc7\x22\x7c\x05\x19\x1a\xd1\x19\xd5\xd5\x19\x68\x60\x43\x51\x88\x81\x78\xf3\x54\xf2\x40\x74\xe9\x1d\x9f\xc6\xef\x62\x7d\xb0\x47\x3b\xcc\x2b\x54\x71\xb3\x53\xbd\x76\xa2\x55\x24\xd1\x0e\x20\x36\x7b\x3c\x9a\x85\x22\x76\x06\xef\xb4\xf8\xf2\x1e\x7f\xc0\xb9\x33\xc4\xf8\xb7\xd6\x65\x9a\x57\x4b\xac\x2f\x59\xa4\x75\xea\xd4\x15\x4e\xe3\xf7\xb6\x7d\x0e\xf4\xc5\x0d\x91\x63\x2a\x05\xff\x24\x8d\xa9\x54\x84\x53\x90\xe2\xd4\x07\x78\x19\xba\xe2\xc2\x23\x53\xca\x09\xc9\x82\x8b\x78\x5a\xb0\xee\x06\x6e\x41\xd4\x91\xaa\xf5\x0c\x66\xa5\x90\x58\x47\xba\xca\x75\xaa\x34\x77\x3b\x9d\x7c\x43\x0d\xdf\x1e\xb4\xe6\x63\xac\x0f\x86\x69\x79\x6f\x4a\x0c\x75\xdc\x08\x23\x7b\x08\x50\xbd\xe0\xdc\x9b\x46\x77\x3b\x94\xab\x51\xb7\x6a\x4e\x2f\x7e\x5e\x08\xb3\xa5\x60\x71\x1a\xff\x18\x3b\x3c\x9b\x1f\x8f\xac\x72\x88\x00\x68\xf0\x8f\xb0\xbd\xf1\x63\x72\x2a\x08\x0f\x11\xf0\xc4\x42\xce\xd1\xa5\xcd\xd7\xe9\xb7\x6c\xbd\x5d\x53\xfa\xdc\x09\x17\xf8\x6a\xb2\x86\x52\x9c\xaf\xad\x5d\x51\xf6\x32\x80\x18\x0a\xd8\x64\xa4\x64\x31\x3e\x7d\xb5\xa9\xdc\xe1\xeb\xf6\xe2\x9f\x62\x7d\x10\xec\x15\x37\xec\xc0\x67\xe2\x05\x6d\x85\xcc\x96\x97\xa7\xa2\x38\x65\x0e\xa5\x33\x4e\x37\x01\x14\xb3\x32\x5a\x76\x1d\xbb\x9a\xe4\x98\x20\x51\xde\xd4\x3a\xfb\xf2\x60\x72\x15\xae\xe5\xca\xeb\x7c\xc2\x55\x6f\x65\xca\x0c\xf3\xa9\xcb\x6c\x65\x40\x22\x40\x3e\x44\x67\xd5\xcf\x4a\xf5\x10\xb5\xfc\x62\x0f\x24\x04\x34\x45\xa4\x25\x31\xcb\xda\x29\xe4\xa6\x2b\xb7\xcc\xba\x9b\xad\xd4\x27\x7c\x5f\x6e\x9e\x48\xfe\x02\xac\x3a\x71\xd4\xfa\xab\xd9\x4e\x7b\xf5\xdc\x73\x4f\xe3\xd3\x93\x58\x1f\x04\x5f\xe0\x29\x6a\x20\x89\xdb\xb5\xa9\xb0\xfc\x71\xe3\x64\x95\x0a\x78\x60\xbe\x67\x77\xda\x61\x0f\x8f\x0b\xc8\x07\xc3\x83\xa3\xe6\x52\xcd\x6a\x37\x5f\x5d\x8c\x4d\x0d\xa2\xe1\xe0\x2c\x0d\x37\x69\xb0\x2f\x61\x18\xec\x6e\x23\x16\x0f\x24\xab\x92\x6b\x95\x8a\xcd\x21\x35\x70\x58\x1d\x45\x28\xf7\xcf\x0a\xff\x4e\x5e\x49\xb9\x8d\xf2\xec\xfd\x57\xa4\xd7\xa6\x7e\x28\x16\x11\x16\x85\x54\x94\x0b\x48\x37\x9b\xb4\x4c\xeb\x6d\x45\x0c\x57\x91\x22\x4b\x4b\x6f\xf7\xb6\x40\xb3\xf2\x2c\x1d\x7b\xa7\xb6\xf1\x62\xc0\xa5\x95\xdd\x38\xd6\x0e\xa9\x6d\x19\x6c\x82\xa5\x4b\x59\xa9\x75\x28\xfd\x57\xe8\xac\x96\x7d\xb1\xdb\x7e\x5d\x2c\xa0\xcc\x26\xf3\x4b\x30\xd2\x48\xc3\x9f\xef\x04\xc0\x49\x08\x2a\xf9\xdc\x06\xef\x2a\x4a\x82\xa0\x17\x40\xba\x5a\x65\x81\x25\xd0\xd9\xca\xab\x1c\xca\xcc\x09\x60\xfe\x73\xed\x4f\x27\xcc\x66\x08\xc0\xb2\x4b\x90\x72\x35\x75\x5a\x66\x15\x80\xa3\xa9\x18\xc0\x1b\x0e\xd5\x61\x38\xf0\x30\x7b\x32\x24\xfa\x95\x47\xc2\x01\x0b\x8f\x04\x1e\x44\xe7\x7d\xbc\xa9\xd4\xfc\xa1\xc8\xe6\xa6\x2d\xfb\x39\x4f\x73\x94\x98\x07\xb0\xf3\x1a\xea\x2a\x70\xdd\xa4\xe5\xfc\x21\x7b\x4c\x57\x04\xad\xe6\xb4\x09\x5c\x5e\xca\x62\xa0\x85\xe1\xef\x91\xe7\xb8\x30\xc7\xf8\x5d\x3b\x27\x95\xa8\x65\x7f\xca\x16\xc6\xda\x6b\x07\xba\xb0\x53\x9b\x17\xa4\x66\x81\x6b\xc5\x7a\x74\xb7\xc5\xf6\x40\x1f\x16\x25\xfc\xab\x3c\x38\x72\x4b\xbd\x71\x28\xa7\x54\xf3\x4c\x87\xb3\xd7\x1d\x67\x26\x16\x92\x16\xa7\x4c\xab\x24\x68\x12\x27\x04\x9f\x87\x51\xb8\x5b\x3b\x44\x98\x9b\x02\xb1\x78\xb1\xd8\x94\x60\xfe\x60\x37\xeb\x45\x51\xca\xc6\x65\x76\x55\x61\xbf\x08\x2b\x52\xc1\x61\x45\x2d\xe7\x03\x1e\x56\x99\x75\xd9\xaa\x90\x57\x0d\x75\x57\x19\x79\x3c\x87\x6b\x51\xb7\x28\x21\x7b\x0c\x3a\xc2\x17\x61\x59\x16\x1d\xdb\x6e\x75\x47\x90\x70\xb1\xdf\xe1\x1d\x78\x98\xa2\xf4\xe1\xa6\x78\xb2\xe3\x84\x99\x22\x25\x98\x33\xe0\xd4\x46\x25\x49\xc8\x69\xc2\x2f\x69\x9a\xd7\x69\x9e\x52\x2d\x17\xd7\x28\x61\x77\xdc\x51\x8e\x69\x68\x2a\x82\x91\x21\x05\xd2\xb6\xdc\x1d\x85\xf2\x86\x20\x41\x02\xce\xda\x32\x5b\xd6\x3b\xbd\x31\xe5\x1c\xd8\x6b\xde\x9f\xfc\xaf\x23\x27\x85\xb0\xad\xdd\x3d\x37\xdc\x10\x80\x6f\x7c\x67\x72\xb3\xa4\x7a\x54\xf9\x48\xd1\x2a\xf4\x70\xce\x42\x21\x21\x6f\x65\xcf\xe2\x53\xdc\x1c\x6d\x87\x0e\x04\xd5\xf7\xfd\x51\x2a\x6d\xa3\xd4\x67\x28\xa6\x1d\x22\x19\x03\x69\x6d\x5f\xa2\x1e\x20\xd1\x5c\x14\xb5\x47\xe4\x10\xcd\xef\xcf\x4a\xd9\xd9\xc3\x15\xf1\xac\x02\xb7\xbc\x3b\x20\x5b\xcd\xb7\xbb\xeb\xb4\xfc\x7a\x24\x2c\xb7\x9d\xb0\x76\x17\x3b\xf4\xba\xb9\x92\xb7\xad\xdb\xed\xb9\xb6\x9a\xd2\xdc\xed\xc3\xff\xb0\xc3\x79\x3d\x22\xea\x85\xd2\x9d\x4c\x61\x38\xc3\xfa\x0e\x69\xe5\xbc\x8a\x54\x0b\xd7\xf9\x17\x60\xb3\x51\x76\x71\xe1\xd8\xe0\xa9\x59\xd1\xb1\xe9\x18\x59\x9c\x3b\x8c\x47\x4b\x44\x77\xc4\x70\x6b\xbd\xe2\xc2\xcc\xc0\x07\x8a\x18\x49\x16\xe1\xcd\x0c\x4a\xba\xc2\xc8\x6c\xec\x0a\xcf\xec\xc0\xd8\x2f\x13\x72\x14\xf9\xf8\xed\x03\xd3\x15\xa2\x49\x7f\x28\x4a\x5f\xac\x0a\x63\x57\x54\xa6\xdb\x2f\xea\x1c\x9a\x58\xa9\xc3\x39\xee\xd8\x16\x3d\x0c\xe7\x38\xd9\x0a\x9d\xc5\xa7\x76\x7d\x80\x90\xe9\xdd\x11\xe4\xa6\x91\x67\xcc\x2e\x3c\x82\xf8\xc1\x15\x45\x7b\xbe\x97\x59\x59\xd5\x62\xe6\x1a\x1e\x50\x47\x76\x50\x35\x5c\x96\xc3\xc5\x91\x6e\x82\x52\x64\xc3\x6c\x83\x50\xd4\x2f\x2f\x1a\x6a\x85\xd6\xcc\x51\x9f\x7e\xd6\xa7\x47\x0a\xeb\x95\x17\xc6\xd3\x25\x90\xb0\xa9\x73\x63\x83\xc6\xfd\xa2\xcf\x8e\x34\xa2\x54\xba\x3e\xa3\xf0\x33\x45\xa9\xdf\x1e\x61\xbe\x5b\x10\xf4\x54\x68\xe9\xec\xca\xf8\x59\x93\x28\xac\xf4\x38\x9a\x33\xe5\x3c\xe3\x8c\x3e\xfc\x52\xaa\x81\x96\x36\xaa\x5a\x8a\xfb\xa7\x85\x79\x24\xa1\xc0\xb3\xf8\x2c\x94\x8c\x24\xdb\x33\xed\x34\x10\x7b\xf6\x3d\xfb\x67\x10\xf5\xcb\x87\xb5\x6c\x95\x7e\xb5\xad\x62\x0e\xa0\xbf\x97\xd5\x09\xb2\x2c\xbf\xd1\xe0\xc0\xce\x6f\x18\x9c\x30\x8b\xc2\x02\x24\x4c\x24\x16\xf0\xcf\x75\xed\x38\xe5\x45\xdb\xd3\x5c\x6f\x73\x57\x54\x48\x55\x55\x62\x42\x9b\x3a\xce\x8d\x38\x9d\xb6\xff\x77\x9a\xad\xd7\x59\xad\xa8\x61\xb6\x82\xa6\xa8\x20\x3b\x25\x7b\xcc\xd4\x6e\x80\xe9\x26\xb3\x8a\x95\x73\x6e\x15\x43\xff\x6c\x58\x23\xbe\xa7\x38\xd1\x18\x8c\x18\x1f\xb6\xe2\xdb\x47\xc2\x62\xc2\x7c\xa2\x71\x6c\x18\x46\x25\x8c\x29\x35\xa2\xcb\x46\x5a\x63\xf0\x5c\xda\x4d\x36\xb0\x73\x2a\x61\x84\xad\x75\xe8\xd8\xa9\xfb\x9f\x2b\x73\x78\x9d\xa3\xa1\x5f\x3d\x1a\x2f\x58\x6f\x47\xe3\x75\x16\x9f\xb1\xe5\xb6\xff\x7c\xd6\x78\x07\xea\x63\x60\xb6\xed\x70\x57\x3a\x4c\xf1\x76\x85\x55\x2f\x5a\xe9\xb3\xef\xb5\xd2\x58\xcd\xcb\x96\x3a\xb0\x3b\xa0\x24\x6c\xad\xf6\xc2\x9b\xe4\x8e\x31\xb4\xc6\x5b\xb5\x8d\x77\xe7\x27\x5f\xb6\xdf\x4a\x5a\xca\x30\x72\x2c\x96\x9d\x53\xb8\xd7\x94\xab\xd7\x2d\xbc\x4e\xfb\x7e\xe8\x2b\x93\x6d\x53\x54\x3b\x3a\xe3\xf7\x1f\x39\x1f\x99\x4f\x04\x38\xa9\xde\xbd\x60\x12\xd0\x7c\x86\x19\x50\x88\xd1\xee\x2a\x43\x04\x02\xaf\x6b\x3e\x7a\xc8\x6f\xe3\x30\xed\x3b\xf6\x72\x81\x80\xe6\x3f\x8d\x75\x2f\x24\x01\x70\xb5\xf2\xb3\x96\xc1\x15\x3a\xfc\x2f\xe9\xcf\xc2\x2a\x7f\x55\xae\xb2\x23\x7d\xa1\x04\x7c\x57\x2c\xe1\x76\xb8\x2b\x14\xa4\x82\x31\xa3\x02\x0d\x09\x5c\x85\x4b\xf4\xce\x9b\xd0\xe7\xa3\xc4\xd6\x67\x38\x85\xa7\x5a\x71\x62\x93\xd7\xd7\x69\x8e\x73\xd9\x71\x9b\xb7\x07\x70\x13\xca\xff\x3d\xec\x5e\x28\x85\x1b\x48\xc3\x93\xdd\xb5\x6b\x7c\x0d\x36\x95\x89\x6c\x2b\x45\x44\x1c\x5d\xe3\x84\x8c\x28\xab\xda\x94\x0d\x4e\xe4\xda\x93\x41\xdc\xad\xf6\x47\xc8\x94\xdd\xef\x10\x11\x76\x24\x7b\x1d\xaa\x92\x34\x10\x40\x87\xe6\x85\x31\x39\x01\x8d\x3d\x71\xf4\x85\xfe\x03\xf4\xe4\x4e\xd1\xf2\xb7\xf1\x7b\x58\xbe\x67\x71\xa0\x1e\xdb\x50\x76\xc5\x4c\x66\x90\x52\xed\x5e\xc2\x4a\xfc\xda\x2f\x61\x98\xc5\x3b\xd3\x2c\x34\xca\xf2\x50\x74\xb7\x28\xd7\x7e\x61\xa9\xee\x85\xe5\x1d\x0f\x07\x9e\x03\xd2\x67\xc8\x03\xcb\x34\x93\x5f\x76\xa5\x7a\xb4\x7f\xcf\xdd\x15\x8c\x7e\xf1\x2a\x87\xc4\x26\xad\x03\x00\xdb\xb2\x58\xd3\x55\x38\x0e\x7e\xc7\x5b\x5c\xaf\xf0\x3c\xcd\x96\xcd\xce\xda\x36\xec\x79\xaf\x72\xef\x0d\x39\x90\xfd\x97\xe1\x1c\xa9\xb5\xdd\x2f\xb5\xae\x9f\xcc\xea\xd1\xe8\xc3\xd3\x33\x92\x85\xad\x48\xba\xde\x1d\x7f\x59\x2d\xe4\x7b\xef\xcc\x1c\xe4\x99\xf9\x61\x88\x34\xe6\x87\x55\xd9\x37\x7d\xf8\xa1\xf1\xa0\xb4\x83\xab\xc0\xa9\xf2\x09\xc9\xbf\x60\x41\x38\x95\xc0\x46\xc7\xeb\x82\x99\xdb\x79\xad\x23\x3e\x06\x0b\xea\x42\x06\x26\x93\x57\xdb\xd2\xa1\x23\x9a\xbb\x98\x5b\xc2\xa2\x8c\x3e\x61\x66\x1e\x4d\x4e\x18\x8f\x57\x4c\x2e\xa0\x5c\x32\x96\xdb\x86\xdb\xcc\xf0\x92\xf6\x6d\x6c\xad\x7d\xa8\x31\xdc\xb8\x94\x70\xc6\x09\xb3\x40\xe9\x6a\x15\x1a\xce\x7d\xd6\x9c\xb2\xa6\xc8\xa2\x80\x32\xd3\xb4\x7d\x79\xe3\x32\x28\xee\x96\x16\x9c\x87\xc6\x2b\x3a\x99\x42\xf7\x79\x0f\xaa\x2e\xee\xb2\x9f\x1b\xc6\xe4\x29\x40\x11\x79\x69\xfb\x66\x4c\x80\xec\x99\x00\xfe\xdb\x2b\xcf\x80\x9e\x48\x18\xf5\xb9\x0a\x31\x3a\xa8\xda\x51\xb4\x17\x84\xe6\x0e\x03\x94\x9e\x8c\x36\x7d\x5e\x05\xd7\x86\x9c\x8e\x0b\xf4\x9a\x39\x82\xa7\x6c\x7b\xee\xb5\xb7\xbb\xf6\xa7\x02\x23\xbd\x6a\x97\xf0\x02\xbf\xb0\xb3\x59\x4e\xdd\x1d\x52\x6a\xd0\x33\x70\x3e\x44\xee\x4c\x75\x78\x8c\x78\x45\xf8\x36\x7e\x17\x03\x8d\x8f\x0b\xfe\xae\x39\xf8\xbb\x02\xae\x98\x0a\xa3\xc4\x19\xac\xb5\x6b\xf0\xbf\x58\x61\x63\xb0\x6c\x79\x86\x0d\x88\x8c\xc7\x01\x61\x9d\x46\xb0\x66\xdf\x54\xcf\x47\x9d\x70\x61\x46\xd7\x38\x75\xc1\x19\x61\x23\x6e\x02\x5b\xec\xdc\xb2\x39\x0d\x42\xdd\x33\x2c\x2e\x3c\x8b\xcf\xa2\xe0\x63\x72\xb1\xd9\xf6\x39\xe1\xf7\x4e\x3d\xfe\x00\x58\xc1\xd2\xf0\xa0\x4c\x75\x40\x33\xc2\xb3\x51\xa1\x4a\x2b\x52\x1f\xd3\x82\x27\xf7\xd5\x43\x30\x58\x08\x58\x57\xdb\xe5\x32\x9b\x5b\x43\xa3\x17\xa6\x06\xe2\x7c\x1c\x3f\x67\x80\x14\xd4\x68\xd9\xf1\x45\xd3\xce\x7b\x72\x5e\xb7\x26\x02\x2b\x42\x91\xbf\x55\xcc\x88\xb7\xb7\xcd\x4d\xd3\x30\x7e\xe9\x1e\xad\x85\xb7\xcd\xb1\x43\x72\x62\xbb\x3f\x37\x76\xa7\x09\x0d\x51\x14\xeb\x62\xc2\x17\x6b\x68\xe6\xc5\x26\x33\x61\xb4\x85\xe1\x8d\x30\xba\xe2\x76\x2b\x67\xaa\xfe\x3a\xfd\xca\x12\xa6\x55\x6d\x36\x95\xe7\x72\x46\xa1\x70\xb8\x2b\x12\x37\x18\x81\xbe\xb7\x3d\x47\x73\xf3\x54\xa1\xf8\xf7\x91\x64\x2f\x9f\xa7\x2b\x7b\x1e\x38\x0d\x6f\xc2\xc0\x16\xa0\xc6\x52\xd8\x71\x37\x80\x22\x6e\x21\x65\x60\x62\x72\xf3\x24\x46\xd6\x9d\x22\x5c\x8b\x1b\x63\xf4\x2f\x3b\xdb\xbb\x1e\xb4\xb6\xcc\x9b\xc6\x3d\xa9\x37\x7a\xb9\x24\xe7\xb2\x23\x7c\x5f\xa6\xeb\x35\x92\x15\xf2\x55\x57\x43\x79\xa4\xb1\xff\x3c\x6f\xb5\x0b\x50\xd1\xb6\xe3\x11\xe6\xc6\x21\xa0\x36\x73\xf5\x01\x44\x47\x77\x3d\xe8\xd8\x2c\x50\x78\xcc\x3b\x06\x61\xde\x82\x40\x91\x02\x16\xbf\x00\x28\x54\x9e\x30\x11\x28\x1f\x46\xf2\xb9\x01\x4b\x68\x5a\x4b\x06\x28\x80\x49\x17\x36\x12\x04\x66\x9d\x14\xb9\x6b\xfd\x92\x7c\x07\xf1\x35\x86\xb6\xf2\x91\x77\x66\x95\x99\x47\x26\xf4\x7a\x66\xd0\x61\x40\xc2\xbf\x17\x9c\xe8\x63\xc0\xd2\x61\x75\xc4\xf9\x8c\xe6\x88\x8b\x9d\x4b\x46\x89\x51\x12\x9d\x90\x85\xf6\x95\xb0\x75\x66\xf5\x84\x0d\x1d\x52\x70\xc9\xb3\x7a\xb1\xc5\x85\x80\x86\xcf\x1f\x19\xfe\x5a\x9b\x40\x41\x6a\x0f\x3b\x97\x20\x1c\x05\xd4\x2f\x81\x34\xec\x7c\x6f\xb6\x54\xf3\x28\x4e\x22\x09\x7a\x0a\x3c\x5d\x38\xf7\x91\x39\x34\xab\x2b\x0f\x93\xa0\x8a\xea\xd6\xc9\x1d\x3e\x58\xa5\x58\x31\x0f\xe9\x15\xde\xc2\x29\xc4\x53\x8f\x76\xb0\xf0\x84\x2e\xca\xdd\x91\x93\xe1\x07\xfa\x70\x54\xdf\x07\x51\x9e\xaf\x06\xc0\xbd\x6a\x55\x14\x5f\x31\xe7\x04\x8f\xa1\x77\xc4\xa1\xe2\xf0\x22\x10\xc3\x97\x33\x6e\x27\x93\xd5\x85\xd3\xc5\x02\x71\x9c\x70\x9e\x43\x8b\x1a\xcc\xba\x62\xd0\x03\xa3\xe8\x31\x3f\xae\xe7\x0a\x76\x86\x9c\xaf\x40\xb4\x07\x49\x16\x82\x73\x9c\x01\x53\x72\x9c\xa1\xf7\x2a\x38\xd8\x3b\x22\xae\xe0\x80\xa7\xdf\x49\x82\xcb\xf0\xb0\x77\x22\xba\x4e\x86\x1a\xc2\x2e\xc2\xc0\xf1\xa5\xad\x75\xee\x0c\xf8\xb4\xbe\x4c\x21\xd2\x6d\x81\x79\xb5\x47\x91\x1f\x6e\xf1\xe5\xa8\xfb\x76\x37\x63\x74\x1f\x27\x4a\x9c\x71\x45\x5a\xcf\x45\x8e\x82\x12\xc5\x53\xae\xef\xcc\x43\xba\x22\x0e\x00\x88\x7c\xf9\x57\x0d\xef\xcb\x7b\x6b\xaa\x4d\x85\x2d\xb6\x13\x33\xf9\xa6\x77\x55\xb1\xda\x82\xec\x8e\x93\x66\xce\xbd\x58\xff\xeb\x05\xf6\x7d\xff\x41\x44\x0a\x60\x01\x8e\x90\x1e\xf2\xb1\x2e\x33\xa0\x24\xd9\x00\x1e\x3b\xf0\xc8\xe5\x73\x7e\x27\x24\x09\xc2\xe4\x20\x51\xd8\x4a\x50\xfc\x7c\x5b\x96\xcf\x79\xb0\xbc\x5b\x02\x31\x16\xdc\x80\xd5\x76\x05\x99\xac\xe7\xa6\x3c\xec\x32\x46\xb9\x40\xb8\x6f\xbb\x0b\x46\xec\x43\x23\xd5\x54\x2c\xa5\x47\xcb\x8a\xf0\x3e\x8b\x21\x72\xfb\x72\x61\xa8\x2c\xf0\x84\x11\x48\x92\xa3\xfa\x10\x26\x1f\xc0\x50\xae\x79\x51\xf9\x83\xe0\xf4\xf8\x6d\xfc\x5e\x48\x04\xac\x4d\x4d\x3c\x95\x8d\xf8\x23\xe2\x60\x17\x15\x73\x38\xcc\xa0\x4d\x6e\x63\x8c\x8e\x60\x4e\x35\x33\x4e\x2d\x68\x4b\x67\x65\xc9\xbe\xac\x97\x12\x40\x17\xda\xe7\x2e\x68\x7b\x28\x9e\x90\xf1\x02\xcc\xa0\x6d\x24\x74\x6a\xb9\x5d\x2d\x33\xc0\x10\x80\x9f\xef\x77\x9d\x0a\x86\x81\xf2\x64\xd4\x1b\x4e\x62\xcc\x83\xba\x18\xea\xf4\xa2\x15\x87\x74\xe7\x09\xa2\x3d\x51\x08\xdc\xe6\xad\xec\x5f\xb0\x6c\xbf\x23\x26\x51\x1d\xa6\x2b\xe4\xe1\x6d\xc4\x25\x5d\xeb\x03\x02\x64\xd7\x2a\xb5\x2f\xed\xd7\x65\x12\x59\xf2\xdf\x89\x7e\x2c\xd1\xb2\x20\x82\x26\xa2\xcc\x0f\xeb\x8b\xdb\x00\x17\xe7\xcb\xc1\x7b\xda\x22\xec\x1e\x3d\xe3\xaf\x31\xd3\x12\x16\xee\x7e\x9e\xc2\x66\x46\x08\x23\x02\x66\x1a\x0d\x4b\x30\x54\x47\xa6\xc6\x53\x10\xd4\xb5\x59\x23\xad\x32\xa4\x49\x21\x2f\xb2\xaa\x4d\x23\x35\xf7\xa6\x62\x6f\xa4\x03\x23\xc7\x0f\x75\x49\xf9\x96\x20\x42\xa3\x04\x9e\x8f\xd6\xe6\x85\x5c\x47\x43\x79\xc0\xfd\x00\x72\xef\x02\x0b\xac\xf6\x58\xe0\xda\x67\x32\x39\x9e\xda\xa3\x85\x0f\xa9\x18\xb2\xb6\x2a\xb4\xb6\xc0\x70\xff\x8c\x21\xec\x3c\x1c\x88\xcc\xea\xaf\x37\xcd\xa1\x32\xa3\xfa\xab\x4d\x33\x67\x48\x84\x1a\x47\x68\x79\x3f\xc6\xf2\xf2\x51\x98\x58\xe6\x26\x90\x7f\xc6\x12\xfb\xf5\x1d\xe2\x42\x03\xcb\x2b\x2e\x3c\xbe\x0f\x6f\xdc\x2c\xdf\xb4\x6b\x58\xbe\x12\xd1\xae\x59\x7e\xbf\x72\x94\x02\xc0\x23\x44\xee\xdb\x3c\xad\x88\xee\xdc\x1f\xd0\xd5\xb6\x34\x2d\x7b\xdf\x4a\x48\x43\x6d\xaa\x33\x8b\xec\x4c\xb5\xf3\x1c\x90\xe2\xf8\x4e\x96\x7e\xa8\x35\x6d\xd2\xf4\xeb\xdf\x48\xd3\xaf\xba\x68\xfa\x75\x48\xd3\x1f\xd8\xb2\x17\x18\xfa\x55\x93\xc1\x58\xf8\xdf\x3f\x43\xea\xa9\x53\x9d\xaf\x35\x71\x75\xa1\xda\x30\x6e\x17\x21\xfc\xe2\xf2\x55\x41\x8a\x49\xd2\x67\x72\x66\xc3\x2e\x18\x85\xc5\x6a\x70\xb7\x19\xeb\xe9\xd6\x25\x43\xf0\x64\xe3\xa3\x48\x1e\x3e\x8d\x54\x81\x73\xb0\x55\x90\x75\x00\xd1\xc5\xf6\xf7\x1d\xf6\x4f\x26\x65\xaa\xae\x00\x48\x25\x5d\x5c\xf4\x2c\x10\x49\xf9\x23\xbf\x0a\x84\xf6\x01\xae\x51\xd1\x0d\xc5\xcd\xf0\x71\xdf\x6a\x47\x39\x1b\x5a\x83\x22\x69\x63\x1b\x53\x94\x0b\x64\xe7\xab\xbe\x82\xba\x22\x50\x53\x30\x4d\x15\x98\x4b\xb8\xb0\xd5\x59\x8d\x8b\xf5\x7d\xeb\x4e\xae\x11\x30\x86\x92\x8e\xbe\x52\x7d\x2e\x53\xb8\x7b\x6c\x8d\x8d\x58\xd3\xba\x4e\xe7\x0f\xe8\x47\xa8\xae\x78\x92\x82\x02\x3e\xf4\xdb\xfb\xe9\x43\xec\x1c\xba\x06\xbf\x33\xb0\x0c\x9d\xc6\x7a\x64\x9e\x84\xcf\x27\xeb\x9c\xca\x82\x88\xa8\x89\xc3\xaf\xb2\xfb\xe2\x31\xab\x90\x29\xd9\x46\xd8\xb9\x79\xe2\xe3\xc4\x31\xfa\xba\x2a\x45\x38\x06\xb2\x35\x96\xc8\x67\x6b\x13\xeb\x24\x9d\x3f\xb8\xe3\x07\x92\x64\x77\x06\x8a\xbd\x73\x38\x86\x40\x21\x69\x9b\x55\x40\xed\xc2\x1f\xcb\xb7\xeb\x3b\xb0\x9e\x1f\xac\xbf\xe4\x45\xaf\xc2\x66\x8f\xf3\x79\x63\x5b\xba\x44\x0f\x35\xdd\xe1\x45\x53\x25\x6e\x18\x1a\x5e\xa2\xf3\x1b\xd8\x2e\xa7\xab\xa7\x74\x57\xb9\x92\x54\xa6\x6d\xc9\x6a\xa7\xa5\x15\xec\xd7\xb4\xe6\x27\xc6\xe2\x11\x55\x21\xa2\x39\xfb\x75\x3a\x43\x44\x6b\x3b\x9e\x86\x07\x09\x5f\x93\xec\x69\xa9\xe8\xdd\xdd\x4e\x4c\x9e\xa2\xc9\x8b\xf5\x88\xe2\x3c\x0f\x0b\xea\x98\x62\x12\xe6\xf5\xb5\x23\x3e\x3f\xc8\xaa\x52\xfe\xce\xb1\x11\xb2\xba\x20\xbe\x43\x77\xc0\xce\x1a\x5c\x75\x38\xe2\x01\x3a\xf7\x82\xf8\x9f\x99\xa7\x53\x4f\x1e\xbe\xe7\x4e\x57\x1d\xe2\x8e\x09\x0a\xae\x17\xd6\x03\x40\x6b\x0b\xf7\x6a\x50\x58\x8c\xd5\xee\x41\x35\xc2\xf7\x57\x01\x1c\x89\xb3\xce\x5a\xea\xd2\x40\xee\xe1\x56\x16\xa9\x42\x5d\x33\x7a\x87\x6a\xf3\x50\xa6\x95\xa9\xf4\x81\x1f\xe2\x83\x08\xfe\x8b\xfe\xef\x7a\x78\xe0\x88\x78\xa8\x6e\x36\xbf\x17\xe5\xf6\xf8\x00\xbd\x28\x14\x95\x48\x13\xa3\x7b\x50\x16\x2b\xe4\x3a\xf2\xa2\xee\xa8\x70\x25\x47\xac\x82\x2d\x18\x60\x04\x3d\x30\x31\x28\x33\x84\x05\x2d\x1c\x3b\xe8\x60\x63\xc1\x31\x10\xcd\x15\x98\xec\xf7\xfc\x8c\xde\x5b\x2d\x19\xeb\xc3\x8b\x0c\x01\x53\x19\x52\xe1\x77\xdc\xce\x78\x23\x18\xb5\xcb\x56\xa4\xeb\x45\xc7\x12\x1a\x46\xd5\x9d\xf3\x11\xf4\xfe\xf8\x96\x75\x65\x56\x8f\xa6\x0a\xb9\xa1\xee\x42\xc8\x61\xcb\x7f\x89\x8f\xc0\x9a\x7e\x8c\x1d\xc1\x5e\x32\xd1\xe3\x0b\x47\xa7\x17\x2b\xd5\x1f\xff\x9a\x4c\x92\x73\xdd\x1f\x9f\x83\xc8\xfe\xf5\x64\xfc\xeb\xe0\x3c\x39\xd7\x37\xa3\xf3\x64\x12\x52\xe4\x82\xba\xbf\x23\x0d\xfc\xd4\x9b\x0e\xa6\x6d\xaa\x70\xf5\x0c\x55\x78\x72\x1e\x90\x85\x3b\xae\xef\xa8\x8b\xec\x5b\x10\x1d\xa8\xd9\x65\x6f\x06\xbc\x73\xcd\xe6\x5e\x4c\x12\xe0\xf2\x3b\x4f\x2e\x92\xfe\x6c\x1a\x09\x76\xc0\x61\x02\x64\xe0\x2d\x22\x70\x25\x28\x01\x05\xed\xf7\x60\xf4\x39\x86\x57\x24\xa3\xd9\x60\x92\x90\x1e\xfc\x94\x38\x84\xf5\xbf\xde\xf4\x80\xec\xae\x37\x3a\x97\x1a\xff\x8a\xf8\xf0\x9a\xed\xb2\xfd\xd1\xb7\xe3\x9b\x58\x4f\x2f\x41\x30\xdf\x0e\x49\xf0\x21\x3b\xd0\x09\xb5\x7b\xf0\x6b\xa2\x07\x23\x85\xdc\x87\xd3\xeb\xa4\x3f\x43\x66\xe3\xc3\xd1\x18\xbb\x3d\x18\x0d\x90\x01\x30\xf9\x35\x19\x8e\xaf\xed\x2c\x4a\x72\x41\x21\x89\x7f\xa4\x7b\xd3\xe9\xcd\x15\x30\xf8\xe9\xfe\x78\x3a\x63\xea\xf6\x51\xd2\x4f\xa6\xd3\xde\xe4\x56\x4f\x93\xc9\xaf\x83\x3e\x0c\xfb\x24\xb9\xee\x0d\x26\xc8\x34\x38\x99\xd8\x96\x8c\x47\x31\x4e\xba\x5f\x31\x4a\xac\x18\x60\x24\x9c\x0d\x66\x37\xb3\x64\x6a\x17\x83\x9d\x54\x24\x27\xb4\x03\xdc\x24\x55\x8e\xf5\x68\xcc\x6c\x8b\x62\x00\x14\x8f\x52\xef\x66\x76\x39\x9e\x0c\xfe\x2d\x39\x07\x76\x78\x5c\x72\xc9\x9f\xfa\xc9\xf5\x4c\xae\x3f\xdf\x14\xf4\x0e\x7e\x8c\xf5\x2c\x99\x5c\x0d\x46\xb0\x50\x80\x0f\xec\xf4\x55\x42\xd4\x7b\x85\xc2\x5b\x14\x0c\xfb\x85\xa8\xc1\x7e\xbc\x5e\x84\x5a\xbd\x3d\xd9\xa3\x3d\xad\x5f\xa7\x3d\x1d\x46\x50\x60\xb7\xa4\xee\xb4\xfe\x6d\xba\xd3\x4a\xe8\x4e\x53\x79\x1a\x06\x60\xbf\x51\x78\xba\x15\x39\x35\x75\xa7\x7f\xb4\x7e\xd0\x7e\x11\x69\xfd\x1b\x44\xa4\x15\x88\x48\x77\x4b\x48\xbb\x2a\xa9\xee\xf8\x3c\xc4\xf2\x76\x57\xe6\xbe\x20\x2c\xad\x85\xb0\x74\x4b\x55\xda\x7a\xde\x69\xa5\x0f\x40\xd9\x71\x9e\x6d\xd2\xb6\x9e\x34\x95\x64\xc0\x03\xc4\xc7\xde\x74\xe3\x45\x5f\x92\x9a\x56\xaf\x90\x9a\xd6\xcd\xcb\x6c\xf1\xda\x40\xed\x57\x05\x77\xda\xe4\x34\x9f\xc5\x67\xdd\x9a\xd3\x11\xf2\x77\x7e\x38\x69\x8b\x4a\x8b\x17\xec\x53\xa6\x8e\x58\x58\x3a\x73\xc2\xc9\xfc\x24\xbc\x4e\x86\x7b\xd2\x0d\x1c\x83\x74\x62\x7a\xa1\xe9\x9f\xf5\x61\x76\xd4\x56\x9b\x26\xa5\x69\xd9\xbd\xe7\xa5\xa6\x8d\xea\x96\x9a\x86\xfd\x1d\x68\x4d\x77\x63\x23\x9b\xa3\x09\xe1\x73\x20\x34\xad\x5f\x27\x34\xbd\x07\xeb\xa9\x02\xb9\x69\xf1\x22\xd8\x52\x8d\x61\x73\x03\x15\x75\xea\x4d\xab\x3d\x7a\xd3\xfa\xb7\xe9\x4d\xab\x3d\x7a\xd3\xfa\xb5\x7a\xd3\xc1\x1a\xe9\x94\x9c\x6e\x2c\xc2\x57\x2b\x4f\x73\x68\x87\x03\xc3\x0b\x73\x83\x52\xdc\xa4\xe4\x61\x83\xc2\xbb\x02\x2c\x14\x20\x98\x6d\xf4\xe2\x04\xf2\x1e\xd2\x72\x81\xff\x72\x65\x17\x91\x0c\x49\x9e\xdf\xbb\x8c\x7c\xdf\x87\x14\x7a\x49\x27\x3e\x1c\x2a\x1e\x9b\xae\xbd\xdb\x1e\x2f\xec\x4b\x00\x09\x2f\xcd\x63\xf1\xd5\x2c\x3c\x34\x5c\xa5\x2e\xb6\x06\x9c\x14\xda\x34\x44\x85\x53\xad\xd2\x22\xd2\x55\xb1\x5a\x44\x12\xe9\x0a\x83\xf1\x90\x2e\xe8\x53\xcf\x54\x0f\xc8\x75\x6a\x0f\x80\xb7\xaf\x12\xf3\xd6\xa1\x98\x77\xb0\x89\xc9\x7e\x22\xe2\xeb\x6f\x6f\x39\xff\xe7\x49\x7c\xbf\xbc\x12\x08\x92\xa4\x1c\xb3\xec\xdf\x42\xe6\x1b\xef\x67\x39\x58\xfe\x11\x11\x5e\xb8\xfb\xf6\x0a\x78\xfb\x56\xfd\x88\xad\xfa\xd1\xee\x65\x84\x55\x90\x9c\xb7\x7a\x85\x9c\xb7\x94\xf0\xd6\x0d\x09\x6f\xf4\x8e\x1e\xd2\x47\xa3\x7e\xab\x86\xb7\xee\xd2\xf0\x56\x2f\x68\x78\xff\x14\x8b\xb8\xc5\xfa\xba\xc3\x01\x91\x93\xc7\x4a\xa1\x1f\x3b\x1a\xeb\xfe\x60\xd2\xbf\xb9\x9a\xce\x6c\xd8\x80\x6a\x24\xee\x4f\x98\xa1\x9c\x5d\x26\xe3\xc9\x6d\xa4\xbf\x5c\x26\xe0\xd5\xcf\xc6\x93\x99\x3e\x74\x41\x92\x1a\x25\x9f\x87\x83\xcf\xc9\xa8\x9f\x1c\x45\xe8\xf2\xf7\xfa\xb3\x90\xdd\x3b\x22\x52\xf2\xdb\xf1\x4d\xd4\x1d\x38\x44\xd6\x11\x57\xad\xb0\xc1\x73\x80\x33\x73\xf8\x18\x22\x45\x19\xb2\xb8\xcf\x4c\x6f\xae\x6d\x04\x67\x3f\x00\x31\xcb\xf8\x02\x75\x9c\x20\xc6\x4a\xa6\x51\xc8\x87\x0e\x84\xec\xc9\x64\x3a\x1e\x69\x4f\x77\x7e\x3e\x98\x40\x94\xe3\xc8\xce\x05\x03\xba\xda\x4f\x7c\x4e\x61\xc4\x65\xcf\x76\x3d\x99\xbc\x14\x41\xd2\xf7\x80\x66\x1d\x18\xd3\xc7\x17\xfa\xf3\x78\x7c\xfe\x65\x30\x1c\x46\xfa\xcb\x78\xf2\x47\x3d\x9d\x8d\xaf\xaf\x7b\x9f\x13\x3b\xa2\x57\xd7\x37\xf6\xa1\x17\xbd\xc1\xf0\x66\x02\xf1\xe1\x55\x6f\x78\x71\x33\xea\xe3\xd3\xb0\xf1\xca\xce\x9c\x1d\x63\x1e\xc3\x2b\x1b\x72\x76\xd0\xb3\x03\x49\x3e\xb1\xa7\xbb\xe1\xb9\xa5\x09\xba\xec\xfd\x9a\xa8\x4f\x89\xfd\xeb\xc8\xc6\x92\xdd\xcc\xea\x3c\xb0\xf4\xe4\x98\x83\xab\xce\xb5\xa6\x3c\x1f\x7d\xef\xfa\x7a\x78\x8b\x5c\xf4\xcc\x92\x6f\x87\xe0\x3c\xe9\xcd\x2e\x6d\xf3\x70\x3a\x7a\x43\x3d\x18\xfd\xe1\x66\x72\x4b\x1c\xf2\x83\xd1\x67\x7d\x31\x19\x5f\xc1\x3b\x15\xb4\xf6\xcd\x54\xfb\x55\xc7\xa1\x70\xf2\xa7\x59\x32\xc2\x97\x0c\xfa\x30\xcb\xc3\xde\x17\x1b\xcf\x82\xd4\xdf\x14\x9b\xec\x1b\x19\xab\xe9\xf8\x2a\xd1\x7f\xb8\x99\x0c\xa6\xe7\x83\x3e\x8a\x09\x9c\x8f\xb1\xa1\xc3\xe1\xf8\x0b\x3d\xb4\x3f\xbc\x99\x42\x9f\x26\x8d\x1e\xfa\xa5\xb1\x77\x65\x44\x7a\x3a\xc6\xc1\xf1\xcf\xb1\xf3\x24\x1e\x74\xd5\xbb\x0d\xc6\x46\xd9\xe8\x1c\xa9\xaf\x4e\x62\x52\x7d\xb7\x8b\x7d\x04\x3a\x3f\x89\xdd\x9e\xd3\x64\x32\x45\xbe\xc6\xf6\x45\x7c\x87\xd0\xbe\x7e\x8d\xd0\xbe\xfa\x1e\xa1\xfd\x36\x53\x49\x4b\x68\xbf\xad\xc5\xbf\x4f\x68\x5f\xbf\x2c\xb4\xaf\x5e\x29\xb4\xaf\x5f\x29\xb4\xaf\xbe\x43\x68\x5f\xb7\x85\xf6\x3b\x2e\x0f\x5f\xa3\xb1\x6f\xa7\xf4\x34\xd6\x57\x83\x69\x3f\x19\x0e\x7b\xa3\x64\x7c\x33\x6d\xde\x6a\x7c\x8f\x6a\xf8\x1e\x6d\x4b\xf5\x7d\x8a\xe1\xfa\x59\xc5\x70\xf5\x7d\x8a\xe1\x7a\x8f\x62\x38\x24\x41\xd4\x73\x72\xca\xba\x9f\xae\xb2\x65\x51\xe6\x59\xfa\x2a\x41\x65\xf5\x92\xa0\xb2\x7e\xb5\xa0\xb2\x92\x82\xca\x5f\x9a\x42\xdc\x28\x03\x5c\x79\x94\x87\x2b\xc6\x00\x3e\x4a\xac\x60\xae\x40\xcf\xb6\xce\xfe\xcb\x58\xef\x9e\x92\xd2\xcc\x8b\x31\x7f\x48\x4b\xd4\xfe\xc5\x2b\x36\xbb\x74\x09\xda\xbd\x28\xf4\xdd\xb6\xca\x72\x08\x34\xd1\x53\x09\x34\x1e\x6c\xa8\x40\x9a\xca\x51\x53\x01\xf6\x55\xaa\xce\x42\x1a\x28\xd0\xd5\x65\xef\xed\x82\xd4\x1e\xfa\xc5\xb6\xac\x9d\xdf\x3d\x2a\x80\x7f\x36\x27\x60\x13\x5e\x11\xf9\x09\x8a\x70\xd1\xa3\x1c\x33\x2b\x89\xeb\x69\x9a\xd7\xa9\xee\xaf\xd2\x32\xf5\x42\xce\xfe\x3b\xfe\x46\x76\x55\x54\x4e\xc9\x57\xb5\x55\xbd\xab\xfa\x05\x69\x8b\x88\x44\x83\x51\xe5\x18\x7d\x2d\xe7\x9b\xb2\xf2\x6f\xf5\xc6\xcb\x21\x9b\x6f\x1b\x14\x38\xfc\x6e\xf1\x5f\x25\xc5\x7f\xf5\x5f\x21\xfe\xdb\xcb\x49\xc8\x23\xb8\xbe\xc6\x05\xb5\x5f\x81\x57\x77\x2b\xf0\xaa\xdf\xa4\xc0\x1b\x92\xa4\x9d\x9e\xc5\x90\xd3\x1d\x8f\xdc\xa9\x6e\x8f\x62\x54\xbb\x89\x95\xea\x79\x41\xb9\x6e\x08\x48\x23\x25\x50\x45\xc8\xcf\xe7\x36\x84\x98\x58\xa4\x3f\xc0\x82\x4f\x40\x4c\x10\xf1\x2f\x49\x59\xec\x2f\x59\xb1\xf3\x4e\x8c\x54\xdb\x3a\x5b\x91\x84\x9c\xdd\x14\x01\xca\xa9\x05\xc9\x08\xf8\xc4\x91\x7c\xce\x2e\xbe\x36\x60\xb2\x81\x24\xaf\x68\xc7\x33\x9e\x83\x2a\xa1\xa8\x23\x84\x7a\x84\x9a\x15\xf3\x97\x6d\x86\xf8\x1f\xd2\x28\x22\x0d\x0d\xce\xc0\x66\x58\xe2\x91\x2f\x70\xd7\x77\xe9\x67\x38\x85\x63\x62\x6a\x23\x2d\x0b\xdb\x3b\x07\xa2\xa1\xb9\x7a\x1b\xeb\x2b\xeb\x08\x5d\x0f\x93\x63\x4a\x61\xa3\xeb\x1b\xab\x8e\x04\x21\x80\xc8\x4c\x95\xdd\x63\x56\x4b\x54\x73\xb7\xd0\x16\x69\xa5\x0f\xae\xb6\xab\x3a\xdb\xac\xcc\x31\x2b\x15\x1f\xc4\xaa\xe3\x97\x8e\xee\x8a\xd6\x68\xfb\xbd\xa0\xc7\x41\xd4\xbc\x75\x41\x33\x66\xd4\xb3\x0d\xc0\x09\x14\xc8\x34\x67\x82\xae\x87\x5c\x76\x99\x92\xea\x9a\x20\x70\xa8\xbc\xbd\xf7\x09\x93\xbd\x38\x23\xb2\xac\x6d\xa4\x85\x80\x32\x3b\x41\x68\x7d\xfc\xcc\x7d\x9b\x52\x07\xb3\x7d\xb2\xc3\xba\x43\x76\xf8\x45\x9e\x53\x75\x1a\x9f\x84\xea\xbb\x07\x47\xbf\x04\x44\xbe\xa1\x88\xf0\xb3\xd2\xc0\x4e\x63\x5b\xef\x55\x00\x96\x97\xdd\x5e\xc7\x77\xbe\x4d\x51\xf8\x31\x46\xa6\xaf\x65\x51\xde\xa3\x0e\x9a\xf2\xa2\xe2\xcf\x8a\xf8\x82\x5b\x29\x3e\xd0\xa1\xe3\x15\xa9\xe7\xd5\x7b\xa9\x56\x94\xac\x27\x95\xf8\xae\x32\x6b\x3d\x1b\x9a\xb7\x80\x03\x86\x82\xd2\xfd\xb2\xb7\xfa\xb5\xb2\xb7\xe4\x48\x87\x37\xa3\x59\xa5\xff\xf3\x55\x3f\x9a\xbe\xde\x91\xa6\xef\xa2\x4e\x79\xe6\xb9\x3a\xd6\xd7\xb4\x53\x94\x60\xf8\xd8\xf3\x61\x2c\xdd\x90\x3a\xdf\xf4\x87\x3d\x4f\x57\x71\xa7\xcc\xb7\x92\xcc\x10\x87\xd5\xd1\xcf\xdf\xd1\xed\x9e\xdf\x96\xd6\x56\xd7\x7b\xf7\x05\x55\xa5\x83\x73\xbf\x87\x93\x1b\x1f\xea\xae\xe4\x61\x3f\xe8\x7f\xff\xcf\xff\xfc\xcf\xff\xf0\x04\xd2\x91\x77\xc1\x80\x04\x16\x92\xbd\xde\x4b\x2c\x96\xf0\x05\xfb\x1d\x25\x61\x72\xc2\x4f\xb4\x27\xa5\x49\x17\xf8\x52\x28\x1e\x87\x14\xab\x26\x6d\x85\xa7\xac\x7a\x00\xc8\x03\x50\xb1\x63\x62\x1d\x49\xd8\x9b\xf8\x09\xac\x37\xd9\x5b\x59\x6f\xb0\x25\xff\x11\x9c\x49\x79\x01\x79\x64\x7c\x38\x89\xf4\x11\x80\x65\xff\x3b\xfc\xe3\x01\xee\x10\x39\xd5\x20\x6c\xd7\xc2\xcc\xd1\xc3\xbf\xdb\x11\x33\x26\xa5\xc9\xc4\xb8\x40\x1f\xc9\x4b\x02\x5d\x05\xb8\xb5\xf7\xde\x18\x5d\x5e\x38\x99\x50\xf9\x5d\x49\x26\xc9\xdd\xfa\x8f\x00\x1b\xbb\xf3\x6c\xf0\xc4\x68\x04\xc8\x8d\xc6\xeb\xa3\x00\x1a\x66\xd7\xc3\x6b\xba\x4d\x6a\xe9\xae\xf7\x7c\x1e\x84\xad\x38\x50\xea\xdf\x47\xe3\x59\xf2\x33\x38\x77\x50\xc5\xc8\xcf\xf2\xa8\x05\xc4\x55\x03\xaa\xa2\x5a\xd9\x3d\xb0\xda\x79\x78\x85\xff\x0e\xa3\xc2\xaa\x2e\x82\x4d\x60\x55\xec\xdc\xd6\x68\x6f\x49\x97\x85\x58\xe6\xd4\x9e\x96\x94\xa9\xd0\x40\xe1\x97\x2f\x41\xaf\x89\xde\x19\x5a\x0c\x09\xc2\x77\x97\x40\x61\x75\xf3\x7f\xfc\xe3\x74\xbb\xff\x56\x3f\xf1\x0f\xfd\xfe\xf1\xf5\xf9\x79\xff\xef\xa6\xfe\xf4\xa2\xfe\xd3\xdb\x93\x8f\x27\x0d\xfe\xf7\xb3\x0f\xbf\xeb\x3f\xfd\x63\x7e\xec\x56\xdd\x98\xb2\xc2\x5a\x0a\xfc\x57\x05\xe5\xa7\x50\xf1\x21\x14\x9c\xbd\xf7\x1e\xd0\x37\xd3\x19\x71\x6e\xc0\x1c\x16\xe5\x81\x2a\x4a\x7d\xd0\x37\x25\x2a\xcb\x1e\x1c\x31\x4d\x18\x79\x15\x80\x0c\xa6\xbf\x72\xa9\x25\xf9\x68\x20\xf3\x52\x2c\xb5\x7d\xbc\xab\x22\x8d\xc0\xec\xb0\x9e\x50\xba\xad\x1f\x0a\x2c\xaf\x10\xdc\xd9\x99\x33\x13\xa8\xc9\xac\x17\x05\x60\x12\x58\x1e\x95\x04\x3f\x00\x36\xe6\xa1\xa9\xf0\xcc\xac\xf2\x50\x43\x47\x23\x49\x2d\x5e\x60\x9f\xa0\x6c\x35\xad\xcd\x23\xa0\xd2\xf9\xa4\x07\xd2\x08\xee\x74\xa5\x1f\x8a\xd5\xc2\xb5\xe2\xf9\xd6\xde\x19\x7b\xf0\xe0\xb0\xa1\x10\x11\x83\xa0\x83\xd6\xc7\xba\xe7\x06\xaa\x8c\xa0\x9a\xad\x00\x56\x13\xdf\x2c\x84\xdb\x71\x8b\xa0\x2c\xd7\x54\xb5\x7a\xc0\x93\x9e\xf5\x9e\xc0\x73\x0f\xe7\x11\xeb\x8f\x28\x8a\x06\xb4\x25\xb2\x7c\x46\x98\x94\x64\xbc\x59\x5a\xa9\x54\x1f\xb8\x5e\x1e\x60\xd3\xad\xc7\xe1\x5b\x86\x18\x4b\xb8\x32\x12\x57\xc9\x58\x27\x5d\x17\xf6\x54\xe1\x02\x06\xdf\x52\x00\x3a\x3b\xdf\x44\xd9\x16\xc5\xda\x2d\x19\x50\x7e\xb9\xcf\xb3\xff\xe2\x40\xdc\xae\x87\xfb\xa2\x00\x24\x4d\xfd\xa0\xcd\x72\x59\x94\xb5\x57\x5c\xa9\x1e\x32\xb3\x5a\xe8\x87\x6c\xad\xe0\x24\x11\x35\x69\x4b\xdb\xff\xa5\x8d\xd8\xdd\xb4\x70\xc3\x17\x7c\xff\xdc\xb5\x72\x62\xa5\xdc\x82\xa6\x1a\x71\x22\x3f\x5d\x70\xc2\x82\x53\x10\x48\x15\xea\xe8\xa8\xe9\x31\x69\xad\x57\x58\xcf\x98\xc3\xc5\x2c\x64\x05\x4c\x5d\x66\xcc\x6f\x6a\x7f\xe1\x5e\xf1\xa6\xd2\x0f\x26\xa3\xeb\xaa\x6a\x0b\x52\xec\x45\x59\xc5\xfe\x13\x14\xc3\x56\xaa\xd9\x0c\xc2\x72\xe7\xda\xae\x0d\x40\xb7\xd8\xa7\x97\x66\x95\xe5\x7f\xd9\x66\xd5\xc3\x1a\xef\x14\x59\x72\x86\x28\x6a\xb0\x66\x1e\xd2\x9b\x12\xc2\x10\xc4\xf2\x7e\xba\x20\xab\xc7\x74\xea\x8f\xa6\xaa\x31\x94\x46\xf0\xf0\x3d\xa8\x6b\xd3\x20\x82\x44\x96\x68\xb5\xc7\x96\xd3\x54\x52\x1c\x1f\xb4\x0e\xdb\xe3\x8b\x85\x90\xcf\x96\xae\x3a\xf7\x7f\x12\x05\x23\x21\xb3\xa9\x0f\xef\x76\xb6\x95\xd5\x36\x0b\x89\x61\x8f\x14\x09\x04\x71\x5f\xdc\x16\x25\x31\x2f\xdf\xd4\xc6\xa2\x8b\x74\x61\x03\x3a\xf0\xd3\x16\x9d\x6b\x24\x72\xcf\x81\x32\xde\x3b\x14\x9b\x03\xa1\x24\xa2\x19\x6c\x5e\x8b\x83\x10\xc1\x3a\xab\xe1\x3f\xf0\xf2\x9c\x81\xc1\x28\xa2\x55\x03\x94\x22\x0a\xc5\x26\xcd\xb7\xcd\xaa\xe0\x12\x01\x22\xd7\x69\xa8\xa1\x45\x5a\xdc\x08\x00\x07\x72\x7e\xec\x7f\x83\x14\xe3\x52\xd7\xc9\xe7\xf4\xee\x76\xc4\xce\xcd\x5b\xcd\xda\x0c\xbb\x2b\x76\xa6\x46\x98\x79\x06\x19\x38\x37\xe3\x48\x49\x10\xff\xcf\x73\x74\x7e\xff\xe9\xfc\x89\x7f\xf8\xb7\x55\x76\xf7\x77\x74\xfe\x5e\xf6\xff\x4e\xdf\xbf\x3b\x6b\xfa\x7f\xef\xcf\x3e\xfe\xee\xff\xfd\x23\x7e\xfe\x6b\x95\xdd\xb9\xe8\x58\xe4\x31\xe6\x47\xfa\x9f\x77\x26\x2d\xff\x45\xff\xb3\x3f\x08\xac\x93\x63\xca\xea\x5f\xe8\xaa\x4c\x72\xb1\xbb\x82\xd4\x37\x69\x75\x9c\x55\x6f\x84\x92\x5e\xbe\xeb\x48\x25\xb9\x52\xef\x58\x0d\x72\x9d\x17\x84\x0b\x41\xd0\xed\x83\x61\xd7\xc9\x1e\x6e\x70\x43\x66\x0f\xf5\x95\x37\x7c\x8d\xc4\xb5\x0b\x21\xd5\x96\xe9\x29\x45\xfb\x62\xa5\xae\xbd\x42\xb1\xa7\x9a\x0c\xd9\xca\x5c\x7a\x6f\x9f\xe6\xa4\xb0\x9b\x4a\xd8\x5b\x71\x8b\x51\x39\x36\x03\xac\x87\x25\x11\xc9\xd2\x84\xc2\x92\x78\x4e\x38\x9a\x6e\xf6\x0f\x96\xc5\x6a\x55\x3c\x41\xc6\x4c\xa8\x0d\xfe\xac\x14\x31\x89\x33\xaf\x52\xa3\x77\x88\xc2\x85\x82\x53\xa3\xd7\x59\xe5\x2e\x2e\xcd\xe2\x17\x2f\x17\x08\x4a\x64\xab\x34\x5b\x2b\x2f\xa0\x56\x16\xb5\x64\x6c\x4a\x57\xa1\x24\xaa\xfd\x4c\x7b\x50\x90\x9f\x03\x4b\x28\x23\x60\xd4\x73\xa2\x64\xec\x6b\x50\xde\xc3\x7e\xa2\x51\xae\xed\x98\x34\xd2\xcd\xa6\x34\xe4\x90\xde\x6d\x6b\x9d\x55\x0a\x35\xff\x30\xcd\x01\xd4\xc5\x1a\xf2\x5a\x66\xc1\xa2\x07\x5c\x90\xe5\xca\xf0\x40\x59\x76\xb5\xd3\xeb\xb4\xfc\x8a\x8a\x26\xd6\xbd\x88\x7c\xa9\x1e\x0e\x8a\x0a\x07\x05\x00\x5a\x86\xf3\x33\xed\xae\x33\x6b\x25\x2c\x71\xae\x61\x27\x57\x13\x6e\x5f\xd7\xc5\x23\x29\x1a\x50\xfb\x60\xf1\x21\x30\x10\x1a\x2a\x8b\x01\xff\xbb\x9f\x94\xf1\x0f\xbd\xd1\x6c\x38\x39\xbe\x3e\xff\xfb\x9d\x01\x2f\xd9\xff\x8f\x6f\xdf\x36\xf5\xdf\x4e\x4e\x7f\x8f\xff\xff\x21\x3f\x30\xfb\xfa\xcc\x6b\x2e\x7e\x01\x76\x41\x53\x82\x1f\x48\x9a\x13\xde\xe1\xb6\x5b\x06\x17\xcc\x31\x16\x26\x2f\xb7\xab\xd5\x6e\x4f\x0c\xd5\x6b\x0a\x6c\x80\x48\x49\xbe\x63\xae\x15\x17\x55\x43\xd5\x2e\x24\x7d\x21\xbf\x10\x8a\x9c\x78\x06\x55\xf8\x23\x36\xd8\xe9\x97\x2d\x0c\x69\x85\x91\x83\x0c\x7f\x8e\x1a\x4c\x79\x59\x3e\x2f\xca\x4d\x51\x3a\xfe\x5d\xfa\x14\x08\x94\x56\xba\xd8\xd6\x9b\x2d\x50\x8d\x60\x29\x07\x5e\xf3\x07\x26\xe1\x8b\xd1\x26\x9f\x17\xdb\x32\xbd\x37\x2c\x2f\x5d\xb0\x04\x99\x37\x8e\xbe\x85\x82\x85\xf4\xc9\x80\x80\x65\xf5\x15\x19\xa0\xe7\xf6\x38\x80\xb1\xc3\x0a\x51\x38\x7a\xe0\xac\xa1\xc7\xd9\x56\xd3\x33\x3e\xed\xf4\x01\x7e\xfe\x00\x9e\xb3\x36\x29\x71\xa8\x92\x12\xa5\xb5\xcf\x6e\x44\x7c\x37\x8d\x34\x47\x73\x24\xf1\x65\x62\x9c\x25\xa6\x7b\x89\xd0\xab\xd2\x87\x02\x2a\xc4\x76\x1d\x96\x40\x5a\xe2\x95\xf8\x9f\x41\xb8\x23\x08\xab\xbc\x78\x66\x28\x49\x69\x17\x04\xdc\x8f\x17\x6b\x83\x24\x42\xb4\x32\x42\xc4\x91\x7f\x7c\x69\x90\xe5\xc5\xd4\xf3\x38\x76\xa7\xce\x2a\xfb\xca\xdd\xb2\xb6\x1c\x82\x12\x1a\x1c\xb3\x50\xa9\xce\xad\x4d\xae\x0b\x12\x2b\x41\x3b\x4e\x73\xb8\x41\xb9\xa4\x35\xa2\x06\x7c\x3b\xdd\xd7\xa1\xc6\xb5\xf2\x63\x6c\xdd\x0f\xe6\x7c\x85\x31\xe6\x89\x82\xc7\x3e\x98\xd4\x7a\x3c\xbe\xc8\xa5\xb6\xdd\xb3\xa7\xf0\x36\x10\xe3\x89\x75\xaf\x52\xab\x22\xbf\x27\x1d\xb7\xca\xe8\xfb\x6d\xb6\xb0\xe1\xab\x41\x44\xd5\x57\xb3\xa9\xe1\xf9\xe6\x1b\x23\x5a\x5c\xf5\xad\xc9\x1f\x52\xd6\x08\xb6\x67\xed\xae\xaa\xcd\x5a\x31\x60\x02\x3f\xbc\xf6\x24\x74\xb6\xe7\x55\x48\x96\x87\x75\xef\xa5\xc7\x29\xbd\x36\x44\x8b\x7f\x98\x4e\x2f\x8f\xc7\x1b\x93\x4f\xa7\x97\xff\x57\xf4\x3f\x4f\x3e\xbc\x7b\xdf\xd2\xff\x7c\xff\xfe\xed\xef\xf6\xff\x1f\xf1\x13\xba\xfc\xa7\x3f\xfd\xf4\x5e\xcf\xd2\x7a\xab\x6f\x57\x45\x6e\x72\xfd\xcf\xbb\x55\xf1\xff\x9b\x57\xf1\xc3\xb6\x8e\x97\xd9\xbf\x44\x3a\xa9\x36\x45\x11\xe9\x8b\x2c\x5f\xd9\xf5\xd9\xf3\x89\x1b\x3a\x35\x16\x80\x58\x59\xa6\x40\x20\x32\xd0\xe9\x9a\x71\x72\x90\x01\x61\x9b\x4d\x6a\xf4\x4f\x65\x56\xd7\x86\x93\x69\xd2\xcd\x44\x1d\x29\x05\x57\x95\x94\x57\x69\xb8\xe3\xc8\xad\x4c\x64\xab\xde\x39\xec\x76\x8f\xef\x8c\x82\x3a\xe0\x3d\xde\x22\x31\x3b\xf1\xc3\x38\x33\x6c\x0d\xea\x7a\x93\xd6\x80\x89\x72\xa6\x66\x53\x16\x75\x31\x2f\x56\x4a\x52\x4b\x90\x9d\x9b\x5c\xf4\xe1\x7a\x2a\xb2\x66\xc6\x31\x1f\xa5\xa4\xbb\xa4\x53\x2a\x0b\xf6\x37\x4f\x07\x55\xf5\x80\x29\xf3\xa9\x81\x02\xc1\xe9\x83\x59\xad\x0e\x62\xa5\xfe\x1d\xe6\xc1\x89\x46\xff\x87\x52\xee\x44\x81\x61\x85\xdc\x25\x8b\x50\xd5\x05\x8a\xcb\x23\x32\xcd\xd7\x07\xfa\xd2\x05\x12\x44\xe5\x3c\x98\x82\xa8\x0a\xeb\xc2\x89\x0d\x15\x44\xa5\x18\x50\x24\xfc\x7d\xca\xc7\xd9\x8f\x50\x96\x88\x0b\x81\xb0\x16\x6c\xbd\x63\x4d\x70\x92\x83\xb2\xc6\xd0\xaf\x00\x7b\x3e\x20\x9e\xd3\xd1\x66\x04\x07\x53\xe5\xc0\xa6\xe9\x7c\x5e\x94\x0b\xd0\x40\x74\x83\xed\xc8\xf9\x3a\x40\xff\xa0\xc3\x85\x7a\x63\xcf\xac\x13\x05\x99\xf6\xcf\xa3\x1b\xf7\x08\xef\xfd\xaf\x0b\x28\x60\xa4\x68\xeb\xd1\x1c\xfd\xa2\x2b\x63\x28\x43\x8f\x47\x72\x9d\x66\xab\xca\x4e\x87\x1b\xfd\x9c\x8e\xd1\x00\xc9\xeb\xda\x09\x07\x87\x0d\x88\x8b\x8c\xa2\x21\xa0\x88\xe8\x39\x96\x95\xca\x28\xf1\xc6\x15\xcd\xd7\x1c\x86\xc5\x89\x0d\xae\x37\x76\xfb\xd5\x5c\x87\xfe\x60\x74\x9d\xae\xbe\xc2\x25\xee\xb6\xf6\x0c\x63\x8a\xa3\x11\xa4\x14\x46\x2b\x1e\xe9\x2c\x36\x71\x44\xba\xf0\x93\x69\x0f\x33\xdd\xda\x1e\x4f\x80\xc1\xc1\x59\x88\x1a\x97\x9d\xf0\xe5\xa1\x5e\x65\x77\x65\x5a\xee\xe8\xdb\x83\xf3\x64\xef\xd7\x33\x54\xb4\xc3\x2b\x03\x1b\xce\x81\x0e\x1e\x7e\xef\x3c\x99\xe2\xd7\x9e\x00\x25\x5a\xe6\xe9\x2a\x7a\xfe\x4d\x9f\xaf\xae\xc3\x17\x61\x82\x94\x65\xf1\x4c\xba\xb0\x87\x27\x88\x69\x7f\x1a\xe1\xd2\x11\x9d\x1e\xd2\x53\xfe\x6d\x95\xdd\x75\xbe\x38\x6d\xbc\x6e\x86\xa2\x27\xe6\xb8\xaa\x1e\x8e\x41\xff\xee\xf8\x01\x50\x8c\xb8\xa5\xbb\xfb\xcc\xdf\x9d\x4e\x3d\x0d\x07\xcd\x00\xfd\xe9\xea\xfc\xfd\x77\xf6\x7b\xd2\x7f\xc7\x64\x77\xf2\xa1\x94\x78\x46\x87\x52\x7e\xa6\xa3\xd3\x9f\x56\xc5\xd3\xd2\x7a\xcf\xaf\x7e\xf3\xbf\xcf\xb8\x5e\x68\x6e\x02\x13\x33\x72\xc4\x0b\x76\x07\x49\x52\x55\xd8\x6c\xe5\x6e\x53\x5b\xb7\x71\xf3\x90\xcd\x75\xba\xba\x2f\xca\xac\x7e\x58\xfb\x1d\x1c\x58\x5e\x60\x35\xc5\x90\x40\xaa\xf4\x31\x07\x3d\x62\x37\x0d\xa6\x48\xe8\x85\xeb\xf4\xcf\x45\xa9\xef\x8a\xe2\x6b\x55\x17\xa5\x89\x74\x05\xf4\x36\xd9\x32\x9b\x2b\x6a\x3c\x2e\x09\x96\x00\x42\x44\x17\x88\x0e\x3d\x65\xd6\x0d\xbb\x2a\xc0\x66\xf9\x76\x93\x81\xc0\xb5\x6e\xe2\xfb\x58\xa7\xb5\x3a\x20\xb8\xd5\xd3\xd3\x53\xec\x4e\xb7\x1f\xb0\x7b\x07\x04\x24\xc2\xd0\x27\xbc\xaa\x62\xaf\x59\x43\x37\xd7\x2d\xe1\x97\x14\xb3\x57\x95\x41\x08\x5e\x85\x04\x32\x54\x84\xe4\x52\x3a\x31\x8a\xa8\xe4\x76\x54\x88\xe1\xa2\x78\xca\x1b\xf0\x46\x84\x32\x30\x99\x4c\x13\xc3\x09\x76\x1e\x1a\x38\x2f\x72\xa4\x52\x99\x1b\x00\xfc\x95\x95\x59\x2d\x7f\xf1\x47\x04\x51\x3d\xc3\x55\x21\x02\x3f\xf9\x26\x67\x53\x54\x95\xa9\xac\x2b\xac\x80\xa8\xc4\xf9\x9f\x59\x45\xcf\x86\xab\x84\xda\x11\x75\xd0\x3d\x2a\xce\x80\x7b\x41\xed\x5f\x10\xf6\x40\x15\xf4\x3d\x24\xcb\x8c\x95\x1a\x8d\x3d\x09\x84\xfa\x94\xf4\x7b\x37\xd3\x04\x4b\x5a\x26\xe3\xcf\x93\xde\x95\xf6\xc4\x00\xe7\x8e\xb8\xa1\x7f\xd9\x9b\x7c\x4e\xa0\x58\x69\x02\x9c\x00\xe2\x29\x80\x94\x9d\x5d\x26\x8a\x1e\x10\x35\x2a\x50\xae\x93\xc9\xd5\x60\x36\x4b\xce\xf5\xa7\xdb\x46\x39\x4a\xcc\x34\x02\x5f\x2e\x93\x91\xaf\x8f\x52\xd3\x59\xcf\x7e\x7e\x30\xd2\x5f\x26\x03\xa8\x78\x41\x9e\x84\xeb\xdb\xc9\xe0\xf3\xe5\x4c\x5f\x8e\x87\xe7\xc9\x04\xca\xb3\x7e\xe0\xc2\x2a\xae\x6b\x62\x6e\x0c\xd9\x27\xc5\xd0\xbb\xe7\x31\x77\xaf\xa4\xc1\x50\x9f\x6e\x66\x50\xa4\x02\x75\x2b\xc9\xb9\x9e\x8d\xa9\x8c\x0b\x3f\x2b\x28\x31\xec\xf3\x3d\xd7\xc5\xc0\x71\x53\x5c\x0c\x66\xa3\x64\x8a\x25\x4f\x92\xf5\x42\x13\xeb\xc5\x5f\xc1\x71\x21\xa6\xb1\x45\x6f\x21\xff\xde\x60\xb6\x40\x2a\x8b\x2e\x56\x8a\xe1\xf0\x3b\x58\x29\x94\x1a\x8c\xec\xe2\x48\x7e\xb5\x53\x7f\x33\x1a\x26\xd3\xa9\x9e\x24\xff\x7a\x33\x98\x74\x2d\x00\xa8\xd6\xfa\x3c\x49\x60\x10\xe5\x7c\x7f\x19\x0c\x87\x0a\xc9\x28\xc2\x49\x8f\x42\x4e\x0d\xac\xd6\xfa\x72\x39\x86\xca\xa1\xab\xf1\xf9\xe0\xe2\x96\x97\xc5\x24\x71\x65\x72\xd8\x25\xee\x7a\x6f\x2a\x16\x65\xef\xd3\xd8\xf6\x3e\x28\x86\xb3\x43\x01\xa5\x58\x5c\xb7\xe4\x26\x1f\x6a\xcb\x3e\x27\xa3\x64\xd2\x1b\x76\xd6\xc5\xe9\xbd\x65\x71\xbd\xc9\x60\x6a\x9f\x60\xd7\x1f\xcd\xd5\xcd\x34\x51\x76\x8d\x8d\x78\x6d\xcc\x90\x88\x43\x36\xd6\x97\x16\xea\xf6\xba\x73\xf5\x72\xe7\xbd\x59\x4f\x41\x8b\x67\x3d\xfd\x29\xb1\x9f\x9e\x24\xa3\x73\xa8\x0a\x1c\x8c\x7a\xfd\xfe\xcd\xa4\x37\x4b\x7c\xd1\x9b\x9e\xde\x4c\x67\xbd\xc1\x08\x27\xc5\xf6\x17\x36\xf1\x60\x72\xce\xfb\x48\xc1\xd2\x74\x55\x76\xe1\xe2\x9a\x8d\xf5\xf8\x3a\x81\x47\xc2\x22\x13\x13\x82\x9f\x98\x1e\x85\x65\x75\x0a\x67\x4f\x07\xbb\xf5\x56\x5f\xf6\xa6\x1a\xea\xeb\x7a\xe7\xbf\x0e\xa6\xaf\x2b\xaf\xfb\x6f\x9e\xcc\xfd\x0d\x3f\xf1\x0f\xbd\xad\x8d\x66\xf2\xe5\x31\x22\x9a\xb3\x22\x3f\x3e\x8b\x4f\xfe\x96\xa9\x80\x17\xf1\x5f\xef\xde\x37\xe2\xff\xf7\x1f\x3e\x7e\xf8\x3d\xfe\xff\x47\xfc\xf4\x80\x18\x73\x63\xe0\x2a\xcb\xad\x00\x8c\xd4\x2f\x4a\x63\xb4\x43\x9d\x5f\x58\x0f\x0a\x3d\x1d\x1b\x6a\x56\x7a\x9b\x03\x9c\xdb\x2c\x84\xb3\x83\x69\xad\xcd\x4e\x22\x1f\xf0\x3e\xc6\x0b\x33\xd8\xc5\x96\xdd\x03\x19\x0e\xe9\x62\xbb\xa0\xd2\x67\xf2\xac\x37\xc5\x2b\x13\x5d\xa1\xdc\x18\xa4\xdf\xc6\x7b\xb2\x36\xd4\xd7\x86\x78\x9f\x21\x17\xbc\x6a\x62\xfc\x9f\x1e\x4c\xee\x15\x59\xfd\xfd\x0c\x94\xee\xcd\x1f\xb8\x21\x11\xdc\x42\xea\xfa\xa1\xd8\xde\x3f\xb4\xea\x35\x18\x47\xca\xcd\x12\x3c\x66\xf5\x83\x59\xe3\x25\xdd\x33\x8d\x38\xfc\x7c\x3d\x3c\x42\x1a\x5d\x04\xc7\x23\xf5\x26\xf8\x62\x5b\xaf\xaa\xb7\x4e\x6b\x53\xda\xd9\x60\xdd\x7b\x2a\x4e\x41\x44\x8c\x7b\x39\x79\xa2\xb1\x52\x7d\x53\x42\x6d\x41\xb3\xbd\xee\xa3\x14\x6e\x43\xfb\xa1\x7e\x00\x4a\x52\x1c\x41\x18\xc8\x62\x2c\xf4\x61\x96\x03\x38\xca\x3e\x6a\x9e\x02\x18\x6c\x61\x36\x06\x75\xfc\xc8\x67\xcf\xf2\xcd\xb6\x3e\xc2\x64\xf2\xbe\xb9\xfa\x42\x51\x1a\xfa\xc1\x80\x72\x5b\xa4\x75\x7a\xe0\xda\x87\x03\x55\x12\xd8\x6f\x6f\x4b\xa9\xe6\x15\xba\x03\x29\x6a\x1b\x0e\x83\xf2\xba\xf1\x9c\xbf\x5e\x20\x70\x61\xe6\x50\xba\x85\x01\xb3\xa7\xad\x48\x85\x74\x63\xc1\x0d\x26\x30\x0c\x26\xe0\x6d\x67\x9b\xcd\x76\x2f\xc4\x24\x6c\xf3\x7d\x46\x1f\xe4\x45\x7e\xdc\xec\x97\xeb\x47\xce\x60\xc1\x8c\x50\x7a\xd4\x1e\xfe\x92\x6f\x13\x0c\xa5\xbf\x84\xe0\x2a\xd4\xd6\x8e\xe4\xcb\x97\xcf\xd7\x43\x49\xb8\x29\xd3\x5e\xee\xed\x2c\x10\xc7\x60\xf1\x7d\xfb\x38\xd6\x5f\xec\xbe\xc0\x1a\x97\xaf\x2d\x0e\xdd\x6e\xda\x42\x7e\x4b\xe4\x6a\x63\xa0\x0c\x74\x41\xb1\xdf\x73\xed\x76\x24\x86\x75\x81\x81\x41\xeb\xf9\x69\x05\x82\xf4\x91\xfe\x3f\xc8\xf9\xf3\x7f\xf6\x7c\x8e\x79\x1d\x37\x45\x4d\xfa\xf7\x64\x77\x9a\xe3\x49\x2c\xb7\x62\x03\xc3\x62\x79\xa2\xef\x37\xe7\x83\x3f\x19\xc8\xd5\xd9\x7e\xda\x43\xa2\xa6\x78\x3c\xd6\x87\x83\x9c\xf6\xed\x53\x51\x2e\x2a\xc7\x50\x84\x51\x12\xc8\x48\xe9\x75\xf1\x68\x38\xe7\x06\x93\x05\xf0\x72\x46\xba\xb7\x17\x02\x83\x04\xe5\x2f\xe3\x23\xba\x11\x29\x43\xe1\xe0\x07\x2e\xd8\x76\xfd\x8f\xfc\x4d\x3f\xa1\xff\x05\xa9\xba\x4b\x89\x3e\x37\x39\xd0\xb4\xce\xd1\xfe\xff\xa0\xd7\xf3\xfb\x0f\xff\x00\xfe\xff\xd3\xed\xf1\xa8\x7f\x7c\xfa\xb7\xf5\xfa\xfc\xcf\xf3\xfe\xdf\xd9\xc7\x93\xf6\xfd\xcf\xd9\xef\xf8\xaf\x7f\xcc\x4f\x1f\xe4\x85\x1e\x0d\x48\xfc\x5a\x3b\xd4\xab\x1d\x76\xe5\x78\x54\xe4\x42\xf9\xf7\x34\x3e\xd1\xfd\x49\xd2\x03\x32\xca\xfe\xf8\xea\x6a\x3c\x9a\xda\xf8\xfb\x7a\x3c\x01\x02\x0d\x05\xb9\x99\x99\xee\x41\x74\x7d\x31\x98\x5c\x41\x9e\xe0\x7c\x9c\xe0\xef\x39\x39\x82\x5c\x36\x18\xcd\x27\xd3\xd8\x13\xca\x10\x9b\xc7\xec\x72\x30\x55\xe7\x93\xde\xc5\xcc\xf1\x8a\xba\x67\xc0\xfb\x13\xdd\x1b\xe9\xde\x6c\x36\x9e\x8c\x92\xdb\xe3\xfe\x70\x60\xe3\xfd\x49\x32\x84\x56\x4c\x2f\x07\xd7\x71\xab\x9d\x8a\x5e\x3e\x45\x0e\x10\xa4\x54\x21\xfe\x10\xe6\x2c\x3d\x76\x9c\xa5\xed\xef\xeb\xab\xde\x1f\x13\x99\x7a\xb2\x51\xea\x24\xf9\xdc\x9b\x9c\x73\x8a\x48\x3e\x93\x39\x52\x23\x1c\x01\x62\xa7\x9c\x36\xd9\x56\x28\x3a\x77\xe4\x2a\x0a\xc8\x55\x06\xb3\xa9\x8d\xc4\x63\xa5\x1c\x28\xc3\x3e\x1f\xc8\x68\x0e\x7b\x53\x7d\x9e\x5c\x60\xf0\x9c\x0c\xc7\x5f\x8e\x3a\x29\x59\x13\xa0\xbf\x9c\x3a\xb6\xcd\xf6\x70\xdc\x7c\x1a\x0e\xfa\x6e\x7c\x0f\x0f\xfa\xfd\xeb\xe1\x81\x0d\x91\x0f\xe8\x77\x07\x47\x98\x08\x82\xd7\xe2\x3b\x66\x49\x9f\x52\x69\x3e\x33\x82\xf9\x0e\xa2\x0b\x6a\x66\xd8\x6c\x68\x4e\xe4\x9e\xee\x51\xf8\xc9\xd9\xa5\x9d\xc2\x80\xdf\xd3\xd3\x79\x2a\x6e\x16\xbe\x16\xca\x81\x93\xf3\x58\xa9\x4f\xb7\x3a\xf9\x53\x32\xe9\x63\x32\x03\xc8\x50\x6d\x23\x5c\x7a\x0a\x5e\xe0\x06\xe3\x32\x99\x70\x6a\xa9\x0f\x99\x3e\xe0\xe5\xf9\x3c\x49\x12\x3d\x1b\xab\x4f\x89\xfe\x34\xbe\x19\x41\x77\xda\x03\xe6\xe8\x49\xed\x9f\xf0\x3f\xc6\x13\xfd\xd9\xce\xfc\x14\x1e\x69\x7f\x8f\x2f\x57\xfd\xf1\x88\xd2\x19\x98\xa1\x1c\x41\x12\x66\x70\x9e\x4c\x1c\x41\xcd\xed\xf8\x66\x42\xad\xe8\x8d\xfa\x89\xcb\x2b\xe0\x4b\x6d\xbb\xfa\xe3\xd1\xf9\x00\xd6\x2f\x55\x9a\xc7\xfa\xdc\x2c\x81\x21\xac\xc8\x2b\xa5\xd2\x58\x1f\xf4\x0b\x10\x2a\x64\xba\x69\x2e\x04\x4f\xa9\xa4\xc3\x2b\x5a\x21\x83\x1d\x60\x58\xb2\xaa\xda\x82\xdc\x4c\xfd\x50\xac\x8a\xfb\x9d\x2e\x4a\x65\xf2\xf9\x6e\x0e\x60\x88\x2c\x15\xb5\x9c\x0e\xce\x9e\xe5\xe0\x41\x59\xcf\xa2\x34\x20\xed\x23\xa5\xea\x51\x26\x3f\x5d\x15\xf9\x3d\x5e\xd3\xa5\xc4\x65\x0e\x4c\xf3\xa4\xdd\x90\x7b\x36\xfc\xc8\xc7\x30\x10\x6f\xb1\x1e\x37\xde\xec\x60\x88\x01\xe2\x82\x45\xf9\x95\xe1\xf9\xc4\x65\x1c\x61\xdd\x68\x55\x99\xf5\xdd\x0a\x6e\x18\xac\x0b\x09\x8a\x2f\x34\x0e\x4f\x0f\xc5\xca\xc4\xba\x87\x57\xb6\xcd\x88\x49\xa5\xba\x31\x66\x98\x50\x27\x28\x1f\x44\x18\x0b\x80\xf0\xa5\x4d\x2e\x6f\x7d\x98\x7a\x7a\x1e\xb8\x0f\x3c\x52\x5c\xf2\xc1\xd5\x32\x1d\xc4\xf8\x77\xb1\x3e\x68\x3c\x29\x9c\x26\x7d\x07\x9e\x39\x50\x26\xba\x01\x2f\xca\xc6\x2f\xd2\x7c\xa1\xb8\x06\xd4\x1c\x9b\x6f\xc4\xfd\x03\x43\x24\x27\x1a\x2a\x0a\x58\x27\x60\xbd\xad\x60\xca\x05\x65\x63\xa4\x17\x65\xba\x4e\x6b\xe2\x6b\x88\xd4\x12\xaf\x20\x52\x66\x70\x88\xf4\xba\x00\x4f\x70\x93\xcd\xa5\xe8\x74\x64\x43\x31\xb8\xb6\x98\x83\x78\xc0\xbd\x9d\x8a\xda\x95\x36\xe0\xc3\xd2\xbb\x32\x43\xd4\x27\xcc\xf1\xc2\xe4\x15\x3d\x94\x6e\x28\xb0\x0b\x20\xa0\xd4\x5e\x65\x54\x8c\x5c\x9a\x79\x5a\xd5\x91\x82\xae\x20\xb1\x0d\x7e\x7f\x91\x6e\xa0\x50\x82\x39\x67\x50\x8c\xb2\x73\x9e\xb5\x9c\x67\xf5\x7d\xf3\xdc\x98\xd4\x8e\x39\x9d\xc7\x4c\x09\x50\x94\x9e\x7c\xc1\x34\xb0\x6d\x44\x31\x03\x4d\x2b\x90\xa6\xdc\x75\xf5\x05\x71\x66\xa7\x84\xba\x88\xf5\x81\x2b\x3a\xed\x01\x02\xfa\xc5\x17\x3e\x3d\x14\x8e\xa9\x5e\x14\xb6\x98\x98\x8a\xcb\xc4\xf7\xdd\xed\x3f\x84\xb2\x1d\x45\x6a\xac\x1c\xd6\xa8\xa5\x6e\x91\x86\x2b\xb5\x8c\xf5\xc1\x6d\xb1\x75\x6b\xbb\x89\xf4\xa3\xc6\x91\x60\xaa\x60\x01\x68\xf3\x84\x28\x2c\x36\x24\x65\xc0\xd2\x3c\x66\xa8\x10\xf5\x98\x15\x2b\xd7\xab\x6e\xed\x90\x06\x39\xaa\xe2\xfe\xc3\x02\xe2\xc7\x3a\x19\x4d\x06\xa1\x8b\x6c\x95\x8b\xc7\x78\x7e\xa5\xca\xab\xda\x4f\x6d\xb2\x30\xd5\x26\xab\x51\x19\x18\x1b\x4c\xcd\x45\xc6\xbf\xb3\x58\x5f\xa4\x59\x09\xd7\x7c\x58\xe8\x1f\x6b\xa6\x25\xe1\x5b\xd2\x95\xa7\x6b\x70\xfc\x24\xa0\x78\xb1\xd8\xce\x4d\x84\x4c\x09\x24\xb2\x42\xcc\x3f\x82\xf2\x33\x80\xbd\x2f\xed\xab\xb6\x95\x89\x88\x9c\xb3\x02\x1a\x1c\x96\xfe\x17\x94\x0b\x8a\x4c\x0c\x90\xe1\x54\x76\x07\xb0\x92\xdf\xb2\x51\xa0\x07\x22\x56\x5d\x75\x60\xee\xb9\x0d\xd6\x27\xd4\xf2\x77\xe3\xf3\xb9\x04\xea\xd9\x69\xc8\xc1\x41\xf4\x62\xf9\x02\xac\x45\x56\x07\x78\x1d\x27\x51\xc1\x53\xc1\x4a\x75\x00\xd6\x47\xc1\xa1\xd4\xdf\xf4\x46\xcc\x56\x7b\xbc\x2c\x0d\x08\x2e\xe5\xc7\xae\x5f\x11\x97\xbb\xa5\x2b\x7d\xc8\x14\x15\x8b\x6d\x19\x50\x0d\x89\x0e\xb8\x2e\x1e\xb9\x69\xe9\x56\xfb\x65\x72\x7f\xd6\x14\x02\x35\x68\x3a\x1f\x7e\x86\x43\x1a\xa6\x90\xea\xbf\xb4\x5f\x8f\xa0\xe6\xe4\xd1\x99\xe2\xa8\x6d\xe8\x15\x36\xec\x98\xaf\x28\x68\x3f\xd5\x36\x40\x3c\xd4\x21\x39\x1a\x47\x5e\xf5\x0b\x9b\x97\xbb\xd8\x6b\x62\x33\x0f\x01\x3d\xb3\xa9\x64\xf1\x0b\x98\xbd\x90\x83\x87\x12\x19\x45\xa9\x37\x0f\x45\x5e\xe0\xd1\x60\x27\x10\x92\xbd\x9b\x15\xcb\xa9\xcc\x57\x3b\x98\x00\xb0\xfb\xee\x37\xc8\x2a\xdc\xf8\x2d\xd6\x9f\xa5\xb8\x0c\x52\xbd\xc8\xee\xb3\xda\x9e\x60\xdb\x45\x56\x70\xb9\x1c\xe5\x95\xfd\x88\x71\x0d\x46\x47\xf7\x3b\xba\xbe\xf8\x6f\xd5\x8d\x8e\x71\x06\x26\x2c\xa0\x86\xa0\x35\x46\x07\x23\x2f\xbf\x05\xcb\x17\x93\x5e\x3f\x16\xee\xae\xd3\xda\xdf\xe4\xe7\x05\x4a\x01\x83\x5c\xb7\x53\x30\x06\x42\xe2\xca\x2c\x88\x6c\x4b\xbe\x82\x25\x07\xeb\x40\x1b\x05\x55\xaf\xe6\x0f\x0d\xc9\x88\x14\x01\xac\xb5\x99\x3f\xe4\xc4\xa9\x1c\xd0\xcc\x75\xef\x13\x32\x3f\xad\x46\xc7\xca\x63\x06\xc1\xe4\x7b\x92\x2e\xc1\xc2\xea\xec\xb1\x7d\x33\x19\x82\xd2\x73\xa5\xbc\x8b\xf5\x24\x00\x54\xcc\x84\x86\x1d\x3f\x46\x0a\x38\x51\xf7\x03\x4e\xb0\x75\xba\x30\x4a\xd0\x04\x39\x82\x1a\x9f\x39\xdd\x5b\x92\x93\x76\xa9\x04\x46\x7e\x41\xd0\x4a\x12\xbf\xa1\x35\x03\x47\x93\xf8\x18\xac\x94\xd5\x4e\xf1\x92\xf2\x3e\xe1\x5e\x52\x13\x69\x2c\x99\x63\xab\x21\x21\x4e\x24\x43\x11\xe3\xe4\x6f\xf2\x0c\x9e\x3e\x31\x94\x61\x1f\x70\x39\x7a\x89\x5a\xab\xed\x63\x15\x84\xe5\x14\x3e\x28\xd8\x2a\x6c\x3f\xa1\x95\x20\xb4\xf8\xaa\x01\x50\xcf\x0f\x00\x8f\x8f\x1f\x57\x54\x36\x59\x22\xcf\x3e\xe8\x9f\x79\xd1\x02\x77\x94\x7d\x71\xee\x20\x56\x5c\xc9\xf3\x72\xbf\xdf\x50\x34\xa4\x0a\xab\x37\xca\x2d\x62\xea\xdd\x3e\x59\x88\xb0\x7d\x5e\x8d\x41\xf8\x5e\x6e\x3e\xbe\x1a\xb3\x61\xc8\x38\x11\xc1\x01\xa5\x09\xb4\x17\x84\x00\x5a\x8c\x81\x64\xec\xe1\xbc\xca\x2a\x00\xec\x98\x52\x28\xa3\x66\xa6\x0a\x5b\xf0\x9d\xab\x4f\x3d\x3b\xf8\x7e\x48\x9d\xa4\x1c\xec\x7a\x1b\x39\x42\x68\xb1\x36\x69\xb5\x2d\xa9\x0b\x8a\xe0\x9e\x3a\x85\x82\x75\x56\x3b\x92\xcb\x03\x80\x77\xeb\x34\xcf\x11\x44\xd7\x60\x0b\xdd\xeb\x60\xea\x1e\x83\x3c\xa5\xed\x12\xd7\x1e\xcf\x1c\x81\xed\x98\x2f\x82\x0a\x33\x22\xad\x20\x0d\x4b\x2a\x34\xeb\x3a\x2f\x75\xba\x49\x09\x67\xe7\xcf\xfa\xac\xae\xcc\x6a\xc9\x8a\x3a\xe9\xa2\xc5\x2f\xd6\xed\xd8\x87\x7a\x50\x5d\x4d\x83\xb8\x4f\x2a\x22\xd8\x41\x77\xd6\x8f\x97\x52\xd4\xd2\x8d\x4b\xe7\x35\x3a\x2f\x11\x61\x40\x85\x48\x51\xb3\x3f\x80\xcc\x02\x29\xcc\x39\x4a\xfa\x59\x1b\xef\xde\x41\x9b\x81\xe3\x0e\xf5\xff\xb2\xf7\x6e\xcb\x6d\x23\xd9\x9a\xf0\x5c\xe7\x53\x64\xf0\xa6\xa4\x08\x88\xb6\x5c\xa7\xae\xf2\xc4\x8e\xa0\x25\xda\xe6\xde\x3a\x78\x8b\x52\xd5\xf8\x6a\x26\x49\x26\x45\xb4\x41\x80\x8d\x04\x24\x73\xae\xe6\x1d\xf6\x53\xcc\x6b\xcc\xa3\xec\x27\xf9\x23\xd7\x21\x73\x25\x00\x4a\x76\x75\x75\xf7\x4c\xff\xa5\x88\x8e\x2e\x4b\x24\x90\xe7\x5c\x87\x6f\x7d\x1f\xfa\x1d\x99\x36\xc8\x3a\x04\xe5\xfe\x5d\x61\xab\x9e\x1b\x35\xdc\x11\xf5\x55\x1d\xd1\xdd\x8e\x74\xde\xa1\xbe\xae\x23\x7a\xb0\x23\xe0\xa2\xcb\x0d\x14\x36\xbe\x48\xd3\x75\x36\x3f\x11\xeb\xf7\xef\x13\x45\x79\x44\x5a\xe1\x58\x98\xe3\xf4\xae\xce\xb7\xa6\xce\xa1\x2e\x8a\x2c\xfb\x35\xb6\x0f\x71\xd2\xf0\xc8\x47\x53\xaf\x44\xd9\xbe\x32\xab\x07\x53\x36\x40\x35\x09\x1c\xe3\x0f\x7e\x9c\xb7\x55\x69\x1b\x7f\xcd\x2e\xab\xed\x8e\xdd\x6b\xdc\x13\xf6\x33\x25\x9a\xe4\x7e\x5b\x07\xf3\x3c\x98\xb4\x04\x67\x77\x89\x8d\xc2\x16\xca\x3a\x2f\xec\x89\xdb\x98\x9a\x32\xe3\x91\x75\x20\x50\x57\xaa\xd4\x81\xc6\x1d\xf0\xe5\xfd\xd2\xb2\x5f\xea\xc9\x7e\x25\xaa\xb6\x16\xcb\x8a\xcb\x2a\x28\x51\x10\xc1\x3c\x7f\x55\xc9\xaf\x22\x0d\x5f\x59\xd2\xf4\x84\xd3\x45\x0e\x52\x6f\x44\xd0\xb5\x67\xea\xac\xbf\xd1\x2d\x8e\x81\x90\xae\xd9\x87\xd2\x31\xa9\xad\x2a\x34\xd9\xfc\xc5\xa1\xc4\xc5\x11\x5d\x30\xbe\x42\x38\x6a\xc1\xd1\x22\x44\xff\x0f\x2c\x7f\x8d\xe5\x63\x4a\x70\xb3\xd0\x0e\xf4\x96\x59\xbb\x05\xc7\x03\x96\x05\x89\x08\x13\x5b\x24\x91\x43\x2c\xab\xf2\xc1\xee\x19\x2e\x5f\x9a\xad\x55\x47\xbe\xeb\xce\xb6\xab\xaa\xdc\x6f\x81\xfc\x31\x38\x52\xc7\x3d\x52\x2e\x6a\x44\xbe\x06\xfc\x72\x91\xdb\xd5\x6b\x3c\x2e\xf3\xa6\xb0\x2a\xb9\x2a\xe4\x47\xc8\x93\x01\x76\x39\x30\xa9\x7b\xc7\x8d\xd1\x5c\x47\x87\x96\xcc\x1e\x55\x1f\xec\xd0\x15\x34\x70\x96\xe8\x23\x3b\xbe\x1f\x67\x7a\xf4\xd6\x1f\x26\x1b\x19\x48\x63\x02\x32\x96\xaa\xed\x9e\x27\x23\x0d\xd5\x1a\xcb\xda\xda\x12\xbc\x05\x8c\xe8\x01\x81\x12\x7d\xb2\xfb\x55\x3a\x53\x47\xc7\xa4\x49\x4a\x4d\x27\x43\x3f\xdf\xee\x50\x1e\x22\xaa\x61\x8b\xd9\xc2\xb3\xe5\x75\xd8\x1b\x99\xda\x70\x21\x02\x9e\x37\xcf\x0c\xd5\xc0\x52\xcb\x00\x6e\xad\xb7\x79\x99\x6f\xdb\xad\x72\xa2\x49\x10\x36\x23\x5c\x0b\x6a\x5d\xc4\x38\x1e\xd4\xc2\xd4\x58\x71\x16\x63\x46\xf4\x45\xfc\x8e\x0b\x54\x23\x7c\x26\x06\x8e\x66\x03\xe0\xe9\x6d\x5e\x02\xe7\x0c\xe5\xaf\x9f\x78\x30\xd5\x49\x06\x41\xd2\x1b\xae\xe0\xe6\x4a\xfb\x5f\x83\x45\x04\x1b\xe0\x3c\x9a\x4b\xea\xcd\x1e\x2d\x47\x5e\xb7\xe1\x6c\xa4\x02\x55\x02\x48\x0c\x44\x76\x62\xf8\x41\x10\x80\x43\xa7\xc8\x00\x3b\x40\x59\xc5\xdf\xfa\x46\x30\x57\x05\x79\xa2\x30\x97\xc0\x65\x53\xef\x7f\x8e\xf7\x22\x64\xf2\xa1\xf0\x27\xd1\x61\x12\x24\x35\xa9\xaf\x05\x57\x12\xfc\x8d\x75\x0b\xe9\x1b\x51\x9f\x82\x4c\x48\xe4\x80\xc5\x8f\x9a\xc7\x75\x5b\xe8\x2f\x35\x71\x15\x33\x37\x90\xee\x3b\xa3\xbb\xa3\xde\x3b\xeb\x27\xc1\x52\x85\x30\x0c\xd4\x0e\x01\xd1\x7c\xe1\xaa\x3a\xd4\x20\xa9\xb5\xf5\x7f\xa8\xad\x83\xc8\xa0\x4b\x03\xc3\x74\xb2\xbb\xd7\x70\xa1\x41\x67\x83\x81\xc6\x32\x28\x69\x60\x0a\xc2\xc4\x2b\xbb\x35\x7e\x11\xe3\x64\xe6\x0d\x47\xc5\x90\x05\xa7\x2a\x21\x4e\xc5\x91\x2d\xf9\x3e\x8a\x6d\xe1\x3d\x02\x75\x4f\x0a\x49\x92\x91\xda\x86\x49\x80\x57\x76\x6d\xb6\x74\x23\xe5\xe5\x83\x61\xe4\x0b\x5c\x5e\xcb\x7d\x0c\xad\x35\x00\xd3\x68\xfd\x74\xfd\xb9\xad\xf7\x8a\xea\xad\x62\x45\xd5\x3e\x80\xcc\x27\x73\x86\x76\x5f\x7c\xd4\x11\x62\x9e\x8a\x27\x0a\x99\x0e\x45\xc8\x64\x01\x4b\x06\x54\xf1\x21\x30\x73\x96\xe4\xea\x02\x86\x1e\x72\x9b\xea\x69\x3d\xc6\x59\x94\xcd\x18\x82\xa2\x0b\x20\xba\xc4\xa1\x0f\x89\x69\xf8\x47\x88\x87\xa6\xe9\xd1\xb3\xeb\xab\xdb\xe9\xd5\x2d\x3c\x0f\x31\xc1\x67\x1f\x29\x31\xa8\x7c\xbb\x41\x53\x55\x5f\x84\x68\xa5\x3f\x50\x2f\x02\xfb\x32\x8f\x63\x0a\xef\x7f\x62\x3c\x40\x84\x83\xbe\x24\x73\xad\x8c\x84\x86\x4c\x6b\x4c\xc7\xde\x5e\xeb\x89\xc0\x20\x77\x05\x2f\xd4\x9b\x9b\xe9\xe4\xec\x7d\x48\x64\xc6\x4e\xce\xae\xf4\x1c\xf1\xe7\xfa\xfb\x4c\x4b\x00\xfa\xaf\xb3\x8b\x8b\x98\x3a\x0c\x18\x6f\x45\x18\x6f\x98\x9a\x8f\x89\xb0\x4b\x50\x3f\x19\xd2\x3c\x49\x91\xdd\x99\xfe\x70\x77\x35\xbb\x9d\xfd\x02\x20\xee\xe9\x7f\x9b\x5e\x7e\xb8\x98\xdc\x7c\x3c\x0c\xf8\x4e\xd7\x19\x01\xc0\x65\x62\x16\x31\xd3\x6a\xf6\x36\xb6\xf9\x37\x21\xa4\x49\x4e\xf4\x56\x88\xe3\x28\xf3\xbb\x6a\x2f\x82\xa7\xe1\x37\x1a\xc9\x28\xb2\x68\xcf\x13\xe2\xe7\x63\x3d\x0b\xe9\x09\x17\xf2\x13\xb9\x75\x2a\x30\x1d\x86\x34\xc1\x97\xd8\x6a\xe8\xa3\x44\x25\xb2\x46\x88\x2a\x64\x3a\x5c\xd0\x21\x09\x05\x6f\x40\xed\xc4\x58\x9d\xc9\xdd\x5b\x45\xbb\x17\x2e\xc5\x98\x49\x01\xed\x34\x6e\xaa\x10\x5a\x5c\xb7\x45\x31\x40\x3b\x5d\xb9\x28\x02\x35\x8e\x6a\x4a\xa7\x99\x7e\x95\xa9\xef\x33\xfd\x43\xa6\x7f\xc4\x90\xd1\x9f\xb0\x69\x5f\xac\x05\xe9\x9d\xa6\x4e\x30\x1f\x7d\xf2\xa1\x90\x7e\x26\xef\xa7\x64\x72\x75\xee\x54\x1a\x99\xd7\x5f\x1a\x99\x97\x57\xe2\x31\x64\x53\x7c\xa7\x81\x5a\x8e\x2d\x3f\x22\xb8\x15\x17\x38\xc4\x0b\x3b\x0a\xd0\x7c\xf7\x77\x92\x73\xc8\x49\x6b\xcb\x46\x85\x80\x0e\x2e\xa4\x1a\x45\xf0\xab\x5d\x0a\x1b\x8e\xc6\x37\x26\x66\x9a\x7c\x6b\x85\x91\xc6\x6b\x40\x85\x5a\x3a\x98\x5a\x5b\x04\x0f\x85\x56\x06\x32\x6d\x34\x55\xd4\x01\x4c\x02\x21\x47\xf2\x02\x8b\x4d\x43\xaa\x36\x2c\x16\x44\x1a\x0b\x41\x11\x0c\x2e\x5a\x16\x06\xfe\x40\x0c\x51\x45\x2d\x68\xc3\xe8\xcd\x18\x00\x84\xf5\x45\xec\x04\xbc\xe0\x90\x6a\x0f\x00\xb1\x28\xf4\x49\xa8\xc7\xb8\x90\x55\x4c\x89\xb0\x66\x1e\x8a\xb1\x5e\xe6\x6e\x69\x8b\xc2\x94\xb6\x6a\x11\xcc\x00\x92\xe9\xa0\xa2\x9e\x86\x10\x9f\x8e\x0e\xa6\x8e\x55\x37\x59\x92\xa5\xa9\x3c\xce\xc2\x56\x69\xb0\x0f\x4a\x41\x43\x92\x47\xc4\x5b\xe1\xbf\x9d\x77\x71\x06\x13\x55\x04\x19\xed\xae\xeb\x44\x91\xb0\xbf\x6b\x7e\x63\x3f\xfb\x1e\x8f\xfa\xfa\x7e\xa5\xfe\xc8\xdf\xa2\x83\xe8\x3f\x3f\xab\x71\xe3\xad\xa8\x22\x07\xce\xa4\x44\xe3\x86\x95\xeb\xc3\x7e\x57\x28\x20\xd3\x48\xe5\x0c\x5c\x6b\x80\xca\xf5\x0f\xc9\xd1\x5e\x0b\x4f\x21\x2d\x08\x32\x69\xe1\x88\x5c\x01\x16\xa5\xab\x61\xdf\x0d\x9b\xb3\x95\xbb\x6e\x41\x62\x85\x35\x5a\x53\xf1\x4a\x0e\xd0\xaa\x50\x76\xde\xd5\xe5\xd1\x7d\x5d\x1e\x76\xb0\xd1\xbf\xea\x49\xf3\xa8\x24\xd7\x12\x1f\x84\x63\x04\xfb\x4b\x08\xf6\x40\x06\xeb\x0a\xd5\xe6\x30\x34\x74\x68\xa0\xbb\xd2\x16\x8f\x06\xee\x33\xa4\x3c\xa7\xcb\x12\x04\x4b\x2c\xcf\x2b\x6d\x60\x68\x07\x7c\xba\x66\x53\xd8\x37\x38\x3c\x4f\x48\x7b\x02\x41\x29\x14\x0f\x28\x31\x50\x7b\xae\x24\xd8\x98\xfa\x9e\xab\x96\x87\x9f\x8a\xd0\x84\xc4\x1a\xe8\x96\x38\x20\xee\x48\x08\x2d\xb1\xfc\x89\x9c\x17\xff\x0a\xd5\xd1\x45\x85\x65\x4e\xcb\x17\x2f\x1c\x08\x95\xd5\x96\x08\x0b\x04\x1d\x69\x5e\xde\xbb\x4c\x70\x09\x28\xe9\xf0\x91\x40\xc1\x90\xf4\x2a\x7a\x64\xfe\xdc\x0e\x62\x17\xf8\x9e\xb0\x3b\x61\xd4\x14\x21\x4f\x16\x00\xa2\x41\xde\xce\xc0\x32\x63\x0a\xc9\xec\x0e\x67\xf9\xd6\x3b\x53\xa1\x9a\x04\x69\x7d\xb7\xdb\xb6\xa4\x1c\x9c\x62\x73\xa3\x33\x72\x82\x96\x2c\xc0\xb3\x78\x59\xc3\x0a\x04\xa1\xd6\xc0\xb2\x11\xba\xab\x12\xfd\x89\xaa\xe6\x34\xd2\x58\xa9\x1e\x1e\x94\x58\x72\x4d\x9c\xe8\xfe\x56\x42\x86\xdc\xb2\x0a\xa4\x7e\x40\xed\xe4\x2a\xb8\x01\x0f\x84\xe6\x90\x2a\xb6\xf7\x3a\x89\xdb\x21\xce\x3f\x3a\x80\xaa\x9a\x84\x38\x6b\xd6\x7e\xe1\x12\xe8\x66\x63\xbd\xcf\xd9\xe5\x06\x8c\x6d\x18\x50\x31\x52\x11\x17\x81\xa5\x20\x58\xb3\x93\x31\x48\x1e\xbe\x02\xb1\x25\xa6\xae\xa2\x32\x6b\xa8\x36\xe8\xd0\x0f\x76\xfa\xc8\x63\xc4\x02\x98\x5d\x6b\x85\x52\x8b\xb5\xbd\xaf\xe0\x5f\x8f\x95\x3e\x7a\x75\xac\x61\x5f\x96\x4b\xeb\x32\x95\xaf\xfb\x23\xe3\xef\xfb\x98\xbc\x94\xec\xd7\x98\x9b\xa0\xe3\x3b\x86\x16\xd8\x9a\xce\x54\x38\x50\x91\xd3\x3b\xc6\x19\x40\x6b\x20\xb8\xf5\x4e\x46\x32\xc6\x4a\x4d\x11\x79\xb5\x0e\x02\xbe\x54\xed\x15\x91\x52\x24\x82\x10\xb4\xaf\x02\x05\x58\x20\x50\xc2\x18\x9c\x53\x61\x5b\x0a\x21\x85\xb3\x0f\x17\x99\x2e\x89\x17\x1c\xe7\x15\xa6\x9f\x88\xfb\x75\xf0\xf5\xf5\xa8\x3b\x1a\x40\x99\x82\x91\x32\x02\x09\x85\xcf\x56\xb5\x2e\xaa\xfb\x0a\x84\xb2\xfa\xab\x2b\x6e\x0e\xd4\xf1\xa4\xbd\xc1\xe7\xe2\xd0\xb7\x90\x68\x06\xe3\x29\x60\x50\xb1\x85\x84\x47\x63\xc7\x0e\xef\xed\xa0\x6f\xfc\xdb\xca\x93\x65\x5b\x7b\xf3\x52\x34\xb4\x75\xa0\x93\x12\x68\xa2\x20\x53\x41\x31\xc1\xc0\x49\xae\x2a\x04\x63\x3e\xda\x85\xcb\x1b\x9b\x06\xe9\x21\x11\x15\x89\x15\xc0\x31\xa2\x54\x07\x65\x51\xbc\xe1\xe1\x67\x26\xdf\xda\xa1\xcd\x4d\x6f\xf3\xa6\x9e\x81\xf8\xbd\x50\xa2\xa1\xcf\x2e\x69\x10\xaa\xfa\xfe\xc5\x1f\x95\x20\xff\x74\x3f\xe3\x17\xde\xf3\xf1\xeb\xf1\x1f\xc6\xff\xf8\xf2\xf4\xbb\xd3\x6e\xfd\xc7\x77\x2f\xbf\xfb\xa3\xfe\xe3\xef\xf1\xc3\x60\xf3\x7d\xd5\x02\x55\x0a\xd1\x32\x22\x41\xac\xe1\x4c\x7d\xde\xc0\xe7\x5e\x8d\xf5\xcc\x9b\xb9\x2d\xa5\x4b\x3b\x82\x6c\xeb\xc0\xca\x18\x29\x49\xfe\x38\x31\xfe\xef\xfe\x19\xbf\x28\xf2\x85\xf3\x17\x50\xfb\xf9\x6f\x55\x01\xf6\xcc\xfe\x7f\xf5\xf2\xf4\xbb\xce\xfe\xff\xee\xd5\x8f\x7f\xec\xff\xbf\xcb\xcf\x2d\x1a\xaa\x40\xad\xa4\x8f\xe2\x5a\x38\x0e\xca\x28\x41\x4d\x85\x79\x9d\x90\x5f\x0c\x19\xa5\x63\x4e\x7d\xac\xd4\xaf\x6c\xfd\x4f\x11\x88\x5b\x95\xfa\xa4\xf7\xa3\x94\xd0\x84\xdc\x30\x5b\x9a\xa4\x12\x37\x1d\xfd\x82\x62\x2f\xd8\x3b\x99\x80\x09\x00\x48\xde\x7c\x01\xdb\x25\x2f\xf5\x68\xd1\xde\xbb\x11\x94\x6d\x24\xc4\x6c\x91\x9a\x0a\x00\xf4\xad\x6b\xea\xfd\x31\x85\xbc\x4c\xa3\x31\x0d\x0b\xfe\xda\xba\x2d\xd1\x7e\x37\x11\x92\x8d\x58\x0b\xd9\xba\x60\xc8\x8e\xfc\xc7\xdc\x68\xac\xaf\xe6\x93\xe0\x01\x21\x3e\x94\x15\x6f\x82\xb5\xce\x58\x2e\xe7\x8d\xef\x4c\x80\xb9\x32\xfe\x50\xc6\xc4\xe8\x19\x52\x4e\x35\x55\xbd\xef\x08\x41\x0c\xf9\xa3\x62\x4e\x82\x87\x53\x56\x25\x67\xcf\xb6\x2c\xf0\xd1\x6c\xac\xea\x30\xaf\xe7\x58\xc0\xe2\x07\x79\x63\xca\x86\x23\x29\x00\xd5\xcc\x1b\x10\xc2\x05\x8f\x0a\x5d\xee\x65\x5b\x98\x3a\x50\x2f\x2a\x25\x13\x35\xeb\x98\xa8\x19\x98\x70\x9a\xf5\x1e\xcb\xbb\x1f\xb6\xe8\xe4\x75\x9c\x37\xd9\x9f\xa2\x72\x08\x5a\x31\x8d\xc9\xfc\xbf\x1a\xb5\xab\xab\x75\x8e\x19\x3f\xcc\xbf\x2e\x51\x1a\x27\xa4\xe6\x06\xbc\xb8\x2c\xf5\xe1\x58\xeb\x54\x09\xa5\xd3\x83\xb4\xf2\x71\x05\xd0\x15\x47\x2e\x4a\x6d\xab\x75\x8c\xf5\x2e\x0d\x2c\x36\x70\xaa\x4a\x4a\x05\x82\x67\x9a\x08\x89\x6a\xda\x72\x61\xfc\x38\xe7\x5e\xec\x91\x7e\x22\x5f\x2b\x3f\x36\x81\x0c\xce\xac\x00\xc6\x1b\x14\x66\x2a\x17\x25\x50\xd7\x18\x66\xc1\x76\x23\xb0\x29\x65\xe4\x35\x8d\x62\x4e\x2f\x23\x53\xd1\xa6\x28\xaa\x28\xbd\x5b\xe7\xee\xd3\x1f\xc6\xfd\xff\x1f\x7f\xc6\x2f\x22\x77\xe3\x7f\x7f\xf7\xe1\xe2\xf7\xe6\xfe\xf9\x2f\xcf\xde\xff\xdf\xbd\xfa\xf6\x55\xb7\xfe\xfb\xbb\x1f\xbf\xfd\xe3\xfe\xff\xbb\xfc\x00\x5f\x0d\x72\x8a\xe9\xb4\x28\x58\x29\x52\xc6\xd5\xaf\x32\xcd\xd2\xfc\xa7\x4a\xa5\x62\xa7\xa7\x3f\xfd\xe9\xa7\x0c\xfe\x72\x90\x66\x24\xd3\xb3\x72\x39\xd6\x4a\x7d\xef\x3f\x63\xca\x4f\x45\x5e\xea\x79\x53\x5b\xdb\x64\xfa\x6d\xbe\x6e\x36\xfa\x6d\x51\x55\x75\xa6\xdf\x54\xae\xf1\x9f\xbf\x9c\xe8\x97\xaf\x4e\x4f\x5f\x9e\x9c\x7e\xfb\xf2\x34\xd3\x77\xf3\x89\x52\xd3\x07\x5b\x83\x54\x47\xee\x44\x2c\x86\x69\x3f\x3a\xd4\x25\x0f\xb6\x5e\x98\x26\xdf\x86\x62\x8f\x75\x12\x91\x53\x4c\x47\x8e\xd0\x60\xc0\x08\xa2\x24\x7d\x08\x77\x16\x45\xf5\x08\x46\xcd\x87\xda\x9a\xed\xa2\xb0\x44\x0a\xc9\xd9\xdb\x35\x14\xec\xb8\x26\xde\x0c\x5d\x66\x9d\x06\x28\x55\x1e\xcd\x1e\x59\x35\xd6\xb5\xb5\x2b\x7f\x9b\x54\xda\x6d\x80\x1d\xb3\x5c\x31\x57\x48\xde\x00\xd5\x3b\xca\x8b\x03\x48\xf6\x69\x26\xa1\xb4\x66\x4c\xdd\xb7\x06\x72\x35\x76\xf8\x4d\x5a\xbc\xc9\xff\x2d\x34\xf9\xe4\x24\x66\x22\x10\x0b\xad\xa4\xa5\x03\x9f\x85\x7b\xb9\x28\x98\xec\xb5\x76\x74\x7f\x1d\x68\x59\xc4\x68\xab\x6d\x15\x09\x7e\x0e\x2d\x8d\x6f\x84\xe5\xc7\xca\x29\x11\x1e\x44\xa6\xde\xe3\xa6\x72\x56\xb1\x20\x8c\xb7\x0b\xf3\x06\x59\xf3\x71\xce\xc6\xfa\x68\x5e\x05\x56\xe5\x83\xa4\x55\x81\x96\x34\x77\x68\x2e\xc4\x32\x0f\x3f\xd4\x17\xd6\x39\x5b\x1f\x1c\x71\xa4\xa0\x1d\x1f\x23\x0a\xda\x94\x78\x61\x2b\x6c\x49\x42\xa8\x9f\xe9\xa6\xaa\xbc\x35\xbc\xb1\xa5\x7e\x04\x69\x64\x03\x85\x96\xc9\xd8\x23\xd5\x7c\x6d\x11\xd0\x5c\x53\x04\x95\xa6\x2e\xa3\x5a\xc8\x7c\x69\xc7\xfa\xba\xad\xd5\x70\xab\x5c\x6f\xcd\xc9\xc9\x24\x27\x9e\xa1\x07\xfc\x6c\x35\x5c\x0d\xd5\x69\x9e\x3e\xa2\x45\x53\xdf\x5b\xc1\xce\x6d\xeb\x87\x7c\x69\x59\x7c\xe0\x31\x77\x9b\xe3\x2c\xbe\x8a\x20\x14\x09\xbd\x73\x55\xc3\x68\xdd\x5b\x30\xb5\xf3\x75\x0c\x2c\xe4\x4d\xfc\xaa\xf2\x9f\xa1\x25\xda\x35\xb7\xbc\xa9\xb5\xcb\xed\x12\x5b\x99\x03\x12\xa0\xb4\x8f\xd8\x5e\x1e\xf4\xd7\xc1\xa2\x57\xfe\x05\xde\x02\x92\x21\x0d\xe6\xa2\xca\xcb\x7b\x37\x56\xea\xb6\x02\x12\x6f\x6f\xf1\xc1\xd4\x31\x7e\xec\xd1\x22\xcb\x18\x8f\xa4\x2c\xfa\xc1\xb6\xae\xab\x7a\x01\x49\x3a\x52\x0d\x52\x2b\x5b\xee\x51\x67\x1d\x5e\x11\x61\x67\x0d\x4a\x3e\x90\x04\xbb\x83\xe8\x2f\x47\xbe\x6b\xaa\x09\xbd\xc5\xef\x88\xb7\x28\x06\xa2\x42\xd8\x96\xe9\xb8\x92\x38\x4b\x4e\xa7\x8f\x7f\x72\xde\x05\x2f\xc7\xf9\x54\xa9\x7b\x80\x20\x5c\x20\x09\x42\x26\x36\x80\x56\xbe\xad\x6a\x6d\x3f\x9b\xed\x0e\x18\xcb\x0f\x3f\x8c\x4a\xce\x79\xb8\xa3\x1a\xe0\x7d\x6d\x9a\xdc\xf7\x17\x59\x69\xf5\xda\x5a\x41\x45\x14\x40\xc9\xb1\xd2\x86\x29\x72\x83\xa6\x88\x5c\xa7\x60\xc0\x2a\xf8\x6a\x67\x25\x37\x1b\xbb\x87\x8d\x95\x85\x55\x26\x56\x16\x76\x55\x8a\x31\x94\x2b\x58\x56\xf0\x28\xb7\x41\xb6\xb8\x2d\x2f\x03\xc8\x09\x3b\x58\x15\x7b\x5c\x2a\x08\xcd\xa1\x69\x01\xb5\x8f\x81\xf5\x41\xb9\xab\xc7\x0a\xd5\x2d\x7f\xd6\x47\xa7\xc7\xa9\x20\xa8\x18\x6f\xbf\x1c\x8f\x5e\x1d\x2b\xac\x60\xc2\x05\x22\xaa\x7e\xb1\x16\x1e\x79\xf4\x40\xf1\x02\x12\x59\x4f\xf3\xe8\xf9\x1b\xe3\x45\x55\x4b\x2a\x3d\xa1\x50\x32\x29\x5c\x95\xc1\xc2\x00\x50\x14\x1e\x97\xdf\x38\xee\x08\x53\x38\x57\x6d\x8d\x0b\x1d\xf6\x20\x2f\x74\x5e\x68\xb0\x81\x2c\xdf\xb4\x3d\xf5\x46\x09\xcb\x0f\xa9\xbe\x70\x3a\x24\x07\xc8\x58\xcf\xd2\x25\xe8\xbf\x16\x92\x94\x8b\x3d\x10\x73\xf9\x97\xd8\x82\x00\x61\x3b\xe3\x10\x47\x1d\x9b\xe7\x2f\x9d\xb8\x74\xfc\xc9\x45\xb3\x65\x1a\x8c\x52\xc2\x0c\xa2\xce\x29\xde\xdb\x12\xf6\x90\xe1\x1c\x13\xfe\x66\x57\x57\x8b\xc2\x6e\xe1\xe6\x24\x79\x46\xb5\xd8\xb3\xfe\x77\x48\x3b\xd6\x76\x5d\xf8\x79\x27\xb4\x44\x80\x50\xd0\xf5\xf3\x8d\xae\xed\xae\xa5\x0c\xb1\xdf\x40\xfe\x8f\x05\x50\x22\xef\x93\x13\xc9\x37\xa8\xd9\x40\xb5\x8c\x3f\x9b\x21\xc7\x6d\xca\x06\x6b\x45\xc3\x98\x10\x35\xff\x58\xff\x6a\x55\x10\x3d\x7f\xa8\x72\x84\xc7\xad\x0c\xb0\x8f\x53\xb9\x58\x58\x08\xfe\x16\x04\xa4\x77\xf2\x3e\xe8\x41\x84\x8e\x15\x7b\x55\x2d\x90\x16\x10\xa9\xb2\xd9\x72\x01\xc2\x0f\x02\xf0\x10\x37\x34\x66\xc3\xf0\x31\xbb\xba\xda\xd5\x39\x54\x58\x8c\x35\x9c\x93\xe0\xb2\x83\x13\x09\x13\x03\xa3\x0d\x89\xa7\xbc\xd1\xa0\xa9\x20\xc6\x18\x5f\xc5\xba\x07\x21\x54\x02\xab\x92\x56\xd5\x37\x4e\x41\xbb\x5b\xac\xc3\xf3\x63\x1e\x3e\x07\x65\x7c\x05\xf1\x6f\x83\x40\x98\x3b\x50\x35\xbe\x26\x31\x03\x60\xa6\x90\x7a\x5b\x91\x6c\x32\xe4\xce\xa1\x86\xd3\x3f\x74\x80\x6c\x05\x20\x97\x67\xd7\x1f\x3e\x02\xad\x70\xc2\x44\xe4\x3f\x08\xa4\xbe\xb3\x33\xa4\x37\x52\x2f\xbb\x30\xc6\x58\x90\x46\x2b\x0c\x86\x30\x04\x21\x50\x31\x19\x75\xf2\x31\x4a\x85\xc1\x2d\x90\x79\x27\x82\xf7\x45\x57\x1b\x17\x35\xf6\xb4\x33\x7b\xb2\x48\x29\x47\x27\x84\x90\x0e\xf2\x33\x0c\x9b\x09\x18\xc3\x1a\x7d\xc0\xe6\x8d\x32\x2c\x57\xcf\xd0\xf2\x08\xad\x67\x30\x8a\xff\x8c\xaa\x6a\x21\x13\x6c\xf4\x48\x30\x97\xd0\xc6\xe0\xa7\x51\xf1\x08\x25\x71\xc5\x5f\x08\x7a\xad\x56\x11\xc7\xf4\x18\xe1\x76\x09\xa9\xc0\xcf\xa1\x72\xca\xdf\x94\xc6\xef\x26\xd2\xea\xc5\x51\xa3\x35\xaa\xe4\x93\x25\x63\x9f\xb7\x24\xa8\x01\xc1\xf0\xf7\x3d\xf0\xc7\x75\x52\xca\xac\xe9\x04\x0d\x97\xec\x4a\x21\xa5\x4c\x49\x5c\x09\xa6\xbc\x6f\x21\x90\x72\xf4\xde\xd6\x36\x2f\x01\xc1\x9f\x25\xd5\x21\xb9\x8b\x3a\x16\x9c\x4e\x8e\xc1\x1c\xd6\x3b\x82\xe8\xe3\x48\xbe\x7c\x34\x3e\x46\x30\x18\xad\x76\x0c\x75\xae\x56\xb5\x85\x63\xcf\x38\x3d\xda\x57\xed\xc8\x9f\xe4\xcb\x26\x7f\xc0\x7b\x5e\x08\x85\x7c\xd9\x6a\x0f\xd2\x1c\x64\xe1\x22\x4a\x27\xae\xd9\xd7\x3a\x28\x05\x55\x6d\xe3\x72\xd8\xc6\x4e\xbb\x65\xb5\xa3\x75\xc2\x0a\xc2\x6d\xc9\xe3\xce\x33\xaa\x72\xae\x9d\x44\x7b\x85\xe5\x19\x9a\x48\x04\x1a\xe2\x65\x1f\xe2\x29\xc8\xb6\x36\x14\x34\xe7\x7e\xb6\x1c\x54\x8e\x82\x35\x20\x60\xf7\x09\x3f\x4e\xba\xca\xf4\x91\x20\x0a\x02\x85\x70\xac\x4a\x00\x09\x0c\x38\x8b\x16\xfb\xa1\x16\x1f\x03\xc3\x25\x8f\x21\xae\xb0\xba\xb5\xc4\x6b\xea\xfc\x5b\xf8\x1a\x09\x9d\x5c\x55\xd6\x1f\xec\xa7\xb1\x4a\xf0\x8b\x1d\xcc\xf0\x10\x70\x6b\x82\x39\xa2\x8c\x4b\xcc\xe3\xbc\xc9\x18\xe5\x83\x35\x58\x49\xe1\x1b\x99\x43\x7e\x60\x76\xf9\xb2\x45\x2e\x14\xd8\x86\x3b\x3c\x9b\x4d\x63\x8b\xbd\x22\x80\x80\xef\x02\xdc\xf7\xd4\x48\xf9\xa9\x5e\xd9\x18\x77\x82\xea\x64\x74\x2c\x2b\xde\xbf\x56\xdd\x62\x65\xa8\xf7\xfa\xaa\x82\x65\xb3\x70\xb6\x5c\x42\x55\x17\x2a\x0d\xd3\xa3\x63\x7d\x9a\x28\xc5\x88\x06\x61\x3a\x74\x3a\x14\xaf\x27\x28\x55\xe4\x9b\x8a\xe8\xa1\x0f\x81\xfd\x36\xcc\x12\xfa\x2a\x60\x82\x46\x52\x9f\xcd\x9e\x38\x91\x70\x55\x23\xc9\x10\xf9\x5b\x86\x2c\x2c\xc3\xc6\xa2\x11\x7a\x0c\x3b\x3a\x5c\x7c\x9f\x83\xa9\x23\x6c\x29\x7f\x89\x72\x71\x61\x30\x7d\x91\xfa\x85\x5b\x44\x76\x1a\x49\x27\xec\xf6\x82\x0c\xb4\xd3\x67\x16\xac\x49\x8e\x34\xd5\x6c\x50\x17\x6e\x8b\x8d\x3d\xb8\x3b\x32\xba\x1c\xfb\xab\x74\x80\xcc\x81\x4e\xf6\x21\x54\x30\x17\xb7\x9e\x32\x92\xba\xbf\x2a\x4d\xe1\x2a\xbd\xb5\x16\x96\x88\x62\x3d\x1b\x71\x31\xff\xac\x94\x39\x8e\x85\x8c\x10\x11\x47\x28\x5a\xa0\x0f\xcb\x0b\xbc\x32\x97\xa6\xae\xf7\xa2\x26\x8c\x17\x9b\x6b\x08\x50\xc4\xce\x1c\x8e\x32\x9e\x33\xf8\x6d\x3e\x75\x56\x7e\x95\xd3\x72\xc3\x4f\x8d\x95\x5a\xf4\xde\x0f\xab\x31\x10\x05\xec\x87\x71\xb8\x6e\x13\x0b\xea\x80\x55\xcc\x3b\x35\x60\x3e\xd5\x4d\xbc\xbe\x11\x6a\xcd\x3a\x51\xbd\xe3\x8e\x27\xd2\x7f\x27\xa4\x07\x00\x1b\x19\x01\x50\x40\xdc\x85\x6f\x30\xbe\xd7\xbc\x72\x41\x35\xb6\x48\xf5\x98\x9e\x03\x6f\x8f\x95\x5a\x02\x47\x6c\x32\xc4\x6c\x88\x94\x55\xbd\x85\xf4\x59\x6d\xcd\x0a\x23\x27\x60\xcb\xe7\x65\x63\xa1\xee\x1a\xe4\x87\x80\x1b\xbb\x6e\xcb\x4c\xed\xd3\x61\xf3\xe7\x14\xfc\x91\xc9\x6f\xf9\x84\xf5\xeb\x9d\x2a\x15\xc2\x83\x50\x09\xa8\xa4\x86\xb8\x46\x01\x6d\x98\xa9\x49\x71\xbc\xf1\x96\x64\x5e\x36\x44\xbf\x0d\x75\x93\xfe\xb4\x2a\xcb\xaa\x2d\x97\x96\x94\x63\x39\xe3\x93\x9e\x63\x6a\xf0\x1c\x63\x43\xea\x09\xcf\xe4\xc8\x9b\x9d\x85\xb3\x19\x5b\x53\x61\x49\xd1\xca\xf6\x13\x41\x1f\x16\x29\x41\x94\x77\xf4\x3b\x38\x11\xee\x95\x56\x32\xd6\xc9\x75\x17\x3f\x5d\x87\xb6\x28\xf8\x1e\xf2\x8f\xd2\xe0\x7e\x56\xfa\x21\xb7\x8f\x9d\xd3\x2d\x22\xa9\x8f\xa6\xcc\xc9\xfb\x33\x8b\x91\x85\x2b\x14\xe1\x7d\x79\x32\x6f\x10\xb7\x0c\xc5\x72\x61\xa2\x61\x8c\xb1\xa0\xb3\x33\xba\x19\x9e\x43\x87\xaf\xd8\x3c\x21\x46\x58\x85\x19\x53\x9d\x07\x8d\x8f\xc1\x3c\x87\xb8\x05\x7c\x94\x78\xb2\x99\xd8\x39\x59\x89\x8f\xc4\xd1\x60\x98\xa8\x6f\xb6\x0e\xc8\x45\xc0\x7b\x3b\x2e\x52\x61\x3d\x2d\xfc\x06\x19\x31\x87\xf6\x59\x26\xa5\xbf\x42\x52\x6b\xaf\x44\x9d\xba\x34\x18\x00\xb4\xcc\xb4\x83\x83\x34\x83\xcd\xc6\x96\x29\xae\x15\x0b\x59\x1b\xac\x6e\x70\x99\x5e\x55\x18\x17\x8e\xdd\xac\x9c\xd5\xa1\xf9\x8f\x4c\xa4\x9d\x2e\x98\xad\x36\x4e\xa5\xaf\x1e\xeb\x37\x6d\x73\xe8\xf3\x80\xce\x8f\x4f\x35\xa8\xba\x86\xde\x1e\x8c\xa0\x42\x77\x22\x77\x4f\x5f\x08\xcd\x26\x55\x21\xe6\x0b\x07\x8f\x1d\x56\xc4\xab\xca\xc3\x15\x53\x19\x86\x5d\xa5\x8e\x51\x64\x17\x08\x36\xac\x23\xf2\x6f\x96\xb0\x26\xe8\x36\xbc\x86\x8d\xc3\x16\x4e\x7b\x0c\x4a\x94\x2b\xf4\x03\xb1\x5b\xb5\xbd\x37\xf5\x0a\x20\xe8\xde\x14\xd9\x54\x28\x49\xad\x72\xa4\x41\x6f\x5d\x26\x22\xf2\x98\xbf\x27\xd5\x27\x0e\x47\x06\xbc\x2d\x98\x34\x22\xfa\x06\x06\xa6\xc3\xcb\x5c\x45\xf9\x5a\xf4\xc8\x08\x0e\x8d\x8d\x45\x8f\x7c\x5f\xb5\xaf\x75\x6d\x7c\xe7\x32\xf9\x2a\xf4\x49\x02\x23\x5c\x52\x49\xc4\xf4\x27\x43\x83\x2d\xbc\x1e\x68\x4d\x24\xac\x44\x2e\x06\x3f\x6b\x2a\x9d\xb5\xb1\x4a\xa5\x48\xb7\x00\x5c\xbf\xbf\xf7\xa3\x14\xf4\xa5\x4a\xe1\x59\x02\x4a\x7a\x68\x2b\x03\x0c\x35\x31\x9f\xd9\x1b\x7a\x62\xd1\x1c\x43\xce\x5a\x3f\x54\x45\xbb\xa5\x4a\x72\xd7\x54\xb5\xb9\xb7\x2a\x91\x4c\xa8\x4a\x66\x0e\x08\xc7\xcf\x22\x14\x5a\x8b\xd6\xc5\x9b\x0b\x9c\x8b\x81\x9b\xeb\xdb\xa7\x4d\xec\x6e\x07\xba\x6d\xf7\xd7\x13\xbe\x84\x0c\x17\xf5\xea\x18\x78\xa7\xb0\x4c\x8d\xa3\xcf\x82\xbc\x1f\x2a\x6b\x0e\x1b\x3e\xce\x5b\x3e\xe5\x4a\xbf\x22\x72\x8f\x03\xe6\xcf\x2a\xe8\xe8\x36\x92\x21\x0a\x2d\x9f\xc9\x92\x35\x8e\x73\x41\x72\xc3\xa2\xac\x7a\x59\xd5\x18\xcb\x85\x6b\x6e\x6b\x96\x9b\xbc\xb4\x27\xfe\x7a\x86\x06\x0a\xa7\x21\xa3\x9d\xce\xb1\x94\x27\xdc\xff\xc3\x5d\xc0\x29\xc5\xe9\x52\xcb\xd6\x35\x15\xf1\x92\xb4\x1c\x95\x11\x32\x8f\x0d\x02\x41\xee\xed\x6b\x5d\xd5\x19\xd8\x51\xfd\xde\x98\xb0\x7b\xc0\x34\xce\xa8\x68\x05\x2c\x60\xae\xf4\x6f\x36\xb5\xb5\x7a\x6f\x4d\x0d\xb9\x10\x30\xfd\x55\xa7\x30\x3a\x23\xa3\x99\x6c\x9f\xb2\x42\xf6\x3b\xf0\x74\xc9\x60\xc6\xec\x11\x5b\xf0\xb1\x36\x2a\x2f\xef\xd5\x80\xd0\x3a\x50\x42\xf0\x38\xf7\x46\x36\xde\xba\x9d\x49\x50\x72\xcc\xa9\x8c\xe5\xb7\x8e\xb5\xe2\xb1\xd6\x5f\x3b\xd6\xcb\x43\x2b\x47\x2a\xd9\x09\x1f\x12\xac\x48\xae\xf2\x5a\x93\x5f\x26\x22\xc5\xe9\x3a\x4b\x42\xe3\x47\x10\xc2\x02\xb6\xac\x12\x0f\x28\xf8\x27\xa4\x3b\xd1\x47\x5f\x43\x58\xae\x14\xdc\x34\xbd\x90\x03\xfb\xf2\x49\x93\xa4\x81\xf4\xd4\x3e\x54\xb0\x0f\x63\x8d\x90\x09\x8b\x29\x68\x80\xe2\x5f\xe7\xed\x82\x8f\xf8\x05\x15\x14\xa2\xf1\x91\x64\x98\xd6\xf1\x6c\x88\x54\xa7\x3b\x4c\xab\x11\x5d\x71\xb8\xfe\x98\x07\x02\x03\x9f\x2a\x0d\x0e\x81\x70\xc4\x58\xbf\x05\x23\x5e\x9e\x1b\x18\x0a\x0b\x8b\x4b\xbe\x9c\xe8\x4f\x8b\x42\x35\x43\xcd\x2a\x0a\x6f\x0b\xb5\xde\x67\xc9\xa3\x17\x91\xa1\x8c\x09\xd4\x04\x39\x57\x2d\x73\xa2\xae\x6a\x6c\xbd\x36\x4b\xab\x56\x81\xf8\x19\xfd\x1d\xfa\x3c\x9e\xa5\xa8\x98\x03\x8b\x4a\xdc\x41\xbe\x71\x79\x11\x95\x1a\xf3\xd2\x35\xa6\xc0\x5f\x70\xb5\x4f\xec\x91\x10\x27\x37\x4f\xe8\xff\x1c\xd2\x61\x0f\x4a\x3c\x4c\x23\x68\xca\x3d\x92\x9b\x72\x94\x25\x18\xa4\x72\x2b\x1d\x79\x9f\x19\xc3\x74\xf4\xe4\xaa\x56\x0b\x74\x12\xfc\x2c\x1d\xc7\x65\x8f\x3a\x90\x42\x06\xf5\x08\x3b\xe8\x5b\xfc\xc9\xd6\xa5\x2d\xd0\xba\x70\xfe\x2c\x66\xd6\x19\x55\xed\x6c\x8d\xbe\x23\x2a\x68\x63\x7c\x87\x49\x87\xc5\x84\xd6\x6d\x19\x45\x3b\x88\x4c\x98\x5e\x45\xe6\xb6\x32\xb4\x1d\x73\x2e\x4a\x8b\x83\xa7\xd4\x6c\xdd\xbb\xf0\xc5\xd3\xbd\x95\x24\xd6\x7e\xee\x34\x87\xa8\x02\x29\x09\x31\xa6\x35\x15\x12\xec\x21\x5f\x16\x65\x72\xb1\x22\xbc\x30\x4b\x4b\x76\x69\xf8\x96\xb7\xb7\x1f\x4c\x01\x26\x2d\x3f\x00\x4f\x36\x4c\xdd\x8b\xc5\x17\x70\x6b\xde\x9e\x84\x87\xa1\x7a\x23\xd8\x94\x43\x96\x61\x72\xf5\x48\x15\xa4\xd4\x1f\x8d\xe1\xc5\xed\xce\x82\xaa\xb1\x68\x02\x3f\x24\xc6\x6a\x60\x57\x88\xc1\x40\xea\x46\x49\xbf\x85\x21\x18\x0c\x95\x64\x82\x4f\x2f\x4b\x84\x9a\x52\x6b\x00\x97\xa9\x4a\xea\xa1\xc2\x65\x3d\x50\xa7\x0a\xf5\x3b\xa6\x69\xec\x76\xd7\x08\x3c\x65\x48\xb1\xd1\xdb\x95\x60\xf3\x3b\xfc\xf2\xdc\xe9\x87\x2a\x5f\x71\x0d\x69\x51\xa4\xec\x04\xb1\x1a\x5a\xc9\xd4\xe1\x50\xab\xc2\x1e\x0c\x35\x8d\x3d\x2e\x02\x0c\x17\x21\x0d\x30\xe5\xa8\x59\xa7\x65\x88\x96\xf8\x0b\xf9\x06\x94\x43\x65\xdb\x40\xc3\xc3\x0d\x38\xc8\x30\x30\x56\xea\xfb\x71\x60\x88\xea\xfa\x89\x7e\x31\xee\x9a\x8e\xfb\xe0\xf2\x72\x69\x23\x02\x01\x6a\x26\xb1\x70\xd4\x1f\xb2\x42\x4c\x19\x4f\x0e\x48\x03\x12\xd5\x2f\x78\xe8\x49\x2a\x94\x42\x69\xbd\x59\x91\x29\x01\xef\xac\x75\x92\x0d\x21\xc5\x6e\xd8\xa1\xaa\xe1\x8a\xda\xe4\x0b\x66\xf9\x2c\xcc\x23\xc3\x19\xd8\xc5\xeb\xf7\x86\xca\x48\xd7\x20\x49\xbb\xe0\xc8\xde\x90\x9a\x98\x8c\x24\x73\xed\xfe\x61\x93\x1b\x53\xe5\x54\x44\x47\xe8\x1d\x7c\x3d\x94\x93\x75\x5c\x32\x40\x6e\x54\xda\x55\x94\x96\x21\x54\xce\xd7\xe4\xc7\xb0\xc5\xa1\xf9\xaa\x13\xbb\x12\xce\x09\x5a\xd8\x48\xca\x12\x6b\xd8\xf1\xbe\x7f\xca\x48\x7f\xba\xbf\xaa\x53\xb1\x9e\xec\x1c\x5a\xf5\x4e\x14\xb2\x87\x73\x2c\xe4\x61\x0b\x66\x87\x1e\x12\x9a\x4b\x93\xe3\xdc\xae\x94\xa9\xf1\x40\x46\x71\xac\xe4\xa9\x24\xe8\x46\xb9\x3c\x3c\xc1\x82\x50\xbf\x04\x81\xa8\x64\x57\x52\xcd\x30\xb7\x49\x5e\x76\xf7\x50\x10\xf5\xc5\x14\x29\x94\x7d\xfb\x49\x8a\x3b\x4f\x75\x25\xda\xbb\x11\xf8\xb1\x52\x3f\x8e\xf5\x6c\x4d\x57\xb9\xa8\xbd\x41\x27\x6e\x59\xb5\x75\xa3\xff\xdc\x22\x51\xbf\x46\xab\x44\xb8\x94\x94\xb3\x95\x88\x71\x7f\xdc\xac\x53\xe6\x24\x88\xb1\xe8\x23\xcc\xd6\x62\x19\x28\x70\x40\x91\x93\xec\x5a\xeb\x8e\xb3\x84\x4c\xa0\xb6\x34\x8a\x2b\xd2\x01\xd6\x47\x0c\x1a\x01\x5e\x39\xdf\xaa\xaa\x5e\x81\x0d\x12\x2a\xbd\x25\xde\xfd\x38\xd0\xfc\x37\xb5\x59\x11\xa1\xab\x7a\x8a\x39\x1c\x52\x5b\xb4\x8b\xed\xe7\x65\xeb\x70\xc1\x86\x45\x94\x7c\x57\xf5\x88\x3a\x09\x2f\x94\xb2\xaa\x7a\x13\xc3\x50\x62\xb2\xc9\xdd\x7a\xaf\x5d\xbe\x6d\x8b\x06\xa9\x2c\x0a\x0c\xef\x2b\x59\x43\x3b\x70\x2e\xc3\x76\x8d\xb8\x36\x5b\x37\x18\xf2\x16\x5f\xa3\xbb\xde\x38\x95\xce\xe1\x7e\x90\xeb\x35\xcd\x98\x60\xd6\x5c\x77\xc1\x3c\x46\xa5\xa9\x7f\xfd\x58\xb5\x05\x1a\x6e\x44\x0e\x26\x29\xd4\xe5\xbe\x16\x76\x01\x1f\x66\x8b\x3d\x45\xa7\x2b\x40\xaf\x54\x21\x9b\x45\x19\x0d\x04\xd0\x17\x70\x46\x33\x9c\xde\xdf\x86\x9b\x1a\xac\x88\x7d\xd5\x86\x28\x9b\x55\xe0\x3e\x10\x32\xd2\x2f\x85\x62\x15\x46\x77\x51\x41\xb9\xd9\x00\x27\x09\x7c\x6c\x61\x91\xc3\x65\x5d\xfb\x8b\x8a\x23\x38\x58\x1f\xff\x44\xf3\xd1\x66\xeb\xe4\x58\x92\x18\x52\xee\xf4\xc6\x16\xab\x67\xa9\x2a\xca\xbd\x12\xf5\x10\xcb\xbc\x5e\xb6\x5b\x07\xc7\x35\xda\xcc\x0b\x53\xc4\xb3\xdb\xca\xc7\x4b\x96\x7f\x0c\x23\x9a\x72\xa5\xe4\x87\x44\x66\x60\xf0\xf3\x81\x54\x5b\xbe\xd6\xf9\xbe\x25\x51\xb2\xae\x92\x85\x08\x93\xe5\x25\xb0\xbd\x13\x28\x2d\x70\xac\x45\xec\x86\x0b\x25\x27\x80\x04\xb1\x35\xb3\xab\xb1\x78\x38\x22\xdb\x38\xbc\x16\x19\x39\xd6\x11\x44\x80\x9f\x7c\xad\x92\x97\xb3\x62\x9f\xf3\xbd\x13\x2d\xe4\x94\x1a\xdd\x9d\xbe\xd3\xf7\xb5\x60\xf4\xf0\x4b\x33\xa2\x52\x93\x29\x46\x23\x3f\xd3\x21\x24\x2a\x89\x14\x17\xcc\xe2\x1e\x56\x3f\x51\xcd\xfa\x01\xbb\x84\x0e\xdb\x6a\x57\x48\x3c\x0b\x50\x00\x54\xad\x4b\xe5\x6b\xd8\xcd\x7e\xcc\x57\x56\xd7\x4c\x26\x1a\xc0\xa4\xd2\xc1\xe1\xc5\x0e\xe7\x16\xb9\x20\x80\xde\xa3\xf2\xf0\xaa\xd4\x82\x02\x99\x58\x4f\xe2\x6a\x34\x8d\xc2\x2f\xbd\xa6\xb0\x67\xbb\x0b\xa9\x55\x40\x1f\xbd\x58\x55\x25\x8e\x3f\x8a\x5d\xfa\x4d\x0e\x77\xa3\x76\x1b\x58\x32\xde\xfe\x43\x24\xa9\x4a\x4e\x30\x1a\x3d\x6e\x5f\x3c\x8a\xa8\x91\x98\x4f\x09\xc0\x04\x3a\x04\xf1\xf8\x46\x06\xa3\xe5\xa6\xca\xc1\x0c\xbc\xed\x6c\x1a\xb9\x4a\x01\x4a\xe6\x1b\xea\xdf\x52\xec\x09\x1d\xf4\x48\x3e\xe1\xc2\x16\xb9\x7d\x08\x14\xb2\x46\x75\xae\xaa\x26\x11\x05\x4d\x2e\xb8\x3f\x8d\x39\xc7\xd5\x8d\x44\xbc\x48\x49\xa7\x85\x91\x1e\x51\x0a\x3a\x0a\x9b\x2a\x94\xb0\xf7\x07\x16\x79\xa2\x8b\xb0\xf2\xfd\x38\x2e\xf6\x09\x4d\x6c\x70\xc9\x89\xd3\x2a\x58\x21\xe1\x43\x8a\xe0\x3a\xfe\x44\x04\x37\xcb\x25\xed\x18\xb8\x0b\x20\xcb\xbc\x5a\x61\x88\x61\x07\x04\x86\xfa\xde\xfa\x8f\xef\x36\xde\x10\x4a\x83\x2d\xa2\x4c\x08\xd4\x2d\x88\x3e\xa2\x72\xe4\xcf\xd5\x50\x43\xc6\x38\xb7\xe4\xab\xc8\xb5\x45\x38\x79\x0c\xd8\x94\x70\xfd\x6f\x2b\xb0\x30\x78\x20\xf0\xd8\x00\x59\x55\x84\xb5\x8c\xf5\xac\xa4\x9d\x6c\xf0\x5a\x15\x79\x78\xc1\xb6\xcd\x74\x41\x91\x47\xc3\xf9\x15\xc9\x01\x42\x4a\x06\x2e\xaa\xd5\x40\xbe\x4b\xfd\x84\x68\x93\x83\x68\xed\x2d\xcb\x30\xb8\x8d\xae\x51\xc7\x80\xe7\xbb\xb4\x8f\x52\xf7\x14\x8e\xd0\x03\xb0\xed\x3e\x09\x02\x12\xb0\x26\x8f\x60\x2e\x07\x97\x6f\xf3\xc2\x40\xd2\xd7\xed\xf2\x3a\x0f\x45\x76\x44\x0b\x13\xb5\x91\x16\x6d\x43\xd4\xff\x10\x7b\xcb\x4b\xbd\xb2\x8d\xc9\x41\x85\x94\x20\x3d\xfe\x15\x2a\x60\x0e\x31\x23\xb1\xb4\x35\x80\x06\xc1\x9e\x66\x89\xd1\xdc\x91\x0c\xad\x81\xe9\xcb\xcb\xfb\x36\x77\xe0\x12\xf1\x27\x50\x5d\x2b\x6c\x81\x60\xd6\x12\x03\x8d\xb7\x18\xd2\x8f\xf6\x75\x72\xe0\x84\x14\x70\x35\xba\x60\x47\xc0\xa1\x62\x1a\x04\x4e\xf9\x27\x8c\x30\x0b\x1c\x40\xe3\x01\x07\x21\xa4\x10\x9a\x43\x52\x2e\xb4\xa5\x38\x95\x47\x8f\x84\x1b\x05\xaf\x87\xe4\x55\x91\xe3\xe2\x79\x9d\x5a\xec\x7a\xf0\xf6\x42\xe6\x01\xc7\x60\xaf\x9f\x1b\x81\x28\x56\xbb\xdc\x54\x50\x4d\x50\xee\xc3\x57\x40\xab\xf7\xcb\x1b\xa3\xd4\xe9\xcb\x60\x2f\x32\x68\x53\x8a\xbb\x78\xfb\xa0\x07\xf1\x40\xa1\x17\xd4\xc3\x92\xc0\x75\x85\x69\xb6\x64\xe7\x76\xcc\xe8\x40\x4d\x97\xc1\xde\xb2\xe9\xa5\xc0\x40\xf3\x75\x55\xab\xe8\x34\xa3\x35\x18\x4e\xfe\x70\x45\xca\xd3\xed\x99\x8e\x66\x2a\x79\xdb\xa1\x8f\xbd\x86\x1a\x87\x6a\x6b\xfd\xf6\x72\x78\x07\x84\x38\xa2\x0b\xe8\xe0\xb1\xba\x6e\x6b\xb8\xb7\x5c\xa8\x79\x5c\x10\xfb\x49\x68\x4a\xf3\x58\xe9\xfb\x0a\x28\x1a\xd7\xb8\xeb\xea\x87\xc0\x97\x03\xe8\xe2\xc6\x34\x2d\xe0\x1d\xbd\x31\x1a\xbd\x7d\xf8\x02\xd7\xbe\xa4\x25\x25\x68\x63\x6c\xab\x60\x62\x30\xdd\x39\x0a\xe0\xb4\x0e\x00\x4b\xe1\x2b\xc4\x03\x54\xec\x91\xbb\x2e\x0a\x3e\x7e\x54\xea\xf4\x74\xac\xdf\x4c\xcf\x26\x77\xf3\x29\xf2\x60\xde\x5c\xbf\xbb\x99\x5c\x26\x8c\xab\x6f\x6f\xa6\x40\xab\x79\xf6\x7e\x72\xf3\x6e\x0a\xb4\xac\x37\x20\x64\x28\x9e\xa4\xdf\x5e\xdf\x28\xf1\x80\xac\x43\x6b\xfa\x61\x7a\x73\x39\xbb\xbd\x1d\xe2\x35\x0d\x44\xa8\xbf\xbe\x9f\x5e\x09\xba\xd8\x48\x29\xcb\x74\xb1\xc8\xb9\xca\x32\x8d\xef\xaf\x2f\xce\xa7\x37\x73\x92\x6b\x24\x11\xc6\x0f\x93\x1b\xe0\x30\x65\x61\x4e\xd1\xa4\xc0\x19\xdb\x21\x8b\xfd\xf8\x14\x55\xec\xf4\x5c\x90\xc5\x66\x92\x2d\xf6\xcd\xdd\x2d\xc8\x77\x02\x5b\xec\xf4\x5c\xdf\x5e\x23\x61\x2d\x13\xcb\xa6\x54\xb4\x97\xd3\x9b\xb3\xf7\x93\xab\x5b\x26\x67\x9d\x5c\x9d\xeb\xb7\xb3\xdb\xab\xe9\x7c\xae\x80\x22\x15\x5b\x7e\x76\x77\x31\xb9\xd1\x1f\xee\x6e\x3e\x5c\xb3\x52\xe3\xf4\xea\x76\x76\x33\xd5\x37\xb3\xf9\xbf\xe9\x49\x90\x85\xfc\xf7\xbb\x49\x78\xce\x87\xe9\x0d\xc8\x74\x5e\x9d\x4d\x15\xd3\x99\xc6\x69\xf4\xbd\xd5\x1f\xaf\xef\xc6\x7a\xfe\xfe\xfa\xee\xe2\x3c\xf9\xbb\x1f\xa6\xa9\x3e\x9f\xbe\x9d\x9e\xdd\xce\x7e\x61\x69\xc9\xf9\xfc\xee\x72\xaa\x70\xb4\xe7\x40\xb6\x3a\xb9\xb8\xd0\x57\xd3\xb3\xe9\x7c\x3e\xb9\xf9\x48\x3a\xa7\x00\x2f\xbe\x99\x7e\x98\xcc\x6e\x34\x20\x8e\x6f\x6e\x90\x35\xd6\x1f\x27\xaf\xc6\x09\x71\xec\xdd\xd5\xc5\x74\x3e\x7f\x82\xdc\x16\x28\x74\x91\x1f\xf8\xf6\x5a\xcc\xb9\x02\xca\x59\x3f\x3b\xdd\x89\xcf\x34\x31\xcb\xc6\x89\xff\xa8\x7f\x7d\x7f\xad\x2f\x27\x1f\x11\xe4\xfc\x91\x97\xc6\xcd\x34\xa0\xa0\xa7\x72\x91\xfa\xf1\x8c\x0b\x73\xf2\xe6\xda\x8f\x40\x60\xb5\xd5\xc4\x6a\x2b\xa8\x76\xc5\x02\xf0\xaf\x56\x54\x65\x98\x0d\xb1\xdb\xe2\x98\x08\x7e\xdb\xc3\x44\xb6\x40\x5c\xab\xfc\x3a\xbb\x12\xe4\xbd\xdd\x2d\x79\x14\xdf\xdd\x5f\x7b\xfa\xe2\x7a\x0e\x0b\xed\x7c\x72\x3b\x51\xd0\xe2\xdb\x89\x7e\x33\xf5\x9f\xbe\x99\x5e\x9d\x4f\x6f\x60\x2b\x21\x4b\xf1\x2d\x10\xe6\xfa\x6f\x4c\xe7\x7a\x7e\x37\x27\xa9\xcf\x37\x1f\x91\xc5\xf7\x46\xb0\x06\xcf\xa6\x73\x05\xcb\xf3\xed\x64\x76\x71\x77\x13\xe8\x75\xb9\x51\xb7\xd7\xfa\xfa\xc3\x14\x1e\x09\x0b\x4d\x4c\x08\x7e\x62\x7e\x8c\x2c\xbc\x7a\x86\xac\xba\x0a\x67\x4f\x27\x3b\xf6\xe3\x6f\xe3\xe5\x9d\x5e\xe1\xe7\x06\x40\xf0\x4a\xbd\x47\x88\xd2\x04\xdc\x4c\x0c\x99\xde\xc2\x0d\x8f\xdc\x6b\xb5\xbe\xb2\x8f\x7c\x95\x39\xf0\xa5\x01\xbb\x82\xac\x0c\xda\x80\x3d\xb5\x93\xd8\x1c\x51\xe5\x45\xf6\x3e\xdd\x87\xf7\x50\x12\xe1\x1a\x2a\x63\x2f\xac\x6a\x23\x61\x25\x7a\x6c\xe4\x48\xfb\x0f\x3d\x9a\x3d\x06\x98\x37\xde\x75\xd0\x5c\xc9\xce\xbe\x46\xde\xa4\x07\x3e\xe5\xcc\x43\x01\xcb\xd2\x94\x69\xb8\x52\x54\x42\x86\xc4\x2e\x07\x04\xb1\x2e\x8c\x03\xac\x4d\x63\x28\x6f\x14\x0d\x9f\x00\x87\xad\x64\xae\x73\xac\xd1\xfd\x76\x66\xed\x9b\xec\x9b\x0b\x5f\x56\x58\x72\x44\x3c\x0d\x0d\xe1\x78\x00\x07\x43\x79\x92\x75\x8e\xec\x76\x50\x29\x89\x25\x19\x08\xc9\x43\xd5\x05\xca\x3b\x11\x95\x86\x92\x68\x5d\x44\xd2\xf8\x47\xc1\x33\xdc\x06\x82\x23\xc8\xee\x16\xd3\xf0\x56\x8f\xc2\x7d\x3f\xd2\x45\x5e\x52\x24\x4a\xed\x2a\xf0\x6c\x00\x11\x03\xc0\x39\xe8\x67\x1b\x24\x8a\xa0\xfa\xd3\xdf\xf0\x63\xa5\xfe\xab\x1f\x48\xf8\x2e\xa5\xf2\x65\xdf\xbf\x71\xa0\x09\x41\x01\x2e\x9d\xaf\xac\x41\x28\x0f\x32\x6b\x00\x96\xfa\x5f\xba\x25\xc3\xff\x55\xef\xf7\xfb\xfd\xbf\xe8\xff\x0a\x5f\x0d\x0a\x94\xff\x42\xce\xa5\x28\xa0\x49\x26\xf7\x75\x28\xe8\x4b\xa6\x14\x4d\x59\x51\x17\x95\x37\x11\x9e\x27\xb1\x4d\x4f\x56\xd4\x1a\xf7\x8c\x05\xa8\xa4\xc5\x13\x8b\x0d\xb0\x3e\x5a\x27\x7c\x8a\x98\xbb\x3a\x4a\xa1\xc4\xc7\xd1\x00\x56\x41\x57\xbf\xd7\x61\x19\x4d\x20\xff\x69\x53\xed\x6c\xa0\x2a\x61\xb3\xa9\x75\x76\xdd\x16\xe8\x88\xd0\x0d\xad\x04\xfb\xfa\xc7\xd7\xa1\x34\x81\x52\x79\x56\x77\xd8\x3f\xc0\x27\xeb\x5e\xb4\x55\xfd\x05\xf7\xec\xdc\xda\xe7\x46\x73\xcd\x6a\x86\xe8\x16\x39\x82\x69\xcb\x65\x1a\x81\x0c\x09\x36\xe3\xa9\x29\x92\x59\xc5\x38\x6c\xaf\xbd\xcf\x59\x56\x5d\xe3\xf8\xe9\x62\xf4\x4c\x8b\x5a\x74\xf5\x95\xb5\xe8\x54\x6c\x07\x5e\xbc\xc4\x67\x54\x25\x43\x3d\x89\x4f\x0f\x16\xec\x62\x8f\xac\xcf\x75\x55\xe6\x4b\x2a\x74\xdb\xd9\x5a\x6f\x4d\x5e\x60\x58\x32\xc1\x4d\x24\x28\xcf\x2c\x1c\x73\x54\x5f\x61\xfc\x18\xd6\x01\x07\x5b\xe4\x9f\xe8\x50\x7c\xdc\xd8\x12\x68\x1e\x1b\x70\x3e\xa0\xbc\x20\xc1\x8b\x6e\xab\x95\xfd\x59\xa9\x77\x65\xb5\x0d\x7c\xb3\xb4\x7c\x7f\xf8\x29\xd3\xe9\x0e\xdd\x5b\x53\xeb\x74\x77\x6a\xf9\xcd\x65\xb5\xb5\x0e\xc5\x9f\x27\x6f\xe6\xd7\x17\x77\xb7\xd3\x8b\x8f\xd2\xc2\x7d\x0d\x4b\x80\x66\x5f\x37\xfb\x9d\xd5\xff\x03\xca\x30\x1f\xbf\xa1\x1a\xaa\xee\xee\x46\xc0\xe5\x9e\xb2\x23\x8f\xb6\xf0\xef\xc0\x58\x6f\xba\xd9\xa9\x7e\x88\x0a\x16\xa3\xab\xf4\x5a\xbc\x46\x2d\xbf\x91\x0d\xa0\x82\xb2\xcd\x7e\xe7\x1d\x30\x48\x37\x45\x30\x34\xb7\x0b\xa6\x06\xff\xb1\xfc\x86\x97\x2a\x97\x8e\x26\x70\xe4\xc4\xbf\x3b\x54\x72\x75\xbd\x86\x1c\x07\xa5\x25\xe2\xeb\x20\x73\x4b\x61\xa0\x85\x55\x4b\x03\x49\x74\xf0\x9f\xc0\xe9\x17\x15\x3f\x83\x2d\xa3\x02\x1e\x0c\x9a\xc3\xe6\x06\xf2\xd7\xd6\xd9\x93\x65\x91\x2f\x3f\x41\x00\x77\x6b\xcb\x56\xe7\x8d\xdd\xba\x93\x13\x7f\x16\x83\x87\xeb\xda\x1c\x73\xab\xa1\x54\x3d\xdd\x96\x00\x6e\xbb\xb7\x74\x6a\xd9\xed\xae\xa8\xf6\xb6\xd6\x47\x5c\xb3\x1d\xa0\xbc\xf4\xed\xad\xad\x8f\x35\xd6\x21\xd7\xda\x79\xbf\xba\x00\xe2\x52\x53\x22\xde\xdb\xe5\xf7\xa5\x36\xe2\x0a\x12\xa5\x27\xa3\x58\xa1\xc1\x56\x83\xdf\xc5\xcc\x90\x3c\xd6\xef\x2d\x16\xea\x1b\xed\x20\xa1\xf1\x9a\xf4\xfd\x1a\x52\x21\x72\x3f\xfb\xb6\xef\xab\xd5\xbe\xb4\xbc\xa5\x89\x75\x29\xe1\x5a\x4a\x08\xe4\x1b\x0b\xf1\x45\x3a\x58\x79\xcb\xfd\x0f\xb1\xb2\xbf\x51\x47\x04\xbb\x03\x3e\x27\x28\x49\x75\x9a\xf0\x21\x79\x61\x6b\x77\x1c\xe2\x5b\x8b\xbd\xfe\x57\xdf\x12\xfd\xde\x2c\x3f\xd9\xda\x5f\x95\x08\xdf\x68\x6b\xd8\x37\xb7\x7b\x7d\x56\x55\xe5\xbf\x64\xfa\x54\x4f\x76\x75\x5e\x00\x57\x06\xff\x3a\xd3\x1f\x40\x15\x85\xf0\xac\xbf\xf8\xed\x2c\x89\x15\x54\xe7\xf4\x0b\x21\x0f\x4a\xdd\xc4\x80\x83\x5f\x35\x72\x56\x31\xd4\x20\xea\x38\x15\xc7\x1a\x38\x6a\x51\xcb\xe3\xc6\x68\xd7\x2e\xea\xaa\x6d\x72\xb8\xe7\x81\x08\x4c\x84\x4b\x08\x51\x0d\x85\x88\x55\x0d\xd6\xda\xba\x2d\x84\xc0\x4c\x91\x97\x50\x44\x2a\x5e\x28\x43\xdb\x2e\x82\x7a\xe8\xe1\x14\xcd\xc9\x9d\xca\x5d\x87\x6b\x10\x12\xdc\x59\xe0\x7f\xfd\x62\x5a\x86\xbe\x40\xf5\x3f\x9a\x56\xe5\xff\x99\x9f\xf1\x8b\xf9\xfc\xc3\xc5\xdf\x8a\xf9\x0f\x7f\x9e\xe6\xff\xf9\xf1\xf4\xf4\x87\x97\x1d\xfe\x9f\x57\x3f\xbe\xfc\xf1\x0f\xfe\x9f\xbf\xc7\xcf\xdc\xd6\xfe\x72\x98\xe7\x2b\xdb\xd9\x5c\x4a\xfd\x32\xbd\x99\xcf\xae\xaf\xf4\x69\xa6\xaf\xcf\x6e\xaf\xdf\x4c\x6f\xf4\xe9\x0f\x99\x7e\xf5\xf2\xf4\x4f\xd2\xa6\xff\x3f\xff\x1b\x7e\xa5\x2f\xab\xf2\xbe\x3a\x7f\x83\xc7\xf1\x3f\x8e\xb0\x67\xd8\xc3\xd5\x5a\xbf\x1c\xeb\xf3\x80\xac\x74\x18\xdf\x1b\xc9\x82\xee\x91\x28\x89\x3e\x3c\x2e\x63\xa5\x46\x67\xd1\xad\xa2\x92\x38\x53\x8a\xe0\xea\x09\x18\x66\x85\x79\x24\x74\x61\xa8\x1a\xc1\xdb\xfd\x53\x0e\xc5\xa7\x6b\xc4\xdb\x64\x54\xaf\xe3\xb4\xb3\xdb\xdc\x1b\x34\xed\xb2\x01\x8c\xaa\x03\x8d\xc2\xd1\xad\x2c\xb7\x4e\x8b\xb6\x07\x14\xfd\x7b\x44\xdb\xf2\x58\xfc\x92\x02\x64\x3d\xba\xe0\xea\x8e\x11\x66\x09\x22\xcc\x65\x14\x34\xeb\x52\x8d\x9a\xaa\xbe\x37\x65\xfe\x3f\x03\x2d\xc2\x6d\x45\xc5\xcf\xfb\x51\x07\x9b\x4b\xd3\x0f\x89\x99\xaa\xd6\x66\x65\x76\x58\x6f\x5a\xd5\xa1\xd6\x25\x40\x75\x41\xcd\x75\x6d\xdc\x26\x27\x62\xeb\xbc\x46\x74\x0c\x2f\xbd\x18\xf0\xce\xa4\xe5\x84\x10\x52\xb8\x96\x20\xf3\xa0\xed\x67\xb3\x6c\x00\x6b\x89\x69\xa7\xda\xba\xb6\x80\x9b\x13\xdf\xe3\x34\x19\x62\x86\x8b\xb6\xed\x2a\xa4\x44\xb8\x49\xd6\xd4\x45\x4e\xe5\x0d\x2a\x82\x8e\x47\x0c\x75\x1a\xf5\x3e\xe5\x3d\x05\x6f\x00\x61\x01\xb4\xff\xcd\x40\xbd\x7c\x5b\x86\x37\x26\x05\xee\x3d\x18\x95\x8a\x60\x06\x3f\xbe\xfe\xc2\x35\xf7\xa6\xb1\xfd\x21\x5e\x55\x11\x92\x4b\xfc\xbd\x24\x5b\xc7\x6e\xa1\x18\x38\x85\xc8\x0a\xf0\x34\xb0\x22\x29\x22\x39\x9c\xf5\xeb\x11\x71\xec\x82\xa8\x31\xa1\x97\xec\x69\x78\x24\xb5\xfd\x19\x25\x03\x08\x20\x4b\x9b\x16\xea\x12\x40\x2e\x8e\x44\x9b\x23\xa2\xce\x04\xf1\x53\x98\x2e\xdf\x69\xe8\x26\x16\xdd\x42\x86\xd2\x1d\x28\x86\x3f\x82\xbe\x52\xad\x8b\xef\xa5\xc4\x77\x1f\x67\x8a\x96\x44\x24\x4c\xef\x84\x9d\x48\xbb\xd0\x1b\xe3\x22\x3f\x5a\x05\x75\x10\x2a\xca\x37\x4e\x3d\x5a\xa4\xa9\xa8\xfc\xec\x96\x0f\xb6\xbb\xcc\xfd\xde\xf4\xbb\x9c\xb2\x0f\xa1\x03\x70\x1a\x58\x60\x60\x74\x41\x04\x0f\x60\x5d\x41\x14\x04\x84\x28\x24\xb4\x66\xac\x2f\x2d\x17\x0d\x18\x21\xa2\x60\xb0\xba\x30\x24\xf5\xc3\x78\xaa\xd2\x36\x08\x59\x87\xcf\x95\x55\x28\x7b\x66\x44\xd8\x6e\x9f\xf1\xb9\x19\x04\x3e\xfd\x5a\x2d\xbb\x15\x9d\x75\x4c\x81\x73\xd9\xa6\xd3\xa3\x89\xa8\x31\xbf\x00\xe2\x9a\x2b\x8c\x8c\x8d\x68\x44\x15\x49\x9e\x70\xd8\x22\xcc\x9b\xc1\xf7\x95\x39\x97\xe5\x85\xf2\xdf\x62\xaf\xbd\x09\x0e\x2b\xcc\xa2\x0d\x0d\x88\x88\xa3\xd3\xe3\xf8\xe6\x67\xea\xdb\x03\xeb\x0e\xd4\x60\x62\x7a\x9a\xc6\x08\x68\x30\x0f\x92\xd7\xd0\x71\x73\x44\x4b\x35\x95\x28\xc6\xb2\x44\x21\x36\x59\xc7\xd2\x20\x66\xbf\x8a\xf5\x70\x64\x34\x73\xf8\x2e\x29\x85\xea\xca\x66\x78\x4f\xf5\x99\xc2\x50\x4e\xfa\xc6\x69\x60\x51\x4a\x00\x6c\x20\x5a\x02\xfa\xc8\x1e\x26\x1c\xc7\x3b\xc2\x94\xf1\xcd\x62\xc0\x25\xcc\xd0\x79\xa3\x7a\xeb\x9c\xe0\x29\x68\x9a\xbb\x06\xea\xba\x1d\xbe\x7e\x59\xe7\x8d\xad\x31\x46\x85\xfc\xe0\x73\x0c\x59\x9e\x21\x88\x1b\x08\x45\x04\x64\x7c\xf4\xbb\x57\x61\x8c\xae\x23\x6a\x7c\x24\x76\x55\x59\x95\x27\x1c\x3e\xa5\x67\x1a\x71\xd6\xce\x1b\xe3\xcf\xab\x95\x9e\xf1\x80\xc5\x2f\x8b\x41\xc4\x7d\x88\x67\x70\xee\xa8\x02\x25\x87\x1a\x08\x47\x4f\xc0\x2a\x0c\x8c\x06\x1a\xbf\x25\xab\xfb\x32\xff\x9f\xde\x57\xa7\x0f\x38\x80\x36\x64\xba\xc2\xc2\x95\x46\x88\xb0\x46\xdc\x48\xd4\x89\x51\x7d\x32\x5d\xf2\xa3\x81\xe3\x96\x98\x47\x32\xa8\x2d\xe3\x32\x8a\xc7\x7c\x65\xb9\x82\x08\x61\x1b\x4c\x84\x5c\x3b\xe5\x3b\x0d\xc7\x29\x1d\x2b\x81\xbc\x84\xa6\x67\x8e\xd8\x9e\x0b\xf0\xba\x72\xbf\x39\xf9\x2e\x4c\x0a\x5b\x7a\x45\x1c\xf2\x26\x55\x61\xbe\x22\x36\x8d\x96\xfc\x91\x39\x4e\xb8\x50\x68\x08\xb0\xf2\x23\xcc\xcd\xce\x2c\x3f\x19\x6f\xaa\x29\xa3\x2f\xa1\xa8\xe3\x8c\x2b\x2d\xd0\x94\x0b\x99\x69\xf0\x6d\x83\x01\x60\x9a\xfe\xc7\x61\x73\x2f\x8e\x15\xa9\xba\x01\xa4\xa5\xa9\xe8\x38\x95\x28\xa0\xc7\xa0\x60\x3f\xfc\x20\x4c\x9a\x07\xb4\x98\x32\xba\xbf\x6c\x60\x81\x12\x6e\xa2\x8c\x9f\x0d\x1c\x30\x07\x2e\x11\x00\x8f\xa4\x55\x40\xdb\xb1\x9e\xe8\x51\xa7\x11\x23\x5a\x33\x39\xa2\xcd\xec\xe7\x26\xe3\x75\x4a\xc5\x2f\xde\x2a\x03\xa2\x62\x15\x6b\x53\x8e\xb8\xf6\xe5\x31\x2f\x57\xd5\x63\x40\xc0\xf5\x4a\x61\x78\xd9\x2d\x75\xb7\x26\x46\x1d\x61\x88\xe6\xf8\x60\x71\x0c\x8c\x1e\x56\xc8\x60\x89\x1e\x85\x3e\x42\xcd\xd1\x0e\xe9\xb3\xc2\xda\xc0\xcf\xa5\x05\x5f\xb0\x03\x76\xb5\x6d\xc4\xf7\xea\x96\x20\xe5\xb0\x3c\xcf\x92\x12\x35\x3c\x5e\x92\x63\xa4\x53\x42\x06\x2b\x2a\x94\x5b\x89\x72\x13\x05\x7f\x2e\xad\x25\x14\x1a\x66\xf0\x1b\xa0\xc4\x86\x22\x28\x5a\x39\xeb\xc1\xba\xae\x63\x68\x56\x2c\x53\xc1\xa7\x11\xab\x89\x00\x93\x63\x47\x23\x45\x01\x17\x62\x25\x75\xc0\x15\x95\x1a\xa0\xa1\x30\x56\xa1\xca\x21\x6f\xa4\xb2\x2d\xee\x37\x7e\xea\x37\x4e\x77\xb7\x2a\x8c\x28\x21\x11\x4e\x08\x2c\xa9\x9a\xaa\x42\xed\xca\x00\x51\x10\x8b\x30\xc1\x94\xf0\xba\xad\x2d\x8e\xbd\xb0\x30\xf3\x52\x96\x51\x76\x5b\x2c\x76\x24\x63\xd4\xbb\x36\x79\x07\x66\x9c\xcc\xa2\xa2\x4b\x22\x5c\xf7\xc2\x78\xe8\x94\xb4\xc9\xc2\x37\xac\x04\x8c\x29\x31\x00\x8d\x88\xd5\xc5\x6c\x1f\xdd\xea\x3a\x20\x37\x5d\x51\x58\x89\x65\xa0\x57\xfb\xd2\x6c\xa9\xa0\xa0\xc8\xcb\x4f\x76\xa5\x5c\xbb\x08\x23\x13\x74\x89\xd8\xee\xe7\x8d\x42\x34\xf3\x91\x4a\x93\x0a\x5c\xe2\x1d\xba\xd8\xab\xbc\x6c\xf2\xad\xb7\x3c\x56\xa6\x31\xa9\x44\x17\x17\x9d\xfb\x85\xb0\x2e\xaa\x47\x21\x5a\x06\x44\x01\xa2\x0d\xa6\x5c\xa9\x68\xfb\xb9\x64\x74\x71\x73\x0c\xed\x0d\xfd\x4c\xd5\x1d\xb2\x56\x60\x7a\x8c\xb7\x80\x4a\x0b\x2c\xd0\xe9\xea\xbf\x79\xe8\x75\x78\xf1\x1f\x6c\x4c\xba\x4f\xbb\x27\x1e\x92\xdf\x99\x06\xcb\xcf\xa8\x63\xa8\x1f\xf2\xc6\xb8\x7c\xa9\x3f\x44\x56\x01\xc8\xa6\x14\xdd\x72\x89\x21\x10\x7d\x1d\x35\x09\xd9\x6c\x43\x51\x3c\xa1\xed\xaf\x86\xa8\x71\xa0\x16\xa1\xae\xed\x43\x85\xa2\xa2\xa2\xb0\xdb\xb2\x5e\x65\x07\x73\xb5\xb5\xcd\x58\x25\x64\x6f\x0c\xd6\xf4\xdb\x6e\xbd\xce\xeb\x2d\xc5\xd2\xdb\x32\xe8\x62\x25\x25\x4b\x7c\xac\xc4\xcd\xa7\x42\xa3\x44\x45\x0a\x43\x69\x4f\xbf\x45\xcf\x54\x12\x69\x31\xdf\x8a\xd1\xd2\x85\xd4\xb9\x53\x09\x7f\xad\x68\x24\xd7\xe5\x36\xe1\x49\x19\xa1\x0b\xf3\x86\x6e\x1a\x7f\x01\x0a\xc5\x3d\x95\x3e\xbc\xcb\x70\x17\xb9\xe4\x5d\x42\x85\x59\xad\xf5\xda\xe4\x35\xb3\xf8\xa1\x3c\x69\xac\x4f\xcc\x48\xee\xfd\x81\xd1\x5d\x89\x4f\x38\x56\x6a\x3e\x34\x02\x31\xec\xec\x3d\xa1\x0c\x86\x90\x9c\x04\xf4\x74\x93\xa6\xba\x48\xe7\x42\x35\x1f\x68\x77\x47\x27\x57\xcc\xa9\xa8\x78\x83\x6e\x84\x3a\xbf\x50\x0d\x88\xb5\x6f\xce\x5f\xe0\x00\xfa\x97\xe4\x04\x60\xce\x77\xde\x5d\x31\x75\x24\xaf\xc5\x2e\xb2\x1d\x39\xca\x10\x05\x00\x9e\x5d\x6a\xe7\x52\x62\x1f\xf2\xfd\x44\xe7\x9a\x05\x7d\xc7\x95\x25\x74\x61\xb3\xd1\x6b\xb3\x24\xda\x57\x30\x21\x23\xcd\x19\x54\x62\x40\x04\x69\x90\x3f\x6c\xbb\x2b\xf6\x31\xf8\x3e\x48\xf2\x41\xba\x75\xe8\x00\x62\xb5\xb2\xf1\x76\x3f\x1a\x70\x74\x13\xa4\x03\x4c\xd5\xc6\x34\x9b\x7e\xb9\x54\x10\xad\x6f\x1d\xbb\xd7\x49\x1b\xbb\x53\xc6\xc4\xb5\x40\x6b\x00\x58\x8b\x64\x20\xb0\x52\xa8\x56\x0b\xbb\x31\xc5\x9a\xf9\x1d\x60\xc6\x30\x2c\xc1\xf5\xcd\xd4\x92\x0c\x42\x23\x88\x54\xf1\x3d\xe7\xda\x3e\x0d\xa3\xee\x37\x51\x70\xfa\x31\x5a\x46\xb1\xc5\xc0\xc9\xc5\x58\xc8\xd0\x6f\x66\xc5\x23\x46\x58\x8b\x25\xd4\x6e\x93\xef\x30\xdf\xb9\x47\x95\xc4\x30\x68\xa1\x2c\x64\xa8\x34\x23\x0d\x7d\xfa\x05\xe2\xad\xf9\xc0\x28\x10\xd7\xa7\xa2\x53\x08\x98\x19\x41\x6a\x19\x17\x28\xd8\xf7\x49\x80\xf3\x75\xdc\x2f\x2f\x29\x4b\x05\x49\xd1\x98\x3b\x83\x93\xf6\xdb\xb1\x3f\x02\xb9\xb2\xe2\xce\xdf\x0d\xdf\x90\xaf\x7e\x83\x3b\xf8\xad\x3f\x61\x26\x65\x93\x9f\x9c\x41\x93\x1f\xbc\xb5\x59\x95\xfa\x02\xf6\xe7\x55\x95\x9e\x39\x5d\x6d\xd1\x40\x4b\x53\x46\xe0\x8a\x6e\xec\x72\x53\x56\x45\x75\x0f\x19\xd6\xad\x35\xae\xad\xad\x8a\x23\x24\x74\x9d\x0b\xf3\xa8\xd7\x6d\xb1\xa6\x82\x85\x7e\xfd\x14\xb8\x49\x85\xd5\xa7\xa7\x7c\x4b\xfd\x3a\xfb\x70\x2d\x62\x4b\x4d\x6d\x4d\xb3\xd7\x66\x55\xed\x10\xe0\xae\x5f\xbd\xd4\xe7\x76\x69\x01\xff\x7b\xfa\xd3\x4f\x3f\xc0\x76\x22\x50\x37\x06\x63\x79\x79\xf8\x7d\x59\x89\x92\xbe\xf2\x9e\xe6\x8d\x07\x81\x19\x8f\xa9\x0f\x8e\xe9\xbc\x89\x99\xcf\x1f\x07\xe9\xb9\x99\x51\x12\x8b\x59\xee\x88\xcf\xb7\x7a\x44\x94\x0d\xd1\x46\x27\x2f\x81\xa4\xd5\xd0\x88\xb9\x4e\x00\x02\xa1\xf8\x49\xfb\x72\x47\xc3\x0e\xa7\xab\xa2\xda\x43\xdf\x8f\x83\xf5\xc6\x83\xf2\x31\x69\x17\xbc\x61\x42\x9c\x44\xc8\xa7\x03\x6c\x14\x70\x67\xd0\xa5\x06\x57\x1d\xfb\x14\x68\xf4\x24\xec\x93\xc2\x94\x51\x14\x76\x30\x58\xa9\x17\x6a\x1b\x33\x6d\xee\xfd\x41\xdb\x48\x03\x18\x8c\x17\xa2\xa8\x42\xc0\x70\x2c\x78\xfc\x46\xe1\x60\x46\x16\x9f\xa1\xd1\xd4\x07\x47\x13\x37\xc4\x77\x63\x1d\x37\xed\x2f\x9c\x6d\x38\xc3\x08\x9b\x60\x11\xc4\xc9\xfd\x1a\x7a\x47\x9d\xd2\x3b\xaa\xdf\x83\xde\x91\xc1\x48\xea\x6b\xe8\x1d\x5f\xeb\x2e\x87\x63\x87\x52\x4f\x45\xbd\xa5\x6e\x65\x62\x59\x95\x27\x6c\xbf\x44\x59\xf7\x15\x39\xf6\x92\x94\x83\x8e\x1f\xf5\x63\x4a\xf9\xe5\x47\xe2\x70\x03\x58\xd8\x1d\x19\x22\x75\x97\x21\x52\x45\x86\x48\x6f\x0a\x0a\xb2\xf0\xc1\xa8\xd8\x97\x93\x41\x02\x2b\x6f\xbe\x24\xa6\x61\xfa\xef\xc0\x91\x4d\xbc\x05\x71\x4a\xc0\x7a\x90\x74\x90\xc8\xad\xe2\xda\xdd\xae\x82\x72\xd5\x41\x2a\x48\x49\xff\xa8\xb5\xfe\x5e\xae\xb4\x4b\x76\xbc\xc8\x6e\x26\x49\x8d\x81\x25\xf7\x24\x9f\x17\x99\x18\xbd\x48\x19\xbb\xe2\x79\x9f\x7a\x35\x04\xa5\x38\x14\x23\x97\xec\x00\xab\x0d\xcf\xeb\x77\xcf\xf2\x3e\xea\x83\xbc\x8f\xb7\xec\x58\x11\x8b\xe0\xf3\x04\x8f\x91\x91\x1e\x95\x6c\xf1\x10\xba\xcf\x1f\xd0\xee\xad\x6d\x61\x1f\x4c\xd9\x00\xd3\x23\x72\x3b\xfe\x86\x77\x60\x96\x90\x84\xff\x57\x01\x1d\x38\xb0\x0d\xa4\x17\xb0\x8a\x6c\x12\x7c\xe5\xfe\x48\xe6\xb1\x60\xbe\xe3\xc6\x3b\x2a\x6d\x8f\x7f\xf0\x7e\x11\x7d\xef\x3b\x3f\x57\xa3\x03\x9b\x63\x84\x24\x8e\x81\xb3\x32\x8a\xfc\x47\x3e\x35\x3c\x9e\x45\x08\x6e\xe0\x7c\xc7\x94\x60\x55\x5a\xf5\xb8\xa9\x10\xa2\x45\x50\x90\xca\x39\xeb\x58\x32\x1c\xb7\x54\xc7\xce\x07\x5c\x61\xc3\x1c\x07\xb8\xb3\x33\xdc\x66\x68\xf6\x74\xae\xef\x30\x20\x52\xd4\x9a\x98\xf2\xb8\x5e\x12\x39\x34\xe3\x85\x80\x08\x2f\x66\x2d\x00\x07\x34\xeb\x50\xc0\x11\xda\x0a\xf9\x89\x31\x74\x88\x12\x6c\xa2\xa9\xc0\x99\xaf\xca\xaa\xe3\x6e\xc9\x51\x63\xb7\x34\x5a\x65\xc0\x41\xb9\x68\x9b\x4e\x20\x06\xca\x57\xbd\x9f\x8c\x2c\x18\xf1\x81\x84\x79\x02\xa4\x22\xd3\xf7\x45\x86\x82\x15\x86\xb1\x56\x81\x79\x13\x5e\xb8\x31\xee\x89\xf4\x89\xcb\xf0\xcc\x41\xc3\x97\x18\x30\x45\x22\x45\x25\x89\x94\xd7\xac\x29\x96\x75\xd9\x20\xbb\x6f\x11\xa1\x66\x2c\x01\xac\x14\x95\x8a\x77\xdf\x90\xa6\x6a\x24\x1f\x64\x88\x2c\x50\x01\xa7\xdd\xa2\x69\x0e\x21\x75\xc9\x2c\x44\xcb\x47\xd8\x85\x98\x71\xc3\x5a\x52\xa6\x39\xc4\x34\x5a\xa4\x5f\xa4\x2c\x77\x1a\x57\x42\x8c\x6d\x5e\x6b\x02\x4c\x81\xad\xe3\x62\x5d\xff\x80\x6d\x12\x23\x53\x8a\x28\x68\x16\x10\xa0\xe7\x0c\x27\x07\x6a\xd0\x42\xd8\x6a\xa3\x0b\x7f\x0b\xd4\x02\x63\x06\x16\x4b\xca\x73\xa7\x02\xcf\x9d\x1e\xe6\xb9\xcb\x64\x7a\xb8\xd4\x23\xa6\xe4\xb3\x23\x9e\x1b\x31\x44\x81\x36\x32\x66\x98\xe3\x35\xcd\x7d\xe7\x80\x28\x5a\x53\x70\x31\x22\x9d\x4f\x55\x6b\x69\xeb\xa8\xaa\xf7\x7c\xb6\x95\xf4\xc2\xee\x2b\x18\x12\xc3\xd4\x88\x9c\x90\x27\x4f\x0b\xfd\x8e\xb1\x9e\x95\x02\x40\xde\x8d\x24\x00\x4c\x34\x74\x28\x6e\x0d\xe6\xed\xed\x1c\x2f\x74\xe1\x23\xab\x4f\x3f\x8e\x14\x1e\x84\x17\xe1\x0f\xf2\x22\xbc\xaa\xca\x13\xba\x03\xdf\x56\x88\xb6\xef\x5d\x80\xdd\xb6\xf5\xc2\xbf\x87\xaf\x2d\xa7\xbe\x83\x25\xf2\xfd\xc1\xdb\x4b\x24\xe5\x7a\xec\x70\x83\x51\xcc\x03\xd4\xbb\x31\x85\xe7\x5b\x18\x88\x00\xfd\x21\x6a\xf6\x74\x0f\x9e\xc5\x77\xa5\x41\x71\xb8\xc9\xed\x76\x51\xad\x30\x18\x0b\x19\x39\xe6\xa8\xc6\xcb\xbc\xd1\x47\x21\xca\xac\xc4\x5f\x07\x56\xe6\x71\xa6\x23\x4d\x55\x80\xad\x0f\xc7\xeb\xf2\xcf\x48\xc4\x61\xf4\xaa\xad\x31\x0a\xc6\x4f\xfe\x5a\xce\x3a\xbc\x87\xff\x61\x7d\x3c\x4c\x41\xa8\x86\x28\x08\x61\x59\x08\x96\x42\x27\x03\x41\x6c\xe0\xed\xf0\xc2\xa9\x89\x3c\x14\x46\xc2\xd6\x8a\x0d\x3f\x0c\xf1\x60\x7c\x01\x9a\xbf\xad\x56\xb6\x08\xe4\x86\x2c\x07\x04\x45\xe0\x78\xd9\x52\x71\xb4\x18\x19\x45\xe9\xc6\xa3\xd3\xe3\x0e\xe6\xfd\x70\x80\x35\xe4\x39\xc2\x24\x40\x76\x9d\x5b\xc1\x69\xc2\x03\xd1\xc0\x4c\x7f\xe9\x7c\xab\x27\xe7\x9b\xb9\x1a\xd1\x7a\xee\x53\x35\x0a\x55\xc9\x25\x30\x3f\x1f\x60\x6d\x0c\xe9\x2e\x3a\x12\x82\x4d\x8a\xf5\x12\xaf\x8e\x87\x58\xcd\x86\x07\x07\xf9\xd2\x08\xe7\x00\xb2\x54\xb6\x4e\xd8\xb4\xd1\xa6\xa2\x35\x2a\xce\xc6\xd4\x9f\x93\x0b\x97\x30\x15\x72\x62\x68\x9d\xa9\xc0\xb0\xc8\xb1\xb9\x83\x41\x73\xfd\x1c\xb9\xa2\xaa\x96\x4b\xe3\xc0\x5e\x22\xbf\x2f\x61\x5a\x2c\xc8\xff\x38\xc8\xaf\x28\x17\xd4\x17\x30\x28\xba\xc8\xa0\xf8\xc3\x02\x4d\x96\x03\xfb\x76\x80\x9d\xee\x00\x2b\x9d\x3e\x42\xd1\xa7\xc0\x12\x44\x43\x7e\x4c\x4d\x87\xc1\x1a\xa4\xaa\x3b\x34\x6c\x2c\x9a\x81\xd9\x02\xb3\x17\x44\x1a\x09\x83\x1d\x4e\x30\x13\x32\xd1\x44\x83\xe1\xcc\x16\x8c\x22\x03\x5c\xfa\x90\x92\xa0\x6e\x70\x35\x75\xbc\x49\x91\x07\x0c\xf0\x0b\x7c\xbf\x7c\x52\x87\xe1\xaf\xbb\x18\xb3\xfe\xeb\xf8\x5e\x21\x04\x1d\xee\x4d\x2e\xed\xe6\x35\x7c\x84\xb1\x15\xdc\xcc\x70\x40\xf9\x01\x16\xc4\xa9\xc7\x44\x14\x82\x27\x93\x93\x03\x4d\xa0\x28\x11\x30\x16\x97\x21\x46\xd6\x73\xd4\x4a\x46\x62\x8e\x10\x51\x75\xaa\xb4\x9f\x43\x4c\x48\xf6\x8c\x78\xd3\xa9\x48\xac\xd2\xeb\x9c\x72\x71\xc3\xab\xff\x26\x58\xf3\x8a\xab\xc0\xa8\x5f\x9b\xca\x35\xee\xe0\x37\x33\x5a\xe8\xc0\x3e\x47\xb1\x40\x34\x91\x6c\x09\x31\x44\xe1\xc6\x89\x9c\x67\x7a\x9c\xc7\x0c\x30\x73\x09\x35\x3d\x9a\xf2\xb1\x52\xf6\xe0\x16\x40\x3d\xc1\x9d\xb5\xf5\x49\x53\x9d\xf8\xff\x47\xe0\x54\x40\x18\x26\x83\x89\x95\x3f\x9c\xc8\xb3\x20\x22\x15\x6a\xe9\xe4\x63\xfd\xa6\x18\x5c\x77\x12\xad\xe0\x8d\xda\x85\xc5\x53\x71\x6d\x89\x57\x0f\xea\x25\x09\xf8\x4e\x64\x36\x89\x62\x00\x39\xa7\x62\x8f\xaf\xc0\x64\x47\x4b\x1c\xce\x7c\xc9\x76\x94\x34\x8b\xf9\xbd\x65\x54\x20\x8f\x1c\x20\x18\x3b\x3f\xbc\x65\xfc\x8a\x4f\xb2\xd6\xfb\x2c\xba\x11\x0b\x9b\xc0\x42\xc2\x89\xdf\x65\x83\x14\xb8\x9d\x3b\xef\x2c\x7d\xc0\x7b\x6d\x04\x0d\x91\xb7\xe5\x68\x59\x95\xae\xdd\xa2\x29\x0f\x1f\x61\xd6\x9f\x08\x0c\x6a\x4c\x79\x0f\xf5\xa4\x3b\x5b\x3b\xf0\x47\x03\x81\x91\xc0\x98\x10\x2d\x69\xb8\xef\xf8\xc3\x99\x5e\x9b\x6d\x5e\x00\x9c\x47\x6f\xaa\xd6\xd9\x4d\x55\xac\x14\xa5\x73\x5c\xbc\xa1\x38\xe7\x1a\x52\xc5\x70\x69\x16\x2b\xc2\x45\x86\xa2\x0c\x40\x2b\x7a\x9b\x59\xaf\x1e\x51\x10\x60\xac\x66\xc0\x13\x02\x34\x8c\xb4\xab\x10\x5a\x18\xcc\x8a\x9c\x19\xdc\x64\x5f\x33\xbd\xaa\xda\x45\xb3\x6e\x0b\xc0\x17\x39\x8c\xc5\x2b\x60\xbe\x77\x55\xf1\x80\x83\xbc\x36\x0f\xc8\xb3\x01\xc6\x00\x68\x18\xbd\x1d\x00\x1c\xc1\x6b\xc2\x8d\x02\xd6\x54\xfc\x80\x37\x03\xea\x4c\x8f\x92\x61\x4a\x20\xc7\xba\xd9\xef\xc0\x86\x40\x76\xd6\x6d\x55\x46\xdc\x8d\x01\x8e\x28\x47\xdc\x0d\xd8\x74\x95\xfa\xf7\x9c\x6f\x6d\xc3\xbf\x44\xeb\xc0\x5f\xae\xea\xb0\x2d\xcc\x1e\xa5\x38\x08\xa2\xa2\xba\x1f\x35\xcb\xa6\xe5\x56\xe2\x04\xd9\xcf\x3b\xbb\x6c\x58\xa4\x03\xff\x85\x3b\xa9\xe5\x3a\x2c\x6a\xd8\x58\x4d\x9e\x1e\xf4\x1e\x37\xbd\x0d\x78\x5d\xfe\xc4\x06\xd8\x33\x17\x20\xeb\x46\x30\x1d\xba\xc5\x33\x16\x9a\xcf\x71\xa4\x50\xce\x9e\x5e\x80\xad\x25\xee\x59\xb8\xbd\xfd\x6f\x74\x6d\x99\x65\x26\x10\xa4\xf9\x05\x06\xe1\x3e\x8c\x32\x59\x82\xfa\x85\xa1\xe3\xae\xa8\xd1\x4c\xb0\xfd\xea\x59\x2c\x49\x64\x3c\x8d\xdc\x5d\x62\xcb\x6c\x6d\xb3\xa9\x56\x78\x4b\x2c\xed\xaa\xad\xad\xcb\x48\x67\x95\xb0\xdc\xfa\x93\xdd\x3b\x21\xab\x2e\xcb\x1d\x25\x03\x28\x21\x6d\xb0\x2c\x19\x00\x36\x51\x04\x42\x09\xae\x9e\x01\x27\x0f\x16\x4e\xd2\x40\xb2\x3b\xba\x38\x6c\xef\xab\x7b\xcf\xfa\x90\xe1\x95\x92\x65\xa3\xf2\x63\xbb\x5e\xe7\x78\x71\xe3\x45\x12\xf0\x1f\xa0\x40\x95\x97\xad\x3f\x06\xda\x12\x4e\x4f\x32\x49\x1b\xa9\x5f\xd1\xb9\xe5\x73\xd0\xb0\x07\x94\x1f\xe9\xe2\x79\xa7\x8a\xa3\x3c\xd8\x2d\x04\xb3\x40\xa6\x6f\x61\xd1\x8f\x4e\x52\x24\x41\xd6\x7d\x6b\x56\xc4\x25\x2c\xb3\x4a\x65\xef\x80\x94\xb1\xbe\x40\xbc\x85\x5e\x96\x7f\x19\x66\xb9\x04\x8a\x05\xb2\xc4\xa8\xc6\x92\x75\xe6\x3e\x62\x69\x84\x15\xbe\x5c\xb6\x75\x47\x6a\x02\xae\x3d\xc4\x1a\x2b\xb9\x07\x89\x0a\xce\x6f\xf0\x18\x53\xf4\x8f\x14\xcb\x32\x99\x4a\x10\xdc\x22\xc9\x25\x1b\x54\x22\x22\x01\x28\xc2\x91\x76\xb6\x69\x81\xf2\x8d\x0d\x4a\xf0\x56\x11\xdc\x71\x34\x18\x21\x54\xa2\x85\xe0\x01\x6d\x4c\x6d\x96\x8d\xad\xf3\xff\x49\xa0\xdc\x03\x17\x17\xf6\x3b\x01\x98\xb0\x06\x49\xa0\xda\x1f\xf0\xa9\x0f\x6d\x30\x14\xf3\x68\x3a\x31\x61\x15\xe2\x28\xc4\xdb\xb7\xd6\x25\xdd\x67\x7e\xaa\x4b\xa2\xd6\x14\x56\x9d\xae\x2d\xea\x0b\x61\x96\x04\xc5\xfd\xe3\xbe\x52\x83\x0b\x92\x92\x04\xc9\x80\x03\xca\x2d\xa0\xb3\x92\xd8\x24\x2c\x3a\x7a\x20\x08\xdf\xe9\x9b\xeb\xcb\x63\x42\x1c\xc9\xc0\xb5\x70\x74\x0e\xf5\xbb\x8f\x66\x33\xc9\x00\x10\x2a\xce\x6f\x30\xf9\x38\xf6\xa7\x49\x47\x38\x0b\xe9\x14\x58\xc4\xed\x6e\x05\xac\x62\x02\x5b\x04\xb6\x6e\xdc\x31\x61\x14\xea\xd8\x11\x9e\xa2\xb0\xa8\x32\x5e\x47\xfd\xd5\x58\xb2\x7c\x4a\xa3\x9f\x7e\xe8\x58\x4f\x82\xd7\x12\x4d\x7b\x56\x62\xb4\x7e\x69\xa8\x47\x62\xb3\x4c\xb7\x37\xa9\xf5\x30\x9e\x80\x93\x7b\x2b\x7f\x88\x59\xc4\x0e\xc1\x1d\x05\xa6\x10\xe7\x51\x39\xd0\xc7\x2f\xaa\x6a\xfd\x90\x57\x45\xe0\x58\xab\x5b\x56\xbd\xda\xd5\x55\x53\x2d\xab\x82\x19\x7e\x25\x02\xcd\x2c\xeb\xca\x61\x1e\x82\x1e\x04\x48\x85\x27\x76\x01\x9e\x07\x07\x27\x99\xed\x5d\xe1\x56\x2a\x72\x93\xc4\x59\xc4\xdb\xc6\x7f\x46\xe3\x97\x43\x64\x02\xad\xd6\x62\xaf\xb9\x7e\xcb\xae\x50\x59\x1a\xca\xf8\xfb\xc0\xda\x03\xa8\xda\x21\x8c\x19\xb9\x9b\xf0\x76\x5a\x7a\xaa\xac\x02\x95\xfd\xce\x38\xf7\xe8\xfd\xe0\xaa\xf6\x97\x18\x0c\x57\x5b\xee\xcc\xf2\x13\xe4\xa0\x6b\x6b\x56\x04\x56\x21\xb7\x09\x63\x96\x3f\x8e\xf5\x24\x66\x34\x6e\x89\x17\x64\x24\x7e\x27\x04\x71\x46\x10\xd1\x15\xf0\x13\xbf\xbe\x0b\xda\x44\x07\x31\x37\x8b\x3d\xd7\x26\x49\x9a\x2c\x80\xe6\x95\x44\x61\x8c\x05\xc4\x04\xd9\x62\x82\x62\x3d\xdc\x08\xf4\x8d\x0c\x65\x6d\x28\x3f\x93\xca\xf1\x04\xc6\x38\x06\x71\x00\x76\x82\x44\x24\x98\xe5\xdd\xee\xd5\x23\xd6\x99\x48\x40\x77\x42\xaf\xdb\x2f\x8b\x08\xc9\x1a\x0c\xb0\xf5\x4a\x81\x0a\xf3\x08\x3e\xb4\x19\x6c\x3a\x1d\x8f\x0c\xe4\x96\x50\x53\xa1\x64\x64\x10\x84\xaa\x68\xf7\x81\xe9\x2e\x72\x32\x7c\x90\x77\xc4\x8a\x30\xdd\x33\x30\x08\x8c\xf3\xba\xf7\x76\x48\x39\x80\xa1\x63\xf4\x18\x5e\x3c\x81\x6c\x6d\xb0\x07\x07\x70\x21\x18\x42\x1a\x42\x88\x0c\x68\x0c\xd6\x76\x5b\x61\x0c\x51\x1d\x18\x26\x4a\xed\x1a\x66\xcb\xf7\xe7\x1b\xd8\x48\x2c\x35\x07\x8b\x65\xac\x8f\xe2\x0a\x51\xf2\xfb\x34\x72\x1c\x36\x8d\xe0\x56\x4a\xc1\x54\x8f\xd4\x0a\x53\x08\xae\x4c\xf2\x36\x80\x59\x42\xe8\x86\x07\xa8\xea\x71\x00\xc8\x51\x74\x66\xb8\xf1\xc0\xe5\x88\x87\x61\x86\x49\x55\x45\xa1\x0d\x38\x5b\xd3\x21\x4a\x51\x67\x90\x7e\x63\x99\x6f\x88\xb3\x0e\xa1\x1f\x24\xeb\x9d\x52\x57\x55\xe3\x27\x10\x8a\x34\x18\xf7\x15\xf8\x6c\x89\xbe\xa2\x17\xc9\xc7\x62\x14\x42\x80\x41\xc6\x60\x05\xc6\xca\xa1\x19\x04\x0c\x3d\xd9\xc9\x87\x35\x7c\x83\xa8\x99\xe2\x67\x1f\x7f\xd1\x09\x41\xa1\x28\xff\x27\x4c\x27\x9c\x13\x1e\x07\x9c\xc6\x40\xdf\x52\x63\xfe\x08\xaa\x47\x72\xb6\x19\x42\x40\x89\xe1\xbe\xf2\x2d\x51\x6d\xed\xf4\x7b\x38\x3c\x4f\x7f\xe8\xbe\xfb\xb5\xae\x6a\x08\xef\xdf\x84\x6a\x4b\xe2\xe1\x0b\x19\xc0\x50\xd1\x22\x03\xbf\x98\xb6\x0a\x70\x8f\x9a\x86\x47\x99\x46\x30\xe9\xb2\xb5\x1f\xc1\x76\x35\x83\x14\x0e\xe6\x29\x39\x93\x89\xcb\x06\x53\x5b\x42\x16\x38\x6f\xb0\xc5\xcb\x63\xbf\xc1\x19\xdc\xa5\xb7\xb9\x0b\x0e\x55\x82\x4c\x42\x06\xd7\xe0\xb0\xc6\x95\x09\x70\x30\xea\x32\x1e\xa9\x5d\xff\x23\xea\xe0\x87\xf6\x2f\xac\xde\x9a\xfa\x13\x1e\x96\x62\x34\x1e\xa1\x58\xcd\xc5\xd9\x50\x7d\x22\x7b\x7a\x2a\x36\x7f\x75\xac\x2f\x78\x32\x1b\xac\x5a\xc3\xf0\x04\x5c\x7f\x7e\x62\x39\x12\xe1\x1b\x01\x04\x18\xfe\x3f\x98\x0c\x5f\x8c\x78\x48\x1a\x72\x23\xf1\x05\xf6\x58\x9f\xdb\x65\x41\x5a\xca\x15\x02\xa9\x3b\x60\xb1\xda\xac\xac\xef\x0e\x82\xf3\x22\xb1\x2e\xd4\x43\xc2\x5f\xf1\xcd\x99\x0a\x1f\x45\xdf\x90\xcc\x39\x18\x0b\x87\xef\x5b\xcb\x15\x94\x97\x2b\xbb\x2d\x13\x94\x58\x6c\x39\x98\x47\xd8\xf4\xde\xb4\xe8\xc5\x5e\x89\xdc\x0a\x9e\xb0\x2e\xe9\x1e\xa8\x0e\x0c\x4e\x55\xde\x90\xa0\x0c\x32\xc8\x43\xb4\x40\x19\xe7\xda\xed\x2e\xf0\xc7\xc7\x8d\xd3\x75\x4d\xb2\xc0\x80\x2f\x3e\x43\x57\x1e\x22\x5f\x06\x9f\x19\x8a\x67\x49\x41\xa0\xe2\x02\x80\xc1\x0e\x13\xf6\x1d\xcf\xa7\x0e\x04\xab\x0b\xac\x80\x6b\x56\x08\x1c\x8e\x86\x84\x09\x46\x60\x9f\xb1\x0c\xa7\x35\xec\xd4\x46\xcc\x68\x8f\x46\x36\x45\xaf\x21\x06\xa7\x8a\x44\xe7\x9a\xf4\xb5\x7b\x02\xe6\x43\x10\x9b\x43\x77\xaa\x12\x21\x76\x83\x7e\x1d\x5b\x88\x66\x48\x60\x21\x9e\xb4\x74\x39\xe2\xc8\xdb\x7a\x3b\x06\x1e\xf7\x80\xf6\x60\xb3\x52\x36\x6f\xe0\x79\x60\x0b\x60\x42\x1c\x70\x40\x8c\xad\x55\x58\xb4\x91\x40\x79\x87\x69\x63\xcd\x6a\xd5\xbf\xaf\xe2\x22\xe4\x8e\x2b\x26\x32\x8d\xe7\x7a\xac\x0e\xd5\x91\xc4\x20\xcd\x51\x03\x4a\xab\xdf\xea\xe8\x46\xba\xb6\x7e\xf0\x6b\x02\x4e\x1f\xd1\x7e\x2d\xdb\x1f\x63\x09\xd0\x58\xa6\xef\x1b\x48\xf9\x8b\x04\x91\xb4\xe4\xb3\x88\xcc\x46\xf9\x21\xce\xcb\x04\x14\x96\x2c\xd2\xc9\x40\x20\xd0\x34\x24\xdc\xb0\xee\x5a\x49\xc2\x2c\x06\x33\x4f\x05\xd1\x4c\xfa\x3a\x78\x79\xcc\x37\x87\x12\x28\xc3\xb9\x06\x69\xd7\x92\x41\x3e\xe9\xa1\x8e\xc4\xce\xa9\xba\x7b\x29\x63\x0b\x88\x50\xd6\x02\x18\x87\xa0\x08\x61\x4e\xb2\x91\x24\x65\x88\xe8\x6b\xa0\x37\xc4\x16\xfb\x6b\x72\xd5\xab\x87\x34\xc3\xa0\xd0\xa6\x25\x77\xff\xd1\x10\x1e\xfb\x4f\x63\x70\x26\xf2\x92\x39\x84\xa5\xda\x48\xac\x6f\x88\x2c\x76\x9d\x69\xa3\xca\xe4\x41\xc9\x23\xf5\x55\x92\x47\x43\x2f\xc3\xdd\x0b\xb2\x46\xea\x39\x59\x23\xfd\xb4\xac\x51\x92\xd9\x0f\xb2\x02\x51\x85\xa8\x5b\xe0\x63\x63\x18\xc4\x00\x07\x7a\x72\x5c\x9d\x1e\x8f\x95\xa8\xa2\xa3\x50\x99\x35\x0e\x91\xa2\xe8\x24\x0f\x9a\x74\x0d\x99\xe5\x75\xa2\x25\xa3\x92\x78\x78\xd7\x60\x43\x94\x20\x04\x01\xd0\x51\x3d\x8e\x46\x23\xe6\x66\x29\x6c\x6b\x4a\x3f\xe8\x4d\x5e\x0c\xda\x7d\x49\xa9\x50\xb9\xf2\x0b\x39\x1d\xc2\xb4\x06\x05\x87\xfc\x68\x71\x0c\x6b\xd8\x60\x31\x7c\x16\xb1\x45\x9d\x87\xaf\x91\x52\x0d\x0a\x32\x48\x5e\x9c\x77\x5f\x18\x0e\x7f\x0c\xc1\xad\x2d\x6c\x12\x0c\xfb\xee\xea\x1c\xab\x5f\x7f\x78\xa9\x57\x60\xa5\xac\x99\x56\x0b\xea\x07\x68\x75\x5e\x56\xb5\xad\x60\xcc\x7b\x43\xa8\xbf\x66\x08\x45\x8f\xd4\xa1\x0e\x41\x3f\x72\xeb\x06\x7b\xa2\x0f\xf5\x24\x53\x81\x0c\x14\x64\xc1\x6b\xd7\x44\x89\xa2\x94\x61\x90\xce\x98\x6a\x7d\x78\xbd\xa8\xa3\xb5\x10\x2f\x3a\xee\x78\x5c\xb2\xb9\x91\xde\x74\xd9\x52\xb2\x2f\x3e\x15\x46\xd7\x1f\x74\xdf\x26\xa3\x4b\x28\x89\xa5\xcd\x77\xe1\xa4\xc4\x46\x8d\x95\x12\xc7\x42\xa8\x4c\xe9\xef\x2e\xde\x11\xe1\x4a\x88\xfb\xb1\xd9\xd8\xb0\xbd\x00\x7b\xf1\x8c\x9a\x98\x0e\x62\x62\x4f\x69\x89\x8d\xd5\x2c\x6d\x0c\x3c\x0a\x22\x66\x51\x48\x8c\x00\x0c\x8d\x9c\x67\x31\xfd\x19\xd5\x0e\x01\x5c\xef\x2f\xad\x29\xc0\x7f\x8c\xd2\x31\xa5\x7d\x8c\x07\x43\x28\xa3\x32\x5b\x61\xdd\xa5\xf8\xdb\xd3\x97\x78\x9a\xfe\x84\xf1\x39\x92\xc9\xba\xaa\x1a\x32\x36\x29\xa9\xf7\x1e\x2a\xaf\x52\x70\xff\x17\xea\x96\x21\x44\x70\x85\x70\x0f\x6e\x27\x56\x34\x91\x67\xaf\x3a\xca\x32\x7a\x52\x2e\xf3\xa2\x30\x08\x43\x0e\x4c\x1f\xfd\x5c\x07\x04\xda\x6b\xd4\xe3\x84\xf4\x40\x4f\xeb\x07\xf2\x3b\x4f\xe6\xa0\x65\xab\x28\xd0\x50\xe4\x9f\xac\x3f\xdb\xa3\xb5\xc0\xce\x7d\x54\x12\x1b\xd0\x5b\x4b\xd8\x72\x24\xbc\x16\x24\xd8\x54\x5f\x82\x6d\xf0\x92\x2a\xf7\xbd\xea\x41\x29\xb7\xc6\x3c\x31\xa2\x6c\x87\xce\xf0\xdf\xa8\xb5\x16\x46\x18\x70\x63\x7d\xe7\xfc\x4b\xa5\xd4\x34\x4b\xa9\x11\xbf\xc5\xcb\xb1\x9e\xf0\x75\x47\x9f\x21\xcb\xf9\xbc\x7a\x2c\x5d\x53\x5b\xb3\xd5\x37\x01\x53\xc2\x1a\x0e\xe1\xc0\x39\x50\x13\xd4\x7c\x81\xda\x99\xfa\x12\xb5\x33\x84\x55\xd7\x6d\x99\xc5\xa1\x97\x75\x91\x41\x3a\x1d\x44\x0c\xa3\xda\x99\x1c\xd6\xbf\x5e\x79\x2c\x5a\x8c\x91\x0a\x6b\x52\xea\x91\x2d\x1b\x70\x8f\x62\x4e\x66\x84\xa6\xbd\xcc\xd2\x84\x3c\x10\xbe\x05\x0b\x09\xb1\x82\x4c\xb2\x47\x81\xd6\xa1\x48\xab\x16\xa8\x3b\x65\x9c\xb3\x08\x34\xad\x4a\x32\xca\xda\x05\xa0\xba\x30\xc8\x93\x3e\x03\x96\xa8\xad\xef\xd1\xc4\x97\xd4\x54\xde\xfb\x79\x7a\x9b\x22\x70\x97\xd1\x4f\xa8\x31\x95\x76\x2e\x53\x80\xe4\xc6\xc4\x4d\x43\xd2\x2b\xb2\xab\x42\x1e\xcb\x75\x21\x65\x00\xf6\x28\x5c\xfc\x80\x0a\x04\x9d\x51\xa9\xb1\x8a\x9f\xe5\x24\xf9\xfe\x1b\x7f\x79\xdb\x15\x94\xf9\x61\xdc\x24\x10\x5a\x6e\xcc\x0a\x3d\x81\xb6\x80\xda\x09\x89\x5d\xdd\xd5\xf6\x21\xaf\x5a\x17\x0d\x2c\x56\x9f\x8d\x42\xe6\x69\x81\xc0\x41\xe0\x52\x42\xdf\xc2\x4b\xf5\x40\x9b\x82\xfd\x22\xff\xbe\x31\x4e\xe5\x4d\x88\xe8\xd9\x26\x48\x1d\x8b\xdb\xdd\xae\xd7\x55\xdd\xb8\x8e\x89\xfc\x85\x82\x7c\x42\x84\x2f\xe6\x2b\x9d\x62\xa3\xd3\xdf\xf1\x50\xbb\x7d\x40\x27\x34\xa1\x36\xd8\x0f\xbc\x5e\x85\xad\x6a\x6d\xc6\xf2\x69\x22\x3f\x4e\xc0\x1c\x4c\xc2\xc5\xa6\x0c\x15\xb7\xab\x3e\x1f\x50\xf2\xc6\x32\x6f\x20\x1a\x56\xe4\x0d\x95\x46\x0a\xd3\xda\xaf\xaa\xba\x72\xee\x04\xe2\x82\xe8\xc6\xb6\x80\xd8\x84\xba\x3d\x48\xc5\x14\xe6\xd1\xb5\x79\x73\x8c\x7a\x7f\xc1\x53\x17\x46\x39\x7d\x38\x9e\xd3\xab\x98\x9c\xc8\xf0\x2a\xca\xb4\x43\xf4\x4a\x16\xe1\x81\x80\x13\x35\x05\x6e\x43\x3f\x32\x75\x57\xfa\x52\x57\xb5\xea\x88\xad\x41\xc5\x84\x3f\x6a\x4f\xc7\xfa\x03\x0a\x2e\x31\x3b\x1a\x89\x6d\x55\xf5\x88\xb1\x18\x1d\x0b\xd1\xef\xa7\x10\x6e\x05\x00\xfc\xc0\xec\x75\xee\x65\xc1\xa1\x96\x10\x9d\x08\x85\x28\x28\xb5\x1a\xc7\x82\x22\x10\x41\x62\xfa\x3c\x15\x41\xff\x94\x2f\xe7\x56\x7e\xe3\x92\x46\x07\x9a\x38\xaa\x96\x48\x3e\x17\x48\x5c\x92\x21\xa7\xc4\x91\x3f\xd7\x92\x5f\xeb\xea\x91\x10\x45\x74\x3e\x16\x31\xa2\x20\x1e\x9c\x45\xe4\x50\x51\x5b\xb3\xda\x6b\xb3\x24\xa3\xc6\x6f\x32\x5b\x5b\x34\x3b\xf9\xb7\x19\x5f\x0f\xfe\x78\x80\x44\x1d\xcd\x76\x30\xae\xb7\xa6\x2c\x41\x88\x36\xd4\x2a\xf7\xa1\xc4\xeb\xce\xc2\x80\x73\x1a\xd7\x46\x20\x17\xe8\x0c\x09\xe6\x60\xe8\xaa\xe7\x44\x31\x75\x35\x36\x49\x2f\xac\x8a\x4d\x82\x64\xd0\x90\x92\x25\x6f\xfb\xa1\x7a\x53\xf1\xee\x40\xae\x0e\x9b\x59\x46\x4d\xa1\x3f\x91\x87\x24\xa3\x59\xac\x8a\x51\x24\x2c\x89\x18\x87\xa6\xc2\x53\x83\x67\x28\x6a\x03\x23\xbb\x36\x8d\x99\x14\x74\x0b\x08\x52\x19\x0f\xe0\x37\xab\x78\x65\x4e\xb1\xf6\x30\x0e\x97\x90\xbd\x35\x10\xba\x08\x25\xf1\x99\x5f\x99\xc5\xea\x31\x5f\xc5\xe3\x06\xd5\x1a\xb1\x59\xe1\x3c\x4a\x8a\xca\xc5\x0a\x3c\xb0\x00\x33\x96\x50\xc8\x10\x1a\xe5\x27\x32\x23\x9c\x73\xdc\xde\xb8\xb7\x11\xd5\x1b\x79\x12\x9e\x30\x42\x2c\x53\x4c\x80\x23\x72\x60\x55\x8c\x95\x9a\x71\x00\x26\x4a\x4a\x61\x9f\xe8\x8a\x82\xe0\xd2\x28\x0d\x1d\xe0\xe1\x50\xee\x39\x00\x12\x55\x43\x15\x65\xc2\xf3\x06\x83\x6b\x54\x3a\xa5\x57\xb6\xac\xc8\x51\xc9\xd0\x67\xaa\xc8\xd0\xb1\xe0\xc4\xc2\xd3\x8f\x02\x45\x5a\xc9\x4f\x56\x5d\xc3\x17\x75\x03\xe3\x77\xe0\x7d\x0f\xb6\x34\x58\x70\x08\x90\xd3\x96\x02\xf6\x7d\x35\xd5\xe3\x31\xf0\x04\xc2\x24\x8f\x08\xaf\xdd\x09\x8b\x60\x9c\x0e\x0d\x8a\x40\xe2\x08\xc5\x58\x0c\xef\x3e\xd0\xd9\x83\xdd\x92\x35\xd6\xf0\xdc\x3e\xd2\xa8\x63\xab\x7e\x2a\x61\x2a\xc0\x32\x2d\xd0\xde\x2e\x7b\x0d\x0d\x00\xa2\x61\x5c\x41\xc2\xdd\x49\x08\x98\x14\xae\x8b\xc1\xfc\xa0\xdd\x0b\xea\x8e\xd5\x3a\xd6\xeb\xae\x9e\x2f\xbb\x89\x84\x87\x01\x5d\x10\x5e\xa2\x3a\x25\x01\xe1\x62\x86\x7c\xbf\xff\x24\xc0\x3a\xf2\x18\x46\x08\x81\x22\x0c\x7c\x46\xd8\xa9\xe2\x1a\xa8\x03\x48\x22\x54\x35\x71\x55\x7c\x79\x04\x89\xd6\xa8\x13\x09\x42\x8d\xbb\x3a\x7f\x40\x2d\x70\x00\x86\xd0\x10\x2d\x6c\x69\xd7\x79\x13\x61\x90\xc9\x72\x60\xd1\x2c\x19\x69\x61\xa6\x2d\x75\xf4\x6d\x78\x43\xf6\x9b\x8e\xa2\x30\x94\xca\xaf\x9c\xcf\x8d\xa5\x38\x6b\x7f\x4d\xae\xa2\xf3\x13\x01\xf5\x63\x3d\xfa\xb7\xee\x5a\x19\x29\x5c\xb6\x21\xf8\x82\xa9\x11\x1d\xd8\x63\x88\x7e\xd4\xdf\x07\x81\xf9\xbd\xb3\xb2\x88\x93\x43\x62\x85\x7b\x91\x6b\xa2\xe5\x44\x93\x8b\xc3\x2a\xd8\x2e\xac\x8c\x1b\x2a\x1e\x54\xe9\x37\xf1\xd2\x09\xda\xa7\x12\x74\x01\x74\xec\xf9\x1a\x89\x4e\x59\x16\x92\xb3\x96\xf4\x00\x15\xca\xca\x28\xb8\x02\xca\xc8\xb0\x1a\x40\xdf\x32\xc2\x21\x60\xcb\x65\xfe\x0e\x72\x2d\xb1\x9b\xa3\x91\xbc\xac\xca\xd2\x26\x4c\x9e\xfe\x46\x2d\x6c\xe2\x44\xf8\xdd\x82\xb3\x0c\xa7\x9a\x92\x25\xea\xc2\x13\x86\xca\x8d\x5d\x5d\x2d\x5b\x76\xac\x1e\xec\x9e\x5c\xde\xac\xb7\xc9\xa1\xce\xde\x1f\x44\x6a\xe8\x08\x02\x5b\x40\x02\x73\x01\x97\xea\xdd\x94\x21\x32\x97\x60\x92\x05\x96\x1b\x06\xda\x86\xb6\x65\x42\xb8\x3d\x1c\x3b\x81\x9a\x4e\xfa\x45\x49\x33\x15\x0b\x05\x77\xdb\xe8\xc7\x00\x6f\x65\x7f\x17\x24\xee\x34\xae\x63\x8a\xeb\x24\x24\x02\x6a\xe0\x15\x58\x4e\x3a\xa0\x76\x3e\xe9\xbe\x32\x77\x7a\xb4\xca\xdd\xb2\xce\xe1\x2a\xa9\xea\x3d\x94\x7d\x0e\x11\xba\x89\xd4\x9b\x5b\x56\x3b\x1b\xef\x40\x44\x64\x67\x81\x7f\xc4\x75\x9d\x95\x8c\x30\xcb\x01\xee\x13\x39\x00\xd0\x1e\xc0\x4f\x2a\xf4\x7f\x25\x48\x28\x7a\x39\x3a\x00\x81\x12\x4e\xb3\xc3\x8c\x5a\xa9\xe4\xf9\x81\x2a\xcc\x75\xd0\xe4\x30\xd1\xe3\xf5\x17\x52\x5c\x9b\x04\xe6\x4a\xf0\x8c\x9c\xde\x63\x11\x50\x6f\x33\x12\x84\x33\x51\xa3\x0f\xf2\x1f\xd4\x3e\x30\xd4\x11\x6e\xe2\xaf\xbf\x9d\xd9\x33\x24\x31\x49\x15\x34\xfb\x94\x28\x81\x30\x49\x1c\x3f\x25\x46\x3b\xbf\xba\x54\xcc\xef\x35\x09\xa3\x9c\x78\x5f\xef\xd9\x68\x90\x65\xcc\xb2\x8d\xc3\xac\x64\x60\x15\x0f\x11\x0e\xc5\xf5\x96\x17\x07\x56\x33\x54\xf5\x14\xab\xa7\x6b\xb8\x01\x8d\x66\xff\x48\x48\xeb\xd4\x92\x67\x07\x08\x2b\xc2\x68\xd4\x11\x62\xd8\x72\x20\x9f\x5d\x85\x28\x12\x4a\xc4\xfa\x5f\x1f\xe3\xc5\xb4\x38\xd6\xbb\x3a\xa7\x02\x4f\xbc\x8c\x57\xe9\xab\xa9\xa2\x8c\xf7\x27\x01\xcc\x49\xbd\x34\x94\x20\xbb\xa8\xcb\x6e\x98\xf7\x34\x39\x64\x30\x49\x02\x93\x68\x21\x1c\xb0\xc2\x52\x08\x5a\x9f\xf1\x4c\xd3\xa1\xac\xb2\xa3\x53\x6e\x82\xaf\x9c\xc5\x98\xfa\xab\x3f\xe9\x4b\x53\x2f\x37\xfa\xd5\xcb\x97\x3f\x22\xd2\x67\x13\xf8\x4f\x45\x68\x2f\xa0\xdc\x80\xe5\xac\x6e\x43\xe6\x8e\x5c\x67\x09\x9c\x01\x82\x1b\x14\x46\x0a\x33\x12\x6c\x86\x95\x5d\x87\x78\x4c\xc2\x78\x4d\x18\x85\xbd\xb0\x8a\x17\x56\x18\x21\x4d\x25\x82\xea\x22\x7b\xc9\xdd\x04\x86\x25\xef\x0b\xbf\x1a\xeb\xab\x4a\xcf\xdb\xba\xb6\xf0\xd9\x6a\xad\xaf\x81\x54\xec\x1b\xd0\x2f\x5a\x55\x24\x5c\x3e\xac\xab\xaf\x7f\xa3\xae\xbe\x1a\xd0\xd5\xd7\xbf\x51\x57\x5f\x3d\xfd\xdd\xae\xae\x7e\x7a\x3d\x24\xd7\x02\xad\x21\x85\xe6\xdb\x17\x88\xee\x0f\x90\x46\x75\x39\x3d\xd4\x97\x8a\xee\xeb\xc3\xa2\xfb\x69\x93\x23\x62\x00\x84\xc7\x0e\x28\xef\xc3\x91\xe9\x07\x1f\x0e\xae\x98\x08\xe7\xd2\x36\xd8\xb7\x60\x04\x17\x85\x5d\x36\xda\xb0\x6f\x07\xfb\x32\x14\x38\x86\x93\x4b\x6c\x69\x90\x6c\xa3\xac\x4d\x2c\x69\x57\x02\x2f\x49\x2c\x80\x4f\xc8\xeb\xd3\x93\x82\x84\x6f\x12\x46\x79\x4a\x67\x1f\x1b\x92\x9e\xa8\x91\x7c\xc7\xaf\xe8\x6f\xc7\xfa\x9a\xe3\x44\x1d\x94\x89\x01\x4d\x05\x4c\x7a\xd1\xaa\x60\xbe\x89\x50\x83\x61\x0a\x21\xfd\x9e\x44\x72\x7a\xd5\x20\xc9\x76\x4b\xe3\xd4\xf0\xb2\x80\x31\x0f\xb6\x7d\x78\x1b\xb5\x43\x72\x5a\x8b\xc7\x3d\xe4\x11\xf1\xed\x0d\xe0\xa2\x32\x58\x8a\xc8\x7a\x16\xb2\x06\x2f\x7b\xce\x5f\x19\xab\x4b\x04\xfb\x7e\x49\x37\x0f\x77\x52\x73\x27\xd5\x50\x27\x43\x00\x23\x72\x1f\x46\x59\xee\x0c\x19\x92\xa9\x00\x3b\x0e\x93\x82\x63\x0d\x99\x44\xa2\xc3\xf0\xd5\x4d\xac\xed\xb6\x6a\x6c\xe1\xed\xe2\x2e\x11\xbd\x0e\x44\xf4\xb1\xb4\x38\x34\x19\x32\xa7\xa6\x68\x2d\xd6\x57\x81\x6e\x23\x2d\x33\x05\xf6\x2d\x5f\x55\xa0\xf2\x6b\x5d\x0c\x39\x87\x6f\x3d\xd3\x34\xf0\x96\x06\xdf\x6c\x1a\x2a\xf2\x00\xc1\x3f\xc7\x60\xb7\x9a\x59\xcb\xfd\xab\xf7\x92\xcb\x51\x8a\x4f\x0f\xbc\x69\xac\xd4\x68\x60\x51\x8d\x04\x15\xfa\xc1\x22\xff\x4e\x27\xfc\x9b\xfa\x1d\x31\x4f\x94\xdd\x06\xaa\x80\x94\xe4\x96\x84\xc6\x54\xd4\xe5\xff\xd2\xa5\x96\x6e\x9f\x10\x73\xce\xd4\xd0\xda\xda\x9a\xd2\xd0\xb5\x28\x6c\xb9\x2e\xf5\x8d\x10\x84\xe2\x66\xaa\xe4\xef\x64\xcb\x57\xa5\x78\xca\xb6\x2a\xf3\xa6\xaa\x53\x33\x71\x61\x96\x9f\xda\x9d\xf8\x05\x91\xb7\xa8\x44\xf4\x79\x53\xb9\x8e\x79\xe9\x07\x08\x82\x29\x38\xfb\xcc\x99\x0f\x56\x5c\x4b\x6a\x79\xc8\xda\xc8\xfe\x02\x2f\x17\x4c\xc9\x1e\x3a\x37\xc2\x31\x16\xc6\x8f\x4e\xc2\xef\xc6\xfa\x86\x74\xeb\x7f\x11\xa8\xc4\x4e\xfa\x2c\xd1\xcc\xf9\x0a\xd1\xfb\xd0\x9e\x54\xa3\x46\xfd\x35\xc2\xf7\x5a\x0a\xdf\xab\xe6\xaf\x10\xbe\xd7\x7f\x27\xe1\x7b\x9a\x4b\x06\xac\xe3\xe7\x93\x8a\xc1\x03\xe3\x14\x8c\x84\x11\x41\x1d\x53\x11\xfc\x54\x2a\x3f\xd3\x5f\x27\x89\xaf\x0e\x4b\xe2\xf7\x5b\xf8\x9c\x36\xbe\x5a\xec\x53\x61\xa5\xee\x68\x7c\xa1\x16\x3e\x8f\x82\x1a\x18\x85\xae\x3a\xbe\x7e\x5a\x1d\x9f\x9b\xa3\x50\xe7\xe9\xd0\xec\xf0\x4e\xdb\xd5\xd5\xe7\x3d\x64\xfc\x56\x76\xe9\x5f\x8e\x87\xfd\xba\x05\xde\x27\xb1\xa6\xd5\x33\x73\xe5\x1f\x41\x05\x20\x59\xa0\x63\xf9\x0c\x89\x51\xfc\x60\x80\x23\x02\xaa\x2f\x49\xfe\xc7\x41\x91\x50\x15\x91\x54\xa2\x82\x04\x1a\x00\x78\x3a\x7d\x43\x75\x4e\xe9\xb1\x52\x17\x30\x57\xec\x30\x84\x2e\xf8\x11\x84\xf4\x2b\x81\x30\x19\xa2\x08\xbc\x52\x4c\xf4\x20\xab\x47\x02\x2c\x43\x95\x55\xf2\x05\x61\xd9\x76\x0c\x7e\x20\x62\x43\x45\xce\x6a\x00\x7e\x05\x98\x12\x4c\x61\x47\x9e\x5b\xdf\x27\xc2\x7d\xe3\x92\x85\xec\xa0\x58\x6e\x74\x64\x7d\x3f\x0e\xa5\x06\xb8\x6c\x7e\xa5\x62\x83\xb1\x52\x87\x74\xec\xf5\xd7\xeb\xd8\xab\xc3\x3a\xf6\xfa\xeb\x74\xec\xd5\xb3\x3a\xf6\xfa\x6b\x74\xec\xd5\x73\x3a\xf6\x03\x5a\xe2\x87\x74\xec\xd5\xd3\x3a\xf6\xfa\x6b\x74\xec\xd5\xd3\x3a\xf6\x5d\x99\xf1\x67\x74\xec\xd5\x13\x3a\xf6\xfa\xeb\x74\xec\x55\xa2\x63\xef\x97\xd0\x0f\x63\x2c\x64\x08\xe9\xb9\x0b\x46\xcf\xfb\x93\xe2\xf7\x10\xb9\xd7\xbf\xce\x2e\x2e\xd4\xd7\x89\xdc\x5f\x9f\xcf\xde\xfa\x05\x42\x12\xf7\x67\xd7\x57\xbf\x4c\x3f\xce\x93\x41\xf9\x2b\xd5\xed\x75\x4f\xdd\x5e\xfd\x76\x75\x7b\xdd\x51\xb7\x57\xbf\x5d\xdd\x5e\x0f\xab\xdb\xab\xdf\xa6\x6e\xaf\x07\xd4\xed\xd5\x6f\x56\xb7\xd7\x1d\x75\x7b\xf5\x57\xa8\xdb\xc3\xe2\xfb\x71\x8c\xfa\x2d\xbb\xda\xc6\x05\x38\xef\xd5\x3c\xc5\x3b\x6b\x95\x9c\x76\xa1\xb4\xca\x7f\xac\x48\x56\x71\xac\x01\x09\xc8\x7d\x84\x7e\x63\x5c\x43\x2d\x2c\xd9\x32\x45\xb5\x34\x05\x55\x43\x21\x43\x33\xc1\xed\xe9\xfc\xc5\x82\x3b\xc2\xac\x7b\x13\xcf\x3e\x62\xd8\xbe\xad\x1b\x66\xf6\x40\x04\x39\x3d\xc9\x3c\x52\xb8\xa9\x72\x8d\x5e\x16\x15\x16\x11\xef\xfc\xcd\x07\x52\x14\x28\x8a\xb5\x70\x55\xd1\x36\x16\x09\xa8\xd1\xa4\x28\x0a\xbd\xcc\x1f\xf2\x42\xc5\xb6\x0f\xc4\x19\x93\x5a\x4b\x46\x37\x27\x45\x66\xb1\xba\x45\x25\x03\x11\xab\xe4\xbb\x18\xa7\x00\xb1\xf0\xce\x61\xd3\xd6\x09\x43\xee\x3f\x5a\xef\xf2\x8f\x9f\xf4\x67\xfc\xe2\xdd\xdb\xf3\x8b\x93\xd3\xf1\xe9\x49\x55\x9f\x80\x55\xf0\xbb\x0b\xc1\x3e\xad\xff\xfa\xdd\xb7\x2f\xbf\xef\xea\xbf\x7e\xf7\xed\x0f\xdf\xfe\xa1\xff\xfa\xf7\xf8\x79\x77\x75\x87\x5a\xf9\xe7\x54\x9c\x84\x67\x5e\xd4\x80\x25\xb3\xf9\x74\x7c\x9a\xc5\xf8\xfb\x4b\xa9\xff\x7a\x74\x76\x0c\xbf\x7b\x46\x73\x5f\x4a\xee\xeb\x79\x47\x6e\x5f\x0d\xca\xed\xeb\xbb\xf9\xe4\x1f\x27\x24\x8b\x92\xb1\x1f\x6e\xa6\x93\x4b\x6f\xb5\x02\x4f\x46\x12\x13\x92\xb0\xf1\x08\xd9\x80\x7c\x7c\x6b\x8a\x4c\x37\xf6\x73\xb3\xa8\xaa\x4f\x02\x20\xc8\x94\x82\xa1\x70\x6d\xb4\xae\xad\x1d\x71\x9e\xcc\x61\x06\x62\x0d\xc0\x88\x55\xb5\xfd\x19\x1c\x6b\x07\xd4\x35\x21\xfe\x08\x09\x2f\x16\x5d\x50\xf4\xc9\x64\x3c\x3a\x9a\xf9\x24\x04\xd9\x15\xc6\xdc\x63\xc7\x33\x72\x52\x95\xa4\x21\xa4\x22\x2a\xf9\xab\xb1\xbf\x4a\x59\x0d\x34\x4b\xbb\x4f\x35\xc2\x11\xc6\x4f\x34\x42\x88\x10\x22\xe7\x11\x00\x79\x66\x8f\x1a\x5d\x8d\x5e\xfa\x56\x06\x38\x40\xce\x08\x87\xc7\x4d\x5e\x10\x45\xb0\xa5\x8c\x36\x95\x3c\xaa\x2e\x6a\x39\xa5\x43\x87\xe4\xd7\x82\xe2\xfd\xa8\xf9\x9f\x4e\x90\x09\x92\x9c\xa0\x49\x5f\xd8\x75\x97\x47\x0c\x19\x94\x2d\xe8\x8f\x7a\x3f\x0e\x33\xc4\xe4\x99\x86\x29\x83\x60\x72\xb3\xb1\x5b\x67\x0b\xdf\xe5\x05\xc9\x6f\x49\x16\x43\x47\xd9\x0f\x54\x8e\x2f\x08\x80\xe1\x07\xc6\x6f\xb8\x61\x35\xf3\x2c\x12\x95\xe1\x85\xea\x5b\x18\x8b\x07\x99\x70\x0c\x52\x04\xb5\x8d\x11\xaf\xb1\x52\xbf\x5a\x8c\x4f\x44\x01\xab\x43\x35\x0d\x40\x0c\xd4\x50\xc5\xbb\x5f\xa6\x2e\x3c\x30\x46\xcb\x14\x33\x17\x25\xbf\x06\x82\x37\x87\xbf\x5b\xc9\xd3\xe2\x67\x7f\xb9\x0b\x01\x32\xed\x36\x10\x58\x5b\x56\x5b\x62\xa9\xe4\x57\xa1\xf5\xc4\x11\x13\x18\x29\x5a\xbf\x42\x9a\x2b\xbc\x6f\x55\x59\x17\x19\x76\x94\x98\x4a\xbf\x3c\x58\x76\x09\x80\x0b\xf4\x0d\x7a\xcf\x6b\xdf\x45\x11\x2e\x08\xb5\xbc\x7e\x47\xb6\xa6\x50\xb8\xd4\x52\x6a\x21\x06\xce\x6f\x4d\x43\xa2\xb4\x9c\x57\xcb\x23\x97\x09\xc4\x40\x20\x40\xba\xab\x73\xa0\x7f\xf2\x1b\x7c\xac\x7f\x05\xa0\xbf\xdf\x2d\x9d\x7c\x0a\x7c\x6e\x99\xef\x50\x80\xab\xaa\x69\x4d\x21\xf9\x1e\x9f\x26\x90\x28\x77\x4d\xdd\x62\x1a\x16\x6a\xd1\x21\x5c\xc0\x3a\x5c\xa7\xe3\xe0\x1d\x45\x57\xf2\x7c\xfa\x76\x76\xc5\xfa\xd6\xa9\x6c\x53\x0c\x5f\x01\xcf\x17\x8c\x8a\x38\x84\x98\x5a\x67\xa0\xaa\x17\x2a\x3f\x05\xea\xb4\x13\x5f\x20\x42\xc8\x38\xbc\xf1\xa0\x39\x08\xdd\x52\xb2\xb2\x43\x8f\xf8\xa2\x19\x65\x28\x77\x93\x75\x34\xad\xa9\xc4\x9e\x9b\x8c\x75\x25\x13\xa0\x2b\xdb\x2e\x6c\xcd\xe1\x59\x66\x86\x71\xb1\x1c\x98\xe0\x69\xc3\xb2\xd6\x00\x36\x0e\x72\x0c\xbf\x74\xb4\x9d\xcf\xc3\xe6\x0e\xec\x68\x9c\x6c\x67\xaa\x01\xf9\x31\x94\x7f\x4e\xe0\xcd\x7c\x8c\xe2\xc5\xb3\x0a\x17\x51\x20\xea\xea\x1c\x57\x14\xd7\x05\xc8\x8f\x37\xbb\x56\x0a\xf9\x02\x4b\x9c\x23\xa1\xe6\x39\xd1\x23\x3e\x79\xf7\xec\xce\x10\x54\xba\x34\x5b\x0b\xd2\x21\xb6\x5c\xe5\x9f\x31\x53\xb6\xae\xab\xb2\x39\xa1\x55\xcc\x95\x53\x94\xc3\x08\xdd\xa4\x93\xce\xef\x49\xa9\xbf\x24\x70\x63\x51\xf8\x48\xcb\x11\x77\xa0\x79\x55\xd5\x2a\xa9\xd9\x17\x03\x48\x50\x0d\xfe\xf7\x37\x4e\x03\xfc\x05\xc2\xef\xb8\xc1\x8e\x2a\xaa\xae\x82\x6e\xd3\x7e\x73\xc7\x8a\x75\x9d\x60\x41\x72\x9d\x12\x43\xaf\x8a\x95\x5e\xfb\x87\x84\x02\xfb\x80\xb6\x31\x4d\xf7\x0d\x63\x75\xd4\xcd\xc8\x26\x4d\x44\x5c\x0a\x54\xb7\x9b\x70\x49\x23\xc2\xd9\x1f\xeb\xa6\xc9\x97\x80\x40\x0d\xa3\xae\xe6\xcc\x75\x44\x49\x61\xfb\x79\x57\x18\x16\x79\x89\x5f\x1a\x1f\x93\xba\xb8\x18\xbc\x25\xe7\x53\x0d\xf5\xd4\x2f\xe0\x4d\xee\x9a\xaa\x06\x26\xc5\x21\x8f\x8c\x47\x8a\x57\x4e\x67\xa8\x32\x0a\x1b\x83\x9b\x99\x25\xc4\x83\xbb\x4d\x5e\x54\xae\xda\x6d\xfc\xb3\x33\x6d\x9b\x0d\xd3\x35\xee\xaa\x22\x6f\x90\x83\xbb\x72\x39\x31\xcf\xf8\xf3\x8f\xd6\xf6\x96\x85\x39\x67\xe5\x83\xa9\x73\x53\x36\xc1\x75\x46\xb8\x3a\x47\xd9\x7b\x6b\x91\x4f\xb3\x26\x6f\x0a\xd4\x47\x16\x9c\xc1\x99\x02\xa2\xad\xa8\x58\x56\xad\x75\xff\x0d\x59\x94\x8f\x6d\x42\x8a\xce\x99\xbd\xb8\x15\xc2\xd6\xeb\x49\x79\x74\x73\x2a\x24\x2f\xea\x1d\xe1\x5b\xfb\xb9\xe9\x34\xdf\x6d\xaa\xba\x01\x7a\x28\x73\x4f\xf6\x21\x90\xdf\x32\x78\xaa\xc8\x1d\xe0\x4e\x0c\x48\x64\x95\xcd\x09\x3c\x49\xc1\x93\xfc\x38\xbe\x31\xcb\x4f\x27\xe2\xe9\x5f\xd1\x74\xa9\x42\x32\x54\xb4\x0d\x5b\xfd\xd6\x1f\x08\x3b\x53\xfb\x13\x32\x71\xab\xbb\x47\x54\x9f\xc6\x1e\x31\xb5\x81\xf8\x04\x49\xde\x02\x27\x17\xf1\xbd\x32\x36\xac\x39\x24\x64\x9b\x32\xce\x12\x4f\xac\x62\x60\x37\x9f\xfb\x0f\xb9\x7d\xa4\x02\x50\x6f\xc6\xd9\x55\xdc\x99\xa0\x46\xdb\xd4\xc6\xdf\x1b\xeb\xaa\x7e\xf4\x77\x2c\x1d\x2d\xf0\xec\x7c\xa9\x60\xc8\xfd\xf7\x88\xbb\x04\xca\x6f\xf3\x2d\xcc\x08\xc8\xdd\x42\xb4\x7b\xad\x77\xf9\x67\x5b\xb8\x63\xfe\x9e\xde\x99\xbc\x6c\x62\xa2\xb3\xaa\xb1\x70\x77\x55\x9b\xc7\xbc\xbc\x77\xc7\x08\x61\x24\xd9\xe4\xd8\x33\xfa\x3b\xbd\x91\xd3\xa9\x88\x50\x73\x6d\x0e\x6a\xb0\x0a\x09\x5c\x77\x2d\x1e\x61\xbe\x81\x38\x70\x0d\x1e\x78\x68\x43\x84\x22\x41\x3e\xb7\x09\x24\x6e\xb4\x5f\xd2\x16\x21\x67\xf8\xbd\xf8\x68\xfd\xd4\xa3\xc7\x7a\x82\xd3\x0c\xf6\x2b\x2a\x32\x04\xac\x8e\x12\xab\x01\x78\x13\xd2\xc9\xdc\x9a\xfa\x53\xbb\x8b\x5c\x76\x52\xbf\xb4\xd9\x3c\x1a\xd4\x2c\x5a\xe5\x6e\x59\xb5\x98\x24\x6d\x17\x08\x72\x49\xb5\xf1\xbd\xd9\xec\x57\x91\xef\x29\x59\x57\xe2\xc5\xa1\x85\x3c\x64\x65\xd5\xa8\x74\x9d\xc6\x62\x99\xd1\xf5\xce\xfc\xa5\xb5\xfe\xbe\x9d\xe2\xf9\x4b\xc6\x55\x1c\x0a\x18\x1b\x3f\x24\xb2\x73\xe4\xae\x31\x96\x12\x8f\xd7\xc9\xfc\x6c\x36\x63\xa7\x45\x61\x6f\x33\xbf\xed\xf2\x72\x5d\xd1\x88\xe2\x03\x33\x7d\x61\x6e\xed\x7f\xeb\xfc\x6e\xfe\xee\xf2\xc2\x8f\xc0\x7f\xbb\xbc\xa0\x34\x6e\x04\x8d\xab\xb8\x3c\xce\x6f\xcf\x49\x43\x99\x64\xa0\x4f\x96\x55\xc9\xa4\xf5\x0e\x28\xea\xf4\xfb\xdb\xcb\x8b\xd4\x06\xdf\xb4\x5b\x53\x26\xc3\x38\x56\xd8\xf9\xd0\x49\xee\xcd\x87\xca\x35\x73\x10\x0c\xce\xf4\x87\xf3\xb7\x88\x27\xf2\xcb\xc5\x9f\xa2\xfc\x61\xbc\xe9\x70\x77\xf9\xc9\x50\x62\x6f\x01\xa2\x07\x81\xbe\xe1\x7b\xc0\x6e\x07\xcc\xad\x0e\x2b\x44\x65\x6f\x23\x91\x16\x5c\xfb\xb7\xe7\x6c\x6f\xd0\x17\x30\x1c\x59\x15\x2e\x94\x84\x0e\xa8\x0a\x47\xdc\x01\x1f\x35\x2c\x2c\xbb\x52\x30\x1e\x24\x3f\x15\x0b\x89\x3a\x6d\x82\x66\x90\xa2\x69\x2c\xc5\x29\x8b\x3d\x9f\xd2\xb7\xfe\xca\xd0\x1f\xcc\x3d\x63\x25\x84\xd6\x00\xa0\x56\xd1\x7d\x06\x93\x12\x3e\xba\x33\xf7\x96\x38\x16\xa9\x8e\xd1\x9b\x8b\x2a\x66\x62\x77\x70\x86\x18\xea\x57\xa0\x04\xf7\xe6\x6b\xe6\x2f\xcc\x7c\x81\xce\xab\xa8\x31\x4f\xe0\x4f\x04\x98\x77\xa4\x77\x62\x4d\xa0\xa8\x8a\x0d\x40\xc0\x17\x1a\xf2\x28\x17\x0a\x13\x88\xe3\x4d\x38\x39\xef\x8e\x01\xfc\x4c\xb4\xdb\x60\x6b\xb3\x81\x7e\x93\xd5\xfc\xb9\xd1\xa5\x7f\x25\xb4\xaf\x72\x4d\x54\xb6\x52\xd8\x98\x58\xcc\x1c\xb4\xf3\xe0\x05\x7e\x49\xd9\xa5\x0d\xae\xd5\xc2\xde\xe7\xa5\xa4\xb4\x5d\x54\xab\x00\x64\xf5\xef\x09\x82\xbc\xbf\x4c\x6f\xde\x4c\x6e\x67\x97\x90\x4e\x99\x5d\xbd\x93\xba\x2c\xfd\xf0\x4a\x7a\x9d\xa5\x2a\x77\xc1\xfe\x8d\x31\x03\xd5\x0f\x23\xf4\xc9\x6f\x3a\x50\xc3\x9e\xae\x9d\x43\x51\x30\xc1\x73\x10\x28\x88\xcc\x3e\xe8\x4a\x0c\xf8\x3e\x49\x63\x0d\xa8\x02\xf0\x8a\x85\x9b\xb1\x60\x3d\x08\x71\x23\x30\x7f\x4e\x59\x71\x49\x67\x4c\xe6\x3f\x6e\x4c\xe3\x2a\x48\x88\x07\x32\x1b\x08\x0e\x74\xcb\xac\x05\x76\x10\x45\x09\x7b\xf2\x8e\xd5\x02\xdd\x3d\x29\x1b\xed\xa7\x46\xf0\x52\x46\x18\xe0\x6e\x2f\x26\x92\x0e\xca\x80\x3b\x91\xa2\x45\xa2\xd0\x5f\x05\xe6\x22\x2c\xb1\xf7\xb7\xaa\x2d\x1d\x33\x93\x7b\xab\x1f\xc4\x3d\x88\x47\x14\x98\x12\x18\xac\x29\xe6\x9b\x34\x94\x94\x2d\x01\xdb\x15\x11\x05\xb2\x19\xad\x6b\xb0\xa6\x99\xb2\xcb\x1d\x4c\xa8\x10\x42\xfb\x56\x94\xf5\xc2\x37\x0a\x5b\xae\xc2\x24\x44\xff\x11\x22\x03\x52\xbe\x97\x18\x78\x16\xd5\x83\x4d\x15\xfa\x22\xc3\x28\x29\x5e\x2d\x99\xf5\x01\x55\x50\x69\x55\xeb\xd9\x95\xfe\xf7\xbb\xc9\xd5\xed\xec\xf6\x63\x80\x1f\x32\xd4\x86\x0f\x9b\x14\x74\x1d\x56\x0e\x76\x1a\x68\xe5\x82\xf0\xc9\xe9\xcb\x97\x71\x55\x0a\x5f\xa7\xb3\x40\xc3\x69\x92\x18\x8c\xb1\xda\xa8\x84\x8c\x8e\x98\x57\x54\xe4\x7d\x40\x28\x9a\x21\x7d\xbb\x0c\x05\x1b\xc8\xb4\x0a\x87\x18\xc9\xc3\x38\x2b\x9f\xfe\xf3\x90\xd5\x4a\xe5\x76\xfe\x0f\xf8\x74\x1c\xc3\xae\x29\xcb\x1f\x5c\x98\xe5\x27\xfc\xdc\x58\xbf\xa9\x00\x8d\xee\x5b\xa4\xe2\x44\x0f\xb4\x87\x8b\x67\x10\x75\x6a\x5c\xea\x32\x6a\xa1\x19\x88\xf3\x73\x9b\xb6\x88\x78\xa7\x22\x07\xba\x5e\xb7\xbe\x7f\x70\x50\x62\x95\x4c\x01\xd2\x56\xab\x30\x41\xf8\x37\xfb\x17\x60\x81\x57\x51\x03\x10\x04\x7f\x72\x08\x13\xc6\xed\xe8\xf7\x34\x6e\xe8\xc8\x3e\x28\xc0\xeb\x58\xd4\x49\x08\x8c\x31\x04\xb7\x73\x66\x2c\xc3\x8d\xe2\x64\xc0\x29\x7e\x2f\x93\x12\x14\x00\x94\xe6\x58\x68\x6c\xa3\xea\xae\x28\xb0\x35\x12\x91\x8a\xb8\xd6\x33\xb6\x01\x04\x49\xab\x0c\x6a\x43\x71\x54\x5e\x86\xba\x36\xd0\x73\x75\x31\xa7\x19\x09\x4e\x60\x4a\xa1\x14\x9d\x0f\x66\x50\xc9\x01\x76\xad\x0a\x05\xd0\xf2\xb2\x6a\x51\x30\x2d\x6f\xc2\xc2\x82\xa3\x83\x42\x78\x3b\x22\x51\x45\x82\x9d\xaa\x84\x61\x70\xc8\x8e\xe4\xf4\x16\xd0\x28\x0e\xbe\x1d\x4a\xf8\xf7\xc7\x3c\xb2\xc4\x8f\x27\x56\x5c\x24\x85\x86\x96\xc2\x23\x01\x3a\xf6\x67\xb3\x04\x70\x8c\xbf\xbd\xc7\xbd\x0d\x9a\x9c\x71\x9a\x8c\xac\x2f\xda\xad\x2a\xee\xd6\x6e\x8d\x5f\x64\xae\xee\x39\x52\x1d\xc3\x74\x2f\x95\x10\x81\xfb\x21\x36\x61\x1f\x19\xc2\x48\x5e\x6e\xf0\x53\xc2\xf0\x3c\x89\x35\x88\x8a\x91\xb2\x27\x0c\x38\x2e\x2a\xb2\xc8\x45\xe0\xc9\x50\x0c\xb9\x19\x68\x58\xa7\xf7\x19\xa4\x03\x20\xff\x0b\xf2\x95\x91\xdf\x32\x16\xba\xb0\x7f\x47\xaf\x3c\x21\xca\x19\x0c\xa7\x79\x57\x02\xdb\xa7\xa8\xfe\x0f\xe0\xcf\xa6\xac\xca\xfd\x96\xc4\x6a\x13\x09\x12\xf1\xe5\x13\x36\x9f\x03\x7c\x3a\xb0\x55\x33\x9b\x90\xe6\x92\xca\x82\x82\xac\xbb\x0e\xf1\x5c\xe3\xaf\xb4\xb8\x94\xf4\xae\x6e\x41\x43\xd0\x35\x76\xe7\xb2\x48\x46\x0b\xf6\x4d\xaa\x17\x56\xad\x3b\x2b\x23\x2f\xf5\x5f\x5a\x03\xf4\x1d\x59\x5f\x02\x20\x77\x72\x34\x81\xa1\x06\x01\x91\x24\x43\x03\x6c\x00\xa2\x5c\x94\x83\xd3\x78\x13\x85\x79\x42\x1a\xb0\x20\x3c\x56\x95\x56\xed\xbd\x05\x17\x79\xb5\x0a\x23\xa9\xa9\xe4\xdd\x5a\x26\x2b\xe4\x28\x38\xd0\x90\x11\x01\x30\xb5\xc2\x72\xa6\x7b\x2c\xdf\xac\x91\x26\xbe\xb0\xb5\x3b\x0e\x90\x42\x8b\xe7\x46\x4a\x98\xed\xb7\x10\x85\x1b\xfe\xd2\x5a\x0c\x68\x2c\xda\x26\x61\x40\xca\x12\xe9\x5b\x50\x25\x85\x4d\x3b\x1c\xd7\x53\x8f\x16\xc0\xa2\xa0\x0f\x2a\xf2\x4b\x5c\x45\x03\x66\x42\xcf\x3e\x88\x12\x69\x50\x20\x08\x52\x51\xe5\x12\x40\xc9\x3d\x9d\x7b\x53\x12\x03\x7c\x0f\xbf\xc9\x6d\x08\x4a\xce\x08\xe8\x39\x9b\x50\xec\xfb\x29\x83\xd5\xe8\x6e\xcc\xb7\x77\x62\x0c\x0a\xb2\x0b\x69\x41\xfd\x0a\x1e\xfa\x2d\x9b\x1f\x7d\x81\x41\x0a\xea\xc0\x33\xba\xaf\xa3\x40\x8f\x37\xcf\x73\x00\x6f\xa4\x06\x6f\x88\xf9\xf5\x9a\xc9\xda\xe8\x70\x54\xa2\x96\x6a\x62\x6d\x64\x92\xb0\x02\x24\x69\xe4\x6e\x00\x6e\xf4\x01\xaa\x04\x7e\x4d\x48\xec\x62\x41\x09\xa2\x3c\x83\x76\x5d\x04\x74\xa0\x84\x64\xb8\x1a\xb3\x44\xbd\x1f\xee\x2e\x05\x81\xda\x50\xea\xd7\xed\xc7\xcf\x4a\x4d\xc6\xfa\xce\x85\xfc\x58\xf4\x7d\x90\x0a\x3e\xb9\x86\x21\x58\x6b\xca\xfd\xb1\x36\x74\xbf\x23\x36\x98\x64\x41\x10\xf1\xdb\x3d\xf4\x90\x65\x2f\xd6\xc8\x80\x00\x0d\xd1\xde\x04\x70\xe6\x11\x9e\x80\x78\xaf\xf9\xd7\x28\xd0\xbb\xd5\x40\x7a\x6e\xca\x7d\xe6\xef\x5c\xba\xdb\xa8\xa5\xef\x21\x4a\xbb\xef\x04\xd1\xc3\x7b\x8f\x83\x75\xa1\xf8\x58\x03\xbb\x15\xdb\x4d\x49\xa2\xb4\x19\x1c\x8a\x0e\x04\x4f\x1d\x03\xc9\x34\xcc\x5f\x81\x3a\xb7\x3a\xe1\xb6\x7e\x33\xd6\x17\x39\x1c\x32\x9d\x81\x44\x6d\x60\xdc\xb8\x59\x52\x21\x8a\xfa\x46\x70\x76\x00\x91\x11\x96\xf4\x86\x34\xaa\x5a\x47\xe2\x60\x11\xe9\x4f\x33\x15\x07\x26\xd6\xef\xed\x7b\x4c\x90\x61\x01\x28\x9f\x81\x6b\xe0\x4c\x63\xfa\x1f\xca\x7e\x1d\x3a\x57\xf4\x11\x29\x4a\x83\x28\x30\x7f\x5a\x85\xce\x60\xad\xad\xbf\x96\x20\x4f\x07\xd7\xb9\x7f\xc1\xf1\x58\xa9\xb3\xb1\x9e\xc3\xc5\x9b\x0c\x08\xb8\xda\x10\x90\x35\xa2\x9c\xb9\x63\x88\xf6\x7b\xa3\xba\x26\x2b\x9e\x36\x5a\xeb\xf3\xb1\xfe\xc0\x36\x1d\x4b\x32\xf6\x7c\xd4\x81\xb3\x6a\x0a\x94\xfd\xcf\xa9\xb6\x83\x85\x06\xc7\x7c\x27\x3f\xc4\x36\x51\xa2\xb7\xda\x7b\xef\x58\xa9\xb7\x24\xf2\xba\x02\xca\x0e\xef\x8d\x23\x95\xa9\xa0\x76\x1c\xf0\xa8\xbb\xae\x0a\x6a\x6e\x2b\x91\x5a\x4b\x69\x30\xda\x03\xe7\xdb\x73\x59\xbf\x54\x87\xdc\x6d\xaa\xc7\x32\x90\x7e\xaf\x56\xb6\x5c\xb5\x5b\xcc\x03\x8e\x95\x7a\x27\x46\x9a\x73\x3b\x9d\x66\x06\xcf\xc0\x6f\x55\x37\x9c\x4d\x00\xc7\x2c\xd8\xc1\xd2\xc1\x41\x90\x1e\xbd\xfe\xa0\xdb\x16\x66\xfe\x7d\x18\x59\xb8\x9d\x4a\x10\x76\x44\x47\xb1\x27\x4a\xef\xaf\x5c\xd1\x7c\x44\x73\xe0\xb9\x01\x3b\x0f\x82\xa3\x74\xa2\x8c\x28\x51\xd9\x84\xe8\x0d\x8a\x84\xa0\x96\x92\xf7\x0f\x54\xde\xd8\x6d\xa0\x58\x16\xba\xa6\x96\xbf\xe1\xad\x8c\x0c\x8a\x2d\xc2\x5e\x49\xc1\x16\x87\x0e\x7c\xc3\xc3\xd0\x3b\x46\xb8\xb6\xa0\xa6\x1c\xfb\x13\x1d\x50\x9d\x31\xcc\xf4\x12\xdc\x15\x38\x7c\x22\x33\x74\xa7\xb5\xc3\x2d\xed\xbb\x47\xa2\x85\x7e\x8c\xe4\x41\x87\x05\x9b\xb8\xad\x60\x8c\x56\xd6\x2d\xeb\x7c\x41\xef\x53\xbd\xe5\x69\x5c\x87\xf6\x37\x9c\xc9\x90\x23\xc1\x14\xfb\xbf\x76\x66\xae\x6b\x8e\xf3\xb5\x94\x0d\xaf\x20\xc1\xd5\xae\x8c\x10\x8e\x79\xd6\x5c\x27\xa8\x29\x32\x38\x0e\xbe\xd9\xa9\x27\xde\xd8\xbb\xe4\xf2\x06\x8a\xa7\xb9\x36\x9e\xf9\x18\x91\xfe\x58\x61\x6e\x9f\x1f\x15\xe6\x92\xa7\x39\x3a\xcb\xd5\xd6\x2f\xc2\x5e\x5b\x84\x32\x0f\x5e\xc4\xfe\x5d\x02\x16\x11\x2e\x00\x7f\x9a\xa1\xf8\x2e\x19\x8c\x69\xd8\x90\xc2\xb7\x55\x4d\xd7\xa1\x3a\x74\x1d\xda\x78\x6f\x36\x02\x25\x30\x70\x35\xfe\x1b\x5a\x29\xe5\x7e\x60\xcd\x4e\x96\x81\x86\x04\x60\x38\x23\xff\xe6\xd1\xb9\x5d\xf1\x59\x3b\xca\x12\xa7\x9d\x65\x12\xbe\x49\x76\xe7\x2e\x39\x98\xe2\xe6\x0e\x22\xbd\xc8\x59\xb8\xc4\x02\xb4\x06\x95\xa1\x91\x29\xb0\xcf\x52\xa5\x4d\xa7\x4d\x1c\x9e\x5f\xc5\x56\xd1\x52\x83\xfd\x98\xfb\x3e\x5e\x0c\xdc\x43\x03\x87\x5f\x6f\x8d\xc5\x73\x0b\x9b\x9e\xd7\x98\x7f\xa3\xfa\x7f\x82\x24\x43\xf2\x76\xcc\x8f\x21\x4b\xde\x51\x49\x62\xa2\xe7\x4a\x09\x03\x01\xcc\x92\xca\x2d\x3c\x2e\xf4\x40\xa5\x2e\xc7\xfa\xdc\x82\xf7\x3a\x3c\x3d\xd3\x72\x55\xd5\x8e\xa6\x86\xca\xd4\x4c\x54\x17\xa2\x50\xaa\xd0\x94\x54\x07\x0c\x92\xb1\x52\x57\x63\x7d\x5e\x91\x97\x43\x66\x18\x30\x46\xe5\x54\x0e\xc8\x73\xe6\x3a\xaf\xd5\x08\x49\x58\x56\xe5\xba\xc8\x51\x29\x4a\x46\x9e\xca\x7d\x7f\xa0\x63\xc4\xa5\x77\xe4\x04\x3a\x31\x7f\x3a\x0f\xc1\x31\x50\xaf\x01\x51\x1b\xac\xdc\xaf\x98\x20\xd7\xb8\xa1\x14\xbb\x00\x47\x80\x04\x33\x07\xb1\x08\x6d\x12\x8a\x63\x63\x24\xe0\x80\xdc\x4c\x48\xcd\x13\xdd\x0b\xd6\x8e\x86\xf0\x5c\x68\xa1\xf1\x86\x1f\xf5\x19\x18\xac\x56\x48\x28\x9a\xe1\x3d\x25\x16\x0d\xbb\x9e\x05\xd8\xa6\x83\x17\x72\x67\xc6\xf8\x2e\xea\xdf\xbc\x74\x60\xd1\x83\x59\x5a\x2a\xf1\x01\x84\xa4\x0b\x35\x56\x85\xb5\x26\xa3\x7d\xe6\xb9\xb5\x26\x3c\xb9\xbc\xe9\x21\x4f\x94\xf7\x97\xad\xf8\x7c\xa8\xa7\xea\xcd\xf7\x62\x0f\xd9\x5f\x62\xd9\xf4\x36\xf6\xc9\x89\xd4\x61\x53\xa1\x30\x0d\xc5\x31\x2d\x04\xee\x1e\x72\xfb\x18\x18\x30\x42\xfa\x27\xe4\x72\xc1\x66\x64\x91\xce\x94\xdf\x94\x4d\x55\x2a\x5f\x6b\x10\xac\x18\xa9\xed\xb0\xe0\x8d\xa3\x31\xbd\x61\x21\xec\x03\xd0\x0d\xef\x30\xf8\x87\x58\xc7\x15\x55\x95\x8b\x08\x32\xd8\x4d\x64\x9e\xf0\x17\x55\xf8\xe2\xab\xef\xe5\xd7\x3a\xe1\xe4\x28\x18\x85\xa0\x4b\xb9\x44\x84\x4d\x76\x70\x37\xeb\xeb\x12\xc4\xa1\xac\x6c\x70\xb7\x69\xa4\x96\x0d\x7f\x8b\xef\x87\xb8\x37\x93\xfe\x63\x24\x6c\xb1\x47\xdc\x11\x17\xa9\x47\x1a\x92\x80\x1c\x3d\xc6\x95\x55\x5a\xe2\x7c\xf5\xe6\x90\x4a\x0d\x13\xe2\x5b\x0c\x1b\x9c\x68\x2b\x42\x4e\x5f\x26\x2f\x20\xe8\xc9\x57\x74\x01\xe2\x4e\x89\xac\xb3\x9f\x57\x41\xa2\xc3\xf0\xd5\xf0\x04\x22\x9e\x0d\xf4\x3b\xcb\x86\x48\xd9\x16\x76\x63\x8a\xb5\xaa\xd6\x29\x47\x29\x1a\x45\xb0\x31\x5e\x43\xb0\x27\x6a\x68\x90\x7c\xb5\xf7\x22\x8a\x15\x31\xe8\x96\x81\xa6\x5e\xf2\xdd\x49\x5e\x57\xe2\x8d\x0d\x57\x32\x42\x64\x56\x2b\x96\x22\xc7\x47\x51\x2a\x17\xd7\xe2\x91\x3b\x4e\x6d\xbb\x23\x8e\x54\x89\x51\xa4\x0c\x69\x57\x77\xcb\x5f\x77\x6a\xd0\xe7\xc8\x6b\x92\xbc\x49\x25\x71\xd6\x58\x03\x89\x08\x69\x8b\x58\x87\x7c\x0b\xea\x0b\x71\xdb\x2a\x2a\xaf\x1d\xb8\x2c\xb4\xd6\xdf\x8f\xf5\xd9\xf5\xe5\x9b\xd9\xd5\xec\xea\x9d\x3e\xbf\x3e\xbb\xbb\x9c\x5e\xdd\x26\x11\xa5\xed\x22\x2f\x3b\xf6\x0b\x82\xa9\x91\x22\x86\x7e\xf7\x24\x24\x29\x53\x5d\x17\x09\xb6\x2a\xde\xc7\x7c\x46\x7d\x47\x05\x45\xeb\x21\x39\x9b\x78\x52\x45\xf6\x31\x0e\x5f\x07\x0a\x1e\xdf\x52\x13\x4c\x12\x1a\xf4\x61\xfb\x00\x3f\xa0\x92\x48\x44\xe8\x8a\x37\x18\xb8\x05\x6c\xa0\x12\xe0\x99\xa8\x98\x07\x9e\xaa\x42\xb1\x29\x8e\x58\xe4\x6c\xf3\x06\x7c\xcf\xbd\xba\x0d\x2d\xe6\x4f\x82\x78\x34\xc0\x1c\xf8\x96\xf3\x1b\x71\xc8\xd1\x62\xdd\xbf\xa2\xc9\x77\x85\x55\x98\x76\x5a\x9a\x62\xa8\xaf\x74\x04\xd0\x0e\x58\x75\xe8\xd6\xfc\xd3\xa3\xcf\xa3\x00\x40\x4c\x8f\x1d\x7a\x58\x84\xe7\xf9\xed\x09\xd1\x05\xe0\x37\x0d\xa5\xbd\x8c\x91\xca\x54\x60\x5c\x40\x2b\xa2\x5a\x63\x42\x00\xa0\xad\x3c\xe3\x6d\x99\xff\xa5\x85\x2d\x6f\x56\x2b\xf2\xf2\xc4\x71\x99\x37\xde\x73\x56\xe8\x3d\xf8\x4b\x11\xd9\x6a\x92\xa8\x46\x98\xbc\x58\x11\xdc\x0b\x28\x85\x4b\x32\x5f\x03\x1d\x1f\xb2\x63\xdb\xc2\x59\x6d\xb8\x0d\x5c\x68\x7f\xc9\xcd\x86\x1e\x9a\xd5\x9f\x5b\xd7\x48\x50\x67\x7a\xdf\xf2\xd2\x7b\xfe\xde\xef\xf8\xf0\xc1\x1e\xc6\x05\xa0\x48\xaa\x72\xd6\x5b\xc9\x22\xda\xc8\x3b\x51\xd8\x90\x6e\xc0\x2f\xa5\x37\x2a\xbe\x8f\x87\x96\x37\x23\x7b\xc0\x55\x3d\xe8\xe1\xbe\x8e\xcc\xfa\xcf\xbc\xbb\xe7\x5f\xd0\x7d\x39\xf4\x69\x95\xf8\x1d\xe4\x71\x41\x34\x95\x4c\xe4\xa2\x18\x7a\x85\xb4\x5b\xc6\x23\x38\xba\x7e\xf0\x47\xd7\xc5\x05\x56\xdf\x62\xbd\x67\xff\xfc\xa2\x82\x14\xe2\x19\xa2\xbc\x92\x23\x6b\x78\x28\x2b\x79\xe8\x58\x1b\x80\x2b\x66\x54\x6a\x12\x2f\x97\xbc\x04\x46\xf6\x96\xcd\xd2\xbe\xb2\x5d\x67\x76\xe2\x7b\xfa\x1b\x53\x50\xc8\x49\x41\x4a\x2b\x3a\x33\x74\x2c\x0a\x08\x02\xaa\xa6\x76\x9b\xb0\x46\x26\xda\x24\x9f\x1a\x36\x68\xa7\xd4\x03\xb3\xc2\x41\xa1\x4b\x24\x5b\x79\x80\xed\x67\x90\x01\x8b\x4d\x0f\x55\x22\x70\x93\x12\xdb\xab\x6c\x72\x27\x3f\x91\x37\x2a\x0e\x9b\x90\xb3\x94\xe3\x1c\xcc\x54\x3c\xf7\xe1\xae\x33\x83\x67\xa3\x22\xa2\x35\xcb\x0d\xb3\x2b\xa1\x3a\x05\x61\x72\x1e\x9f\x74\x56\xfa\x9d\x54\x11\x1d\x3c\x34\x5c\x08\x20\x4f\x12\x33\x3f\x8e\xf5\xe4\xdd\xbb\x9b\xe9\x3b\xc8\xcb\x60\x11\xf0\xec\xea\x7c\xfa\x61\x7a\x75\x3e\xbd\xba\xd5\xbf\x5e\xdf\xfc\xdb\x1c\x49\xb2\x03\x99\x5c\x6f\x11\xfa\x3b\xbc\x71\xa2\x08\xc7\xc9\xfb\x96\x85\x9a\xc8\x77\x5d\x59\xef\x42\xa1\xe2\x32\xcf\x18\x23\xb3\x32\x4a\xc7\x02\x8b\x2d\x24\xbb\x2d\xdb\xc5\x40\x18\x93\x24\x95\xc1\xd3\x44\x18\x93\x10\x6f\x86\x52\xd8\x4d\x05\x0b\xb2\x2d\xe9\x17\xcf\xa5\x93\xc4\xa2\x2c\xab\xa4\xab\x42\x04\xc3\x21\x0f\x33\x21\x09\xe9\xd4\xe3\x0f\x06\x1f\x58\xfc\x4e\xd0\x91\x9b\x52\x8f\xcc\xfd\xbd\x9f\x9e\xc6\x8e\xb2\x1e\x83\x97\xee\xa8\x4f\xd3\x82\xe0\x01\x2c\xd6\x27\x74\xc3\xd2\xc9\xeb\x30\x8f\x84\x2f\xb3\xab\x78\xcd\xc5\x1e\x55\x28\x1a\xd6\x06\xa1\xaf\xbc\x0e\x98\x6e\xf1\xd5\x8c\x34\x7e\xf6\x21\x46\x20\xaa\xa4\x06\xca\xaa\xba\x01\xf3\x19\x8b\x0f\x04\xeb\x5e\xca\x52\x0b\x5d\xa8\x6f\x01\xb8\xdc\x95\xbb\x75\x02\x13\xd0\xcb\x94\xd9\x72\xa8\x0c\x20\xe6\x14\xfc\x65\xf0\x97\xd6\xd4\x4d\x8c\x3d\x21\x1d\x95\x0a\x63\x9d\x75\xa3\xc6\x32\xb2\x4c\x96\x06\xd9\x19\x55\x8a\xe2\x71\x6d\x5d\x57\x6d\xb9\x42\x5d\xff\x9e\x31\x49\x07\x5b\x78\xd1\x18\x59\x00\x39\x26\xb8\x27\x84\x15\xa2\x11\xc3\xa3\x95\x81\x67\xc2\x57\x71\x95\xc6\x07\x04\xcd\xb1\x9b\xc9\xd5\xfc\x02\xf6\xa3\x42\x2c\x71\x11\x80\xdf\x42\x4b\x30\x56\xc6\xc9\x1c\x44\xa6\x5d\x15\x9c\x08\x89\x01\x8c\xcf\x71\xbd\xd8\xed\x40\x36\x20\x98\xb8\x63\x7d\x03\xb7\x85\x5f\x38\x03\x26\x24\x2e\x3c\xf1\xf0\x08\x9f\x0a\xaa\xce\x7d\x4f\x25\xef\xb3\xa0\xb8\x4c\x49\xff\x87\x2d\xe5\xe4\xd1\xac\x6b\x49\xf1\x8f\x61\xdb\x85\xb3\x9e\x2c\x5c\xdf\x15\xef\x74\x31\x6e\xd2\x7f\x40\x0c\xa7\x46\xa4\x89\x68\x82\xea\x5e\x4c\xfd\xb4\x32\x40\xad\x42\xeb\xe5\xfb\xa7\xe5\x3d\x00\x63\x98\xa2\xa6\x4f\xbb\x88\xf2\xbd\x78\xe2\xad\x72\x17\xa9\x20\x17\xb6\x79\xb4\x44\xaf\x2b\x41\xec\x4c\xec\x7d\xe8\x1d\x83\xb4\x90\x07\x5b\x04\x50\x0a\xe5\x9d\x48\x93\x17\x41\xb4\xe9\x76\x7a\x73\x39\xbb\xa2\xe5\x98\x92\xcf\xee\xf6\x4c\x16\x9c\x09\xae\xfd\xac\x03\xfd\x49\x96\x5a\xd0\xc4\x53\x7d\x4d\x3c\xd2\xfb\x1e\xd6\xc5\xc3\xa3\x90\xd5\xf1\x02\x19\x39\xbd\x5e\xc5\xd7\x3f\xf5\x76\x16\xcc\xd3\xcf\x09\xe6\xa9\xa7\x05\xf3\x84\x36\xd3\x73\xca\x5d\xa0\xb9\x80\x0f\xca\x9e\xd2\xee\xc2\xe6\x30\x0a\x99\x36\x49\x54\x97\x09\xf2\x5d\xca\x55\x01\xba\x06\x96\x4a\x24\x7d\x06\x08\x4c\x5e\x62\xaa\x2d\x6a\x02\x45\xb9\xa4\xb7\x77\xb7\x77\x37\x53\x7d\x33\xfd\x65\x36\x67\x03\xf4\xf6\xfd\x6c\xae\x2f\x66\x67\xd3\xab\x39\x95\x4b\x1f\xaa\x08\x4f\x98\xce\x4a\xfb\x98\x05\xba\xb3\x2e\xc7\xd9\xbb\xab\x3b\x75\xb8\x3e\xfd\x37\xf1\x9c\x29\xc9\x73\xc6\xc1\x8e\xdf\xc4\x73\xa6\x06\x79\xce\xf4\xdc\x5a\xbd\x69\x9a\xdd\xcf\x2f\x5e\x3c\x3e\x3e\x8e\xef\xcb\x76\x5c\xd5\xf7\x2f\xb8\xa4\xf7\x45\x97\x09\x8d\xba\x2a\xea\x5b\xbf\x8a\x18\x2d\x56\xf5\xf5\xb9\xb7\x22\x7f\xfc\x30\x39\x9a\x58\x34\x23\x12\x6d\xf9\xbd\xa8\xd0\xb8\x9e\xef\x00\x15\x5a\x94\x91\x7e\x8e\x0b\x0d\xa2\xe3\x21\x2e\x1a\xf3\x4d\x47\xc1\x48\x5b\xd5\x66\xdd\x1c\x73\xf4\xec\xd0\xa2\xeb\x8f\xd7\x17\x72\xa7\x0d\x09\xc2\x22\x51\x98\x7a\x82\x29\xed\xab\x9b\xa7\x26\xe7\xe7\xd3\xab\xf3\xbb\xcb\x9f\xfd\x91\x10\xe3\x5f\x1d\xe7\x05\x8e\x93\x60\xef\x2a\x75\x3b\xf0\x39\xa8\xfb\x0a\xae\x48\x98\x33\x62\x1f\xc8\xc4\x8d\x24\xd2\x92\x2a\xf5\xd2\xe2\xf7\x31\xa2\x47\x40\xd0\x30\xd1\xf1\xd6\xc5\x18\x91\x74\xf1\x9d\xfa\x33\x98\x2c\x01\x81\x10\xab\x20\x7e\x4e\xa8\x23\x96\xc7\xfa\xe3\x74\x72\xa3\x3f\x5e\xdf\xdd\xe8\xab\xc9\xe5\x74\xac\x3f\xc4\x3b\x3e\x8f\x9a\x49\xe1\x94\x4e\x00\x74\xab\x17\x55\xad\x82\x30\x7d\x1e\x3d\xca\x61\x54\x02\x1c\x27\x4f\xd0\x5d\x64\x92\xee\x42\xb3\xfe\xf3\x30\x31\xdf\x73\xd3\xf9\x5a\x05\x43\x7a\xc0\xb8\x40\xeb\xf9\x62\x36\xbf\xd5\xb7\xef\xa7\xb3\x1b\x7d\x3b\xbb\xbd\x98\xce\xb5\x00\x84\xf5\x71\xdc\xe2\x4b\x7c\xed\xd0\x67\x7b\x48\x6e\xf1\xd1\x50\xbe\x45\xb3\x2c\x98\xed\xbb\xae\x75\x3f\x1a\xf2\xf4\x78\x8d\x22\x54\x17\xd6\x57\x59\x0d\xd6\x76\xfa\x65\x67\xf5\x08\x5a\x3b\xf8\x91\x11\x94\xbf\x5b\xb3\x02\xd8\x1d\x16\x75\x20\x5c\x0b\x10\xc7\x40\x81\x17\x72\x51\xba\xf3\xc6\x6e\x4a\x80\x5f\xa8\x46\x43\x7f\x0c\xaf\x02\x1e\x88\xde\x9f\xc5\xc0\xc9\x08\xd0\x7a\xa0\xf0\x33\xf4\xbd\x1e\x90\xa1\x2e\x21\xd7\xfb\xe0\x6d\x56\x2b\xca\xe0\x98\x20\x61\x59\xad\x6c\xa6\x1f\x05\x69\x80\xc2\x48\x0b\x9d\xa0\xce\xc6\xaf\x61\xa9\xb2\xf7\xfd\x58\x0e\x93\x59\xfd\x28\x96\x96\x92\x34\x04\x55\x59\x16\xb6\xe1\x65\x7f\x88\x74\xa2\xa9\x88\x55\x85\x0c\x85\x16\x4f\x80\xe4\xa9\x7f\xf0\x36\xfd\xb3\xfe\x8c\x5f\xdc\x95\xb9\x5f\x8e\x27\xe7\x6f\xe7\x27\xaf\x5e\x9e\x7e\xff\xbb\xd3\x3f\x3d\xc3\xff\xf4\xf2\xfb\xef\xbe\xff\xae\xcb\xff\xf4\xea\xd5\xab\x3f\xf8\x9f\xfe\x1e\x3f\x77\x57\xb3\xb3\xeb\xf3\x29\xd0\x19\x8e\xd9\x78\x47\xe2\xc5\xcb\xe9\xd5\xad\x3e\x41\xfa\xc0\xb7\xb3\x0b\xe4\x4f\xd4\xf3\xeb\xb7\xb7\xbf\x4e\x6e\xa6\x4a\xd1\xc2\xd1\xe7\xa6\x31\xfa\x6d\x5e\x88\xf2\x5d\x60\x6a\xf0\xbf\x06\xad\x77\x71\x19\x23\xc6\xbd\xaa\xbd\x45\x29\x4c\xe4\x16\x1f\x05\x66\x32\x9e\x4f\x2f\x32\x75\xe0\xef\xb5\xdd\x55\x75\xe3\x5e\xe0\x15\x78\xe0\x43\xcb\x62\x55\xbf\xf0\x2d\x78\x31\xd6\xd4\x4e\x25\xda\xd9\xd1\xa4\xfb\x70\xfe\x56\x57\x65\x91\x43\xc6\x69\x65\xa1\xb8\xa1\x19\x6a\xf6\xfe\x99\x46\x8f\x55\xb0\x04\x62\x8e\xb8\xdc\xb3\x70\x3e\x3c\x3c\x5a\x10\x74\xeb\xf2\x38\xce\xb9\x7c\x82\x5d\x57\xf5\x95\x23\x76\xe8\xef\x61\xc4\xd4\x97\x8d\x98\x52\x57\xd7\xb7\xb3\x33\xa0\xbd\xbc\x9b\x4f\x6f\x7e\xd6\x67\xa6\xb6\xde\x15\xc4\x32\xf1\x8e\x21\x88\x6c\x87\x21\xc2\x30\xd6\x6f\x3e\xea\xf3\xeb\x5f\xaf\x2e\xae\x27\xc0\x9a\xaa\x66\x57\xf3\xdb\xc9\xc5\x05\x70\x87\x72\x3d\x1e\x93\x3e\x02\xeb\xeb\x1d\x90\x60\xd2\x52\x84\x95\xf8\xcd\x5c\xae\xbb\xa3\x51\xfc\xc7\xe8\x38\x53\xc4\xe3\xc9\x4b\x51\x1f\x8d\xf8\x3f\x47\xc7\x48\x67\x7a\x77\x35\xfd\xf7\xbb\xd9\x2f\xd7\x67\x93\x8b\x8b\x8f\x7a\x72\x76\x36\xfd\x70\x9b\xc1\xfa\x85\xa5\xed\x7b\xf6\x66\xaa\xdf\x5c\xdf\x5d\x9d\xab\x37\x1f\x33\xe0\x3a\x25\x9e\xc9\xdb\xe9\xcd\x25\x2e\xf5\xb3\xeb\xab\xf3\xd9\x6d\xe2\xdd\x86\x8d\x31\xd6\xb3\xb7\xf0\xa6\xf3\x6b\xe0\xdf\x84\x3f\x64\x8a\xfe\xc5\xdd\xf7\xdb\x0a\xfa\x8e\x1d\xcf\xf4\xf9\x6c\x7e\x7b\x33\x7b\x73\x87\xbc\x9b\xcc\xeb\x29\xba\x2a\xba\x35\x56\x2a\x52\x9c\x12\xe7\xeb\xe5\x6c\xee\xdd\x6d\x8d\x13\x24\x4d\xe9\xff\xf3\xbf\xf5\xe9\x4f\x3f\x9d\xc2\x11\xce\x4b\x8a\x88\xd7\x26\x45\xc1\xf1\x07\xc2\x8f\xad\x80\xe9\x37\x25\xee\x81\xd5\x76\xcb\xc6\x32\x01\xf6\x0f\x2d\x16\x7e\xed\x78\xd3\x6c\x8b\xb1\x52\xa9\xd1\xbe\xb1\xb5\x5d\xec\xa3\x86\x0b\x17\x25\xb1\x66\x02\x31\xfd\x20\x38\x5d\x57\x0b\x59\xe9\x14\x15\xb6\x79\x5f\x88\x83\x84\xf3\x6a\xc6\xb9\x6a\x99\x1b\x99\xde\x20\x89\x54\x40\x36\xc6\x9d\x3e\x3a\x56\x55\x1d\x9e\x94\x70\xc4\x7f\xc1\x73\x78\x33\x8f\x8e\x51\xcb\xcd\x14\x01\xf7\x1a\xcf\x92\xaa\x8e\xe6\x3f\xf3\xab\x09\x6d\x5a\xc1\xa0\x3f\x20\xce\x00\x83\xce\xfa\x4d\x24\x9f\x95\x06\xc3\xb6\x16\x86\x8c\x4e\x0d\xe9\xff\x64\x0c\x1a\x74\x36\x54\x32\x87\x78\xec\x60\xfb\x28\x59\x10\x0c\x3e\xae\x0e\x60\x51\x91\xf4\x9b\x4a\xf6\xcc\xff\x6f\xdd\xd6\x25\x9e\x5c\x2c\x9f\xdd\x29\x86\x51\xea\xc8\x1c\xa3\x23\x96\x7a\x87\x22\x6e\x4b\x39\x60\x8a\x66\x87\xca\xce\x4e\x35\x9f\x69\x8c\xea\x37\x5f\xa9\xa3\xc5\xd7\x3d\xdf\x3b\xc2\x07\xe6\x18\x4e\x43\xa5\xbc\x0b\x1a\x30\xcf\x50\xd7\xca\x8f\xc8\x4b\x4c\x0a\x06\x38\x46\x18\x1a\xd2\x71\xf3\x2d\x8d\x03\xe4\xb0\x44\xca\xb8\xae\xff\x4c\xf1\xd5\xd8\x8c\x98\x61\xe1\x07\x02\x4c\x26\x76\x54\x05\x4c\x18\xac\x7d\x3f\xc5\xfc\x9a\x10\x07\xe1\x56\x21\x37\xf7\xa1\x5b\x5a\xfb\xff\x11\x2f\xf6\x39\x93\x61\x67\x87\xd8\xb0\x15\xb1\x61\x23\x0d\xf6\x30\x09\xf6\x10\xe3\xb0\x6f\x40\xa4\xbe\xd6\x7d\xea\xeb\x4c\x3d\xc7\x7b\x0d\xad\xbe\xba\xbe\x9a\x5d\xbd\xbd\x99\x5d\xbd\x43\xe3\x03\x4f\x5d\xe2\x1f\xfe\xa8\xe1\x24\x9c\x8f\x13\x1e\xe9\xf9\x7b\x7f\x74\x0f\x91\x84\xfb\xe6\x33\x5d\x38\xb6\x1e\x89\xc5\xe1\x1c\xa7\xf3\x33\x32\x3c\xbf\x25\xee\xe8\xb3\x8b\xc9\xec\x32\x30\x49\x13\x99\xb3\x9e\x5d\x9d\xcf\x6e\xa6\x67\xb7\x07\x99\x9c\x33\x45\xdf\x60\x66\xe7\x5f\xdf\x4f\x6e\xe7\xd7\xd3\x5f\xa6\x37\xfa\x66\x3a\xbf\xbb\x00\xea\xea\xb7\x37\xd7\x97\x81\x9e\xf9\x6e\x3e\xcd\x02\x47\xf3\x87\x9b\xeb\xb7\xb3\xdb\x79\xa6\x7f\x7d\x3f\x05\x2e\xe4\xd9\x95\x9e\x5c\xe9\x09\x64\xf7\xfd\xa7\xcf\xae\xaf\x6e\x6f\x26\x67\xb7\x99\xbe\x9a\xbe\xbb\x98\xbd\x9b\x02\xf1\x37\x5d\xa2\xfa\xf6\xfa\xe6\x76\x76\x7d\x37\xa7\x2f\x64\x92\x58\x5a\x5d\xbf\x45\x42\x69\xff\x8c\x2b\xc4\x0b\x60\x72\x56\xd0\x4d\x0f\xd0\x89\x1f\xbc\x94\xa6\x1c\x77\xd7\x21\x91\x18\x44\xb8\x70\xeb\xa4\x48\x95\x01\x45\x67\xd4\xe8\x22\xe6\x64\x60\xe8\x83\x6c\xcb\x83\xad\x9b\xdc\x11\xff\x41\x14\xd7\xc2\x6a\xc1\x6d\xd5\x30\x38\xa5\x40\x8d\x11\x29\xd5\x65\x8a\xbc\xbc\x67\x30\xa1\x7b\xf6\x80\x06\x55\x31\x8e\x87\x05\x1d\x00\x99\x92\x56\xdd\x46\xff\x73\xfa\xc0\xe3\x17\x57\xd5\xa7\xdc\x9c\xfc\x7b\x73\x82\xf9\x94\xbc\x2a\x4f\x4e\xc7\xa7\xbf\xa7\x17\xf8\x8c\xff\xf7\xea\xd5\xab\x2e\xff\xef\xf7\xdf\x7f\xfb\xfd\x1f\xfe\xdf\xdf\xe3\x07\x66\x5f\xff\x7b\xa3\x2f\xde\x7d\xb8\xd0\x53\x5e\x02\x21\xde\x79\x3a\x3e\x55\x6a\x82\x2c\xe3\x51\xa0\x22\x85\x69\x72\x84\xe9\xc2\x3a\x67\xeb\x03\x81\xa6\xf0\xc4\x57\xe3\x53\xca\x1d\x22\xc9\x1d\x58\x66\x50\x1c\x06\x67\xc5\x28\xb2\x53\xb6\x8e\x24\xb9\x2f\xf2\x45\x6d\xea\xfd\x88\xb3\xa9\x55\xbd\xab\x00\x06\x12\x60\xf0\x08\x0c\xd7\x1b\x20\xb1\x42\xa6\x2c\xc6\x0f\xc9\xe2\x04\x7a\x50\x4c\xcd\x8a\x68\x32\xc4\xcb\x64\x9b\xc8\xfd\x63\x8b\x58\x44\xdd\x3a\x66\xcf\xcf\x90\x15\x3b\xca\xc1\x90\x90\x6d\x70\x9d\xf7\x72\xcc\xb2\x49\xaf\xf0\xd7\x50\xb0\x86\xcf\xa0\x87\x88\x4e\xc6\x2a\x7e\x40\x2c\x44\x12\x8a\xb2\xdd\x5a\xe4\x10\xdc\x99\xda\x6c\x2d\x52\x03\x82\xc5\x80\xe4\x32\x6d\x6d\x75\x61\xf6\x55\xdb\xb8\x8c\x4a\xd9\xa1\xfa\x6a\x6b\x96\x75\x05\x00\x19\x70\x79\x59\xf2\x8b\xc4\xe0\xec\x76\x57\x98\xc6\xba\xa4\x55\xf9\x31\x15\x8a\x03\xbe\x36\x18\x30\x61\x70\xb8\x6c\xe4\x07\x19\x68\xff\xe2\xf5\x00\x42\x48\xb5\x45\xc8\x74\xa8\x5b\x40\xf4\x8a\xbf\x55\xc2\xc9\x84\x65\x55\x3d\xed\xaa\x74\x94\xbb\x15\xda\x48\x28\x2a\x6b\xa1\x85\x74\xeb\x43\x55\x3c\xd8\x00\x6c\x4a\xd7\x93\x9c\xb9\x00\xac\x0a\x2f\xa7\xbf\x7c\xe3\xd2\x19\x27\x12\x7d\x62\x31\x1d\x9a\xb8\xb0\x5a\x86\x26\xf0\x75\x5c\x07\xc3\x33\xf9\x5a\x4c\x49\x98\x53\x39\x57\x0f\xc7\xda\x6d\xfd\xf5\xca\xd3\x1c\x66\x94\x50\x53\x9d\x49\xaf\xd6\x58\x00\xe0\x7f\x0d\x97\x25\xb4\x3f\x2f\x75\x61\xcb\xfb\x66\x33\x56\xea\x2d\x32\x11\x6d\xab\x9a\x12\x60\x0c\xef\x89\x5c\x23\x95\x9c\xae\x83\x07\xc5\xb3\x53\xf7\xcf\x79\xc7\xfe\xdf\xfc\x33\x7e\x31\x79\x7b\xf1\x7b\x5f\xf8\x9d\x9f\xa7\xef\xff\xd3\xd3\x97\x3f\xfc\xd0\xb9\xff\x5f\x7d\xff\xed\xcb\x3f\xee\xff\xbf\xc7\xcf\x64\x69\x56\x76\x9b\x2f\x31\xcb\x37\x44\xfb\x0f\x94\xb6\x83\x1f\xeb\xf2\x4c\x07\x30\x10\x5c\xe1\xfe\x36\x0f\xcc\x02\x0a\x03\x2a\xd7\xfc\x89\x5f\xab\xfa\xd3\xe8\x98\x68\x2c\xab\xc7\xd2\xd6\x14\x72\xc1\x47\x57\xf5\xe8\x18\x5c\x5d\xc2\xd3\x25\x01\x47\xc5\xfe\xb9\xa8\x75\x4f\xf1\x07\x83\x35\xf6\xfe\x0f\xc9\xfb\x7f\x56\x8a\x5e\x97\x70\x57\x0f\x77\x55\xd8\x43\xe3\x91\x52\xef\x40\x85\x1c\xf4\x8d\x08\xc5\xc3\x0d\x4f\x82\x5f\xee\x99\x50\x17\x23\x15\x93\x76\xe9\xa3\xd1\xc7\xaa\x1d\x1d\x63\xa9\x6d\xb1\x3a\x79\xcc\x57\x36\x63\x89\xd8\x93\x75\x6d\x6d\x46\xb2\xe0\xc4\xdc\x9c\xf9\xe7\xef\x6c\xd3\x9a\x22\x53\xfe\x2f\x11\xc2\x04\xf8\x48\x16\x3f\x50\x47\xa7\xc7\x5f\x18\x66\xda\xd9\xda\xdb\x64\x03\xf9\x76\x08\x37\xa9\x34\x5e\x93\xb6\x1f\x20\xce\x5d\xb8\x27\xc4\x58\x40\x93\x1e\xa2\x2e\xaf\x8e\x69\xc8\x49\x14\x19\xf0\xb0\x0e\x96\xc2\x4a\x90\xe2\x15\x31\xd1\x1e\x06\x38\x50\xf5\xda\xed\xa2\x5a\xe5\xb1\x20\xb4\xd3\x0a\x27\x02\x56\x9d\x67\x64\xac\xd6\x90\xe1\x58\x40\x04\xcd\x37\x0c\xe4\x42\x61\xb9\x78\x2f\xf3\xab\xfb\xc6\xc4\xcd\xc4\xd9\x20\xc1\x12\x8c\x83\x19\x2b\x75\x03\x4b\xb3\x5a\xeb\x49\x13\xe0\xc7\x63\x7d\x63\x25\x1c\xf9\xc0\xd0\x02\x12\x34\xd0\x18\x2a\x8a\x9c\x75\xa8\x28\x7e\xc3\x70\x2c\xaa\x66\x33\x3c\x8c\x58\xad\xcd\xc5\xc2\x7e\x2d\x77\xe2\x5a\xb8\x28\x52\x6e\x35\xa7\x82\x09\x16\x6c\xc5\x2e\x59\xd3\xc0\xab\x4a\x6d\x3f\xdb\x65\x1b\x99\x62\x31\xda\xe0\x17\xb9\x1f\x11\x30\xca\x78\x43\xc2\x0e\x1c\xeb\x2b\x82\x15\x71\xc0\xc1\xc5\x4d\xe9\xfb\x55\x56\xe2\x4f\x5c\x0b\x26\x0a\xb1\x43\xf1\x6a\xd2\x12\xfc\x5e\x94\x7e\xcf\x81\xa7\x7d\x65\xb7\x06\x80\xcb\x35\x6b\x83\x02\x25\x2d\x18\xd4\xfb\x20\x35\x00\x44\x53\x50\xad\xa1\x91\x6e\x15\xe2\x16\x41\x4b\x1d\xd5\x6c\x43\xc1\x6e\xee\xc2\x9b\x15\x8c\x01\x07\x28\x08\xd2\xd8\x09\x54\x08\x73\x2a\x01\x8d\x55\xf5\x58\xa9\x10\xcc\x03\x71\x80\xd9\x1c\x42\x59\xd3\x9b\x39\xa7\xf5\xae\x6f\x38\x48\x37\xd7\xb7\xef\x27\xb7\x9d\xa8\x19\x44\x9c\x38\x9c\xa7\xae\x6f\x66\xef\x66\x57\x93\x0b\x40\xed\xeb\xd9\x5c\x5f\xff\x4a\xc2\x60\xfe\x5b\xe1\x81\xa0\x10\x46\x8f\xea\x7d\x25\x26\x3b\xce\xd5\x9b\x8f\xf1\x4b\x77\x57\xe7\xd3\x1b\x3d\xd1\xbf\x4c\x2e\x66\xe7\xfa\xec\xee\xe6\x66\x7a\x75\x1b\x72\x8f\x10\x24\x4b\x9b\xe6\xdf\x7d\xc3\x92\x81\x6a\x32\xe7\x08\xe5\xc5\x47\x21\x18\x88\x3a\x7c\x97\xd3\xf3\xd9\xe4\x76\x7a\xf1\x51\x7f\xb8\x99\x9e\x4d\xa7\x10\xb2\x9c\x4f\xaf\x6e\xa7\x57\x67\xd3\xac\xdf\x4e\x35\x9b\xc7\xf8\x28\x36\x4c\xc2\x18\xf5\x35\xc4\xe1\x58\x45\xf0\xcd\x64\x3e\x9b\xf7\xc3\xa7\x5d\x01\xc1\x43\xf2\x81\xfc\x3d\x08\x9d\x4e\x30\x52\x27\x62\xa7\x10\x86\xbd\xba\xbe\x3a\x91\x41\x50\xe5\x27\x45\x04\x57\x0f\x0f\x77\x8c\xb9\x5e\x40\x4c\xef\xed\xec\xb6\x17\x6e\x55\x4f\xc8\x0c\xea\x8e\xcc\x20\xc5\x01\x7b\xef\x09\xe2\x82\x0a\x46\x2a\xae\x34\xff\x8d\xd0\x95\xb3\xeb\xab\xf9\xed\xec\xf6\xee\x16\x22\xd2\x7a\x3a\x9f\x53\xc4\xd4\x37\xa6\x8b\x16\x1d\xab\xab\xeb\x30\xe4\xb7\xd7\xfd\x77\xbe\xf3\x0f\x9d\x9e\xeb\xf7\xd3\x9b\x29\xce\x12\xe9\x47\x8a\x29\x8b\x0d\x19\x2b\x15\x87\xd8\xbf\xeb\x62\x46\x81\xe8\x31\x7d\xe1\xea\x5a\x9f\xcd\x6e\xce\xee\x2e\xe7\xb7\x93\xab\x33\x0a\x9a\x87\x3f\x5d\x4c\xdf\x4d\x20\xa8\x7c\x7d\xf3\x31\x53\x14\x92\x85\x20\xab\x94\xde\x8b\x81\xd8\xe3\x4c\xc4\x67\x65\x66\x33\x13\xf1\x69\x5e\xfe\x2a\x91\x15\x9c\x5c\x7d\xd4\x1f\xa6\x37\xf3\xeb\xab\x10\x82\xc6\x50\x73\x16\x82\xce\x51\x53\x50\x47\x4d\xc1\x0c\xe5\x17\x87\x44\x05\x49\xd9\xf2\xec\xfd\xc4\x37\xc8\xef\x34\x0a\x06\x4f\xe6\x7a\x42\xd1\xe8\x1e\x5c\x97\x94\x3c\x21\x1c\x3c\x38\xef\x4f\xaf\x62\x7e\xf7\xdb\xeb\x1b\xc5\x01\xee\x77\xd7\xd7\xe7\xbf\xce\x2e\x2e\x32\x7c\xc2\xfc\xf6\xfa\xc3\x87\xc9\xbb\xa9\x1f\xab\xcb\x0f\x77\xbe\x61\x41\x49\xf0\x46\x5f\x4e\x2e\xde\xde\x5d\x51\xf4\x9a\x06\x62\x72\x75\xae\x20\x31\x0b\xc3\x7f\x76\x7d\xe9\x57\x78\xd2\x53\x96\x2e\xec\x08\x0b\xd2\x80\xe2\xd8\xbf\x9f\xfc\x32\x05\x41\x41\x35\xbb\x7a\x7b\x7d\x73\xf9\x65\x8a\x82\x3c\x3a\x83\xab\x48\xe1\x93\x21\xef\xfb\xe1\xc3\xc5\x47\x50\x5d\xe4\x3f\xa2\x4a\xe4\x74\x72\xfb\x9e\x02\xeb\xf3\xeb\x2b\x48\x21\xfc\xeb\xdd\xcd\xc7\x6e\x32\xc0\xbf\x13\x75\x0f\xbf\x99\xcb\xc8\x7e\x2a\xa4\xda\x51\xc6\xfc\x70\x73\xfd\x7e\xf6\x66\x76\x3b\xc7\x26\xc7\x46\x8e\xd5\xfc\xfa\x72\xaa\xff\xf5\xee\x66\x36\x3f\x9f\x51\x65\x20\x27\xa8\x2f\x2e\xae\x7f\xa5\x87\x9e\x5d\xdc\x41\x16\xd9\x8f\x5f\xd2\xc3\xb8\xbe\xd4\xc1\x4c\x87\x9e\x5f\xe3\xe0\xc4\xe7\xf8\xcd\x23\x1e\x74\x39\xf9\x98\x8c\x8d\x82\xc3\x22\xc0\x4b\x9b\x4a\x2a\x68\xa3\x2a\x4c\x63\xeb\xad\x1e\x1d\xd0\x4e\xdf\x01\xf5\x4b\x8d\xa8\xfe\xed\xb0\xcd\x8c\x82\x46\x9f\x90\xf7\x53\xf2\x68\x31\xa3\xd2\x0a\x8b\x97\xa3\x26\x80\xb4\x62\x94\x60\x11\xda\x20\xf6\x96\x78\x7c\x02\x8f\xde\xbe\x6f\x26\xf4\x8d\x7e\x00\x41\x38\x49\x6f\x78\x40\xa6\x81\xaf\x6f\x29\x25\x3e\x64\x13\x29\x60\x1e\x15\x9c\xa2\xf2\xcb\xe9\x08\x80\x59\x1c\x1a\x14\xcd\x76\x17\x9b\xa9\x82\x4c\x57\x48\x3b\x83\x7c\x52\xa0\xa2\xcd\x9d\xd0\x1e\x06\xc2\x79\x2a\xd7\xe9\x77\x43\x1d\xea\x46\x4e\x6a\xea\x48\x8b\x8e\x3a\x23\x20\x39\x52\xd5\x7b\x49\xed\xb9\x34\xc5\xb2\x45\xe5\x9b\x98\x91\xce\x4b\xfb\x79\x67\x4b\xef\xd4\x30\xe5\xc9\x83\x2d\x73\x40\x21\xe3\x84\x2c\xf6\x10\xbc\x05\x2a\xa2\xc8\xbc\x1b\x7a\xc8\x0c\xb3\x30\xf1\x9d\xda\x8d\x8e\x8d\xe7\x9f\xbf\x08\x65\x08\xec\x3b\x32\xbc\x1f\x56\x99\x69\x0e\x75\x04\x10\xd6\x5f\xee\x88\x2a\xa9\x0e\xd2\xa1\x28\x4f\xd7\x94\x52\x97\xad\x77\xe4\x00\x8a\xc1\x15\xfd\xbe\xb7\x1f\xd0\x51\x9a\x10\x57\x53\x22\xf8\x84\xf9\xb4\x50\xd9\x91\x96\xa2\x00\xea\x27\x56\xdb\xc0\x98\xd9\xda\x9b\xda\xf5\x32\x27\xb5\x6f\x9a\x47\x42\x22\x08\xd0\xb5\xff\x5e\x87\xa9\x41\xe5\x6b\x9c\x82\xbc\x40\x82\xf0\x47\xd7\xe6\x81\x0d\x1e\xa4\x4c\xfd\x5e\xb3\xf7\x41\xbf\xc7\xff\xfe\x7a\x3e\xd3\x67\xb6\x6e\x30\xfc\x57\xed\x6c\x49\xa8\xa8\xa8\xdc\xcf\x11\xfb\x22\x75\xca\x01\x84\xcd\x1a\xe0\x52\x8f\x29\x77\x7a\xd4\x1f\x2c\xd5\x1b\xac\x91\xf7\x2e\x11\xd6\xba\xae\x73\xe0\x72\x06\x9f\x3c\xf1\x3c\xa3\x57\xe9\x9c\x2d\x1b\x10\x06\xa8\x88\xd8\xd1\x34\x02\x09\x8b\x52\x5b\x02\x45\xdd\x53\x42\x7c\xa5\x2f\xcc\x23\xa8\x77\xe9\xe9\x58\xdf\x54\xce\x96\xc3\x20\x9c\xa7\x71\x33\x87\x24\x0e\xa5\x9e\x61\xaa\xe8\x17\x74\x28\x92\x26\x0a\x0a\xa5\x10\x7e\xe5\xaf\x61\xa9\x30\xba\x1a\x83\x4e\x86\xca\x1b\x09\xb6\x80\x50\xcd\x1f\x51\xda\x7f\x9e\x9f\xf1\x8b\xd9\xd9\xdd\xdf\x30\xf6\xfb\x5f\x9e\xcf\xff\x7e\xfb\xf2\xc7\xef\xbb\xf1\xdf\x57\xdf\xff\x81\xff\xfd\xbb\xfc\xcc\xce\xee\xc2\x2d\x72\xa2\xfd\xbf\x4e\xc7\x7f\x1a\x9f\x62\x4d\x8f\x69\x6c\xfd\x2c\x08\x51\xa7\xe5\x3c\xa7\x3f\xfd\xf4\xfd\xc9\xab\x97\xa7\xdf\xa1\x16\x37\x9e\xc9\xa6\xd0\x6f\x5a\x97\x97\xd6\x39\x75\x89\x86\x84\x3f\x37\x31\xc3\xc9\xd5\xa7\x28\xdc\xa9\xd4\xd7\x9f\x94\xbf\x0d\x61\x98\xbb\x0e\x20\xf0\x10\x18\x10\x13\x7b\x5d\x48\x60\xd6\xc5\x04\xfe\x76\x14\xa0\xb8\x7b\xd5\xef\x81\x02\x64\x08\xcb\xd7\xe0\xfe\x22\x70\xd9\x0d\x01\xfd\x54\x57\xb5\xc5\xb2\x02\x7a\x27\xfc\xc8\x14\x50\x30\xbe\x87\x70\x79\xa9\xfc\x4a\xb4\x22\xc5\x6c\xc0\x6b\x16\x15\x05\x0f\x0f\xbe\x4b\x3d\xfb\x2e\x60\x59\x6a\x77\x20\xd6\x58\xde\xa7\x53\x4b\xe0\xb9\x80\x96\x93\xc1\xa0\xe7\xc0\x72\xba\x0b\x96\x53\xbf\x17\x58\x4e\x13\x58\x4e\xfd\x0e\x60\x39\x0d\x60\x39\xf5\x3b\x80\xe5\x74\x88\x5b\xa8\xbf\x16\x2c\xa7\x53\xb0\x9c\xfa\x2b\xc1\x72\x5a\x82\xe5\xd4\x5f\x05\x96\xd3\x03\x60\x39\xf5\x2c\x58\x6e\x36\xff\x7f\x0a\x1f\x97\xbb\xdf\x02\x88\xeb\xb5\xf2\x0f\x33\xf0\x9f\xe0\x67\xfc\xe2\xec\xec\xe4\xcd\xc7\x93\xab\xb3\x93\xef\xc6\x2f\xff\x36\x86\xe0\x33\xfa\xff\xaf\x4e\xbf\xef\xda\x7f\xdf\xbe\x7a\xf5\xc3\x1f\xf6\xdf\xdf\xe3\xe7\xac\xb6\x98\xc9\x3c\xab\xb6\x5b\x6f\x13\x88\x9c\xe4\xc9\x55\x55\x9e\x05\xe9\x36\xfd\xdd\xf8\x65\xc7\xa6\xeb\x7e\x59\x49\x93\xee\x68\xd4\xfd\xf3\xe8\x38\x88\xec\xeb\xc2\x3c\xea\x75\x5e\x6f\xd1\xb9\x65\x3c\x16\x47\xcd\xa0\xa4\x48\x51\x96\x8d\x40\x49\x50\x64\xb4\x7a\x00\x96\xd8\xf3\x4e\x2e\xb1\xd7\x0b\xa2\xb0\x67\xd2\x8b\x48\xea\x44\x34\xe5\xd0\x80\xbd\xad\x4f\x96\x45\x4e\xb4\x53\x4c\x7f\x15\xb5\x7b\xc7\xfd\xe7\x6e\xcd\x27\xeb\x94\xe0\x34\x74\xc4\x82\x56\x10\xc5\x78\x0c\x16\xc5\x50\x23\xd8\xb7\x7a\x64\xdc\x49\xee\x46\x7a\x61\x5c\xee\xe2\xa3\x15\x3f\x1a\x59\xad\xcb\x4a\x3f\x02\x2d\x28\x11\x71\x30\x07\x97\x7c\x65\xc6\xba\xc3\x08\x2e\xe3\x70\x49\xa4\x99\xcc\x19\xb6\x98\x52\x30\x64\x5c\xd2\x3e\xd0\xdc\x7e\x5f\xd5\x2a\x77\x14\x1b\x31\xc0\xb7\x6f\x16\x79\xc1\xbc\x9b\x2b\x83\x62\xad\xb5\x75\x6d\x01\x76\x95\xe0\xe3\x69\x5d\x10\x93\x5d\xb7\x45\x61\x5d\xa3\xec\x67\x88\xb5\xec\x2a\x54\xd3\x19\x2b\x75\x07\xf7\x58\x6f\x80\x53\x90\xa0\x53\xea\xb9\xa9\x15\x91\xd6\xa0\x3f\xe4\x2c\x22\x3e\x07\xc6\x00\x83\x7a\xb0\x0a\xaa\xda\x09\xce\x3b\xf2\x38\x88\x41\x08\x82\x26\xd4\x0f\xb7\xf1\x17\x65\x02\x6e\x81\xf0\xa0\xd0\xcd\x88\x8f\x09\xb3\x12\xa1\x00\x9d\x5a\x15\x16\x22\x96\xaf\x55\x91\x0d\x83\x59\xea\x93\x5e\x92\x42\x02\x84\xca\x13\x50\x01\x30\x38\xb1\x62\x44\x0d\x49\x73\x25\x66\x15\x28\xd5\x85\xee\x66\x16\xa0\x7b\xf6\xf3\xc6\xb4\xae\xc9\x59\x4f\x8f\x2a\x22\x21\xc0\xce\x88\xd9\xaa\xad\x99\x2d\x80\x04\xf5\x94\x3a\x4b\xdf\xe9\xd7\x42\x41\xb1\x57\xf7\xb3\xbe\x6e\xeb\xde\xfc\x60\x31\x64\x63\xcb\x40\xcb\xe3\xfb\xb3\x57\xa8\xd5\xc2\x96\x06\xfa\x1a\x2c\x15\x74\x58\x82\x22\x42\x2a\x4b\xfd\x68\xf6\x4e\x68\xe5\xb2\xbb\x85\xf8\x86\xe7\x07\x7d\x0c\xcd\x4d\xdb\x59\xd7\xf6\xa1\x02\x52\xb1\xb1\xe2\x98\xb2\x63\x31\x34\xa8\x7d\xf4\x4f\x83\x8d\x06\xab\x4d\xa0\x60\x3b\x74\x27\x81\xf1\x18\x63\xa6\xc0\xe3\x85\xa4\x21\x4c\x8a\x0f\x88\x49\xdc\xdb\x31\x44\x1f\x5e\x06\xe4\x4f\xce\x2e\xdb\x1a\xcb\x69\x69\x7d\x96\x76\x69\x9d\x33\xf5\x5e\x75\x9f\x52\xc9\xce\xb8\x2a\xfa\x69\x34\x96\x4b\x53\xea\xda\xb2\x8c\x47\x18\x47\xa4\x4f\xb2\x7e\xd8\x06\x5a\xc1\x42\x7f\x5b\x03\xd8\x17\x71\xea\x00\x6d\x4a\x5c\xe3\xa2\xaf\x14\x7e\x0c\x05\xb0\x38\xe6\x67\x67\x27\x21\xae\x1b\x65\xc9\x2a\xb1\x63\x5a\x19\xf2\x8d\x98\x5f\x05\x4b\x2c\xba\xca\x62\x3f\x8d\xf5\xa5\x1f\x82\xe5\x13\x6b\x52\xff\xac\x1f\xf3\x4f\xf9\x78\x49\xc7\xc8\x12\x4f\x11\xa8\x62\x4c\xd7\xf2\x7f\x5f\x57\xf5\x7f\x0f\xdf\x3b\xbc\xdc\xe3\x90\xfe\xac\xdf\xec\x49\x01\x8d\x28\xa8\xab\xfe\xfa\x8f\x52\x2b\x55\xad\x18\x14\xf6\x9c\xc8\x4a\x6f\xa4\x68\x5c\xc2\x31\xa1\x86\xd6\x1c\x13\xdc\x84\xf7\x7d\x93\x78\xc5\x74\xf7\x86\x15\x84\x39\x94\x72\xaf\x30\x29\xf3\x9f\xff\xeb\x3f\x24\x69\xb9\x5e\xd8\x25\x04\xcd\x09\x34\x23\xe8\xf6\x22\x1c\xfb\xf0\xd4\xfc\xe7\xff\xfa\x8f\x66\x63\x4b\xc5\x40\x7e\x7e\x7b\x6d\xef\x31\xe9\xc3\x18\x24\x5e\x34\xe9\x66\xbc\x47\x7c\x5d\x59\xec\x45\x0f\x1c\xdd\x70\xcf\x6f\x6d\xe6\x3f\x2a\x42\x7e\x2e\x08\x24\xf9\x1b\xac\xa9\x70\x26\x50\x97\x2a\xdd\xa9\x62\xcc\xfd\x1d\xe0\x1a\x22\x8f\x12\xa7\xcb\x5a\x58\x0b\x7e\xe4\x5c\xa6\x62\x74\x27\x0c\x1b\x44\xb3\x10\xf1\x2f\xe2\xe7\x75\xda\x4e\x3a\xed\xf9\x95\x63\x3d\x51\xa1\xcd\x81\xc0\x95\xd9\xef\x48\xcc\xcd\x65\x9a\xb9\x3d\x8c\xfb\x14\x93\x2c\x45\x11\xa4\x2a\x17\xa8\x0d\x6e\x57\x0a\x34\x25\x20\xb7\xe9\xf7\xf7\xa4\xf0\xde\xde\xfd\x26\x45\x6f\x2f\xf6\xc9\xe1\x11\x31\xde\xb6\x24\xe1\x70\x80\xad\x13\x33\x28\x89\x6c\x71\x63\xf4\x23\x14\x4f\x86\xc4\x9e\x3d\xbc\x29\xe3\xb2\x57\xbf\x65\x57\x5a\xeb\xfa\xf6\xc2\x41\x73\x55\xf5\xcd\xd5\xd4\xb6\x50\xea\xcd\x9e\x93\x60\x9c\xaf\x0b\x70\xd0\x1b\x9c\x9e\x23\x66\xea\x86\xfb\xf7\x38\x83\xbc\x17\x29\xea\x42\xc8\xf0\xbe\xb6\xde\x46\xf0\x6e\xfa\x02\xd8\x18\x69\x55\x1f\xbe\x12\xf2\xdf\xb5\x13\xfa\x68\x94\xfe\x62\x74\x3c\xd6\xb7\x81\x02\x16\xb5\x54\x73\x36\xab\x42\x0a\x9e\x00\x6b\xfe\x5a\xae\x77\xb5\x25\x99\x51\x83\xc8\x38\xb3\x6c\xa8\xa3\xb5\x8d\xb9\xa8\xfe\xe8\xa0\x56\xad\x98\x2c\xdf\xc1\x8f\x20\x58\x08\x23\x24\xb4\xaa\xdd\xf0\x88\x04\x81\xf1\x70\xd7\x32\x6c\xd6\xbf\x1e\x16\x79\xdc\x27\xbd\x57\x2d\x6c\x69\xd7\x79\xe3\x12\x1c\x9c\x22\xce\x3c\x42\x0b\x12\x24\x20\x69\xfd\x65\xb8\xfa\x82\x85\x1e\x2c\x67\xd9\x50\x95\x80\x36\xe1\x3a\xd0\x3a\x54\xba\x9c\xea\xff\xfc\x5f\xff\xa1\xcf\x83\xe8\x82\xff\x8c\x19\xeb\xc9\xca\xec\x1a\xf9\x12\x84\x31\x0c\x99\x85\x67\xc9\x31\x36\x47\x72\x3a\x1e\x5b\xce\x85\x26\x78\xc1\xaa\x26\x69\x9f\x76\x47\x41\xe3\x81\x4e\x21\x50\x33\x8a\xbf\xf7\x3f\x92\xbb\xc0\xfc\x08\x14\xef\xa8\x0e\x93\xb1\x1c\xc1\x2a\xc3\x3f\x7b\x5b\xd0\xff\x43\xc6\x9a\x54\xc8\x20\x42\x02\x7c\x6b\xca\x12\x8e\x41\x7f\x92\x80\x12\x68\xbc\x6e\x22\xa2\x7a\xb0\xa3\x8a\xb6\xd8\xc6\x16\x3d\x3c\x2a\x0a\xac\x47\xcb\x75\x2d\x17\xb1\xd0\x4e\x84\x93\xe7\x60\x1f\x8d\xde\xb6\x0e\xca\x6b\x1e\x21\xdf\x4f\x90\x66\xbf\x2c\x51\xb4\x15\x36\x6c\x6d\x97\x15\xb8\x58\x19\xcf\x9d\x4a\x1e\x52\x80\x95\x19\x94\xee\xc3\x3b\x07\x86\x3e\x77\xda\xed\xcb\x25\x53\x7b\xe4\x5b\x0b\xb4\x4e\xb8\x60\x89\xe1\x7a\x5b\x3d\x80\xc9\xe7\xdd\xa7\xb1\x52\x0b\x5e\x31\xfe\xae\x0e\xbb\x33\x20\x5f\xd8\xfc\x87\xdd\xc8\x6c\xbe\xb0\xc5\x9e\x1c\xd3\xbc\xc4\x0f\x05\xa0\x2b\x23\x61\x7a\xab\x33\x47\x66\xdf\x7a\x05\x9b\x35\xad\xeb\xea\x12\xf8\x0d\x4f\xc3\x58\xa9\xe5\xf8\xc9\xb5\x4c\xfd\x49\x6e\x6d\x48\x58\xd0\xa7\x68\x8b\x83\x14\x76\xb1\x57\xec\x9c\x26\x8e\x53\xb8\x5f\xb3\x81\xf4\x49\x67\x6a\x17\x75\x65\x56\x4b\xe3\x9a\x4c\xf5\xa6\x18\x5a\xd7\xe6\x58\x93\x96\x3b\x28\x13\xf6\x5b\x8a\x9a\x9a\x89\xdc\x8d\xf7\xbc\x7d\x23\x36\x48\x27\xae\xa8\x99\xc0\xb1\x65\x16\xb6\x20\x9c\xba\x69\xec\x3d\x3a\x30\x5f\xb8\x6a\xc5\xb3\x12\xaf\x8f\x0f\x96\x57\x47\x8b\xe3\xa3\xd3\xe3\x93\xa3\x57\xc7\xc1\x5b\x7b\x6a\x78\xc7\x4a\xad\xc6\x7a\xba\x5e\xfb\xef\x3f\x58\x7d\x6b\x97\x9b\xb2\x2a\xaa\x7b\x58\xfa\x97\x2c\x3a\xcf\x8b\xaa\xc2\x05\x46\x4a\xf4\x1b\xd3\x04\x81\x3e\xb3\x70\xb6\x5c\x82\xbc\xcb\xae\xae\x76\xb6\x8e\x16\x53\x26\x41\x04\xcb\xbc\x5e\xb6\xdb\x07\x5b\x06\xea\x10\xc0\x80\x78\x5f\x9f\x35\x4b\x23\x88\x88\x6d\xb6\x49\xdd\xe4\xcb\xc2\xea\xd3\x53\xb6\xb7\x7e\x9d\x7d\xb8\x16\x1d\xbb\xf5\x97\xe2\x5e\x9b\x55\x05\x2b\xb4\x2a\xf5\xb9\x5d\x5a\x20\x61\x7c\xf5\x32\xd3\xa7\x3f\xfd\xf4\x03\x30\x36\xc8\x95\x93\x27\x37\x63\x60\xa0\xf1\x43\x62\xc7\xb1\x98\x15\xaf\x9d\x8b\xb0\x5e\x78\x30\xd6\x06\x83\x15\x19\xfe\x17\x05\xc9\x43\x42\x2d\xe8\x0c\xa9\x27\x0c\xde\x27\x17\x7e\x17\xed\xe3\x37\xa5\x6a\xa3\xc9\xd9\x3b\x42\xc6\x4a\xad\xc7\x03\x27\x4b\x3c\x11\x4c\xdd\xe4\xae\xc9\x97\xd8\x92\xc6\x42\x71\x22\x9e\x6f\x2b\x5a\xcb\xf1\xc4\x56\xe1\xda\x81\x4c\x1f\x2b\x40\x87\xcb\x16\x9b\xb6\x3a\xb0\xad\xef\xc7\x3d\x7b\x28\xb6\x63\x18\x29\xd4\x71\x08\x87\xae\xd2\x27\x4e\x73\xdf\x3e\xa4\xb0\x0b\x35\xae\xde\xa8\x4d\x86\x58\x1d\x1a\xe2\x78\x34\x3e\x35\xc0\x31\xb5\x98\x58\x1d\x5d\xf7\x20\xba\xb2\x6a\x23\x50\x7e\xb1\xfb\x91\xb3\x9f\xa8\x3b\x50\xad\xe7\x28\xb7\xee\x18\x07\xc5\x6f\x83\x1e\xe9\xaf\xea\x0d\x72\x3e\xd6\x69\x94\x15\xdf\x81\xc1\xd0\x7c\x6b\xea\xbc\xd8\xa7\xe1\x13\x00\xf7\xd5\xe0\xb0\xeb\xa6\x7a\x34\xf5\x0a\x18\xd8\xd9\x62\x34\xab\x07\x53\x36\x44\x70\xbf\xad\x4a\xdb\xf8\x15\xb2\xac\xb6\x3b\x5b\x3a\x0a\xf5\x7d\xf1\x39\x65\x3f\xa3\x47\x71\x78\x3c\xd7\xbd\xda\x8f\x41\x13\x47\x0d\xec\x8e\xc5\x5e\xaf\xf2\xfb\xbc\xf1\x4f\xc9\x0b\x7b\xe2\x36\xa6\xa6\xdc\x16\x6f\x70\x1c\x8c\xdc\xa5\x63\x24\x73\xd1\x51\xac\x72\x67\xf6\xcc\x13\x3f\xd8\x6d\xb2\x21\x4b\x3a\x66\xf9\xae\x0b\x7d\x1c\x2b\xf5\xe7\xb1\x9e\x43\xb0\x8f\x26\x3a\xc2\x38\xe5\x46\x12\xde\x3b\x68\x73\xed\xe9\xe3\x58\xee\xb1\x24\x4a\xf9\x46\x05\xf6\xf2\x41\xa3\xa8\xb3\xb5\xa2\x4f\xc7\xd5\x3d\x74\xb3\xa1\xe1\xbe\xca\xdd\xae\x30\xfb\x4c\x84\x0d\xe2\x85\x27\x2b\x6b\xe0\x5f\xce\x6e\x83\x82\x8a\x5f\x1a\x6d\x19\x28\xdd\xab\x5a\xe5\xdb\x5d\x55\xf3\xcd\x49\xc0\x00\xf0\x33\xb7\x7d\xc3\x38\xed\x6e\xf4\x72\x29\xfa\x86\x66\xea\xd6\x92\x56\xe0\x5a\x7e\x18\x6a\xb8\x49\x0c\x73\xd3\x2f\xd5\x47\xd9\x10\x70\xa2\x1a\x10\x7b\xde\xda\x54\x09\x63\xe9\xaf\xaa\x92\x4c\xc3\xed\x58\xa9\x4f\xe3\xa7\xae\x6e\x9a\x04\xda\x72\x15\x15\x05\x19\x29\xbb\x10\x82\xd5\x0a\xda\x70\x0e\xbb\xc8\x5f\x99\x3f\xfd\xf0\xe2\xa7\x17\xd3\x33\xee\xc0\xb4\xf5\xd7\x9f\x29\xf5\x07\x53\x17\xb9\x89\xe2\x28\xac\x4f\xd0\x96\xcb\x1c\x24\x96\x4e\x4f\xd5\xa5\xa9\x97\x1b\xb8\x9e\x58\x50\x15\x53\x15\xbb\xba\x6a\xa2\x6e\x34\x9f\xcd\x0e\xa5\x9a\xb7\xb8\x9d\xf9\x3a\x6b\x97\x4b\x6b\x57\x76\x05\x22\xc4\xcc\x22\x84\x5d\x08\x68\xc4\x62\x2f\x45\x18\xd9\x18\x29\xf7\x68\x90\xd2\x15\x0e\xf5\x82\x63\xa5\x0a\x62\x38\x18\x38\xaf\xe2\x61\xf5\x9c\xf3\xcb\xac\x60\xfd\xbb\x01\xcf\xd9\x0d\xb9\x8c\x35\x0a\x4a\xc3\xba\xf0\x6f\xcc\xcb\xfb\x01\x7f\xe9\x15\xf8\x4b\xf3\x65\xb5\x8b\xfa\xba\x66\x1c\xd5\xbf\x20\x1e\xa3\xd4\xa9\x9f\xe4\xe1\x4b\xe4\x79\x5b\x34\x4b\x5d\xc1\xb4\x12\x13\x6c\x68\x1c\xa1\x43\x05\x95\xa1\x6c\xd2\xaf\xfd\x6e\x8d\xa5\x12\xc1\xe1\x60\x98\x37\xff\x1f\x7b\xef\xba\xdc\xc8\x91\x9d\x8b\xfa\x77\x3e\x45\x06\x23\xce\x16\x31\x51\x5d\x6a\xb2\x6f\x52\xb7\xc3\xe7\x80\x40\xb1\x1b\x1e\x10\xa0\x01\x50\xad\x3e\x0e\xc7\xde\x09\x20\x41\x96\x54\xa8\x82\x2b\x0b\x64\xc3\x6f\xb4\x5f\x63\x3f\xd9\x8e\x5c\x6b\xe5\xad\x2e\x20\xa9\x91\xc6\x33\x76\xf7\x8f\x19\x91\x04\xaa\xf2\xba\xee\xeb\xfb\x0a\x57\x47\xdb\xb6\x86\x69\x87\x9b\xc6\xaa\x02\x89\xd1\x6d\x2f\x1f\xda\x0f\x77\xa2\xcb\xbb\x88\xd0\xab\x2b\x2c\xfa\xd4\x4e\x94\x15\x90\x19\xd5\x85\xa3\x1f\xf0\x27\x60\x80\x8b\xd8\x78\x30\x91\x7b\x63\xe4\xbd\xb2\xe1\x18\x34\x9e\x6b\x15\x06\x90\x58\xc4\x8c\x9d\x1f\xb3\xb0\x50\xc7\x80\xc1\x72\x5f\xa4\x6b\x13\x0a\x58\x17\xfb\x65\x65\x1c\x37\xf7\x6d\x56\xb7\xcf\x1a\x0a\x3d\x6a\xdb\xee\x1a\xd3\x09\xb6\x96\xea\x6d\xa6\x64\x06\x70\x8a\x55\x45\x80\x5a\x01\xf1\x82\xb6\xd8\xa9\x39\x93\x9c\xf3\x57\x31\xd4\x13\x7b\x9d\x09\xed\xc7\x0d\x1c\xbe\x36\x13\xfe\xed\xa9\xe8\xc5\x8c\xbd\x8e\xf9\x95\x5c\xa7\x82\x88\x77\xca\xad\xa8\xd4\x07\x5e\x69\xfb\x1c\x6c\xf3\x1a\xe1\x77\x96\x15\x0f\xda\x8b\x58\x04\x26\x9a\xc9\x8f\x28\x98\xd9\x13\xce\x1b\x40\x3f\xd4\x5f\xab\x97\x1c\xe4\x49\x5e\x3c\x20\x0d\x18\xa3\xae\x05\xc4\xe8\xc6\xb4\xe8\x3a\xd4\x07\x5d\x23\x75\x11\x64\x28\x0f\x63\xaa\xa8\x0d\xfa\x41\x40\x04\xc6\xd8\xd1\xd0\x14\x81\x7c\x30\x96\xab\x0f\xd2\x90\x26\x24\x6a\x4d\x2f\x56\x15\x7a\xc4\xcb\x14\x0b\xd6\x83\x10\xce\x53\x06\xe3\xaf\x0d\x6b\x68\x58\xa7\xbe\x9e\xf4\x30\xe7\xe7\xb0\xc7\xbc\xab\x27\x9a\x54\x0a\xe8\x09\x59\x6b\x9f\x8a\x97\x08\x33\xf5\xf6\xce\x23\x14\xbd\xd3\xd7\x3d\x9e\x23\xc2\x3c\xde\x5e\xd5\x08\x57\xf8\x47\xf8\x4d\xcc\x87\xc5\x43\xae\xaa\x52\x8a\xad\x76\x80\xd3\x5d\x4a\x9e\x51\x3f\xe6\x53\xec\x72\x76\x18\x27\xb4\x6f\x5a\x42\x37\x7d\x12\x9e\xdc\x4b\x68\xdd\xa0\x87\xd4\x8d\x41\x17\x2f\x09\x19\x30\x6c\x24\x4e\x68\x15\xd8\xfe\xc6\x47\xf6\xac\x01\xe3\xfe\xd4\x90\xc4\x85\x36\xab\xf9\xda\x5f\x02\x5b\x8b\xe9\x31\xb3\xe8\x33\x89\x43\x43\xee\xc8\x82\xda\x21\x1c\x82\x09\x04\xd0\x2d\xc3\x1f\xe1\xdd\x94\xc1\x18\x90\x51\x0f\x45\x96\xfe\x72\xc7\x61\x61\xd6\x15\xaf\x8a\xa8\x2b\x82\xa4\x45\x24\x30\x15\x17\x76\xc4\xca\xad\x50\x7d\xe1\x9d\x21\x8d\x59\xfd\x8e\x0d\xf2\xdd\xcb\xb7\xb0\x30\x1e\x41\xa6\xfe\x19\x08\x6f\x6d\x8d\x5a\x4d\xc8\xad\x8a\x5c\x55\x69\xb5\xaf\xb0\x10\x83\x42\xc7\xf0\xdb\x72\x2f\xd7\xda\x64\xa9\xa1\xbc\xd4\xd8\x38\xc1\x46\xa4\x78\x72\x64\x19\x6f\xbb\x5c\x35\x3f\xfa\x16\x19\x83\x9d\x3a\x16\x30\x6c\xb7\x2b\xf4\xd1\xd1\xc2\x8a\xa6\x81\x31\x4a\xe3\x8a\x16\x9b\x4d\x0a\x0a\x4b\x55\xa2\xda\x2b\xb6\x3c\x84\x66\x81\xf5\x8e\x95\xe3\x42\x06\x99\x47\xe7\x95\x0b\x17\x8d\xd7\x76\x98\x23\x09\xce\x99\xb9\x91\xaf\xf4\x8d\x3c\xeb\x9d\xf6\x7b\xa7\x69\xcf\xde\xbb\x25\x11\x37\x99\xfc\x32\x58\x33\x57\x45\x29\x32\xcb\xda\xe2\x83\xb2\x97\x06\x06\x40\xbb\x77\xb7\x18\x66\x31\x01\x9f\xac\x8e\x4b\xd1\xf0\x1d\xa9\x47\xbd\x94\x8e\x11\x35\xd2\x2e\xe3\xbd\x58\x1d\xa2\xb0\x2b\xdf\x78\x53\x58\xf6\x2b\x32\x2d\x68\x71\x40\x1f\xf8\x9d\x21\x9f\xa9\x82\xa4\x81\x29\xd4\xa8\x2d\x5d\x9b\x60\x67\x4d\xc1\xee\x47\xee\xdb\xe2\xbb\x2e\x61\x8c\x8e\x3e\xbd\xd4\xe5\xb6\xd1\xf3\x2f\x1e\xf8\x13\x74\x1e\xb2\xb5\xc0\x4d\x36\x51\x6a\xb4\x4e\xa8\x07\x08\x34\x9a\xe9\xde\xe7\x5e\x14\xaf\x63\x9d\x9b\xc2\xe4\x55\x3d\xa5\xf2\xd8\xea\x1c\x5c\x6f\x1d\x51\xff\x91\xb1\x99\x4a\x85\xbe\x87\x69\x61\xc3\x87\xb6\x5f\x6f\x17\x93\x24\xdd\x8d\x6e\x7f\x76\xe0\x8e\xc8\x98\x39\x72\x41\x90\x1a\xab\x54\x56\x07\xaf\x6f\xea\xbe\xc8\xf6\x39\xb8\xc2\x34\x3e\xb0\x5e\xe1\x66\x40\x1b\x1b\x88\xb2\xed\x6e\x9f\xa9\xa2\x3c\x50\xea\x11\x9e\xb4\xba\x93\x5b\xe4\x91\x72\xd4\x80\x2b\xe1\x00\xd9\x68\xca\x8e\x79\xc9\xb6\x16\xda\xe9\x33\x6f\xfa\x78\x22\xcc\x1a\x04\xd5\xf0\x77\xb2\x2b\x95\x91\x2a\xac\x09\xc0\x58\x16\x38\x73\xdd\x66\x69\x8b\xcb\xf1\xca\x57\x68\x7c\xe0\xdb\x7a\x20\x7d\x1e\x59\x78\x0e\xc8\x63\x66\x7e\xc0\xcf\x5c\x8b\x6f\x39\x48\x9a\x16\x43\x52\xc4\x01\xbe\x07\x08\x83\x11\x76\xce\x1d\x31\xf3\xf9\x69\xe0\x64\xdb\x74\x8b\xb6\xe3\x28\xff\xb8\xdd\xab\xca\x38\x0f\x90\xf9\x0e\xa1\x46\xd2\x0d\x4f\x21\x75\xa4\xf6\x14\xde\xab\xdf\x3e\x1b\xe6\x6f\xc8\xdc\xf7\x10\x90\x42\x4a\x5d\x8b\x96\x66\xca\x7f\xb1\x66\xca\x63\x74\x6e\x8f\xae\xd9\xb0\xa9\x62\x8f\xca\xd7\xc8\x74\x0d\xba\xf4\xb1\x9f\x53\x92\xca\x15\x0a\xb8\x60\x9d\xb7\x42\xcb\x03\xdf\x29\xb9\x5f\x17\xf9\x61\x0b\xca\xd3\xbe\xb0\xf7\xc1\xb3\x86\xf0\x5f\x9a\xc6\x41\xad\x35\xd6\x62\xb7\x7d\x0e\x3e\xe8\x77\x6c\x42\x03\x32\x35\x6c\x36\x24\x44\xcb\x13\xee\x8f\x3d\x00\xa0\x50\x90\xff\x11\x08\x86\x5c\xbd\xdf\x07\xc6\xe0\x9b\x37\xb3\x91\xbe\x99\x77\x87\x9d\x2c\xb3\x34\xff\xd5\x7c\xaf\xb9\xe0\xa1\xd4\xf6\xba\x6b\x77\xa5\x58\x55\x58\xaf\xf1\x01\xcc\xa1\x34\x07\xde\x59\xc9\xa9\x7b\xd3\x9e\xac\xee\x9d\xa4\xe3\x05\xdd\xbc\x86\xb4\xd6\x60\xa8\x58\x7e\xf0\xc0\x8a\x25\x77\x73\xe0\xbd\xae\xf3\x6a\x3f\x2e\x7a\xd1\xa1\xf3\x09\xf0\x80\x67\xbd\xd8\x90\x15\x21\xdb\x16\xaa\xd5\x53\x44\x85\x60\xac\x3e\xd7\xef\x2c\x7d\x43\xce\x73\xe0\x48\xbf\x77\x9e\x4e\x86\x69\x58\x0a\xf8\x10\x73\x28\x86\x5b\x22\x63\xa3\xc2\x58\x6d\x26\xf6\x91\x6b\x1f\xb3\x4b\xbf\xf6\x26\xad\x1c\x75\xb5\x7d\x75\xd0\xa9\x1d\x8c\x7c\x69\x88\xef\xa0\xc5\x89\xb5\x1d\x1f\xa1\x05\x34\x76\x69\x53\x5b\x33\x55\x67\x81\x25\x62\x2a\x41\xfc\x82\x50\xd0\x7b\xa3\x4d\xe3\x22\x7a\xe8\x3a\x96\xbd\xb8\x94\xdb\xe2\x3e\xe8\x24\x0e\xdb\xa6\xf1\xf1\x6c\x79\xa8\xaf\xf0\x69\xbf\xf7\xa4\x33\x8c\xde\x74\x20\x3e\x1b\x21\x0b\xfd\x27\x1b\xda\xd0\x4f\x6c\x66\x56\x6d\x1e\x95\xc1\xb0\x31\xca\x2e\xef\xf1\xbd\xc6\x47\x32\x53\x68\xc6\x44\xb4\xe6\xc6\x60\x82\xe9\xe3\xea\x88\xea\xd7\x35\xd1\x6b\x0c\x7e\x75\x47\x2f\x63\xc6\x3e\x37\x33\xcb\xd6\xa9\xc7\x1b\x70\x2c\xfa\x19\xe4\x41\xd8\xa3\x79\x90\xf7\x50\xac\xb0\x39\x12\xa3\x09\x9c\xcf\xb3\x9e\x1f\x45\x0b\xc0\x03\x88\x68\x38\x62\x50\x5b\xd8\x11\x5e\x02\x1b\xa2\xe4\x42\x2b\x50\x55\x09\x6c\xaf\x86\x8e\x2c\xbf\xbd\x04\xd9\xd3\x2d\x09\xb3\x99\x61\xb7\xce\xc7\x10\x17\x64\xd1\x49\xaa\xf9\x04\x24\x8f\xbd\xd0\xbe\xc0\xbe\x39\xcd\x99\x70\xbf\x0e\xee\x2e\xd4\x71\x1d\xcd\x1c\x57\xc6\x90\x31\x0f\x60\xcf\x7a\x00\x3f\x35\x66\x6c\x0a\x23\xf1\xa8\xb4\x71\x74\x3d\x96\xaa\xc6\x99\x24\x81\xbb\xf2\x98\xc4\xeb\x18\xad\xdd\x12\xce\x2c\x9a\xbf\x47\xec\xa9\x7b\x14\x4c\x35\x66\xec\x58\xbc\x2f\x88\x66\xbc\x46\xc3\x04\x33\xb5\x61\xf9\x3f\x91\x89\xe3\xf1\xf5\x72\xc8\xdd\x2a\xa2\xad\x1e\x23\xbc\x35\x8c\xca\x4f\x8f\x67\xd0\xeb\x17\xf6\x0d\x56\xf7\x04\x7a\xfa\xb3\xab\xcb\x0f\xe3\x95\x08\x39\x46\xe5\xf1\x58\x06\x74\x83\x28\xb0\xae\x47\xcb\x30\x57\x1b\x8a\xef\x4a\xfc\x6a\x93\x1b\x21\x2c\x5d\x9b\x9f\xc1\x42\x07\x76\x83\xc6\x44\xbb\xe2\x56\x2f\x52\x22\xca\x50\x2f\x6c\x22\x07\x2f\x23\x76\x2f\xe4\x05\x5c\x52\xa0\xbc\x34\x6c\xb8\xa5\xdf\x75\x40\x2a\x1e\x38\x81\x89\xd5\xb2\xb3\x88\x2a\x62\xc6\x3b\x21\x53\x39\x02\xaf\x3f\xd5\x4e\xb9\x75\x33\x5c\x46\x9a\x70\x2b\x8c\xf6\x69\xad\xe6\x60\xe1\x50\x80\x8a\x0e\x3a\x60\x57\x77\x22\xaf\x68\x99\x23\xbe\x49\xab\x5c\xaf\x31\x54\xb1\xfa\x4c\x97\x24\x1d\x30\x7e\x6f\x20\x1f\x80\x07\x9a\x51\x89\x83\x7e\x6c\x86\xde\xa1\xd7\x22\xb7\x91\x2b\x02\x4a\xde\x97\xe0\x44\x9b\x92\x45\x58\xaa\x15\x72\x05\xdb\x07\x30\x59\x96\x80\xa6\x6c\xe6\x5f\x00\x71\x04\x06\x57\x89\x38\x16\x88\x9a\xb1\x26\x12\xa5\xbb\x33\xfc\x54\x68\xf9\x31\xe3\x90\x52\x14\xd8\x72\xaf\xfa\xb1\x7e\x64\x38\x74\x67\xd2\x44\xb0\xfc\x68\x39\xd6\x14\x75\xb9\xab\x69\xce\xf3\x82\xa3\xc2\x03\x56\xd4\xe0\x5c\x2d\x25\x74\x79\xa0\xa9\xf1\xa5\xd8\xb3\x02\xcd\x1f\x4c\x68\x55\x77\x52\x7b\x8c\xa7\x8f\x94\xe2\xe4\xf2\x36\x4b\x6f\xf5\x22\xf5\xc2\xca\x31\xaa\x36\x26\x2f\x36\x32\x55\xad\x11\xc8\x3a\xfc\x55\x9a\xaf\xc0\xf7\xd0\xbf\x5d\x15\xb9\xd2\x96\x07\xc8\xa1\x88\xef\xf6\x79\x8a\xdd\x0a\xf2\x2b\xe0\x19\x97\x07\xa0\xc3\xc5\xcd\xcb\x0a\x05\xb9\xb5\x55\x01\xe5\xb1\x88\x21\x23\xb1\xe1\xc5\xb4\xaa\x88\x92\x5a\x27\xf7\x55\x47\xdc\x90\x15\xc7\x95\x66\x04\x2b\x67\x78\xc4\x83\xe2\x01\xc0\xf3\x16\x6b\xe4\xb0\x25\x05\x86\xcb\x8e\x3d\x33\xc5\x06\x5d\xe0\x27\x0c\xd4\x9c\x15\xe1\xd3\xc4\xe8\x03\x6b\x1b\x70\x4c\x13\xd5\x63\x47\xc5\xab\x54\x09\x8e\x0a\xb3\x47\x65\x85\x81\xfb\x2e\x7f\x84\x98\x3d\x7d\x39\xe7\x46\x61\xe3\x62\xd0\x9b\xcd\xb0\x65\xb5\x56\x54\xea\x17\x09\x62\xad\x51\x57\x98\x69\x5b\x68\xd5\x45\x25\x60\x62\xb7\x2b\x8b\xaf\xe9\x96\x40\xab\xf5\xad\x2b\xb2\x7d\x15\x0c\x14\xf8\x2f\x45\x7a\x8f\x63\x0e\x3a\x94\x5a\xe4\xf9\x5b\x90\xe7\x0b\x49\x0d\x67\x1e\x5c\x0c\xca\xeb\x45\x8b\x6a\x31\x85\x3b\xc6\x4a\x72\x99\xa0\x8e\x92\x46\x53\xbb\x69\x3d\x1b\xbd\x8f\x1e\xbf\xb3\xc1\xcd\x21\x22\xe1\x50\x51\xb7\x27\x33\x73\xd4\x85\x4d\xf6\xe8\xda\x58\x3b\xa0\x7f\x50\x1a\xe0\x79\x72\x0f\xf2\x3b\x0d\x9a\x0a\x44\x1f\x67\xc7\x11\x4d\xef\xa4\x75\x64\x6f\x4f\x45\x0f\xdc\x93\x52\xa6\xb9\x96\xef\x52\xbd\x87\xc8\x46\x18\xfa\x17\xbe\x85\x80\x2f\xba\x4f\x0b\x8f\x7b\x7e\x0f\xf1\x5b\x17\x5a\xad\xec\x6f\x19\x31\xe2\xbf\x7a\xc9\xd7\xd0\xdf\x43\x35\xc5\x46\x9c\x5a\x0f\xc3\x3e\xf0\x83\x36\x5b\x9c\x0b\x7e\x1e\x63\x79\xac\x81\xb5\xb1\x23\x45\xfa\xf3\x5a\xa5\xe9\x33\x0c\x97\xb7\xa7\xcb\x9e\x97\x72\x84\x28\xbf\x1f\xec\xf3\x63\x14\xfa\xbe\x21\x4d\x72\xc1\x95\x94\xbf\x6a\x0f\x49\xae\xcd\x69\x82\x09\xd9\xf1\x1f\xaf\xac\x3c\x3e\x3c\x4f\x0c\x41\xbd\x45\xa6\x0a\x4a\x68\xb4\xa7\x9d\xa9\x8d\x84\x8c\x91\xf6\x7c\x46\xc9\x55\x55\xec\xbc\xaa\x92\x2e\xdd\xcf\x08\xda\xa9\x4a\xb7\xd2\x8b\x24\xdb\x0c\x86\xa5\x21\x77\xa7\xb3\x7d\x9a\xb8\x71\xeb\xd8\xf1\xe3\x9e\x45\xfc\x4d\xc4\xdf\x46\xfc\x1d\x5a\x2e\x3f\x70\xb5\x2f\xef\xa1\x3b\xcc\x83\xc5\xea\x5c\xb7\xfa\xf5\x7f\x07\xd7\x1f\x83\xf3\x0b\x9b\x48\x0a\x22\x82\xa2\x96\xc3\xb4\x2d\xf8\xdc\xaf\xed\x0f\x93\x43\xbc\x35\x39\xe4\x17\xbb\xb9\xea\x1b\xf4\x9f\xbf\x00\x61\x3b\xd8\x86\x2e\xb4\x08\x71\xf4\x35\x55\x03\xeb\x17\x60\x1d\x36\x18\xc8\x91\xd7\x6c\x96\xe6\xb7\xd4\xc3\x69\x2b\x1d\xbd\x0e\xd1\xf6\x24\x0a\xb4\x69\x55\xf0\x7a\x2d\x05\xb4\x40\x2e\x9d\x35\x4a\xc5\x38\x50\x32\xbe\x96\x3b\x99\xaf\xbd\xf4\xd1\xf3\x8a\x80\xeb\x4b\xfe\x03\x2c\xf9\xc8\x28\x03\x4f\xd6\x3e\x7a\xe1\x3a\xb2\xfc\x78\x12\x02\x68\x04\x5f\xd7\x54\x85\x76\x3e\xd1\xf3\x04\x9d\x15\xd9\x14\x5a\xe4\xa5\xf7\x82\xcc\x1d\xec\xe7\x5e\x49\xd6\x19\xd1\xc4\x76\x51\xe8\x85\xcb\xc4\x03\x72\x20\x42\x77\xcd\xda\xc3\x4e\xa8\xd5\x77\xb5\xd6\xcc\x1c\xb7\xcb\x4c\x50\xad\xb8\x4f\x55\xf7\xc9\xc6\x86\x00\x2d\x49\xd8\x3e\x97\xf9\xa6\x28\x57\x12\xad\xfb\xb4\xe2\x56\x01\xd7\xb3\xb0\x58\xc7\x6f\x34\xef\x36\xcd\xd3\xed\x7e\xdb\x9a\x73\x81\xac\x7f\x5a\x71\xef\xd1\xb6\xa7\xcc\x8d\x6d\x25\x72\xba\x16\xe6\xd9\xe1\xfb\x95\x16\x03\x72\xcd\x1c\xc4\x71\xdd\x67\xa3\x75\x43\x11\x6a\xce\xae\x7d\xa9\xb5\x98\x30\x34\xb5\x45\xe8\x9e\xf6\x8e\x37\x10\x91\x93\x82\x74\xb3\x27\xc7\xba\x56\xf0\x81\xda\xb9\xc0\x74\xc0\x6e\xce\xbc\x00\x95\xbc\x2f\x25\x73\x5a\x19\xcc\x4f\x53\xda\xda\x71\x63\xf5\x9f\x9a\xfa\x64\xfd\x1b\x33\xaa\x8d\x66\x1c\xcf\xfc\xd3\x0a\x2d\x32\x29\x1c\xb0\x78\x22\x3a\x30\xe9\x7d\x9a\xc9\x5b\xc3\xed\x01\xc2\x06\x2c\xb7\xb0\x2e\x36\x28\x8b\x42\x05\xe4\xe7\x60\x6c\x5e\xde\x96\xae\xe9\x43\xe1\x3c\xc1\x5f\xf6\x65\xaa\xd6\xe9\xca\x94\x40\xdb\x7a\x8d\xb8\xa5\x3f\xdb\xb6\xf8\x6b\x4b\xf4\x80\xf8\x9b\x8d\xae\x6d\x58\x23\x7d\x0e\x8c\x60\x8b\x9a\x0d\xf1\x7a\x5d\x64\x46\xe9\x16\x9c\x0a\xb5\x59\xb6\x3c\x10\x8b\x56\x4c\x74\xb9\xb2\x2c\xab\x28\xc0\x60\x23\x0a\x88\xe9\x28\xe8\x4b\x52\xf6\x20\x98\xb6\x22\x8a\x84\x5b\x02\x82\xf8\x84\xca\x7f\xbe\x1a\x81\xf8\x78\x2b\x3a\x5c\xcf\x35\x49\xfb\xb0\x74\x72\x5d\xe8\x73\xec\xea\x19\xd8\x60\xf0\xd2\x9c\x8b\x21\xfe\x6d\x28\x4d\x90\xdd\x54\x56\x59\xd3\xd3\x24\x4a\xc9\xb5\xc5\xa4\x31\x7e\x5a\xdf\x0c\x28\xc2\xf4\xbb\x50\xee\x44\xe9\x7a\x69\x1f\x43\x47\xe0\x08\xa5\xe9\x3c\x35\x44\x89\xf2\x22\xbe\xcd\x07\x14\x59\xba\xd2\xc7\xcc\x91\xd9\x9a\xae\xfa\x5a\x37\x9f\xf9\x64\xd4\x5c\x3d\x67\x4a\x99\xd2\x17\x78\x99\xe7\x81\xb9\xb4\x6d\x13\x4b\x82\xf9\x15\xfa\xde\x27\x0b\xed\x0d\xde\x16\xad\xa8\x10\x46\xf0\xc0\xf9\xf1\x01\x6f\x18\x5d\xf7\xc7\xfa\x4c\x5a\x4a\x88\x41\x83\xe4\xae\x7a\x87\x35\xe0\x67\x29\x2a\xde\x76\x68\x83\x39\x1c\x55\xfb\x2c\x54\xfb\x5e\x58\x86\xd6\xab\xd1\xbe\x7a\x54\xd1\xa2\x8a\xd2\x46\xc0\x6d\x29\x76\x77\x6e\x2f\x02\x00\x80\xaa\x01\x44\xa0\xda\x6e\xbc\x2b\x09\xa9\x04\xd4\x6a\xb4\x9f\x85\x6f\x78\x41\x7f\x83\xff\xe2\xef\xa7\xf3\xf1\x8b\x57\x7f\x14\xf4\x0f\xfc\x3b\x8e\xff\x73\xfe\xfa\xe5\xdb\x57\x0d\xfe\x9f\xb7\xdf\xf8\xff\xfe\x2a\xff\xa6\x3b\x99\x3b\x34\x30\x63\xa1\xdc\xc7\xfc\x55\xfc\x92\x9f\xd2\xd9\xe8\x11\xe8\x6d\xfb\x87\x7d\xe2\x1e\x79\xd2\x7b\x8c\x15\xc8\xc7\x4d\xf9\x8b\x59\x81\x98\x47\x43\x6e\x8b\x57\x0c\xfc\xdf\xfa\x17\xb1\x02\xc7\xac\xa0\xe4\xc5\x23\xac\x40\x8c\x58\x81\xc6\xf5\xcc\xb4\xec\x98\xb9\x21\x05\x7a\x15\xbf\x64\xec\xac\xc7\x2d\x2b\x90\x0b\x0f\xd9\x92\xf9\xb6\x0e\xe7\xee\x72\x74\x56\xe3\xf7\x09\x2a\xd3\x8d\x30\x8e\xec\x0c\xd6\xfb\xb2\x1d\xaa\x2d\xe2\x55\xc1\xd6\xb5\x6a\x95\xf7\x8c\x89\x1e\x56\x64\x98\xe2\xf3\xaa\x8d\x8c\x05\xd1\x19\x23\x4e\x14\x2b\x22\x03\xf3\x0b\x8c\x05\xa3\x21\x04\x33\xe5\x47\x44\x86\xf3\x81\xb1\x25\xa6\x74\x4d\x87\x71\xc4\xc5\x5a\xec\x2a\xea\x33\xf6\x7a\x8b\x1d\xba\x65\x61\x95\x5f\x73\x3f\x20\xca\x01\x75\xfc\xa8\x52\xf2\xdb\x26\xff\xce\xe9\xc9\xd0\xfd\x4a\x7f\x49\x9d\xf4\x6a\x9d\xd2\x2c\x98\xdd\x07\xc6\x56\xbd\x1a\x42\x38\x96\x42\x19\x6f\x9d\x3f\x46\x70\xe4\xde\x08\xc3\x54\xa1\xbd\x17\xb9\xfc\x1b\x3a\x4e\x85\xf1\x24\xcd\x53\xc3\x27\x16\x65\xcb\x03\x4d\xdd\x64\xf7\x20\xad\xcf\xd5\x56\x4c\xa1\xcf\x2c\xab\x9f\x59\x5b\xac\xb2\xee\x11\x20\x28\x68\xfc\xe6\x1c\x71\x1e\xb6\x83\x00\xbf\x24\xcd\xa2\xed\x32\xd1\x02\x88\x6f\xbf\x14\x33\x76\xee\x5d\x07\xaa\xc4\xfb\x63\xef\xc2\x13\xe9\xa4\xd8\xa3\x74\x52\x4f\xe6\x4f\x62\x2e\x6f\xd7\x75\x11\x71\x38\xaa\x8d\x6f\x2a\xe2\x21\xd9\x54\xc4\x20\x60\xb8\x15\x6b\xca\xd6\x61\x9f\xd6\xa3\xc7\x0f\x0f\x7c\xcc\xd8\x2b\x6f\xc5\x7d\x40\x7e\xbb\xec\x4f\x27\x5a\x60\x86\x8f\xb5\xf9\xf2\xe7\x12\x2d\xb0\x10\x4b\xb7\x49\xb4\xf0\x04\x76\x85\x6f\xb4\x0a\x7f\x37\xb4\x0a\x31\x63\xaf\x7b\xdc\x23\xed\xba\xfc\x6f\x4b\xda\x75\x84\xac\x8b\x3b\x8c\x58\x1b\x54\x62\x41\x98\x56\xcf\x26\x0c\x22\x05\x9d\x72\x2a\x60\x45\xa8\x0a\xfb\xe8\xef\x94\x37\xeb\xc8\x91\x98\xab\xc8\x93\x45\x25\xd4\xb2\xca\x55\x29\xab\x9a\x0f\x9a\xe6\x95\x04\x7d\xbe\xc7\x38\xd0\x4e\x96\xd5\x21\xe6\x93\x82\x91\x60\xf5\x78\x0f\xbc\xde\xef\xc7\x44\x1b\xf7\x44\x9b\xed\x40\x25\x81\xbb\x35\x05\x25\x4d\x4e\x06\xaf\x8b\xb3\xf2\x11\x9a\xe8\xcf\x04\xce\xc3\x7c\xf0\x04\x88\x06\xb6\x0f\x32\x88\x28\x04\x47\xce\xe4\x75\x19\xb1\xf6\xea\x3f\x23\x6c\x1d\x94\x29\xb4\x6b\x84\x66\x98\xcf\xec\x10\x68\xe5\x66\x78\x5a\xaf\xe7\x5d\xba\x4c\x3d\x71\x02\x07\xca\x19\xae\x3e\xe3\xb4\xcb\x2b\xe8\x0f\xb1\xe0\x05\xc0\xa7\x71\x44\x4a\xb9\xb2\x93\x07\x88\x5c\xc3\xea\x0b\x57\x95\xed\xba\xdb\xdf\xe8\xbb\x0a\x20\x0a\x19\x1f\xca\x5d\x56\x1c\xb0\x27\xc4\xa9\x8a\x96\x3f\xfb\x2a\x03\xf6\x3c\x68\x40\x66\x81\x8d\xd2\x49\xf6\x17\x58\x3c\xa8\xc3\x4c\xb9\xe5\x83\xc0\x16\x02\x66\x21\xec\x1e\xff\xaa\x7f\x9b\x31\x4f\x03\xc6\xaa\x3d\x40\x0c\x42\x9e\xa6\x56\x03\x83\x81\x68\x3c\x8a\xd2\xe3\x26\x34\xd6\x82\x97\xb5\x81\x93\xa3\x3f\x4e\xa8\xe9\x0c\x14\xa0\xd6\x41\xb6\x4b\x5a\x60\x96\x1a\x11\xd2\xa8\xd7\xbc\x06\x78\x58\xdc\x43\x28\x2e\x97\xd5\x03\x9c\x1d\xa0\x54\x67\x46\x60\xb8\xb0\xb5\x31\x24\xe8\x96\xbb\xc0\x0e\xc8\x05\x38\x20\x5e\xdd\x65\xa5\x4d\x62\xc0\x70\x6b\xd9\x26\x23\xd3\xbb\x96\x5f\xd4\x57\x11\xe6\xc1\x02\x9e\x46\x93\x2f\x24\xcc\xa3\xd3\x55\x2f\x66\xec\x6d\xcf\xaf\x6c\x37\x45\x54\x7e\x35\x68\x25\xd2\xdc\xe2\x8a\xd4\x94\xb1\xde\xe1\x6e\x5b\x17\x1b\x11\x23\x1e\x30\x5b\x1a\xd9\x85\x25\x39\x36\xd4\x67\xf8\x2e\x4d\xf8\x9a\x3d\xa6\xf6\xa1\xf9\xda\xf4\x57\xeb\x71\x98\x27\xd8\x65\x06\xa5\x9c\xaf\x19\x14\xaa\x80\xa9\xb2\xab\x30\xeb\xf8\xb5\xb2\x75\xf1\x06\x78\x20\xcd\x69\xe7\x4f\xfc\xe5\x98\xc0\x33\xe3\x13\xbb\x1e\x0c\x01\xe1\xea\x4b\x61\xea\x61\x1a\x47\xb9\xb6\x16\x50\x2a\x20\xca\xf2\xc0\x05\xd3\x9a\x29\xcd\x81\xd9\xa6\xf1\xc6\x76\x23\x00\xcc\x32\x30\x1a\xfc\x0a\x57\xc0\x27\xb0\x55\x89\x41\x29\x78\x5d\x9b\xbf\xeb\x99\xc2\x37\x50\xac\xd7\x65\x71\x2f\x73\x08\x26\x82\x19\xda\x56\x21\x77\x88\xfd\x9e\x98\xd2\x60\x1e\x8a\x8a\x85\x6e\x78\x9a\x9b\x76\xd3\x76\x1b\xd7\x19\xd0\x75\xb8\x11\x5c\x7d\x6d\xca\x3b\x1b\xb1\x94\x64\xee\xd7\x0d\x7c\xfa\xa3\xe3\xc4\xb5\x70\x25\x2e\x1a\x6f\x89\xec\x03\x39\xeb\x7c\xb8\x86\x2a\xf7\xcc\x11\xdb\x11\x81\xe9\x45\xa3\x70\x21\xf1\x10\x0c\xbf\x55\xed\x9b\xec\x2c\x5d\x16\x9f\x4b\x6a\x57\xca\x95\x5c\xa7\xf9\x2d\x83\x54\x54\x6e\xea\x9a\x6b\x8e\xba\xd7\xa2\xe6\x79\x7f\x66\x0e\x04\x3e\xec\x13\x58\xc2\xc8\x9a\x1c\x96\x64\x94\x19\x99\x44\xfd\x7b\x50\xc9\x77\x3c\x2c\x0e\xdb\x1a\x16\xed\x35\x4a\xef\xea\xf5\x7b\xfa\xf1\x5d\x15\x7c\xa6\x85\xfd\x77\x22\xa9\xd4\xab\xd1\x41\x52\xe9\x67\xe2\x44\xee\x51\x3f\xb9\x08\xb8\x5b\xca\x98\x79\xa6\x45\xeb\xa1\xf5\xec\x8d\x1a\x67\x16\x61\x66\xfa\xed\x7c\xae\x96\x29\x66\xec\x87\x5e\x67\x3d\x29\xbf\x81\xef\xe4\xa6\x21\xd9\x24\xb0\x2c\x10\x2d\x70\x7a\x79\x25\x7a\xae\x24\x53\x9f\x29\x6d\x68\x79\x1d\x33\x5e\x79\x5e\xe4\xc1\xfd\xf9\x46\x43\x64\xe8\xc4\xfc\x82\x96\xa0\x36\x90\xb4\xab\x91\x60\xae\x80\xcf\xab\xe9\x73\x95\x7c\xe8\x7e\xbb\x62\x3e\x66\x2a\xf2\x8c\x65\x7f\x27\xf4\x20\x20\x03\x82\x25\x7a\x90\xfe\x44\xb4\x8e\xc6\x9d\x24\xfd\x88\x59\x8f\x16\x22\xc0\x47\x32\x38\xe6\xdd\x00\x12\x5b\x00\xcf\x1b\xbf\x2d\x8a\xf5\x43\x9a\x65\x11\x83\x10\xa5\xaa\x8a\xdd\x4e\xdc\x02\x07\xcb\x76\xb7\xd7\x03\xa3\xfc\x30\x66\x6b\xb3\xcd\x3e\x5f\x19\x34\x15\xac\x08\x21\xa7\x97\xda\xe4\x1c\x16\x83\x9d\xa9\x29\x51\xa4\x4a\xb3\xae\x9a\x3a\x57\x74\x12\xa4\x6e\x31\x57\xcf\x3c\x08\xd6\x4c\x3c\x58\x73\x52\x51\x69\xa1\x7d\x66\xcc\xd8\x8f\x3d\xde\x77\x20\x8c\xf5\x92\x37\x3e\xda\x44\xdc\x2b\xde\x41\x8b\xc2\x4b\x6f\x2b\x9b\xfb\x0e\x0c\xcf\x88\x82\x25\x8a\x72\x65\x98\xea\x54\xfc\x00\x60\x73\x99\x14\x58\x96\xe7\x03\x65\x38\x28\x48\x56\xdf\x49\xbb\x6a\x9b\x6e\x54\x06\xd3\xf2\x11\x84\xc0\xd8\x53\xe3\x74\x6d\x46\x8e\x67\x3d\x69\xaf\x85\x09\xbf\xc5\x46\x6e\x36\xfa\xbe\xb8\xb8\x6f\x78\xe5\xaa\x82\xa8\x84\x68\x57\x50\x50\xd2\x72\x14\x1b\xe6\x6b\x58\x1f\xbc\xa4\x2e\x48\x42\xf2\x3e\xaf\x22\xe5\xe0\x8a\xfd\x80\x08\xc8\x54\x8a\x63\x1a\x6f\x55\xa5\xf7\x98\xdd\xcf\x52\x55\x85\x90\x13\x67\x7e\x3e\xff\x10\x94\xfa\xa1\x19\xc1\x1a\x76\x46\x0d\x4a\xb2\x85\x1d\xd1\xab\xe4\xc2\x9b\x74\x57\xe4\x45\x89\x29\xe7\x2e\x4c\x4f\xd2\x47\x70\x32\xeb\x48\xdc\xfa\xd4\x62\x3a\xde\xc3\x6d\x63\x60\xc4\x1e\xba\xdd\x29\xa8\x17\x27\x73\x5a\x0b\x1f\x2c\xbc\x73\x4f\x95\x21\x8e\x48\xe6\xe1\x88\x78\x82\xef\xc4\xa0\xbd\x9d\xe8\x63\x71\xe2\x23\xbe\x01\x66\x6a\xd3\x81\x73\x55\x6b\xbe\x52\xfe\xad\x64\x8a\xac\x9d\x4c\x11\xd7\x1f\x36\xcc\x08\x19\xc0\x1c\x34\x31\x90\xd6\xee\x0d\x46\x86\xf8\xd9\xcb\xde\xdf\x30\x4d\x64\xad\x08\x14\x2c\x5a\x2d\x1a\x51\x22\xc1\x71\x0e\x89\xb1\x04\x5f\x95\x85\x52\x2f\x40\x2d\xa2\xda\xd8\xeb\x93\x02\x3f\x47\x4c\xdc\x8a\x34\x57\x55\x68\xd8\xb9\x28\x88\xac\x91\x4e\xb6\xa9\x06\xa2\x7f\x64\x82\x0c\x33\x5a\x1f\xbf\xa6\xd0\xd5\x39\xd5\x85\x31\xaa\x3b\x1a\xb7\x7d\x99\x09\x8c\xf8\xd6\x0e\x9e\xfa\xed\x92\x9e\xd9\x21\x9d\xc0\xba\xa4\x0e\x7d\x8a\xd2\x03\x28\x8b\x28\xd7\xc4\x34\x79\x76\xd6\xe3\xff\xec\xd5\xde\x44\xfc\x27\x99\xef\x51\x72\x7e\xd4\x1e\x25\x14\x00\x8c\xc5\x03\xd5\x0d\xda\x02\x1d\x20\xe4\x44\xe8\x51\xbd\x1c\xa1\x14\x37\xbe\xf2\x12\x3a\xc8\x09\x65\x9b\x64\x1a\xb0\x77\xa2\x66\x0e\xab\x7e\x1e\xc8\xe1\x09\x8c\x82\x52\xaa\x74\x8d\xea\xcd\xf6\x3a\xd9\x3f\xea\x93\x0b\xd1\x33\xaa\xb6\xd8\x8a\xf2\xc0\x97\xc4\x02\x17\x39\xf3\x05\x74\x38\x00\x48\xc2\x2a\x89\x2a\x7c\x31\x04\xfe\x2d\x05\xc6\xaa\xc8\x37\x59\xba\xaa\x5e\x14\x9b\x17\xa4\x03\x71\xb7\x40\xb3\x4a\xe6\xfb\xe0\xb4\xe8\x37\x39\x08\xa2\x09\x6d\xc5\x00\x42\x9f\xf8\x81\x5c\xff\x04\x16\x90\xab\xf2\x0e\xd0\x96\xd9\x5c\x64\xe0\x4a\x7e\x2c\x8a\x75\xad\x21\x1c\x07\x06\xa8\xda\x58\x44\xd8\xa1\x83\xf6\x95\x5e\x24\x98\xa5\x5a\x15\x3b\xd9\x66\xd1\x20\x08\x8f\xd1\x82\xe6\x28\xba\x8a\xba\xa0\xed\xdc\x00\xcb\xb9\x06\xaa\x9d\xcc\xb1\xb1\x5e\x3f\x3b\x00\x1b\x37\x51\x3b\xf1\x60\x51\x3e\x77\xbb\xb2\xd8\x95\x5a\x9a\x05\x0b\x4d\x86\xb2\x71\xf5\xf1\xdd\xb6\xe8\xf6\xae\xbd\xf0\xd6\x15\x37\x9e\x9d\x43\x50\xa0\x28\x73\x79\x50\xdf\xf1\x4b\xa9\x6d\x9d\x11\xc6\x73\xe8\x5c\x42\x90\x15\x6a\xfc\xba\x55\xa3\xd6\xee\x4a\x4a\x48\x2f\x38\x8e\x11\x73\x8e\xf5\x19\x34\xe0\x29\xbb\x52\xde\x8b\x14\xd0\x46\xb1\xd0\xcc\xae\x16\xa0\x9b\x65\x06\xb3\x1c\x8a\xc6\xe9\xec\x28\x5a\x2f\xd7\x76\xf1\x88\xb5\xe8\x4c\x03\x26\xdc\xe4\x36\x52\x1a\xad\xa7\xb0\xd1\x6c\x5f\x62\xf7\x6c\xa3\x3a\x08\xf1\x3e\xea\x92\x8e\x11\xa0\xbe\x14\x99\xed\x0c\x11\xbe\xc0\x7e\xd6\x2e\x30\x6f\x17\x5e\xf5\xf8\x55\xaa\x56\x32\xcb\x44\x2e\x8b\x3d\x1a\x50\xed\xa5\xa5\x9e\x7a\x05\x8c\x8e\xaa\x80\x00\x5a\x50\x57\x8a\x01\xd1\xba\x48\xf4\x2a\x3f\x51\x78\x84\x4d\x1d\x01\x88\x52\x5b\x49\x29\x63\x67\xaf\x7b\x1e\x74\xb6\x1e\xd2\xc9\x97\x62\x7f\xa2\x57\x70\x11\x18\x4a\xf8\x6b\x02\xbb\x40\xc2\x5a\xdf\x1c\x25\x47\x87\xa5\x39\xdf\xef\x76\xd8\x84\x95\x15\x0f\x84\x55\x41\x1d\xd9\xa6\x81\xdd\xe1\xdf\x09\xf2\x97\x9a\x38\x78\x64\x7b\x51\x9c\x0d\xf7\x38\xe8\xf7\x25\x83\xd5\x3f\xc0\x51\xcd\xb8\xbb\xb4\x74\x45\xf0\x7c\x28\x7e\x33\xd3\xa3\xa6\x6b\xbd\x23\xf4\x72\x4a\x0b\x43\x7a\x52\x1f\x48\xe5\xe5\x2a\xf9\x12\x93\xe3\xa9\x69\xfd\xc0\x6a\x2a\x46\x9f\xc0\x11\x1d\x8a\x7d\x07\xfc\xd4\xda\xae\x70\xc4\x4f\xe8\x3b\x26\x76\x7b\x9a\xf6\x40\x96\xec\xf4\x6a\x45\xd4\x94\x85\x82\xdc\x38\x73\x10\x77\x32\x91\x2b\xfc\x25\xa9\x97\xad\xc8\x05\x69\x3a\x73\x7c\x71\x36\xce\xf5\x5c\x1e\xac\x77\x59\x73\x2e\x01\xc1\x21\xed\x61\x7d\x07\x54\x81\x14\x1b\xbe\x49\x37\x15\x50\x3d\x40\xc1\xc6\xe9\x9b\x97\xff\x4f\x0f\xe2\xac\x45\x69\xc5\xaa\x16\xa4\x54\x0e\x87\x05\x8e\xca\x3c\x2b\xed\x11\x16\x3c\x34\x07\x07\xcf\xf5\xc6\xa6\x8f\xdd\x9b\x1e\x46\x2b\xf5\xdc\x6e\x08\xc8\xd0\x51\xfd\xb4\xd5\x40\xe8\xfd\x06\x04\xf0\x00\x60\xc6\xe7\x9a\xf1\xab\x8e\x5b\x1c\xff\x02\xd6\x22\x13\x0f\x11\x75\x8d\x92\x7a\x84\x50\x9e\x72\xf0\x39\x60\x13\x6f\x24\x51\xf2\x71\x74\xb9\x11\x59\x11\x8a\xc4\x31\x99\xa2\xa7\xb3\xd7\x7b\x8c\xb1\x5d\x3d\xa7\xb7\x3d\x7e\xe5\x25\x62\xf5\xac\x17\xdd\xce\x46\xc8\x57\xbd\x02\xbe\xea\x37\x96\xaf\x9a\x11\x59\x75\x48\xb6\x5a\xe3\xa3\x0e\xd9\x47\x6b\x15\x09\x81\x05\xd8\x4a\x4e\xdd\x69\xe7\x63\xae\x52\x19\xcc\x1f\x9b\x17\x0e\x4d\x4a\x8b\x59\xdc\x16\x80\x41\x68\xa1\x46\x6e\xdc\xb5\x60\x99\xfd\xc6\x87\xb3\x2a\xa8\xf0\xad\xf9\xa6\xf5\xb9\xd6\xa7\x0a\x46\xbb\x89\x9d\x32\x53\x0b\x84\x05\x4b\x57\x26\xa4\xea\x95\x45\x69\x77\x17\x0c\xc9\x14\x36\xbc\xa0\xae\xd1\x1a\xad\x14\x77\xe5\x51\xac\x0b\x6e\xc6\xf3\x0a\xde\xc3\x4d\xf6\xf1\xcc\x1c\xd0\x87\xcb\xa6\x40\xf0\x15\xc6\x5b\x1f\x18\x90\x01\x40\x11\x56\x5b\x85\x13\xfa\x4a\xd3\xf9\xf8\x04\x86\x7f\xc0\xd7\xc0\x91\xc5\x1b\x53\x28\x93\xc1\x25\xf3\xc2\x90\x5a\xb6\xbe\xec\x03\xde\x7c\x2f\x51\x80\xfd\xde\xf0\x45\x0c\x62\x37\x88\xb0\x36\x69\xa9\x2a\xaf\x52\x15\x99\x60\x6d\x64\x96\xbe\x76\x62\x3b\x5f\x50\x50\xfe\x63\x9a\x03\x1a\xd5\xc1\x23\x36\xc1\xb1\x69\x1b\xe2\x9f\x60\x5e\x84\xc8\x4f\x4f\x30\x63\x2e\x1e\x72\x43\x44\x0f\xf3\xd4\x16\x27\x70\xfc\x64\x07\x0b\xa4\x45\xfb\x61\xe8\xff\xc3\x73\x0c\x05\x33\x24\x96\xbc\x7d\x61\xe8\xd5\xc0\xa3\xf1\x45\xe1\xce\x43\xfc\xda\xb1\xe2\x3b\x6a\x62\x6a\x3e\x08\x16\xd4\x12\x79\xb8\xde\x53\x6d\xd6\xdd\xa3\xfc\xa1\xad\x84\xc7\x8c\xb4\x02\xc0\xbb\x70\x3a\x9d\x8f\x7a\xd6\x7f\xf5\xba\x0f\x7d\x3e\x3b\x5e\xca\xfb\x54\x3e\x58\x66\x1d\x27\x57\xa8\x2b\xe0\x5b\x15\xef\x7f\xa9\x7f\xf1\xf7\xe9\x95\xa8\xd2\xaf\x7f\x24\x05\xfc\x23\xfc\xef\x6f\xdf\x9e\xbf\xae\xf3\x7f\xbe\x7c\xf7\xf2\x5b\xfd\xef\x5f\xe3\xdf\xe2\x4e\xf2\xf9\xe5\xd8\xaa\x83\xbe\xe9\x31\xa0\x92\x5f\x23\x16\x6c\xef\x01\x07\x87\x8a\xe4\x91\xe7\xf5\xe2\x31\xe2\xf3\x45\x7f\x32\xec\xcf\x86\xfc\xf2\x66\x02\xec\xc9\x7c\x3c\xba\x98\xf5\x67\x5f\xd8\xe9\xfc\x72\x0c\xbd\xc3\xca\x88\xb8\x55\xb1\x96\x51\x48\xc8\x1d\x91\x7f\x26\x57\xfb\x0a\x22\xb2\xc0\xbd\x1e\x51\xc2\x0f\xdd\x64\x5b\xa4\x06\xa0\x83\xfc\x44\xbf\xfd\x1a\x4b\x75\x4e\x62\x3d\x6c\xfb\x63\xd3\xda\x39\xfb\xf1\xc7\xb3\x17\xe7\x2f\x5f\xbe\x34\xe3\xf5\x18\x4b\x43\x6b\x30\x45\xcc\x7a\x4f\xfd\xa7\x15\x71\xa5\x60\x4c\x05\x85\xbe\xd3\xc9\x8d\x15\x04\xdf\xeb\x00\x70\xc4\xa0\x49\x90\x2c\xca\x68\x2e\x13\x3e\x8d\xf8\x2e\x93\x02\x04\x2f\x60\x28\x79\xb3\xc1\xc4\x36\x2c\xb4\x3a\xa8\x4a\x6e\x63\x7e\x71\x60\x69\xbe\x32\x63\xa6\xce\x39\x3b\x5b\x0a\x24\x3e\x90\x29\xd4\xe8\xe0\x35\x1f\x34\xd6\x87\xd2\x36\x01\x66\xf9\x56\x69\x65\xfa\xda\x48\xbd\x29\x0f\xe5\x5a\x0f\x34\x66\x6c\x6e\xdb\xa8\xa7\x5e\x8d\x73\x7d\xc9\x23\x02\x0f\xdb\x8a\x34\x57\x91\xb7\x01\xff\xe7\x7f\x1f\x5d\x7f\x74\xc1\x7d\xb2\x8d\x8d\x31\x07\x56\x5e\x5e\x55\xef\x79\x5e\xf8\x29\x53\xe7\xdb\xd1\xc1\x82\x43\x13\x03\x7b\x9f\x09\x9e\x4e\x37\xda\xe0\x67\x6d\xf0\xd0\xa6\xa6\x10\x22\x34\xee\x64\xda\x88\x90\x99\x99\x57\xf6\xac\x97\x99\x51\x79\x98\x67\x5d\x1e\x8c\x61\xb3\x2e\x4c\xab\x1a\xed\xb4\x36\x78\x55\xb3\xe9\xdf\x3e\x9c\x35\x4e\xcf\x7b\x53\x73\x7b\x16\x43\xd2\xbd\x6b\x84\x66\x74\xdb\x62\xbd\xcf\x4c\xe3\x9f\x1e\xc8\x1e\x9d\x2d\x40\x3e\xbb\xd2\x5e\x38\x9c\x8d\x9d\x3d\x5a\x12\xa2\xd9\xae\x86\xc5\x3f\xda\xc2\x6e\x7d\x68\xf2\xb0\x8f\x93\x1b\x04\x30\x6a\x30\x91\x59\xb8\x94\x6b\x59\x66\x40\xf7\x02\x34\x25\xde\x5f\x01\x50\xac\xbf\x36\x74\xfd\x77\xa5\x70\x79\xd4\xb0\x48\x54\xcf\xcb\x1f\xed\x7b\x7e\x02\xc2\xc8\x0c\x5e\x7b\x40\x4c\xef\x85\xaa\x4b\x9f\xcb\xf1\x33\x0e\x1c\xff\xc7\xbb\xaa\xda\xbd\xff\xfe\xfb\x87\x87\x87\x38\xdd\x82\x1a\x5c\x15\xdb\x7f\xd2\x52\x84\x40\x84\xe0\xd8\x88\x5b\x3a\x38\x5a\x36\x98\x85\x43\xe2\x82\xbc\x80\x20\x90\xf5\x1f\xbd\xab\x48\x51\x97\x5f\xc0\x97\x76\x39\xc1\x88\x89\x95\x58\xcb\x6d\xba\x8a\xf8\x36\xcd\xd2\x4a\x10\x3e\x0e\x60\xb7\x6a\x8f\x4a\x15\xb6\xfe\x52\xef\xa3\xa3\xdd\x93\x2d\x32\x86\x2d\xda\x7e\xdd\x0a\x53\x60\x2d\x4a\xca\x45\x7b\xe3\x8d\xf9\x28\x67\x2e\x01\x1f\xf9\x8c\x8f\x18\xbb\x23\x1a\x47\x15\xcc\xd2\xbe\x25\xad\x94\xcc\x36\x7c\xa3\xbd\x65\x17\xd4\x6d\x19\x2d\x0b\x1d\x30\xaa\xf9\x73\xdd\x66\xf4\x64\x3f\x2b\x80\x07\xde\x20\x45\xf9\xba\x82\xd9\x89\x78\x9e\x9b\x7d\x99\x61\x94\x39\x78\xbe\x11\xbe\xd5\x0c\x03\xd0\xb2\x88\xe0\xd4\x7a\x4d\xc0\xe7\x11\x22\x73\xe3\x52\x69\x3b\x01\xc6\x09\x05\xc3\x9e\xa4\xc1\x3d\xd8\x2b\x42\x22\xb1\xdf\x97\x6b\xbb\x50\x70\x5b\xe1\x7d\xbf\xe6\x40\x27\x65\x9e\xe9\x9e\x42\x7d\xb3\xcc\xb8\x05\xa6\xa5\xbe\x4f\xee\xc2\x3a\x55\xab\x52\xa2\x9c\x34\x53\x2a\xe5\x43\x99\xa2\x63\x8a\xcc\xae\x1d\xcb\x69\xe8\x60\xd1\x05\x34\xd5\xac\x30\x28\xea\xd6\x2d\x96\x80\xe6\x98\xb5\x7e\x9d\x42\x08\xfe\xf7\x1c\xa1\xb6\xdb\xf3\xe0\x8d\x2d\x47\x92\xd0\x6b\x11\xaf\xd7\x8a\x4a\x03\xd3\x25\xf8\xaa\x94\x6b\xad\x63\x1f\x59\x6e\xaf\xf3\x15\xe3\x42\xc6\x8f\xf2\x1c\x67\x00\x0a\xc0\xaf\xd8\x7a\x1d\x53\x56\x2f\xb8\x43\x03\x09\xc2\xe5\xc2\x68\x73\x85\xb2\xf7\xe4\x1a\x24\xcc\xea\xe9\x06\xc4\x89\x2f\x37\x7c\x8e\xf2\x86\xf8\xa8\x95\x50\xdb\x63\x4f\x29\x2d\xb5\x5f\x1a\x0e\x6b\xff\xaf\x58\xd8\xc8\x20\x82\xe7\xc3\x55\x48\x5b\x6b\xe7\xd7\xed\xc3\x62\xad\x04\x04\x12\x4f\xc6\xa3\x41\x32\x99\x27\xf1\xe2\xe7\xc5\x09\x2e\xbc\x16\xf8\xdb\x9d\x7e\x9e\x85\x6c\xf6\x4b\xff\xbc\xbb\xba\xba\x13\xe5\xad\xe4\x82\x6f\x24\xea\x9c\x2e\xc3\x02\xfb\x20\x3c\x28\x4a\x53\x15\x74\x60\x94\x64\x0e\x3e\xd8\xd5\x46\x50\x5f\x91\x4d\x40\xc6\x45\x65\xdc\x3e\x2e\xb7\x65\x6d\xaf\x7d\x3b\xb6\x34\x96\x01\xdf\x29\xd8\x8d\xbf\x02\xbd\xb5\x57\xd8\xb5\x09\xaa\xc7\x95\x9f\x6f\x8f\xe1\x1a\xe6\x05\x14\x4b\x60\xe7\x38\xed\xbe\x50\xaa\x58\x41\x2e\x85\x44\xa0\xed\x09\x5e\xd7\x28\xea\x7d\x65\x6f\xe5\x96\xa8\x1c\x4a\xaf\x6d\xc2\xc7\x0c\x94\xac\xb8\xd2\x77\xbb\x55\x45\xc5\x8c\x79\x95\x77\x53\x57\x79\xd7\x30\x7f\x1d\x4a\x93\x82\xb3\x67\xb5\x80\x3d\x32\x77\xc5\xce\x60\x82\x56\xb6\x2b\x7e\xaf\xe4\x66\x9f\xc5\x6c\x14\x3e\x84\x38\xec\x5d\xb2\xe4\xc1\x2b\x0d\x34\x98\x71\xf5\x4a\x32\x88\x91\xb2\xb6\x5a\x32\x83\x78\xe8\x08\xbf\x22\x2a\x82\xc3\x25\x09\x6b\xca\x6a\x15\x64\x70\xc9\x1f\x03\x81\xc3\x5b\x22\xf3\x2a\x2d\x25\x2f\x53\x05\x35\xae\x74\x48\xfe\x7d\x0f\x50\xe8\x50\xef\xe9\xf1\x29\xd5\x65\x67\xaa\xbc\x38\xfb\x1c\x69\xb1\xfd\xbf\x43\xdc\x85\xe0\xe3\x80\x27\xa6\x22\xde\x7b\xb4\x0c\x8a\x0d\x2f\xe5\x4e\xa4\x65\x44\x0d\x08\x30\x73\x08\x25\x96\x26\xa4\x0e\xed\x92\xf6\x25\x7f\xd5\x00\x4b\xfc\xfd\xc5\x7c\xf8\xe2\xfc\xc5\x20\x13\x7b\x25\xff\x98\x28\xc0\x23\xfe\xff\xf9\xeb\xb3\x97\x75\xff\xff\xed\xcb\x57\xdf\xfc\xff\xbf\xc6\xbf\xd0\x3d\xfe\xc7\x83\x14\xe5\x3f\xf1\x7f\x84\x1c\xca\x3f\xc5\xbc\xef\x88\xe7\xa9\xc7\x69\xad\x6d\x63\x19\x08\x37\xc8\xe4\x23\x5e\x2a\xe9\x5c\xfd\x9b\x65\x9a\x13\xc7\xf8\x96\x60\x1e\x4d\xcc\xb5\x9e\x11\x88\x00\xfc\xd0\x81\x4e\x78\xec\x6e\x64\x0b\xb4\x05\xbe\x39\xf2\xb4\x55\x08\x3f\x16\x0e\x09\xc4\x85\xef\x28\x79\x65\xe9\x98\x04\x87\x20\x72\xbd\x21\x98\x50\x11\xb2\x54\x91\x65\xe0\xde\x45\xd5\xc8\x6e\x20\x41\xf5\xe6\x79\x73\x00\x69\xee\xaf\x80\x0d\x77\x7b\xed\xb6\xbf\xe7\x18\x8c\x2c\x0f\xec\x63\x16\x90\x40\x18\x58\x08\x4f\x9a\x5b\x27\xb4\xa6\xf7\x17\x9f\x46\x73\x3e\x9f\x5e\x2e\x3e\xf7\x67\x09\x1f\xcd\xf9\xf5\x6c\xfa\xd3\x68\x98\x0c\xf9\xc5\x17\xa8\xb6\x1d\x4c\xaf\xbf\xcc\x46\x1f\x3f\x2d\xf8\xa7\xe9\x78\x98\xcc\xe6\xbc\x3f\x19\xf2\xc1\x74\xb2\x98\x8d\x2e\x6e\x16\xd3\xd9\xdc\x14\x1c\x33\xfd\x87\xfe\xe4\x0b\x4f\x7e\xbe\x9e\x25\xf3\x39\x9f\xce\xf8\xe8\xea\x7a\x3c\x4a\x86\xa6\x0a\x77\x94\xcc\x23\x3e\x9a\x0c\xc6\x37\xc3\xd1\xe4\x63\xc4\x2f\x6e\x16\x7c\x32\x5d\xf0\xf1\xe8\x6a\xb4\x48\x86\x7c\x31\x8d\xf4\x4b\x59\xf3\x6b\x7c\x7a\xc9\xaf\x92\xd9\xe0\x53\x7f\xb2\xe8\x5f\x8c\xa0\x1e\x58\xbf\xef\x72\xb4\x98\xe8\x77\x5d\x4e\x67\xbc\xcf\xaf\xfb\xb3\xc5\x68\x70\x33\xee\xcf\xf8\xf5\xcd\xec\x7a\x3a\x4f\x98\x9e\x96\xad\x08\x1e\xc6\x7c\x34\xe1\x93\x29\x4f\x7e\x4a\x26\x0b\x3e\xff\xd4\x1f\x8f\x5b\x67\xa9\xc7\x1e\xcc\xf1\x22\x61\xe3\x51\xff\x62\x9c\xe0\x9b\x26\x5f\xf8\x70\x34\x4b\x06\x0b\x3d\x1d\xf7\x5f\x83\xd1\x30\x99\x2c\xfa\xe3\x88\xcf\xaf\x93\xc1\x48\xff\x47\xf2\x73\x72\x75\x3d\xee\xcf\xbe\x44\xf4\xcc\x79\xf2\x2f\x37\xc9\x64\x31\xea\x8f\xd9\xb0\x7f\xd5\xff\x98\xcc\xf9\xe9\x23\x4b\x72\x3d\x9b\x0e\x6e\x66\xc9\x95\x1e\xf3\xf4\x92\xcf\x6f\x2e\xe6\x8b\xd1\xe2\x66\x91\xf0\x8f\xd3\xe9\x50\x2f\x34\x9b\x27\xb3\x9f\x46\x83\x64\xfe\x81\x8f\xa7\x73\x58\xad\x9b\x79\x12\xf1\x61\x7f\xd1\x87\x17\x5f\xcf\xa6\x97\xa3\xc5\xfc\x83\xfe\xef\x8b\x9b\xf9\x08\x16\x6d\x34\x59\x24\xb3\xd9\xcd\xf5\x62\x34\x9d\xf4\xf8\xa7\xe9\xe7\xe4\xa7\x64\xc6\x06\xfd\x9b\x79\x32\x84\xd5\x9d\x4e\x60\xaa\x8b\x4f\xc9\x74\x06\xf5\xd7\x7a\x0d\x60\xf1\x23\xfe\xf9\x53\xb2\xf8\x94\xcc\xf4\x82\xc2\x4a\xf5\xf5\x12\xcc\x17\xb3\xd1\x60\xe1\x7d\x8c\x4d\x67\x7c\x31\x9d\x2d\xbc\x39\xf2\x49\xf2\x71\x3c\xfa\x98\x4c\x06\x89\x1e\xcd\x54\x3f\xe5\xf3\x68\x9e\xf4\x78\x7f\x36\x9a\xeb\x0f\x8c\xf0\xb5\x9f\xfb\x5f\xf8\xf4\x66\x41\x75\xdf\xec\x66\x9e\xe0\x7f\x7a\x27\x36\x82\x9d\xe4\xa3\x4b\xde\x1f\xfe\x34\xd2\xc3\xa6\x22\xf1\xeb\xe9\x7c\x3e\xa2\x73\x02\x4b\x36\xf8\xc4\x71\xb9\xff\xfb\x26\x35\xe2\xef\x07\x99\x09\xd6\xfc\x51\x39\x80\xe3\xfa\xff\xec\xf5\xab\xb3\xb7\x0d\xfd\xff\xee\x9b\xfe\xff\xab\xfc\xd3\xe6\xf1\x20\x13\x25\xc6\x2b\xea\x61\x3b\xc6\xae\x4b\x29\xb6\xcb\x4c\xa2\x63\x01\x75\xb8\x2e\x5b\x6e\xd4\x0d\x24\x91\x0b\xf4\xab\xeb\x55\xab\x18\x1a\x20\x72\x5f\x7e\x2d\x56\xbf\x8a\x5b\xc9\x2c\x64\xd0\x0e\x91\xa2\xf7\x40\x4d\x4c\xea\xde\xd9\x24\x9f\x8a\x6c\x0d\xba\x2b\xcd\xb5\xee\x56\x5c\x15\x5b\xc9\x95\xdc\x2e\x33\x32\xd5\x99\x25\x44\x36\x45\x31\x50\xef\x05\x5a\x4d\xde\xcb\xac\xd8\x6d\x3d\x48\xc3\x1d\xbe\x1e\x42\x43\x99\xe4\xb7\xe9\xbd\xf1\x60\xf7\x4a\x96\x8a\x85\x1f\xe3\x41\x3b\xf7\x9e\xca\x02\xea\xae\x3b\x7d\x16\xa1\x6e\x8b\x52\xbe\x28\xca\x17\x99\x54\x8a\xad\xf6\xaa\x2a\xa0\xea\x71\x23\xd4\x1d\xb2\xb9\x66\xfb\x5a\x93\x38\xd4\x47\xf9\xfc\x12\xbe\x33\xac\xdd\x3c\x5b\xc3\xa3\xde\x33\x76\x42\x6f\x3b\xa9\x11\x8a\x18\x10\x0e\x74\x35\x21\xfc\x1d\xf4\x34\x1a\x1c\xaf\xda\xc2\x46\x98\xe2\xb0\xe5\x12\xae\x04\xb3\xed\x81\xc4\x11\x68\xaa\xb1\xa0\x70\x62\x5f\xa3\xd0\x8b\x19\x3b\x99\x57\x22\x5f\x8b\x72\xcd\x7f\xc2\x92\x08\x7f\xb0\x58\xea\xe6\x16\x0d\xb8\x6a\xee\x30\xa2\x8f\x89\x6c\x13\x3b\x83\x88\xb1\x4d\x6f\xdb\x88\x5a\x07\x61\xfd\x03\x60\xbd\x35\xd1\x79\xe9\x00\x09\xc5\x5c\x61\xc1\x52\x66\xc5\x83\x1e\x68\xfd\x63\x27\xe0\xeb\xdd\x15\x40\xb3\x97\x2a\xa8\x17\x58\xbb\xca\x58\xaf\xac\xd2\xcb\x46\x6c\x0a\x0c\x76\xd2\x99\xd1\xcf\xc5\x5a\x2f\x88\xde\x02\xb4\xe3\xa1\xd8\x7f\x57\x62\x12\x00\x02\x1e\x62\xa9\x4d\x60\xfd\x0c\xa2\x3b\xae\xc5\x53\x52\x65\x16\x48\x3f\xcd\x8f\x23\xf1\x8d\x94\xf0\x68\x8c\xc5\x1c\x8a\xbd\x09\xce\xd4\x03\x2f\x0e\x46\xc0\x3d\x0d\x12\x66\x39\x9a\x83\x50\x33\xa9\x1f\x7f\x89\x01\xa9\xbe\x49\x04\xb8\xe6\x5e\x0c\x6f\xeb\xf7\xa4\x8a\x5e\xb3\xb6\x49\x91\x06\x90\x70\x5a\xc9\xad\x36\x5e\xf1\x68\x00\xe2\x30\x5d\x72\x28\x97\x4c\xf3\xfb\x22\xbb\xc7\xe5\xbc\x13\xf9\x3a\x33\x17\x2f\x85\xbc\xd6\xa8\x42\xec\x5a\xf7\x6e\xd6\x24\xe4\xd0\x1f\xa5\xb8\x67\x98\x96\x73\xe1\x47\x25\xb6\x81\xf4\xa9\xee\xe4\x81\x11\xf1\xd0\x9a\xa7\xc4\x30\x6b\x83\xd0\xfa\xf2\xe9\x2b\x70\x0b\xc0\x08\x0f\xe2\xc0\xef\x65\xb9\x14\x55\xba\xad\xf5\x95\x98\xf8\xa3\x17\x5e\x33\xc7\x9c\xd1\x31\xaf\xaf\xb6\xf5\x75\x3c\xea\xc1\xa8\xe6\xdc\x40\x76\x70\x8f\x61\x76\xa8\x5f\x37\x12\xc8\x06\x35\xeb\xfe\x81\x81\xf6\xa7\xb0\xd3\xda\x87\x94\x0f\x59\x6e\xb0\xd6\x68\xb9\xbf\xe5\x9b\xf4\xab\x54\x11\x70\x39\x98\x46\x23\xf8\x15\x92\x1a\xa3\x77\x10\xc4\xe0\x28\xd2\xcb\x6c\x48\x2a\x00\x2a\xa4\x4c\x4f\xa1\x08\x06\xb5\x7e\x82\x30\x66\x67\xbe\xea\xd2\x84\x78\xc9\x62\x6d\x92\xd3\x0a\xf9\xb7\x9a\x24\x03\xf4\x7e\x63\xd5\x6b\xd5\x8e\xd0\x58\x5f\x77\x24\xaa\x31\xb3\x76\xad\xef\x94\x61\xc0\xde\xa4\x96\xdb\xe0\xd5\x47\xb9\x6d\x61\x76\x5b\xa8\x80\x48\x70\xd7\x73\xeb\xea\x7d\x10\x33\x04\x68\xc3\xd7\x18\x67\xd5\xba\xcf\x80\x9a\x00\x34\xf9\x9d\xcc\x19\xdd\x4f\xf8\x14\x3c\x58\x7f\x14\xa3\xd0\x2d\xe7\xa0\xe0\xa2\xe2\x99\x14\xaa\xe2\xd3\x49\x62\xa3\xb8\x21\x6a\x13\xd2\x66\x7b\xa5\x67\x66\xcf\x48\x4c\x85\x90\x92\x01\x16\xc0\x96\x1a\x89\xb6\xb4\x63\xcc\xdb\x31\xc3\x4b\xb8\x3c\xf0\x5d\xa1\x90\x4c\x4e\xa4\xeb\x66\x6c\xf6\x46\xc9\x5c\x22\x69\x6b\xee\x11\x52\x33\xc3\x81\xa4\xc5\x10\x81\x9b\xe8\xe1\x84\xdf\x2f\x10\x0e\xfe\x97\xa2\x34\x8d\xf0\x5c\x94\xab\x3b\x7d\xf9\x20\xd6\x29\x0c\x9d\xda\x3e\xf7\x0a\x2c\x0d\x89\x38\xa8\x3a\x7c\xc5\xf2\x60\x3f\xdb\x2e\xf0\xa1\xa0\x12\x13\x0b\xdd\x6b\x55\x57\x54\x36\xf2\x67\x85\x2f\xf1\x3a\xf6\xac\x94\x73\x99\x1d\x3a\x44\x50\xff\x4c\x90\xe5\x74\xd4\x5c\x7e\x11\x7a\x54\x6e\x45\x9e\xfe\x87\x51\x8e\xab\x1e\x2f\x25\xd4\xa1\x61\xfb\x79\xfe\x42\x99\x41\xb8\xa2\x07\x85\xf9\x1a\x53\x59\x47\xe9\x6a\xd3\xfa\x40\x85\xe5\xe6\x16\x78\x5f\x33\x19\x2f\x0c\xef\x6b\x71\xba\x74\x61\xf2\xe0\xd8\x71\xe1\x20\xa0\xb7\x22\x07\xb0\x0f\xad\x20\xb4\x74\x87\xb3\xdd\x31\x32\x32\x0e\x28\x67\x66\xcc\x3f\x05\xa7\x3e\xad\x08\xb3\x42\x19\xc4\x8a\xe6\x0a\xc7\x1e\xfa\x14\x1c\x47\xe2\xde\x08\xc2\x49\x1e\x0c\xa6\x53\xf0\xf5\x1d\x8e\x19\x93\x3d\x03\x6f\x03\x35\x23\xf9\xaa\xd8\x43\x9a\x02\x9b\x53\x1f\xee\x0a\x8f\x81\x36\x00\xf8\xa9\x6f\x22\x0b\xf9\x4b\xb7\x36\x59\x1e\x9e\x9a\xba\x9c\xc3\x80\xd7\x56\xba\x22\x85\x07\x71\x40\xa2\x2a\x23\x8d\x6a\xb6\xe2\xae\x2c\x6e\x4b\xe1\x75\x3d\x78\xa2\xa8\xc0\x52\x4f\x08\x57\x01\x15\x98\x59\x73\x86\x58\x69\xbf\x55\x60\x78\x43\x10\x9d\x27\xde\x3f\x7b\xd8\x43\xb7\x2c\xc1\x70\xc5\xea\x9b\xaa\xb8\xc5\x3a\x7b\xa4\xd0\x06\xe6\xd7\x95\xed\xb0\xc3\x35\x75\xa7\x08\x86\x6f\x25\x43\x8f\x9b\xee\x21\xbd\xb6\xb7\xb2\xea\x12\xe2\xcb\x9e\x4b\x49\x35\xa2\x52\xee\x20\x34\x70\x9f\xc2\x3c\x9f\xd9\x52\x13\x4d\x2f\x1b\x16\xf5\xaa\x87\xea\xbe\xf3\xf2\x05\x7f\x80\x2b\x48\x9d\x00\xb5\x63\x8f\x2c\x55\x04\xd3\xb2\xc2\x12\x58\x6f\x19\x14\x3f\x0d\x17\xc2\xad\x23\x6f\xac\x23\x3b\xb6\x48\x7f\xd4\xed\x71\x44\x01\x4f\x5b\xd4\x88\x77\xac\x6a\xc4\x96\xda\x98\x4a\x33\x5e\x94\xf8\xf4\x37\xee\x0e\xd8\xec\xe1\xba\x66\xc8\x72\xc7\x08\x53\x4f\x95\xf9\x16\x30\x15\x51\xe1\x60\xd5\x7e\x07\xd0\x41\x68\x86\xba\x8f\xb9\x9c\xb8\x79\x5d\x7e\xf0\x4c\xe4\xa2\x40\x1e\x31\x66\x53\x6e\x45\x59\x85\x34\xd0\x76\x98\xa6\xf2\xc5\x8c\xb0\xc5\xda\xf5\x4c\x6a\x4c\xfb\x75\xdc\xf8\x9a\xb1\x71\x7b\x5b\xca\x5b\x2d\x72\xbd\xce\xbf\x53\x02\x81\x3f\x30\x57\x22\x82\x92\x9a\x7e\xaf\x8f\xe3\xa6\x94\x5a\xd8\x19\xe9\xe1\xe3\x2f\xf2\x4c\x0f\xdb\x7b\x8e\xdf\x7e\xde\xfe\x1c\x5b\x07\x12\xc0\xf6\xe0\x11\xc7\x45\xf0\x96\x00\x53\x6b\x98\x79\xf5\x2a\x6e\xf4\x2a\xb6\x3f\xa6\x55\x4e\x41\x25\xca\xfa\x5e\x6a\x5f\x5d\x12\x67\x1e\x2d\x0c\xf4\xfa\x9b\xc2\x1e\xaf\x08\xdb\x02\xcf\xbb\x15\xb4\xcd\x33\x1e\xb0\x52\x19\xd9\x34\xb5\xdc\x2e\xe5\x3a\x58\xf5\xef\x94\xff\x49\xa3\xa6\xb5\xe1\xe2\x34\x1a\xbd\x52\xf1\xd3\xe5\x81\x65\xe8\xa1\xf5\x3e\xe0\x63\x6c\xbb\x93\x65\xbb\xc6\xe1\x6e\xf5\x45\x35\xbe\x80\xd9\xd6\x60\xf6\x0e\xba\x08\x0a\xbe\x64\xd5\x6d\x6d\xf8\x23\x4c\x41\xf5\xc3\x44\xd6\x90\x6a\x79\x8b\x09\x4c\x04\xa2\x69\x91\xcd\x2e\x7d\x2c\xf4\x5c\x77\x7b\x2c\xee\xb3\x2c\xf1\xf0\xfb\x62\x5f\xed\xf6\x95\xb3\xe6\x3b\xd5\x90\xd9\xa9\x80\x40\xa0\x56\xe0\x61\x1d\x12\x56\xfb\x36\xa6\x73\xb5\x73\x8d\x35\x64\xc6\x91\xbe\x85\x72\x31\x0c\x1c\x68\xf3\x0d\x89\xc8\xc0\x33\x54\x45\xb6\xf6\xce\x6b\x76\xc0\x80\x04\xfd\xd5\xde\x97\xb5\xcf\x91\x43\x62\x41\x9f\x0e\x30\x5a\xcd\xd2\x14\x65\xb8\x32\x90\x54\x3a\xf6\x08\x7e\x9f\x0a\xf2\xed\x5e\x98\x2a\x89\x7d\xbe\xde\x6f\x77\xd8\xf5\xb0\xcf\xf5\x29\xd1\xee\x70\x75\x57\xac\x21\x36\x84\x8b\x8a\x0e\x36\x65\x77\xbc\x93\x94\x6e\x61\x15\x80\x07\xb0\x2e\xd2\xd0\xbe\xce\xf1\x33\xc4\x95\x94\x53\x9a\xbc\x79\xbe\x8e\x09\x44\x40\xb9\xc3\x07\xa4\x15\xab\x6d\x8e\xcf\x72\x8f\xc0\x9b\xd4\x36\xa1\xf8\x2b\x58\xf8\xd7\xdd\x17\x94\x59\x52\x38\x3b\xda\xfa\xe4\x70\x74\xed\x07\x39\x08\x5a\xbc\x8b\xf9\x80\xab\xfd\xb2\x2c\xf6\x55\x9a\x93\x2a\x04\xdd\x5e\x0a\x92\x51\xbb\x54\xaf\xb8\xff\x19\x6d\x04\x21\x9b\x97\xc8\x6f\xf7\x5a\x83\xf6\xec\xf1\xd6\x0a\x46\x0f\x15\x2f\x40\xfe\x2b\xf8\x8c\x96\x8e\xd7\xb3\xa2\x4a\xb2\xfe\xe5\x16\xf0\x8f\x82\x17\xe8\x2f\xdf\x8b\x12\x60\x4c\x6c\xac\xcf\xbc\xcc\xa0\xc9\xd9\x06\x2e\xf3\xd4\x80\x08\xc6\xf3\x45\x7d\x88\x18\x16\xdc\x01\xc3\xf2\xea\x74\x3f\x60\x5c\xc0\xed\x84\x6b\xea\xf6\x85\xbf\x0d\x36\x44\x2a\xc9\xfc\x11\x1b\xd3\xff\xce\x62\xe3\xda\xe1\xd6\xba\x7b\x08\xe9\x0d\x1b\xf6\xb0\xc1\x68\x23\xd2\x8c\xe1\xa9\xb8\x2d\x25\x99\xb7\x52\x79\xbd\xce\xe6\x61\x31\x63\x3f\xc4\xbc\xef\x04\x59\x3d\xc6\xd1\xe1\x21\x99\x16\x1a\x4f\x75\xf9\x47\x97\xa5\x8a\x8b\x0c\xba\xe7\x8e\x65\x77\x6d\x11\xb9\xbf\x95\xca\x4a\xc1\x0f\x18\x0e\x4a\x91\x6a\x0f\x08\xec\x8a\x7b\x70\xcd\xab\x4a\x6e\x77\x10\x7c\x86\x38\x84\x31\xdd\xdb\x34\xc0\x46\x68\x03\xed\x3e\x85\x56\x3a\x66\xfa\x55\x31\x71\x5d\xba\x1a\xb1\xd6\x69\xc4\x7c\x4e\x6d\x77\xcd\xb3\x00\x97\x96\x3d\x7a\x69\x63\xc6\x7e\x44\x49\x6e\xfa\xa3\x3a\xe2\xdc\x07\xf3\xf0\x6e\x58\x4a\x76\x04\x96\xd2\xea\x64\x13\x7b\xb2\xae\x49\x40\x77\xe0\xe1\x59\x01\x8a\x44\x8c\x09\xb4\xeb\xfe\xe0\xcf\xfd\x8f\x61\xc6\xd7\x00\x47\xf5\x27\x43\x0b\x19\xf5\x78\x3e\x97\x79\xc9\x4b\xf3\x2d\x48\x5e\xf6\x17\xa3\xe9\x04\xf2\xb9\x2d\x5f\xf3\xf3\xb9\x23\x97\xcf\x65\x8f\xe5\x73\x71\x65\x93\x7c\xfd\xdf\x36\x8b\xf7\xdb\xff\xc5\xdf\xf7\xaf\xc7\x2f\xce\xfe\xf3\xf0\xff\xcf\x5e\x9d\x9f\xbf\x79\xd3\xc0\xff\x7f\xfd\x0d\xff\xff\xaf\xf2\xaf\x3f\xec\x5f\x2f\x46\x3f\x25\xfc\xfa\xe6\x62\x3c\x1a\x70\xaa\x13\x65\x36\xaa\x7d\x16\xbf\x64\x4c\xdf\x57\xfa\xcb\xd0\x42\xac\x59\x19\x71\x33\x19\x26\x33\xb8\xd3\x8b\x64\x76\x35\xb7\x09\xf9\xae\x67\x9f\x9a\x6a\xd4\x93\x5e\x0c\xc2\x04\xca\x12\x66\xc9\xf5\x6c\x3a\xbc\xc1\xa6\xa1\xe9\x8c\x0f\x47\x73\x2c\xb5\x80\x9f\x31\x83\x1f\x8e\x61\x30\x9d\x50\xcd\xc3\x9c\xcd\x92\xc1\xe8\x7a\x94\x4c\x16\xdf\xcd\x79\x7f\x30\x48\xae\x17\x7d\xa8\x25\xa0\xa1\xd0\x17\x41\x8c\x8d\x16\x73\x1c\xa8\xab\x57\x98\xce\xa0\xbe\x62\x7e\x33\xf8\xe4\x9e\xc4\x67\x49\x7f\x38\x6f\x99\x97\xa9\xa5\xb5\x55\xb5\x38\x1e\x14\x92\x27\xf6\xfb\x27\x58\x67\x92\x5c\x8e\x26\xc9\x90\x5f\x24\xe3\xe9\xe7\x98\xb1\xd1\xd5\xf5\x74\xb6\xe8\x4f\xa0\xa2\x23\x79\xdf\xe8\xce\x3e\x01\xb4\xfc\xf4\x5e\x9e\x44\xb6\xe4\x07\x4c\xe8\x74\x65\xf9\x06\xc0\x6f\x46\x9f\xec\xde\x29\x66\x91\x23\x3d\x74\x7a\x2f\xeb\x8c\x53\x0a\xcb\x16\x2d\x6d\x17\x78\x0c\x88\xfc\x54\xf0\xb5\x44\x50\x09\x0a\x95\x9a\x2e\x9b\x7c\xdd\x45\xc1\x6c\x3b\xcb\xbd\x46\x5e\x81\x23\x35\xfa\x86\x75\x8d\xc4\x1a\x9d\x14\x9b\x73\x31\x0a\xcb\xba\x60\x91\x3a\x57\xb2\xac\x44\x9a\x1b\xe6\xaf\xd2\xd9\x68\x64\x39\x14\xfb\x4a\x49\xcb\xe9\x88\xad\xae\x19\x62\xba\x20\x34\x63\xcc\xd8\x5c\x4a\x0f\x1d\xf8\x1c\xb3\x7f\x11\x4f\xbe\x22\x14\x6f\x5f\x9b\x11\x62\x75\x67\x02\xa4\xda\xa6\x9a\xef\x77\x3b\x28\xec\xaf\xbe\x7a\x65\xd2\x08\x7b\xe5\x6d\x96\xbf\x74\xc1\xe4\xb9\xd9\x42\xbe\x91\xa2\xda\x97\x52\x71\x0f\xba\x8d\xac\x56\x16\xe0\x45\x58\xe6\xff\x00\x85\xc4\x84\xb7\x37\x45\x29\x6f\x0b\x28\x1c\x3d\x15\x3d\x44\x02\x00\x66\x2c\xa9\x5d\xf6\x22\x45\x70\x35\x83\xae\x15\xc0\xe7\x28\xa9\xad\xb5\xb2\xe2\xaf\xf4\x11\xb1\xb3\xfe\xc0\x4f\x97\x3d\x6b\x07\xda\x87\x39\xc4\x08\x86\x30\x02\xe5\x1a\xbe\x7d\x70\xcf\x79\x5d\x7b\x0e\x34\x3b\xaf\x6a\x83\x0a\xc0\xa2\x1d\x79\xdb\x29\xf2\xdc\xf5\xe0\x69\x8d\x4d\x81\x47\xc1\x3b\xde\x06\xef\xc0\xb0\xd7\x59\x8c\x57\x69\xa4\xe5\xc1\x3c\x76\xdd\x51\x67\x31\x3f\xb1\x65\x59\xa3\xe9\x84\x12\x98\xef\x19\xd3\x6b\x35\xa2\xec\xad\x70\x9d\x8a\x2d\xe7\x24\x0a\xfe\x00\x50\x02\x7e\xfa\xdc\x63\xf5\x33\x9b\xdf\x7d\xe6\x88\x30\x41\xaf\x6f\xed\xe5\x10\x59\x9f\xef\x97\x04\x85\xd8\x1c\x80\xf7\x37\x82\x33\x80\x2c\x20\x90\x7c\x59\xa6\xc6\x5a\x5e\x1f\x7c\xb5\xf6\x87\x42\xb2\xf3\x3c\xe6\x27\xc3\x64\x3e\xfa\x38\xe9\x2f\xb4\xa0\x4a\x2e\xf8\x7c\xb4\x48\x7c\x0c\xe7\x07\xb9\xa4\x5a\x73\x61\xeb\x21\x6e\x66\x63\x1f\xef\x36\xcd\x19\xec\xcc\x59\xb0\x33\x26\xe1\xa0\x3f\x6c\x2a\x3a\x28\xdd\xd5\xbd\x3e\x7c\x79\x60\x26\xc7\x44\x5d\x01\x80\x9f\x93\x57\x7c\x28\x55\x7a\x8b\xb4\xb3\x9f\xe5\x92\xcf\x53\x8a\x9b\xe7\xf2\x01\xde\x01\x01\x43\x13\xf2\x56\xe9\xd7\xea\xc0\x4e\xdf\xbe\xec\x01\x51\x2c\x4c\xf6\x95\x9e\xac\xd1\x1b\xd3\xd9\x89\x05\x80\x39\xf0\x6b\x40\x6f\x46\xf9\xe3\xa1\xf8\x37\x45\x0f\x90\xe0\xe7\x07\x4b\x7d\x0f\xb9\x6c\x7d\x74\xbc\x70\x7b\x91\x4b\xff\x76\xc0\xbb\x5f\xc7\xfc\x24\x19\x27\x83\xc5\x6c\x3a\x19\x0d\x42\xf5\x75\x95\x68\xa3\x76\x34\xbf\xf2\x47\xb4\x95\x7a\xb1\x52\xb5\xa5\x10\x09\x10\xe7\x02\x5c\x22\x62\x9a\x63\x6c\xc2\x04\xd9\xbc\x62\x16\x02\xa1\xa8\x0e\xf6\x02\xc3\xbd\x2b\x8b\x3c\x5d\x11\xbd\x0a\x3a\x35\x6b\x51\x09\x18\xdb\x1b\x3d\xb6\x9f\x93\xc1\xcd\xa2\x7f\x31\x0e\xf6\x3e\x9c\x3a\x39\x95\x18\xda\x72\xe0\xeb\x1e\x6c\x31\x3c\xee\x6d\xcc\x4f\x3e\x4e\x7f\x4a\x66\x93\xd1\xe4\x23\xff\xe7\x9b\xd9\x68\x3e\x1c\x0d\xbc\xcb\x67\x3a\x78\x2a\x49\xee\x2d\xd1\xa7\x93\x7f\x0f\xe0\x38\xbe\x98\x62\xc1\x51\x6b\x13\x58\xf0\xde\x77\x31\x3f\x19\x4d\x86\xc9\x75\x32\x19\x6a\x05\x7d\x35\x1d\xde\xb8\xe9\xf8\x39\x2d\x68\x86\xc4\x2a\x60\x5a\x40\x2a\x86\xd5\x4b\xc2\x08\xdf\x81\x78\x0a\x6b\x74\x32\xfa\x5b\x58\xe2\x11\x74\x65\xd4\xcf\x08\xf7\xce\x08\xa3\x33\x82\x88\x57\x44\x0f\x1b\x41\x3d\x10\x8c\xc3\x36\x4b\x41\xcb\xc1\xe6\x40\xb0\xd1\x23\x8f\x73\xf5\x0a\x3f\xb9\xdc\x57\x2c\xcd\x55\xa5\xf5\x29\x94\x4e\x07\xfd\x58\xb5\xcd\xb2\xd9\xac\x7d\x26\xdf\x83\x66\xf0\xdc\x66\x7d\x65\x1b\xdf\x41\xb1\xef\x08\xf8\xe1\x9e\x42\x75\x0e\xa0\xf2\xd1\xa1\xab\x4d\x15\xec\x0c\x38\x07\xcb\x03\x17\xdc\xa0\x9f\x42\x6b\x11\xa2\x29\xad\x32\x01\x44\xcb\xf4\x9c\x0f\x80\xcb\xb3\xea\xa1\x6d\xb0\xf4\x70\xf4\x89\x89\x45\x68\x25\x1e\x31\xc0\x8c\x2b\x32\x19\x30\x97\x9b\x20\x2d\xa6\xd5\xb1\x69\xac\x28\x0f\x88\x6a\xb7\x74\x3f\x0b\xe0\x28\x40\xa6\xce\x8a\x28\x42\x31\x24\x4a\x6d\x45\xfb\x5d\x73\x32\x70\x8a\x7e\x80\x53\x34\x5a\x8c\xfa\x63\xbf\x9e\xd7\x3f\xba\x24\x2c\xb4\x62\x46\x94\x26\xef\x7c\x0a\xe5\x4b\x36\xe6\x4b\x36\x83\x81\x62\xf0\xb8\xa9\xdf\x68\x79\xe0\x2d\xc2\x13\xc6\xf2\xa3\x37\x16\xb4\x21\xdd\x20\x52\x92\x9d\xde\xed\x8b\x82\x34\xa1\x55\xa7\x5a\xe1\x34\x3b\x68\x4d\xf4\x19\x10\x6c\x29\xe6\xcb\x5b\x2e\xda\x79\x28\xd3\x99\x20\x40\xd9\xce\xf7\x36\x3a\x31\x81\xf8\xb2\xae\x2f\x03\x2b\xe7\xb8\x8d\x76\x16\x9f\xbd\xd4\xd6\x74\x7f\xf6\x31\x99\x05\xeb\x20\xf0\x4a\x52\x4d\xda\x76\x09\x51\xb1\xd6\xeb\x48\x57\x51\x99\xbb\x88\x86\x25\x8c\x57\xdf\xbc\x5b\x80\x4b\x6c\xe2\x33\xe1\xdb\xcf\x9a\xb6\xbc\xdb\x87\xc0\x2c\x20\x31\x82\x66\x62\xa0\xad\x23\x7d\xe3\xb0\x30\x44\x28\xe9\x35\xb0\x9a\x91\x19\x4d\xe2\xdb\x2e\xe7\xee\xc5\xda\x1f\x18\x0d\x92\x13\x24\x60\xd7\x17\x5b\x8a\x1c\xd1\x90\xb5\x56\xf4\x36\xec\x4d\xf3\x1c\x9d\x69\xcd\x77\x35\x1d\x8e\x2e\x47\x83\x3e\x0a\xe2\xa2\x0c\x7f\x33\xf7\x75\x8f\x89\x28\x16\x76\x42\x24\xb5\x58\xc0\x16\xeb\x5f\x9b\x33\xad\xe0\xae\x93\xd9\xdc\x49\xf9\x06\xb0\x9a\x2f\xdf\x09\x11\x2c\xc4\xf7\xf4\xba\xfd\x21\x9d\x64\xa1\xba\xcc\x77\x97\xc5\x1a\xd5\xe9\x99\xd6\x59\xce\x97\x6a\x6a\xf2\x20\xc1\xaf\xbf\xbf\xc4\x12\xd1\xc6\xe8\x59\x0b\x2a\xfa\xe9\x12\x43\xa7\xda\x2a\x7b\xaa\xe9\x2d\xf2\x03\x6b\x37\xb4\x80\x91\xc2\x9c\xff\xa2\xec\xe1\x04\xb4\x96\x9c\x4f\x6f\x66\x83\x84\x0f\xa6\xc3\x40\xeb\xd6\x9b\xf8\x45\xe3\xa2\xfa\x68\x81\xad\xdf\xc8\x32\xdb\xf2\x6f\x60\xea\x8a\xdc\xaf\x96\x6b\x3e\x71\x97\xed\x15\x42\x0f\xba\xf2\x31\x1b\x1d\xf5\x6c\x7f\x93\xf6\x87\x2e\x5a\x4a\xaf\x98\x78\xa4\xa9\xb2\xc5\x08\xbe\xed\x33\x41\x62\xdd\x2c\xb3\xd1\xe3\x20\x7b\x80\xeb\xa1\xb5\xf7\xfc\xe6\x82\x7a\x1d\xda\x44\x6f\xdd\x4e\xdb\x8a\x5f\xa5\xb2\xf4\x5d\x68\xb0\x99\x03\x4a\x52\x9e\xfa\x0e\xeb\x96\x33\x7a\xce\x0d\x53\x4f\x54\xde\x27\x91\xbb\xe7\x31\xb3\xee\xec\x87\x70\xd8\x5d\xd2\x49\xdf\x5a\x84\x2c\x47\x3d\x27\xca\x54\x19\x6e\x0a\xbc\x6d\x8a\x35\xaf\x9b\xe2\x55\x61\x91\x1e\x38\x07\x25\x5e\x97\x39\x1f\xfc\xbf\x2f\x7b\x1e\x5b\x4f\x6d\xd6\x1f\x00\x64\xe1\x14\x99\xed\x90\x33\xc9\x62\xd0\xd6\x9d\x1f\xbb\x4a\xb6\xf9\xb7\xfd\x91\x8c\x61\x59\x02\x7c\x84\xe6\xd1\x9c\x84\x71\x54\x0c\xa1\x7c\xa7\x43\xd2\x6f\xec\x14\x74\x9c\x9e\xd8\x07\x9c\x1c\x7f\x82\x31\x7a\xea\xbb\xf8\x50\x83\x8c\x47\x20\x6f\xf5\x88\x83\x04\x69\x29\xaa\x17\x12\xc0\x44\xce\x8a\xfc\xd8\x17\xbe\x53\x7c\x29\xef\x44\xb6\xb1\x15\x73\x11\xdc\x5d\x04\x3a\x44\x41\x80\xeb\x88\xd2\xcf\x5a\x9a\x32\xbf\x15\xe4\x16\x15\xa5\x97\xb0\xf3\x60\x15\xeb\x13\xf3\xdf\xdb\x8b\xd9\x25\xd0\xe5\x49\xa1\x6f\x34\x05\x46\xb4\x74\x15\x8d\x05\x6d\x20\xd4\xaa\x1a\x6f\xfe\x4a\xec\xaa\x3d\xe5\x08\xd2\x1c\x00\x79\xac\xaa\xc9\x0f\x2d\x56\x29\xde\x83\x1f\xe1\x1e\x5c\x5f\x8f\xb1\xe7\xe8\x72\xe4\x5b\xde\x64\xac\x39\x13\xa0\x3d\xac\x43\x1e\x26\xa3\x2f\x40\x32\xe4\x44\x79\xe1\x96\x13\x4f\x39\x9e\x6b\x9b\x60\xf1\x69\x34\x1b\x42\xcc\xff\xcb\x13\x34\xe3\xeb\x96\xc0\xc1\x79\x6c\x03\x76\xe6\xd9\xe7\xf1\x59\xec\xb5\x77\x19\x05\x7c\x39\x9b\x5e\x71\x63\x8d\xf5\x27\x43\xde\x2e\xad\xe6\x31\x86\x16\xe6\x21\x3a\x5f\x2b\x9e\x6d\xd4\xe9\x05\x13\xa9\x25\xf2\xfc\xa0\xdd\x30\x33\x15\xcf\x86\x0c\xf1\x45\x0b\x1b\x22\x0f\xd8\x10\x7d\x70\x75\x6a\xd9\x00\x81\x72\x9a\xf6\x5c\xbb\xa1\xf6\xc1\xb4\x67\x24\x9b\xcc\x99\xc5\x26\xb2\xa4\x8d\x86\xd7\xd1\xfb\x0d\xb5\x45\x47\xcc\xaf\x22\xcb\xd7\x1e\x97\x4a\x53\x5a\x51\xf8\x23\xad\x8d\xe0\xf1\x97\x04\xb0\x92\xe1\x5b\x88\x8f\xa7\x4e\xfb\x69\xec\x5f\x9a\x1e\x5c\x2f\xbb\x88\x1f\x18\x10\x83\x79\x8c\x3b\xfa\x99\x89\x07\x2d\x05\x2f\xa5\x24\xbc\x57\x92\x73\x15\x94\x36\x21\x81\x0a\xdb\xe7\xb6\x6a\x70\x29\x54\x8a\xd8\xa3\x41\x21\xce\x18\x0b\x71\xc8\x5e\xd2\x82\xfa\x69\x07\xe4\x48\x54\x88\x0e\x09\x23\x32\xa8\xbf\xfc\x90\x30\x47\x5f\xf2\x57\x3f\x24\x8d\xe0\xd6\xe6\x98\xa4\xfd\xc0\xbe\x1d\x23\x4f\x5e\x9d\xc7\xfc\xba\xbf\xd0\x82\xe8\x37\x0a\xab\x20\xcd\xe0\x70\x7b\xd0\x31\xe7\x86\x8a\xd5\xe7\xe0\x33\x7b\xf7\x70\x27\x2a\x85\xa5\x3c\xb6\xae\xb7\x35\x84\xda\x15\xd9\x34\x3c\x57\xce\x40\x26\x4c\xcb\x88\x51\x1c\x1f\x60\x35\x1a\xd6\x49\xaa\x08\xfc\xb3\xc6\xce\x56\x23\x5f\x6b\x09\xce\x9e\x92\x9e\x00\x47\x0c\x03\x93\xbd\x23\x92\x58\x3b\xbc\x36\x72\xbd\x2f\xd5\x5e\xe4\x40\x93\xd7\x12\x8b\xc6\xfa\x29\x5c\x20\xbc\xcf\x18\xb8\x30\x55\x36\xfd\x88\x5f\x44\x7c\x10\xf1\x21\x1e\x13\x5c\xb2\xb6\xa0\x36\x96\xb7\xa5\xca\xc4\xa1\xd6\x05\x66\x11\xf2\x6e\x33\x0d\x23\x31\xf5\x7b\x64\xca\x1f\x6a\x2b\xe2\x2b\x5f\xeb\xda\x34\xb7\x97\x21\x5e\x2d\x1e\xae\xf9\x8b\xe4\xe7\xc1\xf8\x66\x98\x0c\xb9\xcb\xd0\xa1\x2c\xb3\x18\x67\x5d\xab\xb8\x15\x04\x5b\x03\x43\x0b\x21\x6e\x10\xeb\xc5\x1b\x22\x6b\xdb\x21\xbe\xd9\x83\x5d\x62\x3b\x6f\xde\xf3\xd3\xb3\x16\x73\x18\xa2\x4b\xe7\x68\x07\x5b\xd8\xd7\x46\xcc\xfe\x48\x00\x1a\x83\xd6\xb6\x9e\xb0\xfe\x02\x76\x1a\x46\xf7\x8c\xdf\xde\xf3\x9d\xff\x00\x72\x19\xd6\xff\x48\x46\x80\xd5\xf7\x46\xb8\x9d\x09\xc7\x22\xea\xb7\x2f\xdc\x1e\x2c\xab\x48\x86\xcc\x6e\x0f\x58\xb8\x70\x78\x21\xd4\x40\xa7\x97\x3f\xfd\xf4\xb2\xc7\x4e\x6f\xdb\x83\xa8\x14\xa7\x63\xbe\xcc\x77\xba\x68\xef\x95\x77\x3e\x5b\x37\x1f\x74\x41\x78\x02\x9a\x37\x3b\x46\xf7\x86\x30\xed\x9d\x2a\x6c\x8b\x03\x10\x59\x39\x40\x88\x87\xcd\x5c\x26\x74\xe7\x47\x72\xa9\x2b\x8e\x76\xbc\x35\xde\xea\x81\x5c\x21\x93\xea\x8b\x11\xc5\x35\x99\x6f\xed\x21\x66\xb8\xa3\x13\x34\x7a\xce\x9f\x54\x0b\x5f\xa8\xed\x57\x71\xa6\xc2\x13\x44\x4b\xeb\x2e\x1b\xe7\x97\xb9\x05\x0a\x0a\x97\x4c\x1a\xb2\x94\xd9\xc1\xf1\xff\x98\x49\x25\xc4\x6b\x61\x87\xb7\xa1\x84\x88\x37\x0b\x0f\xf3\x50\x3f\x77\x16\x32\x0b\xda\xdc\x6e\xeb\x16\xb0\x86\x7c\x7b\xee\x16\xd8\x6e\x8e\x00\x65\xae\xe5\x56\x77\x4e\x09\x97\x03\xc8\x0f\xf3\x82\x6e\x84\xb5\x8d\x40\x87\x5b\xd4\xbd\x22\xd8\x3d\xdb\x4a\xd8\x3c\x0c\xf5\x97\x40\x58\x84\x0e\x7d\x6a\x80\x86\xda\x0b\x43\x0d\xd1\xbe\x0b\x95\x05\xc6\x03\x33\xf2\x05\x3e\xec\x36\x35\x1c\x5b\xe4\xca\x95\x6b\xcb\xe4\x2f\x24\xeb\x56\x05\xfa\x72\xad\x7b\xfc\x33\xf8\xfb\xc2\x7b\x0f\xe0\xfe\x01\xb9\x85\x17\x4e\x28\x5d\x3c\x16\x43\x0d\x8d\x57\x91\x50\x3e\x75\xc1\x59\x27\x49\x6b\x7c\xf5\xad\x43\x35\xe9\x48\xd1\x58\x62\x16\x10\x34\x76\xbd\x9e\x3f\xf5\xf5\xec\x89\xaf\x37\xd7\x3d\x74\xee\xfc\x55\x39\x35\xdc\xa1\x8d\x37\xc2\xde\x44\x2e\x9d\x84\x96\x0d\x18\x3e\xb5\x5d\xdd\x03\x31\x09\xc8\x4c\x4f\x6f\x84\xdc\xe3\x2d\x2f\x6e\xb3\x78\x1c\x75\x8c\x36\x67\x90\xaa\x23\x74\x44\x1a\xb3\x6d\x13\x6f\xe1\x15\x63\x81\xb8\xe2\x7f\xa1\xb8\x62\x7d\xcf\xca\x7d\x15\xf3\xfe\xe0\xcf\x93\xe9\xe7\x71\x32\xfc\x88\x61\x06\x6d\xd9\x3a\xf2\x46\x00\x1f\xb2\x0b\xa5\xf7\x0e\x1a\x75\xa8\x29\x16\x58\xe2\x89\xa2\x2e\xa3\x4e\xe4\x36\xfd\x0f\xed\x62\x62\x75\xd7\x15\xcd\xbd\x35\x8c\xa5\xb6\x13\x82\xd8\xed\x95\xfb\x18\x84\xbd\x94\x84\x4e\x94\xea\x8e\x39\xd2\x6e\x6e\xcb\xa8\x0d\xa8\x2d\x41\xa4\x45\xfc\x76\x2f\x80\x49\x01\x29\x7f\x94\xda\x97\xd0\xc4\xee\x03\xac\x2d\x11\x8d\xef\xb9\xf6\xb5\x6f\x5b\xdb\xba\xda\x9a\x6d\xe4\x6c\x7e\x24\xaa\xf2\x8d\x01\x1b\xb6\x6a\xe5\xff\x36\x25\x41\xc5\x86\x39\x39\x4d\xa4\x1a\xcf\x1b\xaa\x59\x79\x7f\xc0\x96\x08\xd3\x70\x9a\x1b\x71\x59\x15\xde\xad\xd8\x68\x81\x83\x9f\x32\xbc\x55\x88\x86\x18\xc6\xdb\x90\xd3\x0e\x08\x98\x3d\x3a\x2e\xa8\xbe\x3e\x36\xb1\x80\xa0\xc4\xc3\x13\x6c\xcd\x86\x28\x64\x6f\xf6\x48\x9b\xab\xc2\xe7\x90\xa9\x1c\x43\x1a\x96\xab\xe3\x11\x62\x3e\x79\x2d\x11\xcc\xd4\x3c\x7a\x8a\x09\xe9\xa3\xb1\x85\x2e\xd0\xcc\xa3\x00\xb1\x8b\xa2\xe4\x6a\x5f\x4a\xf6\x08\x69\xbb\x19\x42\x2e\x25\x74\x7f\xa2\x93\xdb\x5e\x6d\xc4\xda\x53\x1e\x7e\x6f\x39\x3e\x40\xdb\x2d\xe5\x9a\x08\x97\x9a\x8c\xf0\x26\xe3\x09\x81\xee\x2c\x2b\x1e\x42\x65\x55\xeb\x86\xac\x15\x7c\xa5\x10\x28\xb5\x5f\xf8\x4e\xd5\xa6\x0e\x0f\x5d\xc1\x0b\xf0\x8c\x9b\x17\x2f\xa5\x1e\x71\x13\x94\xb2\x9e\xc2\x32\x52\xe6\x75\xcc\x67\xc9\x3c\x99\xfd\x04\x69\xb1\x98\xb1\xa3\x3c\xee\x5a\x88\xae\xa5\xdc\x62\xfa\xc3\x79\xc9\xb4\xbc\xfa\x80\xfc\xde\x7c\xfb\xfa\xbc\xb6\xa4\x97\x9f\x2c\x01\x64\x27\xcb\x30\xc9\x29\x5c\x8c\x57\x71\xad\xc6\xf2\x62\x3c\xfa\xd8\x0f\xcb\xab\x5e\xc5\x67\xb5\x4f\x7d\x4c\x26\xc9\xac\x3f\x1e\x7f\xa1\xc0\x42\xbf\x2b\x76\x85\xab\x47\x15\xf9\x41\xe2\xa5\x16\x51\xaf\xc5\xf2\x4f\x55\xcf\xf3\x15\xe8\x02\x62\x94\x07\x5a\x76\x44\xce\x13\x57\xee\x12\xa0\x63\x5c\xd9\x8a\x1a\xb0\x59\xf9\x4e\x96\x69\xb1\x86\xb8\x8a\x49\xf1\x54\x0f\x32\xbb\x97\xfc\xf4\xec\xbc\xc7\xb7\x45\x5e\xdd\x11\x90\xaa\xd0\x67\x08\x5a\xde\x1b\x9f\xa0\xc7\x30\x73\x1c\x6e\xd3\xdc\x55\x29\x78\xd0\x2d\xa0\xcc\x11\xa2\x1e\x54\x71\x29\x45\x7b\x64\x9f\x59\xaf\x3e\x2f\x78\x26\x2a\x53\x66\x03\x15\x4d\xdc\x56\x34\xd1\xb3\x6a\x31\x10\xfb\xc4\x30\x97\xd5\xb5\xa4\x7e\x3c\xb2\x9f\x65\xfe\x39\x51\x84\x55\x7e\xe4\x56\xb6\xc0\xad\xb0\x2e\x0b\x82\x3a\xbb\x3c\x4c\xdf\x3a\x0c\x89\x0d\xcf\xb8\xd4\x66\x93\x74\xad\xe1\xc7\xc8\xa0\x04\x13\x8a\x33\x33\x14\xeb\x97\x69\x26\x7b\x68\x03\x82\x3a\xef\x36\x02\xbd\xc0\x00\xd4\xe8\xf8\x50\xd7\x21\x35\x22\x56\xac\x38\xa2\xf5\x20\x90\xd1\x99\xd6\x70\x05\x2b\xa6\x93\xcc\xd8\xd4\xd5\xd7\x2a\x3e\x61\x41\x59\x90\x6f\x75\x4d\x2c\xa4\x44\x4b\x66\xbf\x59\x3f\x43\x14\xea\x70\x06\x73\x93\xfe\xcc\xb2\x90\x57\xde\x25\x6f\xef\x53\xf9\x60\x39\x9b\xb1\xd5\x85\x2a\xbc\xbc\xf6\xf2\x10\x7b\xa9\x3e\x30\xe5\xd3\xca\x1b\xcd\x4b\x97\x52\x54\x95\x61\x52\x04\xe5\xc2\x50\x2f\xec\xd5\x71\x09\xfc\x2a\x3e\x8f\xb9\xab\x46\x0b\xc4\xcb\xbc\xb5\xd2\x3b\x66\xac\x1f\x48\x38\x6c\xf4\x85\xae\xde\x47\xf5\x4a\x7b\x30\x07\xaa\x8f\x6a\x51\x5c\x6d\xbe\xfb\x75\x72\xc1\xc8\x4e\x6c\x56\xd5\xd3\x81\x91\x87\x76\x6e\xef\x84\x2d\x6c\x6d\xc6\xfa\xfd\x56\x2f\xff\xed\xc3\x5a\xd7\x54\x6b\x40\x0f\x6c\x5c\xba\x0a\x29\x46\xb8\xda\x2f\x58\x04\x56\xb3\x6d\x45\x3d\x0a\x12\x50\x63\xee\xdd\xec\xb3\x4d\xaa\x4f\xf0\x7b\x13\x36\xee\x1c\xa7\x3d\x9d\xb5\x31\x81\xac\xf3\xcf\x63\x51\x36\x0b\xd1\x6a\x45\x5a\x1d\xaf\x70\x15\xf0\xde\x03\x99\x79\x6f\x10\x16\xa6\x72\x49\xb1\x95\x1c\xb8\x7a\x4d\x99\x56\xd7\xe0\x8b\x12\xcf\x29\x7b\x8a\x3a\xa1\xc4\xfa\xf2\xf9\xeb\x41\x0d\x72\xa6\xef\x0a\x9a\xd8\x23\x76\x2f\xb2\x74\x1d\x56\xb3\xea\x43\x55\x1d\xb4\x0a\xe0\xa7\xaf\xde\x1a\xdd\x04\x24\x7c\x08\x4e\x14\x1e\x3c\x17\x7f\x60\x1d\x69\x25\x2a\x2b\xc1\x86\xee\xbc\xc0\x20\x0c\xa8\x19\xf4\x1d\x11\x5f\x74\x77\x77\x50\xd4\xe7\x4b\xf9\x13\xbd\x26\x54\x6c\x52\xeb\x0f\x77\xad\xcc\x0d\xb8\x00\x5f\xf2\xfe\x6e\x7b\x8f\x84\x94\x1e\x43\x45\xbe\x66\x41\x95\x19\x72\xc5\x3f\x61\xff\x4c\x1e\x68\x75\xe7\xbd\x8d\x35\x37\x0f\x39\x4b\xbc\x57\xd6\x32\x3f\x20\x24\x9a\x52\x80\x99\x4e\xe2\xc7\xed\x12\x13\x5a\x26\xe6\x33\x50\x63\x1d\xdf\x62\xee\x5b\xe8\xa9\x59\x6c\xeb\xba\x24\xf4\x24\xb4\xe1\x34\xa9\xf6\x65\x8e\x38\xe7\x5c\x40\x58\xbe\x4a\xab\x7d\x25\x7b\x80\xf0\x02\x66\xce\x23\x27\x2f\x66\x5d\x15\x07\x95\xc1\xae\x7d\x81\x2c\x2c\x21\x1b\xad\xa1\xad\x6f\x06\xe7\x9b\x71\x98\xe0\x06\x37\x97\x95\x37\x25\xb4\xe3\x97\x6c\xe0\xd5\xbb\x3c\x48\x56\xe4\xe8\xc5\xf9\x01\x12\xba\x88\x5e\x76\x8d\x15\x65\x4b\xad\x03\x66\xe4\x0c\xb2\x8b\x25\xf4\x37\xcf\xf1\x94\xd8\xab\x98\x7b\xd5\x5d\xa1\x16\x8b\x19\xfb\x0c\x91\xe0\xda\x5e\xfd\xda\x56\xbd\xd8\xa9\xa2\xbc\x7c\x09\xad\x0e\x15\x47\xb5\x1c\x4b\xf0\x9f\x8c\x04\xea\xc8\x07\xf9\x44\x8a\x40\x84\xd0\x6a\x9d\x35\x8c\x0e\x6b\x60\x75\x5d\xf3\x88\xa9\xb4\xda\x43\x39\x19\x11\x4d\x90\x8c\x69\xc6\xd4\x90\xde\x54\xed\xd2\xd5\x1e\xe9\x26\xba\x4c\x0a\x66\x6c\x5c\x9c\x32\xfa\xad\xf6\x34\x22\x60\x25\xc1\x47\xe3\xf0\x8d\xd6\x7d\x15\xbf\x22\x8e\x48\x70\xce\x44\x96\xb1\x36\x28\xfe\xd6\xba\xf7\xfa\xa2\xc6\xbc\x61\x76\xb0\x06\x19\x02\x5c\x4e\x12\xa3\x5c\x20\x88\x85\x29\xc2\x2f\x1d\x18\x9f\xe9\x95\xa0\xef\x23\xc5\xfc\xf2\xb9\xa2\x99\xb7\x88\x66\xef\x4c\x82\x6b\xfb\x2f\x37\xa3\x59\x32\xa4\x72\xd2\x39\x1f\x4d\xfc\x73\x1a\x33\x96\x1c\x29\x38\x80\xcd\x97\xb9\xda\x1b\x27\xdb\xab\x67\x06\x46\x8a\x7d\xe5\x8c\x55\x16\x18\xab\x7e\x55\xb9\x81\x48\x03\x93\xb8\x5d\x2f\xd4\xeb\x1e\x58\xbd\xe3\xc5\xc4\x4a\x45\xe5\xcb\xbe\x2e\x17\x38\xa5\x50\x3a\x8e\x95\x99\xe2\xfe\x4c\xab\xa8\x43\x73\x60\x98\x6d\x4a\x33\x04\x92\x48\x6d\x37\x00\xa1\xa5\x80\x59\xb9\xdb\x23\x12\x02\x73\xb8\x6f\x01\xc5\x40\xdd\xe8\xe6\xeb\xbd\x34\x71\x42\x44\xf6\xd9\x97\x26\x25\x54\x73\x00\x1b\x4b\x6e\x3c\x26\x6f\x0e\xf8\xbe\xac\xa0\x1c\xe3\xa9\x81\x68\xd3\x3e\x67\x26\xef\x85\xa5\x54\x29\xca\x03\xb3\xf4\xeb\xd5\x9d\xa3\x93\x51\x55\x51\xca\x75\x8f\x80\x85\xc8\x01\x40\x9c\x80\xa5\xe4\x59\xfa\xab\x44\x59\x9d\x15\xc5\xaf\x96\x5e\x96\x19\x46\x4c\xef\x58\xbd\x89\xf9\x64\x1a\x86\x01\xe8\x98\x5d\x25\x93\x05\x36\x66\x03\x6e\xf4\xa4\x3f\x1e\x43\x3b\xe7\x90\x07\xa5\xc7\x18\x64\xd1\x82\xc4\x52\xf8\xd2\x7d\x55\xda\x1d\x88\xf0\xd6\xe6\x6b\x7d\x84\x23\x2f\x68\xb4\x15\x50\x40\x0c\x8c\xec\x99\x05\x5a\x03\xbe\xca\xe2\x21\x3f\x86\xb5\x66\x11\xdb\xea\x51\x26\x9b\x62\x69\x64\x02\xf5\xfb\x6b\x8e\xb3\x32\x70\x25\xbf\xca\x30\x25\x03\xcb\x65\x06\x06\xef\xa2\xa1\xf9\xf1\xab\xc7\x86\x78\x6a\x50\x56\xef\x65\x76\x88\xf8\x89\x59\x42\xbd\x80\xe1\xfa\x9d\xf4\x90\x64\xa8\x9e\xd0\x33\x19\x2c\xd7\xa8\x19\xfa\x43\xa0\x06\xa9\x34\xc5\x37\xa1\x8b\xb2\x59\xc1\x62\x53\x7c\x23\x33\xad\x1b\x55\x9f\xb5\x49\x44\xd9\x71\x30\x8b\x8e\xba\x2f\xb1\xc9\x0d\x1e\xe1\xaf\x4c\x64\xe2\x51\x78\x0c\x5d\x57\x04\xf4\xfc\x99\x98\x1b\x1d\x07\x06\x87\xad\x9f\x65\xc7\x46\xd1\x62\x36\xa0\x96\xb0\x84\xe0\xda\x5e\xc7\xe6\x1e\xaf\x9c\xd7\x4b\x90\xf9\x4f\xf0\x73\xe6\x40\x5c\x50\xf7\x68\xea\x11\x0f\xbf\x03\x96\x30\x8a\xdc\xbe\xa0\x57\xaa\x6a\x6e\xa9\x59\x5b\x76\x64\x56\x34\x93\x60\xc0\x56\x76\xd4\x37\x7e\x29\x19\x05\x25\xbb\x2a\x65\xa3\xb0\xba\xf7\x69\xcb\xc9\x9a\x83\x68\x44\x41\x9b\x15\xa7\xad\x42\xbb\x23\xb9\x12\x79\xc5\xa8\xb5\x64\x18\x9d\x1c\x2d\x21\x56\x92\x2f\xe5\x4a\x5b\x60\x5a\xde\xb2\x56\x9d\x8d\x15\xe2\x7b\xb0\x60\x65\x29\x31\x58\x56\xdb\x5b\xbc\xbc\xbe\x31\x84\x11\x7d\x63\x63\xa6\x98\xd8\x6c\x43\x14\xae\xbb\xf3\x5a\x50\x9d\xe9\x4d\x7a\x15\xbf\x46\x29\xa2\xd2\x7b\x5f\x48\xbe\x8d\x79\xb3\x37\x6d\x1e\x13\x8f\x66\x18\x53\x86\xb3\x69\x4c\xe5\x16\x23\xd4\x94\xb5\xb7\x25\x57\x3a\x17\xd6\xb7\x54\xc8\xa2\xb4\xc7\xc6\xf3\x80\xbc\xd7\x31\xf3\x3a\x6a\xde\xb4\x69\xd1\x8e\x2a\xab\x20\xa1\x6f\x9b\xed\x6c\x71\x9d\xa1\xfa\x52\xde\xaa\xbc\x8b\xb9\xd7\xd6\xa3\x97\xa3\x5f\xab\x05\x2b\xca\x50\xe0\x13\xce\x74\x58\xf6\x8f\x11\x2c\xcf\x7a\xd7\xf7\x12\xed\x72\x53\xb7\xdc\x7a\x48\xbc\x7a\xbc\x8e\x56\x20\xda\x69\xd6\x70\xa0\x0d\x12\x55\x3d\xba\xe4\x8d\x41\x84\x55\x26\x06\x98\x25\x66\xb6\x3a\x82\x0c\x4b\x4c\xd3\x0b\xfd\xd8\xce\xa9\xb7\x56\xc5\xe8\xf3\xcd\x40\xfd\x84\x26\x59\xe0\x74\x35\xc8\xcb\x4b\xe9\x02\x39\xd6\x46\x0d\xbd\xb1\x7a\x99\x45\x4b\xd5\xe1\xab\xf8\x87\x98\x0f\x93\xf9\x60\x36\xba\x36\x20\x0c\xd6\x06\x68\xd1\xf0\xa7\xa2\xc7\x8f\xd9\x96\xa7\xad\xba\xb7\x56\x99\x25\x11\x3b\x89\xb5\xe6\x6d\x33\x55\x50\x0b\xa5\xbe\xb8\x08\x46\xd5\x5e\x2f\x4f\xe4\x7e\x62\xaf\x24\xab\x17\xd8\xc2\xfc\x0d\x98\x79\x70\xca\x40\x9d\x2c\x0f\xc7\xf2\x15\x8c\x7a\x60\x84\xd7\xa3\x48\xad\x70\x66\x62\xd4\x25\x11\x75\x49\x16\x7f\xef\x18\x82\x74\x51\x6f\x20\x5a\x89\x41\x7c\x3b\x32\x2c\x61\x47\x6c\x76\x7d\x53\xa9\xdb\xd3\x25\x1d\xbc\x79\x59\x62\xb4\x70\x56\xb0\xd9\x5a\x83\xe5\x45\xfd\xad\x4c\x7e\x4d\x15\xe6\xaa\x20\xa3\xed\x7b\xf8\x65\xd3\x13\x38\x36\x78\x49\xdd\xb1\x44\xc3\x16\x3e\x4c\x9f\xcd\xf6\x59\xa1\x06\x35\xfc\x02\xb6\x81\x86\xce\xff\xc1\xe0\xe6\xab\x7d\x56\x51\xea\xae\x6e\xba\xc5\x2e\x62\xd7\x55\xaf\x28\x30\x95\x07\x89\x9b\x34\xaf\x88\x9c\x27\xbc\x5b\xd0\xe6\xc2\x10\x54\x8f\xba\xe6\xa4\x28\xb3\x14\x88\x88\xbd\x0f\x9e\x5a\x58\x68\x61\x2a\x43\x4e\x92\xfe\x6c\x3c\x4a\x66\xfe\x25\x62\xbe\xe1\x7c\x82\xb0\x09\xfe\x01\x32\x2d\x36\x47\xa7\x86\x5d\xbb\xf7\x90\x6e\xf6\xfa\xf2\x9b\x3e\x7a\xb8\x1d\x4f\xac\x8f\x44\xec\xd4\x7a\x31\x66\x8b\x70\x35\xce\x3e\x8d\x00\x8c\x15\xba\x1b\x0a\x7a\xf6\x83\x93\x8e\x95\x8c\x93\xe4\x73\x20\x53\x1e\x59\x0e\xbf\xed\x88\x8a\xff\xfa\x2d\x95\x7f\xa0\x03\xbc\xcd\xf4\x4b\x82\xa0\xd1\xba\x51\x6d\xd6\x28\xa3\x6d\x16\x22\x85\x19\x2b\x7f\x73\x21\x4d\x40\x87\xc0\x24\x2a\xd8\x60\x7a\xfd\xe5\xa4\xe7\xd7\xd1\x98\x8f\x0c\x25\x76\xd1\xe9\x7b\x38\xf3\xcf\x8c\x4b\x63\x44\x41\xd5\x99\x3e\x6e\xce\x4d\xb5\x6f\x32\x8b\x3f\x80\x70\x42\x0b\x99\x70\xcb\x0b\xd9\xac\x76\x9a\xf5\xe7\x26\xf2\xa1\x73\x50\x71\x4b\x01\x18\x19\xb5\xac\xe5\x95\xc7\x1e\x45\xb2\xcb\x3d\xe7\x21\xcd\x32\x2c\x1d\x65\x9e\xcd\x16\x24\xee\x69\xe7\x52\x67\x03\x1d\x5b\x03\x47\x1e\x5a\x3f\xea\xb6\x78\x4b\x51\x5c\x08\x0a\x44\x32\xb9\x76\xa7\x15\x5a\x8a\xe9\xb4\x86\x25\x85\x47\xd7\x07\xab\xe4\x8e\x04\x47\x1d\x49\xca\x51\xe1\xc8\x53\x58\x50\x87\xc8\xed\xf0\x20\x6c\x47\xc2\xf2\x40\x6e\x7d\x97\x90\x24\xb6\x69\x02\x24\x36\xc2\xa3\x26\x26\xdb\x8a\x58\x1e\x93\x9d\x6e\xe8\x06\x11\xc7\x1f\x7a\x50\x4e\x6a\x5a\x43\xd3\x5c\x6b\x1f\x45\x74\xb4\x86\xe7\x8c\xa9\x55\xb1\xb3\x41\x20\x53\xb3\x61\x6a\x61\xd2\x1c\x38\x67\x56\x99\x6c\xa6\xcb\x28\x10\xeb\x2a\xdf\x1f\xc4\x21\x78\xc9\x5a\xd2\x7f\xd7\x2a\x6e\x7c\xd8\xa2\x62\xd3\x62\x08\x53\x2a\x5f\x38\x4e\x4f\xe0\xb6\x33\x39\x23\xe8\xcc\x40\xbb\x09\xd0\x7d\x44\xbd\xa4\x24\xe6\x97\xfb\x52\x0f\x29\x62\xc1\x35\x11\x39\xc2\x2b\x39\x9e\x51\x22\x79\x34\xe0\xba\x5a\x7b\xa4\x95\xaa\x75\xcf\xef\xca\x62\x25\xd7\xfb\xb2\x79\xc3\x1e\xd1\xae\xcb\x3d\xbc\x94\xf6\x61\x27\x73\x91\xa5\x8a\x22\xb6\x6c\x2d\xb6\x42\x4b\x4d\x7e\x7c\x2b\x53\x85\x85\x81\xcb\x14\xe3\x32\x45\x5e\xaf\x4a\xa2\xb2\xaf\x9a\xf7\x45\x10\x8a\x5f\xe1\xac\xd3\x2b\x14\xd4\xb7\xec\x5b\x4c\xd4\x9a\x5c\x77\x27\xb5\x68\x94\xdf\xf3\xf6\xf6\x7a\x7d\xef\xa4\x96\xfe\xa6\x7a\x09\xdb\x65\x88\x26\xf7\xd8\xcb\xfc\xb6\xd5\xc0\x28\x72\x85\xb5\x5d\xcd\xa6\xaa\x61\xea\xbc\x0b\x33\xf4\xf5\x80\x00\xa3\x0f\x01\x45\x8b\xa2\x71\xe6\xc4\x17\x4e\x31\x46\x6f\xa5\x5d\xe1\x74\x44\x3d\x31\xfc\xd4\xab\xd8\x84\x15\x26\xc9\xe7\x95\x56\x9a\x97\xba\x90\xf7\x0f\x3d\x22\xe4\x30\xd0\xa3\x81\xe6\xb5\x5e\x43\x9b\x1d\x64\x0b\xa6\x1f\x33\xe6\x5c\xf5\x47\x6b\x35\x7d\x07\x6a\x52\x1d\x6c\xc1\xb8\x16\x3f\xc6\x9c\xb8\xdb\x3c\xbc\x1e\x3e\xe9\x5f\x25\x31\x52\x4d\x19\xa0\xcc\x7a\x0a\x25\x44\xc8\x0c\x6a\x00\x83\x2a\x48\x0b\x9d\xc9\x1c\x74\x66\x8b\x18\xb4\x50\xc9\x4d\x3c\xcd\x46\xec\xd0\x54\xcb\x1d\xc1\xd2\xb4\x55\x53\x2f\x63\xcb\xd6\x37\x4b\x06\xd3\x8f\x88\x5b\xa5\xe7\xdb\x02\x3d\x62\x4a\xa9\x14\x42\xc6\x48\x05\xe0\xa6\xa1\xed\xde\xd1\x74\xd5\x42\xe2\xab\x18\x4e\x37\x2d\x72\x91\xf1\x7b\x91\xed\xd1\x9f\xbc\x93\xd9\x8e\xff\xb2\x57\x55\xba\x21\xc7\x37\xdd\xca\x88\x6f\x8b\x5c\xe2\xf9\xc4\xa6\x69\x9e\xe6\xf7\x52\xa1\x70\x66\x7a\x92\x75\x87\x0d\x17\xa3\xeb\x3c\x6d\x85\x0d\xb7\x07\x08\x23\xac\xed\x48\x09\xff\xa0\xe2\xf8\x41\xf8\x90\x11\xe7\x03\x10\x1b\x00\x13\xab\xb7\x98\x47\x98\xfc\xa8\xf4\xc0\x1c\x9b\x7d\x88\x0b\xb8\x60\xae\x2d\x8f\x58\xaa\x78\x26\xf6\xf9\xea\x0e\x9d\xc2\x72\x0f\x29\x6f\x47\xfe\x42\x0d\x87\x47\x40\xc4\xbe\x53\xfe\xae\xb1\x34\x07\x46\x61\x97\x5d\x2e\x56\xab\x7d\x49\x0d\x3d\xfd\x85\x0b\xa5\x8f\x26\x97\xd3\xd9\x15\xa2\x76\xf4\xb0\x1a\xad\xef\xed\xfe\xc8\x3d\x87\xb5\x14\x04\xf1\x46\x41\x10\xfa\xbb\xb5\xe4\x44\xdc\x61\xb1\x74\xb5\xf3\x61\x3f\x17\x00\xda\x1d\x2c\x5f\x4a\x6d\xf7\xac\x5c\x81\x74\x30\xf3\x8f\xac\xbf\xad\x28\xff\xbc\x94\xdc\xf1\x7d\x6d\x76\x19\x1e\xdd\x57\xc3\x21\x7d\x64\x73\x63\x9f\xbb\x0e\xa9\xea\x8c\xd5\xb5\x01\x5b\xc5\xa6\xcf\x9b\x97\x2f\xc2\x87\x6c\x8a\x23\x71\x09\x23\x94\x68\xd2\x41\x3b\x4c\xe1\x3a\x55\x3d\x07\x25\x82\x80\x11\xb3\x39\x3f\x57\x8e\xd3\xb1\xf3\x08\xef\x24\x1a\x74\x50\x35\x94\x10\x1f\x5d\xb8\x15\x9a\x0e\xf0\x23\xf8\x43\x51\xc2\x21\x2f\x72\xc9\x77\x77\xa5\x36\xa1\x4e\xf5\x04\xe4\xd7\x95\x94\xf0\xb0\xb3\x97\xf0\x21\xd5\xfb\x00\x40\x4e\xfa\x83\xeb\xf4\x36\xad\x44\x46\x48\xe0\x58\x26\xbf\xbb\x03\x68\xe1\x3a\x9f\x6c\x88\x5e\x01\x08\x81\x6b\xfd\xde\x9b\xd9\xb8\x9e\xf4\x68\xdc\x06\x90\x9a\x73\xdb\x77\xd8\x1a\x9e\xe0\x18\x9e\x88\x28\x3e\xd1\xb1\x66\x9e\xfa\x66\x01\xd6\x51\x67\xa4\x82\x1f\x8f\x54\xb8\x7d\x65\x6e\x5f\x61\x4f\xbb\x46\xd0\xbd\x15\xe4\xcc\x26\xb5\x96\xee\xd5\xaf\x79\xf1\x90\xc9\xf5\xad\x6b\x64\xc8\xfc\x02\x63\x6e\xd8\xef\xe1\x47\x6a\x48\x64\x58\x60\x8c\x6c\x41\x16\x5f\xcb\xd4\xa8\x1e\x9d\x77\xa3\xb8\xb1\xa5\x5c\xc7\xc2\x99\xdb\x7e\x72\xbf\x50\xb9\x4b\x7e\x68\x33\x1b\x08\xb9\xc0\xb8\x24\x75\x6d\x4f\x88\xc7\xb8\x73\x0c\x95\xd1\x60\x65\xb0\x55\x5a\xae\xf6\x5b\x4c\x0d\x28\x8f\xd3\xca\xe1\x8a\x2f\x0f\x3c\x13\x0f\xa6\x9f\xda\x2b\x7c\x76\x06\x5c\x00\xbb\xc9\xd8\x2b\xc0\x7d\xea\xc2\xd5\x80\x4e\x71\xe7\x02\x42\xad\x96\xdb\x64\x38\xf3\x0a\x3c\x0c\xbb\xe0\xcc\x16\x05\xd7\x17\xb9\xb1\x0e\x55\x61\x65\x2b\x5e\x5b\x88\xb5\xd0\x4a\x78\xaf\x65\xb5\xd7\x96\x81\x77\xdd\x0c\x18\xc7\x10\x1d\xb1\x83\xe3\xb5\xd1\x30\x27\xb6\xbd\x25\xdc\x97\x3b\xc0\x4a\xa9\x0a\xe2\x4c\x8b\xf8\xbd\x28\x0f\x11\xcf\xf7\x19\xa0\xd5\xe9\x41\x6c\x25\x65\x93\x40\xfa\x44\xcc\xcb\x38\x82\x08\xf5\x7b\x5e\xbc\x33\x88\xf5\xe6\x8d\x1c\xd2\x7d\x91\xae\x4d\x48\x92\xa1\x0f\xe1\x27\x86\x96\xb0\x16\x79\xa1\x6f\x1d\x02\x07\xca\xcd\x46\xae\x2a\x34\xb0\x5e\xc7\x7c\x30\xbd\xba\x4a\x66\x83\x11\xe5\x4a\x01\xd5\x77\x32\x4c\xae\x26\xa3\xc5\x17\x6b\x85\xbd\x46\x94\x0f\xfb\x49\x43\x87\x0c\xd5\xa4\x5e\xdc\xfd\xc4\xfb\x8c\x03\x9c\xea\xd5\x8a\x4c\xb1\x74\x0f\x0b\x12\x0b\xcb\x16\xc3\xa8\x0a\xc4\x6f\xf3\x21\x7a\x19\x6d\x9b\xad\xe5\x16\x70\x1a\x81\x9c\xc2\xf4\xb5\xf8\xee\x69\x28\x0d\xd9\x89\x19\x23\x56\x9b\xfa\xc9\x05\x34\x71\x3d\xd5\x12\x16\xfd\xfb\x2d\x99\x90\x69\x1c\x38\x30\xfb\x30\xbd\xb2\x2e\xb8\xa2\x66\x30\x83\xb3\xd4\xf6\x59\xca\x5f\x13\xdc\x0d\xc3\x6a\x75\xad\xcc\xe9\x57\xc6\x9f\x6c\x9a\xde\xbe\xa4\xc4\x05\x6b\x7b\x3e\xda\x32\x10\x9f\x48\x89\x52\x0c\x6b\x60\x6c\xcc\xe7\xc9\x2b\xea\x1d\xc6\x53\xd5\xe3\xa9\xfa\x5e\xc0\x6d\xda\x48\x02\x73\x68\x5d\x0b\xa8\x13\x8b\x79\xdf\x05\x01\xb6\xe2\xd0\xbe\x6c\x48\xfd\x7a\xe0\x73\x14\xbe\xa8\xd6\x65\x7e\xa0\x26\x4a\x2d\x09\x1b\x62\xb3\x8e\x1a\xd1\x4c\xb9\x63\x0f\xb5\x2a\x5c\xc0\xc0\xd4\xf9\x5a\xc1\x4a\xd8\x8b\xed\xb9\xe7\xce\x10\x94\xe7\x1a\xbe\x8e\xcf\x5c\xe7\xd7\x3a\xdd\xa6\x79\xaa\xee\x58\xfd\x0d\x5d\xd0\x24\x2e\x61\xd3\x52\xa7\x0f\xdf\xb6\x0b\xcf\x2c\xa7\x41\xdb\x52\xab\xd0\x8d\xa3\xf6\xf1\x46\xe0\x0f\x9f\xc1\x1a\xb5\x59\xc7\xd7\x31\xb2\xcc\x0f\x8d\xa2\x40\xe6\xa3\xa2\x58\xd7\xda\x38\x54\x96\xd5\x29\xa8\xe9\x42\xc9\xd3\xac\xc9\x62\x9d\x35\x59\xdd\xc3\x0b\x2a\xcf\xfc\x04\x1f\x11\x20\xf7\x7a\x9e\xb4\x3a\x8f\x03\x21\x36\x68\x61\xa3\x28\x4a\x15\x80\x9a\x42\x12\x03\x20\x63\xcd\x09\x08\x9b\xa6\xb4\xc5\x0d\x5a\xdd\x6b\x67\x36\xac\x17\x4a\xdb\xce\x2a\xcd\xa5\x42\xf8\x91\x5c\x96\xca\xd6\x5b\x67\xe9\xaf\x32\xe6\x9f\xef\x50\x5f\x04\x08\xe5\x0c\x0c\xe9\x35\x6a\xb1\x8d\x58\xe9\xf7\x38\xde\x67\x3b\xe6\xbd\x03\x5c\xae\xb9\xd1\xfa\x57\x7e\xff\xdf\xc3\x5d\xe1\x93\x3b\x75\x64\x72\x41\x95\x79\xcf\x77\x94\x51\x1b\x09\x65\x76\x88\x71\xce\x50\xbc\x21\x1b\xb3\xc8\x73\xcb\x3d\x6d\x6f\x01\xa5\x97\x77\x05\x54\x1a\x8a\xcc\x93\xcc\x96\xea\x2a\x94\xac\xda\x7d\x40\x17\x80\xba\xe0\x7c\x69\x17\x34\x9c\x3f\x69\xc8\xcc\x0e\x59\xbf\x0e\x19\x13\x7d\xe9\x42\xd8\x62\xfe\x4b\x02\x1d\xe5\x03\x1c\xf7\x98\xe9\x19\xa4\xe6\x57\x2d\x98\x36\xa8\xab\xd7\x46\x5c\x6e\x0e\x5c\x2b\x86\x0e\x59\xdd\x51\x96\x16\xa4\x3c\x20\xe3\x41\x87\xf3\x72\x94\x18\x40\xae\x1e\x17\xb7\x22\xcd\x15\x3a\x36\x59\xa1\xa0\x75\x99\x02\x8f\x0c\xc3\x6d\xaa\xaa\x69\x39\x7e\x32\x9e\xce\xe7\xa0\xe2\x44\x89\x1d\x93\x08\x92\x07\xdd\x9d\x91\xb6\xe2\xd4\x3e\xad\x3c\x76\x5a\x86\x80\x92\x82\xea\x30\xfc\xfe\xcf\xa0\x5e\xd8\x0c\x06\xcd\x49\x9c\x7a\x2a\x4d\x1d\x0b\x5e\x7a\xb2\x36\x30\x35\x6c\xb3\x60\x62\x45\x5d\xa0\x64\x94\x2a\x5b\xc9\xe4\xdd\xc2\x70\xd7\xb5\x91\x93\x53\xd1\x12\xd2\xf9\x55\xaa\xd1\xa5\xf5\xdc\xd3\x1c\x1c\x8d\xe0\x1d\xae\xd5\xdd\x1c\x13\x8c\x14\xf8\xc6\x84\xa9\xa5\xa2\x94\x07\x33\x74\x5e\x7e\x4d\x36\xf5\xd0\x16\x25\x1f\xc3\x76\x51\xab\x2b\x52\x76\x01\x36\x24\xf6\x22\x22\xc4\xa4\xbc\x25\x88\x48\xd3\xa3\xc8\xac\xe9\xef\x37\xd8\x42\x4f\x95\xa5\x5e\x22\x90\xe3\xc8\x40\x1c\x87\xdb\xa0\xd5\x3e\x78\xb3\x10\xa5\xda\x55\xc0\x4c\x67\x43\x52\xdd\xcb\x6d\x22\x51\x16\x33\x41\x4f\x84\xe0\xe7\x97\x3d\x86\xed\xa6\x47\x1e\xe1\xb0\x2b\x89\xea\xae\x78\xa1\x67\x62\xe9\xf8\xc2\xaf\xb2\xf0\xed\x11\x19\xe6\x1b\xac\xaf\x30\xa6\xb0\x5e\x3a\xb9\xd6\x2e\x46\x45\xe6\x7e\x2e\x6f\x8b\x2a\x25\xae\x49\xca\x3d\xdb\x15\x60\xb4\x02\xe2\x40\x65\xa4\xe9\x4e\xbf\x3e\xa8\x11\xd1\xb3\xe2\x18\xc6\x03\xfb\x4b\x7e\xdd\xb9\xc8\xe9\x9b\x98\xff\x94\xcc\xe6\x2d\x7d\x52\x56\x8d\xbc\xd1\x46\xef\x24\xf9\x6c\x3f\x48\xe1\xd4\xae\xb8\x05\x34\x56\xaa\x3b\x4c\x27\x63\xc5\xd4\xf7\x40\xcf\xfb\x60\xd8\x26\xea\xc9\x5f\x8a\xbb\x01\x64\x13\x1a\x4e\x31\xba\xb1\x86\x8a\xe2\x81\x78\x9b\x6f\xd3\x7b\x28\x81\xd7\x97\x22\xcd\x6f\xf7\xa9\x82\x2e\x5b\xf3\xb1\x7c\xbf\x5d\x02\x57\xa4\x19\xf8\x79\xcc\x93\xcb\xcb\x64\xb0\xd0\x73\xab\x4d\x61\x9a\xaf\x3a\xa2\xb7\x6d\x50\xed\x96\x36\x9e\x66\x87\x17\xbd\x0d\xb1\xd9\x64\x7d\xbd\xb2\xde\xfb\x90\xea\xca\x1a\x43\xb5\x22\x25\x70\x0c\x4c\x35\x48\x9a\x63\xe9\x2f\x91\x6f\x39\x70\x10\xcf\xb0\x12\x95\x79\xb4\x67\xaa\x83\x3a\x71\x36\xb1\x57\x3d\xd8\x5a\xbf\xda\xf6\x64\x3c\x3b\x36\x2a\x46\xef\xa8\xd5\xcc\x85\x2b\xd1\xe9\x6f\x43\x10\xc4\xc6\x55\xd7\x50\x86\xb5\x61\xd4\xaf\x03\xb2\x05\xe9\x26\xa2\x5a\x51\x22\x56\xdb\xd4\x52\xc3\xe1\xdc\xdd\x10\x99\x3b\x28\x21\xd0\x0a\xd4\x04\x62\x62\xcd\x62\xbe\x55\x44\xab\x88\xc5\x66\xb4\x2f\x0e\xc2\x8d\x3d\x60\x95\x2e\xf5\x07\xbb\x20\xad\xfd\x15\xd9\x69\x50\x82\xa3\x7f\x1d\xb2\xa5\xfa\xf0\x70\x69\x7e\xcb\x68\x71\xdc\xcc\x5a\x84\x70\x63\x57\x62\x3e\x21\x5f\xcd\x41\xe6\x77\xc5\x0a\x0d\x84\xa5\xb5\x3d\x89\xa6\xdc\x2d\x58\x9d\x2a\xa4\x56\xb9\x05\xf7\xe5\x6d\xec\x81\x62\xe8\xeb\x42\x24\x5a\xce\xf9\x7d\xab\xe5\x00\xf5\x6a\x87\x00\x1a\xc9\xcf\x83\xe4\x7a\xc1\xfb\x73\xc3\xe1\x35\xfe\xc2\xe7\xc9\x82\x5f\x4e\x67\x8b\x4f\x7c\x34\x09\x38\x6e\xa2\x16\xda\x1d\x8f\xfa\x87\x19\xea\x1f\x8f\x62\x67\x3a\xe1\xfd\x89\xe5\x0d\xbb\xe8\xcf\x47\xf3\x28\xa0\x0e\x9b\x25\xfa\xb5\xc9\xc4\x90\x81\x99\xb1\x47\xec\xe3\x4d\x5f\xff\x57\x92\x44\xbc\x3f\x9f\xdf\xcc\x90\xc2\x67\xc6\x07\xd3\xc9\xd0\xe6\x4f\xf4\x23\xfe\x3c\x9a\x0c\x23\x9e\x8c\x80\xbc\x87\xa6\x91\x0c\x3d\x32\xb2\x47\x19\xc8\x7c\xd6\x31\xef\x05\x28\x57\x47\x8b\x71\x12\xf1\xc9\x74\xf2\x62\x34\xb9\x9c\x8d\x26\x88\x45\x12\x31\x43\x4e\xd6\x27\x72\xb2\xe9\x8c\x3f\x81\x9b\xec\x53\xc2\x93\xc9\x62\x34\x4b\xf8\x6c\x34\xff\xb3\x5e\xf8\xc5\x14\x18\x95\xfe\xe5\xa6\x6f\x38\xce\xf8\x75\x32\x83\x2c\x80\x25\x2d\x6a\x59\x75\x3d\x0f\x17\xa1\x88\xf9\xfc\xd3\xf4\x66\x3c\x64\x7a\x41\xc2\xcf\xea\xed\x01\xe6\xa1\x64\x00\xfc\x4b\xa3\x09\x2d\xfc\xfc\x3a\x19\x2c\x22\xf7\x0c\x7e\x3a\x99\x2e\x90\x8d\x0d\xb3\x52\xcc\xcb\x4a\xe9\xe9\xe9\xaf\xb5\x03\x0b\xf6\x60\x8b\xae\x12\x24\x48\x1a\x4c\xe7\x0b\xb3\x39\x93\x64\x90\xcc\xe7\xfd\xd9\x17\x86\xd1\x0c\xd8\x83\x59\x72\xdd\x1f\xcd\x70\xad\x67\xb3\x04\xc8\x22\x88\x76\x6e\x30\xee\xdf\xcc\x13\x9f\xcd\x49\x1f\x20\xbd\xa3\x13\x48\x94\xe9\x45\x65\x0d\xee\xa5\xc9\xd4\x24\x10\x9b\xf3\x1f\xcd\x79\xff\x66\xf1\x69\x3a\x1b\xfd\xff\xc9\x90\x7f\x4a\x66\x09\x9e\x53\x3c\xfa\x6d\x87\xd6\x9e\x96\x96\xc3\x82\x9f\x0c\xee\x90\xb9\x63\xe7\x00\x25\x71\x3d\x9d\xcc\x0d\x5f\xdd\xf4\xd2\xad\xee\xdc\x34\xdb\x78\xe2\x04\x51\x3d\xb2\x83\xf3\xd3\xd0\x8b\xb5\x54\x42\x26\xdb\x26\x76\xda\xd4\x2a\x53\x51\x49\x70\xd1\x8a\x0d\x33\x0d\x8f\xeb\x47\xb0\x2e\xd0\x40\x21\x10\x11\x2d\x54\xcb\x54\xfd\xaa\x3c\xd4\x6f\x67\xb0\x12\x6c\x09\xb8\x6a\x54\x41\xd1\x4c\xdb\xfa\x81\x00\x93\x6e\x81\x40\x00\x16\x8c\xa3\x38\x53\xbf\x9a\x04\xbb\xc2\x92\x54\x93\x8e\x91\x65\x59\x68\x67\x13\xd4\x43\xea\x4a\x21\x3d\x39\xa7\x4d\xfe\x88\x0a\x16\x88\xbf\x56\x3b\x13\x86\xc2\x24\xf2\x18\x6b\x91\x51\x1b\x78\x50\xd0\x8e\xdb\xe7\x01\xc6\x96\x69\xcb\x28\xf7\x3b\x13\x96\x40\x33\x8f\xd8\xbf\x39\xe7\xef\x62\xe0\xf3\x1a\x4d\x0c\xfe\xc7\x3b\x2d\x2b\x5b\xaa\xb4\xad\x66\xdf\xe7\x55\x9a\xd9\x62\x10\x2c\x5b\x69\xab\xec\xa4\xa8\x33\x05\x6c\x2c\xd6\xc6\x3b\x38\x27\x2d\xe6\x03\x08\x78\xf3\xd4\x5a\x0d\x6f\xc0\xc1\xeb\xa5\x8e\xe0\x79\xaf\xc2\xf1\x3e\x21\x52\x43\x9b\xdb\xc0\xa0\x81\x8a\x7f\xdf\xfc\xf1\x42\x77\x60\xc8\xb9\xf1\x85\x43\x32\x0d\x57\x5e\x2b\x08\x31\xa0\x57\xb2\xd4\x5a\x6f\x59\x82\xfb\x18\x7a\x41\xad\x81\x26\xd8\xc7\x8d\x48\x33\x30\x7c\x00\xdc\x06\x1e\x4d\x4f\xa0\xb0\x7a\x1d\x1d\xa3\xd8\x60\x8f\x00\xdc\x89\x07\xe1\xe2\xe7\xf8\xb5\x98\x7f\x3e\x0a\x6e\x83\x21\xfe\xfa\x68\x9b\x20\x6b\x34\x7e\x3d\x70\x16\x84\x3c\xcd\xe0\xf1\xbe\x60\x90\xa1\xf6\xdd\xd4\x2d\x78\x0d\x32\xa6\x11\xe5\xb2\x27\x8e\x3a\x75\x21\x7c\xd1\x58\xc9\x5a\x31\xc5\xbb\xf8\x75\xcc\x6f\x00\xc0\xcf\x14\x2a\x79\xdc\xa3\x1e\xf5\x46\x51\x36\x8d\xad\xd6\x4d\x67\x1b\xdb\xa0\x2c\xa0\xa1\x06\xc5\x47\xfb\xd9\xa1\xfb\x67\x63\x96\xc1\xb2\x54\x05\xab\x55\xff\xe1\x14\xed\x79\xaa\x61\x08\x3a\x94\x5e\xd5\x5a\xb0\xc6\x70\x85\x1f\x24\x14\xda\xcb\xfb\x14\xfb\x47\xd1\x1f\xcd\x0e\x76\x74\xcd\x1d\x6c\xab\xec\x64\x47\x2a\x3b\xa7\xfe\x3c\x4e\x28\x90\xc2\x77\xd9\xbe\x14\x59\x54\xfb\xb3\x3a\xe9\x51\x31\x99\xda\x97\xf7\xa6\x51\x1f\x21\x35\xba\xb7\xe4\xf8\x7d\x65\x47\xca\xd9\x70\x2e\xf0\xfc\x70\x1c\x5c\xa8\x30\xd5\x25\xd3\xd2\x6c\xb7\xb6\x93\x6d\x17\xcb\x79\xc4\x5f\x45\xfc\x75\xc4\xdf\x44\xfc\x6d\xc4\xdf\xc1\x2b\x7e\x88\xf8\x76\xaf\xdf\xae\xe0\xff\xf3\x75\xaa\x10\x41\x40\x15\x1c\xf8\xbc\x8d\xd5\xea\x1e\xe8\xf6\x4b\x2a\x7e\x9a\xc6\x32\x6e\xa4\x28\x7a\xa6\xa1\x1e\x7b\xb1\x03\xe9\xef\x0b\x03\x53\x54\xd4\xac\xbb\x6d\xdc\xad\xe0\xad\x16\x8c\xd1\x5e\xac\x66\xf6\x12\x33\x62\xb5\xbd\x68\x5b\x3f\x9b\x79\xf2\x11\x80\xeb\xcb\x68\xe3\xea\xef\x9a\x0b\x16\xf3\x6b\x97\x14\x84\x21\x47\xe4\x6b\xa5\x25\xc3\x0c\x5f\x14\xc0\x0c\xe8\x93\x07\x69\x2d\xbe\x94\x87\x82\x02\xaf\xc7\x2e\x32\xf6\x0c\xd3\x41\x83\xeb\xff\x86\xae\xbf\x68\xce\xf1\x99\x22\x80\x79\x72\xdf\x9e\x95\xd7\xf1\x59\xc4\x5f\xc7\xe7\x91\x76\x27\xf4\xff\x9c\x47\xfc\x5d\xfc\x5a\xff\xcf\x9b\x88\xff\xa0\x7f\x07\xa7\x47\xff\xbe\x2a\x6e\xa5\x85\xc0\x66\x7a\x2d\xbd\x1c\x69\x7d\x3c\xb9\x5c\x49\xa5\x80\xab\x9d\x4a\x92\x2d\x0b\xbe\xb0\x8e\x99\xcc\x21\xfd\x07\x89\x4b\xbd\x69\x62\x2b\x4d\x0b\x9f\x97\xde\xa5\x6b\x57\xbf\x72\xa8\xea\x7f\x88\x7d\x3b\x6e\x7a\xc9\xc7\x23\xb2\xdd\x81\xf2\xfa\x2c\xd6\xa6\xf1\x64\xca\x93\x9f\xb4\x75\x3b\xff\xd4\x1f\x8f\xc1\x9c\x6c\x2f\xd3\x8a\x80\x3a\x54\x9b\xc3\xa3\xe1\xa8\x3f\x1b\x25\xf3\x08\x6c\xe4\xcb\xcb\xd1\x78\xd4\x5f\x24\xf3\x88\x91\xc9\xac\xbf\xbf\x00\xcf\x62\xf1\x29\x19\xcd\x8c\xe5\xad\x6d\xf1\xe9\xe5\xe5\x68\x90\xcc\xe6\x11\x1f\x8e\xb4\x1d\x3c\xd5\xff\x99\x5c\x5d\x8f\xa7\x5f\x12\xfd\xc0\xfe\x64\xf8\xbd\x7e\xca\x47\x6d\x40\xb2\xd3\x3e\xd9\xd7\xfd\x79\xc2\xaf\xfa\x5f\xf8\x45\xd2\x8b\xf8\xa7\xfe\x4f\x09\x99\xbd\xc6\x15\xb9\xa4\x37\xe3\x43\xf9\xb0\x7f\xd5\xff\xa8\x1f\x37\x9a\xe0\x6f\x98\xfd\xcd\xf5\x8d\x9e\x99\xf6\x0f\xdc\x67\x06\xa3\xa1\xf6\xc7\xc6\xee\x77\x7a\xbc\x23\xff\x17\xc9\xcf\x7a\x90\xda\xaa\xb7\xbf\xd2\x16\x3b\x3a\x06\xde\x27\x8d\xd7\x30\x05\xdf\xcc\xfc\xf2\xf3\xa7\xfe\x62\x3e\x4d\x7e\x4a\x66\xfc\xd4\xda\xda\xac\xc5\xd6\x1e\x4f\xe7\xe0\x83\x01\x25\xec\xb0\xbf\xe8\xeb\xe7\x5d\xcf\xa6\x97\xa3\x05\xad\xb6\x7d\x36\x7c\xb4\x3f\x1b\xcd\xf5\xa3\xf4\x63\xa6\x97\xe0\x01\xa2\xb3\xf3\xb9\xaf\x1d\x9e\x31\x90\x1e\x2e\xa6\xb0\x88\xf0\xcc\xd1\xc4\x2c\xd9\x62\x8a\xbf\xb9\x99\x78\xce\x82\xfe\x0d\xf3\x9c\xb1\x08\xb9\x61\x27\x2f\x1e\x75\xd0\x68\x6c\xda\x5b\xd1\x7f\x9d\x25\x30\x1c\x70\xf4\xc0\x5d\x9e\xd3\x11\xd4\x4e\x63\x7f\x34\xbe\x99\x25\x7a\x04\xe4\x49\xf3\xf9\xcd\xf5\xf5\x74\xb6\xb0\x49\xea\x08\x0f\x4f\x7f\xa1\xcf\xce\xcd\x78\x01\x78\xef\x2c\x99\xcd\xe0\xbc\xa0\x6b\xa7\x3f\x74\x35\x9a\x43\x8c\x4c\xff\x6e\xdc\xff\x02\xed\xfe\xd3\xeb\x64\xd6\x37\x34\xba\x8b\x59\x7f\x32\xa7\x4f\x85\x0b\xc8\xcc\x30\xa6\x97\xbe\xfb\xa9\xcf\xd7\xf4\x33\x6c\xd5\xa0\x0f\xad\xdc\xda\x3f\x9d\xe2\xaa\x2e\x3e\x25\xd3\xd9\x97\xe0\x26\x59\x16\x5d\x36\x9a\xe0\x6d\xe9\x6b\x1f\x73\xbe\x98\x8d\x06\x0b\xff\x63\x7a\x30\x7a\x8a\xee\x00\xf0\x49\xf2\x71\x3c\xfa\x98\x90\x9b\x0f\xa3\xfa\x3c\x9a\x27\x3d\xfd\x28\xd8\x3c\x70\xbf\xa6\x30\x6c\xdc\x68\x7f\x7b\x69\xcf\xc3\xe8\xc3\xcc\x6c\x75\x9d\x43\x98\x75\xed\x1a\x38\xe8\x3f\x27\xb3\xc1\xc8\xf9\x93\x40\x0c\x32\xe7\x1f\x21\x1c\xe1\xb9\x90\x11\x88\x0a\x36\xba\xe4\xfd\xe1\x4f\x23\x88\x39\xe0\x53\xaf\xa7\x73\xdf\x07\x9c\xdf\x0c\x3e\x99\xc3\x1f\x9b\x11\xb6\x0a\x22\x86\x52\x47\xfb\xe1\xfd\xeb\xeb\x31\x1c\xcb\xf0\x5a\x0f\x93\xfe\xe2\x13\x5c\x03\x20\xdf\xea\x8f\xf9\x68\xf2\xcf\x37\xb3\x2f\x74\x32\xf4\xa2\x00\x19\x00\xb0\x17\x43\x62\xe6\xbb\xb9\xbf\xb2\x74\xfa\x93\x9f\x81\x3f\x40\xbf\x64\x34\x00\x78\xab\x71\xff\xb3\x3e\x7f\x9f\x46\x17\x28\xd7\x06\x9f\xbc\x41\xc6\xec\xc9\xce\x79\x93\x18\xb9\xdd\x39\x67\x4f\x70\xce\xf9\x33\x9d\x73\xa2\xa6\x36\x3f\xce\x5b\x42\x59\x73\x8c\x36\x68\x7d\x05\x52\x1f\xd0\xc7\x9e\x15\x03\x4b\xfa\x03\x2f\xf0\xc2\xed\x8e\xb1\x23\x82\xd8\xca\xcb\x88\x02\x4c\x2d\xa2\xf2\x51\x51\xb8\x30\xa2\xef\xd9\x97\x92\x19\x6a\xeb\xdf\xf1\x52\x1e\xbb\x82\xad\x57\xae\x4b\x50\xb2\xe7\x5f\x39\x7e\xf4\xca\xb1\x67\x5d\x39\x7e\xec\xca\xb1\xe7\x5e\x39\xde\x79\xe5\xd8\xb3\xaf\x9c\xb6\x59\x7e\x8c\xb9\xe3\x56\xd5\x9f\xd7\x3b\x3d\x4e\x3e\xf6\xc7\xbc\x3f\xa0\x8f\xfd\xd8\x11\xb1\x58\xca\xa0\xbb\x99\x1a\x1e\x54\x55\xee\x3b\x83\x16\x2c\x13\x0f\x36\xc5\xf3\x11\xbe\xac\xdd\x92\x7f\xf6\x49\xa4\x1b\x3c\x4b\xaf\xea\x6c\x00\xe4\x6a\x97\xf2\x56\x94\x6b\x03\x82\xb2\x2a\xf2\x4d\x96\x22\x22\x4e\x26\x1e\x3c\x83\x10\x22\xe6\x3b\x9b\x0d\x5b\x12\x4e\x8e\x9f\xe7\x6d\x63\xed\x73\x45\x19\x45\x2e\xf9\x41\x8a\xd2\xc7\xdb\x14\x5e\xc9\x81\xa0\x81\x97\x85\x76\x94\x21\x08\x87\xaf\x7b\x10\xc0\x13\xa0\x87\x47\x5e\x83\x6d\xb6\x02\x8b\xf8\x97\x7d\x79\xe0\x15\xb8\xdd\x94\x97\xcb\xd2\xca\x54\xba\x51\xbe\xba\x65\x68\x7a\x42\x95\xa9\xc0\x3f\xba\x96\x06\x99\x86\x96\x94\x75\x2d\xa9\x85\x7e\xe8\x78\x8e\xdd\x70\xa8\xea\xac\x44\x05\x1c\xe0\x13\xf9\xc0\xbf\x60\xb7\xcc\x8f\x5a\xd0\x2d\x08\x9b\xa3\x7a\x6c\x8b\x3d\x3c\x11\x9f\x98\x17\xea\xab\x19\xd5\x06\x53\xf5\x67\xf8\x77\xa8\x28\xa9\xa8\xf8\x04\x62\x93\x96\x13\x5d\x3f\x71\x9d\xaa\x1d\x20\x96\xc3\x59\xc4\x14\xbf\x05\xf1\x02\x0f\xd3\x90\xa6\x7b\x89\x1a\xed\x1f\xff\x42\x34\xb3\xb6\x9e\xa0\x86\xd2\xbc\x2c\xaa\x3b\x2e\x2a\x66\x58\xcf\xb5\x37\xf5\xef\x7b\x60\x9c\x34\x65\x05\xda\x17\x46\x32\x5f\xda\xca\x07\x71\x08\xf2\xdd\x81\x4f\xce\x8e\xf9\xe4\x98\xf0\x82\xf3\x09\xaf\x00\x04\x3f\xf8\x2f\x28\x45\x06\xf6\x5c\xcf\x67\xb1\x85\x69\xf5\x9a\x2d\xef\x24\xd6\xde\x6f\xc0\x9f\xd3\xb2\x94\xf7\xc5\x0a\xca\xd1\x45\x55\x15\x25\x40\x83\x30\x02\x7f\x94\x3b\x02\x26\x0f\x48\xde\x2d\xe3\xe3\x13\x36\x7a\x53\x94\x18\x5d\x83\xba\x4f\x05\x6d\xb5\x3f\xc6\xaf\x62\x9e\xb4\xa1\x06\x1b\x80\x73\x2e\x33\x25\xb1\x3b\xdf\x40\x9d\x53\x53\x80\xbc\xf7\xa2\x64\x74\x75\xb1\xa9\x86\x6a\xc9\xeb\x78\xdd\x61\xad\x86\xc8\x31\x6a\xd0\x72\xdb\xb5\x70\xda\x95\xf2\x5e\xa4\x19\x70\x9b\x84\x68\x24\xb6\x9f\x13\x88\x2c\x56\x7a\xb2\x1c\x43\x68\x8a\xe2\x26\x94\x3a\x57\xb5\x1a\xf9\x8d\xc4\xde\x25\x28\x31\x81\x05\x96\x07\x88\x5c\x22\xc0\xd2\xca\xd4\xb4\x7a\x33\xb0\x7f\xdc\x16\x7b\x2c\x67\xd3\x63\x83\xe5\xc6\x12\xac\xf5\x2f\xfb\xf5\xad\xf4\xc0\x80\x89\xb3\xfe\x65\xcc\xaf\x46\xf3\x41\x32\x1e\xf7\x27\xc9\xf4\x66\x1e\x33\x76\xf6\x12\x65\x77\xad\x74\x63\xab\xf7\xa2\xc1\x4e\x8b\x50\x0e\xe4\x22\x2f\x65\x2e\x37\x69\x55\x67\x31\xa9\x23\xdb\xb7\xe0\x7e\xd4\x89\xc3\xfc\x2a\x73\x87\x9c\x7f\xbc\x4f\xcc\xe3\xbe\xa9\xc5\x79\x60\x09\xe8\xe0\xbb\xb8\x0e\x95\xff\x58\x70\xd1\x46\xcc\xd7\xab\x1c\xb2\x8f\xc2\xf5\x39\xaf\xe9\x36\x5b\x5d\x6c\x79\x0f\x10\x86\xd2\x02\x8e\xe8\xf7\xac\xe8\xb0\x9b\x1a\xbf\xad\xa8\x2a\x59\x32\x0b\xa5\x07\x99\xde\x9d\x2c\x95\x34\x8c\x88\x2b\x2d\x6a\x32\xcc\x90\x98\x88\x22\x2f\x4a\xad\x81\xf2\xb5\x6d\xef\x22\xb2\x75\xc3\xe3\xc5\xc2\x52\x67\x15\xb9\x51\x28\x17\x0f\x35\x28\x57\x8a\x2f\x65\xf5\x20\x49\x92\x1b\xc4\x99\x7a\xab\xb7\xfe\x5b\x38\x6c\x6e\x99\x82\xcf\x5e\x62\xb0\x5f\x9a\x7c\x89\x7f\xe1\x6f\xf2\xb4\x92\x6b\x3e\xa1\x43\x34\x28\xf2\x7b\x03\xc8\x9b\xe3\xe6\x41\x61\x13\x1d\x20\x03\x3e\x44\x8d\x61\x73\x81\x3d\x94\x1f\x8b\x62\x0d\xd8\xaf\x0d\xe2\xc8\x35\xbe\xff\x35\xbe\x3f\x13\xf9\xed\x5e\xdc\x62\xbd\x8a\x5e\x32\x51\xb6\x60\x8f\xd8\xfb\x49\x9f\x5a\x09\x85\x4d\x09\x68\x84\x30\x95\x42\x91\x00\x1a\x22\x24\x86\xf5\x4d\xdc\x88\xb4\x34\xbc\x8e\x11\x37\xd5\xc6\xaa\x2a\xd3\x55\x95\x51\x65\x5e\xe9\x1f\x1a\x53\xe0\x60\x16\x55\xaf\x58\x55\x60\xb8\x4f\xeb\x04\xa8\x4a\xbf\xdd\x13\x23\x2d\x86\x10\xa9\x53\xc5\x35\x48\xdb\x49\x41\x68\xdf\x12\x79\xba\x59\x38\xeb\xc9\x2f\x2e\x5b\x97\x68\x76\xb4\x80\xf9\xd4\x7a\x0c\xce\x5e\xc6\x6f\x62\xc3\x57\xe4\xea\xf2\xeb\xab\x06\xa9\x13\x44\x85\x85\xa2\x14\xab\x46\x7c\x36\xaf\x27\x58\x6a\x80\x02\xe9\x8d\x0a\xc3\x8b\xfa\xf3\x46\x61\x21\xa7\x79\x53\x49\x49\x8a\x4a\x02\xca\xcf\x91\x5c\x0d\xee\x8d\x51\x90\xa6\x5a\x83\xe4\x3e\x55\x4f\x84\x5b\x42\xe5\x8c\x6e\xf2\x76\x71\xa1\xa6\x92\x80\xf5\xf5\xf7\xb6\x69\x9e\x6e\xf7\x5b\x6a\x2a\x66\x2e\x48\x18\xd4\xf7\xba\x07\xe1\x82\x05\x6a\x37\xa3\x45\x7f\x8b\x67\xd6\x36\xcd\xf2\x3b\x29\xf0\x42\xb6\x82\xe5\xc0\x61\x31\x2c\xf8\x24\xb8\xee\x65\x9e\xea\x9f\x99\xed\xdf\xc5\xbe\xa0\x8a\xe2\xa6\xed\x2b\x03\x5d\xf7\x21\x38\x1b\x05\x79\xf7\x3b\x0a\xed\xd3\x99\xb2\x8a\xa6\x16\xfa\x24\x55\x0a\xaf\xf0\xc5\xc0\x3b\xb2\x1e\x82\xdd\x39\xb1\xba\xed\x24\x32\x3f\x50\xce\xc2\xfc\xa4\x4e\xa8\xdc\x1a\x0a\x1e\x01\x27\x26\xc8\x44\x28\x97\xcf\x05\xdb\xc7\x22\xa8\xc1\xef\xf3\x22\x7f\x61\xff\x66\x45\x80\x01\x23\x64\x27\x4d\x53\x09\x99\xc7\x6b\x79\x62\x5e\x15\xf0\x7b\x68\x2a\x83\x10\x7c\xba\x4d\x33\x51\x82\xe2\x2b\xab\x1e\x4f\x15\x73\x1d\x42\x6e\x2f\x2a\xba\xd6\xb0\x02\x3f\xd8\x4d\xf5\x8e\x97\xaf\xcd\x70\xf5\x61\xdd\x9d\x30\x73\xed\xf8\x78\xe9\xbd\xe4\x0f\x89\x19\x28\xe9\x77\x76\x21\x3d\x77\x69\xee\xf9\xda\x98\x3a\x49\x7e\x0b\xb5\x72\x66\x19\x62\xfe\xfd\xf7\x7f\xfa\xd3\x9f\xb4\xa7\x67\x42\x15\x8b\x64\x76\x35\xe7\xc9\x04\xfd\x57\x7e\x8a\x91\xca\xc5\xa7\xfe\x84\xf7\x31\x36\xa1\x3d\xe6\xd1\x84\x27\x3f\x83\x0f\xc8\xfb\xbd\xf8\x4f\x7f\xfa\xd3\xf7\xdf\x33\x66\x7f\xc3\x4f\xe9\x3e\xf4\xd7\x62\x07\x59\x87\x6b\x2c\x65\xa2\x61\xf7\xc0\xb6\x80\xc0\xcb\xd9\xfb\xb6\x38\x35\x92\xe6\x24\xf3\xd1\xc7\x09\x84\x3f\x3f\x27\x17\x7c\x3e\x5a\x24\xf0\xbd\xae\x62\xc0\x54\x21\x0f\xf5\xff\x7c\xe6\x3f\xf8\xd2\xbf\x26\x39\x50\x15\xec\xb5\xe0\xa1\x1e\xc4\x96\x97\xfc\x1b\x7c\x18\xfe\xa7\xbf\x5e\x97\x58\xd6\xd0\xf6\xc1\xbf\x60\x28\x7f\xbd\x2f\xd1\xa4\x05\xcd\x04\x9a\x60\xbd\x19\xea\x85\x1e\x4a\xed\xe5\x41\xc9\xc0\x67\xb9\xe4\xf3\xb4\x92\xbf\xcb\x42\xdf\xcc\xc6\x20\xb4\xda\x9e\x7f\x7c\xe9\x27\xd3\x45\xf2\xfe\xc8\x21\xb0\xb0\x32\xd2\x54\x24\x20\x28\x40\x04\xfd\x32\xb7\x0e\x96\x42\x31\xcc\x24\xea\x3b\xf4\x06\xfe\x0f\xab\x19\x6d\x55\x47\x84\x1f\xe3\xaf\xe1\x23\x6f\x63\x77\x6a\xcf\xdd\xa9\xfd\x3c\x9d\xfd\x39\x2c\x50\x45\x74\xae\x62\xbb\x43\xfe\xf4\xaa\x85\xc9\xfe\x54\xf5\x8e\x40\x19\xb1\xb0\xdc\xee\xde\x65\xfe\x4d\x8f\x2d\x38\x0e\xa7\xaa\xf7\xfe\xb9\x7b\x40\xb5\xb4\x58\x17\xe9\x23\xae\x06\x83\x7f\x10\x86\xb8\xf4\x18\x04\xf3\x7b\xd6\xbe\xc3\xb0\x42\xaf\xde\x7b\x31\xa0\x7f\xbe\x99\x8d\xe6\xc3\x11\xc4\x7e\x10\x95\x1b\x94\x2c\xb9\x6f\x4d\x35\x74\x3c\xf8\xf0\xdc\x63\xf7\x3f\x63\xf6\xaf\x6d\x47\xa5\x2a\x38\x9e\xc5\x8e\x57\x69\x29\xfa\x6f\x6e\x46\xaf\xdf\x73\x47\xe5\x3d\x4a\xe6\x4f\x99\xc8\x89\x07\x43\xe9\xc8\xbf\xd7\x72\x93\xe6\xc8\xbb\xe4\xf8\xb7\x3c\x30\x51\x09\x3c\x07\x4e\xf3\x5b\x6a\xd7\x23\x8c\xa0\x50\xf2\xea\x10\x36\x58\x83\xbc\xac\x41\x77\x69\xa8\x57\x6b\xdc\xb4\xae\xad\xb2\x06\x3b\xd9\xfd\xf2\x98\x2f\x0a\x1a\x24\x16\x91\xd6\x19\x1a\xdc\xb8\xa2\xce\xb2\x52\xc8\x2b\x03\xa4\x3c\x94\x30\xfc\x8c\x4a\xf8\xeb\x89\x59\x12\xa2\x08\x2d\x72\xbe\x2c\xbe\xe2\x55\x56\x29\x91\x4d\xea\x97\x7a\x29\xee\xe6\xca\xe1\xd5\x9d\x27\xe3\x84\xce\x20\xe7\xfc\x62\xfa\xb3\xde\xca\xfe\xc7\x59\xff\xfa\x93\x29\x88\x33\xff\xff\xaf\xfc\xdf\x78\xbf\x4e\xde\x4e\x54\xf1\x21\xc6\x7b\xec\xbe\xaa\xbf\x74\xf1\xa4\x2f\x19\x40\x59\x53\xab\x52\x5f\xb1\xf7\x0c\x9b\xe5\x1f\xee\x8a\x2c\x3b\xf0\xe2\x21\x97\x50\xe6\xab\xd2\x75\xaa\xcd\xc9\xa3\x54\xfb\x7a\xc5\xfe\x7d\x2f\x95\x5e\xac\x0f\xd8\x5a\x40\x71\x49\xa4\x18\xb3\x8c\xac\x33\xec\x12\x05\xab\xc2\xbd\x49\x1d\x79\x34\x0b\x1e\x5d\x94\xd0\x5a\xff\xe8\x30\x3b\xfe\xac\x1f\xa6\xa7\x59\x58\x7b\xfd\x5a\x94\x54\xb1\x7c\xba\xec\xd5\x16\x76\xf0\x7b\x2e\xac\x03\xa2\x47\x00\xea\x8c\xca\xee\xdc\x4f\x0f\x88\xca\xc9\xb7\xe2\x97\xa2\x4c\x5d\xa3\xf8\x7d\x41\x88\x53\x95\x2c\xa5\xb2\xe8\xc1\x1d\x3b\xa1\x57\x68\xd9\xab\x01\xdf\x3b\xa1\xdb\xb1\xc8\xdd\x63\x52\xfe\x88\x6a\x43\xa9\xad\xd7\xf0\x37\xad\x57\x6d\x55\x58\x38\x02\x6a\x3f\xc9\x3c\x9a\x94\xd6\x19\x60\x67\x67\x5d\x2c\x32\x27\xf7\x22\x7e\x42\xcf\x3a\x31\x2c\x5b\x92\x1a\x15\x77\xc5\x03\x36\xe1\xe0\x5b\x01\xb4\x50\x98\x56\x02\xfc\x1d\x56\x45\xa2\x9a\xd8\x8a\x5c\x10\x47\x9e\x96\x73\xbb\x22\x4b\x57\x04\xed\x03\x16\x3e\x4d\xc8\xf8\x04\xd5\x1d\x84\xf2\xb0\xf5\xf3\x21\x97\xa5\xba\x4b\x77\xda\x7f\xac\x2d\xa6\x82\xca\x17\xe3\x4d\x47\x81\x60\xac\x2d\x74\xf2\x07\x2e\x34\x84\x12\x82\x55\x77\x88\x02\x10\xd7\xa1\x56\xf5\xb2\xc8\x5c\x3a\xe4\x39\x7b\xc2\x1f\xdb\x13\xf6\xf4\x3d\xe1\x8f\xec\x09\x7b\xce\x9e\xf0\x47\xf7\x84\xd5\xf6\x64\x81\x9a\x55\xec\xb3\xca\xd7\xb0\xc5\xa6\xb6\x3d\x69\xb7\x12\x0e\x08\x40\xb5\x0a\x4d\x37\x7c\xa2\x75\xf1\x74\xc6\xaf\xa6\xb3\x04\xdd\x20\x22\x21\x6a\x67\x0a\x2d\x4a\x9e\xd8\x36\x36\x30\x3c\x5f\x6b\xaf\x9b\x3d\x41\x87\x7b\xf6\xe5\x9b\xf7\x44\x7e\xc0\xd8\xd1\xee\x05\x9b\x6b\x36\x7e\x1b\x25\x16\xfb\xc3\xfe\x35\x54\xc8\x5c\xdf\x5c\x8c\x47\x03\xf3\x00\x76\x7a\xe2\x68\xb7\xfb\x73\x7e\x39\x9a\xcd\x17\x7c\x30\xbd\xba\x1e\x27\xda\xcd\xba\xf8\xd2\x65\x50\xf2\x7f\x1d\xe5\x4a\x96\xc4\xa6\x20\xb6\x92\x1d\x01\xce\x00\xc3\x29\x86\x94\x28\x94\xa7\xd0\x20\x86\xa3\xf9\xf5\xb8\xff\xc5\xfe\xec\xd7\xa8\xb0\x59\x72\x3d\x9b\x0e\x6f\x06\xa6\xe8\xa3\x96\x84\x8d\xb0\x88\x26\xd1\x0a\xdb\x22\xf9\x26\xb3\xd1\x4f\x7d\x98\x26\x20\x33\xf3\x8b\xfe\x3c\x19\xb2\xe9\xa4\xad\xe5\xc3\x4f\xff\xdb\x3c\xf8\x77\x73\xde\x1f\x0c\x92\xeb\x85\xab\x89\xf1\x92\xf6\xfd\xc9\x90\x8d\x16\x73\x5c\x59\x5b\x23\x82\xd5\x34\x0b\xcc\x7c\xba\x8c\xfa\x2c\xe9\x0f\xe7\xcd\x8d\xb0\xf5\x04\x27\x41\x09\xc1\x09\x38\xb8\x27\x0e\xab\x81\xf7\x67\xd0\xee\x30\x9a\x24\x43\xcc\xde\x7b\xdf\xed\xf3\xc1\xf4\xfa\x4b\xed\x91\x7c\x34\x67\xe3\xe9\x00\xdc\x63\xfa\xc2\x22\xf9\x79\xc1\x2f\x47\x63\xec\xd6\x58\x8c\x93\xa1\x7d\x6d\xbc\xf8\x59\xbf\x64\xa0\xf7\xba\x3f\xf9\xa2\x8d\x72\x6c\x7a\x98\x00\x2d\xbb\x6d\x4e\xd0\xdf\x8e\x21\x53\xdd\xfa\xce\xe1\x34\x99\x63\xd6\xd9\x3c\xc9\x7d\x2d\xa2\xef\xd4\xaa\x54\xa0\xe6\xab\x3f\x9e\x4f\xf9\x45\xc2\xa7\x17\x8b\x3e\x4c\xb1\x8f\x3d\x1b\x97\xd3\xf1\x78\xfa\x19\xea\x22\xc8\xc3\x7f\xb6\x47\xa3\xff\xd1\xe1\x6c\xb3\x2b\xbf\x53\xad\x2e\x26\xd9\xf6\x73\xd3\x86\xde\x86\xfa\x16\x70\xbe\xd4\xa8\xba\xb4\x89\x4a\xfd\x41\x80\xb5\x18\xd9\xf2\x07\xd3\x0b\x14\x36\xfa\x10\x83\x01\xc5\x74\x40\xb1\x6f\x77\x59\x2a\xd7\x31\x9f\xcb\xa0\x4d\xce\x32\x4e\xd9\xb4\xa2\x8d\x59\xdd\x5a\x3f\x25\x20\x67\x35\x61\x2b\xd5\x1c\xb9\x27\x52\xde\xbe\xe7\xc8\xc1\x4f\x1b\x03\x47\x40\x1f\xd5\xa7\xf8\x31\xc7\x58\x91\xcd\x87\xb5\xb0\x63\x75\x1e\xf7\x92\xc0\x03\xd3\xdc\xd0\x48\x10\xa6\x3d\xc0\x47\xb8\x20\x64\x3b\x21\x23\x4b\xbb\x85\x0c\xb8\x0a\xea\xf9\xbe\xc2\x97\x64\xce\x45\xae\x48\xa1\xe9\xdf\x18\x83\x96\xa7\x5b\x20\x5e\xab\x24\xe0\xdc\x64\xc5\x03\x2e\xdf\x48\xe1\x04\xbb\x69\xb4\x03\x06\x06\x4b\x9e\x17\x9f\xd7\xa6\xf3\xff\xd6\xbd\x0c\x3d\x96\x7f\xe5\xff\x56\xff\xf5\x64\x8a\xbf\xbd\x38\x18\x85\x06\x9a\x48\x7f\x9a\x62\x9d\x4f\xd0\x26\x44\x73\x05\x33\x65\xa9\xe2\x93\x69\xcc\x58\x1f\xad\x80\xe6\x66\x4b\x7f\x8b\x03\xf5\xf5\xb6\x96\xd5\x27\x89\xd2\xbf\x18\x27\x27\x0c\x4d\x1d\x2f\x44\x61\x9b\x02\xa1\x98\x3d\xb2\x71\x71\xf1\xd5\x8b\x8b\x5b\x8e\x1a\xc7\x76\x41\xb4\x90\xd0\x93\x4b\x03\x4a\x69\x4e\x48\x58\x0b\xdc\x2e\xc6\xae\x81\xf4\x0b\xc6\x44\xb1\x09\x02\x62\xdb\x59\x66\xe0\x37\x5a\xca\xfd\xa1\x8d\xe5\x22\xee\x8c\x1b\x51\xee\x9a\x88\xb3\xf5\xb3\x3c\xa0\x1a\xc0\x1b\xcb\xd6\x2f\x1e\xd2\xb5\x8c\xb8\x8f\xc8\x11\xb1\xbc\xc8\x5f\xb8\xca\x82\xcc\xdc\x98\x00\xa8\xc3\x27\x04\x6b\x63\xcb\x35\x55\x05\x78\x7f\x89\x95\x18\x7e\x79\xaa\x7a\x74\x7a\x20\x08\x73\x24\x00\x80\x58\x5b\xa5\xc4\x18\xf5\x3e\x5b\x33\x48\x61\x61\x8b\xbb\x3d\x28\xd8\x08\x1b\x21\xf3\x5c\xa4\xcf\x11\xda\x98\xb6\x6b\x1f\xd9\xd5\xf4\xd6\xd0\xae\x6e\xc5\x5a\x46\x0c\x83\xdc\xf0\x51\xf9\xd5\xfe\xa7\x21\x89\x22\x6e\xf7\x5d\xa1\x44\x66\x2d\xef\x36\xec\x3b\x6a\x73\x66\xd4\xe6\x0c\x35\x27\x01\xa7\x4e\xad\xc1\x25\x2f\x5a\x38\x9a\xcd\xb6\x1a\xe2\x4a\x3c\xa9\xe4\xf1\x5f\x1c\x59\xa3\xf7\xfc\xf4\xac\x67\x2d\x70\x60\x53\xa8\x27\x8c\x83\xd0\xdb\x5a\x66\xb2\x92\x8a\xb7\xc3\x34\x9e\xb6\xb7\x6e\x07\x81\xbd\x23\x41\x13\x8e\x18\x9c\x55\xd1\xc4\x7c\xf9\xc0\x4f\xcf\xdd\x38\x03\xaa\x13\xc4\x7b\x6d\xc3\x9c\xed\x1c\x4e\x00\x30\x8a\xa6\x37\xb0\x41\x9e\xbe\xea\x39\x06\x8c\xee\x29\xd2\xf3\x54\xeb\xfc\x0c\xcd\x86\x47\xf3\x7f\xd4\xbe\x1d\xc4\x3c\x81\x5c\x92\xbe\x2b\xfb\x5d\x91\x87\xcd\xcc\x80\x87\xd1\xe1\x4a\x43\x6d\x93\x17\x4e\x33\xad\x4c\xed\xf4\x3e\x47\xf8\x0f\xa2\x3a\x15\x01\xfb\x3d\xe4\x00\x0f\xe4\x00\xfb\x8b\xe4\x00\xf7\xe5\x00\xeb\x90\x03\xc7\xf8\x14\x1a\xb2\x80\xfb\xb2\x80\xfd\x65\xb2\x80\x3b\x59\xc0\x9e\x20\x0b\x6c\x37\xd1\x93\x36\x2a\xac\x05\xc9\x8a\x5c\x9a\xb2\x8d\x36\x36\xc4\xb4\x6a\x10\x45\x07\x67\xd6\x7a\x9c\xde\x37\x7b\x26\x17\x1b\x21\xb5\x93\x9e\x36\xcd\x39\x9c\xb0\x0c\xa6\x6b\xe6\xea\x4d\xd4\xa2\xbb\x40\xb4\x14\xe7\xac\xb5\xd7\x7b\xc6\xb4\x9c\x79\xf6\xc1\x6c\xbf\x6e\x80\x3e\xc9\x98\x96\x08\x94\x49\x58\x7a\x3d\x32\xcf\x7f\x09\x34\xb7\x3c\xb6\x70\xbc\x6d\xe1\x3e\x18\xfb\x84\xf3\x1a\x1e\x8e\xa9\x5e\xab\x91\x47\xb4\xb7\x5d\x1b\x50\x0c\x00\xc8\xfc\x8b\xe5\x3f\x0f\xe5\x3f\x1b\x3c\x72\x37\xba\x74\xc0\x91\xaf\xb0\x86\x1e\xe8\x58\xda\x9f\x08\x15\xe2\x39\x9a\xa1\xe3\x51\x7f\xb9\x72\xf8\xad\x63\x44\x75\xc1\xea\xea\x82\xb7\xab\x8b\xc7\xdf\xc2\x9e\xa4\x40\x78\x43\x81\x74\x44\xb1\x18\x1b\x1e\xd7\x21\x24\x72\xc2\xde\x54\x50\x2c\x35\x2c\x1d\xc1\x42\x66\xb5\x3a\x62\xd5\xdf\x8d\x45\xd8\x18\x79\x9b\xf8\x67\xbf\x97\x29\xf8\x5b\xc5\x7f\x27\x9d\xbd\x99\x02\x0b\xe0\xf5\x7e\x9b\x90\x26\xe3\x34\x62\x8f\x0a\xe9\xb6\x41\xb5\x88\xdf\x50\xd0\xb1\x0e\x41\xe7\x03\xc0\x3b\xe9\xf6\x88\x71\xcb\x9e\x2d\xdc\xf8\xb0\x6d\xbb\x41\xa2\xb1\x0e\x89\xe6\x1f\x8b\x86\x18\xf3\xff\xe8\xdf\xd8\xc7\x64\x97\x39\x41\xfe\xf7\x8f\x08\x2c\xd6\x29\xb0\xb8\x2f\xb0\x3a\x46\xd3\xe6\x37\x74\x1a\xb5\x1d\x52\xaa\xe5\xd1\xec\xc9\xb6\x6d\x53\x34\x79\x8f\x8b\x19\x4b\xa0\x3a\xce\xc7\xdb\xa1\x06\x78\xe5\xb6\xd7\xd5\xdf\xd7\x8a\x86\x7d\xf2\x34\x76\x72\x33\x4f\x66\x27\xbd\xd6\x2e\x57\x78\x50\x08\xac\x23\x1a\x65\x05\xe0\x25\x53\x48\x8b\x79\x64\x65\x82\xaf\xca\x42\xa9\x17\x88\xcd\x05\xc4\x5a\xfb\xbc\x92\x25\xfe\x8c\x2c\xad\x88\x59\x47\xc5\x71\x41\x05\x95\x0f\xb6\xe9\x4b\x22\x64\xd2\xc2\xf0\x3f\xf1\x58\x72\x75\x50\x95\xdc\x46\x7c\x2b\xab\xbb\x62\x1d\x61\x09\xb2\x52\x91\x1e\xba\xde\x94\xbd\x8a\xd8\x5a\xde\x03\x00\x13\xc1\x23\x45\x5c\x10\x7f\x4a\xb1\xe1\x5b\x91\xef\x37\x62\x85\x60\xc2\x7e\xad\x2e\xc4\x8b\x20\xea\xee\x06\xd0\x03\xec\xf7\x9c\x8a\xcd\x90\xb2\xa6\xf4\x00\xc6\xeb\x54\x2d\xc6\x32\xba\x51\xd2\x1d\x55\x07\x1c\xd0\x52\xc0\x1d\x0c\xa1\xb5\xbf\xbb\x01\x09\xb0\x20\x42\x7b\x63\xa4\xb9\x72\x6f\xab\xb4\xf2\x34\x97\xd5\x81\x9f\xfe\x68\x80\x20\xb0\x16\x93\xf0\xd0\xf5\x1b\xdc\xf7\x11\xab\xcc\x8c\xd8\xab\x8a\x26\xb2\x8d\x2a\xc0\x7a\xd2\x27\x67\x5d\x8a\x07\xe5\x6f\x96\x3b\x7e\xe8\x4b\xf0\xa5\x05\x83\x07\x28\x4d\xda\xda\xda\xa8\xf8\x4e\x96\x69\xb1\x86\xdc\xbe\x3f\x7a\x47\xb3\xca\xdc\x80\xcd\x4a\xfb\x13\x0f\x58\x81\x85\x17\xce\x4c\x91\x1d\xda\x3b\xcc\x38\x50\x28\xb8\xfe\xbe\x08\x81\x0e\xa4\xdb\x4f\xb9\xd6\x4a\xf7\x57\xfd\x7b\x5c\x0f\xbb\x97\x88\xf3\xa7\x2c\x6e\x5b\xe0\xea\x78\x30\x0a\xda\x58\x18\x37\x87\x1a\xb7\xfd\xd2\xd2\xca\xd8\x99\xb3\xfa\xbd\xa4\x61\x1b\x0f\xc5\x0e\x14\xeb\x95\x6d\xc1\xee\xce\xed\xad\x81\x75\x63\x80\x2c\xe7\x45\x67\xdf\xbd\xe7\xf3\xfe\xd5\xf5\x38\x69\xd2\x12\x2f\x3e\x25\x4f\xe6\x30\x3c\x4e\x8d\xfd\x1c\xfa\xc2\xd6\x80\xc8\x13\x99\x0b\xb1\x16\x18\x8a\x26\x4f\x4d\x15\xa5\xa9\x61\xec\x01\xe0\x1c\x24\x0f\xff\x62\x56\x43\x56\x8b\x0f\x3c\x8d\xd5\xf0\xa8\xa9\x6f\x14\x12\x41\xac\xb6\x11\x0e\x5a\x84\x59\x02\x97\x43\xb5\x0b\xcf\x8e\x19\x83\x7a\x4a\x57\x08\x99\x4c\x86\x73\x28\xa4\xa4\x1a\xc9\x7f\xf8\xf6\xef\xf7\xfe\x17\x7f\x3f\x91\xd5\x8b\xf9\xe4\xea\x3a\xae\xbe\x56\x7f\xcc\x3b\x5e\xbe\x7c\xf9\xf2\xed\xdb\xd7\xfa\xff\xcf\xde\xbd\x79\xe9\xff\xff\xcb\x97\x2f\x5f\xbd\x7a\xfd\xf6\xcd\x3f\x9c\xbd\x7a\x7b\xfe\xf2\xe5\xeb\x77\x67\x6f\xce\xfe\xe1\xe5\xd9\xab\xb3\xd7\x67\xff\xc0\x5f\xfe\x31\xc3\x09\xff\xed\x55\x25\x4a\xce\xff\x21\x13\x9b\x32\xfd\x55\x75\x7e\xee\xb1\xbf\xff\x9d\xfe\x7b\xf1\xe2\xc5\x0b\x2a\xf1\x7c\xcf\x07\x57\x37\xdf\xdf\x0c\x86\x0d\x96\x91\xf7\xfc\xf4\x62\x3e\x04\x50\xe8\x1e\x7f\x01\x5f\x19\xd8\x8f\x9c\xfd\xf8\xc3\x8f\x11\x3f\xfb\xf1\xc7\xb3\x88\x9d\xfd\xf8\xe3\x39\x00\xae\x8b\x32\x97\xb7\xa9\xe4\x57\x32\xcb\x8a\x9c\xdf\xe4\x29\x80\x3e\x56\x07\xc6\x86\x16\xbc\x11\x05\xc2\x0b\xfd\xdd\xb7\xf0\x84\x1f\x5e\x9c\xbf\x7c\xf9\x32\x78\x76\xf8\x17\xe4\x40\xbf\x25\xd6\x5b\x46\x3d\x30\xf4\x68\x2d\x4d\x06\x5a\xc4\x16\x65\x9e\x0a\xc6\xfa\xda\xe9\x44\x8d\x32\x93\x40\xf0\xb6\x66\xec\xda\x11\x4f\x20\xc8\x66\x04\xb3\x8d\x0c\x0e\x63\x80\xae\x46\x15\xb0\x16\x6e\x1b\x1c\x98\x3a\x7d\x9b\x75\x1e\x28\x27\x14\x36\x48\x48\xf0\x4b\x7c\x6f\x58\xa2\x61\x87\x94\x29\x35\x0a\x9d\x06\xbd\x8b\xd8\xed\xa4\x28\x95\xed\xa6\x41\xe6\x2d\x94\xa1\xa2\xc2\x26\x48\x62\x32\x0c\xbf\xc9\xf0\x33\xa9\xf2\xa9\x36\x82\x87\x62\x57\xdb\x8e\x7c\xd0\x70\x4e\x91\x7b\x45\x75\x27\x99\x29\xe9\x1e\x5c\xdd\xc0\x1f\xc2\x6d\xe0\xc7\xb6\x21\x60\xeb\x4a\x73\x26\xd6\xf7\xb2\xac\xa8\x3f\xb3\x24\x90\x4e\xfd\xad\x1d\xb6\x90\x52\x4b\x50\x3d\x28\x01\x79\x49\xb3\x0d\xa6\xdb\xd8\x1a\x45\xad\x54\x5c\x7a\xb0\xfd\xc9\x10\x2c\x80\x59\x02\x70\x2a\xb6\x55\x7d\x32\x02\x47\x13\xf3\xcc\x83\xfe\x78\x74\x39\x9d\x4d\x46\x7d\x0b\xf2\xc7\xfb\xe3\xb1\x07\x11\xc9\x08\x79\xf1\x63\x7f\x46\x60\x22\xa3\x39\x9f\x4f\x2f\x17\x9f\xfb\x33\x80\x14\x31\xad\xf3\xfa\x6b\x84\x40\x19\x20\x4c\x5e\xf2\x1a\x74\x24\xd3\x23\x23\xec\xc8\x36\x10\x1a\x3d\x78\xb2\x5e\x9e\x38\x76\x76\x91\x40\x13\xfb\x38\xb1\x10\x04\x84\xe1\xe2\x40\x60\xba\x91\x08\x0c\x7a\x0c\xfe\xc8\x3c\xb8\x96\x5a\xc7\x3b\xd4\x26\x1c\xc5\x68\xf1\x80\x07\xfa\x13\xd6\x1f\x18\xb3\xcb\xa1\x10\xb4\x00\x0c\x00\x08\xc1\x68\x7a\x33\xa7\x1e\xf7\xc8\xe2\x7d\x58\x60\x17\x82\x17\x99\x10\x9a\x03\x6c\x89\x87\x3b\xd0\xc0\x67\xf1\xb6\x28\x66\xcc\xc9\xb9\xf3\xf7\x7c\x22\x2b\xc0\x8d\xe5\x7d\x03\x89\xa8\xf8\x42\xae\xee\xf2\x22\x2b\x6e\x0f\x11\x1f\xe5\xab\x26\xd3\x92\x16\x81\x24\xfd\x18\x73\x22\xea\x74\xd5\xe3\xe7\x2f\x5f\x9e\x69\x01\xf5\x2a\x7a\xd2\xa3\xfb\x0e\x53\xad\x24\xc1\x14\xb3\x99\x6c\x20\xd3\x02\x9a\x70\xce\x15\xd2\x0b\xe8\xdf\x2c\xd3\x9c\x40\x93\xb6\x8a\x28\x63\x29\x28\xad\x85\xcd\xd6\x8b\x0e\x44\x4c\xdf\x14\x47\x8f\xd3\x94\x38\xae\xc0\xd8\xeb\xd2\x04\x52\x01\x59\xbd\x67\xec\x4f\x3c\x1c\x11\x11\x0f\xc0\x50\x20\x4c\x42\x50\x56\x60\x33\x5a\x09\xd6\x58\x36\xe4\xa3\x60\xc6\x6d\xf1\x5f\x45\x86\xa0\x1b\xc7\x3a\x55\xe0\x62\x01\x2a\x74\xf3\xfd\x69\xee\xcf\xdf\xbc\x7f\x47\xac\xcd\x47\x86\x80\x59\xce\x67\x0e\xc1\x54\x43\x84\xb2\x9e\x9c\x15\x74\x69\x0d\x40\x9f\x6a\xa1\xc0\xf2\x87\x0e\xb3\x99\x50\x11\x4b\x55\xa3\xe9\x7a\xca\x81\xc9\x0b\xf7\x3d\x48\xcb\x10\xba\x82\x23\x85\x20\x02\x7f\x43\x2e\x44\xd4\x87\xdc\xa3\x3e\x6c\x65\x39\x64\xa1\x7e\x33\x07\xc9\xf5\xe4\x77\x33\x1d\x06\x17\x2c\xa8\xaa\xbb\xf8\x42\xd5\x51\xd7\x5f\x00\xd3\x83\x7f\x9a\x8e\x87\xc9\x6c\x0e\xd2\xd8\x4b\x65\xcc\xf9\xff\xfa\x5f\x50\x05\xf4\xdd\x77\x20\x0e\x11\x35\x05\xe0\x58\x3c\x24\x5f\x4f\x8e\x7a\x92\x36\xe2\x17\x37\x0b\xa8\xa5\x32\x2c\x8b\x8b\x29\x14\xae\xb1\x27\x89\x5f\xee\x89\xdf\x4e\xe8\x5e\x06\x55\x65\x06\xf6\x75\xd8\x26\xa6\xdb\xe7\x89\x52\xd6\x4d\xf3\x22\x61\x35\xc9\x8c\xe2\xd8\x09\x66\x1f\x83\x2b\x72\x72\xfb\x08\x86\x0c\x6b\x62\xc8\xb4\xaf\xc9\xf5\x6c\x3a\xb8\x41\x8f\x18\x81\x89\x2e\xa8\x92\x8f\x7f\x9c\x4e\x87\x7a\xb0\xcc\x60\x4e\x7d\x68\x4a\xf6\xc8\x13\xed\x1f\xf4\x7f\x5f\xdc\xcc\x47\xb0\x6a\xa3\xc9\x22\x99\xcd\x6e\xc0\xab\xee\x19\x70\x1a\xf6\x3c\xc4\xa8\x47\xc0\x69\xd8\x33\xc0\x69\x8e\xe2\x43\x25\x8c\xd0\x88\x6a\x8a\xfb\x71\x60\x99\x1a\x96\x13\xc6\x1c\x9c\x2e\x79\xf5\x9e\x0f\xc4\x76\x59\xa6\xeb\x5b\xc9\x2f\xca\x42\xac\x97\x5a\xa6\x8c\xab\x75\xfc\x88\x02\xb9\xf6\x72\x85\x08\xac\xae\x65\xaa\x28\x7d\xf1\x55\x53\x2d\x5d\x6f\x62\x6d\xfa\x84\xff\x46\x7d\xc2\xba\xf4\x09\xff\x2d\xfa\x84\x7d\xd3\x27\x7f\x94\x3e\xf1\x39\x72\x3b\xcf\x60\x9d\x2e\xb7\x55\x35\xb0\x2e\x02\xdc\xbf\x9a\x6a\x70\x8a\x80\xd7\x14\x01\xfb\xcd\x8a\xa0\xe5\x6b\xec\x37\x2a\x02\xde\x54\x04\xec\x09\x8a\x80\x37\x2d\xf2\xa3\x72\x9f\x3d\x45\xee\xb7\x60\x87\xb5\x2e\x01\x7b\x5c\xee\xf3\xa7\xca\x7d\xf6\xa8\xdc\xff\x4f\x44\x0a\x7c\x02\x28\xd9\x13\xe5\x3e\x3b\x2a\xf7\x9d\xd0\x7f\xfd\x9e\xcf\xf7\x39\xbf\x4a\x57\x65\x81\x19\x1b\x05\x66\xda\x71\x91\xef\xa2\x1a\xec\xff\xfc\x6f\x2d\xd6\x5f\x75\x3c\x25\xe2\xaf\xcf\xde\xbc\x34\x76\x21\x1f\xa4\xe5\x2a\x93\x11\x9f\x8b\xbc\x12\x7c\x90\x89\x52\x44\x7e\x98\xe3\xc7\x37\x2f\xdf\xbc\x8e\xf8\x4d\x3c\x8f\xfb\x71\xbb\x6b\xc1\x6e\x30\x3b\xea\xe5\xd0\xfd\x94\x83\xb2\xe5\xba\x80\xba\x12\xa8\x0d\x9f\xcd\xd9\x89\xa7\xb5\xbc\x97\x59\xb1\xb3\x78\x35\x94\x8e\x4f\x01\x4c\x68\xbe\xcf\xa3\x96\xa9\x61\x55\x42\xce\xb3\xe2\xb6\x00\x41\x39\x2f\x32\x51\xa6\xe8\x72\x38\x86\x53\xc2\xed\x48\x55\x25\x4b\xb9\x66\xfe\x1f\x36\x5d\xcb\x4e\x92\x55\x2f\x81\xcb\x58\x63\x96\xae\xc4\x31\x7d\x73\xae\xfe\x6b\x2b\xc3\x2e\xe7\xaa\xe3\xc0\x04\xfe\x14\x6f\xf1\xa7\xd8\x6f\xf4\xa7\xda\x95\x26\xfb\xe6\x4f\x7d\xf3\xa7\xbe\xf9\x53\x4f\xf0\xa7\xde\xbc\xe7\x73\xad\x49\xc4\x6f\x8a\xc1\xbd\xd2\x8e\xd2\x8f\x51\xf0\x88\x27\xfa\x46\xec\x2f\x52\x07\xa1\x6f\xc4\xbe\xa9\x83\xbf\x41\x75\xe0\x1f\x8a\x47\xe5\x3f\xc5\xd3\xd8\xef\x23\xff\xad\xd3\xc4\xbe\xc9\xff\x6f\xf2\xff\x9b\xfc\xef\x96\xff\x6f\xdf\xf3\x41\xaa\x56\xc5\xf7\x17\x37\xd7\x8b\xc9\x68\xf0\x5c\x0d\xf0\x3a\xc2\xef\xe3\x35\xd7\x22\x67\x94\x03\xa8\x2c\xc8\x79\xeb\x52\x01\x60\xad\xbe\xf7\x17\x32\xfd\x45\x8b\x22\x2f\x3f\x5d\x6c\xf8\xb5\x85\x10\x5d\xc8\x4c\x86\x00\x90\xed\x2e\x56\x47\xb4\x8d\xfd\x4e\x1a\xc5\xca\x3c\xf6\x4d\xa3\xfc\xed\x68\x14\x77\xd2\xa2\x96\x83\xc4\x1f\x39\x48\x11\x6b\x68\x21\x64\x9b\xf9\x8d\x79\x1d\xf6\x9f\x15\xbc\xfb\xa6\x87\xbe\xe9\xa1\xff\x02\x7a\xc8\x29\xa1\x77\xef\xf9\xa5\x58\x0a\x7d\x7b\xf8\xec\x7f\x0c\xb9\x85\x39\xf8\xb8\x5d\x7e\xe2\xff\x83\x0f\x0a\xfe\xe7\x8f\xc7\x35\x53\xa8\x98\x1e\x7f\x5a\x84\x01\xc1\x42\xa9\xff\x6f\x43\x1f\x8e\x57\xc5\x96\xf7\xf7\xd5\x5d\x51\xbe\x67\x17\xb2\xcc\xef\x44\xb9\xe6\xd7\x32\xff\x8f\x6f\xe1\xac\xff\xea\xda\xc6\xcf\xed\x3c\xe1\x28\x3a\xb4\x2e\xed\xc7\x58\x88\xb0\x54\xaa\x88\x2d\x4b\x88\x88\x96\x46\x4f\x90\xb6\x79\x52\x62\xa8\xe1\xe3\xb0\x6f\x89\xa1\x6f\x89\xa1\x6f\x89\xa1\x2e\xc5\xf1\xc3\x7b\xde\xdf\xed\x32\xf9\x9c\x64\x90\xf1\x5c\xde\xe1\x57\x19\x7c\xb5\x3d\x8b\xf3\xb7\x26\xf5\xcf\xea\x6e\xcf\x6f\x15\xfb\xbf\x49\xe6\xc6\x8c\x9d\x37\x07\xf0\xf7\x2c\xf7\x5f\xc5\xad\x6e\x86\x77\xa4\x4e\x4f\xe0\x87\x93\xde\xdf\x5f\x06\xa3\x7f\x7d\x3d\x06\x50\x30\x20\x46\x0c\xcc\x68\x03\x05\xf5\x77\x2a\xe1\x71\x66\x7a\xb0\xf5\x89\x3d\x41\xcc\xb3\xe7\xfa\x07\xc7\xc4\x3c\x7b\x9e\x7f\x70\x54\xcc\xb3\x67\xf9\x07\xc7\xc4\x3c\x7b\xb6\x7f\x70\x5c\xcc\xb3\x67\xf8\x07\xc7\xc5\x3c\xfb\xcd\x71\xaa\x1f\xdf\xf3\xf9\x0a\xd8\x01\xc6\xc5\x6d\xba\x8a\xf8\x78\xfc\xec\x58\xd5\x8f\x51\xcb\x33\x9e\x10\x5c\x62\x7f\xb1\xe0\xff\x96\xae\xf8\x5b\x12\xfb\x1d\xe9\x8a\xc6\xd1\xf8\xbb\x13\xf9\xdf\x82\x45\xdf\x82\x45\xff\x35\x83\x45\xff\xd9\x4d\x7b\xbf\xe3\xbf\xf8\xfb\xc1\xe0\xc5\xc5\x97\x17\x93\xc1\x8b\xc9\xf0\xc5\x79\xfc\xe6\x0f\x68\x03\x7d\xa4\xff\xf3\xec\xe5\x9b\xf3\x7a\xff\xe7\x9b\xf3\xf3\x6f\xfd\x9f\x7f\x8d\x7f\x83\x52\x62\x2f\xe6\x00\xf0\xb0\x15\xef\x57\x56\x39\xbd\x98\x14\xb9\xfe\xb5\x2c\x57\xa9\xc8\x5e\x4c\x0a\x68\xdd\x54\xfc\x3c\x7e\xc3\x07\xb3\x04\xc1\x83\x07\xd3\xab\xab\xe9\x44\x5b\xbe\xb3\xeb\x29\xc2\x0b\xb3\x11\xc1\xdc\x02\x7d\xe9\xe5\x68\x76\x85\x8c\x34\x06\xfe\xd6\x70\x5e\x23\xa9\xa9\x11\x3c\x71\x0b\x75\xec\x68\xce\x1a\xe0\xb9\xf0\x66\xed\x4a\xf0\xfe\x62\x31\x9d\x4d\x92\x2f\x2f\x06\x63\x42\x11\x46\xc6\xe8\xf9\xa7\xd1\x75\xdc\x18\x21\xa3\xd7\xce\x51\x00\x8c\x26\xd0\x2e\x86\xef\xd2\xe2\x42\xfb\x21\x2f\xb4\x1f\x72\xd1\x9f\x8f\xe6\xcd\xef\xf3\xab\xfe\x9f\x61\x08\xbe\x5b\x81\x3d\x81\x06\x10\xd8\x7f\xa6\xd1\x84\x11\xce\x9d\x34\xc8\xbc\xce\xed\x4c\x02\xdc\x76\xd9\x31\xe8\xb2\xd3\xae\xc4\xcd\x5c\x9b\x9d\x06\xcb\x15\x90\xac\x01\x8b\xf9\xb4\x3f\xb7\x58\xc7\x17\xc9\x78\xfa\xb9\xf7\x38\xa6\xf5\x68\xde\xb2\x1c\x01\xb8\x35\x3f\x3d\x19\x0c\xae\xc7\x27\x5a\xa0\x3a\x98\xeb\x98\xdb\xd7\xe2\x3b\x16\xc9\x00\xa1\xae\x3d\x8d\x87\x8c\xf5\x0c\xfb\xf8\x42\xae\x5b\x0b\x63\x6d\xa4\x2a\x12\x00\x07\xa4\x48\x3e\xf9\xba\xe5\x7e\x66\x1e\x9f\xb7\x7b\x93\x3e\x4e\x38\x0e\x40\x08\x48\x86\x31\x63\x17\x5f\x0c\x93\x30\x34\x60\x3a\x22\x61\xa2\xbd\x86\x37\xda\xd5\xf9\x94\x68\x91\xff\x65\x7a\x43\xd0\xd5\xe8\x74\x7e\x9c\x25\x09\x5f\x4c\xd9\x45\xc2\x2f\xa6\x37\x13\x6b\xbd\x84\x2b\x68\x11\xa5\x1d\x3e\xf3\x74\x86\x7c\xc5\x73\x78\x24\x74\x6b\xc2\xcb\x99\x56\x68\x88\xd5\x0c\x3c\x50\xa8\xe2\xe6\xa3\x61\xe2\x00\xb8\xbf\x4c\x6f\x66\x35\x00\x6d\x50\x32\xf8\x52\x32\x93\x86\x23\x38\xd0\x44\x27\x19\xf3\xa1\xc5\x5d\x57\x8c\x89\x98\x9f\x0c\x2c\xc0\x12\x74\x53\x5b\xfc\x7c\x00\xfb\x20\x5c\x2e\x80\x9b\x40\x40\x92\x74\x25\x32\x9e\x2a\xb5\x07\x24\x92\xea\x0e\x9a\xcc\x78\x51\x32\x99\xaf\x0e\x2b\xa8\xe9\x4d\x45\x14\xf2\x2c\x20\xd5\x49\x0e\xf6\xa6\xcc\xab\xb4\x94\x00\xbc\xc5\xf7\x39\x7a\x15\x12\xf1\x88\x89\x21\x08\x71\x3e\x04\xcf\xf7\xdb\x25\x26\xd9\x4d\x39\x6e\xee\x0c\xf6\x08\x49\xd0\xd2\x6a\x0f\xbd\xc7\x16\x73\x08\x11\xa2\xd6\x72\x27\xf3\xb5\xcc\x2b\x86\x9d\x71\x68\x6e\x6f\x95\xcc\xee\xa5\x42\xef\x45\x28\x25\xb7\xcb\x0c\x7a\x8a\x09\xcc\xc7\xae\xc3\xc3\x5d\x91\xc9\x98\xf7\x11\xef\x84\xba\xa3\x2d\xac\x10\x13\xbc\xb6\x66\x08\x7c\x42\xd1\x70\xfd\xc9\x74\x2d\x4b\xb9\xe6\x82\xd7\x5b\xd5\x4f\x05\x41\xfe\xcb\x35\xd6\x4c\x23\x72\x54\x13\x10\xd8\xa3\x7c\x65\x6c\x19\xf3\x93\xda\x93\xc2\x6d\xe2\x4b\xa1\x4d\x76\x00\x58\xb1\x0b\x5e\x94\xb5\x5f\x88\x7c\x4d\xb8\x72\xbb\x52\xbe\x00\xda\x59\xe0\x6b\xd3\x4b\xe4\x6f\x34\x80\x77\x65\xe4\xe9\x6d\xf7\x0a\xb6\x5c\x94\xa5\xc8\x91\x55\x20\xe2\xeb\x52\x6c\x45\x95\xfe\x07\x85\x01\x37\xc8\xd8\x23\x32\xf3\x1b\xbe\x2d\x20\xc2\xb8\x4b\x11\x4a\xe8\x1e\x41\x9f\x22\xed\xe3\xe5\x6b\x60\x5b\x05\xee\x46\xc0\x1e\xb2\x7e\x16\xc5\x14\xa1\x11\x05\xdf\xa3\xdd\x29\x99\x2b\x7a\x68\x13\x90\xa8\x79\xca\xc8\x83\x29\xe5\x4a\x28\x8b\x43\x06\x1c\x81\xf8\xfd\xb5\xd8\x41\xff\x3c\xd1\x41\x20\x54\x5b\xfb\x3e\x73\x7f\x9f\xd9\xf3\xf6\xb9\xb6\xa9\xcd\x3d\x35\x30\xd0\xe2\xbe\x48\x91\x4e\xbb\xd8\xf0\x75\xb1\x5f\x56\x91\x07\x02\x63\x38\x82\x84\xdd\x86\x55\xb1\xdd\x15\x8a\xa8\x15\x4a\x5c\x4f\xe6\xad\x27\xb4\xb9\x1f\xf2\xd5\x5d\x59\xe4\xb4\x1b\xa6\x94\xd9\xdc\xc2\x2a\xdd\xca\xf5\x0b\x64\xab\x33\x48\x9e\x82\x6f\x8b\xfb\x34\xbf\x65\xe9\x16\xd8\xf9\x4e\xe0\x19\x69\x7e\x0b\x70\x58\x8e\xc9\xf2\x19\x13\x66\xb5\x43\xbc\x8a\xf9\x09\xfe\x54\x94\xe6\xf4\x22\xce\xf4\x3a\xbd\x4f\xd7\x7b\x91\x21\xb3\x24\x50\xe4\xc0\x5e\x00\xde\x9c\x72\x63\x77\x3c\x96\xad\xc4\x92\x96\x17\x64\x1d\xf3\x93\x69\x99\xde\xa6\xb9\xc8\x28\x01\xfa\xe8\x0b\x1f\xee\x0a\x8b\x7d\x63\x5e\x18\x33\x26\x63\x7e\xe2\x5f\xb7\x00\x10\x09\xb0\x93\x0c\x24\x92\x80\xf7\x10\x75\xc6\x06\x56\xc9\xc1\xc1\x23\x9f\x6d\x73\xbc\x9b\x98\x9f\x7c\x29\xf6\x8e\xb3\xa4\x7d\x70\xf2\xab\x36\xa0\x94\x87\x3c\xdf\xc4\xca\x62\x7a\x06\x77\x02\xf1\xc9\x0d\x19\x6d\x76\xe0\xf7\x69\x91\xd9\x59\xb5\xae\x5b\x1d\xef\x8c\x99\xf9\xc3\x8d\x31\x8f\x2d\xe5\x4a\x82\xc3\x6f\x30\xf4\x3d\x54\x08\x0b\xf4\x66\xf6\x17\x82\x07\x38\x68\x8b\x06\xde\x02\xef\xb5\x96\x6a\x97\x6a\xa1\xed\xd8\x73\x71\xb8\x18\x1b\x38\x8f\xf9\xa5\x48\x4b\x7e\xa3\x24\xc1\x70\x00\xa6\xdf\x1d\x11\x2a\x53\xe0\xc5\xe3\x3f\xad\xb4\xd0\x27\x3e\xe7\xf5\x7e\x25\x23\x44\xe7\x07\xaa\x92\x52\x22\x15\x2c\x88\x10\x83\xdf\x4f\x34\xdf\x30\x7e\xe0\x8f\x05\x38\x0f\xa4\x5e\x53\xc0\x6e\x6b\xc2\x31\x1e\xcc\x3f\x23\x99\xea\x30\x26\xe9\x71\x75\xc0\x2c\x64\x53\xb1\x6c\x31\x16\x16\x0d\xb9\x65\xe1\xb9\xcc\x43\xe1\xca\xc4\x83\xc2\x20\xbe\x59\x9f\x8f\xa5\xc8\xab\x98\xcf\x7d\xe4\x4a\xb3\x89\xc7\xc9\x91\x23\xbb\x15\x2c\xc4\xd1\xfc\x52\xec\x0d\x78\xe6\xa3\x28\xca\x91\xde\xe3\x9d\x04\x64\xcc\x53\x43\x8b\xb0\xde\x97\x81\x54\xf1\x26\x60\xa7\xd8\x73\xdd\x41\xee\x1c\xc0\xa7\x69\xa5\xd2\x9c\x39\xad\xa4\xb8\xaa\xe0\x84\x82\x42\x7c\x0f\x56\x09\x6c\xa1\x1f\x7d\xc3\xf3\x58\x15\x3e\x93\x81\x2f\xd5\xaa\x02\xa9\xcf\x4a\xa4\xf8\xaf\x09\x6e\x45\x70\x24\x6d\x4f\xd5\x03\x08\xe8\x11\x28\x36\x57\xd3\xf1\xea\x03\xe8\x61\x1f\x59\x44\x1a\x34\x95\xa2\xe4\xbb\xbb\x22\x2f\x50\x0e\x2b\x20\xe2\x59\xa7\x6a\x97\x89\x03\xe1\x93\x64\x87\xc8\xd0\xd3\xbb\xdf\x40\x1c\xb6\xfe\x5b\xbe\x3c\x90\x34\x00\x42\xe1\x75\x7a\x9b\x56\x5a\xfd\xee\xd7\x69\x81\x9a\xd9\xa2\xcf\xb8\xd9\x1b\x76\xf2\x96\xa9\xb4\x4c\x63\x61\xa3\x99\xb4\x1d\xa4\x34\xcd\x4e\xad\x0d\x58\x0c\xd0\x31\x58\xba\x08\x51\x29\x8b\x4c\x98\x17\x0f\xfc\xd7\xbc\x78\x00\xa6\x76\x7d\xc2\x10\x42\x6f\x2d\xef\xf5\xf7\x89\x6e\xda\x7f\x85\x69\x01\xab\x7c\x92\x02\x47\xc9\xbb\x0d\x70\x74\x05\xf5\x74\xc9\xd5\x5d\xae\xb5\x5e\x76\xe0\x01\x95\x6f\xfb\x91\x32\x81\xd3\xfa\xa0\x23\xb6\xdc\x57\x1e\x08\xe9\xa1\xd8\x5b\x66\x5d\xfa\xb2\x19\x4b\x4d\xab\x85\xb5\x9a\x79\x51\x31\x47\x0a\xeb\x81\x1a\x5a\xa9\x27\x4a\x4b\xc2\x6f\x62\xef\x91\xdb\x1d\x5e\x63\xb4\x35\xc4\xdd\xf4\xf8\x80\x05\x89\x48\x2c\x14\x7f\x7d\xba\xee\xc1\x64\x5e\x9f\xca\x5e\xcc\xd8\xeb\x98\xcf\x48\x92\x41\x31\x29\xf0\x6a\xd7\x70\x16\xdd\xf7\xf9\x2b\xda\x85\x80\x9c\x1b\x40\xd6\xa8\x95\x4f\x0f\xc2\xd2\x98\x38\x68\x51\x17\xb4\x2e\xbd\xb7\xe1\xdd\xd4\x22\x44\x9f\x18\x77\x0f\x22\x77\x7a\xe9\xd8\x7b\xbf\xa1\x03\x1e\x39\xb0\x1e\xf8\x18\x1c\xeb\xec\xc0\xcc\xf9\x77\x66\x6b\x9e\x1d\xea\xaa\xb3\x9d\x29\x19\x06\xe2\xa1\x1c\x32\x0b\x5c\x08\x2f\x23\x50\x21\x78\xfa\x4c\x52\x76\x61\xa4\xbd\x02\xed\x72\x80\x05\x19\xb5\x28\x42\x79\x2f\xcb\x03\xc3\x07\x05\xf7\x3a\xb0\xa3\xf4\xbb\x9f\xb6\x00\xec\xf8\x02\x98\xf5\x71\xeb\xaa\x8f\x08\x42\xed\x22\x4d\x0d\x22\x42\x1d\x8c\x11\xe1\x5d\x7c\xb4\x5e\xb3\x0a\x3f\x6a\x35\x5c\xb7\xa6\xa7\x55\x29\x2d\x90\xf2\x77\xcc\xde\x25\x43\xe2\xdd\xe4\xee\x80\xcd\x08\xc7\xa7\x60\x1e\x28\xe2\xad\xb5\x64\xf7\xe3\x57\x29\x77\x5a\x26\x0b\xad\x6e\xd1\x62\x06\x86\x64\x18\x2f\x50\x33\x1b\xa2\x73\xee\x13\x29\xd3\x7d\x70\x69\x12\x6d\x31\x3d\x80\xe3\x01\x9d\xa1\xc1\x08\x9e\x79\xfa\xd8\xd1\xc5\x77\x4b\x8a\xd6\x30\xac\x36\x21\xa8\x80\xd9\xbd\x95\x42\xed\x4b\x9a\x02\x33\x94\x6f\x62\xb5\x22\x36\xa1\xbd\x5b\x40\x63\x66\x0b\xbe\x15\x79\x0e\xb9\x1e\xb0\x9c\x55\x65\x10\x42\xbb\x4d\x42\xde\xbf\x2d\x25\xf8\x58\xbe\x08\x05\x15\x2b\x95\x59\x9f\x0e\xa5\xd5\x74\x4b\x23\x90\x38\x48\x33\x57\x48\xe5\xe3\x40\xb6\x69\x38\x2e\x80\x0f\x88\x50\x5d\xcc\x44\x2a\x25\xb3\x0d\x47\x36\x6b\x5f\x70\x84\xd6\x48\xdd\xb4\xe5\xa3\x0d\xec\x16\x9a\xd4\x6d\x43\x03\xd7\x94\xd2\x9c\x60\x7f\x39\xd4\xf0\xa2\xb4\x57\xdb\x32\xd8\x18\xe6\x9a\x52\xac\x2a\x62\x07\x66\xa5\xdc\xea\xe5\xb1\xd6\x67\x63\x3e\xf9\x41\x0f\x60\x9d\x56\x1c\x0c\x58\x62\xf1\x5e\x02\xbc\xb7\xde\xb1\xd7\xa7\xab\x5e\xc4\x85\x62\xfa\x6f\x52\x21\x51\xe9\x32\x3c\x67\xf6\x7e\x78\x28\xbc\xb5\x3b\x52\x15\xf0\x8d\xa6\xd8\x65\x29\x82\xe3\xd2\x41\x80\xe3\x9f\x2a\xbe\x2b\xd3\xad\x28\xd3\xec\xe0\x4c\xd6\x4d\x41\xc8\xdd\x16\xcc\xf7\x41\x94\x6b\xa0\x18\xc4\xd8\x29\x13\xeb\x7b\x91\x57\xda\x39\x43\xb4\xe7\x7b\x6d\x00\x6d\x8b\x5c\x56\x5a\x29\x6a\xb7\xd0\x38\xca\x78\x74\xe4\x57\xc4\xc4\x0c\x8e\xe5\xc6\xda\x9d\x75\x54\x57\x15\xd8\x1d\xc6\xea\xd8\xa4\x99\x7c\xa1\xee\x44\x49\x60\x6b\x4e\x89\x22\xac\xae\x56\x89\xa1\x67\x88\x07\xe5\xe9\xf3\xe2\xfe\xbc\xd8\xd1\x79\x05\xa0\x77\xda\x43\x06\x32\x26\xbe\x13\x07\xa0\x3a\x24\x24\x50\xf3\x55\xe6\x7f\x15\xd9\x2b\xf2\x9c\xb6\xc7\x5e\x42\x7f\x91\x1a\x2b\x82\x3e\xeb\x68\x03\x06\xc3\x1f\xa3\xec\x22\xde\x29\x33\xeb\x89\x66\x65\x5d\x6c\xfd\x45\x34\x1d\x71\x39\x22\x5e\x4a\xa1\x8a\xdc\xe0\x52\xeb\xcf\x68\x23\x68\x0f\x50\xd3\xb8\xa7\x60\xf6\x97\x92\xef\xab\x34\x4b\xff\x23\xcd\x6f\xdf\xf3\xd3\x14\x18\x2d\x98\xdf\xed\x5c\xf3\x9a\x91\x93\x42\xc9\xfd\xba\xc8\x0f\xdb\x1a\x3b\x77\x4f\xff\xa8\xf6\x20\x9b\x80\x06\x6a\xfd\x7d\x51\xb2\xd3\x34\x85\x3f\xb4\x3d\x8d\xf2\xdb\xf6\x92\xaf\x0d\x31\x9c\x85\xe3\x46\x48\xfe\xa2\x34\x60\x00\xec\x54\xc6\xb7\x31\xa0\x17\x17\xf0\x15\x0b\xee\x4d\x6b\xae\xc0\x19\x44\x37\x39\xe2\xbf\x14\xfb\x32\x17\x19\xa1\x9d\xbb\x34\x84\x96\x8e\xe6\xad\xdf\xa9\xb6\x32\x02\x23\xc4\xb4\xd1\x06\x98\xca\xa5\xbe\x0f\x38\x28\x6f\x75\x61\x31\x01\xf5\xda\xa6\xd9\xc1\x7c\xad\x8f\xfb\x03\x8a\xc6\xb4\xca\x6a\x6a\xc1\xad\xd8\x07\x08\xc7\x85\xd2\xcd\xbe\xe9\x10\x08\xba\xc7\x2c\x19\xbd\x31\x4c\xe4\x87\x08\x25\x8c\x5d\x5f\xca\xbf\xa3\xe6\x58\x42\xc8\x13\xf1\xc1\xbc\x52\x02\x12\xc6\x08\x66\x0d\x73\xb9\x99\x8d\x98\xa7\x2e\x36\x8e\xa8\xad\x51\x9e\x52\x94\x64\x7b\xa2\x47\xee\xfa\xa4\xfc\xa3\x1a\xb3\x39\x30\x99\xa0\x20\x26\x57\x23\xdd\xee\x32\xd0\x73\xe4\x6c\x68\x9f\xdc\x5b\x66\x90\x97\x1f\xec\x7d\x8f\xf8\x5d\xf1\xa0\xed\xb2\x08\xdb\x97\xc8\x43\x5b\x09\xd4\xba\x2d\xda\x05\xa2\x7a\xdb\x34\x07\xd6\x33\xe5\xbd\x1f\x82\x59\x08\x5f\xc9\x30\xce\xe6\x03\x8c\x6f\x77\xa2\x84\x11\x78\xd1\x1c\xa3\x41\x08\x47\x93\x28\x08\xac\x76\x17\x15\xcf\xa4\x50\x95\x76\x5a\x76\x65\xb1\x4d\x73\x40\x8a\xa7\xc5\x7c\xfc\xc1\x7e\xd4\xea\x77\x08\x0a\xbe\x67\x2c\x8d\xf9\x35\xca\x19\x78\xc4\x0c\x1c\x7c\x7d\x0a\x6e\xc0\xa8\xbe\xc8\x44\xfe\xab\x34\xc7\x44\x9b\x55\xf6\xc0\x90\xd3\xa2\xc2\xf0\x06\xb3\xfe\x1a\x85\xc8\x1d\x6d\x9c\x8b\x56\x21\x5b\xf2\xbd\xf6\xbc\x8c\x10\x84\xb7\x1b\xe7\xa6\x58\xa5\xb2\x3a\xd0\x7d\xee\xcf\x07\xfd\xeb\x88\x5f\x5c\x8d\x22\x3e\x4f\xe6\xfd\x41\xcf\xc4\x21\x52\x4f\xce\xa1\xfc\x0c\x9e\x66\xa5\xaa\x91\xa9\xcc\xff\x2b\x3e\xfc\x41\x2e\x57\x42\x55\xbd\xfa\xc5\x83\x93\xe3\x7f\xbc\x55\x13\xb3\xe7\x69\xac\x47\x34\x31\x63\x69\x1a\xf3\x2b\xa9\xb5\x0c\xec\xd4\xcc\x11\x47\xce\x2b\x51\xed\xab\xa2\x3c\xb8\x1d\xfa\xfd\xb7\x02\x4e\x88\x0d\x77\xdd\xca\x7c\x05\x7f\xb4\x92\x77\xcd\xf4\x2f\x2b\x5a\xba\x4f\xa2\x2c\x0f\xfc\xb2\xf8\xca\xfb\xf0\xd1\xc6\xb6\x00\x48\xad\xe7\x11\x39\x13\xaf\x66\x36\x9e\x9e\xac\x8a\x7b\x59\x9a\xc0\xff\x49\xaf\x06\x8b\x1b\xd5\xcd\x48\xa0\x52\xc8\x94\x5e\x0e\x72\x2c\x98\x09\xc7\x2e\x0f\xfc\xec\x1d\xbf\x99\x0f\xac\x79\x75\x76\xf6\xc6\xa2\xc6\xce\xbd\x4a\xe8\xfe\xaa\x02\x95\x05\x6b\xf6\xef\xfb\xf4\x5e\x64\xc8\x08\x41\x69\x8f\x5f\xfe\x2f\x7b\x6f\xb3\xdc\x46\x92\xa5\x89\xde\xb5\x3f\x85\x9b\xcc\xae\x51\x1a\x0b\x22\x45\x4a\xca\x1f\xe5\x0a\x22\x21\x09\xdd\x10\xc9\x06\xc0\xcc\xd2\xae\x1c\x11\x0e\xd2\x53\x81\x08\x28\x3c\x82\x14\x7a\xd5\xef\xd0\x2f\x50\x36\x8b\x3b\xc9\x19\xb3\x59\xdd\x4d\x5b\xef\x9a\x76\x5f\xa4\x9f\xe4\xda\xf9\xf1\xbf\x40\x90\xca\xaa\x9e\xaa\x19\x6b\x4b\x99\x55\xa5\x44\x02\x11\xc7\xdd\x8f\x9f\xdf\xef\x9c\xd3\x35\xc6\x16\xec\xcc\x3e\xa3\xa1\x8e\x75\xd7\xec\xf5\x8a\xe5\xd1\x4b\xd1\x02\x12\x66\x11\x7f\xa1\x79\xf3\x55\x66\xd1\x23\xf9\x33\x71\x2f\x08\xd4\xaf\xf1\xca\x23\xd2\x42\x0c\x49\x8b\xbd\xdc\xcb\x57\x98\x8d\xd8\x46\xfc\x45\xf7\xfe\x30\xbd\xf7\xc4\x5f\x62\x01\x14\x4c\xd8\xe6\x7a\xec\xce\x3b\xfb\xf3\xe1\xdb\x2d\xa2\xdb\xfd\x1b\x98\x49\x3e\xc6\x4c\x2f\xc5\x9f\xc5\x4c\xf2\x51\x66\x12\x8f\x2c\xe1\x6f\x60\xfb\xa3\x36\x79\x35\x92\x73\xbd\x85\x53\x65\x68\xa1\xcd\xe4\xcf\xde\x8f\x46\x8e\x3a\x0d\x4e\xb6\xb8\x3c\x9b\x21\x58\xce\xa1\xa0\xe4\x87\xcb\xe5\xe5\x78\x36\xfb\x48\x79\x6d\x9f\xcc\x46\x6c\xdb\x64\x21\xa7\x67\xf2\xe7\xf9\x74\x89\x58\x31\x9f\xc5\x3e\x7f\xfb\x76\x32\x5f\x04\x90\x01\x42\x21\x30\x09\xed\x51\x0f\xf3\xc9\xc5\x7c\xb2\x98\x9c\x2d\x09\x63\x21\xcf\xe7\x3d\x78\x9d\x9b\xd7\x2b\x4f\xce\xcf\x4e\x26\xf3\xb3\xe9\xd9\x3b\xff\xc0\xcc\x81\xfa\x32\x07\xe9\xcb\xe4\x62\x39\x5e\x5e\x2e\x11\x17\x16\x81\xb8\x12\x7c\x9f\x1b\x0b\x8c\x58\x36\x7c\x6f\x26\xd2\x97\xe2\xa4\xe6\xcc\x43\xfb\xa6\x0e\x5c\xf6\x35\x5c\x5f\x26\xcf\xce\xcf\xa6\x67\x6f\xe7\xd3\xb3\x77\x88\x8b\x23\xa0\xd9\xfb\x89\x1c\xbf\x59\x4c\x38\x1f\x3f\xa3\x91\xbf\xbe\x49\xf1\xe9\xe4\xed\xe4\x64\xb9\xc8\xe4\xf8\xe4\xe4\x72\x3e\x3e\x61\xa8\x32\x6c\x2e\x6e\x0d\x7d\x8b\x1f\x20\xce\xdf\xca\xc9\x7c\x7e\x3e\xdf\x9f\x7e\x7d\x3a\x5d\x9c\x9c\xff\x34\x99\x8f\xdf\xcc\x26\x23\xb9\x38\xff\x30\x91\x7f\x77\x39\x9f\x2e\x4e\xa7\x27\xb4\xb7\xa7\xe7\x04\xa0\x99\xcd\xce\x7f\x46\xe8\xda\xe4\x0f\x27\xb3\xcb\x05\x23\x07\x86\x40\x91\x8b\x73\x42\x0f\x84\x0f\x7e\x18\x7f\xa4\x87\x5c\x5c\xcc\x3e\xca\xe5\xb9\xfc\x78\x7e\x39\x12\xe2\x5b\x50\x53\x2e\x1b\x22\x71\xa4\x87\x5a\x99\xd2\xb4\xbb\x11\x7c\x79\x72\xb1\x74\xc8\x89\xc9\x1f\x96\x84\xaa\xc1\x91\x1a\x1e\xc5\x1f\xd0\x1d\x99\x88\xc1\x90\x3f\x4f\x67\xb3\xc0\x50\x01\xfb\x4e\x6f\x76\x48\x40\xc2\xfc\x30\x1e\xb0\xdf\xa8\x3a\x41\xc3\x27\x48\xc7\x4c\x5e\x5c\x9e\x4d\x11\xbf\x72\x3e\x0f\x90\x48\x8f\x9f\xe9\x75\x8b\xee\x43\x48\x12\x28\xb8\xe7\x48\x06\xfe\x79\x9a\xdf\x8f\x17\xf2\xcd\x64\x72\xf6\x08\x14\x50\xa4\x50\x40\x06\x66\x7c\x37\x92\xcb\x68\xe8\x8c\x50\xe0\xc4\xf7\xc3\x63\x8f\x44\xe7\xc8\xae\xf5\x63\x70\xc0\xcc\xac\xc1\x16\xc7\xe0\xb9\xc0\x58\x0b\xe8\xee\x55\x83\x43\x3f\x56\x3b\xd4\xdc\xfb\x93\x9f\x93\x08\x8e\x97\xf1\xd6\xa7\x22\xc1\x25\xa3\x84\xe0\x8d\x0e\x19\xc1\x7e\x8a\x81\x22\x32\xf0\x86\xfd\x9c\x5f\x30\xe5\x91\x64\x01\x4e\x06\x3e\x8d\x4a\xd7\x59\x5c\xdb\xb0\x94\xa8\xac\x08\xd5\xb2\x19\x26\x4b\x36\x7a\xa3\x4c\x25\x4c\x25\xd7\x5d\x49\x26\x71\x69\x50\xea\xb2\xaf\x53\x5b\x1f\x29\xb7\xa3\x10\x60\x3f\xca\xe4\x71\x26\x5f\x65\xf2\xdb\x4c\x7e\x47\x71\xe5\xef\x89\x34\xdb\x35\x37\xb0\x26\x17\x7b\x8d\xc6\x3e\xee\xe3\x33\x7a\x39\x3a\x0a\xdc\x0d\x65\xea\xc8\x9b\xeb\x87\xec\x39\x9e\x21\xd2\x84\x9b\xfc\xad\x09\x37\xe7\x11\xc1\xf6\xef\x0f\x3e\x13\x9e\xa2\x87\x74\xbe\x37\x2b\x1b\x0d\xce\x8c\xee\xe7\xdc\x0b\x83\x29\xed\xaa\x15\x69\xdb\x3f\x1e\x39\xd6\xd6\xdb\xc8\x86\xe2\x71\x2f\x14\x82\xa3\x7c\x6b\x6b\x36\x7a\xc0\x9d\x23\x6f\xce\x8f\xa8\xf3\x53\xc3\x3d\xcc\x02\x49\x84\x57\xb8\xc1\x4a\x69\xb4\xf4\x69\x8c\x08\x09\xa4\xc1\x43\xdd\xa4\x1f\x8c\xc4\x98\x28\xfa\x87\xae\x70\xb6\x37\xe7\xad\x77\x0d\x1c\x6a\xee\x99\x9b\x63\x90\x64\x09\x90\xbf\xaa\xd6\x54\x1d\xd6\x50\x20\xc3\xad\x6b\x57\x47\x41\x03\x8b\xfc\x80\x28\xcf\xc8\x22\x64\x3a\xf1\x30\xe8\xe6\x7f\x3f\x92\x1f\x8c\xcd\x75\x59\xaa\x4a\xd7\x1d\x81\xb2\x70\x8a\x10\x0e\xe3\x4e\xf3\x0c\x8f\xa7\x10\x12\xe8\xcf\x1e\x78\x25\x4b\x33\xf4\x0e\x5c\x51\xa7\x19\x01\xa9\xe2\xdc\x6d\x94\x94\x21\x64\x89\xda\x38\xf0\x45\x2f\xff\xac\xec\x20\x5f\x73\x68\x74\x5f\x0e\xd0\xad\x99\x52\xcc\x0e\x19\xc3\x0e\xdc\x2d\x1e\x65\xa4\x4a\x83\x15\xc8\x5d\xa5\x2b\xdc\x67\xe4\x7e\x7a\x68\xb8\x0e\xa2\x54\xb7\x99\x34\x6d\x88\x4d\x4a\x45\x47\x01\x94\xe1\x43\x0c\x45\x69\xfc\x53\x50\x6b\xf9\xa8\x2e\x4a\x90\x02\x21\x67\xe2\x2b\xa9\x27\x3f\x9d\xa3\x6b\x68\x7e\x3a\x8f\xbb\xa7\xec\x19\x47\x81\x5c\x92\x43\x28\x17\xd5\x67\x94\x55\x58\xaf\x9f\x4e\xd6\x68\x42\x29\xf9\x00\x1e\xc7\x2e\x38\x32\xe4\xd3\x9f\x22\x49\x9b\x86\x07\xd1\x1e\x21\xfb\x85\x2d\xa2\x08\xe6\x59\x8d\x2b\xe1\x2a\x8e\x07\x36\xda\x13\x52\x00\xa5\x85\xbc\x55\x28\xda\xe1\x81\x55\xcd\x7a\x43\xe4\x75\x65\xb5\x3b\xd7\x38\x66\x84\x9f\x6e\x78\x68\x14\x7c\x24\x3c\xcf\x54\x58\xf8\x81\x63\xf0\xaa\x42\x82\xdf\x19\xa6\xaf\x52\xdc\x8c\xa2\x53\xf9\xb5\x6a\xae\x5c\x68\x6a\xf8\xa9\x23\x21\x8a\x9e\x62\x8c\xf1\x5a\x68\xa9\x23\xbc\x50\xfa\x1d\x97\x2b\xdd\xde\x6a\x5d\x25\xe7\x82\x6d\xaa\xa3\x41\x62\x9e\xcd\x4b\x37\x8f\x12\xe4\x31\xc6\xd1\x1b\x6a\xa9\x5d\xd5\xc4\x6e\x4e\xa4\xda\x2c\xbc\xc2\x12\xbc\x24\xb1\xb7\xf7\x66\x08\xfa\x57\xa0\x58\xe3\xc0\x9c\x7b\x4f\x88\xd8\xc1\xae\x09\x06\x98\xad\xd0\x5f\xe3\x49\x8b\xaa\xa0\x9b\x46\x43\x4a\xe9\x10\x39\xa1\xb6\x51\xbb\x68\x20\x0b\x0d\xa1\x8c\xfa\xc4\x08\xa7\x8d\x7b\x3b\x17\x15\xf0\x7b\x14\xa6\x63\x6b\xe4\xc0\x0e\xf5\x90\xab\xda\xf1\xcb\x75\xce\x52\xc8\x7a\x53\x2a\x76\x24\xc4\x1e\x14\xdc\x50\x14\x51\x85\x83\xde\xbf\x4a\xc0\xcd\x18\xc8\xe7\x4c\xdf\x4e\xde\x5e\xab\xd6\xd6\xa8\x20\x1e\x88\xdb\x63\x5c\x51\xee\xbd\x2e\x86\xe7\x95\xc6\xc5\xc3\xd1\xd4\xe1\xa9\x9a\x14\xa7\xa5\x5d\x2a\xf5\x95\x2a\xe1\x71\x35\x55\x7d\xe1\x0f\x0b\xb5\x51\x38\xca\xce\xd3\x10\x67\xf0\x5d\x65\x53\x40\x03\xe1\x97\xae\x74\xa5\x1b\x55\x66\x74\xb0\xf0\x17\x53\xe5\xa6\x00\x6e\x28\x3d\xfb\xe2\x04\x33\xa3\x4a\xff\x0a\x46\x1f\xf5\xd6\xe8\xf6\xa8\x74\x76\xd8\xa3\x53\x4c\x65\x7b\x5b\xe3\x40\x62\xbc\x97\x55\xae\x6d\x26\xcc\x7a\x7f\x67\x40\x1d\x06\x00\x80\x71\xa1\xe3\xc2\xe5\xf7\x58\x7c\xfb\x33\xf5\x86\x65\x26\xbc\x40\x45\x33\x4d\x05\x3c\x04\xb6\x85\x58\x95\x3c\xdb\x10\x05\xa5\xfb\xfe\x48\x88\x09\x01\x2c\x9d\x15\xe3\xf0\x05\x11\x20\x12\x2c\x39\x60\x51\x9a\xd7\x13\x79\xff\xbe\x8a\x90\x63\x17\xc2\x5f\xcb\xa0\xad\x4f\x4e\x2e\x66\x99\xac\xb8\xee\x8d\xce\x15\x8f\xbf\x63\xeb\xc5\xf7\xfd\x95\x4f\xfa\xbb\xf1\x44\xf0\x61\x23\x06\x12\xa4\x99\xff\x6c\xdd\x50\x7b\xe1\x7a\x60\x0f\xe3\xcb\x91\x54\xb4\x39\xb9\x38\xf4\xad\x91\x1c\x57\xbb\xa8\x46\xbe\x73\x06\x04\x89\xc6\x9e\x99\xba\x77\x83\x0e\xe0\x6d\xd5\x61\xde\x35\x60\x7d\x45\x84\x76\x56\x5d\x69\x79\xd5\x99\x42\x97\xa6\x42\x50\xb3\xc7\xf1\x70\x66\x44\x17\xa2\x26\xcc\xf5\xad\x5e\x59\xd3\xea\x34\x83\xd7\x9b\xad\x8a\x3e\x02\xe7\x41\x39\xa5\x0a\xf6\x07\x9c\x8c\xd9\xe8\xa1\xcb\xcd\x6f\xc3\xa9\x7f\x18\xb8\x00\xb3\xab\x6d\xb7\xaf\xbf\xf9\x26\xe7\xcf\xe6\xbc\x09\x75\x73\xf5\xcd\x7f\xaa\xa2\xa7\xdf\xff\xf8\x3f\xa3\x6f\x4e\x26\x27\xd3\xd9\xec\xf0\x68\xf4\xfc\xaf\x35\x01\xf0\xf1\xfa\xaf\x57\xc7\xc7\xc7\x2f\xfb\xf5\x5f\xcf\xbf\xfd\x7d\xfe\xdf\xdf\xe4\x0f\x55\x5e\x2e\xe5\x29\x97\xb4\x9c\x4c\xf0\xaf\xe7\xef\xa6\x27\xd3\xc9\x4c\xce\xa6\x6f\xe6\x13\x79\xa2\x81\x45\xe4\x98\x46\xb7\x59\x32\x24\xc4\x09\x49\x8f\x46\xb5\x12\xa4\x4e\x57\xb1\x03\x91\x83\x19\x2a\x11\x7b\x63\x74\x29\x4b\xb3\x42\xef\xd8\x76\x5a\x16\x07\xf0\xa9\xbc\xae\x72\xdd\xb0\x06\xd6\x55\xdb\x68\x61\x41\xa3\x76\xad\xee\x1a\x2b\xd5\xda\x54\xf2\x73\xa7\x65\xa9\xbd\x0d\x56\xc0\x33\xbb\x2f\xe8\x99\x14\x18\x87\xad\x72\xb3\xd5\xf0\xb7\xfb\x3b\x6b\x0a\x2d\xef\xff\x24\xad\x92\xcd\xfd\x5d\x41\xd6\xfc\x6b\x21\xfe\xfd\x9f\xfe\x2b\xbf\x11\x34\x4c\x06\xbf\xcf\x6b\xcc\x73\x9a\xf6\xfe\x4e\xaa\x4e\x16\x4d\x6d\x40\x5e\xaa\xea\xfe\xbf\x29\x03\xde\xbd\x02\x27\xaa\x93\x8d\xbe\x52\x4d\x21\x0b\xf7\x91\x02\xfc\x13\xa4\xa6\xae\x2c\x79\x1e\xf7\x77\x32\x37\x37\xa6\xd4\x48\x6b\xf4\x49\x59\x2a\x1c\x5c\xdb\x98\xfb\x3b\xf8\x54\x98\x51\x0f\xff\x91\xda\x3d\x6d\xdb\xd4\x2d\x9b\x0d\x9f\xbb\x03\x53\x82\x53\x07\x06\x6b\xf7\xc5\x6f\x85\x6e\x25\x98\xc7\xa5\x32\x8d\xb6\xb2\x80\xff\xc1\x4b\x70\x36\x76\x63\x36\x75\x65\x54\xf7\x45\xd8\x0e\x9c\x2b\xbf\xe3\x23\xb7\x72\xd5\xb5\x8d\x5b\x7b\xb2\x97\xf1\x06\xc2\xce\x9a\xf5\xba\x43\xbf\x02\x7e\xe5\x1e\x63\xe9\xe4\xec\x6b\xa1\xf2\xfc\xfe\x57\x38\x1f\xaa\xee\xa7\x0c\x76\xe6\x48\xb9\xbf\x6b\x75\x55\x74\x58\x8b\xbe\xbe\xbf\x83\xf3\xc0\x35\x20\x58\xc1\x2a\x5c\xc8\x48\x88\x59\x74\xc2\xb4\x47\x8e\x59\x88\xbb\x8e\xa4\xad\xab\xf6\xb5\x10\xa0\xa0\x0c\x78\x4b\x46\xb5\x70\xaa\xe5\xc1\xa4\xd2\xcd\x95\xd1\x72\xdc\xd6\x1b\x03\x9b\xfd\xef\xff\xf4\xcf\xf2\x64\x32\xce\xe0\xdd\x0a\xb4\x25\xb1\xa4\xcf\x3f\x68\x99\xab\x46\xe5\xed\xfd\xaf\xc0\x5a\xb9\x21\x7b\x09\xbe\x49\xa0\x54\xf8\x9b\x6e\xc1\x84\xe9\xc0\x37\xd7\x65\x26\x8b\xba\x6a\x61\x93\xac\xb9\xff\xf5\x4a\x23\x43\x5b\xd3\x76\xf7\x77\xf2\xc5\xd1\xe1\x8b\x17\xb2\x81\x33\xc6\x63\x7b\x7b\x7f\x57\xdc\xdf\x35\x0c\x6a\xf9\xee\xd5\x77\xaf\x8e\xe5\xc5\x78\x3e\x5d\xc8\x5c\x17\xfa\x8b\x3c\x7a\x05\xea\x16\xd9\x5a\x9e\x29\xb6\xfa\x69\xc5\x73\x9d\x5f\xeb\x26\xbf\xd6\x54\xde\xef\x88\xc2\xe5\x9c\xcd\x17\x0f\xac\x47\xdc\xff\x29\x5a\x8f\x4c\xd6\x03\x0c\xe2\xa1\x6e\x9f\x3b\xfd\xe8\x42\x70\x11\x1f\x4c\x7e\xad\xcb\xc3\x71\x75\xa5\xc5\x77\xaf\xbe\xfb\xe1\xa5\xbc\xc0\x31\x0c\x4c\xfc\xb7\x23\x21\xa6\xec\x94\x25\xe4\x07\xda\x75\x15\xba\xaa\x32\x0d\xba\x92\x63\x8e\x59\xba\x05\x4d\xcf\xe6\xd3\x71\x26\x86\x4f\xe8\x3f\xb0\x22\x11\xad\xe8\xb4\x06\x9f\x1f\xc5\xcd\x4f\x75\xd9\xe5\x5a\x75\x99\x9c\xd7\x39\x18\xeb\x79\xdd\x01\xdf\xbf\xb9\x90\x47\xcf\x5f\x65\xf2\xbb\xef\x8f\x5e\xbd\x90\x33\x2d\x4f\xae\xb5\xad\xd4\x8e\xd6\x3b\x12\xe2\x62\x3e\x19\x7f\x78\x73\x39\x9b\xfc\x99\x02\x8d\xa8\x3a\xa8\x31\x70\x68\xd6\xf8\x8d\x42\xbb\x4b\xa0\x1b\xd1\xbf\x03\xc4\xf2\x2b\xdd\x80\x4c\x28\x74\x02\x9a\x26\xa1\x20\x9b\xb4\xc3\x53\xd1\xf9\x97\x8a\xe6\xfe\xee\xca\xc0\x5d\x96\xb9\x6e\xdb\x88\x30\x55\x59\xd8\x9c\x5c\x15\x0d\xc9\x57\x78\xf0\xfd\xaf\xa5\x4e\x6f\xf6\xbf\xfd\x8f\x7a\xab\x5d\xc3\x90\x7f\xfb\x57\xb8\x90\x07\x04\x8e\xa3\xd5\xe5\xda\x7a\xea\x2c\x2e\x46\x59\x5b\x37\xad\xa1\x5f\xe2\x6c\x4e\x1c\xfc\x51\x9b\xc6\xe2\xb5\x54\xec\xf3\x83\xd0\x10\xc9\x42\x51\x80\x17\x9a\x64\xb3\x6e\x6e\x34\x10\x8d\xc1\xb3\xae\x25\x29\x42\x42\xc0\xf6\x16\x6c\x65\x57\xb6\xf7\x77\x8d\xd1\x5d\x83\x63\x3b\x66\x07\x84\xd1\x34\x4e\xe0\xa6\x22\x08\x76\xad\x0c\x32\xb1\x60\x44\x7f\x36\xb0\xbb\x62\x7f\x77\x3f\x77\x06\xf8\xb6\xb8\xbf\xcb\xeb\x0e\x93\x83\x70\xa2\xdb\xba\xe3\x5a\x45\x4d\xf1\x06\x78\x58\x75\x00\xa2\xd9\x34\x7b\x72\x4d\x7c\xee\x50\xbf\x5c\x29\xca\xce\x91\xa3\x74\x7f\xc7\x52\x5e\x56\x1a\x0b\x53\xb4\xdc\x6a\xab\x1b\x09\x82\xba\x3c\x20\x29\x18\x9f\x2e\x88\x67\xe1\x05\xfd\x43\x72\xde\x2d\x17\xd4\x27\xa8\xb9\x0a\x9b\xfd\xd1\x06\xad\xad\x64\x52\x7a\x3a\x4a\x20\xae\x58\x83\x0e\x1a\x09\x31\x06\xee\x91\xf7\x77\xa8\xdc\xca\x03\x05\xfe\x0f\xb1\x9a\x96\xe5\x41\xb4\x32\xe2\x80\xb6\x35\x0d\x2c\x06\xe9\x86\xe3\x32\x16\x3c\x0c\x86\x22\xdd\xdf\x59\x01\x07\x82\x5c\x40\xf1\x31\x14\xd7\xee\x31\x28\x1f\x89\x53\x7a\xa7\xf1\x4d\xdd\xa1\xf6\xbd\xbf\xc3\x39\x32\x5b\x92\x0d\xba\x15\xf4\xe9\xb8\xa2\x30\xde\x26\x64\xff\x94\x4c\x10\x2f\x55\x0b\x97\xb1\xba\xbf\x03\x05\x6f\xb7\xf7\x77\xd8\xb6\x04\x17\xbf\x77\x6d\x33\x3c\xf6\xad\xee\x5a\xd2\x88\x55\xd1\x50\xc2\xb9\xd4\x5f\xd0\x86\xd8\xa8\xca\x6c\xbb\x52\x37\xb0\xdb\xf0\x59\xf8\x18\xb3\xb1\x28\xea\x0a\x65\x17\x1e\x90\x27\x9e\x15\x35\xa9\xd5\x7a\xad\xb1\xbe\xa3\x02\x05\xaa\xc8\x60\x92\xdb\xda\x5a\x3a\x31\xfc\x54\x5e\x57\x95\x02\x15\x07\x1e\xbf\x30\x91\x2c\xb5\x52\x6d\xe1\x19\x75\x55\x10\xa0\x44\xdb\x54\x86\x80\x8e\x94\x48\x06\xce\x88\x87\xbb\x0a\xb2\x14\x8f\x00\x48\x16\xad\xb6\xad\x46\x2e\x2b\xee\xef\x3e\x77\xca\xed\xe1\xcc\x6d\x03\x6c\x31\x3e\x6a\xa5\x6d\x8d\x77\x5a\x55\xd6\x91\xe5\xe2\xc1\xe0\xf1\xea\x16\xb6\x56\x14\x07\xca\xda\xae\x81\x67\x2a\x69\xef\xef\xf2\xae\x31\x2c\xc1\xe8\x39\x76\x67\xdb\xfb\x5f\x37\x1a\x37\xa1\xee\xc2\x2f\xe8\x50\xf0\xe7\x99\xdc\x96\x9d\x95\x57\xf7\x77\x15\xa8\x4e\x02\x8f\x65\x22\x62\x17\xda\xf0\xf2\x40\x7f\xd9\x96\xb5\xc1\x6a\x14\x92\x6c\x56\x6e\xee\xff\xfb\x46\xc7\xd4\x81\x00\xf0\x84\x8c\x64\x10\xdb\x02\x0f\xf6\xfe\xbf\x83\xea\x65\x26\x32\x2d\x9e\x0d\xca\xc1\xfb\x3b\x62\x02\x8e\xe5\xd6\x9d\xf5\x47\x4b\x54\x53\xa8\x07\x05\x96\xae\x44\x79\x00\xdc\x85\x76\x63\x65\xa5\xfa\xa5\xee\x5a\x59\x19\x84\x00\x36\x74\xc8\x28\x72\x10\x8c\x6c\x47\x7b\xea\xc3\x76\x36\xd7\xdb\xd6\xac\x48\x14\xdb\x03\x8c\x75\x7f\xee\x74\x03\x67\xd0\xc2\xd3\x3c\x6f\x3a\x15\xe7\x65\x80\x78\x48\x06\x80\xb8\x32\x05\x3d\xb1\xee\xe0\x90\x1a\x1d\xb6\x8d\x83\x5a\xf0\x39\x63\x1d\xa8\x0c\xa5\x94\xe1\xa4\x07\xc5\x61\xc7\x4d\x6b\xf2\x52\xcb\x23\xdd\xc8\x43\xea\x26\x40\x85\xe6\x42\x9c\xc2\x62\x73\xbf\x94\x0c\x8f\xa0\x05\x7e\x00\x69\x63\x6e\x40\xec\x64\xb2\xac\x1b\x8b\x4f\xb5\xd2\xea\x06\xa8\xbf\xbf\xcb\x1b\xa0\x56\xdd\xe8\x9c\x54\x27\xd2\x26\x72\xb5\x35\xad\x2a\x75\x26\x55\x87\x1f\x04\x36\x32\x57\x55\x90\x07\xfc\x54\x8d\xb6\x1f\xbe\xf4\x35\x2c\x13\x63\xcd\xb0\x29\xa4\x46\xaa\xd6\xef\x6e\xe1\xd5\x5f\x26\xc1\x71\x80\x9b\x58\x91\x75\x6d\x1d\xe4\x07\x2f\x5d\x50\x26\x42\xb7\x52\x55\x95\xfe\x42\x7a\x85\xf7\x3d\x7d\x8f\x3f\x0d\xe4\x0c\xab\xb0\x02\x09\x77\xfa\x04\x74\xce\xf9\xea\x17\xb0\x74\x50\x78\xb9\x9f\x2d\x50\x0f\x09\x14\xcc\x32\x57\x40\x4a\x7e\x7d\x7f\x07\x17\xdd\xaa\xfe\x48\x6d\x66\x68\x96\x5a\xa8\x09\x37\x35\x4a\x3e\x94\xbe\xa0\xea\xb6\xdc\x4b\xaa\xe8\xfc\x5e\x90\xd0\xe3\xe0\x1e\x08\xdd\x88\x7e\x39\xad\x4c\x6b\x54\x6f\x1d\xb3\xc7\xd7\xb1\xf0\xba\x93\x7f\x22\xdc\xca\xfe\xe3\x8b\xd0\x5d\x23\xb6\x8d\xde\x18\xb4\xeb\x82\xf5\x81\x94\x44\x8c\x54\x74\x92\x97\x17\xaf\xe6\x03\x6a\x89\xfb\xbb\x07\x96\xb3\xe1\x5f\xe3\x8e\xe0\x7b\x41\x7c\x01\xab\x9d\x44\xbd\x05\xe0\x22\x86\x65\xc6\x8f\x3a\xd0\x15\x35\x0d\x40\x69\x67\x2a\xdb\x36\x1d\xa7\x91\x59\x7c\x97\xf0\x41\x4b\xa6\x4b\x7d\xd5\xa8\xcd\x46\x8b\x58\x76\x02\x13\x75\x9f\x3b\x50\x26\x07\xec\x14\xc1\x4d\xaf\xee\xef\x30\xbf\x03\xba\x5b\x57\xf2\x06\x5d\x05\x17\x96\x6f\xe2\x35\x38\xe2\x70\xc7\x93\x65\x5a\xb9\x36\xf9\xb5\xd1\x20\x98\x4d\x45\xfe\x1e\xf8\xcc\xce\x59\x02\x1d\x65\x4a\x2f\xce\xf1\xdc\x68\x89\x23\x21\x96\xde\x74\x48\xb7\xae\x40\xdf\x8c\xac\x8d\x87\xe4\x89\x33\x47\x48\xc7\x7b\x4a\x05\xb3\x96\x6b\x41\x02\x9c\xf7\xd4\x3e\x4b\x9f\x5f\x77\x48\x79\xa4\xa1\x9e\xda\x67\x89\xb6\x51\x3b\x74\xa8\x91\xb5\x41\xfc\x6a\x11\xce\xdd\x9f\x9a\xee\x9a\xde\x91\xbb\x37\x4a\x67\x2b\x1d\x3c\x7e\xde\xce\x20\x4a\x1f\x13\xb6\xa5\xee\x50\xe0\x62\xd7\x3b\x0b\xca\x59\x6e\xaf\x77\x16\xfd\x8d\x1a\x1e\x0c\x2a\xc9\x27\x6a\x41\xeb\xed\x5d\xa3\x52\xcb\x01\xca\xb1\xac\xee\x41\x16\x4b\xca\x22\x33\x99\xd7\x4d\xc3\xb8\x85\x0c\x63\xc1\xcc\x7d\x99\xc0\xbe\x06\xca\xb1\x22\x08\x98\xaa\xee\x6e\x48\x9e\xad\xeb\x0a\x3f\x56\xa9\x92\xf4\xbd\xa9\xda\xfb\xbb\xab\x06\x35\xab\xb3\xfe\x67\x91\x85\x24\x60\xa5\xe9\xee\x66\x12\xac\x77\xc3\x41\x15\x0b\x17\xad\x83\xff\x2e\x5a\x36\x3b\x46\x42\xd0\xcf\xa2\xc5\x74\x95\x8c\x56\x13\xd8\x93\x6c\x6f\x2b\x09\xba\x06\xae\x23\x8a\x83\xb4\x19\xde\xe7\xce\x64\x78\x54\xeb\x1a\x67\xdb\x02\xf3\x82\x81\x06\x5b\x49\xe2\x48\x7f\x01\x15\xde\x12\x44\x9e\xec\x0d\x74\x81\xee\xef\x14\x99\x03\xc5\xc0\xe2\x45\xdd\x09\xc1\x28\x7f\x4b\x60\xfc\xfb\x3b\x7c\x2b\x5e\x18\x30\x85\x74\xf7\x45\xae\xeb\xae\xa9\xc0\xee\x52\xfd\xdb\x47\xab\x94\xa7\xbb\x4a\x61\x28\x21\x5a\x2f\x6a\x64\xfa\x7d\x26\xf3\xe6\xfe\x8e\x25\x4d\x19\xf1\x1b\xee\xa5\xa9\x8a\xfb\xbb\xad\xae\x0a\x34\x8f\x02\xb3\x67\xb2\xd5\x25\xee\x71\xae\xf9\x41\x2c\x54\x23\x56\x02\xa1\x1a\x36\xc1\x85\xb5\xa2\xcd\x00\x83\x30\x3c\xdf\xa2\x0d\x6a\x0f\xf8\x03\x28\x67\x15\xde\x02\xa9\xed\x56\x81\xef\x76\x00\x9e\x9f\xc5\x84\x42\xfc\xcd\x0c\x4c\xab\x4a\xa8\xed\x56\x97\x0a\x5d\x55\x0a\x07\xed\x09\x6c\xf7\x72\xba\x4b\x4c\xb7\xe3\x8c\xe1\xfd\x79\x64\x7b\x70\xc5\x74\x73\x83\x2c\x81\xcf\x75\x95\x2c\x0d\x78\xa0\xfc\x64\x34\xbe\x91\x30\x8d\x1e\x57\xa1\x65\x8d\x7a\x28\x2c\x01\x57\xc0\xca\x11\x68\x07\x53\x4f\x0c\x6f\x2c\x8b\x65\x53\xa2\x40\x06\x02\x32\xda\xec\x46\x5f\x35\x75\xb7\x45\xa7\xb6\x02\x22\xac\xee\xca\x78\xbf\x47\x42\x5c\x50\x62\x39\x5a\x6b\xe8\x26\x83\x3b\x95\x88\x24\x7a\x73\x90\x39\x68\xf9\x05\x13\xe9\x40\x13\x32\x94\xe2\x88\xd6\x54\x57\x5d\x69\xa8\x8a\x60\x83\xbb\xbf\x2d\xbb\x86\x98\xd1\x59\x61\xc7\xf2\x50\x9e\xbf\xf9\xbb\xc9\x52\x88\x99\x17\x33\x52\x91\x2f\x4a\x9b\x82\x1a\xa0\xca\xd9\xec\x0c\xfb\xce\x34\xe0\x6e\x7b\x0a\x29\xe6\x49\xff\xd6\xa2\x02\x97\x2b\x34\x05\xa0\x9e\x2a\x60\x85\xaf\x68\x1b\x37\x60\x58\xa3\xfc\x8b\xe4\x36\x46\x2c\x29\xb0\x79\x7f\xb7\x36\x95\xd1\x32\x37\x87\x6a\xdb\xdc\xff\x6a\xc9\x6c\x57\x4c\xfc\x2b\x22\x93\xc4\x6b\xa9\x64\xd1\xa1\xcb\x48\x3a\xd4\xc5\x37\x63\xed\x53\x37\xe8\xb2\x81\xbe\xc9\xb5\x88\xee\xa6\xdb\x8e\x17\xf2\xd0\xf5\x45\xc2\x6e\x62\xe2\xc5\xe8\x68\x24\x67\xb1\x81\xb4\x67\x14\xe1\x1b\xf6\x8c\x0b\x64\x86\xe6\xfe\x6e\xdb\xa1\x4f\xae\xf2\xcf\x9d\xb1\xa8\xd2\xd7\xca\xb4\xf0\x41\x34\x56\x9c\xb0\x51\xd4\x3e\x9f\x6c\x5c\x8e\x1f\x3f\x35\xcf\xd0\x2c\xf2\x4e\x6e\xb2\x4d\x40\x46\x4b\xfd\x55\x77\x1a\x0b\x22\xc1\x66\xa8\xc8\x68\x6b\xef\xef\x4a\x30\xa5\xdc\x37\x61\xdf\x30\xa6\xd0\x50\x9c\x06\x3d\x0d\xc6\xaf\xc3\x8e\xd4\x1d\xc5\x77\xc2\xab\xfa\x5f\xe8\xb6\xb0\x7b\x5e\x77\xfd\xe8\x48\x24\x1a\xdd\x5a\x7c\x58\x67\x60\x93\xe8\x4a\xc1\x5d\xc9\xeb\x0a\x8f\x37\x9c\x0c\xc7\x15\x40\xcc\xc6\x17\x1b\x35\xde\x8b\xd1\xf1\x48\x5e\x02\x23\xe9\xcd\x96\xa3\x14\x7e\x9b\xb1\xd3\x4f\xab\x2b\x58\x44\xd8\x82\xae\x72\xfe\x2f\xc7\xfe\xa8\x67\xcd\x1a\x03\x63\x89\x9b\x6e\x65\x22\x45\x5d\x10\xc0\x57\xae\x03\xdd\x3e\xc2\xa2\x5b\xfe\x40\xc8\xe2\xc3\xc6\x76\x15\x27\x55\x81\xf4\xa2\xef\x36\xeb\x2f\x5b\x70\x05\x80\x0c\x0c\x4f\x4b\x8a\xcc\x6f\x0c\xea\x8c\xc8\x57\x42\x4a\xdc\x7e\x89\x2d\x6a\x23\xb8\x28\xee\x38\x2c\xb8\x57\x11\x1f\x0e\xdc\x93\xe4\x76\xbc\x18\x1d\xc9\xdc\x00\x41\xb6\xb3\xec\x27\x84\xf3\x68\x34\x86\x02\xee\xff\x27\x46\x50\xd5\x4d\x6d\x10\x20\xde\x8b\x10\x44\x57\xe3\xa5\x3c\x94\x93\xb3\xe5\x7c\x32\x91\x93\x33\xf9\xd3\xf4\xdd\xe5\xe4\x72\x2e\x27\x4b\x79\x7a\x39\x9f\x4c\x10\x91\xf6\x12\x2e\xcb\xde\x67\x12\xc9\x42\xb1\x69\xb0\x54\xcd\x55\x87\xa6\x3c\x6e\x68\xa1\x5a\xf6\x2b\xd3\x35\xee\xb1\x11\x2e\x5a\x24\x8b\xd6\x15\x2c\x75\xc4\x14\x1c\x8f\x1c\x41\xd1\x5b\xc9\x1d\x6f\x14\xba\x6c\x7a\xbd\xd6\x20\x0c\x58\xd0\xf7\xa5\x47\x79\x7f\x77\xa5\xca\x9e\x14\x79\xd0\x27\x8e\x45\x4a\xaa\xee\xc7\x5e\x48\x1d\xca\xc9\x72\x72\x76\x7a\x39\x91\xa7\x93\x85\x3c\x9d\x9f\x73\xb7\xee\x93\xc9\xe9\x64\xe1\xe8\x74\xd2\x14\x6f\xc2\xaf\x85\x4e\xc4\x2a\x85\x8e\x68\x63\x74\x16\x07\x1e\x9d\xc8\x60\x02\x82\x43\x13\x24\x23\x46\x58\x5a\xc6\xa0\xa2\xbf\x81\xbf\x8b\xe4\x65\x10\x5a\x3e\xf0\x11\xcd\xd1\xf7\xc2\x17\x6d\x7a\x65\xca\x12\xec\x3f\xd2\x5d\x12\xfe\x09\x6c\x9e\xf5\x94\xc2\xe0\x32\x30\xf8\x60\x80\x01\xae\x1a\x95\x1b\xb0\x3e\xc2\x52\x44\x91\x46\x12\x8a\x8e\x22\x3a\x56\xae\x1a\x7d\xa3\xd1\x1c\x39\x30\x25\x12\x81\x78\x43\xcb\x0b\x64\xe1\x45\xf1\x52\x44\xfd\x51\x60\xd1\x0a\x61\x36\xce\x48\x1b\x34\x59\x5d\xcd\xc3\xd1\xc8\x9d\xca\xe9\xc1\xe5\x72\x3a\x9b\x2e\x58\xfa\xcf\x12\xe5\x6b\x5b\x44\x47\x37\xc6\xd2\x52\x7c\xf4\x28\x7a\x24\x47\x6c\x62\x09\xf2\xb9\x23\x2d\xf9\x45\x14\x94\x33\xb0\x60\x38\x11\xf8\x90\x03\x95\x14\x49\x0c\x1b\x0d\x97\x3f\xc7\xd7\x90\x49\xc7\x4e\x58\xdd\x60\xa4\xe2\x68\xb4\x17\xa9\x04\x23\x56\x55\xa0\xfe\x71\x37\x10\xe7\x55\xb3\xa4\x0c\x2e\x64\xd5\xdb\x2f\xd1\xd3\x21\x9a\x0d\x44\xba\x12\x68\x26\x52\x33\xa5\x44\x0b\x81\x75\xa7\xd6\x60\x93\xab\x2b\x60\xc6\x83\x60\xc4\x65\xe4\x96\x49\xdb\xd6\xf9\x27\x90\x88\xf1\xeb\x6d\x47\xfe\x81\xd3\x25\xd4\xb1\xa8\x54\x18\xa2\xf4\x61\xf6\xe2\x40\x57\xb2\x5e\x51\x28\x2c\xa3\x7f\xde\xdf\xb5\x5d\x81\xe5\xaa\xc0\x11\xf0\x13\x17\x6a\xd4\xc1\x4c\x27\x3d\xe7\xe2\xff\xe8\x7e\x36\x1b\x53\x69\x0a\x1f\x9b\x82\xc3\x81\x51\xfa\x11\xcd\xdb\xba\x72\x42\x7d\xa5\x2c\x47\xdc\x0d\x6d\xb5\x40\xbb\x0e\x35\xa9\x33\x5a\xf3\x70\xd2\x3f\xc2\xc3\x72\x9d\x1b\x17\x91\xea\xb9\x8f\x04\xe6\xed\x34\xef\x66\xbd\x75\x89\x3b\x51\xa4\xbb\x59\xc4\xbb\x59\x24\xbb\x59\xe8\xb4\x71\x0f\x85\x7f\xa2\xdd\x0d\xf7\x9d\x2e\x07\xf0\xa8\xae\x5c\x3a\xf8\xc0\xd1\xd0\xa0\xc4\xd5\x4d\xdb\xa5\xe1\x0f\xe4\xfe\x63\xe6\x7e\x79\x7a\x30\xbe\xb8\x38\x9f\x2f\xb1\xda\x24\x9a\x27\x40\xc1\xb9\x99\xf6\x8f\x55\x78\x7e\x6c\xba\x24\x0e\xa9\x67\x53\x0c\x01\xb8\xa4\x34\x3a\x9c\xa6\xc1\xe5\x51\x1f\xbd\x26\x13\xc5\x01\x37\x06\x6c\xe8\x54\xfd\x43\x69\xbf\xc8\x63\x48\x82\xf7\xbd\x70\x88\x7b\x03\xe5\x57\x58\xc4\xa7\x61\x1b\x5d\x61\x94\xb5\x2b\x5b\x32\x96\x1f\xbf\xcf\x3d\x0a\xe2\x85\xc5\x2e\x45\x1a\xbd\x85\xb7\x6f\x48\xe0\x54\xc8\xb0\x5a\xae\xd5\xfd\x7f\x43\xc3\x17\xae\xb8\xc1\x92\x45\xec\x58\xb1\xc1\x1b\x08\x37\xfd\x73\xe7\x33\x31\x9a\x93\x6a\xf1\xdb\x04\x59\xdd\x4e\x29\x82\xc7\xa3\x9c\x31\x92\x83\x02\x3c\xcc\x8d\x3b\xbd\x17\x41\x76\x4d\xd2\x2e\xb6\x93\x25\xfd\xe8\xed\x5b\x2c\xca\x89\x4f\x30\x6d\x04\xcf\xf1\xb8\x10\x32\xf3\x87\x18\x2c\xaa\xde\x71\x56\x96\xc2\xbf\x42\x73\xe6\x11\x61\xa3\x18\x60\x4e\x5d\x23\x97\x75\xf5\xc2\xda\x19\x92\xba\xed\x59\xb0\x22\x8e\x13\x84\x97\x71\x98\x99\xf5\xeb\x46\x35\xf9\x75\xac\x48\xea\xea\xfe\xae\x01\x45\x52\x77\xa0\x54\xda\xce\xb4\xe0\xfc\x0b\x56\x1d\xc1\x66\xb4\xc3\xc6\xf3\xb6\xa9\xc9\xf0\xfc\x2a\x77\x84\x14\x1e\x33\x3e\xb7\xf0\x4a\xec\x47\x1f\x27\xac\x3b\x70\x7e\x32\x97\xb1\x69\x31\x7c\x31\xa0\x5d\xe5\x83\xda\x95\x6a\xbb\xe1\x80\x8f\x46\x72\x3e\x49\x8e\xf6\xf4\x32\xc0\x64\x16\xe3\xb3\x85\xfc\x70\x7e\x3a\x7d\x3b\x3d\xf9\x4d\x6a\xeb\xa1\x85\x30\x3e\xa5\xb7\x24\x91\x86\x0c\xe2\x30\x6e\x14\x8c\xc6\xa0\x22\xae\xd6\x2f\x8d\x55\x17\xf0\x76\x9a\xfd\x74\xf8\x69\x8a\x07\xc5\xc9\x82\x01\x4b\x04\xd9\xa6\xa5\x10\x0c\xe9\x27\x83\x31\xbd\x7a\xb3\x55\x57\xd5\xfd\x1d\xe8\x43\xe9\xfe\x1c\x8d\xc8\x59\x19\xf6\x14\x50\x93\xe1\xef\x07\x7d\x83\xaf\xdb\xfe\xc5\x7e\x86\x93\x1e\xef\x8c\x9e\x60\x91\x83\x02\xbf\xe9\x18\x50\x43\x86\xa0\x95\xdf\xc3\x43\x7e\xc8\x84\xc0\xf4\x9e\xce\xa2\x04\xba\x95\xf5\xfd\xbf\x50\x7c\xa0\x4c\x62\xfe\x89\xcc\xc3\xc9\x12\x6e\x2b\xc1\x2a\x04\x83\xcf\x1f\x34\x27\xce\xe8\xa5\xeb\xae\x05\xe7\xc3\xff\x16\x6d\x8e\x1c\x08\xd5\x8d\x5c\xab\xdc\xb0\x5f\xa1\xba\x24\x9b\x40\xe9\xc8\xb6\x6f\x36\x98\xaa\x30\x64\xc6\x94\x14\x5b\x74\x01\xc1\x82\x63\xd1\xde\x86\xa1\x08\x44\x07\xeb\x13\x98\xd4\xba\xff\xd7\xd6\x43\xd0\x2b\x5d\xe2\x37\xc0\x15\x36\x71\x38\xd9\x71\x14\xe2\x29\x6e\x1a\x25\xb7\x88\x3a\x66\x72\x11\x7f\x01\x74\x09\x7a\x9c\x13\x41\x6b\xdd\x50\xec\xdc\x65\xfb\x92\x5b\x73\xfc\xe8\xad\xa1\x0b\x03\x5e\xc2\x90\xee\x66\x4d\xb0\x17\xf0\x8d\xd5\x40\xd6\xbf\xc9\x85\x16\xfb\x20\x8a\xbd\x04\x03\x59\x1c\x0a\x4c\x06\xcc\xa2\x19\x4b\xc1\xc3\xf2\x80\x83\xab\xcc\xeb\x85\xb6\xe2\x81\xbb\xf1\xe7\x89\xaa\x58\x1e\x3b\x22\xb2\x34\x10\x28\xfe\x17\xdc\x6a\x07\xf1\x82\x63\xff\x4f\x70\xab\xf3\xbf\xd9\xad\xf6\x8c\xb1\x77\xbd\x45\xc2\x93\x7f\xad\xeb\x1d\xde\xff\x17\xdc\x73\xc1\x57\xe7\x7f\xc5\x3d\x17\xfe\x9e\xcb\x3f\xe7\x9e\xbf\xd8\xbf\xe7\x13\x54\x88\x97\x33\xf0\xb6\x3f\x9e\x8d\x3f\x4c\xff\xe1\x12\x1d\xed\xc1\xab\x1e\xd0\x14\xf7\x77\xb2\xab\x64\x3f\x4c\xbf\x77\xcd\x3d\xef\x89\x2a\x4e\xad\x63\xe4\x8d\xf3\x00\x7b\x0f\x89\xb0\x1f\x04\x11\x08\xc7\x4c\x57\xb1\xab\xc4\x7e\x8a\x19\x4d\x32\xb0\x6f\xaa\x36\x59\xf2\xcb\x91\x3c\x39\xff\x70\x31\xe6\x92\xf3\x89\x1c\xff\x34\x39\x91\xb3\xb1\x87\xd1\xbe\xbb\x98\x71\x36\x3d\xe2\xc3\xc4\x4b\xfd\x10\x0c\x15\x89\x86\x8a\xc6\x6e\x88\x9c\xde\x91\x14\xd5\x72\x78\xa7\x8d\xb1\xe4\xbf\x26\xb7\x3a\x01\x52\xbe\xbb\x98\x65\x3d\xff\xe7\x71\xa9\xe4\xd3\x55\x64\x60\xa4\x8f\x1a\x3d\x4a\x7d\x20\x1e\x08\xfe\xf5\xaa\xd1\x03\xc4\xa6\x28\x84\xff\x20\xb1\x03\xef\x7e\x80\x6c\x17\xf5\xf9\x56\x1e\xca\x8b\xf9\xf9\xc5\x7c\x3a\x59\x4e\x70\x56\xcd\x6c\x36\x39\x59\x5e\xc2\x7f\xf0\x28\xbf\x05\xb3\x6e\x71\x39\x97\xb3\x08\xf2\x8c\x50\x88\xf1\x0c\xe5\x7b\xc8\x20\x22\xbc\xef\xeb\xe9\xd4\x5e\x08\x4a\xfa\x2c\xea\x12\xdd\x99\x08\x1a\x95\xdc\x7f\xfe\x18\xe1\x46\x48\x21\x11\x0a\x39\x20\x76\xa3\x60\x90\x33\x61\x3f\x33\xe4\x21\x49\x75\x2a\x99\x5f\xd7\xc6\x9a\xe0\x4d\xe8\x06\x7d\x9f\xff\xef\x9f\xbb\x9b\x06\xa5\x6d\xd5\x95\xec\xda\x55\x07\x4a\x94\x0a\x84\x15\x22\xef\x7a\x69\xeb\x9e\x66\x4d\x70\xc2\xb1\x17\x2e\xa3\x5c\x71\x4c\x8a\x3d\xd0\xd5\x15\xf8\xc8\x88\xab\xc2\x8e\x19\x86\x62\x5e\xe1\x41\xd1\x26\x18\xde\x04\x07\x16\x10\x83\x17\x9e\x3c\xfe\xac\x1f\x3f\xbb\x01\xa6\xe9\x05\x5f\x5f\x8e\x8e\x47\x7c\xce\xc7\xee\x9c\x07\x5c\xea\x18\x40\xf8\x08\x6e\xdb\x81\xe0\x52\x5f\x9b\x2c\x89\xb6\x55\xe0\x12\x21\x1e\x2e\xc6\xf1\x3d\x04\xe1\xb1\x06\x34\x2c\x45\x56\x15\x46\x3b\x0d\xb7\xec\x8f\x2a\x62\x1d\xed\x2f\x02\xed\x83\x12\x35\x91\xa4\x98\x6f\xff\x9a\x34\x05\x36\x1b\x84\x1b\x16\x5a\x7c\x65\x07\x06\xe4\x2a\x9c\x08\xe8\x76\xed\x90\xb1\x1d\xb2\xe0\x17\x59\x74\x5e\x9e\x22\x7c\xd5\x5a\x87\x29\x71\xe7\xef\x96\xf8\x12\x87\xbf\x5c\x9c\x2f\x08\x85\x84\x33\x4a\x2e\xcf\x60\x75\x24\x70\xe1\x13\x47\x23\x99\x2c\xd5\x73\x17\x57\xc6\x51\x80\x88\x42\x73\xf7\x7f\x92\x88\xfa\xa7\x1c\x71\x83\x43\xdb\x30\xd1\xcf\xbc\x5d\xa0\x2d\x51\x02\xf1\x1b\x55\x11\x5a\x85\x13\xb7\x68\x06\xa1\xe6\x75\x11\xcc\xc7\xd9\x02\xcc\x54\x8b\x71\xad\xde\xdd\xff\x11\xad\x22\x14\x63\x3e\x2e\x42\x36\x26\xd6\xef\xb1\x56\x2b\x4c\x1b\xbd\xeb\x71\x16\x14\x8e\x05\xf7\xbd\x5e\x6c\xec\x81\x81\xf7\xe1\x3d\x0a\x1b\xc2\xe1\x15\xd5\xb6\x08\x0a\xcd\x5c\xe7\x1a\xea\xc2\xd8\xa1\xf9\xe1\x7f\x90\x61\xb2\xe6\x37\x5d\x8f\xa2\x8b\xa5\x25\xa3\xa4\x6c\x92\x1b\xc6\x04\xc8\xfd\x9f\xe4\x96\x70\x97\xd9\x1e\xde\x88\x01\xa4\x8c\x4f\xe5\x54\x84\x83\x6c\x94\x2e\x92\x4e\x87\x83\x0d\x5d\x45\x04\xbd\xb1\x24\x12\x3c\x5a\x31\x2d\x78\x28\x70\x05\xbf\x61\x21\xe2\xb7\x2c\x24\x52\x32\xdf\xc9\x43\x3f\xc2\x48\x8e\x17\x8b\xf3\x93\x29\xf0\xed\x77\xcc\xaf\x4e\x6a\x55\x07\x58\x6c\x89\x99\x12\xd5\xe5\xa0\x2b\x95\xed\xc5\xeb\xd9\x4c\x26\x04\x84\x0f\x36\x01\x73\xbb\xde\xf5\x08\xc6\xc4\x74\x61\x1e\xd7\x32\x90\xbb\xc0\x22\x16\x7f\x97\xb2\xc6\x89\xf6\x19\xf5\xe4\x85\xc9\xad\xa5\x4d\xa9\x2d\xa1\xb5\xdb\xdd\x96\x92\x41\x0c\xb6\x20\x2c\x2a\x65\x58\xe1\x18\x63\xd9\x8c\xe9\x66\xb2\xd0\x07\xc9\xe3\x4d\x8c\x3e\x16\x91\x2a\x18\x3f\x48\xde\x98\x0f\x19\xa3\xc1\xcb\x48\x07\x95\xb7\x88\xf8\xdc\xaa\x86\xf0\x9e\x16\x7f\x64\xfb\x8b\xc6\xf7\x88\x41\x12\x2a\xbe\x08\xf8\x2a\xbc\x7a\x0a\x7d\x82\x3d\xbf\x43\x26\xd1\x04\x41\x08\x60\xeb\xb6\x66\x04\x07\x7b\x3c\x92\xa7\x9a\x50\xa9\x19\x05\xb0\xa2\x2d\x25\xf8\x41\x6f\x43\x33\x0f\xc5\x1b\x7c\x27\x02\x61\xad\xe6\xaa\x61\x72\x25\x62\x54\x39\x19\xae\x7e\x09\x8a\x16\xd0\x71\xd0\x9b\x8d\xc0\x5e\x7c\x27\x8d\xd3\xe2\xfe\x0f\xfa\x1b\xa4\x4c\x87\x82\x62\x14\xcc\xb6\x75\x77\xad\x4c\xab\x47\xe2\x04\x1d\x9f\xd8\x6b\xeb\xf9\x27\x6b\x03\xc7\x80\xc2\xd4\xfa\x3c\x62\x48\xb1\xc8\x35\xed\x3e\xd5\x4c\xb4\x82\xfc\xc5\xf8\x68\x39\x31\x99\xf2\x68\x2f\x67\x1a\xdd\xbc\xef\xe5\xa1\x9c\x4f\x16\x17\xe7\x67\x0b\x1a\xa9\x35\x11\xe2\x7b\xb4\xe8\x7a\xc8\xde\xbe\x2b\xac\x23\x1b\xe1\xfb\xd1\x71\x26\xad\xe9\xbd\xb4\xf2\x80\x1b\x01\x32\x73\x20\xc3\x15\x97\x4e\xfb\xf8\x81\xf5\x35\x11\x69\x02\x3d\x35\x74\x85\x92\x91\xcd\x35\x00\x44\xde\x36\x75\x77\x43\x80\xeb\xb5\x02\xb3\x31\x8d\x70\x51\xf9\x5c\x05\x5f\xc5\x5d\x2e\x29\xc2\xdd\x08\x12\x1e\x38\x4a\x89\x6d\x2b\x70\x96\x7f\xe9\x0a\xac\xf1\x40\xa9\xee\x4e\xb5\x5b\x31\x30\x1a\x4e\xc4\x94\x3e\xec\xae\xa8\x78\x4d\x77\xd8\xe0\xe4\x7b\x54\x28\xfb\x75\x6f\x29\x3d\xc4\xf2\x5c\xf7\x80\x75\x0a\xc8\xa7\xd8\x5c\x81\xd2\xd9\x3a\x61\x04\x91\x1a\x73\xe0\xc0\xa9\xae\x51\xc6\xb9\x65\xf8\x75\xac\xa1\xa8\x64\xa3\x0c\xc5\xed\x39\x06\xfe\xfa\xa9\x79\xc6\x6e\xe8\x06\xeb\xf0\x45\xd1\xf9\xd0\x4d\x9c\xb5\xc1\xd0\x86\x0e\x87\x56\x96\x54\x17\x62\x7b\x67\xd7\x4f\x6e\x67\xd4\x03\x37\x7e\x05\x6f\x9d\x8d\xb5\xa3\x75\x75\x23\xca\xc1\x77\x63\xd3\x9e\x55\x46\xd4\x3c\xce\x8a\x34\x0b\xb7\x32\xfb\xaf\x0e\xa0\x6a\xf0\x68\xaf\x30\xcb\xd3\x55\x69\x4d\x81\xf3\x20\x7a\x10\x45\x8e\x70\xaf\x4d\xd5\xab\x41\x28\x29\xdf\xf6\xd4\xec\x2d\x6a\x68\x25\xe2\xb7\xac\x24\xd1\x2d\xa8\x15\x18\x3f\x05\x8c\x79\x63\x74\x55\xe9\xca\x8f\x5a\xe0\xac\xdd\x67\x4e\xc1\xc5\x0c\xc9\xe2\x82\x2c\xb3\xa8\xe7\xe2\x53\xd8\x17\x8a\x33\x21\x5e\xb3\xc5\xf4\x8e\x0b\x3b\x64\xf4\x23\xd8\xf3\x15\x56\x13\xac\x41\x3b\xf9\x9f\x26\xe9\xeb\xe8\xb3\x79\x69\x34\xf8\xa9\xc8\x12\x82\xb3\x25\xaa\x2a\xe0\xab\x1b\x85\x48\x98\xfb\x3f\xc9\x2b\x75\x85\xf9\xa3\xb6\xa9\x3b\xea\xd0\xe4\xa9\x0a\x90\x99\x67\x01\x4d\xaa\x18\x97\x60\x1a\x83\x0c\x4b\x75\x43\xe9\xa1\x32\xf6\x0d\x93\x0f\x61\xec\x19\x7a\xcb\x7c\x16\xfe\x28\xa4\x6e\x45\x75\x50\xa3\x9b\x06\x62\x87\xf2\x2f\x60\x41\x46\xb7\x7a\x0f\xfb\x15\x49\xc4\x1f\xe4\xa1\x7c\x37\xa6\x9e\x70\x42\xfc\xb0\x67\x32\x47\x78\x13\x54\x21\x07\x8c\xe1\x46\xd3\x67\xbf\x34\x25\x29\xcc\x43\xad\xef\x15\xaa\xed\xe1\x08\x15\x0a\x41\xb8\xb1\xb9\x69\xf2\xae\xdc\x77\x71\x2b\xed\x50\x9e\x5b\x85\x38\x03\x9f\x40\xd6\x2d\xe5\x93\x6f\xee\xef\x1a\x32\xcf\x23\x43\x2f\x62\x46\x2b\x2b\xe3\xd3\xca\x39\x55\xb9\xe0\x18\x34\x84\xb9\x15\x07\xbe\x0c\x00\x59\x1a\x24\xa7\x45\xd8\x58\x28\x72\xea\x92\x98\x13\x59\x7f\x49\x91\x53\xae\xe5\xb6\x36\x84\x6b\x10\x83\x15\x4f\xf2\xab\x15\x4f\x83\xe5\x4e\x62\xa8\xdc\x49\x0e\x97\x3b\x45\xe9\x64\xce\x8d\xb3\x72\xe0\x6a\x9f\xfd\x7a\x3b\x0a\xba\x8e\x84\x98\x96\xb2\xd1\xe5\xfd\xaf\x5c\xd0\x32\x28\xb9\x13\x38\x18\x72\xec\xfd\xff\x5b\x02\xd7\x73\x3e\xce\x52\x2a\xd0\x66\x62\xaf\x88\xc8\x55\xd4\xb0\xb9\xc2\x15\x44\x94\x5a\x5d\x61\xe3\xe8\x18\x07\xc0\x81\x5d\xeb\x0a\x88\xb8\x0c\xa5\x02\xa3\xbf\xb3\x9a\x23\x8f\x78\xb7\x59\x26\x21\x98\x87\xcd\x7d\x4b\x68\xfb\x2f\x72\x65\x74\x05\x6b\xfb\x81\xbd\x9b\x48\xf3\x80\xe4\x2a\x15\xd9\x5a\x2b\x84\x75\xaf\x6b\xe3\xb5\x48\xc8\x5f\x72\x20\x39\x0d\x79\x45\x6e\xaf\xf7\xdf\x93\x14\xf3\x53\xc4\x37\xf7\x61\x6d\x11\xee\x07\x63\x0e\x36\x89\x39\x88\x57\xcf\x90\xd4\x17\x5f\xb9\x79\x3a\xcd\x28\x11\x60\x59\xfe\xdb\xff\xd0\x95\xbb\x95\xff\xf6\xaf\xfb\x57\x5d\x50\x25\x12\x86\x6e\x82\x71\xc8\xa2\x96\x50\xee\x8a\x92\xdd\x0c\x59\x29\x43\xbc\x3c\x89\x8c\xfc\x30\x3a\x86\xeb\x1c\x56\xc5\x0f\xce\x93\x62\x46\xb8\x11\x56\xc9\x1b\xc5\x10\x5d\x27\x0c\x39\x99\x1e\xd7\x58\x53\x39\x96\x05\x9b\xc4\x54\x55\x7d\xe3\xf0\x8c\xc0\x98\x15\x85\x4e\x27\x15\xa9\xe2\x1c\xf1\xb0\x7d\xac\x52\x78\x2f\x85\x70\x87\x76\x09\x95\x02\x0a\x8b\xa6\xd1\x5d\x93\x31\x43\x05\xae\x6b\x14\x2d\x04\x5c\x82\xa6\xe9\xb6\x74\x21\x59\xa5\xc2\x6f\x31\xb9\x41\x25\x59\x58\xa7\x04\x7b\xfd\xb9\x33\x74\x23\x45\x72\x39\x74\xeb\xfa\x05\x98\x2b\xd7\xc3\xcf\x55\x08\x95\x1a\x44\x11\x3d\xb7\x01\x45\x65\xc0\x70\xd2\x51\x4d\x5d\x27\x62\x8b\xf5\x87\xd1\xcb\x3e\xeb\xf6\xd6\x4b\x35\xab\x2e\x14\xf1\xd0\x89\xc6\xf5\x19\x20\x4f\x31\x3f\x06\xbb\xe5\xbc\x79\x8e\x19\xc7\xf8\x4e\x77\x07\x1e\x73\xdd\x0f\xba\x4a\x50\x76\x3c\x86\xd2\x75\x15\xa3\xbe\xb2\xb8\xbb\x00\xd0\xe4\x81\x04\xc4\x8a\x43\xef\x18\x89\xb1\xa9\xac\xe9\x1f\x33\x02\x91\x1d\xde\xcf\x33\x9a\x42\xd1\xb2\x26\x48\x6e\x38\x02\xaf\x4e\xad\x50\xae\x50\xa7\xe2\x9f\x32\xbe\x03\x23\xfa\x75\xd7\x34\x0a\xe1\x68\x2e\xae\x0f\x9e\x36\xe3\xcd\x28\x22\x47\x32\x22\x95\xd4\x1c\x90\x8e\x85\x75\xc6\x32\x6b\xcf\x9f\x4a\x8d\x9e\xb3\xfb\x3b\x55\x6d\x58\xf6\x81\x4e\x12\x2d\x99\x5a\x8e\x4c\x94\xda\x88\xc3\x45\x1a\x06\xec\x82\xfe\xc6\x94\x9d\x09\x46\xb8\x40\xd7\xc9\x14\xbd\x7e\x05\xbf\x74\x8d\x29\xf0\x1f\x18\xe9\xb0\x98\x36\x59\x53\x9f\x29\xf2\xce\x1e\xf9\x8e\xf0\x11\x6c\x72\xaf\x71\xd7\x73\x45\x66\x28\xfc\x77\xc8\xf9\xf2\xae\x46\xdf\x0d\x43\x8f\x51\xa4\x75\xe7\xdb\xa6\x6e\xeb\xbc\x46\x86\x52\x79\x5e\x37\xc5\x80\xbc\xc6\x68\x14\x1d\x7f\x3f\xe3\x47\x49\xaf\xbe\x42\xe5\xe3\x28\xee\xef\xaa\xda\x37\xf1\xec\xc3\x48\x12\x0f\x51\x8e\x51\x8e\x09\xcf\x5e\xd5\x01\xa6\x16\x70\x77\x61\xe1\xd1\x8b\xbc\xfd\x10\x05\x6b\x55\xe5\xea\x06\x7d\x4c\xaf\xaa\x37\xfd\x42\x30\xaa\xe5\x8e\xbe\x8f\xe1\x8d\x8d\x6a\x3e\x77\x3a\xae\xb0\x7c\x4e\x5e\xea\x74\x36\x65\x60\xc8\xd1\x73\x44\xe8\x52\x00\x88\x6e\xfd\xe7\x4e\x7b\xd4\x78\xaf\xfc\xe9\xcb\x57\x3c\x4d\x31\xe0\x69\x46\x3b\x4e\x77\x03\x0d\x08\x53\x72\xe4\x73\x5b\x6a\xe3\x94\x63\xf8\xa6\x6c\x1b\x5d\xb5\x5a\x3c\x7d\xf1\xfc\x19\x8e\xe2\xb0\x92\x31\x31\x55\xdd\x06\x6b\x86\x8a\x4d\x98\x7d\x12\x69\xd9\x68\x8b\xbb\x8b\x12\x18\xf1\xbd\x23\x5c\x6c\x3f\x26\xe9\x6a\x5d\x7b\x18\x7d\xa0\xef\xfe\x8e\xcf\x0a\xab\x85\x07\x71\x9e\x99\xf0\x41\xdc\xa8\xb7\x66\xaf\xca\x4e\xfa\x80\x57\x16\xdb\x92\x9c\x25\x72\xa1\x0d\x70\x3a\x85\x07\xbd\xeb\xf8\xe0\x3d\xde\xbb\xf4\x7b\x17\x95\xde\x71\x48\x1b\xad\x57\x58\x0c\x76\x6f\xd4\x08\x25\xb0\xc2\x3b\xf2\x9f\xbb\x03\x16\x0a\x24\x9a\x50\xf2\x32\x18\x90\x70\x90\x55\xda\x8e\x06\x15\x52\x0c\xba\xf7\x3c\x74\x24\x0f\xd3\xf8\xf8\xe9\xf4\xa7\xc9\x7c\xc1\xf1\xf1\xa3\x23\x60\xa8\x93\xf1\xe5\x82\x7a\x36\xcf\xa7\x93\xcb\xf9\x44\x08\xba\x06\x68\xd6\x3b\x0f\xad\xd2\xa4\x07\xfd\xd5\x63\xe9\x2f\x1b\xdd\xaa\xa6\x90\x3e\x4c\x87\x06\xb4\x29\x4b\x0a\x26\x46\x78\xc8\xd8\x79\x47\xfb\x54\xa3\xe7\x5e\xdc\xff\xab\xcb\x57\x12\x57\x53\x43\xd5\x8d\xfa\x05\x76\x33\x73\xbf\x58\xd7\x4d\x0b\x06\x24\x36\x15\xd5\x02\xed\x40\xa9\xbf\xf8\x6d\xcf\x42\xa2\x3f\x0b\xd6\x49\x46\xa8\xb3\xee\x46\x19\xdb\xb7\x31\xb9\x04\x31\xd6\xf8\xe8\x6b\xe3\x31\xa8\x4e\xde\xdf\x81\x9e\x6b\xa2\x30\x29\x97\x65\xc4\x4d\x16\xd1\x68\x07\x0f\xab\xdc\x59\x83\xe1\x16\xf7\x75\xe0\x49\x4d\xf5\x05\x1a\xcd\xc4\xcf\xd8\x34\x36\x54\xec\x67\x04\x1a\x81\x13\xaf\x7c\xa9\x0b\x71\x2e\x06\xc5\xae\x30\x94\x43\xc4\xaa\x52\x83\x55\x0d\x0a\x41\xb5\xca\xb6\x4d\xbd\xbd\x86\x43\x51\x6d\xd7\x20\xab\x30\xaa\xfc\xfe\xee\xea\xfe\xbf\xb6\x54\x94\xaf\x55\xf7\x85\x6b\xb0\x1b\xb4\x5b\x29\xac\x82\x62\xbe\x69\x34\xe2\x13\xd6\xba\xa3\x8f\xa0\xf3\x6b\xa9\xc0\x10\xfe\x7d\xd5\x80\x2b\x60\xa3\xc6\x11\xeb\xd2\x70\x5f\x7f\x7a\x2e\x7b\x80\x85\x96\x57\x1d\x3c\xef\xdf\xff\xe9\xff\x11\xe2\xe8\x88\x2f\xed\x5a\x99\x36\x73\x5d\x17\x2a\xaa\xf7\xe4\x32\xb2\x88\xab\x32\x59\x1c\xd4\x0c\x11\xc4\x1a\x2b\x0a\xbb\x94\x9d\x45\x19\x2a\xea\x3c\x57\xd6\x17\xee\xb3\x45\xaa\xca\x9a\xcb\x5a\xd2\x4f\x3f\x84\x5a\xc9\xd0\x81\x44\x69\x26\x92\x10\xba\xd9\xb8\xaa\xfa\x46\x57\x75\x95\x9b\xc8\x4d\x56\x4c\x22\x25\xd5\x9d\xe0\x02\xf1\x09\xfe\x66\xa0\x43\x44\x7d\x47\x36\x64\xad\x1e\x1d\xb1\x0d\xef\xcb\xb1\xaa\x8a\xeb\xce\xd0\xe2\x53\xb9\x53\x63\x79\xed\xc0\xee\xb1\x00\xc9\xb8\x20\x1e\xe3\x0d\x58\x5f\x9a\x79\x0d\x1b\xee\xa3\x43\x54\x62\x87\x83\xda\x95\x61\x87\x20\x41\xc9\x8a\x14\x1b\xa3\x22\x82\xb8\x6d\x08\xdc\x13\x3f\x21\xd7\x2d\x7d\xd9\xa9\x3e\x0f\x02\x09\x49\xaf\x3c\xb4\x06\xd8\x2b\x93\x12\xd5\x01\xc8\x42\xc6\x2a\xb7\xbd\x24\x4c\x78\xd7\xfd\x9f\xb8\x06\xb7\x38\x20\x43\x0b\xf8\x83\x62\x9d\xb4\x58\xd4\x8b\x98\xda\x74\x7a\x09\x4e\x14\xfc\x5b\xaa\xe0\xc7\x22\x89\xe2\xfe\x5f\xf1\xe6\x5e\x3b\xc5\x6f\x69\xbb\x5f\x8e\x24\xe1\x0d\x0e\xae\x77\xdb\xba\xbd\xbe\xff\x15\x0c\xe0\xfb\x7f\xd9\x63\xa8\x81\x88\x6e\x90\x49\xf6\x40\xdd\x80\x0d\x0d\x52\x89\xb3\x8f\x9c\x78\xc3\x9e\x04\xb5\x81\x47\x91\xa4\x6a\xf5\x97\x36\x6e\xc8\x0d\x9e\x14\x95\x62\x61\xa8\x8f\xe0\x3d\x99\xeb\xb7\x53\x1b\x51\x77\x98\x19\xc1\xaf\x11\xf3\x74\x45\x83\x57\x84\x2f\x98\xdb\xa8\xb5\x66\x7b\x14\xc5\xff\x46\x57\x05\x5f\xdb\x38\x5d\x25\xc8\x88\xd3\x1e\xf3\xd9\x10\x6e\x85\xdf\xc6\x74\xba\x17\x8e\xe4\x32\x28\x32\xbc\x82\xe9\x1e\x88\xa0\x8e\x42\x61\x4f\x9c\xa8\x28\x95\xac\xba\x92\xf2\x0d\x64\x3f\xba\x0c\x28\xc7\x58\xa3\xfc\x67\x26\x58\x0b\x3c\xb2\xd1\x51\xd8\x16\xb8\x52\xdd\xff\xcf\x8a\x42\xd6\xee\x2d\x64\x70\x07\x77\xbb\x87\x79\x3f\x3a\x1a\xbd\x1a\xc9\xd9\xf8\xec\xdd\x65\x5a\x27\xc4\xf6\x40\x61\xae\x08\x0f\x55\xaa\xea\xaa\xd3\xa1\x49\x9b\x6b\x38\xc5\x3f\x57\xd5\x55\x09\x3f\x8d\x4c\x2a\x51\x98\x1b\xdd\x5c\xb1\x59\x86\xd2\x19\x8e\xcb\x05\x05\x29\x07\x53\x2a\x3f\x1d\x26\x7a\x34\xd6\x05\xae\x6b\x13\x6b\xdf\x63\x79\x28\xcf\xce\x2f\x7f\x9a\xcc\x66\x93\x85\x04\xc5\x4b\x3a\xf8\x52\x72\xf3\x3c\x21\x8e\x8e\x41\x05\x2f\xd3\x12\xf3\x04\xcf\xa2\x09\xc1\xb7\x35\x1c\xf0\x1a\x86\x31\xc3\x09\x44\x15\xf2\x47\xc7\x20\x88\xc7\x58\x4e\xe1\x24\x16\xf7\x27\xc1\x6a\x94\x6b\xc4\x25\xe5\x94\x49\x25\xbe\xec\x15\x3f\x82\x4d\x0e\xea\xe4\x0e\x63\x8b\x3a\x46\x3f\x79\x98\x34\x3a\x14\xaa\x71\x9c\xb5\xdf\xa1\x2d\x73\x60\x13\x0b\xec\xea\x68\xa0\x10\x74\xf0\xfd\xba\x15\x1a\x98\x58\x68\x57\xa3\xcb\xc1\xd1\xc1\xc8\x6c\xfd\x05\x2b\x5a\x51\x0d\x87\x0a\x77\xd7\xb1\x43\xc4\xd2\x9e\x1c\x3b\x6b\xef\x7f\x2d\x88\xab\xf3\x6b\x85\xa2\xad\xab\x64\xd5\x6d\xee\xef\x1a\x1a\xe5\x6c\xaa\xbc\xa5\x94\xa0\x6f\xfc\x11\x37\x91\x72\xd9\xc5\xa8\x19\x0b\xe7\x7f\xa9\xf5\x8f\x26\xa0\x3d\x05\x89\x03\x49\xdb\xa6\x5e\x95\xf7\x77\xbe\x2b\x0f\xec\x32\x46\xca\xee\xb4\x2b\x8e\xdc\x6f\x94\x47\x07\xf6\x82\xf8\x20\xf8\x0a\xbe\xf7\x0c\x63\xcc\xb4\xe7\x3b\x8e\x69\xf7\x6e\x15\x9b\xec\xd8\x37\x4a\x70\xb2\xcc\x59\x65\x1e\x37\x13\xad\x11\xcf\xcf\x01\xa1\x48\x93\xf8\x17\x84\x07\xd7\x9d\x88\x5f\x1d\x37\x47\xd9\xcf\x40\x3d\x96\x30\x23\xec\x5b\x74\x3d\x5e\xc8\x43\x39\x3b\x9f\xc6\xb3\x41\x26\x4b\xc4\xc6\x4d\x96\x08\x84\x5b\x4e\xe6\xf3\xe9\xf2\x7c\x3e\x1d\xcf\x26\x42\x1c\xbd\xe8\x65\xc6\xf9\xbe\x73\x77\x33\xe0\xba\xda\x44\x57\xf2\xc1\x14\x03\xb9\xdd\x15\x95\xc0\xe0\x13\x4a\x12\xa1\xe5\x81\xda\x50\xfb\x68\x42\xc1\x32\x7c\xaf\x40\xa9\x5e\x9a\xd6\x5c\x71\xdd\x11\x3c\xa9\x70\x91\x83\x3f\x49\x8b\xe0\x17\x02\x6a\x00\x29\xb6\x23\xf5\x4d\xcf\x74\x56\x4c\x8a\x01\x3e\x42\x8c\xf3\xd8\x05\x9c\xbd\xe7\x2b\x1d\x09\x2e\x87\x5d\xdc\xdf\x95\xca\xf8\x82\xff\xa7\xc7\xcf\x40\x97\x12\x54\x11\x19\xb0\xc1\xf6\x82\xdc\x89\xe3\xc6\x67\xb4\x41\xc8\xae\xb1\xdf\x9d\x62\x84\x6f\xa9\x31\xba\xc6\x8d\x2d\xa9\x74\xa2\x23\x1f\x9c\x64\x1e\x5e\x57\xf1\xc0\xba\xf9\x3e\x90\x2b\x6c\x7b\x66\x12\x58\xc1\xe0\x79\xb9\x00\x0a\x22\x44\x29\xd7\x64\xe5\x12\xe4\x55\x05\x06\x04\x10\x4c\x50\x38\xe4\x0d\xec\x1f\x08\x7b\x21\x4f\xf4\x6b\xea\xcb\x78\xf2\x9a\x1b\x1a\x4e\x5f\x73\x23\x40\x39\x9b\xbd\x0e\x77\x62\x86\x19\xf2\x9f\x98\x19\x8f\x60\x4f\x8f\x8f\xbe\x79\xfe\xed\x37\xc7\xcf\x9f\xbf\xfc\xbd\xd3\xf0\xdf\xf0\xcf\xe8\x9b\x77\x6f\x4f\x67\x87\x47\xa3\xa3\xc3\xba\x2a\x77\x7f\x95\x16\xc0\x8f\xf7\xff\x7d\xf9\xe2\xf9\xcb\x57\xfd\xfe\xbf\xdf\x1e\xbf\xf8\xbd\xff\xef\xdf\xe2\xcf\xbb\xb3\x4b\xf9\xb6\xd1\x5a\x9e\xc6\xfd\x5b\x5c\x8f\x7f\x21\xfc\x1d\x1d\x1d\x65\xf2\x83\x6a\xf2\x6b\x79\xfc\xfc\xf9\x73\x21\xc2\xa8\xb5\xa7\x27\xcf\xf0\x67\xf4\x9c\x45\xbd\x6e\x6f\x55\xa3\xe5\xdb\xba\xab\x0a\x36\xb9\xa6\x55\x3e\x92\xaf\x8e\xe4\xdb\x46\x55\x9f\x4a\x53\xc9\x45\x9b\xc9\xb7\x66\xdd\x5e\xcb\xb7\x65\x5d\x37\x99\x78\x53\xdb\x16\x3e\xf9\x61\x2c\x9f\x1f\x1f\x1d\x3d\x3f\x3c\x7a\xf1\xfc\x48\x5e\x2e\xc6\x42\x4c\x6e\x74\xb3\xab\x2b\x1a\xc0\xe6\x5b\xb1\xe3\x60\xbb\xed\xae\x37\x99\x10\x14\xdc\x4a\xb5\x66\xe3\x4c\x2a\x37\x29\xc3\x8d\x25\x74\x6d\x6a\x68\xba\x36\xce\xb2\xc3\xf1\xa7\xad\x9f\x76\x50\x96\xf5\x2d\x8e\x92\x96\x52\x3e\x1f\x49\xea\x0f\x0a\x9a\x6b\x89\x3d\xee\x7d\x03\xfc\xfe\xa4\x13\x37\xda\x03\x67\x8b\x76\x0a\xdb\xc1\x7c\x69\x57\x75\xfd\x29\xf3\xad\xdb\x7d\xcf\x79\x47\x86\x7c\xb2\x6e\xb4\x7e\xe2\x26\x00\x59\x9a\xf3\xbe\x96\xf0\xd3\xa2\xde\xbc\x86\xa7\x52\xfa\x8c\x26\xdb\xc3\x36\xe0\xa0\x0c\x8c\x23\x99\x1b\x2d\xf8\x93\xc9\x7e\x44\xb1\x6b\x2d\xc1\x3f\xc1\xd1\x0b\x75\xe3\x9b\xe0\xa3\xed\xb7\xa3\x85\x67\x92\xda\xf0\x8b\x90\xe0\xa1\xb1\x80\xe0\x4d\x47\x3f\xc2\xa9\x4b\x75\x55\xe0\xfc\xbb\xde\xe8\xfd\xad\x9f\x47\xc4\x13\x03\x84\xf2\x43\x83\x7d\x43\xfb\x46\x2a\x79\xab\x70\x8e\xc4\x15\x78\xb9\x34\x99\x95\xbf\x60\x1a\x1c\xdb\x9c\xc9\xdb\x6b\x83\x01\xd7\x56\xae\x34\x10\x18\xa6\x53\x0b\x8e\x5a\x61\xfa\x06\xbe\x96\xf4\x57\xa2\x8e\xf8\x6e\xec\x2f\xe8\xa3\x65\xef\x80\x94\xfc\x64\xaa\x02\x76\xf7\x09\xec\x54\xa9\xd7\xed\x13\x7c\x5f\x7e\xcd\x73\x96\x71\x74\x41\xa1\x71\x44\x9f\xb9\xd1\x3c\x5a\x9b\xe7\xc9\xf8\x23\xc3\x81\xcf\xed\xb5\xde\x58\x5d\xde\x60\xd2\x07\x8f\xcb\x9f\xa1\xda\xf0\x41\x8e\xe4\xb4\xe5\xe6\x92\xe4\xfe\xc1\xc6\xc0\x85\x7b\x47\x13\x27\xe4\x05\xd5\x65\xfa\x81\x1a\x44\x0b\x92\xea\x28\xf4\x33\x79\x68\xe8\x27\x0f\x1c\x84\xf7\x09\xcb\x37\x6d\x24\xc4\xcf\x9a\xe6\x3b\xf8\x0f\xa5\xcc\x59\xc9\xba\x29\x68\x12\x70\x07\xff\xa6\x5d\x27\x36\xb5\xfe\x81\xd2\x3d\x30\x13\x2b\x4d\xa1\xb9\xe4\xc7\xb2\xd2\xba\xb0\xf4\xb3\xa4\xdb\xd3\x6b\xa9\xe8\xa7\xdc\x35\x4d\xda\xeb\xba\x2b\x71\x06\xa2\x16\xc8\x7a\xee\x55\x34\x43\xca\xcd\xc1\xc0\x9d\x62\xfe\xb5\x61\x6e\x84\x7f\x5f\x51\x6b\x3b\x92\x6f\x78\x0a\xbe\x88\x8e\x12\xd8\xc3\xcd\xa4\x68\xeb\xf0\x0d\x7e\xcf\x8f\xb0\xc4\x5c\x55\x70\x34\x9d\xe5\x3d\xa3\x41\x60\x5f\xda\x4e\x95\x82\x58\x8d\x9a\x7c\xe3\x1c\x1c\x1c\x1b\x4a\x33\xc0\x36\xaa\x6d\x69\x6e\x8d\x9f\x97\x49\x73\xdf\xdd\x5c\x06\xa9\xe0\x80\xb6\x0d\x38\x96\x85\x80\x0b\x3e\x92\x3f\xe3\x10\x26\xb8\x2d\xfd\x79\x53\x5c\xea\x8e\x97\x0a\xc8\x20\x9e\xba\xc5\x81\x66\x4e\x9a\x98\xa4\x1d\x1d\x0d\xa4\xc1\x89\x5d\x39\x83\xc0\x8f\x46\xde\xbc\xc6\x31\x74\x38\x99\x31\x69\xdb\x98\xce\x9b\xc3\x21\xd5\x28\x92\x78\x80\x7d\x47\xa3\x4c\x58\x08\xd5\xcd\x27\xda\x6e\x9c\xfe\x60\x2a\x58\x0f\x0f\x85\xc6\xc8\x96\x9f\xf0\x13\x46\x94\x5d\xd7\x25\x70\x90\x55\x2c\x35\xdc\xf6\x06\x41\xf3\xd5\x69\x5c\x34\xd9\xfe\x89\x53\x34\x4f\x32\xb9\xd2\x65\x7d\x9b\xd1\x62\x3d\xb5\x38\x3c\x28\x90\x7c\x8b\xc3\x62\xc6\xb0\x0c\xbd\x59\xe9\xc6\x0d\xb0\xe1\x9a\x66\xbc\x2c\x7c\x47\x78\x24\x0d\xfc\xa8\xc0\x34\x05\x9d\xd5\x93\x5d\xdd\x3d\xc1\xe6\xb7\x4f\x3e\xb8\x51\x39\xac\xd6\x9e\xb8\xe9\x51\xa7\xfe\x72\xa3\x20\x00\x3a\x70\x97\x78\x83\x1c\xc7\xba\x8f\xe1\x08\x12\x34\xa2\x79\x1a\x53\x10\xa3\xa4\x78\x0a\xaf\x88\x32\x27\x77\x7b\xe2\x8a\xc7\xa9\x63\x71\x15\xce\x31\x11\xa6\xc2\x1d\xa0\x33\xc2\xe8\x86\xba\xa2\xa6\xbd\x4f\x9c\xe4\xdd\xb9\xc9\x77\x4f\x68\xe1\x95\xda\xc0\x1a\xb7\x5b\x5d\x15\xe6\x0b\x0d\x0e\x5b\x83\x81\x7f\xc8\x5c\x6c\xb9\x01\x13\x2d\x53\xf8\x65\xb2\xa4\x83\x3b\xe9\x7b\x43\x95\xbb\x30\xa2\x87\x2a\xf7\xea\x0a\x47\x5d\xc7\x3b\x0e\x72\xdc\xe2\x40\x1e\x1a\x85\xbd\xb7\x81\x3c\x0c\xc6\xfd\xfb\xc0\xca\xfa\x06\x84\x5d\xe9\x2f\xd8\x53\x9a\x3b\xe7\xc6\xb7\x10\xa5\xf6\x99\xe0\x99\x64\xc4\x90\xb0\x0d\xb4\xeb\xc8\xa6\x20\x4e\xd6\xf0\x10\x42\x4a\x31\xa9\x28\x71\xc1\xb9\x4d\xdf\x30\x12\x4f\xdf\xd6\x8d\xd4\x5f\x14\x88\xde\xcc\x0d\xb4\xf7\x24\xe2\x75\x43\x30\x82\x54\x5e\x49\xc3\x42\x36\x0a\xc4\xba\x6a\x4d\x6e\x33\xa9\xbc\xbe\xdb\x09\x37\x6d\xd6\x4d\x5d\xd2\x5f\xb6\xa5\xe2\x71\x4d\xd1\x97\x46\xcf\x90\xc5\x93\xcd\x23\xda\x57\x64\x17\xc0\x4a\x81\x81\xaf\x8d\x6d\xeb\x86\xa7\x7f\xef\x0f\x48\x72\x3b\xe5\x38\xa7\xb7\x55\x64\x4f\xac\x69\x04\x52\x16\xe9\xed\x4c\x6e\xaf\x4d\x59\xdb\x7a\x7b\x0d\xcf\xce\xa4\x6e\xf1\x2f\x38\x3c\xac\x06\x17\x10\xfe\xe1\x7b\x1d\x91\xfc\x63\xde\xde\x8c\xc8\xc2\x79\x32\xad\x6e\x54\x63\xc0\xc5\x74\x53\x16\x9f\xe0\x10\x2d\x6e\x02\x2e\xf7\x78\xd1\x49\x33\x1c\x98\x6f\x25\xe1\x71\xdc\x84\xea\x4c\xe0\x28\x3f\x7a\x09\x5b\x4e\xfb\x6f\xc8\x9c\xf2\x64\x29\x84\xa7\x6a\xd5\x2e\xd2\x0a\xfe\xea\xe1\x38\x40\x9c\x73\x58\x0c\x4f\xa6\xc3\x55\x9c\xe0\xfc\xe7\xa5\xfe\xd2\xf6\xc8\xb7\xd7\xd8\x42\x4b\x61\xc7\x3c\x62\x5f\xfd\x85\x2f\x04\x7c\xae\x34\x16\xc8\x06\xc1\xf1\x16\x6f\x12\x3e\x49\xe0\x93\x60\x1f\xdf\xa8\xfc\xd3\x61\xf4\xf4\x3f\x83\x74\x19\x91\x2e\x06\x49\x1f\xcb\x27\x4b\x10\x08\x5b\xd5\x80\x84\x24\x8b\xee\x01\x11\x25\x37\x2a\xbf\x36\x95\x3e\x6c\xb4\x2a\xfc\x40\xc9\x2c\xcc\x32\x43\x91\x22\xa9\xfd\xab\x6a\xf9\x90\x78\x78\x19\xa7\x03\x40\x88\xf8\x19\x42\x7c\x73\x79\x1c\x16\x0b\xd8\x8c\xbe\x27\xa8\xc3\x57\x6b\x9d\xdc\xbf\x31\xfa\x96\x27\xcc\x81\x19\xa7\x8b\x70\x33\x71\x50\x5c\xdb\x28\xd0\x1b\xeb\xba\xb9\x05\x1d\xcb\xa2\x05\x9f\x6d\x72\x81\x5b\x0e\xdf\x43\x09\xd2\xd0\xb8\x4c\x43\x20\x30\x1a\x87\xaf\xd1\x50\xdb\x9a\x2f\xba\xb4\xcf\xdc\xf7\xe4\x56\x99\xaa\x75\x66\x06\x8a\x21\xfc\x66\xd1\xa8\x5b\x53\x5d\xd9\x67\xd2\xd6\x1b\x2d\x6f\x4d\x01\xc2\x2c\xac\x8c\x7f\xcf\x6f\x74\x43\x21\x15\x1e\x88\xed\x0c\xf6\x01\xc4\xd1\xf1\xa6\xda\x76\x24\xc2\x80\x40\xda\xb8\x96\x04\x1e\xd9\x10\x6e\x30\xab\x97\xdb\x3c\xf4\x4b\x49\x60\x69\x8d\xe3\x08\x05\x7d\x2f\x3c\x5a\x3e\xf6\xe8\x91\x1c\xd3\x31\xa3\xfd\x8a\x32\x25\x8c\x79\x12\x11\x37\xc8\xb5\xa1\x47\x85\xc3\xdc\xa8\xe6\x53\xb7\xf5\xd3\x32\x23\xf3\x0f\x8e\xf2\x16\x04\x1c\x8e\xa6\xb6\x79\xdd\x35\xea\x4a\x0b\xdb\xad\x78\x94\x59\x9a\x16\x5a\xed\x24\x70\x11\xac\x94\xad\xab\xe8\xc5\x9e\x42\xb7\x65\x55\xdd\x8a\x94\x4f\x0d\xf0\x45\x59\xea\x42\x3e\x39\xdf\xaa\xcf\x9d\x7e\x82\x33\xc4\x50\xfe\xb2\x71\x15\xb6\x02\xf7\x06\xb6\x24\x5e\x1c\xbb\x6b\x34\xac\x0d\xcd\x10\x53\xc9\xf1\xe2\x64\x3a\xf5\x63\xdb\x68\xb5\x19\x5c\x3b\x53\xad\x6b\xde\x51\x7a\x60\x26\x67\x6a\xa9\xff\xd0\xfb\xd9\xe2\xdd\x87\x19\xec\xc0\x1f\x3e\xcc\x64\x67\x71\x88\xa1\x1f\xc0\x29\x02\x7b\x9c\x2e\x4f\x33\xe6\x5a\x05\x92\xad\x38\x74\x79\xf9\xea\xca\x55\x43\xbf\x5f\x7e\x98\xa5\x36\xf8\x75\xb7\x51\x55\xb2\x8d\x23\x41\x8b\xf7\x8b\x74\xab\xb9\xa8\x6d\xbb\xc8\x1b\xb3\x6d\x33\x79\x71\xfa\x36\x63\xa0\x14\x0d\x00\x77\x1f\x26\x4d\x47\xb7\x0b\x0e\x43\x44\x77\xab\xae\xca\x1d\x1c\x52\xfc\xbd\xdb\xba\xc1\xe9\xba\xb9\xb6\xb6\x06\xa5\x10\xaf\x16\x2d\x4d\xf4\x26\x50\xed\x2f\x4f\x9d\xbd\xc1\x5f\xa0\xb1\x6d\x75\x69\x79\x3e\x62\xeb\xae\x7d\x7c\x6f\x32\x3f\xb8\xd8\x89\x1a\xfa\x10\x48\x16\xdc\x0f\xc2\xad\xd2\x5c\x76\xba\x79\x29\x4d\x34\x1c\xbd\x6b\xe1\x4c\xd8\xd6\xb5\xb8\x16\x27\xa5\x97\xa0\x32\xe4\x85\xba\xd2\x4f\x48\xac\x65\x74\xcd\x9c\x75\x2d\xc9\x7d\x46\x93\x12\x3f\xba\x45\xbc\x34\x4e\xbd\xe3\x9e\xf2\x60\x2e\x8a\x75\x0d\x5e\x3b\x2c\x6a\x4b\x40\x52\x5e\x97\xd6\x05\xdd\x06\x30\x5f\x33\x50\x98\x66\x45\xce\x2b\xac\xa9\xd5\x8d\xc1\x19\x82\x41\x06\x0b\x9e\x34\x4b\xd6\xa8\x1f\xcb\x98\x12\x40\xc3\xfb\xc9\x90\x37\x95\x3f\x40\xda\xef\xa2\x96\x6e\x2a\xb2\xa0\xe1\xb9\x9e\x6e\x45\xd4\x66\x03\xeb\x66\xab\xf9\x4b\x2b\x2b\x78\x25\xd2\x57\x53\xfe\x66\x83\x00\x4a\x41\xc4\x60\x54\x98\x15\x02\x10\x70\x60\xe9\x05\xc0\x52\x3a\xd7\xde\xb5\x5a\xe9\x2b\x53\xa1\xd9\xca\x1f\x5e\xd5\x85\xd3\x24\x28\x7d\xc9\xaf\x38\x1e\xc9\x9f\x26\xf3\x37\xe3\xe5\xf4\x83\x3c\x39\xbf\xf8\x38\x3d\x7b\x27\xc4\xc7\xba\x43\x43\x67\x28\xbc\x92\xaa\x33\x36\x80\x74\x61\xba\x4d\x64\xff\x86\x98\x81\xd8\x0f\x23\x64\x61\x22\x34\x2b\xc8\x78\xa4\x64\xea\x74\x90\x4a\xb5\xc8\x87\x22\x1e\x50\xcb\xba\x96\xbd\x91\xf6\x01\xdf\x27\x21\x56\x85\x99\x00\x39\x6b\x46\x1c\x04\xbc\x35\xfc\x02\x22\x67\x57\x77\xe0\x3d\xc8\xaa\x66\x67\x29\xaa\x88\x0a\x53\x25\xe9\xe9\x64\xce\x88\x74\xf0\xb6\xdb\x3d\x60\x02\x9c\x66\x88\x68\x3c\xb0\xbb\x36\x5a\x61\xd1\x22\x7c\xb9\x5e\x91\xbb\xc7\xf3\x25\xdb\xa6\xc6\x59\x96\x02\x2e\x3e\x9e\x5a\xe3\x87\xd3\xc2\x76\x44\x07\xc9\x82\x72\x87\xaf\xf9\xa4\x59\xc0\xf3\xf9\x8c\xe4\x7b\x9e\xcf\x2d\x76\x4c\x07\x35\x2c\x44\xad\xaa\x2b\x86\xd4\x19\xec\x08\x7b\xad\xaa\x2b\xd2\x4d\xf4\x4c\x1c\xe8\xbb\x4b\x27\x16\x2b\x59\x22\xca\x4c\x57\x75\x77\x75\x2d\xab\x0e\x5c\x30\x20\x25\x26\xa3\xb3\xad\x54\xa5\xad\x25\x5d\x43\x26\xd3\x6f\x1b\x18\x5d\x6c\xe1\xbe\x18\x05\xf6\xc2\x6f\x94\x1a\x8d\x7e\x3a\x84\xe0\x3f\x62\x64\x20\x7a\x44\x3c\x78\x99\x0e\x6b\x57\x77\x02\x9e\x12\xcd\x53\xb6\xdb\x92\xb8\xd6\xb8\xee\x14\x2f\x46\x8e\xab\xe5\xf4\x4c\xfe\xc3\xe5\xf8\x6c\x39\x5d\x7e\x14\x82\xd7\xc9\x0e\x8d\x17\x36\x71\xc8\x30\xe2\x1c\x5a\x34\x1c\xc1\xa6\x6e\xd0\xc0\xab\xe4\xd1\xf3\xe7\x81\x2b\x23\x5f\xa7\xc7\xa0\x5e\x9a\x24\x06\xa3\xdf\x34\x5d\xe5\x65\xcd\x13\x2f\xe9\xe5\x34\x4e\xf4\x06\xdd\x61\xd2\x07\x4d\xb3\xcb\x64\x5e\x6a\xd5\xb0\x69\xe5\x85\x18\xf0\x6f\x7b\xad\xad\x8e\x9f\xfe\x7a\xc8\x6a\x25\x01\xb6\xa6\x3c\x6a\x8d\x3d\xfd\xe0\x49\x7d\x53\xd6\x7d\x70\xa5\xf2\x4f\xf4\xb9\x91\x7c\x53\xb7\xd7\x4c\x91\x08\x07\x3d\x40\x8f\x1b\x4b\xba\xa3\x2b\x64\x53\x97\x91\x37\xd5\x6a\x7f\x3e\xcb\x94\x22\xda\x10\xb6\x5c\x89\xdc\x0e\xd6\x87\x82\x12\x6d\x47\x58\x2e\xe8\x17\x7f\x40\xf4\x3b\xfd\xb9\x43\x49\xe3\x25\x25\x12\x75\x63\x30\x4c\x18\xae\x23\xdc\x69\xba\xd0\x5e\xee\xf3\x6a\x79\xbb\x41\x20\x30\x6a\x66\x84\xc1\x6d\x37\x31\x96\x82\xc4\x08\x1f\xf4\x01\xa7\xf0\x3d\x74\x14\xca\x1a\x4c\x0b\x5c\xf2\xce\xc7\x42\x03\x8d\xa2\xcf\x51\x68\x6b\xa8\xd6\xd8\xf5\xce\xef\x4a\x98\x30\xcf\x36\x40\xdb\x68\x62\x7a\x9b\x04\xb5\x77\x3c\x74\x96\x16\xc3\x25\xce\x58\xfb\xe1\xe6\x60\xbb\x51\xe9\x78\xa4\x70\xbd\xbd\x60\x86\x7d\x06\x39\xd8\xd6\xb5\xbc\xa9\xcb\x6e\x63\x2a\x6a\x35\x29\xd7\x88\x05\x25\xc6\x42\xd1\xc1\x21\xbc\x2d\x4f\x4c\x5d\x9b\xc6\xb6\xb2\xae\x70\x1b\xc0\x41\x92\x4f\x71\x62\x69\xb5\x03\xfa\xe0\xdb\x8d\x56\xb6\xae\xd4\xaa\xdc\x3d\x73\x3b\xab\x72\x0c\xb6\x45\x1c\xe7\xe7\xae\x13\xa5\xf8\x48\x50\xb4\xc5\x2f\x2a\x27\x00\xec\x95\xe6\xb5\xc4\x17\x34\x91\x71\x92\x8d\xac\xdf\x74\x5b\x45\xb8\xad\xe1\xd6\xd1\x76\x38\xe3\x6c\xc0\x91\xea\x19\xa6\x20\xab\xea\xea\x8a\x42\x99\x5a\xe5\xd7\x11\x09\x3b\x74\xc6\x51\x3e\x51\x9c\x55\x0e\x7e\x2a\x32\x3c\x0f\xdd\x4c\xab\x92\x7a\x01\x75\xad\x6e\x0e\x2b\xdd\x62\xbc\xa9\xac\xd9\x22\x8f\x02\x4f\x8a\x63\xc8\xed\x00\x61\xbd\xd5\x67\x98\x0e\x80\x9f\xaa\xa2\xa0\x80\x01\xf2\x7a\x16\x8c\x41\xef\xdf\xf1\x2b\x0f\xc9\x30\xe6\x70\x1a\xb8\x12\x44\x9f\x68\x6b\x59\xd4\xb7\x55\x59\x2b\x70\xf3\xea\x6a\xb7\xa9\x3b\x0b\x77\x1e\xf4\xb2\xab\x73\x8d\xbf\x7c\xe8\xcc\x67\xf7\x68\x8f\x08\xb7\x23\x77\xa2\x6e\xbe\x6f\xc9\x41\x56\x2e\xd1\xf0\x67\xd3\x82\x4a\x0b\xac\x24\xb7\x4d\x87\xad\xd4\x6d\xab\xb7\x16\x56\xa1\x2b\x64\x4f\xb4\x6f\xd2\x06\x8a\xf5\xba\xc7\x19\x86\xdb\xbe\x9a\x16\x2c\xbe\x5a\xea\x0a\xf3\x28\xc1\xea\x88\x76\x53\xe0\x6e\xe2\x68\x5f\x1a\x24\x2f\xdb\xeb\xce\x6d\x05\xd5\x8b\x70\x70\x9a\x34\x91\x3f\xa7\xae\x6a\x4d\x09\xbf\x04\xb7\x1e\x6f\x88\xd8\x81\x05\xa7\xd6\x2d\xeb\xb2\x52\x61\xb7\x8d\x8d\xde\xd3\xad\x55\xc2\x21\x4f\xbd\x03\x8d\x19\x91\x06\x14\x2e\xac\xb5\x91\xea\x0a\x3d\x6f\x0c\x0b\xb7\xca\x94\xba\xb1\xcf\xe8\xe4\x15\x79\xd1\x7e\xf2\xb4\x0b\x8b\xc2\x15\xe2\x70\x03\x8e\x04\xd6\x05\xe5\xbb\xc0\x28\x71\x02\x22\x0b\x06\x0f\x0f\x01\xa6\x4b\x3b\x1c\xd7\x13\xb7\x1a\xc7\x1e\xaf\xeb\x26\xed\x3a\x86\x93\xe1\x77\x64\x26\xec\xd9\x07\xb8\xef\x57\x86\x84\xe1\x06\x7b\xd3\x60\xcd\x7f\x5b\x3b\x2b\x10\xdf\x4f\xf2\xbd\x92\xdd\xb6\xc0\xdd\x75\x28\x95\x1e\x0d\xae\xbd\x74\xd2\x69\x71\xf1\xb8\xc1\xaa\x64\x3f\xe6\xbb\x27\x31\x82\xd9\x11\xf5\xd8\x01\x9f\xd5\x85\xb7\x8e\xf1\xa1\x2f\x9c\xf9\x91\xda\xaf\x40\x3f\x07\x75\xf0\x19\xfd\xd7\x71\xa0\x07\xcc\x73\x63\x75\xb9\xeb\x19\xbc\x3e\xe6\xb7\x47\xe6\xda\x94\xa5\x33\xe7\x9b\xba\xd4\x2e\x0f\xe5\xef\x3a\xb1\x28\x59\x1c\xf0\xc1\xe4\x36\xe0\x6c\xf6\xd8\xc5\xe7\x55\xbb\xd7\xf8\xc4\x6e\x5b\xcb\xdb\x6b\x32\x6a\xb7\xb5\xb5\xda\xe2\x28\x56\x2f\x5d\x4c\x3b\x92\xd3\xa0\x1a\xa3\xab\x5a\xd4\xa4\xbb\x04\x06\x6a\xad\x73\x93\xfa\xeb\x78\x2d\xc4\x78\x24\x2f\xad\xcf\x8f\x05\xdf\x47\x3e\xc5\x21\xe4\x55\xa2\x4e\xcd\x1a\xf8\xe9\x99\x54\xac\xdf\x1d\xc8\x0b\xa7\x5a\x0b\x0a\xf7\xf6\x84\x1e\x2e\x96\x86\x5e\xbb\x10\xe3\xb6\xd1\x37\x06\x74\x9b\x47\x85\x3d\x25\x09\x48\x7a\x0d\x5e\x03\x9b\xd9\x68\x79\x0b\xff\xa7\xaa\x5d\x46\x63\xe7\x51\xb7\x31\xa5\xef\x31\x4a\xbb\xeb\x05\xd1\xfd\x7b\x9f\x79\xeb\x42\x38\xb1\x86\x76\x2b\xd1\xcd\x49\xa2\x94\x0c\x17\x8a\xae\x1b\x73\x65\x2a\x17\x64\x0b\x06\x92\x6a\x85\xfb\x24\xdc\x1a\xce\x77\x5b\x6e\x95\xf3\x66\x24\x67\x06\x85\x4c\x6f\x23\xd1\x08\xe1\x8b\x9b\x81\x0c\x92\x98\x1d\x6d\x1c\x18\x11\x65\x07\x58\x67\x88\xa1\x8a\xd2\xa8\x82\x83\x5a\xf0\xc5\x28\xd2\x9f\x66\x2a\x1e\x38\x58\xb8\xdb\x57\x94\x20\xc3\xe1\xe7\x5e\x06\xae\xe1\xbe\xbb\x9c\x81\xcb\x7e\x3d\x24\x57\xe4\x53\xb0\xeb\x90\xd1\x6c\xf8\xb4\xf0\x8b\x31\xf0\x1b\x54\x4b\x98\xa7\x43\x75\x0e\x2f\x78\x36\x12\xe2\x64\x84\x73\x4a\x74\xba\x21\xe8\x6a\x63\x40\x16\x0e\xa3\x9f\xbb\xe8\xdf\x03\xbf\x1a\xd1\x37\x59\x7d\xb7\xb7\xd3\x91\xbc\x70\x36\x1d\xdb\xdc\xfb\x3e\xea\x80\xac\x9a\x8c\xe4\xb8\x00\xdd\x49\x43\xfd\xb6\x8d\x51\xed\xfe\x37\xd1\x42\x43\x31\xdf\xcb\x0f\x39\x9b\xa8\xad\xf1\xda\xd7\xde\x19\x4c\xde\x3b\x12\xe2\x2d\xdc\x50\xb4\x65\x32\x69\x36\xe0\x8d\xab\x16\xe3\x9f\x5e\x05\x0d\x79\xd4\x7d\x57\xe5\xca\xdc\x80\x65\x19\xa5\xd6\x02\xef\xb9\xc4\xf1\xa0\x9c\xfa\x4a\xd6\xcf\xc7\xc7\xd7\x75\x83\x99\xe1\xdb\xca\xfd\x64\x5c\x14\xba\x2a\xba\x0d\xe5\x01\x47\x42\xbc\x8b\x76\xda\xe5\x76\x7a\x64\x7a\xcf\x00\xae\xaa\x1d\xce\x26\xa0\x63\xe6\xed\xe0\xd8\xc1\x81\x4b\xe5\x5f\xff\xa0\xdb\xe6\x4f\xfe\xbd\xdf\x59\xd4\x4e\x95\x2a\x5b\xdd\x90\xa3\xb8\xeb\x43\x40\x40\xe5\x46\xe4\x13\x9a\x83\xe4\x06\xde\x3c\x0c\x8e\xb2\x44\x79\xc2\x89\xca\xd6\x47\x6f\xe0\x9f\xe0\xa2\xb4\x35\xb0\xbb\xaa\x84\x69\xf5\x86\x66\xe5\x80\x82\x75\x57\xcb\xbb\x14\x99\x04\x2b\x23\x93\x95\xbe\x0d\x17\x3f\x05\x5b\x3c\x24\xf0\x95\xdb\x86\x3d\x31\x82\x01\x00\x92\x8a\x18\xe5\x7d\x64\x01\xa2\xb7\x87\x99\xcc\xd1\x5d\x41\xe1\xe3\xc8\xde\xa3\x76\x98\xd2\x7d\xf7\x28\xa2\x10\xf6\x28\x16\x74\xed\xb5\x46\x6d\x04\x07\x82\x7b\x54\x68\x9b\x37\x66\xc5\xef\x13\x7b\xec\xa9\x7c\xf4\x80\x49\xf6\x32\x19\x73\x24\x94\x62\xff\xbb\xde\xc9\xf5\xcd\x71\xa7\x96\xb2\x61\x0e\xc2\x3b\xcc\xc3\x9a\xc9\x64\xa4\x9c\xc0\x57\xcd\x75\x72\xa0\xcd\x27\x7d\x6b\xec\xf0\x9b\xad\x78\xe4\x8d\x7b\x4a\xce\xb4\xf2\x56\x59\xec\xa2\x0f\x8a\x15\x33\xee\x98\x27\xd8\xc9\x95\x16\x94\xdb\x77\x8f\xf2\x67\xe9\x8e\x39\x38\xcb\xf5\x06\x98\x70\x8f\x16\x8e\xcd\xc2\xcf\x48\x11\xc3\xbb\x22\x58\x84\x57\x00\x20\xcd\xe0\xc4\xad\x33\x18\xd3\xb0\x21\x87\x6f\xeb\x86\xd5\xa1\x78\x48\x1d\x06\xbc\x32\x3a\x98\x0e\x25\x30\xa0\x1a\xff\x9e\xac\x94\x6a\x37\xc0\xb3\xe3\xfc\x53\x55\xdf\x96\xba\xe0\x9e\x34\x4f\xe0\xcd\x4f\x4e\x75\xe1\x64\xed\x93\x2c\x71\xda\x05\x3f\xe2\x20\xb9\x9d\xdb\x44\x30\x85\xcb\xed\x34\x82\xed\x56\xdc\x75\x0a\x63\x89\xa8\x84\xd7\x02\xfd\x40\x1f\xb9\xe3\x0e\x62\xb0\x8b\x3d\x9a\x5c\x78\xbe\x08\x54\x31\xab\xe1\x7d\x34\xb0\xc6\xd9\x80\x1e\x1a\x10\x7e\x7b\x3c\x16\xe4\x16\x91\x6e\x1a\xca\xbf\xa1\x08\xe2\x9f\x70\xf2\x76\xe4\x1e\xc3\x96\xbc\x25\x5f\x04\xa3\x2c\xe6\x46\x95\x2e\x90\x0a\x7e\x44\x04\xcc\xc2\x54\x3a\xbf\xd7\xed\x0b\x3f\x50\x88\x0f\x23\x79\xaa\xd1\x7b\x1d\x3e\x9e\x49\x55\xd4\x8d\xe5\xa3\x19\xc9\x45\x97\x5f\x4b\xe5\x3f\xe7\x42\xa9\x2b\xed\x1c\xf6\x42\x3c\x60\x90\x8c\x84\x38\x1b\xc9\xd3\x9a\xbd\x1c\x36\xc3\xaa\x1d\x95\xf5\x60\x2e\xc7\x9d\x99\xed\xbd\x56\x12\x24\x81\x0a\xe4\xf2\x56\x9a\x4a\xc4\x91\xa7\x6a\xb7\xbf\xd1\x21\xe2\xb2\x27\x72\x98\x50\x8b\xd2\x79\x08\x8e\x81\xdb\xca\xa8\x0d\xb0\x1d\xd0\xf0\xfb\xdc\xa9\xd2\xac\x31\x9e\x32\x90\x62\x8f\xc0\x11\x20\x99\x7d\x10\x8b\xd1\x26\x6c\xfd\xc6\x91\x00\x1f\x00\x6e\xc9\xbc\x20\x5f\x3b\xa4\xe6\x29\x63\x03\x84\x90\x01\x46\x81\x28\x4f\xa1\xc2\x29\x2e\xb4\xe6\x91\x58\xd6\x64\xef\x1b\x10\xde\x45\x91\x30\x8d\x73\x3d\x4b\xb4\x4d\x07\x15\x72\xef\xc4\x9c\x2e\xda\xd7\xbc\x2c\xb0\xf8\xc1\xe8\x67\xac\x7a\x3e\x00\x1e\x07\x59\x43\x4c\xac\xf0\xbc\x16\x47\xfb\xd4\xd7\x78\x2d\xf2\xe4\x4c\xbb\x87\x3c\x11\xe0\x2f\xeb\xe8\xf3\xb0\x34\xdc\xc8\xbd\xf3\x5e\xed\x30\xfb\x0b\x92\x98\x9a\x4d\xd9\xc3\xc3\x75\x04\x40\x11\xa8\x80\xfc\x43\xb6\x1a\x03\x77\x37\x46\xdf\xd2\xf5\xe2\xd0\x02\x5e\x4a\x9f\xcb\x45\x9b\xf1\x86\x72\x6b\xaa\x92\x75\x73\xa5\x2a\xf3\x8f\xd4\x40\x8b\x4d\x55\x52\xa7\xd8\xec\x08\xb1\x7f\x6b\xec\xa0\x4a\x8e\x8a\xf2\xc9\xcc\xbd\x6d\x61\xec\x03\x7c\xaa\xdb\x52\xf0\x8f\xb0\x8e\x05\x25\xce\xe2\x08\x32\xda\x4d\x6c\x9e\xb8\x2f\x0a\xff\xc5\xe3\x57\xf1\xd7\x7a\xe1\xe4\xcc\xf1\x85\x26\xd0\x65\xcc\x22\x91\x4d\xf6\xe0\x6d\x96\xe7\x55\xb9\x43\x7b\x22\x22\xb8\x4f\x9a\x24\x0f\x12\x7f\x17\xde\x8f\x71\x6f\xd6\x7a\x1c\x09\x5b\xed\x08\x77\x44\x71\x15\xc9\x63\x4f\xe8\x4c\x18\x39\xfa\x8c\x38\xab\xd2\xc4\x30\x3b\x30\x87\x44\x6a\x98\x94\x8d\x56\xc5\x2e\x5c\x70\xc5\x41\x55\x97\xd3\x8f\x93\x17\x18\xf4\x74\x2a\xba\xdc\x09\x4f\x07\x5c\xcc\xba\xc1\x73\x0d\x54\x78\xf8\xaa\x7f\x02\x11\x41\xd1\xf4\x86\x7a\x4d\x55\x57\x60\x12\xad\xf4\xb5\x2a\xd7\xa2\x5e\xb3\x33\xce\x12\x92\x8c\x22\xbc\x18\x3f\x62\xb0\xc7\xfd\xb2\xd1\x5c\xae\x0a\x5e\x44\x89\xdb\x05\x4e\xa2\x9f\x8d\x22\x22\x43\xdf\xcb\x11\x6f\x5b\x04\x95\x4c\x10\x99\x82\x22\x1f\xfe\x51\x9c\xca\x25\x5e\x7c\x6a\x9f\xa5\xb6\xdd\x53\x17\xa9\x8a\x76\x91\x33\xa4\xab\x34\x14\x82\xea\x4e\x0c\xfa\x1c\xa6\x41\x5f\xce\x46\x66\x16\xec\x0c\x26\x97\x1b\x46\x48\x6b\xc2\x3a\x98\xcd\xb6\xdc\xc5\xd7\x16\x98\x15\x8e\x75\x40\x59\x60\x23\x6f\x79\x72\xfe\xe1\xcd\xf4\x6c\x7a\xf6\x4e\x9e\x9e\x9f\x5c\x7e\x98\x9c\x2d\x93\x88\xd2\x66\x65\xaa\x9e\xfd\x42\x60\x6a\x14\x40\x0e\x06\xfb\x28\x24\x29\x13\x7d\x17\x09\xaf\x2a\xe9\x63\x27\xa3\x5e\x52\x74\x29\xc2\x35\x87\x38\x98\x0d\x92\x4a\xf8\x98\x93\x0b\x5f\x1b\x17\x3e\x01\x4a\x95\x37\x49\x78\xd3\x87\xed\x03\xfa\x80\x48\x22\x11\x7e\x29\x60\x30\x38\x0a\x9c\x81\xca\x80\x67\xfc\xa2\xb2\x03\x4f\x15\x4e\x38\xf2\x8e\x15\x04\x9f\x34\x64\xc0\xef\xb9\x57\x4b\x4f\xb1\xfb\x64\xa5\x1d\xcc\xc1\x69\xb9\xba\xd2\x83\x8e\x16\xd1\xb4\xe9\xca\xd6\x6c\x4b\x2d\x28\xed\x94\xab\x72\x68\xad\x2c\x02\xf8\x06\x14\xac\xce\x71\x2a\x27\xe3\xa5\x82\xcf\x23\x10\x40\xcc\x8f\x1d\x7a\x58\x80\xe7\xc1\xf5\xc4\xe8\x02\x5c\xb3\xc2\xac\x11\xab\xdb\x4a\x87\x91\xca\x04\x66\x66\x43\x8e\xaa\x5e\x53\x42\x00\xa1\xad\xee\xc4\x69\x56\x0f\x8a\x81\xa2\x60\x2f\x2f\x12\x97\xa6\x05\xcf\x59\x90\xf7\x00\x4a\xd1\x66\x7b\x51\x0d\x7f\x78\x8c\xb6\x77\xd7\x23\x0e\x28\x79\x25\x69\xd6\x12\x6c\xce\x0a\x0d\x6f\x5d\x5a\x2d\x95\xa3\x81\x8c\xbd\x91\xfc\xe0\xc8\xc6\x15\xaa\xe2\x97\xce\xb6\x31\xa8\x33\xd5\xb7\x8e\xf5\xbe\xae\xf7\x7b\x3e\xbc\xb7\x87\x89\x01\x10\x8d\x0d\xe6\xd4\x1e\x27\x47\xd1\x46\x77\x13\x23\x1b\xd2\x0e\xf8\xa5\xfc\x46\xe1\xf4\xf1\x10\x7b\x3b\x64\x0f\xba\xaa\x0f\x7a\xb8\x3f\x7a\xbf\x4c\x7c\xe5\xdd\x7b\xfe\x05\xeb\xcb\xa1\x4f\x8b\xc4\xef\x60\x8f\x0b\xa3\xa9\x6c\x22\x97\xe5\xd0\x2b\x62\xbb\x65\xf4\x84\x9b\x66\xcb\x93\x73\xec\x67\x8f\xd5\xc8\xe7\x6f\x87\xe4\x17\x17\xa4\xb8\x71\xb6\x94\x57\xb2\x6c\x0d\x0f\x65\x25\x1f\x12\x6b\x03\x70\xc5\x8c\x4b\x4d\x82\x72\x31\x55\x61\x6e\x4c\xd1\x39\xb3\xd4\xee\x97\xc9\xa4\xa7\x13\xde\xb3\x7f\x31\x3d\xda\xcc\x99\xfd\x41\xd2\xb9\xc5\x0c\x89\xc5\x08\x82\xd0\x74\xe5\x00\x09\x20\x60\xfb\xf9\x54\x7f\x41\x7b\xa5\x1e\x94\x15\x06\x61\xd9\x4f\xb6\xba\x0d\xd6\x5f\xda\x46\xe5\x6d\x20\xdd\x57\x89\xa0\x26\xb5\xe4\xcc\xc4\x24\xf7\xf2\x13\xa6\x15\x61\xdb\xca\xdd\x90\xfa\x08\x66\x2a\xc9\x7d\xd4\x75\x6a\x50\x36\x12\x86\x1c\xa5\x08\x11\xa6\x0b\x59\xa4\x61\x72\xb7\x3f\xe9\xa9\xec\x2f\x52\x04\x74\xf0\xd0\x76\x11\x80\x3c\x49\xcc\x7c\x37\x92\xe3\x77\xef\xe6\x93\x77\x98\x97\x91\x3f\x4f\x97\xef\xe5\xf4\xec\x74\x72\x31\x39\x3b\x9d\x9c\x2d\xe5\xcf\xe7\xf3\xbf\x5f\x08\x31\x4e\x66\xd9\xf7\x99\x10\x74\x38\x96\x95\xba\x22\x1c\x1b\xeb\x5b\xab\xb1\x0f\xa6\x66\xdf\xb5\xc0\x36\x3f\xd8\xba\xcd\x9f\x98\x43\x66\x65\x9c\x8e\x05\x7d\x48\xc9\x6e\xed\xec\xe2\xba\x41\x6b\xb2\x49\x33\x26\x0c\x63\x12\x45\xad\xb9\x12\x0c\xec\xbb\xdb\xeb\x1a\x19\xb2\xab\xf8\x07\x5f\x4b\x27\x45\x4c\x59\xd5\xc9\x52\x43\x14\xd6\x58\x99\x97\xca\x6c\x18\x49\xc8\x52\xcf\x7d\xd0\xfb\xc0\xd1\xcf\x44\x40\x58\xaa\x4a\x3e\x51\x57\x57\x70\x3c\xad\x7e\xe2\xa0\x4b\xd1\x71\x86\x05\x6c\xc1\x18\x62\x86\x70\x1b\x58\xae\x0f\x59\xc3\xb2\xe4\xb5\x94\x47\xa2\x97\x39\x1d\x99\xae\x88\x06\xc2\xe2\x1e\xd0\x6a\x4d\xe3\x31\xdd\xd1\x57\x33\x41\xf1\x9c\x9d\x8f\x11\x44\x55\x52\x03\x65\x55\xfd\x80\x39\xfb\xd3\x91\x75\xcf\x41\x5c\xe2\x8c\x75\x80\x11\x21\x70\xd9\x37\xee\xe0\x25\xda\x08\x13\xb0\x97\x29\xd3\xd5\x50\x19\x40\xc8\x29\x80\x32\xf8\xdc\x29\xec\x8d\xcf\x94\x81\xf8\x05\xb3\xc0\xed\x75\xd6\x8f\x1a\xc7\x91\x65\xb6\x34\xd8\xce\xa8\x53\x14\x8f\xed\x9a\xa6\xee\xaa\x42\xa0\x81\xb3\x67\x4c\xb2\x60\xf3\x2f\x1a\xc9\x73\x07\x00\xa6\xed\x24\xe0\x0d\xa1\x11\xfd\xa3\x85\xc2\x67\xe2\x57\x89\x4b\xc3\x03\xf0\x3e\x7e\x3f\x92\xcb\xf9\xf8\x6c\x31\xe3\xc6\x63\xcb\x08\xb2\x4c\x33\x86\x39\x7e\x13\x55\xc6\xa5\xcd\xf0\x6c\xed\x9d\x88\x18\x03\x18\x9e\x63\xf7\x62\xb7\x03\xd9\x00\x6f\xe2\x8e\xe4\x1c\xb5\x05\x30\xce\x80\x09\x49\x8c\x17\x3d\x3c\xc0\xa7\x10\xb5\xae\x4a\x39\xe0\xa9\x98\x66\xaf\x4a\xc9\x66\x22\xf6\x7f\x9c\xa5\x9c\x3c\x1a\xe8\x8a\xe2\x1f\xc3\xb6\x8b\xcb\x7a\x0a\x77\x87\x9c\x35\xe1\x03\xae\x3e\x6e\xb2\xff\x80\x10\x4e\x0d\x48\x93\x88\x04\xd1\x57\x4c\xfb\x69\x65\x84\x5a\x79\xea\xe3\xf7\x4f\xaa\x2b\x04\xc6\x30\x1d\xfd\x67\x61\x30\x34\x57\x96\x25\x5e\x61\xac\xba\x6a\x34\x5d\xa3\x95\x6e\x6f\xb5\x66\x48\x6b\xc4\x11\x0c\xf5\x15\x0f\xbd\x63\xdf\x0c\x7f\x8c\x22\x84\x52\x08\x70\x22\x95\xe1\x11\xbf\x3f\x8c\xe4\x72\x32\xff\x30\x3d\x63\x76\x8c\x81\x92\x04\xa4\xa1\xaa\xd4\x4c\x5a\x74\xf1\xe8\x25\x29\xf4\x27\x61\x35\xfd\x05\x91\x8d\xca\xba\x66\xd3\x88\x17\xe1\x4d\x04\xb9\x3a\x50\x62\x81\x85\x64\x24\x0a\x55\xdb\x62\x3b\x51\x2e\x9c\xf5\xaf\x17\xe1\xf5\x8f\xbd\xdd\x58\x79\x53\x1b\xf6\x90\x10\x38\xe2\x8b\x03\x50\x91\x53\x9f\x45\xd5\x6a\xc2\x70\x20\x7f\xda\x41\x92\x1c\x64\xd3\x05\x8f\xe0\x36\x53\x39\x67\xa3\x73\x6d\x6e\x3c\x32\x31\xc3\xca\x40\x7c\x50\x46\xfc\x8f\x90\x9a\xbd\x47\x12\x39\x0e\x85\xcc\x97\x84\x97\x64\x03\x61\x85\xb0\xb5\x87\xae\xa1\xa5\xe2\x08\x60\x08\x8c\xa9\x28\xd5\x86\xf0\x23\xa3\x42\x35\xe2\xf3\x91\x7c\x7b\xb9\xbc\x9c\x4f\xe4\x7c\xf2\xd3\x74\xe1\x0c\xd0\xe5\xfb\xe9\x82\xc6\x5f\x2d\xb8\x5c\xfa\xa1\x8a\x70\xe9\xa1\x9b\xf6\x5a\x56\x1a\x6b\x00\x6f\x8c\x8d\x5c\x5e\x27\x84\xdf\x9d\x5d\x8a\x87\xeb\xd3\x59\x0a\x98\x0d\xe9\x00\xb3\xd1\xac\x3c\x2b\x7d\x1b\x1e\x85\xdb\xb1\xc2\xc1\x66\xa6\x54\x8d\x00\xb7\x7b\x6b\x1a\xe3\xfd\x1a\x07\x3b\xbc\x71\x99\x6d\x10\x1f\x24\xf5\xc0\xb7\x93\x38\xce\xb8\x55\xa6\xc4\x60\x03\xd5\x16\xc2\x2b\x04\xf6\x89\xd1\x58\x89\xe2\x7a\x65\x62\x0c\x5d\xcb\xeb\xb6\xdd\xbe\xfe\xe6\x9b\xdb\xdb\xdb\xd1\x55\xd5\x8d\xea\xe6\xea\x1b\x57\xd2\xfb\xcd\x48\x88\x09\x58\x9b\x3d\x98\x4b\x54\xdf\x4a\xa1\x7f\xc5\x81\xcf\xab\xce\xd8\x6b\x36\xc4\x6c\x08\xce\x3b\xd7\x35\x54\xf5\x71\x71\x0f\x47\x94\x31\x62\x47\x0d\x77\x55\xc3\xdf\xe9\x83\x6b\x22\xa6\x79\x52\x37\x82\x90\x3c\xa0\x03\x6f\x5c\x81\x64\x84\xa7\x06\x97\x14\x38\xce\x71\x95\x0b\x29\xd7\x6b\x19\x00\xf8\x5e\xf4\xbb\x7a\x3e\x87\xe1\x65\xd8\x9d\x77\x4b\x99\xd6\x88\x20\xfc\xe5\x1e\x09\x14\x1d\xf7\x71\xd1\x90\x6f\x7a\xea\x8d\xb4\xa2\x51\xeb\xf6\x99\x8b\x9e\x3d\xc4\x74\xfb\xfb\xe5\x2d\x25\x22\x66\x27\x55\x6f\x8b\xf7\x85\x9e\x53\x2a\xf9\x75\x5d\x5b\x42\xf8\xbb\xaf\x10\x86\xe6\x2f\x27\x4f\x8c\x4f\x4f\x27\x67\xa7\x97\x1f\x5e\x83\x48\x08\xf1\xaf\x9e\xf3\x82\xe2\xc4\xdb\xbb\x42\x2c\x07\x3e\x87\x75\x5f\xde\x15\xf1\x67\xc6\xdd\x07\xb2\x48\x23\x45\x69\x49\x91\x7a\x69\xe1\xfb\x14\xd1\x63\x20\xa8\x3f\xe8\xa0\x75\x29\x46\x14\xbb\xf8\x56\xfc\x82\x26\x8b\x47\x20\x84\x2a\x88\xd7\x49\xeb\x88\xfc\x99\xfc\x38\x19\xcf\xe5\xc7\xf3\xcb\xb9\x3c\x1b\x7f\x98\x8c\xe4\x45\xd0\xf1\x70\x13\x1a\x55\x45\xed\x1e\xb2\x14\x40\x57\x7c\x53\x37\xd4\x10\x94\x83\x89\xc5\x23\x76\x08\x8b\x93\x47\xda\x5d\x64\x71\xbb\x0b\xc9\x35\xe3\x29\x33\x86\xf3\xfd\xca\x71\xfe\x28\xbc\x21\x3d\x60\x5c\x90\xf5\x3c\x9b\x2e\x96\x72\xf9\x7e\x32\x9d\xcb\xe5\x74\x39\x9b\x2c\x22\x3c\xd8\x3e\x8c\x3b\x7c\xc7\x29\x1d\xfe\xe8\x1e\x8e\x3b\x7c\xd2\xd7\x6e\xf1\x11\x97\x41\xc6\xf4\xfd\xea\xfd\x50\xc8\xe3\x9b\xf5\x24\xe0\x74\x91\xb9\xaa\x7a\xb0\xb0\xf3\x16\x9b\x20\x3e\x41\x62\x07\x3f\xf2\x04\x6b\xdf\xb5\x2a\x10\x73\x47\x15\x1d\x84\xd5\x42\xb8\x31\xec\x6a\x48\x44\xc9\xde\x1b\xfb\xf9\x00\xf7\x42\xf1\x64\xe8\x97\xfe\x55\xd8\x04\x62\xef\xd7\xd1\xbe\xc5\xe1\x9f\xf5\x40\xd5\xa7\x5f\x7b\xb8\x8a\x71\x06\xa9\x6a\x1b\x73\x83\x03\xfd\xa2\x1a\x38\xd7\x1d\x21\xaf\x0b\x9d\xc9\xdb\xa8\x63\x80\xa0\x30\x0b\x8b\x4f\x6c\x89\xca\x5f\xa3\x3a\x65\x70\xfc\x4a\x66\x69\x8a\xb2\x5e\xd7\x1c\x48\x4b\x3b\x34\x38\xb3\x49\x50\xe0\xc1\x7a\x9e\x7f\xa8\xe3\x44\x5b\x73\x4b\x15\xb6\x12\x3a\xba\xfe\xc9\x53\x47\xbf\x37\x64\xfa\xcf\xfb\x67\xf4\xcd\xf9\xbb\xd9\xe1\x89\xaa\x54\xa1\x0e\x8f\x47\xcf\xff\x1a\x0d\xa0\x1e\xef\xff\xf4\xfc\xbb\xa3\x57\xdf\xf6\xfb\x3f\x7d\x77\x7c\xf4\x7b\xff\xa7\xbf\xc5\x9f\xf3\xad\xae\xe4\x3b\x10\x6c\x15\x0a\xb1\x19\x4f\x52\x3d\x94\xc4\x13\xe4\xa7\x29\x6c\x95\xc8\x55\xc4\x45\x0c\x07\x9c\xba\x5e\xc8\x6c\xa8\xa5\x25\xe5\x91\x6f\xc2\xbd\x24\x49\x2b\x62\x1c\x44\xc9\xb5\xbe\x8d\x2c\xc4\x91\x10\x97\x96\x62\x03\xe1\x99\x03\x4f\x00\x17\xe4\xbf\x20\xa2\x98\xcd\xc5\xf8\xf3\xa6\xc2\xf0\x3a\x95\xa6\x35\x5c\xfd\x16\x57\x4d\x92\x39\xe0\x10\x87\xff\x05\x1b\x36\xc4\x0f\xb8\x20\x0f\xb2\x21\xcb\x83\x2a\xdc\x10\xf3\x54\x16\xb7\x06\x04\x77\x53\xef\x54\xd9\xee\x0e\x41\x46\xe2\x84\xa1\xad\x6e\x3b\x55\x66\xa2\xaa\xab\x43\xdf\x4c\xc3\x8f\xa4\x1d\xde\x2b\x67\x82\xc1\x72\xa9\x02\xcf\x4f\x1a\x72\x85\xb2\xe8\x88\x62\x1b\x08\xf6\x52\x52\xca\xdd\xb1\xa0\xa8\x6e\xeb\xd7\xb0\x96\x93\xc4\x8d\x66\x53\x25\x0b\x3d\x46\x32\xa9\x0a\xb5\x6d\x13\x23\xca\x75\x85\xc1\x68\x13\x53\x2a\xd2\x1d\x4d\xaa\x3c\x37\x75\xa1\xb9\x1c\x7e\xa3\x5a\xdf\x59\xa7\x54\xb7\xeb\xce\x13\xef\x22\xe4\x9d\x6d\xb1\x68\xa3\xe1\xe2\x07\xea\xf0\xc2\x27\x81\x09\x4f\xa4\x3b\xca\xa0\x90\x29\xc2\x53\xd0\xd7\x7b\x2c\xb6\xda\x45\x1b\x87\xd5\x47\x6d\x88\xe0\x7a\x98\x85\x08\xce\x05\x5b\x69\x43\x27\xcc\xc9\x6a\x47\xe0\xb6\xa6\x4a\x0f\x1f\xc0\x45\x8c\x6c\xf5\x89\x82\x3f\x81\xff\x90\x6b\xa6\xfb\xa4\x79\xc6\xf1\x5e\x45\x78\x8e\xeb\xba\x30\x4c\x2e\xfa\xf5\x66\xed\x53\xfd\xdd\xde\x2d\xa0\x64\x82\xc6\x36\x27\xa1\xfd\x78\x5d\xb9\x57\x34\x36\x4d\x8a\x46\xaf\x09\x15\xde\xdb\x46\xe5\x94\x29\xf5\x6e\x04\x0f\x1e\x62\x38\x52\xe9\x03\x7f\x3e\xed\xd6\x21\xbe\x3f\x36\xfb\x07\x57\x40\xa3\xe2\x4f\x9c\x01\x14\x53\xc8\x26\x49\xdc\x1d\xe8\x21\x99\xf3\xef\xff\xf4\xcf\x2c\x75\x38\x45\x9c\x00\x8a\xfd\x8d\x42\x8b\x70\xc3\x93\x4a\x18\x49\x4b\x9b\xb7\x66\x17\x1d\x03\x16\x3b\x0f\xde\xe2\x20\xe5\x86\x42\x56\x1c\x89\x89\x1c\x8b\x5e\x14\xc5\x77\xbd\x65\xd6\xe6\xb0\x81\x97\x3f\xee\x9b\x8f\xb0\x56\x46\x31\x07\x5d\x15\x69\x54\x08\xbb\x22\xe8\x0d\xb7\xa9\xa7\xa6\x4d\x7e\xce\xb8\x63\x1b\x7c\x3e\x31\x43\xb5\x23\x72\x59\x8a\xbc\x66\xd9\x77\x81\xa8\x7e\x4c\x79\xfb\x77\xff\xc8\xbf\x6b\xaf\x4d\x53\xa0\xe3\xbf\x73\x4b\x7d\x90\x53\x5d\xcb\x3b\xc2\x11\xfd\x23\xed\x06\x1f\xd8\x8f\xc0\xe6\x2e\xe1\x6c\x11\xdf\x6b\xc1\xbc\x2e\xeb\xab\xda\x46\x1d\xed\xea\xf5\xda\xa0\xdc\xb2\xbb\xcd\xaa\x2e\xed\xd0\xad\x75\x2f\xfc\x51\xa8\xaa\xc0\xeb\x13\xfd\x32\x92\x72\x35\x17\xe6\xb9\xe9\x34\x20\x0d\x9b\x7a\xab\xc3\x5a\x62\xb9\xb9\x55\x9c\x6d\x6f\x1b\x55\xe8\xc3\x8d\x6a\x3e\xd1\x35\xf0\x24\xe1\x8f\x46\x42\x9c\x81\x64\x8e\x30\x21\x7f\xf6\xc6\xef\xad\x08\x1d\xec\x5b\xb5\x13\x1c\xdf\xbf\xba\x82\xdd\x61\xe9\xe6\x36\xa4\x55\x6d\x67\x13\x88\xd7\xe0\x29\x30\x65\x56\x30\x30\x08\x6f\x66\x67\x87\xe4\x1f\xae\x45\xfe\x8c\xb8\xa1\x76\x47\x97\x24\x21\xcb\x86\xfb\xf6\x44\x59\x69\xec\x93\xd0\xc4\x61\xf8\xe5\x5f\x08\xca\x24\x14\x96\xbe\x71\x24\x4c\x39\xe7\x8d\xde\x84\x95\x5c\xd1\x1c\x12\x07\x0b\xa1\x0e\xee\xf8\x5b\xd7\x2b\x8d\x43\xb1\x82\xb1\x38\x88\x21\x61\xfd\xb5\x51\x5f\xcc\xa6\xdb\x48\xfd\xa5\xc5\x5a\x4f\xdf\xca\x71\x85\xea\x63\xb4\xbf\x9c\x3e\xa3\x96\xc6\xb7\x53\x41\x5c\x67\xd3\x70\xff\x98\x9a\x23\x06\x0e\x71\x20\x12\x55\xeb\x23\xb4\x58\x93\x8f\x17\x1d\xbe\x8e\x93\xea\x36\x04\xda\xb5\x54\xfd\x93\x3c\x9e\xea\xf1\x32\xe1\xc6\xf3\x65\x2e\x0d\x81\x4c\x88\xb8\x13\xf8\x7b\x5e\x57\xdc\x53\x05\x7f\xe5\x2f\x46\x59\x5b\x64\xd7\x5f\xba\x06\x4b\xfa\x0a\xb5\x51\x57\x3c\xf3\x02\xd7\x6c\x5a\x4b\xc7\x1c\x6b\x60\xd5\x18\x94\xfe\x58\x07\xde\xef\x0c\x15\x31\x6d\xdd\x88\x3d\x93\x42\xdf\x50\x96\xcb\xf7\xf8\xc1\x6e\x1e\x05\x05\x56\x5d\x21\x0c\x6a\x39\x38\xb6\x1d\xf5\x65\xc9\xaf\x89\x52\xd1\xa7\x74\x24\x04\xc9\x68\xf4\x89\xd5\x6d\xef\xd6\x18\x2b\xaf\xf0\xd7\x41\x12\x96\xea\xd6\x86\xc2\x9f\xfa\xc6\xb0\xd9\x75\x5e\xb5\xaa\x31\xb5\x67\xc4\x90\xb9\x13\xee\x2b\x5e\xec\xcf\xf4\x15\xdd\xfa\x5c\x63\x37\x0b\xeb\x9b\x5f\xf5\xd4\x30\x01\xd5\xb1\x2f\x8a\x96\x2b\x44\xf5\xb5\x01\x22\xd0\x35\x2d\xe6\xa6\xdc\xab\x39\xcb\xfa\x56\x17\xa8\x42\x4f\xe0\x03\xc9\x7b\x4f\x3d\x7a\xd2\x32\x12\x25\xd6\x04\x3d\xf3\x2b\x44\x40\x83\x5e\xdc\x68\x05\x3b\x65\x5f\x0b\xf1\x24\x3a\x95\x27\x42\x50\x83\x8f\x58\x27\x36\x9a\x2c\x1c\x6c\x88\x88\xb3\x0c\x71\x0f\x43\x44\xcd\x33\x91\xe9\x99\xd7\xc2\xc0\x76\xad\x31\x90\x8b\x29\x0e\xab\x1f\x2a\xc0\x89\xec\x95\x27\x43\x97\xca\x53\xf6\x5e\x37\xf2\x83\xfa\x45\xdb\x96\x8e\xf1\x1f\x3a\x4d\x05\x07\x4c\x4b\xb4\x4b\x4f\x86\x34\x8f\x7f\xd0\x93\xad\xfb\x6d\x44\xf6\x13\xa9\x06\x01\x6f\x2f\x1c\xa7\x5c\x34\xe6\x46\xe5\x3b\x39\x86\x1b\x36\x1f\x2d\x46\x27\x23\x71\xf4\xc3\xf7\xaf\x32\x99\x8f\xe4\xc5\xe1\xf1\x11\xbc\xf7\x63\xdd\xf9\xd7\x90\x52\x6a\xbb\x86\x1a\x9b\x95\xc4\x31\xf8\x6a\xbc\x7e\xae\xd5\x89\xab\x7d\xcb\xeb\x66\x5b\x23\x6a\x00\xdb\x30\xf9\x7f\x66\x42\xe5\x9f\x3b\x83\xb5\xe2\xfb\xe9\x99\xb0\x7b\x1c\x13\x34\xd5\x15\x5f\x01\x13\xea\xf9\x8e\x47\xcf\xdd\x3a\x7e\x83\x55\xd3\x77\x36\x84\x17\x70\x1e\xac\xe3\x9a\x0d\x24\x36\x7f\xdf\x02\xda\xcb\x7a\x60\xc5\x93\xb1\xb6\xd3\x58\xb6\x71\xdb\x4f\x2d\xb8\xc5\xc8\x8f\x0f\xeb\x16\x9f\x26\x71\xd7\xda\x35\x81\x4c\x02\xa8\xfe\xfa\x57\x3c\xe2\x47\xf9\x5f\x15\xb0\xc5\xa8\x3d\xb1\x04\x86\x61\xa2\x26\xd6\x5e\xff\xbb\xbd\xdd\xdf\xff\xf4\xff\x8c\xbe\x39\x99\x9c\x4c\x67\xb3\xbf\x56\xec\xe7\xff\xfa\x6a\xfc\xe7\xd5\xd1\xd1\xab\xbd\xfe\xdf\xcf\xbf\x7d\xf9\x7b\xfc\xe7\x6f\xf1\xe7\x44\xc3\xe9\xcb\xb7\xf3\xc9\x44\x2e\xce\xdf\x2e\x7f\x1e\xcf\x27\x2e\x87\x2b\xc7\xef\xe6\x93\xc9\x87\xc9\xd9\x52\x9e\x61\x5a\x87\xe5\xdf\xd8\x83\x09\x0c\x95\x0b\xc4\x19\x10\x97\x61\x08\x88\x03\x17\x16\x6a\xa9\xe7\x47\x57\x82\x4e\x11\x85\xb1\x79\xc7\x46\x9b\xc3\x24\xe0\xf4\x3d\xae\x13\x8e\x9b\x16\x73\xe7\x86\x90\x87\x0e\xb9\x8f\xf6\xb6\x16\x98\xac\xe6\xda\x61\x1c\x7b\xd5\x51\x8f\x61\x04\x92\x35\x6a\xdd\x9a\xea\x0a\xe3\x0c\xd8\xc5\xa4\xdc\x65\x83\x4f\x8a\x1f\xe0\xed\x1e\x94\x6b\xbd\x2e\x13\xb0\x5e\xe1\xd6\xfb\x5a\x86\x82\x3f\x0e\x5b\x50\x7c\x7f\xd5\xd4\xaa\x18\x70\x36\x3b\x8b\x00\x15\xf1\x5f\x40\x13\xd6\x55\xe1\xda\x91\xe9\x32\x54\x99\xab\x88\x82\x52\xdd\x66\xf0\xca\x0a\x0c\x35\xf8\x3b\x12\xcc\x9d\xa2\x61\x5f\x05\x37\xab\x43\x67\x78\x55\xb7\x18\xf7\x27\xf0\x9e\x75\x66\x19\x8a\xe8\xba\xa1\x3a\xb3\x07\x1c\x2c\x78\xb8\x70\x26\x1a\xdb\x25\x21\xaa\xd7\x92\xd9\x81\xeb\xa4\x97\xf0\x39\xc1\x37\x18\x76\xe3\x81\x53\x79\x5d\xd5\x1b\x93\x0b\x5e\x3d\xa6\x4d\xa2\x6e\xd5\xcb\xfd\x36\x13\xc4\x86\xff\xf6\x2f\x81\x7d\x1a\xf6\x76\x85\x38\xa9\x37\x60\xde\xab\xc6\x28\x9e\x4d\x35\xa9\x74\x73\x65\xb4\x1c\xb7\xf5\x06\x01\xcc\x87\x34\x76\xc2\x35\x59\x09\x83\xab\xf3\x2c\x6a\xc0\x85\x4a\xb2\x2a\x3a\x38\x4e\x05\xde\x8e\xd5\xd8\xd0\x5e\xdb\x56\x61\xa8\x8c\xc0\x62\xd7\xea\xc6\x71\x4f\x28\x5f\x27\x94\x6b\xbd\x96\xab\xce\x9a\x0a\x3c\x1c\xd5\xca\xe3\x57\xb2\xe9\xb4\x9c\xe9\x55\xa9\xaa\x9c\xaa\xaf\x71\x70\xf8\x4c\xcb\x8b\x1a\x07\x07\x9f\x66\xf2\xbb\x57\xcf\x8f\x5e\xd1\x94\x8c\x0c\x3b\xe0\x3b\x1c\x85\x10\x27\x34\x12\xec\x0c\xd5\xa3\x2a\x79\xec\xce\x5c\xe7\xd7\xba\xc9\xaf\xb5\x5c\x44\x03\xb8\x61\x91\x38\x53\x63\x60\x95\xd4\x8a\x0a\x16\x5a\xe3\x54\x1a\x55\xfe\x65\x8b\x92\xaa\x95\x2f\x60\x4d\xe2\x83\xc9\xaf\x75\x79\x38\xae\xae\x34\xac\xe0\xbb\x1f\x5e\xd2\x0a\x64\xae\x0b\xfd\x45\x1e\x7d\xdb\x5f\xca\x94\x66\x96\xb5\xc9\x62\xc2\x4a\x74\x15\x6c\x0d\x1e\x4d\xaa\x2b\x39\xe6\xe0\x08\x2d\x8f\x26\x85\x88\x07\xd6\x27\xff\xec\xf5\x89\xc1\xf5\x9d\xd6\x20\x2f\x70\xe0\xcf\x4f\x75\xd9\xe5\x5a\x75\x99\x9c\xd7\x39\xb8\x70\xe8\x38\x64\xf2\xcd\x85\x3c\x7a\xfe\x2a\x93\xdf\x7d\x7f\xf4\xea\x05\xce\xaa\xb9\xd6\xb6\x52\x3b\x81\x8b\x8f\x56\x7e\xd1\x68\xb5\xc1\x8e\x41\x03\xb3\x01\xbe\x26\x17\x69\x66\x00\x05\x1d\x50\x2a\x08\x1f\x9e\xc2\x61\x02\x94\xd6\xde\xeb\xe7\xdf\xc6\x2d\xd2\x53\x17\x2c\x9a\x73\x10\xe1\x0a\xd7\x8d\xda\x68\x2c\xb2\xc0\x78\xb9\xac\xc1\x50\x65\x59\x95\x22\x60\xeb\x42\x97\x7c\x3f\x71\x78\x2d\xb9\xa2\x1e\xe3\xc6\xd7\x99\xb0\x83\x14\xb4\x57\xa5\xec\xb6\x75\xe5\xbb\xeb\xc6\xc3\x4a\xd7\x75\x23\x70\x5d\xd2\xd6\x98\x8b\xac\xe3\x32\x5b\x63\x5d\x80\x64\xcd\x18\xbc\xa8\x39\x69\x3a\x7c\xd7\x52\x71\x80\x03\x2c\x7a\xe0\x70\x90\xbc\x51\xd0\x18\xa4\xaf\xf7\x34\x5d\x00\x2c\x85\x78\x89\xbd\x3d\xed\x85\xf4\x3c\xfa\x8c\xc8\x87\x8d\xf6\xc0\x32\x74\x39\x19\xae\xce\x1d\xc1\x04\x87\x49\x76\xfe\xbd\xee\x7c\x0e\x9c\x3e\x23\x19\xcf\x4d\xd4\x7b\x62\xd2\x87\xb6\x5c\x3f\x39\xdb\x51\xdb\x21\x97\x45\xc0\x56\x9a\xf8\x5e\xf4\x3b\x5d\x1f\x32\x17\x7f\xd9\x8d\x82\xc7\xca\xe8\x6d\x17\xe9\xb4\x9f\xdc\xe8\x7a\x74\xa1\x91\xec\xb2\xc6\x16\x83\x19\x85\x99\xb3\x68\x16\x04\xe3\x29\x0a\x8d\x63\xea\xb9\x0d\xa1\xeb\x99\xe8\x9b\xf6\x3b\xd6\xe3\xbd\x82\x2d\xc2\x1d\x72\x3e\x38\x1f\x07\xfc\xfc\x00\xa4\x24\x4f\xdf\xf7\xa5\xf3\x6d\xff\x66\x10\x1b\xf8\x49\x0c\xce\x13\x32\x3c\x3b\x01\xd3\x39\xa0\x3a\x81\x99\xb2\xb8\x45\x39\x9a\x12\xac\x9e\x28\x94\x42\x3b\x00\x1c\x46\xee\x31\x2f\xc5\xc5\xc7\xf5\x97\xad\x6e\x0c\xf8\x2f\x85\xd8\x36\xf5\x5a\xa3\xfd\xa1\x4a\xeb\xc5\x47\x75\x58\xe8\x2d\x76\xbc\xa3\xc6\x5c\xd2\x27\x26\xb0\x87\x0d\x33\x03\xd6\x0b\x61\x61\x7b\x48\x8a\x89\xb6\x96\xdc\x2b\x0b\x44\x15\x37\x6b\xa0\xbe\xb7\x3e\xdc\x92\x6c\x60\xaa\xa6\x4d\x13\xa3\x9d\xb9\x11\x60\x00\x4f\x55\x20\xec\xdc\x11\xe8\xbc\x6b\xc2\x13\x4d\x23\xed\xce\xb6\x7a\x13\xaa\xc8\x55\xab\x50\x51\x6b\x36\x9d\xb0\x99\x6c\x46\x2d\x61\x7c\xa3\xd7\xcc\x05\x37\x31\x66\xba\xc5\xc6\xae\x68\x52\x44\x73\x2c\x22\x12\x08\xc9\x8b\x2f\x1e\xf5\xed\x40\x46\x3f\xaf\x1b\xad\xcb\x5d\xd4\x66\x33\x29\x06\x2c\xd2\x82\x5b\x6e\x24\xcc\xb5\xe9\x51\x0b\xce\x8a\x9b\x43\x59\x9f\xbd\x60\xe8\x18\xd5\x1e\x22\x4f\x6e\xb0\x34\x16\x8f\xa1\xa9\x37\xa3\x3d\xc3\x14\xab\x5d\x1d\xfc\x1d\xa3\xb2\x2c\x63\xdc\xe6\x27\x0d\x72\xd3\x8b\x29\x7a\x17\x53\x16\x3a\xc7\xf9\xbe\x60\xe2\x75\x2b\x06\x4b\xb8\xb0\x70\xa3\xd1\xb6\x62\xcd\xe3\xc8\x26\xad\xe8\x67\xa4\xc9\xc3\x74\x5a\xc3\x5b\x8e\x47\xf5\x55\x86\x5f\x00\xb5\x3a\xeb\x85\x98\x38\xb6\x6a\x28\xa8\xb1\xd9\x84\x7c\xaa\x92\xb9\xda\x9a\x56\x95\xb2\xd4\x6d\xab\x49\xdc\xec\xa4\xbd\x86\x35\x3f\x1c\xac\x7a\xed\x1a\x9d\x08\xe1\xdf\xfc\xda\x37\xa4\x0d\xda\x24\x28\xad\xd0\xb8\xc4\xa5\xcb\x62\xb1\xed\x27\xf9\x51\xfd\x53\xa5\xbf\xb8\x4e\x9c\xf8\x8e\x60\x33\x87\x40\x8e\x3f\x10\x2e\x15\x3c\xa7\x64\xc0\x09\x4b\x71\xe0\xe6\x05\x09\x76\xfc\x11\x36\x91\x01\x5e\x16\x94\xb4\x8b\xa7\x77\xa2\xb9\x1f\x23\x95\x32\x17\x03\x0f\x9b\xc9\xc0\x17\xcd\x89\x61\x1a\xc9\xe2\xd7\x1e\xd1\x3a\xad\x4c\x0b\x46\xe2\x10\xcd\x8b\x1e\xcd\x31\x81\xc8\xf0\xb4\x35\xbb\x68\x41\x22\xa5\x5e\xfe\xf9\xd4\xd3\x8d\x41\x0f\x46\x3c\x36\x74\xa3\x87\xba\x64\xa1\x33\xb4\x44\x5f\xc9\xf2\xe8\x1a\x7d\x31\xea\x6a\x97\xb4\xb9\xa3\x21\x78\xac\xa1\x93\x43\xf6\x9b\xe1\x9e\xe7\x9a\x55\x2c\x82\x56\x8c\xc6\x9d\x58\x6e\xaf\x41\xe0\xa8\x12\xec\x34\x6a\x4a\x66\xf2\x6b\xd7\x4d\xc5\xd8\xd0\xd7\xd2\x1b\x13\x1e\xf7\x17\x9e\x1c\xd1\x11\x31\x52\xbc\xae\x95\xa9\xb0\xe9\xb6\x41\x50\x16\xa1\xd7\xb1\x1a\xce\x57\x3e\xef\x57\x27\xc5\x6b\x8a\xde\xf0\x1e\x85\x46\xfc\x70\x12\x23\x51\xcd\x73\x5f\x92\x50\xb1\x38\xc6\xdd\x52\xf6\x8a\x1e\x4b\xff\x75\x8c\x3a\x78\x26\xa0\x5b\xe1\x2d\xac\xb5\x88\x97\x39\xde\x36\x74\xd2\xf4\xdf\x93\xd0\x7f\xc4\x9f\x4c\xb8\x10\xfc\x2c\x2c\x43\xff\x2d\xe7\x3c\x63\xcb\x24\x26\x90\x76\xc4\x27\x4e\x5d\x08\xdb\x57\x05\xfa\x68\xad\xe6\xae\x8c\xb7\xd7\x75\x84\x45\x20\x03\x38\xac\xd2\x73\xf6\xd0\x9a\x62\xb2\x5e\x47\x63\x5b\x58\xd0\x27\xcd\xb4\xc0\xe1\x6f\x1a\x0f\x49\x8c\x0b\x41\x18\x12\xc1\xd5\x2c\x2c\x71\xb0\x6f\x47\x57\xf9\x42\x90\x56\x5f\x35\xdc\x42\x88\xad\x9b\x45\x64\x05\x45\x6f\x8d\xb6\xd8\x62\x47\x31\xec\x9a\xa8\x12\xca\xa6\x55\xab\x1b\x30\x9c\x3f\xd4\x45\x57\x26\x02\x92\x7e\x12\x0e\xc7\x6a\x2a\x7b\xe2\x64\x01\x31\x6d\x48\x80\x92\xee\x4f\x84\x06\xf7\x84\x04\x6b\x41\x5b\x61\xbb\x2d\xcf\x9e\x42\x9e\xf7\x2b\xaa\x1b\x09\x46\x12\xf6\x1e\x89\xca\x5c\xe2\xae\xd6\x94\x62\x58\x3d\x78\xbd\x26\x5f\x92\x55\x0c\x9c\x00\x2f\x0f\xe7\xb8\x53\xf5\x57\xdc\xa7\x64\xe1\x67\x4d\xd9\x3a\x6a\xc9\x49\x5f\xf2\x76\xb4\xdf\xe6\xa6\xab\x28\x79\xe0\xea\xff\x18\x84\x6f\xb7\x0a\xdb\x99\x61\x07\x3a\xac\x18\x57\xa1\x6b\x22\x4f\x3b\x62\xd9\x4f\x55\x69\x4d\x57\x25\x52\xfe\xb7\xad\x22\x73\xc9\xb8\xd0\xfe\x37\x98\xaf\x44\xbf\xc0\x57\x60\x68\x44\x7f\xd1\x79\xd7\xa6\x03\xc1\x12\x82\x23\x0a\x10\x9c\x79\x31\x8b\x6f\xd1\xc3\x78\xcd\x90\x76\xf0\xd8\x04\xaf\x7c\x85\x2f\x5e\x48\x9a\x32\x7d\x05\xa5\x8c\x93\xf9\xfa\x82\x82\x87\xad\x12\x4d\xb4\xa4\x54\x77\xf2\xe9\x38\x11\x40\x0f\x58\x32\x72\x35\xd8\x28\x6c\x15\x52\xbe\x13\x9e\x02\x27\x68\xaa\x2b\xac\x47\x40\xa1\x5f\x62\x12\x07\xd4\x62\x6a\x30\x1d\xcb\x43\x79\x71\x39\xbf\x38\x5f\x0c\xcd\xdd\xd3\x69\x04\x12\x7e\x40\x5e\x34\x2f\xd6\xd1\xe5\x8e\xca\x11\x8e\xbd\x20\x64\x02\xd3\x62\x61\xb0\xd6\x0d\xa6\x7e\x31\x53\xec\xa0\x5e\xde\xfa\x71\x35\x9a\x8b\x60\xb9\x0b\xb8\x9a\xeb\xba\xa1\x45\x39\xb2\x5f\x49\x6a\xd6\x44\xb8\x77\xf7\x35\x2a\xce\x03\xed\x1c\x25\x47\x5d\x74\x8d\x3d\x4f\x97\x6b\x49\x22\x66\xca\x14\xbd\xab\xe7\x5e\xf4\x42\x1e\xca\xf1\xc9\xc9\xe4\x62\x39\x3e\x3b\x99\x08\xf1\x62\x74\x84\x21\x08\x7f\x44\x64\xf9\xad\xb4\x2c\x60\x9f\xb0\x89\xf4\x90\xb2\x18\x32\x19\xc4\x9e\x31\x4a\x2e\x3e\xde\xa8\x3c\xef\x9a\x46\x47\x70\x3a\x6e\x0c\xbd\xee\x9b\xaa\x37\xe0\xc4\xbc\x16\xe2\xa9\x79\xe6\x3c\xce\xc7\x04\x27\x0f\x7f\xa8\xea\x56\x61\x6f\xf3\xd5\xce\x37\x1f\x76\xca\x59\x28\xb4\xfb\x5b\x2d\x69\x04\x76\xc6\x4d\x54\xe2\xcf\x48\x25\xb7\xd7\x3b\xcb\xed\xf6\x0b\xd3\x6d\x7e\x04\x12\xcc\xb3\x88\x56\xca\x9b\xc5\x9b\xc5\xb1\x0e\x6d\x63\x74\x5a\x2f\x72\x0b\x07\x8b\x0a\x69\x04\xbb\x7d\x2c\xcf\x93\xee\x14\x3a\xb6\xdc\x93\xd6\xcd\xbe\x11\x7c\xc9\x3d\xf1\xb8\x79\xf8\xb5\xc2\xf2\xec\xc6\xd8\xd6\xe4\xbe\x8c\xd2\x4b\xc5\xd0\x53\x89\x7c\x7d\x17\x61\x60\x37\x89\x7e\xb9\xa6\x9e\xbd\x89\xff\x8b\x73\xe0\x1b\xe3\x24\x55\xe4\xf1\x72\x30\x23\x14\xd2\xf8\x7a\xc3\xf4\x96\xc8\x6d\x63\xf0\xee\x08\x0c\xc7\x07\x00\xa5\xb2\x72\x90\xeb\x81\xf9\x98\xef\x43\x7f\xfe\xe4\x89\xf0\xdb\xd5\x4e\x44\x4d\xcf\xac\x0f\x2b\x5f\xa3\x1b\xcc\x7e\x33\xee\xb0\x6d\xeb\x1a\x7c\x8c\x94\xe5\x5f\xca\x43\x39\x79\xfb\x76\x72\xb2\x9c\xfe\x34\x91\xa7\xe3\xe5\x04\x87\xe0\x2d\x27\xf3\x0f\x4e\x6e\xbd\x1c\x1d\xf5\x3e\x42\xc2\x23\x30\xb2\xbb\x16\x79\xbd\x89\x66\x68\xba\x4e\x88\x98\xc0\x8c\x8c\x6d\x7f\x55\xe8\x72\x8a\x20\x00\x1f\xde\x89\x51\x20\xe6\x98\x89\x1b\x22\x21\xaa\xb0\xc3\x2c\xaa\x93\x15\x54\x73\xcc\x56\x92\x13\x19\x41\x5c\x88\xaf\xd9\x95\xc3\xe2\xe2\x95\x3c\x94\x8b\x93\xf3\x8b\x89\x3c\x7f\x2b\xe7\xd3\x77\xef\x97\x0b\xf9\x6e\x3e\x3e\x5b\x4e\x4e\x89\x3c\x2f\x31\xe9\xa4\x1c\xf6\xb5\xc7\x19\x64\xaf\xb1\xe7\x94\xf5\x6e\x3c\x51\x22\xf6\x28\xf1\x70\x1a\xbe\xe9\x9d\xeb\x1c\xe1\x96\x1c\x0b\xc6\xe8\x16\xd5\x15\x5a\x83\x2b\x65\x8d\x4d\xb1\xbb\x3d\x0f\x27\x9c\x44\x24\x7c\x47\x42\xbc\xd1\x16\xbc\x76\x3f\xfe\xcd\xaf\xb1\xbe\xad\xb8\x60\x6f\xc3\xc3\x38\x6e\xab\xb4\x69\x2e\x01\xcb\xfc\xbe\x57\x57\x88\x8e\xaa\x1b\x19\x37\xba\x8b\xcc\xa9\xf4\xf2\x72\x21\x1b\xdc\x1e\x9c\x65\x55\x51\xdb\x91\x98\x06\x6a\xa7\xd1\xaa\x4f\x8c\x3c\xc3\x1c\x17\x71\xc2\x80\xec\x59\xb9\x29\x01\x8e\x30\x75\xa5\xc0\x81\x8a\x02\x85\x9e\x37\xad\x0b\xeb\xe9\x2f\xdb\xb2\x36\x2d\x47\xf1\x42\x90\x2f\xe1\x12\xc6\xb1\xc6\x8f\x6e\xb4\x70\x2a\x91\x9b\x84\x47\x5b\x17\x91\xdd\xd6\x21\xb0\xe0\xbe\x00\xaf\x07\x8b\x24\x6f\xcc\x4a\xfb\xc6\xb5\x51\x48\x38\xb9\x35\xa8\x64\xc0\x9e\xbb\x6a\xd4\xf6\xda\x5f\x9c\x57\xa3\x23\xe2\x51\x60\xd6\x4b\x67\x00\xf8\xbb\x67\x6c\x0f\xaf\xe8\xe0\x79\x41\x76\xba\x29\xb7\x88\x4b\x06\x01\xca\x15\xce\xd8\xd3\x1e\x8e\x65\x6d\x74\x49\x73\x24\x12\xd4\x2b\x86\x52\x8c\x1b\x3c\x1b\xab\xf2\x80\x27\xf6\xa6\x2a\xf6\xee\x6f\x40\x6b\xbc\x16\xe2\x68\x84\x70\x36\x55\x71\x0b\x8b\x56\x6f\xb6\x75\x03\x46\xb7\x8b\x85\xf9\x98\xf5\x3e\x23\xf5\x54\xa2\x88\x55\xa2\x6b\xd2\x18\x5d\x20\xb6\x96\x8e\x47\x21\x92\xcb\xb3\x4f\xf0\xef\x4d\x87\x73\x7f\x78\x2c\x41\xdd\xec\x29\xde\xba\x4a\x15\x2f\x68\x49\x54\x6a\xae\xf2\xcb\x75\xfc\xa9\x57\xa8\x68\x33\x69\xdb\xae\xa0\xae\xf4\xda\x92\xae\xa1\x68\x21\xa2\x37\x9d\x37\x5e\x68\x2a\x2c\x26\xbc\xb0\x29\xb4\x72\x8e\xbd\x4f\xab\xae\xf4\xb5\xe1\xc6\x38\xfc\xf6\xbc\xa6\xac\x11\x96\x73\x97\xa1\x45\x5e\xcf\xf4\xc1\xe0\x1e\x09\x4e\x0a\xea\xed\xc7\x73\x72\xd5\x34\xd8\xfa\x81\xcf\x9d\x5f\x30\xb4\x45\xc2\x6f\x11\xf2\xad\x2b\x36\xe4\xfd\xc2\xd6\x20\x7e\x79\xbd\x54\x6a\xa4\x9f\x49\x7d\x09\x13\xb5\xe9\x69\x6b\x9a\xd7\x82\x44\xc4\x06\x83\x63\xec\x63\x39\x39\xc3\x42\x3f\xcc\xa9\x2f\xcf\xe5\x87\xf1\xdf\x4f\xe4\xc9\xf9\xd9\x72\x3e\x7d\x73\xe9\x27\xb9\xc6\x49\x20\xf5\x29\xf5\xc0\x6d\x68\x3e\x97\x64\x8b\xf6\x31\xfe\xdc\x5c\x0e\xc1\xe5\xd4\x07\xe8\x01\xef\xb8\xef\xd1\x64\x69\xfa\x84\x66\x75\x72\x44\x57\x84\xc8\x3b\x36\xd4\x4c\x93\xba\x0f\x5f\xd2\x3e\x01\xe9\x92\x7a\x04\x88\xb4\x15\x02\x86\xa4\x5d\xc3\xbd\xd0\xb6\x2e\x19\xb8\x68\xbc\x27\xe0\x5a\x61\x11\x13\x25\x61\x02\xd7\x35\x86\x0b\x44\xbc\xca\x77\xfd\xa8\x1a\xed\x7c\x68\x8c\xea\x46\x07\xf7\x22\x48\xa4\xd3\xe9\xc2\x9f\x16\xe6\x5d\x42\x8d\x75\x84\x2f\x87\x67\x26\xb9\xb5\xe1\x53\x4b\x4b\x34\x36\xa6\xe5\xa2\xe9\xcd\xa6\xab\x90\xca\xf4\xea\x0e\x4e\x68\x1c\xbc\xd0\x94\x4c\x1a\xb4\xb1\xf7\x0e\x77\xa3\x9a\x4f\x3a\xcc\xaf\x35\x43\x99\x36\xb1\xd6\x04\x88\x77\xf3\x45\x68\xfe\x47\xda\x6c\x3e\x9d\xc8\xd2\xb7\xf4\xf1\xf5\x03\x8c\xe2\xe6\x5c\xa5\x0c\x13\x25\xe7\xd2\xc7\xfa\x78\x24\x6a\xd1\x4d\x3f\x86\xc9\x30\x51\x86\xc0\xc3\xf7\x54\x9e\xd7\x3c\xe5\xb4\x7e\xd8\xe9\x79\xc8\x8a\x90\xee\xcf\xab\x11\x58\x77\xc9\xf1\x03\x3b\x78\xcc\xcc\xcf\xd3\xe5\xfb\xf3\xcb\x65\x32\x9b\xe2\x6b\xb7\x22\x69\xaa\xb2\x37\xd2\x26\x0e\x33\x53\x04\x92\xa2\xc8\x75\x93\x44\xc9\x41\x1f\xf4\x87\x52\xa0\xfc\x4c\xf8\x8f\x52\x69\xae\x9b\x92\x2a\x4b\xd1\x3a\x94\xae\x1d\x0c\x14\xfb\x51\xca\x39\x7c\x55\x55\x14\x02\x7e\x1d\xed\x08\xcd\xa5\x56\x0f\xb8\x41\xa8\xa1\x1e\xf4\x7f\x22\xb5\x5c\xaf\xfb\x21\x86\xba\x39\xb0\x32\xce\xa9\x0a\x9f\xea\x7c\xc8\xf4\xb6\xf2\x7b\x24\xf8\x87\x4c\x08\x97\x48\xf2\x9d\xe7\xd1\x19\xe5\x49\xc1\xae\x01\x4f\xbc\x83\x7b\xfb\x6d\x93\xec\x70\x91\x89\x34\xfc\x01\x26\x2f\xf0\x6d\xdb\x35\xe1\xc7\x56\x76\x15\xa8\x37\x6a\xa8\x93\x64\xa6\xb1\x89\x46\x72\x82\xfb\x37\x84\xc5\x12\x1a\x1e\x54\xfc\xef\x42\xdf\xb0\x0e\x67\x93\x44\xfe\x91\x8b\x39\xf9\xe8\x1d\x76\x5d\x23\x5f\x3c\xe0\x5a\xe9\x35\x21\x3d\x41\x4a\x94\x46\x18\xe7\x9a\xa3\x00\xf0\x35\xf4\x2c\x9c\xdd\xe7\x91\x4f\xaa\x55\xfd\x3b\x70\xbc\x7f\x07\x88\xe5\x27\xa7\xfe\x32\x08\xf1\xf3\x9e\x82\xde\xa0\xd5\xa8\x12\xc9\xbf\xaf\x79\x1e\xbc\x9f\xce\x5b\xe8\x83\xb1\x52\x7d\xb4\x97\xd2\x70\xbe\x5e\x28\x32\x11\x2e\x1b\xd1\xe7\xfd\x38\xe2\xf1\x55\x7d\xd6\xc3\x63\xec\xbd\x17\x79\x8f\xe2\xb6\x22\xe7\x4b\x5b\x13\x09\xf9\xef\x97\xf6\x2f\xbd\xb4\xf1\x0e\xf6\xe7\x78\x78\xe3\x61\xef\xf6\xca\xbf\xf8\xf6\x0a\x7f\x7b\x63\x70\xc9\x43\x6f\x7e\xec\x1a\x8b\xc7\xae\xb1\xfc\x4d\xd7\x38\x22\x41\x3c\x78\x8d\xe5\x6f\xbd\xc6\x2f\xf6\xaf\xf1\xe4\x0f\xcb\xc9\xfc\x6c\x3c\x83\xfb\x7c\x39\x9b\x2c\x86\x6e\xf1\x35\x82\xf9\x09\x54\x81\xad\xe8\x7a\x79\x80\x47\x6e\xf0\x7e\x58\x91\x1b\x01\xfb\x3c\x3d\x5e\x80\x81\x07\x2a\x0f\x30\x88\x8e\x95\x3b\x52\xaa\x90\x13\xd8\x4b\x56\xf7\xd7\xfc\x12\xbb\xfd\x5e\x8c\x97\xd3\x37\xd3\xd9\x74\xf9\x91\x5a\x14\x2e\xdf\x4f\x24\x47\xe1\x7b\xb7\x3e\x57\x55\xd2\x29\xa5\xd0\xd1\xd4\xe8\xa4\x34\x37\xbd\x92\xdc\xfb\xbf\x0d\xf3\x0b\x92\xfe\x23\xef\x2e\x66\x7b\x33\x75\xd0\xb7\xde\x33\x66\xfa\xdd\x22\x05\x67\x77\x30\x46\x84\xf4\x3c\xd0\xe6\x04\x53\x0e\xbd\x1a\x00\x7e\x75\x5f\xb4\xc5\x8b\xfc\x0d\x24\x51\xe5\x9b\xdf\x0b\xf1\xdb\xf6\x42\x3e\xb2\x17\x7f\xa5\x45\x46\xe1\xaf\x6f\x11\x5b\xb8\x9c\x60\xb7\xd4\xcb\xf1\x4c\x5e\xcc\xcf\x2f\x26\xf3\xe5\x47\xc7\x1f\xdf\x8e\x8e\xe4\xf9\x4f\x93\x39\xf2\x02\xa2\x34\xc6\xb3\x48\x99\x2d\x7d\x6a\x93\x62\x47\x8f\x46\xe0\xf6\x32\xbb\xd4\x72\x0c\x4d\x70\x91\x54\x5e\xa4\x9f\xeb\x71\xd5\x20\xd6\x79\xe8\x5a\xd1\xe6\x04\x28\x0b\x13\x0a\x17\x15\x21\xc5\x7b\xfa\x0a\xfc\x77\x44\x03\xc2\x83\xaa\x9a\xda\xe0\x82\x3c\x11\x2b\x9d\xf8\xb2\x51\x7e\x7d\x30\xf0\xf6\x90\x4a\x46\xbf\x6b\x20\xc1\x1d\x6d\x63\x1c\x47\x0a\xb5\x91\xbd\x0d\x89\xa7\xf1\x35\x5d\x19\x4d\x18\x11\x0e\xed\x18\xc5\x0b\x3d\x35\x9d\x8b\x4c\x0c\x45\x68\x5f\x8e\x8e\x47\xe1\xd4\x8f\xc3\xa9\x0f\x38\xe1\xfe\x8a\x60\x96\x9a\x84\xde\x9e\x05\xc3\x5e\x67\x7d\x5b\x05\x60\x5f\x8c\xaf\x16\xbd\x02\x56\xc7\x28\xc6\xa6\xcf\x89\x8a\xa4\x56\xbb\xb8\xb7\x25\x55\x46\x3a\x8a\x5f\x04\x8a\xf7\xc5\xf5\x23\x44\xef\x09\xea\xff\x08\xe1\xfd\x47\x3d\x46\x3b\x57\x26\xb9\x36\x05\xdc\x37\x8b\x98\x6a\xb7\xa5\x16\x0e\x69\xa5\x00\xe9\x36\x02\xb6\x12\x2a\x26\xe2\xaf\x68\x2b\x5e\xca\xbf\x3b\x9f\x9e\x2d\xe1\x32\x73\x0f\x3a\xf7\xbb\x65\x9a\xdc\x71\xbd\x01\x03\xd3\x51\xc4\x8e\x03\xaf\x04\x26\xcb\x42\x94\x34\xf3\x2d\x0f\x54\x55\x31\x96\xea\x01\xcc\xbc\xeb\x76\xa5\xda\x56\xe5\xd7\xfb\xc9\xe1\x1f\xd1\xa0\x8a\x03\x28\xa4\xe4\xfc\x18\x2e\x9a\xf7\x1f\x7a\x98\xbb\x57\xfa\x42\xc6\xc8\x21\x14\xfb\x98\x1c\x1c\xaf\xbd\x67\xad\xee\x07\x97\xe3\xd1\x92\xae\x9c\xb5\x04\x6b\x65\x0d\x46\x82\xfe\x0d\x87\xbf\x8e\x85\x0b\xc3\x24\x62\xb4\x83\xcb\xa1\x84\x1c\x29\xe7\xa9\xd4\x27\x3d\x04\xd6\xba\x31\xf6\xf0\xfe\x4f\x87\x37\xc6\xe2\x19\xdb\x56\xad\xd7\x19\x75\x74\xa8\x0a\x17\xae\xa0\x71\xd9\x61\xa2\xad\xab\x04\x11\x0c\x73\xf5\xa1\xc2\xc7\x4a\xc6\xbf\x4e\x7b\xaa\x2d\xbe\x93\x87\x72\x3e\x99\x8d\x97\xe0\xd0\x4c\xe6\x3f\x4d\x4f\xe0\x6e\x7d\x37\x3a\x92\x97\x28\x6a\xab\xba\x57\x39\x4c\x0c\x9b\xda\xe1\x18\xf4\xd6\x69\xf0\x3c\x0c\xbd\x14\x51\x4d\x82\xb5\x86\xe7\x06\x61\x9c\x0e\x56\x52\xe1\x3f\x3d\x42\xa3\x9f\x7e\x1e\x09\xe1\x5b\x46\x26\x2f\xe8\xc5\x22\x11\xc4\x41\x37\xd6\x5d\x35\xf7\x4c\xaa\x44\x1c\x6c\xd3\xe7\x8a\x82\x87\x48\xcc\xdc\xee\xe1\x27\x22\x62\xb3\xa0\x41\x12\xb1\x1b\x59\x67\x84\xf8\x42\xb3\x8c\x26\x7b\xa4\x39\x19\xa0\x15\x23\x8a\x70\x9c\xd1\x93\x1d\x24\x67\x70\xc7\xfc\x16\xd1\x11\x98\x2a\xef\x9a\x00\x8b\x96\x0e\xa6\x3b\x82\xe3\x3b\x96\x0b\xea\xe3\x80\xa3\xb3\xab\xdd\xd7\xb6\xad\x8e\x27\x17\x84\xe9\xe4\xa6\xb5\xc2\xd6\xa5\x0e\x53\x14\xf1\x5d\x19\xb6\x03\x70\x39\xda\x48\x8e\xf9\x0a\x65\xb8\x76\x60\xfa\x6f\x69\xa8\x19\x4e\xc0\x5a\x73\x15\x77\x0a\x77\xdf\x0b\x0f\xb8\x2d\x18\x76\x34\xd9\x3a\x1a\x3a\xcb\x28\x34\xea\xe4\x2f\x61\x59\x47\x72\x01\xfb\xdc\xcb\x2a\x63\x8a\x1c\x76\xdd\xa8\x52\x3c\x84\x26\xc4\xa4\x70\x9c\x35\xf1\x50\x03\x67\xbd\x50\x97\xed\xfd\x73\x17\x8c\x8b\x29\x92\x1e\xb4\xfe\x18\xfa\x59\xe3\xf4\x56\x7e\x2f\x0f\xe5\x6c\x3a\x26\xc3\x5d\x88\xef\x47\x47\x72\xf1\x98\xdd\xe9\xbf\x37\x3a\xee\x39\x80\x9e\x5e\xdf\x93\x1f\xd4\x52\xa9\xb0\xbf\xf9\x66\xab\x2b\x1b\x0d\x3b\xf3\x6d\x00\xb0\x48\x1e\xf6\x12\x3c\x11\x4c\x7c\xd9\xce\xd5\x61\xf7\x31\x4d\x02\xbb\x3e\xfa\x52\x37\xa9\xe4\x5a\xe1\x5f\x79\x00\x5d\x94\xfb\x69\x74\xa9\x6f\x94\xab\x16\xb6\x75\x93\xc5\x46\x20\x89\x0b\x53\x5d\x09\x0d\x62\xa3\xca\x75\x14\x9b\xfe\x7e\x74\x2c\x97\xa9\xfb\x1d\x58\xdf\x0c\x8c\x2b\xdf\x6c\x4c\x1b\x0d\xbc\x09\xb5\xce\x22\x8d\x1f\x04\xe7\x92\x86\x6e\x75\x4d\x43\x08\x92\x78\x4d\x26\x0e\x7c\xbf\x96\x04\xf3\xb0\x56\x14\x5d\x0a\xae\x38\x00\x3f\xba\x55\x3e\xe9\x05\x16\xde\x5a\x99\xb2\xa3\x50\xed\xba\x2b\xd7\x60\xe6\x61\x52\x29\x6e\x30\xf1\xd4\x98\x67\x82\xb7\x9e\x9a\xab\x86\x26\x0b\x74\x16\xc1\x15\x4b\xc1\x6a\xfe\xa0\x91\x14\x5f\x8c\x20\x80\x00\xdd\x50\xa5\x5c\xbe\x17\x83\xa3\x2b\xf0\xd4\x18\xf3\x6c\x0f\x26\x8f\xcd\x22\x62\x02\x04\x10\x80\x4d\x96\xa3\x06\xab\xf0\x34\x46\x4e\x45\x46\x07\x1a\x37\xdc\x8e\x35\x84\xe2\xb7\x3a\xef\x2a\xa3\x1a\x4c\xf6\xf9\xe2\x24\x5c\xd6\x53\x33\xd2\x23\xfa\x6b\xbd\x46\xd7\x3d\xf3\xff\xda\x36\xf5\xda\xb4\x36\x73\x09\xaa\xea\x8a\xbb\x4c\xe0\xd6\xd7\x6b\x99\x77\xb6\xad\x37\x3c\xb7\x0d\xcb\x27\xf1\xc3\xdb\xba\x69\xbb\x0a\xf8\x22\xaf\x6d\x9b\x31\x5b\xdb\xb6\x6b\x56\x8a\x7b\x54\x85\x0a\xa9\xbc\x35\x37\xd8\xd4\xe3\x99\x48\x33\xf7\xe5\x5e\x6b\x06\xc3\x35\x5f\xc0\x1e\x9c\x92\x4e\x4e\x00\xac\x41\x8a\xc6\xe3\x88\xb8\x9d\x13\x16\x2e\xed\x87\xc1\xfd\xbd\x83\x4d\x79\xd0\x35\x51\x8a\x92\x93\x22\xc5\xf4\xa7\xb7\xd6\x5d\xc6\x14\x9c\xe6\xc4\xc1\x0f\xf2\x50\xfe\x3c\x9e\xcf\xc7\x67\x20\x45\x7e\xe8\xc3\xa6\xf6\x11\x2a\xe8\x68\x0e\xd4\xa1\xa1\x2a\xc2\xfe\x47\x87\xf5\xfa\xb0\xbd\xd6\x87\xaa\x69\x85\xcf\x4b\x06\x27\x46\xd9\x38\x6a\x21\x0b\xb2\xfe\x18\xa2\x49\xcc\xe0\x90\xf4\x9d\xa5\xbc\xfa\x4a\x63\xa6\x95\xaa\x36\xc0\xc3\xe5\x59\x3c\x55\x1d\x40\x65\xd4\xa8\x85\xf8\xd8\x3f\xa0\xd0\x6b\x9d\xb7\xee\x19\x85\xa6\xd6\x12\xc0\xa8\x62\xbf\x3a\x28\xba\xa1\xbe\x48\x27\xa0\x83\x8a\x46\xdd\xfa\xf8\x6c\xbf\x90\x48\xfc\xa6\x42\x22\x19\x15\x12\xf1\xa8\x90\xa4\x92\xc8\x8b\x4b\x72\x5e\x11\x9d\x19\x17\xef\xec\x61\x97\xfa\x76\xae\x97\xe4\xd1\x44\x63\x37\xdf\x83\x28\xc9\x86\x61\x66\x38\xe4\x71\xbf\x32\xc7\x75\xc3\x5a\xf3\x10\x8a\xb8\x1e\x87\x00\xfa\x57\x75\x4d\xf3\x8a\x08\x56\x81\x60\x67\x70\x70\x90\x5c\x30\x4d\x69\x6d\xa4\x75\x03\x0f\x63\xcf\x17\x6e\xab\x82\x56\x2c\x65\xda\xa2\xe1\xcc\x6c\xb3\x1a\x84\x03\xff\xd0\x93\xec\x0e\x95\xe3\xdb\xf3\x90\xe3\x80\xc4\xac\x95\x69\xaf\xb3\x58\xd3\x47\xb6\x0c\xb5\xaa\xf2\xf8\xfb\x87\xc0\x42\xf2\x69\xc0\x14\x9b\x3d\x99\xc6\xc0\x9e\x61\xc0\xe3\x33\x24\xf7\xc5\x6f\xb9\x45\x69\xa0\x03\xbb\x4a\xfb\x26\x45\x29\xc2\xaa\x6e\x12\x08\x47\x1d\x37\x16\x42\x18\x82\xca\x71\xd0\xa9\x33\x5e\xe8\x03\x38\xc6\x01\xdf\xe6\x07\x70\xe0\x41\x06\x6a\x61\x5f\xb1\xfa\xc2\xa4\x59\xdb\xf8\x65\x21\x82\x6d\x9d\x0d\x18\x7a\xf3\x89\x1b\x55\x76\x5c\xab\x81\xb5\x50\x70\x2b\xad\x5a\x63\xb8\xbf\xaa\x79\xbc\x05\x16\x28\xb1\x5a\xc7\x3e\x25\x60\xca\x2c\xa2\x9e\x3c\x3d\xb3\xdd\xf7\x9f\xe2\x77\x0f\x6f\x19\x1a\x70\x84\x83\x74\xad\x8f\xc2\xb1\x63\xa8\xc4\x95\x70\xb9\xe5\x80\x0d\xdd\x34\xdd\x96\xcc\xb4\xe4\xa3\x2b\x2a\x73\x50\x2d\x0e\x01\xf7\x01\xa6\x48\x24\xd4\xb7\x15\x0e\xfd\xdc\x06\xb3\xc0\x11\x93\xd7\xd5\xda\x5c\x71\x98\x85\xa4\x92\x43\x43\xe0\xc3\x37\x5a\xb7\xfd\xc7\xc5\x57\x09\x59\xe6\x65\xca\xe1\x7e\x0f\xf8\x6a\x04\x05\xea\xce\xbb\xdc\x3d\xbc\x3f\x61\x66\x8b\xf7\x68\x61\x93\xe2\x56\x68\x8f\x78\x88\x71\x9e\x43\x28\x46\x42\x65\x61\xbd\x49\x35\x43\xfa\x55\xf4\xa3\xa8\x14\xb0\x7f\xa8\xc6\xa2\x4d\x69\x45\xec\xd3\x46\xbe\x49\x7d\xeb\x51\x25\xe1\xe2\x70\xf3\x27\x38\x3d\xee\x6d\xe9\x0c\x86\xa0\x75\x99\xab\x69\x9d\x21\x6c\xc2\x11\xf2\x48\x25\x9b\x4a\x46\x7e\x32\x9b\x41\x59\x82\xfd\xe8\x57\xc2\x0e\x78\x1f\x23\x79\x06\xae\x66\x7b\xad\x4b\x0d\xa6\x06\x0d\xd0\xe7\x79\x01\x11\x55\xe9\xbb\x87\xcc\x81\xde\x0e\x91\x78\x74\xea\xdd\xf0\x5c\x3d\xaf\x5c\x91\x34\x32\x39\x22\x8f\x6f\xed\xe7\x03\xad\x69\x78\xc2\xa2\xe7\xab\x0e\x7c\x49\x44\x60\xe8\x9c\x6b\x78\xb1\x62\xce\xea\xc3\xd5\xee\x10\xe7\x64\x10\xcc\x30\xf6\x4b\xf6\x2c\x73\x5f\x9e\x1b\x80\xb2\x5d\x63\x3b\x45\x60\x29\x25\x37\x7a\x53\x37\x0a\xe7\x99\xd7\x6b\x97\xe2\x51\xe8\xf5\x8d\x7a\xcc\xfe\x15\xde\xe8\x81\x8e\xa2\x6b\x14\xc5\x8f\xe3\x39\x70\x21\x32\x70\x56\x07\x09\x16\xe6\x08\xa4\xcf\xc3\x71\xb8\xde\x76\x40\xb0\x6f\x5f\x33\xc0\xc3\xfb\x98\x64\x64\xc5\x47\x9e\x84\xd3\x4d\x0a\xbd\x51\x38\xcc\x2d\xae\x7e\x7c\x2e\x0f\xd3\xd1\x1f\x47\xcf\x47\x47\x72\x1a\xe7\xf9\xf0\xfb\xab\x06\x87\x70\xf5\xed\x78\x76\x3a\x63\x1c\xa1\x07\x57\xc5\xa9\xf9\x9a\xda\x28\x3d\x30\x86\xa3\x9f\x7c\x02\xe1\xd0\xee\xe4\xd3\x17\xcf\x9f\xc9\x42\xed\x2c\x35\xab\x17\x9c\xfa\xf4\x76\x90\x8d\xc6\xdf\x25\x05\x10\x84\x5b\xc6\x56\x02\x70\xd5\x3c\x98\x78\x84\xcb\x3b\x96\xe3\x24\x14\x6b\xfb\x35\x0b\x7e\x08\x87\x37\x13\x70\x14\x87\x6e\x70\x64\xa9\xcf\x35\x0b\x02\x38\x3a\xe3\x6a\x60\x20\x49\xb8\xa7\x3e\x28\x44\xb8\x47\x37\xee\x83\xe5\xfe\x46\xed\x04\xfa\xad\x0e\x55\xea\x60\xde\x9e\x96\xe8\xf2\x3f\x00\x57\xbe\x51\xa5\x29\x9c\x83\xca\x43\x71\x4c\xe3\x2a\x0b\x70\xbf\xdc\xd3\x4d\xf5\x9b\x53\x18\x32\x86\x5b\x79\xa6\x39\x92\x87\xf2\xc3\x74\x71\x32\x99\xcd\xc6\x67\x93\xf3\x4b\x1f\xdd\x3d\x3a\x1a\x1d\xc9\xc9\x1f\x4e\x2e\x17\xe3\x37\xb3\x89\x9c\xfc\x44\x23\xef\xce\x58\x73\x5c\xa0\xb8\xf7\x57\xbe\xd7\xd3\x8f\xc5\x69\xa1\x4b\xb5\x23\x3c\x53\xf0\x45\xd9\x3b\x14\x69\x4a\x3c\x91\xae\xae\xf9\xa9\x9b\x3a\xa5\xaa\xc0\xbf\x04\xdf\xdd\xa8\x5f\x74\x47\xee\x24\xb8\x52\x70\x89\xde\xd5\x05\xe9\x10\x90\xeb\x16\x84\x1d\xda\x83\x99\x74\x4d\xda\xc9\x6c\x07\xd3\xc1\x61\x8a\x19\xb5\x1b\x6b\x70\x5f\x23\x80\x59\x9d\x86\x46\xa0\x62\x60\xac\xd4\x01\x30\x86\xfb\xc9\x73\xdb\x6d\xe6\x27\xb8\x63\x0f\xf9\x1d\x88\x38\x0f\xd8\x16\x4a\xde\x98\xa6\x43\xe3\x5f\xe5\x9f\x32\x7a\xd9\x0d\xfb\x01\xab\x1d\x47\xe0\x49\xfd\xf3\xa0\x61\xec\xf4\xe8\x5a\xaf\x15\xc6\x2a\xdb\x62\x33\x9b\x5b\x1c\x91\x40\xf6\x6d\x26\xb5\x6a\xda\xeb\xcf\x9d\xfa\x04\x9f\x5e\x1b\xd8\x0c\x04\x23\xf3\x28\x53\xe0\x5e\x84\x82\x80\xa8\x56\x2b\x4c\x33\x36\x1a\x1b\x05\xab\x26\x13\xba\xcd\xe1\x0a\x1d\xc1\x15\xaa\x76\xfe\x7c\x56\x3b\x19\x1f\x30\xce\x24\x8b\xb1\x67\x75\x9e\x2b\x7e\x01\x98\x6d\xd5\x4d\xfd\x49\xc3\x07\x84\xff\xc0\xba\x1f\x25\x22\xb6\x73\x3e\x69\x37\x1c\xdc\x5d\x51\x60\xbc\xd9\x36\x1a\x1d\x32\x37\x24\x40\xc9\x5b\x65\x40\x5c\xb2\xb4\xc2\x0f\xa1\xd3\xc6\x1c\xc8\x52\xcb\xa3\xec\x98\x24\x8c\x6f\x7a\x22\x9e\xda\x67\x22\x94\x70\x61\x7f\xd8\xa3\x23\x36\xa7\xc3\x1d\xcc\x81\x94\xd2\xc6\xf3\x16\x6d\x6a\x1c\xf0\xac\x5e\x9f\x49\x09\x0d\x39\x05\xcf\xfc\xa0\x80\x80\x2a\xb3\x44\xc9\xb9\x78\x05\x09\xb4\x1b\x0f\x35\x00\xdd\xc2\x25\x57\x99\xbb\xad\xac\xdb\xa9\x48\x93\xd2\xb3\xc1\x75\xda\x9f\x2f\x85\x0b\x75\xcf\xe7\xd9\x38\x3e\xc0\xeb\xdb\x44\x9f\xd5\x32\x14\x29\xfa\x14\x0c\x73\xf2\x63\x80\x3d\x3e\x3d\x7f\xd1\x45\xa8\xe6\x50\x76\x70\x8d\x5d\x55\x12\x9e\x0a\xe4\x2f\x46\xc0\x4c\x85\xc3\x22\x9c\x7f\x6a\xcd\x15\xa5\xb0\x04\x17\x56\x76\xe5\x2e\x86\xfd\xc4\xdd\x51\x6f\xd0\x51\x3b\x3a\x1a\xbd\x4c\xf5\x18\xe3\x55\x22\xbe\x7c\x80\xed\xe4\xad\x26\xa9\xe3\x66\xce\xfb\x42\x7e\x2c\xb0\xc2\xbd\x60\x8c\x4a\x94\x50\x53\x14\x0d\x2b\xf5\x95\xc1\x02\xd6\x1b\x9a\x1a\x9e\xd1\xae\xee\xff\x96\x06\xfd\x3b\x4b\x0b\x87\x71\x85\x58\xaf\xdb\x18\xfa\xb5\x1f\x59\x5b\xe9\x5c\x5b\xab\x9a\x9d\x54\x1b\x5d\x15\x14\x31\xb4\xb5\x50\xb6\xdf\x5a\xf9\x81\x97\x22\x49\x23\x39\xf6\x23\x25\xa3\xc5\x53\x9a\x80\xd5\x49\xd0\x99\x71\x6c\xde\x54\xa8\x66\xd8\x2f\x57\xe1\xdb\x03\x45\x22\x6b\x9e\x59\xd4\x68\x65\xeb\x4a\xde\x5e\xab\xd6\xd6\xa4\x04\xfb\xde\x77\x0f\x27\x15\x66\x3b\x52\xb0\x84\xdf\x3a\x8a\xb4\xcc\x2b\x39\x1b\x9f\xbd\xbb\x1c\xbf\xdb\x2b\x23\x32\xdc\x57\x8c\xf4\x1c\x02\xa1\xb8\x43\x17\xec\xad\x1b\x85\x06\x7f\xc7\xdf\x79\xe0\x03\xba\x2a\x5c\x90\xd7\xb5\xd7\x98\xf4\xeb\xa9\xbd\x63\x79\x28\xcf\x26\x3f\xcb\x9f\x26\xf3\x68\xae\x56\xd4\x8a\x4d\x88\xa3\xe3\xd1\x11\xca\x46\x8a\x1f\x0c\x80\xd3\x3a\xee\x9a\xd2\x1f\x36\xda\x9b\xca\x1a\xc3\xdd\x8e\x8e\x47\xc7\x72\xe1\xc0\xfc\xbe\xe1\x1a\x30\xab\xef\x80\x7a\xcb\x38\xda\x7d\x24\x8f\x89\x3a\x99\xa2\xe1\x1e\x37\x67\x8d\x3b\x08\xb4\xfb\xad\xbf\xfc\x2c\x92\xdb\xeb\x5a\x86\xfe\x40\x1c\x78\x10\xa4\x98\x4d\x5d\xb0\x41\xe7\xa6\x86\x75\xdb\x02\x51\xdc\x5c\xae\xdd\x07\x97\x44\x4c\x82\x46\x25\x16\x08\x47\x69\x09\x37\x42\x8b\xaa\x56\x07\x7a\x58\xb8\x81\xf9\x6e\xd6\x97\xc4\xf6\x9a\x96\x3a\xbe\xa0\xb0\x47\x7c\x75\x52\x58\x4b\xfb\xf8\x02\x0f\xc7\x9b\xcd\xfb\xcd\x1a\x14\xdb\xe5\x3d\xec\x4a\xda\xbd\x04\x76\x4f\xac\x62\xd2\xca\xdd\xc0\xb3\x1e\x02\xc2\x44\xa9\x48\x04\x49\x0d\xd4\x09\x3f\x8a\xdb\xf1\x11\x1e\xc4\x4d\xa5\x3c\xfa\x42\x1e\xca\x77\xe7\x3f\x4d\xe6\x38\x36\x7d\x36\xfe\x19\x2b\xf1\xfe\xee\x72\x3e\x5d\x9c\x4e\x4f\xd8\xc4\x77\x25\xa9\x09\x93\xc4\xed\xaa\x42\x4f\x3b\x72\x8f\xbc\x2e\xba\xe2\x54\x95\xae\x0a\xad\x6e\xea\x06\x58\xc0\x6a\xfd\x09\x4d\xaa\x0d\x4b\x42\x5b\x97\x1e\x42\xca\xe1\xec\xa0\xfd\xd8\x4c\xde\x76\xad\x33\x80\xf1\x30\x1b\x63\xb5\x28\x3a\x8f\x8b\x1b\x48\x07\x24\x57\xe2\xc5\xe8\x58\xbe\x55\xa6\x24\x05\x31\xf0\x6e\xd7\x64\xeb\xb6\x96\x4f\x8f\x9f\xc9\x4d\x5d\xb5\xd7\x16\xae\x50\x34\x9c\x32\x94\xcc\x52\x77\x3d\x56\x43\x7a\xa3\x9b\x2b\x5d\xe5\xbb\x24\xa0\x8e\xad\xfa\x9d\xfc\xcd\x1c\xba\x66\x78\x61\x22\x0a\x7f\x52\xb1\x96\x3b\x49\x6a\xd4\x86\x3d\x8e\x7d\xd9\xef\x2f\x5d\x63\x6c\x61\x78\x08\x31\xdf\x44\xd4\x50\x85\x29\xcd\x15\x30\x06\xda\x2d\xa1\xdf\x2d\xf6\xb6\x2d\xd0\x45\x39\x7e\xfe\xfc\xdb\xc3\xe7\x3f\x1c\x3e\x7f\x35\x92\x47\xdc\xab\x4f\xa2\x73\x4b\xd9\xe9\x13\xfd\x54\x3d\x93\x27\x4f\xab\xc6\x3e\x93\xd3\xa7\x55\x63\xd4\x33\x39\x7b\x5a\x5f\x99\xdc\xe8\xf2\x99\x98\x3d\x35\xab\x46\x3f\xfb\xbd\xfd\xeb\xff\x79\x7f\x46\xdf\x2c\xb6\xc0\x9c\xcd\xe1\x0f\x3f\xfc\xef\xe9\xff\xfa\xfc\xf8\xd5\xcb\xe7\xfd\xfe\xaf\x2f\x7f\xef\xff\xfa\xb7\xf9\x93\xce\xe2\x3b\xfa\xe1\x87\xef\x33\xf8\xff\x1f\xe4\x7b\x5d\x35\x3b\xc9\xcc\x41\xd6\x1c\x47\x89\x5c\x92\x06\xbb\xa6\x63\x86\xc7\xcd\x67\xa6\xae\x7e\x71\xea\x6b\x0d\x5a\x2a\x44\xdc\x51\xf2\x9c\x34\x6a\x27\xe7\xae\xf9\xe6\xb4\xca\x47\x99\xbc\xbc\x3c\x9b\x2c\xb1\xd3\x67\xe4\xc7\x2e\x1c\xbc\x83\x3e\xb3\xe8\x2a\xf9\xc1\xe4\x4d\xed\xba\x9d\xd1\x8f\x41\xa8\x2e\xf2\xc6\x6c\x5b\x93\x83\xd4\xa3\xee\xde\x20\xe6\x44\xc5\xe8\xd3\xdb\xeb\x7a\xe3\xf2\x4b\x49\xa2\xa8\xf5\xd5\x03\x0c\x89\xe1\xea\xb1\xf6\x5a\x55\x9f\xa8\x71\x11\xcf\x0e\x19\x09\x31\x4f\xe3\xa4\x28\xcc\x69\x5c\x1a\x43\xb3\xd1\xe0\xe3\xfe\x42\x35\xb8\x2c\x87\x3c\xbb\x3c\xe4\x33\x92\xe0\xeb\x21\x75\x16\xf4\x73\x10\x5c\x90\xc2\x7b\x5e\x69\x7d\x40\xaf\x29\x62\xf4\x62\x0c\x5b\x34\x1a\x3b\x30\xe2\x19\x78\xf4\xac\x3b\x5c\x0e\x6b\xc5\x05\x70\x04\xff\xc3\x0e\x48\x04\x05\xc5\x54\x85\xac\xd7\x68\x51\x27\x15\x82\x23\x21\xa6\x07\x05\x38\x22\x8d\xc6\x0c\x20\x3b\xc1\x64\xc6\xe4\x40\x58\xcb\xfb\x89\x25\xbd\xf9\x27\x75\xb5\x37\x46\xd2\x05\x98\x44\x60\x10\xcc\xfb\x61\xd6\xd3\xb4\x34\x74\xd5\x25\xf5\x11\x17\x1e\x67\x0d\x46\x42\xe0\x78\x59\x5f\x6f\x35\x5d\x10\xf2\xef\x74\x72\x2a\xff\xf8\xc7\xf1\x42\x4e\x17\x07\x07\x68\x88\x8c\xcf\x3e\xca\xc9\x1f\x2e\xe6\x93\xc5\x42\x9e\xcf\xe5\xf4\xc3\xc5\x6c\x3a\x39\x75\x69\xdf\xe9\x64\x91\x89\xe9\xd9\xc9\xec\xf2\x74\x7a\xf6\x2e\x93\x6f\x2e\x97\xf2\xec\x7c\x29\x67\xd3\x0f\xd3\xe5\xe4\x54\x2e\xcf\x33\x82\x01\xef\x7d\x0d\x4b\x5d\x26\xf3\x93\xf7\xe3\xb3\x25\x03\x51\xe0\x7d\xe2\xed\x74\x79\x06\xef\x7a\x7b\x3e\x97\x63\x79\x31\x9e\x2f\xa7\x27\x97\xb3\xf1\xdc\x75\x30\x91\x40\xee\xe9\x74\x71\x32\x1b\x4f\x3f\x4c\x4e\x47\x72\x7a\x26\xcf\xce\x29\x70\x25\x17\xef\xc7\xb3\x99\x7c\x3f\x39\x9b\x7f\x94\x8b\x8b\xc9\xd9\xc9\x64\x2e\xde\x4c\x10\xea\x32\x9b\xd0\x23\xcf\x3e\xca\xd3\xe9\x7c\x72\xb2\xcc\xe4\xf4\x2c\xfc\xed\x64\x7a\x3a\x39\x5b\x8e\x67\x19\x7c\xef\x64\x0a\x7f\x99\xfc\x61\xf2\xe1\x62\x36\x9e\x7f\xcc\x60\xe1\x27\xe7\x67\x8b\xc9\x3f\x5c\x4e\xce\x96\xd3\xf1\x4c\x9c\x8e\x3f\x8c\xdf\x4d\x16\xf2\xe9\x57\xd6\x7e\x31\x3f\x3f\xb9\x9c\x53\x85\xea\xf9\x5b\xb9\xb8\x7c\xb3\x58\x4e\x97\x97\xcb\x89\x7c\x77\x7e\x7e\x0a\x3b\x2a\x1c\x2a\xee\x47\x39\x3b\x5f\x2c\xb8\x4c\x3b\x93\xa7\xe3\xe5\x18\x5f\x7c\x31\x3f\x7f\x3b\x5d\x2e\x7e\x84\xbf\xbf\xb9\x5c\x4c\x71\x77\xa6\x67\xcb\xc9\x7c\x7e\x79\x01\xe6\xe1\x33\xf9\xfe\xfc\xe7\xc9\x4f\x93\xb9\x38\x19\x5f\x2e\x26\xa7\x78\x6c\xe7\x67\xb8\xd4\xe5\xfb\xc9\xf9\xfc\x23\x3c\xd4\xc3\x7d\x32\xf9\xf3\xfb\xc9\xf2\xfd\x64\x0e\x3b\x87\x40\xdd\x31\x6c\xc1\x62\x39\x9f\x9e\x2c\xa3\x8f\x89\xf3\xb9\x5c\x9e\xcf\x97\xd1\x1a\xe5\xd9\xe4\xdd\x6c\xfa\x0e\xf6\x15\xa8\x39\x87\xa7\xfc\x3c\x5d\x4c\x9e\xc9\xf1\x7c\xba\x80\x0f\x4c\xe9\xb5\x3f\x8f\x3f\xca\xf3\xcb\x25\xbb\x5b\xe2\x72\x31\xf1\x13\x8d\x1d\xcb\x65\x78\x64\x72\xfa\x56\x8e\x4f\x7f\x9a\x02\xd9\xec\x9b\x5d\x9c\x2f\x16\xae\xa4\x00\xb7\xec\xe4\xbd\xa4\xed\xfe\x3f\xbf\xe3\xfd\xe8\x9b\x49\x53\x5e\xcc\x0e\x8f\x46\x47\x7f\x2d\xf5\xff\x15\xfd\xff\xe2\xc5\xf1\xd1\xcb\xbe\xfe\x3f\x7a\xfe\xe2\x77\xfd\xff\xb7\xf8\x33\x99\xcf\xc6\x67\xef\xe4\xc5\xe5\x9b\xd9\xf4\xc4\x37\x7e\x8f\xc6\xe0\xd2\xc4\xef\x91\x8c\x06\xa4\x80\x6f\x34\x3a\x1a\xc9\x3f\xfe\x31\x42\xd1\x1e\x1c\x70\xc7\x02\x74\xb7\xa9\xc1\x1b\x89\x73\xac\xab\xd6\x6e\x46\xb6\xeb\xf5\xc6\xce\x8a\xf0\x55\xd7\xf5\x9a\xd1\x8d\x41\xe9\x1c\x8d\x8e\x7b\x6f\x71\x94\xf9\xb7\x31\xb4\x6d\xd5\x4b\x60\x9c\xbb\xb9\xf4\x27\xd8\x8c\x1d\x73\x1d\x22\x79\xbc\x74\x63\x78\x54\x8c\x05\x0e\xd1\xb1\xf4\xc3\x18\x2f\x5c\xf1\x82\x02\x76\x40\x44\x5f\x45\x7a\x5f\x10\xbd\x37\x08\x48\x83\x77\x27\x84\x26\x54\xc1\x7e\xa4\x2f\x61\x83\x24\x5a\x8e\x18\x5a\x0e\x92\xf8\x21\xed\x6f\x67\x2a\xda\x77\x4c\x66\x46\x23\xb2\xea\xc6\x21\x41\x5d\x8e\xe5\x68\xf4\x12\x68\x9c\x60\x16\xa1\xae\x4c\x2e\x4f\x63\xab\xe6\x83\xce\xaf\x55\x65\xec\xc6\x13\xae\xe4\xc6\xfd\x2c\x80\xe2\x7c\x6f\x1c\xe1\x9a\x9c\xf9\x70\x47\x64\x12\x72\x5e\xa2\xdd\x85\xfe\x36\xe1\xb5\xae\x4c\xcd\xc1\xdc\x90\xb6\x57\x48\x1b\xe2\x44\xc1\xd5\xf6\x44\xc4\x5b\xea\xe0\xf9\xd8\x4d\x33\xc2\x7e\xa4\x5d\x1a\x8f\x46\xdf\xc2\xb3\x5c\x55\xc9\xa9\xeb\x04\x9c\x1c\x48\xda\x9b\x90\x99\x96\xd0\xf8\x18\xb1\xa2\x09\xba\x62\xef\x21\xce\xb6\x89\x4b\x6b\x7d\xd1\x24\xa3\xd5\x57\x3b\x39\xf9\x72\x6d\x56\xa6\x95\x63\xa4\xe7\x3b\xa0\x67\xa6\x9a\x2b\xdd\xc8\x9f\xeb\xe6\x53\xb4\xc3\x98\xa4\x21\x73\x88\x4e\x5f\xf7\x96\x5c\x37\xfe\x2c\x85\x6b\x3a\x8b\xb6\x65\xce\xaf\xde\x1b\xc6\x94\x4e\x8e\xe1\x20\x5b\x08\x6f\x8e\xbe\x47\x6a\xe8\xc7\xd1\x9e\x44\x33\xb4\x91\xe8\x1f\xe0\x63\x09\xb3\x05\xb2\xab\x5d\xd2\x3a\x10\x11\x5f\xa5\x4e\x61\x78\xb6\x5b\x71\x16\x1e\xfb\x6b\x34\x5d\xce\x56\xa6\x4b\xe7\x0c\xde\x0b\xb4\x82\x5d\x56\x23\x95\x0a\xf2\xe7\x6b\x5d\x89\x94\x1f\x70\x48\x94\x56\xd6\xc1\x54\xad\x6e\x38\xce\x89\x2d\x13\x33\xa9\x92\x87\x48\x63\x5f\x0b\x31\xa6\xca\xac\xaf\xae\x00\x64\x96\xeb\x4b\xa2\xf0\x81\x71\x87\x2f\x47\xba\x2f\xcd\x7f\x80\x6c\x21\xde\xd0\xfb\xb0\xb7\x24\x3c\x84\x64\xa3\x1b\x99\x88\x2b\x8e\x80\xc1\x7b\x5b\xf2\xe0\x73\x8f\x46\x47\xcf\xe1\x90\x92\x6f\xf8\x43\x8a\x39\xb4\x5e\x87\xbe\xd6\x11\x9a\xa7\x60\x4b\x5c\xc0\xd9\x6b\x6a\xde\x53\xfc\xb9\x1c\x0e\x1b\x9f\x0a\x5d\x8c\x76\xe1\x83\x33\xc9\x78\x1d\x6c\xbd\xe6\x12\x63\x74\x62\xf1\xc8\xa5\x59\x18\x4e\x8e\xf6\x7f\xd9\x68\x55\xec\xdc\x45\xa0\x1d\xde\x6b\x78\x1f\x38\xfb\x68\x74\x84\x4a\x29\x22\x39\xb9\xec\x5b\x1f\x27\x23\xc9\xc1\x93\x27\x62\x4e\x5a\x53\xaf\x14\x53\x5d\x89\xbd\x16\x29\x58\xc1\x1b\x66\x8f\x52\x17\x95\x0e\x3b\x72\x86\x73\xcc\xe4\xb6\xec\xf8\x6a\x04\xb8\x24\x26\x07\xd7\x2a\xd7\x54\x27\x45\xfc\xc6\xac\x69\xd1\x75\x65\x75\x44\xf9\xa0\xb6\xa9\xcb\xa4\x0d\x2d\xb9\x6d\xb6\x55\x65\xe9\xd5\x02\x96\x74\x39\x39\x49\x2d\x57\x65\x69\x6c\xd4\x30\x94\x8e\xb6\x30\x08\x8f\x26\x7c\x2d\x82\xbe\x1a\x83\xa8\x43\x86\xe8\x88\xc7\xef\x21\xf7\xd0\xd4\x65\x89\xad\xd0\xab\x2c\x9a\xee\x9b\x4a\x28\x2a\x78\x8d\x2d\x02\xcb\x73\xca\xc9\xb5\x8e\x39\x29\x57\x15\x25\x5d\xb0\x96\x74\x83\x58\x2f\x2a\x67\x52\x4d\x7e\x6d\x6e\x54\x29\xf6\x2a\xe4\x31\x11\xd6\xd4\xdb\x06\x1d\xd0\x42\xbb\xef\x71\xef\x9e\x42\x1f\xd2\x77\xe3\xbe\x34\xc0\x4a\xb7\xa6\xd0\xe5\x4e\x04\xb2\xd7\x35\xe5\x79\xb1\x83\x09\xf1\x0d\x9a\x19\x1f\xeb\x2e\x92\x6d\x3d\xdd\xa0\x92\xce\xb5\xf1\x78\x84\x78\x74\x58\xe6\xfa\xb7\x6c\x4b\x9a\x63\xcf\x75\xfb\x69\x03\xb3\x7a\x9d\xa5\xbc\x2b\xdf\xa6\x9d\x71\x8d\xb6\x99\x70\x04\x45\xbd\x6f\x76\xee\xf5\x4e\x55\x20\xab\x80\xfa\xb7\xee\x1f\x25\x5e\x0d\xe4\x07\xc3\x44\x09\x50\xc3\xd8\x4d\x80\x38\x0b\x89\xfa\x58\x77\xf4\x5a\x37\x6e\xd8\xab\x8a\xc0\xa2\x99\xfc\xe3\x1f\xf9\x4b\x6e\x63\xc4\x53\x45\xbd\x14\xb7\xf5\xad\x6e\x32\x19\x10\xfa\x61\x4a\x22\xb6\x41\x72\x29\x37\xfa\x21\x9f\xd1\x46\x55\x8a\x31\x6b\xf5\x9a\x66\xd4\x87\x4e\xc0\x34\x3f\x12\xc7\xe0\x55\x6d\xc3\x69\x45\x3f\x18\x11\x57\xf4\x74\xf5\x8c\x0a\x16\xed\xb5\xd9\x92\x78\x5f\xb7\x98\x07\xcb\x75\xd5\x8a\xa7\xaf\x9e\xff\xdf\xcf\xfa\x99\xd7\xba\x6b\x1d\x0c\x4b\xda\x6b\xd5\x90\x21\xba\xd2\x95\xe6\x31\x9d\xc9\x03\x23\x9a\x48\x57\x1e\x8f\x12\xc6\x0d\xd2\xe6\x18\x2c\xe0\x65\x54\xb7\x1a\x8c\x83\x77\x8d\xaa\xda\x87\x7e\x99\x76\xd8\xfb\x58\x77\x82\xa7\x4b\x1f\x0e\x8d\x97\x1e\x98\x29\x4d\xc8\x91\x28\x75\xe3\x41\x8e\x62\x18\xe4\x48\x58\xb3\xd7\x82\xce\x8e\xf1\x44\xbe\x20\x31\xcc\x8b\xe6\x16\x59\x99\xcb\x8b\xe0\x6b\x7c\x51\x7d\xbf\x46\xbb\x2f\x2d\x9e\x46\x26\x8a\x33\x37\x9f\xed\xc5\xbf\x7a\x66\x6b\xdd\x08\x65\xbd\xde\x53\x32\xb2\x8e\x7e\x44\xbc\x9d\x80\x23\x27\x15\xe1\x3a\xd4\x55\xf5\xad\x64\x4c\x34\x35\x67\x83\x03\x2c\xbc\x77\xe1\xae\xc0\xfe\xd6\x67\x82\x1b\x51\x65\x54\xc0\x03\x36\x7d\xe6\x07\x20\x58\x10\x71\x4f\xff\xf8\xc7\xcb\xd6\x94\xe6\x1f\xf5\xc1\xc1\xb3\x01\x91\xf8\x74\xc0\x0e\x7b\x46\x91\x2b\x5b\x97\x9a\xda\x18\x10\x32\xae\xf5\x70\x00\xea\xd3\x9b\x5f\xf3\x0a\xc8\x5c\x51\xb6\xae\xd4\xaa\xdc\x85\x74\x8f\xc0\x94\x17\x4a\xa8\x8f\x75\x07\x0f\x62\x52\xbe\x42\x47\xd8\x6c\x2a\xe8\xa6\x26\x27\x15\xb0\x98\x46\x5c\xce\xff\xcf\xde\xbf\x36\xb7\x91\xa3\x69\xc2\xf0\x77\xfc\x0a\xbc\xfc\xf0\x96\x14\x9b\xa2\x25\xf9\x50\x6d\x7b\x62\x62\x68\x89\xb2\xb9\x2d\x93\x1a\x92\x2a\x97\x77\x63\xe3\x19\x90\x04\xc9\x1c\x27\x13\xec\x44\xd2\x32\xe7\xd7\x3f\x81\xfb\x80\x43\x32\x29\xcb\xd5\x5d\xd5\xb3\x4f\x94\x62\xa7\xb6\x2d\x91\x48\x24\x0e\xf7\xf9\xbe\xae\x78\x2e\x54\xc7\x14\x72\xfc\xd1\x63\x18\x88\x29\xd9\x23\x81\x40\x89\xec\x90\x58\x38\xf9\x97\xdd\x58\xce\xf3\x79\xef\x3b\x07\x24\xfe\xfd\xc1\x51\x97\x8f\x1c\xf5\x36\xfa\xf4\xe3\x47\xfd\x48\x3d\xef\xef\x75\xd4\x53\x3f\x0d\x1d\x5a\x38\x64\xb0\xaf\xf1\x3b\xb7\xef\x0c\xea\x58\x01\xaa\x3c\x46\x55\x80\xb2\x53\x02\x1e\x34\x87\x8b\x0f\x58\xce\x4d\x3f\x80\x2e\x8c\xf8\x87\x5f\x98\xc4\x0d\xae\x8d\x88\x8f\x5f\x8b\x0b\xde\xfe\xaa\xc7\x2f\x83\xf8\x91\xcb\x20\x1f\xbb\x0c\xe2\x07\x66\x13\xee\x84\x3c\x72\x27\xc4\x0f\xdf\x09\x79\x78\x27\xa4\x94\xcf\xbb\xa9\x27\x3d\x0a\xf5\xaa\x00\xaf\x78\xd1\x95\xbd\xd0\x37\xe9\xe4\x9d\x57\xff\xd3\x83\x23\x86\x0a\xde\xbd\x7a\x08\x99\xc8\x98\xf0\xa9\x85\x9c\x33\x18\x14\xb1\xa1\xca\x92\x37\x02\xef\x99\x90\x46\x86\x8b\x3c\x4d\xf9\x0d\xe2\x3a\x82\xe4\xe4\x1d\x22\xb0\x60\x81\x47\x03\x9c\x43\x1c\x4c\xc5\xed\xc0\x67\xe6\x93\x8f\xe1\x54\x18\x80\x28\xb2\xfc\xe1\x22\xe8\xaf\xba\x42\x32\xdc\x50\x82\x1c\xe6\xe7\x86\x0a\x93\xe8\xe2\xd0\x0a\x5a\xf1\xa9\x75\x17\xa9\xa7\x8d\xa5\x26\x00\x5c\xa0\x12\x44\x62\xdb\x8b\xe2\xb1\x2c\x6a\xea\x9a\x63\xfc\x64\xcb\x26\x27\xd7\x5e\x85\x85\x11\xc9\x9c\x7d\x1a\x69\x9e\x6f\x73\x77\xe1\x7e\x62\x93\x30\x40\x40\x86\xda\x5c\x9e\x2e\x2d\x84\x50\x65\x8c\xfc\xc3\xae\x77\xe8\x87\xae\x53\x68\x20\xcf\x48\x13\xb9\x69\xb4\x9d\xe2\x79\xf7\x25\x82\x53\x77\x65\x0f\x8d\x5d\xdf\xdd\x14\x87\x46\xc0\x0b\x4d\xdc\xe1\xd6\xc3\xe6\xb6\x4b\xcc\x34\x11\x42\x78\xe3\x39\x2f\x0f\xf9\x58\x8e\x11\x10\xf3\x0a\x05\xe9\xe7\xab\x55\x36\x7a\x91\x2b\x24\x46\x88\xdc\x98\xb0\xc6\x95\xfc\xea\xfe\x5e\x06\x0c\xe6\x23\x01\x2b\xe1\x03\x56\x74\xc5\x4d\xa9\x91\x3e\xc4\x6c\x80\x8c\x16\xe7\xdf\xfa\x14\xff\x56\x28\x3a\xf3\x65\xf3\x65\xdd\x1c\xbe\x1b\x28\xcb\xf0\x64\x53\x4d\x9b\xff\x32\xb4\x69\x78\x22\x8d\xfa\x41\x17\x5f\xb5\x3c\xb9\x88\xca\x44\x40\x16\xd7\x0c\x42\x09\x28\x97\x60\xb1\x40\xd5\xd4\x1c\x48\x03\x78\x30\x00\xf1\xf4\x83\xd9\xfc\x9b\x3c\x79\xd5\x18\x48\xb5\x14\x31\xe1\x4e\x24\x11\xcb\x64\xe7\x85\x2f\x73\x6f\xbc\x38\x30\x1d\xcd\xd7\xd1\xa1\xc6\x8b\xd6\x96\x43\xe5\xbe\x37\x11\xb5\xe5\x1c\xde\x32\x5c\x1e\x1b\x3d\x83\xd9\xca\xdd\x37\xbe\xbf\xb9\x50\xb3\x99\x83\x93\xcd\x61\xdb\xc8\x1c\x80\x73\xef\x04\xb0\x46\x77\xba\x35\x9e\x1c\xa4\x10\xba\x27\x88\x43\x1a\x89\x38\xcf\x3a\xb3\x4f\xaf\x02\x79\xe5\xb0\xbd\x18\xbb\xe1\x7b\xca\x37\x94\x59\x9b\x3f\xf3\x81\x73\x5f\x01\x55\x83\xab\x92\x3c\x86\x23\xcc\x8c\x3d\x0a\xed\xc5\x30\x40\xb7\x4d\x50\x6e\x2b\xb3\xc9\x4b\xa7\x40\xa1\xdd\x34\x74\xfc\x34\x0d\x13\x28\x4b\x44\x9e\x8d\xec\x08\xe2\x47\x86\x61\xad\x34\x68\xe5\x7d\x6c\x52\x29\x87\x3e\x0b\xc6\x1f\x22\xda\x91\xa4\xfb\x84\x3e\x2f\x92\xe8\x28\xfb\x89\xd1\x59\xa0\x16\xeb\xd9\x29\x07\x70\x29\x9e\x84\x18\x28\x87\xf7\x53\x60\x23\x1d\x98\x5a\x69\x12\x39\x8f\x65\x16\xcb\xc2\x38\x9f\x8d\x28\xdf\xde\xad\x13\xcd\x40\x8f\x8f\x83\x02\x28\xd8\x20\xb6\x25\xef\xd8\x96\xfc\xa8\x6a\xa7\x13\xd0\x96\x9c\xc2\x59\xc3\xca\xee\x2b\x30\x32\x01\x3b\xdb\x3d\x1f\x7c\x09\xdf\xf0\x48\xea\x84\xac\x54\xb4\x47\x31\x9a\x70\x14\x5d\xa5\xd1\x73\xc9\x3d\x00\xaa\xa0\x0a\xff\x39\x5b\xfc\x80\xf2\x0f\x86\x09\x2e\x03\x7a\xf7\xb1\xa8\x3d\xcd\x50\xe6\xa5\x27\x08\x8a\x80\xe1\xdc\xfa\x3e\x8c\x34\x42\x14\xdd\x38\xea\x1d\xfd\x8f\xff\xb8\xed\xbf\xef\xdd\xfe\xf4\x13\x2d\x34\x2f\x32\x25\x5c\x00\x2d\xc1\x73\xc5\xc2\xab\x62\xd8\x2c\xfc\x59\xe4\x25\xb4\xe6\xe7\xd0\x3c\x2d\x17\xba\x56\x79\xc1\xab\xe3\xe5\x0a\xb6\x23\xba\xd5\x43\x89\xcd\x57\x6d\x5e\xc3\xfa\xba\x97\x31\x33\x77\xf3\x30\x5a\x10\x96\x19\x85\x1e\xde\xb7\x2f\x1a\x79\xcd\x93\xcb\x10\x04\x8d\x4a\xf5\xa5\x60\xf3\xe7\x79\xf7\x12\xf5\xb1\xef\x44\xdb\x6c\xdd\x8d\x89\x70\xaf\x60\x11\x70\xe9\xdc\x29\x85\x66\x73\x28\xa1\xe5\x07\x47\x61\xa5\x3a\x18\xd8\xa1\x83\xbd\x76\x93\x43\xcb\xde\xd6\x7a\x6b\xe5\x09\x37\x7d\xb8\xc3\x4f\xdd\xd2\x21\xac\x25\x36\x54\x6e\x58\xe4\xb6\xe6\xda\x56\xbb\xaa\xcc\x6e\x6b\x4f\x63\x43\x79\xae\x0a\x77\x5a\x08\xdf\x01\x39\xd6\x89\xbb\x07\xcb\x68\xe7\xda\xc9\x81\x83\x83\x4f\x0c\x7b\xfa\x21\x5a\x4a\xaf\x04\x70\xa5\xa1\xb0\xc7\xdd\xd2\xd8\xca\xee\xdd\x0d\xfc\x89\xaf\x0e\xa4\x8e\xd3\xd3\x91\x69\x4b\x5c\x5e\x1b\xec\x27\xa6\xd0\xa7\x60\x3b\x10\xd0\xf6\xbd\xef\xe1\xbd\x94\xb8\x09\xbc\xdd\x1f\xc8\x37\x5b\xee\xff\x77\x2f\xd1\xbb\x1b\x44\xa7\x5d\x15\xd6\x44\x38\x76\xb9\x8d\x89\xe7\x39\x98\x1d\xb6\x13\x14\xc6\xcb\xae\x1c\x73\x2c\x1b\x09\xae\x63\x25\x11\xaa\xa8\x41\xe0\x79\x59\x15\x42\xde\x94\x74\x13\x70\x3e\x0e\x4d\x55\xce\x25\xc6\x91\x6d\x14\x7c\xa9\x34\x0b\xf8\x3e\x1e\x21\x96\x09\xe2\x12\xf9\xd6\x62\x61\xc6\x08\x9d\x89\x7c\xa3\xad\x12\xec\xaa\xc6\x2d\x09\xf1\xee\x9d\xd8\xd3\x60\x93\xaa\xc5\xc2\x2d\x68\x85\xd2\x5d\xd9\x34\x35\x4a\xfd\x5e\xbc\x12\x89\x09\x1a\x12\x5d\xee\xc1\x9e\xdc\x31\x20\x13\x00\xd6\x75\x8d\x46\x05\x0e\x20\x40\x9b\x46\x72\x2f\x31\x2b\x41\xc9\x22\x7e\x07\xc2\x43\x51\xe2\x08\x6a\x62\xcb\x03\x21\x27\xa2\x81\x31\xaa\x5c\x18\x3a\x8c\xfe\xc2\xa9\xd0\xd2\x89\xea\xd0\x10\x0f\xdc\x29\xb3\xf1\x01\xca\x80\x78\x80\xfe\x56\x68\x1d\xfb\x42\x4e\x6c\x61\xcc\x17\xd8\x26\x1c\x8b\x1e\x14\x7c\x0f\x06\x35\x23\xf0\x20\x26\x69\x11\x18\x62\x76\x46\x83\x06\x5b\x29\x8b\x9a\xd6\xed\x0e\x60\x39\x9c\xab\xb6\xd0\x9b\x92\x64\x7d\x68\x02\x8d\xdb\x1d\x6b\x23\xe2\x0d\x0c\x07\xa1\xe9\xa5\xb5\x38\x1a\x0b\x23\xad\x41\x57\xcd\x94\x70\x7d\x85\xbb\x81\x33\xbd\x56\xc5\x32\xf8\xc7\x86\x7f\xd5\xc4\x27\x0c\x5a\x9d\xf2\x72\x49\xca\xdb\xdf\x16\xa6\x6c\x55\x33\xa8\x8e\x76\x0b\x37\x2f\xb4\xa2\xd4\xac\xf7\xfa\x1f\x7b\x7f\x71\xe4\xfd\x25\x10\x80\x78\x8c\x17\xb0\x43\x0b\x53\x46\xae\x25\x05\x9a\x7c\xe5\x38\x0d\xb9\x84\x4e\x9e\x23\xf6\x0c\x7a\x99\xb1\x8c\xe3\xf2\xbb\x08\x45\x87\xc1\x6f\x66\xc7\x46\xe2\x33\x11\x8f\xd3\x40\xca\x39\x7c\x65\x71\x64\xcb\xd1\x7b\x02\x19\xe9\x5e\x17\x64\xd4\xab\x46\x54\xc1\x2c\x63\x4b\x89\x82\x1f\x36\x1c\xc5\xa8\xdb\x23\x3e\x18\x22\x4f\x2c\x2c\x4c\x80\xb9\x33\x91\x33\x0e\x51\xe8\xcf\x07\x87\xd1\xeb\xc8\x8b\xb3\xe7\xdd\x97\x68\xe4\xa0\xa7\xa0\x6b\x02\x63\x6e\xd8\xb5\x44\x0d\x8a\x46\x51\x30\x3e\xe8\x52\x3a\xdb\xd5\x83\x63\x34\xa4\x5d\xb3\x77\xa1\x99\xdc\x0d\x3a\xf6\x3b\x9e\xa6\x5b\x59\x9f\xa0\x23\x09\xe5\x9d\x81\xb5\x79\x40\x7e\x2f\x2f\x59\xe1\xa5\x08\x81\x88\x52\x4c\xd1\xad\x13\xc9\x32\x60\xa4\x84\xdf\x06\x8e\xfc\x0c\xd1\x6b\xb6\xf9\x7c\x67\x76\xb6\xf0\x3e\xfd\xe2\xc0\xbe\x15\xad\xf6\x6d\x76\xc4\xba\x05\xe5\x58\xb8\xbf\x54\xaa\x68\xb7\x75\xc5\x77\x74\xc1\x81\xbd\xdb\x76\x3e\xc0\xf1\xf2\xb3\x12\xc7\x02\x3f\xdc\xb3\xc2\xe1\x51\x43\x46\x00\xe6\xf6\x62\xda\x66\x72\x92\x08\x3a\xcc\x27\x1e\x39\x95\x1e\x07\x85\xd2\xca\x56\x76\x2d\x0f\x9b\x86\xc5\xf1\xa8\x82\xe7\x0b\xae\xd7\x87\x54\x6d\x2d\xde\x84\xc7\x88\x70\x76\xfd\x66\x0b\x21\x41\x08\x8a\x61\x1b\x25\x3b\xe3\x7e\x65\x7f\xb2\x9e\xf0\xfc\x20\x15\xee\x17\xcb\x57\x09\xd0\x47\x0f\x09\x6e\x7c\x90\x8f\xdc\x85\xef\x6f\x00\x2f\x78\x58\x40\x7e\xbb\x27\x49\x5b\x88\xb1\xd2\x1e\x90\xf1\x0e\x03\x1d\x6e\x03\xac\x79\xbb\x64\x05\xf4\xaf\xfd\x91\xe2\x97\x16\x45\xf0\xb8\x18\x3e\xe2\x26\xfe\x06\x31\x7c\x64\xa4\x27\x88\x61\xaf\x82\xda\xa4\xec\xcf\xdd\x38\x92\x1e\x89\x53\xb4\x9f\xd2\x40\x3b\xe6\x28\x37\x33\x2c\x00\x49\xa4\x6c\x14\xc8\xff\xb1\xc2\x9c\x66\xa7\x1e\x80\xe1\x44\x8f\xc4\xb2\x96\xbc\x5c\x15\x1e\xa6\x08\xf0\xc7\xc8\x20\x99\x2b\x77\xa9\xd2\xe3\x01\x1d\x7c\x4d\xd9\xde\x0c\xcf\xc2\x11\x08\x22\x90\xaf\x4f\xc3\x57\x06\x1f\x39\x20\x97\xc8\x2b\x6c\x02\xbd\x46\x03\x6d\x52\x2b\x80\xf2\x32\x95\x1c\xeb\xd5\x0e\x4b\x14\x22\x43\x10\x82\xb1\x3e\x5e\x24\x28\x9e\x1f\x37\x92\x46\xb4\x7b\xed\xab\x03\x9f\x62\x30\x93\xda\x59\x34\x1b\x0d\xc9\xc3\x90\x5a\x4f\x64\x16\x99\x8e\x36\xcc\xac\xf2\x33\x43\x0b\x92\xd7\xea\x0d\x44\x2a\x70\x32\xa2\x01\x53\xd0\x9c\x05\x09\xd6\x8d\xfa\x96\x6f\x76\x1b\xce\x21\xf0\xcb\xbd\xf5\xe1\x0d\x2f\xa5\xeb\x04\x34\xdf\x7a\x8f\x99\xe0\xb3\xf5\x5e\x2a\x68\x81\x25\x18\x93\x58\x61\xb1\x86\x61\x9d\x22\x0e\x5c\x98\xd6\x20\xb0\x7c\xde\x7d\x01\x8f\x69\x7e\x3f\x94\x22\x24\x4d\x04\x2d\x11\xf6\xae\xec\x7f\x9b\xeb\x6d\xdd\x48\x65\x6e\x2b\x03\x36\x3e\xe5\xbd\xda\x56\x36\x43\x33\xbc\xed\x35\x42\x24\xa0\xd8\x53\x2c\x80\x1b\x1e\xa2\x60\x80\x59\x4a\x68\x31\x55\xd5\x5e\xd8\x2f\xb9\xf3\x9f\xa1\x39\x97\x63\x92\x01\x54\xc5\xd3\x03\xbe\x3c\xc8\xaa\x34\xaa\x82\xa6\xc9\x69\xdf\x22\x9f\x02\x9c\xbf\x28\xe2\x77\xc4\xe2\x75\x9e\x71\x80\xf6\x5d\x6b\xd1\xe2\x05\x7a\x46\x46\x56\xe6\x87\x71\xa6\x57\x5d\x79\x35\x1a\x0e\xfb\xd0\x1a\x09\xb4\x4f\xa3\xff\x35\xb8\xbd\xed\x35\xaa\x6e\x69\xae\xfd\xaa\x50\xe5\x2a\x2e\x86\x52\x18\xd6\xc3\xe6\x6a\x28\x15\xf4\x14\x04\xff\x95\x17\x85\x6a\xb0\xc4\x66\x6c\x16\x8a\x8b\xee\x79\x57\x0e\xa2\x2a\xb3\xe3\x5a\xe1\x69\x83\xc1\xeb\xfc\xdc\x0d\xdd\x0c\x63\x39\xba\xf1\x80\x7a\x5d\x21\xae\x46\xbf\xf4\xc7\xfd\x6b\x79\x35\xba\x4e\x5b\x34\xee\x87\xd7\x80\x5b\x3d\x98\xf8\x22\x63\x28\xf8\x8f\x7a\x37\xde\xf5\x26\x83\x49\xc6\x44\x3a\x82\x47\x75\x4f\xe8\x0d\x3f\xcb\xbf\x0e\x86\xd7\x99\xec\x0f\xa0\x11\x80\xfa\x3b\xfa\xd7\x51\x87\x07\x34\x45\x70\x6b\x03\xd3\xf1\x40\x6b\x03\xc0\xce\x64\x22\x6a\xe5\x98\x7e\xe8\x4d\x09\xf7\x3b\x9d\xf0\xcd\xb8\x0f\x95\xff\xd7\xfd\x9b\xfe\xd5\x74\x92\x45\x1d\x1f\xb7\xfd\x4c\xde\x0c\xa6\xf2\x66\x34\x16\xad\x7d\x1e\xa3\xb1\x1c\x8e\x86\x67\x83\xe1\xcd\x78\x30\x7c\x3f\x18\xbe\xef\x22\x50\xf7\x70\x3a\x18\xf7\xe5\x78\x30\xf9\xab\xec\x4d\xdc\xfe\xbb\xdf\xfe\xfb\x7d\x0f\xa0\x4c\x7b\xc3\x6b\x79\xd7\x1f\xdf\x8c\xc6\x1f\x7b\xd0\xa5\x70\xd3\x3a\x2f\xa0\x2a\xf8\x3c\xba\xef\xca\xc9\x87\xd1\xfd\x2d\x76\xb9\x24\x1f\x72\x4b\xdd\x17\x38\xef\xc1\x2f\x7d\x6e\x6c\x18\xf7\x27\x77\xd0\x31\xf2\x79\x74\x2f\x4f\x86\xa3\x69\x02\x72\x7f\xdd\xff\xa5\x7f\x3b\xba\x73\xfb\x88\x9d\x26\xd0\x21\x11\xd0\xd0\x47\xe3\x53\xd1\x9b\x4c\xee\x3f\xf6\x69\x56\x93\x29\xef\xc7\xb0\x7f\xd5\x9f\x4c\x7a\xe3\xcf\x84\x92\x0c\xcb\x3e\xee\xdf\xf5\x06\x63\xec\x3e\x19\x8f\xf1\xc4\x77\x71\xdb\xc3\x99\x11\xd1\x99\x81\x2e\x15\x6c\x30\x99\xb8\xe3\xe0\x36\x15\x1a\x56\x60\x81\x7d\x0f\x06\x9d\x99\xae\x1c\x8e\x24\xf5\x66\x44\x0b\x20\x78\x95\x7a\xf7\xd3\x0f\xa3\xf1\xe0\x7f\xf5\xaf\xe5\x87\xfe\xb8\x8f\x87\xae\xff\xeb\x55\xff\x6e\x1a\x9f\xc0\x30\x15\x3c\xd1\x7f\xe9\xc6\xf8\x44\x07\x42\x23\x26\xcc\x6a\x61\x84\xc5\x18\x66\x00\x1a\x4a\x00\x88\x04\x39\x44\x4b\x88\x7e\xa6\x6a\x0f\x6f\x23\xf2\x4d\x21\x25\x26\x7f\xc8\xa9\x6e\x90\xa5\x04\x89\x84\x8d\xc6\xe2\xf9\x39\x42\x15\x99\x25\xf2\xda\x80\x9f\x83\xd8\x4c\x28\x10\xf0\xe3\xd8\xad\x17\x2a\x1a\x6c\x9b\x4b\x10\xa1\x2e\x62\x38\xba\xd8\xfb\x57\xc3\xd8\xa5\xdd\x55\x5f\x01\x4f\xa3\xdc\x1f\x62\x04\xc5\x32\xf6\x2e\x74\x8e\x53\xbd\x27\x9a\x3a\x79\x45\x4d\x65\x69\x8a\xcc\x23\x3f\xc8\x99\xde\x9b\x32\x30\x11\x27\x45\xef\xd1\x06\x24\xd3\xc1\x1d\x7b\xdd\x94\x41\x11\x36\x70\xaf\xdc\x27\x61\xf2\xa6\x43\xd3\x86\x0c\x71\xcc\xc8\x4d\x4a\x0d\x50\x19\x35\x10\x85\x10\xf5\xc6\xca\x93\x92\x0a\x29\xa9\x24\xae\x8c\x12\x2f\xa7\x38\xe9\x8b\xf3\x6e\x13\xd2\x28\x39\x68\x01\xdf\x91\xfb\x00\xb6\x85\xae\x63\x70\x95\x08\x47\x85\x8a\xab\xa1\x36\x66\x03\xa9\x0a\x41\x35\xfe\xce\xf2\xc2\x02\x6a\x06\xce\xc8\xdd\x29\x2b\x16\xf4\x02\xbb\x92\xb8\x46\xb1\x72\x94\x91\xdc\xe8\xb3\x1e\xc8\x1b\x60\xed\x36\x9c\xe6\x4f\x8d\x81\x24\x2e\xcb\xce\x48\x34\xaa\x73\x96\xc3\x8b\x85\x4e\x75\x80\x91\xa9\x76\x94\xc1\x23\x6a\x4b\xe0\x67\x4b\x61\xa2\xa8\x6a\x1c\x14\x5e\xa1\x1e\x30\x24\xf1\xa0\x17\xba\xec\xc2\xf6\x52\x0f\x7c\x46\x51\x64\xe7\x39\x61\xaa\x04\x13\x13\x29\x8c\x1e\xa7\x91\xbc\x6f\x1c\x07\x0c\xc8\xe0\xc5\x8b\x93\xa5\xe7\xbc\x8a\xb1\x48\xea\x14\x2e\x68\xa6\x1b\xf8\x09\x22\xd4\x2e\xc5\xbd\xf6\x3c\xf3\xdc\xae\xe5\x1c\x3a\xf2\xb3\xf0\x9a\x93\xda\xcc\xbf\xac\x4d\xb1\x91\x57\xee\x11\xd0\xb1\x0f\x34\xa5\x9e\xac\x1a\xaa\x7e\x4b\x60\x8c\xef\xff\xfa\x61\xf0\x6e\x30\x85\x66\x82\xff\xf8\x8f\x69\xa3\x32\x1d\xde\x0a\xcc\x42\xe0\xa4\x4f\xa1\x1d\xc8\xa4\x38\xae\xd9\x2f\x32\x79\xe2\x3e\xd8\xa1\xbf\x75\x4e\xdf\x52\xf2\x1c\x0b\x2b\xf0\x9a\xf0\x13\x34\xda\x87\x47\xbc\x75\xef\xf0\x62\x6a\x05\xa2\xa9\x10\x69\xe1\xa4\x44\x83\x7d\xaa\x75\x72\xc2\xf9\xa1\x2b\x5e\xa9\xa8\xab\x18\x4e\x77\x69\x90\x4d\x89\xca\x88\x2b\x5d\x57\xb9\x76\x23\x7f\xcd\x15\x8c\x09\x55\x66\x50\xf9\x2b\x1f\xf4\x4c\xa8\x5a\xae\xeb\x7a\xfb\xe6\xd9\xb3\x87\x87\x87\xae\x86\x07\x76\x4d\xb5\x7a\xd6\x15\xe2\x11\x9c\x8e\xe8\x6d\x20\xb7\x9a\x94\xbe\x48\x55\xca\x0e\x98\x2e\x1d\x2a\xe3\x12\x6c\x73\xb4\x5b\x2e\x29\xb2\x25\x55\xa9\x14\xb9\x5e\x74\xe5\x44\x27\xa0\xd9\x1e\x17\x9e\x68\x67\xe7\xd2\x4d\x78\xa7\x56\x5c\xfe\x13\x95\x1d\x03\x8a\x56\xe4\x62\x1c\xcc\x9c\x40\x73\x5b\x04\x5c\x5b\xa3\x01\xd8\x9f\xf9\xdc\x5a\x53\xca\xfb\xfa\xab\x9e\x7f\x29\x00\x98\xa2\xf7\xae\x2b\xef\xb8\xf0\x31\xaa\x7f\xf3\x1f\x76\x2b\x18\x7a\xc9\x2f\x5e\xbf\x7e\x9d\x1d\x1f\xc9\xa9\xa7\x31\xc2\xca\x8e\xb9\x99\xfc\xa7\x9f\xfe\xdb\xf7\x4a\xfe\x7f\xf1\xa7\xfb\xac\x37\xb3\xf5\xbe\xd0\xf6\x77\x6b\xff\xfc\x1e\xfe\xc3\xc5\xf3\xe7\x07\xfd\x9f\x2f\x2e\xfe\xc4\x7f\xf8\x43\x7e\x40\x4f\xe7\x56\xf6\xee\xc6\xfd\xde\xc7\x77\xb7\xdd\x69\xff\xd7\xcc\x07\xe4\x2f\xba\x17\xe7\x3a\x93\x8c\x21\x37\xdb\xcb\x0f\xaa\xb4\x67\x1f\x80\xeb\xba\x94\xef\x9c\x1d\x29\x4e\x3e\x7c\x78\x37\xba\xee\xff\xdb\xf5\x68\x72\x3f\x1c\x5c\x74\xdf\x0d\xa6\xc3\xfe\xf4\x34\x50\x32\xbd\xcb\x67\x53\xfd\xab\xfc\x0f\x20\x26\x86\xb6\x3e\xb9\x54\x9b\xbc\xd8\xa7\x0f\x72\xc2\x98\x04\x21\xa8\x19\x3f\xa5\xeb\xd1\x15\x85\x0a\x7c\xe4\x20\x89\x98\xb3\xc1\x4e\x79\xe7\xa6\xac\x66\xb1\x8c\x6d\xde\x28\x9a\xb3\x36\x39\x2c\x44\x84\x86\x71\x05\x68\x18\x17\x80\x86\x71\xd9\xf6\xda\x77\xce\x54\xb0\x6c\x5f\xb1\xe9\x1c\xb8\x8e\x93\x78\xde\x57\x5d\xcd\x54\x0d\x14\x13\x09\x04\x17\xbf\x47\x83\xf2\x18\xcd\xbf\x16\xf0\x06\x04\x58\x08\x4f\xe6\x3f\x55\x84\x08\xef\x44\x29\x94\x19\xfb\x52\x85\xee\x23\x33\x05\x35\xdc\x98\xa9\xaf\x4d\x4e\x11\xb5\xe2\xb9\x06\x1d\xd3\x60\x03\x8b\xdf\x12\xe1\xd7\x0f\x5f\x8b\xa0\x29\x3c\x67\xa7\xa0\x92\x25\x0c\x6c\x34\xb6\xae\x25\xdf\xa3\x5a\x5e\xdf\xf3\x27\x09\xb6\xef\x4c\xa9\xff\xfb\xf7\xde\xff\x77\xf8\xe9\x3e\x73\x7b\x55\xe8\x65\x7d\x56\xea\x6f\xf5\xd9\x79\xf7\x79\xf7\xfc\x1f\xac\x0a\x1e\x97\xff\x97\x97\xaf\x9e\x5f\x36\xe4\xff\xcb\xf3\x57\x3f\xff\x29\xff\xff\x88\x9f\x64\xf7\x25\xec\xbe\x3c\xe9\xc4\x3e\x52\xe7\x54\x88\x31\x35\x6b\x2e\x54\xad\xdf\xc8\xcb\xf3\x8b\xe7\x67\xe7\x2f\xcf\x2e\x5e\x31\x38\x00\x1b\xae\xd0\x09\x62\xdf\xca\xa1\x91\x53\x06\x83\xf6\x26\xbd\xfb\x6c\x83\xb3\xe7\x48\xf5\xfa\x00\x85\x94\xf3\x20\xde\x08\xa1\x4e\x65\x2f\x6d\x84\xca\xd0\xc0\xc7\x2e\x92\xad\xae\xb6\xba\xde\xa9\xa2\xd9\x3b\x95\x57\x95\xfe\x6a\xb0\x78\xdb\x0b\x53\xe1\x1b\x4b\x62\x56\xb6\x2c\x24\xd9\x21\x39\xa9\xb7\xd8\xca\x9e\x44\x5d\xb1\x71\x0f\x49\xd7\x8b\xbd\x87\x0b\x76\xf2\xd3\xff\x92\x1a\x4b\xe4\xc7\x3d\xe4\x6d\xba\x42\xcc\xfe\x01\xb3\xc7\x1a\x29\x9e\x3a\x49\x45\x5a\xad\x85\xbc\xa3\x0a\xaa\x23\xdd\x4d\x19\xb4\x36\x65\x54\x1c\x0f\x55\x2c\xaa\xa0\xf6\xdc\x7c\xb3\x35\x55\x48\xe3\x63\xf2\xab\x11\x95\xf0\x79\x53\x22\x93\x28\xf7\x51\x5e\xf4\xe3\x1e\x8a\x85\xb2\x80\xfd\x6d\x33\xa6\xe5\x92\xf8\x4f\x28\xeb\x30\x2b\x63\x7d\x43\x5d\x5c\xd0\xf0\x46\xbe\x27\x36\xfb\xab\xc0\x69\x29\x38\xfd\x76\x7d\x58\xcd\xf0\x09\x91\x8d\x0f\x13\xc8\x27\xf9\x29\x17\xc2\x85\xec\xb8\x00\x16\xde\xb5\xde\x83\xaf\x88\x05\x6e\x47\x9a\x0f\xde\x02\xe7\x90\xb4\xaa\xce\x2d\xa5\x2c\xa3\xea\xff\x94\xc8\xd6\x62\xb6\xc5\xca\xe7\xb2\x5e\x57\x66\xb7\x5a\xcb\x57\x6f\x23\x06\x21\xd6\xc5\xa0\x87\x6f\xa1\xb1\x93\x0a\xcc\x38\x16\x8f\xa5\x88\x74\x4c\xe4\x49\xb3\x6d\x4c\xef\x39\x5a\x06\xb4\x20\xa5\x2e\xeb\xd3\xae\xec\x24\x43\x75\xa8\x57\x35\x9c\x6d\x4f\x2b\xc8\x27\xe5\xe0\x17\xb5\xfe\x56\x5b\x4c\x59\x10\xd4\x15\x43\x5a\x63\xbf\xd1\x6c\x57\xc3\x86\x0b\x24\x53\xc0\x22\x0e\xd8\x3d\xa6\xd9\x58\x55\x6a\xbb\x06\xac\xfd\x1c\x02\x5f\xf1\xd6\x43\x2f\x84\xbf\xf7\x85\x5e\xe9\x72\x11\xba\x63\xae\x52\x63\x21\x9c\x82\x72\x25\xaf\xc9\x08\x80\xdd\x7d\x2b\x47\xbb\x7a\x66\x76\xe5\x02\xb8\x72\xaf\x88\xa9\x02\xd2\x8f\x42\x50\x1e\x3d\x3a\x1a\x2a\xf9\x7a\x94\x07\xf5\x6f\x1d\xec\x8e\xf8\x93\x22\x42\x81\x3d\x6c\x43\xa7\x38\x8d\x2f\xbf\x66\x63\x83\xbb\x44\x71\x70\x42\xf7\xcf\xad\xf0\x27\xc4\x47\x4d\x66\x5a\xaa\xaf\x86\x4e\x29\x9e\x12\x24\xce\xc3\x16\x63\x1b\xd0\x48\x1b\x25\x3e\xc2\x37\x32\x91\x93\x1e\xcf\xba\x1b\xd7\xeb\x51\x5f\x48\xb1\x4f\xde\x35\x79\xc9\x60\x43\x01\xd9\xae\x35\xc1\x16\x0b\x99\x37\x37\x1c\xf7\x3a\x5d\xa7\x15\x0a\x2d\x83\xf9\x96\xf1\xc3\x36\x18\x4f\xbe\xfb\x22\xda\x70\xd9\x23\x3a\x88\x1b\x7a\xc4\x98\x9a\x6c\xdc\x3b\xbe\x95\x83\x12\x37\x9b\x87\x6a\x6c\x38\xb0\x50\x27\xa7\x45\x25\xd2\x20\x4b\x7a\x80\xa8\xf5\x87\x5f\xa6\x8a\x9e\xc4\x1d\x28\xd4\xbc\x0d\x5b\x99\x96\x78\xc4\xc3\x7a\x43\xf9\xf0\x68\x74\x51\x42\x86\x1d\xa7\x72\x47\xfd\x6d\x0e\x6d\xfc\x1b\x5d\x69\xea\xe2\xd8\x59\xcd\xad\x14\x61\x22\x5c\x96\x00\x74\x2e\x58\x4c\xd3\xc0\xca\x8f\x39\xf7\xaa\xa4\x16\x50\x7f\xab\xab\xbc\xb4\xf9\xbc\x19\xcb\xc4\x4a\x47\x3c\xd3\x10\x69\x44\x82\x22\x82\x9e\x0f\x31\x64\xc2\x99\x8e\xba\x27\x4e\x63\x46\xc9\x16\xd1\x9b\x2e\xb7\x13\x0b\x0c\xb2\x57\xae\xe4\x46\xd5\xba\xca\x55\x91\x74\xa6\xa9\xe8\x38\x22\xa0\x1b\x00\x21\x8f\x26\x83\xb3\xde\xd6\x89\x6e\x20\x0f\x5f\xc8\x9b\xc9\xcd\x19\x20\xe8\x2a\x1b\x33\xe2\xb1\xa9\x71\xd8\x4c\x76\x20\xf6\xab\xf4\xee\xa4\x8c\xf9\xb0\xf0\x20\xb6\x58\x77\xfa\xa4\xf1\x63\xc2\x68\x84\x36\x0a\x64\x49\xda\x54\x91\x2a\xe3\x8f\x78\x34\x89\xe6\xa9\x4c\xe7\xba\x37\x3b\xc1\xb4\xfc\xa8\x5d\xe2\x31\x68\x53\xee\xc7\xb7\x5e\x54\x84\xc4\xf4\x95\xa9\xb0\xe9\x06\x0a\xdb\xa8\x70\x8e\x41\xcc\x43\x8f\x90\x54\x75\xc0\x35\x80\x1c\x0c\x94\x49\x40\xbe\x5c\x55\xd8\xf0\x09\xfc\x70\xaa\xda\x93\x0c\x42\x4e\x39\xe2\x18\x64\xb2\x00\x4f\x7f\x1f\x77\x09\x74\x41\xf0\xee\x53\xc1\xdb\x7c\x0b\x2c\xe9\x5d\xef\x2d\xe8\x07\xa6\xd3\x02\x06\x9f\x72\x05\x05\x20\xb6\x36\x95\x5a\x69\xb1\xd1\x8b\x7c\xb7\x91\x27\x9d\x3b\xfc\x50\xe7\x34\x3b\xfa\xaa\xbe\x88\x20\xae\xb5\x0f\xe2\x54\xb8\x45\x83\x50\xc3\x83\x91\x7b\xad\xaa\x00\xbf\xeb\x5b\x6c\xe0\xa0\x6c\x0c\xe4\xa0\xe6\xee\x12\x34\x6b\x2a\xc3\x9b\x08\x7e\x13\xf7\xab\x3b\x2e\xb5\xf1\xd7\x83\xea\x25\xe9\x0f\xc4\xe4\x19\x12\xec\x08\xbb\xc0\xfb\x9c\x87\x3e\xcd\xd6\x17\x3b\x39\x6c\xae\x53\x7e\x8f\x72\x42\x59\xa2\xd2\x19\x64\x06\x3e\xcd\xe0\x40\x96\x5a\x2f\x08\x23\xc5\x36\x72\x8a\x3e\x75\xe0\x54\x0b\x28\xeb\x80\xcc\x89\x56\x4b\x57\x08\x68\xd5\x4e\xea\x2e\x0e\xa4\x1f\xac\x21\x94\x72\xfa\xfe\x95\x12\x0f\x73\x5e\x2d\xce\xb0\xe7\xc3\xa3\x28\x54\xfb\xc3\xa4\x1d\xb6\x00\x2b\xeb\xe5\x14\x3d\x5e\xbe\x8c\x32\x20\x9e\x1e\x81\x92\x47\xc0\xaf\x0a\x5e\x81\x2f\x9d\x98\xec\x37\x1b\xed\x44\xa7\x2a\x68\x70\x2c\xbb\x62\xd9\xeb\xb6\xfe\x7e\x6b\xeb\x4a\xab\x4d\xc2\xa9\x6d\xdb\x6d\x05\x38\xe3\xb5\x91\x1f\x43\x7c\x1d\x14\x28\xd2\x2a\x81\x8d\x8e\x1d\x03\x0d\x36\x02\x71\x70\xc5\xe5\x89\x92\x9d\x3b\x55\xcf\xd7\x1d\xdf\x69\x0c\x54\x17\xf9\x3c\xaf\x83\x7d\xc0\xfc\x05\xdb\xad\xcf\xa3\x09\xf8\x16\x0a\xdb\x58\x71\xc3\xaf\x5b\x6d\x91\xd4\x40\xf4\x35\x98\xde\xf4\xe3\x03\xeb\x06\xa0\xec\x5b\x50\x4f\xde\x84\x2f\xf5\xca\x23\x7f\x52\x95\x5a\xcc\xed\x0a\x64\xa0\xa1\x87\x78\x19\x1b\xc0\x1e\x5b\xda\x3d\x80\xeb\x40\x86\xbb\xa2\x08\x9d\x20\x90\x68\x45\x77\xf2\xd9\x1d\xb4\xb4\xe8\xda\xc9\x9a\xeb\x5d\xbc\x75\xb0\x2b\x83\x40\xb3\xeb\x1d\x32\x0c\xf1\x2d\x9d\xf3\xd3\x58\xe7\x88\xe2\x36\x06\xfc\x52\xa2\xa9\x65\x12\x05\x63\xaa\xef\xe9\x97\xa6\x0b\x00\x5d\x96\x04\x0d\x1f\x22\x60\x88\x9b\x14\xbb\xc9\x1e\x6d\xca\x5f\x6e\xfa\xeb\xd0\xfd\xf5\xae\x32\x4e\x90\x00\x35\x51\x99\x54\xa7\x46\x7e\x2d\xbd\x13\xdf\x89\x0b\x34\x21\x98\x03\xa8\x91\xbf\x8b\x9c\x8f\xbc\x0c\xce\xc7\xa5\x97\x83\x2f\x7d\x1d\x03\x4f\x45\x4e\x76\xa5\xd5\x35\x26\x7f\xa2\x5d\x3e\xf2\xfd\xe8\xd9\x78\x4e\x0d\xb0\x6d\xe5\xcb\x5a\xeb\x12\xa5\x2a\xb2\x07\xe9\x42\x6d\x6d\x4c\x7a\xcb\xeb\xf8\x71\x4f\x72\xa7\x29\x5a\xd9\xc7\x89\xf8\x66\x13\x34\xb2\xd7\x5d\x79\xa7\xac\x3d\x9b\xe2\x5c\xc8\xde\x3b\xb8\xb6\xa9\x6e\x4d\xad\xd7\x94\xf2\x89\xf2\x8c\x36\x3e\x1f\xc6\x4f\x03\x26\xfe\xb1\x09\x2c\xf1\x28\x5e\xda\xc5\x79\x57\x4e\xa3\xfa\x04\xf7\x3b\xb8\x7e\x3c\x3c\x21\x5c\x34\xb7\x14\xb8\x9b\xdb\xd9\xa8\xb8\x50\x1e\xa2\x1b\xad\xb5\x21\xe9\xb6\x1d\x18\x42\x04\x23\x0f\x4d\xdb\x5c\x2d\x22\x4a\x53\x36\x0c\x49\xac\x42\x76\xb2\x3a\x70\x5c\xb5\xd4\x8e\xe4\x35\x60\xb1\x08\xe8\xcd\xcc\xeb\x1c\x6b\x5e\x19\xa2\x21\xe6\x9a\x2b\xf2\x9a\xdb\x32\x30\xd9\x7e\x02\x71\x0d\xd0\x6a\x0b\x3d\x2f\x9c\x3f\x63\xaa\xbd\xf8\xcf\xdd\x62\x85\x4c\x1b\x73\x72\x2d\x89\x36\x01\x5b\x22\x89\x55\xa6\x32\xd6\x9e\xe1\x6f\x4e\x9d\xaf\xac\x57\xbe\x47\x80\x01\xd1\x44\x74\x84\xbe\x43\x63\xcf\x28\x6a\x35\xe1\x05\xa7\x35\x2b\x6d\x3b\x06\xe2\x74\x01\x2a\x2a\x6a\xee\x8b\x0a\x46\xc0\x1f\x05\x95\x9b\xf0\x30\x60\x20\x21\x39\x15\x41\xc8\xc6\x94\x63\x3a\x21\xa1\x37\x56\x8b\x87\xb5\x69\xa4\xc3\xf9\xa9\x9e\x86\xcd\xab\xde\x14\xfb\x24\xa9\x6a\x4c\x6b\x33\x43\x44\x9c\xf3\x0f\xe1\x55\x9a\xd6\xbb\x8d\xaa\x37\xd0\x51\x81\x7e\x8e\x6a\x57\x42\x5e\xd9\x1d\x05\x2c\x09\x49\xb2\x06\xd1\x8b\xcd\x0a\xbe\x17\x17\x5d\x79\x0b\x70\x1a\xac\xf4\xb9\x1f\x05\xc5\x4e\xab\x58\x04\x63\x9a\x85\x70\x93\xb9\x23\x11\xb3\x99\x5c\x68\x9b\xaf\xe0\xba\xa0\x53\xb1\xc8\xad\x33\xd0\x77\xb9\x5d\xbb\xa9\xb2\x7c\x46\x81\x2d\x4f\x3a\x38\x19\x9e\x44\xe7\xb4\x2b\xef\xf1\x9a\x0c\xbc\x5a\x2e\xf6\xa2\xd2\x1b\x43\x14\x23\xc6\x77\x87\x24\x0e\x40\xb2\xfb\x1c\x6e\x4b\xc6\x06\xd5\x2d\x1e\x0b\x51\x71\x19\x7f\xb9\x4f\xbf\x4a\x4b\x77\xd9\x95\x43\x23\x3f\x51\x6f\x90\xf0\x91\x20\x4c\x63\xa1\xdf\xd0\x51\xf6\x2c\xb7\x9d\x40\x50\xca\xad\x44\x18\x02\x98\x69\xcf\xd0\x6a\xa1\x24\x14\x78\x78\x45\x5e\x77\x65\xcb\xf1\xa8\x29\x63\x1f\xa9\xf4\x42\x3d\x10\x3b\x8a\x7f\x09\xa0\xe2\xe7\xfb\x86\x25\x2d\x0b\x6a\xfa\xa5\x2c\x19\x4f\x82\xb3\x58\x79\xed\x5c\x8f\x8d\xae\xe6\x6b\x55\x32\xa3\x6e\x26\x97\x79\x0d\x74\xd2\xa8\xd4\x23\xc4\x54\xc2\x1b\x23\x73\xa9\x3c\x8b\xa5\x0b\xad\xcd\xf3\xae\xbc\x0d\x68\x25\x00\x94\xa2\x38\x18\xf0\x03\x6f\x96\x97\x60\x8f\x7d\xf5\x6d\xc6\x6e\x2f\xa2\x37\x8d\x25\x4b\xa8\xeb\xaa\x0d\xd6\xeb\x35\xca\xbb\x62\x6a\x21\xc6\x2a\x63\xc0\x33\x0f\x7d\x26\xc0\xa0\x54\x05\xe0\xaf\x40\x52\xca\xfd\xef\x03\xfa\x72\x1a\x33\x0c\xc4\x05\x4b\x78\x64\x18\xff\x2c\x13\xb5\xa9\xea\x98\x9c\xb7\xd4\x2b\xe0\xea\x98\xeb\xd3\xac\x81\x8e\x06\x68\x0a\xd8\xda\x04\x41\x9b\x68\x43\xbf\x94\xfa\x01\xd0\x37\xa3\x5a\x1c\xc0\xf2\x93\x6a\x66\x76\x18\x09\xc2\x22\x76\x8f\x17\x82\x75\xdc\x38\x4d\xda\x94\x17\x5d\x39\x71\xaf\x1f\x76\x62\xad\x13\xae\xa6\x2a\x2e\x2c\xf3\x23\xa5\x85\x68\x4d\x27\x81\x65\xa6\xc0\x3a\x78\x98\x4a\x3c\xe2\xe1\x78\xa8\xf8\x37\x2a\x87\xa5\x6a\xaa\x6b\xa8\xa3\x17\x49\xe1\x1b\xd6\xbc\xf9\x62\x36\xae\xe1\xcf\xcb\xb8\x86\xbf\xb5\x9e\x0d\x26\x02\x61\xf2\xb8\xb2\x0d\x57\xe3\x65\x02\x88\x2c\x44\xa7\x55\xd6\x75\x12\xf4\x49\x14\x7f\x04\xc3\x95\x73\x45\x76\xa3\x19\xbf\xd2\x5b\x63\x73\x50\xa1\xaa\x96\xff\xb2\xae\xeb\xad\x7d\xf3\xec\xd9\xca\xfd\x2a\x37\x3b\x0b\x65\x4b\x89\x98\x7c\xf6\xaf\x4f\xb4\x6e\xbb\x30\xcd\x43\x37\xb4\xd3\xa6\x25\x5a\x42\x1c\xf8\x2e\x27\x39\x00\x3b\x88\x03\x14\x98\x16\x27\x92\x42\xea\x50\xbd\x89\x30\x97\x19\x54\xb4\x55\xbb\x79\x68\x88\xb0\x48\xfd\x25\xe2\x7e\x6d\xb4\x00\x8e\xf5\x82\xa3\x4c\x81\x06\x01\xbd\x60\xc0\x61\x74\x26\x10\xa0\xb8\xa6\x86\xe0\xe4\x15\xd8\x60\x8d\x27\xee\x45\x2d\xde\xbc\x93\xfc\x34\x8e\xe2\x23\xa0\xa6\x80\xce\xaa\xc2\xe3\x02\xef\x19\xfe\x73\xc2\xd1\x5b\x94\xf7\x27\x09\x0d\xb5\x13\x71\x7e\xf4\xa4\x52\x0e\xbb\x4c\xdc\xc2\x9c\xe2\x7b\x02\x13\x5c\xe2\x8a\x42\x10\x31\x2f\xe5\x6c\x97\x17\x0b\xa6\xa7\x3b\x49\xfc\xb1\x53\x06\x04\x45\xe4\x95\x86\xf3\x7e\x82\xfc\xe9\x6a\xb3\x85\xb8\x10\x8f\x0e\xac\x9f\xc1\x2f\x43\x88\x51\x5d\x05\x6c\x0f\x91\xd7\xb6\xa1\x56\x4f\xbb\x8f\x07\x65\x36\x6a\xbe\xce\x4b\x7d\x56\x69\xb5\x08\x17\xa4\x13\x4f\x87\xaf\x01\x0b\x5b\xd8\xbe\x24\xa4\x2d\x44\x27\xfe\x77\x27\x05\x46\x76\xc7\x13\x39\xc3\xd6\xf9\x96\x71\x73\xc1\xbc\x71\x9b\xca\x8c\xc6\x80\xf3\xbb\x50\xee\x90\x89\xdc\xca\x19\x38\x68\xa6\xcc\x8e\x75\x50\x64\x84\x40\x6d\xaa\x8d\xa5\xff\x5d\xc4\x38\xe5\x08\x57\x53\x14\x4e\x74\x32\x42\x21\xbd\x01\x59\x48\x3c\x13\x2a\xd3\x48\x0d\x26\x46\xc9\xc5\xbe\xd1\x88\x76\xb3\xc2\xb6\xb0\x24\xe3\xf1\x06\xae\xd5\x47\x77\x10\x7a\xab\x55\xa5\xd1\xc2\xe6\xeb\x03\x66\x9a\x4f\x56\x06\xbf\x4a\x78\xd8\x37\x3a\xb0\x79\x50\x68\xce\xa7\x40\x2a\x37\x6f\xf8\x40\xd3\x0e\x44\x2f\xf5\xb7\xad\x9e\xb3\x7a\xf5\x3a\x44\x70\x6c\x04\x24\x14\x86\xb0\x9d\x2c\xb4\x48\x30\x05\x3c\xbf\xc1\x91\x82\x3d\xf3\xb6\x8f\x97\x74\x26\xaa\xdf\xc8\x22\x8c\xef\x8a\xca\x62\xa8\xe6\x24\x41\x1a\x32\x1b\x6d\x4a\x2d\x74\xe1\x49\x51\x9f\xb6\xb2\x78\xd2\x22\x55\xe7\x0f\x1a\x9a\x17\x84\x06\xe5\xc6\x05\x54\x8c\x30\x5d\xdb\x90\x77\x34\x14\x87\x0b\x7c\x66\xad\x50\xd6\x7a\x24\xf0\x9f\x96\x95\xd6\x3f\xb1\xcf\x9f\x10\xbf\xc9\x1b\xb3\x2b\x17\x5c\x8c\xd4\x79\x7f\x77\x1b\x8e\x70\xa3\xb9\xf9\xfd\xf0\xde\xa7\x3c\xd3\x9a\x57\x9f\x42\x19\xde\xcb\xde\x72\xa9\x2b\x23\xda\x3f\xe8\x1e\x31\xe8\x3c\xeb\x7c\xd4\xee\x3f\xfb\x0e\xee\x8f\xaf\xf2\x4f\x81\x6b\x13\xd8\x5a\x04\x83\x42\x02\x51\x36\xf2\x5a\xd2\x1b\xb2\xf3\xd9\xec\x3a\xcf\xdc\x7f\xab\xa7\x8f\x2e\x0e\x41\x71\x31\x43\xdc\x70\xff\xc3\x63\x7a\xe9\xec\x3c\xd2\x2d\xa0\x6a\x24\x14\x02\x4f\x43\xba\x95\x6d\x48\xb7\xe0\x19\xc7\xcf\xe9\x3a\xe9\x04\x1f\xe0\x4d\x4a\x40\x6d\xf1\x0c\x57\x6c\x8e\x90\xff\xca\x56\x51\x32\xd2\x6f\x85\xad\x05\x14\x07\xa7\x28\x44\x02\x60\xfb\x77\x40\xd6\xc2\xac\x84\x07\xae\xed\x34\x8b\x03\xfc\x71\x2c\x18\x71\x85\xb1\x89\xd0\x23\x86\xbb\x18\x17\x20\xb8\x37\xfa\x08\xa8\x9c\x0f\xe8\x6d\x63\x64\x79\xc7\x20\x1c\xa4\x9f\x59\x29\xe7\x91\x1b\x0e\xc6\x38\xc2\x01\x65\xe8\x93\x40\x70\xc1\x6a\x50\x56\x41\x86\x82\x65\xc5\x1e\x06\xcd\x06\x15\x22\x23\x70\x84\x11\xa1\x07\x81\x52\x5b\x64\x4a\xcf\x21\x3d\xc4\x79\xbe\x84\x37\x36\x48\x6a\xb7\x16\x4d\xb1\xda\x09\x18\xcf\x2a\xfc\xb6\xc5\x08\xa2\xa4\x0c\xeb\x79\xe1\x07\xdc\x27\x5a\xaa\x26\x0c\x24\xc2\x31\x69\x51\x59\x03\x19\x05\xa2\x42\xf0\xef\x30\x16\xd6\x89\x2c\x96\x4e\x04\xb3\x1f\x52\x4c\x41\x42\x93\x53\x9e\xb2\x1e\x74\xe2\x08\xa8\x1f\xc1\xa7\xdc\xac\xfc\x69\xb4\xd5\x0c\xe1\xe7\x65\x59\xf4\x3b\x2a\x14\x27\x26\xf3\x4e\x62\xe3\x34\xd4\x32\xcf\xc2\x67\xb1\xc1\xc4\x22\x8a\x29\xbd\xd5\xe5\xc2\x33\xbb\x27\x8c\x19\xd1\x0a\xc3\x87\x2d\x77\x9b\x3b\xe3\x83\x58\xa8\x40\x49\xd5\xba\x64\x34\x40\x5d\xae\x9d\xed\xb4\x39\xcc\x56\x08\x7f\x98\x9e\x61\x37\xe9\xae\x04\x98\xf9\x22\x9f\x55\x40\xa2\xe8\xf3\x5f\xf4\x1b\x68\x16\x47\x9b\x13\x2c\x20\x53\x7a\x24\xd0\x3c\xc0\xb0\xb3\x21\xf9\xb4\x64\x1f\x2c\x55\xd8\x88\xce\xa3\xa8\xf3\xb4\x7c\x01\x6b\x3e\x25\xdb\x12\x80\x79\xf3\x47\x55\x2f\x76\x9f\x2d\xf4\xb6\xd2\x73\x55\xeb\xc5\xff\x73\xfb\xfe\xee\xf6\xec\xb2\x7b\xf1\x3f\xfe\xb1\x05\x80\x8f\xd7\xff\xbd\xba\x7c\xf1\xea\xa0\xfe\xef\xe2\xf2\xd5\x9f\xf5\x7f\x7f\xc4\x8f\x33\x36\x6e\xfb\x93\x49\x7f\x2c\xdf\xf7\x87\xfd\x71\xef\xf6\xa0\x2b\x39\xf0\x81\x5e\x64\xf2\x46\xcf\xaa\x9d\xbb\x45\x17\xaf\x5f\xbf\x3e\x5a\x30\xfd\xfa\xa8\x79\x94\x01\x6b\x9f\x10\x2f\x2f\xe4\x4d\xa5\xca\x2f\x45\x5e\xca\x49\x5d\x69\x5d\x67\xf2\x26\x5f\xd6\x6b\x79\x53\x18\x53\x65\xf2\x9d\xb1\xb5\xfb\xf8\xc7\x9e\x3c\xbf\xbc\xb8\x38\x3f\xbb\x78\x7e\x7e\x21\xef\x27\x3d\x21\xfa\x5f\x75\x05\x96\x1d\xd7\x42\xd7\x8f\xd4\x33\x1f\xab\xbc\x26\x89\x2c\xb8\xaa\x19\x6b\x9f\x00\x87\x11\xc3\xa0\x81\x86\xa2\x30\x0f\x60\x6d\xfe\x6f\x2e\x96\x0f\x49\x56\x9f\x09\x6a\x58\x79\xb7\xda\x5a\x5d\x41\x35\x8c\x1c\xf8\x34\xed\xae\xac\x2d\x73\xca\xd8\x1d\xe4\x76\x4d\x15\x1b\x86\xb7\x24\xa2\x9a\x9d\x5a\x3c\xfa\x65\x26\xd7\x68\x87\xaf\x03\xb0\x09\x85\x3f\x2f\xbb\x17\xdd\xff\x23\xc4\x5d\xa5\xd5\x66\x56\x68\x0c\xd0\xf8\x0e\x50\x90\x36\xc6\xd6\x81\x1a\x01\x2b\x1c\x89\xf4\xdc\x19\x77\x60\x9f\x3f\xa8\x3d\x62\x80\x39\x23\x60\x81\x88\x7c\x60\x83\x20\xb3\x01\xc0\x54\x3a\xf1\x24\xdf\xb1\xc5\x63\xeb\xec\x3b\x86\xad\x25\x70\x17\xce\x20\x1b\xb1\xda\x29\x28\xae\xd1\xed\xcf\x92\xd1\xb3\xc0\x18\xe1\x49\x9f\x9d\x71\x7c\x86\xd1\x2d\x44\x4c\xf5\x00\x9f\x5d\x12\x2b\x7e\x8e\xa4\x1a\x95\x2f\x68\x0c\x95\x9f\xd1\x06\xb5\x4e\x38\x8b\x81\x02\xb0\x88\x02\x03\x7b\xc5\x5e\x84\x98\x74\x58\x4a\x62\x3c\xb4\x67\x67\xf5\x7e\x4b\x3e\x3c\x6a\x9b\xdc\xfd\x92\x36\xf8\xd8\x95\x80\x95\xc5\xe0\x01\x53\x63\x3b\x6f\x65\xa1\xe7\x39\x42\x14\x00\xcb\x64\x8d\x41\xdf\xb9\x2a\xe9\xdf\xb2\x36\x06\x0f\xed\x83\x5b\x8e\xd5\x4a\xdb\x1a\x90\x4b\xf1\x64\xd6\xeb\xbc\xfc\x22\xe7\xaa\xd2\xcb\x1d\x10\x36\x41\xac\x8f\xed\xd5\xf8\x0a\xb0\xdf\xc1\xd0\x0b\xbc\x28\xa2\xe1\x9e\xd0\xc1\x9f\xe9\x1a\x08\x64\x6a\xa7\x1e\x57\x7b\x3f\xc1\xd2\xa7\x6c\xc8\x10\x42\x50\x12\xf0\xc3\x43\xe5\xd5\xb6\x50\x84\x9a\x2d\x67\xba\x30\x0f\x5d\xca\xf7\x3d\xc0\x1a\x2b\xb0\x9c\x92\x2d\xcf\xdc\x9f\x30\x14\xe4\xf4\x28\x35\x71\xf2\x89\x81\xa8\x37\xe1\xd5\x6c\xab\x7c\xae\xbb\x62\xb4\x3b\xb6\xad\xf6\xe0\xcc\xc7\x47\x09\x6b\x74\x30\x3c\x0a\x17\x1c\x1f\x21\x12\x97\x36\x92\x22\xc9\x2c\xe5\x09\x1d\xd9\x6a\xa5\x03\x13\x26\x17\xc2\xe6\x50\x39\x23\x1e\x72\xbb\x3e\x7d\x1b\x1e\x45\x19\xa0\x24\xfe\x67\x2a\xd8\xe2\x95\xae\x41\x04\x61\xc9\xcd\x83\x2a\xdd\x3f\xc3\x57\x85\xfb\x0c\x5d\x90\x3a\x66\xdf\x62\x52\xd2\x6d\xee\x0c\x73\x4c\xed\x41\x20\x5c\x3f\xe0\x84\xa9\x47\xc6\xbe\xf5\xf8\x49\x70\x66\xf0\x82\x72\x8c\x94\x27\xe8\x9e\xb2\x00\xb7\x0f\xfb\x3f\xcb\x95\xc5\xdc\x13\x91\xbd\xe3\xed\x45\x5f\x0f\xf6\x09\xea\x52\x78\x5d\x93\x8a\x37\x18\x73\x69\xaa\x59\x1e\x49\x67\x53\x81\xb5\xb3\xd0\x25\x08\x1d\x7a\x10\x67\xcc\xc0\x13\x53\xf6\x0b\xfe\xc9\xb8\x7d\xaa\x34\x17\x33\xfa\xcf\x31\x85\x7b\x52\xe8\xe7\xa3\x39\xa0\x15\x74\x05\x65\xbf\x1e\xb8\x38\x2f\x80\x62\x05\xf6\xc9\x8d\x4d\xab\xdc\xb6\xcb\x04\xe1\xe2\x0d\x47\xfa\x28\x41\x84\x02\x08\xc9\x4d\x1c\x6a\x7b\x64\x28\x19\x0d\x15\x1c\xc7\x55\xa5\xea\x1c\x5e\x76\x69\x2a\x41\xe5\x0f\x1e\xde\x70\x95\x33\x17\x7e\x80\xfc\x03\x58\xd1\x90\x58\xa4\x10\xa2\x5c\xb9\x73\xbb\x37\xbb\x80\x60\x29\x1a\xa7\xbb\x5e\xeb\x7d\x86\x52\x83\x4f\x5e\x74\xda\x1a\x81\x68\x0f\xbf\x5a\xe4\xe5\x17\x11\x41\x1a\xf9\xec\xb4\x7f\x15\x3f\x5b\x8a\x77\x86\xc6\x75\x83\x86\x33\x30\x1d\x71\xe5\x4b\x78\x93\xa4\x16\x15\x0b\xb4\x2b\xed\x1e\xe7\xfe\xbd\x39\x78\x10\x25\xaf\xc9\x64\x26\xc4\x65\x06\xa5\xf4\x9f\x29\x17\xee\xe5\x20\xb0\x89\x6a\xbc\x2b\x7b\xe5\x22\xcc\xd1\x52\x41\xf8\x86\x4f\x35\xa4\xfd\x61\x22\x7a\x2f\x00\x88\x16\x91\x0b\xe8\x74\x09\xf1\x49\xb7\x1d\x77\x5f\x46\xf9\x60\xce\x6c\xad\xb7\x72\xa3\xeb\xb5\x59\xbc\x91\x27\x17\xa7\x6e\x3b\x42\xf0\x2a\x5e\x2b\x10\xf5\x27\x97\xf0\x09\x2c\x80\xc1\x63\x1f\x6b\x27\xac\xfb\x5b\x41\x05\x03\x6c\x00\x04\x1c\xd2\x14\xaf\x1b\x3d\x13\x8b\xb8\x24\x11\xdc\x9f\x08\xba\x96\x1e\x99\xde\x57\x48\xf6\x45\xd7\x0f\x2e\x2d\x48\x97\x38\xef\x01\xf0\xfb\x01\x4e\x0c\x3a\xdf\xd1\x1a\x12\x9c\x81\xf4\xbd\x7d\x20\x54\xf8\x59\xb2\x57\x58\xe3\x6b\xe4\x78\x4f\x72\x1b\x9a\xca\xa8\x28\x91\xc3\x7d\xb0\x5f\x5b\x65\x39\x54\xdb\x38\xea\x94\xb1\xa2\x5d\x71\xe7\xdc\x9f\x16\x10\xd3\x68\xa1\x89\xda\x03\x3f\xab\x22\x80\xeb\xc5\x85\xce\xfe\xaf\xa8\x60\x7f\xb2\xb2\xd2\xdb\x1d\x45\x40\x21\x37\x88\xf5\xda\x94\x87\xc2\x89\x6e\x2b\x33\x2b\x34\x07\x25\x36\xb0\x99\x10\x94\xa8\xb1\x69\x04\x3e\x04\x37\xc3\x1d\x93\x9b\x1c\xea\xb0\xb3\xd8\x2a\xc0\xbe\x0c\x4c\x77\x22\xf6\x01\x2c\xf5\xba\xd2\x2a\x82\x57\xca\x6d\x0d\x36\x1d\x65\xcb\xdc\x8a\x0a\x12\xd3\x5d\xf9\xc9\xdd\x38\xbb\x6e\x51\x56\xc8\x9c\x05\xe0\xe1\xaa\x84\xea\x63\x98\x7b\xfe\x55\x43\x0d\x0c\x4a\x43\xb8\x72\x60\x05\x11\x7d\x5d\xa4\x03\x60\xfa\x33\x26\xb2\x53\x41\x82\x7e\x8d\xf0\xf4\xc0\xa5\xe7\x90\xd1\xda\x14\x0b\x5d\x75\x9d\x65\x09\x09\x35\x54\xce\x79\x69\x73\x5b\xc7\x55\x1b\x75\x0c\x5a\xc7\xa8\xc2\x94\xb6\x49\x0d\x65\xc1\x87\x24\x46\x54\x84\x05\xa9\xa3\x7a\xc6\x5d\x51\x34\x34\x7e\x94\xd1\x20\xa0\xbd\xa8\xc2\xf7\xa3\xb3\x73\x9d\x39\x1a\x6c\x88\x90\x43\x05\x73\xce\x1b\x67\x14\x50\xfc\xaa\x23\x78\xb9\x60\x07\x0d\xef\x8f\x45\x60\xe5\xa1\x45\x09\xf6\xfb\xa3\x56\xa5\x88\xe1\xa7\x48\x29\x45\xe6\x64\x34\x29\x8a\x8b\xfc\x6d\x97\xd7\xfa\x10\x48\x31\x4c\xf1\xe8\xf4\x3e\xe9\x80\xd9\x10\x63\x23\xf2\x63\xfd\xb3\xb0\xd0\x11\x70\xc4\x0d\x39\x53\x20\xf2\xb1\x0e\xc7\x9d\xdc\xf8\xa3\xb5\x81\x9c\x7d\x62\x49\xb0\x05\xa7\xe2\xfe\x5b\x37\x84\x07\x1d\x3b\xd4\x7a\x80\x06\x8a\x76\xb2\xa9\x30\x46\x28\x15\xda\xfe\x0b\xe1\x3f\x5d\xb7\x73\xbb\xd6\x0f\x06\x1e\xe1\xe4\x62\xb1\x47\xb3\x11\x07\x20\xee\x4c\xec\x25\xcd\xa4\x12\x51\xd6\x87\x63\xab\x2c\x09\xbc\xcc\x9a\xb6\x98\xbe\xcd\xc8\x7c\xcd\x07\x5e\xe0\x12\x59\x6e\x01\xc1\x85\x8a\x91\x54\x3d\xf5\x7a\x98\xf7\xd2\x7d\xc1\xfd\xdf\xbc\xca\xa1\x58\x9e\xcd\xc7\x85\xd9\xc0\x65\x7a\xfc\xdc\x48\x7e\x26\x84\x8d\x0b\xf5\x2d\x8c\xb3\x04\xfc\x58\x9a\x04\xd4\xb9\xb7\xea\x68\xd4\x62\x73\xb4\x1c\xa2\x13\x81\x90\x1f\xf0\xec\xce\xb1\x87\x73\x13\x43\x8e\x8d\x41\x30\x55\x38\x2b\xa4\x52\xdc\x18\x4e\xc0\xfc\x64\x83\x1b\x87\x29\xd0\xef\x2e\xab\x73\x8d\x05\xb8\xc6\x64\x39\x70\x75\x67\x6a\x5a\xfb\x04\x2f\x3e\x1c\xe5\xa4\x54\x8b\xaf\xaa\xac\xd5\x4a\x4b\x77\x7b\x41\x16\x6a\xe8\x27\x3e\x3c\xa0\x64\x21\x2e\x72\xeb\xbf\x84\xae\x00\xaa\x1b\x65\x0d\xf8\x1f\x8c\x05\xf4\x9d\xcb\x45\x81\xbb\x32\x72\xf1\xa2\xfa\xf0\xc8\xb7\xe4\x55\xe6\x97\x13\xd1\xd3\xf3\xd2\x5f\x45\x72\x2d\xe5\x3c\xaf\xe6\xbb\x0d\xc2\xbd\xd8\xa6\x5d\x69\x4a\x59\x41\xad\xde\x7c\xae\xa8\x00\x09\xd5\x32\xd1\xf2\x28\x3f\x0c\x9b\xe0\xba\x9c\x9b\x5d\xa5\xd0\x41\x10\x0f\x6e\x02\x11\x1e\xf7\x0e\xbb\x5f\x54\x43\x20\xec\x83\xda\xcc\x6b\xac\x13\xd4\x98\x3d\x3d\x5b\xaa\x39\x22\x2a\x42\x30\xb5\xeb\xac\x0a\x35\x5f\xe7\xfa\x2b\x4a\x99\xec\x50\x30\x84\xba\x7d\x8c\xa0\xb0\xa7\x18\x1f\x4c\xd9\x83\x53\x2d\x96\x15\x31\x97\x20\x81\xb1\x65\x15\x17\x9b\x17\x78\xfe\x6a\xa6\x90\xf9\x4f\x33\x93\x8a\xe9\x1d\x31\x6e\xcb\x53\x10\xd1\xce\x0c\x08\x87\x15\xbd\x51\x6f\xcb\x14\x79\x5d\x63\xfa\x71\xe5\x5e\x7f\xb6\x47\x14\x15\x46\x56\x8a\x9f\x2b\xc8\xdf\x0c\x27\xd2\xdd\x77\x58\xa9\xe8\xd4\x3c\x7a\x85\xbb\x42\x0c\x4a\x2e\xb9\x56\xd6\x89\xf8\xd4\xa0\x03\x3e\x92\xd8\x79\xf6\xc6\x53\x79\xb8\xb0\x02\x99\xb1\xdc\xc6\x30\x9f\x15\xc5\x80\xcc\x52\x6e\xb5\xd9\x16\x3a\x8c\x59\x80\x4b\x3a\x33\x8b\xfd\x81\xd3\x0a\x04\x90\xc2\x9f\xb1\xc3\x19\xb1\x5a\xbb\xf2\x81\xa9\xb6\xe9\x10\x51\x97\x15\x70\x29\x40\x48\xa5\x93\x70\xc3\x60\x97\x9d\x1b\xcc\xdd\x64\x6c\x1d\xb2\x7b\x5b\xeb\x0d\x90\x9c\x01\xc1\xa8\x42\x29\xf9\x55\x55\xb9\x2a\xb1\x7e\xda\x7d\xe3\xd9\x6d\x5e\xee\xbe\x1d\x7c\xaf\x2b\x44\xaf\xa8\xd7\x50\xbf\xfc\xdd\x0d\x70\x5b\x0e\xc2\x83\xc4\x56\xa4\x11\xc0\x3a\xfa\x49\x90\xf0\xca\xbc\xa0\x03\x5e\x9b\xe0\x3a\xc1\xe7\x28\x9b\x41\x7a\x8e\x13\x20\xb1\xb2\x03\xe0\x56\x5a\xac\xb5\xb2\x71\x24\xc1\x03\xc9\x41\x99\x96\xfb\xb4\x82\xb2\xdf\x6a\x47\x05\x2f\x3c\x2e\xeb\x43\xb6\x9a\x45\x33\xb8\x18\x4c\x7b\x4c\x30\x40\x33\x1b\x75\x19\x00\xff\x68\xd2\xdb\xe4\xc1\x18\x62\xe4\x4f\x04\x09\x8d\xdb\x1b\xb0\x44\xa1\x2b\xef\x94\xb3\xfe\xc1\x66\xad\x9d\x1d\x46\xe7\x01\x6a\xbd\xc9\x12\x99\x43\x14\xe8\x41\x83\xd6\xef\x40\x36\x83\xcb\x2d\x62\xa3\xae\x83\x59\x78\xfa\x04\xbc\xe2\xce\xd2\x15\xe6\x8f\x70\x79\x44\xb5\xd1\x51\xd9\x05\xf2\x92\x60\x85\x84\xf0\x56\x4f\x6c\x46\x38\xb1\x8d\xbf\x04\xec\xb3\xc8\x7e\x64\x13\xa0\xe9\x3e\xe6\xa5\xc0\x86\x38\x5c\x72\xb7\x7a\xfd\xf1\xc7\x89\xec\x0d\xaf\xe5\xd5\x68\x78\x3d\x98\x0e\x46\xc3\x89\xbc\x01\xec\xc2\xbb\xcf\x00\x67\x78\x3d\x98\x20\x0e\xe2\x00\xc0\x2a\xaf\xe5\xc7\xd1\xf5\xe0\x66\x70\x05\x38\x81\x42\x9c\xa7\x38\x67\xb2\xe7\x9b\xec\x22\x4b\x0f\x80\x87\x59\x72\x44\xa1\x04\x94\x06\xb4\xe7\x22\x30\xba\x62\xdd\x09\x77\x9b\x42\xb2\xde\x9b\xa6\xc1\xab\x44\x53\x3c\x8c\x83\x8e\x4d\xfe\x5f\x7a\x21\xb0\x37\xc7\xaa\x3d\xc5\xb1\x5b\x98\xdb\x8e\xe2\xa8\x27\x77\xa8\x19\x00\x3c\xc1\x30\xb6\x82\xd4\x7b\x03\x23\x80\xe8\x1f\x49\xe7\x21\x6c\xe9\x62\x41\xbc\xbe\xca\x8a\xce\xde\xec\x3a\xee\xca\xca\x8e\x3f\x1d\x9c\x4d\x9c\x1b\x60\xc6\xa1\x13\xee\xd7\x8a\x89\x70\x2c\x7b\xb7\x0b\x55\x2b\x6e\xce\x5f\x08\x6b\xa8\xb9\x08\xbd\x86\xaf\xba\x24\x78\xd9\xc4\xf6\x3c\xa4\x25\xb1\xf2\x04\x17\x1b\xdc\x08\xb3\xa1\x2e\x43\x6c\x1a\x8d\x9e\x08\x8f\x03\x16\x49\x48\xdc\x69\x0f\xd4\x6d\xe9\xe2\x75\xe8\x1e\x76\x32\x0c\x65\x66\x51\xa5\x84\x47\x9b\x6e\xdb\xf9\x88\xed\x7d\xad\xac\x00\x58\xfd\xd6\xdd\xe1\x5b\xed\xd4\xe4\xe1\x35\x63\x39\xc0\x0b\x49\x34\x6b\xd1\x5f\x18\xa9\xbb\x59\xfc\xc4\xc5\x12\x7c\x98\x0a\xf5\xf0\xc6\x4b\x33\xa7\xe5\xd5\xde\x59\xcf\xf0\xd9\x88\xeb\xbc\x39\x32\xf3\x2d\x72\x07\x01\xb5\x05\xfb\x8c\x0b\xf1\xbe\x36\xd2\x9b\xb4\x99\x3e\x44\xb7\x80\x50\xb2\x9b\xc7\xd2\x54\x0f\xaa\x5a\x40\x29\x01\xac\x21\x1e\x6d\x06\x3f\xeb\xca\x93\x0f\x80\x95\x09\x81\xa0\x50\xb2\xe5\x84\x17\xf0\xbd\x44\x48\xc7\x0d\xc6\x43\x2a\x5f\x70\x8b\x29\x3b\xf1\x74\x3a\xdd\xd3\x90\xba\x9d\x43\xea\x16\xdd\x54\x78\xf7\xef\x71\x87\x3f\x25\x8f\x0b\x24\xcb\x91\x0b\xe4\x83\x63\x71\xd4\x37\x14\x67\x34\xeb\x41\x29\x9b\x21\x9e\xca\x35\x2e\x1f\xe3\x1a\x77\x9f\x47\x60\xb9\xdf\x40\x3a\xde\x08\x61\xba\xbb\xec\xf4\x28\x86\x52\xa3\xda\xc7\xa7\xa9\x1b\xc9\x75\x70\xe4\x7c\x8b\x06\x9f\xfb\x5b\x0c\xf3\x80\xb5\xb5\xab\x6d\xbe\xd0\x48\x04\x33\x37\x5b\x22\xcc\x84\x52\x9b\xa5\xef\x5b\xf0\x6a\x59\xa0\xfa\x8c\x0f\x2b\x65\xf2\x38\xc0\xa1\x17\xe8\x61\x9b\x5d\xbd\xdd\x91\x57\x4d\x40\xea\x91\x0b\xcb\x13\x63\xe7\x0e\x1c\x38\x46\x5c\x84\x60\x4e\x5e\x47\x1d\x85\x6d\x37\x53\x9e\xa4\x95\x10\x82\xec\x88\x86\x22\xc7\xbe\xcf\xda\x98\x02\xb6\xfb\xa1\x42\x3b\x34\xaf\x4f\xbb\xf2\x93\x4f\xd8\xd0\xed\xac\x76\x6e\x67\xdd\x98\xd0\xcf\xce\x11\x31\x3f\x16\xd8\x2e\xc8\x73\x41\x7f\x49\xcc\x15\xaf\x80\xe3\xcf\x03\x09\x7a\xc0\xbc\x7f\x6a\x16\xd5\x0f\xf2\x93\x6d\x1e\x6b\xf4\x43\x95\x4d\xf2\x1c\xc8\xa0\x0f\x07\x16\xfb\x7f\x5b\x7a\xa4\x1b\x94\x1a\xaa\x5c\x88\x88\x1f\xab\xd8\x23\xd4\x8a\x5d\xbb\x95\x86\x68\x26\xcd\x36\x21\x87\x6f\x85\xce\x5a\xe4\x16\x8a\x8c\x34\x14\xfe\x73\x20\xf3\xad\xfc\xa2\xf5\xd6\xdd\x1a\x77\x9e\xf8\x06\x12\x6e\x06\xce\x0a\xae\xfe\x41\xb7\x3d\x51\xfc\x40\x89\xd8\xcc\xc6\x01\xbc\x30\x74\x63\x11\x8f\x90\x9e\x06\xa8\x4b\x91\x5a\x77\x81\x5e\x28\xa5\x11\xc2\x5d\xe5\x36\x6b\xba\x07\x5c\x6a\x59\x71\x28\x64\xbb\xc7\x53\xbe\xa7\x46\x15\x45\xf1\x6b\xdf\xf3\xe2\xde\xca\xc7\x73\xd9\x2e\x46\x61\xa9\xbf\x71\xf6\x95\x7b\x32\x81\xf7\xd9\x1f\x11\x8a\x33\xef\xb9\x07\x15\x6b\x66\x5b\x4e\x06\x6b\xa0\x54\x53\x88\x7a\xbd\x03\xdb\x14\xbb\xd0\x8e\x5f\x20\x6a\x13\x6b\x39\x90\x08\xa4\xd1\x64\xaa\x7e\x88\x2b\x0d\x23\xe3\x66\x12\x7a\xf2\x66\xe6\xeb\x01\x8e\x00\x64\xc0\x9c\x6d\xb3\xd1\xba\xc6\x9a\xdf\x25\xe9\xdf\x60\x4b\xbf\x61\xce\x40\xa0\x03\x8c\x80\xd2\x50\x55\x00\x1b\x15\x76\x83\xa3\x3f\xde\x50\xfc\x08\x05\xd4\xa0\xa0\xac\x09\xeb\x2e\x8a\x90\x03\x7b\x7e\x55\xed\x0f\x80\x47\x6c\xc2\xa1\x83\x1c\x95\xb0\x49\x8b\x68\x98\x47\xb8\x25\x85\x98\xb7\x3e\x1f\x3d\xb3\x58\xa3\x31\xce\x31\x95\x10\xc6\xb0\x02\xd4\x29\x27\x02\x7a\x84\xdb\xf3\xef\xd0\xf2\x74\x85\x58\x9c\x02\x2a\xb1\x5c\xaa\x39\x73\x7a\xc0\xe7\xfd\x6b\xf3\x79\x89\x4c\x28\x6f\x8e\xa1\xb1\x81\x6c\x2e\x66\x29\xc0\x0c\xc4\x39\xda\xdd\x16\x9b\x92\x66\xfb\x23\x24\x74\x0d\xa9\xc7\xcf\x27\x34\x1b\x81\x7d\xc4\x58\x0b\x58\xad\x90\x7b\x97\xf2\x11\x0f\xdc\xbd\x1b\xe6\xec\x8c\x8c\xaf\xe6\x8b\xd3\x1f\x29\x0d\x19\x52\x01\xca\x95\x31\x00\xe2\x5d\xaf\xa5\x5e\x2e\x4d\x45\x9d\xed\xde\x8f\xcc\xf8\xb5\xb1\x29\xa9\x31\x63\xdf\x40\x08\x6f\xb5\xc7\x16\x86\x78\x0d\x6a\x84\x79\x48\xe6\x64\xeb\xbc\x28\xc8\x37\xe6\xc8\x31\x21\x53\x61\xd3\x92\xfe\xaa\x2b\xc1\xf5\xeb\x4e\x87\x71\x03\x16\x33\xb2\x3a\xdb\x23\x2f\x57\xcb\x5d\xd1\x15\xe2\xe4\x26\x6d\x1c\xf0\x8f\x47\x52\x35\xda\x24\xea\x55\x85\x7b\xf8\xb7\x1d\x24\xe7\x8d\xa9\x2d\xf2\x25\xf0\x03\x04\xab\x2c\x8c\x88\x16\x7b\x70\xf2\xcf\xc0\x2a\xd1\x07\x35\x82\x75\x80\x5b\x42\xfa\x90\x28\xc7\x30\xd9\xcd\xa8\xa9\x56\x5c\x2e\xb8\xfc\xdb\x86\x84\x43\xf4\xbd\x33\x7f\x22\x0e\x16\x0e\x8d\x1d\x36\x33\xf8\xcf\x82\x1d\x47\x14\x8b\xaa\x78\xc3\x81\xdc\x47\xb6\x06\x34\x19\xd8\x51\xe1\xed\x1b\x23\xe2\xbe\xb4\xad\x92\xb3\x38\x39\x65\x1d\x91\x6e\xc5\xf0\x00\x0d\xd9\x12\x60\x8a\x90\x55\x05\xfb\x50\xa0\x5d\x4d\xf8\x66\x6e\xa6\xfa\xc5\x6f\x90\x71\xc5\xd8\x8a\xde\x85\x4e\xe5\x2a\xc3\x27\x73\x8f\x8d\x80\xec\xcb\x02\x92\x21\xf1\xfe\x40\x9b\x0e\x57\x79\x22\x14\x1a\x1e\xe4\x8d\xd5\xc5\x57\x6d\xe9\x3a\xa4\xc8\xda\xc8\xd2\x41\x9c\x13\x99\x5c\x18\xac\xa6\x0a\xaf\xe9\x0e\xa1\x9f\xfe\x03\xdf\xa7\x94\x04\x67\xe3\x7c\xc7\xf4\xd1\x5d\xf9\x0e\x0b\x59\xda\x3e\x8f\xa1\x41\x3f\x2a\x71\xe5\x53\xd5\xa5\x5b\x41\x72\xb4\x73\xfb\xb8\xda\xc1\x68\xc7\x21\x46\x08\x0a\x4b\x3a\x33\x5c\xd5\x72\x04\xc5\xee\x01\x9b\x80\x7c\x54\x0d\xa3\x31\xe4\xd3\x90\x9f\xcc\x2d\xc8\x9c\xc7\xa6\xec\x01\x3c\x86\xf9\x23\x77\xd8\xc7\xe1\x8c\x9d\xc0\x98\x04\xaf\x55\xe9\x95\xf3\x97\x28\x28\xfe\xb0\x36\xf2\xc1\xa9\x71\x01\x75\x09\xd3\xf5\xce\x66\x51\x1d\x1b\x16\xef\xd7\xfe\xbe\x45\x88\x1c\xee\x3e\x43\x33\x77\x28\xbd\x00\x4b\xd7\xa2\xc9\x20\xb8\xd4\xc0\x90\xeb\x4a\x70\xb0\xfe\x62\xcf\xc0\x14\x78\x2b\x2b\xe5\x5e\x2e\x8b\x1f\x95\x53\x13\x0a\x22\x2e\x89\x3a\xc6\xfc\x60\xaf\xa3\x6d\xb1\xe3\xcc\x4d\xe5\x23\x04\x1e\x89\x2f\xa9\x2a\x0a\x16\xd3\x20\xb0\xa9\x67\xd8\x35\xd3\xac\xf0\x26\x9f\x12\xde\x03\x72\xbe\x6d\x66\x7b\xd3\x16\x03\xf6\x5d\xca\x65\x1d\x3d\x34\xa7\x00\x0a\x2e\xbf\x9a\x62\xb7\xa1\xe0\x3a\xa3\xdd\x98\x2a\x7d\x3f\x42\xbf\xf1\x52\x65\xe6\xa9\xde\xa3\xd9\x05\xa5\x0a\x4e\x4f\x13\x9f\x03\x78\xab\xbc\x41\x66\x90\xaf\x87\x6e\x57\x7a\x26\xd3\x8c\xe6\x91\x00\xa9\x70\xae\x9e\x56\x8b\x36\xd2\x23\x05\xd5\x08\x65\x82\xda\x7e\xeb\xd3\x67\x06\x4b\x84\x72\x1b\x2a\x41\x04\xd2\xa9\x3d\xdd\x9a\x6e\x94\x82\x44\x9f\x71\x8b\xf7\xdd\xc9\x27\x05\x92\xf1\x8b\x34\xfb\xe6\x4f\xc0\x08\x29\xf5\x03\x86\x29\x98\xff\xbf\x0c\xdf\xff\x91\x25\x03\x75\xb7\xdd\x6a\x55\x25\x16\x81\x13\xab\x98\x9e\xa6\xee\x15\x1e\x9c\x67\xc6\x55\x5d\xb9\x5d\x77\x4f\xe5\x35\x08\x46\x41\xa8\xc1\x7b\xce\x12\x50\xa5\x65\x49\x76\x28\xad\x61\x57\x88\x11\xd6\x7f\x3a\x0f\x95\x3e\x43\x48\x50\xa0\xa2\xc3\x4e\xf1\xdd\x07\x20\x49\x37\x03\x66\xad\xf0\xcd\x55\x99\xc0\xba\x97\xa7\xbc\x6c\x12\xd1\x44\x76\x11\x26\x9b\x47\xc3\x1f\xe4\xfd\x01\x62\x26\x4c\x8c\xb4\x0f\x3d\x95\xcb\x31\xc9\x0f\xc1\x9a\xfb\xe5\xae\x08\x22\x9d\x0b\x1e\xe0\xbc\xb1\xfc\xae\x99\x37\x2b\x3d\x80\x02\x43\x45\x07\x31\x79\xd0\x35\x91\xed\xfd\xe2\x71\xff\xb6\x79\xd9\xa3\xd8\x56\x95\xc8\xa2\xa5\x70\xba\x1f\xef\x26\x7b\x15\x97\xc0\x68\x4e\xc5\x4e\x5c\xc5\xa7\x1b\x6c\x9b\x87\x36\x32\x13\x51\x5b\xe7\x96\x94\x0b\x79\x89\xce\x49\x9b\x6f\xe2\x71\xc3\xf2\x3a\x86\x07\x21\x97\x7b\x1e\xf7\x67\x8a\x66\x43\x66\x1c\x4e\xf2\x6c\x8d\x64\xf4\x3c\x1e\x13\x3e\x36\x41\x90\x73\x24\xc3\x62\xb4\x2a\x30\xb0\x00\x60\xd4\xd7\xe4\x02\xe2\x07\xfb\x1f\x83\xe5\x81\x98\x8f\x17\x8d\xcf\xf1\x6c\x8f\xce\x29\xf8\x86\x1e\x8b\x0c\x76\x8d\xca\x51\x22\x5c\x08\x88\x8f\xd3\xe5\xf3\xdf\x72\x76\xd5\x57\x55\x20\xfc\x48\x32\xc0\x41\x78\x8d\x0d\x23\x67\x37\xe0\x60\x84\x00\x9a\x93\xc7\x10\x19\x69\x69\x77\x63\x73\x2c\xea\xc1\xc7\x8c\x54\xc3\x41\x0a\xc1\xae\xcd\x56\x23\xd9\xe8\xe1\x84\x12\xca\x0b\x1d\x2f\x4d\x57\x88\x97\x5d\xd9\x4b\x0f\xb9\xcf\x15\x94\x26\x3d\xa1\x4d\x87\x3b\x31\x6c\x66\x3b\x68\x73\x89\x8b\x60\x1f\x7c\xaf\x53\x7c\x0b\x66\x7b\x39\xd3\x50\x69\x87\x5d\xc2\x0b\x49\xb5\x06\x1c\x5a\x77\x7e\x3c\xe4\x55\xe1\x7d\xda\xb3\x3c\xb7\x3e\xcb\x33\xc1\xf8\x1a\x16\x66\xe4\xee\xda\x1b\x22\x8d\xe3\x2a\xae\xa3\x2c\x67\x89\xcd\xea\x2b\x31\xe4\x52\x15\x85\xf5\xc1\xc1\x58\x4f\x8a\x86\xf3\xe9\x93\xf3\x5c\x2a\xf1\xf8\x64\x0f\xd7\x02\x09\x2f\x9c\x97\x28\xa2\x6b\xcd\xa2\x46\xc9\xc3\x32\x13\x2f\x4b\xa2\xf2\x09\xbf\x61\x8c\xee\x29\xd2\x0f\x9f\x66\x64\x40\x11\xba\xd5\x13\xf2\x66\x61\x36\x02\xab\xb3\x69\x6d\x92\x8a\xa6\x04\x1f\x81\x44\xd6\x2b\x6c\x06\x66\x46\xb8\x65\xc3\x42\x11\xdc\x57\x98\x66\x3d\xa8\xce\xe7\xd1\xc5\x83\xdf\x78\x50\x48\xba\xb0\x6b\xad\x9c\x70\x01\x58\x7f\xee\xb4\x8a\x05\x7b\x62\x77\xc7\x32\x81\xa3\x5d\x18\x63\xe1\x5a\x87\xc6\x41\x69\xac\x63\x7c\x0f\x0f\x2e\x3c\x1e\xb6\x38\xae\x4a\x2d\x1d\xd5\xce\xfd\x51\x68\x5f\xe9\x2f\xdd\x0d\x81\xf0\x52\x59\xb3\x4f\x88\x19\x11\x74\x9b\xa2\xbb\xc0\x28\x1a\xfe\x35\xa0\x52\x58\xf8\x6f\xe4\x96\x43\x43\x2a\xad\x3b\xaa\xd7\x95\xb6\x6b\x53\x2c\x42\xcd\x38\x06\x36\x68\x3a\x54\xd7\x0e\x09\x5e\xe8\x3d\x40\xdf\x79\xb6\x97\x85\x7a\x40\x89\x8a\x81\xeb\x32\xae\xb5\xc5\x3d\x80\xb8\x75\xb9\xdb\x68\x84\xce\x73\x2e\xd4\x46\xd7\xba\x72\xbe\x98\xaa\x55\xe0\x54\x97\x85\xda\xbb\x6b\x04\x1a\x5c\x51\x57\x0a\x85\x12\xec\xc6\x29\xfb\x8d\x9a\x57\xc6\x46\xbf\xc8\xcb\x22\x2f\xe3\x7c\xd9\x89\xf3\x07\xdc\xef\x2c\x76\x05\x5b\x40\x2a\x2b\x74\xb9\xaa\xd7\xa7\xde\x3d\x4c\x82\xdf\xf1\x84\xa1\x81\x37\x0e\xcf\x27\x9e\x8d\xe0\xb2\x31\x34\x68\xb8\xf0\xeb\xe0\x1c\x74\xe5\x49\xa0\xd3\xb5\x69\xe6\xca\x19\x1c\x88\xef\x08\xc7\x00\x32\x27\x4d\x94\xdd\x60\xfe\x3b\x03\x07\x1c\x78\x27\x64\x1a\xda\xfe\x95\x73\xe0\x47\xa1\xc1\x37\x3e\x1a\x8f\x4b\x83\xcc\x73\x2a\x05\x2d\x22\x1e\x3d\xf1\x8f\x84\x32\x5f\x75\x65\xaf\xdc\xc7\x17\x54\x24\x2f\xec\x43\x01\x85\x35\xad\xaf\x11\xaa\xf1\x4c\xc5\x0e\x22\x26\x5c\xf0\x64\x0b\x8f\xaf\x75\x20\x0f\xf1\x30\x77\x85\x70\x93\xb0\xd8\xac\x39\xd7\xdb\xb8\x54\xc0\x9b\x0e\x14\x70\xe5\x37\x67\xc0\xca\x59\x8e\x84\xf6\x50\xef\x4d\x22\x45\x3c\x55\x1e\x63\xf9\xd9\x62\x37\xf7\xd9\x97\xe8\xd5\x8f\x48\xd7\xec\xd0\xe4\xe3\x25\x4a\xe0\x05\x97\x14\xd5\x26\x76\x6b\x36\xc6\x84\xaf\x03\xc1\xcf\x51\xa9\x64\xb3\xed\x38\xc9\x0a\x82\x91\x06\xf6\x11\x94\xc7\x99\x07\x68\xdd\x11\x58\xa3\xee\x4c\x72\xe7\xef\xaf\xf2\x52\xa3\xd5\x02\x42\x58\xcf\x76\x2b\x68\x40\x3b\x0c\x70\x73\x46\xc0\x37\x06\x1c\x40\x53\xc3\x42\x85\xac\x48\x12\xd3\x6d\xe4\x89\x7c\xaf\xab\xd3\xc5\x75\x4a\xa6\x7d\x1b\x15\xd3\x53\x17\x15\x9c\x8b\x63\x5a\x25\x4c\x8b\xc2\x63\xed\x89\x0e\x08\x5e\xf9\x09\x2d\x76\x68\xaa\xc1\xf9\x85\x18\x1b\x42\xe7\xbb\x63\x9c\x66\x6f\x22\xc7\xd2\x43\x92\xd7\x6d\x04\x29\xbc\xe6\x7e\xfe\x1b\x83\xe0\x28\x69\x8d\x91\x8a\xf0\x2c\xf0\x8c\xb3\xf7\x0d\x25\x3e\x1e\x73\xb1\xe5\x0d\x04\x16\xb8\xfb\xe9\x2c\x8c\x34\x25\x5f\x73\xdf\x23\x43\x9c\x05\x09\xd8\x6f\x6a\x64\xb5\x9b\xee\x07\x58\x2a\x49\x32\xad\xf9\x76\xa1\xa4\x99\xc3\xbc\xdc\x14\x81\x88\x32\xbc\xbb\xfe\xe9\x58\xf6\x20\x8e\xdb\xfe\xed\xe6\x3e\x42\xe2\x1c\xca\xb9\xc4\x16\x6a\x94\x40\x85\x4b\x77\xf8\xca\x07\x2f\xf9\xd8\xdd\x87\x8d\x8b\xc5\x23\x55\x0f\x24\x76\x77\x5c\xe9\xef\xb6\x10\xba\xa3\xa2\x56\x88\xf8\x3c\x83\x26\xe2\x36\x93\x58\x8c\xf8\x90\x6b\xf4\x56\x41\xaa\x88\xb6\x64\x45\x57\x9e\x0c\x6a\x0f\x3e\x61\x6b\x63\x16\x8d\x72\xb1\x87\xb5\xf1\x9b\x52\x47\x8c\x7d\x02\x22\x5c\x1e\x3f\x8a\x92\x37\x79\x33\x0a\x45\x7d\x09\x31\xc8\x42\xc4\x86\xcc\x7d\x2e\xa8\x43\xe2\x70\x75\x54\x77\xe7\xe7\x1c\x3d\xce\x29\xb0\xd9\xa9\xbc\x87\xfa\x40\xbb\xcb\xf1\x65\xb1\xfa\xda\xc7\xf8\x37\xda\x4d\x3c\xb7\x9b\xa4\xc8\xb8\xb9\xc1\x5d\xd9\x13\x7e\x84\xf0\x15\x64\xe0\xc1\xc5\x38\xb9\x38\xc5\x7d\x55\x35\x96\xba\xe5\x1b\xdd\xa0\x00\xe4\x42\x4b\x55\xb8\x43\xb1\x97\x44\x83\xc9\x01\x36\x2a\x2f\xa6\x60\x7a\xe5\xeb\x06\x63\x6b\x99\xaa\x0e\xfc\x50\xc1\x34\x81\x00\x41\x9d\x18\xcb\xa8\x0b\xa0\x0f\x27\xca\x9e\x04\x1e\x54\x0a\xf5\x1d\xab\xbf\xf3\xb5\x1c\x79\xa8\x20\xe4\x52\x09\x78\x71\x38\xb5\xe0\xcd\x51\x91\xda\xc1\x48\x90\x4a\xa2\x42\x8d\xb3\x39\xe1\xdd\x17\x51\xe5\x76\x14\x9d\xaa\x23\x01\xa2\xc8\x47\x76\x9f\xc3\x8c\xde\x31\x31\xa3\x7c\x98\x16\xdc\xe2\x0c\xe1\xcc\x30\xa1\x5b\xcb\x42\x2b\x8b\x9d\x28\x1a\xd1\x5d\x33\x51\x9b\xd0\x6e\x06\x51\x74\x94\x86\x40\x78\x8e\xd6\xbc\x4d\xbb\x2e\x42\x5a\x46\xbe\x52\x19\x2b\x7a\x6c\x63\xa3\x6c\x61\x69\x02\xd6\x09\x5d\x00\x5b\x63\x95\x6a\xc5\xe9\x5f\xe4\x96\x8a\x9c\x0f\x9f\x2e\x6c\x0d\xc0\x93\xf8\xf9\xcd\x91\x02\xcc\x7b\x3f\x1e\x21\xc0\x30\x47\x78\xd9\xb0\x00\x80\xd8\xef\x57\x08\x86\xec\x0a\xa1\x4f\xe5\x2f\xba\xf2\xf1\x3e\x7f\x26\x20\x40\x48\x67\xba\x9d\xfd\xd2\xc6\xab\x0b\xac\x8f\x71\x1b\x2a\x7f\xd7\x22\x42\x05\xaa\xec\x8a\x46\xa0\x12\x71\x30\xbe\xc2\xc1\x8e\x42\x16\x69\xad\xd2\xa3\x4e\x1b\x04\x6d\x59\xb7\x22\xec\x61\xad\xb0\x99\xb4\xc6\x3c\xa3\x2f\x9e\x2b\xb5\x5e\x50\x98\x87\x11\xa9\x58\x7d\x46\xde\x28\x2c\x7f\x1e\x03\xa7\x83\xe2\xe5\x22\x75\x6f\x2e\x66\x8d\x03\x86\xde\x4f\xa4\x9a\x84\x87\x3a\x8f\xa6\x07\x6a\x36\x0a\xf5\x55\x1b\x70\x08\x62\x8d\x76\x92\x97\x5c\x8f\x46\xba\xc2\x54\x62\x86\x51\x4e\xb7\x2c\xa7\xe1\xaa\x6d\xd4\x7f\x9a\x08\x0a\xc4\xca\x13\x06\x46\xcb\xe4\x17\x5d\x95\xba\x20\x5f\xc8\x29\xfb\x53\x6e\x5c\x6a\x96\x23\x4b\x28\xc6\x61\xc8\xfe\x48\x89\x54\xbb\xd2\x7a\xbc\x5e\x8a\xdc\x30\xea\x08\x1a\xd2\x22\xe0\xc5\xdb\xc6\xb7\x9d\x8f\x87\x15\x9c\x6b\xb5\xdd\x6a\x2f\x0f\x02\x0c\x16\xf3\x02\xd7\x95\x5a\xe4\xf3\x9a\xa3\x04\xcc\x28\x1c\xb5\xe0\x9a\xa5\xf0\x35\xa7\x1e\x03\x2e\x74\xf7\xc0\xc8\x94\xa5\xf3\x4b\x9a\x32\x16\x1c\x96\x60\x53\x58\x27\x3c\x1f\xd3\x1b\xaa\xb4\x1c\x0a\x67\xfa\x58\x20\x80\xc0\x8c\x1e\xd5\x28\x04\x6b\x7e\x05\x7e\x88\x80\xda\x20\xd9\x8c\xb0\xa4\x49\xbe\xae\x10\x3f\x87\x50\x2e\x06\xec\x58\x65\x51\x52\xdc\xbf\x0c\x34\x44\x3f\x52\x9d\x65\xf3\x85\x3e\x9b\xed\xcf\xdc\xff\x0f\x0f\x97\x36\x2f\x57\x85\x8e\xf2\xdc\x38\x33\x3c\x2b\x9c\xb9\x3b\x78\x58\x54\xc6\x26\x67\x7b\x91\x26\x36\xda\xea\x56\xa2\x4e\x25\xaf\x4b\x0e\x99\xf2\x38\xed\x29\x8e\xca\xc1\xd6\xb7\x82\xca\xb6\x65\x94\x4d\x3a\x9c\xb1\x33\xfe\x3d\x44\x55\x80\xd0\xa0\xea\x81\x83\xf0\x73\x68\x01\x7f\x30\x8f\x98\xb8\xcd\x77\x62\x3d\x14\x6b\x7a\x10\x9b\x87\x05\xe3\xde\x5c\xdc\x95\x69\x01\x77\x48\x88\x1c\xbe\x05\x15\x5f\xb7\xd8\xb3\xa2\xb5\x20\xa5\xe9\x94\x62\x45\xce\xfb\xe3\x9e\x54\xeb\x4b\xd1\x50\x4b\xc5\x58\x9e\x14\xc7\x12\x79\xfd\xdd\xac\x32\x22\x5e\x6d\x0b\xf2\x54\x09\xae\xd5\xc8\x65\x4e\x57\xc2\x5f\x37\x67\x72\x46\x6b\x11\x0b\x72\xbf\x84\x5d\x21\xfe\xd2\x4d\xb8\x6f\x30\xed\x83\x96\x6f\x16\x11\xc0\x63\xe4\x13\x5e\x0a\x62\x53\xed\x89\x0f\x41\xbc\xce\xca\x32\x39\x66\xb1\x6f\x22\x64\x36\xf0\xdb\xca\x3d\x34\x09\x6c\xb6\x75\x74\x9e\x6a\x23\xfe\xbe\x89\xb8\x75\xfc\x6a\x72\x3c\x8f\x02\xa1\x7b\xdb\x61\xd4\x93\x8e\xec\xb6\x19\x7a\xf5\x43\x91\xf8\xa3\xf0\xdb\x59\xc0\xdf\xce\xd0\x78\xd8\x27\x38\x5d\x3e\x0f\xc6\x56\xb9\x60\xa0\x88\xbc\x0a\x28\x2b\x11\xbe\xbb\x35\xde\x02\x44\x38\x6d\x4a\x05\x04\x12\x7c\x68\x6b\x0d\xb8\xa0\x5d\x21\x5e\xe3\x76\x72\xb6\xc0\xeb\xf1\xda\x80\x95\xb2\xad\x9b\x49\xd3\xdc\xf9\xb0\xde\x5c\x80\x02\x15\x08\xeb\x8b\x44\xf5\x96\x06\x15\x26\x74\x5c\x13\xf2\xb9\xfb\x52\x03\x36\x1c\x1d\xa6\x83\x5d\x11\x51\x29\x5f\x5e\xdb\x83\x1c\x1f\xb7\xd7\x31\x50\x1e\x72\x91\x9a\x75\x3e\xcb\x6b\x1f\xab\x64\x08\x0c\xae\x02\x39\x7c\x9b\xa4\xe2\x67\xc6\x25\x86\xd0\xd8\x18\xc7\xa6\xd3\xca\x5e\x71\x42\xf5\x85\xc7\xb3\xf2\xe8\xad\xe7\xe5\xc2\x39\x47\x74\x60\xf0\xf1\x8a\x6a\x36\x13\x06\x88\x1a\xd2\xd9\xce\xc9\x87\x68\x28\xe1\xc8\xfc\x48\x6f\x0d\xce\xd8\x4f\xbf\x59\x8f\x1f\xd5\x2f\xb8\xa9\x42\xa9\xc6\xc5\x39\xb5\x4f\x80\x6f\x84\x25\xb3\x8f\x25\x27\x1f\x7f\x61\x2c\xb2\xf8\x2e\x39\x42\xda\xe3\x5d\xa7\xbd\xb1\xee\x2f\x06\x7a\x82\xf1\x2a\xc7\xa0\x9e\xfe\x0a\xcb\x14\x71\xc0\xab\xd5\x84\x58\x81\x7b\x18\x44\xba\x7a\xdd\x36\xd2\x2e\x68\x7f\x6f\x21\xee\xe2\x57\x0c\xd0\x00\x3f\x89\x98\xc4\xab\x0e\x70\x18\x4c\xda\xb5\x86\x4e\x81\xe6\x7d\x22\x00\x10\x4a\x84\x23\xac\xb3\xdb\xa3\x88\x35\x01\x83\x5b\x51\xee\x2e\x70\xd0\x87\x8c\xd2\xc5\x45\x57\x0e\x96\xd9\x01\x22\x21\xf5\x54\x02\xfb\x96\x67\x40\xc0\x0a\xfe\xa8\x08\xa5\x85\x57\x41\x20\x00\x48\xa4\xef\xa8\x2f\xf5\xc4\x4d\x1c\x3a\x19\x50\x0e\xf0\x77\xad\xdd\x69\x7b\x9a\xc5\xe7\x11\x12\xae\xb0\x90\x50\x19\xe3\x8e\xd1\x49\x82\x4f\xe9\x39\xc1\xb2\x88\x0e\x2c\x46\xab\x3c\x8d\xd0\x36\xc1\x9a\x83\xfb\xff\x18\x0d\x05\xc4\x8c\xe9\x52\x23\xfb\x19\x3c\xd7\x1f\xa9\xe4\xbb\xe2\x20\x1a\x18\xd9\x88\xb1\x8d\xc4\x9d\x3d\xcc\xc5\x68\xf3\xcd\xae\xa8\x55\xa9\xb1\x28\x1c\x6a\x92\x62\x4e\xb4\x16\x31\x4d\xf8\xaf\xdc\x65\xc5\x24\x8a\x31\x95\x1a\xa5\x25\x94\x15\xe9\x1e\xee\xa3\x83\x79\xe4\x16\x2a\xa8\x12\xc6\xde\x8e\x18\xfb\x45\x89\x06\xf8\x01\x42\x59\x42\x16\x07\x03\xc6\x09\xc6\x66\x74\xcb\x0f\x73\xb5\x40\x79\x00\x15\x34\x86\xf0\x6b\xb9\x8e\x9e\x2a\xad\x8f\xb0\x61\x30\xa7\xcb\xde\xec\x42\xe2\x05\xbb\x18\x08\xdc\xcb\x1d\x85\x62\xe1\x57\x17\x2c\x73\x1f\x03\x8e\x55\x1d\xe3\x70\x42\xb0\x69\x59\x39\xbd\xc5\x35\x5f\xe8\xe1\x3d\x32\x7d\xcc\x4e\x1d\xa4\xa2\xa3\xaa\xb3\xdc\xca\xb5\x2e\x16\x0c\x22\xdf\x40\x90\xf7\x9c\x8c\xaa\xdc\x8b\x18\x55\x2a\x6a\x93\x46\xef\x71\xa6\x8a\x20\xca\x75\x3c\x7c\x04\x39\x86\xa5\x51\x58\x95\x18\x7f\x2a\xa2\x80\x6c\xfb\x02\x14\x76\x60\x41\x4e\xa3\x3d\x7b\x90\x14\xd6\x71\x51\x6d\x4b\x65\x5d\x5e\x42\x84\x91\x40\x8c\xf8\xd2\x47\x48\x19\x50\xb9\x1e\x3c\x33\x5d\xd5\xc4\xb0\xca\xa0\xa8\x88\x84\xc4\x15\x79\x01\x1f\x7f\x19\xda\xcc\xf0\x93\x6f\x45\xf2\x70\xee\x3f\xb5\xee\xed\xa2\x19\x72\xad\x3f\xe9\x52\xf7\xd2\xab\x2a\xc2\xd7\x87\x16\xea\xd0\x7e\x1f\xef\x31\xf9\xba\xbe\x88\x32\x77\x47\xdf\xc9\x11\x82\x4c\xc1\x9a\xa1\xd0\xf9\xee\x8c\x02\x58\xaf\x8f\xf0\xbe\xd8\x16\xec\xf9\x69\x11\x65\xd3\xec\x08\xd3\x97\x79\xbb\x38\x04\xff\x90\x2f\xb4\xac\xa0\xc6\x29\xea\x0b\x14\xb1\x9b\xcf\x87\x1d\xe4\x16\x4d\x2e\xc7\x00\x2f\x9e\x89\x32\x46\x14\x89\x63\xa4\x54\x2f\x2b\xf0\x4b\x6f\x29\xb7\xb8\xdb\xf2\xc3\xb1\xa1\xf2\xd9\xc2\x94\xb8\xfc\x04\xc7\x96\x2f\x25\x68\x4a\x69\xd7\x70\x62\x9c\x39\x88\x98\x64\x22\x91\x60\xb4\x78\x3c\xbf\x20\x8a\x68\x92\xd8\x19\xeb\xdb\x25\x49\x08\xa2\xf8\xc6\x28\x10\x66\xa0\xb8\x5a\xea\xc8\xa9\x86\xaa\x31\x37\x51\xf7\x94\x82\x61\x7b\x1e\x98\x74\x51\x17\xb9\xfe\x8a\x9f\x9c\x69\xa9\x44\x43\x55\xa1\x4e\xb5\x75\x4b\xc1\xfe\xc5\xa5\x4f\xd7\x34\xfb\xb8\x9e\x01\x64\xc7\x61\x13\x93\x8d\x1a\xac\x22\x80\x03\x01\xb8\x87\x10\x62\xa0\x80\xcc\xcc\x9f\x7c\xc0\x35\xde\x87\x4c\x4e\xdc\xbf\x66\xb3\xd4\x28\x09\x5c\x67\xd4\xfb\xea\x44\x22\x61\x59\xc7\xf3\x68\x51\x06\x44\x96\x4a\xd0\xe7\x48\xcf\xb6\xd2\xc6\x53\xd9\xa6\x1e\x76\xd4\x37\x18\xb8\x8d\x50\x0a\xfb\x57\x09\x49\x87\xe4\xab\xb9\x15\x01\x90\x12\x1b\xc7\xb0\x7b\x61\x63\xa0\x92\x86\x17\x02\xc5\xc6\xce\x32\xfe\xf1\x02\x70\x0a\xf0\x26\x13\x4e\x41\xa8\xf4\x8c\x08\x37\x7d\x11\x88\x9f\xa1\xb2\xee\x48\x72\xa8\x97\x32\x08\xdc\xed\xdf\xdc\xd3\xe7\x58\x75\x70\x0c\x88\x10\x43\x2a\xd4\x5f\x55\xe9\xaf\xb9\x45\x9a\x4e\xb7\xe1\x0d\xa6\x1e\xb4\x6a\x1f\xed\xb8\x47\x1b\xc0\x19\xb4\xee\x46\xe5\x1b\x62\xe7\x48\x47\x72\xd7\x47\xcc\xb4\x07\xe4\x05\x3c\x8c\xbc\xca\x3d\x3c\x12\xa7\x02\x3c\xac\xd3\x6c\x57\x53\x0a\x1d\x02\xb9\x00\xa1\x53\x13\x81\x16\x75\x1c\x0b\xf7\x08\x8f\xde\x84\xc5\xcc\x73\x5d\x41\x06\x15\xcc\xec\x28\x0a\x8f\xf5\x92\xdf\xa1\x16\xf2\x57\xc1\x9b\xb8\x14\x1a\x76\xa6\x43\x83\x85\xa8\x59\x3f\x8b\xa2\x32\xaa\x9e\x24\x4d\xdb\x01\x04\x11\x00\x6f\xa0\x11\x3a\x99\x48\x00\x08\x03\x39\x91\x67\x0f\x88\x42\x1a\x0d\x67\x84\xae\x16\x77\x01\x30\x36\x28\xc2\x8b\x1e\x3c\x8a\x77\x39\x74\x96\x1f\x85\xb3\xa7\x57\x17\x49\x7f\x21\x78\x9a\x54\xe2\x1a\x1c\x89\x74\x25\x42\xce\x7f\xbe\x36\x6c\xdd\xf3\xbc\x20\x5d\xf9\xf4\x49\x08\x71\xf1\xc2\x1b\x8c\x5c\x1e\x1a\x5d\x0b\x30\xd6\x0f\xea\x38\x20\xf3\x13\x21\xca\x78\xfc\x0c\xac\xcc\x5f\xa4\xc4\xb1\xa9\x1d\x5d\xb6\x24\x65\xa0\xa8\xbf\xca\x6b\x9d\xea\x08\x41\x30\x85\xce\x7e\x0f\x2e\x35\x1a\x87\x5e\x11\x78\x8d\x19\xcb\xba\xb6\xd7\x16\x31\x56\x6e\xf2\xb4\x63\xab\xf3\x16\xc0\x33\xcd\x46\xbb\x4b\x66\x51\x25\xf8\x00\xbb\x15\x5c\x59\xd4\x95\xa3\x5d\x05\x6a\xcc\x7a\xd4\xb3\x99\x96\xab\x1d\x84\x77\x68\x2a\xf5\x83\x91\x2b\x03\xc9\x88\x25\xb3\x98\xc7\x98\x28\xc2\xd6\xaa\xde\x21\x06\x4f\x51\x44\xb1\x00\xf8\x15\x63\xb9\xa6\x78\x94\x68\x71\x6c\x8c\x37\x38\xec\x5a\x55\x40\x85\x01\x85\x10\xa4\x4a\xfc\x57\x10\x79\xbb\x28\xf6\x08\x89\x3e\x1c\xc9\x4f\xbd\xf1\xb8\x37\x9c\x7e\x16\xe2\xe2\x65\x57\xbe\xeb\x5f\xf5\xee\x27\x7d\x39\xfd\xd0\x97\xb7\x83\x77\xe3\xde\xf8\xb3\x1c\x4c\x18\xae\xf8\x5a\xde\x8c\xfb\x7d\x39\xba\x91\x57\x1f\x7a\xe3\xf7\xfd\xcc\x7d\x6e\xdc\x77\x9f\x88\x46\x92\x37\xa3\xb1\x88\x06\xc8\xe4\x74\x04\x03\xf6\x7f\x9d\xf6\x87\x53\x79\xd7\x1f\x7f\x1c\x4c\xa7\xfd\x6b\xf9\xee\xb3\xec\xdd\xdd\xdd\x0e\xae\x7a\xef\x6e\xfb\xf2\xb6\xf7\xa9\x2b\xfb\xbf\x5e\xf5\xef\xa6\xf2\xd3\x87\xfe\x50\x8e\xdc\xe8\x9f\x06\x93\xbe\x98\x4c\x7b\xee\xf3\x83\xa1\xfc\x34\x1e\x4c\x07\xc3\xf7\x30\xde\xd5\xe8\xee\xf3\x78\xf0\xfe\xc3\x54\x7e\x18\xdd\x5e\xf7\xc7\x00\x37\xf1\x6c\x34\xc6\x2f\xca\xbb\xde\x78\x3a\xe8\x4f\xe4\xdd\x78\xf4\xcb\xe0\x3a\x79\x27\xd1\xe9\x4d\xe4\x60\xd2\x91\x9f\x06\xd3\x0f\xa3\xfb\x69\x98\xfb\xe8\x46\xf6\x86\x9f\xe5\x5f\x07\xc3\xeb\x4c\xf6\x07\x30\x50\xff\xd7\xbb\x71\x7f\xe2\x5e\x7f\x34\x96\x83\x8f\x77\xb7\x83\xfe\x75\x26\x07\xc3\xab\xdb\xfb\xeb\xc1\xf0\x7d\x26\xde\xdd\x4f\xe5\x70\x34\x95\xb7\x83\x8f\x03\x37\xcf\xe9\x08\x56\x86\x3f\xcb\xa3\xbb\xc9\x8c\x6e\xe4\xc7\xfe\xf8\xea\x43\x6f\x38\xed\xbd\x1b\xdc\x0e\xa6\x9f\x01\xfa\xe2\x66\x30\x1d\xf6\x27\x13\x71\x33\x1a\xcb\x1e\xce\xfc\xea\xfe\xb6\x37\x96\x77\xf7\xe3\xbb\xd1\xa4\xdf\xc5\x05\x1c\x4e\x07\xe3\xbe\x1c\x0f\x26\x7f\x95\xbd\x09\x2f\xeb\xbf\xdf\xf7\xfc\x38\x77\xfd\xf1\xcd\x68\xfc\xb1\x37\xbc\xea\x8b\xd1\x4d\x73\x1b\xdd\xdb\xca\xcf\xa3\xfb\xae\x9c\x7c\x18\xdd\xdf\x5e\x27\x7f\x77\xcb\xd4\x97\xd7\xfd\x9b\xfe\xd5\x74\xf0\x4b\x3f\x73\x1f\x94\xbd\xc9\xe4\xfe\x63\x5f\xe0\x6a\x4f\xa6\xb0\x3c\xb7\xb7\x72\xd8\xbf\xea\x4f\x26\xee\x5b\x93\xfe\xf8\x97\xc1\x15\xe0\x79\x8c\xfb\x77\xbd\xc1\x58\x02\xc4\xc7\x78\xec\x46\x19\x0d\x9d\x70\x79\xd5\x75\x1b\x37\x1c\xc9\xfe\x2f\x6e\xfb\xef\x87\xb7\xfd\xc9\x44\x8e\xfb\xff\x7e\x3f\x18\xb7\x1d\x02\x37\x42\xef\xfd\xb8\x0f\x0b\x19\xed\xb9\xf8\x34\xb8\xbd\x85\xdd\x69\x6e\x7c\x06\x5f\x19\x7e\x8e\x36\xfe\xb3\xfc\xf4\x61\x24\x3f\xf6\x3e\x23\xaa\xc8\x67\x3e\x1a\xe3\xbe\x87\x1d\xe9\xc7\x87\xd4\xad\x67\x38\x98\xbd\x77\x23\xb7\x02\xef\xdc\x9f\x61\x5a\xd3\x11\x2c\x87\xdb\x9e\xeb\xde\xc7\xde\xfb\xfe\x24\x3a\x00\xee\xd1\x82\x00\xbe\x33\x39\xb9\xeb\x5f\x0d\xdc\xff\x18\x0c\xaf\x06\xd7\xfd\xe1\xb4\x77\x8b\x6b\x32\x9c\xf4\xff\xfd\xde\x6d\x61\xef\x96\x07\x91\xbd\xf1\x60\xe2\x46\x70\x67\x90\xf6\xeb\x7e\xd2\x17\xee\x9c\x0d\xf9\x7c\x4c\x47\xb2\x79\x25\x4f\xc2\xb3\x0f\xcf\x9e\xbc\x1d\x4d\xe0\xa0\x5d\xf7\xa6\x3d\x01\x33\x9e\xf6\xe4\xbb\xbe\xfb\xf4\xb8\x3f\xbc\xee\x8f\xe1\x2a\xf5\xae\xae\xee\xc7\xbd\x69\xdf\x4d\xce\x7d\xa3\x3f\x91\x93\xfb\xc9\xb4\x37\x18\xe2\xa6\xb8\xf7\x1d\x8d\xe5\xf4\xc3\x60\x7c\xcd\x77\x49\xc0\xf1\xbc\xe9\x0d\x6e\xef\xc7\x7d\xd9\x38\x60\xd3\x91\x1c\xdd\xf5\x61\x48\x38\x68\x61\x43\x26\xa3\x9b\xe9\xa7\xde\xb8\x7f\x9a\xc1\x19\x90\x83\x1b\x39\xb9\xbf\xfa\x20\x70\xf7\x64\x72\x63\x3f\xcb\x0f\xbd\x89\x7c\xd7\xef\x0f\x65\xef\xfa\x97\x01\xdc\x3a\x7c\xce\xdd\x68\x32\x19\xd0\x9a\x8c\x70\x04\x5e\xc7\xae\xe8\x0f\xf1\x73\x2d\xa8\x33\x50\xa3\xec\xe4\x7c\x0f\x9c\x4e\x0c\xa8\x4e\x41\xcf\x23\x63\x44\x25\x87\xfa\x81\x14\x9b\x33\x3b\x98\x8c\x9b\xb0\xd1\xb0\xa9\x25\x24\x93\xa8\xef\x9b\x81\x83\xc9\xfe\x27\xf5\x88\x98\x51\x11\x1a\x98\xd8\x59\xaf\x64\xd0\x83\x03\x5c\x47\xa8\x2f\xd9\xe8\x72\xc1\xf0\x16\x79\xdd\x90\xee\x60\x6a\x68\x46\x63\x9f\xab\x52\x24\x71\xcb\x80\xe2\x1d\xb0\xab\x21\xb8\x0a\x1e\x00\xda\xc9\x40\x16\x93\x86\x41\xc0\x80\x17\x31\x3c\xeb\x89\xa9\x32\x09\x3d\x45\xa5\x42\x80\xcb\xac\xbd\xe7\xf8\x28\xe4\x1c\xdb\xd2\xa7\x88\x87\xea\xfb\xa4\xf8\x11\x99\x54\x75\xad\x28\x79\x1b\xcc\x2d\xdf\xb9\x94\xa0\xcc\x02\xa4\xbb\xf3\xc9\xd4\x52\xdb\x1a\xd4\xbf\xff\xf2\x86\x3f\x6b\x6b\xaa\x6f\x86\x7a\x3c\xca\x41\x63\x01\xb4\x41\x24\xf6\x18\xaf\x13\x00\x6c\xf6\x02\x93\xbf\xcc\x41\x9d\xc0\x14\x40\xee\xc8\x0d\x05\x63\xc4\x5c\x7e\x51\x39\x87\x96\x1d\x6f\x5f\x74\x04\xd4\xe8\xa2\xa3\xb9\x35\xe0\x57\x41\xb9\xbf\x27\x09\x84\x04\x04\x25\xbc\x72\x2b\x97\xce\xa2\xe8\x0a\xf1\x2f\x6e\x33\xe1\xbb\x71\x49\x48\xe1\xa1\x1e\x4a\xb5\xe1\xf8\x9a\xcc\x17\x5a\x61\xef\x21\x42\xc6\x01\x9a\xc4\xbf\x36\x79\x01\xfe\x65\xaf\x55\xf5\xaf\xf2\x5f\xe0\x9b\x9e\x1a\xe5\x5f\x3d\x2e\xbb\x77\x20\x93\xe3\xf5\xd6\x77\x53\x25\xa7\x0a\xed\xe7\x08\xed\x36\xaf\xc3\x91\x49\x0f\xc3\x77\x21\x39\xa1\x41\xb4\xcd\x0a\x15\xad\x76\x56\x00\xb8\x61\x42\x84\x60\x72\x52\x40\xd4\x54\xf2\x24\x45\x5a\x38\x15\x07\xe6\x77\xf7\xf0\xcd\xe3\xa0\x06\x79\x71\x6b\xb3\xd5\x1e\x8b\x8f\xcd\x35\xec\x95\x42\x37\x88\x2c\x03\xe1\xa4\x18\x5b\x07\x6f\x7d\x41\x3a\x55\xc1\x1f\x10\x77\x82\x67\xd8\x54\xf0\xa6\x7a\x82\x7e\x9f\x68\xfd\xc4\x65\x45\xb6\x81\x4a\x0b\xf4\xcd\xb8\x74\x35\x3e\xb5\xed\xf5\x30\x4f\xd9\xb2\xc2\x94\x2b\x11\xa2\xf2\xb4\x88\x6f\x9d\x1f\x5c\x9a\xfa\x89\x46\x33\xf2\x50\x64\xf2\xe5\x85\xf8\xcd\x3c\x14\xbd\xc2\x82\xcf\x29\x63\xea\x42\x53\xca\x35\xca\x72\xa8\x1e\x44\xd4\x68\x77\xb4\x74\xa1\xe7\x75\x65\xca\x7c\x4e\xa8\xc7\x5b\x40\xb3\xce\x8b\x74\x71\xa0\x40\x7a\xa5\xe9\x08\xe9\xcd\xb6\x30\x7b\xa0\x26\x24\xe7\xc7\x37\x84\x93\x37\xb3\xd1\xd5\xa9\x44\x20\xf3\x4a\x5a\xe7\x6a\x15\x99\xc8\xc1\xe7\x03\xd6\x78\x9b\xaf\xa0\x67\x23\x54\xcb\x06\x20\x94\x8e\x2f\x2a\x8d\x4b\xda\x3c\xd1\x62\x57\x7e\xd0\x15\x74\x96\x28\x69\x21\xc8\xfd\x16\xa5\x30\x7c\xc5\x5d\x66\xfb\xc6\xcd\x7d\x6f\x16\xfb\x52\xf3\x8a\x3a\xf1\x32\xdb\xfb\xa7\x58\x66\x56\xa6\xa7\x83\x1c\xd2\x50\xca\x2b\x12\x74\xf5\xff\xb8\xa9\xcc\xec\x27\x79\x12\x60\x06\x60\x72\x0f\x84\xee\xfa\xa5\x34\x33\x7b\xca\x91\x0e\x21\x66\x7b\xf9\x3f\xdd\x0c\xe4\x58\x95\x0b\xb3\x91\x1f\xd4\xfc\x8b\xae\x9c\xf8\x92\x58\xf2\xb5\x43\x6a\xeb\xe9\x5e\x5e\x19\x53\xca\x7f\x95\x99\xbc\x90\xbd\x6d\x95\x17\xf2\xe2\xf5\xeb\x73\x21\xe8\x2f\x99\xbc\xab\xb4\xcd\x19\x88\xe0\x97\x7c\x0e\xdc\x19\xaa\xfe\xc9\x23\x32\x21\x64\x24\xf8\xee\xff\xbf\x3f\x88\x97\xe7\x8f\xfa\xe9\x3e\x7b\xfe\x97\xd7\x67\xde\x5d\xfc\xc7\x12\xff\xd0\xcf\xe3\xfc\x3f\xe7\xcf\x5f\x5d\x3c\x6f\xf0\xff\xbc\xb8\x78\xf1\xf3\x9f\xfc\x3f\x7f\xc4\x0f\xe8\xa1\xbb\x80\x7a\xf5\x77\x69\xe0\x43\x73\xec\xb1\x86\xe2\x23\xaa\xb7\x3d\xc4\x71\xd0\xa0\x1d\x71\xa1\x37\x5e\xe1\xef\x50\xa5\xf2\x1f\xaa\x4a\xe5\xd3\x54\xe9\x77\x74\xa8\xfc\x4d\x3a\xf4\x31\xe5\x19\xa5\xb4\x69\xd9\x7e\xab\xf2\x7c\x2d\xa7\x4e\x43\x69\x79\x87\xc5\xb5\x13\x00\x2c\x7f\xfe\xfc\xfc\x40\x6f\x5e\x38\xbd\xf9\xb3\xd3\x9b\x4d\x98\x86\x63\x85\xa1\x63\xbd\x90\x1f\x54\x8d\xcf\x22\x3e\x84\xcf\x48\x12\xe2\xbf\xad\x8a\x80\x26\xc1\xcc\x11\x51\x97\x78\x74\x2e\xe0\x95\xe1\x2f\x71\xb5\x5e\x38\xb5\x8f\xac\xd9\x49\x67\x68\xca\xb3\xf7\x77\xb7\xc8\xed\x76\x4a\xd0\x5f\x71\x6e\x98\xda\x1f\x22\xd0\x6f\x1b\xf5\x67\x50\x60\x2d\x6b\x54\x46\x44\x61\x7c\xcb\x28\xf6\xd0\xa6\x07\x79\x89\xae\x8c\x9f\x1a\xf1\x5c\x45\xf9\x8d\xd0\x75\x05\x45\x70\x90\x70\xe0\xce\x86\xa3\x2b\x11\x52\x66\x90\x57\xd6\x10\xc6\x63\x4c\x1e\xce\xbd\x78\x90\x99\x70\x87\xc0\xef\x70\x4a\x7f\x41\x11\xb0\xc1\x68\x88\x3e\x03\x7f\x22\x69\xac\x86\x8e\x86\x13\x70\x49\x98\x8f\x50\x0e\xfc\xf8\x9d\x53\x02\x7e\x85\x8f\x99\x65\xfa\xb2\x1b\xb5\xc7\x7a\xfa\xb2\x06\x3c\xb7\xda\x1d\x32\xe6\xe6\xdd\x41\x42\x07\x1a\x12\x21\xf1\xdd\xe8\x44\xf4\xa5\x07\x2d\x4f\xf5\x17\x7a\xae\x02\x48\x60\xa5\xed\xae\x00\x3f\x34\x02\xbf\x6a\x50\x02\x1c\x3f\x1d\x5d\x39\x72\xab\x9e\x1e\x56\x80\x48\x53\x5f\xb4\xef\xfd\x30\x95\x3f\xb2\x91\x33\x89\x89\xb7\x96\x79\x06\x0e\x17\x69\x66\xfa\x7b\x53\x00\xe0\x87\xa2\x80\xf2\x16\x3d\xaf\xad\x67\xc0\x22\x71\xc0\x1b\xcf\xfd\x33\x32\x62\x73\xe1\x26\xa1\xb9\x29\xff\x93\x01\x93\x7c\xed\x23\x7f\x91\xea\x02\xdd\xaf\x92\x6d\x6a\xf6\x83\x05\x2b\x82\x43\xf5\xbe\x3a\x28\xc7\x1e\x97\x90\x13\x40\xd8\x9b\xe6\x31\xae\x0d\xda\xb1\x8d\x86\x0b\xfc\xaa\x93\xd3\xfb\xa8\x9c\x87\x4a\x39\x30\xbd\x09\x71\x05\xff\x5c\xaa\x48\xe1\x4c\x01\x13\xd3\x34\x9e\xc6\xa7\x21\xee\xb2\x8b\x9b\xbb\x34\xf4\x2b\x35\xbe\x04\x7d\xd3\x1b\xcf\xc6\x90\x4c\xd7\x2d\x6e\xc0\xd6\xa7\x77\x86\xf4\x7b\xb1\x8f\x65\xcd\xdd\x6d\x50\x2d\x7e\xcd\xfe\x39\x86\x65\xf7\xd9\xaf\xba\x32\xdf\x7e\x17\xbb\x8f\x7f\xbe\x63\xff\x5d\xfc\x7c\xde\xb4\xff\x2e\x7f\x7e\xfe\xfc\x4f\xfb\xef\x8f\xf8\x89\x02\x35\x73\x20\x70\x7c\x09\x04\x8e\xaf\x24\x1c\x0b\x79\x45\x19\x36\xb8\xd4\xbd\xa2\x90\x63\x2c\xb3\x1b\x43\x66\x08\x58\x11\xef\xa9\xda\x8a\x3b\xb0\x7c\x09\x4c\x9c\x03\x42\xd4\x66\xd5\x82\xee\x14\xe3\x39\xed\xb6\xa6\x6c\x7e\xb9\x8a\x74\x1f\x56\x1c\x27\x9d\x99\x01\x93\xdf\x67\x3a\xc3\xe0\x22\x82\x66\x8c\x1a\x47\xb1\xbd\xe7\xa0\x7d\xd4\x2c\x0f\x5f\x3a\x6b\x68\x65\x5f\x3f\x64\x4a\x4d\x84\x54\x48\x31\xb5\x6f\xa9\x85\x6a\x4c\xaf\xf9\xd2\xd8\x89\x09\xa5\x87\x5c\x2b\x5f\x14\x11\xc5\xbf\xbc\x2f\xa1\xea\x6f\x82\x48\x0d\xfa\xdb\xd6\x54\x9e\x0a\x5b\x16\xea\xc1\x33\x1b\xc6\x1c\x88\x50\x57\x13\xf8\xd5\x21\x89\x84\x01\xe1\x5f\xfb\xe3\xd1\xaf\xf2\x6a\x34\xbe\x1b\x8d\x01\xc0\x5c\x5e\x0f\x26\x57\xb7\xbd\xc1\xc7\x89\xec\xdd\xde\x8a\x90\x02\xca\x38\x9f\xd4\x9e\x4d\xf2\xd6\x32\x04\xf4\x71\xa8\xf6\x5c\x92\x78\x3c\x97\x74\xd4\x40\xce\xe0\x53\xc3\xd1\xd4\x3d\x69\x32\xed\x0d\xdd\x63\x45\x94\x3e\x19\x8f\x7e\x19\x4c\xdc\x73\xaf\x46\x43\xca\x07\x7c\xe8\x8f\xfb\x83\x61\x06\x26\xfc\xed\x80\x9f\x16\xa5\x43\xe4\xb8\x3f\xb9\xbf\x85\x34\xcd\xcd\x78\xf4\x11\xa6\xcc\x61\x7f\x78\xd1\xe9\x04\xb2\x18\x83\x09\xbf\xfe\xed\x67\xbf\x44\x6e\x01\x3e\x7d\xe8\xc3\xd3\x39\x23\x32\xc0\xc7\x8f\x7b\x57\xd3\x4c\x4c\x47\xe3\x69\x9c\xf4\x18\xf6\xdf\xdf\x0e\xde\xf7\x87\x57\xfd\x53\x37\xf8\x64\x3a\x1e\x5c\x4d\xc3\xc4\x42\x9a\xe1\x60\x5b\xc4\x60\xf2\x43\x79\x85\xbf\xeb\xfe\x77\x9f\x6d\xb6\xf9\x7c\x7d\xf9\x7b\x2a\x80\xef\xc8\xff\xcb\x9f\x5f\xbc\x6a\xc8\xff\xe7\xe7\x97\xe7\x7f\xca\xff\x3f\xe2\xc7\xe7\x29\x11\xd3\x3e\xa4\x3e\xf2\x88\x84\xc0\x2c\x7d\x09\x32\x49\x16\x6c\x0a\x8c\x60\xb9\xb2\x26\xc6\x72\x0a\x34\xe5\xc1\xd9\xc9\x55\xd8\x56\xa6\x30\xab\x9d\x4e\x90\xbd\x10\x71\x1c\xe1\xc5\xd0\x95\x28\xb0\x2a\xc7\x63\x39\x10\x18\x52\x50\x5a\x43\x98\xa0\x10\xff\x43\x5e\x9e\x9f\x5f\x3a\x89\x09\xb6\x18\xce\xed\x6a\x9d\xcf\xd5\xca\x08\x71\x17\x1a\x1d\xa0\xe8\x14\x02\x94\x5c\x29\x8e\xcd\xd2\x99\xef\x66\x04\xd0\x07\xe0\x18\x38\x90\xd8\x54\x3e\x6a\x1a\xe5\xf9\x86\x59\xe0\x64\x2a\x8d\x1f\x9c\x6b\x0b\xa9\x0e\x30\x92\xdf\x08\xd1\xab\x56\xa6\x2c\xb5\x1c\x2a\xf2\x5e\x6f\xd5\xcc\x69\x1a\x53\xed\xe5\xfb\xca\xec\xb6\xf2\x53\xd7\xfd\x8f\xed\xf6\x8d\x3c\x79\xf5\xfc\xfc\x54\x5e\xbe\xbc\x3c\x7b\xf1\xfc\xe2\x2f\x6f\xe5\x4d\xef\xd7\xf8\x97\x2f\x5f\xff\xe5\xd5\x5b\xa1\xcf\x36\x2a\x2f\xde\xc8\x95\xfb\xce\xbf\x6d\xe6\xb6\xab\xca\xa2\xbb\x32\x5f\x65\xbf\x2b\x6f\x77\xf6\x4b\xfc\x95\x9f\xff\xf2\xf2\xb2\x7d\x1c\x49\xe3\x88\x62\x67\xbf\x24\xc3\x7c\x54\xf5\x5a\x43\xfb\x00\x96\x1c\x5d\x71\x13\xf6\x64\x9e\x43\x19\xe1\x75\xfe\x15\x0b\x4a\x9a\xef\x26\xc2\xbb\x65\xfe\x8f\x83\x5b\xf9\xea\xfc\xc5\xf3\xd7\x42\xbc\x1f\xfd\xd2\x1f\x0f\x3f\xf6\x87\xd3\xc0\x34\x7d\x97\x00\xb2\xe4\x11\x8e\x10\x3a\x69\x8c\x64\x8a\x00\x12\x44\x0b\xc5\x1e\xb1\x92\xf7\xdd\x49\x57\xbe\x77\x4e\x49\x09\x35\xf5\x57\x50\xc7\x3e\xc7\x7a\x2b\xb7\x21\x0d\xff\x3b\x1c\x76\x32\xda\xdf\xa0\x79\xee\x47\x80\x02\x31\x3c\x26\x50\x46\xc3\x20\x3e\xec\x43\x59\x68\x7a\x01\x02\x30\x68\x13\x99\xe9\xb5\x2a\x90\xef\x3e\x5f\x9c\xed\xb6\x40\x8a\x44\xf9\xbc\xaf\x3a\x43\x28\x3e\x03\xca\xdd\x99\x26\xc5\x02\x2a\x5c\x8b\xe0\xc6\x21\xac\x9f\xef\x73\xf7\x79\x56\xf3\xf8\xe9\x14\x78\x3a\x63\xf0\x5f\x4a\xe4\x16\x1e\xe9\x6e\x5b\x70\x71\xdf\x1c\x4a\x6b\xbc\x62\x1b\x93\x11\xe1\x1f\x8b\x8c\x04\xbc\xf2\xee\x10\x33\xe7\x06\x20\x77\x6d\x55\x55\x67\x8c\x99\x3c\x87\x9a\x46\xc8\x00\xba\x3d\x81\xfe\x0a\x43\x70\xfe\xee\xef\x2b\x5d\xce\xbd\x9c\x48\xed\x99\xb0\xcc\x5d\x39\xa4\xcc\xda\xc1\xa7\xdc\x0a\x62\x62\xaf\xf5\x6a\xc3\x9f\xb1\xb8\x76\x49\xbd\x58\x94\x31\x71\x5f\x75\x2e\xb8\x4d\x20\xd9\x05\x35\xb6\x41\xe4\x00\x63\x79\x90\xb2\x53\xd6\xee\x36\xf4\x59\xe4\xdb\x2c\x72\x2f\xe4\xaa\x94\x39\xd6\x73\x5f\x0a\x35\x9f\xef\x2a\x35\x8f\x48\x1d\x4a\x6d\xb1\x93\x0c\x63\x8b\xa5\xa7\x2b\xdb\xc7\x39\x22\xa0\x97\x76\xd6\xf0\xce\x66\x84\x40\x51\x67\xc2\x40\xf9\x37\xf4\xa2\x83\x18\x35\x96\x26\xe7\xb6\x1e\x8a\x20\x2d\x87\x30\x11\x92\x25\xf4\x16\xf8\xa2\xf2\x2d\x9c\x08\x5d\xec\x85\x79\x28\xf5\xc2\x93\x98\x1e\x97\xff\xdd\x67\x1f\xd5\x17\x3d\x28\x17\xfa\xf7\xf3\x01\xbf\x1b\xff\x7f\xd1\xf4\xff\x9e\xbf\x3c\xff\x53\xff\xff\x21\x3f\x7e\xf7\xe5\x75\xec\xbf\xb0\x5e\xbd\xb8\x78\xe6\xfe\xdf\xeb\xbf\xbc\x96\x4d\xaa\xff\xbf\xbc\x96\xb3\xbd\xbc\x5a\xeb\x52\xfe\xff\xe5\x07\x55\x55\xb9\x35\x25\x06\xb1\x4a\x56\x6f\x13\x28\x76\xb7\x4c\xfa\x7f\x30\xc4\x5f\xdc\x10\xa3\x22\xff\xaa\xeb\x3a\x07\xa7\x52\x55\xf3\xb5\xbc\xd2\x6e\x94\x96\xcf\xff\xec\x3e\x3f\xd6\x2b\xac\x1d\xf7\x52\x25\x16\x0c\xaa\xc8\x97\xa6\x2a\x73\x25\x44\x0f\x74\xef\x1b\xa7\xff\xd7\xa6\x5c\xe1\x5c\x4f\xb6\xeb\xf9\xbf\x55\xba\x34\x79\xd5\x9d\xe9\xea\x8b\x2e\xf4\xbe\xab\x17\xbb\x53\x21\x7e\xe8\x5d\xee\x54\x61\x64\xaf\xa8\x4d\x96\x3c\x13\x12\xc3\xdf\xb3\x37\x08\xeb\x35\x69\x0c\x8f\xeb\xdc\x3d\x8f\x42\x6e\x99\x09\xb6\xa5\x3f\xbc\x95\xe5\x02\xdd\xd5\xf0\x7c\xfe\x53\xa5\x05\x95\x73\x62\x4d\x77\xcb\x78\xa1\x65\x90\xf1\x53\xed\x17\x42\x88\x54\x84\xc3\x0c\x56\xa0\x74\xd3\xf2\x61\xf7\xc4\x14\xa2\xb9\x03\xec\x05\x72\xfe\x71\x6c\xb0\x65\x4a\xd1\x24\x04\x63\xb9\x3b\xb7\x3a\x6a\x75\xb2\x0d\x40\x80\xd0\x07\x9d\xdb\x98\xab\x85\xd7\x16\xb1\x3c\xa0\x22\xe7\x10\x67\x28\x69\xa2\x6e\x50\xec\x24\x03\x12\xb9\xae\x85\x85\x15\x4c\xb1\x07\x18\x26\x1e\x2b\x5d\x7b\x8d\x8c\x12\xdd\xae\xf3\xed\x16\x3a\x41\xdd\x7b\xad\x55\xb9\x28\x10\x3c\xd3\xd6\xb6\x2b\xfb\x11\x32\x86\x89\xc1\xc2\xf9\x91\x71\xce\x2a\x46\x14\x4c\x48\x82\x98\x4e\xd1\xa3\x45\xa0\x9a\x8d\x29\x53\xd2\xe0\x48\xfb\xa2\xab\x28\x86\x89\x9b\xaf\x8b\xc2\x36\xba\x46\xa9\x86\x01\xc9\x7b\x9b\x53\xe9\x36\x8f\x78\x74\xb6\xa3\xd3\xe0\xb1\x87\xa2\xc6\x01\x0c\x4c\x57\x11\xfa\x63\x74\xc6\x43\x88\x34\x2e\xc7\x86\x68\x8d\x0f\x4a\xc7\xa9\x9f\x18\x9a\x95\x4e\xb1\x20\x04\xf5\x16\x76\x8e\x34\xac\xaf\x5a\x56\x07\x93\x1e\x73\xa4\xe5\xc3\x99\x35\x3f\x03\xb1\x1e\x6c\xa7\x6e\xee\x19\x91\xef\x23\x4d\x05\xf5\x7e\x44\x71\x75\x2c\x59\x81\x3a\x6d\xfc\x7a\x8a\xcd\x1f\x0e\x03\x23\xc7\x13\x2c\x32\x37\x6e\x31\x92\x3a\xc0\xc5\x43\x42\x41\x6d\x6b\xca\x2c\xc8\xb9\xda\x2a\xcf\x6b\xcf\xb0\xd7\x7e\xbc\x3c\xe2\x49\x63\x7c\xff\x63\xf0\x46\xd1\xa1\x0c\xdb\x11\xaf\x34\x62\x27\x48\x67\xab\x1f\x9c\x63\xe1\x0b\xee\xb1\xcd\x29\x90\x26\x98\x2a\x4a\xc7\xa6\x1d\x45\x95\x66\x54\x40\x3f\xb9\xe6\xd4\x2c\x06\x1f\x0f\x0f\x14\x65\x43\x81\xc5\x80\x9e\x31\x53\xf3\x2f\x69\x81\x3e\x87\xc9\xb6\xed\x39\x62\xd8\x97\xd2\x24\x49\x5d\x24\xed\xab\x9c\x69\x6a\x42\x73\x9a\xe1\xd6\x71\x2b\xda\x4d\xc2\xb8\x8f\x14\x16\x87\xd3\x4c\xd1\xd3\xa9\xd3\x37\x60\x5a\x0a\x90\xca\x96\x3a\x02\x7d\xa3\x23\xed\xfb\xef\x9c\x17\xe8\x3e\xbb\xdb\xd7\x6b\x53\x9e\x5d\x76\xcf\x7f\x2f\x03\xf0\x71\xfb\xef\xf2\xf2\xfc\xe7\xf3\xa6\xfd\xf7\xe2\xfc\xc5\x9f\xf6\xdf\x1f\xf1\x73\xf7\x79\xfa\x61\x34\x0c\x71\xd0\x9b\xd1\xfd\xf0\x1a\x43\xba\xe4\x96\xcb\x5f\xfa\x63\x08\xb5\x5e\x02\x4b\x18\x12\x5e\xd2\x9f\xa0\x06\x1e\x7c\x78\xe8\x36\x44\x4a\x50\x48\x1d\xc2\xa1\x6a\x6d\x32\x3b\xe9\xdc\x4d\x6e\x3a\xa7\xa1\x15\x77\x50\x2e\xf2\xaf\xf9\x62\xa7\x40\x31\x8c\xaa\x95\x2a\xf3\xff\xe2\xcf\x52\x8e\x13\xd2\xee\xa0\xdc\x01\xeb\x8b\x1d\x70\xc0\x1b\x81\x3b\x26\xd2\x70\xfb\x49\x07\x67\xd0\x01\x68\x76\x8f\x00\x25\x23\x04\x28\x0f\x6f\x19\x91\xe7\x2d\xcc\x1c\x38\x80\xb8\xeb\xe8\xb2\x2b\x27\x69\xcc\xa0\xb5\xf9\xaa\xd9\xf3\xe5\x79\x40\x33\x79\x37\xb9\x21\x03\x50\x10\xf2\x06\xbf\x11\x84\xd7\xe2\xe8\x40\xdc\x1a\x9e\x49\x88\x0f\x9c\x25\x01\x82\x24\x0c\x20\x54\xa9\x8a\xfd\x7f\xe9\x4c\xd6\xda\xd6\x99\xf7\xfb\x99\x2b\xb3\xe1\xf1\x3f\x16\xd4\x8a\xc1\x1d\x9a\x4b\xeb\xb7\x52\x15\x06\x11\x5b\x89\xc1\x2d\x1a\xc6\xf7\xe6\xb1\x39\x97\x89\x75\xe0\xc3\x56\xb5\x5b\x84\x9f\x5a\x59\x52\xcb\x05\xfd\x2d\x04\x1a\xbd\x55\x9b\xc9\xbc\xab\xbb\x99\xe8\xa4\x29\xaa\xcb\xf3\xf3\x8b\x0c\xa2\x7d\xf0\xdf\xe7\xf0\xdf\x17\xf0\xdf\x97\xf0\xdf\x57\x8f\x1c\xbe\xb7\xa2\x25\x87\xd5\x01\x15\x54\x69\x67\xe9\xa0\x8e\x7a\xf2\x2b\x0b\x8e\x8c\x38\x8b\x82\x37\x16\x99\x39\x06\x31\xd3\x93\xdf\x73\xfa\xbc\x3d\x04\x2f\xf6\x70\x66\x1e\xd4\x03\x1e\x1c\x3a\x3f\x05\xcd\x8a\x19\xd5\x9c\x01\x05\xb5\x89\x66\x89\xdb\xf6\x00\xc7\x2b\x34\x05\x1f\x6c\x75\x48\x0b\x79\x3d\x8d\x14\x39\xec\x0a\x20\x68\x06\xa1\x06\xf8\x39\x93\xff\x02\x90\x11\x96\x1a\xef\x20\x97\x86\xcb\x82\x3c\x55\x38\xbe\x9c\x55\xb9\x5e\x4a\xbb\xdb\x6c\x22\xac\x24\xae\x82\x80\xd4\x54\x6d\x68\x79\x91\x94\xc1\xdd\x0f\x08\xf4\x41\x91\x27\x2f\xbc\x4f\x5f\xd5\x26\xcc\x03\x12\xec\x92\xdb\xa2\x66\xca\xe6\x16\xbf\xff\xb1\xf7\xd7\xfe\x44\x0c\x47\x72\xdc\xbf\x1b\xf7\x27\xfd\x21\xe6\xa4\x20\x7b\xf5\x78\x52\xab\x2b\xdf\x7d\x96\x9f\x7a\x90\x54\xe9\xff\xda\xfb\x78\x77\xdb\xcf\xe4\xbb\xfb\xa9\xf0\xed\x2a\x30\x52\x16\x1e\x23\x87\x23\xc8\x4d\x45\xa9\xb3\xe1\xe7\xc6\x83\xa3\xe7\x7e\x6e\xcb\x80\x8d\xc6\x69\x02\x6c\xf8\xb9\x25\x05\x86\x8d\x2d\xbd\x29\x37\xdc\xc8\xd1\x8d\x20\x61\x0d\x4d\x46\x6e\x86\x83\xe1\xcd\x78\x30\x7c\xdf\x87\x21\x42\x17\xcc\x67\x09\x11\xfd\x09\xd2\x06\xb8\xa9\x4f\x3e\xf4\xe8\x2b\x49\xbf\x10\x89\xf1\x7e\xda\x9b\x74\x3f\xe9\x8f\xa1\x39\x87\x1e\x47\x73\x14\xa1\x59\x28\xea\x20\x3a\xda\x36\x44\x2d\x3b\xb2\x37\x91\x3d\xca\xbc\x41\x67\x19\xb4\x3a\x41\x4b\x5a\x20\x57\x1e\xbe\xcf\x7c\x87\xcd\xa7\xc1\xc4\xbd\xef\x60\xf8\x9e\x9e\xef\x3b\xa7\xae\xfb\xe3\xc1\x2f\xbd\xe9\xe0\x97\x3e\xf6\xf4\x8d\x6e\x7c\x12\x4d\x3c\x92\x2f\xa3\xcf\x22\x5a\xf5\x11\xba\xe6\x47\x31\xa6\x20\x2b\xad\x42\x44\x74\x56\x69\x35\x5f\x0b\xa2\x53\x6b\x53\x08\x08\x52\x37\x24\xd8\xa5\xbc\x3c\xa2\x1d\xa4\x5d\x2b\x2c\x45\x5c\xb8\x5f\x20\x29\x04\x78\x9b\x70\xc3\x2b\x8d\x0c\x09\xce\xb5\x74\x4f\xc3\x60\x2a\x42\x59\x95\xba\x72\xbf\x86\xf8\xe0\x7f\x9a\x1c\x1a\xa4\x4b\x28\x79\x66\x2d\xec\xb6\xdd\xcd\xca\x4b\xa5\xe4\xdd\x45\x98\x84\x6f\xe8\x05\xfd\xd4\xc2\x02\xef\x46\xaa\x2b\xb5\xd0\x1b\x55\x7d\x41\x34\x0a\xf7\x2f\xec\x03\xc9\x4b\xa1\xc2\x5f\xa5\x65\x45\xa5\xcb\x85\xa9\x2c\x48\x4f\x6c\xfe\xd4\x1c\xe9\x84\x11\xa0\xaf\x94\x6c\x64\x9e\x21\x84\x40\x11\x4c\x8e\xf1\x77\xf6\x88\x71\xf6\x6e\x1f\x80\x96\x08\x67\x95\x60\x96\x1a\x56\x00\x09\x90\x2c\x52\xb2\x5e\x6a\xcd\xb4\x98\x41\xb5\xda\x6c\xff\x1b\x34\x79\x57\xbe\xeb\x8f\xee\xfa\xc3\xee\xd5\xe8\xa3\x4f\x58\x04\xf3\xc7\xdd\x11\xba\x2e\x97\xdd\x73\x21\xf0\xc3\xfc\x2b\xf8\xdf\x93\xd1\xfd\xf8\xaa\xdf\x62\x3a\xb1\x7d\x75\xf1\x44\xfb\xea\x9d\x1e\x6d\x75\xd9\x9d\x9b\x8d\x3c\xe9\xe0\x3f\x3a\xa7\x99\x5c\xab\xaf\x68\x1b\x49\xb3\x5c\xe6\x73\x2d\x54\x2d\x2f\x5e\x9d\xcb\x89\xaa\x54\x6d\x56\x4a\xf6\xbe\xea\x72\xa7\x33\x39\x51\x65\xad\xe4\x55\xa1\x2a\x95\xc9\xab\x9e\x7c\xfd\xf2\xfc\xe5\x85\x67\xd7\x78\xc4\x1c\x13\x4f\x37\xc7\x1a\xd5\x0f\x2d\x36\x98\x78\x92\x0d\x26\x4f\x3a\x6e\x4e\xac\xca\x3b\xa7\x3f\x6e\x94\xe1\x0a\xb1\x6a\x39\x34\xd1\x04\x7d\x20\x0e\xd3\x35\xad\xb4\xb3\x1f\x30\xd3\x44\x9a\xad\xf9\xfb\xcd\x34\xce\xee\x3c\x6e\xa6\xc5\xcb\xf4\x88\xe5\x22\x0e\x8d\x35\x99\x1a\x6b\x6e\xa0\xf6\x35\x03\x84\x0f\x6f\x25\x89\xf8\x89\xd9\x13\x8c\x25\x79\xdc\x58\xa2\xe7\x05\x43\x20\x7d\x9b\x27\x9b\x03\x7c\xef\xbc\xaa\xfe\xcd\x16\x81\x68\x58\x04\xb2\x69\x11\x34\x9f\xf4\x3d\xa3\x40\x44\x46\x41\x5b\x8b\xf5\x0f\x19\x05\x22\x18\x05\x69\x19\xcb\x0f\x98\x06\x2f\x58\xa4\xfd\x46\xeb\x20\x7e\xae\xe0\x29\xff\xdd\x36\x82\x5b\x77\xd0\xfe\x59\x30\x15\xdc\xe7\x62\x63\x21\x79\xf4\x63\xe6\x81\xe0\x1a\x9b\x27\x99\x07\x2f\xff\x40\xf3\xe0\xb8\x29\xe2\x6d\x82\x15\xe4\x47\x99\xdb\x96\x8a\xb3\xb7\x95\xa6\x38\x5a\x5c\xf1\x2b\x48\xa5\x15\xea\xc1\x43\x9d\xd6\xc4\x00\x1c\x92\x13\x59\x04\x67\x33\x37\xe5\xb2\xc8\x91\x39\xda\x7d\x0b\x84\x01\x46\xda\xc4\x3f\xd7\x6e\x21\x51\x70\x68\xba\x88\xc3\x79\x7c\xd7\x74\xa1\xc1\x5a\xac\x17\x01\xed\x6b\xc4\xbc\xfe\xfb\x99\x2f\x4d\x7a\x14\xc4\x34\xea\x24\xf2\xb5\x23\x0b\xb3\x32\x36\x12\x73\xaa\x16\xeb\xba\xde\xbe\x79\xf6\xec\xe1\xe1\xa1\xbb\x85\x4f\x15\x6a\x66\x9d\xce\x7f\x06\x1f\xee\xae\xeb\x4d\xc1\x84\x48\x50\xc4\xad\xe6\x73\xe8\x7d\x5e\xf9\x4e\xee\x40\x3c\x2a\x38\x3e\xcf\x80\xf2\x0f\x7a\x26\xb7\x6a\x45\x68\xca\x4f\x37\xaf\x30\x0f\xc0\x22\xbf\x61\x64\x09\x8c\x31\xff\x5d\x46\xd6\xd5\x70\x3c\x00\x73\x49\x1c\x35\x97\x4e\x96\xa6\x62\xcd\x74\xd1\x7d\x35\xbb\x38\x75\xb2\x7b\x34\x9e\xf6\x86\xd3\x37\xf2\xee\xb6\xdf\x9b\xf4\xe5\xb8\xdf\x43\xe8\x88\x9b\xd1\xed\xed\xe8\x13\x54\x0f\xfa\x11\xae\x7a\xe3\xfe\xcd\xfd\xed\xed\xe7\xae\x10\xef\x3e\xcb\xab\xdb\xc1\xd5\x5f\x41\xcc\x0c\x65\xa7\x77\x75\xd5\xbf\x9b\x76\xe4\x27\x44\x0d\x19\x5e\x0f\xae\x00\xd7\xe3\x5d\xff\x76\xf4\x09\x64\xcd\x3b\x04\x77\x00\x11\x35\x18\x4e\xa6\xbd\xdb\x5b\x94\x51\xa2\xdd\x7f\x71\x93\xcc\xdc\xf1\x56\xf2\x22\x92\x5a\x00\x5d\x31\xee\xcb\x6b\x37\x29\xc0\x44\xf8\xd0\xfb\x85\xde\xf3\x5a\x10\x6e\x46\x1b\x56\x00\x0a\xb1\x80\x78\x12\x96\xa6\xfb\x03\x01\xba\xa8\xc6\x15\xc2\xd1\xbe\x22\x89\x93\xb0\x62\x50\xe6\x75\x8e\xd8\x2e\x87\xc6\xa5\x74\xc6\xe5\x5f\x5e\xbf\x84\xde\xc9\xda\x94\xf2\xd3\x3a\xaf\xb5\xbc\xae\xc0\x44\x1a\x6b\xec\xfd\xf9\xa5\x27\x2f\xcf\x2f\x5e\x5f\x88\x93\x8e\xdb\x58\x67\xa5\xfe\x83\x82\x7e\x22\x36\xf7\x93\x15\x7e\xcc\xe6\x3c\x16\xf7\x13\x89\xcd\x09\xc5\x2d\x95\x2e\xb4\x22\xf6\x73\xc0\xa2\xf3\x17\xb1\x6b\xaa\x15\xa5\x86\x75\x2d\xad\x7b\x6d\x53\xca\xde\x6e\xb5\xb3\xb5\x7c\x91\x89\xcb\xf3\xf3\x73\x1f\x7f\xc4\x13\xfa\x5b\xcc\xd6\x96\x58\x22\x5c\x8e\xc7\x82\x89\x3f\x62\xa6\xfe\x73\xa3\x89\xb0\x2c\x4f\x89\x29\x8a\x63\x66\xaa\x5b\x8c\x36\xdd\x94\x1a\xa9\xc9\xf3\x32\xf1\xdb\x8d\xd4\x1e\xa1\x4f\x00\xf6\x44\x5e\xca\x22\xd7\x3b\x50\xaf\xed\xd3\x88\x84\xa3\x13\xd2\x76\x37\xb3\x75\x5e\x33\xa2\x72\x84\xe7\xa5\xbf\xd5\xf2\xc4\x30\x12\x86\x3b\x15\x7f\xdb\x99\x5a\xdb\xd3\x37\xb2\x73\x78\xba\xb3\xc3\x0a\x6f\x61\x9f\x70\xa8\xf2\xf2\xd8\x44\x49\x5e\xf8\x7f\x0b\xd2\x29\x85\x99\xab\x3a\x80\x0b\xfb\xf3\x1e\xf4\x40\x78\x89\x5d\x99\xff\xcd\x39\x96\x5b\xb7\x84\x88\xb4\xe8\xdb\xc7\x2a\x71\xf2\xa5\x34\x0f\x04\xb4\x09\x79\x71\x7d\xfa\x06\x64\x47\xf7\xf2\xf2\xd9\xc5\xf9\xc5\x45\x73\x0a\x81\x27\x6c\xa6\x29\x01\x4d\x69\x52\x01\x5d\xef\xdf\xf6\xa0\x7f\x75\xf5\xc8\xe4\xee\xc7\xb7\x6f\x48\x85\xae\x17\x45\x17\x9f\xdb\x2d\x75\xfd\x2c\x7e\x72\xe7\x77\x0e\xd5\xe2\x29\xff\x47\x05\x6c\x03\x3c\xcb\x6f\x0b\xda\x22\x02\xb6\xa0\xa3\x1f\xa2\xb6\xd8\xcc\xcf\xfd\xf2\xb5\xa7\xab\x21\xda\xb1\x46\xd8\x16\x5f\x0a\xfd\x07\x10\x48\x07\xd1\x5b\xba\xdb\x4f\x77\xda\x60\x98\xbf\xdf\x65\x93\xa3\x1b\xf1\xa8\xcb\x96\x3e\xe7\x9f\xe6\xb0\x05\xb3\x60\x76\xf1\x83\xb1\x5c\x78\x83\xff\xeb\xdc\xb5\xf8\x85\xff\x71\xee\xda\x1f\x1c\xcd\xfd\x83\xdc\xb5\x5f\xf2\x6a\x95\xff\x5f\xe3\xac\xc1\x79\xfc\xc7\x44\x99\x61\xa8\x7f\x7e\x98\xb9\xc8\xe7\x5f\xa8\xa2\x1b\x7b\x97\xc9\x1f\x98\xed\xea\x1a\x18\x7e\x00\x0c\x84\x64\x29\xd6\xe7\xce\x5a\xdd\x27\x71\x34\x3a\xcd\x17\xa1\x35\x46\xdd\xe2\x3e\x89\xa7\xbb\x4f\x38\x5b\x79\xf5\x69\xd0\xe2\x01\xdc\x8c\xc6\x9c\x41\x3a\xef\xbe\xee\x9e\xcb\xe9\x87\xf1\xe8\xfe\xfd\x07\x79\xd1\xbd\x94\x07\x7d\x80\x17\xf2\x8c\xda\x01\x27\x75\x3e\x5f\x83\x79\xe2\x9b\x01\xec\x7c\x2d\xae\x74\x59\x57\xbb\x8d\xec\x6d\x6c\xad\xab\x85\xda\x64\xd0\xd1\x3d\x84\xb2\x96\x42\x95\x0b\x2a\xda\x21\x60\xfe\x2a\x74\x0c\xde\x35\x37\x3f\x6b\x30\x97\x1c\x30\x75\x36\xdb\x09\x81\x87\x22\xb6\xd9\x05\x83\xe7\x73\xb5\x14\xe8\x57\x2a\xa4\x5b\x6a\x7d\x58\x87\xd9\xc6\xb8\x03\xa5\x4d\x07\xfc\x93\xc4\xf1\xcf\xb7\x98\x6b\x1c\x99\x31\x93\x88\x8d\x88\xdd\x3e\xfe\xa2\x78\xac\x20\xd3\x8f\x49\xd5\x51\x50\x12\xd6\x70\x43\x22\x52\x4e\xc1\xd8\x59\xed\xbb\x21\x79\x37\x4c\x05\xbb\xef\x6e\xda\x2c\xb4\x77\xab\xc5\x57\x5d\xd5\xb9\x45\xb7\x5e\xa0\x15\x01\xb4\x5e\x88\xd1\x4c\x61\x83\x36\x38\xf7\xd0\xcd\x42\xab\x49\xd8\xb7\xf3\xcc\x63\xf1\x6c\xab\x3c\x85\x3e\x15\x62\x32\x1d\x5c\x7d\x00\xe1\xff\xb1\x37\xfd\xd0\xff\xd8\x9b\x0e\x26\x57\x1f\xe4\x55\x7f\x38\x1d\xdf\x7f\x4c\x1b\x0f\x63\xec\x49\x40\xe5\x1b\xf7\xdf\xf7\xc6\xd7\x88\x1d\x39\x98\x88\xe0\x33\x47\x70\x86\xb7\xb7\x3f\x0e\x5d\x99\x89\x18\xe4\x11\xd5\xe8\x77\x26\x1a\x34\x2c\xab\x4c\x56\x93\x62\x30\xbc\x1e\x8c\xfb\x57\xd3\x47\xf5\x25\x68\x3a\xfa\xe7\xa7\x0f\xbd\xe9\x64\xd4\xff\xa5\x3f\x0e\x9d\x88\xf2\x66\x3c\xfa\x28\x18\x0d\xf1\x7e\xd2\xcf\x10\x0a\x71\x04\x3d\x8e\x37\x83\xe9\x24\xb4\x1d\x0e\x86\xb2\x37\x94\xbd\x2b\x4c\x31\xdf\x84\xde\xc3\xa8\xd7\x50\x78\xa0\xc2\xe9\x68\x3c\x1d\x8c\xee\x27\xf4\x85\xac\x89\xe3\x08\xf8\x8d\x6e\x8c\x21\xc2\x60\xe2\xd2\x7b\x33\x65\x2c\x22\x9c\x4e\x1f\x72\xe0\xad\xf8\x27\x35\xab\xff\xf9\xf3\x0f\xff\xe9\x3e\x1b\xdc\xf5\x7e\xd7\xee\xff\xef\xd6\xff\x5d\xbc\x7c\xfe\x73\xb3\xff\xff\xf2\xc5\xab\x3f\xeb\xff\xfe\x88\x9f\xc1\x5d\x4f\xde\x98\xe0\xf7\x46\x86\xe3\xd7\x8b\xee\x39\x76\x85\xde\x12\x1f\x10\xab\x4c\x1b\x23\x30\x2d\x3c\x4e\xc8\x89\xb2\x11\x94\x8c\xec\x55\x75\x3e\x2f\xb4\xbc\x90\x33\x5d\x98\x87\xd3\x76\x56\x36\x40\xf0\x23\x70\x22\xff\xe8\x93\x8e\x9f\x46\xe7\x14\xdb\xeb\x93\x1e\xcd\x9a\xb0\xcd\xdb\xf9\x47\xd2\x69\x65\xec\x80\xc7\x8c\x41\x07\x94\x61\x91\xa9\x0a\xc5\xe1\x63\x5f\x09\xff\x9d\xb7\x82\x92\x5f\x8c\xed\xe0\xb2\xf8\x6f\xfe\x64\x45\x0b\xd1\x54\xb0\xd6\x84\x08\x63\x9d\x5c\x07\x7a\xde\x53\x08\xe3\x76\xae\xf3\x55\x5e\xab\x02\x77\x87\xde\xa5\x43\xd6\xfc\x46\xab\x12\x59\x04\xb1\x65\x6f\xeb\x21\x5e\x98\xb0\x98\xbb\xd0\x16\x98\x8e\x86\xf7\x8c\x02\x79\x4b\x53\xd6\x16\x83\x92\x9d\xe6\x82\x35\x1e\xd2\x36\x0f\xde\x32\x6f\xa8\xf2\x09\x11\x11\x3a\x51\xfc\xa6\xcf\xdd\x0b\x51\xc1\xfb\x0f\x3c\x06\x1d\x95\x05\xb3\x76\xdb\x5d\x51\x83\x93\xd2\x80\x6c\x09\x60\x52\x80\xd9\x02\xff\xab\xd2\xc0\x0d\xe1\x19\x98\x3c\x01\x07\xd4\xcd\xa3\xd1\x58\x1b\x86\x8d\xa0\x7e\x84\x04\x37\xe7\xf0\x20\xa1\x5f\x07\xc5\x6f\x40\xfc\xa4\x00\xdf\x5f\x57\x5a\x1c\x99\x7f\xa9\x1f\x8a\xbd\x7f\x8b\x99\x73\xb7\xea\x2a\xd7\x5f\x91\xee\x1d\x39\xa0\x3c\x72\x24\x52\xd6\x8a\x27\xcc\xc4\xfd\xb9\xbf\x99\xe9\x85\xb3\x5e\xdd\x03\x2d\xf3\xdd\xf2\x2c\xae\xc9\x92\x14\x37\x39\x03\xd8\x9b\xaa\x15\xf0\x26\xf0\x80\xc0\xcc\x80\x6c\x30\x9d\x18\xc6\x7a\xfc\x79\xbc\x42\x0e\xeb\x64\xfb\xbc\xcf\x15\x6c\x6a\xf0\xcd\x80\xaf\xd6\x13\x5b\xbb\x11\x81\xf9\x9a\x46\x5a\xa8\x5a\x65\x11\x4e\x96\xfb\xa6\x61\x8e\x6c\xe7\x0d\xc4\x8c\x23\xb6\x76\x5e\xfd\x36\x9f\x3b\x07\xd4\x66\x72\xfa\x8b\xf0\x9c\xb4\x9e\x3f\x67\x56\x19\xb5\x98\x2b\x68\x1a\xe7\x81\xb8\xd1\x08\x27\x48\x6c\x30\x04\x54\x32\x5f\xab\x4a\xcd\x6b\x5d\x89\x5a\x7f\xab\xb3\x68\xf8\xed\xda\xd4\x4c\x10\x22\xf3\x8d\x5a\xb9\x5f\xf2\xbf\xed\x7e\x33\x33\x85\xe5\xa9\x21\x9a\xd3\x17\x8d\x31\x9a\x4e\x73\x0f\xa4\xdb\x83\xc6\x69\xbf\xbb\xbe\x41\x70\x20\x3f\xf5\xc6\xf2\x8a\xe8\xd0\x7c\x55\x55\x6e\x76\x91\x0b\xe4\x5f\x3c\x67\xce\xd9\x47\x0f\xb0\xe0\x63\x33\xd3\x73\xb3\xd1\x56\x6a\x3e\x3b\xc8\x8d\x11\xa2\xe5\x1e\xe7\x8b\xfb\x19\x58\x5e\x30\x10\x93\x29\x6b\x71\xd2\x49\xcf\x9e\x93\xd0\x8d\xd3\xa8\x98\x7f\x9e\xfb\x60\x1a\x63\xf9\x75\xb7\x82\x01\x01\x42\xe3\x43\xeb\xfa\xc1\xd9\xcd\x23\x8a\xdd\x3d\x3c\x84\xdf\x04\xa9\x22\x43\xa8\x23\xb0\x79\x84\x0e\x1b\x63\xb9\x64\xb5\xf5\xb2\x66\x34\x36\x06\xc0\x05\x4c\x7f\x19\x89\xcc\x64\xda\xd2\xec\x6a\x8b\x90\x52\x44\x01\xfa\xd8\xe4\x91\xc9\xe0\x55\x57\x76\xb8\x7d\x9e\x8f\x83\x27\x35\xe6\x90\x36\xc7\x71\x62\xe1\xf9\x73\x57\x76\xc6\x91\xe6\x83\x13\x3d\x82\x53\xd3\xff\xb6\x2d\x0c\x81\xc8\x25\x47\x2c\xed\x4e\xab\x2b\x55\xda\xa5\xae\xb2\x84\xe9\x26\x03\xdc\x68\x9d\x71\x54\x19\x3e\x45\x3e\x5c\xc6\xcc\x2b\x24\x62\xf5\x37\x20\x74\x24\x71\xeb\x25\x68\x4a\xb3\xa6\xa3\xd9\x60\x48\xa5\xe3\xb5\x61\x7a\x01\x5a\x3a\xfd\x5a\x05\x5d\x9b\x82\x8e\x45\x86\x67\x99\x7f\x7c\x18\x92\x8e\x7e\x32\x91\xee\xbd\x94\x27\xef\x21\x24\x15\x42\x44\xa7\x0d\xab\x87\x72\x6d\x14\x82\x0f\x96\x81\x8a\x73\x69\x5c\x83\xd5\x7c\x36\xc7\xdb\x99\x4e\x32\x90\x00\xe5\x25\x25\xed\xc1\x3e\x00\x19\x0d\x00\xdf\x74\xd7\x42\x94\x4f\x5a\x5d\xbb\xa3\x58\xaf\xc5\xe1\xf1\x88\x18\xb6\xa3\xa7\xc4\xf6\x4d\xb1\xf7\x01\xc2\x16\x99\xe0\xef\x0c\x70\xb1\x35\xd4\x39\xe4\x46\x4a\x43\xf1\xb6\xdc\x36\x1e\xee\xa9\xa8\x20\x3d\x41\x67\x0c\xc3\x8a\x10\x06\xc1\xe0\x62\x28\x49\x38\xd8\x97\xb6\x67\x46\x34\xb4\x1c\x6a\x80\x10\xae\x5f\x04\xca\x78\xb0\x56\x3f\x7c\x14\x04\xf7\x38\x56\x98\x89\x10\x46\xcc\xa2\x98\xa0\x84\x40\x62\x73\x4f\x39\x85\x1e\x6f\xb3\x47\x23\x44\x30\xe0\x16\x6d\x8c\x3b\x1c\x08\x80\xf8\x96\x63\xe8\x8e\x4f\x86\xc5\x40\xe6\xc1\xa6\x1f\xdb\xec\x56\x59\x70\xd9\x36\xbb\x63\x67\x2f\x7b\x54\xf3\xbb\xc3\xb4\xad\x72\x28\x0c\x89\x49\xe8\xdd\x73\x1b\xda\x88\xe0\x1e\x08\x3d\x81\xac\x06\x2f\x0d\x21\x8b\x09\x2c\x76\x91\x26\x7c\xde\x36\xd1\xb9\x29\x9d\x4c\x92\x4f\x90\x66\xe1\x1a\xc0\x0c\x45\x98\xa1\xfb\x7c\x73\x7e\xac\x2d\x8f\x2e\xaf\x9e\x6b\x10\x18\x77\x8c\xe4\x95\x09\xe4\x6f\xdd\x6c\x9c\x57\x80\x65\x08\xa5\x29\xcf\xa2\xdf\x50\x2c\xd1\x7a\x60\x9a\x72\xef\x9b\x88\x37\x7a\x91\xab\x20\x88\xc4\x6c\x07\x51\xbf\x98\xaa\x33\x36\x46\x00\x22\x62\xb3\x2b\xd9\xe8\x72\x23\xb2\x5a\xaf\x34\x57\xee\xc0\xa0\x68\x6e\x11\x77\x62\x58\x3e\xfd\x0d\xb0\x4c\xec\x13\x0d\x3f\x54\x9a\xb5\x11\x1c\xeb\x97\x0d\xf3\x3b\xc3\x0c\x60\xe3\xb7\x41\x1c\xb4\xa5\x95\x05\x3b\x31\x2a\x3a\x91\x2f\x5b\x26\x4b\xe5\x03\x36\xdd\x68\x53\x1d\xd9\x67\x3f\x7d\x91\x4e\xdf\xeb\xfb\xc6\x3b\x1f\x33\x8b\x13\xb3\x03\xf6\x17\x3d\x1f\xce\x0a\x37\x4f\x0d\xd9\x14\xb8\x10\xed\x0b\xb8\xd6\xf8\x77\x11\x5e\x0e\x97\x88\x18\x97\x3d\x5f\xed\x11\x3e\xd2\x58\x56\xfa\x64\x8b\x13\x97\x48\x04\x3f\x4f\x0a\x02\x9b\xd7\xc5\xd7\x67\x1c\x79\x5d\x8b\x0c\x84\x2d\x57\x1b\x42\xc7\x2c\x90\x91\x57\x8e\x68\xae\x3d\x2e\x0c\x69\xfb\x94\x01\xf6\x80\x78\x58\x1c\x3c\x15\x9a\xeb\xa3\xdc\x89\x7c\xf2\x3d\x12\x27\x9d\x71\x34\x7c\xe7\x34\xfb\x51\x71\xc8\x4a\xfb\xb9\xf0\xf7\x58\x5e\x72\x7e\xee\x40\xd8\xc0\xc9\xcf\x1a\xe8\x4e\x6c\xb4\x8f\x13\xa6\x12\xbe\x07\xa2\x69\x78\x70\xac\x02\x5a\xe6\x17\xd4\x8c\xce\xd6\x71\x73\x6d\xde\x44\x45\xd5\x40\x2e\x99\xda\x0b\x78\x70\xb0\x6e\xe2\x69\xaf\x19\xc4\x95\xb8\x70\x9e\x66\x19\x4f\xdb\x9f\xea\xf4\x0a\x47\xb6\xcd\x73\x79\x32\x0e\x34\xca\x64\xd6\xb0\xcd\xc2\x35\x81\x1e\x91\x8b\x45\x24\x7f\xfb\x98\x28\xf0\x85\x1f\x22\xe6\x68\x7e\x03\x9a\x73\xb0\x3c\x94\x34\xee\x90\xc6\xab\xbd\x70\x07\xc2\xee\x9c\xcd\x55\x9b\xf0\x86\xf2\x05\x48\xc5\x9f\x99\x5d\xf0\x60\x42\x59\xa3\xec\x24\x4a\x89\x71\x7f\xff\x46\xd7\xf2\x8d\x10\x27\x17\xa7\x32\x45\x33\xf3\xd8\x09\x85\x35\x8d\xc9\xd4\x66\x85\x9d\xd8\xfe\xf4\x35\x25\xa5\xd3\x6c\x33\xdd\x44\x56\x34\x88\x3c\x8c\x09\x40\x67\xd5\x82\x5c\xda\xa8\xbc\x40\x51\x3e\x5f\xab\x32\xb7\xe8\xa4\xe9\x6f\xd8\x03\x87\x69\x2a\xc4\x96\x40\xc9\xe6\xf3\xa2\xce\xea\xd1\x58\x1b\x57\x9b\x1a\x70\x40\x2c\x8a\xba\xad\xb1\xb5\x5a\xe9\x4c\xda\xda\x54\x6a\xa5\x41\x4d\xec\x36\x22\x01\x9a\x58\x6a\x20\x63\x90\xfc\x73\xa2\x4e\x1b\xa8\xe0\x8d\xb7\x02\x46\x19\x21\x4e\x66\xa7\x68\x38\x06\x58\x05\x70\x00\x23\xf7\x93\x1d\x3f\x46\xdc\x72\x8f\xf3\xad\xf4\x25\xb5\xbd\xef\x2a\xab\x9d\x7a\x80\xef\x1d\x39\x99\x94\x25\x53\xa5\x4f\x4d\xb9\xe5\x60\x01\x9a\xc8\xaf\xf6\x39\x23\xc7\x72\xb9\xef\x0a\x71\x72\x79\x4a\x2c\x3c\x09\x4b\x7e\x73\x7b\x69\x63\x20\x1a\x41\xa8\x1d\x4c\x21\x4e\xeb\x22\x0e\x26\x69\x38\x76\xd4\xfa\x0e\xfe\x94\x1c\x3a\x19\x79\x65\x6b\xe1\x0b\x07\x5b\x78\x48\x11\x0e\x7b\xc4\x48\x2f\x1c\x08\x3b\x25\x66\x4c\x9c\x2b\x15\x60\xd5\x86\x4b\xdf\x80\x9d\x72\xb9\xd4\x15\xe0\xad\xa1\x7b\xce\x20\xd7\xcd\xb1\x32\xb4\xdf\x6c\x5d\xed\x08\x0f\xdb\x6a\x28\x2d\x13\x4e\x45\x28\x77\x41\xd6\x66\xf1\xe4\x77\x6c\x0e\xef\x16\xfe\xf9\x69\x53\xd6\xba\xbb\x15\x60\x8f\x0f\x87\x6b\xca\xd2\x34\x9f\x2d\xda\x22\xa3\x27\x2f\x4e\xe5\xd0\x80\x7b\xc7\x06\x2e\xd6\x58\x79\x10\x57\xce\x87\x1e\xd3\x8c\x9e\x20\x45\xa0\xe5\x0f\x27\x18\xbf\x54\x05\x2c\xf3\x23\x97\xc3\xcd\xe0\xe5\x29\xc4\x9d\x7d\xa1\x08\xa6\xe7\x7f\x48\x08\x28\xbe\xaa\x11\x97\x79\x03\x4e\x23\x82\xd0\xf0\x82\x90\x4e\x40\xd0\x25\x5f\x75\x35\x53\x75\xbe\xc9\xe4\x6c\x2f\xb8\x96\x6c\x0f\xf0\xd6\x9c\xb9\x05\xf8\x6b\x70\x0f\x88\xaa\x34\xec\x4f\x7c\x1f\x8e\xf8\xc7\xad\x02\x59\xbc\x0a\x36\x78\xab\x28\x6e\x6a\xb6\x8d\xd6\x75\x1c\x7f\x0a\x8a\x22\xec\xb6\x97\x51\x2c\xa3\x53\x9d\x0d\xe0\xfc\x20\x2a\xbf\xbb\xc9\x5d\x3f\xd2\xe5\xb1\x91\x90\xac\x26\xb1\x6f\x3c\x22\x79\xeb\x80\x47\x0e\x37\xd1\x7b\xa9\x14\x5d\x27\x98\x76\x47\xdc\x5b\xf2\x82\x3e\xc4\xec\x94\x77\xe3\xd1\xfb\x71\xef\xa3\x1c\x78\xd2\x47\x60\xb2\x43\x92\x3a\xf7\x99\xd1\xd8\x97\xc7\xf5\x86\xd7\x90\x40\xf6\xe4\x8e\x22\x14\xbd\x85\xd2\xb4\xc0\xb2\x78\xf0\x90\xb8\xd4\x2a\xfc\xfa\xbb\xbc\x90\x69\x42\x7d\x3a\x98\xde\xf6\x33\x39\x1c\x0d\xcf\xb8\x46\xed\x63\x7f\x38\xcd\x9a\x99\xf6\x4c\x34\x2b\xe2\xda\x81\x7d\xc7\xfd\x08\x54\x37\xe5\x5d\xc4\x94\xfc\xf4\x43\x5f\xf8\xb5\x38\x4c\xc0\x63\xd6\x3d\x93\x9c\x7f\xcf\xda\xab\xd8\x80\xc9\xf3\xba\x7f\x9d\x89\xfe\xaf\xfd\x8f\x77\xb7\xc0\xf2\x79\x34\x55\x1f\x80\x7b\xb3\x16\xba\xc2\xb7\x6e\xe9\xae\xee\xc7\xf0\xe2\x02\x00\x78\xdf\x4d\xa6\x83\xe9\xbd\xfb\xf3\xfb\xd1\xe8\x1a\x72\xfd\xc8\x33\xd9\x7f\x7b\xc0\x9c\x08\x68\xc3\x93\xcf\x93\x69\xff\x23\x13\x13\xbe\x85\x4a\x3a\x41\x44\x94\xf7\x77\x9c\xd3\xef\xff\x3a\x98\x40\x5d\x40\x54\x05\xe0\xf6\x0c\x3e\x3f\xe5\x9a\x80\xd3\x4c\x7e\x18\x7d\x82\x4a\x02\xe0\x42\x75\xc7\xe4\x5a\x8c\x86\x54\x3b\xd8\x1f\x8d\xa1\x62\x31\x02\x1b\x8e\x6a\x08\x42\xd9\x40\x13\x93\x18\x8a\x15\x47\xe3\xa9\x68\x85\x31\x4e\x3a\xb4\x4f\x63\x10\x64\x24\x4d\xf9\x1c\x33\x44\x52\x63\x04\x16\x5e\x0a\xa8\x6b\x70\xbf\x1e\xf7\xef\xc6\xa3\xeb\xfb\x2b\xee\x92\x1f\x31\x79\xe9\xed\x88\x81\xa4\x3d\x63\x63\xeb\x59\x16\x8d\xb3\x8c\xf5\x95\x7d\xd9\xff\xb5\x3f\xbe\x1a\x60\x7d\x25\x94\x72\x42\xd1\xa4\x7c\xef\xce\x31\x61\x43\xdf\x0f\x81\x86\xb3\x51\x63\x28\x9e\x82\xb0\xec\x1c\xf2\x24\x22\x98\xb3\x8f\x57\x9a\xc8\xf1\x43\xb5\x6a\xb7\x06\x41\x62\x21\x0c\xa5\xe7\xeb\x12\x10\xa5\xfe\xb6\xd3\x96\xf4\x9d\x53\x64\x4e\x01\x80\x3f\x16\xb2\xaa\x51\x20\x75\x67\xc1\x6d\x83\xc2\x20\x82\x91\x2a\x75\x83\x9d\x81\x42\x52\x18\x9f\x15\xa4\x21\x51\x2c\x3f\x39\xb8\xd2\x92\x58\x6a\xda\x43\x96\x6b\x96\x23\xbf\xe2\x85\x3c\x99\x52\x41\x25\x0d\xe6\x65\xe1\xa9\x0f\xa0\x39\x5d\xdf\x22\x2b\xd9\xab\x58\xe5\x65\x30\x63\x80\x26\xdc\x2c\x31\x8a\xbb\xad\xd9\x34\x3b\x98\x1e\x59\xa3\x51\x08\xb6\x5c\xd0\x88\x73\x53\xd6\x79\xb9\x03\x5e\x21\x20\xb9\x51\x8d\x74\xac\xc0\xb6\x00\x1b\xaa\x9f\x0f\x86\xa7\x18\xcf\x83\xda\xa3\x2a\x1d\x9a\xda\x2d\xb7\xad\x55\xe9\x89\x5c\xbc\xcf\xd6\x0c\xd4\xb5\x47\x99\xb8\x51\x16\x8b\xcb\x69\xd9\xb1\xe6\x94\x71\xa6\x1e\x89\xf7\x1e\x86\x00\x45\x73\x09\xb2\xf6\x05\x3e\x56\xfe\xca\xd1\x02\x55\xee\x05\x23\x9a\x51\xfd\x3b\xa4\x33\xcd\x12\xd7\xa6\x0e\xfb\xdb\x54\xf6\xac\x5d\xe9\xc8\x51\x4c\x4f\xfc\x7d\xc7\xee\xd0\x6d\x7c\x23\xd2\x02\xbd\xe6\xb4\xe8\x45\x41\xcf\x03\x93\x66\x88\x06\x7b\xd0\x55\xbc\x4d\xf1\x11\x98\xeb\xdc\x13\x5a\xb7\x4d\xa3\xcd\x7e\x85\x63\x0a\x8f\x0f\x23\x3d\xac\x0d\x6d\xa3\x5e\x1c\x4f\xec\xbf\x94\x27\x08\x73\xeb\x1e\x79\xab\x1e\xf0\x76\x0c\xee\x7a\x3f\x40\xb5\x9f\xb2\xf8\xbb\xcd\xc2\xd0\x11\x90\xa8\xe3\xfe\x37\x77\xc7\x02\xd7\xa0\xf4\xa0\xba\xc9\xf9\xa0\xb0\xb9\xdd\xcd\x10\xa9\x2c\x22\x8b\xc7\xdd\x49\x42\x56\x50\xb8\x9a\xf1\x26\xf3\xca\x3d\x61\xaf\x85\x59\x82\x70\x6b\x09\x58\x3c\x69\xfb\xbb\x34\xe6\x46\xd5\x10\x49\x0f\x94\xf3\xb9\x8f\xc3\x1c\x8b\x50\x84\x62\xd6\x5b\x2c\xb1\xfe\x9f\x6a\xab\xca\xd0\x8d\x24\x20\x10\xa7\x17\x40\xa2\x20\x91\x86\x7c\xb5\xa3\x42\x68\xff\x79\x34\x30\x2f\x0f\xda\x53\xfc\x53\xa1\xf2\xa3\xda\x25\x3c\x52\x30\x62\x18\xe1\x9f\x5d\xde\xf3\xdd\x9f\xee\xb3\x5b\x55\xeb\x6f\x97\xfa\x77\xac\x01\xfb\x1e\xff\xcb\xf3\xf3\xcb\x26\xfe\xdb\xc5\xe5\xcb\x3f\xeb\xbf\xfe\x88\x9f\x14\x62\xf7\xf2\xfc\xfc\x67\x00\xd1\xfa\x0b\xfc\xf7\xb5\xfb\xef\xc5\xb9\xfc\xab\xaa\x0a\xf9\x4e\x57\xd5\xbe\x15\xc4\x17\x18\x63\x10\x82\xeb\x67\x39\xa9\xf5\x76\xad\x4b\xf9\x3e\x2f\x36\xa6\xd2\x2d\x5f\x70\x1f\x8d\x88\x66\xa6\xa6\xb2\xb5\x2e\xe5\x47\x55\xd5\x79\x69\x75\xf9\x18\xba\x68\x1b\x72\x2e\x7b\xc7\x0d\xe4\x5c\xb9\x51\xe5\x4e\x15\xb1\x16\xf9\x61\xcc\x5c\x19\x30\x73\x4d\x29\x42\xf5\xf7\x63\x53\x04\x1f\xb1\x31\xc5\x56\x24\xd4\x78\x92\xad\xc8\xa7\x4b\x53\x25\x2f\x87\x2d\x06\x87\x65\xeb\x04\x79\xea\x89\xcc\x04\x43\x8b\x42\x7b\x57\x03\xed\xb2\xa5\x08\xef\x51\x28\x54\xc1\x68\xa2\xa6\x7c\x14\xf7\xb5\xed\xb5\x21\xc5\x10\x89\xd5\xe8\x8d\x65\x5e\xd6\x46\xa8\x12\x35\x74\xa1\xca\xd5\x0e\x62\x9c\x61\x7a\xcc\xd2\x93\x2c\xc7\xc1\x42\xfe\x5f\x20\x62\xff\x5b\xff\x74\x9f\x9d\xbf\x9b\x5c\xff\xbe\x05\xc0\xdf\x93\xff\x97\x97\x2f\x9a\xf5\xbf\xcf\x2f\xfe\xc4\xff\xfc\x43\x7e\x0e\xe4\xff\x2b\x80\x58\x37\x33\x79\x0b\x3d\xb3\x7b\xf9\x2f\x95\x99\xfd\x5b\x81\xff\xe8\x96\xba\xfe\xd7\xa7\x35\xf0\x3c\x8b\xcb\x73\x9b\x3d\x3c\x8d\x6e\x1d\xd1\x2c\x53\x68\xed\xd8\xe9\x0a\x91\x60\xdd\xc4\x21\xb4\x38\x64\xe6\x3e\xd4\xbb\x9f\x7e\xc0\x36\xc4\xe3\x7d\x26\x22\xed\x33\x89\x06\xfe\xf1\x36\x13\x11\xb5\x99\x1c\x89\x69\xf1\x9c\x8e\xb7\x94\x70\x68\x4b\x84\xd0\xd6\x9f\xbd\x25\x7f\xfe\xfc\xae\x3f\xdd\x67\xb7\xef\xef\x6e\xcf\x2e\xbb\x17\x67\xa6\x3a\x73\x5e\x51\xf5\x0f\x57\x06\x8f\xcb\xff\x57\x97\x2f\x5e\x35\xed\xff\x17\x2f\x2e\xfe\xec\xff\xf8\x43\x7e\xde\x0f\xef\xe5\x6d\x7f\x32\xe9\x8f\xe5\xfb\xfe\xb0\x3f\xee\xdd\xca\xbb\xfb\x77\xb7\x83\xab\xc0\xca\xf4\x0b\x53\x6f\x77\x2f\x32\x79\xa3\x67\xd5\x4e\x55\x7b\x67\xbb\xbf\x6e\xb1\xed\x2f\xc0\xaa\x7f\xfd\x1d\xea\x68\x21\x5e\x5e\xc8\x9b\x4a\x95\x5f\x8a\xbc\x94\x93\xba\xd2\xba\xce\xe4\x4d\xbe\xac\xd7\xf2\xa6\x30\xa6\x3a\xe0\x8f\x3e\x3f\xbb\x78\x7e\x7e\x21\x81\x5e\xa3\xff\x55\x57\x50\x3f\xca\x66\x7b\xfd\x88\x0d\x7a\xcc\x3b\x60\xb4\x3e\xee\xb9\x44\x7e\x59\xc8\x3d\x41\xb9\x64\x60\xc1\x40\x26\x8b\xae\x10\xff\x1b\x02\x01\xb9\xa5\x32\xe9\xca\xd6\x01\x26\xa6\xc1\x58\x7b\xab\xad\xd5\x95\x7c\x7f\x77\xdb\x95\x83\x9a\xf1\xed\x77\x50\x1b\x0d\xdf\x17\x76\x07\xc8\x36\xd8\x7f\x50\x13\xc1\xef\x6d\x3e\xab\xdc\xe2\xa6\x04\xbf\x59\x60\x3f\xcf\xe4\x1a\xb2\xc0\xee\x0b\x1c\xb6\xa1\xba\xc3\xcb\xee\x45\xf7\xff\x08\x71\x57\x69\xb5\x99\x15\x3a\x29\xf6\x60\xe3\xd9\xd6\x29\xb3\xe6\x42\xdb\x7c\x55\xe2\xe2\xd5\xe0\x5a\x3d\xa8\x3d\x72\xda\x2e\x2b\xad\x17\x06\xd2\xe1\x76\xad\x2a\x6c\x66\xa5\xd4\x5c\x5e\x13\x68\x54\x59\x57\xca\x52\x08\xea\x38\x41\x31\xd6\x83\x73\xad\xa8\xac\x8d\x58\xed\x14\xe8\x74\xdd\xfe\x2c\x19\x3d\x2b\x21\xa4\x3f\x3b\x63\x1f\xd0\xee\x2a\xac\x4f\x8a\xb9\x2f\xe1\xb3\xcc\x7e\x4c\x34\x49\x95\x67\xc9\x2c\x78\x35\xe3\x0d\x6a\x9d\x70\x86\x2c\x9c\xd8\x93\x6d\xcd\x46\x33\x3f\x79\xb1\x17\xb8\x64\x10\x3d\x0a\xf5\xf8\x6a\xfe\x45\xad\xb4\x3d\x3b\xab\xf7\x5b\x0a\xb9\x16\xb0\x95\xb9\xfb\x25\x6d\xf0\xb1\x2b\x21\x02\x27\x33\xf2\x15\x58\x28\x8c\x5e\xe8\x79\xbe\xf0\xa5\xc5\x6e\xc9\x3f\x13\x19\x3f\xfe\x5b\xd6\xc6\xe0\xa1\x7d\x70\xcb\xb1\x5a\x69\x5b\x8b\xbd\xd9\xd1\xc9\xac\xd7\x79\xf9\x45\xce\x55\xa5\x97\x3b\x37\x1f\x35\x73\x86\x15\xb3\x0e\x24\x7d\x57\x14\xf6\x84\x22\x44\x77\xfa\x68\x51\x44\x93\x66\x1a\x0f\xfe\x4c\xd7\x40\x4e\x56\x57\xaa\xd6\xab\xbd\x9f\x60\xd9\x24\x30\x98\x43\x6d\x39\x32\xbb\x52\x3b\xbd\xfe\xb6\x2d\x14\x13\xa4\x43\xff\x54\x57\x88\x4f\x6b\x5d\xc2\x3b\x6c\xb5\xfa\xe2\x6e\x43\xb2\xe5\x99\xfb\x13\x02\x74\x2f\x75\x55\x51\xbe\x9b\x4f\x0c\x50\x2c\xe8\x0c\x2e\xea\xb6\xca\xe7\xba\x2b\x46\xbb\x63\xdb\x6a\x0f\xce\x7c\x7c\x94\x14\xb2\x4b\x43\x5d\x1f\x5c\x70\x7c\x84\x48\x39\x4d\x82\x14\x49\x66\x29\x4f\xe8\xc8\x56\xab\x88\x50\x86\x4b\x8d\x73\x60\xa5\x16\x0f\xb9\x5d\x9f\xbe\x0d\x8f\xa2\x9a\xf5\x84\xe4\xc5\x54\xb0\xc5\x2b\x5d\x83\x08\x42\x3a\xeb\x07\x55\xba\x7f\x86\xaf\x0a\xf7\x99\x28\x4f\x9e\x34\xc7\xbb\xdd\xd8\xe6\x9a\x60\x0f\x72\x08\xe3\x96\xfa\x01\x27\xcc\xad\x23\x6f\x7d\x77\xb9\x60\x4e\x6d\x6c\xf9\xe1\xc0\xc2\x9e\x0e\xdb\x02\x42\xaa\x48\x68\x5d\xae\xe0\x32\x01\xa1\x76\xad\xe7\x35\xde\x5e\x0c\xb9\xc3\x3e\x95\x3a\x5a\xd7\xb8\x3a\x0c\xc7\x5c\x9a\x6a\x96\x47\xd2\xd9\x54\x00\x1a\xb7\xd0\x25\x08\x1d\x7a\x10\x87\xf0\x2b\x48\xa2\xd9\x2f\xf8\x27\xe3\xf6\x89\x1a\xd9\xe2\xcf\x41\xb2\xc9\xa6\x4f\x13\x1c\x78\x80\xeb\x33\xc7\x1e\xf7\x94\xc5\x2d\x27\x99\xe8\xc6\xa6\x55\x6e\xdb\x65\x81\x15\xcd\x28\x95\x4d\xc5\x1f\xa5\x2a\x82\xbc\xee\x0a\x71\x63\x2a\xa9\xbf\xa9\xcd\xb6\xd0\xd9\x63\x43\xc9\x68\xa8\xcc\x5f\xc4\x55\xa5\xea\xdc\x12\x29\x88\x50\xce\xf3\x89\x28\xc8\x57\x39\x1d\xc6\xa8\x6c\x89\xcb\xd0\x69\x99\x08\xcf\x4f\xae\xdc\xb9\xdd\x9b\x5d\xe0\x8e\x17\x8d\xd3\x5d\xaf\xf5\x3e\x43\xa9\xc1\x27\x2f\x3a\x6d\x75\x83\xe2\x87\xa9\xd4\x8b\xbc\xfc\x22\x22\xc6\x78\x9f\x7f\xf4\xaf\xe2\x67\xcb\x79\x4c\x66\xc3\x93\x06\xa3\xf2\x48\xf2\x8f\xb1\x79\x11\xde\x24\x93\xd6\x84\x99\xc1\x44\x2a\xed\x1e\xe7\xfe\xbd\x39\x78\x10\xd1\x2d\x13\xd6\x10\x61\xca\x0b\x4f\xa6\x4f\x9f\x81\x58\xbe\x9b\x00\x56\xe0\x20\x39\xf3\x22\xcc\xd1\xae\xb1\xf6\x72\xc3\xa7\x1a\xab\x3b\x61\x94\xbd\xf8\x52\xe2\x5f\xf3\xca\x53\xe7\x89\x4f\xba\xed\xb8\x13\xe3\x8f\xac\x1f\xcc\x99\xad\xf5\x96\x2a\xab\xde\x40\x5d\xcb\x43\x1c\x68\x8c\xd7\x0a\x44\xfd\xc9\x25\x7c\xc2\x2c\x97\xba\xa2\x63\x1f\x6b\x27\xac\x0b\x5c\x41\x33\x0b\x6c\x00\xf0\x11\xa6\x80\x29\xe0\x6d\x8b\xb8\x80\x15\x1d\xee\xa8\xba\x85\x1e\x99\xde\x57\x48\x3b\x46\xd7\x0f\x2e\xed\x03\x15\xfe\xc0\x71\xc9\x21\x1d\xb4\x97\xf3\x42\xab\xca\xef\x0e\xaa\xd7\xd2\x08\xcf\x91\xc3\x25\xb0\x20\x54\xf8\x59\xb2\x57\x58\x03\x97\x20\xde\x93\xdc\x86\xb0\xdd\x6c\x0f\xfa\xd4\x94\x5a\xe8\x82\x60\x3a\xb6\xca\x62\xcd\x76\xd6\x3c\xea\xc4\xee\x43\xbb\xe2\xce\xb9\x3f\x2d\x20\xa6\xd1\x42\x13\xa8\xbc\xa8\x52\xcd\xe3\x1b\x47\x87\x2b\xfc\x15\x15\xec\x4f\x56\x56\x7a\xbb\xa3\xa4\x24\xc0\x05\x21\x60\x86\xc0\x4c\x22\x4e\x74\x5b\x99\x59\xa1\x37\x74\xc5\x36\xb0\x99\x40\x65\x5b\x63\x25\x31\x7c\x88\x98\x5f\x85\xb8\x71\xe3\x17\xfb\x2c\xb6\x0a\x6a\x78\x0b\xc4\x23\xc1\x6c\x11\x2c\xf5\xba\xd2\xca\xe7\xaa\xf4\x37\x80\x4c\xc3\x0e\x61\xe8\x30\xa8\xb4\xe6\xd6\xc6\xae\xfc\xa4\xa1\xcc\xab\x45\x59\x61\xfb\xaf\xfb\xc6\x5c\x95\x50\x41\x0a\x73\xcf\xbf\xea\x62\xef\xa5\x21\x5c\x39\x6c\xc2\x84\x40\x6f\xac\x03\x60\xfa\x33\x86\xff\x50\x41\x82\x7e\x0d\x45\xc2\xd4\x5d\x80\xaf\x22\xd7\xa6\x58\xe8\xaa\xeb\x2c\xcb\x4a\x2f\x0d\x29\xe7\x1c\x3a\x2a\x25\x53\xb8\xf1\x87\xbd\x75\xe1\x11\xdc\x20\xcd\x97\x1a\xca\x82\x0f\x49\x60\xe8\x2a\x19\x43\xce\x0b\x00\x67\xc0\x34\x34\x7e\x94\x0a\xa4\x14\xb9\xa0\xe7\x75\x85\xf8\xe8\xec\x5c\x67\x8e\x06\x1b\x22\x74\x8c\x81\x39\xe7\x8d\x33\x00\xd4\x8b\x58\xc1\x52\x3b\x68\x78\x2f\xda\x2d\x09\xca\x09\x26\x16\x25\xd8\xef\x8f\x5a\x95\x22\xb2\x2a\x59\x29\x45\xe6\x64\x34\x29\x68\x38\xb1\xf2\x6f\xbb\xbc\xd6\xbe\xf8\xb3\x0e\xf5\x12\x3c\xc5\xa3\xd3\xfb\xc4\xa0\xe0\x91\x99\x07\x75\xfa\xf4\x58\xff\x2c\x09\x8d\x54\x0b\x5d\x39\x49\x8a\xce\x14\x88\x7c\xcc\xd5\xba\x93\x1b\x7f\xb4\x36\x50\xdb\x9f\x58\x12\x6c\xc1\xa9\x98\x5f\xcb\x0d\xe1\x69\xd1\x0e\xb5\x9e\xad\x7d\x69\x02\xb4\xa9\xe3\x01\x04\xdb\x7f\x21\xfc\xa7\x31\x1d\xb2\x99\x45\x75\x26\x90\xb7\x78\x30\xf0\x08\x27\x17\x8b\x3d\x9a\x8d\x38\x00\x7e\x98\x12\x1f\x99\x54\x22\xc2\xd3\xa3\x2f\x7b\x49\xe0\x65\xd6\xb4\xc5\xf4\x6d\xac\x27\x8a\x40\x77\xe0\x91\x10\xce\x89\xa6\xdd\x7c\xed\x17\x0a\xbb\x5c\x97\x71\x32\x26\x9e\xf7\xd2\x7d\xc1\xfd\xdf\xbc\xca\xa1\x98\x94\xcd\xc7\x85\xd9\x74\xb1\xd5\xf0\xb1\x73\x23\xf9\x99\x1b\x53\x69\x59\xa8\x6f\x61\x9c\x25\x70\x32\xd2\x24\x20\xb3\xdd\xaa\xa3\x51\x8b\xcd\xd1\x72\x88\x4e\x04\x94\x23\xe3\xb3\x3b\xc7\x1e\x3e\xd3\x73\x45\x0e\x07\xd4\xaa\xdf\x12\xc1\x22\xab\x14\x37\x86\x13\x30\x3f\xd9\xe0\xc6\xad\x55\xd9\xea\x51\x1c\x1c\xd3\x41\x2d\xc0\x35\xf6\xb8\x12\x68\x68\xa4\xa6\x35\x13\x3d\x57\xf8\x70\x94\x93\x52\x2d\xbe\xaa\xb2\x56\x2b\x2d\xdd\xed\x05\x59\xa8\x21\xf9\x75\x78\x40\xc9\x42\x5c\xe4\xd6\x7f\x09\x5d\x01\x54\x37\xca\x1a\xf0\x3f\xb8\x8b\xee\x3b\x97\x0b\x5d\x69\x60\x0a\xe6\x9b\x11\x35\x61\x46\xbe\x25\xaf\x32\xbf\x9c\x88\x9e\x9e\x97\xfe\x2a\x92\x6b\x29\xe7\x79\x35\xdf\x6d\x2c\xa0\x45\xd8\xa6\x5d\x69\x4a\x59\xb9\x19\x9b\xf9\x5c\x41\xde\x2b\x23\xb5\x4c\xb5\xc2\xca\x0f\xc3\x26\xb8\x2e\xe7\x66\x07\xed\x02\x4e\xcc\x3e\xb8\x09\xd4\x4e\x15\xd9\x7c\x56\xe0\xbb\x82\x42\x48\x05\xc2\x3e\xa8\xcd\xbc\xf6\xed\xe2\x4a\x2e\xf4\xd9\x52\xcd\x9d\x0d\x5e\xab\x72\xa1\xaa\x45\xd7\x59\x15\x6a\xbe\xce\xf5\x57\x94\x32\xd9\xa1\x60\x88\x9a\x2e\x90\x0b\x34\xea\x92\x0d\x16\x03\x9c\x6a\xb1\xac\xa8\x16\x05\x8a\x90\x72\xcb\x2a\x2e\x36\x2f\xf0\xfc\xf9\x4e\xca\xff\x34\x33\xa9\x9c\x1d\xb6\x70\x0a\x0f\xda\x09\x78\x0a\x22\xda\x99\x01\xb3\x6a\x2b\x12\xd4\x68\xcb\x14\x79\x5d\x23\x36\xe5\xca\xbd\xfe\x6c\x8f\x9d\x7b\x1e\xdc\x34\x7a\xae\x20\x7f\x33\x9c\x48\x77\xdf\x61\xa5\xa2\x53\xf3\xe8\x15\xee\x0a\x31\x28\xe9\x70\xbb\x89\xd8\xac\x05\x01\x4f\xc5\xce\xb3\x37\x9e\xca\xc3\x85\x15\xd8\xcb\xe0\x36\x86\xc9\x49\x43\xef\xe9\x56\x9b\x6d\xa1\xc3\x98\x05\xb8\xa4\x33\xb3\xd8\x1f\x38\xad\x5d\x79\x03\xed\xb6\x74\xc6\x0e\x67\xc4\x6a\xed\xca\x07\xa6\xda\xa6\x43\xad\x15\x56\xc0\xa5\x00\x21\x95\x4e\xc2\x0d\xf3\xb0\x36\x05\x0e\xe6\x6e\x32\xb6\x88\x20\x47\x24\xc0\x2d\x3f\xe8\xa2\x80\x7e\xb6\xda\x42\x5f\xa4\x2a\xeb\x4c\xd0\xe3\x9f\xdd\xe6\xe5\xee\xdb\xc1\xf7\x10\x94\x77\x6d\x76\xab\xf5\xf7\x37\xc0\x6d\x39\x08\x0f\x12\x5b\x91\x46\x00\xeb\xe8\x27\x41\xc2\x2b\xf3\x82\x4e\x97\x89\xeb\x84\x35\x99\x98\x2d\x8f\xdb\x59\x1a\xca\x0e\xcb\x16\x71\xb1\xd6\x54\x82\xc8\x72\x91\xb1\xaf\x01\x32\xc4\x7d\x1a\xbb\x0a\xaa\x1d\xa1\xb2\x7b\xde\x4d\xd2\x87\xed\x04\x9d\x9a\x37\xa3\x8b\x21\xbe\xad\x33\x98\xed\x11\xe0\x5f\xec\xcd\xa3\xca\x81\x94\x76\xb3\x5c\xa4\x2d\x37\x58\xad\xdf\x95\x77\xca\x59\xff\x60\xb3\xd6\xce\x0e\xa3\xf3\x50\xaf\x75\xdc\x86\xc2\x08\x90\x4a\x76\xa0\xca\xc0\x43\xe1\x46\x46\x5d\x87\xe8\x66\x3b\x01\x34\x77\x67\xe9\x0a\xf3\x47\xba\xd4\xa8\x55\x6d\xb4\xc7\xa2\xb0\xe8\x69\x52\x15\x83\xf0\x56\x4f\x6c\x46\x38\xb1\x4d\x05\x57\x10\x8e\x0a\xf6\x23\x9b\x00\x4d\xf7\x31\x2f\x05\x18\x3a\xb4\xe4\x6e\xf5\xda\xd0\xd5\x6f\x20\xe5\x46\xf8\xee\x01\xc6\x14\x8a\xab\xaf\x11\xe4\x74\x70\x85\x00\xb1\xe2\xfc\x28\x2c\x68\x64\xe9\x21\x95\x28\x49\x8e\x28\x94\x80\xd2\x80\x9b\x54\xd0\xeb\xf3\x0b\xa0\xb8\x0e\x03\x9a\x74\xbc\x69\x1a\xbc\x4a\x34\xc5\xc3\x38\xe8\xd8\xe4\xff\xa5\x17\x02\x9b\x43\xac\xda\x53\x1c\x9b\x54\xc4\x77\x8a\x40\xb0\xca\x30\xb9\x43\xcd\x00\xe0\x09\x86\xb1\x55\x51\xe8\x85\xec\xc4\x65\x89\x00\x01\xa2\xc0\x22\x22\x4c\xcb\xdc\x4a\xb5\x58\x54\x1a\x5c\x3b\x65\x45\x67\x6f\x76\x1d\x77\x65\x65\xc7\x9f\x0e\xec\x97\x71\x66\x5b\x51\x50\x75\xb3\x59\x46\x49\x62\x22\xce\xf5\x38\x2b\x0b\x55\x2b\x8f\xcf\x2d\xac\x81\x50\x3a\xf3\xda\x7e\xd5\xa5\x73\x1a\x21\xf2\x1a\xd9\x9e\x6e\x1f\xa8\xe7\xda\xcb\xab\x13\x5c\x6c\x70\x23\xcc\x46\x63\xdd\xa3\x3b\xf0\xc9\x13\xe1\x71\xa7\x10\x6c\x34\xd5\x26\x62\xa1\xb6\x74\xf1\x3a\x74\x0f\x3b\x19\x86\x32\x33\x0c\x51\x86\x4d\x77\x26\x62\xdb\xce\xc3\x75\xc0\x39\xac\x95\x15\x33\x77\x8f\x5a\x77\x87\x6f\xb5\x53\x93\x87\xd7\x8c\xe5\x00\x2f\x24\x96\x7b\x8a\xe8\x2f\x5c\xeb\xd9\x84\x95\xc6\x07\x84\xc3\x54\xa8\x87\x37\x5e\x9a\x41\xaf\xd2\xde\x59\xcf\xf0\xd9\x00\x29\x25\x9b\x23\x4b\xc0\xad\xc4\x5d\xcb\xeb\x8c\xeb\x4d\x7d\xc6\x85\x12\xfa\x29\x9c\xb4\x60\xd0\x1c\x0e\xd1\x2d\x20\x94\xec\xe6\xb1\x34\xd5\x83\xaa\x16\x80\x18\x03\x6b\x98\x16\x07\x75\xe5\xc9\x07\x40\x7e\x80\x40\x50\x16\x57\x17\x89\xdc\x72\x73\x58\x80\xfd\x04\x85\x8e\x5b\x4f\x05\xda\x50\x92\xde\x89\xa7\xd3\xe9\x9e\x0a\xd1\x99\x84\xb8\x57\x87\xdc\x54\xa4\x8d\xc6\xe6\x41\x14\xb2\x4b\x5d\x55\xe8\xc5\x7a\x16\x71\xf8\x10\x9a\x83\x60\x82\xa7\x2f\x5a\x1b\x08\x3f\xdd\xc0\x78\x5e\x76\xf9\xe0\x58\x42\xed\x8d\x37\x81\x22\x7b\x4d\x72\x72\x55\x14\x62\x63\x16\x3b\xa7\xf2\xf3\xda\x0b\x89\x4c\x6e\x8b\x1d\x96\xb3\x47\xf4\x59\x80\x3b\xbc\x54\x73\x8d\xa0\x65\x39\x79\x20\x85\xa6\xcf\xc3\xf9\xb0\xf3\x2a\xdf\x62\x7e\x84\x12\x67\x65\x5d\x99\x42\x62\xe0\x2c\x40\x14\xc4\x3d\x06\x8d\x10\xa6\xbb\xcb\x4e\x8f\x62\x28\xd5\x50\x56\x41\x95\x4f\x54\x37\x60\x7f\x43\xb7\x17\x3a\xdf\x82\x89\xe2\x49\xa2\xbc\x95\x1e\xe3\x87\xa1\x76\xc0\xed\x9a\x9b\xad\x46\x9d\xa1\x10\x10\xb9\xda\x95\x14\xbf\x60\x51\x1a\x50\xe0\x6f\x43\x04\xca\x3d\x8a\x03\x1c\x04\x17\xe4\x06\xde\xee\xea\xa8\xbc\x3b\x71\x61\x79\x62\xec\xdc\xe5\x88\x1e\x85\x31\x9d\x00\xfa\xc6\x67\xa5\xed\x66\xca\x93\xbc\x5c\xe8\xad\x2e\x17\x58\xfc\x2f\xc8\x8e\x68\x28\x72\x62\xa1\x31\xa6\x40\x66\xe8\x0a\xed\xd0\xbc\x3e\xed\xca\x4f\x3e\x61\x43\xb7\xb3\xda\xb9\x9d\x75\x63\x5a\x01\x80\xc4\x64\x9e\xdc\xc6\x46\x32\xa0\xdf\xf2\x5f\x12\x73\xc5\x2b\xe0\xf8\xf3\x88\x7a\x02\x71\x63\xb5\x7f\x7a\x16\xd5\x0f\xf2\x93\x6d\x1e\x6b\xf4\x43\x95\x4d\xf2\x1c\x79\x9d\x71\x9a\x08\xfb\x22\x9b\xc5\x8c\x90\x73\x08\x64\xf6\x05\x4c\x43\xa8\xed\xb6\x32\xdb\x2a\x07\xf2\x05\x5f\x34\x6f\x4a\x8c\x66\xd2\x6c\x65\xf4\xa9\xf6\x2a\xcf\x45\x6e\xe7\x85\xca\x37\xba\x72\x02\x9f\x03\x99\x6f\xe5\x17\xad\xb7\xee\xd6\xb8\xf3\xc4\x37\x10\xbf\x66\x19\x5a\x68\x89\x56\x43\xd2\xcb\x0b\xc6\x9c\x11\x58\xa9\x68\xe3\x00\x5e\x18\xba\xb1\x88\x8d\xfe\x41\x3f\x12\xb4\xab\x38\xa9\x25\x52\xeb\xce\x6f\x08\xa6\x95\x20\x39\xe0\x03\xaf\xdb\xf5\xde\x42\x63\x11\xdd\x03\x46\x7b\xa8\x38\x14\xb2\x25\x20\xe5\xbd\xd9\x01\xa9\x83\xa2\xf8\xb5\xd9\xd2\x6d\x76\x6f\xe5\xe3\xb9\x6c\x17\xa3\xb0\xe4\x7e\x75\x12\x86\x4b\xa0\xc0\xb8\x0c\x47\x84\xe2\xcc\x30\x1e\xbe\x53\xd5\x7e\x32\x3c\xf9\x41\xa2\x29\x44\xbd\xde\x81\x6d\xba\xc1\xc9\x1e\xbd\x40\x19\xd9\xb3\x87\x07\x12\xee\x6b\x2a\x6f\x59\xb3\xb6\x18\x37\x13\x7a\xb5\x0b\xac\x2a\x6d\x3b\x77\x60\xdb\x70\x07\x2b\xb5\x42\xd8\xb8\xfe\xd4\x77\xae\x2a\xec\x11\xf5\x31\x6d\x54\x15\xce\xfe\xcc\x6b\xab\x8b\x25\xf9\xe3\x0d\xc5\xdf\x15\x62\x76\xea\x73\x33\x12\x83\x2a\x35\xe1\xad\x45\x11\x72\x27\x8d\x55\x55\xc1\x8e\x6c\xf2\xd2\x09\x0e\x3e\x8d\x10\x35\x03\xd1\x46\x59\x3b\xdc\xa4\x45\x34\x0c\xbb\x18\x0b\x82\x93\x87\xf0\x30\x7c\xaa\x2b\xc4\xbc\xf5\xf9\xe8\x99\xc5\x1a\x0d\x6d\x2a\x0f\xf1\xa8\xdc\x0c\xf8\x10\x42\x93\x7d\x21\x02\xfe\x87\xdb\xf3\xa3\xe6\xa4\xf7\x7e\x17\xa7\x08\x0d\xb1\x54\x73\x24\xcc\x27\x8d\xec\x5f\x9b\xcf\x4b\x64\x42\x79\x73\x0c\x8d\x8d\x1a\x1b\xae\x97\x02\xcc\x40\x9c\xa3\xdd\x81\x9d\x4d\xa0\xfb\x6d\xd6\x5e\x43\xea\xf1\xf3\x33\x0a\x97\x81\xc6\x42\x70\x23\x55\xad\x10\xf8\x85\xf2\x11\x00\xb7\x11\x7f\x47\x82\x91\xf1\xd5\x7c\x41\x78\x0f\x5d\x86\xac\xd2\x46\x7d\xd1\x42\xc9\x95\x31\x0b\xb9\x54\x80\xe4\xb5\x5c\x9a\xaa\xc6\x40\x8c\xf7\x23\x33\x7e\x6d\xec\x06\x6b\xcc\xd8\x43\x41\xc0\x5b\x11\xaf\x72\xbc\x06\xb0\x02\x59\x3a\x27\x84\x45\x44\xdf\x98\x23\xc7\x1e\x7d\xc7\xa9\x00\xfd\x55\x57\x84\x29\x89\x3a\x8c\x11\xd2\x2b\xbd\x01\x57\xc3\xd9\x1e\x79\xb9\x5a\xee\x8a\xae\x10\x27\x49\xd4\x29\xda\x02\x50\x51\x6c\xc3\x82\xc5\x00\x10\x57\xd2\xfe\x6d\x07\xc9\x79\x63\x6a\x0b\x0e\xaf\xf2\x45\x9d\xac\xb2\x30\x22\x5a\xec\xc1\xc9\x3f\x0b\x50\xaa\xb1\x66\xc4\x8a\xef\xb0\x18\xa0\xe2\x39\xc7\x30\xd9\xcd\x2c\x5e\x60\x71\xb9\xe0\xe6\x79\x1b\x12\x0e\xd1\xf7\xce\xfc\x89\x38\x58\x38\x34\x76\xd8\xcc\xe0\x3f\x0b\x76\x1c\x51\x2c\xaa\xe2\x0d\x07\x72\x1f\xd9\x1a\xd0\x64\x60\x47\x85\xb7\x6f\x8c\x88\xfb\xd2\xb6\x4a\x5d\xc4\x61\xb1\x0d\x18\x00\x05\x03\x93\xa3\x9d\xca\x16\x58\x55\xb8\xa6\x90\x95\x65\x6e\x1d\x64\xff\xd1\xf3\xa8\xbc\x5e\xd5\xf4\x0d\x32\xae\xb8\x11\xc0\xbb\xd0\xa9\x5c\x45\x24\x0e\x8c\x80\xaa\x59\xb1\x17\x90\x7d\x59\x40\x32\x24\xde\x1f\xe8\xb2\x74\x6e\x17\x74\x10\x9a\xea\x0b\x43\x7a\x6e\xac\x2e\x80\x1f\xac\xc6\xcb\x12\xee\x3c\xa6\x3a\x3d\xa5\x46\x26\x17\x06\xab\xa9\xc2\x6b\xba\x43\xe8\xa7\xff\xc0\xf7\x29\x85\x1f\xda\x38\xdf\x31\x7d\x74\x57\xbe\xc3\x42\x96\xb6\xcf\x63\x68\xd0\x8f\xaa\xac\xe4\xa3\x4f\x2b\x48\x8e\x76\x6e\x1f\x57\x3b\x18\xed\x38\x04\x17\x46\x61\x49\x67\x86\xab\x5a\x5a\x85\x5e\xe6\x3e\x6b\x13\x1a\x3e\xd0\xa6\xe4\xd3\x90\x9f\x6c\xa5\xfe\x56\xeb\x72\xc1\x79\x6c\xca\x1e\xc0\x63\x98\x00\x60\x87\xf8\x25\x80\x40\x50\x2e\x9c\xec\xa8\x88\x4d\xa8\xd2\x2b\xe7\x2f\x51\x50\xfc\x61\x6d\xe4\x83\x53\xe3\x02\xea\x12\xa6\xeb\x9d\xcd\xa2\x3a\xb6\x7a\x4d\x35\x58\xb5\x9f\x2a\xad\x13\xdc\x67\x67\x1a\x45\xa5\x17\x60\xe9\x5a\x34\x19\x04\x97\x1a\x18\x72\x5d\x11\xf7\x3f\x5c\xec\x19\x98\x02\x6f\x65\xa5\xdc\xcb\x65\xf1\xa3\xd0\xa1\x64\xe8\x65\xe1\x0b\x17\x62\xaf\xa3\x6d\xb1\xe3\xcc\x4d\xe5\x23\x04\xcc\x32\x96\x56\x15\x05\x8b\x69\x50\x46\x58\xc0\x1b\x5d\x69\xa9\x56\x2b\xb7\x4a\x1e\x69\x8c\x7c\x4a\x78\x0f\xc8\xf9\xb6\x99\xed\x4d\x5b\x4c\x9e\xb0\x2b\xfb\xc8\xa1\x39\x05\x1c\x40\xf9\xd5\x14\xbb\x0d\x05\xd7\x09\xb0\xe7\x00\xa9\x1a\xad\xdf\x20\x55\x66\x1e\xa1\x2c\x9a\x5d\x50\xaa\xe0\xf4\xf0\xa6\x89\xa0\x54\x9f\x07\x83\xcc\x6c\x61\x45\xe9\x76\xa5\x67\x32\xcd\x68\x1e\x09\x90\x0a\xe7\xea\x69\xb5\x38\xb0\x4e\x41\x13\xaf\xf2\xaf\xba\x4c\xd0\x84\x6e\x7d\xfa\xcc\x60\x89\x50\x6e\x43\x25\x88\x40\xe0\x8d\xa7\x5b\xd3\x8d\x52\x90\xe8\x33\x6e\xf1\xbe\x3b\xf9\xa4\x40\x32\x7e\x11\xd3\xb0\x43\x4e\xc0\x08\x29\xf5\x03\x86\x29\x30\xd6\xed\x4c\x00\xff\xfd\x1f\x59\x32\x50\x77\xc0\xe3\x91\x58\x04\x4e\xac\x62\x7a\x7a\x8f\xef\xc4\x83\xf3\xcc\xb8\xaa\x2b\xb7\xeb\xee\xa9\xbc\x06\xc1\x28\xa8\xb3\x8d\x7b\x96\xb9\xd2\xb2\x24\x3b\x94\xd6\xb0\x2b\xc4\x08\xeb\x3f\x9d\x87\x4a\x9f\x21\x8a\x2e\x50\xd1\x61\xa7\xf8\xee\xe7\x55\xa5\x61\x06\x33\x8f\xeb\x4b\x5c\x25\x99\xc0\xba\x97\xa7\xbc\x6c\x12\xd1\x2c\x8a\xb8\x7d\x18\x0d\x7f\x90\xf7\x4d\x36\x40\x9c\x18\x69\x1f\x7a\x2a\x97\x63\x92\x1f\x92\x43\x14\x62\xb9\x2b\x82\x48\xe7\x82\x07\x38\x6f\x2c\xbf\x31\xfc\xb9\x68\xfa\xce\x02\x43\x45\x07\x31\x79\xd0\x35\x91\xed\xfd\xe2\x71\xff\xb6\x79\xd9\xa3\xd8\x56\x95\xc8\xa2\xa5\x70\xba\x1f\xef\x26\x7b\x15\x97\xa7\xff\x2f\x7b\xff\xb6\xdc\x36\xb2\xad\x89\xc2\xf7\xf9\x14\xf9\x2b\xfe\x8e\x92\x22\x20\x94\x25\x1f\x6a\x96\xdd\xb1\x22\x68\x0a\xb6\x39\x17\x45\xaa\x49\xca\x9e\xea\x9b\xde\x20\x99\x94\xb0\x0c\x02\x5c\x00\x28\x15\xe7\x55\xbf\x43\xbf\xc0\xbe\xed\xe7\xe8\x37\xe9\x27\xd9\x91\xe3\x90\x39\x12\x00\x25\x57\xad\xb9\x66\xc7\x5e\x7b\xfa\xa2\xca\x96\x48\x20\x0f\x23\x47\x8e\xe3\xf7\x41\x16\x1d\x8b\x9d\xb8\x8a\xcf\xc7\x0b\x31\x64\xd4\xb5\x91\xd5\x9c\xaf\xa9\x0b\x18\xce\x25\xb5\xbc\xf5\xf8\x26\x2b\x2e\xf5\xc8\x44\x59\x84\x73\xb9\x57\x65\x45\xb0\x13\x59\x71\xaf\xb6\xe9\xea\x21\x2b\xcc\x79\x65\xd2\x35\xbc\x5e\x84\x93\x1c\xc6\x31\x19\x3d\xcf\xc7\x84\x8f\x0d\x10\x09\xb4\x50\x87\xad\xf6\x75\x53\x6e\xd3\x2a\xe3\x1c\x9c\x95\x30\xc1\xc1\xd9\x98\xca\xf9\x1f\xa3\x4d\x47\xcd\xcb\x45\x63\x39\x5e\x1e\xd0\x39\x05\xdf\x10\x8a\xa4\x9d\x30\x50\x39\x8a\x2f\x9a\x50\x10\x1f\xa7\xc3\xe7\xbe\x65\xed\xaa\xc7\x34\x07\xd3\x25\x7c\x40\x27\xbc\xc6\x86\x91\xb5\x1b\xf0\x61\x84\xd4\x94\x91\xc7\x20\x8c\x34\x1d\x96\x82\xb6\x9e\x15\x81\x55\xaf\x31\x23\xd5\x72\x90\x7c\xb0\x6b\xbb\x33\x10\x3e\xef\x19\x90\x8f\x03\xe0\xa1\xf4\x4b\x83\x28\x9b\x83\x50\xc8\x5d\xae\xa0\x28\x43\x09\x6d\x3b\xdc\x81\x61\xb3\xdc\x37\x2a\xab\x83\x22\x58\xbc\xd3\x3d\xac\x19\x9e\x82\xe5\x41\x2f\x0d\xc2\xec\x6d\x77\x59\x8e\x60\xe1\x32\xb4\x6e\xfd\x78\xc8\xab\xc2\x7c\xfa\xb3\x3c\x63\x97\xe5\x99\x63\x7c\x0d\x0b\x33\x32\x7b\xec\x4b\x82\x2e\xe1\x2a\xae\x2e\xcd\x62\x7b\xec\xe4\xdc\xa2\x5b\xa0\x37\x69\x9e\x4b\x1c\x6e\x7f\x4f\xaa\x96\xf3\xe9\x92\xf3\x5c\x2a\xf1\xfc\x60\xbb\x6b\x81\x60\x78\x35\x60\x2e\xf8\x63\xcd\xaa\x26\xd5\xdd\x32\x13\xa7\x4b\x44\xf9\x84\xdb\x30\xda\x9b\x5a\x85\x1f\x3e\x8b\xc8\x80\xc2\x2b\xe9\x47\xf2\x66\x7e\x34\x2a\xab\xc5\xda\x04\x15\x4d\x12\x3d\x82\x55\xd6\x3b\x04\xb4\x64\xc2\xbb\x4d\xcb\x42\x51\x0c\x03\x12\x66\x3d\xa8\xce\xe7\xd9\xc5\x83\x9f\x38\xd0\x34\x3a\xb0\x0f\x26\xb5\xca\x65\x93\xd1\xb2\xa9\xac\x0e\x14\x7b\x60\x77\x4b\x9d\xc0\xd1\x2e\x8c\xb1\x70\xad\x43\x4b\x50\x5a\xeb\x28\xcf\x61\xe7\xc0\xa3\xb0\xc9\xb8\x2a\xb5\x74\x54\x7b\xfb\x4b\x65\x5c\xa5\xbf\xb6\x27\x04\xc2\x4b\x45\xc3\x3e\x21\x66\x44\xd0\x6d\x12\x67\xa1\xdc\x37\xe1\x34\xa0\x52\x58\xb9\x6f\x64\x35\x87\x86\xd2\xb0\xee\xa8\x79\xa8\x4c\xfd\x50\xe6\x6b\x5f\x33\x8e\x81\x0d\x1a\x0e\xd5\xb5\x43\x82\x17\x7a\x0f\xd0\x77\x5e\x1e\x74\x9e\x3e\xa1\x46\x25\x30\x10\x59\x6b\x8b\x7b\x00\x71\xeb\x62\xbf\x35\x15\x84\x09\xad\x0b\xb5\x35\x8d\xa9\xac\x2f\x96\x36\xd6\x38\xad\xf6\xc0\x76\xa0\xf3\xf4\x60\x8f\x11\x82\xb9\x53\x57\x0a\x85\x12\xea\x2d\x00\xbb\xa5\xab\xaa\xac\xc5\x0f\x32\x84\xbd\xf3\xf9\xb2\x53\xeb\x0f\xd8\x9f\x81\xf3\x60\x3d\x12\x95\x15\x3a\x37\xc5\x7d\xf3\x70\xe6\xdc\xc3\x20\xf8\x2d\x07\x0c\x78\x4a\x32\x3c\x1f\x78\x36\x8a\xcb\xc6\xd0\xa0\xe1\xc2\xaf\x8e\x1c\xc4\xfa\x34\xf1\xf2\x1a\x66\xae\xac\xc1\x01\x2f\xc4\xc8\x34\x64\x4e\xf8\x1c\xb6\x0f\x2d\x14\x84\xa2\x03\x6f\x95\x4c\xeb\xb6\x7f\x67\x1d\xf8\x29\x03\xca\x45\x81\x68\x3c\xaf\x0d\xc8\x40\x4e\x0f\xe2\x16\x51\xcf\x4a\xfc\x33\xa1\xcc\x77\x48\x8b\x23\x0e\xa8\x0a\x26\xec\x42\x01\x79\x5d\xf6\x4e\xc3\x57\xe3\x01\x62\x6f\xe3\x13\x2e\x28\xd9\x6a\x9d\x55\x66\xd5\xe4\x87\xae\x3e\x44\x61\x46\xd4\xe2\x16\xc1\x3d\x47\x30\x9c\xe9\x40\x01\x57\x9e\x39\x75\x42\x41\x92\x9e\x6f\x14\x56\x29\xea\x47\xf5\x31\x96\x9f\x21\x9a\xaf\x6e\x67\x29\x8f\x68\xd7\x1e\x56\x41\x5e\x22\x5a\x65\x5e\x61\x8c\x6a\x3f\x94\xd9\x4a\x04\x8a\x95\xab\x03\xc1\xcf\x51\xa9\x64\x1f\x93\x8a\xcb\x0a\x82\x91\x06\xf6\x11\x94\xc7\x95\x4f\xd0\xba\xa3\xb0\x46\xdd\x9a\xe4\xd6\xdf\xbf\xcf\x0a\x83\x56\x0b\x28\x61\xb3\xdc\xdf\x43\x03\x5a\x37\xc0\xcd\x19\x01\xd7\x18\xd0\x8e\x10\x0b\x0e\x01\xe9\xaa\x79\x6d\x1d\xd8\xcd\xb5\x63\x07\xcc\x9a\x80\x6a\xd0\x2d\x33\x47\x70\xa0\x90\xe8\x99\x5b\xc5\x0f\x8b\xc2\x63\xfd\x89\x0e\x07\x4d\x09\x03\x5a\xef\xd1\x54\x03\xf9\x85\x18\x1b\xf2\x6c\xd4\x1d\xfe\x45\xe1\x58\x06\x08\xa0\x9d\x2c\x8f\x87\x65\xa6\xf1\x6f\xcb\xe2\xde\x1e\xb0\xb0\xc6\x28\x45\xff\x12\x52\x36\x28\xe3\xec\x7d\x43\x89\x0f\x09\x70\xef\x0c\x14\x16\xb8\xbb\xe1\xac\x11\xa2\xd4\x65\x0b\xb0\x47\xe6\xbd\x52\xe9\x99\x1e\x38\xa3\xdd\xcd\xf9\x05\xd3\x5d\x1f\x31\xdd\x55\xa0\x18\x7c\xd2\x90\x4b\x9a\x39\xcc\xcb\x4d\x11\xfa\xc9\x54\x9e\xfb\xd1\xbd\x1d\xcb\x1e\xd4\x71\xdb\xbf\xdf\xdc\x3f\x83\x3c\x56\x57\xcf\x05\xb6\x50\xab\x04\xca\x1f\xba\xee\x94\x3b\x93\x7c\xee\xec\xc3\xc6\x49\xf5\xc8\x6c\x40\xd2\xee\x96\x95\xfe\x76\x0b\xa1\x3b\x2a\x00\xfa\xf4\xf2\x0c\x37\x11\xb7\x99\x48\x35\xe2\x42\xae\x62\x56\x5e\xab\xa8\xbe\x64\x45\xac\x4f\x11\x82\x18\x96\xaf\x6e\xca\x72\xdd\x2a\x17\x7b\x7a\x28\xdd\xa6\xe0\x22\x60\xfe\x18\x58\x90\x3c\xe3\x17\x25\x6f\xb2\x76\x14\x8a\xfa\x12\x0a\x63\xef\x64\xf4\xb1\xac\xfd\x43\xa4\xda\xdc\xe7\x82\x77\x88\x0c\x57\x8b\xba\x3b\x37\x66\xf1\x3a\x7b\x81\x2d\xcf\xf4\x2d\xd4\x07\xd6\xfb\x0c\x27\x8b\xd5\xd7\x2e\xc6\xef\x00\xac\x83\x22\xe3\xf6\x06\xc7\x7a\xa0\xdc\x13\xfc\x57\x10\x2e\x06\x17\xe3\xf4\xe2\x0c\xf7\x35\x6d\xb0\xd4\x2d\xdb\x9a\x16\x34\x35\x17\x5a\xa6\xb9\x15\x8a\x03\x53\xcf\x70\x80\x8d\xca\x8b\x1d\xdb\x19\xd7\x0d\x4a\x6b\x99\xaa\x0e\xdc\xa3\xbc\x69\x02\x01\x82\x26\x30\x96\xf1\x2e\x80\x3e\x1c\x91\x3d\xb1\xc2\xb0\x33\x15\x5f\x78\xc7\xeb\xef\x5c\x2d\x47\xe6\x2b\x08\xb9\x54\x02\x26\x1e\xb5\x41\x08\x3b\x4f\x82\x54\x12\x15\x6a\x9c\x83\x9e\x68\x20\x3e\xe3\xd6\x57\x44\xa7\x1a\xa1\x40\x52\xf2\x91\xed\xe7\x30\xa3\x77\x4c\xcd\xa4\x2e\x4c\x0b\x6e\x71\xa4\x1f\xd3\x3c\xa3\x26\x8c\x06\x88\x7f\xb0\x13\xc5\xe8\x83\x49\xab\x3a\x52\x4d\xe9\xdb\xcd\x20\x8a\x8e\xda\xd0\x8e\xde\x51\x6f\x04\x5d\x17\x3e\x2d\xa3\xdf\xa5\x11\x5f\xf4\xd8\xc6\x46\xd9\xc2\xa2\xc4\x7a\x50\x57\x11\x0e\xc8\xe7\x50\xa5\x5a\x71\xfa\x17\x14\xac\x74\x3e\x5c\xba\xb0\x37\x00\x4f\xea\xe7\x0f\x47\x0a\x30\xef\xfd\x7c\x84\x80\xd0\xe5\xdc\x64\xfd\x02\xd8\xc7\x2a\xb7\x42\xf0\xc8\x58\x29\x73\xa6\xbf\x9a\xca\xc5\xfb\x9c\x4c\x40\x80\x90\x64\x9a\x8a\x20\xd6\xa1\xe8\xd7\x26\xa0\x5e\x51\x61\x1b\x2a\x7f\x17\x0e\x03\xac\x13\x3c\x36\xe5\x38\x1a\x94\x16\x15\x81\x60\x8b\x90\x45\x58\xab\xf4\xac\xd3\x06\x41\x5b\xc7\x45\x55\x1c\xd0\x43\x80\x66\xd2\x06\xf3\x8c\xae\x78\xae\x30\x66\x4d\x61\x1e\xe6\x54\xe0\xeb\x53\x78\xa3\xb0\xfc\x59\xc0\x4e\x54\x8b\x22\x75\x67\x2e\x46\x2d\x01\x43\xef\x47\x5c\x4d\x0a\xea\xd9\xad\x16\x14\xc3\x43\xca\x73\x1f\xea\xab\xb6\xe0\x10\xc8\x1b\xed\x34\x2b\xb8\x1e\x8d\xee\x8a\xb2\x52\x4b\x8c\x72\xda\x65\x39\xf3\x47\x6d\x9b\xfe\x0b\x32\x58\xec\xca\x02\x52\x71\xa7\xa4\x57\xab\x48\x7f\x37\x55\x61\x72\xf2\x85\xec\x65\x7f\xc6\x8d\x4b\xed\x72\x64\x5d\x0a\x72\x32\x79\x89\x54\xfb\xa2\x8e\xf4\xbe\x00\x67\x86\x22\x37\xf4\x2a\x32\xa4\x15\xc7\xf7\x38\xe6\xe4\xbf\x6d\x7d\x3c\xac\xe0\x7c\x48\x77\x3b\xe3\xf4\x81\xc7\xbd\xdf\x62\x08\xb6\x68\xaa\x74\x9d\xad\x1a\x8e\x12\x60\xd0\x36\x68\xc1\x2d\x37\xca\xd5\x9c\xee\xaa\xcc\x34\x76\x2d\x7c\x77\x0f\x3c\x99\xb2\x74\x6e\x49\xd3\x40\xbb\x74\x4b\xb0\x29\xac\xe3\xdf\x8f\xe9\x8d\xb4\xa8\x39\x14\xce\x48\xa1\x44\x93\x6d\x7c\x19\xb4\xb7\xe6\x91\x80\x01\x99\xb2\x74\x3b\xc2\x12\x26\xf9\x90\xec\x83\x43\xb9\x18\xb0\xe3\x2b\x8b\x92\xe2\x6e\x32\xd0\x10\xfd\x4c\x75\x56\x9d\xad\xcd\xf9\xf2\x70\x6e\xff\x0f\x2f\xd7\x75\x56\xdc\xe7\x46\xe4\xb9\x25\x35\x04\x67\xee\x3a\x2f\x13\x65\x6c\x7a\x79\x50\x61\x62\xa3\xaf\x6e\x45\x74\x2a\xb9\xbb\xa4\x0b\xeb\xc6\x69\x4f\x75\x54\x0f\xf6\xce\x0a\x2a\xdb\x36\x22\x9b\xd4\x1d\xb1\x35\xfe\x3d\x24\xba\x83\xd0\x88\x98\x2a\xb1\x15\x7e\xf6\x2d\xe0\x4f\xe5\x33\x26\x6e\x7b\x4e\x7c\x0f\xc9\x9b\x1e\xd4\x66\xb7\x60\xdc\x99\x8b\xfb\x22\x2c\xe0\xf6\x09\x91\xee\x2c\xa8\xf8\xba\xc7\x9e\xed\x67\x9a\x6d\x3b\xa5\x58\x91\xf3\xf9\xb8\x27\xd5\x3b\x29\xc6\xb6\x4f\x57\x8d\x27\xff\xc3\xbc\xc0\x8b\x59\x65\x48\xdf\xfe\xb6\xcb\xc9\x53\x85\x32\x76\x28\x30\xce\xe8\x48\xb8\xe3\x66\x4d\x4e\xb1\x16\x52\x91\xbb\x25\x44\x86\x3d\x3e\x0a\x28\x84\x12\x84\xab\x86\x04\x0e\x4a\x21\xd8\xbb\x76\x52\x91\x6e\xe3\x72\x79\x97\xd0\x13\xaf\x11\xd1\x57\x7e\xf0\xd2\xd0\xa5\xb3\xc0\x00\x44\xda\x34\x66\xbb\x6b\x84\x3c\x35\xa5\xfa\xb7\x0d\xc4\xae\xe3\x63\x99\x11\xa9\x23\x98\x68\xc7\xe0\x8c\x65\x47\x76\xdf\x08\xdd\xf5\x43\x91\x78\xc0\xed\x85\xbb\xd5\xdd\xc7\x4c\x8c\x54\x7a\x24\x03\xb8\xbd\xac\xe4\xf7\x70\x78\xb0\x55\xae\x18\x28\x22\xab\x3c\xca\x8a\x1b\x18\xdc\x16\x6c\x01\xc2\x99\xe7\x54\x00\x96\xdd\x58\xfb\x09\xda\x5a\xc1\x2d\xca\xd2\x02\xec\x88\x5f\x71\x3b\x39\x5b\x10\x30\x9b\x00\x93\x70\x3b\x69\x9a\x59\x1f\xd6\x99\x0b\x50\xa0\x02\x61\x7d\x15\x5c\xbd\x45\x89\x17\x26\x74\x5c\x13\x99\xa1\xfd\x52\xd8\xf0\x43\x0e\x53\x67\x57\x94\x28\xe5\xcb\x9a\xba\x93\xe3\xe3\xf6\xba\x94\xcf\x16\x12\x94\x02\x5d\xa4\x8b\x55\x32\x04\x06\x57\x81\x74\x67\x13\x54\xfc\x2c\xb9\xc4\x10\x1a\x1b\x65\x6c\x3a\xac\xec\x55\xa7\x54\x5f\x78\x3c\x2b\x8f\xde\x7a\x56\xac\xad\x73\x44\x02\xd3\x43\xcb\xcc\x39\x5d\xe6\xd2\x88\x1c\x95\xa2\xab\x61\xf9\xc1\xde\x1a\x1c\xb1\x1b\x7e\xbb\x1e\x5f\xd4\x2f\xd8\xa1\x42\xa9\xc6\xc5\x2b\x6a\x9f\x00\xdf\x08\x4b\x66\x9f\x4b\x4e\x3e\x3f\x61\x2c\xb2\xf0\x10\xe9\xc1\xd1\x71\x3c\x99\x69\xd8\xe3\xdd\x84\xbd\xb1\x44\xc5\xc8\x50\x03\x42\x24\xc4\x11\xd6\x21\xe2\x80\xbb\x56\x03\x30\x66\xee\x61\x50\xe1\xea\x85\x8a\x2b\xdb\x62\x93\x7c\x71\x70\x74\x40\xa1\xe9\x52\xe8\x60\x52\xf5\x4f\x4a\xb2\x79\x37\x1e\x0e\x83\x11\x49\x91\x23\xb2\x7d\x9e\x08\x00\x84\x12\xe1\xa6\xd8\x94\xd5\x0a\xf9\x49\xf8\x14\x52\x70\x4b\xe4\xee\xe8\x2a\x08\x32\x4a\x17\x40\x75\x45\x46\xed\xaa\x2c\x30\x15\xbe\xe2\x9e\xca\x72\x5f\x35\xfa\x5f\xf6\xeb\x7b\x07\xb8\x9d\xe7\xa2\x08\x85\x1a\xe4\xb3\x62\x63\x3d\x17\x84\x75\x47\x00\x10\x71\xdf\x51\x5f\xea\x69\x8b\x54\x90\xbf\x5b\xd7\x7b\x53\x9f\x45\x52\x1e\x21\xe1\x0a\x0b\x09\x95\x31\x56\x8c\x4e\x39\xc4\xbb\x3c\xd0\xa8\xa0\x05\x2a\x12\x54\xeb\x92\x1d\xe5\xcc\x67\x16\xd1\x9a\x83\xf3\x2f\x5e\xd1\xa9\x71\x82\x98\x31\x1d\x6a\xf3\xdb\xca\x1a\x7a\x00\x41\xc4\x22\x15\x7c\x57\x75\xa2\x81\xc2\x46\x94\x36\x12\x77\xf6\x30\x67\x4e\x9d\x6d\xf7\x79\x93\x16\x06\x8b\xc2\xa1\x26\xe9\x08\xdf\x9e\x2c\xcf\xf6\x8b\xb9\x33\x55\x83\xf7\xbb\xf8\x1a\xa5\x25\xd2\x5a\x85\x7b\x78\x10\x82\x79\xe4\x14\xa6\x50\x25\x8c\xbd\x1d\x12\xfb\x25\x55\x2d\xf0\x83\x27\x00\xb0\x80\x2c\x0e\x06\x8c\xab\xf2\x90\xe6\xcd\x01\x3b\x28\xc5\x29\xef\xe6\x6a\xd5\xf2\x40\x15\x34\x65\x1d\x50\xe5\x72\xa5\xb5\x8b\xcf\x03\xa1\x84\xfb\x57\xf3\x50\x41\xe6\xeb\x50\xee\x7d\xe2\x05\xbb\x18\x08\xdc\xcb\x8a\x42\xbe\x76\xab\x0b\x96\xb9\x8b\x01\xcb\xab\x0e\x3e\xb6\xa4\x60\xd3\xa6\xb2\xf7\x16\xd7\x7c\xa1\x87\xf7\xcc\xf0\x31\x3b\xd5\x49\x45\x8b\xaa\x33\x00\xf8\xcc\xd7\x3a\x2b\x30\x34\x51\x56\x7a\x5f\xe0\x99\x34\x58\xb0\x09\xdb\x9a\x16\x07\x25\x51\xa5\x44\x9b\x34\x7a\x8f\xcb\x34\xf7\xaa\xdc\xc8\xc7\x0b\xc8\x31\x2c\x8d\xc2\xaa\x44\xf9\x29\x5f\x5b\xd9\xfb\x05\x28\xec\xc0\x82\x9c\x56\x7b\xf6\x28\x28\xac\xe3\xa2\xda\x9e\xca\xba\xac\x80\x08\x23\x81\x18\xf1\xa1\x17\x48\x19\x50\xb9\xee\x3d\x33\x53\x35\x4c\x6a\x0b\x45\x79\x8c\x84\xc4\x15\x79\xb0\x58\xd6\x25\xa7\x4c\x3f\xb2\x3b\xc2\x27\x3f\xa8\xe0\xe5\xdc\x7f\x5a\xdb\xd9\x89\x11\x72\xad\x3f\xdd\xa5\x76\xd2\xf7\x15\x3d\xb1\xa1\x7e\x55\x8f\xab\x16\xec\x31\xf9\xba\xae\x88\x32\xb3\xa2\x6f\xf5\x08\x41\xa6\x60\xcd\x90\xef\x7c\xb7\x46\x01\xac\xd7\x35\xcc\x17\xdb\x82\xc1\x58\x81\x00\xce\xbd\x29\x4c\x55\xee\x31\x57\xc7\x2f\x71\x4c\xcb\x4f\xd9\xda\xe8\x0a\x6a\x9c\x44\x5f\xa0\x0a\xc8\xfb\x48\xd8\x91\x21\x02\x07\x87\x44\x9b\xa8\xcd\xcb\x42\x22\x8a\xc8\x18\x29\xd5\xcb\x2a\xfc\xd2\x07\xca\x2d\xee\x77\xfc\x72\x6c\xa8\xfc\x79\x5d\x16\xb8\xfc\x04\xc7\x96\x6d\x34\xdc\x94\xba\x7e\x30\xc8\xbe\x99\xe7\x88\x49\xa6\x02\x0d\x46\x8b\xc7\xe3\xf3\xaa\x88\x06\x89\x9d\xb1\xae\x5d\x92\x94\x20\xaa\x6f\x8c\x02\x61\x06\x8a\xab\xa5\x8e\x48\x35\x54\x8d\xd9\x81\xda\xb7\xe4\x0c\xdb\xf3\x44\x91\x91\xa5\xc9\x91\xd2\x1f\xc3\x2a\xa9\x6a\x5d\x55\x78\xa7\xd6\x4d\x4f\xc1\xfe\x85\x67\x12\x6b\xf7\x71\xfd\x0c\x90\x1d\xdd\x26\xa6\x5a\x34\x58\x09\x80\x03\xe5\x19\xaf\x29\x20\xb3\x74\x92\x4f\xc4\x69\x2e\x93\x23\xfb\xd7\xea\x28\x34\x4a\xdc\x87\x14\xf5\xbe\x5a\x95\x08\x01\x80\xb0\xa1\xa9\xe7\x32\x80\xc4\xe3\x7a\x4d\x14\xc6\x79\xb6\xca\x1a\x7d\x6f\x98\xde\x3f\xcd\x43\x0f\x5b\xf4\x0d\x9a\xdf\x38\xc7\x82\x5a\xd8\x4d\xc5\x27\x1d\x82\xaf\x66\xb5\xf2\x80\x94\xcc\x7d\x6f\xaf\xf5\x6d\x09\x95\x34\xbc\x10\xa8\x36\xf6\x35\xbd\xc0\xac\x3d\xaf\x07\xe3\x14\xf8\x4a\x4f\x9d\x15\xab\xb2\xda\x95\x55\xda\xb8\x22\x10\x37\xc2\xb4\xb6\x22\xc9\xa1\x5e\xca\x20\x70\xb7\x7f\x7b\x4f\x89\x93\xf9\x18\x10\xe1\xef\x20\x25\x41\xab\xf6\xd9\x8e\x7b\xb4\x01\xac\x41\x6b\x4f\x54\xb6\x35\x54\x04\x14\x3c\xc9\x1e\x1f\xb5\x34\xf6\x86\xcf\xac\x76\x07\x3c\x8c\xac\xca\x1c\x3c\x12\xa7\x02\x1c\xac\xd3\x72\xdf\x50\x0a\x1d\x02\xb9\x00\xa1\xd3\xa4\x19\x74\xd2\x53\xc7\xb1\xb2\xaf\x70\xe8\x4d\x58\xcc\xbc\x32\x15\x64\x50\xc1\xcc\x16\x51\x78\xac\x97\x4c\x61\x1b\xb3\xe2\x7e\x4f\x94\x7a\xfc\x09\xc4\x55\x70\x47\xc1\x99\xb8\x14\x1a\xb6\xa6\x43\xf8\xd1\x4e\xfd\x2c\xaa\x4a\x51\x3d\x49\x37\xed\x09\x20\x88\x00\x78\x03\x3d\xe1\x24\x52\x01\x00\xa1\x6b\xd4\x12\x3c\xa6\xcd\x11\x12\x45\x3e\x5a\xdc\x05\xe0\x28\x5d\x2a\xbe\x26\x82\x57\xf1\x2e\xfb\xce\xf2\x63\x32\xc1\x53\x57\x41\x7f\xa1\x27\x63\x39\x08\x47\x22\x5c\x09\x9f\xf3\x5f\x3d\x94\x6c\xdd\xf3\xb8\x20\x5d\xf9\xe3\x83\x50\xea\xe2\x8d\x33\x18\xb9\x3c\x54\x1c\x0b\x30\xd6\x3b\x75\x1c\x90\xf9\x11\x88\x32\x0e\x3f\x03\x2b\xf3\x83\x93\xdb\xb6\xa3\x8b\x9e\xa4\x0c\x14\xf5\x57\x19\xa2\x0a\xfa\x3b\x42\x11\x4c\xa1\xb5\xdf\xbd\x4b\x8d\xc6\xa1\xbb\x08\xdc\x8d\x29\x75\x5d\xdf\xb4\x95\xc4\xca\x0d\xde\x76\x6c\x75\x3e\x00\x78\x66\xb9\x35\xf6\x90\xd5\x78\x25\xb8\x00\x7b\xad\xb8\xb2\x28\xd6\xd3\x7d\x05\xd7\x58\xed\x50\xcf\x96\x46\xdf\xef\x21\xbc\x43\x43\x69\x9e\x4a\x7d\x5f\x42\x32\x62\xc3\xe4\x17\x12\x13\x45\xd5\x4d\xda\xec\x11\x83\x27\xcf\x45\x2c\x00\x7e\xc4\x58\xae\x21\x1e\x25\x5a\x1c\xdb\xd2\x19\x1c\xf5\x43\x6a\x6d\x20\x2a\x84\xa0\xab\xc4\x7d\xe5\x1e\xd5\x49\x7e\x40\xfe\x9d\xc9\xd4\x51\x1d\x2a\x75\xf1\x36\xd6\x1f\x13\xe0\xbc\x23\x96\xb8\x8f\xb3\xc1\xec\x4e\x4b\x86\xc5\x4f\xb3\x04\x40\xc5\x87\x5f\x06\xb3\xcf\xc8\x3b\x87\x60\xf1\xe2\x49\xfa\xd3\x74\xa6\xc4\x03\x22\xa6\x50\x04\xd6\xc0\x85\xbe\x49\x66\xd7\xa3\xc5\x02\xb9\x19\x07\x37\x37\xe3\xd1\x10\x10\xdb\xc7\x83\x6f\xb1\x4e\xfe\x32\x4c\x6e\x16\xfa\xdb\x97\x64\xe2\x09\xf1\xd4\x7c\x31\xb0\x9f\x1f\x4d\xf4\xb7\xd9\x08\xe0\xd7\xed\xf3\x86\xd3\x9b\x3b\xe0\xa2\xd3\x5f\xa6\xe3\xab\x64\x06\x70\x13\x3f\x3b\x20\x75\x20\x48\x4c\x1c\x8e\xbd\x9c\x93\x62\x48\xfb\x6f\xa3\xc5\x97\xe9\xed\xc2\x8f\x9d\x28\xee\xfe\x79\x34\xb9\x8a\x74\x32\x62\x0a\x3d\xa4\x88\xd4\x9e\x22\xf2\x45\x9e\x47\x20\xea\xfb\x11\x74\x7b\x2d\xd0\xed\xd5\x31\x6a\xc7\x18\x17\x70\xb2\x18\xcd\x12\x3d\x1b\xcd\xff\x59\x30\x53\xfe\x97\xdb\x81\x7b\x8e\xc0\x7e\x57\x8e\xec\xcf\x6d\x23\x20\xc5\xdf\x4d\x6f\x63\x3d\xff\x32\xbd\x1d\x5f\x05\xbf\xb7\xcb\x94\xe8\xab\xe4\x53\x32\x5c\x8c\xbe\x26\x91\xfd\xa0\x1e\xcc\xe7\xb7\xd7\x89\xc2\xd5\x9e\x03\xfe\xfc\x60\x3c\xd6\x93\x64\x98\xcc\xe7\xf6\x5b\xc8\xcb\x08\x78\x1e\xb3\xe4\x66\x30\x9a\x69\xa2\x5d\x44\x70\x7a\xab\x5c\xde\x85\x98\xfd\xb7\x93\x71\x32\x9f\xeb\x59\xf2\x5f\x6e\x47\xb3\x3e\x21\x00\xf8\xfd\xcf\xb3\x04\x16\x52\xec\xb9\xfa\x36\x1a\x8f\x61\x77\xda\x1b\x1f\x31\x62\xbf\xdf\xf8\x3b\xfd\xed\xcb\x54\x5f\x0f\xee\x10\x55\xe4\x8e\x45\x63\x96\x38\xd8\x91\x44\x0a\xa9\x5d\x4f\x2f\x98\x83\x8f\x53\xbb\x02\x9e\x4d\x60\x31\x85\xe5\xb0\xdb\x43\xac\x00\x91\x64\x32\x98\xdc\x29\x02\xf8\x16\x24\x99\x9e\x39\xf3\x38\xd3\x40\x0b\xdb\x9f\x50\xfc\x81\x8a\x74\xc2\xf2\xb1\x98\xea\xf6\x91\x14\x1c\x92\x5d\xd9\xd3\xcc\x4a\x70\x35\x58\x0c\x14\x8c\x78\x31\xd0\x1f\x13\xfb\xe9\x59\x32\xb9\x4a\x66\x70\x94\x06\xc3\xe1\xed\x6c\xb0\x00\xea\x49\xfb\x8d\x64\xae\xe7\xb7\xf3\xc5\x60\x34\xc1\x4d\xb1\xf3\x05\x02\xc8\xd1\xec\x8a\xcf\x92\x02\xf1\x24\x9a\x4d\xdd\x12\xb0\xc5\x54\x4f\x6f\x12\x78\x24\x08\x9a\xdf\x10\x66\x1f\x38\xf3\x0c\x91\xf3\xdb\xe1\x17\x85\xbb\xa7\x83\x13\x7b\xa7\xbf\x0c\xe6\xfa\x63\x92\x4c\x98\x45\x52\xff\x08\x8b\x64\x32\xc1\xcf\xf5\xa0\xce\x40\x8d\xb2\xd5\xf3\x03\x70\x3a\x31\xa0\xba\x80\x7b\xbe\x29\xf5\x9d\xd5\xab\x13\xf3\x44\x17\x9b\x35\x3b\x14\xdd\x85\x84\x8d\x86\x4d\x2d\x3e\x99\x44\x7d\xdf\x0c\x1c\x4c\xf6\x3f\x5d\x8f\x88\x19\x25\xd0\xc0\x80\x3c\x92\xed\x2d\x30\xe2\x00\xd7\x11\xea\x4b\xb6\xa6\x58\x33\xbc\x45\xd6\xb4\xb4\x3b\x98\x1a\x86\xd1\xd8\x57\x69\xa1\x82\xb8\xa5\x47\xf1\xf6\xd8\xd5\x10\x5c\x05\x0f\x00\xed\x64\xfb\xdc\x56\x18\x04\x0c\x78\x25\xe1\x59\x4f\xcb\x2a\x42\x32\xdf\x22\x45\x80\xcb\xa8\xbf\xe7\xf8\x28\xe4\x1c\xdb\xd2\x67\x88\x87\xea\xfa\xa4\xf8\x15\x11\x73\xfc\x36\x01\x6d\xbc\xeb\x5c\x0a\x50\x66\x63\x62\x1e\xaf\xd3\x8d\xa9\x1b\xb8\xfe\xdd\x97\xb7\xfc\xd9\xba\xa1\xfa\x66\xa8\xc7\xa3\x1c\x34\x16\x40\x97\x88\xc4\x2e\xf1\x3a\x01\xc0\xe6\x80\x4c\x91\xd6\x25\xe0\x72\x93\x10\x4b\x00\x1e\x05\xcf\x20\x64\x54\xac\x12\xf0\xe5\x1c\x46\x9f\x38\xfb\xe2\x44\x41\x8d\x2e\x3a\x9a\xbb\x12\xfc\x2a\x28\xf7\xc7\xac\x13\xe3\x6a\x32\xdf\x53\xad\x37\xd6\xa2\x88\x95\xfa\xcf\x76\x33\xe1\xbb\xb2\x24\x24\x77\x50\x0f\x40\xca\x8c\xf1\x35\x9d\xad\x4d\x8a\xbd\x87\x08\x19\x07\x68\x12\xff\xd4\xe6\x05\xf8\xcf\x07\x93\x56\xff\xa4\xff\x33\xd3\x39\xa3\xdd\xf4\x4f\x0e\x97\xdd\x39\x90\x81\x78\x7d\x70\xdd\x54\x81\x54\xa1\xfd\x2c\xd0\x6e\xb3\xc6\x8b\x4c\x28\x0c\x2f\x42\x72\x42\x83\x68\x9f\x15\xaa\x7a\xed\x2c\x0f\x70\xc3\x84\x08\x3a\x64\xb4\x84\x2c\xd2\x69\x88\xb4\x70\xa6\x3a\xe6\x77\xdc\x9d\xb9\x0c\x6a\x90\x17\xf7\x50\xee\x8c\xc3\xe2\x63\x73\x0d\x7b\xa5\xd0\x0d\x22\xcb\x40\x21\xff\x2e\x5a\x07\x1f\x5c\x41\x3a\x55\xc1\x43\x4c\x18\x3a\xa2\x1d\xd6\x43\xb9\xe9\x5c\xf0\x65\xf5\x03\xf7\xfb\xdc\x98\x1f\x5c\x56\x64\x1b\xa8\x8c\x42\xdf\x8c\x4b\x57\xa5\xd4\xf6\xd7\xc3\xfc\xc8\x96\xe5\x65\x71\xaf\x7c\x54\x9e\x16\xf1\x83\xf5\x83\x8b\xb2\xf9\x41\xa3\x19\x79\x28\x22\xfd\xf6\x42\xfd\x61\x1e\x8a\x41\x5e\x83\xcf\x49\xc8\xe9\x14\x57\x2a\xf4\x03\xea\x72\xa8\x1e\x44\xd4\x68\x2b\x5a\xc0\xc9\x59\x95\x45\xb6\x22\xd4\xe3\x1d\xa0\x59\x67\x79\xb8\x38\x50\x20\x7d\x6f\x48\x84\xcc\x76\x97\x97\x07\x53\xe9\x53\x6e\x1a\x74\x0d\xe1\xe4\xcd\x6c\x4d\x75\xa6\x11\xc8\xbc\xd2\xb5\x75\xb5\xf2\x48\x65\xe0\xf3\x45\x10\x43\xcf\xee\xa1\x67\xc3\x57\xcb\x7a\x20\x94\x13\x57\x54\x2a\x4b\xda\xb8\xdc\xf0\x10\xeb\x2f\xa6\x82\xce\x92\x54\xd7\x10\xe4\xfe\x40\x94\xea\x0d\x71\xb3\xd7\xef\xed\xd8\x0f\xe5\xfa\x50\x18\x5e\x51\x22\x6d\xe2\xb7\x20\xac\x91\x7f\x3b\xe8\x21\x03\xa5\xbc\x2a\x40\x57\xff\xbf\x3e\x55\xe5\xf2\x27\x7d\xea\x61\x06\x60\x70\x4f\x84\xee\xfa\xbd\x28\x97\xf5\x19\x47\x3a\x94\x5a\x1e\xf4\x9f\xed\x08\xf4\x2c\x2d\xd6\xe5\x56\x7f\x49\x57\xdf\x4d\x65\xd5\x97\xc6\x92\xaf\x7d\x05\xba\x66\x71\xd0\xc3\xb2\x2c\xf4\x3f\xe9\x48\x5f\xe8\xc1\xae\xca\x72\x7d\xf1\xeb\xaf\xaf\x94\xa2\xdf\x44\xfa\xa6\x32\x75\xc6\x40\x04\x5f\xb3\x15\x70\x67\xa4\xcd\x4f\x0e\x91\x09\x21\x23\xc1\x77\xff\xff\xfd\x07\x63\x27\x8a\x7f\xbe\xbe\x19\x9f\x5f\xc4\xaf\xfe\x8f\xf1\x7f\xbe\x79\x7d\xf1\xea\xa2\xcd\xff\xf6\xf6\xed\xab\x7f\xf0\xff\xfc\x3d\xfe\x5c\x4f\xff\xeb\x68\x3c\x1e\x1c\x25\xfd\xb9\x88\x5f\x81\x1b\x7e\x11\xeb\x2b\x51\x41\xac\xd4\x45\x7c\x11\xeb\x93\x21\xc7\xed\xcb\xca\xc1\xd0\x59\x23\xc5\x14\x4d\xd6\x50\x39\x24\x77\xcf\x11\xaa\x00\xde\x72\xce\xa6\x82\xdf\x52\xcb\xd9\x75\xab\xdd\xe1\x22\xbe\x0c\xdf\xa1\x69\x58\x27\x02\x9a\xad\x07\x21\x7a\xca\x31\xe3\x21\xd4\x87\xef\xaa\xac\xac\x54\xf0\x70\x07\x06\x92\x6a\xf1\x78\xd7\x62\x18\x8e\xc4\x15\x9b\xba\x7a\x1f\xcc\x45\x29\xf1\x55\x18\xed\x6b\x18\x2d\x16\x82\x0d\x01\x4c\xce\x0f\x33\x18\x93\x5d\x8b\xf0\x15\xdc\x2e\xe2\x27\xa3\xfa\x26\x03\x03\x0c\xbe\x09\xdd\x94\xd8\xf3\x91\x62\xac\x98\x22\xd6\xae\xbb\xc9\xf3\xb7\x5f\xc4\x6f\x62\x7d\x92\xf8\x8b\xe8\x4a\xda\xdd\xd7\x5c\xbe\xed\x91\x19\x7d\x45\xb7\x8b\xca\x50\xf1\x84\x59\x2b\x32\x53\xda\x38\xcd\x54\x90\xb8\xdd\xee\x8b\x4c\x10\x05\x88\xeb\x8f\xa1\xaa\x00\xe7\x21\x6d\xd2\x98\x91\x95\x2e\xe2\xb7\x76\x7c\xae\x00\x90\x07\x22\xd7\x94\x11\xc4\xb0\x24\xca\x17\x80\x13\x86\xdf\x10\xdb\x65\x2f\xe2\x77\xb1\x3e\x19\x59\x71\x4d\x73\x7d\xc5\x08\xd2\x72\x43\xb2\x62\x9d\x3d\x66\xeb\x7d\x9a\x43\xbb\x36\x0a\x2c\x63\xab\x00\x68\x25\xc4\x3d\x3b\xcf\x60\xf3\x4c\xbc\x90\x8d\x68\x57\xb0\xb3\x3c\xe8\xe4\x37\xa8\x80\xd1\x03\x18\xcd\x2f\xb1\x3e\x19\xa7\xd5\xbd\xa9\xf4\xb7\xb2\xfa\xee\x57\x58\x60\x41\x52\xb5\x57\x6b\xba\x65\xd5\xd9\x49\x34\x7e\x56\xf4\x62\x7d\x0f\x0c\xe3\x22\x86\x77\x04\x83\x89\xd7\xf8\x4f\x76\x2c\x84\xdb\xe9\xd6\xc3\x9a\xa0\xc4\x84\x05\x03\xfe\x35\xd6\x27\x81\x9c\xb9\x21\x17\x07\x87\xb1\x61\xcf\x30\x34\x2d\xe5\x06\x61\x06\x5d\x37\xf5\x7e\x89\x99\x52\x55\x56\xa2\xd1\xd0\x7a\x43\xcc\x49\xde\x73\x22\x20\x45\x58\x99\xc7\xac\xdc\xd7\x2d\x5d\xa0\xbf\x3d\x98\x42\x85\x72\x50\x7b\xf6\x2d\x2c\x2e\x36\x15\x53\xf3\x20\xdc\x61\x1a\x3c\x44\x67\xd6\x5a\x19\x50\xd5\xda\x4b\x33\x70\x48\x7f\x48\x9b\x90\x05\xdd\x20\x6e\xe8\xca\x6d\x51\xff\xb0\x95\xfa\x88\xef\x03\xfe\x1d\xee\x7e\x15\x30\xaf\x45\x08\x70\xd0\x59\x92\xa3\xcf\xbd\x88\x2f\x5e\xc5\xfa\x24\xf8\x02\x6f\x91\x94\xcc\x72\x23\xfa\x26\xf8\xa4\x22\x48\x3c\x45\xa4\xd5\xda\xd4\xab\x2a\x5b\x7a\xc7\xe3\x47\x25\xdb\x2e\x7b\xa8\x6a\x15\x02\x0f\x66\xab\x07\xeb\x50\xa3\x34\x66\xe8\xf3\x65\x8d\xdb\xaf\xbe\x14\x9d\x23\x5b\xc3\x8a\x77\xda\x69\x5c\xdf\x50\xc0\xc3\x94\x56\x7c\x61\xaf\x21\x31\xe2\x93\x17\x51\x3b\x03\x29\xf2\xe8\x9d\x2a\x68\xb6\x43\x6b\x4f\x12\x47\x40\x23\xec\x0f\xa2\x70\xaa\xe7\x50\x38\xff\x08\xf8\xa6\x42\xd0\xfb\x44\x54\xfa\x13\xac\x28\x66\x6f\x65\x8b\xb3\xe3\x8b\x00\x54\xf9\x72\xbb\x4b\xab\xac\x86\xc4\xc6\xbd\x1d\x70\xa3\x9e\x3f\x83\x04\x41\x63\xf2\x1c\x88\x57\x8a\x48\xa7\x8f\x69\x96\x43\x45\x46\xa8\x99\x30\x0b\x28\x2e\xc1\x9f\x6a\xce\x5a\x43\x9e\x51\xca\x11\x35\x4d\x43\x95\xb5\x1d\x13\x21\x03\xdb\x37\x56\xab\x87\xec\x31\xcd\x95\xdd\xa3\xa0\x0e\xda\x04\xa0\x8e\x6b\xc3\xdf\x73\xb0\x1c\xe7\xf8\x5d\xa4\xf5\xf0\x34\x70\x08\x09\xaf\xfc\xb0\x37\xd0\xe1\x4a\x4d\x29\x28\x35\xd6\xb0\xb8\x2b\xf7\x5e\xab\xb5\xee\x83\x94\x78\x77\xe8\x5e\xa0\x6a\x33\x88\x56\x89\x6a\xd3\x88\xaa\xda\xb6\xbb\xfc\xe0\xda\xa3\xac\xa0\x30\x55\x05\xa9\xe2\x28\x14\x76\x04\x55\xdc\x83\x4e\xf4\xbd\x45\xaa\x75\x20\xea\x7d\xbb\x33\x4f\xbf\xb3\x46\xd7\x27\xe8\xb0\x76\x83\x83\x6c\x34\xce\x85\x5a\x24\x6a\x88\x38\xd0\xc8\x3d\xb0\x74\x55\xe6\xcc\x77\x02\xff\xc8\xe1\x44\x61\xb3\x7a\xed\x30\x81\xb7\x5b\xcc\x86\x81\x48\x02\x10\xd2\x5d\xb9\xc7\x97\x52\x09\x89\xbf\x5b\xbc\x6c\x47\xd6\xc1\x84\xef\xf0\x8a\x9e\xa6\x67\x78\x06\xcb\x27\x53\x45\x54\xac\xa4\x44\xa9\x52\x84\x50\x87\xdc\xa8\x46\x9d\x98\xb8\xb5\xdb\xb4\x48\xef\xa9\x3e\x8d\x91\x08\x60\x3a\xae\x69\x59\x2d\x99\x7f\x70\x15\xd6\xb0\x61\x08\x66\x79\xa6\xcb\xa7\xc2\x54\xf5\x43\xb6\xc3\x1b\x61\xd3\x40\xcc\x71\x65\x9f\x79\xfa\xf6\xd5\x7f\x3a\xd3\x1c\xa3\xe0\xc8\xe1\xbe\x01\x76\x03\x90\xa6\x87\xb4\x42\x8b\x75\x69\x0a\xb3\xc9\xa0\x69\x25\x78\xa0\x18\x13\x5e\xad\x97\x71\x20\xef\xed\x6b\xf7\xd2\xee\x9c\x3d\x14\x5d\x7b\xe2\x73\x95\x16\x0d\x61\x4a\x77\x7f\x2b\x39\x90\x6b\x2c\x67\xb4\x46\x43\xbe\x3e\xb7\x62\x1e\x05\x05\x65\x48\xc2\x40\x01\xc4\x47\xa3\x5c\xd5\x75\x50\x92\xc9\xc5\x8d\x90\x20\x35\x00\xac\x65\x85\xde\xd5\x1e\xa1\xdb\xfe\x5e\xa9\x53\x84\xbf\x06\x82\x3d\xee\xf5\x31\xbe\xac\x9b\x1a\x76\x23\x6e\xe6\x92\x85\xde\xad\xb6\x07\xd5\xd5\x35\xa7\x3d\x86\xcd\x99\x6e\x13\x41\xb7\x4c\xdd\xb2\x52\x01\xa4\x9b\x30\xa9\x20\x42\xaa\x94\xdd\x79\x14\x65\x2e\x31\x29\xca\x27\xfb\x44\x80\x8c\x07\x06\x31\xbb\x8f\x6b\xe7\x8d\xf0\x39\xe8\x2e\x3d\xb4\xc4\x6d\xd3\xef\x26\xf2\x15\x4b\x11\x36\x43\x03\x1e\x5e\x9e\xeb\xd3\x93\xdb\x26\xcb\xb3\xbf\x9a\x93\xb3\x1e\x75\x2a\xa7\xa8\x78\x8a\x18\xba\xab\xcb\xdc\x78\xb8\x3f\xc0\x80\x13\x0c\x4a\x54\x30\xce\x00\x6a\x1e\xa0\xcf\xc7\x66\x14\x20\x4b\x82\x76\xbb\xc3\xca\x32\x1a\xc9\x0b\xe3\xf0\x4b\x6d\x27\x01\x75\x28\x25\xa8\x0b\x66\x92\x90\x63\x21\xc0\x0d\xf7\x52\xf9\x1a\xae\xd3\xbd\x6e\x63\xb0\x0a\x17\xa6\x16\xe2\x7f\x19\xcb\x9b\xc2\x09\x3d\xd4\x63\xc8\x5f\xfc\xc7\x91\xf7\xd0\xc1\x43\x2f\x18\x19\xd0\xf6\xad\x39\xf7\x6f\x10\xe1\xb9\x83\x35\xa0\xf7\x85\xe7\x50\x4b\xeb\xac\x8e\x64\x4f\x52\xeb\x94\xa4\x5d\x17\x82\x4e\x8d\xfa\x9b\x9f\x9a\xc0\x7b\x6e\x4a\x25\xa5\xb0\xc7\x71\xef\x9f\xea\xf1\x33\xa1\x7e\xcf\x99\xd0\xcf\x9d\x09\xf5\x3b\x46\xe3\x8f\x86\x3e\x72\x34\xd4\xef\x3e\x1a\xba\xf7\x68\xbc\x8e\x43\x1f\x7c\xea\xcb\x93\xdd\xd9\x79\x6d\xaf\x8e\x41\x58\xba\xe8\xaf\x97\x45\x47\xd2\xf0\xc6\x87\x84\x1b\x0c\x9c\xea\x47\xc5\x8f\x5d\x14\x06\x6a\x5d\xd8\xbc\x56\xcf\xf9\x8f\xd2\x12\xee\x01\xd8\x77\x50\x68\xf6\x9c\x2f\x1e\x8c\x92\x77\xa1\x68\x9f\x0e\xe4\xb2\x87\x98\x02\x6a\xe6\x5a\xa9\x3d\xd5\x2e\xa9\xea\x37\x9f\xc2\xcf\x38\xd7\x30\x30\xa0\xd4\xbb\xf8\x02\xb7\xf7\xae\x8d\x28\x71\x04\x9c\x1b\x21\x35\x90\x12\x51\xa4\x29\x70\x7a\xe8\x9e\xdc\x85\x0d\x8a\x41\x63\x03\x76\x1b\x5b\xab\xc7\x77\x38\xd0\xfa\x62\x18\x43\xac\x93\x0a\x7a\xbe\x21\xd0\x0e\x52\xc3\x55\x95\x35\x9b\xc4\x56\x10\xac\x90\x1f\x9b\x7b\x59\xa9\x56\xb7\x04\x1b\xad\x56\xc2\x61\x41\x44\x77\x10\x0f\xd7\xf7\xd7\x3a\xef\x38\xcd\x5d\x50\x40\xb9\x46\x6b\x18\x84\xff\x00\x3d\x39\x70\x22\x59\x1a\x5e\xc7\x6f\x85\x14\x5f\xc6\x7a\x80\x26\x39\xb6\x14\x97\x9b\x56\xd0\xc6\x3a\xca\x81\xc7\xfe\x7b\x24\x99\xdb\x00\xed\x2d\x2d\x4c\xff\x2c\x88\x0c\x1d\x83\xe2\x0b\xd7\x8f\x6b\xe9\xb0\x72\x1e\xfa\xed\xb6\x66\x9d\xa5\x04\x14\xed\x9d\x30\xbf\x03\x95\x7e\xb4\xbf\x2f\x5c\x74\x4c\x1f\x89\xb2\x29\x17\x65\x23\xed\x52\x62\x9e\xf5\xe9\x81\x5a\xce\x20\xd6\xd8\xff\x16\x37\x2b\xd4\xda\xd9\x86\x3e\xec\x26\x6b\xc7\xf0\x62\x74\x2f\xc2\xa5\xa2\x3e\x34\xf7\x65\x15\x22\x03\x3c\x99\xfc\xd1\xe8\xd3\x8b\xcb\x33\xbd\x2d\x8b\xe6\xa1\x26\xfa\xd5\x86\xc1\xc5\x81\x57\x18\x2c\x26\x40\xa5\x58\x41\x52\x98\x1f\x16\x29\xf9\xb0\x3a\xfb\x4d\x9f\xbe\x6b\x3d\x28\x95\x10\x92\x81\x24\x07\x31\xd6\x40\x20\x00\x71\x13\xe8\x52\x5a\x13\x07\x76\xe0\xd5\x83\x10\x79\xdf\xf9\xd3\xed\xfa\xa9\x01\x7a\xc6\x23\xfa\xf4\xe9\x2a\x46\xc7\xf6\xef\x80\x7c\x2a\x21\x3e\xbc\xbc\xb9\x00\x51\x90\x15\x44\x7d\x09\x81\x66\x61\x89\x88\x53\x61\x6f\x00\x83\x21\x01\x5a\x81\x76\xa8\xa7\x85\xd9\x6e\xdd\xcb\x40\x8d\xba\x13\x71\x08\x4f\x04\xa7\x20\xc1\xe7\xde\x64\xb9\xe7\xba\xe7\x63\xcc\xd0\x24\x77\x2c\x77\xf6\x2b\x78\xd2\x60\x71\x82\xd7\x48\x68\x79\x15\x42\xcb\xf7\x69\x53\xdf\x52\x0b\x48\x73\x5b\x67\x54\xb6\x4d\x23\x84\x23\x04\x9c\xea\xe8\x48\x4f\x0b\x75\x64\x86\x56\xad\x0b\x14\xd0\xb5\x45\xf6\xbb\xf2\xae\x13\x06\x51\x7c\x05\x37\xe6\x2c\x59\x85\xf7\x06\x76\xd9\x6b\x15\xfa\x9d\xc0\x42\x96\x67\x1c\x79\xe6\x8a\x89\xe2\xb8\x32\xa8\x0c\x32\xdb\xf0\x82\xd3\x44\xa5\x46\x63\x85\x29\x8a\xdc\xc1\x8f\x95\x4e\x66\x3b\x5a\x25\xc4\xe6\x4d\xac\x47\xd2\x9a\xbd\x61\x6b\xf6\x1a\xf8\xb0\x6a\xfe\xa4\xd6\x30\xa7\x05\xc8\xde\x0d\x58\xc1\x43\xb0\x77\xb1\x3f\xe7\x8e\x0b\x8e\xbf\x17\xe5\x53\x6e\xd6\xf7\x8e\x5c\x16\x2d\x66\x4e\xe1\x16\x47\x6c\x67\xce\xe9\xca\x0e\x1d\x86\x5e\x49\x51\xcb\x13\x6f\xf4\x29\xb5\x8f\x02\xa0\xc4\x5f\x53\x5f\xe9\x13\xe8\xde\x33\xac\x81\x6e\xc9\x52\x63\x7e\x23\xa0\x38\xd7\x97\x1d\x06\xbc\x84\x9e\x6b\xb2\x06\xe8\xa9\xc6\xc9\xe7\xc1\xf8\x84\xe0\xbe\x79\xb1\x29\x63\x04\x58\xd7\x2c\xcf\x38\x51\x2a\x71\xf2\xbf\xce\x0a\x5d\xef\x37\xd6\xf5\xb7\x92\x8b\x75\x0c\x64\x8d\x8a\xe6\x4a\x28\xcb\x00\x7e\x62\x50\xe0\x3e\xeb\xef\xaa\x95\x91\xfe\x16\xd5\x93\x5f\x64\xd0\x81\x44\xf0\xf1\xdd\x60\x85\x57\x70\xf5\x79\xbd\x93\x1e\xbd\x5c\x2f\xf1\xf2\xae\x1f\xd2\x3c\x57\xf6\xbc\xed\xec\xc9\x91\x1d\x99\x76\x0d\x08\x61\xaf\xe0\x3c\x7c\xe6\x0e\xfc\xf7\x40\x85\x3a\x53\x1f\x62\x5a\xf0\x50\xdd\xd8\xcf\x50\xdf\x4a\x63\x76\xb5\x3e\x45\xfc\x02\x08\xd6\x52\x7b\xae\x8c\xd1\x6d\x53\xa4\xdd\xce\xb3\x1a\x9a\x3b\x54\x61\x9e\xea\xfb\xaa\xdc\xef\xea\x33\x69\xb2\xaf\xd2\xdc\xca\x0a\xf5\x34\x62\xf9\x44\xb7\xd1\x6d\x2d\x0f\x00\xda\x5a\xb0\x01\x85\x79\x12\x4b\xe9\xee\x04\x26\x1a\x8e\xa5\xec\x2f\xcf\x02\x37\x64\x70\x33\xf2\x92\x5f\xb5\xf3\x03\x47\x38\x24\x00\xa6\xc6\x47\x74\xd9\x7c\x2c\x9f\xec\x89\x55\x1c\x2b\x63\xcf\x89\x0a\xfe\x2b\x73\xd4\x47\x71\x4d\x53\x38\x9d\xc1\xcd\x28\x42\x96\x16\x2b\xf5\x50\xff\xe1\x61\xce\xa0\xdf\xc7\x57\x97\x30\x44\x94\xdb\x58\xa1\x12\xde\xc6\x7a\xc6\x61\xfa\x89\x83\x8b\x76\xaa\x79\xbd\xc7\x89\xa1\xc6\xf1\x4a\xcc\x87\xf3\x39\x91\x08\x02\x13\x18\xba\x22\xba\x1f\x06\x29\x51\x23\x06\x6a\xce\x65\xfc\xe4\x57\xa9\xea\x4c\x2a\x3e\xd5\x63\x9f\x82\xde\xc4\x76\xaa\x50\xf1\x69\xd2\x55\xec\x45\x97\x88\x1e\x08\xe0\x42\x72\x13\x4f\xeb\xb3\xc8\xf1\xe6\xa4\xeb\x35\x96\xc5\x60\xc5\x5a\x1d\x26\x7b\xd9\xd1\xa4\x95\x08\xce\x18\xad\x89\x1a\x20\xe1\x82\x6b\xf5\x73\xfc\xa9\x4d\xa9\x77\xd6\x65\x85\x86\x16\x7f\x1f\x48\xc3\x25\x30\x3b\xe1\xf6\xdd\x1b\xcc\x2a\xd4\x3e\x25\xd6\x26\x12\xe1\x8d\xef\x3c\x38\x2f\x49\x26\xe1\x04\x2a\x82\xb1\xcb\xcd\x63\x6a\xb5\x13\xdc\x93\x65\x75\x80\x17\x9d\xd1\x62\xa7\x84\x41\xc6\x5d\x9c\x79\xf6\x9d\xfc\xeb\xbc\x2c\xb1\x5d\x01\x9f\x45\x2f\x12\x08\xd9\xd8\xb0\xd1\x94\x8c\x1d\x85\x64\x47\x1d\x22\xa2\xc8\xd5\x94\x45\x00\xfd\x57\x56\x4d\xa4\xb2\x62\x6d\xb6\x05\xa9\xfe\x3c\x73\xd6\xbe\xe8\xd7\x6d\xca\x60\x03\x05\xe3\x7b\xcb\x45\x8c\x55\xc7\x4d\xc1\x02\x52\xf0\x13\xcb\x02\x4f\xb1\x3d\x88\x4b\xf3\x90\xe6\x1b\xef\xba\x97\xfc\xa3\xd6\x75\x2f\xcc\x03\xca\x38\xca\x24\xbe\x37\x64\x98\x0c\x3f\x5d\xd6\x65\xbe\x07\xe6\x29\x47\x89\x5f\xb8\x80\x84\xea\xce\x5f\xbf\x38\x7f\x40\x47\x83\x14\x0d\xd8\x2e\x60\xa7\xe6\x65\x41\xe7\x0b\x6e\x64\x8c\x81\x41\x93\x36\xb5\x90\xda\x47\x6e\x0e\x47\x0c\x17\x4f\x0b\x21\x26\xa3\xb8\x9f\xdc\x8f\x21\x2b\x56\xfb\xaa\xea\x98\x4c\x3a\x58\x93\x4e\x74\x0a\x1a\xa4\x2b\x53\xef\xf3\x46\x96\xa4\xbe\x3c\x65\xf4\xae\x40\x55\xda\xe9\x0a\x55\xf5\xae\x15\xf6\x28\x37\xd2\x90\xa2\xe8\x4c\x2d\x28\xb0\x44\xfd\x67\xbb\x18\x20\x69\x01\xad\x4b\x32\x6e\xc9\xb0\xa2\x04\x78\xea\xeb\xf8\xe2\xfc\x75\xfc\x16\x4d\x1f\x74\x28\x4c\xe3\xc1\xf1\xe5\x2b\x88\x8c\x1d\xd5\x0f\x1d\x4f\x77\x64\x02\x4a\xa6\xa3\xbe\x44\x5f\xde\x31\x13\xae\x45\x3f\x5c\x4d\x7f\xec\x25\x25\x45\xe5\xbc\x85\x87\xf2\x89\xe8\xde\x4c\x65\x94\xb3\xe7\x36\xfb\x7c\x93\x21\xd2\x38\x00\xcc\xfa\xc3\x17\x2c\x03\x46\x6b\x78\x36\x92\x84\xdf\x71\xb0\x29\x47\xac\xf8\x63\xf6\x6f\xd4\x6f\xfd\xe2\x55\x99\x43\x1d\x6c\x9a\xeb\x7e\x5b\xf8\x85\x2b\xa1\x6d\x0e\x78\x8d\xd5\xea\xd3\xef\xb3\xca\x5b\xc1\x27\x6a\x2e\xe7\xe6\x35\x2b\x1d\x77\x12\xf8\x95\x80\xf2\xd3\x83\x73\xa2\x70\x6f\x5c\x76\x95\x6b\x05\xe4\x3e\x85\x68\xb1\xec\x81\x66\x85\x80\x79\xf1\x26\x6c\x7f\xf0\x21\x40\x62\xe5\xc1\xf1\x95\xda\x33\x2f\xd7\x8f\xc7\x40\x3c\x56\xbf\x67\xdb\x8c\x70\x27\xd8\x67\x77\x2b\xfb\x53\xcd\x74\x2e\x3d\xd9\x7e\x7e\xa8\x2b\x83\xa0\x8f\xd6\x78\x3a\x9a\x07\xfc\x92\x4c\xc1\xd3\xc5\xfc\xf2\x06\xf0\x82\xfb\x05\xe4\xd8\x39\x2b\x5d\xf5\x9c\xd2\x6d\x44\xec\x8c\x8c\x7a\xec\x00\xed\x6c\x83\x5d\x73\xd5\xab\x60\x91\x6c\xe5\x19\xdd\xd7\x77\x1f\xa8\xbf\x89\x36\x46\x5c\xc4\xbf\x89\x36\xd6\xac\x8d\x95\x44\x00\x38\xae\x6c\x7f\x89\x65\xc4\x5f\x6a\x55\xf2\xf5\x83\x8c\x00\xf6\x63\x6f\x97\x58\xe8\x12\x1c\x19\x91\x71\xe0\xe2\x23\xf5\x43\xc5\x47\xbd\x6c\x1b\xe2\x95\x76\x4e\x8a\xb0\xd7\x30\xed\xd2\xf8\x86\xe8\x94\x5a\xa2\xc3\xab\x99\x38\xd5\x5a\x24\x5a\x2d\x8e\x1c\x8d\x34\xc2\xac\x09\xf9\x14\x75\x5d\x6a\xf0\xa6\xdd\xb5\x65\x6d\xcf\xed\x2e\x3f\xe8\x2b\xb4\xd8\xe6\x4d\x0a\x4c\x9f\x65\xa5\x67\xe6\x7e\x9f\x73\x4f\xaa\x33\x0d\x21\xb8\xeb\x23\x4c\x94\x7c\xc0\xb2\x00\x81\x63\xb6\x39\xbe\x42\x58\xd2\x55\x01\xfa\x3c\x1c\xe1\xba\xdc\x1a\x42\x8e\xe9\xbd\x3f\xc8\x98\xac\xfd\xd0\x2a\x37\x34\x05\x36\x25\xaf\xd7\x7b\x08\x00\xc8\xc1\x1c\xdf\x27\xa6\x1f\x4b\x7f\xcb\xb6\xfb\x2d\xe7\x60\x78\x72\x1f\x5c\x24\x24\x08\x5e\xf8\x34\x80\xe7\x1f\x5c\xa1\xb3\x66\x0e\x3a\x85\x2e\x17\xec\xfd\x56\xf2\xee\xe2\xcb\x46\x5e\x2f\x2d\xa7\xf5\x88\xdf\xfb\x06\xc2\x9f\x9d\xef\xbb\xe2\x0b\x19\x0f\xa8\x7b\x1c\x99\x58\x27\x88\x74\x46\x0c\x43\x94\xd7\x09\x41\xab\x7a\x57\x36\x42\x91\xec\x9b\x86\x0f\x16\x00\x50\x7f\x93\x66\x2c\x72\x32\x5e\x50\x6e\x7c\x87\x52\xfd\x3d\xcb\x73\x86\x66\x20\xa7\x82\x90\x84\x11\x79\x1b\x65\xf3\x6d\x27\xf9\xd3\xaa\x81\x0a\x28\xc8\x45\xa3\xf9\x2a\x08\x0e\xf6\x6b\x18\x40\x28\x85\xe6\x25\xb4\x14\x54\x8f\x5f\xe8\xcc\x7f\xbe\xd7\xbb\xe7\xe7\x5d\xec\x8c\xb6\x56\x47\x8c\xd3\x43\x50\xba\x32\x31\x4f\xd2\xba\x9b\x98\xa6\x5e\xa5\x3b\xbb\x2b\x50\x2e\xca\x19\xac\x21\xf5\x75\x83\xbf\x73\xc2\x9f\x3a\x39\x7b\x06\xa0\x40\xb5\x00\x0a\xe4\x18\xfa\xa0\x08\x02\x1c\x00\xd7\x0b\x9d\x3d\x9a\x42\xbd\x04\x06\xe0\x67\x74\x19\xeb\x04\xc4\xdb\xbe\xb0\x35\x37\xa0\x69\x0a\x8e\xac\x0b\x54\xf8\x8e\x23\xbe\x13\x85\xdb\xd8\xe1\xfa\x27\x3a\x3d\xe7\xd4\xe6\x4f\xe9\x01\x6b\x78\xb2\x02\x95\x00\xf1\x8b\xf4\x5a\x91\x1e\x0b\xc0\x19\x4b\x0a\x31\xf8\x9d\x8f\x07\x3c\xe8\x78\xcd\x74\xec\xa3\xe0\x69\x78\xd7\xb4\x83\xf6\xaa\xb5\xd8\x41\x3f\x15\xef\x5d\xac\x27\xe4\xf3\xf9\x8a\x5d\xb7\xfb\x8c\x53\x83\xe8\x1e\x1e\x8a\xce\xbf\x5c\x24\xbd\x5a\x91\x01\x17\x11\xe8\x41\xff\xf3\x1b\x05\x41\x76\x07\x5b\xc7\xd7\x20\x03\x50\xb9\xdc\x12\x84\xd7\x3d\x64\xf6\xb1\xfc\xda\xa9\x0f\xb7\x03\xf7\x5a\x61\x4f\x7c\x89\x50\x1f\x6b\x6c\xb2\x23\xf0\xa0\xc6\x9d\x43\xd7\xff\xdf\x53\xe5\xa8\x83\x2a\xc7\x36\x13\xf6\x99\xc0\x9b\xb7\x9a\xbc\x32\x10\xce\x00\x63\x95\x2d\x28\x89\x80\xbe\x7b\xa8\xd2\xda\xd4\xfa\xe4\xba\xfc\x6b\x96\xe7\xe9\x49\xa4\x4e\xa8\xca\xff\x66\x7c\x12\x69\xfb\x0f\xfc\x8b\x3b\x58\xf6\xef\x37\xe3\x13\xb6\x80\x56\x65\xb1\x01\x12\x6d\x20\x41\x41\x60\x0e\x7c\xaa\xf2\x2c\x8e\xd6\x2c\x4b\x8b\x03\x86\x1a\xb2\x02\x03\x2d\xb2\x1a\x02\x6a\xb0\x1c\x28\x24\x9b\x76\xde\x9e\x53\xf0\x8d\x0e\xb4\x36\x3e\xc0\x55\xc8\x1e\x37\xf8\x8c\xa6\x09\xb6\x5a\x3c\xe1\xe5\x4e\xb6\xc2\xe6\xb1\x58\x9f\x7e\x22\xc0\x1e\xba\x6d\x9e\xcd\x08\x44\xaa\x53\x1f\x29\x4d\x31\x7e\xc4\xf1\x00\x92\x1e\x50\x20\xd5\x9a\x4a\xf8\x16\xa2\xcc\x84\xc4\xb7\x31\x5b\x07\xce\x13\x56\x9f\xb6\xb5\xfc\x19\xc8\xf2\x2f\xb1\xbe\x1a\xcd\x87\xe3\xc1\xe8\x3a\x99\xe9\xe9\x27\xd7\xf5\x17\x2b\x35\x9c\x7e\x85\xae\xe9\xe1\xf4\x0a\xd0\x0e\x08\x52\xe0\x4a\xdf\x4e\xae\x12\xe8\x91\x76\x18\x09\x7a\x3a\xd1\x83\x89\x66\x80\x81\x8f\x83\xf9\x68\x1e\x75\x70\x06\xd4\x1f\xc1\x19\x70\x4f\x81\x5e\xef\xc1\x62\x34\x9d\x44\x02\x5b\x40\x2d\xbe\x0c\x16\x04\x8c\x10\x0e\x97\x51\x1b\xb0\xb9\x7f\x1e\x89\x0e\xc5\x71\x12\xe9\x4f\xa3\x85\x6e\x37\x26\x2a\x6a\x4c\xb4\x43\x99\x4c\x27\xe7\xa3\xc9\xa7\xd9\x68\xf2\x79\x34\xf9\xfc\x6f\x80\x22\x68\x8f\xab\x83\x47\x80\xcd\xfd\xe2\x43\x2d\x50\x02\x3d\x9a\x40\x43\xe6\x2c\x99\xdf\x24\xc3\x05\x62\x14\x9c\x4e\xa6\x38\xed\xd1\x64\x84\xcd\xf5\xc9\xd7\x64\x3c\xbd\xc1\xce\x72\xdf\x85\x3e\x9c\x4e\xb0\xf1\x7f\x3a\x3b\xeb\x05\x36\x98\xdc\xfd\x0e\x60\x03\xdc\x74\x2f\x31\x4a\x48\x0c\x34\xfb\x2f\x46\x8b\xdb\x45\x32\xb7\xc2\x60\x37\x15\xfb\xfe\xed\x02\x63\x3f\xbb\x97\x98\x58\x4f\xb0\xc3\x9f\xc6\x40\x0b\xa0\x78\x95\x06\xb7\x8b\x2f\xd3\xd9\xe8\xbf\x26\x57\xfa\x4b\x32\x4b\x50\xe4\x08\x27\x43\xc8\x9f\x1f\x0a\xea\xe6\x3f\xc5\xd0\x0d\x3f\x9a\x0c\x08\x88\x61\xd1\xf5\x84\x7b\x91\x1d\x51\xd9\xc3\xb5\xed\xb1\x60\x03\xa0\x4b\x45\x11\x9b\x0d\x41\x03\x05\xf6\x2f\xe8\x14\x44\x88\x84\xb7\xb8\x0f\x59\xa7\x02\xae\xc2\x65\x05\x91\x70\xfb\xf1\xac\x50\xaf\x5f\xe9\xb5\xbd\x74\xcb\x8d\x5e\x9a\x55\x89\xac\xe5\x50\x6d\x4c\x9a\x03\x3f\x1e\xeb\x01\x32\x23\x7a\x3c\xd8\xb2\x63\xb9\x2b\x9f\x1f\x70\x7c\x03\x3c\x35\xd4\x15\xf5\xbe\x7a\xb4\xd7\x14\xfb\xbb\x41\x73\x93\xbc\xde\x6e\xaa\xf2\x31\xab\x7d\xcd\x4f\x44\x4e\x58\x56\x69\xec\x7f\x0c\x53\xfd\x59\x41\x2d\xe7\x7a\x69\x0e\x25\x2d\xae\x78\x41\xa7\xce\x26\x18\x0e\xee\xd8\xaf\xb1\x38\xd9\x56\x1a\xc6\x23\x6a\x21\x8e\x95\xc2\x9d\x9e\x4c\xf5\x70\x34\x1b\xde\x5e\xcf\x17\xf6\x60\x21\xd4\x81\xfb\x15\x5a\xf7\x8b\x2f\xc9\x74\x76\x17\xe9\x6f\x5f\x12\x90\xfb\xc5\x74\xb6\x10\x88\x11\x6a\x92\x7c\x1e\x8f\x3e\x27\x93\x61\x72\x16\xe1\xa1\x18\xd8\xa3\xc4\x28\x0c\xdf\x46\xf3\x24\xd2\xf3\x2f\x83\xf1\xb8\xff\x54\x45\xfe\x4c\x29\x71\xa6\x1c\x08\x87\x03\xd8\x98\x82\x1a\x95\xe7\xd9\x7d\x66\x7e\x7b\x63\xd5\xdb\x8c\x65\x7e\xfa\x49\x01\x9e\x03\xe1\x4c\xf4\x40\x6f\x84\x08\x1f\xc9\x6c\x3e\x9d\xa0\xd2\x9a\xdc\xe9\xd1\xe4\x6a\x34\x03\x7d\xc0\xe0\x1b\xca\x83\x6f\x44\xc7\xd1\x37\xf8\xc0\x7d\x19\xd8\x25\x48\x66\x2f\xe8\x5a\xc5\xdf\xfb\x44\x90\x19\xf6\x01\x9f\xa7\xd3\xab\x6f\xa3\xf1\x38\xd2\xdf\xa6\xb3\x7f\xd6\xf3\xc5\xf4\xe6\x66\xf0\x39\xb1\x2b\x7b\x7d\x73\x6b\x1f\xea\xe0\x32\x66\xfa\x7a\x30\xfe\x74\x3b\x19\xe2\xd3\x68\xf0\x76\x07\xed\x5a\xb3\x92\xba\xb6\xca\x39\x18\x25\xe3\x73\x84\xe8\x19\x84\x96\x01\x1b\xa5\xbe\x0c\xbe\x26\x08\x9a\x31\x9a\x58\xad\xfb\x63\xa8\x19\xac\x86\x84\xcc\x29\x27\x73\x24\x02\x56\xb9\x0e\x6e\x6e\xc6\x80\xef\xe1\x7f\x09\x48\x28\xc9\x60\xf1\xc5\x0e\x0f\xb7\x63\x30\xd6\xa3\xc9\x9f\x6f\x67\xa0\x9e\x6f\xc7\x00\xd9\xf2\x69\x36\xbd\x16\xa3\xfd\x69\xae\xbd\xf4\xb5\x60\x81\x5a\x20\x30\x37\xb3\xe9\x97\xd1\xc7\xd1\x62\x8e\x5f\xf7\x83\x8c\xd5\x7c\x7a\x9d\xe8\x3f\xdf\xce\x46\xf3\xab\x11\xac\xe5\x5c\x5f\x4d\x71\xa0\xe3\xf1\xf4\x1b\x3d\x74\x38\xbe\x9d\xc3\x9c\x66\xad\x53\xe5\x45\x43\x1d\x93\x8c\x48\xcf\xed\xd8\x06\x0b\xf1\x1c\xbb\x4f\xe2\x41\xd7\x83\xbb\x60\x6d\x94\xbd\xc7\xb0\x9b\xf3\x55\xac\x6f\xe3\x79\xac\x3f\x5b\xc9\x9f\x5c\xdb\xc9\x25\xf6\x98\xce\x93\xd9\x9c\x8a\x0a\x3b\xe1\x6a\x7d\x02\x78\x20\x15\x14\xc3\x67\x8d\xd9\x46\x27\xd8\x24\x67\x0d\x4f\x53\x41\xcd\x8b\x67\x77\xd7\x6f\xfe\xa4\x87\xf1\xa7\x78\x16\xab\xcb\xf8\xe2\xd5\x85\x3e\x9d\xae\x9a\x58\x5f\xfc\xfa\xeb\x5b\x84\xad\xad\xd1\xc9\xb2\x6a\x4d\x3e\xb8\xd3\xad\x74\x82\x70\x69\xfe\x23\xaa\xdb\xd0\x14\x44\x9a\x71\x58\x22\x28\x96\x0a\x36\x24\x37\x2a\x7d\x71\x19\x5f\x5e\x5c\xaa\xd3\xb9\xd9\xf1\xb8\xa0\x44\x99\xc1\x22\xe1\xaa\x68\x7f\x1c\xc6\xe2\x7f\x78\x79\xf9\x4b\xfc\xcb\xe5\xab\xcb\xf3\x0b\x46\x7a\x54\xee\x47\x6f\xf4\xe9\x9f\xf7\x85\xe1\x19\x5b\x55\x8a\x4b\x0e\x76\x3e\xa4\x7f\x93\x62\xad\x6f\x6b\x53\xd5\x3a\x5d\x41\x14\xab\x75\x53\x40\xbc\xad\x00\xa4\x12\x60\xec\x6f\x07\x63\x09\xe4\x18\xb7\xf4\x22\xd6\xd7\xa3\xf9\x30\x19\x8f\x07\x93\x64\x7a\x3b\x6f\x5f\xa7\x95\x21\x2c\x3d\xd7\x36\x8b\x7c\x4c\x1e\x0a\x98\x60\xf2\x90\x7d\x0c\x0b\xa8\xb7\x50\x4d\xa2\xb9\x83\x94\x11\x5d\xf9\xe2\xe9\xb8\x46\x8c\xe9\x8a\x36\x6d\x00\xe7\x4a\xb1\x13\xf7\x5d\x85\xd7\x0b\x44\xfd\x37\x65\xb5\xe5\xea\xcf\xb0\x26\x3e\x48\x9c\xb3\x13\x21\x9e\x8a\x24\x00\x2a\xbc\xb2\x96\x61\xcf\xd8\x30\xcd\xb3\x4d\x59\x15\x59\x0a\x50\xe4\x3b\x7f\x6d\x9e\x1a\x19\x08\xe2\x78\x97\xf0\x36\xf3\xf4\x09\x81\x7d\x0b\x4f\xd1\x20\xb8\x13\xce\x22\x01\x11\x99\x35\xe0\x96\x6f\xf2\x6c\xd5\x9c\x97\x9b\xf3\x3c\x7d\x52\xfe\x5d\xb1\xfe\xd6\x0a\xf1\xad\xb3\x7a\x07\x9d\xd0\x2e\x17\xe2\x2a\xe6\xac\xa7\x4c\x25\xeb\x80\x30\x9d\x35\xd9\x5f\x8d\xbd\xa0\xb1\xed\xab\xe0\xe6\x9e\xd5\x43\x5a\x35\x20\x30\x18\xa6\xb2\xa2\x4b\x80\xf1\xeb\x52\x2f\xad\x13\x67\x6a\xfb\x02\xc4\xd2\xbc\x2d\x20\xba\x35\x07\xea\x4f\x7b\xdd\x0f\x90\x1d\x12\x43\x84\x44\x51\xe2\x7d\x36\x90\x0c\x38\x35\x4f\x55\xd6\x00\xcc\x39\x85\xd7\x70\xdc\x9c\x9a\x51\x2d\x9e\x6d\x5e\x56\x30\x93\x8a\x03\x7f\x21\x48\xe5\x3c\x53\x4e\x54\x9f\x79\xd1\x10\x85\xfc\x1b\xf0\xc3\xec\xf9\x5b\x66\xd8\xa5\x93\x56\xcb\xac\xa9\x18\x2a\x8f\x23\x9b\x79\x09\x6d\x5a\xb8\x7c\xbb\x14\x30\xd8\xb1\xf4\xa5\xa6\x76\x4e\xff\xb5\x0f\xe0\xa5\x42\xef\x9e\xff\x61\x2b\xe5\x94\xd5\x7a\xe0\x8e\x08\xd6\xda\x2c\x0d\x23\x17\xeb\x79\x5a\x34\xa9\x1e\xe6\x69\x95\xea\x61\xb9\x87\xbc\xa8\x97\x37\x09\x53\x94\xee\xeb\x1d\x80\x09\x95\x1b\xfd\xe7\xc1\xf5\xfc\xe7\xa4\x58\x5f\xe1\xca\x7c\x80\xcc\xef\xe9\xea\x8c\xf2\xb5\x0d\x67\x8a\x5f\x1a\x49\x6b\x89\x9a\x07\xa3\xfe\x65\x5f\x65\x35\x33\xb1\x90\x79\xfa\xc9\xac\x21\xe9\x36\x2c\xf7\x02\x26\x71\x52\x42\x99\x7a\x41\xa9\x58\x8c\x62\x89\xb1\xa3\xfe\x79\x34\xc5\xde\x68\x6c\x6f\xfb\x81\xf9\xf6\x6e\x83\x6a\xd7\x60\xc2\x5e\x3c\x5f\x52\x1e\x11\x60\x39\x6e\x1b\x42\x05\x52\x39\x8d\x51\x69\xd3\x94\x55\x61\x0e\xb5\xde\x18\x53\x33\xaf\x06\xd8\xdc\x98\xd0\xec\x20\xfd\x3a\xe1\x9f\xb8\x18\x63\xf1\x68\x4f\x91\xb5\x7b\x0b\x74\xeb\xd3\x55\x53\xbb\x24\xc1\xa8\x20\xb8\x29\xa8\x72\x9e\xa7\x58\x12\xf3\xb9\x2c\xd7\xc0\x17\xeb\x19\x32\x3c\x84\xeb\xa0\x38\x28\xab\x60\x82\x90\x31\x1d\x6d\xa7\x3b\x7c\x6e\x2f\x2d\xee\xf7\xe9\xbd\xc3\x8c\xa7\x5e\x36\xde\x57\xc0\xea\x6d\xaa\xbd\x59\x73\xdf\x26\x56\x5f\x56\x58\x3e\xeb\xc2\x0a\x8c\x65\xd5\xa6\xba\x87\x3b\xe1\x32\x06\x3f\x74\x3a\x71\xf6\x95\x35\x8a\xc0\x07\xb3\xf7\x03\x85\xc1\xb3\x02\x52\x2c\x35\xd7\x8d\x50\x0b\x68\xd0\x95\x93\xd6\xe0\x25\x71\xc7\xaa\x77\xa6\xb8\xb2\xfe\x75\xfc\x26\x3a\x5a\x73\xbb\x4e\xb7\xe9\x3d\xf0\x60\x43\x0f\xe5\xf1\x3a\xcf\x72\xdf\xb8\x4c\xac\xac\x14\x2c\x37\xc7\x59\x3e\xa2\x90\x07\xc1\xe3\xb0\x12\x31\x7d\x3b\xf3\xeb\xab\xac\x5d\xb9\x32\x65\x92\x40\xd6\x6b\x22\x60\xa0\x12\x34\x88\x36\xe1\x50\xac\x26\xc1\x32\x63\xe2\x09\x01\x74\x4b\x42\xeb\xa7\x52\x9c\x4d\xba\x6a\xca\x8a\xcb\x8f\x39\x65\x28\x68\xd9\xc0\x03\x33\x8e\x5e\x40\x85\x9c\xe2\x6e\xe1\xa8\x68\x04\x19\x91\xfe\x95\x19\xf6\xa0\xf5\x27\xd6\xc9\x5f\xc0\xee\x04\x6c\x81\x93\x45\xab\x5b\x1d\x96\x06\xd2\x27\x69\xd5\xd6\x0e\xad\x90\x99\x53\xd8\x14\xb7\x56\x17\xf1\x2b\x7d\x6a\x3f\xe7\x00\x02\xce\x3e\x04\x78\xf8\xd8\xad\xc9\x2f\x30\x5e\x7e\xba\xf9\x6d\xe5\x62\x6e\x1c\xba\xa6\x52\xc8\x10\xf0\xc9\x79\xfb\x8d\x7e\x68\x9a\xdd\xfb\x9f\x7f\x7e\x7a\x7a\x8a\xb7\x38\xce\xb8\xac\xee\x7f\xbe\xbe\x19\xff\xac\x3c\x20\x57\x3f\x67\xbd\x30\x40\xc2\x7e\x12\xbb\x80\x1c\xe9\xc2\xce\x29\xf5\x3c\xa2\x26\x55\xff\xd3\x01\xa7\xde\x8d\x3c\xb3\x07\x9c\x01\xb0\x04\xcc\x15\x92\xc1\x21\x1c\xf0\xca\x9f\x69\x34\x3f\x44\xbb\xb0\x15\x15\x99\x28\xeb\x8c\x9c\xac\xee\x30\xe0\x98\xd5\xfa\xbf\xd9\x3f\xfa\x58\xef\x68\x2f\x6e\x40\x56\x2b\xfe\xd6\x0d\x37\x37\x89\xf6\x33\xfc\x5d\x0a\xd6\xa6\x44\x69\xe3\xef\x0c\xf2\x5c\xcf\x70\xd4\x33\x00\x80\x35\xeb\x58\x76\x4f\x9d\xd6\x67\xef\xf9\xc3\x27\xff\xc1\xe0\x90\xfe\x3f\xf7\x27\xfe\x79\x38\x3c\xff\x78\x77\x3e\xb9\x3a\x7f\xf3\xef\x05\x02\xf5\x02\xfe\xd3\xab\xd7\xef\xde\xb6\xf0\x9f\x5e\x5f\xbe\xfe\x07\xfe\xd3\xdf\xe5\xcf\x10\xe0\x97\x1e\x31\x05\x6b\x15\xc5\xa0\x71\xb9\xf3\xf3\x49\x79\x25\x00\x9e\xdf\xc4\xaf\x5a\x56\x51\xfb\xcb\x2a\x4c\xdc\xb6\x7f\x7d\x72\xe6\x12\x60\xe0\x88\x6d\xb2\x0a\xcb\xf0\x5d\x0d\x13\x59\x49\x08\x6f\xa0\x00\x7c\x7a\xc5\x94\xf2\xf7\xd6\xfa\x5f\x3f\x42\xa1\x6a\xbb\x78\xb0\x33\x8b\x90\x88\xa2\x56\xee\x0d\xae\xe4\x25\x4f\x9f\x0e\xa6\x3a\x5f\xe5\x99\x64\xc1\x21\x8b\xbb\x2c\xea\x87\x6c\x17\x77\x9f\x6b\x3d\xd0\x5a\x59\x4f\xcf\xc5\x78\xd1\x34\xc5\xcc\xb8\x2c\xd5\xf6\xa5\xf5\x74\x09\xa5\xf5\x79\x56\x9f\xf0\x1d\xce\x8f\x56\xfc\xe8\x7b\x58\xe4\xa2\xe4\x02\x4b\x24\x0b\xbb\x4f\x2b\xe7\x5c\xf2\x2b\x23\x70\x13\x98\x34\x93\x7f\x2c\x58\xef\xb2\xaa\x17\x24\x3e\xe2\x04\x5f\xcf\x70\xbb\x73\x55\x21\x82\x9f\xaf\x5b\x92\x06\x1d\x16\x22\x01\x7b\x39\x65\xe5\x32\x4c\xa3\x92\xbd\xb1\xd9\xe7\xb9\xa9\x1b\x57\x62\x41\x95\x24\xb1\x52\xb7\xe0\x1e\x74\x16\x38\x34\x4c\x6a\xa5\x5e\xda\x5a\x27\x33\xa9\x86\xba\x89\xb4\x5a\x43\x84\xc4\xde\x8c\x3d\x6b\xa0\x3c\x24\x59\x59\xd5\xd2\x82\xa3\x0e\x49\xe0\x96\xa8\xc1\x5e\xa1\x79\x00\x18\x84\xe7\xa1\x40\x02\xaf\x72\xa3\x10\xc5\x14\x7a\x75\xfc\x63\xdc\xae\x08\xc3\xcb\x83\x1f\xc2\x58\x90\x16\x23\x78\xad\x0a\x88\x75\x1b\x87\xc3\xeb\xf2\xa1\x4b\x93\x97\x4f\x68\x04\x78\x74\x5a\x08\xa2\xad\x4d\x95\x7a\xdc\x7a\x6b\x91\x88\x5d\xb5\xbe\xb5\x03\xed\x28\xac\x81\xcd\x5c\x58\xe6\xb7\x87\x74\x5f\xdb\x85\x25\x8a\x4a\x4c\xec\x42\x05\x2d\xe3\x2b\x94\xfb\x8a\x5b\xea\xeb\x58\xa9\x61\xf8\x3a\xa4\x85\x46\xa2\xb0\xfa\x3d\x80\xcb\xb7\xb7\x06\x8b\x1f\x89\xad\x64\x43\x09\x76\x60\xc8\x84\x5e\x58\x58\xbf\xec\xaf\xe8\x53\x38\xa0\x59\x7a\x48\x48\x4e\xb7\x17\x44\xb9\x10\x90\x80\x74\x0c\x47\x2a\x94\x20\x1e\x91\x74\x22\x47\xd7\x1b\xb1\xf0\xc3\x71\x56\x95\x79\x2c\x57\x48\xba\x3a\xe6\x79\x31\x2a\x67\x65\xd2\x35\xf2\xe1\xfa\x02\x9d\xe6\x18\x17\x43\x98\xcb\x56\x50\x06\x45\xe5\x16\x4b\x20\xb8\x43\x9f\x0d\x8f\x75\xac\x3b\x2f\x83\xfa\x8c\xda\x40\x36\xca\x1e\x3d\x12\x4d\x8f\xfd\xd0\x7e\x4a\x29\x27\x13\xd4\x02\xe0\x5a\x22\x86\xae\xa3\x04\xe7\x75\x4c\x6b\x65\xbd\x66\xbb\x6c\x3d\xa3\x80\x4c\x7d\x6e\xf5\x4c\xf5\x3d\x54\x38\xc0\xfe\x10\xfa\x15\x39\x1b\xb1\x0b\xec\x58\x41\x1c\x1a\x5a\xf3\xe1\xf0\x9c\x75\x94\x7b\x48\x84\x30\x2f\xf4\xc4\xbd\xef\xd4\x06\x8e\x16\x22\x2f\x50\x20\x62\xae\xc9\x5c\x1e\xa5\x58\x5f\x97\x95\x69\x1f\x81\x40\x26\xf5\x7b\xfd\x94\x7d\xcf\xe2\x15\x69\x10\xc4\xb6\xa9\xc1\xa7\x08\x65\xf9\xbf\x6d\xca\xea\xbf\xb9\xef\xf5\x4a\xba\x5f\xcd\xf7\xfa\xa3\x55\x0d\xb0\xee\xc8\xfd\x5f\x76\x45\x3f\x72\x95\xc5\x65\xa5\x08\xcb\xe2\x59\xe1\x16\x8b\xb8\x16\xeb\x02\x4b\xe2\x94\x83\xea\x13\x37\x47\x4e\xc2\xef\xfb\xa9\x96\xcf\xa7\x1b\xd7\xc7\x51\xa9\x2d\x40\x61\x38\xe5\x7f\xff\xf7\xff\xb1\x91\x24\x66\x4b\x83\x5d\xa6\x54\xee\x23\x42\xa1\x6e\x57\xf4\xf1\x5d\xf9\xdf\xff\xfd\x7f\x34\x0f\xa6\x70\x64\xfe\xfc\x76\x0a\x87\xf8\x32\x51\x96\x97\xf0\x1c\xc2\x42\x61\x14\xd8\xcf\xa0\x56\x0c\x4d\xf4\xd2\xa9\xe6\xd6\x45\x5e\x08\xac\x6e\x43\x2d\x03\x75\x9d\xb8\x13\x31\x30\xdf\x87\x87\x54\xac\xb9\xd5\xfc\x75\x93\x71\x68\xda\x29\x96\x8d\xb0\x11\xec\xca\xd5\x91\xf2\xf1\x2b\xb7\x6c\xf6\x03\x35\x96\xe0\xfb\x01\xfb\x6f\x06\x95\xd7\xfc\xca\x58\x0f\x94\x1b\xb3\x7d\x3d\x56\xb8\x12\x57\x76\x65\xfe\x75\x6f\x20\x5c\xc6\xbd\x77\x69\xfd\xdd\xf5\x1c\x40\x64\x93\xda\x78\xa1\xfb\xbd\xfa\x6e\xd6\x0a\xd0\xb1\xa8\x1c\xc5\x3a\x74\xcd\x03\xb0\x50\x05\xa4\xa2\xcb\x43\xa0\x37\xb0\xca\xc8\x6a\x42\x53\xac\xca\x7d\x95\xde\x83\x5e\x56\x2e\x60\x8d\x29\x08\x1a\x0c\x85\x8a\x7c\x48\xee\xf8\x79\xf4\x62\xaf\xfe\xc8\x81\x34\xbd\x46\xc0\xef\xb1\x52\x43\x93\x42\xa9\x8f\x01\x9c\x97\x70\xc1\xd7\xec\xf6\x9e\x72\x1a\x0b\xae\xdd\x33\x8a\x6b\x21\x67\x29\x00\x9f\x53\x5c\x47\x2d\x8d\x5e\x96\xfb\xa2\x55\xfd\xdc\x77\x1d\x64\x75\xd7\xd6\x39\x3a\x09\xf5\xd2\x24\xf4\xe9\x49\xf8\x83\x93\xb3\x58\x2f\x5a\x60\x42\x59\xdd\xae\x8c\x22\xc0\x0d\x68\x65\xdc\x55\xa6\x61\xe4\x44\x0e\x3e\xfa\x00\x1e\x57\x24\xf4\xac\x8e\xca\x8a\x70\x9b\x35\x07\xec\xda\xb4\xaa\x1e\xc0\xbf\x6d\x87\xd2\xf5\xe9\xee\x59\x09\xf7\x23\x22\x6c\xba\xef\x55\x88\xc8\xd5\xd4\x62\x6c\x65\xa5\x1c\xaf\x29\xd8\xa1\xa2\x9b\xd7\x8d\xfe\xda\x5d\x7b\xce\x30\x77\x06\xb3\x1c\xa8\xe0\xbb\x8c\x95\xe2\xaa\xe3\x0b\xfd\xbf\xff\xfb\xff\x68\x41\xe0\xa6\xb1\x1e\xac\x53\x40\x7b\x70\x0f\x47\xf0\xb3\x3e\x2b\x70\x18\xe8\xaf\x39\xd5\xd5\xd1\x9a\x32\x97\x3d\x35\xc2\xe3\x2c\xca\x8a\x22\x9b\xfb\x9d\xe3\x78\xed\x4c\xa6\x58\xfb\xfc\x91\x88\xba\x89\x8f\x64\x35\x22\xae\x82\x02\x26\x1e\x05\xf8\x4b\x05\xdc\x7a\xeb\x88\x00\x59\x21\x07\x17\x05\x60\x6a\xca\xd5\x42\x42\xdc\x6e\x9b\x16\x05\xe8\x3f\xab\x42\x20\xba\xef\xef\x19\x1f\xd0\xea\x9d\xa8\x9a\x31\x02\x49\xee\x4e\x0b\x6f\xde\x11\x74\xb9\x50\xc2\x23\x4f\x5c\xd0\x3f\xc7\x54\x6f\xf7\x75\xb6\x22\x0b\xdd\xa1\x34\x21\x4f\x24\x50\x31\xed\xc1\x53\x5b\x41\x01\xf6\x7d\xc4\x7b\xa7\x82\x87\x60\x75\x2d\x61\x3f\xad\x05\x59\x42\xef\x3b\xeb\x43\x01\x95\xd3\x56\xa1\x67\x5b\xb3\x56\xec\x3e\x32\xf7\xf9\xb6\x04\x74\xc2\xcc\x7a\x4b\xb1\x52\xcb\xf8\x59\x31\x20\xe9\x09\x6e\xba\x9f\xed\xd0\xe9\x53\x74\x2a\x56\x79\x59\x9b\xfc\xa0\xd8\x8d\x0b\x5c\x0c\x77\x27\x45\xbd\x49\x95\x60\x55\x96\x55\x99\xae\x57\x69\xdd\x44\xaa\xb3\x3a\x30\xba\x7d\x86\x28\xfc\x59\xad\xaf\xd2\x26\xb5\xd2\x48\x43\xf5\x4f\x47\x1f\xd5\x0e\x02\x70\xef\x1f\x0c\xf7\x17\x59\x3d\x92\xa7\x4b\x93\x13\x6e\x54\xda\x98\x7b\xb4\xf7\x7f\x70\xc3\xc5\xb3\x02\xff\xc8\x81\x0d\x9d\x2e\xcf\x4e\x2f\xce\xce\x4f\x2f\xcf\x9c\x5f\xf3\xdc\xf2\xc6\x4a\xad\xb8\x62\xdb\xea\xe1\x85\x59\x3d\x14\x65\x5e\xde\x83\xd4\x5c\x9b\xb4\xde\x57\xa6\x76\xf8\xa1\xf6\xbe\xdb\xf2\x0f\xed\x01\x8d\xf8\xe2\x4e\x97\xb5\x01\x70\xdb\x0d\xa5\x2e\xbd\x95\x11\xb9\x50\xf9\xd2\x10\x67\xe8\x23\xd2\x63\xe2\x01\xc9\xd3\xa7\x9a\x5b\x52\xc0\x84\xf4\x9d\x79\x64\xe7\x0c\xaa\x26\x5b\xe5\x46\x5f\x38\x72\x89\x6f\xa3\x9b\xa9\x98\xd8\xc2\xde\x23\x07\x9d\xae\xcb\x1d\x85\xb8\xaf\xcc\xca\x40\xd2\xe3\xf2\x55\xa4\x2f\x7e\xfd\xf5\x1d\xb4\x92\x4a\xc9\xc9\x82\xcb\xc4\xa5\xfc\xed\x92\xac\xb9\x1d\xc2\x35\x70\x8c\x45\x9c\x1a\x17\x63\x93\xa2\x5b\x1f\xe1\xdf\xd6\x26\xcd\x59\x48\x7e\x96\xac\xc5\xea\x19\x23\xf1\x59\xc1\x47\x5b\xc6\xf7\x2e\xd8\xfb\x44\x05\x24\x93\xad\xd3\x17\x2b\x65\xe2\x9e\x43\xe9\xc1\x5f\xd3\xaa\xc9\xea\x26\x5b\xe1\x48\x1a\x03\x94\x02\xa8\x1a\xd6\x24\xcb\x5e\xd9\x29\xa7\xb1\x83\x86\x09\x77\x3f\xe1\xd0\xd6\x7d\x72\x1a\x2b\xb5\x89\x3b\x26\x84\x1f\x47\xab\x7c\x11\x27\xd7\xf6\x9f\xfa\x6e\x9f\x67\x14\x21\x57\x10\x0a\x62\x68\x84\x85\x11\x4b\xac\x8e\x2d\xf1\xc1\x71\x0a\x3d\xb7\xc0\x41\x23\xa2\xbf\xa8\xdb\x26\xb5\xf7\xfc\xd4\xbd\x77\x22\x7b\x61\xb6\x4f\xeb\x33\x8f\xb4\x7d\x9a\x99\xfa\x0c\x17\xa5\x0d\xaa\x8a\x2d\x5c\x9d\x45\x7e\x88\xf5\x1c\x22\x31\xf4\xec\xd2\x45\x7e\xe4\xde\x09\x27\x6b\x79\x40\xb7\x15\x3e\x0e\x58\xca\xa5\xf5\x81\xb0\xf8\x9c\xcc\xe0\xba\xff\x0a\x6b\xed\xa6\x37\xbd\x19\x16\x90\x94\x29\x9a\x57\x1e\x18\xd0\x79\x77\x5e\xc7\xca\x66\x24\xf8\x57\x6d\xb8\xe0\x32\x62\x98\xf4\x15\xfd\xb3\xac\x54\xb6\xdd\x95\x15\x2b\x6b\xea\xbb\x01\x77\x60\xdb\x35\x5f\xc2\xe9\x7a\x67\x84\xe2\x23\x68\x54\x6c\x41\x33\xb8\xa0\x04\x7d\x18\x3a\x49\x56\xb4\x1c\xe2\xe1\x60\x77\xa4\x48\xab\x8a\xa6\xae\x75\xa8\xec\xdd\xa6\xfc\x46\xe6\x10\xce\xa8\x4d\x41\x17\xf9\x36\x56\x2a\x8b\x9f\xbb\x2d\x68\x13\x68\x97\x45\x0f\x88\xbf\xb7\x5c\x24\x11\x99\xa5\xaf\x10\x0e\xf6\xd1\xe8\x5f\xdf\xfd\xfc\xeb\xcf\xc9\x90\x27\x90\xec\xad\xc6\x4d\x0b\x7d\x93\x56\x79\x96\x42\x2d\x04\xb1\x0c\xa2\xf1\xb1\x2f\x56\x19\xf4\xcc\x5d\x5c\xa8\xeb\xb4\x5a\x3d\x80\x46\xe4\xec\x30\xc6\x91\x99\x01\x19\x2d\x4a\x56\x07\x08\x9d\x68\x1f\xb9\xf6\xc4\xa7\xf5\x7e\xb5\x32\x66\x6d\xd6\x91\x4a\x6b\x84\x45\x4e\x79\x0a\xa6\xae\x11\x66\x39\x3f\x40\x92\xf6\x31\xcd\xed\x70\x5c\xca\xcf\x77\x47\xd8\x57\x03\x8a\x65\xac\xd4\xbf\x50\x46\xf4\x79\x24\xfa\x17\x5c\x14\x66\x3c\xea\xaa\x23\x3c\xda\x0f\x64\xd8\x57\x98\x51\x06\xb9\xb0\x6f\xcc\x8a\x7b\x61\xd5\x5e\x82\x55\x3b\x5f\x95\x3b\xaa\x18\x48\x9d\x26\xc3\xb3\x09\x60\xc9\x7a\x7e\x44\x59\xf5\x79\x39\x3d\x97\xb8\xb7\xd2\x8f\x82\x7b\x1e\xc3\xf6\x74\xc5\xd4\x98\xa6\x0f\xe0\x3e\x23\x25\x62\x76\x2e\x52\xda\x94\xbc\x74\xa6\x77\xe1\xb2\x23\x96\xb4\x6a\xca\xf7\x02\x38\x66\x10\x7b\x08\x50\xbc\xb0\x1e\xd2\x63\x96\x60\x84\x16\x78\x99\x1b\x2c\x67\x80\x00\x2a\x21\x6b\xba\x07\x7e\x8c\xb5\x7c\x9c\xc0\x17\x5d\xee\x1b\x30\x18\xe0\x0d\x51\xc7\xa5\x88\x95\xba\x7c\xee\x8a\x46\x63\x0a\x6e\xbc\xc7\x32\x5b\xb3\xfb\xb5\x2e\xf7\xcb\x86\x8d\x66\xff\x6d\xd5\xbe\xe0\x3b\x37\x42\xd4\xb7\x8f\xa2\xcd\x1c\x78\xd4\x61\x72\xd0\xf7\x5d\x52\x78\xa9\x5b\x19\x02\x3e\x5a\x5f\xc0\xca\xb7\x26\x03\xc7\x1d\x86\xb5\xa1\x82\xb4\x5f\x88\xc0\xd2\xee\x33\x00\xdf\x9d\xa6\x67\xb1\x52\x6f\x62\x7d\x8d\xf8\x7c\x05\x22\xbd\xa7\x4d\xfd\x41\x37\xd6\xba\x03\xcb\x2e\x6c\xad\x49\xf3\xbc\x7c\xb2\x36\xe8\x22\xb8\xe0\x39\x18\x5d\x2b\x6a\xdf\x7d\x49\x8a\x00\x0f\xbe\xfd\x5a\x86\xa7\x06\xfc\x54\x80\x4f\x57\x01\x8a\x2a\xa5\xe1\x43\xd5\x7e\x6c\xa4\x41\xed\xe3\xba\x54\x75\xd9\x1a\xf4\x53\x0a\x2e\x2f\x5b\x61\xd6\xaa\xab\x1d\x70\x69\x5d\x9b\x0a\x9b\xe6\x5d\x10\xca\x5d\xdc\xaa\x29\xed\x88\x97\x19\xe2\x8d\x04\x3e\xf3\x8f\x0c\x46\xae\x8d\xea\x5c\x96\x02\x73\xed\x47\x1e\xe6\xad\x64\xf5\x92\x6d\xfe\x83\x8e\x43\x9d\x59\x29\x54\x34\xa3\xd6\xf6\xfb\xac\x03\x37\xda\x79\x7f\x22\x3d\x3b\x7d\x73\xa6\x0b\x64\x27\xc6\xf3\x59\x77\xfc\x44\x27\xbf\x6f\x63\x7d\x55\x3e\x15\x75\x53\x99\x74\x2b\xb1\x07\x81\x66\x62\x1a\x36\xab\xb9\x4d\xb3\x1a\xb7\x6b\xce\xea\x04\x10\x03\x82\x4e\x61\x29\x78\xde\x4b\x0d\xda\x5c\xb4\x8b\x7b\xa4\x05\x81\x8d\x76\xdf\xf8\xc2\x86\x75\x5a\x3d\x7f\x48\xb3\x23\xb7\xc5\xc4\x0a\xa6\x58\x02\x8c\x96\xa2\x5a\x7a\x09\x07\xd5\x83\x88\x42\xbc\xd2\xc1\x42\x50\xbf\x69\x15\x8c\xa1\xc0\xe4\x25\x28\x2b\xfb\xe5\x23\x92\xa2\x9c\x17\xd7\x94\xd1\x31\xbf\xdd\x2a\x47\xe4\x0c\x10\xd8\xaa\x6e\x85\xda\x0b\x4f\x8b\x44\xd6\xe4\xd1\x0d\x92\xfa\xfa\x1d\x2c\x8c\x29\xd6\x65\x55\x83\x9f\x65\xff\xdd\x3c\xb8\xb6\xc3\xae\x86\x83\x62\xbf\xac\xd9\x13\x4f\x12\x05\xea\x5c\x09\x20\xa0\x9e\x07\x39\x03\x3a\xde\x54\x9d\x44\xd4\x44\x14\xbd\x8b\x34\x03\xd9\x1c\xb3\xf2\x65\xcc\x03\x8a\xf1\x0b\x2c\x4a\xb3\x7a\x1b\x83\x25\xbb\xd2\x8a\x8e\xd5\x54\x34\x0d\x8c\x0c\xb1\x17\x53\x6e\x08\x14\x1f\xf9\xa0\xd5\xf2\x10\xde\xf4\xce\xb1\x02\xf0\x3a\xe0\x63\x33\xd4\x43\x0e\xf2\xaa\x53\x1f\xfb\x04\x70\x6a\x06\x73\xcc\x0a\x67\x9c\xbc\xb6\xc7\xf1\xe2\xec\x74\x70\x76\x9a\x9d\xe1\xa1\x5b\xc6\x7a\x2a\xd3\x78\x60\x9d\x5c\x97\x95\xc3\xa1\xf5\x96\xba\x73\xbd\x80\x7c\xa4\x68\xcc\x3d\xba\xe7\x1c\x28\x70\x81\xff\xa3\x3e\x87\x35\x37\x2a\x6c\xd4\x82\x9f\xc3\xd7\x77\x55\xf6\x98\xae\x0e\xce\xf5\x25\x70\x3c\xee\x92\x35\x55\x4d\xc0\x87\x14\xb9\xf8\xa0\x1f\x18\xc1\x2a\x2c\x6c\xe7\x54\x78\x6b\xdd\xfa\x54\xba\xea\xaa\x74\x19\x24\xed\x0b\xa9\xf9\xbc\x1c\x3a\x88\xed\x6a\x7a\x85\x1e\x63\xf9\xa4\x7f\xe0\xb6\xf3\x26\x8a\x0b\x0c\xa2\x51\x72\x83\x70\xdc\x70\x97\x55\xe9\xda\x40\xaa\x50\x44\x7f\x8e\xac\x73\x57\x93\xbc\x6e\x47\xaf\x5f\x5a\x1d\xbe\xd4\xc0\xe4\x80\x3a\x72\x32\x1e\x33\x53\xa3\x03\x01\xf7\x1a\x73\x4f\x1d\x39\xdb\x3e\x96\x45\xb7\xb6\x2c\x4b\xe5\x86\x8e\x94\xdf\x80\x2a\x63\x95\x99\xe6\xe0\x72\x95\x07\xfd\x58\xe6\xfb\xa2\xb1\x57\x19\x8d\x0f\xac\x51\x44\x8f\x28\x2b\xc2\xbf\xdc\xee\xf6\x79\x5d\x56\x07\x4a\xf3\xc0\x93\x56\x0f\x66\x6b\x00\xe6\x04\x30\x3e\x10\x56\x05\xca\x70\x83\x29\xfb\x42\x63\x64\x63\x97\xd3\x57\x62\xfa\x28\x11\xbc\x06\xc2\xc6\x7f\x2d\x6f\x1c\x3d\x94\x66\x18\xa8\x87\x17\x16\x27\x2c\x76\x86\xba\xd9\x56\xec\xc2\x15\x24\xa8\xb6\x8d\x97\xc6\x32\xc7\x21\x28\xa8\x18\xce\xef\x59\xa3\xda\x01\x98\xc0\x75\x5a\x19\x04\x61\x0a\x2a\x20\x32\x46\x60\xa9\xf7\x14\xa0\x69\x9f\x03\x57\x8f\xde\x51\x7d\xef\xc1\x69\x65\xc2\xaf\xb0\x56\x9c\xea\x43\x20\x62\xf1\x5c\x7c\xc4\x05\xbe\x80\x45\xe9\x79\x35\x17\x31\x7e\x96\x4f\x9a\xc9\x80\xba\xa9\x7d\x7a\xd4\x87\x5b\x4e\x45\x8a\xf1\xa0\x77\xb5\xd9\xaf\xcb\xe2\xb0\x85\x3b\xcc\xbd\xf0\xec\x83\xf0\x33\xb4\xd6\x59\x16\x53\x91\x2d\x1e\x12\x6c\x50\xef\x7c\x08\x3e\x45\xcd\xeb\x70\x5b\x00\x5b\x52\xed\x4a\xc9\xc3\x53\xda\xfe\xfa\xe3\x73\xdf\x36\x82\x64\x54\x60\xc6\x65\xa6\xfe\xa0\x14\x7c\xf3\x76\x36\x02\x7e\x81\xc3\xce\x54\x79\x56\x7c\xe7\xef\x75\xd7\x39\x54\x9b\x02\x53\x73\x57\xa5\xab\x06\x93\xd3\x1f\xc0\x18\xb1\x7e\x34\x00\x5c\x52\xef\xaf\x4b\x5e\x1c\xdf\x40\x92\x2a\xa2\xff\x59\x09\xae\x25\x41\x45\x16\x18\x90\xe4\xd7\x0d\xc5\xeb\x8e\xa6\x07\x5e\xd6\x7d\xe8\x48\x79\xb8\x4f\x83\x58\xb7\xd4\xe8\x03\x6d\x0b\xdd\x85\xea\xf5\xd0\x50\x23\x3f\xe7\x0a\x0a\x77\x0d\xf2\xd3\x3d\x91\xaf\x6e\xca\xb0\x29\xe9\x90\xf6\xb8\xa5\xaf\xbd\x8d\x57\xa7\x4d\x56\x13\x64\x87\x30\xdb\x24\x6c\x0f\xde\xe6\x47\x0f\x81\x0a\x8a\xf8\xad\x63\xb5\xdf\x46\x18\x24\x89\xd8\x22\x85\xb5\x09\x90\xe3\x9e\x51\x20\xb1\xfa\x24\x0b\x1b\x32\x47\x67\x22\x5e\xdd\x94\xc7\x46\xbe\xa4\x2e\x37\x6c\x34\x52\x7d\xe2\x0a\x30\x5c\x88\x2a\x84\xe9\x3b\xae\x7a\x69\x1e\x04\x61\x9a\xac\xb1\x03\x57\x75\xb4\xe9\x9c\x77\xa7\xae\x04\xca\x55\x65\xb6\x25\x35\x81\x93\x0a\x92\xc5\x85\xfc\x78\xb5\x3c\xb4\x57\xf8\x74\x70\xf6\x43\x67\x46\x5c\x11\x6f\x30\x0c\x74\x3c\x7e\x17\x2b\xf5\xad\x9b\x09\x73\xbe\x30\x4a\xef\x73\xf1\xbf\x20\xf8\xac\x5e\x0c\x3e\xbf\x87\xe4\xea\xe6\x19\x61\x0e\x7c\xb6\x8b\x33\x19\x52\xf2\x96\x1f\xd8\x35\x98\xd9\x56\x50\xff\x14\xf0\xba\xf8\xa8\x0e\x5c\xc0\x0c\x49\xdf\xa4\xc8\x9c\x46\xbc\x20\xee\x4a\xf0\x2d\x16\x50\xf3\xef\x73\x08\xce\x76\x15\x07\xac\xff\xcc\x7c\x80\x0c\x60\x88\x25\xf9\x43\x2f\xe7\x97\xf9\x51\x64\x80\x53\xc4\x3f\x0e\xce\x04\x1c\xee\x67\x53\x77\x80\x0f\x26\x9f\xab\x7e\xd7\x03\xf4\x29\xdb\x83\x19\x8c\xc4\x45\x2f\x79\x74\x67\x2a\xab\xbb\x93\x47\xc5\xb9\x12\x20\xab\x6d\x50\xb2\xe3\x9a\x83\x17\x4d\xee\x97\xfa\xd1\xfd\x0a\xa6\x1a\x2b\xf5\x9c\x92\x0c\x02\x02\x6f\xd0\xae\x20\x70\xb9\xa0\x52\xb9\x32\x10\x23\x47\x51\x96\xf0\x9a\x47\x55\x7d\x5f\x2e\x39\x3c\x41\x8a\xfb\xae\x9e\x4d\x61\xf2\xe0\xde\x62\x45\x42\x70\xcf\x7e\xf3\xa5\xc3\x61\x9c\x0f\x39\x63\xa8\x82\x17\x4b\x17\x6e\xdb\xed\x9e\xb5\xd9\xa5\x55\x0a\xa8\x8b\x30\x89\x26\xfd\xee\x42\xfc\x42\x43\x1d\x71\x63\x54\xe8\xfe\x6d\xd0\x18\xe8\xbf\x78\xeb\xf3\x0c\x07\x98\xd6\xe7\xa2\x09\xcb\xfe\x04\x0b\xac\x8b\xd2\xb7\x2b\x7b\xfa\x1c\x51\x18\x4d\x57\xf4\xf7\x0c\x2f\x06\x6e\x5b\xee\xb7\x24\x15\x9b\xf7\x64\xc7\x46\xdc\xd1\x13\x79\x3b\xdd\xa7\x02\xb1\xa3\xd8\x69\xf3\xde\x34\xba\x0a\x87\x02\x98\xf3\xf6\xb2\xaa\x56\x0f\x69\xd1\xd0\x32\x47\x7a\x93\x35\xd0\x7f\x8b\x28\x70\x02\xe4\x8b\x22\x58\x18\xd0\xce\x8a\x4d\x95\x15\x48\x77\x17\x29\xca\x2d\xdb\xc7\xe6\xe8\x5e\x39\x2f\x73\x6d\x36\x66\x05\x7d\x67\xab\xd5\xbe\x02\x2f\x94\xeb\xab\x60\xa9\x56\x88\x18\xe8\x1e\xa0\x4c\x55\x95\x95\x70\x6f\x80\x06\xb1\xc1\xb8\x24\x30\x28\x66\xf5\xaa\x7c\x34\x15\x16\x70\xa1\x86\xf7\x86\x5b\x1d\x5a\x6e\x8a\x3d\x3a\x0a\xa0\xda\x23\xba\xd9\xa3\xf2\xa2\x98\x37\x1d\x1f\x61\xfb\x71\xfc\x47\x46\x99\xb1\x0e\xe2\x98\xbf\x97\x15\xba\x28\x81\x6c\x83\xd0\xf5\x03\xb9\x02\x18\x6b\xbe\xba\xef\xca\xbd\x22\x1a\x1d\x4c\xeb\x34\x0f\xc6\xba\x5c\xa7\x2f\xd4\x40\x14\xe6\x3e\xcf\xee\xed\x22\x9d\x85\xd5\x2e\x8c\x98\xcc\x04\x85\x54\x82\x17\x09\xce\xc2\xac\x58\x81\xcb\x60\x7f\xba\x2a\x0b\xc2\x42\x83\x0f\xed\xf6\x45\x86\x05\xd5\xe6\x37\xb3\xdd\xe5\x69\x75\x00\x1e\x14\xdc\xbc\xbc\xac\x21\xc3\x44\xad\xaf\xdc\xae\x0a\x5b\xd8\x6a\x8f\xd4\x76\xc0\xfd\x51\x37\x55\x3e\x7f\x71\x46\x01\x4d\x49\x90\xb5\x05\xe8\xb9\x74\x8d\xa0\x79\x74\x89\xe1\xb2\x3b\x3a\x1e\xf0\x21\x7f\x60\xa0\x2c\x2b\xa9\x58\x56\x6b\x35\x0b\x6c\xd3\xfa\xc7\x44\x45\x94\x08\x04\xa2\xa2\x9c\xa8\xac\x30\xe6\x7d\xcc\x9f\x68\x35\xd6\xe9\x60\x14\xee\x66\x4e\x97\xe5\xa3\xf1\x5d\xe5\xb2\x00\x4e\x16\x36\x61\x91\xc7\xb1\x38\xcd\xb6\xb4\x57\x16\xd5\xde\x00\xeb\xc1\x6f\xd9\x16\x98\xcd\xd3\xc2\x41\xd6\xca\x81\x02\x2c\x73\x9a\x3d\xe2\x98\x83\x26\x0a\xa1\xc7\xdf\x81\x1e\x5f\x18\xea\x85\x59\x78\x40\x1e\xd4\xd3\x8b\x9e\xab\x84\x2b\x25\xd8\x42\xf2\xc9\x93\x23\xe5\x57\x5c\x67\xe6\x3c\x12\xbb\x7f\x82\x04\xea\x39\xb4\xa4\x23\x59\xbd\x02\xef\xbe\x6e\x5b\x6e\x6b\xac\x47\x00\x9a\x50\x0b\x7c\x63\x5a\x80\xca\x9b\x6c\xfb\x76\x14\xca\x5d\x1c\x00\x14\xc8\x8f\xeb\x50\x7b\x9d\xa6\x67\x60\xe6\x57\x06\x98\x73\x1b\x53\xbf\x87\xf8\x60\x18\x30\x4f\xa5\x45\x80\x2f\x7a\xcc\xca\xdc\x21\xb3\xaf\xf6\x10\xf5\xf4\x01\xc9\xc6\xfd\x54\x21\x1c\x94\x16\x70\x50\x30\x72\x56\xa3\xce\x52\x77\x0f\xfc\x60\xcd\x14\x47\x81\x88\x75\x7c\xdc\x58\xea\x86\x09\x29\xec\x76\x49\x1c\x08\xfe\x0f\x1b\x2a\xef\x00\x94\xd5\xa5\xe8\x10\xe5\x49\x84\x89\xa4\x2e\xb0\xe7\x0c\x2c\x3c\xeb\xfc\x18\xf3\xdd\x7a\x1a\x66\xcd\xd2\x04\x13\x72\xe3\x6f\x07\xff\x95\x77\x36\xd7\x2f\x0d\xaf\xf5\x4a\x68\x6a\xc0\x34\x40\x7f\xfe\x95\x6a\xdd\xc9\x08\xe9\xcf\x02\x54\xba\x6e\xca\x9d\xa8\xa9\x38\x76\xe7\x2b\xc6\x8b\xce\xb6\x46\x84\x60\x5d\xdc\x1f\x6e\x16\x08\xab\x3a\xe9\xec\xf7\xa9\xb5\xd6\x26\xe6\x75\xae\xf5\x45\xa4\xdf\x46\xfa\x5d\xa4\x7f\x41\x73\xe5\x4f\x0e\xad\xab\x0f\xa9\xab\xf3\x34\xde\xaf\x5f\xe0\xcc\x63\x28\x7b\xe1\x72\x2e\x41\x6c\x2e\x6d\xe5\xfa\x7c\xc3\xbf\x2c\x3a\x0e\xf3\x28\xba\x37\x8f\x22\x4b\x8a\x7c\xc1\x89\xc7\xc6\x26\xdc\x0f\x1f\xe4\x43\xdc\x0f\x3c\xa0\x40\x96\x8e\x85\xa2\x60\x05\x47\xa2\x03\x26\x2b\xee\xa9\xa7\xcc\xd5\x93\x89\x8e\xb5\xfe\x7c\x03\xf4\x8e\x34\x29\x03\xb9\x59\xed\x5b\x79\xd3\x93\xea\x4f\xa0\xa6\x75\x6d\x76\xa6\x58\x8b\x4c\x0b\x92\x01\xfe\x68\x72\x8a\x97\xfa\x4f\xb0\xd4\x23\xd6\xf8\x42\xb1\xbe\x78\xba\x8e\xa4\xc0\x71\xe7\x3d\xae\x63\xeb\x42\x69\x4a\xeb\x65\xa2\x8b\x09\x17\x53\xe4\xb2\x4c\x91\xc8\x80\x05\xc9\x2d\xd8\xc7\x7d\x6d\xd4\xd1\x68\x23\xf1\xc6\xef\xf3\xb5\xce\xd3\x27\x7b\x99\x1e\x98\xed\xce\xd9\x38\xed\x80\x4e\x6f\x79\xc8\xf3\xc6\xd7\x31\x7c\x9f\x6e\x42\x1e\xc1\x2b\x55\x0b\xe2\x27\x13\xc0\x24\xed\x44\x25\x81\xfc\x30\xc6\x74\x56\x08\x8c\xe9\x30\x33\xd1\x8b\xf3\x43\x5d\x2e\x7e\x6c\xab\xb4\xa0\xe3\xc0\xcf\x0e\xdf\x5f\x1b\x64\x0a\xf0\x00\xf1\x6d\x87\x8c\xd6\x0d\xf5\x25\xcb\xac\x7b\xa9\x33\x8b\x30\x9e\xb3\x45\xee\xff\xfe\x1e\x1c\x50\xd7\x93\x92\x2e\x62\xa1\xb4\x8e\xad\x20\x43\x0e\x83\x7d\xb0\x26\xda\x12\xb8\x7f\xf7\x95\x51\xfe\x0a\x06\x1b\x93\x0b\x07\x8f\x9c\x54\x40\x5b\xea\xdc\x1f\xeb\x3f\x98\x74\xec\x74\x07\x08\x1b\xcf\x5e\x60\x11\x27\x3a\xc0\xac\x89\x48\x60\xb2\xc7\x2c\x37\xf7\x64\x8f\x65\xa0\x64\xc0\x3c\x0b\xab\x0e\x83\x62\x20\xbc\x6d\x64\xb9\x80\x4b\x5d\xbb\x2a\x2d\x2b\x14\xde\xdd\x0b\xb1\x6d\x44\x3d\x43\xdc\xd3\x22\xe2\x5a\x8d\x11\x09\x88\x98\x77\x5a\x7d\x5a\xb0\x46\x56\x0e\x58\xa1\x45\xdd\xc6\x5c\xbb\x2e\x26\xa7\x84\x07\x4e\x85\x1a\xbf\x7a\x1e\x88\x45\x1d\x1c\x02\x6e\x1c\x1a\x32\x2a\x2e\xd8\x88\x12\x02\x36\x35\x34\x4a\xd4\x4e\x10\xb8\xcf\x81\xc2\xd5\x27\x6e\x27\x4f\xa8\x3c\xe6\x37\x56\x84\x2f\xb7\xc4\xc2\xf1\x5c\x93\x96\x0f\xab\x04\xd7\x25\x60\x41\xba\x94\xbf\x1a\x0e\x5f\xb1\x5c\x5c\xe1\xef\xae\x0c\x47\xc2\x1d\x50\x3a\xdb\x99\x9c\x4e\x24\xff\x15\x53\xab\xf8\x69\x26\x54\xdc\xca\xf2\xf8\x87\xb4\x12\x28\xd7\x2f\x8c\x9b\x78\x8a\xbd\x3b\x06\xfa\xac\x11\x61\xd2\xee\x03\xca\x3c\x5b\x59\x31\xf3\xa0\xd3\xdc\xdd\xdb\xea\x2f\xe2\x4f\x46\xdd\xd5\xf3\x76\x13\x97\x86\xc0\xcb\x84\x9b\xe5\x93\x9b\xdd\x9e\x76\x25\xeb\x9f\xc5\x27\x4b\xeb\xf2\xdd\x97\xbd\xdd\xe9\xac\x78\x40\x7e\xaa\xcc\x9e\xa7\xca\x4e\xb4\x50\x74\xdc\x5f\xaa\xe2\xc7\xbe\x98\x82\xae\x38\xc7\x30\xb0\x2f\x7c\x75\x8b\x0a\xcb\x5e\x88\xca\xf8\x88\xd0\x06\x73\x78\xf6\xba\x57\xe1\x75\x2f\x62\x2f\xb4\x5e\x9d\x86\xba\x67\x2f\x5a\xbc\xa2\xec\xe5\x7f\x5f\xa5\xbb\x07\xbf\x17\x41\x23\x72\xd3\x69\x88\xae\xfb\x4e\xbc\xaf\x9a\x68\x52\x28\x67\xe8\x97\x85\xf8\x1f\x98\x25\xfe\x4f\xfc\xf3\xe0\xfa\xea\x66\x7c\x33\xf8\xf7\x81\xfe\x80\x3f\xcf\xe3\x7f\x5c\x5c\xfe\xf2\xee\xb2\x85\xff\x71\xf9\xcb\xc5\xeb\x7f\xe0\x7f\xfc\x3d\xfe\x08\x08\xa0\xd5\x99\xbe\x7c\xf5\xea\x5d\x64\xff\xfb\x8b\x1e\xac\x1f\xed\x51\x5d\xeb\xeb\x6c\x55\x95\xfa\xca\x00\x14\x47\xa4\x47\xc5\x2a\x56\x6a\xe0\xdb\xd2\x2b\x87\x11\xa4\x66\x26\xa0\xe2\x84\x7e\x79\xcf\x12\x88\xec\x5c\x64\x0e\x6d\xdb\x69\x74\xaa\xab\xd7\xc4\xc2\x2e\x7a\x6b\x1d\xca\x67\x56\x30\xed\x67\x59\xe9\x25\x92\x68\xd8\x87\xd6\x11\xf0\xfb\xdc\x7b\x45\xd8\xcb\x40\x45\x80\x76\x54\x14\x60\x55\xaa\x54\x91\xfa\xf4\x24\x18\xd8\xc9\x59\x64\xaf\x30\x7f\x07\xb9\x88\x00\xf4\x0f\x34\x6d\x24\x06\x36\xe6\xb1\x43\xa1\x79\xdf\x5e\x0d\x30\x62\x24\x6b\x29\x13\x2a\xf0\xec\x28\xeb\xe7\xaa\x1c\x20\x66\xe5\xb3\xf8\xcc\xcc\x01\xeb\x45\xb8\xd7\xde\xfd\x71\xc0\xfb\x75\xa0\x34\x57\xc8\xd0\xd1\x1e\x49\x56\xc8\xe5\x3b\x36\x12\x2e\x57\xfe\xc3\x83\x71\xa9\xde\x3e\x3a\x30\x59\x3f\xe5\xba\x6f\x90\x14\x24\xa3\xfe\x00\x44\xe7\xaf\xa1\x0c\xcb\x5d\xac\xf0\x9a\xe7\x84\xd3\xb3\x18\xf0\x60\x19\xd3\x03\xed\x72\x86\xb1\x72\xf7\x05\x80\x0f\x34\xae\x5e\x8f\x5a\x45\xb6\x65\xe3\xc8\x88\x5c\x5f\xa6\xf0\x25\x9c\x00\xb3\x30\x39\x10\xb0\xe0\x46\x17\x4e\x99\x9d\x1b\x2d\xdb\xd2\x7e\xa1\x8d\x06\x2b\x7a\xcd\xf1\x68\xbd\xc7\xd8\x9f\xb4\xa8\x1c\xc1\x18\x88\xf2\xc9\x2c\x99\x2f\x66\xa3\xe1\x22\xb9\xd2\xb3\xd1\xe7\x2f\x8b\x79\x7c\xa2\x6f\x6b\x13\x39\xb2\x4f\x32\x94\x21\x28\x59\x02\x67\x12\x99\x52\xad\x97\x2b\xa8\xa1\x09\xcb\x7a\xf6\x79\xce\xde\x59\xb9\x09\x6a\x3b\x43\x3e\xb0\x4f\x83\xd9\xdb\xcb\xf8\xf2\xf2\x17\x10\x87\xab\x4f\x83\xd9\xfc\x12\x7f\xa0\x4c\xa3\x6b\xf3\xaf\xb1\x03\x9e\x81\x66\x8a\x9a\xea\x03\x05\xb6\x80\x87\x4b\xac\x45\x77\xbe\x98\xbb\xea\x1f\x76\xe0\xc2\xa4\x2b\x26\x85\xdd\x8a\xa8\x01\x92\xd3\x1a\xa8\xd0\x22\xb0\x95\x97\x04\x88\x55\x92\xaf\xa0\x61\x09\xe2\x3a\x04\x16\x21\xab\x09\x27\x77\xfa\xe3\x2c\x19\x0c\xbf\x30\x8c\xdc\x22\x99\x5d\xb7\x01\xf4\x09\xa9\x1a\x51\xa7\xf5\x68\x82\xb0\xe5\xd7\xd7\xc9\xd5\x68\xb0\x48\xf4\x2c\xf9\x3a\x1d\x02\x68\x33\xb0\x2e\xd8\x4f\xc2\x76\xea\xc5\x54\xcf\x12\x87\x56\x9e\x44\x7a\x30\x1c\x26\x73\x00\xdc\xbe\x9d\x27\xf8\x8a\xeb\xc1\x22\x99\x8d\x06\xe3\x58\xa9\xe0\xdf\x01\x0b\xc4\xc7\x3b\x3d\xb8\xfa\x3a\x98\x0c\x93\x2b\x7d\x3d\x1a\xce\xa6\xfa\x2a\xf9\x3a\x1a\x26\x73\x60\x6f\x88\x11\xe2\x1b\x90\xfd\x6f\xee\xe0\xdd\xea\xcb\x74\x7c\x95\xcc\x10\xbe\x5d\x60\xa8\xcf\x1d\x9a\xde\x68\xa2\x47\x8b\xb9\x1e\xde\xce\x66\xc9\x64\x61\x3f\x73\x35\x5a\x30\x0c\x35\x63\xec\x0d\x26\x77\x6a\x96\xdc\xcc\x92\x79\x32\x41\x58\xea\x79\xa4\x3f\xdf\x0e\x66\x83\xc9\x22\x41\xb0\xf5\x3e\x18\x3e\xa0\x97\x98\xc0\x3f\xbf\x0d\xee\xf4\x2c\x19\x0f\x16\xc9\x95\x5a\x4c\x01\x96\x7d\x3a\x5b\xd8\x61\x5f\x25\xd7\x93\xd1\xe2\x2e\xd2\xc9\x6c\x36\x9d\x11\x85\xc4\x4c\xdf\x4e\x46\x93\x45\x32\x9b\xdd\xde\xd8\x73\x31\xbd\x49\x66\xc4\x43\x31\x9d\x21\x60\xf6\x68\xa1\x47\x73\x05\x1f\x07\xf0\x6f\xe2\x9c\xb0\xbf\xff\x3a\x9a\xdd\xce\x93\x79\x8c\x70\xe7\x1f\xc7\xa3\xcf\x38\x66\x3d\x98\x25\x40\x6d\xf0\xf1\xce\xb3\x18\x5c\xe9\x73\x46\xb0\x57\x44\x8c\x11\x79\x52\x8c\xe9\x4c\xcf\x17\x83\x85\x5d\xb3\x3b\x7d\x2e\x71\xdb\x3f\xde\x2e\x00\x97\x1b\xa0\xba\x93\x2b\xbd\x98\x22\x5e\x3d\x7d\x55\x79\xbe\x0c\x10\xa3\xd1\x62\x9c\x48\x3e\x0c\x00\xf2\x04\x4a\x8c\x89\x15\x85\x36\x2d\x86\x26\x5a\x0c\x90\x95\xdb\xd9\x60\x78\x17\xa9\xe1\xf4\xfa\x66\x9c\x2c\x92\x09\x0c\x11\x96\x84\x1f\xc3\x7c\x18\xd3\x4f\xc4\x27\x81\x9b\x22\x08\x35\x92\xeb\x64\xb2\x88\xed\x76\x4c\xa6\x2a\xf9\x6a\xf7\x1a\xa5\xf9\x59\x81\x22\xe8\x78\x27\x4f\x9a\xe5\x69\x1a\xd0\x5c\xcc\x95\x87\xd1\xff\xe4\xd0\xf9\x11\x29\xdf\x63\xe6\x4b\xa8\x7c\xc6\xcf\xd7\x37\xb7\x93\xd1\x62\xf4\x35\x89\x74\xf2\x97\xe4\xfa\x66\x3c\x98\xdd\x45\x47\xe1\xd2\x05\xbb\x40\xff\x06\xdc\xcc\xa6\xc3\xdb\x19\xcc\x15\x41\xe8\x3f\x12\x3d\x86\xfa\x3c\x9d\x5e\xc1\xb0\x69\x7d\xe6\x1f\x1c\xb2\xfe\xad\x5d\xe6\x99\x5d\x93\xdb\x24\xd2\x57\x83\xc5\x00\x16\xef\x66\x36\xfd\x34\x5a\xcc\x3f\xd8\xbf\x7f\xbc\x9d\x8f\x60\x9f\x9c\x50\x8e\xa6\x93\x33\xf5\x65\xfa\x2d\xf9\x9a\xcc\xf4\x70\x70\x4b\x6c\x2a\x1f\x07\xf0\x17\x14\x7a\x24\x48\x08\x08\x16\xf4\x60\x36\x9a\x8f\x26\x9f\x8f\x9c\x8b\xe0\xe8\x7b\x18\xfe\xc1\xd5\xd7\xd1\xfc\x47\xa0\xf6\x25\x67\x8a\x02\x6d\xf0\xf9\xf3\x2c\xf9\x6c\xb5\x93\x1f\xc2\xf4\xd3\xdf\x4c\x8b\x78\xe8\xfe\xe4\x2f\xc3\xc4\x6e\x42\x32\xd1\x57\xd3\xf1\x78\x30\x9b\xeb\xd3\xdb\xb9\xfe\xff\x5f\xbc\x8a\x5f\xbd\x3a\xb3\x0f\xbd\x9b\x4e\x12\x25\xf4\xa0\x5d\x05\x2b\x2b\xa0\x0b\xe9\x1f\xb7\xf0\x97\x50\x01\xda\x0f\xdc\x58\x2d\x6a\x7f\x3a\x18\x8f\x85\x8e\x45\x56\x18\x98\xe6\x2c\x49\x48\xd1\x8e\x93\xc1\x3c\xf9\x9b\xcd\x10\x74\x8b\xa4\x4f\xe0\x75\x04\xf6\x08\xa1\x5c\x22\x42\xe4\x05\xe9\xbd\x4a\xae\x07\x93\x2b\x2b\x2e\xb0\x30\x28\x67\x47\xd7\xc6\xee\xd9\xa7\xe9\x2c\xf9\x3c\xb5\xb3\xb7\x4a\xca\x11\xb9\x28\x7b\x0f\xcd\x3b\x17\xd1\x60\x72\x15\x81\x60\x00\xa5\x85\x7d\x80\xbd\x47\xe0\xa3\xf6\xeb\x40\x0b\x33\xbb\x4d\xae\xf4\x60\xae\x6f\x27\xc9\xe4\xd3\x74\x36\x4c\x80\x84\x47\x7d\x1a\x8c\xc6\x30\x2e\xcf\x15\xc3\xaa\xc6\xca\x6f\x32\x9c\x5e\x27\xfa\xeb\x74\x04\xe2\x7c\x95\x2c\x66\xa3\x6b\x38\xb3\x76\x71\xc3\x45\x55\x7f\x4c\x57\x38\x0d\x31\x4b\x06\x73\xab\xd1\x17\x5f\x92\x89\xfa\x83\xd7\x25\xf3\x87\x10\x01\x8d\xb8\x8e\xc7\x77\xb1\xba\x9e\xce\x92\xe9\xd7\x64\x16\xb5\x96\x18\xbf\x34\xbf\x9d\x7d\x1d\x7d\x4d\x60\x2c\xc9\x5f\x6e\x46\x33\x62\x6e\x98\x49\x3e\x1b\x5e\x7a\xe5\x68\x97\x88\x4d\xc3\x4a\x1c\xea\x99\x59\x6b\x80\x74\x9e\x75\xfb\x3c\x5b\xd3\x71\xba\x18\x0d\x81\x6c\x87\xae\x21\xbe\xda\x23\x90\xaf\x8f\x77\xfa\x87\x0f\x88\xf2\x4b\x60\xcf\xbf\x7f\xf2\x60\xf8\xcf\x93\xe9\xb7\x71\x72\xf5\xd9\x3e\x96\xb8\x9a\xe4\x92\x5d\x0f\xee\xf4\xc7\xc4\x2a\xc7\x3f\x27\xc3\x85\x5e\x4c\x15\x5b\xa0\x70\x49\x32\xd5\x0f\xd0\x63\xe0\x89\x98\x25\x9f\x6f\xc7\x74\x87\x92\x0e\xb2\x6a\x3b\xb9\x82\xcb\x11\xa9\x43\x98\xa7\xe5\xd6\xee\xb4\x15\x8a\x6f\x5f\x46\xc3\x2f\x74\x63\x26\xa0\xad\xad\x68\xb6\x35\x36\xd8\x82\xc9\x5f\xac\x35\x80\x52\x32\x1d\xc3\x7b\x91\xa6\x65\x30\x27\x92\x0d\xf8\xfd\xe0\xea\x7a\x34\xb1\xab\x83\x3b\x23\x47\x65\x47\x89\x1b\x66\x17\x24\x19\xde\xce\x46\x48\x8f\x64\x1f\x38\x57\x83\xb9\xb5\x0f\x46\x13\xfb\x52\xc7\x6d\x14\xd9\xc7\x7f\x4b\xec\x1d\x38\xc7\x89\xe8\xab\xc4\x5e\xc1\xd7\x64\x09\xc1\x77\xc5\x7a\xd8\xb1\xaa\x6b\xb8\xb0\xec\x3b\xc7\xa3\xf9\x22\xee\x59\x5b\x3b\xc5\x8f\x89\x15\x85\xab\x88\xf5\x91\xdd\x89\xd9\x60\x32\xff\x94\xcc\x66\x40\xb6\x75\x6d\x67\x94\x5c\x45\x0a\xe7\x66\x8f\xea\xe4\xea\xe7\xe9\x4c\xcf\x92\x73\xed\x7e\x46\xb7\xc4\xf5\x60\x32\x49\x66\x8e\xaa\xc4\xf1\x81\x81\x20\x3a\x3a\x13\x65\xd7\x4d\xf0\x78\x1d\x5d\x5b\xbb\x72\x83\x19\x7c\x04\xee\xe1\x4f\xa3\xe1\x60\x3c\xbe\xd3\x57\xc9\x7c\xf4\x79\x02\x77\x11\x32\xad\x58\xa5\xc6\x1b\x1a\x2c\xf1\x1c\x09\x77\xf8\x57\x5e\x94\xba\x9b\xa0\x78\x21\x63\xfd\x37\x38\x8e\xcc\x67\x26\x4f\xe3\x1f\x3a\x89\x0b\xe9\xe3\x42\xfc\x81\xf2\x46\x4d\x56\x49\x3a\x8d\x30\x15\xda\xcb\xa8\x01\x49\x81\x7a\xbf\x33\x55\x6d\xd6\x06\x81\x36\xad\xc3\x52\xd6\x69\x8e\xde\x06\x3a\x93\xd6\x7f\xdb\x23\x1a\x1a\x56\x95\x20\x1f\x43\xad\x97\xa6\x79\x32\x58\xcc\xa9\x08\x51\x5c\x87\x54\xb2\xf6\x45\x4d\x49\x65\x24\x79\xa7\x9b\xd7\x97\x0a\x94\x4f\x85\x01\x34\xcb\x48\x71\x2f\x15\xd5\xb5\x95\x84\x1f\x62\xea\x06\xa8\x24\xca\x4a\x12\x13\x44\xa1\xa7\xe6\xd2\x60\x54\x29\x2b\xde\xba\x4a\x0b\xcf\x74\x87\xa0\x30\x98\xfe\x62\xda\x7e\xa6\xdd\x6a\x07\x12\x56\x69\xa1\x96\x80\x40\xb7\x87\x46\x34\xca\x83\xad\xcb\x02\xa8\x0f\xa1\x84\x87\x96\x44\xd7\xd9\x3d\xd1\x7e\xd8\xc5\x6c\xc3\xad\x23\xf1\xa7\x0a\x9a\x8d\x73\xd1\x65\xec\x4b\x20\xdb\xb9\x47\x66\xe3\x6a\x7f\x4d\x41\xb2\x05\xb3\xff\x8e\xcc\x0f\x2a\xd5\x56\xe5\xd6\xd4\x21\x07\x0a\x2c\x65\x0e\xd9\xad\xc8\x33\xd4\x78\xcc\xff\x1f\x4d\x92\x7a\xae\x49\xcc\xcc\x88\x59\x40\xf3\xc9\x36\xcd\x0a\xe5\xf9\xbe\xec\x02\xad\x56\x65\xb5\xf6\x00\xed\xa2\x39\xbb\xf6\x3b\xb2\xe4\xce\x32\x23\x80\x61\x81\x60\xc5\x31\x4d\xf6\x11\xac\x90\x5b\x4c\x74\x05\x3d\x6f\x83\xdc\x51\xfa\xe4\x8a\xa7\x81\x81\xc4\xae\xe4\xc2\xfc\x96\xd6\x3d\x50\x42\xd5\x3e\x07\xc8\x52\x47\xa8\x52\x63\x41\xe4\x93\x0b\x56\xd9\x27\xa8\xb2\xea\xe4\x04\x9b\xe7\xa8\x1e\xb8\xbd\xa0\x4b\xee\xa0\x98\xdc\x01\xf1\xcf\x1d\xc7\x49\x5f\x49\x5e\x67\x2d\x7e\x80\x82\x63\x43\x14\x1c\x70\xe0\x61\xf6\x2b\x24\xe3\xc8\x0a\x3d\xd8\xd7\x8d\x3d\x57\xb0\x18\x91\x0b\xaa\xad\xcd\x06\x31\x70\xd3\xca\x68\x42\x4e\xa0\x74\xb1\x48\xbb\x70\xcb\x61\xb8\x10\xf6\x19\xc8\xdc\xe1\x90\xd8\xf0\x7d\xed\xe4\x47\xfc\xf3\xec\x8b\x19\x96\xf5\xf9\x45\x7c\xf1\xef\x95\x02\x78\x3e\xfe\xff\xf6\xe2\x97\xb7\x17\x1d\xfc\xef\xb7\xef\xfe\x11\xff\xff\x7b\xfc\x99\x99\xb5\xfe\x92\x36\xda\xca\x40\xbb\x3e\xe0\xf1\x22\xbe\x40\x1e\x91\x18\x6d\x20\xb4\x5e\x94\xb2\xb2\xa2\x4f\x04\x25\xc0\x09\xa1\x99\x80\xf6\x26\x00\x13\x0f\xb4\x6c\xc2\xd0\xab\xe7\x45\xc4\xe4\x1c\xd6\x8e\x5e\xcb\x74\x25\x34\xf6\x5e\x86\xef\x60\x92\x8a\x13\x81\x9c\x82\x44\xf5\x41\xeb\x5e\x40\x85\x10\xe1\xfd\xa9\x82\x87\x63\xc0\xd7\xaa\x2d\x49\x71\xe2\x40\x09\xc3\x91\x60\x85\xcd\x92\xa6\xe3\x4b\xb8\x25\x21\x02\x8c\xf6\x35\x8c\xd6\xd3\x8c\xc8\x61\x76\x58\x64\xc3\x57\x90\xd6\x12\x93\x51\xbd\xbc\x0e\x76\x80\xc1\x37\x21\x11\x0c\x6b\xbe\xc2\x2e\x10\x4e\x99\xec\x98\xf6\xa1\x61\xe6\x2e\x75\x11\xbf\x89\xf5\x49\x92\x9b\x55\x53\x95\x45\xb6\x0a\x31\xd4\xaf\xcd\xea\x21\x2d\xb2\x7a\xcb\xc3\x4e\xf5\x96\x7f\xa4\xef\x4d\x61\x75\x57\x7e\x20\x84\x47\xb3\x56\x94\xa3\xf0\x04\x6c\xc8\x48\x41\x31\x59\x2c\xff\x38\xf8\xfe\x5b\xff\x56\x84\x1a\xc4\x8a\xd8\x75\xda\xa4\xa2\x29\xf4\xad\x1d\xdf\x6f\x66\xb5\x07\xae\x13\x1e\x48\x48\x43\x27\x33\x49\x1e\x45\x48\x72\xbb\xdb\x99\xbe\x8b\xf5\x49\x87\x2b\xe3\xe4\x25\xc4\x1d\x6e\x05\xc5\xba\x17\xab\xc8\xbb\x7c\x1b\x34\x6f\xf1\x42\xee\x81\x94\xb8\xaa\x8e\xfd\x17\x46\xf3\x4b\xac\x4f\xc6\x69\x75\x6f\x2a\x60\x9e\xf6\x2b\x8c\xac\x30\xd0\x76\x83\x7b\x6f\x5a\xd3\x2d\xab\xce\x4e\x62\xe0\x7f\x45\x2f\x0e\x6e\xe1\xe6\x18\xad\xbf\x58\xe3\x3f\xc5\x9e\xda\xc5\xad\x87\xb5\x60\x28\x37\x03\x03\xfe\x35\xd6\x27\x81\x9c\xb9\x21\x8b\x6a\x43\x7b\x86\x01\x66\x36\x37\xf0\x4f\x57\xbb\x43\x3d\x39\x2b\xb8\x9d\xad\x49\xb0\x6a\xf6\xc8\x94\x2a\x12\x3b\x9d\x13\x11\x34\x5c\x86\xba\x40\x7f\x7b\x30\x85\x6a\xd3\x11\x56\x26\x37\xd0\x31\x08\x35\x4a\xb5\xa9\xa8\x17\x63\x93\xe5\x08\xbf\x2c\x1f\xa2\xb3\x1a\xbb\x88\x07\x3f\x32\x03\xd9\x3a\x94\x22\xd3\x0d\xf1\x51\xdb\xb3\xc5\x43\x57\x6e\x8b\xfa\x87\x0d\x2d\xa9\xf6\x7d\x85\x79\xc2\x87\x50\x0d\x1f\x31\x5b\xc3\x8c\x45\xae\xae\xb3\x24\x47\x9f\x7b\x11\x5f\xbc\x8a\xf5\x49\xf0\x05\xde\x22\x29\x99\x40\x81\xd4\xa6\x4a\x0c\xd8\xc8\x55\x40\x5a\xfd\x7b\x24\xdb\x2e\x7b\xa8\x6a\xc1\x97\x21\x1e\x5a\x82\x1f\x07\xca\x7d\x2a\x39\xa1\xfd\xea\xe1\x6f\x3a\xc2\x8a\xae\x02\x56\x74\xdd\x62\x45\xc7\x65\xb0\xd7\x90\x18\xb1\x3c\xe2\x3b\xe8\x47\xae\x10\xb8\x59\x14\xc7\x0b\x29\xda\x40\xd1\xdb\xf7\xac\xb8\xef\x16\xcb\x64\x8d\x2c\x4c\x03\xac\x9f\x72\x0d\x46\x69\xe6\xf7\x30\xd2\xbb\x7c\x4f\xc7\xa2\xae\xcb\x55\x96\xa2\x6e\x6c\x4c\xb5\x49\x81\x12\x9c\xe1\x62\x59\x2c\xed\x6a\xef\x9a\xda\xe5\x1c\xe1\x52\x2c\x91\xf5\x32\xcb\x5d\x66\x14\xeb\xc3\xf2\x5c\xf4\x23\x6b\xaf\x1a\x31\x9d\xa6\xf3\xac\x6e\xda\x49\x65\x57\xfd\xcb\x54\x9a\xd6\x7e\x05\xaf\x11\x39\xc4\xd4\xf3\x67\x10\x75\x2a\x80\x9c\x41\x93\x50\x24\xd0\xe6\x42\xcd\x84\x76\xbc\xb8\x04\x7f\xaa\xf5\xea\xa1\x04\x76\x8e\x45\x4b\x8e\xc8\xef\x23\xea\xa7\x2d\x14\x2f\xa2\xfb\x97\x56\xab\x87\xec\x31\xcd\x95\xdd\xa3\x48\xa6\xd8\xa1\xc7\x01\x52\x77\xd6\x56\x5e\x1b\xfe\x1e\x27\x34\xcd\x39\x7e\x37\x2c\x10\xb0\xae\xc4\x1a\xda\x33\xdc\xb0\x37\xd0\xf4\x04\x4c\x89\xf7\x24\x35\xd6\xb0\xb8\x2b\xf7\x5e\xab\xb5\xee\x83\x94\xea\x0f\xbb\x48\x6c\xb2\xd9\x21\xa2\x52\xe4\x2d\x81\xf0\x63\xf1\x41\x9e\x07\xe5\xca\x50\x21\x19\x08\x3b\x3c\x7f\xb3\x07\x9d\xe8\xc9\xef\x55\xeb\x40\xd4\xfb\x76\x7f\x83\x7e\x67\x8d\xae\x4f\x8e\x0a\x05\x06\x97\x59\x99\xc2\xb9\x70\xbf\x9a\xb2\xd2\x48\x23\xe7\xbb\x05\x64\xac\x86\x7a\x06\xfa\x47\x0e\x27\x0a\x5d\x7b\x6e\xde\xc0\x12\x29\x27\x92\x76\x3e\xea\xae\xdc\x1f\xc1\x5c\xf2\xb2\x1d\xe9\x13\xfa\x0e\xaf\xe8\x69\x7a\x86\x67\xb0\x7c\x82\xaa\x7b\xe8\x9d\x52\x82\xea\x0d\x9a\x6c\x10\x31\x1d\xc1\x02\x2a\xe3\x1c\xb8\x6d\x5a\xa4\x58\x7d\xe6\x5a\x92\x70\x3a\xae\x8f\x4d\x01\xc7\x03\xf1\xe5\xc9\x06\x2e\x98\xcf\xe9\xf2\xcc\xc7\x32\xf0\x46\xd8\x34\x00\x28\xbf\xb2\xcf\x3c\x7d\xfb\xea\x3f\x41\xdb\xd7\xb6\xac\x5c\xbd\x75\xb9\x6f\xb8\xc4\x0d\x8b\x16\x6b\x74\xe1\x0b\x43\x30\x37\xc1\x03\xc5\x98\x50\xa0\xac\xed\xc7\x86\xf4\xc7\x2a\x05\xf8\x40\xd4\x47\xb0\xe2\x6b\x52\xfd\xfc\x11\x4f\x50\xe6\x80\x5e\xb0\xcc\xa4\x56\x84\x99\x13\x92\xc2\xe1\xf6\xb4\x0b\xfb\xc1\xf2\xb1\x83\x7f\xc6\x84\x8f\x15\xfd\xf2\xa7\x3a\x18\x18\x94\x3e\x90\x16\xa3\x4b\xa8\x92\xb2\x2b\xcf\x3a\x5a\x0f\x97\xb1\x9e\x4f\x6f\x67\xc3\x04\x49\xef\x29\x88\xa6\xd4\xa5\x95\xca\x7e\x6e\xb2\xcf\x08\xb6\xdf\xff\xcb\x0e\x12\xa0\x22\x24\xc0\xf3\x63\x50\x80\x0e\xf7\x8f\xfd\xef\x28\xf4\xbb\xb3\x6a\x4d\x6c\x93\xfd\xdc\xa2\xc8\x65\xf3\x5e\x29\x90\xce\x52\xb7\xdb\xc1\xe1\x0a\x38\x00\x44\x27\xa1\x79\x22\x8c\x67\x24\x18\xdd\xb1\x07\xd8\xed\x8c\xea\xaa\xd1\xd3\x1e\x9b\xed\x4c\xb7\x0b\x8f\x5a\x56\x7c\x59\x29\x51\xb8\x93\x6a\x61\x2d\x52\xd7\xb4\x15\x6a\x14\x83\x5d\x8a\xb6\x49\x51\x02\xd1\xa4\x87\x96\xb3\x22\xba\x76\x8e\x16\x1f\xf1\xee\xd2\x47\x5c\x61\x1f\x61\x1b\x90\x75\x70\x22\xa8\xd3\x82\xd8\x84\xd5\xfd\xa7\x27\xb7\x40\x78\x68\x4e\xce\x7a\x6e\x0a\x39\x45\xc5\x53\x44\x8c\xa0\xba\xcc\x4d\x87\xc2\x17\x4b\xc0\x19\xb4\x08\xc7\x8f\x16\x9c\x83\x25\x08\xaa\xff\x0d\x62\x33\x10\x30\x11\x8d\xe4\x85\x71\xf8\xa5\xc6\x48\xa2\x95\x09\xd0\x84\xf7\xe0\x80\x56\xc1\x58\xa8\xee\x27\x00\xa1\xe3\xd7\x6c\xf6\x40\x8a\x1a\xee\x90\x42\x10\x1f\xf6\xce\x6a\xc0\xda\xb8\x8c\x03\x86\x4c\x92\xf6\xc4\x7a\x63\x01\x73\xe6\x31\xc8\xcb\x3e\x41\x57\xbf\x4b\xd0\x8f\x90\xe8\xfe\x7b\x09\x7a\xe8\xb4\x0a\x42\x41\xd8\x57\x39\xe7\xfe\x9d\x41\xd3\x03\x3b\x76\xf5\xbe\xf0\x41\x47\x60\x65\xa4\x33\xd2\x5d\x7c\x00\x65\x6d\xbb\x45\x74\x5c\xd4\xdf\xfc\xb8\x04\x11\x81\xa6\x54\x52\xfc\x7a\x82\x11\xfd\x53\x3d\x7e\x18\xd4\xef\x39\x0c\xfa\xb9\xc3\xa0\x7e\xc7\x68\xfc\x99\xd0\x47\xce\x84\xfa\xdd\x67\x42\x77\xcf\x04\x42\x7a\xfa\x24\xe4\x74\x22\xb3\xdc\x4a\xbd\xb6\x77\xc5\x20\x64\xe6\x75\xa8\xb5\x8b\x8e\x84\x79\x40\x0a\x22\x6d\x43\x58\x33\xf8\x31\x80\x74\xfa\x88\x12\x72\x56\xfc\x88\x2f\xdc\x43\x3a\xac\x44\xfb\xb0\x83\x15\xb1\xc7\xbb\x6d\xc7\x7a\x73\x2d\x94\x47\x5a\x3b\xc1\x3b\xaa\x80\xc3\xa6\x8d\xab\xd8\x26\x4b\xef\x37\x05\xc3\xcf\xb0\x9b\xab\x3a\xc6\x20\x6e\xab\xc3\xd2\x70\x70\x22\x82\x5d\x55\x3c\x07\x4e\x97\x79\x34\xd5\x41\x49\xf6\x55\x39\x3d\x80\x2f\x71\x73\x78\x19\xbf\x11\xfb\xf1\xa8\x79\xad\x6f\x9d\x88\xa0\xa6\xa1\xda\x4b\x8f\xb5\xd8\x78\x86\x66\x2b\xdc\xf4\x79\xd5\xb3\x3e\xd8\x7a\xc5\xc0\x9a\x3f\x79\xc8\xbb\xca\xc0\x82\x88\x16\x66\x1e\x2e\x83\x69\xa4\x85\xec\x8c\xe4\x00\x07\xce\x84\x93\x72\xe2\x03\xf4\xe4\xc0\x21\xf6\xdc\xc6\x6f\x01\xee\xe8\x32\xd6\x03\x74\x2c\x5c\x6f\x98\x0c\x3d\x81\xb7\x1f\x84\x1d\xfa\x45\x58\x89\x1f\x7b\x11\x86\x5d\xe4\x96\x3e\xef\xbf\x64\x41\x78\x0b\x9d\x59\xdf\xbd\xd3\x2f\x58\x8f\x00\x4a\xeb\xa2\x75\xfa\xc5\xa8\x1f\xdd\x96\x65\x81\x6c\xc5\x0f\xe5\x56\xb0\x24\x4b\xd7\xd3\xed\xad\x1f\x20\x21\xd9\x36\xde\xcc\x53\xce\xd6\xf8\x80\xce\xec\xa6\x3d\x29\x3b\xc0\x17\x07\x15\xc1\x92\x28\xcc\x66\xe9\xd0\xa3\x73\x4c\xf9\xcd\x93\xc9\x1f\x8d\x3e\xbd\xb8\x3c\xd3\xdb\xb2\x68\x1e\x6a\x8d\xfa\xdd\x75\x78\x67\xf6\x6c\x64\x88\xd2\xad\x96\x66\x95\x6e\x03\xe6\x67\xf9\xb0\x3a\xfb\x4d\x9f\xbe\x6b\x3d\x08\x51\x66\x10\xe7\x21\xf4\xd8\x82\x80\x70\xb8\xf1\x0e\x70\xa1\x35\xf1\xa6\xe4\x04\x9b\x03\x8b\x45\xe3\xb7\x87\x34\xdb\x14\xf5\xbe\x72\x44\x4f\xed\xd3\xca\x23\xc1\xe5\xa9\xfd\x3b\x94\x44\x80\x78\x79\xe7\x21\x75\x9b\x81\x27\xc0\x51\x71\x61\x62\xc4\xea\x18\xa5\x77\x51\x36\xd9\xe6\xc0\x07\xe9\x28\x33\xb1\x5c\x15\xc5\x11\xf6\xbc\x0c\xe1\xf6\x68\x5e\x19\x13\xa1\x5b\xbf\x0e\x3d\x49\x51\xf2\x1c\x3b\x47\xe7\x29\x43\x0e\xfe\x14\x9b\x36\x53\x31\x83\xaa\xf5\x48\x84\x94\x39\x78\x92\xc8\xe2\xd8\x92\x28\x1f\xef\xe6\xb0\x75\xb0\xa3\x98\xd8\x0d\xb7\x13\x75\xe4\x2a\x2d\xdc\xa8\x69\x88\xae\x89\xb5\xf3\x98\xce\xb9\xc1\x75\xec\x5f\xc4\x58\x9f\x12\x27\x36\xc6\x78\x9e\xd2\xca\xc4\xab\xc3\x7d\xb1\xaf\xe3\x55\xb9\xfd\xd9\xac\xca\xfa\xe7\x33\xab\x99\xec\xbd\x6b\x30\xb8\x44\xeb\xda\x8a\xa1\x7a\xcc\x25\xf0\xba\x91\x2d\x42\xdc\x61\xee\x62\x3d\x84\x5a\x89\x62\x54\xc8\xdb\x0d\x51\x4c\xd6\xa4\xbc\xf5\xcc\x3e\x76\xc7\x0a\xc3\x7e\x05\xb4\x1d\x1e\x91\xe0\x35\x2c\x01\x6b\xca\xff\x42\x99\x35\x3c\x20\xee\xbb\xca\x76\x55\xb9\xcd\x0a\x6b\x37\x79\xa4\x04\x77\x1a\x5a\x01\x5e\xae\xd1\x3f\x4e\x2e\x0f\x01\xde\x30\x7c\xeb\x22\x4e\xcb\x23\x5b\x40\xd1\x38\x07\x68\x4d\x4d\x09\x2c\x66\x1d\x8d\x67\xf5\x35\x87\x3f\xc4\x71\xc5\xcb\xda\x9a\xa5\x94\xc2\xa0\xd8\x2a\x62\x0f\x76\xf5\xab\xe2\x1a\x8b\x4e\xdf\x44\x80\xd4\xc5\xb7\x15\x06\x31\x60\x66\x10\x10\x11\xd1\x0a\xd5\xef\xcf\x83\xad\xf6\x26\x86\x4c\xb8\x73\x21\x6e\xd8\x85\xb8\x86\x22\x95\x1a\x5d\x88\x05\xa8\x83\x1b\xf0\x38\x86\xe0\x5b\x38\xfc\x4e\x70\x20\xb9\xea\xde\x30\xff\x1e\x3a\x27\xcc\x1d\x5b\x04\x6e\x8a\x72\x6e\x0a\xd3\x15\x49\x1d\xba\xd9\x17\x2b\xbc\x8f\xe1\x7a\xad\x30\x78\x62\xad\xda\xac\xa9\x89\x85\x1f\x97\x41\x34\xb8\xd3\xad\x77\x86\x0c\x76\x2d\x09\x82\xbe\x59\x90\x5b\x57\x88\x10\xc6\x4b\x85\x06\x80\x72\x97\xb5\x3e\x19\x27\x9f\x07\xe3\x13\x5a\x66\x5e\x62\x4a\x38\xda\x49\x39\x29\xc6\x89\x0a\xb2\x31\xfc\x75\x56\xa8\x7a\x0f\x00\xc9\x56\x5e\xd7\xa6\x01\x54\x15\x5c\x1b\x8f\x1f\x0d\x8d\xbf\x76\xed\xf0\xbe\xe5\x83\xb6\x6a\x60\x75\xed\x54\x90\x2f\x5f\xc1\x85\xe1\x17\x19\x6f\x25\x3c\x6d\xdf\x09\x3b\xe5\x98\x8a\x09\xed\x19\x0f\x09\x1b\x5f\xa2\xbd\x84\x15\x0c\xf6\x94\xed\xec\x79\x41\xcf\x10\xbb\xb4\xed\x1a\xe0\xc2\x11\xd6\xfd\xaa\xdc\x65\xee\x98\x7f\x37\x22\xc4\xda\x78\xaf\xca\x23\x23\x34\x76\x70\x84\x8e\xdc\x98\x5d\xad\x4f\x19\x99\xd9\xdf\x1c\x22\xc4\xab\xb6\x69\x06\x84\x48\x79\x56\x37\x60\x2e\x16\xe6\xa9\xbe\xaf\xca\xfd\xae\x3e\x93\xde\xd1\x2a\xcd\x57\x7b\xc7\x7b\x85\x98\x88\xd4\x54\xfd\xf4\xe0\x80\x57\xd7\x1d\xb1\xc7\x0d\x28\xcc\x93\x58\x4a\x77\x4b\xe3\x4a\x43\x0f\x9b\x3d\xa3\xd2\xb5\x1a\xdc\x8c\x9c\xbc\x57\x1d\x9d\x63\xad\x2c\xe1\xd0\xec\xaa\xf2\xbe\x4a\xb7\x5b\x6c\xba\xa7\x34\x80\x62\x3b\x9d\x50\xb7\x38\xc0\xca\xae\xa9\xa7\xf3\x39\xe6\x04\x66\x5b\x02\xa1\x43\x8d\x3a\xb8\x19\x09\x59\x07\x60\x15\x8f\x20\x0a\xd0\x65\x1e\x28\x92\xe9\x2e\xdc\x76\x82\x21\xfb\xd6\x5e\xa6\x94\xd5\xc1\x9e\x24\x79\x45\x70\xf3\x10\xaa\x15\xaf\xa9\x7c\xf2\x87\xd2\xce\x0a\xe4\xa3\xeb\x4a\x70\x2e\x5d\x86\xb4\x51\xed\x85\xba\x8c\x2f\x5a\xfc\xaa\xc2\xaf\x3e\x31\x24\x90\xd7\x6e\x3d\x1e\x80\x28\x40\x0b\xb5\x1b\x6d\x95\xe2\xf8\x04\xb4\xea\x63\xb4\x37\xd8\xbd\xd3\xfa\xcc\xfb\x0c\xe9\x7a\x6d\x17\xb4\x42\xdd\x0e\x19\x45\x21\x03\x8a\xcc\xdb\xc0\xd6\x1f\x31\xf4\x30\xf0\x96\x13\x82\x06\xb0\x12\xed\x09\x8c\x59\xa8\x78\x59\x38\x10\x58\xf3\x70\xa1\xee\x0d\xa3\x13\xb8\x74\x29\x61\x34\x76\x14\x5a\xf8\x60\x95\x7a\x53\xca\x1d\xaf\x14\x7c\xc6\xc7\xd4\xaa\x1e\xb8\xfa\xca\xea\x00\x2f\x3a\xa3\xa5\x4d\xf5\xbe\x36\x95\x7e\x02\x30\x11\x00\x54\xfb\x6e\x10\x71\x2b\x2f\xcb\xef\xb0\x29\xf8\x2c\x7a\x91\xf7\x04\x89\xc4\xb8\x21\x20\x1f\xc7\x62\x81\xc9\x15\x6b\x20\x18\x30\x0e\x1d\x3e\xde\x21\x02\x04\xc5\xb2\x82\x6c\xda\xda\x6c\x0b\xd2\xeb\x1e\xa3\x4b\x62\x27\xda\x07\x8b\xed\xf2\xdb\xae\x5a\x2e\x77\xac\x54\xc7\xef\x5b\x97\xba\x2e\x91\x3c\xb6\x2c\xf0\xb4\xda\x03\xb7\x34\x0f\x69\xbe\xf1\x31\x90\x92\x7f\x74\xfc\x0a\xa7\x74\xb4\xac\xf0\xf0\x87\x83\xb1\x49\x18\xf0\xcb\xaa\xa4\xdc\xa4\x55\x18\xe6\xfc\x43\x0b\x60\xa5\x09\x16\xd6\x63\xf3\xa4\x79\x59\x50\x6a\x15\xee\x5b\x0c\x26\x32\xff\x28\x3f\xf2\x98\xfd\x08\x93\x06\xa7\x3f\x10\x67\x86\xb9\x13\x70\x6d\xc5\x6a\x5f\x55\xcf\x99\x41\x2c\x14\x52\x35\xa6\xb5\x4a\x89\xb7\x49\x80\xb2\xfd\xc0\x94\xd1\x6b\x05\x95\x68\xa7\x0b\x2a\xe9\x5d\x97\xd5\x5f\x98\x45\x14\xe0\x12\xac\x12\x22\x3f\x22\x25\x43\x65\x81\x39\x85\xb9\x5f\x2b\x13\x19\xe3\xb8\x80\xda\xdb\x72\x7e\xdf\x5f\x89\x17\xe7\xaf\xe3\xb7\x68\xd1\xa0\xe7\x66\x1a\xb5\x61\x22\x05\xf9\x8a\x88\x9d\xda\x00\xc5\x95\x4f\xa5\x35\x54\x7b\x9c\x36\xd5\x8e\x20\x75\xee\xa7\xac\xee\x63\x26\x3d\x12\xc5\x12\xed\xd1\x29\xe9\x49\x67\xf9\x3f\x94\x4f\x58\x24\xec\x14\x29\x4c\x8a\x48\x07\x29\xbb\x2a\x79\x07\x83\x65\xa0\xb8\x17\xcd\x86\x83\x12\xab\xb2\xa8\x77\xd9\x6a\x5f\xee\xeb\xdc\x85\x58\xd6\x1d\x63\x56\xf5\x1a\xb3\xd1\x11\x53\x16\xee\xc2\xdc\xfe\xa6\x22\x56\xf7\x8e\x61\xab\x5e\x50\xfd\x1d\xe3\xb6\x4f\x3e\xc0\x11\x76\xa3\x52\xc7\xc2\x78\x0c\x53\xe2\xe0\x48\xe8\xce\xc7\xb4\x36\xd3\xee\x89\xcc\x19\x45\x5f\x7c\x62\xce\x77\x07\xbb\x68\x63\xd0\x35\xee\xe8\x75\x01\xbf\x63\xbb\xcb\x33\x57\x22\xab\x8e\x87\x09\x25\x11\x9f\xac\x3b\x6f\xcd\xcb\xb9\x0e\xbe\xb8\xbb\x69\xcc\x76\xd7\x20\x4b\xdf\x36\xa3\x24\x1f\x07\x47\xdc\xca\xfe\x54\xb7\x78\xa9\xc5\x0d\xe5\x16\xcb\x15\xc7\x30\x21\xa7\xec\x00\x0e\x0a\x33\xd8\x37\x78\x79\x03\x78\xc1\xfd\x02\xf2\xec\x7e\x5c\xdb\xd2\x1e\x90\xad\x9e\x49\x06\x1c\xb9\x84\x50\x80\xd4\xa3\x59\x11\x50\xed\x70\xa4\xda\xeb\xd8\x45\xf0\x43\x6a\x58\xbd\xa0\x86\xf5\x0f\xab\x61\xf5\x92\x1a\xd6\x52\x0d\xbb\xe4\x42\x57\xcb\x92\x5f\x21\x76\xc6\x74\xc4\xa7\x96\xb5\x4e\xa1\xda\x3b\x78\x6c\x72\x4a\x26\xa9\x7e\x03\xf1\x23\x4b\xd2\xf1\x96\x7f\xd7\x2f\xd0\xee\x69\xa7\x9e\xed\xf5\x7e\xd5\xc0\xbd\xf0\x4b\x2c\xf3\x3b\xe2\x02\xa0\x88\x6a\x90\xfe\xd1\x50\x19\xb0\x5d\x76\x47\xaf\x44\x7a\xe9\xf7\x55\xcf\xb5\x52\x61\x20\x2a\xf2\x95\x58\x7f\x96\x15\xf7\xb9\x1f\xb8\x1e\x15\x6c\x43\xad\x00\x23\x3c\x14\x68\x68\xc4\x6f\xdf\x46\x9d\xf0\xb7\x15\x5a\xaf\xb4\xf9\xc0\x77\x5d\x79\xeb\xc5\x4f\xb8\x43\x73\x31\xd5\xd0\xec\x7b\xa7\xaf\x6e\x13\xfb\x2f\xec\x41\x86\x76\x17\xdf\xf5\x04\xa2\x80\xe6\x2b\x04\xf4\x7d\x58\x8f\x12\x4d\x12\x00\x54\x40\xd0\xf7\x2e\x90\x0a\x1b\x4e\xac\x19\xb6\x35\xcf\x14\x14\xb0\xc1\x8b\xd8\xcb\x06\x53\x03\xdc\xff\xaf\xc0\xee\x75\xd4\x1f\x10\x4b\x69\xc3\x84\xf7\x6f\x13\xb7\x4c\xa4\xbf\x89\x96\x09\xc5\x93\xfb\x00\xc1\x97\x55\x46\xda\xa8\xf7\xdd\x54\xe3\x5b\x95\x20\xc5\x35\xc8\x3b\x02\x12\xae\x1f\x20\x67\xa0\x1c\xab\x0e\x52\x62\x60\x50\x67\x75\x16\xc6\x61\x72\xc9\xae\x47\x91\x02\x2a\x02\x31\x07\xea\x48\x89\xd5\x7c\xef\x82\x0b\x78\x73\xf3\x55\x2b\x2f\xd7\x96\x27\xde\x97\x9c\xd0\xaf\xe3\x37\x60\x1f\x76\xbe\xef\x0a\x92\x3a\x30\x24\x1d\x67\x86\x60\xbe\x9a\x52\x89\xbc\x3d\x2f\x04\x25\x79\xfb\x56\x8c\x9a\x58\xfa\xa6\xe1\x23\x20\xf9\x41\x61\x0c\x84\xa4\x38\x0d\x49\xb4\x80\x70\xda\x3a\xba\xf5\x77\x80\x7b\x86\x38\x2b\x07\xcb\x3d\xfa\x94\xce\x1a\x0c\x95\xc3\x0b\xea\xfd\xd2\x5e\x68\x28\x00\x7e\x81\x9a\xd2\x05\x89\x37\x30\xd0\xc7\xcc\x3c\xf9\x44\x99\x43\xfd\xa4\x37\x28\x2e\x40\x5a\x91\x78\xae\x44\x91\x31\x06\xa0\xf7\x45\x93\xe5\x12\x59\x31\xf3\x54\xbe\x20\x1b\x22\xe2\x8b\x84\x4a\x7c\x50\xb3\xc2\x99\xbb\xee\x3c\x3d\x27\xf9\x78\x98\xdf\xc6\xdc\x96\x27\x5b\x48\x7d\xbd\xcd\x22\xd0\x10\x9e\x30\x79\x25\x83\xb8\x47\x6c\x78\xe0\x04\x6d\x9a\x14\x28\xcb\xad\x1a\xeb\x71\xed\x9d\x4f\xc7\x26\x5b\x4b\xdf\xf0\xf2\x8a\x4c\x5b\xa7\x44\xdb\xa1\xa6\x38\x68\x14\x50\x85\x3e\xd7\xc6\x1f\x50\xd0\x24\x05\x45\x57\x7d\x0c\xa3\x9d\xd4\x2d\x47\xf3\x5d\x03\x4e\xf8\x5c\xe5\x5e\x5c\x16\x9d\x72\x29\x32\x0a\x08\x7a\x93\xd2\x1d\x6d\xdb\x25\x9c\x9f\x6b\xa9\x6a\xa5\x5e\xca\x8d\xee\xab\xf6\x72\xd3\x65\x91\x08\x7e\xf9\x6f\x9b\xaa\xea\x7d\xe1\x1f\x9e\xe6\x30\x4c\x57\x80\xcc\xe2\x19\xc5\xa2\xe7\x1c\xdb\xa3\x58\xd3\x21\x95\x23\x34\x8b\xb9\xd4\x07\x48\xeb\xbb\x58\x7f\x4d\x66\x73\xd9\xdd\xeb\x24\x15\xea\x15\x27\xe6\x49\xf8\x6e\x72\x71\x09\xb1\x0f\xce\x68\xed\xe9\x76\x0b\xf3\xe4\x2d\x11\xc2\x3b\x64\x71\xc7\xb9\x65\x5b\xd4\xf5\xd9\xd6\x50\xb9\x0d\xdb\x93\x0c\xa5\x78\x9f\x3d\x9a\x02\xec\xca\xda\xfa\x09\xfb\xac\x06\x14\x4c\xb6\x8f\x8b\xfd\x76\x09\xe6\xd0\x3b\xeb\xec\x20\x91\xa0\x7d\x55\x38\xd6\x69\xb1\x6a\x49\xb6\x8b\x16\x7a\xb0\x41\xb2\x60\x95\x08\x61\xb7\x5c\x3c\xb7\xa1\x2e\xd4\x94\x3f\xa5\x07\x34\xb2\xb2\x02\xd5\x01\x60\x64\x35\x2e\xa4\x1d\xc8\x44\xea\x72\x8e\xb1\x78\x44\x5d\x8a\x58\xcc\x9e\x4f\x42\xd7\x9b\x09\x9f\x86\x96\x61\x4f\x2e\x53\x8e\x54\xcc\x6e\x79\xe0\x1d\x8b\xf5\xa4\x54\x10\x9a\xf1\x4d\x17\xbc\x99\x0f\x01\xd9\x5e\x53\xca\x28\x32\x09\x8d\x4f\xf5\xfb\x68\x9d\xa2\x53\x71\x28\xc1\x55\x4d\x1b\xa9\x59\x45\x91\x38\x76\xc8\xba\x41\x8f\x3d\xfe\xdf\x3b\xcc\x7a\x55\xd9\x23\xc2\x00\x92\x7d\x48\x46\xae\x4f\xb8\x43\xbe\xcb\xf7\x38\x1e\xa9\xb4\x50\xa7\xa8\x3a\x0f\xb4\xc8\x10\x34\x58\x97\xbe\xd3\xd2\x81\x7f\x66\x8d\x53\xb8\x5c\x47\xff\xfb\xeb\xd7\x65\xb6\xc2\xda\x38\x95\x81\xd0\x23\x38\x9c\x4e\xbd\x95\x9e\x80\x7d\xf7\x50\x01\x37\xdc\x49\x32\x9c\xce\x4f\x22\x7d\x62\x86\x65\x6d\xff\x4f\xdb\x00\x7f\xfd\x92\xdc\x8c\x4f\x3c\xfe\x55\xb1\xd9\x83\x5d\x7a\xf0\xfc\x84\xf0\x14\x45\x24\x35\xe9\x6e\x67\x5d\x29\xc9\x53\x7d\x90\xef\xe7\x94\x95\xa7\x08\x61\x77\xcc\xfb\x60\x0a\xbe\xd1\x12\xa5\xdc\x03\xcc\x62\xaf\xc3\x71\x27\x2d\x2c\x5f\x6d\xb3\xbe\xeb\xd3\x4f\x59\x9e\x3b\x08\xdb\xde\xdc\x9b\xa8\x6c\x0c\x0b\x04\x55\x59\x05\x7e\x12\x3f\x02\x2f\xbd\xc0\x96\xf2\x91\x6d\x0f\xb3\x8d\x6f\xd9\xd6\x26\x7f\x34\xf6\xa6\x22\xc4\x63\x4e\x04\x87\xb5\x50\xad\x86\x9b\x33\xd0\x8e\xbf\xc4\x1e\x2b\x68\x66\xf5\x23\x23\x1d\x29\x35\x9c\x7e\x4d\x66\xc9\x15\x16\xd3\x4a\x9c\x26\x86\x0c\x10\x88\x1d\x00\x09\xe3\x50\x97\x3e\x0e\xe6\xa3\x79\xe4\xf0\x95\xdc\x23\x05\x78\x52\xa4\x93\xd1\xe2\x4b\x32\xd3\x04\x4a\x84\xf8\x32\x0e\x98\x48\x00\xe1\xf0\x53\x00\x56\x81\x50\x92\x3c\xfa\x90\x22\x04\x88\x44\xb7\x87\x8b\x50\x4b\x9f\x18\x39\x49\xa2\x13\x8d\x13\x80\x26\xea\xc0\x12\x29\xc2\x0a\x69\x81\x0b\x8d\x26\x9f\x25\xf2\x0c\xe1\xb2\xcc\xb1\xef\x3e\x71\xe8\x44\x83\xc9\x95\xbe\x49\x66\x9f\xa6\xb3\xeb\xc1\x64\x98\x28\xba\x6c\xda\xe3\xb2\xf3\xd1\x77\xd3\xdb\x58\xcf\xbf\x4c\x6f\xc7\x0c\xd5\x22\x3e\x64\x17\x3a\xa1\x71\x8f\xbe\x26\x7a\x34\x51\x08\x28\x32\xbf\x01\xa4\xa1\xbb\xe9\xad\x3e\x9d\x4c\x71\xda\xd0\xf1\x38\x18\xeb\xab\xe4\x6b\x32\x9e\xde\xd8\x4d\x44\xe4\x04\x40\xac\x90\xd0\x24\x67\x7a\x30\x9f\xdf\x5e\x27\x0a\x47\x35\x5f\x30\x98\xd5\x24\x19\x26\xf3\xf9\x60\x76\x47\xe8\x41\xb0\xec\xb3\xe4\x66\x30\x9a\x21\xba\xc9\x6c\x96\x00\x7a\x06\xc1\x41\x78\x81\x51\x42\x60\x10\x96\x05\xe0\x88\xe6\x56\x18\x04\x02\xcb\x60\xb6\x68\x5b\x89\xb1\x9e\x4c\x01\xc4\x80\xc6\x40\x0b\xa0\x78\x95\x06\xb7\x8b\x2f\xd3\xd9\xe8\xbf\x26\x57\xda\x21\x5a\x00\xd8\xcc\xcd\x42\xca\x9f\x1f\x0a\x5e\xf6\x7f\x8a\x03\x38\x85\x96\x29\x4a\x8e\x0e\x85\x87\x58\x91\xbb\x42\x2d\xe2\x72\xe9\xe7\x82\x50\xcf\xd1\x4f\x80\xea\x60\xac\xf8\x62\xed\x3f\x64\x9d\x68\xb8\xf7\x08\x35\x00\xd9\x19\x94\x60\x67\x70\x36\x57\xfa\x84\x11\x20\x18\x22\x7e\x1c\xfb\xbc\x7d\xc5\x6b\xdd\x17\x4e\x54\x3e\x37\x87\x79\xeb\xfc\xe0\xa6\x86\x9a\x82\xe1\xff\xb9\x20\xae\x4d\x01\xe0\x4c\xae\x1b\xc6\x2d\xaf\xb9\x49\x0a\x83\x0e\x59\xa5\x8b\x14\x53\x3e\xcc\xfb\x96\x66\x90\xb7\xa3\xe6\x7d\xba\x22\xf9\x3a\x0d\x3a\x44\xc5\x06\x04\xc3\xc1\x0d\xfb\x35\x16\x07\x3b\xc0\x92\x52\x0a\xf7\x79\x32\xd5\xc3\xd1\x6c\x78\x7b\x3d\x5f\xd8\x63\x85\x48\x1d\xee\x57\xe8\x58\x21\x14\x55\xc4\x48\x67\x7a\x31\x9d\x2d\x04\x9a\x96\x9a\x24\x9f\xc7\xa3\xcf\xc9\x64\x98\x9c\x45\x78\x24\x06\xf6\x20\x31\xae\xcb\xb7\xd1\x3c\x89\x18\x6b\xa7\xef\x4c\x45\xfe\x44\x29\x71\xa2\x22\xed\xd0\xc0\xe6\xfc\x33\x84\x0e\xf1\xa7\xd9\x7d\x66\x7e\x6b\x7d\x26\x54\xb2\x08\x6c\x84\x20\x30\xa0\x7e\x92\x79\xa4\x3d\xc8\xd8\x62\x0a\x67\x3c\x38\xc8\x08\x59\xe2\xd0\x85\x3c\xee\x18\x63\x8d\x29\x09\x40\x76\x14\x62\x8c\x8f\xdb\x97\x81\x5d\x82\x64\xf6\x82\xa6\x55\xfc\x3d\xfb\x5e\x46\x14\xfb\x3c\x9d\x5e\x7d\x1b\x8d\xc7\x91\xfe\x36\x9d\xfd\xb3\x9e\x2f\xa6\x37\x37\x83\xcf\x49\x04\x51\x9d\x5b\xfb\xd0\x4f\x83\xd1\xf8\x76\x06\x7a\xf4\x7a\x30\xfe\x74\x3b\x19\xe2\xd3\x18\x5d\x88\xc0\xa6\x58\x45\x5d\x5b\xd5\x1c\x8c\x12\x5f\x66\x57\x85\x41\xc2\xdc\x5a\xdd\xe1\x46\xa9\x2f\x83\xaf\x89\xfe\x98\xd8\xdf\x4e\xac\xce\xfd\x11\x00\xb1\x79\xcc\x4a\x48\x88\x9c\xf2\xd8\x61\x1e\xf0\xcb\x3a\xb8\x10\xa9\xf2\xbf\xfc\x04\x88\x51\x83\xc5\x17\x80\x4f\x83\xed\x18\x8c\xf5\x68\xf2\xe7\xdb\xd9\x1d\xa1\x26\x5a\x59\x03\x48\x2d\x3f\xda\x9f\xe6\xda\x4b\x1f\x5f\x19\xc9\x5f\x16\xc9\x64\x21\xc0\x6d\xf4\x78\xf0\xcd\x01\xe0\xcc\xf1\xeb\x7e\x90\xb1\x9a\x4f\xaf\x13\xfd\xe7\xdb\xd9\x68\x7e\xc5\x40\x46\x57\x53\x1c\xe8\x78\x3c\xfd\x46\x0f\x1d\x8e\x6f\xe7\x04\x2a\x13\x1e\x2a\x2f\x1a\x47\xc1\xe7\x22\x3d\x9f\x22\x9c\x92\x7f\x8e\xdd\x27\xf1\x20\x46\xff\xe1\xb5\x51\xf6\x16\xc3\xe6\xfb\x57\x31\xc1\x5e\x5a\xc9\x9f\x00\x5c\x4d\x62\x8f\xe9\x3c\x99\xcd\xad\x16\xee\xc9\x23\xe9\x93\x55\xb9\xdd\x9a\x6a\x85\x28\xf4\x66\x1b\x9d\x60\x4f\x73\x8a\x7e\xa2\xe6\x06\x2e\x34\x7f\xde\xfc\x49\x0f\xe3\x4f\xf1\x2c\x56\x97\xf1\xc5\xab\x0b\x7d\x3a\x5d\x35\xb1\xbe\xf8\xf5\xd7\xb7\x67\xc8\x72\x85\x8e\x94\x55\x6a\xf2\xc1\x9d\xe6\xd2\x13\x50\xd0\xe2\x23\xaa\xdb\x7f\x1a\x42\xf2\xc2\xb0\x44\xb4\xda\x7e\x02\x7a\x23\xe5\xa8\xf4\xc5\x65\x7c\x79\x71\xa9\x4e\xe7\x66\xc7\xe3\x82\xe6\x0b\x3b\x2e\x2c\xa5\x69\x1e\x3a\x1f\x87\xb1\xf8\x1f\x5e\x5e\xfe\x12\xff\x72\xf9\xea\xf2\xfc\xc2\x31\x3b\xbb\x1f\xbd\xd1\xa7\x7f\xde\x17\x86\x67\x6c\x15\x69\x1b\x68\x34\x29\xd6\xfa\xb6\x06\x0c\xd0\x15\xc4\x6c\xfb\xa2\xcb\x05\x10\xb1\x5b\xb7\xac\x93\x25\xc1\x0b\x8c\x76\xf4\x22\xd6\xd7\xa3\xf9\x30\x19\x8f\x07\x93\x64\x7a\x3b\x6f\xdd\xa5\x8e\xfa\xce\x81\x1c\xec\x72\xd3\x48\x68\x21\x81\xff\xd1\x8b\x2b\x14\xab\xd1\x31\x26\x0f\xd1\x74\x0b\xc4\xe1\x68\xce\xb6\x68\x3c\xb0\x39\x81\xbf\xeb\x89\xb3\x1c\x3e\x0d\x4e\x35\x68\xf3\x09\x2a\x56\x7a\x19\x3c\x00\x48\x66\xfc\x1c\x90\xcc\x30\xcd\xb3\x4d\x59\x15\x59\x0a\x58\x2f\x3b\x7f\x67\x9e\x1a\x0e\x51\xca\x6e\x0a\xe1\x59\xe6\xe9\x13\xf3\x97\xb8\xac\x9b\x20\x13\x38\x8b\x34\xf4\xd5\x40\xca\x34\x43\xe4\x7a\x00\x96\x39\x2f\x37\xe7\x79\xfa\xa4\xfc\xbb\x62\xfd\xad\x15\xd0\x76\x68\x30\x2e\x47\xe9\x4a\x86\xad\x53\x4c\xcd\x38\xf6\xdc\xad\xb2\x26\xfb\xab\xb1\xb7\x33\x61\xde\x72\x2b\xe6\xea\x21\xad\x1a\x90\x17\x0c\xfa\x59\xc9\xad\xd0\x9b\x58\x97\x7a\x69\x1d\x35\x53\xd7\x00\xaf\xd4\x78\x04\x1b\xc0\xc9\x41\xc0\xda\xad\xa9\xb2\x55\x8a\x01\xf1\x7d\x9b\xba\x91\x78\x40\xec\xf0\x10\x06\x29\xe2\xc0\x2f\x8e\x9b\x53\xa6\x8a\xb9\x9d\x79\x17\x68\x59\xc1\x46\x02\xe2\x3b\xf8\x42\x90\x62\xed\x6f\x32\x42\x01\x3f\x53\x7d\x18\x38\x1b\x70\xc1\xec\xf1\x5b\x66\xd8\x53\x99\x56\xcb\xac\xa9\x28\x64\xec\x11\x81\x4a\x88\x2c\xe1\xf2\xed\xd2\x83\x1d\x20\x56\x9a\xd5\xd4\x7c\xef\xbf\x86\xf1\x7b\xe8\xb4\xf6\x3f\x6c\xa5\x82\xb3\x5a\x0f\xdc\x11\x81\x81\x59\xb7\x0d\xa4\x3c\x2b\xf4\x3c\x2d\x9a\x54\x0f\xf3\xb4\x4a\xf5\xb0\xdc\x43\xa1\x82\x97\xb7\x48\xa4\xdc\xd3\x7d\xbd\xcb\x56\xd8\xeb\xfa\xe7\xc1\xf5\xfc\xe7\xa4\x58\x5f\xe1\xca\x7c\x50\x1c\xf2\xc7\xcc\x5d\xc3\xa5\x1b\x2f\x8d\xe4\x07\x61\x82\x3e\x11\x4c\xd0\x10\xc1\x81\xe8\xa7\x93\x12\x1a\x70\x0a\xaa\x90\xc0\x70\x95\x18\x3b\xaa\x1f\xc4\xfb\xc1\x66\xe4\x1f\x98\x6f\xef\x36\xa8\x76\x99\x37\xb1\x00\x76\x9a\x66\x02\x3a\x0a\x80\x16\xa2\x6d\x43\x56\x6d\x66\x58\x56\x69\xd3\x94\x55\x61\x0e\xb5\xde\x18\x62\x87\x61\x46\x41\x2c\x34\x48\xc3\x7e\xa0\xe6\x39\xf8\x26\x55\x16\xe8\xd1\xa7\xab\xc6\x93\xdf\x75\xc1\x9c\x34\x83\x39\x85\xe4\xf5\xa8\x00\xcc\x1a\x1a\x35\x14\x80\x49\x05\xe9\x1f\x3c\xda\x4e\x77\xf8\x9c\x7b\x5a\xdc\xef\xd3\x7b\x2c\x58\xf6\x9d\xc7\x0e\xb5\xcb\x43\x5f\x51\x97\x3d\xe6\x3e\x2b\x2c\x89\xf4\x11\x05\x41\x83\xd3\x06\xe7\xb8\xb8\x8c\xc1\x07\x9d\x4e\x9c\x75\x65\x4d\x22\xc4\x05\x55\x8a\xf2\x33\x59\x01\xe9\xc4\x9a\x0b\xb9\x0a\x26\x8c\x15\xed\x86\x69\x0d\x1e\x12\xc3\x0b\x78\x47\xca\x37\xb3\xbc\x89\xf4\xb1\xaa\xfe\x16\x13\xe5\xf1\x5a\xea\x72\x0f\xcd\x77\xc8\xe4\x2c\xea\x72\xcb\x4d\x0f\x23\xa0\x0b\x82\x06\x1c\xdf\x18\x87\x45\x94\x8a\x5d\x66\x3a\x45\x5e\xa2\x05\xc5\xb7\x6b\x60\xd6\x14\x44\x1d\x13\x74\x5c\xf0\x89\x01\x25\x1c\x8a\x55\x24\xd8\x66\x41\x40\x76\x56\xec\x70\xad\x5c\x6d\xdc\x26\x5d\x01\x82\x37\x2e\x05\x67\xf2\x11\x92\x05\x12\x67\x2d\xe4\x38\x15\xf6\x64\xbb\x85\xa3\x22\x2e\xa8\xe3\x36\xff\xba\xcf\x30\x99\x0e\x3d\x8d\xb4\xb5\xaf\x63\x3d\xb8\x42\x68\xec\xc1\x98\xa1\x56\xbd\x75\x4a\x66\xab\xf5\x69\xc0\x42\x1c\x4e\xe7\xfa\xe6\xf6\xe3\x78\x34\xf4\xb1\xf4\x36\x91\x53\xe7\x12\x0d\x09\xc8\x5c\xea\xce\x07\xf8\xed\xe2\xb8\x60\xbe\x7a\xb6\xa3\x3c\xf0\xea\x0f\x32\xd0\xc9\x4f\xf3\x17\x0f\x14\x11\x2a\xa8\x2f\x4a\x7d\x04\x38\xef\xa4\x53\x80\xa5\xb3\xbc\x2f\xf5\xb9\x0e\x4c\x1d\x57\xab\x02\x5e\xb5\xa7\x2c\xac\x25\x11\xa4\xc3\xfe\xe7\xc7\x45\x41\xe0\xd0\x3e\x37\xc2\xee\x77\xfa\x2b\x35\xc0\x80\x08\x20\x67\x00\x16\xdd\x04\x89\x55\x15\x04\x0b\x45\x5d\x41\x4f\x6e\x44\xe4\xff\xc8\x1c\xc8\xd3\x83\x1c\x04\x5c\x0b\x30\x04\x7c\x9f\x75\xdf\x3d\xd2\x46\xa7\xec\xa9\xbf\x72\x87\x5c\x7d\x2c\xf2\x15\x04\xf2\xbe\xae\x22\x56\x6a\x24\xd3\x8a\x43\x3c\xdf\x57\x7b\x8a\xac\xa3\x66\xb2\x17\xf5\xd4\x57\x15\x9e\xb7\xe8\xde\x18\x8b\x40\x7d\xc1\xa0\x3b\x93\x3a\xad\xfc\xd7\xf3\x03\x4a\x8c\x2b\x6d\xf7\x3d\xc7\x20\x0e\xad\x42\x35\x15\x9e\x72\x99\xe6\xf1\x69\x0a\x2b\xa2\xf7\x40\xf2\x87\xf6\x7e\xfb\x99\x59\xd1\x4e\x0e\xf0\x55\xb3\x34\x80\xbd\xc1\x0b\x12\x1e\xc4\x63\x0f\x0b\xea\xee\xb0\xbd\x39\x90\x8b\xce\x57\xb0\x1e\xd6\x8b\x76\xc8\xc9\xd5\x02\x44\x52\x5d\xed\x16\xeb\xe4\x2f\xe0\x62\xea\x81\x52\x27\x8b\x0e\x05\x79\x56\x63\x8e\x1a\xf8\x0e\xc3\x1c\xe0\x33\x08\x0e\x8a\x5b\x7b\x2f\xe2\x0b\x7d\xda\x78\x66\x30\x73\x72\xf6\xc1\x25\x2b\xec\x09\xc2\xd3\xc2\x6f\x31\xfe\xc6\x70\x85\x66\xbe\xc0\xc6\x0d\x99\x85\x1e\x0b\xe0\x83\xe6\x51\x9f\x11\x4a\x1b\x4d\x6d\x48\x4f\x4f\x4f\x71\x65\xd6\x0f\x69\x03\xfd\x47\x4a\xcd\x9d\x5b\xe7\x9b\x5f\x85\x25\x25\xf9\x02\xc5\x07\x50\x5b\x72\x44\x1b\xfb\xbf\x55\x3b\xa2\xad\x83\x88\x36\x9d\x26\x26\x4f\xc5\x4e\xd4\x3c\xb3\x97\xf9\xdc\x04\x7c\xb1\x76\xb3\x21\xef\xe5\x08\x39\xdc\xfd\x8d\xae\x86\x00\x72\x09\xc9\x83\xeb\xee\xc8\x63\x74\xb0\x43\xe0\x01\x6b\x54\xd8\x9d\x3a\xd7\xc9\x76\x69\xd6\x98\x8e\x2d\x36\xd9\xfd\x1e\x98\xb4\xf5\x74\x67\x2a\x34\x06\xe7\x87\xda\x3a\xdf\xbe\x8b\xd7\x7a\xb0\x06\xae\xbd\xd7\xaf\x22\xeb\x6f\xfe\xe9\x18\x40\x46\x2f\x2a\x54\x56\xbb\x8c\x9c\xba\xe1\x3e\x6f\xd1\x89\xef\xd4\x6d\x25\x79\x80\x4f\x87\x67\xf0\x2a\x78\xe1\xaf\xc0\xef\xf3\x4a\x3b\x55\x0a\x84\x3e\x83\x3c\x67\x32\xfa\x19\xf3\xf9\x9c\x28\xc5\x12\xfd\x51\xa9\x1b\x01\x55\xe5\x9c\x79\xc3\xf3\xe7\x8b\x89\x59\x7c\x5e\x58\x22\xd5\x5d\xa2\x54\x72\xa7\x6d\x7c\xe2\xf1\x85\x69\xaa\xdf\x33\x4d\xd7\x4e\xd7\x92\xe3\x33\x08\x06\xab\xf6\x02\x28\x88\xe6\xcf\xa7\x9f\x16\xdf\x06\xb3\x04\x59\x3b\x30\x57\x73\x75\x3b\xb4\x82\x0a\x28\xed\x10\x81\x97\x3c\x1b\x7c\x93\x33\x54\x3c\x65\x61\x94\xcf\xc1\x88\x1c\x4b\xf4\x12\x31\x04\x12\x85\xb4\xbf\xa6\xa6\x9f\xda\x8c\x10\xf0\xbe\x97\x48\x21\x00\x48\xdb\x13\x58\xc4\x7a\x34\x51\x93\xa9\x96\xac\x0e\xf6\x85\x98\x21\xd0\xbf\x93\x9a\x41\x39\x6a\x06\x4f\xc8\x70\x3c\x5a\xfa\x02\x21\x83\x3a\x4a\xc8\xa0\x5f\x22\x64\xe8\xf0\x30\xa8\xa3\x3c\x0c\xba\xc5\xc3\x60\xd7\xf0\x38\x05\x83\x0b\x82\xab\xd1\x44\x84\xba\x11\x01\x5d\x7e\x6c\xda\x09\x93\xcb\x40\xa5\x0c\x8d\x9f\xa9\x1e\x5a\x07\xab\x06\x19\x2c\x1d\xd3\x38\x20\x78\x2c\x89\xc7\xd8\x1d\xd4\x33\xec\x0e\xc7\x38\xef\xe2\x9f\x93\x7d\x55\xd6\x87\xed\xff\x31\xfe\xb7\x57\x97\x6f\x5f\xbd\xed\xe0\xbf\xfe\x72\xf9\x0f\xfc\xd7\xbf\xc7\x9f\x90\xff\xcd\x2a\xce\xf3\xcb\x57\xaf\x2e\xf5\x17\x53\x54\xd9\x77\x7b\x37\x61\x5b\x9e\xc2\xc0\xdd\xca\xb5\x62\xe8\x4b\xa5\x28\x6e\x29\xf1\xd7\x5c\xbd\xfb\x4f\x69\x7d\x9e\xd5\x3f\x79\xfe\x4a\x6e\x0f\xe1\x4a\x94\xef\x59\xb1\x8e\xc4\x85\xae\xdc\x85\x3e\x2a\x74\x51\x82\xb5\x46\x5d\x92\x18\x94\x69\x1e\x4a\x26\xf1\x6a\xf3\x32\x71\x98\x27\xcf\xe0\x76\xe1\xca\xea\x96\x37\xeb\x6b\x0e\xf6\x82\x62\x8a\x47\x1f\x2b\x75\xd3\x5b\xe6\x87\xa8\x29\x84\x8d\xe0\xac\x2c\x37\x69\x7e\x19\x21\xa4\x89\x58\x89\x12\xb1\x72\x11\xe6\xa8\x5d\x8d\x1d\x16\xe3\x67\x0d\x05\x4d\x84\x55\x9b\x59\x97\xcd\x98\xfc\xe0\xb0\x7f\xb8\xf6\xd4\x93\xce\x49\x46\x2e\x64\xba\x5f\x88\x2e\xe0\xd6\xec\x30\xb9\x48\xb5\x8f\xdb\xac\x76\x31\x66\xb3\xfe\xe0\x2b\x51\xec\xef\xa1\x87\x15\x7d\x10\xfb\xf3\xa7\xaa\x6c\x64\x7f\x71\x9a\xfb\x15\xe3\x5a\x9b\xee\xa2\x60\xd3\x1b\x1a\x03\x11\x40\x71\x84\xe4\x5c\x54\x8b\xc1\xe6\x42\xe8\x20\xb9\xce\xb4\x74\xb7\xab\x0c\xa2\x2a\x02\xe4\x92\x1e\xe4\x18\x35\xa5\x16\x5e\x57\x28\xc6\x45\xa7\xbb\x3c\xcd\x8a\xfc\x00\x4e\x18\x42\x83\x5a\x5b\x9f\xaa\xe9\xfc\x02\xa8\x70\x01\x34\x14\x76\x71\x0f\x6f\x77\x9a\x4a\xbd\x16\x0d\x60\x6c\x6b\x8b\xb2\x68\xa4\xa9\xa3\x7f\x3c\x2b\xa8\xd4\x8f\xdd\x79\x07\x4a\xd1\xfa\xd1\x54\x0d\xe1\x8d\x57\xc4\x78\x9a\x21\x76\x1d\x57\xe4\x4b\xe7\x27\x2b\x0b\xd5\x66\x9f\x8b\x3c\xf1\x1c\x30\x07\x04\xf4\x73\x6f\x7c\x75\x14\xf4\xdc\xb7\x36\xad\x23\x85\xd6\x3b\xaa\x45\x25\x77\xd6\x50\x71\x2c\xe1\x35\x1e\x82\xaa\xf6\x76\x6f\x35\xaf\x07\xed\x59\xbb\xee\x8a\x5f\xab\x5a\x35\x85\x6f\x89\xab\x80\x3b\x90\xc8\xbd\x81\xec\xc3\xb6\x7c\x24\xe0\x48\x7a\x28\xf1\xc5\x1f\xf8\xc5\x72\x6d\x02\xaa\x86\x15\x68\xa7\x76\xc1\xff\x18\x31\xe9\xf5\x67\x53\x6d\xd3\xe2\x00\x2d\x68\x18\x31\x17\x2c\xe2\x4d\x93\x9b\xb5\x5a\x1e\xf4\x3c\x4d\xab\x65\xb5\x37\xab\xef\xa6\xd0\x43\xbb\x31\x10\xa6\xfd\x7f\x35\x9f\x6c\xfc\xf3\x30\x19\x8e\xc6\xe3\xff\x83\xf8\xef\x97\xaf\x2e\xdf\xb5\xef\xff\x57\xef\xfe\x71\xff\xff\x5d\xfe\x40\x25\x97\x73\x71\x30\xe0\x08\x54\x52\x8e\x1a\x65\x68\xac\x7c\x50\x9b\x38\x1d\x29\x9f\xdc\x80\xac\x97\xbd\xaa\xbc\x1a\xf1\x65\xd3\x18\x5f\xc2\x90\x2d\xb7\x27\x09\x2a\x13\xc5\xec\x25\x99\x75\xc5\x49\x6d\xca\x7a\x4b\x40\xc0\x31\xed\x56\x39\x8c\x09\x3e\x95\x80\xfa\x62\xd5\x5c\xb1\xca\x76\xb9\xa9\xd5\xfd\x3e\x73\xe9\x3d\x88\xbe\x67\xc5\xfd\x7b\xa5\xce\xf5\x26\xab\x6a\x88\x5a\x73\xe2\xaf\xac\xb6\x80\x8f\x6a\x9f\xf6\xa9\x32\xc5\xea\x01\xf3\x87\xcb\xb2\x81\x1e\x6a\x24\xa2\xa8\x29\xfa\x0f\xa4\x13\x4d\x59\x35\x4c\xe2\xde\x97\x10\x83\xef\x3b\x60\x08\x7b\x69\xae\x7c\x4f\x49\x46\xb8\x53\xc8\xc3\x8d\x33\x75\x68\x38\xfe\x6e\xd0\x66\x55\x16\xe5\x36\x5b\x71\x7c\xc2\xaa\x2b\x79\x0f\x9d\xeb\xda\x7e\x64\x6d\xe7\xd2\xb7\x2a\x7e\x31\x5c\x76\x64\xdd\x6a\xaa\x0d\xf6\xea\xbd\x4a\x81\x90\x13\xbb\x76\x9c\xea\xae\x23\x8c\x15\x5a\x3b\x6e\x5f\x9b\xea\x1c\x87\x43\xc1\x10\x6f\x81\x2c\xcb\x75\x66\x30\xb8\x1a\xdc\x7c\x2d\x9e\x0c\x92\xa0\xd3\xa1\xd1\xef\xf5\x30\x19\x44\x7a\xa8\xdf\xab\xe1\x64\x66\xbd\x5f\xfd\x5e\x8f\x26\xb3\xd1\x20\xd2\xe3\xb1\x7e\xaf\xc7\xe5\x7d\xb6\xca\x4c\xae\xc7\xd9\xb2\x32\x67\xef\xe1\x4a\x50\xc0\xc5\x9f\xd5\x75\x5a\x65\x69\xa3\xff\xd7\xff\xad\xf3\x9f\x92\xc2\x54\xf7\x99\xd1\x83\xa6\xdc\x66\xff\xba\x37\xfa\x1c\x1f\x9d\x32\x53\x78\x0d\xcd\x27\x78\x27\x36\x66\xf5\x50\x64\x2b\xcc\x4a\xaa\xac\x58\xef\xed\xa2\xa4\xb9\x36\x75\x93\x42\xb9\xb3\x15\x66\x00\xc4\x64\x01\xa2\xa5\xb4\x5b\x9c\xa7\x48\x59\xee\xb2\xb4\x69\xa3\x5f\x5f\x9c\xbf\x7e\xad\xaa\xbd\xd1\x6b\x2b\x22\xfa\xd3\xff\xfa\x9f\xeb\xff\xf5\x3f\x39\xc5\xf9\xcb\xdb\x5f\xde\x5e\x5a\xf7\x7b\x34\xd7\x2b\xb3\x36\xbf\xe9\x8b\xb7\x91\xfe\x54\xd9\xdd\x8a\x79\x4a\xa6\x68\x2a\x43\x59\xae\x34\xa7\xe7\xcc\xcc\xea\xc1\x54\xab\x07\xa3\xe7\x3c\x7e\x9a\x1c\x2c\x57\xcf\xec\x60\x4a\x30\xc1\x32\xb7\x8b\xf7\x6f\x9a\x95\xae\xf6\x46\x5d\x67\xab\x07\x93\x9f\x0f\xac\x85\xf0\xcb\xdb\x5f\x7e\x7d\xa3\x6f\xac\x05\xcd\x33\x79\xd7\x9e\xc9\x88\x38\x58\x83\xb9\xf8\x89\x98\x42\x8f\x18\x91\xc2\xce\xc5\x34\xf6\x47\x03\x2a\x00\xc4\xd9\xa1\x08\xa8\x23\xd3\xd3\xbf\x7b\x7a\xaa\x77\x7a\x57\xa5\x55\x19\xb0\x65\x5f\xcb\x7c\xbf\x32\xe9\x3e\xd2\xb3\x72\xf5\xaf\x7b\x53\x40\x0e\x33\xd2\x1f\x6f\xf4\xc5\xab\xb7\x91\xfe\xe5\x4f\x17\x6f\x5f\xeb\xb1\xd1\xc3\x07\x53\x17\xe9\x41\xc1\xe4\x79\xc6\x5a\xeb\x9b\x59\x32\xb8\xfe\x38\x4e\xf0\x4c\x90\xf1\xef\x44\xff\x93\x3d\x65\x2e\x38\x3a\x76\x5d\x14\x81\xe2\x6c\x4a\x4a\x7b\xec\xa1\xb0\xa4\x79\x30\xaa\x5d\x44\xdf\x31\xc9\x82\xf0\x5b\xa7\xb8\x3c\x17\x68\x7f\x59\x81\x24\xd5\x55\xba\x35\x90\xd6\x42\x18\xf1\x93\x72\x67\x98\x47\xfb\x24\xd4\x0e\xdb\x72\x6d\x72\x3a\xe4\x02\xf4\xda\x31\xc8\x70\x97\x70\xed\xf9\xae\xd3\x5c\xef\x77\x65\xa1\x57\x68\xa1\x06\x68\x0e\x9b\xb2\x52\x38\xb3\xba\x84\xea\x23\xa7\xd0\x29\xb3\x6a\x8d\xc0\x26\x6d\xf6\x35\x02\x60\x52\xb3\x0a\xe2\x4f\xb8\x82\xff\x2a\xe0\xae\x56\x25\x06\x0e\x11\x70\x72\x00\x25\x17\xe5\x1e\x92\x5f\x69\xe5\xe2\xe9\x5e\xa9\xb5\x6d\x52\x58\x4f\x97\x60\xb2\xf6\x39\xe3\xa1\xaa\xce\x52\xb3\xff\x47\xb6\xa2\x03\x63\xc5\x39\x51\x4d\x28\x3a\xbb\x50\x0e\x83\x69\x43\x4e\xa7\x38\x04\x08\x77\x29\xf0\xb6\xfd\xc4\x97\x5d\x24\xd4\x3f\x5b\xcb\xad\x1b\x20\xc2\xd3\x0d\xb4\x0a\x30\x29\x0f\x0b\x0b\x9a\xd6\xbe\x17\xb2\x6f\x9c\xc4\x71\xcd\xc4\x90\x2a\xc2\x45\xa6\x4a\x96\x88\x3a\x3e\x97\x50\xfd\xe4\x16\xcb\x4e\xe7\x27\x68\x0c\x23\x8e\x24\x97\xf7\xae\xb2\xfa\x7b\x2d\x91\xed\x61\x86\x79\x99\xae\x21\x35\xbc\xc7\x0c\x31\x2e\x1f\x56\x90\x40\x0b\x0f\x71\x81\x90\x17\xc3\xbd\xc2\x8e\x07\x8d\xcd\x7e\x5a\x56\xc0\x22\xc1\x8e\x1d\x7b\x82\xb1\x16\xd6\xae\x46\x70\x84\x22\x8f\xdc\xbb\x35\xa9\xbf\x55\x41\x16\xb7\x04\x57\xb3\x46\xd8\xb5\x22\xdb\x01\x40\x50\xe4\x3b\xe7\xa1\x63\x06\x60\x8a\x36\x25\xf0\xb3\x23\x4b\x80\x7b\x06\x73\xd8\x53\x23\x14\xc5\xe0\xf1\x8a\x36\xbf\xed\x4c\x95\x19\x60\x8b\xde\x55\xe5\x06\x41\xe8\xd3\xbc\x76\x8a\xa7\x38\x5f\x9b\x1d\xb0\x72\x50\xb1\x9b\x43\x18\x8a\xb9\x66\xac\x32\xca\xbf\x1e\x95\x4d\x7a\x8f\xb1\x05\xbb\x9e\xa4\xe4\x6a\x46\x8c\x70\x82\x52\x43\x42\x19\xf3\x7d\xde\x2e\x51\x58\x37\x1c\x60\x59\x40\xa6\xc7\xb1\xd0\x03\x6c\xac\x5b\x72\xb3\xda\x57\x84\x57\x89\xdf\xac\x21\xe8\xce\xe8\xe3\x6a\x9d\x36\x29\x15\x82\xe1\x09\x85\x01\x45\x88\xc2\xe2\xd8\x5f\x22\x8e\x7f\x40\x36\x1d\xce\x21\xa1\x2b\xe2\x5b\xd2\x2d\x94\x42\xf0\x10\xca\x8d\x7b\x31\x79\x74\x5e\xf9\x11\x62\x2a\x86\x38\x7c\x3b\x39\xae\x83\x6b\x40\x8a\x94\x3b\x60\x1e\x6a\x87\x3c\x3f\xb1\xb9\x45\xa9\x07\x55\x93\xad\x72\x32\x45\x28\x55\x94\x42\xd6\x01\x24\x10\xdc\x46\x05\xeb\x5f\x95\xdb\xb8\x63\xc4\x42\x53\x15\x17\x67\x80\x5f\x8f\x2e\x6f\xe0\x9d\xfb\xce\xca\xe0\xc4\xaa\xb6\xcd\xb6\x36\x2b\x2c\x1f\x29\x7d\x97\xaa\xd1\x4e\x6f\x69\x82\xe5\x65\xc8\x1f\x51\x77\x06\xf7\x0a\x4d\x45\x5f\xe8\xf3\x90\x74\xe9\x13\x19\x74\x1d\x24\x7e\x37\x0f\xc0\x4e\x2a\x5a\x51\x22\x0a\xb0\x51\x67\xff\x76\x6b\x5c\x22\x30\xd5\xab\x74\x97\x35\x69\xae\x73\xd3\x34\x06\xd5\xd1\x81\x3c\x5f\x50\x2a\xe1\x93\xec\xa9\x41\x8b\x1a\xf1\xe3\x94\x72\x6f\x7e\x2f\xb9\x64\x7a\x6e\xbb\xc8\x71\xaa\xcb\x60\x42\x2d\xf4\x3c\x83\x42\xd4\xb1\x7f\x3c\x9f\x83\xf7\x82\xd6\x43\x46\x98\xec\x13\xa6\x98\x48\x65\x70\x41\xab\x7f\x3a\x70\xa9\x56\x96\x15\x95\xcc\xb8\x82\x41\x74\x06\xc2\x6a\x54\x7d\x92\xda\xbb\xe8\x24\xe0\x2f\x71\x6b\x4a\x29\x41\xa3\x10\x57\x15\xc7\xe3\xa6\x28\xc6\xcd\xc9\xbc\xbe\xf1\xcf\x5b\xe3\x97\x83\xa5\xf1\x8b\x29\x29\x37\x7e\xfd\x6f\x1b\x7f\x06\x0c\xff\x32\x07\xcb\xfe\x01\xf8\x46\xf8\xc9\x36\xe8\x0c\xd1\xfa\x89\x03\x7d\x6c\xc6\xd7\xdc\x5c\xf7\xec\x94\x25\xcd\x60\x50\x40\xe9\x0a\x98\x5c\x1b\x34\xed\xbf\x5b\x1b\x7e\x5e\x4a\xd1\x60\xa1\x22\xb3\x02\x51\xb3\x5c\xbf\x3d\x81\xb0\xe9\x1c\x08\x95\x1c\xb0\x25\x19\x05\xa0\xed\xa9\x92\xc0\xd9\x25\xa2\x65\x71\xee\xbd\x2d\x1e\x87\xd8\x10\x39\xaf\x25\xb6\xad\x03\xb3\x0b\x47\xf4\x9a\x20\xcc\x2c\x59\x5d\x48\x5b\x84\x54\x55\xfc\x86\x2f\xa0\x51\xe4\xc3\x9f\xb5\x0a\xd0\x2f\x94\x3d\x70\x3d\xa3\xc6\xff\xb3\xd0\x9e\xd6\x67\xf8\xf8\xd3\xfa\x2c\xdc\x15\x7b\x01\xdb\x1f\xd2\x6d\xe6\x40\x83\x8f\xed\x35\xfe\x5f\xd4\x9c\xb9\xbd\x71\x2f\xe3\x67\x61\xf1\xd6\x0f\xec\xf4\x98\x2c\x1a\xb9\x02\xb8\x26\x11\xb7\x33\xb2\xe2\x00\xdd\x1e\xf2\xb5\x48\xb6\x96\x08\x23\xd7\x92\x62\x23\x9c\xad\x93\xf1\xbe\xb9\xc9\xe1\xd5\x38\x18\xf9\xf2\x6d\x88\x4b\xbf\x2a\x2b\xe2\x2d\xa9\x23\x24\x36\xcb\x5d\x80\x7f\x9d\xee\xa8\xa8\x40\x89\xce\x66\x89\x6f\x99\x41\x3d\x31\xd5\xc4\xac\xb1\xfc\x25\x18\x2a\x10\x6b\xba\x77\x4b\x60\x7a\x17\x3a\x98\xdb\x77\xac\xf4\x35\x52\x13\x85\x07\x72\x9f\xfb\x53\x03\x85\xe8\x8e\x2a\xa8\x26\x99\x0d\x60\x4d\xb3\xaa\x15\x85\xb7\xeb\x18\xe9\xd2\x5e\x17\x28\xc7\x98\xe6\x37\x21\xb8\x56\x44\x08\xf5\x35\x80\x7e\x21\x4a\x21\x9c\x8a\xd6\x4c\xad\x51\x6f\xaa\xc7\x6c\x85\x95\x74\x4b\x47\x19\x47\x28\x52\x82\x93\x0b\x2b\xe8\x05\x5c\xcf\x91\x63\x79\x75\x28\xd2\xad\x9b\xfd\x7b\xc1\x51\xe6\xb7\x6b\x6f\x15\xa5\xa8\x1c\x68\x42\x18\x7f\x34\x2b\x15\x60\x26\xae\xcd\xce\x14\x6b\x02\xa5\x90\xaf\x8c\x44\x23\x6e\x56\xd3\x53\x9d\x55\xef\xb6\x0b\x95\xba\x6a\x9e\x4a\x51\x58\xd7\x5a\x2d\x32\x3a\xa1\xf2\x72\x0f\x4d\x5e\xcc\x38\x6b\x57\x00\x12\x61\xf5\x2e\x5d\x19\xa2\x43\x80\x96\xeb\x55\x9a\x3b\x4b\x8e\xf8\x99\xe8\x46\x3a\xf0\x83\xa4\xce\x94\x12\xf1\x87\xd6\x84\xd5\x7e\x01\xe5\x8f\xaa\x4f\x2a\x11\xe4\x6c\x65\x35\xec\x77\x36\xcc\xbf\xe3\x49\xcb\x2a\x5d\xa2\xba\x84\x40\x12\x16\x26\xba\xa5\x8d\xd1\xf2\x3a\xb6\x84\x0e\xbf\x82\x2d\x7b\x1a\x44\xa4\x91\xb9\x0c\x38\xf2\x50\x5e\x08\x71\x47\xf9\x05\xee\xa8\xa8\x1b\x2c\xdc\xa4\x63\x0c\xa1\x3d\x79\x8d\xbb\xd7\xb3\xf2\xc1\x07\x2c\xc0\xd5\x95\x56\x13\x19\xab\xc8\x1a\x59\x22\xe2\x95\x7d\x3b\xb4\xfb\xc3\x85\x93\xef\xab\x34\x87\x0d\x0e\x6d\xb8\x4b\x7d\xce\x85\x17\x3d\x61\x02\xd3\x89\x06\x10\xd9\x83\x1c\x94\x0f\x12\x84\x26\x88\xee\x21\xc6\x89\x1c\xbb\xa2\x03\x98\x06\xa6\x91\xa7\x6c\x1d\x54\x47\x05\x8b\xae\xd2\x16\x98\x17\x0f\xfe\x2d\xf5\xac\x60\x15\x33\x7f\xed\xe9\xa1\xcc\x8d\x23\x42\x16\x71\x4e\xca\x6c\x05\x81\xcb\x34\x5b\xb7\x0e\x2e\x3f\xfc\xb5\x3e\x07\xc2\xed\x1b\xe8\x3b\x24\x6a\x88\x85\xdc\x1d\x97\x80\xa1\xb6\xeb\xb4\xee\xbd\xa1\xfa\x2c\x15\xd5\xb1\x8c\x59\xcc\xcb\x15\x00\x6c\x15\x2b\xb7\x05\x68\xfe\xf0\x3f\xbc\xd5\xfc\x68\x9d\xaa\xf7\x4a\x9d\x66\x67\xec\xf1\x3e\xa7\x9d\xe1\x9c\x01\x9a\x58\xba\xb4\x9e\xd2\xf2\xa0\xd7\xe5\x53\xc1\xdf\xb4\x16\x01\x60\x25\x6e\xcb\xc6\x80\x22\xa4\x9b\x6d\x79\xd0\xf2\x33\x3a\xd5\xbb\x87\x43\x0d\x51\xae\xad\x59\x67\xfb\xed\x07\x3b\x84\xec\xac\x6d\xaa\x05\x82\x4c\xb1\x1a\x53\xcb\x9c\xe4\xb1\x46\x5c\x26\x32\x98\x5a\xd5\x22\x8a\xfd\x84\xad\x2e\x00\xc0\x52\x4f\x02\x18\x82\xee\x71\xbe\x51\x79\x87\x3d\xd4\x99\x0e\x2a\x09\xe3\x12\x1e\x1c\x52\xf0\x05\x08\xe2\x8d\xa6\x04\x30\x9e\xe5\x21\xf0\xb7\x31\xd4\xe2\x81\x37\x1c\x98\x5e\x19\xae\x00\xe6\x3a\xc9\xa3\x42\xf9\x80\x82\xc7\x63\xb2\xfd\x3a\xbe\x60\xe9\x5e\x96\x8f\x26\x6a\xe9\x02\xe3\xf8\x96\x7d\xda\xda\xde\x5b\x3e\x60\x80\x0d\xc5\x9e\x5d\x55\x88\xf6\x1b\x7d\xae\x93\x4f\xdc\x5f\x7e\x35\x58\x24\x50\x55\xb4\x48\x66\xd7\xac\x99\xde\x58\x69\x0f\x3f\x83\xfa\xa1\xdb\x34\xb2\x2a\xb7\x86\x3a\x81\xb3\x47\xc3\xa5\xf3\x00\x9f\x4e\x86\x3d\x0c\x87\x8f\x04\x41\xd9\x79\x1d\x77\x7c\x01\x62\x3f\x9a\xcb\x98\x86\xd7\x37\x06\xdf\x90\x0c\xad\x5c\x7a\xbd\x77\xf4\x19\xa8\x0c\xd0\xfc\xea\xaa\x04\xf5\x92\xf1\x2a\x54\x83\x57\x3a\xe7\x7a\x3e\x9c\xde\x24\x5c\xff\x34\x1b\x7d\xfe\xb2\x98\xeb\xcf\xb3\xc1\x64\x91\x5c\xe9\xf3\x1f\xfb\x83\x33\x71\x3a\x34\xe4\x60\x6a\x09\x0f\x85\x96\xd8\xa9\xc3\x82\x81\x40\x1b\x28\xae\x16\x0d\x13\x43\xf3\x76\x05\x08\xe9\x82\x3d\xe3\xf7\xb0\xce\xf4\xb4\xf1\x46\x89\x63\x46\x7b\x09\xe5\xaf\x21\xc0\x5a\xcb\xf1\x6a\x77\x11\x82\x46\x8e\x95\x9a\x7a\xde\xbb\xe0\xca\xe8\x9f\x27\x66\x7e\xca\x0d\xa3\xf5\x9a\xdf\x76\x79\x49\xc7\x8f\x67\x48\x43\x62\x64\x6a\xf2\x43\xe0\xe7\xb8\xd7\x65\x15\x70\x96\x66\xdc\x99\x53\x7b\x8c\x6a\xcf\x0e\xdc\xb1\xd9\xde\x5a\xb9\xa7\x1d\xc5\x62\x3d\xb9\x51\x06\x7b\x57\x21\x34\x9a\xfd\x15\x4f\xf9\xde\xc1\x2f\xb1\x5e\xd9\x17\x5c\xf7\x62\x20\x0d\x16\x46\xc5\xf4\x26\x33\x30\xe0\x8d\xac\xb8\x89\x98\xf3\x9e\xca\x3c\xe4\xc5\x46\x8a\xcc\xac\x85\x89\x87\xd8\x57\xd6\x50\xc5\xba\x9a\x1d\x94\x07\x80\x69\x58\xe9\xc6\x6c\x77\x65\x65\x6d\x5c\x8e\x5b\xb1\x7f\x07\xfe\x49\xb8\x40\xad\xeb\x42\xc9\xeb\x82\xa8\x05\xa4\xe8\x90\x09\x71\x19\xfb\x28\x2b\x35\x1b\xc0\xdf\xab\x7d\x51\xc0\x5f\x80\x59\xb7\xac\x3a\x97\x52\x19\xba\x2b\x70\x83\x60\xf9\x0a\x78\x47\x39\x31\x28\x94\xba\x5c\xc2\x25\x14\xe9\xba\xd9\xaf\x0f\x38\xad\xfa\x58\xa4\xca\x87\xef\x39\xf1\x02\x4b\x9d\xad\x4d\xca\x1e\xb7\x4b\x3b\xc2\x22\x12\x26\x3b\xcb\x76\xeb\x7c\x40\xbb\x54\xd6\x40\x74\xdf\xe4\x1e\xfc\x30\x34\x17\x30\x64\x88\x2a\x08\x63\x73\x9d\x40\x8c\x5e\xa5\x15\xd2\xfe\xee\x1b\xf1\x02\xf5\xfc\xda\x81\x8d\xc4\x65\x5e\xb4\x90\xd0\xdc\xe5\xe6\xdd\x12\xa9\x56\x0c\x1a\x35\x2e\xad\x27\x76\x59\xa5\x55\x75\x80\x41\xc8\x5b\x96\x45\xfe\x32\x06\x6c\x93\xc5\x18\xd3\xe9\x8b\xa9\xbe\x1e\xfc\x73\xe2\xc1\x43\x30\xba\xb7\x08\x10\x94\xd2\xef\xa1\xab\x5c\x3b\x7a\x4f\x7f\xb7\xc3\xf9\x26\xa7\xd3\x90\xc7\x69\x0d\xe5\x2a\x2d\xee\x4d\xa4\x90\xdb\xd6\x1c\x73\x5f\x75\xcb\xae\x8f\x42\x04\x0f\x44\x80\x93\x28\x9f\x98\xc1\x87\x8a\x6d\x7f\xac\x9f\x3f\xbc\xed\xf7\xcb\x19\xb5\xdf\xaf\x42\xa0\xdc\xac\x01\xfd\x94\xad\x32\xe0\x25\x70\x4a\x06\x32\x04\x08\xd1\xee\x33\xce\x9a\x85\x47\xbe\x40\xb5\xa9\x46\xe0\xef\x82\xa6\x3c\xb8\xbc\x61\xa7\xda\xe4\x65\x00\x3a\x03\x9d\x58\xd8\xa3\x8f\x9a\x0b\xf2\x2a\x1e\xf0\x2b\x12\x8b\x86\xe5\x0d\x7e\x8e\x2e\x9a\xcd\x84\x01\x9d\x4d\x54\xbc\x89\x5b\xaa\x02\x24\xf2\x74\x87\xbe\x2f\x7d\x23\xfb\x6f\x8a\xc6\x73\x9e\x34\x38\xf0\x0a\x0f\x3c\x6e\x65\xaf\x7d\xda\xd9\x63\x28\x94\x6b\x5c\x7b\x05\x26\x11\xa0\xe7\xc5\x53\x0f\xeb\x8d\x41\x9e\xa4\xf0\x02\x89\x5c\xb7\x48\xc5\xdc\x10\x3d\x4a\x0f\x35\x5d\xb9\x51\x62\x30\xff\x0f\x7b\x6f\xba\xdc\x46\xb2\xa6\x8d\xf9\x77\x5e\x45\x06\x27\xc6\x22\xc7\xc5\x12\x49\xa9\x37\xb5\x3f\x3b\x20\x12\x92\x70\x0e\x08\x70\x00\xb0\xd5\x72\x38\x62\x3a\x01\x24\xc8\x3a\x2a\x54\x62\x2a\x0b\xa4\xf0\x5d\x8d\x7f\xf8\x8f\x6f\xc3\xdf\x8d\x39\xf2\x5d\x72\xa9\x2a\x52\xea\xb3\x39\x26\xa2\x75\x22\x4e\x4b\x24\x90\x7b\xbe\xf9\xae\xcf\xb3\xab\xcd\x4a\x5b\xdb\x52\xf8\x9d\xa0\x20\xa2\xb9\xf4\x18\x25\x41\xb9\x50\x2a\xe8\x7a\xf2\x1e\x45\x53\xc7\x8c\x82\xe9\xa2\x71\x9d\x0f\xa4\x2a\xac\x56\x80\x37\x79\x97\xc0\xef\x89\x6f\x7c\x70\x25\xff\x71\x67\xc5\x3d\x65\xc3\x94\xec\xee\x5d\xc8\xa4\xe1\x6a\x96\xeb\xe9\xd5\xe8\x1d\x1d\xa0\xaf\xdd\x97\x34\xd0\x5b\xef\xf5\x53\xeb\x5a\x54\x09\x8b\x40\xea\x33\x96\x1d\x2e\x65\xd5\xe0\xf5\x48\x43\xa9\x14\x38\xd3\x56\x78\xa0\x50\x4a\x5d\xe1\x9a\xfb\x8e\x95\x0a\x0f\x16\x2e\xe2\x76\xa7\x2a\x74\xe5\xbe\x89\xd6\x05\x38\xe6\x5b\x55\x44\x41\xe3\x81\x87\xed\x49\x8b\x22\x32\x06\xcc\xa6\x6d\xae\x03\xbf\x74\x1c\x51\x15\x01\x35\xf9\x09\x1d\xd7\xca\x1f\x61\xc0\x3f\x65\x42\x70\xac\x28\xe3\x60\x15\x26\x17\xc3\xd2\x10\x6a\x43\xe2\x53\x8e\x97\x13\xf4\x81\xc8\x73\x9e\x89\xd4\x8b\xe0\x94\x44\xcb\x34\x7e\xfc\x63\x2b\xf7\xd5\x7d\x51\x61\xed\x58\x1a\x8e\x8e\xba\xd9\xec\xcb\x32\xd9\xc9\x25\x33\x55\xd1\xcb\xbe\x6d\x83\xde\xb6\x0e\x2a\xbc\xac\xd4\xba\x3b\xaa\x8d\xc9\x84\xd7\x72\x08\x3b\xd5\x98\x08\x3e\x3c\x02\xe1\x5c\x19\x34\x7c\x11\xcf\x22\xa8\x12\x01\xfb\x3b\x54\x2e\xeb\x2f\x2b\xad\x19\xc9\x96\xec\x65\x72\x35\xf8\x6f\xae\x55\xa3\xda\x77\xe4\xa2\xef\x8e\xe0\x95\x18\x5e\xf9\xcb\x22\xc4\xc7\xce\xd3\x8e\x0e\x25\xf5\xec\x9b\x91\x3d\xed\x01\xd8\x78\xee\xc0\x76\xfe\x53\xe3\x99\xa3\x62\x41\x41\x9c\x35\x6e\x18\x69\xa1\xbe\x13\xab\xad\x6b\xe1\xdf\x8d\xdf\x73\x9b\xfb\x7a\xcd\xda\x65\x8a\x7f\xe3\x45\x46\x9f\xe1\x1f\x17\xb9\xb3\xd0\xff\xe0\x1b\xdd\xd3\x9f\x70\x57\x5b\xfe\x7d\xae\xb6\xe0\xab\x2d\xff\x1e\x57\x1b\x4f\xda\xdf\x7e\xb5\x5f\xf5\x5d\xed\xab\x4f\x93\xc1\xf5\xe8\xd2\x5d\xf1\xdb\xf1\x70\xde\x77\xb1\xef\x81\x94\x8a\x5d\xff\x4a\xa6\x5e\xfc\x67\xae\x34\x19\x23\x01\xbb\x12\xc3\xf5\x70\x21\xba\x8d\x04\x9a\xe7\x4e\x65\xaa\x50\xc1\xeb\xde\x13\xab\x6e\x4f\xf4\x75\x0e\xd8\x5b\x83\x05\x57\x56\x01\xc8\xe0\xe2\xc3\x50\xbe\xbf\x19\x87\x12\xfd\x51\xe7\x3c\x26\x47\xe3\x09\x05\xa5\xb0\x29\x99\x06\x78\xcd\x05\x67\xce\xb6\xca\x84\xbb\x37\x1a\x46\xc0\x79\x49\xcd\x93\xe2\x48\xf4\x89\x23\x34\xe8\x43\x3c\x2c\x6a\x2b\xff\xea\x74\x22\x55\x84\x54\x5a\x15\x11\xdd\x27\x43\x6f\x8b\xcf\xdf\x37\xf4\xb6\x24\x15\xfd\xc3\x78\x6a\x1a\x91\x5f\xee\x7b\x48\x33\x5c\x0c\xc7\xe3\xe1\xe5\xe2\x76\x30\x96\x37\xb3\xe9\xcd\x70\xb6\xf8\xc4\xfb\x0d\x80\xc5\xd3\x5f\x00\xfe\x30\xe0\xd4\x85\x47\x6a\xe1\x83\x92\xd2\x3c\x52\x90\xf2\xdb\x03\xb3\x40\x0e\x4b\x7a\xfa\xde\x76\x40\x4c\xe3\x13\x11\x6d\x7b\x6f\xea\x73\xdf\xed\x20\x90\x45\x9f\xa3\x42\x03\x75\xb7\x4d\x97\x08\x64\x91\xd6\xcd\x3b\x53\x0a\xd2\x02\x91\x18\x09\xa2\xb3\x1e\x33\x27\xb6\x6e\x11\x7b\x3d\x4e\x0b\xb1\xee\xe0\xb4\x1c\x0a\x5d\xd0\xdf\x6a\x2d\x5a\xe2\xac\xe9\x49\x47\x86\xeb\xdb\x13\xc5\x8e\x16\x1b\xa6\xd6\x60\x80\xc9\x78\xaa\xcf\xde\xd6\xfa\x56\x54\x84\xb3\xf1\x4c\x32\x43\x16\x46\xb8\x27\x37\x40\xf2\x16\x29\x3c\x45\xe2\x75\x7e\x91\xe7\xe1\xc4\x5c\x44\x27\xa6\xc7\xa2\x7f\x0e\x3b\x29\x9c\x95\xd4\xd2\x5f\xea\xd2\x84\xc7\x14\xf3\x00\x9e\x72\xa5\x22\xc1\x5f\x71\x57\x71\x2c\x2f\x78\x8a\x4b\x7d\x57\xd8\x18\x59\x1e\xc6\xfb\x2a\x1a\x6f\x47\x58\x2f\x52\x39\x0d\xc1\x96\xa7\x45\x35\xa7\xf6\xa7\x99\x0a\xcf\x70\x3d\xc6\x51\xa1\x56\x53\xa4\x8f\x6c\x08\x85\x85\x41\x23\xee\x23\xcc\x33\x14\x8a\x78\x0a\x31\xef\x15\x13\x60\xd2\x82\x1f\x9e\xe7\xeb\x5c\xfe\x69\x3a\x9a\x50\x61\xf6\x1c\x77\xc4\x8b\xf5\xe8\xaf\xee\xa3\xed\xd0\x53\x40\x0c\x0a\x47\x0f\x1d\x81\x44\xa2\x8e\x19\x65\x19\x12\x95\x21\x99\x7e\xea\xc7\xdb\xaa\xaa\xa2\x84\xaa\xfe\x33\x40\xd0\xfb\x56\xaa\xcd\xa6\xf8\x12\x22\x1a\x7c\x68\x7f\x06\x15\x2b\x76\xc2\xe0\xba\xd1\xd7\xa8\x3f\x59\xac\xdd\x35\x84\x68\x11\xf5\x48\x17\x23\x31\x1c\x45\xc7\x11\x0b\x6b\xe0\xa6\x7e\xd1\x9a\x7a\x74\xd7\x68\xae\xfd\x00\x40\xb2\xa8\x36\x4e\x3d\x40\x3a\x94\xe7\x8f\xf9\x26\x16\x48\x94\x0c\x11\xc5\x9b\xad\x8f\x08\xa9\xcf\xba\x2f\x4f\xeb\xa1\xb0\xa7\xff\xe3\xff\x3a\x7d\x28\x2c\x71\xe4\xa9\x0d\xf0\xb9\xc5\xce\x0d\xbb\xaf\xb5\x4d\x20\x42\x30\x91\x51\x30\x8a\x1b\x64\x15\xbb\x15\xfc\xdb\xc6\x9a\x3e\x29\x3f\xc8\x53\x39\x1b\x8e\x07\x0b\x67\xcc\x50\x2d\xba\x10\x3f\xb8\x03\x75\x0b\x42\xa7\x32\x72\x55\xd4\xab\xfd\xd6\x42\x3c\xca\x06\x3b\x23\x52\xc6\x21\x67\xba\x1b\xf5\x25\xbd\x5f\x44\xb5\x0b\xd6\x16\xd8\x10\x9c\x3c\x27\x08\x75\x05\xff\xe4\xd4\x8a\x4e\x74\x37\x26\xca\x4b\x3a\x68\xb9\x30\x91\xdf\x1d\x9c\xdf\xcd\x61\xa7\x31\x79\x13\xda\xc4\x03\xd2\xeb\x26\x31\x0c\xa5\xd2\x33\xc2\x8c\x57\x8f\x40\x78\xfc\x58\x33\x7a\x65\xbc\xad\x95\x48\xd9\xa0\x99\x61\x5a\x17\x28\x64\x72\xca\x9a\xbd\x1f\xbe\x67\x71\x77\x7b\x2a\xe2\xa5\xa0\x6e\x7b\x57\xcd\x2f\x13\x6e\x03\xd0\x2d\xc5\xb4\x74\x94\xa1\x9b\xbb\x3d\xbc\xc8\xe5\x1c\x51\xd3\x21\xca\x10\x4e\x9b\x1f\x83\x8f\x50\xf7\x2c\x24\x46\x22\xbd\xed\x90\xd1\x23\xe4\x7e\x68\x1e\xab\x16\x7a\x54\x26\x55\x14\x1f\x8d\xe4\x1c\x58\x34\x4b\xed\x61\xf4\xf6\x3b\x53\x89\xa2\xb1\xba\xdc\x84\xf7\xaa\xdf\xc4\x9d\x47\x45\x9d\x2f\x13\x3e\xeb\xd8\x00\xe5\xb7\xb1\xcf\x00\x61\x3f\x2c\x0e\x05\xb3\x5a\x31\xd9\x1f\x47\x90\xcb\xb9\xbb\x4f\x7e\xe0\xde\xe1\xba\x29\xdc\x4e\x14\x14\x13\xec\x4b\x23\x84\x28\x6d\x1c\x9e\x69\x43\xe4\x01\x9b\x4a\xdf\x59\xa0\x84\x1a\xf7\xd8\x51\xed\x58\x72\x2c\xda\x61\xdc\xf4\xba\xfe\x28\x4f\x63\x08\xe4\x1f\xdd\x3d\x9d\x3f\xa7\x62\xfb\x2f\xe6\x17\x6e\x8c\x50\x96\x9c\xf4\x47\x58\xd4\x82\x68\x9a\xda\x11\x20\xd8\xee\xa8\x22\xc2\x87\x07\x5a\x1a\x6f\xe7\x24\xb9\xf9\x23\x97\xb0\x53\x00\x75\x65\x53\xbe\x54\x94\xc2\xb2\x34\xd6\x02\xcf\x0e\xda\xa4\x2d\x1a\x30\xb9\x51\xfb\xb2\x11\x3e\xa4\x17\x82\x52\x3c\xfc\x2c\xd6\x34\x83\x71\xaa\x9d\xd8\xa1\x14\x89\xc2\x99\x43\x3f\xa6\xcf\x04\x98\xf0\x11\x69\x59\x40\x90\xa2\x45\x5c\x99\xed\xb6\x68\x30\x2d\x1d\x52\x00\x03\x58\x92\xe8\x2b\x85\x09\xa4\xc1\x54\xe8\xeb\x79\xd0\xe2\x39\x65\x29\x57\xf4\x1b\x48\xcd\x30\x1b\x5c\x05\x20\xd6\x89\x96\xf4\x85\xd3\x15\x1b\xe5\x77\xc3\x9d\x46\xb7\x59\x7b\x74\x0a\xf3\x7e\xb5\x36\x28\xc3\x5c\x0b\x5a\x5e\xa4\xea\xa5\xfc\x64\xd7\x40\xe8\xa9\xe3\xc9\x03\x8d\x1e\xaa\xad\xa1\xd0\xa9\x5a\xc5\x46\x5c\x9a\xc9\x16\xe2\xce\x3e\xa0\x55\x22\x76\x2b\xd4\x52\xc6\x25\x06\x58\x62\x21\x92\xc0\x18\xe2\x91\xc5\x1f\xf2\x09\xe1\x00\x4d\x59\xb8\x19\x3c\x39\x6e\xf1\xd5\x71\xe3\x4e\x53\xee\x54\xa4\x0a\x11\x44\x1e\x93\x9c\x9a\x1a\x1c\x4d\x3b\xbd\xda\x57\x85\xaa\x41\x3a\xfa\x52\x2b\xe8\xf0\xb8\xc8\x75\x8e\x7f\x75\x66\xbb\x6a\x54\xe6\xff\xe5\xc6\x5f\x34\x36\xe3\xa0\x5b\x75\x27\xdc\xaf\xc2\x07\x56\x7b\xdb\x98\xad\xc6\x32\x7a\xa8\x07\x85\x0f\xef\x4c\xdd\xec\x81\x4f\x74\x65\x6c\x93\x31\x66\x69\xb3\xaf\x97\x20\xe0\x9b\x00\xa5\x2a\x94\xd3\x83\x21\xf9\xf0\xa4\x95\x43\x8a\x09\x0b\x10\x85\xd0\xee\xc4\x63\x0e\x71\xd1\x80\x5c\x89\x21\x1c\x7d\xba\x15\x24\xbd\x45\x88\x61\x2c\xb1\x38\x94\xd9\xe8\xbe\x25\x4f\xcf\x35\xbf\xe7\x2d\xc3\x29\x09\x8c\xc6\x77\x9d\x93\x88\xd3\xf4\x34\x16\x49\x3f\xc9\xd3\x88\x4e\xe2\xa7\x8e\x0e\x1b\x27\xae\x04\xfb\x1d\xb3\x9f\x1a\x69\x8b\x66\xdf\x8e\x75\x46\x35\x77\xc2\xd7\xdc\xc1\x0b\xea\x5a\x3a\x05\x56\xd1\xbe\xb4\x78\x7f\x30\x1f\x55\x9a\x61\xbe\x46\x7d\x55\x50\x56\x1b\x1c\x17\xa6\x9a\xdb\x13\xe0\xfe\x52\x43\xe0\x99\x2a\x3f\x1e\x74\x0d\x0f\x54\x26\x2b\x13\x52\xce\x10\xa7\x01\xe4\x51\x1c\x45\x02\xf1\xc6\x8d\xac\x75\x03\x46\x2e\x80\x87\xa4\x45\x4f\x2d\xb1\xe0\xeb\x9c\x84\x4f\x2b\x5a\xd7\xea\xd1\x3b\x97\xdb\x45\x4f\xf2\x9b\x8a\x9e\x44\x54\xf4\x84\x85\x64\x69\xd5\x53\x88\x48\xf9\xfc\xcf\xb8\xe4\x28\xca\x79\xc2\x92\xb9\xb6\x77\x39\x42\x60\x4e\x01\x3b\x61\xc9\x30\xc2\xdd\x1b\xf1\x03\xee\x18\xcc\x52\x68\x95\x13\x6d\x88\x55\x3f\xae\x22\xa2\xa2\x82\xbd\xe6\x44\xfa\x9d\x0e\xa4\xfc\xae\x13\xc1\x79\x2d\xa0\x5e\x7b\x9e\x5b\xaf\x26\x00\x80\x88\x72\x52\x05\xb1\x57\x40\x13\xc7\xd8\xe2\x4e\xd7\x16\xde\xd5\xda\xab\xdd\xb9\x3b\xb9\xad\xb7\x85\x93\x75\x02\x08\x36\x08\xfe\x3b\x63\x80\xfa\xa1\xb9\x7f\x2a\x0c\x2f\x08\x42\x92\xf4\xeb\x34\xa3\xc5\xaf\xff\x71\x48\x7a\x4e\x9e\x93\xf8\x3b\x16\x99\x7f\xfb\xd2\x21\xcd\xa6\x9b\xbe\x74\x02\xd3\x78\xf5\x4d\x17\x30\x75\xf3\x00\x7d\xdb\xda\x57\x6d\x24\xc9\x5b\xa6\xf6\xc8\x39\x9d\xf4\xf7\x08\x05\xaf\x51\xab\xa2\x89\xb4\xc7\x88\xa0\x09\x52\x9b\x7d\xf4\x60\x83\x0c\x38\x5e\x7e\xe4\x17\x58\x57\x52\xa4\xc1\xec\x9e\x3e\xb9\x71\x81\x49\x20\x45\x63\x29\x6c\x2c\x1f\x54\xb9\xa7\x42\x14\x28\xf5\xd2\xd0\x5e\x65\x88\x90\xc9\x44\x70\xab\x98\x26\x98\x0b\x31\xa7\xc4\x41\xaa\x28\x8b\x77\xde\x83\x81\x52\x8f\xfd\xcb\x06\x4e\x02\x4c\xa8\x0c\x63\xd4\x75\xcd\xd9\xdc\xe1\x30\x72\x8d\x1a\x71\x6d\x01\x77\x71\xfb\x33\x4b\xac\xd2\x50\x8d\xbb\x51\x1d\x80\x44\x27\x30\x9c\xbe\xee\xae\xc8\x2e\x44\x4e\x9a\x08\x34\x65\xc5\xb0\x76\xa8\xc9\x56\xc4\x18\x2d\x7c\x0f\x5b\xad\x9b\x76\x9b\xf1\x9d\x83\xd3\xf3\xba\x75\x09\xfc\x52\xa4\xb8\x87\x68\x86\xc3\x9e\x97\x87\xa7\x97\x29\x50\x00\x7b\x33\x3d\x5a\xab\x18\xf9\x32\xb1\x86\x31\x2b\x20\x0e\xe7\x28\x81\xa9\x60\x59\x98\x2f\x1a\xa7\x9d\x23\x99\x5a\xd2\xb9\xbc\x36\xb5\x36\x1d\xb3\x33\x0a\x29\xde\x9b\xb2\x9d\x72\xa9\xea\x2d\xe0\x9a\xf3\x13\xdc\x4e\x19\xa0\xc7\x1a\x4f\x32\xce\x2b\x78\x86\xc8\xdb\x1f\xbd\xe4\x45\xe5\x31\xdc\x49\xf1\x85\xcc\xbc\x24\x0b\xa6\x55\xf4\x1b\x65\x2d\x06\xc7\xed\xc4\x99\xcf\xcd\xbd\x76\x63\xf3\x66\x00\x23\xe4\xfb\x51\xa5\x7d\xd3\x14\x44\xd3\x4a\x34\xd4\x6d\xf3\x91\xee\xa7\x3b\x90\x44\x77\x13\x21\x15\x90\xa6\x12\x2c\x58\xc1\x42\x7b\xad\x37\x08\xe0\x39\x6f\x19\xe0\x3d\x5f\x8a\x53\xa9\x57\x20\x0b\xc0\x8e\x34\x15\xb1\xd3\x9e\x2e\x0f\xa7\xee\xbf\x94\xad\x15\x1b\x56\xfe\xfa\x3e\x69\x61\x39\xed\xd3\xee\x55\x45\x26\xdb\x56\x6f\x4d\xad\xaa\xf5\x1e\x12\x1e\x03\x7b\x67\x51\xdd\xb5\x4f\x78\x61\xc1\xc2\x49\xaa\x13\xbc\x55\x21\x5a\xb9\x96\xd1\xdd\x89\x9c\xe7\x91\x22\x5b\xa9\xad\xdb\x2a\x13\x62\x8b\x1e\x9e\xdb\x8b\xc0\x56\x9b\xfa\x0b\xd0\x47\xa0\xa1\x83\x19\xc4\x6d\xcf\x6c\x4c\x37\x16\x12\xe6\xab\xe7\x9b\x8a\x90\x2c\x5b\x25\x9d\x67\xf2\x34\xa5\x50\x3a\x3f\x73\x8a\x5b\x12\x6b\x81\x06\x88\xd1\xa8\x65\x31\x3c\x6f\x52\x8a\xe4\x74\x41\x49\x6b\xcc\xb1\x14\x71\x2f\xb5\x72\xe3\x9d\x3c\x68\x0e\xf2\xf8\xd5\xd9\x09\x32\x27\x41\xba\x0b\x93\x83\x7a\x2d\xc9\x92\xc2\xda\xb4\x6b\x28\xee\x61\x31\xb6\x4c\x35\xe9\x5d\xd0\x39\xcc\xaf\xed\x61\x7c\x84\xea\x9e\xb4\xf2\x81\x47\x16\xd4\x65\x59\x9a\xea\x4e\xd7\x00\x02\x96\x84\xb1\xc2\x15\x86\x43\xd3\x8a\x69\x85\x4b\xeb\xbd\x5e\xc9\xe9\x62\xa6\x27\x12\xd0\x6e\x91\x20\xa2\xc1\x59\xf2\x3e\x8f\xbc\x43\xe5\xf4\x64\x5e\xf4\x83\x2a\x8b\xb5\x48\x23\x75\x45\xcd\xee\x73\x58\x39\x6e\xbd\xcb\xfa\xfe\xb5\x68\x67\xeb\xfc\x9c\xcb\xd3\x94\x38\xa4\xc7\xbd\x7d\x7e\x0e\xc9\xe5\xbf\x5e\xde\xce\x01\xb9\x13\xa0\x3d\xe7\x42\x4c\xe8\x25\xb9\x01\xb9\xef\x45\x02\x22\xe6\xb5\x53\x34\xd7\xba\x54\x07\xcc\xf9\x0a\x46\x33\x19\x89\xa2\x15\x37\x89\xa5\xaf\x6a\x70\x37\x98\xeb\x51\x55\xe1\x54\x63\xf6\xf8\x56\xfd\x45\xef\x31\xdd\x50\xaa\x15\x60\xc8\xbf\x37\x6b\xe2\xca\x30\xfb\xc6\x3a\x61\x08\x1a\x24\xb1\x90\xa8\xb8\xac\xc2\x89\x3d\x0c\x6f\xc4\x4a\x29\xba\xa6\x1b\x5d\xd7\xfb\x1d\x95\xdc\xe1\x19\x24\xe5\x1b\x02\x60\x35\x42\xa9\x81\x6b\xb0\xd4\x21\xcd\x0e\x6e\x51\xa5\x9b\x47\x53\x7f\xb6\x99\x5c\x96\x66\xf5\x39\xa0\x5e\x08\xfa\x4d\x54\x1a\xa2\xe4\x43\x51\xef\x89\x49\xf7\x73\xf0\xf1\xd7\x94\x0a\xcd\xe7\xe5\x2e\x90\xc7\xd0\x11\x76\xb6\x68\x86\x05\x13\x0a\xc8\x39\x94\x6d\xc0\xb0\x7d\x54\xce\xfc\x47\x8d\x39\x93\x5a\xd5\xcd\xfd\x7f\xee\xd5\x67\x6d\x33\xb9\x29\xdc\x62\x41\xae\xb6\xc5\xd2\x42\x77\xe0\x3f\xa3\xb5\x2f\x4a\xb5\x84\xc0\x72\xad\x9d\x35\xfc\xe8\x14\x38\xdd\xac\xdc\xc5\x3b\xe7\x8b\xb7\x51\x2b\xd2\x10\x92\x03\xe0\x36\xcc\xed\x2d\xa4\xa1\x03\xb3\x67\x2d\xad\xbb\x31\xaa\x94\x66\xb5\x52\xd4\x59\x63\x44\x51\x3d\x98\xcf\xba\xf3\x99\x4d\xdb\x5f\x86\x27\x96\x2d\xe3\x7d\xaf\xff\x5b\xb4\xa0\xea\x3d\xf0\x9e\x92\x8f\xaa\x70\x52\x97\x44\x1e\x7c\x08\x0d\x43\x1c\x2f\x89\xbe\xc8\x78\x16\x80\x29\x0e\x63\x03\x07\x89\x1f\xca\xb1\x3d\x89\x0a\xcb\xcb\x03\x2e\x07\xe9\xe7\xe1\x16\xaf\xdc\x88\x4a\x26\xac\x00\xbc\x18\x9b\xaa\x1c\xfa\xa1\x30\x6e\xa3\x93\xfa\x7a\xb7\x86\x82\x31\xf6\xc0\x39\xa1\xca\x2c\x79\x34\xd9\x77\x82\xb2\xf1\xc1\xa3\x30\xb8\xb7\xc4\x83\x44\xd2\x75\x27\x85\x01\x13\x8d\xdd\xe4\x6a\xed\x71\x1a\x22\xbe\x1f\x6e\x1e\x26\xca\xed\xc7\x24\x40\xb0\x00\xd8\x76\x2e\x26\x26\x2a\xc6\xf4\x41\xaa\x56\xe2\x6f\xaf\x6f\x96\x13\xbe\xf9\xe9\x0c\xe1\xc4\xd6\x83\xc7\x63\x20\x26\x1a\x34\xc6\xc0\xd7\x17\x38\x68\xd0\xff\x51\xdc\x21\x40\x0d\x61\x56\xac\xf7\xe5\x21\x0e\xef\x7b\x33\x0f\x4c\x06\x8b\x7b\xf5\xba\xf5\x26\x52\x7a\xcf\x37\x1d\x40\xf9\xa8\x51\x5c\x31\xc1\x8f\x07\x3b\x20\xdf\x87\x13\x6a\x98\xda\x13\xb1\x07\x29\xf4\xf7\xf9\xa0\xe9\x83\x5b\xa0\x2f\x4e\xef\x75\x2b\xdb\xfd\xad\x70\xbf\xe5\x68\x8e\xfa\x0c\x4e\x8a\x95\x06\xb7\x69\xc8\xb2\xe5\x45\x22\x3b\x80\x31\x12\x03\x51\x92\xda\xea\x6a\x8d\xf9\xef\x3e\xc7\x1e\x6e\x48\xe7\x9d\x78\x62\x18\x30\x48\x64\x32\x6c\xb8\x3c\x34\x62\x32\x4a\x5f\xaa\xf0\x30\xc7\x91\x8d\x26\x91\x11\x2a\x61\x8c\x4a\x45\x3d\x0b\xf9\x6a\x5f\xa2\xa2\xf9\x60\x8a\x75\xe6\x9f\x0e\x24\x7d\x01\x2a\x5f\x6b\xf0\xed\x6d\xf9\x04\x5a\xcd\x81\x73\x97\xea\x09\x4d\xa7\xe1\x3c\x7a\xd0\xbe\xcb\xe5\x78\x30\x79\x7f\x3b\x78\xdf\xa9\x93\x2a\x08\xea\x0d\x9f\x57\x48\x36\x23\x40\x37\xd7\xd0\xb0\xba\x2b\x0b\x7b\xdf\xa7\x62\xf9\xe3\x11\x9d\x6c\x22\x72\x59\xa1\x29\xe7\xbe\x40\x6d\x31\x76\x65\xa7\x28\x71\xdf\xdc\x43\x04\xb6\xf5\x50\x5f\xc8\x53\x39\x19\x7e\xec\x90\x63\x7b\x54\x3d\x21\xce\x2f\xdc\x3b\x3d\x88\xe4\x0d\xf8\x47\xba\xd9\x2f\xeb\x3d\xc1\xdb\xc0\x8c\x3a\xa9\xd0\xb8\x4d\xb1\x42\x97\x43\xe3\x17\xb9\x9c\xb7\x60\x97\x56\xc6\x5d\x11\x38\xa2\x90\x00\x44\x99\xd0\xdd\x6a\x49\xc4\xf1\x45\x8f\x9a\x60\x26\x72\x0e\x46\xc5\x28\x0e\x4d\x1b\xf5\x4d\xc7\x39\x3d\xc0\x62\x01\x5e\xae\xe0\x5d\x11\xa8\x48\x14\x66\x4d\x6a\x29\xf3\x80\xef\x77\x6b\xd5\x60\xa1\x78\x0f\x07\x78\xac\x70\x78\xb2\xcf\x38\x91\x8b\x48\xbd\xa9\x7c\xb7\xcb\x72\x8d\x65\xbc\x5c\x64\xed\x7a\x28\xac\xdd\x6b\x8b\x60\x3c\xf0\xda\x00\xc6\x67\x82\x3a\x84\x2b\xf9\x2a\xd9\xa6\x67\x18\x0f\x14\xe1\x18\xb5\xd8\x90\xfd\xd0\x45\xbc\x8c\xf1\x0b\xf5\x04\x7b\x02\xbc\x18\x4f\x35\x06\x15\x1e\xaa\x67\xa6\xd9\xf3\x69\x63\x8a\xfd\x59\x90\xda\x96\x1e\xdb\x57\xf2\x94\x58\x06\x47\x93\xf7\x40\x9b\x38\x98\x5c\x25\xd4\x88\x42\x9c\xfb\x52\xdd\xe4\xbc\xc4\x50\x64\x01\x51\x31\x0d\x26\x78\x96\x1d\x5d\xad\xb5\x7a\x30\xb5\x3b\x0c\x88\xaf\xca\xd9\x3c\xfe\xc9\xb3\xa4\xdd\xef\x08\xc2\x81\x74\x4c\x55\x17\x36\x29\x41\x8c\x23\x2e\x1d\x45\xdd\xec\x81\xde\x6d\x85\x28\xad\x6e\xe8\x17\x5e\x14\xa8\xa5\xf5\x06\x5b\x95\x7c\x92\x86\xb4\x65\x66\xc1\xa2\x02\xb4\xc9\xe3\x8b\x13\xb9\x35\x55\x73\x6f\xa5\xb2\x82\xdd\xf3\x45\x1d\x15\x15\xa3\xe8\xa7\x37\x51\x6f\x75\x7d\xa7\xab\xd5\x21\x71\x13\xb8\x93\xe3\x1f\x00\x74\xcf\x3e\x3d\xed\x98\x77\x4f\xd7\x75\x88\xb0\x21\x1e\x1f\x91\x84\x91\x8e\x11\xd3\x89\x65\x8c\xae\x85\x25\xc3\xa8\x42\x51\x8a\x85\x7b\x46\x30\x59\x26\xa6\x16\x31\x1b\x79\x7e\xf6\xf2\xe2\xfb\x97\x17\x67\x67\xaf\xff\x2b\x03\xda\xfe\xf1\xe7\x77\xfd\xc9\x5f\x2e\x06\x37\xb3\xd3\xe9\x87\xf1\xe9\x79\x7e\xf6\x8f\x41\x00\x7e\x1e\xff\xf7\xd5\xc5\xab\xf3\x57\x6d\xfc\xdf\x57\xe7\xe7\x7f\xe0\xff\xfe\x33\xfe\x38\xf9\xec\x4e\x80\x9c\xee\x74\x25\x3f\xa8\x7a\x1d\x21\x56\x06\xb0\xff\xf3\xfc\x4c\x1e\x5f\xab\x83\xbc\xf8\x0e\x88\x55\x7e\x38\x89\xf8\x65\xdc\xbf\xa1\x11\x71\x1a\x13\x05\x35\x6a\x57\xe7\xa6\xbe\x7b\x39\xfd\x30\x16\x22\xe0\x65\xa6\x3d\x41\xd0\x1b\xd9\xcd\x4e\x63\xf8\x03\xf7\x66\x38\xbd\x34\x50\xff\x90\x15\x8f\x41\xfd\xad\x5e\xdd\x2b\xf0\x79\x8a\x53\xf2\x29\x61\x26\xa4\x2c\x18\x6b\x94\x94\x29\x4f\x55\xd5\x18\x92\xcf\x16\x29\xda\x48\xf9\xa5\x4a\xba\xa2\x92\x4a\x3c\x02\xab\x17\x00\x06\x42\x0d\x40\xc0\xfd\x77\xda\x7b\xe6\xb3\xfd\xc2\x7b\xcd\x4d\x06\x50\xcb\xea\xce\xbd\x31\x82\xe8\x70\xf4\x46\xb9\x77\xa1\x7f\x6c\x4e\x03\xd2\x6b\x79\x94\x00\xef\x1c\x91\xfd\x00\xcf\x05\xc1\xb4\xe0\x73\x53\x60\xe4\x90\xbf\x45\x61\x3d\x9b\x1f\xa1\x52\xfc\xcc\x36\x1e\x1f\x4d\x3f\x8c\x8f\x4e\x22\x8b\xd2\xb3\x1c\x2a\xf2\x17\x7b\x9c\x50\xf0\x31\xa7\xcd\xec\x6a\xe3\x14\x0a\x9b\xcb\x51\x93\xc0\xa1\xb0\xee\xff\xb9\xa8\xd6\x14\xd7\x07\xc4\x7f\xb0\x62\x1a\xa1\xe4\xbd\xda\x6e\x75\x0d\xba\x53\x80\x47\xdc\x82\x9d\xb2\x34\xaa\x26\x18\xbf\xc2\xc2\xe0\x5f\x58\xe4\x20\x6b\x95\xfb\x90\xaf\xa6\x39\xfc\x2c\x68\x3f\xdc\x10\xb8\x32\x7c\xfa\x61\xcc\x91\xe2\xe2\x89\x71\xe7\x42\x8c\x0b\x32\xbe\xde\x4f\x6e\xe5\x7b\xaa\xa1\x4c\x99\xb6\x32\xdf\x5c\xc1\x59\xb5\xf8\xe0\xde\xed\x15\x38\xf0\x80\x90\xb0\x16\x9b\x5a\xeb\xb5\x7b\xfc\x8d\x7b\x9f\x09\x36\xdf\xd9\x9b\xb0\x55\xb0\x44\x1b\x53\x2f\x8b\xb5\x3f\x3e\x8f\xf7\x86\x69\x0a\x6d\xc2\x8e\x28\xb8\x47\xa7\xe6\xeb\x8a\xe2\xb7\x70\xda\x4b\xf6\x97\x22\x1a\x12\xa8\x82\xfd\xc0\xa5\x08\x11\x1a\xd9\x05\x2d\x4c\x38\x1a\x1e\x1e\x60\x86\x6f\x8c\x41\xfe\xe9\x18\x79\x72\x46\x42\xd0\x8a\x5b\xc9\x85\xb8\xad\x4a\xbf\x86\x37\xe3\x64\xb1\x30\xbb\xa1\xd8\xaa\xba\x70\xc6\x7d\x44\x7b\xc0\x44\x80\xf2\xe3\x7d\x51\xea\xf0\x0b\x41\xe6\x45\x0b\xc0\x8e\x38\x1c\xab\xc8\x00\x72\x5f\x09\x11\x77\x9f\x30\x96\xcc\x01\x14\x9e\xa2\x01\x47\x74\x59\xa0\x3a\x09\xb4\xba\x60\x3a\xbb\x4d\x4b\x4b\xab\xd3\xfb\x6b\x6a\x5c\x15\x5e\x08\x11\x91\x54\x76\xd6\x41\xbe\x33\xb5\x5c\x02\x5c\xa2\xfb\xe2\xa3\xa9\xdd\xc1\x61\xbc\x04\x60\x05\x54\xe0\xf3\x80\xb1\x56\x8d\xa8\x9d\x79\x0b\x49\xb9\x6e\x1b\x43\x4e\x0a\x70\x59\xdc\x9b\xfd\x1d\xc0\x12\xf8\x78\x9d\x27\x6e\xa4\xa3\x03\x0b\x82\xcd\x17\xd5\x9d\x88\xf0\x16\xf4\x16\xd0\xb7\x09\x41\xa0\x75\xf0\xf1\xf8\x12\xef\xe5\x06\xf8\x59\xad\x13\x1c\x15\xf6\x01\x66\xb0\x48\x32\x5a\xb0\x27\xa4\x6b\x0e\x88\x60\xd8\xb3\xc7\xa2\xc5\x49\xb8\xe3\xbc\xd4\x95\xde\x14\x0d\xf3\x2f\x08\x77\x12\x48\xc6\x79\xc2\x06\xd0\xd1\x4b\xf5\x68\xf7\x00\xbb\x5e\xaa\x62\xeb\x13\x06\x82\x3c\x84\x30\x9e\x4d\xfa\xb3\xce\xb4\x61\xa0\xb7\x9e\x6c\x5d\x26\x65\xfb\x30\x66\x83\x0e\x3c\x51\x00\x25\x4d\x56\x5d\x51\x3d\x98\xf2\xc1\x73\x3d\xe2\xe5\x64\x33\x4a\x55\x77\x05\x64\x16\xf3\x63\x23\x50\xda\x66\x72\xb9\x8f\xf6\x62\x95\xa0\xaf\x83\x2b\x76\x8b\x7f\x83\xcc\xb0\xb5\x86\xac\x10\x86\x6e\x23\xd4\xc1\x2d\x10\xd0\xac\x35\xe4\x99\xe6\x72\x10\xce\xfc\xa9\xa9\x0b\xa4\x1b\x61\x94\x66\xf2\x6f\xf3\x9d\xe2\x73\x85\xeb\x85\x90\xcb\x3c\x6e\x8b\x89\xbc\x6e\x0b\x23\xc6\x15\x58\x03\x44\xc8\xe3\x15\xc5\xc3\x4b\x69\x9a\xff\x3b\xdd\xbb\x27\xa3\x0c\x4b\x5d\x9a\xc7\xb6\x03\x8b\xc3\x5f\xf8\x7e\xa9\x2d\x2c\x15\x64\x65\xc3\x5b\x6d\xf7\xdb\xad\xaa\xa9\x5a\xf0\xdf\x3c\x83\x60\x54\x00\x92\xde\x69\xf4\x1f\x7c\xee\x08\x1a\x1a\x63\xde\x6a\xc7\xcd\xcc\x7f\x92\xdf\x17\xca\xd8\x22\xf4\xac\x2e\x05\x71\x2e\x44\x68\x21\x92\x6d\x51\xc9\x55\x4b\x2a\xba\x9d\xf6\xf4\x25\x54\xc4\xc4\xaf\x0d\xb0\xad\x8b\x9d\x5a\x7d\x56\x77\xe0\xf9\x4c\x78\x66\x61\xc8\xbd\xbd\xf9\x61\x23\x2d\xe3\xe7\x6e\xfd\x39\x30\x94\xbb\xdf\xfa\x7a\x7b\xe8\x58\x74\x57\xcd\xd3\x11\x37\x11\x4d\x4e\x41\x6b\x87\x95\x07\x44\xb1\x1e\x14\x1c\x5a\x17\x41\x00\x2f\xb0\x78\x0c\xbe\xd8\xdc\x3b\xdb\xfb\xa0\x15\x71\x10\xc4\x2f\xd3\x7f\xee\xb5\x6d\x6c\xcf\x5e\x44\x73\xeb\x5f\x47\x4a\xe6\x49\xdf\x0f\x59\x34\x3c\x4f\x5f\x52\xfa\x6f\x5e\x15\x01\x71\x9c\x00\x29\x46\x1e\x8f\xe9\x87\x71\x1e\xbe\x32\xf2\xdb\xe2\x76\xbd\x05\xbe\x18\x02\x32\x18\xa8\x8e\xa0\x90\x6d\x83\xe5\x30\xee\x70\xc3\x5e\x0d\x9a\x46\x6f\x91\x3c\xde\x6a\x72\xce\x3e\x31\xa1\xe5\x41\xea\x2d\x66\xf5\xc6\x68\x5a\x11\x26\xb4\x5b\x33\x08\x1a\x46\x85\xb9\x4e\x76\xe1\xd7\x48\x20\x11\x7c\x09\x5c\x98\x90\xba\x14\x45\x6e\xe5\xa9\x2c\xd0\xbf\x8a\xdf\xdb\xa8\xa2\xb4\xc8\xa8\x53\x69\x18\x95\x93\x41\xa0\x16\x03\x0a\x33\x7b\xe1\xee\x0c\x1c\x0d\xff\xb0\x75\xeb\x5f\xfe\xcd\x73\xfc\x80\x42\x12\x44\x43\xa0\x74\x52\x55\x4c\xd3\x9b\xae\x3f\x8e\x01\xb3\x1c\xde\xb8\xc5\x0b\xbb\x50\x84\xe7\x1a\x93\xf5\x81\x69\xb4\x52\x5b\xbd\xe6\x3a\x48\x79\xec\xc3\x9a\x6a\xe7\xe4\x75\x5d\xb8\x31\x00\x9b\x84\x33\x24\x4e\x7c\x5a\x6c\x8b\x8d\xb7\xb5\x0d\x74\xf9\x60\xf7\x46\x8c\xd4\x46\x20\x8a\x5e\x3d\xcf\xfc\xc5\xf5\xb5\xc8\xa0\xa3\x30\x43\x6a\xec\x4b\x03\xf3\xe4\x09\xe5\xb8\x6d\xac\x9c\x1c\x01\xd0\xa5\x5a\xdd\xb7\xd5\x93\xa2\x64\x5d\x46\xb8\x17\x82\xeb\x4d\xe2\x35\x43\xac\xf1\x22\x5e\x34\x1a\x9b\x41\xb2\x12\xa0\xda\x2d\xea\xd5\xbe\x68\x24\xe8\xc0\x42\xd5\x8d\xaf\xc4\x4b\xae\x3b\xe4\xd9\xff\x0c\x94\xb5\x3b\x85\x0c\x46\x3e\xd5\xfa\x5e\x73\xbb\xee\x4d\x58\x6a\xd7\x7d\xdd\xe8\x4a\xaf\xc1\x31\xb8\x5c\xd6\xfa\x81\x99\xb3\xc2\x26\xc6\xca\x19\x7d\x9d\xa7\x8a\xe4\xb4\xd5\xfa\xc9\x71\x4a\x1a\x27\x6f\x0a\x1c\xa5\xc2\xde\xb3\xf7\xde\x34\x54\xea\xba\x69\xdd\x6f\x0c\xdf\x38\x81\x87\x5e\x58\xd4\xc1\x58\xf6\xc1\x31\x4e\x2e\x4f\xe7\x70\x1d\x51\x69\x5d\xbe\xf8\x75\x71\x04\x41\x20\xb3\xd5\x78\x39\x2c\x46\x32\xf0\x9a\x57\x87\x80\x8e\xe7\xb4\x03\xda\x1f\x14\xc8\x0c\x48\xd3\x7a\x9d\x22\xf3\x90\xc6\x98\x89\xce\xc3\xc0\x49\x85\x5b\xd5\xe8\xba\x50\x65\x1f\xf5\x38\x24\x18\xed\x6c\xe3\x9e\xcc\x00\xd1\x9f\x8b\x51\x40\x37\xf5\xe2\x1f\xe4\x87\x97\x40\x9d\xe3\xff\xc6\x3f\x30\x30\x08\x28\xf2\xa2\xb7\x35\x5d\x59\x58\x28\x08\x45\xc1\x6a\x1d\xef\xc0\x51\xa8\x96\xe5\xc1\xaf\xdc\x87\xc1\xe4\xfd\x70\x0e\x2b\x77\x12\x58\xdd\x78\x62\xfe\xb6\xb6\xd4\xdc\x05\xc0\x38\xb9\x36\x61\x08\xc9\x99\x46\xf8\x4f\xf4\x68\xe3\x7d\x43\xa7\x7b\x3a\xb4\x88\x09\xa8\x7d\x0f\xfb\x8d\x54\x67\xc6\xc6\xb3\xe6\xde\xaa\x03\x42\xe7\x02\x64\x6d\x90\x6b\xeb\x88\x68\x0f\x3e\xb4\x55\xd5\x7e\xa3\x56\x0d\xf8\x86\x05\x7e\xfc\x98\x55\xac\xf7\xba\x5e\xea\x1a\x1b\x39\x89\xa5\xa3\xaf\x97\x03\x0d\xd9\x1d\x5d\xa4\xbc\xf6\xc6\x75\xef\xa0\x20\xce\x74\xb4\x04\x38\x7f\xb4\xd7\x8f\x20\x69\xe6\x28\x89\x5b\x40\x96\xb2\x1f\x36\x6f\x77\xa2\x3d\x70\x83\x0c\xc8\x2b\x51\x66\x6a\xc4\xd0\x05\x61\x67\x5b\xca\x4a\xbc\x17\x02\xc8\x3c\x48\x28\xfa\xae\x5b\xb3\xce\xe4\x60\x7e\x39\x1a\x65\xf2\xc6\xd8\xc6\xae\xea\x62\xd7\x80\x02\x71\x73\xf5\xee\x84\x0e\x64\x2d\x1b\x63\x4a\x2b\x9c\x28\xa1\x85\x69\xee\x35\x20\xe5\x23\x5d\xfd\xe4\x4a\x5e\x4e\x27\x57\x8c\x45\x0f\x49\x4b\x8d\x07\x3f\x73\x3f\x38\x6f\x63\xfc\x63\x44\xc0\xca\x7b\xf3\xe8\x79\xaa\x21\xad\xa3\x63\xbc\xc6\x7a\xc6\x55\xa2\xa6\x41\xf0\x29\x6e\x00\x45\x07\x5e\x1f\xb5\xd6\x9d\xaf\xdf\x74\x94\x11\x38\xf2\x57\xa9\x31\x3b\xb0\xe8\xbe\x60\xd6\xe2\x38\x9b\xc5\xc8\xa3\xd0\xde\x51\xfa\x4d\x46\xa7\x0e\x55\x91\x22\xad\x8a\x04\x01\x43\x71\xb9\x44\xb2\xb4\xaa\x07\xc8\x26\x8f\x7b\x12\x7e\xe8\x9d\x4e\x5a\xa5\x97\x77\x00\xf5\x5a\x1a\x55\x65\xd2\x6a\xac\x38\x0a\xb4\xe5\x0c\xde\x20\x00\x63\xa2\xdd\x35\xaa\x08\xe7\xf9\x85\x3c\xba\x4a\x9d\x4e\x5c\xc8\xef\x55\xb6\x63\x75\x22\xed\xea\x5e\x43\x06\x99\x5c\x17\xca\x99\x37\xf6\x67\x21\x8e\x97\x27\xfe\x61\x70\x96\x50\xf2\x46\x94\xea\x60\xf6\x8d\x8d\x2f\x27\xdd\x3d\x78\x5a\x40\xeb\x05\xba\x09\x38\xf1\xc2\x7b\x91\xc2\xed\xd5\xae\x8b\xd5\x49\xe4\xe1\x83\x04\x7d\x34\xd0\x42\xab\x97\x83\xab\x4c\x5e\x0e\xae\xb3\xde\x86\xbd\x7b\x4a\xa4\x0d\xd3\xd4\xd6\x27\x72\xe3\x2c\x1f\xa7\x29\x13\x0d\xf8\x5a\xe3\xd5\xe0\xa8\xfa\xcf\xe0\x56\xe1\x2f\xe8\x93\x90\x7a\x5d\xaa\x4a\x35\xa6\x3e\xf8\xd7\x20\x17\xa2\x75\x4c\x38\x17\x15\x04\x13\xdb\x9b\x94\xa6\xc4\xff\x02\x90\x3c\xb3\x89\xa0\x86\x63\xea\x50\x77\xe5\x9d\x8a\x11\x95\x56\x79\xff\x99\x17\x16\x70\xfb\x29\x9f\xbe\x25\x34\x7c\x15\x02\x27\x57\x00\x2e\xae\x53\xac\x76\x4e\x22\x6c\x8a\x72\x9b\xf9\x83\x03\x48\x81\x8a\xcf\xc6\x2b\x79\xc4\x67\xd1\x1f\x8b\x37\x42\xb8\xf3\x90\xec\xb5\xcd\xe2\x3d\x52\xd6\xea\xed\xb2\x04\x23\x27\xec\x88\x77\xe7\xee\xfc\x42\xbb\x69\x98\xca\x29\xea\x74\x96\xe8\x9b\x08\x92\x41\xc5\x5a\xe5\x21\xfa\xf1\xbe\x72\x06\x71\x94\xb9\x1f\x9a\xc0\x1c\x93\xfd\x32\xf4\x7e\xf2\xb3\x80\x8d\x73\x47\xa8\xaf\xd3\x18\x46\xba\x31\xf2\x73\xd1\x20\x48\x75\xc5\x49\xf2\xd4\xd4\xc1\x99\x02\xa8\x10\xfc\x2c\xd0\x14\x03\x48\x33\x45\x82\xc3\xe3\x61\x52\x02\x3d\x57\x1a\xb4\x44\x8d\x38\xcf\x5f\xb7\x25\x23\xe4\x9d\x68\xb6\xc3\x5a\x22\x06\xbb\x22\x08\x5e\x1b\x34\x5b\x80\xdc\xae\xee\x44\xd1\x87\x0c\xf2\xf4\xab\x1a\x71\xcd\x96\x2d\xe9\x28\x9e\x9c\x45\x47\x62\x3a\x75\x2f\x1d\x66\xca\x26\x21\xd0\x09\xa5\xea\xd5\xbd\xbb\x3f\xfe\x01\x52\xf2\xe8\xbf\x17\xbb\x23\x38\xb1\x27\x8c\xed\x1d\x40\xf0\x22\x83\x22\x0b\xaf\x25\xc2\x87\x42\x99\x0c\x36\x07\x00\x4d\xf1\x84\x93\xd5\xa4\x70\xab\xc7\x43\xb7\x51\x81\x81\x00\x6c\xec\xb5\x5e\xe7\x72\xe8\x74\x5c\xca\xb1\x70\x26\x9c\xf7\x34\x63\x26\x55\x13\x65\xb7\x76\x66\xca\xe1\x57\x4c\x39\x6b\x0f\x00\xe7\xe9\xcb\xb4\x8e\xdc\x9e\x7f\x27\xdf\x1e\x40\x82\x52\xbd\x50\xea\xc6\x3c\x70\xd6\x62\xb0\xde\xc8\x8e\x4d\x9f\x3f\x69\x6a\xb8\x21\xa4\x93\x18\x9f\x56\x1a\xde\x0a\x85\xb0\x51\xed\x86\x88\x9c\x15\x41\x6d\xdb\x8f\x9c\xf0\x81\x78\x70\x76\x1c\x18\x1d\x15\x33\x71\xe9\xfe\x12\xf4\xb0\x9f\x99\xd6\xf9\x11\x68\xd8\xe4\xc3\x04\xdd\xc5\x54\x16\x12\x9f\x1b\xae\x9c\x48\x16\x06\xb8\x9b\x9f\x4a\x42\x0e\x6e\x59\x76\x00\x14\x4d\x74\xc7\x11\x61\x14\x1d\xff\xee\xae\x80\x8a\x6d\x9d\xec\x89\xb2\x69\xe7\x84\x3d\x7e\x71\x82\x3a\x52\x5c\xf7\xb3\x61\x8b\xe3\xf1\xde\x08\x50\x18\xbc\xba\xde\x59\x64\x54\x28\xcc\x92\x18\xc8\x78\x75\xb3\x27\x5e\x60\x8c\xc6\xa0\xf9\x13\x8a\x56\x31\xe7\x14\x59\x45\x00\xc1\x43\xd1\xa1\xdc\xec\xdd\xcc\xd3\xa5\x86\x3d\xb2\xba\xa4\x94\xb7\xfc\xfb\xb6\x8c\xf0\x5e\xc8\x00\x74\xf4\x6d\x8e\x48\x11\x3b\x22\x25\x39\x22\xe9\xea\xc5\xa1\x1b\x84\x7a\xfc\x0b\xa5\xd1\xe2\xb8\xae\x5a\xbe\x1d\xaf\x93\x50\x9d\x81\xed\x07\xa9\x69\xee\x23\xd2\x4f\x70\x33\x7a\xa0\x58\x4c\x08\x29\x1a\x2b\xda\x5c\xc8\xc7\xf6\x04\x91\x6e\x6f\xc8\xe7\x2b\x2e\xf2\x73\xbc\xa5\x6d\x20\xe3\x83\xd9\x67\x52\x3f\xe8\x9a\x83\x23\xa1\xa2\x02\x08\xba\xe0\x37\x3b\x63\xad\xb6\x80\x0d\x80\xb4\x73\xee\x08\xf8\x7b\xa2\xdc\xd5\xdf\xe9\x66\xaf\xca\x2c\x80\xe2\xe3\xf7\x6b\x73\x50\x65\x73\x38\x85\xc2\x22\x3a\x72\x87\x70\xe0\xa8\x46\x1e\x28\xbe\xa9\x18\x86\xdc\xe2\x49\x09\xfb\xf3\x2e\x6b\x4a\x7e\xc2\x6d\xb8\xc7\x44\x46\x04\xa4\x69\x6a\x53\x5a\x0f\x97\x0e\x8e\x92\x26\x4a\x11\xf4\x21\x8b\x48\xe7\xa5\xa9\x66\xc2\x23\x4d\xf7\x68\xc0\xec\x81\xe2\xf9\x84\x8a\x22\x60\xf6\x84\x4a\xae\xb8\x88\x26\xe1\x48\x4f\x4d\xb9\x24\x55\x09\x24\x8e\x7f\x1a\x61\x0b\x2f\xd8\x1b\x00\xea\x2f\x5f\xa7\x44\x46\x65\xad\x64\xfd\xab\x0e\xd5\x88\x6b\x40\x24\x76\x31\x8a\x30\xac\xea\xc3\x3d\x0e\x85\xeb\xdf\x7c\x1a\x04\x86\x77\xfe\x1e\xa7\x41\x80\xf8\xf9\x7b\x9c\x06\xa2\x79\xc4\xd3\x00\xc6\x28\x9e\x83\xff\xda\xc7\xe0\x95\x5c\x18\xa9\x1e\x4c\xb1\x96\x6b\xb3\x5f\x36\x59\x84\x29\xd0\xda\xef\x96\x55\xe2\x4b\x7d\xad\x29\xb5\x88\x48\x32\x7c\xfa\xb4\x6a\xe8\x93\x70\xc4\xfc\x46\x9a\x0a\xdf\x91\xa5\xbe\x57\xe5\x86\x63\x91\x0c\x61\xab\xd7\xe2\x28\x09\x12\x1e\xfd\x9f\x68\xac\x27\x9d\xbf\xb0\x98\x58\xeb\x4d\x7f\xdf\xba\x1b\x8d\x93\xfd\xd8\x89\xa0\x4e\x42\x7c\x48\xf9\xb0\xff\x8e\x13\xac\x02\x55\x47\x58\x71\x30\x2c\x96\xc1\xd3\x89\x91\x16\xf7\xc6\xed\x54\xed\xac\xaa\xdd\x3d\xac\xdf\x6b\x4a\x5e\x24\xa9\x67\x36\xa1\x0d\x08\x33\x7b\x7b\x23\x02\x73\x48\x8d\x57\x2a\xce\xdd\x0a\x25\x77\xa6\x8e\x8b\x11\x12\x54\x5f\x4a\x53\x5c\x1e\xd0\xf1\xe7\x07\xef\x53\x88\x41\xdf\x73\x47\x1c\xf2\xe1\xc4\x5f\xf6\xc4\xda\xef\xb9\x96\xe2\x3c\x02\xa4\xca\x80\x63\x0c\x87\x06\x86\xcf\xfa\x8c\x9f\x01\xbb\x4a\x05\x53\x95\xd2\xdb\x9d\xf5\x28\x02\x7d\x6a\x44\x50\x1c\xdc\x24\xc9\x1d\x20\x42\xa1\x50\xc7\xb3\xd0\x53\x1d\xd4\x7d\xf7\xc3\x9d\x12\x7d\x52\xea\x26\x38\x81\x5e\xe5\x04\x9f\x42\xb7\x41\x88\x9e\xc0\xd7\x55\x4f\xe4\xbd\x1b\xbb\xc0\x09\x91\x7e\xe5\x16\x9f\x13\x17\xaf\xda\x3e\x38\xd6\x68\x9f\xd2\x7d\x01\xfd\xde\x7d\x82\x07\x2a\xbe\x66\x9e\x6c\x73\x96\xd5\xad\xb5\xf1\xce\xc8\x96\x03\xc6\xd4\x6d\x9f\x4a\x5f\xe3\x14\xcb\xcb\x82\x97\x8a\x82\x28\x51\xcb\x2d\x1b\x19\x7d\xbc\xce\x06\xe6\x5c\x77\xaa\x80\x64\xa5\xee\x35\x64\x8a\x26\xfa\x00\x86\x5e\x6c\x54\xd1\x57\xb5\x3c\xc7\xde\x9f\xd9\x5a\x4b\x8a\x00\x51\x59\xab\x0f\x02\xc1\x97\x05\x87\xfc\x2c\x9e\xc5\xb8\xbc\x2e\x3a\x90\x3c\x2e\x3e\x7f\x10\xa6\x81\xd0\x69\x65\x18\xb9\x5a\x60\x6e\xa5\x2c\xf0\xfa\xf0\xa8\x20\xb8\x93\x0b\xf1\x3a\x97\x57\xb1\xa2\x9e\x0c\xd2\xfd\xfa\xfc\x2b\x41\xcc\x14\x0f\xba\xb3\xa0\x5c\x21\x53\xeb\xe6\x20\xc8\xfb\xc0\x98\xe0\x29\x8c\x2c\xba\xaf\x01\x47\x0f\x91\x27\x58\x39\x0b\xa6\x3b\x23\x94\x45\x3a\x39\xd8\x41\x1a\x80\xac\x3a\x67\xf1\x24\x44\x74\x58\xb0\x84\xe7\x1a\x99\x0e\xd8\xa1\x2b\xf7\x15\xb1\x78\x8a\x80\x2f\xdb\xca\x60\x7f\x9d\x5f\x3c\x1b\x86\x7c\x76\x25\x28\xfe\x05\x1a\x77\x8a\x6e\x9d\xc4\x09\x7d\x09\x09\xc9\x63\xe9\xe5\xb1\x1b\x30\xb9\x3c\x82\xd7\x7b\x57\x9b\x6d\x01\x2c\x10\x21\x72\xa2\x2a\x74\xae\x86\x07\x3f\xf6\xc8\x82\x03\x9d\xdd\xf7\x68\xd4\x38\x69\xc0\xa4\x07\xfd\xa3\xf7\xfb\xb3\xba\x57\xd5\x1d\x33\x9d\x92\xf9\xef\x6b\xbd\xc5\x37\x79\xdb\x51\x1b\xef\xac\x2f\x39\x5e\xe2\xe8\x46\xa5\x1f\x7b\x82\x5d\x36\x1a\x0d\xb8\x85\x41\xe2\x3c\x6a\x67\xd7\x59\x0f\xed\x2b\x88\xfc\x10\x8b\x37\xfc\x16\xc5\xae\xf0\x10\x61\x0a\x33\x93\xc7\xd8\x45\xf0\x96\xc1\x33\x9b\x60\xf4\x1b\x53\x42\x71\x2f\xd6\xfc\x85\x08\x20\xda\x7b\xc5\x86\xaa\x4e\x20\xe2\xc1\xe0\x22\x41\x0a\x89\x24\x6e\x11\xed\x8c\xaf\x2d\xfc\xba\x8b\x3c\xf3\xf3\x38\x21\xc7\x24\x21\xd0\xd2\x24\x9e\x59\x66\x94\x46\x5c\x83\x8e\x7c\xb0\x9c\xac\xcf\xf9\x5d\x96\xdd\x55\x6b\xf6\xc5\x3f\xab\x45\xf3\x5c\x8a\x1e\x67\x13\x02\x21\x30\xa1\x46\xb4\x30\x31\x2c\xde\xce\xbd\xa3\x3e\x1a\xc7\x31\xb1\x60\xf1\xb6\xdd\xb6\x99\xbc\x1c\x5c\xbd\xbc\x1c\x5c\x8b\x20\x19\x52\x0f\x6b\xec\xba\xcd\x85\xf8\x2e\x97\xd7\xa9\x1e\xe5\x7e\x76\x9e\xe4\x77\xf4\x1c\x7a\xf3\xec\xb4\x59\x78\x61\x00\x0b\x0e\x13\x7d\x82\xa4\x18\x56\xee\xb1\xc8\x8a\x25\x51\x52\x15\x1d\x64\x59\xd6\xe3\x61\xcd\x3a\xc1\x51\xd0\x30\x53\xa7\xe7\x09\xcc\xb1\x57\x38\xdd\x74\xf2\x3f\x78\x3a\xe9\x2c\x64\x3b\x0c\x87\x32\x0a\xa6\xe5\xb4\xa5\x16\xee\xf6\xd3\xef\x26\x7b\x5f\x92\x87\xd3\xbd\x32\x03\x27\x5e\xf1\xd6\x94\x87\xcc\x47\x4f\xf8\xf4\x50\xf6\xc9\x71\x71\x02\xb5\x0f\x00\x59\x07\x75\xcc\x3d\x39\x23\xc2\xe7\x8c\x30\x54\x41\xd7\x3f\x98\x49\xa4\x61\xa6\xc4\x93\x04\x83\x44\x87\x2b\xaa\x05\x23\x4c\x83\xbf\x19\x31\x66\x8c\x6d\xa0\xea\x95\x9c\xa1\x91\x87\x2e\x4a\x4c\xf9\x59\xc2\xe6\xb9\xf1\xca\xdb\xd9\x18\xc9\x70\x45\x77\x20\x1e\xf3\x99\xb8\xd7\x40\x7a\xfa\x38\xcc\x93\x09\x31\x58\xf0\xee\x56\xa9\x74\xbf\x6a\xa9\x46\xb4\xad\xb9\x10\xdf\xe7\x50\xd5\xc5\xb9\x0e\x5c\xdd\x25\x04\xf8\x5f\x5d\xdf\x69\x35\xd3\xba\x53\xc6\x34\xfd\x30\x26\xb3\x8f\x5e\x5f\x5f\xe7\x43\xc4\x1e\x71\xf5\x1e\xa5\x86\x91\x0f\x3f\xd4\xf7\x40\x96\x1a\x50\x4c\xba\xd3\xb0\x76\x0d\x61\xbe\x4a\x54\xdd\xb4\xab\xcd\xb2\xd4\x5b\x48\xa5\xa3\x42\x51\x72\xec\x21\x5b\x8d\x82\x59\x16\xd5\xdd\xbe\xb0\x10\x48\xe7\x3a\x23\x2e\xa4\x1a\xf5\x1c\x3e\xc1\x64\x49\xce\x84\x4e\xbf\x40\xb3\x8a\x5c\xdb\x44\x68\x72\x04\xf9\x5b\x50\xe0\x4c\xdf\x38\x82\x03\x09\xc5\x50\x04\xf4\x4a\xe7\x11\xf6\xd3\xd7\x3b\x51\xe6\x57\xfc\xcd\x40\x0d\xee\x6e\xb6\x5b\x74\x37\x4e\xd1\xbd\x24\xde\x46\xc3\x01\x1f\x3a\xc3\x0d\x77\x82\x86\xe0\xfa\xa2\x8f\x08\xfd\xa0\xeb\xbe\xae\x60\x97\x3d\xf4\x73\x90\x15\x64\x3a\x41\xf2\x8c\xdb\x1b\x32\xe0\x40\xd4\x42\x60\x47\xa4\x87\xdb\x27\xf0\xf6\xa5\x91\x23\xa1\x7a\xa4\xf3\x11\x27\xd4\x0f\xb9\xc7\xfb\x82\x70\xac\x07\x32\x94\xe3\xd1\xf5\x68\x31\xa0\xc8\xec\x0f\xf9\x39\x82\xfb\x4e\x2f\x6f\xaf\x87\x13\xfc\xb9\x1c\x11\x52\xc0\xd5\xf0\x4a\x02\xb1\xcd\xd1\x60\x7e\x3a\x9a\x1f\xc9\xb7\x83\xf9\x68\xee\xc9\x4a\x7c\x07\xd3\x77\x72\x30\xf9\x24\xfe\x3c\x9a\x5c\x65\x72\x31\x85\x16\x87\xbf\x2e\x86\x93\x85\xbc\x19\xce\xae\x47\x8b\xc5\xf0\x4a\xbe\xfd\x24\x07\x37\x37\xe3\xd1\x25\xe0\x0c\x8c\x07\x1f\x73\x39\x18\x8f\xb9\x91\xd1\x70\x9e\xc9\xe1\xaf\x37\xb3\xe1\x7c\x2e\xa7\x33\x31\xba\xbe\x19\x8f\x86\x57\x99\x1c\x4d\x2e\xc7\xb7\x57\xa3\xc9\x7b\xf9\xf6\x76\x21\x27\xd3\x05\x4e\x60\x78\xe5\x3a\x1a\x4c\x3e\x45\x0d\x00\x5b\xc4\x70\x76\xf9\x61\x30\x59\xd0\x6c\x33\xf9\x6e\xb4\x98\x0c\xe7\x73\xf1\x6e\x3a\x93\x03\x79\x33\x98\x2d\x46\x97\xb7\xe3\xc1\x8c\x99\x36\x33\xa4\xdb\x1b\x2d\xc6\xee\xaf\xb3\xa1\xfc\x30\x9c\x0d\xdf\x7e\xe2\xb1\x8c\x3f\xc9\xab\xd1\xfc\x72\x3c\x18\x5d\x0f\xaf\x10\xe9\x53\x8e\x26\x72\x32\x45\xa4\x04\x79\x3b\x19\xbb\x11\xcf\x86\xff\x7e\x3b\x9a\xf5\xcd\x52\x7e\x1c\x8d\xc7\x30\x50\x94\x03\xd3\x99\x7c\x3b\x84\xed\x18\x0f\xc5\x62\x2a\x3f\x4d\x6f\xa5\x1b\xda\xe4\x93\x5c\x7c\x18\xcd\xae\x60\x88\x9f\xe4\x3b\xfa\xd9\xd5\x68\x36\xbc\x5c\xb8\x65\x08\x7f\xbb\x1c\x5d\xb9\xad\x1a\x67\xf2\x72\x3a\x99\x0f\xff\xfd\x76\x38\x59\x8c\x06\xe3\x4c\xdc\xdc\x4e\x46\x8b\xd1\x2f\xc3\xcc\xb5\x38\xfc\x75\x78\x7d\x33\x1e\xcc\x3e\xc9\xab\xc1\xf5\xe0\xfd\x70\x2e\x07\xb3\xd1\xdc\x2d\xa4\xdb\x3b\xaa\x30\xbd\x9d\x0f\xe5\xf4\x1d\x7c\x7e\x34\xe1\x13\xb2\x98\x8a\x5b\xb7\x30\xdd\x83\x31\x9d\xb9\x83\x71\x75\x7b\xb9\x98\x7f\x65\x67\x60\xc5\xdc\x8e\x88\x5e\x10\x75\x39\x9a\xbc\x9b\x8d\x26\xef\x91\xe4\x6a\x3a\x93\xe3\xe9\x1c\xf6\xef\x6a\xb0\x18\x64\xb0\xb6\x72\xe4\x86\x38\x58\xd0\x82\x7c\x18\xcc\xc5\xdb\xe1\x70\x22\x07\x57\xbf\x8c\xe6\xee\x60\xe2\x0c\x6e\xa6\xf3\x39\x43\xed\x4f\xdf\xc9\xf9\xed\xe5\x07\x9e\x30\x6c\xd7\x2b\x78\x7a\x23\x38\x42\x48\x0e\x33\xb5\xbe\x33\x90\x70\xec\x93\x42\x2d\xe1\xac\xf1\xeb\x13\x43\x37\x56\xa6\x3a\xf5\x38\xa5\x2d\x0e\x4b\x88\xa0\x93\x21\xe7\x23\xa8\xac\x4c\x74\x1d\x2e\x11\xd0\x17\x02\x8b\x40\x01\x7a\x81\xca\x05\x39\xb6\x6c\xcc\x8a\x61\x53\x20\xa0\x63\x7b\x22\x1f\x21\x73\x8c\x02\x09\x8f\x05\x11\xfe\x1a\xe1\x6b\xc6\xaf\x9e\x4e\x5a\x3a\x98\x3d\xac\xcb\xeb\x78\x5d\x0c\x22\x04\x41\x92\xcc\x5a\x6f\x2b\x9f\x6a\x01\xb0\x4b\xa9\x55\xed\x71\x97\x28\x99\xfb\x20\x10\x7a\x74\x59\x9b\xbd\x13\x6f\x6d\xf0\x43\xa7\x67\xea\x3b\x4e\xbb\x41\x48\x0e\x9f\xc5\x47\x89\xe7\x91\x4e\x08\x3e\x84\x40\xae\x66\xd0\x34\x66\xf5\x2d\xf8\x40\x3b\xfe\xcd\xd4\x17\x13\xe3\x0c\x75\xac\xc5\x7f\xf9\x97\x7f\xf9\x97\x3f\x8a\x16\xff\x9a\x3f\xf9\xcb\xc9\xfb\x9b\xf1\x3f\xa6\xee\x8f\xff\x3c\x5f\xff\x77\x7e\x7e\x7e\xf6\x5d\xab\xfe\xef\xe2\xd5\xf7\xaf\xfe\xa8\xff\xfb\x67\xfc\x99\x0c\x17\x1f\x06\x97\x7f\x96\xef\x87\x93\xe1\xcc\xc9\x73\xe0\xbb\x0b\xe9\xbc\xa1\xca\xef\xfc\xa7\x1f\x7f\x92\xd7\xb9\x9c\x37\x7a\x77\xef\x24\x47\x75\x22\xc4\xf1\xdb\x90\x67\xa5\xe5\xdb\xd1\x7c\x3a\x69\x53\xd4\x95\x9c\x88\xb0\x8a\x9b\xfa\x51\xce\x0a\x67\x2e\xac\xb1\x49\x55\x96\x5b\xe5\x1a\x1c\x3e\xe8\x1a\x52\xd3\x0b\x52\xa0\x1a\x9f\xfd\xb2\x3b\xb4\x83\x1c\x0f\xba\x5e\xaa\x06\x50\x92\x83\x37\x08\x92\x64\xb1\x4b\xb0\xf1\xc0\x4e\x07\xbc\xc7\x86\x03\x04\x90\x3e\xac\xd7\x39\x48\xcc\x95\xaa\x30\xa7\x0e\x2d\xd3\xc2\x7a\x60\x04\x36\x4a\x9b\x7b\x2d\xd0\xc4\xdf\x78\x37\x0f\x45\x59\x19\xa8\x93\xc3\x9f\x71\x21\xf7\x46\x6e\x9d\xb9\x13\x21\x05\x22\xd7\x92\x95\x9f\xb5\xde\x61\x7c\x1e\x5f\xaf\xad\xae\x57\x07\x04\x72\x70\xba\xa8\xff\x60\x2e\xdf\x1e\x30\x36\xa4\x6c\x93\x49\xb3\xaf\x9f\x58\x5c\x4c\xa8\xa6\x24\x96\xc6\x80\x83\x1f\xd4\x58\x2c\x5f\x8c\x19\xff\xb0\x66\x6d\xa2\x9b\x0f\x6a\xf5\x39\x97\x0b\x9a\x23\x00\x44\x78\xbb\xf4\x4e\xc7\xc1\x74\xf1\xa8\x31\x67\x9c\xd2\x68\x9d\x8c\xce\xe4\xa3\x26\x17\x28\xb5\xc0\xb4\xac\x21\xe5\x17\xcb\xe0\xa2\x22\xca\xb5\xae\x0e\x60\x66\xe1\x93\xc8\xa1\x7a\x44\x14\xb4\x9f\xb9\x7d\x0b\xe5\xf4\xec\xc3\xc2\x4f\xe5\xf2\x03\xd4\xa6\xc4\xfb\x2b\x54\xf4\x04\xa4\xb8\x92\x3c\xe2\xa6\x77\x7a\xf0\xc8\x24\xab\x72\x07\x79\x26\x8f\xce\x1e\xf0\x04\x83\xb4\x46\x59\xec\x31\x85\x0c\x02\x69\x91\xd7\x69\x45\x9c\x5d\xba\xc4\xe2\x2a\x58\xb6\xa2\x61\x3f\x0e\x0c\xa0\x68\xb2\x90\x75\x0b\xe9\x95\xe8\x36\xa2\xc6\xb9\xfa\x6c\x57\xe8\x95\x26\x6c\x74\xf7\x96\x42\xc6\x6b\x0d\xcc\xd6\x78\xce\xb0\xca\xcf\xb7\xe4\x54\x0e\xdf\xe4\xda\xd0\x82\x62\x19\x93\x3b\x92\x9d\x69\xfb\xc3\x70\xaf\x90\xe3\xd8\x17\x75\x3d\x6a\x5a\x0f\xc3\x1b\x46\xdb\xb0\xd6\xbb\xda\x9d\x23\xda\x3f\x98\x25\xaa\x48\x36\xec\xca\x3b\x40\xaf\x55\xdb\x5d\xa9\x7d\x76\x73\x1f\x46\x89\x5f\xcd\x90\x5c\x0d\x6b\x8e\x0e\x82\x55\xb1\x2b\x30\x9d\x2b\x45\x6f\x4d\x76\x2c\x0f\x79\xb8\x7e\x72\x82\x35\xc0\x43\x26\x1b\x63\x32\xbf\x45\xce\xec\xa5\x1d\xc1\xc0\xa2\xdf\xb1\x5c\x0e\x38\x82\xe4\x9a\x6a\x34\x76\xb9\x25\x80\x22\x9a\x98\x10\x83\xd2\x1a\x44\xb7\x81\xa0\xc0\x63\x15\x51\x5b\xc3\xaa\x85\x91\xac\x74\x4d\xc6\x7c\xbc\xd2\x9b\xa2\x5a\x03\x37\xad\x1f\x24\x66\x4e\x54\x11\x48\xa1\x6b\xde\xdf\xc5\x91\x5f\x25\x40\x53\x8a\x70\x56\xac\xd9\x6a\xde\x03\x70\xc4\xed\x94\x45\xb9\x1b\x8e\x3a\x62\xf9\xfa\x95\x6c\x0c\x1e\x12\xe8\xfb\x91\x57\x09\xb7\x9a\xc4\xe0\x23\x6a\xab\x71\x22\x17\x8a\x33\x60\x41\xd0\xae\xe5\xe3\xeb\xe2\xb3\x8e\x44\x7e\x14\x1f\xc0\x34\x8e\x78\x6f\x83\x84\xb7\x90\xb3\x84\x75\x4d\x51\xa1\x0e\xc8\x50\xd4\xf8\xac\x3a\xe0\xa8\xfc\x46\xb8\x53\x0c\x85\x04\x24\x9d\x53\xbe\x22\xf0\x63\x24\x57\x27\x17\xe2\x72\x7a\xf3\xc9\x99\x2b\x37\xd3\xf1\xe8\x72\x34\xc4\xc4\x64\x76\xcc\x7d\xe3\x83\xc1\x63\x8f\xef\x34\x96\x7c\x09\x3e\x4b\x45\xe3\xf9\x5d\x9e\x8e\xa6\x80\x4c\x2f\xaa\x06\xa1\x94\x74\xec\x40\x54\x65\x29\x22\x6f\x3a\x44\x51\xf8\x49\xf3\xa5\x95\xa4\xd5\x72\x51\x4a\xcb\xc8\x20\xb3\x85\x40\x4b\x04\x29\xd1\x7c\x8c\x20\x57\x95\x64\x98\xaf\x20\x8e\xce\x02\x19\x36\x3c\x55\x92\x29\xe4\x66\x14\xfc\x6a\x76\xba\x96\x0a\xf2\x98\x7c\x4c\x8d\xbe\x87\x69\x3b\xad\xf0\x27\x44\xce\xba\x74\xb0\x91\x98\x03\x07\x48\x88\x4a\x17\x38\x33\xd1\xb7\x4d\xc8\x19\xf2\x44\x8d\x98\x77\xb6\xdf\xf8\x68\xcd\xb9\x04\x1a\x7f\x11\xa5\x88\xb6\x12\xe2\xfa\xa6\x77\xd2\xb7\x8d\xa0\x09\xac\x4d\x7a\x72\xdf\x08\xa1\x4e\x7c\xbc\x3f\x8a\x42\xd1\xae\x32\x05\x74\x3b\x42\x64\xd3\xb0\x4d\x14\xd4\x11\x5c\xd1\x64\x65\x9b\xa7\x18\xe2\xee\xf0\x29\x4a\x41\x5e\xc6\x5d\x53\xe8\x95\xf6\xdf\xd4\x9f\x43\xd3\xd1\x02\x1a\xef\xbf\x62\xbc\x63\x0a\xda\x8a\x28\x68\xeb\x73\x4c\x0d\x51\x0f\xac\x75\x5d\x30\x74\x73\x77\xeb\xdc\x57\x1a\x06\xf9\x6b\x8c\x58\x46\x11\xa7\xc4\xfd\x4b\xc9\xa6\x29\xf1\xae\xd3\x10\x61\xe3\x02\x65\x11\x9c\x69\x63\xb5\xa0\x81\x44\x09\xf9\xdd\xa3\x78\xac\xbf\x50\x2a\x23\xcb\x8c\xe0\xbb\xf3\x79\x17\x5b\x53\x6b\x41\xb5\x66\x0f\x3a\x48\xd9\x20\xb8\x31\x91\x6e\xab\xbb\x58\xc8\x98\xb8\xdc\x50\x08\x18\x70\x24\x4f\x84\x58\x9d\x04\x79\x82\xb3\x53\x29\xe9\xd8\x46\xeb\x00\x54\xef\xb1\x2b\x56\x1d\x1e\x45\xa1\xc8\xe7\x17\xa5\x2f\xb4\xba\x23\x47\x7c\xdf\xa8\x8b\x4a\xea\x2f\x24\xfe\x36\xa6\x16\xc0\xc9\x8c\x59\x09\xcf\x89\x3b\xde\xc2\x63\xa8\x10\xf6\x97\xaf\x6e\xed\xb4\xd3\x51\xf0\x7e\x85\x2b\x75\x71\x02\x09\xe6\x98\x78\xe0\x15\x1d\x20\x5f\x51\x3e\x7b\xfd\xb9\x4b\x69\xc5\x39\x0c\xe7\x02\xef\xe6\xd3\x57\x0d\x81\xfd\xa8\xc6\x2f\xbd\x71\xcc\x4f\x7a\x08\xf0\xc8\x51\x85\xae\xdc\xaa\xd5\x7d\x51\xe9\xd3\x5a\xab\x35\x0c\x2a\x92\xe1\x19\xa7\x3c\xee\x6d\x23\xfa\x58\x20\x9f\x1a\xb6\x4c\x86\xfd\xb3\x34\x75\x06\x57\xb0\x3b\x16\xa0\xf8\x8c\x11\x3d\x10\x6c\xed\xde\x3d\xba\x86\xb2\x49\x9f\x1f\xb0\x88\x1f\x1d\xf2\xbe\x24\x75\x93\x9c\x01\x6d\x8b\x46\xe7\xf2\x18\x52\xb9\x54\x88\xed\xc0\xb5\xc5\xd7\x52\x00\xae\x98\x3b\x89\x95\xa9\x56\x66\xeb\x4c\x8a\x02\x51\x46\x43\x7d\xe8\x89\x10\xef\xbc\x43\x8a\x69\x43\xb2\x30\xbe\x78\x38\x58\x85\xe2\x3d\xf3\x1a\xa7\x4b\x9f\x48\x00\xb3\x95\x93\x20\x18\x00\x86\x60\x63\xa9\xd1\x26\x7c\xd0\xb5\xbc\xb5\xba\xd2\x90\x38\xc4\x11\x91\x34\x70\xef\x4b\x19\x80\x1c\x26\xb9\x59\x10\x5f\xf4\xb8\x1a\x98\x9c\xf4\xd4\x71\xc4\xdc\x0a\xbe\x0a\x98\x03\xe6\x2e\x9b\x05\x2b\x09\xcd\xcf\x54\x3c\xf2\xdd\xf4\x77\x84\xe4\x8b\xb2\x22\x60\xad\xfb\x33\x1b\xa5\x81\x74\x44\x13\xa2\xc3\x29\x2a\x31\x8e\x0a\x71\x8c\xf8\xdd\x83\x28\x2c\x60\x1f\xb2\x90\xa8\x03\xe4\x87\xe0\x07\x80\x1f\xef\x9e\x21\xa9\x16\x42\x31\x82\x27\xf7\x65\x5f\xaf\xf3\x40\x0b\xc6\x12\xda\xd7\x35\xfb\x3c\x69\x5f\x70\xe2\x4d\x58\xb6\x46\x64\x94\x01\xdd\xdc\x8b\x27\x64\xb6\xcf\x8e\x66\x7b\xab\xa8\x23\x0c\xe6\x08\xf4\xd9\x27\x4c\x0b\x84\x55\xa7\x11\x11\x6e\x65\x51\xe1\xd9\x0b\x98\x98\xce\xdc\xc3\x1a\xef\x5d\xa9\x8a\xaa\x3c\xbc\x41\xdf\x67\xad\x53\x9f\x01\xe9\x26\xde\x90\x4b\x0a\xa5\xc0\xec\x52\x75\x93\xda\x7a\x5d\x31\x15\x27\x6e\x37\x29\x89\x24\x87\xc3\xd6\x24\x2c\x44\x8b\x4c\x21\xaa\x75\xd7\xeb\xf8\x41\xe5\x4d\xa4\x97\x8f\x72\x4f\x9a\x58\x65\x12\xa0\x14\xd3\x12\x38\x53\xb0\x3c\x44\x7e\x5f\x65\xc3\x48\x9f\x7c\x34\x01\xeb\x0e\x31\x41\x1f\x0d\xd4\xeb\xdc\x19\xa9\xee\xb5\x5a\x33\x35\x4d\xf0\x04\x30\xf6\x45\xf5\xa2\x91\x0d\x26\x9c\xda\xc6\xec\x64\x6c\xfc\x61\x12\xec\xbd\xaa\xc9\x9b\xb2\x51\x90\xf4\x94\xff\xe1\x79\xfd\xaf\xfb\x27\x7f\x39\xbc\xbd\x19\x9f\x9e\xe7\xe7\xff\x38\x1f\xf0\x57\xf0\xdf\xce\xbf\xff\xee\x75\xdb\xff\xfb\xc3\xd9\xd9\x1f\xfe\xdf\x7f\xc6\x9f\xe1\xbe\x36\x3b\xad\x2a\x79\x5b\xb9\x47\x37\x86\xc4\x5a\x69\xf9\x4b\x0e\xe0\x90\xee\x88\xc8\xe3\xd5\x09\xc8\x3f\xff\x8d\x4b\xc6\xe5\x02\x00\x38\x21\x40\x3b\x79\xbe\xbd\x63\xd7\xc0\x91\x6b\xee\xe8\x24\xce\x15\x70\x3f\xfe\xe8\x8c\x19\x53\x07\x9e\x85\x63\x60\xb7\xdd\x80\x61\x00\x58\x1e\xbe\x82\xcc\x76\x5f\xe6\x76\x12\x16\xf5\x08\x8f\x73\xcc\xb7\xec\x7a\x49\x58\x72\x94\xc7\xdb\xb5\x3d\x0f\x3d\x82\x2e\x30\x2a\x93\x5e\x8b\xe3\x34\x43\x1f\xde\xab\x3d\x3a\x60\x01\x2f\x08\xfd\x35\x8a\x3c\x8b\x3e\xfb\x3a\xad\x7d\x61\x70\x79\x37\x98\x13\x46\x33\xe2\x1c\x3a\x58\x87\xdf\x31\xc5\xc0\xc4\xe5\x59\x56\x7a\x56\xee\x5e\x01\x3c\xd5\x8a\xe0\x06\x82\x53\x86\x73\x19\xb7\x90\x93\xd3\x68\xd0\x22\x23\x68\x15\xd1\x01\x8c\x60\x73\x27\x19\x31\x96\x0d\xc3\xff\xf5\xa0\x6f\xc0\x01\xfa\x25\x3f\xcf\xcf\xe9\x63\x86\xa8\xa9\x51\xd5\xa2\x45\xf3\xae\x0b\xa7\x7b\x4a\xf0\xc4\x63\x28\xb4\x22\xb2\xfd\x2e\x60\x89\x6b\x98\xeb\x56\xe5\x95\x9b\x32\x21\x1b\xb9\x1f\x8d\xaa\x64\xa1\x32\xd9\xe7\x8e\xf2\xbe\xe0\xf0\x0b\xd7\x3d\xda\x20\x58\xfd\x7b\x1a\x18\x2c\x56\xfa\x4d\x7a\xbe\x84\xc0\xdf\xa6\xdb\xd7\x62\x61\x7d\x43\x3e\xc8\x1e\xe4\x60\xa2\xe7\x0c\x7c\x04\x9c\x22\x1f\x65\xad\x75\x0f\x65\x96\xaa\x02\xc8\xec\x2f\x81\xd9\x1f\x42\xd2\x25\xc2\x89\x0f\xbd\x82\x8c\xac\xff\x94\x50\x04\x64\x2f\x98\x29\x05\xe3\xbf\x0a\xd6\xa0\x1b\xbd\xc5\xe1\x02\x21\x02\x82\x6d\xc4\xdc\x65\x2b\x08\x55\x2f\x35\xc3\x30\x74\x68\x0d\x45\x04\xef\xd4\x39\x26\x6d\x34\x7a\xcb\x2e\x05\xaa\x53\xe1\x33\xcd\x09\x3c\x02\x8f\x71\x7c\xe5\x5a\xf0\x22\x68\xce\xee\x74\x45\xd8\x55\x7d\x9d\xfa\xe2\x03\x67\xd2\xd6\x6b\xf2\xbe\x95\xca\x5a\xcc\x0d\x42\xf4\x15\x2b\x55\x7b\x29\x7e\xc6\x55\xa7\x9e\x01\x17\x10\xf5\x56\xdc\xa5\x08\xe8\x4e\x3d\xc6\x70\xf2\x01\x55\xa2\x72\xca\xd4\x16\x41\xdb\x50\x57\xf3\x68\xcb\xdf\xe5\xe9\x01\x83\x6b\xd4\x33\x7a\x3a\x22\x45\x63\x3b\x3b\xe5\x8f\x5f\x74\x02\xb0\x89\xfb\xfd\x56\x55\xc1\x32\xe6\x62\x73\x2f\x68\xbd\x24\x45\x7f\x96\x05\x77\xd0\x83\xae\x0a\x5d\x01\xf9\x99\xdc\x69\xb3\xc3\x04\x03\xdb\xec\xd7\x87\x90\xda\x7b\xf0\x9d\x86\xe3\x45\x1d\x63\xc9\xc8\x5a\x53\xeb\xee\x86\x53\xbc\x0a\x30\xaf\x35\xe2\xda\x17\x25\xd1\xfd\xc1\xa7\x44\x81\x88\x07\x8d\x07\xbf\x0f\xf4\x10\xcb\x43\x0c\x1b\xa9\x88\x1e\x93\x7c\x90\xa7\x09\x9f\x10\xce\x9a\xb9\x35\x7c\xa1\x0a\x67\x5c\x01\xe6\x9c\xbf\x76\xb6\xe7\xda\x21\x05\x03\xac\x4d\x10\x2f\xf1\x2d\x8f\x68\xa0\x8f\xed\x09\x4e\xf6\xa9\xfe\x9c\x2d\x45\x7a\xbf\x95\x69\xbb\x22\x6a\xb7\x65\x91\xc4\x25\xc9\x8c\x7d\x19\xe1\xd6\x75\x4e\x67\x6b\x11\x34\xd8\x94\x47\x9f\xcc\xfe\xe8\x1b\x46\xa7\x3e\x13\xdd\xc5\xde\xaa\x3b\xcd\x60\xff\x1e\xdd\xbc\xf7\xd1\x49\x17\xe4\x2a\xb6\xd6\x3d\x57\x76\xc4\xab\x82\xa3\x20\x67\x98\xd5\x20\xca\x33\x79\x57\x3c\xc0\x7f\x4b\x5d\x61\x22\x6e\x8d\xe0\x86\x59\xe2\xb3\xcd\xa2\xbd\x81\x7f\x82\xad\xec\x4c\x3b\xae\x9d\x0e\xeb\x46\x75\x5b\x5e\x24\x66\xc2\x54\xa7\x65\x81\x7c\x11\x66\xb3\x81\xbf\x67\x2d\xcf\x03\x4b\xa3\x50\xa3\xa6\x56\x2b\x7a\x67\xa0\x8e\xc2\x5a\xe4\xf2\x14\x4c\x35\xa3\x4a\x2c\x45\xa6\xa0\xed\xba\xb0\x3b\x63\x91\x89\x22\x3c\x5d\x4f\xac\x39\x5e\xf5\x8b\x5c\xce\x57\x66\xe7\x95\x11\xb2\xee\xb9\xa2\x39\x96\xa4\x2b\x1d\x33\x40\x06\x5a\x44\xca\x2d\x04\x73\x17\x4b\x17\x4f\xb1\x76\x31\xae\x5b\xcc\x20\xbf\x09\x6a\xdf\x6d\xf1\xa0\x33\xe1\x5d\x10\x70\x59\x4b\x12\xb2\x08\x92\x99\xbc\x7d\x81\x56\x7a\xbd\x0f\x09\x3b\x41\xce\x3d\x00\x27\x8b\x28\x7a\xa4\x6c\xf4\x5c\xb2\xaf\x02\x55\x19\x8c\x9c\xc4\x3c\x30\x5c\xa8\x06\x2e\x58\x38\x7f\x59\xf8\x72\x60\xbc\xf7\xfa\x9a\x3b\x6d\x51\x99\x55\xd2\x6d\x16\x00\x06\xdb\xd2\x51\xb6\x5e\x22\xdf\x56\x74\xed\x3d\x48\x3e\xac\x50\x9c\xff\x9e\xc4\x87\xa1\xfd\xf0\xe6\x12\x48\x7b\xa9\x0e\x22\x3e\x4b\x74\xc2\xe8\x49\x4b\x9b\xc6\x6c\x67\x44\xab\xa7\x1f\x01\xb1\x78\x78\x92\x05\x3e\xc9\x59\x3c\x56\x5e\x94\x56\x4a\x72\x7f\x87\xd1\xe7\xdd\xe5\x22\x08\x10\xaa\x47\xfc\xea\x57\xec\x7e\x79\xca\x0a\x16\x1d\xcc\xa2\x7a\xe6\xab\xa0\xb7\x9a\xf0\x61\x82\x21\xd3\x5f\x74\xbd\x2a\x28\x29\x84\x43\x66\x2a\x03\x46\x1a\xc3\x70\x1c\x1e\xd9\x88\x09\x75\x2a\xf3\x08\xe1\x4a\x78\xce\x31\xe7\x17\xb1\x4e\x21\x83\xdb\xca\x8d\xaa\x79\xa9\xa2\x67\xd6\xbd\xba\xe8\xf0\xb1\xd2\x9a\x5c\x88\x51\xfc\xee\xa2\x53\x4b\xd7\xee\x7d\xab\x99\xde\x10\x89\xc7\xdb\xcc\x93\x40\x3e\x64\x41\xe5\xe4\x2d\x17\x3c\x11\xf8\x69\xd4\x42\xab\x46\x97\xa3\x95\xcb\x03\x0c\x27\xd6\x30\xe0\xd0\x78\xd6\x15\x38\x29\x7c\xf5\x48\x00\xe8\x95\xa9\xcc\xb6\x58\xf1\xd8\x60\xb4\xe8\x2f\x2f\x0b\xeb\xe3\xb1\x9d\x8a\xf8\x36\x0d\x5b\xe7\xf2\x4b\x7f\xf9\x49\xbe\x53\x26\x07\x27\x22\x13\x60\xed\xbd\x2e\x3b\x45\x12\x5f\x2d\x42\x26\x06\x3e\xd1\x23\xc1\xa2\x8b\xd6\xa3\xb5\xa2\x10\x7c\x95\xa7\xaf\x44\xe0\xd7\xf3\x2a\x4c\x6b\xd2\x90\x58\xef\x8b\x0f\xa8\x79\x8f\xa0\x09\xd2\x3a\xd6\x80\xdd\xe1\x42\x50\xd4\x8e\x06\xec\xd3\xda\x3b\x46\x56\xf2\x59\x68\xa7\x75\x44\x3c\x60\x76\x51\x09\xc6\x73\x83\x9a\xdc\x56\x0c\x22\xae\xdc\x88\x47\x15\x3f\x3b\x21\xae\x2a\x20\x15\x33\xfe\xce\x47\x1f\xd3\x6b\x5a\x74\x89\x5e\x37\x20\x30\x0a\xd0\x5a\x30\x32\x4d\xa6\x99\x48\x41\x31\x3b\x96\x1b\x50\x96\xdd\x07\x1a\x09\x92\x9f\x4e\xe4\x1a\x5b\x00\xa6\x11\x5e\x18\x67\xf7\xc5\x83\x77\x3a\xb0\xb2\x80\xee\xec\x6e\x2f\x79\x23\xe1\xbd\xf4\x4c\xc4\xca\xc6\xb0\x17\x61\xe4\xc4\xbe\xaa\xe1\xf0\x45\x72\xac\xab\x82\xf9\x31\xe1\x41\x79\x9d\xcb\x71\x94\xcc\x6b\xaa\x08\x3f\x5a\x4c\x08\x1c\xb3\xa8\x3a\xd6\x7a\x9c\x08\x45\x39\x2c\xe9\x6d\xa1\x95\x26\x0c\x63\xe2\xf2\x70\xd7\x02\x63\x00\x64\x54\x84\x84\xdd\x70\x21\xf8\x4e\x05\x90\x91\xe8\x12\x98\xc7\x4a\xd7\xb6\xf7\x6d\x8c\xfd\x1a\x99\xbf\xfc\x5f\xee\xd5\xde\x86\x2b\x60\x92\x94\x28\xb3\x11\xa8\x51\xc4\xf2\x2e\x5a\x0e\x90\xc2\x8d\xc1\xa5\xfa\x2e\x97\xd3\xa8\x6a\x35\xa5\xe2\xa1\xeb\x84\x21\xd2\x74\xc8\xc1\x30\x41\xa1\x93\xe2\x7a\x40\xa0\x34\x49\xeb\x52\xd5\x5a\xc4\xe5\xb1\xc5\x76\x67\xa2\xfc\x3f\x8f\x14\x23\xf1\x65\x88\x3f\x8a\x06\x64\x1a\xe2\x1b\x34\x41\x81\x84\x11\xbd\x49\x37\x0a\xc3\x18\x71\x66\x45\x52\xac\xea\xa1\x17\x4c\x2d\x3c\xe5\xa6\xf5\xb1\x77\xb4\x84\x4b\xff\xef\x34\xf9\x22\xd2\xb4\xe2\x0c\x0b\xa6\x25\xd5\xb5\x30\x1b\x8e\xc5\x42\x2a\x5e\xa2\x68\xa7\x10\x85\xfe\x02\x83\x3b\x28\xe9\x3f\x4a\xb1\x08\xfd\x61\xb9\x17\x00\x55\x74\xae\xfe\xbd\x7e\x69\xef\xf5\xd7\x8c\x95\x5c\x74\x87\x83\x49\x02\x80\x28\x95\x2a\x42\xdf\x90\xa0\xe0\x53\x94\x68\x10\x4c\xfa\xe9\x83\x17\xed\x2c\x85\xd8\x04\xcf\x85\xb8\x34\xbb\x43\xa9\x37\x8d\xb3\xaa\xf7\x56\xbf\x61\x39\xeb\x47\xf8\x95\xf9\x24\x64\x56\xad\xcb\x03\xd7\xe1\x6b\xba\x5d\x4b\x27\x84\x70\xe2\x57\x0d\x14\xae\xc4\x97\x6b\x53\x3d\x61\xf2\x04\xd1\x02\x69\xec\xce\x0a\x4b\x4b\x92\xda\xde\xb8\x00\x47\xd5\x75\xe9\xf9\xc8\xa2\x88\x5d\x40\x10\xb9\x8d\x5e\xcb\x16\xe3\x93\xf7\x64\x26\x3b\x7e\x0c\xf8\x01\x6e\xe7\x58\xd0\x9e\x30\xbe\x3b\xa6\x11\xb8\x47\x02\x6e\x27\x57\xa2\x17\x68\xc3\xf0\xe4\xea\x38\x90\x85\x8b\x28\x58\x54\x75\xce\x0f\x52\x62\x10\xe8\x3d\x4b\x84\xe7\xac\xc3\x4b\xe2\xd4\x46\xaa\xf9\xa7\x0e\xc5\x55\xf7\x50\x5c\xc6\x87\x22\x8c\x43\xf8\x83\xd0\xd2\xb1\xa3\x63\xc0\xe5\xc8\x5d\xf7\x89\x54\x15\xca\x52\xe0\xb7\x68\xd5\x49\x2b\x79\xe9\x09\xc0\x63\x57\x61\x61\xbf\x6e\xe1\x0a\x52\x7a\x9f\x3d\x3f\xdd\xe6\x31\x6d\x12\x7c\x82\x50\x25\x8a\x1f\x14\xb8\x4c\x99\x3c\xea\x19\xd0\x11\x4a\x2e\x9b\xe0\x2d\xb9\x0b\x8c\x7a\x22\xab\xea\x6a\xb7\x73\x66\xf5\x17\x91\x3e\xf5\xb1\x43\x7c\x8e\x30\xc5\x4d\x8b\xe5\xbc\x07\xf4\x40\x47\x43\x17\x7c\xbe\x99\x37\x0f\x85\xd8\x7d\x61\x5f\x42\xd5\x7b\x3f\x66\x42\xe2\x79\x8d\x3e\xc3\x02\xb1\x3b\x51\x4f\x8b\xad\x9d\xb1\x95\x0b\x71\x13\xf1\x11\xa6\x6e\xae\x8f\xf7\xba\x4a\xf3\xbc\x3a\x82\x05\xc1\x02\x63\xc9\xc2\xe2\x21\x66\x24\x2e\x22\x1e\xee\x6f\xd2\xe8\xd0\x9b\x1a\xa9\x61\xfd\x3a\x54\xe1\xf5\x52\x96\x33\x1d\x25\x4a\xb4\xaa\x53\xfb\x74\x28\xad\x83\x0e\x25\xbf\xa6\x43\x89\x48\x87\x1a\x83\x03\xe2\xc6\xa7\x11\xbd\xe9\xf7\xb1\x92\x66\x10\xca\x15\x65\x63\xbc\x09\x0f\xef\xaa\xa8\xd4\xd6\xa9\x9a\xe1\x91\xcd\xa4\xd5\xf5\x43\x01\x84\xbe\xf0\x4f\x53\x03\xe2\x70\x4b\xf7\x00\xa8\x26\x4e\xac\x08\x6e\xd8\x0d\x48\x11\x5f\x97\x05\x55\xa9\x7b\xdb\x98\xad\xb3\x32\x20\x9a\x52\x31\x6c\x0e\xeb\xb2\x98\x61\x92\x6a\xd1\xd5\x5a\xb0\xb3\x20\xa8\xbc\x15\x3b\x89\xfb\x34\x60\xd4\x96\xbe\xcf\xe5\xe5\xbd\xc2\xd6\x06\xc8\x5e\x78\x5f\xec\x50\x4b\xf2\x50\x06\x91\x6d\x58\x93\xd1\xc5\x4f\x64\x68\xb5\x57\xd7\x23\x63\x48\x78\x6a\x6e\x27\xfa\x9d\x72\x08\xa6\xd6\x7d\xb1\xc5\x1b\x53\x87\xf4\xb9\xc6\xf8\x1f\xe3\x3b\xab\x1a\xd6\x03\xee\xf1\x28\x88\x9d\x79\xa4\xdf\x32\x99\x70\x0b\x6f\x28\xc8\x5e\xc0\x50\x8b\xbc\x95\xdf\x32\x83\xd4\x27\x4f\x7d\x03\x83\x87\x15\x71\x7c\xce\x69\x71\x7f\xc3\x54\xe0\x74\xfe\xde\xa9\x00\xa4\xf7\xa7\x18\xcd\x50\xb7\x04\x4b\x67\xcf\x08\x15\x94\xc1\x16\xa2\xc5\xb0\x02\xfb\x41\x07\x5a\xe4\x09\xc3\xf4\x94\x98\x7f\xc8\xa6\x66\x52\x57\xbc\x8b\xae\x71\xfb\x03\x20\xbc\x90\x06\xe9\xce\xd7\x47\xca\xe6\xc3\xd3\xc5\x8a\x00\x85\x1c\x10\xef\xf9\xce\xe9\x04\x59\xf0\xc8\xd3\x65\x37\x7b\x5b\x1e\xdc\x1b\x5e\x9b\x07\x5c\xef\x6a\xbf\xd5\xb5\xd9\x5b\xb1\x8a\xe6\x03\x84\x43\x5c\xd7\x22\x37\x45\x85\x45\xcb\x1e\x50\x7e\x0b\x94\x56\x9c\xd2\x4d\x09\x27\x54\xb5\x07\xd5\xe1\x47\xcb\xfd\x1d\x00\xbd\x02\x39\x68\x40\x19\x6a\x0e\xe8\xa8\x0c\x61\xab\x00\xcc\x91\xfb\x44\x32\x32\x1c\xf0\x36\x67\xfd\xb6\x75\xc7\x9f\x8e\xae\x21\x79\xa4\xac\x2c\xec\x91\x58\x2a\x5b\xa0\xba\xcc\xcc\x1e\x41\xef\x66\xef\x2a\x30\x4c\x45\x8c\xc7\x61\x5f\x82\xc7\x8e\xf9\x2f\x22\xcb\x6d\xab\xeb\xd5\xbd\xaa\x1a\x85\x9a\x48\x26\x37\x45\x03\xd1\xc4\x0d\xa6\x44\xfa\x64\x9d\x88\x99\x39\x10\x43\x46\xab\xa4\xeb\xda\xd4\x36\x73\x67\x70\x5f\xab\xd5\x01\x5d\xac\x31\x74\x1a\x64\x52\x3e\x8d\xfd\x67\x29\x13\x07\x82\xce\x11\xde\x8e\xa7\xab\x88\x42\x43\xdf\x77\xc2\xd8\x14\x5d\x5f\x27\x67\xcb\x67\x8a\xc2\xea\x05\x8f\x75\x84\x0f\x96\xda\x38\x2a\xe8\x7c\x82\xfd\xbc\xde\x2c\x04\x0e\x5f\xcf\x30\x95\x9a\xe2\x3f\xb6\x8f\xf5\xb8\xa0\x15\x15\x62\x88\xf2\x9d\x43\x5e\xca\xe2\xa6\x3d\x16\xe5\x66\x5f\xca\x6d\x61\x5d\x9f\x7b\xa4\x2e\x46\x8a\x73\x1b\x70\x35\xc1\x66\x01\xa9\x41\x8e\x73\x81\xfe\x72\xdb\x76\xd0\x15\x90\x6b\x29\x2b\x43\x1c\xbe\x5d\xea\x7a\x6c\x33\x46\xea\xcc\x84\x47\x4c\x83\xb0\x23\x30\x75\xf3\x10\xa2\x73\x95\x49\x46\xbd\x73\x67\xaf\xb5\x6e\xc6\x47\xeb\x3b\x59\x04\x9d\x93\x17\x19\xe8\xa1\x23\x37\xbe\xd2\x58\xe8\xf1\xce\x98\xb5\x9b\x4a\x26\xe0\x7e\xda\xc6\xec\x76\x80\x7e\x11\xb0\x9d\x89\x6f\x1f\xdc\x5e\x25\x87\x1e\x32\xdf\x02\x40\x5c\xd3\x8c\x43\x9a\xa7\xf0\xdc\xf1\x0f\x1a\xf0\x8f\x92\xc5\xf3\xd6\x9c\x5a\x3f\xa0\x67\x96\x80\x8f\x00\x30\x07\x55\x74\x36\x5e\xb1\xa1\x28\x3d\xb0\xbb\x0d\x61\xe9\xf1\x62\xbb\xf3\xbb\x07\xc5\x87\x89\x2b\x4a\x3e\x1d\x40\xff\x24\xc8\x7f\x0b\xed\xbb\x1f\x04\x4c\xd3\xf4\x94\xfd\x94\xcb\x41\xb0\x53\x42\x29\x9d\x10\x48\x63\xd4\x41\xcb\xed\xf8\x58\xda\x56\x62\x16\x65\x6f\x53\xaa\xb8\x13\x9e\x1e\x88\x4a\xf5\x74\x07\xc9\xbb\xce\x84\x22\xb8\x0c\x4e\xfb\xa6\x4c\xef\x8c\x9e\x21\x66\x9c\x25\xbf\x76\xe6\x6f\xa3\x2f\xb9\x76\x7f\xf5\xf5\x82\x61\x49\x12\xa7\x08\xea\x6f\xa4\x4b\x81\x60\x4f\x20\x5d\x52\xcd\xdd\xef\x49\x51\xd1\x20\x80\x01\xc3\x2d\x6b\xd4\x28\xcc\x19\x62\x09\x10\x79\xab\x02\x82\x21\x14\x31\x11\x8a\x21\x11\x7d\xc0\x8f\xad\x29\xc1\xcf\xb3\x73\xbd\xb3\xa0\x04\x4b\x92\x3f\xce\xfa\x7a\xf7\xa5\xa5\xa3\x88\x93\x8c\xde\x59\x02\x01\x77\xbd\x17\x9b\xa4\x32\x5d\x44\x15\xe9\x5c\xa4\x9e\x56\xa6\xc7\xba\x4b\x28\x4e\x67\x40\x10\xbf\x90\x45\x05\xbc\xbb\x6b\xb1\xc4\x85\x06\xf1\x64\x01\xbf\xbb\x86\xd4\x8a\x3b\x55\x54\x96\x72\x74\xe2\x36\x99\x1b\xd7\xad\xcf\x27\x2e\x07\xc4\x05\x05\xbe\xeb\x03\x7e\xc5\x8b\x57\xd7\x73\x38\x28\x7e\x00\x94\x77\x72\x96\xcb\x81\x3f\x11\x2d\xe9\x81\xaf\x7e\x4a\xc0\x9c\x78\x0b\xc8\x7e\xe4\xce\xdd\xd0\x56\x65\xb1\x42\xb8\x67\x78\x24\x8b\x95\xa9\xe4\xd1\x08\x97\xef\x48\x50\x0e\x4f\x78\x52\x97\xa6\x69\xcc\x16\x3d\x13\x8f\x45\xb5\x36\x8f\x1c\x9a\xe2\x5b\x02\xfc\x20\xed\x8e\x4d\x2d\x96\x07\xa9\x36\x9b\xa2\xde\xa2\x95\x54\x59\xe6\xf5\xf1\xfb\x49\xe4\x2a\xf2\x51\x1d\xf8\xd0\x99\x7a\x1d\x58\xe9\xc1\x93\xb8\x2f\xb1\x5c\x32\x8d\xcb\xe4\xf2\x32\x9a\x07\xd6\xa0\xac\xa0\x92\x81\x1c\xd7\x54\x31\x54\x6a\x85\xea\x5a\x51\xd7\xfa\xc1\xc0\xf7\x85\x6a\xad\x67\x34\x6e\x76\xea\x41\xd9\x82\xed\x65\x35\xcb\x85\x88\xf8\xed\x01\x66\xc9\xb7\x7d\x48\x20\xb1\x7f\x47\xa3\x6e\xb5\x28\x22\xc4\xc8\x07\xad\xd8\x47\x63\xe0\x30\x2d\x0f\xfe\x19\xbf\x68\x8f\x1e\x61\xc7\x04\x59\x77\x9d\xf7\xa4\x89\x03\xfe\xcb\x03\x34\xd7\x17\xf7\xe7\xf4\xa2\xab\x24\x0b\xbf\xcf\xbf\x15\x1a\x79\x36\x8e\x87\x2c\xfb\x72\x14\xd5\x32\x24\xb1\x4b\x08\xac\x41\xd6\x10\xbd\x9a\x5f\xf7\xac\xc5\x5d\x2e\x0f\x54\x4d\x60\x36\xc4\xe2\x6a\xaa\x62\x25\x56\x7d\x43\x3d\xde\xc4\x05\xa5\xcb\x03\x8a\x62\xaa\xc6\x66\x58\xa7\xd0\x34\xba\xee\x45\xad\xb7\xa6\xd1\xb2\x34\xd8\xd8\x09\xbb\x72\xc3\x20\x9d\x16\x58\x69\xa2\x8e\x5d\x17\xaa\xd5\x91\x92\x8f\x7a\x69\x8b\x46\x9f\x60\xde\xb5\x87\x89\xf2\x71\xa7\x24\x96\xeb\xfe\x1a\x57\x7e\x10\x54\x55\x44\x8a\xef\x2f\x83\x28\xd5\xa3\xac\xf5\x9d\xaa\x7d\x54\x39\x8a\xb4\xb5\x9d\xd0\xf7\xda\x5d\x36\x59\x78\x9a\xd5\x10\x64\xc9\xfc\xcb\xb5\xce\x9c\xe6\x50\xeb\xb5\x27\x79\x80\x78\x79\x27\x15\x8b\x76\xf6\x22\x97\x0b\x4a\xb6\xef\xba\x15\xa3\x50\x5b\x34\x86\xd6\xd1\x0e\x96\x6c\x1b\x8b\x35\x2e\x2f\x10\xe0\x85\x73\xc7\x63\x59\x83\x1c\x6f\x0d\xc7\xe3\xab\xf4\xb9\x0c\x11\x60\x5c\xf9\xb6\xdd\x91\xf6\xf5\x03\xa1\xc3\xc4\xf5\x45\x87\x31\xca\x6a\xb9\x07\x2f\x03\x95\x2f\x24\x87\x44\x24\x23\xe9\x58\x24\x51\xe2\x3f\x96\x20\xa0\x16\xfa\x74\x09\x82\xf0\x02\x30\xb1\xff\xce\x5f\xe5\xf2\xba\xb0\x2b\x5d\x96\xaa\xd2\xce\x56\x13\x1f\x49\x37\xdc\xd5\xfa\x2f\xfb\x75\x81\x32\x8d\x45\xc4\x4f\x68\x3f\xa5\x27\xc1\x83\xce\x30\xd0\x14\x31\x12\x06\x15\x65\xa9\x9b\x47\x4d\x59\x9f\x9e\x5d\x3f\xcd\xa4\xf5\x16\xb9\xdf\xbc\x5c\x08\x82\xf5\xdd\xc5\x3e\xb5\xb8\x67\x88\x9e\x21\x12\x1c\xe4\x1d\x22\x1f\xa8\x8e\x94\xbd\xf4\x60\x93\x9f\xd4\x6f\x14\x62\xe0\x43\x93\xd0\x4a\x81\xaf\xa7\x6f\xc6\xeb\x9a\xc9\xc1\xb7\x42\x61\x75\x22\x9d\x82\x30\x3c\xd6\x37\xdd\xeb\xd4\xd4\xfb\x90\x2f\x09\xe6\xec\x16\x6b\x47\x94\x0d\x31\x6a\xc1\x31\xea\xa2\x21\x44\x3b\xc0\x04\x0f\xd3\xa0\x80\x7a\x92\xc4\x4c\x5e\xaf\x18\xbf\x8d\x95\x36\xc0\x47\x6b\x8a\x55\x00\x72\xa3\x01\x54\xfa\xd1\xff\x4c\x74\xc5\xbc\x01\x8d\xb7\x21\x0e\x40\x0f\xc0\x88\xf7\x95\x1d\x5f\x99\xb7\x1b\x6a\x8d\x3e\x2c\x38\xa5\xf6\x9b\x53\x84\x72\x39\x89\x86\xd1\xbe\xd9\xbc\x78\x01\xc9\x0c\xa1\x50\x99\x2a\xb5\x85\xf8\x26\xc4\xa0\x2c\x7b\xa7\xdc\x99\x1e\x94\xa8\x3d\x84\xe1\xf4\xac\x66\x86\x58\xee\xa1\xda\xf3\x41\x95\x7b\x9d\xfb\xd3\xea\x14\x1f\x00\xcf\x55\xeb\x07\x67\x9f\xdf\xf9\x19\x77\x47\x40\xda\x67\x51\x3b\x2d\xde\x7b\xf1\xce\x5f\xe7\xf2\x4f\xfb\xba\xb0\xeb\x82\x48\xa8\x06\xa0\x1e\x36\xcc\xb0\x58\x6b\xbb\x2f\x1b\x0f\x66\x8e\x32\x9b\x92\x0b\x23\x51\x18\x2a\x67\xbc\x1d\x28\xe2\xfb\xd5\x37\x39\xcc\x45\x4c\xf1\x6d\xdd\xc5\x0a\x50\xf4\xb4\xf8\xa2\x45\x93\xf0\x97\x68\xc0\xd2\x3b\xc1\xf7\x68\xae\xff\x69\x6f\x9b\x22\xe8\x90\x9d\x44\xfb\x42\xdb\xcc\x29\x0f\xa5\x02\x88\xf5\x47\x04\x83\x64\x65\xe3\xd5\x8f\xfc\xc5\x85\xd3\x21\x0e\x81\x84\x81\xdf\x9d\x6e\xe6\x7e\xde\x59\x34\xb6\x84\x79\x05\x6e\xb8\x34\xb6\x05\xea\xd8\xbb\xe5\x78\xbc\x7f\xf7\xaa\xf3\x41\x0d\x6b\x25\xd2\x70\x7b\xdf\xaa\x39\xa9\xa8\xc1\x52\x02\x90\xf2\x90\xb8\x10\x6c\x93\x5a\xdb\x62\xad\x19\x02\x11\xa1\x39\x9d\x7e\x87\x5c\xd5\x07\xb9\xdc\xdb\xa2\xd2\xd6\xd2\x79\xfa\x2e\x97\x83\xa0\xc3\x8e\xd5\x23\x39\x5d\xd2\xc8\xc4\x52\x13\xb3\x59\x38\xfe\xee\x85\x6f\xef\x19\x96\x3f\x70\x02\x30\xe3\x55\x76\x07\x27\xc9\x3e\x87\xd4\x23\x7d\xe7\x8c\xbf\x1a\x2c\xf4\x8d\x3f\xe8\x0b\x0f\x79\xf2\xdc\x20\xde\xea\xf2\xae\x50\x15\x26\x21\x6d\xde\x08\x71\x0a\xfe\xcd\x64\x63\xb5\x95\x7f\xc5\xc9\x16\xf1\xc9\xfe\xd9\x35\x9c\x2a\x31\xdf\x70\x32\x60\x8a\x95\xa1\x49\x93\x5b\x25\x4c\x57\xe0\x74\x65\x01\x20\xf5\x52\x3d\xb1\x8c\xee\xb4\x72\x7c\x4b\xf4\x04\xc9\xec\x11\x59\x28\xa4\x2e\xf2\xd5\xf8\x0e\xeb\x0f\x54\xad\x31\x47\xf1\xf4\x19\x16\x78\x79\x0c\xbf\xbb\x19\x9f\xc8\x87\x5c\x5e\xd0\xe7\x81\x5a\xc9\xe7\xc6\xfa\x8f\x4e\xe7\xf4\xb1\xfc\x3c\x73\xff\x7d\x95\x9f\xd1\x17\xdc\xdc\x5b\xe5\x2f\x56\xbb\x8f\x9c\xfb\x8f\x0c\x57\x65\xb1\xb3\xfa\xd9\xcf\x5c\xea\x95\xbb\x1b\xd0\xc5\xd9\x3f\xa4\xcc\x2e\x7f\x39\xbe\x81\xfa\xaf\x57\xea\x1f\x56\x00\xf6\x7c\xfd\xd7\xeb\x8b\x1f\xce\x5f\xb5\xea\xbf\x5e\x9d\xbd\xfe\x03\xff\xeb\x9f\xf2\x07\xb4\x7f\xb5\xd0\xbf\xca\x9b\xda\x80\xf4\x4d\xcf\xa3\x10\xff\xed\xf4\xf9\xff\x09\xe1\x4e\x90\xfc\x85\xb4\x09\x77\x92\xa4\xdb\xca\xd3\xf3\xb3\xd3\xb3\x73\x19\x03\x88\xfd\xf4\x93\xfb\xcd\xc5\xe9\xd9\x6b\xec\xf3\x15\x77\x9a\xe2\x7e\xf5\x02\xc0\x7c\x0d\xec\x2b\x30\x89\x01\xea\x57\x5a\x22\xb2\xe9\x01\xff\x12\xe2\x66\x36\x1c\x5c\xbf\x1d\x0f\x85\xf8\x6f\xf4\x87\xac\xa1\x67\xd6\x43\x1e\xbb\xd9\x9e\x70\xe5\x04\x3f\x25\x69\x65\x12\x16\x36\x80\xad\xe3\x9b\xfb\xec\xa4\x75\xe9\x2d\xac\xa5\xb3\xa6\xf1\x37\xc4\x75\x8c\x29\x52\x29\x16\x4f\x0a\x9a\x1d\x4d\x96\xbd\x61\xe0\x46\x36\x9b\x08\x46\x11\xdc\x68\x69\x8c\xcf\xc9\xf0\xf0\x01\xa6\xec\x0d\x3d\xe5\xd1\x13\xe3\x2b\x83\xa2\xd8\x48\x79\x00\x22\x24\xac\x6c\xd9\x20\x61\xef\x23\x05\x79\x16\xfa\xd7\xd3\x5a\x97\x10\xc1\x88\x68\xdf\x92\x99\x9d\x44\x0c\xa6\x34\x19\xc2\x50\x10\x76\xeb\x9e\xb3\x34\xfa\xc8\x3e\xec\xa4\x9f\x7d\xc5\xbd\x34\xc6\x75\x4a\x7a\xbc\x25\x80\x8c\xdf\x3e\x7e\x18\x2e\x3e\x0c\x67\x80\xfd\xfa\x61\xfa\x51\x2e\xa6\xf2\x6a\x34\x5f\xcc\x46\x6f\x6f\x17\x43\xf9\x71\x3a\xfb\xf3\x5c\xde\x4e\xae\x86\x33\xb9\xf8\x30\x9a\x33\xbe\xdd\x8b\x0c\xeb\xe3\x32\x71\x07\x09\xc0\x05\x98\x19\x2b\xf2\xa3\x92\x77\x80\x70\x93\x6b\x0d\xfe\xf6\x6a\x4d\xc3\x84\x2d\xc0\xe8\x31\xd8\x9e\x08\xf1\x86\x34\x2b\x4e\x87\x6c\x7b\xab\x8b\x9a\x4a\xaa\xa2\xfc\x08\x5a\x72\x0e\xef\xf0\x0e\xe0\x60\xa2\xfc\x9c\xe8\x58\x71\xec\x90\x91\xae\xd3\x5a\xb2\x40\x9e\x24\x22\xa0\xfe\x27\x5a\xea\x45\xea\x47\xbc\xa8\xfe\x1e\x72\x21\x3e\xb2\xad\x9a\xdc\x5f\x58\xc6\x42\x3f\xe8\x38\xc4\xec\xfb\x84\x25\x46\x78\x22\x02\x7f\x83\xec\x87\xb5\xb3\xca\x39\xb5\x3e\x05\x2e\xe9\x1d\x59\x38\x0f\x54\x88\x06\x0e\x18\x34\x6a\x1e\xef\x55\xa3\x1f\x74\x2d\x1a\xbd\xba\x47\x42\x4a\xcf\x03\x88\x83\xf0\x47\xff\x11\x62\x09\xce\xac\xe7\xd2\x7b\x70\xd8\x60\x1e\x06\x39\xbf\x9d\xc6\x7a\x57\xbb\xbf\x92\x4e\x1b\xb9\xef\xa3\x25\x0a\x64\x2a\x48\x09\x60\xb5\x66\xf8\x0f\xb5\xba\x87\xf5\x80\x41\xdf\x19\x55\x62\xbf\x62\xab\x35\x1f\x08\x1b\x2f\x12\xac\xaa\xb3\x59\x54\xca\x07\x2d\x7f\x5b\x6d\xee\xee\xf6\xc5\x5a\xe7\x8d\xfe\xf2\x02\x16\xea\xb7\xad\x59\x87\x1f\x71\xc2\x69\x24\x51\x52\x84\x1a\x53\x4b\xbb\xbf\xbb\xd3\x96\xbd\xa3\x57\xc3\x77\xa3\x09\x53\xf9\xfe\xb7\xf0\x87\xf2\xe7\x7b\x64\x2a\xee\x59\xab\x72\x12\xca\x84\xac\x5e\xbf\x11\xe2\xb7\x8f\xa6\xfe\xfc\x02\x80\x30\x60\x83\x96\x3a\xc1\x60\xea\x45\xd0\xc8\xe5\x6f\xe0\xd7\xd4\x6b\x99\x7e\x1b\x73\x11\x03\xcf\x56\x2b\xe1\x1f\xaa\xf0\xea\x94\x77\x9b\x62\x48\xbf\xc5\x14\x3d\xd8\xe0\xae\x36\x2b\xbd\xf6\x30\x78\xe4\x2a\xf3\xa5\x7e\xd4\x79\x6f\x6f\xe0\xb9\x3b\x3d\x95\x89\xa3\xb0\x09\xfc\xec\xbe\x2c\x0b\x78\x29\x22\x28\x07\x55\x85\x40\x09\xb2\xaa\x5b\x6b\x56\x40\xc6\x1e\xdc\x46\xec\x8c\x55\xd2\x16\x77\x15\x8c\xba\x6a\x62\x80\x2c\x14\xa6\xd0\x40\xc6\xd9\xee\xfe\x0d\x34\x35\xb6\xd4\x62\x01\x41\xdf\x04\x94\x4a\x95\x14\x54\x86\x8c\x7f\x72\x67\xa8\xea\x6e\x8f\xac\xfa\xb8\x52\x87\x17\x40\xd9\x05\xd1\x38\xf5\xb7\x2f\x96\xdb\xd1\xe8\xe4\xbd\x60\x22\x88\x9e\xc2\xab\x28\xed\xc9\xed\xa1\x7b\xf8\x3d\x38\xba\xa0\xf1\x66\x7d\x54\x43\x79\xea\x7b\xf6\x64\xa2\xc7\xc0\x07\x62\x5b\x8c\x0e\x27\x82\x6b\xc3\xaa\x43\xe4\x7a\x8e\xe9\x60\x93\x51\x85\x8c\xf6\xe5\x01\xb7\xce\x43\xb4\xec\x6a\xd3\x98\x95\x29\x09\xa3\x44\x59\xf9\x6e\x71\xe3\x06\xf6\x61\x81\xff\x5d\x1e\x10\x51\x03\x51\xc1\xa4\x3d\xd8\x46\x6f\xad\x27\x1a\x99\xef\xab\x17\x56\x4e\x34\x52\xfd\xbf\x73\x1f\x99\xc3\x47\xc4\xf1\xe4\xdd\xfc\xc4\xed\xc9\x25\x17\x47\xd2\x7d\x68\x67\x82\x86\x5c\x4c\x1f\xd1\x85\x1d\xb3\xd6\xef\x34\xd2\x7f\xa1\x2d\x8c\x2a\x8f\x0f\xb5\xef\xb1\xf8\x0b\xaa\x16\x02\xb2\x0b\x0c\x81\x14\x00\x6a\x0c\x4a\xa0\x03\x5b\x84\x00\x0a\x53\x78\x1a\x55\x59\x12\x37\x8c\x5a\x15\x54\x0d\xe7\xfd\xa6\x64\x87\x52\x28\x03\x96\x8d\xfd\xe3\x36\x2e\x78\xf7\x64\xa8\x58\x59\xd6\xb7\x11\x51\xdc\x94\xd8\x46\x21\x03\x7b\x62\x1a\x3a\x99\xf1\xb1\x67\x30\xbc\xdf\x33\x40\x74\x28\x16\x0d\x64\x9e\xb6\x1b\x8b\x05\xca\x25\x40\x91\x36\xf2\x9a\x9e\x0b\x5d\xbb\x7d\xa1\xa3\x0a\x55\xb2\xe8\x27\xae\x0c\x83\xd9\x30\xbc\xa6\xbb\x9e\x51\xfd\x54\x2e\x30\xf9\xd5\x43\x40\xc2\x87\xf4\x17\x77\x7f\x00\x2b\xdc\xfb\xe7\xe1\x1d\xc0\xbd\x73\x5f\xfe\x2d\x28\xd0\x1f\x00\x3c\xe0\x85\x78\x4a\x34\xba\x01\xbf\x75\xaf\xc0\xc8\xd7\xd0\xe2\x70\x09\x6d\x06\xab\x58\xb0\xc8\x11\x02\x72\x6e\x20\xf5\x16\xaa\x73\x2b\xad\x99\x00\xb9\xde\x57\x4e\x8c\x21\x54\x1c\x35\x04\x77\x88\xf2\x4a\xd0\x71\xee\x81\xe8\xfc\x0c\xe5\x40\xb6\x7b\x47\x86\x14\xa8\xce\x16\x50\x94\x04\xd0\x55\x65\xbc\xed\xc4\xdb\x6a\x91\xe6\x37\xa5\xef\x4b\x12\x59\xda\x6d\x8b\x14\xaa\x07\x22\x0e\xdd\x0e\x30\xc2\x58\x1e\x98\x86\xc9\x9d\x88\xa2\xb1\xba\xdc\x00\x6e\x02\x50\x3d\x14\x8d\x28\x3c\x23\x7c\xa3\x6b\x38\x73\xba\x3c\xe4\xf2\x16\x93\xb9\x79\x9b\x9c\x22\xec\x21\x7f\x00\x76\x01\x64\x27\xeb\x10\x0c\x4b\x9b\xa4\x8d\x41\xd8\xbc\x2a\x93\xbd\xea\x2c\x53\x81\x14\xc2\xee\xf1\x3e\x7d\x07\xb7\xe6\x08\xe0\x2d\x99\x71\x5f\x4e\x27\x41\x9d\x1d\x01\x83\xc3\x95\xbc\x9e\x5e\x8d\xde\x8d\x2e\x01\xc8\x3f\x79\xc7\xbf\xf6\x07\x60\x32\x07\xfe\x62\xc5\x0e\x9c\x75\x4f\x60\xaf\x6d\x4a\xc5\xc9\x80\x02\x37\xcc\x03\x5f\xc4\xda\xc3\xcf\xd2\x73\x32\x9b\x7d\x03\x9e\x1d\x28\xd4\x5b\x99\x9d\x06\x68\xa2\x18\x2a\xc9\x49\x07\xaa\x14\xa6\xf3\x97\xe4\x92\xb9\x6e\x38\xef\x9c\x34\xdd\xca\xa4\x6c\x5e\xae\x1f\x60\xa5\x0c\x59\x62\xe0\xb9\x82\x00\xa2\x95\x21\x55\xc3\x97\xb8\xd2\x25\x8f\xc0\x2c\xe3\xd4\x5a\x1f\x77\xc9\x5a\x0c\x6c\x69\xbd\x06\x62\x85\xfa\xa8\x93\x28\xda\x4f\x94\xd9\xe0\xfe\xc7\x67\x99\xa7\x15\x1d\xf5\x9e\x55\x16\xa1\xbe\xd5\x4d\x96\x8b\x0f\xdb\x40\x99\xad\xd7\x99\x03\x87\xd6\xee\xb7\xac\x78\x89\xa6\x93\x95\x8e\xc9\xe6\x29\x86\x60\x32\xfd\xe4\x35\x6a\x3d\x3b\x58\xd5\xdf\xb0\x0a\x16\xad\x95\xf8\xca\x5a\x75\x75\xc2\x4b\x18\x08\x03\xee\x65\x51\x0e\x34\x2a\x82\xe9\x38\x52\xde\x71\xa7\x15\xd0\x1a\x3c\x42\x9e\x23\x19\x1f\x11\xf6\x29\xbe\x64\xf0\x34\x88\x86\x52\xce\x43\x73\x28\x6f\x0b\x7e\x08\x9d\x9e\x07\x8f\xa5\xb2\x60\xa2\x42\xa6\x3c\x04\x32\x60\xda\xd4\x8e\xdb\xe5\x0d\x1e\xee\xb0\x10\xed\x05\xf3\xef\x6e\x5b\x49\x7d\xed\xad\x06\x2e\x89\xea\x3e\x32\xe9\x63\x48\x86\x73\x1c\x2e\xf2\x35\x59\x99\x88\x0a\xa3\x59\xe2\xec\x2d\xe5\x11\x80\xd4\x8e\x4f\x47\xd8\x6b\x44\x5f\x4c\xca\x8a\x45\x72\x8e\xfa\x3a\x8b\x52\xde\x92\xd9\xda\xd6\x89\x40\x4a\x9e\xa4\xdf\xf8\x5f\x9d\x3d\x84\x13\xb9\x55\x95\x9b\x3a\x3d\xd3\xb4\x28\x22\x5a\x94\xd8\xc2\x46\x47\xc0\x52\x3f\xc9\xb4\x44\xab\xfd\x5d\xb2\xda\x10\x4c\xfe\xf6\x15\x8f\xc1\x6d\x45\xfb\x34\x3f\xbf\xd0\x54\x98\x12\x57\x9e\x53\x46\x09\x2c\x1b\xa6\x0e\xc7\x5f\xe8\x36\x97\x9e\xa7\xa4\xbd\x64\x69\x81\x97\xea\x6f\x98\x64\x7c\xeb\xd3\x23\x10\xbd\xb0\xb1\xf9\x17\x99\xf6\x20\x74\x35\x8a\x54\x2e\x68\xa3\x97\x37\x56\xa5\x42\x55\x14\x18\xee\xed\xb7\x19\x32\x60\x6d\x40\x4d\x69\x95\xad\x02\xab\x0a\x6a\x44\xfa\x0b\xa0\x2c\xd2\x9d\x42\x2f\x00\x8e\x25\x97\x53\x27\x65\x9f\x98\x78\xe2\x55\x14\x6a\x4d\x61\x7e\xe8\xd8\xc3\xf5\x63\xe3\x9e\xa0\x38\x8c\x33\x3d\x52\x0a\xe9\x71\xdb\xbf\x6f\xed\xa7\x4f\xed\xe2\xc4\xd4\x5a\x43\xee\x16\x98\xd3\x98\x7d\xdc\xbf\x54\x04\xe7\x94\x2c\x14\xab\x27\xde\x7a\x6c\x6b\x10\xe8\x3e\xc8\x30\xd0\x04\x7e\x10\x90\xf1\x7d\x33\xe8\xd1\x84\x48\x61\x01\x9e\x6c\xe8\xbe\xab\x0b\xb1\xe1\xaa\x9a\xfe\xbe\x93\xe9\x3d\xbf\x32\x82\xb7\x1d\x28\xaf\x2a\xb5\x5d\x16\x77\x9c\xed\xde\x19\x1a\x78\x13\xdb\xee\xa0\x50\x31\xe5\x3b\xfa\x86\x29\xc8\xa7\xa7\x90\x0b\xb1\xcc\xe5\x30\x3d\xc0\xbc\x68\xe9\xae\x32\x68\x72\xb7\x94\x12\x89\xd8\x38\x8a\x9f\x72\x0a\x21\x76\x2f\x65\x68\xc4\x5b\x8b\x85\xea\x51\x6b\x9e\x63\x55\x06\xcb\x5d\xa0\x29\x4a\x3a\x7b\xe2\xf2\xb3\x89\x5e\x91\x0c\xd5\xd7\x5f\xf8\x31\xab\x28\x97\x04\x98\x8b\x56\x7b\x27\xb3\x65\x69\xee\x5a\x03\xcd\x85\x58\x39\x83\x2b\xc9\x72\x2a\xba\xc2\x47\x16\x5b\x02\x71\x83\x12\x41\x9f\x8d\x13\x33\x49\x8a\xe3\x2e\xd5\x22\x66\x68\xb1\xfb\xb4\x9d\x5d\xda\x63\xf7\xfa\x04\x1d\xca\xcf\xa4\xa4\xdb\xf0\x1e\x3d\xd9\x49\xad\xc1\xa9\x82\xe5\x61\xf2\x5e\x55\xeb\x12\x8d\x4f\xc1\x39\xfd\x8d\xe9\x01\x4b\x6f\x79\x3c\x48\x7c\x19\xab\xbd\xcd\x07\x7a\x01\x26\xef\x8b\xc8\x42\xf0\x8c\x04\x72\x1d\x38\x13\x51\xda\xb4\xf4\xcf\x96\x14\x47\x20\x0e\x62\x25\x89\x85\x32\xe7\xa2\xf5\x01\x25\x47\x8c\xc7\x51\x6b\x6f\x50\xc5\xff\x36\x15\xf6\x67\xef\x6c\x5f\xb7\xf4\xd6\x70\xf3\x44\x22\x8b\x3c\xf9\x3b\xe7\xe6\x05\xe8\x1c\x68\xbc\xb9\x4f\x98\x7a\xf9\x9b\x94\xac\x87\x1c\x51\x0c\xdf\x4a\x45\x3c\x55\x68\xcc\x29\xf5\x0f\xaa\x04\x70\x8d\x6e\xbb\x21\xed\xcf\x69\x2c\x40\x9d\x08\x18\x65\x5b\xed\xd3\x55\xa1\x55\xb9\xd5\x1a\x12\xa8\x8a\xc8\xff\x4d\x09\xf2\x4e\xb1\xb9\xbb\x4f\xc1\xbf\x45\x30\x3f\xb7\x3b\xed\x94\xbc\x6e\xb7\x2d\x3c\xfc\xee\x14\x7f\x06\x6b\x22\xc9\xa3\xa4\x4b\x6b\xf7\x9b\x4d\xb1\x2a\x38\xbf\x1c\xc1\xa1\x9f\xb7\x31\xe2\x52\xbe\x1f\xfe\x7e\x2f\x7c\xaa\x56\x74\x34\xf9\x54\x27\x69\x15\x24\xa6\x57\xdf\x26\x65\xcc\x04\xfb\xde\xbd\x49\x49\x87\x94\x2b\x93\x36\x1b\xa5\xd9\x9a\x0d\x1b\x04\xdf\x67\xde\x22\x20\x25\x83\xe8\x74\xef\x54\xed\xcb\xf5\x5b\x57\xe8\x47\xac\x92\x8e\x15\x14\x28\x4f\xe2\x45\x8b\xa1\x21\x18\xd4\x91\xb2\xcf\xa9\x24\x12\x43\x84\xce\xaa\x17\x8d\xc9\xa2\x6d\x5e\x51\x59\x07\x01\x15\x6e\x75\x73\x6f\xd6\x19\xe7\x20\x86\x43\x6e\x49\xc2\x17\x0d\x51\xbc\x47\x90\xf7\x08\xbf\xd2\x56\x59\x7d\x48\xa1\xff\xb9\x46\x53\xa4\x25\xf7\x97\x08\x3c\xd4\x73\x00\x12\xa3\xea\x35\xad\x61\x2e\xc4\x4f\x5d\xb3\x34\x71\x43\x33\x6c\x80\xdf\x5d\xc8\x3e\x8f\xc1\xc6\x89\x3a\x59\x84\x4c\x9b\x90\x8c\xac\x9a\xf4\xdb\xc7\x3d\xae\x5b\x0e\x9a\x56\xec\x58\x06\x0c\x3d\xef\x41\x81\x2b\xec\xfd\x53\xc6\x53\x08\x01\x5d\xb3\xaf\x55\xad\x75\xa9\xbe\x40\xb5\xe9\xbe\x2c\x01\xbd\xcf\x3d\x07\x18\x05\x0c\x89\x78\x9e\x8e\xc9\xa2\x24\xde\x31\x41\x8b\xa1\x27\xc1\xee\x4b\x3c\xa0\x91\x03\x07\x3d\xde\xab\x90\x10\x74\x86\xca\xde\xa0\xd7\xbe\xee\x1a\xb2\x8a\x48\x59\x23\x7a\xe7\x14\x4e\x5a\x78\xb6\x26\xd4\x6d\xee\x4d\xe5\x5e\xbf\x56\xb4\x2c\x14\x74\xf3\x45\xe0\x7b\x50\x54\xe1\xf4\x27\xc5\xcc\x20\xcd\x8a\x26\xac\x12\x13\xfa\x40\x0f\x3c\xe5\xa8\x2a\xd6\x77\xc6\xc8\xeb\x21\x10\xb9\x24\xed\xb6\x75\xd5\x9f\x0a\xe6\x78\x64\xf3\xce\x19\xc0\x44\xea\xf0\x00\x7a\xf9\x97\xd2\x8c\x47\x1a\x4c\xd0\x46\x41\x57\x47\x97\x9e\x97\x27\x82\xaf\x49\x32\xb2\xce\x24\x3d\x56\x49\xcf\x02\x46\x9e\x21\x56\xc8\xda\xd6\xf9\xf9\x79\x2b\x1a\x0e\x8f\x09\x27\x2f\x85\xd6\x4d\x45\xd1\x5c\x54\x7c\x00\x31\x2f\x8a\x50\x07\xef\x8d\x1b\x1b\xec\x4b\xd3\x69\x15\xab\x08\x5a\xad\xaa\xbb\x3b\xb7\xc9\xa1\xb4\x07\xba\x69\xc5\x8d\xbc\x10\x52\x10\xd0\x3b\xbf\x00\xe7\x78\x02\x88\xd3\xcf\x0c\x96\x49\xc2\x53\x5a\x6a\x06\xd8\xcf\xa0\xd8\x9e\xd5\x76\x50\x0e\x43\x9a\x33\xf4\x54\x96\x01\x24\x9e\xc9\xf4\x53\xcf\xb3\x1b\xc4\x64\xea\xf9\x63\x5b\x51\xc5\xc5\x53\xcc\x47\xc1\x75\x4c\x45\x84\xa0\xb9\x07\x60\xbf\x50\x19\xf9\x58\x17\x00\xfc\x47\x2e\x9c\xd4\x23\x1e\xb0\x99\xfc\x02\xfd\x06\xa5\xa5\x2f\xb2\x76\x45\xe9\x21\xa9\xfb\x13\x14\x56\x0b\x30\xb4\x88\x9a\x51\x16\x7a\x1d\xe9\x96\x98\xbe\xd0\xe6\x0a\x87\xcc\x46\xfc\x6c\x54\xaf\x2a\x80\xdd\x3a\x29\x3a\xc5\x72\xff\xaf\xd4\x9d\xe2\xc3\xe5\xde\x89\x5a\xcb\xba\xb0\x9f\xc1\xff\x85\xe2\xea\x3f\xf7\xca\xb7\x43\x08\x72\x71\xad\x11\xdf\x50\xd8\x9b\x83\xd9\x27\x10\x0f\xde\x8e\xd7\x02\xab\x59\x8b\x07\x22\xc8\x47\x07\x21\x09\x04\x14\x0e\x80\x96\xe3\xe1\xbe\xb0\x2a\x0d\xe6\x5f\xeb\x9d\x2a\x6a\xac\xb2\x32\x75\x8d\xe2\x16\xf1\xd6\x7c\x45\x26\xe9\xc8\x3e\xd7\x79\xd9\x89\xdc\xba\xa9\xdf\xd5\xc4\x19\x17\x36\x15\xf2\x3f\x21\x9b\xa3\xbd\xb1\x19\xbf\x4c\x68\x28\x00\xc2\xc0\x5a\x46\xac\x1a\xfd\xa1\x23\x11\x2a\x98\x90\xb0\x14\x01\x2f\x0f\x3d\xc8\x09\x2d\xe7\x19\x48\x23\xcf\x20\x80\x52\x43\x84\x7a\x47\x64\x5b\x85\x3d\xa4\xea\xce\xd8\x02\x71\xbd\x12\xdc\x69\x86\x71\x02\xf7\x97\xa2\x5a\xc1\xfb\x0f\x45\xa8\x50\xe0\x87\x45\xe9\x40\xce\x41\x25\xa2\xad\xf2\x53\x44\xe5\xd4\xed\x27\x9a\x7e\x5b\x54\x5c\x7a\x1b\xc1\x34\xf0\xa3\xfb\xec\x89\x8d\x6b\x48\x33\xac\x24\xc5\x40\x3d\xb2\xed\x01\xae\x23\xdb\x84\xb0\xf4\xee\x0b\xda\xe9\xae\x96\xf8\x79\x50\xee\x38\x3b\x04\xec\x72\x7c\x47\x79\xc8\xbe\x74\x35\x38\xaf\x41\xd7\x05\xea\x57\xaa\x18\x8b\x76\x86\xa8\x24\x4e\xd2\xa2\xd5\xce\xdd\x36\xb5\xb0\xaa\x60\xac\x00\xd0\xf5\xdd\x3f\xe3\xed\xfd\x1d\xf5\xad\x54\x28\xeb\xe4\xd5\xf5\x60\x34\x59\x0c\x27\x83\xc9\xe5\x90\xa9\x87\x3f\x4e\x67\x7f\x7e\x32\x92\x12\x55\xf0\x13\x28\x03\x56\xbe\x5a\xf9\x1b\x8e\xed\x94\x73\x4a\xf4\xfa\xc5\x93\xd3\x09\x86\x22\xf2\xb8\xb1\xdd\x1f\xbc\x60\x95\x56\x44\x27\x44\xb9\x65\x1d\x7f\x58\x0c\xcb\x08\x7a\x45\x08\x6b\xaa\x0a\x83\x0d\xcb\x90\xe1\x12\x22\x9f\x3d\x6b\xeb\x6c\xa6\x1d\x1b\xad\x85\x15\x3d\x53\xc9\x9f\x99\x78\x77\xc6\x28\xe8\x55\x9f\x66\xfa\x78\x6f\x84\x6b\x80\x4b\x00\xd7\x9d\x89\x84\x80\x51\xe0\x40\xf6\x8c\x7e\x60\xad\x93\x35\x0f\x72\x34\x4c\xbb\x53\x34\xe6\x2c\x6d\x54\xeb\x14\x95\x81\x68\x37\xa5\x92\x29\xf2\x4f\x62\xd4\x84\x04\x96\xe4\x09\xad\x1a\x32\x7a\x02\xcf\xb3\x81\xc0\xb4\x47\x9f\xb2\xad\xd1\xc5\x4b\x96\x28\x1a\x7d\xeb\xd6\x18\xf9\xdb\xbe\x7a\x6a\x25\x2b\x23\xba\xc3\xc9\x38\x08\x4b\x81\x68\x7a\x27\xd1\x21\xfe\xb4\x51\x08\xc9\x35\x04\x12\xb5\x04\xcc\x06\x44\x08\xba\xaf\xc9\x1c\xd6\xd1\xde\xf8\x8a\xbd\xb4\x4c\x8f\xde\x2f\x5d\x17\x66\x0d\xe5\xcf\xc5\x17\xb9\x35\x55\x73\x4f\x59\x72\x38\x70\xb4\xb7\x7c\x15\x69\xc8\x6f\x71\x7f\x47\xbd\x1b\x5e\x22\x3c\xa4\xba\x22\x52\x17\xa6\x63\x45\xc3\xe9\x1b\x4c\x5c\x10\x48\x11\xdf\x0c\x49\x18\xfd\xa5\xb0\x80\x6a\xd6\xbf\x93\x50\x77\x02\xf4\x44\xa0\x29\xd5\x06\xca\x82\x5a\xc8\x90\xf1\x96\x64\x9e\x6a\xf3\x5b\x46\x46\x92\x2f\x5a\xd5\xe0\xad\xb1\x8d\xde\x59\xf4\xce\x5c\x43\xde\x5b\x82\x83\x43\x1c\x42\x6e\x88\xb5\x5a\x3d\xd9\xcd\x31\x27\x91\xfa\x0b\x2d\xf8\xbd\x24\xb1\xd3\x3c\x1a\x32\x46\x4e\x92\x81\xf8\x4d\x55\x15\xba\x3f\x89\x9c\x89\x3d\x27\x56\xab\x7a\x75\x8f\x31\xd1\x11\xd9\x52\xf8\x33\xf4\x61\x80\x3b\x66\xb3\x2f\xc9\x65\xa3\x2b\xb8\x39\x8c\xe2\x9a\xac\x9f\x6d\x8a\xb2\x8c\x84\x90\x77\x9c\xa3\x31\x8b\x0f\x4f\xbc\xc4\xd0\xa2\xb2\x9f\x9f\xb9\x82\x68\x38\x63\xc4\xae\x55\x3e\x0a\xaf\x19\xe5\x5c\xb8\xf7\x09\xce\xa4\x37\x67\x40\x66\xf9\x79\xec\xab\x30\x13\x30\x25\x8d\x54\x9e\x1d\xce\xbd\x69\x5b\xdd\x73\x3e\x85\xb3\x5e\xd5\x67\x5d\xb5\x22\x54\xc9\xbd\xc4\x49\x54\x95\xd9\x73\x91\x34\xc9\x38\x67\x81\xa2\x83\x77\xc5\xc5\x37\x98\x48\x0b\xed\xfb\x92\x5b\x7f\x32\xe3\x8b\x21\x8f\x5b\x67\x93\xf3\x6b\x1f\x03\xd6\x9d\x87\xe5\x5f\x9b\x4a\x67\xb2\x2d\x10\x77\xc6\x36\x24\x4f\x9d\xde\x94\x37\xfa\x4b\xe3\xfe\x2f\x3f\x11\xe2\x95\xf2\x6b\xd4\x1f\x39\x01\x41\xe1\x91\x9a\xe0\xbe\x81\x85\xbe\x53\xd6\x26\x2b\x94\xe4\x29\x81\xae\x44\x2b\x82\x80\x32\x00\x39\x8e\x78\xb8\x09\xdf\x04\xd5\x8d\xe2\xa2\x11\xbc\xcc\xf2\x2b\x63\x42\xc1\x1d\x8f\xab\xf7\x85\xc3\xc1\x62\x20\x39\x1a\x69\x2a\x43\x34\xd3\xa9\x7e\xfb\x98\x45\xdf\x98\x43\x64\x97\x72\x5a\xe5\x6f\x61\x77\xe3\xcf\xbe\x80\x48\x38\x02\x5c\xe1\x33\x78\xb1\xcc\xd9\x55\xe5\x96\x78\xd3\x40\x08\xa7\xd6\x74\x90\xa9\x5a\x3e\xb4\x56\x58\xf7\xb0\x94\xa5\xae\xee\xf4\x5a\x56\x64\xc7\x3c\x79\x30\x45\x15\x60\x0f\x3a\x6b\x44\xbf\x23\x8d\x0a\x60\xff\x69\x09\x3c\x4f\xa1\xb3\x6e\x88\x7a\x30\xde\xe0\x25\xc7\x0b\xb8\x0e\x13\x70\x5c\xb6\x9a\xec\x0b\xe8\xee\xb8\xd2\x8f\x27\x3d\x43\xf2\xb1\x59\x54\x75\xf4\x43\x81\x21\x20\x67\x46\xf3\xb6\xf6\x6c\x3d\xfb\xd4\xc2\x87\x9c\x4d\x2f\xb6\xc0\x57\xcb\xd7\x2d\x5a\x37\xf0\x62\x13\x73\x22\xdb\xb7\xbd\x94\x2a\xaf\x96\x27\x4e\x16\xbc\x3e\x01\x1b\x93\x1c\xb7\x3d\x03\x00\xaf\x06\x3d\x03\xf0\xe2\x6f\x99\xe6\xaf\x67\xd9\xe1\x94\x50\x71\x78\x12\x4d\x3d\xe0\x02\xc7\x02\x4d\x3e\x2b\xd0\x04\x0b\xb4\x01\xcf\xe6\xc9\x5e\xbd\x1b\x28\x0b\x4e\x95\x8c\xe0\x1b\x1b\xc6\xbd\x48\xf5\xc6\x27\xfc\x3b\x5a\x42\x69\x47\x70\x0e\xd1\xf1\xfe\xe6\xf7\x19\x1f\x4e\x8b\xe6\x68\x7c\xe5\x69\x2d\x32\xd1\x4a\x93\xcb\x92\x58\x58\x2b\x40\x18\xc2\xb5\x3e\x1d\x9c\x14\x2a\x65\x7b\xf2\x05\x30\x90\x42\x9d\x23\x25\x0a\x0b\x66\xf8\x6e\xa5\x1f\xf9\xfb\x64\x68\x43\x34\xc1\x4b\x6a\xe1\x25\x35\xf8\x60\xdd\x25\x3d\xf1\xee\xd4\xbf\xae\xde\xe0\x77\xa5\x69\xb5\x6c\x0f\x78\x8a\xf1\x99\xf2\x01\xbd\x62\xeb\xf4\x4d\x60\x7f\xfe\xf6\xca\x05\xf1\x95\xca\x85\x0e\xce\xce\xb3\x95\x0b\x0b\xcc\xdd\xa3\xe6\x5c\x53\xa4\x63\x63\x74\xf2\xb7\x83\xd9\xbf\xf0\x4e\x29\xeb\x3d\x07\x97\xf7\xc6\x80\xcd\xbb\x88\xa9\xeb\x4c\x2d\x07\x94\xac\xec\xeb\x8f\x4e\xbf\xf1\x0f\x9c\xce\x4d\xcc\x56\x9b\xd4\x0c\x78\x46\x76\x28\xde\x46\x61\xef\xac\xe7\x7f\x8b\x83\x5e\xff\x16\x87\x22\x88\x34\x04\xd0\x54\x23\x1d\x36\xa4\xf4\x18\xab\xdb\xee\x36\x12\x9c\x14\x47\x60\xb0\x61\x91\x3a\xa5\xab\x03\x25\xe8\x56\xd1\xf8\x96\x7b\x08\x67\xda\x46\xab\x75\xc2\x13\x19\x3e\x82\xa9\x5c\x3d\x6e\xe6\x90\xd5\xe3\x61\x1b\x63\xcc\x97\xc8\x1b\x0e\x11\x3d\x5d\xc2\x3a\x41\x56\x8b\x79\xac\xc2\xd8\xa9\x4a\xc7\xc3\xf9\xf1\xe5\x89\xe7\x12\xc4\x42\xc2\xc1\x71\xc7\x08\xf7\xc5\x16\x7c\x69\x3e\xf6\x95\x54\xf1\x3c\x2d\x64\xc8\x64\x0a\x65\x0f\x49\x8d\x83\xfc\x4a\x8d\x83\xb3\xaa\xe1\x42\x60\xbc\xa6\x01\xb4\x14\x53\x89\xa5\xbe\x2f\xaa\x75\xdb\xe9\xdd\x5a\x17\xb0\x05\xb9\x85\x96\xea\xf4\x78\x7f\x48\xae\x83\xc0\xce\xc3\xd8\x9f\xad\x24\xbd\x19\x9f\xc8\x47\x95\xa4\xf9\x15\x55\xc4\xef\x9a\x8b\xe1\x57\x6b\x9d\xa0\x43\xf4\x36\xae\x0b\xbb\xda\xe3\xd2\x16\x55\xbb\x0a\xc4\xed\x3e\xea\xdc\x60\xda\x95\xfa\x41\x31\x79\x38\x5f\x4e\xf4\x03\x33\x96\x4a\x92\xfa\x95\x5e\x71\x81\x40\x4b\x74\x6a\x6a\x2d\x75\xb5\x32\xfb\x5a\xdd\xe1\x90\xa0\x48\xa5\x68\xe0\x31\x9a\x25\xb2\x45\x9a\x4a\xc6\x35\x18\x92\xc1\x2f\x12\xa8\x9a\x6f\xbe\xd2\xed\xfb\xdd\xa0\x9b\xd3\x6a\x89\x89\xbb\x81\xe2\xf3\x89\x6c\x1d\xf2\x2d\xf1\x69\x47\x16\x7f\xb0\x99\x55\x29\xf6\x36\x42\x60\x80\xf7\x21\x2a\xce\x21\x6d\x2c\x3a\x35\x9b\x18\x85\x9f\x3f\xd5\x8d\x8f\xe7\x12\xc1\xca\x40\x77\x22\x88\x4d\xb7\xec\x78\x1b\x7a\x98\xcd\x11\x3c\x03\xe6\x93\x86\x95\x32\x61\x36\x0d\x2b\xa2\xf0\xa9\x7b\x80\xf7\x05\xa3\x77\x85\x5e\x45\x79\x7a\xea\xb5\xb4\x8d\xa9\xef\x74\xc4\x90\x0d\x41\x20\x3f\xc0\x34\xc2\xf8\x33\x78\xba\x1b\x4f\x97\x6b\x56\xab\x7d\xcd\xfe\x4d\xcc\x6c\x66\x93\x15\xee\xb8\x45\x0f\x88\x33\x9a\x44\x12\xfa\xe6\x18\x66\x60\x75\x86\xd8\xe0\xde\xa6\x6b\x55\xe0\x63\xfe\x50\x98\x52\x35\x11\x58\x6b\x14\xf6\x4d\xa3\x16\x95\x7c\x54\x07\x1b\x53\x8e\xc1\x74\x90\x53\x07\xdc\xee\x51\xd1\x4b\xe6\x0e\xaf\xdb\x4d\x80\x13\x14\xbb\xda\x2c\x4b\xbd\xb5\x3e\xc6\xe0\x1f\x72\x76\xfb\x04\x40\xcc\xbd\xdd\x43\xfe\x3b\xcb\xe2\xa5\xb6\xb8\x63\xb5\xb6\x8d\x68\x0c\xa2\xcf\x47\xec\xf6\x9d\x44\xaa\x95\x2a\x23\x8a\x7c\x14\x01\xa6\xd2\xce\xc0\xa7\x82\x26\x5f\x83\x20\x70\x4e\x06\x61\x46\x4d\x89\x32\x4d\xdf\xab\x87\x82\x61\x06\xb9\xf8\x2e\x9c\xcb\x86\x52\x2c\x20\x95\x19\x32\xa8\x19\xda\x25\x1c\x3a\x9b\x0b\xf1\x01\x0b\xcf\x6e\xad\x4e\xde\xd4\x27\x6f\x9b\x10\x0b\xd3\x29\x2c\xcd\x28\x32\x55\x54\x18\x7d\x8b\xc0\x16\x82\xaf\x3d\x7a\xb4\x0c\x78\x5c\x7c\xfa\x4b\x9f\xaf\x92\xdd\xe3\xa8\x73\x39\x0d\x8b\xad\xb5\x03\x7b\x3a\x71\xc6\x9e\x89\x11\x40\xd8\xc0\x3d\x5f\x2a\xc0\x6f\x5b\x5a\xa7\xe3\x14\xb0\x51\x7c\xf2\x72\x39\x62\x1c\x3f\x50\xed\x22\xe5\xd0\xa7\x01\xaf\x7b\x00\xb2\xba\x79\xd6\xed\x4c\x3b\x04\x9b\x49\x3c\xa7\x49\xc4\x54\xb4\x4a\x37\x3f\xb0\xd3\xb3\xe2\x77\x23\x2a\xdf\x62\xe6\x8d\x6a\x1d\x06\xf8\x46\x88\x7f\xfd\x57\xb9\x2b\xee\xf2\x75\xf3\x05\xfe\x1e\x6c\xb2\x8b\xb3\xb3\x57\xf2\x3a\x97\x9f\x72\x39\x51\x5b\x2d\xc4\xbf\x0a\xf1\xaf\xb8\xa1\xcf\x94\x7d\x86\x89\xc5\x0f\xab\xfb\x66\xfb\xd9\x7b\xbe\xba\x39\x2e\x34\xe3\x6a\x6e\xd7\x4a\xfb\x7a\x9a\x5a\x1e\xb7\xb8\xf2\x11\x9c\x2f\x86\xc6\xcf\x71\xe4\x1a\x7e\x6a\x9b\x0e\x62\x7e\x12\xa1\x74\x9f\xbd\x6f\x9a\xdd\x9b\x97\x2f\x1f\x1f\x1f\x73\xf7\x95\x2f\xa7\x3b\x1c\x64\x6e\xea\xbb\x97\xe5\x6e\x57\xe6\xcd\x97\xc6\x7d\x10\x44\x49\x18\x61\xc4\x19\x14\x82\xc9\xaa\x4c\xc9\xcf\x61\xfe\x30\x77\xd7\x02\x7f\xdb\x2d\xf7\xcb\xf3\x8b\x97\x67\xe7\xbe\x91\xbc\xb3\xe6\xec\xf5\x06\xad\x27\xf6\x22\x90\xf5\x70\x14\xfb\xda\x8f\x92\xef\x3f\x65\x1e\x71\xd3\x85\x8d\x36\x5b\x76\xbb\x26\x40\xc8\x16\x5f\x3a\x1d\x1d\x0c\x08\x16\x77\x79\x51\x59\x5e\x16\x38\xf6\x5c\x1e\xe9\xde\x21\xf7\x7b\xdb\x1c\x5c\xdb\xef\x0b\xf7\x18\x3e\x73\x30\x91\x4b\x06\x2b\x0e\x5b\xc7\xfe\x0e\xbe\xdb\x4a\x17\x08\xea\x1a\x66\xca\x13\xb5\x92\x97\x86\x54\x16\x0a\xaa\x23\x63\xb8\x81\x76\x0a\x16\x3a\xcc\x45\xfc\x46\x93\x79\x91\xc9\xdf\x68\x2e\x2f\x50\x6d\xf9\x8d\x86\xfe\x02\x69\x63\x41\x16\xa0\xdb\xb0\x95\xb4\xe4\x9b\xa0\x52\x35\xdf\xce\x09\x4e\xa3\xa7\x28\x2a\x19\x92\x3b\xb9\x69\xf1\x0d\x96\xfd\x82\x74\xeb\xd6\x5f\xe1\xe0\xfa\x2a\xc3\x3a\x13\x45\x5d\x43\xfc\x16\xf6\xf8\x45\xb0\xa2\xc9\x48\x78\x64\xd8\xeb\xeb\xf8\x64\x69\x5f\x5f\x0a\xa7\xae\x31\x01\x34\x15\x6e\x1d\x68\x37\x94\xc5\x20\x8f\xc2\xf9\x3b\x62\x26\x97\xaa\x31\xf2\xa8\x13\xcd\x39\x8a\x50\x44\x1f\x75\xb0\x0c\x85\x7f\xbf\xdd\x8b\x90\xb6\x67\x9f\x1c\x1d\x88\xec\x35\x71\x90\x33\xed\x95\xd0\x95\xf5\x25\xa4\x7e\xac\xe4\x28\x81\x3c\xe6\xcd\xbe\xf4\xfc\x86\xde\xc4\x06\x45\xed\x91\xbd\x4e\x2b\x55\xc9\xca\x88\xd2\x54\x77\xec\x0c\x85\x84\x39\xc0\xf5\xc6\x2c\xca\x02\x5b\xb7\xba\xdc\xb8\x35\xf5\x96\xf0\xac\x65\xed\x3e\xad\x6d\x0a\x81\x8c\xb1\xd5\x9d\xfc\x88\x95\x26\xa1\x28\x90\x1f\x79\x42\x84\x70\x7b\x40\x71\x22\xdb\x62\x93\x6c\x17\x1d\x78\x8c\x6d\x27\x81\xc2\x9d\x8d\xf3\xf9\x3a\x5a\x48\xb0\xe3\xfd\x3e\x04\x42\x82\x47\x15\xb2\x25\xe8\xe2\x41\x8d\x99\xe7\x22\xa5\x72\x7e\xec\x27\x54\x36\x46\xe9\x15\x0b\xcc\x82\xdc\x97\xeb\xb6\x6b\x58\x0b\xaa\x54\x87\xb7\x2e\x4a\x63\x2d\x31\x84\xd2\x99\x45\x98\xa7\x0f\x54\x06\x5a\x26\x12\x2a\x66\x83\xda\x03\x08\x20\xf4\x2e\xe2\xcd\x54\x12\x68\x19\xa9\x26\xf6\xcd\xd3\xb2\xce\xf5\x8a\x3d\x86\x74\xa8\xad\xaa\x8a\x8d\xb6\x8d\x7b\x05\x72\x81\x65\xef\xaa\x41\x85\x25\x97\x44\xfd\x16\xa1\x77\xab\x4a\xee\x2b\x48\x26\x35\x2b\xc0\x6d\xb5\x70\x68\x50\x29\x5f\xe2\xa2\x63\xb5\xaf\x68\x2f\xaf\x6c\x2d\xaf\x6a\x5a\xd5\x5a\xcb\x03\x42\x19\xa0\x3b\xbd\x2e\xa2\x30\xbc\x00\x85\x34\x14\x26\xad\x14\xb9\x05\x42\xeb\x8f\xec\xac\x77\xfa\x63\x43\xa9\xa6\xe0\x33\x8e\xa2\x41\x2b\x53\xb9\xc7\x6f\x5f\x6b\x40\x50\x6e\x4c\x6b\x9b\x5b\xdd\xfe\x95\x2c\xfc\xf9\xcb\xeb\xc5\x78\xfc\x8f\xe3\x7e\xff\x9f\xbe\x8a\xff\x73\xf6\xfd\xc5\x59\x87\xff\xfd\xd5\x0f\x3f\xfc\x81\xff\xf3\xcf\xf8\xd3\x01\xb5\x72\x57\xe1\x7a\x31\x8e\x54\xd2\xe3\xd5\x09\x30\xbc\x83\x2e\xb7\xa8\xf7\xb6\xd1\x28\x09\x46\xd5\xba\x50\x95\x92\xb7\x55\x01\xfa\x14\xe0\xc9\x5d\x9c\x9d\xfd\x28\xaf\x6a\x6d\xd7\xba\x8a\x7e\xe3\x3e\xbf\xd0\xab\xfb\xca\x94\xe6\xee\xe0\x55\x95\x6f\x68\xee\xfc\x4c\xce\x8b\xed\x7e\x62\x1e\x94\xbc\x7d\x2f\x8f\xef\xd5\xa6\xd9\x57\x77\x76\xa9\xed\xea\xbe\xfe\x1f\xff\x77\xf5\xb9\x39\xc9\xa4\x53\x1a\x6d\xb1\xdd\x57\xe6\x41\xe5\x2b\xb3\x25\x38\x43\x82\x4f\xac\xb5\xd5\xf5\x03\x04\x21\x89\xf0\xe3\x8d\xbc\x81\xca\xdb\xf7\xa6\x69\xec\xea\xbe\xe4\xfa\x80\x41\xb5\xae\xf5\xa3\x1c\xef\xb7\x76\xed\x1e\x40\xf2\xbc\x82\x24\x2b\xd2\x62\x8b\x6b\xd5\xd4\xc5\x17\xb9\xd0\xdb\x9d\x53\x1c\xe5\xb8\x58\xd6\xaa\x3e\x08\xf1\xd5\xd9\x9f\x9e\x4a\x7b\xef\xde\xb0\xc5\xed\x95\xfb\x87\xeb\xb8\x3b\x7b\x79\x7a\x2a\xf0\x63\xa3\x5b\xf7\x29\xcf\x54\xde\xe1\xa1\x8b\xa8\xd1\x1b\x2a\xe4\x07\x1c\xf6\xe0\xa6\xf2\x11\xe8\x28\xd3\x73\xa6\xdb\xd5\xbe\xcc\xbd\x62\x91\xb5\x06\x74\xa0\xa2\x52\x35\xbc\x3f\x5b\x4b\x9a\x1d\xe0\xc0\xa3\x75\x9a\xa4\x46\x43\x06\x7d\xc8\x9e\x4a\xcb\xb3\x9b\xaf\x54\x90\x51\xc5\x02\x24\x90\x77\x9e\x56\x1a\x0f\x50\x4b\x43\xfc\xa5\xd6\x0d\x47\x5d\xd8\x4f\x93\xda\x9d\x19\xb1\x6d\x52\x5e\x9b\x77\x80\xc1\x57\x7c\x9d\x49\xd4\x6e\xc6\x36\x09\x7e\x23\x1e\x20\x68\x47\x31\x33\x5c\xc2\xb9\x14\xd5\x3b\x43\xd8\xbc\x6f\x0a\x45\x15\xaf\x23\x4f\x21\xa6\xb9\x7d\x7a\x16\x4f\x0e\x4a\x7e\xd3\xa0\x78\xce\x49\xd2\x2d\xdb\xc2\xc4\xb6\x4f\x24\x09\x11\x54\x82\xd7\xe0\xe3\x79\xfc\x0c\xb5\xc2\x83\xea\xd0\xca\xe0\x25\x9c\x88\x75\x48\x0e\x6d\xcf\x3f\x61\xcb\x4b\x8f\x63\x94\x55\x43\xa6\xf1\xd1\x22\x3e\xc2\x1e\xe0\xa3\x4d\x43\xe2\x0c\x5f\x3c\x56\xe9\x35\x9b\x98\xa6\xd6\xf2\x4a\x6d\xe9\x0c\xdc\xe8\xfa\x41\xc1\x65\x89\x2e\xe0\x58\x2d\x81\xc7\xb9\x7b\xe9\xd0\xf4\xe8\xde\x60\x91\xdc\x60\x22\xf0\xf2\x58\x43\x71\x95\x14\xa8\x7f\xab\xa6\x23\x49\x78\xb8\x7e\x40\xe2\x9b\x06\x84\x5d\xa9\xf5\xb6\xa8\xdc\x9a\x62\x2a\xbe\x1b\x23\x6f\x30\x04\x17\x41\xd3\xe5\x9e\x5d\x2f\x83\xf5\x83\x53\xd5\xd7\x72\xa6\x29\xf1\xc1\x7d\x27\xea\x71\xe4\xd5\x44\xd5\xc8\xf3\xf3\xb3\x33\xf9\xd1\x9d\x03\xa7\x6c\xbe\x2d\x1f\xd6\xb9\xa0\xa1\xec\x4c\x59\xd8\xcc\x0f\xec\xf5\xf7\x17\x67\x17\x99\xdc\xdd\x9b\x4a\xcb\x57\xe7\x3f\x9c\x5e\xfc\xf0\xfa\xf4\xbb\x9f\xce\xbe\xcb\xe4\x46\x7d\x89\x7f\x72\x91\x1f\x39\x19\xec\xeb\x07\x90\x74\xb7\xb0\xb2\xb5\xe5\x18\x61\xde\xed\x9c\x36\x49\x87\xd5\xef\xb5\x0f\x5e\x02\x82\x19\x96\x36\xa2\x5e\x05\xb5\x3b\xa7\x98\xff\x17\x1a\xc4\x52\x4e\x0f\x6a\x81\xad\x62\x64\x7e\x01\x35\x79\x5b\x2d\x8f\xae\x17\xe3\x23\xc2\xd1\xa4\x4c\x28\xe6\x20\xd1\xd5\xda\xd4\xe8\xde\xd8\xd5\x06\x20\xc5\xe9\x1c\x7a\xcc\x21\x41\xb1\x9f\x22\x3a\x91\x8f\x1e\xe1\xb9\x70\xb2\xb1\x76\xf2\xaf\x8a\xf9\xb4\xe0\x3b\xa3\x5b\xd7\xee\xe2\xf6\x0a\x77\x94\x3e\x26\xc2\xc7\x32\xb9\x2b\xb5\x22\x1e\x78\xb7\x8f\x3d\x4f\x42\x77\x5b\xff\xe7\x68\x53\x85\xdf\x54\x8c\xae\xdf\xb4\x06\x2f\x7b\x06\xcf\x1e\xe0\xa5\x96\x2b\xa8\x6d\xc7\x05\xc2\xc4\x75\xf7\x4b\xf8\xa7\x48\x36\xa8\x40\x47\x5e\xf6\xf5\x99\xf7\x3e\xeb\xe2\xf9\x59\xc8\x78\x16\xee\x85\x84\xe7\xf1\xd6\x5b\x44\x90\x8a\xaf\xac\xdd\xd7\xaa\xf2\xbc\x9e\x78\x6c\xc2\x33\xe1\x45\x19\x07\xc3\x05\x73\xf5\xa0\x61\xce\xc4\xa1\x51\x46\xea\xf3\xe4\x3d\x11\xc9\xbb\x00\xb5\xfd\x90\xcb\x68\x70\x2c\x88\x5b\x1c\x15\xe4\x5d\xf0\x45\x0c\xa0\x5e\x11\x51\xc5\x12\xf2\xb2\x1a\x41\xc9\xfc\x38\x08\x6c\x3a\x54\x7b\xff\x1e\x86\x21\x11\x47\xe4\x72\x21\x28\xe8\x3c\xc4\x40\xf4\x7c\x31\x98\x5c\xcd\xe5\xe2\xc3\x60\x21\xe7\xd3\x77\x8b\x8f\x83\xd9\x50\x8e\xe6\xf2\x66\x36\xfd\x65\x74\x35\xbc\x92\x47\x83\xb9\x1c\xcd\x8f\xe4\xbb\xe9\x4c\x7e\xfc\x30\xba\xfc\x20\x43\x4a\xff\x68\x38\x17\x83\xb9\x5c\x4c\xe5\xe5\xe0\x66\xf0\x76\x34\x1e\xb9\x1f\xc9\xe9\x4c\x0e\x2e\x2f\x6f\x67\x83\xcb\x4f\xd2\x35\x77\x3d\xb8\x1a\xe6\xf2\x6a\x36\x9c\x5f\x0d\x27\xf2\x76\x32\xfa\x65\x38\x9b\x8f\x16\x9f\x20\xc1\x76\x78\xf9\x61\x32\x1d\x4f\xdf\x7f\x12\x83\xc9\x95\x1c\x4d\xae\x46\x83\xc9\x20\xfe\xd0\xfb\xd1\x2f\xc3\xb4\x4f\xc4\x39\x19\xfc\x19\x7e\x3c\x1b\xde\xcc\x86\xf3\xe1\x64\x01\x88\x27\x30\x11\x11\x4f\xe4\xdd\x6c\x08\x99\xbc\xa3\xc9\xbb\xd9\x68\xf2\x7e\x78\x3d\x9c\x2c\x30\xb3\x77\x34\xbb\x92\x37\x83\xd9\xe2\x93\xbc\x19\x2c\x86\x93\x45\x26\x2f\xa7\x37\x9f\x66\xa3\xf7\x1f\x16\x99\x9b\xc3\x74\xf1\x61\x38\x13\x37\xb3\xe9\xcd\x6c\x34\x5c\x0c\x66\x9f\x24\xfc\x6e\xfe\xf5\xa9\xc8\xfe\xa9\x08\x1e\x73\x34\x95\xce\xc2\xc3\x78\xdf\xcd\xa6\xd7\xf2\xe8\xed\xed\xfb\xf9\x51\x26\x8f\x7e\x19\xcd\x6e\xe7\x43\xf8\xeb\x62\x36\xfd\xd3\x60\x22\x3f\x4c\x67\xf0\x03\x71\xb4\x98\x0d\x6e\xe4\xd5\x74\x3a\x83\x5f\x7f\x9c\xce\xae\xdd\x5f\x78\xf4\xf2\xc3\x60\x76\xfd\xee\x76\x2c\x2f\xa7\x6e\x0b\xfc\xd6\x0f\xe6\xf3\xdb\x6b\xe8\x7d\x28\x87\x93\xc5\x68\x36\x14\xb3\xd1\xfc\xcf\x12\x37\xd3\xfd\xf4\x66\x38\x7b\x37\x9d\x5d\x73\x1e\xb4\x1f\xe1\x60\x72\xf5\xd2\xed\xef\x7c\x3e\xbd\x1c\x0d\x16\x43\xb7\x11\x8b\xe1\x6c\x34\x18\xcf\x33\x98\xf6\x62\x2a\xda\xdf\x77\x3f\xfe\x65\x30\x1e\x5d\xd1\x42\x8d\x26\xf0\x2b\xd8\xaf\xf7\xc3\xc9\x70\x06\xed\xdc\xce\x47\x93\xf7\xbe\xa3\xbf\xd2\x70\xfd\xe3\xcf\xdf\xe5\x4f\xfe\x72\x3e\x9a\xcf\xff\xb1\x0e\x80\xe7\xed\xff\x57\xaf\xcf\x5e\x5f\xb4\xed\xff\xef\x2e\xbe\xfb\xc3\xfe\xff\x67\xfc\x99\xef\x2b\xf7\x42\xef\x6d\x53\x1f\xe4\xbc\x51\xd5\x5a\xd5\x6b\xcf\x5b\xca\x4e\x81\xd3\x08\xde\xf7\x1c\x8b\x23\xf3\x33\x99\xe0\x48\x9e\xe7\xe7\x40\x5c\x4b\x8c\x64\xf2\xd6\xea\x23\xca\x37\x4e\xcb\xca\xe3\xac\x11\x42\xe7\x6b\x62\x2e\xaf\x4b\xb3\xd6\x11\x2d\x2a\x40\x71\x84\x4a\xed\x43\xee\xba\xba\x70\x5d\x05\x42\x27\x1a\x1c\xf7\x47\x8e\xe5\x65\x8b\xf1\x24\xe9\x21\xf3\x76\xdd\x75\x12\x8d\xe7\xd2\x76\x74\x2d\x86\x32\xad\xa8\x3b\x18\xc1\x2b\x79\x34\x0c\x78\x82\x49\x65\xed\xb5\x5e\xdd\xab\xaa\xb0\x5b\x1e\x8f\x92\x5b\xfe\x11\x17\x08\x79\x22\x22\x28\xba\x49\x95\xde\x88\x67\x31\xf2\x8f\xb3\x8b\x32\x42\x31\xf4\xd8\x84\x54\xd3\xe3\x31\x04\xce\xf3\xd7\xf2\x68\xf8\x45\xaf\xf6\x00\xda\xcb\xe3\x48\x16\x80\x99\x9e\xc0\x22\x8d\x10\xc0\x22\x8a\x5d\x98\xe8\x77\xf2\x68\x54\x15\x50\xae\x74\x45\x96\x57\x1d\x2f\x74\x51\xad\x8b\x87\x62\xbd\x47\x92\x3d\x52\x5f\x3c\x8e\xc7\x9a\xc3\x07\xd4\x86\xf0\x6d\xb0\xae\x1f\xf5\xc7\x31\xa9\xb8\x84\x6c\xf8\x05\x8a\xb4\xe5\x00\x06\xf3\xbd\x3c\x1a\xab\xfa\x4e\x63\x4c\x21\xac\x2f\x06\x90\xc1\x3d\x8a\x1b\xaf\xdb\xb3\x75\x2a\x3d\x62\x6b\x7a\xe2\x23\xac\xa9\x5c\x51\xc7\x1d\x40\xfd\x1e\x12\x70\xab\xa3\x25\xfe\x41\x1e\xd1\x0f\xc3\x72\x14\xd6\xdb\xc6\x30\xde\x1f\xf9\x33\xf1\x36\xdc\xab\x07\x3e\xf4\x1e\xd3\x0b\xf8\x3d\x32\x8e\x8a\x6c\xd5\x97\x62\xbb\xdf\x02\x9c\x1d\x80\x82\x32\x03\x10\x27\xda\x93\xc2\x0b\xcc\xa8\x74\xba\x0b\xda\x24\xe2\x73\xac\x23\xfe\x53\x38\x6c\xb8\xa4\x19\x96\xd3\x55\x6b\x41\x7c\x57\x4d\xe0\x18\x59\x99\xea\x41\x1f\x88\x31\xa6\xa8\x60\x02\x3f\xc9\xa3\xe4\x7e\xf8\x25\x8f\x38\xc5\xa1\xc8\xab\x96\x6b\x5d\xea\xc6\x5b\x3b\x70\xa2\x31\x70\x8f\x6c\x63\x98\x9e\x48\xf5\x61\x14\x65\xee\xdc\x4a\x56\xc8\x39\x1f\x38\xbd\x9c\xb9\x1c\x24\x3f\x10\x85\x7d\x23\xc4\x00\x7d\x12\x5f\x1d\x0d\x51\x03\xdb\x7e\xcc\x56\x1e\x86\xa7\x76\x7e\x62\x08\x42\xbc\xc5\xfe\x2a\xfd\x28\x03\x2c\x4b\x80\x58\xa9\x52\xa4\xb7\xee\x29\x7c\xaa\xdd\xf3\xfc\xfc\x4c\x1e\x25\x9f\xe7\xd5\x8e\xef\x08\x81\x66\x22\x7a\x27\x8b\x0c\x38\xc4\x4c\x20\x2b\x92\xcc\xf2\xdf\x73\xc7\xdc\x65\x4d\x06\x80\xc3\x3a\x97\x47\x37\x68\x2f\x5d\x82\xe5\x12\x1f\x02\x32\xa4\xc0\xa4\x39\xb6\x27\xce\x6c\x7c\x24\x86\x60\x53\xc3\x49\x82\x64\xf6\x70\x00\xc5\xf3\xac\x99\x8c\xab\x40\x95\xf8\x94\xc0\xb6\xdb\xa9\x1a\x42\xed\x68\x3a\x65\x24\xbc\x04\xf5\x1e\xee\x98\x9b\x0e\xdc\x00\x12\xd3\xe7\x17\xf2\x28\x9a\x7d\x2c\xb8\x76\x18\xad\x45\xd0\xcb\x6d\xff\x7e\x6d\xc0\x06\x76\x6f\x94\x48\x93\xb6\x1a\x23\x8b\x04\x7e\x86\x60\xcc\xf7\x25\x40\x17\xf9\xf3\xe0\x6c\xfa\x3d\x5d\x97\x00\x02\x0c\xf9\x45\x1b\xb5\x72\xb2\x7e\x03\x17\xd7\x1d\xd4\x02\x12\x76\xdd\xcd\x5d\xd5\xc5\xae\xb1\xde\x2d\xc1\xd9\x42\x88\x1d\xa6\xbc\xb7\x36\x46\x3c\x45\x14\x54\x19\x84\x7e\x24\xa9\xce\x5f\xc9\x23\xff\xb4\xc7\x4b\x60\xfd\x7b\x1f\x09\xec\xa2\xf2\x07\xe2\x2d\xae\xe1\x6b\x79\xf4\xc9\xec\x8f\xe4\xb1\xa9\xe1\x6f\xf5\xd1\x89\x3f\x01\x2d\xf9\xaf\x28\x43\x8b\xde\x81\x88\x31\x8f\x4c\x54\x70\x49\x07\x28\x34\x2c\xd2\xf3\x8e\xc3\x16\x43\x58\x96\xc8\x5e\x6c\x7f\xb3\x07\x21\x92\x50\x03\x45\x9f\x29\xac\xdd\xfb\x1c\x98\x39\xc5\xa9\xbf\xcf\xcf\xd1\xe9\x12\x0d\x0e\x48\x6d\xdc\x6c\x5e\xbc\xf0\x4e\x46\xc8\x7b\xa4\xa1\xf3\x6b\x02\x4b\xef\x4e\x9c\xe5\x7f\x94\x70\x6b\x60\xa7\x0a\xce\x89\x5e\x21\xdf\x07\xef\x14\x60\xdb\x7f\x32\x7b\xec\x95\x4a\xbc\xc3\x63\x12\x76\x3d\x93\x47\xf4\x9d\x17\x2f\x68\x4d\x8f\x15\xe2\x16\x01\x4d\x76\x46\xe8\x61\x22\xa6\xb5\x85\x33\xa1\x38\xd5\x17\x7f\x48\xaa\xd5\x56\x55\x2a\x38\x0b\x10\x63\x16\xe6\x93\x71\x91\x96\x58\x1e\x70\x98\x0a\xc9\x72\xbd\x32\x06\x13\x3a\x5e\x9e\xc0\xed\x05\x46\x74\xd7\x04\x14\x56\x80\x62\xb0\x29\x36\x0d\x20\x69\xac\x5c\xeb\xc7\xdf\x9d\xfd\xeb\x89\xa7\x05\xdd\x37\x70\x94\xa0\xc2\xed\x5e\xd5\x48\x6b\xb3\xd4\x95\xde\x14\xa0\x0c\x26\x4d\x46\xa3\xc2\x43\x7a\x91\x9f\xc9\xf9\xf4\x76\x76\x39\x04\xeb\x35\x24\xcb\x5f\xe4\xe7\xe0\xb7\xeb\x28\x20\xf2\x3d\xbc\x72\xfd\xbf\x73\x42\x87\xc5\x80\x45\xea\x51\xf1\x68\xea\x72\x7d\xfa\x58\x38\xc5\xaf\x36\x07\x55\x36\x87\xd3\x4d\xad\x35\xd2\x38\x87\x80\x8a\x4f\x83\x4b\x78\x9b\xbc\xf2\x99\xb8\x5f\x84\x77\xbf\xa0\x54\x7a\x23\x84\xdb\x3b\xa2\x7c\x7f\xce\x99\x74\x1c\xe9\x5b\xc1\x13\xe5\xd9\xf5\x4f\x22\x81\xe6\xb6\xab\x3b\x45\xcc\x5d\xcf\x42\x10\x21\xa3\x44\xd8\x8c\xc9\x3f\x33\x46\x0a\x80\xa9\x30\x32\x6d\x0b\x66\xbf\x2b\xf0\x8e\x7b\xf4\xa4\x93\x4e\xd8\x27\x79\xba\x32\x8e\x26\x44\x48\x1e\x4a\x46\x6a\xda\xcf\xa0\x6f\x08\x77\xb4\x70\x6d\xf0\x31\xb1\xf4\x9a\x78\x17\x97\xd7\xbc\x50\xe2\x66\x94\x33\x00\xfc\xb8\x25\x61\x76\xa5\xef\x74\xc6\x71\xf3\x8c\x92\x5d\x95\xfb\x19\xac\xcc\x0e\x60\xdf\x80\x8b\x4d\x97\x25\xb1\xd1\x42\x2a\x3f\xe0\xe1\xab\x12\x2d\x80\x97\xa6\x16\xc1\x1c\x71\x6b\x67\x42\xe1\xfd\x37\x2c\x4d\x2e\xc4\xf1\xea\x24\x8e\xee\x07\xae\x36\x8e\xc4\xb0\x14\xba\xc8\xcf\xdd\xf9\x70\x23\x71\x6b\x01\x79\xd5\x1b\x82\x64\x20\x60\x47\x01\xe5\x40\xdd\xfd\xde\x14\xb5\x8d\x52\x4e\x3a\xda\xed\xb3\xdc\xf4\xa0\xb5\x1e\xaf\x4f\xe4\xc4\x34\x6e\x07\xfd\x55\x8d\x07\xc6\xa5\x2d\xee\x42\xf0\x99\x8c\x12\xf4\x68\x4e\x6f\xe4\xf9\x09\x24\x4b\x80\xc2\x01\x9a\x0f\x80\x95\x39\x65\x4b\x07\x55\x2b\x19\xdc\xcf\xf2\xe2\x44\x5a\x0d\x2f\x78\xcf\x67\x04\x7e\xc6\xd4\xf2\xd5\x09\xec\x4d\xec\xf1\xb4\x4c\x10\xbe\x3c\xbc\x91\xc5\x49\x94\x72\xbd\xea\x35\xed\xbc\xf6\x56\xd0\x87\xbf\x66\x06\xd2\xd1\xc6\x3a\x65\xd6\xa6\x40\x7d\x04\x42\xe6\x58\x5b\xe9\x22\x2a\x74\x54\x38\x29\xe5\x2b\x67\x17\xc7\x48\xcd\xd3\xb7\xe3\xd1\xfb\x01\x19\xc9\xaf\xf2\x73\xe6\x18\xf3\xe9\x5d\x5c\x84\xb0\x68\x29\x6a\x51\xba\x64\x3a\x64\x4c\x01\x4d\xb0\xb7\xa0\xe6\xbf\xa7\xa8\xed\x6b\xcf\xa7\x07\x52\xe4\xcf\xd4\x1a\x42\x10\x3d\x0f\x28\x5e\x21\xa8\x33\x89\xa3\x79\x2a\x4a\x8b\x8e\x92\x8e\x61\x59\x19\x10\x34\xa4\x4d\xc7\xf3\x4b\x51\xee\x42\x09\x0b\xa4\xa3\xc3\x4d\x45\x30\x16\x63\x11\xf3\x8f\x26\x85\x56\x6b\xdf\x42\x21\x12\x4f\xd9\x00\xda\x73\xed\x81\x75\x50\xd5\x89\x98\x0a\xda\x79\xa8\xd1\xfa\x34\x09\x76\xf0\x0b\x96\xd7\x81\x42\xd3\x8d\xd2\x97\xc7\xc0\x4d\x70\xaf\xda\x36\x2a\x3b\xe8\xf1\x4b\xc8\x18\x82\xce\xad\xed\xce\x54\xd8\xd0\x13\xa4\xa2\x41\x68\xe0\xb1\x48\x5d\x14\xa8\x99\x40\xad\x7c\xad\xdd\x9d\x82\x0d\x41\x6d\xca\xab\x52\x22\xc1\xc6\xb6\xba\x01\xf8\x10\x12\xb0\xc1\xcf\xb3\x34\x6b\xc8\x7d\xa7\x0a\x57\x53\x69\x79\xbf\xaf\xd6\x00\xaf\xfb\xa8\xab\xe6\x20\x8f\xcf\x2f\xce\x4e\xc4\x5a\x1d\xac\x5c\x62\xb2\x1a\x56\xd5\x15\xbb\xa7\xa6\xeb\x73\xb1\x10\x17\xc6\x87\x67\x92\x59\x08\xca\x7e\xdc\x6a\x4d\x55\x11\xf1\x80\xb3\x84\x31\xdc\xb3\x72\x92\xd9\x78\x5c\x60\xb6\xb1\xbb\xa4\xa8\xfc\x7a\xa9\x12\x66\xc6\x7c\x0d\x6d\x42\xc2\x62\xbb\x2b\x75\x08\x5e\x9b\x0d\xee\x44\x3a\x38\x30\x3a\x22\x28\xce\x6f\xf9\x12\xa8\x4f\x4e\xee\xf4\xb4\x57\x24\x7e\x15\x89\xef\x32\xc4\xf0\x3d\xff\x0d\x91\x8e\xfb\x39\x51\xe5\x5e\xff\x08\x9c\x3a\x98\x76\x9e\x3a\xcc\x20\x67\x2f\x02\x37\x8c\x64\x03\xd4\x38\x12\x81\x8b\x4d\xb3\x79\x81\x1a\x82\xb4\x23\x60\xe8\x91\x4b\x65\x09\x58\x08\x1f\x33\xa7\xc3\x1c\xbf\x3a\x3b\x91\x70\x1e\x78\x19\xf0\x75\x5a\xed\x6d\x63\xb6\xba\x16\xf1\x8d\xe8\xae\x05\x20\x8e\x5f\xc8\x19\xdb\x9f\x13\x44\x4f\xcd\x83\x68\x59\xef\x51\x40\xa2\x7e\x12\x30\x4f\x82\x99\xca\xd5\x09\xce\x64\x12\x5d\xd1\x12\xc1\x0c\xb8\x23\xc6\xee\x13\x3c\x49\x74\xda\x42\xb3\x31\x1a\x93\x48\x76\xc9\x59\xf7\xeb\xbd\x46\x63\xcf\x4a\xef\xc1\xa0\x22\xbf\x8e\x2c\x4c\x1b\x16\xca\xf3\x51\xc7\xcc\x58\x5c\x9a\x45\x7a\xbb\xa9\x0f\x27\xc4\x5d\xa9\x08\xbd\x96\x93\x03\xcb\xe2\xb3\x86\x8c\x5f\x51\x1a\xf3\x99\x78\x7c\xa2\xdc\x6d\x98\x66\x10\x03\x6b\xc4\x07\xad\x51\x65\x8f\xd7\xfc\xd8\x9e\xb0\x74\x05\xe8\xe3\x4f\xa1\x12\x03\xa0\x5a\xa2\x2b\x4c\x0e\x28\x9a\x44\xe2\x48\x08\x9e\x38\x3f\x73\x81\x20\xe2\xd1\x7e\xc5\x96\x18\x4a\xea\x34\x57\x84\xbd\x98\xf1\x3a\x23\x39\x26\xea\x11\xd8\x5f\x9f\x0c\x36\x75\x64\x45\xf8\xb4\x2e\xae\x26\x32\x5e\x69\x42\xb7\x05\x3f\x26\xab\x7b\xe3\x14\xba\xc6\xe0\x93\xe2\x2f\xdd\xea\xde\xe9\xa7\xee\x3d\xd4\x70\x1d\x33\x0f\x10\x96\xc5\xe0\xb2\x6b\xbd\x05\xa4\x06\x67\x3a\x06\x06\xa8\x65\x49\xa4\x9a\xe0\x07\x88\x57\x3d\x05\xbf\x84\x75\x4e\xb1\x6c\x05\x9e\x4f\x9f\x83\xed\x91\xf7\x8d\xb4\x06\x9f\x71\x7e\x1b\xcc\x63\x05\xb5\x41\x94\xff\x80\xef\x22\xff\x88\xd3\x89\x3b\xaa\x62\x74\x8f\x98\x07\x59\x2d\xad\x29\xf7\x50\x76\x8d\x74\xfb\x60\x77\x78\x89\xe3\x27\x2e\xba\x13\x97\x4f\x4c\xdc\x5d\x2d\x58\x50\x54\xda\x41\x58\x97\x00\x3c\x41\x4a\x82\x20\x23\xcc\x8b\x70\x6a\x92\xb0\xb6\x7a\x34\x5c\xf2\xfc\x85\xde\x8a\x6a\xb5\xaf\x6b\x04\x89\xec\xff\x4e\x0b\x83\xea\xb9\x1d\x4c\x26\x22\x50\xfc\x21\x33\xfe\x06\x2a\x3e\x5e\xe5\xaf\x3a\xf0\x98\xc1\x97\xc2\x2f\x9b\xed\xa5\x4a\x48\x23\x17\x45\xec\x84\x81\xe5\xa0\xb3\x8e\x5e\x26\xb7\xc3\x04\xd2\x92\xbc\xd0\x66\xc3\x4f\xbe\x95\x4e\x4b\x74\x26\x93\x93\x93\x81\x7c\x80\x61\xd6\xe1\x3d\xed\xc6\x32\x5c\xab\x6e\x70\x41\x31\xa3\x4b\x6c\x1b\xb8\x23\xc2\xbf\xc3\x4f\x28\x99\x5d\xdd\xb8\x88\x9f\x95\x96\x76\xd9\x76\xbc\x50\x82\x0d\x76\x49\x18\x09\x90\x30\xbd\x2b\x56\x0c\xee\xcd\x79\x62\x24\x19\x22\x49\x99\xac\x99\xa9\x79\x88\x8c\xe9\x9f\x49\x2e\x88\x4d\xa5\x09\x18\x22\x25\x54\xed\x40\x12\x16\x11\x2f\x7e\x4d\x94\xc4\x62\xa3\x33\xeb\xbe\x2d\x86\xab\xd6\xbf\xab\x31\xed\x40\xcf\x7d\xf7\x6e\x5f\x2f\xbb\x04\x0d\x82\x31\x43\xfd\xe3\x4b\xdf\x47\x8a\xeb\x8c\x29\xfa\xd4\xc1\xd7\x13\xe0\xa9\x0d\xc5\xdf\x44\xb4\x10\x33\x29\xa7\x39\x97\x9f\xa8\x1c\xb3\xa8\x22\x1d\x33\xe4\xf6\x3d\x11\xe0\xa0\x47\xa5\xe5\x26\xf8\xca\xec\x9f\x44\x40\x15\xdf\x24\x8e\x10\x3a\x1c\x07\x84\x13\xa7\xba\xfb\x90\xb0\xc4\x96\x05\x18\x68\xbd\xa2\x07\xb2\x98\x9e\x90\x15\xb8\xab\x2d\xa1\x24\xfe\x7a\xa1\xd4\xea\x48\x3c\x29\x94\xbc\x98\xed\x93\x39\xaf\x63\x37\x49\x24\x5c\x48\xaf\x4f\xbc\x28\x12\xfc\x76\xce\x9a\x8d\xc3\x15\x28\x73\x22\x23\xf6\xf7\x85\xb3\xda\xbc\x8b\xee\x85\x8a\xfb\x84\xc9\xd8\xa2\xba\x2b\x7d\x26\x1c\x68\xf7\x49\x69\x43\xba\xc3\x54\xfb\x93\x8a\xb7\x8e\x9b\xd6\xed\xe2\x66\x5f\x6e\x0a\xf0\xa6\xb2\x56\xd0\x8e\x3d\x48\x29\x5f\xe7\x67\x72\x34\xc1\x8c\xa3\x4f\x90\x7f\x34\xbd\xbe\x19\x7f\x92\x57\xb7\x43\xf7\xaf\xf9\x62\xb0\xb8\x5d\x0c\xe5\x74\x26\x67\xc3\xf7\xb7\x63\x22\x43\xf2\xfa\x5f\xa8\xf1\x80\x4e\x3e\x85\x9a\x0d\x6f\x2b\x55\x87\xb6\xdb\xb9\xc7\x94\xad\xb5\xdd\x91\x3b\xd0\x12\xf2\x4b\xe4\xaf\x4e\xc5\x26\xa9\x8c\x50\x1c\xd8\xe8\x4c\xfe\x65\xbf\x06\x2f\xa8\x80\x0a\xa9\x8c\xa8\xaf\xf7\x65\x44\xf7\xc5\x4b\xf8\x06\xbc\xbf\xf1\xf0\x9e\x1e\xd7\xf3\xb1\xc2\x9f\xbd\x9f\xc9\x4b\x42\x74\x52\x71\xa8\x25\xe4\x10\xbb\x23\x23\x10\x79\x0f\xac\xc0\x5c\xce\xd1\x12\xc1\x38\x84\x1b\x24\x0b\xf4\x58\x84\x43\x45\xe4\xf0\xfd\x60\x4c\x8a\x32\xeb\x8a\x60\xec\x90\xdf\xc0\xbd\x60\xc0\x4a\xda\xfe\xbe\xf7\xf8\xf7\x96\x51\x25\x31\x68\x82\x86\xa5\xe9\xf2\x34\x09\xbc\x1b\xcf\x37\x2d\x75\xba\xb2\x19\x1b\x54\x7e\x1a\x82\x87\x11\xc0\x88\xcb\x03\xd1\x36\xd0\x29\x54\x51\xaa\x9e\xd9\x48\xe0\x12\x07\x2c\xd4\xcf\x45\x59\x12\xe4\x11\x38\x11\x1a\x83\x32\x0f\x9c\x69\x08\x86\x20\xa5\xfc\x2e\x3f\x93\x83\x9b\x9b\x31\xb1\x72\x51\xf6\x59\x04\xff\x92\xa0\x9d\x80\x4f\x42\x53\x41\xf8\x5a\x87\x12\x9f\x7e\x69\x74\xef\x6e\x63\xd3\x30\x68\x9f\x16\x7d\xa6\x11\xe9\xb7\xfc\x5e\xb6\x8c\xc4\xe0\x09\x48\x36\xe9\x1c\x47\xff\x7d\x7e\x26\x21\x81\x0d\x18\xc7\x10\x12\xd3\x8f\xfc\xfb\xfc\x5c\x4e\xf4\x63\xa4\x0a\xcd\xf7\x15\x48\x2b\xb6\xce\x6b\x8d\xe8\x9b\xe4\x0e\xae\xf4\x63\x87\x94\x87\xcf\x2e\x8a\xf5\x62\x0b\x73\x76\xff\xcd\xe5\xd0\x19\x74\xfc\x78\x3e\x12\x8e\x05\x56\x9d\x2a\x38\x25\x45\x75\xb7\x2f\x2c\x60\x1c\xf3\xc7\xaa\xfd\x76\x09\xa2\xf4\xfb\xfc\x42\x0e\xc9\x85\xb1\x69\x0d\x73\xea\x1e\xbd\xf4\x86\x06\xfa\x44\x1c\x7a\x80\xf0\x16\x51\xca\x47\xeb\x25\xf7\x8f\x6c\x60\x50\x82\x72\x7e\xf7\x3c\x17\x15\xde\x79\xa2\x36\xee\xe5\xdc\x52\xbe\x02\xba\x45\xc2\x14\x6c\x14\xf7\x75\x38\xb4\x3d\xde\xdd\xb4\x39\x7c\x56\x38\xc0\xff\xc4\x50\xa3\xe9\x2d\x0f\x6e\xbb\x80\xd1\xc3\x54\x5a\xc4\xf9\x1e\xfb\xca\x17\x38\xfb\x74\x84\x08\x16\x97\x5c\x05\x01\xc9\xb7\x31\x7d\x72\xfa\x07\xf4\x7b\x5e\x8e\x07\xa3\xeb\xe1\xcc\x9d\x9e\x00\x06\x3d\x9d\x8d\xde\x8f\x26\x03\xcc\x4d\x4c\x52\x4e\xbb\x08\x49\x12\xc8\xed\x7c\x2e\xea\xdb\xc1\x7c\x34\xcf\xe4\xc7\xd1\xe2\xc3\xf4\x76\x21\xb8\x4d\xd7\xfe\x60\xf2\x49\xfe\x79\x34\xb9\xca\xe4\x70\x04\x19\x90\xc3\x5f\x6f\x66\xc3\xf9\x7c\x78\xe5\x5e\x83\xd1\xf5\xcd\x78\x34\xbc\xca\xe4\x68\x72\x39\xbe\xbd\x1a\x4d\xde\xfb\x56\xe4\x78\x74\x3d\xc2\x24\xd2\x4c\xb4\x13\x34\xdd\x99\xef\x8c\x97\x33\x4b\xaf\x86\xef\x86\x97\x8b\x79\x26\xaf\x87\xb3\xcb\x0f\x83\xc9\x62\xf0\x76\x3c\xcc\xe4\xbb\xd1\x42\xbe\x9b\xce\xc4\x00\x92\x4c\x47\x97\xb7\xe3\xc1\x4c\xde\xdc\xce\x6e\xa6\x73\x78\x99\x26\xd3\xc9\x29\x25\xa5\x8e\x26\xef\xf3\x28\x17\x53\xb6\x72\x31\xff\xfd\x76\xe0\xde\x39\x48\x90\x6d\xe5\x65\xf6\x0e\xcc\xcd\x48\x7e\x9a\xde\xe6\x72\xfe\x61\x7a\x3b\xbe\x82\x45\x49\x3e\x25\xdc\x5a\x0f\x69\xe4\xa3\x5f\x86\x72\x34\x81\x0f\xcd\x86\xf3\x9b\xe1\xe5\x22\x73\xdf\x96\xc7\x93\x29\xce\x1c\xd2\xb9\x06\x63\x79\x35\xfc\x65\x38\x9e\xde\x0c\x67\x27\x94\x40\xea\x7e\x2b\x2e\xa7\xf3\x05\xaf\xfc\x64\x78\x39\x9c\xcf\x07\xb3\x4f\x72\x3e\x9c\xfd\x32\xba\x84\x05\x9e\x0d\x6f\x06\xa3\x99\x9b\xf2\xe5\x74\x36\x73\x1d\x4e\x27\x39\x6e\x6f\x72\x36\xc2\x3e\x5e\x4e\x27\xf3\xc5\xc8\x3d\xe1\x73\xb7\xed\x6e\xfb\x26\x30\x02\xb7\x92\x6d\xf1\x99\xcb\xc9\x54\xde\xce\x87\x3c\x06\x9e\xa8\xe0\xe5\x18\xdc\x2e\x3e\x4c\x67\xa3\xff\x63\x78\x25\x3f\x0c\x67\x43\x3c\x5d\xc3\x5f\x2f\x87\x37\x8b\xf8\xa8\x85\xb1\xe0\xd9\xfd\x31\x3f\x93\x8b\xe1\xec\x7a\x34\x21\xf5\xe1\x47\x88\x3b\xb6\xd4\xa4\x28\x53\x86\x23\x3c\xde\x2f\x8c\x02\x0b\xeb\x45\x41\x73\xdb\x37\x66\xab\x00\x1b\xa4\x3c\x08\xb2\xcc\x36\xaa\x28\xdb\xda\x07\xde\x2e\x4c\xb8\x41\x9c\x70\xfe\x90\x53\xa3\x40\x16\x2c\x01\xea\x8e\x9c\x70\xe2\xd5\x99\xf7\xbd\x01\x0a\x1b\xe4\x1e\x60\xd4\x02\xef\x3e\x7e\x1c\xeb\x90\x42\xe4\xcf\xf6\xda\x3a\xc4\x0a\x0f\x75\x5b\x10\xa2\x2c\x0f\x7e\x6e\x58\x20\x61\xf7\xf5\x03\x16\x9c\x1c\xfc\xf4\x7a\x7c\xe7\xb9\xb8\x71\x96\x87\x0d\xfe\xe9\x8c\xf4\x4e\x28\x15\x40\xa7\x19\x95\x3d\x01\x5e\x5e\x70\x39\x2f\xf5\xc1\xd0\xea\x46\x1d\x74\x14\xc6\x64\x38\xc0\xf4\x71\x91\xba\x99\xdd\x17\xa2\x01\xa6\xf1\x0b\xb7\xa1\x4c\x26\x52\x96\x52\x63\xa9\x5b\x70\xe4\x7b\x0c\x59\x2b\x8f\x21\x18\xbc\x4e\x70\xd0\x00\xd9\x0c\xdc\xb1\x56\x97\xa5\xae\xed\x09\x3d\xd4\xc1\x3a\x07\x94\xe1\xf2\x20\x78\xf9\xc8\x34\x21\x03\x22\x6a\x29\x3a\x34\x58\x35\xe1\x36\x26\x1a\x78\x32\x51\x11\xfd\x06\xcf\xea\x4f\xf9\x19\xca\x2f\x77\x09\xc6\x23\x52\x8c\x85\xc0\xe3\x3d\x99\xca\xcb\xd1\xec\xf2\xf6\x7a\xbe\x70\x72\x03\xf3\xe7\xfd\xaf\x50\x5b\x5b\x7c\x18\x4e\x67\x9f\x32\xc9\x08\x76\x8b\xe9\x6c\x21\x8f\xbd\x98\x14\x93\xe1\xfb\xf1\xe8\xfd\x70\x72\x39\x3c\xc9\xdc\xfd\x5c\xcc\x06\x97\x51\x9a\xfc\xc7\xd1\x7c\x98\xc9\xf9\x87\xc1\x78\xec\x64\x47\xd6\x2f\x37\x32\x77\x41\x05\x66\xa6\x43\x1b\xa3\xb7\xb7\x8b\xe9\x0c\x9a\x71\x57\xd7\x87\xc8\xa6\xf0\x56\x24\x22\xcb\x7f\x68\x7e\xeb\x54\x29\x94\x18\x70\xdf\xdf\xc9\xf9\xed\xe5\x07\x94\xb2\xc3\x79\x26\xdf\x0e\x61\x09\xc6\x60\x0a\xb8\x4f\xdc\x0c\x67\xf3\xe9\x04\x2a\x18\xdc\x3f\x47\x93\xab\xd1\x0c\xa4\x9c\x13\x76\xa3\xc1\x18\x9e\x83\xd1\xd5\x70\xb2\x18\x8c\x33\x01\x72\x6a\x32\x1f\xfe\xfb\x2d\x09\x9d\xab\xc1\xf5\xe0\xfd\x70\xce\xf2\xe5\xf2\xc3\xc0\xcd\x7d\x38\xfb\xca\x23\xc2\xdf\x13\xae\xdf\xf1\x74\x0e\x0d\xbc\x9f\x4e\xaf\x3e\x8e\xc6\xe3\x0c\xc0\x00\xe5\x7c\x31\xbd\xb9\x19\xbc\x1f\x66\x60\xc0\xdc\xba\x46\xdf\x0d\x46\xe3\xdb\x19\xbc\x10\xd7\x83\xf1\xbb\xdb\xc9\x25\xb6\x86\x83\x87\x37\xc0\x2d\x32\x2f\xe2\xb5\x7b\x74\x92\x51\x62\x67\x6e\x21\x86\xbf\x0c\x27\x72\x14\x2d\xcf\x27\xda\xa1\x0f\x83\x5f\x86\xe2\xed\xd0\xfd\x16\x52\xf1\xdd\xe3\x88\x6f\xc9\xcd\x74\x3e\x1f\x91\x59\xc5\x0b\x4b\x2d\xe7\x2c\x75\x79\x86\xe9\x59\xc3\x96\xdd\x93\xe1\x54\x5d\x30\xca\xfc\x2f\x61\xe9\xaf\x86\x83\xc5\x07\x37\x3c\xdc\x8e\xc1\x58\x8e\x26\x7f\xba\x9d\xc1\xa3\x73\x3b\x5e\x8c\x26\xef\xb1\xec\xc1\xf5\x29\x60\xb4\x2f\xe6\x32\x1c\x3b\x7e\x0c\x87\xbf\x2e\x86\x93\x05\xeb\xd3\x6e\x97\xc7\x83\x8f\x4e\x77\xf8\x30\x7a\x3b\x5a\xcc\x71\xc8\x61\x90\xb9\x98\x4f\xaf\x87\xf2\x4f\xb7\xb3\xd1\xfc\x6a\x74\x89\xbc\xb9\x57\x53\x1c\xe8\x78\x3c\xfd\x48\x8d\x5e\x8e\x6f\xe7\x30\xa7\x59\x6b\x86\xe1\x68\x3c\x79\x32\x32\x39\x9f\xe2\xe2\x84\x76\xdc\x3e\x45\x0d\x5d\x0f\x3e\x25\x6b\x23\xdc\xf3\xcc\x7c\x32\x67\xf2\x36\x9f\xe7\xf2\xfd\xf4\x97\xe1\x6c\x02\xf5\x29\x43\x77\x41\xe7\xc3\xd9\x5c\x08\xfc\x15\x98\xed\x50\x0a\xe9\x11\x98\x7d\x8d\xb6\xc7\x4d\xe6\x6c\x3a\xc0\x6d\xad\x13\xb7\x30\x58\x06\xad\xa6\x08\x83\x41\xc9\xf6\xcf\x77\xb5\xd3\xc1\x39\x1d\x88\xe0\xf5\xf7\xcb\xf0\x03\x71\xcc\xbe\x99\x42\xd7\x27\x1e\x19\x57\x47\x8d\xbc\xb0\xfc\x2c\xfa\x6c\x43\x1a\x2e\x71\xcc\x99\xed\x4e\x55\x87\xa2\xba\x13\xa9\xf7\x0e\x25\xdd\x92\xe9\x91\xd1\x36\xd9\x98\xba\xb9\xef\x54\xd6\xe2\xbf\x00\x28\x08\x5a\xac\xd7\x21\x5c\xfa\xfa\x47\x79\x99\xbf\xcb\x67\xb9\xbc\xb8\xf8\x21\xff\xe1\xe2\xec\xdc\x43\x5e\xd3\x0f\x2e\x4e\x5f\x23\x44\xfc\x95\x76\xea\x3d\xc7\xa6\xae\xf4\x06\x71\xfa\xae\xcc\xd5\x89\x80\x25\xb5\x58\x5e\x8b\x49\x1a\xed\xd6\xf3\xf3\x33\xf0\xcb\xca\xf3\x8b\xfc\xe2\xfc\x02\x9b\xac\x4c\x75\x7a\x65\xae\x64\xf2\x75\xda\xef\xf3\xfc\x4c\x5e\x8f\xe6\x97\xc3\xf1\x78\x30\x19\x4e\x6f\xe7\x2d\xfb\xaf\xd6\x3b\xf7\xa2\x54\x8d\x4f\x59\x07\x78\xda\x08\xd1\x3c\x10\xd6\xf8\x84\xa4\xad\x6a\x1a\x4a\x72\x32\x1b\xf0\xd6\x11\x73\x3f\x3e\xbf\x1d\x0f\x4f\xe1\xd4\x8b\xd2\xb3\xa5\x56\xba\xda\x98\x7a\xa5\x9d\x2a\x4f\x16\xb2\xff\xae\xf0\x3b\x02\xb0\x24\x5b\x4e\x2c\x48\x4d\xef\x40\x10\xc2\xc1\xcb\xa2\x91\x51\xab\x88\x36\x22\xd2\x87\xdb\xd9\x72\x91\x43\xea\x52\x95\xc5\xc6\xd4\x55\xa1\x80\x18\x64\x17\x94\x07\xf7\xfc\x76\xcc\x7d\x91\x12\x89\x00\xcc\xb9\xaa\x0e\x59\x20\x7e\xf1\x39\x3c\x27\x99\x0c\x0f\x78\x81\x59\xcd\x9b\xb2\x58\x35\xa7\x66\x73\x5a\xaa\x47\x11\xfa\xca\x01\x9d\x30\x76\xed\xac\x0b\xbb\xdb\x13\x13\x29\xa9\x46\x31\xf7\x1e\xa5\x80\x01\x8f\x62\xd1\x14\xff\x5d\x3b\x35\x85\x38\x4a\x38\x6d\x70\x75\xaf\xea\x06\x9c\x93\xe8\x8c\x28\x6c\xc3\x64\xb5\x6b\x23\x97\x7b\x5b\x00\x0d\x0c\x5d\x95\xdb\x0a\x5c\x18\x73\x60\x7e\x70\x3a\xcf\x60\xab\xeb\x62\xa5\x32\x72\x3b\x36\x1c\x6f\x49\x5d\xd6\x1d\xbd\x08\x7c\x1a\x51\xc2\x9a\x16\x7f\xd9\xd7\x85\x5d\x17\xab\x38\xf3\xe5\x9d\x5e\x83\xa3\xfc\xd2\xec\xeb\x00\x29\x35\x71\x37\x4e\xd7\x15\xc5\x3f\xd0\x84\x0e\x1b\x84\x10\xbd\xf2\x41\x3b\x13\x17\xd3\x35\x8b\x4a\xce\x55\xd5\x28\x79\x59\xaa\x5a\xb9\xe6\x20\xea\x12\x7d\x27\xf8\xae\x4a\x44\x79\x85\xa5\x13\x6e\xa9\x4d\x15\xdc\x71\x2b\x63\x9b\x84\x42\xa5\x2f\x23\x78\xe5\x46\x8b\x1f\x25\x25\x8c\x21\x52\x84\x6a\x1a\x53\x57\xfa\x60\x5f\xc8\x8d\xd6\xf8\x6b\xfd\x65\x07\x0a\x2f\x06\x24\x54\x9a\x6c\x13\xad\xf9\x84\x7c\x22\x97\xa6\x7a\x40\x50\x6d\x61\x2a\x8c\x85\xaa\x55\x13\xb0\x03\x11\x26\x1f\x3e\xac\x4a\x39\x57\x88\xee\xf6\xde\x98\xb5\x45\x42\x5a\x80\x3b\x2d\x0f\x74\xec\xf4\x1a\xd2\xc3\x05\xf1\xdd\x44\x8e\x3e\x3c\x50\x11\x55\x11\x85\x63\x4a\x55\xdd\xed\xd5\x9d\x26\xa8\x6a\x4e\xcd\xe4\x8d\x15\x08\x47\xb7\xd7\x6b\xa9\xee\x54\x51\x59\x82\xb6\xab\x31\xaf\x3a\xd4\x31\x7b\x7c\xa8\x34\x2c\x33\xfc\x15\x9e\x4b\x39\x90\xa7\xc2\xd9\xfa\x21\x43\xc2\x03\x04\x1e\x2d\x5a\xe9\xf1\x8d\x87\xbc\x50\x75\xfb\x64\xc9\xde\x46\xd8\xdf\x02\x65\x40\x00\xd7\xe5\x8b\x23\x4e\x7e\x4e\x52\x7b\x3c\xe2\x20\xb4\x4f\xb7\xbd\x3f\x42\x21\xc6\x6d\x78\xdb\x88\x37\x31\x24\x15\x79\x23\xad\x91\xff\xf1\xfc\x1f\x91\x0b\xe1\x5f\xa7\x27\xb0\x68\x83\xd8\x4c\x13\xac\xdc\x1d\x67\xaf\x04\xa4\x45\x64\x82\x55\xc1\x7e\xaf\x04\x26\xab\x08\x41\x27\x24\xa2\x96\xca\xe5\x5c\xeb\xa4\x37\x3e\x6c\xc0\x1a\xb4\x29\x56\xe1\x50\xa0\xd4\x8c\x12\xa8\xb1\xf4\x3f\x78\x71\x3b\x43\x27\x24\xdd\x4e\x28\xef\x2b\x6b\x43\x7f\x24\x7d\xbd\xeb\x7e\x7c\x22\x44\xf8\x06\x0e\xc4\x75\xb1\xaa\x0d\x72\xa8\x03\x58\xc0\x2a\x77\x0d\xdd\x70\xba\x24\x67\x28\x2c\x0f\x6f\xbe\x71\x1c\xff\x21\x20\xd2\x13\xa1\xd0\x5c\x9e\xfc\x8e\xef\x3a\xeb\x77\x86\x5a\xc9\x2c\x60\xbf\x44\x99\x0e\xc7\xf6\xf7\x34\xc7\x97\xe8\xad\x3c\x0d\x67\x1f\x17\x8a\xff\x29\x39\xaf\x3b\xd4\x3c\x79\x94\x8b\x37\x42\x4c\x77\xba\x9a\x6e\x36\xc5\x4a\xe7\xa6\xbe\x93\xbf\x5e\x8f\xe5\x3b\x77\x01\x10\x70\x4e\xce\x69\xe3\x49\xe6\x41\xe2\x08\x22\x5c\x10\x28\xe2\x97\x6d\x99\x9b\x9d\xae\x8c\x6f\xa3\xd3\x66\x9c\x58\x78\x83\xec\x4a\xe0\x1e\x18\xf9\x6a\x83\x27\x7b\x11\x82\xba\x51\xbb\xa2\xdd\xcd\xff\xdf\x15\x8a\x7f\xfc\xf9\x47\xfe\xc9\x5f\xae\x9d\x16\x0a\x07\xe1\x3f\xde\xdf\x8c\x4f\x5f\xe5\x67\xff\xcb\xdf\xb9\x1a\xf8\xd9\xfa\xdf\xf3\xb3\x57\x17\xaf\xbf\x6f\xd5\xff\x7e\x77\x76\xf6\xfd\x1f\xf5\xbf\xff\x8c\x3f\x80\x5f\x0e\x95\xf9\x63\x79\x73\xfb\x76\x3c\xba\x0c\x21\x1f\x4e\x5f\x7d\x95\xc9\x8b\x9f\xe4\x9f\xf6\x95\x06\x1c\x30\x27\x47\x59\x2a\xff\xbf\xff\x0f\x42\x83\xbd\xab\x75\x64\xf8\xbd\x33\x7b\x82\x5f\xa4\xb7\xe0\x7f\x75\xe2\xc5\xbe\x79\xf9\x72\x63\x37\x80\xe6\xfa\xbf\x09\x01\x6c\xeb\x4e\xad\x2e\x62\xce\x3d\xe6\x5c\x6e\x05\xa6\x1f\x74\xbd\x54\x4d\xb1\x75\xbf\x2c\x74\x07\xc2\xdd\x5b\x96\x88\x61\x0f\xb0\x98\x04\x3b\x4d\x49\x80\xc4\xfe\xef\x1e\xa5\x5a\xab\xad\xd3\x1e\x41\x7c\x3f\x83\xdf\x0e\x8a\x3e\x16\x89\xb8\x21\x95\x7a\x13\x52\xe2\x21\x19\x2f\xb2\x73\x29\xa2\xf2\xb9\xa8\xd6\x30\x38\x80\x7d\xa6\xa7\xd4\xbb\x60\xa1\x9a\xcc\xd8\x26\xf9\xa6\xa7\xc3\x83\x7a\x05\x55\x12\x62\x34\x16\x02\xdb\xe2\xae\x22\x42\x51\xf5\x59\x0b\xf5\xa8\x0e\x08\xa9\xe9\x86\xb5\x36\x5b\x88\x33\xdf\x73\x4b\x84\x06\xda\x10\xa2\xb2\xcd\xe5\x5b\xae\xf5\xb1\x0d\x42\x10\x46\xd3\x15\xdd\xe9\xc6\xf4\xc8\x77\x7b\x05\xae\x4c\xfd\xf5\x0e\x55\x59\x8a\x38\xd2\xa7\x98\xdc\xef\xf4\x94\x4d\x44\xc8\x0a\x28\x1a\x8f\x02\x0a\xd9\xa5\x7e\x19\x36\x14\x4e\x2f\xb0\xe8\xad\xb6\xb9\xf8\x48\x98\x89\x4f\x1f\x2c\xae\x7f\x7a\x66\x07\x79\xc1\x9d\x65\x05\x6c\x21\xd4\xce\xcf\x90\x87\x42\xd1\x57\x88\xc1\x11\x4e\x0b\xee\xc5\x23\xe2\x95\x52\x26\x3c\x82\xf5\xaa\x83\xb3\x5b\x0b\xa7\x80\x21\x98\x18\x2a\xa5\x2b\x55\x91\xe2\x5d\x34\x1e\x9b\x95\xa9\x0d\x33\xd9\x18\x93\x0b\xf1\xf1\x5e\x57\xf2\x11\xb4\x3b\xf5\xd9\x2d\x50\x32\x7b\x00\x62\x55\x90\x3c\x18\xa1\xc7\xd2\x7a\x63\x56\xcb\xae\x86\x74\xcf\xe9\xbe\x16\xfd\x33\xed\x9e\x97\x38\x17\x23\xc6\x83\x07\xbd\x04\xdb\x16\x29\x0b\x40\xb8\x59\xe9\xe6\x1c\xd3\x4e\xd7\x77\x5e\x4f\xdd\x12\x65\x81\x7c\x2c\xec\xfd\x09\x72\xff\x0a\xf7\x6f\xe6\xea\x8b\x91\x78\x9c\x9d\xa7\x2a\x79\xa7\x01\x7d\x93\xbf\x08\x9c\x25\x4d\x16\x46\xe7\x3e\x83\xe7\x49\x24\xd5\xf0\xa6\x86\x9d\xde\x15\x7a\x85\xa3\x2b\xc0\x5c\x80\xf2\x5b\x37\xce\xb0\xd8\x8a\x41\xf6\x5d\x73\x9f\x2b\xf3\xe8\xfe\x22\x5c\xbb\x6b\xb0\x5c\xd0\xf0\xa8\xee\xe0\x5e\x02\xff\x77\xe3\xcc\x1a\xd8\x32\x54\xae\x61\x2b\x98\x1c\x84\x59\x71\x09\xff\x1e\x42\xd6\x6b\x0d\x8e\x2c\xc4\xfe\x84\x16\x03\xf2\x8e\xb2\x9f\xfd\xaf\x8c\x5b\x7a\x64\xd5\x8c\xe2\x46\x60\x92\x22\xe2\x6b\x16\x76\x64\x45\xdc\xd4\xde\x38\x2e\x4a\xa8\x4e\x14\xb4\x54\xbd\x5b\x14\x2f\x11\x56\x22\x12\xf1\x14\x06\x6e\x8b\xe6\x4d\xb7\x3d\x24\x37\x43\x5f\x47\x38\x05\x90\xe6\x00\x53\xcc\x85\x78\x17\x63\xc3\x3e\xd7\x3f\x25\x00\xd1\xe2\xfb\xe2\x42\x79\x57\xab\xa6\x70\xb6\x0e\x92\xcc\x38\xb3\x9c\x68\xe8\x81\x0c\x5a\x59\xa8\xe0\xf0\x34\xdc\x3e\x5b\xd6\x67\xa6\xd3\xa8\x6c\xd8\x49\x3a\x53\xeb\x5c\xf4\x26\x1a\x11\x6b\x24\xdc\xb5\xcc\x1f\xc0\xe8\xd0\xb5\x90\xa1\x9c\x79\xbe\x16\x7e\x48\xf6\xde\x3c\xe2\x91\xa6\x13\x02\x01\x39\x20\x71\xd7\x07\x3c\x45\x18\xc5\xa2\x2d\x14\x21\xd5\x8b\xc6\x98\xc8\xa1\x9b\x71\xdf\xb9\x22\x8b\xf6\xd1\x10\xff\x9f\x3c\x3e\x3f\x91\xca\x5a\x5d\x37\x22\x60\xfe\x99\xaa\xb5\xad\x90\xc1\x73\x71\x42\xd5\x30\x78\xe6\x22\xd7\xcf\x5d\xf1\xc0\x07\x0e\xea\x5a\x23\x28\x31\x7e\x46\xb3\xa7\x29\x6f\x21\x65\xe5\x1d\xd9\x9d\x6b\x3f\xa7\x17\x31\x63\xc8\x0b\x9e\x0c\x08\x5c\x98\xe4\xcd\x18\xb3\xf6\xca\x43\x4c\xba\x82\x5c\x52\x4f\x91\x3c\x17\x2d\x79\x8f\x55\xb1\x80\xae\x0d\xd2\x3e\xed\x53\x58\x28\xe8\xe3\xde\x52\xd4\xe5\x36\xef\x84\x45\xa6\xd3\xfa\x33\x5a\x5d\xc4\x46\x96\x31\x0b\xbf\xc0\xbd\xf3\x84\x10\xc8\xb5\x81\x68\x67\xaa\xf1\xd6\xbd\xae\x6b\x53\x69\xcc\x52\x75\x2f\x01\xc1\x45\x9a\x4d\xa8\xd6\xe7\xfe\xc0\x83\xb0\xd5\x5c\x20\xd6\x91\xbb\x4e\x42\xe0\xac\x88\x2e\x03\x93\x9f\xa1\x50\x1b\x1c\x42\xfb\x2a\x70\x72\xb4\xd3\x63\x02\xee\x1d\x00\x0d\xc3\xb9\x04\xe6\xae\xfb\xc0\xe0\xa8\xaa\xfd\x46\x41\x19\x02\x1e\x71\xc8\x1c\xcf\xd1\xb1\xec\x16\xda\x3d\x90\xe0\x63\x47\x56\x0b\xf0\xbe\x37\xe0\x71\xf3\x3e\x39\x55\x6c\x71\x6e\xb8\xb7\xd5\x1d\x6f\x43\xf4\x30\x44\xba\x44\xd8\x36\xa7\xcd\xa0\x91\xaf\x9a\x62\x25\x77\xe0\x8a\xae\x82\x3c\x58\x02\x6b\xf1\x6a\xb5\xf7\x58\x9b\xce\x88\x57\xd4\x19\x42\xd1\x6d\xa8\x92\x19\x6b\xc6\xad\x2f\x65\x65\xf4\x02\xb7\xe4\xab\xc2\xea\xf2\x40\x65\x11\xa8\xc3\xc1\x33\xbe\xaf\x10\x34\x85\xdd\xcc\x5e\x98\x3e\x6a\x94\xa5\x61\x27\xdc\x72\xb4\xb2\x62\xde\x23\x8e\x3a\xa7\x8e\x09\x04\x01\xc0\x32\x51\x3a\xa9\xc6\x06\xc4\x3f\x28\xaf\x60\x07\x39\x1e\x1f\x05\x88\xcb\x29\x1f\x45\x41\x84\xe5\x62\x6d\xb6\x58\xf1\xff\x48\x85\xf5\xc0\x93\x03\x07\x0a\xbc\xd8\x6b\x8f\xcd\x4a\x9e\x7a\x90\x82\x06\x50\xf4\x51\x29\x2a\x2a\x2a\xcf\xeb\x1c\x8c\xf7\x37\xe3\xcc\x9d\x6f\xf7\x36\xf1\xeb\x84\x52\xa6\x25\xc9\x49\x7b\x12\xef\x8a\xca\x8d\x2e\xa3\x1a\x3c\x92\xd3\x08\x3a\x0e\xbe\x18\xb7\x48\xe0\x59\x44\x46\xab\xe5\x21\x1c\x3e\xac\xfe\xb4\x39\xbb\xa5\x23\x12\x28\xe4\xe5\xa7\x0f\x10\x5b\x26\xfa\x8c\x63\xd0\x1a\x46\x92\x05\xe4\x56\x7e\xc6\x2b\x86\xbe\x39\xa5\x72\x78\xc1\x30\x16\x16\x95\x76\x38\x30\x90\x08\x05\xf0\xea\x06\x16\xd2\x29\x18\x70\x25\x1f\x4c\xb1\x0e\x2e\x32\xe0\xce\x06\x68\x78\xb8\xe5\x3c\x20\x54\xe9\xd6\x88\x19\x14\x6b\x07\x44\x21\xe3\xa3\x15\x5c\x76\x8b\x4c\x74\xbb\xba\xd0\x8d\xaa\x0f\xb9\x5c\xfc\x7f\xec\xbd\xdd\x72\xdb\x4a\x96\x2e\xd8\xd7\xf9\x14\x19\x8c\x38\x63\x31\x06\xc6\xb6\xe4\x9f\xbd\xb7\x77\x47\x45\xd0\x12\x6d\xb3\x4a\x22\xd5\x24\xb5\xdd\x3e\x15\x15\x7d\x52\x64\x52\x42\x1b\x04\xd8\x00\x28\x99\x75\x35\x0f\x31\x4f\x30\x77\x7d\x73\x1e\xa2\xe7\x4d\xe6\x49\x26\x72\xfd\x64\xae\x04\x40\xd9\xbb\xba\xab\x27\xce\x74\xf9\x62\x6f\x5b\x22\x81\x44\x22\x73\xe5\xfa\xf9\xd6\xf7\x95\x8a\x8f\x7d\xf7\xb2\x82\x15\x02\xba\x41\x36\x42\x7c\xbb\x20\xa5\xcb\x4c\x0d\xe2\xc8\xa7\x3b\xab\xa2\x2c\xa0\xd3\x9c\x82\x01\x5a\xdd\x0c\xab\x02\x1a\x84\x48\x62\xc8\x99\x6d\xe8\x7e\xee\x90\xf3\xca\xc6\x57\x85\xb9\x25\x77\xd1\xf1\xfc\x0a\xeb\xfc\xe7\xb3\xe9\x05\xb3\x31\x69\xad\x5f\xa4\xfa\xc2\xf3\x0c\x50\x77\xea\x40\xd6\x9f\x06\xe8\x71\xc2\x7b\xe4\xad\xf2\xd2\xaf\xb8\xa3\x5e\x75\xaa\xd4\xc0\x07\x80\x03\x16\x4e\x32\x45\x1d\xe8\x6b\x9f\xe7\xd9\x17\xa8\xd4\xd0\x84\xf9\xd4\x74\x5f\x94\x94\x28\x6e\x8e\xaa\xed\x36\x73\xb3\xb1\x87\x52\xe4\xd6\xd4\x10\x42\x41\x76\x9a\xf2\x59\x72\xc8\xce\x5f\xf7\x77\x84\xd2\x10\xf8\xed\x2c\x8e\x23\xc5\xea\xfc\xc8\x01\x64\xe8\x69\xd8\xb3\x3a\xd6\xaa\x1b\x1c\xca\xfd\x20\xf5\x99\x6b\x5b\x0f\x60\xde\x07\xc1\x4f\x19\xb0\xfe\x8a\xb0\x60\xc0\xba\x58\xdd\x99\x22\xfb\xb3\xef\x70\x5b\x96\x7a\x80\xe7\xec\x80\xd9\x89\x88\x75\x83\xc2\x5b\xf0\x26\x81\xd7\xd5\xec\x1a\x4d\x67\x83\xe4\x8d\x41\x75\x90\x42\x19\xbd\x31\xf5\x7d\x46\x32\x92\x59\x85\xec\xc9\xec\x32\x48\xf2\x50\x81\xe9\x0b\x4d\xf4\xc4\x83\x6f\xbf\x9a\x15\xba\x1a\x68\xc4\x43\x4f\x24\xab\x90\x10\xf7\xa7\xa1\x71\x8b\x23\x76\xc0\x43\x72\xa7\x7e\x46\xe1\x11\x38\xbc\xf8\xe5\x01\x73\x55\x0e\x3a\x9f\x02\x85\xb0\xc1\xaa\x7c\x80\x12\xd8\xa3\xa0\x6c\x12\x04\x40\xfb\xc2\xdf\x91\xde\xb2\x0e\x17\xf7\x3c\x98\xee\x2c\xa1\x5f\xd3\xfc\xba\x8d\x6b\xee\x4c\x63\xbb\x53\xbc\x86\xd5\x01\xce\x3e\x9e\x7a\x19\xb6\xa1\x0a\xc2\xd2\x30\x71\xea\x31\xd8\x06\xf4\x77\x2b\xbb\x72\x36\x11\x88\x07\xdc\x7a\x34\x55\x96\x63\x13\x00\xd5\xad\x22\x52\x4e\x42\x8e\x86\xfe\xe2\xf0\x7a\xa0\x56\x49\x25\x0e\x0b\x0d\x14\x94\x94\x28\x0b\x52\x2c\x03\x1a\x1f\xef\x94\xa1\x44\xc2\xae\xca\x1e\x0c\x7a\xdb\x07\x00\x56\xc1\x63\x0a\xa6\xe5\xfa\x88\x91\x38\x79\x8a\x9e\x7b\x98\x28\x5a\x12\x51\xab\x68\xe3\x45\xab\xa8\x8b\xa8\x40\x80\xfb\xaa\xdc\x17\x4d\x95\x71\x69\x15\xf5\x90\x21\x8e\xd0\xa6\x56\x8f\x36\xcf\xe9\x35\x20\x6b\x54\xeb\x1d\xb8\xbd\xe9\x76\x39\x9d\xfc\xfe\x01\xc0\x1a\x58\x28\xde\xd5\x42\xc2\x9f\xa2\x13\x78\x05\x50\x34\x43\x27\x1e\xc3\x8d\x54\x5f\xa1\x58\x62\x63\x2b\x92\x69\x46\xf4\x38\x42\xb8\xb8\xd6\x1f\xe6\x53\x15\xb6\x41\x65\x64\xf8\x5c\x51\x46\x44\x69\x86\x1c\x63\xca\x0b\xe1\xf0\xb3\xe2\xce\xad\xd5\x22\xdc\xe5\xc1\xe2\xe5\x05\x55\x0f\x12\x6b\xd4\x7a\x30\x0a\x0a\x7e\xfa\x12\x18\x65\xa8\x89\x75\xc0\xd5\x57\x2a\x95\xa3\xaa\xbe\x20\xb1\x36\x78\xbf\x22\xe3\x63\x52\xea\xff\x3b\xb7\x00\x56\x98\x05\xc0\x1c\x1e\x6d\x2e\x52\xf0\x77\xc6\x64\x83\xbf\x77\x87\x2e\xdc\x47\x0c\x8d\xcd\x73\x0c\xaa\x68\x8e\x9e\x76\xd0\xc9\xdc\xf4\xd6\xde\x49\x93\x0c\xbf\x90\xa1\xc7\xab\xb8\xcf\x88\x62\x7f\x6f\x52\x6b\x6e\x58\x7a\x40\x85\x5b\xa1\x5b\xa9\xe3\x4e\x25\x37\xd2\xfb\xf2\xd1\xbd\xf6\x87\xcc\x3e\x1e\xe1\x11\xf0\x02\xc1\xe1\x35\x78\xc8\x84\xf1\xbc\xe8\xf0\x8c\xab\x72\xbb\x35\xc5\x1a\xcd\xf1\x0e\x99\x49\x74\x68\xbb\xdd\xda\x62\x1f\x8b\xcb\x66\x8d\xdd\x72\x1d\x1e\xae\xb4\xb5\xb6\x21\x12\xb7\x55\x95\x35\xb6\xf2\xa0\xbb\xd3\xb4\x45\x8b\xe7\x6c\xe8\x40\x04\x95\x03\x6a\x1e\x90\x66\xe8\x28\xc5\x14\x7c\xe8\x69\x66\xa9\x54\x0f\x66\x58\x74\x5d\x09\xd6\x2a\x6c\x9a\x2b\x9e\xd7\xb2\xa1\x70\x43\xb7\x45\x5b\xeb\xab\x51\xbe\xe8\x33\x90\x54\x4d\x3c\x89\xb8\x0f\xd1\x06\xa3\x72\x19\x14\x7c\x9c\x5f\xc5\x9c\x50\x8a\x8b\x59\x00\x1c\xaa\xec\xaa\xbc\x2b\xb2\x3f\xdb\xb5\x20\x8d\xba\x2d\xd7\x40\x83\x94\xf0\x34\xae\x0c\x7a\x7d\xfe\x46\x35\x57\x34\xed\x9a\x12\x02\x02\x5f\xbf\x13\x35\x2a\xae\x77\x26\x00\xb4\x68\x48\x70\xe5\x31\x5b\x83\x3e\x38\x9c\xcf\xdb\xb2\xb8\x13\x81\xaa\x72\x0f\x4d\x68\x04\x5c\x83\x74\x09\x7e\x3d\x0b\x08\x54\x48\x95\x21\x73\x9b\x93\xcf\x42\xdf\xc9\x46\x87\x2c\x35\x4c\xd2\x89\x21\x4f\x52\xe5\xdf\x17\x2c\xa2\xc7\xfb\x12\xa5\xb1\x4c\x03\x8d\x3a\x90\x32\x8d\x3b\x62\x90\x7b\xdc\xbf\x9b\x9d\x59\x7d\x31\x77\x40\x74\xaf\xaf\xcc\x3f\x97\x95\x3e\x67\xa9\x39\xf4\x7a\x7d\xd8\x03\x79\x3e\xef\x00\x98\xa6\xfb\x71\x6a\xe8\x51\x50\xce\xac\x3d\x34\x07\xcd\x29\x3b\xdc\x7e\xc0\x14\xed\xf5\x5d\x08\x41\xa7\x9e\x51\x40\x19\xdd\x5d\x36\xb0\x40\x09\x03\x53\xb4\xf9\x0f\xb2\xfa\xd8\x21\xa2\x82\x7a\xc4\x8a\x99\x0e\x52\x3d\xd2\x83\xd6\x20\x06\x89\xc7\x78\x01\xf0\xe0\x6b\x93\x04\xb2\x4c\xf8\xa8\xf3\xca\x20\xc6\x0a\x2a\x87\xfa\xe4\x8b\xad\x0a\x9b\x3b\xc3\x5e\xac\xcb\x47\x8a\x45\x71\x66\xa0\x7d\x7a\xe8\x23\x69\x2e\xa4\xbb\xb5\x82\xc8\x19\xfc\xb0\x3a\x41\xec\xd0\x50\x7b\x48\x06\xda\xba\x78\x51\x54\xfb\x02\xb9\xd8\x0c\xb1\xae\xd9\xca\x3b\xf9\x44\xb9\xe4\xd7\x06\x23\x80\xca\xb0\x63\x71\x07\xa0\xd8\x58\x08\x0e\xf6\x05\x66\x5d\x60\x79\x9e\x97\x15\x66\xe8\x90\x8a\x07\xe6\x2c\x32\x23\x59\x7c\x45\x54\x8e\xc0\x29\x22\x49\x26\x9c\x68\x85\x2d\x7f\x3e\x32\x64\x71\xb4\x84\xd3\x0e\xb4\x72\x36\x84\x53\x8a\x9f\x74\x08\xc3\x72\x57\xc3\x9b\xe1\xd5\x98\x9a\x22\xb4\x81\xe0\x83\x06\xa4\x0e\x73\xd4\x45\x62\x96\x2e\x7a\x0b\x8e\x42\xaa\x7c\x9b\x7b\xd6\x78\x1e\xf6\x48\x07\xc2\x5d\xf5\x59\xad\xdb\x5b\x15\x66\xb4\x1d\x2e\x36\x65\x99\xd7\xe2\x17\xf9\x41\x2c\xc2\x28\x15\xac\x03\xac\x7d\x8f\x91\x80\xf7\x30\xb3\x82\x79\xb1\xb0\x25\x3a\x1e\xb1\xd8\x91\xee\xcb\xf1\x96\xc4\xd1\x62\xee\xca\xe7\x48\xa3\xb7\xc8\xec\x11\xfe\xb8\x3f\xce\xf3\x27\xd8\x00\x71\xa7\xb2\x4d\x87\x5f\xb2\xce\x3e\x4e\x3a\x37\x1f\xb4\xf6\x15\xd6\x61\xd6\x3a\xe7\x59\xc3\x9a\xd9\xa1\x30\x5b\xec\x3b\xd0\x79\x56\x7c\xb1\x6b\x55\xef\x6f\xfd\xcc\x78\xd4\x11\xfb\xfd\xbc\x51\xe0\x0b\x32\x91\x45\x79\xb7\x70\x86\xde\x1e\x54\x56\x34\xd9\xd6\x79\x1e\x20\x4e\x1f\xeb\xd5\x43\xe8\x8a\x0b\x61\x93\x97\x8f\xfa\xd6\x36\x8f\xd6\x72\x4c\x2f\xc7\x10\xca\x65\x6e\x72\xeb\x68\x76\x71\x73\xf4\xed\x0d\xcc\xcb\xcb\x05\xe4\x5d\x7c\x4e\xc3\x56\x10\x92\xeb\xca\xf2\x16\x50\x51\x1f\x06\x05\x5d\xdd\x3b\xf7\xdd\x0e\x0f\xfe\xa3\x83\x89\xf7\x69\xdb\xe2\x61\x9e\xc5\x34\x98\xd2\xa6\x07\x03\xa2\x3b\xfd\xce\xd4\xd9\x4a\x5f\xfb\xf0\xa3\x8e\x85\x8a\xb8\x7d\xa0\xeb\x32\xc1\x8a\xe4\x5f\xb3\xdb\xd6\x58\x3c\x66\x82\x02\x1b\x25\x91\xaf\x39\x31\x0f\x99\x55\xe7\xf7\x55\x95\x7d\x28\x11\x42\x29\xba\xc4\x91\x1e\xc0\xae\x7b\x14\x79\xd2\x18\xac\x2a\xa4\xe1\xcc\x66\x93\x55\xdb\x1a\x33\xdc\xfb\x82\x09\xb1\xe2\xf4\x33\x9b\x95\xb0\xf9\x7c\xfc\x06\xd3\x5a\xee\x9b\xdd\x1e\x9b\xd8\xdd\x67\x0b\x8c\x7d\x64\xac\x88\xb4\x49\x0f\xd6\xb7\x5b\x8b\xe6\x57\xc9\xa3\x80\x57\x4a\x58\xa2\xb2\xa9\x19\xcb\x96\x08\x31\xbc\xba\x75\xf1\x34\x16\xc9\x15\x9a\x24\x75\x94\xb9\x2f\x37\x7a\x63\x32\xac\x41\x79\xc5\x1c\x10\x95\x33\x39\x9e\xca\x42\x36\xe7\x56\x64\x24\x54\x6e\x1e\x53\xe5\x89\x48\x90\xa5\xce\x4d\x0a\xb9\xfd\x18\xbb\x46\x63\x12\x45\x0f\x62\x47\x42\x4f\xda\x87\xad\x4a\xbc\xa5\xba\xd4\xb9\xf3\x88\x4c\x1d\x4b\xb6\x07\x36\x3b\xae\xb5\x66\x40\xbb\xb2\x12\x30\x3a\xbc\xac\x6a\xdd\xbb\xf4\xa5\x2e\x46\xa3\x95\x6e\xb1\xa0\xf9\x75\x13\x11\x88\x8b\xb7\x18\xab\x45\x9e\xab\xf2\x2c\x8a\xf9\x81\x15\xb7\x13\x92\x52\x01\xdd\x0e\x2c\x18\x36\xf7\x7a\x63\x56\x54\x93\x82\xcf\xf1\xdb\x47\x4b\x41\x39\xa1\x98\xc9\x00\x0a\x84\xdf\xd3\x15\x8d\x48\x42\x0a\xe9\x90\x94\x95\xd4\x8d\x54\x70\x68\xe2\x09\x26\x6a\x55\x7a\x6d\x6e\x5d\x60\x12\x72\x5f\xfb\x1c\x8a\x1c\xa3\x7f\x65\x0a\xa7\x8d\x9e\x94\xa8\x8b\x80\xc6\x45\x4e\x44\xe9\x75\xa5\x91\xc9\x05\x37\x36\xfc\xc8\x13\x77\x2a\x4a\x03\xba\x91\x24\x90\xec\x80\x47\xc3\x5c\x23\x65\xab\x71\xd6\x61\xb7\x70\x18\x8f\xf9\x2f\x2a\xc8\x79\x85\x6a\x78\x0a\xbb\x56\xfc\xdc\x40\xce\x49\xc5\x84\xac\x22\x20\x71\x59\x00\x8d\x0e\xcc\xe5\xa1\xdc\x23\x34\x8e\x26\x8d\xf2\x19\xbe\x1a\xbe\xca\xaa\xd5\x7e\x8b\x44\xce\x75\x0c\xd6\x70\x0b\x24\x22\x9e\x13\x8a\xde\x64\x57\x6e\x6d\x5e\x3e\xa6\x7a\xc1\x9d\x68\xe0\xb1\x47\x90\x8c\x5f\xbc\x9c\xe8\xe9\x0b\x58\x56\x35\xb6\xd0\x7a\x9c\x39\x13\xeb\x39\xa3\xc6\x05\x8b\x1b\x2c\x58\x60\xf4\x4d\x40\xbf\xf7\x6e\x72\x46\x45\x93\x3d\x3f\x87\x21\x13\xac\x57\x5f\xc2\x46\x9c\x96\xb1\x71\xf1\xc0\xe9\xb5\xb5\x5b\xbb\x0e\xd4\x95\x85\x60\x65\x6c\x58\x94\x06\x90\x19\x5b\x6b\xea\x7d\x65\x55\x98\xa1\x18\x97\xce\x8c\x06\xb0\x66\x04\x49\x10\x7d\xde\x05\x3e\xb9\xd5\xa7\xa7\x7c\xee\x7c\x9a\x5c\xcf\x44\xb6\xa8\xa9\xac\x69\x0e\xda\xac\xcb\x1d\x41\x4e\xcf\x5e\xe8\x0b\xbb\xb2\xdb\x5b\x5b\xe9\xd3\x9f\x7f\x7e\x83\xec\xc0\xd9\x36\x73\xe1\x13\xa4\x57\x79\x79\x38\xef\x43\x70\xde\x41\x96\x30\x9a\x04\xae\xd1\xd0\x33\xd4\x0c\x4b\xc0\x9d\x05\xf1\x7a\x6c\x20\x13\xaa\xd3\x73\xf7\x1f\x52\xe7\x02\x29\x2d\xe0\x13\xca\xea\x36\x5b\xc7\x37\x81\xa6\xbd\xbe\x19\xab\x5b\x29\x05\x18\x49\x3c\xbe\xac\xa6\x69\x07\x33\xaa\x3a\xc4\xc1\x7d\x27\x62\x9b\x99\x41\x6c\xce\xe0\x3a\x29\xaa\x61\x07\x75\x1e\x40\xb9\x30\x55\x38\x1c\x5e\x1c\x25\x10\x87\x6e\x0f\xc1\x24\xe4\x3c\x29\x91\x60\xb0\x2e\x83\x2d\x0f\x10\x30\x4a\x60\x36\xb9\xb4\xe0\x8e\x24\xa4\x90\x5d\xc5\x6c\x6c\xcf\x14\x4e\x66\x50\xef\xeb\x9b\x4d\x7d\x74\x36\x99\x19\x43\x87\x4d\xfb\x2b\xe3\xa3\xce\x31\x67\x16\x0e\x1e\x7a\xb9\xbd\x00\x2a\xef\x27\x3c\xab\x23\x1f\x06\xcf\x14\xce\xc3\x29\x64\xba\x86\xb9\xdb\xda\x75\xb6\xdf\xb6\x89\x66\x68\x11\x09\xae\x1f\x62\xed\xe6\x54\x55\xee\x59\x02\x9c\x83\x02\xfd\xac\x84\xf2\x7a\x32\xa1\xf5\x0b\xaa\xef\x67\x28\x87\x45\x40\x77\x28\xbb\xb6\x48\x8d\x5a\xad\xba\x9c\x28\x61\x8f\xe4\xc1\xd7\x5b\x58\xac\x18\x9b\x88\xc8\xf5\x26\x2b\xfc\xa3\x84\xd0\xe3\x4c\x1c\x1f\x00\xcd\x5f\x24\x37\x7b\xf0\x79\xb5\x5f\xc0\xa4\xdf\xc1\xde\x01\x3d\x3c\x0f\x74\xe8\xcf\x73\x01\x85\xcd\x5d\x38\xdb\x42\xa6\x3b\x10\x99\x21\x61\x19\xf4\xfa\x80\xc6\x6e\x05\x4c\xad\x15\x17\x2f\xc3\xa4\xca\x57\x02\xde\x83\x1b\xcb\xa1\xdc\x2b\x40\xd0\x03\x96\x80\x35\x94\xdd\x91\xc8\xa9\xc0\x50\xea\xd7\x1e\xbb\xc1\xac\x16\x62\xa5\x5d\x71\x28\x45\x9e\xf0\xaf\xa1\x30\xde\x5a\x72\x3d\x29\xfc\xe0\x97\x92\x8b\xd1\xc9\x7d\x71\x70\x9d\x35\x81\x2a\xd6\x7f\x89\x72\x2c\x9c\x5c\x91\x4b\xb6\x87\xfc\x94\xdf\xeb\xab\xbe\xe5\x4a\x65\x2b\xdb\x08\x1e\x97\x5a\x1e\x60\x6f\x95\x32\x43\xf0\x54\x31\xa9\x07\x1c\x9b\xa6\xc2\x62\x2a\xa5\x10\x5b\xab\x31\x5c\x3d\xc4\x9b\x98\xb7\x51\x84\xd5\x90\xf4\x7f\x06\xf4\xcd\x6e\xff\xa2\x7b\x60\x4d\x3c\x26\x6b\x55\xbd\xdb\x40\xfa\xf5\xb0\xf8\x71\xa2\xf8\xc8\xfd\x91\xfc\x60\x41\xd6\xc3\x83\xaf\x55\x13\xb3\xf8\x40\xa4\x43\xdf\x7b\xe5\xde\xd5\xe0\xc8\xe6\x18\xa4\x4a\xad\x86\x81\x17\x28\x68\x93\xa2\xe2\x71\xe5\x23\x5b\x91\x54\xeb\xb1\xef\x58\xe4\x2b\x0b\xab\x1e\xef\xa1\x6d\x1e\x43\xea\x12\x48\x6e\xac\x17\x98\xc3\x2d\x15\x3b\xf4\xd4\x90\xef\x05\xb6\x49\x99\x1e\xb6\x99\xf2\xbc\x3f\xe2\xf8\xf6\x13\xe2\x85\x24\x0c\x36\xf4\xd7\x5e\x95\x03\x06\x2a\x0f\x04\x54\x89\x67\xe0\x22\x84\x94\x89\x8b\x3e\x4d\xb5\xce\xa1\xe3\x63\xa3\x09\x5d\x74\xc0\x1e\x7b\x48\x06\xda\x75\x6b\xa8\xce\x4c\xd4\xca\x6d\xe6\x28\x80\x92\xb3\xc6\x81\xa6\xc0\x28\x9a\x03\x95\xcd\xa3\xd4\x0a\xb4\xa1\xbb\xc8\x17\x81\x0b\xe1\x82\x04\xe6\x02\x94\x04\x93\x31\xe7\x07\x0f\xae\xc2\xc4\xd4\x7a\xc8\xf9\x76\xb8\xe1\xbd\xa9\x9f\x28\x88\xd4\x09\xda\x1c\x74\x7c\xb1\x44\xa1\x45\x69\x44\x45\xa5\x91\x5f\xdc\x54\x50\x32\x28\x3a\x7a\x3a\x77\x11\xc9\x63\x42\x02\x28\xf7\x6c\x3d\x77\x88\x8b\x2f\x74\xd8\x3e\xa2\x34\x39\xe5\x0a\x20\x4c\x01\xd7\x99\x70\x32\x6a\x14\xc9\x28\xd0\xf2\x11\x7e\xa1\x24\x84\x66\xd2\x6a\x2c\x8c\xad\xed\xce\x16\x6b\xb7\x11\x28\x46\x89\x33\x45\x2d\xbe\x03\xf4\x75\x22\x14\x47\xc7\x37\x09\xb9\x26\x85\xc1\x08\x48\xd7\xac\x7d\xcd\x92\x53\x2f\xe8\x21\x6c\xb5\xd1\x39\x92\x73\xed\x84\x45\xc4\xfe\x5f\xa3\x1f\xca\x7c\x0f\x72\x30\xca\xe8\xba\x29\x2b\x68\x29\xab\xe2\x0a\x21\x1f\xdf\xa2\xe0\x5b\xe8\x81\xb9\xbb\x73\xab\xb6\xb1\x03\x7e\x37\x62\x8a\x14\xf2\x1b\xd5\xa2\x66\x1c\x8e\x69\x7e\x76\x4e\x71\xa2\x37\x05\x07\x23\x82\x9f\xbc\xe6\x02\xe3\x24\x3b\xd7\x67\x5f\x89\x89\x20\x1e\x39\x43\x25\x84\x25\x30\xd2\xc2\xb8\x23\xd5\x93\x02\xc2\x2b\xd2\xbc\x68\xa5\x0c\xa0\x4f\xcb\x3f\x50\xd8\x1a\xac\x97\xd0\x32\x2f\x74\xe0\x83\xa9\xeb\xc9\x0c\xf9\x0b\x31\x41\x92\x38\x08\xa7\x65\xf1\x9c\xce\xc0\xf7\x65\xb5\xed\x3d\x00\xdb\x63\xeb\x24\x74\x8f\x1f\x5b\xb5\x7a\x05\x4b\xe4\xf5\xd1\xd3\x4b\x94\xd9\xb6\x66\x75\x9f\x15\xf6\x79\x65\xcd\x1a\xcc\x59\x6f\x5e\xf2\x1b\x04\xe1\xb8\x9a\x0a\x1b\x4e\xc3\x47\x73\xa0\x73\xf0\x3c\xdc\x2b\x4e\x73\xc3\x49\x6e\xb7\xb7\xe5\x1a\xd3\xab\x50\x63\xbb\x3f\xd4\xe0\xb0\xb2\x88\xef\x89\xcf\x1b\x2b\xf1\xdb\x9e\x95\x39\x4c\x7c\xc3\x78\x16\xa8\xeb\xfa\x33\x70\xd9\x57\xbb\x56\xb0\xf2\xd7\xfb\x0a\xf3\x5a\x7c\x65\xbc\x18\x31\x12\x63\xf5\x1e\x56\x68\x84\xda\x07\x3b\x83\x30\x37\x3c\x87\xff\x3f\x7b\x46\xe3\x95\x53\x89\xa4\x16\xac\x38\x64\x81\x7d\xff\x71\x73\x5f\x59\xab\x0f\xd6\x10\x15\x89\xff\x88\xb3\x0f\x22\x11\xc4\x0e\xde\x0e\x0f\x9c\x0a\x99\x73\x03\x37\x33\x39\x7e\x9e\x48\x94\x87\xbf\x2d\xd7\x36\x87\xa3\xee\x8e\x22\x3e\xb7\x12\xdc\xb9\x4b\x87\xad\xad\xdb\x33\xa3\x98\x8e\xfb\x74\xd8\xea\xc8\x3c\x9e\x32\xf5\x95\x0b\xff\x12\xa0\x5e\xce\xa3\xe0\xc2\xdf\x91\xb4\x5f\xa2\xbf\xf7\x7d\xab\x27\xdf\x77\x42\x1e\x2e\x7a\xcf\x45\x29\x54\x4e\x30\xf7\xe7\x5b\x8c\xa1\xef\xd8\xd9\x19\xbe\x57\x7e\x10\x05\x04\x5f\xc0\x22\x93\xe0\x7d\x52\xd4\x52\x39\x1b\x0a\x0c\x28\xb9\xe6\x56\xf5\x4f\x8e\xf3\x75\x8d\x26\xe4\x82\x86\x12\x1f\xc8\x7c\x15\xcc\x55\x8c\x3e\x15\xad\x51\x61\x1b\xe3\x78\x4e\x2e\x5c\x42\x49\xc8\x17\xc3\xa2\xc3\xb8\x48\xd0\xdd\x7e\xa0\xe4\x50\x7f\x1a\x1c\x5d\x15\x13\x64\x9c\xa1\xf8\x87\x99\x1b\x28\x41\xaa\x72\xb5\x32\x35\xf8\x4b\x14\xf7\x15\x65\xb1\xf2\x3a\x80\x39\xc5\x1f\x9c\xb0\x95\x88\xee\xce\x82\xc2\x70\x6c\x8f\x35\x47\xda\x0b\xed\x60\x6d\x7f\xcb\xae\xda\x9b\x5b\x74\x59\x8e\xec\xdb\x5b\x0a\x76\x90\x2f\x03\x5e\x03\xcd\x32\x96\x39\x20\x3d\xb5\xcb\xcd\xca\xea\x13\x84\xad\xab\x92\x28\x3f\x69\xca\x87\x52\x36\x24\xe4\x7c\xc5\x4b\x3d\x36\x6d\x5e\xd3\x0f\xf2\xff\xe6\xe0\x51\x2a\xfe\x87\x78\x63\x7c\xc1\x9b\x7d\x85\x99\x36\x7c\xd1\xe0\x38\xb3\x07\xc3\x3c\xfe\x11\x58\x3e\xac\xa6\xfe\xad\xd6\x8a\x26\x45\x65\xcf\x03\x2a\xf0\xfe\xf2\x4a\x91\xcd\xab\x3b\x8b\x31\xe9\xde\x8e\xcf\x15\xc2\xc4\xe1\xde\xf4\x04\xb0\xb4\x86\x4f\x30\xb7\x82\x9b\xf9\x40\x94\x48\x52\x53\x67\x88\xf0\x14\xb2\x4c\xb5\x9c\x68\x82\x39\x89\x84\xb1\x38\x0c\x21\xce\x32\x19\x72\xe3\x22\x93\xac\xcf\xa8\xd6\xaa\xb0\x5f\x7d\x4e\x48\x3e\x59\x6d\x50\x71\x0a\xc0\x30\xce\xaf\xca\xa8\xba\xd6\xbf\xfa\xe7\xde\x9b\x77\x46\x00\x7c\x13\x7a\xae\x7b\x20\x24\x38\xf6\xcd\x84\x16\x3a\x90\x5d\x51\x2e\x90\x35\xc6\x21\x87\x28\xc2\x38\x51\xc5\x8c\xcd\x79\xa8\xe9\xd6\x6e\x79\x62\x25\xb6\x8e\x99\x55\x53\xa5\xec\xd1\x2d\x80\x02\x3a\x3b\x6b\xab\xe7\x4d\xf9\xdc\xfd\x1f\xa1\x50\x41\x70\x5c\x4e\x26\x8a\xd8\x73\x69\xce\x3a\x9f\x8c\xa6\xa9\x75\x59\xb7\x29\x7a\xd7\x9d\xc4\x1f\x38\xa7\x16\xc9\x6a\x98\xad\x97\xde\x06\x95\x6f\x09\x30\x10\xd9\x38\x0e\x4e\xc5\x1e\x5f\x83\xcb\x8e\x9e\x38\xd8\x7c\x6c\x29\xef\xb1\x77\x89\x3b\xad\xea\xb8\x4c\x0a\x04\x0d\x04\xd0\x20\xba\xe4\x63\x5b\xc6\xad\xf8\xa8\x0e\x7d\x48\x42\x18\xd1\xa2\x3e\xf5\x16\x5f\x75\x6c\xae\x47\xe2\xdc\xb8\x60\x89\x04\xd8\x07\x30\x10\x79\x5a\x0e\x56\x65\x51\xef\xb7\xe8\xca\xc3\x47\x3c\xe3\xb3\x87\xfa\x34\xa6\xb8\xcb\x6e\x73\xab\x76\xb6\xaa\x21\x1e\xf5\x3a\x52\x02\x35\x42\x52\xf7\xfe\xbc\xe3\x0f\x27\x7a\x63\xb6\x59\x8e\x3a\x65\xf7\xe5\xbe\xb6\xf7\x65\xbe\x56\xac\x45\x16\x4e\x28\xae\xa2\xfa\xe2\x2f\x1c\x9a\xf9\x9a\x90\x8e\xab\xb2\xda\x95\x15\xe3\x0f\x01\x59\xbd\x7e\x44\x3d\xa6\x54\x4d\x0a\xbd\xb6\xc8\x51\x46\xbb\x0a\xc1\x82\xde\xad\xc8\x08\xf3\x16\x3d\x6b\xa2\xd7\xe5\xfe\xb6\xd9\xec\x73\x40\x0c\xd5\x98\x8b\x57\xc0\x3b\x53\x97\xf9\x03\x4e\xf2\xc6\x3c\x94\x15\x16\x37\x1f\xac\x8b\x66\xb0\xf4\xde\x86\x10\xc1\x6d\xfc\x89\x02\xde\x94\xd0\x73\x70\xa1\x45\xa2\x07\xd1\x34\x45\x20\x62\xdd\x1c\x76\xe0\x43\x94\x5e\xc4\xcd\x23\x69\x0c\xe8\x1a\xd6\xb5\xe8\x5f\x48\x54\x1c\xdf\x73\x05\x75\xef\xff\x25\x46\x07\xf1\x72\xe9\x99\x13\xdc\x39\x90\x09\xd0\x89\x6a\x7f\xd4\x80\x5a\x18\x8e\x12\x5f\x90\xfd\xba\xb3\x2b\x74\xe1\x90\x6b\x04\x13\xe4\xdc\x33\x41\x38\x73\xa0\x65\x56\xa3\xa7\x27\xbd\x95\x98\xe0\x57\x25\x2e\x01\x91\xb8\x68\x6e\x50\xe1\x14\x07\x26\xfd\xbd\x73\x65\x71\xa6\x8a\xb2\x78\xee\x6f\x80\xa3\xdd\x17\x70\x69\x38\xbd\xdd\x4f\x02\xbb\x11\x3c\x2b\x9c\xff\x6e\x81\x41\xba\x0f\xb3\x4c\x96\xc0\x7b\x7e\xea\xf8\x51\xd4\x60\x22\xa4\x0d\xf5\x04\x0c\x13\xfc\x9d\x11\x32\x72\x77\x89\x2d\x83\xea\x91\x35\xc9\x47\xae\xf7\x95\xad\x13\x6a\xd8\x24\x74\xb6\xfe\x62\x0f\x38\xb7\x2c\xfa\xef\xaf\x1d\x34\x31\x45\xcb\x0e\x52\xca\xd8\xd5\xbe\xb1\xfd\x7d\x3b\xdd\x20\x0f\x16\x4e\x34\x40\xf2\x3b\xda\xc8\x6a\x17\xab\xbb\xc8\xfa\x98\xe3\x65\xa3\xd1\x61\xbb\x1a\x30\x17\xdb\x70\x90\x78\x44\x87\x62\x1e\xda\xb5\xde\xec\x0b\xb0\x9e\xe4\x92\x86\x3c\xab\xdb\xdc\xf1\x29\x9f\x15\x60\x7d\x0d\xf4\xbd\x40\xe3\x83\x0b\xaa\x38\xcb\x83\x8f\x85\xf0\x14\xa8\xf4\xdd\x5a\x8c\xa3\xa3\x12\x89\x67\xd3\xdd\x1a\x00\x47\x4e\x36\x51\x55\xa9\xe8\x18\x48\x99\xeb\x63\x43\x4f\x51\x96\xbb\x19\x56\xb9\x04\x2e\x05\x4a\xb7\x40\xad\x0b\xa1\x97\x9c\xda\x44\xb0\x58\x7b\x2f\x1c\x1b\x90\x22\x39\x3a\x38\xf6\x10\x3d\xac\xe4\x1e\x24\xca\x5b\xb7\xc1\x43\x4e\x51\xf4\xaf\xb8\x8f\x44\xaf\x32\xab\x3d\x9a\xb8\xb2\x6b\xd5\xee\x64\x24\x80\xd1\xce\x36\x7b\x52\x9d\xa0\x5c\xba\x8b\x56\x11\xae\x71\xd2\x9b\x21\x54\x62\x84\x10\x01\xdd\x9b\xca\xac\x1a\x5b\x65\x7f\x26\x98\xed\x91\x83\xcb\xab\xf6\x86\x49\x55\x3c\xa9\xcc\x77\xdd\x13\x53\x1f\xdb\x60\xa9\x7e\xb7\xa7\x8a\x8a\x70\x33\x94\xcf\xa3\x50\xb3\xf3\x46\x17\x74\x9e\xb9\x57\x5d\x10\xcd\xa5\x54\x4a\xac\x6c\x43\xcd\x81\x56\x33\x7b\x7e\xd8\x57\xaa\x77\x41\x52\x91\x20\x9a\x70\xc0\xad\x79\xbc\x55\x94\x9b\x84\x45\x47\x17\x44\xde\xf1\xf9\xec\x6a\x48\x18\x22\x99\xb8\x16\x81\xce\xb1\xe7\xee\xe2\xd3\x4c\x34\x01\x84\x73\x63\xa2\x67\xbe\x1c\xc7\xd3\xce\x29\x44\xd9\x06\x2f\x42\xe2\xd6\xec\x6e\x6d\x1a\x42\x39\x50\x35\x04\x7c\xdd\xb0\x63\xfc\x2c\x54\xe1\x41\xf8\x15\xf9\x45\x95\xf0\x3a\xea\xae\xc6\x82\x92\x90\x59\xa3\x9f\xbe\x68\xaa\x47\x3e\x6a\x09\xae\x3d\x79\xee\x6b\xeb\x96\x86\x7a\x64\x72\xbf\x68\x7b\x67\x4d\x6d\xf3\x8d\xc7\x51\x70\x71\x6f\xed\x8c\x98\xcd\x99\x34\x9e\xb2\x03\x5c\x47\xe5\x44\x1f\xdf\xa8\xac\xf4\x43\x56\xe6\x30\x1b\xf0\x6c\x20\x94\x4b\x50\x18\xd0\xe9\xe2\xee\x27\x89\x29\x33\xab\xaa\xac\xb1\x0e\x41\x17\x02\xa4\xc2\x13\xbb\x00\xed\xc1\xd1\x97\xcc\xfe\xae\x08\x2b\x85\xe6\x5a\x7b\xdb\x00\xd3\x14\x7e\xd9\x67\x26\xd0\x6b\xcd\x83\xae\x91\x5d\x63\x87\x3c\x48\xbe\x76\xa1\xb2\x47\x70\xb2\x7d\xa8\x31\x0a\x37\x89\x26\x17\x96\x9e\x2a\x4a\xdf\xf0\xb6\x33\x75\xfd\xe8\xe2\xe0\xb2\x72\x87\x18\x4c\xd7\xbe\xd8\x99\x15\x8a\x65\x56\xd6\xac\x09\xac\x42\x61\x13\x13\x73\xeb\x51\xa8\x68\x2c\x2d\x66\x2a\x07\xe2\x67\xa1\x4a\x50\x0f\x20\xa3\x2b\xe0\x27\x6e\x7d\xe7\xb4\x89\x8e\x2a\x11\xdc\x1e\x18\x93\x82\x0d\x04\xd8\xcb\x06\x60\x3b\xa1\x8d\x04\xad\xfb\x42\x08\xaf\x8e\x06\x26\x06\x81\xb1\x91\xa9\x6c\x8b\x75\x5c\x94\x8f\xb8\x76\xe0\x41\x1c\x0d\x11\x4c\x01\xf3\x12\x47\xda\x07\xf5\x88\x9d\x23\x12\xa2\x2d\xb3\x49\x3d\x8d\x0e\xbe\x58\x83\x09\xb6\x4e\x73\x4f\x6e\x1e\x21\x86\x36\xbd\x43\x27\xf3\xc8\xd0\x6c\x09\x1e\xf5\x45\x4c\x6a\x21\xac\x1a\x45\xbb\x0f\x5c\x77\x51\x93\x61\x43\x0e\xcd\xa8\xe1\xda\x58\xee\xe9\x99\x04\xc2\x79\xa9\x58\xf1\xa3\x85\x93\x28\xf7\xec\x01\xf2\x53\xf7\x3f\xc1\x11\x5c\x08\xa6\x90\xfa\x10\x22\x40\x63\x4f\xdd\xee\xd8\x77\xe1\x06\x54\x62\x0e\x51\x1d\x99\x26\x2a\xed\x9a\x86\x9a\x71\x4a\x52\x7a\x91\xea\xe9\x59\x93\xea\x93\xb0\x42\x94\xfc\x3e\xcd\x1c\xa7\x4d\x03\x5c\x95\x4a\x30\xe5\x23\x8d\x02\x65\x81\x98\x62\x01\xa3\x0d\x67\xe6\x94\x20\x4b\xf0\xe0\x53\xaf\x92\xc6\xd9\x99\xfe\xc1\x3b\x0b\x41\xc6\x30\xc1\xa2\xaa\xa2\xd4\x06\xd8\xd6\x78\x8a\x62\xd4\x19\x94\xdf\x98\x9b\x00\xf2\xac\x7d\xe8\x07\xf1\xa8\x00\x5c\x8a\x55\x5b\x43\x0d\xf0\x28\xe9\x67\x42\xed\x25\x84\x00\x83\x8a\xc1\x1a\x9c\x95\x63\x6f\x10\x50\xf1\xe4\x27\x87\x13\x28\x14\x7a\x5c\xec\x68\x2b\xaf\x64\xe0\xd1\x65\xc3\xef\xb2\x10\x82\xeb\x1c\xcb\x09\x17\x84\xc7\x81\xa0\x91\x01\x08\x20\xd1\xb5\x05\x2c\x93\x50\xdc\xf1\x09\x25\x06\xf0\xca\xbb\xb0\xa7\x53\xeb\xd3\xd7\x48\xcd\xfa\xa6\x7d\xef\x5f\x74\x59\x41\x7a\x7f\xee\xfb\x27\x21\x2e\xa9\x1e\x7c\x05\xd0\xf7\xa8\xc8\xc4\x2f\x96\xad\x3c\xdc\xa3\xa2\xe9\x51\x4c\x1b\x00\x77\x65\x6f\x3f\x80\xed\x2a\x06\x29\x1c\xad\x53\x72\x25\x13\x97\x0d\x96\xb6\x48\xe2\x09\xbb\x03\x71\xc4\xab\xa1\xdb\xe0\x0c\xee\xd2\xdb\xac\xf6\x01\x55\x84\x4c\x2a\x81\x8f\xcf\x07\xac\x61\x65\x02\x1c\x8c\x1e\x59\x1d\x21\x4f\xf0\xa8\x30\x1e\x7f\x60\x53\x00\x46\x12\x3f\x1b\xa0\x74\x61\x84\xfa\x54\x90\xdc\x2c\x99\x10\x90\xae\x8a\xc3\x5f\x0f\xf5\x25\xbf\xcc\x06\xfb\xd0\x30\x3d\x01\xc7\x9f\x7b\xb1\x52\x15\xbd\x30\x5b\xfc\x0b\x16\xbd\xcb\x4a\xcc\xb8\x2f\x1a\xf2\x20\xf1\x06\x76\xa8\x2f\xec\x2a\xc7\x49\x6b\x4a\x84\x46\xb7\xc0\x62\x2c\xa8\x8d\xe0\x3c\x0a\x22\x20\x49\xbf\xb5\xf8\x5b\xbc\x73\xa2\xfc\x47\x49\x81\x1f\xdd\x39\x98\x8b\x1a\xef\xb7\x91\x2b\x88\x85\xa3\x04\x4a\x2c\x8c\x5c\x90\x59\x74\x5e\x8b\xbe\x3d\x28\x51\x5b\x41\x0b\x5b\x47\x8f\x07\x42\xd3\xbd\xaf\x2a\x6b\x48\x8a\x9b\x49\x42\xf7\x26\x57\xa6\xae\xf7\xdb\x9d\x97\xcf\x09\x1b\xa7\x1d\x9a\x24\x3d\x72\x56\x7c\xe4\xd5\xf6\xe8\x35\x7d\x3b\x2c\x4a\xf1\xa2\x8f\xee\xfe\xd2\xfb\xc0\x84\x66\x47\xfb\xd4\x82\x60\xb5\x81\x15\x70\xcc\xae\x4a\xa0\xba\x70\x16\x69\xc0\x79\x70\x8f\x62\x74\x1e\x89\xf2\xea\xa3\x16\x02\x7d\xae\xb3\x78\xcc\xa8\x4f\x69\xf3\x79\x18\xa3\xd7\x10\x83\x83\x4f\xae\xc2\xd9\x92\xf0\x9e\xab\x3b\x4a\x79\x12\x62\x73\xec\x4c\x55\x22\xc5\x6e\x30\xae\x63\x0f\xd1\xe8\x9e\xe7\x08\x96\x96\x0e\x47\x9c\x79\x5b\x6d\x91\xc2\xd9\xa3\x3d\xd8\xad\x94\xc3\xeb\xb9\x1e\xf8\x02\x58\x10\x07\x1c\x10\x63\x6b\x15\xb6\x61\x44\x50\xde\xf8\x64\xf0\x67\xf6\x7a\xdd\x3d\xaf\xc2\x22\xe4\x07\x57\x5d\xf9\xb0\xd0\xef\xa9\x03\xed\x5a\x5c\xa3\x06\x94\x56\x77\xd4\x21\x8c\x64\x5d\x09\x52\xfe\x0d\xd8\x60\x39\xfe\x90\x4b\x80\xc1\xa2\x57\xda\x19\x72\xab\x40\x24\x3d\x79\x49\x3d\xe4\x4e\xf4\x84\xeb\x32\x1e\x85\x25\xdb\x6e\x12\x6d\xb0\x1b\x42\xca\x39\x77\x16\x6d\x20\x34\x50\x9e\xc0\x83\xbe\x0e\x51\x9e\x17\x65\x5a\x83\x71\xe8\xad\x35\x48\xbf\x96\x1c\xf2\x51\x07\x75\x24\x76\x4e\xd9\xde\x4b\x09\x7b\x40\x84\xb2\x16\xc0\x38\x04\x45\x08\x77\x92\x9d\xa4\xdc\xd7\x50\x2b\xfe\x9a\xa9\x85\xc7\xfe\x0b\x85\xea\x6e\x75\x46\xda\x6d\xe8\xd3\x52\xb8\xff\x68\x0e\x2c\x9a\x02\xc1\x44\x10\xa7\x90\x24\xbf\xa1\xbf\x21\x10\x0e\xb5\x5e\x1b\xf5\x1a\x1b\x49\xa1\xcc\x8b\x48\xf5\x70\x37\xe8\x51\xe1\x1c\xcd\xc6\x6e\x77\x8d\x68\x72\xc0\x58\xbc\x73\x33\xdc\xbd\x0f\x65\xb6\x46\x90\x16\xc0\xc1\xe2\x6e\xa0\xa0\xd6\x22\xfb\x3d\x7a\x60\x68\xb2\xb2\x0f\xfe\xa9\x14\xc7\xef\xb6\xec\xd8\x90\x06\x31\x77\x95\xd9\xdd\x47\xe6\xea\x74\x98\x2a\xd1\x17\x47\xa9\x32\x6b\x6a\x44\x8a\x62\x90\xdc\xeb\xd2\x35\xe4\x96\x87\x56\x0f\xa8\x68\x44\xf9\xf0\xb6\xc3\x86\x28\x41\x48\x02\x60\xa0\x3a\x0c\x4e\x23\xd6\x66\x29\x6d\x6b\x0a\x37\xe9\x4d\x96\xf7\xfa\x7d\x51\xf3\x4f\xb1\x76\x0b\x39\x9e\xc2\xb8\x07\x05\xa7\xfc\xe4\x76\x08\x6b\xd8\x60\x7b\x7b\x12\xb0\x45\xad\x8b\x6f\x4c\x86\x3c\x40\x6e\xeb\x6c\xa8\x48\x88\x9f\xf5\xd3\xa1\x80\xa0\x66\x6b\xa5\x4f\x82\x69\x5f\x2f\xa2\xf2\x86\x94\x71\x90\x17\x1b\xee\x64\xeb\x9a\x57\xe7\x55\x59\xd9\x12\xe6\xbc\x33\x85\xfa\xb7\x4c\xa1\x78\x22\x75\xec\x81\xe0\x39\x32\x5b\xf7\x3e\x89\x3e\xf6\x24\x89\x62\x91\x03\xd8\xca\xa0\xa9\x0d\x12\x69\x3e\x70\xf0\x27\x1a\xd9\x98\x72\x73\x7c\xbd\xa8\x13\x3e\xed\xb1\xcb\x33\x8e\xb8\xe4\x70\x3d\x3e\x18\x35\x87\xe2\xc1\xc2\xec\x3a\x43\xf7\x32\x9a\x5d\x42\x49\xac\x6c\xb6\xf3\x96\x92\x44\xa9\x95\x5a\xc6\x3a\x41\x47\x76\x17\xef\x08\x7f\x24\x84\xfd\xd8\x08\xd2\x4c\xc0\x5e\x90\x88\xb9\xf3\x98\xe2\x89\x60\xf0\x83\xbf\x01\x3c\xa6\x7b\x96\x3e\xf6\x97\x49\x3c\x98\x20\xde\xe3\x6f\xbd\xf6\x4a\xcb\xe2\x3d\x8b\xd7\x9f\x50\xef\x10\xc0\xf5\xfe\x65\x6f\x72\x88\x1f\x4b\xcf\x58\x51\xd8\xc7\x98\xee\xd3\xd7\xfb\xfd\xc1\x1a\xe3\x6f\x4f\x5f\xb0\xac\x0f\xe4\xe7\x76\xd0\x65\xe3\x22\x85\x20\x90\xee\x2e\xf3\x11\x3b\xaf\x22\x70\x3f\x63\xef\x64\xd5\x02\xe9\xb1\x3a\x1d\x51\x20\x3c\x29\xc7\x49\x44\x64\x18\xd9\xab\x38\x43\xe1\x2c\xed\x2a\xcb\x73\x83\x30\x64\xcf\xdd\xd1\xad\x75\x40\xa2\x1d\xfc\x61\x2a\x0f\x98\x5a\x61\xe1\x09\x64\xe9\x56\x54\xdf\x79\xb2\x06\x2d\x47\x45\x89\x86\x3c\xfb\x62\x9d\x6d\x0f\xde\x02\x07\xf7\xc6\x4f\x91\x90\xd0\x2e\x4a\xac\x5f\x46\xfc\x37\x12\x5e\xeb\xec\x73\x0d\x01\x7f\x0c\xb0\xed\x3d\xa4\x00\x32\x1d\xb7\x09\x5a\xea\x11\xc6\x80\x0f\x99\x5f\x44\xdb\x0e\xd3\x24\x62\x43\x59\xcf\x1b\x88\x98\xca\x6e\x0f\x82\xeb\x05\x9b\xe3\x70\x86\x01\x37\xd6\x0d\xce\xc9\x8f\xa0\x43\x2a\x4c\x40\x27\xc4\x46\xda\x1b\x80\xb8\xa2\xd6\x8c\x1e\xf1\x71\x47\x9f\x21\xcf\xf9\xa2\x7c\x2c\xea\xa6\xb2\x66\xab\xe7\x1e\x53\x92\x2a\xe4\x46\xf2\x06\xe7\x48\x4f\x50\x5c\xec\x88\x0f\x54\x7a\x8d\x6e\x0d\x44\xe6\x35\x0a\x12\x7d\xd4\x90\x50\x93\x68\x12\xa6\x5e\xf6\x45\x22\xeb\x08\x80\xac\x23\xfd\x01\x39\xad\xf1\x2e\x88\xa5\x25\x7c\x77\x8e\x10\x16\x40\x5f\x56\x34\xe2\x08\x8f\x31\x90\x5b\x8d\x0a\x3d\x20\x31\x0f\x51\x93\x19\xa0\x6b\x2f\xab\x34\xbe\x0e\x84\x77\xc1\x46\x42\xec\x20\x93\x7c\x50\x89\x42\x51\x1d\xc1\x19\x07\x85\xc5\xba\xb6\x08\x34\x05\xf1\x62\xfc\x0c\xa0\xba\x30\xc9\x13\x5f\x03\x96\xa8\xad\xee\xd0\xc5\x97\x64\x53\x2e\xfa\x79\x7a\x9b\x22\x70\x97\xd1\x4f\x5e\xa9\x44\x3c\x4a\xa2\x00\xc9\x8d\x85\x9b\xa6\x24\x1f\x5e\x3c\xaa\xb3\xbc\xfc\x7a\xdb\x90\x32\x00\x7b\xe4\x75\xf8\x80\x7a\xbc\x37\x8d\xdb\x9b\xba\x2d\x3e\x47\x15\x10\x52\x52\x79\x06\x5c\x7f\x6b\x68\xf3\xc3\xbc\x09\x54\x1d\x6d\xdd\xe8\x7b\xb3\xc6\x48\x60\x9f\x43\xef\x84\xc4\xae\x7a\x4a\x46\xef\x60\x25\x7a\x97\xef\x41\x76\x99\xf5\x2b\xe3\x06\x81\xa3\xc0\xa5\x88\x90\x85\x97\xea\x91\x31\x79\xff\x45\xfe\xfe\xde\xd4\x2a\x6b\x5a\x14\xb7\xd4\x96\xe6\x4f\x77\xbb\xd9\x94\x55\x53\xb7\x5c\x64\x0a\xa7\x9d\xc1\xe9\x8b\x7b\xb9\x16\x46\x8d\x70\x7e\xac\x84\xa3\x66\xa7\xd3\x9d\xf1\xd0\x8d\xdd\x4f\x78\x16\x93\x15\x1c\x7a\x6e\xaf\xfc\x56\xb5\x36\xd1\x55\x79\x30\x39\x15\xaf\x4a\x81\x49\xc3\x2d\x25\x86\xd2\xd7\xae\xae\xba\x0c\x3f\xd1\x1d\x41\x51\xa2\xb1\x52\xd6\x26\xb8\xd6\x6e\x55\x55\x65\x5d\x3f\x87\xbc\x20\x86\xb1\x7b\x40\x6c\x42\xdf\x1e\x94\x62\x72\xf3\x58\xef\xb3\x66\xe8\xf6\x8f\xbd\xf3\x91\xba\x70\xca\xe9\xc3\xc1\x4e\xaf\x43\x71\x22\xc1\xa3\x28\xd1\x35\xa2\x57\x92\x00\x0f\x04\x9c\xa8\xc9\x89\x49\x77\x0b\x18\x23\xca\x5b\x05\x4a\x32\x74\xfe\x03\xfc\x88\x35\x7f\x4f\x4f\x53\x7d\x4d\x94\x89\xc4\x77\xe6\x55\x26\x06\x8c\xc5\x68\x79\x88\x6e\x3f\xf9\x74\x2b\x00\xe0\x7b\xde\x5e\xeb\x5c\x16\xac\x68\x11\x75\xc9\x75\xe0\x76\x84\x56\xab\x34\x34\x14\x41\x13\x33\x13\xe2\xa9\x00\xfa\xa7\x7a\x39\x8f\xf2\x59\x1d\x0d\xda\x13\xbf\x51\xb7\x44\xf4\x39\x4f\xcb\x12\x4d\x39\x15\x8e\x9c\x5d\x8b\x7e\x0c\xb2\xf7\x6b\xc1\x0d\x91\x87\x8c\x82\xb8\x70\xe0\x0f\x36\x39\x92\x66\x7a\x81\x33\x12\x4c\x44\xb7\x93\x7f\x9a\xf0\xf1\xe0\xcc\x03\x14\xea\xe8\x6d\x7b\xe7\x7a\x6b\x8a\xc2\x39\x07\xa1\x57\xb9\x0b\x25\xde\xb4\x16\x06\xd8\x69\x5c\x1b\x9e\x45\xa0\x35\x25\x58\x83\xa1\xa3\x9e\x0b\xc5\xf4\xa8\x61\x48\xfa\xd6\xaa\x30\x24\x56\x37\xeb\x78\x46\xbc\xed\xfb\xfa\x4d\xc5\xbd\x95\x57\x0d\x7e\x0f\xf9\xd3\x90\x35\x85\xe7\x09\xcc\x22\x09\xbd\xc5\x32\x1f\x04\x0a\x92\x46\xc8\xfa\xa2\xd5\xe0\x37\x24\xc5\x41\x61\x7b\xe1\x9c\x61\x46\xae\x86\x8f\x78\x04\xa9\xcc\x07\xf0\x9d\x55\x38\x32\xc7\xd8\x7b\x18\xa6\x0b\x7d\x2e\x4c\xdd\x40\xea\xc2\xb7\xc4\x27\x6e\x65\xe6\xeb\xc7\x6c\x1d\xcc\xcd\x73\x64\x6f\x81\x61\x79\x7b\x14\x35\x95\x8b\x15\x78\x64\x01\x26\x4c\x7a\x9e\x20\x34\xca\xbd\xc8\x84\x70\xce\x61\x7b\xe3\xde\x0e\xb4\xfb\xc8\x93\xf0\x84\x13\x12\x74\x91\x54\xa8\x5f\xb6\x57\x45\xaa\xd4\x84\x13\x30\xa4\xf8\x42\x78\x7d\x7f\x44\x41\x72\x69\x10\xa7\x0e\xd0\x38\x14\x07\x4e\x80\x04\xdd\x37\x45\x95\xf0\xac\xc1\xe4\x1a\xb5\x4e\xe9\xb5\x2d\x4a\x0a\x54\x90\x18\x1e\x60\x40\x40\xee\x00\x41\x2c\x5c\xfd\xc4\x93\x9e\x15\x7c\x65\xd5\x76\x7c\x89\xf4\xd6\x7f\x07\xee\xf7\x60\x0b\x83\x0d\x87\x48\x60\x4e\x09\x7b\xfc\x84\xa4\x3c\x1c\xa6\xc0\xfc\x07\x2f\x79\xe0\xa9\xc0\xa3\x67\xc3\x3c\x1d\x3a\x14\x9e\x96\x91\x68\xbb\x11\xde\x7d\xe4\x61\x8f\x3e\x96\xec\xb1\x86\xeb\x76\x91\x46\x2d\x5f\xf5\x4b\x01\xaf\x02\x3c\x53\x14\x2e\x03\x84\x72\x3c\x50\x0f\x20\xea\xc7\x15\x44\x6c\x9c\x84\x80\x89\xe1\xba\x98\xcc\xf7\x7c\xdb\x6e\x29\xbb\xa5\xe2\xfb\x75\xd7\xdf\x6e\xbb\x09\x14\x86\x1e\x5d\xe0\x6f\xa2\x5a\x2d\x01\xfe\x60\x86\x7a\xbf\xfb\x24\xc0\x3a\xb2\x90\x46\xf0\x89\x22\x4c\x7c\x06\xd8\xa9\xe2\x1e\xa8\x23\x48\x22\x54\x08\xac\xcb\x70\xf3\x00\x12\xad\x2a\xa4\x83\x2e\xf5\xda\xee\xaa\xec\xc1\xba\x78\xaa\x02\x60\x08\xeb\x0e\xdb\xc2\x6e\xb2\x26\xc0\x20\xa3\xe5\xe0\x89\xc0\x45\xa6\x85\xb9\xb3\xd4\xc9\x4b\x7f\x87\xe4\x2f\x32\x45\x7e\x2a\x95\x24\x5b\xee\x0c\x02\x42\x24\x1f\xfc\x04\x40\x7d\xaa\x07\x7f\x68\xaf\x95\x81\xc2\x65\xeb\x93\x2f\x58\x1a\xd1\x9e\x26\x86\x08\x45\xdd\x79\xc0\x81\x7e\x7b\x65\x11\x27\x87\xc4\x0a\x77\x32\xd7\x44\xb4\x89\x2e\x17\xa7\x55\x70\x5c\xd8\x19\xd7\xd7\x3c\xa8\xe2\x6f\xe2\xa1\xc3\x3b\x34\x02\x5d\x64\x6b\x67\x2c\x37\x48\x5d\xca\xbc\xc5\x5c\xb5\xa4\x0b\xa8\x58\x21\x02\x3d\x57\x5c\x0d\x79\x66\x1f\x6c\x80\x43\xc0\x96\x4b\xdc\x19\x54\xef\x0d\xe2\xaa\xd0\x49\x5e\x95\x45\x61\x23\x6e\x4e\x77\xa2\xe6\x36\x0a\x22\xdc\x6e\xc1\xb7\x0c\x56\x4d\xc9\x16\x75\x11\x09\x43\xe7\xc6\xae\x2a\x57\x7b\x0e\xac\x1e\xec\x81\x42\xde\xa4\xb3\xc9\xa1\xcf\xde\x19\x22\xd5\x67\x82\xc0\x17\x90\xc0\x5c\xc0\xa5\xba\x30\xa5\x45\xe6\x42\x61\x0c\xb9\x64\xf4\xb6\xb6\x1e\x68\xeb\xc7\xe6\x0f\x0a\x5f\xa7\x70\xcf\xca\x64\x73\x32\x2e\x8a\x86\xa9\xbc\x6e\x6a\x6b\x8c\x6e\x0e\xf0\x54\x76\x67\x41\x14\x4e\xe3\x3a\xa6\xbc\x4e\x44\x22\xa0\x7a\x6e\x81\xed\xa4\x50\x4c\xf6\x0d\xf7\xe0\xa1\x8e\xda\xb7\xcc\x6a\x3d\x58\x67\xf5\xaa\xca\xe0\x28\x29\xab\x03\xb4\x7d\xf6\x51\xb4\x89\xd2\x5b\xbd\x2a\x77\x36\x9c\x81\x88\xc8\x4e\x3c\xff\x48\xdd\x0e\x56\x12\xc2\x2c\x7b\xb8\x4f\xe0\x00\x40\x7f\x00\x3f\xa9\x30\xfe\x95\x20\xa1\x10\xe5\x68\x0f\x04\x8a\x58\xca\x8e\x73\x64\xa5\x51\x84\x75\xa4\x0b\x93\x2a\x4a\x95\xf5\x07\x14\xf4\x99\xcb\xb5\x49\x60\xae\x08\xcf\xc8\xe5\x3d\x9a\x0f\xaf\xe4\x59\x6e\x44\x93\x1f\xa4\xc2\x58\xbe\x81\x94\xe1\x9d\xa3\x8e\x70\x13\x77\xfc\xed\xcc\x81\x21\x89\x51\xa9\xa0\x39\xc4\x44\x09\x84\x49\xe2\xfc\x29\x71\xd4\xb9\xd5\xa5\x42\x7d\xaf\x89\x38\xe2\xc4\xfd\x3a\xd7\x46\x87\x2c\xf1\x3a\x37\x9b\x00\x40\xa7\xc4\x2a\x1a\x11\x4e\xc5\x75\x96\x17\x27\x56\x13\xe8\xf1\x91\xab\xa7\xed\xb8\x01\x31\x66\xd7\x24\xc4\x7d\x6a\xd1\xb5\x3d\x84\x15\x61\x34\xea\x04\x31\x6c\x19\xd0\xc9\xae\x7d\x16\xa9\xac\x99\x12\x78\x88\x07\xd3\xed\x10\x04\x8c\xb1\xc1\x13\x0f\xe3\x75\x7c\x6b\xea\x28\xe3\xfd\xe9\x45\x08\xd0\xe5\xe0\x16\xe4\x9a\xcd\x21\xf6\x12\x75\x76\x2f\x15\x49\xe0\x25\xda\x02\xf5\x5c\xa1\x15\x82\xd6\x67\xb0\x69\xda\xb7\x55\xc6\x7b\xee\xd1\xf8\x58\x39\x09\x39\xf5\xb3\x9f\xf4\x95\xa9\x56\xf7\x20\xa1\x85\x48\x9f\x7b\xcf\x68\xda\xa7\xf1\x2a\xa4\x40\x6b\x21\x73\x2b\x81\x33\x40\x70\x83\x32\x93\xfe\x8d\x78\x9f\x61\x8d\x8a\xc7\xa4\x49\x21\x38\xac\x09\xa3\x70\x10\x5e\xf1\xad\x15\x4e\x08\x2a\x1b\x75\xd0\x70\xfe\x31\x81\x61\xc9\xc5\xc2\x67\xa9\x9e\x96\x7a\xe1\xc5\x6f\xca\x8d\x9e\x01\xa9\xd8\x33\x50\x72\x5a\x97\x5b\x74\xdb\x5a\x74\x73\x98\x8d\x58\x13\x5b\x96\x3e\xe1\x70\x10\x08\xd5\xf6\x40\x54\x82\x95\x0a\xaf\x8c\xcc\xcf\x04\x9a\xbf\xca\xbf\xbf\xca\xac\x33\x52\x45\x10\xb7\xe8\xab\xa5\x1d\x38\x8c\xb3\x5f\x57\x7b\xb2\xc4\xbe\x45\xe8\xf8\x77\x21\xdf\x46\x7a\x45\xc7\x8d\x8c\x73\xa2\x80\xd2\x9a\x1b\xb7\xea\x6c\xbb\xcf\x1b\xc3\x22\x23\x88\x96\xeb\x50\x44\xf5\x32\x78\xa0\xba\xc4\xce\x56\x0d\x12\x82\x88\xaf\x91\xaf\xd7\x09\x2e\x0f\x5d\x2b\x98\x35\xda\x00\x49\x47\xda\x2b\xf2\x03\x13\x0b\x46\x29\x14\xb9\xb9\x6d\x8d\xa1\x6d\x2b\x17\xbe\xaf\x1a\x6d\x38\x6e\x03\x5c\xbe\x6f\x5e\xf4\x56\x49\x6c\xd7\xa6\x74\xb6\x65\x2b\xbd\xf4\x16\x16\x12\xd5\xbf\x15\x09\x9b\x91\x4e\x03\xcf\x1a\x48\xc4\xd0\x95\xbc\x5e\x42\x0c\x2c\xa3\x78\x1b\xcb\x08\x9b\xca\x64\x85\x42\x78\x24\xc3\xc5\x62\x6b\x19\x88\x75\xdc\x6a\x7d\x99\xea\x9b\x5a\x08\xa3\x7c\x98\xde\xe8\x91\x0b\x19\xcb\xe3\xda\x07\x7f\x11\x1c\xcf\x3b\x57\x51\x20\xa6\xf2\xac\xf8\x42\xb6\xe8\x36\x2b\x6c\xa7\xfa\xc0\xce\x54\x9f\xb0\x41\x5b\xb1\x41\x7d\x73\xf0\xdc\xbe\x45\xae\x59\x60\x9b\x08\x2c\xa3\x8c\x48\x22\xea\x17\x29\x12\x80\x69\xa5\x63\xf0\xbe\x3c\x8f\xe0\xf1\x92\x48\x09\x41\x37\xbe\x63\xad\x6b\x5d\x19\xd6\xca\x40\xe7\xae\x87\x2f\xdf\xcc\x11\x05\xb4\x24\x94\xd4\x5e\x26\x52\x37\x5d\xf2\xc6\x87\x40\x8b\xa2\x2a\x85\xb8\x80\x98\xf6\xc9\x4d\x0b\x81\xb7\xb1\x9f\x89\x56\xcb\xab\x54\xcf\xed\x43\xe6\x5e\xc1\xaf\x91\x3e\x4b\x54\x3e\x58\x3e\x21\x5a\x87\xd8\x52\x24\xc2\xd2\x15\x5d\x8b\x64\x99\x0a\xfb\xa8\x5b\xb2\x2f\xea\x29\x69\x3b\xd8\x64\xd9\x16\x37\x6d\xb6\xb5\xa9\x5e\xb8\xc8\x3a\xba\x0c\x3c\x9d\x8b\xe9\x90\x32\x0e\xc8\x99\x77\x59\x95\x79\xf7\x83\x3b\xb4\xa2\xf4\x96\x1b\x24\xe2\xfc\xdc\x49\xb4\xb6\x8d\xc9\x72\x78\xa9\xa8\x95\xe1\x6e\xa1\xbc\x24\x0e\xfa\xc1\x6e\xb2\x7d\x0d\x89\x57\x66\x56\x13\x25\x27\x78\x0c\x6e\x21\xed\xb3\x1a\x0e\x38\xfe\x44\xb1\xdf\xde\xda\xaa\x03\xe0\x62\x3c\x26\x23\xc1\x3d\x7e\x17\x3f\x1f\x35\x50\xf9\xd5\x71\x64\x9e\x06\x84\xfc\xca\x4d\x13\x36\xcd\xc0\x8b\xff\x01\xdb\x7a\x12\xcb\xe3\x11\x8a\xb9\xdc\x44\xe9\x1c\x61\x82\x24\x0d\x27\x85\xd7\x0c\x8c\xea\x8e\xb0\x62\x6e\xb0\x68\x04\xbc\x0a\x42\x3a\xf4\xd8\x9a\xe9\xcc\x4e\xc0\x50\xc1\x34\xb9\xb3\x87\x2e\xaa\xf0\xee\xdf\x9e\x95\x50\x0a\x58\xdd\x97\x5c\x85\xe0\x91\xd9\x07\x77\xdc\xf0\xf0\xf4\xb7\x86\x07\xc7\x79\xef\xdb\x23\xf7\xc8\xd9\xc5\xaf\x07\xd4\xaa\xb2\xab\xcc\x85\x15\x60\x0b\x50\xea\x48\xae\x79\xf5\x8d\x77\xe9\x2e\x41\x78\xf9\xc4\xb3\x57\x7c\x85\x3a\x12\x7e\xd0\xa3\xb7\x00\x04\x15\xd5\x4a\x4d\x98\x79\x51\xd9\x17\x39\x78\x3e\xe4\x70\x42\xe0\xea\x3c\xad\x1c\xdf\x87\xc3\xe3\x12\xde\x25\xfb\x57\xfe\x11\xdc\x8c\x42\xb5\x8a\x30\x6b\x8c\xe8\x02\x1a\x1e\xee\x8b\x97\x60\x7b\x5f\xc5\x56\x45\x19\x7d\x41\xb8\x06\x2d\xff\x08\x78\xab\x60\xd8\xdc\xea\x11\x55\x16\xa0\x04\x8f\x96\x3b\xd0\x82\xba\x67\x62\x5d\x49\x58\xd2\x50\x4c\x11\xcb\x91\x2c\xdc\xeb\xd4\x23\xb3\x71\x19\x7d\x22\x6c\xb6\xb3\x6b\x1f\xc7\xf3\xb1\x9e\x2c\xf4\x74\x16\x04\xcf\xdf\xcf\xe6\x7a\xf9\x71\xac\xaf\xe7\xb3\x0f\xf3\xd1\x55\xa2\x97\x33\xf8\xf7\xf8\x1f\x97\xe3\xe9\x52\x5f\x8f\xe7\x57\x93\xe5\x72\x7c\xa1\xdf\x7d\xd6\xa3\xeb\xeb\xcb\xc9\xf9\xe8\xdd\xe5\x58\x5d\x8e\x3e\xa5\x7a\xfc\x8f\xe7\xe3\xeb\xa5\xfe\xf4\x71\x3c\xd5\x33\x77\xf5\x4f\x93\xc5\x58\x2f\x96\x23\xf7\xf9\xc9\x54\x7f\x9a\x4f\x96\x93\xe9\x07\xb8\xde\xf9\xec\xfa\xf3\x7c\xf2\xe1\xe3\x52\x7f\x9c\x5d\x5e\x8c\xe7\x20\x78\xf4\xc3\x6c\xae\xe0\x8b\xfa\x7a\x34\x5f\x4e\xc6\x0b\x37\x8c\x5f\x27\x17\x63\x39\x24\xaf\xd9\xfe\xb4\x58\xfb\x78\xe2\x2e\xa4\xc6\xff\x78\x3d\x1f\x2f\x16\xe3\x0b\x3d\x9b\xeb\xc9\xd5\xf5\xe5\x64\x7c\x91\xe8\xc9\xf4\xfc\xf2\xe6\x62\x32\xfd\x90\xe8\x77\x37\x4b\x3d\x9d\x2d\xf5\xe5\xe4\x6a\xe2\xc6\xb9\x9c\x25\x70\x37\xfa\x2c\x5f\x7d\x32\x5e\xa8\xd9\x7b\x7d\x35\x9e\x9f\x7f\x1c\x4d\x97\xa3\x77\x93\xcb\xc9\xf2\x33\xa8\x34\xbd\x9f\x2c\xa7\xe3\xc5\x02\xa6\x6e\x84\x23\x3f\xbf\xb9\x1c\xcd\xf5\xf5\xcd\xfc\x7a\xb6\x18\xa7\x38\x81\xd3\xe5\x64\x3e\xd6\xf3\xc9\xe2\x0f\x7a\xb4\x50\x34\xad\xff\x70\x33\xf2\xd7\xb9\x1e\xcf\xdf\xcf\xe6\x57\xa3\xe9\xf9\xd8\x3d\x8a\x7c\xe4\xc9\x02\x9e\x56\x7f\x9e\xdd\xa4\x7a\xf1\x71\x76\x73\x79\x21\x7f\xaf\xdc\x34\x8d\xf5\xc5\xf8\xfd\xf8\x7c\x39\xf9\x75\x9c\xb8\x0f\xea\xd1\x62\x71\x73\x35\xa6\xd9\x5e\x2c\x61\x7a\x2e\x2f\xf5\x74\x7c\x3e\x5e\x2c\x46\xf3\xcf\x7a\x31\x9e\xff\x3a\x39\x87\x59\x98\x8f\xaf\x47\x93\xb9\x9e\xcd\xd5\xf9\x6c\x3e\x77\x57\x99\x4d\x69\x09\xbd\x49\x11\xf7\xed\xab\x19\x97\x0c\x36\x76\x96\x62\xea\x56\xcf\xf8\x57\xb7\x36\x6e\xa6\x97\x6e\x1a\xe6\xe3\x7f\xb8\x99\xcc\xdb\x2b\x44\x5f\x8e\x3e\xb9\x57\x30\xfa\x30\x1f\xc3\x2c\xcb\x05\xf1\x69\x72\x79\xa9\xdc\xab\x6b\xaf\x8a\x04\xbe\x32\xfd\xac\xc3\xaa\xf8\xac\x3f\x7d\x9c\xe9\xab\xd9\xc5\xe4\xbd\x5b\x20\xb8\x6a\xf4\xf9\x6c\xfa\xeb\xf8\xf3\x22\x9a\x94\xd1\x42\x2c\xd7\xd1\xbb\x99\x9b\x97\x77\x63\x7d\x39\x81\xf1\x2c\x67\x30\x49\xee\xa5\x5d\x8c\xae\x46\x1f\xc6\x0b\xb1\x2c\xe0\x9e\x24\xa2\x9c\xe8\xc5\xf5\xf8\x7c\x32\xba\x4c\xd4\x64\x7a\x3e\xb9\x18\x4f\x97\xa3\x4b\x8d\xf7\x5c\x8c\xff\xe1\xc6\xbd\xd8\xd1\x25\x5f\x44\x8f\xe6\x93\x85\xbb\x82\x5b\x99\xf4\x16\x6f\x16\x63\x58\x7d\x53\x5e\x35\xcb\x99\x72\x3f\x93\x6f\xf8\x24\xdc\xbb\xbb\x22\xf5\xe5\x6c\xb1\x70\x57\xbb\x18\x2d\x47\x1a\x46\xbc\x1c\xe9\x77\x63\xf7\xe9\xf9\x78\x7a\x31\x9e\x8f\x2f\xd4\x64\x3a\x3a\x3f\xbf\x99\x8f\x96\x70\x33\xf7\x8d\xf1\x42\x2f\x6e\x16\xcb\xd1\x64\x8a\x6f\xc3\x3d\x2f\x6c\xef\xc9\xfc\xc2\xef\x30\x58\xb4\xef\x47\x93\xcb\x9b\x39\x2f\x3b\xc5\x83\x5a\xce\xf4\xec\x7a\x0c\x97\x84\xe5\x27\xde\x04\x7e\x62\x31\x4c\xe0\xe5\xeb\xc9\x7b\xbd\xb8\x39\xff\x48\xaf\xcd\x5d\x14\x3e\xa7\xf0\x8d\x7d\x1c\x2d\xf4\xbb\xf1\x78\xaa\x47\x17\xbf\x4e\x60\x2f\xd2\xf2\x9e\x2d\x16\x13\x9a\x93\x19\x5d\x81\xe6\x91\x16\xdf\x8f\x29\x0a\x58\xec\x2a\x1b\x16\xe0\xa2\xd3\x22\x12\xce\xac\x75\x64\xed\x7c\x27\x8a\xfb\x58\x1e\xad\xe2\x00\x99\xf7\x40\x67\x44\xca\x62\x18\xa8\x6e\x2d\xf9\x3a\x79\xb9\x32\x39\x35\x8f\x20\xa1\x2d\xa1\x93\xc9\xfe\x62\x7f\x12\x41\x7c\x9d\x0b\x68\x1f\x31\xcb\xb9\xaf\x1a\x26\x42\x40\x7f\x94\xae\x64\x1e\x59\xf9\xb2\x6e\xf4\x2a\x2f\xb1\xe7\x72\xe7\x4e\x3e\xe0\xe2\x47\x55\xa0\xdb\xba\xcc\xf7\x8d\x45\xbe\x5e\x74\x39\x9c\x4b\x9e\x3d\x64\xb9\x0a\x63\xef\x49\xcb\x44\xe1\x18\x83\x41\xa3\x9e\x9c\xd0\x0c\xa0\xa2\x89\x08\x4d\xc5\x6d\x48\x88\xaf\x48\x17\xba\xb2\xcd\xbe\x92\x84\xa2\x7a\x3c\x75\x2f\xf4\x88\x6c\xdd\xc7\xf2\xd1\x4d\xd2\x08\x26\x00\x91\x57\x4b\x86\x7d\x7f\x76\x47\xd9\xd4\x3e\xf2\xe5\x6b\x5f\xff\x21\x51\x18\x70\xeb\x1f\x03\x37\x1e\x03\x10\x48\x6b\x98\xea\x1b\x34\xc6\x3b\x68\x18\xac\x1b\x80\x8a\x00\xcb\xc6\xbe\xee\x08\x62\x61\x5d\xa3\x6e\x90\xc2\xa7\xd4\x66\x75\x0f\x09\x71\x0f\xd4\x2c\xbd\xa4\x60\x24\x70\x4a\x4d\xb9\x96\x15\xce\x51\x95\x20\x96\x62\x65\x85\x4d\x5f\x1d\xaa\x03\x18\x7c\x49\x58\xae\x44\x9b\xa6\x31\x94\xce\x0b\xce\x28\x37\x25\x79\x27\x9e\x70\x7b\x13\x48\x50\xd6\x66\xe3\x86\xec\x86\x0b\x5f\xf6\x99\xec\x06\xb9\x2a\xb0\x03\x02\x00\x3f\x02\xfd\x8e\x72\x1f\x75\xac\x8d\x08\xfe\x14\xa5\x23\x05\xe7\x9e\x67\xb9\x45\x76\x04\x77\x25\xb8\x04\x09\x45\x62\xb9\x24\x10\x97\x59\x3d\x58\x05\xbd\xc0\x1c\x03\xdd\xb5\x36\x6a\x57\x42\x70\x86\x59\x02\x26\x9a\xd9\xec\x3d\x91\x28\xe8\x99\x3a\x4f\x33\x55\xea\xef\xdd\x3c\xc2\x77\x99\xa2\x4c\x3c\xfa\xb3\x1a\xfa\x78\xf0\xb2\xfa\xb6\xca\xec\x46\x67\x6b\x14\x1e\x7d\xa4\x66\x0e\xe7\x36\xa7\xbf\x93\xda\xf5\x27\xe7\x43\xfd\xf7\x07\x6b\xaa\xdf\xe9\xbf\x87\xaf\x97\xdc\x03\xf7\x3b\x85\xda\x07\x42\x36\x33\x7a\xbf\x6f\xbd\x62\x75\xf4\x56\xb3\xa6\xa3\xb1\xeb\x91\x31\x51\xe8\xfc\xa4\x97\x6b\x6a\xfd\xb4\xf7\xad\xa4\x0a\x3a\xc5\x1f\x1d\xfd\xc6\x4b\x81\xf6\x3f\x89\xfb\x33\x87\x21\x1c\x51\xc1\xff\x6b\x3f\x70\x78\x2e\xdf\x5e\x70\x5f\xee\xac\x6f\x8e\xe1\xd8\x72\x5f\xdb\xcd\x3e\xc7\xc8\x91\x7c\x2c\x38\x9c\xd9\xcf\xfa\xc5\xb7\x9f\xda\x07\xaa\x81\x50\x7e\x52\x58\x99\x4d\xc7\x55\x2a\x2b\xf6\x94\xd4\x71\x4f\x69\x61\xbf\x53\x02\x1e\x44\x7a\x5d\x1c\xcb\x28\x2c\xb9\x54\x3d\x9a\x38\xb6\x62\x4f\xbd\x22\xdf\xfc\xa3\x1a\x31\x6d\x10\xaa\x15\x65\x93\xe8\xda\x5a\xfd\xf7\xf7\x4d\xb3\xab\xdf\xfe\xf0\xc3\xe3\xe3\x63\x7a\x57\xec\xd3\xb2\xba\xfb\x81\x11\x17\x3f\xfc\x0e\x3a\xa5\x6a\xf0\xfa\x23\x9a\x8f\xb2\x40\x4a\x08\xe4\x1b\x30\x28\x24\xed\xd6\x81\xcd\xed\xaa\xa9\xca\x22\x5b\x21\x4a\xc1\xec\x6c\xa5\xb7\x26\xcb\xc3\x71\xb6\x93\x21\x22\x81\x9a\x73\x99\x01\x49\xbc\xbd\x22\xf9\x0d\xe3\x66\xa2\x62\x96\x61\x80\xde\xe2\x23\x01\x17\x40\xd6\xa0\xc1\xa8\x89\x57\x53\xd2\xb4\x6e\xcb\xb5\x7d\xab\xd4\xdf\xd3\x3d\x7f\xa7\xff\x92\x8d\x85\x9c\xbe\x70\x10\x8d\xde\x2d\x66\x97\x37\xcb\xf1\xe5\x67\x19\x61\xfc\x02\x2f\x90\xde\x9d\x6e\x0e\x3b\xab\xff\x07\x48\x76\x3f\x3e\xe3\x35\xdb\xde\x9c\xc1\xf0\xbb\xc8\xe9\xd1\xe6\xab\x72\x4b\xf9\xc1\x78\xaf\xa2\xe5\xa5\xdc\x82\x88\xe9\x7f\x91\xf7\x59\x3d\x93\x23\xa0\xfc\xce\xfd\x61\x57\x36\xf7\x16\x2a\x75\x5e\x78\xce\x0f\x0c\xee\xef\xbf\x4d\x2b\x8d\x75\xc6\x65\xc7\xaf\x8a\xb8\x46\x8f\x64\x1c\xf5\x6c\x03\xde\x81\x2f\x28\x07\x9b\xe7\xef\xbc\x85\xae\xe1\x5b\x1b\xa2\xcc\x5f\xe8\xc8\xfd\x70\x33\x09\x84\xba\x44\xe9\x0f\xe3\xd9\x43\xd4\xaf\x07\xe6\xd6\x6d\xcd\xdb\xf2\xeb\x20\xde\x19\x80\xe8\xbc\xb3\x64\x38\xec\x76\x97\x97\x07\x5b\x41\x9f\x30\x5e\x84\x35\xd1\x58\xc5\xcd\x56\x43\x00\xb1\xba\x60\x33\x4f\x14\xaa\x6c\x41\xc1\xa9\xce\xee\x0a\xa4\xbc\xe2\x05\x12\xdc\xae\x41\x28\x9e\x7b\x4a\xdb\x8d\x0e\xd2\x0f\xfa\x7d\x59\x29\xac\x64\xc7\x7b\x04\xe5\x79\x49\x45\x30\xa4\x1c\xa1\x3b\x05\x43\xdc\x26\x68\xb2\x7f\xef\x86\x5c\x3e\xbd\xed\x7d\xe6\x05\x51\x65\x92\x1c\x0b\x75\xd8\xfd\xcb\x51\x48\x53\x1d\xa4\x85\xbd\x36\x15\xd7\x0f\x2a\x69\x6b\x8d\xae\xf7\xb7\x55\xb9\x6f\x32\x38\xe4\x88\x7d\x8c\x72\x34\x8a\x5b\x24\xdd\x9a\x85\xa9\x40\x93\x0b\x48\x1e\x1c\x48\x9e\x15\x5f\xb0\xb1\x39\xdc\x90\xaa\x34\x0d\x25\x02\xd1\xd5\x53\x74\x71\x4a\x2a\xe1\xee\x79\xe4\xf2\xff\x23\xd5\xf4\xd7\x65\x12\xa9\xda\x5f\xda\xba\xb6\x55\x6b\x56\x54\xc8\x2a\xd7\x8d\x35\xeb\x6e\xa1\xe4\xdd\xbe\xc1\x36\x96\x44\xef\x80\xa8\x1c\x30\x2b\xfd\xaf\x41\x79\x28\xda\x0f\x8f\xf7\x87\xe7\x45\xd9\x3c\xcf\xef\x76\x79\x7a\xdf\x6c\xf3\xdf\xa5\xea\xef\xfe\xf6\xe7\xaf\xf4\x27\xfd\x61\x3a\x5b\x5c\xa6\xcd\xd7\xe6\xaf\x77\x8f\x17\x2f\x5e\xbc\x78\xf3\xe6\x95\xfb\xff\xe9\x8f\xaf\x5f\xc8\xff\xbf\x78\xf1\xe2\xf5\x8f\x67\xaf\xcf\xfe\xee\xf4\xe5\x9b\xb3\x17\x2f\x5e\xfd\x78\xfa\xfa\xf4\xef\x5e\x9c\x9e\xbd\x3a\x7d\xf9\x77\xfa\xc5\x5f\x6f\x48\xe1\xcf\xde\x9d\x70\x5a\xff\x5d\x6e\x36\x55\xf6\xa5\x3e\xfa\xb9\x6f\xfd\xfe\x7f\xd1\x3f\xd3\xf1\x72\xf2\xdf\xc7\x53\x17\xb9\x4f\xf5\x62\x76\x33\x3f\x1f\xeb\xcb\xc9\xf9\x78\xba\x18\x2b\x45\x65\x0e\x7d\x9a\xbe\x60\x1d\xd4\x58\x52\xfc\x34\x7d\x91\x9e\xa6\x7a\x70\xee\x99\xe2\xf4\x4d\xed\x25\x47\x23\xf2\x63\x59\xb0\x65\xba\x18\x84\xa2\xa1\x9a\xd2\x39\x30\x4b\x4a\xb6\x9c\x08\x7f\x01\x37\xc3\x5b\x09\x74\x35\x89\x49\xbb\x08\x84\xbb\x1a\xa0\x12\x8c\xc1\x9d\xc7\x1d\xc3\x91\xef\xe3\x25\xf8\x2d\x85\x32\x57\x52\x7f\x02\xee\x71\x16\xdf\x83\x4b\x3d\x03\x21\xeb\x2a\x4b\x44\x74\x78\xcf\xb8\xbf\xe5\x1c\x98\x28\xb1\xc4\x1f\x5d\x1c\x69\x5e\x80\x9f\xf0\x5c\x22\x9f\x99\xbf\x2c\xfe\x30\xe0\x1e\x6e\x0f\x81\x2c\x86\xf8\x0c\xc5\x57\x61\xb4\x2f\x61\xb4\x58\x4d\x3b\x17\x52\xb1\x9d\x31\xb9\xb9\x88\x6f\x51\x56\xed\x87\x51\x7d\x0f\x03\x03\x8c\xbe\x09\x18\x3d\x94\x1b\x31\xb5\x15\x9a\x90\x04\x8e\x87\xbb\x57\xb6\xdc\xc0\x08\x5f\xa5\x7a\x30\x0e\xae\xeb\x85\x5c\x13\x57\xd6\x05\xc1\x59\xbd\x1d\x04\xf1\x4f\xfe\x91\x94\x79\x84\x4c\x3e\x32\x7c\x35\x92\x3d\x9a\x02\x7f\xea\x97\x07\xe6\x28\xa1\x69\x2c\x1c\x66\x29\x00\xbd\x36\x8d\xc1\x7c\x11\xac\xe8\xd7\x6e\x7c\x5e\x13\x93\x07\x22\xe7\x94\x85\x17\x50\x76\x24\x74\x99\xc5\x92\xc0\xa7\xe9\x9b\x54\x0f\x26\xd0\xe4\x90\xeb\x0b\xd6\xa9\x95\x2f\x44\xb0\x36\x43\x87\x12\x2c\x58\x46\xe8\x31\x79\x91\x55\x9d\x6b\x70\xfc\x25\x6e\xc8\x0e\xbb\x6f\xfe\xbb\x3d\xe8\xf1\x57\x54\x0a\x1b\xc1\x68\x7e\x4c\xf5\xe0\x12\xd5\x02\x3e\x09\xe1\x75\x2a\x26\x63\x82\x82\x4a\xc0\xad\xc7\x2d\xab\xce\x9b\x54\x04\xe1\xc1\x1b\xb7\x58\x11\x8e\x54\x85\xc5\x1c\xff\x14\x44\xf5\xc3\x7c\xb8\x18\x93\xe8\x03\x60\xc0\x3f\xc1\xf6\xc6\x8f\xc9\x57\x11\x54\xe7\x42\x7f\x0f\x60\x69\x3c\x7f\xd3\xd6\x7c\xcd\xb6\xfb\x2d\x61\xa6\x14\x67\x74\x44\x57\x01\x71\xd3\x64\x01\x0d\x98\xd1\x24\x23\xf8\x8e\x3a\xb4\x00\x3f\x01\x75\x21\x6e\x34\x80\xa6\x0f\x56\xf9\x88\xc1\x69\x1e\xb5\xe4\xa6\x28\x2b\xe0\x19\x7e\x4e\xf5\x20\xda\x2b\x52\xba\x99\xeb\x3b\x04\x9b\x5c\xdb\xdc\xc2\x3f\x7d\xe7\x11\x35\x89\xad\x2c\x74\x22\x34\xd5\x7e\x05\x15\xb2\x72\x23\xe5\xf2\x3b\xbb\x1a\x25\x81\xa8\x27\x2a\xb6\x67\xfa\xd3\xbd\x2d\x54\xbc\x96\x85\x6c\x0c\xf8\xef\xb5\xad\x08\x97\xe5\x49\x10\xae\x22\xfa\xb7\xfa\xad\x52\x23\x6a\xbf\xff\xd6\x13\x30\x58\x1e\x2b\x6e\x90\x14\x12\xd4\x36\x3c\x74\xe5\x97\x59\xff\xb0\x95\x7a\x87\xf7\x2b\xec\x23\x25\xa7\x04\x3e\xab\x8e\x58\xa2\x7a\xa7\xe4\xe8\x75\x4f\xd3\xd3\x17\xa9\x1e\x44\x5f\xe0\x57\x24\x77\x17\xb0\xce\x92\x3a\xbf\xb7\x36\xc8\x5f\x49\x38\x06\xb5\xb6\xf5\xaa\xca\x6e\x43\x76\xe4\x7b\x77\xa7\x9b\xf6\xf8\xb8\x50\x5e\x0a\x24\x69\x2f\x55\xa2\xf7\x00\xef\xb9\x07\x23\xe4\x95\xf4\xb0\x6b\x26\x3a\x4b\x8f\x51\x97\xf0\x34\xb8\xdd\x86\x7d\x4b\xfa\x9c\x7a\x78\xc2\x5a\x95\xbd\x15\x27\xf5\x30\xd1\x45\xf9\x18\x9a\x79\x7c\x47\x8e\x0a\x1d\x39\xe1\x18\xe0\x7c\x4f\xc8\xa0\x27\x44\xcc\x4a\xbc\xac\x35\x45\x6e\x66\x07\x24\x15\xfb\x9a\x7b\x38\x14\x59\x5a\xba\x7b\xb0\x05\xee\x19\x60\xa7\xd2\xb1\x77\xea\x06\x2f\x26\x7c\xf0\x4d\xd1\xf5\x68\x13\x3c\x2d\xbe\x2e\x9f\x05\x14\x24\xcb\x35\xb0\x15\x66\x61\x09\x72\xc7\xa1\xdb\x13\x5e\xc8\x57\x1d\x97\xfb\x4d\xbc\x5e\x32\x2b\xa5\x04\xe1\xc9\x20\x46\x83\xf0\xc5\x40\x5d\xa8\xb0\x99\x34\x9c\x4e\xd8\x26\x2a\x68\x03\x7d\xbc\x9f\x61\x22\x62\x67\xaa\xac\x86\xa2\x31\x75\x4b\x04\xc3\xa1\x7a\x0c\x07\x49\x09\xd9\x1c\x71\xed\x45\x22\x1c\xb0\xf8\x48\xe0\x49\x14\x9d\x38\x6a\x75\x5f\x66\x4c\x54\x2b\x17\x3f\x95\xe9\x09\xa3\xbe\x85\x0e\x14\x6a\x55\xac\x56\xf7\xd9\x03\xc9\xa3\x07\xce\x18\xd5\xca\x8b\xe8\xb5\xe5\xef\x91\xe7\xb8\xb6\xcf\xf1\xbb\x12\x61\x2b\x14\xe2\x03\x52\x71\x83\xba\x68\x5e\x33\xe1\x34\x3d\x75\x1e\xdd\xe7\x72\x3f\x00\x62\x25\xf7\xb7\x6a\x30\x94\xa2\xf8\xf2\x50\x36\x5c\xba\xc1\xc3\xb9\x23\x43\x88\xcc\x24\xb8\x7c\x51\x90\x34\xf3\x34\x40\xe1\x84\xe0\xf3\x30\x89\x77\x2b\x16\x41\x22\xd8\x83\xea\xe8\x97\xd6\xf5\xde\x63\xbc\x16\xcc\x82\xee\x36\xeb\x7b\xaf\xa5\x03\x83\x03\x32\x7c\x7c\x2e\x6e\xf6\x82\xc3\x8a\x46\xce\x07\x3c\xac\xb2\x3a\x21\x28\x36\xb5\xe0\xe9\xdb\x03\xe3\xb3\x29\x09\x86\xcc\xd7\xbc\x28\x21\xb3\xf9\xb9\xdc\xff\xa6\x96\x33\x9c\xd1\x13\x33\xc4\x5d\x58\x3e\xba\x79\x42\xf6\x28\x64\x14\xc6\xbf\xc3\xa9\x1d\x3a\x51\x3c\x65\x3f\x40\xc0\x4d\x61\xee\x3c\xfd\x0e\x74\x0a\xe1\xe3\xf8\xa3\x5c\x01\x22\x14\x99\xaa\xa2\x90\xc2\x23\x82\x9d\x91\xaa\x40\xdd\xb4\xdc\x08\x5d\x8f\x4d\xb6\x69\x40\xba\x63\x05\x3d\x52\xaf\x5f\xfc\xb7\x21\xbb\xbb\xe5\xbe\xf1\x68\x3e\xd0\xd4\x06\xdf\x18\xfb\x59\x20\xa4\x89\x2e\x29\x46\xe5\x45\x9d\xe5\xea\x0f\x56\xf6\xcc\xbd\xb5\x25\x70\xed\xb6\x1d\xba\x0f\xce\x96\x1d\xfb\xa5\xb3\xae\x6c\xef\x6a\xfd\xb9\xdc\x2b\x83\x4d\x73\xcf\xbb\x5d\x73\x49\xdc\x5d\x17\x7a\x4f\xe2\xa6\x79\x8e\xa2\xc0\x44\x01\x8a\x73\x2f\xe9\xe4\xd1\xfc\xbe\x55\xca\xbd\x3d\x5c\x11\xfd\x1f\x24\xd7\xe7\x44\x78\xc1\xa1\x83\xcc\x73\xa8\x0d\x85\xe5\x76\x2f\xac\xfb\x88\xdc\x57\x51\x59\xd2\xfb\xe3\xbe\x8a\x84\xd9\xf1\x12\x96\x59\x49\x44\xa3\x22\x1c\x94\x22\x89\xdb\x3d\xfc\x4f\x7a\x9c\x57\x22\x4d\x23\x76\x69\x77\x32\xc5\xe1\x8c\xa2\xa2\x4d\x44\x18\x2d\x5c\x67\x28\x73\x29\xe5\x16\x17\xce\x0d\x75\xfb\xd2\xb1\x19\x77\x9f\xa2\x3f\x2a\xda\x4a\xb5\xe8\x2a\x2d\x37\xb1\x0f\x24\x9a\x16\xa1\x12\xe1\xa2\xbe\x84\x3b\x4e\xb0\x47\x8f\x3a\x19\x85\x10\x49\xe8\x66\xc4\x71\xab\x10\x56\xbb\xb9\x2b\x43\xcb\xd0\x77\x4c\x4d\xaa\xd4\xc9\x0a\x77\x6c\x87\xd0\x88\x61\xe8\x6c\x85\xce\xd2\x53\xb7\x3e\x98\xdb\xc7\x59\xe0\xa0\x94\x8b\x6d\x0b\x6a\xed\xcc\x77\xf7\x7d\x23\x9b\x4d\x78\x73\x2d\x0f\xa8\xa7\x45\x4e\xb5\x5c\x96\x93\xf5\x50\xb7\xa1\xb7\x72\x60\x6e\x40\xb7\xe5\x03\x6c\x88\x9e\x8e\x17\x7a\xa6\xb7\xfa\x74\xa8\x90\x67\x78\x4d\x5e\xe5\x67\x28\x20\xe7\xb6\x11\x6c\x15\xd1\xe0\x7e\xd1\x67\xc3\x20\x05\xd7\xf9\x8c\xc2\xcf\x94\x95\x7e\x39\x24\xc9\x84\x00\xac\xaf\xd1\xd2\xb9\x95\xf1\x56\x67\x38\xcf\x7d\xed\xbe\x1d\xcf\x38\xa3\x0f\x7f\x2b\xd5\x10\xc9\xd5\xf1\xb9\x08\x07\xe6\x43\xb6\x62\xa5\x58\x30\x52\x67\xa9\x3c\xbe\xc9\x02\x29\xb5\xe8\xb5\x13\x47\xb6\x3f\xb7\xda\x42\xf0\x2f\xaf\x86\x26\x4b\x05\x93\xa5\x7f\xb3\xc9\xfa\x6b\x19\x9f\x28\xd9\xf2\x17\xda\x1d\x30\x00\x2d\xbb\x13\x27\x53\x56\xc4\x3f\x7c\x7b\xc0\x03\x42\x4e\x4e\xef\xc6\x63\xf1\x2c\x70\xfb\x84\x48\xbe\xbe\x35\x75\x56\x27\xf2\xbd\xb6\x92\x2f\xa6\x15\xae\x93\x15\xf8\x8d\xd6\xeb\xfb\x8c\x57\xd2\xb2\x5e\xd1\x50\x54\x94\xa4\x92\x4f\x4c\xcf\x66\xf2\xb2\xe0\xf1\x21\xf6\x24\x2c\x66\x92\x38\xac\xe5\xf7\x7c\xbe\x31\x9a\x31\x3e\x73\xc5\xb7\x87\xbd\xdd\xde\x6d\xfb\xa8\x84\x4d\xa5\x41\xf4\x99\x4a\x67\x13\x9e\xca\xbe\xc9\x01\xf6\xbe\x4a\x84\x41\x9c\xf5\x6e\xd8\xe3\xd7\x95\xa9\xbc\xde\xd9\xd0\xdf\x3d\x1b\xdf\x30\xe2\x1e\x00\x75\x96\x9e\xb1\x01\x77\x7f\x7d\xd2\x86\xcb\x81\xa0\xf5\x46\x69\xf6\x38\xd3\xdb\x17\x5d\x7d\xd3\x58\x9f\xfd\x56\x63\x8d\x6d\x11\x6c\xb0\x23\xbb\x63\x6a\x32\xde\xeb\x60\x99\x7b\xe6\xd0\xd9\x70\xd5\xb5\xe1\xbd\x9f\xfc\xb6\x19\x57\xd2\x52\xc6\x01\x64\xb9\xe9\x7d\x85\x47\x2d\xba\xfa\xbe\x85\xd7\x6b\xe6\x4f\x02\x85\x22\xd0\x89\x77\x83\x34\xbe\xff\x50\xb6\x80\x3d\xa0\x1c\x6b\x59\xe9\x57\xdf\x30\x09\x68\x3e\xe3\x44\x68\x13\x8b\x5e\x7f\xdf\xf0\xbd\x82\x7f\x94\xfd\x9d\x05\x90\x73\xaa\xd4\x4b\xe7\x2d\x8f\x42\xd1\x12\xb1\xa3\x81\x40\xab\x75\x2b\x8c\x6f\xdc\x49\x83\xa6\x57\x97\x84\x23\xca\x56\x10\xba\x88\xc4\x3f\xac\xf2\xef\x4a\x59\xf6\x64\x31\x94\xc0\x01\x8a\x25\xdc\x8d\x7a\x45\x4b\x42\x34\x67\x2c\xb1\x10\xe0\x34\xa8\x85\xf3\x0d\x56\x80\xbe\x60\xb1\xf3\x19\xce\xe4\xa9\x4e\xb8\x88\x0e\xa3\x57\x60\x0e\x9a\x16\xbd\xea\xe3\xb0\xba\x00\xad\xa6\x24\x02\x46\x3e\xde\x67\x54\xd1\xa7\x67\x48\xb5\x6c\xb4\x45\xbb\x4b\xd4\x39\xd4\x4d\x00\x0f\xa5\x08\xaf\xde\x37\x4f\xd8\x1c\x90\x37\x16\xb9\x9e\x99\xfb\xa8\x66\x90\x04\xb7\x18\x1e\x0b\x94\x29\xc9\x1f\xba\xa2\x9f\x79\x5e\x3f\x5b\x59\x98\x10\x41\x12\xc7\xc3\xa5\x89\x50\xa6\x90\x70\x7b\x4f\xba\xeb\x19\x81\x9a\x98\xfa\x95\xae\x1c\xe5\xfc\x68\xb6\xd5\xcb\xf4\x35\x2c\xdf\xb3\x54\x8f\x30\x0d\x81\xf8\xc8\x72\x13\x55\x08\x20\xa1\x19\x65\x56\xfb\x97\xb0\x12\x3f\x0e\x4b\x98\x25\x29\x60\x87\x85\x24\x4d\x16\x55\x21\x5a\x92\xb2\xaa\x7f\x61\x05\xc7\xa3\xf1\xe4\x84\x76\x9d\x19\xa2\x0c\x09\xd9\x26\xd1\xc3\xa2\x1e\xdc\xef\x0b\x5f\x89\xd1\xdf\xac\xe8\x04\xf1\xee\xa8\x09\xd0\x8d\x5f\xf5\xdf\xc5\x3f\x15\x9e\xa7\xd9\xa6\xfd\xb0\x6e\x0c\x47\xee\xab\xfc\x7d\x13\xd6\xcf\x00\xe5\xbd\x16\x57\x87\xc7\x24\x3e\xda\xfc\xc1\xea\x93\xd3\xb3\xa1\xde\x96\x45\x73\x2f\x58\x43\xf1\xf8\xcb\x98\xaf\x2a\x27\xd5\xa3\xad\x6d\xd1\x62\xf8\x8b\xd5\xd9\x57\x7d\xf2\xa6\x75\x21\x23\xea\x09\x2a\xda\xbe\x51\x3d\x2f\x5e\x10\x91\x90\x52\x5c\x0b\x25\x9e\xe4\x40\xd7\xc7\xdc\x77\x5d\xde\xbb\x7a\x5f\x79\x6a\xac\xf6\x2e\xe6\x91\x90\x64\x84\xc8\x9b\x01\x38\x8f\x18\xce\xbe\xfd\x72\xb3\xda\x4b\x2f\x72\x51\x33\xae\xd5\xbe\x4c\x9d\xb5\xb7\x98\xf5\xec\xf3\x85\xd2\x60\x9c\x30\x19\x64\xf2\x3c\x36\x9c\xc7\xac\x39\x23\xe3\x50\x9d\x25\xcb\x03\x0b\xb5\xe7\x74\x00\x64\x6d\x4d\x9b\x1e\x2f\x85\x5b\x4c\xd1\xc9\x14\xbb\xcf\x98\x88\x82\x1d\x88\xad\x5a\xa4\x0a\xdc\x67\x3f\xbd\x30\xbf\x0a\x54\xd1\x7e\xaa\x5b\x85\x13\xbd\xb6\x55\xf6\x60\xd7\x49\x20\x51\x17\x89\xb0\x1c\xd8\x62\xca\x6d\x2b\xf8\xf3\xf8\x72\x2f\xd4\xd4\x0e\xa6\x31\x4d\xcc\xe7\x14\x30\x2a\x98\x50\xd8\xa2\xcf\xab\xa8\x7a\xc8\x59\x39\xb1\x16\x12\x1f\xc8\x53\xd2\xdd\x13\x57\xf7\x5b\x01\x05\x46\x3a\x87\x28\x87\x27\x9c\x55\x01\x85\x29\x63\x13\x89\x99\x35\xd2\x26\xa8\xa2\x14\x9a\xea\xf1\x18\x31\x4a\x7d\x99\xbe\x42\x04\xbf\x0f\xfe\xae\x39\xf8\xbb\x32\x8d\x3b\x2a\xf8\x93\x5a\xc3\x33\x2d\x61\xd1\x5d\x83\x23\x86\xde\x0b\x82\x21\xdb\x3e\x62\xcc\xda\x22\xe8\xd6\xa9\xa3\x5d\xae\xde\x67\x75\x14\x7f\xaa\x76\xfc\x19\x94\xb1\x50\xcf\x93\x39\x2f\x44\x69\x90\x9d\xef\x9e\x68\x30\x3e\xaa\x9d\x4f\x7e\xea\xe6\xe7\x2c\x3d\x4b\xa2\x51\xb7\x96\x5d\x63\xbf\x36\xb8\xd8\x3d\x6a\x9f\x94\x66\xcf\xb1\x0e\x20\xb6\x69\x93\x35\xb9\x5d\xeb\xc1\xe5\xf8\xc3\xe8\x72\x40\xef\x86\xdf\x0b\x21\x18\x80\x27\xcf\x78\x9a\x1c\x70\x64\xb1\x20\x12\x7e\x9d\x15\x24\x37\x07\x5c\x9f\xdc\x07\x8a\xf3\x17\x38\x40\x01\x07\xec\xe6\x17\x8d\x7c\xc0\xad\xa6\xed\x17\x51\xde\x62\xf9\x0e\xa6\x24\xbc\x91\xc0\xd7\xdc\xde\x3e\xb1\x19\x54\xa6\xff\x00\xd6\x2f\xdb\x73\x87\x7c\x09\x6e\xa7\xee\xdc\x9e\x13\x32\x2f\x30\x25\x30\x8f\x50\x6a\xca\xbd\x7c\x72\x34\xf5\x10\xe8\x08\xf3\x2b\x08\xe8\x8a\x35\x5d\xbd\x31\x5f\x48\x31\x5e\xd5\x8d\xdd\xd5\x81\x76\x0b\x59\xac\xa1\x78\x24\x4a\x1a\x5b\x93\xe5\x28\x6c\x52\x23\xff\x44\x61\x1f\xeb\xbb\xaa\xdc\xef\xea\x61\x20\x8b\x3c\xa8\x95\xc9\xdd\xc9\xd0\xb0\x0a\x21\x1c\xe9\xd8\x02\x2f\x48\x38\xd7\xdd\x9a\x16\xb6\x9f\xda\xc7\x30\xb3\x41\x66\x0c\x67\xde\xae\x53\xb9\x7d\x50\xf1\xdc\x3f\xf5\xe8\x7a\xd2\xdd\x3c\xcf\x5a\x25\xd4\xb0\x22\x0b\x09\x30\xf4\x20\x50\xdf\x70\xbd\x31\x2b\xcc\xd6\x1e\xdf\x89\x40\xec\x1c\x53\xa9\xe3\x52\xc5\x63\x8d\x67\x24\x80\x41\x95\x9b\x90\x6d\x10\x9b\x31\x8d\x1b\x74\xcf\xb6\x01\xec\x2a\x8f\x14\x51\x8e\x02\x3c\x4a\x92\xe3\x61\x29\x44\xb3\xb2\x1a\xea\x79\xa4\xb3\x52\x83\xe4\x58\xb8\x83\x57\x61\xa9\x89\x01\x2a\x44\x61\x00\x6b\x85\x3e\x4d\xc9\x90\x14\x96\xe9\xab\x13\x33\x54\x14\xf8\xca\x4b\x12\xcf\x52\xdd\x89\x9b\x3a\xd3\xef\xa6\x26\x2e\xc2\x79\x62\x5d\x46\x35\x9d\xd4\x43\xce\x76\xb4\xe7\x5e\xec\x66\x26\xd8\x61\xdd\x14\x37\x23\x6d\x5c\x43\xb7\x6e\xcc\x56\xfa\x75\x1a\xe8\xa9\x49\xd5\x86\xd9\x4d\xdd\xfc\xaf\xf7\xb8\x32\xd0\x26\x86\x73\x25\x94\xc0\x19\x40\x04\x16\xad\x1b\x6d\x80\xe9\x40\x0a\x7f\x80\xdb\x12\xa0\x03\x10\xaf\xfb\x06\x0d\x88\x38\xae\xa4\x43\x15\xb9\xc3\x6e\x9f\xaf\x91\x91\x20\x6b\xea\x00\xa9\x20\xde\x8c\xce\xf1\xde\xb9\x70\x5e\xd2\x02\x87\xdd\xad\x00\x30\xe1\xb5\x23\xf0\x18\x2f\xab\xc3\x90\xda\x57\x0c\xca\xb8\x7a\x4e\x8a\x3c\xfb\x62\x91\x58\x20\x2f\xcb\x2f\x98\x98\x42\xb2\x3c\xe6\x4a\x9f\x6c\x84\xff\xbf\x8e\x98\x90\xe4\x8b\x77\xef\xf4\xb3\xd0\xed\x00\xfc\x30\x76\xbc\xd4\x31\x9e\x8c\x05\x29\xe9\x21\x22\x7b\x19\xf0\x41\xe1\xc9\x61\xab\xc8\xf7\x25\xe8\x47\xc9\x2f\x88\x0f\x7b\x06\x57\xc9\x79\xc6\xa7\x8f\x4e\xff\x6e\x58\xa6\x22\x2f\x80\xd6\x1a\x38\x14\xd4\x19\x17\x79\x04\xfe\x71\xb9\x1f\xbb\x64\x3d\x78\x53\x80\x90\x15\xf3\xeb\xe9\x8d\x05\xc7\x57\x2a\x2f\x92\x28\x63\xc2\x32\x3d\xac\x2d\xe5\x23\xb3\x90\x78\x70\x97\x92\xb3\x2e\x54\xd6\x5b\x81\x7c\x4f\x30\x09\x3d\x5a\xc8\xef\x59\x16\x0a\xfa\xd3\xca\xc7\x42\xdf\xda\x7b\x93\x6f\x12\x4f\x25\x5f\xf2\x8f\x5a\x2e\x9a\x70\xe9\x28\xc9\x15\xa5\x4c\xfc\x3b\xe2\x96\x0d\x6e\xf2\xcb\x0f\x24\x77\x0e\x29\x70\xf7\x3d\x58\x55\x4f\x3d\xbf\x3a\xf2\xfc\x6e\x87\xb1\x3c\xf7\xed\x01\x13\xf7\x39\xf0\x51\x73\xfa\x80\x8a\x91\x9e\x1f\x86\x95\x8f\x90\x22\xa4\xdf\x39\x85\x4c\x42\x9c\x41\xec\x28\x0f\x65\xc5\x6a\x5f\xe1\x6d\x8f\x5c\x89\x77\x8b\xbc\x0e\x6d\x40\xee\x6e\xef\x3e\xb2\x3a\xf2\xca\x31\x14\xfe\x0c\x7a\x0c\x1b\x5b\x09\x5b\xf6\xa6\x95\x95\x2a\x37\xd2\xf9\x65\xa2\x0f\x41\xde\x2c\xea\x00\xed\xe4\x98\xf8\x22\x62\x4f\x0a\xd4\x4a\x6d\x5a\xbc\x85\x2a\xb4\xa5\xea\x97\xe9\xe9\xf3\x97\xe9\x6b\xa1\x46\xb0\xb5\x4c\x29\xd8\x8a\x55\x12\x0e\x8c\x3f\x03\x31\x3c\x65\x32\x7a\xd5\x8b\x8e\x05\x7e\x7d\x68\x18\x29\x41\xaf\xbe\x49\x56\x29\x19\x9b\xd7\x71\x80\x77\x5f\x3e\x22\x0d\x9d\x5b\x34\x30\x5f\xf0\x50\x9b\x7d\xbe\xc9\x3c\xef\xb0\xa4\x36\x88\xa6\x81\x72\x6a\xf4\x34\x9c\xf0\x58\x95\x45\xbd\xcb\x56\x7b\xe0\x4d\x52\x52\xca\xf1\x3b\x62\x96\xe4\x48\xc4\x52\x56\x6a\x55\xe6\xd0\x01\x87\x02\x81\x3d\xf1\x4b\x4f\x62\x49\x5a\xab\x36\x74\x39\x58\xac\x56\x9d\xa8\x2f\x9f\xb2\xe9\x00\x2e\xbd\x65\x54\x91\x52\x46\x08\x54\xca\x0d\x36\xc0\x22\xe8\xc6\x8b\xc5\x9b\x43\xa0\x2d\x83\xf7\x15\x78\x26\x88\xcc\x4a\xbe\xbb\x58\xa4\x89\x53\x08\x58\x99\x21\x8e\xfc\x10\x5f\xf4\x6b\x7d\x62\xcc\x40\x2b\x2c\x66\xf7\xec\x7d\xd6\x20\x1c\x4c\xd2\x3d\xee\x34\xcc\xb6\x19\x60\x42\x20\xfd\x17\xa7\xf1\x9e\xd5\x3e\xce\xea\xc2\xea\xf8\xa2\x3e\x81\x4f\x47\x4b\x8d\x3b\xa6\xb9\x6f\x53\xa7\x41\x9f\x4b\x9c\xba\x3c\x36\x50\x6c\xd4\x34\x62\x02\xf9\xe9\xbe\xcb\x10\x37\x21\xeb\x49\x69\x0b\xa2\xd0\xa1\xb1\x4a\x62\x2f\xc0\x74\xf6\x19\x5d\x37\x4f\xc7\xc2\x7e\xd5\x73\x46\x3c\x6d\xa1\x8f\xa7\x0f\xd4\x6f\xb4\xd0\xc7\x4f\x2d\x70\x8b\x9e\xb0\xd0\xfe\x74\x3a\x6e\x80\x7f\x4c\x65\xb9\x52\x5a\x5a\x4a\x8b\x46\xe5\x4c\xa4\x84\xdb\xde\x22\xa2\x34\xda\x46\xa2\x46\xc2\x48\x65\xf5\x5d\x69\x7f\xdd\x03\x2b\x91\xb7\x74\xcf\xa4\x88\x35\xeb\x72\x7c\x51\x7b\xa1\x7a\x3d\x29\xd8\xa3\x5b\x19\xb7\xc1\xe2\xa5\x52\xb3\x9e\x4e\x8b\xd1\x4a\x75\x96\x43\x30\x91\xbc\x95\xba\xf9\x11\x48\x8d\x08\x71\xbf\x73\x80\x9f\xe9\x0b\xf4\x6f\x17\x8d\x69\xf6\x98\x43\x9e\xdb\xbb\x7d\x2e\xc8\x79\xd0\x91\x86\xdc\x7c\xc8\x13\x7e\x66\x4e\x37\xb8\x08\x02\xd8\x3c\x31\xe4\x91\xbd\x4f\xc2\x06\xf5\x8e\x00\x03\xc8\xae\x5a\x49\xe4\x5b\xf4\x42\xc8\xf5\xae\x71\x68\x89\xfe\xe7\xfd\x9a\x00\x55\xc0\xe6\x87\x19\x25\x1e\x6b\xec\x92\xbf\x85\xf4\x8e\x1c\xdd\xf1\xb7\xd7\x94\xaa\x8b\x02\xf7\x41\xc3\x2f\x3e\xcf\x15\xa5\xa6\x42\x59\xa7\x16\x12\xf2\x6b\xab\x50\x00\x18\x6a\xa2\x44\xa9\x25\x4f\xb9\x20\x0d\x2d\x35\x85\x65\x62\x21\xf8\xdc\x2a\xca\x51\xbc\x0a\xe2\xce\xf2\xfb\x1e\x3a\x28\x53\x38\x75\x6f\x4c\x34\xc6\x40\x33\x16\x2d\x66\x02\x56\xca\x36\x85\x55\x10\x66\x36\xc1\x35\x2a\x1e\x43\xf1\x30\x42\x44\x98\x1f\x28\xc3\x43\x6b\x50\xa6\x78\xca\x8d\x06\x02\x0b\x53\x1d\x74\xfd\x25\xcb\x73\xa2\x52\x60\x6a\x48\x30\x9d\x50\xe8\xf5\xa2\x08\xaf\x3b\xb5\xbc\x0e\x4d\x9a\xdc\x02\x81\x8d\x6b\x25\x53\xbf\x47\xec\x8e\x8b\x65\x91\xdb\x00\x7d\x0a\xd5\x17\x62\x12\x9f\x1d\x3b\x00\xdd\xfd\xf4\x26\x6d\xd1\xb8\xd9\x4e\xa4\x0b\xb8\xcb\xa9\x7d\x94\x6e\xe0\xd4\x36\xd9\x9f\x6d\xa1\xaf\x9b\x83\xbe\x6c\xd6\xfa\x64\xc0\x3f\x19\x0c\x7f\x2b\xbf\xdb\x13\x64\x6e\x11\x93\x1a\xf7\xda\x3f\x4d\xa7\x46\xf4\x5f\x62\xf4\x67\xa9\x1e\x23\x07\x49\xb9\x69\x3f\xc7\xac\x58\xb5\xb6\xab\x4f\x17\x05\xfa\x01\xf6\x42\x44\x80\xdd\xf2\x24\x3d\xf3\xb6\x8f\x4f\x73\xd0\x8a\x95\x6c\x80\xfb\x5a\xf4\x5b\x37\x1d\x31\x49\xaf\x6f\x40\x97\x50\x10\x94\x86\xc0\xcf\x7d\x9d\x22\x01\x31\xda\x9e\xab\xe1\x61\xc3\x65\x97\xb8\x72\xe8\x47\x1a\x93\x2b\xd0\xbb\x03\xd6\x52\x88\x03\x03\xb6\x88\x5f\xeb\xbd\x11\x2a\x0a\x0a\x68\x32\x7c\x3e\x91\x28\xe1\x22\x99\xf2\x68\x94\x1c\xd9\xf7\x71\x15\xfb\xd7\x04\xa5\x92\x2a\x7b\x30\x80\xc2\xe0\x53\x30\xca\x0d\x68\x12\xaf\x35\x1d\x65\xd8\x8e\x39\x3c\x09\x72\xd3\xc0\xe8\x5a\xe4\x07\xb5\x2e\x23\x19\x30\xec\x95\x46\x4a\x94\xa8\xab\xa1\xaf\x9b\x40\x47\xdd\x04\xaa\x95\x15\x1a\x8a\x43\xcf\x99\xec\xca\x42\x5e\xe2\xb3\x14\xd9\xab\xcb\xe0\x32\xee\xee\x2b\x10\xe1\xe6\x5d\x33\x48\xd4\x60\x3a\x5b\x5c\x0e\xb4\x07\x7a\x14\x1b\xc0\x1e\xe5\x07\xe6\x2d\xa4\x2f\x79\x89\xad\xdd\xce\x39\x5d\x59\x4b\x0d\x91\xe0\x10\x0a\x85\x04\x29\x21\x1a\x7d\x02\x3d\xb2\xba\xeb\x92\x05\x50\x63\xd4\xa2\x68\x55\xd6\x48\x0f\x0f\x1e\xaa\xb5\xfe\xf9\xda\xbe\x39\x45\xb8\x80\x5a\xb8\x80\x70\x44\xf1\x92\x9a\xed\xac\x2f\xdc\x4a\x1f\xe4\x1f\xfb\x7f\x97\xea\x93\xf7\x19\xe9\x92\x60\xf2\xb2\xa7\xe0\x13\xec\x63\xd2\x6d\x88\x91\x1e\x5a\x56\x88\x0c\x91\xea\xcf\x10\x51\x92\x1b\x8b\xfb\xee\xe3\xdb\xda\xe6\x0f\xb6\x06\x24\x83\xb5\x5b\xcc\x4e\xdf\xc6\x60\xc6\xba\x5d\xa3\x4f\x87\xb0\xc6\x7f\x4c\xf5\xc5\x64\x71\x7e\x39\x9a\x5c\x8d\xe7\x7a\xf6\xde\x93\x3b\xa4\x4a\x9d\xcf\x7e\x1d\xcf\xc7\x17\xfa\x7c\x76\x01\xe4\x72\xc4\xe0\x76\xa1\x6f\xa6\x17\x63\x20\x9f\x5a\x70\x3b\xaa\x9e\x4d\xf5\x68\xea\xf9\xdc\xde\x8d\x16\x93\x45\xd2\xa1\x75\x53\x3d\xb4\x6e\xfa\x9b\xb4\x6e\x7c\x15\x20\xd1\x1a\x2d\x27\xb3\x69\x22\xa9\xdc\x96\x1f\x47\x4b\x62\x46\x8b\x87\xfb\x7e\x3e\x06\x1a\x2c\xe4\x52\x5b\x24\x82\xc6\xe4\x72\x9c\xe8\xf7\x93\x65\x87\xe7\x4d\x11\x7b\x89\x1b\xca\x74\x36\x7d\x3e\x99\xbe\x9f\x4f\xa6\x1f\x26\xd3\x0f\x7d\xcc\x6f\xfa\x69\xe6\x37\x45\xd4\x58\xed\x71\x75\xe8\xdf\x90\x2e\x4d\x7c\xa8\xc5\x01\xa7\x27\x53\x60\x6d\x99\x8f\x17\xd7\xe3\xf3\x25\x52\xc2\x9d\x4c\x67\xf8\xd8\x93\xe9\x04\x59\xcb\xc6\xbf\x8e\x2f\x67\xd7\x48\xd9\x15\xe8\xbd\xce\x67\xd3\xe5\x7c\xf2\xee\x66\x39\x9b\x0f\x89\x47\x4e\x45\x3c\x72\xd3\xcf\xdf\xe0\x91\xd3\x82\x47\x0e\x5f\x7a\x58\x31\x4a\xac\x18\x60\x51\x5b\x4e\x96\x37\x4b\x20\x73\xd3\xee\xa5\x22\xa1\x9a\x9b\x60\x24\x0a\x0b\x2b\x26\xd5\xd3\x19\xd2\xa9\xbd\x97\x13\xa0\x78\x96\x46\x37\xcb\x8f\xb3\xf9\xe4\xbf\x8f\x2f\xf4\xc7\xf1\x7c\x8c\x4b\x8e\x68\x09\xc5\xfa\x0b\x43\x49\x95\xfa\x31\x3d\xd5\xcb\xd8\x03\x93\x12\x43\xb9\xc1\x14\xc8\x53\xea\xb6\xcc\x8b\x8b\x7d\x0c\xd5\xc1\x07\xad\x23\x66\xb7\x4e\xc0\x23\xa4\xec\x16\x12\xb4\x63\x23\x23\x5d\x2c\x61\x0a\x9d\x84\x3c\xbe\xb2\x82\x14\x9f\xe8\x86\xf0\xb9\x0a\xca\x94\x10\x83\x15\xb5\x19\x02\xe4\x77\x0b\x25\x55\x7f\x7e\x8c\xa4\x20\x0b\x6b\xed\xf9\x1f\x86\x76\xdc\x04\x51\x83\x5f\xd1\x81\x85\x1e\xc3\x0a\xe4\xf2\xb3\x9a\x3c\x79\x1c\x9c\x8b\xe0\x55\xeb\x22\x64\xe0\xa9\x8b\xb0\xac\x62\xca\x35\x94\x96\x16\x17\x32\x0f\x65\xb6\xae\x49\x1c\x02\x75\x06\x94\x67\x59\xae\xb9\xc3\x88\xba\x41\x22\x3e\xf4\xa0\xb1\x28\xe0\x44\xec\x8a\x62\x88\xa5\xa4\x9e\x59\x94\x2c\x24\x89\x4e\x0e\x5b\x93\xf0\xd7\x40\xc5\x2e\xad\xa0\x8a\xa3\x01\xf9\xc4\x22\x6b\x8c\xa7\x85\x44\x07\xed\xc1\xed\x0d\xb1\xf7\x6d\x65\xcd\xea\x5e\x31\xc4\x33\xbe\x21\x04\x2c\xee\x8d\xd3\x41\x1a\x58\x6a\xf9\x3a\x81\xdd\x3f\x24\xb4\xd9\xf9\xf1\xe4\x61\x6f\x39\x1f\x89\x37\xf3\xfe\x71\x53\xea\xbb\xb2\x5c\xd7\x6f\x29\x60\x05\xbd\x6c\x29\x84\x0d\xbf\x55\x2c\x69\xba\x07\x0f\xa2\xdc\x68\x17\xd9\x3e\x98\x1c\x56\x88\xfb\xc4\x2f\xfc\x7d\x93\x55\x1e\xac\x2a\x7e\xc3\xfa\x07\x04\x03\x58\x95\x35\xdc\x01\x6f\xc8\xef\x0b\x3e\xcf\xd4\xb9\x2b\x16\xdd\xef\xde\xca\xeb\xae\x1c\x98\xf4\x55\x5e\x53\x34\x0e\xe3\x05\x71\x54\x76\xed\x01\x46\x9d\x79\x80\x10\x84\xc4\xff\x6b\x15\x9e\x94\xe0\xcf\xf0\x03\xfa\x2d\xb6\xd8\xb5\xc7\xa0\x7b\xc7\xa0\xa2\x2f\xd6\xf8\xbe\xd6\x78\x85\xa0\xa6\x3d\x9e\x5f\x4d\xa6\x23\xe2\xd2\xfc\x09\x9b\x87\x5a\x49\x8a\x1e\x8c\x81\x47\xbb\x61\x94\x10\x54\x74\x23\x35\x11\x45\x59\xe3\x0d\x71\x39\x47\x91\x35\x78\x2c\xd8\xc5\x8c\x04\x3a\xfc\xa1\x7d\x45\x9e\x37\x4d\x12\xea\x81\x28\xd6\x02\x2e\x37\xfa\xd6\xae\x4a\xa8\xfa\x1a\xec\x3c\x90\x73\x9a\xea\x51\x9e\x47\x32\x63\x71\xde\x14\xbc\x13\x15\x6a\xbe\x08\xb4\x10\x02\x1f\xb8\xf6\x59\x2a\x9e\xf3\x6b\x51\x3b\x84\xf4\xa7\xaf\x83\x65\xa0\x66\x5a\x4c\xfa\x64\x95\x2e\x0c\x96\xfd\x24\x36\x2c\x2b\x98\xa0\xf1\xd6\x1e\x4a\x9a\x5c\x71\x83\x0e\xe2\x30\x1a\x0e\xbc\xa2\x33\x9f\x5f\xec\x13\x37\xbc\x85\xe6\x50\x8b\x5a\x82\xa6\x4f\x48\x8b\x80\x16\x27\xde\x74\xa9\xb5\x5d\xe5\xa8\xaa\xf1\xcf\xfb\xf5\x1d\xda\x4c\x44\x8a\x0c\x7d\x4f\x67\x7f\xf9\x28\x6e\x39\xe8\xe7\x11\x68\x79\x82\x7c\x41\x00\x6e\xc0\xea\x00\x16\x3f\x48\x68\xad\xb8\x3c\xc4\xdd\xb4\xce\xaf\x36\xb5\x1e\x5c\x43\x28\x98\xed\x4c\xd1\x0c\x5a\x4a\x8c\xd4\x40\x06\x17\x10\x1f\x7b\xd6\x0f\x6b\xef\xc7\x44\xf9\xf9\xa9\x85\xd8\x3a\xeb\x1c\x88\x5e\xfc\x23\x48\x1b\x71\x5b\xe2\x8c\xa4\xc4\x6e\x04\xb8\xa1\x90\xfc\x2c\x3d\xeb\x44\x4f\xf0\x92\x13\xbd\xdf\x95\x85\x57\x14\xa7\xf4\x02\x84\x0d\xe2\x06\x2a\xec\xb5\x5d\x55\x42\x56\x0c\x68\x13\x3d\x8f\x66\xb6\x61\x05\x9d\x58\x9b\x5c\x08\x67\x93\x17\xee\xc6\x89\xb8\xcc\xb7\xfa\x24\x1b\x52\x32\x37\x2b\x40\xbc\x9f\x2a\x0e\x3b\x73\x88\x1e\xcf\xe8\xed\xbe\xd9\x23\x41\x86\xfb\x38\xc4\x9f\x41\x76\x54\x51\xcf\x0d\x67\xfb\x2a\xbd\x33\x35\x4a\xdf\x11\xaa\x98\xc4\xa5\xfa\x21\xdc\xed\xd9\x84\x6c\xdd\x49\x96\x61\x33\xdd\xba\x32\x8f\x1c\xe3\xf9\xf5\x8e\x8b\xb9\x9d\x24\x3c\x02\x49\x57\xbc\xf8\xda\x37\x82\x2d\xd5\x9a\x36\x3f\x51\x09\xe4\xa5\xbc\xb2\x2a\xeb\x50\x20\x1f\x1e\x1a\x60\x29\xe3\xc3\xe2\xc0\xf1\x44\xad\xf1\xed\x8a\xd9\xa5\xe4\x30\xc9\xe1\xf0\x21\xd7\x79\x34\x8a\x8f\x79\x02\x8a\xe4\x08\xe6\x2b\x5a\x23\x62\x11\xea\x63\x8b\x30\x16\x7e\x12\x26\xbc\x21\x47\x73\x97\x55\x11\x43\x0b\x4e\x0c\x2f\xcc\x9d\xad\xb2\x72\xed\x89\xd7\x89\x9a\x36\xc5\xa6\x1f\x48\x8a\x78\x6a\xbc\x7b\x53\xad\xf1\x6f\xbe\x49\x2c\x91\x49\x8f\xa7\xf7\x2e\x37\xe8\x1c\x03\x34\x86\xcd\xab\x7b\x37\x6f\x3c\x55\x3c\x37\x7d\x7b\xb7\x3b\x5f\xf8\x2c\x51\xe7\x4a\x65\x1f\xca\x2f\x76\x1d\x3a\x58\x94\xf1\xa9\x3c\x80\x73\xa2\x4d\xc3\xe6\x15\xea\xac\x74\x2e\x73\x99\x03\x24\xd3\x03\xf2\x61\x32\xee\xcd\x9a\x3e\xf5\x44\x93\x93\x5c\xa7\xee\x00\x78\xe9\x0f\x00\xb4\xf4\x4f\x9a\x79\x5e\xf1\xd1\x26\x26\xfb\x89\xc0\xd4\xff\x78\xcb\x49\xd8\x0c\x6c\x19\xe2\x45\x5c\xd9\xba\xcc\x1f\xec\x3a\x60\xd6\x5c\xe4\x12\x70\xf5\xb5\x6d\x1a\x44\x59\x0d\x15\x30\x19\xf1\x3e\xa6\x53\x8e\x4e\xdf\xbe\x27\x0d\x7b\x86\x5e\x3b\x7a\x83\xde\x28\x3d\x98\x7c\x6f\x5b\xb9\x93\xa7\xad\xf8\x51\xbc\xa4\xf2\xae\x71\x63\xbe\xd8\x82\xd4\x4d\x56\x20\x6a\x47\xc2\x15\xb0\x91\x7c\x10\xb0\x85\xdf\x94\x95\xf6\x83\xc0\x79\x3a\x70\xd0\x93\xfb\xcc\xdc\x4f\x08\x44\xc5\xdd\xf7\xc0\x7e\x9d\x70\x3e\x5a\xa3\xfa\x09\x47\xf5\x93\xdb\xcb\x88\xef\x72\x43\xb3\xc5\x5a\x01\x22\xc8\xb7\x11\x72\x58\x50\x8b\x33\x3f\xac\xc4\xb2\xc2\x5a\x44\x65\x6b\x9b\xe7\xb6\xaa\x87\x94\x47\xba\x37\x0f\x56\x41\x6a\x16\x64\xf8\x84\x8b\x44\xf5\x43\x0a\x20\xc4\x95\x84\x5f\x18\x5e\xa1\x70\x6e\x62\xdf\x4a\xfc\x06\xfd\xd1\x9f\x53\x91\x0b\x71\xf1\xf3\xe5\x84\x98\x59\x53\xa5\x30\x36\x9e\xce\xf4\xf9\x64\x7e\x7e\x73\xb5\x58\x8e\xa6\xe7\x48\xae\xae\xfd\xaf\xb0\x20\xb2\xfc\x38\x9e\xcd\x3f\x27\xfa\xd3\xc7\x31\x64\x0a\x96\xb3\xf9\x52\x90\x97\xab\xe9\xf8\xc3\xe5\xe4\xc3\x78\x7a\x3e\x1e\x26\x98\x46\x18\x9d\x2f\x13\x4f\x08\xfe\x69\xb2\x18\x27\x7a\xf1\x71\x74\x79\xa9\x3f\xcf\x6e\x92\xfe\x64\x44\xe2\x82\x7b\xd5\x49\x45\x78\x36\xf8\x8b\xc9\x82\x7f\xe6\x9e\x44\xa6\x41\xfc\x67\x16\x37\xd7\xd7\x97\x13\x48\x4f\x41\x1e\x84\xf9\xc5\x89\xf7\xbc\x45\x05\xef\x3e\x71\x3d\x9e\x2f\x66\x53\x4c\xef\x4c\x3f\xeb\xc9\xf4\x62\x32\x87\xcc\x09\xf3\xbf\xeb\xc0\xff\x9e\xa8\xa3\x04\xf0\x9c\x9a\xf8\x38\x72\x8f\x3e\x9e\x7f\x2b\x2b\x45\xdf\x03\x52\x5c\xe6\x79\xff\x30\x9b\x5d\x7c\x9a\x5c\x5e\x26\xfa\xd3\x6c\xfe\x07\xbd\x58\xce\xae\xaf\x47\x1f\xc6\x6e\x46\xaf\xae\x6f\xdc\x45\x3d\x63\xfb\x5c\x5f\x8d\x2e\xdf\xdf\x4c\xcf\xf1\x6a\x38\x78\xe5\xde\x9c\x9b\x63\x9e\xc3\xab\xab\xf1\xfc\x3c\x1a\x25\x53\xc4\xb7\x08\xdc\x91\xb0\x1d\x5f\xd0\xc7\xd1\xaf\x63\x05\xbc\xed\x93\xe9\xfb\xd9\xfc\xea\xfb\x88\xdb\x39\x61\xd3\xbb\xd6\x14\x5e\x79\x3a\x5b\x82\x36\xc0\x67\x20\xb7\xe7\x5f\x22\x19\xff\x78\xb4\xfc\xe8\x86\x87\xaf\x63\x74\xa9\x27\xd3\xdf\xdf\xcc\x21\x91\x75\x73\x09\x72\x01\xef\xe7\xb3\x2b\xb8\x27\xd2\xcb\x3f\x5b\xe8\xb0\xea\x5a\x7a\x15\x2d\x01\x82\xeb\xf9\xec\xe3\xe4\xdd\x64\xb9\xc0\x21\x87\x41\xa6\x6a\x31\xbb\x1a\xeb\xdf\xdf\xcc\x27\x8b\x8b\x09\xcc\xe5\x42\x5f\xcc\x70\xa0\x97\x97\xb3\x4f\x74\xd1\xf3\xcb\x9b\x05\x3c\xd3\xbc\xf5\x84\x61\x69\x1c\x5d\x19\x89\x5e\xcc\x70\x72\xc2\x75\xdc\x7b\x12\x17\xba\x1a\x7d\x8e\xe6\x46\x7d\x9e\xdd\x10\x13\xfe\x8b\x54\xdf\xa4\x8b\x54\x7f\x70\x8b\x7d\x7a\xe5\x1e\x6e\xec\xb6\xe7\x62\x3c\x5f\x10\xd1\x69\x07\x03\xa4\x07\xab\xd0\xdc\x99\x35\x76\x9b\x0c\x90\x92\xcc\xb9\x21\xb6\x42\x56\x68\xbb\x81\x96\x8f\xac\xd0\xaf\x7e\xd2\xe7\xe9\xfb\x74\x9e\xaa\xb3\xf4\xf4\xc5\xa9\x3e\x99\xad\x9a\x54\x9f\xfe\xfc\xf3\xeb\x61\xc2\xca\xad\x14\x37\xcb\x0b\x77\x78\x95\x06\x60\xf3\xc4\x47\x54\x97\x7a\x29\x82\xef\xe0\xb0\x04\xaa\xc0\xa0\x33\x1b\x8f\x4a\x9f\x9e\xa5\x67\xa7\x67\xea\x64\x61\x77\x3c\x2e\x68\x81\x8f\x14\x65\xdb\x1f\x87\xb1\x84\x1f\x9e\x9d\xfd\x98\xfe\x78\xf6\xe2\xec\xf9\x29\x6b\x47\x29\xff\xa3\x57\xfa\xe4\xf7\xfb\xc2\xf2\x13\x3b\x73\x8a\x53\x0e\x95\x12\x38\x0d\xc7\xc5\x5a\xdf\xd4\xd6\x99\x75\xe4\x49\x6a\x85\xbe\x00\x58\x28\x9c\xcb\x07\x00\x6f\x72\x8f\x02\x9a\xc5\x33\x8b\x91\xcc\xfc\xd5\x64\x71\x3e\xbe\xbc\x1c\x4d\xc7\xb3\x9b\x45\xbb\x88\x1a\x01\x93\x2d\x46\xf8\xb6\x11\x87\x8e\x54\xc5\x6a\xe5\x00\x99\xaf\x6f\x42\x67\xe2\x31\x25\x33\xb7\x04\xee\x6d\xce\xd9\xff\x7d\x41\x32\xcd\xd8\x15\x05\xaf\xc4\x7f\x37\x9c\xcf\x95\xdd\x94\xd5\x96\xa5\xd0\xe3\xfa\xb5\x47\x77\x4b\x32\x7d\x71\x55\x7e\xca\x90\x43\xf4\x97\x95\xd8\x0e\xe4\xe3\xf1\xea\x88\x2d\xc5\x05\x48\xcb\x52\xc6\x69\xd1\x50\xa3\xcf\xaf\xd9\xaa\x29\xab\xcc\x20\xec\x8c\xa5\x30\xb3\xca\x79\x95\x2b\x40\x9e\xd7\xfb\xdb\x6d\x26\x0a\xee\xcc\x58\xf0\xcf\xfb\x2a\xab\xd7\xd9\x4a\x7a\xe4\xe7\x28\xe0\x20\xae\x0b\x63\x1a\xed\xeb\xa6\x32\x39\xfd\x0b\xf1\x3b\xf0\xc1\x7b\x6b\x2a\xea\x11\xb0\x26\xc7\x9a\x94\xa2\x2a\xa7\xfb\x00\x25\x7f\xc2\x63\xc3\xe6\xe3\x9c\xa3\x00\x0b\x1a\x84\x1e\xfa\xa7\xc1\xcd\x6d\xda\xc5\x77\xab\x6f\x0a\x40\x09\x4c\x29\xd0\x3b\x2f\x0b\xe7\xd8\x10\x9d\xf2\x39\x65\x51\x6b\x0f\x40\x01\x21\x0d\x74\x09\x4c\xae\x16\x06\x81\xda\x1f\x20\x91\x96\xc9\xb4\x76\xc8\x04\x8f\x0a\x4c\x80\xc7\xb8\x0e\x74\x61\x28\xf9\x4d\x92\x5e\xf8\x4e\x8a\xbb\xbd\xb9\x23\x75\x26\x9f\xc6\xed\x13\xbb\x14\xd2\xdf\xeb\x0a\x63\x68\x54\xca\xa0\x72\x20\xaf\xaa\x76\x75\xf5\xf4\x2c\x85\x8a\xc6\x6c\xea\xcf\x1f\x77\x68\x40\x36\xdf\xed\x9f\x51\xad\x6f\x6d\xf3\xe8\xe6\xb1\x1f\xc9\xda\x0a\x5e\x99\xfa\x82\x38\x32\x6a\xd9\x7d\x87\xb4\x22\xd8\x41\x0d\x78\x22\xb3\x35\x10\x08\x55\x19\x32\x29\x1c\xeb\x01\x2b\xf7\x0d\x33\xbd\xed\x9b\x2c\xcf\xfe\xec\x23\xbd\x08\x0a\xd8\x01\x2c\x7d\x96\xb2\x8d\x41\x2d\xb0\x0b\x1c\x6b\xb5\x61\x40\x1a\x4e\xa0\x9d\xa8\xb5\x90\x1e\x84\xb2\xd3\x00\xa8\xb4\xff\xb2\xcf\x10\x24\x07\xa4\x14\xa9\x17\x28\xa5\x5c\x61\x86\x9d\x52\x20\x52\xec\xdb\x6e\xa2\xdc\x38\xbc\xc3\xac\x41\xc9\x8b\x83\x36\x6b\x52\xbe\x8a\x94\x44\x82\x18\xe3\x95\x3b\xb2\xaf\x2f\xc7\xcf\xa9\x80\x83\x4e\x1a\xc8\xeb\xb7\xdf\x0e\x20\x2d\x6d\x9d\xdd\x61\xfe\x45\xd0\x23\x74\x60\x48\xa6\xd6\x83\xab\x7d\xde\x64\xbb\xdc\x3e\xa7\x19\x5c\x0f\x52\xd5\xf3\x43\x4f\x23\x47\x6b\xb4\x7b\x5f\xac\xf6\x78\xb9\x30\x7c\x63\x56\x3d\x39\x00\x7c\x81\x02\xbe\xc9\x9f\x9a\x5e\x5f\x72\xfe\x18\xa0\x90\x05\x20\x00\x3c\x17\x36\x70\xa1\x03\x8b\x7a\x08\xed\x8f\x82\xf1\xa8\xac\xdb\x85\x20\x09\xd8\xff\xf8\x1f\xc1\x9f\xd1\x23\xfd\xfc\xa9\x5a\xb4\x52\xff\xe3\x7f\x2c\x5b\x6c\x8e\xb0\xfc\xe0\xe2\xa0\xc7\x2c\x59\x63\x9e\xac\x6b\x4b\x0e\x61\x48\x4b\x06\x26\xd0\xe1\x2f\x91\x50\x29\x32\x82\xf1\x5d\xa8\x80\x16\x61\x53\x95\x07\x82\xf9\xc2\x38\xa3\x4e\xb0\xc3\xa9\xa5\xe0\xe0\x77\x4b\xa3\xef\x9b\x66\xf7\xf6\x87\x1f\x0a\x82\x7b\xac\xca\x6d\x6a\xf6\x81\xfc\x7d\x3a\xbb\xbe\xfc\x41\x29\xaf\x6f\x27\xc5\x2f\x02\xd0\x44\x1c\x82\xf2\x03\xb8\x59\xb8\x2e\x8d\xfc\x2d\xea\x69\xb9\x31\xea\xc1\x26\x23\x4a\xad\xf3\x79\xe6\x8c\x28\x6b\x5a\x08\x01\x0b\x2c\x1f\xb0\x88\xb1\xb7\x9b\x78\xfe\x05\x6e\xba\x96\x6c\x51\xdd\x1d\x39\x1d\x0e\x31\x3c\x20\xab\xf5\x3f\x7d\xd7\x1f\xfa\x76\x4f\x5a\xb9\x8f\x98\xe8\x89\xcb\xa6\xfa\x9a\xb6\x8b\x12\xbc\x39\xfd\x9f\xa5\x96\x27\x29\x2d\x41\xbf\x38\x3a\xca\x51\x9e\xeb\x39\xce\xc8\xdc\xd6\xb6\x7a\x80\xc6\x37\x61\x01\x4f\xea\xe1\xdb\xef\x7f\xe6\x51\xd8\x99\xce\x5c\x37\x47\x37\x06\x31\x3d\xec\xeb\x68\xd1\x48\xd9\x17\x85\x23\xf7\x88\x15\xd8\x0e\x7f\xfc\xa7\x7f\xfa\xa7\x3f\x69\xbf\x29\x92\x80\x47\x07\x7a\xe5\xe6\xde\x6a\x51\xf3\x2c\x37\xfa\x8f\x38\xb4\x3f\x29\x89\x20\x15\x18\xa4\x88\x90\x1f\xf8\x18\x20\x1d\xc8\xc2\xc5\x8f\x59\x7d\x4f\x9a\xf2\xe5\x23\x25\x81\xd5\xa1\x03\x6d\xe1\xa7\x3a\x4e\x56\x61\x71\x24\x7f\x8a\x4e\xa5\xa2\x84\x9c\x27\x5e\x1c\x12\x8b\x35\x63\xb8\x8e\xdf\x23\x5c\x7e\x3a\x5b\x5c\x42\xdf\x0a\xf4\x23\xe1\xb0\xd6\x76\x85\xce\xe8\xed\x81\x28\x67\x29\xa3\x23\xa6\x05\xc5\xb8\x30\x79\x02\xa5\x4b\x00\xad\x04\xe4\x28\xe5\xd9\x81\x45\x2d\x16\xeb\xad\x23\x96\x56\x7e\xaa\x3f\x75\xf4\x9e\x09\x7c\x44\x54\x61\xa0\x6b\xdb\xba\x7d\x12\x81\x26\xdd\x6a\xf8\x9e\xa7\x46\x53\xa0\xf8\xe1\xf9\x3c\x88\x07\x31\x50\xea\x8f\xd3\xd9\x72\xfc\x96\x44\x78\xbf\x36\xfe\x52\x01\xb3\x23\x74\x5b\xeb\xdc\xad\x7f\x96\x40\x6e\xa2\xef\x30\x5c\xb2\x17\x61\x0f\x6c\xa5\xbd\x1b\x1a\x6d\x2d\xa9\x83\x10\x7b\xa3\x3a\x32\x92\xca\x84\x8c\xb2\xbf\x39\x28\x39\xf1\x3d\x63\x5b\x21\x5b\x99\x7d\xb9\x22\xa6\x0b\xf8\xd3\xdf\x34\x20\xfe\x2a\x7f\xd2\x1f\x6e\x8a\x6c\x55\xae\xed\xf3\xe5\xec\xe6\xaf\x24\x03\xf1\xb4\xfe\xc3\xe9\xab\x17\x2f\x5f\xb6\xf4\x1f\x5e\xbe\x79\x73\xfa\x37\xfd\x87\xff\x8c\x3f\xf4\xf6\x49\x66\xaf\xdc\xe8\x1b\xe7\xff\xbd\x27\x2b\x44\xa0\x1f\xbd\xab\xb2\x07\xb3\x3a\xe8\x5d\x99\x67\xab\x83\xf0\x3c\xcc\xca\x85\xef\x3e\xfa\xaa\xb3\xc6\xa2\xd8\x0e\x45\x9c\x00\xa9\xbf\xa6\x6f\x5f\xc3\xb7\x91\x54\xd6\xf3\xf5\xe9\x7d\x6d\xee\xba\x5f\xfa\xb7\xff\x09\xb9\x1a\xe7\x27\xec\xb7\x7a\x4a\xea\x6e\x6a\xe9\xbf\x76\xe3\xbe\xc6\x97\x84\x08\x62\x94\xf2\x97\x83\xc3\x20\x48\xe8\x85\x17\xf1\x6f\xff\xaa\x4f\x7f\xfe\xf9\xf4\xf9\xd9\x8b\xd3\x57\xfc\x9d\x44\x4f\x8a\x15\x42\x16\x7c\xbb\x97\x77\x1e\xce\x52\x7d\x4e\x1a\xd4\x9c\x8a\x42\x77\x8b\xec\x25\xc1\x7e\x1e\xed\xad\x9b\x01\xc1\x4f\x92\xdb\x3b\x0b\x56\x0f\x0e\x34\x5f\xe8\x19\xb4\xa9\x0e\x3c\x88\x2c\x1d\x40\x18\xbd\xb3\x55\x8d\xbf\xe1\xf6\x1e\x56\x2a\x5e\x27\x9e\x9a\x6a\x63\x89\x41\x14\x01\xc9\x88\xf2\xef\x19\x9e\xa7\x3f\x41\x42\x12\x84\x19\xbb\x88\x11\x60\xda\x9b\xb2\xda\xc2\xc0\xca\xd6\xfc\x2f\x1a\x53\xac\x4d\xb5\x8e\xc8\x64\x97\x5e\x87\xff\x3c\x88\x60\xfb\x3c\xd5\xcb\xf4\xbb\x47\xaf\x79\xf4\x0f\x99\x7d\x4c\xda\xb4\x8c\x6d\xa6\x57\xe8\x90\xe8\x79\xb4\xba\xcc\x41\xe9\x1f\x09\xdb\xb8\xc7\xdf\xad\x58\x26\x2d\x06\x10\x5a\x10\xfd\x80\xc2\x15\xb6\xef\xd4\xdc\x35\xca\xfe\x04\xaf\x9e\xde\x07\x77\x1f\x80\x87\x57\xc7\x1e\xfe\x55\xaa\xdf\xef\x2b\xe4\x68\x23\x67\x3d\xf4\x39\x0a\x17\x9d\xa9\xae\xe0\x57\x3b\x5c\x56\x22\x57\xb5\xaf\x3d\x6a\x4b\xc0\xee\x6b\x0b\x07\xed\xda\x34\x86\x1e\x1d\x18\xbb\x49\x33\x42\x0f\xfc\xca\xbf\x37\x95\x59\x35\xb6\xd2\x17\xa6\x31\xb7\xa6\xb6\x03\x45\x84\xdc\xfe\x00\xe6\x83\xfa\x34\x55\xea\x75\xab\xd5\x20\x24\x8b\xa2\xa9\x00\x14\xfc\xe6\x1b\x4f\xa7\x3a\x4f\x57\x6e\xdc\xe3\xd0\x8e\xbf\xb7\xfa\xb6\x2c\xbf\x68\xcb\x33\x77\xc2\x77\x79\x9d\xbe\x20\x29\xc9\x2a\xcf\x6c\x35\x4c\x14\xea\x61\x42\x6b\x14\x8c\x9a\xd8\xaa\x6e\xcd\xea\x8b\xef\x51\xca\x9a\xdc\x4d\xd1\x1d\xf1\xc3\x95\x05\xc8\x43\xc2\x05\x57\xf7\xa0\xac\xb6\x32\x55\x75\x50\x3e\x72\x92\x43\xc3\x9d\x8e\xbe\x20\x51\xb4\x87\xce\x56\xba\x54\xab\x69\x94\x11\x6b\x95\x8d\x67\x00\x56\x1f\x3f\xca\x1b\x7a\x14\x68\x2e\x45\xa8\xe4\x8a\x72\x01\x42\xe9\x53\xb1\x61\x95\x66\x37\x55\xea\x0d\x34\x22\x74\xa9\x10\xdd\xda\x18\x6c\xb3\xaa\x2a\xab\x41\xf4\x7e\xd8\xe2\x30\x01\xc1\xc6\xc2\xd7\xb0\x3b\x7e\x8d\xec\x89\xc2\x44\xdb\x70\x15\xf7\x35\xc0\xb3\x76\x68\x57\x82\xc2\x59\xc3\x0d\x4a\x11\x9e\x43\x0a\x77\xc0\x2c\x22\x87\x8a\xc7\x4b\x79\x36\x35\xee\x32\x7a\xb0\xd5\xad\x69\xb2\x2d\x0a\x3b\xcc\xe9\x2d\xd8\x35\x47\x69\x97\x60\x24\xd1\x74\x34\x76\x75\x5f\x80\xae\x1e\x2c\xf5\x52\x14\x01\x7c\x93\x02\xcd\xcf\x5a\x98\x2c\x77\x35\xc8\xec\xc2\x64\x8e\xb6\xb6\xca\x56\x26\x81\xa4\x9a\xb9\xb3\xc5\x0a\x44\x6a\x99\x88\xb4\x6e\x2a\x7c\xaf\x39\xd0\xa8\x7b\x8d\xce\x76\xbe\x55\x54\x2d\xba\xc3\x7a\xaa\xa4\xa1\x48\x98\xc6\xae\x43\xd6\x38\x3f\x68\x10\xac\x77\xf6\x17\x20\x1d\x2c\xf6\x29\x4a\x2a\xef\x47\x73\x0d\xc5\x14\x40\x24\x5c\xbc\x1f\xcd\x17\xea\xec\xf5\x59\x7a\x76\xf6\xe3\xf3\x1f\xdd\x59\x15\x57\x1c\x64\xe7\x09\xed\xb1\x68\x98\x64\x55\x99\xde\x21\x2b\x0b\x40\xf1\x10\x4d\xc9\xbe\xb2\x1c\xf1\x88\x92\x85\x3b\xc4\x83\xd1\x8b\x36\xb3\x91\xa5\x89\xac\x50\x30\x3e\x7d\xf6\xc2\x8f\xef\xb5\x5e\xfa\xfb\x5f\xc0\xfd\x05\x5b\xa8\xdb\x14\x93\xc6\x6e\x6b\x7d\x32\x2d\x1f\xf0\x19\x28\xc7\x9a\xd5\x4a\x00\x66\xdd\x73\x2c\x3c\x60\x25\x2b\x28\x9b\x1f\x9a\x93\xdd\x2c\x9d\x9e\x3d\x3f\x3b\x3d\xf3\xb3\xa4\x61\x04\x67\x2f\xce\x12\x15\xcd\x4a\x77\x06\xf4\xf7\x4f\x00\x2f\xaf\x68\x12\xba\xad\xc6\x61\xe8\xe0\x6b\x9c\xa7\xac\x9a\x4f\x6b\x4e\x48\xea\xa3\x04\x09\x66\xf6\x51\x63\xd8\x0b\x3f\xb8\x95\xc9\x9b\x59\x10\x15\x8a\x37\xea\x5e\xef\x61\x57\xde\x55\x66\x77\xef\x7e\xa0\xac\xdb\xc8\x75\xa0\xf6\xcc\x0a\xb3\x5a\xed\x2b\x03\x8b\x3d\x75\x27\x01\x22\x71\x2a\x46\x08\x11\xbe\xc8\xac\x03\x08\x5d\x9e\x9a\x0a\x4f\xb2\x5f\xd0\x44\x79\x16\x35\x6e\x3e\x0b\x6a\x87\xb8\x58\x0b\xfb\x18\x4c\x39\x1f\x58\xe1\xa1\x54\xfc\x50\xc1\x37\x73\x4f\x87\x85\x9e\xad\x8b\xa0\xad\x3f\xd2\xdd\xa7\xf9\xa6\x14\x26\xd2\x49\x7d\x52\x0f\xf9\x72\xc4\x34\x74\x52\x0f\x75\x4b\x81\xe5\xe9\x39\xe5\x06\xed\x6c\x8b\xd4\xfc\x5e\x00\x11\x42\x71\xd1\xfa\x56\xad\xee\x41\x1c\xa7\x2c\xf4\xd6\xdc\x15\xb6\xc9\x56\x30\xc5\x3b\x54\xfb\x44\xaa\x44\x08\xab\xd9\x71\x54\xe0\x38\x42\x8e\xae\xcc\x2d\xc3\xff\xa9\x56\x54\xd9\xad\x5d\x1f\x3c\xc4\x9b\x31\x72\x38\xa5\xf6\x2b\x89\x40\x33\x68\xc9\x32\x90\x09\x6f\x43\x30\xb8\x22\x2b\x6c\x73\xd0\x27\x3f\xbf\x18\x7a\x3c\x9c\xe7\xfd\xe1\x11\xa3\xf7\x45\xdd\x0b\x23\xd1\x49\x33\x99\xea\x05\xb6\x56\xe8\xf3\xf4\x2c\xc1\x9a\xf2\xf5\xcd\xbb\xcb\xc9\x39\x96\x91\x49\x14\x7f\x31\x7b\xbf\xfc\x34\x9a\x8f\xf5\x64\xa1\xfc\x97\x39\xab\xf9\x54\x3a\xb3\xd5\x65\x93\x84\x0e\x9b\xd9\x5c\x2d\x96\xa3\xe5\xcd\x12\x40\x20\x02\xd9\xd0\x15\xad\x07\x10\x87\xe8\xb9\x71\x37\x68\x69\x02\x27\x8a\x14\x81\x3b\x3d\x35\xac\x08\x9c\xb4\x9a\x6a\xc6\x57\xe3\xe9\x32\xd5\x37\xd3\x09\xb4\x7c\x8c\xa6\x17\x7a\xb2\xe4\xf6\x90\xd9\x7c\xa1\xb0\x59\x45\x4f\x67\x7d\x65\xa2\xf1\x7c\x3e\x9b\x03\xf6\x61\x76\x35\x59\x2c\xa0\xc8\x3f\x99\x1e\x9b\x3f\xe5\xe7\x8f\xd1\x2b\xfa\x62\x76\x7e\xe3\x46\xb0\xd0\x9f\x3e\x4e\xce\x3f\x6a\xf7\xcb\xf9\xf8\xfd\x78\x3e\x9e\x9e\xa3\xc6\x3e\x00\x03\xa6\x7f\x40\xd9\xfe\xf6\x85\x15\xa8\xef\x8f\xfd\xf0\x3f\x8d\xdf\x2d\x26\xcb\x71\xaa\xd4\x85\xb3\x31\x2c\xf4\x7e\x81\x85\x26\xc0\x2b\x15\x25\xc1\x95\xb0\x16\xc3\x5b\xce\x9d\x7a\x0d\x9f\x9b\xce\x66\xdc\x62\x2b\x02\x55\xad\x00\x22\xe8\x3c\x1a\x93\x83\x17\x04\x92\x64\xf8\x77\x2c\x53\x91\x90\x1e\x35\x56\x66\x70\xbc\x60\x75\x8b\x40\x54\x5f\xb2\x62\x9d\x30\x43\x01\xff\xee\xf1\xde\x34\x75\x89\xcd\x0f\xdc\xc0\x02\xea\x2c\x4d\x70\x5f\x9c\xb5\x5e\x63\x9f\x2c\x9b\x10\xe8\xdb\x86\xc2\x90\xf2\x58\xbe\x2d\x84\x88\xde\x41\x4b\x7a\x35\x86\xa8\x88\x0e\xdc\x03\xce\x8b\xf3\xb9\xaf\xd0\xfc\xa0\xf2\xb2\x66\xaf\x34\xf1\x47\xf9\xae\x2a\x37\x59\x83\xba\x76\x7d\xfa\xf8\xf0\xe1\x98\xb6\xbf\x52\xeb\x16\x69\x4c\x87\x67\x8c\x26\x3d\x84\x5c\xc4\xc6\x3f\x4e\xb5\x8f\x62\x6b\xfd\xbf\xe9\xcb\xf2\xae\xf4\x07\x43\xf0\xec\x3e\x95\xd5\x5a\x5f\xb9\x48\x97\x0b\x91\xfc\x1b\xf7\x05\xb0\xea\x4d\xb8\x8c\xf3\x20\x65\x1c\xab\x06\xf2\x5a\x21\x92\x26\xb0\x45\xf4\xd9\x41\xb8\x18\x90\x4a\xf5\x5c\x4d\x50\x7d\xcb\x47\x84\x8e\x76\xe7\xe8\x66\x50\xc2\x0e\x9e\xba\x88\x85\x39\x97\x0b\x25\xb3\x4a\x99\x95\x67\x80\xe3\x7e\x89\xe8\x56\xcf\x6a\x61\x3c\x41\x42\xe0\x31\x5b\xdb\x16\x27\x08\x27\x16\xfc\x1c\x25\x9d\x09\x4a\x3a\xd3\x26\x1e\x10\x4f\x80\xfe\x19\xf2\xb9\x06\xdd\x9f\x6b\xd0\x27\x83\xf0\x0b\xfc\xd1\x60\xa8\x90\x47\x45\x1c\x90\x54\x22\xbd\x3d\x20\x80\x1e\xf8\xb2\xbd\x2e\x35\x57\x6d\xcd\x6d\xb6\xf6\x3e\x48\x48\x27\xf3\xba\x6f\xdf\x47\xb2\xbe\xdc\xf2\x01\xbd\xee\x76\x8f\x6b\xaf\x93\x98\x5b\xb7\x4e\x57\x95\xe5\x55\x1a\xbf\x56\x88\xd7\xf3\x3c\x52\x7e\x10\x8b\xca\x8f\xdc\x3f\x8e\xa9\x7c\x41\x02\x39\x31\x71\xa4\x59\xa5\x28\x42\x00\x1a\x79\xe0\xb2\xc1\xc5\xfe\x3e\xd5\x57\x59\xbd\xb2\x79\x6e\x0a\x5b\xee\x69\x9d\xff\x5e\x00\x28\x60\x56\x7e\xb5\xc5\xde\x92\x63\x04\x49\x17\xd0\x26\x72\xf7\x30\x9e\xda\x5d\xb0\xb1\x51\x17\xac\x87\x72\x9c\x9b\x3c\xdb\x94\x55\x91\x99\xe4\x68\x30\x20\x1d\x90\x2f\xc0\x49\x13\x10\x33\xe8\xb0\xf8\xaa\x6f\x58\xd2\x54\x59\xf1\x2c\x8e\x1b\x6a\xc3\xce\x0a\xf2\xb9\x78\x48\x5e\xd7\x99\xc2\x2d\x8c\x26\xe8\x51\x60\xf8\xad\xcf\x27\x5e\xa1\xbc\xcd\xe0\xdb\xe2\xe2\x51\xee\x2b\xb9\xce\xcd\x63\x07\x13\x82\xa0\xa3\x3d\xef\x4d\xca\xbf\x79\xa4\x49\x17\x8c\xa0\x5a\xc6\xb1\xfb\x55\xc9\x94\x4e\xb9\x15\x5a\x9e\x6e\x00\x9e\x96\xc2\x4d\xae\x8a\x26\xde\x5b\xe4\xca\xde\x99\x6a\xcd\xad\x68\xbb\xca\x9d\x27\xbb\xdc\x93\x3b\x22\x39\x1e\x61\x36\xe8\xb2\xa0\x73\x26\x88\x77\x24\xbe\x06\xb7\x29\xa0\x68\x61\xdb\xd4\x81\x6c\x67\x9d\xd5\x3b\xd0\x92\xc1\x5b\x62\x16\x27\xab\x15\x3c\x89\x00\x1f\x11\xd8\x99\x1e\x87\xf6\xc6\x0a\x61\x38\xf0\x3e\x88\x4e\xd4\x14\x8d\xd1\xe7\xb9\xa9\x8c\x3e\x2f\xf7\x45\x73\x48\x54\x78\xbe\xee\x38\x6a\x93\xad\xf9\x32\x80\xc7\xc1\xac\x97\xc9\xa3\xf1\xe3\xdb\x70\xdf\x70\xe1\xc4\xa3\xe1\x4e\x26\x2f\x65\xe9\xa5\x49\xe1\xa4\xc3\x47\xf2\x8d\x7c\x98\x9e\x28\xab\xfd\x16\x4d\x56\x14\xaa\xdf\x1e\xfc\x92\xe6\xff\xe3\x53\xc3\x68\x1a\xa9\x97\xe9\x29\x0b\xa2\x3e\x4f\xe1\x13\xbb\x8b\xed\x4a\x04\xec\x65\x4d\x94\xcf\x15\x4f\xce\xa5\x7a\x53\xa3\xa6\x7b\xd0\x61\x6c\x47\xcf\xbc\x1a\x68\x60\xcf\x6a\x42\x21\x3f\x56\x59\xd3\xd8\x02\xbd\x09\x08\x99\x5e\xa6\x7a\x69\xbe\xda\xba\xe7\x45\x63\xcf\x0b\x0c\xd1\x7d\x82\xa1\x34\x64\x0e\xe2\xcc\x33\x1d\x37\x8a\x36\x68\xcf\x61\x85\x26\xcc\xf3\x75\x22\xce\xc9\x79\x0c\xb7\xec\xef\x87\xc1\x16\xb6\x51\xce\x9c\x43\xb0\xf0\x2a\xd5\x0b\xe7\xc5\x30\x5c\x45\x1f\x45\xc9\xb5\xd0\x5a\xab\xdc\x54\xb0\xb6\x00\xb5\xad\x81\xfc\x37\x02\xcc\x61\x74\xb9\xa5\xfc\x5f\x5c\xe5\x6d\xfa\x50\x6f\xbe\x75\x4d\x61\xcf\x03\x25\xf0\x8a\x26\xab\xac\x6c\x3a\x6d\x61\xc7\x02\x0c\x07\xb3\x85\x16\xbf\x10\x90\x81\x84\x82\x52\xa2\x0b\xe6\x6f\xa2\xeb\xff\x25\xfe\xa4\x3f\x8c\x6f\xae\x2f\x9f\x9f\xa6\x67\x7f\x3d\x0d\xf8\xa7\xeb\x7f\x2f\x5f\xbe\x78\xf5\xaa\xad\xff\xfe\xe6\xc7\x57\x7f\xab\xff\xfd\x67\xfc\x19\xef\x9d\x2b\x67\xc0\xf8\x95\x85\xbe\x86\x0c\x0a\xe2\x0e\x56\x56\x3f\xa4\xfa\x34\x3d\x53\xca\xad\x11\xfd\x6f\xff\x0a\xc6\xa3\xf5\x8d\xb3\x17\x2f\x7e\x4c\xf4\xd9\x8b\xd3\x37\x84\xd4\x7d\xfa\x8a\x80\x79\x79\xe6\xae\xf7\x6c\x28\x79\x9f\xdc\x8f\x81\x6c\xed\x24\xa4\x44\xd5\xad\xcd\xcb\xc7\x61\x48\xfc\x7a\x06\x85\x27\x59\x2a\x57\x24\xb6\x21\xce\x01\x77\xe5\x44\x89\x3e\x37\x17\x77\x62\x4d\xaa\xee\x61\xe7\x59\x59\xba\x1b\x53\x6b\x9d\xc4\xa0\x65\x60\xbd\xdb\x63\x86\x9e\xb3\xfb\x20\x82\x80\x07\xae\xef\x01\xe7\x7a\xe3\x7d\x99\xaf\x03\x4e\xca\x0d\x66\x48\x60\x2a\x78\xe4\xdf\xf0\x64\x2e\x90\x2e\x04\xa4\xab\xac\xdc\x84\x29\xce\x21\xd3\x84\xdd\x9b\x5a\x03\x0a\x66\x1d\xc7\xbf\x9e\x2f\x73\x0b\xf9\xa5\x06\x4b\x67\xfc\xcb\x68\xcc\xcc\xa9\xc5\x70\x60\x37\xd0\xb7\xe0\xd2\xc3\x7f\x18\x31\x29\xc6\xeb\xde\x29\x7d\x80\xf8\xa6\x09\xde\xc6\x08\x6d\xf6\x67\x48\xd6\x3b\xc3\xd4\x62\x56\xdc\x15\x74\x90\xc7\xa4\xfc\x7c\x4d\x82\x87\xa6\xfa\xc2\xcb\x8e\xa2\x0c\xc0\xa4\x88\xa6\x26\x69\x3d\x2b\xb5\xb5\xb3\x2f\x14\x7e\xe1\xee\x0f\xc9\x00\x2a\x0d\xff\x3f\xff\xc7\xff\xa9\x9f\x2d\x79\x4a\x57\xf6\xd9\xdb\x78\x31\x29\xe5\x3f\xe1\x61\x2b\x6e\x3a\x9e\x21\x57\x02\x40\x6f\x65\x9d\x22\xc2\x06\x56\x2c\x4c\xbf\x22\x9c\x9b\x8a\x5e\x5e\x77\xe5\x49\x0d\x5e\x13\xab\x52\x63\xef\x73\x0d\x7d\xd8\x81\xc1\x52\x31\xc8\x15\xde\x9f\xa9\x19\x88\xc6\xe3\x6e\x53\x4b\x89\x61\xd7\xd1\xb8\x49\x64\x9b\xc8\xab\x05\x32\x4f\x20\x08\x6d\xa2\xd0\x5d\x82\x16\xda\xa6\x3d\x25\x9e\x7a\x23\x28\x2a\x53\x6b\x81\xe0\x32\x58\x59\xcf\x0a\x4a\x0b\x57\xee\x2d\x50\x6d\x8d\x52\x2d\x7a\x6d\x77\xb6\x58\xa3\xe4\x54\xdf\x4d\x19\xc0\xa5\x24\xc7\xd5\x2a\x77\x5e\xea\xe6\xc0\x8a\xf7\x40\x4c\xd9\x9a\x8b\x5f\x70\xe6\xe9\xce\xe0\xb3\x61\x27\x1c\xf2\x5c\x85\x0d\x0c\xb4\x2e\x12\x61\xc7\x31\x44\xd1\x54\x07\xbd\x45\x1c\x3d\x86\x11\xa3\xaa\xc9\x56\xb9\xd5\xa7\xaf\xd3\xce\x02\x13\xab\xa6\x33\x6d\x59\x53\xf7\xb1\x80\xf9\xef\x8a\x85\x40\x97\xb8\xdf\x6f\x4d\xf1\xbc\xb2\x66\x2d\x18\x87\x83\x89\x09\x66\x13\x62\xda\xb2\x6e\x14\x50\xbb\x17\x00\x4f\x73\xfb\x7a\x67\xcb\x1d\xc9\xcb\x34\xfb\x35\x36\x51\x60\xa4\x20\x6f\x2c\xb8\x52\xe9\xe6\x5e\x8f\x8d\xbb\x13\xeb\xc0\x0e\x83\x69\x74\x54\xb5\x46\xf2\x3b\xa2\x43\xcd\x6a\xd8\x78\x0d\xb5\x8e\x80\x4a\xc0\xae\xb2\x0d\x9b\x4e\x5f\x44\x83\x17\x45\x69\x7e\x39\x0e\xde\x33\xf4\xf4\x40\xe9\x80\x65\x11\x54\x45\x26\xd0\x01\xac\x62\xa9\x34\x1a\x6f\x41\x64\xf5\x80\xf9\x69\xc1\x63\xc3\x4e\x8f\xa1\xa2\xf4\xc0\xc7\xee\xf7\x78\x5f\x32\x27\x5b\xad\xe3\x6b\x2b\x71\xed\x24\x52\x2b\x16\x7a\x36\xfe\xf4\x93\x08\x85\xce\x4a\xed\x4e\x84\xb5\xcf\xdc\x25\x9f\x7d\x2e\xf7\xdf\x33\x42\xd4\xb4\x80\x53\xd1\xdc\x79\x80\x41\x6b\x1e\x22\x70\x67\x6b\x52\x24\x49\x36\xde\xf9\xdc\xcf\xaa\xfb\x11\x8e\xc1\x20\xd7\x20\x49\x46\x26\xfa\x0e\x24\xbb\x13\x9d\x5b\x50\x01\x4c\x54\x85\x3a\x3d\xa2\xff\x1a\xfe\x15\xde\x10\xfc\x13\x82\xe2\x6d\xd6\x34\xac\x41\x19\xf1\xb2\x01\xf0\xc8\x8b\x31\x29\xaa\xd6\x03\x5d\xcc\xc6\xfd\x35\x61\x55\x0f\xf9\x94\x25\x61\x3e\xd7\x31\x6c\xc9\x6d\x3b\x77\x46\x41\x5a\x5b\x6d\xf6\xc5\x0a\x01\x24\x58\x19\xa6\x84\x10\x8a\x45\x9a\x9c\xd3\xdd\x78\x8e\x1d\x99\xef\xa0\x0a\xbd\x2a\x77\xde\x03\xe9\xb2\x04\x88\x39\x46\x5f\xc0\x1f\x0a\x1d\x01\x68\x56\x53\xfd\xa6\x98\xaa\x10\x2d\x85\xa3\x21\x27\x7b\xdb\x94\x7a\x5d\xc6\xc7\x60\xe2\x8f\xf6\xf5\xbe\xf2\x0b\x2f\x98\xbc\x07\x5b\x37\xb6\x83\xd7\x54\xc1\x0f\x20\xc3\xc6\x42\xde\xe8\xc9\x60\x52\x60\x95\x55\xab\xfd\xb6\x6e\x0c\x67\x3d\x37\xc4\x12\x8b\x58\x2f\xf9\x75\x0f\xf9\x11\x7e\x9a\xf8\xb5\xe0\x5a\x84\xdf\x51\xca\xf9\x8b\xed\xd8\x4a\xdd\x3a\x97\xe8\x52\xee\x22\x62\xfb\xf3\x66\xc3\x4a\x61\xd2\xd2\x51\x0a\xf9\x12\x77\x87\x70\x0e\x63\xcd\x78\x97\x9b\x83\x92\xeb\x89\x56\x19\x1d\x71\xf1\xa5\x61\xa0\x24\x25\x4b\x3f\x02\xea\xac\x70\x4c\x2b\x3c\xa6\x93\xfe\x07\x6f\xd1\x11\xf7\xdf\x32\xfa\x86\xdb\x62\x84\x2f\x42\x41\x8f\xef\xf9\x92\xd0\xb8\x8d\x53\xec\xfd\xdf\x05\xaf\x55\xb4\x2a\x12\xb2\x88\x99\xb4\xa8\x17\xe2\x80\x55\x52\xcf\xca\x5f\xf3\x1a\xd8\x9a\xa6\x0e\x52\xee\x45\xf9\x48\x20\x26\xb7\x83\x4c\x03\x25\xec\x07\x5b\x20\xcb\x55\xad\x37\xa6\xe2\xf9\x12\x67\xaf\x3b\x8a\xb9\x09\xa7\x2e\xa1\x37\x48\x1c\xc6\x44\x96\x56\xb9\x03\xaf\x0a\xc2\x7d\x90\x6f\x4c\x62\xbf\x19\x72\x71\xe8\x87\xf2\x7b\x0f\x94\x60\xee\xa7\xe2\x0a\xad\xa6\x45\x40\xb7\x07\xc2\x37\xe9\x76\xc0\xca\x09\x84\x14\x0d\xd3\x1c\x84\xa6\x1f\xbb\x2a\x8b\x72\x9b\xad\xa4\x5c\x21\xe1\xd7\xf3\xcc\xed\xb9\xb4\x65\x0e\xc8\x0e\xd0\x10\xd8\xfa\x3f\xa9\xa9\x0c\xfb\x8c\x51\x59\x9c\x8a\x25\xd5\x72\xe8\xdf\x8c\xbc\x3a\x52\x46\x6e\x9e\xea\xca\xa4\x3e\x81\x1e\x53\x26\xf6\x5b\x8f\x3b\xeb\xa5\x3f\xa3\xd3\xa2\x87\xdf\xb8\xf5\xd0\xc0\xa4\x8b\x41\x51\xb8\x3c\xb5\xcd\x64\x05\x98\xed\xb6\xf2\x21\xca\xf2\x75\x5c\x63\x2a\xf5\xf7\xc4\x5a\xd1\x67\x49\x61\x21\x5a\x22\xdc\xb4\xa8\xb3\x42\xb1\x1a\xa4\x36\x7a\x6b\x56\xf7\x59\x61\x83\xeb\x75\x4c\x34\x53\x9e\x3f\x26\x2f\x49\x55\x54\x41\x0f\xa1\xfc\x0e\x7c\xc0\x97\x1f\xfc\xed\x5b\x5e\x8c\xaf\xa4\x21\x2a\x86\x7b\x1a\x8e\x04\x70\x1c\xeb\x05\xa2\xe4\x52\x9a\x51\x67\x78\xcb\x3a\x03\xaa\x29\xdc\x30\x50\x51\x11\x83\x77\x8e\xb1\xa9\xb3\x1c\xfd\x42\xb7\xca\xdc\x5f\xe1\xe0\xf4\xb5\x0a\x53\x6b\x78\x2c\xda\xa6\x7e\xe4\xcc\xfe\x0b\x8b\x4f\x98\xb2\xd8\x17\xf3\xe3\xf1\x04\xe7\x97\xa2\x7b\xa9\x2c\x44\x34\xea\x5b\x0f\xb3\xa2\x13\xa7\xfb\x1e\x44\x77\x2f\xbb\xab\xb2\x07\x1b\xef\x14\x66\x25\xb3\x85\xdd\x64\x4d\xad\x30\x7f\x5c\x1c\x28\x15\x4c\x51\x86\x10\x7a\xed\x74\xfc\xd2\x92\x8f\xcf\x72\xac\x73\x29\x61\x30\x13\xbf\xc7\xbf\xde\x9b\x7d\x1d\x56\xba\x30\x99\xc8\x6a\x87\x1e\x84\x34\x6b\xe1\xc9\x15\x18\xdb\xa6\xf4\x4c\xda\xb3\x58\x32\x43\x3e\x1b\xee\x1a\xd4\x70\x8a\x47\x17\x82\x12\xb4\x2d\x31\xb0\x0b\xa8\xdb\x63\x74\x57\xb1\x56\x52\x9b\x03\xb5\x5c\xfd\xf6\xe6\x1b\xba\x40\x0e\x74\xb3\xc5\x47\xb9\x2a\x28\xea\xec\x6a\xd4\x84\xea\x38\x8c\x08\x5b\x57\xfc\x3b\xc1\x7c\xf6\x17\x6b\x77\xee\xfd\x39\xb7\x91\xd4\xd8\xf0\x85\x27\x41\xda\x5d\x89\x8a\x24\x77\xae\x30\x0b\x18\xff\x1b\xf6\x0e\x94\x2b\x23\x33\x49\xde\x07\xfd\x68\xed\x71\x58\x2a\x68\xc7\x64\x5c\x79\xf0\x23\x3b\x22\x98\x2b\xb4\xa1\xe8\xfe\xf0\x2b\x15\x7b\xcb\x42\x4a\xb7\xbb\xc3\xef\xed\x0f\xf5\xbd\x7d\x2a\x38\x49\x55\x77\x28\x24\x8f\x59\x1c\xda\x2e\x0f\x44\xb9\xa6\xaa\x0e\x41\x94\xd2\x0f\x90\xc4\x60\x42\x4d\x13\x07\xe0\x05\x46\x99\x44\xba\xad\x7e\x29\x43\x6f\x68\x9a\xdb\x1d\x72\xbb\x01\x06\xa3\x7d\x6d\xdf\xb2\x29\xf5\x23\x7c\xe2\x59\x62\x27\x5c\x45\x01\x2f\x7c\xb8\xed\xc1\x25\xb8\xb3\x63\x35\x9e\xaa\x75\x70\x3c\x66\x79\xae\x6e\xad\x5e\x97\x45\x2f\x07\x78\x64\x1c\x88\x41\x92\x9c\x8b\x5e\xc2\xec\x95\x55\xc4\xd6\xd6\x8d\xca\xa3\x36\xf7\xb8\xe3\x53\xf4\xc4\x65\x75\x2f\xd3\xf8\xca\x82\x83\x05\x9a\xac\x5f\xcd\xd6\x05\xda\x28\x5d\x11\xe2\x1c\xcc\x83\x52\x92\x15\x2e\xfa\x2c\x5e\x8b\xea\xc4\xf3\x2b\xb2\x69\x1d\x3a\x9f\xeb\x98\xe8\xb2\x50\x2c\xa6\x09\xa9\x02\xdd\x2a\xa8\x31\x4b\xd7\xae\xb3\x9c\xbc\x22\xb3\x14\x64\x7e\x2a\x30\x3c\x2f\xb7\x3b\xd3\x70\xd3\xf8\xb1\x35\x72\x11\xaf\x91\x73\xb9\x46\xc2\x18\x94\x5f\x17\x2d\xb7\x5a\xf8\xf5\xb7\x25\x21\x72\xf0\x44\x05\x7f\x17\x2d\x29\xa4\x78\x3c\x2e\x98\x69\xeb\x79\x7c\xb9\x95\x49\xc2\x6f\xae\x31\xf2\x6a\xdd\x12\x3b\xaa\x87\xd4\xbd\x74\x40\xb9\xd7\xa0\x0d\x49\x1f\xc4\x59\x49\x20\x5c\xa6\x6f\x28\x4e\x34\xa2\xc9\xf2\xae\x1d\x39\x8a\x35\xf9\x81\x5e\x6e\x7d\xb7\x73\xd1\xf3\xd7\xd6\x51\x2e\x7d\xac\x05\xb6\xe5\xc9\x69\x7f\x56\x47\x36\x3a\x3c\x47\x77\xe4\xd0\x05\x92\xbb\x77\x0d\xee\xc9\x7d\x56\xff\x00\x58\xad\x9e\xaf\xb7\xd3\xad\x65\xf7\x68\xea\x3e\xa7\x17\xe4\xb4\x2e\xa2\x4a\x55\x60\xea\xd4\xb1\x48\xf6\x5b\xfd\xe9\xde\x16\x51\x6a\x20\xb6\x2a\xee\x07\xb1\x59\xc1\x63\x37\x5a\x6f\x80\xae\x64\xdf\xf1\xfb\xbd\x35\x25\x5c\xac\x7e\xff\x28\xf3\x3e\xa7\x07\x70\x76\x1d\x24\xaf\xa4\x75\xd4\x3f\xb2\x36\xf8\x47\xfa\x7b\xfd\xa3\x4b\xc8\x30\x5c\x57\x65\x83\xe8\xb4\xb7\xfd\x09\x55\x72\x05\x20\x40\xaa\x6b\xf2\x65\x38\x44\x87\x83\x14\xb8\xe3\xeb\x44\xe0\x7c\x12\xa6\xa6\xd5\xf4\xcf\xb2\x0a\x38\xb0\x38\x4a\x08\xb4\xd6\x3e\xe7\xba\x01\x5b\xe1\x29\x19\x81\x88\x65\x5f\x37\xe5\xd6\x45\x0f\x84\x95\x21\xa4\x2e\xfb\xa8\x2c\x0b\xbc\x89\xf6\xb2\xe2\x54\x40\x70\x65\x8b\x26\xa2\xd4\x8d\x3d\x5b\xaf\xe2\x71\x7e\x6f\xf0\x6a\x23\xa8\xe8\x80\x8a\x16\x9c\xa3\x1e\x23\x2b\x62\xbe\x8a\x82\x29\x3e\x17\xc3\x55\xdb\x9d\xa9\x30\x2e\xa6\x2a\x0c\x6c\x6a\x19\x3a\x7e\x10\x42\xdd\x67\xdb\x1f\x08\xd5\xc8\xb6\x07\xd8\x59\xe8\xc7\x9e\xd3\x9a\x0e\x7e\x52\x92\x50\xbb\xf2\x91\x7e\x4b\x35\x28\x14\xf4\xf1\x4a\x9c\xc2\xc2\x42\x6f\x8e\xe4\x00\xfc\x8e\x27\x88\x13\xf0\x74\xef\xdb\x2a\x2b\xee\x6a\x25\x2b\x6d\x40\xd8\xfb\x97\x3f\x0a\x82\x05\x7e\xe3\xa3\x00\xd6\xe4\x33\xc1\xa4\x76\xd1\x47\x12\xb1\x36\xe4\x3b\x03\xcd\xdd\xa0\xea\x21\x99\x4c\x14\xde\x07\x33\x64\x22\xd7\x85\xa4\xbf\x3e\xc7\x8a\x85\x08\x19\xfe\x74\xad\xba\xea\x06\xad\x3f\xa6\x02\xba\xef\xd6\x17\xe1\xfa\x0f\x71\xe9\x8e\xea\x0b\x19\xa9\xe0\x02\x3d\xbb\x4f\xbd\xd3\x46\x07\xf5\x3a\x06\xbc\xc3\x7c\x17\xfb\xad\xad\xca\x7d\x2d\x79\x09\xea\x54\x4f\xbc\xe8\xa9\xd1\x9b\xac\x40\x9d\x92\x47\x3e\xed\x5c\x50\x0c\xc7\xe2\xa6\xac\x42\x97\x21\xa2\xc6\x81\xb6\xf4\xd9\xed\xfe\xae\x7e\xa6\xb3\xe2\x1e\x91\x54\x7c\x50\x34\x07\xcc\x44\x52\x5f\x0a\x75\x2b\xf0\x79\x85\x01\x02\x6e\xe2\xa4\x3f\x54\xee\xe4\xca\x89\xf5\xe2\x99\xa9\x75\x56\x3f\x53\xc0\x7a\x81\xd9\x7e\x42\xfe\x08\xf6\x7a\x01\x12\x96\x1c\x54\xe1\x75\x84\x2c\x1c\xb7\x36\x8a\x60\x6c\x6b\xab\xd5\xbd\x29\x1a\x82\xdf\x24\x7a\x93\x35\x50\x31\x44\x99\x22\xd1\x23\x47\x3d\x7f\x89\x36\xb7\x35\x67\x5c\xc4\xe4\x60\xbf\x44\xa2\xa9\x4b\xe2\x80\x49\x93\x88\xbe\xb2\xdc\x44\xda\xdf\xba\xad\xfd\x5d\x52\xaf\xbe\x11\xb1\x29\xf4\xc5\x34\x8c\x22\xe3\xf2\xcf\x9b\x4e\x4d\x9a\xca\xe3\xeb\x68\x49\x79\xfe\x7b\x98\xbd\x90\x89\x66\x5c\x55\x27\x96\x31\xc1\xa1\x53\x9c\xc0\xf5\xe1\x9f\xe0\x58\x15\xcb\xdd\x33\x8c\xc7\xab\xf9\x92\xf9\x77\x14\x2b\x4b\x71\x59\x0b\x04\x5a\xdc\xe0\xb2\x7c\xb3\xcf\xf5\x36\xab\xdd\x3d\xf7\x88\x03\x67\x74\xb7\xa7\x33\x82\xf8\x04\x8c\x05\x25\xc4\x15\xe6\xc1\xeb\x76\xbe\xcd\x9d\x99\x99\xc0\xa8\x7b\x10\xba\xef\x8e\x08\x68\x73\x46\x9e\x27\x8a\xc1\x98\xc4\x68\x6f\xf2\xa4\x17\x7c\xee\xc1\x61\x44\xa7\x14\x2d\x55\x2e\xbd\xab\x36\x24\xa0\xbb\xf2\x22\x44\x39\xdf\xc8\x8d\x8f\x91\xe3\x77\x65\xb9\x76\x8f\x92\x28\xd8\x96\x75\x53\xee\x76\x80\x4e\xf7\x05\xac\x8d\xc9\xf2\x7d\x85\x14\xfc\x26\xe7\x92\x42\xe2\xaf\xc0\xb0\x73\x2c\xa3\x79\xd6\x3b\x46\xb9\xbb\xc9\x61\x72\xfa\x50\x12\xe0\xc8\xed\x38\x5a\xde\x07\xa9\x78\xa1\x54\x45\xca\x03\xf1\x6b\x08\x53\x4f\x5a\x07\xac\x22\xc1\x1d\x37\x42\xa9\x00\x10\x9a\x94\x8e\x85\xeb\x03\x12\x54\xb0\x6e\xc9\x55\xf6\x73\xaa\x47\x21\x08\x09\x7c\xa7\x4a\x7d\xba\x07\x66\x22\xe9\xda\x85\xd7\xd0\x55\xfb\x75\x76\xc2\x2b\x8d\xf7\x5c\x31\xc1\xd2\x31\xbc\x71\xe9\x83\x56\x81\x67\x7f\xd5\xe2\xfa\x8b\x11\x22\x7e\x76\xb2\x8d\xc2\xc3\xa8\x75\xad\x30\x2a\x28\x6a\xa1\xca\x2f\xd2\x79\x04\x95\x5f\xd8\x93\xfc\x63\xc0\x5b\xc7\x4c\x5a\x49\xbf\x02\x70\xf7\x94\xa3\xf5\x80\xd1\x8c\x38\x13\xb0\x13\x9a\x85\x64\x23\xce\x2f\x2f\xf4\x98\x80\x95\x83\x4d\x50\xac\x01\x6c\x82\x34\x65\xb1\xfe\x77\xb5\x75\x61\xae\x7a\x52\xe8\x11\x7c\x3f\xc6\x0d\x03\xa3\xb1\xa0\x5f\x6b\xab\xf1\x2a\x4a\x22\x6f\xdc\xfc\x78\xb5\x57\x9c\x4b\xbb\x26\xd5\x11\x32\x6f\xee\xa6\xe1\x2d\xb6\xa9\xbf\x5e\xa4\x7a\x04\x5f\x33\x22\x4f\x1e\xd5\xc6\x7a\xb0\x91\x3e\x78\xc1\x68\xcd\xdf\xd7\x45\xd9\x79\xb6\xfa\x82\x8d\xbc\x6e\xfd\x64\xab\xb2\xd0\xcf\x26\x38\x73\xcf\x14\x21\x63\xc2\x91\x76\x5b\x36\x4d\xb9\xc5\x54\xc1\x63\x56\xac\xcb\x47\x2e\xf7\xf0\x2a\x8d\x78\x4e\x82\x59\x71\x33\x60\x36\x9b\x0c\x1a\xe8\x19\xd3\xca\x45\x30\x7c\x95\x2c\x61\xf5\x68\x0e\xbd\xcd\x8c\x90\xb1\xdb\xe7\xd8\x3e\x1b\x97\x39\x52\x7d\x2e\x9e\x03\xbc\x2f\x78\x92\xb8\xa3\x82\x04\xaa\x40\xd1\xc2\x73\x17\x5a\x5a\xd2\x61\x3e\xc5\xb8\x39\x79\x46\xa4\x73\x8d\xef\xe8\x0f\xa9\x82\x54\xa9\x05\x0e\x3c\x3f\x20\x52\x5d\xf2\x22\x7a\xdf\xed\xb7\x5d\xd4\xcd\x16\x15\x58\xa0\x06\xdb\x21\x04\xd7\x81\x10\x9c\x8f\xd1\xb3\xf6\xe8\x91\x65\x52\x51\x40\xd5\xb1\xe7\x51\x21\x9d\xc9\x91\x7b\xea\xe9\x4c\xb3\x23\x13\x01\xaa\x93\x08\x08\x17\x78\xb2\x24\x46\xec\x9c\x13\x01\x36\x8e\x6a\x81\x50\xa3\x02\x64\x0e\x9d\x58\x4f\xa7\x1f\xe4\xed\x6e\x0f\x04\x97\x2a\x37\xda\x3a\xaf\xa4\x2a\x8b\x6c\xa5\x56\x7d\xc3\x3c\x11\xb9\x26\xd0\xbe\x80\x14\x11\x31\x0b\xac\xcb\xc7\x22\x2f\xcd\x3a\x5c\x1a\xb3\xe0\xaa\xb2\xdb\xb2\xb1\xbe\x31\x61\xc8\xa9\xd2\x30\x40\xe7\x7d\x15\x16\x0f\x60\x68\x4b\x8c\x6f\x64\x18\x7b\x3d\x44\x59\x49\xd0\xf0\x31\x75\x13\xca\x37\x51\x5d\xb4\x69\xc1\xb2\x5d\x20\x89\xa5\x66\x32\x27\x61\x13\xa8\xdc\x3c\x46\xe0\xfe\xa8\x60\xd5\x4e\xf2\xde\x5b\x10\x39\xca\x1a\xee\x8f\x09\xb5\x8a\x44\xf1\x71\x02\x8a\x49\x65\x65\xb9\x52\x4a\xc5\xe7\x0e\xcc\x29\xf0\x47\x2e\xdb\x92\x23\x7d\x55\xfb\xd5\xbf\x57\x9e\x05\xd2\x5b\x41\x03\xa8\x3d\x1c\xdd\xd5\x65\x95\xa1\xd5\x02\x35\x68\x25\x41\x39\xdc\xcd\x9d\x3d\xe1\x8e\x51\x8a\x89\xd9\xcf\x03\x44\xe4\x1e\xa2\xfa\x95\xcd\x1e\xec\x5a\xc5\xab\x24\x1a\x4a\x27\x14\x10\xba\xd2\xc8\x00\x8b\xee\x1f\x81\xd5\x55\x56\xe8\xcd\x3e\xcf\x7b\x35\xa6\xa3\x78\x0b\x18\x20\x65\xb3\x90\x52\x9f\xc8\x29\xdb\x55\x16\xc4\x63\x61\x22\xd8\x36\xfc\xcc\xb4\x5b\x72\x29\x1c\x61\xc1\x55\x1d\xac\x3b\xfc\xfa\x9a\x58\x5f\x4d\xdb\x61\xee\x87\xf8\xdb\xb8\xec\xc4\xb0\xfe\x98\x07\x97\x45\x33\xa3\x65\x4c\x79\x47\xff\x56\x50\x60\x16\x2e\x09\x57\x21\xc1\x7a\x7f\x19\xef\xd1\x45\xcb\xbc\x56\xc6\xbd\xaa\xdc\x92\x32\x6d\x18\x1e\x7b\x75\x81\x34\x15\xd2\x32\xc4\xbb\x8b\x90\xc1\x4e\x51\x57\x65\x0d\xde\x1d\x7b\x96\x5b\xa4\xbb\x02\xe9\xeb\xec\x13\xa5\x93\xa4\xc2\x29\xb5\x34\xa1\x12\x69\x93\xad\x84\xbe\x69\xac\x77\xaa\x7a\x12\xf3\xfb\xdd\x1a\x62\xa6\x96\x26\xaa\x1e\x51\xb6\x33\x71\xa3\xde\x18\x4a\x3a\x66\x22\xe3\x84\x3b\x97\x33\x4e\x89\xe8\x3c\x12\xc9\xa3\xfa\xbb\xc1\x37\xa9\x9a\x76\xa5\x59\x45\x3d\x07\x27\x36\xa8\x86\xa2\x62\xaf\xde\x17\xd9\xbf\xec\x83\x7c\xb8\xd7\x5e\x1d\xe5\x79\xff\x94\xb4\xcf\x31\xe8\x2b\x7b\x08\xc3\xe9\x99\xed\x44\x81\x4b\x05\xfd\xb8\xd0\x7d\x0e\xca\x05\xa9\x5f\xb6\xce\xf5\x69\x00\xaa\xb2\x7e\x70\x11\xf2\x9d\x90\x56\x68\x8f\x40\x71\xab\x1e\x71\x90\xd2\x9e\x7b\x15\x77\xe3\xc1\x0f\xbb\xbb\xae\x29\x03\xff\x64\x77\x27\x51\xc7\x08\xa1\x6d\xd0\xb9\xf4\xd2\x29\x3d\xfd\xb8\x1e\xfb\xd7\x2b\xe4\xe4\x43\x39\x25\x77\x6a\x0b\x55\x9e\x51\x43\x0b\x3a\xea\xb7\xe5\xda\xdd\xdf\x1d\x78\xe0\xf9\x83\xb6\x11\xb2\x7e\x20\x4d\x86\x0a\xe7\x06\x77\xc7\x79\x40\xab\x7f\xc5\x2d\xb2\x9f\xa8\x8b\x4b\xb2\x3c\xbb\x99\xfc\xfd\xbe\x6e\x04\x91\x6b\x3c\x3a\xb8\x67\x6e\xb2\x35\x9c\xba\xe0\xf5\xb1\x3b\xf3\xe3\x99\xf6\xcd\x9d\xd6\x34\x07\xae\xc9\xbc\xa7\x28\x51\x08\x8d\xb5\xae\xd9\x3b\xb9\x1c\xf4\xf2\x4c\x11\xb7\x21\x5b\x35\xa4\xe3\x79\x7a\xfa\xdb\x32\x57\x47\xe7\xa3\x9f\xff\x3a\x64\x67\xb7\x3b\xeb\x62\x2d\x05\x2d\x71\x01\x53\x10\x42\x9c\xca\xd6\x00\xa6\xa0\xa2\x14\x30\x30\x39\x5f\x71\x57\x65\x90\x2c\xbe\xdd\xd7\x59\x61\x6b\xea\x1c\x3d\x0d\x12\xd2\x50\xaa\x30\x8f\xff\x01\x6b\x33\x32\x42\xbd\x44\xe2\x8d\x67\x0b\xef\x5b\x76\x57\xd6\xed\x72\xea\x7f\xec\x79\x44\x77\x86\x62\xe3\xa7\x69\x12\xf9\xc0\xfc\x8b\xca\xde\xb9\x90\xb4\x82\x08\xde\x2d\x56\x39\xb0\xfc\xa9\x81\xbd\xb3\xf9\x5d\x66\x0a\x04\x1c\xf5\x64\x07\x8a\x12\xef\xaa\xf0\xae\x64\x65\x3b\xf7\x73\x3b\x07\xeb\x22\x4f\x3c\x9a\x33\x63\x64\x86\x95\x7a\xd6\x2d\x18\xd5\xcf\x62\x8a\x75\x3e\x91\x5f\x03\x60\x5f\x9b\xca\x22\x44\xd0\x3d\xd9\x87\xe9\x8d\xfe\x40\x6c\x47\xb2\x17\xa4\xb6\xfa\xe4\xc3\xf5\xe5\x50\x3f\xa4\xfa\x2c\x71\xff\x7d\x19\x7d\x67\xe4\x9c\xd7\xf2\xe8\x57\x47\xfc\xdd\xf0\x2d\x62\x1f\x26\x34\xbb\xff\xe4\x6c\x41\x37\x49\x4f\xf1\x36\xe9\x0b\xff\x95\xf1\x2a\xcf\x76\xb5\xed\x5c\x7d\x4c\x17\x3f\x15\x9f\x3d\xb7\xe7\x93\xcb\x4b\xbc\xd2\x8b\x84\xae\xe8\x7f\x7b\x55\xfe\x39\xcb\x73\xd3\x69\x77\xb9\xe2\x47\x8c\x1e\xee\xd2\xba\xe0\xba\xf7\xe1\xdc\x97\x2e\xfd\xc4\xf0\x98\x71\x95\x9c\x43\x64\xf3\x00\x35\xb6\xad\x3b\x54\x04\xca\xe2\xf9\xe2\xde\x54\x76\x94\x67\x5f\x2c\x3d\xa5\xbe\x29\x76\x25\x44\xf0\x27\xe7\xe7\xfa\xdd\xe7\xe7\x8b\x91\xfb\xf1\x10\x28\x85\x09\xfe\x2f\x94\x9f\x98\xbb\xc8\xcf\xcd\xd3\x7d\x3c\xee\x4d\xd3\x1c\xe1\x18\xa1\x51\xc8\x7d\xf1\x1f\xf6\xff\xf7\xbf\xde\xda\x95\x7e\x5f\x59\x74\x8b\xdd\x8b\x79\x2e\x69\xa1\xa9\x36\x3e\xb7\xab\x6c\x57\x95\x2b\xe7\xea\x9c\x5c\x66\x97\xd9\x3f\x3c\x9f\x0f\xdd\xaa\x5d\xb8\x30\xe7\x4e\xfe\x5e\xf1\xef\xff\xf7\xe1\x37\x9c\x13\xf4\x2b\xa8\x7d\x92\x2b\xa7\x4d\x19\x63\x00\x7c\xf9\x90\x71\x77\xe4\x15\x3f\x7a\xeb\xc2\x85\x28\x23\x1d\x19\x6f\x15\x6e\xae\x2f\x93\x56\x71\xef\xa0\x24\x5c\xad\xe5\x71\x88\xc4\x70\x27\xa2\x45\xa4\x28\x16\xf6\xc8\x94\x42\x47\x51\x04\xc6\x02\xe3\x1d\x2c\x70\xe8\x49\x47\x9c\x46\xe0\x32\x63\x02\x1d\x91\x70\x09\x4d\xb2\x7e\x3e\xc8\x97\xc2\xb8\x0c\x33\x7e\x44\x71\x86\xcf\x8b\xb8\x04\xd2\x65\xff\x5b\x23\xe8\xff\x8f\xff\xa4\x3f\x7c\x7a\x79\xfe\xfc\xec\xc5\xe9\xeb\x17\xaf\x4f\x5f\xfe\x75\x7a\x40\x9f\xee\xff\x7c\xf1\xf2\xd5\x8b\x76\xff\xe7\xcb\xd3\xb3\x17\x7f\xeb\xff\xfc\xcf\xf8\x03\x35\xa9\x47\x2a\xf7\xdd\x5a\xdf\x87\xbe\x0e\xee\x50\xbb\x8f\x51\x82\x49\x02\xf8\x34\x88\xa7\x79\x15\x81\x77\xcc\xcb\x8f\xe9\x3e\x24\xf8\x2a\x77\x07\x66\x6a\x80\xfb\x62\x7a\xf1\xa4\x09\x7a\x70\x96\xf5\x2f\x59\xc1\x1f\xf5\xcf\x2a\x6b\xd6\x54\xb9\xad\x9b\xb2\xa4\x6c\x37\x38\xab\x91\x9a\x6d\x4f\x13\x60\x27\xb9\x79\x1d\xe1\x23\xdc\x98\x88\xe0\xe7\x80\x57\x8d\xd0\xf7\x7e\xa0\xa8\xd7\x53\xf9\x53\x42\x16\xda\x13\x9f\x58\xa7\x2a\x64\x54\x0c\xdd\x58\xf4\xc6\x48\x92\x33\x10\xa3\xd2\x01\x21\x52\x28\xee\xa1\x15\x64\x5c\x99\x01\x2e\x7a\xa0\xb2\x00\xa5\xae\xb8\xc1\x85\x5b\x10\xbd\x0a\x05\x43\xfd\x43\x7d\x4b\x45\xa8\x80\xb7\xee\xa4\xfe\xbf\x00\x6b\x06\xb9\x99\x28\xbf\x3d\x9d\x2d\x27\xe7\x63\xc4\x18\x7b\xca\x95\x87\xcc\x3e\x82\x23\x8e\x78\x92\x2a\x80\x61\xad\x40\xc6\x01\xbd\x60\xcc\x31\x9b\xe2\xad\x80\x16\xb6\xb2\xcf\xed\x57\x92\x85\xea\xaf\xb3\x86\xea\x68\x9d\x30\x98\x11\x8a\x12\xfe\x45\x2a\xf1\x22\xf5\x64\xa3\x8b\xb2\x70\xb1\x49\x56\x37\x54\xba\x7e\x79\x1e\x9c\x40\xa0\xdf\x63\x3a\xca\xc5\x7d\x59\x35\x7a\x8a\xb0\x68\x24\x32\x57\xc8\x6b\x87\xfa\x35\x38\x50\xfa\x3d\xe5\xc7\xc4\x71\x1a\x4d\x60\xc2\x7a\x50\x04\x03\xc5\xfd\x01\x65\x60\x2c\x24\x23\x97\x82\x3b\x4b\x99\x81\xcb\xd3\x62\xb2\xe8\xe2\x00\xe9\x6e\x78\xac\xf2\x23\x34\xa6\xda\x53\xd1\x28\x78\xe1\xc4\x84\xc3\x93\xcc\xff\xfe\x23\x52\xa1\xba\x87\xbd\x99\x4f\x7c\xfe\xf8\xe5\xb9\xbf\xe0\x9f\x04\xfb\xb1\x3a\x59\x0d\xf5\x1f\x3f\x8f\x47\xf3\x3f\xb9\xcf\xfc\xdb\xff\xd4\x27\x57\x93\x65\xa2\xc7\xf3\xf3\xc9\x55\xa2\xff\x60\xb3\x32\xd1\xef\x6c\xe6\x9e\x7c\x98\x0e\x94\x12\xfc\x85\x4a\x01\x49\x19\xc8\xcc\x4d\x04\xc7\x1c\xd2\xc4\x25\x03\xa0\x58\x3b\x9f\x5d\x7f\x9e\x4f\x3e\x7c\x5c\xea\x8f\xb3\xcb\x8b\xf1\x7c\xa1\xaf\x46\x7f\x20\x92\xb5\xeb\xf9\x78\x31\x9e\xa2\x7e\xd9\x42\xcd\xe6\x82\xf1\x2d\x61\x02\x39\x3d\x9b\x07\x0a\x39\x4f\x1a\xd7\xcb\x19\x17\xbe\xad\xba\x7c\x71\xee\x3a\x11\x63\xdc\xf4\x73\x0f\x67\x9c\x06\x96\xb5\xd1\x12\xa9\xd6\xdc\xbf\xdf\x2b\xf7\x57\x49\xe7\xc6\x44\x6e\xfa\xd3\x84\xe4\xe8\x98\x60\x0e\x2e\xba\xfc\x38\x99\x5f\x90\x16\xde\xf5\x68\x39\x9e\x2e\x17\x49\x98\x85\x45\xa2\x96\xf3\xd1\xc5\xf8\x6a\x34\xff\xc3\x22\x90\xc3\xe1\xef\x52\xa5\xba\xd3\xe5\xef\x12\x44\x07\xdf\x7b\x2d\x43\x14\x19\xec\xc8\x0d\xea\xd9\x5c\xf5\x2b\x0c\x8e\xe6\x93\x85\x9b\xbf\xd9\xcd\x92\x59\xfb\xf0\x31\xf5\xb1\xc7\x24\x0f\xbb\x60\x22\xac\x98\x67\xac\x7b\x1c\x38\xb7\xdb\x0d\xf7\x36\xc8\xb0\x99\xf5\x83\xad\x1a\x4c\xe3\x38\xc3\x04\xc1\x83\xf3\xf3\xbb\x7c\xc7\x5e\xba\xc8\x19\x4a\x8e\xe4\x13\xcf\x14\x83\xbc\x31\x01\xd0\x96\xaa\x25\xac\x76\xb2\xdb\x02\xf9\xc4\x07\x19\x1c\x09\x06\x01\xe5\x4d\xb6\xb5\x9c\x89\x46\xfb\xdd\x19\xfe\x7f\x6d\xff\x36\xfd\x61\x0a\xf4\x1f\xa7\x7f\x3d\xfa\x8f\x6f\xf8\x7f\x6f\xde\x9c\xbe\x7c\xd3\xe6\xff\x78\xfd\xe6\xc7\xbf\xf9\x7f\xff\x19\x7f\xa6\xb6\xa9\x57\x66\x17\x52\x20\x13\x4c\x81\x3c\x78\xd9\xa6\x53\xa5\x46\x57\xe3\xe9\x05\x30\x59\xa2\x65\xe8\x7c\x89\xf2\x26\x41\xeb\xe9\x54\x9f\x0c\xa6\xd7\x97\x83\x21\xa3\x30\xbc\xbf\x10\x27\x4a\x54\xdf\x57\x7b\xfc\xb8\xd1\xd6\x16\x6b\x40\x92\x48\xcc\x8e\x57\x1c\x79\xce\x23\x52\xf1\x88\x52\xfd\x1e\xb8\xd2\x31\x83\x0e\x1d\x0f\x70\xf1\x41\xf7\x9b\xad\x67\x19\xa8\x88\x0b\x8d\x5c\xe1\xef\x78\x70\x17\x8d\x07\xa4\x03\xd1\xe5\x87\x3c\x66\x50\xcc\xea\xbb\x10\xa6\x3e\x27\xa9\x1e\x33\xbd\xd3\x12\x89\xd0\xdb\xc0\xfe\x2e\xf7\xed\xb1\xa1\x3d\x7f\x2e\x26\x8f\x34\x19\x23\xf0\x0e\xbf\x90\x50\x84\x06\x0c\x48\x86\xc4\x51\x6b\xdf\x42\xe3\xbe\x18\xc9\x57\x76\x75\xe9\x52\xa5\x26\x93\x54\x0f\x78\x2c\xcf\x6a\xfd\xae\x32\xd0\x9b\xe5\xbe\xc1\xf2\x6a\x91\x38\x1a\x38\xf9\x7e\xf0\xa2\x9f\xc4\x33\xfe\x52\xb3\x67\x10\x13\x12\xde\x39\x8e\xa1\xc4\xf6\xef\x6d\x29\x49\x31\x4f\xbc\x7c\xb2\xa9\xac\x02\x30\x68\x99\xe7\xf8\x2e\xfd\xfd\x6e\xf7\x4d\xf8\x10\x54\xe6\x3c\xfa\x95\xb9\xfe\x7a\x1f\xd3\xbd\x25\xf7\xa8\xfe\x42\xc0\xf9\x5e\xde\x95\x6d\x55\xce\x16\x30\x3b\x46\xe8\x45\xc0\x6c\x3c\x60\xfd\xdc\x0d\xc0\x9d\x55\xfe\xdf\x7a\x4a\xe8\x9e\x2a\xfb\x73\x59\x0c\xe0\x66\x8c\x62\x08\x1f\x02\xdd\x9f\xfb\x72\x5f\x5b\xfc\x44\x02\xbf\x5b\xd9\xa2\xb1\xd5\x20\x51\x83\x0f\x76\xf5\xa5\x1c\x24\x7a\xf0\x7b\xf3\x60\x06\xee\xfb\xf0\xb7\xc5\xaa\xca\x76\x8d\xfb\xf9\x62\x6b\xaa\x46\xbf\xab\xca\x47\x77\x76\x0f\x3c\x1a\x0d\x9c\x56\x1c\x22\x71\x5d\x82\xd3\xac\x7a\xf5\x7c\xca\xb6\x7a\x0f\x4e\xd8\xaf\xa9\x9e\x14\x5c\xdb\x6c\x4a\xe8\x14\xc8\x0f\xfa\x62\x6f\xf1\x5f\xa8\x00\xe9\xe2\x81\xd0\xf1\x06\xdd\x02\xa4\x5f\x8d\xaf\x86\x2b\x7c\xf1\x2d\xbb\x6f\x29\x09\x2f\xe7\xde\x48\xd2\x78\x41\x76\xb9\x62\xc5\x21\x02\xaa\x1f\x59\xb8\xa9\x5e\x46\xed\xb1\xd1\x9a\x55\x90\xb9\xdf\x02\x4f\xd0\x2a\x3c\x03\x8b\x2f\x11\x5f\x01\xca\xd5\xb6\x6f\x1d\x5a\xcc\x05\x07\x7d\x77\xfc\x31\x34\xae\xb2\x2e\x76\xba\xab\x0c\x8b\x37\xc2\xa5\x40\xfe\xbc\x23\x2f\xeb\x7c\x2a\x8c\xea\xbd\xca\x55\x8f\xfa\x23\x5d\xa0\xa7\xa3\x96\x5e\xbf\x0a\x1f\x43\x02\xc7\xc0\xc7\x40\x45\xe7\x6c\x0d\x37\x8e\x84\x4d\xea\xc1\xd1\xcd\xf3\x6b\xaa\x89\x53\x36\xfa\x02\x09\x8b\x08\xf3\x70\x7b\xe8\x0a\xce\x79\x62\x95\x5f\x53\x80\xdd\x70\x1e\x9d\xfc\xd6\x56\x4f\x0a\x89\xb4\xeb\x97\xc1\xec\xf1\xc4\xfa\x86\x86\x16\xbd\x13\xab\x2d\x2a\xcf\xf1\xce\x16\x34\xf1\x97\xfb\x35\x45\xb1\xe0\x5f\xd3\x97\x62\x3c\x67\xa9\x9e\x41\x1e\xf6\x9a\x34\x46\x52\xa5\xa2\xd7\xc8\x51\x7d\xac\xbe\x5c\x04\x4d\x92\x32\x96\xce\xea\xae\x48\xe4\xfb\x09\x46\xab\xb2\xb9\x35\x75\xcb\xae\xad\xf7\x95\xc7\xae\x3d\x96\xfa\xe4\x6c\xa8\x0f\xd6\x54\x75\x4c\xf7\xa4\xe8\xbb\xbe\xfd\xaf\xb3\xaf\x42\x75\x1d\xa3\xd6\x70\x0e\xf9\x01\x73\x8b\x9a\x6a\xd5\x0b\x7b\x5a\xf2\xa0\xb8\x4b\x38\x76\xa6\x1d\x38\x76\x5d\x55\x16\x82\x12\x14\x2f\x46\x25\xcc\xb2\xf6\xe0\x77\x71\x00\x46\xeb\x0b\x5e\x06\xb0\xdb\x7a\xf1\x3e\xfa\x40\x56\xdc\xb5\xdf\x09\x0f\xa5\xe9\xb6\x6f\x1f\x31\x08\x32\xb1\x12\x2f\xe0\x88\x04\xb8\x61\xce\xc9\x68\x12\xfd\xbd\xe5\x15\xff\x43\xa6\xb1\x7d\x65\x5c\x2a\xff\xae\x89\xfc\x75\x92\xea\x4b\x5f\x70\x4e\xa1\x11\xdb\x3d\x4d\xdd\x98\xc2\xa3\xb2\xa4\xe8\xa4\xd8\x71\xa7\xa7\x12\xa1\x13\x29\xee\x11\xa6\x4b\x89\x5a\xb6\xb3\x3f\xfe\x8b\x27\x66\x98\xe8\x93\x5b\x54\x88\x38\x59\x0d\x5b\x7d\xcf\xba\xe5\xc7\x98\x3c\x57\x82\x0e\x36\xc7\x4e\xb1\x5e\x4d\x60\xaf\x81\x7a\xcc\xf3\x4b\x15\x92\x67\xff\x16\xf5\xd3\xa7\x9c\x42\x05\xde\x70\xf3\xef\x52\x3e\xf5\x2e\xb1\xf2\x8e\xed\x6f\x54\x3e\x7d\x7c\x7c\x4c\xb7\xe8\xe9\xa5\x65\x75\xe7\xa2\xbe\xff\xc2\x82\xa7\xdf\xf2\x79\x93\x60\x55\xaf\x4c\xb5\xba\xd7\x2f\x4f\x13\x7d\xfa\xf3\xcf\x3f\xfd\x66\x0d\x54\xbf\x38\x22\x8c\xa7\xf3\x81\xd1\x4a\xc0\xa6\x62\x39\x54\x49\xba\x16\x3c\xcb\x8e\x00\xaa\x1b\xc8\xf3\xd3\x9f\x7f\xfe\xf9\xd8\xd5\x95\xbc\xba\xfe\x9b\x1e\xea\xff\xc2\x7a\xa8\xd7\x42\x0e\x15\x19\xf4\xff\xeb\xc8\xa1\x5e\x1f\x57\x43\xed\x83\x5b\xc4\x71\x78\x0f\x6b\x24\x90\xcf\xbf\x70\x3e\xe3\x40\x08\x13\xdd\xd4\x3e\x30\x5d\xb7\x70\xd9\x1d\xd6\xb1\x26\x48\x7b\x13\xed\xa2\x77\xe0\xdd\x4b\x96\x0e\x3e\xdc\x0c\x6f\xe5\x37\x1a\xdf\x07\x20\xbe\xb6\x68\x20\x0e\x02\xd6\x45\xd8\xf7\x0c\x8d\x3a\xc6\x0c\xa7\xda\xee\x32\xdc\xe3\x2c\xbe\x07\xcf\x41\xd0\x32\x07\x70\xd6\x6d\x0b\xc3\xdc\xf2\xf2\x20\xcb\xda\x72\x65\xf6\xcc\xdc\x19\xf5\xa3\x78\xa0\x73\xfc\xe1\xad\x61\x25\x03\xd3\x88\x9e\x3c\x69\x66\x60\xb4\x2f\x61\xb4\xc1\xf7\x95\xc3\x7c\x3a\x88\xe4\xb5\x20\x1e\x46\xf5\x5a\x5d\x37\xc0\xab\xb8\x58\x93\x15\x38\xe7\x60\x41\x42\xfe\xa8\x5d\x2f\x83\x11\xbe\x4a\xf5\x60\xec\xa1\xf6\x31\x56\xff\xca\xae\xee\x4d\x91\xd5\x5b\x1e\xb6\xd1\x5b\xfe\x91\xe0\x40\xe4\x5e\x14\xe5\x85\x18\xf8\x98\x0d\xfd\x97\xdc\xe8\xdd\x1c\x3c\x11\x5b\x00\xf8\x07\x56\x78\xea\x17\x13\x3a\x96\xaf\xdd\xf8\x3c\x6d\x51\x6f\x4e\x85\x3a\x50\x90\x11\x32\xc4\x13\xc2\xb7\x85\x27\x7d\x93\xea\x41\xe7\x24\x93\x2f\xc4\x19\x9e\x87\x6c\xbd\xc7\xee\x3b\x5a\xb0\x22\x97\x46\xfd\xcc\x47\xc5\xe8\xa5\x33\x4d\x74\x44\xd2\xba\x04\x65\x7a\x37\x9a\x1f\x53\x3d\xb8\x34\xd5\x9d\xad\x00\x84\x1d\x66\xf8\x31\x90\x59\xe2\xbb\xb7\xad\xc7\xed\xa9\x7c\x2a\xca\xf5\xe3\x8d\x3b\x79\xbc\x5e\xa7\x5a\xcc\xf1\x4f\x69\x70\xd6\xfc\x7c\x48\xdd\x3b\x37\xe0\x9f\x60\x7b\xe3\xc7\xe4\xab\xb8\x37\x0f\x1d\x42\x39\xc8\xfe\x78\x96\xad\xad\xf9\x9a\x6d\xf7\x5b\x8a\x37\x15\x36\xf1\x01\x94\x99\x64\x72\xa8\xb5\x1b\xba\xa5\x3d\x95\x3d\x4e\x32\x35\x7b\x56\xa2\x27\x1a\x56\x1c\x4e\x6b\xa2\x80\x07\x24\x34\xe3\x08\x30\x12\xb0\x7f\x1e\xbc\x98\x07\x3c\xc3\xcf\x69\x27\x64\xa7\x69\x17\x74\x22\x6e\xd8\x50\x73\xcc\x51\x47\xc4\x23\x49\xdd\x10\xa0\xc7\x48\xb9\xf1\x34\xd5\x7e\xd5\x40\xe3\xe3\x86\xfd\xbd\xde\x5d\x8d\xc0\x7a\xfb\x90\x95\xfb\xba\x65\xcf\x80\xff\x41\xc5\x6b\xb9\x0e\xbe\x18\x50\x83\xd6\xb6\xa2\xd2\x37\xe9\x36\x9a\xb6\x82\xe1\x5b\xa5\x46\xdf\x33\x7c\xe9\xb6\xa0\xaa\x26\x47\x43\xee\xfd\x79\xca\x43\xbf\xc6\xfa\xc7\x8c\x37\x2b\xec\x23\x5e\x81\x58\x74\xe1\x32\xb5\x94\x48\xe8\x9f\x8c\xa3\x17\x3d\x4d\x4f\x5f\xa4\x7a\x10\x7d\x81\x5f\x4e\x2b\x48\xed\xe8\x0f\x4a\x76\xd6\xac\x56\xad\x64\xf1\xf7\xef\x4b\x37\xe1\xf1\x41\xa1\x3c\xa1\x6b\xd2\x5e\xa4\x59\xe3\xdf\x54\x4f\xda\xc7\xb7\xb5\xe7\x95\x35\xeb\x43\x7c\x8a\xc6\xdb\x33\xda\x91\x30\x0d\x6e\x9f\x5d\x23\x1f\xd4\x39\x34\x27\xca\x55\x4a\x44\x51\x50\xa2\x3e\xa9\x87\x89\x2e\x9c\xa7\x05\xbc\x06\xc4\xa5\x69\x36\x8d\xad\x94\xdf\x22\xdf\x68\xfa\xdd\xda\xe6\xbe\x44\x44\xc6\x0a\x9a\xf9\x61\x37\xed\x76\xa6\x32\xcd\xbe\xa6\xee\xc8\x44\x65\x85\xbc\x7b\xb0\x02\x9a\x51\x1d\x74\xe0\x9d\xba\xc1\x8b\x09\x97\xf6\x75\x07\xfc\x2f\x15\x26\x9b\xb7\x01\x64\x2e\x96\xff\x06\xba\x88\xbf\x74\x10\x1c\xc8\x5d\x2a\x9f\xc5\x6d\xf8\x6d\xb9\xde\x43\xbd\x23\x2c\xc1\x44\xef\xf2\x3d\xed\xe7\xba\x2e\x57\x99\xc1\x83\xa9\xb1\xd5\xc6\x39\x86\x6b\xef\x1f\xf1\x7e\xaa\x21\x19\x4c\xe7\x3f\xb6\xe2\x36\x55\x99\x13\xa9\x6f\x50\x7e\x72\x7e\xb5\xc9\x73\x7f\x12\x9b\x42\xd0\xe9\x25\x48\x2d\x0d\x8f\x0d\xab\xd1\xa7\x20\x58\x31\xd3\x54\x19\xb4\x09\x71\x7b\x69\x30\x19\xaa\xc7\x64\x10\xcd\x8f\xcd\x73\xe4\x8c\x94\x34\xd9\xf1\x61\xc0\x93\xe8\xfd\x8e\x67\xb5\xa2\x96\x07\xdd\x22\x52\xe6\xde\x51\x8a\x9f\xb7\x4c\x57\xee\xee\x58\xad\xee\xb3\x07\x93\x53\x1e\x94\xe1\x39\x8a\x3a\xd4\xbc\x22\xd0\xda\xf2\xf7\x3c\x59\xf5\x73\xfc\x2e\x64\x7d\x79\x43\x42\xef\xcf\xba\x4b\x10\x53\x94\xa4\xd5\x8a\x6b\xc5\xf9\x72\x9f\xcb\xfd\x40\x9f\x94\x15\xfc\xad\x1a\x0c\xfd\x52\x6f\x1d\xc7\x86\x58\x67\xe9\x58\x16\x9d\x95\xc4\xfb\x08\x9b\x30\x21\xf0\xd3\x76\x97\x1f\x78\xc5\xcb\xb3\x81\x4f\xc2\x24\xde\xad\x70\xfd\xcd\x1e\xcc\x79\xd4\x40\x12\xed\xe8\x7a\xef\x43\x3b\x4e\xdd\xbc\x71\x9b\xf5\xbd\xa7\xc4\x85\xc1\x41\x1b\x06\x3e\x17\x03\x5b\xe0\x98\xa2\x91\xf3\xd1\x0e\xab\xcc\x39\x6b\xb5\x8e\xaa\x35\xb0\x94\x32\x8e\xee\x57\x00\x7d\xf6\x8b\x12\x18\x8b\x3e\x97\x7b\xbc\xa9\x57\x7d\xf6\x5a\xb4\x7e\x75\x27\x7a\x40\xdf\xe1\x1d\x78\x62\xb0\xd9\x11\x38\x4c\x12\x22\x1f\x50\x92\x7c\x00\x19\xd6\xb8\x4a\x83\x3f\xa4\xd7\xbc\x35\x85\x09\xa4\x11\x90\x7d\xc3\xc7\x09\xfc\xa6\x40\xf7\x85\xf5\x80\x28\x98\x80\xe7\x39\xb9\x1d\x12\x81\xe0\x7d\xb6\x43\xe6\x35\xa4\x60\x77\xdb\x70\x83\x40\x89\x95\xbb\xfa\xc9\xeb\x17\xff\x6d\xc8\x8e\x6e\xb9\x6f\x7c\xe2\xad\xbe\x37\x15\x86\x0c\x48\x6c\x08\xc1\x4c\x74\x49\x31\xaa\x40\x4a\x2c\x56\x7f\xb0\xb2\x67\x29\xa9\xcf\x75\x5d\xb9\x0f\xce\x96\x1d\xfb\x65\x87\xa9\x58\x11\x53\xf1\xf3\x6f\x52\x15\x73\xd4\xdf\x12\xd9\xf6\xf1\x93\xea\x07\x88\xa1\xf9\x7d\xab\x94\x49\x69\x41\x3c\x49\xd8\x71\x22\xdc\x5f\xcf\x28\x18\xea\x6d\x43\x61\xb8\x55\x5f\xa9\x81\x62\x75\x29\x4d\xee\x81\x82\xd4\x23\x9e\x30\xcd\xaf\x20\x5f\xb6\x6d\xfd\xf2\xee\xd9\x7f\xd2\xe3\xb5\x0e\x3b\x10\xc3\x38\x8e\xe1\x92\xa8\xa9\xbd\x53\x61\xb4\xf0\x99\x7f\x01\x80\x9c\xba\xe5\xa9\xb9\x26\xca\x57\x3c\x34\x35\x53\x9d\x78\x37\x18\x0f\x96\x44\xef\x6b\x62\xda\x22\xde\x6e\x77\xe1\xc8\xfd\x49\xb8\x65\x30\xc1\x26\x7f\x17\xed\x91\xb6\xee\xce\xad\xef\x0c\x1a\xb3\x6d\x9e\xa3\xb9\x41\x6e\x3a\x67\xdf\x6a\x93\x63\xb2\xfa\x87\xb2\x52\x21\x9c\x46\x42\xed\xfe\x92\x43\xff\xcc\xa4\x4a\x91\xc8\x2a\xcd\x70\x04\xae\x47\x6e\x2e\xda\x9d\x67\xe9\x29\xec\x6d\x48\x1d\xdf\x0e\x21\x1d\xe4\x19\x79\x89\xcf\x52\x41\xc5\xa3\xfb\xba\x37\x59\x55\xc7\xf4\xf1\xfd\x65\xc6\x5e\xe2\x20\xd8\x4a\xeb\x54\xb7\x53\xe4\xd1\xc0\xdc\x80\x30\x3d\x52\x94\xbc\x24\xbb\x82\xdf\x6f\xf5\xe9\x50\xa1\x1a\x1c\xd7\xc8\x3f\x97\x7b\x4e\xb7\x78\x0f\x36\x1a\xdc\x2f\xfa\x6c\xa8\x6b\x0b\x8e\x4a\xcf\x67\x14\x7e\xa6\xac\xf4\xcb\x21\x0b\xe6\x7b\xe6\x9b\x9a\x69\x5c\x6e\x0f\x6f\x75\x86\x76\x31\x96\x61\xd8\x74\x2f\x06\x76\x99\x3e\xfc\xad\x14\x03\xad\x6c\xe4\x44\x90\x90\x47\x0b\x64\x1d\x60\x83\xce\xd2\x88\xb2\x82\x2c\xcf\xa2\xd7\x3c\x1c\xd9\xf6\xec\x9d\x75\xf9\x2f\x8e\x71\xaa\x7f\xdb\x52\x29\xde\xd3\x7f\x1d\x9b\x13\x25\x57\xfe\x42\x73\x03\xfb\xbe\x65\x6e\xe2\xe4\x89\xc8\x2c\xb7\x79\x3c\xfa\x37\x9c\x22\x7f\x0c\x93\xfd\xfb\xc2\x53\x86\x62\xbe\x5f\xbe\xcf\x56\xb2\xc5\xb4\xc2\x73\xda\xfd\xbf\xcd\x68\x7d\x9f\xcd\x4a\x5a\x46\x2b\x1a\x89\x8a\x72\x52\xf2\x81\xe9\xd1\x4c\x5e\x16\x36\xc8\xc2\x47\x6b\x18\x1e\xcf\x85\x34\x92\xf0\x84\xd3\x8b\xd1\x84\xf1\x41\x2b\xbe\x3d\x14\xf6\x12\x5e\x27\x9a\xc6\x96\x59\x54\xc2\x94\xd2\x20\xfa\x2c\xa4\x33\x05\x4f\x25\xdb\xe4\x00\x7b\xdf\x24\x4c\xb0\xb3\x0d\x3d\xfb\xf4\xf8\x75\x55\xc4\x3a\xd7\x33\x1b\xfa\xbb\x67\xe3\x69\xdb\x4d\xd6\xb1\xd6\x67\xe9\x99\xb7\xdb\xf0\xf7\x27\x6d\xb7\x1c\x09\x5a\x6d\xd4\xb8\x88\x33\xbb\x7d\x31\xd5\xb7\x8c\xf4\xd9\x6f\x36\xd2\x5e\x10\xa5\xb3\xd2\xee\x41\xcd\x2a\xb7\x5e\xc5\xb4\x15\x9b\xf0\x24\x3a\xdb\xad\xba\xb6\xbb\xf7\x93\xdf\x36\xdf\x11\xc6\x25\x0e\x1b\xcb\x4d\xef\x3b\x3c\x6a\xc9\xd5\xf7\xad\xbc\x5e\xf3\x7e\x12\xe8\x22\xdd\x50\x54\x37\x34\xe3\xfb\x0f\x83\x8a\x3d\x1d\x08\x70\x50\xbd\x1a\x3e\x6d\x13\xd0\x7c\xc6\x89\x4f\x08\xd0\x02\xff\xdb\xf7\x0d\xdf\xb3\xd4\x47\xd9\x5e\xc1\xbb\x0d\x42\x95\xa7\xbe\x23\x99\xb7\x8f\xaf\x8a\x2c\x3b\x06\x17\xa3\x1a\x77\xd0\xa0\xe9\xd5\x88\x61\x42\x31\x1c\xf8\xb1\x4f\xf4\xeb\x3e\xa8\xe1\x91\xba\xff\x93\x54\x79\x62\x0d\x77\x63\x5d\x51\x74\x89\xe6\x8c\xca\x74\x51\x17\xc7\xd1\x1a\xd7\xd3\x21\x62\xe7\x33\x9c\xb9\x53\x9d\x20\x11\x1d\x45\x28\x62\xf7\xf3\x6d\x47\xd7\x09\xac\xda\xea\x18\xd7\x3e\xb8\x47\xfe\x19\x42\x7d\xfc\x18\x57\x32\x3c\x94\x22\xd6\x95\xbe\x79\x0a\x74\xc8\xb5\xe4\x43\xee\x08\x52\x1c\x0b\x8f\x29\xa9\xef\x4b\x60\xf5\x33\xa9\xf8\x00\x13\x22\x58\xc8\x78\xb8\x34\x11\x2a\xa6\x3d\xf3\x8d\x21\x81\xd2\xe7\x3e\x42\x85\xd2\x95\xa3\x4c\x1f\xcd\xb6\x7a\x99\xbe\x86\xe5\x7b\x96\xea\x11\x26\x1f\x3c\xbb\x88\xac\x08\x40\x8b\x4e\x94\x49\xed\x5f\xc2\x4a\xfc\x38\x2c\x61\x78\x8b\xb7\x78\x9c\x89\xd4\x4c\x0f\xa8\x2c\x2c\x2c\xd5\xbf\xb0\x82\xe3\x01\x39\x66\xb3\xb5\xc4\x3b\x64\xea\x38\xc7\x14\x96\x5d\xa5\x1e\xdc\xef\x8b\xc0\x02\xf6\xcd\x0a\x0e\x69\xec\x3a\x0f\x00\xb6\x65\xb9\x25\x4c\x06\x4e\x7e\xcf\x5d\xfc\x53\xe1\x81\x9a\x6d\xda\x0f\xeb\xc6\x70\xe4\xbe\xca\xdf\x37\xc1\xa9\xa2\x96\x84\xf0\x65\x38\x47\x98\x3a\xa9\x79\xb4\xf9\x83\xd5\x27\xa7\x67\x43\xbd\x2d\x8b\xe6\xbe\xd6\x90\xc4\x0c\xc7\x5f\xd6\x70\x45\x00\x34\xb7\x56\xd0\xab\xe1\x35\x91\xb4\xbc\x58\x9d\x7d\xd5\x27\x6f\x5a\x17\x32\xa2\x7e\xa0\xa2\xed\x1b\xd5\xef\xe2\x05\x11\xf8\xe3\x4d\xbb\xf6\x09\x87\x7e\x58\xeb\x29\x98\xb8\x3e\x79\x6b\x5b\xd4\x8c\x4d\xa3\x04\x72\xdf\xe6\xc3\xe9\xa9\x45\xb6\x4c\xd2\x22\x7e\xfb\xe5\x66\xce\xd6\x67\x8c\x6c\x82\x22\x66\x5c\x9b\x7d\x99\x3a\x6b\x6f\x31\xd7\xd9\xe7\x0c\xa5\xc1\x38\x11\x03\x7f\x0b\xff\x7c\xd4\x9a\x53\xca\x14\x51\x39\x50\x13\xe0\xed\xeb\x99\x8d\xa9\xab\xec\x33\x2d\x38\xf8\x0a\x6c\x31\x45\x27\xd3\xff\xcb\xde\xbb\x2d\xb7\x91\x9d\x6b\x82\x73\xbd\x9e\x62\x05\x6f\x44\xf6\x24\xb3\x44\x49\x55\x65\x57\x4d\x4c\x04\x04\x42\x12\xbc\x49\x80\x06\xc0\x92\xe5\x8e\x8e\xee\x45\xe4\x02\xb9\xac\x44\x26\x2a\x0f\xa4\xe0\xab\x7e\x87\xfd\x02\xbe\xdc\xea\xfd\x04\x13\x7d\x67\xc6\xbc\x48\x3f\xc9\xc4\xfa\x0f\xeb\x90\x99\xa0\x54\x6e\xdb\xdd\xb3\xb7\x75\x51\x25\x91\x40\xe6\x3a\xfe\xe7\xff\xfb\x62\xf3\x19\xc3\x4f\x54\xa3\xe7\xdb\xd2\xd2\x21\xf9\xe9\xb8\x00\x84\xef\x46\x73\x4b\xdd\x49\x94\x70\x1b\x59\xe2\xd1\x3c\x83\xf0\x57\xbe\x4f\xd0\x12\x89\x9d\xbe\x6e\x7b\x68\xdf\x89\xc6\xe0\x70\x48\xac\x04\xad\x44\x24\xb4\xe9\xf3\x22\xca\x16\x72\x2c\x2e\x38\x0b\x89\x73\xe0\x29\xd4\xce\xe4\x95\xc5\xb0\x14\x10\x20\xa4\x73\xf0\x72\x78\xc1\x5d\x65\x99\x97\x59\x2c\x22\x31\x9e\x46\x48\xd4\x55\x14\x38\x13\x03\x16\x23\x66\x06\x5f\xa6\xaf\x52\x39\x0d\x9d\xbf\x2b\x76\xfe\x2e\x55\xd3\x40\x87\x9c\xe4\x3f\x76\x4e\x2b\x38\x74\x57\x60\x88\xa1\xf5\x02\xd8\x52\x5d\x13\xf1\x63\x51\x3e\xe4\x3a\xbb\x25\x0b\x52\x75\xa8\x30\xa3\xc3\xfb\xac\x8e\xdc\x4f\xd1\x75\x3f\x03\xa8\x24\x7b\xae\x1c\xa5\xd1\x00\x2c\xc1\x80\x33\x18\x6b\xea\x1a\x62\x16\x65\x65\x2d\x8a\x24\x1a\x75\xe7\xd4\x41\x03\x29\x9c\x75\x57\x63\x82\x5b\x89\x67\x26\x2a\xac\x80\x6e\xc5\x4c\x1e\x5d\x4c\xde\x8e\x2e\x8e\x68\x6b\x78\x5b\xa8\x60\xc1\x2e\x95\x3b\xf9\x64\xc7\x62\x16\xc4\xff\xda\x14\xb2\x6e\x37\x1b\xb3\x86\x02\x93\x4c\x37\xca\xe4\xbc\x7e\xbe\xf0\x04\xba\xc1\xec\xfa\xa2\x8c\xe7\xcb\xb9\x6e\xd2\xee\x46\x60\x25\x5d\x8d\x4b\xe2\x77\xc4\x09\xde\xde\xed\x89\xa5\xa0\x50\xc3\xfa\x57\xbe\xec\xae\x1d\xc3\xe1\x97\xdb\x9d\xbd\x72\x01\xc7\x19\x2c\x09\xac\x23\xe4\x97\x90\x11\xc5\xe8\xd8\xef\x22\x2e\x3f\x2f\x7d\x5d\x8e\x0b\xb1\xb2\xe1\xe9\x00\x0b\x85\x70\xc5\x75\xa3\x77\xb5\x3c\xe6\xb6\x53\x7b\x8d\x36\x90\x0b\x08\xf3\x18\x5b\x65\x72\x6c\xe3\xae\x1b\xc6\xef\xaa\x6f\xab\xb2\xdd\xd5\x27\x1e\x6d\x6b\x2f\xd6\x2a\xb7\x8a\x81\xd0\x1a\x11\xc8\x8f\xca\xaa\x1e\xee\x4a\x07\x20\xd7\x4f\x64\xc1\xc6\x14\xfa\xc1\xaf\xac\x70\xea\x04\x57\x1e\xca\xd2\xfc\xed\xb9\x39\x89\x66\x3d\xba\x9a\xf6\xee\xce\xb3\x4e\xda\xd4\x1f\xc8\x82\x2d\x34\xd8\x01\x62\x93\xdc\x72\xdf\x31\x64\xbe\x04\xd6\x9a\x1f\xba\x88\xe5\xa6\xe3\xf8\xd5\x51\xcd\x35\x2f\x88\x47\x55\x13\x76\x3d\xb6\xbb\x3c\x10\xb9\xa3\xab\xe9\xc0\xad\x01\x0a\x57\xdf\xdd\x0d\x50\x72\x1e\x0f\x11\x5d\x18\xe1\x4f\x42\xb4\x28\xeb\x13\xb9\x60\x84\x3b\xe7\x99\x84\x6f\x88\xf0\xef\x54\x13\x42\xf6\x43\x6f\x35\x70\xfa\xec\xda\xaa\x6e\x89\x8b\xd3\x9f\xd2\x57\x56\x62\x09\xf2\x7b\xc3\x67\xde\xe8\xdc\xe8\x7b\xa6\xd9\x79\x6a\xfd\xb1\x56\x31\xcc\xbc\x39\xa4\x5b\x2e\x62\x3a\xae\x4f\x38\xda\xd1\x5d\xfc\xe0\x36\xfb\x1e\x19\x07\x25\x2f\xba\x65\x0c\xfd\x64\xb1\xb5\x74\xe5\x82\x85\x1f\x76\x72\x87\x8a\x3c\x6b\xf1\x4c\xe8\xa0\x08\xce\x2e\xb8\x4f\x78\x53\xa1\x90\xc0\x52\xbf\x9e\x97\x01\xe5\x6f\xc6\x61\xb4\x73\xe1\x86\x1d\xe7\x8e\xcb\xbb\x03\x35\x15\x16\x42\x45\x66\x30\x18\x05\xd8\xf6\x02\x3c\x76\x5c\x3a\x01\xe5\x94\x45\x5f\xad\xc7\x0f\x16\x41\x5f\xbe\xbb\xd6\x0a\x9c\xad\x7b\xbb\x58\xa8\xbe\xcb\x6a\x7f\x42\x30\x5c\x0a\x5a\xf6\xa9\x75\x03\xb0\x9f\x3f\x6a\x28\x9c\x16\x79\x59\x7e\xc4\x88\x14\x42\x48\x12\xb5\x82\x9d\xa6\xb7\xfb\xb3\xa8\xc1\x2a\xdc\x71\xbb\x99\xe4\xb9\x08\x95\x65\x58\xdd\x87\x7d\xc3\x75\x5c\x37\xc6\xa5\x2f\x34\x89\x48\x50\xfa\x3a\x20\x37\x73\x01\x97\x24\xdc\xaf\x30\xf1\x88\xf6\x40\xac\xe4\xb9\x88\x2a\x5c\x67\x98\xbd\x88\xb4\xfe\x80\x3b\x16\x69\x7f\xfa\x59\x58\x43\x1e\x5b\x02\x7d\xa8\x6a\xf0\xc9\x12\x6e\x93\xc3\x74\xae\xb5\xfc\x34\x18\xbc\x89\x03\x41\x76\x7c\x88\x09\x43\x37\x37\x7b\x01\x7c\x0b\xce\x23\x0b\x3a\x57\xec\x83\x83\x55\xf7\xe3\xee\x3a\xf0\xde\x89\x74\x63\xcb\x4a\x59\x97\x0e\xb2\xfa\x43\x0c\x59\x9d\x70\x5d\x6a\x1f\x96\xba\x67\xca\x09\x0a\x6e\x85\xa1\x12\x7f\x3a\x81\x18\xd0\x34\x52\xdd\xd4\x65\xde\x02\x9b\x38\x82\x11\x23\xc5\x7a\x41\xd6\x85\x9b\xbf\xe8\xcf\x5f\x1e\x98\x3f\xd0\x6c\x40\xc1\x40\xc6\xf0\xb6\x10\xad\x75\x61\x03\x41\x01\xfd\x3e\x1a\xf6\x13\x46\x29\xf2\x72\x45\x91\xc3\xb2\x12\x07\xd1\xb0\x0f\x3c\x89\x6f\x4b\xf8\x1c\xba\x80\x75\x9b\x37\x01\xb9\xd8\xe0\x96\xc7\x53\x46\x17\x18\x51\x86\x37\xd0\xda\xf4\x32\xfd\xae\x13\x87\x2a\x37\xa1\xb9\x4b\x21\xb3\xda\x87\x38\x82\xc0\x7f\xd4\x00\x66\x22\x33\x19\x4b\x4c\x08\x48\x1c\x23\x13\x20\x28\xb7\x7c\xa8\x9c\xcd\xf7\x32\x3d\x4b\xd0\x6a\x79\x99\xbe\xb4\xff\x79\x05\xba\xf2\x65\xfa\x2d\x66\xff\xd0\x05\xd4\x0d\xdd\xb9\x8e\xc3\x92\xb0\x77\xfc\x21\x00\x31\x61\xc9\xd2\x27\x26\x3b\x10\xa2\xea\xd9\x0f\xa6\xee\x76\xcb\xf9\xd8\x54\x1f\xc3\x30\x28\x8b\xa1\xbb\xef\xbc\xbc\xbb\xf2\x81\x68\xa9\xad\x68\x74\xb8\xe5\x9b\x36\xdf\x98\x3c\xa7\x12\x8f\x43\x3d\x64\x1c\x58\xa3\xd9\x70\xd4\x63\x5d\x16\xf5\xce\xac\x99\xe7\x23\x68\x8e\xfc\x0a\xc7\x25\x39\xe0\xb6\x40\xf6\x2f\x07\xdc\x32\x95\x8b\x61\x27\x66\x40\x9c\xc5\xed\x2f\x1d\x47\x06\xae\x4e\xe7\xcc\x34\x31\xc9\xf7\xa1\x38\xe1\x80\x98\x74\x44\x5b\xec\xae\x94\x1b\x94\x36\x58\x6f\xc3\x3c\x28\x20\x2e\xc9\x23\xa6\xf6\x65\xd7\x8f\x44\xa1\x6e\x53\x0b\xb7\x77\x11\x14\x8e\xe4\x38\xc2\x70\x3f\xcc\x70\x6c\x52\x38\xba\x9a\x20\xe9\xe0\x34\xc4\xc0\x5c\x5d\x97\xae\x75\xe2\xb6\xd8\x10\x08\x71\x55\x10\x80\x39\x3b\x00\x6e\xb5\x9f\xd5\x1d\xba\xdc\xa1\x53\xec\xa2\xf8\xb4\x58\x35\xde\x98\xe6\xae\xd7\x69\xc5\xea\xf6\xcb\x9b\x82\x6d\xa2\x2a\x58\x40\x9e\xdd\x57\x49\xe5\xc6\x87\x3e\x29\x76\x81\x0f\xf2\xdb\x20\xc3\x26\x8a\x61\x09\x6c\xd7\xe9\x90\x70\x3c\xa8\x30\xfe\x02\x71\x2d\x06\xc5\xf5\x61\xf2\x82\xa7\xc5\xb5\x38\x20\xae\x39\xa4\x82\x0d\xba\x03\xd2\xf8\xfb\x34\xcc\x56\x06\x62\x97\x82\xa2\x51\x32\x93\x38\xfe\x6e\xb0\x84\xb4\xd7\x8e\xcb\x20\x7d\xbf\xa8\x2e\xb9\x8f\x48\xa5\x45\xf8\x4a\xac\x8a\x35\xc5\x6d\xee\xc0\xfc\xa0\x2b\x96\x4c\xba\xb5\xb2\x97\x2a\x3e\x1e\x75\x4b\xe0\x7f\xa1\x0e\xe8\x45\xb0\xed\x11\x70\x62\xd1\x5d\x9f\x7e\x60\xe4\xd5\x93\x7d\xdd\x4b\xe0\x16\x01\xf9\xb1\xd0\xb7\x6d\xce\x8d\x84\xce\x92\x86\xa0\xbc\x0f\x10\xda\x91\x82\x97\xee\x31\xbd\x80\x4e\xa1\x87\x80\x1e\xdc\x77\xf8\x54\xa5\xeb\x5d\x48\x6f\x4a\x9c\xe3\x43\xca\x84\x6c\x6f\xa4\x3d\xd1\x89\x04\x28\x59\x24\x99\xc9\xac\x21\x85\xc8\xa9\x34\xd6\xd8\x26\xff\x01\xe2\x3a\x5d\xc4\xb1\xe1\x8d\x6b\x4a\xd1\x2f\xf7\x76\x5e\xc3\x8f\x2e\xc0\x15\xc5\xa4\xc2\x86\x36\x8e\x80\xd8\x03\x63\x1f\xb5\x27\xe0\x70\xc2\xff\x0e\x35\x1b\xab\x22\x56\x3e\x2c\x99\xbc\x23\xe9\x8d\x6e\x11\x45\x27\x5e\x61\x33\x69\xf7\xfb\xae\x52\x30\x0c\xde\xd4\x43\x4e\x11\xf3\x07\xc5\x5d\xd4\xbb\xaa\x04\xb3\x9e\xe2\x4c\xfe\x14\xf8\x95\x4d\x88\xb0\xc6\x4f\x43\xf0\x30\xbc\x2f\x98\xef\x29\xb6\x43\x67\x30\x0c\xee\x94\x1b\x09\x28\xb4\xaa\xda\xcb\xfa\x23\x00\xec\x97\x00\xfd\x7f\x93\x6b\xeb\x8f\x13\x5a\x1c\x18\x24\x8d\xe3\xd3\xed\x24\xf1\x3a\x4e\x64\x04\xdf\x00\x51\x04\xec\xc4\x59\x87\x31\xdf\x03\xb2\xc6\x7a\xb1\x9e\xa5\xf1\x4e\x8b\x21\x1f\x93\x1c\x05\x56\xfa\xfd\xfb\xf4\x5d\xea\x8c\xbc\x4e\x43\xa7\x8b\x05\x40\x99\xe5\x4c\x3f\xb8\x0f\x06\x2d\xcd\x87\x3b\x0d\xe5\xb1\x87\x97\x38\x89\xa0\xdc\x2b\x8d\xb4\x42\x54\xab\x51\x1c\x42\x44\xaf\x39\x39\x6d\xb6\x88\x65\x62\xb6\x3a\x95\x40\xed\xc6\x2a\x8a\xe1\xa3\x6f\xcd\xbd\x2e\x40\x55\x01\xe0\x5b\x6b\x6a\x20\x70\xee\x01\xa6\xf3\x84\x5e\x30\xea\x09\xf6\x5d\x87\x53\x9b\x17\xeb\xce\x05\x76\xa1\x23\x8f\xcb\xce\xb6\x48\x90\xbc\xe8\xd8\x93\x6c\x61\x38\x3f\x49\xe5\x0f\x6a\xef\x48\xda\x18\xdb\xce\x8a\xa5\xc1\xe4\xa7\x6a\x1c\x26\xaa\xf7\x7a\xad\x9f\xea\x7d\xc1\x96\x5b\xb1\xa3\xd1\x0e\x3c\x0d\x55\x8e\x63\xb5\x1b\x62\x90\xad\x43\xd4\xf9\xa0\x23\x34\x95\x33\xf2\x0d\x7d\x9d\x51\x04\x75\xe1\x6c\x0e\x7b\x05\x82\xe8\x62\x33\x00\x46\x13\x8d\x93\xdd\xfd\x43\xa8\x0d\xb0\x4f\x90\x37\x89\x99\x7b\x41\x98\xc7\x79\x42\xc8\x98\x78\x9e\xe1\x43\x09\xe2\x63\xbc\x4d\xdc\x0d\x6d\xdd\x13\x91\x95\x11\xa3\x3e\x36\x79\x9b\xc6\xdd\x41\x47\xae\x37\xd0\x4f\x20\xa3\x7e\x02\xd1\x09\x11\x9d\x04\x7a\xd0\x4a\xf1\x4a\x43\xac\x02\x4c\x56\xd7\x48\x5f\x7a\xcb\x71\x77\x57\x01\x17\xda\x11\xb5\x1b\x1e\x25\xe2\xe8\x72\xfe\xfb\xe9\xc5\xc5\xe8\xea\xe2\x28\x91\xf6\x1f\xf8\x97\x00\xb5\xe5\xe8\x92\x7e\x74\x75\x71\xe4\x69\xbe\x8a\x0d\x14\x2c\xe5\x7b\x66\x04\x12\xf8\x70\x6e\xa4\x54\xbb\x9d\xb5\xd1\x0c\x51\x49\xb9\x96\x58\x0f\x50\x51\x94\x8d\x87\xc4\xf4\x9f\x40\x03\x8e\x48\xcd\xa3\xc9\x3a\xf5\x12\xb5\x31\xc2\xf1\x0e\x0c\xc2\x0f\xbd\x86\x4c\x57\xf0\xe6\xdb\x58\x02\x8b\x51\xc6\x16\x63\x17\xd0\x29\x32\x5a\x0e\xa2\x32\x1d\xbf\x31\x58\xb3\x45\x4a\x6a\x20\x3f\xe4\xa5\x6a\x12\x57\x12\x8a\x4e\xe4\x90\x1f\xf1\x54\x60\x89\x82\xe2\x58\x0b\x60\x3f\xbe\xad\x75\x7e\xaf\x6b\x60\x92\xd6\x7a\x8b\xd1\xec\x9b\x2e\x77\x66\x57\x39\x9c\x38\x5e\xc8\xe9\x72\x7c\x31\x9a\x5e\x4e\x16\x72\xfe\xc6\xb5\xbc\x0b\x31\x9e\xff\x34\x59\x4c\xce\xe5\x78\x7e\x3e\x89\x00\x12\xaf\x67\xe7\x93\x85\x04\xf0\xc4\x8b\xe9\x78\x32\x5b\x4e\xe4\x7c\x26\x47\x33\xd7\x45\xff\x7a\xb4\x9c\x2e\x13\xd9\xed\xa2\x17\x51\x17\xfd\x64\x0a\xd0\x81\x84\x93\x38\x39\x1f\x46\x4a\xf4\x4f\x01\xa8\x44\xc0\x5a\x8c\xa0\x12\x1d\xdc\x61\x77\xb8\x6f\x16\x13\x00\x06\x3c\x9f\xbc\x99\x8c\x57\xcb\x24\x40\x54\xbc\x98\x24\xf2\xcd\x74\x85\x40\x84\x01\x8c\xa2\x08\x60\x14\x67\xf3\xd9\x29\x01\x23\x4e\x67\x6f\x53\x78\xc5\x64\xb6\x9a\x2e\x26\x72\x31\x5d\xfe\x93\x1c\x2d\xe5\x6a\x0e\x3f\xfd\xed\xf5\x08\x10\x1a\x47\xb3\x73\x79\x35\x59\xbc\x99\x2f\x2e\x47\xb3\xf1\x44\x10\x28\x61\x77\x5c\x76\x3e\xf2\xc3\xfc\x3a\x95\xcb\x77\xf3\xeb\x8b\x73\x58\x92\xe8\x43\x76\xa1\x27\x34\xee\xe9\x4f\x13\x39\x9d\x09\xfb\x99\xc5\x64\x79\x05\x28\x89\x1f\xe6\xd7\xf2\x78\x36\xc7\x69\x4f\x67\x53\x44\x48\x9c\xfc\x34\xb9\x98\x5f\xd9\x4d\x44\x74\x45\x44\x66\x1c\xcf\x67\xab\xc5\xf4\xf5\xf5\x6a\xbe\x38\x91\xa3\xe5\xf2\xfa\x72\x22\x70\x54\x4b\x87\xa0\x38\x9b\x8c\x27\xcb\xe5\x68\xf1\x41\x2e\x27\x8b\x9f\xa6\x63\x58\xf6\xc5\xe4\x6a\x34\x85\x87\x8d\xe7\x8b\x85\x1d\xc9\x7c\x96\xe2\xa6\xfb\x03\x23\x82\x03\x63\x5f\xb5\x5c\x4d\x57\xd7\xab\xc9\xd2\x1e\x06\xbb\xa9\x08\xde\x68\x17\x18\x21\x1a\xfd\x89\x49\xe5\x6c\xce\xd0\x8d\xc1\x02\x08\x5e\xa5\xd1\xf5\xea\xdd\x7c\x31\xfd\xfd\xe4\x5c\xbe\x9b\x2c\x26\x78\xe4\x26\xbf\x1b\x4f\xae\x56\xe1\xf9\xf3\x43\x71\xc4\x90\x01\xc7\x91\x10\xbf\xc2\x5e\x80\x8e\xff\x31\x90\x3d\xfc\x4a\x6a\x23\x8a\x04\x6d\x20\x3b\x17\xdb\xf5\x28\x56\xb0\x1d\x11\x49\x94\xf9\x43\x6d\x45\x7a\x94\xf8\x90\xec\xc7\x4d\x21\x5e\x3e\x97\x99\xd5\xd8\xe5\xc6\xe1\xa5\x48\x85\xa5\xc4\x28\x3c\xf0\xe3\x88\x79\xe0\xcb\x63\xeb\xa1\x58\x88\xf0\xe9\x1c\x4c\xa1\xe6\x0e\x8e\x97\xc4\x45\xdd\x56\xf7\x80\xb6\x4e\x3e\x73\x54\xdf\x1c\xea\xc6\x2b\xdf\xfa\x4e\xbd\x71\xe8\xcf\x99\x0a\x39\x31\x75\x5c\xf4\x61\x0a\xaa\x69\x94\x37\x7a\x5f\xd2\xe2\x06\x2f\xe8\x39\x62\xd1\x70\x52\xbb\x45\x2f\x5c\xcc\x00\xab\x40\x1a\x1d\xd2\x82\xdc\xec\x89\xbd\x0f\x03\x60\x94\xc7\x8a\x98\x4e\x31\x85\x7a\x0c\x45\xce\x80\xc4\x92\xe9\x75\xae\x80\x02\xf2\x0f\x6d\x76\x0b\x9f\x51\x18\x0f\x3c\x71\x2d\x5a\x83\xce\x75\x1c\xe6\x3f\x1e\x6e\x08\xee\xc8\x6c\x7e\x20\xa4\x64\xe1\x74\x58\xff\x04\x1d\xd6\x35\xc7\x7f\xb9\x39\x0e\xf0\x13\x6a\x79\x04\xac\x37\x6b\xb3\x53\x45\x73\x74\x62\x3d\x13\x7d\xcb\x75\x24\xd8\x0f\x02\xdf\x0f\x3e\xf5\x6c\xb8\x5e\x75\xb8\xd6\xc1\x2d\x0f\xf6\x26\xe1\x9a\x51\x3e\x26\xec\xa9\x3d\x90\x42\x0f\x5e\xcb\x34\x76\x18\xab\x89\x32\xe9\x94\xf8\x7a\x91\xbe\xe8\x59\x42\xb0\xc7\x09\xf2\xdc\x7f\x47\xc7\x9c\x74\x1a\xa8\xda\xe0\x05\xc2\x5f\xb5\x5d\x55\x82\xd3\x4b\x60\x1c\x6d\x91\xeb\xba\x96\x66\x43\x17\xc6\x3d\x09\xd3\xc3\x90\x9d\xdd\x81\x0e\x24\x04\x08\x3b\x4e\xac\xb7\xfa\x41\x1e\x1b\x06\xde\x36\x05\xc0\xaf\x52\x10\x71\xa7\xf6\xd1\xf4\x94\xdc\xb6\x84\x70\x06\x1f\x07\x53\xd2\x13\x32\x09\x46\xb9\x26\x67\xbe\x92\x3b\x55\x37\x78\xbd\xb1\x5a\xb0\x1d\x42\xfe\xe2\xd2\xcc\xee\x6a\x82\x33\x7e\x6c\x0c\xf6\xc6\x64\x95\x7a\x60\x7b\xcd\x1d\x77\x3c\xcb\xdd\x18\xc0\x81\x52\x53\x11\xd1\x59\x06\x2f\x82\x1b\xd5\x59\x36\xb7\x50\x08\x66\xe1\x58\xce\x69\x8a\x10\x67\xdc\xa9\x3d\xde\x96\xaa\x52\x7c\xbb\x18\x4c\x30\x5e\xa8\x0c\x77\x37\x58\x5d\x0a\xfb\x10\x49\x8d\xa0\x08\x4b\x6f\x6a\x64\xeb\xf2\x02\x10\x49\x73\xff\x24\x46\x67\x24\x38\x84\xf2\xd0\x21\x8c\x24\x75\x28\xc1\x1b\xf2\xe4\x77\xa6\x8a\x90\x16\x70\x61\xf8\x60\xee\x74\x65\xca\xcc\xe3\xa5\x11\xb2\x0a\x14\xf3\x83\x83\x43\x95\xc0\x89\xbc\x53\x55\x86\x7f\x73\x3d\x1f\x49\xc4\x3e\xf2\xe4\xd5\xe5\xc2\xfb\x43\x75\x4a\xfe\xee\xca\xc1\xbb\x1b\xaf\x94\xf0\x34\x93\xbd\xab\xdb\x5f\x2e\x06\xa1\x7a\x91\xbe\xe0\x82\xf4\x4a\xdf\x97\x1f\x75\xe6\x0b\xd3\x85\x72\x5e\x32\x54\x69\xa1\x44\xc3\x9a\x74\x6a\x94\xca\x12\x59\x97\x39\x54\x5a\xb9\x3a\xdb\x04\x99\x81\x32\xfa\xd4\x13\xcd\x0b\xe1\x31\xb5\xe2\xff\xa5\x13\xff\x28\xe7\x9f\x14\xf2\x7c\xe0\xa3\x3b\x4c\xd2\x13\xf3\x30\x7f\x7d\xc1\x49\xd9\x15\x6c\x05\xe0\x33\x5c\xe9\xba\xcc\xef\x75\xe6\x93\xd6\x37\x1e\xc0\x0c\x1a\x39\x9a\x06\xcb\x27\x4e\xc4\x8e\x41\x1f\x3d\xf6\x01\xeb\xde\xa1\x99\xfa\x2b\x43\xdb\x8e\xc1\x4d\x27\x93\x80\x38\xcd\x93\xa3\x75\xba\x10\xbe\xee\x24\x50\x1d\x94\x70\xf4\x4c\x8d\xfa\xa8\x0b\x04\x5e\x54\xeb\x75\xd9\x22\xf7\x6b\xa6\xf1\x1e\xb9\x2a\xdd\x2d\xfc\xa6\xac\xa4\x1b\x04\xae\x13\x88\x0d\xe1\x09\xf7\x61\x67\x21\x96\x8a\x97\xef\x9e\x22\x5c\xa1\xe9\xd1\x19\xd5\xaf\x70\x54\xbf\xb2\x57\x99\x30\x77\xf2\x5c\xea\x22\x13\x90\xf0\x77\xdd\x41\x8e\x87\x39\xd0\xf8\xfe\x24\x96\x95\xe3\x0a\xd3\x79\xae\x2b\x07\x9c\x0a\xbc\x0b\x10\x66\x01\x9a\xc0\xc0\x40\x62\x66\x54\xe6\xed\xae\xa3\x46\x2b\x1c\xa5\xdf\xc2\xc0\xb4\x89\x2d\xab\xe0\x37\x8e\x3f\xda\x3b\x2d\xd6\xd0\xbd\x98\x12\x9a\xbb\x10\x68\xc3\xce\xe6\x72\x3c\x5d\x8c\xaf\x2f\x97\x2b\xeb\x32\x2c\xc1\x87\x70\xbf\xc2\x68\xe7\xea\xdd\x64\xbe\xf8\x90\xc8\xf7\xef\x26\x60\xd1\xaf\xe6\x8b\x95\x3c\x76\x0e\x92\x98\x4d\xde\x5e\x4c\xdf\x4e\x66\xe3\xc9\x49\x82\xe6\xfe\xc8\x3a\x09\x8c\xcd\xfe\x7e\xba\x9c\x24\x72\xf9\x6e\x74\x71\x61\x1d\x87\x64\xd8\x69\x48\xac\x11\x2e\x7a\x2e\x43\x22\x1d\x54\xfb\x92\x7f\x66\x27\x12\xba\x2b\xee\x33\xcb\xeb\x2b\xeb\xbd\xd9\x0f\x80\xbf\x32\x7f\x23\x97\xd7\xe3\x77\xe8\x5f\x4d\x96\x49\x80\x00\xbf\x9a\x23\x80\xfd\x64\xb1\x9c\xcf\x1c\x1e\x7c\x0f\x07\x1e\xfc\xc0\xe9\xf9\x64\xb6\x1a\x5d\x24\x02\x5c\x91\x21\x50\x78\x76\x21\xde\x8d\xec\xd4\x27\x8b\x2f\x79\x8f\xf4\x3d\x61\xdf\x7b\x31\x5f\xc2\x03\xde\xce\xe7\xe7\xef\xa7\x17\x17\x09\xf2\x01\x2c\x57\xf3\xab\xab\xd1\xdb\x89\x5d\xd1\xcb\xab\x6b\xfb\xd0\x37\xa3\xe9\xc5\x35\x62\xcb\x5f\x8e\x2e\xde\x5c\xcf\xc6\xf8\x34\x1c\xbc\xb0\x3b\x67\xd7\x98\xd7\xf0\xd2\xba\x9b\xd1\x28\xf1\x65\xc0\x0d\xf0\xd3\x64\x26\xa7\xc1\xf2\x7c\xa0\x0d\x7a\x37\xfa\x69\x22\x5e\x4f\xec\x6f\x67\xd6\x8f\xb4\x5e\x31\x7a\x91\x57\xf3\xe5\x72\xca\x54\x00\xf4\x4d\x7a\x72\xca\x8e\xd5\xf0\x51\xc3\x27\x5b\x77\x71\x74\x75\x75\xf1\xc1\xae\xbd\xfb\x25\x2c\xfd\xf9\x64\xb4\x7a\x67\x87\x87\xdb\x31\xba\x90\xd3\xd9\x6f\xae\x17\xe0\x70\x5e\x5f\xac\xa6\xb3\xb7\xf2\xcd\x62\x7e\x09\xef\x14\x30\xda\x67\x4b\xe9\x4f\x1d\xbb\xc1\x93\xdf\xad\x26\x33\x7c\xc9\x74\x0c\xbb\x7c\x31\x7a\x6f\x7d\x59\x80\x28\x5c\xe2\x90\xfd\x20\x53\xb1\x9c\x5f\x4e\xe4\x6f\xae\x17\xd3\xe5\xf9\x14\xd6\x72\x29\xcf\xe7\x38\xd0\x8b\x8b\xf9\x7b\x7a\xe8\xf8\xe2\x7a\x09\x73\x5a\x74\x66\xe8\x8f\xc6\xc1\x93\x91\xc8\xe5\x1c\x17\xc7\x3f\xc7\xee\x53\xf0\xa0\xcb\xd1\x87\x68\x6d\x84\xf5\xcc\x1d\x91\xf7\x75\xba\x4c\x29\x00\x07\x92\x59\x17\x19\x12\x86\x20\x72\x5e\x2f\xa7\x2f\x8f\x3c\x07\xbe\x34\x8d\xde\x26\x47\x88\x2b\xa4\x10\xac\x52\x72\x17\x3f\x86\x74\x5e\xfd\x4a\x8e\xd3\x37\xe9\x22\x15\x2f\xd2\xb3\xe7\x67\xf2\x78\xbe\x6e\x52\x79\xf6\xeb\x5f\x7f\x7b\x92\x30\xd6\x38\x35\x03\x86\x0f\xee\x41\xa4\x1c\x81\xc4\x0b\x3e\x22\xfa\x28\x2a\x51\x3a\x1e\x87\x15\x64\x09\x55\xe5\xe9\x0e\xdc\xa8\xe4\xd9\x8b\xf4\xc5\xd9\x0b\x71\xbc\xd4\x3b\x1e\x17\x74\xb5\x46\x4c\xf4\xdd\x8f\xc3\x58\xfc\x0f\x5f\xbc\xf8\x3e\xfd\xfe\xc5\xf3\x17\xa7\x67\xcc\x32\x22\xdc\x8f\x5e\xc9\xe3\xdf\xb4\x85\xe6\x19\x5b\x61\x0a\x2b\xfe\xd6\xaf\xf8\xa4\xc8\xe4\x35\x50\xb4\x10\xe4\xc9\x50\x1e\xb2\xb0\xf6\x1e\x94\x6d\x92\x71\xe4\xb3\xd3\x0e\x1e\x88\x78\xad\x3b\x9c\xbc\xab\xb8\xc1\x67\x90\x6e\x37\x20\x62\x5c\x97\xc5\x9a\x50\x1b\xb9\xd1\x7f\x0b\xa5\xd2\x92\x31\xb7\x86\xb9\x76\x63\xe8\x98\x3b\x9d\x73\x88\x2e\x22\xdb\xa5\x0c\x92\xfb\xae\x57\xce\x8e\xfc\x16\xa7\x1a\xa5\xa6\x7a\x4c\xb8\xd2\x34\x11\xff\x2d\xc4\x3f\x44\xec\x7e\x77\xf8\x18\xc7\x2a\x37\x9b\xb2\x2a\x8c\x02\x4a\xc6\x00\xfd\xee\x78\x08\x54\x58\xc4\xdc\xee\x89\xf5\xd1\x54\xb1\x77\xd5\x0e\xb5\x8f\xd2\x9e\x24\xd2\x2b\x69\x83\x15\x8f\x9b\xdc\xac\x9b\xd3\x72\x73\x9a\xab\x87\x00\x69\x2f\x05\x3e\xcc\xd0\xeb\x71\x28\xa8\xae\x5e\xc4\xf5\x81\x94\x05\x97\x52\xc3\xbd\x5b\x9b\xc6\xfc\x51\x5b\xcb\x1e\xdb\x45\x0a\xc6\xe3\x58\xdf\xa9\x8a\x28\x23\x23\x02\x49\x60\x11\x77\x2c\x9d\x1c\x77\xbd\x2e\x20\xc5\x07\xbc\x91\x90\x42\x1e\x6d\x75\x65\xd6\x2a\xe9\x13\xc1\x0e\xc3\xb2\xfa\xe5\x8d\x71\x55\xc5\x10\xcd\xe8\x1b\x9d\x01\x63\x22\x10\xb1\x3a\xa3\x7b\x66\xcf\xad\xae\x0a\x2a\x9b\xc2\x14\x92\xdf\xa0\x04\xcf\xfc\xbd\x2e\x5a\x2d\x11\x06\xc5\x14\x72\xa9\x8a\x46\xc9\x71\xae\x2a\x65\x1f\x07\xd5\x5a\xc1\x77\x7c\x6e\x37\x2f\x01\x1e\x01\x51\x29\xba\xed\x2c\xeb\xb2\x8e\x39\x09\x86\x20\x85\x90\x12\x15\x3e\x2a\x63\xf6\x62\xa1\x9a\xa6\xac\x0a\xbd\xaf\x9f\xc9\x8d\x26\xce\x56\xfd\x69\x07\xf6\x29\x96\x1a\xa9\x6e\xb6\xd2\xad\xf9\xcc\x65\xf8\x0a\x6b\x2b\x82\x9b\x56\x38\x1c\xf5\xda\x65\xec\xa7\x05\x21\x76\x42\xab\xd8\x52\x61\x69\xeb\xdb\xb2\xcc\xa0\x5b\x80\x40\x59\xf3\x3d\x1d\x3b\x9d\x41\x2f\x18\xb0\xaf\xc7\x89\x70\x3c\x50\xee\xc4\xfa\x0a\x1b\x46\x68\x85\xde\x6e\x07\x7a\xc2\x1b\x2b\x3c\x2b\x35\xfb\x22\xe0\x2a\x55\x18\x95\xf0\xb1\xf9\x80\x97\xa0\x9b\x7a\x3a\x7b\x91\xca\x05\xaf\x3d\x56\x1a\xc0\xf2\x53\x4f\xc5\xa8\x76\x8c\xaf\xc3\xa5\x7f\x9d\x68\x40\x9d\x20\x20\xa0\xbb\x0f\xc1\xbe\x0a\xff\x60\x2c\xbd\x50\x5b\x05\xae\x25\x92\xed\x1e\x6e\x96\xb1\xdb\x4e\x40\x58\x6d\x63\x72\xf3\x47\xe7\x3a\x93\x8c\x1d\x80\xc5\xe2\x2e\x48\x57\x18\xe3\xe8\x70\x06\x8a\x6b\x3a\x15\xeb\x5d\x32\x04\xea\xc1\x8a\x16\x09\xdb\xf7\xf5\xcf\xad\xc1\x42\x22\xe8\xde\x4f\xc5\xac\x6c\x20\x1b\x4b\xb1\x57\x83\x3d\x25\x80\x46\xed\x1a\x14\xa2\xdc\x08\x6c\xa1\x81\x14\x3e\x42\xc3\x11\x1d\x8f\x9d\x9d\xab\xc6\x09\x78\xdc\xdb\xbc\x31\xbb\x5c\x9f\x3a\x3a\x05\x28\x61\x18\x88\x0c\x42\x31\x9a\xae\xcd\x2d\xc6\xb3\x82\x3e\xf2\x5e\xd5\x86\xaa\xe5\x91\x7b\x30\x2d\x60\x76\x94\x8a\x81\x1f\x3a\x90\x2d\x3a\xa1\xfd\xf7\x32\xad\xc4\x1e\xcb\x4d\x70\xc3\xb4\x78\x72\x00\xb8\x7f\x41\x85\x9b\x23\x35\xf1\x50\xa5\xca\xc3\xe3\x72\x1e\xad\xf6\xd2\xde\x87\x4a\x0e\xd6\x2b\x91\x5c\xed\x57\x6c\x04\x65\xd2\x3e\xb1\x75\x7a\x20\xff\xf6\x8b\x51\xac\x9f\x46\x54\xfd\xdf\x13\xc4\xfa\xf2\xdf\x35\x88\xf5\x57\x23\x36\xff\x32\xc4\xea\x27\x1e\x34\x84\x53\x3d\xfc\xe1\x01\xd4\x6a\xfc\x85\x10\x87\x1e\xff\x0f\x9c\xea\xff\x1f\xe3\x54\x5f\xfe\x3b\xc6\xa9\xbe\x7c\x02\xa7\x7a\x36\x5f\x4d\x7e\x00\x33\x2e\xa2\xd8\xf4\xf2\x1b\x6b\xb1\xa1\xa2\xa2\x06\xf2\x1e\xe6\x8d\x69\xa2\xef\x70\x25\xd9\x60\xc1\x31\xe0\x36\x0e\xde\x67\x94\xb0\xc8\x75\xc9\x6c\x43\xe2\xc0\x48\x2a\x15\x33\x8f\x60\x4b\x67\xd9\x16\xae\x94\x30\x16\x15\x61\x7f\xa7\x4b\xf5\x74\x50\x4c\xff\x57\xb3\x9b\xfd\xe3\xcf\x97\xfe\xa4\xdf\x8c\xc7\xa7\xaf\x3f\x9c\xce\xc6\xa7\xcb\xd1\xe9\xab\xf4\xf9\xdf\x80\x07\xf0\x69\xfe\xbf\x57\xaf\x5e\x7d\xf7\x7d\x97\xff\xf9\xdb\x97\xff\xe0\xff\xfb\xbb\xfc\x19\x43\x5b\xe6\x3d\x56\x8d\x5a\x99\x38\x6a\x5c\xb1\xef\xe9\xac\x2c\x3c\x9c\xd2\xe9\xf2\x4e\x55\x7a\x94\x9b\x8f\x5a\xbe\x4a\x9f\x77\xbc\x4a\x7e\x8e\xe0\xe7\xc4\x65\xa7\xdd\xd7\x1c\x9d\xb8\x02\x3e\x08\x9f\x6c\x4c\x85\xfd\xde\xae\x13\x83\xbc\x4c\x81\x38\xa2\xd6\x1c\x00\xf1\xe7\x90\x45\x55\x76\x0f\x9d\x8a\xdd\x4e\xa9\xde\x84\x90\x7b\xd4\x25\x7d\x84\x7b\x83\xab\xdf\xcf\xd5\xc3\x5e\x57\xa7\xc4\xff\xe1\x90\x88\x30\x60\x51\x16\xf5\x9d\xd9\xa5\xfd\xe7\x42\x1b\xb6\xb0\x2e\x84\xcb\x27\xa1\x22\xc3\xb2\xde\xb0\xa7\xd7\x37\x2e\x91\xd5\xa9\xea\x53\x53\x93\xd5\x99\xf6\xd7\xee\xd6\xdc\xc3\x18\xb9\x8f\xcc\xe8\x80\x33\x47\x86\xaf\xc4\x28\x0b\xb3\x04\x7b\x92\x33\xa7\x99\x4d\x35\xc8\x81\x9d\x70\xea\x66\x60\xb8\xfd\xb9\x0a\xa6\x65\xae\x21\xe0\xe8\xbb\x2f\xac\xdc\x67\xf7\x18\xdb\x29\xec\x00\x59\x7f\x19\x2c\x03\x25\x07\x63\xd3\xe6\xb9\xae\x1b\xd1\xa9\x82\x4f\x85\xb8\x86\xf8\x4a\x6f\x81\x63\x4f\xa4\x16\xe2\x4b\x5b\xcb\x67\x46\x2a\x09\x35\xdf\xaa\xca\x20\xac\x49\x39\xb4\xee\x1a\x08\x4f\xbd\xc0\x19\x30\xda\x78\x82\xe9\x09\xe8\x6d\x69\x1e\x80\xb9\x2a\x5d\x4f\xb3\xf5\xd5\x01\x03\x52\xb5\xcd\x5d\x89\x9d\x51\xfe\x31\x6e\x57\x02\x4f\xcb\xb3\xcf\xc2\x58\x90\x0c\x37\x7a\xad\xf0\x2e\x22\xa9\xdd\x78\x96\xf2\x46\xe7\xe5\x03\x86\x86\x3c\x99\x17\x53\xb0\x05\x7d\xd8\xd6\x05\x09\x76\x55\xe5\x01\x3a\x6e\x61\x2d\x62\x2e\x52\xd0\x9f\xee\x54\x5b\xdb\x85\x25\xf2\x73\x34\x99\xa0\x5f\x90\x11\xfb\xac\x41\xc7\xcb\x8c\x46\x79\xf8\xba\x8d\x4b\x62\x96\x55\xfd\x83\x9c\xb7\x55\x6f\x6b\xb0\x85\x8b\x42\x0c\xcc\xb8\x77\xb3\x17\x64\xe9\xc2\xfa\x99\x3f\x62\xac\xe1\x16\x52\x83\x7e\xe6\xbb\x88\xad\xbd\x85\x3a\x56\x5a\x5a\x6b\x73\x43\xa1\x06\x07\x4f\x05\xe3\x34\xa1\x61\xf8\xe5\xf5\x4e\x61\xb8\xf1\x38\xab\x4a\xdf\x97\x60\x94\xa7\x64\xac\xdb\x03\x42\x66\x54\x65\x6d\x74\xfb\xb4\xa0\xb9\x20\xa8\xae\x8e\x8e\x58\x27\xe3\x8c\x2d\x1c\x54\x2d\x7e\xa3\x37\x25\x39\x00\x18\x92\x6c\x52\xd9\x7b\x19\x94\x97\xd7\x1a\xea\xe1\x82\xea\x23\x0f\x3a\xd0\x7d\x4a\x19\x4e\x26\xaa\x65\xc6\xb5\x5c\xab\x42\x56\x9a\x21\x8d\xdd\x3a\xaa\x5a\xe8\x4f\x3b\x6d\x97\x6d\x60\x14\x50\x2e\x9c\xef\x81\xff\x31\x16\x38\xf6\xa0\x74\x02\x09\x2e\x9b\xbd\x42\x68\x03\x62\x32\xc7\x35\x1f\x8f\x7d\x44\x88\x1f\x92\x20\x9e\x32\x3d\x31\x70\xc3\x54\x41\x71\x04\x42\x77\x09\x90\xce\xc2\xab\x94\xca\xcb\xb2\xd2\xdd\x2b\x10\x9d\x49\xf9\x83\x7c\x30\x1f\x4d\xba\x26\x09\x82\x20\xd2\x35\x04\x11\xe2\xb3\xfc\x9f\x37\x65\xf5\x9f\xdd\xf7\x06\x4f\xba\x5f\xcd\x1f\xe4\xeb\x3d\x83\xe7\x16\x9a\xee\x49\xf7\xe8\x27\xae\x3f\xb2\xac\x04\xe1\x8f\x3e\x79\xb8\x83\x45\xcc\x82\x75\x81\x25\xf1\xd4\x84\x43\xc7\x0d\xbc\x1e\xff\x75\x00\x68\x08\x9e\x4f\x1a\xd7\x67\x3f\xa8\x9d\x4e\x60\x3c\xfa\x7f\xfc\xd7\x7f\x06\x80\xa6\x4f\x6a\xbb\xcb\x75\x02\xa8\x52\x54\xaa\x05\x21\x3f\xef\xa9\xba\x5d\x91\x87\x77\xe5\x7f\xfc\xd7\x7f\x6e\xee\x74\x81\x42\xb6\xf5\x04\x00\x14\x4e\xf6\x7e\x1b\x9f\x97\xf8\x1e\x12\xcd\x85\x75\x62\xfd\x0c\xb8\xe1\xf4\xcb\xb7\x3a\xc6\xd1\x21\x7c\x09\x92\x32\xd0\xa4\x86\x3b\x91\x86\x18\x91\xfd\x35\xb7\x92\xbf\x6e\x0c\x27\x94\x9c\x60\xd9\x04\x36\x82\x5d\x39\xa0\x03\xe0\x04\x80\x5b\x36\x74\xa2\xa1\xb9\xd8\x0f\xd8\x7f\x33\xea\x1f\xe5\x57\xa6\x72\x24\xdc\x98\xed\xeb\xb1\x5d\xcf\xee\xba\xca\xc1\xe5\xd5\x90\x6f\x70\xa8\x0f\xf5\x47\x87\xa5\x05\x70\x31\x84\x2c\x05\x48\x6c\xd5\x47\x9d\x09\xa8\xb7\xa2\x28\x22\xf0\x21\xde\x95\xed\xed\x1d\x6d\x85\xf7\xa0\x43\xb9\x91\x80\xe7\x0c\xd0\x9b\xc5\xba\x6c\x2b\x75\x0b\x72\x59\xb8\x34\x13\xe6\x0d\x69\x30\x54\xea\xe3\x73\x1a\x87\xef\xa3\x3f\xf6\xe2\x2f\xb9\x90\x7a\xd0\x08\xf8\x0b\x0d\xd6\x98\x7f\x5a\x88\xd7\x11\x84\x7e\x10\x7e\xcb\x38\x28\x75\xcc\x69\x68\xd0\xc0\xd4\x4b\x82\x80\x73\x58\x1d\x4a\x21\x7c\x71\xa3\xe5\x0d\xf8\xcd\x51\x57\xe7\x90\x66\x30\x75\xdf\xec\xf9\x9a\xf9\x88\x43\xf3\xf1\x8d\x35\x47\x1d\x3e\xeb\x93\x3e\x89\xad\xa9\xbb\x2c\xdc\x14\x0a\x03\x8c\x9c\x5d\x05\xa8\xa5\xd0\x5d\xca\x29\x9d\xc4\xb5\x63\x73\x21\xd0\xc0\x42\x09\x88\xfa\x06\x7b\xe8\xda\xc2\x71\xb1\x54\xe1\x02\xe7\xf5\xf0\xe2\x38\x92\x29\xa7\x7d\x43\xe0\x66\x4c\x73\xb8\xeb\xd3\x7b\x15\xc2\xe1\x93\x94\xe5\x07\x08\x42\x26\xaa\x23\x56\xde\x68\xf4\x97\x4e\x19\xf6\x71\x06\xc2\x81\x8a\x40\xe0\x0a\xe1\x38\x2b\xe5\xff\xf8\xaf\xff\xdc\x61\x1b\x53\xa9\x1c\x65\x0a\xf0\x08\xdd\xc3\x31\x31\x31\x64\x1b\x8e\x23\xa9\xb6\xc4\x36\x21\x5e\x53\xb8\xe1\x1e\xb1\x0d\x67\x51\x56\xd6\x85\xe0\xba\xd2\x03\x93\xc1\xf8\x8d\xeb\x5a\x14\xfd\x8f\x98\x1a\xf9\xa6\x40\x2c\x27\x98\xc1\x80\xbf\x60\x45\x6b\x96\x10\x1d\x15\xe4\xd3\x93\x88\xcb\x40\xb8\x0e\x2f\x08\xdf\x6f\x55\x51\x80\x54\xb4\x82\x05\x92\xa6\x5e\xfb\xf8\x60\xe1\xe0\x44\xc5\x82\xc1\x31\x73\x77\x71\x78\xf3\x0e\x90\x3b\xc4\x27\x3c\x21\x41\x74\x70\x8e\x4a\x6e\xdb\xda\xac\xc9\x6e\x77\x38\xda\xf6\x38\x32\x5b\x09\xf8\x6f\x6b\x68\x29\xbd\x4d\x78\xef\x44\xf4\x10\x6c\x19\x24\x74\xee\xcc\xbf\x73\x60\xe9\x4d\x2d\xeb\x7d\x01\xbd\xa0\x56\xcc\x9b\xad\xce\x04\x3b\x95\xd4\x5e\x2b\xb7\x25\x10\x85\x18\xeb\x43\x61\xe1\x2c\xbe\xd5\xaa\x6e\x77\x2b\x1d\x61\x4c\xd8\xec\xef\x92\xa5\x70\xb5\x9e\x5c\x53\x43\x20\x30\x0e\xa4\x90\x11\x66\x7a\xa7\xd3\x00\x84\x66\x59\x65\x03\x28\x0b\xe2\x80\x04\xeb\x25\x9e\xd6\xa9\xe4\x88\x12\xf4\x82\xab\x06\xd2\xe5\xf1\x74\x3c\x68\x44\x6e\x6a\x10\x34\xe4\x8b\x75\xb4\xc1\xda\x3d\xc0\xa9\x27\x01\xc0\x65\xf7\x54\x87\xd1\x95\x9f\xaa\x96\xba\xae\x91\x68\x26\xc7\x73\x64\x8f\xe3\xbd\xca\xb9\x9e\xb2\x2f\xf8\x10\x12\xfa\xa9\x0b\x48\xa3\x8e\x2c\x8f\x6f\xec\xa1\xa1\x4f\x31\x38\x55\x5e\xd6\x3a\xdf\x0b\x76\xab\x23\x97\xcf\xd9\x08\xc9\x60\x95\x40\x74\x1e\x6f\xaa\x52\x65\x6b\x55\x37\x89\xe8\x9d\x4b\x18\x5d\x6b\x90\xf6\xda\xd4\xf2\x5c\x35\xca\xca\x01\x1a\xaa\x7f\x3a\xc6\x0c\xec\x20\xee\xca\x07\x19\x60\x68\x59\x09\x9e\xab\x1b\x9d\x63\xbe\x77\xad\x1a\x7d\x8b\xfe\xd7\x57\x5e\xb5\xe0\x59\x91\xbf\xea\x10\x88\x8f\x6f\x4e\x8e\xcf\x4e\x4e\x8f\x5f\x9c\x38\x3f\xf3\xa9\xe5\x4d\x85\xd0\xdc\xff\x6b\x37\x73\xa5\xd7\x77\x45\x99\x97\xb7\x70\x5f\x2f\xb5\xaa\xdb\x4a\xd7\xee\x26\x94\x78\x8c\xf0\x87\x88\x73\x16\x43\x3f\x8b\x72\x43\x5d\x3d\xde\xea\x4b\x5c\xae\xf2\x46\xcb\xb5\xa9\xd6\xed\xf6\x5e\x17\x3e\x59\x98\xab\x87\x9a\xf1\x0e\xc0\xa4\xf7\x18\x30\x64\x77\x8e\xaa\xc6\xac\x73\x2d\xcf\xce\xd8\x66\x7c\x3f\xbd\x9a\x07\x13\x5b\xd9\xc3\xb8\x97\x2a\x2b\x77\x94\x63\x3c\xd7\x6b\xbd\xbd\xd1\x95\x7c\xf1\x1c\x18\x64\xbf\x73\x24\x1e\x7c\x72\x4c\xa4\xc6\x7d\xa9\x6e\x2a\xc4\x26\x95\x13\x36\xb5\x51\x47\x5e\x04\x89\x42\x5c\x8c\x8d\xc2\x30\x4b\x82\x7f\xcb\xb4\xca\xf9\x90\x7c\x43\x31\x1e\x84\x01\x7c\xc2\x68\x7f\xf2\xe0\xa3\x6d\xe9\xfb\xe0\xad\x24\x11\xad\x37\x9b\x7b\x72\x2f\x15\xe2\x36\x75\xb7\x7d\x92\x53\xe5\x71\x5f\x8a\xa9\xc6\xb1\x6c\x90\x0c\xe8\xb4\x83\xaa\x7e\x68\xac\xdb\x49\xba\x0a\x92\xae\xee\x55\xc3\xa7\x16\x0e\x62\x60\x5d\x25\x22\x32\xaf\xe8\x5e\x39\x1b\x2b\x15\xe2\x2e\x1d\x90\xea\x7e\x1e\xaa\x6a\x4c\xdd\x98\x35\x2e\x68\xa3\x2b\xeb\x53\xa1\x6e\xc9\xe8\x4a\x7a\x6d\x29\x9c\xca\x8f\x30\x04\x9c\x81\x83\x2b\x9c\x1d\x10\xa9\x26\xed\x99\xa3\x7e\x1c\x9d\x46\x10\x6a\x6f\x18\xe4\x11\x8f\xcd\x97\x27\x34\x29\xb7\xc6\xc1\x41\xc1\x87\x22\x00\x6e\x70\x52\xc4\xa1\x93\xe2\xd5\xd2\x53\xe7\x44\x86\x28\x3d\xde\xd2\xeb\x7a\x6a\x41\x79\xfc\x1f\x7c\x6c\x62\x90\xa5\xf2\xb8\x3e\xf1\x44\x95\xc7\x46\xd7\x27\xb8\x28\x41\xb6\xdd\x97\xe0\x74\x9b\x92\x85\xf8\x98\xca\xe8\x44\xd0\x3b\x30\x1a\x6d\xb6\xaa\x32\xf9\x3e\x0e\x62\x59\xe7\x0a\xca\x7f\x60\x85\x1e\x54\x95\xd5\x32\x28\x29\x55\xd9\xbd\x2a\x1a\x28\x8c\xaa\xe4\xb6\x2c\x74\x63\x4f\x88\xd5\x68\xba\xa8\x29\xd6\xfa\xd5\xe2\x56\x7f\x42\xe7\xee\xf0\x7a\x7a\xb7\xf4\x49\xf3\x52\x0c\x5c\xf2\x9b\xbd\xcc\xcc\xad\x69\xec\x53\x4c\xae\x4f\xeb\x3b\x55\x31\x27\x10\x7d\x12\x17\xc3\xd4\xf1\x1a\x89\x00\xad\x49\x57\xe4\xe5\xbb\x9e\x28\xe0\xb5\x1a\x98\x36\xd9\xed\x05\x69\x0b\x57\x18\xc2\x73\x4c\x85\xc8\x53\xbc\x8b\xbc\xd1\xa5\x8b\xee\x86\x17\x29\x08\xa4\xdc\xec\x31\x34\x05\x1f\x07\x66\x45\xe0\xef\x43\x32\x0b\x72\x75\xeb\x61\x83\xb4\x73\xb5\xbc\x7b\xcd\x34\x2c\xa4\xa0\xd1\x66\xf0\x44\x2c\x2e\x82\xe3\xf5\x76\x08\x96\x02\xff\xaa\x35\x77\x38\x24\x4c\xf9\xba\xa6\x7f\x96\x95\x30\xdb\x5d\x59\xb1\x01\x40\xc0\x20\xe0\xf2\x6f\xfb\xce\x48\x3c\x5d\x1f\x70\xa0\x18\x28\xba\x08\x5b\xd0\x36\x2e\xf0\x48\x1f\x06\xb0\x8b\x35\x2d\x47\xf0\x70\xf0\x22\x94\xc4\xd4\x3b\xf8\xb0\x8d\x54\x60\xa9\x0a\x7f\xab\x72\x08\x59\xd6\xba\x20\xb3\x7c\x9b\x0a\xb1\x4d\x9f\xb2\x40\x68\x13\x18\x5f\xd1\xe7\x95\xbd\x2d\xe4\xb2\x05\x08\x5c\x70\x8e\xdc\x6a\xf7\x5a\xfe\xfa\xbb\x6f\x7e\xfd\xcd\x64\xcc\x13\x98\xb4\x56\x8b\xab\x42\x5e\xa9\x2a\x37\x0a\xbb\xeb\x8a\xcc\x97\x67\xb5\xc5\xda\x00\xc8\xcf\xd9\x99\x40\xae\x76\xab\x65\x19\x3d\x1e\x73\x45\xbb\xaa\x6c\xb4\xab\x23\x65\xd9\x8c\x54\x35\xf6\x91\x99\x43\x3e\xb1\x3b\xbf\xd6\x3a\x03\x26\xd5\x1a\xf9\x06\x15\x4f\x21\x34\x2b\x03\x93\xd2\xd5\xf1\xec\xd1\x19\x20\x25\x06\xec\x42\xa9\x10\x0c\x16\xf2\x34\xab\xee\x17\x62\x0f\xd8\x4b\x3a\xa4\x1b\x50\xce\xde\x91\x9b\x5e\x61\xf9\x1f\x9c\x0b\xfb\x46\x53\xdc\x06\x3e\xea\x0b\xf0\x51\x97\xeb\x72\x47\x55\x95\xca\xeb\x69\x8c\x87\x09\x71\xd6\x61\x5c\xfa\x42\xf8\x62\x40\x52\x79\x9f\xfb\x20\xe9\xd2\x21\xce\x25\xd7\xb2\x8d\xb5\xdd\x11\x0d\x53\x22\x82\xb8\xbc\xb3\x21\xba\x08\xd7\xdd\x85\x33\x07\xfc\x62\xd1\x94\x3f\x08\x31\x4a\x3d\xd3\x92\x57\xff\xc3\xdf\xa0\x02\x9f\x32\x47\xde\xab\x02\x72\x23\x09\x08\xdd\x8e\x44\x0c\xd3\x2c\xc4\x6e\xf4\x3a\x95\x8e\xd0\x29\xe0\x76\xf2\xaf\xec\x79\x62\xbd\xe7\x3a\x2d\x01\xf4\x1c\x40\x98\xf5\x84\x75\x88\x8a\x05\xac\x94\xfb\xd2\x64\x1c\x73\xc9\xca\xf6\xa6\x61\x4f\xd9\x7f\x5b\x74\x6d\xcb\x9e\x16\x4f\x06\x2d\x2a\x8f\x9b\x67\x3f\x0f\xf3\x41\xb8\xd5\x92\x22\xcd\xec\x02\xf9\x9e\x7f\x08\xcc\x0c\xc5\xae\x3d\xc6\x3a\xe0\x11\xa4\x54\x35\xc3\xbc\xa8\xfd\x97\x9b\x03\xbe\xc7\x77\xc7\xea\x24\x15\xe2\x55\x2a\x2f\x91\x36\xa2\x40\x7e\x55\xd5\xd4\x3f\xca\xc6\x3a\x16\xe0\x54\xc4\x50\x1f\x50\xf8\x64\xdd\x9f\x55\x64\x94\x71\x5e\xaa\x16\x04\x4b\xf6\xa5\xc3\x06\x2c\xac\xdd\xd7\x3a\x5e\xe7\xa2\x44\xfc\x6b\x48\x67\x78\xd8\x6e\x2a\xa7\x8b\x35\xc0\xa1\x91\x46\xcd\x0b\x59\x29\xea\xb2\x33\xe8\x07\x05\x71\x2e\x76\x00\xac\x43\x81\x9b\x04\x7d\xf4\xd8\x2e\xca\x4d\xb1\xb2\x0c\x1c\x24\xd1\x94\x76\xc4\x37\x06\x4b\x92\xa3\x40\xd9\xd7\x0c\x26\x5c\x1b\xd1\xd3\xa9\x01\x23\xc0\xd7\x3c\xcc\x3b\x68\xe2\x4b\x6e\xe1\x57\x1a\x51\xb5\xb1\xa7\x50\xd0\x8c\x3a\xdb\xef\x13\x90\x8c\x19\xe4\x5d\x59\x75\x72\xfc\xea\x44\x16\xfa\x1e\x0b\xd0\xec\xd5\xad\x7b\xc1\x21\x77\x7e\xbf\x4d\xe5\x79\xf9\x50\xd4\x4d\xa5\xd5\x36\xa2\xc4\xb0\xe2\x66\x1e\x83\xe7\xb8\x4d\xb3\x82\xb9\xef\x49\xc9\x09\x40\x20\x46\x80\x67\xe1\xc1\xf3\xa1\xa9\xb8\x93\xdb\x05\x3b\x55\xc1\xac\x63\xbd\x37\x7e\x61\xc3\x7a\xb5\x83\x5f\x1b\xfd\x79\x9d\xca\x91\x27\xa6\x39\xf4\x76\x3b\xdf\xae\xcc\xeb\x4d\x17\xda\x49\x7a\x82\xb1\x22\xcc\x88\x5f\x3c\x65\xf1\x95\xca\xa2\xf7\x4a\xbf\x14\x41\xf5\x00\x6d\x45\x3f\x5c\xe7\x82\x73\xa9\x10\x63\x00\xeb\xca\xc2\xf3\x80\x59\xa4\x18\xc1\xf7\x10\x49\x91\x67\xf8\x81\x3c\x8e\x03\xfd\xa4\x6a\xce\x2a\xda\x90\x02\x8b\x3a\x40\x72\xdb\x2f\x1f\xb8\x36\xc2\x45\x53\x9a\x32\x39\x14\xb9\xb4\x9a\x02\x09\x8c\x03\xe2\x23\xb7\x76\xdd\x53\xe8\x9d\x08\x2c\x29\x39\x70\x5a\xc3\x08\xc1\x77\xb0\x30\xba\xc8\xca\xaa\x06\xaf\x1d\x18\xd9\xee\x1c\x26\x54\x5f\xdc\xfb\x0e\x84\x5a\x52\x72\x8c\x90\x77\xa1\xb5\x04\xf8\x05\xa3\x5c\x2a\xc9\x3a\x2a\xd3\xde\x47\x70\xb2\x89\x2c\x43\xfc\xab\x01\x37\x35\x8c\xfa\x26\xec\xac\x10\x2c\x22\x86\x8b\x77\xa5\x3d\x54\x56\x6c\xd3\x34\x30\x36\xce\x6e\x78\xb9\x21\x4e\x5e\x80\x3e\xac\xc5\xcd\x3e\xb6\x8e\x5c\x64\xa0\xf6\xfd\x0f\x04\x0c\x08\x27\xd9\x85\x47\xa0\x82\xa8\xf6\xb0\xb8\xa6\x70\x06\xdd\x4b\x2b\x9b\xce\x4e\x8e\x47\x27\xc7\xe6\x04\x25\xd0\x4d\x2a\xe7\x61\x79\x03\x58\x74\x97\x65\xe5\x48\xa2\xbc\x77\xe3\x62\x07\xd0\xb5\x52\x34\xfa\x16\xc3\x64\x1c\xb0\x73\x09\xd1\x83\x4e\xb3\x35\xd1\x2a\x84\xd0\x81\x9f\xc3\xd7\x77\x95\xb9\x57\xeb\x7d\x4c\x6a\xe8\xdc\xc8\x9d\xae\x6a\x7b\xa0\xad\xbe\xc1\x01\xfd\x28\xef\x98\x05\xab\x83\x20\x49\x25\x42\x9d\x75\x1b\xd2\x6f\xa2\xaf\xdf\xc2\x34\xd1\x50\x52\xc1\xd7\x2b\x60\x84\xa3\xdb\x1b\xe8\xcb\xa1\xbf\x42\xf5\x27\xf2\xa6\x6d\xf0\x1a\x73\x6a\x04\x2d\x34\x62\xae\x03\xc5\xce\x0c\xa0\x32\x88\xc2\x1e\x58\xe7\xbe\x58\x7d\xd9\xcd\xdf\x7d\x69\x75\x58\xc3\x83\xfd\x05\x6c\x31\x64\x70\x1b\x4d\x68\x71\xa0\xe4\xc9\x4a\x3c\x74\xb7\x7d\x4c\x99\x4c\x98\xb0\xf9\x89\xbb\x53\x15\xbf\x01\x45\xc6\xda\xe8\x66\xef\x6a\x38\xf6\xf2\xbe\xcc\xdb\x02\x62\x00\x34\x3e\xb0\xe0\x11\x11\xb4\xc4\x9f\x42\xf3\x6d\x5e\x97\xd5\x9e\xd2\xdf\xf0\xa4\xf5\x9d\xde\x6a\x00\x44\x00\x20\x57\xc4\xce\x05\x44\xbe\x68\xca\xbe\x81\xad\xc2\xbe\x81\x60\xfa\x22\x98\x3e\x9e\x08\x5e\x83\xa8\x69\x8f\x21\x23\x06\x93\x38\x50\x92\x52\x52\xbd\xb7\x2a\x9e\x30\xcd\x03\x5f\xeb\x65\xa8\xd2\xe5\x38\xb4\x73\x41\xe4\x7c\x61\xc1\xe3\xc6\x3c\x00\x03\xe9\x04\xf4\x5c\xf1\x97\xe8\x1a\xd1\x2a\x0d\xc3\x9c\x28\x01\x08\x2e\xe4\x09\xff\x46\x1e\x47\x21\x05\x97\xd8\xb3\x36\x6c\x00\x9c\xc8\x5e\x13\xa2\x79\x47\x45\x68\x86\x11\x7d\xeb\x96\x82\x99\xdd\x2b\xe7\x12\x4a\x3d\x29\xfb\x03\xc4\x38\x4d\x66\xdd\xe1\x2e\xe9\x30\x95\xe8\x41\x74\xef\xa9\x58\xa2\x8b\x75\xd7\xe2\x8b\x12\x35\x61\x16\x89\x00\xd5\x27\xc8\x5e\xea\xda\x57\xa8\xf8\xd0\x64\xb0\x42\x37\x7b\xb9\xab\x75\x9b\x95\xc5\x7e\x0b\xea\xd2\xbd\xf0\xe4\xc7\x80\xb0\x45\x4a\x69\x4c\x4a\x8d\x4d\x78\x1f\xb1\x90\xbf\xf7\x21\xf8\x14\xe1\xea\x80\x62\x02\xf8\xab\xda\x75\x43\xc6\x02\xa1\xfb\xf5\xfb\xa7\xbe\xad\x25\xd7\x6f\x62\xdb\x8f\xaf\x2a\xed\x3c\x46\x08\x78\xce\xf5\x62\x0a\xc8\x34\xfb\x9d\xae\x72\x53\x7c\xe4\xa7\xf4\x57\x3d\x96\xd7\x01\x2b\x0e\xb1\x82\x03\x5b\x1e\x98\x84\xae\x37\x84\xe0\xe0\xdc\xf1\x3a\xbc\x9d\x74\xc6\x54\xc1\x5f\xa6\x76\x43\x6c\x16\xd7\xf7\xa6\x6c\xeb\xd8\x8c\x27\x67\x7b\x1c\xbc\xee\xe0\xa5\xfe\xb2\xd0\x45\x77\xd6\x13\xf5\xb8\x7e\x8c\x84\xdb\x3d\x06\x16\x6a\xd0\x4f\x46\x55\xc0\xc6\x5e\xad\x1a\x53\x13\x24\x6b\x60\xbf\x85\x98\xcc\xa8\xd6\x0f\x1e\x51\x81\x59\x7f\x8a\x71\x59\x77\xb3\xdd\x26\x18\x61\x4a\xd8\x4e\x87\xb1\x46\xa4\x01\x4f\xdc\xfd\x54\xbc\x09\x2b\xbf\x4c\xc3\xe6\x55\xf0\xea\xa6\x3c\x34\xf2\x1b\x6a\xde\x47\xbe\x05\x31\x74\x7c\x00\x6d\x1d\x5b\x56\xb0\x92\x81\xcb\x02\x1b\x0f\x42\x1e\x17\x21\x83\xc6\x9b\x6e\x7a\xb7\xd1\x09\x93\x00\xcb\xb5\xd2\xdb\x92\x70\xfa\x48\x40\x84\xd5\xd7\xfc\x78\x71\xb3\xef\xae\xf0\xf1\xe8\xe4\xab\xce\x30\x66\xe6\x83\xdc\xd0\xd4\xd3\x73\xf2\x03\x0e\x6f\x65\xc2\x87\x1e\x1e\x20\x7a\xee\x85\xfd\x95\x0b\x09\x35\xdd\xba\x5e\x7e\x28\x94\x82\xb2\x5f\x71\x86\x3e\xff\x13\xce\x87\x03\xf4\x56\xfd\x14\x39\x07\xcf\xac\x38\xc6\x36\x45\xb5\xed\xa7\xd1\xe8\x28\x7b\x92\x4d\x09\x5c\x14\xe8\x65\x0c\x65\xf8\x45\xff\xb8\x87\x24\x46\xbf\xe0\x06\x05\x33\x13\x7d\xb7\x6a\xe0\x26\x99\xda\x2f\xd5\xdf\xe4\xda\xf4\x7c\x55\x38\x9f\x5f\xef\xbf\xc9\x2f\xf9\x6f\xe2\x6b\xfd\x37\x19\xf9\x6f\xbd\xc3\x44\xe9\x0e\xc2\x41\xe8\x5a\x19\x9d\x54\xa1\x77\x6c\x9f\x76\x63\xf9\x34\xbf\xc2\x00\xf2\xe1\xc8\x7f\x2a\xc4\xfb\x7e\x45\x8c\x73\xaf\xf1\x20\x3c\x95\x39\x88\x72\x88\xe2\x8b\x39\x44\x04\x7e\xdc\x3c\x11\xea\x8c\xc2\x38\x67\x27\x61\x30\xda\xfb\x3f\x60\xdd\x63\x85\x9b\x80\xea\xe8\x03\x51\x5a\x30\x43\x99\x3c\xb5\x51\x90\x0c\xe0\x9e\x75\x67\xad\xf8\x26\x53\xb8\x5b\x9c\x6e\x78\xc2\x6c\xc4\x48\x31\xc8\x98\x2e\x6f\xce\x57\xbc\xd0\xbd\xc0\xbd\x19\x28\xc2\xdc\x8f\xa3\xd3\x0c\xe5\xa8\x4f\x16\x8f\x38\xf8\x34\x7e\x80\xf8\x45\x0f\x90\xc7\xec\x09\x19\x18\x89\xcb\x75\xf0\xe8\x4e\x84\xa9\x7b\xc7\x36\x34\xc6\x37\x9d\x60\x9e\x17\xa5\x37\x27\xa4\xe1\xd7\x21\x3b\x6b\x87\x8a\xe1\xb0\x1c\x8e\xc4\x30\x2d\xad\xf8\xda\xbd\x8c\x96\x24\x15\xe2\xa9\xf0\x7a\x14\x3f\x7c\x85\xe6\x30\x95\x26\x44\x3d\x4e\xd4\xf4\x8a\xc7\x3c\xa4\x1c\x3a\x68\x93\x0c\xd5\x9b\xc5\xb7\x4b\x50\xa1\xfd\xd3\xc5\x36\x3c\xb8\x6f\xb1\x6a\x31\x32\x0f\xdf\xfb\xa6\xa3\x38\x2d\x20\x81\xf1\xdc\x63\x3d\xa8\x54\x5e\x23\xe0\xa8\x47\x18\x67\x0e\x7b\x6e\x3e\x46\x8c\xbc\x9e\xea\x3e\xe0\xe8\x8b\x38\x40\xb2\x41\x1b\x76\xd8\x42\xac\x4f\x0d\x0e\x50\xd5\xa7\x01\xf3\x31\x70\x59\x40\x6b\x56\x51\x7a\x78\x22\x06\xf4\xae\xc2\x96\x2a\xb2\x25\x3f\x1a\x14\xfd\x0c\x53\x34\x9c\xfd\x11\xec\x00\x93\x57\x96\x70\xf3\x7f\xe2\x3d\x59\x5f\xed\x41\x08\xca\x6c\xe6\x0c\x16\x7c\x89\x78\x28\x40\x8b\x6a\xd5\x51\xb5\xbe\x53\x45\x43\xcb\x9c\xc8\x8d\x69\x00\x6f\x07\xb9\x2f\x02\x76\x03\xba\x23\x98\x26\x0b\xd1\x10\x13\x11\x10\xe0\xe7\x18\x80\x08\xf8\xf5\xad\x56\xb1\x0a\x6f\xbd\x6e\x2b\x88\xd3\x70\x65\x36\x2c\xd5\x1a\x89\x53\xdc\x03\x84\xae\x2a\xc0\x4b\xe1\xf9\x97\x15\x9c\x5d\x48\x63\xa0\x56\xab\xd7\xe5\xbd\xae\xb0\xf4\x1b\xa5\xbf\xf7\x37\xea\xd8\xe1\x10\x1c\xf3\xa0\x7c\x8b\xbd\xa2\x9b\x16\x85\x9c\x4b\xa9\xc1\xb9\x0f\x5c\x16\xd6\xb0\x61\x52\x0a\x2d\xb2\x43\x11\x11\x53\xc8\xa2\x24\x04\x45\x04\xa7\x0e\xcf\x15\x30\x20\xb2\x4d\xfb\xa1\x6c\x99\x05\x1e\x93\xc5\xcd\x9d\x2e\xab\x7d\xe0\xeb\x0d\x57\xeb\x15\xfa\x36\x37\xb7\x76\x91\x4e\xe2\x8a\xd8\x8d\x03\x45\xac\xf4\xba\x49\xb8\x78\x3f\x71\x50\x31\x20\xeb\xc0\xd3\xb5\x3f\x5d\x97\x05\x91\x40\xc0\x87\x76\x6d\x61\xb0\x15\x4b\x7f\xd2\xdb\x5d\xae\xaa\x3d\x20\xe0\xe2\xe6\xe5\x65\x0d\x79\x6b\x42\x1d\x62\xa0\x20\x44\x55\x8d\x61\x6a\x18\x8d\x66\x40\x88\x88\xf2\x69\xa5\x9a\xc8\x90\x6c\x3b\x2a\xcc\x01\x30\x48\x95\x21\x59\x08\x29\x38\x5c\x76\xc7\x29\x0f\x51\x96\xaf\x18\x28\x9f\x15\x15\x2c\x6b\x84\x26\xe3\x29\x1e\xbe\x70\x54\x82\x62\xb6\xe8\xa8\x08\x77\x54\xd6\x68\x2e\x1f\x72\x83\x3b\x18\x1c\x32\x1a\x85\x8b\xbb\x02\x5a\x80\x07\x18\x0b\x8b\xe4\xc3\xe2\x67\x2c\x47\x3c\x14\xc9\xdc\x96\x56\x65\x51\x95\x28\xd4\xb1\x7e\x32\x5b\xd5\x60\xde\x82\x29\xbb\xc2\x81\x02\x55\x9d\x32\xf7\x38\xe6\xa8\xfd\x32\x90\xe3\xdf\x81\x1c\x5f\x69\xea\xa2\x5d\x45\xb8\x9a\x8a\xa4\x51\xb7\x1c\x8e\x6a\xfa\xd8\x7a\xf2\xb9\xd6\x03\x25\xda\x5c\x8b\xee\x5c\x67\xbb\x7f\x9e\x7e\x52\x3e\x85\xf4\x7e\xa0\x56\xa0\x40\xdd\xd7\xc7\x47\xea\x8c\xf5\x00\xb8\x3c\x4a\x81\xf7\xcc\xe4\x57\x79\x73\xae\xed\xc6\x69\x9d\xe2\x00\x86\x14\x7e\x5c\x16\x23\xaa\x8a\xef\xd0\x5d\xb3\xaa\xd9\x14\x40\xa0\x5e\xff\x00\xde\x56\x9c\x6c\xea\xe0\xfd\xda\xbf\xdc\x9b\x32\x77\xd4\x95\xeb\x16\xf2\x02\x3e\x64\xdf\xb8\x9f\x0a\x82\x98\x0e\xa0\xec\x61\xe4\x2c\x46\x9d\x0b\xeb\x1e\xf8\xa3\x35\x53\x28\x4e\xf3\x22\xc5\x5a\x7f\xc6\xa0\x71\xc3\x84\xc2\x98\x6e\xd9\xfc\x2f\xb0\x52\xbe\x03\x1e\x2a\x97\xce\x47\x78\xfa\x20\x88\x1c\x86\xc1\xec\x25\x03\x33\xb0\x29\x65\xad\xf5\x47\xeb\x7f\xeb\x8c\x8f\x12\x12\x8a\xf0\xe0\x9f\x2e\x13\x7f\x7a\x78\x81\xec\x41\xb6\x9e\x9a\xc8\x56\x0f\x94\x74\x50\x8b\x1c\x59\x20\xc3\x49\xb2\x4a\xd6\x4d\xb9\x0b\xca\xb4\x0e\x29\x7c\xc1\x64\x79\x66\xab\x83\x0c\x85\x4b\x8b\x81\x5a\x81\xac\x83\x3b\x9a\xc3\xd3\x94\x52\x02\x40\x10\x41\xf6\x9e\x25\xf2\xdb\x44\x7e\x97\xc8\xef\xd1\x56\xf9\xd5\x10\x18\xee\xe1\x45\xe3\xfd\xfa\x1e\x2e\x3c\x66\x7a\x56\x2e\x3f\x1b\x85\x99\x55\xa7\x2e\xc0\xe3\xac\x85\x0d\x4a\x5f\xe3\xa6\x86\x25\xa3\xbe\x86\xcd\xc3\x00\x13\xec\xbc\x8f\x57\x23\xdc\x39\xf5\x33\xd8\x17\x78\x6c\xf4\x3a\x09\x1a\x67\x4d\x71\x4b\xad\xe8\x1e\xa1\xd8\x37\xba\x0f\xa7\xe3\xa0\xe5\xb4\x51\xcc\x40\x61\x45\x6f\xe5\xed\x4e\x2a\x69\x83\xa6\x97\x4c\xef\x74\x91\x05\x89\xc8\x5f\xd6\xc6\xc0\x4b\xfd\x2b\x58\xea\x29\x8b\xfb\x40\xaa\x7e\xf1\x76\x1d\x28\x97\x49\x02\xa2\xf6\xa2\x6c\x44\x47\x9b\x58\xbf\xbe\xd2\xe8\x7b\x82\x56\x4a\x5c\x12\x36\x09\x02\x0c\x51\xee\x17\xf6\xb1\xad\xb5\x38\x18\x21\xc7\x6e\x77\xe8\xe7\xcd\xd5\x83\xd5\xa4\x7b\x6c\x13\xcc\xb4\x33\x70\xba\xd5\x91\x83\x15\x67\x4f\x5b\x5e\x87\xc0\x3c\xfb\xc5\x3b\x08\x2e\x27\x3a\x78\x9e\xc6\xe3\x06\xf6\x32\xfc\x84\xe8\x49\xba\x75\x6b\x8a\x90\x56\x2f\x4a\xdc\x0d\x82\x7a\x52\x73\xac\x1f\xdb\x5a\x15\x74\x1d\xf8\xd9\xf1\xfb\x6b\x0d\xe0\x6f\x01\xb7\x52\xd7\x1b\xa3\x75\x43\x79\xc9\x67\xd6\xbd\xd4\xd9\x44\x18\xe5\xdc\x2a\x40\x05\x1f\x6e\xdd\x05\x79\x38\x2b\x49\x0b\x07\x42\xeb\xd0\x0a\x32\xcf\x1a\x18\x07\x19\x81\x38\x81\xf2\x6d\x2b\x2d\xbc\xfe\x05\x03\x93\x0b\xc3\x0f\xdc\x54\x80\x56\xed\x29\x8f\xec\x2f\xcc\xc9\xf7\xda\x07\x03\x03\xcf\x6a\xaf\x84\xf3\x80\x60\xd3\x24\x74\x60\xcc\xbd\xc9\xf5\x2d\x19\x63\x06\x84\x0c\xd8\x66\x71\x55\x79\x54\xcf\x81\xda\x26\x8a\x1d\x70\xcd\x87\x2b\xfc\xb4\x87\xc2\xfb\x7a\x31\xa6\x68\x50\xfb\x94\x0e\x74\x96\x3a\x84\x12\x44\x89\x24\xb2\xf6\x4e\x7b\x37\xac\x91\x3d\x07\x2c\xd0\x92\x7e\xd3\x82\x5d\x17\x9d\x53\xee\x0e\xa7\x42\xfd\xe2\x03\x0f\xc4\x02\x30\x4e\x54\x34\x8e\x03\x0e\x05\x17\x6c\x44\x59\x23\x5a\x98\x15\x39\xb5\x3b\x08\xdc\x08\x49\x49\x95\x23\xb7\x93\x47\x1d\x00\x2a\xfd\x65\x24\x0d\xb8\x9e\x19\x49\xf9\xb8\xf0\x38\x2b\x81\xc4\xc6\x85\x0e\xc5\x78\xfc\x9c\xcf\xc5\x39\xfe\xee\x5c\x73\xbe\x86\x4b\x14\x9d\x91\xc9\xd9\x76\x72\x5e\xb1\xf2\x00\x3f\xcd\x6c\x04\xdb\xb0\x7f\xee\x4e\x55\x01\xb7\xdf\x17\xc6\x2d\x91\xda\xd5\xfb\x62\x08\xf2\x18\x24\x0f\xfa\x0f\x28\x73\xb3\xb6\xc7\xcc\x53\xed\x1d\x68\x44\xe3\x4f\x26\xfd\xd5\xf3\x76\x13\x97\x91\xc1\xcb\x02\x1f\xcb\xe7\xfe\xfb\x50\x38\x22\x6c\xd3\x09\x3e\x59\x5a\x7f\xef\xb6\x1c\x04\xb5\x61\xc1\x03\xe7\x07\x70\xf6\x1f\x2a\x3b\xd1\x42\xd0\x75\xff\x52\xb3\xd9\x40\x01\x3e\x68\x90\xc2\x57\xc2\x89\xb8\x44\xce\x1e\x5d\x4c\xb0\x0c\x1d\xda\x68\x0e\x4f\xaa\x7b\x11\xab\xfb\x20\xf0\x42\xeb\xd5\xeb\xc3\x7f\x52\xd1\xa2\x8a\xb2\xca\xff\xb6\x52\xbb\x3b\xbf\x17\x11\x7e\x49\xd3\xc3\x51\xa9\x87\x6e\xbc\x2f\x2a\x6a\xd4\xfa\x70\x53\xe2\xbf\x21\x60\xb3\xf4\x9b\x4c\xef\x2a\x0d\x17\xfd\x3f\xbf\x7d\x73\x7e\x71\x7a\x96\xbe\xfc\x2b\x63\x80\x3d\x8d\xff\xf5\xed\xab\x97\xdf\xbf\xec\xe0\x7f\x7d\xfb\xfc\xe5\xab\x7f\xe0\x7f\xfd\x3d\xfe\xbc\x9d\x5d\xcb\x37\x95\xd6\xf2\x3c\xe2\x9e\xe7\x48\x11\x33\xef\xc8\xb3\xf4\x65\x22\x5f\xca\x59\x79\xcf\xed\x8c\xcf\x7f\xd5\x01\xf8\x7c\xf1\xfc\xf9\xf3\xc4\xfe\xf7\x0c\xfe\xfb\x02\xfe\xfb\x7d\x82\x1f\xb5\xef\xf0\x48\xad\x6f\xac\xf7\x41\x92\x68\x5a\xac\x53\xf9\x7f\x11\xc2\xeb\xa6\xde\x80\xb0\xfd\xbf\x85\x80\x5a\x50\xab\x26\x0d\x15\xf6\x35\x41\x43\x6d\x97\x13\xfb\x5e\x57\x37\xaa\x31\x5b\xfb\x4b\x13\xd4\x00\x33\xf0\x0e\x43\xf9\x63\x9d\x16\x34\x19\x21\xe6\x4e\x27\xc8\x84\xfe\xda\xf3\x54\x5e\x2d\x26\xa3\xcb\xd7\x17\x13\x44\x4f\x0d\xb4\x55\x17\x99\x9e\x8d\x4d\x88\xff\xb4\x2a\x4f\x40\xd1\xde\x94\xe5\x47\x1f\x0d\x96\x9b\xb6\x58\x53\x1d\xa7\x42\x3e\x84\x4d\x9b\x3b\x7e\x01\x79\xb4\xa9\xb4\x3e\xe2\xf2\xd3\x5a\x13\x95\xbe\xfd\x69\x56\x6e\x7f\xa0\xc2\xb6\xb6\x02\x52\x18\x5c\x14\xe8\x96\x72\x09\x42\xfa\x64\xb4\x3a\x95\x0e\xd6\xc7\xfa\x10\x08\xfc\x5f\x39\x75\x80\xcc\xb0\xb8\x0c\x89\x20\x70\x5b\xdf\xbd\x86\x25\x5e\x45\x59\x84\x3f\x02\x47\xb6\x2c\x32\xe8\x85\x4b\xe2\xc5\xd8\x71\xf5\x95\x70\xf9\x38\xd0\x25\x30\x1a\x56\xaf\x56\x8b\x3f\x28\x30\xa6\x6e\x35\x08\xd7\xcc\x38\xeb\xc0\x54\xd4\x3e\xf9\x70\x67\x72\x4d\xae\x51\x08\x6f\xa5\x33\xd9\x05\x60\xdf\x0e\xb2\x88\x61\x19\x50\x97\xcd\x19\x40\x00\x20\xdc\x8f\xf4\x10\xbb\x7d\xae\x37\xcd\x11\xf7\x3b\x06\x98\xd1\x99\x67\xb8\x75\x20\x5f\x10\xee\xe1\x2d\x83\xd4\x93\x27\x12\xb5\x5a\x63\x43\xd4\x69\x2e\xa1\x5e\x63\x83\xce\x94\x72\x54\xa4\xf0\xec\xce\xd9\x5b\x07\xf9\xb3\x1e\x70\x47\xe2\xe9\x6d\xb1\x68\xc8\x8e\xd0\x93\xbd\x42\x95\x11\x35\x1f\xda\xf7\x09\x26\xab\x48\x85\x78\xaf\x31\x2a\xe3\x3e\x14\x1f\xd5\x80\x52\x97\x48\x8e\x61\xf9\xe0\xd0\xd6\xee\x81\x9e\xb3\x4b\x30\x90\x4d\xf4\x63\xe8\xe9\xa8\xf1\x67\x11\x3f\xc6\x0f\x52\xe1\x4f\x77\x55\x79\x5b\xa9\xad\xc3\x8e\x2a\xb7\xc4\x39\xc1\xaf\xf2\xb5\x22\x6e\xa5\xe8\xfc\x06\x80\xdd\x01\x09\x87\xb5\xb1\x5f\xb7\x08\x58\x22\x82\xad\xc4\xd2\x49\xd7\x9e\xea\xbe\x41\xef\xf9\x11\x88\x6e\x55\xe1\xb0\x7d\x39\x30\x6f\xef\x67\xab\x72\x81\x47\x0d\xc3\x0d\x98\xc5\xda\x74\x29\x2a\xec\x6d\xa1\xb4\x07\x8a\x8a\xc0\x4a\xb4\x1b\xb4\xab\x0c\x30\x8a\xd9\xeb\x9e\xca\xf7\x1a\xba\xf4\xb7\x5b\x5d\x64\xdd\xab\x61\x8a\xb5\xd9\xc1\xa5\xb2\xc3\xc0\x33\xf5\x00\x86\x3c\xcb\x16\x48\x17\xd5\x4d\x85\xdd\x86\x48\x41\x0f\x71\x98\x35\x43\xe0\xa7\x8e\x29\x66\xea\xd8\x53\xcf\x27\x6f\x80\x99\x68\x3e\x5b\x1e\xa6\x2e\x47\xc8\xae\x82\x3a\xce\x50\x24\xe1\xec\xa9\x54\x82\x6b\x21\x28\x46\x80\xac\xbf\xc2\x55\x94\x41\x96\xd2\xd9\xd0\xbe\x94\x0d\x11\xf2\x64\xad\x48\x8a\xf0\x72\xf7\x80\xb8\x45\x73\x88\x23\x9f\x98\xec\xdd\xab\x28\x3d\x4f\x7d\x62\xa7\xfd\x46\x31\x8e\x3e\x03\xd9\x21\xed\xbe\x29\x64\xd6\x56\x4c\xff\xc5\xc1\x5f\xd5\x20\x98\xfe\x50\xf5\x3e\x45\x90\x04\x71\x9d\x80\x83\x74\xc4\x2a\xf0\x28\x41\x88\x9f\x24\xa8\xa2\x73\x15\xc5\x7e\x1d\xed\xc3\x31\xbc\x85\x4d\x97\x22\xb6\x33\x4d\x80\x71\x41\x79\x49\xfb\xa3\x2c\xb3\x9e\x37\x1e\xa0\xa3\x7d\xd9\x1e\xa5\x21\x8e\x50\x13\x80\xc5\x19\x44\x30\xb6\xcb\x9d\x30\x8d\x37\xe6\xdb\x58\xaa\x37\xd8\x66\xf8\x11\xf3\x0f\x56\xac\x1e\x46\x5e\x11\x7e\xdb\x72\xf5\x90\x0a\x31\x92\x47\x97\x5c\x84\x47\x5a\xfe\x88\x4d\xe5\x73\x27\xe6\x10\xab\xa3\xc0\xbe\x76\x3e\x1a\x7c\x77\xf9\x63\x02\x53\x93\x3e\x77\x6e\xd5\x8d\x53\x28\x3b\x22\x00\x07\x05\x9d\xb0\x06\xea\x36\xe0\x60\x35\xb7\xc7\xa1\x11\xc8\xab\x56\x50\xe2\x8b\xe0\xd3\x71\xdc\xac\x83\x5c\x3d\xd7\x11\xae\x76\xa1\xb6\x76\x61\x77\x3b\x5d\x64\xe6\x13\x16\x4e\x6c\xaa\xb2\x68\x4e\xe9\x3e\xd7\x3a\x64\x13\x11\x6e\x9a\x24\xf3\xad\x74\x72\xfd\x86\x61\x4d\x41\x08\x05\x1a\xb9\x13\x35\xd4\xef\x97\x15\x23\x40\xf6\x16\x90\x7c\x67\xfe\xf7\xb3\x5a\x42\xae\x34\xf7\xad\xd9\xc7\x58\x8a\xce\x88\x21\x38\xd2\xfa\x84\xc3\x94\x48\xc0\x5d\x50\x1c\x26\x08\xe2\x6d\xec\x43\x5c\x35\x36\x65\x15\xe0\xf7\x9d\x37\xa4\xe2\x78\x75\xd7\x22\x09\x41\x34\x36\x90\x38\xe8\x22\x29\x67\xb5\x40\xcf\xb6\xb2\x9a\x4d\x35\x66\x0d\xe8\x75\xbd\xe5\x16\x9c\x66\xd3\x9f\x76\xb9\x62\x19\xe2\xbf\x94\x9e\xc0\x85\x8a\x56\x0d\x07\x7d\x83\x86\x12\x0a\xd7\x8d\xbc\x33\x75\x53\x56\xd0\x95\x32\xd0\x0e\xee\x96\x88\x8f\x4c\x67\x8d\xd0\xc0\xda\x60\xac\x27\x09\x4c\x97\x44\xec\xee\x4c\x5e\xd6\xe5\xee\xce\x3e\x3b\x91\xba\x81\xbf\x40\x5b\x78\x99\x1b\x88\x28\xca\x5d\x59\x1b\x2a\x10\x0c\x22\xce\x5b\x02\xcc\x3f\x9a\x16\xf7\xaa\x32\xaa\x68\x5c\xec\xfe\x08\x22\xcd\x0c\x37\xd7\x5b\x15\x16\xe8\x90\xc8\xc7\xea\x7e\x5f\x15\x0c\xed\xc4\x68\xcc\x60\xfc\xa6\xdc\xc8\xfe\x1b\x92\x0e\x9b\x39\xb2\x33\xaa\x7d\xa0\x18\xdd\x9d\x03\xd2\x92\x5c\xab\x7a\x98\xb0\x5f\x4e\x37\x52\xb9\x03\xef\xbd\x62\x83\x8f\x41\xe4\xf5\xcc\xc1\x55\x09\x2c\xb4\xa1\x19\x41\x0d\x50\xcf\x38\x26\x02\xa6\xa0\xb6\x5a\xd5\x7e\x12\x28\x44\xdd\xf0\xec\x11\xa1\xe3\x2b\xff\xa8\xab\x72\x60\xb6\x2e\x22\xeb\x4e\xa4\x1b\x26\x15\x82\x43\x7a\x42\xf4\xbf\xe9\x8a\x94\x2a\x4d\x5d\x14\x05\xd3\x24\x1c\x01\x63\x87\x5c\xe9\x4f\x4d\x67\xc3\xea\xbb\xb2\x6a\xe4\x4e\xd5\x35\xe4\xc9\x01\x15\xf6\x13\xdd\x7d\x84\xba\xa8\xb1\x09\xb3\x96\x6f\x40\x68\xc0\x93\x04\x3c\xc9\x9e\x9c\xd7\x6a\xfd\xf1\x34\x78\xfa\x2f\xd8\x2c\x19\x6c\x96\x18\xda\xac\x51\xf8\x4a\x78\x3c\xc7\x22\x54\x83\x39\xe3\x6f\xad\x04\xce\xa8\x50\x51\x05\x83\x11\x43\x9f\x7e\x41\x1f\x47\x79\xb9\xb2\x52\x75\xa7\x2a\xab\xdb\x22\x8a\x8d\xae\x9c\x97\x5b\xb5\xbe\x33\x85\x3e\xad\xb4\xca\xa0\x42\x02\xb5\x8f\xab\xa3\x41\x26\x12\x45\x8d\xad\x74\xe0\x99\xe4\xc2\xa5\x3f\x7b\x98\x05\xb7\x64\xeb\xa2\x6a\x24\x3b\xc3\xd4\xa2\x66\x5a\x9a\x0d\x98\x3b\xf7\xbe\x01\xde\x19\xda\x75\x53\x29\xab\xb5\x36\x65\xf5\x60\x0d\x35\x92\xca\xf0\x44\xb3\xc6\x2d\xb4\x3e\x44\x59\x01\x7f\xee\xf1\x06\x12\x24\xb0\xc3\xd6\xea\x2e\xb1\x50\x41\xee\xcc\x27\x9d\xd7\x27\xee\x7b\x3b\x65\x8a\x86\x6d\x55\xd8\x5e\xf8\x66\x56\xa9\x07\x53\xdc\xd6\x27\xa2\x2e\xb7\x5a\x5a\xf3\x23\xdf\x07\xf3\xa1\xdf\xd3\x1b\x13\x0f\x61\x02\x5d\x0f\xc1\x64\x4c\xb1\x6b\x51\xfa\xeb\x4f\x8d\xc0\xe5\x6a\x50\x57\xa0\x21\xca\xa9\x0d\xa7\xf2\xb8\x6b\x4d\xda\xc3\xae\x31\x6f\xc0\xfd\xc3\xe1\xa3\x45\xf4\x68\xe9\x1f\x6d\x4f\x11\x6c\x2e\x38\x41\x58\x39\xef\x0b\xb3\x82\x33\x80\x3c\x06\xf8\x45\x81\x5b\xb8\x55\xd5\xc7\x76\x97\xc4\xa5\x3f\xee\xa7\xbe\xf2\x83\x10\xe1\x70\x5f\x1f\x14\xb6\xd7\x41\xea\x1a\x60\x22\x45\xdd\xde\x50\x35\x4b\xa4\xdf\xad\xe9\x68\x8f\x94\x5d\x00\x92\x29\xc1\x78\xac\x11\x85\x7b\xc6\xe7\xca\x60\x43\x57\x38\x66\xb3\x89\xad\xf8\xb0\x6a\x8f\x29\x56\xf1\x46\xbb\x75\xe0\x53\x66\x1f\x15\xdf\x01\x53\xcb\xb5\xca\x73\x9d\xc9\xa3\xf9\x4e\xfd\xdc\xea\xa3\x54\x88\x09\x96\xbf\x93\x1f\xe0\x17\x1c\x76\xc0\xbe\x36\x1c\x0e\xc5\x19\xb8\x4e\x13\xd5\xe0\x68\x39\x9e\x4e\xd9\xbf\x16\xbc\x7a\x2b\xfd\xc9\x14\x9b\x92\x8e\x04\x3e\x30\x91\x17\x6a\xa5\x7f\xd7\xf9\xd9\xf2\xed\x25\x50\x49\xfc\xee\xf2\x82\x60\x65\x15\x5d\x99\x7c\x2f\xfc\x21\x3c\x5f\x9d\x53\x06\x91\x50\xae\x4f\xd7\x25\xd4\xbb\x43\x6a\xda\xd8\x49\xc8\x77\xab\xcb\x8b\x44\x5e\x95\x75\xb3\x5c\x57\xc0\xf9\x5d\xc9\xab\xf3\x37\xce\x39\x04\x1f\xfd\xae\xdd\xaa\x22\xda\xa8\x54\x86\xab\xd0\x84\xeb\x1f\xec\x8f\x9f\xf7\xd5\xec\x6d\x22\x7e\x37\x7e\x03\xc3\xf9\xcd\xd5\xdb\x54\xe2\x7a\xf6\x3e\xb8\xab\xca\x9d\x3d\xd6\x04\x3b\x0b\xbf\x43\x63\x06\x5d\x06\x46\x55\x16\xf6\x66\x31\x6b\x1f\x36\x16\xb8\xef\x59\x89\xc6\x29\x1d\x28\x49\x0b\xd7\x0b\xdc\x2a\x07\xab\x74\xbe\x3a\x67\x9c\x2d\xfa\x02\x32\xcf\x95\xb9\x6f\xbb\x23\xa1\x14\xde\x6f\x07\x3c\xe9\x04\x21\x7e\xc8\xca\xbd\x43\x2b\xea\xa0\x00\x6f\xf6\x12\x85\x46\x3c\x4c\x84\xe5\x69\x1b\xbb\xd1\x5d\x08\x07\x50\x58\x2b\x6b\x2f\xc8\x2b\x75\xab\x8f\xb8\x18\x9d\x6a\xfd\xd0\xbb\x94\x18\x4c\x02\x17\x0a\x3e\xba\xb3\x3b\x61\x9a\x5a\xe7\x9b\x44\xee\xf2\x16\x69\x29\x85\xef\x1a\xd8\x61\x21\x18\x4d\x15\xe0\x4c\x10\x04\x2e\xcf\x12\x6b\x2d\x99\x1b\x66\xc4\xf1\x58\x3a\x81\x3a\xf2\x68\x39\x98\xae\xd2\xca\xb1\x52\xf9\x01\x60\x50\x1e\x1d\x59\x53\x04\x48\x07\x76\x0b\x08\xff\x01\xf8\x83\xb1\x88\xc2\x8d\x9b\x48\x34\x93\x81\x79\xfb\x0e\x81\xc2\xbe\x12\xc6\x67\x95\xd9\xae\x2a\xb7\xa6\x20\x12\x45\xad\xaa\x00\x40\x14\x06\xf0\xac\xe6\xe2\xc9\x5d\xa5\xd7\xda\x85\x16\x6e\xf4\xad\x29\x0a\x62\x03\x85\x1f\x94\x19\xab\x3e\x60\x41\xe1\x1d\x70\xa6\xfc\x51\xe0\xf0\x60\xa3\x6a\x00\xd1\x82\x4e\x82\xf3\xbe\xea\x28\xd6\x18\x3a\x13\x61\xba\x0c\x14\x30\x5b\x61\x47\x93\x02\x06\x9a\xc9\xdf\x7d\xf8\xbd\x7b\x17\xb9\x2d\x75\x7b\xd3\x16\xa6\xe9\xa9\xe6\xc0\xa8\xe4\x20\x9d\xa9\x61\xa6\xa6\xb6\xca\xe9\x77\x1f\x7e\x4f\xf9\x62\x74\x15\xec\xbf\xd1\xac\xd7\x05\x20\x97\xd6\x41\x3f\x89\xb3\x78\x84\xf3\xb4\xdc\x37\x7a\xbe\x96\x3c\x7e\x67\x0d\x2c\xfb\x6b\x90\x34\x5c\x83\xea\x48\xad\x68\x5e\x02\xf0\xda\xb6\x48\x41\xc8\xf8\xb8\xbe\xcd\xf8\x68\xb4\xfe\x58\x94\x0f\xb9\xce\x28\x25\x74\x94\xc8\x23\x9f\x22\x84\x7f\x4e\x7c\x23\x78\x7d\x04\x29\xa2\xa3\x77\xe0\x1b\xec\x8f\xac\x33\x51\xca\xa3\x2b\x8a\x2e\xc2\xe2\xc0\xd1\x39\x72\xd5\x86\xde\xce\x85\x46\xce\x3d\xf7\x97\xed\xe3\x8d\x09\xe2\x7b\x50\xe1\xb5\x85\xf5\x52\x87\xb6\x07\x81\x30\x03\xc6\x4a\xe1\xcd\x65\x3a\x39\xfe\xd1\x6a\xef\x44\x1d\xd5\x4f\xef\x83\xb2\xea\x5a\x16\xb0\xf0\x65\x68\x2f\xe2\x55\xc1\x22\x33\x41\x26\xe3\x70\xfc\x26\x3c\x0f\x60\x66\xd7\x07\xde\xa2\x2a\x24\x5b\xe4\x34\x70\x89\xe9\x78\x64\x75\x44\x25\x4c\x21\x25\x97\xd1\x77\x71\xc7\x9b\x96\xf0\xb6\x15\xd7\xe0\x78\xde\x07\xe8\x91\x75\xe5\x92\x3f\x04\xa9\x3e\x28\x82\x26\x25\xcf\x66\xef\x81\xd1\x09\x57\x37\x66\x6a\x79\x5f\x1a\xac\x59\xb0\xb6\x45\x51\x12\x97\xbe\xef\xcd\x51\xfe\xde\x76\xa9\x20\x5f\xa4\xf2\xa7\xc9\xe2\xf5\x68\x35\xbd\x94\xe3\xf9\xd5\x87\xe9\xec\x2d\xf4\xd4\x4a\x74\x39\xfa\xc9\x81\xd8\x12\x8f\x23\x5e\x03\x61\x6f\xd1\x0f\x7b\x07\xa5\x7c\xbd\x8d\x4a\x3a\x41\x31\x22\x6a\xc2\xee\xc1\x20\x9e\xc3\xdb\x4e\xd1\xb2\xaf\xd9\x6b\x90\xdf\xae\x11\x05\x4d\xef\x3c\x27\xb9\x13\x18\x9f\x00\xd7\x9d\x41\xfd\x07\x35\x49\xfb\x40\xd7\xc3\x9d\x6a\xea\x12\xb0\x4b\xe0\xe9\xe8\x7b\x8a\xd8\xfd\xf8\xd0\x25\xf2\xf3\x08\x2d\xbe\xd9\x48\x96\x37\x18\x9e\x64\x71\x53\x95\x50\x2d\x2d\xac\xee\x26\xb0\xb8\x4d\x5b\x71\xd4\x67\x1f\x08\x5e\x92\x94\xc8\x17\xf8\x51\xc7\x61\x2c\x5f\x41\x2a\x98\x50\x90\xa2\x61\x5d\xc8\x38\x07\x81\x87\xcc\xab\xf6\x99\x9e\xe8\xcb\xef\xb7\x92\xb9\xaa\x6e\xb5\xd0\x05\x42\x9d\xb7\x90\xb1\x2a\x37\xd1\x30\xda\xba\xc1\x8a\x42\x14\x8e\x03\xad\x23\x2c\x16\x5e\xa6\xfe\x78\xc1\x37\x72\x0d\xa1\x19\xdc\x04\x1f\x5d\x84\x48\x76\x2f\xc4\xe8\x48\xc6\x8a\xcc\xbe\x18\x2e\x01\xdb\x74\x92\xa0\xe4\x78\x2e\x70\xbc\x5f\xa6\x7c\xaa\xe5\x74\x26\x7f\x7b\x3d\x9a\xad\x80\xfe\x9e\xe6\x49\xba\xca\x19\x07\x34\xa7\x63\xb7\x22\xd0\xbc\x0d\x08\x44\x14\x2c\xda\x6e\xe1\x5a\xc3\xcd\xe3\x80\x35\x94\x9a\xfa\x7e\xea\x73\x97\x1e\xc3\xc5\x42\x80\x1c\x68\x34\x51\x85\x3c\x7b\xfe\xdc\x1b\x46\x41\x24\x8b\x03\x95\x74\xb0\x9d\xd5\x10\xf9\xc8\x6e\xb1\x75\x01\x65\xcf\xe1\x79\x80\x22\x84\x7b\xec\xf1\x00\x53\xb0\xaa\xf6\x89\x60\xb6\x09\x28\xca\x66\x63\x45\x61\x11\x7f\xad\xc3\xa7\xff\xd0\xf3\x9a\x6b\x96\x20\x10\xf6\xc3\x69\xe2\xd8\xbb\xde\x3b\x7f\xf0\x46\xad\x3f\xe2\x28\x52\xf9\xba\x6c\xee\x78\x44\xfe\x80\xd0\x78\x44\x30\x1e\x1f\x9f\x80\xab\x57\xc7\x01\x41\x0f\x6e\xce\x67\x74\xc5\x23\xc2\xa7\x0b\x78\x38\xb9\xd4\x38\xdc\xd6\xce\x0f\x0c\x22\xac\xc5\xc8\x73\x74\xe0\x5d\x01\x09\xfc\x4e\xff\x8c\x78\x7c\x81\x45\x54\x64\xd2\xba\xcd\x50\xe0\xe6\x4e\x69\xd6\xe3\xa0\xa1\xd9\xd2\xe4\x8c\x6f\x5f\x45\xd8\x63\x53\xdc\x62\x92\x86\x09\x04\x82\xc4\x8a\xff\x1e\xc4\x46\xf2\xd2\xfa\x25\x30\xe5\xbd\xcb\xf9\x05\x63\xa4\x4c\x99\x97\x61\xd6\x51\xf1\x8d\xc3\x51\xe1\x62\xc2\xe6\x7f\x43\x84\x92\xaa\x8e\x52\xb9\x30\x2e\x4f\xed\x80\xfc\x03\xf6\x9e\x4c\xb9\xa6\x8e\x3a\x87\x1b\xd8\x52\xa0\xaf\x60\x81\x7e\xaf\x11\x99\xa4\x29\x4b\x40\xa0\xd8\x9a\xa2\x6c\x41\x8e\x6d\x4c\xe3\x0e\x16\x88\x1c\x4a\x55\x81\x5b\x0d\xd4\xab\x15\xd2\x65\x3b\x5c\xda\x63\x55\xcb\x2d\x54\xca\xd6\xf0\x6d\xdf\x25\x7c\xc2\x2b\xab\xd6\x90\x54\x0a\x4e\x9c\x15\x91\xa6\x68\x35\x8d\x14\x1e\x69\x0d\xea\xec\x0f\x6a\x0d\x45\x93\xd0\x05\xd1\xbb\xd8\x71\x88\x9f\xdc\xa9\xc8\xd4\xf4\x6b\x1b\xdf\x56\xe1\x6f\xab\xbf\x75\x64\x31\x72\x3f\x61\x3f\xc2\xd3\xf1\x6a\xad\x8c\x2b\xf9\x34\x00\x47\xb2\x1f\x02\xf6\x0a\x81\x5c\xc3\x7c\xa2\x1c\xfc\x14\x64\x2e\x91\x4c\xff\xb4\xd0\x8d\x35\xd1\x45\x5e\x92\x91\x00\x15\x7a\xde\x51\xe3\xc8\x10\x7d\xee\x14\xdd\x5e\x4a\xa1\x00\xaa\x21\xc1\x56\x22\x8a\x52\x5e\xaa\x4c\x84\x9f\x39\x75\x4c\x4f\xf4\x04\x00\x7b\x2c\xd7\xe0\xe8\x79\x3e\xfa\xde\x24\x3b\x46\x7b\x82\xb9\xcb\x72\x63\xef\x45\x54\x7a\x44\xbb\xe3\x88\x59\x28\x76\xbd\xc3\x64\x93\x5b\xe7\x46\x7d\xd4\x22\x6a\x1e\x6f\x33\x0c\x5f\xe9\x1d\x36\x4f\xa1\x5d\x0a\x3e\x49\x84\x12\x6a\x5f\x1a\xef\xb2\x29\xc4\xcf\xad\x02\xa7\x03\xd2\x59\xba\x80\xdc\xbf\xb7\x3c\x7a\xb3\x81\x12\x40\x34\x68\x65\x73\xd7\xf2\xaa\x19\x64\x18\x47\xed\x84\xda\xc8\xed\x43\x5b\x34\x26\x8f\xc9\xe1\xf7\xd6\xeb\x42\x44\x3a\x9c\xaa\x9d\x97\xd9\xea\x8e\x7e\x15\xaa\x88\x76\xfb\x78\x00\x12\x06\xf9\x33\xd5\x2d\x36\x4f\x56\x88\xe5\x90\x7b\x95\xa3\x30\x68\x67\x9d\x87\xae\xbb\x34\xa5\x68\x29\xb5\xfd\x7b\x64\x1d\xbe\xec\x89\x37\x7a\xa8\x50\x2b\x28\x36\xe8\xdd\x11\x01\x18\x9e\x44\x93\x14\xd4\x44\x40\x74\xa5\xd8\xa3\xa9\xd0\xb3\x11\x92\x90\x87\x6a\x6b\x4f\xd2\x9d\xf5\x3a\x45\x00\x43\x8b\x9c\xac\x50\x37\x27\xdb\x5d\x06\xab\x1b\x11\x86\x06\x36\x3b\x28\xf6\x57\xa9\xbc\x9c\x9f\x4f\xdf\x4c\xc7\x23\xca\xd7\x3e\x65\xb4\x2a\xd9\xcd\xce\xf5\x6e\xff\x21\x58\xb2\x9a\xa3\xe4\x2f\xe0\xa1\x2f\xd9\x04\x89\x6d\x58\x3b\x7e\x8a\x49\xc3\x33\xba\xaf\xa3\x38\xb5\x77\x34\x63\xa3\xd7\x25\x69\x7a\xc3\x64\xfc\x74\x10\x7b\x65\x5f\x23\x24\x78\x44\x3d\xce\x4f\x74\x1b\xa0\x7f\x33\x0c\x1d\x32\xc5\x36\xbd\xc6\x55\x24\x01\x8c\x36\x1a\xb6\x3b\xe8\x36\x03\xfa\x2e\x77\xbb\x4d\x83\xc0\x41\xa4\xe6\x82\xab\x9a\x95\xa8\x87\x04\xa4\xd4\x1c\xea\x5b\x77\x1e\x08\x74\x73\x5d\xbb\x9a\x0e\x1f\xaf\x90\xc7\x00\x41\x5b\x44\xaa\x11\x2b\xdf\x4f\x00\x3f\xd7\x7e\xd0\xce\xca\x14\xeb\x06\x24\x1e\xfa\x77\x3d\x6b\x0b\x30\x22\xb1\x64\x99\x72\x42\x0e\xd8\x84\x8e\x52\x2d\x8f\xc9\x4f\x04\x1d\x65\x5f\x23\x30\xef\xf1\x00\xc9\x8f\x62\x9f\x60\x3f\x63\x88\x9f\x4e\xae\x73\x27\xdd\xe9\xde\x7b\xe2\x2c\x05\xc1\x62\x0d\x6c\x57\x1c\x37\x15\x36\xc4\xc3\xe0\xdc\xa1\xa3\xbe\xeb\x18\x3b\xaa\x11\xfc\x49\x24\x2f\xf4\xe9\x67\x84\x04\xbc\x30\xb5\xf3\xee\xfc\x42\x22\x02\x2f\x5e\xdc\x04\x6b\xa2\x2b\x34\x3c\x31\xfa\x52\xbb\xf0\x0b\x52\x20\xc6\x1c\xfd\x01\xeb\x1e\xcd\x30\xce\x29\x1f\xd8\x58\x7b\xb7\x6f\xb1\xa8\x03\x00\x30\x9c\x0c\xdc\xd8\xfb\xce\xd9\x5d\xae\xd8\x38\x24\x57\xe4\x31\x34\x90\x6f\xb8\x04\x17\x3f\x2d\xdc\x64\x10\x0c\xc9\x6a\xb0\x8d\x7e\x60\xfc\x63\xfb\x86\x93\x84\xab\xf0\xc1\x82\xe2\x2b\xb8\x67\xc4\x4d\xb8\x66\x24\xeb\x48\x78\x8c\x53\xb9\x04\xa5\x1b\x2d\x20\x84\xd3\x9a\x00\x2e\x7f\xc8\x08\xed\xcf\x5e\x74\xcd\x55\x87\x5c\x79\x9e\x4a\x17\x65\x21\x7b\xbb\xef\xd7\x0e\xc8\xb6\x09\x20\x3e\x42\x03\xe3\x0e\xe3\xb5\x76\xac\xdd\x6f\x82\x75\x06\x6a\xa1\x93\xf9\x67\x7b\xa8\x29\x41\x4c\x94\xce\x81\x8c\xde\x9b\x0a\xf1\xc6\xde\x68\xb0\x63\x12\x69\xb6\xe0\xe3\x40\xa3\xb9\x57\x59\x43\x5e\x78\xd7\xff\xbe\x35\xf7\x58\x6a\xfe\x05\x0a\xb6\x9e\x5c\x1b\x24\xd3\xf6\x25\x49\x2e\x1d\x08\x85\xc7\xf5\x5d\xf9\x50\x78\x40\xc9\x4c\x17\x59\xbb\x25\xee\x46\x21\xde\x06\x2b\xcd\x59\xfb\xce\x30\x9d\x57\x60\xaf\x76\x3d\x9c\x2e\x86\x10\x83\xb3\x81\x43\xe7\xc6\x5e\x42\xf7\xfa\xbe\xcb\x46\x2f\x49\xe5\x3b\xb7\xa4\x52\x59\x89\x4f\xdc\x3f\x81\x8d\x14\x45\x5f\xa6\xc1\xb8\xb1\x54\x11\x05\x8c\x0b\x9c\xb9\xa8\x5d\x12\x4c\xb0\xa9\xf1\xc4\x52\xee\x32\x03\x32\x31\xd3\x00\xb2\x53\xa3\xb7\x60\x9a\x80\x3a\xe6\x8b\xe8\x9c\x89\x04\x6c\x92\x44\x16\xfa\xc1\x8b\x89\xb8\x9c\x90\x94\x4b\x6f\xb7\x14\x2f\x42\x4f\xe8\x70\xda\xd9\xa1\xd5\x77\x67\x21\xdc\x2c\xba\x2b\x98\x30\x69\xac\x15\x55\x3c\xec\xde\x68\xc3\x91\x8a\xde\x85\xf4\x8e\x51\x30\x42\xb7\x46\x24\x16\x21\xbf\xad\xf0\x52\xc1\x1a\x11\x87\x1b\x9f\xdc\xa1\xe9\x92\x85\xc7\xac\xa1\x2c\xc1\x21\x6d\x8b\x45\x64\xbf\xe9\x6c\x1f\x9b\xcc\x6c\x14\xb2\x12\x4b\x86\xcf\x0f\x21\x73\x00\x08\xbe\x37\xcb\xd5\x21\xe3\xba\xa3\xe7\x72\xf3\x51\x3f\x30\x7c\x62\xf7\xcd\xb5\x78\xe2\x8d\x3d\x95\x68\x1a\xf9\xa0\x6a\xc9\x70\x3e\x1c\x12\xc5\x1c\xb8\xa0\x6a\x35\x7a\x94\xdf\x4b\xda\x66\xef\x26\x97\x5b\x7b\x08\x7b\x63\xa1\x28\x37\xb8\x2d\x58\x45\xa6\x3a\xed\x21\xa4\x2e\xac\x2c\xb3\x3b\x5e\xb3\x79\x19\x07\x1a\x29\x41\x53\x56\xa4\x3c\xc5\x21\xe5\xa9\xbd\x96\x0d\x81\xdb\x06\x14\xe9\x3f\x61\xd6\x05\xf2\x9f\xbd\xab\xd7\x0b\xb3\xdb\x57\x77\x02\xed\xbc\xfd\xc2\x5f\x09\x1a\x02\x3d\x8f\xae\x57\x24\x9c\xfc\x3d\x67\xad\x40\xc9\x57\x04\x4d\x17\x0d\x35\x33\x81\x1f\x18\x20\xa7\x80\x4d\x67\x87\xdb\x19\x18\x17\x7b\x65\x7e\x68\x78\xe0\xd0\xb2\x31\x76\xa6\x17\x03\xba\x68\x40\x00\xf6\x4e\x9a\x17\x61\x38\x74\x53\x21\xdf\xbd\xeb\x9d\x02\x46\x64\xa8\xd0\x71\x4d\xb9\x64\xfd\xd7\x0c\x84\x11\x60\xfb\x73\xae\xd0\x07\xd5\x45\xd8\x52\xc2\xeb\x42\x0f\x14\xe2\x32\x95\xe7\x1a\x3c\xce\xe1\x3d\x8a\xf2\x1c\xae\xf6\x91\x3f\x17\xf0\x13\x71\xd0\x5e\x1c\x30\x62\x52\x21\x66\xa9\x3c\x2f\xc9\x33\x22\xd3\xad\xd8\x4b\xfd\x09\xec\xce\x5b\x3f\x36\x48\x02\x1c\x18\x02\x4c\xb9\x14\xeb\xb2\xd8\xe4\x66\xdd\x20\x4f\x99\x8f\x42\x15\xfb\xfe\xa2\x3b\x73\x61\x1e\x6e\x51\xb1\x1f\x8c\xf9\xfb\x50\x4d\x4f\x62\x39\x08\x38\x2b\xdc\x87\xaa\xf4\x6a\x82\xc3\xd2\x45\x06\x86\x07\x58\x99\x3f\xb7\x2a\x87\xba\xa0\x7a\xa8\x00\x2b\xa8\x99\xb3\x82\xdd\x45\xbf\xa8\x08\xd1\x75\x07\xba\xf3\xe2\x23\xce\x0d\xda\x26\xe8\xd8\xfb\x1a\x27\x4c\xe9\xda\x81\xa0\xb5\x87\x11\x2c\x37\x42\x65\xad\x4c\x2e\x80\x12\xab\x12\x9d\x0b\x63\x65\x7f\x96\x45\xa7\xcd\xc3\xcd\xd6\xcd\x01\x6d\xde\xd9\x6a\xf6\x74\x06\xd4\x36\xca\x3b\x7a\x30\x03\xbd\x45\x0e\x47\x90\xa2\xe1\x2c\x9d\x3b\xa4\x61\x98\x50\x7d\xe9\x90\xc6\x28\x06\xdd\x82\x44\x61\x9d\xf3\x00\xc5\x19\x6e\x24\x2c\x64\x6f\xbf\x6f\xf6\x50\xd9\x62\x05\x39\x80\xd8\xe8\xfa\xf4\x34\xe4\x9b\x15\x0e\xc7\x00\x1e\xb2\xd3\x1a\x4b\x82\xf4\x83\xc3\x6a\x76\xf9\x61\x5f\x90\x12\x30\xc1\xa9\x42\x96\xd5\xad\x2a\xcc\x1f\xb1\xd5\x94\xec\x5c\x6e\xf1\xc4\x6a\x7e\x9f\xc2\x83\x60\x8f\x2b\xa1\xe8\x2d\x0b\xd5\x89\xd9\x4f\xb5\x3b\x8c\x1a\x62\x33\x40\x86\x99\xf5\x5e\xe8\x99\x2b\xb3\xe8\x8b\xc2\x7d\x91\x6b\xb1\xf0\x6b\x9d\x38\xb4\x47\x0a\xf1\xa4\x26\x7c\x44\x02\x83\xee\xa0\x18\x90\xf3\x82\xba\x49\x83\x01\xf7\x6a\xc9\xd0\x5d\x85\xdf\x1d\x2a\x1c\xcb\x28\x43\x78\x1c\x04\x71\xc2\x3e\x3e\x6e\xad\x38\xc1\x93\x55\x68\x4a\x8b\x5b\x6b\xaa\x13\xf0\xcd\x2b\xad\xb2\xbd\xbf\xe0\x8a\xa2\xb1\x5c\xaf\x14\x66\x4b\x20\x5a\xca\x1a\x3e\xdf\x0b\x37\x0e\x7b\x31\xcb\x0a\xf6\xd5\x8f\xc2\xf5\x77\xb8\x27\x50\x6e\x9e\x09\x6b\x15\x76\x61\xdb\xe3\xa6\xef\x54\xbe\x11\xe5\x86\x3c\x7f\x06\x86\x01\x9b\x0a\x2e\xc6\x8f\x10\x59\xe2\x5f\x12\x16\x17\x7a\xb9\x39\x2c\x97\xf5\x48\xa1\xc4\xd5\xac\x4d\x23\x02\x2f\xc1\xc9\x11\x67\x9a\x78\x8d\x8e\xe5\x84\x19\x31\x22\xf1\xa3\x28\x5f\x8c\x67\xf1\xb8\x3e\x89\x8d\xd8\xe3\x7e\x26\x86\x4b\x28\x6e\xe2\xb8\x0b\xe8\x49\x31\xe8\xb0\x98\x0a\x1c\xc1\x3a\xb0\xd2\x98\xa2\x1f\x2b\x8c\xbb\x78\xe8\xc1\xb5\x65\x58\xd5\x01\x2d\x83\x8c\x06\xe3\xf9\xe5\xeb\xe9\x6c\x3a\x7b\x2b\xcf\xe7\xe3\xeb\xcb\xc9\x6c\x15\x85\xaf\xb6\x37\xa6\xe8\x98\x3f\xd8\x6d\x84\x90\x53\xf4\xb3\x27\x0b\x56\x13\xd1\xf5\xaf\x98\x6e\x37\x48\xc5\xbd\xa2\xba\x55\xdf\xf8\xe3\x83\x6e\xb5\x97\x54\xc2\x05\xb8\x38\xee\x6d\x38\x56\x63\x47\xaa\x9c\x2d\x43\x8b\x3e\x6c\x58\xe0\x07\x44\x14\xf6\x70\x53\xb1\x96\x06\x8f\x80\xed\x5b\xea\x08\x82\x2f\x86\x95\xb1\xee\xa9\x82\x85\x23\xad\x58\xe6\xaa\xf7\xad\xfd\x1f\x0b\xf9\x4e\x7a\x77\xd7\x31\x86\x4c\x25\x0e\xe8\xdb\x95\x9b\x27\x3f\x1f\x68\x58\x20\x07\xc8\xba\xd1\x5e\xdf\x21\x17\x8f\xe0\xd3\xda\xbc\x31\xbb\x5c\x0b\xcc\x72\xad\x55\x3e\xb4\x42\x0e\x21\x96\xec\x6d\x22\x34\xad\x4d\x71\x4b\x75\xa3\xde\xd1\x02\xd8\x2f\x7e\xec\xd0\xc3\x7c\xc9\xb7\xbd\xd4\x10\xd0\xb0\x97\xd3\x43\x91\x30\x12\x5f\x22\x90\x1c\x25\x48\x37\xa1\xdd\x09\x85\x20\x7c\x4e\xda\xc2\xfc\xdc\x82\xa0\x50\x59\x46\xae\x65\x20\x64\x0d\x60\x70\x89\xa0\x44\x26\xe9\x05\x52\xdc\x96\x53\x13\x1b\x5f\xaa\x30\xe6\xe5\x54\xab\xd9\x20\x1e\x1a\x58\xfb\x3a\xaf\xb5\x54\x3c\x06\xb4\x2d\x53\x79\xc9\xc3\x86\x19\xaa\xec\x0f\x6d\xdd\x84\xe5\x42\xb1\x96\xe6\x03\xfb\x65\x6b\xa1\x13\x36\x70\xe6\x37\x1e\x00\x68\x72\xb2\x46\x58\xef\xfc\x07\x01\x51\xbe\xbf\x81\xc9\x5a\x0f\xb8\xf4\xf4\x46\xc1\x5a\x7c\xe8\x52\x70\x15\x22\xf8\xc7\x07\x83\x03\x3f\x3a\x67\x50\x7c\xe1\xdd\x03\xa5\x43\x8c\xf4\xdd\xfb\xb4\x88\x7c\x9d\x00\x21\x32\x23\x8b\x3c\xcf\x87\x5e\x11\x9b\xe4\x20\xf0\xbe\xb3\x02\xef\xe2\x62\x32\x86\x38\xbd\x9c\xbf\x19\x92\x7a\xd4\xf5\xc9\xc8\xf7\x25\x31\x51\xa3\xf1\xdd\xf3\xf5\x8b\xec\xa0\x30\x1c\x28\x08\x4f\xa8\x83\xd3\xab\xa4\x08\x48\x33\x6a\x71\x0d\x1a\xfc\xc2\xdd\xf1\xef\xe9\x5f\x4c\x57\xb2\xec\x4a\x83\x9c\x7c\xe4\xc9\x0c\x09\xd3\xa0\x52\xa2\x6a\xf3\x81\x21\x58\xb1\xdc\x4d\xdf\x06\x8e\x61\xd4\x41\xe9\xd8\x92\x7a\xb9\x5d\x5e\x60\x42\x64\xf5\x43\x77\x35\xe1\xa0\x7f\xa9\xf2\x2b\x1c\x72\x27\x85\x62\x9a\x98\xc5\x6e\x68\x9d\x9d\x71\x8b\xda\x02\xd9\x23\x06\x65\x23\x36\x24\x35\x08\x7a\x53\x21\x3c\x40\x16\x47\xf2\x79\x7d\xe2\x5d\xe9\x4f\x52\xf8\x8e\x93\xa1\xe5\xc2\x42\xc3\x28\x77\xf4\x7d\x2a\x47\x6f\xdf\x2e\x26\x6f\x21\x75\x24\xdf\x4f\x57\xef\xe4\x74\x76\x3e\xb9\x9a\xcc\xce\x27\xb3\x95\x7c\x3f\x5f\xfc\xd3\x52\x88\x11\x64\x3c\x4d\xae\x86\xc2\xfe\xa0\xf9\x9b\x3a\xe8\x6d\xad\x43\x2d\xed\x10\x94\x3a\xe0\x49\xc2\xef\x18\x17\x7c\x26\x94\xfd\xb5\x5a\x14\x73\xeb\x9a\xad\xe9\xb2\x22\xba\xcb\x28\xa9\x43\xd5\x56\xc2\xd7\x5d\xab\x42\x1e\xa9\xdb\x5b\xbb\x10\x8d\x3e\xe2\xf4\xc2\x00\x3f\xa0\x37\xb6\xc2\xa9\x51\x55\x37\x54\x84\x03\x45\xe8\x96\xfa\x5a\x10\xf7\x85\x99\x07\x37\xdd\x2f\x3e\x03\x36\x07\x88\xd8\xec\xcb\x22\x83\xea\x28\xd1\xb9\x5f\x58\xd3\x8a\x2d\xe7\x00\x2e\xd7\x89\x49\x75\xee\x8d\x2a\xa4\x9b\x48\x12\xd5\x55\x75\xe8\xd1\x58\xd2\xfb\xfe\x4b\x27\xc4\xdd\x03\x3c\xf3\x2a\x32\x9a\xf8\x06\xe3\x81\x8e\xe4\x6e\x1c\x7e\xca\xd8\x7d\xce\xee\x0f\xd2\x08\xd2\x27\x06\xe5\x4b\x68\xd2\xd8\x41\xe5\x9e\xef\xd2\xa8\x83\x32\x83\x5e\xc2\xce\xe3\x41\x86\xeb\x40\x69\x0c\x85\x16\x85\x35\xb8\x79\x58\xd6\x70\xa8\x74\xbc\x32\x51\x24\x3a\x8c\x56\x93\x29\x41\x86\x44\x19\x57\x05\xdd\x54\x6a\xfd\x51\x77\x9a\x9f\x5c\xbb\x5b\xf8\x0a\x17\xbf\xb1\x02\xa1\x2a\x0b\xb3\xee\x30\x7f\x73\xf5\x4b\x27\x43\x8c\x7d\x70\xc1\xb7\xac\x16\x23\x1a\x1d\x8e\x58\x12\x9e\x3a\x55\x43\x97\x45\x50\x7f\xd5\x1b\x2a\x4c\x15\x99\x02\xdd\xe0\xf0\x1a\xff\x2a\x95\xab\xc5\x68\xb6\xbc\x80\x6b\x2c\xc4\x2a\xe8\xfd\x40\x08\x73\x2e\xdd\xf4\x7d\xea\x61\xb6\x24\x91\x75\xe9\x3c\x96\xb0\xc2\xd1\x3f\xc7\x11\x53\x0d\xa4\x89\x5d\xde\xc2\xd9\xd3\xa9\x5c\x80\x92\xb1\x17\x6d\xc0\x5e\x45\xb3\x2c\x78\xb8\x2f\xf2\x22\x58\x53\x39\xe0\x16\x99\xaa\xd7\x23\x5c\x27\x22\x74\xb6\x1c\x24\x7c\xf8\x68\x3b\xae\x20\xd8\x32\x6c\xf2\x70\x3e\x97\xcb\x06\x9c\x11\xe2\x82\xc3\x2e\x48\x33\xd4\x70\xf6\xa1\x33\x00\x15\x0e\x41\x0c\x5a\xc3\x1c\x7d\x8c\x0d\xad\xba\x9f\x1a\x60\xc3\x84\xed\x72\x11\xd8\xe5\x43\xc9\x77\x28\x2e\x0b\xc1\xf1\xdd\x5c\x26\xc5\x2d\x94\x02\xf9\x72\x82\x58\xae\x70\x2d\xde\x81\xc9\x97\xc1\x28\x49\x25\x3a\xff\x40\x4e\x0b\xb1\x56\x35\xc9\xeb\xcc\xd4\x0e\x8a\x47\xde\xe8\xe6\x41\x93\xb0\x0b\x9b\x92\x0e\xbd\xad\x37\x2c\x08\x9b\xb3\x1d\x5a\x05\xaf\x4d\x86\xbf\x0f\x55\x2b\xd6\x85\x56\x26\x47\xf1\xe5\xa3\x51\xdd\x44\x80\xf9\x82\x55\x18\xc7\xb9\xa3\x02\x72\x7c\x7b\x28\x0a\x8f\xdd\xf9\x07\xfa\x87\x7e\xa6\xca\x7f\xe2\xec\x44\x20\x80\xf0\x7e\xe7\x60\xe8\xe0\x41\x1e\x44\xa4\x71\xd5\x5f\xe8\x92\xe0\x55\xff\x75\x2a\x57\x93\xc5\xe5\x74\x46\x57\x3d\x2c\xb1\x0d\x5b\xba\x13\xe9\x48\x4f\x51\x82\x1d\x2a\x5c\x46\xfe\x76\xa9\x6a\xe1\xd1\xdb\xdc\xa1\x1a\xec\x29\x2c\xf6\x52\x35\x8d\xde\xee\x02\x56\x2a\x86\x08\x71\xaf\x17\x87\x5f\x8f\x0d\xa0\xf7\xa5\x21\x0f\x17\x16\x22\xc6\xe4\xf3\xe0\x97\xd6\xaf\x15\x7d\x1c\x57\x9f\x3b\x0c\x61\x62\xa1\x76\x07\xd2\xde\xf6\x76\x79\xe8\xd4\xde\x05\x6c\xa8\x6e\xaa\x72\xd7\x0f\xaa\x29\x22\x1c\xec\x1e\x1e\x81\x09\x70\x51\x33\x79\xac\x4e\x3c\xe4\x1f\x16\x73\x53\xfe\x5d\x15\xd6\xf6\x6e\x4c\x37\xd3\x4d\x8f\xe1\xc8\x0f\x95\xa2\x6e\x4c\x11\x4f\xb9\x8e\x06\x06\xbc\xfe\xf2\xf8\xe6\x04\x24\xa2\x2a\x74\xd1\xd8\x57\xf5\x0c\x1b\x7a\xf8\x46\x99\x1c\x62\xc2\xf6\xbe\x50\x1d\x69\x17\xf8\x55\x70\x47\x51\xc8\x64\x01\x3d\x0c\x08\xf9\xd5\x94\xf2\x3b\x42\x91\x0d\x52\xe0\xba\xae\x19\xa2\xf2\xb2\xac\x34\x46\xd8\x7a\x4b\x28\x7f\xc9\x12\x06\x33\x12\x87\x26\x04\xf3\xe0\xea\xea\xee\x4c\xe4\xa1\x99\x90\xc1\x64\x30\x54\x8b\x85\x97\xae\xe4\x0c\x2a\x96\x89\xbb\x29\x0b\x1c\xdc\x83\xe7\x45\x1c\x73\x77\xa0\x35\x91\x4e\x58\x21\xa9\xa6\x37\x5c\x57\x8f\x0d\xa0\xbc\x9d\xc1\xc2\xea\x5a\x05\xf3\x32\x5a\x5d\x58\x43\x18\xce\xce\x25\x80\x28\x20\x2f\xc4\x2a\x06\x6f\xdd\x0f\xa3\x1a\xf7\xda\xb1\x43\xf0\x58\xa7\x62\x40\x85\x53\x8c\xdc\xda\x11\x9d\x85\x60\x23\xcd\xbd\x00\xa6\x09\x45\x8a\x03\xf7\x6e\x1a\x0f\x06\x1e\x05\xa1\xf3\x00\x03\x19\xb1\x23\x9b\x70\x9f\x83\xed\x4f\x78\xd2\x10\x25\x74\xbe\x51\x3f\x31\x82\xa1\x0d\x97\x74\x71\x93\x84\x3a\x3a\xd0\x78\x8c\x27\x5c\x0b\x87\x42\x43\xd8\x26\xcf\x53\xf9\xe6\x7a\x75\xbd\x98\xc8\xc5\xe4\xa7\xe9\x92\xfd\xee\xd5\xbb\xe9\x52\x5e\x4c\xc7\x93\xd9\x92\xa0\x98\x00\xac\x6a\x00\x48\x4a\xba\xc2\xfa\xfa\x4e\x16\x1a\xc0\x3b\x10\xa6\xbc\x63\x19\xc8\xb7\xb3\x6b\x71\x18\xf2\x8a\x0e\x8d\x3d\x83\xd6\xc4\x30\x5b\x86\x28\x29\xf4\x83\x7f\x14\x63\x2e\x12\xab\xa1\x30\x85\xac\x77\xa6\x32\xbe\xfb\x8b\x8a\xbb\xef\xb9\xe6\xc8\x9a\x3f\x68\xb5\x01\x82\xb1\x29\x64\x06\x35\x91\x10\x99\x45\x50\x10\xfb\x0a\xb1\xab\xca\x9b\x5c\x3b\xe0\xe2\xb5\xae\x0a\xc8\x54\x6a\x49\x10\x59\x0f\x0f\x0f\xe9\x6d\xd1\x02\x4c\x16\x03\x04\x7d\x93\x0a\x31\xb1\x4e\x76\xa7\x00\x31\x40\xcb\xc1\xfc\xba\xa2\x2c\xd1\x6d\x6b\xea\x3b\xf2\x3f\x6b\x9f\x02\xe5\x88\x9d\xef\x99\x62\x86\x65\xc6\xe1\x0c\xa5\x06\x7e\xa7\x5b\xf6\x18\x18\x04\x47\x65\x25\xb0\xc6\xd2\xde\x9f\x7b\x06\x19\x09\xba\x5d\x4c\x93\xf8\xab\x0e\x46\xc2\x8e\xaf\x50\xd0\xb4\x76\x08\xba\x97\x8a\x9b\x5d\x34\xce\xb1\x41\x07\x9c\x45\x14\xd9\x8e\x86\x80\xa9\x44\x97\x44\xf2\xb9\xfd\x63\x70\xd6\x6a\xbb\x4c\x95\xda\x34\x27\x9c\x6a\x38\x74\xe8\xfa\xeb\xe5\x0e\x3d\x0e\x66\x6f\x1d\xe4\x68\x89\xfb\x3a\x8e\x8d\xe2\xf5\x5d\x59\xd6\xd8\x2f\xc9\x5f\xc1\xea\xc6\xbf\x7c\x78\xa2\x0b\xb0\xd0\xdf\xce\xaa\xfc\xb4\x87\x2a\xfc\x4c\xaf\x4d\xc6\x0e\xe8\xa6\x6d\xac\x5c\x0c\xae\x4e\x6c\xea\x05\xb8\x4a\x54\x8e\x0b\x0f\x7a\xe6\x80\x21\x3d\x28\xb9\xdd\x00\x68\xe7\xe1\xb6\x4d\xe5\x4a\x05\x43\x79\xe3\xa9\xb6\x61\x41\xac\x99\x02\xeb\x81\x4f\xe7\x6f\x70\xf6\x28\xae\xac\x3d\x3b\x4b\xe5\x62\x82\x62\x02\xba\xc1\x8e\x2e\x55\x5d\x5b\xa9\x73\xd9\xe6\x8d\xa1\x08\xee\xb8\xcc\x73\x75\x53\x22\x4e\x90\x5c\x9a\x46\x1f\x41\xb6\xeb\xe8\xf2\x72\x8c\xff\x3c\x09\xda\x3f\xdf\x97\x55\x9e\xc9\xf7\x26\xd3\xe2\xbd\xbe\x91\x60\x20\x52\x76\xc7\x21\xb2\x7a\xb5\x02\x1a\x0d\xfd\x72\xf4\x19\x6a\x57\x28\x5c\x07\xdd\x1a\x1b\xb5\x36\x39\x16\x33\x92\xa6\x82\x96\xd4\xa6\x84\x6a\x68\x32\xdd\xe1\x31\xa9\x1c\xf1\x52\x3e\x98\x8f\x86\xb6\x8b\x3e\xbf\x56\x05\xf4\x49\x83\x1b\x5f\x70\x06\x35\x6a\x87\xac\xa0\xa1\x65\x24\xbf\xbc\x12\x47\x82\x17\xe1\xe8\x84\x13\x04\x3e\x22\x58\x9b\x46\x07\xab\x52\x6b\x72\xa4\xfb\xf3\x6e\xee\xda\x5a\xf8\xb3\x4a\x65\x57\x76\x6d\xed\x33\x52\x21\x8e\xc6\xe3\xd3\xd7\x1f\x4e\x97\xa3\xb0\xdd\xb7\x07\xc1\x19\x30\x57\x9e\x12\xf5\x56\x6e\x3e\x6a\xf9\x32\x7d\xee\x1a\x8e\xfc\x5b\x6e\xf6\xfd\x27\x8c\xcb\x6a\x57\x32\x1a\x14\x38\x24\xa7\x9b\xb2\x3a\xdd\x55\xe5\x06\x32\xd8\xee\xb7\x54\xfe\x19\xd4\x7a\x62\xbc\xb5\xdc\xc8\x9b\xb6\x36\xc0\xba\x62\x0a\xb9\x54\x85\x7c\x53\xa9\x62\x6d\xea\x75\x99\xc8\xb1\xca\xcd\xa6\xac\x0a\xa3\xa0\x7a\x15\xca\xcb\x55\x4d\x37\x46\x38\xc8\xb6\x58\xeb\x04\xf5\x7d\xd1\xe0\x09\x33\x04\x34\xa9\x4f\x5d\xdb\xc5\x9a\x16\x3c\x52\xdf\x1e\x5d\x86\x4d\x22\x95\xe6\x7f\xa8\xc0\x09\x05\xae\x26\x28\xba\xf6\x2c\x19\x40\x8d\x4c\x55\x2b\xdc\xe4\x1b\x5c\xa0\x51\x01\xbb\x64\x6a\x79\xa4\x73\x73\x6b\x3c\x1e\x87\x2b\xd1\x3e\xf2\xdc\x9e\x43\xbc\x89\x17\xa1\x09\x6c\x36\xdc\xbd\xf4\x91\xa4\x0c\x54\x2a\xa3\x6d\xe7\x27\xdf\xff\x3a\x58\x14\xc8\x6f\x14\x90\xad\xc2\x27\x2e\x2f\xc7\x84\x78\xe0\xf0\x25\x72\x70\xe2\x79\x89\xb2\xa1\x89\x4b\x8e\xd8\x0a\xf8\xfe\xf1\xd9\x89\xbc\x53\xd0\x25\xe9\xf3\xd1\x35\x7e\x9e\x23\x05\xb5\x03\xe2\x01\x6b\xfe\xc5\x09\x0e\x1e\x0a\xd6\xc3\xd7\x09\x67\x81\x3b\x44\x4c\x44\xbd\xfc\x15\x65\xe0\xca\x9d\xae\x54\xc3\xfa\x47\xb2\x88\xe1\x54\x33\xef\x1c\xfe\x66\xf8\xd6\x21\x6c\x17\x5f\x1a\xbe\x50\x88\x2c\x68\x7f\x1f\x10\x14\x70\x01\xda\xa8\xbd\x6d\xeb\x86\x86\xf2\xeb\x28\xe8\x00\x8b\x00\xac\xb2\x07\xf6\x38\x95\xa3\xf3\xf3\xc9\xec\xfc\xfa\xf2\x07\xf9\xae\x7c\xf0\x99\xe5\x4e\x80\x1f\x1c\x3d\x17\x13\x16\x62\x35\xf0\x39\xc0\x88\x71\xe1\x7a\xa7\xe0\x09\xa3\x38\x09\xc2\x2f\x61\x33\x4e\x9c\xc9\xf0\xdf\xc7\x5c\x39\xf5\x66\x05\xd4\x88\x21\x45\x49\x27\x3a\x23\xfe\x00\xd1\x3a\xe7\x15\x79\x00\x82\x1f\x84\x08\x60\x4b\xd7\x27\xf2\xc3\x64\xb4\x90\x1f\xe6\xd7\x0b\x39\x1b\x5d\x4e\x52\x79\xe5\x03\x5a\xc6\x33\xe5\x39\xb7\x39\x6c\xd1\x80\x32\x36\xe1\x5a\xcd\x8d\xcf\xba\x0c\x17\x0b\x83\xed\xf9\x04\xdc\x6a\x12\xc2\xad\x32\xa4\x72\x6c\xb9\x74\xa4\xc7\x61\xdd\xff\x23\x06\xef\x8a\x21\xe0\xa5\xc4\xfe\xb8\xd7\x3a\x99\x30\x86\x7c\xb7\x55\x32\x15\xa3\xa8\xae\x33\xf7\x56\x65\x37\x81\xc4\x0e\x8e\x76\xb1\x9a\xe1\x19\xf3\x5e\x1f\xf9\xfe\x37\x38\x21\x43\x63\xed\xf7\x78\x0e\xf5\x73\x26\x8e\x4d\x0d\xaa\x3e\xed\xe4\xd3\x34\xc5\xf1\x1f\xc9\xdc\x14\xda\x33\xd1\xfc\x20\x84\x4b\x38\x0f\x84\x19\x11\xa6\xeb\x62\xba\x5c\xc9\xd5\xbb\xc9\x74\x21\x57\xd3\xd5\xc5\x64\x19\xf4\xbc\xf4\xf1\xa1\xfc\x77\x38\x56\x42\x1f\xed\xf5\x9d\xfa\x4f\x7e\x71\xee\x0e\xaa\x35\x9a\x67\x59\x91\xef\xc5\x9d\xeb\x9c\xd2\xe5\xc8\x6f\x73\x57\x69\x64\x12\x83\x06\x01\x30\xa2\x1e\x4a\x09\x85\x91\x05\x25\x7e\x9a\x12\x30\x6e\x58\xda\xb4\xac\x77\xd8\x5d\x74\x07\x39\xa8\xf8\x2a\x9a\xca\xdc\x5b\xcf\x4e\x07\x18\x31\x0c\xf7\xb9\x2e\x33\x9d\xc8\x87\x00\x02\x53\x60\x82\x93\x2c\xf8\x5a\xfb\xaf\xa1\x7c\x56\x79\xae\x73\xba\x28\x58\x15\x71\x57\x92\x87\x1f\x43\x8e\xba\x08\x4b\x48\x5c\xff\x14\x84\xaa\x55\x94\x90\xbe\xa1\x68\x74\x8b\x42\x25\x7a\xea\xbf\x21\x0c\xef\xff\x99\x3f\xe9\x37\x17\xe6\xc2\xfc\xf6\x74\xb1\xcb\xdb\xfa\xf4\x2c\x3d\xfb\x2b\x63\x7f\xff\x1f\x5f\xc4\xff\x7e\xf1\xfc\xc5\xd9\x8b\x0e\xfe\xf7\xab\xb3\xef\xff\x81\xff\xfd\x77\xf9\x03\x77\x66\xad\xe5\x85\xb9\xa9\xb4\xcc\x5a\xf9\xdb\xf6\xf1\xf3\x8d\x5e\x03\xe7\xcd\xe2\xf1\xf3\xda\xec\xaa\x72\x6d\x9a\xc7\xcf\x56\xf9\x37\x5a\x1e\xd3\x79\xf9\x3f\x4f\x42\x70\xf0\x33\x46\xa8\xbd\xaa\x1e\x3f\xab\xed\x4d\x9b\x6b\x21\xc6\xba\x69\xe8\xf6\xae\xb5\xac\x9f\x81\xdf\xff\x73\xab\xe5\xe3\x9f\x64\x03\x84\x04\xe5\xad\x59\x1b\x9d\x3b\xa5\xfa\xf8\x59\x66\x65\xd1\xc8\x1c\x34\x76\x9b\x2b\x83\x83\xca\xaa\xd2\x34\x22\x7b\xa6\xda\x46\xb7\x95\xdc\x55\x76\x60\xb5\x96\x3f\xb7\xcf\x4c\x2e\x75\xdd\xc8\xba\xfd\x83\x6e\xa4\x6a\x3f\x81\xbe\x85\x7c\xa9\xcc\x95\x3c\x34\x3d\xf1\xe5\xe9\xc9\xe3\xb5\x39\x55\xbb\xea\xf1\x5f\x20\x57\xaa\xf3\xc7\xcf\xf0\xc8\x3f\xff\xeb\x9f\xff\x44\x73\xfa\xf3\x9f\xfe\xfc\xdf\x4f\x1c\x28\xc9\xf9\xe3\x67\xae\x2d\xad\x85\x38\xb7\x16\x7b\xae\x60\xac\xd0\x82\xc1\x0b\x91\xd8\xe9\x6f\x4b\x2b\x52\xed\x5a\xe4\x9a\x69\x87\xb5\x2c\x9e\x99\x22\x83\x15\x6a\x0b\x40\x8f\x86\x68\xd1\xe3\xe7\x0a\x4a\x95\x51\xad\x6a\x6b\x0c\xa9\xea\x07\x21\xfe\xfc\xaf\x10\x20\x7a\xfc\x9c\x59\x9d\xf1\xe7\xff\x2e\x7f\x18\x5e\x37\xe9\xd6\xad\x6e\x2b\xfb\x11\x5e\xf6\x44\x82\xa3\x6d\x4d\x19\x6c\xb7\x2b\xb4\xc8\x1e\xff\x3b\xda\x5c\x6d\x53\x56\xa6\xb6\x73\xde\xa9\x4a\xae\xb5\xcc\x74\x55\x18\x5d\xd9\xd1\x23\x32\x0e\x40\x05\xf5\xe7\xf7\x23\x8f\x8c\xcc\xa4\xb6\xfa\xaa\xb1\xf5\x86\x12\x0c\x41\xf4\x87\x50\x97\xed\x56\x37\x4d\x65\x3f\x16\x2e\x43\x5b\x04\xbd\x07\x10\xa1\xb9\x2e\xa2\xc1\x08\x38\x60\xb5\x8a\x3e\x05\x47\x88\xed\x7b\x3b\x67\xd5\xfa\xc3\xa9\x6b\xae\xff\x7f\xfc\x5c\x3d\x7e\x46\xac\x18\xbb\x43\xfe\xb5\x42\x33\x8a\xa8\x3d\x77\x9d\x87\x77\x16\xc4\xbe\x0e\x16\x24\xbe\x02\x9c\x1d\x83\x4d\xc1\xe0\x2f\x9c\xe1\xee\xef\x85\x9d\xb9\x35\xe3\x1b\x99\xe9\xba\x31\xc5\xe3\x67\xbb\x1e\x8f\xff\xcd\xae\x85\x9f\x82\xcc\xe0\xfc\xf9\x07\x20\xd5\xff\x9f\xff\x35\x2e\xcc\xe0\x9d\xd9\x28\xbb\x17\x5a\x66\x8f\x9f\x73\x73\x5f\xe9\x8a\x16\x72\x67\x60\xaf\x82\x87\xfc\xf9\x5f\x69\xa3\xcd\xe3\x67\x3f\x8f\x60\xdb\x7e\x6e\x0d\x34\xe4\x3e\xfe\x4b\xa6\x87\x9f\x62\xc7\x6e\x3f\x05\xe4\xd4\x5a\x58\x8b\x00\x0e\x43\xcd\x2b\xfa\xf8\x19\x1c\x56\x7b\xbc\xa2\x43\xe5\x1e\x00\xef\xb5\xcf\xfe\x7f\xff\xb9\xbd\xaf\x00\x5d\xae\x79\xfc\x7c\xcb\xa7\x15\x80\x1a\xc3\xd3\x95\xc8\x46\xe7\x39\xc8\x8b\xb6\x60\x93\x65\xab\x45\xf6\x0c\x10\x9e\x14\x9c\x40\x0d\xc7\x22\x02\x35\x4f\xe4\x0e\x12\x27\xea\xe7\x16\xbe\xff\xf4\x19\x16\x8a\x25\xd3\xe3\x67\xfb\x2a\xf8\x8a\x13\x4e\xc0\x5d\xd8\x11\x4f\x07\x2e\x8f\x97\x8b\x8f\x9f\x2b\x73\x1f\x2e\x74\xff\x40\x48\x2b\x71\x73\x78\xa7\x9d\x7b\x5b\xf8\xfd\x81\x56\xb4\x4a\x0b\x92\x33\xfe\xab\x2d\x7c\x8c\xff\x89\x15\x06\xf6\xe3\xb0\x77\x55\x99\x59\xcb\x10\xda\xc3\xf9\x1f\xb9\x92\x4d\xd9\xa8\xdc\x4a\x4a\x01\x5f\xd7\x7c\x48\xcd\x76\x57\x56\x8d\xf5\x92\x06\x4e\x4a\xf7\x15\xe1\x89\x89\xba\xbc\xbb\x43\x87\x05\xb2\x9b\x95\xe9\x5a\x6e\xcc\xfa\xce\xe8\xaa\xb6\x67\xbf\x5a\xc7\x67\xa9\x6c\xa5\xb6\xa7\x5e\xe3\xf2\x14\x65\x7b\xaf\x55\xcb\x5f\x91\xf4\x0d\x3b\x31\xbe\x1c\x76\x2d\x44\xbc\x16\x83\x93\xd1\x81\xc8\x71\xd0\x3c\xac\x50\xb2\xee\x11\x13\x62\x59\xb6\xb5\x84\x0d\xad\x10\x85\x3f\xde\x6b\x27\xfe\x51\xe2\xb3\xc0\x22\x59\x0a\x12\xc7\x4d\xbe\x2d\x08\xe7\x7c\x0d\xd8\xb6\x1e\x94\xda\x1e\xd2\x1c\x75\x19\xa0\x19\xe8\x7b\xe4\x80\xca\xed\xc6\xd9\xb7\x35\x76\xf0\x32\x7b\x86\x77\xcb\x5e\x85\x5a\xd0\xe5\xaa\x5b\x73\x0f\xe0\xea\x1d\x35\xf0\x03\x37\xf4\x9c\xc9\x2b\xd8\xee\x4a\x87\x9b\x5f\xe9\x68\xf7\x0f\x2e\xd8\x8f\x8e\xa3\x52\x4e\x3e\x3d\x7e\x5e\xb7\x80\x93\x81\xcf\xa1\x53\x5e\x7d\xdd\x93\x24\xc7\xe4\xd7\xee\x99\x2f\xd1\xc6\xff\xda\x27\xe0\x76\xc5\xf6\x87\xbd\x88\xb8\xd8\x56\x4c\xd4\x20\x1e\x01\xe4\xc6\x6e\x53\x65\xac\xae\x51\xb9\x46\x29\xe0\x7f\x97\xd9\x5f\x6f\x77\x75\x2a\xc4\x05\x2e\xaa\x75\x51\x08\x57\x04\xcf\x88\x93\x5e\xde\x0e\x79\xfc\x93\x1d\x67\x24\x69\x49\x2e\x05\x3a\x23\x6b\xc1\x69\x92\xfd\x43\x6d\xcf\x88\x95\x38\x32\xb3\x27\x0c\x45\x7b\x6d\x4f\x97\x9d\x2c\x10\xd5\xc5\x9b\x0d\x4c\xb2\xd6\x7c\xa9\xe0\xd8\x45\xfd\xd5\xa9\xbc\x88\xce\xdb\x4e\xb7\x56\xbb\xd7\xb5\x71\xe3\xd3\xd1\x71\x10\x76\x91\xb6\x3b\x75\x6b\x35\x4b\xf6\xac\x85\xb6\x91\x0d\x9e\xb8\xf8\x1b\x07\x47\x0f\x0b\xb8\xa9\x14\x20\xfc\xee\x76\xf9\xe3\x67\x90\xa8\xa6\x82\x86\x6c\x2b\x92\xd0\xf6\x59\xeb\xf6\x93\xb4\x1f\x2b\x0b\xc8\x09\xd7\x52\x6d\x20\x31\xc6\xd3\xab\xe8\xe6\xdc\xe3\x87\x3a\x4b\x96\xd2\x0e\xd3\xf0\xfc\x5a\xdd\xab\xdc\xc0\x43\x0a\x67\x13\x64\x2d\xe8\xf5\xe0\x65\x0e\x94\xe3\x3c\xd8\x26\x21\x2e\x74\x70\x0f\x61\xb1\x82\x49\x67\x1e\xf5\x31\x9a\xb0\x5d\xa6\xbe\xb0\xb3\x82\x92\x25\x78\x82\x1b\x18\x88\x07\xae\x06\xc5\x4b\x1a\x01\x87\xe1\x45\xd5\xb5\x0c\xae\xe6\x45\x20\xbf\x83\xa9\x76\x37\x8b\x69\xa3\x4d\x45\x12\xac\x89\x94\xcb\x0b\xb9\x34\x91\x2a\x50\xf2\xf1\xb3\xbd\x49\x5e\x07\xe4\xe1\x02\xc0\x9b\x74\x61\xed\x03\xdc\x0b\x42\x79\x4c\x60\x93\xaa\xc7\xcf\x68\x9d\xae\xb5\x00\x7b\x63\x7d\xa7\xd6\x1d\x99\xed\x9e\x5c\x93\x69\xaf\x64\xa1\x20\xb9\x84\x7b\x0c\xbb\x83\xda\x99\x9e\xfd\xa3\x10\x2f\xe5\x85\xae\xed\xc8\xac\x31\xdc\x00\xbb\x60\xcb\xbf\xae\xed\x60\x6a\xbb\xaf\x8f\x9f\x1b\x80\xed\x77\x17\xd0\xab\x7b\xb8\x06\xaa\xfa\xb9\xb5\xe2\x4f\x33\xbc\x9f\xc6\x5f\xdc\x2a\x47\xbb\xde\xb2\x22\x56\x8d\x15\xf4\x0d\x98\x77\x90\x74\x55\xe8\x86\xb8\x85\x2a\xe0\x84\xdd\xeb\xa2\x11\x3b\x55\xd3\xea\xf3\xdc\xf0\x51\xf6\xac\x57\x66\x6b\xff\xd9\x31\xf2\xd7\x4f\xcc\xa6\xd0\xa2\x2e\x0d\x42\x13\xfa\x9a\xcc\xda\x3e\x60\xe8\x50\xc9\xe0\x50\xd9\x15\x2d\x1e\x3f\xf3\x49\x3e\x4b\x63\x97\x46\x88\xf1\x1d\x81\xf1\x1a\xe7\x6c\x04\x7b\xcb\xe7\x3a\xf6\x09\x62\xf5\x84\x77\x4b\xb5\x12\x0c\x9b\x9d\xb1\x57\xca\x54\x5a\x90\x9d\x0d\x28\x43\x65\xd1\x55\x29\xb2\xd6\x79\x59\xc0\xb9\x7e\xda\xde\xb1\xd2\x49\x74\x8e\x9b\x7d\xa5\x61\x03\xd4\xbf\xe1\x2b\x9f\x28\xc0\x62\x8b\x4d\xa5\xc1\xb5\x43\xdf\xd1\x2d\x42\xfa\x97\xad\xd6\xb0\x1d\x55\xb6\x22\xfc\x85\x17\x02\x81\x13\x03\x73\x55\x75\xdd\x6e\xad\x04\x78\x56\xde\xe4\xe6\x16\x6d\xa1\xec\x99\x2e\x62\x51\x2b\x02\xa9\x97\xd0\xcc\xb7\xaa\x30\x8f\xff\x52\xe1\x35\xbc\x6f\x61\x93\x9a\xaa\x34\xb5\x79\xfc\x97\xad\x96\x2a\xb7\xae\x81\x42\x3b\x0a\x72\xf6\xb9\x06\x28\x43\x38\x2a\x2f\x52\x39\xb6\x72\xa3\x41\xe2\x76\x7b\x56\xd8\x61\xdd\x6a\x40\x9b\x2a\x1f\xff\x9f\x78\x01\xea\xb2\xbd\x53\xa6\x89\x94\xc0\x97\x0e\x28\xb5\x77\xa0\x8b\x12\x7e\xd8\xce\xdb\xda\xc4\x06\x7f\xe1\xb5\xf4\x9a\x46\x05\x5c\xe9\xca\x90\xd0\x30\x39\x5c\x13\x5d\x59\x37\xc5\x5e\x3f\x26\x9c\xc5\xb5\x8a\x25\x29\x9e\x8f\xc1\x83\x9c\x80\x69\x91\xb7\x20\x14\xa2\xd3\xe3\x4f\x5a\xf2\x35\x27\x2f\x92\xab\xc2\x0f\x3a\x15\xe2\x3a\xb4\x62\xc1\xcd\x81\x9a\x26\xf6\x1a\xc8\x94\xdb\x7c\xd9\x3d\xf7\x8b\x24\x0e\x2e\x92\x15\x4b\xa0\xa4\xec\xa2\xd4\x74\x16\x54\x5e\x9a\xca\x8f\x12\x66\x9e\xca\x69\x6e\x27\xaf\xeb\xc6\xce\x7d\xfb\xf8\xdf\xac\x11\xc1\x57\x45\xa3\x56\xf6\x4e\xdc\x40\x18\x00\x9d\xee\xfa\x94\x26\xa7\x2b\x32\x69\xc4\xff\xdc\xdc\x3a\x07\x20\x5e\xcb\x49\xec\x7a\x6b\xe7\x7b\x0f\xae\x05\xce\x84\x7f\x81\x66\x32\x34\x08\xb7\xf7\x8f\x9f\xb5\x80\x9a\xc3\xaa\x41\x81\xcd\xfe\xe5\xc1\x72\xa2\xb2\x95\xf9\xb3\xf9\x4e\x17\x72\x89\x16\xce\xb4\x30\x8d\x81\xe8\x79\x22\x38\x48\x55\x18\x70\x36\xac\x32\x8f\x62\x49\x18\x32\xd8\xee\x54\x05\x09\xf2\xc7\x3f\xc9\xb5\xb6\x26\xfa\x01\x99\x95\x88\x1a\xf3\xbb\x6d\xa3\x41\xfa\xb0\x76\x31\x45\x66\x0f\x6d\x51\x36\xd6\x5d\x2d\x9a\xc0\x1e\xc0\x6c\x77\x97\x90\xd7\x47\xe4\x9e\xcb\xe3\xf1\xd5\xc5\xe9\x59\xfa\xfc\xc4\x1b\xe6\xe3\xb2\x68\x2a\xd0\x99\x6e\x99\xc2\x18\x03\x2e\xd9\x58\x8f\xa7\x17\x17\x89\x4b\x39\xbd\x48\xcf\xe4\xf1\x78\x62\x7f\x78\xfa\x22\x3d\x3b\xf1\x36\xf9\x64\x9d\x9b\x5d\xad\xbb\x83\x38\x95\xf7\x38\x80\x49\x67\x00\xaf\xe4\xa4\xad\xca\x9d\x56\x85\xbc\x2e\x4c\x6f\xf4\xfe\x95\x67\xf6\x95\x93\xeb\xab\x0b\x79\x9f\xda\x7f\xb8\x27\x7c\xfb\x44\xdc\xdf\x4d\xfe\x85\x3c\x86\x4f\x5d\x5d\xdc\xbf\x70\xdf\xfc\xee\x6b\xbe\xf9\xd2\x7f\xf3\xe5\x89\xeb\x7d\x0d\x22\x37\x75\xcf\xcd\x03\x03\x19\xe2\x72\x8d\x6f\xc1\x87\x1c\x44\xdb\xc4\xa1\x28\x89\x91\x1b\xcd\xbe\x6e\x14\x95\x8a\xa3\x58\x70\x31\x21\xb7\x06\xc3\xea\xc6\x72\xa4\x95\x84\xee\x71\x71\x54\x01\xee\x3c\x3b\x8f\xae\x9d\xed\x12\x6d\x21\x19\xd8\x42\x42\x5c\x38\xa7\x54\x16\xcf\xbc\x1f\xba\x06\x97\xca\x67\x41\xb9\xe2\x0b\xb5\xcd\xcf\xde\xd3\x04\x69\x9c\x3d\x6b\x1b\x93\x9b\x5a\x57\x10\xc8\xd9\xf6\x5f\x24\xb3\x70\x6e\xe4\x00\x90\x59\x64\xcd\x3e\x28\xa8\xae\x3b\x2e\x0d\x01\xac\x1a\xfb\x58\xa8\x52\xba\xd7\x05\x14\x10\x05\x76\xb7\x6b\x8d\x7a\xcb\x06\x9d\x10\x4b\xd5\x6e\xd8\xb6\xc2\x15\xb6\x92\xa9\xab\x0c\x06\x95\x39\xba\x2d\x34\x7f\xb6\x11\x13\x61\x97\xb7\x32\x35\xcc\x4a\x37\x72\x67\x55\x5b\x5e\x93\x5e\x5d\xff\xdc\x5a\x03\xb8\xad\xe8\x6a\xf7\x62\x5d\x89\xfd\x8e\x55\xda\xf6\xe1\x02\x59\x1c\x2b\xd9\x0d\xc8\xec\x5a\x53\xd7\x20\x44\x76\xa5\xbd\xf2\xa4\x2e\x6f\x74\x5d\x9a\x60\x03\xd0\xa1\xc6\x0f\x5b\x19\x54\xa0\x0a\xb6\x87\xb1\xcd\xad\x2d\x6c\x9d\xc6\x75\x59\xfc\x0c\xe6\xcc\x12\xdd\x58\x5d\x75\x27\x0f\x47\xd6\x7f\xd4\x59\x12\x89\xac\x8c\x2e\x64\xf1\x4c\x6f\x77\x8f\xff\x6d\x7d\xa7\xa3\x88\x8c\xc8\x9e\x91\x65\x66\x15\xfc\x33\x90\xf5\x48\x71\xd4\x31\xa8\xd1\x10\x2e\xab\xc6\xf5\xbc\x2c\x10\xb8\x4d\x39\x5b\x23\x72\xb2\xac\xb0\xac\xf8\x13\x39\xba\xdc\x40\x46\x5f\x3d\x7e\xfe\x43\x9b\x01\xb4\x30\xcd\xb0\x40\xd1\xe5\x1d\xf1\xcc\x87\x37\xd8\xb7\xef\x86\x0e\x53\x78\x5d\x30\xff\xc2\x7a\xff\x2d\x1c\x5e\x94\xb3\x8d\x2e\xda\x78\x04\x6d\xf8\xf2\xba\xbd\x31\xec\xbe\xfb\xd5\xc0\x28\x2d\x86\x79\x0c\x76\x78\xd8\x4b\x6b\x97\x15\x8e\x36\x50\x27\xe2\x21\x97\x35\x79\x51\xb9\x5d\x5e\x75\xaf\xd7\xc1\xf0\xa4\x6e\xc2\x08\xa8\xbd\x5e\x7b\x59\x97\x85\x0f\x56\xd4\xae\xa1\x60\xf1\xf8\xb9\x36\xb9\x51\xe4\xa9\x0e\x68\x12\x5c\x4c\xfc\x98\xd5\x72\x40\x4d\xa2\xad\x4f\x8d\xea\xf8\xf1\x5f\xd8\xb4\x1d\x78\xa3\xf0\x4b\x68\xd7\xa8\x2c\xd0\xac\x80\xc5\xb6\x3f\x24\x96\x11\xf4\xe6\x43\xb1\x13\x0c\xba\x6e\xcc\xae\xcd\x71\xd0\x2b\xd6\x67\x89\xac\xc1\xeb\xcc\x1e\x3f\x6f\x54\xdb\x90\x7a\xac\x2a\x73\xcb\x81\x6a\xeb\x34\x3e\x7e\xce\x15\xa8\xc8\x97\xcf\xe5\x1f\xca\xb6\xaa\x29\x96\xbe\xab\x8c\x3d\xee\xb0\x87\x85\x32\x75\x0d\x72\x80\x36\xd9\x59\x2c\xba\xe0\xc7\x27\x18\x5f\xb6\xd6\x7d\xfd\x4c\xdd\xda\x69\x43\xff\xfc\x16\xac\x6e\xfa\x8c\x08\x77\x20\x8a\x0c\x65\x9a\x83\x88\xa9\x10\x57\xce\x99\xe0\xb1\xd7\xed\x4d\xfd\xf8\x19\x4a\x90\x58\xaa\xc0\x0e\x50\x8f\x06\xe6\x8b\x22\x89\x07\xcf\x2f\x1e\x3f\x43\x65\xbe\xf5\x9d\x20\xc8\x01\xbb\xe0\xc7\x00\x47\xe4\xc0\x20\xa8\x3e\x9a\x95\x54\x14\x4e\x84\xc3\x3d\xd6\x45\x83\xfe\xbe\x55\x4a\xd0\xf7\x63\x65\x86\xba\x05\xaf\xdb\x25\xbd\x12\x09\x10\x99\x7b\x08\x02\xe2\x01\xed\x27\x80\xc8\x2d\xb2\x47\xe8\xb6\xd0\x89\xb5\x2e\xef\xa1\xb0\xd5\x6c\x36\x6d\x4d\x31\x10\x57\xdc\x66\xcd\x4d\x30\x0f\xd1\xa7\xf5\xee\x70\x4f\x13\x49\xf2\xae\x58\xc5\x57\x7a\xad\xef\x2b\x65\x77\xbe\x68\xb7\x8f\x9f\xab\x92\x3a\xe6\x53\xb9\x34\x91\xaf\x60\x97\x2f\x7b\xfc\xfc\x87\xc7\x3f\x71\xee\x23\xd4\x78\x20\xcc\xf8\xa1\xf5\xce\x9a\x61\x1b\xfb\x98\x44\xae\x9f\x41\x40\x4e\xb7\xc8\xbc\x4a\xd6\x30\x7d\x54\xd8\x33\x6b\x85\xa3\x82\xbb\xc0\xd5\xf6\x18\xb8\x3b\x24\x39\x82\xd8\xd9\xfa\xce\x7a\x5a\x68\x65\xe3\x07\x74\x15\xef\x67\x0b\xde\x14\x8f\x4c\xad\x1b\x48\x21\x08\xb7\xe2\xfc\x9b\x36\x6f\xac\x4a\xd1\xad\x15\xc0\xaa\x85\xb8\xdf\x5a\xd5\xb1\xf3\x05\x6f\xe6\x77\xc2\xb3\x31\x23\xe1\x4a\x69\x83\x57\xe7\xe4\x73\xb8\xd3\xe4\x8b\x64\xcf\x8d\xfd\xfc\x21\x5f\xaf\x73\x64\xdb\x42\x6e\x4d\x61\xea\x06\x75\x43\xcb\xf0\x3a\xf5\xd6\x21\x27\x62\xfc\x55\xb8\x4b\xb8\x2d\x2b\x95\x07\xc1\x71\xe6\xfb\x5a\x57\x8f\x9f\xed\x59\xd4\x85\x9d\x76\xd3\xd2\xb6\xe5\x25\x9a\xc4\xcf\x46\x75\xad\xb7\x37\x90\x61\xc5\x52\x16\x95\x6b\x11\x1e\xdc\xce\x6d\xad\x1e\x3f\xdf\x9a\x4e\xae\x27\xe8\x67\x55\x3e\x8d\xad\x41\xf0\xae\x15\x85\x81\x8a\x46\xd7\x9c\xda\x01\x8f\xce\x5a\x01\x85\x3d\x4f\x41\xea\xbb\xd6\x00\xd5\x6e\x4f\x0e\x92\x88\x3d\x7e\x06\xec\x89\xf4\x80\xcc\x85\xcd\x41\x55\xe2\x13\xd9\x14\x62\x0e\xc2\x7a\x91\x1d\x55\xa7\xd2\x8b\x47\x11\x9e\x61\x77\x89\xc2\x30\x5f\xf4\x5c\x8c\x04\xcb\xa2\xdc\x06\xf9\x61\x7a\x9e\x0c\x63\x72\xaa\xfd\x7a\xd1\xa0\x49\x9c\xa9\x5a\x3e\x7e\x5e\xdf\x3d\x7e\x06\x5b\xcd\x09\x0c\x94\x17\xd6\xf3\x71\x63\xaa\x74\x63\xac\x53\xd6\xb7\xe8\x0e\x58\x72\xb2\x63\xc9\x69\x11\xde\xb5\xff\xd5\x95\x10\xff\x3e\xff\xa4\xdf\xfc\x1e\x9c\xb4\xbf\x45\xdd\x0f\xff\x79\xba\xfe\xe7\xf9\xb7\xaf\xbe\x3b\xeb\xd4\xff\xbc\xf8\xf6\xfb\x6f\xff\x51\xff\xf3\xf7\xf8\xf3\xfb\x72\xd7\xf3\xdf\x8f\x7f\x7f\x75\x71\x12\x84\x12\xce\x64\x5c\x31\x0b\xdf\x09\xaa\xec\x53\x39\xca\x73\xee\xfd\xa4\x5e\xda\x2c\x95\xab\x80\x80\xdf\x23\xb6\x51\x08\x06\xb9\x1e\xca\x9d\x2e\x38\x99\x23\xc4\x42\xf7\x90\xc0\xa9\x72\x8f\x92\x4c\xf6\x27\x37\xa6\x60\x0e\xb9\xfa\x00\xa7\x3d\x37\xcb\x03\xea\x10\x16\x02\x42\x17\x63\x87\xc2\x27\x2e\x26\x76\x62\x1a\xa0\x8a\x74\xf3\x83\x10\x67\xd6\x73\x09\x87\x54\x07\x63\x81\x88\x2c\x60\x02\x00\xb6\x3d\x61\x11\x00\x3a\x55\x17\x85\x98\x9a\x1c\x19\xcb\x27\xa4\xbf\xe0\xde\x6a\x3f\x12\xdf\x35\x9d\x0a\xf1\x62\x70\x04\xc1\x12\xf0\x08\x88\x22\xe8\xaf\x3f\x88\x6e\x31\x36\x41\xeb\x21\x80\x67\xcc\x31\x52\xfb\x15\x76\xd5\xaf\xe1\xd8\x53\x21\x5e\xc2\x51\x91\x2a\xb3\x56\x00\x92\x7d\xfa\x6f\x43\xab\x7a\x54\x16\x4d\x7e\x3c\xa0\x80\x68\x48\x1a\x11\x0e\x86\xce\x04\xb4\xe9\x95\x58\xdb\xc9\x2d\x55\x9e\x02\x1e\x60\x7f\x88\x5c\x27\x9e\x5a\x07\x8c\xf4\x07\x21\x8e\xe0\xa0\xe2\x0a\x36\x1e\xb5\xce\x33\xd0\xeb\x7b\x9d\x97\x3b\x2c\xb9\xee\x9e\x7d\x28\x89\x6f\x3d\xfc\xce\xef\xe5\x1c\x39\x8b\xaf\xb0\x50\xdb\xbe\x72\x52\xdc\x9b\xaa\x2c\xb0\xf5\x3c\xe8\xe2\xfb\x63\xb9\xd3\xe9\xba\xdc\x7e\x73\x92\x1e\x39\x88\x26\x7d\xef\x08\xa9\xb1\x8f\x10\x87\x85\x55\xc3\xbc\x70\x50\x70\xcd\xe8\x7a\x85\x34\xc8\x82\x00\x63\x0b\x57\x5c\x1c\x23\xa7\xcb\x60\xa5\x3c\x97\x6e\x9f\x48\x22\xd3\x35\xb5\x5c\xe7\xe0\x15\x98\x5a\x3e\x28\xbb\xca\xa9\x10\xaf\x52\x39\x03\x58\x39\x55\xd7\xe5\xda\x40\xaf\x05\x3c\x15\xde\x56\x56\xfd\x15\x81\xc5\x27\x18\x53\x06\x68\x21\xac\x39\x81\x7c\x8c\xdb\xb2\x71\x33\x73\x3b\x1a\xa0\x9f\xbb\xa5\xe7\x6b\x8d\xdd\x16\xd4\x3e\x10\xc4\xa6\xf0\x14\xf4\xe4\x91\x10\xdf\xa6\x1e\xcb\xae\xea\xdc\x20\xea\x08\x84\xeb\x13\xb0\x63\x75\xef\xb2\x3b\x32\xc2\x1f\x99\xff\xdd\x4e\x0c\x6c\xfb\x71\xa5\x4f\x4f\x06\xa7\x58\x6e\x36\x06\x40\x3a\x60\x0c\x8c\x34\x9f\x95\x21\x9d\x06\x36\x90\x41\x65\x78\x2e\x3a\x97\x23\x15\xe2\x3b\x5e\x48\x07\xd7\x5e\x69\x28\xb8\x01\xbe\xd7\x0c\xdb\x5a\x09\x80\x74\xa7\xd6\x1f\xe1\x87\x0c\x25\x84\x64\x72\x3b\xd5\xac\xef\x34\xb4\xfc\x0e\x0e\xa8\x8e\x53\xf0\x35\xe3\x1f\x21\x54\x02\x91\x41\x39\x74\x22\xbb\x64\xf4\x44\x0f\x0d\xe4\x6a\xa1\x00\xef\x8e\xc7\xc3\xdf\xcd\xd5\x8d\xce\x51\xe1\xb4\x85\x1b\x42\xb4\x62\xa9\x88\x67\x19\xd1\x58\x02\x2f\x95\x07\x88\x83\xb1\x33\x64\x0d\x4f\x99\x68\xe5\xec\xa1\x82\x7e\xab\x88\x25\x89\x02\x27\xd0\xea\xeb\xbb\xa5\xf1\xb2\xd5\x28\xaf\x53\x11\xc0\x85\x08\x01\x7d\xcf\xcb\xf9\x9b\xd5\xfb\xd1\x62\x22\xa7\x4b\x79\xb5\x98\xff\x34\x3d\x9f\x9c\xcb\xd7\x1f\xe4\xef\xe7\x57\x13\x39\x9e\x2f\xae\xe6\x0b\x84\x83\xfa\x2f\xff\x65\xb4\x94\xd3\xe5\xb3\x67\x72\x34\x3b\x97\xa3\xd9\x07\x39\xf9\xdd\xd5\x62\xb2\x5c\x4e\xce\xc5\x7c\x21\xa7\x97\x57\x17\xd3\xc9\xb9\x7c\x3f\x5a\x2c\x46\xb3\xd5\x74\xb2\x4c\xe4\x74\x36\xbe\xb8\x3e\x9f\xce\xde\x26\xf2\xf5\xf5\x4a\xce\xe6\x2b\x79\x31\xbd\x9c\xae\x26\xe7\x72\x35\x4f\xe4\xea\xdd\x64\xe0\x6b\x62\xfe\x46\x5e\x4e\x16\xe3\x77\xa3\xd9\x6a\xf4\x7a\x7a\x31\x5d\x7d\x80\x37\xbe\x99\xae\x66\x93\xe5\x52\xbe\x99\x2f\xe4\x48\x5e\x8d\x16\xab\xe9\xf8\xfa\x62\xb4\x90\x57\xd7\x8b\xab\xf9\x72\x22\xed\x24\xce\xa7\xcb\xf1\xc5\x68\x7a\x39\x39\x4f\xe5\x74\x26\x66\x73\x39\xf9\x69\x32\x5b\xc9\xe5\xbb\xd1\xc5\x45\x7f\x4e\x76\xdc\xab\xa5\x1c\xcf\x67\xab\xc5\xf4\xf5\xf5\x6a\xbe\x58\xca\xd7\x13\x79\x31\x1d\xbd\xbe\x98\xe0\x9b\x66\x1f\xe4\xf9\x74\x31\x19\xaf\x12\x31\x9d\xd1\xdf\xec\xc4\xa6\xe7\x93\xd9\x6a\x74\x91\xc8\xe5\xd5\x64\x3c\xb5\x7f\x99\xfc\x6e\x72\x79\x75\x31\x5a\x7c\x48\xec\x73\xc7\xf3\xd9\x72\xf2\xdb\xeb\xc9\x6c\x35\x1d\x5d\xc8\xf3\xd1\xe5\xe8\xed\x64\x29\x8f\xfd\x92\x88\xa1\x25\xb9\x5a\xcc\xc7\xd7\x8b\xc9\xa5\x1d\xf3\xfc\x8d\x5c\x5e\xbf\x5e\xae\xa6\xab\xeb\xd5\x44\xbe\x9d\xcf\xcf\x97\xf6\xc1\xcb\xc9\xe2\xa7\xe9\x78\xb2\xfc\x51\x5e\xcc\x97\xd0\xbf\x7e\xbd\x9c\x24\xe2\x7c\xb4\x1a\xc1\x8b\xaf\x16\xf3\x37\xd3\xd5\xf2\x47\xfb\xf7\xd7\xd7\xcb\x29\x2c\xda\x74\xb6\x9a\x2c\x16\xd7\x57\x76\xd6\x27\xf2\xdd\xfc\xfd\xe4\xa7\xc9\x42\x8e\x47\xd7\xcb\xc9\x39\xac\xee\x7c\x06\x53\x5d\xbd\x9b\xcc\x17\x1f\xec\x16\xd8\x35\x80\xc5\x4f\xe4\xfb\x77\x93\xd5\xbb\xc9\x42\x4e\x67\xb8\x52\x23\xbb\x04\xcb\xd5\x62\x3a\x5e\x85\x1f\x9b\x2f\xe4\x6a\xbe\x58\x05\x73\x94\xb3\xc9\xdb\x8b\xe9\xdb\xc9\x6c\x3c\xb1\x47\x64\x6e\x9f\xf2\x7e\xba\x9c\x9c\xc8\xd1\x62\xba\x24\xf2\x39\xfb\xda\xf7\xa3\x0f\x72\x7e\xbd\xc2\x66\xfc\x89\x9d\x90\xeb\xcb\xe7\xf3\x99\xc0\x4e\xca\xe9\x1b\x31\x3a\xff\x69\x6a\x87\x4d\x1f\xbe\x9a\x2f\x97\x53\x3a\x27\xb0\x64\xe3\x77\xb4\xdc\x64\x1d\x3a\x89\x49\xd0\x79\x35\x99\x26\x41\xbe\x85\x11\x5f\x7b\x62\x14\x90\x2a\xed\x9d\xf3\xd0\x5d\xb5\x07\x7e\xb5\x0f\xea\xeb\x85\x25\x33\x97\xaa\x26\x90\x37\x9e\xfc\xdd\xe1\x71\x61\x55\x4d\x01\x88\x6c\x6b\xab\x40\x9a\x1a\x58\xb3\xff\xcd\xb9\xa9\xe9\x37\xdc\x60\x78\xfa\x22\xfd\xf6\x6f\xe3\x04\x3e\xed\xff\xbd\xb4\x9e\x5f\xc7\xff\x7b\xf9\xe2\xe5\xd9\x3f\xfc\xbf\xbf\xc7\x9f\x2f\xf7\x5f\x63\xfb\xf5\x8b\xf4\x5b\x39\x5e\x4c\x46\xab\xe9\x4f\x56\x4e\x5f\x5e\xce\x67\xcb\x48\x5e\x4f\x97\xc2\x4a\xcc\x91\xbc\x18\xbd\x97\x6f\xa6\x8b\x4b\x90\x5d\xe7\xf3\xc9\x12\x24\x29\xe9\x2f\x79\x31\x79\x3b\xba\x70\x82\x32\xb5\x5a\x01\xe5\x3b\xc8\xfc\x0e\xe0\x87\xfb\x36\xbc\x79\x22\x47\x33\x39\x5a\xad\xe6\x8b\xd9\xe4\xc3\xe9\xf8\x62\x6a\x25\xf1\x62\x82\x58\x6a\xcb\x77\xd3\xab\xb4\x3f\x42\x7a\xed\x12\x15\xea\x74\xf6\x66\xbe\xb8\x24\xfd\x62\xc5\x9b\x3c\x1a\x2d\x4f\xa7\xcb\x23\xf9\x7a\xb4\x9c\x2e\x07\xbe\x7f\x39\xfa\x27\x18\x42\xa8\x04\x17\x93\xb7\xa3\x05\xc8\x50\xd0\x92\xc1\x33\x59\x49\x27\x38\x77\x52\x78\x4b\x2f\x89\x41\x6f\xb1\xc2\x59\x4c\x96\xd7\x17\xab\xe9\xec\xad\x78\xb3\x98\x5f\x82\xb6\xbb\x5e\x4e\x52\xc1\xbd\x91\xd6\x0a\x98\x00\xb2\xa3\x3c\x1e\x2d\xe5\xf9\xe4\xcd\x74\x66\x0d\x80\xc9\xc5\xfc\xfd\x49\x64\x13\x5c\xcf\xce\x27\x0b\x18\xcd\x6a\xb2\xb8\xf4\xc0\x29\xdd\xe9\x88\xab\xeb\xd7\x17\xd3\x31\xaf\xaf\x3c\x3e\x1a\x8f\xaf\x2e\x8e\xac\x7a\x38\xa2\x9f\x1d\x9d\xa4\xd2\xbd\x16\xdf\xb1\x9a\x8c\x57\x68\x78\x8c\xe7\x57\x1f\x16\xd3\xb7\xef\x56\x76\x7e\xdf\xcc\x17\x02\xd4\x86\x1c\x5d\x5d\x5d\x4c\xc7\xa0\x97\x2f\x46\xef\x53\x50\x1b\x4e\x4f\xd0\xa3\xf0\x93\xab\x77\x76\x0b\x97\x72\x74\xbd\x7a\x37\x5f\x4c\x7f\x1f\x8c\x7d\xba\x14\x3c\x2c\x50\xd1\xfc\x26\x7b\x9c\x70\x1c\xef\xa6\xaf\xad\x32\x4e\x85\x78\x6d\x0d\x9c\xc9\x62\x8c\x8a\xca\xbe\x0e\x3e\xbb\x94\xab\xb9\x7f\xa3\x5b\x9d\x77\x13\xab\xa2\x3e\xcc\xaf\xe5\x68\x3c\x9e\x5c\xad\xd0\x48\x7a\xbb\x98\x4c\xe4\x6a\x2e\x5e\x4f\xe4\xeb\xf9\xf5\x0c\xe6\xd7\x5f\x41\x1a\x12\xae\x09\xfe\x63\xbe\x90\x6f\xed\x51\x58\xc2\x23\xed\xcf\xf1\xe5\xc2\x2a\xe0\x11\x6c\x91\x7d\x23\xa9\xe4\xe5\xf4\x7c\xc2\x16\xcd\x1b\x6c\x33\xc6\x51\x8c\x66\xe3\x89\x53\x8a\xf8\x52\x3b\xae\xf1\x7c\x76\x3e\x85\x03\x9d\x72\x4b\xd5\xb9\x0e\xda\x8a\x54\x2a\x8f\xc6\x04\x79\x7a\xaf\xe5\xfb\xb2\xfa\xe8\x89\xc4\xad\xf5\xeb\x79\xb7\x21\x39\x66\xca\x0c\x00\x9c\x4d\x5d\xb7\x00\x68\xd7\xdc\x95\x79\x79\xbb\x97\x65\x25\x74\xb1\xde\xaf\xc1\x4f\x31\x8a\x90\x03\x98\x96\xf1\x7d\x80\x4b\x8d\x50\x8e\x8d\x55\xb4\x01\xe8\x35\x9a\xba\x21\x59\xa4\x0a\x10\x4e\x1c\x0d\xb1\x57\xb3\x09\x28\xf9\xc6\x34\x2d\xd1\x53\x1c\x80\x1b\x0d\x81\x31\x09\xfc\x32\x41\x6c\x77\x4c\x12\x80\x96\x06\xde\x99\xb5\x5f\x07\x68\xfd\x4f\xe5\x08\x1d\x00\x82\x7c\xa2\xb7\xe9\x5a\x28\xd9\x59\x33\x04\xf0\x21\x27\x35\x82\x5d\x3c\xf7\x38\x9b\xf0\xc1\x63\xe5\x91\xc8\x81\xbe\xe9\x44\x30\x08\x09\xb3\xf9\x0f\x10\x25\xdd\xa4\xf2\xa8\xf3\xa4\x78\x9b\x88\xbc\xa6\xdd\x51\x5b\x3f\xbc\xcb\x3a\x86\xd1\x0f\x54\x91\x09\x5c\xca\x5d\xa5\x4f\x1d\xb5\x07\x81\xb0\xfa\x8d\x0e\xe0\xfa\x12\xeb\xfe\xc0\x96\x07\xb8\xf9\x89\xcc\x2a\xb5\x55\x0d\xe1\x4b\x24\x62\x63\xd6\x98\x66\xe1\x9f\xc8\x6d\x89\x65\xea\x66\x1d\x22\xbf\x40\xd9\x32\x40\x11\x13\x17\xba\xdd\x0a\x1f\x70\xa2\x30\xdb\x4d\x65\xd0\x37\x86\x3d\xce\x98\xb2\x39\xe1\x16\x76\x9c\x02\xb8\x40\xfd\x53\xe6\x70\xc4\xd7\xaa\x6e\x12\x01\x53\x81\x1a\xf7\x0c\xbf\x9f\xa9\x1d\x80\x50\x11\xfe\x1d\xe1\xd6\x0c\xee\xb3\x0c\xf7\x59\xfc\xb2\x7d\xee\x6c\x6a\x7f\x4f\xdf\xd0\x07\xd4\x7d\x69\x32\xc6\xb2\xc9\xca\xf6\xa6\x01\x7a\x4f\x42\x11\xc3\x8b\x63\x47\xc2\xdb\x60\x2d\xc9\xb2\x26\xca\x89\x0a\xd7\x53\x04\xeb\x09\x1d\xd8\xfb\x62\x7d\x57\x95\x8c\xff\xc1\x1e\x22\xdf\xc2\xc6\x6c\x75\x76\x5a\xe9\xdc\xc3\x96\xd8\x17\x94\x40\x64\x66\xb6\xc0\x48\x78\x04\xcf\x30\xc5\xed\xd1\x89\x43\xa7\xfa\x85\x13\x16\x9d\x43\xbc\x4e\xe5\x11\xfe\xab\xac\x42\xcc\x96\x00\x2b\x97\xe9\xf9\x08\xc9\xa4\xdc\x20\x79\x11\x8f\xdd\xa1\x20\x88\x88\x32\x2d\xe6\x73\x97\x52\x66\xa9\x3c\x9a\xb3\x0f\x3f\x02\x90\x9a\x2f\xbe\xf0\xe1\xae\x24\x36\xae\xcc\xbd\x30\x15\x42\xa7\xf2\x28\xbc\x6e\x11\x58\x9d\x83\xab\x81\x08\x49\x48\x1f\xb8\x81\x55\xea\xa0\x36\x74\x01\x41\x53\x21\x36\xa9\x3c\xfa\x50\xb6\xee\x32\x17\xc3\x83\xc3\x02\x15\x08\x70\x1e\xc4\x44\x14\x08\xed\x86\x70\x51\x9e\x02\x83\x80\xe8\x68\x56\x83\xeb\x86\x27\x80\xaa\x5e\x99\x37\xef\x3d\x08\xff\xb2\x92\xfc\x58\x07\x18\x47\x78\x91\x43\x50\xad\x92\xf7\x17\x82\x74\x38\x68\x7d\x18\xc6\x51\x66\xba\xde\x01\xf6\x48\xc0\xca\xc5\xb8\x79\xa9\x10\xb7\xee\xc4\x68\x39\xc9\x99\x63\xc8\x6f\x84\x0f\xc3\xde\x99\xdb\xbb\xd3\x5c\xdf\x43\xd5\x21\xa1\x9a\x92\xe5\x09\xb1\x46\x51\x03\x1e\x2f\x86\xd0\xdc\x20\x49\x57\x98\x75\xc8\x74\xd6\x78\x1a\x2b\x3f\xd2\x1f\x42\x43\x36\x11\xde\x92\xc5\xa8\xfa\x1b\x65\x2a\xe0\xf6\x5c\xc0\x54\x53\x39\x43\x3e\x1b\x7c\x66\x90\xb7\x00\x8c\x8b\xc6\xaa\x26\x88\x63\x56\x3a\x6b\xa1\x87\xcb\x6c\x4d\x03\x30\xa3\x95\xae\x9b\xca\xac\x9b\x00\xdc\x4e\xaa\x0a\xb7\x1e\x56\x79\xa3\x10\x81\x20\x21\x08\x9c\x5a\x21\x48\x0d\x0a\x45\x78\x10\x03\xf7\x52\x04\xd8\x35\x7b\x75\x61\xac\x39\x8c\x5b\x3e\x60\xe5\x57\x16\x11\x25\xe6\xea\xc1\x3d\x57\x04\xd9\xf0\x5c\x3d\xd4\x18\x7b\xe7\xad\x79\x5b\xa9\xa2\x49\xe5\xb2\xc5\xc0\x23\x41\xd6\xe1\x51\xeb\x40\xac\xf5\xd0\xca\x78\x2f\x84\x15\x79\x37\x7b\x04\x48\xa9\x01\x58\x17\xa4\x72\x9e\x3d\x98\x4c\x27\xb2\x2a\xf7\x2a\x6f\xf6\xa7\x1b\xc0\xa2\x28\xca\xe2\xd4\xcd\x2b\xb1\x27\x71\xa7\x01\x31\xf5\x78\x53\x56\x88\x0b\xdf\x56\x91\xec\x0b\x26\xe0\xa6\x78\xe2\xb6\x25\x38\xad\x88\xee\x8a\x2b\x65\x0a\xe1\x75\xa7\x63\xc4\x03\xb5\xfd\x03\xd8\x4e\xb0\x85\x61\xb2\x04\x6f\x4d\x53\x86\xe8\x3e\xa1\xec\x6d\xca\x88\x96\xb4\xa3\x5e\x38\x79\x32\xf4\x54\xe4\x86\x8a\x11\x8a\x10\x9e\x3b\xb2\x44\x6a\xd7\xe3\x76\x03\xc3\x23\x82\x41\xc2\xff\xa7\x67\x76\x64\xb7\xfd\xce\x1a\x3e\x1d\xa0\xd1\x78\x58\xc8\xdd\x5d\x59\x94\xa8\x61\xec\x06\x26\x2e\x13\x82\xe5\x18\xf9\x1e\x36\x00\xd4\xb1\xfb\x09\x40\x37\x75\x7f\x6a\xef\x1e\x5e\x5e\x42\x0b\xbe\x35\x0d\x30\x62\x64\xa6\x44\x9b\xc3\xd1\xd0\xf8\x15\x5b\xe7\x6d\x06\x51\xf3\xfe\xf4\x07\xa6\x9e\xfd\x6f\x35\x8d\xee\x3a\x3b\x05\xa5\x91\x78\xef\xcb\xfa\xff\xe1\x29\xfd\xff\x83\x10\x06\x00\x86\xec\xf0\xe0\x11\x0b\xb8\x25\x76\xc2\xd7\x70\x9b\x5f\xe7\xaa\xf8\xa8\x1b\xbe\x6e\x75\xea\x65\x1f\x64\x64\xea\x58\x42\xa0\xa4\x46\x70\x22\x58\x5a\x18\x0a\x31\xbe\x07\xcc\x07\x65\x25\xef\x8d\x42\x8f\xc0\xbd\x9b\xee\x4c\x5d\xae\x8d\x6e\xf6\xe2\x58\xa7\xb7\xa9\x1c\x2d\xc7\xa3\xab\x44\xbe\xbe\x9c\x26\x72\x39\x59\x8e\xc6\x27\x7c\x95\x19\xb4\xae\x89\x88\x53\xdd\xd3\x1c\xe9\x10\xaf\xaf\x08\x7f\x8b\x0f\x7f\xd0\x37\xd6\xc8\x3b\x09\xed\x9b\x54\x08\x63\x52\x79\xa9\xd7\x77\xaa\x80\x05\x5b\x90\x10\x2d\x32\x60\xbd\x6d\x81\xca\xd8\x2d\xd4\x5f\x7b\x45\x60\x9b\x3a\x6b\x01\x38\xc8\xcc\x00\x97\x09\xa0\x31\xa7\x29\xbc\x83\x5c\xc0\x9b\xf2\x93\x1c\xdd\x5a\xff\xa9\xb7\x3c\x56\x0d\x04\x27\x17\x04\x23\xdd\x69\x22\x82\x66\xc7\xe2\x08\x51\xc8\x18\x16\xf3\xa4\x43\x5f\x01\xc0\xd0\xa1\x7c\x06\x4e\xfd\xbc\xb6\xab\xc1\x40\x78\x6c\xff\xdc\xec\xe5\xd9\xf7\xf2\x7a\x39\x76\x94\x86\x67\x67\xdf\xf2\x2a\x5f\x2f\x83\xfc\xfd\x68\xdd\x10\xc5\x57\xc4\x73\x68\x0a\xf2\x33\xfe\xd0\x56\xa6\xce\xd0\x3b\xa8\x4f\xd0\xe0\x79\x8f\xdb\x66\x35\xda\x97\xf6\xe6\x89\x4b\x22\x86\x8c\xe4\x9e\x77\xf1\xe4\xe6\x4a\xde\x5c\xf1\xcb\x8f\xfb\x69\x67\x8b\x71\x3b\x97\xf6\xfd\x93\x4f\x80\xe5\xad\x4f\x12\x71\xf0\xa8\xb3\xd0\xf8\xba\x43\xed\xf6\x4e\x1c\xdc\x3b\xf9\xd4\xde\xbd\x1a\xda\x3b\x71\x70\xef\xe4\x81\xbd\x5b\xb9\x6a\x00\x9a\x3c\xf9\x5a\xac\x3a\x33\xa6\x27\x01\x2e\x65\xe2\x30\xa9\xb6\xaa\xa9\xdd\xba\x16\xe5\x03\x52\x1b\x59\x5b\xc7\x6e\x20\x62\xaa\x65\x88\xad\x0b\x4c\x84\xf1\x2b\x42\x40\x7b\x77\x17\x81\x2b\x07\xdc\xd5\xa8\x37\xd9\xea\x08\x05\x05\xd8\xeb\xbb\x82\x10\xc5\x0b\x0d\x75\xb2\xd5\xfe\xb0\x8e\xe7\xba\x83\xee\xa0\x53\x31\xca\x1d\xf7\x87\x35\xaa\x3d\x50\x3a\xc3\xb8\x45\xc6\x64\xa5\x25\x19\x31\xae\x68\x05\xf2\xdd\x0b\x32\xe9\xb0\x7d\x7a\x15\x20\x9e\xf1\x63\x4c\xe1\x36\x8b\xd8\xf5\x01\x59\xcf\xbd\x6e\xab\x32\x2d\x82\xeb\x8b\x79\xf7\xad\x69\x3c\x6e\x9b\x37\x85\xab\xe0\x75\x68\xa5\x7c\xe8\x31\x3c\x24\x5e\x99\x91\x16\x0c\x7e\x42\x67\x32\xf1\x32\x18\x3e\x06\x07\x36\xdf\xb3\x1c\x0e\xc2\x0c\x45\x40\x86\x73\xc0\xc5\x40\xc3\xc6\x51\x28\xd1\xae\x0a\x07\xd8\xe7\xc8\x36\xae\x0b\x03\x4f\x5f\x68\x2a\x8c\x99\xfa\x7a\xbf\x4d\x09\xd0\xff\x5d\xc7\x45\xdf\xeb\x6a\x2f\xf0\x41\x91\x9a\x8f\xfc\x5e\xfb\xee\xaf\x5b\x00\xf1\xf4\x02\xf0\xfa\xf8\x75\xb5\x67\x03\x5c\x3e\x22\xc3\x2b\x6b\x24\xa0\x22\xa7\x2f\x30\x67\x30\xda\x90\x37\xf8\x51\x67\xeb\x1f\xf6\xcc\x68\x55\x2a\x8d\xcd\xb2\x4d\xfd\x4c\xb8\x43\x4c\xb3\xa3\x03\xca\x67\xc9\x1e\x41\xd8\x8c\x78\x7c\x1e\x96\x3f\x50\x95\x6e\x3f\x3e\x6a\xbd\xe3\xb2\x0f\x85\x11\x0e\xc7\x91\x8a\x14\xc2\xa8\x35\xba\xa4\x11\x25\x57\xe5\x70\xa6\xb9\xdc\xc8\x07\xe4\xab\x00\xf9\x1d\x8e\xe0\x17\x9e\x3e\xf1\xe4\xe2\xfb\x25\x75\xcc\xb2\x70\xeb\x4b\x28\xf3\x56\x56\x04\xa9\x1a\x0a\x7c\x00\x9b\x19\x22\x87\x65\x2e\x89\x66\x3a\xac\xf3\xf1\x61\x11\xe8\x81\x2d\x40\xf8\x53\xfe\xd0\x11\x0f\x1e\x74\xe1\xe5\x88\xf9\x2e\x42\xd9\x15\x20\x52\x3f\x61\xbe\xf7\xc3\x88\x08\xeb\x4d\xc8\x8f\x04\xfc\xcc\x75\x15\x03\xb6\xbe\x54\x00\x4b\x1a\xdb\x01\xc8\x13\x4d\x34\xbd\x90\xed\xac\x87\xfc\xb2\x6e\x28\x42\x4e\x37\x81\x6d\x31\x34\x34\x08\x25\x32\xf7\x3e\x53\xc2\x3a\xe9\xc7\x47\xc9\x13\x90\x7e\x82\xe5\xdb\x55\x6a\xdd\xa0\xe3\x95\x88\x4a\x6f\x81\x6e\x91\xa3\x05\xbd\xf9\x14\x7b\x4a\x8f\x4a\xe5\xb8\x61\x40\xc4\x51\x25\xd1\xab\xe3\xf5\x49\x62\xdd\x79\xfb\x3b\x5d\x37\x56\x65\x44\x03\xef\x07\xa6\xbe\x30\x70\xf1\x35\x03\x97\xdd\x81\x77\x83\x5f\x7e\xe0\xe2\xe9\x81\x4b\x3f\x70\x88\xea\xfe\x6d\x44\x73\x3f\x3a\xf7\x95\x32\x3a\x46\x07\xed\x1d\xf6\x98\x56\xb1\x1b\x99\xc1\xfa\x94\xf0\x79\xc0\xe0\xc2\x29\x41\xc1\x29\x41\xc3\x7f\xf1\x02\x49\x05\xc0\x90\x5f\xfd\x7c\x76\x31\x0e\x67\x18\x7f\xa3\x76\xaa\x38\x49\x7b\x7a\x47\xf6\xf4\x8e\xf8\x65\x7a\x27\x88\xb7\x10\xd6\xb0\xc3\x8a\xa7\x98\x41\x8f\x2f\x3f\xd0\x55\xf2\x80\xae\x02\x5e\xbb\xce\xce\x89\xaf\xd7\x5b\x5f\x79\x3a\xbe\x52\x6f\x31\x40\x70\xd7\x87\x45\x81\xfa\x3f\xa7\xc3\x64\xa0\xc3\xc4\x53\x3a\xac\x63\x36\x7c\x59\x4d\x89\xaf\x52\x53\xf2\xeb\xd4\x94\xf8\x8b\xd7\x3a\x52\x53\x7e\x05\xc5\x57\x6b\x2c\xf9\x45\x8d\x25\xbe\x52\x63\xf5\xb6\x63\x48\x63\x89\x8e\xc6\xea\xc9\xb7\x7e\xf0\xe5\x09\xe5\x25\x7e\xa1\xf2\x1a\x7c\x25\xea\x31\xf1\x4b\xf5\x18\x44\xb2\x08\x06\xf7\x6f\x65\xef\xa2\x57\xde\xbb\x18\x84\x84\x1f\x46\xa4\x92\xf8\xec\x8a\xe0\xec\x76\x0b\xaa\xbd\x8b\xc8\xa9\x3a\xae\x7f\x4e\x42\x9a\x1b\x9a\x3c\x32\x20\x5a\x1b\x09\x23\x51\x1f\x88\xb0\x1a\x9a\xa7\xff\x68\x8a\xdb\x1f\xe4\xb1\x39\xf1\x45\x86\x74\x70\x3a\x49\x11\x70\xff\x76\xb5\x6e\xb3\xb2\xd8\x6f\x13\x61\x36\x41\x9c\xf4\x44\x9a\x0d\xb4\xde\xe6\xcc\x49\xfc\x8d\xfd\x86\x31\x27\xcc\x42\xd4\x7d\x1a\x7d\xc4\xa9\x56\xcf\x7a\xcf\x30\xf1\x76\xcb\x51\xf2\x51\x83\x1c\x8a\x70\x25\xa1\x59\x16\xa0\xd3\x29\xf9\x96\x30\x34\xb5\x75\x69\x30\x0b\x92\x88\x3f\x94\x6d\x55\xa8\xfc\x04\x23\x23\x5e\xee\xdb\xf3\xc8\x6f\x7d\x56\xf7\x6b\xd5\x43\xa6\x3a\xe8\x5a\x12\x48\x05\xce\x34\x9a\x1d\x12\xa1\x68\xd9\xc0\xcd\xec\x8e\xfb\x47\x9f\x29\x10\x91\x15\xe9\x57\xec\xc7\x8e\x3d\xe1\xde\xb2\x8f\x4d\x8b\xc0\xe9\x11\x03\xca\x07\x28\x9f\x54\xb1\x27\x5a\x0c\x67\x6f\x05\xcc\x1b\x70\x43\x3a\xe5\xd4\x41\x0a\x87\xd8\xa9\x60\x1e\xd7\x8b\x69\x68\x59\x3a\xbb\xbe\x5f\xdf\x6f\x27\xeb\xb0\xdc\x85\x29\xd0\x27\x0e\x39\x33\xec\xd3\x7f\xa4\x14\x0a\x3e\xc2\xf1\xc0\xf5\x4c\x30\xc5\x66\x1d\x75\x6f\xed\xed\x43\xed\x77\x06\xcc\xf0\x21\x61\x00\xc7\x24\x91\x47\x6f\x2a\x5d\xac\x23\x0a\x41\x06\x7b\x87\x8f\xdd\xec\xbb\x67\x32\x39\xb2\x13\x39\x5a\xae\x2b\xad\x0b\x88\xf6\x62\xa2\x1c\x92\xa7\xf4\xc9\xee\x57\x05\x65\x0c\x4f\x88\xa9\x87\x86\x4e\xc1\x0e\xb3\xdd\xa1\x3d\xe2\xab\x74\xc3\x03\x04\xf2\xf8\x47\xd7\xba\x90\x88\x3b\xe6\x29\x43\x92\xdc\x2f\x2c\xd5\x80\x10\x49\x00\x99\x1f\x7a\x27\xb7\xed\x16\x41\xab\x69\x48\xc8\xa0\x86\x1c\x92\x18\x0e\xf3\xe9\xf1\x00\x2f\x24\xc8\x4c\xb2\x75\x0d\xdf\x41\x02\x9c\x50\x8f\xa8\x46\xe6\x5a\xd5\x60\x7e\x3b\x9a\x11\x48\x7d\xd8\xb7\x3e\xf1\x60\x81\x0f\x76\x04\xef\x0b\x4d\x8c\x45\x8a\x8a\x35\xde\x3b\x75\x0b\x47\x26\x2c\x4e\xbe\x9e\x5d\x4c\x96\x4b\x5f\x33\x8a\xc5\x34\xe7\x72\x35\xe7\x22\x1a\x28\x01\x9e\x2c\xe5\x74\x26\xdf\x2f\xa6\x2b\x28\x33\x76\xd5\x33\xf3\x37\x6f\x26\x8b\xa5\xfd\x9c\x80\x42\x1d\x28\xc1\x82\xe2\x17\x57\x6d\xb5\x98\x5c\x2d\x26\xcb\xc9\x6c\x35\x22\x06\xe6\x45\x50\x80\x25\xe7\x6f\xa0\xe6\xe7\x9f\xa6\x58\x2f\x33\x9e\x2c\x66\xd3\xd9\x5b\xa8\x96\xba\x1c\xad\x26\x8b\xe9\xe8\x62\x99\x70\x09\x74\xc2\x75\xcc\x89\x5c\xae\x46\xab\xeb\xd5\x7c\xf1\x41\x86\x15\xaf\x51\x2d\xf4\xfb\xe9\xea\xdd\xfc\x7a\x25\xa0\xf0\x17\x5e\x9e\x74\xde\x0c\x58\xf0\x89\x2b\x83\x9e\x72\x89\xed\xa1\x1a\x68\x41\x35\xd0\x89\x9c\xcd\x67\xd3\xd9\x9b\xc5\x74\xf6\x16\x8a\x88\xb1\x2a\xf7\xdd\x44\x8e\x5e\x2f\x27\x54\x0c\x74\x31\x5a\x41\x79\x31\x0d\x4f\x9e\x4f\xde\x4c\xc6\xab\x65\x22\x47\xe3\xf1\xf5\x62\x34\xfe\x90\x08\xfa\x12\xae\x0f\x7e\x2b\x78\xc0\x64\xb1\x98\x2f\x96\xbe\x2e\x78\xbe\x80\xfa\xb9\xf3\xe9\x72\x3c\xff\x69\xb2\x18\xbd\xbe\x98\xa4\x72\x39\xbf\x9c\xc8\xdf\x5c\x2f\xa6\xcb\xf3\x29\x52\x5c\x8b\xf3\x39\x7c\x6e\x74\x71\x31\x7f\x0f\xcf\x9f\xfc\x6e\x7c\x71\xbd\xa4\xb2\xa5\xa1\x02\xf2\xe5\x1c\x4b\x97\xfc\x07\x2f\x47\x1f\xec\x43\xc4\xe8\xea\xea\xe2\x83\x3d\x0c\x1f\xe6\xd7\xd8\x41\x70\xe1\x92\x9c\x12\xc8\x0e\x10\x08\x62\x9f\xda\x2f\x4f\xae\x56\x5c\xb6\x35\xf9\xdd\x0a\x4b\xfa\x7e\x7b\x3d\x5d\x60\xc5\x59\x5c\x5a\x96\x88\xe9\x4c\xba\xc2\xf1\xf7\xd3\x8b\x0b\x7f\xaa\x7c\x6d\x38\xbe\x99\xcb\xa6\xb1\xe0\x10\x8b\xa7\x5d\xd9\x38\x17\x86\x8b\xb0\x5a\x3c\x2a\x0b\x4f\xe4\xd5\xf5\x6c\x0a\xc5\x73\xf3\x85\xaf\x1f\x77\xc5\x7b\x5c\x25\xed\x4a\xa3\xe3\xfa\xb5\xa8\x54\x1a\x0b\xd2\x5c\x95\xb4\x1f\xf3\xbb\xd1\x52\xbe\x9e\x4c\x66\xf2\x70\xdd\xb4\x88\xeb\xa6\x97\x0e\xf3\x24\x20\x9c\x83\x98\xe1\x6a\x88\x20\xf4\x90\x99\x8e\x82\xc8\x93\xcf\x45\xa4\x8e\x02\xfc\x6f\x2b\x98\x6e\x2a\xf0\x70\x6e\xf6\x60\xae\x30\xbb\xc0\x81\x70\x44\x58\x85\x4d\x75\x10\x46\xd7\xa2\xcf\x5f\xf7\x35\x76\x18\x9a\x99\x1f\x22\x4e\x3b\xe1\xdc\x54\x27\xa2\x5d\x75\x0f\xf3\x87\x19\xe7\xe1\xd5\x21\xc1\x9d\x6b\x4c\x03\xb1\x18\x14\x8c\x8b\x60\xa8\xb2\xd2\x5b\x65\xc0\x36\xd9\xb4\x39\x26\xee\x72\xa3\x9c\x2b\x88\x4c\x0a\xb9\xcb\xcc\x39\x96\x86\xb3\x44\xbe\x48\xc4\xb7\x89\xfc\x2e\x91\xdf\xa3\x07\xf4\x2b\x1c\x5a\xdd\x56\xf7\x76\x4e\xec\xa4\x05\x0c\x81\xfd\x82\xb1\x4e\x3a\x1e\x23\x53\x43\x49\x79\xb4\x41\xba\x31\x69\x50\x27\xa6\x16\x71\x6e\x5d\x7e\x6d\x6e\x9d\x35\x9d\x5d\xfe\x13\xa8\x87\xb0\x93\xae\x1b\x55\x64\xac\xfb\x61\x44\x41\x8a\x86\xa2\xe6\x75\x1c\xeb\xe7\x36\xa3\x4e\x11\x10\xf2\xde\xe9\xa2\x11\x2e\x8a\x80\x07\x09\x2c\x9a\xba\x29\x77\x41\x47\x0e\x91\xbe\xa1\x61\xed\x69\x6e\x02\x35\xcd\x67\x40\x30\x31\x16\x6e\xad\x66\x2e\x7e\x77\x32\x10\xa6\xa9\x29\x61\x0f\xb3\x4a\x75\xf8\xd9\x8f\xc3\x12\x35\x11\x05\x38\xb8\x65\x15\xfc\x0c\x13\x44\x89\xc0\x80\x4b\xdc\xc2\x1f\x88\xd2\xf0\x71\x3d\xe1\x06\xcb\x28\x2e\x03\xe7\xab\x68\x4c\xd1\x6a\x77\xe0\x36\x25\x37\xb9\xea\xcd\xc6\x9e\x04\xb2\x04\xfd\x41\x16\xbe\xa8\x81\xbb\x86\x10\x61\xe7\xd2\xd4\x6b\x9d\xe7\xaa\xd0\x65\x8b\x55\xa2\x40\x07\x08\xdc\x40\x71\x40\xe2\x2b\xfc\x5f\xe7\x34\x75\xcb\x1d\x92\xb8\x64\x88\xab\xbd\xca\x38\x5c\x20\x55\x58\xa6\x11\x64\x1d\x5c\xa4\x48\x0c\x96\x9a\x10\xb1\x47\xf7\x5c\x37\x65\x47\x0e\xc4\xb7\xe6\x2f\x9c\x67\xdf\xe6\x15\xbf\x7c\x5e\xb1\x45\xfa\xb7\x98\x20\xfa\xc6\x90\x53\x66\x0a\xdb\x5e\x7c\x00\x4a\x94\x00\xf2\x16\xa2\x0e\x85\x2e\xe0\x20\xc1\xf5\xc6\x87\xfa\xfb\x2e\x72\xf5\x90\x48\xd3\xc8\xfa\x8e\xe2\x31\x52\xe1\x59\xb3\x23\x83\x87\x18\x74\x9c\xdc\x53\x40\x55\xbb\xdc\x05\x88\xc8\x0c\x22\x32\xe2\x0b\xc9\x23\x6e\xde\xdc\xb4\x15\xd8\xa1\x6a\xcd\x54\xb0\x10\x6f\x23\x87\x92\xe2\x3f\xc2\xf1\x50\x53\x5d\xab\x9f\x2f\x0e\x15\x4a\x44\xb1\x2e\xd4\xf9\xd4\x68\x61\xb3\xc3\xe6\x32\x87\x22\xca\x38\xfa\x07\xe1\x1a\xc1\xfd\xf2\x4b\x94\x42\x0d\xca\xac\x84\x99\x48\xec\x4f\x3d\xb0\xd0\x6e\x20\x99\x1d\x69\x46\x3d\xb2\xcc\x9a\x84\xca\x52\x30\x1e\x10\x8c\x32\x74\xe5\xe0\xd3\x15\xd1\x7a\x02\x37\xa8\x7b\x9e\x29\xa0\xb7\x15\x3a\x7c\x8b\x4c\x02\xf2\x4e\x26\x82\x85\xda\x93\xd3\xb8\xbe\x53\xd5\x2d\x37\xe0\x0e\x3f\x15\x4b\x20\x23\x6b\x20\xac\x90\x6d\x42\x6e\xfe\x21\xe6\x6f\xc7\x3b\x6b\x9d\x52\x5f\x62\xe8\xef\xb1\x23\x80\xb3\x0a\x07\x42\x52\xf6\x59\x95\xb6\x6b\x00\xc7\x8d\x75\x46\x9d\xf8\x57\xd4\x58\x2a\x17\xf9\x18\xdd\x2a\x46\xff\x0a\xcf\x9f\x69\xdc\x7b\xbc\x23\x6d\x57\x4d\x50\x49\xef\x0d\xd4\x0f\xdc\xec\xe1\x8a\x30\x37\xbc\xca\xfd\x26\x52\x74\xce\xfa\x82\xe4\x77\x91\x0f\xb8\x2e\xb7\xdb\xb6\xa0\x4c\xb4\x60\x73\xa3\xb3\x72\x1c\x63\xbc\x61\xa8\x5f\xed\x8f\x35\x9c\xc0\x16\x14\x2d\x37\x26\xbb\xe9\x8a\x88\x7f\x95\x0a\x17\xed\xe3\x85\xe8\x35\xdc\x18\x74\xee\x95\xdf\xe8\xfe\x55\xb2\xa7\xd9\x7e\x8c\x83\xa0\xfb\xa0\x71\x59\x18\x00\xba\x2b\x9c\xe2\x6b\x7c\x71\x75\xda\x67\x47\x0c\x0b\xa2\x73\xc3\x21\x2a\xb0\xef\x90\xac\x95\x42\x27\xb8\x4a\xb9\xbe\x55\x40\x8f\x5d\x22\xe0\x00\xfc\x30\x53\x5b\x75\x0b\xd4\xc4\x3c\x86\xc4\xd7\x7d\xf1\xfa\x08\x5f\xd9\x08\x5f\xba\x45\xe4\xc5\x04\x37\xd6\xfe\xc5\x14\x6b\x88\x2e\x60\xe1\x2c\x1c\x5f\x80\xd5\x82\xe6\x5c\x7a\x05\x55\x52\x76\xe6\xc8\x6b\x94\xb3\xf1\xd9\xb1\x56\x28\xc1\x5e\xe9\xdb\x12\xfe\xf5\x50\x02\x95\x1f\x47\xf6\x6b\x08\x9c\xf5\x56\xe6\x4e\x85\x29\x7c\x07\x5b\x93\x71\x86\x8e\xc4\xb7\xdb\x53\x1f\xf4\x16\x4e\xa0\x82\x1d\xaa\x7c\x15\x82\xdd\x3c\x8f\xec\x0b\x82\x92\xbf\x9f\x0a\x31\xc1\x92\x76\x36\xd3\xb8\x42\x20\x28\x41\xa7\x62\x57\x98\x45\x19\xd6\xa3\x38\x80\x00\xaa\xa5\x11\x3d\x5e\x46\x2d\xc7\xe3\xab\x8b\x44\x16\xc4\x92\x8b\xfb\x0a\xdb\xdf\x92\x79\xd6\x54\x2a\xd3\x5b\x55\x7d\x94\x47\xdd\xd5\x38\x12\xb4\xd9\x50\x75\x6e\xa5\x99\xfb\x6c\x59\xc9\xbc\xbc\x2d\xed\xf0\x06\x4e\x97\xbf\x1c\x51\xd3\x3e\xcb\xc5\xa1\x6f\x21\x55\xbd\x07\xea\x68\xd9\x42\x42\xd1\xd8\xb1\xc3\x7b\x37\xe8\x99\x7d\x5b\x71\xba\x6e\xab\x0a\xa0\x13\xdc\x40\xdb\x5a\xdd\x6a\x79\xdb\x9a\x4c\xe7\xa6\x80\x36\x12\x57\x02\xe3\x78\xf4\x44\x89\x5d\x2e\x0f\xfa\x06\x58\x15\x39\x53\x04\x64\xf9\x10\xc6\x56\xf7\xca\xe4\xa8\x4d\x77\x00\x5c\x06\x09\xc1\x01\x9e\xe8\x81\xcb\x4d\x6f\x83\x5c\x19\x54\x33\x5b\xbb\x12\xfb\xf9\xd7\xf4\xd9\x35\x2d\x42\x59\xdd\x7e\xf3\xf7\x6f\x2f\x4d\xbf\x79\xb3\x7c\x73\x7d\xf1\x37\x44\xff\xf9\x22\xfe\xcf\xf3\x97\xcf\xbf\xeb\xe1\xff\x3c\x7f\xf9\x8f\xfe\xcf\xbf\xc7\x9f\x00\xd9\x67\x7c\x22\xcf\x7e\xfd\xeb\x17\xa7\x67\xbf\xfe\xf5\x77\x89\xfd\xeb\xaf\x4e\x5f\x3c\x3f\x7b\x71\x10\x22\x39\x91\xd3\x62\x0d\x55\x66\x06\xb1\x21\xcd\x6d\x5b\x69\x59\xaf\x2b\xb3\x03\xaa\xd8\x88\x6f\x0f\x23\xf0\x07\xe1\x96\x6f\xcd\xbd\xae\x45\x5b\x38\x19\xe8\x7b\x15\x0e\x50\x6f\x4a\xe2\xdd\x34\xcd\xbf\xb9\xa6\xec\xbf\xe3\x9f\xf4\x9b\xd7\xcb\xf3\xd3\x97\xa7\x63\x28\x7b\x38\x1d\xe7\x5a\x55\x7f\x6d\x61\xf0\x85\xfb\xff\xf2\xec\xfb\x6f\xbb\xfc\x7f\xdf\xbd\xfa\x47\xff\xf7\xdf\xe5\xcf\xca\xda\x09\x76\xd3\xe5\xeb\xe5\xb9\xb3\x7b\x63\xbc\xaf\xff\xf8\xe9\xd3\xa7\x4f\xff\xe9\x14\xff\x27\xff\xe3\x1c\xba\x4f\xe6\x01\x5f\xf5\x7f\x12\x61\xe5\x65\x50\x4c\xf9\x37\x46\xf4\x3a\xee\x64\x98\x83\x66\x1a\x87\x5b\xe5\x6b\x08\xb0\x7b\xd3\x85\x90\xc4\xd7\xc2\x80\xfd\x87\x1e\x06\x57\xb9\xf9\x4b\x50\xc0\xd0\xcf\xed\x03\x70\x7d\x09\x04\xac\xff\xfe\xbf\x3a\x06\xd8\xdf\x11\x02\xec\x3f\xc8\x19\x19\xa4\x61\xd2\x76\xe8\x50\xc9\xa2\xf4\x1f\x82\x45\x27\x8a\x38\x7c\x5c\x59\xd5\x82\xcc\xab\x0e\xca\x94\xfc\xcb\x50\xa6\xc4\xff\xc7\xde\xbf\x34\xb7\x91\x64\x7b\x82\xf8\xde\x3f\x85\x37\xcd\xfe\x96\xe4\xdf\x82\x48\x92\x7a\x64\xa6\xd4\xd6\xd6\x10\x09\x49\xa8\xa2\x48\x36\x00\xa6\x4a\x73\xed\xda\x94\x03\x70\x90\x5e\x0a\x84\xa3\xc2\x03\xa4\x70\x17\xf3\x59\x7a\x3b\x9b\xd9\xcf\xf6\xf6\x17\x1b\xf3\xf3\xf0\x47\x44\x80\x92\xb2\x1e\xb7\xbb\x2d\xb5\xc8\x94\xc8\x08\x0f\x7f\x1e\x3f\x8f\xdf\xf9\x1d\xc7\xec\x20\xfb\xe8\xa6\x06\x02\x68\x6b\x30\xb0\x24\x13\x66\x1d\xf2\xfc\x43\x02\xfa\xf0\xea\x13\x84\x7f\x3e\xfd\x30\x95\x37\x18\xcf\xa1\xec\xf4\xe1\x64\x84\xa9\xe3\x10\xdb\x10\xed\x04\xf3\x27\x18\x7f\x66\xef\x47\x49\x4a\xfc\xfb\xeb\xcb\x8b\xd1\x24\xe4\x8b\x07\x7e\x1c\x71\x00\x34\x40\x07\x6d\x16\x20\xf9\xdd\x1c\x40\x62\x3f\x07\x90\xfc\x4e\x0e\x20\xb1\x9f\x03\x48\xb6\x38\x80\xfa\x46\x49\x7c\x3d\x71\x8c\x7b\x39\x80\xe4\x6f\xe7\x00\x12\x3d\x1c\x40\xbd\xb4\x48\x5f\xe7\x00\x12\xfd\x1c\x40\xf2\x37\x70\x00\x89\x7d\x1c\x40\xf2\xb7\x70\x00\x89\x27\x39\x80\xe4\x77\x70\x00\x89\x27\x39\x80\x9e\x88\x65\xb5\x39\x80\x7e\x57\xdb\xfe\xe3\xff\x0c\x7e\x3c\xb7\x5e\x6a\xfe\x23\x29\x60\x9f\xd6\xff\x4e\x9f\xbd\xec\xe8\x7f\xcf\x9e\xbd\x3c\xfb\x5d\xff\xfb\x67\xfc\xc1\xd5\x6f\x31\xc0\x66\x95\x9d\x0b\x79\xbd\x68\xec\x5c\xd7\xf2\xd9\x49\x21\xcf\x4e\x4e\x9e\x25\xea\xe1\xbf\xff\xdf\xde\x50\x3c\x39\x3e\x3b\x39\x79\x29\xa9\xad\x99\x56\xeb\x02\xca\x4b\x6d\x1b\x5d\x8b\xe9\xc2\x80\xd3\x4d\x5e\xe8\x8d\xaa\x1b\x74\xf1\xdf\x56\xc0\x44\x4e\x91\x85\x8f\xc6\x01\x1c\xb2\x3a\xfe\xa0\x96\xc6\x79\xd3\x32\xfc\xe5\xe3\x18\x39\x43\x31\xf3\x4c\x4c\x02\xbd\xec\x5b\xce\xc9\x4d\xb1\x4e\xe4\x68\x79\x95\xf7\x65\xe8\xef\x71\x48\xc0\x94\x37\xb5\x5d\x69\xe7\x6c\x2d\x3e\x98\x1a\xc0\x08\x0f\xd5\xae\xf0\x7d\x43\xd7\x14\xf5\x5a\x72\xaf\x0b\x79\x7a\x76\x7a\x22\x3f\x0e\xe4\x85\xda\x35\xb6\x92\xd3\x66\x90\xf5\x4e\xbe\x78\xf6\xd3\xc9\xcb\xe3\xd3\x97\x3f\xbf\x28\xc4\xe1\xcb\x93\x9f\x8f\xe4\xd9\xcb\xb3\xe3\x93\x9f\x5f\xbc\x84\xac\x61\xff\x95\xff\xba\x70\x83\x47\xe3\x16\x03\xbd\xdc\xb2\xc1\x1c\xb4\x0f\x40\x75\x51\x58\x91\x5c\x8c\xd8\xf9\x7f\xff\x7f\x02\x07\xef\xcb\xc1\x97\xf8\xc2\xe1\x01\x1b\xd0\x07\x47\xe2\x11\xe8\x49\x12\xba\xc9\xf8\xbe\x1f\xeb\x5f\x20\x49\xae\x77\x61\x64\xdf\xc2\x88\xaf\x2e\x4c\x74\x2f\x22\x98\x28\x09\x0e\xbd\xb1\x0a\x71\xd1\x13\x7d\x87\x3e\xff\x15\xa3\xe5\xfa\xda\x94\xd3\x9d\x6b\xf4\x9a\x10\x69\xc4\xa1\xf9\x60\xcb\x6d\xd5\x28\xc0\x5c\x77\x68\xe0\x48\xcd\xcf\x87\x27\x0f\x0f\xe2\x7e\x7c\x6f\xcb\xa5\xae\x51\x9f\x3d\x4f\x34\xc5\xa0\xe0\xc6\xbe\x1c\x1c\x21\xa7\x47\x67\x0f\xd9\xaa\x77\x12\x37\x18\xd6\x76\x5a\xcb\x84\x91\x73\x01\x4f\x6d\xf0\x21\xf2\xe1\x89\x71\xe5\x1a\x55\x32\x1f\x0b\xe4\xfe\x67\x8c\x29\x11\xd3\x9a\xd5\xc0\xc5\x9c\xef\x8c\xc0\x95\x43\x50\xbc\xe2\x5f\xb1\x8f\x9e\xb2\xac\x72\xdb\x09\x7d\xae\x69\x6a\x52\x97\xf4\x21\x67\x8a\x05\xd2\x9e\x90\x94\xe4\xc4\x7c\x07\x98\x5d\xbf\x95\x73\x2b\xac\xcf\x9c\xea\x67\x53\xfe\xde\xd1\xe5\x86\x0e\x1a\x33\xbd\x02\x4c\x9a\xea\x95\x3c\x3c\x45\x3c\x6d\x6c\xdd\xcf\xc9\xe1\xd9\x11\xf8\xb5\xb1\x96\x45\x66\xd2\x04\x73\xc6\x99\xb5\x29\x55\x34\x6b\x88\xb2\xc6\xf4\x99\x37\xdc\x3a\x86\xe2\x81\x5c\x62\xd8\xdb\x7c\x20\xdc\x65\xfe\x96\x7c\xa9\xf3\x7c\x87\xe6\x5e\x8b\x38\x8f\x68\xbd\x7d\x03\xf1\x6c\x92\xa8\x43\x12\x24\x1c\x92\x27\xf7\xec\xd1\x81\xb7\xe0\x81\x04\xb6\x31\x0f\xba\xdc\x15\x08\x19\x56\xe0\xc7\xe3\xc4\x5d\x53\x2f\x8f\x31\x8a\x90\x33\xe2\x3a\x6f\xa9\xad\x21\xbc\x8e\x31\x36\xb2\x33\xf3\xa7\x02\x2d\x6b\x58\xc0\x00\x44\x0d\x0e\x41\x8c\xb4\x10\x51\x74\xe5\xbf\xa3\x96\x7a\x6d\x16\xfe\x1d\x5b\x37\x8c\x01\x8f\xec\x42\x96\x22\xcb\xf4\x18\x18\xad\x16\x6b\x5a\xac\x64\xad\xdd\xb6\xf4\x62\x68\xee\x4d\xf3\xb8\x68\xc9\x8e\x23\x44\x66\xa4\xbd\xcd\x7f\xfd\x83\x03\x7f\x05\xc4\x17\xb1\x94\xdc\xa6\x36\xaa\xd1\x62\x41\x7e\x06\x4c\x18\x9d\xb1\x25\x1b\xa6\x1d\x92\x9b\x6b\x7d\x67\x5c\x03\xc4\x32\x49\xf4\xe4\x49\x99\xc8\x72\x76\x00\xb9\xbb\xf1\xad\x24\x10\xf9\x84\xb1\xeb\xc2\x4e\xc7\x1f\x82\xe5\x2b\xd8\xf2\xf5\x53\xa5\xfd\x0e\x81\x83\x50\xd0\xdc\x35\xf7\x7e\x68\x79\x0e\x94\xa3\x38\xdb\x19\x9c\x98\x67\x0c\xfc\x31\x8d\x48\xfa\xa1\x56\x2b\xf3\x05\xbb\xb2\x7e\x82\x6a\xb9\x3d\xdd\x21\x3e\x24\x72\x2b\x1b\x66\xf7\x01\xea\xdf\xc3\x72\x41\xc0\xe5\xc1\x28\xa9\xd7\xca\x94\xe8\x04\x06\x45\x55\x2d\xd7\xa6\x7d\xa3\xbe\x18\xc8\x59\x06\xde\x86\xad\xbb\x51\xf0\x77\x70\x63\xb0\x34\x83\x66\xe9\x9a\xfc\xca\x1a\x80\xc0\x64\x50\x81\x29\x77\xfe\x92\xa8\x4d\x75\x17\xef\xd9\x2d\x4e\x3f\x32\xba\xac\x5a\xc2\x66\x47\x08\x7f\x82\x79\x08\xd5\x26\x41\xe9\x21\x4b\x41\x97\x79\x44\x70\xb1\x04\x46\xa1\x4c\xc8\x76\x3f\x28\x81\x83\x2a\xa2\x1c\x22\xf1\xbd\xb2\x35\x7c\x99\x20\x10\x74\xfb\x38\x5d\xfa\x89\x5d\x11\x7e\x1c\xff\x89\xe5\xb2\x01\x52\x1c\x23\x5e\x48\xbf\x45\x37\x7c\x3c\x97\x39\xed\x3d\x46\x35\x41\xae\xc0\xbf\x11\x51\x53\x2d\x71\xab\x61\x04\x0c\x38\xca\x28\x9c\x4e\x0b\x51\x66\x38\x0a\xb5\xd9\x94\xbb\x84\xdb\x60\x9e\x81\xe3\xb4\xc8\xf6\x0c\x0b\xe6\xd0\xa1\x15\xa0\xac\x11\xd4\xbf\xd6\xad\xde\x3a\xa9\x96\x4b\x5c\xa6\x9d\xdd\x16\x08\xc1\x66\x74\x40\x7b\xa5\xb0\xb2\x09\x81\x34\xd2\x7e\x10\xe4\xc2\x3e\x68\x3e\x16\xdb\xc5\xbd\xc8\x36\xd5\x53\xe3\x83\xa0\x3e\x8f\x31\x83\x79\xf3\x17\x9c\xa0\x7b\x25\x49\x99\x0f\xd7\x89\xbc\xb2\xf2\x5e\xd5\xcb\x47\xba\xb6\x25\x22\x7d\x32\xf4\x05\xa6\x0d\x63\xf2\x0c\xc7\x6b\xdd\x76\x4e\x71\x74\xff\xd7\x63\x7a\x5e\xcb\x43\x25\xff\xfc\xe7\x09\x63\x99\x0e\x8e\x62\xe6\x46\xd2\xff\x86\x02\xd5\x42\xdd\x29\xff\x7b\x68\x91\x28\xad\x0e\xa3\x1a\xa0\xe4\xa2\xb6\xce\x1d\xc3\x24\x60\xf0\x7e\x5b\x35\xba\xc6\x7f\x03\x3e\xbd\x54\x8f\x6e\x6b\x9a\x23\xa1\xca\x52\xdf\x61\x4c\x9e\x16\x2c\xd9\x55\x78\x9e\x68\xee\x43\xe7\x7e\xe0\x1e\x1d\xba\x23\x80\x9c\x55\x38\xf5\xe9\x03\x2d\x64\xeb\xe1\xd2\xd4\x7a\xd1\x20\xf7\x83\xa9\xf8\x5f\x47\x89\xba\x9a\x2f\x92\x40\x0f\x29\x2e\x55\x02\x84\x0d\x6c\x4b\x4b\xff\x4f\xe8\x57\x9c\x16\x08\x6a\x99\x12\xb4\x27\x40\x77\x46\x6d\x88\xf6\x71\xdc\xb4\xb0\xb2\x00\x07\x80\xb2\x17\xfe\xea\xd0\x75\xc2\x44\x80\xd2\xaf\xb1\x19\x2e\x14\xb1\x2d\x4f\xa0\x46\x9d\x32\xcb\xd6\x48\xe0\xaa\x86\xcc\xc0\x78\x88\x23\x60\x70\xb3\xad\xdd\x56\x55\x4d\xc0\x4c\x90\x6c\x0f\x95\x21\x83\x4b\x6e\xf2\x15\xd6\xf1\x6f\xf3\x41\xc2\x0f\xc0\x49\x74\x35\xfe\x75\x34\x99\x8e\x67\x9f\xe4\xdf\xec\x96\x14\x5f\xa7\x26\xef\x71\x4b\x16\xe0\x6f\x1a\xce\xc6\xd3\xb7\xc3\x73\x80\xfd\xff\xb7\xdb\x21\xfa\xc2\xbe\x89\xb4\xfc\x7a\x02\x10\xee\xb6\xdf\x32\x9b\x07\xf1\xb5\x79\x90\xc9\x3c\x7c\x18\xfe\x71\xd4\xcd\x6e\x90\xb3\xf7\xc3\x19\x4c\x59\xf4\xa5\x7d\xb8\xbe\x18\xbf\x1d\x9f\x63\xf6\x43\x21\x47\x57\xef\x87\x57\xe7\xe0\x76\x84\x59\xbb\x18\x4d\xc6\xbf\x22\xb3\xeb\xc7\xeb\xc9\x1f\x21\x97\x62\x32\xba\x7e\x5b\x20\x26\xde\xcf\x18\x67\x1a\x90\x3b\x7a\x06\x09\x07\xa1\xdb\x85\x9c\x4d\x86\x17\xa3\x0f\xc3\xc9\x1f\xe9\xaf\x72\x3a\x3a\x9f\x8c\x92\xd4\x83\x9b\xc9\xf5\xcd\x64\x3c\x9a\x0d\x27\x9f\x04\xbc\x13\x90\xe7\x31\x37\x22\x73\x44\x22\x5d\xed\x37\xee\x10\xdf\x2b\xfc\xce\xf5\xdb\xb7\xe3\xf3\xd1\xa4\x90\xc3\x77\x9c\x14\x31\xfa\x70\x73\x79\xfd\x69\x34\x12\xcc\x39\x1e\xa7\x10\x1d\xc5\xef\x87\xbf\xc2\x44\x46\x5e\xdd\xd9\x35\x7b\xd2\x47\xc9\x10\x46\x93\xe9\xf5\x15\xac\xb0\xe8\x3a\x89\x83\x63\xf8\x89\x1c\x80\xdc\x67\xcc\x19\x01\xc1\x5d\x4c\x89\x28\xe7\xef\x87\x93\xe1\xf9\x0c\x5c\xb0\xed\x4c\x12\x99\x66\x92\xec\x75\x1f\x8b\x0e\x85\x7c\xd1\x75\x1f\x27\xde\xe3\x62\xaf\xf7\xb8\x10\x5f\x63\x90\xf7\x6d\x46\x3f\x31\x9d\xa0\x4f\xc5\x13\xce\xe1\xa3\x42\xdc\x4c\xae\x2f\x6e\x53\x7f\x72\x2b\x85\xe6\x9b\x49\xe3\xc5\xdf\xe0\x30\x9e\x0e\x84\xf8\x79\x20\xcf\x75\x0d\xa1\x36\x2c\x9e\x50\x2d\x83\xce\xe2\x3a\x57\xbb\x6d\xd9\x60\x21\x2b\xd2\x34\x7a\x0d\x98\xc4\xa8\x51\x84\x74\x59\x06\x90\x91\x65\xf9\x44\x63\x5e\x1b\x26\xbd\x59\xa8\x96\xb2\x76\x3b\x98\x0e\xe4\xe8\x8b\x57\xb1\xd0\x13\x61\x4b\x64\xe2\x63\x1b\x55\x47\x3c\x24\x0e\x83\xb0\x7d\x8e\x20\xed\x88\xd3\xda\x33\xc2\xaf\xf5\x8d\xc6\x09\x80\x3e\x18\xab\xdc\x3f\x56\x6a\x2b\x45\xa3\xb6\x53\x1f\xfc\x60\x44\xcf\x60\xd0\xa4\x0e\x03\x62\xa4\x6f\x84\x81\x12\xfc\x72\xa5\x0c\x14\x8b\x05\x2d\x7e\xbd\x29\x77\x22\x22\x58\x35\x36\xbb\x48\x9a\xa5\x89\xf5\xd6\x1b\xf4\xa6\x36\x6b\x80\x59\x97\x9c\x39\xe4\x1b\xe2\xaf\x8a\x64\xbe\x89\xea\xf0\x17\x34\xc9\x12\xb7\x17\xb4\x48\x98\x2f\x59\x23\x79\x11\xef\x85\x4a\x3f\xc6\x82\x96\x6c\xb1\xe0\xbb\xa2\x5d\x19\xeb\xcf\x7f\x4e\xc1\x99\x07\x47\x3d\x28\x30\x44\xa4\x73\x35\x3f\xc6\xb1\xdd\x99\x07\x5d\x09\x45\x15\xa2\xef\xb6\x94\x28\xcb\x8f\x21\x73\xf2\x40\x5e\xfb\x29\x0f\xab\x1a\x8a\x66\x05\xb4\x1a\x03\xba\x05\x17\x13\x54\x81\xfc\xa1\x0b\xc2\xde\x51\x96\xbc\x2a\x1f\xd5\xce\xc5\x7c\x83\xc6\x62\x14\xbe\xc1\xd6\xda\x38\x6e\xd5\x70\x93\x31\xd1\x5e\x95\xce\xca\xc5\xbd\xb5\x2e\xbc\x0e\x8b\x17\xba\xda\xd3\x52\x4b\x1b\xdd\xd3\xcd\x64\x6c\x99\xf7\x52\xf8\x65\x03\x2d\x18\xf8\x17\xa3\xad\xda\xb4\x56\xf6\x5e\xb5\x12\x50\x08\x17\xd4\xec\x65\x71\xed\x75\x1d\xbf\x12\x22\x69\x55\x88\x3e\x9f\xb1\x4c\x7c\xc6\x42\xfc\xf4\xec\xe5\x4f\x5d\x6f\xaa\x10\x5d\x87\xb1\x10\xfd\x0e\x63\x21\x3a\xee\x61\x21\xc8\x51\xb3\x51\x77\xda\x0d\x92\xdf\xfc\xf8\x7f\xc1\xc3\x3f\xc2\x7f\x07\xf7\xcd\xba\xfc\x7b\xc4\xcf\x06\x3f\xbe\xc3\x22\xed\xc7\xb6\x2a\x77\xff\x11\xf5\x1f\xce\x7e\x7a\xf9\xd3\x4f\xed\xf8\xcf\x8b\xe7\xbf\xd7\xff\xfb\xa7\xfc\x81\x72\xf7\xa3\xab\xd1\x64\x78\x29\xf3\xea\x00\x49\x10\xa8\x90\x6f\xf5\xbc\xde\xaa\x7a\x27\x4f\x7f\xf9\xf9\x17\x7f\x52\x72\xd4\xe0\xcf\xbf\x7c\x05\x25\x28\x5f\x9c\xca\xb7\xb5\xaa\x3e\x97\xc6\x9f\x88\x42\xbe\x35\xab\xe6\x5e\xbe\x2d\xad\xad\x0b\xf1\xc6\xba\x06\x82\x3e\x43\x79\x72\x76\x7a\x7a\x72\x7c\xfa\xec\xe4\x54\xde\x4e\x87\x42\x8c\x1e\x74\xbd\xf3\x12\xc0\xb8\x04\xf8\x43\x90\xc0\x16\x63\xa2\x17\x31\x73\xd5\x98\x75\x20\x11\x5d\x65\x8e\x6c\xc1\x57\x24\x32\x5f\x00\xe9\x1f\x70\xfe\x36\x01\x84\x5f\x96\xf6\x11\x90\x4b\x37\xb5\x56\xeb\x79\xa9\x91\x44\x2f\x50\x14\x87\x7c\x06\xdf\xf6\xda\xba\x26\x2d\x61\xb3\xde\xa8\x0a\x52\x5a\x90\xbc\x0e\xc8\x4f\xb6\x0e\xc2\x11\xe8\xf1\x5a\xeb\x7a\x41\xd1\x12\xeb\x92\x37\x06\xf2\x0d\xc5\x3b\x94\x6b\x0a\x69\xb7\xb5\x7c\x87\x70\xf9\x8e\x5f\x3b\xd2\x11\x7b\x93\xf3\x6e\x0b\x95\xd7\xb5\xf6\xb2\xbe\x06\xef\xd1\xd2\x42\x9d\x29\x77\x0f\x94\xf9\xd5\x12\x87\xa9\x73\x30\xe6\xf1\x71\x4c\x91\xa9\x35\x88\x6d\x97\x78\x4f\xe0\x59\x40\xfb\x97\x25\x80\x6e\x60\x14\x78\xa9\xee\xe9\x18\xf1\x91\xb0\x1d\xbc\x6f\x37\xfc\x90\x38\xab\x89\xe9\x25\xba\x46\x36\xb5\xbd\xab\xd5\x5a\x3e\xfa\xd9\x11\x94\xab\x0e\x89\x1a\xa6\xc1\x5b\x07\x57\x0b\xaf\xa5\x85\xaa\xf8\x1a\x23\xa7\x57\x68\xc1\x15\xb2\xb1\x76\x20\xc4\xc7\x7b\x5d\xc9\x47\x60\xfb\x51\xe0\x7a\xcd\x66\xa1\xf0\xbf\x8a\x21\x38\x02\xd9\xd3\x24\x16\x44\xcb\x6d\x16\x7a\x20\xb9\x6e\x90\x2a\xcb\x5d\x01\xd3\xb5\x7f\x7d\x90\x44\x83\x1c\xa3\x3c\xc5\x78\xad\xfa\x0b\x99\x33\x55\xf9\x3b\xb0\x8c\x60\xed\x3f\x2a\xf0\x5e\x38\x8d\x64\x23\xb4\x81\x5b\x3d\x0e\xed\x50\x3a\x6d\xea\x97\xf3\xfa\xac\x9f\x95\x3b\xdd\xc0\x9e\x46\x52\x95\x47\x6f\xfd\x9b\x26\x79\xd5\x3f\x43\xbb\x22\x5b\x79\xe2\xac\xd9\x18\xed\xef\x31\xc0\x5b\x79\xf5\xcb\xeb\x47\xe8\x97\xa4\xd9\x7d\x4d\xd1\x34\x6a\xee\x73\x65\x1f\x43\xbb\x4b\x58\x7f\xc8\x2f\x30\xd5\x1d\x56\x81\xf7\x2f\x36\x7a\xd1\xe0\x1a\xa1\xe7\x06\xe6\xbe\xd2\xc9\x34\xa5\x34\x88\xa4\x35\xda\x7a\x0e\x09\x5b\x20\x00\x1a\x2b\x96\xba\xc2\xa0\x13\x7e\x82\xe9\xb1\x6b\x0c\x9d\x7e\x66\xc7\xa7\x83\x4c\x00\xf6\xfb\xd4\xc4\xf0\x3d\xc3\x77\x92\xaf\x08\xa6\xa5\x40\xc5\x94\xcc\x8a\x5a\x03\xb7\x89\x01\x4d\x93\x99\x40\x21\xd2\xd5\x26\xa9\x89\xab\x94\x9d\x20\xcc\x17\xc5\x87\x13\x8c\x32\x04\x1b\xf5\x17\xb5\xde\x94\xe8\xb3\xd9\xd7\x98\x54\x54\xd9\x81\x27\x3c\xb2\x9c\xde\x79\x95\x1d\xec\x16\x38\x9d\x72\xa5\x59\xcd\xdb\xba\x06\xb7\x51\x96\xb2\xe8\xe0\x04\x27\xee\xe1\x6c\x1b\xc2\x39\x12\xf0\x6a\x6b\xa3\x36\xf7\x7a\x07\x67\xa8\x08\xfb\x2c\xd9\x5b\x38\xd8\xb0\xed\x06\x72\x58\x2d\xc1\x05\x09\x4d\x35\x1a\x3f\xb9\xa6\x7c\x6c\x9a\x7f\x21\x3e\xea\xbe\x8d\x40\x1e\xec\x47\x2b\x5d\xa3\x37\x0e\xc3\x76\x11\xb8\x98\x4f\x2c\x05\xf0\x04\x7a\xb2\x71\x27\x24\x81\x4a\x74\xba\x01\x94\x1c\x7e\x89\xd9\x4b\x4f\x43\xc9\x19\xc8\x98\x68\x8d\x2e\x86\xf4\x86\xa5\xb3\x05\x4c\x36\x64\xc2\xa3\x4c\xfa\xc1\xf1\x40\x38\x6a\x6b\xb7\x35\xee\xe8\x47\x72\xb5\xc1\x7c\xf2\x8e\x02\x02\x2e\xcd\x17\x59\xc7\x38\x6a\x28\x73\x3b\xcb\xef\xc2\x9c\xa0\x36\x88\x7e\x20\xc7\xab\x8e\xb4\x0e\xd1\x97\xf9\x4e\x3a\xbb\xd6\xfe\x23\xba\x24\x16\x80\x8d\x72\x48\x9f\x12\xbb\x67\x00\xa3\xcb\x3b\xc4\xcb\x1f\x38\xc1\xd0\x97\x47\x5e\x7d\x94\x53\x74\x2d\xa6\xb9\xae\x85\x74\x56\x86\xa4\xeb\x4d\x6d\xe7\xa5\x37\x2f\x8d\xb7\xde\x20\xa8\x27\x98\xa7\x27\xc9\x35\xab\xf5\xaa\xf4\xeb\x4e\xa1\xf5\x90\x37\x4b\x32\xfe\x07\x6f\x0a\x6f\x09\xb9\x4b\xbc\xb5\x1b\xdf\x45\xb7\x87\x95\x7e\x65\x91\xf8\x1e\x28\x83\x3b\x10\xe3\x34\x68\x4c\x51\xd4\x81\x10\xfb\x35\x9d\xde\xf2\x3b\xe0\x17\x3c\xbf\xbe\xf9\x04\xde\x9c\xb4\x4c\x15\x78\x0f\x53\x0f\x1d\x45\x7e\x4f\x5a\xc9\x83\x81\xb7\x2b\xa5\x97\xa4\x49\x83\x7b\x2e\xc4\x2f\x81\x34\x1c\x37\x2f\xb3\xea\x41\xb8\x08\x78\x7d\x36\xa5\x5a\x44\xe3\x28\x9e\x8c\x7b\x80\x3a\x48\xa7\x76\xa4\xc3\x10\x18\x36\x6e\xed\x65\xbf\x7d\x67\xdc\x9e\xdb\x0b\x2f\xf8\x83\x1b\xec\xde\x41\x81\x88\xe9\x02\xaf\x47\xdf\x7b\x11\xf2\xec\x93\x21\x60\xd1\x21\x3f\xef\x4a\x1e\x24\xa5\x6d\x68\xad\xb9\x35\xe2\xbd\x8a\xd8\x5f\x71\x13\xdb\xf0\xed\xc2\xab\x34\x7c\x76\xc1\xa4\x8f\xc8\x8d\xad\xd9\x0d\xee\xaf\x33\x6a\x89\x75\x3e\x41\xa8\x81\x9c\x61\x98\xac\xf1\x10\x05\xc1\xd0\x50\xad\xe1\x50\x28\x27\x0f\x76\x76\x7b\xc0\xa1\xfb\xd3\x68\xef\x7e\xb3\x76\x19\xfa\x08\x9a\x4d\xbc\x8a\x95\xcb\x6e\x69\xdf\x61\x4a\x3c\x45\x26\xb0\xa2\x55\x8e\x1a\xee\x4f\x5b\xb9\x8d\x59\x6c\xb1\x0c\x08\xcc\x68\x0c\x39\x97\x3b\xc1\xfe\x0b\x5b\xa1\x34\xa2\x4e\xa6\x4f\x75\x69\xa1\x68\x10\x5d\x22\xbd\xdd\x6b\xd1\xa6\xe7\x03\xb0\xf5\x7e\x26\xd9\x7d\xaa\x5f\xb5\x14\x81\xb3\xc2\x69\x22\xfd\x86\x25\xe5\x2f\x41\x2f\xee\x38\xa6\xc1\x2c\x5e\xe1\x92\xca\x67\x32\x92\x0c\x3f\xfd\x59\x28\xb1\x1a\xe2\x9f\xf4\x72\xb2\x84\x90\x2b\x2d\xe0\x92\x8c\x6c\xde\xf7\x3b\x2a\x8e\xb4\x00\xbc\x17\x3b\xd6\x6a\x0a\x6b\xd9\xcd\x2e\x01\x72\x70\x53\x74\x37\xc0\xad\xc5\x54\x90\xbd\x9b\x80\xf7\x72\xbe\x55\x05\x4a\xaf\xee\x8e\xea\x32\x62\xf7\x91\x49\xdc\xa8\x5a\xdd\xd5\x6a\x73\x2f\x4f\x05\x45\xe2\xbb\x7b\x07\x1c\x34\xcb\x16\x00\xe7\x95\x10\xea\x08\xe3\x9b\x98\xae\x1c\x6a\x77\x99\x12\xc5\x11\x96\xb6\x8d\xcc\x51\xbc\xfa\xae\x61\x3f\x28\xef\x4d\xd0\x17\x97\x20\x4b\xf0\x6d\x46\x54\x41\xa0\x8c\x16\x1c\x9f\x82\xe5\x16\x62\x9e\x7e\x1a\x0a\x74\x85\x7d\x11\xa8\x95\x77\xfd\x9c\x0d\xee\x3e\xd2\x6f\xc1\x9b\x02\xc2\x7a\x90\xc3\x9a\x13\x8f\xb6\x27\xde\x3f\x00\x17\xaa\x5d\x05\x11\xd1\x02\x15\x89\x6c\xc6\x0b\x8a\xf3\x86\xc0\xaa\xf2\xb3\x40\xbb\x87\x2b\xf6\x02\xf6\x25\xa4\xc6\xef\xab\x6a\xb4\x67\xa3\x1e\xa6\x95\xab\x76\x61\x77\xb2\x2f\x0d\x02\x82\x22\x5c\xfc\x89\x66\xe1\x55\x59\xbb\x86\x59\xe9\x74\x02\xc2\xdf\xb0\x21\xed\xc6\x3f\x7c\x34\x10\x62\x71\x24\xc7\xab\x7c\xa1\x59\x4e\x07\x80\x4e\xad\xd5\x12\x6d\x2a\x50\x40\xbc\x31\x09\xe4\x76\x0f\xba\xdc\x79\x35\xb3\x92\xf5\xb6\x2a\x44\xd0\x29\x71\x05\x0d\x32\xed\x57\x7e\x5f\xd4\xfe\x62\xa9\xb7\x15\x96\x65\xb7\x35\x73\xea\x84\x86\x92\xe2\xd6\xd2\x01\xfb\x9a\x43\x94\x01\xd8\xcb\x5b\x07\x19\xf3\x0a\xf4\x4b\x6f\x5f\x55\x0d\x78\xaf\xa9\xb6\x87\x17\x67\x55\x65\xb7\xd5\x02\xaf\xce\x24\xe8\xdc\x42\xe0\xf4\x09\xba\x70\x69\xee\x57\xac\x0e\xbd\x2e\x57\x02\x28\x02\x6f\x4e\xd0\xce\xfc\x78\xe9\x50\x49\x15\x1e\x3e\x8a\x86\x0e\xda\xf1\xe8\x97\x4e\x36\x2c\xe6\x39\xe3\x1c\x87\xcb\x16\x29\x17\xf2\xf2\xfa\xba\x2c\xf9\x52\x03\x68\xd8\xbd\xd7\xb8\xac\x7c\x30\xfa\x51\xf6\xcb\xbb\x96\xef\x79\x20\xc4\xf2\xa8\x25\xdc\xe4\x77\x0b\x37\xec\x0d\xe8\xea\x7e\xb2\xb3\x2d\x44\xf8\x90\xbe\x9d\x68\x2a\xa9\xbf\xb0\x23\x81\x2d\x8f\x81\x10\x1f\x80\xfb\xe1\xee\xae\xd6\x77\x21\x44\xcd\xd4\x91\x49\x4d\x3f\x52\x70\x5a\xa2\x1a\x96\xc2\x70\x6a\x0e\xa0\x46\x8e\x84\x57\xe1\x00\x04\xba\x26\xbe\x3d\xd7\xd8\x5a\xdd\x69\xda\x23\x09\x5c\x0e\xae\xd1\x48\x8e\x38\xaf\x79\x7e\xa3\x4e\x25\xa2\x34\x75\x0b\x28\x57\xbf\x62\xeb\xd4\x1f\x5c\x96\xf4\xcf\x9e\xbe\xf7\xdb\x5d\x4e\x34\x91\x3a\xe9\xbb\x37\x03\xfd\x39\xc1\x6f\x46\xa1\x7d\x76\x04\x25\x0b\x12\xb8\x0c\xd8\x81\x7a\xb1\xc5\x72\x64\x00\x9e\xe9\x8a\x7d\x11\x5a\x70\xf2\x14\xba\x74\x46\x59\x5d\xfb\x85\x3f\x78\xca\x57\x7d\x77\x40\x28\x68\x2c\x4d\xc2\x37\x0b\xb1\x18\x0d\x5a\x43\x8d\x66\x2f\x9c\xb4\xb5\x5a\xdc\x9b\x4a\x1f\x7b\x59\x01\x5d\x4c\x14\x9b\x82\x30\x2b\x0c\xe6\xeb\x68\x9b\x7b\xee\xae\xd6\x20\x5e\x4b\x5b\x17\x70\x45\x74\x7b\xa6\x02\x26\x0c\x36\x64\x41\xbc\x2d\x48\x21\x4a\x74\x87\xcd\xbd\x37\x8b\x76\x5a\xd5\x28\xc0\xbd\x6e\x01\xda\x69\x14\x92\x3b\x34\x9d\x58\xfa\xe2\xb6\xad\x2c\x46\x92\xe8\xfc\xf0\xc9\x59\x58\xcc\x88\x4b\x77\xd8\x11\xe8\x21\x34\x41\x9d\x29\x89\x27\xb6\x3d\x7b\xe9\x64\xd1\xdd\x92\x4c\x92\xf8\xfe\x49\x5a\xec\x5b\xbe\x14\xb4\x9c\x28\x9b\xa0\xd8\x36\x36\x29\x4a\x94\x75\x50\x64\xa9\x8b\x68\x33\x30\x42\x72\x20\x0f\xc1\x84\x51\x11\x0b\x0a\x2a\x33\xba\x45\x91\x94\xdc\xcf\x59\x65\x2b\x7f\x85\xe8\x7a\x61\x54\x29\x3a\x06\x18\x3c\x47\x1e\x8e\xd0\xa9\x54\x54\x3e\x75\x20\x04\xa2\xc9\x4a\x5b\xe9\xc1\x91\x10\xd3\xa4\xb7\xb8\x86\x58\xe3\x3f\xd4\x94\xdb\x04\x00\x3d\xbc\x48\x6b\xf2\xc8\x25\x0e\xd7\xea\x33\xec\xe9\xac\xee\x48\x63\xc1\x8d\xf8\x16\xb4\x86\xec\x30\x9a\x52\x17\x71\xd9\xb3\xa9\xc2\x82\x7f\xa4\x26\xa7\xba\x3e\x7b\x4a\xd7\x76\xb9\xf5\x9a\x91\x89\x3a\xca\x6b\x39\xdf\x36\x05\x16\xe9\x24\xe2\x13\x2a\x64\x89\x70\xed\x06\x7d\x60\x5e\x80\x71\x89\x0d\xd7\x1a\x30\xb7\x8a\xe7\xce\xdb\xfc\xe0\x3c\x50\xf5\x52\x96\x66\x5e\xab\xda\xb0\xb6\x1e\x77\x09\x88\xc1\x8d\xc6\x00\xaf\x70\x88\xb3\xb7\x69\xe9\xcd\xd6\x98\xfd\x85\xee\xc0\x71\x05\x37\x3a\x7f\xe0\x5e\x2b\xbf\x5b\x51\xe1\x03\x82\xe0\x50\x8a\x96\x75\xc8\xf6\x87\x55\x13\xbf\x2c\xf1\xcb\x2c\x67\x9f\xe7\xc4\xdd\x78\x1f\xa1\x6e\x5d\x24\x60\xaa\xa2\xa5\x11\x66\x90\x44\xb6\x11\xe8\x54\x67\x94\x2d\x41\x30\x26\x18\xf6\x7d\x96\x2e\xa0\x8b\x9b\x46\xaf\x37\x8d\x48\x80\x53\xf6\x6f\xeb\x95\x71\xf2\xc1\x9a\x25\xf3\x5f\x95\x65\xce\xac\x98\x00\xcd\x52\x0f\x18\x05\x54\xd3\x7b\x86\x75\x89\x34\x6a\xf9\x9e\x59\x0f\x03\x45\x53\x87\x5a\x11\x8d\x12\x58\xc7\xac\x6d\xc1\xbf\x80\x70\xf5\x2e\x67\x1b\xdb\xa3\xb6\x3e\xc5\xad\x28\x12\x6e\x45\x67\x25\x58\x62\x4c\x3a\xcb\xbd\xdb\xcb\xa6\xc8\xdb\xe1\x05\x85\x3d\x3a\x6e\x9c\xea\x4e\x06\x87\x5c\xdb\x13\x70\x98\x7a\x0b\xd8\xd1\x20\x92\x27\x8e\xd0\x57\x4b\x45\x22\x71\x9e\xd5\xc2\x6f\x16\x2e\x47\x95\xb9\x0c\x1b\xb8\x38\x9d\x25\x0f\x46\x59\x0a\xaf\x91\xf4\x39\x9d\xb8\xdb\x2f\x53\xce\x39\x94\x70\x4f\x29\x0b\xed\xbe\xa6\x4f\x1c\x61\x2c\x21\x61\x98\xcb\x76\x0b\x2d\xab\x4b\x88\xe7\x02\xc0\x3f\xb8\xd0\x4a\x26\xef\xee\xa3\xc9\xc8\xfd\x9a\xdc\xaf\x3c\x5f\x63\x8f\x8f\x8d\x8a\xcd\xd0\x59\x4d\x8a\x0d\x30\xc8\x23\xf3\xd7\xd3\xb8\xbe\xb3\x64\x80\xa9\x78\x52\x7f\x42\xdf\xd3\x5e\x7a\x90\x6f\x87\x6f\x3c\x15\x9d\xe9\x01\x6b\x00\x61\x74\xd6\x04\x23\x36\x28\x09\x44\x98\x4a\xba\x8d\xa9\x4d\xc8\x6f\x21\xd0\x4e\x2c\x91\x3c\xdf\x36\x54\x13\x04\x14\x68\x53\xc9\xa5\x6e\x08\xb4\x4e\xde\x26\xff\x09\x11\x9c\xa5\x48\x77\xb5\xd0\x35\xec\xaa\x0c\x2f\x62\x1c\x42\x45\xe4\x57\xa1\x22\xe3\xdc\xf3\x10\xf8\xc5\x85\x6a\x3d\xca\x57\x62\xee\x25\x4f\x7c\x92\xa6\x81\xb5\x3f\x00\xc2\xaf\xb4\x9e\xc8\x01\x1a\x82\x21\x64\x15\xec\x84\x24\xc7\xa7\xd9\x57\x39\x94\x8c\xef\x16\xa4\x04\x92\x6c\xd0\x0b\x90\x7d\xaa\x0b\x03\xd9\xb7\x17\x78\xe4\xc1\x7f\x18\x4c\x00\x9c\x82\x9d\xfc\xca\x04\x14\x6d\x23\x5c\x55\x3b\xc1\x6f\x78\x09\xfb\x1d\x7d\xa1\xed\xfb\x73\x28\x61\xf0\xe8\x77\x68\xab\x9c\xa8\x97\x88\x1d\x4f\x11\x96\x16\xc5\xc2\xd8\x69\x70\x4d\x40\xf4\x33\xb7\x75\x5a\xb4\x14\x81\x4a\xb5\x00\x4d\x39\xe4\xc5\xa1\x37\x9d\x83\x61\x2b\x5b\x8b\x84\xba\x00\x94\x1d\x97\xc3\x93\x4d\x42\xbd\xff\xf5\xc1\x16\x22\xfb\xda\xbe\xc7\x5e\x43\xc0\xd5\xae\xb5\x3f\x60\x0e\x23\x21\x41\xe5\x71\x21\xb0\x31\x10\xd7\x5b\x6f\x3e\x2d\x4c\x8e\x93\xda\x9a\x65\xec\x4a\xf3\x68\xe5\x9d\x05\x4a\xe1\x15\x9e\xbb\xfa\x21\xf0\xbb\x41\x60\xa4\x51\xcd\x16\x62\x95\x5e\x01\x8b\xc6\x18\xbc\xc0\x21\xf1\x3c\xe4\x0c\x2d\xd9\xb5\x0d\x38\x3f\x77\xaf\x6a\xa6\x5e\xac\xb5\xbf\x2d\x81\xdf\x83\x5e\x21\xde\xba\x32\xf8\x05\xa5\x94\x57\xd7\x01\x37\x09\x60\xb3\x37\x23\x00\x5b\x12\x31\xf7\xf5\xbb\xc9\xf0\x83\x8c\xdc\x0e\x17\xf2\xed\x64\x04\x00\xc8\xf3\xf7\xc3\xc9\xbb\x51\x81\x70\x5d\xff\x44\xd2\x10\xa0\x54\x93\x06\x8a\x16\x2b\xf6\xcd\x68\xf2\x61\x3c\x9b\xf5\xd1\x62\x07\x1e\xed\x8f\xef\x47\x57\x11\x95\x29\xa6\xb3\xa1\x7f\x3e\x92\xb0\xef\xc7\x70\xff\x18\x41\xb3\x44\xdd\x4e\xd0\xef\x74\x4c\x81\x5f\x82\xb1\xad\xa1\xef\x09\x23\x7b\x21\x47\x63\x68\x88\x50\xde\xa3\x8b\x04\xe7\x9d\x82\xbb\x45\x1f\xc1\xc2\x6f\xe2\x9c\x10\xfb\x20\xdc\x08\xd6\x1e\x5d\xcd\xc6\x93\x91\x9c\x8c\xa7\x7f\x94\xc3\x29\x4f\x2b\x61\xc1\xa1\x9d\x9b\xd1\xe4\xed\xf5\xe4\xc3\xf0\xea\x3c\x60\x8e\x93\x65\xf4\xa3\x05\x2e\x73\x39\x7d\x7f\x7d\x7b\x79\x91\xfd\xde\x4f\xd3\x88\x78\xda\xc7\xbf\x8e\x0a\xa0\x1e\x1f\x4e\xa7\xb7\x1f\x46\x84\x87\x9e\x02\x0c\x76\x78\x79\x29\xaf\x46\xe7\xa3\xe9\x74\x38\xf9\x44\x28\x5f\x88\x2c\x4d\x46\x37\xc3\x31\xd1\x5c\x4c\x26\x23\xe0\x63\x0f\x01\x89\x93\x9c\x26\x83\x88\xf7\xf7\x13\xa4\xfb\x66\x22\x19\x7f\x5c\x78\x01\xb8\x70\xc0\x2a\xb7\x56\x1f\x90\xc4\x11\x8d\x0d\xc4\x25\xf2\xe3\xfb\x6b\x60\x73\x87\x20\xd7\x27\xde\x1f\x93\x51\x88\x82\x8d\xd2\x9d\xea\x27\x35\xee\xce\xe1\x9b\x6b\x3f\x0d\x1d\x3a\x76\xbf\x46\x04\xe3\x4d\x76\x81\xff\xb4\xa0\xa8\x5c\x2f\x24\xbb\xc3\xd5\xb1\x9f\x81\x1d\x70\xc6\xc2\x6f\xb6\xab\x04\x16\xde\x3e\x97\x09\xc2\xb9\xbb\x01\x03\xe8\xfa\x62\x38\x1b\x0a\xe8\xf1\x6c\x28\xdf\x8c\xfc\xd3\x93\xd1\xd5\xc5\x68\x02\xe7\x09\xd9\xf8\x67\x00\x35\xf7\x6f\x8c\xa6\x72\x7a\x3b\x9d\x0d\xc7\x57\xb8\x28\x40\x3f\x3f\x91\xb3\xf7\xe3\xc9\x05\x1f\x28\x01\x7b\xf4\xed\x70\x7c\x79\x3b\x09\xbc\xf0\xdc\xa9\xd9\xb5\xbc\xbe\x19\x41\x93\xb0\xdb\x92\x05\xc1\x27\xa6\x47\x11\x2f\x3d\xbd\x3d\x7f\x2f\x22\x3b\x4a\xba\x70\xdf\x40\x28\xdf\xc5\x54\x8f\xae\xf0\xb9\x9e\x20\xa8\x10\xc3\xcd\x46\x57\x4b\xf3\xe5\x95\x37\x3f\xbc\xe8\x1f\x42\x4a\x13\x82\x29\x66\x70\xef\x23\x7d\x68\x2d\xaf\xf4\x23\xdf\x6e\x4e\x08\x2e\xe9\x83\xb9\xe9\x52\x81\x92\x15\x00\x0d\xe4\x85\xe4\x80\x34\xf9\x49\xe8\x8a\xbc\x83\xca\x70\xae\x91\x1b\xeb\x9c\x99\x97\x5a\x6c\x51\x53\xbf\xdf\xae\x55\x65\x9a\x1d\xf2\x50\xcf\xfd\x23\x8f\x0a\xf3\xab\x16\xf7\x46\x3f\x50\xf6\xa6\x71\x21\x04\x6f\x9a\xfc\x06\x20\xef\x55\x08\xc6\x2f\x54\x95\xeb\xef\x09\x62\x2a\x78\x6a\x12\x7f\xe1\x2c\x9a\x0b\x4d\xa3\xc8\x96\x6e\x27\xea\xba\xa8\x29\x52\x4c\x6a\x0c\x08\x33\xa7\x56\xbe\xcb\xbe\xbb\xf0\xb2\x40\x94\x04\x3e\x0b\x9e\xf5\x50\x54\x8c\x9c\x00\x60\x9a\x03\xa4\xd5\x35\x44\x0a\x8e\x9e\xfa\x85\xad\x1e\xf4\x8e\x2c\x79\xc8\x28\xc4\x64\xf1\x3c\xe2\x06\x4d\x41\x1b\xee\xde\x6e\xcb\x25\xd1\x93\x46\x27\x9a\x96\x07\x41\x01\x38\x90\xa5\xa9\xc8\x8d\x2e\x36\x16\x1c\xfa\xb9\x1b\x09\xec\x38\x72\xb0\x1b\x7f\x93\x6f\xab\xe5\x40\x88\xff\xec\x27\x12\xde\x65\x28\x53\x32\xf6\x1f\x1c\x66\xc6\xa2\x77\x7e\x5e\x1b\xbd\x92\x66\xa9\x15\x04\x22\x21\xc2\xd3\x80\x02\x37\xf8\x2f\x49\xa1\x5b\x04\x15\xee\x76\xf2\x3f\x33\x3f\x14\xaa\x36\xff\x85\xb8\x13\x82\x1b\xa9\xc3\x31\xc8\x30\xa4\x6c\x4d\x51\xbf\x4d\x40\x1e\xfb\x90\xcf\x5a\x02\x48\x60\x4f\xbc\xd1\x7d\x45\x2f\x14\xa9\x0e\x14\xa3\xd3\x0c\xa1\xb4\xb5\x3c\x6c\xc5\x6c\xba\x6a\xf0\xa0\x3b\xc2\xd4\xc3\x4a\x51\x95\x7b\xbb\xa1\x10\x07\xd7\x94\xc1\xbc\xe0\xd5\xb6\x44\x6b\x84\xcb\x98\x60\x2e\x06\x5e\xd2\xaf\x43\xf2\xad\x7e\x20\xae\x67\xb3\x86\xca\x47\xd1\xe5\x6f\x57\x9d\x7b\xd6\xd6\xdf\x70\xcd\x4e\xb5\xfe\xda\xf4\xad\x18\x73\x8d\xb6\x91\x3f\x4c\xde\xc0\x4c\x37\x66\xf4\x5f\x66\xee\xd5\xa7\xd6\x24\xc4\x80\xd1\x57\x42\xd3\xf6\x9a\x52\xe2\x5a\xfa\xf1\xd3\x10\xd5\x42\xbe\xfc\xe9\x85\xfc\xa0\x9c\x13\xc3\x07\x5d\xc8\x73\xb5\x9e\xd7\x66\x79\xa7\x19\x97\xfa\xec\x97\x42\xde\x4e\x87\x84\x0a\xf2\x96\x5d\x9b\x36\x82\x82\x3a\x44\x42\x02\x9b\x71\xbe\xc3\x9a\x04\xb5\xad\xcc\x82\x10\x39\x1b\x60\x4c\x33\xe5\x00\xa4\x64\xe6\x17\xcd\x22\x72\x45\x90\x61\x76\xdb\x6c\xb6\x8d\x54\x7e\xba\xea\x10\xf1\x82\xb2\x89\x30\xee\xc7\x7b\x5d\x01\x09\x71\x03\xa6\x06\x20\x0d\xb2\x90\xdc\xda\x2e\xf5\x2b\x21\xde\x55\x76\x1d\xd8\xd0\x99\x5b\xe4\x97\x42\xb6\xf1\xbc\x5f\xbe\xc8\xfc\xe4\xc9\xf4\xcd\x85\x5d\x6b\x87\x19\x1c\xc3\x37\xd3\xeb\xcb\xdb\xd9\xe8\xf2\x53\xaa\xcb\xbe\x86\xd5\xa6\x85\x96\xcd\x6e\xa3\xe5\x9f\x9d\x9f\x9c\xc7\x1f\x08\x23\xd3\x3e\xb9\x18\x23\xe7\x94\xe9\x47\x5d\xfa\x6f\x60\x35\x89\xfc\x20\xa3\x50\x66\x64\x55\x34\x8c\x5e\x27\x9f\x11\x8b\x1f\xd2\x0e\x10\xa0\xe8\x7e\xb7\xf1\xe6\x56\xc3\x45\xf9\x31\x00\xca\xfd\x82\xa5\xc1\x7f\x2c\x7e\xe0\x5d\x09\xff\x6c\xb0\x60\x46\x08\x3c\x66\xd6\xdc\x3e\xf7\xe2\xf5\x4a\x2e\xec\xb6\x76\x54\x2f\x2c\x7c\x0e\x5c\x6f\x8e\xfd\xee\x62\xa1\xca\x12\x5c\x68\x6b\x0d\x78\xc9\x34\xcf\xa1\xb7\x67\xaf\x11\x9c\xb5\x80\xee\xc1\x39\x06\x6a\xf2\xad\xd3\xc7\x8b\xd2\x2c\x3e\x3b\xac\x30\x57\x6d\x31\xeb\xe7\xf8\xd8\xcb\x58\xb0\x69\xdd\xd6\x34\x2e\x43\xc9\xe6\x27\x10\x62\x48\x77\x9a\x04\x94\x5e\x6f\x4a\xbb\xd3\xb5\x3c\x64\x14\x29\x55\x15\x0c\xa0\xc4\xb5\xae\x8f\x24\xe3\x6e\x9d\xb7\xa4\x4b\xac\x47\x57\x61\x64\xd7\x99\xbb\x4a\xaa\xe4\x7e\x49\x50\x28\x07\x31\x64\xc9\x0a\x81\x3f\xb0\xcc\xdf\x3f\x90\xef\x35\x64\x54\x39\x00\x4b\xbe\xa6\x02\xcc\x0d\x53\x01\xbe\xf2\x1d\xdf\xd9\xe5\xae\xd2\x7c\x74\xa9\x8e\x37\x7f\xc2\xb5\x2a\xf6\xc1\x51\xd0\x2e\x14\x39\xe1\xf3\xf6\xe7\x64\x5b\xff\x20\x0e\xc3\xe0\xc0\x2d\x08\x39\xc4\xe0\xb7\x34\x25\xd5\x83\x80\xf3\x08\x90\x3a\xc0\x74\xfb\xbf\xac\xe7\xfe\x97\x47\x21\x66\x35\xdf\xc9\x3f\xf8\x4e\x8a\xf7\x6a\xf1\x19\xf8\x1b\xff\x33\x16\xd5\x23\x52\x8a\xd9\x4e\x9e\x5b\x5b\xfd\x97\x42\x9e\xca\xe1\xa6\x36\x25\xc2\xe7\xe9\xc7\x85\xbc\xa9\xb5\x03\xee\x71\xff\xf0\xaf\x66\x01\x08\x74\xd5\xfc\x10\x42\x0f\x18\xd2\x06\xb7\xcd\x7f\xfa\xdb\x33\x40\x06\x3f\xbe\xbb\x3c\xbb\x99\xfe\x47\xf2\x3f\x9f\xbe\x3c\x39\x6b\xf3\x3f\x3f\x7f\xf1\x3b\xff\xf3\x3f\xe5\x0f\xac\x7e\x00\x42\x72\xc6\xc7\x59\x21\xaf\xec\x83\x06\xe7\x59\x8b\xf1\xcb\x5f\x10\xfe\x47\x85\x3c\xbf\xaf\x8d\x6b\xec\x06\xc4\xe0\xf6\xdf\x94\xa9\xb4\x10\x37\x19\xd8\x16\xc8\x27\x22\xee\x20\xf3\x93\x9b\x56\x2a\x00\x20\x01\x32\x3e\x1e\xae\x37\xc0\x7c\xf8\x6d\x72\xa0\x15\x02\xfa\xe8\xec\x93\x63\xb9\x0d\x8e\xca\x40\x93\x82\xb1\x22\xb1\x14\x44\x04\xdb\x07\xac\xc7\xdc\x42\x80\x55\x35\xfd\x68\x3a\xd4\x34\xc2\x38\xbb\x6d\xba\xed\x06\x10\x02\xd5\x5d\x3e\xa0\x41\x7b\x7a\x48\x1d\x6d\x4d\x4d\x00\xef\x74\x92\x12\x13\xd4\xaf\xe8\x1f\xee\x2b\xf0\x1c\x10\xf1\x51\x8e\x2c\xf3\xef\xf5\x14\x09\x80\xca\xcd\xe4\xc0\x75\xf9\x67\x5e\x0b\x71\x76\x44\xce\xd2\xcf\x29\x0f\x7e\x2b\x00\xca\x0e\xdd\xfc\x7b\x3d\xf8\xae\x42\xb0\x53\x38\x96\xca\x01\x20\x87\x92\x84\x97\xcc\x2c\xb1\x5d\x1a\xa5\x0c\x60\x59\x8a\xf2\x8a\xac\xab\xa0\x5e\x3f\xf8\x76\xe4\x5a\x7b\xfb\xcd\xb8\x75\x74\xdd\x51\x00\x28\x2a\xd0\x61\x22\xc9\x3c\x85\x9a\x1d\x54\x11\x24\x80\xaf\x75\xaa\xb9\x85\x70\x9f\x5d\xc9\xa5\x6a\x54\x87\xc6\x2d\x25\x87\x3a\x50\x5e\xc3\x39\x88\x0a\x37\x86\x28\xa9\x6a\x73\xa6\x72\xff\x47\x93\x60\x0e\x7e\x5c\xea\x4d\xad\x17\xaa\xd1\xcb\xff\xf3\xdd\xdb\x8b\xcb\xe3\xd3\xc1\xd9\xdf\xf9\x36\x78\x5a\xfe\x3f\xff\xe9\xf9\xf3\xe7\x2d\xf9\xff\xe2\xe4\xd9\xf3\xdf\xe5\xff\x3f\xe3\x8f\x37\xae\xc0\x2e\xba\xc8\xd2\xc7\x7b\x88\x20\x5b\x77\xc2\x59\x3b\x0b\xf0\xec\xe4\xe4\xa4\x38\x3b\x39\x39\xf5\xff\xf9\x5a\xd5\x80\x76\x3e\xa0\x48\xf3\x01\xe5\xff\x84\xf9\x80\x52\xca\x93\x81\xbc\x99\x8c\x86\x1f\xde\x5c\x8e\x28\x45\x21\xd6\x69\x69\x17\xe4\x62\x5d\x11\x0a\xb5\x6e\x55\x59\xc8\x46\x7f\x69\xe6\xd6\x7e\x4e\x68\xcb\x56\xdb\x6a\x81\xf5\x8a\x04\x31\xa3\xaf\xb6\x65\xb8\x32\xe4\x81\xb7\x90\x0e\x82\xc8\xc2\xd2\xec\x2b\xce\x1b\x7b\x85\x71\x1e\xc8\xd9\x09\xee\xac\xe6\x5e\x8b\xe0\x26\x4a\xd3\x01\xc3\xec\xb4\xec\xa9\x3d\x8c\x7b\x94\x52\x10\xe4\x75\x04\xfb\x20\xc3\x4e\x86\xff\x29\x77\x50\x0b\xd1\x56\x4b\xa0\xc9\x6a\x55\xde\xdf\x70\x95\x40\xc1\x52\x55\x85\xe2\xd3\xc1\xa1\x02\xb0\x1e\xf4\xe4\x79\x13\x84\x8a\xde\xd2\x0b\x86\x73\x0c\x1e\xef\x4d\x09\x00\x75\x31\xd7\x44\x2f\xe8\x55\xe5\x1a\x88\xc7\x28\x69\xab\x0c\xa0\x99\xe4\x2a\x02\xf2\xc8\x90\x96\xc2\xa2\x3b\x59\x2e\x25\x3f\x1b\x0c\x0d\x81\xbd\x52\xea\x55\x73\x50\x50\x90\x8c\x91\x46\xaa\x91\x6d\x7a\x2b\x0e\x37\x87\x25\xc3\x04\xa8\x7b\xbd\x76\xba\x7c\xd0\xce\x1b\x67\x60\xe6\x9a\xe4\xbe\x73\x54\x2f\xb3\x21\x98\x11\xa6\x93\xfa\x95\xdb\xef\xe8\x28\x62\xc0\x0e\x7d\x23\xbe\x87\x21\xa0\x1b\x32\x0e\xfd\xc8\xfd\xf7\x44\x92\xc1\xf4\x51\xa3\x73\x25\xa6\x25\x66\x63\xaf\xa4\xad\x97\xe8\xe8\x4b\x92\x29\x71\xd3\xba\xd0\x60\x62\xa7\xcf\x35\x42\x82\xf3\xc0\x5a\xa5\xf5\x92\x4c\xfa\x4c\xe5\x79\x25\x55\x16\xde\x64\x6b\xd3\x9b\xf7\xe8\x41\xe0\x4f\xe1\xe5\x19\x62\x72\x7e\xa6\x68\xff\xc6\x34\xa9\xe4\xde\xb6\x90\x35\xcb\xf5\xeb\x93\xa5\xf4\xc7\x96\x8b\x88\x00\x80\x9a\xde\xa0\xef\xbc\x06\x74\x96\xaa\x02\x93\x1e\x2b\x99\xfe\x7c\x6e\x55\x29\x70\xab\xd5\xfa\x4e\xd5\x4b\x28\xde\x06\x25\xc5\x11\x30\xb1\x56\x4d\x83\xc5\xd6\x38\x21\x0f\x45\x45\xf4\x0b\x92\x85\x6c\x80\xf1\xcd\x1f\xf7\x81\xfc\x08\x8e\x2d\x7f\x5a\xda\x55\x20\xfd\x73\x0b\xb3\x81\x43\xb5\xa2\x4c\x1a\x87\xd9\xaf\x41\xb6\x80\x47\xc8\x35\x35\x32\x87\x62\x15\x35\x08\xfe\x32\x8e\xe6\x74\x10\x62\x40\x31\x30\x76\x31\x7a\x3b\xbe\x62\x17\x7e\x5e\x19\x36\x4f\x45\xc2\x59\xc9\x33\x91\x3a\x99\x2a\xa4\x0a\xff\xe6\xc4\x24\x9a\xee\x6f\x49\x4c\x0a\x0e\x94\x29\x66\x40\xd2\xa7\x40\xd9\x75\x88\xfd\x2b\x97\xc7\x39\x69\x1e\xec\xf8\x10\xdb\x8f\x25\x64\x4c\x15\x0a\x9f\x16\x11\x63\xa5\x08\x8d\x1c\x35\xe0\x24\xba\x8e\xb5\x35\x05\x61\x53\x30\x1d\x8a\x2f\xc6\x9e\x7c\xa8\x58\x77\x34\xce\xe3\x23\x94\x5d\x1b\xc2\xf4\xf9\xbb\x92\x49\x70\xa9\x6e\x97\x49\xd0\x3c\x94\xd0\xd8\x9f\x93\x04\x50\x39\xd4\x5b\x53\xf0\x82\x20\x7f\x4c\x0a\x53\xcb\xb0\xd1\x3a\xc2\x1f\x81\x88\xed\x31\x70\xd4\xf8\xd5\x48\x72\x21\x71\x09\xe2\xb2\x95\xea\x71\x20\xc4\x50\x1e\x7c\x60\xfb\x83\xee\xfe\x03\x76\x76\x5d\x04\x31\x87\x50\xc8\x3d\x49\x5b\xfc\x98\x78\x22\x6b\x0b\x2e\xe4\x65\xb8\xa0\x0b\xd9\x9b\xbd\xc5\x6e\xfb\x90\xa7\xbb\x14\x00\x9b\x60\x88\x79\xa9\xaa\xbb\xad\xba\xd3\xd8\x6f\xbe\x83\x76\x5c\x99\xf7\x00\x67\xbb\x52\x6b\x0d\xa9\x54\x10\xc8\xc2\x5c\xb2\x55\x6d\xab\xe6\x98\xce\x33\xd3\x5d\x12\xf1\x60\x18\x26\xc9\x7c\x2f\x9d\x02\x6d\x63\xb9\x4b\x28\x17\x35\x52\xfc\x42\xa1\xf6\x74\x99\x1d\x64\x3f\xda\x3a\xe4\xb0\xb7\x27\x90\x1c\xd2\xfc\xef\x1f\x9c\xb4\x0f\x60\xaa\x04\x51\x73\x88\x40\x0e\xae\xbe\x86\x3d\x75\x47\x94\x4a\x44\x09\x30\x7e\x1a\x42\x96\x0e\xfa\x04\x57\x80\x83\x60\x32\x3c\xdf\x55\x4a\x40\x6d\x7f\x61\x20\x0e\x67\xf7\x5b\x47\x44\xaf\x49\xdf\x40\xe2\x60\x22\x8d\x0a\x5a\x0b\xd0\x1d\x28\x7f\xb3\xa9\xc6\x2c\x5c\x21\x95\xec\x4c\x77\x20\x07\xd5\x5f\x36\xa5\x62\x19\x12\x5f\x1a\x1c\xc1\x81\xca\x66\x0d\x3b\x3d\x47\x45\x09\x85\xeb\x4a\xde\x1b\xd7\xd8\xda\x2c\x54\x29\xfa\x0a\x1b\xf2\x14\xf1\x96\x69\xcd\x11\x2a\x58\x2b\x4c\xfe\x2d\x12\xd5\xa5\x10\x9b\x7b\x53\x5a\x67\x37\xf7\xbe\xed\x42\xea\x06\xfe\x02\x59\x47\xb6\x34\xe8\x19\xde\x58\x87\x34\x91\x78\x05\xd0\xa6\x5e\x93\x13\xf9\x60\x5c\x3d\xa8\xda\xa8\xaa\x09\xe5\x9f\x0f\xc0\xb2\x66\x8f\x74\x67\x56\x58\xa0\x37\xa6\x81\xac\xa9\x9a\xaf\x62\xdf\xe7\x42\x00\xc3\x0f\x7e\x84\x54\xc9\xee\x17\x0a\xd6\x1f\xd2\xe4\x16\xa7\x76\xc9\xc5\x18\xce\x1c\xd4\x29\x06\xa6\xea\x65\x5f\x45\x59\xa8\x26\x1b\x36\x7c\x40\x4e\xad\x4c\x43\xf9\x7b\x16\x54\x05\x46\xf9\x7a\xe1\x15\x47\x04\x4c\x8c\x1d\xe5\x98\x31\xee\x61\x50\x5e\x86\x85\x41\xa0\x10\x0d\xdd\xc3\x1c\x0b\xd8\xbe\xf2\xdf\x74\x6d\x7b\x46\x1b\x90\x6d\x61\x47\x86\x6e\x52\x4d\x46\xa8\xf6\x29\xba\x6f\x62\x07\x9b\xa4\x20\x69\xa5\x79\xdd\xce\xfd\xf6\x97\x33\xfd\xa5\x69\x2d\x18\x46\x54\x36\xca\x39\x28\x38\xe9\x4f\xaa\xfe\x42\x67\x1f\x5d\x26\x0e\xdc\x2c\xca\xc9\xb7\x20\x34\xa0\x25\x01\x2d\xf9\x9d\xf3\x46\x2d\x3e\x1f\x27\xad\x7f\xc7\x62\xc9\x64\xb1\x44\xdf\x62\x0d\xd3\x4f\x42\xf3\x0c\xd8\x57\x0d\xc6\x84\x5f\x78\x09\xbc\x74\x9c\x7f\x1b\x3b\x23\xfa\x9e\x3e\xa3\xc7\x51\x5e\xce\xbc\x54\xdd\xa8\xda\xdf\x6d\x59\xc0\xad\x2d\xe7\xfb\xb3\x1f\x8a\xc8\x5f\x06\x72\xd9\x4b\x55\x08\x86\xd1\x86\xe7\x6a\x3a\x81\x39\x33\xf1\x1f\xa1\xf8\x23\xff\x0c\x5d\x8d\x9c\xf1\xe7\x84\xdb\x9a\x90\x1a\x83\x68\x4f\xbe\x5a\x82\xa2\xed\x9a\x5a\xf9\x5b\x6b\x65\xeb\x47\xaf\xa8\x91\x54\x86\x16\xcd\x02\x97\xd0\xdb\x10\xb6\x86\x88\x08\x54\x42\x37\x58\x52\xd4\x6b\xdd\x16\xb0\xb8\x2b\xb9\x31\x5f\x74\xe9\x8e\xc2\x7b\x1b\x65\xaa\x26\x40\xf1\x24\xbf\xb9\xac\xd5\xa3\xa9\xee\xdc\x91\x80\x7c\x3c\xaf\x7e\x94\xbb\x64\x3c\xf4\x7b\xfa\x62\x11\x3d\x89\x40\x8e\x9e\x0c\xc6\x54\x9b\x2d\x4a\x7f\xfd\xa5\x11\x38\x5d\x0d\xde\x15\xa8\x88\x32\xfe\x37\x5c\x79\xe4\x29\x54\xd2\x6f\x76\x8d\x21\x5a\x7c\x2f\x6f\x5a\x64\x4d\xcb\xd8\xb4\xdf\x45\xb0\xb8\x60\x04\x61\x64\x30\x02\xde\x93\x3d\x80\x40\x01\x7c\x91\x40\x88\x6b\x55\x7f\xde\x6e\x40\xa0\x26\x99\xbd\xfc\xd3\xc0\x4e\x06\xae\xac\x3b\xae\xcb\xfc\x08\x38\x06\xd0\x48\x16\x76\x5b\xab\x3b\x2d\x12\x16\xb0\x8c\xf0\x7e\x8e\xf9\x88\x7e\x02\x48\xa6\x24\xfd\xf1\x4a\x14\xae\x19\xef\x2b\xe3\x44\xeb\x19\x7f\x79\x65\x5a\xbc\xff\x52\xa3\xb0\x86\xac\x5a\xdb\x2d\x86\x51\xfc\x94\x84\x79\xe0\x5d\xe6\x9b\xca\xcf\x80\x71\x92\x02\x72\x07\xd7\x1b\xf5\xd7\xad\x3e\x80\x1a\xad\x10\x84\x22\x3b\x20\x4e\x38\xac\x80\xff\x6c\xda\x1d\xf2\x33\x30\xa1\x2f\x5e\x83\xc3\xe9\xf9\x78\x1c\x93\x4f\x69\xf6\x66\xfa\x8b\xa9\x56\x96\xb6\x04\x36\x58\xc8\x4b\x35\xd3\x7f\x6a\xfd\x6c\xfa\xee\xc3\xa5\x9f\xd0\x3f\x7d\xb8\x24\x0a\x1c\x15\x2a\x9b\x8b\xb8\x09\x2f\x66\x17\xb8\xf3\x38\x7b\xe3\x78\x61\x21\x3c\x0d\x89\x18\x90\x87\x29\xdf\xcf\x3e\x5c\x16\xf2\xc6\xba\x66\x8a\x55\x1a\x6d\x2d\x6f\x2e\xde\x06\xe3\x10\x6c\x74\x40\xd9\x64\x0b\x35\x90\xe9\x2c\x34\xe9\xfc\x27\xeb\x13\xc7\x7d\x73\xf5\xae\x10\x7f\x3a\x7f\x0b\xdd\xf9\xc3\xcd\xbb\x81\xc4\xf9\xec\x3c\x88\x51\x55\xdd\x70\x95\x02\xc5\x14\x25\x64\x32\xf8\xdd\x01\xc9\xc4\xfe\x64\x71\x02\xd2\x7c\x97\xbd\xe7\x25\x9a\xff\xc1\x02\x28\xda\x5c\x3e\x5f\x60\x56\x85\xa4\x97\x8b\xd9\x05\xd3\x7d\xd0\x0b\xc8\xf9\x63\x4b\x47\x17\x46\x93\x3a\x8d\x79\x6a\x8b\x90\xeb\xcc\x82\x10\x1f\xf2\x72\x6f\xdf\x8c\x06\x8a\x7b\x22\xe5\x68\x77\x13\x7a\x46\x61\x7d\xb2\xf5\x9c\x00\x0a\x36\xba\xb0\x66\x5e\x5f\x90\x37\xea\x4e\x13\x75\x42\x41\xe9\x4f\x64\x5d\x4a\x74\x26\x81\x09\x05\x8f\x6e\xfc\x4a\x20\x81\x7e\x21\x37\xe5\x16\xd3\x31\x92\x2a\x02\x1b\xac\xa8\x4c\x43\xd5\x7a\x89\x27\xd6\x9b\x6b\x85\xd7\x96\xcc\xbc\x24\x64\x55\xa8\x7b\x90\x5e\x47\x82\x98\x2e\xd1\xf0\x09\xc1\x8e\xbc\x03\x08\x33\x46\x43\xd6\x54\x61\x4d\x71\x09\x96\x36\xe4\x93\x60\xae\x5e\xec\x37\x25\x8f\x14\x3d\xe3\x26\x84\xf9\x97\x46\x56\xfe\x93\x18\xd8\x70\x4d\x4c\x5a\x17\xd8\x99\x98\xde\x81\xe6\xcf\x0f\x0e\x3f\x50\x00\x95\x88\x0e\xae\x85\xb9\xbe\x33\x98\xbc\x4c\x0f\xcf\xed\x92\xaf\x3e\x01\x92\xc2\xdf\x8e\xac\x22\x1d\x8c\x2a\x68\x65\x29\xff\xf4\xe9\xff\x38\x08\x37\x22\xda\x14\x6e\x3b\xdf\x56\xa6\xe9\xdc\x9b\x89\xc6\xc7\x1e\x34\x08\x0f\x00\xa3\x49\xb9\xf3\x4d\x51\x0e\x00\xea\xf1\xfe\xdf\xa8\x73\xeb\x0a\xf0\x66\x2e\x05\xd8\xb3\x3a\x22\x82\x19\x14\xde\xe8\x18\x42\xf2\xf0\xbd\xd7\x7e\xfc\xaf\x89\x62\x06\x37\x4d\x28\x6d\x47\xe3\x12\x15\x86\x5e\x80\xe1\xd0\x6f\x26\xb4\x6c\x91\x77\xc8\xc9\x83\x61\xac\x88\x00\xfe\xa9\x83\x42\x1e\x5c\xe8\x25\x1b\x66\xfe\x9f\x23\xac\x3f\x40\xbf\xf6\xb7\xec\xc1\x7b\x50\xdc\x77\x07\x5e\xd3\xb7\xf2\xe0\x86\x5c\x7f\x30\x39\xb0\xae\x07\x28\x45\xc1\xb4\xe7\x19\x86\xbc\xf2\x84\x2b\x29\x33\xc1\x12\xe7\x9b\x69\x28\xa5\xc8\x25\x2f\xb7\x96\x47\x2d\x16\x96\x74\x76\xe4\xac\x48\x32\xd6\xe8\x60\xc5\xa6\xd5\x2e\xc8\xa1\x8f\x0c\x80\xba\x08\x18\x05\x27\x2b\x98\x78\x9b\x2a\x73\xb8\x8f\xc1\x4b\xe0\xb8\x7e\x64\xbf\x73\x25\xdd\x0f\xcc\x3d\xd5\xfb\x15\x55\x6b\x91\x38\x32\x51\x99\x0e\xa5\x42\xe0\x86\x24\x7f\x0f\x9e\xb6\x94\xe0\x73\xbe\x6d\x50\x24\x42\xfd\x06\x6f\xae\x38\xc1\x10\x08\x28\xc5\x8e\x1f\x34\xda\xbd\x4a\x88\x37\x20\x04\x45\x37\x30\xeb\xa4\x7b\x7a\x07\xfa\x3a\x33\x01\x3d\x58\x20\xe3\x5a\xc2\xc5\x5f\x59\xc2\x23\x72\x2c\xcf\xaf\x54\x38\x54\x89\x12\x0b\x4e\xaa\xb3\x81\xfc\x75\x34\x79\x33\x9c\x8d\x3f\x30\xa7\x8e\x10\x5f\xcb\xb9\x8e\x6a\x72\xee\x8e\xea\xf1\x49\x8b\xae\x4f\xba\x1b\x07\x4e\x67\x2e\xf7\x58\x11\x6c\xb3\x40\x2a\x93\x24\x55\x86\x96\x3d\x30\x05\x7c\x7d\xad\x89\x4f\x8e\xc5\xbf\xc8\x42\xcc\x45\x4e\x9c\xa6\x96\x4b\x3f\x8f\x5c\x17\x20\x78\xa1\x62\x5d\x7d\x6c\xdd\x72\x12\x55\x6a\x1b\xa4\xd9\x59\xe0\xd9\xd2\x8b\xfb\x0a\x2c\xd8\xb5\x56\x6e\x4b\x72\xda\xce\xd1\x77\xc8\xe2\xa6\xb6\x80\x21\x11\xfe\x62\xa5\x3c\x3b\xce\xe7\xa2\x44\xbc\x98\xd4\x0c\xaa\x4c\x88\xfe\x66\x3e\xa6\x98\x8c\x28\x02\xc9\x2c\xba\xaa\xbc\x76\xad\x2b\xa7\x7a\x69\x03\xb0\xcd\x90\x2b\x93\x06\x7b\x65\x09\x6c\x2d\xba\xb2\xdb\xbb\xfb\x24\x6f\x27\xed\xc6\xd6\x35\x08\x53\x42\xe1\xd8\x76\xde\x79\x63\x8e\xc4\xc2\xb3\x41\xdc\x5e\xf0\x46\xa9\xab\x98\x1d\xd9\x0a\x7e\x77\xfc\x7f\x5c\xef\x24\xa5\x4a\x60\x85\x2b\x10\x55\xd0\x58\x60\x7b\x3f\x1b\xf0\xae\x96\xe3\x2b\xf9\xdf\x6e\x87\x57\x33\x20\x44\xa7\x71\x72\xe2\x1a\xdf\xdc\x34\xa6\xc3\xc8\x22\x63\x2a\x0a\x83\x93\x27\x67\xbd\x86\x63\x0d\x27\x8f\xbd\xc9\x50\x88\xc2\x1d\xb5\x2f\x9b\x82\x26\x0b\x93\x9c\x91\xc0\xad\x92\xa7\x27\x27\x51\x6b\x49\xdc\x4c\xec\x45\xa4\x8d\x1d\xae\xf4\xcc\x80\x0d\x93\xad\xab\x45\x69\x9d\x4e\xf7\x03\x80\xee\x1e\xc0\xfd\x89\x7a\x5a\x5d\xef\x0a\xb1\x28\xb5\xaa\x89\xb3\x28\x68\x12\x84\x57\x82\x72\xc2\xa1\xf5\x57\x1d\x93\x36\x24\x0f\x82\x4f\x0e\x87\x89\x7d\x6f\x9b\xd6\xfc\xe0\x5c\x2d\x3e\x63\x2f\x06\xf2\x8d\x6d\xee\xb9\x47\x71\x83\x50\x7f\x44\xd2\x9f\xe8\x3c\x80\xa3\xe7\x72\x6f\x5d\x64\x86\xe0\x3d\x3a\xe3\x1e\x61\xeb\xc8\x6d\xc7\xa9\x7f\x01\x0d\x8d\x2a\x0c\xd2\x16\x94\x25\x5a\xd7\xbc\x42\xf8\x3b\xfd\xd7\x2d\x68\x93\x89\xba\x52\x2d\xa5\xb7\x69\xe7\x65\x72\x8c\xbd\x2c\xc8\x6b\xe9\xf2\x68\x69\x70\x5e\x90\x50\x05\x93\x01\xc0\x71\x4c\x75\x87\x11\x14\x3c\x60\x2e\x8d\x7a\xc4\xf7\xc0\x71\xc1\xf9\xb9\x80\x1d\xdc\xa4\xb7\x32\xf6\x91\xc2\x58\x51\x86\x79\x2b\x42\x35\xc6\xe1\x75\xdc\xe2\x33\x21\xdd\xbc\x01\x94\x3e\x78\x7b\xd2\x38\x2b\xf4\xcb\x54\x81\xe4\xc9\x6b\x1e\x40\xff\x47\x5e\x9d\x50\x67\xa8\x81\x25\x05\x6a\x3d\x16\xe8\x7e\xa5\x15\xd0\x84\x5b\xe4\x00\x31\x95\xdd\x82\x1c\x5b\x99\x26\x6c\x2c\x10\x39\x14\x47\xda\x6c\x69\x31\x4c\xed\xfc\x55\xa4\x1d\x39\x6c\xe4\xa1\x72\x72\xed\xaf\x0d\xe5\xe0\xed\x5a\x2b\x67\x2b\x35\x2f\x77\x47\x3c\xb3\x6a\x01\x11\x9f\x64\xc7\x45\x8a\xec\x7b\xa4\x8a\x94\x16\xfc\xcd\xcb\xbf\xa8\x85\x9f\x18\x24\x65\xee\x1c\xec\xdc\xff\x4e\xb6\x4e\x4e\x10\x15\xe6\x36\x3f\xad\x22\x9e\xd6\x78\xea\x48\x63\x24\xdd\xa4\xc7\xfd\xd2\x32\x39\x77\x88\x83\xc6\xdd\x00\x98\xff\xd8\x85\x1d\x58\xef\x20\xd7\x30\xd8\x27\x7b\x9f\x92\xc8\x75\xb1\x6d\x74\x7d\x5c\xe9\x06\xc8\x53\x4a\x4b\x4a\x02\xa4\xcd\x46\x2b\x8a\xdd\x36\xf4\xdc\x31\xda\xa4\x14\xdf\xf0\xba\x81\xbf\x0a\x9c\xc3\xd4\xea\xc7\xaa\xb4\x6a\x29\xd2\x67\x8e\x03\xbd\x00\xb5\x00\x4c\x33\x76\x01\x56\x58\xe4\x5e\xe8\x0c\xb2\xe5\x9e\x2f\x30\xb0\x68\x57\x54\xec\x87\xcf\x4d\xb8\x5e\x38\xa7\xbe\x24\xc7\x32\x71\x2e\x84\x79\x6e\xd4\x67\xb8\x08\x69\x5b\xc8\x4d\xbd\x5d\xa2\x6f\x49\x6f\x5c\x11\xf5\x52\x30\x18\xf2\x84\x4c\xbb\x6a\xad\xb2\xa9\xc4\x5f\xb7\x0a\x0a\xe5\x14\x58\x9c\x2b\x25\xd3\x34\xae\x3b\x1a\x80\xed\x53\x8e\x7c\x73\xbf\xe5\x59\x83\x74\x17\x8e\x76\xe2\x6d\x14\xd6\x61\x5b\x35\xa6\x8c\xe9\x1b\xb6\x42\x06\x14\xa9\x56\x0c\x8f\x2d\x21\xad\x83\x13\xd3\x33\x92\xcb\x6c\xb5\xb3\x72\x39\xcd\x7d\x0d\x97\x2e\xa6\xca\xdf\x21\x23\x5b\x8d\x05\xcd\xcb\x78\xe5\x28\xf4\xa8\x79\xe3\x81\xd3\x5b\x60\x39\xfd\x71\x20\x57\xe6\x5f\xb7\x1a\x9d\xa5\x5e\x31\x45\xde\x47\x3c\xec\x45\x46\x72\x07\xe0\xf8\x88\x04\xe8\x9c\x11\xf1\xa8\x21\xa5\x61\x65\x41\x97\xca\x88\x01\x30\x63\xa2\xbe\xd3\x1d\x1d\xa1\x48\xd3\x4f\xd6\x7e\x27\xdd\x7b\x93\x50\x00\xcb\x14\x32\x3b\x61\x82\xae\x97\xd5\x95\xdc\x6e\x96\x30\xbb\x19\x2d\x7d\xa2\xb3\xc3\xc5\xfe\x7c\x90\x97\x62\x79\x5a\x69\x55\xb2\x1d\x3a\xeb\x9c\xfe\xbe\xa8\x23\xa4\x9b\xb2\x0b\xbb\x55\x72\xad\xcb\xf5\x43\x0e\x63\x68\xa3\xfd\x39\x72\x22\x47\x43\x33\x57\x7a\x43\x04\xa5\xd3\xcd\x95\x89\xf4\x54\xb5\xed\xde\x08\x05\x6e\x51\xd4\x1e\xa8\x3a\xfc\x7e\xce\x4d\x1e\x35\x7f\x26\x80\x88\x20\x9b\x08\x15\xdb\x8d\x75\x4e\x23\x8e\x3a\x9c\x6e\xd3\x0c\xe4\x38\x5e\x73\xc9\x51\x65\x56\x61\x81\xac\xc2\xec\x77\x68\x8f\xe3\x95\x10\xc3\x81\xbc\x8d\xf4\x63\xd1\x99\x20\x0f\x91\x98\x26\xbb\x1a\x11\xae\x7e\x24\x15\xdd\x83\x98\x71\xbf\x68\x40\xe2\xa1\x7d\xd7\xd1\xb6\x7c\x33\xc4\xc2\x40\x01\x9b\x4d\xad\x1f\x8c\xbf\xa7\x02\x5e\xf3\x90\xec\x44\xb8\xa3\xfc\x67\x04\x06\x25\x1e\x21\x32\x51\xed\x0a\x24\x9c\x73\x09\x22\x91\x4c\xe7\x56\x2c\x32\x7c\xf7\x28\x68\x0a\x82\xc5\x1a\x02\x37\xa1\xdf\x84\x3a\xc8\xbb\xc1\x81\xbd\xc0\x14\xd1\x52\x76\x54\x13\x92\xde\x91\x31\x37\xab\x73\xff\x66\x20\x2f\x8d\x0b\xd6\x5d\x9c\x48\x24\xb3\xc1\x83\x5b\x20\xe3\x14\x25\xf6\x6c\x74\xed\x00\xad\x5a\x63\xc9\x30\x24\x01\x09\xb8\x1c\x41\x0e\x6e\xff\x62\x12\x30\xcd\x03\xbe\x7b\x16\xd6\x9f\xed\x3b\x1d\xc8\xfc\x44\x90\x81\x2b\x24\xde\x22\x50\x3f\xc1\x29\xf6\xc9\x15\x79\xe8\x75\x34\xd8\x68\x2e\x3e\x2d\xc2\x60\x0c\x30\x5e\xfb\x1b\x6c\xa5\x1f\x39\x0d\xc3\x7f\xe1\x08\x60\x05\x70\xa7\x79\x0d\x8a\x8f\xa0\xdf\x9e\xb4\x15\x4c\x28\xa0\x48\xc2\xe3\x7c\x20\xa7\x70\xe9\x66\x13\x08\xbe\x2e\xce\x63\xe8\x84\x8c\xdb\xe7\x26\x8c\x5e\xb4\xd5\x55\x94\x4e\x52\xca\x8b\x81\x0c\x5e\x16\xa6\x26\xea\xd8\xb5\x3d\xb2\x6d\x34\x90\xc3\xe5\xf2\xab\xe4\xa1\x81\x58\xbd\x15\x96\x67\x7d\xa8\xb1\x20\x26\x6c\x30\x20\xb3\xef\x0e\x84\x78\xeb\x4f\x34\xe8\x31\x85\x34\x6b\xb0\x71\x1a\x88\x9d\x84\x2b\xab\xcf\x0a\x6f\xdb\xdf\x77\xe6\xc1\x6b\x95\x09\x8c\x62\xd3\x86\x99\xf7\xcb\xb5\x1e\xb2\xad\x14\x2f\x14\x62\x75\x80\x29\x76\xf7\xf6\xb1\xe2\x9f\x0c\x97\x4b\x5d\x2d\xb7\x6b\xf4\x8c\x0d\x84\x78\x97\xcc\x34\x87\xd4\x5b\xdd\x0c\x56\x81\x3f\xda\xae\x3f\x96\x0b\x2e\x86\xa0\x03\xa7\xc6\x0d\xd2\x7e\xd0\xe7\xbb\x26\x1b\x7d\x24\xac\xfc\xfb\x30\xb3\x70\x9b\x55\x90\x23\xa3\x97\x39\x95\x60\x74\xc2\x8c\x93\xee\x23\x9c\x10\xe5\x4c\xf0\x9f\x05\xe7\x5d\x91\x8c\xb3\x71\xb8\x71\x29\xbe\xb8\xf4\xc6\x85\x80\x74\x4a\xc8\x2f\x0a\x34\xa1\x59\x4a\x29\x79\x5d\xbd\x6a\x52\x40\xd6\x6f\x38\x60\x39\xe4\x8f\xee\x98\xce\xa2\x29\x9e\x8b\x8e\xec\xe1\xd0\x70\x60\x75\x6c\x8f\x42\x84\x51\xb4\x27\xb2\x90\x0b\xb0\x57\x40\x62\x45\x76\xd3\x56\x6f\xd3\x9e\x8a\xce\xb9\x8c\xf6\x51\xd2\xc3\x30\x47\x24\x1d\x21\x06\xad\xf0\x6c\xc1\x1c\x2d\xb5\x5b\xd4\x66\xce\x1b\xb8\x6f\xb8\xa4\xe8\x85\xe4\x24\x12\xe4\x10\x5a\x45\xa0\xd7\x1f\x5a\xcb\xc7\x9a\x33\xeb\x86\x7c\x97\x15\xfd\xdb\x08\x0e\x32\x1e\x1d\x11\xb5\x73\xb5\x4f\xc7\x6e\x5d\x77\xa5\xf9\xac\x91\x1e\xab\xe7\xcb\x4e\x3c\xf1\xc5\xce\xcd\x68\x1a\xf9\xa8\x5c\x20\x43\x62\xcf\x28\xa5\xc3\x11\xa2\x8c\x9a\x8a\x6b\xc9\x35\x0b\x83\xb5\x6c\xd7\x7e\x13\x76\xfa\x92\x10\xc4\xe1\xed\xfd\x98\x25\xed\xc6\x5b\xc3\x8b\x34\x20\x0f\x64\x2d\x33\xf7\x37\x52\x10\x05\x69\xfc\xbd\xcd\xb1\xef\x0e\xd5\xf1\xb2\x6d\x12\x58\x58\xcf\x7d\xfa\x47\x66\x9b\xdb\xf5\x1c\xbd\x8e\xb7\xdd\x7f\xba\xe5\x6f\xe7\xe5\x17\xf1\x48\x50\x17\xa8\x3d\x3a\x5e\x99\x8c\x8a\xe7\x3c\xf0\xd6\x61\x80\x74\xc1\xb4\xcd\xc8\x18\x09\xe6\x60\x70\xfc\x85\xb2\xe9\x69\x61\xe4\x35\xd7\x29\xfb\x11\x32\x2b\x43\xd7\xa8\xb2\x55\x13\xf8\x9c\x2e\x7b\xae\xa4\x1e\x39\xd8\xd9\x69\x51\x84\x61\xd7\x4d\x0d\xd1\x18\x2a\x0f\x8f\x3f\x21\x14\xcd\x80\x9b\x21\x23\x00\x6b\x40\xdc\x83\xb3\xc5\x3c\xa8\x92\xfd\xb0\xc8\x32\xc7\xbe\x75\xc8\xdc\x6c\x4d\x1a\x37\x28\xc4\x87\x81\xbc\xd0\x60\x78\xf6\xaf\x51\x16\xee\x08\xf8\x44\x7e\x2e\xa9\x8b\xcc\xbe\x7b\xb1\x47\x97\x19\x08\x71\x35\x90\x17\x96\x0c\x24\xd2\xe0\x20\xd9\x05\x09\x9f\x62\xdf\x20\x16\xb0\xa7\x0b\x58\xf6\x42\x2c\x6c\xb5\x2a\xcd\x02\x33\x1b\x13\x67\x54\xb5\xeb\x4e\x7a\xb8\x3b\xae\xd3\x25\xaa\x76\xbd\xae\xff\xe8\xb1\xe9\x48\xac\x50\x77\x1c\x2b\x83\x74\x91\x74\xb0\x1e\x04\xb8\x63\x2e\x71\x6f\x1f\x97\x80\xdd\x71\x7d\x20\xa9\x04\xd7\xe6\x05\x7b\x70\x82\x11\x50\x30\xf0\x9e\x85\xfd\x12\x1d\xcf\x39\x89\x6d\xc0\x21\x65\xdc\xc9\xc1\xbd\x17\x7a\xa8\xbc\xb2\xc9\x20\x25\xe2\x75\xf0\x77\x66\x81\xd7\x5c\xb2\xdb\xd8\xa1\x56\x1a\x24\x09\xed\xd9\xcc\xad\xa5\x66\x83\xa7\x7b\x7b\x93\xbc\xa3\x86\x53\x12\xd5\x60\x77\x24\x91\x1a\x0e\xd6\x85\x4d\x9a\x7a\x0b\xd5\xd7\x36\x69\x62\x3d\x26\x8c\x94\x0c\x1a\x14\xde\x46\xd7\xc9\xf3\x7e\x68\x30\x91\x9d\xf5\x9e\xef\x00\x7d\xe2\x05\x39\x91\xfb\x1d\x1f\xaf\x92\x62\x26\x02\xee\xaf\xd0\xc8\x46\x6b\x84\xed\xe8\x47\x3c\x97\x5c\xa8\xd9\x9f\xe6\x08\x1a\x81\x7a\xdf\x18\xe2\x52\x95\xb4\xf5\x9d\xaa\xcc\xbf\x51\xf5\x61\x97\xb8\x07\xa0\xd2\x7a\x86\x4a\x63\x62\x60\xf4\x22\x75\xa6\x85\xb0\x5c\xfe\xa9\xed\x06\x9d\x87\x08\xd8\x5f\x62\xf4\xbb\xe3\x81\x66\xf4\x14\xbd\x28\xc2\x8b\x8c\x97\xc2\xd7\x5a\xee\xe8\x82\xf7\x85\xc6\xcc\x81\x74\x8b\x24\x7a\xdd\x5e\x31\x20\xaf\xab\x72\x07\xea\x48\xd2\xe1\x0e\xde\x0b\xad\x56\xf8\xdd\x3e\x70\x17\x97\xba\x3e\x4c\x7c\x39\x04\xc9\xc1\x35\xa1\xf4\x07\xa4\x9b\x80\xea\x20\xe0\xa8\x0a\xc5\x44\xa2\x5e\x53\xd6\x5a\x2d\x77\xf1\x80\x2b\x72\xca\x32\xa6\x28\x0d\x9a\x20\x15\x25\xdd\xf0\xe5\x4e\xa4\x25\xb7\xfd\xba\xfb\x75\x8d\xbd\x08\x39\x18\xa1\x05\x2a\x2b\xcd\x39\xff\x6a\x81\xc4\x8f\x95\x9c\xeb\x7b\x55\xae\x84\x5d\x45\xa2\x36\x80\x1b\x82\x4e\x05\x07\x03\x58\x55\xc3\x2f\x6b\x0d\x7a\x03\x1a\xbb\x25\x4c\x57\x01\x35\x12\xbe\x6c\x4a\xb3\x30\x4d\xc2\x82\x16\xe5\x48\x50\x4d\xe2\x8d\x8e\x90\xbf\xe5\x92\xb8\x6a\xa9\x29\x0a\x1b\xe3\x5e\x3c\x74\x47\xb9\x12\x7b\xd8\x0d\xc8\x30\xcc\x61\x9e\xbb\x5f\x90\xa2\xb8\xd7\x6e\x31\x35\xe6\xb5\x27\x5a\x1a\x67\x21\x32\x9d\x9b\xd3\x08\xaa\x32\xeb\x4d\xb9\x4b\x8f\xad\xa0\xdc\xcb\x9e\x5b\x46\x4a\xf9\x62\x20\xcf\xaf\x3f\xbc\x19\x5f\x8d\xaf\xde\xc9\x8b\xeb\xf3\x5b\x28\x21\x9c\x7a\xb1\xd6\x73\x53\xb5\xd4\x9f\xa4\xde\x3a\xe3\xed\x9e\x04\x95\x16\x1d\x4e\x63\x38\xaa\x78\x91\xb3\x8c\x7a\x4e\xd8\xd2\x98\x9c\x93\x24\xb8\x46\x49\x25\x82\x9f\x8b\xdd\xdf\x86\x5d\x36\xb1\x30\x7b\x14\xe8\x7b\x14\x0b\x7c\x40\x64\xde\x8f\x30\x14\xaf\x69\x70\x0f\x58\xbf\xa5\xac\x1d\x78\x31\x45\xaf\x86\x56\x05\x0b\x47\x9a\xb1\x65\x40\xd8\x7b\xfd\x3f\x17\xf2\xad\x28\xef\xa6\xa5\x0c\x99\x5a\xec\xb9\x6f\x67\x61\x9c\xdc\x3e\x90\x03\x43\x28\x90\xef\x46\x20\x2d\xea\x31\xf1\xf0\xa3\xeb\x6d\xd9\x98\x4d\xa9\x05\x06\xbb\x16\xaa\xec\x9b\x21\x12\x1c\x74\x6e\x96\xcc\xba\xed\x4c\x75\x47\xd8\xce\x68\x68\x09\xc8\x9d\xa1\x66\xfb\x1a\x8b\xb0\x6c\x7f\xa8\xc1\xaf\xe1\x0f\x67\xe0\x28\x84\x9e\xc3\xbc\x0b\x88\x23\xa7\x51\x27\xe2\x3a\xf2\xaa\x14\xef\x93\x6d\x65\xfe\xba\x05\x41\xa1\x96\x4b\x32\x2d\x13\x21\x8b\x75\x54\x44\x82\x94\x29\x3a\xfe\x94\x56\x75\xa1\xa4\xa8\x44\x42\x47\xc9\x57\xab\x59\x41\xf5\xa3\x0a\xb4\x7d\xac\x9a\xc4\x7d\x60\xa2\xcd\x0f\xdc\x6d\x18\xa1\x5a\xfe\x65\xeb\x9a\x14\xc5\x9f\xdf\xd2\xbc\x61\xbf\xae\x2d\xb4\xbc\x07\x41\xfd\xc6\x0d\x00\x89\x48\x5e\x09\xeb\xec\xff\xc4\x2f\xca\xe7\x37\x51\x59\x5d\x8f\x49\x4f\x5f\x14\x7c\x8b\xf7\x1d\x0a\x46\x0a\x82\x7d\xbc\xd7\x39\xf0\x3a\x18\x83\xe2\x2b\xdf\xee\x41\x10\xc1\x2d\xdb\xf7\xb4\xc8\x6c\x1d\x32\xf3\xc0\xef\x4b\x1a\x79\x59\xf6\x7d\x22\x57\xc9\xb9\xa0\xfd\xf9\xf5\xe5\x25\xd2\xe8\x21\x93\x5b\x57\xea\x51\x66\xe6\xc2\x96\x25\x0d\x14\x8c\x04\x54\xbe\x3b\xb6\x7e\xb5\xdc\x2b\x0c\x7b\x40\xdb\x05\x65\x59\xc6\x2b\xc9\x54\x4b\xf3\x60\x96\x5b\x55\xb6\xd3\x50\x93\x24\xbc\x74\x75\xe2\x77\xba\x07\x33\xc0\x8a\x03\x42\x28\xc8\x47\x1e\x4c\x9f\x30\x4d\x00\x13\xf5\xb6\xec\xe9\x82\x17\xcb\xed\x28\x6e\x62\x18\x66\x59\x8e\x8e\x79\x13\x3a\x21\x5e\x9e\x60\xfd\xa5\xa9\xa1\xa6\x10\x77\x3d\xe0\xb6\xe1\xfe\x25\x00\x58\xda\xe5\x56\x24\xc5\x34\x22\x4e\x5b\xb9\xeb\xbb\x74\xa2\x72\x8b\xb7\x05\xdc\x90\xaa\x57\x36\x62\xd2\x10\x48\x11\xec\x98\x5e\xca\x65\xee\xd0\xe7\xf9\xc9\x57\xa5\x3b\x48\x11\xb3\x42\xfa\xa6\x0b\x33\x86\xb2\x10\xd2\x4f\x03\x39\x7c\xf7\x6e\x32\x7a\x87\x15\xf3\x81\xde\x6f\x7c\x75\x31\xba\x19\x5d\x5d\x8c\xae\x66\x58\xc0\x5f\x88\x21\x11\xcd\xa8\x3e\xef\xbf\xec\x14\xca\x70\xe9\x2d\xed\xf4\x46\x01\xd1\x2c\x9a\xca\xa1\xec\x86\x88\x2b\xc6\xa0\xcc\x82\x82\xc0\xdf\x59\x66\xa3\x10\x11\x1b\xad\x2a\x79\xc0\x25\x3f\xf4\x01\x47\x19\xa2\x1b\x17\xeb\x76\x43\x71\x18\x56\xb6\xd2\xa1\x11\xf2\x1a\x50\xdb\x8d\x45\xd0\x02\x8a\x43\x28\xd6\xc7\x35\x1d\x57\xed\x17\x7f\xa0\x2a\xa4\x72\xae\x77\xb6\x5a\x02\x48\x4a\xb4\xce\x17\xe2\x4e\x31\x2d\x7c\x20\x3f\x52\x36\x48\x2b\xb5\x29\x9e\x1b\x55\x85\xda\x25\xba\xc8\xe0\x55\x31\xe5\x44\x01\xdd\x21\x6d\x9f\x98\x23\x19\x84\x78\x68\x20\xf2\xf3\x0b\x2a\x99\xc7\x49\xc0\x3d\x59\xc3\x6d\x77\xfc\x98\xab\xba\x07\xbd\x3f\x89\x26\xc8\x18\x1f\x94\xcf\x20\x91\x62\x03\x00\xbe\x98\x49\xe1\xda\xa5\x28\xd3\xb8\x9d\xae\xfa\x52\xbc\x28\x9a\xa1\x50\xa3\xf0\x0a\x37\x77\xcb\x2b\x0e\x49\x55\x17\x5d\x88\x96\x43\x3a\x75\x5a\x93\x2a\x41\x8a\x84\xcd\xc1\x41\xf3\x5a\x2d\x3e\xeb\x56\x82\x52\x48\x49\x4b\x3f\x21\xbb\x84\x1b\x89\x2b\x07\x42\xbc\x08\x82\x69\x05\x8a\x31\x57\x2d\x79\xcb\xdf\x62\x03\x79\x1d\x09\xfd\xef\xf5\x8e\x70\x41\x88\x58\xb6\x55\x02\xc3\xea\x74\x15\x86\x8a\xa5\xaa\x42\xe7\xf0\x18\xff\x3c\x90\xb3\xc9\xf0\x6a\x7a\x49\x15\xff\x66\x49\x7e\x06\xd0\x28\x07\x04\x67\xcc\x25\x4f\x83\x26\x50\x36\x91\x2d\x96\x14\xe8\x18\xdb\x71\x62\x7f\xb4\x38\x84\x2f\x82\x3e\x3d\x90\x13\xb8\x64\xfc\x41\xeb\xd1\x57\x51\x2d\x4b\x1a\x8f\x58\x2f\xae\x43\xd1\x63\x16\x99\xba\x93\xc7\xeb\x0a\x91\x1a\x5b\xac\x96\x67\x4d\x03\x5f\x72\x74\xb6\xf4\xab\x3c\x1c\xd6\x65\xf4\x40\x50\x42\x72\x9a\x1b\xbf\x99\xfb\x92\xc2\x3e\xb5\x3a\xa0\xd2\x2e\xb4\x4b\xbc\x07\x36\xff\x1e\x45\xcb\x75\x43\x03\xac\x98\xb0\x5e\x2e\x12\xbd\x7c\x6f\xb1\xb5\x30\x13\xe9\x58\x46\xd5\x1d\x20\x82\x22\xaa\x20\x97\x2b\x0c\xc9\xdb\x33\x78\x9b\xf4\x32\x2f\xdc\xe7\x06\x72\x5c\x89\x85\x72\x24\xaf\x97\xc6\x85\x62\xd4\x72\xae\x9b\x47\x4d\xc2\x2e\x4d\x1c\xda\xf7\xb5\x4e\xb7\xa8\x36\x0e\xea\xa1\x75\xf2\xd9\xa2\xff\x7d\x00\xaf\x78\x13\x3a\xb0\x18\x46\x6f\x54\x3b\x10\x60\xbe\xa2\x15\xe6\x7e\xee\x0c\x47\x8e\x5f\x4f\x45\xe1\x61\xd8\xff\x47\x5e\xf6\x75\x23\x55\xf1\x89\xd3\x23\x01\xdd\x6c\x76\x9b\x50\x4f\x01\x1a\x8a\x44\x1f\x4d\x00\x81\xa1\x49\x82\x47\xfd\x97\x01\x70\xe1\x8e\xaf\xe8\xa8\x7f\x5b\xcd\x92\x6e\x0e\x76\x98\x81\x50\xab\x44\xf4\xd4\x2a\xf1\x9a\x57\x6f\xee\x5f\xf0\x02\x52\x99\x92\x4e\x71\x12\x11\x3f\xff\xd4\xd7\xbf\xb9\x26\x89\x48\x6b\x92\xf4\x75\xe9\xdb\x0b\x90\x08\x1b\xeb\x3c\xf7\x95\x1c\xf9\x96\x1a\x23\xb1\x63\x4b\xf1\x1b\x6b\x8c\x9c\x9e\x0c\xe4\xdb\xdb\xd9\xed\x64\x24\x27\xa3\x5f\xc7\x53\xb6\x09\x66\xef\x23\x3b\x3b\x9a\xdd\xdf\x54\x78\xa2\xd2\x90\xfc\x8f\xd5\x27\x5a\x52\x4b\xbe\xbb\xba\x15\xfb\x89\x74\xfe\xa7\x2c\x3d\x01\xb4\xad\xf7\x4d\xb3\x79\xf5\xe3\x8f\x8f\x8f\x8f\x83\xbb\x6a\x3b\xb0\xf5\xdd\x8f\x4c\x30\xf2\x63\xbb\x38\x05\x0d\x35\x61\xdb\xf8\xae\x5a\x15\x31\xad\x23\x14\xab\x20\xa7\x1b\x2e\xe8\x62\x5b\xaa\x9a\xde\x69\x23\xb3\x92\x4d\x73\x60\x6b\xd1\x2d\x55\x91\x17\xb4\x28\xe4\xb7\x17\xae\x10\x4f\x17\xae\xe0\xbe\x26\x1d\xda\x53\xc2\x02\xc2\x1c\xc1\xc1\x1d\xe3\x8e\x87\xa0\x48\x3a\x3f\x4d\xb5\x5a\x35\x47\xdf\x5c\xe1\xa2\x9b\x01\xfd\x74\x89\x8b\xf4\x02\xcc\x6b\x5c\xc0\x84\xed\xa9\x71\xf1\xdd\xdd\x13\xc3\x8b\x8b\xd1\xd5\xc5\xed\x87\x40\x0a\x8e\x8e\xcc\x96\x3d\x09\xe2\x24\x98\x20\xc0\x9d\xdd\x79\x0e\xd2\x86\x83\x75\x18\xd6\x8c\xc8\x34\x8b\xe4\xb6\x4f\x21\xa0\xb9\xe1\x1c\xdf\x47\xd7\x2c\x21\x82\xc3\x42\x47\x8d\x06\x9d\x7d\x99\x32\x20\xfe\x02\xca\x61\x80\xa3\xc4\x9c\xb4\x57\x19\xc1\xd5\xe2\x48\x7e\x1a\x0d\x27\xf2\xd3\xf5\xed\x44\x5e\x0d\x3f\x8c\x06\x32\xe1\xf2\x33\xb1\xae\x4d\x5f\x19\x1e\x8c\x9a\x8a\x90\xe0\x64\xa2\x91\xdf\x0f\x51\x41\xd2\xe3\xfd\xe2\xa4\x48\x79\xb9\xb8\xf6\xe9\x6f\xac\xa7\xf2\x1a\x75\xc5\xaa\x2f\x17\xbf\xf0\x3f\xee\x00\xf6\xf1\x2a\xa9\x6c\x07\xa0\x3f\x10\xc3\x0c\x46\x50\x46\x41\xd1\xf6\x57\xf0\x2d\xad\x83\x6a\xd0\x3f\x62\x5e\xeb\x83\x88\xba\x86\x1d\xd2\xd7\xd7\x6e\x66\x41\x5f\x16\x41\xc1\xde\x19\x50\xf6\x0f\xfc\xe0\x07\x83\x01\xf6\x9f\x38\xd0\xc9\xa7\x69\xdc\x2b\x21\x82\x7f\xb3\x47\xab\x45\xe6\x86\xcb\xf1\x74\x26\x67\xef\x47\xe3\x89\x9c\x8d\x67\x97\xa3\x69\x82\xb4\xec\x52\x06\xc4\x77\xf8\x46\xa6\x47\x3b\xd9\x0e\xf1\xc9\xaf\x8e\x3d\xb0\x77\x65\xe3\x84\x82\x2f\xeb\x08\xcf\x0a\x1e\x44\x36\x34\xa0\x8a\x62\x21\xd7\x1a\x4a\xdd\x62\xd2\xe2\xa3\x4d\xab\xff\x81\x38\x75\x5b\x32\xd1\x9d\x69\xb6\xcc\x64\x39\x5e\xe5\x07\x3c\x0d\x30\x56\x4d\x6d\x1e\xb0\xd4\x5d\x4c\x1b\x66\x06\x28\x2c\x8c\xf8\x98\xb0\x22\x09\xf4\xa7\x91\x50\x76\x3a\xbe\x86\x49\x91\xaa\x2c\x75\x49\x07\x05\x9d\xf0\xf7\x96\x3c\xa6\x39\x0b\x15\x2b\x63\x82\xf3\x18\x9b\x27\xe9\xc3\xb1\x02\x2d\x78\x0b\x48\xf7\xa0\xca\xb5\x79\xcd\xfd\xff\x60\x86\xc6\x7f\xec\x9f\xc1\x8f\xd3\xf7\x97\xc7\x27\x83\x17\xff\x40\x06\xe0\xa7\xf9\x1f\xcf\x5e\x9e\xbd\x7c\xd6\xe6\xff\x7d\xf1\xf2\x77\xfe\xc7\x7f\xca\x9f\x29\xd4\x11\xb9\x19\x5e\xc8\xf7\xc3\xc9\xc5\xc7\xe1\x64\x14\xc8\x80\xf9\x26\x39\x19\xbc\x20\x12\xb1\x44\x9e\x23\x82\x0b\xd2\xc3\x20\x8a\x0d\x47\x6d\xb8\x51\x8b\x44\x3f\x0c\x6c\xc2\x83\x13\xd4\x54\x91\xe4\x41\x84\xd0\x3f\x20\x85\xc1\x87\x1f\x6e\x29\x6a\x22\x55\x86\xf2\x3b\xa5\xb2\xd5\x31\x87\xef\x44\xeb\x83\x67\x83\x13\xce\x4e\x82\xe2\x14\x52\x35\xa9\x7e\xab\xe0\x69\x50\x71\xd9\xc8\xf8\x91\x06\x7b\x7c\x36\x38\x19\x08\x21\xc4\xd0\xe5\xf5\x01\x89\x97\x62\xb1\xad\x6b\x5d\x35\xe5\x4e\x5e\x4f\xc7\x50\x13\x61\xfa\x36\x40\x18\x8a\x44\x2b\xb6\x35\x49\x14\x07\x2a\xd7\x47\x80\xa7\xb5\x59\x77\x33\x47\x45\xd3\xd2\x50\x13\x0d\x9b\x0b\xc8\x8a\x24\xd7\xaa\x87\xc2\x77\xff\xb4\x33\x12\x1d\x88\x6a\x43\x7f\x8f\x60\xa4\x6d\x0e\xc4\x9e\x86\x7b\xb9\xd9\x18\x90\x15\x55\x76\xb1\x28\x81\x12\xf0\x27\x04\xcb\xca\xc3\xe8\x3e\xf1\x2f\x7f\x0c\x59\xc8\x47\x41\x49\x37\x55\xe0\x81\x42\x85\x1d\xbc\xbb\xd8\xaf\x9e\x3a\x34\x50\x3d\xe8\x76\x3a\x82\x72\x49\x93\xeb\x8b\x5b\x88\xef\x14\xc8\x75\xc7\x45\x89\xc0\x58\x17\xe2\x74\x20\x2f\x62\x99\x52\x68\xf2\x80\x95\x08\xe9\xee\xa1\x50\xab\x56\x55\x32\xc0\x96\xfe\x0f\x16\xb9\x5f\x1a\x4e\xe3\xed\x09\x51\x10\x4a\x85\x03\xdd\xf3\x04\xc9\x74\x1a\x40\x18\xbf\x84\xa9\x4b\x42\x02\xa1\x37\xb6\xee\x74\x67\x42\xce\xef\xc7\x0a\x59\x06\x09\x22\x41\x38\x98\x7f\x8b\xa7\x04\x1f\x14\xf8\x20\x87\x84\x40\x03\x65\xcb\x26\x22\x7f\xfd\x07\xc1\xb5\x0e\x5e\x98\x5d\xe7\xa3\xdb\x2a\xd9\x78\x84\xc2\xe0\x0f\x93\x13\x0d\x15\x08\x06\xf5\x8b\xc0\x07\x58\xdb\xb2\x40\x32\x25\xfc\x47\x09\x3d\x44\xbe\x98\x9a\x0b\xe8\x60\x36\x6b\xc8\x3e\x26\x7d\x47\x35\x8c\x42\x11\x6f\xb9\x16\x00\xd1\x60\xc4\x59\x0b\xcb\x58\xc8\x03\x7a\x9f\x29\x18\x0e\x0d\x72\x5c\x6f\xec\xa3\xae\x0b\x62\x3c\x13\x40\xb1\x83\x7f\x87\xa3\x83\x54\x95\x60\x23\xc0\x0f\xc9\x7a\x5b\xab\x4a\xdd\x45\xdf\xba\x57\x16\x34\xe5\x6e\x11\xb1\xa3\x98\x63\xc8\x1d\xc2\x58\xcc\x8e\xf8\x68\xc8\xd1\x73\x68\xcc\x11\xae\x12\x67\x32\xac\xcc\xaa\xd9\xf9\x93\x0f\xb0\xf8\xc3\x17\x27\xff\xbf\x23\xce\x8b\x60\x65\xcb\x6e\x1b\x80\x2c\x01\xc2\xef\x5e\xd5\x54\xa7\xf5\xd0\xf8\xc6\xe6\xba\xd2\x2b\x03\x6e\xd9\xac\xdd\xa4\x6f\xb8\x94\x9f\xec\xf6\x00\x90\x3e\xfe\x6f\xf5\xc1\x51\xba\x9a\x50\xf3\x23\x04\x43\x6c\x2d\xd3\x75\xe7\x7a\x9c\x39\x0b\x60\xe0\x11\x6f\xc3\x55\xf0\x6b\xb8\xcf\x78\xce\x73\x43\x0a\x22\xb9\xe8\xa8\x90\x5c\x65\x81\x6b\xf5\x23\x08\x8f\x7e\x7c\xc8\x73\x5a\xeb\x3b\xe3\x10\xe2\x09\x4e\xaf\xf8\xef\xa3\x42\x3a\xbd\x36\xfe\x10\x6e\x17\x0d\x80\x5e\x36\x16\x4a\x62\xef\xe4\xe1\x5a\xb9\xcf\x47\xec\x97\x82\x53\xa8\x1a\xe5\xef\x1f\x41\xe1\x3c\x60\x6b\xc3\x5f\x1f\x02\xaa\xed\x0b\xf7\xe3\x46\x35\x0c\x5b\x95\xb3\x5a\x2d\xf5\x5a\xd5\x9f\x1d\xca\xbf\x03\xac\x2c\x7d\xc0\xe0\xff\xec\x50\xb4\x8a\x4a\xef\x2b\x24\x5d\xc4\x31\x0b\xce\x79\xcb\xc8\x47\x93\x52\xe0\x95\x6e\x30\x31\xa0\x90\x73\x0b\xd5\x9b\xd5\xce\xef\x89\x42\x9e\x0f\x2f\xb0\x9a\x72\xd1\x22\xc0\xc7\xf7\x43\x6a\xea\xca\xdc\x11\x9f\x25\x3e\x8e\xc3\xb8\x06\x36\xbc\xee\x30\xa0\x56\xab\xff\x59\x2b\x20\x47\xfc\xe8\x0b\x55\x12\xa9\x39\x57\xb0\x11\x09\xd3\x62\x40\xd9\x51\xf9\x6d\xff\x50\x32\x58\xd9\x33\x58\x2a\x94\xb1\xa4\xca\xde\x02\x47\x1d\x98\x72\xf2\xa1\x15\x14\x1a\x27\xb2\xa6\xf8\xbd\x7b\x55\x2f\x1f\x23\x49\x1e\xa0\x94\xa1\xd8\x15\xb9\xc8\x42\xd1\x4c\xca\x97\xdf\x6d\x74\xba\x0a\x58\xe9\x83\xf2\x4c\xa0\xd7\x2e\x90\x9a\xcc\x77\x8d\xf6\x9d\x72\x85\x78\x7b\xf3\x6e\x28\xe7\xa6\x71\xfe\x62\x5d\x7b\x83\xb6\x46\x24\x39\x64\x3e\xf7\xef\x44\x48\xd9\xf7\x7b\x11\xa3\x78\xb4\x89\xfc\x05\xdf\x11\xa9\xd0\x54\xa8\x9d\xe3\xcf\x72\x11\x19\x63\xab\x74\x4e\x83\x6c\x11\xb8\x8c\x34\xd1\x00\x96\x8b\xd4\x4e\xf1\x46\x8e\x6a\x83\x0b\x35\x8e\x11\x42\xc9\x97\x07\xfa\x35\x44\x1f\x4e\x00\x0a\xe8\x37\x5e\x57\x08\x49\xe2\xd0\xd3\x43\xa8\x81\x0e\x26\x57\x46\x63\x4f\xb8\x04\x2e\x01\x87\xb7\x3b\x8d\xfb\x22\x06\x35\xfd\x14\xb8\x83\xf6\xd6\x63\xca\xe6\xf6\xa8\x6d\x2d\xd3\xa1\x86\x8e\x86\xfa\xc8\x87\x80\x2f\xaf\xc1\x9d\xec\x37\x2c\xca\xf9\x8f\xbc\x3a\x39\xa3\x13\x32\xae\x79\xb1\x89\x3c\x71\xfe\x4c\x0a\x55\x55\xb6\xe1\x03\xaa\x4b\x35\xb7\x35\xff\x2b\x10\xdd\xe6\x09\x4d\x81\xc9\x8e\x4a\xb5\x43\x08\xd0\x9f\xbb\x88\xfc\xef\xae\x29\x22\xfa\x7b\x6f\xae\xb0\x4c\x71\x9a\x04\x4c\x13\xcd\x52\x52\xef\x9d\x62\xc2\x30\x0d\xe4\xce\xc6\x78\x3e\xf0\x8c\xd5\x16\xb9\x51\xd7\xba\xf6\x7a\x76\x69\xaa\xcf\x7e\x82\xc4\xdc\x54\xb0\xec\x95\x5a\x6b\xb8\x69\x36\xf7\x3b\x47\x0e\x7d\xe2\xcc\x84\xa3\x52\xe3\x81\xc0\x8a\xec\x3a\x3a\x1b\xe0\xa7\x2b\xb5\xd0\x0e\x70\x96\xd9\x0c\xb7\x97\x16\x81\x60\x76\x85\x0b\x7f\xce\xe9\x01\xe0\x74\x6d\x2d\x3a\x1d\x5a\x42\x1b\xb4\x8f\x40\x3c\xa5\x59\x4e\x45\xcb\xbb\x1c\xfa\xd1\x2d\x29\xe1\x37\xf0\x92\xd5\x34\xd8\xc1\xaa\x81\xe7\xbd\xe8\xda\xd7\xed\x22\xc1\xcc\x34\x48\x78\x04\xd3\xe4\xb6\xf3\xc8\x1e\x1f\x94\x77\xa4\xd2\xa3\x8a\x7a\xec\xac\x82\x2e\x65\xaa\x57\xd4\xd1\x10\xbe\xbc\xff\xde\x15\x89\xf6\x06\xbe\x14\xff\xd5\x08\x73\xe5\x51\xa7\xcd\xee\xdf\x58\x22\x53\x89\xc2\x08\x0e\x12\x46\x5e\x2a\x8f\x91\x04\xc5\x0b\x84\xaa\x94\x48\xb2\x4b\x65\x8a\xa8\xd8\xc5\x82\x2e\x9a\x04\xce\x16\xa6\x82\x40\x27\xe1\x6c\xa0\x43\xe8\xe9\x5b\x40\x64\xed\x02\x0a\x37\x06\xe7\xd7\xca\x40\x96\x31\xdd\x82\x69\x05\x11\xd6\x0e\xdd\xce\x35\x7a\x4d\x09\x58\xc6\xb9\x2d\x04\x34\x17\x70\xf3\xd2\xef\x22\x35\x27\xaa\x71\x41\xe5\x4c\xe7\x34\x37\xc9\x02\xf5\x7c\xc2\xd8\xbf\x34\x6e\xb1\x45\x02\x38\x30\x68\xd6\x20\xf6\x48\x7b\xfe\x08\xc2\x2b\xd7\x25\xf2\x19\xe3\x3d\xb5\xb0\x95\xdb\x98\xc5\x16\x30\xd0\x40\x8d\x88\xda\x4d\xa4\x58\x4c\x88\x51\x4d\x05\xf3\x0f\x53\xd7\xa3\xc8\x2b\x27\x0f\xae\x6c\x23\x95\x4c\x0f\xd9\xe0\x20\x3f\x77\x2d\xbb\x21\x2c\x17\x1f\x99\x27\x54\xc0\x14\x5c\xed\x65\xdc\xba\xf5\xa9\x88\xce\x0f\x01\xbd\xf9\x2e\xff\x42\xa4\x72\x2c\x77\x69\x91\xeb\x65\x0a\xec\xf8\x88\xd0\x45\x21\xce\x06\xf2\x9d\xd7\x2f\xfd\x84\x27\xd4\xde\x69\xf9\xf9\x7e\x1b\xac\x2d\x48\x05\x00\xd1\x92\x39\xc8\xaa\xfe\x70\x0d\x52\xa9\xbc\x6a\xbb\xd1\x0d\x54\x5c\x00\xae\x70\xa4\x0a\xaf\x6c\x75\x1c\x28\x9c\x0b\x51\xd9\xe3\xc5\xbd\xaa\xef\x5a\x24\xe2\x85\x34\x75\xad\x1f\x2c\x42\x6b\xd8\x03\x10\x2f\x5f\x3a\xa3\x40\xcb\x4c\x04\x4f\x85\xd8\xd4\x5e\x5a\xeb\xae\xf8\xf1\x9b\xb0\xcd\x1a\x94\xfc\x64\xa3\x6b\xbc\xeb\x93\x20\xb2\xe8\x61\xc1\x0a\xe2\x10\xd4\x98\xce\x57\xf6\x5d\xac\xd8\x14\x30\x94\x23\x47\x74\xcb\xe2\x8e\x4d\x07\x54\x0d\x0d\x6f\x69\x96\xc4\xe2\x6c\x1c\x1a\xac\xcf\x92\x55\x44\x8d\xfa\x7f\xb9\xc5\x3c\x0c\x31\xf8\x2c\xd9\xd2\x38\x0e\x44\x1c\xc9\x0d\x8c\x8c\x89\xe4\xb9\x82\x47\x81\x2e\x77\xaf\x90\x15\xe8\x15\xb0\x10\x69\xf5\xa2\x5c\x97\x65\x41\xff\x35\xeb\x8d\xad\x09\x49\x12\x8e\xbe\x08\x45\x83\xa2\x4c\xc1\x6a\xaa\xb0\x96\x65\x8b\x49\x0c\x70\xde\x81\xf0\x0b\xbb\x23\xb1\x9c\x1d\xf5\x0a\x86\x32\x27\xca\xf9\x74\xfe\x82\x48\xe4\x1a\x7a\x06\x4e\xe7\xaa\x36\xd5\x5d\xf0\x1a\x98\x3a\x3b\xec\x87\xee\x48\xa8\x92\x12\xf8\xe7\xbb\x0c\x61\x8f\x97\x52\xf7\x85\xa8\x40\xc0\xde\x01\x3e\x07\x43\x10\x6e\xd1\x79\x16\xa2\xf5\x74\x45\x41\x4c\xf3\x13\x22\x35\x1b\xd3\x6c\x9b\x30\xc2\xd2\x34\xe6\x8e\xf0\x2a\x77\xca\xff\x1a\x3c\x67\xe4\x82\x38\x8c\xb7\x8d\x92\x8b\xda\x3a\x77\x0c\x53\x82\x81\xec\xad\x57\x63\xf0\xdf\x10\x49\x2c\xd5\xa3\xdb\x9a\xe6\x48\xaa\xb2\xd4\x77\x98\x72\x4b\x0e\x36\xe8\x30\xe0\x5c\x32\x89\x97\x8a\x30\xd9\x12\x61\x20\xdc\xb1\xb3\x2e\xf1\x30\x24\x09\x92\x3b\x1e\x04\xcf\x75\x02\xba\x83\xca\x65\x3c\x44\x82\x34\x24\x41\xc2\x4f\x76\xdb\x03\x1f\xa6\x24\x1b\x52\x6b\x48\xce\x07\x20\x84\xdf\xbe\xa4\x2f\x2c\x21\xc3\x0d\xb7\x11\xcf\x9f\x30\x0e\x0c\xc3\x25\x9c\x5a\x40\x88\xa5\x0e\xab\x88\xa1\x0a\xe2\xab\x8d\xbb\xcd\x39\x8b\x68\xca\xc4\x3e\xcd\xaa\x4d\xcc\xd7\x5b\x4a\x26\x9a\xca\x70\xa5\xef\xb3\x03\x5a\x28\x2b\xe8\xa9\xd6\xdd\x50\x2e\x0b\x95\x57\x7e\x88\x01\x27\x0e\xb4\x2f\x31\x6f\xae\xd6\x0b\xb3\x31\x9c\x8f\x96\xae\x7e\x67\x28\x18\x58\x6e\xe3\xc7\xa0\x7c\x72\xf6\x05\xf4\x24\x45\x95\xd4\x1b\x27\x86\x92\x03\x81\x04\x2d\x12\x7c\x05\x04\x57\x4c\x33\x57\x0d\xb4\x84\x4c\x5d\x88\xc9\x82\xb7\xbb\xdf\x01\xd6\x9d\x2a\x10\x13\x64\xa6\x22\x62\x0e\x7a\x56\x83\x26\x2c\x2d\xb4\x96\xd5\xbf\x2c\x68\x23\x16\x5e\x99\x42\x27\x08\x81\xde\x9a\x78\x12\xb8\xd7\x01\xb5\x8b\xdf\x16\xfc\xed\x28\xc3\xa2\x4e\x94\x23\xd6\x08\xfd\x0c\xb7\xc7\x86\xe8\xd5\xa9\x48\xc6\x46\xd5\x4d\x80\x37\xb6\x06\x10\x26\x61\x9c\xac\x55\x92\x82\x76\x70\x75\x3d\x1b\x9f\x8f\x0e\x28\x0b\xcd\x20\xe1\x09\x27\xf3\x02\x2e\x3a\xd9\xe5\x78\xfa\xc4\xb7\xce\x14\xce\x7a\x84\x19\x64\x14\xe7\x8c\x37\xe8\x9b\x26\x0a\x77\x46\xa9\x01\x87\x11\xbb\x0a\x9d\xdc\x3b\x4f\xe2\x2b\xf3\x24\xf7\xcc\x13\xd6\x65\x49\xd9\x9f\x08\xed\x9b\x50\xfc\x96\xde\xa4\x7b\xc5\x5d\x52\xdc\x9f\x38\x73\x69\x11\x96\x64\x16\x01\x6d\xd2\x59\x97\x44\x1e\xb6\x7c\x16\x2d\x67\x8e\x59\xc5\xf3\x9b\x70\x91\xf5\xaf\xb6\xad\x8b\xd8\x41\xa6\x53\x8c\x7e\x22\xd2\x8c\xdb\x96\x33\x31\x1c\x2c\xf1\x06\xc5\x8a\xb6\xe0\x04\x30\xf5\xf2\xd8\x0f\x63\x17\x96\xa6\xb2\xf5\x1a\x19\x9c\x01\xf3\x8b\x5c\x7e\x9c\x86\xc4\xbb\x30\x59\x29\xb8\x39\x91\x9e\x3d\x38\xc3\x20\xd7\x9f\x8d\xaf\x8a\xa8\x0d\x69\xcd\x12\xa2\xda\x0e\x1d\xa7\x5a\x2e\xb1\x1a\xbe\x7d\xac\x7a\x8f\x17\x8d\xbc\x3d\x2d\xa2\xef\x14\xe3\x5c\x3a\xb3\x44\x84\xa6\x03\xc4\x3a\x13\x93\x90\xc6\x95\xad\x30\x1d\x5d\x81\xe7\x34\x17\xa9\xe8\x06\x23\xf3\x59\x95\xbd\x9d\x5b\x80\xeb\x44\xce\x35\x5e\x7d\xf5\x56\x2f\x85\x72\x49\x4d\xb0\x34\xb4\xd0\x3f\xe6\xe8\x24\x0e\x59\xc1\x74\xdd\x11\x00\x26\x2d\xee\x82\xf0\x3a\x62\xe7\x4a\xfa\x06\x70\x46\x4e\x20\x0b\x1a\x59\x8f\x6e\x29\xf6\x04\x6b\xda\x69\x0c\x76\x85\x3d\x6c\x5d\x49\x4c\xbb\x4f\x65\x7c\xba\x37\x5d\xea\x0d\x0a\xd3\x09\x2d\x7d\x4b\x84\x28\xbb\x7c\x82\x41\x88\x28\x45\x9d\xa4\xce\x75\x19\x48\x5b\x54\xbf\x70\xa1\xbf\x00\x6d\x9b\x21\x47\x90\x65\x1c\x15\x19\x37\x90\xb7\x48\x51\xe4\x57\x85\x53\x5f\xcb\x1d\x51\xff\x25\xf1\x0b\x55\xed\x44\x4b\x05\xea\x77\x8b\xe0\x89\xd8\xe3\x0a\xf1\x5f\xc1\x1d\x28\x82\x7d\x88\xda\xca\x5c\x77\x22\x88\x5f\xb1\x07\x02\x37\x3e\xd0\x35\xc6\x5d\x40\xe1\xc7\x94\x1b\x77\x20\xaf\x6c\xe3\x1f\x0f\xa1\x94\x86\xcb\x96\x14\xa1\x1c\x0e\x52\x51\x08\xec\x8e\xdb\x6e\x74\xed\xf4\x92\x78\xaa\xf8\xe4\xc6\xd8\x26\x66\xa4\x51\x06\x4d\xd0\xc9\x03\xb6\x9a\x09\x60\xc1\x0c\xc0\x7a\xa4\x9c\x32\x19\x06\x1e\x93\x82\x72\xcd\x3c\x04\x20\x5f\x0e\x92\xf0\x03\x95\x40\xef\xa4\x9a\x80\x72\xb8\x87\xd9\x08\xee\x6d\xcc\x12\x2e\x44\xb8\xc4\x9d\x37\x3f\xea\x07\xb3\xc0\x52\x0d\xb8\xa1\x69\x47\x52\x4a\x71\x16\x50\xf6\x92\x37\x1a\x42\xcc\x42\x24\xb0\xcc\x06\xf1\x20\xa2\x4e\xb8\xd8\xba\xc6\xae\x55\xbd\x63\x48\x4c\x64\xb1\x49\x10\xe1\x6d\x97\x9d\xe0\xf3\xc0\x8f\x91\xd0\x95\x5d\x99\x0b\xd3\xf2\xd3\x40\xf6\x86\x8a\x77\x61\x33\x07\xa6\xa4\xf9\x2e\x4d\x7b\x29\x15\x50\x0b\xc0\x2a\x21\x27\x51\xf0\xac\x14\x49\x20\x1e\x0f\xac\x8b\x7d\x04\x12\xb8\x8e\xf5\x19\x9e\x33\x8d\xcb\x8e\x86\x03\xaa\x50\x55\xc9\x83\xe1\x54\x8e\xa7\x07\xf2\xcd\x70\x3a\x9e\x16\x90\xc4\x75\x7d\x3b\xe3\x7a\xf7\xe3\xd1\x54\x5e\x4f\xd2\x70\xf5\xf5\x5b\x39\xbc\xfa\x24\xfe\x38\xbe\xba\x08\x7c\xd5\xdd\x22\xb0\x89\x2b\x2d\x9c\x01\xf4\xa5\x29\x16\x28\xbb\x84\xc3\x5b\x64\x27\xc1\x4f\x17\xc0\xcd\x0a\x79\x75\x7d\x75\x3c\xbe\x7a\x3b\x19\x5f\xbd\x1b\x7d\x18\x5d\xcd\x0a\xf9\x61\x34\x39\x7f\x3f\xbc\x9a\x51\x4d\x38\xd8\x17\x6f\xc7\xb3\xab\xd1\x14\x42\xe9\x62\x28\x6f\x86\x93\xd9\xf8\xfc\xf6\x72\x38\x91\x37\xb7\x93\x9b\xeb\xe9\x88\x2a\x8e\x79\xeb\xd4\x96\x1a\xe0\xf2\x79\x4d\xc5\xa5\x46\x43\x24\x9c\xba\xc8\x1c\x56\x69\x07\x17\x2b\xd2\x7c\xc2\x76\xca\x58\x1b\x73\xbf\xae\x73\xdb\x35\xea\xd2\xb5\x71\x20\x64\x9d\x5d\x98\x60\x81\xe1\x5d\x41\xe1\x4a\x64\xd8\x8b\xf1\xca\x3e\x60\xba\xdf\x4a\x3f\x0f\xe4\x65\x98\x39\x74\x37\xa9\xb9\x29\x91\xe6\x00\x28\x45\xf4\x03\x43\x44\xb1\x89\xca\x52\xca\x59\x73\xaf\x6d\x9d\x84\x7e\x41\x1b\xab\x9b\xd4\xf4\xac\xf4\x5d\x69\xee\x74\xb5\xd0\x47\x45\x88\x0b\x17\xad\xc0\xf0\xb6\xb3\x65\x45\x6b\xcb\x1e\x72\x28\x6a\xa9\x4b\x33\xd7\x21\x67\xef\xce\xdb\xb5\xe5\x2e\x7c\xa6\x91\x6a\xd1\xb8\xa3\xfd\x5b\x1c\x45\x9b\x9f\xc1\x74\x1f\x03\xa9\x20\xa7\x85\x7d\x82\xb4\xcf\x5a\x2e\x15\x94\xbd\x49\x23\x95\xe0\xa9\xa7\x20\x79\x0c\x97\x53\x5a\x10\x3c\x08\xe9\xe3\xe4\x31\xf6\x9a\x00\x7a\xfc\x8c\x2a\xb9\x39\x12\x9c\x62\x71\xaf\x20\xa1\xb2\x96\xaa\xc6\xd8\x32\xdc\x98\x18\x72\xec\x20\x47\xb0\xe4\x05\x4b\x83\x2d\xfe\xc4\x54\xb4\x50\x22\x91\x77\x78\x5a\x9f\x8c\x37\x72\x4f\xfc\x20\x4b\x8b\x85\x1a\xef\xac\x5d\x3e\x9a\xb2\x2c\x20\x7b\x5a\xba\xc6\x6e\x36\xc0\xca\xc5\xe4\xb6\x72\xa5\x4c\x09\x95\xf8\x6b\xb9\x56\x25\x57\x60\x2d\x18\x43\x9b\x23\x1e\x22\x9f\xbc\x08\xe3\xc6\x8f\x69\x77\x54\xc0\x8e\xf2\x5a\x69\xc7\x1d\x13\x49\x4e\x96\x98\x2c\xc0\x4c\x7f\xd6\x39\x43\x83\xe5\xe0\x3e\x35\x0c\x9b\xf8\x97\x81\x1c\x02\x8d\xba\x1f\x72\x20\x09\xb0\xb5\x1c\xc6\x4b\x31\xd9\xd7\x1f\xa1\x1e\xea\x9e\xa3\xf6\x74\x48\xe4\x53\x86\x0e\x87\x50\x91\x57\xb7\x28\xd4\x0c\xee\x34\xa9\xa0\xc0\xfa\xca\xd6\x85\x40\x72\x77\xae\xb0\x41\xf5\xcd\x8b\x50\xc4\x1a\xb6\x91\x5e\x57\x80\xa0\x08\x21\xb6\x92\x7b\x2a\xed\xbc\x24\x17\x85\xe3\xfa\x2b\x14\xaf\xa7\xc4\xeb\x40\x3b\xb1\x27\xe1\xc4\x9b\x0a\x61\x62\x60\xda\x92\x26\x8b\xc8\xff\xb2\xa0\x7a\x08\xb6\x8a\x0a\x29\xc5\x04\x88\xfe\x13\x7e\xec\x05\x5c\x14\x6f\xd0\x47\xd0\x1e\xa4\xad\x44\x0c\xcb\x44\x7f\x42\xb2\xb6\xe4\xe2\xf3\x1f\x31\xe8\xd0\x82\x13\x0a\x20\x26\x9c\x83\xd5\xae\x90\x4b\xbd\xd2\xd5\x12\xfd\xb9\xf7\xb6\xec\xb9\x73\xee\x55\xbd\x06\x71\xc1\xfa\x67\x9c\x2d\x53\x01\xda\x2c\xc4\x35\xc8\x05\x88\x24\x20\xde\xc0\x42\x2f\x59\xd1\xdd\x77\x58\x4f\xc9\xa1\x00\x44\x3a\xdf\x30\x6b\xa1\x54\x25\x2f\x9a\x48\xa2\x69\xaa\x8c\xdf\x87\x9d\x38\xba\xba\x80\x44\x99\x1e\x2c\x16\xa0\xe4\x6e\x6e\x46\x57\x17\xe3\x3f\x85\x04\x00\x4a\x93\x4d\x91\x73\x8d\xc5\x2e\x00\x1b\x9b\x98\x7d\xf5\x99\x82\x82\xd3\x2d\x97\xcf\xdc\x9a\x52\xd7\x9b\xd2\xcb\x4a\xe2\xd7\x88\xc6\xe5\xca\xe8\x72\xe9\x98\xa7\x1e\xb4\x04\xca\xe4\x74\xf2\xe0\x5f\xfe\xf5\xa0\xc5\x71\xb1\xe3\x3d\xc1\x5c\xf0\xc8\x55\x1e\x8c\xbe\x81\x3c\xbc\xb0\xd5\x0f\x4d\x96\xdb\xc7\x0d\xfe\x27\x2c\x5f\x08\x86\x16\xb1\x8f\xcf\x75\xfc\xb4\x01\x0e\xb4\x16\x9d\xe6\x1a\xb3\x5d\x76\x55\xa3\xbe\x04\xfe\x9c\xa4\xce\x16\x54\x87\x85\x6c\xc2\xb4\x44\xac\x6a\x84\xc2\xa7\x70\xf5\x9d\x43\x7e\x0b\xb0\x2f\x40\x0f\x0b\x60\x41\x0e\x68\xa5\x35\x43\xd2\xe2\xfa\x07\x5c\x3d\x60\x03\x05\x75\x08\x12\xdd\xcb\xf3\xa9\x95\x33\xba\xe6\xa9\xe1\x08\x5e\x70\x01\x04\x33\x5b\xa8\x7a\x71\x6f\x1e\x48\x64\xc5\x14\x89\x7f\xd9\xed\x76\xbb\x7f\x95\xff\xc2\x54\x1c\xf1\x23\x10\xdd\xfa\x57\x79\x9e\xc1\x87\xb8\x6a\x23\xe3\x7a\xea\x50\xc3\x35\x45\x20\x4e\x21\x07\x75\xa3\x96\xf2\x3d\x03\x43\x82\xd5\xf0\x6b\xc4\xa7\xca\x43\xc0\xf2\x33\xcc\xef\xe8\xb5\xd8\xb5\xcb\x63\xdc\x93\x73\x94\x15\x60\x28\x64\xc0\xe9\x62\xd1\x14\xeb\x18\xb7\x76\xde\x28\x53\x89\x2c\x01\x25\x42\x21\x03\xbe\xd4\x71\x47\x73\x78\x29\x83\xab\xdb\xfa\xac\x78\x5a\x9f\x95\xd9\x65\xcf\xb5\x97\x23\x38\x06\x4d\x67\xa4\x48\x83\x92\x2f\x79\x61\xdd\x4e\x39\xf2\xf4\x89\xa7\x34\x5a\xf1\x15\x8d\x56\x7e\x45\xa3\xc5\x94\xb2\x64\x86\x42\xe4\x35\x14\x20\xe2\x52\x45\xf2\xce\x3e\xe8\xba\x6a\xc1\xd1\x28\x45\x87\x15\xb9\xa8\xee\x45\x57\xcb\xff\xd6\x70\xfc\x7f\xfa\x9f\xc1\x8f\xe7\xa3\xf3\xf1\xe5\xe5\xf1\x9b\x7f\x5c\x02\xc0\xd3\xf8\xff\x17\xa7\x2f\x4e\x9e\xb7\xf1\xff\x3f\x3d\xff\x1d\xff\xff\x4f\xf9\x73\xae\x71\xf5\xe5\xdb\xc9\x68\x24\xa7\xd7\x6f\x67\x59\x0e\xc0\xf0\xdd\x64\x04\x36\xa5\xbc\x42\x5c\x19\xc2\xc6\x87\xc1\x3d\x62\x90\x50\x2f\x4d\x2d\xeb\xfa\x50\x18\x2c\x81\xd9\xdc\x64\x1a\x08\x46\x60\x60\x26\x15\x66\xb0\x9b\x26\x90\x8b\x67\xb5\xe9\xa9\x9e\x42\x9f\xc4\x6e\x1e\xad\x00\xd8\x14\x31\x7a\x97\xda\xc9\xbb\x2d\x96\x92\x87\xe0\x40\xad\x56\x5e\x90\xbe\x12\xe2\xff\x8f\x75\x42\xca\x5d\xd1\xdb\x52\xda\x40\x10\x4e\x08\x1e\xce\x5d\x89\x7e\xbc\x82\xc7\xfb\x2a\xa9\x77\x91\x01\x3e\xe7\xb5\x55\xe1\x7e\x4b\x22\x7f\x40\x63\x52\xf8\xde\x38\xe0\xc1\xe4\xaa\x7b\xba\x8c\xdc\xef\x2a\xe9\x41\xa9\x1e\x0b\xff\xc9\x6a\x71\x8f\x7f\x87\x0e\x13\xb0\x1f\x4a\x59\x52\xa1\x47\x55\x35\x85\x9c\xdb\xe6\x3e\xa9\x07\x86\x79\x78\xfe\x7a\x59\x81\x55\xeb\x08\xbe\xdf\x68\x20\xdf\xd9\xaa\x12\x8a\x29\xea\xba\xd9\x41\xe3\x82\x39\x03\x36\xb5\x6d\x98\x87\x94\xca\xaf\x81\x89\x00\xe3\xc4\x8f\xd0\x3a\xb1\x92\xab\x23\xe3\xba\x1f\x97\x5d\x9b\x85\x60\x3a\x17\xf0\xd7\x87\x84\xaa\x84\x51\x2f\xbc\x82\x1b\xf1\xdf\xff\xdf\xb8\x7d\x6a\xfd\x0a\xb2\xb8\xbd\x92\xb1\xf6\x17\x84\xf2\x6a\x95\xfc\x1f\xff\x5d\x96\x3f\x8c\x2a\x5d\xdf\x19\x2d\x87\x8d\x5d\x03\x59\xd7\xb1\x3c\x1f\x0d\x8b\x50\x19\x53\xba\x85\x21\x3d\xa6\x48\x4a\x63\x61\x08\x72\xb9\xf5\xcb\x09\x98\x41\xa7\xbd\x36\x23\xb5\x6b\x14\xa4\x4b\x62\xfc\xf6\x5e\x3d\xf0\xee\x89\xa4\xf2\xc8\xe8\x64\x57\x72\xbe\x75\x06\x1c\x1e\x0a\x2a\xea\xd6\x5b\x2d\x2f\xf5\xbc\x54\xd5\x02\x39\xce\xb7\xfe\x46\xbf\xd4\xf2\xc6\x56\xaa\x6a\xe4\x45\x21\x7f\x7a\x71\x72\xfa\x42\xde\x78\x13\xd9\xaf\x64\x4c\x50\x17\xe2\x5c\x57\x4d\xad\xe5\x15\x07\x1d\x96\x7e\xb5\xe4\x44\x2f\xee\x75\xbd\xf0\x0a\x10\x8f\x83\x06\x79\x35\x99\xf6\x8e\x12\xe9\x7c\xfd\x40\x6d\x69\xef\x60\xb0\xbf\x69\x50\x5e\xa5\x79\xe6\xc7\x24\x3e\x98\xc5\xbd\x2e\x8f\x87\x95\xb7\x9f\x7f\x7a\xf1\xd3\x2f\xcf\x71\x04\x72\xa1\x97\xfa\x8b\x3c\x7d\xd9\x1e\xca\x98\x82\xe5\xd9\x60\xe2\x48\x74\x25\xc7\xac\x6a\xfb\xc1\xe8\xc6\xff\x68\x48\x5c\x04\x38\xbc\xf1\xd5\x64\x3c\x2c\xc4\x9e\xf1\xc9\xef\x1e\x9f\xe8\x1d\xdf\x85\xf5\xf2\x42\xfb\xee\xfd\x6a\xcb\xed\x42\xab\x6d\x21\x27\x76\xf1\xd7\xad\xae\x16\x76\xeb\x2d\xdb\x37\x37\xf2\xf4\xe4\x45\x21\x7f\xfa\xf9\xf4\xc5\x33\xbf\x98\xe7\xf7\xda\x55\x6a\x27\x60\xf0\xc9\xc8\x6f\x6a\xad\xd6\x50\x93\xa7\x2b\x17\x2b\x69\x37\xba\x62\xa1\xd0\xce\x52\x44\xbf\x3b\x15\xe1\x04\x72\x48\xe4\x37\x72\xe6\xae\x02\xfd\x1b\xe8\xb2\xb4\x5e\x5a\x88\xf5\x90\xeb\x1a\x55\xe7\x16\x46\xa8\xdd\xf4\x52\x78\x3b\x1f\x54\x27\x3a\x6c\x09\xf8\x9f\x9d\x32\xdc\x36\x82\xd8\x82\x1d\xb8\xdd\x00\x37\x94\x6b\x6a\xeb\x1f\x0e\x66\xb6\x97\xd8\xc8\xc3\x2f\x17\xbe\x03\x5c\xbb\xe9\x41\xd7\x3b\xa8\xa0\x89\x51\xcd\xd0\x31\xa8\xd2\xc8\xfd\x8a\x28\x0b\x04\x72\xf0\x2f\x44\xbd\x2d\x63\xc8\x8f\x92\xac\xc2\x04\x39\x0b\xde\x24\x88\x64\x27\x4e\x59\xe2\x45\x46\xb1\x15\x0b\x7b\x19\xbd\x04\xe1\x95\x70\x56\x2f\x91\x3f\x8f\xc9\x79\x22\xcc\x3c\x08\x6c\x9c\xbd\x88\x43\x64\xe9\x57\x07\xa8\x57\x4a\xb9\x21\x3a\xb3\x9f\x65\x4f\xc4\x04\x54\xa2\xaa\xf2\x43\x0f\x51\x23\xf0\x19\x10\xa3\x1b\xb9\xb1\x04\xdb\xe2\xe1\xbb\x3c\x31\x3f\xf0\x35\x88\x57\x03\x8a\xd7\xb6\x74\x0d\x14\x1b\x5c\xb6\xd0\x6d\xb1\x86\xd0\x03\xf7\x04\xe4\x6b\xa8\x24\xc7\xce\xb3\xd4\xd4\x1f\x57\x5c\xbd\x02\x08\xce\x88\x71\xa5\xd7\x2d\x5b\x5a\x85\xae\x6a\xf0\xf2\x16\x49\x54\x90\xf2\xdb\x97\xfa\x41\x97\x76\x13\x5c\xc0\x79\x2c\x20\x6c\x06\x9a\x2b\x3f\x45\x30\x43\x73\xc8\x96\x0a\x10\x32\xff\xf3\x1f\xbc\x70\xa5\xa8\x54\xa0\xb4\x6f\x5c\x4b\xd1\x70\x8d\x6a\xb6\x50\xa9\xc9\x5f\x85\x81\xd9\xcf\x34\x74\xbb\x23\x38\xbe\xb1\x62\x9b\x55\xbf\x21\x0d\x84\x6e\x35\x87\x11\x0e\x98\x01\x5d\x3f\x50\xdc\x8b\x86\xa2\xe9\x7a\xd3\x5f\x36\xba\x36\xba\x5a\x78\x4b\xba\xb6\x2b\x0d\x6a\x8b\x2a\x5d\x90\x3a\xd5\xf1\x52\x6f\xa0\x14\x1d\x39\x1a\xc3\x26\x84\x82\x34\xb4\x19\xc0\xff\x06\x84\xf3\x28\x69\xd4\x9d\x5e\x8a\xc6\xc2\xd4\x92\x84\xa3\x22\x0a\x58\x6a\x9a\xdc\x67\xab\x7c\x02\xf3\xdb\xdd\xd4\x29\x43\x0e\xf0\x0d\xa7\x64\x16\x95\x97\x91\xbc\x04\x7a\xb1\xad\x63\x8b\xa6\x0e\x98\x5a\xe6\x75\x57\x8d\xa2\xe3\x85\x1a\x17\x1c\xa9\x02\xeb\xbb\x84\xca\xc8\x05\x47\xa6\xc0\x15\x46\xd0\x72\xd3\x84\xd4\xfe\x56\x51\x45\x64\xad\x82\x0f\x0f\xda\xea\x23\xf1\x87\x79\x59\x54\x26\xb8\xa4\x65\xc6\xb2\xbb\xcc\x99\xac\x39\x8b\x14\xd9\xe2\x13\xb6\xd5\x8a\x2a\x3d\x91\x25\xe9\x67\x19\x0d\x55\x24\xf5\x85\x3d\xb9\x86\xc4\x53\x58\x86\xda\xae\x07\x1d\x7d\x16\xdc\x88\xcc\xf9\x06\x1e\x40\xe4\xb4\x0a\x93\x9f\xe7\x1f\x64\x07\x53\xb4\x0e\xa6\x5c\xea\x05\xc6\x9f\x02\xee\x9b\xfd\xde\x8c\xa0\xa2\xdc\xc7\xd8\x6d\xbc\x4c\x87\x75\x63\x16\xa5\x96\xa7\xf2\x58\x5e\x8c\xde\x8e\xaf\xd8\xf5\xf6\xb6\x0b\x64\x6e\xb2\x01\x50\xdd\xb2\xdc\x87\x46\x86\x3a\x4c\x0b\xba\x99\x16\x5a\x90\x28\x5a\xa8\x8d\x69\x54\x29\x4b\xdd\x34\xc4\xf7\xb4\xa3\xf8\x42\xa0\x4f\x89\x2d\x51\x95\xd7\x57\xcc\x24\x2f\x44\xf8\xf2\xab\x50\xac\x37\x71\xf0\xa9\xd8\x2f\xd0\x3b\xfd\x58\x2d\x56\x39\x4b\xa0\xc4\x81\x01\x07\x05\x78\x55\xe9\x2f\x5c\x5a\x13\xbe\x11\x55\xed\x58\x11\x3a\xb9\x5b\xa0\x59\x02\x93\x9d\x93\x14\xf7\xbb\x99\x30\x2b\xf0\x23\x00\xae\xf8\xbd\x2c\x10\x81\x19\x9d\x2f\x05\x5a\x09\x39\xa0\xe5\x40\x39\x69\xdc\x41\x9c\x4c\xce\xc8\x25\x8f\x2a\xf4\x21\x8e\x3d\xe9\xeb\xb8\x32\x10\x28\xe9\xeb\xf3\xb4\xd5\xe7\xb4\x83\xb0\xe1\x71\x6a\x76\xc9\x80\x44\xde\x7b\xf9\xfd\xbd\xc7\x13\x03\x86\x4f\xaf\xa7\xe8\xa9\x20\xbd\x96\x7d\x43\x0c\x5c\xd3\x4f\x8e\x31\xe0\xe4\xe6\xbb\x1c\xb5\x94\x81\xdb\xd3\x45\x0e\x93\xc1\xed\x31\x81\xdb\x34\xde\x8a\xa6\xc2\x82\xb6\xc1\x59\xc4\xb4\x12\xa5\x57\xef\x02\x22\x95\xab\x9c\x98\x24\x1e\x87\xea\x44\x54\xa5\xd2\x96\x93\x7e\x24\x1b\x29\x1d\xd7\xdc\x54\x50\xa5\x1e\x40\x7f\x94\xbb\xb2\x9f\xe5\x92\x04\x42\x32\xa6\xe4\x0b\xef\x41\x68\xa4\x8d\xa3\x18\x49\xc8\xc4\xdb\x92\x04\x59\xd8\x81\x85\x24\xdf\x5e\x49\xb3\xf8\x7f\xde\xa8\xbd\x6b\xe2\xef\x56\xff\x15\xba\xb5\x70\x2f\x13\x20\xb1\x6f\xa5\xf1\xff\x49\x88\x21\xac\x4c\x3c\x10\xd4\x16\xa6\xac\x7d\xc3\x3a\x73\x78\x3e\xed\x20\xce\x48\x88\xc2\x51\x9d\xea\x2c\x91\x01\x63\xb5\x31\x4d\xd7\xa6\xba\xa6\xc8\x47\x19\x33\xe3\x7b\xc6\x94\x76\xeb\x55\x92\x38\x43\x82\xbe\x85\x10\x5a\xd8\xba\x0e\x04\x33\x29\xe9\x61\x21\xd5\x52\x6d\x9a\x3c\xaa\x05\x05\x31\x28\xa6\x88\xf9\x46\x77\x35\xe1\x79\x48\xbb\x99\x26\x5a\x50\xf2\xd5\x64\x8a\x1d\x94\xfb\x82\x12\x88\x2a\xeb\xd9\xb8\x02\x5a\x96\x52\x7e\xb0\xcb\x6d\x99\x09\x48\xfc\x49\x5c\x1c\xa7\x31\xb3\x19\xb6\x9f\xa3\x4d\x9b\xa5\x5f\x99\x16\x86\x8f\x53\xb2\xbd\x4c\x71\xc2\x6d\x37\x9b\x12\x26\x0e\xf6\x7c\x18\x91\xad\x19\x70\x92\x51\x3a\xa6\x65\xaa\x57\xba\x8e\xfa\x70\xcf\x2e\x1d\x7d\xc9\x46\xd1\xb3\x02\x34\x3c\x8c\xc8\xa5\x99\x80\x59\x93\x85\x70\x36\xa9\xaf\x89\x2f\x05\x3d\x3a\x4c\x73\xbd\xad\x64\x48\xa9\x6b\x74\x20\x45\x73\x1b\x05\xb5\xc6\xa0\x9c\x1c\x90\xaa\xab\x58\x02\x91\x78\x5e\x49\xf6\xef\x24\x35\x94\x49\xf9\x6f\x1b\x45\xc1\xd9\x78\x31\xe5\x32\xaa\xaf\x96\xca\xfa\xfb\x4f\x80\x47\x85\xe0\x45\x99\x22\x95\x75\xb8\x73\x34\x6f\x90\x08\x0f\xbf\x8f\x8d\xe4\xb7\x15\xcd\x07\x1f\x3a\x6c\x60\x46\x2c\x3b\x51\x2b\x20\x3d\x0c\x58\x79\xa1\x15\x3f\x67\xa6\xba\x03\x46\x36\x10\xb3\xe5\xb6\x56\x25\xf2\xab\x66\x2a\xca\x99\x3c\x66\x04\x09\x9a\x9a\x99\x6a\xa2\x73\x93\xd8\xff\x00\x61\x4e\xb4\x41\x02\x56\x27\x4b\x3e\xd3\x90\x34\xaf\x5a\x99\x1e\x92\xd3\x29\x02\x4a\x29\x24\x85\x04\x7d\x83\xc3\x0d\xd3\xa8\x2b\x0b\x7f\x18\x56\xb6\xc6\x41\x71\xb7\x5f\x10\x4a\x0c\x99\xbf\xf8\x35\xa4\x7e\xf5\xf7\x61\x08\xd9\x47\x37\x18\xd9\x7a\x82\xba\x9e\xb9\xb6\x94\x59\xb6\x36\x3b\x7f\xe8\x99\x3c\x96\xc3\xf3\xf3\xd1\xcd\x6c\x78\x75\x3e\x12\xe2\xd9\xe0\x14\xe2\x88\x61\x89\x02\x6a\x6e\xe9\xe7\x09\x50\xb9\x7d\xe2\xb9\x17\xfd\xd8\x51\xff\xd0\x7c\x87\x3d\xbc\x40\x73\x3a\x32\xcb\x53\x8d\xe4\x55\x5b\x39\x7c\xf0\x66\xc3\x2b\x21\x0e\xcd\x11\xdb\x78\x4f\x89\x2a\xd8\xe9\x70\x38\x15\x94\xf9\x9e\xef\x42\x99\x5f\xbe\x0e\x85\x02\x4d\xbb\xd1\x20\x2d\x48\xb0\xcf\x77\x32\x7d\x46\xaa\x90\xb3\x4a\x09\x04\xaf\x7d\x17\x88\xd6\x01\xfb\x8a\x7c\x89\xe9\x64\x31\x2a\x88\x8e\xda\x2a\x5d\x09\xb6\xc5\x53\xdf\xc7\xb3\xc1\x99\xbc\xce\x4a\x26\xe8\x54\x57\x26\x10\x37\x3a\x25\x42\x4d\xf4\x92\x60\xfb\x54\x47\x9b\x21\x2e\xc6\x35\x66\x11\xf0\xc3\x41\x0e\xc5\xf2\x40\x68\x5d\x47\x50\x04\x1c\x3e\xfc\xe5\x0a\x4b\xde\x66\x16\xa7\xa8\xb5\xbf\xc0\x58\x36\x24\x36\x26\xb9\x0f\x22\x95\x60\x00\xf2\xe6\xa7\x44\x6e\x6a\x83\x65\xa0\xc0\x6f\x1e\x41\x1a\xca\xc9\xde\x5d\xef\x37\x1f\xed\xfb\x58\xe2\x3e\x6b\x11\x33\xb1\x44\xe2\x44\x71\xc1\xff\x7b\x0f\x86\x27\x59\xaa\x30\xc3\xae\xb1\xd6\x6b\xf5\xf9\x96\x7f\x2e\x8f\xe5\xe8\xed\xdb\xd1\xf9\x6c\xfc\xeb\x48\x5e\x0c\x67\x23\x80\x10\xcc\x46\x93\x0f\x2c\xb7\x9e\x0f\x4e\x5b\x8f\xa0\xf0\x88\x1b\x99\x8f\xc5\xc2\xae\xb5\xd4\xab\x95\x3f\x84\x0f\xa1\x9c\xe6\x12\x19\xb7\x83\x7a\x1b\x8e\xca\x3c\xc3\x65\x3f\x39\x13\x83\xd8\x99\x33\xea\x5c\x5f\x17\x12\x8e\x51\x4b\x10\x78\x54\xd1\x90\x27\x9b\x30\x64\x24\x32\xa2\xb8\x10\x5f\xd3\xe4\xfa\xc5\xc5\x0b\x79\x2c\xa7\xe7\xd7\x37\x23\x79\xfd\x56\x4e\xc6\xef\xde\xcf\xa6\xf2\xdd\x64\x78\x35\x1b\x5d\x60\xf7\x82\xc4\xec\xe4\xcc\x35\x19\x71\x90\xd7\x90\xc8\x56\x29\x5a\x27\xbe\xa6\xa4\xd3\x76\x4f\x02\x16\x85\x4e\xfa\x96\x89\x94\x79\xc8\xa9\x60\x4c\x4e\x91\x45\xe8\xc3\x5c\x39\x13\x8b\xdf\xf7\xd9\x14\x71\x25\x12\xe1\x3b\x10\xe2\x8d\x76\xde\x4e\x2e\x38\x13\x31\xa6\x20\x3f\x56\x04\x00\x5e\xa3\x72\x6f\x1f\xab\xbc\xe6\x2c\x11\x7c\xf0\xbc\x57\x77\x90\xf9\x62\xeb\x2c\x93\x22\x51\x60\xf2\xc3\x4b\x54\x9e\x06\x90\x48\xeb\x8d\xad\xb0\x16\x46\xda\x07\x4c\xd2\x6a\xd4\x67\x42\xe9\x42\x30\x0a\x77\x42\x8f\xec\x99\x73\xc1\x7c\xee\x18\x81\x75\x12\xd7\x5c\xd8\x9b\x8e\x1d\x69\xfa\xcb\xa6\xb4\x98\x16\x1c\x30\xca\x6d\x21\xcc\x9c\xa0\x69\xd3\x75\xcc\x30\xac\x3b\x2c\x54\x49\xb7\x1b\x1b\x4d\x79\x7e\xc1\x7f\xde\x1b\xe0\x8b\xda\xcc\x75\xa8\xe3\x1a\x41\x55\xf9\xa9\x81\x4b\xc6\x6b\x50\xc0\x84\x11\x0e\xce\x8b\xc1\x29\xee\x51\xbf\x59\x6f\x59\x01\x08\x67\xcf\x38\x99\x27\xbf\x33\xba\x2f\xca\x4e\x46\xbd\x22\x02\x2a\xe0\x37\x95\x13\xe4\x19\x21\x84\x8f\x57\x07\xd0\xe6\x45\x0b\x17\x9c\x17\xa6\x21\x8e\xc4\xf4\x2a\x8f\x74\xad\x41\x39\x14\x7e\x6d\x6b\x7f\x6b\xbc\x02\x7a\xa8\x8d\xae\xd7\xaa\xa2\xba\x0a\x8d\x5e\x6f\x6c\xed\xd5\xdc\x14\xcc\x2f\xb9\x8a\x50\xbe\x91\x5a\x57\xa2\x48\xaf\x44\xe6\xc5\x4a\x0e\x10\x69\x4b\x67\x83\xe8\x3b\xa5\x7c\x17\xf8\x7b\xbd\xad\x2a\xf8\x0b\x54\xe8\xb7\x75\xe7\xe2\xb5\x55\x7e\xf1\xfa\x5b\x12\x2e\x35\xa6\xcd\xe4\xec\x0a\x3b\x87\x8b\xb6\x90\xae\xd9\x2e\xb1\xa8\xbb\x76\x78\xd7\xa0\x7f\xce\x0f\x29\xd8\xbf\x0c\xe4\x45\x06\x4c\xb3\xd4\x8a\x4d\xe9\x10\xff\x9c\xeb\x7b\x43\xf9\xe4\xf4\x75\xce\x85\x04\x42\xeb\x32\x56\x7b\x6b\xa9\x3e\xe0\x4e\x23\x78\x2a\xb8\xd1\xba\x1e\x94\x85\xaa\x6b\xc8\x32\xa4\x75\xa7\x0f\xf4\x4d\x91\x08\x53\x04\xfb\x36\xe4\x3e\xd4\xb1\x5e\x45\x18\x5e\x2b\xe6\x99\xdc\xcf\x78\x7d\x09\xe3\x22\xdb\x68\xc8\xda\xf3\x9d\x48\x15\x06\xde\xd8\x67\x72\x74\x05\xf0\x6a\x08\x7e\xcf\xae\xe5\x87\xe1\x1f\x47\xf2\xfc\xfa\x2a\x70\x8d\x4d\x71\xb7\x23\xa2\x89\xb2\x85\x73\xe8\x7f\x4c\x62\x6b\xd2\x07\xd9\x8a\xd4\x64\x42\x16\x5c\x27\x0d\x68\xb3\xb1\x38\xcd\x1e\x7b\xb4\x6d\x43\x14\x79\xc0\x22\x4b\x4d\x17\xd1\xd7\x0d\xa8\xc9\x3c\xfa\xba\xff\x90\xb6\x3b\x70\xde\x8e\xbd\xa4\x1d\x10\x79\x8e\x91\x69\x92\xc4\xbd\x58\x81\x2d\x16\x48\xa6\x67\xd2\xfa\x7e\xbc\x89\xf2\xa4\x14\x2a\x65\x02\x3e\x7c\x17\xaf\x7c\xae\x0b\x52\x6b\xb6\x5a\x99\x9a\x84\x17\xee\x59\x94\x48\x39\x33\xdc\x38\xa5\xac\x2b\x92\x49\x43\x32\x88\x2c\x25\xb8\x67\xd5\xc8\x19\x1d\x76\x62\x43\xb4\xd1\x4c\x0a\x91\x4b\x36\x9e\x27\xf2\x99\x73\x3c\xb3\xef\x40\x63\xf8\xa6\x57\xc7\xee\x2c\x2e\xf0\x4b\x34\x01\x80\x65\xfa\x62\x5b\x62\xa5\x91\xa5\x0c\x58\x4c\xed\x4a\x72\x76\x7c\x7a\x6f\xe6\x89\xbe\x6d\x4d\x1f\x3e\xdf\xb3\x51\x56\xdb\x1a\xfd\xe9\xd9\x86\xd9\x9b\x3f\x1c\x3c\x80\x70\x8b\xae\xdb\x5e\x43\x9c\x23\x53\x2f\x03\x9d\xbb\x5a\x2c\x2c\xe6\xd1\x3c\x41\x27\x20\xf6\x69\x11\x92\xff\xbc\x18\x78\xed\x2e\x5b\x7e\xbf\x1d\x02\xb8\x85\xd3\x37\x3e\x5c\x5f\x8c\xdf\x8e\xcf\xb9\xa2\xc7\x93\xa7\x22\x2b\xd9\xb1\xdd\x3b\x81\x21\xbf\x19\xfd\xb6\x31\xc9\x39\xb8\x71\x3b\x69\x79\x5e\x7e\x66\xfb\x2f\xcf\x0f\x53\x65\x29\xc8\x10\xe5\xc8\x46\xc7\xb2\x86\xc3\x82\xd3\xb7\xde\xa8\x0a\x9d\xae\xaf\x92\x19\x91\x52\x9e\x0e\x72\x12\xed\x44\x81\x83\x1b\x6a\xaf\xfd\x53\x66\x69\x15\x2d\x17\x83\xad\x7f\x70\x32\x8d\x62\x8a\x88\x63\xde\xa3\x7a\x3b\xf9\x33\x74\xf8\x97\x42\x08\x0e\xdd\x84\x7c\x67\x4c\xd2\x80\x89\x41\x3a\x84\x7b\x9d\xcd\x60\x67\xbe\x5d\x16\x8f\x5d\x62\xb1\x9a\xa8\xfd\x7b\x95\xd7\x25\xe6\x43\x1e\xf9\x85\xa2\x01\xa9\x13\xbe\xd5\xbc\x00\x6e\xfa\xb5\xa9\xcc\x7a\xbb\x96\xcb\x6d\xb8\xa1\x49\xf7\xf7\x06\x9b\x5d\xf6\x65\x21\xb7\x5b\x2a\x44\x50\x56\x12\xc3\x29\x90\x13\x24\x38\xec\x85\x45\x23\x5d\x2d\xfe\xba\x35\x89\x4a\x10\x3a\x29\x22\x85\x94\xfe\xb2\xd0\xe4\x1e\xe0\xd7\x82\x42\x18\xb0\x4b\xaa\x51\xed\xc3\x71\xd6\x3d\x1c\x78\x16\x46\x17\xe1\x94\x84\x74\xec\x30\x99\x6b\x50\x26\xb3\xa4\x93\x84\x4c\x24\xbd\x6f\xd3\x7b\x27\xd4\xc4\x8d\x81\x01\xf4\x35\x75\x63\x11\xaa\x07\x3a\x86\xae\x38\x28\x54\x94\x7b\x3a\x84\x8b\xcc\x23\xfd\x60\xae\xf4\xbc\x04\xf3\x6a\xf0\x6c\xf0\xbc\x3d\x1d\xcf\xba\xd3\x31\xfa\xd3\x6c\x34\xb9\x1a\x5e\xfa\x79\xb9\xbd\x1c\x4d\x85\xf8\xd8\xd1\x63\xee\x21\x91\x07\xe3\xc4\x50\x16\xab\xe5\xda\x2c\xbe\xc7\x6f\x43\xa9\xc5\x21\xf4\x08\x62\xa1\xa7\x41\xd5\xf4\xcc\x9f\xe0\xf9\xdb\x9f\xc7\xd8\x1e\xf3\xf3\x81\x3c\x9f\x8c\x2e\xc6\xb3\xa9\x10\xc3\x6a\x17\x47\xe5\xed\xc6\x56\x8d\x22\x25\x3b\x11\x1f\xb6\x3e\x63\x41\x13\xf8\x92\x57\xdb\x51\xc7\xe6\xbb\x9b\x0f\x36\xc3\xbd\x7b\x9c\xce\x26\xe7\x7f\xcb\x0e\x60\x80\x84\x07\x1d\x2d\x14\xd8\x23\x06\x8b\x86\xd8\xcc\xba\x70\xb6\x04\xdb\x8e\xb1\x18\x3e\x8a\x5e\xdc\x11\xa0\x10\xab\xc4\x13\x27\x16\xf5\xb9\xd7\x50\x0c\x60\x1d\x30\x8a\xd3\x0f\x8a\xf6\x07\xd3\x2a\x03\xa1\xdb\x92\x60\x30\x81\x8c\x4f\x2b\x67\xfc\xb4\xa1\x59\x38\x0f\x29\x01\x22\x78\xba\xbb\x93\x1e\x58\xdb\x0a\x30\x02\xd6\x0c\x90\x00\xc4\x0e\xc5\xd0\x93\x06\x1f\xf5\xdc\x99\x46\xb7\x73\x37\x3b\xed\x16\x22\xc4\x6d\x88\xba\xd6\x52\x11\x85\x4c\xa4\x81\xf5\xdf\x22\x55\xeb\x2c\x9d\x68\xc3\x40\xbf\xb2\x74\xd9\xd8\x3a\x6b\x28\x38\xe3\x43\x3c\x1f\x50\xe8\x13\x3f\x99\x0a\x8f\xc6\x4a\x95\x28\x12\xbb\x78\x4a\x7a\xf7\x70\xec\x21\x1b\x9f\xe4\x6e\x65\xdd\xd7\xcb\xf2\x0c\x13\xc4\x3c\x8c\x45\xfc\xfd\xdc\x9b\x57\x7a\xe5\xef\x36\x30\x55\xd3\xed\x04\x47\x37\xed\x0f\x1e\x8d\x20\xa8\x76\x51\x48\xb5\x0c\x6e\x91\x1b\xdc\x2c\xb4\x62\x81\xb8\xc4\x70\x26\x62\x45\x5b\x47\x4a\x02\x4c\x29\xcd\x27\x87\xaa\xc1\x07\x51\x42\xa1\x22\x62\x25\xe3\xfa\x43\x98\xe3\x4b\xa1\x0a\x4e\xfb\xe8\x11\xeb\xb9\xd3\x5a\x10\xa8\xa1\x4f\x56\x85\x2b\xd6\xd6\xfa\xce\x9a\x0c\x4a\xe6\xda\xc2\x08\xcb\x14\xdf\x0c\x67\x63\xcc\x57\xc5\x2a\x89\xb3\xf7\x23\x42\x85\x62\x06\x12\x22\x95\xcf\x19\x9b\x8c\x32\xb9\xee\x17\x4f\xa1\x18\x41\x8b\xee\xc7\xe5\x74\x55\xd4\x7c\xe0\xdf\x6a\x5d\x1c\xfd\x91\x03\x2f\x3d\xa3\xd7\x1e\x89\xbb\x55\x39\x10\x62\xd8\xd3\x91\xbd\x97\x5d\xfc\xfc\xf1\x39\x77\x00\x52\x55\x81\x88\x40\x49\x28\xf5\xf5\xb7\xf5\x27\x71\x2b\xbe\x04\x70\xe5\x6c\x04\xa5\x51\x6f\x87\x97\xf2\x66\x72\x7d\x33\x9a\xcc\x3e\xf1\x4a\xbc\x1c\x9c\xca\xeb\x5f\x47\x13\x98\x75\xc0\x9b\x0c\x2f\x13\x5d\x60\x16\x82\xb4\xe8\x93\xfb\xbe\x18\x35\x16\xb3\x02\xd3\x46\x6c\x63\x68\xa8\xfd\x1c\xd0\x94\x3f\x7d\xab\xf7\xde\xa6\x38\xa1\x11\x94\x43\x1d\xf5\xf7\x33\x60\xaa\x3b\x1a\xbc\x3f\xc1\x81\xee\xb5\xb2\x58\xf3\x16\x76\xf4\x5c\x67\x3e\x82\x0e\x5f\x40\x0f\x55\x78\x47\x4e\xb2\x3d\xdb\x13\xaa\x4f\xa6\x31\xf5\xcf\xb1\x1a\xd8\x99\x10\x28\x08\x45\x0e\x68\x84\x4a\xb2\xa4\x16\xcc\xd7\x9c\xf8\x61\x43\x6f\x98\x25\xb8\x77\xbf\x3c\x1f\x9c\x0d\xe2\xaa\x9f\xc5\x55\xef\x71\x6e\x64\x5a\x01\xe9\x3a\x9d\x33\x45\xd6\x3c\x31\x62\xae\x3a\x37\x72\xbc\x20\xf3\x8d\x62\x5c\xde\x4e\xce\xa7\x9e\x67\x47\x25\x3d\x7e\x16\x7b\xdc\xd5\xd2\x9e\xe8\x74\x47\x3f\xfb\x5b\x3a\xde\x6e\xea\xa9\xbe\x13\x97\x25\xda\xe3\x7e\x5f\x53\xce\xad\xdf\x54\xbb\x0d\xd6\xf3\xcb\x53\x25\xf0\x30\x63\x06\x40\xc7\xb4\x48\xa6\xe2\xb9\xfc\xc3\xf5\xf8\x6a\xe6\x0f\x33\x55\x37\xe3\xdf\xcd\xf2\xa0\x19\x2b\x69\x71\xd3\xa1\x96\x46\x0e\x6d\x84\xc5\x15\xd1\xfb\x5c\x04\x6a\x2f\x55\x55\x5c\x05\xf0\x29\x2d\x0b\xf0\x9a\x19\xb3\x30\xef\xe1\xd7\xa0\x6e\xa5\x8e\x29\xbc\x2f\xe8\x3d\xfa\x92\x8c\x05\xcb\xf9\x93\xa1\xb0\x71\x62\x68\x8b\x2e\xba\x08\x2f\xc0\xb6\xb3\xa2\xeb\xb4\xc7\x34\xf7\x72\x27\x13\x8e\xf8\x84\x24\xef\x1b\x16\x7f\x95\x0a\x17\x02\x7c\xa4\xb8\x8d\xb6\xf2\x1a\xe2\x7f\xea\xb3\xee\x83\x9d\x3d\x18\x77\xfc\x3f\xfe\xfb\xf1\x83\x71\xa8\x72\x34\x6a\xb5\x2a\xb2\x2c\xf4\xb5\x56\x5e\xad\x48\x30\x4c\x41\xd5\x10\x04\xd8\x0d\x2e\xd8\xfe\xd5\xf9\xd6\xbe\xe7\xb7\xc5\x4f\xf2\x58\x4e\x46\x97\xc3\x99\xb7\x07\x47\x93\x5f\xc7\xe7\xfe\x6c\xfd\x34\x38\x95\xb7\x4c\x9d\xb0\x30\xf5\x62\xbb\x76\x10\x6e\x64\x87\x6f\xee\x94\x80\xfb\x5e\x77\xa2\xfc\xe4\xfd\x10\x49\x52\x86\x73\xc6\x51\x72\x79\x2d\xbd\xac\x6b\x74\x05\xff\x0c\x58\x93\x76\x58\x7f\x20\x44\xc8\x0d\xcf\x3e\xd0\xf2\xf1\x12\x57\xa3\x3f\xb1\x7c\xd4\xb8\xcd\x01\x65\xf3\xf6\x14\x80\xe3\xd4\xfc\xbe\x2e\x16\x3c\x7b\xf0\x44\xd2\xd9\x22\xde\x20\x99\xd8\x4d\x8c\x32\xc4\xae\x81\x35\x26\xaf\xd9\xbb\x11\x63\x5d\xbe\xaf\xe0\xa9\xf5\xcb\x99\xb4\xcc\xe0\xa2\xde\x19\x0b\x53\x84\x4b\x00\xb9\xe3\x49\x2e\x39\x03\x8e\x07\x7e\xf9\xce\xe4\x14\xf9\xfa\xcb\x1d\xee\xb3\xaf\x4c\x1b\x46\x60\x4a\x0e\x57\x15\xa4\xb9\x98\xc6\x89\xde\x0c\x7a\x95\xc4\xbe\x13\x39\x06\x8e\x9c\x39\x20\xe8\xc0\xb7\x07\x10\x05\xd3\x38\x5d\xae\xe0\xce\x22\x47\xf5\x53\xee\x13\x9e\xf4\x7e\xf3\x85\x35\xaa\xbe\xb5\x4c\xcc\x14\x96\xbf\x88\xca\x1d\xc8\xa9\x9f\xe7\x56\xb4\x1e\xa0\x07\x7e\xd6\x8d\x2a\xc5\x3e\x5c\x24\x04\xdb\xd3\x68\x54\x50\xbe\x58\x7b\xc1\x92\xda\xdd\x75\x17\x81\x40\x28\x2d\xd9\x9a\x11\xec\xa6\x6a\x76\x7e\x2a\x7f\x96\xc7\xf2\x72\x4c\x94\x2e\x42\xfc\x3c\x38\x6d\xb3\xaf\xf6\xfb\x3c\x7e\x1e\x9c\xf5\x69\xef\x32\xd1\x75\xbc\x09\x83\x34\x9a\x5e\xe9\xd2\x95\xa3\x2a\x03\x14\x0f\x46\x69\x89\x2c\x1b\x06\x4d\x2b\x08\x28\xba\x2d\xc1\xbd\x3a\xe8\x2c\xd1\xa2\x01\x51\x72\xa5\xe0\xaf\x54\x5e\x21\x89\xa9\xd5\xba\xd4\x0f\x2a\x70\xca\xda\xba\x48\x95\x40\x14\x17\xa6\xba\x13\xda\x8b\x8d\x6a\xa1\x13\x9f\xff\xcf\x83\x33\x39\xcb\x7d\x91\x09\x8d\x82\x4b\xd9\x42\xf0\x2a\x59\xaf\x4d\x83\x91\x2b\x80\x2b\xc6\x64\x69\x91\x3b\x53\xa3\x8b\x0d\x13\xeb\x91\x8f\xa1\x35\xa6\xac\x06\xce\x2b\x89\xf0\x19\xe7\xc4\x72\x9b\x83\x56\x7e\xf0\xa6\x5f\xa3\x42\x30\xd1\x6b\x78\x4c\x43\xd2\x58\xb9\xda\x96\x2b\xaf\xe6\x41\xb0\x2e\x61\xb5\x80\x2a\x23\x82\xa6\xbe\xc3\xc3\x02\x6b\xc1\x79\x95\x61\x1d\x32\x54\x95\xf6\x9a\xa0\x4e\xd2\x2a\x04\x16\x27\xc2\x54\xc1\x45\xc7\xdb\x89\x47\x00\xeb\x91\xb4\x01\xff\x7e\x17\x64\x1d\x10\xbe\x03\x60\xaf\x24\xa5\x3b\x7d\x6b\x84\x48\x6b\x7b\x86\x88\xa2\x36\x86\x38\x36\x7a\xb1\xad\x8c\xaa\x21\x88\x1a\xb2\xb3\x60\x58\x87\x66\xa0\x07\x81\xd3\x65\xa9\x1a\x55\x84\x7f\x6d\x6a\xbb\x32\x50\xdc\x0e\x03\x7f\xd5\x1d\xfc\x0a\x1f\x10\x76\x45\xcc\x55\x90\x8b\x58\x63\xfe\x28\x3c\xbc\xb1\x75\xb3\xad\xfc\xbe\x58\x58\xd7\x14\xb4\xad\x5d\xb3\xad\xe7\x30\x17\x8d\x4d\x52\xc4\x16\x8d\x79\x80\x52\x37\x47\x22\x47\x44\x20\xd8\x63\x53\xdb\x85\xd6\x7e\x53\xba\x48\x67\x1b\x78\x39\xf2\x15\x80\xd2\x0c\xe0\x0c\x10\xe0\x0c\x60\x61\x11\xa9\x65\xfb\x16\x36\xdf\x83\x4c\x90\x97\x04\x7d\x45\x9e\x9d\x90\x9f\x5a\x3e\x8c\x39\xe8\x8f\xc5\xc1\x2f\xf2\x98\x89\xab\x3e\x09\xf1\x4b\x1b\x8e\xd6\x45\xfe\xf8\xa6\xfa\x12\xf1\xe0\x2a\x02\x7a\xb9\x63\xbb\x3a\x6e\xee\xf5\xb1\xaa\x1b\x11\xe2\xbd\xd1\x88\x51\xb9\x4b\x22\x10\x4c\x13\xdd\x98\xdf\x0c\x9c\x13\xb0\x75\x9a\xf3\xbb\x1a\xed\x1a\x4a\xe9\x7a\xd0\x35\x79\x37\x2a\x1b\xc1\x7a\x48\x4b\x8f\xfb\x38\x34\xb0\xd4\x2b\xbd\x68\xb8\x8d\xa5\x6e\xc0\xfe\x83\xe2\xd9\xdd\x3c\xa7\xe4\x84\x86\x74\xa3\x88\xba\x5a\xd6\xea\x31\xb8\xb7\xdb\x29\x51\xe2\x9b\x52\xa2\x64\x92\x12\x95\xfa\xbe\xda\x91\x7e\x81\xc6\x2b\xe0\x4c\xd3\x34\xa4\x0e\x26\xac\xad\xe7\x06\x49\xde\x26\xeb\x82\x29\x43\x98\x41\x6f\x68\xd1\x2b\xd3\x3d\x39\x46\x4c\x1e\xb7\x0a\xe4\xff\x31\xb3\x08\x53\x0d\xee\xac\x05\xe0\xe5\x67\x84\xab\xb0\x5b\x0f\x88\x1e\x40\x35\x65\xc6\x5b\x7f\x53\xc4\x3d\x8c\xfc\xb9\x48\x76\x04\x5a\x2c\x46\x30\x37\xba\x76\x04\x2c\x26\x9d\xd5\x00\xb0\xf9\x97\x96\x64\x67\x7f\x73\x28\x46\x80\x86\x03\x74\x66\xa5\x4c\x73\x9f\x39\x24\x13\x5d\x06\xeb\x1b\x85\x4c\x82\x7d\x20\xac\x94\x6b\xca\x74\x64\x1a\x01\xa6\xfa\xdd\x2f\x47\xd0\xdd\x67\xdf\x72\x8a\x72\x47\x07\xd0\x7e\x2f\x43\xb2\x46\x86\x5c\x4b\x58\x94\x23\x20\x3e\xe1\xdb\x68\xd4\xc2\x34\x89\xf2\x92\x85\x49\x54\x10\x19\xb8\x2c\x49\x6f\xfd\xbc\x42\x1e\x89\xc9\xa3\xe1\xe9\xc7\x62\x38\xcf\xb1\x0e\x98\x10\x61\x3d\xa8\x72\x4b\x59\x27\x90\xd5\xe5\x4f\xa5\x53\x2b\x70\x8a\x57\x96\xd8\xa6\x20\xd5\x8a\xae\xf5\x4a\x35\x5b\xd0\xd8\xa7\x44\x01\x42\x29\x64\xe9\xea\x06\x0e\x44\xfa\x76\xff\x94\x81\x02\x87\xf8\xd2\x6a\x27\x75\x5d\x63\x7a\x24\x2e\x3b\xb8\x4a\xd2\x3a\x27\x7e\x38\xe0\x30\xaf\xb7\x1b\x26\x06\x4e\x1e\x9d\x63\xc2\x86\x6a\xfc\x91\x11\x6d\xfe\x17\x2f\x12\xec\x63\x25\xfd\xf6\xdf\x44\xb5\x20\x71\x2f\xc6\x62\x4c\x28\x95\x18\x65\x02\x8d\x07\xea\xea\xa4\xb9\xf4\x28\xc1\x96\x79\x9e\xef\xf0\x30\x07\x39\xbb\x0a\x5a\xac\xb0\xde\xe5\x6e\xff\xfc\x88\xf0\x7a\xb0\x68\xfd\x24\xa5\x6e\xe8\x27\x2c\xc4\x34\xe8\x2b\x54\x60\x8b\x76\x09\x4c\x2e\x6e\xc3\xfc\x55\xb0\xa3\x30\xa9\xb1\xbd\xa8\x44\xed\x88\x95\x10\xd9\xa6\x4d\x6c\x13\xfb\x18\xd0\x3a\xf1\xe0\x10\x8d\x1c\xf1\xc4\xa5\x0a\x43\xbc\x75\x69\x57\x47\xca\xf5\x2c\x30\x96\x5c\xc9\x50\xf4\x20\xd8\xc9\xa4\x06\x15\x19\xa6\xa6\x9d\xd3\xdb\x63\x7d\x0c\xe4\x95\x37\x35\x9b\x7b\x5d\x6a\xaf\x6a\x10\xfb\x13\x56\xa2\x4f\x7a\x95\x7f\xbb\x4f\x1d\x68\xcd\x10\x8a\x47\xbe\xde\x0d\x73\xa0\xf1\xe5\x0a\x5d\x43\x95\x23\xb1\xf8\x58\x34\x03\xc7\x98\xe3\x3a\xf2\x19\xc7\x41\xe7\x25\x91\x80\xcc\x17\x94\x8d\x2c\xd1\xc7\x7c\x3c\xdf\x1d\x83\xaf\x19\xe1\x9b\xa9\x5d\xd2\xd1\xcc\x43\xa2\x71\x04\x20\x6f\x6b\xb7\x55\x08\x42\x53\x72\xad\xd7\xb6\x56\xc0\x4e\x6c\x57\x1c\xe8\x46\x9e\xd6\x41\x6b\xb3\x7f\x65\x6f\xb4\xc0\x5c\xc9\x31\x4a\xfc\xc7\xcc\x34\x95\x7b\x06\xae\x6c\x94\x60\xb1\x42\x7d\xde\x1e\xd4\xb6\x08\xba\x03\x80\xa8\xdb\x37\x83\x6f\xbc\x8d\xf5\x26\x16\xe6\xbd\x2d\xa9\xc8\xaf\xde\xca\xe3\x3c\x91\xc7\x00\x31\x1e\x5f\x11\xda\xe4\xf4\x64\x70\x2a\xc7\x29\xe8\x01\xde\x9f\xd7\xc0\x14\xd7\xd6\xe3\xc9\xe8\x4c\xc3\x45\x31\xaa\x26\xb2\x3d\x05\x09\xac\x44\xaa\x80\xf5\xa0\x62\xf9\x80\x56\xcc\xd9\x0b\x87\x66\x27\x0f\x9f\x9d\x1c\xc9\xa5\xda\x39\x2c\x83\x4e\x31\xb7\xa8\x07\x75\x8b\x03\x51\x62\x09\xe2\xc1\xd7\xc8\x82\x6e\xaa\x80\xb2\x18\xc0\xf0\xce\xe4\x30\x73\xc5\xba\x76\x2e\x08\x77\x2b\xaa\xba\xb2\xb4\xd5\x9d\x06\x22\xcb\x88\xbe\x21\x5a\x48\x56\xae\x32\x6a\x67\xdd\x3a\xa7\xc1\x29\x84\x78\x52\xaa\xba\xc0\x72\x7f\xad\x76\x02\xec\x56\x46\xeb\x32\x7c\x3e\xf4\x25\x39\xfc\x7b\x60\xe0\x0f\xaa\x34\x4b\x36\x50\x05\xce\x8a\xa9\x39\x84\x08\xf3\xc5\xad\xef\x61\x18\xeb\xf5\x2a\xa4\x30\xb6\xb0\x69\x4e\xe5\xb1\xfc\x30\x9e\x9e\x8f\x2e\x2f\x87\x57\xa3\xeb\xdb\xe0\xdd\x3d\x3d\x1d\x9c\xca\xd1\x9f\xce\x6f\xa7\xc3\x37\x97\x23\x39\xfa\x75\x74\x35\x9b\x0a\x71\x45\x37\xc7\x0d\x88\xfb\x70\xe4\x89\x13\xb4\x05\xee\x5e\x6a\xa8\x47\x63\xeb\xd4\x16\x25\xeb\x50\xe4\xf8\xa0\x4c\xba\x32\x6d\x38\xf3\x8c\xaa\x2a\xee\x5f\x84\x45\xaf\xd5\x5f\xf4\x16\xcd\x49\x6f\x4a\xf9\x43\xf4\xce\x2e\xf1\x0e\x81\x2a\x98\x5e\xd8\x81\x3e\x58\xc8\x48\x88\xca\x08\x1d\xc6\x6a\x13\x1a\x3a\xbd\xc1\x43\xee\x05\xd6\x94\x32\x0b\xd3\x10\xd6\xb5\xd4\x59\x75\x26\x27\x2b\x0d\xf5\xfc\x5c\xc1\x7f\xc3\x3a\xe2\x3b\x2f\xe2\x02\x10\x5e\x28\xf9\x60\xea\xad\x43\xe2\xc1\xcf\x18\xd6\xaf\x1f\xc8\x0e\x98\xef\xc8\x03\x8f\xd7\x3f\xee\x47\xaf\x9e\x16\xa8\xd2\xa8\xd2\xef\x43\xe5\x1a\x60\xf3\x79\x84\xe2\xfb\xa8\xdf\x16\x52\xab\xba\xb9\xff\xeb\x56\x7d\xf6\x4f\xaf\x4c\xad\x09\xe4\x8d\x05\xea\xa4\xdf\xbd\x88\xa5\x59\x4a\x28\x4f\x07\xc5\x30\x1d\x32\x6a\x16\x42\x37\x0b\x7f\x84\x4e\xfd\x11\xaa\x76\x61\x7d\xe6\x3b\x99\x2e\x30\x84\xfd\x53\x4c\x9f\x5d\x2c\x14\x7d\x00\x18\xe4\x1e\xec\x67\xed\x1f\x10\xe1\x81\x55\xdb\x4b\xc4\xc1\x7c\xdc\x2b\xdb\x7e\xe7\xee\x9c\x80\x07\x9b\x5a\x37\xc8\x07\x8f\x40\x26\x25\x1f\x95\xf1\xe2\x92\xa4\x15\x3c\x04\x46\x1b\xed\x40\x92\x5a\x01\xbd\x48\x5d\x02\xff\x66\xe8\xc4\xa1\x3b\x12\x69\x51\x29\x1c\x39\xaa\xd3\xf1\x0c\x2e\x7c\x57\x4a\xc7\x46\x14\x94\x39\xc8\x95\x03\xfd\x60\xac\x5f\x4a\x7e\xc5\x45\x42\x5f\xc6\x77\x80\x43\x40\x95\x45\x76\xc9\xb1\xbf\x02\x05\x5a\xa8\x00\x06\xb9\x77\x94\xca\x16\x0a\x70\x72\x31\x18\x11\x31\x60\xd1\x74\x8a\x31\x1c\x6e\x1e\x06\xca\xed\x2f\x6c\xb5\x20\x42\x27\x9c\x00\x6c\x1b\xee\xab\x98\x6e\x19\x42\x30\xcc\xbf\xf8\x54\x5d\x25\xe2\x10\xe0\x83\x2e\x12\x98\x9b\xeb\x1d\x23\x31\x14\xa3\x91\x04\x1e\xb0\xa4\x22\x19\x28\xb8\x88\x09\x98\xef\x04\xa5\x88\x6e\xcb\xac\xfc\x70\xab\x16\x1c\xae\xd5\xf3\xfc\x1e\x23\xf0\x5e\xb2\x2f\xf7\x6c\x3b\xf9\xa8\x51\xea\x78\x6d\xba\x34\x8b\x26\x50\x12\x10\x0f\x8c\x97\x4d\x5b\x6f\x3c\xa4\x01\x35\x2a\xc8\x5b\xea\x3b\x03\xa9\xb8\x0f\x48\xc9\x59\xe0\xac\x76\x7f\x2b\x88\xb0\x93\x77\x89\x32\x65\xf4\xf5\xf2\xc4\x50\x3d\x35\xf5\x19\x2f\x14\xae\xa2\xb4\x93\x6a\xad\xab\x25\x7a\x0c\x9d\x15\xaa\x03\xe2\xd8\xf3\x51\xe8\xd2\x40\x0e\x03\x93\x70\x1a\xc4\x87\x30\x01\x5d\x27\xf1\xce\x4c\x7d\xf3\xa6\x82\x6b\x86\xec\x72\x15\xdf\xee\x49\xbe\x59\xd9\x1a\x74\x28\x22\x7e\x7d\xbc\x57\x8d\xb3\x78\x09\xb6\xad\xef\xfc\x5a\x8b\xa5\x0d\xc8\x59\x42\x5f\x1d\x24\xb7\xcc\x0b\x79\x39\xbc\x7a\x77\x3b\x7c\xd7\x49\xcf\x32\x44\xac\x86\xf7\x1c\xa0\x42\x89\xa2\xcc\xcf\xed\xa8\xba\x2b\x8d\xc3\xbf\xc3\xef\x42\xfd\x56\x30\x55\x28\xd1\x71\xdb\xdc\x43\xd0\xaf\x75\xed\x9d\xc9\x63\x79\x35\xfa\x28\x7f\x1d\x4d\xa6\xcc\x3d\x39\x7b\x9f\x70\xd1\x09\x71\x7a\x36\x38\x05\xd9\x88\xfe\x83\x1e\xb8\xee\x96\xf8\x5f\x9e\xaa\x70\x94\x2a\x43\x03\x68\xf4\x4c\x4e\x39\x49\x22\x30\xce\xf9\xcd\x0a\xf1\x9d\x06\xeb\xa5\x2e\x53\x12\xa5\x6c\x42\x28\x09\x89\x9c\x56\x40\x1e\x4a\xa1\x8f\x94\x0b\xa1\xe9\x72\x9f\xc5\x42\x08\xf7\x96\x1d\x40\xd1\xf1\x20\xf0\x62\x36\x76\x49\x0a\x1d\x41\xd1\xe5\x76\xb3\x04\x74\x3c\x25\x9e\x87\x39\xee\x6e\x12\x50\x2a\x21\xd5\x39\x09\x4b\x54\xdb\xf5\x5c\x63\x75\x14\xd7\xcb\xc6\xc1\xc5\x3d\xc0\xe9\xe0\xbf\x00\x05\x19\x1d\x72\xd7\x80\xb0\x07\xdc\x7a\x46\xca\x83\xf3\xf8\x0c\x16\x27\xa8\xcd\x7d\x50\x4f\xd4\xcb\x5b\xb5\x3f\x73\x1e\x16\x3f\x7b\x62\xae\xf3\x9a\x83\xfd\x48\x1a\x10\xd7\x7b\x1b\x83\xb2\x5f\xb1\x15\x41\x0f\xb6\xf6\xdd\x33\x79\x2c\xdf\x5d\xff\x3a\x9a\x5c\x8d\xaf\xde\xc9\xcb\xe1\x47\x80\x1d\xfd\xe1\x76\x32\x9e\x5e\x8c\xcf\x49\x6d\xe7\xf4\xdd\x6c\xe1\x51\x4f\xc0\xe5\x8d\x44\x7d\x68\xf2\x84\xfb\x85\x69\xa2\x75\xb5\xd4\xea\xc1\xd6\x02\x4a\xc8\xe9\xcf\xa0\x26\xad\x49\xba\x39\x5b\x06\x54\x2d\xb9\xa8\xe3\x8d\x46\xaa\xef\x66\xdb\xb0\x52\x0b\x0b\x54\x1b\xa7\x45\x02\x4e\xee\x71\xf1\x67\xdb\xfc\xd9\xe0\x4c\xbe\xa5\x52\x9c\xbd\xdf\x66\xce\xdf\x47\x2b\x0f\xcf\x8e\xe4\xda\x56\xcd\x3d\x94\x42\x61\xcf\xb2\xa9\x93\xf4\x62\xa4\x0c\xa4\xab\x45\xaf\x75\x7d\xa7\xab\xc5\x2e\x73\x92\xa7\x95\xe9\xc8\xf5\xb3\x77\x60\x22\x71\x69\x52\x09\x6e\xba\x03\x91\x7d\xee\xdc\x6e\xeb\x26\xa4\x48\xff\x65\x5b\x1b\xb7\x34\x44\xe2\x4e\xa7\x0b\x6e\x9d\xa5\x41\x2a\x7d\x01\xba\xc8\x40\x08\xa6\x0b\x3e\x1d\x9c\x40\x2e\xc9\x52\x9e\x9d\x9c\xbc\x3c\x3e\xf9\xe5\xf8\xe4\xc5\x40\x9e\x32\x16\x0c\x0c\x56\x8c\x38\x9f\xeb\x43\x75\x24\xcf\x0f\xab\xda\x1d\xc9\xf1\x61\x55\x1b\x75\x24\x2f\x0f\xed\x9d\x59\x18\x5d\x1e\x89\xcb\x43\x33\xaf\xf5\xd1\xff\xd2\x84\xb4\x83\x1f\xa7\xea\xcb\x46\x35\xf7\xff\x38\xfa\xd7\xaf\xf0\xbf\x9e\x3c\x3f\x79\xfe\xa2\xc5\xff\xfa\xec\xec\xf9\xc9\xef\xfc\xaf\xff\x8c\x3f\x91\x94\xfb\xf0\xfc\xc8\x9f\x88\x93\xe3\xb3\x93\x93\x33\xaf\x9b\x7d\xd6\x95\x5c\x9a\x3b\xd3\x20\xb8\xd1\xdb\xc0\xe8\x23\xe1\x10\xc5\x40\x88\xbc\xc2\x20\x26\x86\x23\x98\x94\x10\xb4\xa0\x01\x10\x75\x8e\xad\xd7\xee\xe9\x2a\x81\x85\x50\x98\x56\x41\x25\x88\xf2\x54\x99\x66\x4f\x2d\x40\x2c\x06\xac\x1b\xc4\x34\xe5\x5d\x72\x91\x07\x05\xd1\xbc\x49\x95\x3d\xbc\x8a\xe7\xf6\xa1\xcb\x88\x5e\x08\xa2\xb1\xc2\xac\x8a\xf8\xad\x04\x27\x10\x7a\xb2\x0c\x35\x6c\x30\xd9\xb3\xdd\x03\xaf\x20\xc5\x29\xe0\x1e\xa4\x28\xe8\xdf\xdc\x89\xf8\x69\x9c\x22\xec\x14\xb8\xa6\x5c\x4a\xc2\x26\x68\xb4\x39\xfc\x9e\x82\x54\x54\x11\x9d\xf9\xc4\xe3\xac\x07\x9f\x45\x0b\x7f\xf6\x0c\xaf\x36\xf0\xbf\x1d\x4c\x87\x7f\xba\x51\xcd\xfd\x01\x8e\x8b\x62\xe6\x40\x24\x82\x97\x9d\xad\xb1\xce\xc7\xa6\xb6\x40\x09\x41\x21\x26\xc7\xd4\x2e\x0c\x78\x37\x2e\xfa\x9b\x79\x6f\xa0\x83\x86\xed\xb7\xc8\x13\x8e\x15\xb2\xbb\x3f\x2f\xc4\xa6\xd4\xca\x11\xfe\x77\x11\xa8\x24\xff\xab\x23\x21\x67\xeb\xbb\x01\x80\xc9\x6f\x5a\xbd\x90\x3d\xbd\x60\xfe\xf8\x39\xb2\xc3\xe8\x65\x1c\x2c\xfa\xfc\xd7\x6a\x27\xe2\xf8\xb1\xda\x1c\xe1\xd6\x4c\x0d\xd3\x53\x7c\x75\x28\xb1\x68\x1b\x35\xe4\xbb\x06\xe8\x87\x0f\x50\xde\x1a\x74\x8c\xc3\xcd\x3a\x1d\xc2\x11\x12\x37\x72\xd6\x50\x21\x1f\x35\x84\x17\xb4\x6b\xe4\xe1\x7c\x1b\xb2\x49\x28\xe4\x70\x84\x7b\x63\x07\xd5\x57\xb1\xb0\x01\xa7\x5b\x55\xcb\xe3\xad\xd3\xb5\xc8\xf7\x45\x77\x03\xd4\x9d\x73\xfe\xa3\xad\x03\x4f\x4d\x88\xd1\x00\xa8\x47\x80\xdf\x27\xc4\xbf\x60\x00\xbe\x23\x0f\xaa\x4c\x3c\x89\xe1\xf8\xbc\x12\xe2\x00\xb2\x86\x39\xf6\x18\xf2\x2f\x43\xbb\x31\xcb\x86\x79\x85\x5a\x53\x75\x48\x2c\xfc\x8f\x8f\x8f\x83\x64\x9e\x7e\x3c\x1a\x1c\x78\xc9\x05\x58\x4d\x6f\x65\x71\xe0\x29\x76\x2f\x65\x21\x84\xe4\x76\xf0\xa1\x63\x1d\x23\xff\x64\x69\xef\xac\x8b\x29\x00\x22\x32\xfe\xb7\xbf\x25\xc4\xec\xfd\x78\x1a\xb3\x0c\xc7\x53\xc4\x65\x5e\x8c\x2e\xe4\x9f\xff\x0c\x74\xfb\x3f\xfc\x00\x2a\xe5\xf0\xea\x93\x1c\xfd\xe9\x66\x32\x9a\x4e\x47\x17\xf2\x7a\x22\xc7\x1f\x6e\x2e\xc7\xa3\x8b\xa4\x9e\x54\x21\xc6\x57\xe7\x97\xb7\x17\xe3\xab\x77\x85\x7c\x73\x3b\x93\x57\xd7\x33\x79\x39\xfe\x30\x9e\x8d\x2e\xe4\xec\xba\x40\x98\x76\xe7\x35\xc8\xe4\xca\x6b\x3f\xf9\x2f\x8a\xa4\xf6\x93\xec\xab\xfd\x24\x7d\x87\x2f\xc6\xd3\xf3\xcb\xe1\xf8\xc3\xe8\x62\x20\xc7\x57\xf2\xea\x1a\x1d\x8b\x72\xfa\x7e\x78\x79\x09\x1f\xa4\x69\x17\xc3\xdb\xd9\xfb\xeb\x09\x94\x08\xf0\x3f\xbe\x99\x5c\xff\x61\x74\x3e\x8b\x00\x62\xff\xbb\x37\x23\x00\x2b\x5d\x8e\xf0\xa3\x57\x9f\xe4\xc5\x78\x32\x3a\x9f\x15\x72\x7c\x15\xff\x76\x3e\xbe\x18\x5d\xcd\x86\x97\x85\x98\xde\x8c\xce\xc7\xc3\xcb\x42\x8e\xfe\x34\xfa\x70\x73\x39\x9c\x7c\x2a\xa8\x04\xc1\x74\xf4\xdf\x6e\x47\x57\x00\x48\xbf\x18\x7e\x18\xbe\x1b\x4d\xe5\xe1\xd3\xb3\x23\x6e\x26\xd7\xe7\xb7\x13\xcc\xdd\xbe\x7e\x2b\xa7\xb7\x6f\xa6\xb3\xf1\xec\x76\x36\x92\xef\xae\xaf\x2f\xa0\xe3\x8c\x6b\x7c\x2d\x2f\xaf\xa7\x53\x22\x30\x28\xe4\xc5\x70\x36\x84\x0f\xdf\x4c\xae\xdf\x8e\x67\xd3\xd7\xe2\x7a\x22\xdf\xdc\x4e\xc7\x30\x7f\xe3\xab\xd9\x68\x32\xb9\xbd\xf1\xc6\xc0\x91\x7c\x7f\xfd\x71\xf4\xeb\x68\x22\xcf\x87\xb7\x7e\x21\xfd\xd2\x5e\x5f\xc1\x50\x67\xef\x47\xd7\x93\x4f\xbe\xd1\x00\xd8\x2a\xe4\xc7\xf7\xa3\xd9\xfb\xd1\x44\x8c\xaf\x70\xa6\x86\x7e\x0a\xa6\xb3\xc9\xf8\x7c\x96\x3e\xe6\x27\xf5\x7a\x32\x4b\xc6\x28\xaf\x46\xef\x2e\xc7\xef\x46\x57\xe7\x23\xff\xdb\x6b\xdf\xca\xc7\xf1\x74\x74\x24\x86\x93\xf1\xd4\x3f\x30\xc6\xcf\x7e\x1c\x7e\x92\xd7\xb7\x33\x36\x98\x6f\xa7\x23\xfc\x6b\xb2\x2d\x0b\x58\x54\x39\x7e\x2b\x87\x17\xbf\x8e\x61\xff\xc1\xc3\xe2\xe6\x7a\x3a\xe5\xf4\x0b\x98\xb2\xf3\xf7\x34\xdd\xbf\x57\x5c\xf8\xdf\xf8\xcf\xe0\xc7\xeb\xcb\x8b\xe1\xcd\xf1\xd9\xe0\xd9\x3f\xcc\x02\xf8\x9a\xfe\xff\xec\x59\x5b\xff\x3f\xfb\xe9\xa7\xd3\xdf\xf5\xff\x7f\xc6\x1f\xaf\xc7\x5d\x6f\x74\xe5\x37\x81\xbc\x41\x96\x02\xae\xdd\x12\x4c\xe6\xb3\xc1\xb3\x42\x9e\xfd\x2c\xff\xb0\x2d\x77\x60\x23\xec\x55\xfc\xd9\x2f\xe6\x52\x0c\x7c\x42\x24\x9d\xeb\x19\x87\x07\xec\x22\x3a\x38\xa2\xaa\x4e\xfb\x0c\x03\xf9\x5b\x0c\x03\xf1\x5b\x0d\x83\x9e\x22\xb6\x8e\x92\x85\x20\x6b\xe1\xb7\xe8\xf9\x89\x0f\xbb\xaf\x79\x91\x34\x5f\xc8\xdf\x64\x7d\x90\x3e\x26\xfe\x3e\x4a\xbe\x94\xf2\x59\x77\x8c\x58\x0c\x1d\xb3\xeb\xa4\x92\x0f\xba\x9e\xab\x06\x70\xc3\xcc\x2c\x60\x22\x1d\x2d\xaa\xda\xd1\x54\xe0\x8d\xf6\xf7\xb0\x15\x3a\x59\x9c\x7b\x15\x6c\xf2\x81\x85\x5d\xfe\xd6\x6e\xab\xa5\xa2\x51\xbe\x78\xd2\x14\x98\x3e\x61\x0a\xc4\xc1\x04\x53\x20\xfe\xa8\xcf\x16\x70\xdf\xdd\x55\x91\x75\xf5\xe5\x40\x5e\x6c\x35\xb1\xef\x27\x25\xc8\xd0\x93\x4a\x6a\x75\x3c\xcb\x3d\xaa\xb1\xdd\xe8\xaa\x5c\xaa\x0d\xe9\xc6\x50\x80\x75\xd6\x3f\x35\x30\xe2\x5a\x3f\x18\xae\x9d\x15\x18\x16\x61\x72\x80\x98\xcf\xc2\xff\x07\x72\xa4\x16\xf7\x02\x9e\xa5\x74\x30\xbf\x65\x4c\x75\xb7\x05\xf2\x6e\x84\xc0\xb2\x6f\x96\x9d\xce\x5c\x5e\xab\x4d\x09\x85\x3e\x5d\x11\xaa\xf3\x66\xdf\x0e\xdf\x60\x7e\xab\x24\x36\xc6\x95\x7c\xa3\x1b\x9b\x9f\xe6\xa8\x71\x19\xca\x85\xee\x57\xd4\xdf\x80\xee\x26\xaf\x6f\x46\x57\x38\x21\xd7\xb7\x57\x17\x00\xd9\xe0\x2a\x78\x51\xc3\xf5\x4a\xbd\xf8\x2e\xa5\x5e\x7e\x45\x6d\xfd\x2e\xa5\x5e\x7e\x4d\xa9\x17\xdf\xa6\xd4\xf7\x8d\xd5\x77\x7f\x36\xcd\x86\x2b\xbe\x53\xa1\x97\xdf\xa2\xd0\x8b\x6f\x54\xe8\xe5\xd7\x15\x7a\xf1\xad\x0a\xbd\xfc\xaa\x42\x2f\xbe\x4f\xa1\x97\x4f\x2b\xf4\xe2\x3b\x14\x7a\xf9\xa4\x42\x2f\xbe\x47\xa1\x97\x4f\x29\xf4\x22\x9c\x78\xa8\xdf\x14\x50\x4b\x4f\xcb\xca\xe8\x2b\x3c\xfd\xe5\x97\x5f\x8e\xbd\x22\xb0\x4f\x7c\x14\xfe\xe2\x78\xb4\x76\x29\xcf\x21\x35\xe8\x5c\x95\x66\x65\xeb\xca\xa8\x42\xde\x4e\x87\x03\x70\x27\x4e\xd0\x9d\x38\x61\x77\xa2\xbc\xc9\x6a\x5f\xc3\x95\x92\x87\xef\x96\xd9\x85\x83\x81\x3c\x91\x5d\x39\x10\x8e\x41\x00\xce\xef\x76\xcb\x37\xfc\x19\xfc\xe8\xa7\xb9\xd4\xab\xe6\xb8\xd2\x5f\x9a\xe3\x13\xe0\x4e\xfa\xfb\x5a\x02\x4f\xeb\xff\x67\x67\x3f\x9d\x3d\x6b\xe9\xff\x2f\x4e\x7e\xd7\xff\xff\x39\x7f\xb2\xd5\x97\xb0\xfa\xf2\xf0\x20\xad\x1f\x79\x70\xe4\xb5\x7d\x74\xab\x2e\x55\xa3\x5f\xc9\xb3\x93\xd3\x97\xc7\x27\xcf\x8f\xcf\x7e\x01\x2d\xf1\x74\x10\x4a\x4d\xbe\x03\x32\xd2\xd7\xf2\xca\xc6\x7a\xf7\xd1\x9c\x90\xb2\x9d\xb0\x96\x5f\xf3\x21\x0c\x3e\x26\x92\xe8\x4f\x76\xfb\x4a\x08\x75\x24\x87\x6d\x2a\xe8\xc0\xfc\x5c\x78\xf5\x69\xa3\x9b\xad\x2a\x0b\x59\xdb\x9d\x2a\x9b\xdd\xf1\xaa\xd6\xba\x90\xa6\xae\xf5\x83\x6d\x69\xdc\x22\x94\xe8\x49\x53\x92\x0b\x79\x11\x64\x4c\x21\x37\xb5\xde\xa0\xdb\x31\x94\x4f\x06\x30\x99\xb4\xab\x82\x98\xdc\xca\x5d\xc0\xca\x85\x4a\x25\x0b\x8c\x4e\x6f\x4a\xb5\x93\x1f\x76\x50\x71\x79\x20\xc4\xfc\xef\xd0\x7b\xc4\x63\x73\xd7\x49\xf5\xb9\x64\x7e\x95\x1b\xe2\x03\x25\xfe\x92\x02\x73\xf3\xd6\x6a\x89\x75\x88\x0a\xe9\x74\x59\x16\x94\xd4\xb9\xb2\xb5\x74\xaa\xa4\xa8\xad\x59\x6f\x6c\xdd\xc8\x73\xfb\x00\xe9\x63\x50\x24\x9a\x6b\xa2\xf0\x9a\x06\x60\x39\x65\x52\x54\x21\xab\xd8\x54\x7e\x9c\xe8\xe6\x0e\x57\x88\x2b\x38\x27\x55\xe2\x3f\x05\x94\xcc\xbe\xb3\x94\x63\x7c\x36\x88\x73\x0d\x0c\xfc\xef\x88\x22\xef\x3c\x9a\x6d\xa1\xa0\x73\x5c\x95\xbc\x8f\x6d\x12\x35\xff\xfc\xa1\x39\x92\x58\xcb\x57\xd6\x7a\x61\x36\x06\xac\xaa\x7b\xfb\x28\x81\x60\x7d\xa1\x2a\xaa\xe5\x9a\xf1\xa0\xc5\x81\xbe\x86\x84\x3b\xe9\x54\x63\x1c\x71\x3e\x64\x26\x5b\x4a\xde\xe4\xa8\x24\x80\x7c\xc6\x8c\x39\xf2\xe5\xeb\x24\x7d\x6e\xc3\x20\x0e\x55\x96\xf2\x12\xc0\xd8\x58\x3f\xd1\xb1\xed\x84\x15\x83\x69\x9b\xc8\x43\x3a\x0f\xfa\x4b\x83\x10\x2a\xbd\x63\xc0\x29\xe4\xc4\x54\xba\x6a\x8e\x06\xf2\x20\x6b\xea\x80\x78\x47\xe3\xde\x0e\xe6\x23\xef\x94\xce\x0f\x1a\xfd\x85\x0a\x46\x31\xfb\x22\xe3\x39\xd1\xbc\xc4\xe0\x81\x76\x02\x33\x09\x30\x58\x00\xab\xc7\x39\x26\xd1\x49\x6e\xa8\xb0\x7c\x5c\x7a\x00\x63\x86\x73\x5f\xea\x3b\x5d\x2d\x5d\x30\x25\xcf\x73\xde\x8c\x8b\xb4\x6a\xf9\x05\x99\x5e\xb0\xba\xaf\xe5\xf5\xb6\x99\x7b\x5d\x42\xbe\xbb\xb9\x94\xe7\x94\xa6\x81\x75\xd3\xc5\x18\xcb\x6e\x5f\xa4\xdc\x3e\xe9\xeb\x54\xdc\xdc\x1b\x98\x61\xd4\x91\xb2\x2d\x7d\x52\x24\x10\xa8\x6e\xdd\x5c\x8a\x54\x7a\x53\x14\xe6\x9f\xe9\x9d\x38\x3b\x1c\x1b\x27\x68\x3b\x16\x61\xa4\x6a\x08\x89\xb1\xa8\x1e\x2c\xed\x52\xdc\x25\x98\x35\x8e\x74\xb1\x2e\x42\x71\x2e\xf2\xec\x03\xe1\x4f\x65\x0a\xe5\x49\x7b\x1d\xd9\x80\xd2\x9f\xc6\xa8\x09\x9b\xf8\xb2\xa7\x9c\xf2\xbb\x9b\xcb\x58\xfb\xdd\x54\xae\xd1\x6a\x29\xd2\x59\xca\x9a\xcc\xde\xc3\x65\x7c\x9e\x2c\xa3\x1c\x52\x86\xc3\x5b\xa2\x85\x9c\x10\x9f\xb9\xef\xf9\x6b\x39\xae\x70\x09\x59\x8e\xb4\x96\x11\xf8\xd4\xb2\x3d\xa0\xb2\x33\x1e\xfb\x09\x5b\x71\x0d\x35\x05\x98\x80\xb2\x4e\xbe\x24\x28\xa7\x98\xa9\xe1\xfd\x9c\x45\x01\xe5\x7f\x93\x36\x1b\xd0\xd9\xdd\x05\x27\xf2\xda\xb8\x8e\xc6\x31\xcb\x1e\xb8\x28\xd6\xba\xd6\x00\xe7\x42\x34\x1d\x2c\x65\xda\x11\x4e\x0d\x86\x0c\x25\xa8\x33\xdf\x86\x7f\xa7\x69\xe4\x75\x86\xe6\xd7\x5f\x9a\xda\x54\xce\x2c\x88\x14\x33\x8a\xdf\x43\xe4\x03\x72\x20\xb5\xb6\x75\x43\x35\x51\x11\x4d\x1d\x31\xa7\x04\x9d\x4c\xf2\x7d\x8e\x52\x92\x84\x1e\x81\x9a\x4f\x77\xab\x44\x5f\xd8\x44\x0c\x6d\x02\x82\xd2\xe4\x40\x61\xe2\x31\x60\xfb\xae\xa7\xe3\xe3\xe1\xc6\x0b\x64\xaa\xdb\xf5\x76\xfa\xf6\x18\x40\x61\xca\xa5\x49\xde\xac\x40\x88\xce\x7d\x9f\x0b\xf3\xf6\xac\x61\xbd\x7f\x58\x77\xfe\xfe\x23\xf8\x3e\x2a\xdb\x08\xc6\x8e\x32\xd1\xd5\x2e\xe3\x1b\x6f\xa8\xf8\x0a\xbd\x1e\xc4\x76\xab\x07\xb8\xb7\x5f\x3c\x2d\xa2\x12\x1a\xca\xde\x0b\x4a\x55\x1d\xae\x4f\x44\x6f\xe6\xbb\x3a\x1f\xeb\xce\x6e\x05\xd3\x76\x76\xd9\x2e\x69\x51\x6f\x27\x97\x41\x80\x44\x96\xa3\x73\x5b\x63\xd2\x27\x00\x12\x89\x75\x94\x71\xbd\x09\x67\x19\x16\x46\x63\x12\xd8\xf9\x4e\x3a\xbb\xd6\x08\x73\x52\x35\xc0\xf2\x31\x65\x5a\xd5\x44\xfc\x4a\x69\xd6\x94\x76\xcf\xf8\xf9\xde\x22\xb7\x28\x8b\x76\xb9\x38\x6e\x8f\x02\x6e\xdc\x50\xeb\x81\xa3\xbc\x90\xd4\x56\xdd\x61\x25\x30\x24\x73\x16\x48\x88\x2b\x0f\x0f\xc8\x25\x77\x70\x54\xec\x1d\x2a\x4a\xf8\x79\x32\xd4\x4c\xc8\x0a\x3f\x69\x90\x29\xfc\x68\xe5\x4e\xab\x3a\xa2\xd7\x02\x93\x30\x9c\xd1\xb5\x05\x2f\xed\xc2\x1f\xa2\x8b\x9e\x24\xb0\xb4\x0c\x17\xc9\x13\xea\x5d\x92\x6e\x42\xbc\xf5\x37\x1c\xc1\x86\x38\x78\x24\x21\x43\x86\x8d\x84\x9e\x95\x6b\x88\xf4\x0e\xec\x30\x5f\x41\x9c\x3f\x5e\xa3\x16\x67\x20\x92\xe5\x1c\x15\xb0\x21\x2b\xad\x31\xb3\x5a\x95\xae\xcb\x35\x87\x25\x35\x02\x89\x7b\x74\xd5\xe3\xa1\x18\x08\x31\x52\x8b\x7b\xe6\x7a\x60\xfe\x65\xf8\x47\xd0\xa7\x42\xb1\xde\x54\x72\xc0\xbc\xfa\xef\x63\xcd\x53\x66\x4a\x14\x20\x8b\x8e\x31\xf7\x70\xae\x2b\xbd\x32\x0b\xe3\x37\x59\xeb\xf0\x49\x67\x4b\x20\x2e\x74\x41\xf6\x51\x97\xe4\x0b\xaa\xcf\xd3\xa4\x1c\xc8\xcc\xbe\x6f\x1a\xcc\x21\x22\x05\xe3\xe5\x40\x4e\x77\xeb\xb5\xf6\xe2\x58\x95\xd4\xb8\x9f\xd5\x78\x5f\xf9\xed\x70\xbb\x71\x4d\xad\xd5\x3a\xa7\xb5\xee\xd7\x2a\x60\xdf\x37\x56\x7e\x88\xe5\xeb\x01\x7f\x8b\xd9\x87\xa0\xcd\x03\x5d\x74\x1b\xb4\x2f\x3a\xc7\x5e\x1e\x2a\x79\x70\xa3\x9a\xc5\xbd\xdf\xd2\xc4\x3a\x16\xd8\xb1\x83\x26\xc1\x30\x7f\x26\x01\x6d\xee\xb5\x80\xb7\x50\x80\xa7\x17\x35\xfc\xb8\x57\x6b\xc9\x55\x49\xde\xe6\x51\x49\xe4\x4d\xec\x1b\x40\xd5\x25\xb9\xf2\x82\xb2\x5f\xe9\x3b\xe6\xb4\x46\xd9\xd9\x2e\x0d\x67\x9c\x08\x9f\x34\xab\x54\x55\x0e\x70\x4d\xff\x01\x58\x9b\x9f\x06\xf2\x6a\x5b\x96\x31\xab\xc1\xae\xe4\x39\x19\x9e\x3f\xde\xd4\x76\x53\x1b\x0d\x95\xa6\x2e\xb6\xe9\xd2\xc1\xaa\x8c\x23\x1b\x4d\x30\xdd\x20\x95\x49\x02\xcf\x75\x6b\x9e\x13\x26\x98\x34\x27\x5a\x89\xf6\xcd\x95\x5d\x5a\xb6\xfe\xda\x9d\xd5\xde\xb4\xc0\x0b\x41\xce\x6c\xf4\x4a\xb1\xff\x3e\x37\xa8\xa9\x8d\x00\x5c\xe1\x51\x1f\x5f\xf9\xdf\x92\x8f\x1e\x32\xf8\xaa\xd4\x47\x9d\x5a\xc0\x34\x26\x3e\x13\xa7\xa8\x96\x70\xaa\x5c\x8b\xd0\x30\x47\x7c\xf5\x98\x29\x2f\x70\x45\x7e\x1e\x84\xae\xc8\xe9\xb6\x72\xba\x41\x80\x7f\xb2\xca\x7b\xde\x4f\xbe\x8d\xfb\xd4\x42\x52\xaa\x59\x35\x5a\x57\x28\x69\x31\xc9\x4e\x97\x6a\xe3\x52\x6e\x18\x9e\xc7\x0f\x3b\x92\x45\x6d\x71\xcb\xd6\x50\x42\xcb\x92\x5d\xd0\xbf\x0c\xe4\x8d\x72\xee\x78\x86\x7d\x21\x1d\xb2\x73\x6c\xf3\xfb\x16\x57\x92\xe5\x57\x9e\x19\xe9\xc5\xbe\x79\xd0\x2e\xdd\x1f\x36\x74\x03\x3a\xfe\x41\x17\xed\x39\xee\x75\x5a\x60\x0f\x4f\x4f\x06\x72\x16\x73\x09\xe1\x67\x70\xfc\xb8\x79\xaa\xd6\xd2\x5e\x52\x88\x94\xf6\x27\x6d\x2e\xfd\xe9\xfa\x64\xb7\xe0\x07\x59\x29\x53\xf6\xf1\x88\x76\x0f\x67\x94\x07\x84\xcc\xf6\xd3\xb4\xd8\xd6\xa8\xb7\x8a\xca\x56\x2d\x35\x0b\x49\x47\xbd\xac\x8e\xa9\xa0\x58\x7e\x07\x74\x73\x4c\x7f\x5d\x49\xd3\x14\xd2\xd6\xe0\xd6\x30\xc0\x56\x08\x53\x8e\x0e\x8a\x3c\x25\xbb\x34\x0d\x97\x8e\x46\x6a\xa1\x43\xf0\x80\xc0\x4d\xb7\xd4\x8b\xd2\x5b\x3e\xb6\xde\x89\xbf\x6c\x09\x85\xa5\xb8\xcc\x1e\x65\x17\x60\x82\x30\x25\x5f\xd5\xd6\xb9\x63\xfc\xc9\x91\xb7\xaa\xf5\x5d\xe0\x99\xf0\x9a\x93\xbf\x65\x44\xb2\x85\xbe\xc2\xf6\xe6\xe8\xa5\x06\x83\x94\xb3\x3c\xfd\xb3\x6f\xc5\x40\x9c\x2e\xe1\x8a\x42\xc2\x15\x4e\x23\xc9\xfc\x12\x70\x0d\x67\xe9\x0a\xe8\x72\xc8\x76\x45\x14\xb2\x69\x66\xae\xce\xb8\xda\xac\xd3\xe2\xf1\x9e\xea\xb6\xd0\x36\x5d\x86\xaf\x86\x6c\xe5\x70\xf5\x66\x5b\x34\xdb\x95\xb3\xec\x3a\xd8\x64\x1e\x76\x48\x78\x8a\x43\x69\x5b\x04\x2e\x49\x84\x42\xe3\x07\x12\xef\xa9\x26\x07\x6c\x05\xcc\x81\x8f\x8d\x9a\x6c\x60\xf3\x92\xcf\xc5\xe9\x40\x5e\x42\x86\x24\x5f\xfa\xbf\x72\xc5\x57\x10\x3b\xbd\x62\x91\x42\x90\x28\x84\xdb\x09\x2e\x99\x98\xfd\xff\xd8\x7b\xb7\xe5\xb6\x91\x74\x5d\x70\xae\xf3\x29\x72\x14\x31\x61\x29\x06\x86\x2d\xd9\x55\xd5\x5d\x5e\xb1\x22\x68\x89\xb6\xb9\x5a\x22\xd5\xa4\x54\x5e\x5e\x3b\x76\xac\x49\x12\x49\x09\x6d\x10\x60\x21\x01\xa9\xb8\xae\xe6\x1d\xf6\x0b\xf4\xe5\xf2\x9e\x27\x98\xd8\x77\xad\x98\x17\x99\x27\x99\xc8\xff\x90\x07\x00\x94\x55\xee\xc3\xcc\x44\x54\x5d\x74\x5b\x12\x09\xe4\xe1\xcf\x3f\xff\xe3\xf7\x25\x04\x67\xab\x1a\x76\x54\x82\x0c\xa4\x1d\x6a\x9c\x7d\x94\x87\x07\x38\x18\x1e\xc4\xc1\x51\x2a\xaf\xf1\x98\x4c\xdc\xb5\x5c\xec\x04\xe2\x22\xe2\x25\xb8\x65\xe9\x88\x9c\x82\x68\xf7\x39\x30\x17\x3d\x1b\xae\x6e\xf1\x58\x30\x8b\x5b\x62\xca\x5d\xfc\x55\x5a\xba\x93\x54\x4e\x2b\xf9\x91\x5a\xda\x85\x8b\x19\xe5\x41\x0e\xff\x40\x99\xe7\xb9\x39\xf0\xd5\xa6\xdc\x01\x8f\x89\xd6\xa5\x76\x40\x26\x06\x72\x3c\x50\xdf\x28\xf2\x26\x95\x03\xe2\xd1\x34\x43\x28\x96\xd4\x44\xe4\x26\x81\xc4\x1d\x34\x18\x81\x47\x9b\x38\x33\xf2\x0d\x22\x9b\xd0\x20\xb8\xdf\x2a\x6f\x00\x42\x59\xd7\xab\x5b\x55\x32\xf0\x4c\x22\xd7\x79\x03\xa8\x4b\x78\xa9\x7b\x50\x12\xc1\x44\x82\x68\x2e\x95\xcf\x43\xed\x42\x6b\xf3\x2a\x95\xe7\x11\x3d\xc1\x39\x23\x08\x0c\x0a\xfe\xbe\x99\xe5\x25\xd8\x63\x77\xe8\x48\x17\x05\xec\x45\x30\xd3\x50\xb3\xf8\x86\xea\xa6\x82\xc5\x75\x20\x69\xd0\xfb\x6b\xa2\x0e\x3c\x46\x69\x46\x05\x94\x38\x55\x94\x08\x30\x28\x55\x61\x7f\xb5\x02\xec\x4b\xfb\xef\x1e\xca\x17\x3d\xd3\x3f\x88\xe1\x31\x50\x64\x80\x16\x5f\x81\x01\x51\xd5\x4d\x88\x61\x53\xea\x1b\x68\x7f\x59\xe9\x23\x78\x2c\xd8\x42\xf7\xb9\xbd\x0f\xec\x34\x09\x4b\x1b\x22\x3e\xc1\x86\x7e\x2e\xf5\xbd\x00\x5c\x0a\xf0\xaf\x41\xf9\x7c\x2e\xab\xfb\x52\xaa\x25\x43\x82\x23\xd2\x92\x03\x0d\x02\x05\x40\xc3\xa4\x4d\x79\x9d\xca\x85\x9d\xbe\xdf\x89\x5b\x1d\xb5\x34\xd6\xb2\x2d\xc9\x8a\x0f\xe0\x87\x40\x23\xc7\x8d\x8e\x03\x51\x68\xa1\xa0\x63\x12\x86\x12\x3e\xb1\xff\x3c\xbc\xf8\x37\x2a\x2f\x1d\x43\x77\xa0\x18\x01\x35\x43\xf8\xf7\xe5\x0c\x19\x05\x50\x26\x1b\xdf\x75\xc4\xec\x0f\x24\x47\x5e\x23\x7a\xb8\x70\x1c\x08\x04\xd4\xdd\x30\x9c\xe6\xfb\x2e\x95\x67\x7a\x0d\x77\x25\xa8\xbb\x83\x41\x5d\x77\x10\x90\xe1\x6e\x49\xfd\x51\x87\x57\x4e\x4e\x24\x56\x5a\xfb\x7a\xa5\x5a\x6f\x2b\x93\xc3\x15\xaa\x1a\xf9\x4f\xb7\x4d\xb3\x35\x3f\xbe\x78\x71\x93\x37\xb7\xed\x32\x5d\x55\x9b\x38\xb3\x17\xff\x94\xde\xe4\xcd\x8b\x7f\xee\x1b\xbb\x62\xc8\xd8\x4d\x61\xd4\x7d\x4f\xf5\x60\xe8\xd2\x18\x88\x82\xe0\xd4\x0e\x91\xda\x51\xf4\x58\xb9\x07\x7c\x4a\x8a\xc5\x03\xf1\xfa\xaa\xce\xb7\x08\xf7\xd4\x61\x7e\x36\xd8\x30\x2b\x30\xe8\x1f\x10\x0a\x20\x8c\x96\x32\x95\xbd\x81\x76\xc1\x96\xa1\x8a\x31\x9f\x73\xa8\xe0\x71\x1c\xff\x76\x2b\x11\xeb\xae\xd1\x02\x04\x3a\x9a\x82\xc7\x36\xf4\x03\x77\x9a\x17\x0f\xe2\x61\x7e\x14\x86\xff\x15\x94\x6e\x89\x55\xa1\x55\x6d\xad\x0e\xc0\xb6\x25\x5c\xb0\xa2\x90\x0b\x0e\xfb\xa2\xfa\x3f\x8c\xc0\x9b\xac\xc6\xf3\x6c\xf7\x21\x84\x04\x16\xc8\xd9\x85\xa1\x82\x7e\xe8\x9f\x8e\x3c\x53\x88\x53\xe6\xa5\x5c\xb6\x79\x91\x71\x53\xf7\x61\xe4\x9e\x1d\xc1\x42\x22\xd9\xad\xe8\xf9\xf2\x87\x88\x3a\xa6\x36\x5b\x08\x1d\x05\x6c\x6a\xdb\xc0\x4d\x43\xa6\x6b\x5d\x7b\x4a\x61\x20\xa0\x8c\x6f\xd9\xa3\xf4\xf1\xb8\xcd\x46\xad\x6e\xf3\x52\x3f\xaf\xb5\xca\xfc\x79\x39\x08\x87\xc3\xa7\x82\x75\x2f\x6c\x5f\x27\x16\x7e\x10\xfe\x7c\xe0\x18\x90\xc1\x77\xb7\xe2\x89\x9d\xb6\xb7\xf9\x96\x83\x8b\x60\xed\xd8\x4d\x65\x1c\x20\xcd\x5c\xce\x26\x11\x01\x9b\x41\x82\xb5\x11\x9d\x24\x20\xe4\x00\x91\x64\x05\xdb\x99\x1c\x9b\x17\x11\x15\x32\xee\x7c\x51\x88\x80\x3c\x8e\x66\x40\x06\x13\x8f\x84\xaa\x29\x62\xfb\x89\xb1\x7e\xb1\x34\x2b\x00\xab\xa8\x21\x9f\x13\xa7\x4a\x10\x76\xf2\xc2\x0a\xc2\xe8\xe6\xa6\xd6\x68\x70\xf3\xf1\x01\xab\xad\xc7\x6b\x77\xb1\x13\x78\xc6\xbc\xc0\xe6\xfe\x7e\xb3\x2e\x86\x21\x3e\x52\xb2\x83\x30\x8e\x4a\x84\x5e\x7a\xc5\xb7\xad\xbb\x52\x04\x87\x4a\x40\x61\x61\x94\x1c\xc9\x62\xa0\x85\x53\x13\xbe\xa2\xcf\x89\x1e\x78\x53\xc8\x29\xbe\x10\xa0\xdd\x53\xfd\x4a\xc7\x88\x46\xe5\x20\x3e\xd8\x57\x41\x20\xb3\x2a\xb5\xd0\x85\x83\x12\x79\xda\xca\xa2\xa4\x05\x37\x9f\x13\x34\x2a\x58\x2d\x77\x55\x69\x3d\x58\x83\x20\xe2\x7e\xb8\xa6\xa3\xef\xe8\x51\x1c\x3d\x70\x29\xb9\x42\x19\x83\xe7\x46\x19\xf9\x6c\x5d\x6b\xfd\x8c\x43\x00\x51\xbb\x74\x5c\x60\x73\xf0\xfe\xf2\xdc\x8b\x70\xa7\x9d\xf9\xfd\xf4\xda\xe5\x4a\xe3\x42\x5d\x49\x80\x88\xf6\x13\xa3\xf5\x5a\xd7\x95\x18\xfe\xa0\x7d\xc5\xe4\xe0\xc5\xc1\x85\xb6\xff\xb3\x3b\xc0\xfd\x71\x74\x48\xfb\x09\xd7\x09\x54\x0e\x61\x37\xd8\xe6\x1b\xc8\xa0\xc8\x83\x4f\x55\x7b\xf0\xc2\xfe\x6f\xfd\xf4\xa7\x0b\x4a\xdd\x78\x6e\x52\x4a\x2d\x77\xa2\x01\xfe\x35\xa3\x78\x74\x2e\xf7\x65\x4d\x54\x11\x0e\x19\x2c\xa4\xaa\x30\x70\x98\xe9\x87\x02\x8c\xc0\x84\xa2\xb2\x6c\x49\x6d\x36\x40\xbd\x05\x9f\xf0\x79\x07\x11\xbe\x27\xb5\xda\x09\x3e\xc0\x9b\x74\xa8\x8e\xc8\x28\xba\xc7\x6b\x84\x02\xa6\xd8\x63\x14\xa1\x49\x8b\x2e\x81\x3d\x1a\x74\xcb\x9d\xb3\xe2\x3a\x76\x5a\x55\xcb\xc3\xe5\x11\xa2\xd3\x83\xfe\xaa\xd6\xd8\xd9\x6c\x2f\x0a\xb1\xce\xd7\x0d\xd4\x20\xac\x82\xb0\x6c\xd5\x36\x8c\xb7\x25\xcd\xad\xaa\x51\x27\xb9\xd8\x6b\x11\x3f\x0c\xb3\x98\x76\x54\xb4\x64\x56\x3c\xba\x55\x05\x4e\x1c\x8b\x82\xbd\x7c\xf4\xc2\xc9\x41\x86\xb3\x18\x56\x2e\xd8\x19\x5d\xe8\x44\x94\xd5\xbd\xf4\x2d\x62\x88\xe3\x91\xf8\xfb\x99\x2f\xe5\x3c\xf0\xca\xc1\x36\xdf\xa8\xcf\x21\xa2\x66\x55\x0b\xa3\x91\x99\xdd\xe9\x50\x30\xb4\xd8\xe1\xa0\xd1\xe0\x85\xc8\x25\xb1\xfe\x89\x80\xc0\x40\xd9\x33\xb2\xac\x57\x90\x81\xe2\x54\x62\x84\xb6\xe2\x35\xb5\x5d\x8b\xae\x5a\x75\x6b\x51\x4a\xe5\x7f\x3b\x60\x04\x51\xde\x86\xef\x79\xe1\x1e\xb8\x8b\x6e\xa9\x86\x90\x90\x09\x69\x72\xe0\xca\x9a\xc8\x20\x2e\xe5\x63\x81\xfd\xd0\xd8\x41\x60\xb1\x1c\x04\x64\xf4\x3e\x0b\xe5\x35\x34\xf9\xe8\x81\x39\x63\xc7\x16\x06\x44\xdd\x13\x5c\x56\xcf\xc8\x67\xb3\xad\x66\x72\x3b\xa7\xcb\x82\xdf\x11\x79\x05\xe1\x7f\x1d\x44\x36\x4e\xe7\x5a\x76\xb0\xc5\xfc\x19\xe4\x03\xc7\x8c\x83\xde\xea\x32\x73\x78\x68\x81\x3b\x18\xad\x30\x31\xde\x41\x96\x7d\x07\xa9\x00\x84\x99\xc4\x4b\xaa\xd1\x25\x97\x09\xeb\xf2\xd6\xda\x4e\x9b\x7e\xf2\x42\x38\x61\x7a\x01\x76\x45\xdd\x96\x50\xd6\x5c\xe4\xcb\x1a\x60\x0a\x5c\x8a\x8c\x7e\x03\xb4\xa3\x68\x73\x7a\xb6\x60\xa4\xf0\xcf\x8d\xab\x62\x67\x43\xf2\x69\xf9\x40\x58\x2a\xbf\x11\xb1\x1b\xc0\xf8\x07\x9d\x4d\x5c\xe3\x9d\x08\x69\xda\x90\x1c\x14\x29\x73\x7f\x65\xd5\x63\xfa\x62\x3a\x3f\xff\x3b\xf6\xfe\xff\x4f\x5f\xef\xff\xf9\xfe\xd5\xf1\x71\xb7\xff\xe7\xe4\xfb\xdf\xea\xff\xfe\x21\xff\x4d\xe7\xe7\xbe\x42\x63\x76\xf9\x09\xc9\x53\xa7\xb3\xab\xc9\xe9\x18\x9b\xfe\xe9\xd4\xf4\x9a\x4a\x82\xb6\xdf\x80\xd6\x2c\xee\xfe\x09\x7b\x47\x3c\xb1\xd9\xf5\x42\x4e\xd5\x9d\x2a\xa0\xf2\x57\xd5\xab\x5b\x79\xae\x96\x15\x86\x83\xe5\xe1\x74\x7e\x7e\x24\x11\x64\x95\xcc\x38\x97\x3e\xc9\x6b\x86\xf3\xcc\xef\xb4\x70\xfe\x9b\x49\x85\xb8\xec\x54\xcc\xf8\x06\x24\x2e\xe4\x0b\x53\x11\x53\xdd\xbc\x00\x20\x5c\xf9\x3a\x7d\xfd\xfc\x3c\x6f\xb4\x7c\xab\xeb\xcf\xba\xd0\x3b\x4f\x31\x72\x16\x35\xbe\x1c\xbe\x5d\x9c\x1d\xf1\xd3\xaf\xcb\x1c\xac\x33\x8c\x34\xf8\xe2\x66\xa9\x1a\xf7\x20\x02\xcb\x04\x7f\x8e\x07\x17\x4d\xcb\x4e\xca\x9a\xf8\x73\x7d\xc3\x64\xca\x8f\x3d\x7b\x4f\xcd\xb4\x7d\xc2\xf5\xa9\x7f\xab\x2f\xd2\x56\x41\xf1\x8d\x0a\xe1\x6a\x88\x88\x01\x0b\x67\xa2\xf1\x75\x16\x0f\xf0\xdd\x21\xdc\xad\x8c\x26\x5e\x74\x2b\x30\x7e\xe5\x39\x40\x8d\x25\x6d\x48\x22\x5e\xe7\x37\x79\xa9\x8a\x68\x54\xab\x68\x54\x9d\xf2\x34\xcf\x11\xc8\x7b\x2b\xd7\x79\xa1\x21\x85\x85\x94\xb0\x31\x82\xe2\xe0\x83\x4d\xf8\xe4\x9e\x40\x74\x5b\xd2\x62\x69\x06\x47\x3a\xa0\x72\x6c\x60\x96\xcb\x9d\xbc\x53\x75\x5e\xb5\x46\x6c\x75\xb5\x2d\xb4\x5d\x6c\xbb\x5c\xdd\xe9\x43\x60\x34\x94\x56\x34\x09\xeb\x80\x81\x02\x2a\xfa\xdc\x1b\x04\xbd\x81\x30\xe7\x34\x20\xb5\x02\xf2\x5a\xb0\xc5\x08\x73\x1e\x6d\x4f\x53\xd9\xaf\xa5\x72\x46\x20\x8a\xcd\xad\x16\xd7\x8b\x51\x02\x0f\xbb\x55\x41\x29\xa0\x04\xbe\x6f\x0f\x8f\x3a\xd0\x4a\x8f\x63\x40\x01\xc2\xa0\x9a\xce\x04\xac\x3b\xf3\x7d\x43\xb1\x24\xc7\x17\x7a\xe8\x14\x86\x7a\xd1\xaa\x60\x23\xd9\xb7\x77\x02\x41\x34\x42\x7c\x00\xed\xfd\x95\xc2\x68\x89\xc4\x4d\x08\xfb\x03\xe5\x58\x42\x50\x04\x40\x90\xfe\xb5\xd8\x22\x5f\x69\x21\xec\xa9\x86\x9e\x20\x00\xaf\x34\xac\x0d\x8c\xeb\x57\xc3\x8f\x60\x35\xb4\xdd\xc4\x20\x49\xb8\x47\x60\xa3\x93\xc0\x0b\x87\xcf\x07\x17\x75\xa0\xc1\xf0\x6f\x0b\x65\xf2\x35\x24\x93\x81\xee\xbf\xbf\x39\x92\xc9\x53\xfa\x19\xe3\x3d\x12\xdf\xda\xcf\xf8\x1a\x37\x46\x65\x77\xba\x6e\xd0\xd9\xf4\xdf\x26\x2a\x4d\xfb\xcb\xb5\x06\x4b\x12\x5c\xa7\xc1\x96\x56\x3b\x6b\xc1\x85\xde\xf1\xd8\x3b\xb0\x17\xc6\x71\x30\x53\x4d\xf5\xaf\x80\xb8\xd8\x77\x0d\x24\x22\xbc\x60\x08\x9d\xbd\x4b\xe4\xf4\xeb\xde\xe8\xd8\xe7\x7c\x1c\xf5\x4a\xaf\x6e\xcb\xaa\xa8\x6e\x76\xf2\x2c\xc7\x10\x79\x22\x1e\xbb\xb7\xb1\x95\x92\x11\x68\x9b\x0e\x3a\xb3\x3d\x4c\x65\xe5\x7f\xef\x68\x74\xc2\xa1\x33\x0c\x87\xb5\xa4\xc5\xd3\xfa\x41\x87\x50\x5b\xf8\xec\xb3\xe2\x12\x7b\x41\x64\x04\x34\xdc\xb9\x3e\xc0\xb0\x09\xd0\x0e\xb8\xd3\x17\x68\x7f\x35\xd8\x03\x08\xc0\x1e\xa2\xd3\x03\xf8\x6d\x1d\x80\xd0\xe5\xf5\x0f\xed\x00\xb4\xb3\xc2\xae\xbc\x27\x40\x77\x88\x6f\xef\xf4\x1b\x82\xee\x10\xdf\xd6\xe9\xb7\x07\xba\x43\x7c\x43\xa7\xdf\x5e\xe8\x0e\xf1\x2d\x9d\x7e\x8f\x43\x77\x88\x5f\xd1\xe9\xf7\x38\x74\x87\xf8\x35\x9d\x7e\xf6\x7a\xbf\xcb\xf5\xbd\x43\x8f\xa5\xba\xb5\xb8\x13\xe1\x6b\x17\xa3\xaa\x35\xd9\xb2\x8c\x76\x4b\x08\x96\xc8\x54\xc3\xe5\xb8\x1d\xac\x60\x04\x4b\x27\xc8\x58\x84\xcd\xc4\x40\x94\xd8\x56\x45\xbe\x82\xc8\x7b\xcc\x76\x80\xc5\x58\x94\x40\x76\x37\xf6\x63\x8a\x47\x80\xc3\xf0\x5b\xaf\xdf\x37\xfe\x97\xbe\x38\x3d\x7d\xfe\xf6\xd3\xf3\xc5\xe8\xf9\x71\xfa\xf2\xef\x13\x08\x78\xdc\xff\x7f\xf5\xf2\xf8\x87\xef\x7b\xf8\x7f\x27\xdf\xff\xe6\xff\xff\x23\xfe\x3b\xb5\x16\xaf\xf5\xb8\x4e\x21\x02\x6e\xe4\xc8\xf7\x03\x3d\x5f\xdc\xaa\x5a\x8f\x8a\xfc\xb3\x06\xd4\xcc\xd3\xf9\x78\x74\x35\xf9\x69\x2c\x4f\x67\x17\x17\xb3\xe9\x42\x9e\xce\xe6\x97\xb3\x39\xb6\x8c\x4f\x16\xc2\xaa\xf2\x11\x00\xa7\xbe\x9b\xcc\x2f\x40\xa9\x9e\xcd\xc6\x0b\x50\xf1\x74\x93\xca\xf3\xf1\xfb\xd1\xb9\xd3\xe0\x7d\xe2\x7d\xd0\x78\x67\xf3\xd1\xbb\x2b\x41\x2e\x82\x7f\x06\xbc\x7f\x2c\x47\x53\x39\xba\xba\x9a\xcd\xa7\xe3\x4f\xcf\x4f\xcf\x27\xf6\xa2\x00\xb2\xca\xc9\x6c\xba\xf8\x30\xb9\x4c\x7b\xe3\x14\xf4\xf2\x05\x3e\x7d\x32\x7d\x37\x9b\x5f\x50\xa3\xbb\xd5\xbe\xf2\x60\xb4\x78\x3e\x59\x1c\xc8\xb7\xa3\xc5\x64\xd1\xff\xbe\xbc\x18\xfd\x01\x86\x10\x5c\xc9\x62\x3e\x7e\x3f\x9a\x83\x8a\x47\xc6\x64\xff\x4c\x36\x1a\x12\x5c\x01\xba\x7e\x17\xfe\xa2\x80\x6b\x95\xef\xc3\xf9\x78\x71\x7d\x7e\x35\x99\xbe\x17\xef\xe6\xb3\x0b\x68\xbb\xbf\x5e\x58\xc5\xed\xda\x26\xed\xf3\x3f\xce\xe6\x7f\x90\x87\xa3\x85\x3c\x1b\xbf\x9b\x4c\xad\x41\x32\x3e\x9f\x7d\x3c\x8a\x6c\x94\xeb\xe9\x19\xf1\xe2\x5e\x8d\xe7\x17\x0b\xb7\x9a\xfd\xe5\xb8\x7e\x7b\x3e\x71\x3c\xda\xf2\xf0\xe0\xf4\xf4\xf2\xfc\xc0\xde\x5e\x07\xf4\xbb\x83\xa3\x54\xba\xd7\xe2\x3b\xae\xc6\xa7\x57\x68\x08\xf9\x30\xd1\x68\x7a\xf6\x62\x36\x17\x70\xab\xc9\xd1\xe5\xe5\xf9\xe4\x14\xcc\x86\xf3\xd1\xc7\x14\x6e\x35\x77\x8d\xd1\xa3\xf0\x93\x57\x1f\xec\x16\x2e\x24\xc2\x88\x4d\xfe\x2d\x18\xfb\x64\xe1\xb6\x1d\x5f\xfb\x61\xf2\xd6\x9a\x06\xa9\x10\x6f\xad\x6d\x35\x9e\x9f\xe2\xb5\x69\x9f\x0e\x83\x58\xc8\xab\x99\x7f\x81\x5b\x8c\x0f\x63\x7b\x61\x7e\x9a\x5d\xcb\xd1\xe9\xe9\xf8\xf2\x0a\x31\x1a\xde\xcf\xc7\x63\x79\x35\x13\x6f\xc7\xf2\xed\xec\x7a\xea\xf0\x1e\xe2\x05\xa3\x11\xe0\x12\xe0\x0f\xb3\xb9\x7c\x6f\x77\x7e\x01\x8f\xb4\xbf\xc7\x97\x0b\x6b\x0e\x8c\x60\x47\xec\x1b\xc9\x40\x58\x4c\xce\xc6\x74\x2c\x66\xef\xec\x37\xe6\x34\x8a\x11\x74\xfc\xd3\x15\x8d\x2f\x25\x93\xf2\x6c\x02\xf2\x9b\xb2\x0f\x19\xd5\x8c\x28\xc8\x3c\x01\x77\x8f\x3d\xaa\xfd\x90\xba\x27\x52\x50\x01\x54\x34\xe2\x35\x27\x52\x95\xcd\x2d\xda\xf2\x55\x2d\x74\xb9\xda\xad\xc0\xee\xcf\x15\x54\x3e\xf9\x8e\x12\x2e\xe0\xb0\x86\xb9\x43\xb7\xcf\x4b\xd9\x96\x0e\xbf\xda\x7a\x08\x89\x54\x45\x55\xde\x30\x5a\x3b\xd5\xd4\x55\x6b\x5f\x28\x1e\x76\x14\x3a\xd8\x7c\x48\x4a\x71\xc4\xbf\x13\xec\x17\xd8\x5f\x8b\x76\xc8\xc6\xe8\xe2\x0e\x92\xf2\x35\x44\x46\xf4\x66\x59\x80\x91\x02\x1c\x33\x2b\xbf\x0e\xd0\xb9\x97\xca\x51\x90\x55\x08\x41\xfa\x95\xec\xac\x19\xd6\x76\x31\x8c\x4b\x55\x9a\x3c\x83\x40\x3c\xd5\x14\x28\xff\xc1\xc3\x90\xcf\x59\x17\xd5\xfd\x91\x70\xac\x73\x58\x95\x36\x54\x00\xbc\x4c\xe5\x41\xe7\x49\x9d\xcc\x07\xd6\x16\x00\x01\xaa\x5b\x70\xeb\x66\x46\xbf\x50\x65\x26\x18\x35\x5e\x3f\x07\x82\x19\xbb\x76\xc4\x67\xe1\x37\x9a\x2b\x0f\x20\xb6\xb1\x69\xb1\xbd\x06\x4a\xee\x6e\x08\xf6\x3b\xab\x95\xf5\xe7\xfe\x83\xb0\x55\xd7\xd8\xa8\xa6\x0a\xfe\x8d\xdc\x54\x88\xf7\x98\xaf\x20\x79\x42\x19\xe7\x44\x1a\xe8\xdc\xab\xf5\x0a\xe1\xce\xed\x56\x34\x51\x1d\x41\x22\xd4\xb2\xce\xb1\x70\x17\xf6\x38\x63\xfa\xc1\x24\x26\x8b\x82\x38\x41\x5f\xca\xc8\xd5\xab\xf5\x4a\x99\x26\x11\xae\xa0\x02\x8c\xbe\x1a\xcb\x31\xec\xbf\xf5\x2f\x2b\xbd\xa5\x52\x28\x35\xbc\xcf\x32\xdc\x67\xf1\xeb\xf6\xb9\xb3\xa9\x03\x7b\xba\x4a\xe5\x01\x73\xeb\x84\xd9\x99\x38\x9b\x1d\xa6\x9c\xa1\x5d\xc1\xf8\xa9\xba\x2e\x4a\xf1\x48\xe1\xb8\x94\x32\x4b\xe5\xc1\x8c\x63\xa7\x23\x30\xaf\xbf\xfa\xc2\xfb\xdb\xca\xc5\xac\xf8\x85\xa9\x10\x3a\x95\x07\xdd\x44\xa3\x0b\xc9\x40\xc6\x76\x20\xd7\x58\x11\x87\x68\x07\x58\xa7\xdb\xad\x97\x0a\xb1\xa6\x3c\xbf\x4f\x87\x0e\x0e\xae\x9f\xd5\xef\xa7\xf2\xa9\xc8\xd9\x10\xcf\x25\x92\x78\x14\x3b\x79\x97\x57\x85\x9b\xd5\xe0\xba\x61\x9c\x87\xd9\xbd\x9a\x4a\xf0\xfc\x41\x80\xf8\xb1\xae\x74\x9a\xb9\xf3\x06\x80\x57\x23\x7a\x6a\xee\x22\x15\x7b\x87\x2c\x33\x6d\xb6\x39\x96\xbd\x33\xeb\x08\x0e\x17\x63\x0a\x27\xa9\x7c\xa7\xf2\x5a\x5e\x1b\x4d\xa1\xdc\x54\x4e\xab\xe6\x96\xa8\x05\x23\x40\xa3\xdc\xb8\x76\x29\xc4\x23\x40\x30\x02\xe0\xad\x85\xc6\x79\xee\x2f\x0d\xdb\xee\xb9\x06\x14\xc6\xbf\xb6\xaf\x82\x2e\x7f\xec\xa9\x30\xaa\xd0\xae\x90\x00\x1f\xa4\x3a\x6d\xb2\x04\x43\xd0\xe1\x06\x0f\x42\xc7\xc0\x87\xcf\x75\x11\xfc\xdb\x42\xdd\xbb\xe7\x8a\xb8\x80\xd6\x60\xb0\x30\x02\x81\x48\x87\xa1\x1e\xfa\x64\xca\x71\xb3\x02\x6f\x85\x20\xbe\x47\x8a\x0c\x7f\xaa\x5a\x3c\xfe\x0c\x9b\x10\x63\x25\x74\xe0\x15\x1c\xa6\x02\x94\xb3\x81\x60\x64\xc4\xd5\xe7\xdc\xd7\x01\x30\xb6\xa3\x30\xd9\xee\xba\x89\x83\xca\xfc\xbc\x14\x5e\x49\xbb\xee\x52\xb8\x1f\x7e\x84\x4b\x3a\x62\xb9\xf7\xf2\x08\xd4\x37\xdc\x5d\xab\xc3\xab\xb6\xa9\x22\xa6\x94\x8e\x1e\x63\xb8\xb7\xa1\xa7\xda\x01\x04\x0f\xcd\x7c\xaf\x73\x74\xe5\x99\x37\xac\x5e\x96\x30\x3c\x54\x16\x11\x17\xa9\xee\x6a\x45\xfb\x9d\x55\x1a\x57\x64\x05\xad\x07\xdb\xdb\xaa\xac\xf0\x6a\x40\x44\x0c\x0e\x85\x32\x08\x46\xc2\xd0\x18\xfe\x37\x08\x92\xd1\xf9\x2d\x54\x7b\x70\xc3\xa9\x62\xa8\x71\xa9\xda\x2c\xaf\xf0\x72\x73\xad\x0a\x7e\xc5\xb8\xde\x70\x60\xfa\x03\x53\xcf\xfe\x3f\x35\x8d\x81\x75\xbe\x72\x21\x73\x92\x31\xba\x18\x59\xfc\x60\x62\x48\xdb\x9a\xe5\x0a\xf6\x0d\x83\xb4\xc6\x55\x10\x95\xd5\x3d\x16\x69\x0b\xa2\x49\xc5\xd6\x9d\x0c\xb0\xdb\x28\x41\x18\xbd\x82\x61\x1d\xa2\xae\x4a\x28\xb2\x43\x74\x82\xa8\xa6\x40\x61\x7a\xc3\xd1\x0b\x46\xf5\xb4\x7b\xcf\x09\x47\xe7\xbb\x83\x4e\x43\x18\x79\xec\xad\x67\x92\x4b\xee\xcb\x5f\x06\xb4\xf4\xf6\xcd\x8e\xf8\xd5\x61\xce\xbf\x4e\x23\xa4\x01\x9c\x61\xd4\xae\x83\xcb\xb6\xa0\xf6\xaa\x57\x34\xfd\x3c\x24\xa5\xde\xa8\x4c\x8b\xa0\x6b\x06\x93\x31\x48\x17\xbe\xec\x86\xf5\xc3\x2e\x7f\x3c\xe9\xdc\xff\x1d\xd6\x2c\x76\x41\x60\xfa\x58\x31\x70\x35\x05\x1f\x03\x49\x29\x76\x82\x45\xca\xdb\x84\x65\xb1\x1b\x42\xb8\x8b\x95\xa5\x1d\xb3\xc3\xba\xa0\x5d\x15\x0e\xdc\x24\xe1\xb2\xc0\xeb\x32\x87\xa7\xcf\x35\x25\x8f\x26\x58\x8f\x9c\xa3\x79\x96\x0c\x5c\xab\xfa\x4e\xd7\x3b\x81\x0f\x8a\x8e\x0a\xeb\x4f\x18\xa5\x7d\xf7\xd3\x16\x40\x3c\xbe\x00\xbc\x3e\x69\x84\xf9\x80\x7d\x9f\x18\x0e\xc4\x3e\x90\x1d\x9b\x24\x81\x4a\x40\xd3\xb0\x68\xf0\xa3\xee\xbe\xdc\x6f\x37\xd0\xaa\x78\x8c\x98\x67\x22\x84\x8e\x08\xe4\x98\x65\xc9\x51\x2d\xc6\xe3\x33\x30\x0f\xd7\x91\x8b\xb6\x97\xdb\x8f\xcf\x5a\x6f\xad\x86\x57\x2b\x64\x1f\xe6\x14\x29\x8c\x17\x4a\x7b\x7a\x50\x0f\xa4\xec\x9b\x08\xd7\xdf\xda\x5f\xbe\x91\x26\x1e\xc1\xaf\x94\x3e\xf1\xe8\xe2\xfb\x25\x75\x50\x0a\x0d\x67\x81\xc0\xb5\xd8\x68\x65\x20\x31\x06\x25\x4f\x5c\x2a\x49\xb8\x00\x61\xb2\xcc\x7b\x92\x8a\x1a\xd4\x41\x57\x97\x06\xa8\x32\x9b\x0e\x15\x62\xd7\xc0\x0c\xc8\x6a\x02\xdd\x05\x17\xb6\x76\xc5\xa4\x7b\xae\xc0\xbe\xcf\x87\x90\x36\x04\x11\x47\x6d\x77\x54\x07\x3c\x74\x5f\x4a\x05\x15\xdb\x00\xe1\xe1\x27\x82\xed\xfc\xd8\x1f\x02\xcd\xf9\x4f\xea\x08\x95\xd4\x53\x8e\x77\xee\xd0\xd0\xc0\xef\x23\x58\x19\xaa\x81\x0b\xb4\x1f\x8b\x52\xb7\xa5\x7b\x5b\xab\x55\x83\xc6\x4b\xc2\x2d\x6a\xce\x96\xed\xcd\x07\xa8\xc1\x82\x2a\x6c\xd0\xf1\xee\x1d\x74\x18\xd8\xef\x10\xe8\x77\x24\x18\xb8\x07\x42\x01\x20\x4f\x0f\x27\xd2\x77\xa3\x86\x27\x22\x7e\xd5\x44\x64\x77\x22\x9d\x77\x88\x5f\x37\x11\x39\x38\x11\x70\xd1\xff\x3e\xaa\xbb\xef\x5b\xfe\x7a\x1d\x2e\xf8\x66\xfe\x5b\xe8\x70\x01\x3a\x5c\xee\xd1\xe1\xd8\xcb\xd7\x19\xf1\x3e\x7d\x2e\x7e\xed\xaa\x3c\xa2\xcf\xc5\x80\x3e\x97\xa4\xcf\xbb\xf6\xd1\x57\x75\x7b\x4f\x75\xf4\x75\xbb\x7c\xaa\x6e\x47\xe3\xee\x6f\xa3\xbe\x45\x50\xc3\xf0\x57\xab\xef\x27\xde\x9d\x43\x2b\xb8\x47\x93\x8b\x48\x93\xcb\xbf\x52\x93\x8b\xfd\x57\xed\x53\x34\x79\xef\x9c\xf7\x0d\xfb\xbf\x42\xa9\x8b\x8e\x52\x1f\x5c\xa5\xa7\xe9\xf7\x81\x40\xc8\x0a\x54\xe3\xee\xc9\x66\xd0\xaf\xb7\x03\x31\x94\xd6\x3b\x18\x55\xdd\xf3\x76\x92\x58\x76\x45\x20\xbb\xfd\xca\x2d\x8e\x7b\xb9\x5a\xea\x9b\x9c\xfa\x9c\x3b\x0a\x94\xd0\xa6\x85\x6b\xa7\x73\xf0\x1e\x84\xd5\x63\x5d\x57\x70\x7e\xc0\x45\xaf\xb5\x6c\x9b\xbc\xc8\xff\x03\xc8\x90\xa1\xb5\xe1\x4e\xef\x98\x4b\x05\x28\xb5\x0f\xed\xd4\x8d\x6e\xb3\xaa\xdc\x6d\x64\xa7\x35\x8d\x31\x77\x3a\x83\xc8\xd7\x48\x91\x9a\xeb\xec\x0d\x6e\x48\xde\x14\x8e\x9d\x1b\xf7\x30\xfc\x08\xf9\xc2\x40\x6b\x0e\x4e\x59\xef\xc2\x52\x0c\xa3\x1d\xf4\xe6\x81\x20\x0f\x88\xfe\x90\xc8\x1c\xea\xf4\x26\x4d\xe4\x01\xb1\xfd\x05\xa1\x58\xfa\x36\x0a\xde\x72\xd7\xbb\x91\x0e\xec\x92\x1d\x2c\x56\xb5\xd6\x25\xf8\x9b\xdc\x6f\xe6\x0b\x27\xbb\x5f\xa5\x5b\xf9\xe0\x88\xb8\xde\x69\xe8\x4c\x77\xbf\x21\xee\x58\x3a\x2c\x8e\x0b\x54\x79\x80\xa0\x37\xae\x3c\x2a\x11\xb7\x0c\x5a\x84\x65\xf8\x5f\x59\xaa\x01\x51\x03\x48\x29\xc5\x8d\xb1\xd8\x30\x49\x43\xc2\xe6\x69\xc4\x3e\xc7\x16\x63\x1f\x09\x06\xf0\xa3\x1a\x39\x5c\x7d\xd4\x91\xbe\x88\xdf\x41\x10\xfc\x50\xdb\xa8\x46\x16\x5a\x19\x60\x2b\xf5\x48\x7c\xca\x84\xa0\x60\x83\x0f\x16\xf8\x60\x87\xec\x35\x0f\x98\x6b\x21\x2f\xf1\xd1\x37\xa7\xdb\x97\x9e\x79\x83\xdb\xfa\x77\x6f\x77\x78\x5d\xb1\xe8\xba\x68\x31\x9e\x5a\x07\x4b\x30\x04\xc0\xe3\x6c\x12\x57\xfa\x80\xf3\xa2\x6b\x00\xb5\xae\xb3\x85\x96\x1a\x6b\xe2\xf8\x5b\xcf\x8c\x74\x35\x64\x84\xc2\x11\x6c\x67\x5e\x5a\x2d\xb7\xfb\x51\x88\x3c\xf5\x2f\xba\x05\x2c\xc1\x55\x0b\x41\x6e\xef\x60\xe7\x81\x9b\x14\x39\xed\x88\x2d\xd3\x78\xb7\x99\xa3\x9d\xee\x36\xe4\xcb\x0c\xdb\xe6\xf1\xa3\xea\x7e\xdd\x16\x4f\xbe\x4f\x05\xd7\x61\x59\xc5\x40\x6c\x8d\x20\x0c\x0e\xf5\x0e\x9e\xaf\x76\x28\xb1\x10\xcf\x83\x82\x10\xbb\x9d\x6d\x61\xaa\xda\x31\xb8\x8b\xb5\xb6\x7f\xa8\xb5\x81\x10\xb3\x89\x33\x0c\x5b\xb5\x83\x5a\xbb\x37\x42\xe4\x39\x5e\x34\x08\x01\xc2\x37\x03\x37\x03\xc5\x61\xce\x00\xb7\x92\x15\x74\xde\x70\x8c\x35\x11\xd4\x10\x56\xa8\x7b\x17\x27\x0d\x5f\x4a\x91\x52\xec\x5a\x0f\x40\xf7\xb8\x85\x1f\x73\x13\x32\xd3\x6b\xb5\xa1\xec\x4b\x5e\xde\x29\xee\xe7\xdb\xda\x33\xb6\xda\xf9\x40\x6d\x03\x25\xbe\xad\xdd\xb3\x3f\xb5\xb8\x49\x9d\x27\xa3\xf1\x3a\xfe\x57\x4c\x66\x2e\xb8\xce\xec\xfc\x93\x5c\x5c\x8d\xae\xc6\x67\x72\x32\x8d\xb2\x97\x11\xb0\x38\x66\x3e\xe1\x33\x1f\xe7\x13\xc8\x36\xcf\xe6\x72\x3e\xfe\xe3\xf5\x64\x8e\x49\xdd\x38\x7b\x9b\x44\xd9\x5f\x7a\xe2\x99\xcf\x96\x4b\x97\x2d\x4f\xe4\xc7\xc9\xd5\x87\xd9\xf5\x95\x88\xcb\xd5\x46\xd3\x4f\xf2\x0f\x93\xe9\x59\x22\xc7\x13\x48\xfa\x0e\xd4\xc5\x05\xb5\x70\xf4\x10\xac\x04\x83\xcc\x69\x22\xb0\x2c\xca\x3d\x34\x4e\xb8\x9f\xce\xa6\x57\xe3\xe9\x15\x3c\x6f\x74\x7a\x7a\x3d\x1f\x9d\x7e\x0a\x53\xcd\xc8\x97\x10\x82\x43\x94\x1e\x1c\xc2\xad\x23\xa5\x8e\xc7\xff\x7a\x85\x55\x04\x7b\xd7\x03\xca\xfb\xe8\x4b\x61\xf6\x9e\xab\xb8\x20\x77\xef\x13\xfc\x57\x33\x39\xb2\xbb\x31\x3f\x83\xaa\xbc\x4f\x3e\xcb\x0f\x9f\x14\x6f\xe7\xe3\xd1\xe9\x07\x37\x5e\x3f\xc9\xc9\x54\x2e\xc6\xc0\x35\x2b\xbf\x4b\xa2\x72\xbd\x8f\x93\xf3\x73\x9f\x8c\x76\x25\x7a\xe2\x6a\x06\x29\x69\xaa\x5e\xc3\xf2\x0a\x42\xab\xe7\xea\x3d\x57\x9f\x17\x16\xed\x45\xd5\x79\x89\xbc\xbc\x9e\x4e\xae\x26\x3f\x41\x95\x9a\x2b\xe3\xeb\x4d\xd3\x55\xa8\xc5\x72\x16\x55\xac\xe1\xfa\x63\xb1\x9a\x98\xbc\xf3\x63\xfe\x30\x5a\xc8\xb7\xe3\xf1\xf4\xe9\x40\xf5\x0b\x07\x1f\x16\x81\x2a\x29\x82\x2d\x8b\x0c\xef\x47\x54\x11\x5e\x4b\x1e\x6c\x27\x42\x5a\x12\xe0\xbb\xda\xc3\xb6\xac\xc1\x2b\x5a\xee\x40\x65\x91\x7a\xdb\xe7\xda\xbb\x84\x97\x71\x19\xaf\x5c\x9b\x01\xcc\x9e\xa7\xd8\x6e\x1e\xc7\xa7\xdf\xdf\x97\x48\x77\x61\xbb\xb4\x26\xbc\x01\xfb\x61\x48\x45\x9a\x10\x30\xca\x95\x42\xc3\x25\xe9\x73\x73\x46\x04\x43\x65\x7c\xe1\xbc\x94\xeb\x16\x8c\xc4\x18\x75\x13\xab\xfd\xf8\xf1\x29\x47\x53\x8d\x3c\x4e\xe4\x49\x22\xbe\x4b\xe4\xf7\x89\xfc\x01\x1d\xd8\xdf\xe1\xd0\x4c\x5b\xdf\x01\xfb\x7c\xe9\xf1\xab\x06\xb0\x3c\x50\x93\x75\xd2\x43\xe8\x1b\x0c\x25\x89\x92\xf0\xa2\x8a\x36\x57\xe6\x46\xc4\xb9\x1e\xf9\xd4\x5c\x4f\x78\x37\x1e\x41\x7e\xce\x4e\x9a\x9b\x67\x85\x1b\x51\x74\x9b\x43\x04\xda\xc4\x71\x73\x36\x04\x3a\xe9\xde\x2c\x87\x6c\x6a\x00\xda\x4d\x82\x04\x6e\xa3\x69\xaa\x6d\x50\x9e\x1e\xda\x18\x84\x67\xd5\xe4\x1b\x1d\x18\x6d\x2c\x03\xc2\x01\x5e\xc1\xd6\xea\x82\x42\xdc\x4e\x32\x88\x3a\xbc\x82\x3d\xcc\x6a\x75\xdf\x01\x93\x0d\x2f\xb1\x18\x13\xcf\xda\x10\x4b\xad\x4b\xee\x8b\xe6\x66\x79\x74\x8b\x92\x1e\x6e\x6e\xe7\x68\xb0\xb8\x1e\x31\x45\x51\x14\x8e\xa0\x7e\x92\xbc\x6c\xb5\x13\x38\x44\x71\x84\x5e\x5e\x84\x74\x21\xa0\x32\x2f\xc8\xc2\x27\xd9\x60\x33\x1c\x74\xdd\x45\x6e\x56\xba\x28\x54\xa9\xab\x16\xcb\x63\x00\xba\x12\xda\x37\xe3\x20\xc6\x13\x7c\x66\x8f\x2c\xd1\x71\x1b\x93\x38\x39\xcc\x79\xfd\x2a\x0e\x31\x84\xa8\xb8\x55\x18\xc1\xc7\x92\x5a\xeb\xf2\x0c\xa6\x3e\x95\x19\x94\xeb\x5e\x9f\x6f\x7c\x6a\xbe\x71\x9e\x7d\x0f\x48\xfc\xfa\x79\xc5\xfe\xc9\xdf\x63\x82\xe8\x4f\x3f\x0e\x04\x04\x29\x73\x00\xdc\xe9\x00\x09\x39\x10\x6f\x7f\xde\x05\xa2\x3b\x35\x12\x39\xc5\x01\x1a\xf5\x5b\xe1\x83\xf6\x87\x39\x50\xe2\xd9\xdc\xe5\xbe\x72\x6c\xff\xe7\x5c\xd2\x96\x58\xe0\x29\x66\x24\x94\xe7\xe6\x47\x08\x35\x37\xdf\x90\xfe\xfc\x49\x40\x44\x22\xca\xde\xf9\x07\xe1\x1a\xf5\x41\x89\x32\xc0\x13\xb3\x33\xa1\xce\x8a\x3d\x0b\xed\x06\x92\xd9\x91\x5a\xf7\x25\x67\x80\xe7\xb2\xa2\xcb\x52\x40\x53\x3d\xef\x2b\x1d\x60\x18\x07\x7c\xba\x76\x88\x56\x65\xe3\x9f\x97\x97\xd0\x8c\xc1\xf0\x34\xd8\xf9\x26\x82\x85\xda\x51\x28\x06\x31\x8b\xb3\x00\x05\xba\xf7\x54\x2c\x76\x89\xac\x81\xb0\x34\xa8\xf1\xc0\xef\xbe\x03\x72\xa9\x9b\x7b\x4d\x78\x9b\xbc\x2f\x10\xc8\xf2\xc5\x24\xfe\x1c\x3b\x10\x75\x7b\xe1\x80\x77\x41\x3d\xa5\x65\x85\xe2\xc6\x77\x86\x49\xfc\x2b\x8c\x08\xbd\x3f\x82\xf8\xee\xd4\xab\x04\xae\x59\xd5\x04\x38\x3b\xf8\x1e\x77\x3a\x61\xd5\x04\xd5\x32\x21\xa0\xfa\x12\x5d\x26\x66\xff\x45\x4c\x65\xdc\x44\xc3\xa0\x51\xbb\x80\x81\x0c\x41\xb1\x37\x9b\xb6\x64\x7c\x5a\x36\x37\x3a\x2b\x17\xe0\xd6\xbb\x82\x3f\x16\x6b\x90\xc0\x16\x2e\x5a\xee\xa4\x71\xd3\xe5\x40\x8c\xcf\xdb\x62\x24\x35\x15\xa2\x57\x5e\x4c\x4d\xfb\xca\x6f\x74\xff\x28\x21\x76\x4c\x59\x39\x14\xbb\x00\x53\x4d\x00\x24\x52\x59\xba\x8b\xaf\xf1\x55\x65\xa9\xec\xbd\x2e\xac\x04\x8b\x61\xdb\xaa\x5a\x30\x70\xe4\x4e\x92\x05\x88\x10\x1d\xcd\xad\xae\x18\x2c\x6a\x0f\xae\x9b\x07\x5a\xa3\xf5\x11\xbe\xd2\x06\xbe\x84\x28\x00\x45\x22\x07\x70\xde\xf6\xc2\xbc\x71\x65\x4f\x67\x8e\xbc\x46\xdc\xdb\xda\xb5\x56\x28\x59\x5d\xeb\x9b\x0a\x7e\xba\xaf\xe4\xe1\xc9\x91\x84\x73\x59\xae\xb4\x49\x44\xbe\xee\xaf\x8c\xbd\xef\x7d\x3a\x3c\xe7\x74\x42\xc6\xd1\x50\x52\xdf\x3e\xc6\xe0\x03\xe5\x4e\xa1\x62\xef\xaa\x0f\x38\xd8\xcd\x0b\x51\xed\x83\xb0\x46\x2a\xc4\x18\x6b\xf9\xd8\x4c\xe3\x6c\x7b\x50\x7b\x67\x4d\xd5\x15\x02\xd0\xd3\x01\xa1\x70\x8b\xeb\xbf\x24\xe4\x43\x31\xc0\x6d\x70\x7a\x7a\x79\x9e\xc8\x92\xfa\x49\x70\x5f\x61\xfb\x99\x62\xce\x33\x53\x1c\x74\x57\xe3\x40\xd0\x66\xd7\x9a\xca\xce\x3c\x23\x16\xb2\x97\x40\x13\x5e\x5f\xba\xfc\xe1\x88\xba\xcc\x58\x2f\x0e\x7d\x2b\x95\xa3\x72\x17\xe0\x11\xb6\x6c\x21\xa1\x6a\xec\xd8\xe1\xbd\x13\xf4\xcc\xbe\xad\x7c\xbe\x6a\xeb\x1a\xe0\x27\xdc\x40\x5b\xa3\x6e\xb4\xbc\x69\xf3\x4c\x17\x79\x09\xf5\xb3\xae\x9c\x04\x96\xd1\xdc\xea\x4c\x54\x58\xde\x7b\xaf\x97\x26\x6f\x74\x04\x39\xd3\x41\x8e\xc7\xa4\x1e\xd3\x8a\xf7\x69\xff\x06\x0e\x37\xbd\x8d\xc8\xd7\xb1\xb3\x90\xe8\x07\x57\xf4\xd9\x15\x2d\x42\x55\xdf\xbc\xf8\xad\x69\xe7\xff\xfd\xff\xd2\x17\x37\x8b\xd9\xe8\xf2\xf9\x71\xfa\x6a\xf9\xf7\x82\x01\x79\xbc\xff\xe7\xf5\x0f\x3f\x9c\xbc\xec\xf5\xff\x1c\xff\x86\xff\xf1\x0f\xf9\x0f\x76\x7f\x2f\xf1\xaf\x95\x0a\x88\xa8\xe2\xc7\x48\x1b\x07\xd5\xab\x3d\x64\x8d\x8b\xea\x3f\xf2\xa2\x50\xdd\x27\x1e\x5e\x5c\x9e\x1f\xa7\xc7\x47\x18\x9f\x75\xb8\xe2\x1e\xc6\x30\xd3\x05\x74\x0c\xba\x07\x39\x6f\x03\xbf\x09\xcc\x45\xd0\x86\x78\x9c\xbe\x4c\x8f\x13\x79\x92\x1e\xa7\x87\xab\xa3\xe4\x30\x3b\xb2\x3f\x9c\xf8\x1f\x7e\x67\x7f\x58\x1e\x25\xf2\xf8\x25\xda\x13\xc7\xc7\xa9\x2f\x06\x4b\x7f\x27\xef\x95\xb1\xd6\x93\xce\x52\xa8\xbf\x73\xb6\x8e\x1b\x96\xb5\xef\xe0\xf9\x4b\x7e\xb6\xfd\xc7\xab\xf4\x44\x1e\x1a\xe8\x4d\xb4\x1f\x87\xdf\x7c\x27\x0f\x69\xe4\x02\x63\xe4\xa6\x71\x17\x2f\xb9\xc2\xaf\xd2\xef\xa3\xaf\x31\xbf\x16\xaf\x62\x27\x1f\x8a\x2b\xed\x5a\x31\xb7\x6a\xf5\x59\xdd\x30\x19\x11\x15\xf0\x6a\x06\x23\x86\x97\x9a\x4a\x6d\x57\xdb\x2d\xe2\x99\xdc\x9b\xac\x38\xb9\x8d\x60\x02\x8a\x6a\xc5\x99\xd4\x1b\xfb\xd9\x17\xa6\x5e\x61\xd2\x0f\x7e\xb2\xdf\x48\x00\xaf\x10\x3e\xcd\xf8\x45\x19\x52\x85\xf4\x1e\x8d\x5e\xf1\xf5\xd9\xd9\x24\x7a\x09\x3e\xab\xcd\xb2\xfc\x24\x21\xe4\x13\x2d\x3f\xea\x25\x46\x24\x6a\xeb\x27\x6e\x8b\x18\xc0\x14\x7f\x65\x5e\xd8\xbb\x08\x3e\x04\x68\xc4\x2d\x55\x06\xa0\x4d\x69\x7c\x57\xaa\x68\xaa\xaa\x60\x2f\x93\xd0\x97\x0c\x18\xb6\xba\xb6\x26\x56\xb1\x83\xb4\x9e\xfb\x39\x14\x53\x17\xcc\x80\x6f\xab\x52\x2c\x35\x21\x73\xb3\xc8\xdd\xdf\xdf\xa7\x37\xba\xcc\xef\x72\x95\xae\xaa\x0d\xf5\xe1\x60\xbb\x55\xd8\x9a\x03\xdd\x39\x2f\xd3\xe3\x54\x88\xe3\xf4\x98\x11\xe1\x62\x14\x41\x08\x23\x46\x28\x74\x50\x38\xe3\x00\x22\x19\x4a\x90\x31\xfb\xe1\x6a\x44\xda\x88\x8b\xb0\xf8\x12\xde\x71\x12\xbf\x83\xc1\xa1\xe3\xd2\xfe\xcd\x32\x8a\xb5\x05\x19\xd4\xd3\x0a\x58\xe6\xac\x71\x22\xa2\x87\x23\x60\x15\x80\x65\x07\x8f\xf7\x04\xd3\xf1\x87\xc1\x34\x58\x32\x0e\x60\x08\xca\xe5\xbe\x0a\xa3\x7d\x95\x7a\x04\xcf\x2e\xa0\x55\x67\x4c\x55\xdd\x79\x07\xd9\x85\xc1\x6c\xc4\xf0\x6c\xec\x10\xa3\xaf\x42\x1f\x13\xa2\xb0\x28\xa3\x03\xeb\x3c\x00\x61\xd1\xb5\xae\xd6\x30\xc6\xd7\xa9\x3c\x18\x17\x7a\xd5\xd4\x55\x99\xaf\x62\x16\x82\x0b\xbd\xba\x55\x65\x6e\x36\xbe\x71\x67\xc3\xbf\x62\xa3\x9e\x18\x58\xb6\x0d\xe2\x9b\x34\x03\xf0\x2a\xe0\x67\x92\xcf\xd5\xec\x9c\xc9\xab\xfd\x5b\x3d\xc0\xe5\x5a\x66\xaa\x51\x81\x74\x7d\x67\xc7\xf7\x8b\x5e\xb5\xd0\xaa\xc1\x03\x09\x57\x95\xbd\x3a\x04\x06\xf3\xe8\xb1\x31\xa4\xdb\x71\xfa\x7d\x2a\x0f\x10\x96\xad\x90\x67\x0c\x5a\xf3\xd5\xa6\x92\xc0\x17\x40\x27\x40\xf4\x9e\xc1\xe1\xd3\x10\x12\x97\xca\xbf\xdc\x51\x5b\xee\xe4\xf8\x97\xdb\x7c\x99\x37\x72\x04\xa3\xf9\x21\x95\x07\xe7\xd6\xa3\xaf\x87\x5a\xa3\xb0\x41\x08\x37\x5f\x77\xa6\x5b\xd5\xbd\x9d\x14\x44\xa8\x85\x2f\x76\x34\x55\x1c\x6f\x79\xbc\xd5\xe6\x38\xfd\x9d\x6b\xeb\x09\x44\x34\x66\x2e\xb7\x1f\x3a\x76\x1f\x0b\xb7\x82\xb2\x99\x51\x1c\x18\xc2\x5b\x2e\xa9\xbb\x51\xbf\x04\xb1\x1a\x81\x98\xd9\x85\x0e\x70\xbc\xa9\x8a\x29\xf7\x18\x19\x39\x2d\x32\x26\x67\xab\x3a\xe6\x11\x50\x2b\x5c\xd6\x04\xbc\x56\x00\x29\xf5\xd8\x5c\xe4\x7e\x61\xb5\x05\xc5\x10\xf2\x12\xe6\xf0\xfb\x54\x1e\x44\x67\x25\x44\x07\xe4\x10\x82\x1d\x76\x55\xe3\x1d\x1c\x75\xc6\xd8\x21\x34\x80\x3d\x6c\xc7\x03\xf0\xcb\x2d\xf2\x40\x04\x40\x1f\xd1\xe9\xe4\x34\xa9\x6b\x8d\x89\x35\x9a\xfc\x78\xab\x4b\x11\xcb\xb2\xf1\x2c\x29\xd0\xd7\x66\x74\x4d\x90\xf1\x80\x46\x64\xb5\x7a\xf8\x10\x99\x9b\x1f\x85\x18\xa1\x1b\xf5\xd5\x19\x58\x7d\xcb\xe8\x5a\x0a\x1e\xc8\xb8\x07\xc0\xe9\xc5\x15\x16\x4e\xcc\x86\x87\x2d\xc4\x5b\x7c\x5f\xa9\xef\xf1\x21\xae\x72\x0a\xd1\x7e\x29\x92\xb0\x47\xfd\x3e\xf6\xe0\xe3\xf4\xf8\x65\xd8\xf9\x15\x6a\xcd\xf0\x78\x01\x6c\xce\x66\xdb\x36\xf6\x32\x65\x75\x03\xf2\x8f\x27\x27\x37\x22\xd3\x66\x55\xe7\x4b\xdf\x0c\xf2\xd4\xe3\x69\xd7\x3d\x1e\x32\x16\x2c\xd8\x07\x27\x5d\x59\xb5\xee\xe3\xfe\xf2\x07\x17\xe0\x29\x6a\xad\xb2\x9d\x03\x5b\x84\x31\xc4\xa7\x34\x3a\x98\xb0\x0c\xf6\xb8\x21\xee\xa8\x3c\x05\x58\xcf\x50\x58\x43\xf4\xd1\x43\x73\x94\x40\xe3\x43\x75\x5f\x22\x64\x84\x6b\x7c\x10\xee\xa4\xf4\xa3\x34\x41\x3f\x54\x22\x37\xba\xb9\xad\x32\x20\x64\x5b\x69\xc3\xa4\x98\x5b\x68\x50\x6d\x19\x57\x34\x61\x04\x2b\x7a\xbb\x57\x06\x92\xbb\x93\xe8\xe6\xb3\x46\xe6\xd3\xa1\x1c\x9b\x00\x78\x9b\xe1\x21\x09\xd4\x51\x44\x0d\x18\xd0\x3c\xd4\x84\x73\x81\x6e\x90\x2a\x6b\x0b\x6d\x64\xee\x65\x30\x91\xdb\xa2\xa5\x63\x6d\x4c\xb5\xca\x15\xde\x4f\x8d\xae\xd7\x6a\xa5\xb1\x9d\x95\x78\xb0\xf0\x58\x11\xb2\xba\x43\xae\xe4\x3a\x40\x44\xf7\xf6\x38\x7f\x84\x17\xee\xa9\xad\x4a\xe9\xaf\x27\x10\xee\xd0\xaa\x73\x99\x2f\xab\xcb\xb0\x34\x27\x37\x60\x54\x13\x5b\xa4\xd7\x1c\x62\x40\x73\xe0\x6d\x76\xaf\x8b\x02\x9b\x5a\x92\x20\x20\x11\xdf\x09\xbc\x88\xce\x00\x79\x66\xc4\xea\xb6\xca\x57\x18\xa6\x8d\x84\x7f\xa5\x4a\x0a\xaf\x80\x85\x18\x40\x8d\xa8\x7a\x75\x9b\xdf\xa9\x82\x3a\x9b\x39\xe3\x26\x28\x71\x08\xa0\xe7\x0a\x2a\x39\xf8\x7b\x04\x2c\x9a\xe9\xe7\xf8\x5d\xe8\x6b\x76\x50\x88\x46\xde\xe7\x19\xd0\x99\xf1\xb0\xa1\x73\xd8\x31\xf0\xa1\xac\x9c\x70\x07\xe5\x61\x55\x4b\x44\x4b\x3e\xda\xd7\x4d\xa9\x62\xac\xe3\x5e\x57\x25\xe2\x30\x27\xce\x30\x2e\x76\x2c\xf1\xe1\x15\xc1\x17\x62\xd2\x2b\x98\x55\x04\xce\xcb\xdd\xbf\xbd\xa2\x5a\xe8\x22\xe7\x48\x1b\xfb\x51\xdf\xdb\xc3\xfa\x2e\x06\x72\x86\xf2\x1d\x9c\x17\xc3\x4d\xc1\x6d\xe5\x9a\x55\xf1\x86\xff\x66\x44\x66\x01\x21\xeb\x77\x90\xea\xea\x34\x61\x7b\xe9\x4e\xe4\xc1\xea\x11\x90\xe6\x84\x20\x9a\x45\x40\x0c\x04\xd7\x36\x92\x7a\x62\xef\x45\x4d\x93\x84\x33\x59\xaa\x1b\x07\x1f\x8b\x59\xd7\x18\xc2\x59\x7c\x23\x84\xb3\x8c\x21\x9c\x0f\xbf\x7b\xf9\xbf\x1c\x89\x6f\x07\x72\x76\x10\xce\x52\xca\x13\xb9\x98\x5d\xcf\x4f\xc7\xf2\x74\x76\x36\x76\x70\x06\x6c\xfd\x58\xcf\x16\x4e\x48\xdf\xac\xc3\xd6\x4d\x6c\x4b\xeb\xff\x75\x6f\x4f\xe6\xf3\xaf\x36\x65\x7a\xda\xed\x98\xa9\xc8\xd5\x4d\x59\x45\x05\xd9\xd7\x16\xf3\x19\x5b\x6d\x7f\x8b\x4a\xf8\x47\x21\xec\x1e\xa2\x5c\x0c\x7f\x90\x2c\xa0\x90\x4a\x81\x34\x76\x48\x49\x7c\x14\xe8\x6f\xbb\x6d\xfd\x29\x36\x15\x36\xd3\x06\xcc\xe0\xa0\x8e\x77\x49\x50\xcd\xcb\x45\xbc\xbe\x01\x08\xae\xcb\xac\x43\x81\x19\x29\xb7\xc3\x01\x1b\xf6\x48\x76\xf1\x0a\x63\xaf\x86\xa1\xee\x94\x71\xc6\x85\x92\x81\x05\x0d\x08\xfe\x42\x58\x11\xc3\xb5\xd9\x12\x13\x38\x61\x6f\xfb\x66\x40\x77\x4d\x46\x07\xae\x3f\xff\x44\xec\x21\x11\xc7\x4c\x9d\xd5\xca\x87\x07\x8e\x8f\x0f\x7e\xf6\x34\xe2\x07\x47\x71\x2f\x09\xda\x3e\x1d\x47\x6d\x60\x19\xb0\x9a\x9b\x58\x20\xbb\x44\xd8\x58\xee\x80\x45\xa6\xcc\x32\x66\x86\xd9\x3d\x00\x32\x0e\x2e\x0a\x2b\x9a\x76\x27\xa1\x14\x59\x23\x5e\x85\x46\x34\x72\x11\x3a\xcb\xb8\xfc\x48\x0d\x4b\x1a\x3c\x19\xb2\xdf\xfa\x73\xb0\x63\x8a\xdc\xee\xfe\xb4\xdc\x79\x93\x52\x1e\xae\x8e\xc2\x9f\xb2\x23\x7f\x16\x4f\xd2\xf0\x0e\x73\x27\x70\xf1\xeb\x8f\x09\x31\x34\x85\x4f\xc3\x13\x2b\xbe\xe5\xc4\xba\xe2\xcb\xbf\xd3\xd9\x8b\x82\x0e\xdf\x78\xec\x40\xfe\x3b\xc7\x2e\x8e\x29\x30\x38\xc2\x92\x2a\x66\xc2\xc5\x19\x3c\x92\x82\xcc\x13\xb0\x7d\x42\xe4\x93\xa5\x32\xb9\x49\x42\x91\xe9\x48\x85\xea\x38\xad\x78\x78\xc5\xdf\xed\xf0\x76\x16\x50\xfc\x95\xc7\x36\x78\x9c\x0b\xff\x0e\xae\xd0\x13\x8e\xab\x0c\x8e\xab\xf8\xab\x8e\x6b\x14\x0d\xda\x7b\x5c\x07\xe2\x63\xc3\x63\xff\xfa\x99\x7c\xd5\x41\xa4\x7a\x7b\x3e\x79\x3f\x8a\xe3\x7f\xaf\xec\xfd\x39\xc2\x22\x13\xcf\x3b\xe6\xf8\xf6\x7a\x32\x88\x76\x4f\xd0\x40\x87\x45\x60\xc1\xaf\x5d\x4c\x10\x22\xcf\x21\xe5\xf6\x23\x45\x27\x8f\x79\x37\xce\x4c\x03\xfd\x72\xd5\x61\x5d\x0a\x88\x45\x22\x89\xa5\xf4\x9d\x3f\x50\xd9\x60\x13\xdb\x50\xd7\x55\xd7\x88\xec\x55\x93\x38\x17\x3f\x32\x23\xc5\xf7\xe9\xf1\x70\x1f\xb3\xef\x81\xdb\xd7\x9e\x1c\xfc\x9d\x8d\x7d\xf4\x32\xe3\xca\xa8\x27\xf6\x14\x73\x09\x40\xb0\x4e\x82\xe7\xe2\xdb\xd0\x4c\xd8\x87\x66\xba\xd5\x85\xfb\xe6\x4e\x18\x14\x61\x57\x5a\xb7\xde\x3e\xe0\x92\xf6\xf4\xfc\xb4\x10\x65\x58\xea\xc1\x01\x2a\x11\xb5\x27\x04\x1f\xa0\x27\x47\xb1\x00\x9f\xfc\xf8\x2e\x90\xe2\x93\x54\x8e\xd0\x49\x71\x45\x4f\x71\x00\x71\x54\xee\xe2\xc8\x4b\xa0\x4d\x81\x74\x92\x2b\x7a\x3c\x4e\x32\xaa\x83\x9e\x5d\x61\xbd\xe8\x1e\xef\x17\xf8\xdb\xf5\x63\xcd\xb4\xba\x17\xb9\x7b\x95\xbe\x4a\xe5\x99\x46\xd7\x95\x19\x3b\x3a\x11\x15\x27\x4a\x68\xd2\xdb\x31\x46\x62\xbe\xef\xec\x91\x0b\xac\xc0\x4b\xb4\x3e\xb2\xe0\xc5\xe6\x65\x5e\xdd\x2a\x20\x0f\xc5\x2d\xc2\x47\xd1\x99\x06\x19\xe9\xea\x7f\x74\x27\x88\xf2\x1e\xca\x70\xe0\x01\xe9\x90\xb4\xfb\xee\x16\x28\x79\xdc\x38\x7d\xda\xbd\xd4\x84\x4f\xbb\x25\x7b\x78\x4e\x13\x8c\x7f\xc5\x16\xa8\xdb\x24\x52\x2b\xb4\x49\xc2\x1b\xbf\xe8\xec\xb3\x56\x69\x3a\x18\xbe\x83\x41\x60\xf6\xad\x82\xf3\x87\xe7\xf9\x10\x08\x62\x61\xd2\x14\x79\x82\x9f\x82\xc8\x81\x3f\x2e\xb5\x2b\xbb\x88\x91\x9e\x1d\x6c\x14\x9c\x68\x12\xe8\x20\x39\x08\xde\x56\xe8\x08\x75\xa3\x2a\x81\xd8\xbc\x4e\xe5\x24\xb4\x5e\x2e\xd9\x7a\xb9\x50\x4d\x83\x14\x02\x76\x2e\x57\x60\x6b\x5d\x82\xad\x85\x21\x28\x28\x49\x8c\x6c\x2a\x15\x76\xe8\x10\x32\x15\x1b\x24\xd8\xfa\xa2\x42\x9b\xed\x99\x79\xdc\x6e\xea\xd4\xda\x0e\x00\x6a\x88\x00\x1b\xa3\x67\xc5\x44\xfa\xd4\x58\xe7\xce\x2e\xcb\x49\x7a\x92\x44\x1f\xeb\x60\x44\x40\x36\x15\x02\x99\x2e\xaf\x18\x9e\xcf\x08\x78\x1d\x9a\xed\x32\x79\x00\xbd\x05\x07\xb4\x25\xbc\x1d\x06\x54\x1b\x12\xfc\xb2\xc4\xa3\xa9\x4a\x14\x25\xfe\xcf\x79\x29\x4d\x0b\x00\xb0\x56\xb6\x33\xdd\x00\x99\x31\xae\x9f\xd3\x8d\x02\x4a\x61\xec\xfa\xca\xfb\xdb\x6a\xe3\x0e\xe5\xaa\xe9\x6d\x04\x26\xf0\xa8\xde\xb0\xdb\x33\xd5\xdc\x6a\xd1\x89\x1a\x77\xeb\x5b\xd4\x5e\x2d\xd9\x59\x3b\xac\xc1\xb3\x07\x74\x6b\x8f\x1a\x5a\xa6\xa8\x9e\xa0\xdd\x02\xd6\x91\x70\x5a\x08\x60\x26\x5a\x7a\x28\x67\x0b\x98\xcb\x82\x58\x25\xa0\xe7\xda\xef\x35\xea\x33\x33\xad\x9b\x46\x6f\x8d\x3c\x64\xa0\x37\x7b\x7c\x88\x3b\x30\x88\x47\x6d\x54\x0e\xa4\x48\x45\x6e\xa0\x37\x49\x94\xfa\xde\xdc\xd4\x55\xbb\x35\x47\xa1\xbd\xb5\x52\xc5\xaa\xa5\x9a\xa6\x4a\x22\x55\x22\xd5\xf6\xdf\xdf\x56\xbe\x4d\x21\x38\x3a\x78\x8b\xc2\xc6\x94\xfa\x3e\x58\x59\x2e\x11\x77\xa9\xd3\x14\xed\xd7\x70\xb2\xa3\xcb\x49\xef\xc8\x3c\xeb\x44\xbd\xa3\xab\xcd\xdb\x51\x76\x85\x6f\x6a\xb5\xd9\x20\x52\x16\x07\x2e\xed\x1a\xed\x3f\x7f\xd5\x9a\x9d\x0d\xd7\x09\x01\x02\x2a\xf6\x92\x40\xda\x65\xe0\x96\x49\x9c\xe5\xe8\x72\x32\x70\x58\x54\x61\x2a\x77\x62\xe0\x3e\x0f\x89\x26\x29\xc2\xee\x05\xc0\xae\xc5\xea\xa8\xdb\x67\x18\x3b\x77\xbe\x21\x90\x7a\x00\x09\xde\xce\x4a\x62\x6e\x56\x45\x65\xb0\x1e\xce\xb4\xaa\x6c\xac\x2b\xee\x45\xf2\xb5\xd5\x4e\xd4\x92\x10\x3e\x72\xa9\x8b\x5c\xdf\x71\x2b\xf7\x23\x8b\x0e\x0b\x12\xff\xdd\x95\x58\x70\x06\xfa\xd0\x1c\x31\x1f\x52\x77\xc5\x83\x93\x4b\x4a\x29\xea\x23\xec\x66\xa0\xfa\x01\x7e\x56\xc4\xd0\x8b\x49\xea\x6e\x8a\xed\xc8\xe1\x9d\x9d\xb5\x28\x0f\xa8\xff\xfc\xd5\xe1\x73\x15\x9c\xea\x85\x53\x17\x99\x7f\xa4\xf3\x27\x6b\x99\x3b\x96\x2b\x4e\xbd\x41\xb3\xa1\xf5\x5b\xec\xa9\x0a\x6e\xa4\x90\x80\x2b\xb2\x50\xe0\xfe\x6f\x35\xc6\xdf\x8d\x4f\x7e\x81\xc7\x51\xf6\x6f\xf0\xde\x83\xa1\xec\x02\x3c\x11\xa0\x7f\x83\xd4\x96\xb5\x82\xef\xec\x9a\xe1\x4d\x5d\xd5\xbb\x23\xee\x93\xb5\xee\x5a\xed\x19\xcc\x8a\xfc\x33\xf9\x57\x45\x55\x61\xeb\x29\x2a\x04\x7a\x07\x4c\xd3\xfb\x14\x59\x84\x23\x16\x6e\xbc\xdd\x53\x36\x29\x55\x96\xc9\x5d\xd5\xd6\x78\xaf\x2b\x13\xe7\xfe\x05\x19\x60\x34\x89\x48\x37\xfa\x4c\xae\x9f\x39\x1c\x90\x70\xbf\x02\x58\x3f\xe6\xfd\x88\x40\xc4\x39\x0d\x1e\xae\x33\xce\x3e\xba\xe0\xfb\x76\xb2\x88\x2e\x7a\x92\x35\xb0\x19\xa8\x54\x34\xba\xf4\xdd\x74\x57\xb7\x55\x85\xed\x0b\x60\x2c\x53\x5d\x0a\x47\xe2\xad\x91\xa7\x35\xa2\x67\x70\xa1\x71\x02\x4d\xe4\x55\x8d\x54\xcd\x7a\x53\x52\x7b\x40\x91\x3b\x23\xd9\x97\xb7\x8a\x0e\x7a\x9b\x1f\x77\xd7\xb3\x1a\xb0\xee\xb3\x4a\x9a\x0a\xdd\xab\xaa\x14\xc0\x38\x5f\xdd\x97\x72\xa9\x6f\x55\xb1\x4e\xa8\xca\x1e\x68\x5c\xf0\x57\xfb\xad\x30\x4a\xb8\xc6\x95\x18\x7c\xda\xbe\x4f\xe3\xfa\x86\x6a\x1d\x5a\x60\xcc\x51\xce\x07\x30\x42\x45\xe9\x55\x1c\x04\x5f\xc4\x34\x96\x1d\x7c\xce\x9d\x12\x70\xa4\xa9\xf8\x7d\x1d\x28\xae\xe3\xe7\xaf\xd2\xef\x30\x2c\x01\x77\xc7\x46\x73\x09\x70\xc7\x60\x1e\x42\x66\x01\xe3\x62\xc8\x64\x5c\xf7\x0a\x04\x7a\xf2\x41\xcd\x20\x2e\x8e\xc5\xc4\xfe\x98\x23\x4a\xc8\x8e\x01\x39\x21\xab\x1f\x3d\x0f\x97\xc0\x0a\xc8\x25\x9c\xd3\x1d\xe4\x87\x54\xe3\x30\x0f\xfa\x65\xbb\xfb\x1d\x77\xb2\x92\x54\xdc\x7f\xcd\x47\x63\x60\xae\xae\x8f\xd9\x1a\xaa\x9b\x2d\xf8\x49\xe0\xe9\xc3\xce\x17\x64\xec\x78\xe9\x7b\x66\x44\xdc\xff\x3d\xe4\xfa\xbb\xfc\x38\x7d\xd4\xe0\xae\x34\xb7\x0e\xa2\xd2\x69\x6e\xd2\x33\x9d\x30\xdb\xc0\x40\x79\xc1\xfd\x02\xb2\x55\xec\x00\x6e\x98\x30\x5b\x2d\x4d\x55\xb4\x8d\xd5\x70\x40\x92\xec\x23\x47\xb8\x66\x64\x63\xc2\x83\xfa\xdb\x00\x65\x80\x0c\x57\x4a\xbe\x28\xc4\x8c\x12\x26\x04\x7c\xf2\x49\x91\x93\xb5\x88\xf1\x3b\xac\x01\xde\x99\x99\x09\x4b\x06\x62\x1f\x2f\x0c\xee\x11\x3a\x6e\x02\x0f\x1c\xa0\xc6\xe9\x5f\x66\x6f\x07\x19\x6e\x64\xc8\x70\x23\x1e\x63\xb8\xa1\x37\x06\xe7\xfd\x87\x34\x8c\x31\x86\x07\xdb\x81\x37\x05\x7f\x47\x88\x8e\xcd\x72\x60\x66\x41\xac\x8d\x8b\x6c\xc4\x93\x8a\x6c\xe4\x40\x2a\x24\x7c\xa5\xbd\x75\x84\xc9\xcb\x9b\xc2\x8f\x5f\x4e\x4a\xbe\xdd\x56\xca\x1e\x33\x77\xc7\x50\x63\x13\xe1\xba\x84\x5a\xa6\xdb\x78\x08\x07\x71\xdd\x16\x6b\x24\xf7\xe6\x03\xb5\xc7\x1d\xfc\x5d\x07\x43\xd0\xaf\x13\x62\xc9\x00\x16\x15\x35\xa2\x21\x7f\x0e\x15\x45\x31\x97\x54\x80\x23\x10\x32\x63\x13\xc0\x8a\xbd\xb0\x0a\xb5\xd4\x05\xb5\xf6\x42\x51\x27\xbe\xfe\xb5\x9c\x4c\x83\x36\xf1\xd3\xd9\xc5\xe5\xf9\x27\x79\x76\x3d\xb6\x3f\x2d\xae\x46\x40\x75\x02\xcd\xf9\xef\xaf\x11\xd4\x3e\x15\xde\xa4\x81\xb0\x15\x1a\x34\x6b\x42\xd6\x02\x0f\x69\xb3\x2d\x76\x1e\xed\xe7\xb1\xde\x65\xd1\xed\x43\x42\x9a\xb0\x3a\x4c\x16\x47\x92\x40\x46\x90\x69\x54\x03\xf0\x36\x7f\x6a\x33\xca\x41\xd6\xd0\x0d\x02\x76\xed\x4d\x5b\x30\x01\x7b\x60\x1c\xfd\x08\xf1\x81\x70\x74\xfb\xc5\x86\x10\x7c\xe3\xca\x29\x67\xbe\xbd\x71\x41\x85\x28\x0e\x10\xe0\xdb\x3a\xef\xd3\x8a\xab\x00\xbe\x35\xec\xf5\x23\xd0\x94\x2c\x08\x1a\x31\xdb\x56\x4c\x5c\x18\xb9\x73\xce\xfa\x11\x91\x67\xf8\x1a\x1b\x94\xba\xdf\x77\xd9\xf6\x1e\x5f\x57\xcf\x3a\xa5\x2e\x98\x2e\x12\x5a\x05\x1a\x81\x7c\x7c\x5c\x6a\x19\xad\x2c\x35\x0a\x06\xd3\x10\x3c\x0c\x6f\x9b\x17\x3b\xf2\xab\xe9\x04\x04\x8e\x35\x00\xb4\xd7\x19\xb2\x77\x01\x05\x3e\x75\xd9\x41\x42\xa6\x09\xbb\xd9\xa4\xc3\x4d\x61\x18\x84\x88\x9d\xc1\xe7\x93\xe3\x2e\x7c\x5f\xc7\xbc\x8a\xc2\x6c\xc3\xca\xd8\x3a\x15\xaa\x69\xd4\xea\x16\xbd\x4f\x31\x64\xeb\x3b\xf8\x5b\xf4\x60\xfb\x87\xf9\x7b\xf9\xd3\x78\xbe\x98\xcc\xa6\x0b\x46\x13\xe8\x66\xbb\xa1\x50\x61\xaa\xef\x43\x63\xe7\x3d\xd6\xed\xc0\x79\xa7\xd6\x18\x59\x23\x5e\x2a\x2b\x5f\xeb\xf9\x3a\xf5\x1f\x07\x23\xa3\x5e\x18\x01\xbd\x30\xd8\x97\xcb\x17\x21\x77\xf3\xdc\xe4\x77\xba\x84\x0b\x11\x10\xdc\xdb\xdc\x00\x08\x74\x4c\x93\x1f\x0c\xf4\x24\x95\x63\x6c\x4f\xad\xd6\xdd\x21\xcf\xca\x55\xe7\x5c\x3a\x6f\xdc\x35\xf7\xb8\x1b\x38\xf0\x69\x3a\x24\xe2\x6c\xc8\x38\x75\xa7\x8a\x7b\xb5\x33\xbe\x3b\x1b\x33\x71\x56\xdb\x0c\x36\x7a\xab\x86\x9f\xe8\xcc\x35\x01\x7e\x80\xb7\xb5\xed\xd7\x29\x4a\x15\x8c\x76\xe0\x69\x98\x28\xe2\x1a\xc7\xb8\xfc\xa4\x1f\xf9\xfd\x1e\x23\xbf\x31\x98\x02\xaa\xc6\x38\xb5\x02\x31\x5f\x5f\xd4\xbf\x2f\x28\x7f\x88\xc2\xb9\xa3\x75\xb0\xc6\xac\xc8\x2a\xc0\xae\xad\x33\x4c\x94\x59\x89\xde\xd9\xa5\x60\x91\xe6\x4a\xbb\xa1\x0a\x37\x19\x55\xb8\x89\x8e\x03\x7c\x14\xdc\x69\x56\x27\xd6\x1a\x5c\x30\x30\x48\xd9\x4a\x32\x95\xb7\x0b\xb7\xb7\xb5\x32\x5a\x1e\xc0\xc5\xe1\xba\xd3\x56\x55\xb9\x06\x5e\xec\x62\xe7\x98\x88\xe9\x93\x59\x85\x83\x72\x5d\x9f\xbb\xf0\xd1\x87\x8c\xa3\x5f\xd9\x63\x46\xc1\x1d\x3b\x75\xfe\x00\x9a\x5a\xa6\x6f\x6b\x1d\x39\xc5\x1b\xf6\x89\x81\x15\x27\x02\xd3\x0d\x26\xd2\x91\xb5\xc2\x37\xe4\x62\xa0\x6e\xbf\x6d\xa7\xc5\x50\x1f\x4a\x2a\x0f\xdf\xe5\xc8\xfd\x4d\x0a\xfa\xd1\x78\x74\xd2\x2f\xe7\x0c\xa3\x18\xfc\x88\xc7\xbc\xdb\xa0\x51\x1c\xdf\x42\x5c\x14\xc2\xb7\x41\x13\x4a\x5c\x5c\xb9\xde\xa9\x33\xc6\x54\xe2\x0f\x9e\x7a\x6d\x6e\xb5\x13\xc1\xbc\x7c\x4a\x85\x38\x9d\xfd\x34\x9e\x8f\xcf\xb0\x3e\x67\x88\xc3\x25\xc4\x57\x79\x04\x74\xc7\x3d\x53\x44\x90\x3b\x4c\x57\x46\x98\x3b\x89\x43\xdc\x99\xcd\xc9\xc4\x98\xcd\x3f\x25\x5f\xc3\xdf\x01\x5e\x9b\xa7\x70\xd1\x25\xf6\x77\x5f\xe3\xa2\x4b\xc4\x74\x36\x9d\x4c\xdf\xcd\x27\xd3\xf7\x8e\xdd\x2d\x84\xc8\x99\x4c\xaf\xc6\xe7\xe7\xe3\xd3\xab\xeb\xd1\xb9\x5d\x90\xcb\x31\x00\xe7\x00\xcd\x0a\x52\xe9\x04\x80\x40\x9f\xc4\xd5\x87\xd1\x95\xbc\x18\x7d\x02\x6c\x9a\xb1\x7c\xfb\x49\xce\xc7\xa3\x05\x5d\x53\xf3\xd1\xd9\x58\x5e\x2f\x46\xef\xc7\x89\x3c\xbd\x5e\x5c\xcd\x2e\x88\x91\xee\x7a\x8e\x30\x35\x67\xe3\xd1\xf9\x64\xfa\x3e\x75\xe8\x45\x30\x71\x06\x17\x7a\x37\x9b\x8f\xdf\xcf\x60\x61\x90\x41\xe6\x0f\xd3\xd9\xc7\xf3\xf1\xd9\xfb\xb1\x84\xd7\x46\xb4\x81\xe1\xf6\x1d\x8c\x16\xc2\xee\x92\x1d\xad\xfb\x24\xd2\xdc\x2c\xe4\xd9\x0c\x58\x8c\x68\x06\xf1\x43\x00\xdd\x67\x7e\x3d\x95\xd7\x53\x47\x54\x37\x3e\x03\x30\x9e\xf9\x7c\x36\x97\xef\xe6\xe3\x71\xea\x78\xf2\x02\xa0\xa1\x0f\x63\x39\x9e\x5e\x4d\xe6\x63\x39\x9f\x2c\xfe\x20\x47\x40\x87\x83\x68\x43\xc8\x2d\x73\x39\x9e\x03\x35\x11\x30\xd0\xbd\xeb\x0d\x7d\xb4\x58\x5c\x5f\x20\xe4\xd1\xa7\xd9\x75\x4a\x02\x38\x9d\xc9\xd3\xc9\xfc\xf4\xfa\x62\x01\x94\x35\x0b\x1c\x5f\x30\x19\xd1\xe7\x08\x0c\x50\x86\x86\x48\x02\x3d\xa8\x50\x97\x1a\x50\x30\xca\x50\x20\xc3\xf6\x43\xd3\xd1\xd5\xb5\x5d\x9a\x0f\xa3\xab\xc5\x6c\xfc\xd3\x78\xee\x05\xfb\xed\x88\xe0\xa8\x3c\x1b\x1f\x0b\x46\x22\xf6\x53\xf0\x1d\xf5\x49\xfb\x22\x98\xac\xa4\x03\x74\x64\xd7\x3f\xe0\xe7\x03\x96\x29\xa0\x29\x8c\x96\xd1\xf1\xf2\x45\xbb\xfd\x61\xf4\xd3\x38\x82\x3b\x12\xb3\xe9\x57\xe0\x8e\x00\x1b\x2b\xfe\xcd\xe9\xec\xfa\xfc\x2c\x78\x16\xca\xf8\xe8\xed\xf9\x27\x61\x85\x74\x31\x1e\x4f\xf1\x6c\x4c\x67\x57\x56\x94\xed\x7e\x9d\x31\x3f\xd2\xbb\xd1\xe4\xdc\xae\xe0\xec\x9d\x1c\x2f\x16\xc4\xc3\x48\xc7\x91\x17\x7b\xfc\xaf\xa7\xe7\xd7\x8b\xc9\x4f\x63\x31\x1f\x5f\x8c\xcf\x3e\x39\x59\x4e\x71\x1c\x5e\x21\xd8\xe5\xe6\x9d\xc2\xc5\x1d\x2f\x90\xc4\x72\xb2\xe8\xb2\x38\xba\x2d\xb5\xc2\xc1\x24\x8d\xef\x67\xb3\x33\x2b\x47\x89\xfd\xcd\x15\xb3\x34\x26\xee\xef\x67\xa3\xab\x11\x68\x28\xb7\xae\x1f\x67\xf3\x3f\x88\xc5\xd5\xec\xf2\x12\x4f\xf2\xec\xe2\xf2\xfa\x6a\x3c\xf7\x13\x9b\xcb\x8b\xd1\xf9\xbb\xeb\x29\x22\x66\x21\xb4\xd8\x68\x32\x67\xf5\x82\x74\x53\xc0\x1b\x99\xca\xc9\x54\xc4\x60\x5a\xe1\x6e\xc5\xe2\x8c\x00\x63\x8b\x2b\x18\xd6\x5e\x42\x4a\xe1\xce\x51\xc0\x49\x99\xee\xd3\x18\x01\x91\x23\x2f\xd8\xd9\x78\x31\x79\x3f\x1d\x9f\xd9\x77\x8a\xeb\x05\xb0\x47\xcd\xa6\xcf\xcf\x27\xd3\xb1\x1c\xff\xf1\x7a\x72\x09\xef\x9c\x4c\xe5\x87\xd1\xbf\x8d\xe6\x67\xb3\xeb\x85\x1c\x4f\x7f\x9a\xcc\x67\xd3\x0b\x80\x3e\x83\x0d\x1a\x2d\xa4\x55\x95\xce\x44\x9f\x5e\x9f\x9e\x8f\x47\x73\xf1\x6e\x74\x6a\x65\x0c\x48\x47\x47\x93\xf9\xe9\x7c\xf4\xee\x4a\x4e\x47\x3f\x51\x39\x8b\x23\xfd\x9c\x9d\x83\x6a\x3c\x9f\xbc\x1b\x3f\x3f\x9d\x4f\xae\x26\xa7\xa3\xf3\xd0\xec\x5f\xa4\x22\x5c\x28\x0f\x3b\xc7\x97\x1b\xe2\x8e\xb9\xf3\x14\x23\x9d\x85\xb0\x60\x3c\x7d\x41\x47\x0a\x86\xff\x6b\xe6\x0b\x77\x00\xf0\x68\x01\x19\x9b\x7b\xa7\x7d\xe0\x7c\x6c\xf5\xcf\x15\x8b\xf5\x08\x24\x02\xd0\xe1\x88\x7d\xcd\xa9\x8c\x0e\x58\x99\xdf\x14\x18\x95\xf8\xd5\xa3\x62\xcd\x69\x05\x87\x0e\x97\xa3\x12\x13\x97\xa3\xf9\xe8\xfd\x7c\x74\xf9\x21\x71\x3c\x63\xf2\x60\xef\x5a\x1f\xc8\x8b\xf1\x68\xba\x00\x86\xbb\xc0\xf1\x9a\x4c\xe5\xc7\x0f\x93\xd3\x0f\xb0\x11\x2c\xed\xa0\xa5\x22\xf9\x87\xdf\x74\x26\x75\x31\xe2\x1d\x21\x0e\xd7\x73\xd0\x78\xac\xa2\xcf\x61\xed\x2e\x3f\x7c\x5a\xc0\x50\x26\xd3\x7f\xb9\x46\x05\xcd\x67\xf2\xc3\xf5\xc5\x68\x0a\xc2\x91\x12\x35\xdf\xa0\x49\x03\x0a\x1d\x4f\xc5\x42\x8c\xa6\xa1\xba\x19\xcd\x7b\x90\x71\xa9\xdd\xbd\x6b\xaf\x83\xba\xd6\x90\xe7\x85\x13\x1f\xc6\xf3\x31\x5e\x49\x04\xbe\x17\x18\x48\x7e\x28\x04\x0c\x05\xcb\x3b\x99\x72\xd0\xe4\x77\x58\xe7\xfc\x37\x03\x8a\xcb\xd1\xd3\x58\x43\xda\x3a\x0e\xba\xa0\x65\x8b\x6d\x57\xc8\x77\xc1\x1f\x6a\x6b\xf2\x86\x08\x5d\xce\x7e\x3c\x2f\xc5\xab\x97\x32\xb3\x7e\x57\xb5\x96\x4b\xbd\xaa\x20\xe5\xa9\xa0\x83\x80\xac\x5b\xfc\x38\x52\x56\xfb\x82\x47\xd7\x33\x1a\x3a\x1d\x02\x2d\x6a\xe8\x16\x86\xda\x82\x80\x4d\x03\xed\xd9\x27\x03\xb3\x5d\x7a\x20\x19\x6a\xfe\xc1\x50\x5f\x5e\xcb\x52\x61\xf6\x8b\x02\x9b\x8c\x1d\x47\xd8\x5d\x4b\xbd\xab\x4a\xcf\xd6\x14\xf5\x6f\xf6\x30\x85\x68\x38\xce\xb5\xfb\x5d\x7a\x02\xdb\xf5\xca\x21\xcd\x2b\x63\x74\x8d\x28\x31\x58\xf2\x4b\x10\x9e\x1b\xd7\x01\xe4\xda\x49\x2e\xc1\xd7\xcd\xb7\xaa\x04\xb0\x63\x7d\x83\xf8\x6d\x8a\x52\x7d\xc1\x9f\x9f\x99\xc1\x42\xc1\xe1\x12\x1a\xf7\x4a\x23\x82\xf6\x1f\xcc\x56\x21\xe2\x2d\xd6\x34\x18\x59\x6b\x53\x15\x77\x3a\xf3\x19\xfb\xa5\x43\x2e\x85\xe6\x18\xdd\x34\x98\x6d\x3e\x22\x2a\x6a\xda\x43\x6c\xf8\xe3\x8d\x18\x9a\x69\x91\x37\x94\x6c\xa2\xac\x23\x06\x41\x19\x0d\x56\xdc\xa9\xa2\xd5\x1d\x77\xcb\xc8\x6e\xb5\x48\xb8\x42\x7b\xab\x45\x84\x2b\xe6\x6a\xd4\x67\x5d\x12\xdb\xde\x6a\x55\xb5\x30\x28\x99\x69\xdc\x57\x57\x71\xb6\x81\xbf\x54\xb5\x74\x83\xc0\x75\xda\x61\x75\x9a\xf3\x3d\x61\x67\xa1\xfa\x06\x03\x5e\x77\x14\x8b\x0a\xe5\xb0\x33\xaa\xdf\xe1\xa8\x7e\x97\x9e\x70\xc6\xdb\x0e\x4d\x97\x99\x80\x1c\xa9\x2b\xfe\x75\x70\x4b\xe0\xdf\x52\xd9\x92\x8b\xc0\x31\x3b\x71\xad\x8d\x2e\x0a\x5d\x9b\x23\x72\x3d\x6f\xd5\x9d\x16\x10\x39\x01\x88\xac\x98\x7b\x06\xa1\x81\x30\x79\xe9\x9f\x14\xa8\x08\xbf\x85\x81\x9c\xc7\xc7\x2c\xf8\x0b\xca\xf8\xef\x23\x33\x2a\x60\x96\x4e\x85\xd8\x63\x70\xdb\xbb\xce\xfd\x29\x44\xf5\xf4\x46\x70\xc7\xce\x15\x91\x9d\xeb\x0d\xe3\xd8\xc0\x45\xd6\xef\x4f\xb3\xeb\x84\x78\x4b\x27\xc8\xce\x3d\xfe\x69\x7c\x6e\xed\x88\x04\x2e\x41\x34\x9c\x02\x52\x70\x78\x0c\x32\x81\x2f\xf8\x77\x76\x26\xa1\xea\x76\x9f\x59\x5c\xdb\xcb\x0b\x6e\x08\x00\x71\x65\x2b\x17\x9c\x42\x30\x1a\x9d\xb5\x75\x35\x83\x6f\x5c\x8e\xe7\xd6\x75\x63\x57\xc2\x7b\x10\x43\xd0\xa5\x62\x2f\xb7\x38\xdf\x27\x1f\x46\x76\xea\xc0\xd7\xfd\x98\x87\xcb\xdf\x13\xc3\x56\x2a\xc0\xdf\x3e\xd9\xfa\xe4\xd9\x23\x11\xfc\xf9\xb9\xe4\x35\xbc\xb0\xde\x72\x34\x4a\x7c\x99\x5d\x08\x76\x1c\xdc\xf2\x7c\xa2\x0d\xb2\x16\xbf\x00\x8b\x1f\x99\x65\x9f\x86\x96\xca\xb7\xec\xa0\xac\x09\x22\x7c\x9f\x5d\x81\x71\x01\xd9\x87\x0e\x25\xed\x78\x74\xf5\x01\x08\xd4\x61\x3b\xbc\x41\xd0\xb1\xe9\xec\x3b\x05\x8c\xf6\xd9\x22\xf0\xae\x3a\x68\xba\x31\x82\xae\xe3\x72\x5d\x74\xfd\x8a\x54\x2c\x66\x17\x63\xf9\x2f\xd7\xf3\xc9\xe2\x6c\x42\x76\x1b\xf9\xca\xa3\xf3\xf3\xd9\x47\x7a\x28\xf8\x29\x68\xb8\xc6\x33\xf4\xa2\xb1\x57\x32\x12\xb9\x98\xe1\xe2\xf8\xe7\xd8\x7d\x0a\x1e\x64\x2d\xa5\x70\x6d\x84\x35\xea\x10\x05\xe2\xa5\xbc\x4e\x17\xa9\x7c\x6f\x65\x1d\x8c\x3e\x39\xb6\xa7\x73\x31\x9e\x33\x5f\xeb\xb1\xbc\x98\x2c\x4e\xc7\xe7\xe7\xa3\xe9\x78\x76\xcd\xbf\x3d\x01\xab\x74\x36\x75\xfb\xf5\xce\x99\xa3\xa9\x10\x23\xe3\x90\xe8\xfa\xd1\x71\xb6\x54\x82\x0b\x8b\xfb\x3b\xa8\x11\x04\x2e\x9e\x6d\x55\x42\x7a\x04\xf2\xc7\xd8\x05\x82\xf9\xb7\x18\x50\x6c\x7f\x9d\x68\xd5\x36\xdc\xd3\x8b\xe5\xf7\xee\xde\xde\xcf\x7f\xc8\xe5\xda\xa0\x7f\x21\xcc\xef\xa8\x26\xfa\x85\xbf\x9d\xea\x2d\xd3\xe1\x63\x83\x0b\xca\x4d\x84\x4a\x2c\xa0\x50\x54\xff\xdc\xe6\x98\x85\x85\xce\x8b\x54\x30\x87\x22\x59\x59\x21\x75\x22\xd7\xe8\xc9\x28\x4c\x17\xe0\x70\x63\xb3\x3b\xf1\xb0\xd9\xd9\xb9\x82\x0e\xdc\x2a\xf8\x9f\xf1\xbf\x82\x80\x02\x5a\xc1\xc1\x55\xa7\x77\x1c\x56\x00\x32\x43\x03\x25\xcb\x43\xc1\x4b\xb6\x2f\xc4\x71\xfa\x4a\x1e\xda\x4f\x39\xc0\x81\xa3\x37\x2e\xec\x5c\x56\x0d\xe1\x93\xf1\xe3\x29\x52\x3b\x5c\x52\x20\x5c\x64\x94\xe3\xf7\x58\x8a\x17\x55\xcb\xfb\x44\x85\x6a\x60\x62\x04\xc1\x75\x7f\x7f\x9f\xae\x4c\xba\x36\x6d\xaa\xb3\xf6\x85\xd4\xe5\x8d\x2e\x74\xf9\xc2\x54\x6a\xcb\x97\xf5\x6d\xb3\x29\x84\x58\x38\x38\x8b\xa0\x15\xc0\x47\xf0\x83\x56\xef\xb8\x57\xc0\xee\x1b\x07\x2a\xb1\x5f\x46\x74\x03\x95\x31\x36\x78\x4c\xfe\x1f\x50\xff\xa7\x72\xa1\x75\x9c\x74\xa1\x2a\x7a\x42\x4a\x5c\xc9\x42\x95\x37\x2d\x40\x9e\x41\xcc\x3d\xa0\x19\x75\x5c\x6e\x8c\x74\xd2\x1d\x39\xb5\x69\x74\xda\x8f\xd7\xc1\x5e\x2e\x7c\x43\xef\x8f\xd2\x34\x99\x5d\xa3\xf4\x36\xe1\x7f\x9e\x04\xff\x4e\x57\x89\x70\xbf\x5e\x05\xbf\xde\x6e\x83\xcf\xe3\x4f\x04\xa7\x03\xdf\xe6\x7f\xaf\xfc\xbf\xff\xbd\xd0\xbf\xa4\x45\x22\xdc\xcf\x3b\xb5\x5a\xa5\xbb\x44\xea\xba\xae\x6a\xf8\x1a\xfd\xcb\x7e\x69\xb7\x59\x56\x05\xfc\xd3\x5a\x92\xee\x41\x59\xb5\x3a\x81\x7d\xc4\x7a\x27\xf7\xab\x6d\xb6\x4e\x40\x14\x6e\x74\x63\x9f\xc4\xff\x84\x21\x17\x38\xa1\x22\xd3\x3f\xb7\x9a\xfe\x5d\xe4\xa6\xa1\x7f\xde\x41\xb1\x5a\x7a\x6b\x67\x5a\x18\xfb\xfd\xbd\x4d\xa2\x43\x08\x08\x56\x52\xe6\xd5\xd2\x9a\xf4\xa3\x54\xde\xa9\x52\x8e\x51\xf6\x52\x79\x49\x2d\x3a\x22\xe8\x2d\x18\xfc\xa8\xc4\xfa\x45\xc6\x6f\x3e\x3c\x3d\x92\x27\x2f\x5f\x1e\x3f\x3f\x79\xf9\xf2\x75\xfc\x0d\x41\xdf\x48\xe4\x7b\x04\xf4\x91\x79\xb9\x42\x4f\x0a\xf9\x58\xe5\xdc\x93\x09\x4a\x19\xaa\xa7\x43\x73\xf4\x23\xfc\xee\xe0\xdf\xf7\xfc\x97\x1e\x08\xf1\x5f\xa6\x55\xa3\x7f\x84\x16\x5a\xa8\xa3\x66\xf5\xe0\xd3\x08\x58\xc5\x04\x19\x0e\x53\xd8\x77\x16\x04\xd6\xd2\x44\xdf\xe1\xa4\xe7\x60\xa9\x0e\x74\xe9\xf7\x96\x73\xe5\x2a\xa5\xcc\x2d\xd4\x0a\x52\xd7\xb2\xd8\x33\x92\x5a\xf9\xae\x3c\xf7\xf2\x35\xe0\x88\xd2\x3b\xe3\x9d\x0a\x1b\x69\xa8\xc2\xa0\xd3\xe9\x96\xfe\xd7\xbe\xca\x7c\x8b\x2b\x79\x70\x19\x60\x60\xb8\x9e\x78\xbd\x59\xea\xcc\x65\xd9\x73\xe3\x6b\x2a\x4c\x07\xed\x2a\x15\x82\xe5\x21\xec\x35\xc1\x0f\xed\xdf\xff\xdf\x0f\x4b\x4c\x22\x9e\xb0\xff\xdd\x10\x10\x18\x09\x97\xf3\xd9\xd9\xf5\xa9\x55\x5a\x80\xc8\x0f\x31\x0c\x17\xe3\x7f\xfb\x49\xbe\x1f\x4f\x27\x3f\x4d\x46\xd6\xf2\x70\x89\x09\x0a\x8c\x89\x80\xdf\xc0\x27\x4d\xa2\x5c\xcb\xdb\xeb\xab\x6e\xbc\x54\x0e\xe7\x5a\x44\x3f\xd7\x02\xef\xfb\x5a\xae\x45\xda\xc9\xb8\xf0\xc8\x59\x1c\xfb\x44\x33\xd0\xc7\xf4\x64\x3f\x94\xef\xe3\xf7\x03\x91\x7c\xe1\x6c\x72\x17\xd2\x4f\x7a\x31\x7d\x67\xec\x1e\x3e\x3e\x71\xb1\x37\xba\x8a\x61\xdb\x30\xb4\xfa\xc6\xd9\xe8\xd7\xd6\x93\x39\x1b\x5d\x8d\xe0\xc5\x14\x48\x7e\x63\x97\xfe\xed\xf5\x62\x02\x4b\xe3\xb2\x28\x93\xd9\xf4\x48\x7e\x98\x7d\x1c\xff\x64\xad\xf1\xd1\xf5\x62\x7c\x06\x6b\x48\x84\x09\x44\x95\x10\x1a\xca\xce\xc3\x12\x93\x30\xc1\xd0\xcd\x1c\xc0\xbb\xf7\xe7\x1a\x22\xbf\xeb\x48\x70\x62\x21\x48\x27\x38\x32\x85\x20\x1e\x19\x44\x89\xbd\x77\x10\xf3\x25\x88\xfd\x1e\x40\x7a\xf0\xab\x11\x35\xd3\x17\x17\x93\xab\xe7\x6b\x7d\xfb\xf7\x02\x7f\xfc\x2a\xfe\xe3\xcb\x93\xe3\x93\xe3\x2e\xfe\xe3\xcb\xe3\x93\xdf\xf0\x1f\xff\x11\xff\x5d\x7a\x3e\xf4\xdc\x44\x08\x0f\x3a\x4b\xe4\xda\x5a\xf8\xd5\x9a\x2a\xa6\x13\xa6\xa5\xd9\xea\xda\x54\xdc\x06\x02\xa1\x4b\x30\x3f\x5d\xb8\xcf\xa9\x7e\x68\xf1\x73\x68\x34\xdd\x72\x70\xb8\xe0\xd0\x34\x66\x7b\xeb\xe0\x08\x5e\x92\x69\x55\x08\x77\x27\xd2\xc3\xb8\xcd\x35\x60\xe3\xfd\x4a\x17\x6c\xd0\x42\xc5\x1d\xe6\x76\x9c\xbe\xb9\x7c\xa3\x61\x5a\x54\x41\x93\x44\x34\x6e\x3e\xea\x9a\x70\x51\x90\xd1\x80\x92\xb8\xcd\x75\x50\xdb\xc5\x8d\xc8\x31\x63\x12\x2e\x91\xc1\x2a\x28\xaa\xb5\x0d\x8c\x4a\xb9\x6e\xeb\x12\x11\x79\xed\x74\x2b\x69\xaa\xa4\xeb\x55\x78\xfe\x61\x8f\xaa\xff\x63\x48\x19\xdd\xe5\x75\xf3\xcc\x0b\x01\xcb\x3d\xfd\x29\x40\x5f\x77\x35\x6f\x22\x68\x58\xea\x4c\x07\x7b\x01\x1b\xd3\xaf\x4c\x95\x6a\xc5\xdd\x37\x1b\x07\xeb\x2e\x5c\xb5\xd3\xbe\x82\xd6\x1e\xa2\xa5\xe1\x62\x97\xdc\x04\x5b\xac\x8c\x68\xcd\xc0\xc5\x1c\xe7\xd8\xad\x83\xd1\xaf\x81\xe8\xd0\x0e\x39\xbe\x21\x41\x17\x6b\x70\x09\x0f\x5c\x45\x5d\x26\x9e\xa1\x32\x07\xba\x77\xc5\xfe\x7b\x17\x32\xb1\x51\x99\x43\x1a\xb1\xf8\x74\x2f\xdf\xa1\x44\x3a\xdc\xda\x49\x18\x2e\xc2\x50\x52\xff\x82\xc2\xdb\x84\x92\x5d\x02\xc2\x71\x7c\x5b\xc1\xc5\x34\x9c\xdb\x7e\x37\x87\x72\x08\xbc\x7d\x30\xc3\x7d\x3a\x9b\x4e\x89\x76\xc8\xae\x6a\xbc\xf8\x21\xc1\x0f\x8f\x85\xea\x27\x16\x68\x32\xf9\x0f\xff\x06\xe9\xfc\xff\xb3\xff\xd2\x17\x99\xde\xd6\x1a\x10\x62\xff\xfd\xfc\xfd\xe5\xf9\xf3\x93\xf4\xe5\xff\xfa\xb7\x35\x06\x1e\xbf\xff\xbf\x7f\xf9\xea\xe5\xf7\x9d\xfb\xff\xbb\xe3\x93\x97\xbf\xdd\xff\xff\x88\xff\xde\x4f\xaf\xe5\xf9\xe4\xed\x7c\x34\x07\xb7\x66\x3c\x87\x12\x91\xb7\xe7\x93\x53\xce\xd6\x7a\x34\xe8\x93\x44\xfe\x4b\x5b\x6a\x79\xfc\xfb\xdf\x1f\x77\x5c\x31\xf8\xd5\x3b\x6b\x2d\x38\x5d\xfe\xce\x3a\x99\x94\xbc\x9a\x94\xab\x54\x88\xef\xec\x47\x54\xf9\xb9\xc8\x4b\xb9\x68\x12\xf9\x2e\x5f\x37\xb7\xf2\x5d\x51\x55\x75\x22\xdf\x56\xa6\xb1\x1f\xbd\x18\xc9\x97\x27\xc7\xc7\x2f\x9f\x5b\x23\x30\x91\xd7\x8b\x91\x10\xe3\x3b\x5d\xef\xaa\x12\x2e\x4e\x0f\x9c\x0f\x21\xbe\xed\xae\xdb\x70\x70\xa7\xeb\xa5\x6a\xf2\x4d\x74\xb3\x79\xbc\x65\xd7\xd4\x8f\x38\x26\xd0\x91\x0f\x15\x86\x8d\x2f\xec\x2c\xaa\x7b\xb8\x83\xfe\x0b\x64\x8f\x73\x04\x7a\x58\xe7\x35\x64\x3e\x09\xc7\xa2\x57\xec\xb8\xac\x55\xbd\x93\xef\x2f\xcf\x53\x39\xc1\x67\x41\x7d\xaf\xce\xe4\x89\x5c\x6a\xc0\x22\x10\x79\x23\x6f\x2a\xa2\x1b\x71\x4f\x38\xe1\x67\xb8\xf2\x6c\xfb\x90\xff\x2a\xc4\x65\xad\xd5\x66\x59\x68\xbc\xf3\x5d\x7e\x0f\xa0\x02\x2b\xd3\x04\x66\x16\x20\xcf\x22\x91\x0a\x58\x0f\xea\xb3\x96\xea\x5e\xed\xb0\x0a\xd4\x5a\x71\x19\xf6\x52\x03\x98\x18\x04\x65\x11\x8a\x40\xe6\x0d\x90\x5d\x22\x80\x19\x50\x74\xdf\x6a\x69\x85\xe2\x3d\x82\xdd\x76\xa2\x9a\x86\xfa\x9d\x28\xf0\xda\x54\xe2\xa6\x55\x60\x2d\xea\xe1\x77\xc9\xe0\x5d\x60\x4d\xf2\xa0\x9f\x3f\xf7\xbc\x35\xd8\xde\x21\x42\x14\x3d\xf8\xec\x9a\xda\x12\x72\x44\x29\x84\x2e\xfd\x10\x3b\x9b\x19\x9a\x68\xe9\x07\x47\x9c\x84\x85\xe9\xd0\xeb\x40\x94\x1c\xc5\x4e\xe0\x9a\x81\x69\xba\x4f\x76\x03\xa4\x19\x32\xf0\x3c\x09\x24\xee\x39\xd0\xc7\xdc\x56\x46\x0b\x62\x1f\x95\x99\x5e\xe5\x59\x50\x4a\x8d\xf1\x9a\x95\x2a\xb9\xb4\xda\xce\x8b\xea\x73\xe9\x09\xd6\xea\xad\x52\x21\x3e\xde\xea\x52\xde\xc3\x18\xd5\x67\x80\x40\x0d\xd7\x2c\xb1\x7f\xc2\xc6\xe6\xb5\xae\x6b\x6a\x7e\xa4\x25\xc7\xe6\xa7\x6d\x0d\x00\x88\xb3\xb6\x16\x8f\xed\x60\x28\x2d\xe1\x26\x50\x59\x30\x13\xcc\xf1\xb3\x45\x1c\xb5\xf7\x27\x2b\x1a\x9e\x3c\xa4\xcd\xae\x6f\x34\x35\xe0\x58\x67\x40\xd7\x77\x50\xd8\x0f\x4c\xc9\xe2\x3e\x37\xb7\x47\x89\x7f\x15\x75\xa0\x47\x18\x92\x55\x0d\xab\x75\xa3\x1b\x38\x96\x48\xb1\x7c\xaf\xca\x06\xa0\x30\xf9\xab\xc2\x7e\x86\x44\x2b\x0a\x38\x51\x11\xf8\x36\xd7\x2b\x1c\x65\x0e\xf1\x74\xc0\x6e\xb5\xe3\xa5\x3e\x73\xf3\xc6\xf5\xe2\x41\xcb\x16\x80\x0e\xec\x68\xa7\x32\xb0\xc1\x31\x32\x5f\xde\x80\xe0\x55\xf6\x8b\x8d\x35\xd0\x61\xef\x88\x29\xd4\x6e\x49\xa9\x83\x95\x0c\xdc\x13\xb2\x71\xd7\x55\xbd\x04\x2a\x26\xd0\x61\x4d\x25\x32\x5d\xc2\xd1\xa4\x57\x78\x82\x51\x2b\x5e\xe6\x33\xfe\xa9\xb2\x7b\x52\x6b\x17\xbb\xc6\x4f\x01\x9a\x8f\x89\xdf\x22\x98\x7e\x18\x01\x49\x74\x0d\x29\x81\x28\xab\x92\x93\xde\xb0\x4f\xce\xbb\x94\xd5\x7e\x3f\x45\xa0\xca\x10\x8e\x11\x3f\x4b\x90\x07\xd0\x17\xf2\xae\xaa\xa5\xfe\x05\xb0\xdb\x93\xc7\x9e\x25\xa3\x67\x31\xf0\xf1\x4d\xad\x9a\x1c\xe6\xba\xae\x6a\x01\x2d\xb8\x89\x74\x0d\x73\x8e\x86\x3a\xe8\xa5\x05\x74\x04\x5f\xb4\x43\x94\x01\xf2\xc6\x8a\xe8\xae\x6a\xd3\x4e\x77\xa1\x17\xe4\xe6\x56\xef\xe0\x5c\x25\x4e\xc8\x02\xc1\x42\x89\x71\x32\xe7\x98\xbc\x8b\xbc\xfc\x2c\x14\xcb\x88\xef\x5a\x72\x33\x71\x83\xa5\x7e\x3c\xcc\xd3\xe8\x46\xcb\x0a\xdd\x37\xf4\x6b\x89\x09\x3e\x98\x48\x50\xdf\xbf\x83\x61\xd4\xda\xbe\x0c\xca\xcc\x07\xde\x83\x38\x16\x84\xa2\x41\xc8\x33\xdc\xa2\xcd\xb7\x0d\xd6\x37\x20\x60\x2b\x5e\x62\xa9\x1c\x95\x99\x1f\xa3\xb9\xad\xee\xf1\x05\x24\xcd\x50\xa8\x04\x23\xd1\x3b\x01\x12\x8f\xe5\x3d\x24\x5d\x42\xcc\xda\x9a\xa0\x71\x91\xa8\x16\x24\xde\x3e\x3b\x10\x7a\xe8\x3d\x69\xee\x2b\x84\xaa\xf8\x51\x1e\x1e\x1f\x05\xce\x68\x38\x0b\xb8\x6a\x0e\x4f\x8e\x08\x78\x09\x65\x3e\x20\x3f\xc0\x8a\x0c\xbb\xed\x06\x57\x1f\xd0\x44\x03\xf7\x95\x2e\xf9\xd0\x35\x67\x58\xc4\x00\x87\x83\x5e\x97\x0a\x31\x2a\xac\x27\x6d\x45\x1d\x92\xa5\x41\x0d\xc7\x33\xe3\x66\x63\xed\x8c\x7b\x8d\x1a\x85\x8f\x2d\x1f\x1b\xd8\x22\x4d\x06\x87\xf0\x4d\x51\xce\x5f\x45\xe2\xc9\x88\x9e\xca\xe9\x3a\x50\x2f\x3c\x18\x2b\x51\xc1\xe0\x44\x6e\x7c\x57\x0a\x70\x2b\x6c\xb4\xd5\x07\xba\xa0\x9c\xea\x56\x21\x28\x6d\x30\x38\xc4\x5a\x76\x12\xd4\x54\xa0\xa4\xb0\xbc\xe9\xde\xc9\x12\x68\x6b\x32\x5e\x9a\x90\x3a\x83\x2c\x8c\xc4\x89\x1e\x75\x34\x2e\x0b\xbd\x81\xf4\x29\x76\xa7\x42\xb7\x0a\x5c\x69\x01\x61\x56\xad\xd7\x05\xb4\x22\x95\xf1\x33\xe9\x92\x7b\x26\x6b\xbd\x6d\x1b\x07\xba\xf4\xce\xfe\x11\x28\x18\xca\x5d\xa4\x65\xd1\x7c\x82\x60\xbe\xbd\x6f\x20\x29\xab\xa0\x53\x0d\xd6\xc0\x05\x05\x20\xd3\x9a\xca\x8f\x1a\x6e\x08\xd0\x84\x77\x55\xce\x10\x4a\xe5\x8d\xae\x19\x73\x7b\xb3\x55\xa5\x55\x31\x11\x81\x66\x7c\x11\xc1\x2c\x3c\x8c\x6e\xb1\x13\x94\x27\xed\x60\x85\xd8\xcb\x04\x48\x97\xb9\x8e\x0d\x61\xf9\xab\x7a\xc3\x75\x4e\x6e\x16\x65\x53\x85\x9d\x9e\xce\x58\x01\xd2\x8a\x6d\x8d\x75\x4d\x56\x08\x60\xf7\x1c\x0c\x1f\x40\x34\xc7\x2d\xce\x34\x06\xee\xde\x63\x2a\x2b\xc8\xe1\xb3\xe0\x3d\x23\x59\x6a\xb1\x86\xcc\x6e\x88\xa3\xbc\x02\x30\xb2\x22\x15\xe2\xc2\x1a\x81\xd6\x56\xf3\xf6\x81\x0f\x87\x81\xa9\x13\xd8\x17\x80\xb6\x7b\xc7\x2d\xd3\xb1\xb9\x39\xbd\xde\x63\x2c\x70\x97\xfc\x3d\x62\xe5\xa0\xc9\x60\xc7\x09\xc5\x02\xcd\xce\x5d\xa5\x54\x68\xc9\x76\x99\x60\x2b\xf2\x57\xd8\x66\x7c\x00\x03\xa3\xcc\x0d\x3f\x8d\x29\x53\x72\x23\x7f\x6e\xf3\x46\xf7\x7b\xf5\x83\x59\x55\xa5\x7e\x83\xdd\x91\xb5\xc6\x26\x42\x95\xc9\xbc\x11\xc4\x3f\x8a\xf6\x5c\x56\x95\xcf\x1a\xa9\x8c\x69\x37\xda\xed\x10\xd6\x19\xe4\x25\xf9\x04\x0d\xd1\x5c\x4a\xe5\xf2\x74\xfc\x12\x51\x44\x09\x65\x2c\xcd\x73\xfb\xaf\xa4\xd1\x00\x27\xae\xbb\xcc\x39\x00\xe7\x11\x6d\x10\xbe\x88\x4e\xb4\x58\x16\x2d\x71\xd9\x42\xeb\x20\x71\xdd\x59\x71\x00\x69\x46\x8d\xc5\xd5\x23\xa8\x07\xed\x90\xad\xb9\x9c\x65\x64\x16\xba\x3b\x0c\x51\x86\x72\xa8\x56\x85\xee\x31\xb8\x26\xce\xf3\xf2\x33\x86\x6e\xa3\xab\x4e\x05\x57\x36\x05\x54\x9d\x8b\x64\xef\x33\xf7\x57\xa8\xbf\x20\x83\x1a\x6b\x3b\xc3\x37\xc4\x37\x59\x99\xd9\x8f\xab\x52\x15\xd5\x4d\xd5\xc2\x6e\xd7\x6d\x59\xe6\xe5\x8d\x50\x5d\x51\x82\x49\x04\xe0\x8a\xf4\xeb\x00\x42\x03\xca\x1d\x1a\xfd\x0b\xa0\x69\x41\xae\xdf\x5e\x1a\xc2\x78\x8f\xc0\x5e\xab\x3a\x0b\x3b\xf9\xed\xeb\x99\x5c\x22\x83\x82\x95\x44\x2a\x84\x51\xc3\x76\x42\xe7\x82\x51\x07\x59\x34\xf8\xf8\xb4\x0c\x8a\xb2\x6c\xac\x8a\x03\x44\x76\x85\x90\x54\xa9\x10\x6f\xd1\xed\x73\x2e\xa8\xdd\x56\x7b\x00\x83\x5d\x4d\x82\x05\xfb\xca\x2b\x40\x41\x78\x81\xc9\x72\x84\x08\x41\xcd\x95\xdf\xe9\x02\xd6\x70\x53\x35\x81\x22\xb4\x3e\x18\x14\x00\x91\x07\x8a\x8e\x63\xc6\xd9\x7a\x23\xf8\x29\x0c\x7e\xed\x8f\x9c\xfc\x08\x15\x30\x14\x2d\x26\xb3\x4b\x7d\x06\x40\x00\x47\xf2\xba\x81\x1b\x9f\x5e\x2b\xe8\x6d\x56\x32\x1b\xe8\x6c\x75\x7b\xd6\x96\x6c\xb0\xc2\xb1\x46\xd1\xab\xd6\x00\x39\x1b\xd9\xe4\x84\x80\x93\xe9\x6d\xcd\xb6\x20\x78\x7e\x98\x5b\xa8\x4c\xf0\xc9\x6a\x2d\x31\xa6\x5d\xea\x75\x1e\x68\x00\xbc\x0a\x1a\x40\xf1\x8f\xcc\xd0\x1c\x19\x41\xa9\xa7\x2f\xe5\xf6\xe5\xc7\x34\x54\x54\x66\xe4\xa3\xfb\x7e\x01\xc3\x49\x08\x37\x34\x72\xfd\x02\x73\x00\x74\xf0\xfd\x6d\x0e\xa8\x07\x90\x7e\x76\x36\x15\xbb\xcc\x80\xc7\x03\x15\xae\xd5\x5a\x30\x99\xab\x7b\x5e\xe0\xe8\xc4\x8f\x25\xb5\x05\x6e\xf9\xaa\xaa\xb7\x55\xcd\x6c\x4f\x76\xae\xa9\x38\xfc\x48\xea\x08\xf9\xa1\x75\x29\xc1\x26\xac\xa4\x5a\xdd\xe6\xfa\x8e\x6a\x8f\x94\x35\x34\x6e\x54\x9d\x19\x87\x72\x98\x97\xf2\x56\x2b\xeb\x7e\x20\x61\x80\x58\xb6\x8d\xd7\x6d\xf8\xe5\x8c\x04\x7e\xe0\xbb\x50\x25\x8c\x90\x77\xeb\xb6\x5c\x85\x1d\xf1\x82\x16\x3d\x3d\x82\x22\x8a\xdb\x6a\xab\x03\xfd\x97\x93\x15\x52\x58\x85\x6d\xfd\x5b\x65\xac\x25\x1c\x52\xeb\xb0\xe7\x19\x5c\x10\xa0\x80\xb7\xd6\x58\x32\xc3\x3c\xe2\xa0\x74\xad\x2d\x49\x05\x71\x01\x2a\x0e\xf4\xf4\x87\x10\x8b\x98\x7a\x49\xe5\xa5\xda\x49\x80\xe5\x02\xf0\x95\xd2\xd3\x71\xfa\xab\x67\xe5\x15\xb1\x92\x07\x50\x0a\xb7\x54\x68\xc7\x85\x0a\xf3\x00\x73\x27\xf4\x09\x98\x69\x6b\xb4\x09\x15\xe5\x01\xa2\xb2\x03\xeb\x6f\xed\xbb\x66\x91\x55\x01\x01\x1f\x85\x13\xf2\xc0\xb1\x42\x3a\x12\x2d\x0b\x40\x32\x44\x58\x9e\x7b\xa0\x95\x6f\xaa\x1b\xf4\xba\xba\xde\x45\x2a\xc4\xd4\xf5\x01\xe3\x2d\x17\xe1\x4a\xb8\x5b\x80\x99\x78\xf7\x59\x0e\x78\x68\x44\xe7\xd0\x84\x45\x27\xdc\x08\x4d\x51\x17\x7b\x2d\xdb\xcd\x1a\xcf\x2f\xb0\xc8\xf9\x74\x36\x3d\x43\x82\x2d\x2c\x8f\x9c\x5d\x7e\x82\x62\x81\x08\x86\xd7\x7e\xf0\x62\x76\x36\x79\x47\x2d\x31\x42\xbc\xec\xb4\x76\x8c\x1c\xbd\x6f\x60\x52\x40\x87\x39\xab\x42\x9e\x91\xa7\x21\x40\xea\x16\x06\x1e\xd8\x16\x6a\xe5\xa7\xe8\xdd\x99\xdb\xaa\xc8\x10\x3c\x06\xa3\x3e\x68\x00\xe7\xff\xa1\x19\x93\xdb\xa8\x1d\x5e\xaa\x62\x00\x40\x77\x0f\x5d\xfa\x57\xd4\x8e\x38\xc4\xa6\x7a\x05\x58\x26\x07\x61\xf9\xe5\xc1\x11\xa1\x0d\x90\x2d\x81\x77\x5b\x96\x11\xa5\x85\x32\xf2\x60\x57\xb5\x07\xd6\x15\x92\x07\x4e\xf8\x98\x6a\x69\x45\x14\xe7\x18\xb8\x74\x6b\xe3\x0f\x28\xf9\x56\x99\x6a\xac\x61\x60\xcd\x17\x9d\x09\x53\x01\x13\x14\x89\x42\x79\xa7\x4b\x02\x9b\xa0\x8b\x16\x2d\x87\xfe\xa5\x6d\xb8\xcb\x1e\x30\x01\xaa\x8d\xf6\x5a\x3c\x7a\x23\xbc\xee\x08\xce\x7a\x55\x6f\x82\x7b\x9b\xcf\xf5\x01\x2d\xd7\x81\xbd\xc8\x8a\xea\x3e\xc1\x08\x98\xdf\x64\xab\x2d\x7b\x3b\x5d\xd5\x21\xb5\xd4\xad\x32\x58\xf5\x3f\xb8\x3d\xac\x34\x52\x39\x1a\x38\xc5\xbc\x5d\x8e\xe1\x0d\xea\x16\x45\x18\x7d\xe4\xa6\x01\x6f\x52\xc0\x53\x98\xcc\x82\xa5\xa9\x50\xf7\x3f\xd2\xb1\xc3\x88\xa4\xb2\x36\x86\x80\xcf\x06\x28\x43\xdd\x27\x33\x94\x35\x46\xb3\x5c\xe1\xa4\x8b\x75\x13\x87\x40\xdc\x97\xce\x8e\xb2\x0b\x0f\x65\xd2\x34\xb5\xb2\xe3\x58\x57\xf5\xbd\xaa\x33\xe8\x73\x81\x35\xa4\x88\x26\xd5\x54\xa6\xf2\xf0\x03\x94\xd9\x42\x10\x22\x71\x4f\x20\xf8\xd9\x08\xf7\xa4\x93\x73\xcf\x4b\x27\xed\xf2\x20\x1c\xce\x41\x7a\x24\x04\x33\xe4\xac\x80\x21\x07\x55\x0d\xcc\xfd\x6b\x64\x39\xf0\x21\x4f\x92\xd3\x99\x28\x80\xf4\x21\x35\x48\x60\xc0\xba\xc0\x4c\x18\x5b\xa4\x93\x40\x41\xa5\xf0\x2f\x14\x6d\x16\x4f\x25\xd7\x91\x8f\x91\xeb\xd8\xcf\x63\xbd\xea\x37\xb0\xec\x74\xa2\x67\xf6\x2c\x5b\x0b\x0f\xc3\x78\x01\xcc\xfe\xd3\x6e\x33\xa2\x2b\x6f\x58\x8b\x77\xb1\x29\xde\x60\x14\x01\x22\xa7\x6d\x63\x72\x70\x5a\x8d\x34\xab\x6a\x4b\x54\x3a\x0a\x21\x49\xc8\x66\x0f\x3c\x0b\x6f\xbb\xb2\xb0\x52\x18\xc2\x5b\x7b\x68\x41\x57\x6d\xb3\x6d\xc9\x46\x23\xa4\xa7\x20\x3e\xc0\x03\x63\x44\xb9\x1c\xa1\x24\x1b\x62\x78\xf4\x65\xdc\x72\xef\xc9\x94\x87\x79\x99\xe9\xad\x35\xd4\xc0\x3e\x10\x64\x39\xfa\x92\x68\x1a\x1f\x38\x0f\x55\x05\x84\x3f\x8e\x87\x3e\x6f\x8e\x80\x9a\x8c\x97\x16\x4f\x67\xdd\xda\x9d\xb5\xcf\x34\xc2\xfa\x5f\x0c\xce\xc1\xcf\x02\x64\x36\x24\xca\x62\xd8\x0e\x9a\x53\x7c\xbf\x87\x9f\x07\xfe\x1f\x8f\x50\xf8\xd4\xfc\x95\x7b\xc8\x33\xd3\x15\x6b\xa4\xed\x54\x26\x8a\xa6\x23\x65\x14\x08\xec\x46\x67\x79\x1b\x50\x1b\xf9\xd0\xbb\x5d\xd9\x6d\xbe\x6a\xab\xd6\x14\x30\x0c\x11\x20\xcc\x16\x1e\x1a\xa7\x62\x72\x45\x1c\x6d\x84\x43\x3b\x58\x83\x02\x60\xa6\x2a\xdf\xe8\xda\x2a\x7c\x0e\x93\xbd\x91\x9f\xb5\xde\xda\x53\x63\xe5\x89\x4f\x20\x57\xc0\xc2\xa8\xe0\xe8\x77\x49\xe1\x29\xf1\x82\x94\x4c\x4b\x03\x26\x17\xb5\x9b\xf9\x47\x77\x16\x71\x0f\x7a\xbc\x2a\x2a\xaa\x14\x0a\x75\x77\x88\x92\xd6\x81\x86\x24\x30\x96\x9d\xc9\x57\xd6\xd9\xc4\x73\xc0\xdc\x8d\xb5\x2f\x7d\x42\x29\xdf\x55\x2d\xd8\x00\x8a\x52\x04\x15\x63\x94\xdb\x59\xb9\x68\xa1\x8f\x42\x42\xe0\xe9\x17\xce\x8e\x21\x8c\xbe\xb6\xe6\xd1\x89\x17\x11\x8a\x72\xc2\xf3\x70\x4e\xf5\xb0\x64\x38\xe6\xbd\xe8\xa6\x10\x10\xe0\xe2\x88\xd6\x23\x07\x88\x09\xa4\xfa\x02\x09\xe7\x35\xd6\xb7\x7c\xb3\x0e\x58\x37\x8c\x95\x75\xcc\xbd\x7b\x7d\xb9\x03\xdb\x66\xa3\x35\x08\x81\x70\x44\xaf\x51\x95\x13\x76\x86\x2a\x74\x10\x5c\xd8\x14\xaf\x0a\x80\x5d\x45\x96\xfa\x25\x44\x59\x3a\x17\x7f\x2a\xc4\xf2\x48\x76\x60\xe0\x31\x85\x6b\xf5\xba\x7b\x1a\xb0\x3e\xd5\xf5\x2e\xc0\x5e\x67\x69\xb4\xee\x23\xaa\x36\x4a\x0e\xe1\x26\x65\xc1\x63\x42\x7c\x77\x19\xe3\xbb\x0b\xb1\x1a\x7c\xff\xfd\x6d\xe5\x31\x6b\xd1\x11\xa8\xc2\x10\xa0\x15\x1c\xc7\x14\x06\xb6\x4d\x51\x08\x0f\x25\x6e\xf7\x7c\xbf\x3d\xc9\x81\xa8\xec\x48\x4e\x80\xeb\x50\xad\x30\xb0\x42\x37\xb2\x9b\x36\xcb\x4b\x60\x42\x39\x73\x0c\x8d\x0d\x8c\x99\x54\x6b\x01\x66\x20\x8e\xd1\xb4\x60\x57\x23\x65\x6c\x39\x64\xed\x75\xb4\x1e\xbf\x3f\x21\x20\x43\xb8\xb1\x14\x10\x9c\xa9\xfa\x06\x52\xf0\x1c\xf2\xbe\xe7\xde\x56\x3f\x66\x6b\x64\xdc\x55\x9f\xed\xfd\x01\x9d\xaf\xbb\x10\x11\x50\x28\x79\x53\x55\xd0\x65\xdd\xdc\x4a\xbd\x5e\x57\x75\x83\x7c\x22\x2e\xfb\x93\xf0\xb4\x31\x30\xdb\x19\xb1\xc3\xd4\x84\x59\x11\xbd\x50\xb8\x06\xc4\x6d\x17\x8d\xc9\x34\xd6\x2b\xb5\x5e\xbf\x6a\x34\xf1\x05\x12\x29\x8d\x81\x2b\x40\xdf\xe9\x5a\x30\x1e\xa4\xbd\xc3\x88\xa6\x8c\xda\xa5\x0d\xd8\x1e\x79\x79\xb3\x6e\x8b\x54\x88\xc3\x28\x91\x16\x6c\x01\xa2\x07\x7b\xff\x8b\x68\x1f\xa5\xf9\xb9\x85\xdc\x6f\x55\x51\x06\x46\xf1\x0b\x04\x5f\x59\xd6\x45\xad\xad\xea\xbe\xd7\x45\xf1\x1c\xac\x12\xb0\x53\xc2\x9b\x11\x1d\x73\xbf\x18\x70\xc5\xd7\x7a\x5d\xd5\x3a\x91\x8b\x76\x49\x2c\xd8\xe2\x24\x63\xbc\x45\xe3\x63\xd7\xc1\xf7\x9e\x3b\x89\xe8\x2d\x9c\xe3\x16\xc6\xa4\x08\xfd\xd9\xe1\xd5\xa1\x5a\x54\xc5\x8f\x8c\x1e\xfb\xc8\xd6\x50\xc6\x37\x9a\x7d\xe7\x89\xb8\x2f\x43\xab\x64\x2d\x4e\x4e\x97\x06\xc8\x91\x88\xeb\xc5\x54\xad\x91\x6e\x81\x55\x85\x63\x0a\xe9\x1b\x46\x7d\x84\x6e\x6b\x47\x0f\xce\x48\x68\xf8\x0d\x32\xae\x7a\x4c\xe8\xb1\x5e\x45\x02\x42\x0f\x48\x2e\xec\xe5\x9b\x67\xe0\x55\x87\xfb\x83\x84\x3d\x14\x35\x46\x2f\x9e\x22\x39\x18\xb5\x72\x8d\xe0\x01\x2a\xad\xe0\x62\x4d\x50\x09\x49\x80\x05\xc6\xd3\xb4\x42\xe8\x86\x7f\xcf\xe7\x29\x46\xe9\xdc\x48\x65\x44\xfc\xea\x54\xbe\x6d\x9b\x7d\x9f\xc7\x98\xb8\xe7\x4c\x0f\xa1\x50\x61\x05\x85\x83\x4b\x7b\xf4\xda\xe1\x30\x77\x88\x51\xec\x95\x25\xc9\x8c\xa8\xca\xfd\x4a\x2f\xc1\xfa\x8b\x20\x6d\x88\xc1\x1e\xae\xd2\x40\x3f\xd9\x20\xd8\x62\xc6\x39\x54\x3c\x2b\xf8\x1a\x0e\xf3\x62\x6c\x1a\x8c\x1d\xfb\x0b\xe4\x99\x81\x69\x61\x80\xab\x80\x2e\xb5\x35\x40\xe7\xdf\xdb\x6b\x5c\xe4\x48\x97\xd7\x9a\x24\xa8\x20\xc2\xee\xfe\xc6\x9d\x37\xa8\x82\x58\x71\xf4\x08\x91\x03\x7c\xd2\x1f\x2c\x5d\x83\x26\x03\x43\xf7\xba\xae\xca\x3a\x6f\x1a\x5d\xfa\x83\xbd\x04\x53\xe0\x0d\x85\x58\x92\xf0\x55\xe8\x50\x32\x7f\x84\x68\x42\x7a\x62\xf6\x3a\x86\x16\x3b\x8c\x82\xd7\x2e\x42\x70\xc7\xe2\x07\xbb\x26\xe2\x5d\x4b\x85\x98\x78\x5a\x1a\xa8\xa3\xd6\x52\xdd\xdc\xd8\x55\xe2\xc7\x3a\x2e\x4f\x3b\x0f\xc0\xe5\x1d\x32\xdb\xbb\xb6\x18\xf0\x36\x51\x26\x62\xaf\xd0\x1c\x41\xaf\xa1\xbc\xab\x8a\x16\xf1\xe0\x94\x34\x4d\x55\xab\x1b\xe0\x29\x8e\xe6\x87\xd6\xaf\xd7\x2a\x4b\xc7\x99\x13\x8c\xce\x5f\xaa\xe0\xf4\x74\xa1\x65\x53\x21\x5e\x05\x1d\x97\x88\xde\x49\xa7\xab\x4b\x58\x13\x26\xd5\xf6\x05\x77\xac\xab\xa7\x55\x36\x00\x81\x2a\x15\x95\x51\xc7\xdd\x9c\x94\x4f\xbe\xaa\xb0\x2c\x25\x37\xbe\x0a\x41\x20\x02\xf4\xd3\xad\xe9\x24\xae\x43\x08\x3e\x63\x17\xef\xab\x83\x4f\x7c\xd9\x5a\x22\xc3\x89\x54\x1d\x3b\xe4\x10\x8c\x90\x52\xdf\x6b\x0f\x0c\x08\x26\xc0\x23\x65\x6f\xfb\x97\x0c\xae\x3b\xc0\x36\x8c\x2c\x02\xab\x56\xb1\x21\x74\x17\x81\x53\xba\x91\x71\xed\x50\x6e\x6e\xd3\x23\x79\x06\x8a\x11\xeb\x44\x7c\x19\x17\x57\xc2\x95\x64\x87\x96\x8e\x95\x00\x40\x37\x61\x5a\xfc\x19\x22\x11\x81\x2b\xda\xef\x14\x9f\xfd\xbc\xae\x35\x8c\x80\xe3\xa8\x94\xb1\xde\xee\x12\x81\x35\x17\x4f\x99\x6c\x14\xc1\x44\xf8\x17\xc6\xc8\x44\xc3\x1f\xd9\x26\xe3\x40\x13\x0d\x8c\x6e\x1f\x7a\x2b\x97\xcb\x91\x1f\x92\x43\x14\x62\xdd\x16\x5e\xa5\x73\xae\x1d\xe4\x2d\x64\xb0\x5e\x05\x2d\xb1\xe7\x5c\xc0\x50\x86\x69\x45\xe7\x27\xc3\x5d\x13\xd8\xde\xaf\x1f\xf7\x6f\xbb\x87\x3d\x88\x6d\xd5\x71\x46\x4e\xd8\xbb\x3f\xa6\x9d\x3d\x01\x56\x21\x2a\xb4\xe1\x5a\x31\xdd\x01\xa6\xef\xdb\xc8\xc2\x61\x8b\x1c\xc3\x70\x08\x58\x64\xc8\x37\x59\x61\x81\x01\xe0\x7e\xba\xb0\xb9\x73\xb9\x57\x55\x8d\x75\x55\x19\x30\x35\xab\xd5\x6d\x5e\xea\xe7\xb5\x56\x19\xbc\x3e\x08\x27\x39\x80\x79\x32\x7a\x1e\x0f\x0a\xef\x1b\x20\xe8\x39\xd2\x61\xab\xd6\x34\xd5\x46\xd5\x39\x64\x59\x29\x11\xef\x6b\x26\xcb\x46\xd7\xce\xff\x98\xac\x7b\x6a\x3e\x5c\x34\x96\xe3\xe5\x4e\x3a\x1e\x31\xb5\x5a\xd9\xdb\x8d\x85\x01\x24\x49\x05\xd9\x78\x01\x01\x72\x3a\x7c\xee\x5b\xd6\xae\xba\x53\x05\x98\x2e\xf1\x03\x7a\xe1\x35\x47\x2a\xaf\x36\x1a\x1f\x26\x8d\x6a\x72\xb3\xa6\xbc\x5c\x68\xa4\x75\x60\x02\x3a\xcf\x4a\xc0\xaa\xb7\x76\x4d\x7b\x73\xdb\x71\x90\x7c\xb0\x6b\xb3\xd5\x10\x3e\x1f\x18\x90\x8f\x03\xe0\xa1\xf4\x4b\x93\x0a\xf1\x5d\x2a\x47\xb1\x90\xbb\x64\x41\x59\x75\x72\xc6\x1d\x87\x3b\x32\x6c\x96\x6d\x83\x5c\x5d\xbe\xd4\xd2\x23\x25\x84\xa7\x60\xb9\x93\x4b\x8d\x7d\x3e\x9b\x2d\x60\x37\x43\xa2\xd7\x87\xd6\xad\x1f\x6f\x95\x10\xa6\x03\x86\x93\x48\xe7\x2e\x89\xb4\xc0\xf8\x1a\x26\xb9\x01\x29\xa1\x62\x08\x69\x3c\xad\x42\xf5\xc2\xd4\xdd\xb1\x93\x73\x8b\x6e\x81\x5c\xab\xa2\x30\x2e\x38\x18\xde\x93\xa2\xe3\x7c\xba\x84\x6f\xe1\xca\x0b\x1e\x1b\x6c\x7f\x2d\xb0\xed\xd7\x7a\x89\x22\x38\xd6\xac\x6a\x86\x52\xf6\x4e\x97\x70\x8a\x3b\x88\xdb\x3a\x06\x48\x11\x7f\xf8\x28\x89\x72\x54\x4f\x49\xcb\xf9\xd1\x88\xdc\x04\x6b\x13\xa5\xc6\x82\xb5\xf0\x4c\xd9\x48\xe8\xc6\xf0\xb7\xeb\x8e\x85\x22\x1c\x81\x73\x94\xf5\x80\x42\xe0\xaf\x2c\x1e\xfc\x86\xf9\x01\xf8\xc0\x06\x29\x5b\x8c\x5e\xe4\x26\x52\xec\x91\xdd\x1d\xea\x04\x8e\x76\x61\x8c\x05\x33\x59\x3d\x41\xe9\xac\x63\x78\x0e\x7b\x07\x1e\x85\x2d\x8c\xab\x52\x31\x7d\xdd\xda\x3f\x0a\xed\x0a\xb1\xa5\x3d\x21\x10\x5e\x2a\x1b\xf6\x09\x31\x23\x82\x6e\x53\x70\x16\xaa\xb6\x89\xa7\x01\x45\xaa\xc2\x7d\xc3\xbe\x02\x43\x43\xfe\x4a\xc2\x4e\xfd\xdb\x5a\x9b\xdb\xaa\xc8\x7c\xb5\x1e\x06\x36\x68\x38\x54\x3d\x0d\xf9\x63\x28\x0d\x47\xdf\x79\xb9\x93\x85\xba\x47\x8d\x8a\x81\xeb\x32\xac\xf3\xc4\x3d\x80\xb8\x75\xd9\x6e\x74\x0d\x61\x42\xeb\x42\x6d\x74\xa3\x6b\xeb\x8b\xa9\x46\x79\xf2\x20\x59\xa8\x9d\x3d\x46\x02\x1b\xe9\xac\xbe\x04\x60\x17\xf0\xfa\x36\xc0\xec\xaf\x56\x75\x65\x82\x5f\xe4\x65\x91\x97\x61\xbe\xec\xd0\xfa\x03\xf6\x77\xe0\x3c\x58\x8f\x44\xe4\xa5\x2c\x74\x79\xd3\x60\x61\x35\xc5\x52\x82\xe0\x77\x38\x60\x20\x58\x0f\xc3\xf3\x91\x67\x23\xb8\x4e\x17\x0d\x1a\xa8\xac\x29\x76\x7d\x39\x48\xe5\xa1\x67\x00\x31\x71\xe6\xca\x1a\x1c\xf0\x42\x8c\x4c\x43\xe6\xc4\x31\xb1\x76\xe4\x07\x12\xfd\xe8\xc0\x5b\x25\xd3\x23\x99\x3f\x12\x62\xe6\xf9\xd4\x43\xd1\x78\x5c\x1b\x24\x0e\x61\xa5\x43\x26\xb3\x57\xe2\x1f\x09\x65\x7e\x9f\xca\x51\xb9\x0b\x0f\xa8\x88\x26\xec\x42\x01\x85\xa9\x06\xa7\xe1\xcb\x9f\xa9\x96\xcf\x25\x5c\x50\xb2\x85\x83\xe7\xe9\xe9\x43\x14\xe6\x54\x08\x3b\x08\x08\x9e\x21\x40\x4c\x50\x89\xe0\x4c\x07\x0a\xb8\xee\x1c\xb4\xbb\xa9\xf8\x4a\xe1\x1b\x85\x55\x8a\x78\xaa\x3e\xc6\xaa\x47\xe0\x30\x21\x87\x2c\x98\xfa\x1e\xed\x9a\xf4\x4d\x3e\x5e\x22\x5a\x65\x5e\xe1\x5d\x48\xc8\x13\x73\xeb\xf8\x9d\xa0\x9a\x9b\x28\xa5\xd5\xcd\x0a\x82\x91\x06\xf6\x91\x06\x66\xb3\x7b\xe8\xb5\x10\x58\x1f\x6d\x4d\x72\xeb\xef\xdf\xe4\xa5\x46\xab\x05\x94\xb0\x5e\xb6\x37\x50\xd7\xd6\x0f\x70\x87\x8c\x64\x50\x93\xde\x8d\x10\x13\x0f\xad\xcb\x8a\x44\x31\xdd\x4e\x9e\x48\xe4\x94\xfd\xc3\x8a\xc2\x88\xff\xe7\x3c\x28\xe4\xa6\x2e\x17\x90\x8b\x7d\xb7\x8a\x1f\x16\x85\xc7\x86\x13\x1d\xae\xf6\x18\x06\x94\xb5\x68\xaa\x81\xfc\x22\xe4\x21\x70\x6a\x5b\x31\x8e\xb3\x37\x81\x63\xe9\x88\xcd\xe2\x6a\x08\x9a\x3e\xaf\xb9\x1b\xff\xa6\x02\xd8\x45\xbd\x01\x22\xec\x7b\xa0\x98\x46\xc6\x33\xae\x92\x41\x19\x67\xef\x1b\xea\x9c\x48\x80\x07\x67\x40\x95\xdc\x6e\x38\x19\x91\x6d\x71\xb6\x00\xfb\x32\x7e\x14\x42\x1d\xc9\x91\x33\xda\xdd\x9c\xbf\x62\xba\xcb\x3d\xa6\xbb\x88\x14\x83\x4f\x1a\xba\x26\x73\x0a\xf3\xba\x42\xa7\x7b\x5d\x6b\xb7\xbb\xee\xed\x58\xf6\x20\xf6\xdb\xfe\xc3\xe6\xfe\x11\xe4\xb1\xfa\x7a\x2e\xb2\x85\x42\xc3\x30\x3a\x74\xfd\x29\xf7\x26\xf9\xd8\xd9\x87\x8d\x0b\xd5\x23\x37\xbd\x87\x76\x77\xc8\x51\x60\xb7\x10\x7a\x70\x42\x42\xcc\x40\x9e\xe1\x26\xe2\x1e\x87\x50\x8d\xb8\x90\x6b\x30\x2b\xaf\x55\xc4\x50\xb2\x22\x95\x87\xd8\x54\x47\x05\xf9\x55\x95\xc5\x03\x81\x90\x1c\x6f\x4a\x13\x80\x77\x09\x88\x70\x71\x7a\xde\x50\xf2\x26\xef\x46\xa1\xa8\xea\x9d\x69\x22\xad\x8f\x45\xdc\x28\x58\x3b\x4c\x7a\x54\x74\xc3\xd5\x54\xe9\x17\x8d\x39\x78\x9d\xbd\xc0\x96\xfb\x05\x54\xb9\x00\x1f\x31\xd4\x01\x22\x25\xa6\x02\x1b\x59\x68\x65\x1a\x30\x5c\xb4\xdc\x69\x55\x9b\x04\x48\x17\xb9\x2e\x12\xe2\xaf\x78\x8e\x80\x38\x87\x79\xa2\x08\x21\x8b\x48\x4d\x5d\x40\x5f\x7e\xaf\x12\xbe\x22\xb0\xf7\x86\xf2\x4c\x65\x85\xfc\x75\x0e\x23\x68\x55\x19\x30\x17\x29\xb9\xe1\x6e\xf5\xd0\x6c\xc5\x1c\xd7\x80\x9b\x19\x0a\xee\x37\xfb\x98\x98\x31\x7d\xdc\xb7\x44\x07\xd9\x4f\xd6\x2f\x80\x7d\xac\x70\x2b\x04\x8f\xc4\xbc\xd8\x4f\xba\x76\x91\x22\x27\x38\x10\x5a\x22\x2e\x0f\x47\x87\x1a\xe1\xa9\x99\x70\x75\x01\x86\x2c\x6c\x93\xe3\xef\x1a\x6e\x00\xc0\xc7\x2a\x8e\xc0\x40\x51\x4a\x19\xc8\x7a\x12\x3a\xbb\x71\x95\xcb\xa3\xe6\x3e\x84\xfb\x3c\x75\xea\x0e\x6d\x4b\x7b\xd2\xba\xd5\xf8\xd0\x90\x46\x01\x02\xe6\x20\x63\xc5\x1b\xf8\x31\xb0\xfc\x79\x13\x94\x56\x83\xca\xe6\x4a\x3d\x67\x68\x24\x3d\xd3\x3e\x54\x68\xf6\x5d\xc2\x9e\x9d\x60\x68\x58\x41\xef\x03\x44\xf5\x06\xcc\xc8\xf0\x6b\x87\x79\xc9\x55\x4c\xf4\xe4\xaa\x96\x4b\xac\xaa\xb7\x4b\x72\xe4\xf5\xd9\x46\xfd\x09\x02\xd3\x9b\x6d\x55\x22\xdc\x2b\x9d\xc6\x3a\x91\x9f\x75\x5d\x6a\x2a\xe6\x07\x42\xc5\x23\x67\xf4\x42\xa2\xce\x2a\x14\xb3\x33\x8d\xde\xc8\xaa\x0c\x08\x89\x02\xd5\x53\xb7\xa5\x49\x64\x5b\x82\x09\xec\x7a\x4c\xe0\x55\xce\x97\x58\xb9\xb6\x13\x11\x7f\xdb\x7a\x06\x0d\x98\x5b\xb7\x6a\xbb\xd5\x65\x50\xc4\x1a\x86\x33\xb0\xbf\x36\x73\xac\xf1\x85\xa3\xc5\x0f\x9a\x05\xab\xb5\xc0\x88\x64\xc8\x28\xd6\xa9\xf3\xa5\xdc\x8e\x5b\x52\x15\x69\x16\x37\x67\x89\x73\x4e\x05\x05\x03\xfc\xfb\x31\x28\xae\x4a\xc3\x01\x54\xae\xfe\x5e\x56\xb8\xdc\x9e\xc7\xd9\xdb\x80\x58\x46\x8a\xac\x9e\xb2\xeb\x97\xc7\xa9\xa1\x54\x88\x1f\x7c\x00\x10\xc3\x3c\x9c\xcc\xa4\x54\x6a\x54\xb4\xfc\x58\x4d\x8f\xc9\x33\xfd\x7c\xb9\x7b\x6e\xff\x1f\x5e\x2e\x89\x38\xae\xe8\x8c\x2c\xa4\xab\x1b\x78\x59\x50\xfc\x24\x97\x3b\x11\x87\xc3\x87\xaa\x1d\x82\x5e\x01\x57\x4d\x16\xc7\x0a\xe1\x44\x50\xb2\x4c\xec\xd5\x81\x83\xb3\x82\x7a\xa8\x75\x90\x83\xe8\x8f\xd8\x9a\x8c\x9e\x6f\xc7\xb5\xbc\x53\xce\xb9\x17\xb4\xf4\xcd\xaa\xf7\xd5\x23\x86\x51\x77\x4e\x7c\x07\x85\x16\x2c\xa8\xcc\x7e\x15\xb3\x33\x32\xda\xd2\x77\x51\x38\xba\xb9\x3d\xb3\xa0\x12\xdd\x01\x2b\x48\x0c\x96\x31\x74\x5d\x19\xac\xe3\x78\xbf\xdf\xfe\x1e\x9c\x14\x3d\x6a\xad\x56\x44\xef\x4c\xd1\x0f\x91\x37\x5f\xcd\x45\x42\xd2\xef\x97\x6d\x41\xfe\x0d\xc2\x7d\x37\x95\x5c\xe7\x74\x24\xdc\x71\xb3\x7a\x25\x58\x8b\x50\x89\xbb\x25\x04\xe8\x6b\x19\x12\x0b\xc6\xe8\x43\x21\xc2\x10\x58\x49\x76\x52\x10\xd1\x18\x0e\x97\x0b\x4f\x17\x4d\x88\x99\xd8\xf2\x81\xd2\xd0\x47\x6a\x45\xb7\x95\x69\x43\xbd\x3c\x35\x95\xf8\xeb\x06\x62\xd7\xf1\xae\xca\x51\x1e\x91\xb1\x3d\x82\xca\x0f\x20\xf4\xc3\xae\xd1\xa1\x11\xba\xab\x87\xe2\xb7\xc2\xda\x71\x70\xaf\xba\xbb\x18\x93\x1e\x30\x1c\xee\xb9\x86\x9b\xcb\x4a\xfe\x00\x3c\x2d\xdb\x72\x82\x9b\xd8\xf3\xda\x63\x27\xb8\x81\xc1\x6d\x01\x51\x60\x6a\xd7\x71\x01\x64\x8f\x6d\xbf\x6e\xa9\xae\x00\x51\x58\x53\x21\x7e\x9f\x3a\xce\x57\xac\x72\xf4\xbc\xfd\xd6\x42\xd9\x36\xdd\x54\x5b\x6e\x3d\x1f\x67\x2a\x40\x59\x03\x04\x83\x45\x74\xed\x96\x04\x6d\x0b\xad\xa0\x00\xbe\x85\xda\x39\xee\x83\x25\x33\xbb\xb7\x2b\x22\x28\x00\x03\xc8\xa6\x4e\x66\x88\x5b\xc6\x15\x9f\x2d\x24\x0a\x08\x08\x07\x0b\x75\xcf\xed\xf9\x5c\x3b\xd0\x9f\x4d\x54\x27\xb2\xdc\xc5\x6d\x67\x51\x2f\x66\x28\xb2\x87\x54\x95\xb6\x3f\x97\x8b\x3e\x5e\x5e\x66\x48\x23\x0d\x02\x83\xaf\x57\x54\xe9\x17\xd1\x57\x7a\xb8\x2c\x88\xa1\x11\x3a\xc4\xaf\x69\xf8\xc0\x11\xbb\xe1\x77\xab\xb8\x83\xac\xb7\x1d\x2a\x24\xf8\x8f\x5f\x52\xd1\x3d\xb0\xfe\x61\xa1\xe5\x63\x29\xad\xc7\x27\x8c\xa9\x79\x47\xcc\x18\x1f\x1d\x12\x7b\xe3\x99\x8b\xc3\xde\x46\x6a\xc2\xc5\xbf\x20\x65\x77\xb7\x3d\x3a\x38\xc2\x32\xee\x92\x76\xd7\x6a\x84\x33\xc6\x95\xef\x22\x5e\xbd\x58\x71\x01\xef\x28\x5a\x9d\xeb\xb6\x06\x7d\x1f\x9b\x2e\xcc\x4d\xe0\xa8\xbb\x05\x17\x22\xb0\x5a\x1c\x20\xdd\xc8\xcb\xee\x79\x72\x88\xd6\xd8\xc2\x5d\xae\xab\xda\x5a\xae\x22\xc0\x42\xc6\x90\x48\x90\xf1\xe9\xa5\x9e\xc5\xf1\x71\x2a\x27\x6b\x32\x67\x57\x55\x89\xe9\x53\x2a\x1b\x95\xab\xaa\xad\x1b\xf9\xa7\x96\x00\xcc\xb0\xea\x3b\x28\x5c\x18\x60\x62\x10\x88\x57\x10\xdc\x76\xd4\xea\x79\x88\x9d\xb9\x9b\x9c\x00\x69\xf8\xbb\xc6\xb4\xda\x1c\x25\xa1\x34\x42\x92\x0e\x96\x11\xaa\x29\xac\x10\x1d\x72\x58\x10\x78\x78\xed\xa8\x90\x53\xd5\x53\x1b\xb8\xb6\x13\xab\xb8\x8f\x7c\x36\x0a\x6d\x39\x38\xfd\xc1\x2b\x7a\x75\x31\x10\x67\xa4\x23\xad\x7f\x59\x59\x33\xcf\xbe\xd7\x09\x54\xf4\x5d\xd1\x8b\x20\x05\x16\x62\x68\x21\x71\x37\x08\x66\xef\x80\x8a\xb0\x2d\x1a\x55\x6a\x2c\x24\x86\x3a\x96\x80\x27\x7d\x1f\x86\xb8\x5f\xcc\xad\xae\x1b\xbc\xdd\x83\xaf\x51\x28\x5b\x19\x11\xef\x61\x08\x9d\xbd\xe7\x0c\x52\x87\xb4\xec\x42\x55\x28\x11\xf7\x7f\x53\xb3\x21\x44\xfe\x31\xc8\x58\x57\x3b\x55\x34\x3b\xec\x49\x0c\xce\x78\x3f\xbf\x27\x96\x3b\xaa\xba\xa8\x00\xc7\xa0\x72\xb5\xd7\x54\x9d\xbb\x87\x57\xa4\xb9\xad\x21\x5b\xb2\xab\x5a\x1f\xac\xc7\xca\x77\x02\xec\xb1\xa2\x50\x64\x6e\x75\xc1\x2e\x77\x71\xc3\xf0\xa2\x83\x8f\x2d\x29\x40\xb1\xae\xed\xad\xc5\x75\x42\xe8\xdb\x3d\x32\x7c\xcc\x68\xf4\xd2\x97\x41\xa5\x12\xc0\x41\x16\x99\xcc\x4b\x0c\x4a\x54\xb5\x6c\x4b\x3c\x91\x1a\x8b\xfc\x90\x6d\xb4\xdc\x89\x80\x6f\x74\x95\xd7\xab\x76\x63\x40\x77\xa3\xdf\xb8\x54\x85\x57\xe4\x3a\x7c\x7c\xd8\x58\x09\xe5\x34\x58\xc9\x16\x7e\xca\xd7\xe3\x0d\x7e\x01\x8a\x01\xb0\x88\x23\x78\xaf\x41\xa7\x2c\x28\xc6\xe2\x42\xcc\x81\x6a\xac\xbc\x84\xa8\x14\x41\xae\xf0\xa1\x0f\x1a\xf5\xa1\xda\xd9\xfb\x65\xba\x6e\x76\x54\x57\x45\x80\xfb\x88\xdb\xc2\x55\x5c\xb0\x58\x00\x63\xbf\xf6\xad\x49\xf8\xc9\x37\x22\x7a\x39\x80\x68\x80\x63\x5d\x44\x23\x0c\x30\x37\x1a\xaa\xee\xba\xa9\xe9\x89\x0d\xb5\x7f\x7a\xac\xa4\x68\x8f\xc9\xd3\x75\x85\x77\xb9\x15\x7d\xab\x47\xf0\x9e\xef\x74\xa1\x6f\x6b\x6b\x12\xc0\x7a\x5d\x20\xac\x67\xb5\x2d\x42\xec\x82\x1b\x5d\xea\xba\x6a\x31\xbf\xe3\x69\x8d\x29\x6c\x7b\x9f\x67\x5a\xd6\x50\x17\x13\xf4\x92\x89\xd0\xc9\x67\x61\x47\x3e\x1e\x1c\x5c\x8e\x41\x41\x94\x89\x12\x8e\x76\x6e\x1a\xd7\xb9\x17\x06\xf8\x55\x43\xbe\xfb\x1b\xca\x47\xb5\x5b\x7e\x39\x76\xe1\xbd\xc8\xaa\x12\x97\x9f\x30\x97\xf2\xb5\xbc\x45\xd6\x9d\x5b\x90\x98\x7b\xe2\x0f\x6d\x2a\x11\x69\x30\x5a\x3c\x1e\x9f\x57\x45\x34\x48\x6c\xd6\x74\x2d\x76\xa4\x04\x51\x7d\x63\xfc\x07\xb3\x16\x5c\x61\xb3\x47\xaa\xa1\xd2\xc8\x0e\xd4\xbe\xc5\x91\xdd\xdf\x53\x5c\x64\xa9\x0b\xec\xa1\x25\x22\x66\xd1\xb9\xaa\xf0\x46\x35\xcd\x40\x91\xf7\xf1\x89\x0b\xf1\x77\x7b\x7f\x5e\x10\xfc\x51\xb7\xf1\xc5\x04\x4d\x39\x40\x2f\x80\x78\x0b\x02\x28\x7e\x20\xc0\x40\xe1\x98\xa5\x93\x7c\x08\xc9\xec\x7c\xf4\x3f\xec\x79\x32\x49\x6c\x92\xb8\x0f\x09\x6a\x98\xb4\x2a\x11\xdc\xff\xb8\x09\x66\xe0\x32\x80\x64\x55\x96\x61\x6c\xc1\x8a\x40\xde\xc8\x1b\x5d\xdd\xd4\x6a\x7b\x6b\xad\xa2\xd8\xbf\x0e\x7a\xcd\x3c\xeb\x0f\x6a\x61\x37\x15\x1f\xa8\x8e\xbe\x9a\x1b\xe1\xe1\xe3\xb0\xd9\x08\x2b\xde\x37\x15\x54\x5f\xf0\x42\xa0\xda\x68\x0d\xbd\x40\x67\x9e\xa1\x1e\xf9\xe9\x23\xe2\xf9\xa0\xed\x9a\x83\x3b\x6e\x84\xca\x58\x91\xe4\x20\x2f\x45\x9d\x97\x55\x36\x90\xef\x10\xc7\xaf\x30\x53\xbd\x17\x8a\xec\xe9\x74\xd5\x91\x4d\xbb\xa7\xca\x2c\x64\xb1\x96\xc8\x62\x0d\xc1\xa2\xe8\x51\xf6\xfc\x88\xa5\x76\x6c\xc3\x79\x29\xcd\x36\xaf\x73\x07\x52\x0b\xcd\xec\x9e\xbd\x19\x41\xf5\x02\xf8\x7b\xa4\x8e\x22\x36\x34\x6a\x53\x15\xf6\x15\x0e\x86\x06\x2b\x60\x57\xba\x86\xb4\x5b\x44\xa4\x9d\x9b\x27\x72\x68\xf3\x59\x70\x16\x2e\x45\x85\xad\xed\x10\x7f\xb4\x57\x74\x49\xe4\x69\xbe\xe4\x8e\xae\xda\x03\xab\x13\x0a\xd5\xf8\xf2\xc5\x83\x44\x44\xd8\x68\xae\xbb\x27\x40\xea\xf5\x11\x8d\x8e\x2f\x42\x67\xab\x43\xa2\x0d\x57\x0b\xde\x13\xd1\xab\x02\x4e\x6f\xea\x47\xde\x27\x14\x3c\x75\x11\x35\xa5\x81\xa3\x49\x75\x91\xde\x8f\x88\x57\xc2\x27\x8a\x89\xbb\xdb\x8e\x82\xc7\x05\x39\xae\xa7\x0f\x42\x88\xe3\xd7\xce\x62\xe4\x9a\xc2\xe0\x5c\x80\xad\xde\x4b\xfe\x43\x3d\x21\xaa\xdd\x08\x03\x42\x60\x39\x77\x74\x74\xbb\x86\x74\x09\x71\x98\x06\x5c\x05\x8e\x05\x41\x25\x78\x9d\x23\x0c\x9a\xbf\x24\x04\xa1\xaa\x59\x03\xde\x7b\xd4\x68\x1d\x7a\xc4\x20\xbe\x32\x43\x65\x37\x34\x6d\x11\xe2\x5a\x46\x6f\xdb\xb7\x3a\x6f\x00\xd0\xaf\xda\x68\x7b\xc8\x0c\xde\x09\x2e\xb6\x6e\x04\x97\xa3\x00\x68\x1f\xdc\x63\x31\x89\x7c\x0b\xd1\x1d\x1a\x4a\x73\x5f\xc9\x9b\x0a\xf2\x10\xeb\x10\x48\xc2\xdb\x05\x0e\xf7\xc2\x1a\xa7\x3e\x14\x00\xbf\x62\xb4\x89\x18\xa0\x1b\x4d\x8e\x4d\xe5\x2c\x0e\x82\xf1\xa0\xec\x39\xdd\x25\xee\x2b\x37\xa8\x4e\x0a\xa2\xce\x99\xce\x3c\x27\xb3\x38\xfe\x2e\x95\x6f\xc7\x80\xb2\x4f\x64\xfc\x88\x2c\xea\xb9\x1f\xcf\x80\xca\x18\xa8\xc3\x3e\x8c\xe6\xef\xc7\x40\x7d\xc0\x94\xa8\x1e\xca\xf9\xdd\x6c\x2e\x82\x07\x24\x1d\x6e\xa9\xcb\xf1\xfc\x62\x72\x75\x85\x6c\x0c\x31\xd1\x54\xca\x4c\x91\x1f\x3f\x8c\xa7\x1e\xfe\x58\x2c\xae\x80\xbb\x77\x32\x95\x1f\xe7\x9e\xe9\xf9\x74\x76\xf9\x09\x28\xa6\xe5\x87\xd9\xf9\xd9\x78\x0e\x98\x04\x2f\x1c\xcc\x31\x31\x96\x31\xf8\x74\x38\x27\xc1\x44\x37\x5f\x81\xa1\x9e\x84\x4c\xdc\x48\xc1\xdd\xc7\xa3\x4e\xc4\xd3\x49\x21\x06\x90\xa9\x43\x52\x88\xbd\xe0\xd4\xe9\x1e\xb2\x68\xfb\xdb\x3f\x5e\x8f\xdc\x73\x06\x08\xa3\x83\x6d\xb4\xb3\x45\xbe\xd3\xc5\x07\xe0\x26\x0e\xff\x6e\x97\x69\x2c\xcf\xc6\xef\xc6\xa7\x57\x93\x9f\xc6\xc4\x9e\x0d\x0c\xd3\x82\x39\x75\x61\x79\xce\xcf\xe5\x74\x7c\x3a\x5e\x2c\xec\xb7\x90\xdf\x01\x40\x1f\xe6\xe3\xcb\xd1\x64\x8e\x6c\x12\xf3\x39\x22\x52\x5b\xe5\xf2\x7d\x8c\xa2\x7d\x3d\x3d\x1f\x2f\x16\x72\x3e\xfe\xe3\xf5\x64\x3e\x24\x04\xc0\xc5\xf6\x7e\x3e\x46\x64\x6f\xbf\xe7\x02\x88\x7f\x91\x73\x34\xde\x78\x47\x5e\xe7\x37\xfe\x93\xfc\xf8\x61\x06\xbc\x60\x00\x3d\xf1\x89\x45\x63\x3e\x76\xd8\x14\xe3\x50\x48\xed\x7a\x7a\xc1\x1c\xbd\x9d\xd9\x15\x88\xa8\xee\xec\x72\x00\xd1\x1a\xb3\x92\x79\x40\xf2\xd1\xf4\x93\x20\xfc\xdd\x41\xd6\xbb\xfd\x0c\x1b\x31\x65\x35\x43\x75\x23\x75\xb5\xa3\x09\x47\xbe\xd5\x70\xb0\x87\x8f\x82\xa1\x87\x9c\xcc\x02\x46\x7c\x35\x92\x6f\xc7\xf6\xd3\xf3\xf1\xf4\x0c\x38\xff\x26\xd3\xd1\xe9\xe9\xf5\x7c\x74\x35\xf6\x94\x76\x72\x71\xbd\xb8\x1a\x4d\xa6\x8e\x51\x1c\xd1\xc3\x99\xe5\x1d\x38\x4d\xac\x78\x06\xd4\xd4\xe1\xa0\xae\x66\x44\x66\x3c\x46\x41\xf3\x1b\xc2\x00\xe3\x47\x31\x69\x9e\xc0\xdd\x93\xd1\x89\xfd\x24\x3f\x8c\x16\x11\xf7\xf6\x53\xc8\xf3\xc4\x78\x8a\x9f\x1b\x80\x26\x81\xc2\x56\xab\xe7\x47\xe0\x75\x62\x3c\xf5\x0a\xee\xf9\xa6\x42\x8e\x9c\xa9\xbe\xa7\x8b\xcd\x9a\x1d\x82\xee\x42\x02\xad\xc1\x4e\x88\x18\x11\x2b\xc0\x34\x25\x07\x80\x19\xa8\xb0\x04\xb6\x71\x90\x2c\xa2\x35\xee\x92\x41\x17\x0e\x30\xe6\xa0\x28\x61\xa3\xcb\x8c\x31\x11\x00\x04\x49\x47\xee\x4d\x80\x65\x68\x9d\x18\x11\x85\x2d\x3d\x34\xaf\x47\xa8\x85\xd8\x2a\xb8\x00\x68\x28\x03\xad\x56\x1c\x07\x01\x0b\x5e\x84\x78\x92\x87\x55\x9d\x48\x68\x44\x29\x15\x22\x51\x25\xc3\x8d\xaa\x7b\x31\xae\xd8\x98\x3e\x42\xa0\x55\xd7\x5c\xc3\xaf\x48\xa4\x6a\x1a\x45\xb9\x5b\x6f\x6e\xb9\x76\x97\x08\x16\x93\x01\x98\x8d\x5a\x6b\xd3\xc0\xf5\xef\xbe\xbc\xe1\xcf\x9a\x86\x8a\x62\xa1\x88\x8b\x52\xd0\x58\x35\x5b\x21\x4a\x56\x08\xac\x05\xa8\x27\x3b\xca\xfd\xae\x8a\x96\xa1\x9f\xe3\x06\x74\x78\x14\x3c\x83\xc8\x99\xb0\x40\xc0\x57\x72\x68\x79\xe0\xec\x8b\x03\x01\x85\x9d\xe8\x69\x6e\x2b\x70\xac\x90\x2e\x42\xd7\xd4\xae\xdc\x62\x26\x03\xd0\x73\x0d\xb2\x36\xa5\x42\xd8\xbd\x84\xaf\x86\xc5\x20\x85\x83\x07\x28\x01\xaa\x0e\xe2\x6b\x32\xcf\xb4\xc2\x7e\x35\xc4\xf9\x21\x04\x82\x18\xbb\x7b\x67\x7d\x52\xf8\x96\xb5\x1a\xd0\x64\x62\xbc\x3d\xe7\x3b\x46\x82\xf5\xc6\x35\xdf\x44\xf2\x84\x96\x73\x00\xcd\x99\x37\x5e\x58\x62\x31\xf8\x3a\x36\x20\x34\x14\x0e\x19\xa0\x62\xd0\xc4\xf2\x80\x28\x71\x73\x91\x0b\x85\x56\xb5\x3c\x8c\xfb\xf2\x8f\x44\xcf\xee\x4e\xfb\x13\x0f\xc3\x19\xe4\xbf\x01\x5e\x15\x43\x27\xb1\x9d\x86\x9d\x35\xe8\xff\x90\x49\x20\x90\xe9\x07\xcd\x82\x37\xae\x7c\x99\x6a\xa6\x35\x73\xdd\x79\x64\x80\x6a\xdd\xbb\xd9\xab\xfa\x09\x17\x3b\x73\xe5\x3d\x61\x55\x11\x3c\xbc\xd6\x02\xbd\x32\xae\x74\x0c\xe5\x75\xb8\x08\xe6\x09\x0f\x17\x51\x5b\x85\x5f\xc6\x37\xd6\x07\x2e\xab\xe6\x89\xf6\x32\xc2\xc5\x27\xdf\x0a\x17\x4f\x20\xb0\x10\x51\xc8\xcb\x75\x55\x6f\x28\xa2\xe4\x80\xcf\xa0\xd6\x0c\x61\x9c\xad\x60\xe9\x42\xaf\x9a\xba\x2a\xf3\x15\xc1\xb0\x6e\x01\x77\x37\x2f\xe2\xb5\x81\x72\xda\x1b\x4d\x22\xa4\x37\xdb\xa2\xda\xe9\x5a\x1e\x72\x8b\x99\x6b\x1f\x26\x37\x66\xa3\xeb\x23\xc9\x40\xdf\xc6\xfa\x58\x45\x22\x72\x70\xf6\x80\xe3\xc6\xe4\x37\x50\xe1\xef\x6b\x2b\x3d\x6c\xc6\x81\x2b\x41\xf4\x78\x8b\x6b\x57\x9c\xb6\x4b\xe5\x07\x5d\x43\x1f\x82\x92\x06\xc2\xdb\x6f\x50\xfd\xc2\x57\xec\x51\x36\x3f\xda\xb1\xef\xaa\x6c\x57\x6a\x5a\x4f\x26\xf7\xe1\xb7\x20\x08\x8e\x7f\x3b\x28\x20\x0d\x85\x9f\x22\xc4\x81\x96\xff\xdb\xbb\xba\x5a\x3e\x93\x87\xbe\x29\x1d\x06\x77\xaf\xf1\xd6\xf9\x5c\x56\x4b\x73\xc4\x31\x0e\x21\x96\x3b\xf9\x2f\x76\x04\x72\xae\xca\xac\xda\xc8\x0f\x6a\xf5\x19\xc0\x00\xb1\xc8\xab\x45\x8e\xf3\xab\x9d\x3c\xad\xec\x06\x1e\xcb\xd1\xb6\xce\x0b\x79\xfc\xfb\xdf\xbf\x14\xc2\xfd\xfa\xb2\xd6\x26\xe7\x8e\xf5\x9f\xf2\x15\x80\xe0\xab\xe6\x99\x83\xee\x41\x14\x5e\xf0\xd7\xff\xe7\xdf\x48\x47\xbe\xf9\xbf\xf4\xc5\x79\x7e\x9e\xff\xf1\xf9\xe5\xf3\xe3\xf4\xf8\xef\xc4\x01\xf6\x38\xff\xc7\xf1\xeb\x1f\x5e\xbd\xea\xf2\x7f\xbd\x7a\x79\xfc\x1b\xff\xc7\x3f\xe2\x3f\x50\xdd\x2b\x8c\xc9\x68\x99\xb5\xf2\x8f\xed\xc3\x97\xa5\x5e\xc9\xff\xfb\x7f\xff\x6f\x92\xc9\xc1\xee\xb4\x3c\x24\x31\x39\xf2\x74\x20\xc7\xe9\x31\xf2\x1c\xa7\xf2\xb2\x7e\xf8\xa2\x36\xcb\xb6\xd0\x42\x9c\xea\xa6\xa1\x02\xb7\x95\x96\xe6\x19\x84\xd6\x7e\x6e\xb5\x7c\xf8\xb3\x6c\x00\x2c\xac\xba\xc9\x57\xb9\x2e\xdc\xd5\xfa\xf0\x45\x66\x55\x69\xad\x24\xd9\xe4\x4d\x5b\xa8\x1c\x87\x92\xd5\x55\xde\x88\xec\x99\x6a\x1b\xdd\xd6\x72\x5b\x3f\x7c\x81\x84\xf2\xcf\xed\xb3\xbc\x90\x1a\x8a\xe0\xff\xa4\x1b\xa9\xda\x5f\xc0\xba\xd0\x46\x66\x5a\x16\x4a\xee\x9b\x94\xd8\x37\x29\x79\xb8\xca\x9f\xab\x6d\xfd\xf0\x9f\xd8\x66\x5c\x3c\x7c\x81\x07\xfd\xe5\xff\xf8\xcb\x9f\x69\x26\x7f\xf9\xf3\x5f\xfe\xc7\x11\x86\x3c\x4e\x52\x79\xf6\xf0\xc5\xd5\xf8\x0a\x71\xa6\x4a\x63\x3f\x6e\x47\x68\x74\xe9\xa7\x9f\xd8\x49\x6f\xaa\xbc\x34\xd2\xae\x00\xd5\x39\xeb\x5f\x1a\x2d\xcb\x67\x79\x99\xc1\xba\xb4\x25\x20\xe8\x42\xc4\xf4\xe1\x4b\xad\xcb\x26\x11\x15\xa4\xf2\x34\x5c\x47\xf5\x8f\x42\xd8\x81\xac\xaa\x72\xf5\xf0\x25\x53\x65\x63\xc7\xf2\x97\x3f\xff\x38\xbc\x60\xd2\x2d\x98\x69\x6b\xfb\x11\x5e\xef\x44\x42\x8e\xcb\x5a\x6a\xc8\x4e\x56\x6a\x91\x3d\xfc\x8f\x0d\xd7\x20\xd4\xb9\xb1\xd3\xde\xaa\x5a\x02\xa4\x59\x5d\xe6\xba\xb6\x13\x50\xab\x15\xe4\xa5\x07\xa7\xf8\xc6\x0d\x8e\xcc\xa4\xb6\x7e\xe2\xf0\x7a\xa3\x09\x46\x21\xfa\xa3\x30\x55\xbb\xd1\x4d\x53\xdb\x8f\x49\xbf\x16\xb2\x2d\x75\x94\x9f\x4a\xe5\x75\x29\xc3\xe1\x08\x10\x2e\xa3\xa2\x4f\x49\xbc\xe9\x30\x42\x69\xa7\xad\x5a\x2f\x98\xf6\x6f\x88\xcf\xf1\xf0\xa5\x7e\xf8\x22\xc1\xcf\xb2\xfb\xe4\x5f\x2b\xa0\xb6\xfd\x46\xd5\x99\x95\xb9\xce\xc3\xbb\x6b\x92\x57\x25\xaf\x49\x7c\x02\x38\x7b\x02\x5b\x83\xf5\x0c\x20\xc2\xdd\xbf\x0b\x3b\xf9\xdc\x48\xdd\xc8\x4c\x9b\x26\x2f\x1f\xbe\xd8\x25\x79\xf8\xef\x4d\x00\xfb\x6a\x8f\x11\x08\xa2\x7f\xc0\x1b\x90\x57\x3b\x96\xd0\x83\x0b\xf6\x67\xad\x00\xcd\x56\x66\x0f\x5f\x8a\xfc\xae\xd6\x35\x2d\xe7\x36\x87\x1d\x0b\x9e\xe3\x8f\x42\xfe\xf0\x25\x9c\x4d\xb0\x7f\x3f\xb7\x39\x38\xad\x0f\xff\x99\xe9\xe1\x07\xd9\x19\xd8\x4f\x41\x71\x88\x16\x85\x3d\xb2\x56\x2a\x0c\x2f\xed\xc3\x17\x68\x57\xb4\xa2\x16\x0b\x18\x3f\x81\x5f\x6d\x1f\xff\x7f\xfd\xb7\xf6\x0e\x8b\x99\x9a\x87\x2f\x37\x2c\xbc\x85\xee\x48\x5a\x22\x1b\x5d\x14\xa0\x37\xda\xd2\x9b\x67\x22\x7b\x86\xde\x28\x48\xa3\x06\x11\x89\x78\xeb\x12\xb9\x05\x92\x16\xf5\x73\x0b\xdf\x7f\x5c\x9e\x85\x62\x0d\xf5\xf0\xc5\xbe\x0a\xbe\xe2\x94\x94\x75\xb7\xbb\x6a\x6a\xdf\x59\xf2\x0a\xf2\xe1\x4b\x9d\xdf\xc5\xcb\xdd\x17\x0e\x69\x95\x6f\x01\xaf\xb5\xd3\x6f\x4b\xe9\xf6\x29\xb1\x47\xaa\xd6\x82\x94\x8f\xff\x6a\x0b\x1f\xe3\x1f\xb1\x73\xc1\x7e\x1c\x76\xb0\xae\xb2\x36\x6f\x24\x54\x39\xf1\x0f\x85\x92\x4d\xd5\xa8\x22\x6f\x1e\xbe\x08\xf8\xba\x66\x81\xcd\x37\xdb\xaa\x6e\x94\x9d\xc7\x80\xc8\x74\xdf\x11\x8b\x4e\xd4\xd4\xd5\x1d\x3d\x2c\x93\xdd\xb2\x4c\x1b\xb9\xce\x57\xb7\xb9\xae\x8d\x20\x57\x3d\x14\xaa\xaa\x95\xda\x1e\x02\x8d\x2b\x54\x56\xed\x9d\x56\x2d\x7f\x85\x9d\x7b\x3b\x37\x3e\x2b\x76\x39\x44\xbc\x1c\x83\xf3\xd1\x81\x12\x42\xe5\xff\x2a\x75\xd7\x4b\xd6\x15\x34\x21\x16\x55\x6b\x24\x6c\x6b\x7d\x07\x2c\x3b\xf1\x8e\xbb\x6b\x01\x6f\x02\x56\x61\xa4\x60\x41\x07\xb9\xc9\xb7\xa5\x16\x7c\x8b\x96\x9c\xec\x84\x6b\x4b\x37\x60\x89\xc3\x00\x6a\x9d\xe9\x3b\x28\x7a\x90\x85\xdd\x3b\xfb\xb6\xc6\x0e\x5e\x66\xcf\xf0\x90\x41\x8f\xa8\xa0\x53\x66\xda\xfc\x0e\xca\x0b\x3b\x77\xc3\x5f\xfe\xec\x30\xd7\x8e\xff\xf2\x67\x79\x09\xbb\x0e\x80\x90\x4e\x06\xa0\x7b\xd5\x0b\xc1\xde\x45\x7b\x23\xc4\xc9\x5f\xfe\x2c\xc7\xbf\x3c\x7c\x59\xb5\x00\x48\x8c\xcf\x20\x59\xaf\x9f\xf6\x14\xa9\x29\x09\xb6\x7a\xc3\x03\x7b\x65\x07\x66\x7f\xf5\xd4\x67\xbc\x11\xe2\xf5\x5f\xfe\x2c\xed\x9e\x3c\xa7\x75\x45\x69\x30\xf0\x79\x38\x1a\xce\x50\x81\x15\x4d\x10\xdb\xb0\xbd\xb3\xba\xa4\x6a\x21\x47\x0e\x52\x0b\x4f\x17\x85\xda\x9f\x9c\xad\x5a\x59\x3c\x9b\x6d\x75\xc9\x24\xde\x48\x8d\xde\xe4\x50\xc7\xcc\x84\xd9\xb1\x71\x64\xb5\x03\xee\xbd\x7d\x83\x01\xe5\x0d\xb5\x64\x56\x6a\xea\xdc\x5e\x86\xaa\xd0\xa8\x9a\xfc\xdf\x32\xfb\xe7\xcd\xd6\xba\xee\xe7\xb8\xc7\xf9\xca\x35\x7d\xa1\xc8\x3a\xad\xea\x8d\xa4\x87\x3f\xdb\x45\x8b\x02\x79\xa4\x2c\x83\x4b\x2d\x6b\xb1\xbf\xa3\x7f\xc6\xac\xc8\x5a\x35\x28\x33\x2b\xf0\x78\xf1\xb8\x95\x04\xc8\xea\x58\xf6\x76\x42\x6d\xed\x3e\x00\x70\xb7\xe9\x74\x57\xca\xf3\x48\xfc\xb7\xba\xb5\x16\x88\x31\xb9\x1b\x9f\x8e\xa4\x53\x50\xd9\xf5\x8d\xbd\xf7\xb2\x67\x2d\xf4\x01\xae\xf1\x00\xc4\xdf\xd8\x3b\x7a\x58\xc0\x75\xad\x72\x23\xa0\x73\xf2\xe1\x0b\xa8\xf9\xbc\x06\x24\x37\x2b\x09\x68\xa2\xad\x74\xfb\x8b\xb4\x1f\xab\xca\x12\x7b\x9b\xd5\x1a\x72\xd8\x3c\xbd\x9a\x0e\xf2\x1d\x7e\xa8\xb3\x64\x29\xed\x30\x0d\xcf\xaf\x15\x94\x05\xd9\x87\x94\xce\x68\xc9\x5a\x30\x3c\x82\x97\xa1\xa0\xbc\x4e\xe5\x59\x08\x10\x20\xce\x75\xa0\x16\x60\xb1\x82\x49\x67\xd0\x7e\x8d\x15\x67\xe1\x84\xed\x32\xf5\x35\xbc\x55\xdd\x7c\xab\x24\xb8\x81\x81\xb6\x82\x02\x4c\xbd\x6a\x50\x67\x84\x39\x57\xd2\x1b\xda\xc8\x1f\xbd\x30\x93\xb2\x38\x0f\x2e\x96\x60\xc6\xdd\x3d\xb3\x77\xfe\x66\x4b\x97\xa7\x5d\xe8\x26\xba\xf8\xac\xce\x58\xe4\xd1\x2d\xa5\xe4\xc3\x17\x7b\xbe\xfd\xf5\x54\x84\x2b\x01\xef\xd2\xa5\xb5\x61\x70\x53\x36\x88\xd0\x9e\xc8\x4c\x0b\xab\x6f\xd0\x9a\x5e\x69\x34\x8b\x56\xb7\x6a\xd5\xb9\x4b\xdc\x93\x0d\x39\x20\x4a\x52\x84\x02\x37\x1b\xb6\x09\x6c\x07\x41\xcf\x7e\x23\xc4\x2b\x98\xb2\xb1\x63\xb3\xe6\x7b\x63\x17\xa5\x6a\xf9\xe5\xc6\x0e\xc7\xd8\x2d\x7e\xf8\xd2\x28\x30\xd7\xf8\x2c\x7a\x73\x04\x4e\x84\xaa\x7f\x6e\xad\x62\xd6\x68\x5e\xd6\xf6\x5a\xb0\x7f\xb8\x01\x3e\xbd\x1c\x9f\x4a\x86\x82\x6a\xec\x15\xd4\x80\x29\x0a\xa5\x12\x0a\xdd\x25\xb7\x54\x25\x08\xdb\x9d\x2e\x1b\xb1\x55\x86\x76\x80\x67\x87\x8f\xb2\x62\x5f\xe7\x1b\xfb\x63\xc7\x2d\x59\x3d\x32\x9b\x52\x0b\x53\xe5\x58\x0f\x4b\xf5\x59\x70\x2a\x1e\xfe\x3c\x68\x41\xc8\x40\xbe\xec\x9a\x96\x0f\x5f\x02\xed\xf7\x1d\xfe\xfb\x34\xac\x26\xeb\xdd\x99\x70\xbc\xc1\xf9\x69\x3c\xff\x09\x70\x4f\x23\xbd\x58\x60\xc3\xa3\x55\xac\xd9\x70\x88\x8c\xfe\xd8\x49\x00\x43\x0e\x1a\xd4\xc0\x75\xed\xda\xc9\xd2\xe8\x5a\xb9\xc7\xc5\x86\x1a\x08\x2a\xdf\xc4\x38\x81\xef\x53\x79\x81\xdb\x27\x83\xed\x13\xe2\xdc\xdd\xf0\xb2\x7c\xe6\x2f\xf5\x15\xdc\x4e\xbe\x96\x9f\xcb\x25\xf3\x87\xff\xac\xc9\x68\x26\xdd\x02\xd6\xf8\x33\x68\xe7\x33\xba\x06\xf3\x78\xd3\x7f\x91\xcc\xc2\xb9\x91\xfa\xa2\x9d\xb4\x46\x27\xb4\x25\x98\x8e\x42\x66\x28\x43\x0d\xd7\xd8\xb6\xae\xee\x74\x09\x35\x78\x81\xd6\xc0\xd9\xfd\x90\xca\xf7\x2c\x83\x42\x2c\x54\xbb\x66\x71\xa0\xd2\xe3\xbc\xee\x59\x30\x4e\x21\xc5\xab\x0a\x50\xdb\x38\x7f\x16\xeb\x44\xd8\xe5\xad\x73\x03\xb3\xd2\x8d\xdc\x5a\x71\x29\xd0\x42\x7a\xa6\x56\x3f\xb7\xf6\xd4\x42\x25\x84\x15\xfd\x9e\x07\x91\xd8\xef\xd8\xb3\x62\x1f\x2e\x94\x31\xad\xf5\x5a\xba\x06\xee\xb6\xcd\x8d\xd1\x56\xaa\xb6\x55\x99\xd5\x9a\xe4\x75\xa9\x4d\x95\x07\x1b\x80\xd6\x09\x7e\xd8\xba\x89\x25\x38\x40\x20\x8c\x6d\x61\x8f\xaf\xbd\xf2\x56\x55\xf9\x73\x6b\x77\x7e\x81\x97\xb0\xae\xbb\x93\x07\x91\xf5\x1f\x95\x1b\x55\xc2\xde\x26\xb2\xce\x75\x29\xcb\x67\x7a\xb3\x7d\xf8\xef\xab\x5b\x1d\x99\xb7\xd6\xff\x58\xaf\xeb\x1c\xc6\x60\xad\xb5\x55\xd1\x22\x35\x63\x47\x07\xe0\xd9\xad\xea\x06\xf7\xe7\x77\xa9\x9c\x63\xa1\xbc\x02\x6e\xbf\x87\x2f\x9d\x2b\x42\x1b\x57\x4a\x0f\x85\xba\x19\xd9\xc5\x56\x27\xfe\xa9\xcd\xac\xb5\xc0\x33\x2c\x1b\x5c\x77\x67\x46\x64\xde\x56\x64\xcb\xa4\xeb\x90\xa5\xf0\xba\x60\xfe\xa5\xb5\x5d\x5a\x10\x5e\x54\x3c\x8d\x2e\xdb\xee\x08\xb2\x6a\xb3\x01\xda\x6f\xd3\x2e\x73\xc3\xb6\x87\x5f\x0c\x74\x80\xd1\x64\xce\x01\x3a\x05\xce\xac\x5d\x55\x90\x6c\x80\xf6\x41\x19\x97\x86\x34\x7f\x61\x57\x57\xdd\xe9\x55\x30\x3a\xa9\x9b\xd0\xad\xb4\xa7\x6b\x27\x4d\x55\x7a\x4b\xcb\xe0\x32\xfe\x3e\x95\xf3\x87\x2f\x26\x2f\x72\x45\xd7\xec\x80\x47\x86\x26\x1a\x35\x68\xfc\xdc\x62\x4d\x7e\x8d\x5f\xb3\x97\x77\xf6\xf0\x9f\x1c\xda\x89\x5f\x29\xe2\x57\xc2\x1a\x55\x88\x78\x8b\xce\xaf\xfd\xe5\xaa\x82\xfc\x04\xda\x22\xa1\xda\x09\x46\x6d\x9a\x7c\xdb\x16\x38\xea\x2b\xab\x02\xd7\x55\x6e\x12\x69\xe0\xaa\xcc\x1e\xbe\xac\x55\xdb\x50\xc0\xa2\xae\xf3\x1b\x0e\x02\xd8\x9b\xee\xe1\x4b\xa1\x72\xbb\xf6\xaf\x5e\xca\x3f\x55\x2d\x30\x93\x5a\x27\x77\x5b\xe7\x56\xdc\x61\x0f\x4b\x95\x1b\x03\x7a\x80\x36\xd9\x39\xf3\xba\xe4\xc7\x27\xe8\xb5\x3f\xcb\x0b\x69\x9e\xa9\x1b\xab\xa3\x5a\xb9\xad\xf5\xc6\x1e\x05\xfe\x8c\x08\xb7\x20\xb2\x6b\x33\xcd\x1e\x59\x2a\xc4\xa5\xdd\x54\x90\x46\x1e\xbb\x69\x97\xe6\xe1\x0b\xe0\xdb\xb1\x56\x81\x2d\x80\x35\xd1\xbf\x60\x50\x2e\xd2\x78\xf0\xfc\xf2\xe1\x0b\x64\x43\xf2\x5a\x0b\x30\xd1\x60\x17\xfc\x18\x40\x46\xf6\x0c\xc2\x1a\x2e\x2f\x53\xc9\x81\xcc\xc8\x37\x03\xe1\x3e\xd5\x65\x83\x66\x0a\xb1\x97\x22\x86\x92\xba\x01\x53\xc1\xc5\x13\x13\x09\x7c\xaa\x3b\xf0\xa8\x88\xea\xa9\x17\x62\xc3\x85\xb3\x42\x90\xdf\x94\x3a\xb1\x06\x1c\x40\x12\x67\xf9\x7a\x0d\x9d\xe2\x56\xe4\x5d\xc1\x65\xfd\xf0\xe5\x0e\x22\x60\x78\x0d\xfb\x1b\xbc\x77\x13\xc9\xd3\x5b\x65\xe7\xcc\x29\xcf\x5a\xaf\xf4\x5d\xad\xec\xce\x97\xed\xe6\xe1\x4b\x5d\xc9\xb6\xb4\x32\x9b\x5a\xbb\x2a\xbc\xac\xed\xf2\x65\x0f\x5f\xfe\xf4\xf0\x67\x8e\x2b\x85\x37\x1e\x28\x33\x7e\xa8\xd9\x3e\x7c\x59\xe5\x6b\xfb\x98\x44\xae\x9e\x81\x3b\xa1\xdb\x82\x9a\x9a\xc1\x84\xe3\x92\x41\x2b\xb3\x56\x39\x2a\x38\x0b\xdc\x9c\x83\x6e\xc7\x3e\xcd\x11\x58\xfe\xab\xdb\x2a\x37\x79\x8d\xf7\x1c\x7c\x40\xd7\xf1\x7e\xb6\x10\x63\xe5\x91\xa9\x55\x03\x51\x19\xe1\x56\x9c\xff\xd2\x16\x8d\xbd\x52\x74\x0b\xfe\x5c\x0b\x5e\xcb\x4a\x99\xd8\x78\x84\x37\xf3\x3b\xe1\xd9\x18\xe4\x11\xfc\x94\xe0\xd5\xd6\xb1\x8e\x44\x9a\x44\xe8\xd8\x1a\xea\xf6\xf3\x3e\x02\xbc\xd1\x80\x40\x5d\x3d\xfc\x9f\x9d\x3b\xc2\x7e\xbf\x2d\xe5\x26\x2f\x73\xd3\xe0\xdd\xd0\x96\xb2\xaa\x6f\x54\x99\x9b\x8d\x23\x88\x43\x57\x56\xb8\x43\xb8\xa9\x6a\x55\x04\x91\x06\x2e\xff\x58\xd5\x0f\x5f\xac\x2c\x6a\xc0\xd3\x6c\x5a\xda\xb6\xa2\xca\x51\x9f\x8f\x8c\xd1\x9b\x25\x84\xb1\x4b\x85\x68\xcb\x5a\x84\x82\xdb\x39\xad\xf5\xc3\x97\x9b\xbc\x13\x3e\xf3\xe6\x9e\x54\x3e\x2f\xa0\x41\xf3\xae\x14\x59\xae\xd0\xf4\x40\xd1\x32\xa0\x3d\xb5\x56\x40\x69\xe5\x29\xc8\x25\x18\x5d\x83\x2a\xd3\x6d\x81\xf4\x05\x0f\x5f\x90\xee\x71\x8f\xd2\x85\xcd\xc1\xab\xc4\xe7\x08\xc8\x41\x0e\x9c\x92\xc8\x8e\x32\xa9\xf4\xea\x51\x84\x32\xec\x0e\x51\xe8\x9d\x44\xcf\x45\x3f\x56\x96\xd0\x32\xc3\x41\x78\x7a\x9e\x0c\x1c\x09\x6b\x54\x3e\x59\x35\x68\x52\x67\xd6\x1c\xff\xb2\xba\x7d\xf8\x02\xb6\x9a\x53\x18\xa8\x2f\x12\x11\x8c\xa9\xd6\x4d\x6e\x5d\xc2\xbe\x45\xb7\xc7\x92\x93\x1d\x4b\x4e\x8b\xf0\xac\x3d\x29\xff\x93\xbe\xf8\xb7\x7c\xb3\xac\xd5\xf3\xe3\xf4\xf5\xdf\x29\xfd\xf7\x95\xfc\xdf\xc9\xf1\xc9\xeb\x93\x5e\xfe\xef\xbb\x93\xdf\xf2\x7f\xff\x88\xff\x70\xf7\x7b\x20\xbf\x3e\xc7\xf7\x5a\x1e\xfe\xdb\xe5\xf9\x11\x15\xc6\x0c\x7e\x5c\x1e\x42\xb5\xc7\x81\xe3\xe0\x3a\x38\xc2\x4e\x7b\x64\xf3\xf5\xcd\x8c\xd8\x91\xa1\xcd\xaa\xce\x97\x84\xa4\x81\x55\x41\x58\x2c\x86\x35\xd8\xf8\x0a\x2e\x5a\x50\xf2\x4a\xff\xa2\xec\xb1\xc7\x52\x72\x3b\xa8\xc3\x03\xfc\xcc\xc1\x11\x56\xdf\x50\x0b\xbc\xef\x89\x6a\x2a\x28\xc9\xb8\xcb\x95\xcc\xaa\xfb\xb2\xa8\x54\x16\x35\x52\xca\xc3\x03\x0e\xe1\x1d\x1c\x01\xff\xbd\x27\xb2\xe1\x3f\x40\xb1\x7f\x02\x45\x54\x8e\x47\x56\x12\x94\x4b\xd9\xe4\xcd\x4e\x1e\x1e\x7c\xaa\xda\x83\x23\x9c\x1f\x17\xb5\xc4\x00\xe5\x6e\x45\x10\x30\x9b\x31\xdf\x23\x0c\xb3\x4d\x0b\x1c\x79\x80\x70\x60\x88\x57\xa2\xdd\x46\x78\xe7\x71\x2f\x81\x30\x1a\x38\xc5\x9b\x5b\x26\xc3\x82\xc2\x40\xc6\x3f\x85\xd1\x28\x43\x55\x72\xc4\xa5\x71\x9c\xca\xf7\xd6\xa5\xb0\x2f\xf5\xd5\x5f\x5c\xb7\x23\x8e\xd3\x63\xf9\x5c\x2e\xa2\xbe\xe0\xe1\x3e\x86\xde\xcc\x12\x96\x09\x2c\x2f\x11\xd4\xbe\x8e\x65\x91\x89\x6f\x12\x74\xed\xda\x15\xf3\xfb\x0c\x14\x9e\x30\xc7\x7e\xbc\x11\x2a\x6a\xcb\x4c\x80\x6f\xd1\x45\xc3\xf1\x47\xa6\x64\x21\x84\x2c\x87\xa7\x1d\xe3\x1c\x10\x6c\x4c\x42\x70\x5a\x7d\xf0\x8f\xf0\xbd\xf0\xb7\x8b\x38\x6e\xf9\x8e\x19\x61\xb0\x5b\xcf\x77\xcd\x06\xcb\xe1\x79\x40\x64\x53\x25\x0e\x24\x1d\x7e\xb0\xf2\xb3\xac\xf3\xec\x46\x6f\x02\x32\x06\xd7\x5a\xc0\x78\x49\x9f\xaa\x16\x0f\xd0\x41\xf8\xfe\x37\x07\xf2\xd6\x01\xf5\x94\x3b\x2c\x34\x84\xf6\xe9\xac\xb7\x68\x82\xc0\x62\x1c\xf8\x09\xa0\x6b\x51\x57\x63\xdd\x7b\xb3\x87\x71\x8e\xde\x98\x1e\x58\xd1\x38\x91\xcf\xe5\x64\xed\x1a\xb5\xe3\x13\xa1\xb0\x51\xb1\xb2\xbe\xf5\xad\x2a\xd6\xdc\x62\xed\x4f\x2b\x1f\x3c\x81\xc7\x26\xc1\x72\xd9\xa0\x43\x6d\x11\xf0\xf6\xdb\x01\x86\x23\x80\x32\x4e\x2f\x96\xf0\xd5\x5b\x75\xc7\x6d\xfb\xc4\xc5\xd7\x20\x4f\x61\x5e\x66\xd4\xa4\x15\xbf\x9e\xce\x2b\xf7\x89\xfb\x43\x29\x2f\x41\x73\x60\x83\xf9\x96\xfa\x7f\xd0\xf6\x32\x50\xc6\x96\x97\x8f\x3d\x30\x77\x8b\xcb\x4c\x0e\x11\xb0\x2b\xf4\x9b\x78\x41\xe9\x6b\x84\xe3\xf4\x95\x7c\xee\x64\xea\xd1\x65\xf8\x14\xd3\x2f\x00\xf3\x6e\xc4\x5c\xb6\x51\x4d\xe2\xc1\x01\xb1\x8a\x17\x3a\xdc\xf6\x11\xc6\x44\x12\x9b\x79\xb6\x1a\x42\x71\x82\xa6\x6b\x87\x9c\x17\xe0\xf3\x79\xa2\x45\xa8\xf3\x83\x1d\x89\x80\xc1\xe4\x47\xfb\x7b\x8a\x24\xcb\xa6\x12\xdf\x36\x99\xc7\x86\x4c\x90\x23\xcc\x6f\x01\xc7\xa5\x0c\xb0\x57\xd4\x8e\x1a\x02\x49\x85\xf1\x07\x49\x53\xdd\x07\x03\x14\x9d\x83\x03\x9d\x7e\x8e\x1a\x20\x03\xd2\x56\x5d\x3a\xe1\x8f\x50\x24\x22\xe5\xe0\x2a\x5d\xe3\xb5\xb5\x5f\x3c\x00\x02\x79\x37\xc4\xdb\x4a\x9b\x03\x3b\x29\x1a\x8e\xfd\x7d\x58\x1b\x8b\x40\x09\xb0\x99\xa0\x4c\x61\x7f\x88\xc7\x7f\x58\x29\x47\x2b\xc1\x2d\xd4\x8e\xf7\x42\x54\x6b\xdc\xa6\x8e\x32\x9b\x56\x8d\x5d\x09\x18\x9c\xeb\x21\xaa\x6a\x7d\x53\x01\x60\x86\x9b\x77\x34\x7c\xd1\x1d\x7e\x12\x21\x38\xc4\xd0\x12\xf2\x4f\x6d\x9d\x1b\x46\x9d\x82\x6b\xda\xf8\x0a\x72\x86\x47\xfd\x81\xa1\xd2\x1d\xdd\x0c\xb4\x2e\xe5\x66\xdb\x36\x3a\x42\x0f\xf0\xb2\xc7\x9c\x44\x88\x33\x3b\xf4\xb6\x6a\x2d\xd7\x3a\x83\x2a\xd5\xaa\x46\x08\x66\xc4\x58\x80\x75\x9e\x56\x00\x62\x51\xa2\x75\x01\x67\xf1\xf5\xb7\x9f\xc5\x10\xb7\x3b\x84\xbe\x65\x51\x76\x87\x0b\x6a\x48\xc9\x5c\x09\x89\xfd\x11\x4a\xc9\x61\xdc\x45\x9a\xbc\xaa\x3b\x1a\x71\xe8\xb8\x84\x88\xe6\x5f\x3d\xb9\x29\x70\x6a\x0e\x81\x03\x84\xf3\x8e\xa5\x7b\x70\x96\x30\x02\x41\x23\x20\xc8\x68\xba\xf0\xdd\x25\xcc\xc2\xd7\x45\x79\x45\x63\x90\x65\x87\x1e\x8f\x6d\xe1\xc2\x81\x3b\xed\xb3\xa6\x64\xc4\x3e\xf2\x29\xe4\x86\x92\x6a\x69\xaa\xa2\x05\x02\x3b\x68\xb7\x16\x8e\xbc\xc8\xd9\x05\x5e\x2b\x10\x57\x3a\x28\xf9\x7d\x93\xe7\x46\xe2\xf5\x5a\xd7\x4c\xc0\x1b\x09\x23\x7c\x07\xd8\x80\x33\xbe\xbd\xed\x76\xa0\x05\x01\xa4\x23\x3b\x77\x58\x1c\xfa\xab\x7d\x25\xd3\xc7\xfb\x8b\x9a\x5b\xb4\x43\xe1\x80\x57\x12\x9a\x0a\xb4\x63\x20\x90\x0a\xab\x93\x00\xb7\xb4\x23\x3a\x0e\x6b\xc5\xbd\x7f\xf8\x30\x39\x60\x25\x77\xc6\x03\xf9\x22\x86\xd5\x68\x41\x82\xe7\xc2\x64\x8d\x33\xea\x11\x73\x92\x29\xe0\xd2\x57\x70\xb2\xbe\x93\xcf\x11\x09\xcc\xbf\xd2\x4d\x18\x72\xda\x28\x21\x8e\xac\x26\x38\x5c\x88\xd6\xc9\x60\x71\xc2\xd1\xe0\xc0\x17\xaa\xfb\x92\xe0\x56\xf3\x54\xa7\xac\x45\x08\xee\x24\xec\x3e\xed\xa3\xf4\x8b\xc8\xca\x63\xed\x15\x89\xfc\x51\x60\xbb\xa2\xc4\x40\x8f\x0c\xf4\xca\xba\x3a\xc0\x05\x06\xe6\x85\x60\x23\x58\x01\x49\x80\x87\x31\x21\xe4\x53\x38\xf0\x8d\x5e\xdd\x96\x80\x10\x4e\xf1\x7c\xc0\xd4\xd8\x66\xd8\x38\x0e\xda\x1b\xb4\xf2\xad\x35\x48\xf2\xb2\xbb\x4d\x4e\x3d\xd2\xbb\x80\xf0\xac\x81\x1e\x6b\xda\x24\x07\x6b\x42\x37\x33\x63\xd6\x10\xac\xa0\x26\x4b\xb4\x73\xd8\x5d\x5d\xcb\xa4\x84\x5c\x27\x72\x76\x5f\x32\xd6\xc5\x1c\xaf\x23\xf1\x0a\x7c\x84\x31\x42\x90\xf9\xf2\x74\x7c\xa3\xc7\x23\x63\xd9\xe8\x12\xdf\x7a\xb9\xb0\xde\x86\xb5\xda\x1d\x9a\x97\x43\xe7\x42\x94\x9d\xa5\x56\x35\x56\xb4\x84\x32\x0c\xd4\xaf\x3b\xa9\xea\x1c\x5a\xee\x65\xad\x89\x8f\xb6\x67\xd6\x39\xb0\x6d\x37\x28\xc0\xab\x82\x6e\x8b\x15\x85\xaa\xf4\x2f\xb7\xaa\x35\xf4\x6f\xd3\x54\xdb\xad\x2e\x44\xe8\x22\xa6\x72\x54\x14\x6e\x84\x1e\x00\x18\x21\xd9\x83\x75\x8a\x31\x41\x00\x15\x41\x35\x82\x25\x6a\xdf\xba\x0c\x68\x10\x2a\xcf\xc7\x9e\x5e\x9d\x01\xe9\x10\x98\xde\x68\xb6\x87\xad\x18\xa1\xa6\x22\xab\x3e\x3a\x9f\xd0\x9d\x03\x5d\x64\x5e\x39\x8a\x5a\x93\x0b\x90\x39\x4c\x50\x1d\x39\x66\x6e\xaf\x12\xc2\x7f\x00\xde\xdf\x4c\x6f\x54\xfd\x99\xd0\xb6\x1a\x6f\xdd\x46\x4c\x43\xd4\x92\x8d\xa4\xc0\xa4\x98\xbc\x6f\x11\x98\x66\x80\x93\x87\xb8\x27\x3b\x22\xf4\x11\x9d\xcf\x13\x6a\x20\x3d\xce\x78\x94\x81\xfa\xce\x73\x4b\xf9\x81\xb8\x1e\xb0\xbc\x14\x64\xc1\x6c\x88\xa4\x13\x87\x8e\x30\xf9\xd5\x4d\x45\x63\xd5\xbf\xe4\xa6\x61\xeb\x9e\x08\xf7\x3d\x93\x6f\x47\x3d\xc0\x2e\xbc\x62\xfd\xd5\x53\xd7\x68\x9f\xd9\x25\xf6\xbc\x5d\xad\xd1\xce\xcf\xe2\x7e\xac\x04\x06\x90\x08\x24\x63\xa6\x71\x25\xd4\x05\x0e\x00\x30\xc5\xce\x2e\x8b\xeb\xf0\x60\xde\x3f\x86\x84\x67\x95\xfa\x2a\x3d\x09\x8b\x44\xa8\x5d\xc4\x8e\xfa\x23\x36\x11\x41\xce\xf6\xea\xc3\xd8\x35\x4c\xca\x89\x6b\x5f\x3e\x93\xdc\xb3\x3c\x9a\x9e\x3d\xda\xb7\x9c\xca\x7f\x9b\x5c\xbc\x9d\x8f\xc4\xc5\xe8\x0f\xe3\xb0\x33\x7b\x32\x5e\x24\xf2\xe3\x87\x71\xd8\xd4\x9c\xf8\x86\xe6\xd9\x5c\x2e\xae\x46\x57\xd7\x57\xb3\xf9\xa7\x44\xce\xc7\xef\x47\x73\xe8\x30\x9d\xcd\xc5\x7c\x7c\x3e\xc2\xb6\x6b\x6c\x39\xe6\xf1\xa5\xd8\xed\xfa\x6e\x72\x3a\x3a\x3f\xff\x94\xd0\x8b\xe5\xd9\x0c\xde\xeb\x86\x27\xaf\x3e\x8c\xae\xa2\x2f\x62\x2f\xef\xdb\xb1\x1c\xcf\xe7\xb3\x39\xb5\x95\xcf\x25\xfc\x96\x7a\x98\xe5\x64\x2a\x47\x53\x79\x3d\x9d\x4c\xaf\xc6\xf3\xf9\xf5\xe5\xd5\xf8\x4c\x5e\x8c\xa6\xd3\xf1\x3c\xe5\x71\xbc\x9f\x8f\x47\x57\xe3\xc5\x95\xa0\xd6\xf2\xd1\xf9\xf9\xec\x23\xb6\xaf\x9e\x8f\x3e\xba\xf1\x84\x83\x94\x67\x93\xc5\xe9\xf9\x68\x72\xb1\x80\x4e\xe6\x7e\x8b\xb6\xe8\xb7\x68\x27\xdc\xc6\x25\xf7\xb5\x71\xc9\x43\x6e\x6c\xa5\x57\x7e\x18\x9d\x41\x13\xab\x98\x4c\xed\x64\xb0\x8b\x15\x5a\x56\xe9\x1b\x47\x09\x6c\xe4\x74\x36\x9d\x4c\xdf\xcd\x27\xd3\xf7\xe3\x0b\x3b\x03\xe8\x9c\x9d\x8f\xed\x88\xaf\xba\xab\x9d\x40\x4f\x5a\x48\xa5\xbf\xc0\x06\xfc\xab\x59\xe2\xa4\xa2\xfb\xe5\xeb\x85\x6b\xd4\x7d\x37\x9b\x8f\xdf\xcf\x26\xd3\xf7\x29\x15\x74\xc8\x73\x0f\x76\x52\xad\xe5\x79\x8e\x39\xe9\x9d\x10\x61\xc3\x36\x6c\x0a\x4d\xcb\x77\x44\xbf\xa3\x96\xeb\xb3\xc9\x7c\x7c\x7a\x95\xc8\xc9\xd4\xff\x8b\xfb\x9e\x7d\x33\xb4\x18\xff\xeb\xf8\xe2\xf2\x1c\xd0\x00\xf6\x36\x43\x07\x32\x1c\x76\x38\xb3\xac\x43\x87\x33\x4c\x5b\x70\x87\xf3\xe5\x7c\xf6\x6e\x72\xb5\x48\x5c\xcb\xf3\xf5\x62\x9c\xc8\xb7\xd7\x8b\x09\xec\x96\x93\x9c\xc9\x6c\x9a\x44\x6d\xd1\x09\xf5\x08\x2f\xae\xec\x76\x9f\xce\x7e\x1a\xcf\x8f\xac\xc0\x9d\xce\xa6\x53\xec\x5c\xc7\xc5\xb4\x93\x8c\x5b\xb4\xa1\x87\x3c\x3e\x0d\xef\xae\xe7\xd3\xc9\xe2\x03\x40\x01\x04\x0d\xf8\x30\xd3\x60\xf9\xdd\xa1\x8e\x9a\xd5\xa1\x8f\x7d\x21\xdf\x5b\xe9\x1b\x9f\x49\xbb\x9d\xd7\xd3\xb3\xf1\x3c\x11\x7c\x52\x47\xe7\xe7\xe3\xf7\xe3\x33\x39\x5a\xc8\x91\x7c\x3b\x1f\x8f\x4e\x3f\x00\x04\xc3\x6c\x7a\x35\x1f\x9d\x5e\x41\x93\xf6\x6c\x7e\x35\x99\x5d\x2f\xa0\xeb\xf9\x9a\x36\x81\x96\x6f\x3a\x7e\x7f\x3e\x79\x3f\xb6\x03\x12\x76\xd2\x3d\x41\xfd\x86\x6e\x6b\xaa\xa3\xb9\xd2\x35\xa2\x2d\x5d\x11\x32\x27\xa4\xe2\xbf\x07\x5b\xe3\xaa\x1b\x6f\x80\x4b\xaa\x6c\xf2\xb2\x85\x5b\x05\x1b\x74\x19\xb9\x19\xe2\xa6\x65\x93\x17\x21\xc8\xa7\x56\x75\x91\xeb\x5a\x6c\xdb\xda\xb4\xaa\x6c\x5c\x10\xc8\x73\x7b\xd8\xb7\xd1\x3d\xdb\x38\xbe\xd8\x4f\x10\x3e\xae\x0a\x45\x41\xc1\xbd\xb1\x13\xb2\xc5\xac\x69\xe2\x5e\x2b\x7a\x91\x9e\xef\xe1\x0e\xb1\x16\x85\xb3\x75\x42\x1c\x44\xb4\x09\xcc\x2d\xb4\xb6\x39\xe8\xd4\x28\x08\xcc\x4b\x33\xe0\x0b\x05\x2b\xe7\xba\x51\xf3\x32\x0c\x3c\xc2\x7d\x44\x37\x14\xde\xff\x1b\x9d\x01\x3a\xce\x9d\xca\x0b\x06\xb9\xa7\xa9\xa8\x06\xf0\x40\x2b\xc4\x5f\x6f\x76\x08\xfc\xd6\x37\x5a\x60\x5a\xd6\x69\x0e\xdf\x3f\x14\x25\x22\x68\x7d\x85\xbb\x85\xd7\x39\x45\x02\x0c\xf5\x50\x58\x83\xb7\x73\xc5\xd3\x70\x0f\xfd\xcd\x77\x7c\x94\x84\xdf\xe4\x3e\x46\xc2\xf3\x04\x47\xc2\xfe\x1b\xa7\xf1\xcc\x88\x82\x75\x91\x7b\x88\x91\xaf\x61\xfe\xdf\x1d\x25\xd1\xa8\xdd\x4b\xbe\x3f\x82\x18\xed\x45\x6e\x56\xba\x28\x10\xd1\xd0\xfd\x55\xfc\x70\xc4\x3e\x46\x30\x0c\x64\xb0\x69\xeb\x3b\xe8\xc4\x7e\x6c\x29\x5c\x75\x55\xf4\x78\x4a\xac\xf8\x05\x73\xdc\x55\x8d\x27\x29\x0d\xf0\x20\xd7\x51\xb4\xff\xbe\x13\x6b\x03\x43\x8b\x62\x30\x1b\xd5\x34\x01\xe0\x51\x60\x6d\x42\x9c\x74\xab\x6b\xa3\x33\x8a\xb6\x6c\x6b\x7d\x97\x23\xd2\xdb\x66\xd3\x96\xec\x03\x25\xc2\x9a\x8a\x80\xf0\xc4\xa0\x8c\x44\xc0\x80\x31\x23\xa2\x2e\x72\xc3\xb3\x36\x0d\x01\x1d\x51\xe0\x85\xda\x42\x13\xb9\xd4\xcd\xbd\xd6\x68\xa3\xed\x19\xbd\x34\x2a\xcf\x3a\xc3\x47\x48\x2c\x36\xf6\xcd\x6d\xbe\xed\x2c\x81\xf0\x07\x28\x27\x0b\xaf\x5a\x47\x94\xba\x58\xb4\xb6\x6a\x1c\xd3\xd2\x1e\x09\x15\x4b\x2c\x3e\x69\xea\x56\x67\xd6\x1a\x03\x13\x1a\x8c\xfe\x52\xaa\x1b\x5d\xae\x76\x08\x53\x5c\xea\xda\x0e\x24\x91\x7f\xaa\x72\x80\xbe\x2a\x1b\xa8\x35\x08\x01\x42\x05\xdb\xa1\x94\x03\x33\xa6\x5a\x61\xa1\x11\xaf\x44\x38\x09\xc0\x4e\x62\x47\x33\x40\x0d\xb5\xcf\x14\x3e\x6e\xd6\xf7\x09\x19\x16\x80\x02\x62\x84\xd5\x08\x68\xf6\xea\x1e\xfa\xd1\xbb\xb0\x8d\x82\xd4\x01\x90\xe1\x36\xc9\xe0\x62\x44\x0b\x01\x56\xf2\x46\x41\x6d\x1c\x2c\x2f\x80\x23\xac\x8a\x0a\x78\xb2\x50\x07\xb7\x0e\xfb\xac\x43\x7b\x1b\xa8\x29\x00\x17\x63\x30\xc9\xce\x3c\xe3\x69\xf2\x18\x8c\x46\xc8\x76\x07\x57\x8a\xd0\xcc\x10\xb3\x41\x50\x08\x1f\x03\x0d\xa0\xd1\x0d\x4a\x2e\x9e\xd4\xf8\xd2\xc0\x55\xc2\x21\x00\x60\x43\x00\x67\x49\xc1\x93\x75\x5b\x14\xda\x34\xb4\x3e\x1e\x7b\x5d\x10\x13\xd8\xe0\xad\xb4\x24\xfe\xc5\x6d\xad\x1b\x04\x65\xeb\x2c\x20\x54\x8e\x40\x92\xde\x11\xde\x16\xea\xde\xe3\x9e\x37\x44\x22\x7f\xa6\x0b\xe5\xc2\x12\xf6\x2f\xd7\x25\x40\xcb\x2e\x90\x42\xae\x5a\xcb\x11\xb2\x8c\x25\x0c\x27\x20\xa8\x0b\x0d\xfb\xda\xd7\x45\xbe\x82\xd5\xb7\x2a\x7c\x5b\xe7\xe5\x2a\xdf\x16\x88\xc4\xae\xe5\x75\x3a\x4d\xe5\x69\x55\xde\x51\x35\x67\x55\x62\x29\xae\x5a\x35\x00\x96\x0c\xc3\x9a\x94\x04\xe3\x51\x95\xaa\x90\x0b\x85\x84\xf5\xef\xab\x2a\x33\x74\x43\x75\xb8\xa5\xe3\x5d\x1e\x05\xa1\x5b\x61\x9d\x75\x50\xcf\xed\x80\x44\x00\xc1\x7b\x71\xe7\x55\xb6\x3b\x3f\x44\x9e\xae\x6a\xc6\x20\x34\xed\xd2\xe4\x59\x8e\xd0\x2a\x38\x08\x1f\xfd\x1d\x8c\x35\x33\x54\xe6\xd7\x23\xc0\x02\x22\xc0\xc4\x9e\x73\xa7\xad\x94\x60\x58\x30\x2f\xe5\x99\x2a\x0a\x65\xe4\x69\xd5\x96\xcd\x2e\xa1\x58\xb1\x9c\x72\xe4\xc2\xb1\xe4\x19\x04\xf5\x4e\x44\x14\xfa\x71\x7f\xcf\x34\xc0\x0b\x33\x7e\x7f\x67\x19\x18\xcb\x16\xa8\xe8\x30\x8b\x59\xa3\xb8\x41\x02\x35\x2f\x09\xff\x14\x7d\x7d\xab\x30\x3c\x9d\xd8\x5d\x55\xb4\x65\x43\xc0\xd5\xcb\x1d\xf3\x3f\xe0\x02\x14\xea\x3e\x88\x5c\xd8\x07\xde\x2b\x58\x5d\x43\x9b\xaa\x8c\xd1\x56\x65\x6f\x74\x7d\xa3\xeb\x84\x90\xf8\x4c\x55\xe4\x0e\xdf\x2c\x60\xdc\xdb\xd6\xb9\xd7\xe7\x82\xaa\xf4\xc2\x3c\x00\x63\xfa\x42\xce\xab\x86\x73\x00\x0b\x83\x86\x12\x2d\x02\x29\x35\x37\x55\x27\xc6\x94\x67\xc3\xa7\xba\x3d\xbe\xab\xec\x49\x5d\x4a\xec\xb5\x45\x40\xfb\x7b\x95\xdf\xf1\xbd\x16\xd9\x12\x4c\xdb\x1c\x45\x36\x21\x1f\xc9\xbe\xb8\x27\xdd\x66\x13\x68\x38\x1e\xc3\xac\xe3\x76\xf1\x6b\x34\x2b\x50\x75\x38\x4c\x98\x54\xbe\x53\x79\x01\x6a\xbf\xd4\x37\x85\x5e\x35\x88\x97\xaf\x0b\x05\x84\x9e\xf4\x4e\x0c\xd2\x81\x92\x11\xc3\xa3\x8d\xe3\xb0\x56\xf0\x07\x06\x49\x01\x6c\x40\x6b\x04\x48\x46\x12\x18\xaf\x64\xec\xfe\x5b\x49\xb3\xdf\x60\x3c\xd1\x60\xa5\x1c\xc2\x7d\xb0\x0a\x43\x09\x2b\xd8\x44\x67\xb2\x51\x6c\xc9\x8a\x4d\x60\xbd\x85\x08\xb7\x8d\x23\x6a\xaf\x6a\x11\x67\x97\xbb\x53\xdb\xd6\x9a\x8a\x8f\xfb\x83\x81\x33\xac\x3e\xeb\x80\xeb\x58\x20\x5c\xfd\x13\xcb\x98\x7e\xfb\xef\x1b\xff\x4b\x5f\x4c\x4f\x17\xa3\xbf\x57\xe5\x17\xfe\xf7\x78\xfd\xd7\xcb\x57\x27\xaf\x8e\x3b\xf5\x5f\x27\xaf\xbe\x7b\xf9\x5b\xfd\xd7\x3f\xe2\xbf\xeb\x12\x2a\x58\xe9\x38\x4f\x8a\x22\x2f\xab\xdc\x80\x50\xc8\xb0\x9b\x91\x4b\xbd\x02\xe8\xa8\xd5\x91\xfc\xa7\x4f\x5a\xd5\xff\x2c\xff\x69\x76\x5f\xea\x5a\xcc\xa0\x9a\xf5\x3f\xf0\x02\x9a\xaa\x8d\xfe\xe7\x30\x8a\x1e\x46\xb6\xcf\x10\x16\x0d\x52\x48\x3f\x4a\x21\xfe\x69\x4a\xf0\x53\xf4\x07\xd0\x19\xef\xeb\xaa\xdd\xfe\x73\xf0\xc7\x49\x69\x9a\xbc\x81\xa8\xaf\xfd\xf5\xf5\xfc\x1c\xf2\x10\xbd\xef\xbc\x88\x3f\x78\xe9\x3b\x6f\x00\xd3\x1c\xc2\xec\xe4\x7e\x27\x08\x6c\x55\xad\x89\x0c\x2d\x61\x6f\x19\xab\x40\x64\xb5\x64\xae\x4b\x04\x43\x72\xfe\x77\x84\xa0\xc9\xd6\xbd\xce\xe2\x06\x72\x4a\x5f\x1d\x02\xf0\x97\xaf\x38\x4b\x10\xb0\x5a\x15\x3e\xd1\xe9\x82\xe5\x7c\xe3\x06\xec\x0a\x61\xfa\x81\xff\x1c\x40\x0c\x07\x25\x03\x18\x7d\x4e\xfe\x1f\xf6\xde\xb4\xb9\x6d\x24\x4d\x17\xfd\x9e\xbf\x22\x43\x11\x73\x2d\x4e\x40\xb4\x24\x6f\xb5\xf4\xa9\x38\x34\x45\xd9\x9c\xa6\x48\x35\x49\x95\xdb\xe7\xc4\x89\x28\x90\x48\x8a\x68\x83\x00\x07\x09\x5a\xe6\xc4\xfd\x70\x7f\xc4\xfd\x85\xf7\x97\xdc\xc8\x77\xc9\x05\x00\x25\xb9\x16\xd7\x4c\x8f\x34\x11\x3d\x65\x89\x04\x72\xcf\x77\x79\xde\xe7\xa9\xa1\x9e\xe0\x7a\x8f\x98\x4c\x2b\x94\x8a\xf0\x95\x5f\x58\xef\x4f\x65\x19\xc3\x61\x6a\xf9\x86\x88\xf1\x59\xc4\x96\xcf\x50\x19\x60\x2d\x23\x1b\xdd\x87\x14\xad\x76\x65\x0e\xfc\x5d\x9e\x6a\x47\xcd\x6a\x73\x5c\x6e\xce\x96\xff\x41\x88\x7f\x95\xd3\x80\x74\x4e\x23\x05\xa9\x4b\x4b\xc2\x0d\x4d\x29\x8d\xca\xaa\xc1\xd5\x75\x2a\x89\xa9\x39\x4b\x91\x44\xdb\x87\x4c\x90\x7d\xed\xde\xef\xd8\x97\x74\xb7\xad\x01\x69\x4e\xf2\x64\x98\x62\xa0\x06\x70\x22\xe5\x9e\x36\x08\xe2\xc2\xfa\xba\x36\x70\xda\x24\x58\x50\x82\xe6\x08\xf3\x79\x4e\x94\xce\x26\xd5\xed\x82\xaa\x69\xf5\xfd\xab\x1c\x93\x63\x6e\x19\xa2\x4c\x63\x0e\xef\xbb\x48\xb6\xed\x3a\x69\x4c\xdc\xda\x33\x88\xbc\x01\xdf\x56\x94\xd6\xea\x05\x51\x4c\x30\x7f\x92\xa2\xd4\x0a\x4d\x80\x62\x53\x54\x8a\xa4\x20\x2b\x2d\x80\x9f\xd6\x79\x78\xa9\x6e\x6e\x04\xa2\x72\x5e\x86\xf6\xa7\x4f\xe4\xfb\x70\xbe\x23\x7a\x88\xa4\x15\x13\x19\x72\x32\x15\x4d\x6e\xd6\x36\x7a\x4c\xf3\xc2\x7b\x19\x59\xa3\x07\x59\xdb\xda\x42\xf7\x21\xcb\xe9\xec\x7d\x6f\x34\x22\x96\xda\x31\xf2\x8d\x4e\xa6\xc0\x9f\xd9\x64\xad\x6d\x06\xd5\x21\x41\x11\xb9\xc0\x38\x13\x64\x9a\x8f\x61\x13\x6d\x74\x18\xb3\x24\x3d\x8c\x59\x7b\x61\xe1\x08\x82\xc2\xf6\xab\x1f\x86\xb3\x41\x64\x63\xd9\x97\xd3\xc9\x55\x44\x11\x6d\x24\x1b\x6d\x44\xbe\xeb\x11\x6b\x9b\x4b\xe0\xb6\x5c\x0c\x7a\xa3\xe1\xf8\xdd\xac\xf9\xf1\x27\xb3\xef\x1b\xfd\x74\x9f\xf7\xca\x2a\xd5\x55\xba\x3c\x39\xeb\x9e\x9e\x5c\xab\x32\xfb\xdd\x8d\xc1\x07\xf8\xbf\x5e\xbc\x7a\xfd\xaa\x66\xff\xbd\x7c\x7d\xf6\xea\xc9\xfe\xfb\x16\x3f\x73\x63\x9a\xf0\x12\x60\x2b\xef\x48\x88\xeb\x52\xc5\x9b\x45\x06\xb4\x7b\x8d\xa8\x1e\xdf\x49\xc4\xc0\x87\xa1\x95\x2a\xd4\x13\xf2\x21\xfd\xb1\xbc\x8e\x97\x9f\xe2\x5b\x25\xe8\x6e\x00\xf3\x22\x89\xd0\x13\xb4\x7a\x8a\xce\xb6\x7c\x8f\x12\x12\x9b\x38\xa5\x58\xb8\x2e\x36\x4a\x42\x49\x13\x69\xc9\x88\x98\xdb\x0c\x77\x4f\x91\xc9\xe2\x33\xdd\x6e\x89\x77\x97\xd9\x58\x31\xbc\x1e\xc2\xf7\x99\x92\xb7\xe9\x67\x5f\x87\xda\xea\x97\xd3\xc7\x9c\x49\xe5\xf2\xf9\x0d\x98\x38\xf5\x88\xc2\xa3\x45\xa9\x4e\x8a\xf2\x04\xd4\xf8\x51\x87\x1c\xa5\x10\xf5\x1a\x79\x84\xb2\x9d\x0e\x9f\x0a\x50\x35\x14\x91\x82\xe8\x63\x5d\x7e\xfc\xc2\x69\x08\xff\x20\xc4\x11\xbd\xed\x08\xf5\xb4\xb5\x53\xce\x06\x1c\x0a\xe3\x1d\xc1\xda\xf4\x09\x4b\x89\x36\xb5\x3e\xb0\xa8\xb3\x53\x23\x87\x27\x6d\xa9\xe6\x03\x11\x49\xe2\x89\xb9\xa8\x2f\x80\x7c\xf1\x9b\xdc\x15\xe2\x68\x56\xc5\x79\x12\x97\x09\x17\x8f\xf8\x8d\x25\x55\x4d\x3b\x68\xc6\x6c\x20\xb0\x54\x25\x17\x4a\xe5\x56\x3d\x19\x42\xde\xe6\x2f\xc1\x6f\x5b\x82\xa8\x18\x7b\x30\xe6\xa5\xb5\x53\x1b\x0b\x28\xd6\xc2\x09\x04\x43\xb1\x84\x69\x68\xfd\x63\x47\xa0\x14\xb3\x2e\x40\xf4\x20\x45\xc4\x86\x85\xb1\x38\x73\xae\xf0\xe0\x4c\x2e\x5e\x4a\x6b\xc6\x3c\xf7\x63\xb1\x83\x47\x41\xe1\x08\xd2\x82\x3e\x2b\x51\xa9\x1c\x98\x32\xe3\x85\x31\x68\x48\x91\xae\x45\x35\x2f\xd5\x3c\x40\xe6\x69\x53\xb7\x38\xf8\x2b\x2b\xa5\xa8\xad\xa4\x42\xce\x34\xbc\xff\xd8\xe9\x0a\xb4\x01\x49\x60\x24\xd6\x29\x0c\xca\x46\x25\x69\x2c\x96\x85\xae\x22\x99\xec\x9c\xba\x0e\x3a\x3b\x3a\xc2\x88\x12\x48\x3d\x83\xf4\x0f\x86\x64\x39\x50\x09\x10\xf2\xae\x3c\xfe\x08\xa2\x0e\x2e\x49\xe2\xcb\x1e\xf2\x9b\x9d\x22\x48\x63\xb1\x01\x25\x2e\x60\xd1\xed\xaa\xdd\x6c\xa1\xcf\x82\xb2\x4d\xd5\x1e\xb3\x8e\xe5\xad\x42\x0a\xd5\x4d\x5c\x7e\x52\x54\x2f\x44\xb1\xb8\xb8\xa4\x88\xae\xea\x76\x84\x38\xba\x2c\x95\xca\xf6\xb2\xc7\x09\xcc\x23\x12\xb5\x85\xaf\xe4\x85\xf9\x1c\xa8\x39\x40\x47\x13\x8b\x57\x4b\x41\x81\x08\x44\x7d\x8d\x6f\x60\xd6\xb3\x40\x32\x51\x3a\x99\x56\x0a\xa0\x44\x38\x0c\x66\x0d\xac\xe3\x3c\xc9\xac\x16\x53\xa5\x36\xc0\x2e\x0d\x40\x5e\xef\x8d\x0e\xae\xc9\x67\x09\xbc\xc9\x3c\xb4\x4e\x91\xec\x00\xf9\x80\x88\xf2\x8e\x4c\x00\x45\x59\xf6\x5d\x14\x1e\x74\x32\x7c\x08\x6e\xcd\x13\xe4\x7c\x8e\xef\x62\x50\xeb\x58\xc4\x55\xba\x91\xa1\xbb\xc6\x64\xd6\x9e\x26\x29\xef\x4d\x4b\xde\xc8\x47\x39\xef\xc8\x56\xbf\xb3\x45\x69\x96\x16\x91\x92\x71\x96\x09\xcb\xe9\x5d\xd7\x00\xb2\xa0\xac\xba\x77\x1c\xf8\x58\xe7\xae\x73\x98\x4f\x58\xec\x6e\xe5\x2a\xfd\xa2\xa0\xf8\xbf\xac\x38\x7d\x0b\xbf\x42\xa9\x0a\xf4\x7b\x02\x64\x32\xf9\x10\xc2\x66\x89\xa8\x38\xed\xa2\x00\x1d\xcf\xa2\x74\xf9\xa3\xfa\xd2\xec\x1a\xcb\x9c\x06\xc0\x3b\x69\x04\x9d\x56\x66\x88\x31\x12\xad\x2b\x2f\x2d\x46\xb5\x1e\xfe\xb0\xf2\x91\x07\x70\x31\xdb\x29\x57\x6f\x46\x7c\xd8\x40\x05\x1c\x60\xb2\xfd\x5b\x04\x23\xad\x6e\xd4\x9d\xce\x78\x9a\x6b\x55\x56\x48\x2d\x1c\xca\xe0\xa6\x39\x92\x8e\x63\xc1\x51\x42\xe4\xe3\x15\xa6\x2d\xd7\xc5\x1d\xc6\x73\xd7\x2a\x07\xe9\x1a\xfe\x14\x3c\xd8\x7c\xf4\x1e\x41\x61\xcb\x5a\x3e\x19\x0f\x6c\x3a\x85\x1d\x55\x54\x17\x46\x71\x67\xe8\xd4\xa6\x0e\x16\x6f\x9d\x08\x6f\x40\x50\x18\x4b\x6d\x24\x6e\x64\x61\x37\x32\x19\x05\xe6\x02\xd8\xcb\x6d\xa1\x51\xcd\x3a\x4e\x93\xda\x3b\xaa\x42\xde\x68\x95\xab\x8a\x8b\xf2\xac\x58\xbc\x30\xa7\xde\x6e\x03\xf1\x78\xd3\x44\xde\xbc\xe1\xf7\x0b\x4c\x6b\xfe\xc3\x7c\xbb\x5c\xae\xcd\x9e\xd2\xa9\xd5\x7f\xd6\x72\xb7\xcb\x55\xd5\xdd\xed\xba\xb9\xaa\x00\xb8\x87\x7a\x7f\x4e\xe6\xa7\x71\xd9\xa0\xe4\x0d\x48\xa0\x1f\x1e\x93\xf6\x8d\xa8\xbc\x83\x1f\x89\x95\x16\x1d\x30\x3c\x5c\xbb\x55\x62\x17\x0b\x8a\x05\x22\x80\x91\x96\x54\x58\x6e\xe5\xc5\xe1\x50\xa7\xbf\x54\xc4\x0a\xbf\x87\x6a\x39\xcd\xcb\xd6\x49\x79\x6b\x54\xcc\x62\xbf\x9e\x40\xd4\x36\xa3\x08\x17\x2e\x7f\x4d\x78\x5f\x63\x44\x84\x2b\x6f\x58\x28\xbb\xa0\x82\xe5\x25\x63\x2b\x98\x2d\x37\x71\x0e\xd8\x59\x63\x12\x82\xd0\xa7\x59\xc3\x07\x5a\x46\x86\x49\xa6\xe2\x32\xdb\x5b\xd3\x53\xc3\xea\x4e\x19\x97\xef\x89\xfe\xb7\xec\x49\x1c\xd2\xa4\x83\xcb\x0e\x0f\x91\x50\x36\xad\x04\x1d\xbb\x8d\x2b\xc6\x68\x3d\x2e\x84\x78\xe9\x76\x77\xcd\x1e\xb4\xda\xfb\x2d\x5b\xdb\xab\x96\x00\x5c\x8d\x27\xc1\x5f\x94\x9b\xd6\x73\xf6\x51\x1b\xd0\xd7\x72\x68\xf4\x9b\xbf\xe3\xcf\xb1\x99\x0e\x4b\xe2\x9d\xc2\xf4\x59\x71\x77\xe8\x76\x0a\xf9\x24\x02\xcb\x1c\xd3\x9a\xf5\x66\x8b\x61\x41\xb8\xd3\x3a\xa8\xa9\x4f\x22\xd9\xb7\xaa\x6a\x5d\xe2\x28\xe3\x1d\x0a\xd5\x07\xa3\xef\x09\xfd\x2f\xd7\x69\xae\x4e\x4a\x15\x27\x30\xf5\x74\x93\x85\x7b\x04\x5b\xda\xdc\x62\xb8\xd4\xe1\x76\x3c\xb8\xc8\x83\x3f\xc0\x52\xc7\x35\x5a\x5f\x5e\x02\x1b\x09\x45\x1d\x39\xa2\x8b\xfd\x61\x00\xc9\x0b\x7f\x20\xa2\x9a\x14\xbd\x3f\x8e\xe2\xbe\x41\xfa\x43\x56\xe9\x2b\xb7\x4a\xd1\x00\x92\xb1\xef\x6b\x78\xe6\xa4\x55\xb5\x6d\x56\x03\xf9\xd6\x68\xfd\x69\xf9\x1e\xbe\xbc\xb7\x05\x11\xf0\x1c\x5b\xd5\x50\xfb\xba\xaf\x24\x2c\x6c\x83\xf8\xed\xe1\x66\x01\xd3\xcc\x93\xc6\xde\xb7\xed\x36\xf7\x05\x61\x2e\xce\xdb\xdb\x12\xf2\xeb\xa4\x79\x0c\x03\x77\x4c\xe2\x29\x7b\x66\xcd\x4a\xe3\xac\xe3\x36\x69\xac\x6d\xa6\x32\x46\xc3\xb3\x14\xed\x5f\x69\x17\xda\x6c\xdd\xb1\x00\x8c\x48\x3e\x2b\xe3\x99\x12\x08\x90\xfb\xc5\xc2\x00\xc9\x0e\xe1\x19\x7b\xaa\x5f\x71\x63\xa3\x36\x0b\x95\x04\x7d\x7b\xa6\x3d\x50\x09\xee\x4f\x30\x13\xfc\xb3\x91\x1e\xa5\xe5\xf1\x62\x0f\xba\xcf\x69\x7e\xdb\xf9\x91\x52\x14\x9c\x44\x0f\x40\x4d\xb1\xdc\xa8\x52\x59\x78\x12\x0f\x5e\x8b\xbd\xc7\xa6\x3a\x54\x92\x1d\x3a\x5d\xfc\x16\x42\x5a\x04\x3b\x92\x40\x9a\xe7\x35\xe2\x4e\xf4\xb2\x4c\xb7\x55\xcb\xe9\x03\x2b\x06\x24\x30\x62\xd3\xd7\xed\x0e\x9c\x08\x0c\x14\x27\xbb\x25\xfe\xbe\xd8\x55\xdb\x5d\xe5\xcc\xbb\x83\x07\x2d\xcf\x40\x20\xa7\xbd\x32\x63\xe0\x4c\x6e\xa7\x52\x59\xfb\x36\x7a\x29\xc6\x45\xc4\x5c\x3f\xbb\x83\xa8\x76\x86\xee\xaf\xda\xe0\x61\x41\xae\x82\x2e\xb2\xc4\x5b\x2a\x2c\x5f\xcb\xa0\x10\x5e\x95\x89\x27\x88\x61\x77\xc4\x90\x52\xf2\x3c\x34\x00\x60\xf4\x46\x06\x0a\x48\xee\x7b\x04\x90\x1b\xa0\xb1\x7f\x62\x7a\xaa\x12\x79\xb4\xcb\x93\xdd\x66\x7b\x64\x1e\x76\xb4\xcb\xcd\x2a\x31\x5e\x51\xb5\x2e\x12\xf0\x4a\x70\x50\x31\x97\x45\x99\x0c\x6f\x25\xa5\x1b\x18\x05\x50\x24\xae\x1f\x06\x68\x13\xe5\xf8\x19\x02\xe0\xe4\xac\x16\xda\x58\x5f\xf7\x1d\x25\x32\x2f\x18\xe8\x9a\x56\xa2\x36\x39\xa1\xa2\xf8\x4a\x5e\xc7\x65\x0c\x22\xa0\x5a\xbe\x80\x81\x7f\x79\xe0\xaa\x34\xe7\x8a\x05\x2a\xda\xd6\xd6\x3b\x87\xad\x6b\x5f\xc8\x81\xeb\xfd\xa6\x2b\xfb\x52\xef\x16\x65\x61\xbc\x54\x3a\xec\xe1\xf6\x2a\x63\x3a\x1e\xb0\x10\xd2\xff\x8c\x55\x22\xce\xe2\xfc\x76\x67\xee\x88\x8e\x5d\xde\x62\x81\xc2\xce\xb8\x01\xf2\x4f\xa8\xa3\x5a\x34\xed\x84\x92\xec\x48\xb5\xd9\x01\xf4\xd8\x7f\x81\xf9\xf2\xe7\xb8\x4c\xe1\x22\x63\xd7\x8b\x5f\x26\x13\xb5\x4a\x73\x8e\xf8\x78\x4f\x75\x90\xad\xd0\x7b\xf1\x71\x1a\x22\xd8\x03\x31\xa9\x0f\xb9\xdb\x0d\x01\x95\x66\x77\xc2\x36\x75\xf3\x22\x5f\x07\x13\xa2\xb4\x12\x7e\x8b\xd9\x88\x24\x32\x04\xbf\xb9\x1e\xb2\x04\x26\x12\xb5\xac\x91\x42\x0b\x43\x09\xab\x38\xcd\x48\x28\xff\xb6\x54\x98\xbe\xad\x94\xc6\xc8\x4b\xf0\xb0\xae\x10\xdf\x75\x65\xcf\x1d\x64\xad\xce\x2d\x96\xc5\xd2\x5e\xad\xcb\xc2\xca\x38\xbb\x8b\xf7\xda\x43\xfb\x35\x8f\xc2\x9d\xa7\x1f\x6d\xe7\x4c\xdb\xe3\xee\x47\x52\x04\xe2\x8a\xf1\xbc\x80\x88\x64\x25\xe2\xaa\x52\x9b\x2d\xc4\x4a\x81\xdf\xc1\xc9\x02\x37\x8f\x7a\x10\xd6\x95\x9f\x53\x94\xc0\xa7\x70\x89\xca\x13\x08\x53\xf2\x9c\x1f\xe8\x06\x21\x2c\x4d\x33\x1b\x93\x7e\x60\x77\xd6\x0f\xc1\xae\x10\xdf\xe3\x91\xcd\x72\x50\x07\xc2\xb2\x16\xb1\x76\x38\xc9\x27\x38\xc9\x27\x9b\x49\x3e\xfd\x6b\x92\x7c\x67\xa7\x5d\x39\x7f\x3f\x9c\xc9\xeb\x5e\xff\xaf\xbd\x77\x0f\x17\x36\xf5\xc6\x1f\xbd\xcc\x5e\x4b\x99\x4e\x24\x9c\x00\x63\x4b\x89\xc8\x63\x04\x18\x87\x4e\x80\x51\x3c\x54\xe0\x83\x23\x3b\xc8\x93\xff\x4c\xb9\xad\xee\xf3\xc9\xe8\xa2\x77\x7d\x72\xde\x35\xff\xf7\x67\xe8\xbf\x9c\xbe\x7c\xf1\xe2\x4d\x9d\xff\xe9\xec\xc5\x13\xff\xd3\x37\xf9\x31\x4b\x72\xb2\x55\xb9\x59\x04\x75\x39\x2f\x1b\xa3\x80\xc5\x11\xc9\xf3\xef\xe4\xbf\xed\xb2\xbd\x3c\x3f\x3d\x3d\x15\x22\xc4\x47\x60\xf9\x8d\x2f\xb1\xff\x28\x80\x8c\x4f\xc4\x14\xa1\x63\x57\x58\x4c\x68\xe0\xde\x45\x70\x31\x39\xf9\xee\xe6\x01\xdd\x06\x25\x01\x3b\x6a\xa3\xaa\x1f\x20\x94\xfa\x15\x98\x12\x17\xca\x84\xec\x16\xfa\x5c\x54\xcf\x8f\x92\xf9\xe2\xbc\xf9\xc0\xfb\x31\x22\x1e\xa1\x5e\xdb\xe3\x85\xf7\xf8\x48\x1e\x00\x8d\x44\xf7\xa2\x46\xb8\x80\x3f\x1c\xe4\x5f\x0b\x1a\xc1\xaa\xf0\x7a\x1f\xa1\x53\x96\x50\x28\x88\x41\xef\x1b\x19\x42\x0c\x99\xd8\x1b\xe5\x88\x97\xda\x11\x3e\xe6\xc1\x5b\x44\xd6\x6f\x11\x71\x0f\x54\xe4\xd0\xe5\xc1\x17\x99\x5d\xe7\x81\x72\xf5\xab\x2e\xca\x1d\xb4\x5f\x55\xf6\x25\xde\xa5\xc7\xf6\xb6\xeb\x4c\x8e\xd5\xe9\xc2\xfb\x15\x16\x37\xd3\x84\xa4\x25\xc5\xd5\xbe\xb6\xa9\x22\x68\xea\xeb\xae\xbc\xd8\x29\xb9\x2c\x55\x92\x56\xac\x4b\xb7\x50\x24\x92\x4e\xe6\x82\xdb\xcd\x65\x01\x61\xa7\xe3\x75\x55\x6d\x7f\x78\xfe\xfc\xee\xee\xae\x5b\x6c\x55\x9e\x25\xf1\xb6\x5b\x94\xb7\xcf\x3b\x68\xeb\xce\xdb\x87\x86\x92\x17\x9f\x53\xad\x78\x31\x1e\x14\x8e\x1f\xc4\xcb\xb5\x80\xcf\x92\x3d\xe5\xc9\xb5\xa3\x51\x5a\xd7\x61\x77\x8e\x2f\x87\x39\xed\x48\x13\x2e\x39\xa8\xb8\xe3\x77\xdb\x77\x78\x45\x69\x5e\x75\x9e\xb1\x29\x1d\x84\xd8\x7e\xda\x5a\xcb\x56\x6b\x1f\x0c\x89\x56\xc8\xd0\xdb\x8f\x70\xed\x4f\xae\x07\x63\x1c\x90\xc9\xcd\xf8\x02\xec\x01\xd6\x84\xb5\x50\x1c\xf9\xcb\x2f\xbd\x99\x18\xce\x9e\x3d\x83\x3f\x79\xf6\x46\xa0\xf3\x1c\xd4\x4e\x7b\x16\x47\x8b\xe4\xb3\xf8\x55\x92\xcf\x07\x2d\x0e\x61\x3a\xc7\xc5\xca\x83\x8b\x43\xf0\xa2\xb6\xbe\x9a\xe6\xcf\x67\x21\xf2\xe8\xd7\x56\xee\xca\x7b\x2a\x77\x05\x03\x94\x8e\xef\x1f\x19\x33\x41\xfd\x9b\x29\x56\x38\x43\x31\xe9\xdb\xd9\x7c\x38\xbf\x99\x0f\xe4\xbb\xc9\xe4\x02\xb0\x5b\x28\x24\x3d\x98\xfd\x18\xd6\xf2\x62\xb1\xee\x64\xca\xa5\xbe\x3f\x9a\xff\x6e\x2d\xf0\xed\xc8\xf7\x93\x0f\x83\x9f\x07\x53\x01\x12\xe6\x17\x30\xc8\x30\xf1\xb0\x28\x26\x53\xc0\x8d\x39\x04\x95\xf4\x10\x54\x0e\x34\x35\x9b\x4f\x87\xfd\xb9\x0f\xb4\xa2\xf2\x5a\xbf\x22\xd9\x95\xd4\x06\xf8\xaa\x8e\xc5\x57\x0d\xf1\xb5\x1f\x7a\x1f\x3d\x65\x67\x61\x6b\x81\xbd\xe5\xeb\x14\x91\x1f\x5d\x7f\xdb\x15\xc2\xee\x78\x20\x9a\xb3\xac\x04\xf7\x9f\x95\xce\x15\x38\xfb\xfe\xfb\xef\x4f\x8c\x21\x70\xe8\xf8\x88\xcc\xc5\x71\x57\x14\x89\xec\x03\xeb\x5b\x3f\xce\xd2\x55\x51\xe6\x69\x4c\x2a\x9d\xbd\x2c\x23\x6e\x11\x39\x65\x64\xb0\xf4\xb0\xba\xc4\xde\x57\xc3\x5e\x24\x2d\x49\x4f\xd1\x00\xa5\x10\xba\xf7\x09\x45\xf6\xe0\x4f\xf7\xf9\xe0\xe6\x22\xae\xe2\xdb\x32\x4d\xfe\x1c\xfe\xd7\xd3\xd7\xe7\xa7\x75\xfc\xff\x8b\x57\x6f\x9e\xf0\x5f\xdf\xe4\x67\x70\x23\xcd\xf4\xbf\x2b\xd3\xc4\xdd\xc0\xed\x60\xff\xf3\xd3\xd3\x33\xe9\x7d\xfe\x10\xb8\x7f\x1e\x98\xff\x96\xc7\xc5\xd5\xaa\xf9\x1a\x1e\x2e\x28\x62\x4e\x9d\xe0\xe9\x97\x45\x29\x36\x05\x3c\x22\x50\xf1\xad\x7d\x30\x92\xdb\x4c\xc5\x5a\x49\xad\x94\xf4\x4c\x1d\xb5\x3b\x49\x78\x61\x1b\x6b\x07\x28\x58\x75\x15\x67\x19\x9d\x4f\x00\x95\x67\xeb\x1c\x7f\x95\xa4\x7a\x9b\xc5\x8c\x9d\x67\xb4\x0c\x96\xcc\xb7\x06\x4e\xb4\x45\xc6\xdf\xef\xbb\x38\xd2\x36\xf3\x30\xcf\x47\xd0\x91\x08\xfc\x1a\x2c\x71\x23\xb6\x2f\xe5\x15\xc2\x7b\x75\x6a\x6c\x0c\x51\x54\xd1\x6a\x0c\xef\x16\x27\x8e\xf4\x2f\x24\xce\xbc\x07\x6a\xdf\xee\x17\x7d\x55\xef\x42\x3f\x47\x1c\xc6\xc2\x5b\xe7\x05\xff\xcc\x1d\xb1\x3e\x90\x8c\xb5\xbc\x53\x59\x86\x14\x41\xad\xc8\xfd\xc8\x11\x9f\x71\xe3\x18\xc7\x27\x1b\x6e\x8f\x57\x8f\x7d\x9f\xdf\xa3\x1d\xdb\xcf\x39\xda\xc3\xcd\xc7\x01\xa2\x0b\xb4\x9b\x2d\xd1\x11\x85\x15\xc3\xa5\x11\x85\x34\x9a\x55\x8b\x5e\xfd\x0f\x42\x1c\xc1\x26\xe1\x84\x90\xdd\x23\x2e\xd9\xe4\x15\xc8\xd4\x17\x7c\x60\xd0\xd7\x57\x79\xa7\x7b\x24\x44\x2f\x94\xe2\x4f\x57\x1c\x9b\xb4\xe2\xf2\x69\x99\x9c\x60\x81\x62\xbc\xfc\x94\x17\x77\x99\x4a\x6e\xd1\xc7\xcd\xcd\x56\xcb\x32\x66\x67\xa2\xea\x85\xf0\x53\x8c\xc9\x72\x73\x9e\xd4\x67\x85\x33\x79\x00\x88\x99\x5b\x5c\xc1\xd1\xe0\xe2\xdd\x51\x04\xff\x4f\xce\x8b\x22\xfb\x94\x56\xf0\x4f\xd7\xbb\x23\x98\x37\xff\x37\xec\xc8\x1c\x89\x47\x05\x1e\xbd\x85\x61\x33\x49\x9e\x6b\x07\x68\x2f\xe3\xc2\x44\x82\xe8\x97\x60\x1a\x0f\x3a\x64\x8b\xbd\x5c\xab\xed\xc9\x16\xdb\x70\x62\x06\xfa\x44\x25\xb7\xbc\xd3\xfe\xe7\x52\x95\x79\x77\xb9\x76\xd8\x00\xeb\xc2\x1c\x26\x82\x8b\xf3\x7d\x91\x73\x58\x3a\x0f\x71\x4f\x71\xb5\x5c\x2b\x1d\x89\xdd\xf6\xd6\xd8\x64\x5a\x3a\xcf\xdd\x4f\x76\x47\x52\xe5\xeb\x38\x5f\x52\x64\x02\x4a\x4f\x6b\x70\x4e\x25\x57\x0a\xd4\xac\x74\x24\x56\xbb\x7c\x89\x25\xdd\xc4\xe8\xb1\x55\x25\x1c\xaa\xf9\xb2\x25\x64\x63\x73\x2b\x90\x79\xc5\xa5\xe8\x72\xb2\x82\x14\xcf\xa9\xa0\x28\x00\x32\xb6\x41\x5f\xee\x6b\xaa\xb8\x2b\xca\x4f\xce\x2d\x06\x3d\x81\xcd\xb6\x28\x91\x1b\x23\xdb\x13\xd6\xd0\xec\x1d\x40\xea\xd6\x49\xef\x1c\xa4\x84\x0b\x93\xf9\x4c\x89\x1d\x47\x0b\xe4\xb4\xf6\xcc\xe0\x6a\x4b\x64\x41\xec\x9e\x69\x58\x50\x4b\x20\xdd\x02\x79\x35\x45\x51\xfc\x35\x18\xcb\xbb\xa2\xcc\x92\xbb\x34\x69\x12\x50\x87\xec\xd4\x5b\x55\x6e\x15\x00\x64\x1d\x0f\xb5\x48\xf1\xe6\xa9\x5d\x3a\xaa\x7e\xe3\xec\xa3\x10\x2e\x88\x4c\x1d\xf6\x58\x87\xc1\x15\x8f\x1e\x5c\x20\x47\xd4\xae\x5a\xdc\x45\xa7\x8a\x32\xe0\x8d\x44\x14\x8a\xf3\xa7\xf9\x75\xbe\x00\x5c\x05\xd1\x3b\x66\xa0\x68\x9e\xcb\x96\x10\xca\xfa\x9b\xd3\x47\xb8\xd9\x66\x88\x7b\xf3\xde\xbb\xe9\xf0\xa2\xe9\x5e\x7b\x41\x7d\xf1\x70\x30\xff\x01\xd7\xda\x0f\xe6\x8b\x07\x6a\x77\x8c\xb3\xd4\x9b\x0f\x67\x97\xbd\xfe\xdc\x38\x7d\x7f\xbb\xe9\xe1\x1f\x1a\x4e\xb7\x68\x29\xec\x21\xca\xa6\xba\xef\xfd\x50\x77\x81\x6b\xcd\xb8\xe7\xd3\x81\xe9\xa6\xf1\xa1\xc1\x13\x6f\x10\x9f\x45\x21\x7f\x57\x24\x07\xe3\xf7\xbd\x71\x1f\x5c\x63\x18\x9c\x8b\xc1\x74\xf8\x73\x6f\x3e\xfc\x79\x20\x3e\x4c\xa6\x7f\x25\x86\xaf\xc9\x65\x84\x3c\x5c\x66\x60\xb8\xea\x08\x7c\xcc\xeb\xde\x7c\x30\x9e\x47\xae\xac\x28\x92\xf3\x69\xef\x62\x20\x67\x83\xfe\x74\xe0\x0a\x80\xc4\xf5\x74\x72\x3d\x1d\x0e\xe6\xbd\xe9\x47\x24\x9d\xb2\x34\x4e\x2e\x6b\x12\x78\xc8\x58\x9a\x75\xef\x24\x63\x18\xe2\x7d\xef\x67\xe8\xbb\xfd\xa6\x9c\x9b\x7f\xf4\x07\xe3\xd9\x60\xe0\x35\x60\x30\x9d\x4d\xc6\x38\xf6\xcd\xd8\x83\x8d\x37\xf8\x41\x88\x20\xda\xe0\x87\x22\x8c\x57\x7e\x7d\x33\x1e\x9a\x71\xaa\xf3\x87\xf5\xdf\xf7\x8c\x2f\x0f\x9e\xfd\xbd\x19\x22\x2f\x2a\x21\xda\xa3\x12\x92\xa3\x12\x51\x33\x2a\xe1\x05\x25\x22\x3f\x28\x21\x42\xd6\x31\x0a\x4a\xc8\xfb\x82\x12\x2e\xfc\xc0\x25\x6e\x58\xbd\x25\x5a\x63\x0e\x1d\x68\xf9\xc5\x8d\x1f\xa6\x38\x50\xe7\xe5\xe2\x10\xc2\xc5\x21\xe4\x6f\x8d\x43\x08\xcb\x03\xf6\x67\x3b\x40\xff\xcd\x7f\xba\xcf\xaf\xdf\x5f\x9f\xbc\xe8\x9e\xfe\x81\x14\x00\x0f\xf8\xff\xaf\x5e\xbe\x78\x59\xaf\xff\x7f\xf5\xfa\xa9\xfe\xff\x9b\xfc\x18\xd3\xfc\xfa\xfd\xb5\x53\x7e\xe1\x30\xfd\x8b\xee\x69\xcd\xff\x3f\xfb\xfe\xfb\xef\xe5\x89\x3c\x3f\x3d\x7d\x2d\xf9\x6b\x50\x2b\x0c\x81\x00\xd1\x0c\x04\x1c\xc8\x10\xde\xe3\x0b\xdf\xef\x67\x1a\x9f\xf6\x6b\x13\x80\xf2\xd7\x26\x00\x7f\xef\x82\xee\x5f\x93\x30\xfc\xbd\xdb\xf0\xfb\xd6\x94\xbf\xf0\x13\x7b\xd7\xef\x7f\x97\x9c\x5e\x03\x19\x72\x10\x10\x02\x5c\xfd\xcd\xdf\x47\x82\xa2\x41\x90\xa1\x5c\x56\xf2\xd6\xac\xd0\xff\xb9\x5d\x6f\xbb\xb9\xa2\x74\xe4\x3d\xe9\x3e\x7d\x4f\xba\xcf\x74\x31\xe2\x54\x1f\xfe\x53\xb4\x65\xf9\xa2\x87\xb3\x7c\xf0\xc2\x5a\xcb\x38\x1f\x96\xe6\x09\x56\xd8\xb0\x17\x56\x7a\xa3\x02\xde\x12\xa4\xa7\xf3\x7f\x90\x4b\x87\xf3\x63\x36\xe3\x62\x2f\x75\xbc\x4f\xf3\x5b\x71\x74\x59\x14\x80\x93\x82\x69\x31\xce\x87\x8a\x13\x58\x28\x71\x06\xc5\x4c\x69\x05\x1d\x90\x97\x45\x81\x78\xc1\xed\x7a\xbb\x2a\x8a\x23\x48\x87\x06\x9b\x1b\xda\xc4\xae\x1e\xa6\x03\x13\xce\x28\xe7\xea\xce\x29\x17\x86\x39\x36\xc2\xe3\x37\xb2\x84\xf6\x7c\x61\xde\x34\xcc\x5d\xc6\x7e\xc6\xd0\x34\xb0\x96\x2d\x14\x93\x1c\x36\x29\x12\xc2\xc1\x66\xb5\x35\x82\xd4\x38\xcb\xad\x1d\x5b\x61\xb8\xb8\xb4\xcf\x09\x5b\x07\xe2\x4e\x58\x78\x84\xc0\x2f\x9f\x21\x8e\x30\x68\xad\xc2\x29\x71\xc5\x4f\xb4\x09\x4c\x01\x55\x0f\x04\x83\xa6\xaf\x13\x99\x95\xd7\xda\x87\x93\x95\xac\xa3\x58\x1b\x47\xd7\x3b\x8a\x04\x79\xc7\xee\xb8\x90\x45\xce\x50\xf1\x6a\x1d\xe7\xe1\x07\xa0\x8c\x32\xac\x3a\xc5\x3a\x24\xd7\x0c\x0f\x92\x00\xf9\x16\xaf\xc5\x5c\xf6\xe9\xd1\x44\x8d\x6c\xfe\xf4\x75\xeb\x59\x0a\xb8\x70\x73\x8e\xdd\xad\xe3\x4a\x23\x80\xb6\x7e\xa6\xba\x73\x29\x8c\x29\xfd\x70\x28\x26\x76\xfd\xfe\x1a\x59\x5a\xb2\xbd\x74\x7c\xa5\xb0\x83\xfe\xe2\x05\xc2\x68\x1f\x3d\xff\xe9\xe8\x31\xe9\x5d\x33\x46\x17\x83\x9f\x07\xa3\xc9\x35\x64\x14\xe7\x83\xde\x15\xa4\x73\x65\x7b\x3a\x57\xfc\x66\x9f\xf3\x7e\x7a\xe8\x47\xa5\x73\x1b\x2e\xe5\x70\x2c\x5a\xd2\xb9\xad\x7d\x6b\xc9\xe7\x86\xa4\x11\xe2\xf7\xc9\xe7\xb2\x27\x25\x7e\x7b\x3e\xd7\x7a\x4e\x3f\x8a\xdf\x9a\xcf\xf5\x5c\x27\xf1\xdb\xf3\xb9\x4c\x97\xdc\xee\x5b\x7d\x4d\x3e\xd7\xf7\xa3\xc4\x6f\xcb\xe7\x86\x59\x17\x40\xfa\x6a\x64\x3a\xbc\x37\xf1\xb2\xd8\xcb\x8d\xd9\xb6\x4e\xd2\x0b\xea\x55\x9c\x98\x57\x78\xe4\x20\x1d\x80\xbb\x1c\x96\x71\x4e\x18\x53\x73\xd9\xaa\x04\x60\xe9\x83\x4d\x9c\x66\x32\x6e\xde\xbd\xe6\xca\x3e\x94\xd1\x71\xcf\x64\x0b\xc6\xfc\x86\xc2\xae\x41\x8e\xa7\x65\xd7\xff\xc4\x03\xd0\x38\x3d\xcc\x83\xfe\x97\xca\x13\x39\xc8\x6f\xd3\x5c\xb5\x9c\x24\x71\x15\x3c\xf1\x3f\x54\x9e\x74\x97\xc5\xe6\xa7\xff\x1e\xae\x69\xf7\xf9\xbb\x6c\x97\x7d\x51\x7f\x24\x03\xdc\x03\xfe\xdf\xe9\x9b\xb3\xd7\xf5\xfc\xef\xe9\x9b\xb3\x27\xff\xef\x5b\xfc\xcc\x5d\xbd\x38\xdc\xfa\x1c\xe0\xdd\x3a\x84\xfb\xb2\x0e\xfa\x38\x3b\x35\xc7\x46\x2f\x4f\x4a\x75\x27\xaf\xb3\xa2\xfa\x94\x1a\x7f\xc0\x16\x89\x35\x51\x1b\xc6\x9e\xc2\x8d\x07\x52\x2c\xe6\xc0\xc1\xe2\x79\x24\x6d\x67\x99\x1d\x2f\xcb\x27\x62\x2d\xa1\x16\x87\x4c\x18\x68\x1c\x3c\x34\xc8\xf1\xb1\x04\x1f\x16\x36\x7b\xf5\xe4\xc6\x26\xf3\x24\x80\xd0\x7e\xa1\x1e\xa2\x3c\x28\xea\x07\x51\x35\x51\x93\xe1\x23\x46\x42\x4f\x6b\x31\xf1\xd7\xe3\x3c\x11\x07\x28\x41\x6c\xa1\x2e\x99\x72\x91\xf4\x3a\x61\x0c\x4e\x96\x60\x71\xd5\xdb\x02\x1a\xc2\x8d\x28\xea\x29\x4c\xaa\xad\x45\xbe\x5e\x2d\x37\x7b\x49\x75\xbc\x44\x0e\x3c\x1d\x49\xbd\x36\xdd\x00\x2f\xf1\xd7\x9c\x58\xdd\xe7\x37\xfd\xd1\xc9\xd9\x9f\x18\xff\x39\x7f\xf9\xf2\x65\x7d\xff\x9f\xbf\x7a\xf5\xfa\x69\xff\x7f\x8b\x9f\x9b\xad\xae\x4a\x15\x6f\x64\xbf\xd8\x6c\xe3\x2a\x25\xca\x05\x46\x80\x7c\xee\xca\xb3\xee\xa9\x3c\xa6\x45\xc2\x32\xc0\x0f\x7c\x0b\x09\x0f\x99\x4c\xa8\x83\x5e\x06\x6a\x5c\x41\x42\x9e\xf8\x22\x20\xf9\x07\x7e\x03\xc8\x78\x02\xb9\x3b\x7e\x75\xc2\x8c\x12\x1f\x8a\xf2\xd3\x51\x47\xde\x81\x9a\x63\x71\x97\xab\x32\x78\x78\x51\x1e\x75\x8c\x23\x28\x80\x8a\xa0\x1e\xf8\x40\x17\xca\xe5\xdd\x65\x9c\xfc\x23\x5e\xaa\xbc\x72\x44\x24\x35\x78\x02\x93\xba\x04\xef\xff\x41\x08\xea\x4a\xe2\xb9\x71\x0f\x0c\xc1\x59\xf7\x54\x88\xb3\xce\x3d\xaa\xbb\x5d\xc9\x7d\x90\xa4\x99\x0b\xd9\x63\x3f\xcf\x18\x24\x16\x45\x2d\xeb\x68\xa9\x1b\x7d\xcd\xdb\xc8\x56\x47\x25\xbb\x50\x66\xd8\x53\x77\xaa\x0a\x91\x14\x6d\xf5\xe4\x55\x51\x0b\x3e\x05\xe3\x80\x71\x87\x6d\xaa\x1c\xcb\x3f\xca\xdc\x15\x65\x50\x4f\x2b\x98\x44\x88\x32\x90\x3f\x42\xfd\xb7\x19\xf2\x32\xce\x75\x06\xaa\x54\x71\x12\x6f\xab\x48\xc6\x59\xa5\xca\x88\xc8\xa0\x21\x09\xc9\x69\x50\xa0\x65\x28\x6d\xe1\x18\x37\x44\x98\x86\x44\x98\xc4\x5f\xec\x1d\x43\x7f\x3d\xe9\x29\x8f\x8f\x2e\xdc\xaf\xcc\x97\xf4\x51\x47\x2e\x62\x98\x43\xd2\xd5\x10\x41\xef\x7e\x84\xea\xf1\x50\x7d\x0e\xcb\xfe\x48\x0f\x41\xd5\x58\x56\xc2\xb1\x31\x47\xb2\x7b\x23\x34\xd3\xb2\x34\xb1\x68\xbf\x0d\xa4\x21\x0b\x74\xc1\x94\x4b\xfc\xd4\xf0\x89\xa1\xcc\xa4\xa8\xb5\xc5\x16\xf7\x66\xf5\xa5\xf9\xe0\xf6\x14\x2c\xf8\x55\x1b\xa1\xba\xb0\xe5\xe3\xde\x28\x16\x05\x97\xa6\x3e\xb0\x25\xf8\xd6\xea\x6d\xe3\xe5\xda\x81\xcc\xce\xbb\xa7\x50\xfe\x1a\x57\xaa\xfc\xd1\xab\x82\x47\x9a\x51\x08\x27\x34\x87\x1b\x87\x34\xdb\xff\x08\xf7\x31\x7d\x49\xf1\xfc\x6d\xb3\x78\x7f\xcf\x97\xba\x42\x9c\x7b\x3b\xf3\x1a\xc4\xce\xfe\xe0\x6d\x89\xb3\x83\xba\x6a\x12\xc2\xb1\x1a\xce\xb3\x84\x58\xd7\xab\xd2\x6c\x1a\xa8\x14\xad\xec\xe0\x14\xa5\x93\x57\x53\x9b\x45\x91\xa4\x0e\x68\x53\x5b\x7e\x1e\xd9\x2a\x05\x8a\x04\x3f\xe3\xf0\x99\x80\xcd\x01\x12\x08\xa8\x49\x24\x78\x82\x56\x59\x16\xa1\xa2\x25\xd6\xf5\xc7\x99\x8a\x04\xc0\x25\x8c\xcf\x88\x25\x28\xe9\x06\x6a\xfd\x1f\xda\x09\xb8\xf7\xba\x42\xbc\xf0\x46\x9c\x38\x85\xfb\xc6\x9e\xb2\xc3\x3e\xa7\xa0\x94\x3c\xf2\xfe\xec\x68\x9d\x40\x04\x8e\xb8\xf1\x7d\x66\xa3\xf0\xe5\x2b\x88\xce\x02\xdb\x56\x83\x2e\x26\xad\xac\xd4\x9d\xf5\xfe\x6a\x95\x32\x24\x63\xc9\xe4\x39\x61\xc4\x2c\x78\x93\xb7\x4c\x00\x69\x02\xe4\xbb\x8e\xe9\xa4\xc1\x64\x11\xca\xf7\xb9\xee\xb7\xf5\x42\x78\x62\xae\xc8\xee\xe3\x7d\x39\xec\x2f\x2c\x0f\xdb\x12\xb7\x79\xb5\x6b\x1f\x09\xeb\xa8\x5a\x28\x50\xc7\x55\xaa\xd9\xb2\xf5\x60\x4a\x8b\xbd\x25\xcd\x69\x76\x43\x1c\xea\x06\x12\x13\xf8\x6e\x7d\xa9\xb6\x85\x4e\xab\xa2\xdc\x3b\xea\x89\xbd\x5c\xc6\xd9\x12\x4a\x9b\x81\x12\x98\x68\x84\xd3\x5c\x7d\xd9\x9a\x9b\xfa\xb3\x62\xe9\x8c\xcf\x2a\x4f\x01\x0f\x88\x9a\xb8\x24\x34\xba\xc2\x9b\x86\x4d\x6a\xdb\x43\x8e\xde\xea\xda\xf9\xdd\x9c\x35\x21\x5e\x76\xe4\x00\x77\xab\x59\x16\x97\x65\xb1\xb1\x27\x11\xac\xcf\x6e\x3b\x53\xae\xdb\x4c\x01\x01\xae\xa0\xa8\x67\x40\x80\xcb\x85\x38\xfe\x9b\xf1\x7b\x24\x6f\x81\xb9\x82\x50\xa1\xd0\xcc\x51\xba\x54\x82\xa4\x01\x1f\x4f\xa2\xdb\x92\xc5\x08\x6e\x4b\x9b\x8d\x20\x2d\x4a\xca\x4a\x34\x6b\x8e\xb8\x8b\x5d\x16\xf9\x8c\xb5\xd3\xaf\x14\x04\x00\x32\x17\x6f\x9a\x9b\xde\x80\x4c\xa9\xf5\x17\x79\x0c\xe9\xcc\x0c\xe4\x76\x0b\xfb\xe8\x67\xda\xd7\x3f\x14\x8e\x4e\x2f\xf2\xce\x22\xf3\x01\xa9\xd5\xb2\x54\x08\x68\xb2\x18\xce\x76\xe1\xcd\xae\x1c\x17\x82\x0e\x56\x7e\xa5\x2b\x01\x78\xcc\xd1\x26\xbd\xa3\xad\x28\x05\x9d\x6c\x78\xe0\x12\xac\x6a\x45\x92\x8e\xc1\xf1\x1d\x86\xdd\xed\xb5\x48\x7f\xa6\x8a\x7c\xe1\x09\xe2\x9e\x43\xc8\xbe\xbd\x91\x10\x93\xf7\x56\x84\x5b\x72\x20\x49\x26\xd3\x15\xd2\x92\xe1\x9f\xdb\x04\x37\x6b\xe7\xd3\xf8\xc0\x0c\xc1\x3d\x2e\x6a\x8a\x35\x78\x78\xad\xd3\x45\xea\x1d\x27\xb0\xa0\x9c\x11\x4d\x06\x06\xe4\x0d\x98\x1a\xa7\x62\xde\x25\xef\x05\x66\xa4\xee\x3b\xa5\x1c\x0b\x18\x56\xfd\xc3\xe8\xc7\x78\x32\x99\x53\xc1\x55\x69\xbd\x32\x7b\x15\xa0\xac\xc6\x58\xd9\x66\xc5\x9e\x14\xcf\xec\x55\xd1\xf2\x67\xff\xca\x80\x39\x0f\xd0\xb9\xa1\x1d\xe5\x57\xdc\x05\x2d\x06\x5a\xf9\xf0\x0e\xf3\x39\x0b\x40\xbc\xd9\xe6\x9d\x1f\xfe\xaa\xbf\x9b\x31\xfe\x11\xe6\x6d\x04\x48\xbd\x30\x4e\x0f\xb5\xeb\xd1\x8e\x0d\x98\x67\xd8\x5a\xb0\x46\x19\xad\x1c\xf3\x71\xe2\x62\x17\x70\x01\x9a\x3b\xc8\x05\x38\x35\x08\x58\x6d\x1d\xfd\x23\xd0\xb9\x26\x44\x8b\x08\x45\xbb\x9f\x21\x6f\x96\xab\xea\x0e\xd6\x4e\xcf\x7c\x45\xf0\x81\xe1\x64\x9a\xd8\x90\xa0\x5d\x5e\xac\xec\x62\xb6\x2a\x5c\x9e\x1c\xb7\x31\x06\x41\xb8\x44\xb4\x4c\x13\x9f\xe9\x87\x86\x3f\x6e\x98\xa7\xa6\x1f\x22\x40\x14\x90\x6e\x1e\xcb\x4d\x1f\x2f\x3b\x5d\x21\x5e\x77\x64\xcf\x93\x87\xc5\x12\xa3\xae\x6b\x15\x06\x61\x22\x27\x53\x1b\x5c\xc6\x66\x86\x9b\x76\x3c\x4b\x95\xb3\xa8\xee\x01\xb9\x5c\x5f\xde\xd5\x52\x20\x32\x71\x8d\x78\xe8\xda\x8f\x7c\xf4\x3b\x52\xb5\xe1\x13\xec\x30\xa3\x16\x59\x02\x42\x2b\x68\xaa\x6c\x2b\x94\x9d\xfb\x52\xc9\x34\x51\x79\x85\xf1\xa7\x0a\x4f\x69\x9a\xf9\x23\x7f\x38\xc6\xf0\xcc\xee\x91\xd3\x05\x46\xd2\x8d\xfa\x50\x30\x2f\x54\x63\x29\xd7\xc6\x02\xd2\x86\x71\x59\xee\x65\x2c\x1c\x3b\x61\xf3\x8d\xed\x46\x00\x72\xe6\x81\x39\xe7\x09\x9e\x83\x82\xb2\x79\x05\x9e\xcb\x1c\x55\x6b\xbb\xcd\xdf\x74\x58\xf8\x16\x2e\xd6\xeb\xb2\xf8\xac\x72\x00\x35\x83\x19\xda\xa6\x90\xbb\xf7\x4c\xb7\x3b\xfc\x15\xbd\x32\x0c\x09\x90\x56\x72\xdb\x65\x6e\x5d\x19\xba\x10\x08\xfa\xe2\x4b\x3a\xa6\xb9\x31\xe5\x9d\x8d\x58\x2a\x32\xf7\xeb\x06\x3e\xfd\xd1\x09\x31\x24\x24\x05\xee\x62\x0d\xb5\x5a\xd8\x91\xaf\xf2\x0d\xad\x68\x5c\xe5\x9e\x39\x72\xac\x3b\xf8\xdb\x42\x7b\xbd\xc3\x62\xf3\xa0\xf9\xad\xd7\x7e\x80\xfb\x55\x32\xdd\x00\xa3\x2c\x88\xeb\x6f\x4b\xb5\x54\xa0\x2c\xa5\x95\x39\x4f\x96\x54\x89\x51\x8b\x19\x78\x40\x12\xcf\x43\xe5\x3e\x00\x2c\xc8\x02\x7d\xdf\xf6\x66\xc3\x19\xb4\xac\xce\xd7\x6f\x23\x0e\x7c\x26\x15\x25\x0a\x7a\xab\xc4\x93\xc7\x88\x5a\xf4\x31\x22\x98\xd6\x3b\xab\x8e\x6c\x06\xc3\xb8\x6c\x69\xbe\x2a\x53\x62\x53\x03\x8d\x8c\xe5\x3a\xce\x2d\xe5\xa8\xb9\xfd\xd2\x2a\x37\x6f\x82\x9d\xe0\x41\x0a\x04\xe8\x5b\x81\xc7\xf2\x7e\x20\x07\xe3\xf9\x70\x3a\x90\xd3\xe1\xec\xaf\xb2\x37\x63\x6d\x00\x02\x0c\x73\xe2\x6e\x32\x1d\xbe\x1b\x8e\x7b\x23\xf9\x61\x32\xfd\xab\x1c\x12\xdf\xfd\xc7\xc9\x4d\x17\xc3\x69\x0e\x32\x6d\xbe\x61\x35\x0a\x80\xb9\x25\xad\x8c\x39\x0f\x7c\x46\xda\x0c\x74\x0a\x14\x74\x1e\xcb\x9a\x4d\xca\x7b\xa6\x45\xeb\xa2\xf5\xec\x0d\x66\x09\x1a\x59\xf9\x76\x98\x79\x37\x41\x22\x00\x2e\x7d\xd7\x39\x24\xf3\xdb\x95\x37\x5c\xea\xb0\x4c\xcb\xe5\x6e\xa3\x2b\x92\x6e\xb7\x81\xfd\xbc\x20\x0d\xc4\x6a\xad\x8a\x72\x1f\x09\x0f\x8e\x5e\x19\x43\xeb\xd8\xc9\x9b\xe4\xea\x36\x4b\x6f\xcd\x5a\xea\x44\x56\xb7\x31\x0a\xa8\x43\x23\xd6\x49\xf5\x3c\x5c\x8c\x4a\x30\x8a\x81\x6e\x57\x3e\xc1\xd2\x3c\x49\x4b\xc8\x21\x02\xcb\x4c\x9c\xc1\x82\x81\xd3\x32\xce\xac\xe8\x19\x82\x30\xd2\x38\x13\x49\xbc\x01\x86\x3f\xb6\xec\xd7\xb1\x69\x84\xb9\x1f\x49\xcd\x0e\x68\x74\x4a\xa5\x77\x59\x63\x12\x24\xdd\x8f\x48\x84\xd1\x0c\x25\x3e\xb0\x54\x25\xbf\x7b\x05\x92\xe5\x1a\x1a\x71\x5b\x14\xc9\x5d\x9a\x65\x11\x86\x4b\x41\xac\x1e\xc8\x9a\x90\x46\xd9\x18\xb2\xa8\x44\x86\x12\xf9\x19\x97\x7a\x58\x3d\x4a\x76\x7a\xd1\xdc\x70\xec\x41\xae\xa7\xf8\x32\x94\x09\x04\x54\x99\x3f\xd7\x4e\x46\xb5\x55\xfe\x4f\x91\x52\xa2\xf0\xa0\x24\x28\x3e\x88\xe6\xa4\x46\x30\x8c\x7b\x66\x57\x88\xef\x3b\xb2\xb7\x34\x2b\xce\x9e\xd4\x9e\x1a\x6b\x57\x0e\x57\x91\xaf\x78\x86\x16\x85\x3b\x92\x62\xd8\x07\x70\x4e\x06\x86\x67\x44\xc1\x12\xf8\xb3\x85\x51\x69\xa2\x48\xcd\x54\x5c\x62\xe0\xa2\x2c\xd5\xe7\x02\x1b\x1a\xdb\x56\x88\xfa\x4c\xda\x51\x43\x85\x13\x82\xcb\xa0\x77\xca\x25\x0f\x72\xb8\x6a\x06\xcd\xc4\x63\x43\x86\x6d\x46\x8e\x67\x3d\x19\xaf\x45\x04\xbc\x8d\x6a\xb5\x32\xfb\xc5\x63\xb3\x0b\xb6\x5c\x55\x90\x5c\x11\xcd\x0a\x1e\x94\x34\x1c\xc5\x4a\xf8\x37\x6c\x51\x07\x36\x79\x07\x09\x2e\x82\x51\xb3\x06\x04\x06\xd2\x93\x1a\x32\xed\xa8\x88\xc8\x57\xc6\xcb\x2a\xfd\x9c\xc2\x09\x9b\xa5\x9a\xee\x0c\x76\x7c\xce\x7c\x0d\x23\xf7\x18\x30\x1e\xc0\x8c\x10\x0d\x3b\x23\x8c\xd5\x36\x2c\x25\xc8\x04\x02\x35\x70\x61\x77\xd2\xba\xc8\x0b\x73\xa6\x0b\xa0\x22\x6b\x9d\x32\xba\x8f\x60\x65\xe2\x39\xe8\x2e\x7c\xb3\x6a\x61\x81\xf8\x0a\x98\x02\x8c\xd8\xfd\x61\x77\x2a\xd5\xce\x9c\x36\x87\x0f\xea\xe4\xb9\xa7\xe2\xd1\x8a\x5c\x34\x40\xff\xc6\xfb\x40\xfb\x07\xdf\xd1\x2a\x4e\xc1\x14\x47\x34\x1e\xfc\x2b\x51\x71\x96\xe6\xb7\x47\x9d\xda\x8c\xa0\x03\xe7\x74\xa2\xfd\x4b\xd9\xbc\xc2\xb1\x6d\x42\xa4\x04\x2e\x4d\x2a\x27\x75\xf1\x87\x9a\xcd\x22\xc8\xe6\xa8\x5f\x0c\x30\xfe\x30\x61\x7c\xc8\x54\x05\x8e\x33\xdb\x19\x76\x60\xed\x6c\x0b\x32\xc4\xcf\x4e\x3b\x81\xca\x32\xe0\x11\xd1\xe2\xe8\xa1\xb6\x5f\x4b\xbf\x3c\xfd\xeb\x80\xc8\x51\xfc\xda\x9e\xc9\xf6\x9e\x89\xd8\xee\xca\xc4\xbc\x0c\x2c\x5a\x73\x34\xe2\x89\x24\xe3\x86\xf4\x56\x2c\x97\x65\xa1\xf5\x09\x5c\x8b\x78\x6d\xec\xcc\x4a\x81\x7f\x47\x22\xbe\x8d\xd3\x5c\x57\xa1\x61\xe7\xa2\x20\x40\x98\xae\x6e\x91\x3c\xba\xd5\x6f\x64\x83\x44\x8b\x98\x0c\x33\x1a\x1f\x5f\x54\xda\x89\xe4\xd6\x0f\x63\xbc\xee\xa8\xdd\xf6\x65\x1c\x18\xf1\xad\x1d\x5c\xf5\x9b\x05\x3d\xf3\xc0\xe9\xe4\x71\xa9\x32\xaa\xc8\xf8\x96\xeb\xb8\x4c\xa8\x54\xf6\xec\xac\x23\xff\xcd\x13\x5d\x8d\xe4\xcf\x20\x9f\x6a\x66\xea\x9d\xf1\x28\x41\x37\x6d\x14\xdf\x61\x4d\x33\xb5\x0c\x78\x62\xd3\x8a\x24\x9d\x81\x6c\x33\x0c\x1f\x90\xaf\xbc\x00\xb1\x09\x12\x0e\xb0\x5a\x0c\xac\xde\x1a\x87\x72\xaf\x77\xe4\xf0\x04\x46\x41\xa9\x74\x4a\x05\x94\x29\xa7\xd2\xed\x1f\xcd\xca\x85\xe8\x19\x48\xcd\x96\x29\xe8\x75\x2c\x76\x3a\x35\x36\x5f\xe4\xcc\x97\x9a\x54\x6f\x5c\x85\x2f\x86\xc0\x7f\x82\x88\x5a\x6d\xe9\xb2\x4f\x8a\xd5\x09\xdd\x81\xa4\xf6\x09\x31\x0b\xe1\xfb\xe0\x34\xe8\xa4\xef\x3b\xa6\xa9\xb8\x47\x9d\x17\x3e\x1e\xa8\xf3\x8a\x50\x9d\x37\xf5\xed\x76\x6c\x18\xd7\x93\x5b\x62\xae\xc6\x1d\xb4\xab\xcc\x20\xa1\x6e\xf8\xb2\xd8\xaa\x36\x8b\x26\x5e\x41\xc1\x65\x15\x2e\xc5\x03\x3a\xbc\x82\xd4\x21\x1c\x63\xd6\x56\xe5\x71\xc6\xa6\x77\x20\xa7\xc1\x51\xbb\xf8\x8e\x67\x38\xde\x6e\xcb\x62\x5b\x9a\xd3\x2c\x18\x68\x32\x94\xd9\xd5\x27\x56\x7e\x56\x5d\x5f\xb7\x2b\xaf\x3b\xb8\xea\xd9\x39\x04\x05\x8a\x32\x57\x7b\xfd\x4c\x5e\x2a\x90\xdc\xc6\x78\x0e\xad\x4b\x27\xd4\x7a\xf8\x6a\x34\xb7\xbb\x56\x0a\xd2\x0b\x6c\x3c\xb9\x75\x6c\xd6\x60\x55\x44\x9c\xab\xf8\x1c\xa7\x00\xb5\xc6\x32\x6b\x3b\x5a\x66\x76\xab\x0c\xad\x97\x52\x01\xe2\x96\xd6\x8e\xa6\xf1\xc2\x60\xb8\xd2\x0f\x39\x36\x9e\x69\x20\x62\xd7\x39\x50\xb0\xc0\x5b\x4f\x43\x2d\xeb\x72\x57\x96\x78\x1d\x2f\x8b\x3c\x57\x1e\x68\x1c\x99\x52\xeb\x27\x1d\x84\x17\x00\xd8\x9e\x39\xf2\x57\xff\xc0\xfe\xaa\x59\x10\xde\x2c\xbc\xe8\x84\xda\xf7\x56\xf6\xdc\x1d\x6b\xf5\x11\x07\xc5\xc6\x8c\x25\x6d\x03\x25\xf3\x08\x03\xa2\xf5\x23\x11\xca\xd2\x57\x45\xb9\x51\x49\xa0\x3a\x42\x82\xde\xb9\x5a\x2a\xad\xcd\x6e\x67\x22\xce\xb4\xf2\x75\xc0\x4d\x3b\x5f\x76\xa4\xd3\xdf\x31\x4d\x22\x69\x97\x3c\xb8\xb0\xba\xf4\x6b\xd2\xc5\x41\x9d\x64\xdf\x1c\x25\x47\x47\xa4\xb9\xdc\x6d\xb7\x20\x8a\x2f\xb3\xe2\xce\x18\xe1\xb1\xf9\x3b\x43\xa0\x3c\xf0\x25\x1a\x85\xe8\x2f\xc1\x4a\xb1\x5c\x10\x66\x29\x91\xed\x45\x71\x36\x9c\xe3\xcd\x16\xe5\xaa\xb1\x98\x1c\x0d\x56\x7f\x01\x47\x35\xe3\xee\xd2\x34\xc2\x3d\x3f\x55\x3a\x62\xe5\x1a\xc6\x4c\x82\x3c\x3c\xbe\x9c\x32\xd4\x90\x9e\x34\x0b\x52\x7b\xb9\x4a\xb9\xc0\x3c\x7d\xca\xe4\x14\xe6\xfe\x2c\x40\x1a\x1a\x04\x99\x98\xa6\x1d\xdf\x49\x5e\xb3\xdb\x53\x89\x1d\xe1\x48\x1e\xd1\x77\x38\x76\x7b\x9c\x76\xe0\x2c\xd9\x9a\xd1\x8a\x24\x3a\x70\x78\x90\xb3\x33\x07\x71\x27\x8e\x5c\xe1\x2f\xe9\x7a\xd9\xc4\x79\x4c\x37\x1d\x2f\x5f\xec\x8d\x73\x3d\x17\x7b\xeb\x5d\xd6\x9c\xcb\xa2\x94\xc7\x69\xda\x41\xac\x09\x20\x52\x40\x07\x69\x55\x81\x24\x28\x80\x47\x8e\x5f\x9d\xfe\x4b\x47\x30\x94\x95\x35\x50\x76\x15\xf0\xca\x83\x49\xba\x8e\x4b\xb3\x7d\xf1\x59\x69\x47\x2e\x54\xae\x56\x29\x30\xb6\x06\xcf\xf5\xda\x66\x96\xdd\xab\x0e\x46\x2b\x49\xdb\xa2\x49\x91\xd6\x80\x63\x98\xf9\x86\xfa\x05\x63\x07\xd8\x5e\x08\x26\x52\xb6\xd9\x65\x34\xd2\x5a\x1c\x7f\xd4\xb5\x00\xa5\x70\xb3\x9c\xec\xf5\x08\xa1\x3c\xad\x34\x08\x4d\x43\x90\xae\x52\xe5\x4a\x95\xca\x56\x68\xc1\x36\xd3\xdb\x22\x47\xae\x5a\xe4\x7f\x47\xfe\x59\xce\xd7\x99\x3e\xbd\xee\xc8\x2b\x9f\x4b\xa5\x58\xd5\xf6\xd0\xbc\xb6\xdb\x1b\x9c\x33\xaf\x8c\x09\x01\x2c\xfc\x62\x5a\x68\x85\x51\xb9\xfa\xa7\xce\xde\xc8\x71\x7a\xab\x32\x39\xff\x0f\x95\xdf\x06\x3c\x52\x61\x9a\x05\xa5\x51\x3d\x09\xd4\x3a\xb0\xa2\x11\x62\xab\x97\xa1\x1d\x74\x05\x04\xa6\x33\x11\x30\xe0\xa7\x8e\x7d\xaf\x92\x4a\x2e\xd4\x81\xc0\x62\x01\xf4\xcf\xf5\x00\xb4\xc7\x87\x6f\xd5\x80\xfc\x4a\x8e\x2f\xcd\x40\x04\x1e\x0e\x61\x5f\xeb\x5d\xf5\xa8\x1a\x1c\x68\x91\xf0\x55\x57\xfc\x6b\x0f\xc5\x65\x3c\x62\xb0\x35\x53\xc8\xd3\xa0\x71\x68\xc5\x7f\x30\x5f\x11\xa2\xb9\x1e\xc5\x40\x63\x36\xbb\xa7\x10\xe0\x0a\xa0\xea\x24\xd1\xd0\xde\x7a\xc3\x40\x83\x6e\x4d\xd4\x92\xa2\x4e\x61\x84\xee\xd4\x64\x36\x3a\xe2\xd0\xcc\xd1\xfd\x28\x15\xfc\xc2\x4d\x7f\x74\x04\x1e\xc7\xde\x6b\x17\xee\xc2\x42\x73\x56\x98\x4c\x16\xa6\x4a\x6e\x6d\xdd\x8f\x70\x9a\x08\x2f\xf9\x80\xa2\x39\xf0\x45\x0c\x8c\x3b\x81\x32\xae\x90\x49\x4b\x5d\x19\xb3\x81\x48\xb6\xb1\x02\x90\xa3\xbd\x82\xbe\x76\x54\xc3\xa4\xfd\x85\x44\x82\xa0\x19\x1c\x07\x84\xb6\x19\xbb\xe4\x27\x79\xc4\x65\x95\x16\x7e\x2a\x3c\x1d\x02\x4b\x10\xc3\xaa\x2f\xc6\x12\xbe\xcd\xf6\x52\xa7\x9b\x34\x8b\x4b\x9e\x41\x27\x3b\xe4\xaf\xb6\x1f\x61\xac\xf0\xac\xf3\x67\x12\x5d\x25\x37\x77\xb5\xb5\x02\x41\xf1\xad\xb2\xe5\xa0\xd6\xcf\xd8\xe5\x99\xd2\xfa\xc0\x7c\xdb\xba\x2f\xb0\x15\x3f\xe3\xa1\xe6\x4b\x55\x0f\xcd\xad\x82\xa1\x84\xe3\xc9\x6c\xd8\xb1\xae\x23\x5e\x96\x24\xd0\x51\x85\xa4\x92\x0a\x7d\xff\xa5\x2a\x2b\x77\x58\x6d\xcb\xc2\x18\x0b\xff\xcc\x95\x00\xdd\xe7\xe3\xb7\xd7\x7f\x30\x00\xf8\x01\xfd\xcf\xf3\x17\x6f\xce\xeb\xf8\xdf\xd7\xaf\x9f\xf0\xff\xdf\xe4\x67\xbe\x56\x72\xac\x2a\xf9\xb6\x28\x32\x15\xe7\x35\x0a\x68\x2b\x92\x70\x16\xc9\xf3\x73\xd9\xdb\xdd\x9a\x43\xec\xec\xfb\xef\xbf\x93\x01\x15\xe4\x77\x91\x79\x88\xe0\x87\x0c\x1d\xf0\x3e\x79\x80\x07\x52\xb6\xd2\x40\x8e\x8b\x4a\xfd\x20\xe6\x3e\xd9\x59\xda\x00\xba\xb4\x09\x97\x9a\x0b\xd6\x4f\x97\xdb\x53\xf3\x5a\x95\x99\xbc\x46\x9c\xfd\x06\xe3\x12\xa4\x1e\x20\x87\x2e\xbc\x5b\xaa\x1a\xb2\x81\x0e\x7c\x32\xf2\xec\xfb\xac\x53\x73\x24\xc4\xf5\x74\xd0\xbb\x7a\x3b\x1a\x3c\x29\xa5\x3e\x29\xa5\xfe\x97\x55\x4a\x7d\x92\x45\x7d\x92\x45\x7d\x92\x45\x7d\x92\x45\x7d\x92\x45\x7d\x92\x45\x7d\x92\x45\x7d\x92\x45\x7d\x92\x45\xfd\x27\x93\x45\x75\xef\xb9\x77\xb5\xf3\x3b\x53\xd8\x3d\x18\xe0\x85\x98\x76\x63\x83\x06\x8b\xdd\x73\x13\xbe\x46\x7a\x55\xb4\x49\xaf\xf2\x83\x7e\x95\xfa\x6a\xcb\x74\x3d\xa9\xaf\x3e\xa9\xaf\x1e\x52\x5f\xfd\xaf\x2e\x51\xba\xf9\x03\x35\x4a\x5b\x74\x30\xed\x58\x7c\xa5\x9e\xa5\x78\x50\xcf\x52\x3e\x52\xcf\x52\x3c\x46\xcf\x52\x3e\x56\xcf\x52\x3c\xa8\x67\x29\x1f\xad\x67\x29\x1e\xa1\x67\x89\x81\x8d\xc7\xe9\x59\xfe\x27\x55\x61\xfc\xfe\x49\x84\xf1\x9f\xea\xa7\xfb\xfc\x72\x34\xff\xeb\x89\x45\x29\xfe\x11\x59\x80\x07\xf8\x7f\xce\x5f\xbf\xa9\xf3\x7f\xbc\x7c\xf1\xe6\xe5\x53\xfc\xff\x5b\xfc\x98\xdd\x60\x56\x80\xbd\xf5\x10\x01\x4b\x95\x85\xee\xc6\x2e\x55\xb3\x8e\x23\x40\x49\x29\xf9\x6e\x7c\x23\x47\xf4\x94\x77\x70\x25\x65\xf5\x74\xc2\xf1\xe8\xdd\xf5\xa8\xe3\xac\x27\x97\x10\x76\x30\xd9\x1f\x84\xb8\xaa\xbb\xb4\x15\xb7\xd2\x78\x5e\xe9\xed\xae\xe4\x1b\x3b\xa2\xdf\xc8\xb5\x8a\x4d\xa3\x9c\xf7\x6e\xcc\x38\xbc\xc1\x31\xb4\xbb\xd1\x2a\xfb\xac\x28\xc4\x8a\x96\x52\xec\x9d\x78\x59\x5c\x41\x60\xc8\x79\x78\x54\x7a\x01\x31\x6b\xf2\x34\x9b\xec\xfa\x44\x88\x46\x29\x6f\xf3\xed\x52\xfd\xfb\x4e\x69\x0a\xd2\x61\xc5\x66\xd0\x9b\x85\x57\x9d\xe3\x50\x00\xd0\x39\x22\x3b\x93\x27\x52\x2b\x42\x9f\x87\x8c\x6d\x55\x21\x8f\x56\x59\xf5\xe9\x64\xb1\xbb\xd5\xff\xd3\xfc\x57\xb7\x28\x6f\x8f\xba\x42\x7c\x48\x93\x5b\x45\x75\x4c\x5c\x4f\xb4\xcc\x62\xad\xf9\xc4\x87\x17\xdc\xd1\xa7\xda\x3a\xd9\xec\xd8\xac\x32\x26\x0a\xab\xca\x83\xb1\xe6\xf0\x8b\x78\x7f\xf3\x03\xfd\x5e\xf0\x42\x4a\x0a\xa5\x1f\x7c\x0d\x01\xb9\xe9\x93\x14\x41\x45\x24\x20\x0c\xa9\xaf\x9a\xe1\xd3\x54\xf1\x9d\x19\x20\x2a\x4b\x6a\x4f\x64\x63\x04\x80\xc4\x49\xfc\x76\xa5\x04\xcc\x31\xbd\x22\x47\x27\xe8\x95\x7d\x88\x96\x8c\xe8\x8d\x21\xf5\x71\x62\x8d\x1f\x8f\x52\xd4\x3c\xb8\x2b\xc4\x10\x05\x31\xf8\x99\xed\xad\x02\x74\x78\x13\x6e\x41\x4f\x21\x95\x0a\x30\x00\xc1\xbe\x80\x41\x85\x86\xb3\xd8\xca\x43\xfb\xcf\xec\x2d\x20\x57\x56\xe4\xf9\x9c\x45\xf2\x1c\x37\xc3\x4b\xa2\xe7\xa2\x89\x87\xba\xba\x80\xaf\xc0\xaf\xeb\xa7\xd1\xf2\x8a\xcc\xec\x31\x60\x97\x17\x59\x7d\x2d\xf3\x8e\x85\xee\x09\x50\x6c\xd9\x17\x51\x6d\xe2\xbe\xf9\x7c\x8e\xd5\x1c\xa4\xc0\x8a\xb5\x0b\xac\x2f\xf6\x16\x7b\xf8\xda\xef\x75\x57\x08\xeb\xb2\xd8\xb6\xc2\xb0\x61\x84\xd2\x7f\x7d\x5a\x32\x1a\x16\x26\x0f\xcc\x01\xff\x18\x8a\x37\xdb\xcc\x57\x24\x22\x86\x43\xbf\xd8\xba\x45\x6b\xa8\x4e\xa8\xe0\x81\x60\x7f\x10\xe2\x7f\x53\xa3\x9e\xe3\x4a\xf8\x3f\x32\xe5\xfa\x86\x34\x27\xcb\x15\xa7\x9e\x09\x91\x1a\x47\x82\x2f\xf9\xc3\xfb\xbe\xf3\x7b\xe0\x12\xba\xcf\xaf\x86\xf3\x3f\x92\xfc\xef\x11\xf7\xff\xd9\x79\x83\xff\xfd\xfc\xd5\x93\xfe\xdb\x37\xf9\xb9\x1a\xce\x0f\xc8\xbd\xfd\x65\xaf\xe2\xf2\x27\xf9\x17\x97\xbd\x58\x83\xe3\xa1\x7f\x12\x22\x84\xd7\x11\x19\x13\xa1\xec\x90\x62\x13\xb0\xde\x10\x6c\x88\x98\xf6\x0b\x2b\xd4\xa9\x46\x89\x2a\x2a\x8a\xed\xbe\xa1\xa5\x76\xbf\x62\x34\xde\xe9\x08\x52\xf3\xb4\xa3\x81\xf9\x43\xc5\x99\xb0\x65\xdd\x35\xe7\x26\xc8\xe0\xb8\xaa\x8e\x26\xae\xda\xab\x21\x11\x98\xd4\x8e\x08\x49\xc7\xdc\x54\x1b\x05\xdd\x22\x66\xe6\x00\x4d\xe8\xd5\xf1\x46\xcc\x92\xad\x55\x96\x89\x30\x15\x35\xb3\x12\x55\x54\x62\x4c\x4c\x28\x54\xc4\xcf\xde\x7d\xd8\x93\xd4\xe3\xf8\x31\x2d\x4b\x0a\xa9\x8b\xe8\x91\x2a\x6f\xf3\x87\x34\xd9\x98\x5b\x1f\x67\x95\xfe\xe4\x55\x28\x41\x6c\x4f\x7d\xa9\x84\x05\xa6\x75\x1c\xe0\xda\x3f\x1d\xa9\x36\x3e\xc5\xca\x0b\xbd\x5b\xe8\x2a\xa6\xb2\xd5\xa2\xf4\x0b\x4e\x2c\x58\xaf\x8b\x32\x31\xad\x7c\xcd\xe4\x53\x46\x8d\x8a\x60\x96\x6a\xf9\xeb\x70\x7c\x11\x79\x2e\xa6\x20\x5f\xd1\xe3\x66\x6e\xe1\x1f\x06\xaf\xf2\x01\x15\x20\x72\x25\xc5\x61\x3a\xe6\xf1\x85\x1c\x4f\xc6\xac\xa5\x73\x35\x18\xcf\x0f\x49\xec\xf6\x6e\xe6\xef\x27\xd3\x99\x00\xba\x64\x52\xd9\x91\xef\x27\xa3\x8b\x41\x9d\x87\x19\xf5\x67\x46\xbd\xe1\x55\xe4\x54\x69\x88\x51\xd8\xd7\x94\xf5\xa8\x8a\x7b\x63\xd9\xeb\xb3\xf6\x8e\xe3\x2d\x06\xc9\xd9\x76\x51\x97\xcb\xe9\xe4\x2a\x22\x1e\x62\xa0\xb6\x06\xbe\xe3\xf1\x00\x9f\x02\xd5\xc9\xc1\x8c\x4c\xa6\x8e\xad\x98\xdb\x72\x31\xe8\x8d\x86\xe3\x77\x33\xf3\x65\xff\xc3\xff\xcc\x68\xb9\x7f\xbe\x9f\xee\xf3\xbf\xdd\x55\xce\xfd\xff\x43\x80\x80\x0f\xdd\xff\xe7\x6f\xea\xfa\xaf\x2f\x5f\xbf\x39\x7f\xba\xff\xbf\xc5\xcf\xdf\xee\xaa\x26\xd8\xaf\x7b\x1a\x09\xf1\x6f\x71\xbe\x33\x7e\x9c\xf1\x22\x4e\x4f\x5f\xe0\x15\x62\x3e\xfe\x3b\x45\x0a\x06\xb3\xd9\x60\x2a\xdf\x0d\xc6\x83\x69\x6f\x24\xaf\x6f\xde\x8e\x86\x7d\x96\xfc\x7a\x6c\xa0\x40\x4a\x79\xd6\x95\x0f\x3a\xbf\xa6\xd5\x5f\xe7\xfb\x4a\x29\xcf\xbb\xf2\xeb\x3d\x60\x7f\x7c\xfe\x13\x39\xc0\xae\x59\xbf\xaf\xff\xfb\xb7\xbb\x0a\x6a\xb8\x7e\x8b\xf7\xfb\xb7\xbb\xaa\xdd\xf9\x35\x8d\xfe\x9d\x7c\x5f\x29\x25\x01\x50\x1e\xe5\x01\xe3\x70\x7d\x85\x03\xec\x4d\xfb\xc3\xfe\xaf\xff\xf4\x3f\xd1\xfd\x85\xb9\xfb\xe3\xbd\x5f\xf9\xab\x9c\x5f\x33\x46\x75\xdf\xf7\xdf\xef\xaa\xae\x5e\x75\x73\x55\x75\xba\x47\x4f\x46\xc6\xef\xf3\xd3\x7d\x3e\xdb\xaa\x7c\xa9\xca\x93\xef\x5f\xfe\x49\xfa\xef\x67\xaf\x5f\x9d\xd6\xf9\xff\x5f\x3e\xe9\xbf\x7d\x9b\x9f\x00\xc6\x7f\x1e\x99\xff\x7d\x01\xff\xfb\x52\xbe\x57\x79\xb9\x97\xb4\x3c\x1e\x29\xf6\x8e\xd7\x98\xe7\x92\xfa\x44\x90\xb4\xb7\x7b\x1b\x55\xa6\xe6\x60\x99\xab\x4c\x6d\xd7\x45\x8e\xa4\xfa\xe6\x5f\x98\x85\xed\x13\x52\xa5\x28\xf9\x2b\x53\x75\xcb\x3c\x8c\x15\x16\xcd\xc3\x05\x82\xa4\x5f\xae\xa2\xa0\x5b\x8f\x4c\x78\x85\x7f\xc4\x0a\x44\x30\xf5\x30\xe0\xc0\x30\x0c\xaa\x51\x45\x56\xaa\xbd\xb0\x04\x3b\x7a\xaf\x2b\x4e\xac\x9b\x47\x65\x58\x0f\x5f\x17\x86\x57\x32\xad\x0e\xfb\xe3\xc2\x8b\x40\x90\xee\xba\x4b\x1d\xf0\xc8\xd5\x4b\x2a\xa9\x54\x00\xe9\x89\x88\x0b\xce\x16\xf3\xfb\x0a\xed\x22\x2f\xe4\x26\xae\x4c\xc3\x00\xdf\x78\xb7\xda\x65\x11\x33\x47\x22\x84\x36\x2e\x53\xd2\xe5\x92\x2b\x60\x34\x48\x73\x44\xd3\x92\xe6\x39\xe2\x55\x1b\x8f\x0e\x54\xdd\x36\xa9\x2e\xd5\xd6\xcc\x3f\x86\x7a\x88\x95\x6b\xb1\x97\xea\x8b\xb9\xf5\xd3\x4a\x58\x7e\x8c\xc5\x5e\x16\x56\xad\x6d\x96\xe6\x4b\x25\x57\xea\x8e\x74\x9c\x01\xb8\x50\xaa\x38\x21\xab\x46\x47\x72\x69\x86\xb2\xa2\x9b\x0b\x85\xd5\x44\x9b\x60\x1d\xa2\x49\x41\xe3\xdc\x59\x12\xda\x99\x0a\x59\x9c\xe6\xd9\x1e\xc1\xd2\x00\xcf\xd0\xbb\xe5\x9a\x92\x42\x07\xbb\x22\x00\x47\xcf\x81\x0e\x0b\xdd\xb5\xca\xf0\x5f\xd1\x01\xe1\x75\xa0\x55\x71\x0f\x0d\x92\x97\x54\xfb\x4a\xa1\x16\x2f\x9d\x5f\xaa\x0d\xd4\xb5\x99\x55\x89\xbd\xfc\xe3\x7c\xea\xee\xf3\xe1\xac\xff\xe7\xc6\x7f\x8d\xb7\xd7\x8c\xff\xbe\x78\x3a\xff\xbf\xc5\xcf\x70\xd6\x3f\x10\xff\x35\xd3\x61\xc5\x5e\x90\x77\x44\x55\x72\x06\x47\x21\x10\x95\xe8\xa2\xac\x00\x50\x3c\xcc\x97\x5d\x79\x7c\x34\x9c\xf5\x8f\x3a\x42\x34\x44\x43\x5f\x9d\x18\xff\x31\x7c\x0a\x9f\x2d\xee\x31\xc1\xd1\xdd\x1e\x77\x35\x3b\xf8\x79\xa8\x36\xdf\x7a\x8e\x33\x43\x5f\x43\x4d\x94\xaa\x1f\xea\xf1\xea\xa6\x92\x68\x2d\x52\x2a\x1e\x8e\x94\xba\xed\xee\xe2\x9f\x8f\x88\x6b\x42\x0c\xd1\xcc\x01\x53\x00\xce\x64\x6f\x34\xf2\x23\x93\x10\x8c\x9b\x0e\xde\xf5\xa6\x17\x02\xe2\x96\x81\xb2\x9d\x0d\x71\x9a\x6f\xdd\x8f\x92\x69\x51\x9a\xeb\x8a\x66\xb4\xd2\x34\xa6\x19\x90\xb4\xd2\x6f\x4d\x85\xb8\xba\x02\x9c\xf0\xa2\x96\xa0\x29\x47\xff\xfc\xf0\xbe\x37\x9f\x4d\x40\x8d\x6d\x3a\x98\xdd\x8c\xe6\x1c\x88\xbc\x5f\x17\xfb\x11\x81\xce\x16\xed\x35\x08\x7e\x0e\x27\x37\x33\xfa\x82\x0d\x7d\xb2\x88\xf5\xe1\xa0\x27\x05\x39\xaf\x07\xd3\xcb\xc9\xf4\xaa\x07\x4f\xad\x29\x5d\xff\x13\x85\x38\xbb\xcf\x67\xef\x86\x27\x6f\x4f\xce\xff\xc0\x02\xe0\x87\xe2\x7f\x6f\x5e\x34\xce\xff\x37\x2f\x9e\xf0\x3f\xdf\xe4\x67\xf6\x6e\x28\x2f\xa7\x03\xef\x94\xe2\x10\xdc\x5b\x21\x8e\x39\x22\x78\xde\x3d\x8d\xe4\x4c\x6d\xab\xae\x3c\xfb\x0e\xe2\x81\xdf\x75\xfc\xeb\xa2\xdf\x91\xff\x3b\x01\xb2\x45\xa8\x85\x04\xfe\x02\x48\x84\x81\xbd\xf3\x7f\xe4\x2c\xcd\xd2\x65\x91\x8b\x77\xc6\xbe\x4f\x97\x9a\xee\x8c\xb6\xda\xdf\xa7\xe4\xe2\x3f\x55\x72\x31\x4c\x20\x1e\x5e\x23\xc8\x7c\x05\xde\x84\x38\x70\xc5\x02\x35\x12\x14\xca\x02\x49\x5f\x55\x48\x0a\x0c\x15\x5a\x77\xf5\x6d\xda\x5d\x16\x9b\xe7\x14\x34\xd2\xcf\x2f\x4b\xa5\xde\x3e\x17\xbf\x2d\x45\x29\xff\x9b\xa4\x28\x67\xc3\xd1\xb0\x3f\x19\xcb\x77\xd3\xde\xf5\xfb\x61\x1f\x41\xb9\xdd\x5f\x95\x98\x94\x6d\xf7\xb5\xf8\x35\x89\xc9\xf6\x3b\x5a\xfc\x86\xc4\xa4\x70\x0c\xd7\xa0\x58\x0a\x08\x73\xe6\x32\x21\x61\x75\xe9\x73\xba\xd0\xb9\x25\x6b\xe7\x16\x32\x70\xfa\xe0\x6b\xb3\xa8\xa8\xf6\x80\x8a\x98\x5d\x51\x1f\x86\x99\x41\xb3\x03\xcb\x5b\x33\x54\xa3\xb0\x9f\x12\xc4\xf4\xa9\x6d\x5b\x1a\x07\x4c\x88\xc8\xc6\x98\x01\x95\xb2\xa1\x47\xdf\x7e\xc2\x3e\x6c\xa7\x74\x9f\x8f\xae\x81\xff\xe3\xc5\xf2\x4f\xba\xff\x5f\xbe\x3c\x7d\x59\xe7\xff\x78\x61\x7e\xf5\x74\xff\x7f\x83\x1f\x73\x74\x8f\xe2\xb9\xfa\xbb\xbc\xa6\x70\x7b\x08\xd9\x15\xe2\x7f\x9c\xdc\xff\x7f\x42\x98\x15\xe4\x25\x0f\x5f\x2c\xc1\x40\x38\x39\x7d\x75\x72\xfa\x32\xe4\x09\xf9\xde\xfc\xe5\xdc\xf8\x83\xdf\xe1\x5b\x5f\xf0\x6b\x85\x18\x7c\x56\x25\x84\xe8\x52\x8d\x15\xa5\x18\xb7\xf3\x9c\xbd\xd6\xba\x6e\x8f\x22\x84\xef\xf2\x48\x2c\x6a\x9c\x5d\xc8\xe2\xcc\x41\x36\x7a\x7a\xd7\xe7\xee\xf8\x1f\xf4\x83\x97\xd9\x7d\x23\x22\x8f\x4d\x7f\x3b\xcc\x3b\xc5\xdc\xa1\xdc\x08\x8f\xcd\x03\xea\x2e\xf1\x51\x9f\x8c\xdf\x9b\x59\xdd\x80\x45\xac\xf9\x2f\x44\x94\xd0\x50\xfa\xf0\x04\x55\x6d\xc0\xd2\x6a\xeb\x53\xbc\x92\x33\x26\x58\x6b\x0a\x09\xa7\x22\x4b\x6a\xfc\x0c\x71\x9e\x08\xf7\x81\xbb\x54\xaf\xc3\x61\xb5\xa4\xdf\x01\xfd\xaa\xe3\xbb\xcf\xf6\x40\xd8\x0a\xb5\x6b\xe9\x0a\x05\x4b\xef\x88\x4f\x7e\xae\xfe\x7e\x02\x04\x98\x2a\x91\xc7\x5c\x22\x1c\x87\x3d\xeb\x60\x19\x0e\x0e\x3f\x9f\x60\x69\x8e\x1a\x2a\x71\xc0\xee\x05\xe9\x26\x2a\x99\xe1\xd0\x65\xf0\xbe\x5d\xce\x6f\xab\x0a\xf3\x72\x82\x5f\x73\x56\xec\x17\xbe\x7b\xcc\xb5\xf7\x7e\xf2\xc1\xdc\xa2\x17\xc3\x19\x2a\x9e\x0f\x80\x7d\x7f\x26\x6f\xc6\x17\xc6\x3f\x34\xfe\x1c\x99\xba\xcf\x22\xa8\xaa\xba\x8b\xc4\x2d\x50\x7c\xf8\xe5\x83\x11\x27\xc5\x88\x14\xb6\x54\xc8\x12\x9c\x50\xbe\x14\xa6\x82\xd0\xdf\x77\xeb\x42\x5a\xf1\xed\x44\x01\x15\x75\x8d\xcb\x42\xa5\x25\x91\x5f\x79\x62\x08\x4e\xf0\x26\x98\x09\x6c\xcc\x41\xa2\x18\x18\x13\x9a\x2d\x9f\xc9\x04\xe2\x9c\x4c\x11\x22\x3c\x49\x91\x03\x4f\xaa\xe7\x64\x1d\xc5\xc9\x81\x37\x74\x85\xf8\x40\xf7\x64\xb8\x87\x61\x18\x53\xf5\x59\xb9\x40\x8a\xf7\x4e\x18\x62\x64\x69\x30\x53\x0d\xe6\x64\xa9\x54\x52\x6c\x04\xb3\xbc\xd4\xc8\x63\x5a\x5b\xe6\xd6\x03\x73\x53\x02\x6e\x1f\x42\x3d\x4c\x00\x22\x2a\xb5\x5c\xe7\xe9\x32\xce\x2c\xc2\x3f\xb6\x14\xe6\xb8\x05\x90\xde\x86\x69\x73\xd8\x3e\x25\xd1\x1c\xe0\x57\x88\x80\xcb\xe7\xb6\x04\xe2\x48\x9c\x7a\x47\x85\xef\x0f\x91\xcd\x80\x53\x6e\x59\x2b\xc5\xea\x71\xf1\x72\x0d\xe3\x01\x8d\xbe\x2d\xe2\x0c\xdf\x2b\x36\x4a\xf1\x82\x08\x28\xd6\x29\x11\x0e\x61\x65\x3f\x6c\x2c\x7f\x59\xae\x6e\x6f\x77\x69\xa2\xba\x95\xfa\xf2\x0c\x06\xea\x97\x4d\x91\xb8\x5f\xb1\x6b\xe2\x9d\x2c\x41\xc9\x24\x56\x88\xde\xde\x2a\x6d\x79\x73\x06\x97\xc3\xf1\xd0\xd8\x55\x33\x77\xfc\xc1\x09\x38\xcc\xdb\xcf\xd5\x9a\x0b\xe0\x38\x93\x8c\x09\xf4\x83\x10\xbf\x7c\x28\xca\x4f\xcf\x80\x70\x18\x26\x08\xe3\xe9\xfe\xda\x6c\x2a\x80\x74\xe5\x2f\x17\x54\x99\x16\x7e\x1b\x69\x1e\x9c\x36\x74\x4d\x5e\xa0\x8d\x0e\x8a\x34\x61\x7e\xf1\xcb\x47\xf0\x81\x40\xe4\x96\x00\x7d\xb9\x79\x2a\xd5\x6e\x6a\xe6\xdf\xa7\x97\xb7\xbe\x4d\x98\xb7\x9d\x9c\xc0\x00\xd2\x51\xc0\x14\xbf\x50\x59\x47\xb7\x4b\x8c\x1c\x13\x64\x56\xa2\x50\x8f\x4b\x23\xc0\xdf\x9c\xd7\x29\x2c\xae\xc5\x09\x01\xe8\xf4\x36\x87\x56\xe7\x15\x7b\x21\x8e\x7d\x97\xea\x5a\x28\xdb\x62\xef\xc1\x82\xea\x9d\xc3\x0a\x13\xf2\x0c\xad\xda\x2a\x15\x67\xc6\x39\xd6\xe6\x7a\x65\x86\x38\x52\xfb\x67\x72\x5e\x10\xd5\x48\xfc\xdb\x07\xcb\xcc\xa8\xb7\xf2\x9e\xc9\x2b\xd4\x63\x0c\x9d\x54\x94\xd1\xb1\x1a\x55\x30\x87\xe6\xf2\x27\x3f\xbe\x2a\x04\xb5\x37\x42\xf2\xee\x22\x53\x44\xe4\x6d\x6e\xa6\xae\xf4\x5f\xe1\x98\x6b\x8f\xe1\xa6\xc1\x5b\x1e\x9c\x6e\xb8\x29\x3a\x82\x24\x21\x81\xd8\x36\x53\xcb\xaa\x2c\x72\xe0\xc3\xda\x6c\x8b\xdc\x4f\x2c\x62\xab\x40\x73\x10\x52\x70\x0b\xac\x02\x26\x81\x5a\x05\x38\x8d\xaa\x58\x16\x99\x16\x7c\xdb\x5d\xce\xaf\x4d\xc3\xde\xcf\xf1\xff\x2f\xf6\x8c\xb9\x41\xce\x11\x0a\x97\xf3\xa7\x67\xbb\xfc\x99\x96\x63\xd4\xd9\x92\x97\xe6\x23\x18\x51\x17\xc7\xe3\xcb\x59\xc7\xcc\x49\xbf\xd8\x6c\xd3\xcc\xed\x07\x1f\x2b\x63\xdb\x08\x33\x63\xb9\x9f\x88\xa7\xd0\xce\x34\x70\xdc\x08\xac\x7a\xc7\x7b\x17\x09\x72\x33\x63\x4b\xc0\x78\x03\xcd\x47\x2d\xbf\x49\x86\x00\x3d\x0c\x24\x34\xe3\x3d\x8f\xad\x00\x42\x48\xb8\x1a\xe3\x2c\x23\xc7\x23\x5e\x9a\xd3\xd0\xcc\xaa\x0d\xa1\x13\x8f\x16\xc9\xf4\xb2\xae\x6f\x40\x34\x4f\x1a\xbe\x96\xf0\x69\x75\x60\x22\x9c\xee\x8b\x27\x2e\x81\xdc\x70\x44\x81\xe4\x2d\x7b\x16\x62\xfc\x9a\x06\x06\x02\x3b\xf5\x87\xf9\x07\x4a\x7f\x57\x02\x23\xdc\x15\x5d\x17\xaa\x34\xf3\xc2\x21\xa7\xd2\x46\x56\xf2\x02\xa5\x0b\x6c\xd6\x91\xe9\x48\xdc\xc3\x86\xf0\x64\x4e\x95\x13\x03\x30\xa5\x4e\xf9\xfb\x14\x27\xca\x69\xee\xcc\x97\x7f\xa9\x97\xff\x3e\x13\x87\x8e\x46\xd3\xe0\xb7\xe6\x16\x18\x5a\x7d\x3f\x6c\xae\x83\x18\xd1\x14\x7b\xa4\x9f\xe5\x06\x4a\xd1\x73\xa5\x58\x16\xae\xdc\xe5\xe6\x18\x13\x45\xe9\x84\x02\x31\xae\x86\x98\x1d\xcc\x4d\xd3\xc6\x0c\x86\xab\x27\xeb\xaf\x47\x0e\x01\xb5\x55\x79\x22\x81\x3a\x82\xd4\xe0\xbc\x79\x5f\x00\x7b\xb6\xb9\x0d\xcd\x85\xc2\xa8\x39\x2c\xee\x16\xae\xb8\x5b\x35\x9f\x1d\x66\x6f\x80\x32\xa5\xf9\x02\x66\x99\x10\x56\x25\x4d\x13\xdb\x01\xd0\x00\x21\xc5\x19\x8c\x05\xb9\xf3\x95\x2a\x61\xd1\xa9\x0c\x34\x8e\x80\x8f\x94\xe7\xc9\x58\xc4\x4c\xda\x6a\x76\x19\x8a\xeb\xed\xd9\x88\xa8\x89\x30\x59\xc5\x6a\x24\xa8\xf1\x26\xab\xde\x15\x61\x3c\x1f\xf9\x0b\xdc\xde\x27\x97\xb0\x6d\x9e\xd1\xa1\x07\xb6\x54\x8c\x89\x7f\xaa\x6a\x04\x1e\x00\x14\x50\xc0\x25\x82\xdf\xc3\xed\xf6\x4c\xc4\x76\xc2\x53\x73\x67\xf9\xcc\x1a\xbf\x18\xeb\x80\xaf\x81\x67\x5d\x21\xfa\x93\xf1\x05\x5a\x02\x72\x32\x76\x16\xf3\x70\x32\x06\x4b\xfa\x6a\x72\x31\xbc\x1c\xf6\xa1\x1e\x3b\x30\x15\x1e\xfa\x01\x90\x43\xcf\x09\xc3\x78\x8a\x99\x21\xb5\x06\xde\x58\x75\x8f\xcd\x9d\xc8\x25\xd0\xde\x4a\x60\xcb\xf7\x48\x01\x32\x26\xd9\x25\x7c\x83\x62\x3d\x03\xa0\x77\x05\x3d\x03\xa0\xf9\x77\xce\x0c\x4c\x84\x88\x91\x06\x82\x96\xb8\x7b\x8f\x03\x61\x30\x7d\xb6\x31\xb4\xf2\x42\x86\x9a\x06\x25\x8a\x85\x9a\x15\xba\x44\x95\x0b\x81\xf2\x23\xc0\xb8\x03\x97\x36\x16\x98\x32\x82\x83\x36\xc6\x79\x2b\x4b\x0e\x9e\xc3\x99\xaa\x40\x25\xda\xda\xbc\x3e\x1e\x91\xe5\x0f\x8d\x91\xc9\x44\x68\x22\xad\xdf\x82\xc5\x0a\x57\x98\xbf\x5b\xb8\x5b\x1e\x53\x42\xcb\x28\x0b\x27\xaa\x63\x3a\xcb\xcc\x8b\x5e\x23\xc9\x0c\x09\x0c\x00\x26\x91\xd0\x7a\xb7\x51\xbe\x5c\x46\xa8\x9d\xb0\xcc\xe2\x1d\x38\x37\x2f\x0e\x74\x3f\xb8\xf0\x6a\x37\x9b\xa3\xb6\x00\x0b\xc1\x1b\x2b\xf1\xc0\x58\x35\xcd\xce\x3e\x34\x44\x9e\x63\xa8\x3a\xf2\x94\x84\xd1\xd6\x0c\xdb\x91\x86\x8f\x20\x87\x55\x7a\x0e\x2b\x92\x39\x58\x4d\x25\xbc\x2c\xe1\xf6\x11\x48\xd8\xe0\x3f\x0e\x8f\xf4\x94\xef\x5a\x63\x4a\xc2\x7d\x1c\x9b\x73\xc8\x17\x42\x85\x6e\xd3\x73\xcc\x2c\x13\x78\xc7\x0d\x44\x7d\xc0\xec\xd5\x5e\xb7\x83\x5f\x5a\xc7\x84\x29\x30\x9a\xf7\x58\x78\xdf\x12\xdd\x4b\xd4\x9a\xd7\x10\x1e\xe5\x38\x9f\x69\x3b\xed\x24\xf8\xc3\xd5\xe1\x71\xd8\x65\xba\x2e\xca\x2c\x82\x75\xf4\x40\x12\x25\xe8\xad\xae\xad\x08\x18\xe9\xf0\xbd\xfe\xbf\x1a\x73\x08\x2b\x72\x13\xe7\x39\x82\x96\xbc\x41\x11\xde\xa0\xf8\x4e\xbc\xb2\xda\x13\xdb\x04\x5e\x1b\xba\xc9\x76\xb4\x5f\x05\xa3\x0d\xb4\xf9\x8f\x1f\x71\x9f\x09\x4f\xd4\x57\xf3\xfd\x03\x4d\x58\xda\x22\xf7\x3e\xcf\xca\x10\xc6\xd5\x84\x1e\xfb\x5f\x68\x3e\x2e\x5c\x4f\xc1\xf3\x82\xa1\x05\xb6\x9c\xdf\xd0\x49\x7f\xd7\x87\x4b\xc0\x27\x5d\x69\x4d\x32\xe1\xa1\xab\xf0\x48\x35\xb7\xf5\xde\xdd\xed\xbe\xb5\x26\x89\x3a\x9c\x62\x03\xb5\xdb\x1f\x81\xcd\xba\xc9\x61\x4a\x19\x26\x50\x01\x45\x33\x40\x7d\x51\x9b\xad\xe5\x00\xc6\x40\x03\xb6\xa5\x2b\x27\x40\xda\xd9\xde\xf1\x20\x78\x29\xe2\x24\xc1\x63\xc3\x22\xaa\x61\xd9\xe0\xc3\x09\xe8\x12\x7b\xed\x0c\x97\x54\x8c\xfa\x28\xf5\xbf\xd7\xe6\x93\x31\xda\x31\xcb\x64\x10\xc7\x3c\x78\xec\x28\x5e\xd9\x3e\x54\x77\x88\xb9\x0f\x06\x8a\x0d\x20\xeb\xa0\xd6\x6d\x14\x8c\x50\x44\x48\xa9\xf5\x99\x93\x75\xad\x3d\x90\x4d\x5b\x8b\x4c\x15\x80\x90\xc3\xeb\x9b\xd6\x16\xfb\xc6\x71\xd5\xfe\xee\xa0\x7b\xf7\x8f\x8c\xe0\x69\x47\x35\xa7\x78\xb3\x48\x6f\x77\xc5\x4e\x67\xfb\x96\xa6\x21\xc1\x6a\x4b\x7d\x02\x88\xd8\xb8\x17\x3d\xa2\x0b\xf2\x70\x17\xba\x42\x2c\xba\x72\x10\x2e\x60\x1e\xb4\x70\x56\x0b\x22\x74\xae\x93\x5b\x6a\x99\xa8\x0a\xb5\x85\x04\xe6\xaa\xaa\x9d\xd3\x21\xf1\xea\x27\xc2\xa9\x45\x39\x48\xef\x69\x41\x26\x95\x9c\x6d\x81\xde\x2e\xb9\x05\x41\x54\x51\x07\x76\x45\xd0\x54\x8c\x6a\x93\x50\x0c\xb4\xd9\xdd\xd3\x10\x39\x8b\x97\xcb\x1d\x10\x1c\x66\xc5\x6d\xad\xa1\x5d\x21\x96\xa0\x8a\x8e\x32\xc0\xac\x4f\xdd\x7c\x09\xaa\xbd\x72\x05\x86\xcd\xf8\xfb\x2a\x49\x02\xdc\xff\x9a\xef\xef\xd5\xd2\xd8\x23\xdb\xc6\x65\x5a\x5c\x6b\x0b\x07\x03\x9b\x8e\x2c\x39\xff\x3e\x3a\xf8\x92\x52\x41\xdc\x06\x35\x9a\x1d\x41\x6e\xb1\x12\xaa\x2c\x8b\x12\x48\x05\x7d\x83\xa1\x6d\x28\xed\xf1\xe5\x49\x7a\xa3\x5d\x80\x42\xbc\xc2\xf3\x41\xd8\x08\xd9\xcb\xc4\xab\x11\x82\xd3\xa6\x66\x7f\xd6\x4e\x71\xa2\xba\xeb\xd6\xb5\x2b\x2d\xb5\x22\x88\x93\xd7\xa8\x15\xdd\x91\xe0\x3f\x0d\x71\xcc\xbd\xc7\x99\xb0\x3f\xda\x78\x7e\x9d\xef\xce\xed\x3c\x11\x9c\x45\x60\x66\x2f\xc8\xb4\x86\x91\x5d\xa2\xe3\x8a\x42\x2e\xf0\x64\xef\x75\xfc\x4d\xb4\x15\x45\xa2\x74\x7a\x8b\xfe\x38\x1c\x19\x14\x5d\xb5\x0f\xf3\x18\xc1\x5a\x9e\x0b\xf3\x61\xc5\xbb\x81\x94\xb8\x28\x89\x5e\x9d\x44\x31\x90\xe9\x75\xa3\xb0\xf8\x2c\xf5\x42\xec\x04\xbd\x46\x2a\x65\xf3\xb7\x12\x29\xca\x52\xa5\x85\x73\x70\x37\x5b\x95\x65\x4e\x97\xc6\xb3\x5f\xc1\x30\x75\x04\x90\x8d\x2e\xfe\x08\xde\xc4\xd0\xdb\x33\xbc\x69\xf5\x6e\xb5\x4a\x97\x29\x1d\x55\x24\x08\x7a\xbf\x8f\x21\xbc\x3b\xe7\xcd\xef\x77\xc3\x87\x66\x45\xc3\x92\x0f\x6d\x12\x67\x8c\xb7\x6c\x7d\x2d\xfc\xa3\x08\x10\xf8\x59\xcb\x4e\x0a\x5e\x18\x11\xd2\x27\x78\xac\x33\x28\xcc\x4d\x48\x0e\xc1\xeb\xc8\x7a\x04\x64\x64\xc0\xc0\x97\xea\x36\x2e\x6d\x85\x57\x6d\x0b\x11\x41\x9b\x6f\xa0\x00\xfe\x85\x07\xcd\x97\x04\x65\xbd\x51\x6c\xd1\x1a\x8e\x5c\x26\x02\xdc\x6e\xb3\xbd\x60\xd1\x38\xdf\x33\x8b\x80\x58\x37\xdf\x9b\xf6\xac\x8b\x24\x92\x2c\x47\x6c\x17\xb9\xa6\x13\x3e\xad\xe4\x42\x2d\x0b\x50\xa4\x81\x5b\x6d\x19\x67\x02\x8e\xf4\xba\xc9\xea\x71\xd7\xb7\x5d\xd7\xe8\x8a\xa4\x75\x5e\x7c\x71\x60\x01\x04\x4e\xd5\x4b\x1a\x43\x64\x88\xab\xbb\xa5\x41\xa4\x9b\x45\xe5\xed\xec\x82\x04\x38\x00\xdd\x73\xac\x8b\xc4\x45\x1d\x51\x00\xd3\xff\x32\xb4\x3e\xf8\xf6\x71\x4b\x74\x98\x73\xb3\xb9\x25\x69\x14\x8b\xbd\x8b\xd1\xc0\x16\xb6\x21\x30\x1a\x45\x7a\xa7\x5f\x8a\x99\xc5\x5f\xcc\x43\xf3\x5d\x96\x19\xdb\x1c\xae\x03\x2a\x2f\x14\xf5\xd4\x73\x4c\x34\xe5\x5b\x55\xa2\x02\x6f\x41\x57\x82\xde\x65\xa4\x58\xe9\x42\x44\x18\x54\x47\x65\x19\x28\x61\x3d\x45\x63\xaf\xd7\xea\x5f\x37\x1d\xd9\xd8\x13\xa9\xe0\x06\x04\x51\x30\x61\xcb\x0b\xd1\xb6\x01\xc1\xd6\xfa\x0e\xf0\x64\x7a\x79\x23\xf0\x3e\x48\x73\xb7\xfa\x85\xef\x86\xc0\x69\x96\x56\x6e\x94\xb8\xc0\xd1\x49\xc2\x1a\x2f\x4e\x3a\x19\x7a\x4f\x1e\x16\x0c\x29\x97\xeb\x5c\x90\x75\x5b\xdb\xea\x8f\xeb\x6f\x14\x2c\x05\x81\xe3\xb5\xd3\x95\x77\x0f\xda\x63\xb0\x51\x50\xc9\x86\x8c\x33\x4a\xc1\x64\x87\xd8\xa1\x53\x49\xb6\xbb\x25\x68\x60\xa3\xaf\x5c\xd1\xd3\x32\x8e\xc2\x05\x88\xac\x5d\x56\x77\xd2\xcf\xce\x6a\xf9\x77\xb8\x53\x34\x06\x9d\xbc\xa7\x17\x39\xe5\x8d\x6d\x05\x6a\x90\x0b\x77\x41\x1c\xac\x3e\x55\x3a\x5c\x9f\x78\x53\x99\x25\x5c\x7f\x2a\x73\x80\xc2\xce\x80\x90\xb5\x79\x4d\x2d\x43\x65\xcf\xa2\x18\x52\x87\x67\xe7\x4d\x11\xb4\xac\x55\x0f\x39\x42\x41\xbe\xbd\xc7\x52\x19\x81\x38\x26\x5b\xef\x60\x23\xc2\x7f\xa4\xa0\x57\x81\x74\xe2\x7c\x57\x3a\x55\xc3\x30\xc6\x6d\x1a\x31\x9e\x58\xa0\x5d\x2d\x7f\x39\xf7\x02\xec\x24\xfc\xbf\x0f\x63\x71\x92\x80\x60\x60\xc0\x3b\xa4\x16\xda\x58\x90\x70\x2a\x53\x33\x22\x11\x45\x72\x6a\xd4\x9b\xb4\xc8\xb4\x1b\xa0\x5f\xcc\xe1\xa9\x9f\xb9\xc8\x89\x7d\x2f\x9d\xdb\x9f\xd2\x3c\x89\x04\x25\xf0\x48\xa6\x15\x4b\x7c\xd0\xb0\x4d\x02\xb5\xcf\xa6\x89\x89\x37\x04\x7d\x96\x9f\x6e\xac\x09\x90\xb3\x28\xcd\xf2\xb2\xc2\x00\xe6\x9a\x59\xa5\x55\x6e\xce\x37\x74\x00\x5d\x00\x94\x6b\xdc\xf0\xfe\x32\xd7\x45\xa9\x64\x99\xea\x4f\x10\x06\xc3\x53\xeb\xdf\x77\xb1\x7d\xce\x56\x95\x70\x34\xe6\x4b\x55\x8f\x29\x3a\x7d\xc7\xd9\x1a\xe2\x57\xf6\x8f\xa0\xcb\x25\x12\xb5\x52\xe0\x11\xa1\x7d\x80\x71\x42\x3a\x17\xf0\x8c\x00\x2a\x57\xab\xc7\xa9\x55\xf9\x39\x5d\x42\xff\x4b\xb5\x8d\xd3\x92\xc4\xf9\x4b\xd2\x76\xec\x42\x66\x3a\x2f\x24\xae\x1e\x32\x95\xfd\xea\xe8\x5a\x8e\xd8\x74\xfd\xb6\x54\xb8\x43\xdc\xa4\x82\x68\x07\xe0\x46\x9a\x9a\x1c\x2c\x99\x8f\x45\x79\x35\xc5\x93\x43\x49\x2a\x8c\xfe\xc2\xcc\xa2\xd8\xeb\xdd\xba\x68\x98\x43\x5e\x88\x7b\x1f\xdc\xb9\x88\xce\x05\x1f\x0b\x4f\x8d\x85\x02\xcd\xfd\x0c\x0e\x56\x33\x72\x66\x0e\x49\x6e\x36\x10\xa4\xce\x39\x2c\x98\x45\x98\x90\x30\xff\x91\xe6\x4b\x30\x03\x40\x4b\x54\xd8\xda\x41\x40\xb7\xb2\x66\x6d\x5c\x12\x4c\x71\x57\xf1\xfa\xf4\x14\x82\xf9\xb2\xa5\xbf\xa6\x39\xad\x2b\x61\x6b\x27\x95\xbd\x7b\xef\x5d\xb1\x59\xa1\x61\xac\x92\xb8\x8a\x23\xf8\x5f\x82\x04\x94\xe6\x78\x28\x55\x22\xd2\x9c\x5d\x43\x24\x25\x28\xb4\x06\x9a\x61\x4d\xd8\x4c\x3c\x77\xa0\x42\x54\x03\xf8\xd7\x5c\xa7\xdc\x64\x56\x24\xf7\x62\xd8\x60\xf2\x6e\xc1\xce\xa4\xa3\xc3\xcd\x0c\x15\xc6\x77\x82\xaa\xc8\xe6\xde\x2e\x4a\x01\xb2\x0a\xb4\x04\x8c\xc9\x6f\xfe\xe9\x4f\xaf\x53\xa0\x4b\x3e\xa7\xb0\x8b\x49\x14\x09\x18\xac\x2d\x40\x04\x00\x4e\x34\xe4\x5d\x21\xae\x7a\xc3\xf1\x7c\x30\x76\x05\x25\x08\x48\x3a\x98\x50\x41\x68\x13\xf4\x6a\x4d\xe6\xab\x39\x9f\x76\x5a\xfe\x82\x6d\x3b\x61\xf4\x8a\x4a\x9e\x1d\xec\x8e\xf3\x17\x05\x89\x0e\xa0\xfb\xef\x82\x61\x39\x6b\xc8\x30\x92\xad\x05\xc3\x1d\x26\x9e\x85\x4b\xa0\xc6\x39\xe6\x1c\x16\x0e\x4b\x73\x58\x4c\x09\x06\x33\x05\x0d\x3e\xb2\x5c\x45\xda\xda\x9b\xee\x3d\x7d\x6f\x76\x1a\xcf\xfa\xb8\xcd\x46\xbd\x5b\x17\xa0\x90\xc4\x92\x92\x49\xa3\x2f\x2e\x75\x64\x4e\x05\x4a\xa7\x51\x8e\x45\x82\xdf\x4e\x7e\xbd\x93\x36\xc2\xb5\x1f\xe0\x41\x16\x18\x29\x40\x03\x2f\x96\x9f\xe3\x2c\x4d\xa4\x32\x5d\xca\x64\x9c\x24\xe6\xb0\xef\x80\x40\x4e\x1a\xf0\x7c\x24\x82\x6f\xa5\x96\xb6\x03\x7c\xe8\x53\x5e\xdc\x65\x2a\x41\x85\x81\x78\x59\xa1\x20\x3f\x26\x4a\x83\xd6\xf9\x43\x16\xd8\x1a\x6d\xe3\x56\x15\xf2\x97\x5d\x7e\x68\x24\xf3\x42\x34\x9b\x13\x71\xc6\x97\xb2\xde\x74\x55\x62\x68\xfc\xb0\x7b\x08\x48\x9e\x65\x9c\xdb\xca\xd6\x78\xb9\xf6\x05\xb2\x40\x31\x8d\xe7\x06\x85\x83\x10\x0f\x40\x22\xa5\x0c\x5d\x8a\xcd\x7b\xd3\x22\x31\xd7\x9d\x4e\xbf\xc8\x4d\x91\x57\x6b\x82\xe4\x61\xc3\xd1\xf3\x62\xc5\x7a\x0f\x4c\x63\xfe\x1b\x2d\x70\xb8\x8c\x70\x9d\xaa\xdc\xdc\x68\x84\xb1\xc4\x00\xaa\x71\xa1\x1e\xe1\xec\xc2\x99\x64\x6e\x15\x08\x40\xda\x43\x46\x7d\x49\x41\x93\xa5\x65\xe8\xc0\x3e\x03\x51\x81\xcf\x0c\x7e\x2a\x0b\x10\x9a\x1e\x86\x17\xaa\x3f\x25\x91\xc5\x43\x3e\xa6\x65\x74\xf8\x79\xa3\xea\xe2\x36\xba\x52\x5b\xaa\x37\xbf\x02\x90\x9d\x2f\x46\x10\x57\x15\xc4\xb9\x4d\x13\x4b\x16\x26\x6d\x79\xcd\x31\x23\x57\xed\x9e\x16\x7c\x65\xd2\xc9\x53\xdd\x15\x64\xa6\x77\x82\x86\xd8\x49\x05\x5d\x40\xaa\xff\xc4\x83\x00\x62\x28\x5a\xc5\xe5\x72\x8d\xd9\xd1\x21\x17\xeb\xc0\xef\x30\x9a\x01\x81\x19\x28\x66\x07\x8f\x4e\xe5\xc8\x90\xc3\x4a\xce\xfe\xf8\x21\xdb\x89\x1b\x43\x1b\x42\x47\xb7\x16\xef\x1e\x7f\x88\xe1\x89\xb1\xfe\x74\xcf\x16\x44\x17\x1a\x73\x77\x22\x5c\x97\x70\xa1\x11\xc0\xc3\x5c\x51\xb0\x26\xad\x63\x03\x67\x96\xed\xc7\x2e\x77\x3d\x01\xa7\xb2\xf0\x74\xe7\xcd\xb5\xb6\x51\x2d\xeb\xd3\x1c\x8f\x66\xe5\xe4\xb5\x5c\x55\xb0\x2f\xb1\x13\x79\x5e\xec\x58\xef\x8d\xce\x38\xe3\x8b\x62\xa8\xd7\xea\x89\x21\x7a\x17\x35\x0a\xe9\xe5\x6e\x65\xfa\x1b\x43\x1e\xd7\xd6\x26\x83\x7a\xef\xc8\x13\x84\x98\xb8\x31\xfa\x8c\x87\x5a\xe4\x2a\x92\xf5\x03\x91\x45\x8a\x20\xb8\xb5\xd9\x76\x2b\xf5\xa5\x32\xff\xd3\xed\x08\xf1\x22\xb6\x63\xd4\x9e\x43\x81\x83\x02\x57\x68\x9e\xe0\x7e\x03\x5f\x7d\x1b\x6b\x1d\x8c\x50\x00\x8a\x2a\x50\x63\x8e\xc8\x84\x68\xf0\xb4\x54\x2b\x63\x88\xca\x74\x03\xba\x6f\x95\xca\xf6\x78\x8c\xf2\xa0\x99\x9d\x1c\xcc\x5b\x7b\x9b\xf0\xe0\xf6\xdb\xd5\x7a\xc9\x61\x63\x31\xa5\xec\xb5\x34\x3c\x43\x14\xf4\x04\x0f\xd0\x47\xb6\x59\xb4\xb5\xd9\xe5\x78\x09\x40\x2b\x7f\x71\xb3\xeb\x7f\xf6\x19\xe4\xc4\x95\x5e\x96\xe9\x02\xaf\xc1\xf3\x45\x97\x83\x56\x66\x88\x57\x15\x24\x73\x4a\x45\x0b\x99\xe4\x77\xdd\xd3\x50\x36\x2e\xcb\x14\x68\x65\xe5\x8e\xf9\xa1\x7d\xc4\x44\x5e\x94\x07\x0d\x01\xfa\x1b\x19\x55\x20\xb2\x47\x43\xc0\x91\x44\x52\x5b\x09\x2f\x5d\xbc\x6d\x58\xae\x4b\x17\x10\x76\x29\xb0\x5a\x07\x5d\x0c\x78\xdd\x71\xae\xee\x3a\x2d\x4d\xb2\x59\x5a\xb4\x76\xd4\xe7\x14\x93\x41\xc6\x93\xe6\x69\x6d\x99\x7a\x8e\xae\xb9\x0f\x19\xb7\x5e\x80\xfa\xbb\xdd\x6e\xde\xb8\x41\x3c\x9b\x44\x22\xd8\xc5\x6d\x25\xae\x7a\xb1\xe8\x98\xb3\xe0\x65\x07\xdc\x4c\x0a\xe1\xb6\x34\x80\x98\x2d\xe0\x1a\x80\x1b\x1f\x84\xc3\x0e\x0c\x3b\xac\x12\x26\x21\xf7\xf3\xaa\x7b\x1c\x60\xff\x40\x93\xf7\x1e\x68\x82\x0f\xb4\x1e\xf7\xe6\xe0\x5b\x6d\x40\x28\x72\x71\x95\x88\x78\x52\xe0\x36\x32\xa6\x4b\x68\x3a\xb6\x46\x7a\xcc\x5f\xa1\x9a\xc4\x85\x89\x68\x79\x3f\xfa\x7e\xc6\x8b\x53\xa3\x47\xea\x6f\x79\x1a\x8b\x48\xd4\x30\x79\x51\x90\x15\xab\xa5\x0a\x3d\x2a\x2c\xc6\x9e\x93\x41\x15\xeb\x16\xe4\x00\xa6\x54\xe8\xe5\x00\x7c\xb0\x07\x33\x7c\x37\x57\x77\xfc\x7d\xf2\xb5\x21\xaf\x60\x4f\x6a\x5f\xf9\x51\xe3\x26\xed\xd8\xc0\xea\xaf\x2b\x6e\xf8\x2a\xc0\x56\xcd\xfd\x80\xab\x18\xaf\x29\x9b\xda\x4b\x37\xa0\x41\x98\x57\x5f\x53\x26\x21\x1e\x28\x93\xa8\x4b\x7e\xde\x5f\x26\x31\x47\x9c\x20\x3d\x0e\x8a\x7a\xd1\xc6\xc6\x3c\xe5\x2f\xfb\x62\xf7\xcc\xc6\xa5\xb4\x0d\x1e\xf4\xd7\x45\x01\x6e\xef\xdc\x17\xca\x2f\x4a\xd9\x23\x64\xb4\x2d\x79\x3a\x79\xe4\x0f\xac\x4e\x4b\x1e\x44\x51\x45\x57\xa0\x00\xc5\x06\x66\xa4\xcc\x85\x4f\x61\x08\xe3\x40\xff\xab\x9f\xfe\xfa\x57\x3f\x29\x01\x27\x00\x5a\x51\xbe\x0d\xeb\xc0\x3d\x85\x56\xf5\x88\x1b\x1d\x9c\x94\x51\x80\xac\x2e\x86\x6d\xfd\xf0\x74\xbe\x27\x34\x70\xee\xb5\x6f\xb1\x83\xc4\xa6\xae\x54\x9c\xf8\x85\xc6\xde\x47\x10\xd4\xd5\x12\x80\x75\xf8\x1e\x0e\x09\x98\xfb\xbd\x51\x92\xc5\x59\x75\x95\xc1\x38\x01\xbe\xa5\xb8\xcb\x5d\xdb\x17\xbb\x9a\x64\x3d\x6d\x1e\xbf\x2f\xee\x58\x08\xea\x2a\x6f\xd3\xcf\x4a\x50\x54\xcc\x2a\xea\x58\xad\xf9\xbb\x07\x0f\x19\x72\x99\x5c\x8d\x45\x50\x50\x21\x1f\x28\xa8\x30\x8e\x35\x6c\x08\xcc\xdc\x54\x40\xea\x58\xe4\x62\xa1\xd6\x69\x9e\xd4\xc3\xdf\xb5\x71\x01\x5f\x90\x9f\x50\x33\x9d\xee\xd6\xfb\x60\x3b\x08\x7c\xb9\x6b\xfb\xbb\xf1\xcd\x41\x7d\x0d\x64\xcd\x8c\x03\xc0\x5f\x9a\x83\x52\xfe\xb6\x34\x07\x61\x57\x0c\x1e\x2c\xac\x82\x17\x62\xc0\x31\x49\xf5\x72\x47\xb5\xf8\x79\xbd\xe4\xc4\xcc\xbe\x95\x00\x2d\x55\xa6\x3e\xc7\x39\x65\xb9\x78\x73\x62\x28\x98\xcc\xc0\x10\x04\x16\x6e\x71\xe1\x13\x85\x99\x2d\xad\xf2\x65\xb1\x2b\xe3\x5b\x6c\x12\x54\xc4\x00\x59\x55\x4f\x4e\x83\xb3\x45\x16\xb9\xf4\x0b\x3e\xe4\x07\x8a\xc0\xfa\x49\xa8\xc7\x6f\xe9\xfa\xfe\xc6\xaa\x35\xb3\xdc\x10\x24\x5c\x15\x1c\xc3\x3b\x80\xdb\xa1\xf0\x12\xaf\x76\x69\x56\x3b\xfa\xcc\x71\x26\xa0\xde\x9f\x43\xc4\x24\x96\x6b\x2b\x81\x6c\x09\xbd\x5d\x35\xab\xa6\x18\xb2\x6a\xc9\x94\x77\xe5\x07\xa8\x66\x02\xdb\x09\xcc\x2c\x1c\xf6\x83\x1a\x24\xa8\x5a\x0c\xfd\x09\x13\x4c\x91\x28\x56\x15\x1b\xa2\xf0\xa9\x75\xbc\xdd\xa2\xff\x11\x2f\x31\xb0\x28\x4f\x4e\xac\x95\xb6\x2a\xca\x5b\x16\x24\xb6\x7c\x97\xb6\x81\x61\xae\xf1\x47\x08\x76\x57\x96\xe8\xaa\x58\x2e\x77\x25\x87\x38\x11\x45\xcd\x2e\x2b\xec\x71\x8d\x11\x10\xe3\x34\x89\x20\x09\xce\xd9\x4c\xfb\x56\x84\x37\xee\x74\x38\x56\xc4\xcf\xf6\x39\x2d\xb2\xd8\x0e\x5e\x98\x00\x0e\x13\x17\xb9\xbc\x8b\xf7\x16\x3a\x66\x01\x99\x99\xba\x8d\x33\x8c\xbc\x7b\x15\x36\x91\x59\xbc\xc0\xde\x10\xef\x34\xc8\x6c\x2d\x32\xb5\xd1\x1e\x69\x1b\x5d\xe4\x1c\xf6\x81\x28\xc5\xaa\x80\x6a\xa9\x1d\x80\xed\xf9\x2c\x5e\x18\x4b\x0d\x00\x44\x4a\x57\xa2\x2a\xe4\x27\xa5\xb6\x75\x51\xdc\x00\x52\xb5\x8c\x33\x07\x0e\x40\x12\x05\x63\xb0\x19\x07\x9f\xaa\xa7\x6c\xc1\x83\xc0\x3e\x15\x56\xfc\x1d\xce\x34\xb5\x8e\x3f\xa7\x4c\xaf\xc7\x95\x7e\x6e\x5d\x56\x04\xb6\x00\x50\x33\x60\xa9\x69\x90\xbc\x45\xa7\x91\x75\x94\x04\x67\x83\x3b\xf5\xe0\x6e\x13\x62\x5e\x34\xaa\x59\x23\x4a\x4e\xb1\x66\xaf\xcd\x1d\xfa\xe1\x76\xef\xd2\x2a\x20\xe2\x62\x81\x30\xf7\x51\x4e\xa0\xcd\x85\x12\xaf\x78\x24\xef\x39\xd8\x89\x3d\x36\xd7\x13\x9c\x54\x2a\x11\x14\xa1\xcf\x62\x5d\xf9\x94\x10\xd9\xde\xae\xbc\xae\x1c\x92\x90\x2d\x9a\x76\x9e\x71\x68\x01\xc1\xfe\x1d\x21\x0e\xe2\xda\xeb\x98\x3b\x28\x44\x29\x83\xe0\x69\x90\x3b\x15\xb5\x3a\xd1\xf7\x1c\xf4\xcc\x2d\x67\xab\xab\x15\xf3\xc8\xaa\x6c\x03\x7f\x10\xe2\x5f\xfe\x45\x6e\xd3\xdb\x6e\x52\x7d\x81\xff\x76\x3e\xd9\xf9\xe9\xe9\x2b\x79\xd5\x95\x1f\xbb\x72\x1c\x6f\x94\x10\xff\x22\xc4\xbf\xe0\x84\xde\x53\x63\xea\x3a\xe6\x5f\xac\xe6\x9b\xf5\x6b\xef\xfe\x72\x6a\xbf\xaa\x8d\x0b\xc8\xcd\x53\xea\xdb\xb3\x28\xe5\x31\xdf\xed\x05\x80\x27\x3b\x48\x2e\x19\x57\xee\xcb\x5d\x6c\xb9\x82\xdf\xea\xaa\x0e\xe3\x0b\x93\x94\xe6\xb3\x9e\xac\x8a\xf9\xca\x97\x13\xe2\x0f\xe9\x16\xe5\xed\xf3\x6c\xbb\xcd\xba\xd5\x97\xca\x7c\x10\x8e\x12\xd7\x42\xc8\x56\xc0\x9b\x53\x4f\xcb\x32\xcb\x82\xf9\x87\xfe\x43\xdf\xcd\x13\xf8\xdb\x66\xb8\x9f\x9f\x9d\x3f\x3f\x3d\xb3\x0f\xe9\x36\xc6\x9c\xa3\xde\x60\xf5\xf8\x51\x04\xf2\x1e\x8e\xfc\x70\xfb\x91\xfb\xfe\x61\xef\x88\x9f\x9c\x6a\x6f\xae\x65\xf3\xcd\x60\x38\x68\x97\xe4\xc2\x6a\x13\x5a\x39\x98\x12\x4c\x6f\xbb\x69\xae\x79\x54\x60\xd5\x73\x29\xa6\xb9\x86\xcc\xdf\x75\xb5\x37\xcf\x7e\x97\x9a\xbb\xf0\x9e\x75\x09\xe8\x0f\xaa\x6e\xac\xad\xfa\x5b\xf8\x6e\x0d\x37\xe0\xac\x35\x84\xcc\x03\xaa\x22\x72\x87\x21\x95\xa0\x82\xe5\x58\x7a\xc5\x31\xe8\xa0\x43\x5f\xc4\x2f\xd4\x99\x67\x91\xfc\x85\xfa\xf2\x0c\xad\x96\x5f\xa8\xe9\xcf\x90\x02\x08\x8e\x02\x8c\x1a\xd6\xd0\x4b\xf6\x11\x54\x16\x67\x9f\xd3\xc1\x6e\xb4\x14\x60\x05\x4d\x32\x0b\x37\xac\xf3\xc1\x12\x63\x38\xdc\x9a\xb5\x5e\xd8\xb8\xb6\x2a\xb4\x46\x47\xd1\xd4\x10\xbf\xb8\x39\x7e\xe6\x9c\x68\xf2\x11\xc0\x27\x31\x1f\xbe\xf2\x17\x96\xb2\xb5\xac\xb0\xe8\x2a\x2e\x09\xc5\x1b\xba\x44\xe3\x46\x50\x24\x20\x48\x27\xa0\xdd\x02\xa5\x87\x6d\xc9\x1c\x27\x27\x7b\xa7\x9c\x63\xe8\x64\xdc\xcd\x85\xe0\x3f\x2f\xe2\x38\x4e\x5b\xf3\xe0\xc8\x4e\x88\xc7\xc7\xe9\x8b\xe6\xda\xd6\xab\xda\xc6\x52\xa0\x04\x10\xcd\xab\x5d\xc6\x23\xe4\x5c\x6c\x30\xd4\xee\x38\xea\xb4\x8c\x73\x99\x17\x22\x2b\xf2\x5b\x0e\x86\x02\x74\xce\x2c\x57\xc2\x53\xa6\xf8\x74\x10\xc9\x15\x22\x2c\x34\x98\x9b\x77\xf7\x4a\x25\xc7\x45\x25\xa7\x0e\xa3\xac\x1f\x6d\x7b\x0a\x31\x33\xc3\x14\x67\x54\x32\xe3\x8e\x4f\x33\x1f\x58\x71\x46\x18\x0c\x9f\xba\xdc\x2f\x4b\xa7\xbd\x45\xf9\x5a\xb6\x45\x00\xab\xec\x19\x24\x73\x0a\x06\x91\x3d\x42\x28\x15\xe9\x89\xe4\xd9\xfd\x04\x35\x67\x10\xb8\x69\x02\x75\x7c\x8c\x1b\xc3\x3b\xc0\xdf\x3b\x06\xa9\xe9\x0a\x2a\x68\x01\x95\xe5\xfe\xdd\xf1\xe1\xdb\xa2\x0e\xc7\xfd\xc0\xd5\xf4\x70\x5c\x51\xc8\xd5\x36\xe3\x58\x75\x6f\xbb\x90\x6f\x88\x81\x87\x35\x03\x51\x56\x48\x17\x25\x0a\x50\x95\xa5\x82\x46\x38\xd0\x7b\xa6\x20\xf4\xe3\xbc\xd7\x2a\xd6\x9f\x3a\xe4\x31\xf3\x28\xbf\x5e\xc0\xb8\xbd\x4e\x3c\x5e\x1f\x58\xfa\x66\xe3\xd8\x68\xc7\xb4\x16\xd1\x38\x3c\xab\x66\x65\xac\xb0\x06\xfc\x03\xd6\x15\xb9\x2a\x53\x36\xe4\x88\x66\xc4\x4c\x2c\xe5\x02\xc9\xf0\x6c\xdc\x1f\x95\x57\xac\x8a\x0b\x32\xcb\xbc\x83\xd9\x47\x6f\x36\x2c\x4d\x17\xab\xb1\x9b\xcd\x11\xde\xdf\xc5\x0e\x14\x43\xa7\xab\x02\xe6\x2f\x73\x5e\x6d\xd2\x5c\x11\x3f\x04\xbe\xc7\xd3\x30\x70\xef\x9b\x23\xe6\x75\x97\x25\xf5\xf0\xbf\x12\x44\x7d\x90\xf8\xdc\xc0\xd9\x1e\x40\x67\x60\x5b\xd6\x7a\xe1\xfa\x69\xf3\xd1\x0d\xfa\xcd\x62\x85\x16\x22\xdc\x32\x18\x41\xc6\xe3\x37\x86\xb5\xc0\x45\xd6\x3f\x1c\xbe\xd0\xcc\x5b\xf1\x8d\x0e\xfc\xb6\x89\xf3\x74\xa5\x74\x65\x6e\xfa\xae\x40\x1e\x85\xb8\x42\xa3\x14\xaa\x07\xd1\x35\xd3\x8a\x82\xf8\x71\x2e\x77\x39\x40\x87\x0b\x63\x87\x9b\x07\x81\x5b\x03\x07\xf6\x02\x07\x1d\xcb\xc7\x45\x7d\x78\x65\x6d\x78\xe3\xaa\x56\x9b\x47\xba\xca\x94\x32\x01\xbe\x66\xbb\x62\xc0\xe9\x70\x65\x68\x66\x4b\x44\xe1\xd3\xef\x38\x21\x63\x7c\x84\x8a\x80\xc5\x90\x17\x08\xe4\xc7\x73\x63\xe0\xec\x4a\xa5\x45\x4c\x64\x70\xfe\x34\xd7\x5e\xfb\x4f\x44\x75\xf9\xf4\xd3\xf2\xd3\x7d\xde\xef\x9f\xbc\xfd\x78\x32\xee\x9f\x8c\x2f\xfe\x20\x16\xd0\xfb\xf9\xbf\x5e\x9c\xbe\x3a\xab\xeb\xff\xbc\x78\x75\xf6\xc4\xff\xf9\x4d\x7e\xfa\x50\x06\xf8\x19\xc0\xf3\x1b\x73\xe5\xf4\x2a\x7b\xff\x9c\x8c\x8b\xbc\x6f\xb5\xe3\x4f\xc6\x05\x58\x00\x5a\x9e\x77\x4f\x65\x7f\x3a\xe8\xcd\x87\x3f\x0f\x64\x7f\x72\x75\x35\x19\xcf\x64\x7f\x32\xbd\x9e\x4c\xb1\x46\x7c\x38\x03\x2e\xc3\x9e\x1c\xf5\x3e\xc8\xcb\xe1\xf4\x0a\x72\x16\x17\x93\x01\xfe\x9e\x98\x13\xe5\x68\xf0\xae\x37\x92\xb3\xc1\xf4\xe7\x61\x7f\x30\xeb\x86\x85\xe7\xc4\xb9\x2b\x98\x8e\xd4\x7e\x1b\xde\x3c\x00\x6e\xc1\xf9\x7c\x32\x1d\x0f\x3e\x9e\xf4\x47\xc3\xc1\x78\x2e\xa7\x83\x11\xbc\x7f\xf6\x7e\x78\xdd\x6d\xb4\x50\xd0\x6b\x67\x98\x1e\x19\x8e\x81\xde\x17\xdf\x05\x54\x85\x47\xbd\xd9\xc9\x70\x76\x24\xdf\xf6\x66\xc3\x59\xf3\xfb\xf2\xaa\xf7\x57\x68\x82\x47\xca\x28\x90\x98\x79\x38\x7e\x87\x32\xe5\xde\x33\x99\x1e\x32\xc2\xbe\x5b\x7a\x67\xcb\x94\x08\x9c\x8a\x4c\xa4\x68\x19\x91\x05\x30\x22\x0f\xe7\x33\x79\x33\x1b\x74\x85\xb0\x21\x15\xc6\x8b\xc9\xe3\xde\x4c\x02\x77\xcf\xe0\x42\xbe\x1d\x8c\x26\x1f\x3a\x01\x1b\x25\x67\x80\x06\x72\x3e\x98\x5e\xcd\x2c\x77\x71\x73\x38\x6a\x8a\x4b\x47\xfd\xfe\xf5\xe8\x48\x4e\xa6\xf2\x88\x7e\x77\xd4\xe9\x5a\x98\x1a\xbd\x63\x3e\xe8\xcf\xcd\x7b\x3f\x7a\x32\x76\xbd\xf1\xc5\xf3\xc9\x54\x20\xf9\x62\xef\xfa\x7a\x34\xec\x03\x67\xe4\xa8\xf7\xa1\x0b\xa4\x91\xc0\xce\xe8\x10\x6f\xcc\xd0\xfc\xde\x4c\xe1\x8c\xa4\xf1\x86\xff\xcb\x6b\xbb\x37\xed\x81\x60\x9e\x59\x4e\xd8\x8e\xf7\xc3\xb7\xc3\xf9\xe0\xa2\x2b\xc4\xdb\x8f\x72\xf0\xf7\xc1\xb4\x8f\xfc\x91\xe6\x75\xf0\xd9\x99\x65\xd0\x34\x6f\xb4\xa3\xf3\x7e\x30\x1d\x44\xf2\xe3\xe4\x46\xf6\xfa\xfd\xc1\x35\x34\x5e\xf6\xde\x4d\x07\x03\x39\x9f\x88\xb7\x03\xf9\x76\x72\x33\x86\xfe\x35\x47\x90\x9a\x84\x63\x82\xff\x98\x4c\xe5\x3b\xb3\x14\x66\xf0\x48\xf3\x7b\x7c\xb9\xe8\x4f\xc6\xf3\x1e\x4c\x91\x79\x23\xd1\x58\xce\x86\x17\x83\x69\x8f\x57\xf7\xc7\xc9\xcd\x94\x5a\xc1\x98\xc0\xd9\x4d\xff\x3d\xbd\xd4\xb4\xcb\xd1\x32\x74\x59\xea\x0a\x2d\x4b\xb2\x40\xe3\xae\x3c\xea\x17\x59\x86\x28\x5b\xb8\xae\x8f\xc8\x3f\x88\x09\xa8\xe1\x38\xd9\x10\x3f\x05\xa1\xc3\x54\xeb\x1d\xb0\xc3\x56\xeb\x22\x2b\x6e\xf7\xb2\x28\x85\xca\x97\xfb\x65\x56\x6c\x55\x92\xc6\x44\xb9\x63\xac\x02\x17\x78\xcc\x21\x0e\x88\x80\xe1\x0a\x82\x97\x5e\x21\xd1\xaa\x28\x37\x11\x56\x2d\x21\x72\x3c\x96\xf9\x6e\xb3\xc0\xd8\x03\x26\xd7\x02\x25\xeb\xc8\xd9\x93\x00\x51\x52\xdb\x18\x30\x9b\x28\x29\x86\x4c\x21\xc6\x41\xc0\x50\x66\xea\xfb\x26\x58\xa5\x13\x6b\xad\x36\x8b\xcc\x31\xde\x2c\xdd\x38\x40\x39\x48\x57\xf6\x42\x96\x30\x36\xc1\x45\x2c\x6b\x63\x46\xe1\x70\x44\xa8\x79\xc6\x18\x79\x3c\xb1\xfb\xe0\x31\x60\x28\x56\x18\xa6\x53\x59\x71\xd7\xb1\x26\x1e\xc1\xaa\x5d\xa6\x67\xe4\x17\x3a\x1c\xd5\x9e\x14\x4e\x13\x95\x5c\x33\xb4\xcf\x02\x70\xc3\x5f\xc4\x79\x22\x18\xca\xaa\x4e\x18\x6f\x86\xd1\x5e\x7f\xa2\x99\xf7\x09\x8a\x88\x36\x3b\x0d\x53\x4e\x70\x0a\x60\x47\x94\x49\x19\x6f\xe2\x8a\xe8\x43\x23\xb1\xc2\x6a\x80\x38\xe3\xdf\x40\x3a\xab\xc8\xe5\x36\x05\x3b\x91\x23\x57\x91\xd4\xc5\x8e\x72\xbb\x25\xa2\x7e\xe3\x12\xca\x8d\x2d\x13\x56\x24\xe2\x45\x99\x26\xb7\xf8\x9e\x65\x61\x66\x51\xd3\x43\x29\x4d\x8a\x5d\x00\xce\xb6\xe6\x2a\xa3\x50\x63\xa9\x96\xb1\xae\x22\x61\xf9\x83\x54\x82\xdf\x4f\xe2\x2d\xca\x8e\x20\x7c\x1f\x6b\x21\xda\xe7\x59\xfa\xf3\x2c\xbe\x6e\x9e\x6b\x93\xda\x9c\xd3\x4b\x56\x5f\xfb\x5c\xa4\x09\xa3\x7b\x92\x62\xb7\xa8\xa8\x32\xba\x86\x9d\xe2\x69\x80\xa0\xaf\x4e\x59\x1a\x0d\xc6\x53\x78\xe3\x09\x88\x80\x7d\xbe\x5c\x97\x45\xce\xf4\xae\x41\xf8\x3f\x97\x55\xba\x51\x09\x92\x2e\x42\x3c\x04\x77\xdb\xa6\xf8\x9c\xe6\xb7\x22\xdd\xc4\xb7\x4a\x1e\x1f\xc1\x33\xd2\xfc\xf6\xa8\x83\x9d\xfe\xfa\x0e\x8b\xda\x22\x5e\x76\xe5\x11\xfe\xab\x28\x79\xf5\x32\x7a\xf3\x73\x9a\xec\x00\x6e\x8e\x8e\x07\xa1\x7b\x89\x0e\xa5\x72\x95\xf9\x1c\x23\x0e\xf9\x41\xdc\x3b\x6c\x5d\xea\xd1\x84\x23\x02\x3d\x08\x27\x3d\xf8\xc2\xbb\x75\x81\x84\x06\x2a\xf1\x3c\x17\xa1\xba\xf2\xc8\xdf\x6e\x81\x57\x09\xde\x10\x33\x68\x52\xbe\x72\x9d\x6e\xb1\xdd\x4d\xc0\x8e\x68\xb6\x77\xd5\x95\x47\x1f\x8b\x9d\xdd\xcc\x79\x7b\xe3\xd4\x17\x63\x40\x81\xa3\x4a\xfa\x49\x4d\x1a\x3c\x61\x7a\xb0\x8e\x31\xe2\xe1\x41\x93\x30\x7b\x45\xbd\x6a\x1d\x37\x2e\x56\xd4\x5b\xe4\xe9\x16\x7e\x65\x82\xe4\xc7\x32\x6b\x0c\x97\x9e\xf8\xf4\xda\xb6\x24\x89\xe7\xd7\x38\x85\xd4\x68\x25\x0e\x36\x59\x26\x4a\x6f\x53\x60\x70\xe1\x06\x73\xb2\x0d\x02\xf1\xe7\x5d\x79\x19\xa7\x25\x64\x87\x90\xe4\xfd\xb1\x45\x43\xb2\x54\xc9\x6e\xa9\x22\x2c\x26\x88\x04\x60\x9e\xb0\x6a\x09\x4b\x98\xb0\x49\x5c\xc5\x80\x8a\x46\x31\x2a\xdb\x45\x44\x2d\xae\xe3\xcc\x11\x2c\x7b\x04\xec\x5a\xd0\x99\xaa\xbe\x2c\xb3\x9d\x36\x3b\x80\x1e\x67\xf3\x4e\x1c\x7c\x2d\xee\x5c\x99\xa3\xfb\x2d\x15\x96\x60\xb9\x7c\xb3\x2a\xe9\x45\xd7\x8e\xcf\xbb\x32\xce\xab\xae\x9c\x85\x14\xea\xc4\x9a\x08\x0c\x1d\x0d\x78\x80\xcd\x89\xf0\x54\x08\x9f\xfe\x5e\x03\xe6\x02\xce\xbb\x2c\xb9\x4b\x13\x15\xc9\xb2\xd8\xc7\x59\xb5\x3f\x59\x95\x4a\x45\x32\x2f\xf2\x13\xdb\xaf\xc8\xcc\xf1\x56\x55\x66\x31\x1e\x33\x8c\x2e\xd9\x95\xc1\xa9\xe2\x75\xc0\x76\xb1\xe3\x33\x58\xf1\x3a\x80\x4f\xd3\x48\x41\x3e\xca\x15\xb0\x10\x14\x1c\x2e\xc4\x1f\xc0\x2a\x81\x29\xa4\xda\x4b\x2f\x31\x0e\x55\x38\xcb\xa2\xdc\x16\x65\x5c\xf9\x47\xa4\xb9\xc2\xa1\xe6\xbc\x94\x80\xaa\xab\x1d\xdc\xda\x32\xd9\x37\x9f\x8a\x38\x29\xfb\x50\x0b\xf0\xaf\xdd\xf1\xfa\x47\xb8\x87\x43\x10\x82\xa3\x80\xdf\x42\x4d\x1f\x9c\xc3\x66\x32\x00\x0c\xb3\xcd\xe2\x3d\x25\x57\xb3\x7d\xc4\x85\x50\xee\x37\xc2\x2b\x8f\xb2\xbf\x95\x8b\xbd\x87\x78\x96\x49\x7a\x9b\x56\xe6\xfa\xdd\x25\x69\x81\x37\xb3\x95\xb8\x71\xbd\x67\xfa\x82\x96\xae\xb4\x74\xc3\x91\xed\xd3\x74\xd0\xa5\xc9\x33\x65\x19\xee\x01\xfa\x86\xc5\x60\x90\x63\xd0\x16\x34\x9d\x17\x77\xf2\x53\x5e\xdc\xe5\x66\x6b\x99\x15\x06\xe8\x4f\x99\x28\x28\x67\x21\x5d\x32\xff\x15\x44\x02\xe8\x16\x81\x8d\x2c\x35\xd1\x05\xa6\x1b\x90\x91\x67\x0e\x56\xe0\x95\xe3\x22\xaf\x83\x4b\x8a\x76\x6a\xa3\xd1\x48\xe6\xec\x50\x3f\x16\x66\xc0\x4c\x55\xda\xb6\xa5\x76\xab\xe9\x40\xb3\x2e\x2f\x2a\x41\x87\x5f\x66\xe5\x24\xcc\x74\xd9\x53\xcf\x34\x9a\xb6\x1b\x0b\xdc\xf9\xe5\x56\xb5\x0a\x27\x2e\x96\xa3\xc7\x6b\xe4\xa6\xa9\xd6\xa6\x2b\x33\x56\x21\x7d\x79\x9c\x74\x50\x84\xf4\x58\x75\x10\xae\x3b\xf5\xea\x2f\xbb\x73\x8f\x2e\x8e\x9b\xe4\xbe\x2f\x5f\x70\x6a\x45\x4b\xd7\x74\xe0\x44\x20\x5d\x06\xac\xf3\x4e\x6c\xd5\x15\xe5\x8e\x1d\xf8\xbf\xa6\x39\x17\xb7\x51\x70\x45\x6e\xf5\xd2\xb2\xf7\x7e\x43\x0b\x1c\x2e\x13\xef\x63\xb0\xac\xb3\xbd\xe0\xf5\xef\xcc\xd6\x1c\x00\xb5\x2d\x22\xad\xfe\xf1\x66\xda\x0c\x0d\xd9\x01\xf4\x01\x19\x26\xad\x06\xab\xad\x35\xb9\xc9\x53\x78\xfa\x54\x91\xf4\xed\x90\x69\x5b\xc0\x82\x8c\x5a\x2e\x42\xe0\x06\x22\x0a\xa5\x60\x5f\x07\x76\x54\x48\x7c\x71\xdf\x00\x88\xfb\x07\x80\xc7\xc7\x8d\x2b\x40\x5b\x00\xc0\x87\xb5\x9d\x05\xc2\xef\xd8\x88\xa8\x97\x1f\x21\x46\xd6\xbf\xe1\x0e\xdf\xf4\xb6\xea\x98\x89\x0f\x9e\x09\xbb\x97\xa8\x77\xb4\x1a\x79\x2d\x99\xe5\x0c\x93\x11\xb6\xcf\xe9\x88\x78\xd6\x92\x9d\x0f\x80\x9f\xa4\x79\x15\x2f\x2b\xac\xd0\x24\xda\x19\x68\xaf\x87\xc9\xf3\x5a\x46\xc7\x33\x23\xc6\xb2\x38\xdd\xa8\xd2\x58\x4c\xae\x50\x35\x6c\xc1\x57\xae\x3e\x71\xef\xe0\xbb\x21\xb5\xe5\x38\x70\xf8\x18\xe7\x16\xcc\xee\x8d\x8a\xf5\x8e\x53\x2c\x82\x91\x30\xc4\xf9\x51\x94\x8d\xe2\x47\x48\x4a\x13\x4b\x98\x39\x91\x21\x81\x60\xcb\x7d\x0e\x9a\x84\xb2\xc7\x75\x41\xfe\x11\x0a\x57\xac\xd2\x3e\x1d\x64\xcb\xa5\xd5\x74\x4b\x23\xe2\xc4\x4c\x75\xbb\x3e\x74\xdd\x8b\x8d\x01\x86\x60\x49\xd1\xb0\x23\xb6\xc2\x7d\xa1\x82\x83\x23\xb4\x46\xea\xa6\xad\x1c\xae\x60\xb6\xd0\xa4\x6e\x6b\x1a\xb8\xa6\x94\x96\x41\x3e\x8f\xdc\x3b\x49\x79\x29\x45\xfc\x1a\xf5\x05\x86\x6f\x0b\x14\x49\x60\x6e\x44\x02\x55\x0e\x9d\xf5\xd9\xe8\x0f\x14\xab\x7b\x1c\x45\x70\xd5\xd8\x77\xd0\x66\x60\x4f\x41\xa0\xa7\x10\xb1\x60\xb2\xd2\xc8\x54\xbe\x08\xd7\x9d\xdd\x2f\x84\x6d\x6a\xd9\x33\x55\x01\xdf\x68\x1e\xc3\x02\xb2\xc1\x7b\x5e\x18\x4c\xb8\x82\x65\x93\x29\x00\xba\xc8\x84\x5d\x61\xfb\x90\x8f\x0b\x1e\x79\x17\x97\xc0\xde\x42\xb1\x54\x11\x27\x9f\xe3\xbc\x8a\xb1\xae\x6f\x0b\xd7\x16\xd4\x0f\xa8\x2a\x26\x66\x28\x76\x9c\xa9\x50\xfb\x0b\x25\xde\xfd\x65\xba\xb2\x76\xa8\xb5\xdd\x54\x42\xf0\x2f\xdf\x0e\x61\x2b\x64\x95\x66\xea\x44\xaf\xe3\xb2\x21\x51\x82\x2a\x39\xe6\x8a\x5c\xb4\x30\xdf\x3d\xbe\x5f\xd2\xef\x97\xb8\xb7\x5f\x81\xec\x9e\xab\xd7\xdf\xc6\x7b\x46\xdb\xc3\x58\xd3\x57\x85\xff\x55\x33\x37\xcb\x22\xcf\x19\x12\xc0\x9b\xd2\x1f\xa4\xc6\x88\xa0\x0f\xcb\x40\x88\x3f\xe4\xf2\x8b\xe4\xc1\x33\xb4\x0e\x52\xd3\x01\x1f\x01\x98\x92\xc0\x8c\xef\x2f\x69\x72\x7e\x49\x56\xd4\xcf\xe1\xd1\xae\x32\xb6\xd2\x0e\x08\x7d\x71\xaa\x3f\x16\x3b\x48\x83\xef\xaa\x34\x4b\xff\x03\x6c\x16\x33\xe6\xf9\x67\x65\xb9\x69\x01\x0c\x77\x6c\xba\xa3\xd5\x2e\x29\xf2\xfd\x06\xf2\xe9\xd6\x0b\xe8\xf0\x02\xab\xed\x2b\xf3\x29\x16\x80\xff\x11\x4f\x8e\xb4\xca\x6a\xa7\xa6\xff\x11\xef\x46\xa0\xcd\x6f\xdb\xbf\x17\xfe\x39\xf0\xd0\x45\x8f\x09\xff\x7c\x4f\x8c\x1f\x76\xff\x33\x03\x2f\xb0\x16\x2c\x7c\x76\x75\x19\x70\x57\x44\x4c\x14\x00\xc7\xc7\xcd\x74\xe8\x9f\xa6\x1e\xbe\xbc\x99\x6d\x66\x4c\x3a\x3a\xac\x8e\x69\x29\x64\x92\x98\x99\xc7\xd2\x14\x91\x25\x6e\x09\x77\xa1\xc2\x9d\x0e\x32\x3b\x79\x78\x7c\xfc\x68\x97\x7f\x24\xd7\x8c\x8f\xc1\x23\x25\x64\xfb\x6d\x84\xb1\x22\x09\x41\xaf\x4d\x9a\xa7\x9b\xdd\x06\xbb\x45\xef\x87\x58\x0f\x29\x51\x62\x18\xca\x45\xdc\x00\x83\x51\x62\xe9\x9a\x0d\x76\x08\xfa\x22\x7e\x47\x53\xfc\xd5\x5d\x7e\x96\x11\x2c\xf6\x79\xe8\x98\xdc\xba\xfe\x60\xe1\x45\x51\xf0\xc1\x7e\x50\xe7\x77\x88\x99\xfd\x20\x44\xda\x95\xd7\x96\x92\x62\x25\xa7\xe0\xff\x9a\xeb\xf5\x06\x6c\xce\xb7\x59\x9c\x7f\x52\xbc\x4c\x8c\xd5\x61\x17\x0c\xd9\xf4\x3a\xf4\xfe\x85\x75\x67\x28\x82\x1c\x59\x2f\xc9\x05\x73\x32\x30\x26\x3f\x1b\xc7\x24\x20\xc4\x60\xdb\xbf\x58\xa6\xaa\xda\x0b\x00\xa8\xc8\xde\xac\xdf\xbb\x8e\xe4\xdb\xab\x61\x24\x67\x83\x59\xaf\xdf\x61\x37\x3d\xf5\xb6\x3d\xa1\x76\x03\x7a\x0d\x3e\x64\xf8\x88\x11\xfe\x5f\xf1\xe1\x77\x6a\xb1\x8c\x75\xd5\xa9\x6f\x3c\x84\x2c\x78\x1f\x6f\xbd\x98\xc4\xd7\x1d\xe0\x0f\x5c\x4c\x42\xa4\x69\x57\x5e\x29\x73\xe8\xc2\x4c\x91\x94\x9f\x59\x44\xb3\x2a\xae\x76\x55\x51\xee\xdd\x0c\xfd\xfe\x53\x01\x2b\xc4\x46\x83\x6e\x55\xbe\x84\x3f\x3a\xda\x37\x61\x7e\x59\xd1\xd0\xbd\x8f\xcb\x72\x2f\x2f\x8b\x2f\xb2\x07\x1f\x6d\x4c\x0b\x14\xf1\x78\x0e\x83\xb3\x80\x6a\x56\xd5\xf1\x11\x10\x51\x73\x5c\xfc\xa8\x53\x13\x2e\x69\xc8\xe6\x01\xd1\x7e\xa6\x0b\x27\x13\x24\x38\x5a\xb9\xd8\xcb\xb3\x37\xf2\x66\xd6\xb7\xd6\xc6\xd9\xd9\x2b\x9e\xdd\x9b\x99\x07\xd3\xed\x2d\x2b\x38\xb9\x61\xcc\x1c\x73\x5d\x9a\x53\x56\xe0\x1f\xbb\x32\xd5\x09\xf9\x7a\x1d\x38\x36\x3f\xb6\x71\xed\xe1\x81\xe1\x77\x20\x58\x2c\xe2\x57\xde\xf6\x0f\x2e\x16\xd5\x95\x1f\x70\xf5\x9a\x03\xf5\xa1\xb5\x72\xcf\x69\x51\xe7\x05\x83\xd3\xa2\x91\x9a\x78\x60\xb1\xe1\xb2\x11\xbf\x6a\xdf\x9f\x84\xfb\x1e\xd7\x97\x98\x99\x16\x0c\xc8\x04\xb9\x6f\xcf\xb3\x39\x76\x78\x77\x8b\xa0\x9e\xe4\xc1\xc5\x24\xef\x5b\x4c\x2f\xc5\x57\x2d\x26\x79\xef\x62\x12\xf7\x74\xe1\x1b\x98\xc2\x70\x9b\xbc\xea\xca\x29\xeb\xb6\xc7\x94\x4d\xfc\x60\xdd\x4c\x58\x51\x17\xce\x07\x15\x37\xe3\x11\xa8\x2e\xb2\xd6\xa0\xbc\xba\x99\xdf\xf4\x46\xa3\x8f\x98\xf6\xb5\xb9\x5e\x10\x4f\x1c\x80\x68\xe0\x87\xe9\x70\x3e\x1c\xbf\x8b\x5c\x92\x77\x72\x79\x39\x98\xce\x5c\x0e\x1e\x90\x02\xc8\x8d\xcf\xa0\x80\xe9\xe0\x7a\x3a\x98\x0d\xc6\xf3\x1e\x11\xe9\x4f\x6b\xe2\x8d\xac\x04\x29\xfb\x93\x71\x7f\x30\x1d\x0f\xc7\xef\xec\x03\xad\x3a\x64\x24\xad\x36\xe4\x6c\xde\x9b\xdf\xcc\x27\xd3\x8f\x35\xa9\x44\xab\x19\xe9\x04\x27\x41\x34\x12\xde\x1b\x89\xf0\xa5\xf3\xe1\x7c\x34\x88\xac\x70\xe4\xb0\x26\x1c\x29\x0f\x09\x47\x46\x75\xd5\xc8\x48\x90\xd4\x62\xef\xed\x6c\x40\xe9\xea\x51\x6f\x3e\x18\xcf\x7d\xe1\xc5\xcb\x41\x7f\x3e\x8b\x64\xaf\xdf\xbf\x99\xf6\xfa\x1f\x23\xd6\x67\xc4\xa1\xc1\x6f\xd1\x03\xc4\xe4\x52\x0e\xa6\xd3\xc9\x74\xe6\x24\x23\x27\x53\x40\x78\x5c\x0c\x67\xfd\xc9\xcf\x83\x69\xef\xed\x68\xd0\x95\xb3\xc9\xd5\x40\xfe\xdb\xcd\x74\x38\xbb\x18\xf6\x71\x6c\x2f\x26\x88\x2f\x19\x8d\x26\x1f\xcc\xf3\xc5\xe0\xef\xfd\xd1\xcd\x8c\x12\xeb\x4d\x19\xec\x48\xce\x26\x98\x5c\x77\x1f\xbc\xea\x7d\xc4\x87\x5c\x5f\x8f\x3e\xca\xf9\x44\x7e\x9c\xdc\x20\xc3\xf5\xc8\xa9\xb5\x16\xb9\x1c\x31\xb8\xb6\x6b\xbe\x3c\xb8\x9e\x33\xb0\x60\xf0\xf7\x39\x82\x4e\xfe\x76\x33\x9c\xe2\x3a\x0a\xc1\x0f\x51\xa0\xae\xfd\x61\x38\x1a\xb9\x05\xe5\x94\x35\xf1\xcd\x08\x41\xf9\x48\x90\x98\xf9\xfb\x81\x99\xf7\xba\xf8\xb6\x18\x8e\xfb\xc3\x0b\xb3\xc4\x46\x51\xa8\xb9\x1d\xc9\xeb\x9b\xf1\x10\xe0\x1d\x93\xa9\x1c\xfc\x7d\x70\x75\x3d\xea\x4d\x9d\xf6\x36\xcb\x6b\x92\xb0\x66\x1d\x61\x61\x25\x34\x1d\x48\x23\x82\x66\xcb\xe1\xa5\x6b\xf3\xfb\xde\x4c\xbe\x1d\x0c\xc6\xb2\x77\xf1\xf3\x70\x36\xb8\xe0\x8f\x5f\x4f\x66\x33\x5a\x58\x82\x41\x0c\xf4\x62\xdc\xb1\x6f\xba\x72\x0e\x98\x47\xac\x90\x14\x71\x37\x2c\xc1\xe5\x2a\x82\x43\xc1\x2b\xb4\x6b\x2b\x7a\x04\xd8\xaf\x85\xb1\xc5\x21\xb6\xcc\xb4\x08\x7b\xb9\x80\x02\x7d\x73\x08\x9a\x9b\x9b\x4e\xbd\x43\x01\x0e\x7b\xc6\x6b\x9b\xa9\x33\xbe\x04\xe6\xcb\x3e\x2b\x97\x30\xab\x47\xe0\x31\x60\x61\xde\xd0\x4c\x89\x79\xa6\x3c\x70\x8c\x39\x86\x44\x28\x77\xa4\xe3\x5a\xbb\xae\x24\xce\x09\x86\x6b\x39\x6d\x6f\x16\x21\xd9\x8d\x33\xb1\xda\x65\x68\x12\x13\x5f\x1e\xf9\x3a\x85\xb6\x81\x64\xdd\x75\xf1\xe7\xb3\x48\x9e\x47\xf2\x55\x24\x5f\x47\xf2\x0d\x86\x5d\xbf\xc3\xa6\xe9\x5d\xf9\x39\xfd\xec\x42\x93\xac\x3b\xd3\x0a\x5f\xa8\xa5\xb0\x30\xae\xd5\x96\xc8\x0a\x00\xa9\xc1\x44\xca\x54\x8b\x30\x1f\x25\x1f\x9b\x8f\xf2\x39\x9b\x3a\x90\x43\x34\x9d\xd6\x55\x0c\x85\xa5\xc2\xb6\xe8\xd0\x9d\x6f\xcd\xca\x52\x19\x67\x46\xd5\x53\xd2\x16\x1d\x6e\x8b\x4c\x68\xd1\x80\x6f\xa8\xab\x62\xdb\x2c\xc2\xc4\x08\x15\xa6\x23\xab\x74\xa3\x5a\xdc\x39\x61\x99\xaa\x51\xe4\x27\xb3\xe1\x0a\x42\x21\x40\x13\x01\x80\x9b\x56\xeb\xa4\x8c\xef\xc2\x60\xe2\xb1\x0f\x98\x70\x4d\xf3\xe5\x31\x20\x30\x91\x7a\x1c\x78\xe0\x0a\x47\x76\xe0\x0f\xc4\xe1\x19\x54\xd6\x61\xfe\xa4\x20\x88\x0e\xeb\x2b\xaf\xd2\x7c\x07\x35\x79\xb0\xe0\x56\x45\x49\x95\x3b\xc4\x4b\xc2\x3c\xd5\x76\x21\x0b\x97\x08\x64\xbe\x02\x29\xe5\x77\x5d\x79\x95\xea\xa5\xca\xb2\x38\x57\xc5\x0e\x31\x4b\x03\xb3\x4b\xcd\xa0\xd5\xf9\xa7\x1f\x19\xe4\x05\x74\x7f\xc3\x29\x0e\x12\xd8\x8c\x3d\x28\xc2\x80\x39\x00\xc5\x1b\xe2\x3c\xac\x75\xa0\xe3\x0d\x63\x13\x6a\xe9\x59\xaa\x47\xa9\xaf\x6b\x8a\x14\xb6\x88\xda\x59\x76\xd3\x9c\x78\x27\x74\xcb\xde\xc2\xac\x37\x72\x85\x15\xa5\xdc\xe5\x2a\x87\x71\x86\xd5\x4f\xcc\xa7\x81\xb2\x5a\x24\xd3\xca\x85\xea\x64\x8c\x53\x61\x5a\x06\x0f\x01\xda\x39\x73\x68\xd0\x53\x3c\xa5\x42\x45\x27\x08\x90\xb0\xad\x5a\x44\x5a\x82\xcc\x0c\x17\x82\xae\x76\xa5\x55\xdf\x2a\x2c\x07\x11\x53\x73\x52\x0e\x40\x58\x32\x2c\x02\x21\xb9\xfe\x5a\xed\x6d\x28\x47\xd8\x58\xa6\x52\x1b\xbb\xa0\xc8\x90\xcd\x0e\x8a\x20\xab\xe8\x1e\x84\x63\x04\xcb\xcf\x0d\x91\x65\x8e\x37\x3d\x21\x55\xab\x03\x03\x6d\x1b\x92\x98\x96\x26\xf2\x2e\x86\xa3\x9d\xf4\x6e\xf0\xde\x40\xaa\x44\x9e\x57\x3f\x66\x04\x9f\x2e\x91\x8b\x12\x3e\x22\x3d\x51\x71\x4b\x2a\x09\xa5\x37\xe9\x6d\x8e\x64\xc3\x3c\x50\x7b\xc7\x59\x53\xde\x72\x68\xaa\xfd\xa9\x5d\x21\x92\xda\xc5\xb8\xac\x55\x8e\x10\x5d\xa7\xa3\x1f\x5b\xa8\xea\x4e\xa9\x3c\x98\x17\xf3\x0a\xe1\xf0\x20\x6e\x99\x73\x0d\x2f\x9c\xc7\x10\x56\x76\xb4\x69\xb0\xdc\xf8\x48\xd5\x91\x7b\x85\x46\xf4\x45\x60\x6f\xd7\x21\x27\x5e\xed\x86\x39\xd6\x58\x1a\x8b\xde\xe3\x22\x76\xbe\x6a\xf6\x02\xfc\x35\xe2\x95\x8d\x13\xdc\x69\xc6\xa3\xe0\x49\xa4\x7c\x13\x70\x01\x61\x44\x8b\x42\x69\x01\x67\x8d\xe0\xdb\xb8\x36\x72\x1c\xef\x5f\x78\x75\xe3\xbc\xac\x61\x05\xee\xe0\x1e\xb2\x82\xda\xdc\x5d\x76\x96\x5c\x52\x18\x33\x95\x5d\x21\x1a\x48\x69\x56\x13\x76\x13\xdd\xdc\x4a\x1b\x20\x73\xf2\x79\x68\xef\xd6\x71\xa5\x0b\xb8\x20\x0e\x84\xb1\x31\xae\xd8\x78\x9d\x8f\x5e\x73\xfc\xa0\x60\xea\x20\x7b\x02\x36\x83\x8c\x21\xac\x5a\xaf\xd6\xca\xf8\x89\x1c\xdd\x60\xfe\x4f\xd7\x06\x3f\xc1\x4d\xe3\x23\x1c\x58\xe6\x31\x14\xa3\xf2\x5e\x8a\xd1\x5a\x1f\x79\x8c\x2c\x0d\x46\xed\x32\xa7\xec\x75\xa9\x6e\x0b\xf8\xd7\x5d\x21\x8f\xcf\x3b\x12\xf6\x65\xbe\x54\x3a\x12\xe9\xaa\x39\x32\xe6\x3a\x74\xf9\x71\x2b\xed\x91\x78\xd2\x1e\xc1\x9c\x5a\xc3\x32\x12\xf6\x40\x05\x33\x2d\x76\x70\x01\x33\x79\xc5\x22\x4b\x6f\x9d\x74\x21\x7f\xdf\xe9\xc8\xbb\xfa\x1e\x4c\xbf\x7b\x78\x41\x62\x35\xf4\x2b\x33\xd1\x75\xb6\x95\xe2\x4c\x6d\x6f\xb7\xa5\xbb\xad\xfb\xfd\xeb\x51\x64\x29\xb6\x88\x53\xd6\x4c\xbf\xe5\x5a\x29\xe3\x44\x6d\xe2\xf2\x93\x3c\xaa\x8f\xc6\x91\xa0\xc9\xb6\x84\x1e\xf6\xb3\xc0\xb0\x7a\x5b\x98\xe6\xb5\xac\x2e\xb7\x39\x02\xb1\x79\x3e\x17\xdb\xbe\xd5\x45\x71\x55\x4b\x60\xbb\x63\x03\x02\x8f\xc6\x9a\x99\xda\xd8\x41\xcf\xcc\xdb\xf2\x93\x25\xd5\xb5\xba\x86\xee\x74\x7c\xab\x24\x30\x8d\x40\x91\x1f\x64\xf5\x58\x98\xda\x0c\xa3\x5e\xab\x44\x14\x08\x49\xbe\x53\x0b\x9d\x56\x2a\x4c\x68\x41\xae\xd3\xc9\x8b\x06\xa4\x58\x98\x71\x34\xf6\x87\x99\x99\x74\xa3\xda\x36\x37\xbd\x0d\x8a\xee\x50\x09\xae\xe2\x62\xf1\x25\x7d\x76\x49\x83\x50\x94\xb7\xcf\xff\xcb\x96\x49\x75\x9f\x7f\x78\xd1\xff\xc3\x94\xff\xf1\xe7\xfe\xfa\x9f\xd3\x57\x67\x6f\x5e\xd5\xea\x7f\xce\xcf\x5f\x9c\x3d\xd5\xff\x7c\x8b\x9f\x0f\x2f\xfa\x72\x36\xb9\x9c\x7f\xe8\x4d\x07\x72\x3c\x99\x0f\xfb\x03\x88\x6b\x59\xf6\x30\x57\x48\x79\x8c\xd9\x21\x00\xeb\x24\x52\x17\xab\xea\x2e\x2e\x55\x54\xe3\xd7\x67\x20\xfa\x74\xd0\xbb\xb8\x1a\x68\x27\xe2\x2a\xf8\x40\x4a\x2b\xb5\xd1\x1d\xc7\xc8\x59\x97\x66\x75\x8e\xdf\x1a\xca\xdf\xb5\x77\x32\x5a\x64\x93\x27\x24\x60\x4b\x64\xde\xee\x49\xef\x04\x02\xc0\x54\x1a\x8a\x4c\x15\x2c\x36\x6b\x79\x10\x90\x26\xee\xd8\x33\xeb\x55\x07\xcd\x00\x04\x89\x58\x98\x59\x09\xe4\x58\x64\x1f\x15\x45\xc2\x26\x32\xbb\xe1\x7b\x77\x71\x37\xa4\xb1\x03\x2f\xa2\x2b\xc4\xb5\x03\xdd\x92\xe4\x4b\x44\x6c\x42\x51\x5d\xfb\x1c\xb9\xcb\x68\x8c\x31\x2f\x57\xe9\x70\xa8\x91\xc9\x0e\x50\xbe\x74\x78\x87\x02\x22\x36\xa7\x41\xb7\x52\x60\xda\x2b\xa4\x12\x44\xf8\xa8\xb9\x86\x7c\xa0\xa9\xf1\x62\x43\x59\xd5\x3d\x20\x22\x1c\x08\xd0\x75\xb5\xc8\x65\x6f\x34\x0a\xd5\x9d\x45\xd0\xf0\x70\x7d\x18\x43\x1d\xe5\xad\xa9\x52\xb9\x58\xf9\x46\x48\x00\x25\xfc\x01\xd1\x8e\xe0\x82\x06\xf4\x62\xb4\x50\x21\x55\x99\x15\xc4\xac\xf2\x39\x55\x77\x6c\x16\xed\xb4\x72\x72\x4f\xa5\xf2\xb8\x4b\x04\x64\x88\x2c\x50\xf0\x8e\x34\x6b\xc1\x51\xf3\xca\x2a\xd2\xbc\x52\xe0\x61\xee\xd0\x28\xdd\x2a\x73\x09\x3b\x70\x93\x8e\x38\x93\x8f\x68\x35\x9e\x70\xe1\x4d\xb8\xf1\x00\xf3\x22\x57\x48\x0e\x8c\x2e\x2a\xec\x37\x1e\x9d\xd9\xba\x28\x2b\x63\x03\xa5\x4b\x4b\x7c\xb6\x50\x76\x8f\x89\xe3\xf5\xde\xbc\xd7\xf4\x1c\xa2\xeb\x40\xf6\x00\xc4\xb5\xfc\x2b\xbe\x7a\x3b\x3e\xf1\xeb\xa2\x48\xac\xee\xc0\x7d\x7d\x5f\x16\x89\xd9\x3f\x63\x5b\x5d\x0d\xe6\x35\x91\x47\xd7\x78\x6b\xac\x33\x0d\x75\xc2\xfe\x8c\x41\x18\x27\xae\xac\xa2\x97\xb8\x53\x24\x90\xda\x95\xc7\x1f\x3c\xc6\x87\xa0\xfe\xfc\x66\x3a\xb4\x8f\xb4\x33\x08\x37\xb3\x2b\x09\x81\xba\x7e\x27\xf4\xde\xed\x08\xe1\x22\xfb\x5a\x08\xa8\xca\xb2\x87\x17\x96\x18\xf6\x6f\xae\x38\x06\x1f\x94\xc5\x1d\xf5\x66\x72\x38\x8b\x8e\xa8\xb0\x8a\x2b\xca\xde\x4f\x46\x17\x83\xe9\x4c\x5c\xf5\xfe\x3a\x78\x30\x8a\x6f\xa3\xf4\xe6\xd7\x36\x4e\x6f\xe3\xf1\xf2\xed\xcd\xdc\xac\x4c\x01\xe1\xf8\xc1\x85\x9c\x4f\xa2\x5a\x0e\x80\xe3\xf0\x5c\x02\x38\x99\x86\x91\xf8\xf1\xc7\x96\x58\x3c\x46\xde\x7b\xf3\x7a\x98\xd6\xf6\x7c\x32\xad\x75\x1c\x62\xcd\xe3\xc9\x5c\x72\x04\x1f\x9e\x3c\x7f\x3f\x9c\x5e\x08\xf3\x7c\xf3\x96\xf9\x60\x3c\x9f\x45\x6e\x28\x66\x91\x9c\x4f\x7b\x17\x83\xab\xde\xf4\xaf\x33\x17\xd3\xc7\xbf\x81\x46\x70\x6d\xcc\xdc\x5b\x5c\x30\x9b\x3b\x71\x31\x9c\x0e\xfa\x73\x33\x36\xfc\x5f\x14\xc3\x96\x93\xa9\x08\x22\xd7\x87\x42\xd4\xb5\xba\xc1\x83\x7d\x25\x12\x3f\x47\xf2\xc4\x46\xa4\x0e\x50\x40\xf6\x2a\x31\x76\x9d\x69\x33\x13\x56\xa4\xc0\xe2\xaf\xca\x0a\xdd\x15\x1b\x82\x4a\x2b\x2b\xe6\xe3\xd9\xf0\xf6\x5c\xe3\x73\x94\x9c\xdd\x65\x64\x5d\x49\x34\x9e\x5d\x79\x45\x57\xcc\x01\x29\x43\x07\xbe\x17\xd1\xac\x1f\xf0\xe0\x09\x3b\x14\x4b\x78\x6c\x42\xd0\x36\x46\x30\x91\xb1\x59\x39\x26\x8c\xb7\x4f\xa3\x9f\x28\x93\xae\xe9\xfa\xa6\x3c\xef\x0f\x3e\xdd\xd1\xdd\x0b\x30\x5c\xfb\x85\x71\x69\xaa\x74\xb7\x79\x3e\x32\x2e\xe3\xf3\xf3\xd3\xd3\xf3\xe7\xf6\x79\x27\xdc\xc2\x13\xf3\xfb\xb3\xf3\x17\x67\xf4\xc8\x55\x51\x6e\x76\x99\x8d\xdd\x7e\x78\xd1\x7f\xa6\x7d\x86\x1f\x8e\x95\x2d\xd4\x32\x76\xdc\xd6\x45\x2e\x2f\xd4\x52\x41\x65\xe0\x8b\x33\x61\x9e\x49\x8e\x3b\xa7\xa2\x11\x15\xa8\xdb\x4a\x31\x00\x57\x42\xaf\x00\x2b\x83\x5c\x29\xe7\x4f\x0a\x92\xc2\x74\x12\x96\x9b\xb8\x52\x65\x0a\xe1\x74\xa7\x3d\x8d\xe1\x72\xf3\x4c\x27\x07\xff\xa2\x1f\xc9\x52\xad\xcc\x89\x4f\x30\xd1\xc1\xb4\x3f\xbc\x42\x27\xff\x4e\xc6\x72\x5d\x38\x5d\x23\xf8\x34\x9d\xd2\xda\x81\x14\x6d\x4c\xcc\x2e\x0b\x38\x18\x13\x51\x93\x19\xcc\xfc\x08\x81\xdf\x61\x47\x3b\x0b\xd7\xb0\xf9\xfc\xd1\x4e\xab\xa3\xae\x9c\xb0\x67\x13\x61\x61\x96\x97\xb9\xe7\xd0\x25\xbb\xb9\xae\x18\x87\x3e\x03\xc6\x83\xb6\x0b\xd4\xd2\x26\x6f\x29\x4a\x0e\xe1\xc0\x4b\x63\xf9\xd8\x8b\xe9\xb2\xd8\x11\xd1\xc9\x33\x0d\xb5\x96\x5a\x33\x2a\xef\xdd\xf5\x48\x32\x9f\x8b\x23\x9d\x99\xcc\x86\xcf\xb4\x5c\x9a\x7d\x64\x45\xf4\x9d\xd5\x36\xd9\xaa\x5c\xce\x10\xd9\xe5\x2a\x58\xff\xcb\xfa\x4c\xff\x4c\x3f\xdd\xe7\xff\x16\xeb\x6b\x55\xfe\x41\xd4\x0f\xf0\xf3\x90\xff\x77\xfe\xea\x4d\x9d\xff\xe1\xc5\xd9\x9b\x27\xff\xef\x5b\xfc\xe0\xec\xdb\xb8\xe9\xcf\x4c\x52\xd7\x3d\xf5\xd0\x22\xc7\xcb\x8e\x3c\x3f\x3d\x3d\x33\x97\xc0\x6b\x79\x95\x2e\xd7\xb1\xca\xe4\x45\xfc\x39\x4d\x64\x2f\x89\x37\x5a\x88\xf0\xc3\x67\xdf\x7f\xff\xbd\xf9\xf0\xa9\x1c\x42\x45\xea\x75\x71\xa7\xca\x48\x0e\xf3\x65\xf7\xf0\x47\xe7\x08\x04\x85\x63\x0b\x13\x17\x6f\xcb\xb4\x4a\xf5\x5a\xf6\x8b\x6c\xb7\x59\xa4\xb1\x10\x5e\x41\x0f\xd7\xe8\x84\x7e\x55\xaa\x65\xdd\x93\x59\x99\xa3\xcd\x18\x03\x10\x83\x8f\x98\x7f\x8d\x84\x4c\xc0\x05\x3c\xba\xd1\xaa\x3c\xea\x38\xf7\xd1\x15\xa3\xb4\x5d\xd4\x87\x2e\x69\xe4\xd0\xc1\x27\xf2\x59\x7a\xd4\x89\x90\x55\x29\xce\x38\x91\x39\xab\x5b\x11\x07\x94\xcf\xf9\xcf\x2e\x20\x2b\xbc\x34\x39\x7a\x39\x51\xcd\x8d\xdc\x28\xe8\x23\x45\xc9\xa2\x00\x95\x46\xbe\xb0\x56\x08\x48\x26\xf5\x30\xbf\x45\xb6\xd0\x0e\x1d\x0b\xab\x40\x0b\x2c\x41\x84\xd3\xb7\xad\x37\x56\xc0\xae\xcc\x21\x18\x27\xab\x42\x24\x85\xd4\x45\x03\xae\xd4\xa6\xe6\x8d\x6a\x24\x73\x8f\xf2\xb6\x8e\x8e\xb6\x79\x49\xaf\x4e\x95\xae\xfe\x63\x74\x10\xf8\xfa\x15\x61\xd1\x09\xd5\xe5\xfb\x29\x1a\x0a\x58\x50\x55\x9c\x2b\xfa\xf3\x48\x3e\xad\x4b\x5a\x1f\x10\xac\x63\xb5\x16\x26\x52\xfb\xd7\x8c\x2d\x2f\x25\xe7\x54\xee\xa4\xca\x93\xa2\xd4\x04\x6a\x2a\x36\x45\x05\x24\xb1\xc9\xce\xd8\x17\x96\x2e\xb1\xac\x8f\x69\xdd\xae\x0c\x63\xb1\x81\x59\x89\xee\x0f\x13\x8b\x0c\xa6\xc6\x54\x66\x41\x3c\x40\x87\xcc\x87\xf3\x9b\xb9\xb1\xac\xc7\x72\x30\x9b\x91\xb9\x6d\xcc\xff\x06\xa3\x85\x18\x4f\x5a\x8d\xed\x61\xc0\xce\xf1\x7e\x30\x1d\x20\x43\x07\x01\x61\x3c\xb2\x79\xd7\x8c\xae\xa8\x3f\xc2\xfa\x60\x84\xb4\x6a\x7a\x12\xe8\x9c\x1d\x39\x40\x93\x15\xf6\xf3\x70\x53\x8f\xf4\xbe\xa4\xf3\xbe\x10\xcc\xe2\xc8\x5a\x9a\x0e\xd8\xc3\x40\x28\xf0\x17\x6b\x58\x28\x39\xb9\x14\xe0\x4c\x49\x74\xa6\xc8\x47\x92\x3e\xdc\x67\xf6\xbe\x37\x1a\x1d\xe8\x6e\xe0\x2f\x09\xd3\x3f\x18\x3b\x40\x4b\x79\x78\x1f\xeb\x3d\x21\x09\x4a\x8b\xd3\x64\xbf\x41\xff\x16\x1f\xde\xf7\xe6\xb3\xc9\xe0\x67\xe3\xb8\x31\xa3\x8c\x04\x46\x99\xd1\x64\x06\x1e\xe8\xcd\x6c\x10\xc9\x8b\xde\xbc\x67\xbe\x7a\x3d\x9d\x5c\x0e\xe7\x1e\x00\x6b\x08\x44\x38\x3d\x80\x59\x99\xe1\xea\x4f\xc6\xf3\x69\xcf\xf8\x6f\xe3\xc1\xbb\xd1\xf0\x1d\x62\xb8\xd8\x37\x9c\x4f\xa6\xf3\xe1\xe4\x66\x46\x5f\x88\xea\x3e\xdc\x64\x4a\xc4\x27\xe3\x01\x3e\xd1\x4c\xaf\xf3\x62\xa7\xf2\x7a\x30\x05\xc2\x1c\x2b\x89\xe6\xf9\xf3\x5d\x33\x96\xbd\xd9\xec\x66\x6a\xfe\x6c\xfc\xc3\x81\xbf\x92\x44\xfb\xd0\x5a\x3f\xd9\x2e\x40\xcb\x1b\x64\x7d\x61\x44\xfb\x05\xd0\x35\x31\x1c\xcf\x07\xa3\xd1\xa0\x3f\xbf\x31\x7b\x64\x3a\xb9\x1e\xb8\x89\x65\x77\x14\x3b\x6d\x66\x60\xfe\xb1\x2b\x07\xbd\xfe\xfb\x46\x03\x1c\xcf\x0f\x4c\xab\xe3\xfa\xa1\xc5\x78\x33\x1b\x4c\x61\xa9\x11\x19\xd0\xdb\xe9\xe4\xc6\x7c\xfb\xed\xc7\xc6\x1b\xe4\xdb\x1e\x60\xac\xc6\xa2\xb6\xf4\xe4\xfd\x6d\xf5\xb0\x82\x5d\xa0\xd7\x71\x34\x32\x62\x3e\xf1\xb9\x72\x1c\x5d\x0d\x92\xd8\xf8\x5b\x3c\xc2\xfe\x41\x7b\xcd\x2f\x4d\x03\x67\xb3\x9b\xab\x81\x99\xa0\xd1\x40\x4c\x07\xb3\xeb\xc9\x98\x61\x5f\xa6\x7b\xb3\x41\xff\x66\x3a\xf0\xba\x71\x6f\x33\xc7\x83\x01\x70\x23\x0d\x2f\xcd\x40\x75\x1b\xc7\x8e\x99\xb0\xcb\xde\xcd\x68\x7e\x32\x9f\x8c\x06\xa6\x75\xb0\x11\x87\x3c\x95\xf3\xc1\xd8\xac\x03\x33\x94\x66\x2d\x0d\xc7\xf2\x6a\x38\x9b\x0d\x27\xe3\x93\xfe\x74\x38\x1f\xf6\x7b\x23\x31\xfb\x38\x9b\x0f\xae\x66\x11\x02\xd2\x7a\x66\x6d\x98\xfd\x7c\x63\x46\x75\x38\x86\x37\x9a\x36\x59\x3e\x9e\xf1\x4d\x7f\x34\xe8\x4d\xe5\x65\xaf\x6f\x3a\x05\xf1\x9e\xde\x70\xda\x9f\xf6\x2e\xe7\x62\xdc\xfb\x79\xf8\x8e\x3e\x3a\x05\x0a\xa5\x9b\xf1\xb0\x8f\xbf\xb0\x2f\xea\x0d\xa7\x72\x3e\xed\x5d\x5e\x0e\xfb\xb8\x73\x26\x23\xf7\x47\xda\xca\xa3\xe1\xe5\x40\xcc\x6e\xae\xaf\x27\xd3\xb9\xbc\xea\xf5\xdf\x0f\xc7\xb4\x8f\x3f\x0c\x7a\x66\x48\xdd\x37\x86\x63\xf9\xe1\xfd\xb0\x8f\x3b\xe6\xb2\x37\x1c\x99\xf1\xad\x1d\xd1\x62\x32\xa5\x2f\xc8\xfe\xe4\x66\x74\x21\x47\x83\xde\x05\xbd\x0b\x61\x8d\x17\x83\xde\xfc\x7d\x64\xb6\xda\x6c\x32\x86\x43\xe5\xdf\x6e\xa6\x88\xcc\x9c\x99\x83\x62\x20\xaf\xdf\x7f\x9c\xc1\x88\x4d\xcc\xda\xfb\x79\x38\x9d\x8c\x21\xbc\xc2\xc7\x8c\x3c\x3e\x7a\x3f\x7c\xf7\x5e\x4e\x87\xb3\xbf\xc2\x56\xff\x19\x46\x87\xd9\xa1\x9a\x9b\x10\xce\xaf\x4b\xf3\xc8\xd1\x47\xc1\x3b\x02\x56\x46\xf3\x04\x77\x57\xd6\xe4\x32\x38\x8c\xdb\x5e\xf9\xe4\x31\xfe\xee\x3f\xdd\xe7\x93\x77\xf3\xd9\xe8\x0f\xcd\x00\xde\xef\xff\x9d\x9d\x9f\xbd\x7e\x51\xcf\xff\xbd\x3a\x3f\x7d\xf2\xff\xbe\xc5\xcf\x9c\xc3\x33\xef\xca\x62\xb7\x95\x73\xa5\x2b\x39\xdb\xa5\x95\xb2\x2e\xe1\x75\xa9\xe2\xcd\x22\x53\x18\x68\x45\x3d\x30\xeb\x17\x59\x3a\xee\x54\x23\x58\x92\x89\x3d\x3c\xf4\x1c\x61\x78\xc1\x6a\x8f\xe5\x75\xbc\xfc\x14\xdf\x2a\x61\x13\xec\x5b\x10\x3f\xf6\x03\x7a\x2d\x82\x61\x4c\xc7\xac\x51\xbd\x1d\xc8\xbf\xa8\x2a\x44\xc4\x65\x95\xea\x2a\x5d\x5a\x89\x03\xd2\x59\x54\x32\x51\x9f\x55\x56\x6c\x37\x9e\x44\xc7\x16\x5f\x1f\x99\xf6\x64\xa0\x21\xc3\x39\x0c\x48\x19\x89\xf0\x63\x21\x7e\x74\x47\x49\xb4\x50\xc7\x84\x7b\x44\x85\x73\x45\xa9\x4e\x8a\xf2\x24\x53\x5a\x8b\xe5\x4e\x57\x05\x68\xaa\xae\x62\xbd\xc6\xa2\xd7\x6c\x57\x43\xa5\xd6\x09\x5a\x83\xac\x8b\x31\xf3\x15\x65\xa4\xb4\x54\x5a\x13\xcc\x66\x85\x6e\xc5\x16\x59\x3b\x6c\x27\x11\x72\x14\x68\xce\x01\xb4\x26\x2e\x13\x7d\x02\x2c\x63\xd6\x09\xe9\x0a\x60\xb1\x5a\xec\xf6\xaa\xd4\x3f\xc8\x38\x51\xff\xbe\x83\x2c\x4e\x91\xdb\x92\x8e\x8a\x5e\x9d\xa9\x38\xd1\x8e\x98\x07\x48\xd7\xd4\x2d\x21\x77\x97\x85\xae\x34\x8b\xcb\x56\x8e\x45\x3c\xcd\x3f\x2b\x5d\x01\x86\x0c\x86\x66\xeb\x04\x34\xa2\xd0\x9f\x46\x01\x38\x6a\x90\xfd\x0b\xf5\x0b\x5a\xd7\xd6\xa8\x62\x25\xb7\x59\x5c\x99\xdf\xa3\xbf\xb8\x49\x93\x24\x53\xf0\xdd\xdb\x52\xc5\x55\xb6\x17\xd8\x5e\x8e\x26\x63\x00\x97\x9e\xcb\x98\x3d\x5e\x59\x90\x7c\xdc\x65\x55\x7a\xc2\x4f\xf5\x9b\x6c\x33\x9a\xdc\x4a\x2c\x74\x35\x6d\x1b\xe6\x27\x89\xda\x56\x6b\xdb\xb0\x34\x5f\x9a\xe9\x54\x5a\xe2\xfc\x1b\x0f\x31\xae\x52\xbd\x22\x1c\xa5\x79\xeb\x27\xa5\xb6\x5a\xd4\xa7\x8e\x79\xc6\x61\x48\x01\x41\xb3\x56\xcb\x4f\x5d\xd9\xbb\x1e\x06\x43\x90\x6a\xb9\x4e\x6f\xd7\xd9\x9e\x98\x0d\xb0\xf8\x92\x1e\x00\xcd\x42\x46\x2c\xe3\x12\x03\x37\x31\x0a\xc8\x49\xce\x8e\x3a\xcf\xb7\x22\x44\x31\x7c\xb4\x2b\x44\x0f\x31\x8f\x91\xd4\x69\x8e\x2c\x3b\x24\xc7\xb3\x50\xf9\x72\x0d\xe0\x1c\x4b\xa6\x00\xf9\x15\xdb\x28\x60\x77\x5f\x29\x85\xb4\xce\xb8\x40\xd2\x6a\x0f\x1b\xca\x1c\x2a\x55\x51\x64\x80\x99\x33\x4b\x83\x78\xa9\x89\x60\x99\x69\xdc\x6d\x44\x3a\x7c\x04\x27\x95\x6d\x6e\xd6\x1f\x8a\x4d\x91\x78\xa4\x7b\xf0\x26\xde\xbb\x61\x28\xc3\xb1\x66\x98\x33\xa3\x2e\x26\xe3\x1e\x61\x77\x7e\x21\xcb\x1d\xc6\x6b\x2c\x3f\x39\x3c\x1e\xde\x18\x85\x79\x87\x90\xc3\xfb\xc0\x77\x00\xbd\xe4\x45\xad\xa8\x16\x7d\x95\xe6\x89\x8c\xe5\x62\x07\xb4\x58\x40\x83\x44\xea\xa1\xbc\x73\xe1\xeb\xf8\xa0\xa5\x59\x57\xe6\x14\x01\x20\x7b\xa6\x2a\xb9\xd3\x40\xe5\x23\x74\x61\x26\x60\x19\xe7\x66\x12\x28\x78\xb2\x88\x97\xc4\xae\xe4\x37\x89\x14\x9a\x32\x5d\xc8\x32\x66\x2e\x04\x0e\x38\xe0\x6a\x07\x86\x48\x8f\x06\xde\x13\x90\x92\x8b\x22\x49\x95\x0e\x04\x90\xf1\x18\x9c\xcc\x86\x7f\x07\x74\x66\x5a\x55\x4a\xe9\x4e\x97\x89\xd0\x39\xe6\x73\x44\x27\xe5\x11\xa6\x4c\xb4\xab\x68\xcb\x32\x77\x6e\x60\x10\xcd\x57\x1b\x39\xa0\x22\x89\x0c\x4c\x2e\x9f\xad\x3d\x6d\x95\xe6\x03\x1d\x3d\x1c\x69\xd3\xaa\x2f\x90\xdb\xf7\x8f\xdb\xae\x10\x47\x33\x1a\x75\x0e\x85\xfa\x8d\x25\xea\x6d\x7b\xe0\x83\xb2\x2c\xb3\xb6\x81\x22\x38\xaf\x2b\x90\x85\xb7\x3a\xe1\x76\xb5\x99\x73\x70\xb9\x2c\xca\xc4\xaf\xdd\x30\xff\xa1\xd7\x8e\x05\xbd\xde\x4f\xd3\xaa\xfa\xef\x8e\x20\xa3\xb3\x06\x0c\x27\xe4\xa8\x42\xa5\x7a\x9b\x37\xf3\x98\xcb\x9c\x80\x35\x2d\x71\xf3\x5c\xa0\xaf\x4b\x35\x6a\x90\xa2\x28\xd8\x33\xa8\xad\x4c\xf3\x4f\x70\x42\x2e\x8a\x5d\x65\xd1\x33\x4d\x39\xaa\x54\xf3\x68\x98\xa7\x4d\x7d\x9a\x71\xfc\xca\x4a\x29\x6a\x6b\x5c\x41\x63\x59\x6a\xe1\x1f\x3b\x5d\xa5\xab\x3d\x83\xef\x17\xb1\xc6\xb3\x01\x08\xa0\x84\x39\x01\x23\x99\xec\xec\x01\x4c\xd1\x5b\xb3\xf1\x52\x0c\xc4\xe1\xad\x61\xae\x99\x22\x03\xaa\x26\x38\x00\x0b\x59\xe4\x5d\x79\xfc\xb1\xd8\x59\xc0\xac\x00\x04\xba\xab\x90\xe0\x37\xa7\x36\x46\xd9\x58\x59\x40\xbd\x02\x54\x46\x7e\xd1\x25\xa8\xb1\x79\x0a\x8d\x95\xcc\x4c\x9b\x48\xe4\x2e\x2e\x3f\xb1\x14\x16\x9d\xb7\xc4\x63\xbf\x52\xaa\xdb\x11\xe2\xe8\xb2\x54\x2a\xdb\xcb\x1e\xa3\x12\x1d\x2b\x61\x5c\xc9\xbc\x00\x4c\x0e\x8a\xac\x02\x54\x9c\xc1\xa5\x69\xa5\x36\x56\x52\xb3\x5a\x9b\xc5\x2b\x90\x31\x83\x4c\xa8\x95\x52\xda\x0e\x83\x59\x03\xeb\x38\x4f\x32\x36\x6b\xcc\xd7\x41\x19\x80\xe4\xc6\xec\x1b\xdd\x81\xc8\x46\x0f\xbc\xc9\x3c\xd4\x07\x8d\x98\x61\x72\x99\x3c\x48\x34\x7a\xb6\x1d\xe8\x8a\xda\x5a\x29\x28\xf8\x3f\x73\x8c\x2b\xa4\x49\x4b\xdc\x16\xf1\x5d\xbc\x37\xe7\xed\x22\xae\xd2\x4d\x08\x18\x92\x44\xfb\x00\xd7\x2e\x87\x60\x69\x23\x8a\x9f\x6b\x22\x3e\xbc\xfd\x5a\xa3\xe7\x4d\xd8\x12\x2f\x22\x80\xf7\x36\x24\x27\xda\x43\xcf\x7e\x84\xdf\x21\x4e\x30\x18\xcc\x9d\x43\x75\x14\x73\x6c\xaf\xd2\x2f\x70\x28\x9b\x3b\x8d\x72\xa2\xf0\x2b\x04\x11\x23\xad\x59\x00\xa5\xa1\xf8\xaf\xb0\xf1\x5f\x92\x44\xba\x28\x20\xa5\x5f\x94\x3e\x2b\x4e\xed\x30\x90\x3d\x3b\x00\xde\xb1\x22\xe8\x68\x32\x43\x8c\xe1\x68\x2b\xcc\xe7\xd3\xb9\x78\xc3\xca\xe7\x1b\x72\x16\x72\xa7\x3c\x04\x2d\xaa\xdc\xd5\x64\xc8\xbc\xe1\x27\x38\xfe\x1d\x30\xa6\xd0\xa8\x0b\x0f\x2c\xa6\x55\x59\x05\xd2\xaa\x56\x9e\x0b\x55\x1c\x58\xc6\x17\xd4\x1c\x8c\xe3\x60\x56\xec\xba\xb8\x43\x9c\xda\x5a\xe5\x80\xc1\xe3\x4f\xc1\x83\x51\x27\x88\x4c\xcd\xfa\x34\x17\x8e\xad\x22\xc8\x3b\xfc\x20\x44\xa9\x08\x1f\xb2\x07\x8a\x44\xbe\x58\xa5\xfa\xa2\x96\x3b\x20\x02\xa5\x8c\x83\xd2\x15\xdc\xb0\xe6\x1c\xa9\x28\xe8\xaf\x59\x36\xc7\x98\x1d\x59\xba\xac\x10\x76\xf7\xf0\x43\x22\xf2\x79\xe0\x34\x80\xdd\x07\x06\x00\x97\x89\xc5\x39\x18\xe3\xa4\xc6\x61\x29\x90\x37\x71\x0e\x90\xb3\x18\xc5\x8f\x71\xac\x0e\xb4\x3a\x78\x1f\xc9\xed\x65\x2a\x2e\xb3\xbd\x75\xcc\x34\x0c\x69\xca\xaa\xa2\xda\xcb\x39\x34\x17\xc2\xcb\x36\x7a\x38\x02\x15\x14\xb7\x65\xec\x15\x0c\x79\xab\xa0\xc0\x7c\xcf\xd2\x18\x29\x60\x13\x70\xf3\x04\x92\xe7\x7c\xdd\x5c\x99\xfb\x71\xb3\x05\x2c\xcc\xe3\xa7\x8b\x6f\x52\x90\x34\x2e\x4b\xa5\xb7\x05\x16\x07\xd6\x3b\x79\xdf\x6c\x79\xbe\xe0\xa1\xd7\x8a\xf0\xb5\xc1\xc7\x60\xad\xe0\xea\xac\x4f\x82\x85\xc9\x51\xa5\xe1\x52\x69\x81\xca\x23\x3c\xd5\x1a\xca\xfd\x5c\x25\x7e\x27\x92\x55\x71\x8b\x7c\x04\xd0\x39\x5f\x6c\xd7\xdc\x99\xc4\x81\x50\xc8\x5b\x85\xa2\xca\x2d\xd3\xf9\xca\x4d\x27\x5e\x2a\xa1\xf6\xbf\x77\x45\xbb\x0a\x91\x1a\x59\x44\x78\xc3\xd7\x9f\x96\xef\xe1\xcb\xb8\x4f\x8b\x42\xe3\x73\xd8\x8b\xa9\x7f\xdd\x27\xe2\x12\xb6\x41\xfc\xf6\x70\x55\xc1\x75\xe7\x29\x47\xed\xdb\x96\xa5\xfb\x02\xd0\xec\xdc\xde\x96\xea\xd6\x6c\x21\x84\xc5\xc2\xd8\x1d\x93\x16\xcb\xde\x63\x1c\xe8\xb8\xd5\x1c\x7b\xe2\x6d\x78\x99\x97\xa2\xfd\x2b\xce\x2d\xf5\x47\xa8\x75\x69\x43\x51\x10\x61\xca\x94\x08\xfa\x85\x4c\xec\xe8\x81\x5b\x59\xc3\xe2\x2e\xc7\xc2\xf3\xb9\xb9\x08\x97\x65\xba\xa5\xfa\x93\x2c\x5d\x94\x10\x3c\x00\x03\x96\xb9\x95\x90\x3c\x6e\xbb\x03\xeb\x05\xc3\x00\xe8\x94\xc7\x5a\x16\xbb\x6a\xbb\xab\xdc\xbd\x72\x70\xdb\x72\x33\xfd\x4a\x6a\xb9\x32\xf7\x86\xbb\xeb\x1d\x23\x52\xed\xdb\x68\x1e\x2d\x54\x56\x20\x32\xee\x6e\x5d\x6c\xc0\xb6\x73\x2a\x69\xd5\x5a\x6d\xb8\x02\x0a\x8c\x14\x5d\x64\x3e\xeb\x03\xf3\xa7\xd2\x5f\xed\xdc\x59\xf2\xa6\xc0\xb0\x7c\xd3\x9d\xed\x16\x65\x61\x0c\x30\x7f\x20\x48\x2d\x07\x87\x2a\xff\xc4\x64\xf0\x41\x47\x83\xdc\xac\xbb\x0a\x05\x4f\x7b\xed\x4d\xdf\x85\xc9\xde\x03\xb1\xa8\xfd\x6f\x48\xf6\xfa\x60\x82\xaf\xc9\xf6\x7e\xdf\xc5\xfc\xd8\x75\xaf\xff\xd7\xde\xbb\x41\x0b\xb8\x15\xb1\xad\x9c\x42\xbd\x3f\xdc\x3e\x1c\xcc\x80\x4e\xe0\x1e\x26\x09\x54\xb4\x68\x7c\xcd\x87\xb1\x72\xfa\xa7\x37\xbe\x10\x0f\x25\x52\x71\x60\x07\x79\xf2\x14\xc3\xff\xcf\xf4\xd3\x7d\x3e\x2e\xee\xd4\xe2\x4f\x8c\xff\x9f\x9e\x9f\xbd\x7c\x5d\x8f\xff\xbf\x39\x3d\x7f\x8a\xff\x7f\x8b\x1f\x98\x7d\x54\x21\xe3\x63\xee\xec\xfb\xef\x08\x91\xb5\xd8\xcb\x31\x04\xda\xe4\x34\xde\x68\xb5\x0f\x08\x95\xbd\x48\x96\x7d\x08\x45\x80\xf1\x6c\xb6\x4f\x64\x61\x3a\xe0\xb6\x07\x4f\xe7\x24\x41\x4f\xc7\x9e\x84\x58\x1e\x5c\x42\xf4\x16\x6f\x86\xd4\x7d\xc5\x7f\x68\x2c\x7f\xf9\xc5\x3c\x38\x53\xab\xea\xd9\x33\xaf\x14\x3a\x4b\x3f\xa1\xa9\x5a\xe4\x74\x2e\x63\xd8\x48\x1c\x42\xb6\xfa\xed\x76\x95\x82\x00\x16\x63\x6b\x68\xa7\xad\x9b\xb3\x4a\x55\x06\x1c\xc2\x2a\x4f\x54\xfc\xb9\xf0\x18\x75\x7d\x6f\x59\xe4\xf8\xc8\x1c\x55\x48\x50\xfe\x10\x6d\x0c\x6b\x2b\xc0\x9d\xb5\xfc\x94\x17\x77\x99\x4a\xd0\xd8\x61\xff\xd7\xab\xb0\x42\xc3\xc1\x25\x57\x8d\x11\xe0\x79\xd6\xe8\x9d\xe1\xdb\xc0\xe4\x44\xa2\x32\xbe\x6c\x48\x15\xc4\xfa\x65\xe6\x9d\xa5\x02\xfd\xc0\x6a\x1d\xcc\x36\x7a\x65\x4c\x36\xab\xcc\xb4\xee\xb2\xca\xbf\xe4\x8c\x71\xa0\x12\x7a\x17\x17\x09\x6f\xf6\xf6\x9a\x72\xf5\xeb\xdc\x3a\x40\x98\xd1\x48\x60\x90\xf3\x2e\xd5\x6b\x24\xf5\xb2\x1a\x81\x7b\xff\xc3\xb1\xec\x5f\x9c\x4c\x27\x57\x1e\x1b\x3a\x7c\xbf\xfe\xd0\x38\xe8\x61\xdd\xb7\x00\xbf\x17\x47\x12\xbc\x11\x2b\xc2\xce\x0e\x37\x2b\xe0\xda\xf9\x06\x32\xc5\xbc\xf0\x2b\xd0\x43\x98\x60\x01\x42\x7d\x85\x5c\xec\xf6\xba\xed\x59\xb4\x3a\x1c\x05\xb4\x71\xf6\x20\xdc\x41\xb7\x37\x11\x46\xea\x38\x4d\x82\xb6\x39\xd1\x4c\x34\x84\x1a\x52\xca\x35\x86\x06\x5b\x32\x6d\xdf\x82\xc9\x36\xf6\x35\xb8\x6a\x8d\x64\xb2\x51\x3f\x14\x62\x83\xa8\x2e\x03\x00\x3a\x5e\x2d\x14\x72\x6a\x5f\xfd\x08\x95\xcc\xad\xc1\x6f\xdd\x57\x2e\xa0\x85\x6f\x2f\x76\xb7\xb2\x54\xc6\xd0\x07\x7f\xc4\x13\xe8\x56\xf4\x7b\x34\x8d\xf6\xc5\xee\x29\x6d\xff\x9f\xf7\xa7\xfb\x7c\x3c\xbf\x3e\xf9\xc3\xa0\xdf\xf0\xf3\xc0\xfd\x7f\x76\x7a\x56\xc7\x7f\x9f\xbf\x3c\x7f\xba\xff\xbf\xc9\xcf\x78\x7e\x2d\xc7\x85\xaf\xfa\x27\x8f\x61\x45\x74\x7c\xfc\xf7\xcb\x13\xe0\xe3\x39\xd9\xab\xb8\xec\x98\x8b\xf5\xd8\xfe\x11\x9d\x22\x3d\x8e\x37\xaa\x53\xaf\x70\x6d\xc1\x27\x7f\x7d\x99\xab\xa8\xd7\xb1\xb6\x40\xbc\xc3\x6b\xc0\x46\xee\x8a\x95\x3c\x9e\x73\x41\x98\x4a\xb0\x8d\xbe\xeb\x16\x56\x7f\xc9\x7b\xaa\xbf\x9a\x81\x11\xaf\xca\xf5\x2b\xaa\xc1\x9a\x0d\x42\x8e\x90\xbc\x10\x75\x96\x15\xcc\xbd\x40\x74\x7c\x97\x56\x01\x9f\x8f\x3f\x68\xb5\xe1\x31\xc6\x96\x40\x53\x0c\x87\xe4\x28\xd6\x32\xd5\x47\xb6\x91\xac\x00\x84\xf2\x04\xe0\x48\x33\x39\xc9\xd3\x41\xfd\xdf\xee\xa7\xfb\xfc\xfd\xf5\xf8\xe2\x8f\x25\x80\x78\xc8\xff\x3b\x3f\x6f\xf0\x3f\xbc\x78\xf5\x54\xff\xf3\x4d\x7e\xde\xa7\xba\x2a\x4a\xa0\x6f\xf6\xce\xee\xb1\x2b\xe4\x74\x15\xd7\xf2\x2f\x75\xaf\xe1\xa7\x07\x0f\xfc\xdf\xe3\xbc\xaf\xf3\x16\x3c\xea\xfc\x47\xc5\x86\x7a\x83\x7d\x2a\x29\x5b\x0b\x12\x39\x93\x78\x51\x54\x1e\x0a\xad\xfe\x6d\x71\x4f\x55\x8a\x7b\x30\x85\xbf\xcd\xbd\x11\x56\x07\x79\xef\x31\xb7\x07\xc7\x18\xff\x52\xaf\x27\xf9\x49\xfe\x05\x38\xb7\x90\x2d\x83\x39\x20\x7f\x92\x87\x2f\xae\xfb\xca\x96\x5b\x2e\xae\x7b\xca\x98\xc5\xa1\x8b\x4b\x76\xdb\x1a\x6a\xe9\xad\x5a\xef\x2e\xf1\x6b\xee\x2e\x79\xcf\xdd\x25\xee\xbb\xbb\xda\xda\xe7\x64\x77\x7b\xa3\x91\x1f\xc4\xfc\x30\x9c\xbf\x27\xf1\x5e\xc4\xe6\x7b\x95\x07\x7e\x51\x89\xf9\xda\xfd\x31\x50\x42\xf8\x8b\xde\xf8\xc2\xe2\x97\xdb\x4a\x41\x5a\x5a\xd7\xac\x9b\xf7\x98\x5e\x1f\x28\xfd\xa8\x55\x7e\xc8\x83\x95\x1f\xe2\xeb\x2b\x3f\xe4\x81\xca\x0f\xf1\xab\x2b\x3f\x64\xad\xf2\x43\xdc\x5b\xf9\xf1\x64\x85\x7c\xbb\x9f\xee\xf3\xde\xd5\x75\x6f\xf6\x67\xfa\x7f\x2f\xcf\x4f\xeb\xfa\xef\xe7\x2f\x5f\xbf\x78\xba\xff\xbf\xc5\x4f\xa3\xc8\xf7\xb5\xec\x2d\x8d\x83\x02\xa7\xf5\x15\x0a\x01\x5f\x93\x10\x70\xaf\x64\xca\xfe\x65\x8a\x84\x07\xc7\x47\xbd\xee\x55\xf7\xba\xdb\xeb\xce\xba\x47\x9d\xae\xb8\x66\x6a\x1f\x2b\xf7\x8c\x81\x58\xc8\xc6\x6a\x4c\x5d\x02\x31\x9e\x4a\x0e\x05\x93\x7b\xa8\x6f\x79\xf2\xa0\xc0\xa5\x83\x50\xfb\x45\xae\x81\xbb\x29\xfc\xb0\x28\x82\x04\xf1\x16\x06\x43\x05\x02\xd0\x36\xee\xba\x48\xf3\x18\xb9\x12\x37\x3a\x6a\x31\x32\x84\x57\xd8\x1a\x2f\x97\x6a\x5b\x31\xc4\x3a\x8c\xcf\x5d\xfb\x92\x1e\x2b\x5f\x68\x2a\x5e\x15\x25\x04\xab\xd3\x22\x57\x89\x88\x97\x95\x1b\x0e\xed\x3f\x13\x63\x83\x96\x22\xf3\x61\x6e\xa9\x1f\x84\xf8\x57\x39\x55\xfe\x5d\x0f\x91\x43\x3f\xe0\x08\x71\x3c\x1b\x03\x3e\x54\x7a\x8b\xc0\x56\x91\xa5\x08\x96\xf6\x49\x70\x89\xa5\xdb\x33\x08\x8b\x15\x33\xef\xef\xbb\x6d\x2d\x48\x73\x7f\x54\xb9\x05\xbe\x84\xe7\x81\x46\x08\x1a\xd2\xaf\x6c\x04\x03\x20\x43\x7b\x92\xca\x9e\x09\x88\x65\x09\x41\xac\x91\x61\x61\x98\x7e\xe3\xa1\x3f\x87\xe4\x6a\xeb\x7c\xb2\x55\x41\x84\x1d\x9e\x3a\x6d\x55\x78\x5c\x34\x91\xb3\x44\x75\x24\xb7\x71\xa5\x72\xf3\x1f\xf0\x01\xa9\xd5\xb2\x54\x95\x0e\x05\xb2\xdb\xf9\xa7\x8a\x95\x74\xfb\x8d\x89\x1e\xed\x56\x2b\x4a\x6d\xa5\xb1\x03\x4a\x4c\x22\x66\x36\x0b\x3a\xcd\x71\x03\x30\xb9\x24\xc7\x4a\x44\xf0\x68\x99\x03\x89\x72\x20\x1f\xe4\x5e\xe2\x68\x4e\x6c\xd9\x38\xe5\xf1\x21\x9c\xdd\x9a\x0f\x97\xbf\x26\x1f\x2e\x0e\xe5\xc3\xc3\x81\x20\x16\x52\x6e\x1f\xb0\x45\x7a\x88\xe5\x2e\x51\xd6\x34\x66\xef\xb6\xf8\xac\x4a\x8f\x04\x26\x8b\xef\xb4\x87\x3e\xac\x60\xff\xf6\xe3\x2c\x5d\x15\x65\x9e\xc6\x08\xd9\xaa\x95\xb7\xfb\x42\x19\x4e\x42\x78\x57\x56\xc4\x6e\x96\x9a\x95\xd4\xbe\x5a\x7f\x08\xcd\x9e\x7a\xa9\xb4\xd7\x3f\xe4\xac\x1a\xcf\xa7\xc3\xb7\x37\xf3\xc9\x74\x26\xfc\x84\xff\xc3\x89\x7e\x5f\x32\xa2\x56\x25\x2d\xe6\x93\xc7\x24\xfa\x1f\x5d\x2e\x1d\x09\xaa\x97\x3e\x09\xaa\x56\xa1\x10\x97\x4b\xc4\x2f\xda\xcc\x63\xd7\xdb\x08\x7a\x14\x74\x77\x02\x85\xb5\xf6\xdf\x8f\x22\x9c\xf2\xb5\x12\xd8\xac\x76\xca\x08\x20\x67\xd1\x6e\x58\x1f\x1f\x1e\x2d\x60\xf4\xba\x9e\x4e\xfa\x37\x53\x5b\x8d\x3b\xbb\x79\x4b\x95\xf6\xe2\xdd\x64\x72\x31\xc3\xc2\xca\xe9\xcf\xc3\xfe\x60\xf6\x63\xb3\xec\x3a\xf2\xac\xef\x1f\xcd\x7f\xbf\xbd\x99\x0d\x61\x48\x87\xe3\xf9\x60\x3a\xbd\xb9\x36\xf6\x72\x47\xbc\x9f\x7c\x00\x63\xbe\xdf\x83\x82\x55\x33\xaa\x24\x11\x41\xe2\x10\x93\x4b\x57\x5e\x1c\x98\xf1\xce\x72\x37\x23\xd6\x9f\x0b\xef\x63\x13\x34\xdd\xbd\x3e\xb6\x15\x76\x7f\x18\xce\x06\x1d\x6b\xd2\x0f\xf1\xb5\x1f\x7a\x1f\x85\x95\x8f\xf0\x78\xc8\x02\xc7\x89\x35\x23\x0e\x2b\x44\x48\x52\x88\x10\x38\xdc\x4f\xb6\xfe\x9f\xfc\xd3\x7d\x3e\xb9\x1c\x9d\x9c\x75\xcf\x4e\xa6\x97\xe3\x3f\xc8\x0b\x78\xa0\xfe\xf3\xf4\xc5\xe9\xcb\x3a\xff\xcf\xd9\x93\xfd\xff\x6d\x7e\x42\xfb\xff\x2f\x89\x31\x45\x7f\x8a\xe4\x5f\xea\xa8\xb7\x9f\xe4\xf1\x5f\x6e\xa6\xa3\xff\x5b\x6d\xe2\x34\xfb\xa9\x13\x09\x44\x41\x4f\xc9\x6e\x97\x97\x45\x5e\xc9\x71\xbc\x51\xf2\x2f\xcd\xdf\xfd\x44\x24\x6f\xf0\x0b\x9f\x3f\x86\xb9\xaf\x3d\xae\xb0\xd9\x70\x84\x05\xa9\xf0\x61\x4b\xa6\xce\xf8\xdd\xb3\xee\x59\xfd\x3e\x47\x38\x43\xca\x12\xf4\x11\x13\x9e\x41\xce\xda\xe5\xb6\x51\x1b\x58\x5e\xf6\xfe\x26\xe3\xca\x52\xe1\x11\xde\xb2\xab\xd3\x0c\xf8\xf0\x26\x97\x23\x01\x4d\xb8\x1e\x8c\xe5\xe5\x64\x3c\x77\x4c\xb8\x5e\x13\xe4\x89\x3c\x7f\x2d\x2f\xd5\xa2\xdc\x19\xeb\xf6\xfc\xf4\xf4\x8d\x10\xd7\xd3\x41\xef\xea\xed\x68\x80\x85\xb2\xb7\x05\xb0\xce\xad\x1c\x01\x9a\xdf\x21\x79\x3c\xb9\x1c\x75\x50\x27\xbd\x90\xba\x4a\x81\x4c\x4f\x39\x69\x7f\xbf\xac\x53\x80\x0d\x9c\x65\xf1\xa2\x28\x91\xb9\x73\x55\x80\x9a\x6e\x61\x2c\x11\x1d\x61\x69\x12\x82\x6e\xd1\x57\xc8\x2b\x04\x84\x00\xe2\x79\xb5\xc2\x24\xfd\x4a\xc6\xe0\xd9\xa5\x4b\x41\x90\xc9\xdb\x1d\x17\xce\x62\x4d\x8b\x0b\x86\x16\xd2\x41\xd3\x01\x14\x00\xa5\x0c\xa6\x17\xab\x32\xde\x28\xc6\x3e\x00\xc0\x5d\x98\xf7\x59\xc6\x6c\x80\xf1\xa0\xb6\x42\xba\x31\x0f\xc1\x68\xe5\x36\x2e\x2b\xe6\xf0\x73\xf8\x5c\x4d\xf4\x8d\x93\xcb\x91\x8c\x8d\x83\x13\x08\x6d\x24\x12\x9f\xec\xa0\x12\x91\xd4\xd5\x2e\x81\xfa\x2a\x0b\x98\x40\x12\x3d\x9f\xe5\x74\x85\x85\x36\xb1\x96\x80\x50\x8d\xa9\x4c\x05\xa5\x0e\x2a\x84\xa2\xa2\xc9\xb7\xd1\x2a\xfb\xac\x34\x62\x13\xe1\x65\x3e\xff\x52\x9c\xef\x45\x8d\x2a\x56\x47\x92\x38\x06\x17\xbb\x3c\xc9\x4c\x43\xd4\x66\xa1\x12\x40\xf4\x07\xad\xb0\x6c\x4b\xe6\x6d\x40\x7f\x0e\x65\x76\xbc\xf8\x6b\xc0\x95\xdc\x69\xce\x53\xd1\x01\xb7\x96\xa1\x4c\xf5\x86\x74\x85\x6d\xb3\xac\xd5\xc1\x79\x32\x44\xcb\x38\xa7\xb0\x31\x89\xdf\x30\xc0\xc4\x59\xf6\xd5\x7e\x0b\xd6\xbf\x75\x60\xe7\x6b\x5b\x2f\x05\xc8\xaa\x55\x51\xba\x89\x20\xd6\x49\x4f\xf3\x84\xb7\x21\xcb\xaa\x0a\x2c\x8c\x21\x96\x2d\x5b\x20\xce\xf5\x77\x48\xcb\x5c\xd9\xb6\x63\x95\x53\xea\x13\xd3\x9a\x55\x71\x31\xb8\x1c\x8e\x81\xb5\x64\x26\xc4\x51\x70\x70\xd4\xcb\x07\xb5\xaa\x5c\x99\x9f\xed\xe6\x81\xa2\xc1\x63\xdd\x11\x2d\x8d\xf7\x51\xfb\x98\x9b\x65\x95\x53\x3a\xba\xcc\xea\x66\x02\x64\x2e\x56\x02\x26\x5c\xb1\xd8\xa5\x59\x12\xe0\xb6\x03\xf7\x13\xeb\xe2\xea\x27\xa2\xdf\x07\xa8\x73\x80\x39\x77\xd2\x19\x2c\xb1\x1a\xaf\xaa\x06\x1a\x1b\xbc\x39\xf3\xfc\x63\xa8\xb1\x3c\xb2\x7a\xc1\x2d\x15\x8b\xcd\xf2\xca\xf0\x0c\x06\x71\xd5\x1c\xea\x44\x62\x2d\x1e\x51\x74\x49\xef\xbc\xe2\xdd\xd7\xf2\x4e\x98\x76\xb7\x5a\x81\x8a\x7f\x81\x22\x1f\x90\x92\x88\x64\xa2\x32\x55\x01\x49\x77\x51\x0a\x28\x46\x4e\x2b\xac\x28\xfc\xff\xfe\x9f\xff\xd7\x02\xe6\x10\x3b\x87\x38\x3a\xf3\x7b\x2f\x92\xe2\x35\xbb\xae\x57\x4c\x0d\x8a\x00\x81\xb8\x8e\xf3\x5b\x28\x71\x00\xf1\x5e\x58\x6c\x8b\xbd\xe4\xf4\x0c\xf0\x5e\x06\xc3\x61\x5a\x2f\x73\x75\x27\x55\xfe\x39\x2d\x8b\x7c\x83\xb8\xb6\x23\x14\x41\x6e\x76\x12\x04\x5f\xca\x48\x2a\xf3\x1a\x65\xfe\x8b\x10\xf7\x1b\x90\xf3\x55\xcb\x35\x2a\xa3\x1a\x0f\x16\xc4\x5e\x48\xab\x93\xb8\xe7\xa0\x48\xdb\x0b\x94\xd1\x84\x05\x6d\xea\x0a\x71\x3d\x98\x12\xbb\x8d\xfc\xbf\x1c\x9b\xcf\xec\xb7\xf1\xde\x59\xaa\x3b\x62\x34\xe3\xca\xb8\xe0\xe5\x91\x4d\xea\x99\x73\x77\x6f\xa3\x6b\x48\x32\x07\x27\x9f\x83\x76\xf8\xc7\x1f\x62\x38\x01\xb2\x17\x1c\xd4\xbb\xdc\xfe\x33\x2c\x00\xac\xbd\x36\xf4\xb2\xc5\x21\x12\xb9\x8e\x1c\x7b\x71\x8c\x70\x2e\x73\x8e\xa7\xac\x20\xc7\xe8\xa4\xd5\xbc\xd5\x03\x31\x40\xbb\x74\x8a\x52\xd6\xd7\xb5\x8e\x82\x02\x86\xc5\x9e\x4b\x53\x84\x38\xef\x38\xa5\xee\xb6\x6f\xb6\xf6\x8c\x9f\x66\x6f\x8f\xf0\xe6\xaa\xdf\x19\xd2\xbf\x33\xea\x69\x4e\xac\xa2\x2b\xb6\x18\x01\x02\x72\x8c\xfb\x32\x9f\x9c\xbb\xf4\xcf\x79\xad\xf8\x3a\xb3\x34\x79\x34\x9e\x28\xe7\x95\x27\x27\x71\x56\xe4\x4a\x00\xe1\x38\x51\x7f\xaf\x77\x9b\x38\x3f\x29\x55\x9c\x80\x5d\xb5\x56\x31\x30\x2b\xe3\x76\xad\x57\x8b\x6f\xe2\xe5\x3a\xcd\x95\xfd\xb8\xd8\xa8\x2a\x4e\xe2\x2a\x46\x44\xad\xb6\xbc\xe5\x40\xef\x5e\xda\x78\x21\x1c\xe6\xc1\x0d\x0e\xe5\x45\xf8\x1d\x6c\xb3\xf8\xff\xd9\xfb\x97\xdd\x36\xb2\x35\x5f\x10\xff\x8f\xd7\x53\x2c\x10\xf5\x87\x45\x20\x14\xb6\x24\x5f\x32\x9d\x07\x07\xc5\x94\x68\x9b\xb5\x65\x49\x45\x4a\x99\x65\x14\x0e\x70\x96\xc8\x45\x29\xd2\xc1\x08\x66\xac\x08\xc9\xdc\xa3\x1e\xf6\x9e\x76\xbf\xc0\x9e\x75\xb9\x1a\xe8\x79\xa3\x67\x5b\x6f\x72\x9e\xa4\xb1\xbe\xcb\xba\x44\x04\x25\xd9\xb9\x33\xab\x0e\xda\x1a\xec\x9d\x96\xc8\x88\x75\xfd\xee\xdf\xef\xa7\x95\xc9\xf2\x0d\xe0\xbe\x7b\x81\xd5\x18\xe8\x98\x3e\x18\xca\x93\xb2\xb3\x29\xdb\xf7\x84\x99\x55\xba\xa2\x1a\x35\x06\xd0\x41\xe9\x4f\x6b\xc8\xb1\xf6\x45\xa4\x32\x4f\x5c\xe8\x78\x0c\x82\x4e\x34\x2f\x48\x05\x37\x72\x82\x5e\x09\x9a\x57\xb1\xe1\x18\x40\x27\xb4\x13\xde\x48\xa9\xba\x41\x9b\xae\x20\x98\x5f\xca\xb5\x62\xac\xcd\x61\x97\xa4\x42\x3c\x1f\xba\xf6\x95\x1d\x33\xdc\xd6\xc1\x02\x7f\xc2\x2b\x83\x82\x2d\xf8\x6c\xb4\x32\xa2\x17\xd9\x90\x22\x7a\x49\x18\xe5\x73\xfd\x4e\x70\x62\xdb\xcb\xce\x51\x49\x01\xa1\x73\x5f\xf9\x4c\x40\x31\x2e\xe8\xfa\xc0\x98\x39\xf8\xeb\x06\x2d\x88\xfb\x80\x2c\x88\x7b\xb6\x27\x15\xe2\x05\xae\x4d\x4b\xd0\x38\x71\x04\x0c\x6c\xbe\x7d\xbf\x47\x09\x25\xdc\xd7\x1d\xe9\x49\xe4\xe4\xca\x37\x3d\x26\x11\x35\x40\xd9\x2f\xd1\x12\x86\x5f\x84\xcf\x0b\x6f\x87\xfd\x46\xfb\x4b\x38\x5a\xfb\xc7\xda\x5f\x6d\x35\x73\x6e\xd5\xcc\x09\x34\xff\xb4\x3c\xac\x4b\x3d\x2f\xad\x7d\x52\x34\x79\x0e\x73\xba\x29\xb3\x05\xf1\xf2\xbb\xe4\x06\x45\xf2\x7d\xa8\x9e\x0c\xd8\x95\xb6\x2a\xd4\x03\x44\x0a\x80\xee\x03\xd7\xaa\x37\xf4\xb9\x15\x0c\x52\xf6\x81\x41\x8a\x47\x83\x41\x62\x10\xeb\xbe\xe8\xe6\x83\x3d\x4c\x5b\xc0\x20\x7d\x95\x7e\x42\xc0\x82\x89\x70\x58\xfa\x49\x0b\x4b\xff\xb1\x30\x91\x3e\xc8\x29\x38\xc8\x49\x28\x91\x41\x05\x00\x3e\x37\x08\xf0\x05\x95\x0b\x27\x1f\xe4\xdb\xf1\xc9\x78\x1a\x06\x40\x45\x7f\x7c\x74\x3b\xbe\xe4\x83\xe5\x01\x02\xe2\x89\x31\x43\x31\x47\x0e\xdf\x4c\x4f\xdf\x27\xb2\x1d\x34\xb4\x0f\x0b\x60\x11\xed\xef\xf8\x40\x88\x10\xe6\x1f\x60\x2b\x99\x58\x78\x74\x3c\x39\x79\x3b\x63\xdc\xbe\xe8\xf0\x7c\x0b\x21\xfe\x96\x9f\xf4\xe9\xf1\xd9\xf1\xee\x5e\xfa\x6c\xff\xf7\x2b\x01\xb8\x3f\xfe\xb7\xff\xf2\xd5\x5e\x27\xff\xff\xf2\xf9\x37\xfe\xa7\x3f\xe4\xe7\xb8\x99\x5b\xed\x40\x00\x14\x6d\x18\x70\x7b\x2e\x50\x5e\x8f\x0e\x0f\x4f\xdf\x9f\x8d\x4e\x3e\xd8\x8b\x7d\x36\x3d\x7d\x3b\x1d\xbd\x8f\xc4\x36\x83\x01\x8f\xa5\xd5\x23\x33\x97\x1c\x38\xbb\xf8\xf1\x78\x72\xe8\xa2\x68\x3b\x03\xa0\x5d\xb7\x92\x73\x30\x4c\x99\xe6\x23\x01\xe2\x95\xd3\xa3\x8b\x43\x86\xd8\x74\xf9\x1e\x12\x38\xc8\x22\x8e\xaf\x0d\xc0\x8d\xc5\x74\x7c\x38\x39\x9b\x8c\x4f\xce\x9f\xcc\xec\x18\xc7\x67\xe7\x51\x4d\x91\x7b\x19\xf2\xd1\xee\xa5\x32\x0a\x2c\x48\x29\x07\x87\x81\x01\x42\x90\x2c\xaf\x81\xa7\x96\xd1\x74\x14\x32\xfa\xd1\x4a\x9d\x5b\xa7\xae\xcc\xcb\x2b\x6b\xa4\x4d\x8a\x79\x2a\x77\x06\xc7\x17\x87\x30\x9f\x24\x72\x45\xe5\x19\xfa\x82\xe0\x0b\xc1\xbb\xa4\x94\x97\x9d\xe7\x82\x19\x7f\x18\xa4\x2f\xf9\xa3\x52\xca\x2c\x75\x7c\x3c\x64\xe9\xf1\x33\x65\xf0\x4c\xfb\xc1\x2c\x75\x3d\x4c\xed\xcf\xfe\x20\x04\xa2\x05\x40\x44\x81\x9f\x47\xae\xc6\xb6\x2f\x49\x60\xf1\x51\x8b\x85\x77\x4b\xe9\x2f\xe2\x92\x18\x8d\x83\x31\x33\xd3\x22\xba\x5c\x65\x81\x84\x1f\xc8\x0e\xd5\xfe\xec\x13\x23\x2f\xf5\xb5\xca\x97\x89\x60\x83\x2e\x7c\x12\x1b\x71\xd0\x7f\x0f\x8d\x65\xe8\xa5\xb5\x71\x93\x88\xe3\x5a\x1e\x1c\x5a\x27\x15\xf0\x04\xd4\xbc\xd6\x55\xf6\xe7\x88\x50\x7a\xeb\x74\x95\x91\xe1\xce\x1b\x44\x59\x72\xe3\x60\x70\x1e\xdc\x5a\xc7\xcf\x82\xa6\x1a\xd4\x64\x6e\x3c\x17\xf3\x61\xe0\xc3\xab\xe8\xb1\x22\x5e\x3b\xfb\x92\x23\xb6\x01\xfd\x4b\x94\x9c\x3a\x8a\x62\x78\xa8\xb7\x13\x4d\xbc\xeb\x11\x8e\x8c\x68\x9f\x09\xae\xa6\x54\x18\x08\xae\x74\x69\x1d\xd5\xc1\x31\x87\x53\xcf\xb0\xf0\x00\x5f\x4b\x65\x08\x08\xfd\xc6\xb6\x1e\x78\x74\xd0\x66\x19\xee\x09\x61\x37\x56\x5a\x30\x55\xaf\xf5\xbb\xb2\x62\x59\x65\x00\xce\xe2\x5d\x2f\x68\xe4\x54\xb9\x66\xaf\x3b\x5c\x0b\x09\xae\x24\xf0\x95\x5d\x03\xaf\xe4\xea\x32\x2b\xc2\xfa\x8b\x60\x91\xda\x77\xc8\x63\x25\x05\xd8\x3d\x2d\x5a\x15\x5f\x56\xcc\x10\x22\x48\x0f\x9e\x19\x39\x72\x6d\xa2\x2a\x0e\x11\xe2\xf6\x86\x41\xdf\xa0\x64\x26\x89\xa0\x4d\xec\x85\x8b\xf9\xd7\xc8\x02\xb6\xe3\xed\x19\x66\x7b\x0a\x70\x86\xa2\x23\xd7\xb7\x5f\x10\x2d\xa4\xb3\xe0\x8e\x87\x6f\x43\x24\xa8\xa5\xe8\x54\x84\xce\xc0\xc8\x93\x31\xfb\x4e\x4a\xeb\xc3\x05\xdb\x69\x50\x16\xee\xa7\x08\xfb\x6c\x65\x25\xa2\x32\x83\xd4\x6b\x71\xbd\xc7\x4d\x88\xc1\xe3\xdb\x62\x2b\x0a\x3f\x19\x31\x0d\x38\xb7\xa3\xaa\xad\xc4\xe7\x38\xe2\xea\xae\xa0\x0a\x28\x20\xe9\x76\xe5\x42\x89\x58\x57\x7a\x8d\xc0\x90\x71\x24\x5c\x96\xcb\x24\x24\x0e\x37\xeb\x1c\x30\x89\xf8\x37\x44\x20\x1e\x72\x21\x10\x58\xe2\xa5\x67\x55\xd7\xf1\x51\x2d\x97\x1d\xb9\xc5\xdb\x4d\x40\x63\xf6\xaf\x7e\x24\x82\x92\x03\xbe\xa4\x8c\xcf\x4c\x74\x86\xa0\x4f\xb4\x8f\x52\xff\x0f\x5c\x66\xba\xf6\x3c\x75\x3c\x3c\x2c\x22\x04\x89\x08\x06\x26\x4d\x28\xfa\xa7\xf3\x3c\x41\x56\x75\x48\x36\xc1\x3f\x11\xc5\xd1\x83\x5c\x01\x6c\x54\x5d\xa9\xc2\x2c\x31\x20\x27\x1e\xbf\xa4\x8f\x5a\xb7\xf3\xeb\xce\xe8\x83\x90\x4b\x2c\xb2\x30\x72\x81\x29\x40\xf6\x87\x29\x72\x7c\x99\x15\x58\x18\xe6\x42\x0d\x45\xab\x42\x5e\xd5\xd1\xb3\x58\x4d\xf1\x7d\xcb\x96\xd0\x36\x0c\xfb\x06\x34\xb2\xed\xa9\x66\x86\x34\xa7\x0b\xa2\x07\x53\xc6\xb8\x3e\xe9\x21\xd9\x33\x06\x31\x57\xd0\xbd\x8b\xea\xda\x8f\x97\xa9\xc4\xcb\x1b\x00\xf3\xa2\x67\xb7\x85\x3b\xc6\x0f\x70\x99\xc4\x23\x97\x29\x8a\x1a\xec\x64\xc3\xa8\xee\xcb\xbd\xdf\x88\x88\x79\xa3\x33\xee\x04\x42\xae\xf0\x84\x6c\xd8\x96\x74\x4b\x7a\x5e\x2c\x87\x4e\x4a\x79\xad\xaa\x05\x66\xc4\x74\x25\x4d\x94\x15\xf6\x44\xcd\xc8\xf5\xee\x0f\xbb\xa7\x2b\x37\xdc\xf9\x8d\xc8\x78\xdd\xfb\x82\x17\x25\x4c\x2b\x82\xde\x6c\x2b\x27\x03\x69\xa4\x65\x59\xd5\xd7\xae\x4e\xae\x28\xa5\x32\xa6\xa9\x14\x94\xba\x46\x59\x3b\x22\x2e\x0f\x5e\x24\x5c\xdb\x08\x1f\x13\x17\x90\x61\x45\x89\x01\x3d\x3c\xc0\xae\x20\xb1\xb7\xd0\x4f\x50\x11\x61\x54\x82\x87\x56\x47\x2a\xc7\xed\x29\x32\x44\x9d\x41\xe6\xef\x8c\xdb\x2d\xea\xd2\x2f\x19\x74\xd5\xd0\xa7\x2e\x01\x01\xb3\xe6\x49\x44\x36\x8d\x6b\x16\xe7\x41\x33\x78\x72\x38\x4e\xe1\x0a\x12\x79\x9c\x01\xf7\x72\x2a\x47\x06\x72\x0a\x14\x09\x02\x7c\x9c\x4f\xba\x9a\x67\x2e\xf2\xe4\x39\xb6\xf9\x84\xfa\xe0\xa9\x27\xe7\xc6\xbd\xf4\x9b\x4e\x92\xcf\x6e\x09\x24\xcb\xca\x1c\xd0\x0a\xd6\x65\x61\x88\x8a\x4c\x80\x6c\x9a\x37\x95\x7e\xb0\x92\x92\x86\x50\x68\x0d\xa9\x5b\xd2\xe4\x11\x42\x81\xb0\xbf\xb4\x02\xb9\x5a\x10\x07\x77\x4b\xf8\x40\xf8\xd6\xe3\x4a\x42\x02\x3b\xb4\xe4\xc2\xc2\x64\x11\x19\x6a\x08\x6e\xe1\x3e\xfa\xc4\xb4\x26\x82\x35\xc6\xf0\x68\x3c\xdf\x3e\x12\xb7\x2c\xab\x20\x00\xc9\x2b\xea\x4d\xa7\x45\xcf\x01\x71\xdd\x39\x0c\x50\x8b\xe7\x3f\x84\xa0\x00\x3b\xd6\x34\xcb\x65\x36\x87\xc1\xfb\x74\x23\xad\x54\x56\x74\xee\x8c\x17\xdf\xae\x00\x36\x6e\x9b\x72\x15\x97\x7c\xb5\x04\x57\xd2\x3a\x0d\x87\xb6\xc8\x41\x2a\xa7\xe3\x7f\xbe\x98\x60\x59\xdd\x4c\x88\x51\x2a\x03\x3b\x99\x40\xc7\x00\x61\x2c\x5a\xd5\x58\x2c\x7b\x2c\x86\xc0\x24\x12\xde\xf6\x83\x10\xaf\xfd\xbd\x9d\x48\x79\x5b\xf8\xec\xaf\xd7\xb7\x51\x8a\xe5\x75\xe0\x61\xed\xa5\x76\x95\x90\xd2\x3c\x84\xc6\xed\x2b\xc7\xee\x2a\xf2\x1f\x00\x3a\x32\x5b\xc6\x03\x8e\x61\x6e\x5b\x3a\xd0\x49\x88\x5a\x15\x57\x19\xa0\x33\x80\x15\xa3\x44\x04\xc7\x18\x4d\x2f\x58\xb3\x27\x5b\xa6\x68\xdf\xea\x08\x66\x61\x16\x3e\x8f\x54\x46\xe3\xfb\x01\x7d\xcc\x03\x18\x77\x27\x72\xfd\x98\x77\x91\xb2\xe3\x08\xb5\xfb\x3d\xfa\xd7\x7a\xb9\xd4\x40\x0b\x99\x6f\x02\x11\x56\x16\xe4\x1e\x82\xf0\x6b\x59\xae\xf0\x0b\xea\xf8\xca\x74\x9b\x70\x37\x71\xbd\xcd\x54\x7d\x92\x53\x28\xdf\x11\x6a\xf9\x6f\x62\xc9\x70\xb8\x5f\x59\x4d\x20\xda\xd6\x8e\x0a\xa5\x5f\x12\x3e\xee\xde\x67\xac\x74\x65\xfd\x4d\xee\x77\x83\xa7\x2d\xb3\xba\xb0\x43\x82\x56\x37\x90\x23\xd9\xbc\xc9\x55\xc5\x3d\x6f\x3f\x80\x39\x18\xae\x05\xd8\x70\x80\x6a\xfd\xe0\x52\x78\x59\x6f\x1f\xbf\x50\x2b\x75\xa5\x4d\x22\xfc\x8c\x17\x59\xa5\xe7\xe0\x0c\xf0\x7f\x41\x8d\x81\xca\x61\x59\xb2\x85\xf5\x65\x72\x3e\xbd\x46\xff\xda\x10\xbe\xbc\x7b\x14\xd3\x79\xe7\xa5\x81\x8a\xa3\x65\x56\x1b\x3a\x18\xf3\x14\x0b\xcb\x8d\xaf\x61\x81\xdb\x83\xd9\x4f\xb4\x15\x10\xf1\x30\xa8\xf5\x0e\x3c\xb1\x4a\xa3\x45\xa9\x17\xe2\x72\xd3\x63\x75\x81\xb7\x88\x1b\xd2\xd2\x55\x20\x8d\x53\x21\x7e\x24\x59\x17\x89\x8a\xc6\xd4\x5b\xa8\xaa\x01\xa0\xdf\xce\x73\x9d\xcd\x81\x65\xd3\x11\x0f\x67\x45\x28\x9f\x5f\x47\x1c\x75\x87\xd0\x16\x73\x90\x6c\x0f\x00\x39\x0b\xd8\x60\x4f\xcb\x14\x25\xe6\xd4\xf7\xb4\x1c\x02\xce\x39\x1b\x7d\x3d\x56\x3d\x8e\xda\x6e\x07\x22\x13\x43\x34\x45\x45\xfe\x6e\x0d\x25\xf9\xa2\xe3\x55\x23\xed\x80\x2a\x0a\xa4\x37\xad\x3d\xc4\xe3\x86\x6b\xaa\x4c\x73\x49\x7b\xeb\x75\x0e\x5a\x41\xfc\xc6\xce\x7b\x3a\xd6\x9d\x9d\x9a\x29\xb7\x0c\x5d\x78\xe6\x74\x4c\x06\x2d\x82\x86\x0d\xe0\x5f\xe7\x30\x4c\x45\x14\x12\x14\x57\xba\xd4\xad\x80\x49\x2a\x4e\x8b\x79\xfb\x97\x58\xe2\xe7\x62\x2c\xa0\x3f\x19\xa0\x08\xfc\x66\x2c\x93\x81\x2a\xa7\x9b\xf2\x23\x2c\xb9\x94\xf2\x79\x0a\x4c\x3d\xe3\x29\xb0\x69\x85\x11\x45\xbb\xc1\x0c\x45\xe8\x45\x5b\x59\x51\xd3\x4c\x90\x17\xc6\xae\x1c\x60\x36\x55\x59\x11\xab\x69\xd6\x03\xc2\xfe\x96\x9c\x39\x8d\xcd\x45\x95\x49\xe4\x65\x63\x32\xb8\xfa\x5c\xfb\xe6\x1c\x89\x3c\xfb\xa8\x53\xf9\x33\x30\x50\xd4\x71\x29\xa3\x08\x57\x67\xa9\xe6\xf6\x3d\x9e\x53\xc3\x8d\xb9\x31\xba\x25\xad\x13\xee\x8b\x71\x06\xe9\xed\x75\xe9\x49\x6a\xdb\x8a\x32\x7c\x98\x07\xa4\x5c\xea\x0a\x62\x20\x48\x45\x0e\x84\x7e\xf6\x6e\xb8\xf3\x45\x97\x9a\x0d\x5b\xea\xae\x5a\x97\x35\x89\x8d\x58\x1e\x45\xb6\xbe\x75\x4b\x2a\xb0\x5e\xc8\xb0\x0a\x2f\xed\x57\x0d\x13\xb5\x8b\x08\x9f\xb3\x33\x08\xf6\x35\x0c\xb4\x0d\x9d\xf5\x68\x0f\x2a\xb8\xb7\x0b\xbd\xd4\x05\x15\x2a\x16\x0b\xbd\x2a\xb2\xe5\x46\xe8\x1b\x5d\x45\x66\xbd\xdc\x19\x4c\xe8\xaf\x56\xfa\x87\x11\xc2\xa1\x54\x57\x2a\x2b\x0c\x8a\xbe\xbc\x34\x80\x22\x4b\x92\x53\xa0\x4c\x35\xb5\x91\x3b\x5c\x80\x05\xd2\x7d\x70\x0c\x1f\xb4\xdf\xae\xd0\x22\x06\xe1\x88\xda\x2f\x81\x1e\x94\x26\xab\x03\xec\x68\x91\xeb\x2b\x2b\xa3\x09\xfb\x35\x34\xde\x23\xe3\x94\x07\x63\x97\x70\xcb\x90\x39\x60\xa8\x3f\x61\xe4\x4f\x05\x38\x69\x12\xda\xd1\xec\xdd\xa7\x94\xb9\x09\x3c\xf6\xbe\x35\xb5\xb6\xdc\xbc\x2c\x0a\x8a\xc3\x22\x4a\x6d\x6d\x7a\x1b\xce\x1f\xd8\x52\xc1\x5b\x8a\xce\x6b\x79\x99\x67\x57\xca\xb5\x90\x61\x8f\x10\xbd\x86\x81\x4b\xc3\x1c\x37\x5b\x0e\x95\xc4\xb5\x15\xd0\x3b\x4f\xfd\xef\x80\x24\x8c\xc6\x3f\x28\x95\x5c\x5f\x11\x81\x49\xd7\x29\x08\xb5\xbe\x67\xa6\xb0\xab\xf6\x6b\xa3\x72\xc2\xaf\xd9\xb6\xb8\x20\x08\x5f\x4b\x05\xf0\xb2\xab\x75\x9d\x83\x7c\x62\xe1\xea\xd7\x50\xc4\x07\x1f\x8a\x15\x88\xcf\x04\x3d\x7e\x3b\x1b\xb4\x39\x2e\x87\xe4\x54\xc4\x4f\x88\x76\xa1\x2e\x99\xf7\x86\xb0\x87\x4b\x3b\x19\x07\x83\xbb\xfd\x9b\xd2\xba\xb8\xd0\xf6\x66\x2f\x82\x41\xdb\x07\x0b\x51\x11\x79\xc0\xe8\xba\xce\x51\x57\x17\xfa\xaa\xac\x33\xa2\xa4\x81\x3d\xda\xba\x08\x6a\x43\x46\x4e\x66\xbd\x25\x41\x46\xb9\x9f\x99\x54\xb5\xb3\xbf\xf5\xa7\x35\x94\x3c\x20\xa7\x8a\x43\x86\x8b\x65\xc3\x8a\x18\xd3\xbd\x46\x7f\xec\x69\x4a\xec\x27\x41\x64\xfc\x8b\x1d\xb4\xaa\xe3\xe9\x83\xb4\x29\x40\xd5\xf4\xad\x4f\x2a\x27\x4b\x41\x56\x49\xef\xfa\xc1\xb7\x11\x01\x61\x1d\xf4\x7c\xf2\x4d\x06\x35\x0a\xe5\x82\xde\x64\x14\xbc\xb6\x75\xe9\xc7\x96\x50\x71\x53\xf7\x21\x08\x7d\x11\x98\xbb\x9c\xc4\xe9\x3f\x4d\x5d\x37\x12\x6c\xa8\x54\x5e\xf8\x00\x31\xdd\xa3\xe4\xbe\x23\x75\x0b\xd2\xff\x5a\xdd\xe8\x40\x4e\xf2\x88\x02\x29\x13\x99\xa3\xc1\xcc\x3a\xd3\x11\xbd\xd3\x21\xbb\x1a\x29\x55\x9b\xaa\x96\x8e\x45\xa5\x15\x5a\x81\xa2\x23\xb5\xc1\x7a\x6c\x14\xaf\x88\xa4\x8c\x58\x85\xf7\xcd\x05\x0d\x2b\xfb\x65\x1c\x14\x7d\x1d\xed\x83\x17\xc0\x31\xe9\xb8\x46\x05\xd1\x9a\x8e\x66\x5c\x5c\x72\xfc\x41\xce\xc6\xe7\xf2\xcd\xe9\xf4\xfc\x1d\xd6\x1e\x84\x29\xc5\x24\x4a\x4a\x86\xb9\xd0\xd3\x13\x31\x3a\x71\xa8\xbc\x3f\x8e\x66\x93\x59\xa7\x9c\x65\x82\x15\x1c\xbe\x9c\xb3\x55\xde\x32\x41\x2e\xc8\x4e\x95\x8b\x7c\x00\xb5\xb7\x5d\xe6\xd2\x7a\x85\x38\x9f\x9c\x1f\x8f\x93\x4e\x8b\x5e\xd2\xae\x86\x81\x12\x8c\x87\x30\x7d\xc5\x38\x0e\xd1\x64\x18\x96\xc9\x37\xfe\x20\xa2\xdf\x2a\x17\xda\x3a\xca\x84\x4a\x12\xd7\x08\x82\x8d\x54\x2e\x05\x56\x26\x45\x80\x31\xad\xf0\x06\x73\x33\x40\xfc\x47\x41\xf7\xb8\xf9\x68\x42\xb6\x06\xd6\x42\x82\x22\x4e\x60\x25\x51\x04\xe3\x81\x34\x09\x20\x60\x5a\xdd\x02\x74\xcb\x2e\xed\x29\xe8\x1d\x4e\x9d\x97\x4b\x2e\xf2\x95\xba\xaa\xa0\xe7\x16\xa3\x02\x3e\x37\x49\xc4\x51\x76\xee\x56\x9f\xb3\x51\x20\x10\xb0\xdb\x5a\x0a\x40\x44\xa5\x6a\x95\x04\x10\xdd\x88\xff\xbe\xf6\x2e\x67\x53\x50\xf7\x0a\xa1\xa7\x60\x2c\xab\xaa\x9a\x35\x87\xaf\x51\xd4\x53\xfa\x52\x4a\xf9\x32\x6d\x11\x02\xbb\xd2\xa0\xaf\x38\xdd\x27\x74\x06\x5d\x8a\x5d\x9e\x60\x21\x92\x08\x9b\x33\xa9\x84\xe9\xdd\xe8\x27\x24\xff\xf4\x9c\xa7\x8f\xea\xcd\x14\x3d\xbd\x99\xdb\x41\x4f\x82\xbe\xc5\xee\xd9\x17\xc7\xa7\xb3\x73\xee\xad\x1c\x26\xf2\xef\xd0\x42\x29\xb0\x85\x52\xfe\x5d\x5a\x28\xc5\xcf\xa3\x0f\x3d\xd5\x50\xf7\x55\x3a\x9c\x62\x45\x05\x91\xb6\x8e\x59\x44\x50\xba\xae\x8f\xb5\xf5\xd1\x0d\x98\xbc\xa6\x78\x70\x5e\xa5\xf6\x54\xd8\x79\x11\x71\xa9\x08\x53\x4b\x64\x33\x5b\x5d\x18\xfc\x16\xfc\xf3\xcc\x74\xae\x7a\xfb\x36\xd8\x4b\x74\x51\xc0\x95\x9a\x61\xbc\x40\x7f\xc2\xcc\xd1\xc2\x0a\x04\x53\x13\x91\x5c\xa5\xaf\x9a\x9c\xcc\xbe\x1d\x76\x95\xe8\xa3\x4c\xed\x67\xaf\x93\xc0\x8e\x1f\xfe\x70\xbb\x4f\xbd\xb1\x7a\x03\xe9\xa7\xa4\x94\xdf\xa5\x5c\x05\x07\x84\x5b\x51\x90\xa2\x27\x86\x06\xc1\xb1\x1b\x95\x67\x54\x10\xaa\x8b\x65\x59\xcd\x35\x5c\x65\x6a\x9c\x71\x77\x5b\xe4\xea\x16\x5c\xd1\x20\x89\x02\x61\x1c\x18\x38\x3c\x84\xae\xad\x7b\x4a\x00\x83\xa4\xa9\x94\x73\x01\x4d\xe1\xe2\xde\x24\x60\x84\x80\xd5\x54\x58\xa0\x8d\xf6\x30\x19\xef\x60\x72\x69\xec\x01\xa8\x4b\x0a\xdb\xf8\x89\xba\x96\x77\xf0\xc0\x56\xbe\xa6\xc3\x6e\xc0\xaa\x59\xb1\x47\xc0\xe9\xfd\x8d\x23\x26\x04\x17\xcb\x3f\x08\x97\xc6\x8e\x27\x58\x19\xe4\x32\x0b\xb4\x40\x81\x0d\x1d\xd6\x30\xe2\x88\x79\x4d\x16\xbd\xf7\x99\xe2\x0a\x03\x7b\x50\xc8\x8d\x86\x2a\x61\xfe\x66\x20\x4a\xeb\xd2\xbb\xe6\x3b\x41\x97\x96\x9c\x57\xa5\x31\xbb\x68\x5d\x96\x74\x04\x74\x05\xff\x06\xfb\x93\x9d\x2a\xac\xcf\x29\x28\xe7\x1e\x86\xf2\x5b\xb5\xdb\xad\x48\x14\x31\x7f\x89\x56\xfe\xa9\x7d\x76\x70\x91\x51\xcd\x01\xdd\x90\x6b\x01\x58\xd8\x7f\x52\x28\x94\x17\x42\x64\x06\xaa\xdc\x17\xad\xd0\x50\xf6\xe5\x2b\x59\x6c\x04\x65\x6f\x1e\xbb\x2c\x32\x5a\x16\xf4\x8a\x50\xd7\xaa\x5a\x44\x26\x36\x46\xa2\x76\x30\x26\x89\x0d\x18\x3e\x21\xd8\x76\xef\x02\xe2\x0d\xde\x29\x51\x56\x2e\xc5\x37\x74\x0e\x16\x25\x37\xc3\x04\x08\xce\x6f\xc7\xf0\x26\x75\x3e\x80\x5a\x5c\xf0\x46\xe1\x16\x70\x15\xd0\xfe\xce\xe5\xf0\xab\x37\x40\x08\x88\xda\x75\xde\xf5\xb8\x6d\x46\x16\xb8\xa5\xca\x72\x03\x85\x48\x56\xfa\x6d\x7c\xf7\x06\x8d\x80\x71\x47\xf8\x92\x77\xc2\xcf\xad\xe0\x28\x14\x9b\x70\x98\xa5\x61\xbb\xdf\xbe\xa5\xa9\x88\x6a\x34\xa0\x72\x59\xeb\x2a\x2b\x17\x18\xc6\x5e\x69\xc9\xe1\xb0\x79\xb9\x82\xa3\x80\x1b\x41\xfe\x65\x51\x16\x5e\x42\x5b\x27\x07\x2c\xa9\xc7\xce\xde\xcd\x3b\xe9\x51\x10\xa5\x9c\x03\x2f\x61\x87\x28\xb5\x27\x14\xa0\xac\xa9\x68\x4f\xb1\x09\x02\x96\x62\x5d\x59\xb9\x06\xf7\x3d\x60\x7f\x09\x07\x17\x06\x07\x7a\x47\x48\x6e\x6c\x37\xb3\x78\xb9\x09\x6e\x56\x18\x22\x08\x87\x85\xbb\x6b\xd5\x4d\x56\x34\x9a\x4a\x3d\xaa\x9b\xec\xc6\x4a\x39\x2a\x06\x03\x1f\xb7\xb9\xcc\x33\x73\x0d\xcd\x62\x8e\x43\x32\xb8\x7e\x95\xa6\x40\xf8\xb0\x67\x77\x97\x55\xb9\x12\x58\x3a\x50\xc2\x8e\x51\x1c\x3b\x78\x18\x2f\x97\xff\xd2\x2d\xf1\x79\x5d\x65\x37\xe0\xb5\x2e\x90\x0d\xb3\xc9\xcc\x75\x56\x5c\x09\xfe\x5e\xd1\xac\x2e\xb1\xbb\xc4\x4f\x2a\x18\x57\x94\xf3\x1e\x62\x88\x33\xbf\x55\x1b\xd3\x6a\x4f\x68\xe3\x9c\x6c\x1d\x56\xc8\xee\x9b\xd5\xf2\x16\xf6\x13\xf9\xe0\x62\xc9\x26\xf0\x54\xaa\xfb\x67\x99\x19\x5e\x5a\xbd\x48\x3a\x91\x05\x9d\xe3\x90\xc4\x96\x14\x60\x30\xd1\x4e\x82\x7f\x18\x40\xab\x07\x43\x80\x22\x04\xa8\x4b\xa3\x3e\x32\x55\x70\xd1\xdf\xb5\x6a\x53\xf5\x22\xa6\x65\x2b\x83\x29\xc7\x0c\xb9\x23\x3a\x90\x3b\x59\xc1\x22\xca\xc8\xfd\x1d\x85\x3d\x2c\x20\xac\xa0\x5f\x22\x89\x4e\x24\x95\x76\x15\x25\xcb\xba\xb2\xf2\x0a\x8a\xf6\x61\x2b\x2e\x50\xdb\x67\xee\xf5\x76\xc4\xed\x35\x72\x4a\xb9\x81\x42\x9f\x24\xe4\xb6\xe6\x54\xd4\xa6\x4d\x5d\xae\xd7\x3a\x6f\x27\xf5\x3d\x58\x17\x16\xb0\x0a\x5e\x74\x2b\xa2\xfc\xc4\x63\xf9\xdc\x93\xf3\x09\xa0\xbe\xce\x3b\xc6\xd7\xa3\x20\x79\x4e\xf4\xad\xfc\x50\x56\x1f\x5d\x3c\xbd\xbf\x36\x21\xfc\x6e\x6c\x7f\x96\x4b\x39\x5a\xe9\x2a\x9b\xab\x54\x9e\x94\x14\x3f\x65\x50\x23\x37\x1e\x81\x37\xae\x42\x6d\x1a\x46\x61\xfb\x27\xb7\x2a\x31\x5b\x8f\x24\xae\x1b\xad\x2a\xdf\xbe\x8b\x35\x3d\xd8\x83\x8f\xca\xbb\x02\xbc\x4b\xb8\xf6\xf8\xfe\x5b\x05\xbb\x6f\xcf\xad\x87\x90\x52\xf2\x97\xc6\x5a\x63\xa0\x3a\x30\x96\x26\x30\xea\x01\xbc\xcc\x4e\x99\x7d\x75\x13\x44\xfa\x74\xa6\x8b\xc5\x4a\x65\xf9\xee\x77\xe9\xfe\xc1\xef\xd2\x04\xf0\x00\xfe\xdf\xab\x97\x5d\xfc\x8f\x57\x2f\xbf\xf1\xbf\xff\x21\x3f\xb3\xf1\xc9\xd1\xfb\xd1\xe4\x98\x0b\xf4\x09\x09\x81\x53\xa6\xae\x40\xb2\xaf\xca\x01\x82\xf0\x89\xc4\xe6\x48\xa1\xc2\x5e\x56\xb4\x4f\x83\xca\x84\xa8\xc7\x0d\x68\xa0\xa1\xff\x98\x71\xc0\xce\xaa\xb2\x5c\xae\xcb\xcc\x7a\x3b\x93\x62\x9e\x26\xe2\xbb\xef\xf7\xe5\xb4\x34\x46\xce\xea\x4a\xeb\x3a\x91\xb3\xa6\x28\x36\x37\x2a\xd7\x89\x3c\x1c\x25\xf2\xfb\xe7\xcf\xbe\xfb\x3e\x91\x17\xb3\x51\x42\x6d\xdd\xa0\x1c\xaa\xb2\xc8\xe6\xd2\x9e\x67\xa9\x6a\x69\xf8\x6c\xd3\x8b\xff\x71\xed\xde\x93\xce\xcb\x95\x55\xe9\x34\xa2\x73\x3b\xc1\xd7\x42\x5c\x18\x9d\x50\xff\x22\xe5\x86\xed\xa4\x63\x60\xbb\x50\xcd\xb4\x4d\x1c\x2b\x86\xb9\x8b\x50\x94\x55\x44\x57\x32\xbc\x07\x71\x50\x32\xaa\x70\x5d\x43\xfd\x55\xbe\xb1\x86\x25\x24\x5b\x09\x6d\xbe\xaf\x07\xda\x7e\x6b\xa5\xeb\xd7\xc0\xba\xda\x46\xdf\xa3\x9c\x85\xb5\xb0\x06\xcb\x4a\x6b\xc4\x4e\x28\x2b\x39\x00\x38\x92\x19\x0e\xc4\xa3\x2a\xa0\x50\x2b\x0b\xcd\x85\x91\x2d\xcc\xc1\xd7\x42\x58\x0d\xd6\x7e\x0d\x66\x4a\x17\x9a\x98\x54\x88\xd8\xef\x52\x6f\x4a\x92\xce\x11\xe5\x20\x22\xfa\x39\x14\x3e\xa2\x70\xce\xb3\x1b\x5d\x6d\x52\x21\xac\x66\xec\x7b\x01\x97\x74\x67\x5c\xc4\x18\xd6\xab\xd0\x4c\x0e\xa9\x6a\x06\x4a\x05\x44\x56\x55\xfa\xa6\x44\xcf\xd1\x15\xae\x7a\x50\x93\x6d\xdf\x5f\x5a\xd5\xb9\x46\x65\x50\x69\x14\xe3\x46\x38\x40\xe8\xd6\xf0\x65\x34\x7c\x39\xb3\xf6\x75\xd5\x1a\x3e\xf1\xa7\xe4\xe5\x2d\xfb\xee\x02\x6a\x6a\xc3\x52\xfe\xa4\x8d\x62\x12\xd8\x46\xe1\xe8\x70\x8b\x3c\x7d\x7b\x9e\x6f\x10\x64\x59\xad\xdc\x1d\x35\xad\x36\xef\x37\xd4\xea\x4b\xf5\x26\xa0\xfd\x5a\x6f\x1a\xe0\x3b\x84\x7d\x47\x58\xc2\x0e\x7e\x82\xae\xf1\x3f\x08\x46\x87\xd9\xf6\xe0\x1f\x51\xbd\xd2\xd2\x5d\x37\x70\x5f\x82\xa8\x2c\x12\x19\x52\xc1\x8e\x6c\x6a\x4e\x9e\x53\x27\x8c\xfb\x5a\x34\xa8\xb8\x7e\x3d\x6a\x7c\x40\x22\xde\x1e\xbc\xcb\x70\xad\xda\x78\x97\x3d\x4c\xbf\x08\x0c\x23\x3c\x76\x37\xdc\xb7\xe8\x38\x00\xe3\x2c\xd2\xe0\x47\xb2\x30\x71\xc6\x87\x27\x08\x7e\x0a\x91\x63\x57\x5b\xec\x93\xe1\xbe\xb4\x14\x09\x27\xd5\x55\xa5\xd6\xd7\xf2\x25\x02\x16\x21\x03\xef\x97\x63\x67\xfa\x1a\x95\x13\x07\xdd\xa9\x8d\x16\x5f\x32\x4e\xf9\x88\x71\x8a\x97\x0c\xac\xd4\x07\xaf\x29\xbf\x12\x5e\xb3\xef\x58\xd2\x84\xa3\x63\x60\x3f\x33\x68\x4f\xb5\x05\x71\x12\xc8\xc6\x5c\x15\x57\x8d\xba\xd2\xaf\xb9\xb9\x2b\x84\xb7\xda\xfb\xfe\xfb\xef\x76\xf7\x9f\xed\x3d\xef\xe8\x9b\x5e\x2c\xda\x01\x30\xe2\x9e\xb4\x90\x32\xed\x40\x3b\x5f\x2f\x68\x36\x17\x45\x06\x7e\x05\xda\xe4\x1e\x3b\xd2\x7e\x40\x20\xc8\x0b\x5e\xeb\xac\x05\xa9\x19\x00\x68\xf6\x13\x4a\x76\x00\x34\xc5\x6f\x22\x94\xf4\x34\x97\x03\xbe\x7e\x03\x91\x19\xa9\x3c\x6a\x69\xdf\x44\x81\x54\x16\xd6\xaa\x4f\xca\x85\xb1\x0f\xea\xed\x77\x8a\x6a\x65\x77\xd9\xd9\xf5\x7e\x9d\x44\xbc\x4e\x65\xe1\x6a\x6d\x18\x58\x89\x7a\x71\xd0\xc5\x9c\xb7\x4e\x42\xcb\x26\x81\x32\xe7\xb6\x1d\x52\x41\x28\x08\xcf\x08\x6b\xb1\xf6\xc1\xf8\xee\xbb\xc4\x1e\x8f\x03\x58\x97\xa9\xbe\x0a\xb1\x65\xb6\x6d\x6a\x2a\xfa\x11\x8c\xbb\x4a\x8c\x31\x87\xef\x85\x1c\xc6\xe8\x59\xe5\x36\x31\x52\x10\x82\x4a\xe4\xc9\x40\xe8\x12\x1e\xf4\x9a\x07\xa0\x9b\xc1\x3e\xd8\xc9\xba\x8a\xf5\xeb\x00\x82\x1f\xc4\xe6\xf5\x23\xf1\x22\xc7\xae\x4a\xd6\x33\x84\xdf\x0f\x21\xb8\x6f\x14\x7f\x5f\x7c\xe0\x9d\xcc\xce\xa8\x4f\x3c\xb4\x0e\x0d\x0b\x07\x77\xff\xad\x8f\x17\xde\x7e\xf1\xe5\xb7\xff\x1e\xf8\x5c\xf1\x18\x3a\xd9\x97\x69\x80\xa1\xfc\xf4\x38\x52\x08\xc7\xac\x10\x1e\x40\xa8\x65\xdf\x01\x98\x64\xbb\x28\xb5\xf2\xab\x51\x6a\x45\x1f\xee\xea\xa3\x51\x6a\x65\x40\xc5\x20\xb6\x43\x39\x3c\x08\x49\xeb\xa6\x67\x47\x96\x26\xd0\x06\x3d\x1d\xbf\x1d\x9f\x9c\xcf\x5c\x0a\xef\x64\xf2\xd3\x78\x3a\xa3\xb4\xda\xe1\xe8\x78\xf2\xe6\x74\x7a\x32\x19\x51\x06\x73\x0b\x62\xad\xf8\x2a\xc4\xda\xad\x59\x51\xf1\xd5\x88\xb5\xb2\x8b\x58\xdb\xa5\x8b\x78\x24\x62\x6d\x4f\xba\x55\x7c\x25\x62\x6d\x4f\xba\x55\x7c\x1d\x62\x6d\x27\xdd\x8a\x6d\xe1\xe2\x6b\x10\x6b\x5d\xc2\x54\xfe\xc3\x94\x82\xbb\xaf\xe5\x77\xe9\xfe\x81\xf8\x87\x44\x1e\x2b\x53\xcb\x66\xbd\x00\x73\xf7\x1f\x8e\x54\xad\x5f\x4b\x6b\x68\xec\x3e\xdb\xdb\xdd\x7f\x29\xf7\x9f\xbd\xde\x7b\xf6\xfa\xd9\x9e\xfc\x87\x44\x1e\x31\x22\xcb\xde\xc1\xf7\xdf\x3d\xff\x2e\xdd\xfb\x0f\xc5\xaf\x48\x9f\x9e\x1e\x1f\x8d\xce\x76\xf7\xd2\xbd\xdf\x0d\x00\xe2\x01\xfc\xd7\xfd\x83\x83\x83\x0e\xff\xef\x37\xfc\xd7\x3f\xe6\xe7\x9c\xd0\x49\xed\x21\x68\xa1\x40\x44\x88\xa7\x89\xdc\x7f\x21\x47\xcd\x95\x55\xd0\xd6\x8c\x0e\x0c\x28\xfb\xcf\x44\x46\x0f\x0a\x58\x76\x83\x8a\x78\xe1\x2a\xe2\xad\xf1\xa6\x5f\xcb\x36\x8c\x6b\x4b\xb7\x69\x39\x18\x55\x35\x42\x94\xd2\x98\x06\xd6\x92\x0b\xd3\x14\xbe\x79\x5c\x57\xae\xd5\x1a\xb2\x5e\xc7\xe4\x09\xa4\x72\x52\x1b\x76\x8e\x81\xc0\x1f\x9a\x0e\x28\x0d\x43\x75\x61\x94\x81\xef\xbc\xcf\xfa\x00\x31\xae\x2b\xd4\x67\x7b\xea\x78\x87\xaf\x94\x19\x44\x72\xf5\xc5\xda\xce\x24\x09\x53\x24\x8a\xc9\xe6\x59\xe7\x23\x74\x2d\x75\xca\x38\x6b\xae\x87\x74\x3e\x23\x8c\x37\x53\xae\xac\xcb\xbc\xba\xcc\x89\x62\x42\x28\x1e\x34\x57\x49\x94\x37\x64\x90\x04\x20\xb2\x6c\x97\xac\x99\xc3\xff\x16\xca\xcf\xaf\xb2\x1b\x2e\xb2\x82\xb2\x75\x11\x7f\x2c\xce\x7f\x74\xf2\x7a\x94\x7d\xa1\xcf\x62\x27\x42\x59\xe9\xdd\xb2\xda\x85\x98\xe0\xbc\x31\x75\x89\xf8\x65\xca\x5c\x43\xa0\x63\x9d\x37\xed\xac\x8a\xfa\x18\x05\x89\xda\xae\xfe\x91\x5e\x66\x85\xc3\xfc\x1b\xd0\xdb\xee\x47\xb9\x44\xfc\xb8\x47\xe0\x59\x26\xa2\x05\x9e\xea\x3a\x80\xfb\x1e\xc8\x20\x5a\xf5\x35\x54\x61\x03\x6a\x5d\xa3\xe2\xe8\x44\x2a\xc4\x60\x56\xab\x62\xa1\xaa\x5e\x78\x4c\xec\xa8\xf1\x8b\xb6\xe4\xee\x3b\xc4\x08\xd3\x85\xf4\x28\x64\x65\x25\xec\x5f\xa2\xdf\xf6\x81\x61\xd8\x99\xdd\x66\xe6\xda\xe3\x29\xb6\xe7\x89\xf0\x16\xf1\xef\x06\xf6\xd0\xde\x5e\x97\xda\x1e\x97\xcc\x80\x7d\xba\x90\x9d\x70\x09\xe4\xaa\x99\xbd\xc2\xda\xe9\x22\x38\x20\xf6\xb9\x1f\xca\x06\x1e\xb5\x29\x9b\x84\x08\x9f\x9f\x40\x2a\x24\x2b\x3e\x42\xf2\x04\x88\x2c\xed\x33\x88\x64\xb3\x55\xdf\x97\x19\x5e\x0d\x04\x4b\x0d\xc2\x85\xf8\x95\xa5\xd6\x34\x56\x55\xc3\x60\x37\x65\x03\x20\x80\xbf\x34\x06\x2a\xac\x29\x4e\x70\xa9\x4c\x46\x8d\x58\x8b\x4c\x89\x79\x69\xea\x44\x2e\x1a\x97\xdc\xa2\xe0\xa4\x49\x30\x4d\x5e\x2e\xe5\x5a\x97\xeb\xdc\x9e\xdc\x9b\x32\xbf\xb1\x2b\x0e\x09\xdf\x52\x02\x53\xe7\x07\x20\xae\xc6\xd2\x1e\x71\xa9\xa3\x66\x4f\x7e\x73\xe6\x32\xa4\x9d\x93\x05\x05\x85\x10\xc9\xf5\xbd\xe7\x6b\x98\xb3\x60\xc0\xe5\x8d\x54\xb5\xcc\x21\x60\x0a\x05\xad\x00\x3d\x4b\x18\x20\x04\x36\xa7\xf0\x26\x2f\xb5\x4e\x87\x42\x0c\xde\x20\xb6\xf1\x88\x61\xad\x7d\xb8\x0e\xc3\xaf\x44\x90\x87\x13\x5d\x40\x38\x13\x32\x64\xb5\xe6\x62\x0e\x28\x37\x6e\xae\xae\x05\x74\xce\x70\xe0\x61\xa9\x21\x1e\x87\xcb\x60\xcf\xc0\xb5\x2a\x16\x39\x8b\x06\xfb\x75\x20\x67\x83\x86\xfa\xe0\x8d\x95\x6f\x27\xa2\x83\x07\x6f\x6a\xd3\xa2\xdb\x65\xf2\xd9\x57\x88\x56\x06\xf2\x11\xd0\x99\x39\x69\x2c\xb3\x3a\x85\x70\xb6\xa3\x3a\xb7\xe2\xc1\x6e\x0b\xb0\x6a\xab\x5b\xb5\x91\x37\xba\xba\x54\x75\xb6\x6a\x61\x88\x32\x2e\xaf\xf5\x24\x7d\xce\x10\x2e\xa2\x88\x00\x20\xfd\x81\x73\xce\x76\x80\xc3\xd8\xc6\xd9\xb4\x87\x8d\x0f\x91\x96\x2a\xcf\x79\xaa\x0e\x88\xa4\x27\xb4\x88\x85\xaa\x1c\x00\xf5\x2e\x28\xc5\x2e\x79\x72\xd8\xc7\x70\xd9\x5c\xc9\x65\xf6\xc9\x1e\xcc\x75\x59\x39\xba\x3c\xf8\x95\x6f\x04\x89\x05\x63\x3b\x0c\xa4\x59\x7b\x1f\x21\xb5\x7e\x59\x79\x35\xda\x11\x06\xd6\x25\xa2\x05\x08\xc4\x0a\x35\xfb\x49\xbb\xc4\x58\x07\x61\x6a\x2a\x3a\x98\x97\x85\xc9\x16\x80\x3b\x10\x2e\x2b\xcb\x37\x0c\x61\xf2\xa4\x3c\x1a\x04\x25\xcc\x81\x1c\x3c\xea\x5a\x0d\x55\x46\xb1\xb1\x6f\x0c\xc8\xea\xdd\xaa\x67\x85\xd1\x55\x2d\x15\x78\xc1\x59\x01\x15\x6a\x18\xf5\xe1\x58\x2d\xf6\x95\x2d\x40\x3c\x83\xf2\xb5\x27\xf6\xba\xbc\xc5\x92\xb9\x6b\x5d\x00\xf3\x3d\x7f\x0a\x1e\x8c\x21\x5d\xfb\xf7\x9e\x6d\x2e\xe1\x42\x6a\x6b\xcd\x9f\x9e\x8c\x65\x3b\x11\xf2\x5a\x08\x35\x94\xeb\x5c\xcd\x35\x4e\x2a\xde\x12\x12\x9d\x9d\x8d\x08\x16\xc4\x1e\xe6\xfa\x5a\xaf\x24\x5e\x64\x31\xf2\x4c\xf4\xdc\x6a\x09\x08\xc5\x50\xdb\x81\xac\xf1\xf1\x3b\xea\x52\x5e\x18\x5d\xe8\x1a\xd1\x63\xa0\x66\xf8\x46\xe5\xba\xa8\x85\x95\x7a\x0d\xc2\x00\xd9\x21\xf2\xe5\x8d\xbf\x5f\x62\xbb\xe0\x2f\xf6\xdb\xd5\xfc\xda\xde\x29\x93\x71\x75\x94\x32\xb2\x69\x0a\x5d\xa7\x4d\x93\x16\xba\x4e\x04\xa5\x53\x5c\x1e\xa8\xcf\x34\xa9\x5d\x9b\xd9\x3d\x6b\xd2\x7f\x11\x75\x20\xf8\x09\x1f\x6b\xe8\xa0\x58\xdd\xc9\xe4\xc3\x02\xb2\x94\xf0\x62\xe9\x48\x55\xeb\x92\xaa\x47\xed\x32\x57\x57\xaa\x20\xfc\xa7\x54\x88\xf9\x50\x56\x1a\x21\x53\x8b\x0d\x74\xf5\x1a\x3e\xb6\xfa\x93\x9e\x37\xb5\x5d\x76\x6b\x4f\x05\xc1\x19\x6a\x2f\x9a\x97\xc5\x32\xcf\xe6\x35\x6a\x57\xfe\x9a\x08\xbe\xc6\xf1\x48\xcf\x8e\x7f\xe9\xe1\x21\xa2\xe3\x25\x95\x34\x7a\xad\x2a\x44\xc3\x2d\xa0\x6e\xc3\xda\x7f\x56\x34\xc3\x19\xde\x32\x32\xb2\x42\x08\x94\x9c\xed\x4c\x03\xa7\x3b\xab\xc9\x8c\x35\x54\x4b\xd4\x7f\x27\x71\x49\x17\x48\x31\x4d\x42\xa4\x15\x1a\xad\x14\xf5\x3b\x99\xb0\x5f\xa8\x63\x3b\x3c\xf7\xb7\xbb\x65\xfc\xf9\xfa\xf5\xee\xd5\x0e\x21\x5c\xa0\xc1\x87\xe7\x26\xb0\x95\xfd\x6b\x2f\x60\x30\x04\xd5\x99\x37\x7f\x27\xdc\x63\x4c\x5a\x5d\x56\x0e\x5a\x38\x91\x75\x79\x05\xa5\x30\xe8\x41\x64\x85\xa9\xab\x86\x0a\x75\x76\xe8\xcc\x06\xbb\xc5\xd5\xf9\x78\xd3\x86\x12\xc0\xbb\x35\x22\x86\x5f\xe9\xba\xf7\x88\xa7\x42\x5c\x0e\x3d\x18\x55\x27\x84\xe8\x17\xbc\x0d\x92\xcc\x9a\x2c\xbe\x23\x38\xd2\xee\x15\xc3\xa3\xee\xdf\x73\xef\x69\x0f\xe0\x72\x63\x7c\xe2\xce\x05\x8d\x0e\x7b\xe0\x26\x6c\x7d\x74\xf4\x07\xb8\x4e\x68\x5c\xb7\x8f\x30\x3f\x88\x1d\xb1\x39\x66\x02\x83\xd5\x36\x72\x27\x5e\xef\x7b\xb7\xeb\xbe\xbd\xf8\x5d\x2e\xc3\x0b\x7f\x19\x28\xdb\xad\xe2\x24\xb7\xb3\x5a\x1d\xc1\x6d\x37\xb1\x1b\x1a\xbd\xed\xa7\x15\x1b\xf8\x32\xaa\x2e\x40\xbd\xb0\xcf\x61\x8a\x8f\xf6\xd7\xdd\x60\xac\x99\xea\x06\xc4\x6f\x8f\xef\x24\x82\x97\xfb\xca\xca\x4d\xdf\xa5\xf6\x5f\x80\xf2\xe9\xab\xab\x4a\x5f\xb9\x86\x42\x5c\xb8\x9d\x75\x69\x4c\x76\x09\x20\x7d\xdc\x77\x35\xf4\xb2\x00\xd3\x87\x30\x54\x85\xf6\x6d\x25\xfa\xbf\xe2\x82\xd7\xd1\x0a\xf5\x0a\x06\x28\xb0\x67\x9c\x69\x11\xcd\x0b\x8c\x67\xdf\x1f\x8c\x97\xa4\xbc\xa5\x40\xb7\x75\xdb\x43\x7e\x86\x48\x12\xc0\xb2\xe6\xc4\xb9\x90\x15\xeb\x06\x0c\x7a\x8c\xbc\x2f\x9a\x39\xfe\xbe\x6c\xea\x75\x53\x7b\x53\x6b\xab\xd0\xe3\x61\x36\xd6\xed\xad\xb3\xb9\xca\x73\xeb\xfb\xe6\x79\x60\xfe\x7a\x68\x95\xd6\xb7\xd1\x63\xb8\xd4\x80\x79\x5e\x97\xd6\x35\x5b\x81\xbb\x73\xa5\x0b\x68\xe9\x04\xe3\x8b\x7a\x43\x43\x58\x7a\xbf\xa0\xf9\x06\xef\x1c\xfd\xd5\xed\x9d\xcb\x62\x44\xbe\xd6\xab\x54\x1e\x4a\xd3\x5c\x56\xa5\x75\x4b\xc2\xb5\xb8\x04\xa3\xcd\x25\xfb\xb1\x63\xb6\xec\x0a\xf8\x0a\x0d\x00\xa1\x89\xbf\x26\x7c\x18\x00\x45\xab\x2a\x43\xe9\x40\xb2\x8c\xf3\xb3\x72\x61\xbd\x7a\xf6\xcb\x83\x13\x17\x41\x8e\x07\x66\x27\x9f\xa7\xee\x82\x01\x71\x83\x15\xf8\x4e\x5e\x20\x5e\x91\xdd\x31\xd8\x53\x79\xe6\x53\xee\x91\xd2\xd1\x26\x1e\x31\x6b\x7f\x30\x17\xe3\xe1\x66\x85\x20\x43\x15\xcf\x24\xf6\x48\x62\x55\x1f\xfa\x80\x4b\x95\xe5\x54\xef\x72\x55\x69\xa2\x44\xd7\x06\x5d\xe6\xe8\x61\xa9\x10\xdf\x05\x09\xd8\x2d\x1e\xbb\x43\x38\xb8\x37\x31\x24\xbe\x86\x57\xf1\xbe\xc4\xd0\xf7\x29\xe1\xb6\x8e\x0e\xff\x34\x7a\xdb\x0b\xcd\x0d\x09\x16\xee\xbf\x7a\x38\xb1\x23\x1e\xe8\x58\x7c\x38\xb1\x33\xf1\x89\x9d\x07\x31\xba\x71\x61\xc7\xc5\xe2\x1b\x2c\xf4\x63\x7e\xd2\xa7\x27\x67\xa7\xb3\xe3\xdd\x83\xf4\xd9\x7f\x50\xfc\x7f\xff\xe5\xab\x17\x2f\xda\xf5\x9f\xcf\x0e\x5e\x7c\x8b\xff\xff\x11\x3f\x27\x65\xb1\x7b\x06\xb0\x3e\x92\xaa\x02\x49\x66\x70\x61\xe4\x41\xfa\x8c\x0a\xb5\x1f\xfc\xe8\xce\x20\xfc\xc8\xec\x78\x30\x74\x75\xfe\x07\xe9\x33\xb9\x53\x5f\x6b\x07\x46\x3b\x18\x86\x4c\x17\xd0\x28\xc3\xd1\x14\x20\x17\xb3\x96\x03\xd0\x3c\x00\x63\xd8\x0e\x04\xe7\x1d\xa2\xea\xcf\x65\xf5\x71\x30\x14\xb7\x18\xba\xbf\x2d\xac\x41\x02\x9f\xc0\x87\x23\xde\x87\xb5\x41\xac\xa3\xde\x2e\x07\xc0\x7c\x83\xfd\x2f\x66\x46\x59\xfc\xa2\xe6\xd6\x7f\x76\x61\xba\x16\x75\x0a\xcb\xef\xe8\xfd\xaf\x5d\xed\xe8\x22\xd0\xed\x0f\xae\x51\xb0\x20\xc0\x5f\xf3\x16\x60\xd3\xca\x65\x20\xfe\x39\xf5\x20\x79\x36\x8c\x61\x68\xed\x3c\xb5\x0d\xd7\x33\x11\x2d\xfc\x4f\x07\x6f\x8a\x7d\xc8\x4c\x49\xc1\x93\x59\x34\x55\x0c\x94\xcc\xef\x07\x38\xe5\x45\xd9\xe7\x77\x85\x78\xac\xdd\x15\x91\x00\x08\xb2\x86\xce\x7e\x66\x91\x61\xc4\xdf\xd0\x20\x14\x1e\x0f\x05\xf6\xfa\x07\xf0\x93\x90\x2f\xb9\x30\xd6\x8c\x48\xa4\x5a\xa8\x75\x9d\x48\x95\xd7\x40\xa4\x04\xa0\xa2\xe0\x32\x32\xd9\x10\x84\x2f\x2a\xa7\xa7\x1d\x87\x8f\x1d\x08\x14\xc2\x01\xda\x0b\x92\xe0\x15\x57\x5d\xcc\xd8\x9d\xc1\x91\xff\x95\xfd\x92\x19\x0c\x09\xfc\xb0\x59\x63\x38\x59\x44\xb3\xfb\x01\xbc\xac\x18\x7d\x0e\x9b\x5d\x57\x4d\x81\xa1\xc1\x38\x1a\x19\xaf\x8d\x35\x86\xfc\x1b\x61\x98\x9e\xe3\x05\x76\x2a\xf1\x3e\x07\xf6\x5b\x96\x9c\x87\xe0\xa7\xc6\x4f\x2c\xab\x9e\x07\xda\x2f\xd8\x63\xb2\x7d\x90\xae\x15\x34\x6f\x9f\xde\xe8\x8a\x8b\xfe\xe3\x4b\x5b\xc9\x26\x54\x56\x38\x60\x96\xbd\x57\x3b\x8b\xe1\x0f\x81\x9b\x55\x97\x0c\x01\xd1\xb3\x1c\x0c\xce\xfb\x43\x88\x63\xae\x79\x7d\xd7\xb9\xda\xdc\xf3\x25\x24\x5f\x72\x37\x07\x81\x4f\x7f\xe7\x6b\x83\x8b\x14\x43\x66\x5b\xc9\xb3\x70\xe4\xd3\xf6\x50\x13\x92\x99\xf6\x63\x40\x68\xb4\x4a\x4b\xbd\xba\x2c\x17\x99\xcf\xaf\xb4\x8e\x87\x91\xcb\xa6\x2a\xa0\xed\x89\x52\x55\x82\x9f\xb1\xfd\xce\x7a\x22\xf1\xad\x68\xbd\x4b\x02\xe4\x4e\x04\xe0\x79\xac\xd4\x42\x3b\x3c\x3b\xe6\x8b\xbc\xef\xa4\xe2\xdd\x40\x42\x25\xb7\xe2\x61\x85\xec\x71\x48\x5b\x53\xeb\x6a\xc5\xd5\xc4\xb2\x5d\x4d\xbc\x86\x1c\x58\xa5\x17\x22\x8c\xd0\xc7\x2f\x5f\x42\xa3\x17\x64\x8d\x3a\x61\xcf\x8c\x7a\xfb\xf2\xdc\xb3\x7a\xc6\x88\xdc\x72\xa1\xad\x9f\x77\xc9\x41\xe0\xb0\x65\xab\xf5\xa6\xe0\x98\x60\xf7\xa2\x88\xca\xc3\x3b\x11\x99\xad\xf5\xe6\x3d\xb3\x10\x0a\x3c\xb8\x7e\x70\xc5\x78\xbe\x70\x3c\xdc\x48\x02\xd8\x77\x3f\x3e\x41\x95\x85\xad\xac\xa9\x51\x75\x66\xb8\x19\xcd\x37\x45\x42\xf4\x98\x82\xbf\xdd\x69\x88\x6d\xd3\x80\x38\xbc\xcc\x0a\x24\xca\xc3\x6e\xfc\x75\x69\xb2\xba\xac\x36\x21\xa0\xdc\x5c\xe5\x73\xf0\xf4\x80\x7a\x0a\xeb\x11\x65\x56\x20\x90\x0f\xe4\x67\xb0\x1c\xf3\x46\x17\xd8\x19\x3a\x9f\x6b\x03\x21\x6d\x7b\x0b\x97\x28\x3e\x98\xd3\xcb\xcd\x90\xdb\x2d\x4d\x0f\xba\x67\xbc\x6b\x40\x71\x35\xc6\xdb\x6a\x8f\xc5\x1b\xeb\xec\xb0\x70\x82\xf3\xd9\x2d\xd8\x35\x58\xd3\xc6\x97\x29\xaa\xc6\x13\xd4\xb2\xd1\xa5\xb7\x6f\xbd\x39\x09\xf9\xe4\x30\x7e\xe6\xe9\xfd\x01\xf5\x5e\x57\x37\xd9\x5c\x0b\xe4\xfb\xff\x8a\x7a\xde\xc0\x71\x8b\xb4\x99\xf3\xde\x18\xdc\x12\x9d\xb7\x98\x0c\x3f\x94\x39\x41\x43\xa2\xef\xcb\x13\xd4\x90\xe8\xb1\x8d\xeb\x6b\xc2\x44\x84\x57\x1e\x87\x48\xd1\x0c\x24\xec\x50\xd8\xf9\xd1\x4f\x4c\x30\xeb\xc4\x93\xcc\x99\x24\x90\x45\xf6\x03\x56\x2d\x54\xba\x76\x10\xf7\xf7\x40\xf1\xa6\xf2\xa4\x14\x5d\x64\x5d\xee\x23\x7c\x84\x68\x93\x81\x68\x2b\x2b\x41\x92\x0d\x05\xee\x8a\x0b\x79\x83\xa6\x7f\x16\xdf\xbe\xe1\xb3\x0e\x49\x67\xe9\xcf\x14\xa0\x10\xbe\x85\x53\xee\x43\xbb\x60\xff\x20\xed\x23\xc2\x13\xe1\x8f\x9c\xd4\x37\xba\x90\xd9\x12\xd3\x6b\xf8\x67\xc4\x41\x24\xca\xbd\x3e\x8d\x00\x25\x32\xbd\x3b\x04\x0a\x5c\x5c\x62\x25\x4a\xb5\xae\x74\xed\x68\xd9\xae\xb3\xcb\x2c\x10\x27\x70\xa0\xbc\xb9\x4b\x7a\x1e\x0a\x61\xe2\x22\x18\x11\xbd\xc0\xae\xd4\x7d\x52\xca\x67\xb3\x02\xa0\x28\x85\x92\xc9\x4a\x05\xee\x3c\x01\xca\xb5\xf1\xa7\x5a\x57\xf6\x41\x47\x7a\x9d\x97\x1b\x6c\x98\xf5\xaa\xa2\xe7\xcf\xa1\xca\x80\x3d\x0f\x23\x83\x90\x91\xf2\xe6\x4c\x70\xfa\xef\x31\x8e\x50\x87\x05\xb9\x46\x84\x73\x70\xc5\x36\x0f\x7f\x35\xbc\xcd\x88\x44\x1a\x77\x0c\x8b\x0f\x65\x93\x48\x6e\xae\xc5\x92\x22\xb4\x33\xa3\xd0\x26\x5b\x0b\xce\x1a\x8b\xe1\xb2\x4c\x59\x40\xcf\x2f\x76\x53\x39\xe2\x6a\x65\xaf\x23\x03\x61\x50\x6b\x0c\x61\x44\x42\xb7\x92\x15\x2b\x37\xd4\x59\x5d\xdf\xc2\xd9\x19\xd9\xaf\x70\x37\x72\x00\xc5\xcd\x86\x04\xdd\x72\xcf\xfa\x1b\xc2\x6e\x43\x38\xb9\x31\xb5\xac\xad\xf5\x0c\x2d\xa7\x3d\xdb\xc4\x32\x7d\xdb\xf2\xab\xf6\x2a\xc2\x3c\x44\x14\xe6\xa5\x76\x26\xb6\x20\x77\xe6\xc3\x54\x88\x97\x43\x39\xaa\xfd\x67\xb0\x74\x2c\xf5\xa3\xc2\x0a\x75\xd7\x8c\xd2\x52\xc6\x76\x87\xb7\x9b\xc5\x58\xbf\x93\x48\xec\xf1\x77\x0e\x0f\xca\x05\x70\x2a\x7c\xf7\x03\xa7\xf2\x39\xe8\x2b\x1e\x52\xfb\x89\x9d\xe1\xad\xb6\xe6\x89\xa1\x24\x0c\x3e\xc1\x2d\x33\xe1\x5b\x09\x22\x8f\x85\x90\xb4\x5d\x1e\x20\xbf\x24\x2c\xd6\x0c\x1d\x56\x2b\xa5\x69\xe7\x07\xe1\x72\x60\xd7\x43\x3a\x70\xeb\x41\x9d\xc5\xed\xa5\xe0\xc4\x43\xe7\x28\xb7\xd6\x02\x40\x1b\x54\x55\x6d\xa4\x12\x3e\xcb\xde\x7d\x63\xbf\x11\x80\xb9\x5f\x30\xe7\x7c\x25\x08\xa2\x88\xd8\x57\xa0\x5c\xe6\x34\x6e\x9f\x36\x7f\x35\x94\x3f\x23\x20\xdc\x86\xda\x4d\x6e\x74\x01\x75\x4d\x60\x86\xfa\xca\xfd\x72\xe9\x3e\x88\xf2\xa3\xe5\x7a\x1a\xe1\x9c\x92\xc0\x9f\x71\x6e\x4b\x81\x0b\x19\x00\xb2\xc1\x0b\xda\x14\x83\xec\xb8\xba\xab\x53\x56\x3d\x38\xd2\x89\x53\xc9\xbe\x91\x0a\x41\xe8\x42\x70\xe8\x65\x17\x48\x5a\xb4\x00\xa2\xa1\x48\xe3\x01\x7c\xe8\x14\x11\xa0\x4e\xce\x27\xd3\xb1\x9c\x4e\x66\x7f\x92\xa3\x99\x3c\x3f\x85\x6a\xf4\x7f\xbe\x18\x71\x85\xb2\xfd\xe7\xe9\x74\xf2\x76\x72\x32\x3a\x96\x3f\x9f\x4e\xff\x24\x27\x33\x98\x9e\xfc\x70\x7a\x41\x5c\xa3\x31\x34\x98\xc3\xbd\x9b\x97\x1e\x65\x46\x15\x52\x1b\x43\x68\xae\x51\xc8\xdd\xd9\xf9\x81\x06\x6c\x19\x4a\x82\xb6\x22\x06\xd3\x09\xb6\x01\x59\x40\xc3\x0d\x8a\x3a\x44\xbe\x1b\xca\x2d\x8d\x08\x0c\x61\x58\x94\x72\x9e\x55\xf3\x66\x65\x6a\x22\x65\x28\x78\xbf\x8b\x92\x5a\xf4\xeb\x6b\x5d\x56\x1b\x0f\x75\x60\xe5\x84\xb5\x07\x82\xa6\xdd\x42\x5f\xe5\xd9\x95\x2e\xe6\x7a\x98\xa0\xe9\xa7\xe6\x78\xfd\x9d\x6e\x4b\x18\xe7\x25\x70\xc4\xd0\x6b\x66\x2c\x22\x52\x02\x3e\xc3\xf7\x08\xa4\x6d\x52\x5f\x3d\x48\xdb\x2c\xbb\x1c\x8f\x95\x83\x87\x0d\x90\x0e\xdb\x9b\x21\x48\x9c\x07\x68\xc0\xed\x88\xcc\xbd\x47\x96\xdf\xbd\x2c\x2b\xc1\xa8\x74\x57\x65\xb9\xb8\xcd\xac\x95\x05\x71\x38\x00\x83\x80\x54\x0b\x56\xaf\x59\xbb\x8b\x40\x68\x40\x53\xe5\xcb\xa6\xa0\xaa\x29\x5a\x08\x10\x70\x79\xee\xf9\x43\x1c\xce\x32\xcf\xb4\x22\xb0\xdc\x94\x0b\x80\xb7\x74\x23\x82\xa1\x13\xa1\xbd\xd6\x1e\xbc\x36\xc6\xd8\x73\xd6\x8f\x61\x98\x1f\x7e\x66\x2a\xc4\xf7\x43\x39\x02\x18\x67\x27\x58\xce\x09\xc5\x06\x0a\x94\x27\x48\xe7\x02\x29\xfa\x6c\xa5\x51\x01\x7a\x40\x0b\x65\x90\x6b\x57\xd6\x65\x64\x27\x25\xe4\xdb\xc3\x9f\x61\xdb\xe7\x00\x2e\x81\x95\x29\x39\xc0\x3f\x58\x3f\x3b\xe8\x43\x56\x6e\x14\xa2\xb5\x93\xce\xb3\xa5\xee\xa0\xbe\x7e\x7b\xc0\xea\xe9\x04\x77\xc4\x63\x23\x50\x7d\x3a\x39\x50\xf6\xd6\xc8\x16\x51\x1e\x5b\x2f\x97\xf6\xde\x04\x89\xcb\xe8\xea\xd5\x25\xf5\xf0\xd3\xae\x10\xf2\x3e\x2e\x47\xb9\x14\xa1\x42\xe8\x23\x39\x0a\x02\x07\xc1\x3a\x04\x65\x81\xb0\x90\x84\x84\x52\x97\x38\x8e\x9a\xea\xa7\x00\x46\xe3\x06\xbb\x88\xf3\xcc\xc4\x50\x2b\x72\x2f\x84\x75\xf4\x8f\x01\x5d\x07\x5a\x4f\x74\xd4\x62\x1c\xfa\xeb\x28\x76\x60\xf5\x47\x7a\x30\x77\x93\xae\xcb\xa2\xac\x90\x62\x4c\x6f\x83\x48\xc8\x8c\x3b\x99\x28\x0f\x03\x72\x0c\x75\x4b\xe0\xd3\x60\x5b\xd9\xcf\xab\x5c\x80\xcd\xb5\xd9\x6e\xfd\x03\x40\x9d\x47\x08\x27\xc0\x39\xff\x54\x14\xb1\xd0\x0a\x89\xc9\x5b\xbe\x07\x11\x3a\xd1\x60\xa9\x32\xb0\x1c\x11\x0f\x00\xfe\xb5\xd0\x2a\xcf\x8a\xab\xc1\xb0\xb5\x23\x78\x0d\x03\xbc\xab\x15\x54\xd7\xd6\x3a\x87\xbb\x1e\x54\x1f\x80\x63\x0f\xe0\x32\x84\xbd\x19\xe0\x5f\x51\xf5\x30\x69\x06\xbb\x9f\xf6\x7b\x6d\x05\x01\xeb\x0f\x1b\xc6\x42\xa6\x2e\x71\x9d\xdb\x35\xf5\x7e\xb7\x05\xd9\x8d\x7b\xcf\x86\xe1\xbd\x06\xc1\x4c\xa1\xc1\xd1\xbc\xa6\x9e\xd7\xf6\xbc\x42\xb4\xb0\x30\x67\x2f\xbe\x76\x66\xb2\x7f\x66\xa2\x85\x45\x06\x06\x98\x15\x8d\x28\x91\x08\x15\x26\x3c\xb6\xf7\xe2\xb7\x25\x82\xc1\xdf\xbc\x57\x56\x85\x4e\xbb\x8e\x31\xdd\x7a\x55\x03\x41\xb1\x09\xc6\xda\xa3\xf5\xa9\x83\x35\x6c\x23\x08\x7a\x61\x8c\x6a\xcf\xa1\xd9\xd0\xcb\xd8\x8f\x8f\xc8\x83\xe0\xd4\x77\x41\xe3\xe2\xe1\x3c\x00\x1d\x67\xf7\x77\x6f\x28\xff\xa9\xa9\x32\xb3\xe0\x32\xdd\x9f\x34\x43\x74\xbd\x05\xd8\x20\xec\xfa\xb8\x4d\xe5\x08\x31\xbf\xa9\x2c\xd0\x34\x59\x84\xf7\x15\x7b\xbb\x4c\xc8\x4f\xb0\xea\x88\xbc\xc1\x25\xf0\x4d\x45\xc1\x03\xf9\x4b\xf0\x66\x2c\x37\x22\x14\x24\xb7\x01\x95\x36\xd9\x42\x1b\xc7\x18\x9e\xcd\xaf\xfd\xee\xd8\x93\x0b\xc1\x1e\x2b\xdc\x99\xd3\x9d\x09\x02\x12\x6f\xc6\x88\x3a\x02\x3d\x52\x75\xfc\x62\x0f\xc3\x47\x2d\xa4\x50\xa5\xb8\x5b\x2e\x77\x49\x07\x12\xe8\x18\x98\xc8\x22\x74\x19\x63\x1c\xa4\x13\xda\x8a\x43\x88\xd4\xe1\x07\x0a\x84\x8f\x02\x18\x78\xf6\x13\x27\x91\x6c\x9a\x11\xb1\xe3\xdb\xb2\x5c\x80\x68\xf3\x4a\x92\x38\x4b\x16\xb8\xf6\x5b\xed\x91\xb2\xa9\xed\x22\x21\x66\xc5\xbc\x5c\xeb\xb6\x36\x80\x63\x0c\xa0\x49\xac\x05\xf9\x28\xba\xbc\x45\x0c\x4c\x26\x02\xa6\x74\x94\xbe\x6b\x5d\xa8\x9c\x4d\xf0\xa8\x8b\x81\x83\x4c\xea\x96\x77\x38\x40\x21\x8e\x16\x3a\xc5\x8c\x27\x7b\xa6\x54\x0c\x8d\x38\x70\x4e\x95\xf1\xc8\xda\x0a\x4d\x88\xbd\x7d\xf0\x61\xcb\xaa\xd0\x1b\xf3\x44\xbe\xd1\xd6\xd6\x99\x14\x8c\x45\xcf\xa4\x58\x88\xa0\xb9\x5d\x35\x5a\xed\x6e\xb4\x86\x68\x38\x1b\x4f\xfe\x1c\x13\xd4\x27\x87\xd6\x6f\x54\x06\xe5\xfa\x08\x26\xe5\x56\x0b\x80\x21\x73\xb4\x5e\x2a\x0d\xdc\x71\x74\x76\x0c\xad\x17\x81\xb0\x9b\x07\x1d\x1c\x6f\x1a\x08\xe5\x27\x07\x8d\x03\x1e\x1d\x39\x2b\xe6\x4d\x55\xa1\x3a\x6e\xb3\x03\x60\x89\x71\x5b\xd2\x81\x37\x0c\x10\x1c\xb9\xc3\xc0\x57\xa1\xc0\xfe\xa2\x5d\x10\xc1\x2e\x1c\x0c\xe5\xfb\xcc\xcc\x75\x9e\xab\x42\x97\x0d\x1a\x50\xfd\x08\xb0\x81\x7a\xbd\xd6\x39\x53\x93\x44\xf8\xaf\x8f\x00\x55\x0d\x9b\x3d\xb6\x22\xaa\x66\x75\x0b\x3b\x75\xef\xf9\x50\xfa\x1e\x27\x3b\x24\xea\xa8\x29\x22\x85\x95\xd2\xaf\xa9\xf7\xc8\xee\x4e\x6c\x8e\x92\xc3\x23\xb2\x42\x36\xeb\xb5\xae\xd0\xd0\xbe\xb5\x46\xb8\x02\xc0\x19\x22\x13\x05\x5b\xf5\x26\x5b\x30\x25\x02\xf9\x4d\x04\x21\x1a\x50\xb5\x91\xed\x45\x61\x21\xdc\xe3\xd5\x3a\x87\xe2\x46\xc4\xb7\x44\x83\x35\x3c\xc0\x49\xcb\xb8\x7b\x63\x07\xe1\x9f\x9f\x69\x93\x70\xc3\x10\x73\x7e\xd8\x1d\x09\x19\x75\x29\x9b\x66\x0f\xa4\x09\x52\x6b\xf2\x12\xd3\xbe\x19\x37\xd4\x59\xfd\x59\x16\x82\x9b\xde\xb8\x3a\x16\xdf\x19\xc2\x8a\xa0\xa7\xe9\x56\x38\x91\x03\xfa\x0e\x87\x1a\x77\xb2\x21\xc8\x92\xb5\x5d\xad\x84\x5c\x39\x14\xe4\xec\xcc\x41\x98\x84\x03\x2d\xf8\x4b\x52\x2f\x2b\x55\x28\x4f\x93\x07\x67\x04\x67\xe3\x5d\xd0\xcb\x8d\xf3\x32\x5b\x4e\x66\x59\x21\x5b\x22\x14\x31\x40\xa9\x03\xf4\x9a\x2d\x6b\xa0\x2d\x05\xbe\xa1\x9d\x17\xcf\xfe\xff\x43\x08\x0b\x96\x95\x13\xab\x56\x90\xd6\x0a\x2b\x77\xcd\xb5\xaa\xb4\xe1\x67\x65\x43\x79\xa9\x0b\xbd\xcc\xc0\xe7\x8a\x9e\x1b\x8c\xcd\x1e\xbb\x17\x43\x0c\xae\x51\x4b\x81\xaf\x23\xe5\x69\x76\xb2\xfb\xc8\xbe\xb5\xc1\x56\x35\x37\x0b\xc1\xbd\x33\x2e\x19\x8a\x46\x5a\x4f\x00\x00\xdb\x09\x00\x37\xd9\x1e\x27\xa7\x1e\x21\xf2\x64\xb4\x01\x6f\x0f\x62\x4a\xb5\xae\x96\xba\xd2\x0e\x14\xe3\x52\x77\x70\xa6\x61\x3a\xc0\x94\x89\xa1\x48\x3b\xa7\x97\xc3\x18\xbc\xab\x5c\xb6\xee\xd0\x79\xeb\xb6\xfb\xb2\x8b\xbf\x7d\x96\xfb\xcf\x9e\xbd\xb0\x16\x04\x14\x25\x8b\x69\x69\x74\x91\xca\x33\x9f\x68\x89\x23\xfe\x56\xb7\x84\xa4\xb2\x49\x3b\xd5\x1e\x19\x80\x7d\xa8\x1e\xdb\xcd\x7c\xcc\xac\x61\xee\xba\x05\x3c\x19\x58\x94\x8a\xaa\x35\xfb\x12\x56\x12\x81\x8b\x3b\x99\x5c\x5f\xfb\xeb\x1a\xac\xe0\xe1\x84\x40\xfd\xa9\x13\x64\xa0\x8b\x1f\xcf\xb5\x3d\xd5\xa0\x2a\x5d\x2f\x1c\x16\x29\x16\xe5\xbc\xe7\x00\x60\x50\xfa\x63\xbd\x5d\xb0\x23\xb1\x76\x12\x0d\xbf\xa8\x02\xc8\xc4\x25\x40\x6d\x3c\xd2\x3e\xb8\x93\xd7\x70\x91\x83\x6a\x68\xe7\x95\x87\xb1\x7f\x88\x4e\xc2\x78\xdb\x03\x23\x4a\x10\x87\x8f\x16\xd7\x3e\x10\x74\xda\xec\x78\x00\xc3\xa7\xca\x69\x38\xb1\x78\x61\x4a\xc3\xf9\x46\xb2\x2e\xb8\xba\xb3\xf7\x65\x3f\xe0\xc5\x0f\xc2\xda\x50\xad\x24\xb0\xc4\x1e\x42\xae\x54\xae\xe9\x33\x44\xcb\xac\x02\x36\x0b\xae\x66\x45\x6c\x14\x57\x36\x42\x5f\x73\x7c\xdf\x28\xb9\xe5\x7f\xa1\x36\x2a\x18\x06\x87\xee\x60\x6c\xd6\x84\xf8\xaf\x03\xc6\x9c\x01\x0a\x61\x78\x42\x50\x41\x8d\x22\x39\xc3\x9b\x69\x0d\x4e\x60\x69\xc8\x37\xd2\x64\xab\x2c\x57\x15\xef\x87\xef\xcb\x0a\xcf\x0e\x94\x77\x90\x54\x8a\xaa\xd4\xc1\xa9\xe1\xe2\xee\xce\xce\x03\x35\x9c\xdd\x03\xea\x83\x70\x85\xac\x08\x35\x18\x2f\xa8\x83\xf0\x73\x9d\xb2\x60\xd5\xdd\xa0\xf8\x09\xa1\xee\x26\x56\xfe\xe3\x5d\xd8\x39\x9d\x4d\x86\xce\x7d\x0d\x70\x8b\x80\x5f\x8d\x17\xa9\xd2\x37\x99\x46\x2f\x7d\xae\xab\xda\x8b\x95\x75\x55\x5a\xb5\x6e\x25\xce\xab\x61\x58\xf4\x35\x5a\xe9\x62\xe1\x93\x5c\xbe\xbe\x37\x33\x52\xad\xd0\x6d\x6f\x61\xdf\x46\x87\x4d\xf8\x5a\xba\xd3\xd9\xb1\x3c\x48\x9f\x0d\x86\xf6\x58\x0e\x1e\x53\xa7\x37\x20\xfa\x24\x0e\xc7\xd2\x13\x7c\x8e\xc7\x2d\x10\x8d\xa4\x83\x8a\x14\x38\x33\x8e\x31\x14\xfb\xa3\xe7\xb9\x55\x32\x74\x1a\xa0\xdb\x1d\x4e\xcb\xee\xb2\xac\x76\x91\x16\x30\x6a\xbf\xc2\xe4\x1a\x66\xb6\x11\xd1\x56\xdf\x80\xb7\x76\x7b\xad\x6a\x83\x1d\xc7\xae\x9a\xbe\x0f\xf5\x2e\x2e\xa8\xe8\xcb\xc9\x11\x61\x7a\xe2\x3a\x1d\x5d\x7f\x84\x4b\xc6\x77\xcd\x65\x42\x67\x3a\x77\x97\x09\x62\x7b\xd8\x47\xef\xc2\x47\xaf\xe4\xbf\x0e\xfa\xb3\x12\x83\xff\x06\x75\x58\xb8\xae\xbe\x35\x1b\xd4\xdf\x47\xab\x2c\xac\xe9\x11\x0d\xdd\x3c\x50\x67\xc5\x0f\x4b\x04\x02\x70\x9e\x4e\xe5\xe9\x9b\x37\xe3\xe9\x2c\xa0\xa6\x99\x8c\x67\xf2\xe7\x77\xa3\xf3\xd9\xe9\xf8\xa7\xf1\xd4\x4e\x61\x3e\xb4\xee\x44\x7d\xef\x2c\xbe\x93\xff\x3a\xd8\x12\x4e\xc7\x69\x80\xb9\xdc\x33\x12\xca\x86\x23\xb2\x52\x10\x22\x66\x9f\xd6\x11\x7c\x4c\x66\x0e\x66\xa6\x28\x6f\x85\x33\xe8\x06\x68\x1f\x0d\x02\xb6\x9d\x9d\x05\x2e\x3a\x57\xb6\x85\xc1\x3a\x3b\x9b\xb6\xce\x29\xca\xdb\xa8\xbf\x3f\xbe\x02\xfd\xc5\x69\x03\x59\xa9\x38\xa5\xbf\x45\x90\xf7\xf5\xb2\x89\x8e\xee\x7e\x4c\x5e\x98\xce\xe0\xb6\x12\xba\xd6\xfd\x63\x54\x4f\x7c\x3b\x05\x32\xdd\x4d\xf3\x68\xa3\x78\xdb\x38\xd5\x1b\x00\xf1\xd9\x2b\xca\x2b\xe5\x96\xef\x55\x2a\x4f\xbd\x41\x69\x9f\x8d\x8e\xc9\x76\x65\xdd\xa9\x6d\xbc\x77\x6e\x30\x6a\x1f\x04\x6e\x4f\x4a\x15\x0b\xe1\x5f\xca\xb0\xe8\x18\xff\x6e\x97\xda\x42\xb3\x25\x75\xe9\x22\x9f\xa4\x15\xd1\x56\x29\x5b\x57\x3d\x57\x55\x80\x77\x16\x1d\x07\x07\x85\x8f\x06\x41\xf6\x67\xcd\x96\xd1\xf6\x59\xa2\x2a\xe1\xa8\x4a\xef\xa5\xe3\xcd\x70\xbd\xe7\xd0\x99\xeb\xe7\xea\xd4\x52\x6b\xd2\xf6\x40\xeb\xe1\x63\x2e\x7a\x1e\x05\x1b\xe1\x44\xc3\x3d\x1d\x74\x8f\x09\x38\x7c\xdd\x15\xa3\x39\x12\xd2\x3b\x8e\x10\xc4\xdd\x6d\xcf\x4b\xc5\xfd\xa3\xee\xa9\xff\x4e\x9f\xfe\x38\x3b\xda\x3d\xd8\x3d\xcc\xad\x77\xb3\x1b\x24\x7e\xff\x7e\xed\x00\x0f\xe0\x3f\x1f\xec\x1d\xec\xb7\xea\xff\x5f\xee\xed\x7d\xc3\x7f\xfe\x43\x7e\xfe\xb3\xe1\x14\xf6\xe0\x18\xff\xb1\x30\x85\x3d\xc0\xb2\xff\x33\x83\x14\x1e\xf4\x03\x98\xc6\x7d\x0e\xd7\xd8\x70\xf6\x9f\x11\xa7\xf0\x79\xef\x79\x70\x3c\xef\x81\x39\xd9\x3e\x17\x7e\x6d\xd5\x9c\x99\xee\x91\x7c\xfc\x09\x04\x01\xb8\x5d\xd4\x99\x2d\xbe\x15\x15\x51\x93\x3c\x68\xd0\x80\xc1\x1c\x17\xca\x6a\x67\x79\xa6\x72\x5d\xad\xca\x44\x8c\xaa\x2b\x68\x68\x56\x03\xb9\x73\x5d\xd7\xeb\xd7\x4f\x9f\xde\xde\xde\xa6\x6b\xfc\x7b\xaa\x17\xcd\xd3\x61\xfa\x44\x88\x7b\x61\x14\xcf\xdf\x8d\xe5\xe1\xe9\xd9\x07\x60\xf5\x92\xef\x4e\x8f\x8f\xac\xf9\xb7\x0d\x4d\x51\x7c\x31\x9a\x62\x2f\x26\xe0\xf9\xbb\xb1\xf8\x62\x34\xc5\xad\x4d\x77\xe2\x61\x34\xc5\xbe\x59\xf6\xc0\x24\x0a\x0f\x93\xf8\x30\x79\xdc\xa3\x60\x12\x45\x97\x3c\xee\x6b\x61\x12\x85\x83\x49\x94\xbf\x15\x26\x51\xfc\x06\x56\xba\x2e\x4c\xa2\xf8\x7a\x56\xba\x16\x4c\xa2\x08\x60\x12\xe5\x6f\x80\x49\xfc\x6a\x42\x8a\x6f\x3f\x7f\xe8\x4f\xfa\xf4\x78\x74\xbc\xbb\x97\xee\xff\x6e\xdd\x9f\x0f\xe2\x3f\xbe\x38\x78\xf6\xb2\x8d\xff\xf8\xe2\xf9\x37\xfb\xef\x0f\xf9\x01\x0f\x6b\xae\xe5\xa8\xaa\xe5\x71\x76\x59\x69\x21\xfe\x15\x82\xe2\xb9\x5e\x42\x1d\x68\x56\x37\x0b\x2d\xff\x5b\x08\x06\xb9\x2f\xc4\x59\x75\xf7\x59\xad\x2e\x9b\x5c\xcb\xd7\x42\x8c\x6e\xf4\x5c\xce\x75\x5d\x93\x8f\x1d\x3e\x2f\x91\xf9\x13\x65\xad\x87\xcc\xa0\x47\xab\x4d\x2d\x17\x65\x51\xdc\x7d\xb6\x9a\x16\x4b\x96\xaa\xc4\xfe\xe7\x22\x5b\x2e\x1b\xa3\x2b\xa1\x6b\xfb\x4f\xd7\xf5\x07\xc4\x21\x97\x98\xe3\x95\x80\x25\xa0\x9b\x9b\x4a\x1b\xb9\x50\x85\x91\xb9\x66\xe2\x40\x69\xb5\xf8\xa2\x2a\x81\x85\x5c\xe3\x7b\x75\x63\x8d\xba\xe3\x32\x2b\xe4\xe2\x49\x76\x55\x94\x95\x7d\x5a\xef\xe7\x12\x9a\x42\x4e\x53\xc8\x21\x7e\x34\x2f\x8b\x42\xdd\xfd\x5f\xb5\xd4\xf0\x6e\xb1\xae\xca\xfa\xee\xdf\xae\x74\x2a\xc7\x79\xae\xa5\x2e\x28\xfd\x67\x97\x22\xb7\xf6\x4f\x56\xcc\xb3\x35\xfc\xc1\x1a\x32\xba\xae\x55\x61\xfd\x56\xea\x5e\xb3\x2f\x5c\xaa\x0c\x62\x99\xa2\x31\xea\x4a\xcb\xb9\x5d\xcb\x3a\x5b\xc2\xf0\xdd\xd4\x9e\xa8\xaa\x06\x66\xba\xb2\x32\xf2\xd7\xc6\x0e\x13\x3f\xbe\x54\x59\x2d\x17\x0d\x4e\x00\xc6\x0f\xd0\x17\xeb\x2a\xbb\xfb\x5c\xdf\x7d\x96\x79\x56\xd7\x77\x9f\x2b\x78\x87\xae\x25\x81\x43\xda\x27\x40\x11\x42\x56\x8b\xbb\xbf\x22\xdc\x99\xce\x8a\x45\x05\xf3\x9f\xcf\xef\xfe\xcd\xd8\x87\xd2\x20\xef\xfe\x2a\xf3\x27\x38\x94\xc4\x3e\xbf\xb3\xab\x52\xc9\x75\xd9\x54\xf2\xb2\xa9\xc5\x02\x26\xbe\x54\x37\x76\x8f\xc1\x86\x3e\x7e\x82\x28\x99\x6e\xbb\x9f\x94\xcd\x4d\x95\x55\xfe\x55\x76\x87\xf9\x58\xd8\x0d\x79\x02\xa4\x10\xc6\x75\x71\xd9\x01\xa2\xd1\x6f\xc4\xe2\x49\x53\x68\x5a\x18\xb9\x56\x15\x2c\x73\xde\x60\x2e\x66\x21\x8b\x72\x75\x59\xd9\xed\x28\xa4\xba\x29\xb3\x4a\xfe\x52\x36\x99\x31\x50\xeb\x07\x63\xd4\x85\x5c\x35\x79\x9d\xad\xf3\x0c\xd8\xf4\x8d\xac\xee\x3e\xfb\x0f\x99\x04\x76\x40\x57\x76\x2d\x8b\xb2\xb9\xd1\x39\x40\x3d\x7a\x6b\x7d\xe1\xf6\xa8\x2c\xf0\x91\x6a\xb5\xce\xb3\x25\x3f\x0e\x81\x4d\xb2\x3c\xab\xef\x3e\xc7\x9f\x4e\xe5\x51\xcf\x11\xc5\xe3\x66\xa4\xb2\xd7\x26\x57\x7c\xc8\x68\x3c\xf6\xf4\xe7\x4a\x2e\xee\x3e\x2f\x31\xf6\x61\x97\xb7\xa9\x68\xbf\x57\x65\xa5\xf2\x54\x88\x71\x21\xf5\x72\xa9\xeb\xc4\x3d\x05\xe3\xab\x8b\x46\x16\xcd\xea\xee\x73\x65\x77\xdc\xde\xbd\xcc\x55\x78\xc0\x51\xc7\x6a\x33\x0d\xc7\xd9\x8e\x25\x2f\xaf\xb2\x79\xa6\x73\x23\xe0\x8a\x99\x44\x36\x05\xae\x82\x6a\xac\x67\xa7\xe3\xd9\xe3\xcd\x24\xd3\x99\xb7\x57\xad\xd7\xaa\x6a\x52\x39\xc9\xf1\x9f\x8d\x31\x99\xc8\x9f\xd0\x22\xcd\x79\x53\xe5\x5c\xcb\x5f\x9b\x4c\x2a\x89\x07\x55\x7f\x5a\xdb\x71\xda\x5b\x7d\xf7\x19\x36\x16\xb7\x12\xcf\x7e\x66\x6a\xdc\x85\x5a\xaf\xd6\x65\xa5\x32\x00\x3a\x3a\xd6\xd2\xe0\x2e\xe3\x2a\xf9\x91\x99\xb2\xa8\x5b\x27\x07\xde\xb6\x28\x33\xbb\x00\x72\xa1\x57\xba\xa9\x58\x94\x18\xd8\x47\x71\xf7\xef\xb5\xbd\x25\xc5\xbc\xac\xb4\xbc\xb1\xa3\x01\x2c\x23\x10\x34\x8b\x26\x78\x15\x5e\xb3\x60\x5f\x0f\x9f\xd8\xa9\xde\xfd\x15\x72\xc1\x70\x9d\x74\x25\xec\x39\xad\xf4\xfc\x5a\x57\x73\x70\x40\x8a\x85\x02\x0f\x2e\xc7\x89\x17\x5a\x1a\xbb\x87\x6b\xc0\xb0\xad\xf4\xbc\x26\x91\x96\x59\x59\x78\xf7\x57\x69\xbf\x1f\x14\xed\x88\x79\x59\xcc\xab\xbb\x7f\xab\x75\x2a\x0f\xf1\x88\xce\xe1\xb5\x8b\xbb\xcf\x73\x77\xa3\xb2\xc2\x9e\x9e\x26\xa1\xbf\xe1\x7e\x83\x90\xb3\xe7\x5c\x43\xb3\x64\x51\xcb\x1a\x3c\xae\xb2\x99\x67\x76\x32\x76\x22\x79\x66\x56\xda\x8a\x98\xac\x30\x99\x3d\x2a\xe5\xe5\x2f\x34\x55\xbb\x01\xb2\x80\xe7\xd9\xc1\xce\xcb\xc2\x4e\xa6\xa1\xb3\xc6\x1f\x84\x4f\x2d\xb3\x22\x83\x15\xba\xfb\x6c\xff\x13\xca\x51\xb5\xac\xb5\x3d\xa4\xb8\x48\xf6\x84\xab\xcc\x94\xae\xb4\xdc\x5e\x30\x3c\x0f\xbd\x1a\x43\xbe\x46\x6f\xb2\xe1\xc5\x07\x91\xfb\xf9\x4a\x57\xc2\xee\xef\xba\x52\x20\xce\x4c\x20\xda\xac\x93\x7d\x79\xf7\xd9\xce\xd7\xc0\x21\x30\xba\xc1\x8b\xfe\x6f\x57\x20\xec\xed\x9c\xec\xa2\x15\xe5\x2a\x83\x77\xaf\x54\x35\xbf\xbe\xfb\x9c\x0a\x71\x74\xf7\x97\x37\x93\x13\x24\x48\x17\xe2\x7f\xfc\x2f\xff\xbb\x3c\x26\xd1\x67\x55\x5b\x96\x4b\xf3\x44\x5d\x59\x49\x1b\x8a\x21\x0c\x34\xe2\xb6\xce\xcb\xd5\xba\xd2\xc5\xc2\x89\x4c\x8a\xc0\xc1\x34\xed\xb9\xcd\xac\xfc\x16\x76\x03\xec\x40\x75\xe0\x53\x83\x78\x59\x97\xc6\x0a\xec\xcc\x1e\x4f\x23\x77\x40\xc1\x61\x08\xaf\xf9\x04\xc5\xe2\x77\x9f\xa1\x5a\xdc\x90\x0a\xa2\x2a\xdf\x61\x2a\x50\x03\x99\x1a\x0e\x26\x9d\x21\x7b\x20\x5c\x9a\x2b\xd0\x6e\x6e\x50\x30\x66\x7b\xdb\x62\x6d\x47\xfb\x57\x8b\x96\xf0\x33\x3a\x2f\x0b\xfb\xda\x5f\x1b\x14\x8c\xdd\x09\xc0\xd5\xb3\x6a\x09\x42\xfd\xd1\x0a\x06\x2b\xf1\x5a\x08\x38\xa1\xbb\x77\x7f\xdd\x85\x4b\xe3\x96\x8b\x47\x0f\xb2\x9d\x87\x0f\x22\x2f\xfc\x10\xad\xf8\xa2\x44\x23\x40\x50\xad\xf3\x8d\xfd\x37\xde\x63\x0c\x44\xc1\x19\xb0\x8f\xb2\xf3\x44\x2c\xb5\x6b\x3b\x36\x1e\x5a\xa0\x64\x83\xc5\xd5\xa6\x67\x80\x70\xda\x4a\xe8\x83\x25\x45\xe0\x85\x37\xee\x3c\x2e\x83\xbd\xc4\x76\xe9\x95\xf4\xfd\xb3\x0b\x2d\xdc\xd8\x75\x61\x97\xc7\xd8\x6b\x88\x3a\x3c\x36\x54\x38\x96\x44\x45\xf9\x6c\x08\x79\x79\x1b\x46\xd8\x04\xd8\x02\x1a\xd0\x0f\x8b\xe5\xdd\xbf\x55\x20\x99\x68\x17\x69\x8e\x2e\x30\xbd\xc3\x40\x72\x8d\x17\x8b\xe1\xaa\x0e\xed\xa4\xf5\x27\xbd\x5a\xe7\x60\x2f\x2c\x94\x15\xc5\xc1\x07\x60\x38\x46\xb9\xd3\xc1\x23\x34\xd4\xaa\x82\xa9\xa5\x06\x7e\x85\x79\x51\xc0\xdf\xd6\x38\x4a\x3e\x7a\xeb\xea\xee\x33\xa4\xa8\xb0\xe6\xd5\x4a\x9f\xe5\xdd\x67\x8c\x84\x83\x3e\xa5\xbb\xa1\xa0\x33\x94\xcc\x00\x28\x48\x83\x0e\xc7\xbb\xcf\x54\xc2\x9c\xf0\xa6\xc3\x7c\xfc\xa2\x19\xd9\xe4\xfe\x0a\xd1\x22\x1c\xda\x8f\xda\xf9\xc1\xc3\xa3\xcf\xc3\x5d\xf6\x71\x72\xd5\x48\xa3\x49\xcf\x87\x77\x82\x1e\x34\x6a\x3a\x87\xb1\xe7\x58\x83\x19\x06\x3d\x7c\x05\xab\x39\x3c\xd7\xfe\x5b\x68\x55\xe1\x57\x49\x9c\xa8\xea\xb2\xac\xb4\xa1\x2b\x48\xef\x17\xf4\x79\x77\x9e\x53\x79\xd6\xbe\xaf\x89\x5f\xdd\xc5\xdd\x67\x2c\x84\xd3\xb2\x6d\xb8\xa8\xc2\x88\xe0\xea\xce\xc1\xa8\xbe\x51\x56\xa8\xa1\x21\xe9\xd6\x8a\xee\xb3\x7d\x9e\x5b\xb2\x68\x3a\xee\xac\xd3\x49\xf7\x9a\x37\x58\x18\x67\x03\xf8\xc1\xd9\x69\x8a\x68\xd9\x14\x6a\x26\xd3\xe4\x60\x1a\xa3\x6a\x0d\x8f\x38\xad\x0d\xec\xf5\x96\x65\x17\x78\xe6\xee\xfd\x62\x2c\xaf\xfd\x4d\x47\x2c\xc0\xbd\x54\x9e\xfe\xf8\x4f\xe3\x73\x21\x0e\x23\x39\x48\x86\xad\xd3\x85\x74\xf2\xab\xf6\xda\x76\xe4\xe2\x4d\xd9\x18\xb1\xb6\x96\xd3\x9f\xc1\x04\x0d\x9d\x16\x77\xb2\x68\x99\x60\x04\xfb\xa9\x3c\x7e\x72\xf7\x97\xf3\xf1\xc9\xd1\xc5\x58\x1e\x8d\xe5\xf1\x48\xfe\xd3\xe9\xc5\x64\x36\x1b\x9d\x1c\x8e\x79\x5c\x2c\x42\x4c\x6d\x25\xd9\x0a\x8a\xcf\x9d\xf1\xef\x3c\x17\x1d\x2c\x79\x47\xb6\x0b\x3b\x34\xa8\x85\xb1\xb7\x92\xc7\x0b\x52\xfb\xa6\x04\xd5\xa9\x2b\x30\x5d\x61\xe6\xb9\x72\x3e\x99\x35\x43\xc9\x27\x23\x7b\x8b\x4a\x7c\xaa\xd7\x34\x83\x3d\x3b\xe8\xe3\xc9\x8f\xe3\xe9\xf9\xdd\x5f\xec\x1c\x0e\x4f\xcf\x26\xe3\xa9\xdc\x39\xbd\xb0\xff\x9a\x8e\xcf\xa6\xa7\x47\x17\x87\x10\xfa\x12\xe2\x27\x3b\x0e\x65\x17\x08\x44\x16\xbe\xd6\x3b\x81\xd1\x1a\xe1\x60\x9a\x82\x24\x26\x9f\xc5\x3c\x41\xcb\xcd\x0e\x5c\xad\x32\x93\x48\xc8\x03\x36\x58\xc0\x5f\x05\x87\x56\xd7\x30\x55\x3b\x65\xb0\xba\x72\x25\x6b\x3d\xbf\x2e\x60\x11\xac\xc4\x2b\x37\xf6\x6a\xd1\x44\xf6\xdb\x13\x39\x9a\xbc\x79\x73\x31\x1b\x4f\x13\x79\xf4\x04\x22\x78\x67\x53\xbb\x57\xd1\xd4\xee\xfe\x32\x1b\x9f\x20\x8c\x19\xcf\x8e\x0e\x80\x5b\xb6\xd8\x71\x25\xf1\x05\xc7\xc1\xa9\xa1\x24\x54\x5c\x65\x23\x8b\xb2\x48\xac\xfc\xcc\xa5\x1f\xbb\xe6\xea\x86\x44\x76\xfe\x92\x67\xba\x49\xec\xad\xac\x33\xbb\x00\x65\x61\x45\x6b\xf3\xc9\x3e\xea\xaa\x52\xb5\xf5\xf8\x4c\x06\xc7\x93\xbd\x10\xfd\x67\x19\x5b\x23\xee\x50\x37\x99\x35\x16\xb5\x79\x8d\x72\xe1\x97\x12\x5d\x44\xb4\x44\x10\xda\x27\x36\x1b\xd0\xe2\x80\xd6\x55\x70\x38\x00\xb5\x19\x0e\x1a\x8a\xfd\x79\x66\xee\x3e\x03\x9b\x6e\x79\xf7\x7f\x5b\xa9\x53\x57\x76\x85\x02\x9d\x95\xc0\x0e\xd8\xb7\xb9\x2f\xda\x03\xae\x4d\x9d\x15\xaa\x56\xa8\x88\xad\x6b\x10\x59\x33\x8b\xd0\x4a\x7a\xc4\x23\xec\xdb\xb3\x1c\xce\x4e\xa5\xc8\x51\x24\x5f\xd4\x4e\xce\x3d\x4a\x88\x1d\x96\x32\xd6\xde\x7a\x0a\xd5\x41\xde\x04\x1b\xda\x3b\xab\x42\x85\xc0\x4a\x04\x9f\x9c\x48\xf3\x24\xcb\x43\xb3\x23\xc1\xdb\xe7\x7d\x5d\xf0\x19\xf8\x74\xf8\xef\x53\x2c\xc3\xc8\xd5\xdd\xbf\xaf\xe2\x5d\x41\x8d\xcf\xa7\x87\x4f\xec\x41\xfb\xc4\xbe\x3f\x3d\x9a\xbc\x99\x8c\xa7\xf7\xdc\x33\xbe\xbe\xf1\x61\x0c\xed\xcd\x68\xf6\xf1\xd4\xed\xa1\xcc\xe4\x5a\x37\xe0\x4f\xa1\xc9\x05\x46\x00\xca\x13\x3a\xb9\xbd\x41\x99\x60\x32\xf6\x50\xdc\x34\xda\x08\x38\x39\xd0\xee\x9a\x6b\xb8\x80\xba\x90\x73\x65\x62\xfb\x67\x87\x34\x3d\xda\x0f\x20\xe4\x87\xec\x8c\x81\x94\xf7\x3a\x52\x7c\xe9\xc6\xc8\xee\xc6\xf0\xfa\x88\xaf\xdf\x98\x03\x7b\x42\x26\x27\x87\xa7\xd3\xb3\xd3\x29\x88\x06\x10\xed\x4f\x4e\xc7\x17\x3f\x4d\xc7\x42\x9c\xdb\x97\xda\x2f\xdd\x7d\xce\xf1\x66\x98\xb6\x7a\xd8\xe6\xb3\xb2\x8b\x67\x67\xf4\x6b\x53\x66\xd6\x39\x29\x34\x4e\x83\x5d\x35\x4c\x9e\xc9\x85\x75\xf4\xef\x3e\x5f\x71\xb4\xeb\x51\x1b\x2c\x60\xaa\x60\x96\x80\x28\xa5\xd1\xb0\xeb\xaa\x2b\x45\xce\x2b\x2b\xa2\xbb\xbf\x76\x0c\x26\x29\xe5\xf3\x54\xfe\x74\x3a\x93\x47\xd3\xd3\xc9\xf9\x4c\x1e\x3d\x19\x5d\x9c\x8f\x2f\xa6\x6d\x3d\x5b\x3c\x51\x38\xe0\x48\xdb\x16\xf6\x70\x5a\xd9\xce\xd6\x31\xef\xa9\x69\xec\xef\x6b\x54\xe5\x41\x82\x73\x5c\xc8\xf9\x75\x99\x19\x08\x9e\xa0\xa2\x65\x43\xa5\x42\xe1\x74\xf7\xf9\xa6\xcc\x1b\x1f\x83\xf0\xeb\xcc\x27\x00\xba\x32\xf5\x9f\x05\x38\x8d\xa8\xaf\x9f\x94\xcb\xa5\x75\xaf\xed\x8a\xc1\x62\x44\x47\x80\x06\xd7\x3f\x26\x70\xf6\xe6\x56\x00\xdb\x85\x83\x37\x80\x8b\x02\x31\x0f\x24\xee\x00\x5d\xdb\xd6\xd2\xb8\x78\x2f\x52\x7b\xad\x8f\x2e\xa6\x77\x7f\x61\x9b\x00\x0a\xc3\xbc\x41\xc0\x0b\x88\x3e\x27\x04\x81\xe4\xc2\xca\x31\x1c\x0a\xf5\x98\xf2\x7c\x0d\xd2\xa0\x38\x1f\x26\x95\xc7\x68\xf9\x89\xfe\xd8\x6b\x42\xd6\xbc\x97\x14\x4f\x02\x13\xaa\xce\xea\x46\xe3\x09\x99\x53\x9f\xa1\xac\xd5\x3c\x63\xa3\xaa\xd7\x94\x5a\x34\xd6\x2f\x07\x63\x02\xff\x2b\xf4\x7e\x78\x7f\x55\x5d\x2b\xeb\x90\x9b\x30\xf6\x98\x0a\x31\xa3\x25\x2c\x74\xa0\xbc\xec\xb9\xb1\xdb\x61\xcd\x5e\xdd\xb5\xdb\x69\x5f\xd7\xba\x5a\xe8\x3f\xbb\xbe\xbe\x5f\x1b\x64\x75\x0f\x82\xbf\xbf\x36\x4f\xc0\x86\x87\x8f\xb3\x3b\x85\x2f\x45\x1b\xf5\x2a\x5b\x61\x63\x10\x9a\x4e\xaa\x01\xe5\x0b\x1f\xbf\xfb\xf7\x5a\xf3\x4d\x70\xb7\x10\x23\xbe\x18\xe0\xf1\x03\xc6\x28\xe1\xfd\x83\x2d\x34\x9b\x0e\xf6\xcb\xf8\x30\x2b\x29\x55\x5e\x66\xa8\xed\x9c\x99\x26\x78\xd8\xc1\x88\xa5\x94\x2f\x53\x79\x3c\x9e\x81\xdd\x72\xf7\x97\xe9\xf8\xe4\x7c\x3c\x93\x40\x4e\x77\x7a\x32\x7b\xe0\x24\xa1\x52\x6c\x39\xd1\x30\xff\x26\xcf\xec\x1b\x00\xbd\xc0\x0a\xe8\x9b\x46\xb3\xaf\xa7\x56\x77\x9f\xf3\x8c\xe0\xf7\x13\x61\xcf\xb3\x09\xfc\x63\x88\x63\xa8\x39\xfe\x63\xd1\xc8\x95\x9d\x1d\x5c\xae\xbf\xfd\x9f\x7f\xfb\xeb\x9c\x33\x0c\x8a\x32\x0c\x7f\xfb\xeb\xdf\xfe\x9f\xa1\x5d\x4e\xc3\x6e\xb4\x16\x51\x3c\x96\xaa\x66\x0d\x85\x37\xcb\xda\x9a\x4b\x69\xa8\xeb\xea\xb2\xf9\xa5\xb4\x6f\xb3\x4b\x73\x5d\x66\x9f\xa4\x2e\xec\x8c\x78\x77\x6b\x8c\x8b\x2d\x5a\x37\x82\xfe\x64\x55\x12\x8a\x7a\xe5\x2a\x74\x69\x38\x68\x31\x7b\x9d\x83\x52\x83\x6e\x34\x95\x9c\xfd\xda\xd8\x25\x2b\x1b\xa9\xf2\xb2\x32\x09\x79\x03\xf1\x0e\x46\x6f\x45\xf7\x64\x11\xce\xac\xe5\xc4\x4a\x29\x5f\xe1\x9e\xce\x4e\x2f\x66\xbb\xb4\x79\x33\x21\x8e\xf1\xe0\x19\xde\x40\x83\x91\xc5\x02\x0f\x1e\x29\x34\x17\x06\x81\xf4\x00\xf9\xdf\xa9\x3c\xef\x78\x76\x82\x15\xa2\xbc\xbc\xfb\x5c\x58\x6f\x67\x9e\xe9\xd6\x91\x93\xed\x23\x07\xda\x80\x02\x97\x61\x28\x13\x95\x3a\x1c\x01\xd1\xef\xb9\xe1\xc4\xbe\x03\x31\x77\x7c\x3a\x91\xa3\xb3\xb3\xe3\xc9\x21\xe4\xfc\x47\x17\x94\xe3\xee\x38\x65\xbd\xde\xcf\xb2\x52\xc5\xdd\xff\xa1\x32\xf3\x2d\xd7\xfc\xf5\x3f\xe9\xd3\x77\xca\x7c\xd4\x79\x3e\xd5\xd6\xbd\xf8\x5d\xb2\xc0\x0f\xd4\xff\xed\x75\xeb\xff\x9e\x3f\x7f\xb6\xf7\x2d\xff\xfb\x47\xfc\x1c\x62\x8a\xa7\xc5\xbb\xe7\x58\xed\x06\x78\x2c\x98\x60\xab\x8f\x5f\x4f\x08\x3a\x41\x72\xff\xd9\xde\xb3\x01\x74\xed\x85\x88\x57\xbe\x9c\xb6\x8d\xc1\xab\x5f\x0b\x11\xf3\x30\xdb\x27\xc8\x59\xb6\x2a\x0b\xf9\x5e\x55\x79\x79\x8b\x9c\x7b\xd4\x06\x44\xc8\x07\x58\x4d\x46\x03\x83\x46\x4d\x06\xcc\x87\xbe\xcb\xa2\xb6\xfe\x1e\x8f\xc9\x31\x6d\x21\x2e\xbe\x29\xe5\x2d\xc1\x5f\x85\x08\x7a\xd4\xcd\xd5\x26\xb7\xcb\x6a\x07\xef\x42\xfd\x84\x6d\x96\x22\x6c\x85\x70\xc5\x80\xd0\xa9\x63\x2d\x0b\x1c\x45\xbd\x09\x3b\xfa\xa9\x08\x19\xf0\x9b\x7c\x3b\x10\x4b\x7f\x87\x08\x42\x13\x03\x76\x28\xe2\x95\x41\x8e\xc0\xd6\xe8\x16\x0f\x8d\xad\x0e\x39\x74\x58\xa5\x65\xc6\xf1\x71\x50\xdd\x39\xf6\x81\x98\x66\x7e\xcd\x5c\xf1\x38\x2f\xae\xb9\xe6\x66\x1d\x18\x89\x0a\xfa\x28\xb9\x8e\x30\xdc\x7e\xcf\xba\xf8\x4d\x26\xff\x4f\xf1\x93\x3e\x1d\x5f\x9c\x1d\xef\xee\xfd\x8e\xf0\xef\x0f\xc8\xff\x83\xbd\xfd\x57\x6d\xfc\xf7\xfd\x97\xaf\x5e\x7e\x93\xff\x7f\xc4\xcf\xb8\xa9\xca\xb5\x56\x85\xbc\x28\xec\x95\x0e\x19\x60\xe7\x5a\xfe\x94\xee\xa5\xcf\xa4\x3d\x21\x20\x9e\xed\x6d\x77\x5f\x38\x74\x1c\x86\xfb\xcf\x9e\xbd\x82\xc6\x5a\x71\xff\xd3\xb0\x1d\xd4\x3e\x2d\x46\x7f\xb7\xbf\xe6\x36\x14\xd7\x08\xb7\xa3\x8c\xe7\x08\xd1\x79\x79\x3b\xa4\xfe\xa3\x2c\xa8\x7a\xf6\xba\xa5\x07\x40\xc1\x8a\xd9\x51\xb1\x11\x01\x1a\x05\xa2\xf9\x04\xc0\x9f\x68\x2f\x5f\x43\x04\xa8\x8b\x1c\x37\xd7\x31\x80\x8f\xd8\x89\x9b\xfb\xb9\x03\x19\x1b\xd5\x6f\x80\xa7\xe4\x72\xc3\x58\x98\x5b\xeb\xac\xf1\xf7\x80\x96\x36\x4c\x51\xc3\xb5\xd1\xec\x1e\x3d\x45\x20\xb9\x8b\xe0\x5f\xfb\x56\x6e\x2b\x18\x3e\xb7\x6d\x06\x98\x3e\xfe\x8f\x76\x90\xbf\x05\x0c\x1f\xce\x0d\x1c\x21\x81\x58\x2e\x0e\x31\xc4\xc1\x68\x72\x41\xbb\x3d\x33\x76\x56\xb7\x59\x9e\x67\xc5\x15\x20\xe2\x79\x28\xd1\xd6\x33\x5d\x02\x27\x60\x86\x85\x5f\x4d\x8a\x68\x6d\x92\xd6\x64\x71\x01\x01\x94\x30\xfe\x83\x7d\x3d\x82\xdc\x23\x10\xf9\xff\xf8\x5f\xff\x37\xe8\x56\xa3\xe7\xbc\x8e\x0f\x95\x10\xfc\xf7\x6e\xc3\x35\xa0\x30\xe2\x09\x7e\x0d\xff\xea\xf2\x1b\xa1\x22\x7f\xda\x02\x02\xed\x00\x87\x77\xcf\x62\x12\x63\x82\x86\x68\x8f\x88\x1e\x66\x4a\xfb\xfb\xb1\x67\x59\xc3\xbf\x61\x53\xf3\x5c\x39\xb0\x1b\x9a\x41\xbb\xe3\x0b\x07\x4c\xbd\xd7\x1e\x86\x87\x41\x19\x9a\x7c\x01\xb6\x08\x51\xe0\x46\xe3\xd5\x3a\x11\xf7\x21\x68\x01\x4e\x42\x8c\xe7\x8d\xdd\x65\x61\x43\xfe\xdc\xf7\x79\x09\x3c\xbf\xe1\x5d\x2b\x97\x71\xaa\xaf\xb4\x2e\xea\x5a\x17\x0b\xec\x7b\xec\x7b\x29\xf3\xb5\x8a\x80\xa9\x48\xce\x73\x65\x4c\xb6\xdc\x20\x24\x3c\xa2\x92\xb6\x97\xe2\x07\x5c\x77\x7a\x33\x80\x47\x50\x86\x15\xf6\xa9\x85\xe1\xe5\x81\xe8\x3c\x6e\x50\x51\x57\x1b\xb9\xc2\xc2\x2b\xb4\x0a\x47\x14\xe9\xde\x7b\x91\xb6\x8f\x19\xdc\xa0\x9e\xf1\xd3\x31\xb1\xf6\x64\x0f\x20\x3b\x7f\x3b\x38\x07\xf8\x90\xeb\x66\xa5\x0a\x8f\x5c\x1e\x82\xad\x23\xd4\x12\x8b\x51\x34\x10\x4d\x1d\x00\x76\x03\x2b\x21\x91\xe2\x02\x9d\x75\xb3\x40\xab\x18\x41\x02\x82\xd7\xfa\x63\x46\xaf\x46\x18\xed\x85\xa6\xe7\xdb\xdb\x8e\xbc\x55\x79\xbe\xc1\x36\xd9\x79\xb9\x5a\x67\x39\x19\xb2\xf0\x29\x91\x19\xb8\x7c\x64\xc7\x47\x90\xc6\x20\x48\x1d\xe8\x20\x33\x7c\x59\xf7\x23\x18\x05\x5f\x97\xd7\xd4\xb8\x52\x37\x15\xa2\x9a\x20\xe6\x08\xc6\x39\xf0\x04\x07\xe0\xea\x3d\x17\xd0\x08\xb7\x3e\x5e\xd8\xc4\x37\xfe\xd0\x77\xc2\xec\x98\x21\x4e\x78\xdb\x1b\x6f\xaf\x4b\xb6\xbd\x8d\x8c\x9f\x2c\x82\x27\xc7\x98\x93\x3e\x8c\xec\xf5\x22\x32\x58\xa0\xb1\xdd\x39\xa7\x9d\x85\xd0\xd0\x8b\x03\xf8\x2a\x8f\x18\x9f\xfa\x48\xe8\x2b\x98\x62\x25\x0e\xf4\x99\x6f\xb6\xef\xd1\x3c\x7e\x51\xe0\xf8\x1e\xb5\x9a\xc7\xec\xaa\x1e\x86\xf0\xcc\xaf\x05\x81\x1e\x41\x1b\x97\x06\xe9\xce\x74\x82\x89\xcc\x75\x81\x78\x43\x15\xf2\x02\x26\x11\x35\x74\x12\x22\x3d\x17\x57\x89\x80\x8a\xe0\x55\x56\xe3\x1f\xdb\xc4\xaa\xd0\xea\xe3\xe9\x54\xcb\x62\x37\xcf\x90\x7d\xa4\x5c\x2e\xe1\xbf\x13\x0f\x90\xe8\xb7\x9b\x3c\x25\x0c\xce\x21\x06\x91\x57\x4c\x5b\xd6\xcf\x25\xf0\x67\x1e\xc4\xaa\x83\x04\x17\x4a\xc8\xb9\x46\x3d\xef\xc4\x3b\x11\x94\x74\x29\x2a\x76\x7b\x38\x2a\x64\xcc\x51\x21\x4c\x73\xb9\xdb\x26\xa9\x98\xc3\x85\x6d\xf3\xb6\xf4\x73\x47\x78\x06\xba\x1b\xcd\xd8\x89\x7d\x3a\xdd\x8b\x29\x86\x84\x71\x48\x30\xf6\xb2\x07\x70\x90\x70\xa5\xc1\x1f\xcd\x73\x3c\x4e\x49\xf8\xf5\xb8\x5b\x0e\xac\x30\x3c\xba\xdb\xe8\x19\x98\xe3\xee\xa3\xee\x36\x26\xb7\x14\x4d\xf0\xb4\xa8\xc9\x39\xe6\x56\x09\xdd\xf0\x36\xf7\xbc\x57\xab\xc8\xc1\xb0\xce\xd5\x46\x84\x46\x29\x9d\x1a\xee\x88\x8e\x1e\x4d\x98\x63\x48\x74\xc2\x0c\x25\x49\xa8\x75\xa9\x6b\x2e\x09\x47\xeb\x97\xa6\x45\x77\xd0\xff\xca\xe8\x1b\xf6\xd2\xc0\x5b\x01\xbf\xfd\x91\x5f\xf2\x47\xc6\x9d\xd3\xac\xb8\xe7\xcb\x60\x97\x96\xfe\xc3\x73\x55\x00\x9c\x18\x01\x20\x2e\x10\x52\x79\x83\x4c\xeb\x09\x57\x27\x18\x3e\x07\x2b\x55\x1b\x8f\x48\x55\x94\xb7\xf2\x63\x51\xde\x82\xd6\xce\x15\xc0\xbb\x61\x99\xea\x02\x56\x6a\xa9\x2a\x5e\xb0\x36\xac\x2b\xe1\xe0\x98\x32\x15\x62\x12\xaa\x57\x3b\x56\xa4\xfd\x84\x92\x68\x1e\x27\xa0\xca\x24\xb1\x29\x75\xab\x00\x85\xc2\xaa\x74\xde\x78\xe1\x90\x1c\xed\x6f\x83\x27\xb4\x51\x66\xed\x3d\xc2\xbb\x4c\xb0\x71\xce\x90\x80\xa3\xa3\x01\x7f\x33\xbb\x41\xdc\x16\xbe\x88\xcc\x40\x8b\xf5\xa6\x73\x1e\x1b\x8c\x16\x5b\x45\x11\xb3\x34\x6d\x09\x05\x92\x06\x34\x04\x27\xd2\x3b\xb2\x40\x3a\x59\x40\xa2\xdb\xa3\xa4\x7a\x9a\x03\x42\x32\x6b\xd9\x95\xc9\x83\xf8\x64\xe8\x2e\x89\x1e\x81\x16\x5c\xb8\x1e\xf3\xd4\xa5\xbf\x0f\xfb\xe0\xf9\x03\x2b\xa5\x35\x69\x7b\x3b\x98\x78\xc5\x3d\x9e\x5a\x56\x29\x9a\xd6\x02\x36\x47\x8a\xeb\xae\xa9\x0b\xf8\x6e\x5e\x4a\x05\x4e\x54\xf4\x59\x78\x4e\xeb\x88\xd0\x27\x0d\xf0\x3c\x2e\x08\x2d\xdf\xf1\xa7\x3c\x96\x05\x06\xf5\x89\x23\x7f\x11\x1d\xf2\x17\xcf\xa6\x10\xbd\x3d\x34\x4d\x08\x75\x0c\x6c\x12\x00\xb9\x67\x54\x1e\x11\x39\x66\x5d\x96\x32\xcc\xa0\x7a\x34\x28\x12\xa3\x21\x91\x0b\xd1\xe4\xb6\xb0\xec\xad\xa5\xab\x4c\x46\x70\xae\x4b\xe0\x25\x27\xe2\x16\x87\xb5\x15\xb0\xb6\x44\x23\x77\xcc\x2d\x22\xc6\x62\xe8\x1a\x58\x6e\x4c\xae\x48\xe0\x38\xc0\xa6\x2d\x8b\x40\x29\x89\x5e\x54\xac\x79\x07\xfc\x76\xa1\xd7\x15\x43\x01\x7a\xfb\x07\x57\x1a\x31\xd0\x6a\x83\x9c\xad\x00\x31\xc7\xc8\xb8\x20\x84\x3c\x30\x8a\xbb\x0f\x7c\xa5\xe8\xd4\xc7\x4a\x1d\x81\xd4\x44\x2f\x79\x53\x10\xb6\x48\x3c\xfb\xf4\xb5\x6a\x8c\xbf\x01\x81\x28\x05\x83\x44\xa0\x7d\x11\x8a\xbb\x60\x39\x3c\x5a\x0d\x96\x04\x9c\x3a\x7e\x9f\xd8\x0c\x33\x9a\x6e\xd3\x15\x53\x33\x05\x43\xf6\xee\x07\xca\x9c\xcc\x84\xd8\x99\xa6\x5c\x61\xdf\x42\x95\xcd\x5d\x53\xba\x28\x83\x17\x65\xab\x75\x69\xfc\xb5\xe7\x17\x5a\x97\x0d\x78\xf7\x82\x8f\x32\x05\x6b\xc8\x17\x17\x72\x08\xc0\x88\x5e\xc7\x1b\x85\x90\x18\x1f\xb5\x5e\xdb\x4d\xb5\x16\x62\x2f\x2b\x83\x2c\x2b\x11\xf0\xaa\x30\x2c\x06\xe3\x65\x3b\x98\x0c\x7b\xa9\x00\x5f\x23\x12\x9f\x64\x99\xd0\xaf\x7c\x93\xbd\x28\x97\x01\x58\x7f\x1a\x9b\xd0\xd0\x49\xce\x94\xf6\xca\x5d\x60\x88\xf6\x44\xef\x87\x3f\x89\xd8\x2e\x26\xda\xa7\x1b\x5d\x6d\xba\x57\xff\x5a\x3f\x35\x61\x8f\x7e\xbf\x2b\x92\x8a\xee\x70\x10\x7c\xb0\x87\xd1\xc1\x13\x38\x78\xfa\x06\x87\xb6\x82\x50\x2b\x3e\x1d\x80\x83\x60\xd8\x22\x97\x1c\x60\x38\x02\x80\x26\x6e\x39\xda\x29\xe6\x68\x20\x59\x3f\x07\x90\x90\xd7\x2c\x66\xdd\x08\x1f\x98\x4f\xcb\xea\x6e\xc1\xa6\xf4\x61\xcf\xdc\x8f\xc6\x0d\xc0\x45\x0f\x7a\x1e\x10\x4b\xb2\x36\xcb\xa2\x2c\xb6\x38\x33\xa1\xf2\x8a\x96\x7c\xe7\x52\xcf\x4b\xcc\x72\x91\xa4\x1b\x5a\x0b\x08\x60\x0f\x81\x7b\x08\x79\x21\x4a\xda\x12\xd6\x18\x0a\xf1\xa4\x8d\x08\x61\x10\x4d\xa4\x37\xbb\xb3\x25\x18\xf9\xbc\xc6\xc7\xf2\x95\xf4\x63\x6d\x1d\x30\xd8\x90\xd5\x5a\xd5\x19\xe1\xe4\x6f\xdb\x95\xa3\xee\xae\x1c\x86\xbb\xd2\xa1\x49\xe9\x5a\xba\xc1\x3e\x5c\x96\x04\x30\xd1\x65\x8b\x53\x05\x0a\xb3\xdb\xb2\xfa\x28\x5a\x28\x38\x4a\xf2\x60\x73\x1d\xc6\xe5\x32\xf3\xb0\xef\x28\xc8\xe8\xbc\x77\x03\xbb\x8f\x47\x14\x2e\x08\xbe\x01\xd3\x3b\x21\x5d\xe1\x32\x25\x72\xd0\xfd\xc6\x20\xc2\x9a\xd2\xbe\xae\xc2\x43\xcb\x93\x6d\x6a\xfd\xd5\x4f\x22\x56\xb5\x61\xbc\x79\x76\x0d\x71\xb2\x70\x1f\x9e\x98\x48\x54\xfa\x79\xf8\x71\x08\x96\x1d\x8c\xe8\x8c\x42\xe4\x3a\x33\x4f\x01\x17\xb1\xe7\xeb\xed\x28\x67\xf0\x19\xe1\x08\xa5\xdb\xf3\x64\x90\x26\x44\x0b\x4e\x85\x38\x0b\x81\x70\xa3\x40\xd2\xcf\xd7\xba\x88\x9c\xf1\xee\xc5\x46\x0c\x97\xb6\x3f\x9d\xc4\x87\x10\x2e\xe1\x17\xf1\xea\x61\xd4\x32\x30\x83\xfa\x6d\x98\xcc\x99\x85\x7c\xcf\x3b\x46\x8c\xf0\x8e\xdd\x56\x1b\x46\x6b\xb9\x8d\x7d\xae\x2b\xc9\x44\x60\xc3\x1c\x43\x38\xe0\xac\x2a\x6b\x04\xe2\x7a\xdd\x1f\xc9\xec\xcd\x35\xb3\x37\x0d\x7a\x4d\x00\xdc\x4a\x12\x12\xab\x31\x7e\x9d\xa4\x7f\x96\x95\xc7\x64\x89\x8d\x79\xed\x98\xde\x5c\xb0\x73\x09\x42\xc4\xb1\x38\x00\x78\x61\x63\xea\x12\x20\xc7\x09\xdb\x27\xe0\x49\xac\x1d\x62\x54\x6c\xc5\x16\x0b\xc1\x5e\xbb\x37\x39\x0b\x0e\xc5\xf6\x59\xa0\xae\x0c\xed\xf0\x5a\xe1\xd3\x46\x1e\xbe\x53\x84\xc8\x84\xa1\x6b\x56\x91\xcf\xc3\x2a\xca\x3f\xb5\xd7\xd6\x62\x02\x01\xc7\x57\x65\xcd\x1a\x24\xe2\xbc\xdc\xc8\xeb\x6c\x85\x37\xa6\xf2\xc0\x58\x75\xe9\x7e\xed\xd2\xdb\xa4\x87\xaf\xf1\x28\x20\xee\x2f\x8a\x32\x4c\x06\xd5\xe0\x0e\xe1\xd6\xc5\xa2\x77\x6c\x4d\xfa\x20\x12\xf8\x98\x19\xc4\x91\x6f\x7a\xf7\x65\x95\x15\x57\x46\x84\xe9\x2f\x80\xbd\xfc\xfa\xa9\xc0\xe9\xfc\xd2\xa9\xd4\xd9\x0a\xb0\xd4\x12\x8c\xb0\xba\x70\x3e\x63\xa2\xc9\xf8\x5e\x77\x77\xd0\x1e\x14\xd3\x5c\x12\xa3\x4d\xb8\x34\xe4\x38\x52\x70\x2b\x08\x52\x21\x7d\x62\xdc\x43\x48\x68\xee\xf8\xa6\x07\x95\x35\xd5\xc6\xf5\xf3\x43\xe1\x59\x63\x1f\x90\xc2\xfc\x19\x35\xa7\x01\xdc\xbe\x8b\x80\xd3\xd5\x2f\x1b\x93\x6f\xac\x42\x77\xb0\xa1\x45\xb3\xd2\x55\xd9\x18\x11\xc2\x1f\xa5\x72\x02\xd9\x00\x00\xa2\x83\xc6\x57\xa0\x6b\xbd\x65\x3d\xb8\x42\xd6\x5a\xc0\x03\xc0\xdb\xa2\xe0\xae\x2d\xf5\xbc\x06\x9b\x60\x70\xd9\x5c\x99\x81\xcc\x8a\x6b\xe4\xde\x63\xf5\x51\x6f\x30\x88\xd8\x46\x20\x02\x20\x51\x21\x58\x9d\xa1\x19\x8f\x77\x3b\xe9\x77\x74\x3b\xb1\x6b\xa6\xbe\x52\x46\x66\x66\x20\x2e\x95\xc9\xd0\x78\x65\xf4\xae\x98\xb2\xca\x5a\x33\x1f\x33\xe4\x30\x99\x13\xa5\x82\x3f\x01\x3e\x88\xc6\x10\x4e\x81\x1f\xd5\xe2\xb6\x4a\x1e\x64\xb6\x4a\xa4\xba\x34\x1c\x2f\x09\x56\x49\x57\x15\x94\x50\xaa\xf9\xbc\xa9\xd4\x7c\x93\x74\x88\xb4\x00\x9b\xaa\x8f\x4b\xd2\xb9\x58\x10\x76\x82\x0c\xaf\xbf\x8d\x0a\x0d\xe2\x38\x1d\xf3\xb2\xe7\x70\x9d\xc7\xcc\x54\xd2\xfb\x0a\x1b\x38\x51\xfd\x1c\x59\xb1\xc7\xa1\xbc\x01\x28\x22\xd6\x3d\x5e\x65\x1a\x69\x70\xff\x5d\x65\x64\x7c\xac\x1d\x6a\xa7\x10\xc4\xeb\xc9\x69\x26\x45\xf8\xe6\xb7\x59\xbe\x6c\x72\xb9\xca\x0c\xd1\x4c\x40\x1c\x93\x80\x3b\xb1\x3a\x13\x58\xdb\x18\xb6\x8b\x82\xda\x82\x28\x07\xdb\xd1\x32\xab\x4e\xb3\x42\x16\x25\x10\x57\xd6\x01\xeb\x55\xcc\x75\x15\x01\xa4\x0b\xc6\x24\xc3\x54\x5f\xa5\xf2\xa4\x4d\x6d\x65\xcf\x55\xe2\x68\xad\xec\xd9\x6b\xad\x5b\xe9\x52\xe3\x9d\x94\x7d\xe7\xe4\x6d\xe3\xb1\x92\x1d\x1e\x2b\xf1\xa5\x3c\x56\xfc\x84\x85\xaa\x15\xd3\xaa\x78\x1a\x2b\x81\x2f\x4b\x98\xd5\x33\x5e\x3c\x0f\xb1\xbb\xb8\xc1\x30\x29\x31\x35\x3b\x88\x08\xef\x4a\xe2\x83\x52\xe1\x00\xb9\xbb\xdb\xe0\x97\x9e\xa8\x12\x6b\x55\x37\x60\x06\x31\x7a\x99\xa7\xcb\xca\xd5\xad\x11\x14\x4c\x45\x0e\x2c\x75\x6b\x62\xea\x2c\x7f\xca\xbe\x4f\xe5\xc8\x3b\x2d\xc0\x80\x0c\xad\x28\x42\xfc\x7c\x9d\xe5\x3a\xb6\xfc\x7a\x23\x1e\x6d\x9f\xcd\xe3\x89\xcf\xaf\xcb\x12\xc8\xe1\x00\xbf\x00\x9d\xe8\x22\xf4\x91\xdc\xeb\x00\xfa\xdb\xfa\x53\xc4\x2e\x70\xad\xaa\x2b\x6b\xee\x2d\x35\x9c\xb5\xa4\x45\x98\xe5\x5a\xe0\xf8\x36\x02\xdb\x9a\x5e\x41\x79\x9f\x4b\x07\x05\x4b\x12\x85\x28\xd0\x9a\x63\x64\x60\x60\xbd\xb3\xd6\x7d\x51\x33\x76\x5e\x68\xc7\xbb\x3d\xc9\x0a\x6e\x75\x28\xae\x70\x59\x83\x87\xc2\x9c\x21\xbc\x0f\x09\xae\x22\xdf\x48\xe6\x2f\x2a\x6f\xad\xeb\x72\xad\xf2\x25\x4c\x8d\x7f\x6d\xca\x3c\x00\xb2\x27\x41\x09\x6e\x25\x7f\x9c\xad\xf7\xae\xa6\x8d\xa8\x74\x03\x3d\x9b\xd0\x1b\x3c\xb8\x2c\x2c\xb0\xdd\x00\x5a\x9e\xe5\x26\x01\x01\x0b\xf7\xaf\x58\x40\x1d\x0a\x32\x53\x87\x96\xcc\xb5\xaa\x56\xb9\x13\xd8\xc0\x25\xc4\x0b\xc9\xac\x1e\x82\x38\x18\x88\x22\x57\x19\xa3\x2b\x28\x68\x20\x36\x22\x58\xa0\xf0\x99\x14\x7d\x5e\xda\xf5\x71\x8c\x90\xd4\x70\x83\x3c\x98\xf0\x15\x27\x5e\xed\x9b\xfd\x41\x71\x03\xa0\x8a\x8f\x67\x69\x48\xe4\x16\x4b\x0f\xd4\xfa\x9e\x02\xa7\x53\x28\x43\xce\x24\xbf\x1c\x48\x19\xf2\x6c\x0e\x69\x43\x54\x92\xd9\xbc\x2c\xe4\x60\x82\xcb\x37\x10\x54\x30\xe3\x55\xea\x65\x59\xd7\xe5\x0a\x33\xb1\xb7\x59\xb1\x28\x6f\x39\x5b\xc4\xb7\xa4\x8b\x9f\x0f\x62\x4d\x5c\x6e\xa4\x5a\x2e\xb3\x6a\x45\xb8\x97\x44\x19\x17\xec\x27\xc3\xa9\xdf\xaa\x0d\x1f\xba\xb2\x5a\x28\x17\x50\x82\xb8\x5e\x93\x13\x63\x75\x94\x24\x49\xe5\x61\x30\x0f\x2c\xdf\x9c\x97\xc5\xa3\x28\xe9\x84\x6a\xad\x67\x30\xee\xc7\x50\xd2\x09\x31\xc3\x81\xe7\x9b\x04\x20\xf1\xfd\xb3\x37\xb4\xd4\x5f\xfc\x50\xbb\x5a\x01\x0b\x49\xa0\x2c\xbb\x1c\x5b\xac\xc6\xf7\xdb\xa3\x4f\x90\xe3\x57\x39\x1e\xe1\x58\x9f\xd4\x61\x6a\xdd\x33\xd9\x76\x49\x6b\x49\x75\x87\xb1\x0a\xd1\x1b\x6d\x8a\xe9\x70\xb7\x26\xd5\xec\x31\xde\x4b\xe5\x24\x60\x5a\x8f\xd2\x89\x90\xe5\x82\x5a\x1d\x26\xb3\x7d\x30\xce\x15\xbe\xf2\x72\x43\x94\x26\xe5\x52\x6a\x6b\x1d\x55\x65\x91\xcd\xc5\xbc\x6f\xa8\x3b\xf6\x9e\xeb\x4f\x6a\xb5\xce\x75\x62\x7f\x09\xa2\x18\x39\xb2\xe4\xa2\xbc\x2d\xf2\x52\x2d\xfc\xa3\x31\x90\x2e\x2a\x0d\x38\x9f\x79\x39\xa7\x6e\xcc\xba\x8d\xe0\x6e\xad\xc0\x42\xa3\x21\xa0\x17\x99\x6a\xbd\x48\xc9\x5b\x7d\x69\xb2\x5a\x0f\x05\x44\x36\x55\x2d\x73\xad\x4c\xed\x93\x40\x51\x7a\xd5\xfe\x67\xcc\x4b\xff\x6b\x83\x49\x6b\x92\x2d\xfe\x32\x88\x5c\xdd\xca\x4a\x5f\xa9\xca\x25\x7a\x99\x54\x77\xee\xd1\xb5\xd5\x62\x81\xd4\xae\x6d\x5f\x3a\x14\x26\x1c\x11\xbd\x55\x40\x51\x41\xb8\xa7\x3e\x29\x02\xb4\xa1\x48\x79\x95\x58\xdb\xa2\xd2\x9c\x92\x75\x95\xe0\x38\x3c\xe1\xc2\xe6\xb8\xf7\xfb\x69\x44\x52\xd7\x27\xc3\xa2\xc0\x75\x37\x0b\xe7\x3d\x5f\x30\x11\xb6\x11\xd8\x41\xd0\xce\x1e\xa0\xcb\x0a\x24\x7d\xab\x5e\xab\xcd\xdb\xd3\xf2\x0d\x67\xc0\xc2\x14\x11\x2c\xc1\xdb\x80\x9f\xc5\xbd\x31\x8a\x95\x31\xc7\xba\x2f\x30\xb9\x86\xb0\x04\x42\x6b\x8b\xf8\x1c\x45\x43\xe9\x38\x2d\xbe\x92\x1d\xd5\x03\x19\xaa\xb2\xd2\x2b\x95\x15\x22\x2b\xe4\xb2\xc1\xda\xfe\x75\x9e\xc5\x32\x32\x72\x11\xf7\x0e\xd2\x98\x01\x4a\x88\x9f\xc9\x7c\x5c\x57\xfa\x97\x66\x41\x64\x17\x2c\x45\xbe\x47\x17\x2b\x3a\x0a\x21\x15\x02\x7a\xf7\xf6\x18\xd7\x5a\x78\x2b\xe6\x52\xd7\xb7\x9a\xaa\x30\xcf\xa0\x21\xda\x40\x90\x29\x70\xed\x9d\x0b\xef\x76\x2f\x15\xa2\x9f\x8d\x4a\xc7\xe9\xae\x1b\x95\x67\xc0\xab\x13\x91\x51\x71\x74\x35\x3a\xfb\x14\x57\x75\x1b\x45\xe4\x90\xf6\x91\xf0\x14\x62\x1c\x76\x8f\x71\xe6\x68\xe4\xbc\x18\xa1\xec\xee\xe5\x3a\x95\xb3\x98\xf0\x8a\x4d\x52\xe8\x04\xad\x1a\x5f\xc8\xe8\x08\xb0\xb0\x02\xd1\xe5\x94\x45\xc0\x79\x85\xf3\x00\xc2\xb1\x88\xfd\xea\xbc\x5d\x53\x4c\x61\x32\x48\x0b\x37\x56\x4b\xd6\xa5\x24\xa2\xb4\x4a\x15\x26\x8f\xed\xb9\xcb\xac\x20\x4a\xdf\x5b\xe1\x1a\xe9\xba\xba\xa0\x04\xb3\x18\x7e\x99\xf9\x58\x19\x5d\x59\x8e\x95\xa5\xf2\x44\xdf\xb6\x1a\x32\xc2\xbc\x0e\xce\x9e\x20\xee\x19\x73\x59\xc9\x06\x21\x25\xb8\xc3\xa2\x68\x56\x97\xba\x22\xfe\x0f\xff\xbc\xf6\xe3\x20\xc3\xa0\x8d\x9b\x80\x95\x91\x60\xbb\x19\x69\xca\x12\x2a\x93\x41\xc7\xc1\xc7\xa4\x82\xb0\x00\x2a\x4d\x81\x92\x91\xb3\x33\xf6\x9c\x3f\x4f\x23\x6a\x44\x21\x46\x60\xbe\xd5\x64\xa8\x12\x7d\x30\xbc\x86\x6f\x9f\x2b\xb5\xeb\x25\xb1\x73\x7e\x9a\x08\x0f\x77\xcf\x3e\x45\x71\x23\xb6\x45\xed\xa9\xf6\x91\x24\x5a\xb8\x36\x83\x4f\x44\x6c\xe8\x42\xd6\x0d\xba\xd3\xff\xd4\x18\x66\xa2\xe9\xbc\xb8\x29\x88\x47\x4c\x19\x99\xab\x6c\x01\xba\x0a\x6c\x26\x36\x06\x0e\xbe\xe3\x2f\x9e\x03\x9d\xaa\xd4\xa6\x56\xb0\x6b\xac\x17\xba\x55\xec\x69\x67\xd1\xd8\x53\xe5\x15\xa0\xab\x1d\xd5\x8f\x6f\x5b\x15\x81\x27\xeb\x8b\x57\x9d\x0f\x99\x5f\x2b\x11\x27\xa7\xfb\x56\xcd\x8a\x24\x0d\x9e\x0c\x30\x56\xfa\x34\x7f\xc8\xe7\x02\xe4\x94\xe2\x21\x2a\x4a\x3a\x4f\x2f\x52\x39\xf2\x36\xe6\xb1\xba\xa5\xa0\x48\x9c\x47\xb8\xd4\xf2\x0a\x88\x37\xbd\x32\xb6\x1a\xb8\xbd\x67\xd8\x0b\xc0\x45\xb1\x30\x38\xd1\x37\x38\x49\xfe\x33\xd4\xe9\xe8\x2b\xeb\x9c\x55\xe0\x41\x2f\x5d\x70\xf9\xdc\x71\x2a\xdc\x37\x88\x1f\x75\x7e\x95\xa9\x02\x2b\x76\x96\xaf\xb1\x36\x4c\xb5\xb7\xd6\xde\xbd\x2f\x3f\xdb\x22\x3c\xdb\x3f\xe0\xa3\x63\x33\xe2\x11\xa7\x03\xa6\x09\xa4\x38\x76\xe2\x14\xfa\xf0\x53\x16\x38\x65\x99\x15\x06\xb3\x26\xfd\x4b\x69\x4f\x2c\x67\xa4\x44\x4f\x56\xcb\x0c\xc8\x8b\x20\x93\x8e\xaf\xc7\x0b\x2c\xcc\x57\x95\xc6\x12\x3f\x3b\x85\xb7\x58\xa9\x1b\x75\x6c\x18\x2d\x77\xde\x9e\x1d\x0f\xe5\x4d\x2a\xf7\xdd\x27\xfb\xd9\x87\x76\x4e\x67\xf4\xc1\x74\x2f\xb1\xff\x7f\x90\x3e\x73\x5f\x39\x04\xa2\xbe\xf6\xb3\x6f\x52\xb9\x17\x7c\x68\x3c\xcf\xb3\xb5\xd1\x0f\x7c\xea\x50\xcf\xed\x0d\x81\x17\x3d\xfb\xd6\x62\xf6\xdb\x7f\xd2\xa7\x87\x47\xc7\xa3\xdd\xd9\xb5\xb2\x96\xff\xef\xd3\x07\x76\x7f\xff\xd7\xfe\x8b\x17\x2f\x3b\xfd\xbf\xfb\xfb\xaf\xbe\xf5\x7f\xfd\x11\x3f\xbe\x8b\xeb\x48\xd5\x2e\xff\x23\x47\xce\xb8\xdd\x95\x74\x36\xe4\xae\xf4\x10\xd0\xcf\x48\x21\x50\x17\xc1\xe3\x9f\x92\x84\x0f\x91\x3b\x03\xf7\x91\xc1\x30\x15\xf0\xe5\x30\x9d\x41\x8e\x7e\x90\xf4\xf6\x8f\xbc\xdc\x60\x08\x8b\xd4\x0d\x7c\xf7\x0c\xbf\x58\x99\x54\x7c\x00\xe8\x5f\xae\xf2\xe4\xa2\xee\xa8\x40\x8a\x2a\x77\x49\x2a\x07\x85\xdb\x3a\x2f\x6f\x1d\xde\x49\xad\x0d\x3e\x2c\x08\x95\x80\x91\x13\x46\x31\x2f\xb5\xbc\x2c\x9b\xc2\xa9\xa0\x5e\x32\x78\xae\x44\x70\x73\x20\xf3\x97\x6b\xd5\x30\x76\x03\x93\x8a\x66\xc3\x4e\x94\x41\x3b\x82\x4a\xdd\xe1\x23\x41\x47\x50\x41\x6d\xbf\x01\xa1\x11\x7e\xfe\x88\xe2\xd8\xbe\x58\xde\x39\x5c\xdb\x68\xeb\x91\xf3\xfd\x52\xcb\x85\x1d\xa8\xf5\xc2\x96\x00\x0b\x51\x20\x62\x90\x1d\x94\x27\x59\xc7\xc2\x2f\xf6\xcf\xd9\xa4\xf1\x93\x94\x23\xd6\x42\xf9\x26\x11\xd1\xcc\x76\x8c\x27\xe1\xc3\xee\x40\x32\xb2\x06\x43\x0a\x62\x46\x14\x75\x52\x7a\xda\xab\x56\xf7\xd7\x5e\xba\x27\x07\xa3\xc5\x82\x29\x5d\xeb\x12\xc2\xc5\x84\xe7\x03\x2f\x05\x73\xfd\x03\x07\x67\xa1\xc3\x69\xa5\xcb\x42\x4b\x9d\x1b\xfd\xc4\xc0\x87\x12\x6f\xb4\x59\x37\x13\x3e\x3d\xe0\x48\xb9\x49\x07\x2e\x6a\x6e\xe4\xa2\x24\x8a\x49\x0c\x71\x4f\xe1\x7b\x40\x09\x98\xee\x63\x91\x49\x53\x13\x73\xb6\xbc\x30\x9a\x07\x86\x47\xa9\x50\xf9\xc6\x64\xc6\x4e\x1a\xd8\x7c\xc3\x28\xd5\x3c\xfc\xaa\x58\x68\x64\xb2\x0b\x37\x70\xe8\x83\xdd\x5d\x83\xd2\x4e\x23\x95\x3f\x3a\x5e\x2d\x0a\xbc\xc0\x01\xb1\x03\x0e\x13\x27\x7d\xc3\x74\x7c\x28\x41\x70\xc5\x75\xa0\x60\x2a\x24\x18\x1e\xcc\x04\x62\x0e\x1e\x5d\x8f\x38\xa9\x31\xcb\x07\x09\xaa\xb0\xe3\xc8\xcd\x9d\x03\x5c\x70\xe9\x0b\xb1\xc8\xae\xb2\x5a\xe5\xd8\xaf\x54\x97\xd4\x3c\x54\xc7\xd1\x1f\x75\x69\x9d\x77\xf8\x0a\x12\x45\x1b\xb9\x56\x75\xad\x2b\x48\x63\x55\xba\x58\x00\x48\x68\x85\xbc\x7f\x04\x22\x4a\xa4\x5b\xf0\xdf\xc6\x5f\x7d\x55\x73\x79\x14\x6c\xda\x81\x1c\xd8\xe7\xba\x03\xd4\x8a\x3b\xed\xf8\x14\x94\x4b\x29\x52\xd3\x97\xfb\x90\x0f\x3a\x66\x94\xf9\xaa\x20\x24\x3c\x4c\xe4\xbc\x84\x64\x65\x76\xa3\xf3\x0d\x27\xce\x90\x83\x39\xdf\xb8\x42\x79\xd7\x5c\x57\x56\xf2\x0a\xb8\xec\xb0\xe1\x4c\xb5\xe4\x01\x72\xef\x8f\x91\x33\x59\xcd\x6b\x0a\xfd\x5a\x11\x82\x49\x04\xa8\xf2\xc6\x55\x67\x59\x57\x69\xc1\xf2\xad\x4f\x9c\xc2\x12\x3c\xc7\x25\x70\x2f\x1a\x38\xce\xe8\x0d\xbf\x2d\x58\x06\x28\xaa\x05\x1c\x45\x4d\xe4\x6b\x48\x71\x5c\x56\x82\x53\x5c\x3c\x44\x66\x6d\x03\x89\x7e\x46\x1c\x71\x28\x97\x5c\x9a\x24\xfe\xce\x10\x85\x21\x7d\x56\x1b\x94\x1b\xbd\x8a\x00\xd9\x83\x50\x55\x54\x72\x0a\xa2\x0f\x29\xf2\x61\x52\x2f\xe4\x60\x5c\x5c\x5b\xb1\xbd\x90\xed\x0d\x86\xc2\x85\x9a\x6f\x8d\x74\xf2\x93\x87\xe8\xf1\x10\x8c\xb0\xe7\xbe\xa4\x94\xde\x8e\x1a\xe2\xdb\xbc\x38\xa0\x78\xc4\xce\x65\xcc\x40\x0c\x92\x08\x1e\xee\xd2\x1f\x2e\x24\xb6\x75\x1f\x5e\xda\x21\xdb\x55\x08\x37\x80\x5b\x91\x28\xc0\x06\x09\x21\x4f\xb8\x49\xba\xe3\x53\x66\xea\xa0\xc6\x4c\x40\x0e\x90\xb4\x5e\xe4\x3a\x66\x05\xdf\x4a\x28\x69\xa0\x47\xe9\x85\x3d\x39\x57\x78\x18\x3d\xc5\x37\x64\xd3\x99\xbf\x3b\x22\xe9\x4e\xa0\x68\xa5\x4b\xd2\xed\xfb\xc7\x90\xa5\x5b\x86\x2c\xdd\xa8\xa7\x88\x88\xda\x15\xeb\x7d\x19\x63\xb7\xea\x61\xec\xf6\x37\x0b\xff\xf5\x65\xac\xdd\x82\x58\xbb\xe5\xc3\xac\xdd\x76\x93\x21\x47\x17\xb2\x6b\x03\x3d\x37\xb8\x7d\xc0\xdf\x2d\x22\xfe\x6e\xb9\x95\xb7\x1b\xe9\x4a\xe7\x4d\x85\x41\x0d\xd7\x67\xef\x49\xbc\xc5\x36\x12\x6f\x69\xdd\xcd\x9d\xc5\x90\x8a\x43\x30\x9c\x67\x1d\xbd\xf5\xba\xcc\x8a\x3a\x9a\x89\xb3\x56\x84\x75\x35\xb1\xc0\x1a\x6a\x93\xd4\x2f\x58\x24\x54\x2e\x69\x81\xca\x8a\x44\x33\xdd\x44\x38\x91\xaf\xe4\xe0\x58\x2f\xae\x02\x91\x20\x59\x5e\x57\xda\x6a\x77\x77\x87\x7c\x1b\x4b\xb9\x0c\x3a\x8d\xe0\x6f\xec\xa8\x0b\xe6\x05\x77\xc7\x3e\x91\x8d\x4b\xf6\x80\x1e\x29\xf3\xf2\x6a\x63\xef\x0b\x84\x4f\x28\x37\xaf\x78\x86\xf4\x4e\xa8\x3d\xaa\xed\xba\xc7\xaf\x4e\xe2\xe2\xa2\x24\x28\xa2\xf2\xf7\x31\x8e\x1a\xb4\xcc\xb2\xbd\xf4\x3b\x22\xae\xde\x04\x16\xc5\x42\xe7\xba\xd6\x89\xd4\x95\x32\x90\x02\xa8\xb8\x0e\xa2\xd2\xbb\x90\xc2\xbc\xd2\x7d\x66\xc4\x20\x92\x08\xe9\xa0\x25\x21\xee\xb1\x24\xbe\x97\x03\x92\x45\xc1\x30\xb0\x69\x2d\x87\x0c\x8b\x6a\xcb\xb0\x40\x40\x83\x84\x62\xd9\x07\x02\x74\x18\x18\x8c\x94\x7e\x5c\xa9\xa2\xd0\xcc\xed\xaa\x21\x0e\x8a\xa1\xa1\x0b\x3b\x45\xff\xb0\x4b\xee\xd2\xb1\x73\xe2\xa2\xf8\x42\xae\xaf\x37\x06\xb4\x3f\xa6\x7a\x60\x29\x20\x41\x84\xb9\x12\xbc\xde\x8e\xae\xad\x5c\xd2\xa1\x4a\x9c\x58\xe5\xf9\x38\x1b\xde\x8f\x90\xda\x99\xbc\xaa\x84\xac\x02\x15\x60\x91\xe6\xa1\xed\x53\x35\x3d\x18\x0a\x88\x8a\x2b\x75\x85\x5d\x3f\x2a\xd0\x4a\xb0\x5c\x57\x64\xb0\x73\xc7\x1e\x14\x87\xb0\xf8\xc4\x47\x3c\x61\x2d\x9a\x8a\x11\x2d\x3f\xee\xd4\x40\x96\xf3\x79\x53\x19\x34\xd1\xb9\x72\x2e\xd2\x67\xb0\x69\x7b\xcf\xe4\x00\xd5\x10\x91\x86\xd3\x3f\x4c\xb0\x87\xa0\x09\xa0\x52\xe4\x2a\xbb\xd1\x05\x2d\x17\x1f\xce\x04\xf2\x6b\x79\x0e\xd3\xc1\x05\xcd\xf1\x22\xee\xed\xd9\xc7\xc1\x01\x09\x15\x59\xd9\xd4\x18\x4e\xb6\xd3\x6c\xea\x75\xc3\xde\x04\xe4\x24\x2f\xa1\x10\x0d\x9c\x01\x38\x13\x91\xd5\x27\x2e\xd0\x48\x43\xbb\x91\x9e\x4d\xc1\xb5\xf0\x58\x7a\xf9\xa6\x00\x20\x32\x2b\xb2\x95\xf5\xd5\xca\x2a\x88\x45\x0a\x56\xea\x78\x9e\xb8\x0c\x39\x32\x31\xed\x0e\x42\x61\x39\x4e\x68\x5f\x0e\x66\x4d\x86\x11\xa8\x0c\xad\x70\xfb\x57\x39\x05\xd9\xc1\x93\x44\x49\x12\x45\xd7\x82\x56\x11\x7f\xdb\xd0\xe3\x41\x49\x7f\xa3\xe5\xf7\x2f\x9f\x7e\xff\x74\x7c\xd8\x89\x49\x9e\xa9\x2a\xcf\x80\x9c\x03\x8b\x27\x5c\xf8\xb9\x98\x67\x90\x9c\xde\xdb\x13\xef\x55\x35\xbf\x96\x7b\xdf\x7f\xff\x92\x2b\xf8\xa9\x05\xd8\xd5\xfc\x72\x95\x90\x1d\xaf\xc1\x68\x21\x33\x6b\x53\xb5\x49\x33\x9f\x6b\xbd\xd0\x0b\x08\x56\xdf\xea\x3c\xb7\x1f\xc2\x39\xe8\x5f\x9b\xec\x46\xe5\x76\x08\xce\x1f\xdd\x60\xe8\x96\x0a\xbc\xa0\x1f\x18\x17\xe9\x40\x0e\x02\x1f\x02\x65\x65\xfb\xba\x53\x76\x12\xfb\xa6\xd7\x1b\xf8\x0f\x68\xe0\xa7\x0e\xeb\x9b\x4c\x43\x4b\xb0\x50\x0b\xb5\xc6\x16\x6a\xb0\xc5\xff\x0c\xff\xa9\x6f\x54\xde\x28\xd7\x59\x4d\x4e\x66\x77\xf3\x20\x07\x31\x4c\xa8\x43\xcf\x4a\x72\xaa\xe9\xc6\xf8\x6d\xb3\x52\x24\x70\xa1\x79\xff\x32\x48\x74\x5e\x96\xf5\x35\xce\xe6\x39\xb6\xa8\x73\xaf\x7a\x9f\x9d\x09\x87\x97\xef\x8d\xdc\x6a\xfc\xa5\x91\x53\xb8\x9f\xe2\xa9\x81\x3d\xe5\x20\x44\x5d\xc2\xb8\xa9\x0d\x88\x2e\xab\x10\xfb\xe9\x9e\x9c\xc5\x19\x89\x08\xdd\x1d\xa0\xbf\xea\xeb\x90\xa9\xfa\xa0\xeb\xdc\x26\x30\x34\x11\xfa\xb3\x61\x67\xb7\xfd\x37\xc5\x30\xa8\xbd\x1b\xbb\xbb\xe3\x7e\xee\xa8\x20\x63\xc7\x97\x74\xbb\x30\x48\x30\x86\x17\x43\xd7\xa7\xfa\x1a\xac\x20\x3b\x37\x3b\x06\xa2\xda\xbf\x1c\xba\x29\x92\x3c\xda\x4f\xf7\xe5\x79\xd4\xf3\xe9\x2a\x95\x59\x6b\xe2\xe4\xc1\x47\x67\x3f\x06\x8a\x07\xc8\x56\x22\xcd\x86\xd6\x03\xa9\x19\x8c\xd2\xd8\x7b\x80\xee\x0a\xfd\x23\xc8\x4d\x06\xd7\xb3\xef\x7e\x8b\x29\xdf\x68\x57\xb7\xa5\x6e\x13\xd9\x09\x0f\x2c\x9b\x0a\x3b\xe5\xec\x92\xc3\x7a\xda\xd1\x83\x15\x44\xc3\x17\x8f\x1b\xba\x1d\x32\xed\x4d\x58\x50\x0d\x7b\x83\x67\x43\x15\x9b\xb2\xd0\x42\xe7\x46\x83\xa6\x79\xf8\xf8\x41\xfc\x83\x4f\x57\xa0\x29\x12\x4e\xe0\x88\xaf\x3f\x5a\xb0\x75\x07\x92\x6a\x3e\x29\xd0\x62\xa2\xe0\x95\xb3\x69\x08\x56\x27\xdf\x70\x0c\xcb\x1e\xb1\x20\x42\xc0\x85\xb2\xa2\x5d\x28\x6b\xed\x74\xd7\xde\x5b\x49\x73\xcd\x30\x2f\xd9\x6a\x9d\x67\x20\xa2\x83\xfb\x05\xcd\xbd\x61\x5b\x13\xee\xa1\x7c\x4b\x45\xf9\xd4\x6f\x7e\x90\xee\xc9\xc9\xb2\xa3\x1b\xe1\x17\xb4\xa6\xf6\x65\x91\x57\xf6\x5a\x00\xbb\xf9\x39\x9f\xca\x9d\xb8\x61\x3f\xfa\xec\x10\x5b\xe2\x2e\xb5\x73\x0f\xfb\x7d\x5a\xd1\x5b\x47\x15\x70\xa7\x1f\xc0\xa5\x11\xc2\xde\x1a\xa8\x5e\x6c\x75\xda\xd9\x81\x2c\x33\x26\xbc\x51\x19\x94\x43\x47\x43\xe9\xe9\xbe\x13\x51\x4b\xa2\xf3\xfa\xe6\xd7\xf6\x20\x2e\xa8\x15\x14\x9e\xca\x6f\x9f\x0f\x1f\x5a\xae\xc4\x0f\x0f\x8a\x11\xaa\x1b\x34\x00\xe7\x95\x5e\x64\x60\x80\x2a\xdf\x6d\xc9\x67\xae\x7d\x95\x28\x9f\x8f\x14\xb9\x7a\xd1\xff\x65\x1f\xfe\x51\x85\x6b\x6d\x0c\x3a\x8f\x5b\x82\x44\x6f\xd0\xe7\x74\x26\x3e\xa5\xad\x61\xca\x53\xa6\x55\xcf\xea\xd7\x02\x75\x27\xaf\x0d\xd4\x06\xd5\x6a\x01\x82\xab\x55\xa4\xd3\x17\xd0\xdd\x31\xc3\x1f\x40\xbf\x6c\xd6\xba\xca\xb3\xe2\x23\x18\x8e\xbc\x03\xc1\x90\xd0\x9d\x5d\x5b\x8b\x0f\x83\x52\x80\x89\x01\xf0\x01\x07\xe9\xbe\xab\x51\xb5\x86\x8d\xeb\xb4\x03\x28\xa1\x5a\x57\x91\x1f\x85\xd1\xa9\xb2\x68\x89\x02\x1e\x19\x9c\xd6\x20\x98\xe1\x46\x0c\x1d\xdb\x8c\x03\xb1\x1b\xb4\x51\x93\xa1\x4d\x31\x02\x2a\x1c\x5e\x57\x25\x88\x89\x6b\xc0\xec\x32\xd9\x55\x01\xf1\x1f\x25\xd1\xdb\x92\xd8\xcc\xc3\x49\xbc\x07\x1d\xac\x65\x59\x89\x8e\x1f\x1d\x28\x2b\xef\x3a\x85\xe2\x7f\xdb\xe3\xb8\xdb\x19\xc7\x02\x2b\x78\xf0\x05\x27\x15\xd6\x9d\x0b\x55\x0a\xd9\x14\xae\xdf\xd4\x5a\xde\xa2\x33\x3c\xac\x4d\x24\x6b\xb3\x53\x4d\x19\xce\x22\x22\xb2\x0e\x3d\x37\xb6\xbb\x94\x3f\x28\x5e\xbf\xac\x74\x7d\x5d\x06\xf5\x1e\x56\x0f\x7c\xd4\x58\x1d\x4d\xaa\x56\xa8\xa8\x21\xad\x7f\x00\x69\x74\x8a\x1c\x82\x49\x34\x95\xb2\x12\x41\x7f\x28\xeb\xb0\xa8\xdd\x9a\x6c\xca\x30\x45\xd1\x53\xed\xc5\x90\x41\xf1\x0a\x44\x6e\x99\x5a\xb8\x70\x5c\xf0\x02\x6c\xa9\xe7\xaa\x75\x68\x21\x2b\x8b\xdd\xa0\x8e\x3d\x30\xfb\xb7\x3a\x8d\x24\x6e\xb1\x90\x17\x02\xc7\xf6\x23\x9e\xde\x1d\x9f\x21\xbc\x36\x76\x08\x14\xbe\xd9\x23\x57\x35\x62\x36\x04\x7e\x7d\x59\xc9\x65\xa6\x73\x30\xbc\xad\xc1\xac\x6e\xca\x2a\x25\x6c\x54\x83\xe1\x21\x38\xc6\x08\xf0\xda\xbf\xc4\x2e\xfd\x5f\x2e\xa1\x57\x01\x8a\x9d\xe0\x90\x3e\x77\x4a\xbd\x27\x97\x42\xb5\xd1\xe8\xee\x85\x92\xdc\x7b\x3c\x54\xe2\x64\x3f\xae\x17\x82\x1a\x88\xca\x25\xb0\xa1\xd4\x0c\x46\x7b\x9d\xad\xed\xa2\xdc\x64\x55\xdd\x70\x65\x8e\x74\x61\x67\xfb\x57\x16\x50\x6c\x6d\xf4\xc6\xfb\x60\x98\xfe\xd5\x54\x99\xc4\xf8\x17\x90\xb3\x72\xf5\xe6\x20\x93\xe6\x90\xfd\x87\xae\xee\xd2\xdb\x6e\x58\x51\x1c\x46\xd4\x79\xc2\xb0\x22\x2f\xb0\x72\xc2\xbf\x15\x0f\x27\x14\x21\x84\x45\xf2\x65\xf7\x8c\xc2\x79\xb8\x40\x92\xf7\xc0\xc2\xb1\xd7\xd7\x07\x2a\x02\x1b\xe1\x79\xda\x91\xdc\x4f\xe4\x94\x6b\xe8\xa8\x43\x55\x3c\x4f\xf7\xe4\xb8\x2f\xd1\x15\xd4\xda\x85\x46\xaa\xfb\x04\x82\x08\x32\x08\x8d\xaf\xdd\x12\x73\x40\x5f\xb0\xe7\xcf\x98\x86\x50\xeb\x5e\x73\x9c\x90\x44\x73\x10\x4f\x96\xb7\xca\x44\xe1\x76\xca\x36\x2c\xe4\xe5\x46\xa0\x56\xb4\x9f\x40\xd7\x99\xa1\x91\x41\x8e\x98\xa0\x20\x9b\x11\x63\x3a\x5a\xc0\x6f\xb5\x17\x4e\x2d\x0b\xdd\x6b\x3b\x7f\x7d\x5c\xd7\xe8\x4d\x56\xe6\x50\xd3\x09\xf5\x81\xd9\x8d\x9a\x6f\xd0\xd2\x2d\x96\xa8\x2d\x55\xab\xc1\x01\xdf\x58\xab\x8f\xba\xe0\x1c\x64\xfb\x18\x04\x9b\xf4\x22\xaa\x42\x15\xe2\x45\xba\x27\x47\x58\x95\x0d\xfb\x4d\x42\xa8\xf7\xc0\xc6\x55\xa7\x09\xe7\xef\xe8\x4b\xf6\x54\x3a\x55\x10\x1e\x9b\x70\x75\xb8\xca\xc9\x7a\x3d\x1f\x71\xfd\x9d\x6e\xa0\x16\x06\x6e\x27\xca\x37\x62\xa9\xb2\x1c\x11\x9a\x57\xeb\x7c\xe3\x57\xff\xbe\x1c\x6b\xeb\x82\xd9\x27\x2e\x4a\x48\x7f\xcd\xed\xe1\x80\x15\xe7\xfe\x1f\xd0\xd8\x41\xc7\xec\x5a\x57\x59\x89\x31\x81\x6c\xa5\xa5\x5a\x5a\xd3\xc0\x01\x02\x40\x25\x9e\xf0\x70\x10\x85\xaf\x42\x4d\x49\x39\xde\xbf\x7e\xc1\xd2\x7d\x28\x1b\xc1\xbd\x1a\x72\xae\x21\xea\x61\xd7\x6e\x5d\x27\x7d\x5e\x85\x8f\xd2\xb8\xf6\x14\x4c\x67\x06\xbd\xdf\x5c\x7e\xf7\x50\x8a\x7b\xb3\x3d\xb1\x8e\x42\x0c\x05\x4c\x6f\x5a\x44\x2f\x7c\xce\x05\x56\xa1\x53\x26\xcc\x2d\xd5\x28\xdd\x9a\xea\x26\xbb\xd1\xa9\x3d\x66\xfb\x6c\x3f\x64\x9c\x5c\x8f\xca\xb2\xa8\x8d\xa4\x37\xdf\xb5\xe1\x54\xad\x35\xc8\x44\xc7\x20\x8b\x22\x21\x72\x5e\x95\xc6\xec\x22\x72\x35\xec\x6f\xae\x6e\x4d\x93\xd5\x43\x82\x34\x20\xe5\x0b\xb1\x36\x11\xe2\xc1\x62\x6b\x0b\x75\xb6\x80\x82\xad\x7c\x95\x41\xc7\x0c\x29\xc2\xb5\x5e\x57\xfa\x26\x83\x56\x52\xd1\x6a\x54\x68\xdf\x09\xb7\xaf\x6c\x40\x6d\xbd\x68\x22\x28\xef\x76\x89\x1c\x80\xe9\xc0\x16\x2f\xbf\x76\x99\x01\xa7\xa2\xe5\xb1\xbd\xdc\xd2\x24\x9b\x11\x84\x89\xc7\xe0\x69\xb5\x1a\xbe\xb4\x02\xfa\x5f\x0e\xc7\x67\xe7\x72\x34\x93\xe3\x7f\x39\x9b\x8e\x67\xb3\xe3\x0f\x72\x36\x3e\x97\x6f\x4e\xa7\xe7\xef\xe4\xe4\x44\x9e\xbf\x9b\xcc\xe4\xe8\xed\x74\x3c\x7e\x3f\x3e\x39\x4f\xe4\xf9\xbb\xb1\x3c\x1a\x9d\x8f\xe4\xce\xe4\xe4\xf0\xf8\xe2\x68\x72\xf2\x56\x8e\x4f\xde\x8d\x4e\x0e\xc7\x47\xc2\xfe\x61\x28\x27\x33\x79\x36\x3d\xfd\x69\x72\x34\x3e\x92\xa7\x27\x72\x74\x22\x07\xa3\x99\x9c\xcc\x06\xf2\xc7\xd1\x6c\x32\x4b\xe4\xcf\x93\xf3\x77\xa7\x17\xe7\xf2\xe7\xd1\x74\x3a\x3a\x39\x9f\x8c\x67\xf2\x74\x2a\x0f\x4f\x4f\x8e\x90\xa2\x55\x9e\xbe\x11\xa3\x93\x0f\xf2\x4f\x93\x93\xa3\x44\x8e\x27\xe7\xef\xc6\x53\x1e\x9f\xfd\xe4\xe4\xfd\xd9\xf1\x64\x7c\x24\xdd\x08\xfc\x23\x8f\x27\xef\x27\xc8\xd6\x96\x48\xfb\x08\xff\x0a\xd1\x7e\x85\x3c\x9f\x9c\x1f\x8f\x13\x79\x72\x7a\xb2\x3b\x39\x79\x33\x9d\x9c\xbc\xa5\x39\xbe\x1f\x4f\x0f\xdf\x8d\x4e\xce\x47\x3f\x4e\x8e\x27\xe7\x1f\xec\x2b\xdf\x4c\xce\x4f\xec\xdb\xdf\x9c\x4e\xe5\x48\x9c\x8d\xa6\xe7\x93\xc3\x8b\xe3\xd1\x54\x9e\x5d\x4c\xcf\x4e\x67\xe3\xd4\x2e\xe7\xbe\x3c\xa1\xc1\x7e\x38\xbd\x90\x27\xf6\xa3\x27\x1f\x70\xb5\x68\x41\xa6\x33\x39\x7b\x37\x3a\x3e\x96\xef\x46\x3f\x8d\xe1\xaf\xc7\x13\x7e\xcb\x1b\xfe\xfc\x64\x3a\x3e\x3c\x4f\xc4\xe4\x84\xfe\xcb\xce\x73\x72\x34\x3e\x39\x1f\x1d\x27\x72\x76\x36\x3e\x9c\xd8\xff\x18\xff\xcb\xf8\xfd\xd9\xf1\x68\xfa\x21\xa1\xc5\x9b\x8d\xff\xf9\x62\x7c\x72\x3e\x19\x1d\xcb\xa3\xd1\xfb\xd1\xdb\xf1\x2c\xd8\x23\xd1\x5d\x20\x79\x7c\x3a\x3b\xb7\x03\x7b\x33\x39\x9f\x0d\x13\xf9\xee\xf4\xe7\xf1\x4f\xe3\xa9\x3c\x1c\x5d\xcc\xc6\x47\x72\x74\x42\xbb\xf7\xc1\xee\xf9\xe9\xf4\x83\x5d\x32\x37\xda\x44\xfc\xfc\x6e\x0c\x53\x9d\x9c\x10\xa3\x87\x1d\xe9\xec\x7c\x3a\x39\x3c\x0f\x3e\x66\xc7\x76\x7e\x3a\x3d\x0f\x8f\xcb\xc9\xf8\xed\xf1\xe4\xed\xf8\xe4\x70\x6c\xff\x7a\x6a\x9f\xf2\xf3\x64\x36\x1e\x8a\xd1\x74\x32\xb3\x1f\x98\x9c\xd0\xde\x7d\x90\x76\xc8\x76\xab\xde\x8d\xe5\xc5\x0c\x3e\x7f\x34\xb1\x2f\xf9\xf1\x02\xa6\x40\x7f\x82\x25\xb6\x6f\x7a\x37\xb6\xeb\x32\x3d\x9c\xcc\xc6\xe2\xf4\x0d\x3c\x65\x3a\x79\xfb\xee\x7c\x26\xdf\xda\x63\x30\x3e\x92\xef\xc6\xd3\xf1\xc5\xc9\xd1\x78\x9a\xc8\xf1\x4f\xe3\x13\x39\x79\x23\x47\x47\x3f\x4d\xec\x8c\xe9\x61\x67\xa7\xb3\xd9\x84\x77\xfe\x8d\x9c\x5d\x1c\xbe\x13\xb4\xa0\xf1\xc5\x7b\xd5\xe9\x3c\x78\x95\xee\x85\xcd\x79\x9e\x3d\xc0\x94\xb9\xf5\x42\x50\x71\x44\xad\x81\x6d\xad\x67\xad\xc4\xb8\xe4\x9f\x8c\x11\x6c\x7a\x71\x39\xf0\xae\xb9\xc6\xaa\x23\x74\x1d\x00\xb9\xc6\x3f\x8d\xcc\x8c\x04\xfb\x5e\x7d\x90\x3b\xe1\xf4\x24\x42\x6b\xe8\x4f\x60\x96\xdb\x77\xa7\x51\xb3\xa1\xb4\xc6\x47\x68\x91\x99\x5a\xaf\x0d\x59\x64\x59\x8f\x54\x5f\x36\xf9\x12\xe1\x9e\xe3\x69\x13\x2a\x78\x30\x71\x11\x37\xbc\x75\x26\xbd\x7d\xbe\x3e\x06\x11\x36\x5e\xbc\xa2\x48\x80\x9d\x4f\xdb\x58\x6d\x95\x6a\xa0\x4f\x1a\xd5\x6a\xa8\xec\x86\xc1\x41\x48\x7b\x43\x57\x4c\x49\x4a\xa3\x8d\xb0\xe7\xbd\x25\x04\x11\x4c\x30\xed\x16\x82\x16\x5a\x3b\x00\x4d\xf9\x0d\xf6\x66\x92\x03\x0e\x43\x3d\x68\xdb\xee\xd6\x08\xb4\x66\x68\x51\x06\x88\x62\x95\x5e\xe9\x85\x5d\x39\xd7\xf7\xe3\xeb\x04\x34\x65\xc6\xe2\xc2\x64\xd7\xa9\x82\x6d\x46\x59\xc5\x7c\x55\x76\x7a\xf6\xdf\x26\xb1\x96\xf6\x1c\xa0\x0f\x12\x4c\x65\x18\x53\x56\x08\x14\x66\xf7\xf4\x0a\x1a\x00\x5f\xa5\xcf\x7d\xd8\x2e\x8c\xdc\x72\xa0\x8a\xc7\x09\x43\xf9\x64\xdf\xe0\xb6\x28\x3a\x73\x22\x4c\xac\x20\xbd\x71\x68\xeb\x52\xbe\xd2\x5b\x24\xb0\x5c\xac\x46\xfb\x93\x03\x64\x6c\xb8\x8e\xe4\x87\xb5\x2e\xc6\x2f\x0c\x37\x35\x52\x10\x03\x0e\x21\x16\x6c\xeb\xea\xc6\x01\x50\xb7\x66\x13\xd8\x02\x7e\x6e\x3d\x53\xc1\xb8\x8a\xaa\xfd\x1e\xbf\x80\x15\x7c\xb0\x8a\xd2\x3a\xa2\x57\x55\xd9\xac\x69\xe8\xd8\x2d\x56\x34\x9f\xe4\x9b\xb2\x29\x16\x68\xcc\x53\x99\x95\xa9\xf5\xad\xaa\x16\x3d\x06\xf1\xce\x60\x86\x7f\x1b\x0c\xad\xcf\x2d\xad\x5d\xd5\x3a\x1b\xf4\x01\x41\x00\x29\x01\x5e\x2a\xba\xe2\x65\xc5\x6d\x30\x61\x8b\x4b\x8f\xf5\x9d\xa2\x97\xc7\x3d\x30\x6c\xf8\x53\xce\x13\xfa\x06\xb3\xe2\xaa\xa1\xce\x8c\x76\x0b\x0d\xc7\x59\xfa\x6c\x26\xd1\xbd\xd9\xdb\x10\x8b\xf9\xb1\xf4\x4f\xbf\x12\xd4\x46\x07\x48\xd4\x90\x28\xa5\x9e\xeb\x7c\xe3\xe5\x86\x33\x13\x65\xd9\xfb\x02\xec\x61\x76\xf8\x27\x3c\x53\xdf\x25\x44\xde\x18\x2d\xe9\x7f\x36\x5e\x94\xf4\xe9\xf8\xcd\xf1\xee\xfe\xef\x49\xff\xf1\x20\xff\xd3\xcb\x0e\xff\xd3\xfe\x8b\x83\xfd\x6f\xf5\xdf\x7f\xc4\xcf\x38\x5b\x2e\x75\x2e\xdf\x94\x55\xb3\xf2\x6d\x48\x7c\x63\xf6\x85\xd8\x4b\xe5\x99\x07\xaf\xf2\x39\xb4\xc0\xc5\x69\xb0\x18\x66\xbd\x49\x58\x3e\x50\x18\x36\xc2\x36\xce\x8c\x58\xab\xf9\x47\xc0\xce\xf0\x05\xde\xd7\xaa\x76\x40\xd3\xbb\x1d\x48\x29\x4c\x50\xb9\x8c\x45\x53\x50\x16\x25\x11\x62\x97\x90\x48\x82\xc6\x63\x96\x3e\xee\x35\x5c\xff\xe4\x82\x0b\x10\x05\x75\xf1\x53\xf0\x1e\x33\xc3\x90\x75\x10\xee\x85\xac\x5b\xff\x8c\x81\x60\x21\x98\x76\x30\xbb\xcb\xac\x50\x98\x03\xba\xaa\xd4\xca\x50\xf5\x03\xf2\x13\x88\xb2\x88\x86\xe5\x50\x6a\xe3\x2f\xd1\xa7\x21\xe6\xa6\xba\xbc\x4d\x1c\xea\x76\x73\xdb\x58\xfb\xa5\xd2\x52\x17\xf3\xb2\xa9\xa0\xde\xa5\x2e\x5d\xe2\xc1\x3a\xf1\x10\x4f\xa8\xfb\x48\xa0\x5a\x0f\x4b\x85\x00\x4f\xee\x6c\x74\xf8\xa7\xd1\xdb\x71\xe4\xa3\xb1\x77\x66\x2d\xfe\x96\x6b\xf6\x21\x05\x1b\xba\xeb\x7b\x09\xef\x58\x25\xa1\x1f\xf6\xe3\xc5\xb9\x3c\x39\x25\x37\x63\x7c\x24\xcf\x4f\xd1\x65\x64\x97\x2d\x74\xf9\xde\xb4\x1d\x2d\x61\x47\x10\x79\x5a\xb2\xeb\x69\xc9\xd1\x74\x6c\x9d\x80\xc3\xe3\xd1\xe4\xfd\xf8\x28\xb5\xde\xc2\xc9\x29\x18\xf3\xe7\xe4\x5c\x9d\xbf\x1b\x8b\xd1\xc5\xf9\xbb\xd3\xe9\x4c\xfe\x38\x06\x6f\xe4\x78\x2c\xcf\x4f\x61\x2e\xf6\x89\x1d\x67\x4b\xde\xef\x6c\x89\xc7\x38\x5b\x8f\xf0\x5e\xde\x80\x3b\x2d\x68\x13\xfe\x28\x3d\x91\x3e\x1d\xbd\x39\xde\x3d\xf8\x0f\x94\xff\xfb\xcf\x9f\xbd\x7a\xde\x95\xff\xcf\xbf\xc9\xff\x3f\xe2\x67\x34\x57\x0b\xbd\xca\xe6\xf2\x8d\x75\x64\x5c\x3b\xdf\x60\xf4\xe6\x78\x30\xa4\x46\x3e\x72\x40\xfa\x3f\x09\x5d\x1b\xf4\xaf\xc1\x50\x04\xb4\x4e\x90\xbc\x60\x14\x1b\xce\xa1\x04\xd9\x13\xfc\x6a\x04\x2c\x34\x18\xca\x5b\x04\x17\xbe\x2d\x74\x25\xc2\x87\x97\xd5\xe0\x1e\x1e\x23\x14\xe1\x01\xa3\x91\x5a\xfc\xa2\xe6\x0e\x63\xed\xb7\xf1\x18\xf5\xcf\x9c\x85\x29\x74\x3a\xee\x0d\xb1\x08\xc2\x4e\xd1\x53\x1a\xd2\x47\xd3\x0e\xc2\x7b\xa7\x20\x28\x82\x78\x17\xad\xf2\x20\x03\x42\x3d\x62\x7b\xb0\x1a\xb7\x8f\xd9\xa1\x0e\xf1\x07\xad\x27\x2a\xda\x8c\x10\xaf\x85\xc0\xcc\x75\xcc\xc9\xd0\x22\xa0\x2a\x1c\xdd\x3f\x67\xa2\xf2\x12\xb9\x34\xa0\xe3\x02\x9b\xb4\x95\xf0\xae\x32\x6c\xf0\x0f\x42\x5c\xc2\xb3\xb9\x53\x5f\x27\x12\x8a\xcd\x12\xc4\xb7\x4d\xf0\x0f\x98\x0e\x44\x53\x21\x09\xaa\x74\xa2\x81\x08\x07\xd4\x02\xca\x17\xc1\x5a\x8a\x2b\xe4\xaa\x54\xee\x95\x46\xee\x0c\xda\x50\x54\x83\x61\x0b\x40\x58\x44\xb3\xfb\x41\x88\xf9\xb0\xa5\xc0\x5b\x58\xe5\x0e\xd6\xb4\x67\x6d\x20\x68\xd0\x86\xce\x6d\xb1\x4d\x70\xd2\xdb\x95\x1a\xd9\x47\x21\x0a\xcf\x75\x99\xcd\x29\xfc\xe3\xb2\x3d\x58\xa3\xba\xc8\xe6\xb5\xd8\x96\xd8\x08\x03\x37\x7c\x9a\x9e\x18\xf6\xb1\x17\x61\xbc\x9f\x43\x01\x89\x60\xfc\xf4\xde\x03\xfc\x03\x9b\x5d\x8b\x61\x58\x10\xdb\x9d\x30\xdb\x14\x54\xae\x82\x5f\xd2\xbc\x82\xeb\x5c\xf5\xf0\x77\xb8\x2f\x59\x7b\x2a\xb8\x1b\x67\x88\xe9\xfd\xfb\x5e\x0c\x5c\x7d\x82\x0f\x27\xa8\x2a\xc4\xd5\xe4\x2e\x15\xe8\x55\xe8\x50\x6e\x21\x10\xb3\xb5\xa9\x56\x97\xe5\x22\xdb\xc2\x8b\x02\x2d\x69\x4d\x55\x84\xde\x9d\xf0\xed\xdf\xdb\x6e\x25\x91\x32\x24\x5c\xc0\x9d\xa0\xd9\x6c\x74\x9e\x27\x04\x2a\x6d\xbf\x6a\x54\xae\x13\x01\xe5\x33\x2b\xb5\xa0\xf4\x5a\xb6\xc2\x54\xf8\x03\x67\xd1\x51\x43\x1d\x04\x2b\x1e\x22\xfd\xbb\x65\x3f\xa7\x53\x26\x07\xc1\x9f\xc3\x7a\xe2\x35\x00\x22\x13\x9c\xec\xaa\xff\x22\x2c\x7d\x99\xe8\xaa\xdd\xf1\x92\xd5\x0e\xe9\xc9\xd5\x73\x0b\x66\x95\x65\x72\x7a\x87\x41\x7b\x5d\xde\x46\x79\xfe\xd6\x9b\x82\x63\x02\xf1\x36\xa8\xfd\xf9\x22\x4c\xe1\x88\xa5\x21\x7a\xb6\xf0\x74\x0d\xb2\x43\xd7\x10\xcf\x17\x8e\x47\x1f\x67\x83\x1f\x9f\xa0\xfb\xd8\x8a\x9a\x18\x55\x67\x86\x2b\x18\x82\x9c\xed\xe5\x06\xb4\x19\xa6\xac\xda\xd3\x10\xdb\xa6\x91\x21\x58\x59\x84\x89\xe4\xe0\x91\x83\xea\x96\xb9\xca\xe7\x4d\x0e\xe4\x72\x78\xbf\x57\x59\x2d\xb3\x42\x7f\x5a\x5b\x55\x79\xa3\x59\xc2\x10\xf5\x17\x97\xa0\x53\x6a\xb0\x85\x98\xec\x66\xb8\x0d\x2d\xb9\xbb\x6b\x42\x3c\x1f\xca\x31\xde\x56\x7b\x2c\xde\x54\xa5\x73\x31\xf1\x7c\xa6\xf2\x84\xd4\x0b\x97\xf4\x18\x4c\x43\xf1\x65\x2a\xca\xe0\x4f\xc2\x35\x20\x06\x10\xb3\x24\x78\x5b\x08\xf1\x05\x63\xe5\x2d\x29\xb4\x19\x30\x08\x78\x10\x40\x41\xf0\xca\x84\xee\xc4\xf0\x98\xba\x58\x94\x15\x46\x94\xd7\x55\x09\xcd\x0c\x84\xb6\x68\xda\x4c\xc9\x99\x89\xf5\x95\x43\xa7\xa4\x82\x4c\xca\x93\x06\xe8\xcf\x2d\xd4\xa9\x94\xeb\x3b\x55\x50\xc4\x29\x08\xa6\xd4\xaa\xbe\xac\x00\x7c\xc0\x2e\x1d\x86\xd1\x2c\x33\x43\x35\x53\x97\xa1\x76\x08\x20\xa5\xbd\x01\x64\x92\x40\x16\xd9\x0f\x48\xa3\xe7\x95\xc6\x30\xb2\x07\xa4\xeb\xc5\x57\x4d\xe5\x49\x29\x48\xb0\xf2\x2b\xb3\x08\x97\xed\x21\xd1\x26\x03\xd1\x46\x45\x52\x55\x4d\x02\x17\x10\x28\x1d\x8e\x54\x2c\xbe\xe3\xf8\xa4\x2b\xe0\xa5\x3f\x13\xdd\xa5\x08\x2a\x6a\xf7\x21\xb6\xd9\x3f\xc8\x9a\xb1\xb7\xe9\x44\xf8\x23\xc7\xa8\x9e\x58\xd2\x84\x7f\x56\x50\x23\x80\x60\x5f\xbd\x1a\x01\x2a\x97\x7a\x77\xc8\xf5\x51\x87\xc4\x76\x28\xbc\x80\x52\xd4\xbf\x17\x0e\x94\xb7\x62\xc9\xf8\x04\x43\x60\x91\x2d\x97\x88\x17\x6c\x3f\x24\xa2\x17\xd8\x95\xba\x4f\x4a\xf9\x9e\xef\x5b\xa8\xec\x45\xfc\x45\x5f\xaa\x41\xeb\x93\x0a\xf1\xc2\xde\xd5\x5a\x57\xf6\x41\x47\x7a\x9d\x97\x1b\x8c\xdf\x7a\x55\xd1\xf3\xe7\x50\x65\xc0\x9e\x87\xf1\x98\x44\xc4\x70\xf1\xfe\xf4\x3f\x08\x26\xca\xc1\xfe\x5b\x85\x00\x91\x9e\xc1\xe2\xe1\xaf\x86\xb7\x19\x49\x46\xe3\x00\xb7\x00\xb4\x6b\x0e\x0d\x61\x39\x2e\x5a\x92\x6d\x9a\xce\x16\x45\x27\x9e\x1c\xfb\x71\xc2\x23\x13\xa0\x00\x17\x3a\xe6\xe5\x54\x45\xd4\x35\xed\x08\x6b\xec\x15\x80\x0e\xef\x1b\xa0\x45\x28\x74\x7d\x0b\x67\x67\x64\xbf\x22\x58\x60\x38\x8b\x4f\x46\xa8\xc1\x70\x48\xf9\x30\xbb\x80\x77\x50\x6c\x59\x5b\xfb\x18\x6a\x76\x7b\xb6\xa9\x05\x4e\xd8\x59\xc3\x2e\xec\xa1\x9d\x87\x88\x82\x6b\x04\x40\xcb\xed\xf7\x3b\xf3\x61\x2a\xc4\xcb\xa1\x0c\x69\x5e\xb0\x1c\x3c\xf5\xa3\xc2\xc8\x5d\xc2\xb7\xa6\xa5\x8c\x63\x36\x13\xb6\xa4\xb9\xd8\x04\x8b\xb3\x92\x7e\x56\x18\x70\x1b\xdc\x15\x76\xd1\x42\xc6\x59\x12\x0f\xa9\x7d\x68\xd6\xe1\x7e\x1c\xe8\xae\xe5\xc2\xe4\x65\x70\x0b\x19\xef\x07\x4d\x95\x35\x2c\x0f\xd4\x84\x72\xc5\x32\xfa\xa1\x56\x4a\xd3\xce\x0f\xc2\xe5\x20\xae\xf7\x81\x5b\x0f\xe1\x9b\x51\x5b\x94\x56\x7d\xcc\x2e\x9d\xb5\xf0\xc5\xe6\x90\x2b\x23\xb2\x97\xee\x1b\xfb\x8d\x00\x30\xcb\xc0\x68\x90\x95\x9e\x67\xeb\xcc\x95\xd9\x09\x57\xb1\xed\x22\x85\x7d\xda\xfc\xd5\xd0\x41\xac\x83\x29\x5f\x95\x37\xba\x70\x70\x18\xfd\x58\xec\xe9\x16\xa8\x7f\x51\xb7\x81\xf2\x03\x9a\x9e\xae\x8d\xeb\x0d\xe8\x3e\x34\xc4\xac\xb0\xa6\xbc\xb7\x11\x43\x18\xfd\xc8\xc0\xa7\x3f\x3a\xb7\xa1\x8b\x30\xa2\x45\x0f\xe2\xbc\x09\xf0\x05\xbb\xaa\x7c\x1e\xd1\x82\x4a\xc7\xf6\xe4\x15\x2e\x14\x65\x45\xc3\xef\x55\xfb\x01\x3a\x39\x80\x0f\x04\x9c\xcc\xeb\x4a\xcf\x35\x74\x5e\x02\x63\xbf\x63\xfd\x78\x98\x36\x3a\x98\x03\x21\xc1\x87\xe5\x36\x30\xb2\x76\x58\xd7\xf9\xfc\x2c\x93\x90\xec\x26\xcf\xf4\x22\xf0\x42\x93\x3e\x24\x6e\xd8\xd6\x18\x51\xbe\x8d\xdd\x9e\xb4\x81\xe2\xb1\x18\xb8\x1f\x2a\x9e\x8b\xd9\x53\xac\xde\x38\x39\x9f\x4c\xc7\x72\x3a\x99\xfd\x49\x8e\x66\xf2\xfc\x14\x7e\xfb\xcf\x17\x23\x2e\xc7\xb0\xff\x3c\x9d\x4e\xde\x4e\x4e\x46\xc7\xf2\xe7\xd3\xe9\x9f\xe4\x64\x06\xd3\x93\x1f\x4e\x2f\x52\x44\xac\x71\xd1\xe1\xa9\xfd\x06\xcf\x39\x44\x7b\xd9\x06\xf0\xee\x97\x32\x15\x81\x69\xd1\x7b\x68\xb3\x16\x0d\x68\xb0\x0d\xd4\xdf\x15\x54\x88\x7a\xa8\xf9\x54\x88\xef\x86\xdb\x8a\xb2\x52\x79\x01\xdf\x29\xca\x88\x7a\x13\x9d\xfe\x86\xff\x84\x7d\x16\xf5\xb5\x2e\xab\x4d\x22\x58\xcd\xd9\x33\x65\x0d\xad\xa0\x48\xae\xd0\x57\x79\x76\x65\xcf\xd2\x30\x71\x5d\xb2\x49\xab\xd3\x1d\x2b\x93\x43\x0f\x37\xc0\x24\x77\x2d\x53\x4e\x82\x39\x38\x78\x69\xd6\x7a\x9e\xa9\x1c\x0e\x0c\x48\x4b\xfb\xdf\xe8\x7e\x53\xaa\xd4\x63\xa9\x3b\x9b\x6f\x7e\xad\xec\x20\xac\x7e\x24\xec\x3d\x68\xe1\xc5\xee\xce\xce\x9d\x24\xfd\x18\xf0\x15\xb6\x83\x58\xf7\x1d\xd5\xbf\x33\x68\x3c\x2d\x80\x83\x37\x46\x38\x8f\x36\x6a\x3c\xdc\x25\xfb\x32\xe4\x1c\x03\x30\xbb\x70\xaf\x3d\xe2\xb6\x2f\x09\x8f\x10\xdc\xb1\xa6\x44\xb4\x59\x32\xc9\x9c\x34\x5c\x15\xc8\xcf\x4c\x85\xf8\x7e\x18\x62\x66\xdb\xf1\x05\x95\xbf\xa9\x9c\x2c\x13\x89\x86\x03\x54\xbb\xa2\x45\xe1\x45\x92\x82\x7b\x00\x72\x52\xc4\x48\x85\x18\x2c\x31\x84\x64\xfd\x30\xd2\x74\x0b\xcb\xbd\x65\xc5\x3e\x8c\x34\xcd\x85\xa3\x51\xd0\x4e\x3c\x36\x68\xd7\x67\xe4\x04\xd6\x93\xf5\x5a\x44\x54\x04\xac\x97\x4b\x7b\x5f\x7c\x10\x38\xbe\x72\x75\xc9\x5d\xd5\xb8\x2b\x28\x28\x69\x39\xca\xa5\x08\x35\x6c\xd9\xae\x48\x08\x04\x49\x40\x1a\x64\xa2\x2e\xc1\x8d\x2f\x23\xb6\x76\xba\xab\xee\xc6\x1e\xa5\x79\x9d\xdd\x60\xa1\x94\x67\xa8\x72\xc8\x48\x61\xa8\xd0\x3f\x06\x8c\x07\x30\x23\xc4\x17\xd2\xad\xd9\x8d\x58\x94\x80\x58\x51\xba\x9b\x74\x5d\x16\x65\x85\xdc\x72\x5b\x51\xa4\x50\x1f\xc1\xc9\x24\xbc\xf5\x98\x38\x1d\x4a\xab\xc0\x58\xa5\x4e\x74\x30\x62\x37\xdb\xdd\xa9\x16\xff\x23\xe1\xdb\xfa\xa7\x3a\x8a\x47\x54\xb9\x21\xa3\x62\x20\xf8\x06\x4b\x95\x81\x29\x8e\x0d\xc8\xf0\xaf\x85\x56\x79\x56\x5c\x0d\x86\xad\x1d\x41\x07\xce\x17\xe1\x86\x4a\x99\x0b\xcb\xb1\x13\x08\x22\x25\x3a\x80\x1c\xeb\xe2\x8d\x31\x77\x91\x87\x2f\x8f\x66\x07\xeb\x0f\x1b\xc6\x42\xa6\x2e\x71\x9d\xdb\x2d\xa4\x7e\xb7\x05\x19\xe2\x7b\xcf\x86\x11\xae\xb4\x15\x6a\x14\x6b\x1d\xcd\xf1\xa6\x77\xe7\xb5\x15\x3b\xfa\x6b\x67\x26\xfb\x67\x26\x5a\xa5\xcb\x60\xd1\x5a\xd1\x88\x12\x09\x8e\x73\x59\x44\xa5\x89\x51\x01\x37\xa8\x8d\xc6\x9e\x14\xf8\x77\x22\xb8\x4e\xbc\x4d\x8d\x90\x33\xa2\xb4\xca\x73\x7d\x85\xbd\xa3\xbd\x7e\x23\x1b\x24\x46\x28\x32\xcc\x68\x7d\xc2\x4a\x76\x0f\x7c\xdc\x16\xc6\xa8\xee\x68\xdc\xee\x65\x1c\x18\x89\x98\x6a\xe0\xd4\xbb\x36\xf8\x2d\xd2\x09\xac\x4b\xe2\x01\x20\x64\x4d\x81\x84\x0c\x0b\xfb\xdf\x76\x7f\xf7\x86\x11\xc2\x6f\x22\x7f\xd2\x5c\x5f\xff\x16\x80\x4c\x20\x31\xa0\x6e\x53\x39\x42\xbe\x75\x2a\x51\x33\x4d\xe6\x2b\xfa\xdb\x52\x9c\x7d\xe5\x4b\xc0\x20\x23\x06\x8b\xcc\xb1\x2c\x57\x14\x8d\x89\x91\x83\x6e\xc9\xe1\x89\x8c\x82\x00\xc2\xd5\x21\x0b\xb9\x3f\xde\x8b\x38\x9b\x78\xf3\x05\x39\x94\x1d\x62\x91\xaa\xe3\x17\x43\xe0\x7f\x81\xc8\x4e\xc6\x51\xe5\xed\x96\xcb\x5d\xd2\x81\xc4\xfc\x00\x31\x0b\xd1\x42\x2e\xb3\x8f\xbe\x28\x40\x10\x9d\xd0\x56\x1c\x42\xe8\x93\x7b\xe5\x0e\xc9\x02\x32\xce\xf1\x9e\x44\xb2\x69\xa6\x72\x70\x25\xdf\x96\xe5\x02\x44\x9b\x57\x92\x38\x30\xbd\xc0\xb5\x0f\xb8\x06\x5a\x3a\xa8\xa9\xed\x22\xc1\x2c\x8d\xe7\x8d\x8f\x2d\x1a\xec\x36\x61\x2d\xc8\x47\xd1\xf5\xba\xc5\x18\xca\x82\xda\xc5\x30\x70\x86\xbd\x1e\x85\xca\xd9\xf4\xf6\x82\xb1\x74\xe9\x10\x62\xb1\xae\x11\xdb\xad\x2a\xd7\x95\x95\x66\xd1\x42\x93\xa1\xcc\xae\x3e\xbe\x9b\x9a\x38\x9c\x2a\x8b\x00\xec\x43\xcb\x58\xec\xed\x43\x50\xa0\xac\x0a\xbd\x31\x4f\xe4\x1b\x6d\x6d\x9d\x09\xc6\x73\xe8\x5c\x42\x90\x95\x30\xbd\xb7\xa9\x46\xab\xdd\x8d\xd6\x90\x5e\x60\xe3\xc9\x9f\x63\xe4\xc7\x4d\x38\x57\x71\xa3\x32\xa8\x23\xb6\xc6\xfa\xc6\xaf\x16\x14\xbe\xe6\x68\xbd\x54\x7a\x0e\x91\x17\x3c\x3b\x86\xd6\x0b\x83\xe1\xda\x3c\xe4\xd8\x84\x75\xcd\xca\x4f\x6e\xa9\x35\x6b\x3d\x03\x7d\xb3\x48\x93\x82\xf9\xd3\xa2\xa0\x15\x84\xeb\x8d\x70\x75\x6d\x49\x27\xa8\x08\x5b\xab\xdc\x75\x82\xa9\x50\x60\x7f\xd1\x2e\x88\x60\x17\x0e\x86\x71\x01\x3a\x18\x50\x3d\x70\xf3\xb1\x7a\x05\xca\x70\xc4\xb3\x8c\xf0\xe6\x13\x0c\x88\xb6\x45\x22\xf4\x70\x11\xf6\x3b\x08\x8f\x87\xc8\xc5\xb3\xba\x05\xff\xbe\xf7\x7c\x18\x00\x39\xda\x21\x21\x34\x48\x56\x44\x0a\x2b\xa5\x5f\x13\x5c\xa2\xdd\x9d\x16\x70\x36\x51\xcd\x67\x85\x6c\xd6\x6b\xe2\xcd\x03\x2e\xbc\x39\x60\x35\x31\xc0\x48\x88\x26\x04\x46\x21\xfa\x4b\x04\xa8\x15\xd0\x8e\x90\xed\x45\x71\x36\xdc\xe3\xd5\x3a\xdf\x30\x07\x15\x1b\xac\xe1\x01\x4e\x5a\xc6\xdd\x1b\x3b\x08\xff\x7c\xc8\xc9\xf2\xf4\x7c\x97\x3d\xbf\x3c\xc4\x55\xb3\x07\xd2\xf4\xe0\xaa\x65\x26\x82\x55\x13\x21\xac\x9a\xb5\x1d\xf0\x9d\x5f\x06\xa5\x96\xf5\x40\xa9\x45\xdc\x5e\x5f\x04\xa3\x46\xb3\xf1\xae\xe7\x76\x18\xb5\xb2\x92\x3b\x59\x36\x8c\x61\xd4\x00\x3c\x4d\x46\xe0\x69\x02\x29\xc5\xf4\x76\x10\x35\x7e\x56\x36\x0c\x70\xd3\xe4\x36\xdc\x34\x7b\xec\x5e\x0c\x09\x2a\x06\xdb\x07\x7c\xad\x31\x4f\xb3\x53\x10\x61\xf7\xfb\x56\x6d\x30\x63\xef\x66\x21\xb8\x5f\xd6\x65\x97\xd1\x48\xeb\x71\xfc\xa9\x8b\x1a\x3b\x00\x16\x5e\x3d\x42\x28\xcf\x68\x23\xa8\x8d\x00\x6c\xe2\xa5\xae\x28\xea\x84\x2e\xb7\xeb\x90\x20\x1a\x36\x98\x4e\x03\x20\xe6\x10\xdb\xb5\x73\x7a\x19\x43\x0f\xda\x59\x9f\x6f\x77\x36\x80\x3b\x97\x15\xc4\xdf\x3e\xcb\xfd\x67\xcf\x5e\x58\x0b\x02\xb0\x32\xc5\xb4\x34\xba\x68\x17\x42\x06\x66\x1e\x96\x7b\x7a\x67\x2c\x69\x97\x50\x44\x06\x20\x4b\xd4\x88\x58\x7a\xab\x99\x8f\xa9\x4a\xc3\xad\x73\x61\xfb\x77\x60\x51\x62\xa5\xd1\x96\xa0\x21\x36\x27\x76\x52\xe3\x51\xe3\x24\x6c\x37\x3e\x5c\x74\xba\xfd\x43\xd7\xb4\x3d\xd7\xf6\x54\xc1\x66\xe7\xd0\x29\xb3\x50\x50\x79\xd3\x7b\x8e\xa8\xba\x12\x29\xf4\x76\xc1\x8e\xcc\x90\x01\xad\x46\x9e\xcf\xa0\x52\xca\xc4\xa5\x52\x6d\xea\x04\x5f\xf7\xe4\x9d\x82\xd7\x70\x91\x43\x64\x02\xc7\x9f\x1b\x24\x53\x20\xf6\x0a\xe3\x6d\x0f\x8c\xe1\x59\x07\xbd\xc5\x22\xe8\x2a\x8d\xde\x1c\x0f\x60\xf8\x1b\x7c\x0d\x9c\x58\xbc\x30\xa5\xe1\x04\x2e\x59\x17\x0c\xd0\xd0\xfb\xb2\x1f\xf0\xe2\x07\x79\x02\xa8\xea\x82\x6d\xa0\xfa\x2c\x08\x20\x2d\x83\x22\x8c\x65\x56\x99\xda\x6a\x78\x75\x55\xa9\xf5\x35\xb1\x61\xba\xc0\x2c\x7d\x8d\x4b\xd1\xb8\xdb\xfe\xbf\x64\x85\xd1\x55\x8d\xc3\xe0\x90\x1d\x8c\xcd\x9a\x10\xff\x15\xe6\x45\x3c\x1e\xf4\x04\x1e\x73\x79\x5b\x38\x90\x3a\x2a\xd2\x59\x02\xf0\x56\xbe\x71\x6c\x5d\xb4\x1f\xf4\xcd\xd6\x39\xa6\x7e\xef\x2c\x8b\xf7\x45\xa0\x53\x03\x8f\xc6\x17\xc5\x3b\x0f\xe1\xeb\xb5\x2e\xa4\xc1\x14\x81\x23\x05\x6d\x0a\x60\x67\x8b\x16\x94\x35\x7e\x40\x3c\xb8\xf6\x2c\xa6\x84\xd5\x0f\x8f\x99\x58\xf9\x8f\x77\x61\xe7\x74\x36\xf1\xb8\xcb\x61\x9f\x95\xbd\x75\xbc\x48\x08\x18\x86\x17\x40\x57\x01\x3e\xcb\xba\x2a\x01\xda\xef\x3f\x59\x27\xc3\xb7\x9f\xaf\xf9\x49\x9f\x9e\xbe\x3f\xfe\x1d\x6b\x7f\xff\x7f\x0f\xf7\x7f\x1c\xec\x1f\xec\xb5\xeb\x7f\xf7\x5f\x1c\x7c\xab\xff\xfd\x23\x7e\xc0\x24\x78\xa3\x4c\x7d\xf8\x76\x12\xe5\xad\xf3\xec\xb2\xb2\x96\x3b\x49\x21\x40\x49\x44\x25\x34\x2f\x17\x5c\xf7\xcb\x3c\x20\xa8\xd5\x40\x7c\xc4\x45\x5e\xf8\xb1\xa3\xf0\x77\xf6\xb3\x55\x90\x1e\x0b\x44\xd5\x7b\x55\x7d\xd4\x75\x22\x27\xc5\x5c\xec\x0c\x82\x5f\x61\x5c\x2e\x02\xa2\xc2\x80\x23\xc7\xc6\xad\x71\x86\x48\x5d\xca\x98\x72\x9e\x41\x22\x8d\x75\x83\x70\x74\x25\x90\xa8\x8c\x06\x48\x42\x55\x7f\xb2\x33\xcf\xea\x7c\xe3\x89\x7f\x41\xf3\x04\xee\x02\x3c\x3f\x15\x22\x18\x97\x33\x55\x36\x68\xaa\x74\x3a\x61\x62\x13\x29\xc0\x6c\x43\x7f\x2d\x1a\x18\x74\x9a\x45\x83\xe3\xb4\x8a\x23\x4c\x8e\xfa\x66\x10\x79\x2b\x02\x24\x17\xbd\x6d\x33\x64\xbc\x52\x7c\xdc\x61\x5a\x83\xae\x62\xd5\x65\x7c\x89\xcb\x8d\xae\x2e\x55\x9d\xad\x04\xd9\x0d\x61\x19\x80\x81\xaa\x9a\xdb\x2a\xab\x6b\xab\x6b\x7c\xd7\xa4\x2b\xbe\x2c\x2b\xae\xd9\x04\x1a\xd7\xac\xc5\x4c\x1f\xc4\x0e\x03\x54\xf0\x06\x12\x22\x1d\xdc\x6c\x62\xf9\xdf\xb6\x79\x82\xc2\x57\xad\xa3\x84\x15\x5f\x64\x3d\xc1\xb7\x0a\xad\x17\x60\x12\xe1\xf9\x09\x4a\x88\xdc\x51\x12\x54\x8e\x48\x29\x65\xf0\x96\x3b\x55\x8d\x0f\x8c\x07\x73\xe8\x85\xbe\x15\xad\x87\x13\x64\x95\xbe\xa5\x63\xcb\xf0\x75\x90\x28\xc9\x37\xce\x52\x73\xb8\x14\x6c\xeb\x5c\x41\xae\x04\xea\x12\xed\xe9\xf3\xcc\x4e\xd8\xb9\x6d\x3d\x99\xd3\xb3\xf1\x89\x7c\x3f\x9a\xfe\x69\x7c\x2e\xdf\x8f\xfe\x34\x9e\x41\xc3\x4b\x17\x0f\xc1\x65\x3a\x21\x1f\x3a\x1d\xcf\xce\xc6\x87\xe7\x9c\x43\x9d\x9d\xbe\x39\xff\x79\x34\x1d\x0b\xea\x93\x3f\x3a\x3d\xbc\x78\x3f\x3e\x61\xb0\x04\xdf\x9e\xdf\x83\x14\x10\x20\x29\x7c\xe8\xeb\xdb\x69\x03\x24\xf4\xb4\xed\xf4\xf5\xe9\x84\xf3\x72\x7d\x3a\xe2\xfc\x14\xe0\x13\xa8\x41\xe7\xfc\xdd\x64\x7a\xd4\x6e\xda\x69\x75\xdc\xbc\x99\x9e\xbe\xb7\x9f\x9f\x8e\x8f\x47\xe7\xf6\x17\x30\xe5\xc9\x4c\xf0\x9c\xe5\x03\x73\xde\x8e\x1f\xe1\xfa\x82\x04\xf5\x02\x6d\xef\xff\x39\x9d\xca\xd9\xe4\xfd\xc4\xce\x99\x7e\x15\xae\x6a\x08\xb6\x60\xd7\x0b\xfe\x7d\x34\x3a\x1f\x79\x1c\x82\x70\x39\xde\x8d\x66\xf2\xc7\xf1\xf8\xe4\x4b\xc0\x09\xa2\x6d\x86\x6e\xae\x68\xbe\xd0\x38\xd5\x6e\xfa\x4a\xc3\xb7\x0a\xfb\xd6\x93\xd3\x00\x93\x22\x02\x77\x38\x3f\x9d\x9e\x27\xdb\xd0\x1b\xdc\x66\x60\xcf\x13\x76\x9b\xdd\xbb\xfe\xdf\x8c\xcb\x3f\xe8\x27\x7d\x3a\x2e\x6a\x6d\x8c\xfa\x8f\xeb\xff\x7d\x7e\x70\x70\xd0\xb2\xff\x0e\xf6\xbf\xf5\xff\xfe\x31\x3f\xb4\xfb\x6d\xda\x35\x22\x69\x02\xf2\xb5\x20\x4c\xb4\x33\x1f\xca\xfd\x67\xcf\x0e\x24\x7d\x2d\x91\xc7\xc7\x87\x29\x40\x87\x51\xbc\x94\x1b\x52\x52\x21\xa6\x7a\xd1\xe2\x2e\x86\x58\x41\x56\x84\x36\x25\x35\xc1\x2e\x4b\x50\x93\x1c\xf0\xea\x8b\x17\x25\xc2\x2a\x5d\x8f\xa6\x11\xdb\x42\xdb\xc2\x22\x60\x09\xad\x74\xfd\x1a\x3a\x99\xe3\x21\x41\x94\x85\xc6\x02\x46\x6d\x50\xb3\x88\x16\x0a\x84\x18\xda\xad\x63\x09\xe6\xd0\xf2\xcc\xd4\x98\x65\x29\x02\x0e\x90\xd6\x40\xa2\xd2\x9e\xfd\xee\x00\xb2\x22\x5c\x01\x17\x0c\x09\x1a\xb3\xfe\x9e\x63\xe0\x50\x4a\x64\xa3\x33\x9d\x35\x81\x64\x12\xee\x5a\x50\x4a\xe6\x42\x2c\xe1\xd0\x01\x56\x10\x6c\x72\x5d\x2c\x76\x1b\xa3\xab\x96\xe5\xef\xcc\x49\x8f\x96\x17\xcd\x3d\x91\x19\xe4\x23\x12\xac\x8c\x0c\x71\x3f\xfd\xd0\xd5\xfc\x63\x51\xde\xe6\x7a\x71\x65\x1f\xfc\x5a\x88\x01\xf8\x2b\x54\x8e\xef\xa3\xe8\xbd\xf1\x92\x85\xbe\xd1\x79\xb9\x46\xa3\xd0\x7e\x62\x36\x1e\x1d\xcb\x9d\xeb\xba\x5e\xbf\x7e\xfa\xf4\xf6\xf6\x36\x2d\x21\xf9\xa3\xf2\xb4\xac\xae\x9e\x0e\xd3\x81\x10\xa3\x1c\x73\x7e\x1a\xd8\x43\xec\xbb\xe2\x21\x40\x10\x07\xf2\x35\x6e\x31\xdd\xfb\xb2\xda\xe8\x7c\x49\xf3\x5a\x08\xb0\xd5\x6e\x34\x85\x6a\xeb\xeb\xac\x5a\xec\x62\x7e\x2a\x7e\xa4\xb5\xc1\xab\x15\x80\x4e\xe0\x83\x53\x21\x9e\x13\x7d\x2c\x04\xd4\x06\x3c\x76\x8c\xbd\x0d\xe8\xee\x0d\xf0\xb4\x10\x60\xe5\xf6\xe6\x05\x71\x4f\xf3\x82\x1b\xfb\xad\xa3\x45\xce\xec\xf5\x23\xfb\xde\x17\x3b\x42\x5e\x41\x74\x7f\x9f\xc8\x35\xf6\x99\x03\x40\xf2\xbc\x96\x7a\x9d\xff\xa3\x26\x8d\x32\x2f\x57\x00\xfa\x26\xcf\x1e\x31\x02\x8e\x5a\x5a\xb3\x58\x41\xca\xc3\xcf\x1b\x1b\x3a\x56\x6a\x23\xc2\xb5\x08\x77\x21\xab\x60\xb1\x92\x07\x27\x42\x14\x14\x30\x3e\xd1\x32\x44\xc2\xbe\xf7\xff\xfe\xdf\xc1\x06\x7a\xf2\x04\x6c\xa5\xa0\xcf\xdd\x9a\x5b\x1d\xab\x7a\x32\x9e\x25\xe2\xef\xd5\xe9\x6e\xdf\x28\xfe\x0e\x9d\xee\xe3\x93\xf3\xf1\x6c\x36\x4a\xc4\xf1\xf1\x61\x02\xa6\x1c\x5c\x00\x3b\xfa\xf3\x19\x9a\x6e\x93\x1f\x2f\xce\xe3\x46\xf8\x47\xf5\xbe\x8b\xaf\x04\x1a\xeb\x5d\x18\x71\x36\x3d\x3d\xbc\x98\x02\xbc\x1a\x9a\xad\x3f\xce\xce\x27\xe7\x17\xe7\x63\xf9\xf6\xf4\xf4\x08\x6d\xe7\xf1\xf4\xa7\xc9\xe1\x78\xf6\x83\x35\x8d\x61\xcd\x2e\x66\xe3\x84\x4c\xe4\xd3\x29\xdb\xce\x3f\x58\xe3\xf9\xc7\x8b\xd9\x04\x96\x6e\x72\x72\x3e\x9e\x4e\x2f\xce\xac\x3d\x39\xfc\x42\x04\x33\x49\x08\x66\xe2\x8f\x45\x30\x43\x0c\x00\x77\x22\xb7\xc1\x90\x89\x1e\x4b\x9f\x96\x3b\x25\x62\x46\x77\xaf\x00\xc9\xd6\x60\x25\xc7\x4d\x99\x37\x45\x6d\xb5\x4d\xc4\x8f\x83\x4d\x0c\xc0\xe4\x10\xd1\xad\x18\x11\xb1\x73\x39\x11\x6a\xa5\x10\x80\xa3\x7a\xb8\x1c\x87\xaa\x18\xbe\xd7\x35\x52\x5c\x6e\x44\x68\x30\x24\x32\x90\xc1\xa1\xb0\x80\xe4\x25\x64\xfa\xc2\xee\x36\xf2\x89\xf9\xf5\x89\x20\x91\x63\xb4\x96\xff\x65\x9b\x34\xff\xaf\xdf\x3c\x88\x47\xfd\xa4\x4f\x47\x6b\x35\xbf\xd6\xbf\x0f\xf3\x2b\xfe\x3c\x64\xff\xbf\x7a\xf6\xaa\x6d\xff\x1f\xec\x7d\xb3\xff\xff\x90\x9f\xd8\xb6\xdf\xfb\xfe\xfb\x17\xbb\x7b\xdf\x7f\xff\x3d\x98\x1f\x78\x32\xe4\xdb\xaa\x6c\xd6\xa1\x91\x2f\xbf\x19\xf9\xff\x5f\x32\xf2\xed\xc6\xab\xc5\x8d\xae\x6a\xac\x8c\xf1\xdf\x5e\x61\xf9\x1c\x50\xb4\x69\x55\x37\x44\x67\xe7\x2a\xe0\x22\xfb\xce\x5a\xf9\x21\x5e\xc0\x56\x2b\x5f\x6e\x31\xf2\xbb\x86\x3d\x77\xf0\x87\x07\xd5\xf5\xd9\xd1\x32\xd0\xdf\xde\x9d\x9f\x9f\x41\xdf\xaf\xae\x98\x74\x21\x72\x05\x14\x7c\x0c\x1d\x01\x61\x3d\x81\xc0\x04\x97\x03\x7a\xc8\x0c\xbe\x4f\x66\x78\xf8\xd2\x7b\x6d\x71\xf1\xb8\x46\xe2\xc7\xdb\xe2\xe2\x4d\xef\xef\x3b\xb6\x38\xce\xe9\x1f\xfd\xd4\xe4\x6f\x32\xc7\x71\xc2\x03\x6f\x8b\xf3\x2f\xbe\xde\x12\xf7\x1b\x24\x70\xf3\x00\x2a\xb7\xef\x06\x3b\x0a\xb9\xdb\x6b\x55\x9b\x12\x1c\xab\xf6\x4d\xfe\x72\xbf\xb1\xdf\x57\x7c\xe0\x48\x89\xaf\x38\x52\xd2\x1e\xa9\xed\xde\xc6\x8f\x60\x85\xca\xd1\xd9\xe8\xf0\xdd\x58\xbe\x9d\x9e\x5e\x9c\xdd\xe7\x81\x88\x7e\x0f\xe4\xeb\xb0\xb6\x44\xbf\x07\xf2\x35\x58\x5b\xa2\x8b\xb5\x15\xcf\xe9\x8b\x7c\x8f\xbf\x2f\xc8\x71\x22\xfa\x96\xe4\xab\x7d\x0f\xd1\xf1\x3d\xe4\xd7\xfb\x1e\xa2\xd7\xf7\xf8\x4d\xe8\xc9\x22\xf2\x3d\x1e\x8f\x3f\xd6\xf5\x3d\xc4\xc3\x59\x86\xdf\xdf\xf7\xe8\x5c\xc9\xfb\x7c\x10\xc4\x9e\x91\x8b\x72\xa5\x32\xef\x91\xb8\xe8\x05\x19\x12\x27\xcc\x6a\x77\x68\x5d\x10\x84\x28\x98\x35\x6b\x5d\x61\xaf\x97\x15\x23\x23\x9f\x0f\x37\x89\xbc\x28\x32\xa8\xed\xaa\x81\x17\x69\x92\xe7\x59\x51\x66\xf6\xf7\xd5\xa5\x2a\xd4\xee\xe1\xb5\x5a\xad\x55\x76\x55\xdc\xef\xc6\xb4\x67\x21\xee\x57\x52\x4e\xa8\xb7\xbd\x9d\x40\xba\xfc\x16\x5f\x27\x7d\xfa\xf6\xcd\xd1\xf1\xee\x5e\xba\xbf\x5b\x56\xbb\xb9\x55\xed\x7f\x77\x37\xe0\x7e\xfb\xff\xf9\xab\xe7\x2f\x9e\xb5\xec\xff\xe7\x07\xaf\xbe\xe1\xbf\xfd\x21\x3f\x6f\x4f\x2e\xb0\xd0\x2f\xce\x64\x73\x9d\xa5\xa0\x44\x80\xdc\x4b\xf7\x13\x79\x52\xde\xe8\xd5\xa5\xae\xe4\xfe\xb3\x67\xfb\x42\x04\xbe\xc3\x21\xe4\x05\x9e\x25\xfb\xcf\x9e\xed\xd9\xff\xd9\xc7\x87\xba\x5c\xb9\xc7\x27\x86\xea\x8e\x54\xbe\xd8\x93\x6f\x2a\x55\x7c\xcc\xb3\x42\xce\xea\x44\xbc\xc9\x96\xf5\xb5\x7c\x93\x97\x65\x95\xc8\x1f\x4b\x53\xff\xbf\xec\xbd\x7b\x73\xdb\x48\x96\x2f\xf8\x7f\x7e\x8a\x0c\x45\x6c\x58\x8c\x80\x51\x96\x5c\x55\xdd\xe5\xda\x88\x09\x5a\x82\x6c\x76\x53\xa4\x9a\xa4\xaa\xca\xf7\xc6\xc4\x44\x8a\x48\x8a\x68\x83\x00\x0b\x09\x4a\xe6\xfd\xf4\x1b\x79\x1e\xf9\x00\x40\xd9\xd5\x73\xa7\x77\xef\x6c\xfb\x8f\x99\x2e\x11\x48\xe4\xf3\xe4\x79\xfc\xce\xef\xd8\x27\x6f\xc7\xf2\xcd\xe5\xc5\xc5\x9b\xd7\x17\x6f\xdf\x5c\xc8\xfb\xe5\x58\x88\xec\x49\x37\x90\x72\x6a\xaf\x73\x67\x26\x10\x20\x15\x53\xd5\x3c\x4e\x93\x91\x0c\x51\x6a\x60\xe1\x20\x6e\x8e\x90\x28\x91\x0f\x87\x16\x2b\xb4\x61\x7a\x09\x17\x99\x55\x56\xa1\xe0\x9a\x0a\x6f\x52\x79\xb7\xc8\xc6\xb7\xef\xa7\x99\x15\x74\x51\x85\xfb\x2e\x8e\xde\x55\xe9\xb5\x72\xed\xa0\xca\x04\xd0\xa5\x0f\x75\xfd\x39\x28\x78\xe8\xcb\x1a\x0b\xb2\x9b\x36\x87\xd2\xe9\xed\xf2\x6c\xd3\x68\xa8\xc7\x8f\x6e\x66\xa6\x11\xb3\x7f\xcd\xeb\xdd\xbb\xa0\xd6\x8d\xe6\x49\xb1\xda\x09\x16\x42\x2a\x9e\x34\x3f\x19\xcd\x4e\xe0\x84\xd7\xb2\x68\x4f\x58\x63\x47\x9c\x86\x44\x50\x26\xb8\x4f\x64\xc5\x1a\xdb\x58\xf6\xc4\xfd\x29\x95\x4b\x6d\xad\x13\xd5\x14\xce\x6f\xee\xc0\xbc\x4c\x89\x24\x38\xaf\x06\x91\x19\x98\xae\x42\x2c\xc9\x8d\x54\x08\x4f\xad\xe5\xa3\x6e\xb9\x32\x1d\xbd\x50\x34\x80\x8c\x4c\xe4\xf3\xb6\x28\x01\x6c\x29\x1e\x34\x19\x80\x54\xa4\xa9\x07\x8f\x8e\xa1\x1b\x7c\xc7\x60\xfd\x1e\xbe\xa6\x82\xe5\x52\xf2\x73\x81\x65\x60\xcf\xec\x4c\x95\x7a\xd3\x9e\x25\x94\xc6\xc4\x0c\x27\xaa\xed\x73\xcf\x51\xde\xb1\x5b\x32\xa4\xe2\xd8\xea\x9d\xd1\xe5\x93\x36\x56\x7b\xb6\x8b\xe0\xd6\xd0\x1a\x13\x06\xb1\xd8\x93\x16\x91\x97\x94\xbc\x63\x57\xce\x9e\x45\x28\x93\xa9\xca\x4e\x3c\x8e\xfb\x52\x60\x45\x63\xec\xa1\x83\x12\x61\xe1\x38\xa2\x18\xb1\xdf\x13\x7c\xe7\xa5\x42\xfc\xaa\x11\x96\xe2\x1e\x8a\xb7\x6a\x25\xeb\x06\x52\x5c\x6b\xd4\x70\x5b\xa2\xf5\xb2\x9b\xd6\xb8\x06\xdd\x25\x9a\x88\x07\x8d\xa9\x00\xd1\x9f\x01\x61\x63\xf0\x6f\x91\xdd\xf9\x4e\x2a\xfc\x2b\xb3\xdc\x52\x85\xc9\x75\xbd\x43\x54\xb8\xfb\x94\x2b\x2e\xed\x67\x8a\xf6\x6f\x50\x0b\xca\xeb\xeb\xb5\x36\xa9\x7c\x4f\x69\x20\x22\x58\x4a\x7b\x6c\x21\x71\x07\xc5\x42\x60\xd0\xc0\x77\x7e\xb6\x43\x5c\xab\xca\xd9\x69\x0c\x4a\xb2\xe7\xf3\xa0\x4a\x81\x5b\x0d\x6b\x0b\x00\x34\x0c\x72\x07\x10\xf9\xb6\x53\x6d\x8b\xa9\x25\x2e\xaf\x1e\xcb\x0d\x3a\xb2\x6f\xc8\x57\xdf\x37\x05\xe4\x79\xda\xe3\x9e\xca\x5f\xa1\xe2\x3f\xa4\x3b\xe6\xdd\xa3\x51\x54\xeb\x62\x0f\x87\xca\x76\x03\xf7\x14\x12\x60\xb2\x6c\x01\x60\x96\x69\x9b\x03\xa6\x7b\x42\xaa\x1d\xb0\x01\xad\x35\x4a\xa5\x8b\x54\x8e\xef\xee\xa6\x93\xab\x50\x77\xbf\xce\x6e\x26\x33\x2c\x66\xd2\xd9\xec\x1d\x7e\x4e\x9c\x15\x2f\x92\x70\xf4\x5c\x1a\x5c\xe7\xc5\x61\x97\xf8\xc4\x14\x55\x54\x46\x38\xa0\x34\x11\x71\x92\xc1\xe4\x9d\x17\xdb\xba\x04\xaa\x18\x45\x52\x84\xa7\x3b\xa4\xd6\xf1\xf9\x7e\x27\xf2\xa2\xa1\x54\xa5\xfb\x14\x33\x5d\x21\x33\xe0\xeb\x3e\x35\xa0\x08\xc8\xff\x78\xf5\x8b\xca\x91\xf0\x25\xbc\xbf\x61\x28\x90\xdb\x1f\x64\x76\x07\xb5\x59\x81\x81\x43\x60\x86\x23\x3a\x00\x1c\x78\xf1\x2c\x91\x0f\xba\xac\x9f\x13\x5c\x01\x37\x85\xc4\x14\xc5\xf3\x48\xa4\x3e\x30\x7d\xf6\xae\xe4\x1a\x9a\xa4\x94\xc2\x09\xe6\x3c\x55\x62\xf7\x33\x52\xe5\x79\xa3\x8d\xc1\x0d\x74\x76\xac\x0f\x67\x54\x5b\x03\x72\xe6\x43\xca\x2b\x51\x00\x3c\x3d\xa6\xdb\xee\x52\x6d\xa3\x78\xc2\xc2\x47\x56\xac\x22\x02\xcf\x95\xee\x43\xf3\x1b\x97\x20\x4a\xc9\x4e\x85\x18\x07\x29\x0b\x74\xf7\x9f\xb9\x8a\x9c\x4e\xcc\xb9\x6a\xcd\xf0\x9d\xa0\x38\x6a\xf8\x98\x40\x32\x0f\x5f\x1f\xdc\x5e\x37\xee\x42\xd9\x17\x01\xd4\x30\x71\x30\xfc\x58\x70\x93\xd7\xca\xd1\x89\xe6\xa2\xa8\x60\xda\xb9\x62\x70\xf5\x78\x40\x02\xeb\xb1\x3c\xe3\x3b\xe8\xc8\xc9\xd1\x67\x38\xdb\x95\xda\x69\xc8\xb8\xd0\x55\x5e\x7c\xc1\xac\xaf\x4d\x53\x57\xed\x6b\x3a\xcf\xc6\x57\xf3\x86\x12\xe6\x3c\x4c\x92\xf9\x56\x3a\x39\xd2\xc9\xb0\x00\x59\x54\xed\x2f\x5c\x66\x03\x65\xe2\xea\x46\x30\x08\xb1\x3b\x81\x5c\xa1\x95\xfe\xfb\x95\x01\x56\x28\xcc\xf0\x43\x51\x73\x8e\x19\x2c\xf0\x09\x9d\x93\xe4\x31\x23\x41\x29\xf6\x70\x14\x1d\x31\x1c\x1d\x50\x2b\x58\x37\xb6\x11\x4c\xd1\xa2\xae\x72\xb1\x89\xce\x17\x52\x71\xbe\xda\x1e\x4c\xc2\x95\x48\x5d\xdf\x40\xe2\x20\xed\x89\x72\x5a\x8b\x1d\xc1\x4e\xd9\x9b\x4d\xb5\xc5\xda\x24\x52\xc9\xde\x74\x0b\xf6\x19\xe9\x2f\xfb\x52\xb1\x0c\xf1\x2f\xa5\x58\xde\x37\x9a\xb5\x35\xd7\x1b\x56\x4e\xb8\x6e\xe4\xb6\x30\x6d\xdd\x14\x6b\x55\x8a\x6e\x16\x25\x5c\x02\x34\x45\xbc\x65\x3a\x73\x84\x0a\xd6\x06\x13\xef\x92\x40\x75\x49\xc4\x7e\x5b\x94\xb5\xa9\xf7\x5b\xdb\x76\x22\x75\x0b\xff\x03\x62\xe5\x75\x59\x60\xc1\x58\x60\x52\x44\x52\x45\x7b\x05\xd0\xa6\xde\xa5\xa8\xf2\x9d\x4d\xaa\x27\xd5\x14\xaa\x6a\x79\xd4\xe6\x0c\xe1\xcc\xba\x01\x3f\x54\x6f\x56\x58\xa0\x43\x26\x2a\x71\x8c\xb9\x42\xaf\x50\x16\x1e\x95\x19\x4c\xa1\xb1\x86\x65\xef\x0b\x8e\x3f\x8b\xa4\x21\x56\xc0\x56\xc7\xb0\x48\x22\x9f\x39\xc0\xdb\x82\xc5\x38\xc4\x01\x84\x49\xa0\x6e\xc3\x3b\x02\xda\x4d\xd1\x06\x7e\x68\x9f\x2d\x68\x85\x97\x1f\x11\x14\x3c\xeb\x29\xc7\x94\x2e\x1a\x56\xaf\x35\x7e\x10\x28\x44\x5d\xf7\xec\x16\xa1\xed\x2b\xff\x97\x6e\xea\x81\xd1\x3a\x7e\x7c\xb7\x23\x5d\x37\x89\x76\x0b\x48\xdd\x44\xff\x4d\xec\x20\xe4\x06\xc3\x3c\x57\x75\xa5\x79\xdd\xae\x20\xf9\x77\xa5\xbf\xb4\x9d\x05\x33\xdb\xba\x69\xe5\x5e\x19\xc3\x4c\x34\x90\x07\xe6\xb8\x60\x91\x60\x03\xf8\xc2\x6e\x40\x68\x40\x4b\x02\x5a\xb2\x3b\xe7\xbd\x5a\x7f\x7e\x1d\xb4\xfe\x07\x16\x4b\x06\x8b\x25\x86\x16\x6b\x1c\x7e\x12\x9a\xe7\x8c\x7d\x65\x15\x75\xd3\xca\x1f\xac\x04\xce\x29\x89\x5e\x05\x9d\x11\x43\x4f\x5f\xd2\xe3\x28\x2f\x57\x56\xaa\xee\x55\x03\x3c\x7e\x21\xd9\x68\x57\xce\x0f\x33\xac\x26\xbe\x5a\x27\x32\x2f\x42\xf9\xe1\x9d\xbd\x5f\x61\x2b\x53\x02\xd7\xda\x95\xa7\xf3\x2c\x79\x24\xfe\x1e\x49\xd7\x65\xd6\x64\xce\xb6\x32\x87\x02\x0b\xc9\x63\xf5\xe3\x27\x0c\x3b\x44\x8a\xb6\x69\x1b\x65\x6f\xad\x4d\xdd\x3c\x5b\x45\x8d\xa4\x32\xb4\x58\xac\x71\x09\xad\x0d\x51\x37\xc0\xd2\x77\xbe\x01\x0e\x2b\x58\x61\xab\x75\xd7\xe0\x29\xda\xc8\x7d\xf1\x45\x97\x66\xe4\xde\xdb\xab\xa2\x6a\x7d\x19\x07\x7e\x33\x6f\xd4\x73\x51\x3d\x9a\x91\x30\xf5\x4e\x4b\xab\x7e\x94\xc7\x60\x3c\xf4\x3b\x7d\x31\xf1\x10\xfb\xc2\xc8\x68\x30\x45\xb5\x3f\xa0\xf4\xd7\x5f\x5a\x81\xd3\xd5\xe2\x5d\x81\x8a\x28\xd3\x70\xb8\x2b\x8f\xd2\xe5\x95\xb4\x9b\x5d\x23\xf3\x1a\xbe\x17\x37\x2d\xa2\xa6\xa5\x6f\xda\xee\x22\x58\x5c\x30\x82\x90\x3b\xd6\xb3\x42\x06\x7b\x00\x11\xe6\xf8\xa2\xc0\x25\xdc\xa9\xe6\xf3\x61\x8f\xe4\x46\x0f\x06\xe8\x3a\xe0\x1e\xc0\xbf\xfa\x94\x33\xa4\xef\xa6\x54\xcc\x67\x20\xcc\x02\x8d\x84\x2a\x53\x88\xa0\x3e\x4e\x78\xbf\x5b\xd5\xd1\x6e\x29\x3b\x01\x24\x53\x82\xfe\x58\x25\x0a\xd7\x8c\xf7\x15\x25\xe2\x85\x7d\x2e\x36\xb1\x16\x6f\xbf\xd4\x2a\x64\xee\x52\xbb\xfa\x80\x79\xc9\x50\xd8\x83\xe7\x21\xcc\xe9\x8b\xcf\x40\x61\x5c\xac\x63\xbe\x57\xbf\x1f\xf4\x59\x2a\x44\xf6\x45\x59\x2b\x8d\xec\x00\x3f\xe1\xb0\x02\xf6\xb3\x61\x77\xc8\xcf\xc0\x60\x36\xbc\x06\xc7\xcb\xab\xc9\x84\xed\x6b\xc1\xb3\xb7\xd2\x5f\x8a\x6a\x53\xd3\x96\xc0\x06\x13\x39\x55\x2b\xfd\x5b\xe7\x6f\xcb\x0f\xb7\x53\x3b\xa1\xbf\xdd\x4e\xe5\x01\x59\xb1\x1c\xbd\xb6\xf0\x9b\xf0\x7a\x75\x8d\x3b\x0f\x72\xa3\x55\x93\xbf\x5e\xd7\xe0\x7e\x84\x34\xe9\xc2\x0e\x42\x7e\x5c\xdd\x4e\x13\x79\x57\x9b\x76\x09\x84\x86\x50\x35\xed\xfa\xc6\x19\x87\x60\xa3\x6f\x0f\x3b\x55\x75\x52\x75\xc3\x59\x68\xc3\xf9\x0f\xd6\xc7\x8f\xfb\x6e\xf6\x21\x11\xbf\x5d\xdd\x40\x77\xfe\x72\xf7\x21\x95\x38\x9f\xbd\x07\x91\x80\x42\xb7\x1c\x1b\x55\x5c\xf8\x97\x4c\x06\xbb\x3b\xc0\x49\x6a\x4f\x16\x73\x0c\x3c\x1c\xa3\xf7\xac\x44\xe3\x9c\x44\xa8\x54\x16\xce\x17\x98\x55\x60\x3a\x83\x60\x5b\x5d\x73\x20\x94\x5e\x40\x52\x94\xba\x34\x74\x61\xb4\x2c\x94\xc2\xf3\x9d\xb8\x78\x2b\x0b\x42\x57\x2d\x58\x9c\x9a\x51\x8a\xee\x82\x79\x84\x42\x23\xee\x26\xf4\xac\x3e\xb4\x76\xa1\x39\x5d\x5f\xd8\xe1\xf1\x85\xb5\xb2\xfa\x82\xbc\x53\x8f\xcc\xcb\x9d\x30\x3b\x1e\x5a\x97\x12\x9d\x49\x60\x42\xc1\xa3\x7b\xbb\x12\x8c\x41\xdc\x97\x07\x24\x03\x13\x3e\x28\xb6\x07\xf1\xa7\x68\xa8\x5a\x13\x8b\x92\x35\xd7\x12\xab\x2d\x15\x0f\xe8\xbc\xd1\x2e\xc2\x1b\xe7\x5c\x53\x1e\x0f\x1a\x3e\x11\x04\xd2\x77\x00\x7d\xdf\xcf\xcc\xe1\xca\x6b\x4a\xf5\x70\x6a\x98\xe1\xad\x7a\xd2\x02\x09\xc7\x5c\xbf\x15\xf6\x36\x19\x18\xb7\x74\xb9\xd9\x95\xfd\x24\xf4\xcf\x5e\x66\x8e\x01\x53\x60\x67\x14\x89\x27\x36\x7f\x5e\x19\xfc\x40\xe2\xd9\x13\xe1\xb7\x07\xfd\x58\x54\x60\xac\xd0\xc3\x0f\x75\xce\x57\x9f\xa0\x12\x40\x63\xa7\x22\x9d\x65\xcc\x21\xf2\xdb\xa7\xff\x71\xe6\x6e\x44\xb4\x29\xcc\xe1\xe1\x50\x15\x6d\xef\xde\x0c\x34\x3e\xf6\xa0\x41\xf4\x51\xaf\x0b\x63\x6f\x8e\xdf\x3e\xfd\x0f\xa6\xa2\x07\x3d\xde\xfe\x37\xea\xdc\xba\x02\x3e\x2d\x13\x65\xba\x91\x3a\x22\x9c\x19\xe4\xde\xe8\x19\x42\xf2\xfc\xa3\xd5\x7e\xec\xcf\x20\x06\x98\x52\x91\x2f\x63\x1e\x97\x80\xb8\x36\xc5\xef\xed\x66\x42\xcb\x16\xf9\x47\x8c\x3c\x1b\xbb\x00\x2a\xfa\xa7\xce\x12\x79\x76\xad\x73\x36\xcc\xec\x7f\x66\x18\xdd\xa6\x9f\xed\x2d\x7b\xf6\x11\x14\xf7\xe3\x99\xd5\xf4\x6b\x79\x76\xc7\x15\x00\xed\xe4\xc0\xba\x9e\x79\x92\x13\x37\xc3\xcf\x56\x69\x83\x84\x72\x47\xff\x2e\x3a\x1a\x08\x17\xcb\x6c\xf4\x0e\xe6\x4b\x9d\x5a\x1e\xb5\x5e\xd7\xa4\xb3\xd7\xc4\xad\xe8\x74\x59\x3a\x58\xbe\x69\x75\x74\x72\xc8\xf1\x9a\x7a\x16\x53\x23\x2b\x98\xf8\x28\xc3\x1b\xf7\x31\x78\x09\x8c\xf0\x49\x74\x03\xce\x95\x70\x3f\x80\x0e\x6c\x4e\x7c\x45\x35\x5a\x04\x8e\x4c\x54\xa6\x1d\x78\x1a\x6e\x48\xf2\xf7\x74\xf3\xcb\xd1\x6b\x0d\x22\x51\x19\x32\x57\x3c\x99\x24\xf0\x94\x38\x26\xce\x77\x21\xb3\xf7\xce\x67\x79\xb2\x4e\x7a\xa2\x77\xa0\xaf\x83\xfb\xb0\x30\xf2\xa9\x2e\x40\x18\xc3\xc5\xef\x2a\xee\x73\x5c\xcb\xae\x94\x3b\x54\x11\x21\x90\x94\xf2\x32\x95\xbf\x64\x8b\xf7\xe3\xd5\xe4\x56\x5e\xcd\xef\x3e\x4d\x66\x1f\x84\xe0\x9c\xf8\x21\xcf\x7d\xac\x26\xc7\xee\xa8\x01\x9f\xb4\xe8\xfb\xa4\xbb\xc9\x92\x5d\xf6\xc2\x3e\xdc\x06\xb5\x68\x11\x38\x5b\x1c\x17\x01\xba\xb2\xbe\x65\xad\x29\xf3\x92\xc5\xbf\x88\x72\x2f\x03\xcd\x10\xca\x77\xe5\x39\x14\xe0\xa7\xe1\x38\x2f\x54\x00\x71\x70\x94\xd3\xe0\x69\x0e\x6d\x83\x90\xe9\x01\x3c\x5b\x7a\xbd\xad\xc0\x82\xdd\x69\x65\x0e\x0d\x93\x14\xa2\xef\x30\xa8\x7c\x41\xc4\x51\x0a\x8e\x89\xd5\x3b\x0f\x0d\xbb\x64\x8e\x81\x54\x24\x55\x06\x99\x1e\x3e\xeb\xd8\xc7\xe4\x89\x34\x04\x51\x41\xb0\xab\xca\x6a\xd7\xba\x32\x9c\x03\x20\xf5\x17\x2c\xd9\x06\x72\x08\xdb\x04\x03\xef\x18\x53\x39\x2a\x59\xaa\xe6\x51\x0b\x5d\xd5\x87\xc7\x2d\x15\x80\x24\x0e\x2b\xd7\x8d\x83\x69\xb1\x08\x5b\x90\xc6\x19\xb3\xe2\xb1\x58\x78\x9b\xfa\xed\x05\x6f\x94\x1a\x79\x3c\x60\x11\xbc\xeb\x0f\xdc\xcc\x3d\xff\x1f\x9a\xc1\x09\x33\x5d\xc0\x21\x70\x85\xd5\x18\xc2\x44\x63\x81\xed\xfd\x36\xe5\x5d\x2d\x27\x33\xf9\xb7\xfb\xf1\x6c\x35\x59\x7d\x12\x82\xc6\xc9\xa5\x32\xf9\xe6\xa6\x31\x9d\xbb\x19\xb1\x5d\x07\x5e\x41\xf6\xe4\xec\x76\x70\xac\xe1\xe4\xb1\x37\x19\xe8\xab\x98\x60\xd8\x6f\xb8\x84\x26\x0b\xcb\x70\x40\x76\xa8\xaa\xe4\xc5\x9b\x37\x49\x2f\xa9\xf8\x95\x8f\x7c\x55\x4c\x14\x4d\x57\x7a\x64\xc0\xba\xc9\xd6\xd5\xba\xac\x89\x0f\xc7\xf7\x14\x3b\xc2\x7a\x5a\xd3\x1c\x13\xc1\x89\xac\x90\xe0\xcc\x9a\x04\x31\xc7\x1a\x1d\xb6\xfe\xae\x67\xd2\x1a\x97\xf4\x6a\x7f\xc0\x61\x62\xdf\xbb\xa6\x35\x3f\xf8\xa0\xd6\x9f\xb1\x17\xa9\x7c\x5f\xb7\x5b\xee\x91\xdf\x20\xd4\x1f\x11\xf4\xc7\x3b\x0f\xe0\xe8\x99\xd8\x5b\x47\xb3\x6a\xb4\xdb\xa3\x2b\xee\x11\xb6\x2e\xa0\x71\xb2\x77\xb1\xbb\x07\x3b\x3e\xd0\x56\x1c\x1f\x14\x58\xd7\x8e\x15\x0a\x7e\xd3\xbf\x43\xdd\xe0\x50\x5d\xa9\x72\x69\x6d\xda\x87\x32\x38\xc6\x56\x16\xc4\xe0\x3c\x1e\x2d\x0d\xce\x0a\x92\x1c\xf7\x69\x0a\x19\x59\x45\xf5\x88\x11\x14\x3c\x60\x26\x8c\x7a\xf8\xf7\x92\xb0\x88\x07\x24\x0e\xef\xc3\x5b\x19\xfb\x48\x61\x2c\x2f\xc3\xac\x15\xe1\x6a\x96\xe8\x88\x99\x34\x61\xdd\x1c\xc8\x3a\xd1\xdb\x13\xc6\x59\xa1\x5f\x05\xd9\x98\x5c\x52\xd8\x9e\x13\xf2\xea\x70\x36\x38\xe8\x35\xa8\x9e\x38\x81\x0e\xcc\xf8\xc0\x7b\x59\x03\x5e\x64\x57\x54\xf5\x01\xe4\xd8\xa6\x68\xdd\xc6\x02\x91\x43\x71\x24\xb0\x79\x5d\xc2\x74\x5d\x79\x46\xd4\x73\x65\x10\x53\xa2\x0c\xbc\xed\x39\xd1\x47\x3c\xb3\x0a\x8a\x5b\x84\x3b\x8e\x8b\x9b\x50\x4f\xa1\x49\xab\xed\x72\x31\x31\x50\xa1\xd3\xde\xc1\x8e\xfd\xef\x64\xeb\xc4\x74\xb4\x6e\x6e\xe3\xd3\x2a\xfc\x69\xf5\xa7\x8e\x34\x46\xd2\x4d\x06\xdc\x2f\x1d\x93\xf3\x08\xd5\xb9\x68\x37\x40\xb2\xb8\xef\x02\xd2\x86\x81\x5c\xc3\x60\x9f\x1c\x7c\x0a\xc2\x8a\x48\x71\xfc\x9a\x2a\x13\x88\xb2\x26\x25\x01\xe0\x81\xde\x8a\x62\xb7\x0d\x3d\xf7\x1a\x6d\x52\x8a\x6f\x58\xdd\x80\x0a\xc9\xb4\xb5\xcc\xeb\xe7\xaa\xac\x55\x2e\xc2\x67\x5e\xb3\x81\xca\x2d\x40\xb1\xf1\x7a\x0d\x56\x18\x05\x45\xdb\x81\x41\x76\xdc\xf3\x09\x06\x16\xeb\x8d\x3d\x17\xe8\xfe\x85\x73\xe3\xae\x17\x66\xf2\x2a\xc9\xb1\xbc\xc7\x48\x90\x9b\xe7\x56\x7d\x86\x8b\x90\xa9\xf2\xf7\xcd\x21\x47\xdf\x92\xde\x9b\xc4\xeb\xa5\x60\x30\xf4\x2a\x8d\xc6\xab\x5c\x54\xe2\xf7\x83\x42\xe6\x33\x84\x7e\x42\x60\xde\x6b\x1e\xbd\xd1\x40\x29\x64\x54\x68\x65\xbb\x3d\xf0\xac\x15\xc8\x30\x88\xb7\x13\xde\x46\x6e\x1d\x0e\x55\x5b\x94\x52\xd9\x93\xa0\x70\xb7\xcb\x23\x30\x2d\x03\x67\x24\x0e\xd5\x8e\xab\xd8\xe9\xce\xfd\x2a\x54\x15\xad\xf6\xb9\x8b\x10\x40\x88\x1d\x38\xf5\x90\x58\x48\x3d\x62\x11\x96\x06\x81\x95\xa5\xbf\x72\x14\x7a\xd4\xac\xf1\x10\x55\x3b\xb3\xc7\xa1\x65\x9e\x07\x8d\xce\x52\xab\x98\x5a\xc5\x84\x0f\x7b\xe2\x95\x1e\x06\xa7\x7a\x24\x40\xef\x8c\x08\x28\xcc\xf0\xa0\x37\x75\x13\x67\x0d\x52\xd1\x7a\x50\x15\x7a\x3a\x02\xcc\xfb\x23\xb1\x23\xee\xec\x4e\xda\x02\xd9\x74\x50\x2b\xca\x7e\x1f\x65\x75\x25\x0f\xfb\x1c\x66\xb7\x53\x1c\xda\xe9\xec\x70\xb1\x7f\x9f\xca\xdb\xf9\xf5\xe4\x66\x72\x35\xa6\x60\xea\x4b\x4a\xab\x92\xdd\xd0\x59\xef\xf4\x0f\x45\x1d\x85\xb5\x89\xd8\x85\x7d\x09\x8d\xbe\x65\x15\x24\xd6\x61\x6d\xff\xc3\xc2\xae\xdd\xcf\x91\x13\xd9\x1b\x9a\x1d\x8e\x44\x8e\xa0\xf4\xba\xc9\x75\xf8\x41\xec\xd5\xfd\x1b\x21\xc1\x2d\xea\x69\x2d\x7a\xa0\xff\x5d\x87\x78\x2e\xfc\x8c\x03\x11\xb5\xb5\x35\x8d\x41\xb1\xdd\x03\x09\xba\xb5\x74\x95\x3b\xdd\x45\x8b\x44\xa1\x74\xcd\x05\x47\x15\x8b\x18\x1a\x2b\x2e\x8b\xea\xd1\x71\x8c\x75\xc7\xf1\x4e\x88\x71\x0a\xd5\xc2\xe9\x01\xef\x4c\x90\xe7\xc0\x60\x53\x45\x57\x23\x66\xa0\x8e\xa4\xa2\x7b\x10\xcb\x91\xaf\x5d\xa1\x1d\xd5\x33\xed\xf1\x9a\x20\xbc\x34\x05\x6c\xf6\x8d\x7e\x2a\xec\x3d\xe5\xca\xa0\x9f\x93\x9d\x08\x77\x94\xfd\x8c\xc0\xa0\xc4\x33\x44\x26\xaa\x63\x82\x24\xfa\x26\xa8\xf6\x40\xa6\x73\x27\x16\xe9\xbe\x3b\x72\x9a\x82\x60\xb1\x06\xba\x2b\xf6\x9b\x50\x07\x71\x37\x38\xb0\xe7\xe8\xc5\x3a\xca\x8e\x6a\x1d\x55\x9d\x3d\x35\x26\x42\x98\x8b\xf7\xa9\x9c\x42\xde\x41\x77\x22\x41\xa1\xa0\x83\x9b\x48\x2a\x0a\x09\x8a\x27\x55\xc5\x81\xc2\xf8\x44\x77\x19\xe2\x72\x04\x39\xb8\xb9\xfc\x27\x8d\x30\x0e\xf8\x9e\x58\x58\x7b\xb6\x1f\x11\x71\x01\x3c\x65\x4e\x06\x6e\xec\x79\xe7\xd0\x2b\xc3\x29\x4e\xc9\x15\x79\x1e\x90\xcc\xbb\xa7\x85\x1b\x4c\x61\x7f\x81\x1b\x6c\xa3\x9f\xb9\xdc\x94\xfd\xc2\x28\x61\x9e\x20\xd0\xa0\xf8\x08\xda\xed\xe9\xa1\xf3\x01\x17\x6f\x2a\xc4\x55\x2a\x97\x70\xe9\x46\x13\x08\xbe\xae\x36\x60\xc7\x1b\x52\x42\xfb\xa3\x17\x5d\x75\x35\xe5\x32\x8c\xd7\xa9\x74\x5e\x16\xd2\xb7\x07\x8a\x68\xf7\x65\x5b\x96\xca\x71\x9e\x53\xad\x22\xc7\x02\x3c\x58\x24\x35\x60\x37\x74\x61\x79\x5f\x5c\x15\xc4\x44\xed\x0c\xc8\xe8\xbb\xa9\x10\x37\xf6\x44\x83\x1e\x93\xc4\xdc\xe9\xee\xca\x1a\xb2\xc2\xbb\xf6\xf7\x63\xf1\x44\x54\xf3\xac\x66\x04\x38\x06\x87\xec\x18\x90\x6b\x03\xf5\xfa\x43\xbc\x90\x8b\xd5\x41\x66\x81\xd9\xd6\xcf\x95\x4b\x1b\xc9\x73\x5d\xe5\x87\x1d\x7a\xc6\x52\x21\x3e\x04\x33\xcd\x21\xf5\x4e\x37\x9d\x55\x50\x32\xe8\x79\x20\x46\xa9\xaa\x5c\x38\x1d\x38\x34\x6e\xec\x21\x74\x9f\xef\x9b\x6c\xf4\x11\xb7\xf2\x1f\xdd\xcc\xc2\x6d\x56\x41\x81\x55\x34\x2e\x8f\x03\x4e\x98\x49\xd0\x7d\x84\x13\xa2\x9c\x71\xfe\x33\xe7\xbc\x4b\x82\x71\xb6\x06\x37\x2e\xc5\x17\x73\x60\x52\x86\xda\x8e\xb2\x68\xf5\x0e\x34\x14\xb8\x95\xf9\x3c\x3a\x9b\x22\x01\xd5\x24\x01\xd2\x23\x77\xc0\x62\xc8\x1f\xdd\x31\xbd\x45\x53\x3c\x17\x3d\xd9\xc3\xa1\xe1\x86\x90\x5e\xbd\x51\x08\x37\x8a\xee\x44\x26\x5c\x43\xc9\x4a\x2c\xee\x76\xaf\xb7\x61\x4f\x45\xef\x5c\x7a\xfb\x28\xe8\xa1\x9b\x23\x92\x8e\x10\x83\x56\x78\xb6\x60\x8e\x7c\x9d\xcb\x93\xc3\x8d\x0b\xff\x38\x41\xce\xb5\x7e\x52\x21\xfe\xd2\x59\x3e\xd6\x9c\x59\x37\xf4\x6c\x0a\x83\xdb\x08\x0e\x32\x1e\x1d\xe1\xb5\x73\x75\x4a\xc7\xee\x5c\x77\x65\xf1\x59\x43\xb4\x70\xe8\xcb\x46\xbc\xf0\xc5\xde\xcd\x58\xb4\x80\xda\x67\xa8\x3e\x7b\x46\x31\x4e\x2d\x08\x51\x46\x4d\xf9\xb5\xa4\x65\xf6\xd6\x72\xbd\xb3\x9b\xb0\xd7\x17\x72\x76\x83\xf5\x82\x48\x2f\x15\x81\xf3\xdc\xad\x61\x45\x9a\x5d\x71\xc3\x5a\x66\xec\x6f\xa4\x20\x4a\xdd\xd0\x1d\x2a\x4e\xdd\xa1\xbe\x0a\x34\x58\x98\x0c\x0b\x1b\xb8\x4f\xff\x8a\x91\x11\x88\x51\xf6\x8e\x5e\xcf\xdb\x0e\x6c\xab\xb1\xbf\x9d\x97\x5f\xf8\x23\x41\x5d\xa0\xf6\xe8\x78\x45\x32\xca\x9f\x73\xbe\x1c\x28\x40\x8a\x89\x99\xa2\x85\xfb\x9b\x18\xc6\xfa\xf5\xac\x82\x3c\x2a\xcf\x31\xff\x9d\xb5\x76\x7d\xd7\x70\xc3\x09\x2a\x83\x96\x0a\x31\x1d\xb8\x92\x06\xe4\x60\x6f\xa7\x79\x11\xc6\x89\x64\x10\x8d\xa1\x32\x21\x92\xea\x78\x02\x8a\x26\x75\xc5\x4e\xd0\x08\x30\x5c\x0b\xc8\xca\xd5\x27\x55\xb2\x1f\x96\x68\x5b\xc9\xb7\x2e\x7c\x29\x27\x3f\x2f\xd4\xa0\x10\xb7\xa9\xbc\xd6\x60\x78\x0e\xaf\x51\x14\xee\x70\xf8\x44\x7e\x2e\x48\x97\x63\xdf\xbd\x38\xa1\xcb\xa4\x42\xcc\x52\x79\x5d\x93\x81\x44\x1a\x5c\x75\xf4\x74\x7e\xae\x6f\x10\x0b\x38\xd1\x05\xa4\x38\x16\x5c\x06\x01\xa6\x28\x70\x46\x55\xc7\xfe\xa4\xbb\xbb\x63\x1e\x2e\x51\x75\x1c\x74\xfd\x7b\x8f\x4d\x4f\x62\xb9\xf4\x39\x2b\xdc\x87\x90\x74\x58\x4a\x14\x01\x77\x50\x2d\xc7\x2a\x9b\xbf\x1f\x54\x09\xd8\x1d\x33\x04\x92\x0a\x70\x6d\x56\xb0\x3b\x27\x18\x01\x05\xb9\xb0\x9f\xdf\x2f\xde\xf1\xcc\x34\xba\xfb\x96\xca\x0a\x23\x0e\x09\xc3\xae\xb6\x23\x8e\xa8\xdd\x68\xdf\x43\x65\x95\x4d\x06\x29\x89\x55\x8d\x36\x46\x61\x65\x7f\x9e\x47\xbb\x8d\x1d\x6a\x9c\x87\x3b\xb0\x99\x3b\x4b\xcd\x06\x4f\xff\xf6\x26\x79\x47\x0d\x33\x0f\x60\x64\x77\x04\x91\x1a\x0e\xd6\xb9\x4d\x1a\x7a\x0b\xd5\xd7\x36\x69\x60\x3d\x16\x6d\x0f\x34\x28\xac\x8d\xae\x83\xe7\xfb\x64\xcd\xbc\xde\x0f\x47\x40\x9f\x58\x41\x0e\xa5\xd9\xb4\x79\xfd\x1a\xfc\x76\x08\x0a\x48\xb0\x5e\xad\x6b\x64\xaf\x75\xc3\xec\xc1\x5c\x55\xdb\xc5\x70\x07\x79\x8a\x55\x25\xeb\xe6\x51\x55\xc5\xff\xa2\x64\x65\x13\xb8\x07\xa0\x04\x43\x84\x4a\xc3\xa2\x24\xec\x45\xea\x4d\x0b\x61\xb9\xec\x53\x87\x3d\x3a\x0f\x11\xb0\x9f\x63\xf4\xbb\xe7\x81\x66\xf4\x14\xbd\x28\xdc\x8b\x8c\x97\xc2\xd7\x3a\xee\xe8\xc4\x15\x3b\xc0\xcc\x81\x70\x8b\x04\x7a\xdd\x49\x31\x20\xe7\x55\x79\x04\x75\x24\xe8\x70\x0f\xef\x85\x56\x2b\xfc\x76\x0a\xdc\x95\x53\xa0\xf0\x3c\xf0\xe5\x10\x24\x07\xd7\x84\xd2\x1f\x46\xb8\xb3\x2a\xcd\x34\xf8\x72\xd2\xf5\xfb\x96\x8d\x56\xf9\x31\xa8\x4e\x40\x4e\x59\xc6\x14\x85\x41\x13\x70\x9a\xf2\x0d\x5f\x1e\x85\xeb\x87\x3d\x98\xc8\x75\x1f\xf4\xc2\xe5\x60\xb8\x16\xa8\xea\x01\x78\xe3\x1b\xac\x69\x55\x3d\x4a\x97\xf5\x27\xea\x4d\xc2\x3c\xe3\x08\x37\x04\x9d\x0a\x0e\xc6\xcf\xe0\x60\xe2\x1f\x89\x3c\x1c\x8d\xdd\x12\xa6\xcb\x1a\xa6\x8e\xd3\x55\x04\xc6\x82\x93\x23\x4e\x35\xf1\x37\x3a\x42\xfe\xf2\x9c\xca\x5f\x52\x53\x14\x36\xc6\xbd\x78\x6e\x46\xb1\x12\x7b\xde\x0f\xc8\x30\xcc\xa1\x4b\xff\x6f\xef\x49\x31\x68\xb7\x50\xca\xb4\x09\xb4\x34\x3b\x33\x1b\x2c\x6c\x84\x69\x3e\x1a\x41\x55\x05\x70\x75\x07\xc7\x96\x8b\x62\x0f\xdc\x32\x52\xca\x1f\x52\x79\x35\xbf\x7d\x3f\x99\x4d\x66\x1f\x1c\xc1\x62\xe4\xc5\xda\x3d\x14\x55\x47\xfd\x09\xaa\x11\x31\xde\xee\x45\x50\x69\x22\xba\x66\x16\x95\x63\x0e\x23\x72\xdf\x13\xb6\xd4\x27\xe7\x78\xdf\x9b\xf1\x92\x4a\x38\x3f\x17\xbb\xbf\x5d\x39\x22\x57\x44\x29\xac\xbc\x31\xac\x58\xe0\x03\x22\xf2\x7e\xb8\xa1\x58\x4d\x83\x7b\xc0\xfa\x2d\x65\xed\x60\xbd\x7a\x33\xd0\xaa\x60\xe1\x48\x33\x96\x3b\x84\x7d\x48\x99\x4e\xb4\x0d\x71\x94\x77\xdf\x51\x86\x8a\x46\x9c\xb8\x6f\x57\x6e\x9c\xdc\x3e\x10\xd7\x42\x28\x90\xef\x46\x7b\x7c\x87\x4c\x3c\xfc\xe8\xee\x50\xb6\xc5\xbe\xd4\x02\x83\x5d\x6b\x55\x0e\xcd\x10\x09\x0e\x3a\x37\x39\xf3\xdf\x03\xb7\x3d\xb6\xee\x0d\x2d\x81\xdc\x0d\xd8\xec\x50\x63\x1e\x96\x6d\x0f\x35\xf8\x35\xec\xe1\xf4\x45\xab\x6d\xcf\x61\xde\xc5\x8e\xeb\xd7\x71\xd4\x09\xf5\x4e\xc0\x83\xf0\x3e\x39\x54\xc5\xef\x07\x10\x14\x2a\xcf\xc9\xb4\x0c\x84\x6c\xd1\x5a\x9b\x5d\x04\x48\x99\xa4\xe7\x4f\x71\x4b\x4e\x89\x66\x7c\xa8\x42\xd7\x97\xbb\x5a\x8b\x8d\xb4\x2a\x2e\x56\x70\xd4\xa5\xd1\x52\x71\x1f\x50\xb7\x4c\xe5\x2d\x77\x1b\x46\xa8\xf2\xbf\x1f\x4c\x1b\xa2\xf8\xe3\x5b\x9a\x37\xec\xd7\xb5\x85\x8e\xf7\xc0\xa9\xdf\xb8\x01\x20\x11\xc9\x2a\x61\xbd\xfd\x1f\xf8\x45\xf9\xfc\x06\x2a\xab\x19\x30\xe9\x99\xb8\x80\x6f\xf1\xa1\x43\xc1\x48\x41\xb0\x8f\x4f\x3a\x07\x7e\x76\xc6\xa0\xf8\xca\xb7\x07\x10\x44\x70\xcb\x0e\x3d\x2d\x22\x5b\x27\xa8\x1f\x9d\x93\x46\x5e\x96\x43\x9f\x88\x55\x72\x10\x78\x3f\x5a\x81\x37\x9d\x66\x57\xe0\xae\x97\xf3\x9b\x21\xa9\x47\x99\x99\xeb\x1a\xea\xdb\xdb\x81\x52\xa2\x7a\x00\x7f\x88\x62\xa1\xa7\x84\xe1\x00\x68\x3b\xa1\x2c\x4b\x7f\x25\x05\x0c\xe2\x9d\x34\xd4\x20\x09\x2f\x5c\x1d\xff\x9d\xfe\xc1\x74\xb0\xe2\x6e\x41\x7a\x3f\x98\x21\x61\x1a\x00\x26\x9a\x43\x39\xd0\x05\x2b\x96\xbb\x51\xdc\xc0\x30\x8c\xb2\x1c\x0d\x13\x8a\xf7\x42\xbc\x3c\xc1\xfa\x0b\x96\xfb\x71\x5d\x77\xb8\x6d\xb8\x7f\x09\x00\x16\x76\xb9\x13\x49\x29\x5a\xe1\xa7\xad\x3c\x0e\x5d\x3a\x5e\xb9\xc5\xdb\x02\x6e\x48\x35\x28\x1b\x31\x69\xa8\xc5\xba\x54\x50\x60\x36\x97\x79\xec\xd0\xe7\xf9\x89\x57\xa5\x3f\x48\xe1\xb3\x42\x86\xa6\x0b\x33\x86\xa2\x10\xd2\x9f\x52\x39\xfe\xf0\x61\x91\x7d\x40\x9e\x65\x60\xdf\x9e\xcc\xae\xb3\xbb\x6c\x76\x9d\xcd\x56\x50\xa6\x78\x29\xc4\x18\x02\x9f\x45\xa9\x86\xbc\xff\x70\xf3\x33\x5f\x0b\x68\xc3\x26\xaa\x19\xa8\xf7\xaa\x81\x2a\x8e\x60\x2a\xe7\xda\x1a\x5e\x56\x37\xf0\x2b\xc6\xa0\xcc\x84\x82\xc0\xf6\x16\xc5\x10\xbb\x66\x6d\xba\x6e\x40\x07\x6d\xe2\xd8\x0e\x81\xae\x84\xc7\x46\xab\x4a\x9e\xa9\xc7\x47\x3b\x11\xad\x3e\xe3\x28\x83\x77\xe3\x62\xb5\x5e\xe0\x04\x62\x65\x2b\x1c\x1a\x21\xaf\x99\x23\x07\x40\x0b\x28\x0e\xa1\x50\x16\x31\x4c\x79\x61\xc8\x2f\xbe\x32\xf6\x1d\xf0\xd8\x1c\xeb\x2a\x07\x90\x94\xe8\x9c\x2f\xc4\x9d\x62\x5a\x78\x2a\x7f\xa5\x6c\x90\x4e\x6a\x93\x3f\x37\xaa\x92\x6e\x20\x49\x5c\x18\xd1\xa5\x9c\x44\xd5\x77\x7d\x8e\xa4\x13\xe2\xae\x01\x0a\x90\xab\x46\x63\x1d\x27\x9f\x04\x3c\x90\x35\xdc\x75\xc7\x93\xa5\x1d\xe8\xfd\x41\x34\x41\xfa\xf8\xa0\x7c\x0b\x89\x14\xbe\xfa\x6f\x4b\x81\x31\x2f\x5a\x7a\x71\x3b\x5d\x0d\xa5\x78\x51\x34\x43\xa1\x46\x11\xd2\x6c\x58\xc5\xa1\xd1\xf1\xcc\x44\x0e\xe9\xd0\x69\x4d\xaa\x04\x29\x12\x75\x0c\x0e\x7a\x68\xd4\xfa\xb3\xee\x24\x28\xb9\x94\xb4\xf0\x13\xce\x7f\x63\x05\x42\x53\x57\xc5\x3a\x74\xe5\x40\x88\x17\x41\x30\x9d\x40\x31\xe6\xaa\x05\x6f\xd9\x5b\x2c\x95\x73\x97\xdf\x00\xf1\x1a\xc4\x05\x21\x62\x19\xea\xd7\x30\x0c\xab\xd7\x55\xac\x5f\xbe\xad\xcb\xa0\x73\x78\x8c\xff\x9c\xca\xd5\x62\x3c\x5b\x4e\xe1\x18\x0b\xb1\x0a\xf2\x33\xb0\x52\x1b\x23\x38\x7d\x2e\x79\x44\x6c\x26\x4d\xed\x2c\x96\x10\xe8\xe8\xdb\x31\xe2\x74\xb4\xd8\x85\x2f\x9c\x3e\x9d\xca\x05\x5c\x32\xf6\xa0\x0d\xe8\xab\xa8\x96\x05\x8d\x7b\xac\x17\x95\xe6\x96\x03\x66\x51\xd1\xf4\xf2\x78\x4d\x22\x42\x63\xcb\xf1\xf4\x86\x4d\x03\xc3\x9a\x77\xb6\x0c\xab\x3c\x1c\xd6\x65\xf4\x80\x53\x42\x9c\x73\xd8\x39\x69\x86\x92\xc2\x3e\x75\x3a\xa0\xc2\x2e\x74\x2b\x4a\x27\xae\xa4\x74\x5f\xd1\x32\xfd\xd0\x00\x2b\x26\xac\x97\x8b\x40\x2f\x1f\x8a\xc1\x03\xc6\x2c\x64\x2c\x76\x63\xc9\xaa\x47\x40\x04\x79\x54\x81\xe8\x95\x13\x7b\x61\xf0\x75\xd0\x4b\xba\x12\x9d\x7d\x20\x27\x95\x58\x2b\x43\xf2\x3a\x2f\x8c\xab\xbe\x21\x1f\x74\xfb\xac\x49\xd8\x85\x89\x43\xa7\xbe\xd6\xeb\x16\xb8\xcd\x59\x0f\x6d\x82\xcf\x26\xc3\xef\x03\x78\x85\xea\x6e\xa2\xf8\xf2\xde\xa8\x6e\x20\xa0\xf8\x8a\x56\x18\xfb\xb9\x23\x1c\x39\x7e\x3d\x14\x85\xe7\x6e\xff\x8f\xac\xec\xeb\x47\xaa\xfc\x13\x17\x23\x01\xdd\x6c\x8f\x7b\x2c\x6b\xcc\x0d\x79\xa2\x8f\xd6\x81\xc0\xd0\x24\xc1\xa3\xfe\x53\x2a\x57\xd9\xe2\x76\x32\xa3\xa3\x1e\x22\x6d\xe3\xda\x2e\x06\x6c\x75\x57\xf7\xe4\x14\x7e\x99\x2a\xfe\x2b\x23\x7c\xcd\x58\xb7\xa9\x80\x5b\x6c\x28\xf7\xcf\x79\x01\x55\xdb\xea\xdd\xbe\xf5\x55\xf7\xe8\xf3\xc2\x7f\xfe\xa5\xaf\x13\x72\x1b\x77\x39\xcc\x48\x54\xec\xd9\x17\x81\x16\x41\xcd\xf1\xc1\x2e\xb9\xe2\x79\xe4\x05\xb4\x92\x12\x31\xaa\x8d\x5e\x6b\x60\x92\x23\x28\x0e\xf0\x14\x40\x43\x09\xca\x16\xc0\x63\xf5\x9a\xc4\xee\x70\x4e\x08\x09\x20\x1a\x92\x2f\x80\xab\x73\x61\x6a\x87\x61\xc4\x3a\xa4\xd4\x01\xc2\x4f\x15\x15\xc6\x5d\x01\x3b\x56\x28\xcf\x8d\xf0\x26\x95\x37\xf7\xab\xfb\x45\x26\x17\xd9\x2f\x93\x25\xdb\x04\x40\x74\x35\x9d\x5c\x65\xb3\x25\x51\xb9\x9c\x62\xab\x91\x0e\xfb\x6b\xb6\xb2\xd2\x90\xfc\xff\x54\x98\xc0\x77\xc1\xd7\xe6\x87\xd9\xbd\x38\x4d\xa4\x43\x12\xb6\xd8\xe1\x95\x5d\xec\x98\xe2\xa0\xd2\xcf\xbe\x29\x98\x8e\x07\xcd\xe5\xe5\x44\x51\x49\xb3\x2f\x9a\xc2\x99\x9a\x8c\x3f\x7d\x62\x58\x84\x15\xcd\x78\xa3\x58\x73\x1b\x28\x0f\x00\xb6\x05\x5e\x23\x24\x15\x80\x82\x34\xfb\xa6\x7e\x28\x35\xa6\x34\xae\xeb\x6a\xad\x9b\x0a\xa2\x28\x3a\xa4\xe2\x7d\xac\x0e\xc0\x27\xc5\x04\x23\xdf\xa5\x42\x64\xd6\x00\xe8\x60\xa4\x02\xb6\x0d\x8c\xfd\x29\xf2\x60\x3f\x1e\x0a\xb3\x25\xdd\xd8\xf8\xf0\x0c\x7b\x13\x7c\x5a\x07\x17\xf7\xa3\xdb\x57\xe1\x82\xae\x0f\xa5\x6a\xe8\x9d\x2e\x32\x2b\xd8\x34\x67\x75\x23\x10\x06\xd6\xea\x86\x9f\x3a\x0b\x01\xf9\x45\x8b\x36\x32\xef\x2a\x8e\x0d\x40\xee\xa4\xcb\xab\xe1\x6b\x55\x74\xca\xd6\x13\xfe\xd2\x79\x0a\x5c\x21\x42\xd7\xa1\x86\x19\x09\xa3\x2e\x60\x98\xc3\x39\xb8\x7d\xdc\xf1\x1c\x14\x49\x63\xa7\xa9\x51\x9b\x76\xc4\x6e\xd0\x53\x9b\xae\x3f\x5f\x4e\x1d\xc5\xce\x1c\xad\xf2\x1e\x4d\x71\xdf\x1d\xc4\x17\xf6\x7a\x5b\xd7\x06\xf3\xad\xf8\x15\x04\x60\xfd\xe3\xdd\x13\xe3\xeb\xeb\x6c\x76\x7d\x7f\xfb\xce\x8a\x04\xef\xc8\xec\xd8\x93\x20\x4e\x9c\x09\x22\xc4\x6a\xe0\x39\x48\x1b\x76\xd6\xa1\x5b\x33\xa2\x6a\x4b\x82\xdb\x3e\x84\x80\xc6\x86\xb3\x7f\x1f\x5d\xb3\x7d\x9e\x58\xd6\x68\xc2\xfa\x5b\x74\xcd\x8a\xbf\x83\x72\xe8\xe0\x28\x3e\x27\xed\x5d\x44\x70\xb5\x1e\xc9\x4f\xd9\x78\x21\x3f\xcd\xef\x17\x72\x36\xbe\xcd\xe4\x1f\x28\x8e\x4a\x61\x53\x11\x56\x32\xcd\x5f\x50\xf2\x48\x9e\xbc\x40\xcc\x95\x84\xc4\x5c\xae\xfc\x7d\xb4\x1b\xfd\x02\x7f\x65\x3d\x7f\x46\x65\xb1\x1a\x4a\xc6\x97\x89\xfd\x7b\x1f\xb2\x8f\xb7\x49\x55\xf7\x30\xfa\xc2\xe5\xd9\xba\x90\x88\x13\x16\x5d\x9f\x05\xdf\xd4\xae\x4c\xf7\xd9\xf0\xa0\x79\xbd\xcf\x3c\xf2\x1a\x76\xc9\x10\x53\x42\xbf\xab\x43\x99\x04\x49\x54\x71\xf4\xcc\x8e\x3f\x4d\x53\xf8\x29\x3d\x93\x65\x51\xb9\xc2\xa2\x85\x79\x27\x84\xf3\x71\x0e\x4c\x10\xb2\x37\x4c\x27\xcb\x95\x5c\x7d\xcc\x26\x0b\xb9\x9a\xac\xa6\xd9\x32\x40\x5b\xf6\x69\x03\xfc\x3b\x7c\x2b\xd3\xa3\xbd\x8c\x07\xff\xe4\x57\xc7\xee\x18\xbc\xa2\x71\xd6\x0d\xa9\xe6\x9c\x33\xc5\x5e\x44\x36\x36\xda\x6d\xa3\xa1\x3e\x76\xf3\xc8\x75\x5c\xdb\xe7\x5a\x2a\x2a\x84\x01\xbe\x86\xb6\x86\xd4\x67\x5c\xb4\xa2\x3d\x90\x18\xa0\x0e\xf9\x43\x1e\x06\x19\xab\xb6\x29\x9e\xac\x99\xa1\x83\xd4\x61\x66\x81\x5a\xd7\xb9\x4e\xe4\x73\xc0\x8c\x24\xd0\xa7\x46\x82\xd9\x68\xff\x1a\x26\x46\xaa\xb2\xd4\x25\x9d\x15\x74\xc4\x6f\x6b\xf2\x9a\xc6\x4c\x54\xac\x90\x09\xce\x65\xe4\xc3\x74\x8a\x59\xab\xad\xc9\x63\x40\xfa\x07\x11\xbd\x46\xad\xfe\xf7\x25\x93\x4f\xbf\x5b\xdd\xbf\x7e\xaf\x9b\xb2\xa8\x5e\x5f\xfe\x17\x51\xc0\x7f\x85\xff\xfd\xf2\x87\x5e\xfd\xcf\xb7\xf6\xf1\x7f\xf1\x3f\xfe\x13\xfe\xf9\x2b\xee\xe2\xa7\x9f\x2e\x13\xfb\x7f\xdf\xc2\xff\xfd\xde\x5e\x1b\x7f\x39\xb4\xad\x92\xd7\x1a\x52\x3e\x40\x54\x5d\xa9\xc6\xb4\xba\x92\xef\xeb\x66\xa7\xaa\x2a\x11\x62\x05\x89\x87\x66\xbd\xd5\x9e\x21\x55\xe9\x56\xe2\xa6\x12\xc2\x1a\x32\x83\x8c\xe0\x11\x83\xe3\x40\xb2\xa6\x2f\x4d\x89\x48\x99\x5d\xfd\xa4\x73\xe1\x62\x6b\x15\xe9\x69\x6d\x90\x48\x50\x91\x1f\xe9\xe5\x3e\x11\x09\x8f\xde\xe9\x5c\xb4\x64\xc1\x40\x78\xda\x5e\xa2\x8e\xd4\x44\x39\x9c\x08\xc7\x79\x80\xfd\xa1\x28\x8b\xf6\xd8\x1f\xcc\x86\x94\x52\xe6\x6d\xb3\x3d\xb1\x7f\xdf\xea\xb2\xcf\x4e\x08\x55\x35\xf5\x46\xaf\x5b\xd3\x6b\x09\x2a\xf5\x2d\x32\x31\x59\xca\xf1\xfb\xe5\x7c\x7a\xbf\xca\xa6\x9f\xe4\x6c\xee\x6b\x2c\xde\x40\xc1\xbc\x80\xaa\x37\x15\x62\x6c\x22\x06\xa5\x75\x7d\x68\x5a\x6d\x28\x9d\x9f\x67\x87\x12\x34\x5c\x8e\xf1\xa6\x6e\x76\x98\xed\x78\x68\xb1\x96\x3c\x80\x63\xdd\x98\x00\x09\x6d\xd5\x84\x84\x9e\x79\x38\x30\xf6\x3e\xe8\x30\xb9\x4f\xe0\x01\xe0\xf0\xdd\x01\xb0\x03\x95\x3e\x58\x29\x72\x12\xd6\x1b\x97\x3a\x04\x25\xee\xb5\x69\x53\x5a\x91\x44\x5e\xfe\x39\xbd\xb8\x48\xed\xbe\x13\x22\xda\x75\x42\x74\xb6\x9c\xac\xe7\xb5\x10\xcb\xa2\x5a\x77\x7c\x2f\x4e\x7d\xba\xf8\x81\xc0\x7d\xea\xb1\xb6\x1f\x7f\xd0\x1c\x93\xc7\x4c\xd6\x43\x03\x1d\xa8\xd0\x53\xc6\x09\x47\xe5\x11\xd3\x06\xc9\xa6\x69\xeb\x5c\x1d\x5f\xd9\x49\xc3\x58\xf6\x81\x21\x1a\xde\x57\x4d\xb5\x3d\x9f\x35\x61\x9d\xd0\xa7\xc2\x7e\xae\xc8\xc3\xf6\x4e\x88\xbb\x6e\xe8\xbf\x5b\x29\xb6\x97\x02\xdd\xd9\x5f\x61\x29\x58\xd1\xa5\xed\xa4\x5a\xab\x5b\xdd\xe8\x87\x23\xeb\xa2\x83\x39\xd0\xff\x3a\x56\xdf\x7a\xac\xec\xb8\x3e\xeb\x52\x1f\xbf\x7b\x0f\xee\xa7\x44\xbe\xf9\x21\x7d\xf3\x7d\x7a\xf9\xe6\xcd\x4f\x5f\xdb\xa5\xff\xa7\x28\x0c\xe9\x77\xcb\xbb\xe9\x7f\x65\xf1\x97\xaf\xde\xff\x3f\xfc\x70\xf1\xb6\x5b\xff\xe5\xf2\x87\x3f\xfd\xab\xfe\xcb\x3f\xe5\xdf\xf2\x7e\x26\xef\xee\xdf\x4f\x27\x57\xec\x10\x93\xde\xb2\x7c\xc3\x0c\xa3\xd7\x0e\x7b\x67\x52\x21\xec\x6e\xb9\x48\xe5\xd9\x95\xa3\x5b\x90\xf7\xc6\xd1\xb5\xc4\x89\x92\x4d\x40\x36\xb5\x53\x9f\xd9\xf1\x02\x36\x8a\xce\xc5\x55\x6d\xe5\x43\x48\x0c\xa6\xb0\x54\x1e\x78\x84\x8e\xf0\x31\xfc\x94\x03\x25\xf3\x77\x20\x34\x4d\x20\x32\xcc\x45\x07\x80\xbf\x71\x54\x07\x20\x46\x9d\x98\x81\x5f\xc9\xee\x89\x0a\x4d\xc3\x37\x2e\xe3\x6f\x78\xea\x4b\x4f\x41\x13\x22\x90\xe8\x1a\x98\xf3\xd5\x73\x05\xf6\x0c\x54\xba\x10\x71\x15\x6b\x88\x73\x3e\x1c\xa5\x92\x41\xf3\x3e\x35\xff\x76\x90\xa7\x18\x86\xe3\x5d\x62\x22\x78\x15\x7a\xfb\x36\x25\x42\x3b\x48\x21\xc9\x23\xa6\x9c\xa8\x4f\x76\x2e\xe2\x4f\xd4\x4d\x77\x30\x62\x68\x30\xd0\xc1\xe8\x4d\x88\x1c\xc3\x9c\x43\x10\x02\x6d\x79\x48\xea\x45\x82\x4f\x83\x78\xa1\x7a\x43\xee\xb4\x06\xa5\x33\x3c\x12\x57\x86\x74\x50\x32\x0f\x1d\xf2\xe5\x79\x60\x7c\xdf\xa7\xf2\x2c\xf3\x41\xbd\xeb\x70\x47\xdd\xea\xf5\x56\x55\x85\xd9\x79\x32\x9e\x1d\xff\x29\x24\x6f\x02\x3a\x0a\x8f\xc2\xee\x56\xfa\x20\x73\x75\xb7\x3b\x54\x8c\xb5\xeb\x04\x20\x21\x90\xb2\x41\x7d\x2a\x57\xad\x72\xe8\xe9\x8b\xf4\x07\xdb\xbf\x2f\x7a\x7d\x00\x36\x30\xee\x48\xb8\x22\xcc\x59\x02\x89\x45\x35\x5d\xa8\xaa\x92\x4b\x1c\xe9\x15\x8f\xf4\xc7\x54\x9e\x4d\xec\xc9\x52\xa5\xbc\xa6\x1a\x24\x4d\xb8\x9c\x41\x74\x9b\xf3\xea\x1c\x95\x41\x81\xd9\xf7\xed\x56\x8b\x5e\x1b\xec\x63\x09\x3e\x28\x63\xd2\x07\xd8\x96\xd9\x97\x6d\xf1\x50\xb4\x72\x0c\xbd\xf9\x53\x2a\xcf\xa6\xaa\x79\xd4\x8d\xfc\xb5\x6e\x3e\xfb\x19\x06\x30\x1a\x06\xb8\x09\xf6\xd3\x19\x2e\x50\x68\x76\xf6\x01\x92\x13\xd0\x87\xe5\xa3\x7d\xbc\xf2\xde\xa8\x61\xde\x5f\x3f\xc7\x7f\xb6\x7d\x21\xbf\x8f\x9b\x8f\xc0\x6f\x06\x1d\xfe\x33\x08\x07\x7c\x2c\x5c\x8a\xad\x7a\x72\xe9\xac\x60\xdc\xb4\x35\xea\x44\x0e\xb4\xbb\x53\x5f\x8a\xdd\x61\x27\xf5\x17\xab\x08\x8a\x7d\x8d\xa9\xd7\x89\x63\x76\x66\xd0\x72\xe1\x81\x65\x05\x4d\x32\xb4\x04\x9e\x15\xc7\x6b\x07\x3b\x8e\x72\x9d\x41\x61\xe1\xf8\x23\xbd\x4a\x51\x95\x75\x5d\x3d\xe9\x23\xd5\x98\x87\x6c\x89\x8b\xf4\xa7\x94\x29\x77\x39\x08\x16\xf0\xeb\xb2\x32\x09\x5c\x2e\x0d\xe2\xa1\x22\x1c\xab\xcb\xe7\x10\x90\xe6\xdf\x1c\xd6\xed\xa1\x41\x6c\x9d\xd7\xe3\x7a\x32\x01\x54\x2a\x46\xc0\xc6\xd2\x10\x60\x13\x22\xde\xcb\x01\xfc\x53\x21\xfb\x52\x43\x38\xa6\x4d\x51\x62\xc6\x5e\xd8\x88\x04\xa7\xd9\x18\x63\x58\x5f\x1d\x01\xe3\x03\x31\xae\x09\x24\x84\x01\xa1\x30\x77\x5d\xb8\x6d\x36\xdc\x6d\xc8\x58\xb5\xdf\x83\x9c\x04\xdb\x48\xc4\x5a\x8d\x23\x0e\xf2\x3f\x7a\x53\x72\xb2\xdd\x8b\xf4\xe2\x4d\x2a\xcf\xa2\x17\xce\xd2\xf4\x3b\x5a\xa5\xf0\x80\x81\xe5\x85\x2c\x0a\x61\x11\x94\x9c\xc0\x21\xc2\x6e\x5f\xcc\x06\xf3\x4e\xd0\x6f\x3d\xa0\x76\xe6\xe3\xfb\x06\x04\x2d\x34\x9c\x74\x77\x6b\xe1\x41\x6a\x43\x61\x37\x47\xe0\x8a\x70\xef\xe8\x32\x8e\xcf\x69\x74\x34\x61\x26\xec\x81\xbb\x53\x76\xc5\xe4\x55\xa9\x8a\x5d\xb4\x5d\xf7\xf8\x03\x04\x8f\xcf\xcd\x28\x91\x55\xfd\x2c\xeb\x67\xdb\x5c\xdd\xc0\xa6\x07\x4f\xbb\x70\x67\x25\xb8\x47\xd8\x92\x01\x44\x10\x61\x26\x76\xba\xdd\xd6\x68\xc6\xac\xb5\x61\x9a\xd3\x3d\xc0\x9d\x0e\x06\xbf\x63\x12\x41\xc2\x96\xbe\xee\xc5\x81\x64\x53\x88\xee\xcd\x0b\xdb\xf9\x60\xc2\x83\x65\xa4\xe8\xda\x46\x37\x0d\x06\x65\x77\xbc\x53\xa2\xa3\x80\xe4\xf8\x56\x8d\x11\x71\x4a\x2c\x45\x9d\xfc\x70\xec\xe1\xdf\xd5\x39\xa0\xed\x82\xf4\x0b\xa2\xe6\x43\x62\x12\x53\xaf\x0b\x88\x6f\x46\x17\x64\x82\xe6\xf1\x46\xad\xa3\xa4\x07\x3a\x6a\x06\x68\x06\x8d\x03\x50\x31\xab\x53\x00\x95\x12\x88\x03\x33\xad\x2a\x3d\x9e\x4c\x55\xd2\x5f\x59\xe4\x17\xf6\x45\xf1\x1c\x5c\x17\x73\x6e\x76\x7b\xd5\x14\xc6\x5a\xc7\xea\xd1\xf6\xba\xfd\x8a\x34\x21\x60\x94\x2e\x4b\x46\xd3\x7a\x9d\x2e\xda\x5d\x6e\x4e\x9d\x42\xf3\xca\x90\x2b\x17\x29\x77\xc2\xe3\x40\x44\x33\x10\x23\xb2\x7d\x22\x8a\x74\x6b\x12\x36\xeb\x6d\xf1\xa4\x4a\x58\xa8\xc8\xca\xd5\x51\x42\x73\xae\xf9\x3d\x52\x46\x73\xfd\x1a\xdf\x85\x3c\x2b\xae\x0c\x54\x98\x3e\xa7\xeb\x06\x28\xc5\xe4\x7a\x6b\xef\x43\xdc\x3d\x56\x49\xfc\x54\x1f\xce\x20\xd3\xc2\xfe\xaf\xe6\x6c\xe4\x36\x7f\xe7\xa6\x56\xe4\x23\xa0\x1b\x5b\x7f\xb1\x8a\x32\xb8\xb7\xa9\x50\x3a\x1c\x4b\x66\x9d\xd9\xed\xcb\x23\x9f\x81\xf0\xda\xe0\x4b\xb2\x53\x53\x03\x29\xcc\x0f\x20\xe9\x29\xdc\xd3\x45\xc0\xc8\xc2\x98\x83\x83\xeb\x73\xba\xdc\x8f\xf6\xf8\xde\xd4\x4d\xd8\x39\xa0\xce\xc0\x71\x71\xde\x07\xdc\x60\xd4\x73\xbe\xf5\x61\x97\x59\x2d\xd0\xf0\x7f\x94\x20\x24\x30\x4d\x92\x01\x03\x48\x5d\xe5\x36\x25\x24\xeb\x7f\xaa\x0f\xf8\x51\xe6\xb9\x74\xb7\xbe\xdf\xdd\x89\x3c\xa3\x77\x82\x33\x79\xae\x46\x78\x2e\xeb\x67\x3b\x55\xc8\x59\x22\x80\x46\x17\xff\x37\xdc\xe6\x58\x8e\x02\xe2\x80\xf0\x47\x5a\xe9\x9d\xaa\xd4\xa3\xc7\xcf\x1d\x9c\xb1\xe0\xae\x78\xf1\x40\xb5\xa8\x14\xf2\xa3\x39\x43\x05\x86\x74\xfe\x30\x02\xc9\xe5\xc8\x0a\x3c\xb9\xd6\xa6\xd8\xb4\x47\xb9\xd7\x0d\xe4\xc0\x9f\xff\xf0\xe6\xff\x1a\xb1\x12\x5d\x1f\x5a\xc8\x4b\x82\xed\xb5\x55\x54\x10\xf1\x41\x57\x7a\x53\x80\xa1\x14\x35\x19\xf4\xca\xf1\xe4\x85\x07\xc0\x8b\xde\xcb\xf4\x02\x8e\x47\x5f\xcf\xfb\xd0\x38\x96\xed\xfe\x8f\xa1\x3b\xc8\x60\x45\x01\x71\xaa\x84\x82\x15\xd6\xd5\x6b\x47\x74\xef\x02\x29\x8e\x6f\x1d\x29\x15\xd9\x34\x03\x21\x05\x00\xde\x83\x2a\x85\x3d\x72\xda\xfe\x15\x45\xf2\x3b\x21\xec\xe2\xe1\x9e\x08\x1f\x94\xee\x41\xd2\x88\xce\x03\xe5\x98\xe4\x37\x12\xfe\xe7\x7a\xa7\x9a\xcf\xa3\x40\x9a\xdb\xf5\xea\x0f\x91\x7d\x69\x8e\x73\xcf\x3b\xd4\x88\xaa\x2d\xb1\x4b\x85\x82\xc2\x23\x66\xc4\x00\xe1\x60\x2c\xd8\xce\x07\x74\xda\x51\xaf\x5c\x4e\x6c\x23\x31\xbb\xac\x32\x4e\xd9\x50\x32\xd0\xa8\x7f\x86\xac\x5b\x61\xf7\x16\xce\x4d\x74\x93\xca\xa2\xda\x34\x05\x30\x29\x93\x92\x8c\x57\x4d\x42\xb4\xbf\x56\x66\x6b\x24\x6a\xa9\x37\xb1\x66\x94\x70\xc5\xa1\xc4\xfb\xdd\x12\x9c\x98\xbd\xdd\xdf\x90\x96\x62\x5f\x46\x89\x53\x03\x5a\xc4\x8a\x38\xa3\x28\xbb\xff\xbb\xba\x11\xde\x54\xb7\x53\xe7\x4a\x1b\x7d\xd3\xcc\xa4\x42\x9c\xaf\x47\x61\xc8\xd7\x87\xc4\xd9\x65\xcc\x62\xe8\x32\xbd\xb0\xdb\xc3\xf6\xc4\x4e\x85\xd5\x92\x7c\xd5\x22\xcc\xfa\x17\xb9\x95\xdf\xfd\xe5\x46\xa2\x2f\xbf\x70\x1d\xa5\x68\x20\x9a\x2e\x3a\x5a\xcc\x79\x3e\x92\xb3\xba\xb5\x0b\xe8\x8e\x6a\xd8\x31\xdb\x21\x24\xdf\xa9\x6a\xde\x92\x41\x10\x9b\xc6\xf4\x4e\x5e\x8c\x04\x72\x1a\xe6\xa4\x6b\xda\xe3\x45\x09\x0b\x4e\xb9\x8d\x3a\xf7\xb3\xbc\x1c\x79\xb0\x76\xef\x19\x81\xcf\xd4\x8d\x7c\x3b\x22\xb6\x70\xdc\x0e\x08\xe1\x06\x39\x67\x77\xc6\x3b\x36\x92\xf0\x5f\x81\x93\x3e\x44\xc0\xd3\xbd\xa9\x85\x28\xe8\xe9\xaf\x39\x33\x22\x78\x39\x6b\xb2\x70\x7f\x3e\x11\xb3\xc7\x65\x7a\x99\x86\xf7\x38\x0b\xa2\xe5\xd7\xa5\x85\xec\x48\x8b\x44\x80\x5f\x21\x6c\x6c\x40\x70\x9d\xac\xfd\xd2\x11\x5c\x5c\x0a\xe6\xbf\x4a\x04\x45\x7e\x9c\x7f\x50\xfa\x80\x18\xe8\x48\x9f\xd8\x4f\xb3\x26\x76\xbd\x07\x2a\x30\x13\x4e\xce\xe0\xf9\x63\xa2\x61\x80\x7d\x06\x29\x6e\xf2\x41\x99\xc2\x55\x5d\x86\x47\x3a\x7e\x1d\xd5\xb1\xe5\x49\x18\x7c\x45\x86\xfd\x43\x22\x2c\xe9\xc8\xb0\xa8\x27\x22\x72\x7f\x85\x03\xa6\xa1\xa9\xb2\xae\xb8\x7b\x48\x44\xe9\x37\x31\x0c\xcf\x9a\x3d\xc1\x7b\x0e\x23\x13\x4d\x18\xdf\xbb\xc1\xdb\xa3\x40\x7c\xc2\x72\xa2\xa4\xec\x48\x49\x11\x48\xd6\xb0\x9c\x72\x47\x60\x5a\xc9\xf0\x92\x5f\x2f\xec\xe0\xe0\x4a\xc2\x04\x5b\x51\x31\x70\x50\x4f\xb7\x1b\x3a\x09\x07\x67\x43\x7e\xf3\x6c\x7c\x45\x94\x3b\xc0\xc9\x65\x7a\xc9\x62\xdc\xfe\xcf\x17\x25\x79\xd8\x11\x94\xe1\x76\xba\x6d\x07\x43\x1f\xf2\x90\xcd\x45\x22\xbb\x3a\x29\xb2\x2f\xff\xa8\xc8\xb6\xda\xad\x17\xdb\x91\xd8\x51\x86\x44\x78\x40\x39\x30\x30\x87\x56\x92\x8b\xbe\x24\x1f\x7c\xf2\x2b\xc2\x5c\x16\x23\x11\x0a\xca\xd8\xac\x84\x5c\xf2\xfe\x12\xda\xf6\x06\x25\xb9\xf8\xb6\x8d\x37\x28\xde\xcf\x1d\x4e\x19\xba\x22\xfa\xb6\x1a\x7f\x7f\xe4\x0b\x86\xd1\x85\x00\xd7\xd6\xf7\x5f\x11\x09\x28\x3d\x63\x27\x29\x58\x6c\xbe\xb6\xc4\xb7\x75\xdf\xb1\xee\x46\x9e\xe1\xf9\x43\x59\x3c\x3a\xb7\xcd\x5b\x6b\xea\x04\x05\x5c\x6d\xeb\x0e\xc9\xbc\xea\xc9\x5b\x34\x73\xec\x45\xc3\x3c\x41\x0d\xd2\xd5\x15\x6b\xb0\x60\x82\x90\x02\xec\xf2\x6f\x72\x67\x0e\xb8\x37\x84\x77\x6f\x84\x5b\xb8\x6f\xfc\x06\xe8\xd7\x68\xce\x28\x98\x1e\x14\x53\x83\xb2\x01\xa7\xa8\xae\x5e\xb2\x19\x7b\xcf\x74\xf2\x1a\x03\xab\x11\xd5\x46\x97\x97\x39\x04\xcb\x8c\x60\xdd\xed\x16\x8b\x52\x8a\x10\x0a\x18\x0e\xef\x53\xc4\x4f\x19\xd3\x59\xa3\xdc\xc5\x6c\xf7\xda\x68\x2a\xcf\xd7\xec\xa0\x26\xb0\xfd\x8f\xa1\x79\x42\x20\x71\xc9\xd5\x54\x1a\x6d\xdb\x5e\xb7\x86\x7d\x02\x9c\x31\x75\xca\x5e\xa6\x00\x40\xa3\xd7\xc5\xbe\xb0\x67\xf4\x15\xeb\x07\x56\x2c\xc3\x84\x04\x08\xf8\x4e\x36\x8a\x50\x55\x18\xf7\x77\x78\x38\x18\x89\xcb\x34\xf0\x0f\x50\xcb\x91\x33\x90\xab\x68\xbd\x4d\x7f\x80\xed\x7b\x99\xca\x31\x7a\x23\x5c\x6c\x3c\x8c\x1e\x80\xb3\x33\xf2\xba\x0e\x6f\x61\x11\xfc\xd9\x6f\x61\x66\x1e\xc1\xf8\xbc\x73\x7a\x14\x51\x84\x02\xdd\x60\x6e\x63\x89\xe1\x8d\xe5\xf5\x8e\x96\x73\xa4\x91\xcb\x5a\x99\xd8\xe9\x14\xe0\xa7\xc5\x93\xfd\xbd\x72\x51\x1a\xf9\xd5\x68\x0f\x55\xdb\x83\x22\xa7\xc0\x22\xb9\x23\x84\x33\x4e\xfe\xc0\x57\xdc\xa8\xf0\x3e\x2d\x36\xdd\xc1\xda\x3e\x9c\xf8\xae\x70\xdf\x4d\xb8\xca\x3c\x24\x1a\xc4\xee\x21\xcf\x7a\xf6\xac\xcb\x27\x2d\xcf\x2f\x2e\x47\x72\x57\x57\xed\xd6\x78\x44\x31\x5e\x7f\x45\xcb\xd1\x83\xd2\x1e\xdf\x35\x64\x92\xfb\xfa\x22\x61\x63\xa6\xf8\x22\xcf\x7f\xec\x34\xa4\x82\x58\x83\x88\x8e\x6f\x14\x29\x8c\x37\x84\x83\xa2\x77\x06\x0e\x70\xce\xf5\x36\xd8\xeb\x29\x88\x38\xa4\xae\x8f\x31\x15\x40\x64\xeb\x6a\xcc\x75\x4f\x31\xf7\xc4\x15\x66\xe0\x6f\x08\xfd\xe4\xf3\x0e\xbf\xbe\xb8\x85\x95\xf5\x05\x78\x48\x39\x5c\x1a\x47\x81\xdf\xa6\x56\xda\x6b\x74\x7e\x0e\xe9\x42\x41\xd2\x38\x3a\x84\x54\x59\xc6\x82\xf3\x94\x34\x27\x1f\xaa\xc2\x0a\x56\x45\x90\xad\xcc\x07\x97\x09\xb6\x3f\xd1\x86\x83\x57\xe0\x88\x09\xba\x99\x62\xed\x19\x9d\x51\x70\x02\x31\x4d\x00\x1b\x48\x87\xe4\xa7\xa7\x05\x77\x24\x3a\x7e\xaa\x3b\x41\x15\xcc\x24\xd5\x79\x22\x43\xfa\x5e\x76\x86\x95\x47\xca\xb5\x89\x43\x26\xce\x37\x4a\x17\x55\xdf\xa4\x46\x6f\x31\xdf\x53\x6d\x87\x4d\x81\x9e\x17\x51\x64\x91\x3d\x73\xc1\x5e\x48\x9c\x39\x4f\xde\x78\xc6\x19\x55\xc3\x52\x00\x4b\x99\x62\xe5\xbe\x38\x3e\x5c\x84\xa2\x8c\x45\x64\x00\xf5\x02\xe5\x23\x70\xa3\x89\x01\x8d\x11\x4d\xe3\xb7\xe9\xf7\xa9\x9c\x84\xb6\xdf\x1d\xdb\x7e\xb7\x54\x1d\x0b\xad\xc4\x15\x6c\xb6\x3b\x50\xc0\x50\x6b\x81\x1c\x8c\xae\x6a\xe8\x72\xd7\x38\x6d\x85\x95\x4c\xac\xa5\x19\x6d\xda\x57\xe6\x65\xab\xd3\x33\x86\x82\x1b\x9f\x1c\xc4\x3a\x88\x16\x0a\xd6\xb9\x87\x6c\xc0\xe8\x86\xb6\xaa\xf8\x85\x9d\x96\xcb\xf4\x32\x89\x1e\x0b\x77\x9b\x50\xc4\xe3\x53\x94\xda\xc7\xde\xc3\xe3\x1c\x41\x37\x18\x93\x9f\xa6\xdf\x4d\xb3\x0f\xe3\xe9\xab\x57\x5c\xc6\x87\x96\xc4\xc0\xc4\x83\x09\xef\x76\x3d\xe9\xb0\x1e\xe8\x81\x3f\x17\x95\x34\x87\xcd\xa6\x58\x17\x90\xcd\x42\x29\x4a\x38\x87\x4e\x0a\x61\xba\x9e\x9d\x63\x94\xef\x7c\x30\xd7\x6d\x6f\x31\xea\x07\x8c\xea\xc1\xb4\xf8\x55\xf1\x42\xb7\x7b\x72\x3a\x12\x50\x0d\xdf\xbd\xf2\x6d\x77\xfe\xcc\x56\x95\xe0\xdd\xdc\xed\xed\x71\xf3\x25\x6a\x24\xcc\x09\xce\x65\x54\xe3\x23\x9e\x7e\xb0\x71\x02\xc9\x1b\x84\xc0\xaa\x1c\x5b\x07\x1e\x72\xd6\xc5\x5b\xbd\x37\xf2\x9c\xa1\xeb\xf6\x08\x61\x2d\xee\x30\xa8\xb1\x53\x05\xd8\xcf\xc4\x32\xda\x88\x4a\x3f\x9b\xc7\xa6\x3e\xec\xcd\x28\xa0\xb9\x97\x6b\x55\xda\x4b\x81\x72\x52\x10\xee\x49\x08\xff\xe7\x6d\xed\x73\xf6\x7a\x78\x1c\xc2\x01\x3e\x07\x33\xeb\xae\x12\x9c\x79\x28\x89\x6e\xcf\x7a\x38\xd8\xf1\xdd\xa4\x77\x6c\x5e\x75\xe2\xa9\x5e\xf2\x55\xac\x94\xc1\x7d\x4b\x89\x01\xc0\x40\xe2\xa3\x5f\xe7\x67\xe3\xbb\x89\xdd\x80\x68\x64\x9e\x3e\x8e\xf5\xa6\x63\xf6\x19\xe1\xd2\xf1\xc3\x29\xa9\xf4\x5a\x1b\x03\xb5\x2c\x6b\xe0\x52\x0a\x04\xee\xf8\x6e\x32\x70\x76\x54\x69\x6a\xe1\x53\x7d\x21\x8b\x05\xab\x5a\x05\xb9\xae\x7e\x2f\x90\xe9\xbc\x88\xd1\x8e\xb1\xa3\xcc\x41\x21\x31\xfb\x2d\xf1\xf9\xa1\x98\x78\x0b\xc5\x09\xf7\x87\xc6\x1c\x54\xd5\x8a\xb6\x0e\x76\xe7\xf7\x60\x6f\xa3\xa9\x1b\x36\xf9\xa0\xcb\x42\x3f\x71\x3a\xdd\x0b\xf3\x0f\x74\x3e\xf1\xef\x0e\x3f\xcb\x08\x29\x22\xb9\xfa\xae\x6e\x7a\x33\x1e\x1c\x62\x92\x51\x0c\xac\x18\x44\x39\xf4\x43\xc8\x56\xb9\x95\x0b\x96\x7b\x33\xe2\x09\x0e\x08\x5f\x0e\xb8\x27\x88\x6b\xd4\x5d\x21\x3e\x0c\x4e\x28\x24\x01\x27\xaf\x6f\x58\xc0\x06\xf4\x35\x4a\x19\xd7\x01\x59\x1e\x87\x16\x05\x46\x70\x33\x85\x28\xab\x48\xf3\x05\x3d\xe0\xa0\x31\xae\x6b\x3c\xb2\x82\x18\x15\x7a\x37\x79\xdc\xb0\x50\x9e\x93\xd4\x9d\x66\x05\xf6\xd5\x93\x9d\x2c\xbc\xb1\xeb\xe6\x38\x92\xcf\x58\xae\x14\xc8\x2d\xe4\x33\x97\xc3\x2d\x8b\xcf\xc0\xdf\x5e\x8b\xb2\xae\x3f\xa3\x0f\x2a\xac\x88\x0d\xc3\xf4\xaa\x7e\x1e\x11\x71\x87\x2b\x6e\x17\x93\x99\xc3\x55\x9e\x63\xee\x0c\xdc\xef\xd0\xa3\x70\x81\xe3\x52\x57\x91\x7c\xf4\x30\x21\x37\x72\x01\x49\xf0\xe1\x7a\x75\xd2\xfa\xaa\x63\xe7\x5e\x67\x8c\x55\x38\xcf\x30\x7a\x11\x5d\xf4\x03\x16\x58\x74\xe1\xd3\xdf\xb0\x8c\x30\x56\xfa\x8a\x2f\xff\x4f\x51\xe6\x23\xe0\x4e\xac\x19\x46\xa0\x3b\x0e\xe9\x5a\x65\x4f\x83\x8e\x9b\x70\x9d\x2c\xc8\xe8\xde\xef\xeb\x06\x02\xf9\xb9\xde\x55\x45\x0b\xa5\xa5\xca\xc2\x19\x61\xde\xc7\x00\x0d\x07\xb3\xee\xfb\xdd\xb5\xd9\x83\x6a\x49\xdc\xb7\xbc\x96\xa6\x46\x66\xaf\x1a\x76\x13\x8c\x90\xa8\xef\x38\xb9\xae\xf5\x6c\x78\x1d\x6d\xcc\x6b\x6f\x82\xfc\x59\xa1\x77\xc4\xef\x4e\xc0\xbb\x17\xad\x54\x0f\xa6\x2e\x0f\x01\xc6\x1d\x9c\xdd\xae\x7a\xb9\x1b\xbf\xe8\x8f\x5f\x9e\x18\xbf\x3d\x61\x30\xaf\x78\xce\xc1\x7e\x28\x81\x7a\x8f\x3c\x05\x82\x7c\xf8\x40\x53\x80\x37\x10\x34\xb9\x79\x49\x0f\x05\xa7\x41\xec\x2c\xe4\x6c\x5f\xd7\x87\xa2\x5a\x1f\x9a\xe6\x25\x8d\x96\x4f\x4b\xd8\x0e\x1d\x40\x73\x28\xc1\xb3\xf5\xd2\x92\xc7\x43\x46\xab\xd7\x8e\x0f\x86\x0b\x42\xec\xc7\x8e\xeb\xa9\xde\x84\x1a\x2e\x79\xc9\x02\xd2\x8a\xc0\xd5\x1f\x6e\x0c\x51\x44\x9a\x31\xa2\x4e\xec\x9e\x28\xa2\x5a\x39\x8e\x59\xd3\x5f\x04\x17\xaf\xdf\xa6\x3f\x60\xa8\x0f\x2d\x3c\x0d\xe5\x64\x65\xcf\x1e\x49\xd8\xf8\xfd\x14\x70\xea\x39\xae\x07\x4f\x84\x1d\x19\x77\xa2\xeb\x81\xea\xe1\x60\xa2\x72\xbe\x5f\x71\x3d\x25\x22\x40\xc5\xd0\x39\x77\x46\xdc\xb6\x7e\xc6\x14\x48\x10\x83\x9f\x38\xbd\x71\x73\x28\x37\x05\x20\x0c\x40\xef\xf7\xa7\x4e\x44\xd3\x40\x7e\x33\x1a\x0d\x3b\x35\xd6\x75\x65\xf6\xc5\xfa\x00\xbc\x94\x1d\xc6\x9f\x63\x28\xa4\x87\xec\x92\xe4\x84\x55\x02\xa1\xbe\x12\x52\x6c\x21\x81\x65\xc0\x46\x11\x03\xa2\x2b\x14\x53\x3d\x3b\x65\x68\x7f\x80\xc1\xec\x7a\x25\x4e\xb9\x01\x87\x44\x22\xae\x83\xb7\x4a\xea\x0d\x4a\x16\xc4\xd7\x24\xa4\x12\x85\x25\xb8\x89\xae\xd1\x71\xf5\xf9\x6a\x06\x7d\x9a\x2d\x17\xe3\x04\xc4\x4c\x15\x90\x2d\x78\x63\x62\xd8\x43\xe4\x72\x4b\xc2\x7c\x60\xba\x0d\xc4\x80\xe7\xc6\x93\x2f\x79\xe6\x0b\xe4\x89\x02\x82\x19\x4e\xd5\x76\xb3\xfd\xca\xb0\x36\x32\x80\xa9\xe3\x46\x9d\x93\x9e\x26\xcb\x68\x60\x34\x6d\xb7\xdd\xb2\x8a\x7c\xb5\x76\xe3\x73\x03\x1d\xe5\x09\xf7\x13\xc8\xa3\x8b\x24\xb0\x38\x21\x81\x5b\xef\xd9\x64\xd3\x0a\x69\x1c\x7a\xcb\x00\x7a\x2c\x49\x5b\x11\x4b\x5b\x47\x35\x7a\x42\x10\x0e\x5e\x0e\x28\x9a\xc5\x7f\x5e\x34\xcb\x48\x34\x8b\xff\xb4\x68\x66\x8f\x09\x94\xae\x1d\x92\xbc\x7f\x4a\xc3\x58\x64\x20\x62\xc9\xe7\x19\x85\x2a\xe5\x03\x53\x9c\xda\x13\x18\x49\xde\x20\x00\xf2\xc7\x20\xca\x03\x95\x2a\x45\xf8\x49\x04\xc8\x22\xed\x1d\xc6\x84\xb1\xaa\x0d\x93\xde\x29\x7b\xa8\xe2\x0b\x9a\x4a\x45\xc5\xf2\xbe\xe7\xa0\x86\x74\x28\x27\x16\x59\x99\xea\xfb\x3d\xc0\xe5\xe1\x2e\x2f\xab\x1c\x01\x67\xec\x35\x2a\xb3\xcb\x56\xb5\x07\xf4\x0d\x2f\xf4\xe3\xa1\x0c\x52\xb9\x51\x6b\x06\x9f\xbb\xf7\xff\xd9\x9e\x82\x21\x0e\x8d\x38\x6e\xf1\x0e\x3e\x2d\xa6\xdb\x83\xa7\x88\x31\x0f\x9c\x8d\x3d\x22\xee\x58\x96\x91\x9e\x6d\xb0\x6b\x89\xfc\xfb\x21\x27\xb0\x54\x93\x5b\xa5\x09\x6c\x26\xee\x6b\xac\x7f\xbf\x03\x57\x54\xd8\xbb\xd3\x0b\x47\xc5\x4a\x62\xe4\xb7\xb3\x10\x7e\x76\xfe\xab\xc8\xe5\xe4\xc3\x35\xc6\x39\x39\xec\x86\x11\xc0\x2c\xa6\x20\xd6\x49\x54\x2e\xe1\xcd\xc6\x57\x51\x97\xf2\x20\xf0\x1a\x38\x05\x5b\x44\x0e\x88\xef\x89\xc8\xb5\xf3\xbe\x43\x06\x86\x3e\x1a\x33\x64\x00\x89\x0c\xcd\x49\x4f\x79\xa8\xb1\xa6\x3d\xa8\xf0\xe4\x4e\xf2\xbb\xc0\xcf\x2c\x95\xff\x0d\x86\x21\xb8\x1b\xde\xee\x2b\x8f\xe4\xbe\xe1\xa2\xeb\x5e\x0c\xdb\xce\x40\xf5\x5d\x6b\x5f\x9b\xcf\xc0\xbd\x04\x99\xa6\x70\x91\xb5\x35\x8a\x4b\x08\xe0\xca\xa2\x75\x04\xc5\x9d\x18\x5d\xc7\x60\x5c\x9d\xa8\xb9\xba\x0e\x5d\xba\x27\x64\x0d\xd4\xa2\x6b\x5b\xb5\xde\xa2\x1e\x21\x86\xec\x49\x32\x0a\xf8\xd2\xef\x9f\xa7\x1f\x53\xa7\xd0\x75\x08\x70\x52\x21\x00\x50\x39\xd3\xcf\x81\xce\xb7\x3c\x54\xf2\xb6\x58\x37\xb5\x39\x9a\x56\xef\x4c\x22\x27\xd5\x3a\x95\xe7\x67\xcb\x43\x75\x36\x8a\x08\x85\x98\x4b\x88\x10\x17\x11\x17\x50\x87\x6b\x67\x80\x3f\x28\xa2\xe6\x61\xea\x20\xac\xc6\xf0\x35\x42\x1e\xdb\xf1\xcb\x54\x66\x54\xc1\x77\xd3\x19\xc2\xbc\x5a\x77\x8e\xe8\x00\xab\x0d\x5d\x7e\x22\x88\x3e\x0c\xf3\x04\xf9\x68\x99\x2a\x9f\xd5\xd1\x04\x55\x16\x91\x11\xa6\x20\x12\x14\xd1\x39\xbb\xca\x11\x1d\x05\x75\x32\xa1\xbc\xa7\xb3\xec\xec\xeb\x74\x9f\x04\xbd\x1d\x68\x0d\x2f\x15\x0e\xa1\x9c\x62\x34\x8a\x38\x53\x96\x87\x2a\x95\x33\x30\xf2\x44\x98\xc2\x73\xc0\xc8\x4a\x94\x5c\x12\x38\x06\xf1\x93\x31\x47\x63\x74\xf5\xb0\xc9\x3e\x40\xb1\x65\xd7\x05\x02\x1d\x8e\x31\x92\x6e\xb9\xc8\xda\xb7\xc7\x16\x42\x1c\x3d\x26\xed\x9e\x28\xa6\x4a\x64\x4c\x06\x04\xc6\x45\x5e\x23\x09\x68\x8e\xe8\x49\x64\xb8\x2c\x5a\x77\xaa\xf0\x95\x7f\x24\x47\x60\x94\x74\x04\x73\xa3\xc1\xd5\x00\x5a\x28\xab\x46\xa6\xa6\x6a\xe6\x5b\x2d\xf7\xdb\x46\x19\x6d\xa4\x3d\x1b\xc9\x19\xfc\xbf\x2e\x3f\x07\xd6\x42\x59\xde\x4d\x01\x18\xec\xd0\x1b\xd5\x06\x00\x45\xe5\xd1\x91\x65\x61\x5b\x9c\xe9\xed\x0b\xd4\x1f\xc3\x8f\x33\xc6\xa1\x85\xa7\xb4\xa3\xf4\xf3\x4f\xa0\x0a\x66\x44\x4f\x07\xf3\x78\xc5\x28\xa3\x11\xb6\x6f\xa0\xd2\xc1\x58\xe3\xed\xc5\x88\x34\x9f\x8d\x72\x5a\xe7\xd3\xb2\x3f\x07\xa9\x3c\xbf\xc1\x02\x7d\xac\xe0\x0e\x04\x68\xbc\xdc\x4b\xfa\x08\xfd\x50\xdb\x22\xb6\xe1\x17\xdd\x3c\xe4\x99\xc6\x60\xbc\x0c\xb8\x4c\x1f\x38\xc3\x9b\x44\x7b\x84\x56\xe9\xaa\x2c\xe9\x88\x19\x70\xaf\x27\xcb\xab\xe9\x78\x72\x9b\x2d\xe4\xfc\xc6\xa5\x5c\xa7\x42\x5c\xcd\x7f\xc9\x16\xd9\xb5\xbc\x9a\x5f\x67\x72\xb2\x94\x77\x8b\xf9\x2f\x93\xeb\xec\x5a\xde\xcf\xae\xb3\x45\x44\xd4\x26\xe7\x33\x39\x9e\x41\x3c\x62\xbc\x94\x93\xe5\xab\x57\xf2\xfd\x78\x39\x59\x26\xc0\xa9\x3b\xbf\x5f\x09\x97\xca\x3d\xbf\x91\xe3\xd9\x27\xf9\xd7\xc9\xec\x3a\x91\xd9\x64\xf5\x31\x5b\xc8\xec\xb7\xbb\x45\xb6\x5c\x66\xd7\x72\xbe\x90\x93\xdb\xbb\xe9\x24\xbb\x4e\xe4\x64\x76\x35\xbd\xbf\x9e\xcc\x3e\xb8\x56\xe4\x74\x72\x3b\x59\x01\xf5\x5f\xc2\x2d\x4e\xb2\xa5\x5c\x7d\x1c\x03\xc3\x8f\xec\x76\xf9\x66\x91\x65\x40\x34\x9d\xdd\x64\x57\xab\x65\x22\x6f\xb3\xc5\xd5\xc7\xf1\x6c\x35\x7e\x3f\xcd\x12\x79\x33\x59\xc9\x9b\xf9\x42\x8c\xe5\xdd\x78\xb1\x9a\x5c\xdd\x4f\xc7\x0b\x79\x77\xbf\xb8\x9b\xdb\x21\x2d\xe4\x6c\x3e\x7b\x3d\x99\xdd\x2c\x26\xb3\x0f\x93\xd9\x07\x48\x53\x97\xd9\x6c\x35\x59\x64\x72\x31\x59\xfe\x55\x8e\x97\x72\x35\x87\xbf\xfe\xed\x7e\x3c\x9d\xac\x3e\x89\xf1\xec\x5a\xde\x65\x8b\x9b\xf9\xe2\x76\x3c\xbb\xca\x90\xd0\xae\xdf\x2f\x60\x1a\xfe\x34\xbf\x4f\xe5\xf2\xe3\xfc\x7e\x7a\x0d\x53\x12\x3d\x64\x27\x3b\x13\xd8\xef\xc9\x2f\x99\x9c\xcc\xe0\x99\x45\xb6\xbc\xcb\xae\x56\x89\x7d\x59\x9e\xcf\xe6\x38\xec\xc9\x6c\xb2\x9a\x8c\xa7\xf2\x3a\xfb\x25\x9b\xce\xef\xec\x4a\x2e\xe0\xf1\x39\x4c\xef\xd5\x7c\xb6\x5a\x4c\xde\xdf\xaf\xe6\x8b\x91\x18\x2f\x97\xf7\xb7\x19\xf5\x6a\xb9\xe2\xf5\x98\x65\x57\xd9\x72\x39\x5e\x7c\x92\xcb\x6c\xf1\xcb\xe4\x0a\xa6\x7d\x91\xdd\x8d\x27\xd0\xd8\xd5\x7c\xb1\x40\xe2\xee\x14\x17\xde\xef\x1a\x11\xec\x1a\xfb\xa9\xe5\x6a\xb2\xba\x5f\x65\x4b\xbb\x21\xec\xa2\xce\xa0\x6b\x76\x82\xbb\xf4\x7e\xa9\x9c\xcd\xe5\xfd\x32\xe3\x3e\xd0\x04\x08\x9e\xa5\xf1\xfd\xea\xe3\x7c\x31\xf9\x1f\xd9\xb5\xfc\x98\x2d\x32\xdc\x76\xd9\x6f\x57\xd9\xdd\x2a\xdc\x83\xbe\x2b\x9e\x0e\xd6\x73\x44\xa6\x42\x40\x26\xe2\x6a\x88\xea\x93\xec\x4d\x0e\xe6\x39\x34\x09\x5e\xd9\x8e\xe4\x30\x66\x65\x14\xe4\xb1\xd9\x10\x97\x5f\xa4\xe1\x82\xf0\xc0\x0c\x42\x64\xaf\xe6\x87\xac\x1d\x01\xb7\xe1\x43\x03\x88\x5a\xe4\xda\x15\x6f\xdf\xc8\xdc\xde\xbb\xf5\x46\x3e\xe8\x75\x0d\x41\x16\x85\x88\x5e\x14\x21\xf8\x78\x2a\xc7\x65\x19\x80\x54\xcd\x90\xcf\x22\x88\xab\x60\x44\xb3\x74\x6c\x13\x24\x34\xcc\xa1\x79\x2a\x9e\x3c\x6a\x27\x82\x19\x87\x77\xdd\x5d\x53\x3f\x15\xc6\xa3\xaf\x12\xb2\xbb\xa0\x1c\x06\xfa\xda\x43\xec\x45\x51\x11\xb4\x90\x19\xa0\xf9\xb2\x8d\xf2\x98\x83\x05\x88\xba\x03\x4b\x74\xe9\x2e\x52\x04\x63\xb4\x56\xbf\x6f\xd9\xa1\xf9\x70\xa4\x42\x1b\xe8\xa8\xa2\x80\x52\x88\xdb\xa3\x68\xe6\x39\x60\x8d\x73\x2b\x8f\x73\xbd\x2e\x55\xa3\xa0\x74\xe7\xdf\x0f\xf9\x23\xd2\xd0\x61\x50\x76\x24\x39\x79\x6a\xd8\x30\x8f\x31\xbd\xc3\x59\xbc\x1d\xd9\xcd\x0d\x42\x7c\x14\xf6\x87\xb5\x24\xd0\xb4\x5c\xb3\x57\x96\xb3\xd8\x04\x54\x0e\x91\x67\x77\xa0\xa0\x15\x7b\x55\xb5\x67\x23\x6b\x43\xe8\x47\xf6\xf9\x51\x9e\x06\x34\x10\x3c\xf6\x6a\x18\x38\x3a\x8c\x3a\x70\x33\x84\x69\x43\x38\x6d\x5c\x07\x2f\xc8\x84\xed\x9c\x03\x0e\x6a\x07\x9f\xb5\xfb\xed\x13\x13\x85\x8a\x28\xb6\x4d\xf1\xa8\xcb\xf4\xb2\x67\xd6\xc1\x32\x27\xf2\xb0\xaf\x2b\xf9\x23\xed\x74\x2e\x5f\x69\xef\xd4\xe0\x03\xc2\x9f\xb6\x7d\x53\x83\x7d\x5a\x3c\xe9\xf2\xe8\xca\x7b\x16\x1b\x3a\x33\xae\x25\x0c\x29\x43\xac\x74\x0f\x97\x21\x36\x0d\x8e\x7c\x44\x3e\xbd\x93\xe7\xc5\x88\xbc\xdc\x45\x05\xd4\x85\xe4\xef\xdb\xab\x63\x34\x3c\x25\x77\x87\x16\x09\xed\xe1\x71\xd0\x0e\x5d\x74\x52\x0b\x02\xb5\xb3\xdd\xdd\xc8\xbd\x32\x48\x5a\x48\xb8\x3d\xa2\x51\x1a\x06\x49\x76\x67\x13\xec\xe6\xf3\xa2\xc0\x9c\x95\xbc\x51\xcf\xac\x87\xb9\x1d\x8f\xdb\xb9\x6b\xae\x9f\x00\x7d\xba\x54\xc0\xee\x87\xe0\x50\x75\xa6\xcd\x4d\x54\x02\x16\x22\x0f\x91\x71\xfb\x10\xfd\xde\xab\x23\x1e\x97\xa0\x4a\x10\x57\x6d\x8b\x27\x2a\xc7\xd5\x0d\x66\x97\x3c\x34\xc4\x03\x2b\xc8\x19\xd2\x1b\x1a\x29\xb1\x3c\x01\x55\x32\x24\x91\x1f\x8e\xf1\x1e\x09\x36\xa1\x3c\xb5\x09\x4f\x50\xe8\xba\x6a\x25\x5f\xf6\x45\x13\xb1\x2b\xe0\xc4\xf0\xc6\xdc\xeb\xa6\xa8\xf3\x80\x5a\x14\x62\xba\x14\x53\x07\x53\xc5\x91\x2b\x6d\x55\x93\xe3\xff\x72\xe9\x17\x49\xc8\x28\xf0\xf2\xd9\x15\xae\x80\xee\xd7\x0e\xaf\x1c\x3c\xbc\xf1\x54\xf1\xdc\x0c\x9d\xdd\xfe\x7c\xe1\x58\x22\x6c\x78\xa3\x9f\xea\xcf\x3a\xf7\x18\x71\xa1\x9c\xa5\x0b\x80\x29\x94\x69\x08\x0f\xa7\x0c\xa6\x3c\x91\xa6\x2e\xf3\x90\x4f\x33\x87\xc9\xd8\xaa\x9c\x9e\x7a\x21\x8d\x20\xdc\xa7\xf6\x0a\x78\xeb\xae\x00\x2a\xaa\xf4\x92\xa0\xe7\x1d\x1f\x1d\x62\x92\x9f\x08\xfd\xfa\xdf\x2f\x39\x29\x12\x82\xa0\x7c\xde\xc4\x8d\x36\x75\xf9\xa4\x73\x1f\x4c\x7e\x38\xca\x80\xfb\xd9\xe8\xb6\x45\x2c\xc3\x48\x00\x0b\x09\x9f\x63\xba\xe7\xe8\xfe\x1d\x1a\xa9\x3f\x33\xb4\xec\xe8\x88\x74\x42\xe9\x49\x95\x07\xdd\x21\xf3\x7c\x59\x8a\x9f\x84\x26\x09\xbc\x91\x1f\x34\x40\x5e\xec\x79\xb6\x37\xd4\x7a\x5d\x1f\xa0\x53\x32\xd7\x78\x90\x1c\x60\x76\x07\xbf\xd4\x8d\x74\x9d\xc0\x79\x3a\x62\xe5\x2b\x67\xb4\xc1\xca\x82\xdf\x13\x4f\xdf\x13\x79\xa3\x42\xf5\xa3\xd3\xab\x3f\x63\xaf\xfe\x6c\xcf\x32\xe2\x29\x6c\xd7\x74\x95\x0b\x08\xc4\xbb\x3c\x1d\xe6\x58\x37\xc1\xad\xef\x77\x62\xdd\x18\xaa\xf7\x62\x74\x89\xb5\xf2\x51\x3f\xda\xaa\x27\x2d\xc0\x61\xf2\xa4\xca\x22\x0f\x94\x24\xf2\xde\x33\x5d\x95\x6f\x29\xd0\x0c\xfd\x12\x06\xea\x4d\xac\x5d\x05\xbf\x38\xd6\x72\x6f\xb9\x58\x6d\x77\x3a\x19\xbf\x9f\x58\x83\x21\x15\x02\x35\xd9\xd9\x5c\x5e\x4d\x16\x57\xf7\xb7\xcb\x95\x35\x1c\xac\xf6\xcc\x86\xd6\x6c\x4e\xae\xc9\xd5\xc7\x6c\xbe\xf8\x94\xc8\x5f\x3f\x66\xa0\xd7\xaf\xe6\x8b\x95\x3c\x77\x66\x92\x98\x65\x1f\xa6\x93\x0f\xd9\xec\x2a\x1b\x25\xa8\xf4\x8f\xad\xa9\x30\x5f\xa0\x1d\xf0\xeb\x64\x99\x25\x72\xf9\x71\x3c\x9d\x5a\xf3\x21\x19\x36\x1d\x12\xab\x8a\x8b\x9e\xe1\x90\xb0\x49\x71\x3d\x59\xf2\xdf\xec\x48\x42\xa3\xc5\x3d\xb3\xbc\xbf\xb3\x36\x9c\x7d\x40\x80\x19\x72\x23\x97\xf7\x57\x1f\xd1\xca\xca\x96\x89\x7c\x9f\xc1\x14\x4c\x33\x6b\x3f\xd9\x27\xee\xb2\xc5\x72\x3e\x03\x9e\x2f\xfb\x9f\x93\xd9\xf5\x64\x01\x76\x8e\x35\x77\x26\xe3\x29\x58\x83\x93\xeb\x6c\xb6\x1a\x4f\x13\x01\x06\xc9\x6c\x99\xfd\xed\x9e\xac\x8b\xeb\xf1\xed\xf8\x43\xb6\x74\x86\xc4\xc7\xb1\x1d\x7a\xb6\xf8\x8a\x0d\xc9\xef\x09\xfb\xdd\xe9\x7c\x09\x0d\x7c\x98\xcf\xaf\x7f\x9d\x4c\xa7\x09\x94\x7f\x91\xcb\xd5\xfc\xee\x6e\xfc\x21\xb3\x33\x7a\x7b\x77\x6f\x1b\xbd\x19\x4f\xa6\xf7\x0b\xb0\x10\x6f\xc7\xd3\x9b\xfb\xd9\x15\xb6\x86\x9d\x07\x1b\xd0\xce\x31\xcf\xe1\xad\x35\x3a\xa3\x5e\xe2\xc7\xec\x44\x64\xbf\x64\x33\x39\x09\xa6\xe7\x13\x2d\xd0\xc7\xf1\x2f\x99\x78\x9f\xd9\x5f\x67\xd6\x9a\xb4\xb6\x31\xda\x92\x77\xf3\xe5\x72\x82\xbb\xc7\x4d\x2c\xb5\x9c\xb2\x79\x35\xb8\xd7\x04\xb6\x6c\x8d\xc6\xf1\xdd\xdd\xf4\x93\x9d\x7b\xf7\x23\x4c\xfd\x75\x36\x5e\x7d\xb4\xdd\xc3\xe5\x18\x4f\xe5\x64\xf6\x97\xfb\x05\x98\x9d\xf7\xd3\xd5\x64\xf6\x41\xde\x2c\xe6\xb7\xf0\x4d\x01\xbd\x7d\xb5\x94\x7e\xd7\xb1\x31\x9c\xfd\xb6\xca\x66\xf8\x91\xc9\x15\xac\xf2\x74\xfc\xab\xb5\x68\x3f\x4e\xde\x4f\x56\x4b\xec\xb2\xef\x64\x2a\x96\xf3\xdb\x4c\xfe\xe5\x7e\x31\x59\x5e\x4f\xa8\x3a\xd4\xf5\x1c\x3b\x3a\x9d\xce\x7f\xa5\x46\xaf\xa6\xf7\x4b\x18\xd3\xa2\x33\x42\xbf\x35\x4e\xee\x8c\x44\x2e\xe7\x38\x39\xbe\x1d\xbb\x4e\x41\x43\xb7\xe3\x4f\xd1\xdc\x08\x6b\x9f\x3b\xaa\xfa\xfb\x74\x99\xca\x0f\x76\xb3\xcf\x6e\xed\xe0\x32\x7b\x3c\x97\xd9\x62\x49\xb5\xe1\x7a\x11\x78\x79\xb6\xf6\xe9\x53\x45\xab\x77\xc9\x19\x12\x02\x59\x35\x44\x37\x3b\x59\x44\xb5\xf8\xbe\xff\xb3\xbc\x4a\x6f\xd2\x45\x2a\x2e\xd3\x8b\x37\x17\xf2\x7c\xbe\x6e\x53\x79\xf1\xd3\x4f\x3f\x8c\x92\x4e\x09\xac\xb0\xe1\x1e\xa5\xc9\x19\xc8\xbc\xe0\x11\xd1\x67\x3d\x89\x19\x2d\xc0\x77\xc7\xe4\xfd\xe4\x20\x45\x7d\x36\xee\x98\xbc\xb8\x4c\x2f\x2f\x2e\xc5\xf9\x52\xef\xb9\x6b\x00\x9e\xb3\x5d\x73\xb5\x09\xbb\x8f\x43\x77\xfc\x1f\x2f\x2f\xff\x94\xfe\xe9\xf2\xcd\xe5\xeb\x0b\x2e\x87\x29\xdc\x9f\xbe\x97\xe7\x7f\x39\x54\x9a\x07\x6d\x25\x2a\xce\x3a\x78\x34\xe1\x42\xcc\xaa\x5c\xde\x43\xa5\x21\x62\x29\x19\x0a\x1c\x56\x56\xeb\x03\x28\x65\x2f\x9c\xec\xa8\x7d\xec\xaa\x5e\xa4\xf2\x76\xb2\xbc\xca\xa6\xd3\xf1\x2c\x9b\xdf\x2f\xbb\x11\x8d\x08\x0b\x88\xf5\x8e\xb0\xe2\x99\xab\xed\x41\x6c\xfd\x40\x28\x40\xa9\xb5\xc4\xf3\x89\xe9\x82\x29\x54\xdf\xa8\xa8\xa2\xc4\x60\x5a\x0f\xf0\x42\x96\xec\xb2\x3b\x54\xba\xda\xd4\xcd\x5a\x63\xea\x01\xd6\x53\xe0\x77\xfd\x15\xdd\x68\xa2\x07\xc5\xb1\x46\xc1\xa4\x08\x46\xc9\x3e\xd0\xa0\x55\xf4\x84\x88\xd8\x10\x7f\x88\xfd\xc6\x57\xaa\x2c\x36\x75\x53\x15\x4a\x96\xea\xd9\xf7\xc0\x84\x3e\x5a\xff\x4d\x11\x38\xd4\x4b\xf5\xec\xeb\x9d\x13\x3e\xc1\x78\xaf\xec\x08\x10\x95\x74\x55\x17\x88\x47\x84\x1a\xc9\xaf\xeb\xcd\xeb\x52\x41\x31\x04\xfa\x56\x2a\x7f\xed\x18\x3f\x79\x61\xf6\x90\x56\xee\x10\x1e\x2e\x31\x03\x4b\xb5\x42\x32\x33\x54\x46\x2d\xda\xe2\x7f\xe9\x0a\xea\x94\xc2\x6d\xce\x8c\x19\xeb\xad\x6a\xb0\x90\x35\x86\xd7\xec\xd6\x25\x94\x77\x5e\xcb\x87\x83\x29\x2a\xb0\x35\x51\x59\xb9\xaf\x20\x28\xb7\x6c\x55\xab\xc1\x83\x3a\xde\xe9\xa6\x58\xab\x84\x42\xeb\xce\xa2\x89\x91\x24\x3d\x3f\x07\x44\xe9\x82\xd4\x6b\x2d\xfe\x7e\x68\x0a\x93\x17\xeb\x30\xc9\xfb\x46\xe7\x80\x5f\xb9\xaa\x0f\x8d\x2f\xb3\x35\xb3\x1b\x57\x37\x15\x81\x9a\x30\x24\xe4\x17\x28\xc1\x4d\xff\xa4\xab\x83\x96\x48\x54\x52\x54\x72\xa9\xaa\x56\xc9\xab\x52\x35\xca\x36\x07\x58\xaa\xe0\x1d\x1f\x8d\x2d\x6b\x60\x2f\x80\xa9\x13\xdd\xfc\x92\x75\x6d\x5a\xf3\x35\x1a\x20\xa0\xb3\xc5\x47\x49\xdd\x72\xea\xa9\x6a\xdb\xba\xa9\xf4\xd1\xbc\x92\x1b\x4d\x55\x73\xf4\x97\x3d\x68\xa9\x08\x0e\x52\xdd\xf8\xa2\x9b\xf3\x19\x59\xd0\x57\x75\xf5\x84\x6c\xb0\xa2\xae\x50\x7f\x57\xeb\xd6\xb8\x18\xfb\xa4\x22\x2e\x74\xc8\xdd\x5a\x2a\x04\x9e\x7e\xa8\xeb\x1c\x60\xfc\xbe\xa8\x0b\x6e\x3b\x9d\x43\x72\x96\xb0\xdb\x3a\x0e\x5d\xe3\x86\x72\x3b\xd6\x63\x62\x54\xf5\x78\x20\x7a\x59\xe5\x39\x49\x78\x61\x85\x95\xcd\x6d\x73\xb0\x76\x22\x59\x24\x60\x30\x35\xe8\x9c\xf0\xbe\xfa\xa0\x58\x59\x97\x53\xed\xe2\x32\x05\xc7\xee\x7c\xe6\x2e\x76\x7b\x1b\x83\x53\x73\x89\x04\xc2\x5c\x45\x68\x18\xfe\xd1\xf1\x0a\x98\x04\xc9\x00\xdd\x81\x08\x16\x16\x79\x11\x30\xf9\x13\xd0\x12\x6a\xa7\xc0\xc2\x6c\x0a\x4c\x02\x3f\x95\xbe\x62\xd7\x9d\xd8\xab\x0e\x6d\x51\x72\x39\xe8\x7a\x73\xba\x2a\x8d\xcb\x4b\x74\x58\x16\xe4\xaa\xb3\x9b\xaf\x0f\x96\xec\xa0\xc8\x0d\x9d\x78\xc6\x72\x50\x56\x14\x0d\x84\x10\x8f\x90\xbf\xa2\x7f\x07\x96\xda\x52\x63\x3a\x7d\x2a\x66\x58\x45\x9b\xdd\xb0\x05\x66\x7b\x54\x39\x9e\x7a\x77\x24\x7d\xb0\x04\xd6\xb0\x68\x0f\x54\x60\x5e\xe5\x44\x06\x6c\x47\xe7\x00\x34\xb4\x56\x6f\x53\x79\x6b\x75\xa1\xbb\x69\xf6\x9a\xfc\xd8\xa8\xfd\x42\x3d\xd0\xee\xea\x00\x80\xcc\x55\x3d\x0f\x33\xbb\x7b\x48\x0b\x65\xe4\xbf\xdd\x52\x31\xd7\xd7\x34\x83\xf9\xbf\xa5\x62\xe0\x8f\x8e\x17\x8b\xf6\x68\xff\xbb\x48\xde\x6d\x20\xb8\xd8\xd6\xb4\x62\x5a\xbc\xd8\x01\x5c\xc0\x4f\x31\x81\x3f\xd8\x7a\xbe\xde\x80\xb3\x32\x13\xc1\x42\xde\x3b\x4a\x4e\x02\x8b\x48\x9c\xc6\xd0\x8a\x20\xa8\x25\xc6\x69\x10\xdf\x7a\xdd\x8f\xb2\x11\x1a\xdd\xd5\xe1\xf5\xac\x74\xb0\xdf\xa0\x61\xd5\x74\xa5\xec\x40\xb8\x2e\x22\x50\x3d\x0f\xc2\xcb\xa3\x9f\xa3\x82\xd6\xae\x18\x0a\x34\x4d\x97\xde\x09\x60\x9d\x3b\xcb\x71\x71\x8d\xe0\x86\x0f\x92\x5b\xda\xb0\xa8\x8f\x39\x54\xe9\xba\xde\x7d\x87\xc3\x8a\x23\x83\x85\x91\xff\xd1\xfd\x27\x4f\x71\x09\x75\x68\x42\xc4\x40\x0b\x32\x95\x77\xbc\xfa\x01\x81\x05\xfd\x88\xa9\x07\xae\xa2\xca\xd5\xc8\xbf\x2a\x30\xf6\xb0\xc0\x53\xbe\xc0\xa2\x5e\x79\x2a\x42\x52\x83\x73\x33\x7a\xd7\xef\xee\xe0\x3f\x69\x05\x9a\xdf\x50\x25\xf1\xa0\x0f\xaf\x29\x25\x54\x1f\xc2\xe2\xd6\x71\x2d\x16\x81\x8d\xba\x18\xb2\xfd\xfd\xdf\xfe\xe7\x7f\xfc\xc7\x7f\xfc\x3b\x2f\xc0\xbf\xc9\x51\xe2\x35\x06\x20\x48\x05\xf7\xa4\x57\x6a\xea\x8d\xfc\x9f\xd8\xb9\x7f\x17\x21\xa2\x2b\x50\x6b\xac\x60\xd7\x8a\x6a\xc9\x43\xde\x33\x38\x05\x25\x95\xfd\x78\x2e\xcc\x16\xe2\xf5\x50\xaa\x14\x5d\xc1\x58\xb2\xab\x1b\xfc\xc7\xd4\x88\x93\x49\xe1\x1a\x7b\xf2\xef\x91\x08\xad\x6a\xf0\x7c\x62\xe3\xa0\x4a\x19\xc6\x57\x9c\xfe\x86\x6f\x7e\x79\x37\x05\x00\x35\xe6\x02\xd8\x37\x44\xae\xd7\xa8\x8e\x3e\x1c\x89\xf5\x91\xdc\x3a\xc1\xac\x60\x4d\xf0\x4e\xc5\xdc\x9d\xdf\xf6\xe4\x6c\xf7\x35\x78\x83\x77\x43\x96\x44\x1e\xd4\xbf\x47\x20\x4e\x3b\x6b\x04\x07\x20\x5e\x1e\xbb\x98\xdd\xcf\x27\x11\x86\xc9\xee\x86\x6f\x19\x34\xfa\xfe\x05\x8d\x9d\xb3\xc7\xe3\x3e\x08\xf1\x3f\x67\xf3\x55\xf6\x0e\x0e\x14\xa4\xde\x71\x43\x5e\x10\x05\xc5\xbb\x4c\x69\xb7\x7f\x79\xf4\x50\x00\xff\x0e\xc7\xeb\xcd\x10\x6d\x24\x30\x03\x0e\xd2\xf8\x20\x6e\xc6\x6c\x21\xad\x84\x68\xd2\xc4\x89\x9e\x34\xca\x3b\x95\xdd\xc7\x81\xfe\x9f\xbf\x19\x0b\x8f\x10\x2a\xee\x22\x16\x71\x4e\xee\xbf\xff\x9f\xc2\x82\xfe\xff\xdf\x7f\xe9\x77\xf3\xe5\xf4\xbf\xac\xf2\x0b\xfe\x7b\x99\xff\xfd\xf2\xed\xe5\xe5\x9b\x1e\xff\xfb\x0f\x3f\xfe\x8b\xff\xfd\x9f\xf1\x0f\x94\x82\xbd\xae\x7c\x61\x30\xbe\x15\x9e\x52\x79\x99\xbe\x21\x7f\xc5\xf0\x23\x70\x13\x3a\x96\xe6\x51\x88\xcf\x04\x90\x30\xcb\x0b\x50\xc9\xeb\x8d\xa0\x7a\x12\xdb\x62\x4f\xaf\x3a\x89\x02\x74\xd3\x23\xf9\x0c\xf7\x1e\x24\x36\x44\x8d\xd7\xcd\xd9\x08\x40\x77\x54\x68\xd8\x8a\x31\x5f\xe0\x8d\x61\x9d\x3b\xe0\x9d\x00\x8c\x7d\x5c\xe6\xcf\x57\x80\xe3\xc0\x70\x1d\x53\x99\x0a\xfb\xfd\x77\x82\x6f\xe6\x50\x11\x38\x31\x39\x74\x33\xc0\x0c\x5d\x8c\x90\xfc\x0c\x93\x34\xf8\x53\xee\x26\xe2\x21\xfc\x31\x52\x33\x11\x91\x9a\x01\x8b\xd8\x5e\xb7\x07\x55\x86\x3c\x62\xe8\x0e\x71\xf8\x66\x7b\xdb\xb5\x61\xed\x3b\x47\x15\xa7\x46\x08\x72\x25\x96\xb2\x58\x9c\x03\x6e\x1d\x14\xcf\x7d\xa1\xcd\xcf\xc0\xed\xd5\xd6\x72\xdf\xe8\x3d\x32\xa6\x77\xea\x57\x9f\x9f\x75\x01\x8a\x67\x23\x6b\x17\x71\x9c\xb6\x37\xb3\x3f\x0b\xb1\x1e\x75\x6c\xad\xb0\x16\x7e\xb7\x2f\xf6\xbe\xef\x7e\xc2\x95\xc0\x84\xc1\x27\xbe\x26\x1b\xde\xe7\x35\xf3\x3d\x73\xab\x71\x8b\x75\x33\xd0\x20\xc1\xf5\xc2\x44\x0f\x67\xb8\x95\xdf\xb8\x13\x7e\xe6\x19\xce\x47\x54\x49\x8c\xd2\xac\xbb\x63\xc2\x7e\x97\x47\xa2\x4f\xc3\x97\x34\xcf\xca\xbe\x54\xc7\x17\x5e\x4a\x85\xb8\x0c\x36\xd9\x5d\x48\x74\xfc\xcf\xdb\x61\x09\x4d\x46\xc8\xf2\x6c\x90\xde\x59\x70\xd1\x05\xa6\x85\x0d\xcc\x13\x4e\x4b\x03\x72\xb0\xdd\x43\x9d\x17\xba\xaf\x52\x70\xee\xc4\xe6\xd0\x54\x80\xc0\x15\x9d\x36\x86\x28\xda\x06\xb8\x2c\x87\x77\x93\xe8\x21\x6a\x85\x78\x1b\x4c\xe8\x10\xe9\x2a\x69\x6d\xcd\x2e\xa6\x8c\x1e\xe2\x8b\x16\x21\x5f\x74\xfc\x71\x4f\x18\x2d\x07\x08\xa3\x1d\x38\xc6\x13\xa7\xc4\x59\x67\x64\xc9\x82\xa7\x01\x4b\x6d\x06\x48\xe3\xe8\x4b\xbd\x5d\x80\xd9\x3d\x06\x4f\x32\x78\x9c\xa0\x44\xd4\x7a\x5b\x54\xfa\x75\xa3\x55\x0e\x4b\x7b\x8a\x9f\xa9\x6b\xed\xe1\x4c\x42\x11\x5e\x64\x77\x82\x4a\x10\xc1\xcb\xf1\xb0\x61\xc1\x5d\x87\x02\xba\xce\x54\xb8\xbf\x52\xed\xe6\x0e\x92\xda\xa8\xb6\x30\x5c\x24\x33\x48\x37\x7d\x38\x4a\x2e\x77\xde\x1f\xc6\x49\x9a\x29\x64\x1f\x09\x53\xf6\x1b\xbd\xaf\x4d\x01\x80\xad\x41\xae\x04\xe1\xeb\x01\x16\x15\x7a\x12\x0b\xb2\x51\x20\xaf\xbd\x2a\x10\xe2\xb5\xd6\xc6\x70\x30\x77\x83\x49\x4c\x5c\xa2\x98\x47\x28\x18\xe8\xde\xf5\x33\xf5\xe6\x0b\xb3\x34\x1f\x5c\x66\x40\x40\x19\x05\x25\x7c\x81\xe4\x44\xb5\xa7\x06\x02\x99\xec\xdf\x7e\x0b\x32\xf6\x17\x4f\xa5\xbf\xb3\xfb\x7b\x4a\x88\xef\x47\x32\x43\x11\x61\x37\xed\x8d\xb5\x4c\xf8\x0e\x24\xc2\xcf\x59\x40\x0d\x5e\xa9\x1d\x4a\x5f\x7f\x6a\xb9\x76\x14\xfc\x24\x98\x10\xa7\xe3\x83\x1b\x98\x90\x8a\x22\xe4\xb8\xa8\x45\x40\xc8\x69\x10\xf1\xd0\x3c\x59\xd3\x10\xfe\x90\x44\x46\x7c\x5b\x4b\x5d\xe5\x75\x63\x88\xd7\xbf\xde\xd5\xad\xcb\xc5\x72\x24\x3a\x41\x92\x5d\xbc\xc9\xd9\x01\x4d\x6e\x5d\x0a\xc6\x53\x45\xda\xb0\x68\x7e\xe4\x83\xa9\x9b\x54\xb2\x4f\xb0\xa8\xc4\xb0\x83\xde\x7b\x03\x91\x33\x21\x40\xd8\xd8\x49\x70\x03\x4c\xfc\x5a\x99\x44\xa0\xb8\x35\x09\x3e\x20\x8d\x5e\x37\x1a\x93\xe2\x95\xab\x11\x3e\x4c\x35\x13\x2c\x04\xf9\x97\x84\x0a\xfd\xd5\x40\x39\xe4\x8a\x51\xc8\xd9\x0b\xe4\x89\x03\xd2\x57\x40\x1d\xe4\x0d\x66\x11\x80\x38\x46\xe9\xee\xd2\x95\xbb\x15\x01\x4c\x88\x5b\x0a\xe0\x24\xb9\xa0\x9f\x83\x58\xa5\xe7\xc6\xb3\xdd\x42\xe9\x10\xf7\xa6\xc5\x62\xf7\x6e\x4f\xf8\xb1\x3a\xf2\x29\xf0\xe7\xe2\xcf\x50\x70\xb0\x93\x8c\xd5\x91\x9f\x7e\xf9\xe2\x1c\x0a\xb7\x7c\x40\x4c\xb2\x6f\x34\x75\x80\x53\xaa\xfc\x1c\xc3\x96\xc2\x41\xd9\x86\xf0\xb6\xf4\xc9\xa1\xc8\x61\x37\x90\xdc\x59\x1d\x5f\x14\x9f\x3e\xdf\x00\xf9\x21\x20\x43\x5a\xe1\xa4\x08\xc8\x8d\x65\x7f\xc3\x0f\xf6\xb4\x82\xdf\xab\x94\xd7\x7a\x5f\xd6\x80\x94\x09\xaf\xb2\x81\x9f\xc3\x2b\xed\xd0\xa9\x25\x3f\x54\x1f\xe8\xa4\x42\x45\x09\xd6\xcf\x8a\x40\x41\xce\x77\x1c\x1f\xb0\xa1\x57\xc3\xf3\xfb\x70\x64\xa6\xb7\x60\xbb\x7c\xaa\x0f\xbe\x36\x8b\x55\xff\xbf\xde\x1d\xd0\x5d\x3d\x66\x0c\xf7\x8c\xb5\x2f\xf6\xba\x31\x54\x0b\x09\xf9\xe3\x42\x5e\xa0\x98\x98\xc6\x7b\xf5\x37\x94\x74\x03\xc5\x75\x95\x0f\x8a\x57\xba\x7d\x86\xed\x33\xb6\xef\x72\x85\x7f\x5f\x4f\xdc\xd9\x1a\xa4\x94\x81\xbb\x1f\xd7\xdd\x01\x7e\x92\x30\x82\x41\x79\xc1\x62\x60\xa5\x1c\x78\x68\x23\x55\x77\xbc\x3d\x29\xa3\xe2\x55\xf4\x7c\x43\xa1\x76\x8b\x2e\xbf\xaf\x66\xf0\x03\x27\x68\x13\x26\x2c\x72\xed\xe6\x8b\xf3\xf5\xc8\x87\xbc\x7f\x1c\xc9\x71\xeb\x69\x11\xd0\x9f\x1b\xf0\x51\x34\xba\x55\x05\x14\xb8\x18\x52\x38\xec\xe6\xf1\xa3\x12\xb1\x96\x4e\x0e\xe5\x84\xa9\x96\x50\x3c\x26\x43\x8c\xcd\x5c\xdb\xdb\x39\xd2\xc4\x0b\x9a\x0d\xdf\xbf\x06\xcb\x57\x28\x13\x90\x04\x04\xab\x05\x7a\x47\x95\x0b\xac\x31\x48\x19\x92\x4f\xe4\x25\x0b\xea\x31\xb5\x8c\xcb\x87\x9d\x74\x16\xce\x06\xc5\x17\xce\x3c\x85\x8a\x2f\x5d\xd0\x61\x5d\xec\x4c\x85\x1c\x9c\x0a\x2c\x7e\xd0\x34\x47\xa9\x84\xa3\x91\x93\xfd\x2f\x7e\x95\x13\x2a\x60\x2e\x81\xcc\x2c\xc7\xc2\xe0\xd2\xcb\x86\x34\x83\x3f\x8d\xe4\xaf\x44\xa2\x01\x36\x49\x53\x3f\xe9\x0a\xa2\x16\x60\xbe\x15\x06\x84\x3a\x06\x0e\xf8\xc1\x40\x49\x25\x02\x0e\xe3\x93\xc1\xbc\x95\x4e\x79\x0d\x43\x8a\x41\xc0\x34\xd6\x7a\x1a\xa2\x28\xbb\xa2\xa8\xac\xed\xe0\x3e\x04\x79\x0e\xcf\xd5\x80\x55\x42\x3f\x7a\x63\x27\x8f\x10\xe8\xf2\x34\xe7\xa5\x37\x3e\x7b\xea\xc0\x3a\x8a\x58\x78\x67\xbe\xbf\xd1\x09\xfc\x1c\x74\x3f\x95\x99\xa3\x80\xea\xdd\xce\x74\x56\x42\xbd\x0e\xca\xe1\x68\x48\x40\x30\xda\x0a\xa8\x35\xf2\x12\x75\x4d\x7a\xe3\xd9\x1b\x06\x22\xa7\x18\xd9\x3c\x83\x64\xaa\x33\xcc\xa5\x82\xae\x31\x88\x8d\x13\x6e\x12\xa6\xf8\x64\xd9\x86\xcc\xac\x65\x11\xd5\xef\x49\x86\x22\xf7\xb0\xae\xb4\xd2\x64\x97\x07\xf9\x4e\xd9\x6d\x36\x5b\x85\xf9\x52\x18\x97\xae\x1b\x79\x33\x59\xcd\xb2\xe5\x12\xb1\x7a\x41\xe2\x94\xa0\xc4\xa9\x6f\x48\x93\x62\x28\xdb\x7c\x31\xf9\x30\x99\x8d\xa7\x88\xb4\x0b\xf3\xa2\xd0\xb3\x35\x9c\x9a\x16\x84\x6b\xe1\x20\x6b\x63\xa8\x38\x8e\x2f\x22\x15\x86\xd8\x67\x75\xe8\x86\xe9\x2d\x43\x3f\xf9\x87\xc2\x7d\xc1\xb2\xe4\xee\xc4\xa4\x42\xfc\x79\x24\xa7\x9e\x28\x18\x74\x1b\x0e\x11\xcb\x7b\x78\xa7\xaa\xe5\xba\x68\xd6\x87\x1d\x96\xff\xc2\x48\xfb\x81\x7f\xa2\x02\xb5\x5b\x5d\x37\xc7\x44\xf0\xbd\x69\xb7\x52\xdd\xb4\xf2\xdc\xc3\x2d\x2a\xfd\x58\x16\x8f\x76\x07\x21\x06\x0c\x90\x07\x49\xa7\x1c\x0a\xf1\xd4\x6d\xb5\x37\xde\xe0\x12\x71\x35\x1b\xab\x23\x5d\xaa\xbe\x0e\x2b\x15\x68\xf1\xa5\x5a\x20\x86\xab\x4a\xd8\x32\x20\x30\x55\x99\x90\xdb\x80\xb2\x72\xed\xf4\x32\x56\xc0\x33\x67\xda\x0e\xd9\x2b\x17\xc1\x03\x5d\xb2\x88\x48\x53\xa3\x9b\xf6\x30\x50\xb8\x82\x7c\x5c\x2f\x6d\x56\xf7\xed\x4d\xdd\x88\xb2\x06\xb3\x4b\x3e\xd6\x75\xfe\x5c\x94\x65\x82\x4e\x4c\xd3\xd6\xfb\xbd\x7a\x84\xda\xbd\xa4\x00\x6c\x54\x51\x1e\xb0\x3a\xc2\x4e\x95\x9b\x43\xb5\xc6\xd6\x68\x22\xe0\xd2\x28\x4b\x5f\x80\x9f\x61\x75\x6e\xa4\x8d\xb4\x1f\x43\xb8\x4a\x61\x82\x1e\xc9\x10\x1a\x40\x54\x84\x11\xcc\xc3\xff\xb8\x81\xe4\x00\x85\xb5\x49\x70\x29\x80\xa5\xe6\xef\x07\xb0\x73\xed\x6c\xd9\xc9\xdb\x78\xfb\xad\x6e\x5e\x19\xe1\x57\xbf\x83\xf0\x8a\xd1\x56\x4e\xd5\x25\x04\x9f\xef\x62\x2a\x97\xf5\x4e\xcb\x10\x6a\x64\x04\xa7\xe0\x42\x2c\x11\x1b\x25\x0b\x12\x99\x95\xc2\xf1\xf9\xcd\x20\x4f\xed\x85\x44\x18\x42\xb4\xf8\x76\xec\x66\x0f\x1a\xe2\x90\xba\x9b\x99\x4f\xf5\x21\x15\xe2\xa7\x91\x1c\x03\xc3\xb0\xbb\x96\x56\x01\x6c\x9a\x13\x01\xbe\xcd\x29\x09\x44\x5b\xdd\x3b\xb9\xcb\xe4\x11\xe5\xba\xe8\xcd\xc6\x1e\x36\xaf\x5b\x45\xe7\xd5\x2a\xee\x48\xa6\xc8\x19\x23\x20\x5b\x15\x08\x1a\xdb\x83\xf0\x56\xae\x4f\xeb\x66\xce\x6e\x11\xba\x34\x5a\x3e\x1c\xda\x58\xca\x9f\x87\x05\xba\xc8\x88\xf5\xe8\x42\xc6\xfc\xf8\xdb\x12\xe1\x34\x23\x11\xf8\x10\xf7\x51\xe5\x6a\x52\x3e\x7a\xda\xc9\x09\x07\xb0\x9b\xbc\x90\xe4\x34\xa0\x10\xe9\x5c\xe0\x81\xe9\x77\x41\xb7\x39\x55\x7d\xb3\x67\x09\xf9\x80\x04\x7a\xba\x4d\xdd\x95\xa2\xa7\x98\x3f\x5e\x9c\x03\x71\x72\x0e\x62\x70\x57\xcc\xa0\x01\xa8\x51\xaf\xb1\x00\x24\xd1\x0a\x48\xfd\xfb\xa1\x78\x52\x25\x18\xd1\xea\x19\xba\xc2\x27\xff\x60\x15\x03\x6d\x9c\xaf\xa7\x88\x60\x65\xad\x9d\xd6\x23\x98\x6a\x00\xbd\xd4\x89\xd5\x62\x82\xba\x61\xa7\xe7\x8c\x94\x96\xc1\xa9\xc3\x1f\x30\x2e\x2f\x20\x44\xab\xfc\x89\x18\xa2\xb6\x21\x92\x16\x7b\xd6\x09\xa8\x8b\x9e\xaf\x9c\xca\xff\x0e\x41\x3b\x7d\xfe\x53\xa8\xa5\xd8\x17\x3d\xde\x05\xbc\x63\x70\xf1\x45\x7b\x40\x9c\x1e\x4f\x87\x5c\x00\xb7\x16\x0c\x81\x45\x6e\x5b\xcb\x6d\xcd\x0e\x26\x8a\x03\x84\x6c\x2a\xb1\x71\x72\xf1\x66\x14\x9e\x7f\x90\x99\xe4\x49\x1f\xaf\x51\x22\xac\xfa\x6e\x9b\x53\x09\xba\x8e\x0f\xff\xa5\xd1\xbd\xb0\x5a\x9d\xd1\x0d\x25\x42\xc1\x65\x81\x92\x8b\xd2\x3b\xa3\x02\x83\x72\xdd\xd4\xc6\xbc\xc6\x24\xa1\x9a\x76\x98\x6e\xe0\xbf\x13\xc0\xe0\x0d\xe5\xfb\x60\xb2\x22\xa2\x08\xbd\x32\xde\x41\xc1\xba\xa4\x28\x7f\x0f\x08\x20\xf2\xf1\x95\x80\x20\xb3\x90\x1b\x0a\xeb\xc5\x7d\x5b\x53\xfd\xcb\xf9\xfc\x01\x9c\x6e\x3c\xbc\xa0\xae\xc5\x89\x28\x11\x14\x97\xeb\x97\x28\xe2\x84\xb9\x91\x5d\xf2\x8b\x91\xfc\x4b\x70\x37\x25\xf2\x17\x00\xb1\xda\xc5\x43\xc8\xb7\xfd\xd4\x54\x3d\x53\xad\x52\x57\x3d\xce\x1c\x8a\x36\x44\xdc\xc6\x0e\x3d\xf2\x56\x3c\x00\xb8\xbc\x25\xca\xbe\x8a\xd4\x7f\x06\xd6\xaa\xe8\x56\xc4\xb4\x2e\xe2\x5e\x08\x5d\xe0\x88\x5d\x6e\x3c\x7a\xc8\xfd\x68\x0f\x1d\x78\x2c\xed\x59\xdc\x37\xc5\x4e\x35\x47\x07\x1f\x4e\xbc\xbe\x27\x10\x42\xfa\xec\x59\x53\xa2\x0f\xbf\x88\x85\x96\x21\x16\x7a\xb5\xd5\xe2\x8f\xa0\x65\xe5\xd7\xd1\xb2\xe2\x5b\xd1\xb2\xa7\x95\xb6\xfa\xd0\xda\x49\x82\x51\x9a\x75\xbd\xef\x8b\x2d\x2b\xb2\x01\x09\xcb\x42\x8b\x4f\xf8\x29\x64\x74\xc4\xab\x08\xd6\x98\xae\x54\xd9\x06\x57\x3f\x88\x77\x1f\xcb\x1d\x5b\x05\xf6\xe2\x4f\xf0\xe7\xab\x54\x5e\xbc\xb9\x90\xba\x95\x46\xff\x9e\xa2\x89\xf3\xad\x52\xff\x94\xc8\x2f\x0c\x3b\x54\xba\x69\x5e\x71\x8e\xfb\x00\x41\xd2\xc5\x25\xf8\x5c\x10\x04\x2d\x6f\xb4\xd5\x23\x27\x94\x79\x8d\x1b\x00\xfc\xe1\x80\xcd\x7f\xe1\x8a\xac\x1b\x61\xb4\x86\x38\x15\x2b\xa6\x7e\xfb\xdb\xad\xdb\xd6\x09\x07\xbd\x9e\x88\x80\x1a\xb1\xbf\x6e\x92\x41\x00\x00\x65\x63\x2d\x1a\xbd\x06\x47\x19\x6e\x39\xc6\x6d\x33\x30\xfb\x6b\x66\xe3\xd7\x00\xde\xd8\xa2\x23\x9b\x83\xd0\x75\x55\x91\xd0\x07\x01\x14\xa4\xc4\x07\x1f\xc3\xca\xcc\xfb\xbd\x56\x70\xc7\x05\x0f\xc5\x8b\x20\xbf\x69\x11\x44\xb0\x08\x6f\x47\xf2\xb6\x30\x6b\x5d\x96\xaa\xd2\xf5\xc1\x74\xae\x92\x3f\x92\xe6\x81\x1b\x7d\x30\xd5\x43\xfe\xb1\x54\x0f\xf1\x62\xaa\x87\xfc\x63\xa9\x1e\xe2\x44\xaa\x87\x10\x17\xdf\x8f\xe4\xb5\xaf\x53\x5b\x6f\x5c\x35\xd1\x68\x12\xb8\x78\x2a\xe5\xe4\xd4\x1d\x45\xd5\x97\xe5\x2c\x2a\x79\xd8\x13\xf9\x41\x59\x3f\xdb\x53\x04\xa4\x79\xff\x2f\x54\x5a\x1d\x2c\x96\x2a\xe2\x62\xa9\xe1\xe5\xe7\x6a\x4e\x7f\x7b\xad\x54\x11\xd6\x4a\xb5\xfa\xd2\x1f\xa9\x95\xca\x85\x52\xb1\x16\x94\x88\x0a\xa5\xca\xff\x74\xa1\x54\xe7\x37\x78\xb9\x50\xaa\x55\x04\xa2\xb2\xa6\x83\xf5\x51\x89\x25\xf9\x64\x9d\x54\x6e\xab\x18\x7d\x63\xb9\xd4\x8b\x1f\x46\xe8\x60\xb6\x63\xbb\x37\x01\x9b\x2a\x0f\xb3\x07\x70\xb1\xeb\xfd\x4c\xfc\x10\x7e\x14\x82\x6b\x05\x21\x76\xdf\xe9\xba\x7d\x7e\x2b\xa8\xe5\x7a\x44\x65\xdf\x6e\x27\x77\x55\x83\xfb\xd5\x68\x03\xe6\x39\x38\x56\x5b\xdd\x6c\x74\xa3\x5d\xbd\xd0\x87\x7e\x69\x15\x18\xce\xc1\xae\x31\xba\xf5\x39\x37\x2c\x08\xbe\xc5\x70\xe9\xcb\x37\x6f\xde\x5a\x65\xa5\x01\xa5\x30\x4b\xe5\xa2\x36\xba\x42\xe8\xb4\xa3\x9b\x65\xe8\xf4\x9d\x37\xda\x0a\x13\x01\x43\x38\x1f\x61\x7f\xec\x73\x59\x06\x9f\x67\xb9\x1c\xc2\x16\xd2\xb8\x87\x6c\x76\x3f\x04\xae\x62\x7e\x2d\x34\x6a\x07\x83\xa7\x02\xef\x06\x1e\x20\xac\x74\xfa\x2f\xc0\xe8\x3f\xf9\x5f\xfa\xdd\xe4\xfd\xed\xeb\x7d\xf1\x60\xfe\xeb\x00\xa0\x2f\xe3\x3f\xdf\x5c\xfc\x70\x71\xd9\xc1\x7f\xbe\xbd\xf8\xf1\x5f\xf8\xcf\x7f\xca\x3f\x54\x7b\x82\x4a\xf0\x2f\x14\x8d\x3a\xa2\xd9\x3a\x79\x7f\x4b\xb1\x83\xf1\xf2\xf5\x64\xc9\x19\x51\x63\x8c\xd9\x62\x59\x11\x54\x1b\x7d\xd3\x5e\x68\xb0\x93\xda\xb6\xe2\x63\x22\x01\x15\x24\x10\x73\x63\x14\x79\x8b\xe4\x16\x5b\x8c\x69\x1a\xb9\x89\x4b\xec\xdb\xd7\xd1\xae\xe1\xaa\xab\xfc\x5f\x58\x0c\x1f\x08\xf3\xda\x84\xf2\x0b\x7c\x34\x14\x1e\xe2\xa0\x46\xb7\xa0\xf3\x2e\xae\x2a\xe5\x1d\xfb\xc2\xf7\x9b\x10\x19\xd2\x9b\xd8\x81\xd9\x04\x56\x0e\xa6\xda\x52\x94\x84\x03\x4f\x1e\x80\xe3\x23\xf6\x64\xfa\x34\xee\x9e\x77\xa6\x2c\xa3\xf6\x3d\x69\x2a\x68\x17\x30\x6f\xaa\x82\xe2\x16\x04\xeb\x6a\xf5\x7a\x5b\x15\x6b\x55\x32\x7d\x3f\xd9\x62\x61\x6b\xc0\xb1\x5e\x50\x9e\xe0\xc0\x65\x44\xa8\x1c\xf4\xbe\xae\xb5\x11\x1d\xa7\x71\xe4\x57\x0f\x1a\xa6\x21\x90\xf7\xff\x79\x0b\x30\x96\xca\x6c\x20\x7f\xa4\xbb\xb7\x38\x36\x10\x03\x4a\xe3\x22\x45\x60\x42\x86\x7b\xc3\x11\x09\x41\x73\x7b\xd5\xa8\xc7\x46\xed\xb7\x89\x8f\x04\xda\x2d\x87\xb5\xab\x9e\x6b\xff\x80\x63\x03\xe7\x0e\x59\x53\x21\xe8\xf6\xd5\xfc\xee\xd3\x62\xf2\xe1\xe3\x4a\x4e\xe4\x7b\x79\x2b\xaf\xe6\x8b\xbb\xf9\x02\xf3\xf4\x2f\xdf\xbc\xb9\x14\xc2\xa5\xde\xdd\x8e\x57\xd9\x62\x32\x9e\xca\xd7\xf2\x6e\x31\xff\xb0\x18\xdf\xda\xff\x7f\x97\x2d\x30\xcc\x04\xef\xff\x1f\x7a\x73\xa5\xdf\xe5\xd6\x36\x59\xab\x56\xe7\xff\xf1\xe1\xe6\x7a\xfa\xfa\x22\xbd\xf8\xdf\x7c\x15\xbc\x2c\xff\xbf\x7f\xfb\xe6\xfb\x1f\x3a\xf2\xff\x87\x37\x97\xdf\xff\x4b\xfe\xff\x33\xfe\x7d\x98\xdd\xcb\x9b\x46\x6b\x79\x1d\xe1\x4e\xd9\x2b\x29\x7c\x2e\xe3\x45\x22\x6f\x55\xb3\xde\xda\xc3\xf1\x46\x88\x9e\x6a\xfa\x06\xdb\x71\x00\xe9\x9b\xfa\x50\xe5\x64\xcf\x03\x03\xf2\x0f\x17\xf2\xa6\x51\xd5\xe7\xb2\xa8\xe4\xb2\x4d\xe4\x4d\xb1\x69\xb7\xf2\xa6\xac\xeb\x26\x11\xef\x6b\xd3\xda\x27\x6f\xc7\xf2\xcd\xe5\xc5\xc5\x9b\xd7\x17\x6f\xdf\x5c\xc8\xfb\xe5\x58\x88\xec\x49\x37\x70\xb5\xd8\xe3\x0f\xc8\xcc\x17\x54\xd8\x27\xdd\x3c\xa8\xb6\xd8\x45\xa1\x1c\x7f\xfb\x38\x78\x6d\x02\x91\x12\x28\xcc\x47\xf7\x81\x23\xbc\xb5\x36\x67\x8e\x99\xb8\x6f\x52\x79\xb7\xc8\xc6\xb7\xef\xa7\x19\xe6\x4f\x92\x59\x36\x64\x77\xb3\x7d\xac\xac\x45\x05\x28\xea\x56\x7f\x69\x1f\xea\xfa\xb3\x0f\xa7\xb2\x26\xec\xba\x21\xcf\x36\x8d\xd6\x67\xec\x3d\x34\x5c\xb7\xc1\xfe\x35\xaf\x77\xef\xc0\x83\x6a\x80\x20\x5e\xf3\x34\x80\x66\xed\x08\xb4\xe8\xc9\x68\x3e\x82\xcb\x4e\xc3\x7d\x38\x78\xc9\xb9\xdb\x92\x72\xd9\x7c\x6c\x12\x33\xb3\xab\xba\x0a\xff\x94\xca\xa5\xb6\xb6\x91\x6a\x0a\x4c\xa8\x0c\x86\xbf\x77\x58\x5e\x2e\xeb\x80\xa9\x1e\xe8\x5c\x23\x52\x65\x6b\xaa\xdb\x5b\xbd\xad\xe5\xa3\x6e\xe5\xda\xf6\x92\xaf\x2a\x5d\x34\x70\x17\x24\xf2\x79\x5b\x94\x9a\x6e\x29\xbc\xe4\x2b\x53\xe4\xc0\x3d\xdc\xbd\xb3\x76\x83\x3c\x78\x98\xbc\xd8\x25\xda\x00\xca\x86\xcf\x05\xe0\xc5\xad\xfd\xbc\x3f\x96\x7a\xd3\x9e\x25\xe4\x74\x0d\x92\x9d\x7b\xe9\x0e\x14\xa4\x70\x4b\x06\xd7\x55\xcc\x89\xbb\x21\xf2\xbf\x96\x2b\xa0\x1a\x4a\x42\x6c\xc9\xd7\xb3\x63\xdf\x8f\xb0\x07\xee\x83\xae\x80\x85\xa1\x43\x75\xec\x99\x97\xb1\xae\xae\xed\xa1\xe7\x25\x86\x0c\x6f\x02\xa2\xd9\xef\x89\xe0\x2e\xfb\x55\x23\x60\xc7\x3d\xd4\xad\xc6\xe4\xd8\x9e\x49\xc9\x42\x58\xba\xdd\xa6\xc6\x35\xe8\x49\xe7\xc4\x83\x46\x67\x41\xf4\x67\x59\x69\x9d\x1b\xfc\x5b\x84\x52\x7f\x27\x15\xfe\x95\xaa\xb8\xb1\xea\xb2\xae\x77\xc4\x97\xc2\x9f\x42\x8d\x85\x01\xc9\x30\x53\xb4\x7f\x83\x4c\xf3\x80\x43\x46\x9b\x54\xbe\x27\x47\x91\x08\x96\xd2\x6e\x0f\xf0\x17\xa2\x20\x70\x6f\xd0\x77\x7e\x06\x4e\x66\x55\x39\x48\x21\x6b\x38\xf6\x44\x1e\x54\x29\x70\xab\x35\xfa\x51\x35\x79\x89\x00\xeb\xae\xcb\xcd\x9e\x16\x86\x4d\x80\x70\xf0\xdc\xe0\x00\x41\xd8\x37\x05\x50\xe2\xd9\x03\x9e\xca\x5f\x41\xf1\x85\x78\x4d\xde\x3d\x1a\x45\xb5\x2e\xf6\x70\xa8\x6c\x37\x70\x4f\x61\xa2\x13\x4b\x13\x60\x0f\xc0\x12\x63\xae\x32\x26\x60\x46\xd7\xcc\xde\x90\x3a\xa6\x23\xc4\xc8\x8c\x67\xd7\xf2\x3a\xbb\x01\x66\xad\xf9\x6c\x79\x9a\x27\xdf\x8e\x1a\x67\x25\x10\x42\x0e\x62\xea\x08\xa9\x1d\x7c\x1c\x13\xac\x44\x57\x63\x95\xdb\xba\xb4\x3b\xc8\x28\x92\x1a\x3c\xbd\x21\xc0\xf2\x44\x18\x56\x44\x19\x15\x67\x7c\xd1\x9c\x25\xf2\x41\x97\xf5\x73\x82\x83\x75\xbd\x25\xd0\x2e\x77\x99\xc0\x95\x76\x18\x7a\xf7\xa0\x1b\x86\xa3\x62\x6a\x0c\x1e\x16\x3a\x23\x5c\xec\xc8\x30\x6e\x1e\xd7\xea\xec\x58\x1f\xce\xac\x9e\x2a\xcf\x6e\xd9\x4b\x41\xd7\xda\x19\xfb\xa3\xae\xdd\xe1\x26\x27\xe3\x11\x67\x89\x26\x88\x77\x2c\x3f\x86\x60\x00\x62\x3a\xc0\x70\xa9\x43\x49\xc1\xc5\x93\xbb\x8b\x28\x61\xb9\xdb\x11\x57\x44\x26\x09\xca\x29\x26\x1e\x20\x1d\x1e\x85\xa9\x99\x12\x04\xfb\xcd\x92\xf7\xc8\xa1\xcd\x33\x1c\x78\xa5\x00\xe9\xb9\xdf\xeb\x2a\x2f\xbe\x50\x8d\xef\xa6\xae\xda\xd7\xb4\x8b\xd9\xa1\x4d\x49\xc4\x6e\x98\x24\xe9\xec\x99\x74\x19\x40\x61\x05\x0d\xf4\xfd\xd7\x15\xbb\xde\xdc\x8c\x9b\x2d\x16\xd8\xe6\x5c\xbe\xde\x04\x92\xfb\x98\xff\xfb\x95\x01\xc4\x2c\xba\xd3\xf1\x80\x9d\x23\x18\x80\x2b\x2e\x60\x4f\xcd\x48\x50\xa0\x19\x37\x64\x45\x60\x6c\xda\xa6\x56\x9c\x6c\xb0\xfc\x05\x51\x87\x10\xe1\x28\xfc\xde\xf9\x42\x2a\xce\x6f\x00\xf1\xae\xac\xe8\x4d\xb8\x9a\x96\xeb\x22\x1c\x37\x04\x72\x29\x77\x49\xdb\x81\xec\x94\x15\xeb\xaa\x2d\xd6\x26\x91\xca\xdd\x77\x47\xe6\xa2\x75\x0e\x2f\xfd\x65\x5f\x2a\x82\x3b\x07\x2f\xa5\x23\xd8\xe2\xd1\xe4\xad\xb9\xa4\x9f\xa2\x91\xda\x0d\xbc\x2d\x4c\x5b\x37\xd6\x64\xeb\x45\x2e\x42\xef\xbf\x8f\xcc\x46\x53\x85\xfa\xc4\x06\xfd\xd2\x49\x70\x6f\x27\x72\xbf\x2d\xca\xda\xd4\xfb\xad\x6d\x3b\x91\xba\x85\xff\x01\x86\x6a\x5d\x16\x10\xbb\x96\x90\x36\x82\x19\x24\x56\xfe\xd1\xde\xde\x11\xf1\xc5\xd9\xa4\x7a\x52\x4d\xa1\xaa\xd6\x91\x25\x9e\x01\x4c\x72\xad\x1b\x40\xab\xf4\xf6\x22\x4b\x33\x88\xfe\x10\xec\x9a\xe9\x48\xf2\x44\x80\x3f\x01\x3f\x42\x9a\x53\xff\x0b\x0e\x11\x1c\x66\xa6\x18\x75\x0c\x6e\x05\x77\xf4\x80\x6b\x06\xeb\xd4\x0f\x97\x50\x80\x51\x00\xeb\x88\x5c\xe9\x2f\x6d\xa7\xfb\x66\x6b\x0d\xe4\xbd\x32\x86\x71\x66\x00\xe1\x75\x19\x6a\x65\x61\x80\x60\x54\x41\xb6\x4b\xd5\xbe\x86\x96\x04\xb4\x64\xe7\xf1\xbd\x5a\x7f\x7e\x1d\xb4\xfe\x07\xba\x2e\x83\xae\x8b\xc1\xae\x8f\xe5\xd9\xca\x0a\x84\xbd\x6a\x00\x98\x1f\xa6\x35\x75\x45\xd4\x70\x2e\x57\xe2\x63\x4d\x08\xd4\x56\x12\x53\x86\x68\x91\x88\x49\xc5\x57\xc6\x8d\x3c\x3c\x80\x53\x27\xe5\x84\x12\x2d\xf1\x3d\xe1\xb8\x33\x48\xee\x3f\x15\xfa\x19\x2b\x97\x48\xab\xc6\xe9\xdc\x9f\x4c\x40\x9a\xb7\x8d\xb2\xf7\xc6\xa6\x6e\x9e\xed\x1d\x4b\xa2\x05\xda\x2e\xd6\x48\x41\x60\xdf\xab\xb1\x5a\xff\xf9\x06\x30\xa5\xb0\x22\x56\x61\x82\x12\xa8\xf5\x46\xee\x8b\x2f\xba\x34\x23\x7e\x4f\xee\x55\x81\xb5\x6c\xac\x9a\x01\x62\x08\xde\xcc\x1b\xf5\x5c\x54\x8f\x66\x84\xa5\x86\x9e\x8b\x1c\xf0\x27\x6e\x64\xf4\x3b\x7d\x31\xf1\x05\xc9\x0a\x03\x91\x7e\xc5\xa4\x45\x45\xb5\x3f\xa0\x08\x43\xf2\x83\x86\x4e\x9c\xe4\x6a\x57\x0c\x01\x71\x72\x9b\x02\xac\x4a\xda\x2d\xad\x01\x0a\x2d\xf0\x3d\xdf\xb4\x7c\xa9\xe9\x54\x12\xa5\x0b\xe8\xaf\x98\xaf\xe6\x43\x13\xc1\x6e\x40\xf6\x89\x68\x31\x77\xaa\xf9\x7c\xd8\x7b\x97\x9d\x57\xff\xec\x52\x3e\x03\x52\x15\x92\x39\xd6\xf5\xa1\x51\x8f\x5a\x04\x15\x50\xc2\xdb\xc8\xaa\xcd\x76\x17\xd9\x91\x92\x76\x15\x7c\xd8\xf5\x90\xa7\xac\xaa\x5b\x11\xef\xd3\xc2\xee\x0b\x08\x72\x9d\xcd\xf7\xea\xf7\x83\xb6\xf7\x6d\x86\xf2\x97\x94\x2b\x3f\x15\x30\x37\x76\x4a\xc2\xc1\x91\xb9\xc6\x15\x0a\x51\xbc\x8e\x97\x57\x93\x09\x1b\x2d\x02\x47\x9b\xd8\x63\x57\x54\x9b\x9a\x66\x14\x1b\x4c\xe4\x54\xad\xf4\x6f\x9d\xbf\x2d\x3f\xdc\x02\x35\xc7\x6f\xb7\x53\x79\x30\x44\xeb\x4e\x29\xb5\x41\xd6\xc7\xf5\xea\x3a\xa1\x5d\xab\xac\x64\xcb\x5f\xaf\x6b\x40\xc6\x43\x74\x0a\xca\x04\xcb\x8f\xab\xdb\x69\xac\x83\x6f\x0f\x3b\x55\x75\xa2\x23\x38\x78\x37\x48\x1e\xcd\x5d\x6d\xda\x25\xa4\x0c\x24\xf2\xee\xfa\x06\x48\xeb\xf6\x76\xbb\x58\x29\xca\x0f\xe3\x4d\x87\xa7\xcb\x2e\x86\x08\xce\x16\x04\x66\x1f\x8e\xd1\x7b\xcf\x75\x93\x23\x12\xdc\x18\xe0\xe3\x0a\x47\x0b\x9a\x26\x97\x46\x12\xd7\xab\x6b\xd6\x37\xe8\x05\x44\xb5\xd4\xa5\x71\x8c\xdb\x74\xec\xc3\x73\xe3\x5d\x6c\x2c\x6a\xf0\x21\x2b\x59\x60\x3e\x28\x9b\x1c\x69\x80\xe1\xe4\xc5\x7d\x82\x6e\xd4\x87\xd6\xae\x89\x0f\x68\x56\x90\xcf\x0c\x52\x7a\x65\xaf\x0c\x79\xa7\x1e\x39\xaf\x36\xa1\xa2\x52\xa4\x5d\x4b\x34\x9f\x41\xa5\x84\x47\xf7\xea\xd1\xda\x2f\x46\x97\x9b\x44\xee\xcb\x03\x02\x52\x03\x2e\x80\x3d\x32\x8d\xd1\xb8\xb4\xce\xf1\x34\x6c\x81\x41\xba\xd4\x8f\xc5\x03\xb3\x01\xed\x54\xab\x9b\x02\x50\xd2\x01\x0c\x8b\xa0\x21\x86\x2a\xe3\x50\x0d\x99\xb8\x03\x18\xa1\x7d\xe6\x9c\x27\x5e\x40\x2a\xe7\x82\xe0\x57\x20\x00\x06\x93\xc3\xf7\x9b\x08\x30\x93\x81\x71\x4b\xc7\xb8\x52\x61\x25\x19\x2d\x77\xb5\x69\xa5\xcb\xeb\x10\xd8\x19\x0f\xdb\x43\xeb\xf4\x95\xc1\x0f\x24\xa1\x17\x74\xab\xe5\x83\x7e\x2c\xaa\x8a\xc8\x3c\xe1\x0f\x75\xce\x37\x09\x48\x5f\xb4\x2b\x2e\x53\xf9\x4b\xb6\x78\x3f\x5e\x4d\x6e\xe5\xd5\xfc\xee\xd3\x64\xf6\x41\xf8\xfa\xb9\x83\x11\xc2\xf0\x3a\x23\x05\x48\xe7\xc5\x61\x17\xe8\xbf\xde\x67\x20\xfa\x6e\x84\x6e\x45\xc9\x18\x03\xd0\x0e\xb0\x35\x20\x76\x46\x04\x09\x83\xae\x7c\x29\x5a\x23\xed\x09\xdb\x27\xea\x2c\xd2\x8f\xf3\x8e\x15\x51\xcd\xf6\xe0\x46\x38\xd6\x07\x6b\x3d\xc8\xaa\x76\x08\x1e\x86\x3e\xca\xe7\xad\x6a\x4d\xad\x9f\x74\xe3\x73\xc9\xc0\x39\x10\x02\x06\x3e\x75\x19\xbe\xd8\x39\x6f\x17\xda\x1c\x68\x6b\xd5\x0f\x68\xee\x49\x9f\x37\x4f\xc8\x24\x05\x6b\x68\xef\x9b\x43\xc3\xf6\xc4\x31\x58\x48\x12\x94\x08\xac\xfc\x1c\x67\xeb\x85\x95\x86\x19\x79\x89\x70\x4f\xb8\x55\x75\x65\x5c\xd9\x72\xfd\x05\x7c\x5f\x4c\xc2\x68\xdb\xf4\x9c\x49\x7e\xbd\x95\x2c\x55\xf3\xa8\x85\xae\xea\xc3\xe3\x96\xca\x87\xd9\xae\x84\xdd\xe0\x3a\xe9\x94\x6f\xcc\x69\x30\x3c\x6d\x41\xb6\xd8\xdb\xd4\x6f\x2f\x78\xa3\xd4\xa0\xf4\xe3\x22\x78\xfb\x11\x3c\x03\x41\x13\x94\x0a\xc3\x7c\x4d\x08\x2c\x15\xae\x94\xda\xba\x3c\x3a\x12\x05\x1a\x0b\x6c\xef\xb7\x29\xef\x6a\x39\x99\xc9\xbf\xdd\x8f\x67\xab\xc9\xea\x13\x14\x3b\xb4\x1d\xe7\x32\x6c\x2c\x6c\x62\xf4\xb7\xdb\x39\x38\x68\xcc\xe0\x87\x42\x8d\xaa\x92\x17\x6f\xde\xf8\x5d\x19\xd8\x3a\x9d\x0d\xea\xa4\x49\xa4\x30\xba\x49\xd3\x15\x54\x7b\x0f\xd6\x15\x0b\xab\x3e\x61\xf4\x04\xee\x83\xa6\x39\x26\x58\x5f\x8a\x54\x2b\x27\xc4\x28\x27\xc3\xe8\xb0\xf5\x77\x43\x5a\x2b\x51\xe3\xd9\x1f\xb0\x75\x9c\xc3\xae\x2a\xcb\x0f\x3e\xa8\xf5\x67\x7c\x2e\x95\xef\xeb\x76\x4b\x3d\x12\x7e\xa1\x07\xfa\xc3\x49\x70\x47\x3c\x42\x26\x36\x19\x69\x52\x8d\x76\xeb\xb3\x8a\x7b\x84\x13\x42\x9a\x2b\x76\xf7\x60\xc7\x07\x82\xd2\x81\x75\xec\xfd\xe2\x16\x08\x7f\xd3\xbf\x43\xa1\x88\x20\x03\xce\x76\xea\xa9\x00\x37\x61\x50\x37\x2e\x67\x0a\x31\x27\xf7\x6b\x46\x6c\xc2\x74\x5b\x81\x90\xe3\x7e\x4b\xc1\xb9\xed\x50\x42\x78\x50\x4c\xe8\x70\xf2\xef\x25\x61\xe2\x3f\xd4\x84\x64\x5f\xa8\xef\xa3\xe8\xee\x28\xd0\x35\x1c\xcf\x01\xce\x0a\xef\xf5\x84\x75\x80\x96\x08\xf4\x94\x89\x9c\xda\x47\x2a\x03\x86\x83\x21\xa0\xad\xc1\x0a\x9e\xad\xaf\x21\x9a\xc3\x6d\x82\x37\xb0\x13\xcc\x90\xba\x0a\xb8\xe9\x5a\x3e\xd5\xe5\x61\x57\x54\xf5\x01\xe4\xd1\xa6\x68\xdd\xc6\x02\xd1\x41\x2e\xbc\x3d\x21\x39\xb0\x26\x43\x5d\xc1\x34\x58\x03\x49\x9e\x2b\x23\x77\x80\xa7\x83\xb8\x6c\x90\x64\x38\xe2\x99\x55\x90\x8e\x2e\x82\x1d\xe7\x2b\xff\x41\x4f\xa1\x49\x7b\xd1\xe6\x7f\x57\x80\x15\x82\xdb\x3b\xed\x1d\xd0\x48\xc6\x49\x52\xb2\xbe\xe9\xb4\x0a\x7f\x5a\xfd\xa9\x2b\x28\x19\x8a\x8b\x61\xf7\x0c\xa9\x8e\x62\x7a\x44\xe2\x0b\xe1\x89\x2f\x7c\x17\x10\xd3\x05\xf2\x09\xfd\xac\x72\xf0\xa9\x40\xf1\x7c\x8d\xdc\x11\x05\xd2\x56\x60\x12\xd1\x6b\xca\x22\x96\x65\x4d\x1a\x79\xe0\x78\x52\x1e\x2f\xd8\xeb\x58\x67\xf4\x09\x84\x03\x00\x7d\x9c\xe7\xe8\x30\x80\xbd\x9e\x04\x75\x32\xd9\xbe\xa3\x4f\xbe\x46\xc5\x98\xdc\x69\x50\x32\x13\xfa\x87\x49\x16\xcf\x55\x59\x2b\x6b\xe6\xd5\xd5\x71\x87\xf5\xb4\x55\x0b\xb9\x67\x58\x44\x3f\x7c\xf9\x35\xab\xcf\xdc\xb4\xbd\xe9\xdb\x7a\x5d\x97\x26\xe5\x15\x65\x68\x56\x49\x4e\xd6\x3d\xc6\x87\xdc\xda\xb4\xf6\x4a\x0b\xf2\x55\xf7\xcd\xc1\x8a\x15\x69\x5a\xbd\x37\x00\x11\xac\x60\x7b\x82\x7e\x13\x25\x38\x03\xe7\x4f\xb4\x33\x8a\x4a\xfe\x7e\x50\x08\x65\x43\x10\x2c\x15\xda\x65\xad\x23\x98\x4d\x24\x10\x81\x00\x39\x95\x9b\x6a\xb7\x07\x9e\x8a\x82\x58\x35\xe1\x66\xc2\x9b\xc8\xad\xd3\xa1\x6a\x8b\x32\xe2\x88\x16\x47\xab\xc1\x21\x20\x19\x87\x6a\xc7\x55\xec\x74\xef\x6e\xad\xa2\x1d\x72\x1e\xb2\xe2\x32\x71\x39\xd0\x10\xaa\x47\x46\x1b\x34\x58\x7a\xb5\xe1\xc4\x52\x85\x56\x34\x19\xa1\xde\x2d\x6a\x8f\x10\xb9\x1b\x7e\x3f\x68\x74\x68\x3c\x1c\x40\xa1\x72\x02\x22\xf1\x0a\x0f\x6c\xb6\x35\x0e\xf0\x84\x5f\x4f\x40\x76\xf4\x03\x64\xa6\x74\xc1\x14\x40\x54\x0d\xdb\xa1\xab\x1f\xc0\xbc\x3f\x12\x86\x76\x67\x77\xf2\xd6\x6a\xb0\x22\xe0\xa4\x41\x6a\x4b\x28\x2b\x2c\x0f\xfb\x1c\x66\xb7\x53\x9d\x93\xfb\xe0\xea\x1b\xdf\xce\xaf\x27\x37\x93\xab\x31\xf9\xbe\x5f\x52\x58\x95\xec\xfa\x7c\x7b\x12\x23\x48\xd0\x72\x52\xd8\x8a\x6c\xe3\x2a\x98\x40\xa3\x6f\x59\xfd\x88\xf5\x57\xdb\x7f\x72\xea\x40\x1b\xdd\xcf\x09\x2e\xe9\xa1\xd7\x85\xd1\xe5\xb1\x0b\x7a\x65\x9f\x5f\xaf\x9b\x1b\x2c\xf9\x88\xa2\xb2\x2e\x35\xc7\xa1\xdc\x59\xc7\x2d\xea\xd3\xd3\xa3\xd3\x00\x45\x84\x43\x13\x9f\x46\xcd\x9f\x71\x81\x5d\xa8\xa1\x8b\x4a\xed\x1e\xd2\x10\xad\x8d\xa6\x9c\x74\x29\xb0\x7a\x35\x5f\x8d\xc1\x51\x45\xae\x31\x63\x45\x6c\x51\x3d\x3a\x62\xca\xee\x38\xde\x09\x31\x4e\xe5\xbd\x71\xf1\x31\x6f\xfb\xc8\x73\xe0\x6f\xaa\xa2\xeb\x14\x29\x7f\x47\x52\xd1\xfd\x8e\x85\x6c\xd7\x58\x9b\x1e\x59\x70\xba\x42\x0f\x4b\x64\x21\x4a\x85\x5c\x8c\xfb\x46\x3f\x15\xf6\x6e\x73\xf5\x74\xa9\x12\x2a\xde\x6b\xf6\x33\x02\x60\xed\xf2\x59\x03\x3a\xe6\x98\x60\x4a\xab\x09\x52\xae\x3f\x82\x97\xf6\xd8\x71\xa2\xbb\xef\x8e\x9c\x76\x21\x58\xac\x81\xde\x8a\xfd\xa6\x20\x51\xdc\x0d\x76\x45\x3b\x66\xbc\x8e\x82\xa4\x5a\x57\xf0\xdf\x9e\x1a\x13\x20\x26\x53\x21\xde\xa7\x72\x5a\x80\x90\xe9\x4c\x24\x28\x21\x74\x70\x13\xe0\xa9\x67\xb8\x6d\x40\x75\xc1\xf8\xe5\x1e\x53\x77\xc0\xca\x47\x23\x8c\x23\x15\x27\x16\xd6\x9e\xed\x47\xed\x30\x54\xc2\xc9\xc0\x8d\x3d\xef\x1c\x33\xe0\xe8\xd7\x29\xb9\x22\xcf\x83\x84\x33\xf7\xb4\x70\x83\x29\xa0\x2e\xb9\xbd\x96\x20\x4e\x07\xd7\xb9\xfd\xc0\x28\x15\xe2\x2a\x45\xda\xfc\x78\x42\xc0\xd4\x6e\x3b\x45\x52\xbb\x8a\x68\x7f\x34\xa2\xab\xb2\xa6\x4c\xd2\x76\x9d\xca\x3b\xd6\xe9\x48\xe7\xee\xdb\xa8\x03\xb2\x2a\x4b\xe5\x38\xcf\x89\x50\x04\x1c\x37\xaa\x3d\xc1\x45\x08\x62\xbe\x13\x1f\x62\x9d\x88\xca\x96\xd7\xce\x18\x8c\xbe\x9b\x0a\x71\x63\x4f\x28\xe8\x32\x49\x9c\x7f\xe7\xae\xa0\x21\x8b\xba\x6b\xaa\x3c\x02\x68\x4f\x04\xa1\xb5\x38\xed\xf3\x70\x42\xbe\x7d\x2d\xea\xe7\xfc\xe3\x40\x35\x61\xb6\xf5\x73\xc5\x7f\x19\xe7\xb9\xae\xf2\xc3\x0e\xe3\x80\xa9\x10\x1f\x82\x99\xe6\xd8\x4e\xa7\x9b\xce\x32\xb0\x47\xd5\x0c\x47\x13\xc0\x30\x73\x7a\x70\x68\xe0\x40\x75\x6c\xfe\xfc\x49\xb3\xcd\xad\xfc\x47\x37\xb3\x70\x3b\x55\x40\x52\x8e\x86\xe2\x71\x20\x15\x67\x12\x74\x1f\xd1\x1c\x94\x81\xc5\x89\x31\x67\x24\x51\xce\x28\x50\xd9\x3a\xef\x0d\x64\x5e\xe6\xb9\x63\x85\x13\x45\xab\x77\xa0\x6c\xc0\x05\xcb\x47\xcb\x99\x14\x89\xb4\x5a\x46\x22\x2b\xfd\xec\x0f\x7e\x0c\xb6\x38\x25\xf0\x15\x4f\x43\x4f\x8c\x80\x03\x00\xa5\x22\x78\x79\x5f\x18\x80\xe8\xcc\x61\xe2\x4a\x53\x57\xda\x75\xbb\xd7\xdb\xe1\x9e\xf6\xcd\xa3\xa0\x87\x76\x8e\x42\x41\x87\x95\xe9\xf0\x58\xc1\x1c\x05\x0c\x79\xed\x56\x8b\xde\xf6\x54\xa6\x43\xa4\xe1\x64\x32\x53\x67\xa4\x42\xfc\xa5\xb3\x72\x5d\x75\xdc\x97\x1b\x19\xdc\x41\x70\x86\xf1\xd4\x08\x62\x86\x83\x98\xc0\x57\xd5\x75\xca\x63\xff\xac\x81\xdd\x69\xe8\xcb\x46\xbc\xf0\xc5\xde\x25\x57\xb4\xf2\x59\x71\x2a\x36\x66\x35\x69\x97\xaf\x28\x88\x3c\x95\x9a\x72\x6b\xc9\xcb\xec\x8d\xe5\x7a\x67\x37\x61\xaf\x2f\xe4\x9b\xb5\x7f\xc3\x8b\xd8\x7e\x2b\x80\x45\xb8\x0b\xc0\x4a\x33\xbb\xe2\x86\x15\xc6\xd8\x6d\x48\xee\xdb\xba\xa1\xeb\x50\x9c\xba\x0e\x3d\xcf\x2a\x18\x98\x8c\x12\x18\xb8\x1a\xff\xea\x92\xde\xfa\x7b\x76\xbc\xfe\x5c\xd5\xcf\xa5\xce\x31\xcb\xc5\x60\x45\xf1\x6b\x9d\xb3\xac\x3d\x4b\x22\xa3\x5d\x50\x13\xaf\xa2\xd3\xb9\x8f\x04\x93\x3f\xdc\x7c\x23\x98\xc3\x83\xf1\x3c\x03\x2d\x5c\xc2\x1b\x01\x76\x60\x9f\x19\x46\xaa\x4e\x9f\xd8\x3d\x9f\xfb\x5e\xd1\x56\x6b\x5d\xfe\xf2\x74\xe0\x1e\x1a\x10\x7e\xbd\x3d\xe6\xe5\x16\x76\xbd\x68\x30\xfe\xa6\x2a\xff\x17\x0a\xde\xa6\x2e\x75\x1a\x35\x79\xc3\xc4\xe6\x41\x82\x23\x07\x0c\x02\x60\x96\xe7\x44\xf1\xf3\x42\x0d\x0a\x71\x9b\xca\x6b\x64\x5f\x1f\x5e\x9e\x0c\xb9\xfa\x70\x69\x52\xb9\x84\xa4\x3c\xf7\x5c\x90\x62\xc2\xf4\x6d\xe2\x84\x42\x92\x0a\x31\x4b\xe5\x75\x4d\x56\x0e\xa9\x61\xd5\x51\xea\x2f\x54\xd8\xca\xad\x99\xe9\x7c\x56\x22\x24\x81\x93\x63\x81\xc1\x2f\xf0\x3c\x55\xc7\xfe\x44\x7b\x8f\x4b\x4f\xe4\xb8\xcc\x30\x2b\x9d\x87\xe0\x18\x48\xde\x87\xa8\x8d\x35\x15\x82\x11\xbf\x1f\x54\x59\x6c\xc0\x9f\x32\x10\x62\x0f\xc0\x11\x56\x32\x3b\x27\x16\xa1\x4d\x1c\x46\xdb\x7b\x02\x9c\x03\x98\x0a\xdc\xa3\xad\x1d\x54\x0a\x81\x88\x8d\xed\x88\xcb\x82\x33\xda\xf7\x50\x59\xc5\x8f\xc6\x9c\x8a\x15\x71\x0b\x17\x56\x78\xe7\x79\xb4\x69\xd8\xf4\x2c\x41\x37\x1d\xbc\x90\x3b\x2b\xc6\x77\x51\xff\xe6\x25\x81\x45\x0d\x83\x9d\xf1\xd0\xb1\x01\x02\xd6\x43\xce\x99\x75\x7b\x2d\xf4\xf6\xa9\xaf\xed\xb5\xc0\x92\x2b\xda\x1e\xf2\x44\x40\x3a\x7a\xf0\xbc\x1d\xda\xd1\x73\xdc\x07\xeb\xfd\x70\x84\xe8\xaf\x95\xc4\x54\x90\xf6\xf5\xeb\x4d\x00\x40\x11\x70\x01\xb9\x46\xf6\x1a\x1c\x77\x4f\x85\x7e\x96\xcc\x8d\xeb\xc2\x3f\x2e\x96\x0b\x3a\xe3\x13\xd3\xe1\xc9\xba\x79\x54\x15\x17\xc4\x21\x55\x15\xaf\x53\x48\x9a\x05\xec\x5f\x98\x82\xa9\x5c\x30\xb3\x37\x2d\x84\x7d\xb0\x4f\x1d\xf6\xe8\xfc\x43\xac\x63\x8e\x81\xb3\xd0\x83\x0c\x7a\x13\xa9\x27\xfc\xa2\x70\x2f\x5e\xfe\x10\xbe\xd6\x71\x27\x27\x2e\x93\xb4\xca\xa5\xab\x1f\x6a\x88\x25\xdb\xe9\x64\x27\x4f\xb3\x9c\x57\xe5\x91\x8a\x6e\xb9\x0e\x77\xbb\x86\x0c\xc0\x20\x6b\x83\xef\x83\xdf\x9b\xb3\xf4\xd1\x13\xf6\x70\x44\xdc\x11\xfa\x55\xc2\x9a\xc3\x0e\x39\x8a\x95\x77\x6d\x63\x94\x63\x28\x27\xb1\xc5\x2d\x55\xd9\x68\x95\x1f\x83\xd4\x4f\x72\xaa\x72\x4c\x3f\x0c\x5e\x80\xd3\x93\xaf\xe8\xf2\x28\x5c\x3f\x8e\x58\xfe\xd3\xae\x6b\x50\xf9\xd8\x57\xad\xa5\x16\x28\xa5\x14\xbc\xe9\x0d\x38\x53\x21\x0a\x54\xc9\x07\xbd\x55\xe5\x06\xea\x8e\x85\xe5\x64\x50\x29\x82\x83\xf1\x33\x38\x7b\xf8\xc7\xa0\xb4\x86\xac\x4b\x98\x2e\x6b\x24\x02\x88\xa9\x58\x17\xad\x08\x14\x7d\x27\x47\x9c\x6e\xe1\xaf\x64\x84\xc8\xe4\x39\xf1\xc1\x51\x53\x14\xca\xc5\xbd\x78\x6e\x46\xb1\x6e\xe7\x28\xd0\x82\x59\xa4\x08\x69\x37\xb7\xd2\x5e\x77\x62\xd0\xe6\x80\x82\xf0\x3b\x02\x17\xa3\x9a\xc5\x9c\x47\x28\xb7\xa9\x94\x2f\xf1\x92\x1d\xc3\x63\xcb\x8c\xb3\x03\x97\x85\x94\xf2\x87\x54\x5e\xcd\x6f\xdf\x4f\x66\x93\xd9\x07\x79\x3d\xbf\xba\xbf\xcd\x66\xab\xc8\xa3\xb4\x7b\x28\xaa\x8e\xfe\x82\x60\x6a\x10\x40\x0c\x83\x7d\x11\x92\x94\x88\xae\x89\x14\xf0\x9c\xb2\x8c\xfa\x9e\x6a\xa1\x78\x5c\xb3\xf7\x83\x19\x2f\xa9\x84\xf3\x39\xb1\xfb\xda\xf1\x4e\x38\xba\x8c\x30\xad\x79\x58\x3f\xc0\x07\x44\xe4\x89\x70\x43\xb1\x0a\x03\xf7\x80\x15\x54\x02\x3c\x23\x55\xb5\x19\x68\x55\xb0\x70\xa4\x19\xcb\x11\x3e\x59\xa0\x02\xdf\x33\xaf\x56\xae\xc7\xfc\x64\xa5\x19\xe6\xc0\xb7\x9c\x3d\x88\x43\x86\x16\xf6\x69\x47\x05\xab\x04\x86\x9d\xd6\xaa\x1c\x1a\x2b\x89\x00\x3a\x01\x39\x5d\xe7\xd2\x14\xd5\x23\xe1\xa5\xbc\xcd\x23\x00\x40\x4c\xcd\x0e\x35\xe6\xe1\x79\xf6\x78\x82\x77\xc1\x1e\x33\xcf\xef\xca\x18\xa9\x44\x40\x64\xd6\xc7\xa8\xea\x0d\x06\x04\x00\xda\xca\x2b\x7e\xa8\x8a\xdf\x0f\x70\xe4\x55\x9e\x93\x95\x17\x88\x4b\x4c\x75\x13\x68\x3d\xd8\x4b\xd1\x24\x3d\xaf\x86\x5b\x3c\x42\xdb\xf3\xf1\x08\x1d\x4a\xee\x92\x2c\x36\xd2\xea\x9c\xc8\x4c\x06\x5c\x51\x8a\xfb\x80\xca\x5e\x2a\x6f\xb9\xdb\x30\x42\x95\xff\xfd\x60\xda\x10\xd4\x19\xdf\xb7\xbc\xf5\xbe\x7e\xef\x77\x6c\x78\xa7\x0f\xe3\x06\x00\x34\x36\x54\x36\xeb\xee\xe4\xc0\xdb\xc8\x27\x31\xd0\x21\xcd\x80\x5d\x4a\x5f\x14\x7c\x1f\x0f\x6d\x6f\x46\xf6\x80\xa9\x7a\xd2\xc2\xfd\xd9\xd9\x65\xe2\x2b\xdf\xee\xd9\x17\x9e\xb0\xaa\xf7\xb4\x88\xec\x8e\x80\x19\x95\x0a\x14\x01\x8a\xb5\xff\x89\x50\x6f\x49\xcf\x40\x74\xfd\x68\x45\xd7\x74\x9a\x51\x2d\xdb\xf9\xcd\x90\xfc\xa2\x84\x94\x75\x0d\xdc\xd0\x14\x57\x0a\xca\xbc\xf6\xa2\x92\xa7\xc4\xda\x00\x5c\x31\xe9\xd6\x6d\x0a\x79\x19\x3a\xd9\x37\x41\x26\x42\xb8\x3a\xfe\x3b\xfd\x83\xe9\xd0\x66\x5d\xd6\x66\x3f\x98\x21\xb1\x18\x40\x10\x9a\x43\x39\xd0\x05\x2b\x60\xbb\xf1\x54\x77\x40\x3b\xa9\x1e\x86\x49\x03\x7a\xc1\x56\x9e\x60\xfd\x05\x59\x11\x5c\xd7\x5d\x96\x08\xdc\xa4\xc8\x30\x12\x75\xb9\x13\x9f\x28\x5a\xe1\xa7\x2d\xa8\xd8\x15\xce\xb3\x53\x53\x51\xee\x53\xd9\xfa\x21\xd9\x88\x18\xf2\x16\xe9\x3b\x80\x38\x31\x97\x79\xec\x26\xe7\xf9\x89\x57\xa5\x3f\x48\xe1\xd1\xc1\x43\xd3\x85\x00\xf2\x28\x30\xf3\xa7\x54\x8e\x3f\x7c\x58\x64\x1f\x30\x87\x12\x78\x36\x27\xb3\xeb\xec\x2e\x9b\x5d\x67\xb3\x15\x10\x70\x2e\x05\x54\xb0\xdb\xed\x8b\x52\x0d\xf9\xd4\xe1\x0e\x67\x92\x76\xd0\x6b\x4d\x78\xdf\x1a\xbd\x57\x0d\x70\x71\x81\xed\x9a\x6b\x6b\x42\xd9\x5b\xde\xaf\x18\x23\xb3\x12\x0a\xc7\xda\xfb\x10\x83\xdd\x9a\xf5\xe2\xba\x01\x6d\x32\xa6\xb9\x66\x18\x93\xc8\x6b\x4d\x99\x60\x56\xbf\x7b\xde\xd6\xb0\x21\x0f\x15\xfd\xe1\x6b\xe1\xa4\x60\x53\x56\x75\x34\xd4\x80\xdf\xd6\x20\x21\x3a\x21\x09\x49\xea\xf1\x83\xce\x06\x0e\xfe\x26\x3c\xc2\x52\x55\xf2\x4c\x3d\x3e\xda\xe5\x69\xf5\x19\x43\x97\x82\xe5\xf4\x03\xf0\xe5\x40\xb5\x9b\xc0\x72\xf3\x9a\x6e\x58\x92\xbc\x06\xe3\x48\xf8\x31\xbe\x23\xe3\x11\xd9\x39\xa4\x32\xfd\x8e\x8e\x9f\x31\xdd\xc1\xab\x50\xaf\x11\x30\x10\xec\x23\x08\xb2\xa4\x06\xd2\xaa\xba\x0e\xf3\x49\x50\x30\x12\xb5\xfb\x80\xa8\x49\xfa\x88\x9c\x7c\x0b\xc0\x65\x4f\x51\xd9\x52\x28\xca\x8b\x9d\x5e\xa4\x4c\x57\x43\x69\x00\x3e\xa6\x60\x2f\x83\xdf\x0f\x50\xb8\x97\x7b\x66\xc5\xaf\x55\x0b\x78\xae\x93\xae\xd7\x38\xf4\x2c\x93\xa6\x41\x7a\x46\x1d\xa3\x78\xcc\xa1\x69\xea\x43\x95\x0b\xaa\x1b\xdd\x51\x26\x49\xb0\xb9\x0f\xa5\x72\xee\x18\xdf\x61\x3a\x11\x78\x83\x68\x44\xd7\xb4\x50\xd0\x26\xbc\x8a\xbb\xd4\x37\x00\xe7\xf1\xcf\xa9\x5c\x2d\xc6\xb3\xe5\x14\xce\xa3\x40\x2c\x71\xe9\x80\xdf\xde\x7f\x13\x64\xc6\x85\x31\x88\x44\x9a\xda\x19\x11\x21\x06\xd0\xb7\x63\x7a\xbe\xdb\x81\x68\x80\x53\x71\x53\xb9\xd0\x5c\xc3\x63\x40\x85\xc4\x8d\x17\x34\xee\xe1\x53\xc4\x1d\x2b\x07\x2c\x95\xa2\xe9\x65\x29\x99\x44\x84\xf6\x0f\x6b\xca\x51\xd3\xb6\x5f\x81\xff\x63\x58\x77\xe1\xa8\x27\x13\xd6\x39\x6d\xc2\x39\x5c\x9d\xdf\xa4\xdf\x80\x77\xa7\x7a\xa4\x49\xd0\x05\xd1\xbd\x98\xfa\x61\x65\x80\x5a\xb9\xde\x87\xdf\xcf\xaa\x47\x00\xc6\x50\x3f\xba\x6d\x81\x33\x14\xaa\x50\x82\xc4\xcb\x0b\xd3\x67\xfc\x6c\xb7\xd1\x8c\x30\xd4\x57\x9c\xfa\x46\x5f\x0d\x7f\xa9\x47\x00\xa5\x10\xc4\x15\x86\xdb\xf1\xa7\x54\xae\xb2\xc5\xed\x64\x46\xdb\x31\x04\x4a\x22\x90\x06\xb3\x52\xc3\xea\x43\x49\x07\xfa\x13\x6d\x35\xcd\x9c\xd9\x22\x22\xe9\xc4\x49\x04\xba\xfe\x7e\x8a\x05\x24\x92\xa1\x28\x24\x32\x51\x4e\x9c\x75\x9f\x17\xfe\xf3\x2f\x7d\xbd\x30\xf2\xa9\x2e\xc8\x42\x02\xe0\x48\xc4\x0f\xe9\x79\x23\x11\xc3\x71\xb2\x80\xb1\x87\x6c\xb2\xf3\x08\x58\x14\x20\x9d\x13\xb9\x34\x1c\x32\x11\xe8\x92\xa9\x2a\x08\xee\xff\x63\xc0\x55\x1e\xd1\x93\x13\xd1\x03\xb4\x82\x87\x84\x8b\xea\xfa\x8e\xe5\xc2\xd4\x0e\xba\x86\xdc\x60\xd4\x01\x82\xc0\x14\x15\x86\xda\x7c\x41\x5a\xca\x46\x7c\x93\xca\x9b\xfb\xd5\xfd\x22\x93\x8b\xec\x97\xc9\x92\x15\xd0\xd5\xc7\xc9\x52\x12\x69\x02\xda\x78\xa7\x32\xc2\xa5\x83\x6e\x9a\xad\xac\x34\xe4\x00\x3e\x15\x26\x30\x79\x59\x08\x7f\x98\xdd\x8b\xd3\xf9\xe9\x24\x05\x8a\x1d\xde\x01\xc5\x4e\xd3\xe5\x59\xe9\x67\xdf\x14\x4c\xc7\x83\x96\xa6\xd8\x15\xa5\x02\x82\x31\xb3\x2f\x9a\xc2\xd9\x35\x0c\x3b\x7c\xe2\xc8\xb6\x15\x1f\x41\x65\xce\xa2\x92\x39\x20\x6f\xc0\xd9\x40\x35\x79\x2a\x0d\x95\xe4\x1f\x4a\x0d\x99\x28\xcc\xe0\x06\x3e\x74\x1d\x56\xe0\x7d\xac\x0e\x69\xdd\x3c\x7e\xc7\x29\xbd\xdf\xa5\x42\x64\x56\xdb\xec\xc0\x5c\x82\xfc\x56\x74\xfd\x2b\x72\x7c\x3e\x1e\xa8\x24\x10\xbf\xc0\xf6\xda\xa4\x93\xd5\xc7\x65\x92\xe9\xda\x51\xb8\xa0\xeb\x43\xa9\x1a\x7a\xa7\x0b\xae\x09\x36\xcd\x59\xdd\x08\x44\xf2\xd8\x3b\xf0\x89\x13\x24\x03\x3c\xb5\x35\x49\x8f\x5c\x1b\x00\x4e\xff\x9e\x75\xb8\xb8\xd2\x10\x16\x3a\x89\x89\x63\x19\x76\xe7\xcc\x52\x57\xd2\xd9\x75\x08\x7e\xec\x75\x01\xbd\xe3\xce\x2f\xea\xe3\x4d\xe7\x4e\x49\x83\x4a\xe8\x23\xf6\x9e\x9d\xda\x74\xfd\xf9\x72\x9a\x12\x76\xe6\x68\x35\xc5\x68\x8a\xfb\x42\x8f\x2f\x95\xf5\xb6\xae\x0d\x22\xfc\xf9\x15\xc4\xd0\xfc\xe3\xdd\x13\xe3\xeb\xeb\x6c\x76\x7d\x7f\xfb\xce\x8a\x04\xef\xff\xea\x18\x2f\x20\x4e\x9c\xbe\x2b\xc4\x6a\xe0\x39\xc8\xfb\x72\xa6\x88\x5b\x33\x62\x1f\x48\x82\x1b\x29\x08\x4b\x8a\xd8\x4a\xf3\xef\xa3\x47\x8f\x80\xa0\x6e\xa1\xfd\xad\x8b\x3e\xa2\xd0\xc4\x37\xe2\xef\xa0\xb2\x38\x04\x82\xcf\x82\x78\x17\x51\x47\xac\x47\xf2\x53\x36\x5e\xc8\x4f\xf3\xfb\x85\x9c\x8d\x6f\xb3\x54\xc6\xc4\x65\x1d\xc6\xb2\x24\x06\xd0\xe5\xdf\xd5\x8d\x70\x15\xd1\x0a\x6f\x51\x9e\xaa\x7c\xfc\x32\xdd\x45\x12\xd2\x5d\x30\x5b\x4d\xbc\x19\xfd\xfa\x7e\x65\x39\x7f\xf6\x15\x0a\x07\x94\x0b\xd4\x9e\xa7\x93\xe5\x4a\xae\x3e\x66\x93\x85\x5c\x4d\x56\xd3\x6c\x19\xe0\xc1\xfa\x30\x6e\xff\x0e\x5f\x3a\xf4\x68\x0f\xc7\xed\x9f\x74\xb9\x5b\xb4\xc4\x01\xb7\x5c\xd7\xae\xee\xbb\x42\x5e\x9e\xac\x33\x8f\xd3\x85\xcd\x55\xd5\x83\x89\x9d\x76\xcf\x69\x79\x06\x9d\x1d\x7c\xe4\x8c\x0b\x5f\x03\xe6\x0e\x33\x3a\x10\xab\x05\x70\x63\x2c\xdc\xc4\x81\x28\xd9\xf9\x62\x37\x1e\xc0\x1f\x14\x67\x43\x3f\x9e\x85\x35\xb6\xcf\x7a\x3f\x07\xf3\x16\xba\x7f\x36\x03\x59\x9f\x6e\xec\xfe\x28\x86\x11\xa4\xaa\x6d\x8a\x27\xab\xb0\xea\x20\x07\x8e\xd9\x11\xd6\x75\xae\x13\xf9\x1c\x30\x06\x08\x74\xb3\x90\xf8\x34\xda\xbf\x86\x79\xca\xd6\xf0\xe3\x22\x3d\xc7\xb8\x76\x7e\xcc\xd0\xc0\x6a\x93\x40\xc7\x83\x71\x7b\xfe\x14\xe3\x84\x2f\x76\x87\x5a\xc2\x01\x8f\x7f\xd4\xea\xbf\x48\xf9\xfe\x1b\xff\x8b\xf9\x9f\xee\xa6\xaf\x2f\xfe\xf7\x97\x82\xfe\x4a\xfd\xe7\x3f\xfd\x78\xd1\xe5\x7f\xfa\xfe\x4f\x6f\xff\xc5\xff\xf7\x4f\xf9\x07\xc2\x21\x9b\x65\x8b\xf1\x54\xde\xdd\xbf\x9f\x4e\xae\xbc\x06\xef\x2e\xc3\x44\xde\xe8\x87\xe6\xa0\x9a\xa3\xbc\xf8\xe9\xcf\x3f\x75\xc9\x9f\xec\xdf\xfe\xbb\x91\x3f\xdd\x35\x5a\xed\x1e\x4a\x8d\x76\x0c\x5f\x9b\xce\x8c\x36\xe8\x2c\x31\xad\x97\xbd\xd6\x4a\x52\x15\xa8\xca\x0d\x78\xdd\x3e\x6b\xbd\x07\x6e\x3f\x43\xa1\x1d\xb1\xd3\xcd\x9a\xae\x62\x2c\x09\x45\x6f\xa4\xf2\x3d\x33\xec\x9a\x36\x91\x56\xc2\x0f\x0b\x6c\xbc\xb7\xb1\x22\x9d\x68\x6b\xf9\x78\x50\xa0\x1f\x69\xbc\x16\x02\x2e\x28\x20\xd5\x45\xd4\x08\xe5\xf9\x85\x22\xfd\xf5\x6b\x66\xab\x32\x87\x86\xa8\xd5\x79\x1c\x05\x51\xfc\x6c\xc8\x35\x52\x58\xb3\xd5\x40\xa6\xba\x9d\x8a\x13\x1d\x23\x33\x81\x3d\x25\xa7\x76\xc3\xab\x0e\x25\x21\x57\x0a\x07\xd3\x80\x2f\x48\x64\x1c\x60\xc0\xb0\xbd\x23\xd1\x54\xc3\x64\x93\xa2\x45\xcf\xca\x5a\x55\x21\x9b\x11\x4c\x00\x33\x03\xd8\x8b\xad\x4e\x85\xf8\x75\xab\x2b\x7b\xd3\x9a\xbd\x56\x9f\x7b\xd7\x25\x5c\xc2\x98\x17\xba\xd1\x4d\x83\x39\xd1\x3c\x89\x89\x44\x8a\x45\x40\xa5\x2c\x99\x35\xa1\x2c\x8f\xc8\xf8\x7e\x7a\x7d\xc2\x24\x7c\x37\xc5\xde\xa9\xe3\x8c\x27\xfa\x8e\xe0\x0c\x09\xf5\xac\x8e\x58\xd9\xb4\x0c\xe3\x27\x9d\x1e\x07\x39\x07\xe0\x1b\x08\xf9\x15\xa1\x9a\x92\xaa\x80\x5d\xcb\xee\x69\x54\x95\x9e\x15\x60\xee\xc2\x74\x0f\x55\xf1\xae\x88\x56\x9e\x2a\x1c\xee\x0b\xbd\xc6\x52\xad\xc0\xc6\x49\x28\x26\x4f\xef\x64\x7e\x8e\xd3\x65\x3f\x57\xf5\xb3\x6b\x97\xb3\x02\x24\x66\x05\xa4\x60\x9f\xec\x9b\xba\xd5\x6b\xc2\x21\xb1\x03\xe3\x19\xf3\xb3\xdd\x34\x31\x0b\x33\x56\x47\xb6\x8d\x6f\xea\xe6\xa1\xc8\xb9\x18\x64\x5b\x8b\x5c\x57\x08\x88\xc0\x4f\x90\x4f\x85\x31\x00\x9f\xf1\xa7\x1a\xdc\xad\xda\xe9\xff\x5c\x62\x0d\x91\x45\xe1\x57\x84\x23\xdf\x01\x81\x42\x04\x21\x0e\x1e\x5f\x94\x88\x97\xa7\xdd\xc5\xf3\x39\x54\x2e\x28\x3a\x41\x8c\x6c\x04\x53\x11\x6d\x93\xa2\x4d\x85\xe8\x72\xd2\x9c\x6a\x4c\x2a\x8e\x1b\xd1\x84\xfb\xc2\x97\x8f\x8d\x6a\x0b\x23\x98\x8d\x42\x6e\xb4\x0e\x62\xa4\x9c\x68\x13\x96\x0e\x62\xa0\x20\xd3\xac\x86\xdb\x10\xce\x91\xf0\xd5\x8b\xc2\xf4\x28\x0d\x39\x53\x75\xe2\xf6\x59\xb0\xb7\x70\xb0\x6e\xdb\xa5\x72\xcc\x09\xb9\x90\xc2\xa5\xf1\x93\xec\x9d\xa5\xf9\x07\x92\xb2\x81\x8d\x40\x66\xcc\x73\x8d\x39\x5e\xef\xe4\xf9\xc5\x28\xb0\x2d\xe3\x89\xb5\xfb\xee\xfc\x72\x24\xb0\xec\x2c\xee\x84\x90\xb2\x1a\xcc\x06\x84\x87\xda\x1f\x91\xb8\xbd\x53\xbe\xa8\x63\x45\x0a\x42\x5e\x06\x75\xb5\x43\x6e\xd3\xd2\xd4\xc8\x49\x00\xf1\x41\x94\x49\xaf\x0c\x0f\x84\x1d\xa7\xf5\xa1\xc1\x1d\x0d\x87\x8d\x77\x34\xef\x28\x70\x60\x38\xfa\x3e\x4f\xe8\xea\x29\x62\x1c\xe2\xfa\x99\x2b\x2a\x3a\x06\xd7\x58\x15\x67\x48\x52\x28\xad\x1d\x5c\x84\x58\x18\x00\xc1\x54\x52\x39\x9f\xbd\x32\x88\x05\xf6\xdd\x2b\x20\xae\xcb\x3b\xc4\xca\x1f\x38\xc1\x88\xe8\xe5\xd5\x47\x39\x45\xd7\x62\xe8\xe9\x85\xa8\x00\x17\x29\x95\xce\x01\x56\x54\x2d\xa7\xd6\x3b\x0e\x3e\xef\x87\x6c\xf4\xa6\x04\x42\xa3\x6a\x08\xb7\x60\x5e\xc9\x46\xef\x0f\x2d\x71\xee\x12\xd3\x22\x26\x4c\x0d\x16\x21\xe2\xa4\xf5\x23\x14\x90\x78\x31\xef\x89\xa8\x21\x52\x21\x4e\x6b\x3a\xe0\x97\x5e\x02\xa7\xda\xd5\x7c\x76\x8d\x94\x6a\x50\x7b\x90\xb2\xc7\x13\x79\x3d\x59\xae\x16\x93\xf7\xf7\xe0\xba\xb6\x0f\x86\x29\x68\x42\xbc\xe9\xd4\x7b\x18\x3b\x77\x7b\x87\x8a\x8d\xaf\xb8\x98\x8b\x0d\xf7\x2d\xdb\x8f\xa2\x43\xc6\xd6\xa3\x0f\xee\x93\xb1\x51\xf4\xa9\x47\xc6\x26\x7a\x69\x19\x27\x2e\x2e\xe2\x66\xbb\xc3\xee\x0d\x50\xb3\x09\x47\xcd\x16\x0c\xe1\xd9\x95\x2e\x57\xf2\x0c\x46\xc2\xc8\x73\xe8\x30\xb7\x46\x14\x17\xbe\x4e\xb8\xb8\xf3\x6d\x9c\xa2\x5a\x0b\x1f\x39\xc1\xb4\xc6\xea\x9e\x18\x64\x58\x4b\x25\x38\x59\x99\x1b\xee\x24\x2d\xdc\x85\x0f\xd4\x7c\xb3\x4e\xe9\xba\xf7\x2a\x22\x38\x16\xca\x44\x77\x33\x62\x78\x22\x92\x8c\x7e\x94\x67\x5d\x57\x66\x5f\xac\x0f\x94\x5d\x5b\xe5\x61\xba\x50\x79\x14\x2e\x09\xba\x0a\x8a\xee\x7f\x2d\xa9\x88\x06\x11\x94\x60\x65\xc9\xf2\xb3\x00\xbd\xb4\xc0\x8c\x4f\xbe\x1e\x38\x8b\x09\x7a\x05\x8b\x8e\xbe\xf1\x93\x1b\x06\xc9\x0f\x50\xd9\x53\x0f\x46\x13\x2f\x09\x32\x77\xd3\x97\xa0\x17\xa8\xdb\x38\x1d\x2f\xb8\x9a\xe2\x99\x14\x1d\x44\xc3\xa9\xcf\x42\xc0\xc2\xb9\xbe\xe8\xe5\x60\x09\x21\x2f\x59\xc0\xd5\xe8\x82\xeb\xfb\xed\xd1\x00\x44\x0c\x0a\x58\x6c\x3c\x23\x34\xa7\x57\xef\x8f\xa9\x10\x97\xbe\x15\xba\x0c\x08\xd1\xb6\x3f\x4a\x47\x92\xd1\xe9\x35\xef\xe0\x78\x83\x92\xeb\xbb\xbf\x99\x90\xdb\x30\xca\xf3\x1a\x70\x54\xde\x31\x85\xb5\xbc\x10\x27\x73\x4e\x21\x38\x88\xda\x96\x77\xca\xbe\x13\x42\x8d\x82\x42\x1f\xee\x6a\xd8\x14\x04\xd4\xc6\x82\xc1\x9e\x2c\x81\x17\xde\xe7\xec\xf0\xb6\x04\x05\x11\x09\x2e\xf0\x6d\x26\x03\x82\xfa\x64\xbe\x3e\x67\xf5\xa8\x61\xa5\x85\x78\x08\x3f\x8d\x21\x69\xde\x12\x8e\x71\xb2\xa3\xf4\x78\xc4\x1a\xe9\xa7\x50\x06\xab\x2e\x41\x97\x65\x92\x3e\xe7\x58\x1b\x9a\x78\xfb\x40\x8b\xf5\x71\x92\x13\x9c\xee\x22\x9a\xf1\x84\xc8\xd9\x1d\x1f\x7d\x94\xd0\x4e\x05\xb1\xdb\x6d\xd1\xe4\x2e\x1e\x76\xaa\x1c\xf0\x89\x3d\x7a\x4e\x91\x49\x37\x60\x1f\x30\x70\xb5\xff\x85\xbb\xe9\x03\x55\x02\xa8\x4c\x7d\x50\x3a\xea\x44\xd2\x01\xf2\x8f\x52\x21\xd6\x23\x0a\x69\xf8\x85\x66\xe9\x5c\xd5\xcd\x0e\xe2\x90\x8d\x56\x39\x1a\x51\xa0\x71\x40\x65\x12\x05\xd4\xc1\xe5\x11\xf2\xe9\x65\x73\xa8\x28\x5b\x00\x80\x76\x0a\x8d\x2a\x4c\xb6\xb7\xfb\xa2\xb1\xd7\x49\x73\x40\x3a\x21\x57\xb8\x24\x68\x88\xbd\x86\xa0\x98\x00\x5d\x96\x69\x05\x5e\xc4\xa6\x95\x07\x73\x50\x50\x76\x05\xbd\x8d\x4d\x51\x31\x2b\x19\xf0\xb5\x58\x49\x56\x55\xf5\xa1\x5a\x6b\x22\x15\x72\x05\xee\x22\x19\x27\x06\x65\x9c\x8a\x68\xf7\x06\x35\xa9\x73\x82\x3b\x26\x9e\x2e\x48\xb5\x30\x5e\x4e\x41\x57\xee\xe1\x91\xb7\x6c\xd0\x70\x47\xfc\x74\x27\x06\xcc\x73\xec\xae\xd8\x0e\x81\x07\xb4\xa1\x7d\xf6\x36\xf0\xfb\x6f\x31\xa4\x03\xa8\xff\x61\x51\x27\x3a\x57\xb2\x10\xf9\xa8\x23\xd7\xe4\x1f\x96\x6b\x31\x5b\x4e\x27\x17\x04\xd5\xe8\xa1\x9d\xd8\x65\x08\x82\xef\xa6\x42\xdc\x42\xb6\x34\xe1\x4c\x38\xd5\x80\x28\x4b\x03\x3c\x16\xa9\x35\x1d\x29\x0d\x4b\x11\xa3\xbb\x46\xe2\x0f\xe2\xb3\x7c\xcc\xee\xa1\xe1\xf9\xf5\x9a\x54\x80\xb4\x0e\x4a\xc5\x69\x56\x23\x53\x21\xde\xbe\x7c\xdb\x77\x7b\x1b\xa8\x1e\x4d\x08\x61\x82\xf2\x35\xcc\x58\xe4\xe5\xf5\xe5\x08\x50\x67\xc8\xde\xc9\x25\x0f\xf4\x17\xbd\x3e\x78\xf6\xbb\x01\x89\x2f\x5c\x0b\x46\x5e\x40\x97\x2e\x09\x0e\x7e\x5a\xee\x53\xd2\xc3\x80\xf8\x57\x6b\x74\x2c\x1d\x21\x1d\x90\xd7\xc0\x71\x88\xac\xeb\x06\x4d\x5c\x38\x64\x3d\xee\x93\x40\x9d\x49\x04\x91\x63\x07\x69\x38\x2f\x70\xfd\x9e\x1a\xc4\xcf\xb2\x6e\x12\xb8\x1d\xfa\x3d\x53\xae\x36\x10\xec\xc5\x44\x3e\xa9\xb2\x20\xbe\x66\x9f\xf4\x6a\x4d\x20\xc8\x27\x74\x7c\x12\x48\xad\xe6\xe4\xe3\x11\xcd\x24\x16\xbc\xb8\x63\x2b\x7b\xc7\xa9\x92\x8f\x8e\x47\xda\x21\x5c\x39\xdc\x5c\x23\x11\x90\xac\x0c\xf2\x6a\x7a\xd0\x72\x38\x7b\xe1\x64\xd1\xb5\x12\x4c\x52\x0f\xf7\xff\xf5\x49\x5a\x9f\x5a\x3e\x2c\xd5\x8f\x67\x2e\x50\x31\x41\x93\x05\x0a\x07\xdd\xe8\x7e\x07\x45\x58\x7d\x83\x8c\x04\x2c\x3a\xac\xf3\x54\x9e\x83\xcd\x02\xc9\x81\x15\x6e\x6b\xf8\x4f\x70\x81\x22\x16\x7f\xd3\xe5\x6f\x13\x3d\x63\x0b\x8b\x5f\x6e\xe2\x4e\x85\x52\xf2\xa5\x03\x01\x54\x99\xa0\xd3\xe9\x74\x24\xc4\x32\xe8\xad\xcf\x35\x0d\x18\xf2\xf6\xe8\xa9\x43\x7c\xcf\x2e\x24\xc2\x23\x46\xf3\xcf\x48\xfc\x13\x5c\xf7\x02\x80\x0b\x48\xd9\xa7\xaa\xe8\x30\x16\x25\xd5\xf1\x86\x65\x8f\xa6\x0a\x29\x56\x39\xb5\x33\xd0\xf0\xd9\x2b\xba\xab\x73\x80\x17\x07\x99\x63\x90\x75\x83\x54\x0c\x0e\xb0\x86\x1b\x12\x33\x88\x5b\xf4\x77\x59\xd9\xc5\xc5\x4e\x4c\x67\xc0\xdc\x2a\x9e\x3b\xa8\x02\xc3\x9c\x3a\x65\xf1\xd0\xa8\xc6\x63\x3b\xdc\x2e\x41\x20\x86\x6e\x40\x7f\x13\xe6\x68\x5a\xbd\x93\x75\x15\x30\xfe\x74\xc6\x6c\xef\x72\xe4\x10\xde\x20\x75\x11\x7e\x60\x0b\x04\xa0\xa4\xeb\xd5\x8d\xf0\xf9\x64\x86\xd5\xc7\xee\x87\x55\xeb\xbf\x2c\xf1\xcb\xa9\x10\xdf\xc7\x24\x78\xa7\xb1\x5d\xb1\x1e\xc8\x97\x57\x64\x14\x38\x8c\x97\x1c\xc0\x78\x05\xc8\xa7\x53\x56\xed\x38\xa8\x1a\x5d\x7b\x50\x65\xfd\x9f\xeb\xd5\x37\x63\xbf\x22\x47\x57\x40\xa2\x70\xd7\xd1\x20\xfe\x31\x38\x98\xac\x3b\x6d\x0b\xfe\x61\x08\x1c\x76\x42\x59\x7d\x09\x2b\x26\x3c\x56\x4c\xfe\x23\x58\xb1\x1f\x28\xb0\xd1\x73\xd4\x20\xc3\xa1\xaf\x42\xd1\xbb\x76\xd9\x66\x60\x7f\x82\x08\x9e\x18\x11\x0e\x1e\x8b\x5a\xe3\x14\x0f\x14\xb5\x66\xa7\x20\x17\x0b\x4f\xb8\xbc\xb5\x38\x59\xdb\x5a\x88\x1f\xc9\x6b\xe0\xf8\x9a\x7a\xca\xdf\x8b\xdd\x0c\x9f\x18\x61\xa0\xc0\x19\xbc\x9d\x3d\x42\x8b\x19\xd0\xd7\xfb\xe4\x3b\xe7\x1f\x2b\xa9\xc0\xa0\x18\x82\xbf\xc4\x4e\x4b\xee\x57\x5c\xea\xf6\x84\x03\x2d\x8d\xd0\x97\x05\x10\x2e\xc3\x68\x98\x74\x32\x72\xc6\xd3\xb8\xbc\xe9\xfe\xca\xd7\xb9\x1e\xae\xe0\xed\x72\xd6\xff\x84\x8e\xa5\x6f\xc2\x01\x32\x04\x90\x1c\xb2\x11\x84\x8f\x3e\x73\x62\x0f\xff\x7f\x11\x05\xd8\xc1\xf8\xfd\x51\x50\x9f\x5f\x4f\xc6\xf4\x89\x61\x70\x9a\xee\x78\xbf\x23\xbc\x1e\x2c\xfb\x59\x1f\xd5\x87\xf6\xde\xb7\xe1\xf8\xba\xbe\xd7\x0e\x8e\xcf\x41\x90\x4f\xa0\xf7\xbe\x19\x30\xe5\xe0\x79\x3c\xf2\x6f\x44\xe7\x79\xd4\x4b\xd7\xd6\x56\xd5\x51\x9c\x00\xe7\x7d\x15\x8b\x27\xfe\xec\xb0\x46\xcf\x76\x73\x42\x51\xcf\x75\xdd\xec\x6b\xc8\x3f\xb1\xd2\xaf\xe7\x0b\x82\xe4\x1b\x34\x46\xa2\x78\x99\x40\xb6\xee\x48\x75\x0a\x26\x14\x08\xf3\x39\x89\x90\x01\x53\xec\x5a\xc3\xc4\x3e\x8a\x6f\x6d\xea\x26\xc8\x90\x45\x9d\xc6\x45\x02\x5c\xf1\x18\x67\x28\x7f\x7d\x9c\x89\x88\xbe\x76\x12\xcb\x06\x31\xd4\x7a\xa7\xed\xd9\x32\x18\xdc\x70\x9a\x8d\x71\xb1\x8a\x54\xcc\x0f\xd6\x4a\x5a\x17\x0e\x02\x6e\x0f\xdc\xe3\xa1\xc8\x7d\x57\xda\xe7\x5a\x3e\xd6\xaa\x24\x48\x14\xf0\x59\xf0\x7e\xc3\x58\x47\xab\xda\x03\x84\x1f\xa1\xde\x43\x90\x08\x54\x6f\x24\x47\xb9\xe3\x28\x32\x82\xab\x76\xb5\x63\x9d\x31\x5b\x85\x36\x30\x64\xa8\xd9\x9b\x11\xf0\xfe\xf4\x8a\xa3\xba\x46\x38\x33\xfc\x9f\xd9\x5c\xfe\x3a\x5e\x2c\xc6\xb3\xd5\x27\xf9\x53\x2a\xc4\xfb\xec\x6a\x7c\xbf\xcc\xe4\xea\x63\xe6\x6a\xbe\x79\x74\xf3\xb5\xbc\x59\x64\x99\x9c\xdf\xc8\xab\x8f\xe3\xc5\x87\x2c\xb1\xcf\x2d\x32\xfb\x44\xd8\xd0\xcd\x7c\x61\x7f\x10\xd4\x40\x22\x57\x73\x68\x30\xfb\x6d\x95\xcd\x56\xf2\x2e\x5b\xdc\x4e\x56\xab\xec\x5a\xbe\xff\xe4\xea\xbb\x4c\x33\x39\x1d\xff\x9a\xca\xec\xb7\xab\xec\x6e\x25\x7f\xfd\x98\xcd\xe4\xdc\xb6\xfe\xeb\x64\x99\x89\xe5\x6a\x6c\x9f\x9f\xcc\xe4\xaf\x8b\xc9\x6a\x32\xfb\x00\xed\xf9\x52\x76\x1f\xe7\xd3\xeb\x6c\x01\xb1\x8c\xef\xe6\x0b\x7c\x51\xde\x8d\x17\xab\x49\xb6\xb4\xe3\xf8\x65\x72\x1d\x8d\x49\x9c\x8d\x97\x72\xb2\x3c\x83\x6c\xad\xf9\xfd\xca\xf7\x7d\x7e\x23\xc7\xb3\x4f\xf2\xaf\x93\xd9\x75\x22\xb3\x09\x34\x94\xfd\x76\xb7\xc8\x96\x76\xf8\xf3\x85\x9c\xdc\xde\x4d\x27\xd9\x75\x22\x27\xb3\xab\xe9\xfd\xf5\x64\xf6\x21\x11\xef\xef\x57\x72\x36\x5f\xc9\xe9\xe4\x76\x62\xfb\xb9\x9a\xc3\xcc\xf0\xb3\xdc\xba\xed\xcc\xfc\x46\xde\x66\x8b\xab\x8f\xe3\xd9\x2a\x2c\x6a\x73\x33\x59\xcd\xb2\xe5\x52\xd8\xa9\x1b\x63\xcf\xaf\xee\xa7\xe3\x85\xbc\xbb\x5f\xdc\xcd\x97\x59\x8a\x13\x38\x5b\x4d\x16\x99\x5c\x4c\x96\x7f\x95\xe3\x25\x4f\xeb\xdf\xee\xc7\xae\x9d\xbb\x6c\x71\x33\x5f\xdc\x8e\x67\x57\x99\x00\x68\x7a\xb4\x8c\x90\x9b\xf6\x69\x7e\x9f\xca\xe5\xc7\xf9\xfd\xf4\x3a\xfa\xdd\x4e\x53\x26\xaf\xb3\x9b\xec\x6a\x35\xf9\x25\x4b\xec\x83\x72\xbc\x5c\xde\xdf\x66\x02\x67\x7b\xb9\x82\xe9\x99\x4e\xe5\x2c\xbb\xca\x96\xcb\xf1\xe2\x93\x5c\x66\x8b\x5f\x26\x57\x10\x2c\x5a\x64\x77\xe3\xc9\x42\x42\xfc\x68\xb1\xc0\x0c\xcd\x54\x88\x8b\x37\xa9\x5d\xb8\xd9\x5c\x66\xbf\xd8\xe5\xbf\x9f\x4d\xb3\xe5\x52\x2e\xb2\xbf\xdd\x4f\x16\x43\x9b\xc0\xb6\x30\xfe\xb0\xc8\x60\x22\x83\x35\x17\xbf\x4e\xa6\x53\x58\x9d\xee\xc2\x27\xf0\xca\xec\x53\xb0\xf0\x9f\xe4\xaf\x1f\xe7\xf2\x76\xfc\x09\x43\x56\x9f\x78\x6b\x2c\x32\x17\xd3\xc2\x61\xf1\xf0\xc7\xcb\x60\x63\x8e\xdf\xcf\xed\x0c\xbc\xcf\xe4\x74\x02\xdd\x5a\xcd\x61\x3a\xec\xf2\x5c\x8f\x6f\xc7\x1f\xb2\x65\xb0\x01\xec\xa7\x05\xc5\xd8\x12\xb9\xbc\xcb\xae\x26\xf6\x7f\x4c\x66\x57\x93\xeb\x6c\xb6\x1a\x4f\x71\x4e\x66\xcb\xec\x6f\xf7\x76\x09\xc7\x53\x6e\x44\x8e\x17\x93\xa5\x6d\xc1\xee\x41\x5a\xaf\xfb\x65\x26\xec\x3e\x9b\xf1\xfe\x58\xcd\x65\xf7\x48\x9e\xfb\x6f\xf7\xf7\x9e\x9c\xce\x97\x98\x19\x3b\x5e\x8d\x05\xf4\x78\x35\x96\xef\x33\xfb\xf4\x22\x9b\x5d\x67\x0b\x38\x4a\xe3\xab\xab\xfb\xc5\x78\x95\xd9\xce\xd9\x37\xb2\xa5\x5c\xde\x2f\x57\xe3\xc9\x0c\x17\xc5\x8e\x17\x0e\xf2\x64\x71\xcd\x67\x49\xc0\xf6\xbc\x19\x4f\xa6\xf7\x8b\x4c\x76\x36\xd8\x6a\x2e\xe7\x77\x19\x34\x09\x1b\x2d\x58\x10\x7c\x62\x39\x4a\x60\x0f\xc8\xc9\x8d\x5c\xde\x5f\x7d\x14\xb8\x7a\x32\x3a\xb1\x9f\xe4\xc7\xf1\x52\xbe\xcf\xb2\x99\x1c\x5f\xff\x32\x81\x53\x47\xdf\x99\x2f\x97\x13\x9a\x93\x39\xb6\xc0\xf3\x98\x8a\x6c\x86\xcf\x0d\x84\x34\x85\x18\x53\xa5\x20\x87\x30\x1f\x43\x8a\x20\x42\x23\x56\x70\xdb\xb7\xb5\xb5\xde\x1a\x39\xd3\xcf\x7c\xb1\x19\x07\xf4\xcd\xf5\x93\x2e\xeb\x3d\x70\x43\x3d\x7b\x78\x02\xb9\x18\x39\xbc\x4c\x9e\x10\xba\x1d\x1f\x81\x18\xcc\xb4\x40\x2f\x09\xa4\x83\x07\xd4\xca\xa1\x80\x02\x92\xb3\x02\x63\xbd\x69\xb9\x3c\x9c\x5a\x6f\x0b\xfd\x44\x98\xf6\xa0\xb4\x5e\xd1\xc6\xc2\x9f\xfc\x53\x2e\xb4\xbe\x56\x55\xac\xb0\x07\xf8\x27\xe7\x8b\x09\x9c\x81\x2b\x6f\x1a\xb4\xad\x22\x6b\xd9\xab\x40\x2e\x28\x56\x87\x0e\x0d\xa8\xea\x56\x18\x69\xd4\xc6\x76\xd9\x76\x17\x5e\x16\x88\x79\xa0\x4c\xf9\x96\x28\x91\x30\xef\x1f\xcd\x7c\x30\xbe\xed\x58\x6a\xd3\xfa\x0a\x7e\x48\x79\xf0\xa4\x8f\x64\xab\x43\x35\x26\xcc\xe9\x8a\x23\x69\xd0\x14\xb4\x41\xe4\xcc\xa0\xbf\x45\xdc\x70\x67\xee\xee\x3f\x93\x25\xa6\xac\xe7\x52\x89\x7d\x0d\xde\xfa\xd8\x51\x04\xe6\x1a\x79\xcf\x0b\x7b\x89\x1f\xaa\x3c\x15\xe2\xff\xb6\x13\x09\xef\x06\xd4\xad\x3c\xf6\x57\x06\xf9\x07\xd0\xf5\xfe\xd0\x14\x7a\x23\x8b\x5c\x2b\x08\x30\xfe\x3f\xec\xfd\xeb\x72\x1b\x49\x76\x2e\x0c\xff\xcf\xab\xc8\xcd\xf8\x1c\x24\x66\x17\x4b\x3c\xb4\xa4\x51\x6b\x76\x87\x21\x10\xa4\x30\x03\x02\x34\x00\xb6\x5a\x9f\xc3\x61\x25\x80\x04\x50\x56\xa1\x0a\x53\x59\x45\x0a\xbe\xa3\xfd\xe7\xbd\x08\x5f\xd9\x1b\xb9\xd6\xca\x53\xa1\x00\x52\xea\xe9\x9e\xb1\x5f\xd1\x11\x1e\x35\x09\x54\xe5\x39\xd7\xe1\x59\xcf\x03\xe9\x1b\x2c\xaa\x88\x7f\x72\xd2\xe5\x0c\x21\x82\xdb\x2d\xff\x93\xe1\x2e\x40\xab\xe6\x27\x52\x2d\xb3\x81\xa2\x1a\xd8\xe1\xad\x05\x15\xd5\xf4\x0c\x79\x08\xd9\x48\xca\xe6\x64\xf7\x21\xe4\x33\x0f\x98\xcb\x9a\xac\x24\xe6\x9b\x3f\x2e\xe1\x6c\x00\x91\x79\xc1\x4f\x6a\x09\x99\x5d\xe3\x37\xde\xed\xa1\x1f\x43\xa5\x94\xc9\x2a\xdf\x50\xfe\x02\x02\x7e\x68\x34\x55\x4a\x2e\xaa\x14\x7d\x10\xba\x9b\x99\x3e\x47\xcc\xfd\xfc\xd6\x6a\x39\x4a\x62\x09\xb3\x6a\xc3\x36\x9e\x9f\x2f\x76\xae\xd8\xbc\x78\xc6\x0d\x3b\x96\xf2\xa9\xe1\x5b\x18\x82\x51\xf4\x88\x4c\x49\xbc\xbf\x30\x5d\x84\x32\x08\xa0\x1e\x9a\x13\x9b\xdb\xc5\x90\x08\x0d\xdb\x5b\x9e\x2c\xf4\x42\xad\x99\xc6\x87\x01\xa7\x11\x7f\xf5\xfa\x25\xbf\x15\x4a\xb1\xf6\x83\x8c\x78\x47\xac\xa7\x45\x32\x5f\x4a\x83\x32\xbd\x7c\x13\xf1\xfb\x71\x9b\x30\x3e\xc0\x9e\xe3\xc7\x58\xf3\xcc\x64\x6c\x0c\x39\x32\xa9\x5f\xcb\x54\xce\xca\x22\xcf\x92\x19\xe1\x6b\x36\xc0\x29\x0f\x55\x8e\xbd\x45\x18\xf9\x0c\xd2\x6d\x91\x3d\xc3\x48\x11\x45\x90\x16\x15\xed\xc1\x34\xf9\x4c\x27\x1e\xb0\x5c\x27\x25\x1e\x22\x8a\x34\x81\xfc\x7c\xdb\x3a\x9f\xcb\x1f\x19\xbb\xc9\xf2\x75\xfe\x80\xc6\xb6\x59\x9a\xaf\xde\x44\xbc\x8e\xce\xfd\xf2\x85\x87\x3b\x8f\xfb\xdf\x9c\xe5\x6b\x49\xc5\xb7\xed\x77\xe3\x61\xff\x7e\xd2\xed\x7f\xf4\xcd\xd8\xb7\x30\xdb\x34\xd1\xbc\xdc\x6e\x24\xff\xa4\xf4\xe0\x3c\x1e\x13\xec\xa5\xbe\x73\x31\x01\x6e\x98\x8b\x1e\x65\xaa\xdf\x81\x9a\x6f\xe1\x46\xc6\x43\xd9\xe0\xa4\x9c\x4f\xf4\xd6\x7b\x0d\x9b\x1d\xfb\x0d\x20\x78\xd0\x6a\xbb\xd1\x9e\x56\x49\x1a\x6a\x94\xdd\x34\xed\x82\xa9\xc1\xff\x98\x1d\x9b\x55\x09\xff\x09\x4e\x95\x97\x55\x0c\x1c\xb9\x7d\x51\xc4\xe1\x82\xcf\xf2\xaa\x70\x02\x25\xf4\x3a\xc3\x68\x4e\xfc\x8a\x54\xa0\x0f\x8e\x12\xb8\xf6\x39\x01\x5e\x44\xd6\xdc\xb2\xb7\x08\xb5\x42\x89\x38\xd8\xc7\x53\x3d\xb9\x95\x92\xa7\xb3\x34\x99\x7d\x06\xa4\xdf\x5a\x66\x15\x50\x5d\xaa\xd3\x53\x7d\xc6\x82\x27\xab\xaa\xa4\x54\x01\xe6\x35\xdc\x81\x90\x25\x5a\x4a\x3a\xa0\xe4\x7a\x93\xe6\x5b\x59\xf0\x13\x83\x09\xcd\x8b\xcf\x86\xa1\x18\xbe\xbd\x96\x45\x8b\x1b\x14\xad\xd2\xfe\x73\x0a\xd5\xfc\xc0\x79\x59\xe6\x5c\x25\xcb\x8c\x0b\xef\x7e\xf1\xd0\x25\x47\x2e\x1f\x69\x0c\x02\xbd\x61\xe5\x4c\x2a\x25\x8a\x6d\xcc\xdf\x03\xbb\x0e\x57\x00\x7d\x7c\x8b\x09\x07\x44\x9d\x88\xb5\x54\x3f\xea\x86\x6f\xf3\xf9\x36\x93\x66\xeb\xea\x3b\x6a\xba\xb5\xaf\x50\x46\xaa\xc5\xd0\x27\xe8\xad\x20\x41\x33\x3c\xd8\x6f\x9f\xbc\x65\x7d\xcc\x4e\x6c\xe7\x20\x04\x08\xe4\xea\x86\xaa\xa0\x70\x36\x05\x00\xe4\x00\xa1\xad\xff\xb1\x9e\x22\xbb\xba\xc9\x4a\x4d\xb7\xfc\xcf\xba\x91\xec\xbd\x98\x7d\x06\x4e\xe0\x3f\x21\x7d\x5e\x55\xc0\x7e\x9a\x6c\x79\x27\xcf\xb3\x9f\x22\x7e\xce\xdb\x9b\x22\x49\x11\x0c\x4f\xbf\x8e\x80\xb0\x11\x18\x8a\xf4\x87\x7f\x4e\x66\x80\x27\x17\xe5\xb1\x4d\x2e\x14\x46\x3b\x38\x29\xff\xd7\xdf\xa3\xce\x26\x7e\x31\xe9\xf4\xff\xd6\x05\x1f\xb5\x9f\xc3\xf5\x1f\x67\x3f\x5c\x9e\x5f\xd6\xea\x3f\x2e\x2e\x5e\x9e\x7d\xaf\xff\xf8\x3d\x7e\x26\xbe\x98\xff\x9e\xe8\xd1\x48\x2e\x7d\xc0\xd6\x7d\x96\xc0\x6d\x83\x16\x46\x47\xa4\xc9\x22\x2f\xb2\x44\x44\x6c\x5c\x65\xfc\x36\x99\x15\x39\xe6\x82\x94\xd9\xcf\xa8\x7d\x96\xcc\x14\xef\x50\x04\x0d\xee\xe9\x36\xdc\x66\x48\xe1\xed\xfd\x01\xc0\x44\x54\x11\x80\x49\x06\x0c\x22\x7b\xb1\x49\x8c\x4b\x1a\x7a\x13\xbd\x95\x08\xa2\xa4\x54\x3e\x4b\x20\x5f\x61\x32\xa7\x56\x26\x99\x57\x19\xd0\x7d\x18\xda\xbb\xd4\x1d\x30\x68\x8b\x79\xf4\x45\xf0\xb4\x80\xd9\x4e\x99\x43\x09\x42\xdc\xbb\xdc\xd8\x51\x2d\xa3\xe4\xee\x39\xd4\x09\xb2\xd9\x88\x60\xbc\x0d\x0b\x74\x20\xa7\x6c\xd5\x8a\x49\x32\xad\x86\xfe\x62\x96\xce\x74\x97\x84\x1c\x8b\x19\x30\xbf\xcb\x03\x89\x2b\x07\x6c\x81\x16\xe0\x17\x98\x5f\x06\x6a\x81\x8e\x84\x58\xf4\xc3\x95\x2a\xe6\x83\xdc\x1e\x8a\xb6\x0a\x26\x72\x05\x87\x79\xc1\x8b\x7c\x2b\xd2\x72\x0b\x08\x95\x44\x39\x21\x1a\xd3\x1d\x5a\x3e\xc4\x5a\xf9\x9f\x72\xae\xc7\x4d\xc5\xc4\xa8\x63\xf0\x70\x40\x77\xee\x8f\x11\xa5\xad\x77\xd7\x65\x62\xa9\xeb\xa1\x73\x36\xb9\xea\x28\xa0\x98\x13\x47\x30\xc4\x7b\x40\x16\x4d\x19\x8a\x5d\x29\x32\x09\x7e\x2d\x2d\xaf\x42\x5a\x9d\x23\x93\x6c\x9a\x33\xa3\xa5\x04\x7a\x38\x1b\x62\xa5\x74\x9e\x99\x75\xaf\xb6\xb8\x3c\xb5\x51\xe8\x85\x7c\xc6\xef\xdb\xfd\x3e\xf8\xf0\xed\xfb\xc9\xfb\xe1\x68\xac\x5d\x7e\x1b\x87\xd1\xff\x1d\x44\x5a\xb4\xc1\x8f\xa1\x00\x88\xb7\xf4\x46\xdd\xce\x24\x62\xbd\x01\xfd\xab\x29\xc2\x12\x7d\x4d\x88\x85\xdd\x8f\xbb\x96\xb8\x61\x3c\xbc\x9e\x7c\x68\x8f\xba\x11\xef\x4d\xc6\x96\x4c\x0c\x00\xce\x36\xac\x74\xd5\x1d\xf5\x7e\x6e\x4f\x7a\x3f\x77\xc7\x18\xf1\x1c\x5e\x63\x24\x83\xf5\xae\x83\x6e\xbd\x6f\xff\xdc\xfd\xca\xd8\x85\xde\x6e\xde\x13\x40\xe1\xda\x1f\x19\xe8\xec\x75\xaf\xd3\xee\xf7\x3f\xea\xbf\x74\xfa\xed\xde\x2d\xf7\x7c\xa2\x5e\x10\x8b\xfa\x95\xc1\xc8\xc8\xf8\x49\x7a\xe8\x59\x93\x9f\x14\x41\x13\x07\xc3\xc1\x69\x6f\x70\x3d\xea\x0d\x6e\xba\x7a\xbc\xe2\x70\x30\x79\xcf\x86\x5d\xaf\xf8\x70\xc0\xdb\x03\x1b\x71\x7d\xd7\x1e\xf7\xc6\xf8\x90\x83\xfd\x86\xa1\x1c\x0c\xf9\xf0\x5d\xbf\x47\xd4\x5a\x93\xa1\x79\x28\xbb\x6d\xf7\x06\x93\xee\xa0\x3d\xe8\x74\x23\x3e\xbe\xbf\xbb\x1b\x8e\x26\x11\xbf\xbf\xbb\x6a\x4f\xf4\x70\x74\x07\xef\xf5\x9f\x80\x16\x0e\x66\x31\x90\x4e\x89\x19\xbb\x19\xfe\xdc\x1d\x0d\x6e\x21\x1e\x39\xee\xfe\x68\x72\x1e\xc8\x38\xaa\x37\xb0\x15\xd8\x73\x65\x42\x86\x82\xd4\x5e\x08\xf1\x38\xe6\xcb\xfc\x41\x16\x19\x52\x0f\x83\x2d\x6d\xff\x9b\xab\x95\x3e\x87\xc0\x29\x04\xb4\xc8\xd1\x88\xb2\x8b\x72\xce\x47\x90\x38\x3c\xb2\xf0\x41\xff\x64\x24\xd9\x63\x16\x9e\x8e\x22\xe0\xcf\x04\x4f\x50\xce\xc1\x6c\x6f\xeb\x06\x93\xb6\xf1\x48\x2e\x2b\xc3\xf5\x73\x72\xdd\x1e\xa9\x16\x4f\x32\xd6\x49\x01\xdd\xf8\xf2\x22\xbe\xb8\x78\x1d\x9f\xbf\x01\x02\x82\x93\x8b\x56\xbc\xaf\xdf\x72\x7f\xb7\xd9\x95\xd4\xd7\x93\xe1\xa6\xba\x92\x0b\x47\x8b\x63\xbf\x84\x5d\xd7\xc7\x57\x2a\x94\x42\x88\xa6\x50\xfc\xa8\x63\x11\x35\xbc\x43\x1a\x50\xcc\xf8\xb2\x47\x16\x69\xfb\x95\x63\xe8\x46\x86\x25\x19\xa7\xbe\x5e\x60\x67\x4f\x5f\x9f\x9d\x5f\x62\x77\xcf\x81\x92\xf5\x4a\x0f\x8a\x3e\xd6\x4b\x7d\x53\x02\x0a\xc4\xa6\x61\xf2\x42\x2e\x73\x48\xd9\xeb\x7e\x9a\x43\x16\x6f\x3e\x3b\xe1\x5e\xe3\x2c\x73\xa0\x32\x34\xb5\x44\xfc\x49\x03\xe6\x6e\x4b\x46\x20\x88\x06\xd8\x9d\x33\x42\x90\x6d\xac\x98\x43\x3a\xdf\x22\xa0\xf0\x54\xb6\xb4\x21\xc8\x1b\xec\xf2\xfc\xdf\xab\xd4\xbf\xe9\x27\x7e\x71\x9d\x67\xe5\xa9\xcd\xe6\x9d\x5e\xfc\xde\xf5\xdf\x67\xe7\xe7\x67\xaf\x6a\xf6\xff\xcb\xb3\x8b\x8b\xef\xf6\xff\xef\xf1\xd3\xde\x87\x56\xc3\xf3\x90\x54\x3d\x3c\x32\x19\x0c\xb9\x57\xc0\x24\x05\xf5\x69\xb9\xa1\x96\x94\xeb\xa9\x9c\xbb\x5f\x42\x39\xa9\x95\x1e\x20\x18\xad\xc3\xce\xc3\x47\x2c\x5d\xe5\xdc\xa3\xea\x33\x7f\x74\x48\xdf\x2d\x69\x46\x78\xe5\x05\x85\x54\x55\x0a\x47\x8d\x6d\x19\x66\x1d\x80\x1c\xcf\xf9\x2e\xfb\xc3\x8d\x14\xbb\xb2\x7d\x76\xef\x5b\x21\x02\x0b\x68\x47\xd2\x64\x2e\xca\xb0\x80\x45\x28\x14\x83\xdd\x06\x2d\xe7\x6b\xb0\xc4\xbf\xae\x05\xbd\xa0\x4a\xd4\x1b\xcf\xad\xe3\x17\x95\x86\xdf\xd1\xb5\xb4\xcc\x31\x50\x53\x23\x90\xc2\xaf\x1a\xea\x3b\xc3\xc1\x98\x4f\xd3\x64\x29\xa8\x6a\x1e\xd2\x1d\x4e\xe8\x15\x99\xb8\x0d\xc0\x81\x72\x21\x44\x45\x5b\x7b\xa7\xe5\xb0\xb7\xe0\x32\x2f\xcc\xfd\xf7\x5e\xc5\xdf\x7f\xbe\xf5\x27\x7e\x71\x35\xec\xfc\x5d\xe3\x3f\xe7\x67\x2f\x5f\x9f\xed\xc4\x7f\x2e\x5f\x7e\x3f\xff\x7f\x8f\x9f\x4e\xc0\xe2\xd5\xb7\xfe\x72\xcf\xcb\x85\x68\x07\xbe\xdd\xe9\x9e\x4c\x6e\x5b\x11\x9f\xb4\x87\xf8\x8f\x4e\xcf\xfc\xeb\xaa\x9d\xd1\x5f\x21\xee\xdf\xc9\xc7\xb7\xbd\x8e\xfe\x6f\xc6\x9e\xfc\xda\x4f\xf8\xef\xf0\x7b\xfc\x64\x25\xb3\x99\x5c\xe4\x45\xb9\xe2\x06\xf2\xcd\x00\x04\xc5\x8f\xae\x86\x1d\x6b\x2b\x1e\xb5\xd0\x4d\x0f\x63\x03\x57\x79\xb5\x4c\x85\xe2\x9d\x98\x8f\x67\xab\x75\x32\xc7\xce\xad\x20\x28\xa1\xa4\x28\x66\x2b\xb6\x2c\xf2\x6a\xc3\x45\xc9\x3f\x08\x80\xe1\x95\x79\xe6\x05\xb6\xa2\xfd\x41\x2e\xde\x2b\x1e\x92\x8c\x6a\xd1\x7f\x16\xd9\x5c\x16\xd3\x24\x2d\x99\xff\xe5\x90\xe0\xec\xfc\xcd\x9b\xcb\xd3\x8b\xb3\xb3\x37\x28\xd9\x4c\x50\x49\x52\xf2\x99\xc7\x7c\x9c\x68\x3b\xd7\xef\x16\x4b\x14\xcf\x37\x32\x3b\xc5\xc4\x71\x04\xd9\x15\x5f\x99\xdf\x2b\x89\x37\x47\x3d\x24\x60\x4c\x2c\xca\x44\xa1\x20\x26\xc5\x42\x63\xfb\xf4\x74\x23\x8b\x8d\x2c\x91\x6f\x1a\x22\x50\x45\x21\x1f\xf2\x99\x98\xa6\xdb\xd3\x53\x7d\x91\xf8\x6d\x09\xeb\x5b\xb5\xa1\xef\x81\xf9\x8d\x9c\xba\x83\xae\x9a\x16\x0b\xc5\x41\x31\x54\xa8\xc6\x3a\x1b\x53\xaf\xc6\x42\xbe\x47\xcf\xcd\x74\xdc\xe8\x91\xb9\x90\x23\x8f\x0c\xd5\x8f\x54\xba\xbb\x89\x79\xe5\xa1\x50\x9e\xa8\x1b\x39\xad\x92\xb4\x24\xf2\x90\xa0\x67\x75\xfd\x4e\x08\x72\xd9\xa7\x3a\xd5\x16\x08\x2d\x29\xb2\x2f\x9c\x66\x0c\xde\xa1\x40\x74\x07\xe2\x89\xd3\x24\x13\xc5\xd6\x43\xdb\x5b\xc9\x18\x17\x83\xc4\x01\xb3\x14\xe2\x86\xc3\x24\x68\x16\x64\xc2\xac\x7b\x48\xb9\x6e\x7a\xb8\xfd\x10\x35\x19\xb5\xee\x30\xba\x39\x97\x05\xc8\xd6\xe3\x7d\x4f\x76\x42\x0d\x0e\xb1\xb5\x2a\x36\x7e\xe9\x81\xa1\x5a\x87\x91\x62\xbb\x23\x05\x6e\xa2\xf4\xe6\x21\xa8\x6c\xd4\x26\xc4\x3a\x51\x7e\x3d\x32\x2d\x22\xe6\x91\xe3\xcc\x65\xc4\x0d\x2b\x99\x1d\x63\x2a\x5f\xdf\x42\x72\x4d\x7b\xd6\x05\x12\x63\x03\x76\xcf\x97\xa5\x64\x3b\xcb\x12\x9f\x08\x44\x87\x80\x1a\x01\xf6\x82\x24\x4d\x41\xb9\x44\x4f\x5a\xf0\x69\x58\x9f\x40\xef\xc6\xfc\x0c\x3c\xed\x2b\xec\xb1\xc8\xfc\x4d\x67\xb0\x2e\x68\xdb\xe5\x73\x99\xe2\x8a\xd4\x6b\x21\x3b\x2e\x29\x59\xcc\x0c\x39\x09\x0d\xc8\x71\x21\x9b\x56\x5a\x92\x99\x41\x77\x3c\x2e\xa0\x43\xf3\x28\xb9\xcc\x66\x79\x55\x88\x25\x10\xc5\xea\x29\x4b\xa5\x5e\xad\x48\xca\xa0\x72\xfd\x11\xbd\x4c\x10\xe0\x28\x6d\xce\x0f\x36\xa1\x51\x85\x0b\xf6\x6b\x85\xfa\xcd\xaa\xcc\x8b\xc4\x46\xb1\xdb\x9d\x2e\x1c\xc2\x78\x00\xd3\xe1\xeb\x9f\xbb\xfc\x51\x4e\xb9\x4a\x4a\x8a\x22\xaf\x45\x42\x24\xe1\xc6\x8e\xd5\xf3\x79\x63\x4e\xcd\x12\x68\x0d\x55\x99\x94\x7a\x5d\xe9\x0b\xc2\x66\xe2\x7b\x59\x29\x97\x05\x18\x9c\x63\x4c\x03\xf0\x93\xde\xb8\x37\x6e\xd9\xb0\x46\x47\x66\xa5\x2c\xa0\x94\xe6\xca\x9b\x8c\x21\x1e\x2c\x18\x0f\x21\x9a\xf9\x3d\xa7\xf3\xb8\x8c\x79\x3f\xaf\x12\x83\x3d\x95\xcc\x9f\xad\x7c\x11\x4c\xa4\x8b\x29\xa1\x3e\x93\x55\xcf\x68\xfa\x8c\xde\x79\x55\x96\x94\xdb\x98\x8d\xab\x29\x45\x2d\x70\x48\xec\xce\x37\x2a\x3d\xfa\xef\x20\xeb\xf5\xe9\x93\x50\x3c\x51\xc7\xc7\xdc\xd0\x1c\x12\x06\x03\xcb\x37\x44\xa9\x40\x60\x37\x62\x7e\x71\xeb\x36\x00\x6a\xe8\xed\xbe\x12\x59\x29\x80\x76\x66\x1b\xf1\x2c\xcf\x92\x6c\x51\x24\x46\x1f\x08\xcf\x47\x53\xef\xc6\x92\xac\x94\x20\x2a\x50\x09\xbd\xe4\xf3\x8d\x2c\x4a\xd4\x22\x5f\x24\x65\x26\x95\x72\x59\x04\xc7\x01\x4b\x09\x05\xa0\x87\xce\x72\xc8\x38\x97\x0c\x23\x4b\x61\x87\xa0\x3c\xda\x54\x2c\x52\x36\xa0\x90\x33\xa0\x33\x30\xff\x22\xa7\x31\xd2\x07\xde\x7a\x93\x8a\x62\x1b\xb1\x8d\x1e\x3a\xc0\x3a\x20\x14\x5e\xc9\xbf\x56\x32\x2b\xf5\x39\x36\x17\x6b\xb1\x94\x2a\xf2\x0a\x7c\x0d\x82\x05\x84\xf5\x29\x27\x94\xe6\xaa\xd4\xfd\x59\x24\xa5\x8a\x18\xe4\xc4\x93\x05\x17\x73\x2c\x0d\x30\x6a\xae\x80\x24\x83\x81\x02\x22\x6f\x7d\xac\xd0\xf3\x63\xde\x27\xde\xc6\x68\xe7\x4a\xb5\x13\x08\xb3\xd5\x34\x57\x84\x60\xff\x9c\x64\x73\xbf\xa1\x50\x64\x66\x3f\xc5\xf2\x05\x91\x3c\x45\xbb\xd3\x06\x1a\x0b\xfe\x0c\x34\x8c\xff\xce\xe4\x42\xfa\x44\x14\x09\x1c\x1c\xa8\x71\x46\x80\x03\x28\x54\x94\x22\x85\x60\x5c\xa5\xa8\x2e\xb6\x2c\x04\x5c\xbe\x62\x86\xa2\x69\xcd\xbb\x84\xdd\x77\xac\xb1\xe2\x0c\x95\x60\x1f\x61\x16\x85\xe0\x01\x92\x4a\x97\x55\x09\x9a\xeb\xca\x8b\x39\xb2\x2c\x87\x05\x81\x43\x0e\x03\x47\x3a\x11\x06\x8d\x53\x5f\xab\xf6\x88\x57\x11\x35\x57\xc9\x59\x21\x4b\x80\x34\xe0\xb2\x04\xad\x1c\xb0\xd7\xfc\xe3\xab\xa1\xae\x3f\xe6\xb7\x79\x21\x73\xb2\x00\xdc\xca\x85\xe3\x7e\x9f\xfd\xe6\xfa\x9e\x17\xcf\xed\x3e\x83\x7a\x38\xea\xfd\xee\x1e\x80\xb5\x09\xb7\x4b\x85\xcc\x05\xb8\x4c\x1d\x99\x8b\xdd\x12\x66\x97\x18\x0e\xe4\xdd\x7d\x10\x33\x16\xde\x10\xde\xf2\x34\x0b\x53\x55\x9b\x4d\x5e\x94\x96\xec\x55\xef\x15\xb8\xc2\xdd\x0d\x8f\xe9\x28\x2b\xc0\xf8\xf4\x60\x7c\xcb\x48\xa0\xc2\x56\x82\x80\x0b\xa2\x83\x8b\xb0\xd0\x94\x44\x4d\x42\xd9\x00\x10\x9b\x06\xa1\x77\x14\x76\x68\x07\xba\xf0\x86\x25\xcf\x97\x2f\xc8\x8b\x74\x6e\xcb\xf1\x3d\xe3\xc7\x8c\x00\x5c\x15\x9e\x3d\x61\x4d\x91\x98\xd7\x47\xf1\xe3\xc5\x5f\x4e\x4d\x11\x1a\x56\x63\x9a\xb2\x35\x28\xc5\xd7\xbd\x4f\xb7\xda\x0e\x18\x8e\xf9\x26\x15\x25\x14\x92\xd6\xbf\xb7\xef\x14\xc1\x04\x39\x7d\xc8\xa5\x98\x33\xf9\xc8\xef\xc7\x7c\x2e\xb6\x29\xda\xa3\xe2\x01\x24\xd1\x8b\x2a\x95\x86\x81\x69\xba\xe5\x9d\x3c\x5b\x42\xd1\x90\x76\x63\xf4\xa5\xdc\xcd\x64\xb1\xdc\xf2\xbb\x3c\x4d\x66\x5b\xde\x9e\x81\x5a\xd9\xc5\xd9\xd9\xcb\xe8\x88\xe2\x6c\x52\x69\x4b\x12\x51\x8a\xfa\x2d\x3b\xaf\xc0\x8a\x8c\x93\xab\xf1\xa4\x45\x82\x37\xe6\x46\xbc\xcf\x12\xb8\x83\xb5\x15\x4b\xb5\x9b\xf2\xcb\x46\xaf\xa5\xab\xf1\x44\x37\x21\x5f\xf0\x5b\xed\x0b\xe9\x37\xbe\x6e\x72\x43\xa8\x54\x58\x31\xfd\x92\x17\x73\xa3\xbb\x32\x13\xa9\xcc\xe6\x58\x60\xe1\x43\xe6\xe0\xe0\xaa\xd7\x83\x12\x77\xa0\x2d\x33\x64\x53\xc9\x05\x40\x5f\xdd\x45\xaa\x3b\xa6\xdb\x84\xed\x0f\x67\x6c\xcb\xab\xcd\x12\xce\x0f\x5c\xa2\x3b\xcf\x67\x98\x2b\x48\xb2\x25\x64\x5b\x27\x06\x56\xf4\x4c\x8f\xd5\xf3\x3a\xa3\x67\x9c\xa3\xa1\xd3\x17\x6c\x21\x4f\xa9\xb4\x52\x18\x6d\x23\x1d\x3a\x3a\x2b\xb4\xf9\xc6\x8c\x03\x80\x4c\x7f\xc5\x03\xa4\xed\xa1\xc8\xc5\x79\x51\x89\x25\x15\xb2\x18\x4f\x2c\x7e\xb5\x19\x78\x2f\xa1\x02\xdf\xf9\xf6\x43\x90\xa2\xa0\x86\x21\x13\x72\x3c\xc0\x9f\x51\x63\x4d\x13\x60\x59\x7f\x45\xdb\x9f\x76\xfd\xf1\x9f\x79\x11\x4c\x41\x96\x17\x18\x88\x4d\xca\x1d\xa8\x05\x33\x38\x33\x40\x33\x7e\x7b\x9f\x81\xce\x0a\xd5\x54\xac\xfe\x2d\xac\x99\x1a\xa3\x35\x52\x5e\x2d\x97\x52\x19\x62\x8f\xb9\xe5\xf8\x40\xe6\xe6\x12\x8b\x70\xff\x5a\xd9\x8f\x6c\xc0\x2d\xd3\x36\x3c\x5b\x4b\xb0\xe1\xf5\x49\xbf\x13\x90\xf8\x87\x89\x98\xc6\x2f\xde\xdf\x0d\xae\x4e\x95\x4c\xd3\x53\x43\xb2\xfd\xb7\x8e\x06\x3e\x91\xff\xb9\x38\x7f\xf9\xc3\x0e\xff\xef\xcb\xd7\xdf\xe3\x7f\xbf\xc7\xcf\x9f\xea\x20\xa2\x9f\x18\xbb\xfb\x4a\x70\x13\x52\x96\x36\x22\x9b\xd8\x41\x64\x93\xbe\x4e\x7d\x58\x95\x74\x76\x0e\x30\x5b\x86\xb8\x27\xa4\x1a\xcb\x1f\x9a\xe8\xce\x60\x37\xab\x10\xf2\x14\x39\xcc\xd3\x34\x87\x9b\x9a\x1c\x57\x17\xe2\xf1\x98\x84\x10\x71\xee\x7a\x1e\x3c\x19\x94\x3a\xd1\x16\xf1\x53\x4e\xc2\x4a\xba\x31\x07\x20\x22\xa4\xf5\x9f\xea\x74\x7d\x3f\xf1\x3f\xe5\x85\xc1\x34\x20\xcb\x7e\x22\xd5\x4f\xc1\x9d\x01\x9a\x43\x0f\xb2\x28\xc1\x15\x60\x81\xdc\xe9\x06\x51\xd2\xc4\x52\x1b\x14\x93\x1a\xe9\x6d\x5b\x0a\x4a\x83\x48\xc9\xf2\x19\x96\x79\xc2\xc5\x51\x24\xfa\xa1\xae\x9b\x71\x53\x43\xd7\xe2\x33\xa4\xc2\x78\x21\xa9\x28\x9a\x90\x14\x62\x9a\x57\x38\x11\xaa\x4a\x8c\xd3\xb3\x13\xba\xab\x4f\xb3\xa9\x98\xb1\xd3\x79\x04\x0e\xd8\x91\xe5\xe7\x32\xd7\x1b\x09\xb8\xfa\x45\x0c\x8d\xed\x33\xe8\x9f\x31\xd4\xe0\x79\x38\x9e\x0f\xbd\xc9\x7b\x36\xea\xde\xb4\x47\x57\x58\x14\x18\xe2\x9a\x5c\x9d\x5a\xbf\xff\x3c\x18\x10\xf3\x6a\x12\x79\x58\xbe\x87\x58\xae\x86\xd6\x39\x08\xd7\x35\xc1\xa6\x0c\x4e\xcb\x42\xb7\xf6\x83\xb4\x0c\xd0\x8a\xfe\xf3\xc3\xfb\xf6\x64\x3c\xec\xfe\xdc\x1d\xf1\x51\x77\x7c\xdf\x87\x92\xcf\xeb\xd1\xf0\x96\x99\xda\xb6\xfb\x71\x37\xc2\xc2\xb6\x21\xd4\x97\x5d\xf7\x26\xe3\x88\x7f\x78\xdf\x85\x42\xb2\xde\x80\xb7\x07\xbc\x0d\x25\x88\x50\xae\x3a\x1c\x4c\x46\xed\xce\x24\xe2\x83\xee\x4d\xbf\x77\xd3\x85\xfa\x48\x53\x76\x36\x19\x8e\x26\xbd\xe1\xfd\x98\xbe\x10\xd5\x21\x63\x50\x8d\xa7\x9f\x31\xc0\xa2\x46\x2c\x6f\xa3\x5a\x3d\x3e\x1c\x31\xaf\xea\x72\x07\x57\xf6\x3d\x4b\xf8\x8f\xf8\x13\xbf\xe8\xdf\x01\xeb\xff\xc5\x6f\x97\x04\x3c\x7c\xff\x5f\x5e\x5e\x5c\x9e\xd7\xf3\x7f\xaf\x5e\xff\xf0\xfd\xfe\xff\x3d\x7e\xb4\xbf\xd4\x17\x13\xf9\x0b\xbf\xa3\x98\x72\x88\x51\x60\xec\xff\x9c\x1e\xfe\x3f\xc6\xf4\x0a\xe2\x4e\x39\xe7\x82\x9f\xbf\x79\xf3\xe6\xf4\xec\xcd\xe9\xd9\xa5\x97\x0a\xd3\xbf\xc4\x57\x5d\x9a\x77\x85\xf4\xfe\x86\x79\xca\xbf\xdd\x9e\xe4\xf4\x77\xc8\x11\xd0\xfc\xf3\x03\x11\x9c\x18\xcc\x77\xa8\xfd\x47\xdd\xf6\xed\xbb\x7e\x97\xb1\xff\x43\x3f\xe8\x36\x1e\x1a\x06\x7e\xa2\x3b\xd9\x82\x5a\x0d\x8f\x72\x03\x93\x2e\x8e\x69\x69\x2a\x94\x64\xf8\x9c\xe0\x82\x0e\x0b\xff\x3c\xfd\x58\xab\xdc\x94\x7a\x85\x75\x3e\x51\x70\xc8\x1b\x6f\x11\xd8\x10\x11\x02\xd4\x86\x97\xcf\x08\x7d\x39\x2b\x49\x69\xe3\x8f\xe9\x96\xae\xed\x54\x52\xf6\xaa\xf0\x6b\xd5\x26\xf2\x97\x53\x03\xb9\x3c\x31\xa9\x1a\x41\xc3\xb2\x11\xb3\xcf\x62\x29\x5b\x51\x20\x2d\x4f\xfc\xfb\x26\x4c\x5b\x7f\x62\x95\x99\xe7\x95\xb9\x7e\x3c\xe2\xf8\x8d\xd0\xd0\x27\x73\x49\xe9\x3b\xf6\xfd\xf0\x83\xbe\xb1\x5d\x4d\xba\xad\x95\xe6\xf7\x83\xab\xee\x28\x10\x97\x3b\x8e\x18\xf1\x13\x23\xd7\x77\x92\xa9\xb2\xa8\x8c\xe2\x90\x11\xcf\x31\x02\xc5\x24\xb2\x23\x1c\x59\x85\x41\x34\x3e\xae\x72\x2e\x0a\xc9\x8c\x14\x26\xd8\x76\x3e\x49\x11\xfa\x86\x86\xc7\xc3\x67\x53\xb2\xa8\x43\x94\xad\x6e\x5a\x90\xfc\xd3\xc4\x23\x0a\x76\x54\xca\xc1\xfc\x36\xd1\xc5\x05\x8f\x0f\xa6\x14\xbb\xeb\x71\x87\xf8\x0b\xd0\x7b\x5b\x13\x21\xb4\xb6\x52\xf7\x7c\x73\x47\x70\x1e\x4a\x9b\x0e\x3e\x2e\x66\xbd\x5a\xb9\x44\xf3\x77\x44\x01\x86\x73\x0a\xa1\x40\x51\x6c\x4d\x3e\x53\x55\x1b\x59\x28\x09\x24\x75\x5e\xab\xf2\x6c\x67\x0b\x7b\x1a\xb2\xc8\x37\x87\xb0\xab\x9a\xfd\xbb\x27\xa1\x6c\xbe\x8a\xcb\xf6\x0f\x59\xfe\x07\xc4\xe9\x3f\xab\xad\x2c\x6c\x27\x0f\xdb\xd9\xd4\x0a\x91\x79\xe2\xf9\x81\xf0\x96\x7e\x6b\xcc\xdb\xee\x1b\x40\x4f\x8b\x0c\x40\xe1\x81\xe7\x98\x08\xa3\xa6\x87\x4d\x3c\x86\x1c\x88\x8f\x2f\xf2\x42\xba\x0c\xf5\x6c\x25\x67\x9f\xc9\xcb\xf1\x5a\x0b\x35\x0c\xe1\x3a\x85\x9a\x89\x1c\x0a\x16\x98\x4c\x61\xad\x41\x41\x0e\x8a\x1e\x78\xa5\x8b\x75\xca\x3f\x5b\x7a\xed\x4d\x92\x3f\x98\x7a\x47\x21\xf1\x9b\x87\x83\x73\x2f\xa6\xa2\x47\x88\x2f\x56\xa5\xde\x77\x10\x53\x06\xbe\x4e\xc8\x4c\xb9\x03\x8b\xf0\xc7\x48\x6e\x6a\x18\x68\xfd\x57\xd1\xd9\x5e\x58\x2c\x34\xc8\x0c\x20\x06\x3b\xbc\x6a\x80\xd1\x9c\x48\x05\xac\x1b\x68\x07\x08\x4e\x13\xac\x76\x27\x79\x09\x5f\x9e\x03\x55\xd4\x9b\x01\x0c\x7b\xb7\x0c\xbc\x66\x96\x43\x7c\x14\x6b\x9a\x6d\xf1\x66\x29\x67\xab\x0c\x0a\x57\x8d\x83\x46\x67\x93\x65\x1b\x7a\x5c\xe9\x45\x6a\x72\xb0\x26\x05\x45\xf0\x0f\xcc\x34\x41\x06\x70\x59\xd8\xa4\x53\x21\x5d\x82\x26\x6c\x4a\x1d\xee\xa7\xa4\x34\xb5\xcd\x44\xb4\x80\x12\xa5\xcb\x5c\xa4\xe6\xcd\x52\x96\x4e\x8d\xcc\xe7\xb6\x05\x25\xe5\x42\x8a\x79\x08\x7e\xfc\x34\x5b\x2c\x81\xe7\x27\x2e\xe5\x97\x63\x46\x79\x69\x7d\x1d\xf2\x86\xeb\x10\x49\x84\x6d\x60\x2d\x66\xcc\xe3\xdd\x1f\x0e\x02\xb6\x7d\xbe\xcb\xb6\xff\x7f\x9e\xff\xe3\x6e\xda\xaf\xda\x61\x6e\xe8\xae\xbc\x76\xb3\x7c\x81\x5b\xc9\xa4\x5b\x1a\x96\xa2\x33\x33\x7c\x86\x35\xc3\x54\x90\x51\xde\x77\xcb\x45\xe3\x39\x84\xc1\x0a\x08\x65\x08\x52\xaf\xa0\x4a\x2d\xd4\x42\x99\xd7\xe9\x2d\x2d\x0d\x17\x9c\x2f\x7b\x7a\x1b\xb0\x80\xef\xb4\x7b\x11\xf9\x3c\x9e\x51\xc8\x81\xc1\x24\xd8\x6e\x35\xb6\xaa\xb5\x2c\x7f\x74\xc4\xf9\xa0\x1f\x22\x25\xe6\xa6\x4c\x88\x14\xaa\xb2\xdd\xfe\xca\x8b\x4c\x9a\x70\x3f\xb6\x62\xf7\x00\x05\xca\xa7\x9d\x8d\x65\xc1\xad\xfa\x5b\xc2\x2f\xe1\xc2\x4d\x6b\x0a\x47\xaa\xa9\xb5\x2b\xda\xb6\x0d\xac\x13\x1c\xd9\xde\x95\x75\xdd\x70\x65\x1d\x23\x09\x7c\xcf\x7b\x61\xe2\x2c\x20\x17\xdd\x00\xde\x50\xd8\x08\xdb\xdd\xfe\x5b\x55\x72\xd6\x3c\x14\xfb\x6e\x8e\x83\x1d\xc7\xf0\x12\x10\x85\x7d\x4d\xf7\x79\xd8\x7d\xe8\x07\x73\x94\x09\x7a\x08\x8e\x3d\x4e\x64\xdd\x11\xbd\x5a\x6b\x85\x19\xe1\xf2\xb1\xf5\x18\xfa\xbf\x4c\xb0\xcb\x27\x2d\x64\xb4\x14\x7f\x80\xc3\x7c\xe7\x01\x9e\x5e\x8d\x98\x7d\xce\xf2\xc7\x54\xce\x49\x88\xc8\x43\xfc\xc0\xe5\xe4\x1e\xee\x54\xa9\xf1\x11\x06\x49\x02\x1f\x39\xc1\x3a\xf5\x96\x45\x07\x58\x19\x29\x5f\x55\x03\x35\x78\x5e\x7a\x5d\x25\x62\x18\x60\xda\x9d\xcb\xac\x74\x9b\x4a\x77\x1f\x8b\x58\xec\x42\x00\xfe\x37\x62\x9c\xa4\xaa\x40\x17\xf3\x0b\x47\x88\x4e\x82\x86\x43\x02\x09\x26\x9b\x1a\x60\x94\x29\x94\x79\x69\xf8\x48\x93\xf8\x28\xa4\x09\x41\xe6\x0b\x26\x8b\x22\x2f\x54\xd0\x4a\x24\xcd\xf7\xb7\xb7\xe5\x3a\xc3\x7c\x94\x93\xf8\xc1\x47\x81\x3d\xcc\xd0\x7e\xcb\x90\xe1\x13\xe9\x2c\x6a\xe0\x1f\x3b\xfe\xf6\x4f\x85\x63\x54\xc4\x5c\x37\x78\x6e\x10\x1b\xf4\x3f\x93\x2f\x76\xbb\xa3\x90\x18\xd2\x8e\xc3\xc1\xf5\x86\x76\xaa\x23\xc9\xf4\x94\xa1\x54\x78\x7c\x40\x90\xb7\xe9\x7d\x86\x23\x0e\x08\x2e\xa1\xab\xb5\xa4\x55\xed\xf3\xec\xc9\x35\x6e\x8e\x5b\x54\xd9\x77\x1d\xc9\x0d\x53\xcc\x49\x1b\xe8\x14\x4e\xde\xb5\x7e\x64\x4c\xff\x47\xed\xfa\xd9\xb9\x69\xf8\x09\x81\xf0\xa2\x43\xd7\x13\x0b\xbf\xd4\xe2\x65\xbe\x94\x4e\xf2\x60\xa7\x27\x6f\xad\x57\xd6\x10\x2f\x66\x3b\xcb\x76\x2d\xe6\x70\x4a\x03\x17\x37\xa0\x94\x00\x4a\x66\xe5\xf6\x1a\x16\x26\x80\x55\x18\xc2\x61\x20\xb0\x0d\x9a\x35\x74\x3c\xda\xe7\xc8\xbf\x56\xc9\x83\x48\xa1\x56\x2c\x7c\xa4\x3f\x04\xfa\x61\x18\x5c\xd6\x43\x0e\x0f\x82\x83\x55\x19\xbc\x27\x1d\x66\x91\xe1\xbc\x01\x08\x5d\x28\xd5\x60\xaa\x1e\xf4\x10\xca\x34\x45\xd7\x73\xe7\x4d\x35\x15\x91\x70\xcc\x18\x3b\x79\xd7\xb2\x68\x04\xc0\xb7\xe4\x40\xaf\x99\x5b\x61\x97\x86\x4d\xef\x25\xc2\x0d\x9c\x52\x55\x8b\x45\x32\x4b\x64\x56\x9a\xcc\x25\x50\x51\x60\x56\xbd\x79\x19\x20\xd7\x8a\x55\x09\x33\x7e\xb6\x53\x2a\xb8\xcf\x12\xc0\x1d\x8e\x24\xa5\x88\xfb\xf9\x4c\x68\x67\xe2\xe4\x7e\xd4\x6f\x11\xe4\x48\x01\x4d\x8e\x89\x1c\xc8\x2f\x00\xd4\x21\x70\x24\xf5\x4a\xb7\x05\x61\xb2\xac\x69\x35\x02\x9a\x38\x5f\x18\xee\xf4\x13\xa7\xdd\x63\xaf\x27\x98\x7a\x3c\x63\x61\x85\x05\xaa\x4b\x89\xdd\x63\x90\x20\xdd\xc8\x62\x25\x36\x60\xd4\xf8\xfc\x48\xad\x98\xb1\x41\x6e\xda\x4a\x07\x19\x29\x9e\x7c\xf2\x57\xec\x31\x5e\x91\x0b\xb4\x4d\x45\xa6\x0c\xd5\xb7\xb3\x0c\x0c\x34\x9a\x19\x0e\x4e\x80\x16\xa1\xf4\x8e\xc8\x94\x61\xaa\x41\x00\xb1\x42\x4d\xaf\x24\x53\xc0\x19\x1c\xe1\xbf\x9c\x62\x03\x99\x28\xc0\x32\x4f\x74\xf0\x98\x02\x02\x59\x36\x8b\x37\x0d\xcc\x04\x58\xd7\xc9\x34\x85\x1d\x84\xa0\x07\xe7\x44\x31\x03\x71\x8d\xf9\x27\xbf\xde\x7d\xb7\x63\x14\x1c\x98\xc9\xb9\x3d\xaa\x09\x65\x0d\x52\xe2\x96\x0e\x93\xf9\xa7\x63\x60\x78\xf0\x54\x3c\xf2\xd3\x53\xee\x1d\x28\xf0\xd9\x9a\xc0\x52\x70\x96\x31\x5a\x37\xcb\x0c\x9a\x96\x95\x4f\x48\x2e\xf1\x46\xc9\x25\xa3\xc8\x6d\x75\xf5\xe6\x58\xe1\x65\x14\x22\x52\x91\x2d\x2b\xb1\xd4\x27\x67\xc7\x88\x6f\xfa\x39\x33\x6a\xe8\x89\xe7\x7c\x0a\x45\x4c\x32\x49\x29\x3c\xc8\x88\xe9\xd0\x83\xbe\xb7\xf3\x0c\x30\x79\x50\x24\xaa\x97\x6b\x49\x2c\x69\x08\x10\x69\x21\x68\x07\x23\x3c\x18\x5e\x9c\x3a\xab\x38\x88\x33\x98\x63\x7d\x52\x37\xd0\x3c\xfb\xad\xee\x46\x93\x53\x85\x5c\xba\xf8\xe8\x0d\xa6\xb0\xca\x1c\x6f\x1b\xb4\x13\xe0\x03\xa0\x60\x6f\x0f\x8e\x3d\x85\xae\x26\xc7\x69\xc9\x9a\x6b\xe8\x6b\x7c\x9e\x35\xed\xf8\xeb\x18\x11\x13\x8e\x0f\xc3\x48\x75\x05\x47\x14\xf5\xcb\x37\xe5\xe1\x45\xe6\xc4\x34\xba\xa2\xa8\xd2\x92\xaf\x92\x69\x42\x85\x7d\x50\x8c\x61\x3a\x0a\x6f\x61\x65\x8e\x8e\x42\xb5\x99\x03\x1a\x27\x72\x9b\xad\x5c\xe5\x7a\xd3\xdb\xd9\x34\x72\x71\x89\xf6\x6c\x80\x6c\x8a\xcc\x2d\xed\x00\x93\xc5\x90\x22\x43\x60\x60\xf9\x92\x53\xb3\x6b\x42\xb5\xf9\x28\x88\xe9\x69\xd3\xd6\xdf\x53\xfc\x03\xa5\x3f\x7d\xdf\x8d\x9f\x7e\xcb\x0f\x63\x98\xb9\x04\xd6\xf8\x0c\x9d\xf7\xdc\x78\x73\x8d\x2e\x1c\xdd\x4d\x56\x91\x34\x7f\x04\xb4\x8e\x02\x6f\x04\x52\xe9\x16\xc9\x97\xaa\xdc\x77\xb4\x69\x3a\x76\x1c\xae\x45\x20\x84\x82\x9f\x0d\xaf\xee\x98\x7f\x00\xaf\x1d\x6e\x0b\xcb\x90\x64\x72\xdf\xbb\x2b\xc1\xa0\xb1\x74\x7f\x58\x18\xd6\xd3\x13\x57\x4a\x5a\xe2\xf0\xa9\x95\xd8\x6c\x90\x08\x49\xcc\x66\x48\x65\x74\x7a\x6a\x2f\xa6\x45\x5e\xa0\x22\x24\x49\xea\xc0\x2a\xb7\x2f\x33\x5b\xea\x2d\x18\xa6\xa5\x75\x87\xf3\xd9\xac\x2a\xa8\x8a\x11\x65\x86\x84\xa1\x76\xc1\xa3\x1b\x6a\x7d\xc8\x50\xd8\xb9\x6a\x9d\x14\x0a\x1c\x90\x95\x0a\x87\x87\x58\xaf\x1f\x92\x3c\x45\x49\x84\x7a\x30\x2c\x4c\x20\x98\xe4\x34\xc8\x14\x61\x98\x0c\x26\x6e\x8a\x04\x53\xc4\x34\x45\x72\xbe\xcc\x53\x04\xab\xb9\xd1\x76\x49\xdb\x7d\x8c\xa9\x7b\x9e\x67\x32\xe6\xb7\x5e\xcc\xd7\x26\xc2\xd9\xa3\xd8\x2a\x43\x31\x57\xe4\x08\xc2\x9e\xca\x95\x78\x48\x72\x47\xb0\x6d\xdd\x19\xbb\x6e\x4a\x34\xaa\x92\xd2\x76\x62\xce\x8c\x5d\xbd\xd7\xf9\x7b\xc2\xf7\xfd\xb6\xfd\x01\x5b\xa4\xbd\x43\x9d\xb3\x37\xbc\xda\xec\x12\xd3\x32\x35\x91\x57\x56\x0b\x11\xcb\x7a\xb4\xae\x7e\x04\xef\x84\x30\xf0\x9e\x76\x51\x00\x9f\xbd\x1c\xf9\x35\x0d\xed\xe6\x4c\x16\x8d\x11\x67\xeb\x4e\xd5\xec\x66\x76\xd8\x4f\xc7\x04\x47\xe8\xed\xd7\x69\x85\xf6\x07\x71\x3d\xae\x79\xe8\x4a\x13\xce\xfa\x73\x92\xcd\xb1\xda\xfa\x4b\x49\x50\xeb\xc0\xf0\xb2\xe2\xd2\x9e\x64\x87\xcb\xad\x45\x16\x4b\x5c\x7f\xee\x33\xe3\xe9\xf6\xc9\x87\x96\x1a\xc6\x4b\xc2\x38\x03\x63\x5f\x7b\xf0\x2e\xf6\xc4\xc8\x3c\x09\x6c\xba\x70\x01\x3a\x03\x9d\xc2\x37\x3b\x57\x2a\xd1\xc6\x0b\xdb\x17\xc4\x69\x91\x9b\x12\x44\xbc\x9a\xd7\x68\x84\x96\x2e\x73\xab\xb4\x9e\xc8\xd8\x59\xa5\x64\xc7\xda\x5b\xd9\x99\xaa\x06\xb0\x8a\xd2\x34\xca\x79\x99\x30\xa7\x7a\xb4\x7f\x64\xec\x94\x37\x04\x10\x8d\x07\x8b\xbd\xdd\xfd\x1e\xff\x14\x27\x99\x3a\xe6\x0a\xb0\xbc\x18\xbd\x85\xe2\x07\x34\x6f\x09\x84\x05\x2b\xa3\x66\x0d\xfa\xc1\x46\xa3\xf4\x52\x58\x05\x52\x2f\xc6\xa0\xcd\x19\xb9\xa5\xb8\x42\xa9\xad\x0a\xd7\xd2\xa7\xe2\xe3\xe6\xf2\xd9\xd7\xf6\xc5\xfc\x98\x9d\xe0\x44\x21\x03\x80\x95\xa0\xc1\xaf\xb6\x3c\xd9\x29\xab\x5b\x53\x3f\xda\x25\x87\x7c\xb4\x50\xcc\xc5\xca\x60\x2e\x9c\x2c\x0d\x6a\x68\x35\xca\x32\xca\x39\x6f\x6c\x00\xf3\xda\x4e\x48\x64\x63\x3f\x23\xdc\x38\xc0\xaa\x69\xa7\xff\xbc\x85\x66\xb6\xde\xc9\x18\xe9\xb1\x4c\xc2\x81\xe9\x6d\x15\x15\x64\x06\xd6\x7b\x85\x55\x1f\xce\xa1\xd1\x2d\x51\x88\x21\xc6\xca\x36\x12\xb4\xc1\x5c\x22\xde\x92\x55\xe6\x6a\x43\xe1\xf3\xda\x8b\xbd\x68\x79\x8a\x61\x61\x8c\xc5\xa9\xf9\x7a\x11\x06\x6c\xcd\x89\xee\x7d\x92\x6d\xaa\x92\x6f\x44\xb9\x52\x7c\x26\x32\xe6\x81\x9a\xcd\x65\x85\xae\x9f\x92\x70\x06\x1d\x98\x34\x74\x8e\xa8\xdc\x54\x3f\x84\x4d\xb7\x7c\x22\x7f\x69\xfd\x4d\x97\xce\x6c\xb1\x3c\x66\x27\xb3\x3c\x5b\x24\xcb\xaa\x10\xfe\x9a\xd9\x3b\x67\xf1\xce\x25\x75\xa2\x8f\x47\xb2\x04\xa0\xbc\xa4\x65\xc5\x27\x20\xfc\x06\xf1\x3a\xac\x62\x58\x3b\x01\x67\xc0\x3b\x12\x78\x01\x1c\x7b\xaf\xe4\x27\x68\x91\x09\x8d\xbe\x93\x48\x64\x91\x2f\xc0\xcd\x32\x69\x1b\x3c\xd6\x71\xad\x98\xdf\x25\x4a\x55\x18\x15\x0c\x0f\xb0\x88\x5b\xc8\xc2\x25\x33\x98\x85\xb9\xdc\x14\x72\x46\x78\xff\xfd\x67\x7a\x30\xb0\xb3\x7c\xbd\xc9\x33\xe2\xf7\x23\xec\x02\x5a\x1f\x2e\x74\xe8\xd6\x16\x4c\x3e\x25\x94\xad\x6a\x55\xb9\x92\x6b\x4c\xb0\x62\x25\x96\x1f\x94\x9b\x89\x0c\x83\xe3\x4f\x58\x61\x8c\x79\x8c\xb3\x41\x8a\x07\xdc\x96\x66\x81\xec\x20\x53\xd3\x45\xa9\x28\x30\x27\x9d\xd4\x93\x2a\xc9\x0d\x05\xec\x84\xf6\x54\xc0\x0b\x72\xb0\x94\xf7\xa8\xa5\x4c\xdb\x57\x05\x4b\x82\xca\xfa\x9c\xcd\xee\x57\xec\x89\x6c\xcb\xb0\x50\xcc\xec\x5f\x44\x31\xca\xb9\x87\x63\xf4\xaa\xc8\x70\x84\xf4\x61\x0e\xf5\x6e\xb0\x99\xd0\x89\xa2\xcf\xb2\xb0\x10\xad\x56\x5a\xf6\xac\xca\x32\x5c\xd1\xda\x12\x2d\x24\x2b\x12\xf5\x99\xe4\xe1\xf4\x5b\xfe\x5a\x09\xfb\x9c\x8d\x2c\x20\x5c\x45\x7a\x49\xb5\xeb\x15\x36\xcc\x36\xaf\x62\x3e\x06\x36\x59\xe6\xff\x5d\x0f\x94\xd4\x9b\x5c\x12\xab\x31\x1c\x31\x4a\x55\x6b\x73\x03\xa2\xbc\x9e\x00\x0f\x83\x38\x60\xa9\x5c\x00\x86\xbf\x90\x1b\x91\x14\x54\x21\x68\x4a\x88\x10\x47\x61\x2a\xbb\x0c\x55\x23\x10\x0d\xce\x31\xf6\x6e\xe6\x0f\xbd\x92\xa6\x39\x8c\xa8\x76\x8c\x08\xab\x60\x8f\x87\x57\xd7\x8e\xaf\x66\x98\x09\x2d\xd9\xe4\x16\xc2\x7c\xe1\x81\x54\x53\x88\x0f\xe2\x88\x04\x19\x2e\x4b\x73\xc9\x44\x5e\xdd\x18\x39\x38\xe0\xc0\x51\xf5\x63\xad\x02\x94\xb6\x58\xe4\x57\x8e\xa1\x93\x25\xd2\xbd\x25\x94\xa6\x52\x90\xe9\x15\x49\x61\x6d\x3a\x4d\x26\xa1\x40\x2e\x7d\x20\xc9\xcc\x1a\x22\xf6\xad\x20\xee\xec\x16\x28\x6b\x5a\xa0\x69\xae\x60\xdc\xe6\xa2\x14\x11\xfc\x7f\xac\xa3\xe6\x85\x36\xc1\x0a\x18\x61\xa1\xfd\x39\x51\x62\xc9\x85\xfe\x82\x54\x4c\x55\xca\xa5\x10\xa8\x4a\x1a\xf0\x44\xc8\xdc\x63\xe3\xf1\x22\x49\x0d\x97\xae\x9f\x08\xcd\xa9\xd2\x07\x4d\x1d\xe6\xcd\x12\x39\x51\xad\xc8\xc2\x8e\x1a\x37\xb4\x36\xcd\x44\x32\x37\x8c\xd7\xe6\x3f\xe1\x21\x0c\xa7\x7a\x25\x14\x46\x64\xbe\xa2\xbc\x94\xb1\x6f\x46\x2d\xf1\xaf\xc8\x5b\xd7\xb3\xd8\x48\xd3\x4a\x19\x3e\x97\xd2\x5a\xc3\xf5\x01\x44\x4a\xcf\x46\x40\xb1\x06\x04\x14\xff\x35\x08\x28\x54\x8f\xb0\x54\x9c\xfa\x32\xf4\x75\xd6\x3f\x6d\xf3\xea\xd8\xfa\x6c\xca\xee\xf7\xce\x2a\xcf\x15\x02\x3a\x3c\xe5\xfc\xbc\xe0\x6d\x8a\x16\x5a\x04\xe2\x57\x39\x0d\x7e\xd9\xb3\x25\x3b\x30\x3e\xb4\x15\xa9\x00\x7d\x31\x3c\x5a\xf4\x86\xf8\x83\x7f\x67\xfd\xc1\xbb\xa7\x30\xd6\x46\x4e\x19\x65\x8b\x72\xa3\x76\xec\x06\x81\x1c\x09\x0a\x91\x85\xfa\xe9\xa6\xb4\x4a\x64\x5b\x64\x07\x35\x11\x06\xd3\x28\xbd\xeb\xf4\xfc\x49\x11\x20\x4c\x82\xcf\x98\x2c\x98\xd5\x89\x62\x36\x7c\x11\x42\x09\x25\x2f\xe5\x97\x72\x07\x25\x09\x3b\x0f\x58\x0c\xc2\xd0\x94\xe5\x6f\x25\x54\x9f\xd5\xfe\x33\x44\xe2\xb5\xfe\x90\x71\x6d\x2a\x5e\xe1\x8a\xb5\x22\x11\xc9\x1a\x2e\x40\xa0\xf9\x5b\x19\x71\x84\x3d\xda\x07\xce\x90\xd7\x0f\x34\x31\x57\x0b\x27\x59\xe7\x73\x07\x27\xe1\x4f\xc0\x49\xe4\x97\x4d\x6a\xf5\xc1\xd7\x79\x09\x11\xf2\x5c\x1b\xad\xab\x84\x12\xc5\x4f\xc4\x7f\xcc\x13\xa2\x30\xfd\xf2\xb8\xda\x06\xbb\x81\xcc\x23\xd7\xf6\x03\x62\x06\x27\x37\x77\xfd\x16\x7f\x14\x41\xec\x39\xc9\x3c\x96\x8c\x98\x75\x9f\xc2\x4d\xea\x41\x87\x77\x46\xc6\xa0\x9b\x55\x58\xb7\x91\x64\xb5\x41\x02\x7d\x67\x55\x52\x4a\xb6\x90\xa9\x7c\x10\x86\x99\xcd\xec\x4d\xf4\x9b\x77\x21\x67\xe1\x26\x67\x2e\xa9\x60\x97\x4f\xe1\xf1\x54\xcc\x91\x57\x44\xcc\x31\xa5\x4e\x4a\x32\xf7\x70\xaf\xb8\x9d\xbc\x77\xdb\x82\xec\x4a\x1d\xf7\x1a\x51\xba\x2f\xc9\x90\x4c\xd7\x8b\xa9\xa8\x9d\x5d\x0c\x89\x5e\x91\x59\x26\xe7\x5d\x69\x70\x77\xcb\xc2\x17\xad\x66\x89\x7e\xe6\x16\x02\x51\x19\x71\xe4\x0b\x8f\xd8\xcc\x56\x19\x3d\x07\xf1\xe6\xe7\x7e\xf4\x0c\x97\x45\x90\x30\xf7\x8e\x90\x1d\xa2\x4a\xf6\x9e\xec\x59\xe8\x03\xac\x35\x7b\xcf\x08\x5f\xdd\xdc\x36\xed\x47\xc6\xfe\xe9\x9f\xf8\x26\x59\xc6\xf3\xf2\x0b\xfc\xdb\xdd\x77\x17\x67\x67\xe7\xfc\x36\xe6\x1f\x63\x3e\x10\x6b\xc9\xd8\x3f\x31\xf6\x4f\x3c\xd0\x1d\x69\x46\x83\xba\x5e\xf9\xfb\x51\x7f\xb9\xc1\xa5\x3e\x80\x8d\x8e\x76\xe4\x51\xe2\x0b\xfd\x94\xfa\x19\xf4\x5c\xc9\x94\x7f\x82\x0b\xbd\x29\x25\xe0\xc7\xfc\xf4\x6a\xd6\x9f\x5d\x95\xe5\xe6\xc7\x17\x2f\x1e\x1f\x1f\x63\xfd\x95\x2f\xa7\xc4\x8d\x12\xe7\xc5\xf2\x45\xba\xd9\xa4\x71\xf9\xa5\xd4\x1f\x84\xa0\xb0\x07\x52\xd7\xa6\x0a\xbc\x39\x71\xb4\x20\xa0\x38\xe7\xf3\x5e\x5b\xdf\x56\x3f\xc1\x7e\xfb\xcd\x9b\x37\x2f\xce\x2f\x5e\x9c\x9d\xdb\x87\xc4\x4d\xc3\x0e\x1b\x5f\x39\xe2\x74\x5c\xcd\x34\x8b\x68\x87\x27\xcb\x38\xc9\x14\x63\x37\xa0\x0d\x79\x60\x05\xa0\x63\x69\xa1\x47\xfe\x14\xa1\xae\x24\xad\x32\x56\x87\x21\xf3\x47\x14\x84\xd8\x6c\xd2\x2d\x3a\x32\x4d\xb8\xe4\x82\x0e\x85\x92\x14\xfa\x30\xd2\xf3\x89\xda\x4a\xaa\x15\xd4\xda\x63\x3c\x54\x3e\x35\x99\x5d\x0d\x8f\xc3\xec\x07\xfb\xe4\x96\xe8\xb1\xb6\xf6\xad\xe9\x32\xaa\x99\x27\xfb\xaf\x7b\xc6\xae\x20\xb6\x90\x2d\xf9\x07\x4a\x81\x11\x03\x4d\xe0\xb6\x11\x9a\x5f\xdf\x53\xc4\x41\x4e\x7e\xfa\xce\xcc\xfa\x16\x27\x19\x55\x56\xf4\x19\x47\x60\x07\x49\x59\x52\x09\x00\x85\x6c\x9d\x05\x66\xb3\x12\x2e\x57\xff\x88\x09\x12\xee\x55\x0c\x40\x7a\x7a\x2e\x51\x57\xd7\x68\x36\xda\x80\x9c\xe1\xd3\x09\x5e\x39\x41\xec\x43\x95\xce\xc3\xdb\x09\x2a\xe9\x11\xbf\x09\xa7\x8e\xc7\x6b\x9f\x12\x41\x7c\xd0\x97\x7a\x87\x33\x7d\x0e\x36\x96\x43\x06\x8c\xe6\x79\x81\xf9\x6c\x78\x1e\x0a\x43\xa5\xc9\x67\x79\x70\xb1\x3b\x42\x7e\xdd\x12\x74\xc2\xd6\x22\x4b\x16\x52\x41\x75\x71\xcc\xf0\x50\x14\x25\x1e\xfb\x16\x29\x26\xa6\x4a\x92\x4f\x0a\x50\x6a\xc0\x8d\xe4\x33\x50\xc2\x55\x90\x42\xb4\x2c\x9b\x20\x5a\x8b\x7a\x62\xf5\x31\xe6\xb5\x31\xc6\x10\xb8\x77\x0d\x4f\xb7\x9c\xb8\x96\x66\xf9\x7a\x53\x24\xa1\x4b\x84\xa0\x04\xdd\xdf\xae\x61\xbf\xb4\x49\x93\x5e\xe3\xa2\x51\x1e\xb4\x68\x2a\x49\x7a\xb2\x31\xfd\x50\xc3\xb7\x83\xc3\x94\x67\x4f\x47\x6a\x22\x1b\x7e\xa7\x40\xa4\x9f\x23\x47\x93\xd4\x0d\xf5\x13\x08\x40\x4f\xe2\x0a\x10\x80\x26\x0c\x8e\xb5\x32\xd6\x5b\x30\xac\xf8\x8d\x9b\x04\xf8\x0c\x92\x0c\xe8\x40\x2d\x3e\x11\xc9\xa7\xd1\x0c\x93\xde\xd0\xf9\x61\x74\x88\x71\xe1\x75\x91\xc2\x72\xa9\x7d\x98\x19\xfd\x71\xfb\x34\xed\x38\x1a\xb5\xa9\x99\x28\xe5\x12\x68\xad\x60\x91\x7a\xef\x30\x49\x89\xeb\xa6\xe0\xb6\x31\x89\x1d\x8a\xcc\xd6\xb7\x20\xe7\x6a\x92\x4a\x64\x12\xc4\xec\xa7\xf1\x9f\x98\x0d\x3c\x9a\x59\x85\x56\x58\x71\xe4\x87\x7a\xae\xc7\x9f\xdb\x98\x46\x7b\x37\x02\xa8\xf8\xc9\xe1\x40\x26\xb6\xc5\xb4\x82\xef\xb4\x22\x95\x4a\xb1\xfd\xad\xf8\x7a\x7c\x69\x8c\x4a\x17\xfb\x00\xab\xb5\xdc\x09\x09\x19\x5b\xf4\x80\xdf\xd0\xb9\x9c\xa5\xd0\x48\x26\xcc\x6c\x6d\x77\x3b\xe0\xcf\x5c\xe3\x5b\xbf\x17\x8b\xfe\x4e\x3f\xf1\x8b\x41\xff\xee\x37\x16\x00\x7a\x82\xff\xe1\xec\x87\xb3\xd7\xf5\xfa\xcf\xcb\xd7\x97\xdf\xeb\x3f\x7f\x8f\x9f\xc1\x10\xf5\x31\xf8\xdd\xfd\xbb\x7e\xaf\x63\x62\x55\x8c\x99\x7a\xce\xb3\x88\xff\xb9\xca\x24\xbf\x38\x3b\xbf\xe0\x37\x49\xaa\xb7\x71\xbf\x7d\xdb\x1b\xb5\xfb\x8c\xf5\x05\x7f\x97\xa4\xa9\x48\x14\x63\x97\x2f\x5f\xfe\xf1\x8c\xbf\x13\x55\x9a\x67\x8c\x5d\x17\x10\x5c\xde\xfb\xf8\x49\x93\xb4\xf8\x22\x47\x70\x05\x44\xcb\xfd\x13\x2c\xaa\xb9\x5f\xe0\x9d\xa2\xc6\x1a\x95\x2e\x71\xce\xcf\x80\xbf\x13\x62\x97\xc4\x66\x6d\x3f\x44\x29\xa0\x44\x91\xf2\x99\xe1\x7b\xf8\xae\x1d\x10\xbf\xb8\x4d\x8a\xe1\xf8\x37\x3d\x00\x9e\xe2\xff\x7f\xf9\xaa\xce\xff\x7f\xf1\xea\xe2\xd5\xf7\xfd\xff\x7b\xfc\xe8\x7b\x1f\x56\x00\x7a\xf3\x33\xdf\xa5\xfb\xd7\x8f\xdd\xf6\xe8\xdf\xf8\xbf\x0e\xda\xb7\xdd\x7f\xe3\xff\xda\xbd\x6d\xf7\xfa\xff\xc6\xd8\x5d\x5d\x34\xc9\x28\xea\x9a\x1a\x39\xd2\x05\xa4\x20\x4b\xfa\x84\x4e\x15\x48\x47\x49\xcb\x24\x8c\x6a\x97\x62\x86\x44\x71\x5b\x9f\x6e\x25\xf2\x89\x4b\x12\x65\x39\x63\xc0\xdc\x17\x29\x4f\x32\xe6\xf6\xb8\x49\xd9\x59\x33\x09\x54\x0d\x6c\x5c\xa8\xca\x4c\x92\x83\xf8\x98\x0d\xd3\x0d\xa2\xb6\xd2\x2d\xa3\x1c\x59\xc8\x76\xa3\x64\x9a\x3a\x1e\x9c\xb5\x2c\x96\x12\x8b\x90\xb9\x78\x14\xc8\xbf\xa9\xe0\x01\x7a\x28\x4d\xf5\x2e\xb4\x27\xe0\x3f\x21\x09\x20\x3d\x40\x3b\xc2\xeb\x01\x07\x25\xf9\xd0\x55\xb9\xce\x55\xc9\x08\xf3\xe3\x52\x4e\xd3\x3a\xee\x37\xe2\x59\x98\x8d\x04\x42\x2d\x4a\x30\x3a\xcd\xd8\xb5\xd0\xae\x62\x5e\x29\xa8\x22\xc4\x78\xf8\xb2\xc8\xf5\xc7\xe5\x32\x4d\x96\xd0\x7a\x9f\x25\x14\x61\x13\x74\x5e\xe6\x45\xe4\xa5\x55\x6c\x4a\x38\x07\x30\xe1\x4a\xa6\x73\x9f\x38\xd1\x11\x86\x9a\xff\x45\xcf\x05\x13\x2a\x98\x5f\x8a\x1c\x85\x22\xe5\xbb\x4d\x8a\xcb\xab\x98\xa3\x64\x16\xb1\x61\x9a\x98\xb0\x1e\x5b\x97\x09\xda\x9f\xc8\x61\x61\x22\x07\x38\x0a\xbf\x68\x8f\xc9\xb8\x9b\x94\xd2\x8c\xc8\x36\xc5\x3c\x67\x66\xa1\xab\x98\xb5\x52\xba\x15\xf0\x28\x91\xcc\x29\xb2\x71\xac\x78\xb2\x5e\xcb\x39\x10\x1f\x2f\x44\x95\x52\x0e\x1a\x5d\x66\xd3\x46\xe0\x1c\x25\xd8\xd2\x3f\xd2\x75\x13\xbf\xe8\xdf\xdc\xf5\xfb\xa3\xdf\xf2\x02\x78\x82\xff\xe3\x87\x8b\xd7\x3b\xfa\x8f\xaf\x2e\xbf\xeb\xbf\xfc\x2e\x3f\x7d\xa9\x94\x2c\xf6\x25\x31\xae\xf3\x82\xf7\x93\x6c\x59\x25\xaa\x4c\x66\xdc\x14\x9d\x28\x7d\x09\x48\xb1\x9e\xa6\x12\x83\x6d\x64\x47\x29\xd2\x85\x56\x25\x26\x8a\xa9\x60\x31\x59\x66\x78\x4a\x97\x50\x48\xad\x37\x33\x04\x81\xa9\xc4\x1a\xf4\x65\x57\xa2\x40\x7a\x79\x2a\x8a\x4b\xca\x98\xbf\xdb\xe2\xe1\x22\x94\xd1\x85\xe9\xfb\xd1\x5f\x87\x01\x5c\x56\x02\xae\x02\x19\x3c\x97\x99\xe7\xfa\x32\xf0\x50\xd8\xa2\x1b\x77\x7a\x6a\x2a\xbb\xa9\x26\x4e\xba\x36\xc3\x87\x20\x91\x88\x01\xb4\xa4\x60\x50\xd0\x61\x0e\xf4\xbe\x97\xf5\xe3\x87\x47\x70\xb1\x67\x04\x23\x86\x65\x02\x70\xf1\xa8\x7c\x2d\x0d\x04\x20\xdd\x72\xaf\x9a\x2a\x75\x5f\x2d\xcc\x57\xa1\xb6\x63\xbb\x49\x66\xf0\xe1\x54\x7e\x49\x66\x79\xa6\x60\xf0\x40\xca\x57\x60\x43\xbb\xa3\x5b\x54\x93\xf3\x6a\xab\xaf\x81\x77\xea\xee\x63\x6f\x70\x13\x3d\x55\x65\x7d\x16\x87\x99\xd9\xb6\x51\x7d\xe4\x5e\xcb\xf5\xe1\xdc\xd0\xbd\x5a\xed\x25\xb3\x31\x6d\xc2\x13\xda\x24\x49\xc8\x9d\xe5\xae\x01\x4f\x24\x12\x73\xf5\x4a\x6c\x11\xf3\xcc\x1a\x92\x19\x2e\x21\xe7\xc9\xbf\xeb\xa6\x3f\x35\x35\xac\x69\x6a\xf8\x09\x64\x86\x48\xcd\xf9\xc8\x5f\x78\x47\xad\x98\x77\xc5\x6c\xe5\x42\x8d\x89\x72\xd9\x6e\x26\x14\x3f\xda\xe6\xd5\x11\x14\x29\x1c\x35\xcc\xdd\x91\x29\xf2\xe1\xb3\x1c\xd8\xbb\x29\x0e\x83\x2b\x6f\x0a\x64\xd8\x54\x23\xc3\x37\x85\xdc\x88\x42\xce\x99\xca\x09\xc5\x13\x40\x5d\xe9\xde\x87\x27\x98\xcc\x1d\xa5\x51\x8f\x1a\x7a\x75\x14\x71\xa2\x4c\x09\x79\x48\xe0\x4e\x44\x83\x09\xa6\xcc\x62\x22\x9a\x88\x49\xac\xa5\x17\xf3\x36\x3f\x82\x6f\x4d\x05\xdc\xb7\x78\x19\x37\xbd\x97\x7a\x8c\x56\x09\xdb\xf3\x29\x03\xc4\x71\xe5\x4d\xd8\x26\xd2\x07\xb7\xcb\x24\x15\x8f\x3f\x1a\x4c\x33\x6c\x6f\x6d\x73\x09\xfc\x6c\x2d\xe6\xb7\xef\x2d\xcd\x85\x4d\xec\x59\x85\x4d\xdc\x2b\x6c\x82\x84\xdf\x72\x55\x2e\xf2\xe2\x51\x14\x73\xa8\x1c\x70\xa5\x4e\xcc\x96\x3a\xf1\x93\xf7\xb2\x90\x49\x26\x16\x25\x28\x27\xd0\x13\xc8\x84\xb5\xea\xab\xbb\x5c\xe8\x64\xe1\x30\x3d\xe0\xfc\xc8\x6f\xce\x51\xdc\x62\xec\xa8\x2f\x97\x09\x19\x59\xeb\x23\x42\x84\x35\x2c\x39\x1a\x7f\x2c\x8c\x26\x29\x15\xf8\x8e\x31\x92\xcc\x07\x21\x8c\x4e\x65\x75\xeb\x9a\x24\x2b\x66\x7a\x9b\xe9\x41\x1a\x1d\x76\x38\x72\x03\x9f\xdd\x15\x66\x02\x2b\x08\x33\xac\x20\xfd\xe7\xb0\x82\x40\x74\x32\xa4\x01\xb1\xea\xde\xcc\x19\x5a\x4d\x73\xbe\x43\x11\x42\xb5\x02\xa8\xc1\x0f\x90\x0e\x4a\xbb\x99\xe7\x41\xae\x00\xa9\x4b\xa8\xa2\x00\x9a\xa2\xd7\x17\xc0\x24\xbd\x44\x0d\x2d\xbd\x3d\x9b\xc0\x15\x69\x9e\x24\xd9\x5c\x6e\xf4\x7d\x95\x59\xf9\x01\x82\x6c\xed\x6d\x77\xc6\x05\x2f\xf3\x1c\x00\x1b\xcc\x80\xdf\x92\xb2\x15\xf3\x0f\x2b\x69\x86\x1f\xd3\x51\x45\xa5\xef\x59\xfd\x7c\x08\xd7\x3e\x9a\xda\xc4\x80\x44\x8a\x24\xdb\x64\xd3\x99\x07\x05\x64\xb1\xa3\x74\x10\xdb\x46\xd5\x96\x46\x2e\xae\xc6\xe6\xeb\xa3\x10\x95\x55\xb0\x60\x36\x29\x23\xc3\x7e\xa1\x4d\xe5\x6a\x5d\xd7\xde\x05\xb1\xb9\x3c\x53\x9b\x64\x56\xe5\x95\x22\x65\x1a\x0f\x2d\xa1\x3d\xb2\x0a\xa8\xb0\x75\x17\x21\x3f\x45\x4d\xf4\x3f\xd5\x40\x0d\x1a\xfa\xa4\xf9\xc2\x82\x38\xdf\xb2\xcf\x52\x6e\xf4\xb6\xd5\x4b\xcb\xe4\xca\x02\x08\x7c\x88\xe4\xe9\x7b\xcc\x39\xe4\x98\x51\xc2\x8a\x91\xd3\x66\x1f\x5d\x1f\x39\xe1\x91\x01\xf9\x4f\x0a\xeb\x90\x1b\x96\x8e\xc7\xe9\x41\xb5\xb8\x02\x04\x96\xad\xe4\xfe\x6a\xab\xa0\xec\x88\xb6\x07\x9c\x2f\x26\x03\x2b\x88\xb7\x55\x37\x66\x9b\x57\x70\x75\x86\x19\x78\x2c\xd1\x76\xb8\xd6\x4d\x91\x97\x74\x2d\x25\x99\x05\x23\xd3\xe9\xb2\x90\x12\x19\x32\x4c\x8b\x08\x11\xe9\x15\x45\x15\x4f\x2f\x0d\xcb\xf0\x8f\xe7\x30\xa3\x73\x18\x0a\xb9\xf4\xb9\x84\x0d\x7f\xd6\xe5\x12\x51\x00\x11\x57\x2a\x6b\x46\xf4\x9b\x53\x4c\x1f\xec\xee\x4e\x09\x8c\x85\x31\x75\xf9\x9c\x30\x9c\x6c\x77\x6d\xda\x6a\x3d\x58\x28\xd8\xbb\x80\x1a\xe7\x47\x88\x41\x72\xce\x45\x0b\x8e\x2b\x9b\x6e\x81\x97\x02\x3d\x00\x89\x18\x42\xf5\x69\xc3\x49\x1d\x33\x36\x6d\x79\xec\x10\x56\xeb\x10\x73\x27\xae\xaa\x4e\xdb\x26\x45\xb1\xf5\x72\x70\x66\xd1\xaa\x52\x10\x6a\x8f\xea\xf1\x70\xfe\xe6\xde\x63\x0c\x0c\x06\xe8\xdc\x69\xd9\xe2\xa7\x62\xc6\x66\x8d\xef\x7f\x5c\xe5\xa9\x3d\xab\xa0\x3b\x68\x8c\x98\xe2\x33\xbd\xa6\xb2\xdc\xac\x4f\x14\x64\x67\x61\x59\xfe\x5e\x0b\xcd\xe3\x39\xd3\xe3\x49\x09\x7b\xa0\xd6\x0e\x4b\x67\xc2\xf1\x04\x3c\x1b\xb4\x0b\xf8\x5a\x0c\x7f\x07\xd4\x4b\x10\xc4\x50\xd9\x0a\x3a\xfc\x06\xdd\x3f\x3b\xd4\x0f\xfb\xd7\x15\xd6\x3d\xa0\xe0\xa3\x98\x62\xc1\x98\x43\x72\xb9\x03\x1d\x29\x90\x37\x02\xe1\xaa\x79\xf1\xd9\x90\x72\x58\xf2\xb1\x72\x25\x29\x36\x65\x5d\x07\x23\xfd\x0e\xe3\x11\x05\xd5\xb5\x8e\x73\xc0\x76\xe5\xd1\xb0\xcd\x78\xb0\x64\xa8\xe1\x17\xaa\xf6\xea\x98\xbf\xab\xca\xa6\xcf\x73\xcb\xac\x60\x9f\x4a\x82\x38\x48\xbc\x83\xb3\x8c\x56\x20\x54\x4c\x3d\x73\x0b\xd6\xb3\x8d\xa6\x14\x1b\x9f\x07\x4b\x69\x6a\xf9\x7e\x1a\x67\x3f\xd2\x9f\x55\xd2\x8b\xee\xa1\x23\x49\x96\x14\x99\xda\xca\x8a\x61\xe2\x82\x40\x94\x3b\xbe\xc6\x30\xc2\x54\x60\xac\xc0\xe5\x00\x89\xe6\x07\x59\x10\x12\xb4\x90\x4b\x6d\xa5\x49\x05\x49\xdd\xc7\x55\xce\x1f\xf5\x51\x87\x86\xcd\x64\x55\xa9\xc8\xe3\x8a\x04\x30\x63\x56\x3a\xd9\x1d\x87\xbd\xd5\x9b\x4f\x5f\x25\x26\x6c\x48\x01\x30\xa9\xf0\x58\x65\x2e\x9a\x88\x46\x35\x11\x36\x62\x63\xd3\x2d\x41\x0f\xde\xf2\x42\xe8\xce\x45\xfe\xab\x12\x6c\xfc\x17\x59\xcc\x12\x05\xd3\x8b\x2f\xa9\x57\x88\xd6\x53\xbb\x9e\xd1\x0c\xad\x41\xc7\xe2\xc1\x2c\x45\x98\x41\xb6\x7f\x06\x11\x7a\x6f\xb2\xb0\x10\xd4\x94\x5c\x2c\x97\x7a\xc4\x6c\xf6\x98\x20\xb9\xd0\x27\x20\xac\x7e\xca\xe2\x69\xb8\xd3\xdc\x0d\x70\x62\x8c\xec\x67\xda\x4f\x2d\xfd\x37\xc1\x1f\xf2\xb4\x32\x44\x01\xaa\xcc\x0b\x8a\xe3\x05\xe3\x81\xd6\x85\xa7\x1d\x6b\x84\xbc\x99\xd7\x03\xaf\x8a\x4c\xdb\x97\x0d\xa7\xd1\xa5\xf6\x70\x36\x35\x2a\x37\x84\x7a\x64\x79\x30\xe2\x0b\xff\x32\xdb\xbd\xf6\x98\xdb\x28\x80\xf3\x55\x41\x40\xc4\x46\xaa\x0f\x0e\x95\xd0\xeb\x67\x56\x6c\x37\xda\x17\xf3\x4d\xf7\x86\x2f\xb4\xf4\x0a\x2b\xa4\x98\x53\x29\x74\x5e\x10\x5c\x7f\x96\xaf\x37\x49\x8a\xc5\x29\x69\x92\x7d\x96\x73\xa4\xb9\x01\xcb\x4c\x19\x6f\x57\x90\x5b\x17\x58\x8c\x8d\x7e\x5d\xcc\xc7\xc4\x86\x91\x17\x9f\x23\x96\x68\x77\x26\x4f\x09\xd5\x62\xc8\xd0\x76\x1c\xba\xfd\x0d\xb7\xa4\x4e\x88\xac\x62\x0b\x91\xa6\xca\xfa\x02\x87\xe6\xea\xbd\x51\xa5\x9b\xe5\xeb\x69\x42\xce\xc1\x73\xbb\x71\xd0\xf8\xda\x19\x7d\xfe\xe4\xe8\xa3\x60\xb2\x82\xea\x1c\x60\x4c\x65\xb6\x04\xb7\xb6\x6c\xf6\xce\xf8\x94\xaa\xc3\x12\x6f\xd1\x19\xf9\x64\x76\xe0\xdd\x11\x1d\x2a\x44\x9c\xf1\xc4\x10\x30\x6f\x26\x89\xf1\x8c\x5a\xfc\x15\x8d\x8d\xac\x59\x59\xbb\x67\xcc\xa3\x0e\x18\x5b\x3f\xc4\xbc\xad\x4d\x66\x38\xa4\x9c\xf3\x8e\xe3\x65\xbe\x0f\x66\x97\x5e\x0a\xf4\x24\xf7\x65\x20\x18\x6b\x13\x86\xd6\x13\x46\xd6\xef\x1a\xdb\x0b\x0e\x4b\x72\xb6\x7e\xdd\x27\xae\x12\x19\x0c\x10\xfb\xea\x35\xf2\x6b\x76\x28\x12\x6c\xcc\x2b\xed\x9d\xd8\x9e\x7a\xe1\x8b\x67\x4c\x76\xb4\xab\xa0\xef\x8d\x1a\x8d\xba\x19\x71\xb8\x98\x66\xab\x3c\x99\xd5\x35\x15\xbc\x99\xc1\xa4\x52\x23\xcc\xd9\x3c\xd6\x28\x0b\xcd\x2a\x55\xe6\x6b\x59\x1c\x2b\xa8\x21\x30\x7a\xfe\x85\xde\x85\x4a\x5f\xcc\xcb\x24\x93\x58\x4b\x02\xb5\x4f\x72\x5a\x2d\x81\xeb\x65\xd7\x2a\x37\xee\x8d\xb6\x12\x20\x8d\x56\xb7\x69\x71\xec\x9d\xbb\x57\x6b\x92\xed\x44\xd3\xee\x05\x56\x07\x4c\x29\x12\x29\x44\xc3\xc7\xdd\x44\x1a\x8b\xac\x22\xc0\xfb\x9e\x48\x85\xc7\xf7\x05\xd5\xe0\xdb\x3d\xce\xdd\xce\xb6\x9a\x57\x80\x8b\x42\x7d\xd0\x04\x51\x7f\x9b\x54\x6c\xd5\x6e\x82\xd4\x23\xc9\x73\x92\xa7\xbb\xce\xad\x45\x3e\x36\x76\x67\x9d\xe3\xcd\xb7\x0e\xd4\x58\x05\x3a\xb5\x48\xe9\x02\x19\x39\x73\x41\x56\xca\x55\x79\x34\x77\xa8\x9d\xaa\xdc\x6b\xda\x3c\x47\x70\x9e\x71\x86\x00\x6b\xa1\x1d\x21\xd1\xe2\x6d\x93\xc0\x0d\x86\xc0\x6e\x24\xc3\x70\x86\x25\x80\x6a\x93\x63\x59\x02\x71\x2d\x9d\xea\x0b\x0c\x6c\xf9\xd4\x0b\x72\x1d\x8e\x96\x58\x51\x41\xc3\xb2\x6a\x6a\xae\x1f\x65\x81\x71\x53\xc3\x4a\x6a\x1a\x73\x42\xe4\xc7\x64\xa1\xee\x06\x94\xed\x31\x72\x0e\x6b\xe3\x02\x8f\x93\x16\x38\xf7\x11\x4b\xc2\xd9\xf5\xa0\xa0\xcf\xbf\x2f\x10\x90\xcd\x82\x11\xa9\x8f\xc1\xb3\xaf\x32\x3d\xcd\xcc\x57\xe7\x35\x0c\x05\x4e\xe9\x35\xb2\x6c\x3c\x14\x81\x2a\x40\x5b\xd4\xea\xcf\x37\xef\x23\xba\x98\x6d\xbf\x38\x02\x6c\xdc\x19\x66\x7d\xb3\x86\xc3\x2c\x60\xab\x69\x36\x3f\xa7\x2d\xa8\x1e\x11\x8e\x9d\x7c\x2d\xf5\xec\x25\x6a\x4d\x90\x20\x73\xaf\x1f\x3a\x88\x63\xde\x66\x0d\x0f\x48\x10\x41\xea\xf4\x61\x4d\x5d\x21\x8a\x66\x1a\x9a\x8d\x5d\x7c\xe4\xc1\xd3\x37\x59\xb8\x11\x24\x72\x05\x78\xcf\x8e\xe0\x5c\x9d\x47\xc3\xa4\xae\x8a\x85\x98\x49\x10\x9c\x13\x25\xac\x70\xdb\x35\xf3\x41\x3b\x4d\x76\xf3\x08\x64\xe8\x03\xbb\x0d\x9d\xf5\x03\xbb\x4c\x58\xdf\x03\x42\x3c\x11\x7f\x10\x69\x32\xc7\x48\x4e\xc9\x53\x29\x94\x7e\x7a\x21\xb1\x20\x46\x45\xac\xcc\x5d\x25\x17\xb8\x89\x78\x1e\x00\x9f\x63\x29\x8b\x44\xa4\xca\xf0\x15\xe3\x99\x3a\x76\x9c\xa3\x3f\x88\xc8\xdc\xb5\x8b\xbc\x60\xc2\xc4\x02\xb2\x1c\x11\xb3\x04\x53\x76\xd5\xc1\x04\xae\xc0\x05\x92\x84\x44\x8e\x31\x63\xf3\x96\x3e\x3c\x9b\x34\x6e\x3c\x1b\xe5\x29\xb6\x42\xa0\x13\x14\x7c\x97\x9b\x10\x63\x5e\xfb\x39\x09\x4b\x4b\xc6\xe4\xfa\x6b\xc7\x80\x39\xa9\x6b\xcb\x52\x18\x33\x26\x5b\xfc\x67\x59\xe0\x2e\xf2\xb7\xd7\x4a\x1f\xb9\xa9\xde\xcb\x5b\x13\x0c\x9d\x07\x17\x86\x54\xfe\x00\xe7\x05\x0b\x19\xff\xcd\x77\x15\x16\x28\xe1\x95\x56\xd0\x13\x50\xaf\x2c\x18\x16\xe2\xb7\xfb\xca\x53\x48\x6f\x52\x0a\xbd\x84\x9f\x7e\xb6\x19\xed\xdf\x55\x50\xad\x8b\x29\xad\x6c\xce\xab\x12\x2b\x69\x6d\x0d\x69\x26\xe5\x1c\x5f\x63\x71\x3f\x26\x80\x6f\x2d\x0d\x3d\xc6\xda\x35\xb7\xb6\x3d\xdc\x5c\x94\x22\x75\x06\x5f\x54\x5b\x9f\x18\x97\xf2\x4f\x72\xa8\xf2\xcc\xf2\x92\x99\x7b\xd4\x62\x02\x8d\x5d\x9e\xe5\xc5\x1a\xd3\xae\xde\xd7\x4e\x92\xcc\xc0\xd4\x5d\xd4\x12\x35\xb8\xc1\xbe\x6b\x79\xe4\x91\xe2\x3f\xf0\x8c\x32\x34\x0a\x27\xe4\x6a\x15\x11\xff\x2c\x8b\x4c\xa6\x24\x92\xa5\x6f\x4b\x4b\x52\x6b\x75\x0c\x19\xd2\xd4\x61\xdc\xde\xe8\x48\x38\x0d\x71\x5e\x54\x99\x8a\x4c\x41\x3c\x79\xa2\xf4\x2a\x13\x50\x34\x60\xa9\x04\xc9\x59\xbc\x6f\xc7\x40\x60\xa6\x4d\x5f\xa2\xf1\xa2\xc5\x09\x38\x7f\x1b\x69\xa3\x2c\xfb\x3c\x99\x95\xa1\xbc\x85\x87\x9d\x02\x76\x08\x0c\xb3\x4b\xe0\xf1\x4f\x93\x69\x21\x00\x89\x8f\xd8\x7f\x8c\x5f\xd9\xc1\x14\xc1\xc9\x54\x57\x6d\x8c\x19\x39\x8f\xee\xcd\xe8\xbc\x0b\x62\x41\x9f\x89\x4c\x3f\x4e\x9b\x62\xa4\xdd\x25\xd7\x36\x74\xd9\x94\x6f\xb0\x44\xa8\x44\xc0\xe1\x99\x87\x61\x18\xcc\x23\x01\x26\x6e\x9d\x50\xdb\xcc\xc0\xb7\x94\x8c\xc0\x4f\x86\x89\x8e\x82\x38\x83\xdc\x7b\x53\x12\x76\x48\x28\x03\xbf\x4a\xb7\xce\xe0\xf6\x6a\xa7\x9d\x45\x95\x6d\x0d\x9d\x8b\xab\xa8\x35\x94\xa5\xbf\xaa\x51\x6e\x68\x12\xc5\x1f\xf2\xc4\x72\x3f\x69\x33\xb0\x2a\xf3\xb5\x28\x09\x41\x80\x85\x32\xc2\x94\x1c\x53\x04\xab\xa1\xb5\x6e\x37\x9a\xb0\xee\xe3\x2a\xc7\x63\xca\x1e\x6d\x46\x7a\x2d\x37\x0f\x8a\x70\x33\xeb\x49\x70\x8f\x64\x26\x01\x62\x64\x41\x89\x3f\x11\xea\x50\x2d\x98\xc4\x36\x0c\x36\x8f\xb9\x55\xc1\x89\x30\x0d\x28\xe4\x5a\x24\x99\xb6\xec\x16\x15\x20\x0d\x51\x9b\x15\x8e\x64\xa2\x5a\x36\x81\x5f\x7b\xbe\x11\x6b\xce\xa6\xac\x05\x21\x91\x34\xc9\x9e\xbc\x40\x95\x0f\x91\x1a\x96\x94\x31\xb7\x7d\xcf\x72\x07\x3c\xe6\xa4\x97\x09\x75\x5f\x81\x6a\x1e\x99\x54\x3b\x33\xd4\x98\x7d\x03\x76\x3c\x55\x0f\x96\x20\x3f\x8d\x82\xcc\xa7\x2f\x42\x0e\xcc\x8c\xe8\x97\xa4\xe2\x91\xea\x87\x6d\x00\x79\xb7\x67\xf0\x18\x8c\xaa\x00\x4d\x23\x36\x0d\xc8\xf6\x42\x66\xc1\xbd\xd9\xf9\x13\x4a\xd9\x3c\x2b\x22\xdc\xc2\xa0\x80\x65\xcb\x86\x45\x85\xcd\x32\x7c\x23\x41\x0e\x0c\xa1\xda\xda\xb1\x30\x78\x51\x1b\x16\xaf\xe1\xc3\xd9\x1e\x7c\x38\xf6\xc4\x75\xeb\x40\xe2\xa9\x16\x12\x85\xe8\xef\x6b\xc2\x74\x94\xc9\x5a\x52\xd2\xf2\xe9\x5d\xd5\x3c\x26\xfb\x46\x10\x4b\xac\xf4\x2e\x49\x36\x09\x58\x1c\xc1\x0e\xa4\xdd\xa3\xbc\x02\x25\xcb\x85\x6c\x29\x8b\x0c\xf6\x92\xdb\xd3\xc1\x07\xa6\xda\x53\xc1\x0d\xc5\xde\x53\x4a\x55\xe8\x24\xa0\xaf\x17\xa0\x77\x7d\xd6\x51\xff\x8c\x84\x6a\x3b\xa4\x2a\x5f\x54\x05\xc4\xe5\xc3\xcb\x21\x0b\x3b\xa8\x8e\x6d\x20\xdb\xe2\x0c\xf0\x5c\x31\xa0\xdd\x15\xa0\x22\xe0\x2d\xcc\x6d\x51\xed\x09\x2a\xe3\xf1\x71\x99\x2d\xf2\x62\x66\xa2\x97\xb8\xb1\x49\x4e\xc4\xcb\x2d\x39\x70\xbf\x8b\x09\xfe\x51\x7b\xdf\x64\x35\x58\x12\x15\x83\xf4\x9c\xe5\x55\x51\xf2\xff\xa8\xe6\xcb\x35\x61\x5f\x45\x9a\x7a\xd1\x6e\x94\x26\x0f\x24\xcd\x59\x5e\x58\x66\x09\x0c\x24\x63\x5a\x88\x9f\x84\x7c\x29\xf6\xbb\x00\x63\x6d\x45\x75\xe5\x04\x1c\x47\x58\x7b\x7a\xa5\x9d\x3c\x52\x2a\x7f\xba\xa5\x56\xe5\x05\x30\xd9\x08\x0b\xb6\xf2\xa9\x16\x5a\x2e\x14\x8d\x97\x26\x86\x63\x76\xb9\x0d\x7c\x80\xda\xd6\x1c\x0d\xf2\xcb\x4c\xdf\xa7\x40\x49\x63\x6c\xd8\xe0\xbb\x6c\x27\x7c\xe1\x5d\xc5\x7e\x72\xd5\x00\x92\x94\x28\x13\xb5\xd8\x72\x95\xac\xab\xb4\x14\x99\xc4\xcc\x3d\xc4\x9b\x9c\x48\x79\xd3\x5d\x82\x7b\xdd\x91\xba\xc8\xa2\xc4\xa8\x8f\xf7\x35\x2a\x4b\x14\x8a\x85\x73\xb8\xf5\xd6\xe5\x33\x36\xaa\x80\x94\x6d\x0c\x58\x46\x5b\x3b\x9b\x2c\xc0\x4a\x80\xb9\x32\x5b\xee\xd1\x12\x5e\x50\x2c\xac\xc8\xb7\x22\x2d\xb7\xa7\x00\x07\xf4\x0e\x85\xc3\x81\x7e\x00\x65\x03\x98\xa0\xce\x1a\x4e\xa9\x71\x8c\xba\xa4\x5b\xee\xa1\xa3\xf5\x35\xbc\x2a\x80\xcf\x7c\x9b\x57\x11\xb3\xbc\x84\x48\x04\x89\x88\x49\xac\x02\xb6\xa3\x0e\x86\x91\x0d\x6c\x79\x63\x8b\x1d\x99\x4a\xe4\x69\x58\x14\xfa\x86\xb4\x09\x28\x98\xfa\xc3\x5d\x09\x52\x43\x0d\xf9\x0d\x2f\x1d\x06\x02\xae\xa9\x76\x07\xd1\xbd\xcc\x0b\x5e\x65\xb8\x6d\x25\xb2\xd9\x19\x2e\x09\xe6\x93\xa2\x25\xc5\xac\x5a\x1b\xee\xed\x12\xa8\x3d\x52\x77\x39\x48\xff\xf1\x3e\xce\x13\x8b\xd8\x99\xb1\x03\xcd\xa7\x5c\x32\xb8\xf1\x0b\xda\x24\xc4\x65\xe6\xbf\x57\xc5\x86\xdc\xd7\x64\xfc\x8c\x28\x6d\x43\xca\x2f\xc9\x20\xd2\x41\x45\xc3\xe6\x60\x20\x9e\x19\x40\x05\x31\x0b\x5d\xc4\xb8\x42\xb9\xa5\xe4\x1d\x64\x0b\x21\x4f\x48\x69\x3c\x60\x35\xd0\x83\x95\x58\x1e\x31\xb4\x69\xf0\x93\x6f\x59\xf0\xf2\x15\xc5\x11\x94\xee\x9d\xd7\x42\x03\xd4\xa0\xeb\xce\x8a\x01\xd9\xaa\xce\x42\x6a\x97\xce\xc0\x7b\xfc\xf9\x26\x87\xc3\x66\x7a\x93\x35\x51\x5a\x22\x30\x93\x68\x6b\xcd\xae\xd8\x14\xda\xfc\x80\xf1\x42\x12\x5b\x99\x6f\x52\x49\x44\xbf\xda\x03\x07\x0e\xab\xbc\x52\xae\x10\xc0\x80\xc6\x20\x0b\x9c\xcc\x3d\xde\x3c\x70\x0a\x7d\x64\xa1\x59\xf4\x48\x01\x8b\x0d\x4b\x32\x14\x33\x82\xf5\x90\x99\xc2\x72\x0b\x3c\xad\x09\xdf\xe0\x97\xde\x32\xcc\xde\x56\x1b\x8b\xcc\x01\x04\xe9\x8b\x79\x9e\xe1\xd0\xcf\xe5\x0c\x40\x65\x0b\x0e\x97\x2a\x57\x2b\xc9\x89\xe3\x78\x87\x10\x85\x39\xac\xad\x69\xa0\x3b\xab\xa8\x95\x70\x80\x39\x1c\x28\x9d\x92\x74\x4f\xe2\x31\x0d\x11\xf7\xb8\x46\xde\x54\x5b\xa1\x80\x40\xd6\x2d\xd5\x6f\x49\xb7\xa8\x2d\x62\x6b\xd6\x49\xb3\xca\x92\x96\xb3\xda\x5d\x86\x77\xae\x2a\x1b\xb2\x62\x6f\x6c\xfc\xb9\x89\xcd\xe4\x29\xf0\x99\xf2\x00\x73\xda\xba\x9e\xa1\xf8\xb0\x3e\x81\xf4\x24\x3b\xd2\xca\xa9\xdd\x01\xc4\x14\x60\x63\xd4\x48\xfe\x8e\x81\x2e\x3c\xcb\x9d\x44\xcc\x0e\xf0\x57\x1f\x93\x10\x4a\xd9\x1b\x62\x68\xba\x44\xd6\x62\xcb\xc4\x7c\xee\x73\xc1\xf0\xa5\xcc\x97\x85\xd8\xac\x00\x14\x15\x74\xdd\x83\x56\x02\x0b\x30\x12\xe1\xc0\x29\x6d\xbb\x15\x31\x13\x20\xad\xeb\x37\xba\xa2\x1b\xa3\xa6\xa6\xcd\x01\x88\xb1\xbb\x41\xc1\xa3\xa4\x22\x9a\xe1\x39\xca\xe4\xd1\xee\x16\x78\x1f\xfb\x28\xf6\x6c\x96\x17\x9b\xbc\xb0\x84\x8d\x5e\x0b\x85\xd2\x4b\xd5\x84\xf0\x08\x0a\x3a\xcd\xe7\xbb\x51\x79\xc6\xce\xcf\x10\x21\x79\xad\xef\x29\x47\xbb\x9b\x57\x86\x20\x1d\x24\x24\x08\x3c\x57\x48\x2c\x91\xa1\x85\x90\xc9\x47\x9f\x0e\x12\x0d\xd8\x6f\x42\xb4\x93\x51\xa1\x8d\x68\xbd\x05\x93\xb5\x24\x2f\x3f\x78\x85\xd1\x8c\x51\xc9\x3a\x49\x49\x58\x7b\x93\x14\x89\x25\x22\x26\xc1\x69\xf3\x0d\x4c\x9b\xeb\x89\x26\x12\xae\x24\xe3\x73\x59\x8a\x24\x85\xf3\x1d\xa1\xd7\xf0\x8a\x4d\x91\x4f\x53\xb9\x36\x90\x8c\x99\x2c\x20\xbd\x04\xa6\xbd\x17\x7c\xa5\xe2\x75\x98\x5f\xec\x05\x78\x73\xe6\x13\x59\xb5\x9e\xca\xc2\xee\x9d\x26\x7f\xda\x04\x05\xf5\xad\x13\x7e\x6d\xc7\xb7\xc1\x33\xd6\xc3\xcb\xd3\x75\x7d\x64\x79\x6f\x4c\x5c\xf8\x28\x72\x9e\x27\x46\x4c\xcc\x29\xe7\x98\x89\x5d\xb2\xae\x56\x37\x4b\x18\x66\x73\x24\xda\x02\xff\xc2\xdc\x2f\x01\xc5\x8e\x59\x0a\x0e\x87\xbf\x6f\xe1\xc4\x6c\xff\x30\x38\x88\x85\x61\x48\x75\xce\x4b\x38\x2a\x2e\x49\x3c\x5b\xe5\xc6\x8b\x30\x1f\x81\x54\xcd\x57\x34\x88\x9d\x9f\x5b\xcb\x94\x14\x50\xfd\x7d\x04\x4e\xc1\x41\xf4\x21\xa0\xb4\x11\x59\x04\x76\x9d\x0d\x4b\x22\x06\x69\x9f\xec\x03\x18\xef\x59\x43\xbc\x1e\xe0\x4b\x45\x52\x42\xd4\xc6\x5d\x3c\xb0\x3a\xd5\x67\xd8\x2d\x2e\x32\x80\x85\xca\x01\xd3\xe9\xf9\x45\xcc\xdf\x75\x3b\xed\xfb\x71\x17\x94\xb4\xfb\xbd\xc1\xcd\x7d\x6f\x3c\xe9\x75\xf8\xa8\x3b\x1e\xde\x8f\x3a\x5d\xee\x38\x04\xaf\xf8\xf5\xa8\x0b\xda\xda\x9d\xf7\xed\xd1\x4d\x37\xd2\xdf\x19\xc1\x27\x06\x43\x66\x6b\x08\xaf\x87\xa3\x7d\x0f\x8b\x50\x18\xbd\xcb\xbb\xbf\x4c\xba\x83\x09\xbf\xeb\x8e\x6e\x7b\x93\x49\xf7\x8a\xbf\xfb\xc8\xdb\x77\x77\xfd\x5e\xa7\xfd\xae\xdf\x65\xfd\xf6\x87\x98\x77\x7f\xe9\x74\xef\x26\xfc\xc3\xfb\xee\x00\x25\xc2\x3f\xf4\xc6\x5d\x3e\x9e\xb4\xf5\xe7\x7b\x03\xfe\x61\xd4\x03\x45\x72\xfd\xbc\xce\xf0\xee\xe3\xa8\x77\xf3\x7e\xc2\xdf\x0f\xfb\x57\xdd\x11\x14\x9f\xbc\x18\x8e\x18\x6a\x8b\xdf\xb5\x47\xa0\xb1\x7e\x37\x1a\xfe\xdc\xbb\xda\xdf\x57\x53\x1b\xb9\x53\x17\x39\xbc\x66\xed\xc1\x47\xfe\x97\xde\xe0\x2a\xe2\xdd\x1e\x3c\xb4\xfb\xcb\xdd\xa8\x3b\xd6\xc3\x32\x1c\x19\x41\x77\x4f\xe7\x3d\xe2\xef\xee\x27\x7c\x30\x9c\x60\x11\x7a\xf7\x8a\x4f\x86\x30\x62\xec\x59\xe2\xef\xdc\x17\x7f\x07\x2d\x77\xec\x45\xe7\xbe\xdf\x1e\xf1\xbb\xfb\xd1\xdd\x70\xdc\x8d\x19\x0c\xe6\x60\xd2\x1b\x75\xf9\xa8\x37\xfe\x0b\x6f\x8f\xcd\x10\xff\xcb\x7d\xdb\x3e\x67\x47\x1a\xbd\xb1\xfb\xac\x87\x22\xf6\xfc\xe3\xf0\x3e\xe6\xe3\xf7\xc3\xfb\xfe\xd5\xde\xa1\xd2\x43\xd9\xe5\x57\xdd\xeb\x6e\x67\xd2\xfb\xb9\x1b\xe9\x2f\xf1\xf6\x78\x7c\x7f\x0b\xc3\xcb\x3a\xc3\x31\xc8\xb6\xb7\xfb\x7d\x3e\xe8\x76\xba\xe3\x71\x7b\xf4\x91\x8f\xbb\xa3\x9f\x7b\x1d\x18\x9d\x51\xf7\xae\xdd\x1b\xa1\x18\xfd\x68\x84\x9a\xee\x7a\x8b\x5d\x86\x4a\xf7\xf7\x83\xbe\x1e\x81\x51\xf7\x5f\xee\x7b\xa3\xfa\x42\xe1\xfd\xf6\x07\x50\xad\xbf\x19\x75\x61\x80\xbd\x75\xc1\x3e\xf4\xfa\x7d\xd0\xb3\xaf\x2f\x8e\xc8\x08\xdd\xbb\xc5\xf1\x91\x7f\x78\x3f\xe4\xb7\xed\x8f\x58\x87\xf4\x91\x96\x0f\x1f\x75\x1d\xbd\x26\xdb\x37\x14\xed\xb1\xb7\x90\xdb\xef\x86\x7a\x34\x9c\x0e\xff\x64\x08\x43\xa3\xa7\x90\x84\xf5\x23\x66\x17\x09\x34\xe3\xa6\x3b\xe8\x8e\xda\xfd\xc8\x4a\xf5\xeb\x45\xd4\xbb\xea\x0e\x26\xed\xfe\x7e\xb1\x7e\x92\xc7\x67\x24\x8f\xef\x84\xf0\x79\x6f\x60\xd6\xd0\x64\xc8\x0f\x6d\xed\x13\xd7\x8e\x77\xf7\x13\x16\xae\x55\x6e\x44\xfe\x8d\xbe\x3f\xfc\xef\xbb\xae\xfe\xf4\xa8\x3b\xb8\xea\x8e\x60\x1b\xb6\x3b\x9d\xfb\x51\x7b\x02\x2f\xd6\xdf\xe8\x8e\xf9\xf8\x7e\x3c\x69\xf7\x06\xdd\x2b\xf6\xee\x23\xf4\x1d\x0e\x84\xde\xe8\xca\xee\x43\x58\xce\xd7\xed\x5e\xff\x7e\x74\x68\x41\xea\x56\x0c\xef\xba\xfa\xf1\x0c\x16\xa6\x9b\x34\x23\xec\xdf\x8a\x60\x9d\xf0\xde\x35\x1f\xdf\x77\xde\xd3\x0c\xeb\x17\xf8\x93\xfb\xbe\x3d\xe6\xef\xba\xdd\x01\x6f\x5f\xfd\xdc\x1b\x77\xaf\x18\xbd\xf3\x6e\x38\x1e\xf7\x68\xac\x86\xf4\x04\x1a\x5f\x7d\x7b\x0f\xae\xa0\x71\x0d\xc5\x6c\xff\x40\x45\xb4\xff\x8d\x7f\xe2\x17\xd7\x93\xdf\x98\xfe\xe5\x89\xfa\xdf\xf3\xcb\x97\xe7\x17\xf5\xfa\xdf\x8b\x97\xdf\xf5\xff\x7f\x97\x1f\xe3\x37\x4c\xb6\x1b\x69\xf9\x1d\x2d\x4b\xcb\xc5\xd9\xd9\xab\xd3\x3f\x8b\xec\xf4\xe2\x75\xa8\xe4\xff\xea\xf4\xe2\xec\xec\x22\xe2\xfa\x03\xda\x68\xbb\x12\x0f\xc9\x9c\x4f\xaa\x22\xd3\xf6\xde\x28\x9f\xca\xa2\xe4\x1f\x92\x74\x25\xd3\x35\x04\xf6\xd9\x07\xa9\xff\xc6\xfb\x52\x9b\x84\x4b\xc6\x7a\x59\x09\xa9\x5f\x80\x8c\xb3\xc6\x66\xd4\x28\x63\xb5\xab\xa0\xcd\x45\x91\x72\x51\xcc\x56\x80\x16\xc3\x3c\x9f\x7a\x8b\x25\xb4\x24\xf9\x8d\xb6\x26\x42\x50\xb0\xec\x88\xc0\xcd\xc6\xc7\xb0\x6f\x02\xc1\x02\xc4\xab\x45\xfc\x41\x14\x49\x0e\x08\xf2\x3c\xb5\x26\xb6\x8b\x68\x30\x34\xe6\x21\x88\x46\xcc\x6d\xc8\xd2\x6a\x79\xdc\xeb\x1d\xa8\xab\xb7\xfb\x75\xb3\x96\x21\x6f\xa1\x8d\x5b\x2b\x2e\x67\x3a\x44\xc9\x3a\x78\x23\x86\x6f\x99\x87\x82\x24\x31\x83\x47\xcf\xed\x4d\xbd\x5c\x8f\x7b\xe1\x62\x21\x31\xa7\x5b\xa9\xa0\x85\x2c\xe8\x38\xfa\x15\xca\x4a\x0d\x41\x39\x02\x52\x6e\x08\x57\xcc\x27\x3e\x4b\x68\x71\xc4\x09\xdf\x00\xe0\x7a\x00\x92\xd4\x3b\xfa\x08\x64\x07\xda\xaf\x73\x26\xfd\xbb\xf1\x55\xc4\xdb\x45\x09\xe6\x38\x76\xaf\xf7\xe7\x1b\x7e\xd2\xf3\x0a\x29\xfe\x7c\xd7\xbd\x61\x37\x45\x5e\x6d\x5a\x36\x0b\x18\x19\x27\x2a\x4d\x1d\x05\x2d\x22\x0d\x94\x69\x1b\x45\x33\xc0\x9e\xb7\x2c\x65\x49\xc6\x80\xc9\xae\x00\xc8\x00\xb0\xe7\x17\x52\x3e\x52\x12\x4d\xaf\x3c\xc5\x45\x9a\x7c\x96\x08\x23\xf5\x43\xcc\x11\xa4\xa0\xd6\x22\xc9\xf8\x26\x4f\xb2\x52\x31\x41\x5a\x7c\x3f\x32\x96\xf3\x0f\xda\xf9\xc9\x8e\x4b\x04\x2b\x2a\xe9\x65\xd5\xed\xdb\x29\x81\x67\xb3\x86\x8f\xd2\xba\xbe\x46\x54\x0a\x23\x2b\x86\xeb\x43\x77\x60\x5a\x2d\x8d\x2e\x6b\xcc\x4f\x48\x7d\x20\x70\x49\x5a\xfa\xfd\x1f\x31\x2a\xef\x48\x74\x9d\xaa\x4d\x5e\x38\x00\x9c\x21\xbb\x86\x2d\x40\x7e\x51\x81\x79\x52\x20\x36\x61\xa6\xe6\x74\x25\x1e\x28\x04\xb6\x01\x1e\x69\xfd\x6e\x3f\xf6\x7d\xcc\x2b\x25\x96\xd2\xbe\xdb\x04\xdf\x37\x85\x74\x32\x63\xf0\xb6\x02\xc5\x1c\xbd\x26\x59\x67\x0d\x11\xcd\x44\x78\x98\x62\x38\x58\x99\x22\x5c\x43\x29\x88\xac\xfc\x8d\x02\xc1\x7a\x83\x87\xfc\xd9\xc1\x1a\xad\xc1\x66\x50\xac\xc4\xdf\x93\xb3\x7c\x2e\x75\xc7\x66\x85\x9c\x27\xa5\x3a\x6e\x31\xf6\x41\x3a\x01\xf6\x34\xdd\x9a\xb0\x3f\x54\x8e\xd8\x95\x86\xd1\x55\xb3\xda\x6c\x6c\xd8\xca\x70\x00\x80\x8f\xea\x19\x80\x5a\xc5\x87\xb7\x42\xcf\xbc\x55\x68\x16\x5e\x0c\x6b\x88\xaa\x12\x61\x69\x3b\xed\x07\x06\xb8\x53\xa3\x74\xbf\x73\x28\x42\xdc\x11\xe5\x16\xb2\x9c\x3b\xcd\x77\x8f\x31\xda\xff\x1e\x73\x67\xd1\x75\x92\xe9\x6e\x46\x7c\xed\xc5\x71\x85\xfa\x2c\xf5\x06\x32\x92\x12\x61\x89\x30\xfe\x12\x87\xec\x85\xab\xa2\x64\x44\x9b\x8e\x9d\x33\x89\x39\x97\x87\xb3\x87\xd1\x07\x12\x68\x73\xc3\x49\x21\x74\x5b\xda\x66\x85\xc6\x4b\xf9\x45\xef\xae\xa3\xa3\x23\x7e\x47\xf8\xe7\x9d\xd1\x26\x58\xae\xb9\x87\xfe\xeb\xff\xf2\x3f\x6d\xa5\x28\x7e\x6a\x1c\x29\x76\xf2\xf8\xf8\x18\xeb\xf5\x5b\x6e\x37\x32\xce\x8b\x65\x2b\xe6\xed\x34\x35\x89\xc8\x42\x2a\x59\x3c\xc8\x79\xcc\x8f\x8e\x8e\x18\xbb\xd3\x27\x19\x28\x2c\x03\x11\x35\x3d\xd8\xa1\xf2\x44\x5a\x49\x97\x37\xb3\x2f\x33\x71\x0c\xa8\x11\x24\x95\x1b\x56\x41\x58\xae\x0f\x92\x4a\x40\x74\x66\xf8\xc9\xae\xac\x36\x8e\xd2\x47\x26\x04\x7d\xf5\xa2\xd9\xe1\x92\xa7\x38\xcf\x27\xba\x0f\x8e\x23\xfe\xa9\xde\x3f\x43\xc3\x6b\x67\x9a\x2e\xc5\xe3\x90\xaf\x9d\x04\x7a\x0c\xad\x26\x06\x60\x6b\x68\x27\x3a\xa2\x0d\x4d\xf8\x09\xdc\xe6\xec\xc0\x6d\xce\xc3\xdb\xbc\x65\xd0\x8e\x4d\x8d\x9c\x4a\x54\x8c\x42\x39\x0e\x80\xc3\x6d\x56\x42\xff\xbe\x14\x70\x20\x41\x76\xbb\x90\x30\xfe\x31\x63\x9f\x3e\xe6\xd5\xb1\xc7\x52\xe0\x01\x92\xa4\x11\x93\x55\xb9\xcf\xaf\x43\x8c\xcf\xfa\xa6\xd0\xe7\xc3\x27\xf8\xcb\x31\x4f\x14\x13\x98\x9d\x48\x66\x30\x9e\x1e\x4a\x18\x21\x5a\xb5\x07\x1c\x2b\x1f\x2b\xeb\x83\xa6\xd3\x24\xfb\x0c\x74\x44\x10\xa6\x84\xad\x21\xf8\xa7\x8d\xa1\x50\xce\x0b\xfe\xc9\x81\xae\x8e\xe3\x90\x19\x17\x82\xe9\xb4\xab\x20\x2a\xc4\x3f\x09\x66\x89\xfd\x6d\x2f\xec\xd0\xe1\xb5\x7c\xfc\x2c\xeb\xa1\x66\x1f\x05\x80\x81\xfa\x5c\x04\xe2\x23\x69\x1a\xe2\x82\x01\xdb\x96\x50\x7d\x68\x70\xb2\x5a\xf0\x59\x5d\x54\x87\xf9\xca\xe3\x80\xb1\x57\x7b\x74\xa5\x60\xbc\x0e\x36\xd6\x2c\x5e\x7b\x5d\xe8\x9d\x5e\xa1\x5c\xb9\xc9\x91\xe7\x05\x15\x15\x79\x99\x44\xc7\xc0\xfe\x40\xcc\xbe\x2c\xdc\x4b\xf6\x2e\x01\x7b\x70\x56\x72\x2c\x11\x7c\x30\x58\xcd\xc4\x90\x66\x34\x59\x9f\xee\xa8\x39\xe9\xb4\xac\xd9\x7b\xf6\xa4\xc1\xcb\x76\xb7\x48\xe3\xd1\xe3\xe1\xc5\x1c\xd2\x14\x68\x3a\x30\x50\x78\x0e\x8c\x86\x1f\xa8\x38\x9b\x41\xf4\xe3\x7a\xd4\xed\x4e\x3e\xde\x41\xf4\xe7\xcf\xdd\xce\x84\xf7\x6c\x4c\xed\x8a\x7f\x82\xe0\xd9\x71\x53\xf0\x8c\xd7\x83\x67\x8c\x82\x67\x5f\x13\x3a\x3b\x18\x2e\x63\xcf\x0a\x97\x05\x91\x25\x1b\x1f\xa2\x60\x40\xfb\x7e\xf2\x7e\x38\x1a\x33\xa2\xa9\x09\xc3\x89\x2e\x9e\x73\x4d\xc1\x23\x13\x87\x81\xe8\x29\xc4\xa5\xbc\x10\x8c\xfe\xa7\x0d\xc3\x30\x0c\xc3\x44\xe6\x45\xf5\x51\xc4\xf1\xbe\x88\xf9\x28\x48\xf3\xd7\xb6\x20\xa1\xbd\xa0\xe6\x2d\x9d\x3f\x26\x7a\xe3\xf8\x86\x12\x10\xd4\x6d\xa4\xbe\x05\xb0\x9a\xa4\x28\xe4\x43\x8e\xe4\x6c\xc8\xb0\xad\x7f\x9b\x3a\xe0\x13\x30\xce\xe1\xc9\x81\x5f\x46\xc6\x39\x02\x90\x46\xa6\x42\x24\x22\xc0\x0f\x16\x97\xf9\x22\xd0\x88\x67\xca\x17\x51\x40\x36\x90\xcd\x3d\xc4\x60\xa3\x6b\x02\x00\x57\x00\x10\x38\x8c\x7f\x50\x3b\xa0\x1b\xa2\x5a\x78\x1a\xd4\x60\x69\x1c\x8a\xf4\x72\x4f\x6a\x05\xd3\xd2\x6f\x0d\x31\x82\x25\xef\x61\x24\xc4\xed\x95\xb5\x92\xa3\x56\x78\x65\xf4\xcd\xc8\xa0\xa8\x06\x53\x62\x2e\x0f\x12\x14\xdd\xe7\xb5\x29\x03\x25\x05\xef\x14\x87\xcd\x8f\x5c\x83\xa1\x82\x00\x4a\x4d\x7f\xba\x9e\xf4\xe3\xc9\x2f\x93\xe3\x16\xab\x32\x90\x56\x95\xf3\xb7\x28\xa8\x3d\xb7\xa4\xd5\x73\x99\x4a\x4b\x22\x70\x58\xcb\x4f\xbf\x8e\x4d\x25\xe6\x71\x21\x4f\x88\x30\x38\xab\xf6\xbc\xc3\x6a\x48\x64\xd1\x93\x86\xfa\x1e\x5b\x01\x66\x9b\x16\x35\xbd\x4f\x3b\x15\x1b\x7b\xa6\x10\x87\xbd\xe3\x61\x30\xf4\x2e\xc4\x90\xbd\x33\x60\x7a\x25\x00\xb2\x19\x0f\x6a\x78\xa2\x23\xb1\xf7\xb8\x33\x30\xdf\x5e\x52\xba\x92\xb4\x32\x9c\xbf\x45\xb8\x3a\xe3\x6d\x04\x84\x01\xf4\x6f\xbb\x0c\x27\x52\x1b\xfa\xc9\x2e\x57\x35\xab\x0d\xcb\x07\xaa\x01\xdc\xb1\x20\x37\x95\xb6\x85\xf9\xfd\xa8\xbf\xe3\xd5\x3f\xca\x29\xdf\x88\xa5\x64\x8d\x9e\x82\xb6\xaf\x08\x73\x90\x68\x07\x4b\x3b\x72\x6b\x91\xcd\x45\x99\x17\x5b\x4b\x44\xe0\xa7\x7e\x02\x5d\x6d\xd3\xdd\x80\x47\x20\x2f\x42\x58\x64\xdd\xfa\x06\xd4\x28\xff\x8f\x4a\x51\x65\x40\x4d\x73\x31\x70\x92\x74\x83\x91\xd5\xb0\xc9\x0f\x62\x95\x0a\xb0\xa8\x40\x06\x02\x20\x77\xbd\x08\x44\x42\x92\x46\x78\x9e\x5d\xc6\xbc\x3d\x7f\x90\xda\xe9\xd6\xd6\x0b\x1b\x78\x32\xfe\x76\xb4\xac\x70\x93\x1f\xf0\xd0\xbf\xc8\x50\x28\x88\xab\x15\x44\x1e\xe8\x24\x21\xad\x76\xc4\x26\xc2\xd3\xa8\x44\x87\x7c\x9c\x88\x0b\xf7\x4a\xb4\xd7\x8a\x7c\x9d\x13\xc3\x37\x1d\x15\xca\xba\x4b\xc6\x01\x63\x9b\x22\xd1\x5e\x14\x25\xbc\x83\x94\x99\xf6\xd3\xaa\xe5\x52\xaa\x12\xb3\xc1\x56\x66\x09\x00\xbd\x91\xf3\x3f\x61\xf8\x3c\xba\x78\x83\x85\xb1\x4e\xc6\x66\x55\x08\x85\x7b\x37\xa4\x76\xf1\xa2\x06\x0d\x4b\x06\xce\x2b\xd7\x2b\x57\x70\xf0\x23\x6b\xb2\x78\xdd\xef\xba\x68\xca\xf9\xbf\x42\xdc\xfc\xf6\x18\x86\xc6\xfd\xda\xd7\x2a\xd7\xa6\x5f\x5b\x35\x21\x91\xf9\xae\x71\x73\x00\xde\xec\xc3\x96\x99\x50\xcd\x17\x81\x6f\xe6\x78\x75\x2e\x11\xc2\x1c\xc2\xf7\xc1\x79\x8f\xb9\x53\x3d\xcc\x88\x43\x9c\x95\x86\x92\xcc\xf3\x21\x22\x1f\x19\x5d\xfa\x4c\x06\x70\xe5\x79\xc8\x55\x66\x99\xa2\xb6\xd0\xe0\x10\xab\x5c\xa9\x1d\xac\x6f\xb4\x0b\xf6\xdd\xdd\x6e\xfa\xb5\x16\x81\xec\xd6\x47\x36\x97\x05\x08\xc7\xa2\x1b\x8d\xc3\x64\x98\x7f\x02\x6e\x0a\xe6\xd4\x7a\x38\xe7\x3f\xc4\xbc\x83\xf6\x23\xba\x72\xa8\x48\x09\x41\xa1\xc7\x9c\xaf\x05\xba\x12\x28\x68\xe0\x39\xe2\xa6\x5d\x96\x1b\x26\xe7\xc6\x1f\xfd\xe7\x2c\xcf\x96\x59\xa5\xdd\x52\xc6\xae\x50\xd7\x49\x2a\x23\x08\x68\x6b\x6a\x3d\xc4\x13\x34\xcd\x3c\x31\x28\xe9\x5c\x54\x65\x85\x2c\x87\xec\x11\xaf\x50\x7b\x77\x39\x07\x0a\x56\x5d\x58\x35\x0c\x07\xac\x67\x6f\xa7\x79\xfe\xd9\x14\xed\xaa\x6a\xb3\xc9\x8b\x32\x62\xaa\xd4\x67\xb9\xbb\x3c\x55\x69\x10\xe7\x7a\x6d\xea\xc3\x13\x23\x98\xae\xae\x26\xe7\x2b\x99\x6e\x68\x0a\xf0\x80\x0f\xce\xf4\xdd\xc1\x38\x9d\xcb\x07\x99\xee\x19\x92\x69\xb5\x54\x41\x77\xd1\x3f\xc2\x30\x5a\x26\x52\xb8\x9f\xf5\xf6\x20\xd0\x6d\x64\xcf\x14\x17\x43\x64\x80\x5f\xd4\x6b\x47\x96\x33\x6c\xc0\xb0\x2a\xf8\x4a\xdb\x22\x1b\x28\x58\x14\x99\x3e\x40\xa9\x2b\x25\x7c\xc2\x53\x16\xf2\xa3\x08\xfc\xf4\xf4\x94\x4b\x0c\xd8\x91\xf1\xa0\x7f\xf5\xdf\x34\x1d\x15\xbf\xf8\x70\xd9\x39\x3d\x7f\xf3\xe6\x8f\x67\xaf\x2f\xce\x7e\x9b\x44\xd0\x13\xfc\xdf\xaf\xce\x2e\xcf\x6a\xf9\x9f\xcb\xf3\x1f\xce\xbf\xe7\x7f\x7e\x8f\x9f\x0f\x97\x9d\xff\xfa\x7f\x6c\x2a\x57\x3b\x7c\xbd\x4e\x17\x32\xad\x46\xb5\xd2\xe5\x7d\x4e\x66\xe0\x04\xff\x00\xb9\x1f\xfe\x41\xfb\x40\xfc\x83\xb6\x12\x3f\xc8\x29\x88\x31\xe9\x4d\x56\xad\x23\x76\x72\x2b\x94\x12\xb3\x55\xa5\x64\x59\x2a\xde\xb3\x7c\x79\xf9\x82\x4f\xe4\x6c\x95\xe5\x69\xbe\xdc\x46\xf6\x0f\x7c\x20\xc8\x3e\x98\x4b\x3e\x92\xb3\x95\x2c\x66\xc0\xf0\xc3\x7a\x19\xe8\xd4\x96\xc9\x5f\x2b\xc9\x65\xc9\x65\xc6\xdb\x54\x3a\xf1\xd7\x4a\x46\xfc\x2f\x32\xc9\xf9\x7d\x96\x40\x18\xae\xdc\x52\x84\x6f\x84\x0e\xc5\xc8\x46\xf8\xbc\xad\xfc\x78\x09\xca\x60\xae\xb9\x2f\x20\x4e\xf7\x82\x5c\xbd\x0f\x97\x1d\xb4\x58\x9d\x2e\xaa\x17\xec\x35\x07\x99\xcf\x58\x6d\xce\xfb\xa4\x94\xda\x63\x02\xd4\x26\xd8\x1a\xa6\xee\x6b\x0f\xd9\xa9\x4f\x8a\xe5\x7c\x1b\x1b\x3a\x7d\xb7\xe5\xf9\x94\x8a\xa8\x23\xe2\x38\x24\xcc\x1e\x95\xc0\x38\x41\x03\xbc\xef\x4e\xfc\x48\x59\x0b\x4b\x08\x78\x18\x16\x2f\xa4\x98\x47\x8c\xae\xc1\x3c\xf7\x6b\xc2\x20\x90\xbb\x75\x17\xb9\x07\x3b\x6b\x80\x9c\xfd\xc8\xd8\x5d\x50\xef\x04\xd7\x7a\x58\xb4\xb6\xc3\x50\x11\x44\x72\x89\x6c\x21\x34\xcd\x99\xa9\x60\x69\x8a\xa6\x47\x75\x87\x93\x1a\x8f\x9f\xd4\x76\x70\x5e\x18\x77\x9c\x27\x8a\xe9\x3b\x7a\xba\x35\x6e\x65\x13\xe1\xa0\xcf\xad\xe0\xfa\x9b\x67\x80\x98\x09\x88\xec\x58\xd0\xf0\x1d\xe3\xd0\x30\x76\x18\xd7\xd8\x67\x9a\xaf\x25\x04\x2c\x35\xdb\x5a\x7c\xd6\x86\xc1\x39\xba\x7e\x90\x96\x09\xa4\x3b\x69\x2b\x42\x6a\x24\xcd\x09\xf5\xfc\x90\xc8\x47\xa3\x2d\x0c\x94\xc4\x0e\x05\xec\xc3\xaa\x81\x75\x23\xf0\xda\x91\xb8\xaf\xad\x07\xaf\x90\xa7\x40\x7d\x8e\x2c\xea\xa5\x04\xbe\xa8\x0a\xb3\x13\x88\x5c\x77\x3e\x9f\x8a\x1c\x25\x45\x5e\xb8\xa5\xc0\xfc\x42\xa1\xde\x82\x67\xda\x1e\x84\xa7\x46\x5c\x70\xb5\xca\x0b\x4b\xe0\x51\x37\xc2\xd1\xcb\x3c\x59\x6d\xf5\xbb\xe4\x97\x92\x41\xa8\x94\x02\xa4\x11\x8e\x81\x8f\xb7\x6d\x19\x29\x52\x9f\xfe\xd6\x28\x82\x12\x20\x56\x2f\x8a\x43\x23\x30\xcb\xe7\xf2\x47\x7e\xd4\xf1\x53\x07\xff\xfa\xff\x9b\x8b\x52\x9e\xe6\x8b\x53\x33\xb7\xff\xf6\x3f\xed\x4c\x3b\x02\x22\xab\x81\x9d\x07\xc7\xf5\xa7\x78\x4d\xd2\xd2\x5a\x8a\xfa\x00\xa4\x3c\xaf\x5b\xc3\x7a\x07\x00\x61\x60\x40\xaa\xb1\x16\x90\x52\xfb\x20\x9d\x68\x58\xa0\x80\x77\x3f\xea\x39\x03\xd4\xac\x60\x28\x6c\x73\x95\xce\x10\xa3\x49\x94\x71\xa7\xe3\x16\x63\xa0\x99\x6c\x6f\x24\x7d\x15\x5d\x0d\x3b\xf7\xb7\xdd\xc1\x04\x98\xa9\x83\x80\x27\xa2\x05\xa3\x23\xc2\x06\xd5\x42\x86\xec\xb6\xfd\x17\x7d\xa7\xf1\x51\xf7\x6e\xd4\x1d\x9b\x27\x40\xc8\xd3\x85\x32\x23\x7e\x30\x12\x6a\x02\xa1\xec\xd9\x81\x50\xfd\x9c\x20\x0e\x3a\xf8\xd8\x10\x09\x65\x10\xa3\x6c\x4f\x5c\xcc\x12\x43\x93\xb6\xe7\xc3\x51\xad\xe3\x10\x2d\x1d\x0c\x27\xbc\x37\xb8\x1e\xf5\x06\x37\x5d\x78\x32\xc0\xba\x18\x82\xac\xee\xda\x93\xee\x60\x32\x8e\xdc\x50\x8c\x23\x3e\x19\xb5\xaf\xba\xb7\xed\xd1\x5f\xc6\x0e\x93\x85\x7f\x8b\x19\xdb\x0d\xb3\xda\xb7\x34\xc4\x5b\x7b\xa3\x6e\x67\xa2\xc7\xc6\xfc\x8b\xe0\x72\x7c\x38\x62\x07\x21\x72\x9c\x20\x72\xfa\x29\xcf\xe9\x2b\x05\xe5\x9d\x70\x6b\x21\xe6\x72\x2d\x30\xd8\xd9\x70\x95\xae\xc5\x16\xda\x6c\xce\x08\x00\x7d\xb8\xc8\x47\x4e\x18\xe3\x19\x10\x11\x60\x2d\x83\x27\x51\xe9\xb2\xf6\xb5\xa8\x44\xe4\x02\x12\x10\x9e\xf0\xc3\x12\x93\xa4\xc4\x73\xd8\xb5\xc6\x8a\x5c\xfb\x97\x05\xc4\x12\x95\xca\x67\x09\x98\x09\xe1\xdd\xa1\xaf\x5e\x26\xc8\x07\x4d\xd6\xb6\xa2\x19\xef\xe1\x9d\x7e\xc6\xfc\xdf\x9f\xf1\x43\xa6\x8c\x3e\x65\xaa\xd4\x56\xcb\x7c\xb8\xec\x1c\x2b\x9f\x15\xd7\x04\x42\xa7\x72\x06\xc3\x8c\xa4\x81\xfa\xf6\xab\x96\x95\x2a\xf9\xf9\x0f\xda\xda\xfb\xa3\xe3\x1f\x4f\xd6\x28\xfe\x6f\x50\xd0\x98\x78\x86\x96\xde\xdc\xf5\x29\xeb\x65\x81\xdd\x90\xbc\x21\x76\x00\x7d\xa8\x98\x41\x21\xcf\xda\xb3\x2c\x0a\x47\x14\xe2\x8b\xda\x01\x69\xc8\xcd\x5d\xdf\x98\x1e\xa4\x84\x9f\x6e\xc3\xc7\x35\xf0\xc1\x27\xf8\x3d\x03\xa6\x89\xf9\x58\x12\xaa\x1e\x8a\x4d\xfc\x81\xb1\x3c\xba\x79\x9a\xcc\xb6\x14\x85\x32\x51\x21\x7d\xe4\xc5\x9c\x32\xc3\x4a\x62\x6c\xce\x5d\x22\xd7\xed\x7f\xb1\xc1\xaf\x3c\xe3\x7f\xad\xa4\xb2\xb4\x63\x55\x49\x36\x9b\x23\xa7\xc0\x48\x61\x55\x70\x95\x94\xd2\x3f\x5d\xad\xbf\xda\x08\xee\x5f\xe4\x05\x33\x3d\x01\xe9\x4d\xed\xcc\x3f\x3e\x3e\x46\xbc\xbd\x16\x5b\x81\x76\xd6\x9f\x93\xa5\x12\x8f\x31\x1f\x82\x49\x5a\x6b\x09\x76\x86\x28\xa3\xc8\xd3\xc5\xb2\x43\x0c\x53\xe8\xf6\x9c\xe2\x00\xfc\x33\x5e\x25\xff\x48\x0a\x25\xdf\x7f\x7e\xcb\x9f\xf8\x45\x3f\xc9\xaa\x2f\xa7\x6a\xab\x66\x22\x4d\x4f\xb3\xbc\x94\x7f\xeb\x28\xc0\x53\xfa\x5f\xe7\xaf\xea\xfe\xff\xcb\xcb\xcb\x97\xdf\xfd\xff\xdf\xe3\x67\x30\x9c\x74\xff\x97\xd1\x18\x36\x07\x1b\x94\xf6\xfc\x21\xcb\xcb\x3f\x60\x62\x1d\x39\x87\x6c\xa5\x8c\xa1\x03\x22\x7a\x1b\xae\x2d\x52\xa0\x9f\x9e\x6e\x89\x00\xc6\x14\x49\xce\x80\x17\xeb\xd4\xa4\x5a\x80\x5b\x36\xe4\x51\xa6\xcf\x7b\xf5\x88\x3e\x67\x8e\xd7\x90\x10\xfe\xc8\x57\x44\x71\x9a\x2f\xf8\x91\x49\xc5\x68\x3f\xe7\x08\x59\xea\xf4\x69\xe7\xb1\x03\xea\xdb\x00\xf2\xea\xf5\x70\xf7\x13\xf5\x46\x98\x6f\x40\x08\x98\xb2\xf4\x15\x60\xb3\x3a\x61\x28\x03\x54\x39\xa1\x92\xa3\xea\x0b\xf5\xa1\xd5\xf0\x36\xb2\x67\x28\x31\xfa\xb8\xca\x2d\x6a\xc8\x27\x24\x6e\xe8\x02\x84\xe3\xb1\xc8\xba\x26\xe0\x0a\x57\xa4\xe2\x0b\x51\x18\x18\x0e\xcd\x0b\x8a\x1e\xcf\xf4\x7f\xcc\xf5\x7f\xfc\xbb\x9e\x86\x7f\xf7\xe1\x13\xb5\x27\x59\x75\xdc\x44\xf2\x87\x0b\x4c\x5a\x3d\x5c\xa0\x56\xfa\xc3\x65\xfc\x85\x7b\xf0\xc2\x96\xc5\x85\x78\xc2\xd3\x75\x88\x48\xcc\x98\x1e\x10\xc5\x27\x79\xf1\x20\xd2\xb9\xfa\x7e\xaf\xfc\x83\xfd\xc4\x2f\x6e\xd2\x64\xfe\x37\x3f\xf2\x83\x9f\xc3\xe7\xff\xc5\xeb\x8b\x57\xbb\xfa\x5f\xaf\xbe\xeb\xbf\xfe\x2e\x3f\x97\x57\xd7\xbf\xf0\x9b\x7e\xef\xaa\xcb\xc7\x88\x9a\xe8\xe8\xd3\xad\xb9\xf6\xd7\x80\x92\xee\x46\xdd\xf6\xed\xbb\x7e\xb7\x06\x8f\x41\x9f\xc3\x79\x3f\xc8\x49\x8b\xc1\x00\xc5\x05\xbf\xbc\xe2\x54\x9a\xad\x9a\xe4\x8b\x98\x2d\x17\xe7\x27\xed\xbb\x5e\x2b\xf6\xa1\xec\xb5\xb2\x79\xa4\xf0\x43\x7b\xd9\x94\x12\x5b\x21\xad\x52\x64\x73\x51\xcc\x59\x73\x27\x42\x06\xee\x45\xae\x4a\x59\xf0\x7c\x23\x33\xfb\x45\x34\xc1\xab\xcc\x2b\x81\x47\x86\x40\xe3\xf2\xc0\x9b\x2c\xc4\x24\xe6\x63\x57\x7c\xa0\x3c\x31\x34\x4a\xc9\xc2\x38\x38\x2e\x1a\xb4\xeb\x59\xed\xc8\x35\xc4\x17\x36\xd4\xdc\x20\x87\xa4\xf4\x15\x03\xc4\x00\x11\x54\x3c\x5b\x17\xa8\x4e\xda\x5f\x93\x42\xb2\x90\x11\x03\x3a\xdc\xd5\x41\x6a\x19\x20\x09\x13\x0f\x22\x49\xad\x7a\xa3\x97\x8f\x8c\x9a\x24\x35\x7d\x21\x20\x04\x0b\xaf\x93\xcc\x08\x25\x2d\x64\xc1\x16\xd2\x32\x7b\xd3\x45\xe6\x83\x73\x30\xd3\x38\x5b\xed\xf6\x14\x9a\xa3\xbd\x1d\xb8\x4d\xa6\x18\x6c\x72\x8d\xc3\xa0\x29\xdc\x89\x7e\x6b\x12\x32\x4e\x0e\x3c\x73\x6a\xf9\x8f\x4c\xc1\x2e\xf0\x38\xee\x29\x76\x27\x8f\x4c\x85\xe3\x48\x01\x55\x58\xfc\x97\xf3\xc5\x97\x67\x6f\x20\x8e\x45\xec\xca\x01\x89\xed\x62\xb5\xab\xc6\xc4\x7f\xcb\xed\x46\x62\x44\x01\x0d\x0d\x5b\x6f\xed\x96\x95\x15\x41\xa8\x75\x95\x21\x5d\x04\xd0\x73\xb8\xf9\xdc\xa7\xc1\x61\x96\x20\x28\x85\xaa\x90\xc7\x89\xf9\xb0\x02\xe0\xaa\x70\xcf\x6b\x9a\xcc\xfd\x6d\x8a\xd9\xc8\x93\x3c\xf0\xb6\xb5\x47\x9e\x44\x90\x03\x19\xe8\x79\xd4\xb9\xf5\x6b\xe8\x37\xcb\xe3\xb8\x23\xec\x61\xe5\x49\x5c\x2d\xc2\x04\x09\x06\x00\x88\xf6\x35\x0c\x63\x4d\x82\x56\x18\xd0\xb6\xc0\xc1\xab\xee\x75\x6f\x40\x95\x89\xec\x22\x3e\x0f\xc5\xf3\x6a\x92\x79\x66\x23\x9e\xd8\x2c\x12\x10\x6d\x1e\xb5\x6a\xc2\x79\x5c\xb0\xe7\x09\xe7\x59\x79\x3c\x7e\x48\x1e\x8f\x85\x13\xff\x55\x4b\x17\x12\x08\x17\x30\x82\xa8\x48\x76\x87\x7d\x38\xd2\xbb\xc3\xc4\xdc\xe0\xb1\x4e\x28\xd0\xd9\xc6\xfa\x9a\x39\x56\xf4\x32\x02\xa4\x19\x8e\x62\x5e\xe3\x2c\x86\x11\xba\x72\xab\xe7\x83\x49\x5f\x5c\xf2\xa3\xda\xaf\x49\x5d\x2e\x72\x61\x1c\x9f\xc3\x47\xfa\x3c\x58\xfa\x2a\x72\x8a\x43\x96\xb9\x2d\xd4\x76\xd0\xdf\xb9\x73\x87\xe4\xa1\xa5\x28\x68\xa7\xed\x5b\x7d\x77\xa6\x9a\x85\x30\x57\xcf\x12\x98\x63\x9e\xc0\x9c\x2f\x27\x67\x55\x01\xbd\xb3\x94\xd0\xa2\x2a\xb8\x56\xdb\x77\x3d\x43\xb6\x09\xec\xea\x3d\xef\xdc\xf0\x18\x50\x0d\x55\x91\x57\x68\x21\x5c\x9a\xe8\x07\x7e\x74\x1b\x4a\x27\x2d\xfc\x2e\x59\x11\x43\x1a\x43\x53\xa1\xe5\xb8\x67\xbd\xd9\x63\x1f\xe0\x13\x90\xee\x33\x7f\x2f\x7d\x4d\x21\x2b\x40\x68\x71\x21\x17\xf1\x4b\x7e\x64\x04\x17\xad\x7c\xdd\x37\xad\xd7\x57\xb0\x5e\x8f\xbc\x4f\x1b\xa5\x3c\x54\x65\x7a\x42\x1a\x0f\x3e\xb4\xc8\x0b\x76\x40\x16\x0f\x78\xc5\x80\x80\xc6\x52\xb6\xe2\xa0\x58\x42\xef\x00\x8d\xaa\xdf\xc8\x0c\xe2\xa8\x7e\x7a\xea\xdf\xaf\xf3\x79\x95\x4a\xe5\xab\x3f\x44\xf5\x18\xb2\x35\x94\xd8\xdc\x16\x94\x98\xa4\x8d\x25\xc7\x9a\x15\xc9\xa6\xa4\xad\xe9\x29\xc8\x20\xb6\xd8\xd5\xf5\x11\x7b\xb5\xf0\x8d\x92\x5a\x5f\xbc\x99\x79\xcd\x8f\xf4\x2c\x98\x69\x81\x19\xe9\xe9\xd6\x60\xf4\x38\xe2\xbd\x6c\x66\xb1\x87\x96\xb3\xa2\xdd\x99\xf4\x7e\xee\x4d\x7a\xdd\x31\x63\x97\xf1\xb9\x91\x20\xe5\xa7\xdf\xa2\x36\x47\xab\xf0\x58\x31\x7f\x11\x3c\xad\x37\x17\xc2\x89\xd1\x2e\x25\xe7\xd7\x48\x46\xf1\xcb\xf8\x12\x5a\x61\x53\xc5\x80\x3d\xa5\xc2\xbf\x13\xd1\x7a\x8e\x4c\x1d\x7f\x86\x4c\x1d\xdb\x91\xa9\x3b\x69\x1e\x4a\x7e\xfe\xe6\xcd\x9b\x56\xc4\xad\x80\x2a\xc9\xd2\x19\x9a\x45\xbd\x8f\x98\xe1\x41\xa9\xb3\x42\xd6\xa8\x20\xcd\xc1\x36\x13\x19\xde\xb4\x40\xbb\x19\x8e\x8b\xa3\x66\x25\x3a\xce\x3d\xda\x79\xa8\x3b\x55\xea\x55\x5b\xae\xb0\x32\x17\x47\xf0\xe5\x5b\xc6\x4e\xa6\x2d\xfe\xdb\x4a\xeb\x31\x76\x32\x6b\x19\x1c\x28\x9a\x25\xd9\xd6\x0f\x22\xe1\x29\x61\xb3\x46\xd6\x74\xc5\x99\x6f\x46\x9a\xea\x37\xe9\x59\x88\xe8\x0d\xf3\x16\x29\xbb\xa7\xa9\x3f\xe2\xe1\x32\x7c\x9e\xb2\x1f\xf3\x2e\x15\xbd\xe1\x8a\xca\xf1\x66\xae\xf2\x47\x14\xad\x52\x89\xa3\x02\xdd\xa7\x29\xa1\xf7\xcf\x45\x20\xd4\x6b\x52\x69\x77\xa3\xe1\xcd\xa8\x7d\xfb\xe2\xaa\x3b\xea\xfd\xdc\x9e\xf4\x7e\xee\xf2\x0f\xc3\xd1\x5f\xc6\xde\x26\xab\xcb\xf5\xb1\x1d\xb9\x3e\xaf\x99\x35\xd6\x3f\xbd\xa1\x7c\xb1\x3d\x5e\x13\xdb\x63\xe1\xd9\xb8\x6f\xb3\x21\x20\x7d\xdf\x6e\x33\xc0\x0c\xd6\xa4\xb6\xc7\xf7\x14\x00\xfc\xaa\x6d\x09\x17\x5f\xed\xb6\x7a\x4a\x52\xf2\xf0\x6e\x34\xac\x44\xec\x89\xdd\x58\xb3\x64\xfe\x27\xec\x4a\x00\x88\x1d\xd8\x32\xf5\x2e\x0b\x5a\x85\x87\x45\x31\xeb\xdf\x7a\x6a\x0b\xb1\x27\xb7\x90\xde\xd9\x0d\x32\x87\x21\x26\x7f\x5f\xa3\x77\xd5\x17\x59\x93\xfa\x22\xff\x06\xf5\xc5\x13\xb9\xd3\xae\x06\x53\xb8\x89\xd4\x9c\xe7\x96\x44\x0b\xa9\x02\xd9\x21\x6d\x46\xfe\xb5\xda\x8c\x27\x0b\x6c\xd8\xdf\xe2\xc0\x65\x1e\x4f\x36\x1d\xb8\xfa\x0d\xcb\x96\xa1\x5c\xab\x77\xd7\x52\xca\x17\x52\xcc\x15\x24\x5b\x45\x36\x27\x15\x0d\xbc\x2b\xd3\x2d\x0a\x1e\x16\x55\x16\xb1\x6d\x38\x82\x09\xd6\x85\x42\x74\xa7\xd0\xc6\x93\x11\x10\xb6\xb1\x07\xef\x41\x18\xe7\x00\x6d\x93\x04\x49\x7f\xa9\x02\x0b\xce\x84\x2c\xcb\xab\x6c\x46\x1a\xe8\x8a\xce\x23\x7d\x04\x1d\x39\x14\x05\xc4\xd3\x7a\x83\x49\x77\xd4\x26\x52\xa6\xde\xa0\x83\xd7\x78\x04\xb0\x32\x44\x5e\xf0\x51\x77\xdc\x1d\xfd\xdc\xbd\xe2\x01\xda\x85\xf5\xc6\x48\xf0\x05\x8c\x51\x3b\x20\x97\xe7\x94\xf5\x39\x4e\x2c\xe6\xe0\x2c\xb1\x4f\x13\x86\x4d\xf0\x89\x89\x70\xf2\x2c\x4e\xc4\xbe\xe7\x6e\xd4\x1b\x8e\x80\xcc\x69\xd2\x1d\x30\x20\x58\x1a\x8f\xe9\xce\xd9\xd3\xd1\x71\x17\x1f\xe9\xc5\x15\x89\x5b\x89\xdf\xdd\xbf\xeb\xf7\x3a\x96\x5c\x04\x2b\x04\xaf\xef\xfb\x7d\x3e\xe9\xfe\x62\x09\x94\x76\x54\xe9\x07\xc3\xc1\xa9\xed\x30\x8c\xc9\x18\x30\x3c\x27\xa3\xee\xbf\xdc\x77\xc7\x13\xb0\x26\xd9\xf5\x68\x78\xcb\x7b\x83\xeb\xe1\x3f\xeb\x37\xc7\x9d\xe1\x6d\x2b\x3e\x62\xec\x64\x85\x6a\xac\x81\xae\x68\x9d\xe0\x55\x5f\xa9\xbb\xfa\x9b\x35\xc9\x51\xe6\xb1\xcc\x4e\xab\x92\x62\x15\x79\xd3\x92\x8d\x79\xef\x90\x94\xa4\x09\xa6\x3e\x21\x25\xc9\xbf\x52\x4a\x92\x95\xfb\xa4\x24\xc3\x02\x8c\x43\x52\x92\xb5\x9b\x50\x59\xcb\x5f\x5f\xd5\xfe\xcc\xe0\xb5\xdb\x0e\xea\xcc\x6a\x06\x44\x6d\x50\x94\xe1\xf1\x28\xc2\xe0\x04\x14\xcc\x19\xd7\xd4\xaf\x28\x5e\x49\x01\xd0\x9e\x1a\x3e\xd6\xc8\xe3\x1b\xef\x40\x6f\xbf\x10\x31\xa6\xff\x7d\xff\x0e\x6a\x63\x27\x43\x0f\x14\x76\x37\x1a\x4e\x90\xe3\x0c\xd6\x55\x6f\xcc\x87\xd7\xd7\x40\xa1\x35\x1c\xf4\x3f\xf2\xbb\xfb\xd1\xf8\xbe\x3d\x98\x30\x22\x6f\x7b\x72\x05\x3f\x67\x53\xb1\x27\x36\x15\x7f\xd6\xa6\x6a\xe3\x1a\x87\x1d\xe2\xb8\x00\x81\x2b\xed\x5d\x97\x0f\xdf\x21\xd5\x17\x87\x3d\x10\xec\xa1\x21\xd0\x70\xbd\xfb\xc8\x3b\xc3\xc1\x44\x3f\x72\x70\x03\xef\x60\xde\x3b\xf4\x2b\xf8\x49\x92\x2d\xf2\x7f\x86\xc3\x78\x96\xaf\x5b\x31\xbe\x88\x6c\xca\xb8\x01\x72\x67\x0f\x23\xf6\xbc\xc3\x88\xfb\x87\xd1\xfe\x43\x82\x85\x43\xcc\xf7\x1c\x12\x7b\xce\x84\x98\x31\x28\xf2\xbd\xba\x07\x76\x3a\x34\x8f\x47\x7a\x38\x3a\xfd\xe1\xf8\x7e\xd4\x35\x25\xc2\x37\xc3\x9f\xbb\xa3\xc1\x6d\x77\x30\xa9\xad\x96\x51\x57\x8f\x5c\x07\xc3\x78\xed\x31\x1f\x77\x27\xba\x0d\x93\xf7\xbc\x37\xd0\x9f\xbb\xea\xe1\xab\xf8\x49\xa7\x75\x72\xde\x3a\xe9\xf5\x5a\xa6\x4d\x74\xb0\xf7\x06\x7c\xd2\xed\xbc\x1f\xf4\x3a\x80\x82\x9b\xb4\xf5\x62\x63\x9d\xe1\xed\xdd\xfd\xc4\x23\x4d\xe3\x9d\x3e\x50\x3e\xb6\x27\xfc\xea\xba\x3d\x1a\xf3\x8b\x97\x17\xf1\xc5\xc5\xeb\xd3\xd7\x67\xe7\x97\x91\xe1\xbe\xd3\x2f\xed\xdd\xf6\xfa\x6d\x98\xc7\xf1\x7d\xa7\xd3\x1d\x8f\x87\x23\x86\x5f\xc6\x97\xbd\xef\xf2\xeb\xf6\x28\xe2\x57\x43\x18\xe4\x41\x7b\xdc\xd6\xbf\xe0\xe3\xfb\xbb\xbb\x7e\x57\xf7\x31\xe6\xf7\x03\x18\xd7\xf1\xfb\xee\x55\xfd\x02\x62\xf7\x83\xab\xee\xa8\xc6\xe0\xd8\x6f\x7f\x18\x5b\x46\xbb\x01\xa0\x1e\x81\xf4\x71\x6c\x0f\x04\xce\xf9\xb7\x5f\x7a\x47\x68\x8d\x1a\xbf\xa4\x46\xe2\xee\x3b\x21\x3b\xd6\x40\x92\x05\xe1\xc2\xbc\x60\x5e\xb0\x02\x62\x37\xfb\x25\x27\x15\xbf\x8c\x51\xca\x4d\x9f\xf8\x7b\xbc\x8e\x40\xd4\xce\x1d\x3c\xda\xd1\x38\xf7\x05\xb7\x92\xf2\xab\xd5\xec\x02\xc6\x05\xf6\x94\xfa\xdc\x93\x3d\x78\xcb\xf3\x22\x62\xec\xe4\xa2\xa9\x59\x5f\x2b\xff\xa5\x3d\x16\x34\xdd\x33\x5f\x5f\x61\x1b\x19\x0e\x98\x06\x41\x2f\x72\x24\x49\xd1\x8b\x84\xe8\x91\x47\x87\xc4\xbd\x58\x03\xff\x78\x04\x86\xf9\x3e\xb1\x3b\x5f\xe4\x31\x18\x4d\x16\xd0\x55\xec\x0a\x3d\x3d\x77\xda\xf3\x8c\x09\xa3\x12\x8c\x42\x96\xa2\xd0\x8e\x37\xc4\xc9\x82\xf4\x25\xd8\x85\x68\x9c\x9b\xa1\xbe\xdc\xb7\x02\x12\x83\xe9\x26\x2a\x18\x27\xf5\xe5\x0a\xc5\x17\xe4\x5a\x79\x3c\xe3\xe1\x7a\x09\x72\x8a\x27\x90\x3f\x80\xb2\xef\x0c\xd7\x3f\xfc\x67\x9a\x3f\x1a\x0a\xea\x05\x10\x62\x64\xae\xf4\x96\xed\x24\x2c\x90\xaa\x7a\x11\x36\x89\x1c\x72\xe4\x26\xa9\x6f\x27\x2f\xf6\x87\x42\xa6\xd0\x45\xb0\x93\x85\x5d\x4b\x54\xca\x5e\x50\xdd\xa7\x27\x04\x77\x19\x5f\x9e\x4c\x5b\x7a\x49\x82\x80\x5a\xdc\xc2\x48\xcd\xa4\x16\xec\x6c\x52\xe8\xe2\x4f\x2a\x74\xb1\x67\x2a\x74\xf1\xe7\x2b\x74\xb1\x67\x28\x74\xf1\xaf\x50\xe8\x62\x4f\x2a\x74\xd5\xbf\x0d\xb3\x8d\x3e\x69\x83\xe4\x5d\xed\x83\x50\x75\xe4\xcd\x57\x83\x0a\x1e\x6b\x50\xc1\xe3\x4d\x2a\x78\x20\x31\x61\xb5\xf3\x9a\xd4\xf0\x98\x55\xc3\x0b\x02\xd5\xbb\xfa\x77\xc8\x80\xae\x02\x8e\x17\x2f\x63\xe7\xe5\x7b\x22\x2e\x1f\x40\xd9\xc2\x54\xe0\x7b\x7e\xa8\xa9\x64\xd6\x43\x25\x41\x8d\xda\x17\xe4\x33\x3c\x15\x69\x9e\x2d\x99\x9d\x5a\x6f\x30\xc8\x81\x7e\x42\xca\xa7\x16\xe1\xaa\x5d\x2f\x35\x99\x1e\xf6\x2c\x99\x1e\x8c\x82\x23\xe9\x06\x0c\x5d\x5e\x58\xb1\x1e\x3b\x0f\x11\x7b\x32\x2e\xab\x9f\xb0\x63\x34\xd7\x02\x69\x70\xb6\xb1\x1a\x42\x38\x4c\x76\x3d\x25\xdc\x13\xa8\xba\xb1\x5f\x25\xdc\xc3\x1b\x84\x7b\xd8\xf3\x85\x7b\x6a\x61\x26\x2f\xd0\x60\x5a\xff\x1b\x45\x1a\x9e\xa7\xfe\xb6\xab\xae\x16\x2e\x1e\xb6\x33\x59\xbf\x46\xfe\x8d\x39\xec\xdc\x01\xf9\xb7\x27\x1b\xb5\xe3\xc2\xf1\xff\xaf\xca\xbf\x61\xd9\xfe\x6d\x6f\xdc\xe9\xf6\xfb\xed\x41\x77\x78\x3f\x66\xec\x87\xf8\x5c\xdf\xe0\xfb\xb4\xc8\x60\xac\xd2\x2a\x2b\x45\xb1\x85\x12\x4c\xe2\x1f\x38\x2c\x99\xf6\xd4\x99\x12\x90\x11\x3c\x21\x87\xc6\x9e\x2f\x87\xc6\x9f\x27\x87\x56\x6f\xa2\x27\x81\xc6\x51\x02\x8d\x0f\xbe\x42\xd2\x8e\x1d\x5c\x81\x3b\x5b\x02\x51\xbc\x68\xdd\xd8\xad\xea\xba\xbf\x13\xfc\x05\x9c\x17\x7f\x48\xf2\x34\x90\x20\xbf\x8f\xc7\x31\xa5\x2b\xc9\x20\x82\xd2\x3a\x17\x9a\x4f\xc5\xa3\x02\x4d\xf8\x8b\x67\xca\x9e\x1c\x6a\xf4\xdf\x5b\xfe\xc4\xb4\xad\x59\xf2\x84\xd7\x24\x4f\xd8\xaf\x94\x3c\xe1\x4d\x92\x27\xec\xdb\x25\x4f\xf8\xae\xe4\x09\xfb\x56\xc9\x13\xbe\x47\xf2\xe4\x87\xf8\x32\x04\xd8\x24\x46\xfc\x75\x96\x43\x72\x40\xce\xc9\x44\xf5\xca\xbc\xf4\x1a\x31\xd3\x3f\x2e\x31\x02\xcf\x3a\x22\x4d\x16\x79\x91\x25\xa8\x56\x6b\x32\x49\x20\xb7\x9b\x13\xd7\xa0\x48\xf9\x7f\x54\x45\xa2\x8c\x4e\x29\xb5\xcd\x3c\x83\xbb\x67\x18\x4e\x3c\x6d\xe5\x00\x6a\x4b\x9b\xaf\x52\x1b\x05\xda\x2e\x2d\x73\xba\x19\x65\x43\x56\xac\xd6\x43\xce\xf9\xcb\xd8\x93\x8a\x80\xe4\xf9\xcb\xf8\xfc\x79\xf2\x0d\xda\x83\x0f\xb4\x21\x78\x5d\x1b\x82\xd9\xe0\xce\x70\xc4\x77\x92\x86\x87\x04\x1d\x78\xa3\xa0\x03\xf3\x92\x90\x10\x5f\x83\x82\xc1\xda\x73\x0f\x88\x3b\xb8\xd8\x11\xfb\x95\xe2\x0e\x7c\x57\xdc\x81\x7d\xab\xb8\x03\xdf\x15\x77\x60\xcf\x13\x77\x78\x62\x28\x38\x09\x3d\xb0\xba\xd0\x83\xf9\x9e\x29\xb9\xac\x7d\xed\x80\xe6\x03\xc3\x49\xfb\x36\xcd\x87\x97\xfa\xe0\xfc\x2a\xcd\x07\xa8\x13\x6d\x8e\xfc\x44\x2c\x50\x77\xf8\x5b\x8a\x3f\x78\xc3\xb3\xb3\x68\xff\x5b\x88\x40\x1c\xea\x80\x13\x83\x60\xbb\x6b\xfb\x9b\xc5\x20\x98\x15\x83\xe0\x5f\x23\x06\xd1\xd8\x50\x46\xc7\x83\x15\x85\xe0\x35\x51\x08\xfa\xd6\xf8\x59\xa2\x10\xac\x2e\x0a\xc1\x9f\x23\x0a\xf1\xf7\x86\xcc\xff\x8f\xfa\x89\x5f\x74\x84\x36\x41\xc4\x6f\x58\x01\xf2\x44\xfd\xdf\x0f\xaf\x5f\xd7\xf5\x1f\x2e\xcf\x5f\x5f\x7c\xaf\xff\xf8\x3d\x7e\x68\xf6\x11\x79\x66\xec\x6a\xc2\x9e\xf9\x04\x2a\x8a\x0b\xa0\x58\x01\x8e\x7d\xc7\x2c\x2a\x6c\xd8\x0e\xa5\xe7\x8d\xf7\xa8\x0d\x3f\x0a\x71\x34\xd1\xc0\x20\x17\x74\x10\xd1\xf5\xb8\x99\x0b\x89\xca\xf8\x06\x53\x4b\x51\x3d\xcb\xda\x8f\x34\xa8\x1e\xd6\x36\x08\x9c\xd6\x63\x8d\x8b\xbc\xa0\x58\xfb\xa1\xbe\x52\x27\xa9\xfd\xc0\x86\xe6\x70\xe9\x41\x26\x80\xdd\x0f\x7a\xbf\xf0\xa1\x8d\x0e\x8e\x21\x3a\x48\xf8\x19\x0c\x1a\x4a\xc3\x03\x79\xfe\xea\xf4\x5d\x52\xf2\xbb\xab\xbb\xd3\xf3\x73\xde\xb9\xbb\x47\x72\x79\x60\x06\x35\x92\x78\x06\x74\x79\x79\x01\x9f\x6d\x7c\x7a\x44\x61\x58\x53\x28\x0e\xb6\xb6\x09\x6c\xc0\x37\xf0\x73\xac\xd7\xeb\xc1\x2b\xbc\xdf\xf1\x9f\x6b\xb1\xa9\x7a\x60\x53\xfd\xc8\xd8\xe5\xc5\xe9\x34\x29\xf9\xe5\xc5\xcf\xf0\x55\xc6\xce\x5f\xf1\xa9\x69\xcd\xcf\x46\xbc\xef\x3c\xe2\x17\x11\xbf\x8c\xf8\x0f\x11\x7f\x19\xf1\x57\x11\x7f\xcd\xd8\xa1\x51\x5d\x8b\xcf\xe0\x22\xf0\x65\x25\x20\x7c\x24\x29\xcd\xbd\x5e\x27\x25\x26\xe3\x61\xd8\x90\x59\xd3\xa1\xc2\x13\xe5\xd5\x19\xc0\x34\x1f\x78\x0b\x52\x45\xf8\xe8\xb0\x1a\xb6\xd2\x03\xdf\xef\x04\x33\x49\x83\xa3\xc0\xd0\x6e\x40\x1e\x0d\x6a\x81\x18\xf4\x8a\x19\xb3\x65\xff\x27\x9d\x56\x73\x6b\xb0\xcb\x17\x67\x67\xe7\x40\x90\xd5\x4c\x36\xcf\x58\x8d\x7d\xd5\xe8\x57\x24\x99\x47\xc5\xeb\x07\xb2\x55\xc4\x0f\xb2\x22\x81\x36\x85\x73\xd5\xc2\xb4\xd6\x3e\xdc\x1c\xac\xf0\xb5\x2c\x7f\xac\xb7\x47\xd5\xf9\x73\x77\xf9\x8e\x42\x46\x5d\x89\x91\x7e\x37\xea\xcc\xa0\xe4\x1c\x61\x20\xd4\xcc\xba\x57\x13\x06\xca\xb5\xcb\xa1\xd9\x76\xc6\x47\x35\xd2\xd3\x16\x12\x0f\x03\xd9\xd4\x00\x03\xd3\x63\xdf\xd2\x80\x46\xca\x42\x46\xe1\x03\x44\xcd\x3b\x46\x07\x3b\xd6\x36\x1e\x1d\x70\x2b\x32\xa6\x57\x40\x23\x71\x28\xd7\xcf\x4e\x72\x04\x22\x49\x51\x02\x55\x86\x1f\xa0\xf0\x59\x44\x00\x22\x61\x80\x48\x61\xc3\x3d\x66\x58\xfd\x44\x24\x9a\xa4\xca\x24\x3a\x2f\x1d\xee\xde\xe3\xae\x7d\x90\x69\xbe\x91\xa0\xd7\x9c\x3f\x66\x58\x58\xd2\xbc\xc5\x18\x6e\x31\x9f\x3a\x96\x28\x60\x0f\x9e\xa7\x59\xee\x3e\x0b\x6b\x8a\x14\x98\x3d\x82\x59\xc3\xdc\x61\x10\xea\x32\x9b\xe7\x05\x86\x38\x91\x32\xd6\x13\x6a\xa9\x95\x57\x04\x4a\x2b\xb8\x29\x98\x3d\x1c\x0f\x30\xc9\x36\x51\xcf\x58\x60\x83\xf6\x0c\x4c\x32\xdc\x43\x59\xbc\xfb\xc8\x3b\x6d\x6d\xbc\xb6\xd1\xd1\x19\x00\xae\xa0\xdd\x07\xef\x21\x36\xa2\x64\x06\x6f\x31\xe6\x9f\x88\x84\xfd\xd8\xba\x7e\xbb\xf4\x42\x01\xfb\x90\xf3\x68\x1b\xac\xfe\x7d\x1e\xed\x13\x72\x85\x6c\x9f\x47\xcb\x75\x97\x01\x10\xd1\xee\xdd\x76\xaf\x42\x3a\xf6\xf1\x7b\xed\x36\x1e\xea\xed\xd3\x9c\x40\x9e\xcf\xe4\x39\x52\xdd\x5f\xba\xb7\x77\xfd\xf6\xe8\x63\xb4\x9f\x2a\xe8\xe4\x09\xd7\xfe\x6e\x34\xec\xdc\x8f\x00\xd1\x80\x4e\xc1\xbb\xf1\xa4\x37\xd1\x8e\xe1\xcd\x70\x78\x05\xc3\x8b\x7e\x6e\x77\xfc\xd6\x3a\x4b\x88\x07\x69\x4f\xda\xe0\x74\xde\x8d\x86\xd7\xbd\xc9\xf8\x2d\xa0\x62\xee\xc7\x3d\x70\xfe\xa1\x9f\xa3\xfb\x3b\xdd\xd1\x16\x7b\x3f\xfc\xd0\xfd\x59\x3b\xad\xc8\x29\xaf\xc7\x14\x00\x43\x00\x1c\x19\x8e\xc0\x1f\xd1\x43\x00\x43\x1e\xf1\x0f\xef\xbb\xe0\xcf\xf4\x06\xb8\x0a\xda\xc0\x8a\x04\x18\x12\xe6\x7d\x4c\x7b\x5c\xc3\xd1\xc4\x97\xfb\x1b\x74\x6f\xfa\xbd\x9b\x2e\x84\x0c\x46\x4e\x5d\xb3\x65\x29\x93\x7a\xf8\xda\x0f\xed\x8f\x3b\xbe\xe5\x75\x08\x1b\x74\xbe\xd6\xd3\x7e\x14\xc3\xe1\x36\x6e\x54\xfc\xe2\xe6\xae\x7f\x7a\x1e\x9f\x9d\xe6\xc5\x29\xc8\xc4\xfe\xed\x1d\x81\xa7\xea\xbf\x5f\x9d\xbf\xaa\xd9\xff\x3f\x5c\x9e\x7d\xb7\xff\x7f\x97\x9f\x9b\xc1\xfd\x3e\x80\x26\x23\xbb\x4f\x9b\x7d\xd7\x72\x5a\x54\xfa\x0e\x3e\x7f\xf3\xc7\x37\x9e\x31\x44\xc2\x18\x7f\x7c\x73\x80\x42\x03\xee\x83\x97\xe7\xfc\xba\x10\xd9\xe7\x34\xc9\xf8\xb8\x8c\xf8\x75\xb2\x28\x57\xfc\x3a\xcd\xf3\x22\x62\xef\x72\x55\xea\x4f\xde\xb6\xf9\xd9\xc5\xf9\xf9\xd9\xe9\xf9\xe5\xd9\x39\xbf\x1f\xb7\x19\xeb\x3e\xc8\x62\x9b\x67\x32\x94\xe0\x36\x89\xe1\xe7\x54\x0c\x39\x83\xce\x72\xcb\x23\xad\x07\x40\x3b\xa8\x6a\x92\xd0\x9a\x84\xaf\x88\x19\xbb\x2b\xa4\x58\x4f\x53\x89\xc6\xa5\xd5\x60\x31\xa5\x8d\xf0\xec\x75\xae\x4a\x77\x0f\x79\x19\x7e\x0c\xf5\x02\xd8\x1e\x49\x1a\xd1\x12\x63\x6b\x59\xcc\x28\x9a\x8d\x21\x78\xfa\x06\xa4\x9a\x90\x4d\x5b\x95\x11\x70\x44\xed\xa9\x1f\xf6\xca\xe0\x59\xe9\x99\xd5\x98\x56\xd2\xce\xd9\x5c\x5f\x90\x39\x57\x2b\xc3\x3f\x86\x08\x96\x50\x1c\xed\xf4\xd4\x94\xf3\xaa\xaa\x90\x3b\x3c\xfe\xf0\x59\x53\x90\x96\xa0\x3f\x57\x28\x74\xad\xf6\x34\x8c\x6c\x6c\xe6\x71\xf1\x37\xad\x86\xe3\x1a\x39\x1a\xd5\xc3\x52\x39\x22\xa5\x3d\x40\x89\x99\x19\x5e\x7a\x74\x16\x90\xf0\x12\x67\x2b\x0e\x14\xd0\x12\xa8\x77\xc0\x01\x70\x02\x76\x65\x9e\xc7\x8c\x7d\x58\xc9\x8c\x3f\x82\xcc\x97\xf8\xbc\x23\x11\x07\xaa\x6c\x02\x58\xc7\x16\xb2\x28\x28\x53\x40\x83\x18\x91\xc4\x59\x32\x93\x31\x1f\x7b\x32\x61\x08\xb4\xdd\x3f\x3f\x3e\xbb\x80\x1d\xe2\x1a\x0f\x2b\x18\x71\xf8\x1e\x98\x46\x00\x5e\x3d\x8a\xad\xb6\x7d\x94\x0c\x50\xb5\xb5\x16\xdb\xe7\x98\x2a\x07\xcf\x56\x87\x7a\x1e\x91\xf1\xa5\xc4\xd4\xc3\xc2\x4a\xc0\x01\x0a\xde\x95\x25\x88\xcc\xac\x8a\x60\xe6\xc9\xfe\xdc\x24\x92\xa4\x27\x12\xa0\xb4\xcb\xe4\x23\x0f\xa4\xb2\xdf\xba\x22\x54\xfd\x38\x6d\x81\xda\xe7\xce\x73\x62\x41\x80\x8c\x22\x88\xeb\xe4\xfa\x8b\xa5\x9c\x05\xb0\x66\x18\x7b\x80\xfe\x98\x61\xf2\x61\x09\xf8\xf0\x45\x5e\x4c\x13\x28\x07\xd6\x07\x40\x99\xb3\xb9\xcc\xb6\x86\x51\x5e\x49\x0f\x37\x4d\x62\xdb\x24\x0d\xa1\xaa\xa2\x90\x16\x0e\x86\x9f\x82\xc5\xab\xc2\xb7\xb8\x6a\x5b\x38\x50\x28\xc7\x67\xb1\x0c\x49\x9a\x40\x92\x99\x56\x97\x19\x4f\xef\xbc\xb1\xb3\x14\xec\x20\xc8\x7e\xd3\x87\x1d\xb1\x3d\x63\xd7\x80\xae\x12\xeb\x4d\x2a\xa3\x43\x0f\xe3\x82\xf0\x56\x4e\x11\xcf\x48\x20\x2d\xb5\xe3\xae\xf4\x3c\x23\x2a\x0f\xd8\x15\x6c\xc1\xc3\x32\xa1\xa5\xe5\x95\xde\x98\x2a\x1f\x03\x26\xf7\x97\x21\xec\x23\x06\x5f\xad\x2d\xd4\x72\x25\xb7\xb0\x87\x22\xbb\xce\xbc\xb5\xb5\x13\x72\x69\x63\xe2\x0c\x1f\x55\x4a\x7c\xe5\x9a\xf2\xf9\x34\xfe\x20\xe3\xd0\xb0\x10\xc8\x77\x7a\xcc\xb9\x2a\xe5\x46\xfd\xc8\x4f\xce\x5b\x9e\x2f\x57\xd6\x48\x31\xe6\xfc\xe4\xa2\xc5\x10\x4b\x87\x2b\xc1\xd7\x9d\x84\x30\xcf\x12\x30\x3a\xfa\x8f\x29\x28\xb0\x85\x59\xec\x7a\x59\x96\xf1\xed\x3c\x40\x8e\xe5\x0b\x40\x22\x26\x84\x40\x42\xcd\x18\x9e\x49\xc7\xca\x74\xc4\xe2\xec\xaa\x02\x57\x34\x6c\x36\xb3\xa2\xcd\x8a\x02\xca\x5f\x69\x2e\x32\x27\x42\xa0\xec\x60\xe3\xb1\x9b\xe5\xae\x92\x0b\x0b\xda\xcd\x59\xec\xab\x29\xee\x9c\xd6\xb6\x4c\x61\xba\x05\x02\x14\xa0\xe2\x4d\xa9\x6c\x6b\x23\x14\x26\xfa\x5d\xf3\x12\x88\x47\x98\x15\xa2\xcf\x1f\xd8\xc1\xd0\x96\x47\x33\xfb\x78\x4e\x79\x45\x0c\x4e\xd9\xcb\xa4\x8b\x89\xc8\x60\x9a\xca\x35\xdc\x4a\xe8\x91\xcf\xd9\x74\x6b\xe9\xad\x0c\xbc\xa3\x90\x8b\x54\xcf\x7b\x5e\x93\x28\xa3\x33\xfe\x58\x3b\xf4\x55\x69\x8a\xd6\xd9\x53\x34\x0d\xfb\x90\x0f\x0d\x34\x0d\xcc\xd2\x34\xec\xb7\x74\x1a\xe5\xa5\xc1\xc1\xa1\x42\xe5\x28\xac\x7d\xd0\x1f\xf4\x4b\x30\x19\x3b\x8b\xc3\x6c\xb4\xa3\x40\xd8\x43\xfc\x60\x83\x09\x58\xda\x11\x90\x3e\x30\x5b\x5e\xf8\xab\x49\x1f\xd8\x6e\x55\xd7\x9e\x6a\x79\x2c\x94\x37\x15\xfe\x11\xb2\xa5\x45\x8e\xc1\x81\x41\x88\x0e\xb0\x37\x21\x94\xc4\x54\x24\x02\x81\x45\xa8\x82\x53\xe3\x0b\x70\x11\x04\x56\x43\xcc\x34\x91\xd6\xdc\xed\xe5\xaa\xd9\xa1\x54\x60\x8d\x94\x0a\x31\x42\x01\x0d\x21\x3a\xc4\x14\xe7\xf3\x42\xc2\x7e\x10\x8a\x1f\x6d\xf3\xea\x28\x06\x02\xee\x5f\x53\x85\x1e\x5c\xc0\x4f\x57\xa1\xef\x92\x90\x3f\x51\xb7\xca\x9e\x51\x4e\xde\x10\xf2\xc4\x4e\x34\xd4\x88\xbe\x65\x5f\x59\x04\xba\xcf\xe0\xcb\xe6\x2c\xac\x09\xe5\x8d\x35\xa1\x16\x54\x6e\xd8\xf2\xf7\x14\x52\xb3\x5a\xb9\xe6\xbe\xd7\x86\xc5\xa1\xf4\x65\x6f\x0a\x01\xa7\xce\x28\x59\x61\x58\x41\x08\x9b\xce\x75\x97\xf5\x0b\x88\x9d\x08\x4c\x3e\x7c\x2f\xf2\xa3\xef\xab\x94\xe6\x5f\x57\x29\xcd\x0e\x55\x4a\xd7\x58\x24\x1a\x70\xeb\x77\xa2\x10\x00\xe8\xe1\xe7\x0c\x62\x9b\x4d\xcb\xc6\x14\x2b\xd4\xab\x14\x44\x6b\x7f\x49\xeb\x6e\xed\x2a\x7f\xaa\x76\x95\x3d\xa7\x76\x95\x6a\xf2\xa7\xfe\xab\x2d\xc1\x47\x48\xb5\xb2\xb7\x6e\x35\x32\xd9\x24\xfc\x26\x83\x32\x5f\x14\x12\xdb\x47\xcf\x02\x03\xaf\x3f\x60\x59\xf7\xe9\x60\xa8\xc5\xcb\x59\x9d\x82\x1f\x80\x42\xdf\x52\x21\xcb\x9e\x73\x96\xf2\x13\xc2\x81\xda\x0e\xe3\xc2\xcc\x73\xc4\x76\x42\x4e\x81\xd9\x9b\xde\x33\x25\x0c\x83\x19\x79\x5e\x41\x23\x40\x76\x1b\x16\x64\xbe\x01\x25\xe8\x98\xb1\x99\x2d\x9a\xb5\x13\x6d\x4e\xe7\xdf\xbb\x6a\xd6\xc4\xcd\x55\xa2\xed\x5b\x55\x92\xac\x93\x2a\x79\xa5\x2a\x91\xf2\x47\xb1\x75\x85\xb5\xfc\x40\x61\xad\xa7\x51\xfa\x04\x65\x06\xde\x3b\x7e\x25\x7e\xa3\x25\x75\xa2\x8d\xb7\x54\xc9\xc8\xdc\x97\x56\x81\xc1\x89\xdc\x99\x0f\xb7\x9c\x67\x83\x8e\xbb\x9e\xb9\x1d\x0c\xf9\xc6\x87\xe7\xb1\xb2\xa6\x17\x47\x14\x2c\x32\xb5\xf2\xb2\xc0\x9e\x4a\x35\xea\x0f\x89\x7c\xac\x57\xa6\xd3\x32\x62\x3b\x04\x36\xf3\x56\xed\x5c\xe3\x5f\x7d\xae\x45\x06\xd5\x06\xd1\xf6\x70\x09\x51\x49\x4a\xd3\x4a\x4c\x00\x30\x48\x91\x03\xe3\x6a\xc4\x8c\xdd\x82\xee\xd5\x72\x59\xc8\xa5\xc5\x67\x1a\x8e\xa2\xc4\x53\x72\x47\xb3\xa6\x76\x4a\xc3\x54\x24\x26\x9a\x0f\x80\xcb\x16\xd3\x36\x1b\x80\x6e\x31\xa7\x20\xb8\x2a\x73\xd0\xf9\x0b\x90\xb6\x79\x66\x6a\x76\x2c\x9d\xd1\xb4\xb0\xfc\x76\xd6\x92\x62\xee\x34\x55\xb3\x7c\xe3\x91\xf2\xc1\xc6\x05\xfa\x8c\x83\xb7\x7d\xbd\xb5\x9e\xe9\x11\x08\x4a\xe4\x0b\xa6\xb7\x08\xbe\xce\x9d\xd7\x17\xad\x83\x15\x35\xfb\x0a\xd4\x98\x7d\x82\xe2\x58\xa9\x74\x41\x49\xad\xfd\xe7\xfe\x9e\x22\x35\xd1\x72\x2a\x93\xbf\x73\x8d\xda\xbe\x4e\x50\xf1\xd4\xb4\xa9\x65\xdf\x50\xa6\x06\x16\x05\xab\x95\xa9\xa1\x9b\x64\x0e\x5e\x5c\xb1\x99\xbe\xe3\x44\x6a\xb6\x8e\xd9\x34\xa6\x60\x2d\x94\xd5\xff\xa6\x9a\x34\x7e\xb8\x26\x8d\x7d\xfd\x20\xcd\xf6\x4d\xdf\x13\x05\x66\xa8\x7c\x7d\xb0\x68\xce\x38\x09\xa8\x2a\x24\xe7\xff\x38\x25\x66\xda\xa6\x83\x52\xb1\x71\x9d\x0f\xeb\xeb\x68\xba\x78\x13\x4d\x17\xdb\x4b\xd3\xb5\x00\x89\xdd\xfd\x34\x5d\xbc\x81\xa6\x8b\x1d\xa0\xe9\x7a\xcb\xa7\x95\xe1\xf9\x84\x64\xa4\x48\xa9\x22\x04\xc2\xe0\x49\xb9\x53\xea\xc6\xea\x04\x60\xe6\xa9\xae\x54\xde\xf0\x43\x92\x82\x5f\x62\x6c\x74\xb7\x4a\x82\x5a\x35\xf6\x44\xad\x1a\x54\xd6\x63\xc1\x1a\x05\x91\xec\x0b\xb0\xde\xde\x0a\xc5\x7b\xd4\x62\xca\x98\x8f\xf5\x17\x5b\xc0\x8b\x03\x93\x00\x36\xfb\x99\x05\x36\xa1\x1d\x68\x2e\xaf\xc0\x29\x78\x6e\x45\xcd\x3e\xaf\xf6\xab\x0b\x6c\x9e\xd5\xaa\x6f\x2b\xa9\x41\xc9\xa6\x5d\x80\x3f\x0b\x6b\x82\xbe\xa5\xca\x86\x9e\xcd\xcc\x1f\x1a\x6a\x6e\xf6\x19\xab\x87\x4a\x70\xd8\xb3\x4b\x70\x78\x63\x09\xce\x4b\x4a\x6c\x3c\x55\xa2\xb2\x7b\xed\x1a\x9f\xc1\xc4\x13\xfc\x22\x96\xd6\xf3\x0a\x6a\x3c\x99\xed\xb0\xa0\x86\xed\x2b\xa8\x89\x19\x7b\x15\x3f\xb7\x80\xb0\xb1\x99\xfe\x27\x5a\x98\x28\xb0\x0e\x2f\x7f\x5e\x31\x61\x10\x1f\x33\x65\x84\xec\xf9\xec\x6e\x61\xc1\xe0\x9e\x00\x5a\xcc\xbe\xa2\x46\x90\x1f\xae\x11\x64\xfb\x6b\x04\x19\x7b\x8d\x81\xa5\x7d\xe9\x20\x68\x82\x09\x70\x14\xf2\x21\x01\x7f\x0c\x03\xb2\x99\x7c\xb4\x18\x39\xf3\x9a\x3d\x6b\x18\x07\x4e\x4f\x99\xee\x75\xb2\x96\x31\x1f\xeb\x35\x1a\x3c\x02\x16\xfa\x54\x1a\xba\x68\x96\x64\x5c\x6d\x92\x22\xf1\x48\xca\x24\x94\x7d\xd0\x37\x30\x49\x88\xfc\x04\x60\x27\x27\x19\x9f\xcb\x52\x24\x29\x38\x89\x18\x4a\xd2\xaf\x60\x36\x08\x8a\x0c\x2e\x33\x59\xc0\x5a\x82\x85\x64\x18\xf6\x13\x05\x76\x4b\x86\xdc\x5d\x7a\x07\x54\x89\x82\xa2\x2b\xf3\x89\xac\x5a\x4f\x65\x11\x1b\x8f\xce\xce\x27\xa6\x9e\xa4\x62\xa2\xf6\xd1\x3a\x6b\x3f\x5d\x1a\x2e\xe0\x98\x94\x30\xed\x47\x7a\x62\x21\xb5\x6f\x1e\x70\x84\xfe\x9e\x4d\x45\x59\x77\xc0\x57\xfd\x5b\xed\x89\xbd\x92\x8f\x0d\x2f\x17\x76\xb4\xb4\xbf\x4e\xce\x7e\xf0\x2a\x33\xbb\x4f\x6b\x2d\x98\x9e\xdb\xe0\xa0\xb5\xf4\x71\x08\xb6\xfc\x89\x01\x88\xea\xbe\xb6\xc8\xb6\xcc\xca\x11\x3d\xc8\xe2\x2b\xda\xc2\xd8\x1f\xad\x34\xae\xa1\x57\xf4\x6a\x97\xe0\xf4\xdb\x89\x05\x01\x63\x2b\x69\x62\xfb\xf9\x32\x06\x09\xcd\xd0\x9b\xa9\x41\xf1\x70\x89\x41\x6a\x5a\x1b\xc4\xd2\xd2\xad\x41\x80\xdc\xe4\xb7\x40\x0a\xc8\xe1\x99\xc0\xa6\x71\x38\x28\x43\x02\xfe\x35\xfa\x16\x2c\x78\xdb\xbe\x8f\xbd\x85\x1c\x6a\xbe\x96\x28\x51\x05\xc9\x0d\x6b\xd9\x28\x9b\xab\x88\xd9\xb0\xd2\x5e\xd2\x0c\x79\x35\xcd\x86\x5b\x56\xbe\x0c\x66\xf9\x98\xf3\x65\x2e\x52\x18\x3d\x52\xad\x37\xeb\x0d\x73\x1d\xa5\x28\x2b\x48\x3f\x6a\x3b\xcb\xf9\x5c\x88\x22\xa3\x2c\x77\x98\x45\x86\x27\x81\xc8\x38\x3d\x48\xad\x44\x41\x82\x99\xbc\x90\xfa\x66\x04\x54\x23\x7d\x85\x48\xcd\xd3\x6d\x4c\x70\x39\xce\x83\x0a\xa9\x37\x31\x63\xef\xba\x00\x00\x0a\x2a\x21\x1c\x28\xec\x0a\x59\xba\x86\xd7\xbc\xf3\xbe\x3d\xba\xe9\x3e\xaf\xd4\x2a\x7a\x7e\xed\x56\xcc\xbb\xbf\x74\xba\x77\x13\xfe\xe1\x7d\x77\xe0\xc0\x41\x0c\x58\x58\xae\x78\x6f\x00\x04\x42\xbd\xc1\xcd\x37\x54\x6a\xf9\x7d\x62\xcf\xaa\xc8\x3a\xc4\xe6\xf3\x3b\xe3\xd7\x9a\x2a\xb2\xf8\xe1\x8a\x2c\x56\x2b\x68\xa1\xca\x2b\xbe\xaf\xf2\xea\xb7\x2a\xb1\x3a\x3f\x8b\xbf\xb2\xc4\x4a\x8f\xc1\xcd\xa8\x8b\xe5\x3f\x6e\xce\x19\x94\x5e\xe9\xd9\xf9\x2d\x2a\xab\xbe\xba\x8a\x8a\x07\x55\x54\xec\x57\x55\x51\xf1\x10\xe9\xc6\x9e\xaa\xa2\x3a\xd9\x91\x69\xdc\x57\x31\xc5\xbe\xa2\x62\x8a\x3f\x59\x31\xc5\x0e\x55\x4c\x7d\x75\x75\x14\x6b\xac\x8e\xe2\xdf\x54\x1d\xd5\x1d\xe0\xe7\x1a\x52\x9a\x8c\xb5\x37\x1b\x99\xcd\x93\x2f\x3f\x6a\x2f\x43\x9f\xfa\x6d\xe0\xbb\x43\x68\xc4\x04\x6e\xfb\x32\xd7\xde\x5b\xc1\x07\xf2\xd1\x5c\x6c\x8a\x31\xba\x0a\x09\x38\xcc\x05\x98\x56\x16\x9e\x60\x0a\x67\x29\xbd\x4c\x91\x10\xba\x1d\x97\x50\xad\xa1\x4a\xbe\xc9\x15\x32\x44\x54\x68\x95\xaf\xaa\xb5\xc8\x92\x72\x8b\xc5\xd1\x53\xfd\x91\x47\x01\xc8\x29\x31\x5b\x25\xf2\x41\x5a\xd9\x28\x93\x50\x4f\xca\xf0\xf0\xa7\xf8\x94\x4d\xad\xcf\x44\x16\x1a\xec\x1e\xfe\xc9\xc6\x62\xbc\x60\xe0\xc4\xb9\x06\x65\x29\x66\x75\xe1\x63\x9b\x14\xcb\xfd\x80\x86\x61\xf7\x53\x62\xa1\x9b\xac\x9b\x0b\x5f\x66\x88\x79\xa0\x1a\x03\x50\xcd\xcf\x17\x98\xb2\x23\x37\x1f\x9c\x6f\x28\xa4\x57\x25\x97\x8b\x85\x34\x61\xf8\x59\x9e\x3d\xc8\x2d\xf9\xea\x54\xd9\xc1\xfc\x9c\x1d\x95\x8d\xcc\x56\xf8\x0c\x12\xc4\x05\xfb\xcd\x0b\x93\x49\x7e\x64\xef\xfe\x23\x9e\x26\x19\xc5\xc8\xd9\x26\x87\x68\x7d\x18\x28\x02\x77\x8d\xa2\xe7\xa0\xdc\x52\x65\xf3\x98\xb1\x3f\xe9\x81\x84\xef\x1a\x60\x92\xd7\xf7\x63\xe5\x24\x39\x05\x9f\x16\x89\x5c\xf0\x64\x2e\x05\x24\x18\x3d\x9d\x8a\xf8\xa7\x5d\x8c\xe0\x76\xcb\xff\x64\x90\xe3\x68\xd6\xfc\xe4\x80\xea\x68\x3f\xd5\xd0\x0e\x6f\x2d\xaa\x28\x98\x54\x34\x6b\x3d\xcc\x46\x52\x36\x67\xbb\x25\x87\x9c\xff\x9e\x44\xa2\x7a\xc2\x1c\x64\xbe\xfd\xe3\x32\xce\x06\x11\x99\x17\xfc\xa4\x96\x91\xd9\xb5\x7e\xe3\xdd\x1e\xd6\x74\x2a\xf5\x6b\x57\xf9\xc6\xe9\x89\x19\xab\xa9\x52\x72\x51\xa5\xe8\x84\x18\xaa\x3d\x84\x03\xe3\x05\xfd\xd6\x56\x83\x10\xa3\x8e\xd4\x7e\x5c\x0a\x74\x95\x26\xa0\x9f\x2f\x76\xee\xd8\xbc\x78\xc6\x15\x6b\xe4\x32\x0f\x0c\x1f\x46\xab\xa0\x96\x40\xbb\x44\x7a\x37\x69\x97\xd2\x5f\x99\x2e\x44\x19\x44\x50\x0f\xcd\x89\x4d\xee\x62\x4c\x84\x86\xed\x2d\x4f\x16\x7a\xa5\xd6\x6c\xe3\xc3\x88\xd3\x88\xbf\x7a\xfd\x92\xdf\x0a\xa5\x58\xfb\x41\x46\xbc\x23\xd6\xd3\x22\x99\x2f\xa5\x81\x99\x5e\xbe\x89\xf8\xfd\xb8\x6d\xd4\xd6\xc4\x7c\x1e\x04\x59\x1d\xad\x30\xc4\xf7\x10\xb4\xa4\x17\x8a\x4c\xe5\xac\x2c\xf2\x2c\x99\x11\xc0\x66\x03\x35\x21\x49\x1a\xc3\x31\x19\x84\x3e\x83\x7c\x5b\x64\x0f\xb1\xbc\x2a\x37\x55\x59\x17\xca\x06\x6d\x4f\xd4\x74\x5f\xc9\x8c\x25\x25\x9e\x22\x0a\x21\x04\x41\xc2\x6d\x9d\xcf\xe5\x8f\x8c\xdd\x64\xf9\xda\xb0\xd8\x9b\xa5\xf9\xea\x4d\xc4\xeb\x5b\xef\xcb\x17\x1e\xee\x3c\xee\x7f\x73\x96\xaf\xa5\x42\x4a\xa5\xf6\xbb\xf1\xb0\x7f\x3f\xe9\xf6\x3f\xfa\x76\xec\x5b\x98\x6d\x9a\x68\xd4\xa5\xf9\xa4\xf4\xe0\x3c\x1e\x13\xee\xa5\xbe\x73\x31\x03\xbe\x25\x86\xa0\x47\x99\xea\x77\xe8\xb1\xac\x6f\x64\x3c\x95\x1d\xbd\x86\x71\x8a\xde\x7a\xaf\x61\xb3\x63\xbf\x01\x84\x0f\x5a\x6d\x37\xda\xd5\x82\x70\x8a\x4b\x6f\x9a\x76\xc1\xd4\xe0\x7f\xcc\x8e\xcd\xaa\x84\xff\x04\xaf\xca\x4b\x2b\x06\x9e\xdc\xbe\x30\xe2\x70\xc1\x67\x79\x55\x20\x9d\x85\x74\xaf\x83\x10\x9b\x32\xa1\x75\x36\x13\x40\x5b\x05\x9e\x12\xf8\xf6\x9e\x3a\x52\x63\xcb\xde\x22\xd6\x6a\x06\xcd\x83\x7d\x3c\xd5\x93\x5b\x29\x79\x3a\x4b\x93\xd9\x67\x80\xfa\xad\x65\x56\xf1\xa4\x94\x6b\x75\x7a\x6a\xd4\xf7\xb8\xaa\x12\x24\x69\xb1\xa0\xd7\x70\x07\x42\x9a\x68\x29\xe9\x80\x92\xeb\x4d\x9a\x6f\x65\xc1\x4f\x0c\x28\x14\xf8\xb7\x95\xc3\x18\xae\x65\xd1\xe2\x06\x46\xab\xb4\x03\x9d\x46\x2c\x01\x87\x3e\x42\x8d\xd8\x65\xc6\x85\x77\xc1\x78\xf0\x92\x23\x97\x90\x34\x16\x81\xde\xb0\x86\xf6\x22\xe6\xef\x65\x21\x99\xe0\x0a\xb0\x8f\x6f\x31\xe3\xe0\xaa\x83\x7e\xd4\x0d\xdf\xe6\xf3\x6d\x26\xcd\xd6\xa5\xca\x53\xf3\x0a\x0c\xc5\xfb\x3a\xcb\xa5\x2c\xf4\xe5\x4b\x07\xa8\xd9\x6f\x9f\xbc\x65\x7d\xcc\x4e\x6c\xe7\x90\x75\xaf\xc0\x1c\x04\x32\xbf\x39\xa3\x02\x10\x72\x00\xd1\xd6\xff\x58\x4f\xf5\x1f\x5b\x36\x2d\x35\xdd\xf2\x3f\xeb\x46\xb2\xf7\x62\xf6\x19\xea\xd3\xfe\x84\x44\x6a\x55\x81\xd2\xef\x5b\xde\xc9\xf3\xec\xa7\x88\x9f\xf3\xf6\xa6\x48\x52\x44\xc3\xd3\xaf\x23\x7e\x57\x48\x05\x12\x32\xfa\xc3\x3f\x27\x33\x00\x94\x8b\xf2\xd8\x66\x17\x0a\xc3\x5d\x92\x94\xff\xeb\xef\x50\xda\x1e\xbf\x18\xdf\xde\xdd\xf5\xff\x8e\xfa\x7f\x67\xaf\xce\x7f\xf8\xa1\xae\xff\xf7\xf2\xe2\xbb\xfe\xeb\xef\xf2\x33\x96\x33\xbd\x92\x6f\xf5\x56\x85\x62\x88\xbb\x22\x2f\xf3\x59\x9e\xf2\x93\xf1\xed\x5d\x8b\xf7\x6d\xda\xe9\x5f\xdb\x9d\x7e\xc4\x3b\xb7\xda\xb3\xbb\xee\xff\x1b\x63\x57\x7e\x3c\x6b\x04\x01\x60\xac\x78\x6c\x12\x05\x1b\xdf\xde\xe9\x75\x3e\x95\xfa\x1d\x4e\x5e\x05\xa1\x37\xda\x1e\xc6\x54\x4a\xb9\xd2\xbf\x58\x24\x99\xc8\x20\xdd\xe8\xe8\x81\x14\x2f\xe4\x52\x20\x9f\x0f\x95\x24\x84\xc9\x7b\x88\x88\x0d\x8b\xa5\xc8\x92\xff\xa4\x6f\x98\x12\x81\x72\x25\x99\x6e\x80\xb1\x98\x36\x08\x04\xd1\xe6\x5a\x91\x6f\x45\x0a\x89\x0c\xcb\xda\x87\x35\x99\x92\xea\x1d\xe0\x7b\x42\xd9\x98\x7c\xba\x65\xae\x7c\x92\xec\x46\x60\xa7\xba\xc9\x1f\x64\x91\xad\x65\x56\xc6\xfc\x5d\xbb\x6b\xeb\xc2\x13\xc5\x65\xb6\xd2\xfd\xa1\x80\x94\xaa\x36\x00\x2a\x20\x6a\x2e\xfd\x02\xba\x06\xa1\x02\xc4\x91\xfd\xed\x3c\x76\xb2\xfb\x4b\xb8\x7a\xab\x22\xc3\x60\xb2\x7d\xa0\x0b\x8f\xb9\x11\xa6\xa7\x3e\x40\x9d\x65\x9d\x58\x70\x87\x4e\x10\x06\xac\x66\x9f\xed\xd6\xbb\xfa\xef\x8a\x19\xbb\x78\xc3\x6f\xc5\x96\x5f\x9c\x9d\x5d\x30\xf6\xd4\xd2\xaa\x6b\x4b\x42\xef\x32\xa8\xb9\x07\x66\x25\xe5\x75\xf3\xc5\x95\xd4\x17\xf5\x9a\x0e\xd2\x2b\xb9\xd0\xdf\x79\x31\x30\xa5\xd7\xf0\xae\xa4\xdc\xf2\xf6\x52\x66\xb3\xed\x8b\xe1\x62\x91\x20\xbb\xd8\x40\x96\x70\xd9\xd9\x4f\x9c\xcc\xf2\x34\xb5\xae\xd7\x51\xc3\x40\x1f\xb5\x6a\xd4\x07\x9e\x46\x8c\xc1\xf1\x02\x2f\x14\xe5\xd2\x1d\xda\xc6\xb2\x4b\xc1\xb0\xd8\x6a\x6e\xca\x7f\x63\x16\x15\x64\x82\x8f\xc6\xb7\x77\xcc\xd8\xae\x47\x08\x3b\xf2\x04\x9e\xc2\x82\xeb\xda\xf7\xf8\x95\xff\xd7\xa3\x96\xf6\x45\x98\x07\x42\x54\x0e\x0f\x57\xee\x42\x04\x77\x84\x90\x3c\x6e\x75\x9a\x89\x40\x5e\x85\x12\x45\x11\x1a\x78\xf9\xc2\x22\x91\x68\xbf\x02\x9f\xdb\x1c\x3f\x1f\x82\xed\x6d\x3a\xab\x36\xbc\x11\x03\x7a\x88\xbd\x14\x87\x56\x1f\x19\x72\xb5\xb5\xf4\x9b\xee\xff\xd8\x15\xac\x30\x8f\xd5\xd5\x1b\xfb\xb1\xab\xf0\x39\x50\x3a\xaf\xb8\xbf\x93\x21\x25\x42\x8e\xa5\x85\xb0\xc7\xbf\xcd\x00\x34\x96\x7d\x98\xc6\x07\xd3\xfb\x44\x0f\xc2\xb3\xa8\xa9\x07\x51\x88\x6f\x44\x60\x8d\xe5\x73\x26\xba\x5a\xed\x3c\x30\x1f\x1c\x63\x0a\xec\x21\xb1\x5f\x21\xea\x18\x32\xcb\x75\x7a\x81\x44\xf1\xdd\x83\x82\x01\x81\x1e\xc1\x4c\x18\xbb\xc6\xa4\xa2\x76\x17\x9b\x0a\x5f\x1a\xa6\x35\xcc\xaf\x04\x33\xca\x9e\x3f\xa3\xfe\x78\x98\xc1\x00\xd6\x5b\x03\x76\x64\xe4\xd6\x3f\x21\x6c\x49\x98\x50\x5f\x2d\xaf\xde\x2c\x76\x42\x81\x9b\x07\x8b\x79\x0d\xdb\x65\x68\x7a\x9b\xa6\xa8\xc5\xab\x4d\x9e\x81\x46\x85\x54\x65\xc4\x48\xe1\x46\x8a\xb9\xcd\x68\x69\x17\x11\xb8\x54\x20\xce\x45\x9f\x34\xd9\x8e\x60\xf0\x82\x86\xaf\x44\xc9\xb0\xba\x51\x2f\xde\x74\x5b\x67\xd5\x68\xba\x65\x18\x9b\x14\x22\x53\x1e\x73\xea\x9e\x59\x46\x5c\x98\xc3\x83\x58\xdf\xc4\x1b\x28\xb6\xd3\xbe\x7a\x52\x9d\xdc\xb9\xe0\x33\x49\x8d\x5a\x41\x4f\xb3\x0b\x6a\x14\x5e\xd9\x23\x8d\x35\xda\xe3\x11\x23\x90\x08\x14\x60\x61\x30\xc4\x27\x96\x31\x8f\xf2\x38\x07\x01\x3e\x84\x4f\xa6\x5d\xb8\x46\xce\xef\x52\xa0\xd6\x2f\x38\xb2\x8b\xa4\xcc\xf4\x63\x11\x93\xe4\xe9\xa7\x93\xdc\x24\xf5\xa1\x7e\x35\xcf\x44\x06\x40\x45\xc9\x57\x32\x9d\xf3\x34\xb1\xb2\xba\x20\xee\x2b\xd6\x62\xe9\x98\x24\xd1\x3f\x49\xb7\x38\xfb\xe6\xbf\x10\x8e\x6b\x0d\x0d\x8f\xbf\xd2\x1f\xb0\x98\x31\xa7\x38\xb2\x53\x25\xfb\x2c\x78\x0b\x20\xf4\xdd\xc5\x6f\xa7\xa2\x09\x80\x63\xa0\x17\x8e\x0b\xd8\x83\xd9\x28\xba\x74\xec\x09\xce\x4c\x44\xcb\x53\xfd\x17\x75\x86\xcf\x9a\xd8\x54\x0d\x36\x43\xfd\xb5\x17\xa6\x0d\x92\x3d\xe4\x7a\x8d\x78\x4b\xa8\x52\xc4\x2b\xd9\x05\x93\x4b\x9b\x12\x83\x76\xa7\xc3\x4f\x24\xfc\x6f\x8b\xb7\xa7\x0a\x6d\xac\xf1\x36\x2b\xc5\x17\x3e\xc8\x69\x25\x0c\x33\xc9\x4f\xda\xe3\x41\x7c\xde\x62\x9d\xff\xfd\xbf\xc9\xf0\x85\x70\x34\xfc\x96\xcb\xcc\xf1\xa1\x48\xf8\xa7\x22\x93\xe2\xb4\x90\x28\xd9\x39\x17\xa5\xa0\xcb\x1e\xad\x47\x86\xaf\xa5\x27\xf8\x8f\x85\x3c\xed\x03\x0c\x06\xcd\x6d\x77\xf0\xbe\x3d\xe8\x74\xaf\xa8\xc5\x8e\x9f\x02\x6a\x95\x98\x15\x1d\x19\x78\xc8\xcf\x9b\xc1\x3d\x46\x31\x67\x8e\x36\x37\x90\xb0\xd9\xf7\xfe\x18\x46\x8c\xfe\xda\x21\x9f\xd8\xac\x20\x3f\x44\x29\x14\x42\xec\xdd\xaa\x8b\xbd\xf0\xd2\x7f\xfd\x5f\x7e\xfe\xe6\xcd\x6b\xe0\xbb\x61\xfb\x8c\xb1\xef\x84\x6d\xff\xc0\x3f\xf1\x8b\x76\xa5\x8d\xf2\x6c\x71\x6a\x33\xfa\xa7\x97\xf1\xd9\xdf\x32\x20\xf0\x84\xff\x7f\xf9\xc3\xab\x3a\xff\xdb\xcb\xd7\xdf\xf9\x1f\x7e\x9f\x9f\xf6\xfd\x64\xd8\x19\x0e\xae\xb9\xfe\x7f\xbd\x9b\xfb\x51\x97\x8f\x3b\xa3\xde\xdd\x84\x00\x08\x50\xde\x68\x88\x20\x2e\xe3\xb3\x88\x9f\xff\x91\xb7\xab\xa5\xbe\xfa\x2f\xce\xce\xde\x84\x87\x01\xfc\xe6\x09\x26\x88\x3f\xad\xca\x72\xf3\xe3\x8b\x17\x0b\xb5\x88\xf3\x62\xf9\xe2\xa7\xbf\x2d\xc9\x03\xff\x0a\x92\x07\x88\x5d\x77\xcd\xb2\x07\xf4\x73\xb6\xc7\x96\x47\x0f\xdd\xc8\x5c\xbc\x7e\x3a\x99\x11\xd9\x88\xfc\x25\x3f\x39\xba\xb9\xeb\x3f\x5c\x1e\xb5\x20\x77\xe8\x97\x84\x12\x28\x0c\x33\x83\xda\xa2\x9e\x4a\x51\x28\xfe\xdc\x0a\x50\x53\x00\x00\x49\x41\xbf\x82\xcb\xfe\x36\x51\x7c\x09\x16\x09\x3e\x05\xda\x11\x16\xd1\xf9\x43\x60\x6a\x6f\x7d\x15\xed\xfa\x10\xa1\x35\x9c\x3f\xee\x48\x3d\x98\x83\xe4\x18\x72\x04\x10\x97\xa7\x44\x07\xe5\x5e\xfd\xcc\x9c\x05\x13\x1e\x2b\x3e\x5b\xe5\x20\x81\xeb\x2c\x35\x0c\xcf\xcb\x52\x14\xdb\x16\x82\x74\xce\x62\xed\xf4\x1b\x40\x32\xfe\xee\xa8\x43\x37\x28\x0a\x3b\x93\x76\xbd\x53\x03\x09\x60\xe7\x0b\x0f\x3e\xe6\x35\xd6\x8a\x8c\x08\x7b\x1f\x43\xb8\xa0\x89\xff\x1e\xde\x39\x30\x85\x55\x1d\xbd\xfc\xe6\x81\xa8\x74\xd3\xf3\x1d\x94\xdc\xfa\x34\x49\xa9\xb8\xdf\x74\x0b\xd5\x76\x70\x3a\xe4\x68\xb0\xfa\x1d\xfa\x1b\xd0\x8d\x93\x24\x96\x31\x52\x53\xd8\x3f\x24\x99\x1e\x63\x3d\xdb\x2d\x84\xa0\xe9\x5f\xae\x93\x2c\xc1\x76\xea\xfd\x92\xeb\xf5\x98\xe5\xd9\xe9\x5c\x4e\xab\xe5\xd2\x44\xa2\xf4\x6f\xb4\x35\x04\xa9\x0a\x98\x2a\xea\x64\x2f\x93\x69\xb2\x4c\xb4\xb9\x6a\xc7\x36\x68\xb1\x93\x66\x29\x79\xd3\x88\xe0\x73\xce\x63\x7e\xa3\x4d\x6b\x18\x10\xb7\xad\xee\x7c\x4a\x2e\xce\x01\x2d\x0e\x19\xc3\xb0\x52\x5f\x2f\x02\xb1\x84\x62\x43\x5c\x46\xde\xb0\x92\x8e\x48\xb2\xb0\x35\xc9\xf0\x51\x80\x9d\x41\xfe\xc3\x05\x10\xd0\xd2\x94\x61\x19\x06\xec\x03\x0f\x6b\x9d\x2c\xf4\xee\x70\x80\x64\x3b\x7d\x98\x81\x36\x52\x9c\xb5\x71\x31\x8b\xd9\x4c\x5a\x58\x03\x91\xf3\xa9\x84\xbc\x57\xd3\x00\xe9\xaf\x82\x95\x6b\x2b\xf7\x2c\xec\xd4\xba\xa8\xda\xba\xad\x6f\x40\x13\x4f\x2d\xa4\xaa\xd2\x12\x49\xfd\xdc\xb2\xb5\x98\x45\x8b\x28\x80\x72\xde\xa6\x8f\x7a\xbc\x11\x85\x5c\xe7\x06\x6d\xe1\x6d\x75\x23\xf2\x03\xa8\x6a\x1b\xf1\x53\x72\x96\x43\xda\xd3\xd4\x3c\x39\xa1\x25\x3c\x16\x71\x68\x61\x62\x2f\xb4\xb5\xca\x3f\x48\xf1\x59\x42\x90\xcc\xdf\x17\xfa\xde\x48\xe5\x82\x56\x9c\x3e\x75\xc8\x37\x05\xb7\xab\xe1\xe8\x71\x3a\xf6\xeb\x0d\x14\x4a\x6f\x0d\x90\x0f\x60\x84\xd5\x7a\x43\x1e\x1d\xc6\x25\x8a\xf9\x29\x56\x06\xf9\x54\x09\x55\x26\x00\x76\x11\x1e\xa9\xba\x19\x0d\x0a\x91\x0e\x59\xeb\xb5\xfb\x7f\x1a\xfd\x70\xfc\xa2\xd3\x39\x7d\xf7\xf1\x74\xd0\x39\x1d\xb7\xff\xd6\x86\x1f\xfd\x1c\xb6\xff\x5e\x9e\x5f\x5e\x5c\xd6\xf9\x7f\x5f\x5e\x5c\x7e\xb7\xff\x7e\x8f\x9f\x0e\x90\xed\x3e\xe8\xf3\x6c\xbd\xce\x33\xc5\xdb\xa5\xbd\xd4\x4f\x07\x79\xd6\xb1\xa5\x5f\xa7\xe3\x95\x28\x64\x1b\x50\x0a\x97\xf1\x19\xbf\xcf\x36\x39\x94\x06\x77\x46\x5d\xe4\x06\xef\x0c\x6f\x6f\x87\x83\x31\xef\x0c\x47\x77\xc3\x11\xca\x2f\x02\x22\x76\xc2\xdb\x80\x67\xbc\xee\x8d\x90\x10\xff\x6a\xd8\xc5\xdf\x1b\x48\x6a\xbf\x7b\xd3\xee\x5b\xfa\xbe\x98\x05\x2a\xb0\x75\xdd\x4b\xfb\x6d\x78\x73\x97\xb7\x07\xbc\x3d\x99\x0c\x47\x83\xee\xc7\xd3\x4e\xbf\xd7\x1d\x4c\xf8\xa8\xdb\x87\xf7\x8f\xdf\xf7\xee\x62\x66\x5a\xc8\x4d\x0b\xe9\xb5\x63\x7c\x6e\x6f\x00\x50\x51\x7c\xd7\x40\x3f\xee\xa8\x3d\x3e\xed\x8d\x8f\xf8\xbb\xf6\xb8\x37\x8e\x79\xfd\xfb\xec\xb6\xfd\x97\xee\x38\x14\x67\xe0\xa3\xee\x4d\x7b\x74\x65\x20\xb9\xfe\x33\x0d\xc3\x64\x84\x7d\x27\xf2\xc5\xb1\xa3\x11\x64\x1e\x9c\x92\x8f\xba\xe3\xfb\x3e\x40\x7b\x51\xd3\x76\x32\xe6\xf7\xe3\x6e\xcc\x98\x4b\x94\xbc\x27\x31\x80\x93\xf6\x98\x5f\x75\xaf\x11\xa8\xd8\xed\x0f\x3f\xb4\x02\xa5\x4e\xa7\xec\x88\x68\x40\x33\x8e\x3b\xdd\xa9\xd1\xa1\x9c\x1c\x75\x3a\x77\xfd\x23\x3e\x1c\xf1\x23\xfa\xdd\x51\x0b\x81\xb7\x46\xba\x80\xb4\x54\x11\x20\xe9\x50\xa8\x88\x2d\x65\x08\x62\xac\x23\x9a\xdb\x83\x8f\xdc\x23\xe0\x84\x47\xe1\x27\x27\xef\xf5\x14\x8e\x79\xfb\x7e\xf2\x7e\x38\xea\xfd\xff\xbd\xb6\xf7\xc6\x26\xf2\xc1\x87\xa3\x50\xa1\x92\xda\xf1\xbe\xf7\xae\x37\xe9\x5e\xc5\x8c\xbd\xfb\xc8\xbb\xbf\x74\x47\x1d\x44\x92\xea\xd7\x91\xee\x24\xe1\x83\xad\x80\x02\x8c\xce\xfb\xee\xc8\x60\x7b\x3b\x00\xb5\x06\xba\xce\x9b\x51\xb7\xcb\x27\x43\xf6\xae\xcb\xdf\x0d\xef\x07\x57\x46\x31\x34\x1c\x41\xa7\x00\x1b\x00\xba\x9b\xd4\x59\x3b\xc3\xc1\xb8\x07\x50\x53\x36\x19\xea\x5f\xb4\x3d\xa2\x48\xfd\x5d\xfc\xfc\x70\xc4\x6f\xf4\x4a\x1a\x43\x8b\x3c\x3d\x51\x50\x6e\x85\x19\x46\x84\xf9\xc0\x3e\x11\xb9\x67\x86\xd7\xfa\x1b\x23\xea\x84\x51\xa0\x00\x4c\x68\x13\x06\xd4\x1a\x66\x9e\x35\xcd\x98\x88\xf9\x51\x7b\x2e\x36\x94\x52\x32\x46\xab\x5f\xdc\x04\x21\x6a\x7d\x29\xa2\xa6\x51\x5e\x84\xbf\x71\x59\x1b\xb6\x29\xe4\xa9\xfc\x82\x45\x2e\xa8\x36\x14\x11\xa1\x95\x7e\xa4\xe1\xdc\x42\x25\x48\xfb\xce\xc8\xaf\xae\x26\x5e\x99\xa2\x10\x19\xf2\xda\xb2\x7c\xa1\x4d\x95\x64\xe6\x88\x73\x00\x44\x22\x6c\x40\x5e\xf0\x34\xd1\xbf\x28\x20\x40\x2c\x8a\x52\xbf\x7f\x46\x4f\xca\x0b\xbe\x59\xe5\x19\x16\xef\xe9\xff\x40\x81\x4a\x30\x6c\x50\x54\x88\x18\x72\x67\x49\x26\xd7\xa2\x34\x72\x3a\x5e\xfb\x94\x21\x9c\xa0\xfa\x8e\xbc\x58\xb3\xc4\x2f\xb2\x84\x41\xa0\x12\xdb\x42\xce\x80\xc8\x0f\xa3\xab\x79\xb1\x96\x73\x68\x04\x3c\x4e\xce\xbd\x90\x34\xb2\xc3\x60\x19\x6c\x21\x67\xf9\x32\x4b\xfe\x53\x4c\xd3\x6d\x9d\xf0\xd6\xe7\x5f\xf2\xd9\x25\x84\x47\xad\x01\xca\x37\x49\x59\x95\x50\x2b\xd4\xa1\x2c\xa7\x29\xc4\xa0\x48\xb4\x1f\x84\xcd\xb8\x9b\x73\x07\xe1\x09\x7d\x3f\x66\x31\x50\xd7\xf4\x01\xa1\xcd\x52\x53\x69\x37\xcf\xab\x29\x52\x45\x10\xaa\x14\x45\x5a\xf5\x44\xc3\x7c\x89\x94\xa6\xc0\x1b\x72\xe6\x4f\x07\x02\xaa\xd4\x36\x9b\xad\x8a\xdc\x64\xee\x8d\xfd\x65\x14\x5f\xcb\x64\x2d\xe7\x18\x65\xc5\xfe\x40\xe5\xf8\x3a\x7f\x48\xb2\x25\x4b\xd6\x62\x29\xf9\xc9\x11\x3c\x23\xc9\x96\x47\x2d\xde\x14\x71\xfe\xaa\xce\x32\x36\x8d\xb5\x7b\x69\x86\xd0\xed\x88\x99\x1b\xd6\x7c\xb1\x7f\xcd\xb9\x25\xcf\x64\x36\xdb\xce\x20\x25\x95\x08\x2c\xa6\x12\x59\xb9\xca\xd3\x7c\x69\x6a\x38\xbd\xb1\x51\x91\x1b\x1a\x94\x94\x2a\x72\x31\xd7\xab\x49\x41\x5e\xc8\x51\x1d\xc0\x5f\x4d\x2a\x77\x2d\xca\x52\x16\x3e\xdc\x0c\x3f\x92\x26\x8a\x70\xa6\xc6\x44\x3f\x3f\x59\xb6\x88\xdc\x09\xd1\xd3\x91\xb6\x84\x0b\x29\x94\xa7\xd7\x28\x53\x8f\xdb\xcc\xdb\x86\xf4\x81\x84\x84\xca\xb3\x52\x45\xde\xaa\x63\x49\x56\x4a\x18\x9d\x4a\xa4\xc4\xe2\x0f\x7c\x18\xbb\xfb\x04\x80\x91\x28\x17\xa5\xff\xaa\x1d\x56\x94\x35\x2f\x41\x66\xaa\xca\x8c\x57\xe4\x0a\xc4\x29\x5e\x01\xc1\x6f\x82\x9e\xd6\x28\xa5\xf1\x65\xc4\x91\x44\x8d\x82\xfc\xa5\xd4\xce\x0a\x32\xbd\xed\x90\x54\x28\xc2\x90\xad\x95\x4c\x1f\xf4\xf0\x53\x4b\xf3\x25\x32\xee\x01\x86\x82\x70\x61\x73\x74\xaf\xdd\x22\x78\x90\x0c\xc8\x6a\x62\xde\x6e\xde\x87\xfc\xab\xf7\x21\x3b\x11\x8a\x43\xe9\xb5\xfe\xcb\x34\x7f\x90\xad\xfa\x6a\x6d\x52\x8b\x9a\xc5\xfc\xc8\xe2\x71\xa4\x59\xae\x06\xe2\xe6\xa5\x36\x09\xca\x8e\xa1\xaa\xa0\xd6\x94\x38\x8b\x12\x69\x15\x09\x60\xaa\xf2\xc2\x6b\x1d\x56\xb7\x3b\xf4\xa4\xde\xbd\x05\x48\x79\x2a\x91\x4a\x77\x38\x9b\xb4\x92\x7e\x52\xfe\x98\xc9\x42\xad\x92\x4d\xcc\xd8\x3c\xe6\x47\x26\xcf\xd3\x4d\xd1\xd9\x3a\xf2\xea\xfb\x1d\x16\x61\x95\x2c\x57\xa7\xa9\x7c\x90\xa9\x23\x5f\x25\xcb\x54\x0f\xab\x62\xb8\x48\xd1\x91\xeb\x53\x99\x2c\x1d\xe6\x26\x3b\x45\xe8\xc0\x32\x29\xd3\x1d\x9d\xbd\x1f\x7d\x43\x37\x62\x03\x9f\xe4\x20\xe2\xce\xd4\x8d\x19\x93\xb6\xd1\x79\xe1\x37\x56\xbf\xe8\x21\x99\x57\xfa\x0b\xee\xdf\x7a\x09\x66\x65\x82\x89\x4a\xf8\x97\xad\xd9\x07\x8a\x8b\x13\xd5\x62\x76\x70\x1b\x08\x22\x6a\x13\xbb\x88\xf9\xd1\xd0\x4c\x51\x1b\xc0\xbb\xd4\x86\xc8\xf4\x6f\x26\x94\x7c\xf2\x0a\x2c\x57\x7a\x7f\x3e\xbf\xc1\x8f\xab\xdc\xea\x6c\xf8\x6b\x01\x90\xd8\xde\x93\xec\x97\xb6\x10\xb2\x9a\x4a\x0e\x68\x47\xd8\xbc\x91\x5b\x6b\x6a\x25\x8b\xb7\x34\x3d\x36\xc2\xca\x4f\x92\x16\xdb\xe9\x84\x7f\x39\xc3\x7d\x33\x2b\xf3\x42\x9f\xa7\x49\xb6\x84\x14\x3e\x5c\x2c\xff\x2f\x7b\x6f\xbb\xdc\xb6\xb1\xb5\x0b\xfe\xef\xab\xe8\x52\xd5\x94\xc5\x2a\x18\xb1\x64\xc7\x89\xe3\x5f\x8c\x4c\x27\xcc\xc8\xa2\x8e\x28\xc5\xdb\x67\x6a\x6a\x02\x92\x4d\x09\x09\x08\x70\x03\xa0\x14\xee\x1b\x9a\xfb\x98\x2b\x9b\xea\xf5\xd1\xbd\xba\x01\x52\x94\x9d\x9d\x7d\xde\xf3\x5a\x3f\xf6\x76\x24\xb2\xd1\xe8\xcf\xf5\xf1\xac\xe7\xc9\x61\x04\xe0\x1e\xaa\x91\x72\x47\x11\x89\x2c\x20\x73\xf0\x05\xb2\x79\x8b\xdf\xb3\xd6\x45\x91\x43\xa4\x67\x61\x00\x52\x9a\x68\x60\x1f\xca\xcb\x04\xd1\xa4\xeb\xda\xb4\x6e\xfd\x42\xda\x92\xfa\xb1\xe7\x8c\x47\x2e\x0b\xc8\x8a\xb2\x19\xb2\xac\x8a\x3f\x8a\xaa\x36\x6f\xf5\x71\x9e\x0f\x68\x86\x94\x78\x39\x3e\xdc\x19\xb7\xba\xd8\xcc\x4d\x4d\xb0\x38\xf8\x15\x01\x8b\x6a\x22\xaf\xa4\xb1\xb5\x6f\xb3\xcc\xeb\xa6\x55\xcb\xfc\x4f\xe3\x02\x9d\xe5\xa2\xe9\x0e\x9a\xdb\x85\xf8\x01\x18\xf6\xc4\xf6\xc7\x75\x08\x46\xdb\xee\x4d\x71\xbb\xd0\x61\xe0\xe1\x73\x14\x49\x41\x2c\x40\x8b\x8f\x74\x9f\x4f\x95\xba\x4d\xf5\x91\x5d\x15\x72\x4b\xb8\xb1\x22\x88\x43\x30\x5e\xb8\xfe\xbb\xdc\x31\x5d\x0d\xc8\x7d\x19\x7b\x62\x51\x5c\x6c\x02\x29\x3e\x7e\x70\xa2\x9a\x79\x8e\xeb\x6f\x4e\xb7\x17\xf5\x60\x51\xad\x32\x3b\xdb\x0e\xa5\x40\xb6\x5a\x8b\xec\x59\x86\xf8\x30\x56\x1c\xa0\xf5\x13\xab\x7c\x7f\x16\xf9\x6d\xde\x66\x05\x7c\x50\x1a\xb5\xb3\xaa\xb2\x36\x4e\xb6\x5a\xdf\x15\xa6\xf5\xb6\x30\xc0\x88\xf3\xf2\xf6\xad\xdd\x9c\xf6\x62\x04\x68\x3c\x96\x8e\x27\xba\x31\xf5\x0a\xe7\x5a\x70\x41\xf2\x1d\x9c\xad\x0c\xc1\x1a\xec\x97\x17\x75\x06\xd4\x01\x40\x43\x44\xff\xae\x9e\x93\x89\xa5\xec\x17\xdf\x02\xa8\xa7\xaa\x9d\x16\x24\x35\x07\xdb\x13\xf1\xf5\xc4\xaf\xa5\x17\x9b\xd5\x0c\xc0\xf0\x6f\x85\x99\x06\x40\xaa\x06\xf6\x65\x07\x62\xf3\x50\xd5\xb0\x8e\x3a\xf6\x31\x5e\x7a\x95\xe0\x2b\xc9\x1a\xac\xaf\x6f\x29\xcc\xd8\x30\x26\x03\x4f\x6a\x80\x64\x83\xbc\x74\x56\x66\x45\x75\x5b\x6d\x90\x95\x4e\xb6\xbb\x7d\xcb\x66\xad\x35\x30\xeb\x0c\x51\x6b\xeb\x2c\x2f\xed\x50\x26\x2a\xab\xe7\x77\x79\x4b\xa3\xa9\x9b\xf9\xa6\x58\xe3\x3f\x4d\x79\x5b\x67\xf7\x44\x2e\x51\xd8\xbe\xfb\xf6\xd6\x77\x55\xa7\xdb\x6a\x4f\xb7\xf5\x21\xdd\xf6\x8d\x6e\xdf\x2a\xdf\x67\x4c\xf0\xc0\xda\x7b\x0b\x95\x1b\x45\xb1\x69\xda\x9a\x6e\xd0\x55\xb6\x86\xc3\xa7\x4c\x74\xf3\x87\x69\xe7\x30\xd2\xc0\x71\xf4\x7c\x91\xaf\x4c\xd9\x40\x90\x1c\xe6\x54\xa3\xc9\x7b\x8f\xb5\x58\x34\xb3\x80\xc7\x5f\xbb\x7f\xcb\xd1\x00\x93\xd0\xae\xff\x39\x2c\x1a\x71\x28\xd8\xee\xb9\xcd\xfb\x56\x1e\x44\x6f\x49\x8e\x3f\xf7\x70\x0c\x80\x31\x30\x80\xe0\xcf\xd6\x2b\x59\x12\x41\x98\x59\xa8\xac\x21\xc4\x23\xa4\xa3\xc0\xb4\xc0\x45\xe8\x59\x7b\xe8\xe9\x3c\x80\xf7\x59\x9d\x1b\xbc\x64\xe6\x79\x3d\xdf\x34\xee\x03\xb5\xea\x7b\x96\xb5\x93\x7c\x10\x3f\xc0\x8e\xec\x3c\x91\x53\xa5\xee\x52\x7d\xf4\xa9\xda\x38\x83\xbd\xd4\xbd\x77\x15\xf1\x57\xd8\xb5\xb2\x53\xf0\x58\x21\xf1\x0a\xa1\x6a\x6a\x73\x9f\x23\x45\x27\x25\x14\x16\xbb\xef\x6d\x34\x55\x6b\xd3\xac\x11\x67\xa9\x02\xbf\x99\x9b\x75\x99\x02\x46\x2d\xf5\x41\x07\x9d\x69\xd3\x56\x8e\x74\x43\xed\xec\xb2\x5e\x98\x66\x9d\xb7\x06\x16\x2c\x76\xd8\x23\x6d\x52\xa5\xf2\x54\x1f\x61\x9a\xb2\xd8\xea\x4b\x1c\x7f\x61\x2c\xf2\x95\x47\xe6\x61\x6d\xe6\x0e\x7c\x2d\x4d\x42\xa2\xfe\xb4\x06\xd3\xa6\x44\x12\x96\xd8\xae\xb4\x4e\x55\xb7\x15\xf0\x35\x90\x0d\x35\x43\x8f\x9a\xb6\x55\x22\xce\xd8\xd9\x56\x3f\xe4\xb8\x96\xed\xff\x17\x76\x64\xfc\xe7\xb1\x4d\x3e\x87\xa5\xe7\xf4\x96\xcd\x5d\xb5\xcb\xdc\xfd\xc8\xf6\x3e\xd1\x6b\x43\xb5\xa9\xbd\xe4\x56\x66\x35\x33\xb5\x7b\x49\xfa\xf8\x2a\xdb\x3a\x31\x7d\x28\x1b\xc5\xef\x93\xa0\x3e\x0a\xdf\xc3\x15\xd3\xba\xff\xf4\x6b\xad\x00\x16\x8a\x06\x2b\x48\xac\x7f\xf1\x56\x89\x01\x76\x43\x19\x76\x70\xc7\xe8\x38\xe6\x4d\x3f\xe2\x04\x45\x16\xdf\xe5\xbe\x8b\x11\x91\x93\x26\x71\x70\xb3\x6d\x34\x8e\x4a\x9e\x14\x90\xb8\xe2\xa3\x82\x18\x14\xfc\x7f\xbb\x9e\x07\x7d\x75\x6d\xab\x26\xbf\x2d\x41\x52\x18\x6d\x93\x5a\x83\x7b\xde\xa4\x4a\xfd\x9e\xea\xa3\x2b\xd6\x6d\x8a\x3d\x94\x10\x05\xbb\xe7\x01\x8e\xd3\x53\x98\x04\xc0\x7b\xbd\x29\x41\xcd\xe8\x3e\x07\xba\xc9\xda\x90\xf6\xaf\x1f\x3c\x4c\x9c\x5b\x1b\x2d\xff\x33\x73\xde\xad\x00\xba\x2a\xfe\xc3\xce\x81\x73\xd4\x84\x4b\xbc\x11\xf0\x30\x8c\x8d\x2f\x1f\x6a\xb2\x77\xad\xb0\x18\xfc\x4d\x2f\x6a\x08\x91\xd6\x10\xe9\x67\xdf\x67\x79\xad\xdf\x99\x0c\x98\x23\xaf\x88\xb7\x9e\xc5\xb9\xc1\xd2\x89\x95\xb2\x51\x0a\x82\x2a\xeb\x36\x73\x93\xa0\xa9\x04\xb1\x02\xe6\xf0\x61\x01\x7d\xd6\x75\xb0\xeb\xd7\x23\x09\x3c\x87\x54\x56\xe3\x81\x08\x1f\x10\x85\x17\x0a\xcc\x5c\xc7\xf6\x81\x71\xa7\x5a\x54\x03\x2c\x91\xab\x75\x5e\x95\xa5\xf3\x74\x1d\xeb\x20\x3f\xc7\x93\x4b\x2a\xae\x76\x10\xda\xdd\x22\xae\x67\x2f\xcf\x39\xec\x5e\xd2\xf4\x7e\x99\xba\x77\x86\x6c\x72\xaa\xa7\x21\x82\xbd\x97\xa6\x26\x3a\x92\x13\x77\x92\xaa\x10\xdb\xff\xa9\xda\xe0\x8d\x55\x2c\x1e\xf2\x85\x49\xa8\x22\x64\xfb\xdc\x0e\x16\x26\xcd\x1d\xb4\x17\xc2\x58\x6b\x03\xf1\x8d\xe3\x65\x85\x05\xc7\x8b\x4d\x1d\x04\xad\xc4\x0b\xb8\x57\x1c\x48\x36\x2a\xc7\x9d\xd4\x7a\xe2\xa4\xbc\xf4\x4e\x61\x86\x6c\xbc\xf6\xe2\x34\x45\xf5\xf0\x03\x84\x67\xdb\x4a\x5f\x05\xa2\x67\xb8\x36\x23\x5a\x1a\x11\x34\x6b\xab\x20\x56\xe2\xc3\x10\x0d\x16\x67\xf6\x36\x08\x1a\xdc\xbe\x3d\xe7\x42\x8b\x6f\xbf\x85\xd8\x58\xcb\xde\x21\x0c\xbb\x6f\x68\x28\x02\xa6\x21\x54\xdc\xf1\x87\x8b\x68\x82\x92\x64\xaf\x5b\x19\x1a\x8e\x69\xb3\x5b\x10\x12\xc4\x30\x15\xd2\x54\xb6\x66\x8d\xa6\x63\x01\x72\x8a\xaa\xc8\x66\xa6\xb0\xee\xdd\x2a\xab\xe1\x4a\x92\xce\x1c\x3b\xa5\x74\xde\x23\x25\x40\xa3\x1f\x4c\x6d\x10\x99\x4d\x2b\xc9\x29\xb4\x7f\x84\x64\x7a\xa0\xd8\x10\x84\xae\xa9\x64\x73\x66\xbf\x5e\xff\x61\x16\xfa\xe8\x5a\xc6\x52\x90\xfe\x34\x6b\xdc\x57\xcc\x42\xc1\xb6\x1a\x95\xb7\x05\xd1\x09\x4d\xd7\x59\x99\x37\x77\xc9\x11\xda\x4c\x12\x2e\x4e\xad\x3b\x8a\xb3\x6e\xe3\xca\x1a\x10\x33\x63\x4a\x87\x1f\x48\x8f\xde\x42\x18\xa8\xad\xf4\xbb\x90\x00\x21\xbe\xf0\xe5\x2a\x71\xc3\xdf\x99\x77\x25\xe7\x1c\x5c\x48\xc8\x1c\x68\xad\x17\x07\x3d\x44\xac\x04\x42\x15\x21\xa3\x29\x2d\x78\xf2\xbe\x78\x2f\x60\x5c\xa0\x28\x60\xc2\x51\x89\x1d\x4b\xb1\x1b\xa7\x7d\x51\x56\x0f\x20\x54\x00\x54\x53\x76\x0f\x67\xcb\xd6\xd4\x7a\x81\xac\x61\x58\x1c\x15\x3c\x82\x22\x8c\xe2\xf0\xf7\x8a\x2c\x31\x0d\x37\x18\xb4\xb5\x3d\x4a\xe6\x77\x25\x31\xb4\x85\xba\xed\xbd\x9b\x96\x15\x01\xe3\x4e\xa7\x4a\x1c\x51\x1c\x7a\xfd\xfe\x78\x39\x48\xe0\x25\xe9\xfb\xd6\xae\xf4\xa8\x6a\xe6\x4e\x0b\xe2\x59\xb5\xe1\xe3\x8a\x15\x24\x83\x8b\x7c\x03\xc5\xe3\xb1\x54\x29\x35\xbf\x30\xcd\xbc\xce\x67\x41\xfc\x57\xbd\x3a\x36\x03\xe4\x68\xbc\x12\x14\x6f\x38\x7a\x7c\x46\x71\x4f\x44\xd8\xf8\x25\x0d\x6d\x2e\x71\xe0\x76\xe7\x28\x51\x4d\x64\x07\x80\xbb\x32\x8b\x95\x0a\x25\xa3\x1c\x1e\x69\x4c\x41\xf7\x2e\x40\xa4\xef\x5e\xad\xc0\x34\xda\x43\x9e\x1b\xd2\x27\x7e\x62\x54\x0b\x4f\xbf\xab\xcc\x4a\x34\xc5\x51\x6f\xca\x1c\x5a\xbe\x32\x84\x15\x1b\x73\xc8\xaa\x56\xc7\x37\x57\x63\x88\xb8\x26\x3d\x16\x3d\x10\x8d\x04\x85\x5e\xd0\x31\xfb\xc8\xfe\x97\x50\xf4\x12\x21\x23\x26\xd2\x2e\x63\x8d\x02\x13\xef\xd1\xdb\x88\x84\x1a\x63\x77\xf0\x0e\xef\x92\x8f\x73\xcf\x38\x2d\x23\x81\x33\x92\x76\x50\xf6\x54\x3a\x11\x6d\x97\xb6\xaf\xad\xf8\xa9\xfc\xe5\xde\x00\xa5\x89\x46\x3b\xdb\x2a\xa0\x69\xf3\x25\x5c\xfc\x40\x31\x1d\xb1\xea\xc0\x6e\xc5\x01\x25\x2b\x01\x68\x49\xf7\x6a\x19\x40\x9c\x72\xff\xbc\xa8\xfd\x8b\x2b\xd5\xa0\x10\xb5\x7b\x02\xe5\x2a\x54\x78\xe5\xee\x60\x4e\x74\x7c\x2e\x78\x86\x40\x7e\x67\x9e\xd9\x03\x2d\x6b\x50\xdd\xd3\xcf\xad\xea\xcc\xad\x9c\xbe\x6c\xc7\xe4\xc1\x05\xf2\x09\x25\x8e\xfe\xda\x59\xbc\xb6\xa3\xce\x5b\xfd\xd5\x71\x36\x88\x25\x73\x77\xd9\x06\x32\xbd\x81\x78\x5b\x98\x40\x07\xd5\x22\x50\x55\x64\x43\xe8\x0c\x4a\x0a\x9c\x8f\x8b\x77\x51\xdb\x98\x62\x49\xd4\x41\x70\x27\xd3\xc9\xa2\x02\x2b\x2f\x8e\x90\xeb\xf1\x12\xd5\xc0\xc8\x1a\x09\x3a\x04\x19\x6a\x42\xd2\xda\xa7\x41\x95\xa4\x3b\x5c\x79\x69\x26\x51\xac\x63\x0d\x2c\x1b\x60\xc1\x25\x8c\x8d\x73\x7d\xf5\xcd\x43\x63\xf3\xda\x2c\x72\x28\x8f\xa1\x57\x85\x93\xcf\x0f\xe5\x62\x90\xf0\x1f\x4d\xd3\xda\x6b\x2a\xea\x6f\x19\xd8\x43\x71\x87\xf5\xe7\x76\x58\xb9\x0e\x8b\xac\xe7\x67\x75\x18\xcc\xbd\x03\x8f\xea\x30\xc9\xea\xcf\xeb\x1f\xf4\x71\x3e\xd8\x7d\x84\x51\xb0\x3c\x8b\x98\x23\x7b\x83\x2a\x1c\x1b\x55\x71\x1a\x09\x88\xb0\xe3\x46\xa1\xd5\x0e\xc4\xe9\xf7\x4d\x9d\x37\x0b\xbc\x8b\x5c\xd1\xeb\xb1\x93\xa7\xc9\x31\xd7\x4f\xbd\xe1\x23\x8d\x7a\x35\x70\x39\x3e\x2f\x49\x01\xb1\xda\xb8\x3f\x2a\xea\x8f\x3e\x36\xe9\x6d\x9a\x3c\x01\x5f\x35\x1d\xe8\xe3\xa3\xa1\xf3\x26\xf8\x8d\x8f\x06\x87\x5d\x72\x57\x63\x14\xae\xf2\x2d\xf8\xc0\x56\xf7\xd0\x84\xb4\xa9\x98\xbc\xc7\x8f\x44\x52\x0f\x3b\xf4\x4e\x13\x6d\x77\x4f\x3f\x91\x07\x30\x3d\x1d\x3e\xf4\x8e\x13\x69\xd4\x1d\x26\xdb\x93\xcf\xc8\xee\xf8\x7f\xc6\x9d\xd6\xf7\x4e\xea\x4b\x6f\xb7\xcc\xe7\xd0\x39\x89\xf6\xc4\xf9\xeb\xb9\xfb\xd4\x2e\x0b\x4c\xe6\x80\x9f\x76\x03\xaa\xf8\x06\xdc\xbb\x12\xf6\xde\x83\x4a\x42\x38\x7a\x6e\xc3\x27\xcc\x74\x97\x2b\xac\x3b\x45\x44\x6e\xe4\x0f\xc7\x59\xe7\x62\x14\x2b\xee\xe0\xeb\x51\x3f\x72\x3d\xaa\xe8\x7a\x14\x2f\xbd\xf3\x92\xd4\xdd\x4b\xb2\x77\xed\x82\x8b\x28\xe7\xcf\x0d\x9d\x2f\x00\xed\x19\xc1\x4f\x40\xb8\x1d\x7b\x03\x8a\x9d\xf4\xac\x2c\x11\x77\x42\x59\x82\x7c\x95\xd5\x39\x14\x8a\x52\x7c\xca\x9e\x43\x15\xd7\xb8\x42\x93\x0f\x59\xbd\xd0\x42\x57\x20\x5b\xdc\x67\x65\x4b\xba\x1f\x6b\x40\x82\x19\xbd\xaa\x4a\xa8\x01\x81\x04\x85\x29\x1b\xe2\x09\xbe\x46\x9e\x3c\xe4\xf5\x0b\x2c\x24\xf6\xf9\x95\xe4\xc0\xc5\x7c\xce\xcc\xc5\x55\x97\x3e\x28\x97\x17\xe6\x39\x73\xc5\x06\xf1\x82\xe6\x8e\xf6\xb3\x0a\xb1\x1a\x38\xf2\x87\xbf\x97\x96\xef\xa5\xf6\xbe\x57\x50\x5b\xef\x75\x6c\xd6\xd9\x96\xa1\x37\x58\x55\x8e\x5f\x55\xf2\xab\x14\x7d\x7b\xde\x09\xbf\xc9\x51\xea\x0c\x09\xe2\x31\xc8\x1e\xf1\x47\x40\xf2\x88\x17\x86\x30\xb8\x61\x88\x8c\x0b\xc2\x4b\xde\x4e\xd9\x94\x10\xbe\xcf\xd8\x9e\xd0\x3e\x6c\x61\x17\xef\x7a\x53\x37\x1b\x52\x4c\x94\xe6\x67\x22\x4f\x56\x15\x72\x3f\xf1\x19\xcb\xa0\x18\x07\x3e\xa4\xd1\x4b\x64\x94\x88\x76\x05\x49\xc7\x54\xb5\xc2\x25\xf0\x89\x88\xc9\x36\x6d\x5e\xe4\xff\xca\xcb\x5b\x67\xa0\x38\x9e\x34\xfb\xef\x08\x77\x01\x94\xef\xeb\xc6\x6c\x16\x55\xb9\x5d\x21\x3b\x96\xdb\x61\x03\xac\x45\x59\x53\xd1\x39\xe5\xbf\xf3\xfe\x86\xe8\xaf\x2e\x22\x89\x92\xb1\x68\x0f\x12\x8a\x01\x4a\x17\x88\x08\xc1\x9e\x37\x64\x3d\x64\x1a\xc4\x49\x89\x21\x00\x40\x46\x09\x23\x2c\xf2\xf2\x56\x61\x7a\x2b\xd1\xbf\x57\x9b\xba\xcc\x8a\x01\x29\xa9\xf8\x3a\xad\xe3\x23\x61\x80\xe8\x4b\x6c\xfd\x08\x80\x01\xdc\x9d\x67\x82\x42\x5a\xe1\x70\x27\xfe\x60\x01\xbe\x66\x0c\x74\xcf\xbc\xa8\x9b\x1b\x71\x82\xa6\xc8\xa1\x74\x72\x01\x50\xdb\x4e\x2f\x44\x36\x5f\x84\xcf\x61\x5f\xc0\x0f\x25\x9b\x71\xa1\xc5\xeb\x1e\xb8\x55\x81\xf1\xeb\x0c\x1f\xc7\x5c\x66\xcf\x24\x67\x40\x3b\x2e\x75\xda\xc7\x82\x71\x85\x48\x07\x39\xae\x4a\x0b\x17\xba\x7e\x73\x35\x96\x47\xb6\xb8\xd5\x3b\x92\x54\x92\x43\x48\x49\x36\x41\xb9\x5a\x1d\x20\xe3\x7e\x80\x47\x4b\x03\xef\x04\x9b\xd6\x9d\xb0\xc7\xb3\x41\x12\xa3\x35\x42\x67\xc1\xda\x7c\x68\xcc\x73\x70\x53\xe8\x4d\x75\x10\x94\xe1\x5d\x45\xab\xe9\xe8\x7d\x6d\xca\xf9\x5d\x10\xd8\x8c\x52\x30\xd1\xd2\xc5\x68\xe5\xd1\x74\x5e\x1b\x53\xae\x8b\x6c\xab\x9c\xf4\x81\x8b\x4f\xee\xf8\x2a\x40\xc8\xed\xdb\x60\xa7\xa5\xfb\xd1\x8a\x6b\x56\x59\x1f\x84\xc3\x83\x20\x26\x66\x8f\x3f\xba\x4f\xcb\x6d\xb0\xd6\xe0\xde\x79\xeb\xce\xcd\x44\xdf\x71\x3d\x17\x32\x5f\xc4\xd0\x22\xe9\x9c\xd4\xc1\xdd\x0c\x39\x3c\xa8\x99\xdb\xac\x88\xf0\x04\xbb\x89\xea\x1e\xeb\xb5\xc9\x6a\xdc\xf1\xfc\x07\x16\x82\xf1\xf0\xc3\xf2\x96\xf5\x4c\xbb\xf6\x68\xf8\x3c\x6a\xb0\x01\x85\x88\x32\xaa\xb1\x6f\x78\x88\x1a\x87\x97\xe2\x1b\xd6\x71\xbd\x66\x8d\x90\xf0\x03\x47\xc3\x28\xfe\x12\x2f\xb5\x18\x1d\xe9\xbb\xb7\x1f\xcb\xcb\x56\x3d\xba\x6f\x64\x54\x3d\x32\x69\x7d\x80\x5a\x71\xea\xf0\x4c\xd0\x6b\x34\x06\x28\x30\x29\xa4\x08\x9b\x61\x16\xa4\xe4\x3f\x09\xfa\x87\x6e\x92\x3b\x89\xc5\x2b\x8a\x7c\x9e\xb7\xc5\x96\xe0\x58\xfc\x5f\x59\xd3\x98\xba\x65\x2a\x10\x4c\x26\x46\x29\xaa\x44\xd1\x69\xda\xdc\xe5\x6b\x44\x07\x2c\xaa\xba\x41\xac\x2b\x45\x30\xe3\x0d\x10\x80\x0d\xed\x29\x2e\xce\x53\x75\xe9\xb4\xfa\x22\x98\x64\x85\xb7\x2c\x3a\xf1\x75\xbc\x43\x13\x87\xb4\x01\x77\x92\xf0\xaa\x9e\xce\x64\x5d\xe7\x55\xed\x28\x09\x05\x4c\xa0\xff\xa2\x3a\xa8\x8f\x29\x87\xf3\xf7\x42\xbb\x7f\x00\xcc\xc0\x45\x55\x3e\x7f\xc8\xf2\xfb\x0c\x0b\x1f\x57\xeb\x4d\xd1\x54\xf5\xd6\xb9\x67\xd3\xf9\x9d\x59\x99\x26\xd5\xe3\x92\x72\xff\xd2\xc5\x6e\x1c\x00\x58\x05\xa1\x78\x42\xd1\x0a\x0a\x36\x06\x93\x42\xae\xa8\xcd\xda\x4d\x5b\xd5\xa4\xbd\xe9\x9e\xe9\xcf\xd7\x06\x9e\x2a\x58\x56\x6c\x17\x19\x75\xe8\x46\x80\xe2\xe6\x0d\xdb\x43\x44\xd2\x13\xf7\x42\xc1\xa6\xf7\x5d\x61\x96\x16\x67\x1f\xcf\xb6\x38\x83\xbd\x26\x72\x77\x91\xbe\x55\x2a\xcf\x53\xfd\xf1\x2f\x18\x35\xd8\xdd\x7f\xd5\xa8\x69\x1c\x35\x45\x60\xcd\x2f\x19\x32\x1d\x0e\x99\xfa\xd2\x21\xb3\x97\x36\xec\x0e\x17\xdc\x64\xe3\x81\xf3\x2d\x8e\x81\x87\x4f\x19\xdc\x49\x4e\xf9\x42\x28\x3c\xdd\x65\x65\xa4\x5c\x96\x49\x6e\x01\x7c\xba\xb7\x39\xe7\x83\x88\x76\x0c\x06\xa6\xd1\x7d\x0b\x56\x7d\xd9\xd0\x73\x32\x2d\xb7\xeb\xe3\xd7\xaa\xd8\x94\xe0\x0a\x74\x56\xc5\xf5\xce\x29\xd9\xdd\x21\xaf\x14\x1f\x20\x51\xec\x91\x40\x47\xb0\xb9\xb7\x67\x9b\xe3\x08\x70\x0f\xc0\x92\x0d\xc0\xc1\x80\xa9\xe1\x30\xee\xa0\x72\x37\x07\xe8\x16\xe6\x71\x17\xf6\x9a\x6c\x5a\x53\x37\x20\xdb\x88\xbd\x8f\x5f\xb2\x49\xf4\x7d\x9e\x61\x9c\x9b\xbe\x9e\xf8\x88\xe6\xe7\xae\x10\xc5\x2e\xe6\xe7\x2f\x03\x2d\x97\x81\xea\x2e\x03\x84\x5c\x8f\x1c\xeb\x91\x6f\x2b\xbb\xad\x0d\x9a\x21\x04\xea\xe4\x1b\xc2\x8d\xa1\xed\x94\xcb\x6c\x06\x40\x62\x5a\x75\xb3\x6d\x04\x6f\x48\x68\xcd\xfb\x0c\x7a\xf2\x48\xd4\xc6\xc3\x04\x28\x5e\x39\xdb\x72\x54\x00\x1f\xcf\x96\xc4\x23\x4e\x9a\x97\xfe\x67\xc6\x9f\xaa\x6e\x13\xbd\xb2\x2e\x11\xdc\x58\xc4\xad\x6e\x6f\x86\xec\x0f\xb6\x26\x16\xa6\xae\x6e\x33\x58\xe4\x99\xc3\xdf\x72\x5d\x8e\x92\xc9\x02\x9c\x8c\x07\xce\x92\xaf\x6b\xf3\xfb\x66\x91\xc3\x0c\xd0\xc7\xa2\x4b\xeb\x59\xa3\xef\xaa\x12\x47\xd1\xab\xc1\xa7\xca\x5f\x65\x76\xfc\x1b\xa7\x12\xdc\x77\x62\x82\x59\xab\x7f\xc9\xd6\x59\x39\x10\x65\x27\x72\xc9\x29\xb9\xd6\x7a\x33\x9d\xc7\xb3\x41\x27\xf4\x7c\xdc\xcd\x21\x8b\xb1\x1d\x28\xf7\x9e\x0b\x63\x56\x2e\x4c\x90\xf1\xb8\x22\xee\x13\x87\x16\xff\x2d\x93\xfd\x0e\xfa\xe2\x47\x57\xd1\xe8\x3e\x61\xd8\x08\xcc\xb4\x61\xef\x40\xae\x4c\xa4\xe0\x82\x23\x4d\x83\xa2\x63\x4b\xd6\x51\x5f\x3d\x87\xb7\xea\x5c\x9e\x61\xb9\x29\x0a\xeb\xbd\xa3\xf7\x15\x2e\xe8\x08\xf2\x52\x32\x09\x14\xac\xee\xb6\xd2\x06\x6d\x75\x8a\xd4\x79\xc7\xcd\xcf\x88\xb7\xf6\xa2\x63\xb9\x7f\x2a\xf6\x4c\x03\xe7\xc3\xdd\xde\x43\x23\xe7\xdb\x14\xf6\x17\xa8\x7b\x31\x10\xf1\xa3\x0f\xb2\xda\x91\x7b\xe7\x22\xb0\x4a\x91\x2e\x8b\x13\xdd\xd1\x1f\x6e\xae\x6f\x86\xe7\xe7\x9f\x84\x18\x0b\x55\x85\xb2\xb2\x8e\xd0\xe3\x19\x5e\xbc\xe3\xaa\xd0\xf7\x37\xe7\xe7\xa3\xe9\xb5\x7a\x5c\xee\x27\xf1\x55\xa0\x93\xf7\xef\x47\x57\x53\x5f\xaf\x0a\x95\xc8\xd0\x2a\x14\x1d\xab\x8b\x89\xbe\x1a\x5d\x5e\x8d\xa6\xa3\x8b\x6b\x2c\x71\xd6\x93\xab\x48\x58\x87\x85\x7b\xf4\xd9\xe4\xe2\x6c\x74\x75\xc1\x45\xc9\xb6\xc1\x84\x55\x7c\x12\xe5\x14\x7c\xa6\xd7\xc3\xeb\x9b\xeb\xc9\xd5\x27\xa7\x40\x62\xdf\x5b\x2a\xfb\x38\x7d\x20\x50\x57\x81\xe7\x26\xe2\xa1\x20\xb1\x33\xbe\x3e\x1f\x25\xb1\xe0\x40\xc2\x72\x03\x7a\x97\xdc\x40\xa2\x2f\x26\x17\xe3\x8b\xf7\x57\xe3\x8b\x9f\x46\x1f\x46\x17\xd7\x89\x42\xd9\x24\x3d\xfc\x71\x3a\xa2\x7a\xd6\xf3\x21\x0c\xa1\x13\x48\x41\x75\x9e\x69\xa2\x51\xbc\xe5\xec\x53\xa2\xe9\x4b\x38\x34\xf8\x2d\x6a\xc0\xf6\x6e\x74\x75\x35\xb9\x9a\x26\xfa\xe3\xcf\x23\x68\x60\x72\x05\x15\xe4\xef\xc6\xd3\xb3\xc9\xaf\xa3\x2b\x3b\x11\xa9\x9e\x4e\x3e\x8c\xf4\x2f\x37\x57\xe3\xe9\xbb\xf1\x19\x8e\xed\xbb\x09\xd6\xaf\x9f\x9f\x4f\x3e\x82\x96\xd3\xe8\x1f\x67\xe7\x37\x53\x2a\x4b\xef\xea\x1a\x25\x7a\x3a\xc1\x3a\x60\xff\xc1\x0f\xc3\x4f\xd8\xc8\xe5\xe5\xf9\x27\x52\xd0\x41\xad\xc1\x73\x0f\x62\xac\x4a\x7d\x9e\x53\xf4\xdb\xa9\x3f\x85\xe5\xc5\xbb\x95\x82\x12\x25\x85\x85\x40\x1e\xc8\x2d\xa8\x8e\x76\x0f\x94\xb8\x7f\xa2\x92\xfb\xeb\x9f\x47\x76\xde\xdf\x93\x6e\x10\x6b\xf6\x28\xaf\xd9\x93\x84\x8a\x3d\x89\xbe\xbc\xb9\x18\x43\xf9\xf8\xe4\x4a\x8f\xfe\x31\xfa\x70\x79\x3e\xbc\xfa\xb4\x5b\xc8\x27\xac\xe0\x26\x61\x1f\x59\x04\xee\xb5\x70\x5c\x9f\x0f\x50\xbe\x51\x1d\xe5\x1b\xbb\xd5\xbf\x4b\x41\xc6\x26\xc7\x63\x08\x60\x26\xd7\x31\xb9\x60\x8f\xa9\x71\x67\x6a\x83\x67\x0f\x9c\x94\x5e\xbf\x33\xd0\x6c\xc4\xf4\xac\xbd\x4d\x66\x35\xe4\xcb\x42\xf3\x65\x57\x82\xda\x57\x5a\xc9\x0a\x2b\xd5\x95\xf5\xdc\x7d\x5d\xfb\x6c\x47\x9f\x3b\xec\xa2\x1e\xfb\xb4\x3c\xb5\xd0\xf2\x74\x81\x66\x52\x72\x77\x1d\x54\xb2\x04\x6c\xa7\xb2\x27\xc7\x97\xed\x05\xcc\xcd\xa7\x7c\x6a\x37\xfa\x24\xd1\xa7\x89\xfa\x36\xd1\xaf\x13\xfd\x1d\x8a\x03\x7d\x8f\x5d\x6b\x36\xf5\x7d\x7e\xef\x93\x83\x34\x4d\x3d\x65\x6f\xb3\x0e\xc8\x13\x83\x05\x7d\x50\x4f\xbc\xeb\x62\xf0\x12\x85\xd0\x55\x88\xd8\xc4\x74\xdb\x01\x88\x4d\xb6\x97\xad\x31\x33\x00\x10\xae\x7d\x69\x10\xcb\x65\x9e\x6d\xe8\x51\xf2\x98\x8d\x5e\x9b\xc2\x64\x02\x12\x43\x33\xe8\x04\xff\x94\xc3\xcc\xe0\xf2\x81\xe0\x62\xd3\x56\xeb\x50\x2e\xd5\x87\xba\x11\x4a\xd9\xe6\xd6\x93\xe8\x44\xbe\x54\x88\xb5\x34\x9d\xd2\x53\xe8\x22\x94\xec\xe4\xed\xdd\xa2\xce\x1e\xa2\xdb\x55\x56\xb9\xfb\xae\xd9\x46\x39\x74\x0f\xf9\x81\x5c\xe0\x07\xc0\xd8\x49\x3a\x66\x7b\xb4\x21\x38\x05\x35\x20\x7d\xfc\x30\xb3\x4f\x81\xb4\xbc\xdc\x18\xb7\xe0\x96\x15\xf3\x67\x63\x66\x91\x83\xb2\x7e\x21\x2b\x0f\x95\x85\xc9\xc0\x33\xe0\xfb\x54\x7f\xc8\x9b\xb9\x29\x8a\xac\x34\xd5\x06\xe9\x0d\xbc\xaa\xeb\x61\x60\x1f\x9f\xec\x90\x71\x42\x15\xda\xfb\x76\x0a\x5d\x2a\x50\x08\xbd\x4a\xb4\xaf\x80\xaf\x79\xb0\x00\xe6\xbb\x23\xc4\x72\xd6\xf4\x2e\x64\x4a\xbf\xf5\x12\x92\xcd\x9e\xf8\x62\x51\x04\x39\x7a\x13\xf5\xf8\x9b\x84\x41\xde\xce\x2b\x45\x3b\x53\x7d\xc6\x2b\xcd\x21\x25\x45\x55\x7e\xa4\x50\xd3\x29\x10\x6c\x74\x5e\xa2\x52\xbc\xf5\xfd\x4a\x53\xc2\x5a\x81\x1d\x8c\x8d\xfa\x2d\xad\xd0\xcd\x6a\x7d\x4a\x4f\x23\x07\x14\xf4\x0c\x1a\x71\xb5\xaf\xd4\x4a\x04\x32\xb0\xa7\x20\x92\xed\xc5\x49\x63\x09\x2f\x97\x74\xe0\xac\xa2\x4b\x56\x3c\x59\xc9\x9c\xca\x61\x98\x1b\x38\x34\xc8\x54\xc8\x24\x66\xf4\xbe\xd8\x55\x20\x92\xa0\x12\x2a\x4e\x64\x51\x84\x9a\xd2\x20\x0e\xa1\xaa\x02\x64\xab\x6f\x08\xc7\x08\xb6\x90\x1f\x22\xcc\xfb\x5d\x54\xf0\x26\x54\x66\xb2\x63\xa0\x5d\x47\xc8\xaf\xc1\x70\x11\x71\xc7\xd1\x2d\xa8\xe6\x55\xd9\x18\x9e\x57\x99\x38\x81\x4f\xd7\xa4\x8a\x0b\xd2\xba\xae\x3d\xe1\x45\x83\x24\x42\x7e\x5b\x9a\x85\x12\x03\xb5\x25\x1f\x0a\x79\xca\x49\x71\xa0\xbf\x55\x2c\xd1\x0e\xae\x79\x59\x82\x0f\x51\x0f\x20\x17\xd0\x6e\xc4\xf5\xcc\xb4\x0f\x86\x64\xb3\x9c\xce\x76\xde\xde\x29\x5f\xb4\xe5\x77\x2e\x2d\x5f\xbc\x53\x20\x30\x63\xdb\xaa\x8d\x1d\x03\x58\x6e\x7c\x2d\x34\x89\x7f\x44\x83\x25\x18\x81\xdb\x11\xd7\x85\xf9\x47\x78\x99\xdb\xdc\x3d\xc7\xa7\xad\xec\xa8\x29\x0a\x72\xce\xa0\xd2\x85\x8a\x63\x24\x57\x25\x4f\x22\xb9\xc8\xab\x6c\x4b\x69\x06\xce\x9c\x84\xd5\x43\x6c\x51\x44\x23\xc7\x61\x75\xd0\x21\x22\x66\x3a\x19\x9c\x5e\x6d\xe0\x2e\xe5\x58\xb4\x7b\x5d\x15\x60\x0a\xc9\x1f\xb5\xcd\x43\x3c\xe5\x7a\x47\x74\x27\x71\x06\x59\xc4\x64\x01\x69\x36\x53\xce\x11\xef\x1c\x95\xe5\xd9\xe1\x5f\xd4\xd9\x12\x9a\xe1\x14\xae\xbb\x71\x72\x40\x9e\xb8\xfd\xfb\xa3\xa9\x4b\xa3\xcf\xaa\xf2\xde\x2e\x02\x91\xaa\xb8\xf4\x05\x29\xd5\x52\x9f\x8b\xca\x65\x3d\xe4\xa2\x42\xac\xf8\x3a\xb6\x4e\xf2\x0a\x33\xfe\x55\xa9\xa7\x66\xdd\x42\xa0\x4c\x9f\x7e\x9f\xe8\x93\x37\xdf\xbd\x19\xa0\x09\x72\x55\xad\x8c\x12\x4f\xaa\x96\xfa\xe4\xcd\xeb\x13\xfc\xe3\xc7\xf1\xe5\x44\x90\xa5\x5e\xd7\x26\xc3\x43\xe6\xe4\xcd\x9b\xd7\xe2\x23\x97\xa2\x80\x0b\x6e\x88\x4b\xcf\x07\x12\x7e\xc9\x8d\xdd\x4d\x69\x77\x44\x93\x15\xa2\x7d\xd1\x8d\x63\xc0\xf3\x01\x4a\x5e\x55\xa5\xfe\x65\x53\x6c\xf5\xe9\x2b\xe8\xf9\x09\xe6\xe4\x1a\x37\x3b\xa8\x4f\x12\x4c\x05\x84\x7f\xe8\x06\xce\x59\x09\xbc\x30\xf7\x59\xd9\xaa\x00\x49\x17\xd0\x7c\x9c\x07\x56\x0d\x11\xd3\x93\x49\x34\x33\x7c\x1c\x2d\x88\x62\x10\x4c\x2a\xce\xa9\xd6\x76\x83\x54\xe5\xc2\x29\xc5\x34\xb2\x26\xcb\xa5\x04\x85\x09\x67\x0d\xd1\x16\xc7\xc6\x7f\x81\x93\x4e\x3b\x82\x13\x4e\x68\x1b\x36\x6f\x56\x2f\x40\x52\x0b\x32\x1f\x7d\x2b\x55\xf5\x1a\x89\x45\xf6\xe0\xc9\x83\xc4\x66\x14\x00\xff\x6e\x34\x53\xb9\x3b\x03\xeb\x10\x3b\x5f\x03\x41\x68\x19\x48\x92\x5c\x29\x62\x70\xdf\xaa\xf8\x56\x84\x84\x58\x50\x14\x26\xa0\x55\x82\xcd\x10\x12\xa9\x32\xbf\x16\xde\x97\xa9\x52\x1d\xd0\xe4\x05\x64\xb8\x7b\xfe\xc0\xac\xba\xfe\xd8\xee\x5e\x8c\x2b\x28\xdf\x29\x2b\xcf\xe2\xff\x70\x97\xb5\x4d\x05\x26\xeb\x8e\xd2\x31\xc4\x8f\x77\x1e\x27\x49\x54\x88\x51\x9f\xcc\x09\x56\x41\x41\xe8\x04\x9e\x79\x48\xa2\xd0\xde\x99\xaa\xde\x76\x98\xf7\x7d\x1f\x7a\x54\x02\x54\xc4\x39\x40\x5c\x93\x09\x1e\xd3\x48\xa1\x31\x87\xcc\x3b\x16\x16\xc3\x65\xf4\xcf\x8d\xdd\x73\x59\xe1\x1e\x41\x35\x75\xd1\x3b\xf2\x18\x15\xec\x23\x46\xee\x05\x06\xdd\xaa\xda\xdc\x56\xf0\x5f\x0f\x95\x3e\x3e\x1d\x68\xb8\x65\x81\x24\x48\xe5\xcb\xee\xc8\xdc\x85\x24\xfd\x8e\x86\x83\xe3\xc3\x64\x8c\xb9\x13\xda\x39\xbd\x89\x72\xe6\x11\x4a\x8a\xfa\x12\x15\x54\xaf\x29\xf2\x5b\x5f\x18\xc9\xdf\x4f\x95\xa2\x30\x39\x9f\xa8\x5c\xfb\x21\x92\xc0\x54\xc2\x04\x6f\x11\x95\x08\x67\xa2\x98\x34\x6f\x94\xbb\x64\xbd\xff\x70\x76\x76\x79\x9e\x74\xdf\xd3\x61\x31\x30\x9d\x9d\xff\xcb\x38\xd4\xc3\x6c\x4b\x61\x71\x45\xab\x80\x3c\xf3\x3a\x83\xba\xb0\x3f\xf4\x51\xdc\xda\x11\x03\x9a\x98\xc3\xdf\x7f\xb6\xaa\x75\x51\xdd\x56\xf6\x76\xe8\x59\x85\xfe\x4a\x0c\xb3\xb3\x6c\xea\xf4\x7c\x2b\x55\x43\x94\x0e\xe2\x24\x54\xe3\x95\x0c\x60\x81\x84\x0e\x76\xfc\xf5\x67\xf6\x69\xe5\xf3\xf9\xa6\x06\xbf\xd1\x77\x74\xd3\x64\xb7\x24\xb3\x5e\xe4\x25\xa5\x9f\x29\x0d\xe1\x35\x4e\x11\x3e\xa8\x1f\xcc\xac\xc9\xa3\xf2\x38\x05\x68\x2c\x5f\x36\x2d\xe5\x48\x08\x87\x98\xa3\x7e\xa3\xfd\xff\xbd\xf0\x01\x3c\x92\x7c\xdf\x44\xd9\x8f\x9f\x38\x2c\x32\x77\x90\x87\xc0\xfe\xef\x0c\x35\xbd\x08\xa9\x70\xa2\x68\x18\x51\x88\xcf\xe9\xb3\x73\x1a\xdf\xaa\xbe\xfd\xe6\x7f\x37\x82\xd6\x7f\xf3\x4f\xfa\xcd\xf0\xfd\xf9\xf3\x93\xf4\xf4\xdf\xa8\x00\xb8\x9f\xff\xf5\xe4\xe4\xdb\xd3\x98\xff\xff\xf4\xdb\xd3\xd7\x5f\xf9\x5f\xff\x8e\x9f\xe1\xdc\xee\xd4\x7c\x8e\xac\xfd\x8e\x62\x94\x19\xff\x4f\xd2\x53\xf4\x0f\x7a\x3f\x17\x50\xd9\x97\xdb\xa8\xfe\xd5\xa9\xcd\x36\x77\xf9\x5a\xa1\x7c\xd9\x44\xc6\x0f\x8e\x06\xfa\x01\x6c\x37\xa0\x08\x23\x81\x33\xc7\xb4\x35\x80\x0b\x8d\x08\xf0\x5b\x59\x4b\xa8\x58\xb5\x7a\x05\x85\x97\xad\x29\xb6\xa2\xd0\xb0\x17\x98\xc7\x57\x54\xf0\xfc\x1f\x1c\xa7\xaa\xbc\x75\xfa\xdf\xf4\xde\x0f\x88\x52\x8e\xd4\xdc\x05\x79\x83\x4b\xd5\x17\x97\x3f\xaa\x16\xa7\x3a\x9d\xd2\xc7\xc0\x5f\x32\xe0\xa2\xf4\xe7\x4f\xa9\x4a\x4f\x94\xfd\x8b\x2f\xc4\xc3\x3c\x33\xc7\xf6\x4e\x00\x46\xd9\x23\xbe\xb6\x32\xf5\xad\xc7\x91\x3a\xb2\xc6\x40\xa7\x8c\x90\x44\x8d\x41\x34\xae\x60\x6b\x08\xbb\x8f\xfa\x38\x01\x95\xa7\x17\xa4\x03\x87\xc6\x9a\x32\x38\xdc\xeb\x0c\xc2\x18\xa4\xf1\x6a\x57\xc1\x82\x4c\xa9\xb6\xae\x40\x4a\x37\x4e\xb1\x3b\xf2\x01\xb3\x9a\x55\x8b\xdc\x97\x3e\x44\x9d\x70\xa2\x88\xdd\x36\x12\xce\x1d\x26\x38\x14\xf0\x46\xc0\x1f\x06\x25\x2c\x76\xa5\x00\x99\xdd\x13\x5f\x4d\x20\xf1\x55\xb0\x5a\x45\x3c\x2c\x55\x4a\xa2\x6f\x99\xe1\xe1\x93\x27\x62\x6f\x33\x64\x24\x83\xa7\x4f\xb1\x3a\x95\xe9\xe2\xed\x4a\x7a\xe7\x1e\xaf\x3e\xd2\xe3\xb3\x56\x14\x94\x25\xa1\x52\x6e\xc2\x43\x8c\x52\x4f\x74\x27\x3b\x08\x35\x55\x18\xa8\xe8\x41\x9d\x37\x07\x83\xe2\x01\xc6\xa9\x41\xbd\x2d\x6a\x01\x28\x30\x19\xf9\x61\xc7\x10\xcc\x6b\xa8\x3b\x5e\x53\x25\xc8\x9f\xad\x34\x45\x5b\x54\x8c\xc2\x76\x74\x80\x45\x46\x07\x23\x3d\x72\xc3\xa1\x90\x77\x3f\x1e\x09\xb6\xe2\xfd\x50\xe8\xde\xa1\x00\x80\x4c\x56\x5b\x97\x5e\x79\xb0\x64\xf7\x89\x32\x27\x3d\xcf\x8a\xf9\x86\xec\xc0\x8a\xe4\xc0\x7d\x38\x14\x1f\xa1\x9c\x5c\x81\x0b\x90\x74\x06\x0c\x6d\x63\x14\xf2\xa7\x71\x8e\x28\x2c\x2e\x5c\xb9\x19\xa9\x20\x4b\xd3\xda\x6e\x70\xf1\x27\x45\x93\xef\xb0\x9c\x95\x8f\x3a\x47\xf3\x54\x56\x52\xca\x2b\x17\xb3\x8e\x7c\xa1\x08\xde\x56\xf0\x8b\x84\x4d\x2b\x50\x18\x83\x54\x3d\xa0\x1f\x29\x24\xb8\xaa\x5a\x66\xa8\x83\x62\xf2\x80\x8f\x36\x6f\xdc\x93\x15\xe2\x3d\x58\x8c\xfe\x40\xc8\xa2\xf0\x22\x3e\xb2\x4f\x18\x26\xe2\xed\x27\xf9\x4f\xe2\x80\x25\x0f\xb2\xf1\x1e\x84\x07\xab\xe7\xa5\xac\x19\x0e\x37\x6f\xce\x07\x4c\x0f\x6a\xc7\x35\x15\xbe\x53\xa4\xd6\x2f\x0b\xf3\xc9\x6b\xa6\x00\x2b\x99\xe4\xee\xa4\x75\xa5\x3b\xbe\x6b\x70\xc5\x49\x60\x91\xf7\xd4\x28\x83\x91\xb3\x88\xbf\xbf\xd4\x80\xff\xc7\x20\xf5\x0c\xf9\x7e\x49\xcf\x8d\x21\xe5\xf2\x7a\x60\x75\xe0\xc0\xea\xa3\xe1\x54\x3b\x4a\x73\x18\x26\x4a\xe9\x2b\x96\x79\x4f\x18\x52\xb4\x57\x45\x2f\xe9\x21\xe5\xc3\xf0\x95\xaf\x5b\x03\xdd\xd5\xc9\xc5\xf3\x20\xab\x1f\x23\x03\x6c\xf3\x8f\x61\x03\x52\xe0\x3a\x1f\x5d\x5c\x8f\xaf\x46\xfa\x6a\x3c\xfd\x3f\xf5\xd0\xb1\x79\xff\x8f\x9b\x21\x34\x43\xa9\xe1\xc9\xd5\xf8\xa7\xf1\xc5\xf0\xdc\x51\x94\xdb\xd7\x83\x4c\x3b\x1a\x30\x4c\xbb\x3e\xba\x52\x93\xf7\x4e\xda\x3e\x24\x6b\x2d\xb5\x69\x1a\xf2\xe0\x7b\xdd\x13\x7d\x51\xc9\x8c\x48\x67\xb9\x74\xf3\xc9\x44\xd6\x2c\xa6\xc5\x17\xfb\x01\xa7\xbb\x07\x00\x2c\x25\x00\xe0\x06\xbe\x50\x56\x48\x96\xb6\x6a\x5a\x64\x74\xb2\xf3\xb6\xe1\x3f\xc9\xe0\x46\xa2\x3c\xf2\x4f\xb7\x55\xdd\x4a\x39\x9d\xd2\xdc\x16\xf9\xad\x5d\x3e\x83\xc4\xa9\x0c\x27\x81\x0b\x98\x50\x00\xc0\x5e\x07\x6e\x95\x07\x21\x16\x61\xc8\xb8\x40\x0a\xd4\x3d\x25\x4e\xaf\xb0\x37\x38\x02\x5c\x44\xfd\xd1\x11\x3e\xd7\xee\x32\xdb\x21\x60\xdb\x45\x00\x78\x86\x35\x43\xcd\xa6\xe8\xcc\x81\xa2\x93\x51\x40\xa8\xa3\xdd\xb0\x7f\xa5\xf2\xb3\x97\x55\xad\x8a\xaa\x81\x4e\xdc\x56\xd5\xc2\x3a\xe2\x09\x1a\xae\x4d\x5b\xad\xd7\xd9\x2d\x98\x49\xab\xf5\xc6\x76\x6c\x99\xe5\x05\x11\xec\xad\xb2\x62\xb9\x29\x09\x20\x45\x03\x01\x57\x5f\x51\x38\xcc\xbd\x43\x1b\xba\x37\xad\xb5\x7d\x18\xe2\x3a\x21\xf2\x23\xe7\xbd\xe0\x79\x17\xa1\x7e\x27\xe3\xe7\xff\x68\x87\x7d\x61\x32\xe4\x66\xc4\xa9\xc8\x0a\x9d\x97\xbf\x6f\xea\xad\x50\x79\x11\xd7\x4d\x55\x3f\x6b\x94\x9f\xfd\xa8\x8a\x26\xc4\x22\xda\x33\xe4\x2e\x9f\xe5\x2d\x65\x6f\x7c\x17\x53\x3d\xad\x56\x11\xd6\x4e\x2d\x2a\x2f\xa6\x25\x81\xc2\x44\x5e\x1a\xbc\xdf\x01\x91\xb2\x44\x35\x14\x14\xf3\xed\x38\x3e\x11\x6c\x88\x53\x13\x6e\x64\x30\xbd\x70\xee\xf7\xa3\x30\x13\x30\xe7\x00\x19\xae\x23\xf1\x6b\x49\x56\xba\x86\x24\x43\x8d\x65\x7c\xab\x7e\x63\x7c\x09\x13\xfe\x87\x1d\xd6\x50\xcf\x15\x64\x96\x90\xfe\xcd\x9a\x45\x2e\x74\x12\x28\x37\x2b\xa2\x60\x01\x42\x63\x3b\x4c\x15\xc3\x2a\xbb\x16\x43\xc7\x85\x60\xbc\x63\xc5\x87\xbb\xca\xf4\x2a\x9b\xdf\xe5\xa5\x79\x5e\x9b\x6c\xe1\x42\xd1\xbc\x0d\x1e\xb3\xe2\x04\x8d\xb6\x22\x96\x6c\xff\xe5\xf0\x93\x61\xd9\x94\xbf\x04\x9b\xb4\x0b\x77\x08\x41\xfd\x4d\xd6\xe6\xcd\x92\xaa\x43\x7c\xe4\x10\x38\xe7\x0a\x54\x9a\xda\xfd\x1a\x2a\x7e\x0d\xb8\xd0\xb5\x2c\xa4\xaa\x0d\xb0\x94\x56\xf5\x76\xb7\xdd\x86\x11\x36\x95\x97\xe6\xcf\xb5\xb5\x4d\xb1\xc8\x04\x35\x91\x4a\xcc\x6b\x23\xad\x1f\xe1\x77\x96\x88\x9c\x85\xd1\xc9\x1a\xff\x86\x8c\x48\x80\xc4\x78\x24\x58\x1c\xdb\xc7\x98\x93\xf3\x95\x78\x18\x1f\x43\xa6\x57\x1c\x63\x80\xad\xba\x17\x51\xe2\x45\xa0\xc4\xe7\xe9\x3e\x2d\xfa\x42\xe8\x81\xab\x3e\x9b\x27\x55\xea\x03\xa6\xeb\x04\x26\x0a\xde\xf6\x12\xbd\x82\xe1\x9c\x0b\x6a\x3b\x39\xdf\x5d\x10\x28\x4a\xeb\xd1\x66\x84\x31\x33\xf5\x13\xaa\x88\xb9\x70\xc8\x29\x45\x23\xfe\x19\xb4\xea\x32\x60\x7c\xdb\xe4\xad\xcf\x58\x6e\x6a\x38\x62\xcc\xad\x53\xb6\xb3\xbf\x9f\x4c\xc7\xfa\xcc\xd4\xe4\x53\x54\x6b\x53\x92\xea\x9b\x72\x62\x4f\x8c\x14\x8f\xc2\xca\x90\x13\xf0\x49\x62\xf6\xc7\xa1\x4b\x47\xdd\xc1\x52\x9d\xc1\x3a\xb2\xde\xea\x06\x48\x8a\x97\x75\x0e\x2c\x62\x98\x74\x90\x9e\xac\xf7\x52\x9d\x39\xd1\x56\x6a\xc3\x48\x1a\x21\x98\x7f\xc5\xfb\xe6\x46\xb0\xe9\xb8\xaa\xab\xf8\x62\x83\xb3\xe6\x21\xdb\xc6\xec\xa8\x1c\x64\x35\x0b\xba\x6b\xd1\xdf\x14\x75\x5a\x82\x48\x61\xb6\x45\x6c\xae\x9d\x49\xb7\xd4\xc1\x41\x6a\x28\x3c\x0b\xae\x4f\x6b\xea\xa5\xa9\x8d\xe3\x02\x06\x34\x02\x94\x4b\xe5\xac\x62\x0c\xd7\x04\x10\x0b\xe2\x46\x62\x45\xc5\xc2\x27\xa4\x7c\x42\xf2\xf8\x6c\xa0\x4f\x5f\xbc\x38\xd5\xe7\xd9\x03\x64\x76\xf5\x28\xd5\x57\x55\x63\xca\x54\x0f\x7d\xc2\x81\x69\xae\x52\xa5\xbc\x4c\x9c\x6d\x49\x06\x56\x76\x8b\x43\x06\x4a\x90\x7d\x0a\xe1\x69\xd8\xc5\xc7\xd2\xdd\x6c\x0a\xf7\x3a\x32\x0a\x65\xf9\x1c\x93\x22\x98\xf8\xff\xc5\xc2\xcf\xe9\x37\x67\x67\x2f\x9e\x9f\xfc\x5b\x74\xbf\xf8\xe7\x91\xf8\xef\xb7\xaf\x5e\xbc\x8a\xe3\xbf\xaf\xbe\xfb\xaa\xff\xfa\xb7\xfc\x74\xd2\x2d\xe7\xe0\x54\xd8\xdb\x57\xa9\xb3\xb3\x17\xfa\x04\xa4\xbe\x1c\xc0\x20\x56\xd2\x3a\x4c\xeb\x4b\xed\xd1\xfa\xd2\xbd\x5a\x5f\xef\x26\x67\x37\xd6\x6d\x8c\xc5\xbe\xd4\x63\x62\x5f\xdd\x2e\xee\x14\xfb\x52\x07\x89\x7d\xe9\xc7\xc5\xbe\x6e\xa6\x80\x31\x0f\x3b\x4e\x60\xe7\x40\x5c\xec\x0a\xbc\xd3\x69\x28\x42\x05\x52\x57\x91\x36\x98\x72\xda\x60\x7a\x8f\x36\x58\x00\xa6\xde\xff\x6c\xb5\xe7\xd9\xa9\x52\xd3\x36\x6b\x9d\xc4\xcb\x25\xe6\x6f\x91\xb5\xd1\x5e\xc9\xf6\x97\xab\xaa\x69\xa3\x72\x1b\xaa\x7e\xe3\xb3\x12\xc2\xd5\xa1\xb9\x60\xef\xa2\x25\x7a\xc1\x18\xab\x56\xfe\x42\x40\xe2\x50\x34\xda\x30\x12\xaa\x8f\x59\xf8\x04\x88\x4f\x07\x5e\x61\x0a\x22\x7a\x04\x2a\x6a\x36\x33\x72\x1f\x30\xa8\x72\xdc\x0c\xf4\x31\xd8\xb3\x64\x8d\x27\x10\xee\x80\xbf\x1d\x0d\xd0\xc7\xdc\x97\x99\xa0\xc8\xb6\xca\x80\xf7\x7c\x96\x01\x55\x53\x36\xbf\x4b\x74\x46\x02\x07\x83\x54\xa9\x33\xa4\xd0\x27\x35\x13\xfd\x40\x24\x9e\xf6\x3e\xc8\x4a\x53\xb6\x05\x64\x90\xf3\xf2\x9f\x1b\xf8\x0b\xa4\x35\xbc\x80\x7d\xe6\xbd\x09\xeb\x60\x8b\x04\x79\x50\x9f\x4d\xe2\x32\xb8\x11\xed\x1f\x69\x73\x26\x7a\xbe\x29\xda\x4d\x4d\x2a\x2d\x5e\xe2\x40\x61\x0c\xfa\xf8\x88\xb3\xd9\x03\x1f\xcb\xa2\x44\xfb\x3c\x83\x0a\xad\x1c\xec\xe4\x00\xa4\x68\x32\x88\xb1\x21\xcd\x15\x5a\x2e\x0a\x9c\x35\x34\x6c\x10\x27\xb7\xc9\x0b\xd4\xfe\xf2\xd9\x02\x49\x38\xeb\x28\x30\x49\xf4\xa8\x36\x28\x95\xba\x50\xb5\x91\xc9\x03\xe4\x1e\x86\xaa\x6c\xbd\xae\x1a\xb4\x21\xc8\xca\x03\xef\xcb\x63\x31\x98\x47\x13\xed\x2a\x92\xbc\x91\x54\xb1\x3d\xa2\x10\xc2\xe3\xe6\x6f\x30\xb0\x89\x26\xcc\x5e\xf4\x6e\xac\x0d\x9b\xcb\x7c\xe8\xa1\x93\x05\x11\x4f\x88\xc1\x2d\x8c\x75\x55\x97\x3a\x43\xca\x64\x1c\x7d\x5f\x3d\xc0\xf8\x4e\xaf\x43\xa1\x0e\x99\x2d\x1e\x24\xc4\x78\xdf\x66\x50\x3b\xc7\x15\x5b\xf6\xb7\xb7\x10\xb8\xae\x55\xa0\xac\x4c\x8b\x26\xaf\x9d\x15\x08\xa1\x29\x2e\x3d\xe5\x58\x08\xe1\xa4\x2b\xd2\x18\x86\x59\x69\x52\xa5\x28\x57\xdf\xb8\x0c\x0e\x11\x8c\xb0\x96\x10\xc0\x73\xaa\x16\x42\xe9\x00\xa6\x97\x6b\x04\x2b\xe7\xd6\x66\x4e\xfe\xac\x1d\x12\x0f\x57\x62\x5e\x1c\xd7\xff\x90\xce\xa6\xf5\x72\x26\x4c\xb4\x61\xa7\xcf\x5e\x2a\xe0\x83\xd2\xa6\xc0\xb4\xdf\x70\xb9\xcc\xeb\x95\xdd\xb1\x31\xbb\x1d\x82\xcf\x51\xdb\xe0\xce\x90\x48\x37\x66\x0c\xab\xa5\x37\x30\x55\xcf\x79\x92\x4b\xc5\x3a\x2e\x56\xcd\x8b\x2d\xe2\xe2\x71\x67\x42\x30\xc1\xf6\x49\xc0\x31\xa1\xad\x35\x83\xa7\x23\xcf\x4f\x80\xf8\x41\x16\xc5\xd4\xab\x06\x43\x4d\x40\x4f\x5b\x98\x05\xf2\xed\x20\x8f\x9c\xb2\x83\xbd\xf7\xd0\xcb\x23\x11\x3d\x40\x59\x9a\xac\x64\x6c\x2c\xe3\xb9\x14\x09\xc2\x20\x12\xcf\xbe\xfa\xd9\x0b\x44\x60\xfb\xb3\x26\x55\xea\x24\xdd\xfb\xb8\x54\x0f\x59\xaa\x2e\x84\x7c\xc0\x0b\xd9\x26\x19\x38\xe2\xb4\x1e\x66\x5b\x61\xe4\x62\x99\x21\xb6\x58\xd5\xba\x34\xf9\xed\xdd\xac\xaa\x85\x90\x82\x3d\x8c\x76\x3f\xdf\x1e\xa6\x8f\x0c\x07\x60\xdd\x90\x2e\x0b\x41\xb6\x92\xe0\x36\x09\x53\xc1\xc8\x4f\x10\x15\x5c\xb8\x52\x5a\xd0\xdb\x4b\xc4\x04\xfa\xd4\xa6\xfd\xe5\xba\xc8\xb6\x89\x94\x31\x20\x66\x6c\xe6\x6c\xa6\x63\xfb\x2d\x33\x25\xe4\x79\xaa\x57\x55\x9d\x09\x67\xc5\xde\x09\x3e\xa7\xe0\xb5\xb4\xe0\x76\xb1\x37\x13\x6d\x3a\xa7\x75\x71\xdc\x0c\xde\x52\xed\x37\x2e\xb0\x9c\x12\x1f\xc0\x0d\x35\x77\xb0\xbc\x35\xde\x37\xee\x56\xc0\x8d\xf4\xac\x41\x3e\x7d\x0c\xb1\xfd\x61\x4a\xd3\x34\x6a\x61\xd6\xe0\xfb\x61\x1c\x81\x7a\x9c\xdf\xa7\xae\x29\x02\xba\xda\xf5\x64\x0f\x9d\xa6\xd5\x9b\x72\x99\xe5\xb4\x5f\xdb\xdc\x17\xf2\xde\x66\xf5\x42\x5c\x58\x49\xcc\xc1\x29\x58\xe1\xe9\x20\x22\x11\x68\x64\x6d\x82\x6b\xfb\xad\x52\xbd\xcf\xa6\x2d\x5d\x67\x14\x3a\x5d\xe4\x4d\x63\xd8\xd1\x4e\xdc\x19\x86\x37\x08\xa9\x90\x28\xf9\x4a\xf7\x79\xea\xaf\x68\x5e\x6c\xac\xc1\x83\xbb\x80\xe3\xc7\xb8\x9a\xdf\x41\x50\xda\x1a\xb7\x6f\x5e\x7f\xf3\xe6\x9b\xd1\x19\xd3\xc8\x8d\x36\x75\xb5\x36\x19\xf0\x1f\x15\x79\x06\x37\x1d\x20\xdd\x96\x74\x2b\x6c\xca\x79\x0e\x17\xc0\xc9\x89\xfe\x90\xd5\xf3\x3b\x04\xdc\x92\x35\x82\x1b\x71\x1d\xe0\x87\xb9\x63\x74\x80\xfa\x68\x83\xc3\x9c\x46\xc0\x55\x97\x37\x0e\x38\xd0\x95\xc3\x19\x83\x7b\x3d\x37\x8d\xf5\xce\x05\x23\x26\xbc\xef\x82\x5f\x6c\x00\x64\x02\x76\x68\xf2\x94\x45\x9f\x40\xc7\xa6\x4e\xb4\xf9\xe7\x26\xbf\xcf\x0a\xca\xfe\x86\xb0\x5a\xb6\x4c\x7a\x0c\x38\x4f\xe8\x13\x85\x87\x21\x85\x6c\xb2\x76\x9b\x90\x88\xe1\xce\x77\x73\x49\x71\x54\x35\xf8\x08\x80\xfd\x54\x5f\xe3\x1a\xc2\x4b\xce\x55\x13\x6b\x59\x4d\x9c\x38\x4a\x6b\x04\x4c\xb6\x75\xe6\xc1\xd4\x89\x8a\x8b\xe7\xf9\xd2\xe0\xe0\x40\x75\x6f\xea\xb6\xd8\x26\x50\x3f\xb4\x4d\xa4\x75\x96\xe8\xbc\xae\xcd\x7d\x35\x67\x3b\x48\x6d\x4a\x17\x28\x01\x53\x15\x19\x1f\x12\x9d\xcd\xb2\x72\xe1\x6e\xc2\x06\x52\x7b\x0b\x6b\x42\x40\x80\x7f\xe9\x1e\xfa\xac\xd9\x7f\xf9\xc0\x20\x79\x82\x29\x0a\x0d\x41\x20\x32\xdb\x90\x8a\x1f\xef\x05\xc1\x71\xae\x80\xe3\x1c\xeb\x5a\xf0\x9f\x22\x91\xe3\x64\x55\x45\x3e\x7e\xb9\x01\xdb\xa4\xaf\x7d\x2a\x23\xf7\x4c\x52\x78\xe1\xa2\x0e\x18\x45\xf9\xea\xbc\xad\x6a\x28\x7f\xf0\x12\x08\x40\xcd\xc5\x90\x99\x55\xf6\x67\xbe\xda\xac\x94\xab\x9a\x73\xb9\xc6\x0e\x9d\x81\x5f\x23\xb2\xd3\xd4\x41\x80\x10\xc2\x9c\x43\x56\x7c\x90\x28\x27\x49\x06\xb1\x3e\xca\xa1\x56\x35\x7f\x81\x58\xdb\xa4\x39\x58\x6e\x00\x77\x8f\x6c\x76\x39\x6f\xb6\xe3\xfc\x7e\xa0\x22\x8b\x71\x3f\xb8\xb7\xdf\x76\xb4\x17\x86\x5d\x41\x08\xd9\x75\x59\x70\xaa\xaf\x60\x83\x09\xed\x15\x5c\xd4\x47\x83\xd4\x2f\x42\x04\x39\xc3\x30\x63\x89\x0a\x9b\xfb\x33\x53\x9a\x65\xde\x3a\x9a\x55\xa4\xd9\x88\xd4\x66\xb2\x56\x17\x59\x7d\x1b\xb2\x5e\x9b\xb6\xce\xd9\x2b\xf3\xeb\x4e\x59\x6b\x90\xb1\xfa\x74\x46\x34\xb4\xe8\xc9\x5c\x70\xe1\x52\x38\x2f\xa8\x3f\xbe\x02\x6a\x16\xb0\x2b\xe3\xbe\xc0\x95\x58\x9b\x66\x8e\x01\xae\xc4\xba\x0e\x50\x45\x47\xe6\x9c\x0f\x8b\xba\xbc\x17\x1e\x39\x78\x1e\x56\xb5\xb2\x47\x0e\x8a\x41\x65\x0e\xe8\xbc\xc8\x9b\x7a\xb3\xc6\x03\xe6\x9f\x9b\xdc\xb4\xda\x94\xbf\x57\xdb\x55\xcc\x6e\xcd\xb5\x3f\x30\x1a\x2a\x6b\x50\x62\x74\xb5\xc6\x3d\x35\xdb\xca\x7d\xc7\x51\xb9\x3e\xaf\x15\x05\x43\xb0\xf2\xcd\x85\x3d\xdf\x67\x45\x31\xcb\xe6\x7f\xa4\x7a\x7a\x07\x54\x0d\x0c\x14\x77\x5d\xf0\x33\xe6\x49\xc6\xf4\xcc\xa8\xdf\x37\x8b\x5b\xb3\xc0\x57\x84\xd1\x75\x65\x67\x79\xe9\x09\x4f\x63\x10\x3d\xb1\x1f\xdc\x51\x85\x11\xb6\xae\x5c\xf5\xd3\x9a\xa3\x9c\xae\xae\x0b\xf7\x58\xf7\x48\x6c\x31\xf7\x84\xba\xa3\xf3\x79\xb5\x29\x5b\xb9\x10\xf6\x0e\x84\x1e\x7b\xa9\xc5\xae\x51\xed\xde\x39\x6f\x74\x53\xf1\x7b\xc6\x27\xaa\xc7\xb1\xa1\x87\x0d\x6f\x8c\x92\x37\x60\xd7\x77\x71\x69\x8a\xb5\x3f\x91\x91\xaf\xac\x4a\x4f\x0c\xef\x7f\x25\xc0\x6b\xfe\x5c\x36\x74\x75\x8a\x73\x59\xf5\xe9\xa6\xf4\x9d\xc0\x8f\x59\xd6\x24\x35\xf9\xc4\x43\x4f\x3f\x72\xe8\xa9\x27\x1f\x7a\x7a\xc7\xa1\xa7\x3e\xe7\xd0\x8b\xdd\x64\x79\xe8\x1d\xea\x30\x07\x87\x9e\xde\x71\xe8\x29\x89\xcd\x34\xcc\xe4\xb7\xab\x4a\xd0\xef\x8b\xcc\x81\x04\x17\xd6\x9e\x3e\x3b\x7b\xa1\x1e\x90\x71\x04\x04\xf2\xc4\xae\x96\xee\xd7\xce\x5d\xca\x0f\xa4\xd7\x56\x6e\x9b\xea\x2f\xd9\xa6\xf6\x88\x84\x7a\x81\x1c\xb2\xe9\xb2\x24\x54\x7c\xb9\x84\xb2\x46\x77\x82\xd2\xe7\x58\x74\xa7\x53\x25\x1a\x94\xbf\xb0\xe4\x18\x30\x11\xc6\x5b\x2c\x83\xff\x6e\x62\x3f\xf7\x21\x27\x20\x80\xbd\xae\xe3\xfc\x1a\x71\x94\x23\xf7\xe6\x8a\xfc\x84\x7d\x7b\x41\xc9\xbd\x50\xd5\x44\xb8\x8e\x0c\x79\x00\x60\x38\xc8\x50\xd9\x59\x22\x09\x06\x06\xa1\x87\xe0\x25\xd1\x76\x43\xe9\x94\x7d\x07\xb7\x0a\x0e\x6e\xad\xf5\x2b\x49\x8a\x11\x73\xb3\x58\xff\x36\xc3\xd2\x55\x59\xa5\x41\xc9\x37\x32\x6a\xef\x4c\x11\xae\x2c\xeb\x44\x32\xcf\x19\x19\x77\xf6\x9f\xce\xb2\x33\x8b\xc4\x57\x9f\x04\x2c\xc0\xee\xb8\xe3\x34\x1a\x67\xf7\xb1\xf4\xda\x3d\x81\x0b\xc1\x3d\x35\xf7\xf3\xbc\x09\x0b\x9f\xe2\x4a\x50\x8f\x64\xcb\x3d\xc0\xef\x8f\x1c\xd3\xd4\x73\x53\x97\xb2\xe8\x3f\xe1\x81\x4b\x3c\x20\x2b\xa0\x1b\xf3\x30\x9e\xfd\xdb\x5e\x50\x8b\xdb\x2d\x95\xb7\xf6\x3c\xb6\x07\xc1\x5d\x56\xb6\x04\x33\x49\xf4\x32\x6f\xc1\xb1\x24\x96\x2d\xbb\x33\xe6\x9b\x22\x73\x41\x23\x3c\xc2\x65\x9c\x30\xf1\x0c\xed\x8d\xa1\x7a\x90\xc2\x21\x4f\x91\x4c\x60\x61\xec\x60\xda\xd3\x6b\x3e\xdf\xd4\xd9\x7c\xeb\xbe\x44\x23\x03\x46\x85\xff\xbe\xa9\x6b\x30\x6b\xd8\x36\x26\xe2\xa2\x45\xde\xcc\xad\x9d\x0f\x77\x09\x80\x6e\xda\x3d\x7e\x05\x45\x1a\xfb\x36\x3e\xd6\x9a\xbb\x39\x64\x58\x56\xe3\xd3\x9c\x1e\x75\x03\x22\x53\xc2\x71\xe2\x00\x1b\xab\x0d\x2b\x59\x72\x5b\x6c\xc3\xba\xff\x9a\x05\xd8\xfa\x7c\xbe\xee\x24\x29\x0f\xb4\x7a\xc2\x05\x97\xea\xf7\x18\x94\x4c\x7a\x5e\x49\xf5\xbc\x92\x00\xa3\x97\x52\xeb\x88\xea\x97\x9a\x44\xe4\x3a\x1b\x3f\x8b\x2e\xf2\x41\xe4\x0f\x4b\xf1\x7a\xc2\x9c\xc3\x1a\x73\xd7\x13\x5f\x25\x4d\x7e\xd1\xdc\x85\xca\xe8\xe0\x7b\xa4\xac\x50\x71\xc9\x1c\xef\x40\x68\x06\xc5\x39\xf5\x62\x83\xa7\xb5\x80\x9b\x74\x0b\xad\xf3\x06\x03\x66\xb5\xea\x74\xf5\x3f\x9d\x83\xfb\x4f\xfe\xa4\xdf\x5c\x5c\x9e\xff\x47\xf3\xbf\xdf\xbe\x78\xfd\xf2\x65\xa7\xfe\xe7\xf5\xc9\xd7\xfc\xef\xdf\xf1\x73\x31\xba\x9e\x9e\x0d\x2f\x47\xfa\xf2\xe6\xc7\xf3\xf1\x19\x51\x30\x8d\x64\x05\xd0\x0b\xb8\x98\x4f\x52\xfd\xce\x2c\xf3\xd2\x55\x32\x9c\xa4\x27\xa9\xfe\xed\xb7\x33\x0f\x4a\x7f\xf6\x8c\xd0\x75\xe0\x2b\x90\xd2\x2e\xca\xa5\xe0\xd9\xec\x8a\x3b\x48\xc6\x1f\x8f\x49\x85\x89\x13\x8c\x6f\x7d\x90\x28\x3b\x78\xca\x69\xf4\x14\x4d\x3d\x73\x4f\x43\x70\xd4\x6a\x16\xb0\x09\x09\xf0\xcc\x59\x65\xcd\x7b\x00\xa4\xab\xa0\x79\x04\xbe\x83\x3a\xb1\x68\xdf\x73\x12\x84\x1f\x86\x80\xf9\x8c\x5e\xc8\x5f\x8a\x4a\x7c\x15\xfa\xfb\x12\xfb\x7b\x0f\x7a\x01\xf6\xd9\x41\x47\x83\x5e\xd9\xf1\x08\x1f\x42\x37\xa2\x78\x1d\xd5\xf7\x3a\xd0\xc5\xe0\x9b\x68\x81\x65\x6c\x64\xfa\x0b\x66\x8d\xfc\x83\x32\x26\x77\x92\xbe\xb2\x7d\x1c\x79\x11\xd2\x77\x32\xe1\xf4\xc1\x58\x73\x20\x6f\x56\xae\xe3\x99\x5e\xf1\xef\xb8\x0e\xba\xd8\x02\x88\x6e\xdd\xfa\x12\x1c\x87\xbd\x5a\x98\x7b\x53\x54\x6b\x38\xa6\x29\xba\x4e\x97\x0e\x78\xa0\xfe\xb1\xec\x2a\x72\xb8\x17\xfa\xf6\x2d\xf4\xed\x4f\x33\xdf\x40\x28\xc1\x75\x42\x0e\x69\x90\x3a\xac\xa8\x90\x22\x2b\x03\x00\xa8\x6d\xeb\xb5\x6d\x6b\x6c\xd7\x6c\x56\xe8\x77\xd8\x2d\x53\x07\x13\xd2\x2b\x0f\x2d\x2a\x56\x88\x5d\xbb\xd3\x48\x5f\x91\x4e\xc9\x05\x25\x8e\x25\x7b\xf4\x27\x40\x6a\xf5\x10\xba\xf3\x9d\xed\xce\x79\x56\xdf\x1a\x4c\xe6\x89\x01\x7e\xf0\xa4\x99\x38\xf9\x26\x7a\x63\x6b\xe7\xd2\x54\x2a\x9a\x4a\xbc\xe5\xe6\xf4\x64\x7d\x6b\x3f\x2e\xb2\x11\xfd\x7c\x64\x9c\xcc\x38\x49\xbf\x87\xde\xe0\xaf\xc5\x90\x84\x66\xee\x49\xfa\xc6\x7e\x2c\x58\x6b\xbe\xdb\x82\x82\xc4\x6e\x66\xc0\x27\x17\xa6\x0d\x14\xac\x9b\xcd\x0c\xd1\xeb\xca\x7a\x36\x6d\xbd\x21\xa9\xf2\xa5\x16\x25\x30\x9d\x6d\x81\x04\x40\x24\x61\x1d\x1e\x0a\xa0\x5b\xa3\xc2\xe5\xd0\x30\xcf\xd6\x02\xb1\xe3\x8d\xa9\xc9\xc8\x5d\xe6\x05\xb8\xcc\x41\x23\x3a\x6f\x7e\x50\x6a\x98\xea\xe1\x21\x6f\x00\x91\xa8\x12\xcd\xbe\x0c\xa1\x8a\x02\x3b\xe8\x8a\x00\xdc\x34\xf5\x77\x5b\xa9\x1f\xf1\x79\xa5\x79\xc0\x46\x42\x25\xa9\xd8\xd9\xed\x0c\xc9\xce\x76\x4f\xd2\x93\x17\x76\x92\x82\x6f\xb8\x49\x8a\x60\xc1\x0e\xd2\xee\xb6\x2b\x2c\x20\xe4\xe7\xce\x23\xd5\xc8\x27\x2c\x70\x3b\xee\xe1\x91\x0b\x41\x71\x68\x17\xf8\xf5\x61\x49\xe6\x28\x09\x91\xb7\x6e\xc2\x7a\x89\xa0\xc9\xf6\x2b\x6a\x93\x2d\xb6\xbc\x0f\x70\x80\xc3\x55\x1e\x2c\xec\x93\xf4\x04\xae\x24\xd1\xe3\x60\xab\x77\x00\xdf\x94\xed\x11\x0b\xc9\xe3\xbd\x55\x0f\xde\x3b\x48\xd6\x14\x85\x5e\x55\x8b\x4d\x61\x1a\x9d\xfb\x69\x4c\xf4\xba\xd8\x34\x91\x4f\xad\x10\x4e\x99\xcd\xed\xd9\xc8\x77\x28\xaf\x4c\x2c\x96\x6b\x5c\x15\x16\x55\x3f\x06\xa2\xfc\x18\x44\x68\xda\x8c\xa2\xb1\xa4\x06\xe1\x4f\xc9\x84\x24\xcb\xf2\x06\xd6\x0f\xe9\x5a\xc2\xcc\x3a\xa6\xb9\x3c\xc3\x46\xb3\x3a\x6f\xc0\xb7\xc6\x64\xa0\xda\xbf\x0d\x09\xde\x61\x8a\x02\xd5\x57\x13\x91\x34\x0e\x0f\x28\x0c\x7c\x48\x7b\xa0\xd1\xf3\xbb\x2a\x9f\x13\x18\x5f\x2e\x24\xa2\x1f\x87\xf4\x9e\xed\x93\x75\x6e\xd1\xfb\xce\xea\xf9\x5d\x7e\x9f\x15\x0a\xd3\xb4\x52\x13\x47\x32\xd5\xea\x85\xe1\xef\x11\xf8\x60\x61\x9e\xe3\x77\x91\xb2\x9a\x16\x77\xde\xe8\x87\x7c\x61\x8a\xad\x50\x85\x5f\x56\x58\x59\x03\xd4\x52\xb8\x6e\xc0\xc8\xf8\x54\x6d\xc4\xd1\x16\xdd\x0c\x19\x85\xb9\xe9\x86\x10\x6a\x05\x92\x48\x25\x21\x52\xb7\xd5\xba\xd8\xb2\x7b\xc7\x89\x23\x79\x26\x27\x1d\x58\x6e\xc6\x21\x43\x9f\xec\x8b\xe9\x5d\x9a\x4d\x87\xb9\xfc\xb5\x35\xc2\xde\x57\xb5\xec\x1c\x84\x08\xf9\x6d\x98\x9d\x06\xbc\x4a\xea\x3b\x5f\x33\xb0\xce\xac\xe5\xd0\x84\x25\xb7\xcc\xf0\xc7\x3a\xdd\xd6\x21\x73\xcb\x12\x42\x40\xc0\x1b\xf5\xbe\x12\x30\x12\xbe\x66\xfc\xfa\xb6\x7d\xa0\x2f\xb9\x51\x3d\xce\x50\xf2\x65\x5d\x3d\x58\x4f\x15\xf3\x98\xaa\xaa\x45\x05\x11\x54\x6d\x32\x00\x9a\x12\x9d\x38\xc1\xab\xac\xcc\x6e\x5d\x94\x1b\xf9\x0d\x49\xee\x86\x62\x04\x08\x55\xc0\xf2\xa6\xa8\xba\xa9\xaa\x35\xb0\x09\x03\x1a\x08\xd4\x1e\xec\xd5\xb0\x6c\xc1\xd5\x9e\xdb\x36\x8f\xbf\x7d\xf1\x7f\x0c\x34\xe9\x65\xb3\xd5\x55\x6d\x5a\x47\xca\xd2\xdc\x65\x35\xda\xb0\x98\xd0\x01\xb8\x51\xd0\xa0\xe8\x13\xde\xb3\xa7\x69\xb0\xea\xfd\x51\x75\x6a\xe7\xcd\x6e\x8a\xae\x5d\x41\x05\xa2\xfd\x7f\xec\x68\x97\xab\x83\xcb\xc4\x19\xf3\x9c\x84\x9a\x61\x79\xbd\x20\x17\xdb\x1e\x52\xc0\x74\xb8\xc1\xec\xf6\xda\xd4\xed\x96\xc2\x81\x3f\x28\x95\xf9\xea\x71\x01\xb1\x60\x50\x98\x83\x53\x38\x80\x85\x90\x83\x0d\x41\xda\xaa\x7b\xd2\x1c\x0b\xeb\x86\x0d\xd5\x81\x66\xe8\x39\xc7\x48\x22\x83\xb7\xaa\x95\xe4\x3b\xd7\xc2\xb0\xa2\xb4\xb8\x9d\x71\x59\x69\xde\x80\x88\x74\x20\x1f\xbd\xa3\xe8\xbc\x33\xf2\x89\x72\x55\xe3\x58\xfb\x9b\x2d\x8c\x07\x2d\x40\x0d\xf9\xf1\x6f\xbf\xdd\x00\x1b\x99\x79\xf6\x6c\xd0\x73\x9c\x1e\xf7\x98\x70\x03\xcc\x78\x37\x55\x61\x7c\xd8\x48\x02\x9f\x1c\x95\x27\x05\x39\xf3\x46\xd6\xbd\x04\x04\x80\x21\xd3\x36\x75\xe5\x91\x7e\xf8\xc1\x46\x4e\x3f\x28\x5f\x07\xba\x23\x84\xa2\x05\x7d\x21\x64\x50\xa0\x8b\xcd\x8f\x61\x48\x5c\x30\x47\x58\x8d\xe0\x5c\x19\xaf\x39\xc2\xff\x7f\x6a\xbd\x3b\xe9\xdb\xe1\xe2\x57\x0a\x58\x2d\xe5\x1f\x76\x8a\xf6\x3f\xbe\xf0\xd5\x23\x0b\x5f\x3f\xb2\xf0\x8f\xff\xda\x95\x1f\x3a\x7c\xe8\x19\xc3\x9a\x83\x69\x96\xef\xdc\x3f\x51\x44\x70\x84\x55\xbd\x9b\xd2\x95\x2d\xcc\xb2\x26\x67\x20\x5a\xd5\x9d\x0b\xa8\xe1\x8f\x3d\x0a\xda\x3f\xea\x2f\xdf\x3f\x81\x3f\xdd\x56\x4a\xae\xc6\x1e\x5f\xbe\xff\x55\x77\xef\x0d\xf5\x94\xbd\xd1\x65\xa1\x17\xbd\x51\x4f\xe8\x8d\xdf\x22\x7a\xc7\x16\x51\x4f\xde\x22\xba\x77\x8b\xbc\x4c\x43\x97\x7c\xe2\x29\xb8\x20\xbf\x7d\x92\xb2\xb8\xa3\x2f\x1d\x76\x92\x95\xf1\x12\xc3\xeb\x5e\x10\x23\x20\xfe\x14\x2d\x7e\xf8\xb5\x0b\xc9\x40\xae\xe4\x20\x3f\xf2\x11\xc6\x34\xb6\x4f\x60\x83\xc7\xc6\x9f\x80\x33\x05\x0b\x92\x06\x4f\xd4\xdc\xab\x1d\x9a\xef\x87\x58\x4f\xe1\x67\xd8\x3d\x54\x1d\xfb\x29\xd1\xae\xa6\xad\x57\x51\x77\x97\x0e\xbc\xda\x55\x7b\x69\x9b\xf2\xef\x70\xa0\xf4\xbb\x22\x9a\xb9\xbe\x71\xc2\xc5\x5e\x80\xe4\x0a\x16\x5e\x42\xb5\x57\xc3\x36\x31\x27\x35\xe8\xf3\x6a\x87\x42\xbc\xe7\xb1\x78\xe6\x73\x65\x54\xa7\x9e\xea\x9f\x99\x44\x9c\xbb\x4b\x03\xa1\xb2\x52\x62\x7e\x5d\xfc\x1d\xde\x44\x14\x3a\x46\x1c\x86\x81\x1b\xc9\xd2\x6e\x2f\xd3\x6f\x61\xf9\x9e\xa6\x7a\x88\xd6\xb8\xa3\xda\x0d\x4a\x77\xad\x97\x1c\xb8\xeb\xfd\x4b\x58\x89\x5f\xfb\x25\x0c\xb3\xc8\xf2\xa8\xde\xe8\xcf\xcb\x98\x45\x64\xe5\x17\xd6\x0e\x69\x7d\xf2\x8c\x24\xcd\x31\x54\x67\x12\x7d\x89\x77\xbf\xfc\xb2\xab\xd5\xbd\xfd\x7b\xe9\xa2\x63\xfa\xd1\x30\x1b\x9d\x27\x55\x89\xbc\xdc\x77\xd5\x4a\x6f\x61\x0e\x70\xf0\x7b\x9e\xe2\xde\xea\x2d\x7a\x86\xcb\xf8\x65\x6d\x1f\x76\x3c\x57\xb9\xe7\x26\x4c\x3a\x03\x34\xef\xa1\x7b\xe4\x94\xe6\xda\x07\x53\xdc\x1b\x7d\x7c\x72\x3a\xd0\xab\xaa\x6c\xef\x1a\x8d\x07\xbf\x1d\x35\x48\x7f\x43\xb9\x26\x58\x4b\x85\xdd\xbe\x73\x3b\x4a\xae\x31\xf4\x4b\xb9\xb1\x26\xff\x53\x1f\xbf\x8e\x1a\xca\x64\x45\x47\xb0\x7d\x83\x38\x6b\xb8\x20\x42\x1d\x51\xdf\xf7\xb6\x22\xc5\x28\xb7\xd6\x53\xc5\x6a\x9f\x71\xf9\xa2\x29\x9b\x4d\xed\x80\x52\xf1\x2e\xe6\x9e\xe0\xf0\x34\xfe\x19\xca\xdc\x9b\x92\x95\x3d\x1f\x9f\xdc\xbc\xd1\xb6\x01\x0f\x14\xce\xa4\xed\x01\xdb\xc1\x9e\xf6\xcc\x99\xd3\x17\x05\xf7\x87\x13\x7a\x46\xd6\x9f\x0c\x0e\x4e\x77\x9a\x6f\xc3\xad\x40\xd1\x04\x98\x5e\x0c\x39\xf1\xf6\x75\x45\xc5\x20\x0f\xdb\xd0\xa6\xc7\xa6\x70\x8b\xe1\x15\x1b\x3c\x86\xe3\xe2\x30\xed\x9e\xbb\xa1\xbc\x35\xbd\x8a\xe4\x8e\x74\x47\x35\x0e\x9e\xe4\x86\x3a\x8a\xc6\x31\xbf\x0c\xfb\x84\x05\xc1\x2f\xf8\xbf\x48\x3c\x2a\x8c\xb5\x49\x4c\x4e\xdb\xeb\x2e\x61\xdc\x84\xef\xa9\x36\xd2\x77\xa5\xcf\xab\x20\xa6\xcb\x2e\xaa\x58\x0b\x04\xb8\x99\x39\xd8\x0e\xd7\x6a\x97\xfd\xa7\x00\x32\x3f\x63\xa6\x36\xe0\x03\xf0\x14\xb9\x70\x47\xd0\x11\x29\xa0\xe3\xe0\xb4\x0a\x8f\x52\xc5\x01\x2a\x67\x41\xbf\x4c\x5f\xa5\x7a\x2c\x0d\xd7\x4b\x36\x5c\x3f\x00\x6f\x6f\x83\x86\xeb\x35\xac\xb5\x4b\xb0\x73\xcf\xc0\xa2\x75\x92\xbf\xe0\xc7\xf8\x92\x05\xbc\x65\xc8\x24\x76\x20\x90\xc0\x38\x56\xce\x38\x76\x1a\x09\x62\x83\x32\x2b\x46\x56\x10\x7a\x66\xce\xde\x46\xde\x36\x44\xd4\x8c\xc3\xc0\x0a\xdc\xfe\xa8\x1d\x24\x78\xe6\x85\x2b\x08\xd8\xa3\x60\xdd\x7a\xed\xff\x20\xb2\x25\x8e\x35\x00\x33\x2c\xf4\x6f\xbf\x41\x79\xe1\xb3\x67\x34\xd0\x3c\xc8\x94\x26\xb2\xaf\xe5\xd6\x31\xbe\x2a\xd1\x3b\xb8\x3f\x2b\x40\xeb\x2c\xad\x7f\x6f\x57\xec\xc2\xb4\x59\x5e\xf0\xe8\x78\x6a\x7c\x20\xee\xb4\xa3\x87\x27\x36\x6f\xb5\x79\x0b\xe3\x6b\x5f\x06\x33\xec\x28\x2c\xe8\x87\x19\x0f\x3d\xdc\x6f\x7f\x18\x14\xbc\x0b\x36\x83\x3f\xcc\xb2\xf0\x1a\x55\x4e\x17\x29\x3d\xc5\x6b\x1a\xe1\x48\x76\x9f\xad\xed\x8e\x11\xdc\x12\x58\x63\x09\x43\x47\xa8\x37\xe2\x6c\xe3\x07\x8b\x70\x58\xeb\xad\x79\xf0\x65\xb1\xfe\xdf\x8b\x7e\x35\xad\x59\x0b\xa4\xbd\x5d\xfc\xa8\x35\x2b\xc2\x71\x6a\x95\xe5\x85\xfd\x5d\x91\x37\x6d\x83\x95\x21\x0f\xcd\x6d\x5d\x6d\xd6\xcd\xe0\x51\x86\x2d\x04\xef\x3f\xdc\x55\x4e\x0b\xa5\xb3\xf0\x71\x02\x4a\xf3\x20\x86\xd2\x5d\x02\x38\xd2\x50\x34\x6e\x77\xa9\x34\xe9\x87\x97\x63\xb7\xe2\xeb\xce\xa9\x93\x39\x94\x3b\x83\xfc\x6e\xeb\x6c\xb5\x22\xc8\x25\x86\x6c\x1d\xe5\x01\xc1\xb2\x39\x10\xc6\x2e\x11\x69\x8c\xd5\x66\xa7\xf3\xe1\xd0\xf1\x78\xa6\x0e\x2f\xc7\x62\xb5\x67\x45\x53\xb9\x25\x0f\x5b\x42\xd2\x5d\x30\xe1\xb3\x9b\x4e\xb8\x30\x40\xd0\x8a\x42\xf0\x48\x62\x26\x2f\x89\xc5\x06\xdf\x08\x0f\x16\x7f\x56\xf9\x50\x3d\xa5\x0a\x15\xac\x8f\xae\x05\xdb\xa3\xd0\x41\x07\x5f\x78\x9a\x71\x46\x0f\xbf\xaa\xf0\xab\x0f\xc0\x8e\x1f\x9c\x6f\x3d\x86\x27\x6a\xc6\x61\x71\x4b\x70\xbe\xd1\x54\x29\xf6\x8b\xad\x55\x44\x31\xb9\x60\xf6\x8e\x9b\x81\x37\x55\xb3\xc5\xc2\x0e\x68\x8d\xa7\x3b\x24\x80\xc4\x1a\xe0\xe2\x15\x1a\x89\xc0\x32\xf5\xf9\x39\xfb\xe0\xbc\xe5\xd4\x83\xab\x51\x6c\x2b\xbd\xde\x10\x8c\x1a\x1b\xc0\x9a\x14\x71\xee\x05\x66\x25\x5c\xb2\x1b\x83\xf9\x82\xc6\xe7\xbb\x08\x0d\x1c\x1f\x72\x4a\x34\x8c\xd1\xf0\x82\xa0\xd8\x7e\xc3\x65\x8e\x6f\x9d\x2e\x47\xe0\xb2\xce\x0b\x33\xa0\xc1\xce\xf4\xa6\x31\xb5\x17\xa1\x2b\xf2\x3f\xc8\x63\x2e\xaa\xea\x0f\x4f\xd5\xc0\x24\x23\xde\x25\x99\xdf\x55\x15\x82\x6b\xc1\x9c\xa7\x89\xaf\x14\x86\xc6\xad\xd1\x60\xc0\x56\x4a\x1c\x71\x77\x02\xca\xdc\xa0\x15\x98\x97\x0b\xb3\x2a\xe9\xac\xf7\x2c\x45\x92\x2e\xba\xad\x94\x9c\x40\xc1\xa4\x17\xf9\x7e\x3d\xfe\xc7\xa2\xd2\x4d\x85\x2a\xc4\x55\x09\xdb\x57\xd9\x1d\x38\x33\x77\x59\xb1\xf4\xce\x78\xc5\xbf\x8a\x6e\x75\x61\x05\x50\x3a\x31\x48\xd4\xbb\xdd\x02\xa7\x70\xde\xea\x6c\xd6\x54\xc5\x06\x78\x57\x00\xed\x85\x09\x65\x17\x62\xd8\xf7\xfe\x6a\xc7\xfb\x03\xe7\x1c\x24\x5f\x16\x4c\x35\x93\x15\x55\x69\xbc\xc7\x29\xa9\x7e\xf0\x3c\x84\x26\x97\x5b\xb5\xdb\x9e\x01\xe7\x33\x38\xe3\x18\x83\xe5\xfb\x90\x97\x80\x2c\xb6\x8f\xdd\xd1\x12\xaf\x09\xd9\x4e\xc4\xba\xd5\x7d\x65\xb5\x63\xca\xd1\x7b\x42\x29\xac\x25\xf0\x9a\xbd\x4c\x5f\x47\x21\x8c\x6a\x29\x2d\x25\x8a\xb4\x34\x7e\x29\x8a\x2a\x4b\xb9\x30\x54\x1e\x58\x58\x98\xb8\xb3\x6b\x22\x67\x79\x16\x38\x07\x57\xbc\xa8\xfc\x1d\x79\xf2\xfc\x65\xfa\x2d\x1a\x39\xe8\x29\x98\x56\x2d\x99\xec\x4f\x3e\x22\x61\x27\xca\x76\xc5\x1b\x1f\xb4\x29\xad\xed\xda\xe3\x24\xa8\x38\x92\xd1\xb9\xb0\xf2\xa6\x53\x5e\xb9\x3b\x9a\x22\x60\x9b\x99\x27\xd0\xc4\x96\xef\xaa\x07\x2c\xca\x75\x27\x2b\xbc\xd4\x72\x53\x2c\x73\x88\xb7\x81\xfd\xe8\x77\x9d\x0a\x86\x81\xe2\x2f\xf4\x36\xec\x1c\xcf\xab\xb2\x59\xe7\xf3\x4d\xb5\x01\xae\x78\xa1\x2f\x10\xd8\xb7\xfd\xfe\x67\xb2\xc3\xba\x85\xcb\xb1\x80\x7a\x72\x40\x52\xf7\xd8\xba\xea\x91\xbb\xa0\x63\xef\xf6\xad\x0f\x70\xbc\x5c\xaf\xd4\xae\x70\x12\x73\x34\x0a\xdd\x03\x30\x02\x30\x27\x99\x50\xef\xb8\x30\xdc\x9a\x6a\x38\x37\x2e\x61\x2a\xc8\x2e\x5d\xd4\x4b\xe4\x23\x89\x6d\x14\xb2\x8c\x1d\xf6\xf6\xdd\x52\x41\x74\xb9\x66\xa1\x28\x03\xdf\xa5\x3d\xde\x84\xe7\xbb\x6f\x5b\xb3\x5a\xb7\x48\x0a\xb7\xca\x11\x30\x5b\x90\x33\xee\x0f\xd7\x67\x8d\x13\x4c\xee\x64\xf0\xdd\x60\x39\x70\x03\x7d\xb4\x31\x40\xcb\xde\xde\xc5\x72\x2b\xce\x5d\x78\x7c\x02\x78\xc0\xfd\x00\xf2\xdb\x1d\x74\xda\x42\x40\x97\xe6\x80\x8c\xf7\x1c\x29\x79\xe3\x69\x80\x31\xef\x3f\x59\xa1\xba\x69\xbb\x03\xb2\xd3\x73\x11\xec\x3f\x86\x77\xb8\x89\x9f\x71\x0c\xef\x68\xe9\x80\x63\xd8\x5d\x41\x7d\xa7\xec\x77\xa9\x0c\xdb\x8b\xe3\x94\xe2\x64\x41\x54\x5f\x43\x7a\x74\x35\xe3\x72\x01\x71\xca\x8a\xac\xc1\xd3\xf0\x44\x5d\x02\x26\xa3\xe4\x23\x11\x8d\x93\x97\xb7\x85\x23\x93\x85\xc2\x24\x32\x48\xe6\x99\xdd\x54\xe1\xf2\x68\xa0\x70\x26\x3a\xdb\x3b\x41\x4d\xbb\x04\xfc\x11\xc8\xdb\xa7\xeb\x2b\x83\x9b\xec\x2e\xaa\x0a\x84\xd8\x8b\xad\x7e\x87\x36\xda\x14\x50\xf4\x60\xa1\x5c\x99\xdb\x4d\x41\x1c\x51\xca\x19\x83\x10\xa7\xf5\x31\x23\x4a\x20\x60\x82\x9f\xb2\xfb\x9e\xf2\xac\x77\x84\x54\x8c\x45\x6e\xaa\x15\xc6\xac\x3d\x2c\x20\x38\xb7\xc8\x7c\x6c\x7c\xd7\x6a\xd7\x35\x05\x56\x24\x8f\xd7\x0f\x10\xad\x90\x9d\xd9\x3d\x4f\xbd\x95\x66\x8a\x5f\xee\xad\x0b\x71\x04\x51\x89\x22\x2a\xc5\x40\x34\x14\x38\x2a\x66\x4b\xe5\x11\xa9\x9e\x6e\xe6\x77\x4a\x5e\x5a\x7c\xcb\x74\x74\x6b\xbc\x57\xda\x17\x1f\xd6\x2f\xd3\x57\x90\x78\xea\x7c\xdf\xc1\x28\xa4\xcb\xdf\xf4\xb8\x2e\x8e\x61\x97\xa0\xa5\x5c\x0b\x40\xd4\x96\x94\x68\xeb\x1b\x59\x52\xe3\xe9\x7b\x0d\x1f\x0d\x28\xb6\x0a\xe3\x01\x8c\x7c\x17\x01\x81\x6a\xa9\x41\xc9\xc8\x3a\x7d\xcd\x1f\x39\x16\x26\xcc\x8c\xe6\xb8\xa4\xc7\xc0\xeb\xbc\x75\xc2\xc4\x51\x1a\x27\x42\x34\x85\xda\xa5\x9e\x6c\x7f\x2e\xa3\x7e\x3b\xac\x5e\xeb\x1d\x67\x6d\x9b\xcd\xef\xd0\x44\x50\x3d\x9e\x20\x1b\xfc\xee\x42\xef\xee\x9f\xd7\xa9\x33\xd6\xa2\x32\x2c\x90\xb0\x3d\x49\xf5\x85\x79\x10\xf6\xdc\x85\x69\x9b\x79\xb6\x46\x20\xbf\x93\x1b\x6b\xf4\x19\x71\xc6\x80\x6b\xf3\xdb\x6f\xfc\xb1\x67\xcf\x06\xf6\xbc\x52\xc4\x9c\xc8\x42\x55\xcc\x9b\x60\x1d\xfe\xfb\xfe\xc7\xf7\x09\x93\x8c\xac\x57\xcb\xd7\x11\x4b\xab\xdc\xe6\xf7\xa6\x24\x31\xee\xbc\xbc\xdd\x10\x41\x23\x7f\x0c\xcb\xeb\xe0\x65\x4e\x53\x3d\x72\xf4\x1a\xe1\x6b\x4d\xca\x79\xb4\x4d\x5d\xf4\xc1\x4b\xac\xd0\x05\xa8\x84\x73\x18\x59\x88\xce\x8e\x70\xae\x6b\x01\x7c\x7e\x4e\xfc\x12\x13\xcd\xf6\xf0\xe1\x20\x59\xb0\xa1\xb3\x96\x5b\x4c\x45\x13\x4d\x25\x3c\x39\xfb\x75\xba\x53\x62\x63\x28\x6c\x0d\x2f\x16\x0e\xbd\xef\xe8\xa9\x78\xbb\xd9\xd6\x4d\x6e\xaa\x2e\x2a\x74\xcd\x3d\xf6\xd6\x4d\xfc\x5d\x16\x49\xa0\x8a\xb8\x14\xc9\x81\xf9\x9c\x55\x5b\x85\x48\x4e\xf6\xfb\x7b\xb5\x21\x5f\x63\xa8\x3c\xe4\x7d\x77\xf1\x36\x9f\x1a\x82\x20\xb9\x27\xf4\xdb\x91\x13\x54\xc7\xb8\x7d\xb6\x34\x8e\xe0\x56\x2c\x2a\xe0\x34\xaa\x17\x58\x92\x88\xe5\x3c\x79\xeb\x36\x1d\x7e\xe5\x73\x00\x8a\x32\xc4\x69\x8f\xed\xda\x40\xb4\x02\x4c\x52\xb6\x93\x80\x03\x17\x2d\x43\xb5\xbe\xab\xb3\xc6\x34\x00\xbe\xfd\x57\x5e\x14\xd9\xb3\x67\x89\xfd\x8f\xc9\xff\x1c\x9f\x9f\x0f\x2f\xcf\xdd\x7f\xf2\x3f\xfd\x96\x82\xff\xb2\xbf\x26\x8b\x47\xcd\xab\x72\xb9\x81\x5b\x78\xcb\x04\x11\x1a\xdb\xd7\xcc\xe3\x8b\x52\x81\x59\xb9\x45\x37\x23\x2f\x31\xa2\x22\x81\x0c\xc7\xb3\x81\xf2\xc5\x71\x6c\xca\x09\xfb\x0d\xbe\x11\xad\xa3\x88\x6d\x93\x08\x73\x28\x5f\x11\x1a\x78\x46\xd3\x9b\xc6\xe5\xdb\xf6\xe1\x6e\x79\x85\x7f\x4b\xf5\xf1\xfb\xbc\x28\x48\x63\x6b\x47\x84\x5f\xc0\x78\xba\x10\x47\x69\x7a\x61\x13\x6a\x6f\xa4\x48\x14\x81\xe2\x53\x56\x8d\x29\xee\x4d\xd3\x91\xff\x5f\x85\x50\x98\xe8\x70\x1f\xb0\x5e\xb5\x27\x26\xd7\x82\x98\x3c\x55\x0a\x84\xc9\x47\xef\xf4\xd9\xe4\xdd\x48\x8f\x05\x71\x1b\x90\xb6\x21\xe3\x9b\x53\xd6\x06\x26\xbb\xdf\x7e\x03\x92\xf7\x67\xcf\x90\xcb\x2e\xe9\x50\xbc\x4b\x71\xf8\x44\x8f\xc6\x20\x85\x4e\x7a\xf0\xa3\x77\x7a\x72\xa5\x9d\x26\xfc\x7e\xed\x77\x25\xb8\xf0\xae\x7f\x1e\x5e\x03\xdd\x5c\xdc\xe1\xf7\x57\x23\xe0\xa6\x73\x62\xed\x9e\x01\xfe\x7c\x04\xc2\xf0\xfa\xfd\xe4\x4a\xf5\x11\xbf\xa3\x3e\xbb\x63\x90\x1f\x5f\xfc\x94\xea\x47\xa9\xe0\xd5\xf0\xe2\x9d\xbe\x1c\x5d\x01\xe9\x1d\x49\xc0\xf7\xf5\xcb\x33\xc3\x4f\x7f\x9e\xdc\x9c\xbf\x83\x21\x09\x3e\x64\x87\x7a\xa4\xb0\xdf\xe3\x5f\x47\x7a\x8c\x92\xe9\x57\xa3\xe9\xe5\xe8\xec\x3a\x01\x19\xf5\xe3\x8b\xc9\x35\xb1\xec\x8d\xaf\xc7\xc3\x73\xfd\x6e\xf4\xeb\xe8\x7c\x72\x89\xe2\xf2\xf6\xe3\x28\x55\x7f\x36\xb9\x40\x7a\xc3\xc9\xd5\x40\x0d\xa7\xd3\x9b\x0f\x23\xea\xd5\xf4\x9a\xe7\xe3\x62\x74\x36\x9a\x4e\x87\x57\x9f\x88\x16\x11\x86\xfd\x6a\x74\x39\x1c\x43\x63\x67\x93\xab\xab\x11\x08\xd2\xa7\x44\xf4\xd7\x4f\x66\x7f\x36\xb9\x98\x5e\x8f\xaf\x6f\xae\x47\x53\xbb\x1c\xec\xa4\x82\x66\x3b\x0c\xb0\x63\x09\xa4\x35\x93\xea\x8b\x09\xb3\x07\x8a\x01\x50\x3c\x4a\xc3\x9b\xeb\x9f\x27\x57\xe3\xff\x29\x99\x02\x59\x97\x5e\xac\x40\xdf\x15\xa7\xbe\x7c\x3d\xba\xfa\x30\xbe\x80\x85\xd2\xb1\x61\xbe\x48\x7f\x9d\xc9\x82\x21\x21\x13\x5a\xe1\x78\xaa\xb0\xba\x48\xb9\xf0\x1f\xb2\xde\x04\xdc\x87\x24\xda\x6e\x3f\x9e\x97\xea\xe5\x0b\xbd\xb0\x37\x6f\xb5\xd4\x33\x33\xaf\x20\xe6\x9f\x3d\xa0\x63\x09\x5d\xc4\x8f\x23\x39\xad\x47\x74\x35\x7d\x51\x0a\xe5\x73\x00\x98\x21\x2b\x3c\x51\x2d\x9e\x16\x07\x2b\x9f\x5f\x7a\xc1\x4b\x82\xce\xa3\xf7\x95\xd7\xba\xcc\x30\x90\x2c\xb3\xf6\x79\xc9\x84\x60\x33\xb3\xad\x68\x70\xc5\x03\x3a\x6e\x53\xd0\x1d\x9c\xb1\x37\xa9\xd8\xd9\x76\x35\x38\xee\xc9\x54\x29\x9c\xe9\x8b\x89\x3e\x1b\x5f\x9d\xdd\x7c\x98\x5e\xdb\x8d\x35\x05\xb2\x4a\xf7\x27\x34\xeb\xaf\x7f\x1e\x4d\xae\x3e\x25\xfa\xe3\xcf\x23\x58\xf7\xd7\x93\xab\x6b\x7d\xec\x8e\x11\x75\x31\xfa\xe9\x7c\xfc\xd3\xe8\xe2\x6c\x34\x48\x70\x53\x0c\xed\x56\x9a\x5c\xe1\x3e\xf9\x38\x9e\x8e\x12\x3d\xfd\x79\x78\x7e\xde\xbf\xab\x12\xbf\xa7\x94\xd8\x53\x09\xef\x36\x47\x23\x3a\x81\x83\x54\xee\x67\xf7\x99\xe9\xcd\xa5\x3d\xde\xae\x78\xcd\x4f\xde\xab\xe9\xcd\xd9\xcf\x78\x00\x8d\xa6\x89\xfe\x71\x04\x6f\x7f\x3e\xb2\x47\x8b\xdd\xe5\xc1\x56\xbe\x1c\x5d\x4d\x27\x17\xa8\x56\x71\xf1\x49\x8f\x2f\xde\x8d\xaf\xe0\x3c\xb0\xc7\xc2\x78\x78\x9e\xa8\xf1\xc5\xd9\xf8\xdd\xe8\xe2\x7a\x78\x9e\xe0\xc6\xbd\x98\x8e\xfe\xc7\x0d\xed\x42\x66\xf1\xe4\x0d\xf7\xf3\xd0\x0e\xc1\xe8\xea\xb1\xb3\x96\xbf\x67\x9f\x7b\x3e\x99\x42\x03\x3f\x4d\x26\xef\x3e\x8e\xcf\xcf\x13\xd4\xbb\x98\x5e\x4f\x2e\x2f\x87\x3f\x8d\xec\xc8\x7e\xb8\xbc\xb1\x8d\xbe\x1f\x8e\xcf\x6f\xae\xe0\x24\xfd\x30\x3c\x7f\x7f\x73\x71\x86\xad\x51\xe7\xed\x0c\xda\xb1\xe6\x43\xea\x83\x3d\x9c\x83\x5e\xe2\xc3\xec\xa8\x8c\x7e\x1d\x5d\xe8\xf1\x7b\xed\xc6\xea\x13\x4e\x94\xfa\x79\xf8\xeb\x48\xff\x38\xb2\x7f\x05\xaa\x51\x7b\x87\xe0\x99\x7b\x39\x99\x4e\xc7\xc4\x60\x3a\xa1\x6f\x52\xcb\x29\x1f\x43\x62\xcd\x09\xbe\x53\x5c\x02\x40\x24\x7b\x79\x79\xfe\xc9\x4e\x44\x44\x86\x3a\x1a\x5e\xff\x6c\xbb\x87\xd3\x31\x3c\xd7\xe3\x8b\x5f\x6e\xae\x3e\x79\x76\x54\x05\xec\xa8\xbe\xb7\xcf\xa6\xda\xaf\x3e\xbe\x34\x46\xff\xb8\x1e\x5d\xe0\x43\xc6\x67\x30\xe5\xe7\xc3\x8f\xf6\xe4\xff\x79\xfc\xe3\xf8\x7a\x8a\x5f\xf7\x9d\x4c\xd5\x74\xf2\x61\xa4\x7f\xb9\xb9\x1a\x4f\xdf\x8d\x61\x2c\xa7\xfa\xdd\x04\x3b\x7a\x7e\x3e\xf9\x48\x8d\x9e\x9d\xdf\x4c\x89\xeb\x35\xdc\x55\x7e\x69\xa8\x5d\x2b\x23\xd1\xd3\x09\x5e\xa7\xbe\x1d\x3b\x4f\xa2\xa1\x0f\xc3\x4f\xc1\xd8\x28\x7b\x8f\x61\x81\xe6\x8b\x54\xdf\xa4\xd3\x54\xff\x64\x57\xfe\x05\xf0\xc0\x8e\xec\x36\x9d\x8e\xae\xa6\x29\x92\xb9\x76\x02\xd4\x80\xd1\x77\xdc\x99\x79\x6b\x56\xc9\xb3\x67\x58\xf3\x66\xcd\x50\x53\xaf\x34\x83\xfa\xd1\x0c\x7a\xf5\xbd\x3e\x4b\xdf\xa7\x57\xa9\x3a\x4d\x4f\x5e\x9c\xe8\xe3\xc9\xbc\x4d\xf5\xc9\x9b\x37\xdf\xa2\xb4\x48\x43\x04\x55\xd5\x32\x6c\xba\x53\x76\x64\x1f\x53\x2e\x82\x0f\xa9\x6e\x6d\x52\x10\x60\xa6\xae\x89\x60\x98\xfd\x08\xd4\xcd\xc8\x9e\xe9\x93\xd3\xf4\xf4\xe4\x54\x1d\x4f\xcd\x9a\xfb\x06\x28\x63\xdb\x37\x4c\xdd\xb7\x77\x9d\x8f\x43\x6f\xfc\x2f\x4f\x4f\xbf\x4b\xbf\x3b\x7d\x71\xfa\xfc\x84\x59\xd2\x94\xfb\xd5\x2b\x7d\xfc\xcb\xa6\x34\xfc\xd6\xf6\x40\xc5\x81\x07\xcb\x1f\x70\x2e\xa3\x72\xa1\x6f\x1a\x60\x0d\x9b\x43\x10\xab\x2f\xdc\x66\xfd\x8d\x80\x29\xd6\x07\x61\xf1\x22\xa3\x89\x3d\x49\xf5\x87\xf1\xf4\x6c\x74\x7e\x3e\xbc\x18\x4d\x6e\xa6\xf1\xa5\xea\xb8\x25\x5c\x2d\xec\xba\x30\xad\x94\x3b\x17\x9c\x12\x91\xba\x33\x17\x85\x1e\xa2\xb9\x0f\xcc\x1a\x68\xdb\x06\x9a\xfb\xb1\x7e\xbd\xea\xea\xd7\xe3\xbb\x06\xf0\xf6\x20\x45\xce\xce\x84\x94\xa9\x07\x59\x02\xd5\x21\x99\x91\xfe\xd5\x59\x56\xe4\xcb\xaa\x2e\xf3\x8c\x15\x4c\xf8\xf2\x3c\x36\x32\x0e\xc4\xe1\xae\x98\xfa\x25\x87\xb7\x76\x51\xfd\xc6\x57\x8c\x0c\x12\xe4\x28\x82\x94\x0c\xf2\xbc\x97\xcb\x22\x9f\xb7\xcf\xab\xe5\xf3\x22\x7b\x50\xfe\x59\xa9\xfe\x18\x45\xf8\x16\x79\xb3\x86\x02\x67\x97\x03\x71\x10\x38\xeb\x34\x13\xea\xdc\x6e\xbf\x79\xde\xe6\xff\x32\xf6\x9a\x26\x4e\x2d\xae\xd1\x99\xdf\x65\x75\x0b\x0b\x06\xa3\x54\x76\xe9\xd6\xe8\x5a\x2c\x2a\x3d\xb3\xce\x9c\x69\xec\x03\x90\x10\xf3\xa6\x84\xe0\x16\xf0\xaa\x80\xaf\x31\x5c\x99\x3a\x9f\x67\x18\x21\x24\x51\x7e\x41\x6c\x62\x57\xc6\x42\xa8\xf0\x27\x1c\x5d\xc3\x7e\x73\x4a\x46\x45\x6a\xce\x3c\xac\x4c\x1b\x41\x5f\x08\x52\x38\xfd\x68\x7a\x5c\xe1\x03\xbf\x34\x04\x16\x7f\x89\x9c\x99\xe5\x42\xcf\x72\x2c\xb5\xc9\xea\x59\xde\xd6\x14\x97\x73\x81\xcd\xa2\x82\x7a\x2b\x1c\xbe\x75\xb6\xb5\x1d\x44\x68\x4b\x43\xc5\x99\xfe\x6b\x6f\x21\x98\x09\x65\x78\xfe\x97\x51\xaa\x29\x6f\xf4\xd0\x6d\x11\x54\xde\x99\x19\x5c\xe5\x79\xa9\xa7\x59\xd9\x66\xfa\xac\xc8\xea\x0c\x18\x21\xdb\x6d\x22\xd6\x5b\x22\x52\x7a\xd9\xa6\x59\xb3\x1c\xde\x2f\xc3\x0f\xd3\x6f\x46\xe5\xe2\x1d\x8e\xcc\x5b\x54\x3c\x9c\x0f\x28\x33\xd0\x72\x6a\xf8\xb1\x9e\x44\x43\x64\xbd\xd2\x40\x6c\x9d\x8c\xd4\xf7\x66\x01\xc9\xb6\xb3\x6a\x43\xc4\xbf\xf6\xb7\x17\x15\x20\xcd\x4b\xca\xc0\x12\x5d\xac\xef\x3b\x9e\x3f\xf7\xa6\xdc\x18\x8d\x75\x6a\x07\xbc\x6f\xef\x34\xa8\x18\x54\x09\x73\xb1\x9f\xe0\x24\x21\x5d\x0f\x9c\x36\xe4\xfc\x24\xe0\x8c\x51\x59\xdb\x56\x75\x69\xb6\x8d\x5e\x1a\x62\x27\x46\x15\x17\x62\x74\x0e\xf0\x3a\xf4\xba\xb4\xf8\x2f\x5c\xa4\x91\xa5\xef\x55\x55\xa2\x7b\x9f\xcd\xdb\xc6\xe5\x08\xc6\x65\x6b\x6a\x47\x5d\x39\xcd\x10\x03\xf3\x53\x55\x2d\x80\x75\xc4\x0b\xb3\xe1\x01\x60\x16\x00\x48\x66\xaa\x2f\x1f\x31\xa6\xad\xed\xce\x0e\x9f\xd3\xcb\xca\xdb\x4d\x86\x2c\xc0\x99\x2f\x48\xe3\x79\x55\xa0\x39\x56\x6f\xcc\xc2\xf1\xb1\x02\xaa\xb2\x46\x0c\x96\x0f\x2f\x08\x2e\x99\xb8\x80\xfb\xe4\x34\x05\x6f\x74\x72\xe1\xac\x2c\x6b\x1a\x21\x79\xbc\x57\xe6\xce\x4b\xc8\xb0\x34\x0c\x14\xa1\x6a\xce\xa0\xb0\x26\x6b\xc0\x57\xe2\xe2\x53\xef\x52\x79\xd4\xf6\xab\x44\xef\x02\xd1\x46\x42\xe7\xbb\xf1\x9b\xd5\x06\xca\x4c\x20\xdc\x25\xb1\x80\x5e\x6f\xbf\x1b\xf2\x4b\xb4\x23\x23\x85\xc8\x4e\x44\x84\xa6\xe2\x8c\x2f\xc3\xa6\x25\xfe\x18\x13\x49\xb0\xd6\x1b\xf8\x00\x43\xcc\x30\xea\x84\x5d\xb1\x27\x09\xe2\x86\xa1\x2b\x18\x16\xc7\xb1\x72\xd8\x9b\x65\x36\x6f\xab\x9a\x52\x6c\x2e\x55\xf8\xc0\xe2\x87\x82\x1b\x2f\xab\xdb\xbc\x23\x1a\x14\x51\xf0\x60\xf9\x8e\x27\x4c\x84\xea\x9d\x54\xa9\xe1\x87\xd1\xc5\x3b\x6b\xbb\x4d\x95\x1a\x7a\x54\xfd\x75\x37\x6e\x8a\x3b\x7d\x47\x54\x0c\x16\xc9\x98\xc3\xd9\x68\xfd\x35\x01\x4e\x9f\x72\xdd\x61\xb5\x77\xde\xec\x6a\x51\x3f\x7f\x6e\xef\x94\x72\x81\xd9\x38\x5c\xa4\x01\xd9\x11\xc7\xee\x7c\xdc\x1f\x88\x93\x72\xb4\x3f\x16\x8e\xd8\x32\x46\x2f\xab\xde\x50\xef\x78\x9c\xca\x90\x66\xa3\x7f\xac\x33\x20\xc6\x0d\xaa\xba\xbb\x08\x41\xd7\x7d\x21\x5a\xa5\x3c\x09\xf3\xca\x5e\xe5\xc8\x8d\xae\xc3\xf9\xc1\x5e\x48\xb4\x92\xe3\x18\x3b\x6e\x06\x1e\xe5\xa7\xc2\x42\x27\xf7\xbc\xd9\xa6\x15\x50\x40\x24\xad\x26\x4e\xb1\x25\x85\xa4\x7b\x5f\xd4\xce\x93\x7d\x59\xd7\x10\xa8\x9e\x55\xb7\x55\x6c\xe5\x39\x18\x00\x44\x16\x90\xa6\xd2\x09\x0c\x70\xc1\xac\xe7\x45\x0b\xe2\xc1\x10\xf8\xf7\xbf\xd1\x17\x48\x9f\x54\xd5\xf9\xbf\x80\x48\xc5\x3e\x8f\xcb\x44\xdc\x87\x0a\xdb\xfa\x5d\x65\x9b\xb6\x7f\x4f\xb4\xdd\x45\x2a\xa7\x32\x57\xd4\x14\x45\xf0\x43\x98\xe5\x0b\x22\xac\xf4\x86\xbf\xee\xcd\xc2\xf2\x19\x6d\x2d\x06\x5f\xea\x94\x2a\x75\x09\x2a\xa2\x6d\x25\x54\x66\xbb\xf5\x8c\x7d\xe7\x46\x90\x8c\xe0\x89\x50\xb2\xe8\x6f\xce\xe5\xfe\x28\xe6\xa4\x77\x2c\x35\x47\x5b\x2c\x0b\x21\xf9\xb3\x8a\x95\xfc\xcc\xc2\x1d\xf3\x1b\xa8\x83\x80\xb3\x85\x90\xc5\xe8\xaf\xc4\x8f\x8e\xb0\x41\x6a\x47\xff\x43\x94\x9e\x75\x0a\x5a\x73\x0b\xd2\x0b\xc8\x28\x88\x64\x28\x11\x8a\x52\xf1\xa5\x3b\x33\x50\xa0\xce\x58\xd1\x70\xc5\xcb\x06\x3a\xb5\x31\x38\xdb\x3a\x5f\x2a\xff\x31\x04\x18\x7a\x2b\x92\x70\x44\x39\x70\xe8\xf5\x90\x84\xec\x5a\xef\xbf\xa6\xd6\x37\xea\xd4\x39\xc0\x9a\x0c\x76\x74\x5f\x21\x6e\xaa\xd4\xaf\xe9\x09\x60\x08\x7e\x42\x2a\x1a\xb4\x0b\x24\xec\x50\x02\xa0\xfc\x21\xc5\x63\x9a\x68\xe7\x1b\x28\x31\xb3\x20\x5d\x09\xf9\x22\x3e\x0a\xdd\x79\x97\xb8\xe6\x7e\x4d\xd1\x51\xfc\x35\x7d\x09\x1d\x39\x4d\xf5\x04\xae\x89\x4b\x12\xca\x4d\xc3\xa9\x63\x38\x59\x4c\x5e\xe3\x74\x75\x7d\x02\x4d\xc9\xcd\x17\xad\xc2\x00\x64\x4c\x3c\x27\xf2\xf0\x59\x6c\x5c\x29\x56\xfb\x50\xa9\xe3\xd3\x81\xde\x9a\xac\x6e\x22\x09\x39\xa6\xdc\xe0\x02\x8e\xce\x5e\xf2\x92\x99\x88\xcf\x70\xd7\x85\x72\x1d\x76\xc1\xd2\xd0\x3a\xdd\x55\x25\x88\x24\x88\x5e\x74\x0d\xc8\x36\xc5\x35\xe4\x07\xa2\x14\xb8\x21\x6c\x8c\xd2\x42\x95\xcf\x1e\x89\xc9\x71\x2b\xca\x4e\x85\x1e\x16\x64\xd3\xdd\x73\xe6\x32\x2f\x6f\xa3\xb9\x70\x54\xb2\x5d\xad\x44\x3f\xec\x4a\x0e\xbb\xb4\x63\xc3\xa5\x2a\x34\x50\x9c\xa8\xf5\x7f\xc5\xc1\x83\xed\x38\x4e\xf5\x50\x38\x49\x28\x0c\xd7\xfa\x53\xf8\xa2\x6a\xed\x9b\x39\x22\x84\x18\x19\x22\xb6\xdb\xc9\x89\xce\x66\xd5\x3d\xd9\x5d\xc2\x1f\x47\x6d\x01\xf0\xd8\xa2\x47\x09\xa7\x48\x40\x41\x4e\x4e\x40\x51\x00\x9d\x38\xf4\xa0\xa2\xc4\x34\x3a\x6c\x6e\x77\xf7\xfa\xaf\x1d\xe3\x59\x8f\xfe\x01\xe1\x3d\x20\x64\x3a\xba\x8e\xc8\x7d\xe0\xa3\x28\x45\x58\xc7\xee\xd7\x4e\xc3\x88\x30\x02\xea\x24\x7d\xa1\x23\x9a\xdc\xb7\x2e\xb7\x6c\xef\x6d\xbc\xa3\xf9\x09\xc6\x5b\xe8\x21\x72\x50\x7b\x09\x5e\x01\x7f\xc4\x12\x87\xa0\x2a\xd5\x0f\x45\xd6\xea\xbb\xb6\x5d\xff\xf0\xcd\x37\x0f\x0f\x0f\xe9\x0a\x0d\xb1\xb4\xaa\x6f\xbf\xb9\xb8\x3c\xff\x46\xa9\xa9\x0b\xa7\x09\x39\x6b\xef\xbf\x8a\x10\x8f\xfc\x40\xa8\x1b\x8d\xe5\xe5\x8a\xe3\xd3\xfd\x19\xc5\x9d\x02\xd2\xa9\x9e\x1a\x13\xa2\x37\x2a\x84\x23\xd0\xb1\x3b\xf7\x5e\x13\x06\x78\x04\xb3\x4a\xa8\x03\xdb\x74\x7b\x4e\xd1\xcd\xd0\x2c\xc8\x9b\x47\x4d\xd2\xc4\x9f\xa6\xa8\xf2\xf0\xf2\x24\xd1\x27\x6f\xde\x7c\x4f\x0d\xf6\x20\x08\xfb\xb8\x99\xa4\xd5\xbc\x1b\xf5\x92\xaa\x4b\x2e\x29\x17\x45\xff\xde\xec\x83\x18\xa1\x54\x4b\xb4\x1d\xd9\xd5\xb0\x92\x0d\x43\x8a\x8a\x28\x41\xaf\xbc\x7e\xa2\xf0\xf2\x8e\x9b\xc1\x0f\xfa\xff\x39\xe8\x27\x3d\x52\xea\xff\xba\x98\x5c\x8f\x7e\x20\x05\xdd\x3f\xbd\x04\xb3\xcf\x81\x23\x22\x17\x92\xf7\x0d\xd8\x89\x6c\xf3\xb4\xc1\x77\x38\x95\xde\x07\x45\x45\xfe\xa3\xde\x11\x25\x45\x52\xbb\x1e\x37\x0e\xdd\x43\x6e\x73\x96\xdb\xcd\x6a\x4a\xe0\x42\x87\x3b\x35\x2f\x75\x93\xaf\x36\x45\x9b\x95\x06\xf1\xcc\x10\x50\x02\xaf\x2e\xdc\x26\x48\xc5\xbc\xae\xcd\x1a\xd8\x5c\x7b\x88\x48\x96\x58\xba\x67\xd7\x44\x4a\x25\x56\x60\xf4\x38\xfb\xba\x7f\x38\xea\x0c\x38\x19\x00\x07\xe3\x3e\xb6\xac\x36\x65\xbf\x51\x1c\x5b\x5b\xdd\xe2\xa4\x26\xfd\xbf\xff\x1e\x5a\xd2\xf4\x9b\xeb\x9b\xe7\x3f\x9a\xba\xc8\xcb\x7f\x1b\x0b\xe8\x7e\xfe\xcf\x17\x27\xa7\xaf\x63\xfe\xcf\x97\xf6\xe3\x5f\xf9\x3f\xff\x86\x1f\x7f\xe4\x9c\xbc\x79\x73\x0a\xa7\xdf\x4b\xf8\xdf\x57\xf6\x74\xfa\x65\xd3\xb6\x99\x7e\x67\x80\xf4\x11\xed\xf3\xac\x6e\x5a\x53\xea\x1f\xab\x7a\x95\x95\x65\xa2\xd4\xb5\x99\xdf\x95\x79\x33\xc7\x40\x1c\xa0\x7f\xda\xcc\xb4\x1a\x17\x95\x52\x43\xc9\x0e\x0c\x62\x03\x9e\x9a\xcb\x0b\x1d\x84\xb8\x7a\xf8\x20\xe3\x15\xd1\xeb\xad\xcd\xaa\xba\x37\x0b\xe5\xd0\xf3\xa5\xe0\x2d\x23\x35\x3f\x5d\x92\x0f\xbb\xbf\x4f\x1a\x49\x2a\xcd\xca\xba\x84\x95\xe7\xf3\x21\xe9\x87\x90\xa8\x3b\x73\x19\xff\x06\x62\x35\x8e\xb1\x20\x7c\x19\x7b\x9d\x49\x26\xfe\xb2\x42\xe2\x71\x88\x26\xc7\x41\x33\x08\x9d\x23\x1d\x76\xa7\x25\xc0\xb9\x5c\x8d\xd4\x78\xaa\x87\x3f\x4e\x27\xe7\x37\xd7\xa3\xf3\x4f\x42\x7d\x12\x03\x7d\x90\x41\x9d\x4e\xde\x5f\x7f\x1c\x5e\x8d\x52\xa5\x86\x40\xd2\x89\x29\x1d\x88\x8f\x6d\xea\xd6\x34\xdb\x24\x18\x1d\xeb\x07\x9a\xa6\xa5\x14\x0e\x96\x19\x9a\x85\x35\xd8\x36\x2d\xea\xf8\xda\x9e\x78\x0d\x65\x08\x0d\xda\x43\x2c\xa1\xcf\xcc\x36\xb7\x8d\xb3\x21\xf9\x63\x24\x07\x34\x63\xbd\xb8\x7c\x65\xe7\x92\x50\xdb\x92\x37\xa8\x5a\x32\x79\x28\x16\x57\x9a\xa6\x4d\x69\x46\x12\x7d\xfa\x7d\x7a\x72\x92\xda\x75\xa7\x54\xb0\xea\x94\x8a\x96\xdc\x7f\x6b\xba\xe6\xbf\xfc\x27\xfd\xe6\xec\xdd\xbb\xf3\xe7\x27\xe9\xc9\xbf\x8f\x00\x7a\xff\xf9\xff\xea\xe4\xbb\xd3\xef\x62\xfe\xe7\xd7\xaf\x5e\x7e\x3d\xff\xff\x8e\x1f\x14\xb9\x65\x94\x0d\x80\x06\x48\x88\xd6\x6b\xf2\x32\xc8\xf0\xd8\x2e\x95\x81\xa4\x86\x3e\xd9\x43\x0d\x7d\x24\xec\xcf\x23\x49\x0c\xdd\xcb\xb8\xbb\x87\x26\x9a\xeb\x77\x1f\xa5\x89\x3e\xea\xe1\x72\x3a\x3a\x90\x24\x9a\x5d\xa4\x44\x01\x51\xb4\x3e\x80\x28\x5a\x1f\x63\xfa\x78\xb0\x83\x31\x5a\xed\x60\x8c\xd6\x3d\x8c\xd1\x47\x1c\x20\xe2\x7e\x1c\x45\x8c\x89\xdd\x8e\x32\xa5\x61\xc8\xf2\xa5\xec\x6f\xe7\x83\xbe\xf7\x45\x7b\xbb\x87\xb9\xd6\xb5\x89\xfe\x67\xfc\x39\xf5\x65\x44\xd3\x47\xbe\x52\x4c\x4e\x46\xfc\xc2\xfb\x29\x9d\x95\xa3\x74\xfe\x36\xd5\x47\x1d\xbf\xec\xe8\x31\x42\x67\x98\x82\x65\x5e\x53\x8d\x91\xa7\xaa\xf5\xbe\x71\xb7\x58\x33\x22\x97\x7d\x9d\xea\x23\x51\xda\x74\x74\x10\x77\xb3\x6b\xfe\xaf\xe7\x6f\xfe\x2e\xf5\xa1\x86\x9d\xec\xcd\xdf\xbb\x0f\xc9\x09\xb8\xcb\xee\x5d\x4c\x90\x51\xfa\x90\x56\x48\x76\x29\x52\x51\x9d\x50\xa2\x58\x8e\x23\x62\xf4\xc5\x91\xc7\x69\xc1\x04\x05\x94\xb6\x71\x75\x01\xd0\x85\x63\x14\x3a\xc1\xac\x7c\xb9\x50\xa2\x00\x8a\x3c\xfd\x79\x55\xde\x9b\x2d\x01\x42\x01\xff\x02\xfc\xd3\x47\xc1\x0a\x94\x93\x2d\x1d\x29\xbb\x09\x3b\xa5\xc2\x4b\x51\x9f\xa5\xa4\x6c\x28\x91\x3f\x7b\x22\x66\xac\xb8\xa3\xc0\x99\x20\xbd\x02\xd1\xd1\x90\x14\x1a\x32\x44\xbe\x47\x4c\x16\x7a\x18\x4f\x74\xb8\x24\x7a\x39\x9d\xdf\x7e\x36\x57\x74\x5f\xdb\xc1\xfe\x7d\xab\x2b\x6b\x52\xf5\xb5\xce\x34\xb0\x1c\xfe\x91\x4a\x38\xbd\x6a\xb1\x3b\x89\xb3\x1c\x27\xf5\x51\xa7\x63\x4f\x9c\x3c\x46\x84\xa9\x90\xad\x9a\xfb\xcb\x82\xab\xa8\xbe\x8d\x91\x9c\x1d\xbb\xf7\xc4\x5e\x49\x97\x48\x14\x88\x44\x38\x47\x82\xc5\x9c\x18\x04\x81\x00\x06\xa8\x25\x80\xe8\x90\xb9\x0d\x05\x41\x0a\x2f\xe2\xbd\x3a\x3b\x89\x5e\x99\xf6\xae\x5a\x00\xb0\x68\x0e\xba\x3d\x60\x23\xaf\xd7\x59\x9d\xb5\x9b\x86\xe8\x75\x12\x3a\xf3\x14\x3d\xdd\xef\x53\xcd\x54\x97\x74\x43\x9c\xd8\xdb\x4d\x0c\x57\x7c\x3b\x10\x47\x6f\x3c\x6a\x11\xc7\x77\x5e\x12\x50\x39\xa4\xb6\xb6\x7f\x27\xf7\x07\x4b\x00\x85\x18\x54\x4c\x5f\xe4\x32\x7d\x8a\x78\x59\x7d\x16\x09\x3b\x6a\xef\xb2\x4f\xd5\xe6\x08\x78\x7f\xec\xbf\xea\xa3\xc1\xe7\x52\x2a\x63\x66\x18\xc7\xee\xa9\x94\xca\xbd\xac\xc8\x0a\xbb\xc6\x9c\xc8\xfa\x0b\x39\x91\x95\xe4\x44\xd6\x87\x71\x22\x1f\xd1\x77\xa2\x19\x54\x01\x23\xb2\xfe\x62\x46\x64\x77\x4c\x3f\x8d\x11\x19\xf3\xde\xf6\xda\x0d\xb8\x91\x15\x71\x23\xff\x55\x9c\xc8\x1c\x90\x03\xb6\x57\xcf\x0a\xfb\x28\x29\x32\xc4\x34\xf1\x54\x36\xa8\x4a\x4f\x15\xfd\x51\x04\x5d\x90\x40\xa0\x26\x31\x69\x65\x86\xec\xaf\xea\x71\xf6\xd7\x64\x57\x6d\xe5\x97\xd3\x30\x13\xb1\x2c\x09\x89\xef\xc1\xcc\xe9\x63\x61\x0d\xad\x9d\xa8\x96\xcb\xf4\x0f\xc4\xb9\xa1\x7a\xa9\x8b\x3f\x97\xbd\x56\x75\x6b\xbb\x7b\x6e\x9a\x1d\x64\xa9\x11\x79\x73\x6c\x44\x12\x24\xe3\x60\x02\xe7\xe0\xe4\x76\xda\x63\xce\x56\xc2\x54\x7b\xa2\x37\xac\x62\xd8\x18\x28\x0a\xb3\x0d\x77\x4c\xbd\x44\xef\xe0\x72\xb6\xe7\x75\x36\x6f\x81\x1d\xc2\x36\x40\x38\x20\xac\x51\xb3\x8d\x66\x85\xe1\xae\x8b\x4a\x38\x3b\x86\x55\xd3\xcd\xa8\xee\x1f\xa2\x54\x29\x6b\xa8\x5f\xfb\x1a\x39\x5f\x0f\xe3\x13\x61\x8d\xdd\x15\x76\xa1\xb8\xc3\xb9\x36\x42\x60\x91\x90\x51\x8b\xac\xed\xe3\x3b\x40\x83\x57\x20\x61\xe2\x4b\x9d\x05\x6b\x3b\x5d\x56\x01\xa5\x62\x40\x59\xf8\x18\x97\x89\x7d\xaf\xc5\x40\xc7\x49\x43\xcf\x08\x7b\x02\xaf\x81\x59\xc2\xb2\xe2\x25\x5d\xf8\x24\x14\x8d\xc2\x0f\xfa\xf8\x04\x75\x7d\xfd\x9d\x8f\x5c\x22\x80\x6e\x76\xe9\x86\x1d\xae\xd1\x29\xca\x63\x4a\x99\xba\x46\xc1\x41\x6a\x57\xcd\x0f\xa0\xab\x08\x4b\x47\x72\x82\xed\x74\x0b\x9d\x68\x62\xfb\x88\x3c\x4f\xe8\x4b\x11\x83\x9a\xb0\xca\x16\xe6\x1e\xf8\xba\x1e\xa5\xc0\xfe\xdb\x8f\x3a\xf3\x44\xce\x6d\xf5\x9f\x3c\xe5\x64\x3f\xbf\x80\x9c\x5b\x45\xc7\xdb\x17\x92\x73\x27\xca\x53\xc6\x7e\x3e\x3b\xb7\xdf\x84\xff\xc6\x43\x32\x89\x4e\xc9\x3d\xa1\x0b\xf9\xda\xf4\x7e\xc0\xb6\xc2\x87\x38\xe6\xb0\x5d\xa8\x01\xde\x31\x6f\x9b\x80\x83\xad\x97\x5a\x9b\xcd\x03\xf1\xed\x81\x38\x9c\x61\x52\xf1\x1c\x8e\xce\x60\x25\xce\x6d\xea\x44\xdf\x71\x0c\x27\xc8\x3e\x19\x2f\xd9\xc3\xde\x09\x25\x5e\x8c\xd3\xde\x80\xca\xee\x86\x03\x56\xf1\xbe\xf1\xe8\xa7\x1a\xef\x1b\x8f\xc3\xaf\x89\x53\xbe\x26\xec\x3f\x77\xdc\x14\x48\xd9\x1b\xb0\xd6\x1c\x7a\x47\x44\x58\x2d\x47\x87\x1b\xdf\x0f\x8f\x9e\xff\xa7\x4f\x3e\xff\x81\x68\xd6\xdd\x01\x31\x7a\x19\xef\x83\x85\xbf\x10\x7a\xc6\xf9\xad\x9d\x43\xd5\xb9\x0f\x74\xe7\x3e\xf0\xd7\x5c\xe8\x24\x01\xd4\xb8\xb3\x9c\x77\x5e\x0b\xfb\x97\x47\xd0\x54\xdf\x3d\xc1\xd5\x2b\x62\xe7\xef\x78\xb1\x81\x9b\x2e\xbe\x59\xde\x42\x08\xf0\xe5\x01\x67\x42\x5f\x08\xae\x0d\x44\x5c\xd5\x61\xef\x70\x08\x69\x3d\xd3\xd6\x9e\xec\xe7\xfe\xc6\x7c\x61\xa7\x67\xfe\xf2\xf7\xe7\x75\x67\x9d\x86\x6c\xdf\x82\xa0\x0a\xfc\x62\xcf\xb6\x79\x18\x39\xb8\x4b\x34\x4a\xfa\x2c\xdf\x52\x48\x54\xaf\x0f\x21\xaa\xef\xb2\x24\xab\x47\x59\xe6\xf5\x2e\x96\xf9\x1e\x09\x2b\x1f\xcb\x3c\x7c\xa4\x82\x3e\x41\x9b\x9e\xa1\x4d\x49\xf6\xa9\xbe\xc5\x12\x07\x6c\x30\x57\x7a\x57\x3d\x68\xe0\x07\x9a\x67\x65\x40\x82\xdb\xd7\x44\xe7\x95\x00\xe4\xe4\x0b\x42\xac\x8f\x5b\xe2\x85\x0a\xb9\x5d\x2c\xc5\xcb\x58\x27\x7d\xbe\x69\xda\x6a\x95\xd5\x79\xb1\xc5\x20\x3d\x5c\x11\xdc\xbe\xf9\x93\xe8\xa9\xfd\xf2\x3b\x4d\x3b\xb9\x83\xae\x62\x82\x5b\x6d\x5d\xc1\x84\x98\x6d\x5e\x0a\x26\xa8\xbd\x81\x5b\xf8\xa6\xcb\x2e\xfb\x67\xcc\x4c\x91\x9b\xfb\x1e\x26\xe0\x46\xd1\x54\xd6\x2e\xce\xe5\x72\x20\xc7\xcd\x80\x2f\x3e\x47\x08\x28\x48\x8b\x3d\x30\x1c\x63\xb1\xf6\xe4\x8f\x43\xac\x5d\xfd\x34\x1e\xa3\x97\x3d\xf4\xb2\x4a\xf5\x30\x7c\x7b\x46\x21\xb0\x1d\xab\x1e\x96\x5d\x1a\x4c\x27\xa8\x48\xde\x72\xd3\x39\xcf\x68\x29\xcb\xef\x86\xd2\x09\x08\x00\xf0\x9c\x77\x78\x29\x10\x7a\x21\x51\x3d\x36\xa3\x66\xf0\x91\x07\x40\x62\xf1\x7f\x6f\x02\x22\x61\xb2\x14\xfe\x56\xb5\x14\xb0\x73\x97\xb5\x27\x7a\xa8\x7b\x02\xf9\xdc\xa2\xde\x58\xd6\xfa\x73\x8f\xe4\x41\xe4\x19\xef\x2a\x8f\xba\x60\x66\x41\xe7\x1d\x71\x41\xc5\xe5\x1f\x3c\x07\x8f\x49\x49\x68\x92\x92\x78\x64\xbb\x29\xa2\x5e\x7e\x92\xb6\x44\x9f\xf6\x06\x2c\xae\xbd\xda\x12\x8f\xd0\xcd\x6a\x49\x37\xab\xbe\x88\x6e\x56\x16\x70\xa8\x7e\xba\xd9\xa9\x03\x5a\x38\xca\xd9\xed\x4e\xca\x59\x2d\x28\x67\xd5\x97\x51\xce\x86\x2c\x77\x6a\x1f\x09\xe2\xe3\x94\xb3\xc1\x18\xa8\xbf\x84\x72\x56\xf7\x73\x26\x7e\x26\xd7\x61\x3f\xfb\xe2\xd3\x29\x67\x77\xb1\xec\x76\xc9\x10\x79\x23\x7d\x7b\x18\xf1\xac\xdf\x4c\x3b\x89\x2d\x7b\x65\x22\xdd\x6e\x8a\x2e\xfb\x3e\xd5\x95\x1e\x7b\xe0\x00\x3a\x52\xc5\x9a\x0d\x7f\x0d\x1d\xa9\x7a\x84\x18\xf0\x50\x3a\x52\x3b\x18\x7f\x2d\x17\x29\x0c\xef\x17\x13\x91\x76\x8c\x9f\x1e\xc3\x64\x27\x33\x69\xcc\x3d\x19\xec\x4a\x15\xed\xca\x2f\xa3\x26\x55\x9e\x9a\xb4\xff\xc0\x38\x9c\x96\xf4\x7f\x05\x76\xe8\x2e\x2d\xa9\x8a\x77\xe2\xeb\x88\x9c\xd4\x6f\xb9\xc3\xd9\x49\xfb\xc2\x69\xd6\x15\x54\x5f\xc2\x50\xaa\x43\x86\x52\xf5\x97\x30\x94\xf2\x73\xd5\x61\x0c\xa5\xee\x1a\x62\x96\xd2\xdd\x2c\x8b\x38\x9e\xaf\x3a\x5c\x8b\x4a\x4d\xea\x6c\x5e\x80\xcf\x2c\xf3\xef\xae\x5c\xa4\x35\x0f\x59\xbd\x70\x65\x24\x07\x70\x2c\x76\x4e\xb1\x1d\x24\x8b\xfa\x30\x92\x45\x15\x91\x2c\x32\x3b\xa7\xf5\x6b\xf9\xe4\x12\x45\x1f\xaf\xd2\x97\x10\x12\x88\x98\x05\xc5\xc1\xa4\xf8\x9d\x76\x93\x0c\xf6\x98\xb4\xaf\xf6\x30\x3b\xfa\x45\xd9\x4f\xc5\x98\xec\x77\xa4\xfa\xa6\x54\x3d\xc2\xfb\xdd\xe1\x0d\xe7\xc1\x26\x0a\x2c\xe7\x67\xf8\xf4\xb6\x72\x55\xcb\xbd\x6b\xc8\x1e\x8d\xfd\x3b\xd9\xe7\x3a\x85\x7c\x41\x7f\xc0\x9a\x49\x52\x91\xf1\x02\x67\x1e\x0b\x08\x03\x47\x57\x0c\x81\xea\x85\x05\x1c\xc4\x2b\x29\xb6\x94\xd0\x47\xc4\x95\xba\x63\x58\x1f\xa3\x53\x8f\xa4\x73\x0f\x19\x56\xfd\xc8\xb0\x4e\x5c\xba\x54\xed\x66\xdb\xfc\xcb\x57\xc8\x13\x89\x39\xd9\xed\x8c\xb6\xbd\x58\xfd\x2f\xd9\xe9\x35\x0b\xb9\xf0\x3f\x32\x97\x30\x0c\x6e\xb9\xe3\x46\xb1\x1f\x78\x00\x27\xb2\xf2\xe7\xb6\x3d\x33\x84\xad\xa0\xc0\x92\xe9\xc9\x9a\xc4\x07\x7e\xb9\x78\x84\x9c\xd3\x9d\x9e\xc8\xf5\xf6\x83\xa4\xca\x94\x2f\x89\xb4\x11\xe0\x11\x22\x6a\x1b\xee\xf5\xb9\xe7\x67\xb3\xdf\x50\x11\x07\x25\x1f\x1e\x82\x1c\xa6\xac\x5a\xd3\x35\x7f\xf0\x76\x6f\xfc\xf5\xce\xdd\x1a\x78\xa2\xe4\xbd\x4c\x98\xed\x4e\xe6\x4b\xb5\xdf\x7e\x70\xc4\xc0\x8f\xd2\x42\x32\xfa\xfb\x30\x6a\x48\x2e\xe3\xfa\x8f\x12\x43\xca\x2e\x3f\x4e\x0e\xa9\x80\x67\xed\xef\x22\x87\x94\x7d\xdb\x4b\x10\xc9\x1f\x54\x40\x12\xa9\xff\x12\x92\x48\x49\x68\x37\xd0\x5f\x4c\x12\xa9\x22\x66\x46\xfd\xf9\x24\x91\xaa\x97\x24\x32\x18\xad\xcf\x24\x8a\x7c\x1d\x13\x45\xbe\x46\xf8\xc7\x7f\x6d\xb6\xc8\xc7\xf9\x1b\xd5\x53\xf8\x1b\x3b\xc6\x6c\xcc\xdf\x08\xa4\xd5\xe4\x18\x65\x4d\x63\x6a\xd4\x70\x43\x3d\x5c\x91\xea\x20\xe9\xb3\x63\x4f\x6a\xb5\x30\xf3\x22\xab\x33\x50\x13\xfa\x7d\xb3\xb8\x05\x81\xaa\x0c\xb3\x49\x03\xc7\x4c\xd3\x1f\xda\x08\x33\xa1\xbd\x96\x87\x8a\xa8\x75\xb9\x41\x50\x4b\x13\xbd\xc5\x84\x17\x74\x0e\xf4\x7b\x97\xa6\x26\xaa\x82\xac\xd1\x47\x97\x80\x9a\xce\xd7\x59\xd9\x1e\x0d\x54\x56\x14\xe6\x36\x10\x63\x11\x7f\x17\x70\x8b\x95\xc9\x4a\xc6\xb7\xf6\x25\xdd\x80\x0d\x47\xc5\xdf\xcf\x23\xdd\x28\x26\xc4\xe8\x49\xed\x03\x9b\x4e\xf4\x7d\x45\x56\x78\x67\x24\x06\x3b\x38\x71\xdc\xfc\x48\x08\x22\xea\x44\x29\x82\xc8\x02\xce\x2d\x5a\xfd\x3b\x1a\x6b\x2b\x8c\x26\x93\x57\x26\x3a\x96\xec\x70\xf2\x8e\xf3\x9d\x46\x23\xfa\xf8\xd1\x0b\x0e\x1c\x68\x57\x0c\x12\x23\xe2\x24\x5c\x85\x1d\x8b\xd3\xf4\xb4\x7f\xfd\x26\x00\x68\x50\xaf\x69\x53\x51\x18\x19\xee\x42\x39\x21\x7e\x63\xaf\xeb\x0a\xc8\xd5\xf2\x7b\x53\xd0\xc0\x04\x5b\x9d\x56\x83\xf9\x73\x9d\xd7\x6e\xdf\xc0\x38\xe0\x33\xf8\x11\x6b\x53\xe7\xd5\x22\x61\x42\xb4\x7c\xc9\x01\x61\xf1\x59\x85\x1f\x42\xbb\x27\x6f\xef\x16\x75\xf6\x40\x91\x1a\x58\xa5\xb1\x9c\xc3\xce\x65\x48\x2b\x5e\xc5\xf3\xc1\x39\xf4\x4d\x99\x93\x56\x0e\x4e\xe6\x7a\x53\x37\x1b\x32\xb4\x32\x20\x66\x6b\xad\x4b\xe5\x78\xc1\x40\x56\x46\xb4\xc3\x84\xe8\x87\xef\x7e\xde\x83\xb2\x33\xbc\xa7\xd4\xfe\x3d\xf5\x84\x25\xac\x70\x7b\xc4\x1b\xbb\xa9\x0a\x6b\x68\x3b\x59\xb3\x99\xe7\x35\x00\x24\x42\xdb\xa2\x48\xde\x40\xaf\x99\xf5\xa5\xbd\xb3\xee\x8a\x5d\x9d\x3c\xa7\x7d\xef\xe6\x09\x04\x48\x64\x0d\x3d\x73\x97\x41\xba\xcf\x8a\x8d\x61\x9f\xa0\x93\x43\xef\xd9\x30\x7d\x4b\x9a\x96\xb3\xe3\xf0\x6a\xb3\x3f\x4c\x89\xcc\x2b\xd9\x1c\x6a\x91\xed\x59\xbe\x30\xb8\x66\x9d\x2e\xf2\x0a\xfe\x52\xd5\xae\x13\x34\x4e\xdb\x15\x25\x2b\x0a\x41\x6e\x0f\x52\x25\xb8\x90\xef\x09\xd3\x29\xaf\x82\xa8\x57\xaf\xb1\x57\xaf\xd3\x53\x4e\xa6\xdb\xae\x99\x72\xa1\x36\x8d\xa9\xfd\x8b\xc2\xbc\x7a\x19\xac\xfb\xac\xc8\x17\x82\x9f\x98\x62\x54\x9c\xdf\x60\x4f\x86\xe0\x3f\xc8\x4d\xe3\x27\x44\x74\x47\x5c\x25\x9d\x41\xf5\x87\x51\xd4\x28\x13\x00\x32\x1f\xb2\x68\x30\x65\x42\xf4\xff\xc5\xc8\x88\x3f\x4d\x6e\x92\x3d\x8c\xc4\xaa\xc3\xf2\xfd\x18\x23\x31\xdb\x4e\x1d\x56\x62\xe5\x58\x89\xf5\x1e\x56\x62\xfb\x89\xaf\x44\xc4\x5f\x89\x88\xff\x06\x22\xe2\xf1\xf4\x73\x88\x88\xbf\x3f\x9c\x87\x78\x2a\x6a\xc1\x33\x7d\x14\x53\x11\x1f\xed\x67\x22\x56\xcc\xd5\xfb\x18\x13\xf1\xd1\x3e\x22\xe2\x23\x7d\x9c\x51\xa1\x72\xfc\x94\xac\x15\x8c\xc0\xff\xdf\xff\xab\x4f\xbf\x3d\x4d\x4f\x4f\xbf\x7b\xfe\xdd\x8b\x93\x57\xc7\xd9\xe0\xf8\x64\x80\x80\xab\xbe\xf6\x55\x3f\x87\xf1\xd1\x13\x18\x8c\x35\x32\x18\xab\xbf\x8a\xc1\xd8\xff\xea\x95\xfa\x02\x06\xe3\x28\x24\x5f\x16\x5b\xb5\x9f\xc5\x18\x9d\xba\xf8\x01\x44\x58\x32\x2f\xa0\xb6\x01\x74\x6f\x75\x91\x9b\x0d\x70\xe1\x22\x88\x75\x6d\xea\xc6\x2c\x4c\x83\x25\x63\x18\x11\x7e\x3f\xbc\x4a\xf4\x3b\xf8\x5f\x87\x7c\xa2\x36\xa0\xe6\x89\xf9\x8b\x01\x86\x97\x2d\x16\xb5\x69\xec\xcd\x24\x1e\xec\x13\x52\xdd\x3a\x99\x5d\x94\x65\x6f\xbe\x52\x30\xef\xa0\x60\x06\xa3\x2a\x7b\x60\x3f\x38\x20\xa9\x0d\x28\xd5\x5c\x00\xba\x17\x8d\xd1\x03\x9a\xef\x63\x70\xd6\x11\x83\xb3\x3a\x90\xc1\x19\x46\x47\xf6\xed\xd9\x7e\x46\xe7\xe1\x23\x6c\xbd\x9d\x21\x39\x80\xab\x77\x8e\x1c\xbd\x20\xf0\xeb\xd9\x12\x83\x4f\xda\x65\x8f\xb4\xbc\x6e\xe8\x94\x18\xba\x7e\x20\x4b\x4f\xd8\xf5\xf3\xb8\x7a\x93\xcf\x26\xeb\x7d\xf6\x95\xad\x77\x07\x5b\xaf\x64\x8b\xb5\x27\x92\xcb\x07\xf7\xb2\xe9\xf6\x50\x81\x85\xd4\xde\xf6\x7d\x2b\xeb\xe5\x2d\xac\x97\xd1\x10\x8f\x9a\xf2\xaf\xd9\xe8\x63\x8e\x9a\xd1\x47\xb9\x48\xad\xc8\x1e\x78\x02\xdd\x98\x70\x79\x2c\xa5\x55\x37\xd6\xad\x37\xcd\xc0\x7a\x70\x98\x19\x78\x3c\xbd\x21\xe4\xea\x7b\x30\x47\x5e\x9a\x60\x1f\x5b\xf1\xb0\xd1\x33\xd3\x3e\x58\xf7\xa4\x3f\x07\x11\x05\x72\xb8\x58\xc1\x11\xa9\x8b\x71\xc4\x82\x11\x44\xbb\x42\xe6\xf7\x09\x04\xc5\x76\x3c\xf2\xb6\x91\xfc\xc4\x6a\x1f\x3f\xb1\xcb\x8f\xf4\xd0\x01\x77\x03\x62\x48\x6f\x29\x22\x27\x3d\x74\x9c\x87\xb1\x04\x5f\x54\x2d\x48\xd8\x51\x00\x13\xee\xce\xd6\x00\x6d\x61\x55\xfb\x33\xc9\xab\x51\xc1\x1a\xce\x41\xf4\x10\x22\x4b\x8b\x55\xde\x34\xf4\x76\x0e\x17\x90\x2a\x75\x31\xb9\x1e\x9f\x8d\xf4\xe5\xcd\xd5\xf4\x66\x78\x71\x6d\x2d\xd4\x29\xc6\x94\xf5\x1b\x1f\x30\x3f\x98\x31\x42\x31\x63\xc4\x35\xeb\x46\x76\xaa\x74\x8d\xb6\x1f\xd9\x7b\xb5\x78\x9d\x47\xbb\x05\x54\x40\x65\x2e\xbd\xd0\xe8\x3c\x17\xec\x83\x83\x9d\x07\x7a\x87\xe0\x7e\xc7\x81\xae\x1f\x27\x5f\x57\x87\x91\xaf\xbb\xf5\xdc\xd8\xb7\xe1\x4b\x41\xbe\xa1\xae\x96\xaa\x43\xbc\xfe\x24\xb2\xf6\xf4\x2b\x47\xce\xd7\x9f\xaf\x3f\x5f\x7f\xbe\xfe\x7c\xfd\xf9\xfa\xf3\xf5\xe7\xeb\xcf\xd7\x9f\xaf\x3f\x5f\x7f\xbe\xfe\x7c\xfd\xf9\xfa\xf3\xf5\xe7\xeb\xcf\xd7\x9f\xaf\x3f\x5f\x7f\xbe\xfe\xfc\x77\xff\xf9\xff\x03\x00\x00\xff\xff\xd4\xcd\x8f\x35\x00\x00\x3c\x00") + +func licensesTarBytes() ([]byte, error) { + return bindataRead( + _licensesTar, + "licenses.tar", + ) +} + +func licensesTar() (*asset, error) { + bytes, err := licensesTarBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "licenses.tar", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _urlsCsv = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x7d\xeb\x6f\xdb\x38\xd7\xe7\x77\xfd\x1b\xc5\xfb\x62\x17\xef\xe8\x42\xdd\x2c\xcf\xa0\x28\x1c\x27\x69\x33\xeb\x24\x9e\x38\x7d\xda\x67\xbe\x18\x14\x49\xd9\x9c\xd0\xa2\x86\xa4\xe2\xa4\x1f\x9e\xbf\x7d\x41\xea\x62\xc9\x89\x6d\xa5\x93\x05\x16\x45\x5b\x5b\xfa\x9d\x0b\x0f\x0f\xc9\x73\x78\xb3\x77\xb6\x38\xff\xe5\x57\xd7\x65\x30\xc7\x8c\x3c\x3b\x39\x51\xae\xe2\xcf\x29\x7f\x72\x19\x45\x24\x97\xc4\x59\xab\x0d\xb3\x26\x93\x99\x86\xf1\x82\xe4\x92\x97\x02\x11\x87\x8b\x55\x03\x91\x2e\x54\x4a\xd0\xb4\x54\x94\xe7\xd6\xe4\x7c\x61\xb0\x19\xc1\x5c\xc0\x42\xf0\xbf\x08\x52\x06\xbe\xa5\x0f\xd4\x9d\x19\x1a\x9a\xaf\xdc\xc9\x06\xfe\xe0\xf9\x39\x5d\x51\x05\xd9\x82\x88\x47\x8a\x88\xac\x5e\x13\x6b\x72\x39\xb3\x81\x03\xf6\x84\x32\x9a\x97\x4f\xf6\x86\x0a\xc1\xc5\x9e\x06\x19\xd3\x78\x47\x3d\xa9\x2e\xed\x16\x3e\xa7\x10\x3d\x38\x50\xa0\x35\x7d\xac\xb4\xde\x92\xd4\xf5\x3d\xcf\x07\x9e\x17\x02\x3f\xf4\xa3\xd0\x5d\x2b\x55\x68\xf4\x76\xeb\x1c\x2c\x22\x82\x98\x6c\x28\x72\x8a\x75\x51\x4b\xf0\xdf\xa8\x9d\xdf\xd1\xce\x3f\xa9\x9d\xef\x85\xbe\x17\xc6\x91\xff\x53\xda\xf9\x8e\x77\x42\x42\xec\x8d\xfd\x10\x04\x61\x14\x04\x83\x24\x64\x4c\x33\x6d\x8b\xe0\xbf\xb1\x72\xfc\x4e\xe5\x04\xb5\x72\xdb\xad\x23\xb8\x24\x39\x83\x5b\x07\xf1\x8d\x3b\xb9\x9c\x05\x8e\xa7\x3d\xae\x0b\x3b\xa6\x51\xe0\x78\xd6\xe4\xf3\x5c\x5b\xd4\xb3\x79\xce\x9e\x1b\xbe\x30\xcb\x88\xe0\x86\x80\xc3\x55\xc1\x6a\x37\x6e\xa1\xc2\x66\x50\x11\x31\x0c\x3e\x00\x15\xec\xc9\x5f\xe5\xe5\x9e\xb6\x1a\x6f\x0c\xb0\x0f\x3f\x54\xbe\x06\xd8\xa1\xd8\xd3\x7a\x88\x90\x0e\xc9\x60\x41\xc3\xf9\x0f\x63\x7b\x7d\x3e\x9f\xcd\x27\xc3\x3a\x85\xeb\xf3\x65\xc1\x0a\xb8\xdc\xc0\x62\xd9\x76\x06\xd7\x03\x7b\x94\xa2\x60\x64\x79\x7d\x75\xdf\xa1\x9c\x4f\x16\x83\x68\xcf\x16\xe7\x1f\x0c\xfa\x6c\x71\x6e\x4d\x6e\xee\x67\x77\xf6\xfc\xbc\xad\xf8\x5c\x31\xe1\x77\x8b\x57\x57\xfd\x7c\x72\x39\x54\x37\xcc\x53\x32\xe7\x52\x49\x24\x68\xa1\x26\x97\xd7\xd6\x64\xe7\x5d\x07\x6d\x58\x41\xac\xc9\x7c\xd1\x62\x07\x9a\x61\x5e\xa6\x8c\xa2\xe5\xc2\x70\x6d\x0c\xb2\xec\x30\x03\xbf\xbc\x6c\xf2\x50\x93\x9a\xb6\x58\x3d\x70\xaf\x6e\x17\x44\x50\xc8\x2e\xe1\x86\xb2\xe7\xbd\xaf\xf6\xc8\x9d\xcc\xe7\xb3\x8b\xe5\xec\x6a\x7a\x71\xb3\xb8\x68\x38\xfb\x0d\x67\x09\x37\xa5\x80\x7f\x61\xa8\xa0\x23\x49\xa7\x94\x6e\xd5\x4d\x74\x3c\xab\x90\xac\xea\xbc\x34\x0b\x7f\xe7\x83\xaf\x2a\x57\x93\x19\x2a\xd7\x9a\xa4\x52\x3d\x33\x22\x87\x19\xa7\x06\x5b\xa6\x42\x6c\xdd\x11\x0e\xaf\xbf\xd6\xad\x0c\xed\x67\xf6\x5c\xac\x07\x11\x5f\x5f\xdd\x7f\x30\x34\x86\xc4\x9a\x64\x9b\x02\x0a\x49\x86\x09\xae\xc1\xd6\x84\x41\x8c\x69\xae\x89\x0a\xb8\x22\xd2\x41\xd2\xd9\x52\x89\x1c\x82\x4b\xf7\x3f\xab\x35\x97\xca\xc5\x1c\xb9\x93\xcb\xf9\xcc\x8d\x1d\x0f\xb8\x95\x0b\x54\xfd\x69\x01\xd1\x9a\xf4\x3a\x33\xf3\xa4\xef\x6e\x75\x3d\x56\x2e\xd7\x50\x18\x3f\x39\x8e\x06\x7b\xe8\x83\xee\xdc\xa2\x1a\x02\x7f\x98\x42\xfe\x4e\x21\xff\x44\x8b\x69\x51\xd6\x44\x28\x2a\x15\x45\xa6\xc7\x9f\x13\xc1\x34\x1d\x26\x8f\x4e\x41\x04\xdb\xeb\xd8\x6a\x68\xdd\xac\xbb\x84\x88\x25\x47\xe5\x75\xb0\x3d\xc2\xb7\x13\x75\x6c\xa1\x35\xcc\x78\x99\x63\xa8\x63\x2a\x43\xdc\xa8\xb8\xac\xb9\x2c\xfd\xe5\x4b\xda\x83\x63\x65\x83\xab\x9f\x18\xfb\x9c\x2d\xce\x6d\x60\x4f\x19\x2c\x2b\x57\x94\x8f\xf9\x96\xa4\x4e\x26\x08\x49\x25\x36\x0c\x52\x28\x89\xbb\x26\x10\xbb\x34\x47\xac\xc4\xc4\xa5\x19\xc4\x58\x48\x67\xfd\x49\x90\x47\x2a\x29\xcf\x3f\x06\x7e\x9c\xf8\x81\x61\xe7\xd7\xec\xec\x4b\x41\x48\x1d\x5b\xea\xf2\x74\x79\x22\x5e\x3c\x0b\xba\x5a\x2b\xb7\x7e\x6a\xf7\xfa\xd4\x1e\x9b\x1b\xa2\x3a\x5c\x72\xa2\x1a\x26\x30\xe5\xa5\x72\x05\xc1\x54\xb6\xa1\xa7\xa1\xff\x80\x49\x06\x4b\xa6\xfa\x7c\xe6\x50\x91\x5c\x1d\xb3\xd0\xd9\xe2\xbc\x60\xa5\xac\x80\x3d\xe2\x13\x54\x2d\xce\x10\x05\x8d\xc4\xc9\x2e\x24\x1e\x3a\xfe\x2c\xb7\x54\xad\x97\x1d\xc2\x3e\xc7\x29\x23\x50\x54\xc1\x7a\x2a\x9d\x0d\x51\x10\x41\xa1\x60\xb7\x43\xb4\xc9\x53\xc1\x60\x0e\x77\xd6\xa8\x5f\xf4\x39\xcd\xce\x6e\x86\x0d\x5a\x1a\xa8\xc7\xc3\x1e\xf5\x0d\xb7\x6f\x4a\xa4\x95\xb1\x67\x8d\x37\x79\x20\xd4\x0c\xff\x82\x8f\xd0\xe4\x10\x35\x4f\x69\x9e\x10\xa2\x4a\xc5\xf5\xb0\x51\x75\x5c\xee\x19\x11\x0f\x84\x91\xe7\xd9\x6b\xca\xbd\x64\x6f\x9a\x2d\xdf\xe6\x8c\x43\x5d\xf9\x10\xd5\xa3\x00\x57\xb9\x5d\x94\xa9\x91\xb1\xab\x12\xed\x21\xea\x49\x7d\x9a\x94\x6a\x3d\x87\x02\x6e\x3e\x82\x30\x1e\x81\xd0\x03\xe3\xd1\x32\x0c\x70\x04\x62\x44\xc0\x68\x14\xa7\xd8\x4b\x60\x94\xf8\x41\x04\x47\xa3\x24\x4a\x09\x40\xe8\xa0\x2a\xdf\xa0\x10\x30\x57\x26\x60\xfb\x8b\xaf\xe0\xa6\x30\xf6\x5a\x51\xe5\x7e\x2a\x3e\xae\x58\x49\x56\x24\x77\x56\x54\xfd\x06\x3f\xa6\x8c\xa7\xcb\x82\x41\x9a\xff\x96\x7d\xac\x7b\x30\x13\x35\xf5\x98\xdf\x16\x24\xb7\xaf\xe7\x57\xdd\x81\xce\xde\x14\xb4\x6e\x23\x9b\x4d\x99\x53\xf5\xdc\xc6\x1b\x7a\x6c\x3c\x4a\x9f\x13\xc5\x68\x5a\xb9\xa7\xee\x4a\x1f\xdc\x43\xa2\x4f\x39\x74\xd0\x75\xe8\xb0\x91\xf7\x75\x7a\xbc\x31\xbf\x68\xc4\x61\x47\x1c\xa6\x82\x20\xc5\xc5\xb3\x93\xc9\x6c\xdf\xd3\xc8\xaf\xda\xf9\xc3\x8e\xd0\xb9\xe0\x8a\xa0\x37\xb5\x9d\x1d\xc9\xb2\xeb\x56\x55\xf8\x63\x4f\x39\x36\x7a\xac\xa8\x5a\x97\xa9\xf1\x1e\xc1\xd3\x94\x92\x35\xcc\x25\xcf\xdd\x29\x47\x1c\x7e\xb9\xbf\x9f\xeb\x3c\x94\x08\x57\x57\xa1\xbb\x81\x52\x11\xb1\x67\xc6\x5e\x42\x90\x72\x2e\x2b\x8d\x6a\xd0\x12\x2c\xbd\x7d\xe0\x61\x53\x57\xb1\xdd\x19\x5c\x0f\x8d\x23\x2a\xa8\x75\x06\x85\x18\x88\x17\xc2\x3a\x23\x44\x6c\xa1\x18\x16\x6d\x34\xe0\x1e\x55\x41\xb8\x8e\xbc\xba\xf5\xfe\x9f\x62\xfd\xe0\x5a\x67\x54\xdd\x73\x21\x48\xae\x9a\xc2\x56\x05\x95\xce\x8a\xe4\x8a\x57\xa9\x12\x5a\x51\x3b\xa5\xb9\xfb\x48\xc9\xf6\x11\x39\x68\x45\xdd\xea\xad\xfd\x94\xc4\x1d\x73\xb4\xbc\x3e\x09\xf0\x11\x38\xe0\xbf\x85\xaf\xff\xd3\x7f\xfe\x1b\xd3\x2c\x5b\x66\x5c\x6c\xa0\xfa\x28\xfb\x62\xc1\x10\xff\x6a\x09\x6e\x17\x33\x1d\x7d\x9c\xb1\x92\xdc\xc2\x07\xad\x75\xa5\x77\xca\x4a\xc2\xe1\x03\xe2\x65\x8e\x68\x2f\x38\x70\x0d\xc6\x3a\xe3\x02\x91\xf2\x69\x98\x11\x2b\xac\x35\x9d\xdc\xdf\x2e\x5e\x9b\xc7\xe8\xf9\xc1\x0e\x65\x4d\xa7\xf6\xd9\xbf\x1b\x53\x22\x41\xa0\xa2\x8f\x44\xf7\x05\x3c\x97\x7d\xa2\xf4\x59\xeb\x55\x13\xf8\xc3\x08\xfc\x0e\x41\x34\x8c\x20\xaa\x09\x82\x61\x12\x82\x56\x42\x38\x8c\x20\x6c\x09\x6e\xa6\x03\xcb\x6d\xe7\xa8\x53\xf4\x9b\xe9\xc0\xd2\x6b\x32\xbf\x4f\x36\xc4\x06\x15\x59\xb4\x23\x1b\x66\x09\x4d\x16\x74\xa5\x0d\xb3\x87\x26\xeb\x99\xe4\xe6\x7c\xb0\x55\xf0\x0b\xc3\xdc\x9c\x0f\xb7\x8d\x9d\xe3\xbe\x79\x0c\xf1\x40\x0b\x55\xc4\x51\x8f\x78\xb0\x9d\x34\x71\xb0\x27\x79\xb0\xb5\x34\x71\xcf\x60\x8b\xc9\x70\x37\xb2\x25\xec\x1b\x6c\x31\x79\x83\xc1\x24\xec\x1b\xcc\x10\x0f\x35\x98\x21\x8e\x7a\xc4\xc3\x0d\x26\x61\xdf\x60\x8b\xc9\x1b\x0c\x26\x61\xd7\x60\x6f\x70\xaf\xae\xa9\x86\x3b\x56\xcf\xab\x86\xbb\x54\xcf\x9f\x86\x3b\x53\xcf\x93\x86\xbb\x51\xd7\x87\x86\x3b\x50\xcf\x7b\x86\xbb\x4e\xcf\x6f\x86\x3b\x4d\xcf\x63\x86\xbb\x4b\xcf\x57\x86\x3b\xca\xce\x4b\xe6\xe7\xe7\xd3\x93\x14\x85\x99\x68\xc0\x7c\x03\x69\xee\x5a\xd3\xa9\x77\xcc\x86\x3d\xf0\x0f\x22\x78\x65\xc6\xf3\xf3\x93\x11\x13\xc2\x98\x81\x06\x69\xc6\xd4\x15\x83\x52\x66\x54\xae\x9d\x5d\xea\x61\xd8\xbb\x1a\xf5\x3f\x9f\xe7\xb3\x25\x58\x82\x2a\x26\xed\xd2\x55\x69\x89\x53\x87\x83\x94\xef\x18\x35\x91\x9c\x35\x3d\x9f\x4d\xec\x39\x11\x1b\x2a\x25\x7d\x6c\xa7\x4e\x10\x66\x50\x13\x14\x9d\x37\xb6\x57\xa1\x17\x6b\x28\x68\xbe\xda\x87\xca\xe6\xb1\xc6\x5d\x4c\xaf\x66\xbd\x18\x12\x11\x44\x19\x73\x68\x9e\xf1\xaa\xa4\x88\xc8\x2a\x96\x40\x64\x39\x25\x1a\xbe\xfc\x17\xb0\x33\x51\x97\xa2\x61\x00\xde\xc6\xc0\x01\xf6\xd7\x45\x8f\x85\xff\x46\x1d\x7c\x9b\xe4\x7b\x0c\xde\xa6\x83\xef\x80\x7d\x16\x67\x6f\x60\x60\x9f\x69\x3b\xec\x31\x98\xbe\x85\xc1\xb4\xcf\xe0\xee\xc6\xbe\xfd\xd2\x9f\x09\x5d\x6f\xab\xa5\x8b\x3a\xb8\xdb\xb9\x9e\x8e\xf0\xa4\x8b\x88\xc8\x6d\xbe\x66\xf6\xa3\x89\xd6\x76\x1c\xfc\x9f\xe1\xe0\x5b\xd3\x9b\xbb\x2b\xfb\xf7\x67\xb5\xae\x12\x1d\xcd\xe0\x2f\xf3\xed\xe5\x54\xb3\x81\xce\xcd\x4b\xfb\xf3\x7c\x66\x4f\xf9\xa6\x80\x8a\xa6\x8c\xb4\x73\x46\x3b\xca\x26\x5b\x76\x05\x61\x04\x6a\xe9\xc0\x89\x1d\xd0\x3e\x5f\x6e\x4d\x3b\xdd\xb1\x3c\x1a\x9f\xee\x60\xd6\x74\x3e\x39\xd9\x4a\x1b\x8c\x35\x3d\x3d\xbf\x5d\x43\xac\xe9\xfc\xd6\x7c\x68\xed\x88\x38\x26\x4d\x84\xad\xb3\x35\x53\xaf\xa8\xe0\x0c\x78\x0e\x94\xc5\x93\x35\xfd\x3a\xb1\x6f\x07\x08\xd8\xc1\xac\x29\x64\x98\x08\xd8\x88\x60\x64\x43\xa5\x61\xbe\x12\x7c\xe5\x7e\xbd\xb9\xfa\xee\xc2\x1c\x51\x9d\x56\x54\xac\x6c\xc8\x98\x53\xe0\xcc\x9a\xb2\x66\xa2\xad\x4a\x22\x61\xce\x4a\x04\x1d\x4c\x18\x83\x8f\x04\xf3\x47\x68\xa4\xfa\x1e\x00\xae\x07\x5c\x2f\x70\x11\x83\x82\x66\x94\x60\x7b\x7f\xea\xcd\xdd\xe3\x66\x72\x77\x94\xa9\xc2\xa8\x62\x3e\x99\x69\xdc\x6e\xda\x39\xe5\x39\xe6\xa2\xf1\x54\x41\x24\x81\x02\xad\x7b\x13\xc0\xc8\x40\x7a\x3e\xf3\xa1\x7a\xb6\x47\xbd\x25\xe9\x2b\xcb\x81\x00\x00\xe0\x07\x5e\xec\x7b\x41\xdc\x2c\x07\xbe\x59\x8e\xe0\x52\x6e\xb9\xc0\x83\x92\xa4\x16\x6d\x4d\xc5\xb3\x54\x90\x2d\x14\x44\x0f\x64\x50\x62\xfb\x6b\x9f\xe4\x93\xc0\x1f\xbb\x8c\xbb\xef\xac\x69\x99\x0e\x4b\x7d\x35\xd0\x3a\xb7\x2f\xfb\x29\x3e\xa6\x45\xe1\xe4\x62\xeb\x60\xe2\x62\x3b\x93\xcc\x65\xf4\x07\xc9\x7f\x90\xdc\x1d\x02\xa6\x39\x26\x4f\x4b\x6d\xa5\x1d\x1d\x26\x6e\x4d\xb9\xf4\x96\x98\x98\x1a\xfe\x49\x56\x24\xef\xb0\x22\xf9\xeb\xac\xd6\xe9\x0f\xbb\xe6\x54\x08\x8e\xcb\x07\x55\x2d\xc5\xd8\x10\x21\x22\x65\x47\xb1\x4c\xb2\x7f\x48\xee\x62\x52\x2a\x89\xd6\xc4\xce\x04\xa1\xc4\x96\x3c\x53\x5b\x28\x88\x5d\xa1\xfe\x29\xf7\x15\x11\x1b\x98\x6b\xde\x3d\xd6\xd5\x7c\xcf\x3f\xe4\xbd\x5f\x27\x2e\x54\xcb\xb6\x23\xcd\x28\x7b\x47\x01\x55\x4d\xbd\x22\xe0\x76\x37\x9e\x49\x67\x5b\x4a\xc5\xaa\xd5\x1d\x89\xd6\x1b\x8a\x95\x3b\x99\x5e\xd8\x88\x17\xcf\x34\x5f\x55\xc3\xc2\xf9\xe2\x7c\x3e\xc8\xbb\x35\xd0\x3a\xe7\x4a\x92\xbf\x87\x4d\xaa\xd5\x58\xeb\x62\x7a\xb2\x93\xad\x21\x06\x7a\x62\x21\xa2\x86\x58\x17\x97\x3d\x43\x12\x9a\x65\x84\xd9\x39\xed\xe3\xdd\x8c\x8b\x72\x63\xbc\xba\x43\x70\x90\xf7\x65\xad\xc6\x65\x2f\xb8\x39\xc4\xbb\x7e\x6e\x44\x74\xd6\x45\x8c\x59\x3b\x2c\x8e\x49\x33\x25\xe9\xef\x11\x20\x88\xd1\x42\xd6\x58\xb2\x82\xcc\x25\x85\x1e\xed\xbd\x9a\xf1\xe9\x21\xab\x86\x18\xa8\x7f\x8a\xb1\xff\x12\x78\x8c\xaf\x81\x7f\x3d\x87\x0a\xae\x04\x35\xfd\x34\x29\x6d\x5c\x7f\x75\xf4\xd0\xa0\x03\x14\x07\xad\xbb\xcf\xfb\x81\x48\x9f\xfc\xa0\xb0\x16\x65\x5d\x7c\xdd\x95\x99\x20\x87\x94\x82\x17\xd0\x21\xa5\x4b\x31\x4c\x91\xee\xc2\x30\x47\xe5\x86\xe4\xca\x1d\x05\x41\x63\xa7\xe3\x44\x92\x88\x47\x46\x94\x74\xcf\x39\xf2\xfc\x51\xa6\x47\xe9\x4f\x14\x7f\x0c\x80\x37\x8e\x1b\xe2\x2a\xd2\xe7\x34\x2f\x0b\xa7\xc7\xa3\xe9\x39\xcc\x72\x84\x4b\xca\x82\x35\x21\xa3\xad\xbf\x9c\xa6\xa7\x8a\x48\xb7\x5e\x68\x32\x2d\x57\xba\xa8\x94\x8a\x6f\x6c\xc3\x11\x2a\x05\xd1\xda\x94\x48\xf3\x03\x0e\x70\xec\x56\x40\xbe\xf4\x4c\x4c\xd1\x15\x72\xd8\x8a\x15\xa6\x01\xfb\x87\x34\x6a\x0b\x62\x2b\xf2\xa4\x6c\x00\x6c\xe0\x9f\x24\x7a\x63\x31\x96\x3a\x64\xd5\x5d\x57\x47\xfb\x37\xf1\xa6\x39\xa3\x39\xb1\xab\x2f\x9a\xc1\x7f\xf9\xde\x23\x58\xfa\xff\xe5\x7b\x17\x37\xff\x0b\xfc\xef\xaa\x9d\x77\x18\x93\x52\xd8\x8c\x3c\x75\xd8\x1a\xc7\xb7\x11\xcf\x95\xd6\xea\xe2\xc6\xbd\xff\x7e\xef\x7e\xb9\xbf\x9e\xb9\x9f\x4a\x41\x3f\x4e\x2f\x66\x17\xdf\x7f\x0d\x7c\x0f\x8c\xce\xbd\x24\x0e\x7a\xdc\x4e\x1b\x39\x57\x44\x4a\x78\x14\x5b\x41\xac\x0b\xc1\xe6\xbd\xcc\x81\x08\x06\xf3\x95\x01\x5f\xcc\x9b\x14\xf2\xa2\x14\x5c\x3e\x6f\x06\x75\xb7\x35\xd6\xba\x5c\x5c\x4e\xe6\xbf\xec\x6d\xc0\x29\x04\x29\x5c\x9d\x2f\x2b\x9d\x33\xeb\x06\xb2\xcc\x39\x26\xcd\xfc\xb6\x7d\xc3\x15\x45\x44\xea\xbe\xcc\xbe\x55\x6b\x22\xec\x4b\x6d\xe4\xaa\x29\x5d\x2e\x2e\xbf\x0e\x5b\xee\xbb\x5c\x5c\x2e\xbf\xe6\x8c\x6e\xa8\x22\xb8\x5d\x46\x31\xf4\xb3\xbb\x9f\xe7\xf0\xa1\xd9\x7c\x72\x47\x74\xb5\x51\x9e\x2f\xff\x05\x05\x85\xb9\xb2\x2e\xef\x2b\xcd\x04\x21\xea\xb9\x20\x4e\x46\xa5\x53\xe6\x54\xf0\x0d\xf4\x1d\xaa\xdc\xcb\xfb\x99\x73\xff\xfd\xbe\xc1\xad\xa8\x72\x24\x7c\x84\x79\x0e\xd7\xad\x71\xd0\x8a\xaa\x96\x43\xfb\xc1\xd7\xc9\xbd\xab\x04\x21\xba\x7b\x91\x3b\x4e\x90\x56\x21\x26\xa4\xa2\xe9\xd7\x34\x97\xf6\xc5\xa1\xaa\xd7\xef\xad\x4b\x01\x37\x64\xcb\xc5\xd3\xa9\x4e\xbc\x07\xb4\x2e\x05\x21\x57\x1b\xb8\x22\x4d\x61\xa9\xfe\xe2\x54\x84\x19\x17\x2b\x62\xa6\x2e\xda\x37\xed\x8a\xb8\x6e\x11\x9f\x2f\xab\x79\x8b\xe3\xfb\xcb\x38\x6b\xd7\xd1\xa5\x9b\xe1\xdd\x6e\xc8\x1d\xf9\xa9\xdd\x63\x27\x59\xfc\x34\xa5\xff\x66\xdd\xfd\x3d\xf2\x9f\xd0\xbd\xcf\xe2\xa7\x29\x83\xe3\xba\x57\x14\xc1\x1e\xc5\x29\x75\x5f\xa3\x1a\x06\x9e\xf9\xf3\x45\x8b\x24\xe5\x8f\x6a\x19\x9a\xf9\x85\x74\xa7\xb7\xf3\x7f\x5f\xdd\x7c\x76\x0c\xc6\xaa\xf7\x2e\xfe\xcf\xb0\x82\xaf\x0a\x66\x76\xbb\x48\x05\x73\x0c\x19\xcf\xeb\xd1\xfe\xb5\xbd\x95\xff\x90\xd3\x9b\xaa\xf2\x04\xb7\x7f\xce\xc4\x7f\x93\x89\xfc\x13\x5c\x0e\x75\x07\x35\xa6\xc1\xbe\xd1\x9c\x47\xa4\x9e\xdc\x45\xfa\x42\xf2\x9b\xcd\x7f\x54\xfa\x80\xed\xa5\xfb\x1a\x6c\xa9\x5a\xdb\x9f\xa7\x53\x9b\x3c\x21\x52\x34\x8b\xfc\x2b\x84\x5a\x5d\x9a\x5d\x15\xfa\x51\xbb\xa3\xe2\xb7\x4c\x3f\x70\x19\x4d\x57\x08\x01\x07\xfd\xb6\xfe\x38\x8a\xfd\x2c\x02\x61\x90\xa1\x98\x10\x1c\x8d\xd2\x78\x34\x1e\xa1\xc4\x1f\x01\x2f\x0b\xa2\x20\x81\x30\xf2\xd3\xd0\x4b\x7f\x5b\xa7\x1f\x51\x0a\xc2\x00\x06\x88\x84\x59\x1a\x82\x11\x8a\x93\x2c\xca\xa0\x1f\x8f\x01\x04\x29\x48\x81\x17\x05\x38\x4b\xe1\xf8\x03\x03\x7b\xaa\xc2\x52\x71\xc4\xf3\xac\xaf\x2f\x44\x76\x33\x8b\xb2\xdf\x8d\x63\x8e\x76\xfb\x22\xfa\xf6\x32\x0c\x53\x2a\x79\xbe\x57\xfa\x83\x03\x9b\x01\x77\xc6\x32\xa8\xa0\xfb\x0c\x11\x72\x90\x8e\x77\xc1\x38\xc0\x23\x34\xf2\xa2\x30\x85\x23\x30\x1e\xa5\xde\x28\x19\x13\x10\x8e\xe3\x28\x1d\x05\x63\x10\xfb\x01\x18\xa7\x11\xf9\x90\x83\x10\xf4\xb5\x40\x0c\x4a\x59\x40\xb5\xee\x6b\xd2\xf5\x89\x36\x4e\x6e\xb1\xfd\x54\xa0\xc7\x2f\xe3\xb9\x3a\xcc\xaa\xe7\x51\x19\xfc\xbb\x9a\x38\xba\xe4\xb9\xba\x68\x48\x1a\x76\xef\xe2\x99\x43\x1d\x32\x38\xd6\xfc\xb5\x8c\xe0\x80\x8c\x60\x40\x8b\x0f\x76\x42\x8e\xb7\xf8\x13\x82\x06\x35\xf2\x9e\xb0\x53\x8d\xfc\xa4\xc0\x81\xed\xba\x2b\xf4\xf5\x76\xfd\xba\x78\x84\x76\x28\x3b\x70\x40\x5f\xfa\x91\x66\xf7\xfa\xb6\xf4\x17\x50\xbb\x3e\x47\xd0\xf2\xfc\x59\x4b\x0c\x32\x00\xad\x9a\x89\xc6\x32\x9a\x42\xc6\xc8\xea\xc5\x04\xfe\x07\xf3\x58\x70\x3b\xb4\xd5\x9a\xd8\x2b\xba\x37\x79\xf5\x99\x51\xdc\x4e\xe5\x97\x92\x08\xe9\xf0\xdc\x74\x27\xff\x51\x82\x66\x5c\x20\xe2\xae\x34\xe6\xa9\x68\x07\x7a\x13\x10\xb0\x92\x3d\x0d\x9b\xe0\xac\xa0\xd6\x97\xf9\xcd\xb9\x2d\x09\x63\xf6\x63\x15\x85\x37\x1d\xd0\x03\x11\x39\x61\xcd\x1a\x9d\x2b\xd1\xc6\x35\x67\x3a\xdc\xea\x85\xe9\x96\x15\x17\x8f\x90\x61\x59\xbd\xd9\xf5\x4b\x5a\x51\x59\xe6\xa2\x40\xba\x36\xd6\xcb\x95\x94\xee\x4a\xca\xe5\x8a\xe4\x44\x50\xb4\x54\xfc\x81\xe4\x0e\xfa\xb4\xfe\xf8\x18\x3a\x60\x6c\x94\x38\x66\x5b\xfd\xde\xfa\x02\xe5\x03\x61\xec\x8e\x14\x5c\xa8\x41\x45\xac\x29\x96\x33\x98\xaf\x4a\xb8\xd2\x29\x87\xa6\x6d\x73\x99\xab\xb3\x6b\xbb\xa0\xa9\x6c\x8a\x8c\x49\xfe\xe4\x60\xa2\x47\x9b\xd2\x4e\x39\x57\xfd\x01\x47\xf7\xf0\x6e\xc1\xb7\x44\x97\x0b\x15\xa5\x5b\x14\x28\x7c\x7a\x72\x37\x94\x16\xeb\x67\x33\x06\xf9\xe3\x11\x88\xa2\x0c\xc3\x0c\x7a\x71\x98\x8e\xa3\x88\x44\x01\x19\x27\x81\x8f\xc9\x38\x48\xb3\xd4\x43\x59\x9a\x44\x66\x0c\x1a\x67\x30\x0d\xd3\x2c\x44\xc8\x1b\x8d\x90\x0f\x48\x18\x8c\x43\x90\xc4\x71\x16\x64\x3e\x02\xe3\x38\xf3\x93\x78\xe4\x61\xeb\x6a\xfa\xf5\x97\x76\x33\x95\x43\x51\x69\x77\xcb\x2c\x48\xc1\xa5\x4b\x51\x69\xfe\x2a\x51\xe6\x0f\xfd\x7e\xf9\xea\xf7\xcf\xbf\xd4\x5b\x9d\xb7\x41\x35\x94\x3c\xca\x2d\x49\xdd\xc9\x06\x3e\x43\xed\xa3\x7f\x15\x64\xe5\x4e\x94\xa2\xc8\xbd\xbb\x98\x9c\x5f\x5f\x7c\x12\xe4\xf1\x23\x70\x7c\xeb\xaa\x3a\xa8\x71\xa8\x5e\xae\xe6\x13\xeb\xea\xf4\x1c\x56\x0d\xb1\xae\x16\xed\x84\x26\x95\xa8\xb7\x36\x25\xdb\xe1\xc5\x96\x65\xa1\x6b\xc9\x2e\x38\xa3\xe8\xd9\xa5\xb2\xb3\x58\x52\x73\x38\x28\x68\x31\xb5\x4c\x66\x75\x0d\x57\x14\x3d\xb4\xc2\xf4\xa3\x8d\x79\x54\x8d\x64\xe6\xd0\x45\x6f\x33\xe5\xd5\x86\xd1\xd4\xa4\x05\x4a\x40\xe4\x90\x9c\xe9\xe1\x9a\xe4\x1b\x92\x57\x66\x26\x6e\x2a\xf8\x56\x12\x51\x9b\x98\x1a\x82\xa6\xf1\x75\xe8\xb5\x23\xbd\x24\x67\x64\x05\x75\x61\x0c\x6c\xd7\x50\x5a\xf2\x3c\xe3\xf6\x9f\x57\x6d\xaa\x4f\xf5\xf7\x1f\xb4\x78\xb9\xf2\x77\x95\x2b\xc2\xec\xc9\xb4\xda\xea\x79\xb2\x09\x18\xf8\x52\xc3\x97\x8b\xda\xc0\xed\xe9\x8f\xc9\x4a\x10\xa2\x35\xac\x98\x1e\x35\xac\x06\x18\x98\x48\xa1\xdc\x9d\x1c\x78\x75\xf5\xc8\x8b\xbd\x00\x8c\x3d\x10\x26\xbb\xc3\x74\xba\x40\x4e\xca\x05\x83\x39\x36\x4b\x5b\x98\x3c\xd6\x15\xed\xd2\x86\x6d\xf7\x48\xc8\xd5\x7c\x56\x15\xf8\xf7\xf9\xcd\xd5\xb4\x36\x2c\x83\x69\xeb\x39\xda\x2f\xda\x8d\xc5\x29\xcd\xf1\xb8\xb7\x4f\x53\x5b\xf6\xee\xea\xf3\x97\xfb\x0f\xb3\x20\x8e\xad\xdf\x17\xb7\x37\xed\xa2\xaa\x7c\x6d\x49\xf5\x77\x28\xe7\x44\xf4\xe7\x58\x89\x53\x3e\x52\xe4\x20\xe8\xfe\x67\x83\x21\x86\x1b\xe9\xfe\x05\x65\xb1\xdb\x06\x6a\xcd\x26\x6d\x3e\x09\x85\x62\x34\x15\x1d\xcb\x21\xe2\x32\xb8\x9b\x4d\x84\x42\xd9\x06\x61\x03\xdf\xad\x29\x83\x17\x94\xd6\xec\x6d\x89\x08\x3b\x14\xfb\xcc\xde\x9e\x5e\x0c\xe0\xf5\xa6\x84\xe1\x24\xbf\xf7\x61\x03\xde\x66\x2a\x70\x9c\xcf\xa1\x36\xd0\x80\x5a\xf4\xdb\x0d\x7b\x58\xf2\xc9\xa0\xee\x15\xe9\x3f\x53\x15\xc7\x34\x18\x10\xe5\xbd\xd0\xe2\x9d\x84\x0f\x97\x79\x34\x44\x67\x87\xe2\xb7\xd9\x90\x20\xbd\x01\xb5\xe8\xe3\x15\x7c\x52\xd8\xb0\x3a\xed\x0b\x3c\x55\xa7\x03\x84\x0e\xad\xc6\xae\xe0\x9f\x97\x37\x58\x4c\x35\x67\xbc\xdd\x6e\x6d\xba\xda\x38\x65\x4e\x1f\xed\x0d\x7b\x74\x32\xe1\xfe\xa7\xcc\xa9\x22\x4f\x46\x16\xab\x37\x36\xcd\x4e\x47\x15\x35\xa4\x81\x9a\x3e\xb8\x60\x30\x1f\x3b\xa9\x0e\x67\xcd\xb9\x18\x3d\xd2\x98\x67\xfd\xbe\xbe\x4b\x72\x82\xbd\x6f\xcd\xe6\xfd\xd9\x25\x6d\xdd\xa7\x5e\x08\xc6\x8a\x82\x99\x7f\x6c\x60\x57\x1b\xfe\x6b\x1a\x30\x8c\x06\x74\x69\xfc\x61\x34\x7e\x97\x26\x80\xc3\x88\x02\xd8\xa3\x42\x03\xa9\xd0\x4b\xaa\xc3\x56\xab\x41\xd6\x4c\xf3\xf4\x87\xe5\x22\x35\xd6\x9a\x91\x42\xf1\x9c\x22\x38\x8c\xaa\x41\x5b\x33\x3a\xa3\x7f\xd8\xf3\xc6\xe2\xd5\xe4\xcb\x8a\x97\x8f\xce\xdf\x66\xf4\x6e\x46\xe3\x4c\xb8\x8c\x32\xfa\xb7\xfd\x08\x6c\xe0\xee\x93\x1d\x2c\xd3\x0e\x56\x93\xdc\x75\xeb\xf6\x85\xb4\x02\x0a\x45\x11\x2d\xc8\x8f\x76\xe8\x67\x7c\x45\x11\x25\x8c\x91\xdd\x23\x13\x09\xe0\xd2\xfe\xbb\x24\x29\xd1\x31\xae\x56\x8c\xe4\x76\x26\x60\x8e\x20\x95\x07\x91\x82\x20\x5a\x08\x8e\xa8\x22\x35\x95\xe8\x15\xe8\x6e\x58\x81\xee\xba\x05\x2a\x58\x29\xff\xbf\x29\x54\xc6\xc5\xa1\xa2\x75\xf5\x3c\x51\xbc\x06\x6a\xcd\x68\x5a\xe4\xab\xd6\xd7\xcd\xb7\x36\xaf\x2d\xf2\x95\x2b\x85\x99\x49\x2c\xf2\x95\xdd\xdd\x67\x35\x33\x57\x18\xdc\x16\x24\xbf\x3a\x7b\x8f\xac\x18\x0b\xfa\x48\x84\xd4\xb1\x30\xcd\x69\x0a\x73\xec\x22\x2e\x88\x2b\xa1\xb3\xb6\xae\xaf\xee\x6d\xef\x97\xfe\xa1\x24\xb8\x95\xee\x86\x2a\xdb\xdb\xbd\x15\x7c\x03\x73\xb1\x31\x53\x01\xfa\xd5\x0f\x22\xf8\x21\x5a\xb3\xd2\x05\xb7\xd2\x46\x8c\x97\x78\x6c\x97\x92\x08\x7b\x55\x52\x4c\x5e\x3b\xd1\x64\x2f\x26\xd7\xf3\xd9\xc5\xf4\xf6\xfc\xc2\x30\x9c\x5e\x7f\x1d\xd2\x0a\x7f\xbd\xbe\xba\xef\xef\xb8\xba\xbe\xba\xff\x30\xbd\xfe\xba\x5c\xa8\x67\x46\xba\xac\x3a\xda\x55\xbb\x13\xed\x82\x32\xc6\xb7\xee\xbc\xfa\xcf\x28\x95\x65\x59\x1a\xfa\xb1\x37\xf6\x51\x82\x53\x3f\x84\x51\x16\xa6\x31\xce\xfc\x30\x80\x09\x0c\x90\x07\xb2\x34\x0e\x10\x6e\x23\x70\x2d\x00\xe2\x47\x22\x14\xd5\xe2\x07\xf5\x1c\xd7\x57\xf7\xcb\x6f\xe6\x78\xe5\x8e\xd0\x30\x22\x79\x3e\xac\xef\xd1\x85\xd4\x60\x43\x95\x91\xe1\x07\xbf\x33\x62\xea\xfa\x98\xff\x5e\x5f\xdd\x6b\xc8\xcd\xe5\xb0\x4b\x12\x2a\xa8\x75\xdd\x1f\xa5\x36\xfc\x07\x65\xac\xda\x89\x78\x3d\x9f\xb9\xf5\xeb\x6a\xfc\xbb\x3e\x3d\xba\xd6\x90\x1a\x0a\x8e\xb3\x05\x5d\xb6\x47\xdb\x66\x0d\x31\x50\x1d\xd1\xe7\xdc\xec\x60\x62\x24\x7b\x65\xba\x78\x5f\x98\xef\x78\xee\x69\xca\x63\xa2\xfd\xba\x44\xfe\x61\x43\x75\x85\x0c\x62\xb7\xb0\xe7\xb3\x96\x19\x45\x82\x4b\x9e\x55\xdb\x54\x3b\xe9\x6c\x43\xe6\x6c\x64\xf1\xb4\xa3\x39\xc8\x5c\x03\x34\xec\xee\x27\x58\xdf\x9d\x62\x7d\x37\xb3\xae\xef\x67\xc3\x76\x01\x5c\x43\x25\xe8\xd3\xf2\x9e\x6c\x0a\x1d\x25\x2c\x67\x34\x15\x50\x3c\xb7\x73\x68\xd7\xf0\x81\x5c\xe5\x98\x0c\x3b\x0b\xd7\xa2\xad\x6b\x2a\x6e\x17\x47\xf5\xd4\x00\xeb\x9a\x2b\x2e\xb9\xe2\x47\x91\x35\xc6\xba\x2e\x19\xcc\x3b\x77\x63\x34\x31\x1f\xe2\x12\x99\x3e\xdb\x41\xb9\xdb\x80\xdc\x17\xf0\x4e\xff\xf4\x5c\x6e\x49\xce\x78\xbe\x72\xf5\x3f\xc5\xba\xa8\x3a\x27\x3f\xc2\x59\x3a\xf2\x10\xf2\x61\x18\xc7\x18\x85\x69\x1a\x45\x29\x0c\xbc\xb1\x07\x50\x8a\x88\x97\x60\x10\x87\x69\xb4\xeb\x9c\x4a\xa6\x28\x92\x47\xb5\xaf\x20\xd6\x75\x59\x0c\x33\x61\x59\x58\x37\x13\x73\x30\xc5\x4c\x1e\x28\xea\x40\x81\x9c\x1c\x4a\xe8\xac\xf8\x63\xd7\x33\x72\x2e\xa1\xdb\x03\x1f\x52\xa2\xc1\x58\x37\x67\xfd\x6e\x44\x13\x30\x0c\xab\x89\x28\x4c\x1e\xab\x21\xce\x6c\x0d\x5b\xd1\x4f\xc5\xc7\xf6\x7d\x6f\xa6\xb4\x2e\xfe\x6f\xeb\xf4\x63\x30\x4a\xc3\x34\xc8\x62\x84\xc2\x34\x0b\x42\x02\x70\x80\x09\x8a\x01\x89\xc7\x63\x10\xa6\xe3\x04\x8c\x71\x92\x8c\x43\xeb\x66\xba\xa8\xe6\x1a\xd5\xc6\xa1\x8c\xd1\x9c\x53\x69\xb6\x3b\x96\xb4\x44\x4b\x2d\xa7\x3a\xbd\xbb\x03\x1e\x2a\xcb\x74\x31\xb1\x6e\x3e\x1f\x6f\x60\xfa\xbd\x75\x33\xbb\x6d\x8f\x3c\x99\x5b\x49\xf2\x6a\xd5\x8e\xbb\x39\xe3\xd8\x25\xb9\x39\x8b\x72\x33\x9b\x0f\x6b\x2a\x1a\x68\xdd\xdc\x56\x17\x5e\xa5\x54\x49\x3d\x4a\xd3\x1f\x24\xd7\x2e\xe5\xc0\xb2\x23\xfd\x76\x31\xd3\xb5\x53\x5d\x9f\x73\x73\xbc\xe7\xbe\x99\xcf\xb4\x1e\x6e\x8d\x3b\xd8\x15\x57\x38\xa0\x71\xb7\x8b\x93\xb9\x99\x56\x41\xa7\x66\x37\x75\x0f\x43\x52\x67\x43\x95\x31\x78\x4e\xd4\x96\x8b\x07\x97\x4a\xf8\xb0\x29\xdc\x5c\xb0\x5e\xf2\x74\x73\x3f\x7f\x11\x6d\xa8\x67\x25\xb9\x4b\xfc\x4c\x16\x82\xaf\x64\x2f\xbe\x60\x34\x75\x89\x72\x89\x5a\xe6\x70\x43\x1c\xa4\x19\x1c\xd5\xec\x7e\x6e\xdd\xc0\x72\x43\x8e\xf6\xe6\x15\xc2\xba\x21\xca\x5e\xdc\x5c\x1b\x86\x39\x51\xb6\xcc\x37\xc5\x8b\x25\xd8\xea\x7a\x88\x7e\x21\x88\x9a\x9e\x5f\xb6\x2b\x2c\x39\x35\xf5\x5f\x22\x28\x8c\x09\xda\xb5\xce\x9c\x28\x84\xb3\xfd\x05\xdc\x1b\xb2\x95\x8c\xa8\x61\xc7\xae\x1b\xb0\x75\xc3\x1f\xe8\xd1\xfd\x64\xb9\x06\x58\x37\x7c\x4b\xd2\x61\x9c\x35\xd2\xba\xd1\xe9\xf3\x30\xbc\x46\x5a\xb7\xd3\xe9\x7d\x67\xc8\xd2\xca\x20\x28\x11\xc4\xd5\x3d\x0a\xcd\x76\x3a\x8e\x90\xb2\xab\xe3\x53\xed\xb2\xd4\xed\x74\x36\xed\x6d\x2e\x45\x0c\xd5\x8b\x10\xd5\xe1\x00\x17\x22\x45\x1f\xa9\xa2\x64\x37\xa1\xdf\x6e\xb1\x7d\xf4\x33\x9a\x43\x73\x4f\x56\x8f\xd3\x21\x73\x34\x18\xeb\xf6\x7c\x6a\x9f\x3d\x77\x23\x16\x5d\x5b\x47\x4e\x42\xbb\xd6\xed\x79\xfa\xa2\x1f\x3b\x48\xc4\x71\xca\x6a\xb2\x6a\xd3\xb0\x7d\x77\x69\x66\x8b\xab\x85\x02\xe9\xc8\xfa\x10\x38\xda\xc8\xe6\x99\xd9\x64\xe9\x14\xeb\xe2\x13\x55\x64\xb3\xa4\xf8\xe3\xed\xe5\x0c\x78\x4b\x5d\x23\x0d\x97\x9c\xbf\x0f\xa3\x7f\xcc\x01\xfc\xac\x1e\xaf\xf1\x38\x58\x5d\x15\xac\x85\xff\x7c\xe9\x7b\x52\x77\x6c\x06\x0a\xfe\xa7\x12\x07\x89\xfa\x3c\xb3\xa7\x30\x87\x18\x76\x9d\xd8\x41\xe6\x91\x4e\x97\x49\x5e\x6d\xfd\x5f\xf1\x47\x22\xcc\x32\x50\xbb\xe7\xb7\x02\x19\x16\x5f\xff\x4f\xd7\x47\xab\x9b\x5a\x20\xab\x57\x54\xa4\x1e\xce\x9d\xf2\xc1\xec\x20\x39\xc0\xcc\xd5\x09\x25\xe5\xb9\x0b\xdc\x86\xa1\xff\x3e\x0c\xfd\x96\x61\xf0\x3e\x0c\x03\xcd\xf0\x7e\xd1\xeb\x77\x56\x82\x97\x55\x68\xa1\x88\x54\xba\x8b\xda\xad\x07\xde\xaf\xc9\x52\xe7\xde\xcb\xcf\x1a\xb4\xbc\x5f\xcc\xcc\x60\xd9\xf2\x38\x58\x45\x1a\x60\xdd\xce\xce\x27\xf3\xfd\x6b\xcd\xfe\x51\x20\x93\x78\x71\x14\x8d\x60\x04\x71\x34\x4e\xbc\x90\x64\x01\x0c\x43\x1c\xc1\x34\x4b\xc9\x18\xe0\x91\x17\xa7\xde\x68\x0c\xb2\x56\xb4\xff\x6e\xa2\x43\x3f\xf5\x82\x24\x40\x91\x87\xfc\xf1\x78\x3c\x1a\xa5\x51\x32\x0e\x08\x89\xc7\x11\xca\x42\x12\x26\x71\x96\x7a\x18\x8d\x5a\xd1\xc1\xbb\x89\x26\x51\x96\x00\x30\xca\x3c\x1d\xdc\x26\xd8\x4b\xf1\x08\x26\x04\x24\x18\x67\xc1\x88\x40\x18\x7a\x24\xf5\xc6\x29\x68\x45\x87\xef\x26\x1a\x8d\xb3\x71\x84\xfc\x2c\xc8\xfc\x2c\x4b\x23\xe2\x41\x12\x45\x19\x19\x05\x49\x02\xb3\x51\x14\x85\xa3\x38\xf6\xc6\x61\x23\xda\x77\xbc\x77\xac\xed\x34\xc6\x71\x02\x11\x06\x21\x89\x00\x82\x01\x84\x69\x18\xfa\x49\x9a\xf9\x71\xe4\xfb\x10\x8e\xc2\x64\x14\x64\x1e\xd9\x09\x7f\xbf\x72\xa7\x59\xe4\x65\x21\x01\x20\x89\xa0\x0f\x60\x8a\x43\xe4\xc1\x28\xc4\x41\x16\x06\x21\xc8\x88\x9f\x64\x41\x4c\x60\x2b\xfa\x1d\x4b\xed\x61\x30\x8a\x47\x41\x42\xc6\x31\xf4\x70\x90\x8e\xb3\x24\x42\x69\x04\x08\x08\x3d\x98\xc4\x99\x0f\x52\x32\x02\x51\x2b\xfa\x3d\x85\x87\x29\x1a\x25\x71\x16\x84\x69\xe4\x41\x18\x78\x20\x25\x71\x16\xc5\x9e\x97\x45\x09\x1c\x27\x9e\x37\xf2\xb2\x30\x01\xa4\x23\xfc\xfd\x9a\x18\xce\x7c\x84\x00\xf1\x01\x49\x47\x08\xc4\x5e\x3c\x8e\xb2\x28\x1d\xa1\x2c\xc3\xb1\x3f\x8e\x11\x88\x40\x0a\x41\x92\xec\x84\xbf\x5f\xb9\x47\x5e\xea\x21\x90\x10\x14\x8f\x62\x1f\xa0\x24\x4a\x12\x90\xfa\xa3\x20\xf0\xa2\x51\x46\x50\x16\x42\x00\x11\x0a\x5a\xd1\xef\xd7\xba\x71\xe0\xa3\x2c\x0a\x61\xe0\xe3\x28\x01\x30\x0d\x47\x11\xf6\x03\x94\x00\x2f\xf5\xe0\x28\x4b\x61\x96\xe0\x38\xe8\x88\x7e\xc7\xd6\x8d\x81\x9f\x84\x28\x84\x63\x00\x13\x18\x24\x1e\x1e\x7b\x21\x21\x24\x4e\x30\x88\x92\x20\x1b\x27\x63\x82\x83\x24\x6e\x45\x47\xef\x26\x3a\x4e\x22\x3f\x1d\xe3\xb1\xe7\xf9\x3e\x49\xa2\x71\x80\xc6\x89\xef\x45\x21\x08\x82\xc4\x8b\x82\x38\x05\x69\x04\x47\x28\x6b\x45\xc7\xef\x26\x1a\x20\x48\xbc\xd8\x4f\x7c\x90\x24\x20\x0b\x41\x3a\x0a\x3c\xe0\xa7\x30\x01\x71\x18\x84\xc9\x78\x04\xd3\x2c\xf4\xbd\x5d\x03\x1b\xbd\xa3\x9b\x21\x3f\x04\x11\x02\x38\x4b\x40\x14\xc5\x84\xa4\xc1\x38\x25\x31\x82\x38\x8c\x12\x92\x25\x23\x14\x05\x21\xf4\x5b\xd1\xc9\xab\xa2\xdb\xa8\xbe\x3e\x4c\xde\x4f\xab\x6e\x07\xde\x7f\x6a\x06\xf6\x6b\x28\x1e\xc8\x6e\x37\x56\xf7\xfc\x36\xc3\xce\x03\x87\x0c\x2a\x02\x37\x26\x2b\xf9\x0b\xa2\x07\x28\x38\x77\x6f\xcd\x25\x0e\x9e\x39\xbd\xd1\xa1\x18\x26\xb1\xbe\x05\xb5\x95\xb8\xb8\xd0\x99\x50\xaf\x0b\x95\x44\xed\x5d\xb5\xb8\x9f\x03\xf5\x89\x0e\x86\x21\xf5\xa2\xf5\xed\xe9\xab\xbf\x6a\x88\xd5\xb9\x1d\xea\x74\x71\xaa\x9b\xab\x6e\x3b\xd7\xa3\xbe\xbe\x17\x27\x04\x9e\xef\x81\x11\x08\x83\xde\xc5\xd6\xbd\x9b\x96\xb9\x64\x7e\x33\x35\x5c\x71\x3c\x72\x36\xdc\x8b\xcc\x75\xd4\x5e\x30\x0e\xbd\xa3\x1c\x41\x95\xe8\x2d\x4e\x9b\x6a\xb1\x33\x55\x70\xac\x30\xc0\xf7\x80\x07\xbc\x04\x84\x20\x69\x8f\xa5\x77\xc4\xfe\x9a\x78\x6e\x35\xad\xd1\x8a\x3e\x31\x0b\x52\x43\x2c\xed\x1d\x8b\x7e\x6c\x2a\x25\xab\x1d\xbe\x3b\xcb\x5a\x19\x69\xbe\x77\x3d\xc9\xc1\xcc\xb2\xc0\xb8\xce\x2c\xe7\x5f\xe6\xdd\x48\xba\x58\x17\x66\x6a\xa2\xc9\x8d\x83\xfa\xa6\xb8\x0e\xec\x90\xce\x35\xa4\x81\x82\x23\x2c\xab\x85\xe5\xf9\xe2\xf2\x54\xaa\x5d\x5f\x25\xa1\x93\xed\x39\x14\x54\x3d\xdb\x71\x73\x17\x5a\x61\xbe\xef\xa6\x52\x37\x4d\x44\x2f\x5d\x83\xa9\x2d\xc2\xc8\x53\x39\xec\xce\xdd\x0a\xba\x9c\x32\x68\x4e\xfc\x33\x2c\xdb\x06\x39\xe7\x52\xad\x04\x59\xfc\xd1\xd6\x44\x51\x3d\x91\x7f\x57\x95\xd1\x99\xc9\x41\xfb\xf0\x83\x65\x6b\x51\xd6\xae\x98\x03\x8d\xf1\xc7\xae\x87\xc1\x1c\x39\x7f\x2b\xc7\xcc\xd1\x18\x33\x04\x4e\xd0\xf7\x8a\x3f\x4e\xaf\xaa\xd4\x10\xeb\x8f\x75\xc9\xd8\x20\x6b\x19\xa4\x75\xf7\x85\x4c\x79\xbb\xf0\x49\x10\x97\xf5\x24\x97\xee\x8a\x0d\x59\x67\xbf\x4d\xa5\xcd\xdd\xe9\xc5\x98\x1a\x52\x43\xa3\xd3\xd0\xc8\xba\xeb\xcc\x97\xaf\x09\xa3\x4f\xed\xdd\x94\x55\x9e\x5d\x4f\x1e\x89\x42\xb2\x1e\xf6\x30\xdf\xba\xf3\xbb\x5b\x4c\xec\xeb\xdd\x0d\xb1\xf0\xef\xaa\x25\x89\x0c\x49\xfd\x0f\x08\xfc\x7a\x91\xe9\x6e\x31\xad\x27\xaf\x8e\xdd\x66\x3f\x02\x11\x08\xbd\xc4\x8f\x7b\x5d\x14\xed\xa8\x70\x37\x9f\xd5\xa5\xf2\x26\x8e\xec\xb3\x3e\xa8\xad\x06\x58\x77\x98\x4a\x34\xa8\xf2\x0c\xb2\xf5\xee\xbb\x32\x6d\x77\x13\x89\x32\x7d\xb6\xdb\x43\xa2\x24\xef\x5d\xf0\xb1\x98\x7c\xef\x5c\x37\x2e\xe1\x53\x57\x44\xef\xc0\xff\x62\x7a\x61\xe6\xc2\xdb\xcb\x39\x24\x22\x95\x77\xea\x0f\x4b\xb9\x86\x82\xe0\x65\x55\x94\x65\xcf\x3d\x16\x9f\xaf\xec\xb3\xb6\x76\xa4\x74\xe4\x8a\x56\x4b\xb3\xcd\x9e\x4a\x73\x69\xaf\xbb\xf8\x7c\xa5\x3f\x2c\xbe\xcd\x28\x3a\x73\xda\x15\xc4\x86\x1c\x9c\x20\xaf\x81\xfe\x1b\xe5\xe8\xe1\xa8\xc0\x99\xb5\xf8\x32\xb3\xbd\xca\x33\x25\x67\x98\x88\x02\xe2\x7e\x95\xd4\x08\xb7\x81\x82\xd3\x58\xe0\x5a\x8b\xab\xc5\xee\x6e\xf2\x95\xa0\x58\xa2\x35\xc1\x25\x23\xe2\xc5\xe4\xf1\x67\x41\x31\xc9\x57\x34\x27\x4b\x43\xb5\x67\xc6\xab\xbd\x61\x83\x67\x19\xdd\x77\x1b\x49\xa5\x64\x07\xe8\x0e\xb9\x9a\x01\x58\x8b\xeb\xd9\xcd\xef\xad\x23\x6c\x58\xfe\x57\x17\x55\xb3\xba\x9e\xcf\x67\x7b\xf3\xf1\x18\xa5\x0c\x3e\x10\x77\x71\x3d\xef\xcd\xc5\x9f\xd7\x67\xeb\x4d\x74\xd3\x1c\x18\xae\x7c\xee\xe6\x6a\xd8\x72\xb3\x06\xee\x07\x52\x8b\xd3\x3d\x5f\x0d\xb1\x16\x8b\x2f\x76\x35\xda\x7e\xd9\xd3\xb9\x1a\x74\xd7\xcd\xff\x76\xc1\x85\x82\x29\xab\x37\x2b\x80\x14\x00\x02\x47\x28\x4a\x10\x8e\x50\x34\x4e\x82\x24\x8d\x32\x18\x8d\x42\x84\xc3\x28\xc6\xb1\x17\x8e\x52\x1f\x87\x55\x43\x9a\x5e\x7c\x98\x81\x4a\x98\x5c\xd7\xc7\x05\xde\x5f\x54\x01\xd5\x3a\x87\x1b\x22\x9d\x75\x5f\x54\x77\x35\xe5\x81\xb3\x67\xe8\x3a\x99\x2b\x38\x57\x2e\x54\x6b\x92\xc3\xf6\xa5\xa4\xc5\x0e\xd9\x5c\x12\xd5\x68\x77\xcb\xb0\x39\xb8\x6d\xf6\xa7\x34\xaa\xfa\xce\xd8\x19\x17\xbe\xab\x3f\x43\x8c\x1d\xd0\x97\xfc\xea\xe9\xfb\xc7\xdc\x65\x44\x72\xc6\x9a\xbd\xeb\x0a\x32\xb3\xe3\xc5\x70\xc6\x12\x2e\x1f\xc8\xb3\x83\x8a\xc2\x5a\x2c\xf6\xd7\xa2\xf2\x15\xc7\x69\xe7\x56\x69\xed\x02\xd2\x5c\x8b\x6b\x4b\x8a\xc9\xfe\x0a\xc1\xe2\xdb\xb0\x04\x60\xf1\x6d\x66\x2d\xe0\x93\xb6\xe0\x30\x7c\x85\xdd\x79\x1c\xc9\xf1\x06\x52\x66\x27\x8e\xdf\xe6\xc3\x85\xe0\x3c\x2b\x38\xcd\xab\x35\xf2\xd7\x6e\x1d\x90\x0d\x5d\xbb\xf9\x5f\xf7\x32\x2f\x98\xbd\x1e\x7e\x26\xc0\xf3\x02\x1d\x81\xd6\x91\xaf\x7c\x27\xb9\x6d\x03\xaf\xbf\x57\xfd\x23\xce\xa4\xa9\xf5\xba\xfb\x6e\x59\x2c\x0f\xb2\x78\x5d\xeb\xd8\x0b\x7c\x1f\x84\x7e\xe0\x45\x3d\xad\x7f\x46\x1a\xdd\x9c\xde\x18\xd1\x82\xac\x05\x23\xa4\x78\x46\xf0\xe8\x55\xeb\x2d\xc8\x5a\x14\x3a\xaa\x13\x76\x32\xec\x37\x18\xbe\x90\x5c\x3c\x2f\x6b\xa2\xe5\x1d\x59\xd9\x17\x4f\x2f\xb6\x27\x34\x3c\xc7\xe1\xff\x03\x9e\xe3\x5f\x5e\x5e\xb2\xf2\xe2\x37\x33\x14\x62\xfa\xaf\x1d\x99\x4f\xf5\x09\x28\x57\x90\x55\x26\x78\xae\xa4\x83\xac\x85\xd9\x5a\x2b\xf0\xf5\xcc\x7e\xad\xb3\xdf\xeb\xed\xcb\x15\x14\xd3\xbb\x6b\xb3\xeb\xa6\xf5\x7c\xa9\x9f\x22\x51\xe5\xca\x48\x6c\x74\x77\x6b\xdd\x4f\xe6\x77\xf5\x8d\x74\x6d\x83\x56\xb0\xa8\x6e\xa4\xbb\xfd\x32\xb3\xee\xa7\xed\xd0\xa5\x10\x73\xd4\xc3\x2e\xbb\x57\x88\xa9\xbd\x73\x44\x35\xfa\xa4\x0d\xef\xa7\x9a\xf3\xdc\xde\x0a\x58\x14\x44\x98\xa4\x40\x20\xe7\xef\x92\xc8\xaa\x7d\x28\x5e\x50\x24\xdb\x6e\xae\x73\x0c\xe7\x83\x42\x45\x43\x66\xdd\x5f\x43\xd5\xfc\x12\xc1\x03\x55\xdd\x9b\xed\x6b\x85\x6e\xef\xfe\xf8\x7a\x31\x38\x65\xae\xe0\xe6\xae\xbe\xfb\xdb\x81\xbf\x4a\xa5\x81\xd6\xfd\x57\xfb\x8c\x08\x46\xf3\x57\x36\x8a\xc8\xed\xda\x65\x10\xcb\x02\x56\x63\xc7\x28\xcd\xe2\x2c\x18\x8d\xc7\x19\x4e\xe1\xc8\xcb\x30\xf4\xc7\x23\xe4\xe3\x24\xc3\xe3\x2c\xf2\xe3\xc4\x0b\xf0\x38\x4e\x3c\x77\x25\x37\xbb\x33\x2a\x1d\x11\xfe\x0b\x11\x53\x2e\x24\x7d\xba\xff\xe2\x62\x52\xd4\x2b\xeb\x19\x0e\x82\x31\x34\x0c\x31\xc0\x63\x34\xce\x3c\x80\x50\x16\x8c\x49\x18\x24\xd0\x03\x11\x86\x91\xe7\x05\x51\x93\x29\x49\x73\x50\x5a\x56\x77\x27\x7d\x3d\x7d\x85\x53\x0d\xb1\xbe\x9e\x1e\xd7\xbf\xce\x67\xd6\xd7\x9c\x22\x8e\x89\x7d\x7e\xb9\xb0\x7d\x0f\x44\x47\x3a\xa3\x08\xf8\xe6\x77\xa6\x92\xb0\x9d\x8e\x28\x2b\xea\x36\xb8\xed\xac\xb3\xef\x31\x8e\x3b\xeb\xf5\xa7\x48\xee\x6f\xbf\x0e\x42\xd7\x05\xf9\xc5\x28\xd2\xb8\x97\x46\x5a\xff\xba\x5d\xdc\xdf\xdd\x5e\x0f\xf2\x93\x1a\x6b\xfd\xeb\x74\xc6\x53\x43\xac\x7f\x51\x73\x15\xcc\x23\xdd\xe8\xcc\x72\x3f\xea\xd4\xda\x61\x8e\xdc\x72\xa5\xfb\x86\x4a\xd9\x6f\xc1\xd4\x06\xe3\x71\xe2\x8d\xfc\xb6\x3d\xd7\x27\xfa\xa6\x3c\x97\x5c\x28\x5a\x6e\xdc\x99\xb9\x0d\xaa\x2d\xe7\xee\x62\xb4\x86\x74\xc7\x4c\xd7\x87\x17\x81\xe0\x14\x33\x8d\x7b\x8d\x23\xcc\xb1\xdd\xdc\xd6\xa4\x19\x9e\xe6\xe3\xf9\xaf\xf1\xa9\x7e\xe1\x2c\x00\xad\x66\xc7\xec\xf7\x2d\x98\x5a\xdf\xee\x2f\xab\x90\x57\xc2\x8d\xf3\x83\x57\xb9\xe7\x56\x65\x05\x6b\x4f\xd4\x7d\x83\x0a\xf1\xcd\xa9\xca\xd8\xa1\xac\x6f\xb2\xa4\xc5\xb0\xcd\x9f\x15\xd4\xfa\x0e\xda\xb9\x97\xa7\x4c\x10\x92\xc4\x06\x1c\x38\x81\x13\xef\xda\x76\x75\x87\xd8\x87\xc0\xfa\x7e\x69\x30\xdd\x45\xc9\x2e\x19\x2a\xcd\x95\xf4\x4d\x22\x18\x56\xc6\xf8\xbe\x78\x80\xc3\x36\x77\x18\x64\x3b\x46\x7d\x27\x82\x0f\xdb\x92\x67\x90\xd6\xf7\x9c\x1c\x1d\xa5\xf5\x7b\xeb\xdf\xfd\xe0\xf0\x07\xdd\xa4\xa2\xf7\x8b\x23\xee\x33\x5c\x73\xbe\xac\x62\xc2\xf6\xa7\x69\xda\xa4\xf1\xdf\xfd\x0d\x4c\xc3\xe9\x6b\xcf\xf8\xb3\x33\xa5\xc1\xb0\xf3\x83\x17\x75\x2a\x4f\xea\x1f\x1a\x68\x32\x1a\xb7\x46\x1a\x0a\x7f\x37\xa7\x7c\x82\x42\xc7\x2c\x7f\x9e\x0e\x70\xfa\xd0\x63\xea\xfc\x39\x9f\xb9\xd6\x9f\x64\xd8\x15\x98\x7f\x12\x6c\xfd\x49\x72\x7c\x7c\x42\x17\x04\x5e\x04\x46\x60\x1c\x8d\xfb\xbf\x54\xf8\x83\xd4\x07\x2b\x1b\x53\xfa\x4b\xaf\x9a\x52\xfc\xd3\x98\xb9\x5d\x15\x7e\x9d\xab\xe7\x05\x9e\xef\xfb\x91\x0f\xc6\x3d\xae\x2f\xab\xa8\x7a\xb4\x17\xf7\xdb\xc0\x0e\xea\x3a\x6a\xa4\x85\xaf\x55\xb3\xe9\x06\x0e\x71\x08\xad\x3f\x19\x4d\x5b\x32\x46\x53\xd3\x15\xea\x0f\xfd\xe4\xb9\x81\x1d\xac\x20\x46\x53\x2b\x65\x44\x36\x1b\xc2\x4d\x88\xf4\x37\xa3\xaa\x02\xea\xac\x07\x0a\x45\x33\x88\x94\x4b\x82\x00\x86\x38\x1b\x91\xc0\xc7\xa3\xd0\x87\x9f\x58\xfe\x31\xb4\xc7\x3d\xfa\x43\xb4\x38\x8b\xbc\x31\x18\x83\x18\xa7\x69\xe8\x91\xd8\x4a\x7f\xd0\xc2\x37\xfb\xac\xcd\x20\x98\x36\x47\x78\xcd\x13\xb7\x7a\xbb\x81\x79\x09\x59\x05\xaa\xca\xb3\xa3\x8a\xf7\xc6\x7e\x28\xe9\x86\xe7\xfc\xd1\xa6\x9b\x8a\xfa\xb5\x9d\xfb\x56\xbb\x0f\x3a\x27\x4f\xca\xf6\x9c\xe0\x45\x0c\xd1\x43\xec\x7d\xeb\x72\xbc\x6b\x6e\x08\x7e\x85\xe5\x2b\x62\xc0\xfb\x8b\x01\x16\x2a\xab\xdf\xe6\xea\xf0\x4d\xe1\x0a\x13\xa1\xbb\x48\xf6\xe2\x90\xaf\xee\xec\x31\xcd\xb2\x0d\x14\x0f\x83\xda\x59\x03\xb6\xf0\x23\x2d\x70\x36\xec\x42\xb6\x1a\x6b\x99\x69\xd8\x63\x07\x57\x09\xe2\xb2\x3f\x11\x4b\x3e\x93\x9c\x3e\x35\x04\x64\xa5\xbf\x35\x33\x60\xb8\x44\x4a\xba\x15\x42\x3f\xb3\xab\x89\x95\xf6\xa7\x94\x80\x99\x71\xd3\xa9\xd7\x8e\xcb\x49\x5d\x77\xec\xf6\xe6\x69\x4c\x4f\xea\x59\x44\x41\x06\xd3\x57\x22\xcd\xf3\xab\xc5\xd5\xd4\x2d\x38\xa3\x8a\xfe\x5d\x12\x1b\x13\x73\xb9\x5e\xf3\x03\x54\xb6\xd9\xe2\x53\xa7\x35\xaf\xfd\x26\x8e\xd1\xb3\xc7\x5c\xc0\x6d\x7d\xad\x7a\x29\x89\xa8\x67\x87\xdf\x2c\x6b\xcf\xdd\x57\x8b\xdb\x6a\x97\x4b\xdb\x57\x20\xe9\x64\xb2\xac\x2e\x47\x25\xf9\x8a\x30\x92\xf7\x53\x85\x55\x5e\x16\x8c\x0f\x1b\x48\x3f\x57\x58\x8b\x5e\x43\x55\x59\xbc\x3a\xbc\xef\xd0\x8d\x7e\x60\xb4\x37\xf7\xee\xca\xcc\xfc\x35\x23\x75\xfb\xd3\x5a\xf5\x39\xa2\x8e\x8b\x0c\x3f\x70\xc4\x68\x2a\x49\xf5\xc3\xa9\x2f\x33\x8d\xc5\x85\x39\x8f\x34\xaf\x27\x89\x6a\xe0\xfe\x4e\xdb\xe6\x71\x63\x2b\x46\x53\x45\xb3\x6c\x50\xc1\x6b\xac\xb5\x29\x28\x5a\xfb\x83\x48\xae\xaf\xee\xad\x42\x66\x02\x0e\x3b\x77\x53\x41\xad\x42\x96\x8a\xb2\x61\xab\x45\x35\xd6\xda\x3e\x7d\xa3\x39\xe6\xdb\xa3\x7b\xe9\xbf\x7d\xdf\x56\x20\xeb\x89\xe6\x44\x0d\x1b\x77\xbf\x1b\x68\x1b\x39\x3d\x15\xc3\xf6\xe1\x3f\x15\x85\xa5\x87\x26\x1b\xa2\x87\x9c\x6f\x19\xc1\x2b\x73\x99\xc2\xb0\xb1\x9e\xd1\xf4\x1b\x55\xeb\x49\x9f\xd6\x9c\x0c\x72\x36\x54\xd9\x9d\x4c\xc4\xfa\xbf\x01\x00\x00\xff\xff\x25\xa1\x28\x2d\x97\x79\x00\x00") + +func urlsCsvBytes() ([]byte, error) { + return bindataRead( + _urlsCsv, + "urls.csv", + ) +} + +func urlsCsv() (*asset, error) { + bytes, err := urlsCsvBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "urls.csv", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _namesCsv = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x7b\xdb\x7e\xa3\xba\x92\xf7\x3d\x4f\xa1\x2f\x17\xdf\x74\xcf\x16\x59\x06\x27\x59\xbd\x2e\x31\x8e\x13\xf7\xc6\x98\x36\x4e\xa7\x57\xdf\xcc\x4f\x06\xd9\xd6\x04\x23\x46\x88\x1c\xfa\x6a\xde\x61\x9e\x62\x3f\xc7\x7a\x93\x79\x92\xf9\xe9\xc0\xc9\xc6\xc6\x5e\x37\x20\xa4\x7f\x55\xe9\x50\x55\x2a\x1d\x18\x8c\xc2\x31\x1c\x85\x63\xf0\x13\x33\x0a\xdc\x04\x15\x39\x06\x1e\x89\x70\x9a\x63\xc3\x71\x3c\xe8\x70\xce\xc8\xaa\xe0\x84\xa6\xc0\xc9\xf3\x82\xa1\x34\x6a\x20\xc6\xa1\x07\x9d\x1d\xfa\x45\x53\x30\x26\x1b\xc2\x51\x02\x42\xcc\x5e\x49\x84\xf3\x1a\x34\xf1\x4c\xeb\xda\x82\x4e\x84\x62\xbc\x23\x11\x98\x30\x5c\xb1\x00\xaf\xd6\xb5\xa5\x21\xf6\x71\x88\x2d\x21\xf6\xf5\xe0\x18\xc4\xbe\x1e\x68\xc8\x51\x41\xb6\x16\x34\x3c\xce\x65\x28\xb8\x3c\x04\xa2\x32\x03\x93\xa6\xc9\x07\x74\xd6\x6b\xd1\x33\x0f\x38\xc5\x0c\x25\x20\x28\x56\x09\x89\x9a\x35\x1b\x00\x81\x6b\x50\x31\x33\x41\x1c\xb3\xb3\x28\x19\x90\xd8\x8a\xfa\x0c\x22\x85\x1d\x96\xf5\x7b\xf0\x9f\x40\x0f\xd1\xb0\x55\xc7\x61\xb3\x8e\xe7\x52\xb7\xea\x29\xfa\xef\x3c\x42\xc3\x99\x8d\x03\x2f\x70\xa0\x33\x1b\xff\x5b\x0e\xb2\x24\x43\xff\xb1\x43\xd9\x75\x54\xeb\xc6\xcc\x83\x4e\x96\x25\x18\xcc\xa6\xcb\x46\x6e\xe0\x84\x7a\x8c\x3e\x00\x5d\x83\x19\x95\x0a\x18\x90\x88\x17\x0c\x03\x87\xf1\x1c\xa0\x34\x06\x61\x44\x70\x2a\x74\x6d\x14\x8e\x0d\xc7\x5f\x7a\x0b\x33\x18\x43\x99\x00\x21\x5d\xf3\x37\xc4\x30\x58\x90\xcd\x96\xe7\xc0\xa7\x9c\x44\xd8\x70\x02\x67\x22\x84\xc6\x74\x85\x41\x40\x73\x9e\x47\x8c\x64\x1c\x38\x93\x59\x2d\xbf\x1c\x8d\x18\x65\x9c\xbc\xe2\xfd\xb6\xc9\x61\x08\x42\x0d\x92\xd5\xd7\x88\x90\x16\xac\xb6\x8f\x26\xd0\xea\x01\x5a\x25\xd0\xee\x01\xda\x0a\x68\xf7\x88\x96\x06\xb1\xca\xf9\x47\x82\x73\x58\x26\xea\x16\x8a\xe6\x9b\xf6\x60\x70\xa7\x7b\x22\xfc\xc8\x39\xde\xe5\x60\x9a\x46\x94\x65\x94\x21\x8e\xe3\x92\xa5\x4b\xe3\x9a\xaf\xb3\x61\x18\xef\x70\xca\x35\x8f\x87\xe4\x23\xdb\x6a\x26\x32\x0d\x3c\x92\xf3\x5a\xd0\x7a\x97\x21\x96\x63\x58\x26\xea\x92\x04\xc5\x31\x49\xa1\x7e\x2b\x4b\x6c\x77\xb4\xe1\x64\x28\xda\x62\xdd\xcd\x22\xd9\xee\xd9\xb2\xd4\x3a\x2c\xb5\xca\x52\xfb\x90\x56\x76\x0d\xe3\x24\xe7\x24\x92\x36\x1b\x60\x96\xc0\x32\xa7\x29\x02\x7c\x12\x45\x9f\xdb\xe8\x28\xf9\xd2\x0d\x7e\xfb\x2d\x52\x0e\xf4\x4b\x8b\xa0\x13\x5c\x23\xec\x2e\x84\xa8\xe2\x28\x1c\x9b\x96\xa9\x7c\xb2\xf4\xd1\xe5\x47\xd5\x3d\x02\x61\xeb\x4c\x53\xf4\x5f\xe9\xcd\xcb\x4c\xa0\x33\xbb\x29\x7c\xcc\x0f\x08\x54\x5e\x37\x3e\x40\x1c\xa7\x1c\x36\xf3\x40\x90\x14\x39\x50\x05\x9d\x44\xf0\xaa\xc5\xfe\xea\x2a\x24\xbb\x2c\x21\x6b\x82\xe3\xab\xab\x92\xe2\x4a\x92\x0c\x4b\x39\x8d\x39\x47\x56\xee\x8d\xf0\x2d\x40\x75\x66\x1b\xed\x26\x18\x31\x89\x2b\xb3\x80\xcc\x6a\x55\xa7\x42\x7b\x23\xdf\x83\x1e\x7a\x63\xc2\x6f\x80\x11\x66\x2f\x38\xc1\x1f\xc0\x47\x82\x31\x4a\x80\x87\x56\xd2\x9b\x80\x57\xc4\x08\x4a\x39\x48\xba\xb8\xf8\xd4\xf4\x8b\x48\x48\x31\xb5\x14\xd3\x1e\x58\x37\xed\x5a\xf8\x14\x68\x50\x3d\xac\x03\xeb\xa6\x8f\x53\x1f\x93\xa3\xf4\xcf\x88\x31\x94\xf2\x8f\xa3\x0c\x4a\x40\x9b\xc3\x3c\xc3\xa9\x39\x0b\xa6\x6d\x32\x91\x0b\x66\xc1\xb4\xec\x87\x16\x8d\x1a\xd4\x61\x3d\xa8\x3e\x7e\xbb\xba\x12\xd3\xc4\xd5\xd5\x02\xbf\x92\xfc\x70\x70\x6f\x4a\x71\x4f\x2e\x6c\x7e\x83\x4f\x4f\x29\x79\xc5\x2c\x27\x5c\x7a\x7a\x17\x25\x64\x4d\x59\x4a\x90\x19\x66\x38\x22\x6b\x12\x7d\x6e\x31\x50\xb2\x6f\x6a\xd9\x73\x46\x36\x24\x45\x49\x59\x81\x79\x72\x20\x3c\x60\x94\xe3\xa8\xd2\xa7\xfa\xb3\xd5\xa7\xca\xdb\x99\xc2\xdb\x49\x58\xd3\xfb\x39\x2d\xed\x53\x8e\x7f\x44\x69\xce\xeb\x69\xa6\x69\xdc\x23\xb4\x15\x5e\x51\xbd\x6a\x21\x88\x31\x28\x1e\x75\x0e\xc6\x4c\x10\xc3\x32\x51\x97\x10\xbe\xa4\x8c\xe1\x94\x2b\x59\xd5\xa7\x1a\x99\x3d\x67\x2f\x03\x83\x16\x89\x75\x06\x89\x65\x8c\x92\x02\xcf\xd1\x8b\x10\x21\x84\x24\x05\x06\x73\xf4\x02\x66\x34\xc6\x49\xb3\x41\x82\x3b\x65\x11\x2e\xde\xa1\x7e\x57\x76\xe1\x3a\xcb\xb9\x9e\xe0\x5c\xba\xcb\x0a\x8e\x99\x08\x14\x69\x44\x10\xc7\x39\x58\xb2\x22\x17\x53\x49\x57\x15\x44\x0d\x5c\xd7\x1c\xfd\x29\x9b\xe8\x32\x8c\xe4\x64\xeb\xd2\xdd\x8e\xa6\x79\xb3\xcf\xa5\x7b\x95\x81\x06\x89\x34\x89\xdd\x47\x62\x77\x90\xdc\xf6\x91\xdc\xee\x91\x0c\xfb\xa4\x88\xf0\xe8\x29\xcd\x28\xe3\x38\xd6\x34\x37\x7d\x34\x37\xd7\x03\x30\x4d\x39\x66\xa9\xf6\x3a\x9a\xd0\x77\xfb\x3b\xc2\xa7\xa9\xcc\xc7\x2c\x22\x28\xe9\xe8\x17\xdf\xed\xef\x9a\x3d\x26\x87\x3d\x25\x99\xf4\x74\xd6\x01\x93\xfd\xbe\xf3\xdd\xfe\xee\xdb\x63\xd2\xd1\x9b\xbe\xdb\xdf\xa1\x7b\x5c\x4e\xf4\xaf\x3f\xbe\xb8\x8b\x7d\x0a\xc6\x98\x91\x57\x49\x90\x77\xf7\xb8\x3f\xbe\xb8\xd3\xf7\xd8\x76\x8e\x81\x64\x7b\xd9\x30\x1c\xb0\xed\x18\x15\x7f\x7c\xf1\xc0\xec\xb1\xed\x1e\x27\x7f\x7c\xf1\x50\xed\xf1\x3d\x31\x72\xa1\x73\xf1\xc8\x85\x5b\xe1\x51\x9d\x84\xbc\xe0\xee\x61\x0b\x9d\x8b\x87\xad\xc9\xb3\x73\xcc\x24\xcf\xcb\xc6\xac\xcd\xb3\x63\xc0\x42\xe7\xe2\x01\x6b\xf2\xec\x1e\xad\xd0\xb9\x78\xb4\x9a\x4c\x8f\x0e\xd5\x59\x16\xd6\x67\x52\x67\xd9\x53\x9f\x01\x9d\x65\x3d\x7d\xe6\x72\x96\xad\xf4\x1a\xc7\x59\x96\x71\x96\x29\x9c\x63\x07\xa7\x15\xff\x1c\xad\x3f\xad\xe6\xe7\xe8\xf8\x69\xa5\x3e\x47\xa3\x7b\x54\xf8\x1c\xfd\xed\x55\xd8\x60\x3c\x76\x0f\x59\xe8\x55\xe8\x98\xee\x10\x49\xc1\x18\xc7\x24\x92\x34\x72\xcf\xc1\xc5\x8c\x8b\xb0\x54\xe6\x18\xae\x3b\xe8\x1e\x0f\xb9\xa1\x26\x77\x79\x74\x80\x2b\x04\x8e\xc7\x2a\x74\x54\x20\x30\xc6\xaf\x38\xa1\x99\x58\x4d\x4b\xd6\x63\x92\xd7\x75\x6f\xc6\x93\x9a\xd0\xba\x90\xd0\x32\xdc\xb1\xe7\x88\xe5\xed\x8e\xe4\x39\x79\xc5\x95\xf0\x22\x15\xf1\xf6\x18\x71\x74\xb8\xb0\x07\x35\x5e\x0b\xf7\x1c\x53\xf4\x24\x49\x37\xe7\x31\xd0\x60\x45\x7d\xef\x4e\x3d\xdd\x6a\x2c\x92\x6a\xa1\x7f\x10\x36\xd7\xd4\xaf\x2d\x32\xeb\x02\x32\xab\x24\xb3\x2f\x90\x66\xd7\xd2\xec\x0b\xa4\xd9\xb5\xb4\x91\x26\x32\x47\x7d\x64\x25\x85\x5b\x52\xb8\x67\x50\x2c\x7c\x73\xfe\xa8\xbb\xe2\x7e\xe1\xab\x50\xfa\x11\xb1\xb8\xa6\x88\x70\xd9\xfc\x0a\x6c\xf7\x80\x6d\xc3\xf5\x17\x53\xf3\xeb\x07\xdf\xd2\x14\x8a\x34\x50\xe9\x6a\x09\x22\xcb\x03\x99\x67\x3e\x04\x9e\x29\xc2\x7b\xc4\xc9\x2a\xc1\x0a\xae\x8a\x5a\x91\xfd\x43\xe0\x81\x1a\xd6\xd5\x9a\x9a\x67\x8b\x49\x25\x33\x70\x5a\x16\xa2\x2d\xb1\x69\xd3\x2d\xbb\x08\xba\xd0\x6d\xc4\x5c\x42\x6c\x28\xd7\x71\x01\xa3\xff\x89\x23\xbd\x22\x6a\xe0\x6c\xc3\x7d\x72\xcc\x79\xc9\xee\xc9\x01\xf3\xf5\x9a\x44\x07\x3b\x7f\x4a\x37\x51\x12\x63\x86\xa0\x7e\xd7\x95\x4f\xca\x7d\x1c\xe8\x26\x88\xc9\x4d\x0e\xb0\xbf\xb5\x63\xb8\x34\x8d\x29\xd3\xd6\x2c\x92\x1d\x32\x2c\xc3\x65\x34\xcf\xdf\x28\x8b\x61\x95\xaa\x39\xb0\x8f\x9c\xa3\x24\xe4\x28\x7a\xc1\x0c\xb6\x3f\x6b\x54\xb1\xc2\x50\x3c\xaa\x9c\xb1\x39\xd1\x4b\xd7\x31\x2e\x78\x1e\x6d\xe5\xfe\x10\x69\xa9\xdf\x2f\x9c\xfe\x32\xc6\x73\x17\x8e\xe7\x6e\x4d\x18\x8e\x03\x28\x1e\x75\x0e\xe5\x39\xfe\xaf\x14\xea\x77\x95\x7f\xef\x2a\x01\xf7\x71\x11\x95\x5b\x2a\xb5\xbb\x68\xf5\xa2\x80\xda\xfd\x50\x61\x9e\xf7\x13\xcd\x95\xac\xd7\x38\x01\x13\xca\x8a\xdd\x1e\x33\x7d\x3a\xd0\x8d\x90\x3c\xf4\xd8\xde\x47\x09\xc9\xf2\xce\x2d\x5d\x01\xb1\x8f\x43\x24\x97\x27\xe1\xf2\x36\x8c\xc4\xf0\xfe\x49\xba\xbf\x07\x46\xe2\x03\xfb\x35\xee\x9f\x4a\x71\x05\xa3\x19\x46\xa9\x98\x05\xba\x35\x54\x43\xad\x5e\xa8\x55\x42\xed\x5e\xa8\x6d\xdc\xa7\x1c\xe7\x39\x82\xfa\xdd\xa9\xc7\xf7\x2c\x29\x45\xb3\x04\xa5\x9b\x4e\x45\x14\xa2\xf2\x8f\x1d\xd4\xef\xaa\x85\x93\x70\xe2\x04\x70\x12\x4e\x80\x93\x24\xcd\x29\xa3\x01\x78\xf2\x24\xe0\x29\x4d\xc8\x8e\x70\x1c\xb7\xcb\xbc\x45\x77\x29\xf8\x24\x37\xfc\xca\xaf\x05\xe6\x38\x15\xfa\xf1\xd9\x98\x2c\x3d\x28\xfc\x25\xff\xc8\x6a\x53\xae\x78\x22\xc2\xa0\x78\xd4\x39\x0c\xed\xf0\x1b\x65\xef\x72\x24\xaa\xaf\x03\xe3\x37\x04\xcf\xe9\x0e\x6d\x30\xac\x52\x9d\x1d\xf6\x30\x51\xd3\x70\x7d\xf4\x22\xbd\xf7\x98\x46\x85\xf0\x6e\xa8\xe5\x9f\x44\xef\xa9\x73\x97\x9a\xac\x79\xee\xd2\x4b\x5a\x1e\xba\x94\xe4\xe7\x50\x95\x60\xfb\xdc\x2a\xda\xad\x2a\xda\x97\x54\xd1\x3e\xa8\xa2\x7d\x0e\x55\x09\x1e\x9e\x5b\xc5\x61\xab\x8a\xc3\x4b\xaa\x38\x3c\xa8\xe2\xf0\x1c\x2a\xe3\xc1\xb3\x83\x10\xca\x67\xa5\x4d\xfa\x88\xee\x1f\x92\xc1\x59\xa7\x7a\xad\x83\xc4\x5e\x2a\xd9\xc6\xfd\x43\xc4\x4b\x65\x9d\x2f\xc6\xee\x6b\x8a\xbd\xcf\xde\x3e\xa7\x29\xf6\x9e\x8c\xf3\x9a\xd2\x29\x4b\x78\x01\xf3\xc1\x75\x4d\xfc\x1e\xe1\x4c\xee\xde\xf6\xf1\x78\xfb\xed\xc1\x75\xc1\xa2\x48\x39\xd9\x09\x4f\xb4\x62\x88\x7d\x80\x8a\xbe\xcd\x1a\x15\x9c\x46\x34\x5d\x5f\xc4\xdf\xd1\x44\xc7\x98\xae\x48\x4e\xd3\x8b\x38\x8e\x04\xc5\x31\x76\x51\x82\xf2\x3c\x43\x7c\x7b\x11\x4b\xb7\xa4\x3a\xc6\x76\x4d\x53\x7e\x11\xc7\x09\x4d\xf9\x21\xb3\xf3\x35\x61\xd8\xa7\x6d\xc3\x7d\x0d\x18\x9e\xa3\x6d\xc3\x3d\x19\xe7\x69\x5b\xa7\xac\x0b\xb5\x6d\x78\xa6\xb6\x0d\xff\xa6\xb6\x0d\x4f\x69\xdb\xb0\xa7\xeb\xeb\x6e\x21\x2a\x2e\x81\x65\xa2\xf6\x66\x09\x89\x31\x1c\xc6\xeb\x77\x20\x93\x8d\x82\x22\x79\xc7\x50\xbd\xaa\xdc\xc7\xc0\x1f\x9b\x39\x4e\x12\x53\x9f\x07\xc1\x47\x92\x73\xca\x48\x84\xea\xc9\x5f\x6e\x62\x70\x11\x35\xeb\x35\x69\x94\x20\xb2\xc3\x0c\x98\x40\x90\x56\x47\x49\x82\xd9\x25\xf4\xc6\x23\xca\x5f\x70\x92\x2c\x70\x46\x19\x87\xfa\x0b\x78\x28\xdd\x14\x62\xaa\x56\xf9\x55\x5d\xa7\xa3\x99\x99\x91\x55\x0e\xa7\xa3\x19\x08\xe8\x1b\x66\x81\x0b\xa6\x29\xe1\x04\x25\xe4\x57\xbd\x90\x1f\x51\x5a\x1f\xdf\x18\x53\xf7\x09\x4e\xdd\xa7\x9a\xcb\xd7\x07\x38\x4d\x63\x9c\xe1\x34\x16\x0b\xbe\xaf\xc1\xfd\x03\x78\x60\xb4\xc8\x6a\x48\xe0\xc0\x69\xe0\x00\x69\x1c\x75\xa6\x72\xc4\x52\x78\x47\x0c\x31\x0d\x5d\x38\x0d\xeb\xd8\x5a\x46\x1b\x33\xb4\x21\xd1\x0b\x6c\xa4\x1b\xe5\x09\x59\xd9\x50\xbd\xea\xdc\x74\x4d\xcd\x9f\xd3\x00\x96\x89\x46\x09\xc7\x89\xe9\xb8\xc1\x14\xca\x24\x10\xc9\x53\x0b\x4c\x89\xd2\xd8\x8e\x53\x1a\x59\xce\x56\x28\x57\x9b\x07\xd5\x57\x67\xe3\xbe\x06\xfe\xd4\x85\x5f\x51\x86\x52\xe0\x63\xfe\x46\xd9\x0b\x10\x35\x64\x3b\xd5\xed\x2e\x16\xe4\x15\xeb\xaf\xe1\xdc\x87\xe2\x51\xe7\xa0\x3c\xc0\x4c\xfa\x16\x95\xac\x4a\x3c\x47\x45\x18\xe5\x12\xd6\x91\x23\xbe\x62\x2a\xdc\x55\xa5\xc3\xce\xd2\xa1\xe1\xb5\x26\xbc\xd2\x50\x8f\x3a\xae\xda\x39\x78\x07\xf3\xde\x19\xc4\xc2\xf0\xbc\xce\xe9\xef\x6f\x48\xfe\x1b\x42\xad\x33\x9b\xd9\x8c\x31\x4b\xd2\x46\x43\x71\x9e\x63\x76\x9a\xba\x29\x74\xaf\xa5\x67\x50\xef\xcb\xbe\x5c\x6c\x35\xab\xf4\x50\xb5\x1c\xbe\x77\x30\xbb\x9c\x43\xdd\x94\x79\x51\x53\x3b\x65\x5f\x2c\xd6\x5b\xc0\xd3\xf0\x09\x15\xa6\x92\x6e\x0a\xb5\xd9\xb0\xc0\xb9\xb4\xe2\xdc\xf0\xb4\x3f\xf2\x8a\x48\xee\xed\xb5\xc9\xbe\x63\x96\xeb\xf3\xd5\x12\x69\x1f\x81\xbe\xca\x6d\x12\x2f\x28\xf9\xa1\x25\xfe\x51\x2d\xc2\xba\x9c\x81\x86\x5a\xbd\x50\xab\x84\xda\xbd\xd0\xaa\x02\x43\xd4\x8b\x1d\xa2\x0a\x1c\xf5\x83\x23\xc3\x43\x1c\xbf\xdb\x18\xea\x77\xed\x79\x70\xc6\x69\x4a\x22\x04\xab\x54\x5d\x46\x3c\xf2\xcd\x0c\x54\x33\xb5\xef\x51\x7e\x27\x2e\xc0\xb7\xe2\xaf\x7f\xad\x70\x04\xfe\xf7\xbf\xff\xa7\xb9\x40\x7e\xad\xfa\xdc\xd2\xf4\x8b\x7e\xfa\xc5\x5f\xff\x8a\x48\xc6\x68\x44\xf8\x5f\xff\xea\x62\x91\x25\x45\x7e\x29\x9b\x35\x65\x7c\xbf\x3e\xab\x2c\xdd\xc0\x44\xbe\x1a\xad\x4c\x8b\x77\x79\x51\x64\x3a\x82\xf2\x03\xfc\x13\xb3\x14\x27\xe0\xbb\xbe\x25\x43\xd7\x40\x15\x5f\x53\xb6\xa9\xee\x06\xcc\xa6\x4b\x73\x00\x67\xd3\x25\xf0\x69\xeb\x0a\x85\x28\x70\x67\x4f\xd0\x9d\xd5\x13\xae\xc8\x43\xf1\x2b\x66\x9c\xe4\x24\xdd\xc0\xfb\x34\x21\x9b\x2d\xc7\xe9\xae\x71\xb7\x08\x7c\xc2\xd6\xdd\x67\x89\xc5\x69\x8a\xa0\x78\xb4\x38\xac\xf1\x16\xae\xf1\xb6\x99\x07\x9b\x57\x0b\x67\xd3\xa5\x3f\x71\x64\xd6\x3f\x52\x6a\xae\x51\x92\x63\x53\xdd\x2d\xca\xeb\x7a\x6b\x1d\x9f\xd1\x5f\x24\x49\x0e\x36\x4f\x84\x72\xcf\xb4\x6e\x1f\x85\x58\x12\x22\xa6\x80\x94\x9a\x11\xcd\x3e\x12\xbc\x6e\xc6\xdc\x47\x08\x45\xd4\xfc\x29\xa5\xa0\xa4\xa8\x23\xbf\xcf\x25\xc3\x13\xa4\xc6\x2c\x34\x03\x0f\xce\x48\xc4\x68\x4e\xd7\xfb\x8a\x2e\x8a\x17\xcd\xe2\x05\x56\xda\x80\x92\x1a\xb2\xf4\x3c\x38\x43\x9c\x91\x77\xb0\xc4\xbb\x4c\x38\xae\x6a\x2e\xa9\x40\xe8\x05\x8b\xe0\xe8\x1d\x56\xa9\xba\x8c\xb0\x79\x08\x97\x5b\x0c\x64\xaa\xdc\x73\x36\x66\x94\xd3\x9c\x72\x0a\xcb\x44\x4d\x51\x24\x28\x2d\xaf\x53\x5e\xc9\xaf\xa6\xbd\xec\xc7\x2e\xb0\xf6\x5a\x57\x82\x96\x93\x28\x87\xfa\xdd\xe0\x99\xc1\x59\x23\x56\xf3\x1d\x79\x70\x36\x84\x22\xd1\x8a\x73\xea\x3d\x7d\x11\x2a\xf8\x23\x3d\xf6\x3e\xe6\x22\x42\x4c\x30\x3a\xd8\x5f\x7b\xb5\x0c\xdf\x0d\x1d\xd8\xbe\xb9\x34\x4d\x12\x92\x52\x92\xff\x26\xca\x3a\x23\x29\xff\x21\xf0\x04\xdf\x2d\x8a\x5e\x8e\xf8\x71\xc3\xf7\xe6\xea\x00\xd5\xa7\xec\x0d\x6f\x08\x4a\xcb\x0e\x14\xd6\xaa\xd8\x3e\xd0\x57\xcc\x94\x59\x8c\x11\x47\x86\xef\x09\xbe\xa2\x3f\x77\xe4\x60\xc8\xfd\x79\x28\x85\x92\x5f\x38\xed\xae\x55\xdd\xe0\x3c\x42\x59\x77\x60\xe7\x6b\x75\x3f\x01\xb2\x0c\x3f\x98\x87\x6a\x7a\xf3\x69\x6a\x06\x8c\xae\x49\x75\xf7\x68\x2f\xfc\x1c\x0a\x9e\x0b\x0f\xfa\x0b\xaf\xae\xc8\x32\x30\x07\xd0\x5f\x06\xfb\xde\xc2\x5f\x06\x32\xbb\x02\xa2\x62\x87\x53\xa8\x5e\x07\xed\xc5\xdc\x0c\xfd\x59\x00\xcb\x44\xb3\xc4\x1d\x4f\xa0\x7a\x55\xb6\xee\xe3\xb7\x3c\xc1\x9c\xc1\x32\x51\xe3\xe9\x0b\x41\x50\x3e\xbb\x3b\x8e\xbe\xe1\x15\x94\xcf\x3a\xaf\x48\x09\x87\xf2\x59\xe5\xcd\x5d\x77\x29\xac\x52\xf2\x70\x9d\xd0\x75\xc6\xf7\x60\x89\xa3\x6d\x4a\x13\xba\xf9\xd8\x6f\xc0\xdc\xf5\xd4\x15\x1e\x91\x10\x13\x39\x46\x2c\xda\x76\x19\xfb\x7c\xec\x9a\xa3\x0f\x39\x78\x92\xb7\x3c\x8d\xeb\x3a\x06\x6d\x0d\xe5\x7c\xbc\x52\x03\x3e\x1f\xbb\xa0\xa2\x93\x21\x7d\x1b\xa7\x36\xdd\xcd\xc5\xc4\x87\xe1\xd4\x53\xd0\xe6\x52\x47\xdd\x79\x25\x7c\x2b\x2b\xc9\x5e\x71\xac\x8a\x7d\xb4\xc3\x15\x75\x4a\xcf\x61\x90\xd2\x13\x3c\x8e\x13\x6b\x84\x75\x52\x84\xd5\x53\x47\xab\xaf\x8e\x56\x7f\x1d\xad\xe3\xc4\xc6\xfc\xc1\x33\x5d\x94\xa2\x18\xa9\x51\xdd\xb3\xe0\xd2\xba\x4d\xa0\x40\x12\xff\xf4\xcf\x7a\x54\x3b\xb0\x6a\x7c\x14\xee\x14\x4f\x79\xf0\xa1\x71\xc3\x53\xb8\xa1\xc4\x2d\x43\xad\xa4\x6a\x99\xbb\xc4\x39\x07\x61\x41\x78\xad\xf2\x73\x6f\xec\xa8\x60\x47\xed\xa1\x8f\x9d\xa0\xd3\x13\x94\x38\xfb\x24\xce\xae\x70\xc3\x93\xb8\x61\x85\xbb\x39\x89\xbb\xd1\x38\xfb\x7a\x70\xb2\x86\xb2\xbc\xc6\x9e\x46\x82\x4f\x94\x81\x8c\xe6\x39\x59\x25\x1f\xc2\xec\x1c\xb9\x79\x60\x5f\x0f\x46\x9f\x2b\x1e\xa7\xa5\xd5\xb2\xfa\x90\x6d\xec\x89\xde\x93\xc5\x35\xf4\x34\xd3\x0a\x77\xaa\x9b\xed\xaa\x9b\xed\x93\xdd\x6c\x37\xba\xf9\xf6\x24\xee\xb6\xc2\xdd\x9d\xc4\xdd\x55\xb8\xdf\x4f\xe2\x7e\xaf\x70\x5f\x4e\xe2\xbe\x18\xf3\x99\x56\xe4\x19\x62\x2f\xb8\xe1\x89\xf5\x54\x27\xcb\xba\xa6\xb9\x79\x78\x2f\x5c\xb5\x1a\xd1\xf0\x7e\x79\x00\xd2\x81\x87\x1c\xa7\xb0\xc1\xac\xf3\x16\x70\x79\x2f\xf6\x18\x42\xf1\xb0\x8f\xf2\xb0\x35\x0f\xfb\x28\x8f\xb2\x1e\xc3\xa3\x3c\xa4\x65\x67\x38\x0d\xb5\x6d\x87\x61\x3d\xe1\x06\xe5\x75\x14\x31\x13\x1c\xbd\xf3\xf2\xff\x5b\x6d\x0a\x1e\x03\x29\x2d\x78\x0c\x5a\x4b\xd5\xb2\xc0\x3a\x28\xb1\x8c\x20\x9c\xc8\x56\xea\xb3\xfe\xaa\x8e\x13\x5a\xa4\x71\xfb\xf4\x45\x34\x39\x40\x8c\xf0\x0f\xf3\x4e\xde\x49\x16\x71\xa4\xca\xd8\x1f\x0b\x59\x6e\x04\x09\x7e\x2f\x72\xa8\x5e\x40\x6e\x7c\xbf\x51\x96\xc4\x75\x24\x18\xd0\x9c\x6f\x18\x0e\xbf\x79\xb0\x4e\xd6\xa5\xea\x7e\x43\xa3\x7a\xcd\xaa\x7c\xd3\x0a\xf3\xad\x6b\x09\xf0\x6d\x5b\x24\x09\x94\xcf\x8a\xdd\xe2\x11\xbb\x54\xad\xc3\x16\x38\x06\x8f\x88\x03\x91\xd1\xe9\x24\x17\x3a\xa6\x6a\x04\xe1\x1d\xab\x08\x85\xba\x3d\x89\xba\x35\x16\x65\xf8\xbc\xc0\x28\xd1\x3b\x6f\xf9\x91\x3f\x83\xa4\xa6\x2f\x42\xc7\x9c\x8d\xe1\x22\x74\xc0\x0c\xe7\x39\xda\x60\x73\x4c\x36\xb8\xfe\x73\x07\x18\x8b\xd0\x0d\x3c\xb8\x20\x11\xdd\xb6\xee\xc2\xef\xc5\x2b\x8b\x98\xe4\x11\x94\xcf\x3a\xaf\x58\x7d\x40\xf1\xa8\x72\x42\xe7\x87\x19\x8c\x61\x88\xde\xf7\x34\x4d\xff\x96\x15\xba\xf7\x0e\x14\x0f\x75\x67\x2b\xde\x0f\xb6\xc2\x87\xa9\x39\x52\xd1\xc0\xc3\xf4\xc8\xa5\x99\x91\x6a\x5a\x09\xb5\xfa\xa0\x96\x86\xda\x7d\x5c\x85\x2a\x84\x8f\x9e\x39\xb8\xbe\x85\x21\x4d\x62\xcc\x32\x14\xef\xdd\xaa\x11\x1d\x3b\xb8\xbe\x2d\x71\x16\xbc\x3a\x8e\xac\x57\x30\x02\x79\x65\x84\xd3\x50\xff\xfa\x15\x16\x29\x98\xa6\x71\x91\x73\xf6\x01\x42\x8e\xd2\x18\xb1\x38\xef\x18\x41\x5b\x11\x9d\x4f\x60\x19\xe1\xcc\xf3\xbf\xc2\x12\x03\x66\x9e\x58\xb5\xf8\xf8\x0d\x7c\xc5\x2c\xc7\x8d\xa1\x9a\x05\x81\x07\x43\x1c\x15\x0c\x6b\xe5\x20\xe9\x46\xfe\x35\x41\x23\x7a\xb0\x62\x09\xfd\xa9\x03\xc5\xa3\x4b\x7b\x43\x6d\x40\xa2\x9a\x5d\x0e\x37\x0c\x1f\x4d\xe5\x96\x1e\x61\x18\x3e\x02\x9d\xae\xa2\x73\x51\x9e\x6f\x29\xe3\xb2\x54\xa6\x40\xaa\x35\xa6\xe4\x7d\x15\x8a\xa0\x8c\x81\x90\x1c\x28\x27\x04\xaf\x62\x91\x18\x3e\x7b\x30\x8c\xb6\x78\x87\xc1\x33\x89\x37\x98\x57\x0b\xda\x4f\xe1\xb3\xf7\xf9\xd4\xee\x78\x88\xde\x33\xc4\xb7\x50\xbf\xeb\x56\xe3\x34\xde\x21\x92\x98\x5f\xae\xed\x21\x2c\xbf\x2a\x06\x22\xb7\xc2\x1c\x14\x1b\x21\xd9\xe9\xb5\xbc\xfc\x1d\xaa\xf3\xaa\x49\x98\x60\x9c\x7d\x44\x88\xc3\x2a\x55\xd3\x67\x22\x6e\x63\xe6\x97\x3b\xa8\x93\xb5\xe4\xbb\xaa\xf4\x8f\x9b\x83\xd2\x3f\x6e\xea\xd2\x3f\x0e\x4b\xff\x30\x4a\xf5\x98\x79\xe6\x79\xca\x52\x6c\x10\x73\x17\x33\x61\x6f\xd7\x43\x58\x7e\x76\x39\xbc\xeb\xa1\xb1\x74\x82\x85\xbe\x9f\x36\x80\xe2\xa3\xeb\x7e\x5a\xa9\x1b\x4b\xd7\x83\x4b\xd7\xfb\x6d\xf9\xcf\x4a\xda\xd2\x0d\xcc\x37\x86\xb2\x0c\xb3\x1c\x2e\xdd\x00\x3c\xeb\x8f\x1a\x31\x43\x1c\x43\xf9\xec\x5c\xb4\x2d\xe7\x8b\x6f\x4f\xf7\xd2\x3b\xa8\xa4\x8c\x54\xfe\x71\xa8\x02\xd2\x64\x96\x62\xf1\xbc\x64\x45\x9e\x73\xcc\xba\xf9\x3d\x99\x23\xcc\x12\x92\xaa\x26\x89\x55\x1d\x91\x37\xab\xaa\xcd\x01\x84\x39\x50\x90\xd6\xec\x51\x13\xda\xe7\x13\x0a\xbd\x78\xd2\x57\xac\x9e\xb2\x9c\x33\x8c\x76\xd5\x85\x3b\x92\x1c\xdc\xb1\x2a\x6f\x21\x55\x57\x50\x3b\x2e\xea\x68\x64\x4a\x22\x1a\x63\x73\x3c\x09\x4d\x7b\x60\xdd\x42\x9d\x71\x68\x12\xc0\x54\x0b\xcd\x09\x49\xb0\xfe\x0b\xb7\xec\xbb\x4f\x82\xf2\xf3\x3e\xaf\xbb\xbf\xcd\xeb\xae\xe6\xb5\x9c\x3f\x55\x6c\x96\x98\xed\x72\xa1\x8f\x4f\x39\x36\x9e\x52\xed\x2b\x64\xa8\x50\x7d\x19\xdf\xe7\xe1\x72\x31\x9f\x41\xfd\xde\x57\xc8\x6a\x33\x45\x8d\xa7\xf1\x5d\xcf\x9f\xdf\xe9\x2b\x89\x51\xa7\x3a\x0c\x8c\xef\x64\x07\xbf\x93\xfa\x0e\xd4\xf3\xd0\x35\xad\x3f\xfe\xf8\x32\xf8\xdd\x1e\xc0\xe7\xa1\x5b\x93\x35\xce\x31\x4b\x0e\x9f\x04\xd2\x1c\xfc\x6e\xda\x83\xcf\x92\x52\x74\xd6\xe0\xd6\x1a\x1e\xa5\x2c\x2f\xa8\xd4\x2c\x04\x89\x39\xb8\x35\xad\xa1\x64\xd1\x2f\xd3\x1e\x0c\x6c\xd3\xb2\xcd\xa1\xf5\xd9\x78\x5e\x4e\x02\x0f\x8e\x29\x78\xde\x22\x0e\x44\x6f\x4d\xfe\x3d\x7a\x01\x7f\xd2\x02\x3c\xa3\x94\x83\x25\xdd\x77\xed\xcf\x88\x47\x74\xa7\x1c\xf8\x87\xdc\x21\x90\x5d\xa6\xb2\xbb\x42\xa2\xe7\xbc\x20\x19\x82\xea\x55\xb1\xf9\x61\x59\xf0\x87\x65\xd5\xdf\x62\xa2\xfd\x72\x27\x8d\x50\xa7\x5b\x93\xc6\x8f\xf0\x05\x71\x28\x9f\x35\x0d\x66\xf4\x1d\xca\x67\x9d\x97\x62\x0e\x7f\x5c\xfb\x8d\x08\xff\x4f\xad\xf0\x7f\xa2\x2d\xa5\xff\xaf\x73\xca\xf9\x53\x87\x5d\x47\x21\x96\xf1\x53\x43\x7e\xd2\xc3\x9d\xae\xb2\x5c\x58\x6d\x57\xb9\x30\xd1\x9f\x7a\x09\xd1\x5d\x6e\x19\x3f\x71\x0c\x7f\x36\xae\xc3\xfd\xc4\x69\xac\x18\xe2\xc6\xe0\xc9\xb0\xe3\x27\xd9\xad\x18\x92\x4b\x64\x95\xec\x5c\x1f\x57\xa8\x9b\xe3\xa8\x1b\xe3\x67\x42\x56\xf0\x57\x42\xea\xed\xaa\x55\x82\x73\xb9\xd9\x1e\x7e\xf3\xc4\x3a\x7f\xa4\xbf\x8d\xd5\x2f\x92\xd9\xf2\xb7\xc0\x5b\x28\xd3\x52\xad\x12\xb2\x52\x1f\xcd\x0e\xbd\xbe\x6d\xa0\xef\x7a\xd1\x77\x46\xb5\x19\x9e\xe2\x77\x6e\x0e\xae\xc5\x72\xa2\x95\x07\x64\x5e\x07\xce\xea\xc0\x59\x46\x54\xb0\x04\x8a\x47\xd5\xac\x98\xac\xd7\x3b\xc4\x5e\x60\x99\xa8\xe2\x89\xf8\x95\x64\xf1\x7a\x07\xf5\xbb\xa2\x90\x51\xbb\x18\x01\x19\xad\x27\x07\xcb\xbd\x81\x81\x1f\x70\x4a\xde\xa1\x7a\x5d\x77\xea\xbf\xd0\x2e\xcc\x51\x82\x56\xea\x1a\xa9\x4c\xb6\x6f\x1b\x0a\x4e\x9b\x70\xae\x36\x3d\x56\x50\x26\xbb\x46\x74\x65\x6c\xd2\x22\x4b\x28\x87\xfa\x5d\xd5\x94\xcc\x10\x27\xef\x50\xbd\xaa\x88\x0f\x4c\x8a\xb4\xfc\xa3\x55\x45\x36\x75\x08\xa3\x0e\x73\xd4\x12\xc7\x7f\x00\x0b\xbc\xc6\xac\x3a\x21\x12\xd0\xaa\x99\x02\x9a\xe3\x44\x9e\xf6\x08\x2b\xaa\x3f\x41\xa6\xea\x18\xab\xa0\x5d\x87\x60\x09\x59\x71\xb2\x5e\x43\xfd\xae\xea\xb8\xcb\x48\xb4\xb5\xa1\x7a\x55\xb9\x59\xbe\x66\x68\x03\xd5\xab\x91\x5b\x70\x92\xe4\x50\xbf\xab\xfc\xb7\xf7\x67\x92\xc6\xf4\x2d\x87\x55\xea\xe0\x18\xe2\x9d\xa4\x98\xc7\x50\xbd\xea\xdc\x2c\x83\x3f\x82\x7a\xdf\x57\x68\xbc\x89\xa2\x97\x94\xbe\x25\x38\xde\xc8\x4e\x91\x66\xf0\x5b\xfb\x98\x4b\x6d\xf3\x39\x6d\xa0\xf1\x7f\x01\x00\x00\xff\xff\x68\xed\x4b\x04\x22\x45\x00\x00") + +func namesCsvBytes() ([]byte, error) { + return bindataRead( + _namesCsv, + "names.csv", + ) +} + +func namesCsv() (*asset, error) { + bytes, err := namesCsvBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "names.csv", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +// Asset loads and returns the asset for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func Asset(name string) ([]byte, error) { + cannonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[cannonicalName]; ok { + a, err := f() + if err != nil { + return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) + } + return a.bytes, nil + } + return nil, fmt.Errorf("Asset %s not found", name) +} + +// MustAsset is like Asset but panics when Asset would return an error. +// It simplifies safe initialization of global variables. +func MustAsset(name string) []byte { + a, err := Asset(name) + if err != nil { + panic("asset: Asset(" + name + "): " + err.Error()) + } + + return a +} + +// AssetInfo loads and returns the asset info for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func AssetInfo(name string) (os.FileInfo, error) { + cannonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[cannonicalName]; ok { + a, err := f() + if err != nil { + return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) + } + return a.info, nil + } + return nil, fmt.Errorf("AssetInfo %s not found", name) +} + +// AssetNames returns the names of the assets. +func AssetNames() []string { + names := make([]string, 0, len(_bindata)) + for name := range _bindata { + names = append(names, name) + } + return names +} + +// _bindata is a table, holding each asset generator, mapped to its name. +var _bindata = map[string]func() (*asset, error){ + "licenses.tar": licensesTar, + "urls.csv": urlsCsv, + "names.csv": namesCsv, +} + +// AssetDir returns the file names below a certain +// directory embedded in the file by go-bindata. +// For example if you run go-bindata on data/... and data contains the +// following hierarchy: +// data/ +// foo.txt +// img/ +// a.png +// b.png +// then AssetDir("data") would return []string{"foo.txt", "img"} +// AssetDir("data/img") would return []string{"a.png", "b.png"} +// AssetDir("foo.txt") and AssetDir("notexist") would return an error +// AssetDir("") will return []string{"data"}. +func AssetDir(name string) ([]string, error) { + node := _bintree + if len(name) != 0 { + cannonicalName := strings.Replace(name, "\\", "/", -1) + pathList := strings.Split(cannonicalName, "/") + for _, p := range pathList { + node = node.Children[p] + if node == nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + } + } + if node.Func != nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + rv := make([]string, 0, len(node.Children)) + for childName := range node.Children { + rv = append(rv, childName) + } + return rv, nil +} + +type bintree struct { + Func func() (*asset, error) + Children map[string]*bintree +} +var _bintree = &bintree{nil, map[string]*bintree{ + "licenses.tar": &bintree{licensesTar, map[string]*bintree{}}, + "names.csv": &bintree{namesCsv, map[string]*bintree{}}, + "urls.csv": &bintree{urlsCsv, map[string]*bintree{}}, +}} + +// RestoreAsset restores an asset under the given directory +func RestoreAsset(dir, name string) error { + data, err := Asset(name) + if err != nil { + return err + } + info, err := AssetInfo(name) + if err != nil { + return err + } + err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) + if err != nil { + return err + } + err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) + if err != nil { + return err + } + err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) + if err != nil { + return err + } + return nil +} + +// RestoreAssets restores an asset under the given directory recursively +func RestoreAssets(dir, name string) error { + children, err := AssetDir(name) + // File + if err != nil { + return RestoreAsset(dir, name) + } + // Dir + for _, child := range children { + err = RestoreAssets(dir, filepath.Join(name, child)) + if err != nil { + return err + } + } + return nil +} + +func _filePath(dir, name string) string { + cannonicalName := strings.Replace(name, "\\", "/", -1) + return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...) +} + diff --git a/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/assets/extract_names.go b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/assets/extract_names.go similarity index 100% rename from vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/assets/extract_names.go rename to vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/assets/extract_names.go diff --git a/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/assets/extract_urls.go b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/assets/extract_urls.go similarity index 100% rename from vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/assets/extract_urls.go rename to vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/assets/extract_urls.go diff --git a/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/db.go b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/db.go similarity index 96% rename from vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/db.go rename to vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/db.go index 93b6c0392..aa60e5aef 100644 --- a/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/db.go +++ b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/db.go @@ -14,14 +14,14 @@ import ( "sort" "strings" - "github.com/ekzhu/minhash-lsh" + minhashlsh "github.com/ekzhu/minhash-lsh" "github.com/sergi/go-diff/diffmatchpatch" - "gopkg.in/src-d/go-license-detector.v2/licensedb/filer" - "gopkg.in/src-d/go-license-detector.v2/licensedb/internal/assets" - "gopkg.in/src-d/go-license-detector.v2/licensedb/internal/fastlog" - "gopkg.in/src-d/go-license-detector.v2/licensedb/internal/normalize" - "gopkg.in/src-d/go-license-detector.v2/licensedb/internal/wmh" + "github.com/go-enry/go-license-detector/v4/licensedb/filer" + "github.com/go-enry/go-license-detector/v4/licensedb/internal/assets" + "github.com/go-enry/go-license-detector/v4/licensedb/internal/fastlog" + "github.com/go-enry/go-license-detector/v4/licensedb/internal/normalize" + "github.com/go-enry/go-license-detector/v4/licensedb/internal/wmh" ) var ( @@ -413,8 +413,8 @@ func (db *database) scanForURLs(text string) map[string]bool { urlMatches := index.FindAllIndex(db.urlRe, -1) licenses := map[string]bool{} for _, match := range urlMatches { - url := string(byteText[match[0]:match[1]]) - licenses[db.urls[url]] = true + url := byteText[match[0]:match[1]] + licenses[db.urls[string(url)]] = true } return licenses } diff --git a/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/fastlog/fastlog.go b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/fastlog/fastlog.go similarity index 100% rename from vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/fastlog/fastlog.go rename to vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/fastlog/fastlog.go diff --git a/vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/investigation.go b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/investigation.go new file mode 100644 index 000000000..287dae153 --- /dev/null +++ b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/investigation.go @@ -0,0 +1,162 @@ +package internal + +import ( + "bytes" + "fmt" + paths "path" + "regexp" + "strings" + "sync" + + "github.com/go-enry/go-license-detector/v4/licensedb/api" + "github.com/go-enry/go-license-detector/v4/licensedb/filer" + "github.com/go-enry/go-license-detector/v4/licensedb/internal/processors" +) + +var ( + globalLicenseDB struct { + sync.Once + *database + } + globalLicenseDatabase = func() *database { + globalLicenseDB.Once.Do(func() { + globalLicenseDB.database = loadLicenses() + }) + return globalLicenseDB.database + } + + // Base names of guessable license files + licenseFileNames = []string{ + "li[cs]en[cs]e(s?)", + "legal", + "copy(left|right|ing)", + "unlicense", + "l?gpl([-_ v]?)(\\d\\.?\\d)?", + "bsd", + "mit", + "apache", + } + + // License file extensions. Combined with the fileNames slice + // to create a set of files we can reasonably assume contain + // licensing information. + fileExtensions = []string{ + "", + ".md", + ".rst", + ".html", + ".txt", + } + + filePreprocessors = map[string]func([]byte) []byte{ + ".md": processors.Markdown, + ".rst": processors.RestructuredText, + ".html": processors.HTML, + } + + licenseFileRe = regexp.MustCompile( + fmt.Sprintf("^(|.*[-_. ])(%s)(|[-_. ].*)$", + strings.Join(licenseFileNames, "|"))) + + readmeFileRe = regexp.MustCompile(fmt.Sprintf("^(readme|guidelines)(%s)$", + strings.Replace(strings.Join(fileExtensions, "|"), ".", "\\.", -1))) + + licenseDirectoryRe = regexp.MustCompile(fmt.Sprintf( + "^(%s)$", strings.Join(licenseFileNames, "|"))) +) + +func investigateCandidates(candidates map[string][]byte, f func(text []byte) map[string]float32) map[string]api.Match { + matches := make(map[string]api.Match) + for file, text := range candidates { + candidates := f(text) + for name, sim := range candidates { + match := matches[name] + if match.Files == nil { + match.Files = make(map[string]float32) + } + match.Files[file] = sim + if sim > match.Confidence { + match.Confidence = sim + } + matches[name] = match + } + } + return matches +} + +// ExtractLicenseFiles returns the list of possible license texts. +// The file names are matched against the template. +// Reader is used to to read file contents. +func ExtractLicenseFiles(files []string, fs filer.Filer) map[string][]byte { + candidates := make(map[string][]byte) + for _, file := range files { + if licenseFileRe.MatchString(strings.ToLower(paths.Base(file))) { + text, err := fs.ReadFile(file) + if len(text) < 128 { + // e.g. https://github.com/Unitech/pm2/blob/master/LICENSE + realText, err := fs.ReadFile(string(bytes.TrimSpace(text))) + if err == nil { + file = string(bytes.TrimSpace(text)) + text = realText + } + } + if err == nil { + if preprocessor, exists := filePreprocessors[paths.Ext(file)]; exists { + text = preprocessor(text) + } + candidates[file] = text + } + } + } + return candidates +} + +// InvestigateLicenseTexts takes the list of candidate license texts and returns the most probable +// reference licenses matched. Each match has the confidence assigned, from 0 to 1, 1 means 100% confident. +// Furthermore, each match contains a mapping of filename to the confidence that file produced. +func InvestigateLicenseTexts(candidates map[string][]byte) map[string]api.Match { + return investigateCandidates(candidates, InvestigateLicenseText) +} + +// InvestigateLicenseText takes the license text and returns the most probable reference licenses matched. +// Each match has the confidence assigned, from 0 to 1, 1 means 100% confident. +func InvestigateLicenseText(text []byte) map[string]float32 { + return globalLicenseDatabase().QueryLicenseText(string(text)) +} + +// ExtractReadmeFiles searches for README files. +// Reader is used to to read file contents. +func ExtractReadmeFiles(files []string, fs filer.Filer) map[string][]byte { + candidates := make(map[string][]byte) + for _, file := range files { + if readmeFileRe.MatchString(strings.ToLower(file)) { + text, err := fs.ReadFile(file) + if err == nil { + if preprocessor, exists := filePreprocessors[paths.Ext(file)]; exists { + text = preprocessor(text) + } + candidates[file] = text + } + } + } + return candidates +} + +// InvestigateReadmeTexts scans README files for licensing information and outputs the +// probable names using NER. +func InvestigateReadmeTexts(candidtes map[string][]byte, fs filer.Filer) map[string]api.Match { + return investigateCandidates(candidtes, func(text []byte) map[string]float32 { + return InvestigateReadmeText(text, fs) + }) +} + +// InvestigateReadmeText scans the README file for licensing information and outputs probable +// names found with Named Entity Recognition from NLP. +func InvestigateReadmeText(text []byte, fs filer.Filer) map[string]float32 { + return globalLicenseDatabase().QueryReadmeText(string(text), fs) +} + +// IsLicenseDirectory indicates whether the directory is likely to contain licenses. +func IsLicenseDirectory(fileName string) bool { + return licenseDirectoryRe.MatchString(strings.ToLower(fileName)) +} diff --git a/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/nlp.go b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/nlp.go similarity index 87% rename from vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/nlp.go rename to vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/nlp.go index 9122fd7a8..11afd62ce 100644 --- a/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/nlp.go +++ b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/nlp.go @@ -11,12 +11,12 @@ import ( ) var ( - licenseMarkReadmeRe = regexp.MustCompile("(?i)(copy(right|ing))|\\(c\\)|©|(licen[cs][ei])|released under") - garbageReadmeRe = regexp.MustCompile("([Cc]opy(right|ing))|\\(c\\)|©") - licenseReadmeRe = regexp.MustCompile("\\s*[Ll]icen[cs]e\\s*") - licenseNamePartRe = regexp.MustCompile("([a-z]+)|([0-9]+)") - digitsRe = regexp.MustCompile("[0-9]+") - disabledNamePartsRe = regexp.MustCompile("clause|or|only|deprecated|later") + licenseMarkReadmeRe = regexp.MustCompile(`(?i)(copy(right|ing))|\(c\)|©|(licen[cs][ei])|released under`) + garbageReadmeRe = regexp.MustCompile(`([Cc]opy(right|ing))|\(c\)|©`) + licenseReadmeRe = regexp.MustCompile(`\s*[Ll]icen[cs]e\s*`) + licenseNamePartRe = regexp.MustCompile(`([a-z]+)|([0-9]+)`) + digitsRe = regexp.MustCompile(`[0-9]+`) + disabledNamePartsRe = regexp.MustCompile(`clause|or|only|deprecated|later`) tagger = tag.NewPerceptronTagger() ) @@ -40,7 +40,7 @@ func investigateReadmeFile( endIndex := matches[len(matches)-1][1] for ; endIndex < len(text)-1 && text[endIndex:endIndex+2] != "\n\n"; endIndex++ { } - candidates := globalLicenseDatabase.QueryLicenseText(text[beginIndex:endIndex]) + candidates := globalLicenseDatabase().QueryLicenseText(text[beginIndex:endIndex]) beginIndex = matches[0][0] endIndex = beginIndex + 50 diff --git a/vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/normalize/normalize.go b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/normalize/normalize.go new file mode 100644 index 000000000..0598a4203 --- /dev/null +++ b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/normalize/normalize.go @@ -0,0 +1,195 @@ +package normalize + +import ( + "bytes" + "regexp" + "strings" + "unicode" + + "golang.org/x/text/runes" + "golang.org/x/text/transform" + "golang.org/x/text/unicode/norm" +) + +var ( + lineEndingsRe = regexp.MustCompile(`\r\n?`) + // 3.1.1 All whitespace should be treated as a single blank space. + whitespaceRe = regexp.MustCompile(`[ \t\f\r              ​]+`) + trailingWhitespaceRe = regexp.MustCompile(`(?m)[ \t\f\r              ​]$`) + licenseHeaderRe = regexp.MustCompile(`(licen[cs]e)\.?\n\n`) + leadingWhitespaceRe = regexp.MustCompile(`(?m)^(( \n?)|\n)`) + // 5.1.2 Hyphens, Dashes Any hyphen, dash, en dash, em dash, or other variation should be + // considered equivalent. + punctuationRe = regexp.MustCompile(`[-‒–—―⁓⸺⸻~˗‐‑⁃⁻₋−∼⎯⏤─➖𐆑֊﹘﹣-]+`) + // 5.1.3 Quotes Any variation of quotations (single, double, curly, etc.) should be considered + // equivalent. + quotesRe = regexp.MustCompile(`["'“”‘’„‚«»‹›❛❜❝❞\x60]+`) + // 7.1.1 Where a line starts with a bullet, number, letter, or some form of a list item + // (determined where list item is followed by a space, then the text of the sentence), ignore + // the list item for matching purposes. + bulletRe = regexp.MustCompile(`(?m)^(([-*✱﹡•●⚫⏺🞄∙⋅])|([(\[{]?\d+[.)\]}] ?)|([(\[{]?[a-z][.)\]}] ?)|([(\[{]?i+[.)\]} ] ?))`) + // 8.1.1 The words in the following columns are considered equivalent and interchangeable. + wordReplacer = strings.NewReplacer( + "acknowledgment", "acknowledgement", + "analogue", "analog", + "analyse", "analyze", + "artefact", "artifact", + "authorisation", "authorization", + "authorised", "authorized", + "calibre", "caliber", + "cancelled", "canceled", + "capitalisations", "capitalizations", + "catalogue", "catalog", + "categorise", "categorize", + "centre", "center", + "emphasised", "emphasized", + "favour", "favor", + "favourite", "favorite", + "fulfil", "fulfill", + "fulfilment", "fulfillment", + "initialise", "initialize", + "judgment", "judgement", + "labelling", "labeling", + "labour", "labor", + "licence", "license", + "maximise", "maximize", + "modelled", "modeled", + "modelling", "modeling", + "offence", "offense", + "optimise", "optimize", + "organisation", "organization", + "organise", "organize", + "practise", "practice", + "programme", "program", + "realise", "realize", + "recognise", "recognize", + "signalling", "signaling", + "sub-license", "sublicense", + "sub license", "sub-license", + "utilisation", "utilization", + "whilst", "while", + "wilful", "wilfull", + "non-commercial", "noncommercial", + "per cent", "percent", + "copyright owner", "copyright", + ) + + // 9.1.1 "©", "(c)", or "Copyright" should be considered equivalent and interchangeable. + copyrightRe = regexp.MustCompile(`copyright|\(c\)`) + trademarkRe = regexp.MustCompile(`trademark(s?)|\(tm\)`) + + // extra cleanup + brokenLinkRe = regexp.MustCompile(`http s ://`) + urlCleanupRe = regexp.MustCompile(`[<(](http(s?)://[^\s]+)[)>]`) + copyrightLineRe = regexp.MustCompile(`(?m)^((©.*)|(all rights reserved(\.)?)|(li[cs]en[cs]e))\n`) + nonAlphaNumRe = regexp.MustCompile(`[^- \na-z0-9]`) + + // used in Split() + splitRe = regexp.MustCompile(`\n\s*[^a-zA-Z0-9_,()]{3,}\s*\n`) +) + +// Strictness represents the aggressiveness of the performed normalization. The bigger the number, +// the more aggressive. See `Enforced`, `Moderate` and `Relaxed`. +type Strictness int + +const ( + // Enforced is the strictest mode - only the official SPDX guidelines are applied. + Enforced Strictness = 0 + // Moderate is equivalent to Enforced with some additional normalization: dots are removed, copyright lines too. + Moderate Strictness = 1 + // Relaxed is the most powerful normalization, Moderate + Unicode normalization and all non-alphanumeric chars removed. + Relaxed Strictness = 2 +) + +// LicenseText makes a license text ready for analysis. +// It follows SPDX guidelines at +// https://spdx.org/spdx-license-list/matching-guidelines +func LicenseText(text string, strictness Strictness) string { + // Line endings + text = lineEndingsRe.ReplaceAllString(text, "\n") + + // 4. Capitalization + text = strings.ToLower(text) + + // 3. Whitespace + text = whitespaceRe.ReplaceAllString(text, " ") + text = trailingWhitespaceRe.ReplaceAllString(text, "") + text = licenseHeaderRe.ReplaceAllString(text, "$1\nthisislikelyalicenseheaderplaceholder\n") + text = leadingWhitespaceRe.ReplaceAllString(text, "") + + // 5. Punctuation + text = punctuationRe.ReplaceAllString(text, "-") + text = quotesRe.ReplaceAllString(text, "\"") + + // 7. Bullets and Numbering + text = bulletRe.ReplaceAllString(text, "") + + // 8. Varietal Word Spelling + text = wordReplacer.Replace(text) + + // 9. Copyright Symbol + text = copyrightRe.ReplaceAllString(text, "©") + text = trademarkRe.ReplaceAllString(text, "™") + + // fix broken URLs in SPDX source texts + text = brokenLinkRe.ReplaceAllString(text, "https://") + + // fix URLs in <> - erase the decoration + text = urlCleanupRe.ReplaceAllString(text, "$1") + + // collapse several non-alphanumeric characters + { + buffer := &bytes.Buffer{} + back := '\x00' + for _, char := range text { + if !unicode.IsLetter(char) && !unicode.IsDigit(char) && back == char { + continue + } + back = char + buffer.WriteRune(char) + } + text = buffer.String() + } + + if strictness > Enforced { + // there are common mismatches because of trailing dots + text = strings.Replace(text, ".", "", -1) + // usually copyright lines are custom and occur multiple times + text = copyrightLineRe.ReplaceAllString(text, "") + } + + if strictness > Moderate { + return Relax(text) + } + + text = leadingWhitespaceRe.ReplaceAllString(text, "") + text = strings.Replace(text, "thisislikelyalicenseheaderplaceholder", "", -1) + + return text +} + +// Relax applies very aggressive normalization rules to text. +func Relax(text string) string { + buffer := &bytes.Buffer{} + writer := transform.NewWriter( + buffer, transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC)) + _, _ = writer.Write([]byte(text)) + _ = writer.Close() + text = buffer.String() + text = nonAlphaNumRe.ReplaceAllString(text, "") + text = leadingWhitespaceRe.ReplaceAllString(text, "") + text = strings.Replace(text, " ", " ", -1) + return text +} + +// Split applies heuristics to split the text into several parts +func Split(text string) []string { + result := []string{text} + + // Always add the full text + splitted := splitRe.Split(text, -1) + if len(splitted) > 1 { + result = append(result, splitted...) + } + return result +} diff --git a/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/processors/html2text.go b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/processors/html2text.go similarity index 94% rename from vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/processors/html2text.go rename to vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/processors/html2text.go index cc1b281ea..71aa4a090 100644 --- a/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/processors/html2text.go +++ b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/processors/html2text.go @@ -11,9 +11,9 @@ import ( var ( skipHTMLRe = regexp.MustCompile(`^(head|script|style|object)$`) - htmlHeaderRe = regexp.MustCompile("^h[2-6]$") - htmlEntityRe = regexp.MustCompile("&((#\\d+)|([a-zA-Z]+));") - marksRe = regexp.MustCompile("[#$%*/\\\\|><~`=!?.,:;\"'\\])}-]") + htmlHeaderRe = regexp.MustCompile(`^h[2-6]$`) + htmlEntityRe = regexp.MustCompile(`&((#\\d+)|([a-zA-Z]+));`) + marksRe = regexp.MustCompile(`[#$%*\/\\|><~\x60=!?.,:;\"'\])}-]`) ) func parseHTMLEntity(entName []byte) []byte { diff --git a/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/processors/markup.go b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/processors/markup.go similarity index 89% rename from vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/processors/markup.go rename to vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/processors/markup.go index 4d0de0011..a863578c9 100644 --- a/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/processors/markup.go +++ b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/processors/markup.go @@ -3,8 +3,8 @@ package processors import ( "bytes" - "github.com/hhatto/gorst" - "gopkg.in/russross/blackfriday.v2" + rst "github.com/hhatto/gorst" + "github.com/russross/blackfriday/v2" ) // Markdown converts Markdown to plain text. It tries to revert all the decorations. diff --git a/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/wmh/wmh.go b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/wmh/wmh.go similarity index 98% rename from vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/wmh/wmh.go rename to vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/wmh/wmh.go index 8e660a248..9dd6e3931 100644 --- a/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/wmh/wmh.go +++ b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/internal/wmh/wmh.go @@ -8,9 +8,9 @@ import ( "reflect" "unsafe" + "github.com/go-enry/go-license-detector/v4/licensedb/internal/fastlog" "golang.org/x/exp/rand" "gonum.org/v1/gonum/stat/distuv" - "gopkg.in/src-d/go-license-detector.v2/licensedb/internal/fastlog" ) const maxUint16 = 65535 diff --git a/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/licensedb.go b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/licensedb.go similarity index 84% rename from vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/licensedb.go rename to vendor/github.com/go-enry/go-license-detector/v4/licensedb/licensedb.go index f52488481..55670ce57 100644 --- a/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/licensedb.go +++ b/vendor/github.com/go-enry/go-license-detector/v4/licensedb/licensedb.go @@ -4,8 +4,9 @@ import ( "errors" paths "path" - "gopkg.in/src-d/go-license-detector.v2/licensedb/filer" - "gopkg.in/src-d/go-license-detector.v2/licensedb/internal" + "github.com/go-enry/go-license-detector/v4/licensedb/api" + "github.com/go-enry/go-license-detector/v4/licensedb/filer" + "github.com/go-enry/go-license-detector/v4/licensedb/internal" ) var ( @@ -15,7 +16,7 @@ var ( // Detect returns the most probable reference licenses matched for the given // file tree. Each match has the confidence assigned, from 0 to 1, 1 means 100% confident. -func Detect(fs filer.Filer) (map[string]float32, error) { +func Detect(fs filer.Filer) (map[string]api.Match, error) { files, err := fs.ReadDir("") if err != nil { return nil, err diff --git a/vendor/github.com/go-git/gcfg/LICENSE b/vendor/github.com/go-git/gcfg/LICENSE new file mode 100644 index 000000000..87a5cede3 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2012 Péter Surányi. Portions Copyright (c) 2009 The Go +Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/go-git/gcfg/README b/vendor/github.com/go-git/gcfg/README new file mode 100644 index 000000000..1ff233a52 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/README @@ -0,0 +1,4 @@ +Gcfg reads INI-style configuration files into Go structs; +supports user-defined types and subsections. + +Package docs: https://godoc.org/gopkg.in/gcfg.v1 diff --git a/vendor/github.com/go-git/gcfg/doc.go b/vendor/github.com/go-git/gcfg/doc.go new file mode 100644 index 000000000..7bdefbf02 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/doc.go @@ -0,0 +1,145 @@ +// Package gcfg reads "INI-style" text-based configuration files with +// "name=value" pairs grouped into sections (gcfg files). +// +// This package is still a work in progress; see the sections below for planned +// changes. +// +// Syntax +// +// The syntax is based on that used by git config: +// http://git-scm.com/docs/git-config#_syntax . +// There are some (planned) differences compared to the git config format: +// - improve data portability: +// - must be encoded in UTF-8 (for now) and must not contain the 0 byte +// - include and "path" type is not supported +// (path type may be implementable as a user-defined type) +// - internationalization +// - section and variable names can contain unicode letters, unicode digits +// (as defined in http://golang.org/ref/spec#Characters ) and hyphens +// (U+002D), starting with a unicode letter +// - disallow potentially ambiguous or misleading definitions: +// - `[sec.sub]` format is not allowed (deprecated in gitconfig) +// - `[sec ""]` is not allowed +// - use `[sec]` for section name "sec" and empty subsection name +// - (planned) within a single file, definitions must be contiguous for each: +// - section: '[secA]' -> '[secB]' -> '[secA]' is an error +// - subsection: '[sec "A"]' -> '[sec "B"]' -> '[sec "A"]' is an error +// - multivalued variable: 'multi=a' -> 'other=x' -> 'multi=b' is an error +// +// Data structure +// +// The functions in this package read values into a user-defined struct. +// Each section corresponds to a struct field in the config struct, and each +// variable in a section corresponds to a data field in the section struct. +// The mapping of each section or variable name to fields is done either based +// on the "gcfg" struct tag or by matching the name of the section or variable, +// ignoring case. In the latter case, hyphens '-' in section and variable names +// correspond to underscores '_' in field names. +// Fields must be exported; to use a section or variable name starting with a +// letter that is neither upper- or lower-case, prefix the field name with 'X'. +// (See https://code.google.com/p/go/issues/detail?id=5763#c4 .) +// +// For sections with subsections, the corresponding field in config must be a +// map, rather than a struct, with string keys and pointer-to-struct values. +// Values for subsection variables are stored in the map with the subsection +// name used as the map key. +// (Note that unlike section and variable names, subsection names are case +// sensitive.) +// When using a map, and there is a section with the same section name but +// without a subsection name, its values are stored with the empty string used +// as the key. +// It is possible to provide default values for subsections in the section +// "default-" (or by setting values in the corresponding struct +// field "Default_"). +// +// The functions in this package panic if config is not a pointer to a struct, +// or when a field is not of a suitable type (either a struct or a map with +// string keys and pointer-to-struct values). +// +// Parsing of values +// +// The section structs in the config struct may contain single-valued or +// multi-valued variables. Variables of unnamed slice type (that is, a type +// starting with `[]`) are treated as multi-value; all others (including named +// slice types) are treated as single-valued variables. +// +// Single-valued variables are handled based on the type as follows. +// Unnamed pointer types (that is, types starting with `*`) are dereferenced, +// and if necessary, a new instance is allocated. +// +// For types implementing the encoding.TextUnmarshaler interface, the +// UnmarshalText method is used to set the value. Implementing this method is +// the recommended way for parsing user-defined types. +// +// For fields of string kind, the value string is assigned to the field, after +// unquoting and unescaping as needed. +// For fields of bool kind, the field is set to true if the value is "true", +// "yes", "on" or "1", and set to false if the value is "false", "no", "off" or +// "0", ignoring case. In addition, single-valued bool fields can be specified +// with a "blank" value (variable name without equals sign and value); in such +// case the value is set to true. +// +// Predefined integer types [u]int(|8|16|32|64) and big.Int are parsed as +// decimal or hexadecimal (if having '0x' prefix). (This is to prevent +// unintuitively handling zero-padded numbers as octal.) Other types having +// [u]int* as the underlying type, such as os.FileMode and uintptr allow +// decimal, hexadecimal, or octal values. +// Parsing mode for integer types can be overridden using the struct tag option +// ",int=mode" where mode is a combination of the 'd', 'h', and 'o' characters +// (each standing for decimal, hexadecimal, and octal, respectively.) +// +// All other types are parsed using fmt.Sscanf with the "%v" verb. +// +// For multi-valued variables, each individual value is parsed as above and +// appended to the slice. If the first value is specified as a "blank" value +// (variable name without equals sign and value), a new slice is allocated; +// that is any values previously set in the slice will be ignored. +// +// The types subpackage for provides helpers for parsing "enum-like" and integer +// types. +// +// Error handling +// +// There are 3 types of errors: +// +// - programmer errors / panics: +// - invalid configuration structure +// - data errors: +// - fatal errors: +// - invalid configuration syntax +// - warnings: +// - data that doesn't belong to any part of the config structure +// +// Programmer errors trigger panics. These are should be fixed by the programmer +// before releasing code that uses gcfg. +// +// Data errors cause gcfg to return a non-nil error value. This includes the +// case when there are extra unknown key-value definitions in the configuration +// data (extra data). +// However, in some occasions it is desirable to be able to proceed in +// situations when the only data error is that of extra data. +// These errors are handled at a different (warning) priority and can be +// filtered out programmatically. To ignore extra data warnings, wrap the +// gcfg.Read*Into invocation into a call to gcfg.FatalOnly. +// +// TODO +// +// The following is a list of changes under consideration: +// - documentation +// - self-contained syntax documentation +// - more practical examples +// - move TODOs to issue tracker (eventually) +// - syntax +// - reconsider valid escape sequences +// (gitconfig doesn't support \r in value, \t in subsection name, etc.) +// - reading / parsing gcfg files +// - define internal representation structure +// - support multiple inputs (readers, strings, files) +// - support declaring encoding (?) +// - support varying fields sets for subsections (?) +// - writing gcfg files +// - error handling +// - make error context accessible programmatically? +// - limit input size? +// +package gcfg // import "github.com/go-git/gcfg" diff --git a/vendor/github.com/go-git/gcfg/errors.go b/vendor/github.com/go-git/gcfg/errors.go new file mode 100644 index 000000000..853c76021 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/errors.go @@ -0,0 +1,41 @@ +package gcfg + +import ( + "gopkg.in/warnings.v0" +) + +// FatalOnly filters the results of a Read*Into invocation and returns only +// fatal errors. That is, errors (warnings) indicating data for unknown +// sections / variables is ignored. Example invocation: +// +// err := gcfg.FatalOnly(gcfg.ReadFileInto(&cfg, configFile)) +// if err != nil { +// ... +// +func FatalOnly(err error) error { + return warnings.FatalOnly(err) +} + +func isFatal(err error) bool { + _, ok := err.(extraData) + return !ok +} + +type extraData struct { + section string + subsection *string + variable *string +} + +func (e extraData) Error() string { + s := "can't store data at section \"" + e.section + "\"" + if e.subsection != nil { + s += ", subsection \"" + *e.subsection + "\"" + } + if e.variable != nil { + s += ", variable \"" + *e.variable + "\"" + } + return s +} + +var _ error = extraData{} diff --git a/vendor/github.com/go-git/gcfg/go1_0.go b/vendor/github.com/go-git/gcfg/go1_0.go new file mode 100644 index 000000000..667021079 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/go1_0.go @@ -0,0 +1,7 @@ +// +build !go1.2 + +package gcfg + +type textUnmarshaler interface { + UnmarshalText(text []byte) error +} diff --git a/vendor/github.com/go-git/gcfg/go1_2.go b/vendor/github.com/go-git/gcfg/go1_2.go new file mode 100644 index 000000000..6f5843bc7 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/go1_2.go @@ -0,0 +1,9 @@ +// +build go1.2 + +package gcfg + +import ( + "encoding" +) + +type textUnmarshaler encoding.TextUnmarshaler diff --git a/vendor/github.com/go-git/gcfg/read.go b/vendor/github.com/go-git/gcfg/read.go new file mode 100644 index 000000000..4dfdc5cf3 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/read.go @@ -0,0 +1,273 @@ +package gcfg + +import ( + "fmt" + "io" + "io/ioutil" + "os" + "strings" + + "github.com/go-git/gcfg/scanner" + "github.com/go-git/gcfg/token" + "gopkg.in/warnings.v0" +) + +var unescape = map[rune]rune{'\\': '\\', '"': '"', 'n': '\n', 't': '\t', 'b': '\b'} + +// no error: invalid literals should be caught by scanner +func unquote(s string) string { + u, q, esc := make([]rune, 0, len(s)), false, false + for _, c := range s { + if esc { + uc, ok := unescape[c] + switch { + case ok: + u = append(u, uc) + fallthrough + case !q && c == '\n': + esc = false + continue + } + panic("invalid escape sequence") + } + switch c { + case '"': + q = !q + case '\\': + esc = true + default: + u = append(u, c) + } + } + if q { + panic("missing end quote") + } + if esc { + panic("invalid escape sequence") + } + return string(u) +} + +func read(c *warnings.Collector, callback func(string, string, string, string, bool) error, + fset *token.FileSet, file *token.File, src []byte) error { + // + var s scanner.Scanner + var errs scanner.ErrorList + s.Init(file, src, func(p token.Position, m string) { errs.Add(p, m) }, 0) + sect, sectsub := "", "" + pos, tok, lit := s.Scan() + errfn := func(msg string) error { + return fmt.Errorf("%s: %s", fset.Position(pos), msg) + } + for { + if errs.Len() > 0 { + if err := c.Collect(errs.Err()); err != nil { + return err + } + } + switch tok { + case token.EOF: + return nil + case token.EOL, token.COMMENT: + pos, tok, lit = s.Scan() + case token.LBRACK: + pos, tok, lit = s.Scan() + if errs.Len() > 0 { + if err := c.Collect(errs.Err()); err != nil { + return err + } + } + if tok != token.IDENT { + if err := c.Collect(errfn("expected section name")); err != nil { + return err + } + } + sect, sectsub = lit, "" + pos, tok, lit = s.Scan() + if errs.Len() > 0 { + if err := c.Collect(errs.Err()); err != nil { + return err + } + } + if tok == token.STRING { + sectsub = unquote(lit) + if sectsub == "" { + if err := c.Collect(errfn("empty subsection name")); err != nil { + return err + } + } + pos, tok, lit = s.Scan() + if errs.Len() > 0 { + if err := c.Collect(errs.Err()); err != nil { + return err + } + } + } + if tok != token.RBRACK { + if sectsub == "" { + if err := c.Collect(errfn("expected subsection name or right bracket")); err != nil { + return err + } + } + if err := c.Collect(errfn("expected right bracket")); err != nil { + return err + } + } + pos, tok, lit = s.Scan() + if tok != token.EOL && tok != token.EOF && tok != token.COMMENT { + if err := c.Collect(errfn("expected EOL, EOF, or comment")); err != nil { + return err + } + } + // If a section/subsection header was found, ensure a + // container object is created, even if there are no + // variables further down. + err := c.Collect(callback(sect, sectsub, "", "", true)) + if err != nil { + return err + } + case token.IDENT: + if sect == "" { + if err := c.Collect(errfn("expected section header")); err != nil { + return err + } + } + n := lit + pos, tok, lit = s.Scan() + if errs.Len() > 0 { + return errs.Err() + } + blank, v := tok == token.EOF || tok == token.EOL || tok == token.COMMENT, "" + if !blank { + if tok != token.ASSIGN { + if err := c.Collect(errfn("expected '='")); err != nil { + return err + } + } + pos, tok, lit = s.Scan() + if errs.Len() > 0 { + if err := c.Collect(errs.Err()); err != nil { + return err + } + } + if tok != token.STRING { + if err := c.Collect(errfn("expected value")); err != nil { + return err + } + } + v = unquote(lit) + pos, tok, lit = s.Scan() + if errs.Len() > 0 { + if err := c.Collect(errs.Err()); err != nil { + return err + } + } + if tok != token.EOL && tok != token.EOF && tok != token.COMMENT { + if err := c.Collect(errfn("expected EOL, EOF, or comment")); err != nil { + return err + } + } + } + err := c.Collect(callback(sect, sectsub, n, v, blank)) + if err != nil { + return err + } + default: + if sect == "" { + if err := c.Collect(errfn("expected section header")); err != nil { + return err + } + } + if err := c.Collect(errfn("expected section header or variable declaration")); err != nil { + return err + } + } + } + panic("never reached") +} + +func readInto(config interface{}, fset *token.FileSet, file *token.File, + src []byte) error { + // + c := warnings.NewCollector(isFatal) + firstPassCallback := func(s string, ss string, k string, v string, bv bool) error { + return set(c, config, s, ss, k, v, bv, false) + } + err := read(c, firstPassCallback, fset, file, src) + if err != nil { + return err + } + secondPassCallback := func(s string, ss string, k string, v string, bv bool) error { + return set(c, config, s, ss, k, v, bv, true) + } + err = read(c, secondPassCallback, fset, file, src) + if err != nil { + return err + } + return c.Done() +} + +// ReadWithCallback reads gcfg formatted data from reader and calls +// callback with each section and option found. +// +// Callback is called with section, subsection, option key, option value +// and blank value flag as arguments. +// +// When a section is found, callback is called with nil subsection, option key +// and option value. +// +// When a subsection is found, callback is called with nil option key and +// option value. +// +// If blank value flag is true, it means that the value was not set for an option +// (as opposed to set to empty string). +// +// If callback returns an error, ReadWithCallback terminates with an error too. +func ReadWithCallback(reader io.Reader, callback func(string, string, string, string, bool) error) error { + src, err := ioutil.ReadAll(reader) + if err != nil { + return err + } + + fset := token.NewFileSet() + file := fset.AddFile("", fset.Base(), len(src)) + c := warnings.NewCollector(isFatal) + + return read(c, callback, fset, file, src) +} + +// ReadInto reads gcfg formatted data from reader and sets the values into the +// corresponding fields in config. +func ReadInto(config interface{}, reader io.Reader) error { + src, err := ioutil.ReadAll(reader) + if err != nil { + return err + } + fset := token.NewFileSet() + file := fset.AddFile("", fset.Base(), len(src)) + return readInto(config, fset, file, src) +} + +// ReadStringInto reads gcfg formatted data from str and sets the values into +// the corresponding fields in config. +func ReadStringInto(config interface{}, str string) error { + r := strings.NewReader(str) + return ReadInto(config, r) +} + +// ReadFileInto reads gcfg formatted data from the file filename and sets the +// values into the corresponding fields in config. +func ReadFileInto(config interface{}, filename string) error { + f, err := os.Open(filename) + if err != nil { + return err + } + defer f.Close() + src, err := ioutil.ReadAll(f) + if err != nil { + return err + } + fset := token.NewFileSet() + file := fset.AddFile(filename, fset.Base(), len(src)) + return readInto(config, fset, file, src) +} diff --git a/vendor/github.com/go-git/gcfg/scanner/errors.go b/vendor/github.com/go-git/gcfg/scanner/errors.go new file mode 100644 index 000000000..a6e00f5c6 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/scanner/errors.go @@ -0,0 +1,121 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package scanner + +import ( + "fmt" + "io" + "sort" +) + +import ( + "github.com/go-git/gcfg/token" +) + +// In an ErrorList, an error is represented by an *Error. +// The position Pos, if valid, points to the beginning of +// the offending token, and the error condition is described +// by Msg. +// +type Error struct { + Pos token.Position + Msg string +} + +// Error implements the error interface. +func (e Error) Error() string { + if e.Pos.Filename != "" || e.Pos.IsValid() { + // don't print "" + // TODO(gri) reconsider the semantics of Position.IsValid + return e.Pos.String() + ": " + e.Msg + } + return e.Msg +} + +// ErrorList is a list of *Errors. +// The zero value for an ErrorList is an empty ErrorList ready to use. +// +type ErrorList []*Error + +// Add adds an Error with given position and error message to an ErrorList. +func (p *ErrorList) Add(pos token.Position, msg string) { + *p = append(*p, &Error{pos, msg}) +} + +// Reset resets an ErrorList to no errors. +func (p *ErrorList) Reset() { *p = (*p)[0:0] } + +// ErrorList implements the sort Interface. +func (p ErrorList) Len() int { return len(p) } +func (p ErrorList) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + +func (p ErrorList) Less(i, j int) bool { + e := &p[i].Pos + f := &p[j].Pos + if e.Filename < f.Filename { + return true + } + if e.Filename == f.Filename { + return e.Offset < f.Offset + } + return false +} + +// Sort sorts an ErrorList. *Error entries are sorted by position, +// other errors are sorted by error message, and before any *Error +// entry. +// +func (p ErrorList) Sort() { + sort.Sort(p) +} + +// RemoveMultiples sorts an ErrorList and removes all but the first error per line. +func (p *ErrorList) RemoveMultiples() { + sort.Sort(p) + var last token.Position // initial last.Line is != any legal error line + i := 0 + for _, e := range *p { + if e.Pos.Filename != last.Filename || e.Pos.Line != last.Line { + last = e.Pos + (*p)[i] = e + i++ + } + } + (*p) = (*p)[0:i] +} + +// An ErrorList implements the error interface. +func (p ErrorList) Error() string { + switch len(p) { + case 0: + return "no errors" + case 1: + return p[0].Error() + } + return fmt.Sprintf("%s (and %d more errors)", p[0], len(p)-1) +} + +// Err returns an error equivalent to this error list. +// If the list is empty, Err returns nil. +func (p ErrorList) Err() error { + if len(p) == 0 { + return nil + } + return p +} + +// PrintError is a utility function that prints a list of errors to w, +// one error per line, if the err parameter is an ErrorList. Otherwise +// it prints the err string. +// +func PrintError(w io.Writer, err error) { + if list, ok := err.(ErrorList); ok { + for _, e := range list { + fmt.Fprintf(w, "%s\n", e) + } + } else if err != nil { + fmt.Fprintf(w, "%s\n", err) + } +} diff --git a/vendor/github.com/go-git/gcfg/scanner/scanner.go b/vendor/github.com/go-git/gcfg/scanner/scanner.go new file mode 100644 index 000000000..41aafec75 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/scanner/scanner.go @@ -0,0 +1,342 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package scanner implements a scanner for gcfg configuration text. +// It takes a []byte as source which can then be tokenized +// through repeated calls to the Scan method. +// +// Note that the API for the scanner package may change to accommodate new +// features or implementation changes in gcfg. +// +package scanner + +import ( + "fmt" + "path/filepath" + "unicode" + "unicode/utf8" +) + +import ( + "github.com/go-git/gcfg/token" +) + +// An ErrorHandler may be provided to Scanner.Init. If a syntax error is +// encountered and a handler was installed, the handler is called with a +// position and an error message. The position points to the beginning of +// the offending token. +// +type ErrorHandler func(pos token.Position, msg string) + +// A Scanner holds the scanner's internal state while processing +// a given text. It can be allocated as part of another data +// structure but must be initialized via Init before use. +// +type Scanner struct { + // immutable state + file *token.File // source file handle + dir string // directory portion of file.Name() + src []byte // source + err ErrorHandler // error reporting; or nil + mode Mode // scanning mode + + // scanning state + ch rune // current character + offset int // character offset + rdOffset int // reading offset (position after current character) + lineOffset int // current line offset + nextVal bool // next token is expected to be a value + + // public state - ok to modify + ErrorCount int // number of errors encountered +} + +// Read the next Unicode char into s.ch. +// s.ch < 0 means end-of-file. +// +func (s *Scanner) next() { + if s.rdOffset < len(s.src) { + s.offset = s.rdOffset + if s.ch == '\n' { + s.lineOffset = s.offset + s.file.AddLine(s.offset) + } + r, w := rune(s.src[s.rdOffset]), 1 + switch { + case r == 0: + s.error(s.offset, "illegal character NUL") + case r >= 0x80: + // not ASCII + r, w = utf8.DecodeRune(s.src[s.rdOffset:]) + if r == utf8.RuneError && w == 1 { + s.error(s.offset, "illegal UTF-8 encoding") + } + } + s.rdOffset += w + s.ch = r + } else { + s.offset = len(s.src) + if s.ch == '\n' { + s.lineOffset = s.offset + s.file.AddLine(s.offset) + } + s.ch = -1 // eof + } +} + +// A mode value is a set of flags (or 0). +// They control scanner behavior. +// +type Mode uint + +const ( + ScanComments Mode = 1 << iota // return comments as COMMENT tokens +) + +// Init prepares the scanner s to tokenize the text src by setting the +// scanner at the beginning of src. The scanner uses the file set file +// for position information and it adds line information for each line. +// It is ok to re-use the same file when re-scanning the same file as +// line information which is already present is ignored. Init causes a +// panic if the file size does not match the src size. +// +// Calls to Scan will invoke the error handler err if they encounter a +// syntax error and err is not nil. Also, for each error encountered, +// the Scanner field ErrorCount is incremented by one. The mode parameter +// determines how comments are handled. +// +// Note that Init may call err if there is an error in the first character +// of the file. +// +func (s *Scanner) Init(file *token.File, src []byte, err ErrorHandler, mode Mode) { + // Explicitly initialize all fields since a scanner may be reused. + if file.Size() != len(src) { + panic(fmt.Sprintf("file size (%d) does not match src len (%d)", file.Size(), len(src))) + } + s.file = file + s.dir, _ = filepath.Split(file.Name()) + s.src = src + s.err = err + s.mode = mode + + s.ch = ' ' + s.offset = 0 + s.rdOffset = 0 + s.lineOffset = 0 + s.ErrorCount = 0 + s.nextVal = false + + s.next() +} + +func (s *Scanner) error(offs int, msg string) { + if s.err != nil { + s.err(s.file.Position(s.file.Pos(offs)), msg) + } + s.ErrorCount++ +} + +func (s *Scanner) scanComment() string { + // initial [;#] already consumed + offs := s.offset - 1 // position of initial [;#] + + for s.ch != '\n' && s.ch >= 0 { + s.next() + } + return string(s.src[offs:s.offset]) +} + +func isLetter(ch rune) bool { + return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch >= 0x80 && unicode.IsLetter(ch) +} + +func isDigit(ch rune) bool { + return '0' <= ch && ch <= '9' || ch >= 0x80 && unicode.IsDigit(ch) +} + +func (s *Scanner) scanIdentifier() string { + offs := s.offset + for isLetter(s.ch) || isDigit(s.ch) || s.ch == '-' { + s.next() + } + return string(s.src[offs:s.offset]) +} + +func (s *Scanner) scanEscape(val bool) { + offs := s.offset + ch := s.ch + s.next() // always make progress + switch ch { + case '\\', '"': + // ok + case 'n', 't', 'b': + if val { + break // ok + } + fallthrough + default: + s.error(offs, "unknown escape sequence") + } +} + +func (s *Scanner) scanString() string { + // '"' opening already consumed + offs := s.offset - 1 + + for s.ch != '"' { + ch := s.ch + s.next() + if ch == '\n' || ch < 0 { + s.error(offs, "string not terminated") + break + } + if ch == '\\' { + s.scanEscape(false) + } + } + + s.next() + + return string(s.src[offs:s.offset]) +} + +func stripCR(b []byte) []byte { + c := make([]byte, len(b)) + i := 0 + for _, ch := range b { + if ch != '\r' { + c[i] = ch + i++ + } + } + return c[:i] +} + +func (s *Scanner) scanValString() string { + offs := s.offset + + hasCR := false + end := offs + inQuote := false +loop: + for inQuote || s.ch >= 0 && s.ch != '\n' && s.ch != ';' && s.ch != '#' { + ch := s.ch + s.next() + switch { + case inQuote && ch == '\\': + s.scanEscape(true) + case !inQuote && ch == '\\': + if s.ch == '\r' { + hasCR = true + s.next() + } + if s.ch != '\n' { + s.scanEscape(true) + } else { + s.next() + } + case ch == '"': + inQuote = !inQuote + case ch == '\r': + hasCR = true + case ch < 0 || inQuote && ch == '\n': + s.error(offs, "string not terminated") + break loop + } + if inQuote || !isWhiteSpace(ch) { + end = s.offset + } + } + + lit := s.src[offs:end] + if hasCR { + lit = stripCR(lit) + } + + return string(lit) +} + +func isWhiteSpace(ch rune) bool { + return ch == ' ' || ch == '\t' || ch == '\r' +} + +func (s *Scanner) skipWhitespace() { + for isWhiteSpace(s.ch) { + s.next() + } +} + +// Scan scans the next token and returns the token position, the token, +// and its literal string if applicable. The source end is indicated by +// token.EOF. +// +// If the returned token is a literal (token.IDENT, token.STRING) or +// token.COMMENT, the literal string has the corresponding value. +// +// If the returned token is token.ILLEGAL, the literal string is the +// offending character. +// +// In all other cases, Scan returns an empty literal string. +// +// For more tolerant parsing, Scan will return a valid token if +// possible even if a syntax error was encountered. Thus, even +// if the resulting token sequence contains no illegal tokens, +// a client may not assume that no error occurred. Instead it +// must check the scanner's ErrorCount or the number of calls +// of the error handler, if there was one installed. +// +// Scan adds line information to the file added to the file +// set with Init. Token positions are relative to that file +// and thus relative to the file set. +// +func (s *Scanner) Scan() (pos token.Pos, tok token.Token, lit string) { +scanAgain: + s.skipWhitespace() + + // current token start + pos = s.file.Pos(s.offset) + + // determine token value + switch ch := s.ch; { + case s.nextVal: + lit = s.scanValString() + tok = token.STRING + s.nextVal = false + case isLetter(ch): + lit = s.scanIdentifier() + tok = token.IDENT + default: + s.next() // always make progress + switch ch { + case -1: + tok = token.EOF + case '\n': + tok = token.EOL + case '"': + tok = token.STRING + lit = s.scanString() + case '[': + tok = token.LBRACK + case ']': + tok = token.RBRACK + case ';', '#': + // comment + lit = s.scanComment() + if s.mode&ScanComments == 0 { + // skip comment + goto scanAgain + } + tok = token.COMMENT + case '=': + tok = token.ASSIGN + s.nextVal = true + default: + s.error(s.file.Offset(pos), fmt.Sprintf("illegal character %#U", ch)) + tok = token.ILLEGAL + lit = string(ch) + } + } + + return +} diff --git a/vendor/github.com/go-git/gcfg/set.go b/vendor/github.com/go-git/gcfg/set.go new file mode 100644 index 000000000..e2d927802 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/set.go @@ -0,0 +1,332 @@ +package gcfg + +import ( + "bytes" + "encoding/gob" + "fmt" + "math/big" + "reflect" + "strings" + "unicode" + "unicode/utf8" + + "github.com/go-git/gcfg/types" + "gopkg.in/warnings.v0" +) + +type tag struct { + ident string + intMode string +} + +func newTag(ts string) tag { + t := tag{} + s := strings.Split(ts, ",") + t.ident = s[0] + for _, tse := range s[1:] { + if strings.HasPrefix(tse, "int=") { + t.intMode = tse[len("int="):] + } + } + return t +} + +func fieldFold(v reflect.Value, name string) (reflect.Value, tag) { + var n string + r0, _ := utf8.DecodeRuneInString(name) + if unicode.IsLetter(r0) && !unicode.IsLower(r0) && !unicode.IsUpper(r0) { + n = "X" + } + n += strings.Replace(name, "-", "_", -1) + f, ok := v.Type().FieldByNameFunc(func(fieldName string) bool { + if !v.FieldByName(fieldName).CanSet() { + return false + } + f, _ := v.Type().FieldByName(fieldName) + t := newTag(f.Tag.Get("gcfg")) + if t.ident != "" { + return strings.EqualFold(t.ident, name) + } + return strings.EqualFold(n, fieldName) + }) + if !ok { + return reflect.Value{}, tag{} + } + return v.FieldByName(f.Name), newTag(f.Tag.Get("gcfg")) +} + +type setter func(destp interface{}, blank bool, val string, t tag) error + +var errUnsupportedType = fmt.Errorf("unsupported type") +var errBlankUnsupported = fmt.Errorf("blank value not supported for type") + +var setters = []setter{ + typeSetter, textUnmarshalerSetter, kindSetter, scanSetter, +} + +func textUnmarshalerSetter(d interface{}, blank bool, val string, t tag) error { + dtu, ok := d.(textUnmarshaler) + if !ok { + return errUnsupportedType + } + if blank { + return errBlankUnsupported + } + return dtu.UnmarshalText([]byte(val)) +} + +func boolSetter(d interface{}, blank bool, val string, t tag) error { + if blank { + reflect.ValueOf(d).Elem().Set(reflect.ValueOf(true)) + return nil + } + b, err := types.ParseBool(val) + if err == nil { + reflect.ValueOf(d).Elem().Set(reflect.ValueOf(b)) + } + return err +} + +func intMode(mode string) types.IntMode { + var m types.IntMode + if strings.ContainsAny(mode, "dD") { + m |= types.Dec + } + if strings.ContainsAny(mode, "hH") { + m |= types.Hex + } + if strings.ContainsAny(mode, "oO") { + m |= types.Oct + } + return m +} + +var typeModes = map[reflect.Type]types.IntMode{ + reflect.TypeOf(int(0)): types.Dec | types.Hex, + reflect.TypeOf(int8(0)): types.Dec | types.Hex, + reflect.TypeOf(int16(0)): types.Dec | types.Hex, + reflect.TypeOf(int32(0)): types.Dec | types.Hex, + reflect.TypeOf(int64(0)): types.Dec | types.Hex, + reflect.TypeOf(uint(0)): types.Dec | types.Hex, + reflect.TypeOf(uint8(0)): types.Dec | types.Hex, + reflect.TypeOf(uint16(0)): types.Dec | types.Hex, + reflect.TypeOf(uint32(0)): types.Dec | types.Hex, + reflect.TypeOf(uint64(0)): types.Dec | types.Hex, + // use default mode (allow dec/hex/oct) for uintptr type + reflect.TypeOf(big.Int{}): types.Dec | types.Hex, +} + +func intModeDefault(t reflect.Type) types.IntMode { + m, ok := typeModes[t] + if !ok { + m = types.Dec | types.Hex | types.Oct + } + return m +} + +func intSetter(d interface{}, blank bool, val string, t tag) error { + if blank { + return errBlankUnsupported + } + mode := intMode(t.intMode) + if mode == 0 { + mode = intModeDefault(reflect.TypeOf(d).Elem()) + } + return types.ParseInt(d, val, mode) +} + +func stringSetter(d interface{}, blank bool, val string, t tag) error { + if blank { + return errBlankUnsupported + } + dsp, ok := d.(*string) + if !ok { + return errUnsupportedType + } + *dsp = val + return nil +} + +var kindSetters = map[reflect.Kind]setter{ + reflect.String: stringSetter, + reflect.Bool: boolSetter, + reflect.Int: intSetter, + reflect.Int8: intSetter, + reflect.Int16: intSetter, + reflect.Int32: intSetter, + reflect.Int64: intSetter, + reflect.Uint: intSetter, + reflect.Uint8: intSetter, + reflect.Uint16: intSetter, + reflect.Uint32: intSetter, + reflect.Uint64: intSetter, + reflect.Uintptr: intSetter, +} + +var typeSetters = map[reflect.Type]setter{ + reflect.TypeOf(big.Int{}): intSetter, +} + +func typeSetter(d interface{}, blank bool, val string, tt tag) error { + t := reflect.ValueOf(d).Type().Elem() + setter, ok := typeSetters[t] + if !ok { + return errUnsupportedType + } + return setter(d, blank, val, tt) +} + +func kindSetter(d interface{}, blank bool, val string, tt tag) error { + k := reflect.ValueOf(d).Type().Elem().Kind() + setter, ok := kindSetters[k] + if !ok { + return errUnsupportedType + } + return setter(d, blank, val, tt) +} + +func scanSetter(d interface{}, blank bool, val string, tt tag) error { + if blank { + return errBlankUnsupported + } + return types.ScanFully(d, val, 'v') +} + +func newValue(c *warnings.Collector, sect string, vCfg reflect.Value, + vType reflect.Type) (reflect.Value, error) { + // + pv := reflect.New(vType) + dfltName := "default-" + sect + dfltField, _ := fieldFold(vCfg, dfltName) + var err error + if dfltField.IsValid() { + b := bytes.NewBuffer(nil) + ge := gob.NewEncoder(b) + if err = c.Collect(ge.EncodeValue(dfltField)); err != nil { + return pv, err + } + gd := gob.NewDecoder(bytes.NewReader(b.Bytes())) + if err = c.Collect(gd.DecodeValue(pv.Elem())); err != nil { + return pv, err + } + } + return pv, nil +} + +func set(c *warnings.Collector, cfg interface{}, sect, sub, name string, + value string, blankValue bool, subsectPass bool) error { + // + vPCfg := reflect.ValueOf(cfg) + if vPCfg.Kind() != reflect.Ptr || vPCfg.Elem().Kind() != reflect.Struct { + panic(fmt.Errorf("config must be a pointer to a struct")) + } + vCfg := vPCfg.Elem() + vSect, _ := fieldFold(vCfg, sect) + if !vSect.IsValid() { + err := extraData{section: sect} + return c.Collect(err) + } + isSubsect := vSect.Kind() == reflect.Map + if subsectPass != isSubsect { + return nil + } + if isSubsect { + vst := vSect.Type() + if vst.Key().Kind() != reflect.String || + vst.Elem().Kind() != reflect.Ptr || + vst.Elem().Elem().Kind() != reflect.Struct { + panic(fmt.Errorf("map field for section must have string keys and "+ + " pointer-to-struct values: section %q", sect)) + } + if vSect.IsNil() { + vSect.Set(reflect.MakeMap(vst)) + } + k := reflect.ValueOf(sub) + pv := vSect.MapIndex(k) + if !pv.IsValid() { + vType := vSect.Type().Elem().Elem() + var err error + if pv, err = newValue(c, sect, vCfg, vType); err != nil { + return err + } + vSect.SetMapIndex(k, pv) + } + vSect = pv.Elem() + } else if vSect.Kind() != reflect.Struct { + panic(fmt.Errorf("field for section must be a map or a struct: "+ + "section %q", sect)) + } else if sub != "" { + err := extraData{section: sect, subsection: &sub} + return c.Collect(err) + } + // Empty name is a special value, meaning that only the + // section/subsection object is to be created, with no values set. + if name == "" { + return nil + } + vVar, t := fieldFold(vSect, name) + if !vVar.IsValid() { + var err error + if isSubsect { + err = extraData{section: sect, subsection: &sub, variable: &name} + } else { + err = extraData{section: sect, variable: &name} + } + return c.Collect(err) + } + // vVal is either single-valued var, or newly allocated value within multi-valued var + var vVal reflect.Value + // multi-value if unnamed slice type + isMulti := vVar.Type().Name() == "" && vVar.Kind() == reflect.Slice || + vVar.Type().Name() == "" && vVar.Kind() == reflect.Ptr && vVar.Type().Elem().Name() == "" && vVar.Type().Elem().Kind() == reflect.Slice + if isMulti && vVar.Kind() == reflect.Ptr { + if vVar.IsNil() { + vVar.Set(reflect.New(vVar.Type().Elem())) + } + vVar = vVar.Elem() + } + if isMulti && blankValue { + vVar.Set(reflect.Zero(vVar.Type())) + return nil + } + if isMulti { + vVal = reflect.New(vVar.Type().Elem()).Elem() + } else { + vVal = vVar + } + isDeref := vVal.Type().Name() == "" && vVal.Type().Kind() == reflect.Ptr + isNew := isDeref && vVal.IsNil() + // vAddr is address of value to set (dereferenced & allocated as needed) + var vAddr reflect.Value + switch { + case isNew: + vAddr = reflect.New(vVal.Type().Elem()) + case isDeref && !isNew: + vAddr = vVal + default: + vAddr = vVal.Addr() + } + vAddrI := vAddr.Interface() + err, ok := error(nil), false + for _, s := range setters { + err = s(vAddrI, blankValue, value, t) + if err == nil { + ok = true + break + } + if err != errUnsupportedType { + return err + } + } + if !ok { + // in case all setters returned errUnsupportedType + return err + } + if isNew { // set reference if it was dereferenced and newly allocated + vVal.Set(vAddr) + } + if isMulti { // append if multi-valued + vVar.Set(reflect.Append(vVar, vVal)) + } + return nil +} diff --git a/vendor/github.com/go-git/gcfg/token/position.go b/vendor/github.com/go-git/gcfg/token/position.go new file mode 100644 index 000000000..fc45c1e76 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/token/position.go @@ -0,0 +1,435 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// TODO(gri) consider making this a separate package outside the go directory. + +package token + +import ( + "fmt" + "sort" + "sync" +) + +// ----------------------------------------------------------------------------- +// Positions + +// Position describes an arbitrary source position +// including the file, line, and column location. +// A Position is valid if the line number is > 0. +// +type Position struct { + Filename string // filename, if any + Offset int // offset, starting at 0 + Line int // line number, starting at 1 + Column int // column number, starting at 1 (character count) +} + +// IsValid returns true if the position is valid. +func (pos *Position) IsValid() bool { return pos.Line > 0 } + +// String returns a string in one of several forms: +// +// file:line:column valid position with file name +// line:column valid position without file name +// file invalid position with file name +// - invalid position without file name +// +func (pos Position) String() string { + s := pos.Filename + if pos.IsValid() { + if s != "" { + s += ":" + } + s += fmt.Sprintf("%d:%d", pos.Line, pos.Column) + } + if s == "" { + s = "-" + } + return s +} + +// Pos is a compact encoding of a source position within a file set. +// It can be converted into a Position for a more convenient, but much +// larger, representation. +// +// The Pos value for a given file is a number in the range [base, base+size], +// where base and size are specified when adding the file to the file set via +// AddFile. +// +// To create the Pos value for a specific source offset, first add +// the respective file to the current file set (via FileSet.AddFile) +// and then call File.Pos(offset) for that file. Given a Pos value p +// for a specific file set fset, the corresponding Position value is +// obtained by calling fset.Position(p). +// +// Pos values can be compared directly with the usual comparison operators: +// If two Pos values p and q are in the same file, comparing p and q is +// equivalent to comparing the respective source file offsets. If p and q +// are in different files, p < q is true if the file implied by p was added +// to the respective file set before the file implied by q. +// +type Pos int + +// The zero value for Pos is NoPos; there is no file and line information +// associated with it, and NoPos().IsValid() is false. NoPos is always +// smaller than any other Pos value. The corresponding Position value +// for NoPos is the zero value for Position. +// +const NoPos Pos = 0 + +// IsValid returns true if the position is valid. +func (p Pos) IsValid() bool { + return p != NoPos +} + +// ----------------------------------------------------------------------------- +// File + +// A File is a handle for a file belonging to a FileSet. +// A File has a name, size, and line offset table. +// +type File struct { + set *FileSet + name string // file name as provided to AddFile + base int // Pos value range for this file is [base...base+size] + size int // file size as provided to AddFile + + // lines and infos are protected by set.mutex + lines []int + infos []lineInfo +} + +// Name returns the file name of file f as registered with AddFile. +func (f *File) Name() string { + return f.name +} + +// Base returns the base offset of file f as registered with AddFile. +func (f *File) Base() int { + return f.base +} + +// Size returns the size of file f as registered with AddFile. +func (f *File) Size() int { + return f.size +} + +// LineCount returns the number of lines in file f. +func (f *File) LineCount() int { + f.set.mutex.RLock() + n := len(f.lines) + f.set.mutex.RUnlock() + return n +} + +// AddLine adds the line offset for a new line. +// The line offset must be larger than the offset for the previous line +// and smaller than the file size; otherwise the line offset is ignored. +// +func (f *File) AddLine(offset int) { + f.set.mutex.Lock() + if i := len(f.lines); (i == 0 || f.lines[i-1] < offset) && offset < f.size { + f.lines = append(f.lines, offset) + } + f.set.mutex.Unlock() +} + +// SetLines sets the line offsets for a file and returns true if successful. +// The line offsets are the offsets of the first character of each line; +// for instance for the content "ab\nc\n" the line offsets are {0, 3}. +// An empty file has an empty line offset table. +// Each line offset must be larger than the offset for the previous line +// and smaller than the file size; otherwise SetLines fails and returns +// false. +// +func (f *File) SetLines(lines []int) bool { + // verify validity of lines table + size := f.size + for i, offset := range lines { + if i > 0 && offset <= lines[i-1] || size <= offset { + return false + } + } + + // set lines table + f.set.mutex.Lock() + f.lines = lines + f.set.mutex.Unlock() + return true +} + +// SetLinesForContent sets the line offsets for the given file content. +func (f *File) SetLinesForContent(content []byte) { + var lines []int + line := 0 + for offset, b := range content { + if line >= 0 { + lines = append(lines, line) + } + line = -1 + if b == '\n' { + line = offset + 1 + } + } + + // set lines table + f.set.mutex.Lock() + f.lines = lines + f.set.mutex.Unlock() +} + +// A lineInfo object describes alternative file and line number +// information (such as provided via a //line comment in a .go +// file) for a given file offset. +type lineInfo struct { + // fields are exported to make them accessible to gob + Offset int + Filename string + Line int +} + +// AddLineInfo adds alternative file and line number information for +// a given file offset. The offset must be larger than the offset for +// the previously added alternative line info and smaller than the +// file size; otherwise the information is ignored. +// +// AddLineInfo is typically used to register alternative position +// information for //line filename:line comments in source files. +// +func (f *File) AddLineInfo(offset int, filename string, line int) { + f.set.mutex.Lock() + if i := len(f.infos); i == 0 || f.infos[i-1].Offset < offset && offset < f.size { + f.infos = append(f.infos, lineInfo{offset, filename, line}) + } + f.set.mutex.Unlock() +} + +// Pos returns the Pos value for the given file offset; +// the offset must be <= f.Size(). +// f.Pos(f.Offset(p)) == p. +// +func (f *File) Pos(offset int) Pos { + if offset > f.size { + panic("illegal file offset") + } + return Pos(f.base + offset) +} + +// Offset returns the offset for the given file position p; +// p must be a valid Pos value in that file. +// f.Offset(f.Pos(offset)) == offset. +// +func (f *File) Offset(p Pos) int { + if int(p) < f.base || int(p) > f.base+f.size { + panic("illegal Pos value") + } + return int(p) - f.base +} + +// Line returns the line number for the given file position p; +// p must be a Pos value in that file or NoPos. +// +func (f *File) Line(p Pos) int { + // TODO(gri) this can be implemented much more efficiently + return f.Position(p).Line +} + +func searchLineInfos(a []lineInfo, x int) int { + return sort.Search(len(a), func(i int) bool { return a[i].Offset > x }) - 1 +} + +// info returns the file name, line, and column number for a file offset. +func (f *File) info(offset int) (filename string, line, column int) { + filename = f.name + if i := searchInts(f.lines, offset); i >= 0 { + line, column = i+1, offset-f.lines[i]+1 + } + if len(f.infos) > 0 { + // almost no files have extra line infos + if i := searchLineInfos(f.infos, offset); i >= 0 { + alt := &f.infos[i] + filename = alt.Filename + if i := searchInts(f.lines, alt.Offset); i >= 0 { + line += alt.Line - i - 1 + } + } + } + return +} + +func (f *File) position(p Pos) (pos Position) { + offset := int(p) - f.base + pos.Offset = offset + pos.Filename, pos.Line, pos.Column = f.info(offset) + return +} + +// Position returns the Position value for the given file position p; +// p must be a Pos value in that file or NoPos. +// +func (f *File) Position(p Pos) (pos Position) { + if p != NoPos { + if int(p) < f.base || int(p) > f.base+f.size { + panic("illegal Pos value") + } + pos = f.position(p) + } + return +} + +// ----------------------------------------------------------------------------- +// FileSet + +// A FileSet represents a set of source files. +// Methods of file sets are synchronized; multiple goroutines +// may invoke them concurrently. +// +type FileSet struct { + mutex sync.RWMutex // protects the file set + base int // base offset for the next file + files []*File // list of files in the order added to the set + last *File // cache of last file looked up +} + +// NewFileSet creates a new file set. +func NewFileSet() *FileSet { + s := new(FileSet) + s.base = 1 // 0 == NoPos + return s +} + +// Base returns the minimum base offset that must be provided to +// AddFile when adding the next file. +// +func (s *FileSet) Base() int { + s.mutex.RLock() + b := s.base + s.mutex.RUnlock() + return b + +} + +// AddFile adds a new file with a given filename, base offset, and file size +// to the file set s and returns the file. Multiple files may have the same +// name. The base offset must not be smaller than the FileSet's Base(), and +// size must not be negative. +// +// Adding the file will set the file set's Base() value to base + size + 1 +// as the minimum base value for the next file. The following relationship +// exists between a Pos value p for a given file offset offs: +// +// int(p) = base + offs +// +// with offs in the range [0, size] and thus p in the range [base, base+size]. +// For convenience, File.Pos may be used to create file-specific position +// values from a file offset. +// +func (s *FileSet) AddFile(filename string, base, size int) *File { + s.mutex.Lock() + defer s.mutex.Unlock() + if base < s.base || size < 0 { + panic("illegal base or size") + } + // base >= s.base && size >= 0 + f := &File{s, filename, base, size, []int{0}, nil} + base += size + 1 // +1 because EOF also has a position + if base < 0 { + panic("token.Pos offset overflow (> 2G of source code in file set)") + } + // add the file to the file set + s.base = base + s.files = append(s.files, f) + s.last = f + return f +} + +// Iterate calls f for the files in the file set in the order they were added +// until f returns false. +// +func (s *FileSet) Iterate(f func(*File) bool) { + for i := 0; ; i++ { + var file *File + s.mutex.RLock() + if i < len(s.files) { + file = s.files[i] + } + s.mutex.RUnlock() + if file == nil || !f(file) { + break + } + } +} + +func searchFiles(a []*File, x int) int { + return sort.Search(len(a), func(i int) bool { return a[i].base > x }) - 1 +} + +func (s *FileSet) file(p Pos) *File { + // common case: p is in last file + if f := s.last; f != nil && f.base <= int(p) && int(p) <= f.base+f.size { + return f + } + // p is not in last file - search all files + if i := searchFiles(s.files, int(p)); i >= 0 { + f := s.files[i] + // f.base <= int(p) by definition of searchFiles + if int(p) <= f.base+f.size { + s.last = f + return f + } + } + return nil +} + +// File returns the file that contains the position p. +// If no such file is found (for instance for p == NoPos), +// the result is nil. +// +func (s *FileSet) File(p Pos) (f *File) { + if p != NoPos { + s.mutex.RLock() + f = s.file(p) + s.mutex.RUnlock() + } + return +} + +// Position converts a Pos in the fileset into a general Position. +func (s *FileSet) Position(p Pos) (pos Position) { + if p != NoPos { + s.mutex.RLock() + if f := s.file(p); f != nil { + pos = f.position(p) + } + s.mutex.RUnlock() + } + return +} + +// ----------------------------------------------------------------------------- +// Helper functions + +func searchInts(a []int, x int) int { + // This function body is a manually inlined version of: + // + // return sort.Search(len(a), func(i int) bool { return a[i] > x }) - 1 + // + // With better compiler optimizations, this may not be needed in the + // future, but at the moment this change improves the go/printer + // benchmark performance by ~30%. This has a direct impact on the + // speed of gofmt and thus seems worthwhile (2011-04-29). + // TODO(gri): Remove this when compilers have caught up. + i, j := 0, len(a) + for i < j { + h := i + (j-i)/2 // avoid overflow when computing h + // i ≤ h < j + if a[h] <= x { + i = h + 1 + } else { + j = h + } + } + return i - 1 +} diff --git a/vendor/github.com/go-git/gcfg/token/serialize.go b/vendor/github.com/go-git/gcfg/token/serialize.go new file mode 100644 index 000000000..4adc8f9e3 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/token/serialize.go @@ -0,0 +1,56 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package token + +type serializedFile struct { + // fields correspond 1:1 to fields with same (lower-case) name in File + Name string + Base int + Size int + Lines []int + Infos []lineInfo +} + +type serializedFileSet struct { + Base int + Files []serializedFile +} + +// Read calls decode to deserialize a file set into s; s must not be nil. +func (s *FileSet) Read(decode func(interface{}) error) error { + var ss serializedFileSet + if err := decode(&ss); err != nil { + return err + } + + s.mutex.Lock() + s.base = ss.Base + files := make([]*File, len(ss.Files)) + for i := 0; i < len(ss.Files); i++ { + f := &ss.Files[i] + files[i] = &File{s, f.Name, f.Base, f.Size, f.Lines, f.Infos} + } + s.files = files + s.last = nil + s.mutex.Unlock() + + return nil +} + +// Write calls encode to serialize the file set s. +func (s *FileSet) Write(encode func(interface{}) error) error { + var ss serializedFileSet + + s.mutex.Lock() + ss.Base = s.base + files := make([]serializedFile, len(s.files)) + for i, f := range s.files { + files[i] = serializedFile{f.name, f.base, f.size, f.lines, f.infos} + } + ss.Files = files + s.mutex.Unlock() + + return encode(ss) +} diff --git a/vendor/github.com/go-git/gcfg/token/token.go b/vendor/github.com/go-git/gcfg/token/token.go new file mode 100644 index 000000000..b3c7c83fa --- /dev/null +++ b/vendor/github.com/go-git/gcfg/token/token.go @@ -0,0 +1,83 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package token defines constants representing the lexical tokens of the gcfg +// configuration syntax and basic operations on tokens (printing, predicates). +// +// Note that the API for the token package may change to accommodate new +// features or implementation changes in gcfg. +// +package token + +import "strconv" + +// Token is the set of lexical tokens of the gcfg configuration syntax. +type Token int + +// The list of tokens. +const ( + // Special tokens + ILLEGAL Token = iota + EOF + COMMENT + + literal_beg + // Identifiers and basic type literals + // (these tokens stand for classes of literals) + IDENT // section-name, variable-name + STRING // "subsection-name", variable value + literal_end + + operator_beg + // Operators and delimiters + ASSIGN // = + LBRACK // [ + RBRACK // ] + EOL // \n + operator_end +) + +var tokens = [...]string{ + ILLEGAL: "ILLEGAL", + + EOF: "EOF", + COMMENT: "COMMENT", + + IDENT: "IDENT", + STRING: "STRING", + + ASSIGN: "=", + LBRACK: "[", + RBRACK: "]", + EOL: "\n", +} + +// String returns the string corresponding to the token tok. +// For operators and delimiters, the string is the actual token character +// sequence (e.g., for the token ASSIGN, the string is "="). For all other +// tokens the string corresponds to the token constant name (e.g. for the +// token IDENT, the string is "IDENT"). +// +func (tok Token) String() string { + s := "" + if 0 <= tok && tok < Token(len(tokens)) { + s = tokens[tok] + } + if s == "" { + s = "token(" + strconv.Itoa(int(tok)) + ")" + } + return s +} + +// Predicates + +// IsLiteral returns true for tokens corresponding to identifiers +// and basic type literals; it returns false otherwise. +// +func (tok Token) IsLiteral() bool { return literal_beg < tok && tok < literal_end } + +// IsOperator returns true for tokens corresponding to operators and +// delimiters; it returns false otherwise. +// +func (tok Token) IsOperator() bool { return operator_beg < tok && tok < operator_end } diff --git a/vendor/github.com/go-git/gcfg/types/bool.go b/vendor/github.com/go-git/gcfg/types/bool.go new file mode 100644 index 000000000..8dcae0d8c --- /dev/null +++ b/vendor/github.com/go-git/gcfg/types/bool.go @@ -0,0 +1,23 @@ +package types + +// BoolValues defines the name and value mappings for ParseBool. +var BoolValues = map[string]interface{}{ + "true": true, "yes": true, "on": true, "1": true, + "false": false, "no": false, "off": false, "0": false, +} + +var boolParser = func() *EnumParser { + ep := &EnumParser{} + ep.AddVals(BoolValues) + return ep +}() + +// ParseBool parses bool values according to the definitions in BoolValues. +// Parsing is case-insensitive. +func ParseBool(s string) (bool, error) { + v, err := boolParser.Parse(s) + if err != nil { + return false, err + } + return v.(bool), nil +} diff --git a/vendor/github.com/go-git/gcfg/types/doc.go b/vendor/github.com/go-git/gcfg/types/doc.go new file mode 100644 index 000000000..9f9c345f6 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/types/doc.go @@ -0,0 +1,4 @@ +// Package types defines helpers for type conversions. +// +// The API for this package is not finalized yet. +package types diff --git a/vendor/github.com/go-git/gcfg/types/enum.go b/vendor/github.com/go-git/gcfg/types/enum.go new file mode 100644 index 000000000..1a0c7ef45 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/types/enum.go @@ -0,0 +1,44 @@ +package types + +import ( + "fmt" + "reflect" + "strings" +) + +// EnumParser parses "enum" values; i.e. a predefined set of strings to +// predefined values. +type EnumParser struct { + Type string // type name; if not set, use type of first value added + CaseMatch bool // if true, matching of strings is case-sensitive + // PrefixMatch bool + vals map[string]interface{} +} + +// AddVals adds strings and values to an EnumParser. +func (ep *EnumParser) AddVals(vals map[string]interface{}) { + if ep.vals == nil { + ep.vals = make(map[string]interface{}) + } + for k, v := range vals { + if ep.Type == "" { + ep.Type = reflect.TypeOf(v).Name() + } + if !ep.CaseMatch { + k = strings.ToLower(k) + } + ep.vals[k] = v + } +} + +// Parse parses the string and returns the value or an error. +func (ep EnumParser) Parse(s string) (interface{}, error) { + if !ep.CaseMatch { + s = strings.ToLower(s) + } + v, ok := ep.vals[s] + if !ok { + return false, fmt.Errorf("failed to parse %s %#q", ep.Type, s) + } + return v, nil +} diff --git a/vendor/github.com/go-git/gcfg/types/int.go b/vendor/github.com/go-git/gcfg/types/int.go new file mode 100644 index 000000000..af7e75c12 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/types/int.go @@ -0,0 +1,86 @@ +package types + +import ( + "fmt" + "strings" +) + +// An IntMode is a mode for parsing integer values, representing a set of +// accepted bases. +type IntMode uint8 + +// IntMode values for ParseInt; can be combined using binary or. +const ( + Dec IntMode = 1 << iota + Hex + Oct +) + +// String returns a string representation of IntMode; e.g. `IntMode(Dec|Hex)`. +func (m IntMode) String() string { + var modes []string + if m&Dec != 0 { + modes = append(modes, "Dec") + } + if m&Hex != 0 { + modes = append(modes, "Hex") + } + if m&Oct != 0 { + modes = append(modes, "Oct") + } + return "IntMode(" + strings.Join(modes, "|") + ")" +} + +var errIntAmbig = fmt.Errorf("ambiguous integer value; must include '0' prefix") + +func prefix0(val string) bool { + return strings.HasPrefix(val, "0") || strings.HasPrefix(val, "-0") +} + +func prefix0x(val string) bool { + return strings.HasPrefix(val, "0x") || strings.HasPrefix(val, "-0x") +} + +// ParseInt parses val using mode into intptr, which must be a pointer to an +// integer kind type. Non-decimal value require prefix `0` or `0x` in the cases +// when mode permits ambiguity of base; otherwise the prefix can be omitted. +func ParseInt(intptr interface{}, val string, mode IntMode) error { + val = strings.TrimSpace(val) + verb := byte(0) + switch mode { + case Dec: + verb = 'd' + case Dec + Hex: + if prefix0x(val) { + verb = 'v' + } else { + verb = 'd' + } + case Dec + Oct: + if prefix0(val) && !prefix0x(val) { + verb = 'v' + } else { + verb = 'd' + } + case Dec + Hex + Oct: + verb = 'v' + case Hex: + if prefix0x(val) { + verb = 'v' + } else { + verb = 'x' + } + case Oct: + verb = 'o' + case Hex + Oct: + if prefix0(val) { + verb = 'v' + } else { + return errIntAmbig + } + } + if verb == 0 { + panic("unsupported mode") + } + return ScanFully(intptr, val, verb) +} diff --git a/vendor/github.com/go-git/gcfg/types/scan.go b/vendor/github.com/go-git/gcfg/types/scan.go new file mode 100644 index 000000000..db2f6ed3c --- /dev/null +++ b/vendor/github.com/go-git/gcfg/types/scan.go @@ -0,0 +1,23 @@ +package types + +import ( + "fmt" + "io" + "reflect" +) + +// ScanFully uses fmt.Sscanf with verb to fully scan val into ptr. +func ScanFully(ptr interface{}, val string, verb byte) error { + t := reflect.ValueOf(ptr).Elem().Type() + // attempt to read extra bytes to make sure the value is consumed + var b []byte + n, err := fmt.Sscanf(val, "%"+string(verb)+"%s", ptr, &b) + switch { + case n < 1 || n == 1 && err != io.EOF: + return fmt.Errorf("failed to parse %q as %v: %v", val, t, err) + case n > 1: + return fmt.Errorf("failed to parse %q as %v: extra characters %q", val, t, string(b)) + } + // n == 1 && err == io.EOF + return nil +} diff --git a/vendor/github.com/go-git/go-billy/v5/.gitignore b/vendor/github.com/go-git/go-billy/v5/.gitignore new file mode 100644 index 000000000..7aeb46699 --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/.gitignore @@ -0,0 +1,4 @@ +/coverage.txt +/vendor +Gopkg.lock +Gopkg.toml diff --git a/vendor/github.com/go-git/go-billy/v5/LICENSE b/vendor/github.com/go-git/go-billy/v5/LICENSE new file mode 100644 index 000000000..9d6075689 --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2017 Sourced Technologies S.L. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/go-git/go-billy/v5/README.md b/vendor/github.com/go-git/go-billy/v5/README.md new file mode 100644 index 000000000..ca58b1c8a --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/README.md @@ -0,0 +1,73 @@ +# go-billy [![GoDoc](https://godoc.org/gopkg.in/go-git/go-billy.v5?status.svg)](https://pkg.go.dev/github.com/go-git/go-billy) [![Test](https://github.com/go-git/go-billy/workflows/Test/badge.svg)](https://github.com/go-git/go-billy/actions?query=workflow%3ATest) + +The missing interface filesystem abstraction for Go. +Billy implements an interface based on the `os` standard library, allowing to develop applications without dependency on the underlying storage. Makes it virtually free to implement mocks and testing over filesystem operations. + +Billy was born as part of [go-git/go-git](https://github.com/go-git/go-git) project. + +## Installation + +```go +import "github.com/go-git/go-billy/v5" // with go modules enabled (GO111MODULE=on or outside GOPATH) +import "github.com/go-git/go-billy" // with go modules disabled +``` + +## Usage + +Billy exposes filesystems using the +[`Filesystem` interface](https://pkg.go.dev/github.com/go-git/go-billy/v5?tab=doc#Filesystem). +Each filesystem implementation gives you a `New` method, whose arguments depend on +the implementation itself, that returns a new `Filesystem`. + +The following example caches in memory all readable files in a directory from any +billy's filesystem implementation. + +```go +func LoadToMemory(origin billy.Filesystem, path string) (*memory.Memory, error) { + memory := memory.New() + + files, err := origin.ReadDir("/") + if err != nil { + return nil, err + } + + for _, file := range files { + if file.IsDir() { + continue + } + + src, err := origin.Open(file.Name()) + if err != nil { + return nil, err + } + + dst, err := memory.Create(file.Name()) + if err != nil { + return nil, err + } + + if _, err = io.Copy(dst, src); err != nil { + return nil, err + } + + if err := dst.Close(); err != nil { + return nil, err + } + + if err := src.Close(); err != nil { + return nil, err + } + } + + return memory, nil +} +``` + +## Why billy? + +The library billy deals with storage systems and Billy is the name of a well-known, IKEA +bookcase. That's it. + +## License + +Apache License Version 2.0, see [LICENSE](LICENSE) diff --git a/vendor/github.com/go-git/go-billy/v5/fs.go b/vendor/github.com/go-git/go-billy/v5/fs.go new file mode 100644 index 000000000..a9efccdeb --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/fs.go @@ -0,0 +1,202 @@ +package billy + +import ( + "errors" + "io" + "os" + "time" +) + +var ( + ErrReadOnly = errors.New("read-only filesystem") + ErrNotSupported = errors.New("feature not supported") + ErrCrossedBoundary = errors.New("chroot boundary crossed") +) + +// Capability holds the supported features of a billy filesystem. This does +// not mean that the capability has to be supported by the underlying storage. +// For example, a billy filesystem may support WriteCapability but the +// storage be mounted in read only mode. +type Capability uint64 + +const ( + // WriteCapability means that the fs is writable. + WriteCapability Capability = 1 << iota + // ReadCapability means that the fs is readable. + ReadCapability + // ReadAndWriteCapability is the ability to open a file in read and write mode. + ReadAndWriteCapability + // SeekCapability means it is able to move position inside the file. + SeekCapability + // TruncateCapability means that a file can be truncated. + TruncateCapability + // LockCapability is the ability to lock a file. + LockCapability + + // DefaultCapabilities lists all capable features supported by filesystems + // without Capability interface. This list should not be changed until a + // major version is released. + DefaultCapabilities Capability = WriteCapability | ReadCapability | + ReadAndWriteCapability | SeekCapability | TruncateCapability | + LockCapability + + // AllCapabilities lists all capable features. + AllCapabilities Capability = WriteCapability | ReadCapability | + ReadAndWriteCapability | SeekCapability | TruncateCapability | + LockCapability +) + +// Filesystem abstract the operations in a storage-agnostic interface. +// Each method implementation mimics the behavior of the equivalent functions +// at the os package from the standard library. +type Filesystem interface { + Basic + TempFile + Dir + Symlink + Chroot +} + +// Basic abstract the basic operations in a storage-agnostic interface as +// an extension to the Basic interface. +type Basic interface { + // Create creates the named file with mode 0666 (before umask), truncating + // it if it already exists. If successful, methods on the returned File can + // be used for I/O; the associated file descriptor has mode O_RDWR. + Create(filename string) (File, error) + // Open opens the named file for reading. If successful, methods on the + // returned file can be used for reading; the associated file descriptor has + // mode O_RDONLY. + Open(filename string) (File, error) + // OpenFile is the generalized open call; most users will use Open or Create + // instead. It opens the named file with specified flag (O_RDONLY etc.) and + // perm, (0666 etc.) if applicable. If successful, methods on the returned + // File can be used for I/O. + OpenFile(filename string, flag int, perm os.FileMode) (File, error) + // Stat returns a FileInfo describing the named file. + Stat(filename string) (os.FileInfo, error) + // Rename renames (moves) oldpath to newpath. If newpath already exists and + // is not a directory, Rename replaces it. OS-specific restrictions may + // apply when oldpath and newpath are in different directories. + Rename(oldpath, newpath string) error + // Remove removes the named file or directory. + Remove(filename string) error + // Join joins any number of path elements into a single path, adding a + // Separator if necessary. Join calls filepath.Clean on the result; in + // particular, all empty strings are ignored. On Windows, the result is a + // UNC path if and only if the first path element is a UNC path. + Join(elem ...string) string +} + +type TempFile interface { + // TempFile creates a new temporary file in the directory dir with a name + // beginning with prefix, opens the file for reading and writing, and + // returns the resulting *os.File. If dir is the empty string, TempFile + // uses the default directory for temporary files (see os.TempDir). + // Multiple programs calling TempFile simultaneously will not choose the + // same file. The caller can use f.Name() to find the pathname of the file. + // It is the caller's responsibility to remove the file when no longer + // needed. + TempFile(dir, prefix string) (File, error) +} + +// Dir abstract the dir related operations in a storage-agnostic interface as +// an extension to the Basic interface. +type Dir interface { + // ReadDir reads the directory named by dirname and returns a list of + // directory entries sorted by filename. + ReadDir(path string) ([]os.FileInfo, error) + // MkdirAll creates a directory named path, along with any necessary + // parents, and returns nil, or else returns an error. The permission bits + // perm are used for all directories that MkdirAll creates. If path is/ + // already a directory, MkdirAll does nothing and returns nil. + MkdirAll(filename string, perm os.FileMode) error +} + +// Symlink abstract the symlink related operations in a storage-agnostic +// interface as an extension to the Basic interface. +type Symlink interface { + // Lstat returns a FileInfo describing the named file. If the file is a + // symbolic link, the returned FileInfo describes the symbolic link. Lstat + // makes no attempt to follow the link. + Lstat(filename string) (os.FileInfo, error) + // Symlink creates a symbolic-link from link to target. target may be an + // absolute or relative path, and need not refer to an existing node. + // Parent directories of link are created as necessary. + Symlink(target, link string) error + // Readlink returns the target path of link. + Readlink(link string) (string, error) +} + +// Change abstract the FileInfo change related operations in a storage-agnostic +// interface as an extension to the Basic interface +type Change interface { + // Chmod changes the mode of the named file to mode. If the file is a + // symbolic link, it changes the mode of the link's target. + Chmod(name string, mode os.FileMode) error + // Lchown changes the numeric uid and gid of the named file. If the file is + // a symbolic link, it changes the uid and gid of the link itself. + Lchown(name string, uid, gid int) error + // Chown changes the numeric uid and gid of the named file. If the file is a + // symbolic link, it changes the uid and gid of the link's target. + Chown(name string, uid, gid int) error + // Chtimes changes the access and modification times of the named file, + // similar to the Unix utime() or utimes() functions. + // + // The underlying filesystem may truncate or round the values to a less + // precise time unit. + Chtimes(name string, atime time.Time, mtime time.Time) error +} + +// Chroot abstract the chroot related operations in a storage-agnostic interface +// as an extension to the Basic interface. +type Chroot interface { + // Chroot returns a new filesystem from the same type where the new root is + // the given path. Files outside of the designated directory tree cannot be + // accessed. + Chroot(path string) (Filesystem, error) + // Root returns the root path of the filesystem. + Root() string +} + +// File represent a file, being a subset of the os.File +type File interface { + // Name returns the name of the file as presented to Open. + Name() string + io.Writer + io.Reader + io.ReaderAt + io.Seeker + io.Closer + // Lock locks the file like e.g. flock. It protects against access from + // other processes. + Lock() error + // Unlock unlocks the file. + Unlock() error + // Truncate the file. + Truncate(size int64) error +} + +// Capable interface can return the available features of a filesystem. +type Capable interface { + // Capabilities returns the capabilities of a filesystem in bit flags. + Capabilities() Capability +} + +// Capabilities returns the features supported by a filesystem. If the FS +// does not implement Capable interface it returns all features. +func Capabilities(fs Basic) Capability { + capable, ok := fs.(Capable) + if !ok { + return DefaultCapabilities + } + + return capable.Capabilities() +} + +// CapabilityCheck tests the filesystem for the provided capabilities and +// returns true in case it supports all of them. +func CapabilityCheck(fs Basic, capabilities Capability) bool { + fsCaps := Capabilities(fs) + return fsCaps&capabilities == capabilities +} diff --git a/vendor/github.com/go-git/go-billy/v5/go.mod b/vendor/github.com/go-git/go-billy/v5/go.mod new file mode 100644 index 000000000..78ce0af2a --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/go.mod @@ -0,0 +1,10 @@ +module github.com/go-git/go-billy/v5 + +require ( + github.com/kr/text v0.2.0 // indirect + github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect + golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 + gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f +) + +go 1.13 diff --git a/vendor/github.com/go-git/go-billy/v5/go.sum b/vendor/github.com/go-git/go-billy/v5/go.sum new file mode 100644 index 000000000..cdc052bc7 --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/go.sum @@ -0,0 +1,14 @@ +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/go-git/go-billy v1.0.0 h1:bXR6Zu3opPSg0R4dDxqaLglY4rxw7ja7wS16qSpOKL4= +github.com/go-git/go-billy v3.1.0+incompatible h1:dwrJ8G2Jt1srYgIJs+lRjA36qBY68O2Lg5idKG8ef5M= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 h1:uYVVQ9WP/Ds2ROhcaGPeIdVq0RIXVLwsHlnvJ+cT1So= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/vendor/github.com/go-git/go-billy/v5/helper/chroot/chroot.go b/vendor/github.com/go-git/go-billy/v5/helper/chroot/chroot.go new file mode 100644 index 000000000..8b44e784b --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/helper/chroot/chroot.go @@ -0,0 +1,242 @@ +package chroot + +import ( + "os" + "path/filepath" + "strings" + + "github.com/go-git/go-billy/v5" + "github.com/go-git/go-billy/v5/helper/polyfill" +) + +// ChrootHelper is a helper to implement billy.Chroot. +type ChrootHelper struct { + underlying billy.Filesystem + base string +} + +// New creates a new filesystem wrapping up the given 'fs'. +// The created filesystem has its base in the given ChrootHelperectory of the +// underlying filesystem. +func New(fs billy.Basic, base string) billy.Filesystem { + return &ChrootHelper{ + underlying: polyfill.New(fs), + base: base, + } +} + +func (fs *ChrootHelper) underlyingPath(filename string) (string, error) { + if isCrossBoundaries(filename) { + return "", billy.ErrCrossedBoundary + } + + return fs.Join(fs.Root(), filename), nil +} + +func isCrossBoundaries(path string) bool { + path = filepath.ToSlash(path) + path = filepath.Clean(path) + + return strings.HasPrefix(path, ".."+string(filepath.Separator)) +} + +func (fs *ChrootHelper) Create(filename string) (billy.File, error) { + fullpath, err := fs.underlyingPath(filename) + if err != nil { + return nil, err + } + + f, err := fs.underlying.Create(fullpath) + if err != nil { + return nil, err + } + + return newFile(fs, f, filename), nil +} + +func (fs *ChrootHelper) Open(filename string) (billy.File, error) { + fullpath, err := fs.underlyingPath(filename) + if err != nil { + return nil, err + } + + f, err := fs.underlying.Open(fullpath) + if err != nil { + return nil, err + } + + return newFile(fs, f, filename), nil +} + +func (fs *ChrootHelper) OpenFile(filename string, flag int, mode os.FileMode) (billy.File, error) { + fullpath, err := fs.underlyingPath(filename) + if err != nil { + return nil, err + } + + f, err := fs.underlying.OpenFile(fullpath, flag, mode) + if err != nil { + return nil, err + } + + return newFile(fs, f, filename), nil +} + +func (fs *ChrootHelper) Stat(filename string) (os.FileInfo, error) { + fullpath, err := fs.underlyingPath(filename) + if err != nil { + return nil, err + } + + return fs.underlying.Stat(fullpath) +} + +func (fs *ChrootHelper) Rename(from, to string) error { + var err error + from, err = fs.underlyingPath(from) + if err != nil { + return err + } + + to, err = fs.underlyingPath(to) + if err != nil { + return err + } + + return fs.underlying.Rename(from, to) +} + +func (fs *ChrootHelper) Remove(path string) error { + fullpath, err := fs.underlyingPath(path) + if err != nil { + return err + } + + return fs.underlying.Remove(fullpath) +} + +func (fs *ChrootHelper) Join(elem ...string) string { + return fs.underlying.Join(elem...) +} + +func (fs *ChrootHelper) TempFile(dir, prefix string) (billy.File, error) { + fullpath, err := fs.underlyingPath(dir) + if err != nil { + return nil, err + } + + f, err := fs.underlying.(billy.TempFile).TempFile(fullpath, prefix) + if err != nil { + return nil, err + } + + return newFile(fs, f, fs.Join(dir, filepath.Base(f.Name()))), nil +} + +func (fs *ChrootHelper) ReadDir(path string) ([]os.FileInfo, error) { + fullpath, err := fs.underlyingPath(path) + if err != nil { + return nil, err + } + + return fs.underlying.(billy.Dir).ReadDir(fullpath) +} + +func (fs *ChrootHelper) MkdirAll(filename string, perm os.FileMode) error { + fullpath, err := fs.underlyingPath(filename) + if err != nil { + return err + } + + return fs.underlying.(billy.Dir).MkdirAll(fullpath, perm) +} + +func (fs *ChrootHelper) Lstat(filename string) (os.FileInfo, error) { + fullpath, err := fs.underlyingPath(filename) + if err != nil { + return nil, err + } + + return fs.underlying.(billy.Symlink).Lstat(fullpath) +} + +func (fs *ChrootHelper) Symlink(target, link string) error { + target = filepath.FromSlash(target) + + // only rewrite target if it's already absolute + if filepath.IsAbs(target) || strings.HasPrefix(target, string(filepath.Separator)) { + target = fs.Join(fs.Root(), target) + target = filepath.Clean(filepath.FromSlash(target)) + } + + link, err := fs.underlyingPath(link) + if err != nil { + return err + } + + return fs.underlying.(billy.Symlink).Symlink(target, link) +} + +func (fs *ChrootHelper) Readlink(link string) (string, error) { + fullpath, err := fs.underlyingPath(link) + if err != nil { + return "", err + } + + target, err := fs.underlying.(billy.Symlink).Readlink(fullpath) + if err != nil { + return "", err + } + + if !filepath.IsAbs(target) && !strings.HasPrefix(target, string(filepath.Separator)) { + return target, nil + } + + target, err = filepath.Rel(fs.base, target) + if err != nil { + return "", err + } + + return string(os.PathSeparator) + target, nil +} + +func (fs *ChrootHelper) Chroot(path string) (billy.Filesystem, error) { + fullpath, err := fs.underlyingPath(path) + if err != nil { + return nil, err + } + + return New(fs.underlying, fullpath), nil +} + +func (fs *ChrootHelper) Root() string { + return fs.base +} + +func (fs *ChrootHelper) Underlying() billy.Basic { + return fs.underlying +} + +// Capabilities implements the Capable interface. +func (fs *ChrootHelper) Capabilities() billy.Capability { + return billy.Capabilities(fs.underlying) +} + +type file struct { + billy.File + name string +} + +func newFile(fs billy.Filesystem, f billy.File, filename string) billy.File { + filename = fs.Join(fs.Root(), filename) + filename, _ = filepath.Rel(fs.Root(), filename) + + return &file{ + File: f, + name: filename, + } +} + +func (f *file) Name() string { + return f.name +} diff --git a/vendor/github.com/go-git/go-billy/v5/helper/polyfill/polyfill.go b/vendor/github.com/go-git/go-billy/v5/helper/polyfill/polyfill.go new file mode 100644 index 000000000..1efce0e7b --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/helper/polyfill/polyfill.go @@ -0,0 +1,105 @@ +package polyfill + +import ( + "os" + "path/filepath" + + "github.com/go-git/go-billy/v5" +) + +// Polyfill is a helper that implements all missing method from billy.Filesystem. +type Polyfill struct { + billy.Basic + c capabilities +} + +type capabilities struct{ tempfile, dir, symlink, chroot bool } + +// New creates a new filesystem wrapping up 'fs' the intercepts all the calls +// made and errors if fs doesn't implement any of the billy interfaces. +func New(fs billy.Basic) billy.Filesystem { + if original, ok := fs.(billy.Filesystem); ok { + return original + } + + h := &Polyfill{Basic: fs} + + _, h.c.tempfile = h.Basic.(billy.TempFile) + _, h.c.dir = h.Basic.(billy.Dir) + _, h.c.symlink = h.Basic.(billy.Symlink) + _, h.c.chroot = h.Basic.(billy.Chroot) + return h +} + +func (h *Polyfill) TempFile(dir, prefix string) (billy.File, error) { + if !h.c.tempfile { + return nil, billy.ErrNotSupported + } + + return h.Basic.(billy.TempFile).TempFile(dir, prefix) +} + +func (h *Polyfill) ReadDir(path string) ([]os.FileInfo, error) { + if !h.c.dir { + return nil, billy.ErrNotSupported + } + + return h.Basic.(billy.Dir).ReadDir(path) +} + +func (h *Polyfill) MkdirAll(filename string, perm os.FileMode) error { + if !h.c.dir { + return billy.ErrNotSupported + } + + return h.Basic.(billy.Dir).MkdirAll(filename, perm) +} + +func (h *Polyfill) Symlink(target, link string) error { + if !h.c.symlink { + return billy.ErrNotSupported + } + + return h.Basic.(billy.Symlink).Symlink(target, link) +} + +func (h *Polyfill) Readlink(link string) (string, error) { + if !h.c.symlink { + return "", billy.ErrNotSupported + } + + return h.Basic.(billy.Symlink).Readlink(link) +} + +func (h *Polyfill) Lstat(path string) (os.FileInfo, error) { + if !h.c.symlink { + return nil, billy.ErrNotSupported + } + + return h.Basic.(billy.Symlink).Lstat(path) +} + +func (h *Polyfill) Chroot(path string) (billy.Filesystem, error) { + if !h.c.chroot { + return nil, billy.ErrNotSupported + } + + return h.Basic.(billy.Chroot).Chroot(path) +} + +func (h *Polyfill) Root() string { + if !h.c.chroot { + return string(filepath.Separator) + } + + return h.Basic.(billy.Chroot).Root() +} + +func (h *Polyfill) Underlying() billy.Basic { + return h.Basic +} + +// Capabilities implements the Capable interface. +func (h *Polyfill) Capabilities() billy.Capability { + return billy.Capabilities(h.Basic) +} diff --git a/vendor/github.com/go-git/go-billy/v5/osfs/os.go b/vendor/github.com/go-git/go-billy/v5/osfs/os.go new file mode 100644 index 000000000..880389fff --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/osfs/os.go @@ -0,0 +1,139 @@ +// Package osfs provides a billy filesystem for the OS. +package osfs // import "github.com/go-git/go-billy/v5/osfs" + +import ( + "io/ioutil" + "os" + "path/filepath" + "sync" + + "github.com/go-git/go-billy/v5" + "github.com/go-git/go-billy/v5/helper/chroot" +) + +const ( + defaultDirectoryMode = 0755 + defaultCreateMode = 0666 +) + +// OS is a filesystem based on the os filesystem. +type OS struct{} + +// New returns a new OS filesystem. +func New(baseDir string) billy.Filesystem { + return chroot.New(&OS{}, baseDir) +} + +func (fs *OS) Create(filename string) (billy.File, error) { + return fs.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, defaultCreateMode) +} + +func (fs *OS) OpenFile(filename string, flag int, perm os.FileMode) (billy.File, error) { + if flag&os.O_CREATE != 0 { + if err := fs.createDir(filename); err != nil { + return nil, err + } + } + + f, err := os.OpenFile(filename, flag, perm) + if err != nil { + return nil, err + } + return &file{File: f}, err +} + +func (fs *OS) createDir(fullpath string) error { + dir := filepath.Dir(fullpath) + if dir != "." { + if err := os.MkdirAll(dir, defaultDirectoryMode); err != nil { + return err + } + } + + return nil +} + +func (fs *OS) ReadDir(path string) ([]os.FileInfo, error) { + l, err := ioutil.ReadDir(path) + if err != nil { + return nil, err + } + + var s = make([]os.FileInfo, len(l)) + for i, f := range l { + s[i] = f + } + + return s, nil +} + +func (fs *OS) Rename(from, to string) error { + if err := fs.createDir(to); err != nil { + return err + } + + return rename(from, to) +} + +func (fs *OS) MkdirAll(path string, perm os.FileMode) error { + return os.MkdirAll(path, defaultDirectoryMode) +} + +func (fs *OS) Open(filename string) (billy.File, error) { + return fs.OpenFile(filename, os.O_RDONLY, 0) +} + +func (fs *OS) Stat(filename string) (os.FileInfo, error) { + return os.Stat(filename) +} + +func (fs *OS) Remove(filename string) error { + return os.Remove(filename) +} + +func (fs *OS) TempFile(dir, prefix string) (billy.File, error) { + if err := fs.createDir(dir + string(os.PathSeparator)); err != nil { + return nil, err + } + + f, err := ioutil.TempFile(dir, prefix) + if err != nil { + return nil, err + } + return &file{File: f}, nil +} + +func (fs *OS) Join(elem ...string) string { + return filepath.Join(elem...) +} + +func (fs *OS) RemoveAll(path string) error { + return os.RemoveAll(filepath.Clean(path)) +} + +func (fs *OS) Lstat(filename string) (os.FileInfo, error) { + return os.Lstat(filepath.Clean(filename)) +} + +func (fs *OS) Symlink(target, link string) error { + if err := fs.createDir(link); err != nil { + return err + } + + return os.Symlink(target, link) +} + +func (fs *OS) Readlink(link string) (string, error) { + return os.Readlink(link) +} + +// Capabilities implements the Capable interface. +func (fs *OS) Capabilities() billy.Capability { + return billy.DefaultCapabilities +} + +// file is a wrapper for an os.File which adds support for file locking. +type file struct { + *os.File + m sync.Mutex +} diff --git a/vendor/github.com/go-git/go-billy/v5/osfs/os_plan9.go b/vendor/github.com/go-git/go-billy/v5/osfs/os_plan9.go new file mode 100644 index 000000000..fe1eb85df --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/osfs/os_plan9.go @@ -0,0 +1,83 @@ +package osfs + +import ( + "io" + "os" + "path/filepath" + "syscall" +) + +func (f *file) Lock() error { + // Plan 9 uses a mode bit instead of explicit lock/unlock syscalls. + // + // Per http://man.cat-v.org/plan_9/5/stat: “Exclusive use files may be open + // for I/O by only one fid at a time across all clients of the server. If a + // second open is attempted, it draws an error.” + // + // There is no obvious way to implement this function using the exclusive use bit. + // See https://golang.org/src/cmd/go/internal/lockedfile/lockedfile_plan9.go + // for how file locking is done by the go tool on Plan 9. + return nil +} + +func (f *file) Unlock() error { + return nil +} + +func rename(from, to string) error { + // If from and to are in different directories, copy the file + // since Plan 9 does not support cross-directory rename. + if filepath.Dir(from) != filepath.Dir(to) { + fi, err := os.Stat(from) + if err != nil { + return &os.LinkError{"rename", from, to, err} + } + if fi.Mode().IsDir() { + return &os.LinkError{"rename", from, to, syscall.EISDIR} + } + fromFile, err := os.Open(from) + if err != nil { + return &os.LinkError{"rename", from, to, err} + } + toFile, err := os.OpenFile(to, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, fi.Mode()) + if err != nil { + return &os.LinkError{"rename", from, to, err} + } + _, err = io.Copy(toFile, fromFile) + if err != nil { + return &os.LinkError{"rename", from, to, err} + } + + // Copy mtime and mode from original file. + // We need only one syscall if we avoid os.Chmod and os.Chtimes. + dir := fi.Sys().(*syscall.Dir) + var d syscall.Dir + d.Null() + d.Mtime = dir.Mtime + d.Mode = dir.Mode + if err = dirwstat(to, &d); err != nil { + return &os.LinkError{"rename", from, to, err} + } + + // Remove original file. + err = os.Remove(from) + if err != nil { + return &os.LinkError{"rename", from, to, err} + } + return nil + } + return os.Rename(from, to) +} + +func dirwstat(name string, d *syscall.Dir) error { + var buf [syscall.STATFIXLEN]byte + + n, err := d.Marshal(buf[:]) + if err != nil { + return &os.PathError{"dirwstat", name, err} + } + if err = syscall.Wstat(name, buf[:n]); err != nil { + return &os.PathError{"dirwstat", name, err} + } + return nil +} diff --git a/vendor/github.com/go-git/go-billy/v5/osfs/os_posix.go b/vendor/github.com/go-git/go-billy/v5/osfs/os_posix.go new file mode 100644 index 000000000..7645dd52e --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/osfs/os_posix.go @@ -0,0 +1,27 @@ +// +build !plan9,!windows + +package osfs + +import ( + "os" + + "golang.org/x/sys/unix" +) + +func (f *file) Lock() error { + f.m.Lock() + defer f.m.Unlock() + + return unix.Flock(int(f.File.Fd()), unix.LOCK_EX) +} + +func (f *file) Unlock() error { + f.m.Lock() + defer f.m.Unlock() + + return unix.Flock(int(f.File.Fd()), unix.LOCK_UN) +} + +func rename(from, to string) error { + return os.Rename(from, to) +} diff --git a/vendor/github.com/go-git/go-billy/v5/osfs/os_windows.go b/vendor/github.com/go-git/go-billy/v5/osfs/os_windows.go new file mode 100644 index 000000000..8f5caeb0e --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/osfs/os_windows.go @@ -0,0 +1,61 @@ +// +build windows + +package osfs + +import ( + "os" + "runtime" + "unsafe" + + "golang.org/x/sys/windows" +) + +type fileInfo struct { + os.FileInfo + name string +} + +func (fi *fileInfo) Name() string { + return fi.name +} + +var ( + kernel32DLL = windows.NewLazySystemDLL("kernel32.dll") + lockFileExProc = kernel32DLL.NewProc("LockFileEx") + unlockFileProc = kernel32DLL.NewProc("UnlockFile") +) + +const ( + lockfileExclusiveLock = 0x2 +) + +func (f *file) Lock() error { + f.m.Lock() + defer f.m.Unlock() + + var overlapped windows.Overlapped + // err is always non-nil as per sys/windows semantics. + ret, _, err := lockFileExProc.Call(f.File.Fd(), lockfileExclusiveLock, 0, 0xFFFFFFFF, 0, + uintptr(unsafe.Pointer(&overlapped))) + runtime.KeepAlive(&overlapped) + if ret == 0 { + return err + } + return nil +} + +func (f *file) Unlock() error { + f.m.Lock() + defer f.m.Unlock() + + // err is always non-nil as per sys/windows semantics. + ret, _, err := unlockFileProc.Call(f.File.Fd(), 0, 0, 0xFFFFFFFF, 0) + if ret == 0 { + return err + } + return nil +} + +func rename(from, to string) error { + return os.Rename(from, to) +} diff --git a/vendor/github.com/go-git/go-billy/v5/util/glob.go b/vendor/github.com/go-git/go-billy/v5/util/glob.go new file mode 100644 index 000000000..f7cb1de89 --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/util/glob.go @@ -0,0 +1,111 @@ +package util + +import ( + "path/filepath" + "sort" + "strings" + + "github.com/go-git/go-billy/v5" +) + +// Glob returns the names of all files matching pattern or nil +// if there is no matching file. The syntax of patterns is the same +// as in Match. The pattern may describe hierarchical names such as +// /usr/*/bin/ed (assuming the Separator is '/'). +// +// Glob ignores file system errors such as I/O errors reading directories. +// The only possible returned error is ErrBadPattern, when pattern +// is malformed. +// +// Function originally from https://golang.org/src/path/filepath/match_test.go +func Glob(fs billy.Filesystem, pattern string) (matches []string, err error) { + if !hasMeta(pattern) { + if _, err = fs.Lstat(pattern); err != nil { + return nil, nil + } + return []string{pattern}, nil + } + + dir, file := filepath.Split(pattern) + // Prevent infinite recursion. See issue 15879. + if dir == pattern { + return nil, filepath.ErrBadPattern + } + + var m []string + m, err = Glob(fs, cleanGlobPath(dir)) + if err != nil { + return + } + for _, d := range m { + matches, err = glob(fs, d, file, matches) + if err != nil { + return + } + } + return +} + +// cleanGlobPath prepares path for glob matching. +func cleanGlobPath(path string) string { + switch path { + case "": + return "." + case string(filepath.Separator): + // do nothing to the path + return path + default: + return path[0 : len(path)-1] // chop off trailing separator + } +} + +// glob searches for files matching pattern in the directory dir +// and appends them to matches. If the directory cannot be +// opened, it returns the existing matches. New matches are +// added in lexicographical order. +func glob(fs billy.Filesystem, dir, pattern string, matches []string) (m []string, e error) { + m = matches + fi, err := fs.Stat(dir) + if err != nil { + return + } + + if !fi.IsDir() { + return + } + + names, _ := readdirnames(fs, dir) + sort.Strings(names) + + for _, n := range names { + matched, err := filepath.Match(pattern, n) + if err != nil { + return m, err + } + if matched { + m = append(m, filepath.Join(dir, n)) + } + } + return +} + +// hasMeta reports whether path contains any of the magic characters +// recognized by Match. +func hasMeta(path string) bool { + // TODO(niemeyer): Should other magic characters be added here? + return strings.ContainsAny(path, "*?[") +} + +func readdirnames(fs billy.Filesystem, dir string) ([]string, error) { + files, err := fs.ReadDir(dir) + if err != nil { + return nil, err + } + + var names []string + for _, file := range files { + names = append(names, file.Name()) + } + + return names, nil +} diff --git a/vendor/github.com/go-git/go-billy/v5/util/util.go b/vendor/github.com/go-git/go-billy/v5/util/util.go new file mode 100644 index 000000000..34c1d9e74 --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/util/util.go @@ -0,0 +1,224 @@ +package util + +import ( + "io" + "os" + "path/filepath" + "strconv" + "sync" + "time" + + "github.com/go-git/go-billy/v5" +) + +// RemoveAll removes path and any children it contains. It removes everything it +// can but returns the first error it encounters. If the path does not exist, +// RemoveAll returns nil (no error). +func RemoveAll(fs billy.Basic, path string) error { + fs, path = getUnderlyingAndPath(fs, path) + + if r, ok := fs.(removerAll); ok { + return r.RemoveAll(path) + } + + return removeAll(fs, path) +} + +type removerAll interface { + RemoveAll(string) error +} + +func removeAll(fs billy.Basic, path string) error { + // This implementation is adapted from os.RemoveAll. + + // Simple case: if Remove works, we're done. + err := fs.Remove(path) + if err == nil || os.IsNotExist(err) { + return nil + } + + // Otherwise, is this a directory we need to recurse into? + dir, serr := fs.Stat(path) + if serr != nil { + if os.IsNotExist(serr) { + return nil + } + + return serr + } + + if !dir.IsDir() { + // Not a directory; return the error from Remove. + return err + } + + dirfs, ok := fs.(billy.Dir) + if !ok { + return billy.ErrNotSupported + } + + // Directory. + fis, err := dirfs.ReadDir(path) + if err != nil { + if os.IsNotExist(err) { + // Race. It was deleted between the Lstat and Open. + // Return nil per RemoveAll's docs. + return nil + } + + return err + } + + // Remove contents & return first error. + err = nil + for _, fi := range fis { + cpath := fs.Join(path, fi.Name()) + err1 := removeAll(fs, cpath) + if err == nil { + err = err1 + } + } + + // Remove directory. + err1 := fs.Remove(path) + if err1 == nil || os.IsNotExist(err1) { + return nil + } + + if err == nil { + err = err1 + } + + return err + +} + +// WriteFile writes data to a file named by filename in the given filesystem. +// If the file does not exist, WriteFile creates it with permissions perm; +// otherwise WriteFile truncates it before writing. +func WriteFile(fs billy.Basic, filename string, data []byte, perm os.FileMode) error { + f, err := fs.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm) + if err != nil { + return err + } + + n, err := f.Write(data) + if err == nil && n < len(data) { + err = io.ErrShortWrite + } + + if err1 := f.Close(); err == nil { + err = err1 + } + + return err +} + +// Random number state. +// We generate random temporary file names so that there's a good +// chance the file doesn't exist yet - keeps the number of tries in +// TempFile to a minimum. +var rand uint32 +var randmu sync.Mutex + +func reseed() uint32 { + return uint32(time.Now().UnixNano() + int64(os.Getpid())) +} + +func nextSuffix() string { + randmu.Lock() + r := rand + if r == 0 { + r = reseed() + } + r = r*1664525 + 1013904223 // constants from Numerical Recipes + rand = r + randmu.Unlock() + return strconv.Itoa(int(1e9 + r%1e9))[1:] +} + +// TempFile creates a new temporary file in the directory dir with a name +// beginning with prefix, opens the file for reading and writing, and returns +// the resulting *os.File. If dir is the empty string, TempFile uses the default +// directory for temporary files (see os.TempDir). Multiple programs calling +// TempFile simultaneously will not choose the same file. The caller can use +// f.Name() to find the pathname of the file. It is the caller's responsibility +// to remove the file when no longer needed. +func TempFile(fs billy.Basic, dir, prefix string) (f billy.File, err error) { + // This implementation is based on stdlib ioutil.TempFile. + + if dir == "" { + dir = os.TempDir() + } + + nconflict := 0 + for i := 0; i < 10000; i++ { + name := filepath.Join(dir, prefix+nextSuffix()) + f, err = fs.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600) + if os.IsExist(err) { + if nconflict++; nconflict > 10 { + randmu.Lock() + rand = reseed() + randmu.Unlock() + } + continue + } + break + } + return +} + +// TempDir creates a new temporary directory in the directory dir +// with a name beginning with prefix and returns the path of the +// new directory. If dir is the empty string, TempDir uses the +// default directory for temporary files (see os.TempDir). +// Multiple programs calling TempDir simultaneously +// will not choose the same directory. It is the caller's responsibility +// to remove the directory when no longer needed. +func TempDir(fs billy.Dir, dir, prefix string) (name string, err error) { + // This implementation is based on stdlib ioutil.TempDir + + if dir == "" { + dir = os.TempDir() + } + + nconflict := 0 + for i := 0; i < 10000; i++ { + try := filepath.Join(dir, prefix+nextSuffix()) + err = fs.MkdirAll(try, 0700) + if os.IsExist(err) { + if nconflict++; nconflict > 10 { + randmu.Lock() + rand = reseed() + randmu.Unlock() + } + continue + } + if os.IsNotExist(err) { + if _, err := os.Stat(dir); os.IsNotExist(err) { + return "", err + } + } + if err == nil { + name = try + } + break + } + return +} + +type underlying interface { + Underlying() billy.Basic +} + +func getUnderlyingAndPath(fs billy.Basic, path string) (billy.Basic, string) { + u, ok := fs.(underlying) + if !ok { + return fs, path + } + if ch, ok := fs.(billy.Chroot); ok { + path = fs.Join(ch.Root(), path) + } + + return u.Underlying(), path +} diff --git a/vendor/github.com/go-git/go-git/v5/.gitignore b/vendor/github.com/go-git/go-git/v5/.gitignore new file mode 100644 index 000000000..038dd9f1e --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/.gitignore @@ -0,0 +1,4 @@ +coverage.out +*~ +coverage.txt +profile.out diff --git a/vendor/github.com/go-git/go-git/v5/CODE_OF_CONDUCT.md b/vendor/github.com/go-git/go-git/v5/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..a689fa3c3 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/CODE_OF_CONDUCT.md @@ -0,0 +1,74 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +education, socio-economic status, nationality, personal appearance, race, +religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at conduct@sourced.tech. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + diff --git a/vendor/github.com/go-git/go-git/v5/COMPATIBILITY.md b/vendor/github.com/go-git/go-git/v5/COMPATIBILITY.md new file mode 100644 index 000000000..2a72b501e --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/COMPATIBILITY.md @@ -0,0 +1,111 @@ +Supported Capabilities +====================== + +Here is a non-comprehensive table of git commands and features whose equivalent +is supported by go-git. + +| Feature | Status | Notes | +|---------------------------------------|--------|-------| +| **config** | +| config | ✔ | Reading and modifying per-repository configuration (`.git/config`) is supported. Global configuration (`$HOME/.gitconfig`) is not. | +| **getting and creating repositories** | +| init | ✔ | Plain init and `--bare` are supported. Flags `--template`, `--separate-git-dir` and `--shared` are not. | +| clone | ✔ | Plain clone and equivalents to `--progress`, `--single-branch`, `--depth`, `--origin`, `--recurse-submodules` are supported. Others are not. | +| **basic snapshotting** | +| add | ✔ | Plain add is supported. Any other flags aren't supported | +| status | ✔ | +| commit | ✔ | +| reset | ✔ | +| rm | ✔ | +| mv | ✔ | +| **branching and merging** | +| branch | ✔ | +| checkout | ✔ | Basic usages of checkout are supported. | +| merge | ✖ | +| mergetool | ✖ | +| stash | ✖ | +| tag | ✔ | +| **sharing and updating projects** | +| fetch | ✔ | +| pull | ✔ | Only supports merges where the merge can be resolved as a fast-forward. | +| push | ✔ | +| remote | ✔ | +| submodule | ✔ | +| **inspection and comparison** | +| show | ✔ | +| log | ✔ | +| shortlog | (see log) | +| describe | | +| **patching** | +| apply | ✖ | +| cherry-pick | ✖ | +| diff | ✔ | Patch object with UnifiedDiff output representation | +| rebase | ✖ | +| revert | ✖ | +| **debugging** | +| bisect | ✖ | +| blame | ✔ | +| grep | ✔ | +| **email** || +| am | ✖ | +| apply | ✖ | +| format-patch | ✖ | +| send-email | ✖ | +| request-pull | ✖ | +| **external systems** | +| svn | ✖ | +| fast-import | ✖ | +| **administration** | +| clean | ✔ | +| gc | ✖ | +| fsck | ✖ | +| reflog | ✖ | +| filter-branch | ✖ | +| instaweb | ✖ | +| archive | ✖ | +| bundle | ✖ | +| prune | ✖ | +| repack | ✖ | +| **server admin** | +| daemon | | +| update-server-info | | +| **advanced** | +| notes | ✖ | +| replace | ✖ | +| worktree | ✖ | +| annotate | (see blame) | +| **gpg** | +| git-verify-commit | ✔ | +| git-verify-tag | ✔ | +| **plumbing commands** | +| cat-file | ✔ | +| check-ignore | | +| commit-tree | | +| count-objects | | +| diff-index | | +| for-each-ref | ✔ | +| hash-object | ✔ | +| ls-files | ✔ | +| merge-base | ✔ | Calculates the merge-base only between two commits, and supports `--independent` and `--is-ancestor` modifiers; Does not support `--fork-point` nor `--octopus` modifiers. | +| read-tree | | +| rev-list | ✔ | +| rev-parse | | +| show-ref | ✔ | +| symbolic-ref | ✔ | +| update-index | | +| update-ref | | +| verify-pack | | +| write-tree | | +| **protocols** | +| http(s):// (dumb) | ✖ | +| http(s):// (smart) | ✔ | +| git:// | ✔ | +| ssh:// | ✔ | +| file:// | partial | Warning: this is not pure Golang. This shells out to the `git` binary. | +| custom | ✔ | +| **other features** | +| gitignore | ✔ | +| gitattributes | ✖ | +| index version | | +| packfile version | | +| push-certs | ✖ | diff --git a/vendor/github.com/go-git/go-git/v5/CONTRIBUTING.md b/vendor/github.com/go-git/go-git/v5/CONTRIBUTING.md new file mode 100644 index 000000000..fce25328a --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/CONTRIBUTING.md @@ -0,0 +1,46 @@ +# Contributing Guidelines + +source{d} go-git project is [Apache 2.0 licensed](LICENSE) and accepts +contributions via GitHub pull requests. This document outlines some of the +conventions on development workflow, commit message formatting, contact points, +and other resources to make it easier to get your contribution accepted. + +## Support Channels + +The official support channels, for both users and contributors, are: + +- [StackOverflow go-git tag](https://stackoverflow.com/questions/tagged/go-git) for user questions. +- GitHub [Issues](https://github.com/src-d/go-git/issues)* for bug reports and feature requests. + +*Before opening a new issue or submitting a new pull request, it's helpful to +search the project - it's likely that another user has already reported the +issue you're facing, or it's a known issue that we're already aware of. + + +## How to Contribute + +Pull Requests (PRs) are the main and exclusive way to contribute to the official go-git project. +In order for a PR to be accepted it needs to pass a list of requirements: + +- You should be able to run the same query using `git`. We don't accept features that are not implemented in the official git implementation. +- The expected behavior must match the [official git implementation](https://github.com/git/git). +- The actual behavior must be correctly explained with natural language and providing a minimum working example in Go that reproduces it. +- All PRs must be written in idiomatic Go, formatted according to [gofmt](https://golang.org/cmd/gofmt/), and without any warnings from [go lint](https://github.com/golang/lint) nor [go vet](https://golang.org/cmd/vet/). +- They should in general include tests, and those shall pass. +- If the PR is a bug fix, it has to include a suite of unit tests for the new functionality. +- If the PR is a new feature, it has to come with a suite of unit tests, that tests the new functionality. +- In any case, all the PRs have to pass the personal evaluation of at least one of the maintainers of go-git. + +### Format of the commit message + +Every commit message should describe what was changed, under which context and, if applicable, the GitHub issue it relates to: + +``` +plumbing: packp, Skip argument validations for unknown capabilities. Fixes #623 +``` + +The format can be described more formally as follows: + +``` +: , . [Fixes #] +``` diff --git a/vendor/github.com/go-git/go-git/v5/LICENSE b/vendor/github.com/go-git/go-git/v5/LICENSE new file mode 100644 index 000000000..8aa3d854c --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2018 Sourced Technologies, S.L. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/go-git/go-git/v5/Makefile b/vendor/github.com/go-git/go-git/v5/Makefile new file mode 100644 index 000000000..d10922fb1 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/Makefile @@ -0,0 +1,38 @@ +# General +WORKDIR = $(PWD) + +# Go parameters +GOCMD = go +GOTEST = $(GOCMD) test + +# Git config +GIT_VERSION ?= +GIT_DIST_PATH ?= $(PWD)/.git-dist +GIT_REPOSITORY = http://github.com/git/git.git + +# Coverage +COVERAGE_REPORT = coverage.out +COVERAGE_MODE = count + +build-git: + @if [ -f $(GIT_DIST_PATH)/git ]; then \ + echo "nothing to do, using cache $(GIT_DIST_PATH)"; \ + else \ + git clone $(GIT_REPOSITORY) -b $(GIT_VERSION) --depth 1 --single-branch $(GIT_DIST_PATH); \ + cd $(GIT_DIST_PATH); \ + make configure; \ + ./configure; \ + make all; \ + fi + +test: + @echo "running against `git version`"; \ + $(GOTEST) ./... + +test-coverage: + @echo "running against `git version`"; \ + echo "" > $(COVERAGE_REPORT); \ + $(GOTEST) -coverprofile=$(COVERAGE_REPORT) -coverpkg=./... -covermode=$(COVERAGE_MODE) ./... + +clean: + rm -rf $(GIT_DIST_PATH) \ No newline at end of file diff --git a/vendor/github.com/go-git/go-git/v5/README.md b/vendor/github.com/go-git/go-git/v5/README.md new file mode 100644 index 000000000..ff0c9b72b --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/README.md @@ -0,0 +1,131 @@ +![go-git logo](https://cdn.rawgit.com/src-d/artwork/02036484/go-git/files/go-git-github-readme-header.png) +[![GoDoc](https://godoc.org/github.com/go-git/go-git/v5?status.svg)](https://pkg.go.dev/github.com/go-git/go-git/v5) [![Build Status](https://github.com/go-git/go-git/workflows/Test/badge.svg)](https://github.com/go-git/go-git/actions) [![Go Report Card](https://goreportcard.com/badge/github.com/go-git/go-git)](https://goreportcard.com/report/github.com/go-git/go-git) + +*go-git* is a highly extensible git implementation library written in **pure Go**. + +It can be used to manipulate git repositories at low level *(plumbing)* or high level *(porcelain)*, through an idiomatic Go API. It also supports several types of storage, such as in-memory filesystems, or custom implementations, thanks to the [`Storer`](https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/storer) interface. + +It's being actively developed since 2015 and is being used extensively by [Keybase](https://keybase.io/blog/encrypted-git-for-everyone), [Gitea](https://gitea.io/en-us/) or [Pulumi](https://github.com/search?q=org%3Apulumi+go-git&type=Code), and by many other libraries and tools. + +Project Status +-------------- + +After the legal issues with the [`src-d`](https://github.com/src-d) organization, the lack of update for four months and the requirement to make a hard fork, the project is **now back to normality**. + +The project is currently actively maintained by individual contributors, including several of the original authors, but also backed by a new company, [gitsight](https://github.com/gitsight), where `go-git` is a critical component used at scale. + + +Comparison with git +------------------- + +*go-git* aims to be fully compatible with [git](https://github.com/git/git), all the *porcelain* operations are implemented to work exactly as *git* does. + +*git* is a humongous project with years of development by thousands of contributors, making it challenging for *go-git* to implement all the features. You can find a comparison of *go-git* vs *git* in the [compatibility documentation](COMPATIBILITY.md). + + +Installation +------------ + +The recommended way to install *go-git* is: + +```go +import "github.com/go-git/go-git/v5" // with go modules enabled (GO111MODULE=on or outside GOPATH) +import "github.com/go-git/go-git" // with go modules disabled +``` + + +Examples +-------- + +> Please note that the `CheckIfError` and `Info` functions used in the examples are from the [examples package](https://github.com/go-git/go-git/blob/master/_examples/common.go#L19) just to be used in the examples. + + +### Basic example + +A basic example that mimics the standard `git clone` command + +```go +// Clone the given repository to the given directory +Info("git clone https://github.com/go-git/go-git") + +_, err := git.PlainClone("/tmp/foo", false, &git.CloneOptions{ + URL: "https://github.com/go-git/go-git", + Progress: os.Stdout, +}) + +CheckIfError(err) +``` + +Outputs: +``` +Counting objects: 4924, done. +Compressing objects: 100% (1333/1333), done. +Total 4924 (delta 530), reused 6 (delta 6), pack-reused 3533 +``` + +### In-memory example + +Cloning a repository into memory and printing the history of HEAD, just like `git log` does + + +```go +// Clones the given repository in memory, creating the remote, the local +// branches and fetching the objects, exactly as: +Info("git clone https://github.com/go-git/go-billy") + +r, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{ + URL: "https://github.com/go-git/go-billy", +}) + +CheckIfError(err) + +// Gets the HEAD history from HEAD, just like this command: +Info("git log") + +// ... retrieves the branch pointed by HEAD +ref, err := r.Head() +CheckIfError(err) + + +// ... retrieves the commit history +cIter, err := r.Log(&git.LogOptions{From: ref.Hash()}) +CheckIfError(err) + +// ... just iterates over the commits, printing it +err = cIter.ForEach(func(c *object.Commit) error { + fmt.Println(c) + return nil +}) +CheckIfError(err) +``` + +Outputs: +``` +commit ded8054fd0c3994453e9c8aacaf48d118d42991e +Author: Santiago M. Mola +Date: Sat Nov 12 21:18:41 2016 +0100 + + index: ReadFrom/WriteTo returns IndexReadError/IndexWriteError. (#9) + +commit df707095626f384ce2dc1a83b30f9a21d69b9dfc +Author: Santiago M. Mola +Date: Fri Nov 11 13:23:22 2016 +0100 + + readwriter: fix bug when writing index. (#10) + + When using ReadWriter on an existing siva file, absolute offset for + index entries was not being calculated correctly. +... +``` + +You can find this [example](_examples/log/main.go) and many others in the [examples](_examples) folder. + +Contribute +---------- + +[Contributions](https://github.com/go-git/go-git/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) are more than welcome, if you are interested please take a look to +our [Contributing Guidelines](CONTRIBUTING.md). + +License +------- +Apache License Version 2.0, see [LICENSE](LICENSE) diff --git a/vendor/github.com/go-git/go-git/v5/blame.go b/vendor/github.com/go-git/go-git/v5/blame.go new file mode 100644 index 000000000..43634b32c --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/blame.go @@ -0,0 +1,302 @@ +package git + +import ( + "bytes" + "errors" + "fmt" + "strconv" + "strings" + "time" + "unicode/utf8" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/object" + "github.com/go-git/go-git/v5/utils/diff" +) + +// BlameResult represents the result of a Blame operation. +type BlameResult struct { + // Path is the path of the File that we're blaming. + Path string + // Rev (Revision) is the hash of the specified Commit used to generate this result. + Rev plumbing.Hash + // Lines contains every line with its authorship. + Lines []*Line +} + +// Blame returns a BlameResult with the information about the last author of +// each line from file `path` at commit `c`. +func Blame(c *object.Commit, path string) (*BlameResult, error) { + // The file to blame is identified by the input arguments: + // commit and path. commit is a Commit object obtained from a Repository. Path + // represents a path to a specific file contained into the repository. + // + // Blaming a file is a two step process: + // + // 1. Create a linear history of the commits affecting a file. We use + // revlist.New for that. + // + // 2. Then build a graph with a node for every line in every file in + // the history of the file. + // + // Each node is assigned a commit: Start by the nodes in the first + // commit. Assign that commit as the creator of all its lines. + // + // Then jump to the nodes in the next commit, and calculate the diff + // between the two files. Newly created lines get + // assigned the new commit as its origin. Modified lines also get + // this new commit. Untouched lines retain the old commit. + // + // All this work is done in the assignOrigin function which holds all + // the internal relevant data in a "blame" struct, that is not + // exported. + // + // TODO: ways to improve the efficiency of this function: + // 1. Improve revlist + // 2. Improve how to traverse the history (example a backward traversal will + // be much more efficient) + // + // TODO: ways to improve the function in general: + // 1. Add memoization between revlist and assign. + // 2. It is using much more memory than needed, see the TODOs below. + + b := new(blame) + b.fRev = c + b.path = path + + // get all the file revisions + if err := b.fillRevs(); err != nil { + return nil, err + } + + // calculate the line tracking graph and fill in + // file contents in data. + if err := b.fillGraphAndData(); err != nil { + return nil, err + } + + file, err := b.fRev.File(b.path) + if err != nil { + return nil, err + } + finalLines, err := file.Lines() + if err != nil { + return nil, err + } + + // Each node (line) holds the commit where it was introduced or + // last modified. To achieve that we use the FORWARD algorithm + // described in Zimmermann, et al. "Mining Version Archives for + // Co-changed Lines", in proceedings of the Mining Software + // Repositories workshop, Shanghai, May 22-23, 2006. + lines, err := newLines(finalLines, b.sliceGraph(len(b.graph)-1)) + if err != nil { + return nil, err + } + + return &BlameResult{ + Path: path, + Rev: c.Hash, + Lines: lines, + }, nil +} + +// Line values represent the contents and author of a line in BlamedResult values. +type Line struct { + // Author is the email address of the last author that modified the line. + Author string + // Text is the original text of the line. + Text string + // Date is when the original text of the line was introduced + Date time.Time + // Hash is the commit hash that introduced the original line + Hash plumbing.Hash +} + +func newLine(author, text string, date time.Time, hash plumbing.Hash) *Line { + return &Line{ + Author: author, + Text: text, + Hash: hash, + Date: date, + } +} + +func newLines(contents []string, commits []*object.Commit) ([]*Line, error) { + lcontents := len(contents) + lcommits := len(commits) + + if lcontents != lcommits { + if lcontents == lcommits-1 && contents[lcontents-1] != "\n" { + contents = append(contents, "\n") + } else { + return nil, errors.New("contents and commits have different length") + } + } + + result := make([]*Line, 0, lcontents) + for i := range contents { + result = append(result, newLine( + commits[i].Author.Email, contents[i], + commits[i].Author.When, commits[i].Hash, + )) + } + + return result, nil +} + +// this struct is internally used by the blame function to hold its +// inputs, outputs and state. +type blame struct { + // the path of the file to blame + path string + // the commit of the final revision of the file to blame + fRev *object.Commit + // the chain of revisions affecting the the file to blame + revs []*object.Commit + // the contents of the file across all its revisions + data []string + // the graph of the lines in the file across all the revisions + graph [][]*object.Commit +} + +// calculate the history of a file "path", starting from commit "from", sorted by commit date. +func (b *blame) fillRevs() error { + var err error + + b.revs, err = references(b.fRev, b.path) + return err +} + +// build graph of a file from its revision history +func (b *blame) fillGraphAndData() error { + //TODO: not all commits are needed, only the current rev and the prev + b.graph = make([][]*object.Commit, len(b.revs)) + b.data = make([]string, len(b.revs)) // file contents in all the revisions + // for every revision of the file, starting with the first + // one... + for i, rev := range b.revs { + // get the contents of the file + file, err := rev.File(b.path) + if err != nil { + return nil + } + b.data[i], err = file.Contents() + if err != nil { + return err + } + nLines := countLines(b.data[i]) + // create a node for each line + b.graph[i] = make([]*object.Commit, nLines) + // assign a commit to each node + // if this is the first revision, then the node is assigned to + // this first commit. + if i == 0 { + for j := 0; j < nLines; j++ { + b.graph[i][j] = b.revs[i] + } + } else { + // if this is not the first commit, then assign to the old + // commit or to the new one, depending on what the diff + // says. + b.assignOrigin(i, i-1) + } + } + return nil +} + +// sliceGraph returns a slice of commits (one per line) for a particular +// revision of a file (0=first revision). +func (b *blame) sliceGraph(i int) []*object.Commit { + fVs := b.graph[i] + result := make([]*object.Commit, 0, len(fVs)) + for _, v := range fVs { + c := *v + result = append(result, &c) + } + return result +} + +// Assigns origin to vertexes in current (c) rev from data in its previous (p) +// revision +func (b *blame) assignOrigin(c, p int) { + // assign origin based on diff info + hunks := diff.Do(b.data[p], b.data[c]) + sl := -1 // source line + dl := -1 // destination line + for h := range hunks { + hLines := countLines(hunks[h].Text) + for hl := 0; hl < hLines; hl++ { + switch { + case hunks[h].Type == 0: + sl++ + dl++ + b.graph[c][dl] = b.graph[p][sl] + case hunks[h].Type == 1: + dl++ + b.graph[c][dl] = b.revs[c] + case hunks[h].Type == -1: + sl++ + default: + panic("unreachable") + } + } + } +} + +// GoString prints the results of a Blame using git-blame's style. +func (b *blame) GoString() string { + var buf bytes.Buffer + + file, err := b.fRev.File(b.path) + if err != nil { + panic("PrettyPrint: internal error in repo.Data") + } + contents, err := file.Contents() + if err != nil { + panic("PrettyPrint: internal error in repo.Data") + } + + lines := strings.Split(contents, "\n") + // max line number length + mlnl := len(strconv.Itoa(len(lines))) + // max author length + mal := b.maxAuthorLength() + format := fmt.Sprintf("%%s (%%-%ds %%%dd) %%s\n", + mal, mlnl) + + fVs := b.graph[len(b.graph)-1] + for ln, v := range fVs { + fmt.Fprintf(&buf, format, v.Hash.String()[:8], + prettyPrintAuthor(fVs[ln]), ln+1, lines[ln]) + } + return buf.String() +} + +// utility function to pretty print the author. +func prettyPrintAuthor(c *object.Commit) string { + return fmt.Sprintf("%s %s", c.Author.Name, c.Author.When.Format("2006-01-02")) +} + +// utility function to calculate the number of runes needed +// to print the longest author name in the blame of a file. +func (b *blame) maxAuthorLength() int { + memo := make(map[plumbing.Hash]struct{}, len(b.graph)-1) + fVs := b.graph[len(b.graph)-1] + m := 0 + for ln := range fVs { + if _, ok := memo[fVs[ln].Hash]; ok { + continue + } + memo[fVs[ln].Hash] = struct{}{} + m = max(m, utf8.RuneCountInString(prettyPrintAuthor(fVs[ln]))) + } + return m +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} diff --git a/vendor/github.com/go-git/go-git/v5/common.go b/vendor/github.com/go-git/go-git/v5/common.go new file mode 100644 index 000000000..f837a2654 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/common.go @@ -0,0 +1,22 @@ +package git + +import "strings" + +const defaultDotGitPath = ".git" + +// countLines returns the number of lines in a string à la git, this is +// The newline character is assumed to be '\n'. The empty string +// contains 0 lines. If the last line of the string doesn't end with a +// newline, it will still be considered a line. +func countLines(s string) int { + if s == "" { + return 0 + } + + nEOL := strings.Count(s, "\n") + if strings.HasSuffix(s, "\n") { + return nEOL + } + + return nEOL + 1 +} diff --git a/vendor/github.com/go-git/go-git/v5/config/branch.go b/vendor/github.com/go-git/go-git/v5/config/branch.go new file mode 100644 index 000000000..fe86cf542 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/config/branch.go @@ -0,0 +1,90 @@ +package config + +import ( + "errors" + + "github.com/go-git/go-git/v5/plumbing" + format "github.com/go-git/go-git/v5/plumbing/format/config" +) + +var ( + errBranchEmptyName = errors.New("branch config: empty name") + errBranchInvalidMerge = errors.New("branch config: invalid merge") + errBranchInvalidRebase = errors.New("branch config: rebase must be one of 'true' or 'interactive'") +) + +// Branch contains information on the +// local branches and which remote to track +type Branch struct { + // Name of branch + Name string + // Remote name of remote to track + Remote string + // Merge is the local refspec for the branch + Merge plumbing.ReferenceName + // Rebase instead of merge when pulling. Valid values are + // "true" and "interactive". "false" is undocumented and + // typically represented by the non-existence of this field + Rebase string + + raw *format.Subsection +} + +// Validate validates fields of branch +func (b *Branch) Validate() error { + if b.Name == "" { + return errBranchEmptyName + } + + if b.Merge != "" && !b.Merge.IsBranch() { + return errBranchInvalidMerge + } + + if b.Rebase != "" && + b.Rebase != "true" && + b.Rebase != "interactive" && + b.Rebase != "false" { + return errBranchInvalidRebase + } + + return nil +} + +func (b *Branch) marshal() *format.Subsection { + if b.raw == nil { + b.raw = &format.Subsection{} + } + + b.raw.Name = b.Name + + if b.Remote == "" { + b.raw.RemoveOption(remoteSection) + } else { + b.raw.SetOption(remoteSection, b.Remote) + } + + if b.Merge == "" { + b.raw.RemoveOption(mergeKey) + } else { + b.raw.SetOption(mergeKey, string(b.Merge)) + } + + if b.Rebase == "" { + b.raw.RemoveOption(rebaseKey) + } else { + b.raw.SetOption(rebaseKey, b.Rebase) + } + + return b.raw +} + +func (b *Branch) unmarshal(s *format.Subsection) error { + b.raw = s + + b.Name = b.raw.Name + b.Remote = b.raw.Options.Get(remoteSection) + b.Merge = plumbing.ReferenceName(b.raw.Options.Get(mergeKey)) + b.Rebase = b.raw.Options.Get(rebaseKey) + + return b.Validate() +} diff --git a/vendor/github.com/go-git/go-git/v5/config/config.go b/vendor/github.com/go-git/go-git/v5/config/config.go new file mode 100644 index 000000000..7d6ab5886 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/config/config.go @@ -0,0 +1,564 @@ +// Package config contains the abstraction of multiple config files +package config + +import ( + "bytes" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "sort" + "strconv" + + "github.com/go-git/go-git/v5/internal/url" + format "github.com/go-git/go-git/v5/plumbing/format/config" + "github.com/mitchellh/go-homedir" +) + +const ( + // DefaultFetchRefSpec is the default refspec used for fetch. + DefaultFetchRefSpec = "+refs/heads/*:refs/remotes/%s/*" + // DefaultPushRefSpec is the default refspec used for push. + DefaultPushRefSpec = "refs/heads/*:refs/heads/*" +) + +// ConfigStorer generic storage of Config object +type ConfigStorer interface { + Config() (*Config, error) + SetConfig(*Config) error +} + +var ( + ErrInvalid = errors.New("config invalid key in remote or branch") + ErrRemoteConfigNotFound = errors.New("remote config not found") + ErrRemoteConfigEmptyURL = errors.New("remote config: empty URL") + ErrRemoteConfigEmptyName = errors.New("remote config: empty name") +) + +// Scope defines the scope of a config file, such as local, global or system. +type Scope int + +// Available ConfigScope's +const ( + LocalScope Scope = iota + GlobalScope + SystemScope +) + +// Config contains the repository configuration +// https://www.kernel.org/pub/software/scm/git/docs/git-config.html#FILES +type Config struct { + Core struct { + // IsBare if true this repository is assumed to be bare and has no + // working directory associated with it. + IsBare bool + // Worktree is the path to the root of the working tree. + Worktree string + // CommentChar is the character indicating the start of a + // comment for commands like commit and tag + CommentChar string + } + + User struct { + // Name is the personal name of the author and the commiter of a commit. + Name string + // Email is the email of the author and the commiter of a commit. + Email string + } + + Author struct { + // Name is the personal name of the author of a commit. + Name string + // Email is the email of the author of a commit. + Email string + } + + Committer struct { + // Name is the personal name of the commiter of a commit. + Name string + // Email is the email of the the commiter of a commit. + Email string + } + + Pack struct { + // Window controls the size of the sliding window for delta + // compression. The default is 10. A value of 0 turns off + // delta compression entirely. + Window uint + } + + // Remotes list of repository remotes, the key of the map is the name + // of the remote, should equal to RemoteConfig.Name. + Remotes map[string]*RemoteConfig + // Submodules list of repository submodules, the key of the map is the name + // of the submodule, should equal to Submodule.Name. + Submodules map[string]*Submodule + // Branches list of branches, the key is the branch name and should + // equal Branch.Name + Branches map[string]*Branch + // Raw contains the raw information of a config file. The main goal is + // preserve the parsed information from the original format, to avoid + // dropping unsupported fields. + Raw *format.Config +} + +// NewConfig returns a new empty Config. +func NewConfig() *Config { + config := &Config{ + Remotes: make(map[string]*RemoteConfig), + Submodules: make(map[string]*Submodule), + Branches: make(map[string]*Branch), + Raw: format.New(), + } + + config.Pack.Window = DefaultPackWindow + + return config +} + +// ReadConfig reads a config file from a io.Reader. +func ReadConfig(r io.Reader) (*Config, error) { + b, err := ioutil.ReadAll(r) + if err != nil { + return nil, err + } + + cfg := NewConfig() + if err = cfg.Unmarshal(b); err != nil { + return nil, err + } + + return cfg, nil +} + +// LoadConfig loads a config file from a given scope. The returned Config, +// contains exclusively information fom the given scope. If couldn't find a +// config file to the given scope, a empty one is returned. +func LoadConfig(scope Scope) (*Config, error) { + if scope == LocalScope { + return nil, fmt.Errorf("LocalScope should be read from the a ConfigStorer.") + } + + files, err := Paths(scope) + if err != nil { + return nil, err + } + + for _, file := range files { + f, err := os.Open(file) + if err != nil { + if os.IsNotExist(err) { + continue + } + + return nil, err + } + + defer f.Close() + return ReadConfig(f) + } + + return NewConfig(), nil +} + +// Paths returns the config file location for a given scope. +func Paths(scope Scope) ([]string, error) { + var files []string + switch scope { + case GlobalScope: + xdg := os.Getenv("XDG_CONFIG_HOME") + if xdg != "" { + files = append(files, filepath.Join(xdg, "git/config")) + } + + home, err := homedir.Dir() + if err != nil { + return nil, err + } + + files = append(files, + filepath.Join(home, ".gitconfig"), + filepath.Join(home, ".config/git/config"), + ) + case SystemScope: + files = append(files, "/etc/gitconfig") + } + + return files, nil +} + +// Validate validates the fields and sets the default values. +func (c *Config) Validate() error { + for name, r := range c.Remotes { + if r.Name != name { + return ErrInvalid + } + + if err := r.Validate(); err != nil { + return err + } + } + + for name, b := range c.Branches { + if b.Name != name { + return ErrInvalid + } + + if err := b.Validate(); err != nil { + return err + } + } + + return nil +} + +const ( + remoteSection = "remote" + submoduleSection = "submodule" + branchSection = "branch" + coreSection = "core" + packSection = "pack" + userSection = "user" + authorSection = "author" + committerSection = "committer" + fetchKey = "fetch" + urlKey = "url" + bareKey = "bare" + worktreeKey = "worktree" + commentCharKey = "commentChar" + windowKey = "window" + mergeKey = "merge" + rebaseKey = "rebase" + nameKey = "name" + emailKey = "email" + + // DefaultPackWindow holds the number of previous objects used to + // generate deltas. The value 10 is the same used by git command. + DefaultPackWindow = uint(10) +) + +// Unmarshal parses a git-config file and stores it. +func (c *Config) Unmarshal(b []byte) error { + r := bytes.NewBuffer(b) + d := format.NewDecoder(r) + + c.Raw = format.New() + if err := d.Decode(c.Raw); err != nil { + return err + } + + c.unmarshalCore() + c.unmarshalUser() + if err := c.unmarshalPack(); err != nil { + return err + } + unmarshalSubmodules(c.Raw, c.Submodules) + + if err := c.unmarshalBranches(); err != nil { + return err + } + + return c.unmarshalRemotes() +} + +func (c *Config) unmarshalCore() { + s := c.Raw.Section(coreSection) + if s.Options.Get(bareKey) == "true" { + c.Core.IsBare = true + } + + c.Core.Worktree = s.Options.Get(worktreeKey) + c.Core.CommentChar = s.Options.Get(commentCharKey) +} + +func (c *Config) unmarshalUser() { + s := c.Raw.Section(userSection) + c.User.Name = s.Options.Get(nameKey) + c.User.Email = s.Options.Get(emailKey) + + s = c.Raw.Section(authorSection) + c.Author.Name = s.Options.Get(nameKey) + c.Author.Email = s.Options.Get(emailKey) + + s = c.Raw.Section(committerSection) + c.Committer.Name = s.Options.Get(nameKey) + c.Committer.Email = s.Options.Get(emailKey) +} + +func (c *Config) unmarshalPack() error { + s := c.Raw.Section(packSection) + window := s.Options.Get(windowKey) + if window == "" { + c.Pack.Window = DefaultPackWindow + } else { + winUint, err := strconv.ParseUint(window, 10, 32) + if err != nil { + return err + } + c.Pack.Window = uint(winUint) + } + return nil +} + +func (c *Config) unmarshalRemotes() error { + s := c.Raw.Section(remoteSection) + for _, sub := range s.Subsections { + r := &RemoteConfig{} + if err := r.unmarshal(sub); err != nil { + return err + } + + c.Remotes[r.Name] = r + } + + return nil +} + +func unmarshalSubmodules(fc *format.Config, submodules map[string]*Submodule) { + s := fc.Section(submoduleSection) + for _, sub := range s.Subsections { + m := &Submodule{} + m.unmarshal(sub) + + if m.Validate() == ErrModuleBadPath { + continue + } + + submodules[m.Name] = m + } +} + +func (c *Config) unmarshalBranches() error { + bs := c.Raw.Section(branchSection) + for _, sub := range bs.Subsections { + b := &Branch{} + + if err := b.unmarshal(sub); err != nil { + return err + } + + c.Branches[b.Name] = b + } + return nil +} + +// Marshal returns Config encoded as a git-config file. +func (c *Config) Marshal() ([]byte, error) { + c.marshalCore() + c.marshalUser() + c.marshalPack() + c.marshalRemotes() + c.marshalSubmodules() + c.marshalBranches() + + buf := bytes.NewBuffer(nil) + if err := format.NewEncoder(buf).Encode(c.Raw); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +func (c *Config) marshalCore() { + s := c.Raw.Section(coreSection) + s.SetOption(bareKey, fmt.Sprintf("%t", c.Core.IsBare)) + + if c.Core.Worktree != "" { + s.SetOption(worktreeKey, c.Core.Worktree) + } +} + +func (c *Config) marshalUser() { + s := c.Raw.Section(userSection) + if c.User.Name != "" { + s.SetOption(nameKey, c.User.Name) + } + + if c.User.Email != "" { + s.SetOption(emailKey, c.User.Email) + } + + s = c.Raw.Section(authorSection) + if c.Author.Name != "" { + s.SetOption(nameKey, c.Author.Name) + } + + if c.Author.Email != "" { + s.SetOption(emailKey, c.Author.Email) + } + + s = c.Raw.Section(committerSection) + if c.Committer.Name != "" { + s.SetOption(nameKey, c.Committer.Name) + } + + if c.Committer.Email != "" { + s.SetOption(emailKey, c.Committer.Email) + } +} + +func (c *Config) marshalPack() { + s := c.Raw.Section(packSection) + if c.Pack.Window != DefaultPackWindow { + s.SetOption(windowKey, fmt.Sprintf("%d", c.Pack.Window)) + } +} + +func (c *Config) marshalRemotes() { + s := c.Raw.Section(remoteSection) + newSubsections := make(format.Subsections, 0, len(c.Remotes)) + added := make(map[string]bool) + for _, subsection := range s.Subsections { + if remote, ok := c.Remotes[subsection.Name]; ok { + newSubsections = append(newSubsections, remote.marshal()) + added[subsection.Name] = true + } + } + + remoteNames := make([]string, 0, len(c.Remotes)) + for name := range c.Remotes { + remoteNames = append(remoteNames, name) + } + + sort.Strings(remoteNames) + + for _, name := range remoteNames { + if !added[name] { + newSubsections = append(newSubsections, c.Remotes[name].marshal()) + } + } + + s.Subsections = newSubsections +} + +func (c *Config) marshalSubmodules() { + s := c.Raw.Section(submoduleSection) + s.Subsections = make(format.Subsections, len(c.Submodules)) + + var i int + for _, r := range c.Submodules { + section := r.marshal() + // the submodule section at config is a subset of the .gitmodule file + // we should remove the non-valid options for the config file. + section.RemoveOption(pathKey) + s.Subsections[i] = section + i++ + } +} + +func (c *Config) marshalBranches() { + s := c.Raw.Section(branchSection) + newSubsections := make(format.Subsections, 0, len(c.Branches)) + added := make(map[string]bool) + for _, subsection := range s.Subsections { + if branch, ok := c.Branches[subsection.Name]; ok { + newSubsections = append(newSubsections, branch.marshal()) + added[subsection.Name] = true + } + } + + branchNames := make([]string, 0, len(c.Branches)) + for name := range c.Branches { + branchNames = append(branchNames, name) + } + + sort.Strings(branchNames) + + for _, name := range branchNames { + if !added[name] { + newSubsections = append(newSubsections, c.Branches[name].marshal()) + } + } + + s.Subsections = newSubsections +} + +// RemoteConfig contains the configuration for a given remote repository. +type RemoteConfig struct { + // Name of the remote + Name string + // URLs the URLs of a remote repository. It must be non-empty. Fetch will + // always use the first URL, while push will use all of them. + URLs []string + // Fetch the default set of "refspec" for fetch operation + Fetch []RefSpec + + // raw representation of the subsection, filled by marshal or unmarshal are + // called + raw *format.Subsection +} + +// Validate validates the fields and sets the default values. +func (c *RemoteConfig) Validate() error { + if c.Name == "" { + return ErrRemoteConfigEmptyName + } + + if len(c.URLs) == 0 { + return ErrRemoteConfigEmptyURL + } + + for _, r := range c.Fetch { + if err := r.Validate(); err != nil { + return err + } + } + + if len(c.Fetch) == 0 { + c.Fetch = []RefSpec{RefSpec(fmt.Sprintf(DefaultFetchRefSpec, c.Name))} + } + + return nil +} + +func (c *RemoteConfig) unmarshal(s *format.Subsection) error { + c.raw = s + + fetch := []RefSpec{} + for _, f := range c.raw.Options.GetAll(fetchKey) { + rs := RefSpec(f) + if err := rs.Validate(); err != nil { + return err + } + + fetch = append(fetch, rs) + } + + c.Name = c.raw.Name + c.URLs = append([]string(nil), c.raw.Options.GetAll(urlKey)...) + c.Fetch = fetch + + return nil +} + +func (c *RemoteConfig) marshal() *format.Subsection { + if c.raw == nil { + c.raw = &format.Subsection{} + } + + c.raw.Name = c.Name + if len(c.URLs) == 0 { + c.raw.RemoveOption(urlKey) + } else { + c.raw.SetOption(urlKey, c.URLs...) + } + + if len(c.Fetch) == 0 { + c.raw.RemoveOption(fetchKey) + } else { + var values []string + for _, rs := range c.Fetch { + values = append(values, rs.String()) + } + + c.raw.SetOption(fetchKey, values...) + } + + return c.raw +} + +func (c *RemoteConfig) IsFirstURLLocal() bool { + return url.IsLocalEndpoint(c.URLs[0]) +} diff --git a/vendor/github.com/go-git/go-git/v5/config/modules.go b/vendor/github.com/go-git/go-git/v5/config/modules.go new file mode 100644 index 000000000..1c10aa354 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/config/modules.go @@ -0,0 +1,139 @@ +package config + +import ( + "bytes" + "errors" + "regexp" + + format "github.com/go-git/go-git/v5/plumbing/format/config" +) + +var ( + ErrModuleEmptyURL = errors.New("module config: empty URL") + ErrModuleEmptyPath = errors.New("module config: empty path") + ErrModuleBadPath = errors.New("submodule has an invalid path") +) + +var ( + // Matches module paths with dotdot ".." components. + dotdotPath = regexp.MustCompile(`(^|[/\\])\.\.([/\\]|$)`) +) + +// Modules defines the submodules properties, represents a .gitmodules file +// https://www.kernel.org/pub/software/scm/git/docs/gitmodules.html +type Modules struct { + // Submodules is a map of submodules being the key the name of the submodule. + Submodules map[string]*Submodule + + raw *format.Config +} + +// NewModules returns a new empty Modules +func NewModules() *Modules { + return &Modules{ + Submodules: make(map[string]*Submodule), + raw: format.New(), + } +} + +const ( + pathKey = "path" + branchKey = "branch" +) + +// Unmarshal parses a git-config file and stores it. +func (m *Modules) Unmarshal(b []byte) error { + r := bytes.NewBuffer(b) + d := format.NewDecoder(r) + + m.raw = format.New() + if err := d.Decode(m.raw); err != nil { + return err + } + + unmarshalSubmodules(m.raw, m.Submodules) + return nil +} + +// Marshal returns Modules encoded as a git-config file. +func (m *Modules) Marshal() ([]byte, error) { + s := m.raw.Section(submoduleSection) + s.Subsections = make(format.Subsections, len(m.Submodules)) + + var i int + for _, r := range m.Submodules { + s.Subsections[i] = r.marshal() + i++ + } + + buf := bytes.NewBuffer(nil) + if err := format.NewEncoder(buf).Encode(m.raw); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +// Submodule defines a submodule. +type Submodule struct { + // Name module name + Name string + // Path defines the path, relative to the top-level directory of the Git + // working tree. + Path string + // URL defines a URL from which the submodule repository can be cloned. + URL string + // Branch is a remote branch name for tracking updates in the upstream + // submodule. Optional value. + Branch string + + // raw representation of the subsection, filled by marshal or unmarshal are + // called. + raw *format.Subsection +} + +// Validate validates the fields and sets the default values. +func (m *Submodule) Validate() error { + if m.Path == "" { + return ErrModuleEmptyPath + } + + if m.URL == "" { + return ErrModuleEmptyURL + } + + if dotdotPath.MatchString(m.Path) { + return ErrModuleBadPath + } + + return nil +} + +func (m *Submodule) unmarshal(s *format.Subsection) { + m.raw = s + + m.Name = m.raw.Name + m.Path = m.raw.Option(pathKey) + m.URL = m.raw.Option(urlKey) + m.Branch = m.raw.Option(branchKey) +} + +func (m *Submodule) marshal() *format.Subsection { + if m.raw == nil { + m.raw = &format.Subsection{} + } + + m.raw.Name = m.Name + if m.raw.Name == "" { + m.raw.Name = m.Path + } + + m.raw.SetOption(pathKey, m.Path) + m.raw.SetOption(urlKey, m.URL) + + if m.Branch != "" { + m.raw.SetOption(branchKey, m.Branch) + } + + return m.raw +} diff --git a/vendor/github.com/go-git/go-git/v5/config/refspec.go b/vendor/github.com/go-git/go-git/v5/config/refspec.go new file mode 100644 index 000000000..4bfaa37bb --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/config/refspec.go @@ -0,0 +1,155 @@ +package config + +import ( + "errors" + "strings" + + "github.com/go-git/go-git/v5/plumbing" +) + +const ( + refSpecWildcard = "*" + refSpecForce = "+" + refSpecSeparator = ":" +) + +var ( + ErrRefSpecMalformedSeparator = errors.New("malformed refspec, separators are wrong") + ErrRefSpecMalformedWildcard = errors.New("malformed refspec, mismatched number of wildcards") +) + +// RefSpec is a mapping from local branches to remote references. +// The format of the refspec is an optional +, followed by :, where +// is the pattern for references on the remote side and is where +// those references will be written locally. The + tells Git to update the +// reference even if it isn’t a fast-forward. +// eg.: "+refs/heads/*:refs/remotes/origin/*" +// +// https://git-scm.com/book/en/v2/Git-Internals-The-Refspec +type RefSpec string + +// Validate validates the RefSpec +func (s RefSpec) Validate() error { + spec := string(s) + if strings.Count(spec, refSpecSeparator) != 1 { + return ErrRefSpecMalformedSeparator + } + + sep := strings.Index(spec, refSpecSeparator) + if sep == len(spec)-1 { + return ErrRefSpecMalformedSeparator + } + + ws := strings.Count(spec[0:sep], refSpecWildcard) + wd := strings.Count(spec[sep+1:], refSpecWildcard) + if ws == wd && ws < 2 && wd < 2 { + return nil + } + + return ErrRefSpecMalformedWildcard +} + +// IsForceUpdate returns if update is allowed in non fast-forward merges. +func (s RefSpec) IsForceUpdate() bool { + return s[0] == refSpecForce[0] +} + +// IsDelete returns true if the refspec indicates a delete (empty src). +func (s RefSpec) IsDelete() bool { + return s[0] == refSpecSeparator[0] +} + +// IsExactSHA1 returns true if the source is a SHA1 hash. +func (s RefSpec) IsExactSHA1() bool { + return plumbing.IsHash(s.Src()) +} + +// Src return the src side. +func (s RefSpec) Src() string { + spec := string(s) + + var start int + if s.IsForceUpdate() { + start = 1 + } else { + start = 0 + } + + end := strings.Index(spec, refSpecSeparator) + return spec[start:end] +} + +// Match match the given plumbing.ReferenceName against the source. +func (s RefSpec) Match(n plumbing.ReferenceName) bool { + if !s.IsWildcard() { + return s.matchExact(n) + } + + return s.matchGlob(n) +} + +// IsWildcard returns true if the RefSpec contains a wildcard. +func (s RefSpec) IsWildcard() bool { + return strings.Contains(string(s), refSpecWildcard) +} + +func (s RefSpec) matchExact(n plumbing.ReferenceName) bool { + return s.Src() == n.String() +} + +func (s RefSpec) matchGlob(n plumbing.ReferenceName) bool { + src := s.Src() + name := n.String() + wildcard := strings.Index(src, refSpecWildcard) + + var prefix, suffix string + prefix = src[0:wildcard] + if len(src) > wildcard+1 { + suffix = src[wildcard+1:] + } + + return len(name) >= len(prefix)+len(suffix) && + strings.HasPrefix(name, prefix) && + strings.HasSuffix(name, suffix) +} + +// Dst returns the destination for the given remote reference. +func (s RefSpec) Dst(n plumbing.ReferenceName) plumbing.ReferenceName { + spec := string(s) + start := strings.Index(spec, refSpecSeparator) + 1 + dst := spec[start:] + src := s.Src() + + if !s.IsWildcard() { + return plumbing.ReferenceName(dst) + } + + name := n.String() + ws := strings.Index(src, refSpecWildcard) + wd := strings.Index(dst, refSpecWildcard) + match := name[ws : len(name)-(len(src)-(ws+1))] + + return plumbing.ReferenceName(dst[0:wd] + match + dst[wd+1:]) +} + +func (s RefSpec) Reverse() RefSpec { + spec := string(s) + separator := strings.Index(spec, refSpecSeparator) + + return RefSpec(spec[separator+1:] + refSpecSeparator + spec[:separator]) +} + +func (s RefSpec) String() string { + return string(s) +} + +// MatchAny returns true if any of the RefSpec match with the given ReferenceName. +func MatchAny(l []RefSpec, n plumbing.ReferenceName) bool { + for _, r := range l { + if r.Match(n) { + return true + } + } + + return false +} diff --git a/vendor/github.com/go-git/go-git/v5/doc.go b/vendor/github.com/go-git/go-git/v5/doc.go new file mode 100644 index 000000000..3d817fe9c --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/doc.go @@ -0,0 +1,10 @@ +// A highly extensible git implementation in pure Go. +// +// go-git aims to reach the completeness of libgit2 or jgit, nowadays covers the +// majority of the plumbing read operations and some of the main write +// operations, but lacks the main porcelain operations such as merges. +// +// It is highly extensible, we have been following the open/close principle in +// its design to facilitate extensions, mainly focusing the efforts on the +// persistence of the objects. +package git diff --git a/vendor/github.com/go-git/go-git/v5/go.mod b/vendor/github.com/go-git/go-git/v5/go.mod new file mode 100644 index 000000000..0c9cfd2ca --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/go.mod @@ -0,0 +1,28 @@ +module github.com/go-git/go-git/v5 + +require ( + github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 // indirect + github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 + github.com/emirpasic/gods v1.12.0 + github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 // indirect + github.com/gliderlabs/ssh v0.2.2 + github.com/go-git/gcfg v1.5.0 + github.com/go-git/go-billy/v5 v5.0.0 + github.com/go-git/go-git-fixtures/v4 v4.0.1 + github.com/google/go-cmp v0.3.0 + github.com/imdario/mergo v0.3.9 + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 + github.com/jessevdk/go-flags v1.4.0 + github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd + github.com/mitchellh/go-homedir v1.1.0 + github.com/pkg/errors v0.8.1 // indirect + github.com/sergi/go-diff v1.1.0 + github.com/xanzy/ssh-agent v0.2.1 + golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073 + golang.org/x/net v0.0.0-20200301022130-244492dfa37a + golang.org/x/text v0.3.2 + gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f + gopkg.in/warnings.v0 v0.1.2 // indirect +) + +go 1.13 diff --git a/vendor/github.com/go-git/go-git/v5/go.sum b/vendor/github.com/go-git/go-git/v5/go.sum new file mode 100644 index 000000000..e14e29ae3 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/go.sum @@ -0,0 +1,80 @@ +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= +github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= +github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= +github.com/go-git/go-billy/v5 v5.0.0 h1:7NQHvd9FVid8VL4qVUMm8XifBK+2xCoZ2lSk0agRrHM= +github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-git-fixtures/v4 v4.0.1 h1:q+IFMfLx200Q3scvt2hN79JsEzy4AmBTp/pqnefH+Bc= +github.com/go-git/go-git-fixtures/v4 v4.0.1/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= +github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg= +github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY= +github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= +github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= +golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073 h1:xMPOj6Pz6UipU1wXLkrtqpHbR0AVFnyPEQq/wRWz9lM= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a h1:GuSPYbZzB5/dcLNCwLQLsg3obCJtX9IJhpXkvY7kzk0= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 h1:uYVVQ9WP/Ds2ROhcaGPeIdVq0RIXVLwsHlnvJ+cT1So= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/go-git/go-git/v5/internal/revision/parser.go b/vendor/github.com/go-git/go-git/v5/internal/revision/parser.go new file mode 100644 index 000000000..61de386b2 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/internal/revision/parser.go @@ -0,0 +1,622 @@ +// Package revision extracts git revision from string +// More information about revision : https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html +package revision + +import ( + "bytes" + "fmt" + "io" + "regexp" + "strconv" + "time" +) + +// ErrInvalidRevision is emitted if string doesn't match valid revision +type ErrInvalidRevision struct { + s string +} + +func (e *ErrInvalidRevision) Error() string { + return "Revision invalid : " + e.s +} + +// Revisioner represents a revision component. +// A revision is made of multiple revision components +// obtained after parsing a revision string, +// for instance revision "master~" will be converted in +// two revision components Ref and TildePath +type Revisioner interface { +} + +// Ref represents a reference name : HEAD, master +type Ref string + +// TildePath represents ~, ~{n} +type TildePath struct { + Depth int +} + +// CaretPath represents ^, ^{n} +type CaretPath struct { + Depth int +} + +// CaretReg represents ^{/foo bar} +type CaretReg struct { + Regexp *regexp.Regexp + Negate bool +} + +// CaretType represents ^{commit} +type CaretType struct { + ObjectType string +} + +// AtReflog represents @{n} +type AtReflog struct { + Depth int +} + +// AtCheckout represents @{-n} +type AtCheckout struct { + Depth int +} + +// AtUpstream represents @{upstream}, @{u} +type AtUpstream struct { + BranchName string +} + +// AtPush represents @{push} +type AtPush struct { + BranchName string +} + +// AtDate represents @{"2006-01-02T15:04:05Z"} +type AtDate struct { + Date time.Time +} + +// ColonReg represents :/foo bar +type ColonReg struct { + Regexp *regexp.Regexp + Negate bool +} + +// ColonPath represents :./ : +type ColonPath struct { + Path string +} + +// ColonStagePath represents ::/ +type ColonStagePath struct { + Path string + Stage int +} + +// Parser represents a parser +// use to tokenize and transform to revisioner chunks +// a given string +type Parser struct { + s *scanner + currentParsedChar struct { + tok token + lit string + } + unreadLastChar bool +} + +// NewParserFromString returns a new instance of parser from a string. +func NewParserFromString(s string) *Parser { + return NewParser(bytes.NewBufferString(s)) +} + +// NewParser returns a new instance of parser. +func NewParser(r io.Reader) *Parser { + return &Parser{s: newScanner(r)} +} + +// scan returns the next token from the underlying scanner +// or the last scanned token if an unscan was requested +func (p *Parser) scan() (token, string, error) { + if p.unreadLastChar { + p.unreadLastChar = false + return p.currentParsedChar.tok, p.currentParsedChar.lit, nil + } + + tok, lit, err := p.s.scan() + + p.currentParsedChar.tok, p.currentParsedChar.lit = tok, lit + + return tok, lit, err +} + +// unscan pushes the previously read token back onto the buffer. +func (p *Parser) unscan() { p.unreadLastChar = true } + +// Parse explode a revision string into revisioner chunks +func (p *Parser) Parse() ([]Revisioner, error) { + var rev Revisioner + var revs []Revisioner + var tok token + var err error + + for { + tok, _, err = p.scan() + + if err != nil { + return nil, err + } + + switch tok { + case at: + rev, err = p.parseAt() + case tilde: + rev, err = p.parseTilde() + case caret: + rev, err = p.parseCaret() + case colon: + rev, err = p.parseColon() + case eof: + err = p.validateFullRevision(&revs) + + if err != nil { + return []Revisioner{}, err + } + + return revs, nil + default: + p.unscan() + rev, err = p.parseRef() + } + + if err != nil { + return []Revisioner{}, err + } + + revs = append(revs, rev) + } +} + +// validateFullRevision ensures all revisioner chunks make a valid revision +func (p *Parser) validateFullRevision(chunks *[]Revisioner) error { + var hasReference bool + + for i, chunk := range *chunks { + switch chunk.(type) { + case Ref: + if i == 0 { + hasReference = true + } else { + return &ErrInvalidRevision{`reference must be defined once at the beginning`} + } + case AtDate: + if len(*chunks) == 1 || hasReference && len(*chunks) == 2 { + return nil + } + + return &ErrInvalidRevision{`"@" statement is not valid, could be : @{}, @{}`} + case AtReflog: + if len(*chunks) == 1 || hasReference && len(*chunks) == 2 { + return nil + } + + return &ErrInvalidRevision{`"@" statement is not valid, could be : @{}, @{}`} + case AtCheckout: + if len(*chunks) == 1 { + return nil + } + + return &ErrInvalidRevision{`"@" statement is not valid, could be : @{-}`} + case AtUpstream: + if len(*chunks) == 1 || hasReference && len(*chunks) == 2 { + return nil + } + + return &ErrInvalidRevision{`"@" statement is not valid, could be : @{upstream}, @{upstream}, @{u}, @{u}`} + case AtPush: + if len(*chunks) == 1 || hasReference && len(*chunks) == 2 { + return nil + } + + return &ErrInvalidRevision{`"@" statement is not valid, could be : @{push}, @{push}`} + case TildePath, CaretPath, CaretReg: + if !hasReference { + return &ErrInvalidRevision{`"~" or "^" statement must have a reference defined at the beginning`} + } + case ColonReg: + if len(*chunks) == 1 { + return nil + } + + return &ErrInvalidRevision{`":" statement is not valid, could be : :/`} + case ColonPath: + if i == len(*chunks)-1 && hasReference || len(*chunks) == 1 { + return nil + } + + return &ErrInvalidRevision{`":" statement is not valid, could be : :`} + case ColonStagePath: + if len(*chunks) == 1 { + return nil + } + + return &ErrInvalidRevision{`":" statement is not valid, could be : ::`} + } + } + + return nil +} + +// parseAt extract @ statements +func (p *Parser) parseAt() (Revisioner, error) { + var tok, nextTok token + var lit, nextLit string + var err error + + tok, _, err = p.scan() + + if err != nil { + return nil, err + } + + if tok != obrace { + p.unscan() + + return Ref("HEAD"), nil + } + + tok, lit, err = p.scan() + + if err != nil { + return nil, err + } + + nextTok, nextLit, err = p.scan() + + if err != nil { + return nil, err + } + + switch { + case tok == word && (lit == "u" || lit == "upstream") && nextTok == cbrace: + return AtUpstream{}, nil + case tok == word && lit == "push" && nextTok == cbrace: + return AtPush{}, nil + case tok == number && nextTok == cbrace: + n, _ := strconv.Atoi(lit) + + return AtReflog{n}, nil + case tok == minus && nextTok == number: + n, _ := strconv.Atoi(nextLit) + + t, _, err := p.scan() + + if err != nil { + return nil, err + } + + if t != cbrace { + return nil, &ErrInvalidRevision{fmt.Sprintf(`missing "}" in @{-n} structure`)} + } + + return AtCheckout{n}, nil + default: + p.unscan() + + date := lit + + for { + tok, lit, err = p.scan() + + if err != nil { + return nil, err + } + + switch { + case tok == cbrace: + t, err := time.Parse("2006-01-02T15:04:05Z", date) + + if err != nil { + return nil, &ErrInvalidRevision{fmt.Sprintf(`wrong date "%s" must fit ISO-8601 format : 2006-01-02T15:04:05Z`, date)} + } + + return AtDate{t}, nil + default: + date += lit + } + } + } +} + +// parseTilde extract ~ statements +func (p *Parser) parseTilde() (Revisioner, error) { + var tok token + var lit string + var err error + + tok, lit, err = p.scan() + + if err != nil { + return nil, err + } + + switch { + case tok == number: + n, _ := strconv.Atoi(lit) + + return TildePath{n}, nil + default: + p.unscan() + return TildePath{1}, nil + } +} + +// parseCaret extract ^ statements +func (p *Parser) parseCaret() (Revisioner, error) { + var tok token + var lit string + var err error + + tok, lit, err = p.scan() + + if err != nil { + return nil, err + } + + switch { + case tok == obrace: + r, err := p.parseCaretBraces() + + if err != nil { + return nil, err + } + + return r, nil + case tok == number: + n, _ := strconv.Atoi(lit) + + if n > 2 { + return nil, &ErrInvalidRevision{fmt.Sprintf(`"%s" found must be 0, 1 or 2 after "^"`, lit)} + } + + return CaretPath{n}, nil + default: + p.unscan() + return CaretPath{1}, nil + } +} + +// parseCaretBraces extract ^{} statements +func (p *Parser) parseCaretBraces() (Revisioner, error) { + var tok, nextTok token + var lit, _ string + start := true + var re string + var negate bool + var err error + + for { + tok, lit, err = p.scan() + + if err != nil { + return nil, err + } + + nextTok, _, err = p.scan() + + if err != nil { + return nil, err + } + + switch { + case tok == word && nextTok == cbrace && (lit == "commit" || lit == "tree" || lit == "blob" || lit == "tag" || lit == "object"): + return CaretType{lit}, nil + case re == "" && tok == cbrace: + return CaretType{"tag"}, nil + case re == "" && tok == emark && nextTok == emark: + re += lit + case re == "" && tok == emark && nextTok == minus: + negate = true + case re == "" && tok == emark: + return nil, &ErrInvalidRevision{fmt.Sprintf(`revision suffix brace component sequences starting with "/!" others than those defined are reserved`)} + case re == "" && tok == slash: + p.unscan() + case tok != slash && start: + return nil, &ErrInvalidRevision{fmt.Sprintf(`"%s" is not a valid revision suffix brace component`, lit)} + case tok != cbrace: + p.unscan() + re += lit + case tok == cbrace: + p.unscan() + + reg, err := regexp.Compile(re) + + if err != nil { + return CaretReg{}, &ErrInvalidRevision{fmt.Sprintf(`revision suffix brace component, %s`, err.Error())} + } + + return CaretReg{reg, negate}, nil + } + + start = false + } +} + +// parseColon extract : statements +func (p *Parser) parseColon() (Revisioner, error) { + var tok token + var err error + + tok, _, err = p.scan() + + if err != nil { + return nil, err + } + + switch tok { + case slash: + return p.parseColonSlash() + default: + p.unscan() + return p.parseColonDefault() + } +} + +// parseColonSlash extract :/ statements +func (p *Parser) parseColonSlash() (Revisioner, error) { + var tok, nextTok token + var lit string + var re string + var negate bool + var err error + + for { + tok, lit, err = p.scan() + + if err != nil { + return nil, err + } + + nextTok, _, err = p.scan() + + if err != nil { + return nil, err + } + + switch { + case tok == emark && nextTok == emark: + re += lit + case re == "" && tok == emark && nextTok == minus: + negate = true + case re == "" && tok == emark: + return nil, &ErrInvalidRevision{fmt.Sprintf(`revision suffix brace component sequences starting with "/!" others than those defined are reserved`)} + case tok == eof: + p.unscan() + reg, err := regexp.Compile(re) + + if err != nil { + return ColonReg{}, &ErrInvalidRevision{fmt.Sprintf(`revision suffix brace component, %s`, err.Error())} + } + + return ColonReg{reg, negate}, nil + default: + p.unscan() + re += lit + } + } +} + +// parseColonDefault extract : statements +func (p *Parser) parseColonDefault() (Revisioner, error) { + var tok token + var lit string + var path string + var stage int + var err error + var n = -1 + + tok, lit, err = p.scan() + + if err != nil { + return nil, err + } + + nextTok, _, err := p.scan() + + if err != nil { + return nil, err + } + + if tok == number && nextTok == colon { + n, _ = strconv.Atoi(lit) + } + + switch n { + case 0, 1, 2, 3: + stage = n + default: + path += lit + p.unscan() + } + + for { + tok, lit, err = p.scan() + + if err != nil { + return nil, err + } + + switch { + case tok == eof && n == -1: + return ColonPath{path}, nil + case tok == eof: + return ColonStagePath{path, stage}, nil + default: + path += lit + } + } +} + +// parseRef extract reference name +func (p *Parser) parseRef() (Revisioner, error) { + var tok, prevTok token + var lit, buf string + var endOfRef bool + var err error + + for { + tok, lit, err = p.scan() + + if err != nil { + return nil, err + } + + switch tok { + case eof, at, colon, tilde, caret: + endOfRef = true + } + + err := p.checkRefFormat(tok, lit, prevTok, buf, endOfRef) + + if err != nil { + return "", err + } + + if endOfRef { + p.unscan() + return Ref(buf), nil + } + + buf += lit + prevTok = tok + } +} + +// checkRefFormat ensure reference name follow rules defined here : +// https://git-scm.com/docs/git-check-ref-format +func (p *Parser) checkRefFormat(token token, literal string, previousToken token, buffer string, endOfRef bool) error { + switch token { + case aslash, space, control, qmark, asterisk, obracket: + return &ErrInvalidRevision{fmt.Sprintf(`must not contains "%s"`, literal)} + } + + switch { + case (token == dot || token == slash) && buffer == "": + return &ErrInvalidRevision{fmt.Sprintf(`must not start with "%s"`, literal)} + case previousToken == slash && endOfRef: + return &ErrInvalidRevision{`must not end with "/"`} + case previousToken == dot && endOfRef: + return &ErrInvalidRevision{`must not end with "."`} + case token == dot && previousToken == slash: + return &ErrInvalidRevision{`must not contains "/."`} + case previousToken == dot && token == dot: + return &ErrInvalidRevision{`must not contains ".."`} + case previousToken == slash && token == slash: + return &ErrInvalidRevision{`must not contains consecutively "/"`} + case (token == slash || endOfRef) && len(buffer) > 4 && buffer[len(buffer)-5:] == ".lock": + return &ErrInvalidRevision{"cannot end with .lock"} + } + + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/internal/revision/scanner.go b/vendor/github.com/go-git/go-git/v5/internal/revision/scanner.go new file mode 100644 index 000000000..c46c21b79 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/internal/revision/scanner.go @@ -0,0 +1,117 @@ +package revision + +import ( + "bufio" + "io" + "unicode" +) + +// runeCategoryValidator takes a rune as input and +// validates it belongs to a rune category +type runeCategoryValidator func(r rune) bool + +// tokenizeExpression aggregates a series of runes matching check predicate into a single +// string and provides given tokenType as token type +func tokenizeExpression(ch rune, tokenType token, check runeCategoryValidator, r *bufio.Reader) (token, string, error) { + var data []rune + data = append(data, ch) + + for { + c, _, err := r.ReadRune() + + if c == zeroRune { + break + } + + if err != nil { + return tokenError, "", err + } + + if check(c) { + data = append(data, c) + } else { + err := r.UnreadRune() + + if err != nil { + return tokenError, "", err + } + + return tokenType, string(data), nil + } + } + + return tokenType, string(data), nil +} + +var zeroRune = rune(0) + +// scanner represents a lexical scanner. +type scanner struct { + r *bufio.Reader +} + +// newScanner returns a new instance of scanner. +func newScanner(r io.Reader) *scanner { + return &scanner{r: bufio.NewReader(r)} +} + +// Scan extracts tokens and their strings counterpart +// from the reader +func (s *scanner) scan() (token, string, error) { + ch, _, err := s.r.ReadRune() + + if err != nil && err != io.EOF { + return tokenError, "", err + } + + switch ch { + case zeroRune: + return eof, "", nil + case ':': + return colon, string(ch), nil + case '~': + return tilde, string(ch), nil + case '^': + return caret, string(ch), nil + case '.': + return dot, string(ch), nil + case '/': + return slash, string(ch), nil + case '{': + return obrace, string(ch), nil + case '}': + return cbrace, string(ch), nil + case '-': + return minus, string(ch), nil + case '@': + return at, string(ch), nil + case '\\': + return aslash, string(ch), nil + case '?': + return qmark, string(ch), nil + case '*': + return asterisk, string(ch), nil + case '[': + return obracket, string(ch), nil + case '!': + return emark, string(ch), nil + } + + if unicode.IsSpace(ch) { + return space, string(ch), nil + } + + if unicode.IsControl(ch) { + return control, string(ch), nil + } + + if unicode.IsLetter(ch) { + return tokenizeExpression(ch, word, unicode.IsLetter, s.r) + } + + if unicode.IsNumber(ch) { + return tokenizeExpression(ch, number, unicode.IsNumber, s.r) + } + + return tokenError, string(ch), nil +} diff --git a/vendor/github.com/go-git/go-git/v5/internal/revision/token.go b/vendor/github.com/go-git/go-git/v5/internal/revision/token.go new file mode 100644 index 000000000..abc404886 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/internal/revision/token.go @@ -0,0 +1,28 @@ +package revision + +// token represents a entity extracted from string parsing +type token int + +const ( + eof token = iota + + aslash + asterisk + at + caret + cbrace + colon + control + dot + emark + minus + number + obrace + obracket + qmark + slash + space + tilde + tokenError + word +) diff --git a/vendor/github.com/go-git/go-git/v5/internal/url/url.go b/vendor/github.com/go-git/go-git/v5/internal/url/url.go new file mode 100644 index 000000000..14cf133de --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/internal/url/url.go @@ -0,0 +1,37 @@ +package url + +import ( + "regexp" +) + +var ( + isSchemeRegExp = regexp.MustCompile(`^[^:]+://`) + scpLikeUrlRegExp = regexp.MustCompile(`^(?:(?P[^@]+)@)?(?P[^:\s]+):(?:(?P[0-9]{1,5})(?:\/|:))?(?P[^\\].*\/[^\\].*)$`) +) + +// MatchesScheme returns true if the given string matches a URL-like +// format scheme. +func MatchesScheme(url string) bool { + return isSchemeRegExp.MatchString(url) +} + +// MatchesScpLike returns true if the given string matches an SCP-like +// format scheme. +func MatchesScpLike(url string) bool { + return scpLikeUrlRegExp.MatchString(url) +} + +// FindScpLikeComponents returns the user, host, port and path of the +// given SCP-like URL. +func FindScpLikeComponents(url string) (user, host, port, path string) { + m := scpLikeUrlRegExp.FindStringSubmatch(url) + return m[1], m[2], m[3], m[4] +} + +// IsLocalEndpoint returns true if the given URL string specifies a +// local file endpoint. For example, on a Linux machine, +// `/home/user/src/go-git` would match as a local endpoint, but +// `https://github.com/src-d/go-git` would not. +func IsLocalEndpoint(url string) bool { + return !MatchesScheme(url) && !MatchesScpLike(url) +} diff --git a/vendor/github.com/go-git/go-git/v5/object_walker.go b/vendor/github.com/go-git/go-git/v5/object_walker.go new file mode 100644 index 000000000..3fcdd2999 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/object_walker.go @@ -0,0 +1,104 @@ +package git + +import ( + "fmt" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/filemode" + "github.com/go-git/go-git/v5/plumbing/object" + "github.com/go-git/go-git/v5/storage" +) + +type objectWalker struct { + Storer storage.Storer + // seen is the set of objects seen in the repo. + // seen map can become huge if walking over large + // repos. Thus using struct{} as the value type. + seen map[plumbing.Hash]struct{} +} + +func newObjectWalker(s storage.Storer) *objectWalker { + return &objectWalker{s, map[plumbing.Hash]struct{}{}} +} + +// walkAllRefs walks all (hash) references from the repo. +func (p *objectWalker) walkAllRefs() error { + // Walk over all the references in the repo. + it, err := p.Storer.IterReferences() + if err != nil { + return err + } + defer it.Close() + err = it.ForEach(func(ref *plumbing.Reference) error { + // Exit this iteration early for non-hash references. + if ref.Type() != plumbing.HashReference { + return nil + } + return p.walkObjectTree(ref.Hash()) + }) + return err +} + +func (p *objectWalker) isSeen(hash plumbing.Hash) bool { + _, seen := p.seen[hash] + return seen +} + +func (p *objectWalker) add(hash plumbing.Hash) { + p.seen[hash] = struct{}{} +} + +// walkObjectTree walks over all objects and remembers references +// to them in the objectWalker. This is used instead of the revlist +// walks because memory usage is tight with huge repos. +func (p *objectWalker) walkObjectTree(hash plumbing.Hash) error { + // Check if we have already seen, and mark this object + if p.isSeen(hash) { + return nil + } + p.add(hash) + // Fetch the object. + obj, err := object.GetObject(p.Storer, hash) + if err != nil { + return fmt.Errorf("Getting object %s failed: %v", hash, err) + } + // Walk all children depending on object type. + switch obj := obj.(type) { + case *object.Commit: + err = p.walkObjectTree(obj.TreeHash) + if err != nil { + return err + } + for _, h := range obj.ParentHashes { + err = p.walkObjectTree(h) + if err != nil { + return err + } + } + case *object.Tree: + for i := range obj.Entries { + // Shortcut for blob objects: + // 'or' the lower bits of a mode and check that it + // it matches a filemode.Executable. The type information + // is in the higher bits, but this is the cleanest way + // to handle plain files with different modes. + // Other non-tree objects are somewhat rare, so they + // are not special-cased. + if obj.Entries[i].Mode|0755 == filemode.Executable { + p.add(obj.Entries[i].Hash) + continue + } + // Normal walk for sub-trees (and symlinks etc). + err = p.walkObjectTree(obj.Entries[i].Hash) + if err != nil { + return err + } + } + case *object.Tag: + return p.walkObjectTree(obj.Target) + default: + // Error out on unhandled object types. + return fmt.Errorf("Unknown object %X %s %T\n", obj.ID(), obj.Type(), obj) + } + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/options.go b/vendor/github.com/go-git/go-git/v5/options.go new file mode 100644 index 000000000..5367031f4 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/options.go @@ -0,0 +1,551 @@ +package git + +import ( + "errors" + "regexp" + "strings" + "time" + + "github.com/go-git/go-git/v5/config" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/object" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband" + "github.com/go-git/go-git/v5/plumbing/transport" + "golang.org/x/crypto/openpgp" +) + +// SubmoduleRescursivity defines how depth will affect any submodule recursive +// operation. +type SubmoduleRescursivity uint + +const ( + // DefaultRemoteName name of the default Remote, just like git command. + DefaultRemoteName = "origin" + + // NoRecurseSubmodules disables the recursion for a submodule operation. + NoRecurseSubmodules SubmoduleRescursivity = 0 + // DefaultSubmoduleRecursionDepth allow recursion in a submodule operation. + DefaultSubmoduleRecursionDepth SubmoduleRescursivity = 10 +) + +var ( + ErrMissingURL = errors.New("URL field is required") +) + +// CloneOptions describes how a clone should be performed. +type CloneOptions struct { + // The (possibly remote) repository URL to clone from. + URL string + // Auth credentials, if required, to use with the remote repository. + Auth transport.AuthMethod + // Name of the remote to be added, by default `origin`. + RemoteName string + // Remote branch to clone. + ReferenceName plumbing.ReferenceName + // Fetch only ReferenceName if true. + SingleBranch bool + // No checkout of HEAD after clone if true. + NoCheckout bool + // Limit fetching to the specified number of commits. + Depth int + // RecurseSubmodules after the clone is created, initialize all submodules + // within, using their default settings. This option is ignored if the + // cloned repository does not have a worktree. + RecurseSubmodules SubmoduleRescursivity + // Progress is where the human readable information sent by the server is + // stored, if nil nothing is stored and the capability (if supported) + // no-progress, is sent to the server to avoid send this information. + Progress sideband.Progress + // Tags describe how the tags will be fetched from the remote repository, + // by default is AllTags. + Tags TagMode +} + +// Validate validates the fields and sets the default values. +func (o *CloneOptions) Validate() error { + if o.URL == "" { + return ErrMissingURL + } + + if o.RemoteName == "" { + o.RemoteName = DefaultRemoteName + } + + if o.ReferenceName == "" { + o.ReferenceName = plumbing.HEAD + } + + if o.Tags == InvalidTagMode { + o.Tags = AllTags + } + + return nil +} + +// PullOptions describes how a pull should be performed. +type PullOptions struct { + // Name of the remote to be pulled. If empty, uses the default. + RemoteName string + // Remote branch to clone. If empty, uses HEAD. + ReferenceName plumbing.ReferenceName + // Fetch only ReferenceName if true. + SingleBranch bool + // Limit fetching to the specified number of commits. + Depth int + // Auth credentials, if required, to use with the remote repository. + Auth transport.AuthMethod + // RecurseSubmodules controls if new commits of all populated submodules + // should be fetched too. + RecurseSubmodules SubmoduleRescursivity + // Progress is where the human readable information sent by the server is + // stored, if nil nothing is stored and the capability (if supported) + // no-progress, is sent to the server to avoid send this information. + Progress sideband.Progress + // Force allows the pull to update a local branch even when the remote + // branch does not descend from it. + Force bool +} + +// Validate validates the fields and sets the default values. +func (o *PullOptions) Validate() error { + if o.RemoteName == "" { + o.RemoteName = DefaultRemoteName + } + + if o.ReferenceName == "" { + o.ReferenceName = plumbing.HEAD + } + + return nil +} + +type TagMode int + +const ( + InvalidTagMode TagMode = iota + // TagFollowing any tag that points into the histories being fetched is also + // fetched. TagFollowing requires a server with `include-tag` capability + // in order to fetch the annotated tags objects. + TagFollowing + // AllTags fetch all tags from the remote (i.e., fetch remote tags + // refs/tags/* into local tags with the same name) + AllTags + //NoTags fetch no tags from the remote at all + NoTags +) + +// FetchOptions describes how a fetch should be performed +type FetchOptions struct { + // Name of the remote to fetch from. Defaults to origin. + RemoteName string + RefSpecs []config.RefSpec + // Depth limit fetching to the specified number of commits from the tip of + // each remote branch history. + Depth int + // Auth credentials, if required, to use with the remote repository. + Auth transport.AuthMethod + // Progress is where the human readable information sent by the server is + // stored, if nil nothing is stored and the capability (if supported) + // no-progress, is sent to the server to avoid send this information. + Progress sideband.Progress + // Tags describe how the tags will be fetched from the remote repository, + // by default is TagFollowing. + Tags TagMode + // Force allows the fetch to update a local branch even when the remote + // branch does not descend from it. + Force bool +} + +// Validate validates the fields and sets the default values. +func (o *FetchOptions) Validate() error { + if o.RemoteName == "" { + o.RemoteName = DefaultRemoteName + } + + if o.Tags == InvalidTagMode { + o.Tags = TagFollowing + } + + for _, r := range o.RefSpecs { + if err := r.Validate(); err != nil { + return err + } + } + + return nil +} + +// PushOptions describes how a push should be performed. +type PushOptions struct { + // RemoteName is the name of the remote to be pushed to. + RemoteName string + // RefSpecs specify what destination ref to update with what source + // object. A refspec with empty src can be used to delete a reference. + RefSpecs []config.RefSpec + // Auth credentials, if required, to use with the remote repository. + Auth transport.AuthMethod + // Progress is where the human readable information sent by the server is + // stored, if nil nothing is stored. + Progress sideband.Progress + // Prune specify that remote refs that match given RefSpecs and that do + // not exist locally will be removed. + Prune bool + // Force allows the push to update a remote branch even when the local + // branch does not descend from it. + Force bool +} + +// Validate validates the fields and sets the default values. +func (o *PushOptions) Validate() error { + if o.RemoteName == "" { + o.RemoteName = DefaultRemoteName + } + + if len(o.RefSpecs) == 0 { + o.RefSpecs = []config.RefSpec{ + config.RefSpec(config.DefaultPushRefSpec), + } + } + + for _, r := range o.RefSpecs { + if err := r.Validate(); err != nil { + return err + } + } + + return nil +} + +// SubmoduleUpdateOptions describes how a submodule update should be performed. +type SubmoduleUpdateOptions struct { + // Init, if true initializes the submodules recorded in the index. + Init bool + // NoFetch tell to the update command to not fetch new objects from the + // remote site. + NoFetch bool + // RecurseSubmodules the update is performed not only in the submodules of + // the current repository but also in any nested submodules inside those + // submodules (and so on). Until the SubmoduleRescursivity is reached. + RecurseSubmodules SubmoduleRescursivity + // Auth credentials, if required, to use with the remote repository. + Auth transport.AuthMethod +} + +var ( + ErrBranchHashExclusive = errors.New("Branch and Hash are mutually exclusive") + ErrCreateRequiresBranch = errors.New("Branch is mandatory when Create is used") +) + +// CheckoutOptions describes how a checkout operation should be performed. +type CheckoutOptions struct { + // Hash is the hash of the commit to be checked out. If used, HEAD will be + // in detached mode. If Create is not used, Branch and Hash are mutually + // exclusive. + Hash plumbing.Hash + // Branch to be checked out, if Branch and Hash are empty is set to `master`. + Branch plumbing.ReferenceName + // Create a new branch named Branch and start it at Hash. + Create bool + // Force, if true when switching branches, proceed even if the index or the + // working tree differs from HEAD. This is used to throw away local changes + Force bool + // Keep, if true when switching branches, local changes (the index or the + // working tree changes) will be kept so that they can be committed to the + // target branch. Force and Keep are mutually exclusive, should not be both + // set to true. + Keep bool +} + +// Validate validates the fields and sets the default values. +func (o *CheckoutOptions) Validate() error { + if !o.Create && !o.Hash.IsZero() && o.Branch != "" { + return ErrBranchHashExclusive + } + + if o.Create && o.Branch == "" { + return ErrCreateRequiresBranch + } + + if o.Branch == "" { + o.Branch = plumbing.Master + } + + return nil +} + +// ResetMode defines the mode of a reset operation. +type ResetMode int8 + +const ( + // MixedReset resets the index but not the working tree (i.e., the changed + // files are preserved but not marked for commit) and reports what has not + // been updated. This is the default action. + MixedReset ResetMode = iota + // HardReset resets the index and working tree. Any changes to tracked files + // in the working tree are discarded. + HardReset + // MergeReset resets the index and updates the files in the working tree + // that are different between Commit and HEAD, but keeps those which are + // different between the index and working tree (i.e. which have changes + // which have not been added). + // + // If a file that is different between Commit and the index has unstaged + // changes, reset is aborted. + MergeReset + // SoftReset does not touch the index file or the working tree at all (but + // resets the head to , just like all modes do). This leaves all + // your changed files "Changes to be committed", as git status would put it. + SoftReset +) + +// ResetOptions describes how a reset operation should be performed. +type ResetOptions struct { + // Commit, if commit is present set the current branch head (HEAD) to it. + Commit plumbing.Hash + // Mode, form resets the current branch head to Commit and possibly updates + // the index (resetting it to the tree of Commit) and the working tree + // depending on Mode. If empty MixedReset is used. + Mode ResetMode +} + +// Validate validates the fields and sets the default values. +func (o *ResetOptions) Validate(r *Repository) error { + if o.Commit == plumbing.ZeroHash { + ref, err := r.Head() + if err != nil { + return err + } + + o.Commit = ref.Hash() + } + + return nil +} + +type LogOrder int8 + +const ( + LogOrderDefault LogOrder = iota + LogOrderDFS + LogOrderDFSPost + LogOrderBSF + LogOrderCommitterTime +) + +// LogOptions describes how a log action should be performed. +type LogOptions struct { + // When the From option is set the log will only contain commits + // reachable from it. If this option is not set, HEAD will be used as + // the default From. + From plumbing.Hash + + // The default traversal algorithm is Depth-first search + // set Order=LogOrderCommitterTime for ordering by committer time (more compatible with `git log`) + // set Order=LogOrderBSF for Breadth-first search + Order LogOrder + + // Show only those commits in which the specified file was inserted/updated. + // It is equivalent to running `git log -- `. + // this field is kept for compatility, it can be replaced with PathFilter + FileName *string + + // Filter commits based on the path of files that are updated + // takes file path as argument and should return true if the file is desired + // It can be used to implement `git log -- ` + // either is a file path, or directory path, or a regexp of file/directory path + PathFilter func(string) bool + + // Pretend as if all the refs in refs/, along with HEAD, are listed on the command line as . + // It is equivalent to running `git log --all`. + // If set on true, the From option will be ignored. + All bool + + // Show commits more recent than a specific date. + // It is equivalent to running `git log --since ` or `git log --after `. + Since *time.Time + + // Show commits older than a specific date. + // It is equivalent to running `git log --until ` or `git log --before `. + Until *time.Time +} + +var ( + ErrMissingAuthor = errors.New("author field is required") +) + +// CommitOptions describes how a commit operation should be performed. +type CommitOptions struct { + // All automatically stage files that have been modified and deleted, but + // new files you have not told Git about are not affected. + All bool + // Author is the author's signature of the commit. If Author is empty the + // Name and Email is read from the config, and time.Now it's used as When. + Author *object.Signature + // Committer is the committer's signature of the commit. If Committer is + // nil the Author signature is used. + Committer *object.Signature + // Parents are the parents commits for the new commit, by default when + // len(Parents) is zero, the hash of HEAD reference is used. + Parents []plumbing.Hash + // SignKey denotes a key to sign the commit with. A nil value here means the + // commit will not be signed. The private key must be present and already + // decrypted. + SignKey *openpgp.Entity +} + +// Validate validates the fields and sets the default values. +func (o *CommitOptions) Validate(r *Repository) error { + if o.Author == nil { + if err := o.loadConfigAuthorAndCommitter(r); err != nil { + return err + } + } + + if o.Committer == nil { + o.Committer = o.Author + } + + if len(o.Parents) == 0 { + head, err := r.Head() + if err != nil && err != plumbing.ErrReferenceNotFound { + return err + } + + if head != nil { + o.Parents = []plumbing.Hash{head.Hash()} + } + } + + return nil +} + +func (o *CommitOptions) loadConfigAuthorAndCommitter(r *Repository) error { + cfg, err := r.ConfigScoped(config.SystemScope) + if err != nil { + return err + } + + if o.Author == nil && cfg.Author.Email != "" && cfg.Author.Name != "" { + o.Author = &object.Signature{ + Name: cfg.Author.Name, + Email: cfg.Author.Email, + When: time.Now(), + } + } + + if o.Committer == nil && cfg.Committer.Email != "" && cfg.Committer.Name != "" { + o.Committer = &object.Signature{ + Name: cfg.Committer.Name, + Email: cfg.Committer.Email, + When: time.Now(), + } + } + + if o.Author == nil && cfg.User.Email != "" && cfg.User.Name != "" { + o.Author = &object.Signature{ + Name: cfg.User.Name, + Email: cfg.User.Email, + When: time.Now(), + } + } + + if o.Author == nil { + return ErrMissingAuthor + } + + return nil +} + +var ( + ErrMissingName = errors.New("name field is required") + ErrMissingTagger = errors.New("tagger field is required") + ErrMissingMessage = errors.New("message field is required") +) + +// CreateTagOptions describes how a tag object should be created. +type CreateTagOptions struct { + // Tagger defines the signature of the tag creator. + Tagger *object.Signature + // Message defines the annotation of the tag. It is canonicalized during + // validation into the format expected by git - no leading whitespace and + // ending in a newline. + Message string + // SignKey denotes a key to sign the tag with. A nil value here means the tag + // will not be signed. The private key must be present and already decrypted. + SignKey *openpgp.Entity +} + +// Validate validates the fields and sets the default values. +func (o *CreateTagOptions) Validate(r *Repository, hash plumbing.Hash) error { + if o.Tagger == nil { + return ErrMissingTagger + } + + if o.Message == "" { + return ErrMissingMessage + } + + // Canonicalize the message into the expected message format. + o.Message = strings.TrimSpace(o.Message) + "\n" + + return nil +} + +// ListOptions describes how a remote list should be performed. +type ListOptions struct { + // Auth credentials, if required, to use with the remote repository. + Auth transport.AuthMethod +} + +// CleanOptions describes how a clean should be performed. +type CleanOptions struct { + Dir bool +} + +// GrepOptions describes how a grep should be performed. +type GrepOptions struct { + // Patterns are compiled Regexp objects to be matched. + Patterns []*regexp.Regexp + // InvertMatch selects non-matching lines. + InvertMatch bool + // CommitHash is the hash of the commit from which worktree should be derived. + CommitHash plumbing.Hash + // ReferenceName is the branch or tag name from which worktree should be derived. + ReferenceName plumbing.ReferenceName + // PathSpecs are compiled Regexp objects of pathspec to use in the matching. + PathSpecs []*regexp.Regexp +} + +var ( + ErrHashOrReference = errors.New("ambiguous options, only one of CommitHash or ReferenceName can be passed") +) + +// Validate validates the fields and sets the default values. +func (o *GrepOptions) Validate(w *Worktree) error { + if !o.CommitHash.IsZero() && o.ReferenceName != "" { + return ErrHashOrReference + } + + // If none of CommitHash and ReferenceName are provided, set commit hash of + // the repository's head. + if o.CommitHash.IsZero() && o.ReferenceName == "" { + ref, err := w.r.Head() + if err != nil { + return err + } + o.CommitHash = ref.Hash() + } + + return nil +} + +// PlainOpenOptions describes how opening a plain repository should be +// performed. +type PlainOpenOptions struct { + // DetectDotGit defines whether parent directories should be + // walked until a .git directory or file is found. + DetectDotGit bool +} + +// Validate validates the fields and sets the default values. +func (o *PlainOpenOptions) Validate() error { return nil } diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/cache/buffer_lru.go b/vendor/github.com/go-git/go-git/v5/plumbing/cache/buffer_lru.go new file mode 100644 index 000000000..acaf19520 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/cache/buffer_lru.go @@ -0,0 +1,98 @@ +package cache + +import ( + "container/list" + "sync" +) + +// BufferLRU implements an object cache with an LRU eviction policy and a +// maximum size (measured in object size). +type BufferLRU struct { + MaxSize FileSize + + actualSize FileSize + ll *list.List + cache map[int64]*list.Element + mut sync.Mutex +} + +// NewBufferLRU creates a new BufferLRU with the given maximum size. The maximum +// size will never be exceeded. +func NewBufferLRU(maxSize FileSize) *BufferLRU { + return &BufferLRU{MaxSize: maxSize} +} + +// NewBufferLRUDefault creates a new BufferLRU with the default cache size. +func NewBufferLRUDefault() *BufferLRU { + return &BufferLRU{MaxSize: DefaultMaxSize} +} + +type buffer struct { + Key int64 + Slice []byte +} + +// Put puts a buffer into the cache. If the buffer is already in the cache, it +// will be marked as used. Otherwise, it will be inserted. A buffers might +// be evicted to make room for the new one. +func (c *BufferLRU) Put(key int64, slice []byte) { + c.mut.Lock() + defer c.mut.Unlock() + + if c.cache == nil { + c.actualSize = 0 + c.cache = make(map[int64]*list.Element, 1000) + c.ll = list.New() + } + + bufSize := FileSize(len(slice)) + if ee, ok := c.cache[key]; ok { + oldBuf := ee.Value.(buffer) + // in this case bufSize is a delta: new size - old size + bufSize -= FileSize(len(oldBuf.Slice)) + c.ll.MoveToFront(ee) + ee.Value = buffer{key, slice} + } else { + if bufSize > c.MaxSize { + return + } + ee := c.ll.PushFront(buffer{key, slice}) + c.cache[key] = ee + } + + c.actualSize += bufSize + for c.actualSize > c.MaxSize { + last := c.ll.Back() + lastObj := last.Value.(buffer) + lastSize := FileSize(len(lastObj.Slice)) + + c.ll.Remove(last) + delete(c.cache, lastObj.Key) + c.actualSize -= lastSize + } +} + +// Get returns a buffer by its key. It marks the buffer as used. If the buffer +// is not in the cache, (nil, false) will be returned. +func (c *BufferLRU) Get(key int64) ([]byte, bool) { + c.mut.Lock() + defer c.mut.Unlock() + + ee, ok := c.cache[key] + if !ok { + return nil, false + } + + c.ll.MoveToFront(ee) + return ee.Value.(buffer).Slice, true +} + +// Clear the content of this buffer cache. +func (c *BufferLRU) Clear() { + c.mut.Lock() + defer c.mut.Unlock() + + c.ll = nil + c.cache = nil + c.actualSize = 0 +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/cache/common.go b/vendor/github.com/go-git/go-git/v5/plumbing/cache/common.go new file mode 100644 index 000000000..7b0d0c76b --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/cache/common.go @@ -0,0 +1,39 @@ +package cache + +import "github.com/go-git/go-git/v5/plumbing" + +const ( + Byte FileSize = 1 << (iota * 10) + KiByte + MiByte + GiByte +) + +type FileSize int64 + +const DefaultMaxSize FileSize = 96 * MiByte + +// Object is an interface to a object cache. +type Object interface { + // Put puts the given object into the cache. Whether this object will + // actually be put into the cache or not is implementation specific. + Put(o plumbing.EncodedObject) + // Get gets an object from the cache given its hash. The second return value + // is true if the object was returned, and false otherwise. + Get(k plumbing.Hash) (plumbing.EncodedObject, bool) + // Clear clears every object from the cache. + Clear() +} + +// Buffer is an interface to a buffer cache. +type Buffer interface { + // Put puts a buffer into the cache. If the buffer is already in the cache, + // it will be marked as used. Otherwise, it will be inserted. Buffer might + // be evicted to make room for the new one. + Put(key int64, slice []byte) + // Get returns a buffer by its key. It marks the buffer as used. If the + // buffer is not in the cache, (nil, false) will be returned. + Get(key int64) ([]byte, bool) + // Clear clears every object from the cache. + Clear() +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/cache/object_lru.go b/vendor/github.com/go-git/go-git/v5/plumbing/cache/object_lru.go new file mode 100644 index 000000000..c50d0d1e6 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/cache/object_lru.go @@ -0,0 +1,101 @@ +package cache + +import ( + "container/list" + "sync" + + "github.com/go-git/go-git/v5/plumbing" +) + +// ObjectLRU implements an object cache with an LRU eviction policy and a +// maximum size (measured in object size). +type ObjectLRU struct { + MaxSize FileSize + + actualSize FileSize + ll *list.List + cache map[interface{}]*list.Element + mut sync.Mutex +} + +// NewObjectLRU creates a new ObjectLRU with the given maximum size. The maximum +// size will never be exceeded. +func NewObjectLRU(maxSize FileSize) *ObjectLRU { + return &ObjectLRU{MaxSize: maxSize} +} + +// NewObjectLRUDefault creates a new ObjectLRU with the default cache size. +func NewObjectLRUDefault() *ObjectLRU { + return &ObjectLRU{MaxSize: DefaultMaxSize} +} + +// Put puts an object into the cache. If the object is already in the cache, it +// will be marked as used. Otherwise, it will be inserted. A single object might +// be evicted to make room for the new object. +func (c *ObjectLRU) Put(obj plumbing.EncodedObject) { + c.mut.Lock() + defer c.mut.Unlock() + + if c.cache == nil { + c.actualSize = 0 + c.cache = make(map[interface{}]*list.Element, 1000) + c.ll = list.New() + } + + objSize := FileSize(obj.Size()) + key := obj.Hash() + if ee, ok := c.cache[key]; ok { + oldObj := ee.Value.(plumbing.EncodedObject) + // in this case objSize is a delta: new size - old size + objSize -= FileSize(oldObj.Size()) + c.ll.MoveToFront(ee) + ee.Value = obj + } else { + if objSize > c.MaxSize { + return + } + ee := c.ll.PushFront(obj) + c.cache[key] = ee + } + + c.actualSize += objSize + for c.actualSize > c.MaxSize { + last := c.ll.Back() + if last == nil { + c.actualSize = 0 + break + } + + lastObj := last.Value.(plumbing.EncodedObject) + lastSize := FileSize(lastObj.Size()) + + c.ll.Remove(last) + delete(c.cache, lastObj.Hash()) + c.actualSize -= lastSize + } +} + +// Get returns an object by its hash. It marks the object as used. If the object +// is not in the cache, (nil, false) will be returned. +func (c *ObjectLRU) Get(k plumbing.Hash) (plumbing.EncodedObject, bool) { + c.mut.Lock() + defer c.mut.Unlock() + + ee, ok := c.cache[k] + if !ok { + return nil, false + } + + c.ll.MoveToFront(ee) + return ee.Value.(plumbing.EncodedObject), true +} + +// Clear the content of this object cache. +func (c *ObjectLRU) Clear() { + c.mut.Lock() + defer c.mut.Unlock() + + c.ll = nil + c.cache = nil + c.actualSize = 0 +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/color/color.go b/vendor/github.com/go-git/go-git/v5/plumbing/color/color.go new file mode 100644 index 000000000..2cd74bdc1 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/color/color.go @@ -0,0 +1,38 @@ +package color + +// TODO read colors from a github.com/go-git/go-git/plumbing/format/config.Config struct +// TODO implement color parsing, see https://github.com/git/git/blob/v2.26.2/color.c + +// Colors. See https://github.com/git/git/blob/v2.26.2/color.h#L24-L53. +const ( + Normal = "" + Reset = "\033[m" + Bold = "\033[1m" + Red = "\033[31m" + Green = "\033[32m" + Yellow = "\033[33m" + Blue = "\033[34m" + Magenta = "\033[35m" + Cyan = "\033[36m" + BoldRed = "\033[1;31m" + BoldGreen = "\033[1;32m" + BoldYellow = "\033[1;33m" + BoldBlue = "\033[1;34m" + BoldMagenta = "\033[1;35m" + BoldCyan = "\033[1;36m" + FaintRed = "\033[2;31m" + FaintGreen = "\033[2;32m" + FaintYellow = "\033[2;33m" + FaintBlue = "\033[2;34m" + FaintMagenta = "\033[2;35m" + FaintCyan = "\033[2;36m" + BgRed = "\033[41m" + BgGreen = "\033[42m" + BgYellow = "\033[43m" + BgBlue = "\033[44m" + BgMagenta = "\033[45m" + BgCyan = "\033[46m" + Faint = "\033[2m" + FaintItalic = "\033[2;3m" + Reverse = "\033[7m" +) diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/error.go b/vendor/github.com/go-git/go-git/v5/plumbing/error.go new file mode 100644 index 000000000..a3ebed3f6 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/error.go @@ -0,0 +1,35 @@ +package plumbing + +import "fmt" + +type PermanentError struct { + Err error +} + +func NewPermanentError(err error) *PermanentError { + if err == nil { + return nil + } + + return &PermanentError{Err: err} +} + +func (e *PermanentError) Error() string { + return fmt.Sprintf("permanent client error: %s", e.Err.Error()) +} + +type UnexpectedError struct { + Err error +} + +func NewUnexpectedError(err error) *UnexpectedError { + if err == nil { + return nil + } + + return &UnexpectedError{Err: err} +} + +func (e *UnexpectedError) Error() string { + return fmt.Sprintf("unexpected client error: %s", e.Err.Error()) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/filemode/filemode.go b/vendor/github.com/go-git/go-git/v5/plumbing/filemode/filemode.go new file mode 100644 index 000000000..594984f9e --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/filemode/filemode.go @@ -0,0 +1,188 @@ +package filemode + +import ( + "encoding/binary" + "fmt" + "os" + "strconv" +) + +// A FileMode represents the kind of tree entries used by git. It +// resembles regular file systems modes, although FileModes are +// considerably simpler (there are not so many), and there are some, +// like Submodule that has no file system equivalent. +type FileMode uint32 + +const ( + // Empty is used as the FileMode of tree elements when comparing + // trees in the following situations: + // + // - the mode of tree elements before their creation. - the mode of + // tree elements after their deletion. - the mode of unmerged + // elements when checking the index. + // + // Empty has no file system equivalent. As Empty is the zero value + // of FileMode, it is also returned by New and + // NewFromOsNewFromOSFileMode along with an error, when they fail. + Empty FileMode = 0 + // Dir represent a Directory. + Dir FileMode = 0040000 + // Regular represent non-executable files. Please note this is not + // the same as golang regular files, which include executable files. + Regular FileMode = 0100644 + // Deprecated represent non-executable files with the group writable + // bit set. This mode was supported by the first versions of git, + // but it has been deprecated nowadays. This library uses them + // internally, so you can read old packfiles, but will treat them as + // Regulars when interfacing with the outside world. This is the + // standard git behaviour. + Deprecated FileMode = 0100664 + // Executable represents executable files. + Executable FileMode = 0100755 + // Symlink represents symbolic links to files. + Symlink FileMode = 0120000 + // Submodule represents git submodules. This mode has no file system + // equivalent. + Submodule FileMode = 0160000 +) + +// New takes the octal string representation of a FileMode and returns +// the FileMode and a nil error. If the string can not be parsed to a +// 32 bit unsigned octal number, it returns Empty and the parsing error. +// +// Example: "40000" means Dir, "100644" means Regular. +// +// Please note this function does not check if the returned FileMode +// is valid in git or if it is malformed. For instance, "1" will +// return the malformed FileMode(1) and a nil error. +func New(s string) (FileMode, error) { + n, err := strconv.ParseUint(s, 8, 32) + if err != nil { + return Empty, err + } + + return FileMode(n), nil +} + +// NewFromOSFileMode returns the FileMode used by git to represent +// the provided file system modes and a nil error on success. If the +// file system mode cannot be mapped to any valid git mode (as with +// sockets or named pipes), it will return Empty and an error. +// +// Note that some git modes cannot be generated from os.FileModes, like +// Deprecated and Submodule; while Empty will be returned, along with an +// error, only when the method fails. +func NewFromOSFileMode(m os.FileMode) (FileMode, error) { + if m.IsRegular() { + if isSetTemporary(m) { + return Empty, fmt.Errorf("no equivalent git mode for %s", m) + } + if isSetCharDevice(m) { + return Empty, fmt.Errorf("no equivalent git mode for %s", m) + } + if isSetUserExecutable(m) { + return Executable, nil + } + return Regular, nil + } + + if m.IsDir() { + return Dir, nil + } + + if isSetSymLink(m) { + return Symlink, nil + } + + return Empty, fmt.Errorf("no equivalent git mode for %s", m) +} + +func isSetCharDevice(m os.FileMode) bool { + return m&os.ModeCharDevice != 0 +} + +func isSetTemporary(m os.FileMode) bool { + return m&os.ModeTemporary != 0 +} + +func isSetUserExecutable(m os.FileMode) bool { + return m&0100 != 0 +} + +func isSetSymLink(m os.FileMode) bool { + return m&os.ModeSymlink != 0 +} + +// Bytes return a slice of 4 bytes with the mode in little endian +// encoding. +func (m FileMode) Bytes() []byte { + ret := make([]byte, 4) + binary.LittleEndian.PutUint32(ret, uint32(m)) + return ret[:] +} + +// IsMalformed returns if the FileMode should not appear in a git packfile, +// this is: Empty and any other mode not mentioned as a constant in this +// package. +func (m FileMode) IsMalformed() bool { + return m != Dir && + m != Regular && + m != Deprecated && + m != Executable && + m != Symlink && + m != Submodule +} + +// String returns the FileMode as a string in the standatd git format, +// this is, an octal number padded with ceros to 7 digits. Malformed +// modes are printed in that same format, for easier debugging. +// +// Example: Regular is "0100644", Empty is "0000000". +func (m FileMode) String() string { + return fmt.Sprintf("%07o", uint32(m)) +} + +// IsRegular returns if the FileMode represents that of a regular file, +// this is, either Regular or Deprecated. Please note that Executable +// are not regular even though in the UNIX tradition, they usually are: +// See the IsFile method. +func (m FileMode) IsRegular() bool { + return m == Regular || + m == Deprecated +} + +// IsFile returns if the FileMode represents that of a file, this is, +// Regular, Deprecated, Executable or Link. +func (m FileMode) IsFile() bool { + return m == Regular || + m == Deprecated || + m == Executable || + m == Symlink +} + +// ToOSFileMode returns the os.FileMode to be used when creating file +// system elements with the given git mode and a nil error on success. +// +// When the provided mode cannot be mapped to a valid file system mode +// (e.g. Submodule) it returns os.FileMode(0) and an error. +// +// The returned file mode does not take into account the umask. +func (m FileMode) ToOSFileMode() (os.FileMode, error) { + switch m { + case Dir: + return os.ModePerm | os.ModeDir, nil + case Submodule: + return os.ModePerm | os.ModeDir, nil + case Regular: + return os.FileMode(0644), nil + // Deprecated is no longer allowed: treated as a Regular instead + case Deprecated: + return os.FileMode(0644), nil + case Executable: + return os.FileMode(0755), nil + case Symlink: + return os.ModePerm | os.ModeSymlink, nil + } + + return os.FileMode(0), fmt.Errorf("malformed mode (%s)", m) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/config/common.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/config/common.go new file mode 100644 index 000000000..8f98ad174 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/config/common.go @@ -0,0 +1,99 @@ +package config + +// New creates a new config instance. +func New() *Config { + return &Config{} +} + +// Config contains all the sections, comments and includes from a config file. +type Config struct { + Comment *Comment + Sections Sections + Includes Includes +} + +// Includes is a list of Includes in a config file. +type Includes []*Include + +// Include is a reference to an included config file. +type Include struct { + Path string + Config *Config +} + +// Comment string without the prefix '#' or ';'. +type Comment string + +const ( + // NoSubsection token is passed to Config.Section and Config.SetSection to + // represent the absence of a section. + NoSubsection = "" +) + +// Section returns a existing section with the given name or creates a new one. +func (c *Config) Section(name string) *Section { + for i := len(c.Sections) - 1; i >= 0; i-- { + s := c.Sections[i] + if s.IsName(name) { + return s + } + } + + s := &Section{Name: name} + c.Sections = append(c.Sections, s) + return s +} + +// AddOption adds an option to a given section and subsection. Use the +// NoSubsection constant for the subsection argument if no subsection is wanted. +func (c *Config) AddOption(section string, subsection string, key string, value string) *Config { + if subsection == "" { + c.Section(section).AddOption(key, value) + } else { + c.Section(section).Subsection(subsection).AddOption(key, value) + } + + return c +} + +// SetOption sets an option to a given section and subsection. Use the +// NoSubsection constant for the subsection argument if no subsection is wanted. +func (c *Config) SetOption(section string, subsection string, key string, value string) *Config { + if subsection == "" { + c.Section(section).SetOption(key, value) + } else { + c.Section(section).Subsection(subsection).SetOption(key, value) + } + + return c +} + +// RemoveSection removes a section from a config file. +func (c *Config) RemoveSection(name string) *Config { + result := Sections{} + for _, s := range c.Sections { + if !s.IsName(name) { + result = append(result, s) + } + } + + c.Sections = result + return c +} + +// RemoveSubsection remove s a subsection from a config file. +func (c *Config) RemoveSubsection(section string, subsection string) *Config { + for _, s := range c.Sections { + if s.IsName(section) { + result := Subsections{} + for _, ss := range s.Subsections { + if !ss.IsName(subsection) { + result = append(result, ss) + } + } + s.Subsections = result + } + } + + return c +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/config/decoder.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/config/decoder.go new file mode 100644 index 000000000..8e52d57f3 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/config/decoder.go @@ -0,0 +1,37 @@ +package config + +import ( + "io" + + "github.com/go-git/gcfg" +) + +// A Decoder reads and decodes config files from an input stream. +type Decoder struct { + io.Reader +} + +// NewDecoder returns a new decoder that reads from r. +func NewDecoder(r io.Reader) *Decoder { + return &Decoder{r} +} + +// Decode reads the whole config from its input and stores it in the +// value pointed to by config. +func (d *Decoder) Decode(config *Config) error { + cb := func(s string, ss string, k string, v string, bv bool) error { + if ss == "" && k == "" { + config.Section(s) + return nil + } + + if ss != "" && k == "" { + config.Section(s).Subsection(ss) + return nil + } + + config.AddOption(s, ss, k, v) + return nil + } + return gcfg.ReadWithCallback(d, cb) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/config/doc.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/config/doc.go new file mode 100644 index 000000000..3986c8365 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/config/doc.go @@ -0,0 +1,122 @@ +// Package config implements encoding and decoding of git config files. +// +// Configuration File +// ------------------ +// +// The Git configuration file contains a number of variables that affect +// the Git commands' behavior. The `.git/config` file in each repository +// is used to store the configuration for that repository, and +// `$HOME/.gitconfig` is used to store a per-user configuration as +// fallback values for the `.git/config` file. The file `/etc/gitconfig` +// can be used to store a system-wide default configuration. +// +// The configuration variables are used by both the Git plumbing +// and the porcelains. The variables are divided into sections, wherein +// the fully qualified variable name of the variable itself is the last +// dot-separated segment and the section name is everything before the last +// dot. The variable names are case-insensitive, allow only alphanumeric +// characters and `-`, and must start with an alphabetic character. Some +// variables may appear multiple times; we say then that the variable is +// multivalued. +// +// Syntax +// ~~~~~~ +// +// The syntax is fairly flexible and permissive; whitespaces are mostly +// ignored. The '#' and ';' characters begin comments to the end of line, +// blank lines are ignored. +// +// The file consists of sections and variables. A section begins with +// the name of the section in square brackets and continues until the next +// section begins. Section names are case-insensitive. Only alphanumeric +// characters, `-` and `.` are allowed in section names. Each variable +// must belong to some section, which means that there must be a section +// header before the first setting of a variable. +// +// Sections can be further divided into subsections. To begin a subsection +// put its name in double quotes, separated by space from the section name, +// in the section header, like in the example below: +// +// -------- +// [section "subsection"] +// +// -------- +// +// Subsection names are case sensitive and can contain any characters except +// newline (doublequote `"` and backslash can be included by escaping them +// as `\"` and `\\`, respectively). Section headers cannot span multiple +// lines. Variables may belong directly to a section or to a given subsection. +// You can have `[section]` if you have `[section "subsection"]`, but you +// don't need to. +// +// There is also a deprecated `[section.subsection]` syntax. With this +// syntax, the subsection name is converted to lower-case and is also +// compared case sensitively. These subsection names follow the same +// restrictions as section names. +// +// All the other lines (and the remainder of the line after the section +// header) are recognized as setting variables, in the form +// 'name = value' (or just 'name', which is a short-hand to say that +// the variable is the boolean "true"). +// The variable names are case-insensitive, allow only alphanumeric characters +// and `-`, and must start with an alphabetic character. +// +// A line that defines a value can be continued to the next line by +// ending it with a `\`; the backquote and the end-of-line are +// stripped. Leading whitespaces after 'name =', the remainder of the +// line after the first comment character '#' or ';', and trailing +// whitespaces of the line are discarded unless they are enclosed in +// double quotes. Internal whitespaces within the value are retained +// verbatim. +// +// Inside double quotes, double quote `"` and backslash `\` characters +// must be escaped: use `\"` for `"` and `\\` for `\`. +// +// The following escape sequences (beside `\"` and `\\`) are recognized: +// `\n` for newline character (NL), `\t` for horizontal tabulation (HT, TAB) +// and `\b` for backspace (BS). Other char escape sequences (including octal +// escape sequences) are invalid. +// +// Includes +// ~~~~~~~~ +// +// You can include one config file from another by setting the special +// `include.path` variable to the name of the file to be included. The +// variable takes a pathname as its value, and is subject to tilde +// expansion. +// +// The included file is expanded immediately, as if its contents had been +// found at the location of the include directive. If the value of the +// `include.path` variable is a relative path, the path is considered to be +// relative to the configuration file in which the include directive was +// found. See below for examples. +// +// +// Example +// ~~~~~~~ +// +// # Core variables +// [core] +// ; Don't trust file modes +// filemode = false +// +// # Our diff algorithm +// [diff] +// external = /usr/local/bin/diff-wrapper +// renames = true +// +// [branch "devel"] +// remote = origin +// merge = refs/heads/devel +// +// # Proxy settings +// [core] +// gitProxy="ssh" for "kernel.org" +// gitProxy=default-proxy ; for the rest +// +// [include] +// path = /path/to/foo.inc ; include by absolute path +// path = foo ; expand "foo" relative to the current file +// path = ~/foo ; expand "foo" in your `$HOME` directory +// +package config diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/config/encoder.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/config/encoder.go new file mode 100644 index 000000000..4eac8968a --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/config/encoder.go @@ -0,0 +1,77 @@ +package config + +import ( + "fmt" + "io" + "strings" +) + +// An Encoder writes config files to an output stream. +type Encoder struct { + w io.Writer +} + +// NewEncoder returns a new encoder that writes to w. +func NewEncoder(w io.Writer) *Encoder { + return &Encoder{w} +} + +// Encode writes the config in git config format to the stream of the encoder. +func (e *Encoder) Encode(cfg *Config) error { + for _, s := range cfg.Sections { + if err := e.encodeSection(s); err != nil { + return err + } + } + + return nil +} + +func (e *Encoder) encodeSection(s *Section) error { + if len(s.Options) > 0 { + if err := e.printf("[%s]\n", s.Name); err != nil { + return err + } + + if err := e.encodeOptions(s.Options); err != nil { + return err + } + } + + for _, ss := range s.Subsections { + if err := e.encodeSubsection(s.Name, ss); err != nil { + return err + } + } + + return nil +} + +func (e *Encoder) encodeSubsection(sectionName string, s *Subsection) error { + //TODO: escape + if err := e.printf("[%s \"%s\"]\n", sectionName, s.Name); err != nil { + return err + } + + return e.encodeOptions(s.Options) +} + +func (e *Encoder) encodeOptions(opts Options) error { + for _, o := range opts { + pattern := "\t%s = %s\n" + if strings.Contains(o.Value, "\\") { + pattern = "\t%s = %q\n" + } + + if err := e.printf(pattern, o.Key, o.Value); err != nil { + return err + } + } + + return nil +} + +func (e *Encoder) printf(msg string, args ...interface{}) error { + _, err := fmt.Fprintf(e.w, msg, args...) + return err +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/config/option.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/config/option.go new file mode 100644 index 000000000..d4775e4f0 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/config/option.go @@ -0,0 +1,117 @@ +package config + +import ( + "fmt" + "strings" +) + +// Option defines a key/value entity in a config file. +type Option struct { + // Key preserving original caseness. + // Use IsKey instead to compare key regardless of caseness. + Key string + // Original value as string, could be not normalized. + Value string +} + +type Options []*Option + +// IsKey returns true if the given key matches +// this option's key in a case-insensitive comparison. +func (o *Option) IsKey(key string) bool { + return strings.ToLower(o.Key) == strings.ToLower(key) +} + +func (opts Options) GoString() string { + var strs []string + for _, opt := range opts { + strs = append(strs, fmt.Sprintf("%#v", opt)) + } + + return strings.Join(strs, ", ") +} + +// Get gets the value for the given key if set, +// otherwise it returns the empty string. +// +// Note that there is no difference +// +// This matches git behaviour since git v1.8.1-rc1, +// if there are multiple definitions of a key, the +// last one wins. +// +// See: http://article.gmane.org/gmane.linux.kernel/1407184 +// +// In order to get all possible values for the same key, +// use GetAll. +func (opts Options) Get(key string) string { + for i := len(opts) - 1; i >= 0; i-- { + o := opts[i] + if o.IsKey(key) { + return o.Value + } + } + return "" +} + +// GetAll returns all possible values for the same key. +func (opts Options) GetAll(key string) []string { + result := []string{} + for _, o := range opts { + if o.IsKey(key) { + result = append(result, o.Value) + } + } + return result +} + +func (opts Options) withoutOption(key string) Options { + result := Options{} + for _, o := range opts { + if !o.IsKey(key) { + result = append(result, o) + } + } + return result +} + +func (opts Options) withAddedOption(key string, value string) Options { + return append(opts, &Option{key, value}) +} + +func (opts Options) withSettedOption(key string, values ...string) Options { + var result Options + var added []string + for _, o := range opts { + if !o.IsKey(key) { + result = append(result, o) + continue + } + + if contains(values, o.Value) { + added = append(added, o.Value) + result = append(result, o) + continue + } + } + + for _, value := range values { + if contains(added, value) { + continue + } + + result = result.withAddedOption(key, value) + } + + return result +} + +func contains(haystack []string, needle string) bool { + for _, s := range haystack { + if s == needle { + return true + } + } + + return false +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/config/section.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/config/section.go new file mode 100644 index 000000000..4a17e3b21 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/config/section.go @@ -0,0 +1,146 @@ +package config + +import ( + "fmt" + "strings" +) + +// Section is the representation of a section inside git configuration files. +// Each Section contains Options that are used by both the Git plumbing +// and the porcelains. +// Sections can be further divided into subsections. To begin a subsection +// put its name in double quotes, separated by space from the section name, +// in the section header, like in the example below: +// +// [section "subsection"] +// +// All the other lines (and the remainder of the line after the section header) +// are recognized as option variables, in the form "name = value" (or just name, +// which is a short-hand to say that the variable is the boolean "true"). +// The variable names are case-insensitive, allow only alphanumeric characters +// and -, and must start with an alphabetic character: +// +// [section "subsection1"] +// option1 = value1 +// option2 +// [section "subsection2"] +// option3 = value2 +// +type Section struct { + Name string + Options Options + Subsections Subsections +} + +type Subsection struct { + Name string + Options Options +} + +type Sections []*Section + +func (s Sections) GoString() string { + var strs []string + for _, ss := range s { + strs = append(strs, fmt.Sprintf("%#v", ss)) + } + + return strings.Join(strs, ", ") +} + +type Subsections []*Subsection + +func (s Subsections) GoString() string { + var strs []string + for _, ss := range s { + strs = append(strs, fmt.Sprintf("%#v", ss)) + } + + return strings.Join(strs, ", ") +} + +// IsName checks if the name provided is equals to the Section name, case insensitive. +func (s *Section) IsName(name string) bool { + return strings.ToLower(s.Name) == strings.ToLower(name) +} + +// Option return the value for the specified key. Empty string is returned if +// key does not exists. +func (s *Section) Option(key string) string { + return s.Options.Get(key) +} + +// AddOption adds a new Option to the Section. The updated Section is returned. +func (s *Section) AddOption(key string, value string) *Section { + s.Options = s.Options.withAddedOption(key, value) + return s +} + +// SetOption adds a new Option to the Section. If the option already exists, is replaced. +// The updated Section is returned. +func (s *Section) SetOption(key string, value string) *Section { + s.Options = s.Options.withSettedOption(key, value) + return s +} + +// Remove an option with the specified key. The updated Section is returned. +func (s *Section) RemoveOption(key string) *Section { + s.Options = s.Options.withoutOption(key) + return s +} + +// Subsection returns a Subsection from the specified Section. If the +// Subsection does not exists, new one is created and added to Section. +func (s *Section) Subsection(name string) *Subsection { + for i := len(s.Subsections) - 1; i >= 0; i-- { + ss := s.Subsections[i] + if ss.IsName(name) { + return ss + } + } + + ss := &Subsection{Name: name} + s.Subsections = append(s.Subsections, ss) + return ss +} + +// HasSubsection checks if the Section has a Subsection with the specified name. +func (s *Section) HasSubsection(name string) bool { + for _, ss := range s.Subsections { + if ss.IsName(name) { + return true + } + } + + return false +} + +// IsName checks if the name of the subsection is exactly the specified name. +func (s *Subsection) IsName(name string) bool { + return s.Name == name +} + +// Option returns an option with the specified key. If the option does not exists, +// empty spring will be returned. +func (s *Subsection) Option(key string) string { + return s.Options.Get(key) +} + +// AddOption adds a new Option to the Subsection. The updated Subsection is returned. +func (s *Subsection) AddOption(key string, value string) *Subsection { + s.Options = s.Options.withAddedOption(key, value) + return s +} + +// SetOption adds a new Option to the Subsection. If the option already exists, is replaced. +// The updated Subsection is returned. +func (s *Subsection) SetOption(key string, value ...string) *Subsection { + s.Options = s.Options.withSettedOption(key, value...) + return s +} + +// RemoveOption removes the option with the specified key. The updated Subsection is returned. +func (s *Subsection) RemoveOption(key string) *Subsection { + s.Options = s.Options.withoutOption(key) + return s +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/diff/colorconfig.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/diff/colorconfig.go new file mode 100644 index 000000000..6fd415846 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/diff/colorconfig.go @@ -0,0 +1,97 @@ +package diff + +import "github.com/go-git/go-git/v5/plumbing/color" + +// A ColorKey is a key into a ColorConfig map and also equal to the key in the +// diff.color subsection of the config. See +// https://github.com/git/git/blob/v2.26.2/diff.c#L83-L106. +type ColorKey string + +// ColorKeys. +const ( + Context ColorKey = "context" + Meta ColorKey = "meta" + Frag ColorKey = "frag" + Old ColorKey = "old" + New ColorKey = "new" + Commit ColorKey = "commit" + Whitespace ColorKey = "whitespace" + Func ColorKey = "func" + OldMoved ColorKey = "oldMoved" + OldMovedAlternative ColorKey = "oldMovedAlternative" + OldMovedDimmed ColorKey = "oldMovedDimmed" + OldMovedAlternativeDimmed ColorKey = "oldMovedAlternativeDimmed" + NewMoved ColorKey = "newMoved" + NewMovedAlternative ColorKey = "newMovedAlternative" + NewMovedDimmed ColorKey = "newMovedDimmed" + NewMovedAlternativeDimmed ColorKey = "newMovedAlternativeDimmed" + ContextDimmed ColorKey = "contextDimmed" + OldDimmed ColorKey = "oldDimmed" + NewDimmed ColorKey = "newDimmed" + ContextBold ColorKey = "contextBold" + OldBold ColorKey = "oldBold" + NewBold ColorKey = "newBold" +) + +// A ColorConfig is a color configuration. A nil or empty ColorConfig +// corresponds to no color. +type ColorConfig map[ColorKey]string + +// A ColorConfigOption sets an option on a ColorConfig. +type ColorConfigOption func(ColorConfig) + +// WithColor sets the color for key. +func WithColor(key ColorKey, color string) ColorConfigOption { + return func(cc ColorConfig) { + cc[key] = color + } +} + +// defaultColorConfig is the default color configuration. See +// https://github.com/git/git/blob/v2.26.2/diff.c#L57-L81. +var defaultColorConfig = ColorConfig{ + Context: color.Normal, + Meta: color.Bold, + Frag: color.Cyan, + Old: color.Red, + New: color.Green, + Commit: color.Yellow, + Whitespace: color.BgRed, + Func: color.Normal, + OldMoved: color.BoldMagenta, + OldMovedAlternative: color.BoldBlue, + OldMovedDimmed: color.Faint, + OldMovedAlternativeDimmed: color.FaintItalic, + NewMoved: color.BoldCyan, + NewMovedAlternative: color.BoldYellow, + NewMovedDimmed: color.Faint, + NewMovedAlternativeDimmed: color.FaintItalic, + ContextDimmed: color.Faint, + OldDimmed: color.FaintRed, + NewDimmed: color.FaintGreen, + ContextBold: color.Bold, + OldBold: color.BoldRed, + NewBold: color.BoldGreen, +} + +// NewColorConfig returns a new ColorConfig. +func NewColorConfig(options ...ColorConfigOption) ColorConfig { + cc := make(ColorConfig) + for key, value := range defaultColorConfig { + cc[key] = value + } + for _, option := range options { + option(cc) + } + return cc +} + +// Reset returns the ANSI escape sequence to reset the color with key set from +// cc. If no color was set then no reset is needed so it returns the empty +// string. +func (cc ColorConfig) Reset(key ColorKey) string { + if cc[key] == "" { + return "" + } + return color.Reset +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/diff/patch.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/diff/patch.go new file mode 100644 index 000000000..39a66a1a8 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/diff/patch.go @@ -0,0 +1,58 @@ +package diff + +import ( + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/filemode" +) + +// Operation defines the operation of a diff item. +type Operation int + +const ( + // Equal item represents a equals diff. + Equal Operation = iota + // Add item represents an insert diff. + Add + // Delete item represents a delete diff. + Delete +) + +// Patch represents a collection of steps to transform several files. +type Patch interface { + // FilePatches returns a slice of patches per file. + FilePatches() []FilePatch + // Message returns an optional message that can be at the top of the + // Patch representation. + Message() string +} + +// FilePatch represents the necessary steps to transform one file to another. +type FilePatch interface { + // IsBinary returns true if this patch is representing a binary file. + IsBinary() bool + // Files returns the from and to Files, with all the necessary metadata to + // about them. If the patch creates a new file, "from" will be nil. + // If the patch deletes a file, "to" will be nil. + Files() (from, to File) + // Chunks returns a slice of ordered changes to transform "from" File to + // "to" File. If the file is a binary one, Chunks will be empty. + Chunks() []Chunk +} + +// File contains all the file metadata necessary to print some patch formats. +type File interface { + // Hash returns the File Hash. + Hash() plumbing.Hash + // Mode returns the FileMode. + Mode() filemode.FileMode + // Path returns the complete Path to the file, including the filename. + Path() string +} + +// Chunk represents a portion of a file transformation to another. +type Chunk interface { + // Content contains the portion of the file. + Content() string + // Type contains the Operation to do with this Chunk. + Type() Operation +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/diff/unified_encoder.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/diff/unified_encoder.go new file mode 100644 index 000000000..413984aa5 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/diff/unified_encoder.go @@ -0,0 +1,376 @@ +package diff + +import ( + "fmt" + "io" + "regexp" + "strconv" + "strings" + + "github.com/go-git/go-git/v5/plumbing" +) + +// DefaultContextLines is the default number of context lines. +const DefaultContextLines = 3 + +var ( + splitLinesRegexp = regexp.MustCompile(`[^\n]*(\n|$)`) + + operationChar = map[Operation]byte{ + Add: '+', + Delete: '-', + Equal: ' ', + } + + operationColorKey = map[Operation]ColorKey{ + Add: New, + Delete: Old, + Equal: Context, + } +) + +// UnifiedEncoder encodes an unified diff into the provided Writer. It does not +// support similarity index for renames or sorting hash representations. +type UnifiedEncoder struct { + io.Writer + + // contextLines is the count of unchanged lines that will appear surrounding + // a change. + contextLines int + + // colorConfig is the color configuration. The default is no color. + color ColorConfig +} + +// NewUnifiedEncoder returns a new UnifiedEncoder that writes to w. +func NewUnifiedEncoder(w io.Writer, contextLines int) *UnifiedEncoder { + return &UnifiedEncoder{ + Writer: w, + contextLines: contextLines, + } +} + +// SetColor sets e's color configuration and returns e. +func (e *UnifiedEncoder) SetColor(colorConfig ColorConfig) *UnifiedEncoder { + e.color = colorConfig + return e +} + +// Encode encodes patch. +func (e *UnifiedEncoder) Encode(patch Patch) error { + sb := &strings.Builder{} + + if message := patch.Message(); message != "" { + sb.WriteString(message) + if !strings.HasSuffix(message, "\n") { + sb.WriteByte('\n') + } + } + + for _, filePatch := range patch.FilePatches() { + e.writeFilePatchHeader(sb, filePatch) + g := newHunksGenerator(filePatch.Chunks(), e.contextLines) + for _, hunk := range g.Generate() { + hunk.writeTo(sb, e.color) + } + } + + _, err := e.Write([]byte(sb.String())) + return err +} + +func (e *UnifiedEncoder) writeFilePatchHeader(sb *strings.Builder, filePatch FilePatch) { + from, to := filePatch.Files() + if from == nil && to == nil { + return + } + isBinary := filePatch.IsBinary() + + var lines []string + switch { + case from != nil && to != nil: + hashEquals := from.Hash() == to.Hash() + lines = append(lines, + fmt.Sprintf("diff --git a/%s b/%s", from.Path(), to.Path()), + ) + if from.Mode() != to.Mode() { + lines = append(lines, + fmt.Sprintf("old mode %o", from.Mode()), + fmt.Sprintf("new mode %o", to.Mode()), + ) + } + if from.Path() != to.Path() { + lines = append(lines, + fmt.Sprintf("rename from %s", from.Path()), + fmt.Sprintf("rename to %s", to.Path()), + ) + } + if from.Mode() != to.Mode() && !hashEquals { + lines = append(lines, + fmt.Sprintf("index %s..%s", from.Hash(), to.Hash()), + ) + } else if !hashEquals { + lines = append(lines, + fmt.Sprintf("index %s..%s %o", from.Hash(), to.Hash(), from.Mode()), + ) + } + if !hashEquals { + lines = e.appendPathLines(lines, "a/"+from.Path(), "b/"+to.Path(), isBinary) + } + case from == nil: + lines = append(lines, + fmt.Sprintf("diff --git a/%s b/%s", to.Path(), to.Path()), + fmt.Sprintf("new file mode %o", to.Mode()), + fmt.Sprintf("index %s..%s", plumbing.ZeroHash, to.Hash()), + ) + lines = e.appendPathLines(lines, "/dev/null", "b/"+to.Path(), isBinary) + case to == nil: + lines = append(lines, + fmt.Sprintf("diff --git a/%s b/%s", from.Path(), from.Path()), + fmt.Sprintf("deleted file mode %o", from.Mode()), + fmt.Sprintf("index %s..%s", from.Hash(), plumbing.ZeroHash), + ) + lines = e.appendPathLines(lines, "a/"+from.Path(), "/dev/null", isBinary) + } + + sb.WriteString(e.color[Meta]) + sb.WriteString(lines[0]) + for _, line := range lines[1:] { + sb.WriteByte('\n') + sb.WriteString(line) + } + sb.WriteString(e.color.Reset(Meta)) + sb.WriteByte('\n') +} + +func (e *UnifiedEncoder) appendPathLines(lines []string, fromPath, toPath string, isBinary bool) []string { + if isBinary { + return append(lines, + fmt.Sprintf("Binary files %s and %s differ", fromPath, toPath), + ) + } + return append(lines, + fmt.Sprintf("--- %s", fromPath), + fmt.Sprintf("+++ %s", toPath), + ) +} + +type hunksGenerator struct { + fromLine, toLine int + ctxLines int + chunks []Chunk + current *hunk + hunks []*hunk + beforeContext, afterContext []string +} + +func newHunksGenerator(chunks []Chunk, ctxLines int) *hunksGenerator { + return &hunksGenerator{ + chunks: chunks, + ctxLines: ctxLines, + } +} + +func (g *hunksGenerator) Generate() []*hunk { + for i, chunk := range g.chunks { + lines := splitLines(chunk.Content()) + nLines := len(lines) + + switch chunk.Type() { + case Equal: + g.fromLine += nLines + g.toLine += nLines + g.processEqualsLines(lines, i) + case Delete: + if nLines != 0 { + g.fromLine++ + } + + g.processHunk(i, chunk.Type()) + g.fromLine += nLines - 1 + g.current.AddOp(chunk.Type(), lines...) + case Add: + if nLines != 0 { + g.toLine++ + } + g.processHunk(i, chunk.Type()) + g.toLine += nLines - 1 + g.current.AddOp(chunk.Type(), lines...) + } + + if i == len(g.chunks)-1 && g.current != nil { + g.hunks = append(g.hunks, g.current) + } + } + + return g.hunks +} + +func (g *hunksGenerator) processHunk(i int, op Operation) { + if g.current != nil { + return + } + + var ctxPrefix string + linesBefore := len(g.beforeContext) + if linesBefore > g.ctxLines { + ctxPrefix = g.beforeContext[linesBefore-g.ctxLines-1] + g.beforeContext = g.beforeContext[linesBefore-g.ctxLines:] + linesBefore = g.ctxLines + } + + g.current = &hunk{ctxPrefix: strings.TrimSuffix(ctxPrefix, "\n")} + g.current.AddOp(Equal, g.beforeContext...) + + switch op { + case Delete: + g.current.fromLine, g.current.toLine = + g.addLineNumbers(g.fromLine, g.toLine, linesBefore, i, Add) + case Add: + g.current.toLine, g.current.fromLine = + g.addLineNumbers(g.toLine, g.fromLine, linesBefore, i, Delete) + } + + g.beforeContext = nil +} + +// addLineNumbers obtains the line numbers in a new chunk. +func (g *hunksGenerator) addLineNumbers(la, lb int, linesBefore int, i int, op Operation) (cla, clb int) { + cla = la - linesBefore + // we need to search for a reference for the next diff + switch { + case linesBefore != 0 && g.ctxLines != 0: + if lb > g.ctxLines { + clb = lb - g.ctxLines + 1 + } else { + clb = 1 + } + case g.ctxLines == 0: + clb = lb + case i != len(g.chunks)-1: + next := g.chunks[i+1] + if next.Type() == op || next.Type() == Equal { + // this diff will be into this chunk + clb = lb + 1 + } + } + + return +} + +func (g *hunksGenerator) processEqualsLines(ls []string, i int) { + if g.current == nil { + g.beforeContext = append(g.beforeContext, ls...) + return + } + + g.afterContext = append(g.afterContext, ls...) + if len(g.afterContext) <= g.ctxLines*2 && i != len(g.chunks)-1 { + g.current.AddOp(Equal, g.afterContext...) + g.afterContext = nil + } else { + ctxLines := g.ctxLines + if ctxLines > len(g.afterContext) { + ctxLines = len(g.afterContext) + } + g.current.AddOp(Equal, g.afterContext[:ctxLines]...) + g.hunks = append(g.hunks, g.current) + + g.current = nil + g.beforeContext = g.afterContext[ctxLines:] + g.afterContext = nil + } +} + +func splitLines(s string) []string { + out := splitLinesRegexp.FindAllString(s, -1) + if out[len(out)-1] == "" { + out = out[:len(out)-1] + } + return out +} + +type hunk struct { + fromLine int + toLine int + + fromCount int + toCount int + + ctxPrefix string + ops []*op +} + +func (h *hunk) writeTo(sb *strings.Builder, color ColorConfig) { + sb.WriteString(color[Frag]) + sb.WriteString("@@ -") + + if h.fromCount == 1 { + sb.WriteString(strconv.Itoa(h.fromLine)) + } else { + sb.WriteString(strconv.Itoa(h.fromLine)) + sb.WriteByte(',') + sb.WriteString(strconv.Itoa(h.fromCount)) + } + + sb.WriteString(" +") + + if h.toCount == 1 { + sb.WriteString(strconv.Itoa(h.toLine)) + } else { + sb.WriteString(strconv.Itoa(h.toLine)) + sb.WriteByte(',') + sb.WriteString(strconv.Itoa(h.toCount)) + } + + sb.WriteString(" @@") + sb.WriteString(color.Reset(Frag)) + + if h.ctxPrefix != "" { + sb.WriteByte(' ') + sb.WriteString(color[Func]) + sb.WriteString(h.ctxPrefix) + sb.WriteString(color.Reset(Func)) + } + + sb.WriteByte('\n') + + for _, op := range h.ops { + op.writeTo(sb, color) + } +} + +func (h *hunk) AddOp(t Operation, ss ...string) { + n := len(ss) + switch t { + case Add: + h.toCount += n + case Delete: + h.fromCount += n + case Equal: + h.toCount += n + h.fromCount += n + } + + for _, s := range ss { + h.ops = append(h.ops, &op{s, t}) + } +} + +type op struct { + text string + t Operation +} + +func (o *op) writeTo(sb *strings.Builder, color ColorConfig) { + colorKey := operationColorKey[o.t] + sb.WriteString(color[colorKey]) + sb.WriteByte(operationChar[o.t]) + if strings.HasSuffix(o.text, "\n") { + sb.WriteString(strings.TrimSuffix(o.text, "\n")) + } else { + sb.WriteString(o.text + "\n\\ No newline at end of file") + } + sb.WriteString(color.Reset(colorKey)) + sb.WriteByte('\n') +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/dir.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/dir.go new file mode 100644 index 000000000..f4444bfb3 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/dir.go @@ -0,0 +1,136 @@ +package gitignore + +import ( + "bytes" + "io/ioutil" + "os" + "os/user" + "strings" + + "github.com/go-git/go-billy/v5" + "github.com/go-git/go-git/v5/plumbing/format/config" + gioutil "github.com/go-git/go-git/v5/utils/ioutil" +) + +const ( + commentPrefix = "#" + coreSection = "core" + eol = "\n" + excludesfile = "excludesfile" + gitDir = ".git" + gitignoreFile = ".gitignore" + gitconfigFile = ".gitconfig" + systemFile = "/etc/gitconfig" +) + +// readIgnoreFile reads a specific git ignore file. +func readIgnoreFile(fs billy.Filesystem, path []string, ignoreFile string) (ps []Pattern, err error) { + f, err := fs.Open(fs.Join(append(path, ignoreFile)...)) + if err == nil { + defer f.Close() + + if data, err := ioutil.ReadAll(f); err == nil { + for _, s := range strings.Split(string(data), eol) { + if !strings.HasPrefix(s, commentPrefix) && len(strings.TrimSpace(s)) > 0 { + ps = append(ps, ParsePattern(s, path)) + } + } + } + } else if !os.IsNotExist(err) { + return nil, err + } + + return +} + +// ReadPatterns reads gitignore patterns recursively traversing through the directory +// structure. The result is in the ascending order of priority (last higher). +func ReadPatterns(fs billy.Filesystem, path []string) (ps []Pattern, err error) { + ps, _ = readIgnoreFile(fs, path, gitignoreFile) + + var fis []os.FileInfo + fis, err = fs.ReadDir(fs.Join(path...)) + if err != nil { + return + } + + for _, fi := range fis { + if fi.IsDir() && fi.Name() != gitDir { + var subps []Pattern + subps, err = ReadPatterns(fs, append(path, fi.Name())) + if err != nil { + return + } + + if len(subps) > 0 { + ps = append(ps, subps...) + } + } + } + + return +} + +func loadPatterns(fs billy.Filesystem, path string) (ps []Pattern, err error) { + f, err := fs.Open(path) + if err != nil { + if os.IsNotExist(err) { + return nil, nil + } + return nil, err + } + + defer gioutil.CheckClose(f, &err) + + b, err := ioutil.ReadAll(f) + if err != nil { + return + } + + d := config.NewDecoder(bytes.NewBuffer(b)) + + raw := config.New() + if err = d.Decode(raw); err != nil { + return + } + + s := raw.Section(coreSection) + efo := s.Options.Get(excludesfile) + if efo == "" { + return nil, nil + } + + ps, err = readIgnoreFile(fs, nil, efo) + if os.IsNotExist(err) { + return nil, nil + } + + return +} + +// LoadGlobalPatterns loads gitignore patterns from from the gitignore file +// declared in a user's ~/.gitconfig file. If the ~/.gitconfig file does not +// exist the function will return nil. If the core.excludesfile property +// is not declared, the function will return nil. If the file pointed to by +// the core.excludesfile property does not exist, the function will return nil. +// +// The function assumes fs is rooted at the root filesystem. +func LoadGlobalPatterns(fs billy.Filesystem) (ps []Pattern, err error) { + usr, err := user.Current() + if err != nil { + return + } + + return loadPatterns(fs, fs.Join(usr.HomeDir, gitconfigFile)) +} + +// LoadSystemPatterns loads gitignore patterns from from the gitignore file +// declared in a system's /etc/gitconfig file. If the ~/.gitconfig file does +// not exist the function will return nil. If the core.excludesfile property +// is not declared, the function will return nil. If the file pointed to by +// the core.excludesfile property does not exist, the function will return nil. +// +// The function assumes fs is rooted at the root filesystem. +func LoadSystemPatterns(fs billy.Filesystem) (ps []Pattern, err error) { + return loadPatterns(fs, systemFile) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/doc.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/doc.go new file mode 100644 index 000000000..eecd4bacc --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/doc.go @@ -0,0 +1,70 @@ +// Package gitignore implements matching file system paths to gitignore patterns that +// can be automatically read from a git repository tree in the order of definition +// priorities. It support all pattern formats as specified in the original gitignore +// documentation, copied below: +// +// Pattern format +// ============== +// +// - A blank line matches no files, so it can serve as a separator for readability. +// +// - A line starting with # serves as a comment. Put a backslash ("\") in front of +// the first hash for patterns that begin with a hash. +// +// - Trailing spaces are ignored unless they are quoted with backslash ("\"). +// +// - An optional prefix "!" which negates the pattern; any matching file excluded +// by a previous pattern will become included again. It is not possible to +// re-include a file if a parent directory of that file is excluded. +// Git doesn’t list excluded directories for performance reasons, so +// any patterns on contained files have no effect, no matter where they are +// defined. Put a backslash ("\") in front of the first "!" for patterns +// that begin with a literal "!", for example, "\!important!.txt". +// +// - If the pattern ends with a slash, it is removed for the purpose of the +// following description, but it would only find a match with a directory. +// In other words, foo/ will match a directory foo and paths underneath it, +// but will not match a regular file or a symbolic link foo (this is consistent +// with the way how pathspec works in general in Git). +// +// - If the pattern does not contain a slash /, Git treats it as a shell glob +// pattern and checks for a match against the pathname relative to the location +// of the .gitignore file (relative to the toplevel of the work tree if not +// from a .gitignore file). +// +// - Otherwise, Git treats the pattern as a shell glob suitable for consumption +// by fnmatch(3) with the FNM_PATHNAME flag: wildcards in the pattern will +// not match a / in the pathname. For example, "Documentation/*.html" matches +// "Documentation/git.html" but not "Documentation/ppc/ppc.html" or +// "tools/perf/Documentation/perf.html". +// +// - A leading slash matches the beginning of the pathname. For example, +// "/*.c" matches "cat-file.c" but not "mozilla-sha1/sha1.c". +// +// Two consecutive asterisks ("**") in patterns matched against full pathname +// may have special meaning: +// +// - A leading "**" followed by a slash means match in all directories. +// For example, "**/foo" matches file or directory "foo" anywhere, the same as +// pattern "foo". "**/foo/bar" matches file or directory "bar" +// anywhere that is directly under directory "foo". +// +// - A trailing "/**" matches everything inside. For example, "abc/**" matches +// all files inside directory "abc", relative to the location of the +// .gitignore file, with infinite depth. +// +// - A slash followed by two consecutive asterisks then a slash matches +// zero or more directories. For example, "a/**/b" matches "a/b", "a/x/b", +// "a/x/y/b" and so on. +// +// - Other consecutive asterisks are considered invalid. +// +// Copyright and license +// ===================== +// +// Copyright (c) Oleg Sklyar, Silvertern and source{d} +// +// The package code was donated to source{d} to include, modify and develop +// further as a part of the `go-git` project, release it on the license of +// the whole project or delete it from the project. +package gitignore diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/matcher.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/matcher.go new file mode 100644 index 000000000..bd1e9e2d4 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/matcher.go @@ -0,0 +1,30 @@ +package gitignore + +// Matcher defines a global multi-pattern matcher for gitignore patterns +type Matcher interface { + // Match matches patterns in the order of priorities. As soon as an inclusion or + // exclusion is found, not further matching is performed. + Match(path []string, isDir bool) bool +} + +// NewMatcher constructs a new global matcher. Patterns must be given in the order of +// increasing priority. That is most generic settings files first, then the content of +// the repo .gitignore, then content of .gitignore down the path or the repo and then +// the content command line arguments. +func NewMatcher(ps []Pattern) Matcher { + return &matcher{ps} +} + +type matcher struct { + patterns []Pattern +} + +func (m *matcher) Match(path []string, isDir bool) bool { + n := len(m.patterns) + for i := n - 1; i >= 0; i-- { + if match := m.patterns[i].Match(path, isDir); match > NoMatch { + return match == Exclude + } + } + return false +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/pattern.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/pattern.go new file mode 100644 index 000000000..098cb5021 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/pattern.go @@ -0,0 +1,153 @@ +package gitignore + +import ( + "path/filepath" + "strings" +) + +// MatchResult defines outcomes of a match, no match, exclusion or inclusion. +type MatchResult int + +const ( + // NoMatch defines the no match outcome of a match check + NoMatch MatchResult = iota + // Exclude defines an exclusion of a file as a result of a match check + Exclude + // Include defines an explicit inclusion of a file as a result of a match check + Include +) + +const ( + inclusionPrefix = "!" + zeroToManyDirs = "**" + patternDirSep = "/" +) + +// Pattern defines a single gitignore pattern. +type Pattern interface { + // Match matches the given path to the pattern. + Match(path []string, isDir bool) MatchResult +} + +type pattern struct { + domain []string + pattern []string + inclusion bool + dirOnly bool + isGlob bool +} + +// ParsePattern parses a gitignore pattern string into the Pattern structure. +func ParsePattern(p string, domain []string) Pattern { + res := pattern{domain: domain} + + if strings.HasPrefix(p, inclusionPrefix) { + res.inclusion = true + p = p[1:] + } + + if !strings.HasSuffix(p, "\\ ") { + p = strings.TrimRight(p, " ") + } + + if strings.HasSuffix(p, patternDirSep) { + res.dirOnly = true + p = p[:len(p)-1] + } + + if strings.Contains(p, patternDirSep) { + res.isGlob = true + } + + res.pattern = strings.Split(p, patternDirSep) + return &res +} + +func (p *pattern) Match(path []string, isDir bool) MatchResult { + if len(path) <= len(p.domain) { + return NoMatch + } + for i, e := range p.domain { + if path[i] != e { + return NoMatch + } + } + + path = path[len(p.domain):] + if p.isGlob && !p.globMatch(path, isDir) { + return NoMatch + } else if !p.isGlob && !p.simpleNameMatch(path, isDir) { + return NoMatch + } + + if p.inclusion { + return Include + } else { + return Exclude + } +} + +func (p *pattern) simpleNameMatch(path []string, isDir bool) bool { + for i, name := range path { + if match, err := filepath.Match(p.pattern[0], name); err != nil { + return false + } else if !match { + continue + } + if p.dirOnly && !isDir && i == len(path)-1 { + return false + } + return true + } + return false +} + +func (p *pattern) globMatch(path []string, isDir bool) bool { + matched := false + canTraverse := false + for i, pattern := range p.pattern { + if pattern == "" { + canTraverse = false + continue + } + if pattern == zeroToManyDirs { + if i == len(p.pattern)-1 { + break + } + canTraverse = true + continue + } + if strings.Contains(pattern, zeroToManyDirs) { + return false + } + if len(path) == 0 { + return false + } + if canTraverse { + canTraverse = false + for len(path) > 0 { + e := path[0] + path = path[1:] + if match, err := filepath.Match(pattern, e); err != nil { + return false + } else if match { + matched = true + break + } else if len(path) == 0 { + // if nothing left then fail + matched = false + } + } + } else { + if match, err := filepath.Match(pattern, path[0]); err != nil || !match { + return false + } + matched = true + path = path[1:] + } + } + if matched && p.dirOnly && !isDir && len(path) == 0 { + matched = false + } + return matched +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/decoder.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/decoder.go new file mode 100644 index 000000000..7768bd650 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/decoder.go @@ -0,0 +1,177 @@ +package idxfile + +import ( + "bufio" + "bytes" + "errors" + "io" + + "github.com/go-git/go-git/v5/utils/binary" +) + +var ( + // ErrUnsupportedVersion is returned by Decode when the idx file version + // is not supported. + ErrUnsupportedVersion = errors.New("Unsupported version") + // ErrMalformedIdxFile is returned by Decode when the idx file is corrupted. + ErrMalformedIdxFile = errors.New("Malformed IDX file") +) + +const ( + fanout = 256 + objectIDLength = 20 +) + +// Decoder reads and decodes idx files from an input stream. +type Decoder struct { + *bufio.Reader +} + +// NewDecoder builds a new idx stream decoder, that reads from r. +func NewDecoder(r io.Reader) *Decoder { + return &Decoder{bufio.NewReader(r)} +} + +// Decode reads from the stream and decode the content into the MemoryIndex struct. +func (d *Decoder) Decode(idx *MemoryIndex) error { + if err := validateHeader(d); err != nil { + return err + } + + flow := []func(*MemoryIndex, io.Reader) error{ + readVersion, + readFanout, + readObjectNames, + readCRC32, + readOffsets, + readChecksums, + } + + for _, f := range flow { + if err := f(idx, d); err != nil { + return err + } + } + + return nil +} + +func validateHeader(r io.Reader) error { + var h = make([]byte, 4) + if _, err := io.ReadFull(r, h); err != nil { + return err + } + + if !bytes.Equal(h, idxHeader) { + return ErrMalformedIdxFile + } + + return nil +} + +func readVersion(idx *MemoryIndex, r io.Reader) error { + v, err := binary.ReadUint32(r) + if err != nil { + return err + } + + if v > VersionSupported { + return ErrUnsupportedVersion + } + + idx.Version = v + return nil +} + +func readFanout(idx *MemoryIndex, r io.Reader) error { + for k := 0; k < fanout; k++ { + n, err := binary.ReadUint32(r) + if err != nil { + return err + } + + idx.Fanout[k] = n + idx.FanoutMapping[k] = noMapping + } + + return nil +} + +func readObjectNames(idx *MemoryIndex, r io.Reader) error { + for k := 0; k < fanout; k++ { + var buckets uint32 + if k == 0 { + buckets = idx.Fanout[k] + } else { + buckets = idx.Fanout[k] - idx.Fanout[k-1] + } + + if buckets == 0 { + continue + } + + idx.FanoutMapping[k] = len(idx.Names) + + nameLen := int(buckets * objectIDLength) + bin := make([]byte, nameLen) + if _, err := io.ReadFull(r, bin); err != nil { + return err + } + + idx.Names = append(idx.Names, bin) + idx.Offset32 = append(idx.Offset32, make([]byte, buckets*4)) + idx.CRC32 = append(idx.CRC32, make([]byte, buckets*4)) + } + + return nil +} + +func readCRC32(idx *MemoryIndex, r io.Reader) error { + for k := 0; k < fanout; k++ { + if pos := idx.FanoutMapping[k]; pos != noMapping { + if _, err := io.ReadFull(r, idx.CRC32[pos]); err != nil { + return err + } + } + } + + return nil +} + +func readOffsets(idx *MemoryIndex, r io.Reader) error { + var o64cnt int + for k := 0; k < fanout; k++ { + if pos := idx.FanoutMapping[k]; pos != noMapping { + if _, err := io.ReadFull(r, idx.Offset32[pos]); err != nil { + return err + } + + for p := 0; p < len(idx.Offset32[pos]); p += 4 { + if idx.Offset32[pos][p]&(byte(1)<<7) > 0 { + o64cnt++ + } + } + } + } + + if o64cnt > 0 { + idx.Offset64 = make([]byte, o64cnt*8) + if _, err := io.ReadFull(r, idx.Offset64); err != nil { + return err + } + } + + return nil +} + +func readChecksums(idx *MemoryIndex, r io.Reader) error { + if _, err := io.ReadFull(r, idx.PackfileChecksum[:]); err != nil { + return err + } + + if _, err := io.ReadFull(r, idx.IdxChecksum[:]); err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/doc.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/doc.go new file mode 100644 index 000000000..1e628ab4a --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/doc.go @@ -0,0 +1,128 @@ +// Package idxfile implements encoding and decoding of packfile idx files. +// +// == Original (version 1) pack-*.idx files have the following format: +// +// - The header consists of 256 4-byte network byte order +// integers. N-th entry of this table records the number of +// objects in the corresponding pack, the first byte of whose +// object name is less than or equal to N. This is called the +// 'first-level fan-out' table. +// +// - The header is followed by sorted 24-byte entries, one entry +// per object in the pack. Each entry is: +// +// 4-byte network byte order integer, recording where the +// object is stored in the packfile as the offset from the +// beginning. +// +// 20-byte object name. +// +// - The file is concluded with a trailer: +// +// A copy of the 20-byte SHA1 checksum at the end of +// corresponding packfile. +// +// 20-byte SHA1-checksum of all of the above. +// +// Pack Idx file: +// +// -- +--------------------------------+ +// fanout | fanout[0] = 2 (for example) |-. +// table +--------------------------------+ | +// | fanout[1] | | +// +--------------------------------+ | +// | fanout[2] | | +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | +// | fanout[255] = total objects |---. +// -- +--------------------------------+ | | +// main | offset | | | +// index | object name 00XXXXXXXXXXXXXXXX | | | +// tab +--------------------------------+ | | +// | offset | | | +// | object name 00XXXXXXXXXXXXXXXX | | | +// +--------------------------------+<+ | +// .-| offset | | +// | | object name 01XXXXXXXXXXXXXXXX | | +// | +--------------------------------+ | +// | | offset | | +// | | object name 01XXXXXXXXXXXXXXXX | | +// | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | +// | | offset | | +// | | object name FFXXXXXXXXXXXXXXXX | | +// --| +--------------------------------+<--+ +// trailer | | packfile checksum | +// | +--------------------------------+ +// | | idxfile checksum | +// | +--------------------------------+ +// .---------. +// | +// Pack file entry: <+ +// +// packed object header: +// 1-byte size extension bit (MSB) +// type (next 3 bit) +// size0 (lower 4-bit) +// n-byte sizeN (as long as MSB is set, each 7-bit) +// size0..sizeN form 4+7+7+..+7 bit integer, size0 +// is the least significant part, and sizeN is the +// most significant part. +// packed object data: +// If it is not DELTA, then deflated bytes (the size above +// is the size before compression). +// If it is REF_DELTA, then +// 20-byte base object name SHA1 (the size above is the +// size of the delta data that follows). +// delta data, deflated. +// If it is OFS_DELTA, then +// n-byte offset (see below) interpreted as a negative +// offset from the type-byte of the header of the +// ofs-delta entry (the size above is the size of +// the delta data that follows). +// delta data, deflated. +// +// offset encoding: +// n bytes with MSB set in all but the last one. +// The offset is then the number constructed by +// concatenating the lower 7 bit of each byte, and +// for n >= 2 adding 2^7 + 2^14 + ... + 2^(7*(n-1)) +// to the result. +// +// == Version 2 pack-*.idx files support packs larger than 4 GiB, and +// have some other reorganizations. They have the format: +// +// - A 4-byte magic number '\377tOc' which is an unreasonable +// fanout[0] value. +// +// - A 4-byte version number (= 2) +// +// - A 256-entry fan-out table just like v1. +// +// - A table of sorted 20-byte SHA1 object names. These are +// packed together without offset values to reduce the cache +// footprint of the binary search for a specific object name. +// +// - A table of 4-byte CRC32 values of the packed object data. +// This is new in v2 so compressed data can be copied directly +// from pack to pack during repacking without undetected +// data corruption. +// +// - A table of 4-byte offset values (in network byte order). +// These are usually 31-bit pack file offsets, but large +// offsets are encoded as an index into the next table with +// the msbit set. +// +// - A table of 8-byte offset entries (empty for pack files less +// than 2 GiB). Pack files are organized with heavily used +// objects toward the front, so most object references should +// not need to refer to this table. +// +// - The same trailer as a v1 pack file: +// +// A copy of the 20-byte SHA1 checksum at the end of +// corresponding packfile. +// +// 20-byte SHA1-checksum of all of the above. +// +// Source: +// https://www.kernel.org/pub/software/scm/git/docs/v1.7.5/technical/pack-format.txt +package idxfile diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/encoder.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/encoder.go new file mode 100644 index 000000000..26b2e4d6b --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/encoder.go @@ -0,0 +1,142 @@ +package idxfile + +import ( + "crypto/sha1" + "hash" + "io" + + "github.com/go-git/go-git/v5/utils/binary" +) + +// Encoder writes MemoryIndex structs to an output stream. +type Encoder struct { + io.Writer + hash hash.Hash +} + +// NewEncoder returns a new stream encoder that writes to w. +func NewEncoder(w io.Writer) *Encoder { + h := sha1.New() + mw := io.MultiWriter(w, h) + return &Encoder{mw, h} +} + +// Encode encodes an MemoryIndex to the encoder writer. +func (e *Encoder) Encode(idx *MemoryIndex) (int, error) { + flow := []func(*MemoryIndex) (int, error){ + e.encodeHeader, + e.encodeFanout, + e.encodeHashes, + e.encodeCRC32, + e.encodeOffsets, + e.encodeChecksums, + } + + sz := 0 + for _, f := range flow { + i, err := f(idx) + sz += i + + if err != nil { + return sz, err + } + } + + return sz, nil +} + +func (e *Encoder) encodeHeader(idx *MemoryIndex) (int, error) { + c, err := e.Write(idxHeader) + if err != nil { + return c, err + } + + return c + 4, binary.WriteUint32(e, idx.Version) +} + +func (e *Encoder) encodeFanout(idx *MemoryIndex) (int, error) { + for _, c := range idx.Fanout { + if err := binary.WriteUint32(e, c); err != nil { + return 0, err + } + } + + return fanout * 4, nil +} + +func (e *Encoder) encodeHashes(idx *MemoryIndex) (int, error) { + var size int + for k := 0; k < fanout; k++ { + pos := idx.FanoutMapping[k] + if pos == noMapping { + continue + } + + n, err := e.Write(idx.Names[pos]) + if err != nil { + return size, err + } + size += n + } + return size, nil +} + +func (e *Encoder) encodeCRC32(idx *MemoryIndex) (int, error) { + var size int + for k := 0; k < fanout; k++ { + pos := idx.FanoutMapping[k] + if pos == noMapping { + continue + } + + n, err := e.Write(idx.CRC32[pos]) + if err != nil { + return size, err + } + + size += n + } + + return size, nil +} + +func (e *Encoder) encodeOffsets(idx *MemoryIndex) (int, error) { + var size int + for k := 0; k < fanout; k++ { + pos := idx.FanoutMapping[k] + if pos == noMapping { + continue + } + + n, err := e.Write(idx.Offset32[pos]) + if err != nil { + return size, err + } + + size += n + } + + if len(idx.Offset64) > 0 { + n, err := e.Write(idx.Offset64) + if err != nil { + return size, err + } + + size += n + } + + return size, nil +} + +func (e *Encoder) encodeChecksums(idx *MemoryIndex) (int, error) { + if _, err := e.Write(idx.PackfileChecksum[:]); err != nil { + return 0, err + } + + copy(idx.IdxChecksum[:], e.hash.Sum(nil)[:20]) + if _, err := e.Write(idx.IdxChecksum[:]); err != nil { + return 0, err + } + + return 40, nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/idxfile.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/idxfile.go new file mode 100644 index 000000000..64dd8dcef --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/idxfile.go @@ -0,0 +1,346 @@ +package idxfile + +import ( + "bytes" + "io" + "sort" + + encbin "encoding/binary" + + "github.com/go-git/go-git/v5/plumbing" +) + +const ( + // VersionSupported is the only idx version supported. + VersionSupported = 2 + + noMapping = -1 +) + +var ( + idxHeader = []byte{255, 't', 'O', 'c'} +) + +// Index represents an index of a packfile. +type Index interface { + // Contains checks whether the given hash is in the index. + Contains(h plumbing.Hash) (bool, error) + // FindOffset finds the offset in the packfile for the object with + // the given hash. + FindOffset(h plumbing.Hash) (int64, error) + // FindCRC32 finds the CRC32 of the object with the given hash. + FindCRC32(h plumbing.Hash) (uint32, error) + // FindHash finds the hash for the object with the given offset. + FindHash(o int64) (plumbing.Hash, error) + // Count returns the number of entries in the index. + Count() (int64, error) + // Entries returns an iterator to retrieve all index entries. + Entries() (EntryIter, error) + // EntriesByOffset returns an iterator to retrieve all index entries ordered + // by offset. + EntriesByOffset() (EntryIter, error) +} + +// MemoryIndex is the in memory representation of an idx file. +type MemoryIndex struct { + Version uint32 + Fanout [256]uint32 + // FanoutMapping maps the position in the fanout table to the position + // in the Names, Offset32 and CRC32 slices. This improves the memory + // usage by not needing an array with unnecessary empty slots. + FanoutMapping [256]int + Names [][]byte + Offset32 [][]byte + CRC32 [][]byte + Offset64 []byte + PackfileChecksum [20]byte + IdxChecksum [20]byte + + offsetHash map[int64]plumbing.Hash + offsetHashIsFull bool +} + +var _ Index = (*MemoryIndex)(nil) + +// NewMemoryIndex returns an instance of a new MemoryIndex. +func NewMemoryIndex() *MemoryIndex { + return &MemoryIndex{} +} + +func (idx *MemoryIndex) findHashIndex(h plumbing.Hash) (int, bool) { + k := idx.FanoutMapping[h[0]] + if k == noMapping { + return 0, false + } + + if len(idx.Names) <= k { + return 0, false + } + + data := idx.Names[k] + high := uint64(len(idx.Offset32[k])) >> 2 + if high == 0 { + return 0, false + } + + low := uint64(0) + for { + mid := (low + high) >> 1 + offset := mid * objectIDLength + + cmp := bytes.Compare(h[:], data[offset:offset+objectIDLength]) + if cmp < 0 { + high = mid + } else if cmp == 0 { + return int(mid), true + } else { + low = mid + 1 + } + + if low >= high { + break + } + } + + return 0, false +} + +// Contains implements the Index interface. +func (idx *MemoryIndex) Contains(h plumbing.Hash) (bool, error) { + _, ok := idx.findHashIndex(h) + return ok, nil +} + +// FindOffset implements the Index interface. +func (idx *MemoryIndex) FindOffset(h plumbing.Hash) (int64, error) { + if len(idx.FanoutMapping) <= int(h[0]) { + return 0, plumbing.ErrObjectNotFound + } + + k := idx.FanoutMapping[h[0]] + i, ok := idx.findHashIndex(h) + if !ok { + return 0, plumbing.ErrObjectNotFound + } + + offset := idx.getOffset(k, i) + + if !idx.offsetHashIsFull { + // Save the offset for reverse lookup + if idx.offsetHash == nil { + idx.offsetHash = make(map[int64]plumbing.Hash) + } + idx.offsetHash[int64(offset)] = h + } + + return int64(offset), nil +} + +const isO64Mask = uint64(1) << 31 + +func (idx *MemoryIndex) getOffset(firstLevel, secondLevel int) uint64 { + offset := secondLevel << 2 + ofs := encbin.BigEndian.Uint32(idx.Offset32[firstLevel][offset : offset+4]) + + if (uint64(ofs) & isO64Mask) != 0 { + offset := 8 * (uint64(ofs) & ^isO64Mask) + n := encbin.BigEndian.Uint64(idx.Offset64[offset : offset+8]) + return n + } + + return uint64(ofs) +} + +// FindCRC32 implements the Index interface. +func (idx *MemoryIndex) FindCRC32(h plumbing.Hash) (uint32, error) { + k := idx.FanoutMapping[h[0]] + i, ok := idx.findHashIndex(h) + if !ok { + return 0, plumbing.ErrObjectNotFound + } + + return idx.getCRC32(k, i), nil +} + +func (idx *MemoryIndex) getCRC32(firstLevel, secondLevel int) uint32 { + offset := secondLevel << 2 + return encbin.BigEndian.Uint32(idx.CRC32[firstLevel][offset : offset+4]) +} + +// FindHash implements the Index interface. +func (idx *MemoryIndex) FindHash(o int64) (plumbing.Hash, error) { + var hash plumbing.Hash + var ok bool + + if idx.offsetHash != nil { + if hash, ok = idx.offsetHash[o]; ok { + return hash, nil + } + } + + // Lazily generate the reverse offset/hash map if required. + if !idx.offsetHashIsFull || idx.offsetHash == nil { + if err := idx.genOffsetHash(); err != nil { + return plumbing.ZeroHash, err + } + + hash, ok = idx.offsetHash[o] + } + + if !ok { + return plumbing.ZeroHash, plumbing.ErrObjectNotFound + } + + return hash, nil +} + +// genOffsetHash generates the offset/hash mapping for reverse search. +func (idx *MemoryIndex) genOffsetHash() error { + count, err := idx.Count() + if err != nil { + return err + } + + idx.offsetHash = make(map[int64]plumbing.Hash, count) + idx.offsetHashIsFull = true + + var hash plumbing.Hash + i := uint32(0) + for firstLevel, fanoutValue := range idx.Fanout { + mappedFirstLevel := idx.FanoutMapping[firstLevel] + for secondLevel := uint32(0); i < fanoutValue; i++ { + copy(hash[:], idx.Names[mappedFirstLevel][secondLevel*objectIDLength:]) + offset := int64(idx.getOffset(mappedFirstLevel, int(secondLevel))) + idx.offsetHash[offset] = hash + secondLevel++ + } + } + + return nil +} + +// Count implements the Index interface. +func (idx *MemoryIndex) Count() (int64, error) { + return int64(idx.Fanout[fanout-1]), nil +} + +// Entries implements the Index interface. +func (idx *MemoryIndex) Entries() (EntryIter, error) { + return &idxfileEntryIter{idx, 0, 0, 0}, nil +} + +// EntriesByOffset implements the Index interface. +func (idx *MemoryIndex) EntriesByOffset() (EntryIter, error) { + count, err := idx.Count() + if err != nil { + return nil, err + } + + iter := &idxfileEntryOffsetIter{ + entries: make(entriesByOffset, count), + } + + entries, err := idx.Entries() + if err != nil { + return nil, err + } + + for pos := 0; int64(pos) < count; pos++ { + entry, err := entries.Next() + if err != nil { + return nil, err + } + + iter.entries[pos] = entry + } + + sort.Sort(iter.entries) + + return iter, nil +} + +// EntryIter is an iterator that will return the entries in a packfile index. +type EntryIter interface { + // Next returns the next entry in the packfile index. + Next() (*Entry, error) + // Close closes the iterator. + Close() error +} + +type idxfileEntryIter struct { + idx *MemoryIndex + total int + firstLevel, secondLevel int +} + +func (i *idxfileEntryIter) Next() (*Entry, error) { + for { + if i.firstLevel >= fanout { + return nil, io.EOF + } + + if i.total >= int(i.idx.Fanout[i.firstLevel]) { + i.firstLevel++ + i.secondLevel = 0 + continue + } + + mappedFirstLevel := i.idx.FanoutMapping[i.firstLevel] + entry := new(Entry) + copy(entry.Hash[:], i.idx.Names[mappedFirstLevel][i.secondLevel*objectIDLength:]) + entry.Offset = i.idx.getOffset(mappedFirstLevel, i.secondLevel) + entry.CRC32 = i.idx.getCRC32(mappedFirstLevel, i.secondLevel) + + i.secondLevel++ + i.total++ + + return entry, nil + } +} + +func (i *idxfileEntryIter) Close() error { + i.firstLevel = fanout + return nil +} + +// Entry is the in memory representation of an object entry in the idx file. +type Entry struct { + Hash plumbing.Hash + CRC32 uint32 + Offset uint64 +} + +type idxfileEntryOffsetIter struct { + entries entriesByOffset + pos int +} + +func (i *idxfileEntryOffsetIter) Next() (*Entry, error) { + if i.pos >= len(i.entries) { + return nil, io.EOF + } + + entry := i.entries[i.pos] + i.pos++ + + return entry, nil +} + +func (i *idxfileEntryOffsetIter) Close() error { + i.pos = len(i.entries) + 1 + return nil +} + +type entriesByOffset []*Entry + +func (o entriesByOffset) Len() int { + return len(o) +} + +func (o entriesByOffset) Less(i int, j int) bool { + return o[i].Offset < o[j].Offset +} + +func (o entriesByOffset) Swap(i int, j int) { + o[i], o[j] = o[j], o[i] +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/writer.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/writer.go new file mode 100644 index 000000000..daa160502 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/writer.go @@ -0,0 +1,186 @@ +package idxfile + +import ( + "bytes" + "fmt" + "math" + "sort" + "sync" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/utils/binary" +) + +// objects implements sort.Interface and uses hash as sorting key. +type objects []Entry + +// Writer implements a packfile Observer interface and is used to generate +// indexes. +type Writer struct { + m sync.Mutex + + count uint32 + checksum plumbing.Hash + objects objects + offset64 uint32 + finished bool + index *MemoryIndex + added map[plumbing.Hash]struct{} +} + +// Index returns a previously created MemoryIndex or creates a new one if +// needed. +func (w *Writer) Index() (*MemoryIndex, error) { + w.m.Lock() + defer w.m.Unlock() + + if w.index == nil { + return w.createIndex() + } + + return w.index, nil +} + +// Add appends new object data. +func (w *Writer) Add(h plumbing.Hash, pos uint64, crc uint32) { + w.m.Lock() + defer w.m.Unlock() + + if w.added == nil { + w.added = make(map[plumbing.Hash]struct{}) + } + + if _, ok := w.added[h]; !ok { + w.added[h] = struct{}{} + w.objects = append(w.objects, Entry{h, crc, pos}) + } + +} + +func (w *Writer) Finished() bool { + return w.finished +} + +// OnHeader implements packfile.Observer interface. +func (w *Writer) OnHeader(count uint32) error { + w.count = count + w.objects = make(objects, 0, count) + return nil +} + +// OnInflatedObjectHeader implements packfile.Observer interface. +func (w *Writer) OnInflatedObjectHeader(t plumbing.ObjectType, objSize int64, pos int64) error { + return nil +} + +// OnInflatedObjectContent implements packfile.Observer interface. +func (w *Writer) OnInflatedObjectContent(h plumbing.Hash, pos int64, crc uint32, _ []byte) error { + w.Add(h, uint64(pos), crc) + return nil +} + +// OnFooter implements packfile.Observer interface. +func (w *Writer) OnFooter(h plumbing.Hash) error { + w.checksum = h + w.finished = true + _, err := w.createIndex() + if err != nil { + return err + } + + return nil +} + +// creatIndex returns a filled MemoryIndex with the information filled by +// the observer callbacks. +func (w *Writer) createIndex() (*MemoryIndex, error) { + if !w.finished { + return nil, fmt.Errorf("the index still hasn't finished building") + } + + idx := new(MemoryIndex) + w.index = idx + + sort.Sort(w.objects) + + // unmap all fans by default + for i := range idx.FanoutMapping { + idx.FanoutMapping[i] = noMapping + } + + buf := new(bytes.Buffer) + + last := -1 + bucket := -1 + for i, o := range w.objects { + fan := o.Hash[0] + + // fill the gaps between fans + for j := last + 1; j < int(fan); j++ { + idx.Fanout[j] = uint32(i) + } + + // update the number of objects for this position + idx.Fanout[fan] = uint32(i + 1) + + // we move from one bucket to another, update counters and allocate + // memory + if last != int(fan) { + bucket++ + idx.FanoutMapping[fan] = bucket + last = int(fan) + + idx.Names = append(idx.Names, make([]byte, 0)) + idx.Offset32 = append(idx.Offset32, make([]byte, 0)) + idx.CRC32 = append(idx.CRC32, make([]byte, 0)) + } + + idx.Names[bucket] = append(idx.Names[bucket], o.Hash[:]...) + + offset := o.Offset + if offset > math.MaxInt32 { + offset = w.addOffset64(offset) + } + + buf.Truncate(0) + binary.WriteUint32(buf, uint32(offset)) + idx.Offset32[bucket] = append(idx.Offset32[bucket], buf.Bytes()...) + + buf.Truncate(0) + binary.WriteUint32(buf, o.CRC32) + idx.CRC32[bucket] = append(idx.CRC32[bucket], buf.Bytes()...) + } + + for j := last + 1; j < 256; j++ { + idx.Fanout[j] = uint32(len(w.objects)) + } + + idx.Version = VersionSupported + idx.PackfileChecksum = w.checksum + + return idx, nil +} + +func (w *Writer) addOffset64(pos uint64) uint64 { + buf := new(bytes.Buffer) + binary.WriteUint64(buf, pos) + w.index.Offset64 = append(w.index.Offset64, buf.Bytes()...) + + index := uint64(w.offset64 | (1 << 31)) + w.offset64++ + + return index +} + +func (o objects) Len() int { + return len(o) +} + +func (o objects) Less(i int, j int) bool { + cmp := bytes.Compare(o[i].Hash[:], o[j].Hash[:]) + return cmp < 0 +} + +func (o objects) Swap(i int, j int) { + o[i], o[j] = o[j], o[i] +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/index/decoder.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/index/decoder.go new file mode 100644 index 000000000..79d0b9e11 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/index/decoder.go @@ -0,0 +1,477 @@ +package index + +import ( + "bufio" + "bytes" + "crypto/sha1" + "errors" + "hash" + "io" + "io/ioutil" + "strconv" + "time" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/utils/binary" +) + +var ( + // DecodeVersionSupported is the range of supported index versions + DecodeVersionSupported = struct{ Min, Max uint32 }{Min: 2, Max: 4} + + // ErrMalformedSignature is returned by Decode when the index header file is + // malformed + ErrMalformedSignature = errors.New("malformed index signature file") + // ErrInvalidChecksum is returned by Decode if the SHA1 hash mismatch with + // the read content + ErrInvalidChecksum = errors.New("invalid checksum") + + errUnknownExtension = errors.New("unknown extension") +) + +const ( + entryHeaderLength = 62 + entryExtended = 0x4000 + entryValid = 0x8000 + nameMask = 0xfff + intentToAddMask = 1 << 13 + skipWorkTreeMask = 1 << 14 +) + +// A Decoder reads and decodes index files from an input stream. +type Decoder struct { + r io.Reader + hash hash.Hash + lastEntry *Entry + + extReader *bufio.Reader +} + +// NewDecoder returns a new decoder that reads from r. +func NewDecoder(r io.Reader) *Decoder { + h := sha1.New() + return &Decoder{ + r: io.TeeReader(r, h), + hash: h, + extReader: bufio.NewReader(nil), + } +} + +// Decode reads the whole index object from its input and stores it in the +// value pointed to by idx. +func (d *Decoder) Decode(idx *Index) error { + var err error + idx.Version, err = validateHeader(d.r) + if err != nil { + return err + } + + entryCount, err := binary.ReadUint32(d.r) + if err != nil { + return err + } + + if err := d.readEntries(idx, int(entryCount)); err != nil { + return err + } + + return d.readExtensions(idx) +} + +func (d *Decoder) readEntries(idx *Index, count int) error { + for i := 0; i < count; i++ { + e, err := d.readEntry(idx) + if err != nil { + return err + } + + d.lastEntry = e + idx.Entries = append(idx.Entries, e) + } + + return nil +} + +func (d *Decoder) readEntry(idx *Index) (*Entry, error) { + e := &Entry{} + + var msec, mnsec, sec, nsec uint32 + var flags uint16 + + flow := []interface{}{ + &sec, &nsec, + &msec, &mnsec, + &e.Dev, + &e.Inode, + &e.Mode, + &e.UID, + &e.GID, + &e.Size, + &e.Hash, + &flags, + } + + if err := binary.Read(d.r, flow...); err != nil { + return nil, err + } + + read := entryHeaderLength + + if sec != 0 || nsec != 0 { + e.CreatedAt = time.Unix(int64(sec), int64(nsec)) + } + + if msec != 0 || mnsec != 0 { + e.ModifiedAt = time.Unix(int64(msec), int64(mnsec)) + } + + e.Stage = Stage(flags>>12) & 0x3 + + if flags&entryExtended != 0 { + extended, err := binary.ReadUint16(d.r) + if err != nil { + return nil, err + } + + read += 2 + e.IntentToAdd = extended&intentToAddMask != 0 + e.SkipWorktree = extended&skipWorkTreeMask != 0 + } + + if err := d.readEntryName(idx, e, flags); err != nil { + return nil, err + } + + return e, d.padEntry(idx, e, read) +} + +func (d *Decoder) readEntryName(idx *Index, e *Entry, flags uint16) error { + var name string + var err error + + switch idx.Version { + case 2, 3: + len := flags & nameMask + name, err = d.doReadEntryName(len) + case 4: + name, err = d.doReadEntryNameV4() + default: + return ErrUnsupportedVersion + } + + if err != nil { + return err + } + + e.Name = name + return nil +} + +func (d *Decoder) doReadEntryNameV4() (string, error) { + l, err := binary.ReadVariableWidthInt(d.r) + if err != nil { + return "", err + } + + var base string + if d.lastEntry != nil { + base = d.lastEntry.Name[:len(d.lastEntry.Name)-int(l)] + } + + name, err := binary.ReadUntil(d.r, '\x00') + if err != nil { + return "", err + } + + return base + string(name), nil +} + +func (d *Decoder) doReadEntryName(len uint16) (string, error) { + name := make([]byte, len) + _, err := io.ReadFull(d.r, name[:]) + + return string(name), err +} + +// Index entries are padded out to the next 8 byte alignment +// for historical reasons related to how C Git read the files. +func (d *Decoder) padEntry(idx *Index, e *Entry, read int) error { + if idx.Version == 4 { + return nil + } + + entrySize := read + len(e.Name) + padLen := 8 - entrySize%8 + _, err := io.CopyN(ioutil.Discard, d.r, int64(padLen)) + return err +} + +func (d *Decoder) readExtensions(idx *Index) error { + // TODO: support 'Split index' and 'Untracked cache' extensions, take in + // count that they are not supported by jgit or libgit + + var expected []byte + var err error + + var header [4]byte + for { + expected = d.hash.Sum(nil) + + var n int + if n, err = io.ReadFull(d.r, header[:]); err != nil { + if n == 0 { + err = io.EOF + } + + break + } + + err = d.readExtension(idx, header[:]) + if err != nil { + break + } + } + + if err != errUnknownExtension { + return err + } + + return d.readChecksum(expected, header) +} + +func (d *Decoder) readExtension(idx *Index, header []byte) error { + switch { + case bytes.Equal(header, treeExtSignature): + r, err := d.getExtensionReader() + if err != nil { + return err + } + + idx.Cache = &Tree{} + d := &treeExtensionDecoder{r} + if err := d.Decode(idx.Cache); err != nil { + return err + } + case bytes.Equal(header, resolveUndoExtSignature): + r, err := d.getExtensionReader() + if err != nil { + return err + } + + idx.ResolveUndo = &ResolveUndo{} + d := &resolveUndoDecoder{r} + if err := d.Decode(idx.ResolveUndo); err != nil { + return err + } + case bytes.Equal(header, endOfIndexEntryExtSignature): + r, err := d.getExtensionReader() + if err != nil { + return err + } + + idx.EndOfIndexEntry = &EndOfIndexEntry{} + d := &endOfIndexEntryDecoder{r} + if err := d.Decode(idx.EndOfIndexEntry); err != nil { + return err + } + default: + return errUnknownExtension + } + + return nil +} + +func (d *Decoder) getExtensionReader() (*bufio.Reader, error) { + len, err := binary.ReadUint32(d.r) + if err != nil { + return nil, err + } + + d.extReader.Reset(&io.LimitedReader{R: d.r, N: int64(len)}) + return d.extReader, nil +} + +func (d *Decoder) readChecksum(expected []byte, alreadyRead [4]byte) error { + var h plumbing.Hash + copy(h[:4], alreadyRead[:]) + + if _, err := io.ReadFull(d.r, h[4:]); err != nil { + return err + } + + if !bytes.Equal(h[:], expected) { + return ErrInvalidChecksum + } + + return nil +} + +func validateHeader(r io.Reader) (version uint32, err error) { + var s = make([]byte, 4) + if _, err := io.ReadFull(r, s); err != nil { + return 0, err + } + + if !bytes.Equal(s, indexSignature) { + return 0, ErrMalformedSignature + } + + version, err = binary.ReadUint32(r) + if err != nil { + return 0, err + } + + if version < DecodeVersionSupported.Min || version > DecodeVersionSupported.Max { + return 0, ErrUnsupportedVersion + } + + return +} + +type treeExtensionDecoder struct { + r *bufio.Reader +} + +func (d *treeExtensionDecoder) Decode(t *Tree) error { + for { + e, err := d.readEntry() + if err != nil { + if err == io.EOF { + return nil + } + + return err + } + + if e == nil { + continue + } + + t.Entries = append(t.Entries, *e) + } +} + +func (d *treeExtensionDecoder) readEntry() (*TreeEntry, error) { + e := &TreeEntry{} + + path, err := binary.ReadUntil(d.r, '\x00') + if err != nil { + return nil, err + } + + e.Path = string(path) + + count, err := binary.ReadUntil(d.r, ' ') + if err != nil { + return nil, err + } + + i, err := strconv.Atoi(string(count)) + if err != nil { + return nil, err + } + + // An entry can be in an invalidated state and is represented by having a + // negative number in the entry_count field. + if i == -1 { + return nil, nil + } + + e.Entries = i + trees, err := binary.ReadUntil(d.r, '\n') + if err != nil { + return nil, err + } + + i, err = strconv.Atoi(string(trees)) + if err != nil { + return nil, err + } + + e.Trees = i + _, err = io.ReadFull(d.r, e.Hash[:]) + + return e, nil +} + +type resolveUndoDecoder struct { + r *bufio.Reader +} + +func (d *resolveUndoDecoder) Decode(ru *ResolveUndo) error { + for { + e, err := d.readEntry() + if err != nil { + if err == io.EOF { + return nil + } + + return err + } + + ru.Entries = append(ru.Entries, *e) + } +} + +func (d *resolveUndoDecoder) readEntry() (*ResolveUndoEntry, error) { + e := &ResolveUndoEntry{ + Stages: make(map[Stage]plumbing.Hash), + } + + path, err := binary.ReadUntil(d.r, '\x00') + if err != nil { + return nil, err + } + + e.Path = string(path) + + for i := 0; i < 3; i++ { + if err := d.readStage(e, Stage(i+1)); err != nil { + return nil, err + } + } + + for s := range e.Stages { + var hash plumbing.Hash + if _, err := io.ReadFull(d.r, hash[:]); err != nil { + return nil, err + } + + e.Stages[s] = hash + } + + return e, nil +} + +func (d *resolveUndoDecoder) readStage(e *ResolveUndoEntry, s Stage) error { + ascii, err := binary.ReadUntil(d.r, '\x00') + if err != nil { + return err + } + + stage, err := strconv.ParseInt(string(ascii), 8, 64) + if err != nil { + return err + } + + if stage != 0 { + e.Stages[s] = plumbing.ZeroHash + } + + return nil +} + +type endOfIndexEntryDecoder struct { + r *bufio.Reader +} + +func (d *endOfIndexEntryDecoder) Decode(e *EndOfIndexEntry) error { + var err error + e.Offset, err = binary.ReadUint32(d.r) + if err != nil { + return err + } + + _, err = io.ReadFull(d.r, e.Hash[:]) + return err +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/index/doc.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/index/doc.go new file mode 100644 index 000000000..39ae6ad5f --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/index/doc.go @@ -0,0 +1,360 @@ +// Package index implements encoding and decoding of index format files. +// +// Git index format +// ================ +// +// == The Git index file has the following format +// +// All binary numbers are in network byte order. Version 2 is described +// here unless stated otherwise. +// +// - A 12-byte header consisting of +// +// 4-byte signature: +// The signature is { 'D', 'I', 'R', 'C' } (stands for "dircache") +// +// 4-byte version number: +// The current supported versions are 2, 3 and 4. +// +// 32-bit number of index entries. +// +// - A number of sorted index entries (see below). +// +// - Extensions +// +// Extensions are identified by signature. Optional extensions can +// be ignored if Git does not understand them. +// +// Git currently supports cached tree and resolve undo extensions. +// +// 4-byte extension signature. If the first byte is 'A'..'Z' the +// extension is optional and can be ignored. +// +// 32-bit size of the extension +// +// Extension data +// +// - 160-bit SHA-1 over the content of the index file before this +// checksum. +// +// == Index entry +// +// Index entries are sorted in ascending order on the name field, +// interpreted as a string of unsigned bytes (i.e. memcmp() order, no +// localization, no special casing of directory separator '/'). Entries +// with the same name are sorted by their stage field. +// +// 32-bit ctime seconds, the last time a file's metadata changed +// this is stat(2) data +// +// 32-bit ctime nanosecond fractions +// this is stat(2) data +// +// 32-bit mtime seconds, the last time a file's data changed +// this is stat(2) data +// +// 32-bit mtime nanosecond fractions +// this is stat(2) data +// +// 32-bit dev +// this is stat(2) data +// +// 32-bit ino +// this is stat(2) data +// +// 32-bit mode, split into (high to low bits) +// +// 4-bit object type +// valid values in binary are 1000 (regular file), 1010 (symbolic link) +// and 1110 (gitlink) +// +// 3-bit unused +// +// 9-bit unix permission. Only 0755 and 0644 are valid for regular files. +// Symbolic links and gitlinks have value 0 in this field. +// +// 32-bit uid +// this is stat(2) data +// +// 32-bit gid +// this is stat(2) data +// +// 32-bit file size +// This is the on-disk size from stat(2), truncated to 32-bit. +// +// 160-bit SHA-1 for the represented object +// +// A 16-bit 'flags' field split into (high to low bits) +// +// 1-bit assume-valid flag +// +// 1-bit extended flag (must be zero in version 2) +// +// 2-bit stage (during merge) +// +// 12-bit name length if the length is less than 0xFFF; otherwise 0xFFF +// is stored in this field. +// +// (Version 3 or later) A 16-bit field, only applicable if the +// "extended flag" above is 1, split into (high to low bits). +// +// 1-bit reserved for future +// +// 1-bit skip-worktree flag (used by sparse checkout) +// +// 1-bit intent-to-add flag (used by "git add -N") +// +// 13-bit unused, must be zero +// +// Entry path name (variable length) relative to top level directory +// (without leading slash). '/' is used as path separator. The special +// path components ".", ".." and ".git" (without quotes) are disallowed. +// Trailing slash is also disallowed. +// +// The exact encoding is undefined, but the '.' and '/' characters +// are encoded in 7-bit ASCII and the encoding cannot contain a NUL +// byte (iow, this is a UNIX pathname). +// +// (Version 4) In version 4, the entry path name is prefix-compressed +// relative to the path name for the previous entry (the very first +// entry is encoded as if the path name for the previous entry is an +// empty string). At the beginning of an entry, an integer N in the +// variable width encoding (the same encoding as the offset is encoded +// for OFS_DELTA pack entries; see pack-format.txt) is stored, followed +// by a NUL-terminated string S. Removing N bytes from the end of the +// path name for the previous entry, and replacing it with the string S +// yields the path name for this entry. +// +// 1-8 nul bytes as necessary to pad the entry to a multiple of eight bytes +// while keeping the name NUL-terminated. +// +// (Version 4) In version 4, the padding after the pathname does not +// exist. +// +// Interpretation of index entries in split index mode is completely +// different. See below for details. +// +// == Extensions +// +// === Cached tree +// +// Cached tree extension contains pre-computed hashes for trees that can +// be derived from the index. It helps speed up tree object generation +// from index for a new commit. +// +// When a path is updated in index, the path must be invalidated and +// removed from tree cache. +// +// The signature for this extension is { 'T', 'R', 'E', 'E' }. +// +// A series of entries fill the entire extension; each of which +// consists of: +// +// - NUL-terminated path component (relative to its parent directory); +// +// - ASCII decimal number of entries in the index that is covered by the +// tree this entry represents (entry_count); +// +// - A space (ASCII 32); +// +// - ASCII decimal number that represents the number of subtrees this +// tree has; +// +// - A newline (ASCII 10); and +// +// - 160-bit object name for the object that would result from writing +// this span of index as a tree. +// +// An entry can be in an invalidated state and is represented by having +// a negative number in the entry_count field. In this case, there is no +// object name and the next entry starts immediately after the newline. +// When writing an invalid entry, -1 should always be used as entry_count. +// +// The entries are written out in the top-down, depth-first order. The +// first entry represents the root level of the repository, followed by the +// first subtree--let's call this A--of the root level (with its name +// relative to the root level), followed by the first subtree of A (with +// its name relative to A), ... +// +// === Resolve undo +// +// A conflict is represented in the index as a set of higher stage entries. +// When a conflict is resolved (e.g. with "git add path"), these higher +// stage entries will be removed and a stage-0 entry with proper resolution +// is added. +// +// When these higher stage entries are removed, they are saved in the +// resolve undo extension, so that conflicts can be recreated (e.g. with +// "git checkout -m"), in case users want to redo a conflict resolution +// from scratch. +// +// The signature for this extension is { 'R', 'E', 'U', 'C' }. +// +// A series of entries fill the entire extension; each of which +// consists of: +// +// - NUL-terminated pathname the entry describes (relative to the root of +// the repository, i.e. full pathname); +// +// - Three NUL-terminated ASCII octal numbers, entry mode of entries in +// stage 1 to 3 (a missing stage is represented by "0" in this field); +// and +// +// - At most three 160-bit object names of the entry in stages from 1 to 3 +// (nothing is written for a missing stage). +// +// === Split index +// +// In split index mode, the majority of index entries could be stored +// in a separate file. This extension records the changes to be made on +// top of that to produce the final index. +// +// The signature for this extension is { 'l', 'i', 'n', 'k' }. +// +// The extension consists of: +// +// - 160-bit SHA-1 of the shared index file. The shared index file path +// is $GIT_DIR/sharedindex.. If all 160 bits are zero, the +// index does not require a shared index file. +// +// - An ewah-encoded delete bitmap, each bit represents an entry in the +// shared index. If a bit is set, its corresponding entry in the +// shared index will be removed from the final index. Note, because +// a delete operation changes index entry positions, but we do need +// original positions in replace phase, it's best to just mark +// entries for removal, then do a mass deletion after replacement. +// +// - An ewah-encoded replace bitmap, each bit represents an entry in +// the shared index. If a bit is set, its corresponding entry in the +// shared index will be replaced with an entry in this index +// file. All replaced entries are stored in sorted order in this +// index. The first "1" bit in the replace bitmap corresponds to the +// first index entry, the second "1" bit to the second entry and so +// on. Replaced entries may have empty path names to save space. +// +// The remaining index entries after replaced ones will be added to the +// final index. These added entries are also sorted by entry name then +// stage. +// +// == Untracked cache +// +// Untracked cache saves the untracked file list and necessary data to +// verify the cache. The signature for this extension is { 'U', 'N', +// 'T', 'R' }. +// +// The extension starts with +// +// - A sequence of NUL-terminated strings, preceded by the size of the +// sequence in variable width encoding. Each string describes the +// environment where the cache can be used. +// +// - Stat data of $GIT_DIR/info/exclude. See "Index entry" section from +// ctime field until "file size". +// +// - Stat data of plumbing.excludesfile +// +// - 32-bit dir_flags (see struct dir_struct) +// +// - 160-bit SHA-1 of $GIT_DIR/info/exclude. Null SHA-1 means the file +// does not exist. +// +// - 160-bit SHA-1 of plumbing.excludesfile. Null SHA-1 means the file does +// not exist. +// +// - NUL-terminated string of per-dir exclude file name. This usually +// is ".gitignore". +// +// - The number of following directory blocks, variable width +// encoding. If this number is zero, the extension ends here with a +// following NUL. +// +// - A number of directory blocks in depth-first-search order, each +// consists of +// +// - The number of untracked entries, variable width encoding. +// +// - The number of sub-directory blocks, variable width encoding. +// +// - The directory name terminated by NUL. +// +// - A number of untracked file/dir names terminated by NUL. +// +// The remaining data of each directory block is grouped by type: +// +// - An ewah bitmap, the n-th bit marks whether the n-th directory has +// valid untracked cache entries. +// +// - An ewah bitmap, the n-th bit records "check-only" bit of +// read_directory_recursive() for the n-th directory. +// +// - An ewah bitmap, the n-th bit indicates whether SHA-1 and stat data +// is valid for the n-th directory and exists in the next data. +// +// - An array of stat data. The n-th data corresponds with the n-th +// "one" bit in the previous ewah bitmap. +// +// - An array of SHA-1. The n-th SHA-1 corresponds with the n-th "one" bit +// in the previous ewah bitmap. +// +// - One NUL. +// +// == File System Monitor cache +// +// The file system monitor cache tracks files for which the core.fsmonitor +// hook has told us about changes. The signature for this extension is +// { 'F', 'S', 'M', 'N' }. +// +// The extension starts with +// +// - 32-bit version number: the current supported version is 1. +// +// - 64-bit time: the extension data reflects all changes through the given +// time which is stored as the nanoseconds elapsed since midnight, +// January 1, 1970. +// +// - 32-bit bitmap size: the size of the CE_FSMONITOR_VALID bitmap. +// +// - An ewah bitmap, the n-th bit indicates whether the n-th index entry +// is not CE_FSMONITOR_VALID. +// +// == End of Index Entry +// +// The End of Index Entry (EOIE) is used to locate the end of the variable +// length index entries and the beginning of the extensions. Code can take +// advantage of this to quickly locate the index extensions without having +// to parse through all of the index entries. +// +// Because it must be able to be loaded before the variable length cache +// entries and other index extensions, this extension must be written last. +// The signature for this extension is { 'E', 'O', 'I', 'E' }. +// +// The extension consists of: +// +// - 32-bit offset to the end of the index entries +// +// - 160-bit SHA-1 over the extension types and their sizes (but not +// their contents). E.g. if we have "TREE" extension that is N-bytes +// long, "REUC" extension that is M-bytes long, followed by "EOIE", +// then the hash would be: +// +// SHA-1("TREE" + + +// "REUC" + ) +// +// == Index Entry Offset Table +// +// The Index Entry Offset Table (IEOT) is used to help address the CPU +// cost of loading the index by enabling multi-threading the process of +// converting cache entries from the on-disk format to the in-memory format. +// The signature for this extension is { 'I', 'E', 'O', 'T' }. +// +// The extension consists of: +// +// - 32-bit version (currently 1) +// +// - A number of index offset entries each consisting of: +// +// - 32-bit offset from the beginning of the file to the first cache entry +// in this block of entries. +// +// - 32-bit count of cache entries in this blockpackage index +package index diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/index/encoder.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/index/encoder.go new file mode 100644 index 000000000..00d4e7a31 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/index/encoder.go @@ -0,0 +1,150 @@ +package index + +import ( + "bytes" + "crypto/sha1" + "errors" + "hash" + "io" + "sort" + "time" + + "github.com/go-git/go-git/v5/utils/binary" +) + +var ( + // EncodeVersionSupported is the range of supported index versions + EncodeVersionSupported uint32 = 2 + + // ErrInvalidTimestamp is returned by Encode if a Index with a Entry with + // negative timestamp values + ErrInvalidTimestamp = errors.New("negative timestamps are not allowed") +) + +// An Encoder writes an Index to an output stream. +type Encoder struct { + w io.Writer + hash hash.Hash +} + +// NewEncoder returns a new encoder that writes to w. +func NewEncoder(w io.Writer) *Encoder { + h := sha1.New() + mw := io.MultiWriter(w, h) + return &Encoder{mw, h} +} + +// Encode writes the Index to the stream of the encoder. +func (e *Encoder) Encode(idx *Index) error { + // TODO: support versions v3 and v4 + // TODO: support extensions + if idx.Version != EncodeVersionSupported { + return ErrUnsupportedVersion + } + + if err := e.encodeHeader(idx); err != nil { + return err + } + + if err := e.encodeEntries(idx); err != nil { + return err + } + + return e.encodeFooter() +} + +func (e *Encoder) encodeHeader(idx *Index) error { + return binary.Write(e.w, + indexSignature, + idx.Version, + uint32(len(idx.Entries)), + ) +} + +func (e *Encoder) encodeEntries(idx *Index) error { + sort.Sort(byName(idx.Entries)) + + for _, entry := range idx.Entries { + if err := e.encodeEntry(entry); err != nil { + return err + } + + wrote := entryHeaderLength + len(entry.Name) + if err := e.padEntry(wrote); err != nil { + return err + } + } + + return nil +} + +func (e *Encoder) encodeEntry(entry *Entry) error { + if entry.IntentToAdd || entry.SkipWorktree { + return ErrUnsupportedVersion + } + + sec, nsec, err := e.timeToUint32(&entry.CreatedAt) + if err != nil { + return err + } + + msec, mnsec, err := e.timeToUint32(&entry.ModifiedAt) + if err != nil { + return err + } + + flags := uint16(entry.Stage&0x3) << 12 + if l := len(entry.Name); l < nameMask { + flags |= uint16(l) + } else { + flags |= nameMask + } + + flow := []interface{}{ + sec, nsec, + msec, mnsec, + entry.Dev, + entry.Inode, + entry.Mode, + entry.UID, + entry.GID, + entry.Size, + entry.Hash[:], + flags, + } + + if err := binary.Write(e.w, flow...); err != nil { + return err + } + + return binary.Write(e.w, []byte(entry.Name)) +} + +func (e *Encoder) timeToUint32(t *time.Time) (uint32, uint32, error) { + if t.IsZero() { + return 0, 0, nil + } + + if t.Unix() < 0 || t.UnixNano() < 0 { + return 0, 0, ErrInvalidTimestamp + } + + return uint32(t.Unix()), uint32(t.Nanosecond()), nil +} + +func (e *Encoder) padEntry(wrote int) error { + padLen := 8 - wrote%8 + + _, err := e.w.Write(bytes.Repeat([]byte{'\x00'}, padLen)) + return err +} + +func (e *Encoder) encodeFooter() error { + return binary.Write(e.w, e.hash.Sum(nil)) +} + +type byName []*Entry + +func (l byName) Len() int { return len(l) } +func (l byName) Swap(i, j int) { l[i], l[j] = l[j], l[i] } +func (l byName) Less(i, j int) bool { return l[i].Name < l[j].Name } diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/index/index.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/index/index.go new file mode 100644 index 000000000..649416a2b --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/index/index.go @@ -0,0 +1,213 @@ +package index + +import ( + "bytes" + "errors" + "fmt" + "path/filepath" + "time" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/filemode" +) + +var ( + // ErrUnsupportedVersion is returned by Decode when the index file version + // is not supported. + ErrUnsupportedVersion = errors.New("unsupported version") + // ErrEntryNotFound is returned by Index.Entry, if an entry is not found. + ErrEntryNotFound = errors.New("entry not found") + + indexSignature = []byte{'D', 'I', 'R', 'C'} + treeExtSignature = []byte{'T', 'R', 'E', 'E'} + resolveUndoExtSignature = []byte{'R', 'E', 'U', 'C'} + endOfIndexEntryExtSignature = []byte{'E', 'O', 'I', 'E'} +) + +// Stage during merge +type Stage int + +const ( + // Merged is the default stage, fully merged + Merged Stage = 1 + // AncestorMode is the base revision + AncestorMode Stage = 1 + // OurMode is the first tree revision, ours + OurMode Stage = 2 + // TheirMode is the second tree revision, theirs + TheirMode Stage = 3 +) + +// Index contains the information about which objects are currently checked out +// in the worktree, having information about the working files. Changes in +// worktree are detected using this Index. The Index is also used during merges +type Index struct { + // Version is index version + Version uint32 + // Entries collection of entries represented by this Index. The order of + // this collection is not guaranteed + Entries []*Entry + // Cache represents the 'Cached tree' extension + Cache *Tree + // ResolveUndo represents the 'Resolve undo' extension + ResolveUndo *ResolveUndo + // EndOfIndexEntry represents the 'End of Index Entry' extension + EndOfIndexEntry *EndOfIndexEntry +} + +// Add creates a new Entry and returns it. The caller should first check that +// another entry with the same path does not exist. +func (i *Index) Add(path string) *Entry { + e := &Entry{ + Name: filepath.ToSlash(path), + } + + i.Entries = append(i.Entries, e) + return e +} + +// Entry returns the entry that match the given path, if any. +func (i *Index) Entry(path string) (*Entry, error) { + path = filepath.ToSlash(path) + for _, e := range i.Entries { + if e.Name == path { + return e, nil + } + } + + return nil, ErrEntryNotFound +} + +// Remove remove the entry that match the give path and returns deleted entry. +func (i *Index) Remove(path string) (*Entry, error) { + path = filepath.ToSlash(path) + for index, e := range i.Entries { + if e.Name == path { + i.Entries = append(i.Entries[:index], i.Entries[index+1:]...) + return e, nil + } + } + + return nil, ErrEntryNotFound +} + +// Glob returns the all entries matching pattern or nil if there is no matching +// entry. The syntax of patterns is the same as in filepath.Glob. +func (i *Index) Glob(pattern string) (matches []*Entry, err error) { + pattern = filepath.ToSlash(pattern) + for _, e := range i.Entries { + m, err := match(pattern, e.Name) + if err != nil { + return nil, err + } + + if m { + matches = append(matches, e) + } + } + + return +} + +// String is equivalent to `git ls-files --stage --debug` +func (i *Index) String() string { + buf := bytes.NewBuffer(nil) + for _, e := range i.Entries { + buf.WriteString(e.String()) + } + + return buf.String() +} + +// Entry represents a single file (or stage of a file) in the cache. An entry +// represents exactly one stage of a file. If a file path is unmerged then +// multiple Entry instances may appear for the same path name. +type Entry struct { + // Hash is the SHA1 of the represented file + Hash plumbing.Hash + // Name is the Entry path name relative to top level directory + Name string + // CreatedAt time when the tracked path was created + CreatedAt time.Time + // ModifiedAt time when the tracked path was changed + ModifiedAt time.Time + // Dev and Inode of the tracked path + Dev, Inode uint32 + // Mode of the path + Mode filemode.FileMode + // UID and GID, userid and group id of the owner + UID, GID uint32 + // Size is the length in bytes for regular files + Size uint32 + // Stage on a merge is defines what stage is representing this entry + // https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging + Stage Stage + // SkipWorktree used in sparse checkouts + // https://git-scm.com/docs/git-read-tree#_sparse_checkout + SkipWorktree bool + // IntentToAdd record only the fact that the path will be added later + // https://git-scm.com/docs/git-add ("git add -N") + IntentToAdd bool +} + +func (e Entry) String() string { + buf := bytes.NewBuffer(nil) + + fmt.Fprintf(buf, "%06o %s %d\t%s\n", e.Mode, e.Hash, e.Stage, e.Name) + fmt.Fprintf(buf, " ctime: %d:%d\n", e.CreatedAt.Unix(), e.CreatedAt.Nanosecond()) + fmt.Fprintf(buf, " mtime: %d:%d\n", e.ModifiedAt.Unix(), e.ModifiedAt.Nanosecond()) + fmt.Fprintf(buf, " dev: %d\tino: %d\n", e.Dev, e.Inode) + fmt.Fprintf(buf, " uid: %d\tgid: %d\n", e.UID, e.GID) + fmt.Fprintf(buf, " size: %d\tflags: %x\n", e.Size, 0) + + return buf.String() +} + +// Tree contains pre-computed hashes for trees that can be derived from the +// index. It helps speed up tree object generation from index for a new commit. +type Tree struct { + Entries []TreeEntry +} + +// TreeEntry entry of a cached Tree +type TreeEntry struct { + // Path component (relative to its parent directory) + Path string + // Entries is the number of entries in the index that is covered by the tree + // this entry represents. + Entries int + // Trees is the number that represents the number of subtrees this tree has + Trees int + // Hash object name for the object that would result from writing this span + // of index as a tree. + Hash plumbing.Hash +} + +// ResolveUndo is used when a conflict is resolved (e.g. with "git add path"), +// these higher stage entries are removed and a stage-0 entry with proper +// resolution is added. When these higher stage entries are removed, they are +// saved in the resolve undo extension. +type ResolveUndo struct { + Entries []ResolveUndoEntry +} + +// ResolveUndoEntry contains the information about a conflict when is resolved +type ResolveUndoEntry struct { + Path string + Stages map[Stage]plumbing.Hash +} + +// EndOfIndexEntry is the End of Index Entry (EOIE) is used to locate the end of +// the variable length index entries and the beginning of the extensions. Code +// can take advantage of this to quickly locate the index extensions without +// having to parse through all of the index entries. +// +// Because it must be able to be loaded before the variable length cache +// entries and other index extensions, this extension must be written last. +type EndOfIndexEntry struct { + // Offset to the end of the index entries + Offset uint32 + // Hash is a SHA-1 over the extension types and their sizes (but not + // their contents). + Hash plumbing.Hash +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/index/match.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/index/match.go new file mode 100644 index 000000000..2891d7d34 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/index/match.go @@ -0,0 +1,186 @@ +package index + +import ( + "path/filepath" + "runtime" + "unicode/utf8" +) + +// match is filepath.Match with support to match fullpath and not only filenames +// code from: +// https://github.com/golang/go/blob/39852bf4cce6927e01d0136c7843f65a801738cb/src/path/filepath/match.go#L44-L224 +func match(pattern, name string) (matched bool, err error) { +Pattern: + for len(pattern) > 0 { + var star bool + var chunk string + star, chunk, pattern = scanChunk(pattern) + + // Look for match at current position. + t, ok, err := matchChunk(chunk, name) + // if we're the last chunk, make sure we've exhausted the name + // otherwise we'll give a false result even if we could still match + // using the star + if ok && (len(t) == 0 || len(pattern) > 0) { + name = t + continue + } + if err != nil { + return false, err + } + if star { + // Look for match skipping i+1 bytes. + // Cannot skip /. + for i := 0; i < len(name); i++ { + t, ok, err := matchChunk(chunk, name[i+1:]) + if ok { + // if we're the last chunk, make sure we exhausted the name + if len(pattern) == 0 && len(t) > 0 { + continue + } + name = t + continue Pattern + } + if err != nil { + return false, err + } + } + } + return false, nil + } + return len(name) == 0, nil +} + +// scanChunk gets the next segment of pattern, which is a non-star string +// possibly preceded by a star. +func scanChunk(pattern string) (star bool, chunk, rest string) { + for len(pattern) > 0 && pattern[0] == '*' { + pattern = pattern[1:] + star = true + } + inrange := false + var i int +Scan: + for i = 0; i < len(pattern); i++ { + switch pattern[i] { + case '\\': + if runtime.GOOS != "windows" { + // error check handled in matchChunk: bad pattern. + if i+1 < len(pattern) { + i++ + } + } + case '[': + inrange = true + case ']': + inrange = false + case '*': + if !inrange { + break Scan + } + } + } + return star, pattern[0:i], pattern[i:] +} + +// matchChunk checks whether chunk matches the beginning of s. +// If so, it returns the remainder of s (after the match). +// Chunk is all single-character operators: literals, char classes, and ?. +func matchChunk(chunk, s string) (rest string, ok bool, err error) { + for len(chunk) > 0 { + if len(s) == 0 { + return + } + switch chunk[0] { + case '[': + // character class + r, n := utf8.DecodeRuneInString(s) + s = s[n:] + chunk = chunk[1:] + // We can't end right after '[', we're expecting at least + // a closing bracket and possibly a caret. + if len(chunk) == 0 { + err = filepath.ErrBadPattern + return + } + // possibly negated + negated := chunk[0] == '^' + if negated { + chunk = chunk[1:] + } + // parse all ranges + match := false + nrange := 0 + for { + if len(chunk) > 0 && chunk[0] == ']' && nrange > 0 { + chunk = chunk[1:] + break + } + var lo, hi rune + if lo, chunk, err = getEsc(chunk); err != nil { + return + } + hi = lo + if chunk[0] == '-' { + if hi, chunk, err = getEsc(chunk[1:]); err != nil { + return + } + } + if lo <= r && r <= hi { + match = true + } + nrange++ + } + if match == negated { + return + } + + case '?': + _, n := utf8.DecodeRuneInString(s) + s = s[n:] + chunk = chunk[1:] + + case '\\': + if runtime.GOOS != "windows" { + chunk = chunk[1:] + if len(chunk) == 0 { + err = filepath.ErrBadPattern + return + } + } + fallthrough + + default: + if chunk[0] != s[0] { + return + } + s = s[1:] + chunk = chunk[1:] + } + } + return s, true, nil +} + +// getEsc gets a possibly-escaped character from chunk, for a character class. +func getEsc(chunk string) (r rune, nchunk string, err error) { + if len(chunk) == 0 || chunk[0] == '-' || chunk[0] == ']' { + err = filepath.ErrBadPattern + return + } + if chunk[0] == '\\' && runtime.GOOS != "windows" { + chunk = chunk[1:] + if len(chunk) == 0 { + err = filepath.ErrBadPattern + return + } + } + r, n := utf8.DecodeRuneInString(chunk) + if r == utf8.RuneError && n == 1 { + err = filepath.ErrBadPattern + } + nchunk = chunk[n:] + if len(nchunk) == 0 { + err = filepath.ErrBadPattern + } + return +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/objfile/doc.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/objfile/doc.go new file mode 100644 index 000000000..a7145160a --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/objfile/doc.go @@ -0,0 +1,2 @@ +// Package objfile implements encoding and decoding of object files. +package objfile diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/objfile/reader.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/objfile/reader.go new file mode 100644 index 000000000..b6b2ca06d --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/objfile/reader.go @@ -0,0 +1,114 @@ +package objfile + +import ( + "compress/zlib" + "errors" + "io" + "strconv" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/packfile" +) + +var ( + ErrClosed = errors.New("objfile: already closed") + ErrHeader = errors.New("objfile: invalid header") + ErrNegativeSize = errors.New("objfile: negative object size") +) + +// Reader reads and decodes compressed objfile data from a provided io.Reader. +// Reader implements io.ReadCloser. Close should be called when finished with +// the Reader. Close will not close the underlying io.Reader. +type Reader struct { + multi io.Reader + zlib io.ReadCloser + hasher plumbing.Hasher +} + +// NewReader returns a new Reader reading from r. +func NewReader(r io.Reader) (*Reader, error) { + zlib, err := zlib.NewReader(r) + if err != nil { + return nil, packfile.ErrZLib.AddDetails(err.Error()) + } + + return &Reader{ + zlib: zlib, + }, nil +} + +// Header reads the type and the size of object, and prepares the reader for read +func (r *Reader) Header() (t plumbing.ObjectType, size int64, err error) { + var raw []byte + raw, err = r.readUntil(' ') + if err != nil { + return + } + + t, err = plumbing.ParseObjectType(string(raw)) + if err != nil { + return + } + + raw, err = r.readUntil(0) + if err != nil { + return + } + + size, err = strconv.ParseInt(string(raw), 10, 64) + if err != nil { + err = ErrHeader + return + } + + defer r.prepareForRead(t, size) + return +} + +// readSlice reads one byte at a time from r until it encounters delim or an +// error. +func (r *Reader) readUntil(delim byte) ([]byte, error) { + var buf [1]byte + value := make([]byte, 0, 16) + for { + if n, err := r.zlib.Read(buf[:]); err != nil && (err != io.EOF || n == 0) { + if err == io.EOF { + return nil, ErrHeader + } + return nil, err + } + + if buf[0] == delim { + return value, nil + } + + value = append(value, buf[0]) + } +} + +func (r *Reader) prepareForRead(t plumbing.ObjectType, size int64) { + r.hasher = plumbing.NewHasher(t, size) + r.multi = io.TeeReader(r.zlib, r.hasher) +} + +// Read reads len(p) bytes into p from the object data stream. It returns +// the number of bytes read (0 <= n <= len(p)) and any error encountered. Even +// if Read returns n < len(p), it may use all of p as scratch space during the +// call. +// +// If Read encounters the end of the data stream it will return err == io.EOF, +// either in the current call if n > 0 or in a subsequent call. +func (r *Reader) Read(p []byte) (n int, err error) { + return r.multi.Read(p) +} + +// Hash returns the hash of the object data stream that has been read so far. +func (r *Reader) Hash() plumbing.Hash { + return r.hasher.Sum() +} + +// Close releases any resources consumed by the Reader. Calling Close does not +// close the wrapped io.Reader originally passed to NewReader. +func (r *Reader) Close() error { + return r.zlib.Close() +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/objfile/writer.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/objfile/writer.go new file mode 100644 index 000000000..2a96a4370 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/objfile/writer.go @@ -0,0 +1,109 @@ +package objfile + +import ( + "compress/zlib" + "errors" + "io" + "strconv" + + "github.com/go-git/go-git/v5/plumbing" +) + +var ( + ErrOverflow = errors.New("objfile: declared data length exceeded (overflow)") +) + +// Writer writes and encodes data in compressed objfile format to a provided +// io.Writer. Close should be called when finished with the Writer. Close will +// not close the underlying io.Writer. +type Writer struct { + raw io.Writer + zlib io.WriteCloser + hasher plumbing.Hasher + multi io.Writer + + closed bool + pending int64 // number of unwritten bytes +} + +// NewWriter returns a new Writer writing to w. +// +// The returned Writer implements io.WriteCloser. Close should be called when +// finished with the Writer. Close will not close the underlying io.Writer. +func NewWriter(w io.Writer) *Writer { + return &Writer{ + raw: w, + zlib: zlib.NewWriter(w), + } +} + +// WriteHeader writes the type and the size and prepares to accept the object's +// contents. If an invalid t is provided, plumbing.ErrInvalidType is returned. If a +// negative size is provided, ErrNegativeSize is returned. +func (w *Writer) WriteHeader(t plumbing.ObjectType, size int64) error { + if !t.Valid() { + return plumbing.ErrInvalidType + } + if size < 0 { + return ErrNegativeSize + } + + b := t.Bytes() + b = append(b, ' ') + b = append(b, []byte(strconv.FormatInt(size, 10))...) + b = append(b, 0) + + defer w.prepareForWrite(t, size) + _, err := w.zlib.Write(b) + + return err +} + +func (w *Writer) prepareForWrite(t plumbing.ObjectType, size int64) { + w.pending = size + + w.hasher = plumbing.NewHasher(t, size) + w.multi = io.MultiWriter(w.zlib, w.hasher) +} + +// Write writes the object's contents. Write returns the error ErrOverflow if +// more than size bytes are written after WriteHeader. +func (w *Writer) Write(p []byte) (n int, err error) { + if w.closed { + return 0, ErrClosed + } + + overwrite := false + if int64(len(p)) > w.pending { + p = p[0:w.pending] + overwrite = true + } + + n, err = w.multi.Write(p) + w.pending -= int64(n) + if err == nil && overwrite { + err = ErrOverflow + return + } + + return +} + +// Hash returns the hash of the object data stream that has been written so far. +// It can be called before or after Close. +func (w *Writer) Hash() plumbing.Hash { + return w.hasher.Sum() // Not yet closed, return hash of data written so far +} + +// Close releases any resources consumed by the Writer. +// +// Calling Close does not close the wrapped io.Writer originally passed to +// NewWriter. +func (w *Writer) Close() error { + if err := w.zlib.Close(); err != nil { + return err + } + + w.closed = true + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/common.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/common.go new file mode 100644 index 000000000..df423ad50 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/common.go @@ -0,0 +1,78 @@ +package packfile + +import ( + "bytes" + "compress/zlib" + "io" + "sync" + + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +var signature = []byte{'P', 'A', 'C', 'K'} + +const ( + // VersionSupported is the packfile version supported by this package + VersionSupported uint32 = 2 + + firstLengthBits = uint8(4) // the first byte into object header has 4 bits to store the length + lengthBits = uint8(7) // subsequent bytes has 7 bits to store the length + maskFirstLength = 15 // 0000 1111 + maskContinue = 0x80 // 1000 0000 + maskLength = uint8(127) // 0111 1111 + maskType = uint8(112) // 0111 0000 +) + +// UpdateObjectStorage updates the storer with the objects in the given +// packfile. +func UpdateObjectStorage(s storer.Storer, packfile io.Reader) error { + if pw, ok := s.(storer.PackfileWriter); ok { + return WritePackfileToObjectStorage(pw, packfile) + } + + p, err := NewParserWithStorage(NewScanner(packfile), s) + if err != nil { + return err + } + + _, err = p.Parse() + return err +} + +// WritePackfileToObjectStorage writes all the packfile objects into the given +// object storage. +func WritePackfileToObjectStorage( + sw storer.PackfileWriter, + packfile io.Reader, +) (err error) { + w, err := sw.PackfileWriter() + if err != nil { + return err + } + + defer ioutil.CheckClose(w, &err) + + var n int64 + n, err = io.Copy(w, packfile) + if err == nil && n == 0 { + return ErrEmptyPackfile + } + + return err +} + +var bufPool = sync.Pool{ + New: func() interface{} { + return bytes.NewBuffer(nil) + }, +} + +var zlibInitBytes = []byte{0x78, 0x9c, 0x01, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01} + +var zlibReaderPool = sync.Pool{ + New: func() interface{} { + r, _ := zlib.NewReader(bytes.NewReader(zlibInitBytes)) + return r + }, +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/delta_index.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/delta_index.go new file mode 100644 index 000000000..07a61120e --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/delta_index.go @@ -0,0 +1,297 @@ +package packfile + +const blksz = 16 +const maxChainLength = 64 + +// deltaIndex is a modified version of JGit's DeltaIndex adapted to our current +// design. +type deltaIndex struct { + table []int + entries []int + mask int +} + +func (idx *deltaIndex) init(buf []byte) { + scanner := newDeltaIndexScanner(buf, len(buf)) + idx.mask = scanner.mask + idx.table = scanner.table + idx.entries = make([]int, countEntries(scanner)+1) + idx.copyEntries(scanner) +} + +// findMatch returns the offset of src where the block starting at tgtOffset +// is and the length of the match. A length of 0 means there was no match. A +// length of -1 means the src length is lower than the blksz and whatever +// other positive length is the length of the match in bytes. +func (idx *deltaIndex) findMatch(src, tgt []byte, tgtOffset int) (srcOffset, l int) { + if len(tgt) < tgtOffset+s { + return 0, len(tgt) - tgtOffset + } + + if len(src) < blksz { + return 0, -1 + } + + if len(tgt) >= tgtOffset+s && len(src) >= blksz { + h := hashBlock(tgt, tgtOffset) + tIdx := h & idx.mask + eIdx := idx.table[tIdx] + if eIdx != 0 { + srcOffset = idx.entries[eIdx] + } else { + return + } + + l = matchLength(src, tgt, tgtOffset, srcOffset) + } + + return +} + +func matchLength(src, tgt []byte, otgt, osrc int) (l int) { + lensrc := len(src) + lentgt := len(tgt) + for (osrc < lensrc && otgt < lentgt) && src[osrc] == tgt[otgt] { + l++ + osrc++ + otgt++ + } + return +} + +func countEntries(scan *deltaIndexScanner) (cnt int) { + // Figure out exactly how many entries we need. As we do the + // enumeration truncate any delta chains longer than what we + // are willing to scan during encode. This keeps the encode + // logic linear in the size of the input rather than quadratic. + for i := 0; i < len(scan.table); i++ { + h := scan.table[i] + if h == 0 { + continue + } + + size := 0 + for { + size++ + if size == maxChainLength { + scan.next[h] = 0 + break + } + h = scan.next[h] + + if h == 0 { + break + } + } + cnt += size + } + + return +} + +func (idx *deltaIndex) copyEntries(scanner *deltaIndexScanner) { + // Rebuild the entries list from the scanner, positioning all + // blocks in the same hash chain next to each other. We can + // then later discard the next list, along with the scanner. + // + next := 1 + for i := 0; i < len(idx.table); i++ { + h := idx.table[i] + if h == 0 { + continue + } + + idx.table[i] = next + for { + idx.entries[next] = scanner.entries[h] + next++ + h = scanner.next[h] + + if h == 0 { + break + } + } + } +} + +type deltaIndexScanner struct { + table []int + entries []int + next []int + mask int + count int +} + +func newDeltaIndexScanner(buf []byte, size int) *deltaIndexScanner { + size -= size % blksz + worstCaseBlockCnt := size / blksz + if worstCaseBlockCnt < 1 { + return new(deltaIndexScanner) + } + + tableSize := tableSize(worstCaseBlockCnt) + scanner := &deltaIndexScanner{ + table: make([]int, tableSize), + mask: tableSize - 1, + entries: make([]int, worstCaseBlockCnt+1), + next: make([]int, worstCaseBlockCnt+1), + } + + scanner.scan(buf, size) + return scanner +} + +// slightly modified version of JGit's DeltaIndexScanner. We store the offset on the entries +// instead of the entries and the key, so we avoid operations to retrieve the offset later, as +// we don't use the key. +// See: https://github.com/eclipse/jgit/blob/005e5feb4ecd08c4e4d141a38b9e7942accb3212/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/DeltaIndexScanner.java +func (s *deltaIndexScanner) scan(buf []byte, end int) { + lastHash := 0 + ptr := end - blksz + + for { + key := hashBlock(buf, ptr) + tIdx := key & s.mask + head := s.table[tIdx] + if head != 0 && lastHash == key { + s.entries[head] = ptr + } else { + s.count++ + eIdx := s.count + s.entries[eIdx] = ptr + s.next[eIdx] = head + s.table[tIdx] = eIdx + } + + lastHash = key + ptr -= blksz + + if 0 > ptr { + break + } + } +} + +func tableSize(worstCaseBlockCnt int) int { + shift := 32 - leadingZeros(uint32(worstCaseBlockCnt)) + sz := 1 << uint(shift-1) + if sz < worstCaseBlockCnt { + sz <<= 1 + } + return sz +} + +// use https://golang.org/pkg/math/bits/#LeadingZeros32 in the future +func leadingZeros(x uint32) (n int) { + if x >= 1<<16 { + x >>= 16 + n = 16 + } + if x >= 1<<8 { + x >>= 8 + n += 8 + } + n += int(len8tab[x]) + return 32 - n +} + +var len8tab = [256]uint8{ + 0x00, 0x01, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +} + +func hashBlock(raw []byte, ptr int) int { + // The first 4 steps collapse out into a 4 byte big-endian decode, + // with a larger right shift as we combined shift lefts together. + // + hash := ((uint32(raw[ptr]) & 0xff) << 24) | + ((uint32(raw[ptr+1]) & 0xff) << 16) | + ((uint32(raw[ptr+2]) & 0xff) << 8) | + (uint32(raw[ptr+3]) & 0xff) + hash ^= T[hash>>31] + + hash = ((hash << 8) | (uint32(raw[ptr+4]) & 0xff)) ^ T[hash>>23] + hash = ((hash << 8) | (uint32(raw[ptr+5]) & 0xff)) ^ T[hash>>23] + hash = ((hash << 8) | (uint32(raw[ptr+6]) & 0xff)) ^ T[hash>>23] + hash = ((hash << 8) | (uint32(raw[ptr+7]) & 0xff)) ^ T[hash>>23] + + hash = ((hash << 8) | (uint32(raw[ptr+8]) & 0xff)) ^ T[hash>>23] + hash = ((hash << 8) | (uint32(raw[ptr+9]) & 0xff)) ^ T[hash>>23] + hash = ((hash << 8) | (uint32(raw[ptr+10]) & 0xff)) ^ T[hash>>23] + hash = ((hash << 8) | (uint32(raw[ptr+11]) & 0xff)) ^ T[hash>>23] + + hash = ((hash << 8) | (uint32(raw[ptr+12]) & 0xff)) ^ T[hash>>23] + hash = ((hash << 8) | (uint32(raw[ptr+13]) & 0xff)) ^ T[hash>>23] + hash = ((hash << 8) | (uint32(raw[ptr+14]) & 0xff)) ^ T[hash>>23] + hash = ((hash << 8) | (uint32(raw[ptr+15]) & 0xff)) ^ T[hash>>23] + + return int(hash) +} + +var T = []uint32{0x00000000, 0xd4c6b32d, 0x7d4bd577, + 0xa98d665a, 0x2e5119c3, 0xfa97aaee, 0x531accb4, 0x87dc7f99, + 0x5ca23386, 0x886480ab, 0x21e9e6f1, 0xf52f55dc, 0x72f32a45, + 0xa6359968, 0x0fb8ff32, 0xdb7e4c1f, 0x6d82d421, 0xb944670c, + 0x10c90156, 0xc40fb27b, 0x43d3cde2, 0x97157ecf, 0x3e981895, + 0xea5eabb8, 0x3120e7a7, 0xe5e6548a, 0x4c6b32d0, 0x98ad81fd, + 0x1f71fe64, 0xcbb74d49, 0x623a2b13, 0xb6fc983e, 0x0fc31b6f, + 0xdb05a842, 0x7288ce18, 0xa64e7d35, 0x219202ac, 0xf554b181, + 0x5cd9d7db, 0x881f64f6, 0x536128e9, 0x87a79bc4, 0x2e2afd9e, + 0xfaec4eb3, 0x7d30312a, 0xa9f68207, 0x007be45d, 0xd4bd5770, + 0x6241cf4e, 0xb6877c63, 0x1f0a1a39, 0xcbcca914, 0x4c10d68d, + 0x98d665a0, 0x315b03fa, 0xe59db0d7, 0x3ee3fcc8, 0xea254fe5, + 0x43a829bf, 0x976e9a92, 0x10b2e50b, 0xc4745626, 0x6df9307c, + 0xb93f8351, 0x1f8636de, 0xcb4085f3, 0x62cde3a9, 0xb60b5084, + 0x31d72f1d, 0xe5119c30, 0x4c9cfa6a, 0x985a4947, 0x43240558, + 0x97e2b675, 0x3e6fd02f, 0xeaa96302, 0x6d751c9b, 0xb9b3afb6, + 0x103ec9ec, 0xc4f87ac1, 0x7204e2ff, 0xa6c251d2, 0x0f4f3788, + 0xdb8984a5, 0x5c55fb3c, 0x88934811, 0x211e2e4b, 0xf5d89d66, + 0x2ea6d179, 0xfa606254, 0x53ed040e, 0x872bb723, 0x00f7c8ba, + 0xd4317b97, 0x7dbc1dcd, 0xa97aaee0, 0x10452db1, 0xc4839e9c, + 0x6d0ef8c6, 0xb9c84beb, 0x3e143472, 0xead2875f, 0x435fe105, + 0x97995228, 0x4ce71e37, 0x9821ad1a, 0x31accb40, 0xe56a786d, + 0x62b607f4, 0xb670b4d9, 0x1ffdd283, 0xcb3b61ae, 0x7dc7f990, + 0xa9014abd, 0x008c2ce7, 0xd44a9fca, 0x5396e053, 0x8750537e, + 0x2edd3524, 0xfa1b8609, 0x2165ca16, 0xf5a3793b, 0x5c2e1f61, + 0x88e8ac4c, 0x0f34d3d5, 0xdbf260f8, 0x727f06a2, 0xa6b9b58f, + 0x3f0c6dbc, 0xebcade91, 0x4247b8cb, 0x96810be6, 0x115d747f, + 0xc59bc752, 0x6c16a108, 0xb8d01225, 0x63ae5e3a, 0xb768ed17, + 0x1ee58b4d, 0xca233860, 0x4dff47f9, 0x9939f4d4, 0x30b4928e, + 0xe47221a3, 0x528eb99d, 0x86480ab0, 0x2fc56cea, 0xfb03dfc7, + 0x7cdfa05e, 0xa8191373, 0x01947529, 0xd552c604, 0x0e2c8a1b, + 0xdaea3936, 0x73675f6c, 0xa7a1ec41, 0x207d93d8, 0xf4bb20f5, + 0x5d3646af, 0x89f0f582, 0x30cf76d3, 0xe409c5fe, 0x4d84a3a4, + 0x99421089, 0x1e9e6f10, 0xca58dc3d, 0x63d5ba67, 0xb713094a, + 0x6c6d4555, 0xb8abf678, 0x11269022, 0xc5e0230f, 0x423c5c96, + 0x96faefbb, 0x3f7789e1, 0xebb13acc, 0x5d4da2f2, 0x898b11df, + 0x20067785, 0xf4c0c4a8, 0x731cbb31, 0xa7da081c, 0x0e576e46, + 0xda91dd6b, 0x01ef9174, 0xd5292259, 0x7ca44403, 0xa862f72e, + 0x2fbe88b7, 0xfb783b9a, 0x52f55dc0, 0x8633eeed, 0x208a5b62, + 0xf44ce84f, 0x5dc18e15, 0x89073d38, 0x0edb42a1, 0xda1df18c, + 0x739097d6, 0xa75624fb, 0x7c2868e4, 0xa8eedbc9, 0x0163bd93, + 0xd5a50ebe, 0x52797127, 0x86bfc20a, 0x2f32a450, 0xfbf4177d, + 0x4d088f43, 0x99ce3c6e, 0x30435a34, 0xe485e919, 0x63599680, + 0xb79f25ad, 0x1e1243f7, 0xcad4f0da, 0x11aabcc5, 0xc56c0fe8, + 0x6ce169b2, 0xb827da9f, 0x3ffba506, 0xeb3d162b, 0x42b07071, + 0x9676c35c, 0x2f49400d, 0xfb8ff320, 0x5202957a, 0x86c42657, + 0x011859ce, 0xd5deeae3, 0x7c538cb9, 0xa8953f94, 0x73eb738b, + 0xa72dc0a6, 0x0ea0a6fc, 0xda6615d1, 0x5dba6a48, 0x897cd965, + 0x20f1bf3f, 0xf4370c12, 0x42cb942c, 0x960d2701, 0x3f80415b, + 0xeb46f276, 0x6c9a8def, 0xb85c3ec2, 0x11d15898, 0xc517ebb5, + 0x1e69a7aa, 0xcaaf1487, 0x632272dd, 0xb7e4c1f0, 0x3038be69, + 0xe4fe0d44, 0x4d736b1e, 0x99b5d833, +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/delta_selector.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/delta_selector.go new file mode 100644 index 000000000..4b60ff394 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/delta_selector.go @@ -0,0 +1,369 @@ +package packfile + +import ( + "sort" + "sync" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/storer" +) + +const ( + // deltas based on deltas, how many steps we can do. + // 50 is the default value used in JGit + maxDepth = int64(50) +) + +// applyDelta is the set of object types that we should apply deltas +var applyDelta = map[plumbing.ObjectType]bool{ + plumbing.BlobObject: true, + plumbing.TreeObject: true, +} + +type deltaSelector struct { + storer storer.EncodedObjectStorer +} + +func newDeltaSelector(s storer.EncodedObjectStorer) *deltaSelector { + return &deltaSelector{s} +} + +// ObjectsToPack creates a list of ObjectToPack from the hashes +// provided, creating deltas if it's suitable, using an specific +// internal logic. `packWindow` specifies the size of the sliding +// window used to compare objects for delta compression; 0 turns off +// delta compression entirely. +func (dw *deltaSelector) ObjectsToPack( + hashes []plumbing.Hash, + packWindow uint, +) ([]*ObjectToPack, error) { + otp, err := dw.objectsToPack(hashes, packWindow) + if err != nil { + return nil, err + } + + if packWindow == 0 { + return otp, nil + } + + dw.sort(otp) + + var objectGroups [][]*ObjectToPack + var prev *ObjectToPack + i := -1 + for _, obj := range otp { + if prev == nil || prev.Type() != obj.Type() { + objectGroups = append(objectGroups, []*ObjectToPack{obj}) + i++ + prev = obj + } else { + objectGroups[i] = append(objectGroups[i], obj) + } + } + + var wg sync.WaitGroup + var once sync.Once + for _, objs := range objectGroups { + objs := objs + wg.Add(1) + go func() { + if walkErr := dw.walk(objs, packWindow); walkErr != nil { + once.Do(func() { + err = walkErr + }) + } + wg.Done() + }() + } + wg.Wait() + + if err != nil { + return nil, err + } + + return otp, nil +} + +func (dw *deltaSelector) objectsToPack( + hashes []plumbing.Hash, + packWindow uint, +) ([]*ObjectToPack, error) { + var objectsToPack []*ObjectToPack + for _, h := range hashes { + var o plumbing.EncodedObject + var err error + if packWindow == 0 { + o, err = dw.encodedObject(h) + } else { + o, err = dw.encodedDeltaObject(h) + } + if err != nil { + return nil, err + } + + otp := newObjectToPack(o) + if _, ok := o.(plumbing.DeltaObject); ok { + otp.CleanOriginal() + } + + objectsToPack = append(objectsToPack, otp) + } + + if packWindow == 0 { + return objectsToPack, nil + } + + if err := dw.fixAndBreakChains(objectsToPack); err != nil { + return nil, err + } + + return objectsToPack, nil +} + +func (dw *deltaSelector) encodedDeltaObject(h plumbing.Hash) (plumbing.EncodedObject, error) { + edos, ok := dw.storer.(storer.DeltaObjectStorer) + if !ok { + return dw.encodedObject(h) + } + + return edos.DeltaObject(plumbing.AnyObject, h) +} + +func (dw *deltaSelector) encodedObject(h plumbing.Hash) (plumbing.EncodedObject, error) { + return dw.storer.EncodedObject(plumbing.AnyObject, h) +} + +func (dw *deltaSelector) fixAndBreakChains(objectsToPack []*ObjectToPack) error { + m := make(map[plumbing.Hash]*ObjectToPack, len(objectsToPack)) + for _, otp := range objectsToPack { + m[otp.Hash()] = otp + } + + for _, otp := range objectsToPack { + if err := dw.fixAndBreakChainsOne(m, otp); err != nil { + return err + } + } + + return nil +} + +func (dw *deltaSelector) fixAndBreakChainsOne(objectsToPack map[plumbing.Hash]*ObjectToPack, otp *ObjectToPack) error { + if !otp.Object.Type().IsDelta() { + return nil + } + + // Initial ObjectToPack instances might have a delta assigned to Object + // but no actual base initially. Once Base is assigned to a delta, it means + // we already fixed it. + if otp.Base != nil { + return nil + } + + do, ok := otp.Object.(plumbing.DeltaObject) + if !ok { + // if this is not a DeltaObject, then we cannot retrieve its base, + // so we have to break the delta chain here. + return dw.undeltify(otp) + } + + base, ok := objectsToPack[do.BaseHash()] + if !ok { + // The base of the delta is not in our list of objects to pack, so + // we break the chain. + return dw.undeltify(otp) + } + + if err := dw.fixAndBreakChainsOne(objectsToPack, base); err != nil { + return err + } + + otp.SetDelta(base, otp.Object) + return nil +} + +func (dw *deltaSelector) restoreOriginal(otp *ObjectToPack) error { + if otp.Original != nil { + return nil + } + + if !otp.Object.Type().IsDelta() { + return nil + } + + obj, err := dw.encodedObject(otp.Hash()) + if err != nil { + return err + } + + otp.SetOriginal(obj) + + return nil +} + +// undeltify undeltifies an *ObjectToPack by retrieving the original object from +// the storer and resetting it. +func (dw *deltaSelector) undeltify(otp *ObjectToPack) error { + if err := dw.restoreOriginal(otp); err != nil { + return err + } + + otp.Object = otp.Original + otp.Depth = 0 + return nil +} + +func (dw *deltaSelector) sort(objectsToPack []*ObjectToPack) { + sort.Sort(byTypeAndSize(objectsToPack)) +} + +func (dw *deltaSelector) walk( + objectsToPack []*ObjectToPack, + packWindow uint, +) error { + indexMap := make(map[plumbing.Hash]*deltaIndex) + for i := 0; i < len(objectsToPack); i++ { + // Clean up the index map and reconstructed delta objects for anything + // outside our pack window, to save memory. + if i > int(packWindow) { + obj := objectsToPack[i-int(packWindow)] + + delete(indexMap, obj.Hash()) + + if obj.IsDelta() { + obj.SaveOriginalMetadata() + obj.CleanOriginal() + } + } + + target := objectsToPack[i] + + // If we already have a delta, we don't try to find a new one for this + // object. This happens when a delta is set to be reused from an existing + // packfile. + if target.IsDelta() { + continue + } + + // We only want to create deltas from specific types. + if !applyDelta[target.Type()] { + continue + } + + for j := i - 1; j >= 0 && i-j < int(packWindow); j-- { + base := objectsToPack[j] + // Objects must use only the same type as their delta base. + // Since objectsToPack is sorted by type and size, once we find + // a different type, we know we won't find more of them. + if base.Type() != target.Type() { + break + } + + if err := dw.tryToDeltify(indexMap, base, target); err != nil { + return err + } + } + } + + return nil +} + +func (dw *deltaSelector) tryToDeltify(indexMap map[plumbing.Hash]*deltaIndex, base, target *ObjectToPack) error { + // Original object might not be present if we're reusing a delta, so we + // ensure it is restored. + if err := dw.restoreOriginal(target); err != nil { + return err + } + + if err := dw.restoreOriginal(base); err != nil { + return err + } + + // If the sizes are radically different, this is a bad pairing. + if target.Size() < base.Size()>>4 { + return nil + } + + msz := dw.deltaSizeLimit( + target.Object.Size(), + base.Depth, + target.Depth, + target.IsDelta(), + ) + + // Nearly impossible to fit useful delta. + if msz <= 8 { + return nil + } + + // If we have to insert a lot to make this work, find another. + if base.Size()-target.Size() > msz { + return nil + } + + if _, ok := indexMap[base.Hash()]; !ok { + indexMap[base.Hash()] = new(deltaIndex) + } + + // Now we can generate the delta using originals + delta, err := getDelta(indexMap[base.Hash()], base.Original, target.Original) + if err != nil { + return err + } + + // if delta better than target + if delta.Size() < msz { + target.SetDelta(base, delta) + } + + return nil +} + +func (dw *deltaSelector) deltaSizeLimit(targetSize int64, baseDepth int, + targetDepth int, targetDelta bool) int64 { + if !targetDelta { + // Any delta should be no more than 50% of the original size + // (for text files deflate of whole form should shrink 50%). + n := targetSize >> 1 + + // Evenly distribute delta size limits over allowed depth. + // If src is non-delta (depth = 0), delta <= 50% of original. + // If src is almost at limit (9/10), delta <= 10% of original. + return n * (maxDepth - int64(baseDepth)) / maxDepth + } + + // With a delta base chosen any new delta must be "better". + // Retain the distribution described above. + d := int64(targetDepth) + n := targetSize + + // If target depth is bigger than maxDepth, this delta is not suitable to be used. + if d >= maxDepth { + return 0 + } + + // If src is whole (depth=0) and base is near limit (depth=9/10) + // any delta using src can be 10x larger and still be better. + // + // If src is near limit (depth=9/10) and base is whole (depth=0) + // a new delta dependent on src must be 1/10th the size. + return n * (maxDepth - int64(baseDepth)) / (maxDepth - d) +} + +type byTypeAndSize []*ObjectToPack + +func (a byTypeAndSize) Len() int { return len(a) } + +func (a byTypeAndSize) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +func (a byTypeAndSize) Less(i, j int) bool { + if a[i].Type() < a[j].Type() { + return false + } + + if a[i].Type() > a[j].Type() { + return true + } + + return a[i].Size() > a[j].Size() +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/diff_delta.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/diff_delta.go new file mode 100644 index 000000000..1951b34ef --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/diff_delta.go @@ -0,0 +1,204 @@ +package packfile + +import ( + "bytes" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +// See https://github.com/jelmer/dulwich/blob/master/dulwich/pack.py and +// https://github.com/tarruda/node-git-core/blob/master/src/js/delta.js +// for more info + +const ( + // Standard chunk size used to generate fingerprints + s = 16 + + // https://github.com/git/git/blob/f7466e94375b3be27f229c78873f0acf8301c0a5/diff-delta.c#L428 + // Max size of a copy operation (64KB) + maxCopySize = 64 * 1024 +) + +// GetDelta returns an EncodedObject of type OFSDeltaObject. Base and Target object, +// will be loaded into memory to be able to create the delta object. +// To generate target again, you will need the obtained object and "base" one. +// Error will be returned if base or target object cannot be read. +func GetDelta(base, target plumbing.EncodedObject) (plumbing.EncodedObject, error) { + return getDelta(new(deltaIndex), base, target) +} + +func getDelta(index *deltaIndex, base, target plumbing.EncodedObject) (o plumbing.EncodedObject, err error) { + br, err := base.Reader() + if err != nil { + return nil, err + } + + defer ioutil.CheckClose(br, &err) + + tr, err := target.Reader() + if err != nil { + return nil, err + } + + defer ioutil.CheckClose(tr, &err) + + bb := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(bb) + bb.Reset() + + _, err = bb.ReadFrom(br) + if err != nil { + return nil, err + } + + tb := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(tb) + tb.Reset() + + _, err = tb.ReadFrom(tr) + if err != nil { + return nil, err + } + + db := diffDelta(index, bb.Bytes(), tb.Bytes()) + delta := &plumbing.MemoryObject{} + _, err = delta.Write(db) + if err != nil { + return nil, err + } + + delta.SetSize(int64(len(db))) + delta.SetType(plumbing.OFSDeltaObject) + + return delta, nil +} + +// DiffDelta returns the delta that transforms src into tgt. +func DiffDelta(src, tgt []byte) []byte { + return diffDelta(new(deltaIndex), src, tgt) +} + +func diffDelta(index *deltaIndex, src []byte, tgt []byte) []byte { + buf := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(buf) + buf.Reset() + buf.Write(deltaEncodeSize(len(src))) + buf.Write(deltaEncodeSize(len(tgt))) + + if len(index.entries) == 0 { + index.init(src) + } + + ibuf := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(ibuf) + ibuf.Reset() + for i := 0; i < len(tgt); i++ { + offset, l := index.findMatch(src, tgt, i) + + if l == 0 { + // couldn't find a match, just write the current byte and continue + ibuf.WriteByte(tgt[i]) + } else if l < 0 { + // src is less than blksz, copy the rest of the target to avoid + // calls to findMatch + for ; i < len(tgt); i++ { + ibuf.WriteByte(tgt[i]) + } + } else if l < s { + // remaining target is less than blksz, copy what's left of it + // and avoid calls to findMatch + for j := i; j < i+l; j++ { + ibuf.WriteByte(tgt[j]) + } + i += l - 1 + } else { + encodeInsertOperation(ibuf, buf) + + rl := l + aOffset := offset + for rl > 0 { + if rl < maxCopySize { + buf.Write(encodeCopyOperation(aOffset, rl)) + break + } + + buf.Write(encodeCopyOperation(aOffset, maxCopySize)) + rl -= maxCopySize + aOffset += maxCopySize + } + + i += l - 1 + } + } + + encodeInsertOperation(ibuf, buf) + + // buf.Bytes() is only valid until the next modifying operation on the buffer. Copy it. + return append([]byte{}, buf.Bytes()...) +} + +func encodeInsertOperation(ibuf, buf *bytes.Buffer) { + if ibuf.Len() == 0 { + return + } + + b := ibuf.Bytes() + s := ibuf.Len() + o := 0 + for { + if s <= 127 { + break + } + buf.WriteByte(byte(127)) + buf.Write(b[o : o+127]) + s -= 127 + o += 127 + } + buf.WriteByte(byte(s)) + buf.Write(b[o : o+s]) + + ibuf.Reset() +} + +func deltaEncodeSize(size int) []byte { + var ret []byte + c := size & 0x7f + size >>= 7 + for { + if size == 0 { + break + } + + ret = append(ret, byte(c|0x80)) + c = size & 0x7f + size >>= 7 + } + ret = append(ret, byte(c)) + + return ret +} + +func encodeCopyOperation(offset, length int) []byte { + code := 0x80 + var opcodes []byte + + var i uint + for i = 0; i < 4; i++ { + f := 0xff << (i * 8) + if offset&f != 0 { + opcodes = append(opcodes, byte(offset&f>>(i*8))) + code |= 0x01 << i + } + } + + for i = 0; i < 3; i++ { + f := 0xff << (i * 8) + if length&f != 0 { + opcodes = append(opcodes, byte(length&f>>(i*8))) + code |= 0x10 << i + } + } + + return append([]byte{byte(code)}, opcodes...) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/doc.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/doc.go new file mode 100644 index 000000000..2882a7f37 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/doc.go @@ -0,0 +1,39 @@ +// Package packfile implements encoding and decoding of packfile format. +// +// == pack-*.pack files have the following format: +// +// - A header appears at the beginning and consists of the following: +// +// 4-byte signature: +// The signature is: {'P', 'A', 'C', 'K'} +// +// 4-byte version number (network byte order): +// GIT currently accepts version number 2 or 3 but +// generates version 2 only. +// +// 4-byte number of objects contained in the pack (network byte order) +// +// Observation: we cannot have more than 4G versions ;-) and +// more than 4G objects in a pack. +// +// - The header is followed by number of object entries, each of +// which looks like this: +// +// (undeltified representation) +// n-byte type and length (3-bit type, (n-1)*7+4-bit length) +// compressed data +// +// (deltified representation) +// n-byte type and length (3-bit type, (n-1)*7+4-bit length) +// 20-byte base object name +// compressed delta data +// +// Observation: length of each object is encoded in a variable +// length format and is not constrained to 32-bit or anything. +// +// - The trailer records 20-byte SHA1 checksum of all of the above. +// +// +// Source: +// https://www.kernel.org/pub/software/scm/git/docs/v1.7.5/technical/pack-protocol.txt +package packfile diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/encoder.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/encoder.go new file mode 100644 index 000000000..5501f8861 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/encoder.go @@ -0,0 +1,225 @@ +package packfile + +import ( + "compress/zlib" + "crypto/sha1" + "fmt" + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/utils/binary" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +// Encoder gets the data from the storage and write it into the writer in PACK +// format +type Encoder struct { + selector *deltaSelector + w *offsetWriter + zw *zlib.Writer + hasher plumbing.Hasher + + useRefDeltas bool +} + +// NewEncoder creates a new packfile encoder using a specific Writer and +// EncodedObjectStorer. By default deltas used to generate the packfile will be +// OFSDeltaObject. To use Reference deltas, set useRefDeltas to true. +func NewEncoder(w io.Writer, s storer.EncodedObjectStorer, useRefDeltas bool) *Encoder { + h := plumbing.Hasher{ + Hash: sha1.New(), + } + mw := io.MultiWriter(w, h) + ow := newOffsetWriter(mw) + zw := zlib.NewWriter(mw) + return &Encoder{ + selector: newDeltaSelector(s), + w: ow, + zw: zw, + hasher: h, + useRefDeltas: useRefDeltas, + } +} + +// Encode creates a packfile containing all the objects referenced in +// hashes and writes it to the writer in the Encoder. `packWindow` +// specifies the size of the sliding window used to compare objects +// for delta compression; 0 turns off delta compression entirely. +func (e *Encoder) Encode( + hashes []plumbing.Hash, + packWindow uint, +) (plumbing.Hash, error) { + objects, err := e.selector.ObjectsToPack(hashes, packWindow) + if err != nil { + return plumbing.ZeroHash, err + } + + return e.encode(objects) +} + +func (e *Encoder) encode(objects []*ObjectToPack) (plumbing.Hash, error) { + if err := e.head(len(objects)); err != nil { + return plumbing.ZeroHash, err + } + + for _, o := range objects { + if err := e.entry(o); err != nil { + return plumbing.ZeroHash, err + } + } + + return e.footer() +} + +func (e *Encoder) head(numEntries int) error { + return binary.Write( + e.w, + signature, + int32(VersionSupported), + int32(numEntries), + ) +} + +func (e *Encoder) entry(o *ObjectToPack) (err error) { + if o.WantWrite() { + // A cycle exists in this delta chain. This should only occur if a + // selected object representation disappeared during writing + // (for example due to a concurrent repack) and a different base + // was chosen, forcing a cycle. Select something other than a + // delta, and write this object. + e.selector.restoreOriginal(o) + o.BackToOriginal() + } + + if o.IsWritten() { + return nil + } + + o.MarkWantWrite() + + if err := e.writeBaseIfDelta(o); err != nil { + return err + } + + // We need to check if we already write that object due a cyclic delta chain + if o.IsWritten() { + return nil + } + + o.Offset = e.w.Offset() + + if o.IsDelta() { + if err := e.writeDeltaHeader(o); err != nil { + return err + } + } else { + if err := e.entryHead(o.Type(), o.Size()); err != nil { + return err + } + } + + e.zw.Reset(e.w) + + defer ioutil.CheckClose(e.zw, &err) + + or, err := o.Object.Reader() + if err != nil { + return err + } + + defer ioutil.CheckClose(or, &err) + + _, err = io.Copy(e.zw, or) + if err != nil { + return err + } + + return nil +} + +func (e *Encoder) writeBaseIfDelta(o *ObjectToPack) error { + if o.IsDelta() && !o.Base.IsWritten() { + // We must write base first + return e.entry(o.Base) + } + + return nil +} + +func (e *Encoder) writeDeltaHeader(o *ObjectToPack) error { + // Write offset deltas by default + t := plumbing.OFSDeltaObject + if e.useRefDeltas { + t = plumbing.REFDeltaObject + } + + if err := e.entryHead(t, o.Object.Size()); err != nil { + return err + } + + if e.useRefDeltas { + return e.writeRefDeltaHeader(o.Base.Hash()) + } else { + return e.writeOfsDeltaHeader(o) + } +} + +func (e *Encoder) writeRefDeltaHeader(base plumbing.Hash) error { + return binary.Write(e.w, base) +} + +func (e *Encoder) writeOfsDeltaHeader(o *ObjectToPack) error { + // for OFS_DELTA, offset of the base is interpreted as negative offset + // relative to the type-byte of the header of the ofs-delta entry. + relativeOffset := o.Offset - o.Base.Offset + if relativeOffset <= 0 { + return fmt.Errorf("bad offset for OFS_DELTA entry: %d", relativeOffset) + } + + return binary.WriteVariableWidthInt(e.w, relativeOffset) +} + +func (e *Encoder) entryHead(typeNum plumbing.ObjectType, size int64) error { + t := int64(typeNum) + header := []byte{} + c := (t << firstLengthBits) | (size & maskFirstLength) + size >>= firstLengthBits + for { + if size == 0 { + break + } + header = append(header, byte(c|maskContinue)) + c = size & int64(maskLength) + size >>= lengthBits + } + + header = append(header, byte(c)) + _, err := e.w.Write(header) + + return err +} + +func (e *Encoder) footer() (plumbing.Hash, error) { + h := e.hasher.Sum() + return h, binary.Write(e.w, h) +} + +type offsetWriter struct { + w io.Writer + offset int64 +} + +func newOffsetWriter(w io.Writer) *offsetWriter { + return &offsetWriter{w: w} +} + +func (ow *offsetWriter) Write(p []byte) (n int, err error) { + n, err = ow.w.Write(p) + ow.offset += int64(n) + return n, err +} + +func (ow *offsetWriter) Offset() int64 { + return ow.offset +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/error.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/error.go new file mode 100644 index 000000000..c0b916331 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/error.go @@ -0,0 +1,30 @@ +package packfile + +import "fmt" + +// Error specifies errors returned during packfile parsing. +type Error struct { + reason, details string +} + +// NewError returns a new error. +func NewError(reason string) *Error { + return &Error{reason: reason} +} + +// Error returns a text representation of the error. +func (e *Error) Error() string { + if e.details == "" { + return e.reason + } + + return fmt.Sprintf("%s: %s", e.reason, e.details) +} + +// AddDetails adds details to an error, with additional text. +func (e *Error) AddDetails(format string, args ...interface{}) *Error { + return &Error{ + reason: e.reason, + details: fmt.Sprintf(format, args...), + } +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/fsobject.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/fsobject.go new file mode 100644 index 000000000..c5edaf52e --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/fsobject.go @@ -0,0 +1,116 @@ +package packfile + +import ( + "io" + + billy "github.com/go-git/go-billy/v5" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/cache" + "github.com/go-git/go-git/v5/plumbing/format/idxfile" +) + +// FSObject is an object from the packfile on the filesystem. +type FSObject struct { + hash plumbing.Hash + h *ObjectHeader + offset int64 + size int64 + typ plumbing.ObjectType + index idxfile.Index + fs billy.Filesystem + path string + cache cache.Object +} + +// NewFSObject creates a new filesystem object. +func NewFSObject( + hash plumbing.Hash, + finalType plumbing.ObjectType, + offset int64, + contentSize int64, + index idxfile.Index, + fs billy.Filesystem, + path string, + cache cache.Object, +) *FSObject { + return &FSObject{ + hash: hash, + offset: offset, + size: contentSize, + typ: finalType, + index: index, + fs: fs, + path: path, + cache: cache, + } +} + +// Reader implements the plumbing.EncodedObject interface. +func (o *FSObject) Reader() (io.ReadCloser, error) { + obj, ok := o.cache.Get(o.hash) + if ok && obj != o { + reader, err := obj.Reader() + if err != nil { + return nil, err + } + + return reader, nil + } + + f, err := o.fs.Open(o.path) + if err != nil { + return nil, err + } + + p := NewPackfileWithCache(o.index, nil, f, o.cache) + r, err := p.getObjectContent(o.offset) + if err != nil { + _ = f.Close() + return nil, err + } + + if err := f.Close(); err != nil { + return nil, err + } + + return r, nil +} + +// SetSize implements the plumbing.EncodedObject interface. This method +// is a noop. +func (o *FSObject) SetSize(int64) {} + +// SetType implements the plumbing.EncodedObject interface. This method is +// a noop. +func (o *FSObject) SetType(plumbing.ObjectType) {} + +// Hash implements the plumbing.EncodedObject interface. +func (o *FSObject) Hash() plumbing.Hash { return o.hash } + +// Size implements the plumbing.EncodedObject interface. +func (o *FSObject) Size() int64 { return o.size } + +// Type implements the plumbing.EncodedObject interface. +func (o *FSObject) Type() plumbing.ObjectType { + return o.typ +} + +// Writer implements the plumbing.EncodedObject interface. This method always +// returns a nil writer. +func (o *FSObject) Writer() (io.WriteCloser, error) { + return nil, nil +} + +type objectReader struct { + io.ReadCloser + f billy.File +} + +func (r *objectReader) Close() error { + if err := r.ReadCloser.Close(); err != nil { + _ = r.f.Close() + return err + } + + return r.f.Close() +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/object_pack.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/object_pack.go new file mode 100644 index 000000000..8ce29ef8b --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/object_pack.go @@ -0,0 +1,164 @@ +package packfile + +import ( + "github.com/go-git/go-git/v5/plumbing" +) + +// ObjectToPack is a representation of an object that is going to be into a +// pack file. +type ObjectToPack struct { + // The main object to pack, it could be any object, including deltas + Object plumbing.EncodedObject + // Base is the object that a delta is based on (it could be also another delta). + // If the main object is not a delta, Base will be null + Base *ObjectToPack + // Original is the object that we can generate applying the delta to + // Base, or the same object as Object in the case of a non-delta + // object. + Original plumbing.EncodedObject + // Depth is the amount of deltas needed to resolve to obtain Original + // (delta based on delta based on ...) + Depth int + + // offset in pack when object has been already written, or 0 if it + // has not been written yet + Offset int64 + + // Information from the original object + resolvedOriginal bool + originalType plumbing.ObjectType + originalSize int64 + originalHash plumbing.Hash +} + +// newObjectToPack creates a correct ObjectToPack based on a non-delta object +func newObjectToPack(o plumbing.EncodedObject) *ObjectToPack { + return &ObjectToPack{ + Object: o, + Original: o, + } +} + +// newDeltaObjectToPack creates a correct ObjectToPack for a delta object, based on +// his base (could be another delta), the delta target (in this case called original), +// and the delta Object itself +func newDeltaObjectToPack(base *ObjectToPack, original, delta plumbing.EncodedObject) *ObjectToPack { + return &ObjectToPack{ + Object: delta, + Base: base, + Original: original, + Depth: base.Depth + 1, + } +} + +// BackToOriginal converts that ObjectToPack to a non-deltified object if it was one +func (o *ObjectToPack) BackToOriginal() { + if o.IsDelta() && o.Original != nil { + o.Object = o.Original + o.Base = nil + o.Depth = 0 + } +} + +// IsWritten returns if that ObjectToPack was +// already written into the packfile or not +func (o *ObjectToPack) IsWritten() bool { + return o.Offset > 1 +} + +// MarkWantWrite marks this ObjectToPack as WantWrite +// to avoid delta chain loops +func (o *ObjectToPack) MarkWantWrite() { + o.Offset = 1 +} + +// WantWrite checks if this ObjectToPack was marked as WantWrite before +func (o *ObjectToPack) WantWrite() bool { + return o.Offset == 1 +} + +// SetOriginal sets both Original and saves size, type and hash. If object +// is nil Original is set but previous resolved values are kept +func (o *ObjectToPack) SetOriginal(obj plumbing.EncodedObject) { + o.Original = obj + o.SaveOriginalMetadata() +} + +// SaveOriginalMetadata saves size, type and hash of Original object +func (o *ObjectToPack) SaveOriginalMetadata() { + if o.Original != nil { + o.originalSize = o.Original.Size() + o.originalType = o.Original.Type() + o.originalHash = o.Original.Hash() + o.resolvedOriginal = true + } +} + +// CleanOriginal sets Original to nil +func (o *ObjectToPack) CleanOriginal() { + o.Original = nil +} + +func (o *ObjectToPack) Type() plumbing.ObjectType { + if o.Original != nil { + return o.Original.Type() + } + + if o.resolvedOriginal { + return o.originalType + } + + if o.Base != nil { + return o.Base.Type() + } + + if o.Object != nil { + return o.Object.Type() + } + + panic("cannot get type") +} + +func (o *ObjectToPack) Hash() plumbing.Hash { + if o.Original != nil { + return o.Original.Hash() + } + + if o.resolvedOriginal { + return o.originalHash + } + + do, ok := o.Object.(plumbing.DeltaObject) + if ok { + return do.ActualHash() + } + + panic("cannot get hash") +} + +func (o *ObjectToPack) Size() int64 { + if o.Original != nil { + return o.Original.Size() + } + + if o.resolvedOriginal { + return o.originalSize + } + + do, ok := o.Object.(plumbing.DeltaObject) + if ok { + return do.ActualSize() + } + + panic("cannot get ObjectToPack size") +} + +func (o *ObjectToPack) IsDelta() bool { + return o.Base != nil +} + +func (o *ObjectToPack) SetDelta(base *ObjectToPack, delta plumbing.EncodedObject) { + o.Object = delta + o.Base = base + o.Depth = base.Depth + 1 +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/packfile.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/packfile.go new file mode 100644 index 000000000..ddd7f62fc --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/packfile.go @@ -0,0 +1,565 @@ +package packfile + +import ( + "bytes" + "io" + "os" + + billy "github.com/go-git/go-billy/v5" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/cache" + "github.com/go-git/go-git/v5/plumbing/format/idxfile" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +var ( + // ErrInvalidObject is returned by Decode when an invalid object is + // found in the packfile. + ErrInvalidObject = NewError("invalid git object") + // ErrZLib is returned by Decode when there was an error unzipping + // the packfile contents. + ErrZLib = NewError("zlib reading error") +) + +// When reading small objects from packfile it is beneficial to do so at +// once to exploit the buffered I/O. In many cases the objects are so small +// that they were already loaded to memory when the object header was +// loaded from the packfile. Wrapping in FSObject would cause this buffered +// data to be thrown away and then re-read later, with the additional +// seeking causing reloads from disk. Objects smaller than this threshold +// are now always read into memory and stored in cache instead of being +// wrapped in FSObject. +const smallObjectThreshold = 16 * 1024 + +// Packfile allows retrieving information from inside a packfile. +type Packfile struct { + idxfile.Index + fs billy.Filesystem + file billy.File + s *Scanner + deltaBaseCache cache.Object + offsetToType map[int64]plumbing.ObjectType +} + +// NewPackfileWithCache creates a new Packfile with the given object cache. +// If the filesystem is provided, the packfile will return FSObjects, otherwise +// it will return MemoryObjects. +func NewPackfileWithCache( + index idxfile.Index, + fs billy.Filesystem, + file billy.File, + cache cache.Object, +) *Packfile { + s := NewScanner(file) + return &Packfile{ + index, + fs, + file, + s, + cache, + make(map[int64]plumbing.ObjectType), + } +} + +// NewPackfile returns a packfile representation for the given packfile file +// and packfile idx. +// If the filesystem is provided, the packfile will return FSObjects, otherwise +// it will return MemoryObjects. +func NewPackfile(index idxfile.Index, fs billy.Filesystem, file billy.File) *Packfile { + return NewPackfileWithCache(index, fs, file, cache.NewObjectLRUDefault()) +} + +// Get retrieves the encoded object in the packfile with the given hash. +func (p *Packfile) Get(h plumbing.Hash) (plumbing.EncodedObject, error) { + offset, err := p.FindOffset(h) + if err != nil { + return nil, err + } + + return p.objectAtOffset(offset, h) +} + +// GetByOffset retrieves the encoded object from the packfile at the given +// offset. +func (p *Packfile) GetByOffset(o int64) (plumbing.EncodedObject, error) { + hash, err := p.FindHash(o) + if err != nil { + return nil, err + } + + return p.objectAtOffset(o, hash) +} + +// GetSizeByOffset retrieves the size of the encoded object from the +// packfile with the given offset. +func (p *Packfile) GetSizeByOffset(o int64) (size int64, err error) { + if _, err := p.s.SeekFromStart(o); err != nil { + if err == io.EOF || isInvalid(err) { + return 0, plumbing.ErrObjectNotFound + } + + return 0, err + } + + h, err := p.nextObjectHeader() + if err != nil { + return 0, err + } + return p.getObjectSize(h) +} + +func (p *Packfile) objectHeaderAtOffset(offset int64) (*ObjectHeader, error) { + h, err := p.s.SeekObjectHeader(offset) + p.s.pendingObject = nil + return h, err +} + +func (p *Packfile) nextObjectHeader() (*ObjectHeader, error) { + h, err := p.s.NextObjectHeader() + p.s.pendingObject = nil + return h, err +} + +func (p *Packfile) getDeltaObjectSize(buf *bytes.Buffer) int64 { + delta := buf.Bytes() + _, delta = decodeLEB128(delta) // skip src size + sz, _ := decodeLEB128(delta) + return int64(sz) +} + +func (p *Packfile) getObjectSize(h *ObjectHeader) (int64, error) { + switch h.Type { + case plumbing.CommitObject, plumbing.TreeObject, plumbing.BlobObject, plumbing.TagObject: + return h.Length, nil + case plumbing.REFDeltaObject, plumbing.OFSDeltaObject: + buf := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(buf) + buf.Reset() + + if _, _, err := p.s.NextObject(buf); err != nil { + return 0, err + } + + return p.getDeltaObjectSize(buf), nil + default: + return 0, ErrInvalidObject.AddDetails("type %q", h.Type) + } +} + +func (p *Packfile) getObjectType(h *ObjectHeader) (typ plumbing.ObjectType, err error) { + switch h.Type { + case plumbing.CommitObject, plumbing.TreeObject, plumbing.BlobObject, plumbing.TagObject: + return h.Type, nil + case plumbing.REFDeltaObject, plumbing.OFSDeltaObject: + var offset int64 + if h.Type == plumbing.REFDeltaObject { + offset, err = p.FindOffset(h.Reference) + if err != nil { + return + } + } else { + offset = h.OffsetReference + } + + if baseType, ok := p.offsetToType[offset]; ok { + typ = baseType + } else { + h, err = p.objectHeaderAtOffset(offset) + if err != nil { + return + } + + typ, err = p.getObjectType(h) + if err != nil { + return + } + } + default: + err = ErrInvalidObject.AddDetails("type %q", h.Type) + } + + p.offsetToType[h.Offset] = typ + + return +} + +func (p *Packfile) objectAtOffset(offset int64, hash plumbing.Hash) (plumbing.EncodedObject, error) { + if obj, ok := p.cacheGet(hash); ok { + return obj, nil + } + + h, err := p.objectHeaderAtOffset(offset) + if err != nil { + if err == io.EOF || isInvalid(err) { + return nil, plumbing.ErrObjectNotFound + } + return nil, err + } + + return p.getNextObject(h, hash) +} + +func (p *Packfile) getNextObject(h *ObjectHeader, hash plumbing.Hash) (plumbing.EncodedObject, error) { + var err error + + // If we have no filesystem, we will return a MemoryObject instead + // of an FSObject. + if p.fs == nil { + return p.getNextMemoryObject(h) + } + + // If the object is small enough then read it completely into memory now since + // it is already read from disk into buffer anyway. For delta objects we want + // to perform the optimization too, but we have to be careful about applying + // small deltas on big objects. + var size int64 + if h.Length <= smallObjectThreshold { + if h.Type != plumbing.OFSDeltaObject && h.Type != plumbing.REFDeltaObject { + return p.getNextMemoryObject(h) + } + + // For delta objects we read the delta data and apply the small object + // optimization only if the expanded version of the object still meets + // the small object threshold condition. + buf := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(buf) + buf.Reset() + if _, _, err := p.s.NextObject(buf); err != nil { + return nil, err + } + + size = p.getDeltaObjectSize(buf) + if size <= smallObjectThreshold { + var obj = new(plumbing.MemoryObject) + obj.SetSize(size) + if h.Type == plumbing.REFDeltaObject { + err = p.fillREFDeltaObjectContentWithBuffer(obj, h.Reference, buf) + } else { + err = p.fillOFSDeltaObjectContentWithBuffer(obj, h.OffsetReference, buf) + } + return obj, err + } + } else { + size, err = p.getObjectSize(h) + if err != nil { + return nil, err + } + } + + typ, err := p.getObjectType(h) + if err != nil { + return nil, err + } + + p.offsetToType[h.Offset] = typ + + return NewFSObject( + hash, + typ, + h.Offset, + size, + p.Index, + p.fs, + p.file.Name(), + p.deltaBaseCache, + ), nil +} + +func (p *Packfile) getObjectContent(offset int64) (io.ReadCloser, error) { + h, err := p.objectHeaderAtOffset(offset) + if err != nil { + return nil, err + } + + // getObjectContent is called from FSObject, so we have to explicitly + // get memory object here to avoid recursive cycle + obj, err := p.getNextMemoryObject(h) + if err != nil { + return nil, err + } + + return obj.Reader() +} + +func (p *Packfile) getNextMemoryObject(h *ObjectHeader) (plumbing.EncodedObject, error) { + var obj = new(plumbing.MemoryObject) + obj.SetSize(h.Length) + obj.SetType(h.Type) + + var err error + switch h.Type { + case plumbing.CommitObject, plumbing.TreeObject, plumbing.BlobObject, plumbing.TagObject: + err = p.fillRegularObjectContent(obj) + case plumbing.REFDeltaObject: + err = p.fillREFDeltaObjectContent(obj, h.Reference) + case plumbing.OFSDeltaObject: + err = p.fillOFSDeltaObjectContent(obj, h.OffsetReference) + default: + err = ErrInvalidObject.AddDetails("type %q", h.Type) + } + + if err != nil { + return nil, err + } + + p.offsetToType[h.Offset] = obj.Type() + + return obj, nil +} + +func (p *Packfile) fillRegularObjectContent(obj plumbing.EncodedObject) (err error) { + w, err := obj.Writer() + if err != nil { + return err + } + + defer ioutil.CheckClose(w, &err) + + _, _, err = p.s.NextObject(w) + p.cachePut(obj) + + return err +} + +func (p *Packfile) fillREFDeltaObjectContent(obj plumbing.EncodedObject, ref plumbing.Hash) error { + buf := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(buf) + buf.Reset() + _, _, err := p.s.NextObject(buf) + if err != nil { + return err + } + + return p.fillREFDeltaObjectContentWithBuffer(obj, ref, buf) +} + +func (p *Packfile) fillREFDeltaObjectContentWithBuffer(obj plumbing.EncodedObject, ref plumbing.Hash, buf *bytes.Buffer) error { + var err error + + base, ok := p.cacheGet(ref) + if !ok { + base, err = p.Get(ref) + if err != nil { + return err + } + } + + obj.SetType(base.Type()) + err = ApplyDelta(obj, base, buf.Bytes()) + p.cachePut(obj) + + return err +} + +func (p *Packfile) fillOFSDeltaObjectContent(obj plumbing.EncodedObject, offset int64) error { + buf := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(buf) + buf.Reset() + _, _, err := p.s.NextObject(buf) + if err != nil { + return err + } + + return p.fillOFSDeltaObjectContentWithBuffer(obj, offset, buf) +} + +func (p *Packfile) fillOFSDeltaObjectContentWithBuffer(obj plumbing.EncodedObject, offset int64, buf *bytes.Buffer) error { + hash, err := p.FindHash(offset) + if err != nil { + return err + } + + base, err := p.objectAtOffset(offset, hash) + if err != nil { + return err + } + + obj.SetType(base.Type()) + err = ApplyDelta(obj, base, buf.Bytes()) + p.cachePut(obj) + + return err +} + +func (p *Packfile) cacheGet(h plumbing.Hash) (plumbing.EncodedObject, bool) { + if p.deltaBaseCache == nil { + return nil, false + } + + return p.deltaBaseCache.Get(h) +} + +func (p *Packfile) cachePut(obj plumbing.EncodedObject) { + if p.deltaBaseCache == nil { + return + } + + p.deltaBaseCache.Put(obj) +} + +// GetAll returns an iterator with all encoded objects in the packfile. +// The iterator returned is not thread-safe, it should be used in the same +// thread as the Packfile instance. +func (p *Packfile) GetAll() (storer.EncodedObjectIter, error) { + return p.GetByType(plumbing.AnyObject) +} + +// GetByType returns all the objects of the given type. +func (p *Packfile) GetByType(typ plumbing.ObjectType) (storer.EncodedObjectIter, error) { + switch typ { + case plumbing.AnyObject, + plumbing.BlobObject, + plumbing.TreeObject, + plumbing.CommitObject, + plumbing.TagObject: + entries, err := p.EntriesByOffset() + if err != nil { + return nil, err + } + + return &objectIter{ + // Easiest way to provide an object decoder is just to pass a Packfile + // instance. To not mess with the seeks, it's a new instance with a + // different scanner but the same cache and offset to hash map for + // reusing as much cache as possible. + p: p, + iter: entries, + typ: typ, + }, nil + default: + return nil, plumbing.ErrInvalidType + } +} + +// ID returns the ID of the packfile, which is the checksum at the end of it. +func (p *Packfile) ID() (plumbing.Hash, error) { + prev, err := p.file.Seek(-20, io.SeekEnd) + if err != nil { + return plumbing.ZeroHash, err + } + + var hash plumbing.Hash + if _, err := io.ReadFull(p.file, hash[:]); err != nil { + return plumbing.ZeroHash, err + } + + if _, err := p.file.Seek(prev, io.SeekStart); err != nil { + return plumbing.ZeroHash, err + } + + return hash, nil +} + +// Scanner returns the packfile's Scanner +func (p *Packfile) Scanner() *Scanner { + return p.s +} + +// Close the packfile and its resources. +func (p *Packfile) Close() error { + closer, ok := p.file.(io.Closer) + if !ok { + return nil + } + + return closer.Close() +} + +type objectIter struct { + p *Packfile + typ plumbing.ObjectType + iter idxfile.EntryIter +} + +func (i *objectIter) Next() (plumbing.EncodedObject, error) { + for { + e, err := i.iter.Next() + if err != nil { + return nil, err + } + + if i.typ != plumbing.AnyObject { + if typ, ok := i.p.offsetToType[int64(e.Offset)]; ok { + if typ != i.typ { + continue + } + } else if obj, ok := i.p.cacheGet(e.Hash); ok { + if obj.Type() != i.typ { + i.p.offsetToType[int64(e.Offset)] = obj.Type() + continue + } + return obj, nil + } else { + h, err := i.p.objectHeaderAtOffset(int64(e.Offset)) + if err != nil { + return nil, err + } + + if h.Type == plumbing.REFDeltaObject || h.Type == plumbing.OFSDeltaObject { + typ, err := i.p.getObjectType(h) + if err != nil { + return nil, err + } + if typ != i.typ { + i.p.offsetToType[int64(e.Offset)] = typ + continue + } + // getObjectType will seek in the file so we cannot use getNextObject safely + return i.p.objectAtOffset(int64(e.Offset), e.Hash) + } else { + if h.Type != i.typ { + i.p.offsetToType[int64(e.Offset)] = h.Type + continue + } + return i.p.getNextObject(h, e.Hash) + } + } + } + + obj, err := i.p.objectAtOffset(int64(e.Offset), e.Hash) + if err != nil { + return nil, err + } + + return obj, nil + } +} + +func (i *objectIter) ForEach(f func(plumbing.EncodedObject) error) error { + for { + o, err := i.Next() + if err != nil { + if err == io.EOF { + return nil + } + return err + } + + if err := f(o); err != nil { + return err + } + } +} + +func (i *objectIter) Close() { + i.iter.Close() +} + +// isInvalid checks whether an error is an os.PathError with an os.ErrInvalid +// error inside. It also checks for the windows error, which is different from +// os.ErrInvalid. +func isInvalid(err error) bool { + pe, ok := err.(*os.PathError) + if !ok { + return false + } + + errstr := pe.Err.Error() + return errstr == errInvalidUnix || errstr == errInvalidWindows +} + +// errInvalidWindows is the Windows equivalent to os.ErrInvalid +const errInvalidWindows = "The parameter is incorrect." + +var errInvalidUnix = os.ErrInvalid.Error() diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/parser.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/parser.go new file mode 100644 index 000000000..4b5a5708c --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/parser.go @@ -0,0 +1,495 @@ +package packfile + +import ( + "bytes" + "errors" + "io" + stdioutil "io/ioutil" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/cache" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +var ( + // ErrReferenceDeltaNotFound is returned when the reference delta is not + // found. + ErrReferenceDeltaNotFound = errors.New("reference delta not found") + + // ErrNotSeekableSource is returned when the source for the parser is not + // seekable and a storage was not provided, so it can't be parsed. + ErrNotSeekableSource = errors.New("parser source is not seekable and storage was not provided") + + // ErrDeltaNotCached is returned when the delta could not be found in cache. + ErrDeltaNotCached = errors.New("delta could not be found in cache") +) + +// Observer interface is implemented by index encoders. +type Observer interface { + // OnHeader is called when a new packfile is opened. + OnHeader(count uint32) error + // OnInflatedObjectHeader is called for each object header read. + OnInflatedObjectHeader(t plumbing.ObjectType, objSize int64, pos int64) error + // OnInflatedObjectContent is called for each decoded object. + OnInflatedObjectContent(h plumbing.Hash, pos int64, crc uint32, content []byte) error + // OnFooter is called when decoding is done. + OnFooter(h plumbing.Hash) error +} + +// Parser decodes a packfile and calls any observer associated to it. Is used +// to generate indexes. +type Parser struct { + storage storer.EncodedObjectStorer + scanner *Scanner + count uint32 + oi []*objectInfo + oiByHash map[plumbing.Hash]*objectInfo + oiByOffset map[int64]*objectInfo + hashOffset map[plumbing.Hash]int64 + checksum plumbing.Hash + + cache *cache.BufferLRU + // delta content by offset, only used if source is not seekable + deltas map[int64][]byte + + ob []Observer +} + +// NewParser creates a new Parser. The Scanner source must be seekable. +// If it's not, NewParserWithStorage should be used instead. +func NewParser(scanner *Scanner, ob ...Observer) (*Parser, error) { + return NewParserWithStorage(scanner, nil, ob...) +} + +// NewParserWithStorage creates a new Parser. The scanner source must either +// be seekable or a storage must be provided. +func NewParserWithStorage( + scanner *Scanner, + storage storer.EncodedObjectStorer, + ob ...Observer, +) (*Parser, error) { + if !scanner.IsSeekable && storage == nil { + return nil, ErrNotSeekableSource + } + + var deltas map[int64][]byte + if !scanner.IsSeekable { + deltas = make(map[int64][]byte) + } + + return &Parser{ + storage: storage, + scanner: scanner, + ob: ob, + count: 0, + cache: cache.NewBufferLRUDefault(), + deltas: deltas, + }, nil +} + +func (p *Parser) forEachObserver(f func(o Observer) error) error { + for _, o := range p.ob { + if err := f(o); err != nil { + return err + } + } + return nil +} + +func (p *Parser) onHeader(count uint32) error { + return p.forEachObserver(func(o Observer) error { + return o.OnHeader(count) + }) +} + +func (p *Parser) onInflatedObjectHeader( + t plumbing.ObjectType, + objSize int64, + pos int64, +) error { + return p.forEachObserver(func(o Observer) error { + return o.OnInflatedObjectHeader(t, objSize, pos) + }) +} + +func (p *Parser) onInflatedObjectContent( + h plumbing.Hash, + pos int64, + crc uint32, + content []byte, +) error { + return p.forEachObserver(func(o Observer) error { + return o.OnInflatedObjectContent(h, pos, crc, content) + }) +} + +func (p *Parser) onFooter(h plumbing.Hash) error { + return p.forEachObserver(func(o Observer) error { + return o.OnFooter(h) + }) +} + +// Parse start decoding phase of the packfile. +func (p *Parser) Parse() (plumbing.Hash, error) { + if err := p.init(); err != nil { + return plumbing.ZeroHash, err + } + + if err := p.indexObjects(); err != nil { + return plumbing.ZeroHash, err + } + + var err error + p.checksum, err = p.scanner.Checksum() + if err != nil && err != io.EOF { + return plumbing.ZeroHash, err + } + + if err := p.resolveDeltas(); err != nil { + return plumbing.ZeroHash, err + } + + if err := p.onFooter(p.checksum); err != nil { + return plumbing.ZeroHash, err + } + + return p.checksum, nil +} + +func (p *Parser) init() error { + _, c, err := p.scanner.Header() + if err != nil { + return err + } + + if err := p.onHeader(c); err != nil { + return err + } + + p.count = c + p.oiByHash = make(map[plumbing.Hash]*objectInfo, p.count) + p.oiByOffset = make(map[int64]*objectInfo, p.count) + p.oi = make([]*objectInfo, p.count) + + return nil +} + +func (p *Parser) indexObjects() error { + buf := new(bytes.Buffer) + + for i := uint32(0); i < p.count; i++ { + buf.Reset() + + oh, err := p.scanner.NextObjectHeader() + if err != nil { + return err + } + + delta := false + var ota *objectInfo + switch t := oh.Type; t { + case plumbing.OFSDeltaObject: + delta = true + + parent, ok := p.oiByOffset[oh.OffsetReference] + if !ok { + return plumbing.ErrObjectNotFound + } + + ota = newDeltaObject(oh.Offset, oh.Length, t, parent) + parent.Children = append(parent.Children, ota) + case plumbing.REFDeltaObject: + delta = true + parent, ok := p.oiByHash[oh.Reference] + if !ok { + // can't find referenced object in this pack file + // this must be a "thin" pack. + parent = &objectInfo{ //Placeholder parent + SHA1: oh.Reference, + ExternalRef: true, // mark as an external reference that must be resolved + Type: plumbing.AnyObject, + DiskType: plumbing.AnyObject, + } + p.oiByHash[oh.Reference] = parent + } + ota = newDeltaObject(oh.Offset, oh.Length, t, parent) + parent.Children = append(parent.Children, ota) + + default: + ota = newBaseObject(oh.Offset, oh.Length, t) + } + + _, crc, err := p.scanner.NextObject(buf) + if err != nil { + return err + } + + ota.Crc32 = crc + ota.Length = oh.Length + + data := buf.Bytes() + if !delta { + sha1, err := getSHA1(ota.Type, data) + if err != nil { + return err + } + + ota.SHA1 = sha1 + p.oiByHash[ota.SHA1] = ota + } + + if p.storage != nil && !delta { + obj := new(plumbing.MemoryObject) + obj.SetSize(oh.Length) + obj.SetType(oh.Type) + if _, err := obj.Write(data); err != nil { + return err + } + + if _, err := p.storage.SetEncodedObject(obj); err != nil { + return err + } + } + + if delta && !p.scanner.IsSeekable { + p.deltas[oh.Offset] = make([]byte, len(data)) + copy(p.deltas[oh.Offset], data) + } + + p.oiByOffset[oh.Offset] = ota + p.oi[i] = ota + } + + return nil +} + +func (p *Parser) resolveDeltas() error { + buf := &bytes.Buffer{} + for _, obj := range p.oi { + buf.Reset() + err := p.get(obj, buf) + if err != nil { + return err + } + content := buf.Bytes() + + if err := p.onInflatedObjectHeader(obj.Type, obj.Length, obj.Offset); err != nil { + return err + } + + if err := p.onInflatedObjectContent(obj.SHA1, obj.Offset, obj.Crc32, content); err != nil { + return err + } + + if !obj.IsDelta() && len(obj.Children) > 0 { + for _, child := range obj.Children { + if err := p.resolveObject(stdioutil.Discard, child, content); err != nil { + return err + } + } + + // Remove the delta from the cache. + if obj.DiskType.IsDelta() && !p.scanner.IsSeekable { + delete(p.deltas, obj.Offset) + } + } + } + + return nil +} + +func (p *Parser) get(o *objectInfo, buf *bytes.Buffer) (err error) { + if !o.ExternalRef { // skip cache check for placeholder parents + b, ok := p.cache.Get(o.Offset) + if ok { + _, err := buf.Write(b) + return err + } + } + + // If it's not on the cache and is not a delta we can try to find it in the + // storage, if there's one. External refs must enter here. + if p.storage != nil && !o.Type.IsDelta() { + var e plumbing.EncodedObject + e, err = p.storage.EncodedObject(plumbing.AnyObject, o.SHA1) + if err != nil { + return err + } + o.Type = e.Type() + + var r io.ReadCloser + r, err = e.Reader() + if err != nil { + return err + } + + defer ioutil.CheckClose(r, &err) + + _, err = buf.ReadFrom(io.LimitReader(r, e.Size())) + return err + } + + if o.ExternalRef { + // we were not able to resolve a ref in a thin pack + return ErrReferenceDeltaNotFound + } + + if o.DiskType.IsDelta() { + b := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(b) + b.Reset() + err := p.get(o.Parent, b) + if err != nil { + return err + } + base := b.Bytes() + + err = p.resolveObject(buf, o, base) + if err != nil { + return err + } + } else { + err := p.readData(buf, o) + if err != nil { + return err + } + } + + if len(o.Children) > 0 { + data := make([]byte, buf.Len()) + copy(data, buf.Bytes()) + p.cache.Put(o.Offset, data) + } + return nil +} + +func (p *Parser) resolveObject( + w io.Writer, + o *objectInfo, + base []byte, +) error { + if !o.DiskType.IsDelta() { + return nil + } + buf := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(buf) + buf.Reset() + err := p.readData(buf, o) + if err != nil { + return err + } + data := buf.Bytes() + + data, err = applyPatchBase(o, data, base) + if err != nil { + return err + } + + if p.storage != nil { + obj := new(plumbing.MemoryObject) + obj.SetSize(o.Size()) + obj.SetType(o.Type) + if _, err := obj.Write(data); err != nil { + return err + } + + if _, err := p.storage.SetEncodedObject(obj); err != nil { + return err + } + } + _, err = w.Write(data) + return err +} + +func (p *Parser) readData(w io.Writer, o *objectInfo) error { + if !p.scanner.IsSeekable && o.DiskType.IsDelta() { + data, ok := p.deltas[o.Offset] + if !ok { + return ErrDeltaNotCached + } + _, err := w.Write(data) + return err + } + + if _, err := p.scanner.SeekObjectHeader(o.Offset); err != nil { + return err + } + + if _, _, err := p.scanner.NextObject(w); err != nil { + return err + } + return nil +} + +func applyPatchBase(ota *objectInfo, data, base []byte) ([]byte, error) { + patched, err := PatchDelta(base, data) + if err != nil { + return nil, err + } + + if ota.SHA1 == plumbing.ZeroHash { + ota.Type = ota.Parent.Type + sha1, err := getSHA1(ota.Type, patched) + if err != nil { + return nil, err + } + + ota.SHA1 = sha1 + ota.Length = int64(len(patched)) + } + + return patched, nil +} + +func getSHA1(t plumbing.ObjectType, data []byte) (plumbing.Hash, error) { + hasher := plumbing.NewHasher(t, int64(len(data))) + if _, err := hasher.Write(data); err != nil { + return plumbing.ZeroHash, err + } + + return hasher.Sum(), nil +} + +type objectInfo struct { + Offset int64 + Length int64 + Type plumbing.ObjectType + DiskType plumbing.ObjectType + ExternalRef bool // indicates this is an external reference in a thin pack file + + Crc32 uint32 + + Parent *objectInfo + Children []*objectInfo + SHA1 plumbing.Hash +} + +func newBaseObject(offset, length int64, t plumbing.ObjectType) *objectInfo { + return newDeltaObject(offset, length, t, nil) +} + +func newDeltaObject( + offset, length int64, + t plumbing.ObjectType, + parent *objectInfo, +) *objectInfo { + obj := &objectInfo{ + Offset: offset, + Length: length, + Type: t, + DiskType: t, + Crc32: 0, + Parent: parent, + } + + return obj +} + +func (o *objectInfo) IsDelta() bool { + return o.Type.IsDelta() +} + +func (o *objectInfo) Size() int64 { + return o.Length +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/patch_delta.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/patch_delta.go new file mode 100644 index 000000000..1dc8b8b00 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/patch_delta.go @@ -0,0 +1,253 @@ +package packfile + +import ( + "bytes" + "errors" + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +// See https://github.com/git/git/blob/49fa3dc76179e04b0833542fa52d0f287a4955ac/delta.h +// https://github.com/git/git/blob/c2c5f6b1e479f2c38e0e01345350620944e3527f/patch-delta.c, +// and https://github.com/tarruda/node-git-core/blob/master/src/js/delta.js +// for details about the delta format. + +const deltaSizeMin = 4 + +// ApplyDelta writes to target the result of applying the modification deltas in delta to base. +func ApplyDelta(target, base plumbing.EncodedObject, delta []byte) (err error) { + r, err := base.Reader() + if err != nil { + return err + } + + defer ioutil.CheckClose(r, &err) + + w, err := target.Writer() + if err != nil { + return err + } + + defer ioutil.CheckClose(w, &err) + + buf := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(buf) + buf.Reset() + _, err = buf.ReadFrom(r) + if err != nil { + return err + } + src := buf.Bytes() + + dst := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(dst) + dst.Reset() + err = patchDelta(dst, src, delta) + if err != nil { + return err + } + + + target.SetSize(int64(dst.Len())) + + b := byteSlicePool.Get().([]byte) + _, err = io.CopyBuffer(w, dst, b) + byteSlicePool.Put(b) + return err +} + +var ( + ErrInvalidDelta = errors.New("invalid delta") + ErrDeltaCmd = errors.New("wrong delta command") +) + +// PatchDelta returns the result of applying the modification deltas in delta to src. +// An error will be returned if delta is corrupted (ErrDeltaLen) or an action command +// is not copy from source or copy from delta (ErrDeltaCmd). +func PatchDelta(src, delta []byte) ([]byte, error) { + b := &bytes.Buffer{} + if err := patchDelta(b, src, delta); err != nil { + return nil, err + } + return b.Bytes(), nil +} + +func patchDelta(dst *bytes.Buffer, src, delta []byte) error { + if len(delta) < deltaSizeMin { + return ErrInvalidDelta + } + + srcSz, delta := decodeLEB128(delta) + if srcSz != uint(len(src)) { + return ErrInvalidDelta + } + + targetSz, delta := decodeLEB128(delta) + remainingTargetSz := targetSz + + var cmd byte + dst.Grow(int(targetSz)) + for { + if len(delta) == 0 { + return ErrInvalidDelta + } + + cmd = delta[0] + delta = delta[1:] + if isCopyFromSrc(cmd) { + var offset, sz uint + var err error + offset, delta, err = decodeOffset(cmd, delta) + if err != nil { + return err + } + + sz, delta, err = decodeSize(cmd, delta) + if err != nil { + return err + } + + if invalidSize(sz, targetSz) || + invalidOffsetSize(offset, sz, srcSz) { + break + } + dst.Write(src[offset:offset+sz]) + remainingTargetSz -= sz + } else if isCopyFromDelta(cmd) { + sz := uint(cmd) // cmd is the size itself + if invalidSize(sz, targetSz) { + return ErrInvalidDelta + } + + if uint(len(delta)) < sz { + return ErrInvalidDelta + } + + dst.Write(delta[0:sz]) + remainingTargetSz -= sz + delta = delta[sz:] + } else { + return ErrDeltaCmd + } + + if remainingTargetSz <= 0 { + break + } + } + + return nil +} + +// Decodes a number encoded as an unsigned LEB128 at the start of some +// binary data and returns the decoded number and the rest of the +// stream. +// +// This must be called twice on the delta data buffer, first to get the +// expected source buffer size, and again to get the target buffer size. +func decodeLEB128(input []byte) (uint, []byte) { + var num, sz uint + var b byte + for { + b = input[sz] + num |= (uint(b) & payload) << (sz * 7) // concats 7 bits chunks + sz++ + + if uint(b)&continuation == 0 || sz == uint(len(input)) { + break + } + } + + return num, input[sz:] +} + +const ( + payload = 0x7f // 0111 1111 + continuation = 0x80 // 1000 0000 +) + +func isCopyFromSrc(cmd byte) bool { + return (cmd & 0x80) != 0 +} + +func isCopyFromDelta(cmd byte) bool { + return (cmd&0x80) == 0 && cmd != 0 +} + +func decodeOffset(cmd byte, delta []byte) (uint, []byte, error) { + var offset uint + if (cmd & 0x01) != 0 { + if len(delta) == 0 { + return 0, nil, ErrInvalidDelta + } + offset = uint(delta[0]) + delta = delta[1:] + } + if (cmd & 0x02) != 0 { + if len(delta) == 0 { + return 0, nil, ErrInvalidDelta + } + offset |= uint(delta[0]) << 8 + delta = delta[1:] + } + if (cmd & 0x04) != 0 { + if len(delta) == 0 { + return 0, nil, ErrInvalidDelta + } + offset |= uint(delta[0]) << 16 + delta = delta[1:] + } + if (cmd & 0x08) != 0 { + if len(delta) == 0 { + return 0, nil, ErrInvalidDelta + } + offset |= uint(delta[0]) << 24 + delta = delta[1:] + } + + return offset, delta, nil +} + +func decodeSize(cmd byte, delta []byte) (uint, []byte, error) { + var sz uint + if (cmd & 0x10) != 0 { + if len(delta) == 0 { + return 0, nil, ErrInvalidDelta + } + sz = uint(delta[0]) + delta = delta[1:] + } + if (cmd & 0x20) != 0 { + if len(delta) == 0 { + return 0, nil, ErrInvalidDelta + } + sz |= uint(delta[0]) << 8 + delta = delta[1:] + } + if (cmd & 0x40) != 0 { + if len(delta) == 0 { + return 0, nil, ErrInvalidDelta + } + sz |= uint(delta[0]) << 16 + delta = delta[1:] + } + if sz == 0 { + sz = 0x10000 + } + + return sz, delta, nil +} + +func invalidSize(sz, targetSz uint) bool { + return sz > targetSz +} + +func invalidOffsetSize(offset, sz, srcSz uint) bool { + return sumOverflows(offset, sz) || + offset+sz > srcSz +} + +func sumOverflows(a, b uint) bool { + return a+b < a +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/scanner.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/scanner.go new file mode 100644 index 000000000..6e6a68788 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/scanner.go @@ -0,0 +1,466 @@ +package packfile + +import ( + "bufio" + "bytes" + "compress/zlib" + "fmt" + "hash" + "hash/crc32" + "io" + stdioutil "io/ioutil" + "sync" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/utils/binary" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +var ( + // ErrEmptyPackfile is returned by ReadHeader when no data is found in the packfile + ErrEmptyPackfile = NewError("empty packfile") + // ErrBadSignature is returned by ReadHeader when the signature in the packfile is incorrect. + ErrBadSignature = NewError("malformed pack file signature") + // ErrUnsupportedVersion is returned by ReadHeader when the packfile version is + // different than VersionSupported. + ErrUnsupportedVersion = NewError("unsupported packfile version") + // ErrSeekNotSupported returned if seek is not support + ErrSeekNotSupported = NewError("not seek support") +) + +// ObjectHeader contains the information related to the object, this information +// is collected from the previous bytes to the content of the object. +type ObjectHeader struct { + Type plumbing.ObjectType + Offset int64 + Length int64 + Reference plumbing.Hash + OffsetReference int64 +} + +type Scanner struct { + r *scannerReader + crc hash.Hash32 + + // pendingObject is used to detect if an object has been read, or still + // is waiting to be read + pendingObject *ObjectHeader + version, objects uint32 + + // lsSeekable says if this scanner can do Seek or not, to have a Scanner + // seekable a r implementing io.Seeker is required + IsSeekable bool +} + +// NewScanner returns a new Scanner based on a reader, if the given reader +// implements io.ReadSeeker the Scanner will be also Seekable +func NewScanner(r io.Reader) *Scanner { + _, ok := r.(io.ReadSeeker) + + crc := crc32.NewIEEE() + return &Scanner{ + r: newScannerReader(r, crc), + crc: crc, + IsSeekable: ok, + } +} + +func (s *Scanner) Reset(r io.Reader) { + _, ok := r.(io.ReadSeeker) + + s.r.Reset(r) + s.crc.Reset() + s.IsSeekable = ok + s.pendingObject = nil + s.version = 0 + s.objects = 0 +} + +// Header reads the whole packfile header (signature, version and object count). +// It returns the version and the object count and performs checks on the +// validity of the signature and the version fields. +func (s *Scanner) Header() (version, objects uint32, err error) { + if s.version != 0 { + return s.version, s.objects, nil + } + + sig, err := s.readSignature() + if err != nil { + if err == io.EOF { + err = ErrEmptyPackfile + } + + return + } + + if !s.isValidSignature(sig) { + err = ErrBadSignature + return + } + + version, err = s.readVersion() + s.version = version + if err != nil { + return + } + + if !s.isSupportedVersion(version) { + err = ErrUnsupportedVersion.AddDetails("%d", version) + return + } + + objects, err = s.readCount() + s.objects = objects + return +} + +// readSignature reads an returns the signature field in the packfile. +func (s *Scanner) readSignature() ([]byte, error) { + var sig = make([]byte, 4) + if _, err := io.ReadFull(s.r, sig); err != nil { + return []byte{}, err + } + + return sig, nil +} + +// isValidSignature returns if sig is a valid packfile signature. +func (s *Scanner) isValidSignature(sig []byte) bool { + return bytes.Equal(sig, signature) +} + +// readVersion reads and returns the version field of a packfile. +func (s *Scanner) readVersion() (uint32, error) { + return binary.ReadUint32(s.r) +} + +// isSupportedVersion returns whether version v is supported by the parser. +// The current supported version is VersionSupported, defined above. +func (s *Scanner) isSupportedVersion(v uint32) bool { + return v == VersionSupported +} + +// readCount reads and returns the count of objects field of a packfile. +func (s *Scanner) readCount() (uint32, error) { + return binary.ReadUint32(s.r) +} + +// SeekObjectHeader seeks to specified offset and returns the ObjectHeader +// for the next object in the reader +func (s *Scanner) SeekObjectHeader(offset int64) (*ObjectHeader, error) { + // if seeking we assume that you are not interested in the header + if s.version == 0 { + s.version = VersionSupported + } + + if _, err := s.r.Seek(offset, io.SeekStart); err != nil { + return nil, err + } + + h, err := s.nextObjectHeader() + if err != nil { + return nil, err + } + + h.Offset = offset + return h, nil +} + +// NextObjectHeader returns the ObjectHeader for the next object in the reader +func (s *Scanner) NextObjectHeader() (*ObjectHeader, error) { + if err := s.doPending(); err != nil { + return nil, err + } + + offset, err := s.r.Seek(0, io.SeekCurrent) + if err != nil { + return nil, err + } + + h, err := s.nextObjectHeader() + if err != nil { + return nil, err + } + + h.Offset = offset + return h, nil +} + +// nextObjectHeader returns the ObjectHeader for the next object in the reader +// without the Offset field +func (s *Scanner) nextObjectHeader() (*ObjectHeader, error) { + s.r.Flush() + s.crc.Reset() + + h := &ObjectHeader{} + s.pendingObject = h + + var err error + h.Offset, err = s.r.Seek(0, io.SeekCurrent) + if err != nil { + return nil, err + } + + h.Type, h.Length, err = s.readObjectTypeAndLength() + if err != nil { + return nil, err + } + + switch h.Type { + case plumbing.OFSDeltaObject: + no, err := binary.ReadVariableWidthInt(s.r) + if err != nil { + return nil, err + } + + h.OffsetReference = h.Offset - no + case plumbing.REFDeltaObject: + var err error + h.Reference, err = binary.ReadHash(s.r) + if err != nil { + return nil, err + } + } + + return h, nil +} + +func (s *Scanner) doPending() error { + if s.version == 0 { + var err error + s.version, s.objects, err = s.Header() + if err != nil { + return err + } + } + + return s.discardObjectIfNeeded() +} + +func (s *Scanner) discardObjectIfNeeded() error { + if s.pendingObject == nil { + return nil + } + + h := s.pendingObject + n, _, err := s.NextObject(stdioutil.Discard) + if err != nil { + return err + } + + if n != h.Length { + return fmt.Errorf( + "error discarding object, discarded %d, expected %d", + n, h.Length, + ) + } + + return nil +} + +// ReadObjectTypeAndLength reads and returns the object type and the +// length field from an object entry in a packfile. +func (s *Scanner) readObjectTypeAndLength() (plumbing.ObjectType, int64, error) { + t, c, err := s.readType() + if err != nil { + return t, 0, err + } + + l, err := s.readLength(c) + + return t, l, err +} + +func (s *Scanner) readType() (plumbing.ObjectType, byte, error) { + var c byte + var err error + if c, err = s.r.ReadByte(); err != nil { + return plumbing.ObjectType(0), 0, err + } + + typ := parseType(c) + + return typ, c, nil +} + +func parseType(b byte) plumbing.ObjectType { + return plumbing.ObjectType((b & maskType) >> firstLengthBits) +} + +// the length is codified in the last 4 bits of the first byte and in +// the last 7 bits of subsequent bytes. Last byte has a 0 MSB. +func (s *Scanner) readLength(first byte) (int64, error) { + length := int64(first & maskFirstLength) + + c := first + shift := firstLengthBits + var err error + for c&maskContinue > 0 { + if c, err = s.r.ReadByte(); err != nil { + return 0, err + } + + length += int64(c&maskLength) << shift + shift += lengthBits + } + + return length, nil +} + +// NextObject writes the content of the next object into the reader, returns +// the number of bytes written, the CRC32 of the content and an error, if any +func (s *Scanner) NextObject(w io.Writer) (written int64, crc32 uint32, err error) { + s.pendingObject = nil + written, err = s.copyObject(w) + + s.r.Flush() + crc32 = s.crc.Sum32() + s.crc.Reset() + + return +} + +// ReadRegularObject reads and write a non-deltified object +// from it zlib stream in an object entry in the packfile. +func (s *Scanner) copyObject(w io.Writer) (n int64, err error) { + zr := zlibReaderPool.Get().(io.ReadCloser) + defer zlibReaderPool.Put(zr) + + if err = zr.(zlib.Resetter).Reset(s.r, nil); err != nil { + return 0, fmt.Errorf("zlib reset error: %s", err) + } + + defer ioutil.CheckClose(zr, &err) + buf := byteSlicePool.Get().([]byte) + n, err = io.CopyBuffer(w, zr, buf) + byteSlicePool.Put(buf) + return +} + +var byteSlicePool = sync.Pool{ + New: func() interface{} { + return make([]byte, 32*1024) + }, +} + +// SeekFromStart sets a new offset from start, returns the old position before +// the change. +func (s *Scanner) SeekFromStart(offset int64) (previous int64, err error) { + // if seeking we assume that you are not interested in the header + if s.version == 0 { + s.version = VersionSupported + } + + previous, err = s.r.Seek(0, io.SeekCurrent) + if err != nil { + return -1, err + } + + _, err = s.r.Seek(offset, io.SeekStart) + return previous, err +} + +// Checksum returns the checksum of the packfile +func (s *Scanner) Checksum() (plumbing.Hash, error) { + err := s.discardObjectIfNeeded() + if err != nil { + return plumbing.ZeroHash, err + } + + return binary.ReadHash(s.r) +} + +// Close reads the reader until io.EOF +func (s *Scanner) Close() error { + buf := byteSlicePool.Get().([]byte) + _, err := io.CopyBuffer(stdioutil.Discard, s.r, buf) + byteSlicePool.Put(buf) + return err +} + +// Flush is a no-op (deprecated) +func (s *Scanner) Flush() error { + return nil +} + +// scannerReader has the following characteristics: +// - Provides an io.SeekReader impl for bufio.Reader, when the underlying +// reader supports it. +// - Keeps track of the current read position, for when the underlying reader +// isn't an io.SeekReader, but we still want to know the current offset. +// - Writes to the hash writer what it reads, with the aid of a smaller buffer. +// The buffer helps avoid a performance penality for performing small writes +// to the crc32 hash writer. +type scannerReader struct { + reader io.Reader + crc io.Writer + rbuf *bufio.Reader + wbuf *bufio.Writer + offset int64 +} + +func newScannerReader(r io.Reader, h io.Writer) *scannerReader { + sr := &scannerReader{ + rbuf: bufio.NewReader(nil), + wbuf: bufio.NewWriterSize(nil, 64), + crc: h, + } + sr.Reset(r) + + return sr +} + +func (r *scannerReader) Reset(reader io.Reader) { + r.reader = reader + r.rbuf.Reset(r.reader) + r.wbuf.Reset(r.crc) + + r.offset = 0 + if seeker, ok := r.reader.(io.ReadSeeker); ok { + r.offset, _ = seeker.Seek(0, io.SeekCurrent) + } +} + +func (r *scannerReader) Read(p []byte) (n int, err error) { + n, err = r.rbuf.Read(p) + + r.offset += int64(n) + if _, err := r.wbuf.Write(p[:n]); err != nil { + return n, err + } + return +} + +func (r *scannerReader) ReadByte() (b byte, err error) { + b, err = r.rbuf.ReadByte() + if err == nil { + r.offset++ + return b, r.wbuf.WriteByte(b) + } + return +} + +func (r *scannerReader) Flush() error { + return r.wbuf.Flush() +} + +// Seek seeks to a location. If the underlying reader is not an io.ReadSeeker, +// then only whence=io.SeekCurrent is supported, any other operation fails. +func (r *scannerReader) Seek(offset int64, whence int) (int64, error) { + var err error + + if seeker, ok := r.reader.(io.ReadSeeker); !ok { + if whence != io.SeekCurrent || offset != 0 { + return -1, ErrSeekNotSupported + } + } else { + if whence == io.SeekCurrent && offset == 0 { + return r.offset, nil + } + + r.offset, err = seeker.Seek(offset, whence) + r.rbuf.Reset(r.reader) + } + + return r.offset, err +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/pktline/encoder.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/pktline/encoder.go new file mode 100644 index 000000000..6d409795b --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/pktline/encoder.go @@ -0,0 +1,122 @@ +// Package pktline implements reading payloads form pkt-lines and encoding +// pkt-lines from payloads. +package pktline + +import ( + "bytes" + "errors" + "fmt" + "io" +) + +// An Encoder writes pkt-lines to an output stream. +type Encoder struct { + w io.Writer +} + +const ( + // MaxPayloadSize is the maximum payload size of a pkt-line in bytes. + MaxPayloadSize = 65516 + + // For compatibility with canonical Git implementation, accept longer pkt-lines + OversizePayloadMax = 65520 +) + +var ( + // FlushPkt are the contents of a flush-pkt pkt-line. + FlushPkt = []byte{'0', '0', '0', '0'} + // Flush is the payload to use with the Encode method to encode a flush-pkt. + Flush = []byte{} + // FlushString is the payload to use with the EncodeString method to encode a flush-pkt. + FlushString = "" + // ErrPayloadTooLong is returned by the Encode methods when any of the + // provided payloads is bigger than MaxPayloadSize. + ErrPayloadTooLong = errors.New("payload is too long") +) + +// NewEncoder returns a new encoder that writes to w. +func NewEncoder(w io.Writer) *Encoder { + return &Encoder{ + w: w, + } +} + +// Flush encodes a flush-pkt to the output stream. +func (e *Encoder) Flush() error { + _, err := e.w.Write(FlushPkt) + return err +} + +// Encode encodes a pkt-line with the payload specified and write it to +// the output stream. If several payloads are specified, each of them +// will get streamed in their own pkt-lines. +func (e *Encoder) Encode(payloads ...[]byte) error { + for _, p := range payloads { + if err := e.encodeLine(p); err != nil { + return err + } + } + + return nil +} + +func (e *Encoder) encodeLine(p []byte) error { + if len(p) > MaxPayloadSize { + return ErrPayloadTooLong + } + + if bytes.Equal(p, Flush) { + return e.Flush() + } + + n := len(p) + 4 + if _, err := e.w.Write(asciiHex16(n)); err != nil { + return err + } + _, err := e.w.Write(p) + return err +} + +// Returns the hexadecimal ascii representation of the 16 less +// significant bits of n. The length of the returned slice will always +// be 4. Example: if n is 1234 (0x4d2), the return value will be +// []byte{'0', '4', 'd', '2'}. +func asciiHex16(n int) []byte { + var ret [4]byte + ret[0] = byteToASCIIHex(byte(n & 0xf000 >> 12)) + ret[1] = byteToASCIIHex(byte(n & 0x0f00 >> 8)) + ret[2] = byteToASCIIHex(byte(n & 0x00f0 >> 4)) + ret[3] = byteToASCIIHex(byte(n & 0x000f)) + + return ret[:] +} + +// turns a byte into its hexadecimal ascii representation. Example: +// from 11 (0xb) to 'b'. +func byteToASCIIHex(n byte) byte { + if n < 10 { + return '0' + n + } + + return 'a' - 10 + n +} + +// EncodeString works similarly as Encode but payloads are specified as strings. +func (e *Encoder) EncodeString(payloads ...string) error { + for _, p := range payloads { + if err := e.Encode([]byte(p)); err != nil { + return err + } + } + + return nil +} + +// Encodef encodes a single pkt-line with the payload formatted as +// the format specifier. The rest of the arguments will be used in +// the format string. +func (e *Encoder) Encodef(format string, a ...interface{}) error { + return e.EncodeString( + fmt.Sprintf(format, a...), + ) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/pktline/scanner.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/pktline/scanner.go new file mode 100644 index 000000000..99aab46e8 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/pktline/scanner.go @@ -0,0 +1,134 @@ +package pktline + +import ( + "errors" + "io" +) + +const ( + lenSize = 4 +) + +// ErrInvalidPktLen is returned by Err() when an invalid pkt-len is found. +var ErrInvalidPktLen = errors.New("invalid pkt-len found") + +// Scanner provides a convenient interface for reading the payloads of a +// series of pkt-lines. It takes an io.Reader providing the source, +// which then can be tokenized through repeated calls to the Scan +// method. +// +// After each Scan call, the Bytes method will return the payload of the +// corresponding pkt-line on a shared buffer, which will be 65516 bytes +// or smaller. Flush pkt-lines are represented by empty byte slices. +// +// Scanning stops at EOF or the first I/O error. +type Scanner struct { + r io.Reader // The reader provided by the client + err error // Sticky error + payload []byte // Last pkt-payload + len [lenSize]byte // Last pkt-len +} + +// NewScanner returns a new Scanner to read from r. +func NewScanner(r io.Reader) *Scanner { + return &Scanner{ + r: r, + } +} + +// Err returns the first error encountered by the Scanner. +func (s *Scanner) Err() error { + return s.err +} + +// Scan advances the Scanner to the next pkt-line, whose payload will +// then be available through the Bytes method. Scanning stops at EOF +// or the first I/O error. After Scan returns false, the Err method +// will return any error that occurred during scanning, except that if +// it was io.EOF, Err will return nil. +func (s *Scanner) Scan() bool { + var l int + l, s.err = s.readPayloadLen() + if s.err == io.EOF { + s.err = nil + return false + } + if s.err != nil { + return false + } + + if cap(s.payload) < l { + s.payload = make([]byte, 0, l) + } + + if _, s.err = io.ReadFull(s.r, s.payload[:l]); s.err != nil { + return false + } + s.payload = s.payload[:l] + + return true +} + +// Bytes returns the most recent payload generated by a call to Scan. +// The underlying array may point to data that will be overwritten by a +// subsequent call to Scan. It does no allocation. +func (s *Scanner) Bytes() []byte { + return s.payload +} + +// Method readPayloadLen returns the payload length by reading the +// pkt-len and subtracting the pkt-len size. +func (s *Scanner) readPayloadLen() (int, error) { + if _, err := io.ReadFull(s.r, s.len[:]); err != nil { + if err == io.ErrUnexpectedEOF { + return 0, ErrInvalidPktLen + } + + return 0, err + } + + n, err := hexDecode(s.len) + if err != nil { + return 0, err + } + + switch { + case n == 0: + return 0, nil + case n <= lenSize: + return 0, ErrInvalidPktLen + case n > OversizePayloadMax+lenSize: + return 0, ErrInvalidPktLen + default: + return n - lenSize, nil + } +} + +// Turns the hexadecimal representation of a number in a byte slice into +// a number. This function substitute strconv.ParseUint(string(buf), 16, +// 16) and/or hex.Decode, to avoid generating new strings, thus helping the +// GC. +func hexDecode(buf [lenSize]byte) (int, error) { + var ret int + for i := 0; i < lenSize; i++ { + n, err := asciiHexToByte(buf[i]) + if err != nil { + return 0, ErrInvalidPktLen + } + ret = 16*ret + int(n) + } + return ret, nil +} + +// turns the hexadecimal ascii representation of a byte into its +// numerical value. Example: from 'b' to 11 (0xb). +func asciiHexToByte(b byte) (byte, error) { + switch { + case b >= '0' && b <= '9': + return b - '0', nil + case b >= 'a' && b <= 'f': + return b - 'a' + 10, nil + default: + return 0, ErrInvalidPktLen + } +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/hash.go b/vendor/github.com/go-git/go-git/v5/plumbing/hash.go new file mode 100644 index 000000000..afc602a9e --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/hash.go @@ -0,0 +1,83 @@ +package plumbing + +import ( + "bytes" + "crypto/sha1" + "encoding/hex" + "hash" + "sort" + "strconv" +) + +// Hash SHA1 hashed content +type Hash [20]byte + +// ZeroHash is Hash with value zero +var ZeroHash Hash + +// ComputeHash compute the hash for a given ObjectType and content +func ComputeHash(t ObjectType, content []byte) Hash { + h := NewHasher(t, int64(len(content))) + h.Write(content) + return h.Sum() +} + +// NewHash return a new Hash from a hexadecimal hash representation +func NewHash(s string) Hash { + b, _ := hex.DecodeString(s) + + var h Hash + copy(h[:], b) + + return h +} + +func (h Hash) IsZero() bool { + var empty Hash + return h == empty +} + +func (h Hash) String() string { + return hex.EncodeToString(h[:]) +} + +type Hasher struct { + hash.Hash +} + +func NewHasher(t ObjectType, size int64) Hasher { + h := Hasher{sha1.New()} + h.Write(t.Bytes()) + h.Write([]byte(" ")) + h.Write([]byte(strconv.FormatInt(size, 10))) + h.Write([]byte{0}) + return h +} + +func (h Hasher) Sum() (hash Hash) { + copy(hash[:], h.Hash.Sum(nil)) + return +} + +// HashesSort sorts a slice of Hashes in increasing order. +func HashesSort(a []Hash) { + sort.Sort(HashSlice(a)) +} + +// HashSlice attaches the methods of sort.Interface to []Hash, sorting in +// increasing order. +type HashSlice []Hash + +func (p HashSlice) Len() int { return len(p) } +func (p HashSlice) Less(i, j int) bool { return bytes.Compare(p[i][:], p[j][:]) < 0 } +func (p HashSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + +// IsHash returns true if the given string is a valid hash. +func IsHash(s string) bool { + if len(s) != 40 { + return false + } + + _, err := hex.DecodeString(s) + return err == nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/memory.go b/vendor/github.com/go-git/go-git/v5/plumbing/memory.go new file mode 100644 index 000000000..b8e1e1b81 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/memory.go @@ -0,0 +1,61 @@ +package plumbing + +import ( + "bytes" + "io" + "io/ioutil" +) + +// MemoryObject on memory Object implementation +type MemoryObject struct { + t ObjectType + h Hash + cont []byte + sz int64 +} + +// Hash returns the object Hash, the hash is calculated on-the-fly the first +// time it's called, in all subsequent calls the same Hash is returned even +// if the type or the content have changed. The Hash is only generated if the +// size of the content is exactly the object size. +func (o *MemoryObject) Hash() Hash { + if o.h == ZeroHash && int64(len(o.cont)) == o.sz { + o.h = ComputeHash(o.t, o.cont) + } + + return o.h +} + +// Type return the ObjectType +func (o *MemoryObject) Type() ObjectType { return o.t } + +// SetType sets the ObjectType +func (o *MemoryObject) SetType(t ObjectType) { o.t = t } + +// Size return the size of the object +func (o *MemoryObject) Size() int64 { return o.sz } + +// SetSize set the object size, a content of the given size should be written +// afterwards +func (o *MemoryObject) SetSize(s int64) { o.sz = s } + +// Reader returns a ObjectReader used to read the object's content. +func (o *MemoryObject) Reader() (io.ReadCloser, error) { + return ioutil.NopCloser(bytes.NewBuffer(o.cont)), nil +} + +// Writer returns a ObjectWriter used to write the object's content. +func (o *MemoryObject) Writer() (io.WriteCloser, error) { + return o, nil +} + +func (o *MemoryObject) Write(p []byte) (n int, err error) { + o.cont = append(o.cont, p...) + o.sz = int64(len(o.cont)) + + return len(p), nil +} + +// Close releases any resources consumed by the object when it is acting as a +// ObjectWriter. +func (o *MemoryObject) Close() error { return nil } diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object.go b/vendor/github.com/go-git/go-git/v5/plumbing/object.go new file mode 100644 index 000000000..2655dee43 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object.go @@ -0,0 +1,111 @@ +// package plumbing implement the core interfaces and structs used by go-git +package plumbing + +import ( + "errors" + "io" +) + +var ( + ErrObjectNotFound = errors.New("object not found") + // ErrInvalidType is returned when an invalid object type is provided. + ErrInvalidType = errors.New("invalid object type") +) + +// Object is a generic representation of any git object +type EncodedObject interface { + Hash() Hash + Type() ObjectType + SetType(ObjectType) + Size() int64 + SetSize(int64) + Reader() (io.ReadCloser, error) + Writer() (io.WriteCloser, error) +} + +// DeltaObject is an EncodedObject representing a delta. +type DeltaObject interface { + EncodedObject + // BaseHash returns the hash of the object used as base for this delta. + BaseHash() Hash + // ActualHash returns the hash of the object after applying the delta. + ActualHash() Hash + // Size returns the size of the object after applying the delta. + ActualSize() int64 +} + +// ObjectType internal object type +// Integer values from 0 to 7 map to those exposed by git. +// AnyObject is used to represent any from 0 to 7. +type ObjectType int8 + +const ( + InvalidObject ObjectType = 0 + CommitObject ObjectType = 1 + TreeObject ObjectType = 2 + BlobObject ObjectType = 3 + TagObject ObjectType = 4 + // 5 reserved for future expansion + OFSDeltaObject ObjectType = 6 + REFDeltaObject ObjectType = 7 + + AnyObject ObjectType = -127 +) + +func (t ObjectType) String() string { + switch t { + case CommitObject: + return "commit" + case TreeObject: + return "tree" + case BlobObject: + return "blob" + case TagObject: + return "tag" + case OFSDeltaObject: + return "ofs-delta" + case REFDeltaObject: + return "ref-delta" + case AnyObject: + return "any" + default: + return "unknown" + } +} + +func (t ObjectType) Bytes() []byte { + return []byte(t.String()) +} + +// Valid returns true if t is a valid ObjectType. +func (t ObjectType) Valid() bool { + return t >= CommitObject && t <= REFDeltaObject +} + +// IsDelta returns true for any ObjectTyoe that represents a delta (i.e. +// REFDeltaObject or OFSDeltaObject). +func (t ObjectType) IsDelta() bool { + return t == REFDeltaObject || t == OFSDeltaObject +} + +// ParseObjectType parses a string representation of ObjectType. It returns an +// error on parse failure. +func ParseObjectType(value string) (typ ObjectType, err error) { + switch value { + case "commit": + typ = CommitObject + case "tree": + typ = TreeObject + case "blob": + typ = BlobObject + case "tag": + typ = TagObject + case "ofs-delta": + typ = OFSDeltaObject + case "ref-delta": + typ = REFDeltaObject + default: + err = ErrInvalidType + } + return +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/blob.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/blob.go new file mode 100644 index 000000000..8fb7576fa --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/blob.go @@ -0,0 +1,144 @@ +package object + +import ( + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +// Blob is used to store arbitrary data - it is generally a file. +type Blob struct { + // Hash of the blob. + Hash plumbing.Hash + // Size of the (uncompressed) blob. + Size int64 + + obj plumbing.EncodedObject +} + +// GetBlob gets a blob from an object storer and decodes it. +func GetBlob(s storer.EncodedObjectStorer, h plumbing.Hash) (*Blob, error) { + o, err := s.EncodedObject(plumbing.BlobObject, h) + if err != nil { + return nil, err + } + + return DecodeBlob(o) +} + +// DecodeObject decodes an encoded object into a *Blob. +func DecodeBlob(o plumbing.EncodedObject) (*Blob, error) { + b := &Blob{} + if err := b.Decode(o); err != nil { + return nil, err + } + + return b, nil +} + +// ID returns the object ID of the blob. The returned value will always match +// the current value of Blob.Hash. +// +// ID is present to fulfill the Object interface. +func (b *Blob) ID() plumbing.Hash { + return b.Hash +} + +// Type returns the type of object. It always returns plumbing.BlobObject. +// +// Type is present to fulfill the Object interface. +func (b *Blob) Type() plumbing.ObjectType { + return plumbing.BlobObject +} + +// Decode transforms a plumbing.EncodedObject into a Blob struct. +func (b *Blob) Decode(o plumbing.EncodedObject) error { + if o.Type() != plumbing.BlobObject { + return ErrUnsupportedObject + } + + b.Hash = o.Hash() + b.Size = o.Size() + b.obj = o + + return nil +} + +// Encode transforms a Blob into a plumbing.EncodedObject. +func (b *Blob) Encode(o plumbing.EncodedObject) (err error) { + o.SetType(plumbing.BlobObject) + + w, err := o.Writer() + if err != nil { + return err + } + + defer ioutil.CheckClose(w, &err) + + r, err := b.Reader() + if err != nil { + return err + } + + defer ioutil.CheckClose(r, &err) + + _, err = io.Copy(w, r) + return err +} + +// Reader returns a reader allow the access to the content of the blob +func (b *Blob) Reader() (io.ReadCloser, error) { + return b.obj.Reader() +} + +// BlobIter provides an iterator for a set of blobs. +type BlobIter struct { + storer.EncodedObjectIter + s storer.EncodedObjectStorer +} + +// NewBlobIter takes a storer.EncodedObjectStorer and a +// storer.EncodedObjectIter and returns a *BlobIter that iterates over all +// blobs contained in the storer.EncodedObjectIter. +// +// Any non-blob object returned by the storer.EncodedObjectIter is skipped. +func NewBlobIter(s storer.EncodedObjectStorer, iter storer.EncodedObjectIter) *BlobIter { + return &BlobIter{iter, s} +} + +// Next moves the iterator to the next blob and returns a pointer to it. If +// there are no more blobs, it returns io.EOF. +func (iter *BlobIter) Next() (*Blob, error) { + for { + obj, err := iter.EncodedObjectIter.Next() + if err != nil { + return nil, err + } + + if obj.Type() != plumbing.BlobObject { + continue + } + + return DecodeBlob(obj) + } +} + +// ForEach call the cb function for each blob contained on this iter until +// an error happens or the end of the iter is reached. If ErrStop is sent +// the iteration is stop but no error is returned. The iterator is closed. +func (iter *BlobIter) ForEach(cb func(*Blob) error) error { + return iter.EncodedObjectIter.ForEach(func(obj plumbing.EncodedObject) error { + if obj.Type() != plumbing.BlobObject { + return nil + } + + b, err := DecodeBlob(obj) + if err != nil { + return err + } + + return cb(b) + }) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/change.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/change.go new file mode 100644 index 000000000..c9d161508 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/change.go @@ -0,0 +1,159 @@ +package object + +import ( + "bytes" + "context" + "fmt" + "strings" + + "github.com/go-git/go-git/v5/utils/merkletrie" +) + +// Change values represent a detected change between two git trees. For +// modifications, From is the original status of the node and To is its +// final status. For insertions, From is the zero value and for +// deletions To is the zero value. +type Change struct { + From ChangeEntry + To ChangeEntry +} + +var empty ChangeEntry + +// Action returns the kind of action represented by the change, an +// insertion, a deletion or a modification. +func (c *Change) Action() (merkletrie.Action, error) { + if c.From == empty && c.To == empty { + return merkletrie.Action(0), + fmt.Errorf("malformed change: empty from and to") + } + + if c.From == empty { + return merkletrie.Insert, nil + } + + if c.To == empty { + return merkletrie.Delete, nil + } + + return merkletrie.Modify, nil +} + +// Files return the files before and after a change. +// For insertions from will be nil. For deletions to will be nil. +func (c *Change) Files() (from, to *File, err error) { + action, err := c.Action() + if err != nil { + return + } + + if action == merkletrie.Insert || action == merkletrie.Modify { + to, err = c.To.Tree.TreeEntryFile(&c.To.TreeEntry) + if !c.To.TreeEntry.Mode.IsFile() { + return nil, nil, nil + } + + if err != nil { + return + } + } + + if action == merkletrie.Delete || action == merkletrie.Modify { + from, err = c.From.Tree.TreeEntryFile(&c.From.TreeEntry) + if !c.From.TreeEntry.Mode.IsFile() { + return nil, nil, nil + } + + if err != nil { + return + } + } + + return +} + +func (c *Change) String() string { + action, err := c.Action() + if err != nil { + return fmt.Sprintf("malformed change") + } + + return fmt.Sprintf("", action, c.name()) +} + +// Patch returns a Patch with all the file changes in chunks. This +// representation can be used to create several diff outputs. +func (c *Change) Patch() (*Patch, error) { + return c.PatchContext(context.Background()) +} + +// Patch returns a Patch with all the file changes in chunks. This +// representation can be used to create several diff outputs. +// If context expires, an non-nil error will be returned +// Provided context must be non-nil +func (c *Change) PatchContext(ctx context.Context) (*Patch, error) { + return getPatchContext(ctx, "", c) +} + +func (c *Change) name() string { + if c.From != empty { + return c.From.Name + } + + return c.To.Name +} + +// ChangeEntry values represent a node that has suffered a change. +type ChangeEntry struct { + // Full path of the node using "/" as separator. + Name string + // Parent tree of the node that has changed. + Tree *Tree + // The entry of the node. + TreeEntry TreeEntry +} + +// Changes represents a collection of changes between two git trees. +// Implements sort.Interface lexicographically over the path of the +// changed files. +type Changes []*Change + +func (c Changes) Len() int { + return len(c) +} + +func (c Changes) Swap(i, j int) { + c[i], c[j] = c[j], c[i] +} + +func (c Changes) Less(i, j int) bool { + return strings.Compare(c[i].name(), c[j].name()) < 0 +} + +func (c Changes) String() string { + var buffer bytes.Buffer + buffer.WriteString("[") + comma := "" + for _, v := range c { + buffer.WriteString(comma) + buffer.WriteString(v.String()) + comma = ", " + } + buffer.WriteString("]") + + return buffer.String() +} + +// Patch returns a Patch with all the changes in chunks. This +// representation can be used to create several diff outputs. +func (c Changes) Patch() (*Patch, error) { + return c.PatchContext(context.Background()) +} + +// Patch returns a Patch with all the changes in chunks. This +// representation can be used to create several diff outputs. +// If context expires, an non-nil error will be returned +// Provided context must be non-nil +func (c Changes) PatchContext(ctx context.Context) (*Patch, error) { + return getPatchContext(ctx, "", c...) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/change_adaptor.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/change_adaptor.go new file mode 100644 index 000000000..f70118828 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/change_adaptor.go @@ -0,0 +1,61 @@ +package object + +import ( + "errors" + "fmt" + + "github.com/go-git/go-git/v5/utils/merkletrie" + "github.com/go-git/go-git/v5/utils/merkletrie/noder" +) + +// The following functions transform changes types form the merkletrie +// package to changes types from this package. + +func newChange(c merkletrie.Change) (*Change, error) { + ret := &Change{} + + var err error + if ret.From, err = newChangeEntry(c.From); err != nil { + return nil, fmt.Errorf("From field: %s", err) + } + + if ret.To, err = newChangeEntry(c.To); err != nil { + return nil, fmt.Errorf("To field: %s", err) + } + + return ret, nil +} + +func newChangeEntry(p noder.Path) (ChangeEntry, error) { + if p == nil { + return empty, nil + } + + asTreeNoder, ok := p.Last().(*treeNoder) + if !ok { + return ChangeEntry{}, errors.New("cannot transform non-TreeNoders") + } + + return ChangeEntry{ + Name: p.String(), + Tree: asTreeNoder.parent, + TreeEntry: TreeEntry{ + Name: asTreeNoder.name, + Mode: asTreeNoder.mode, + Hash: asTreeNoder.hash, + }, + }, nil +} + +func newChanges(src merkletrie.Changes) (Changes, error) { + ret := make(Changes, len(src)) + var err error + for i, e := range src { + ret[i], err = newChange(e) + if err != nil { + return nil, fmt.Errorf("change #%d: %s", i, err) + } + } + + return ret, nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/commit.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit.go new file mode 100644 index 000000000..113cb29e5 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit.go @@ -0,0 +1,442 @@ +package object + +import ( + "bufio" + "bytes" + "context" + "errors" + "fmt" + "io" + "strings" + + "golang.org/x/crypto/openpgp" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +const ( + beginpgp string = "-----BEGIN PGP SIGNATURE-----" + endpgp string = "-----END PGP SIGNATURE-----" + headerpgp string = "gpgsig" +) + +// Hash represents the hash of an object +type Hash plumbing.Hash + +// Commit points to a single tree, marking it as what the project looked like +// at a certain point in time. It contains meta-information about that point +// in time, such as a timestamp, the author of the changes since the last +// commit, a pointer to the previous commit(s), etc. +// http://shafiulazam.com/gitbook/1_the_git_object_model.html +type Commit struct { + // Hash of the commit object. + Hash plumbing.Hash + // Author is the original author of the commit. + Author Signature + // Committer is the one performing the commit, might be different from + // Author. + Committer Signature + // PGPSignature is the PGP signature of the commit. + PGPSignature string + // Message is the commit message, contains arbitrary text. + Message string + // TreeHash is the hash of the root tree of the commit. + TreeHash plumbing.Hash + // ParentHashes are the hashes of the parent commits of the commit. + ParentHashes []plumbing.Hash + + s storer.EncodedObjectStorer +} + +// GetCommit gets a commit from an object storer and decodes it. +func GetCommit(s storer.EncodedObjectStorer, h plumbing.Hash) (*Commit, error) { + o, err := s.EncodedObject(plumbing.CommitObject, h) + if err != nil { + return nil, err + } + + return DecodeCommit(s, o) +} + +// DecodeCommit decodes an encoded object into a *Commit and associates it to +// the given object storer. +func DecodeCommit(s storer.EncodedObjectStorer, o plumbing.EncodedObject) (*Commit, error) { + c := &Commit{s: s} + if err := c.Decode(o); err != nil { + return nil, err + } + + return c, nil +} + +// Tree returns the Tree from the commit. +func (c *Commit) Tree() (*Tree, error) { + return GetTree(c.s, c.TreeHash) +} + +// PatchContext returns the Patch between the actual commit and the provided one. +// Error will be return if context expires. Provided context must be non-nil. +// +// NOTE: Since version 5.1.0 the renames are correctly handled, the settings +// used are the recommended options DefaultDiffTreeOptions. +func (c *Commit) PatchContext(ctx context.Context, to *Commit) (*Patch, error) { + fromTree, err := c.Tree() + if err != nil { + return nil, err + } + + var toTree *Tree + if to != nil { + toTree, err = to.Tree() + if err != nil { + return nil, err + } + } + + return fromTree.PatchContext(ctx, toTree) +} + +// Patch returns the Patch between the actual commit and the provided one. +// +// NOTE: Since version 5.1.0 the renames are correctly handled, the settings +// used are the recommended options DefaultDiffTreeOptions. +func (c *Commit) Patch(to *Commit) (*Patch, error) { + return c.PatchContext(context.Background(), to) +} + +// Parents return a CommitIter to the parent Commits. +func (c *Commit) Parents() CommitIter { + return NewCommitIter(c.s, + storer.NewEncodedObjectLookupIter(c.s, plumbing.CommitObject, c.ParentHashes), + ) +} + +// NumParents returns the number of parents in a commit. +func (c *Commit) NumParents() int { + return len(c.ParentHashes) +} + +var ErrParentNotFound = errors.New("commit parent not found") + +// Parent returns the ith parent of a commit. +func (c *Commit) Parent(i int) (*Commit, error) { + if len(c.ParentHashes) == 0 || i > len(c.ParentHashes)-1 { + return nil, ErrParentNotFound + } + + return GetCommit(c.s, c.ParentHashes[i]) +} + +// File returns the file with the specified "path" in the commit and a +// nil error if the file exists. If the file does not exist, it returns +// a nil file and the ErrFileNotFound error. +func (c *Commit) File(path string) (*File, error) { + tree, err := c.Tree() + if err != nil { + return nil, err + } + + return tree.File(path) +} + +// Files returns a FileIter allowing to iterate over the Tree +func (c *Commit) Files() (*FileIter, error) { + tree, err := c.Tree() + if err != nil { + return nil, err + } + + return tree.Files(), nil +} + +// ID returns the object ID of the commit. The returned value will always match +// the current value of Commit.Hash. +// +// ID is present to fulfill the Object interface. +func (c *Commit) ID() plumbing.Hash { + return c.Hash +} + +// Type returns the type of object. It always returns plumbing.CommitObject. +// +// Type is present to fulfill the Object interface. +func (c *Commit) Type() plumbing.ObjectType { + return plumbing.CommitObject +} + +// Decode transforms a plumbing.EncodedObject into a Commit struct. +func (c *Commit) Decode(o plumbing.EncodedObject) (err error) { + if o.Type() != plumbing.CommitObject { + return ErrUnsupportedObject + } + + c.Hash = o.Hash() + + reader, err := o.Reader() + if err != nil { + return err + } + defer ioutil.CheckClose(reader, &err) + + r := bufPool.Get().(*bufio.Reader) + defer bufPool.Put(r) + r.Reset(reader) + + var message bool + var pgpsig bool + var msgbuf bytes.Buffer + for { + line, err := r.ReadBytes('\n') + if err != nil && err != io.EOF { + return err + } + + if pgpsig { + if len(line) > 0 && line[0] == ' ' { + line = bytes.TrimLeft(line, " ") + c.PGPSignature += string(line) + continue + } else { + pgpsig = false + } + } + + if !message { + line = bytes.TrimSpace(line) + if len(line) == 0 { + message = true + continue + } + + split := bytes.SplitN(line, []byte{' '}, 2) + + var data []byte + if len(split) == 2 { + data = split[1] + } + + switch string(split[0]) { + case "tree": + c.TreeHash = plumbing.NewHash(string(data)) + case "parent": + c.ParentHashes = append(c.ParentHashes, plumbing.NewHash(string(data))) + case "author": + c.Author.Decode(data) + case "committer": + c.Committer.Decode(data) + case headerpgp: + c.PGPSignature += string(data) + "\n" + pgpsig = true + } + } else { + msgbuf.Write(line) + } + + if err == io.EOF { + break + } + } + c.Message = msgbuf.String() + return nil +} + +// Encode transforms a Commit into a plumbing.EncodedObject. +func (b *Commit) Encode(o plumbing.EncodedObject) error { + return b.encode(o, true) +} + +// EncodeWithoutSignature export a Commit into a plumbing.EncodedObject without the signature (correspond to the payload of the PGP signature). +func (b *Commit) EncodeWithoutSignature(o plumbing.EncodedObject) error { + return b.encode(o, false) +} + +func (b *Commit) encode(o plumbing.EncodedObject, includeSig bool) (err error) { + o.SetType(plumbing.CommitObject) + w, err := o.Writer() + if err != nil { + return err + } + + defer ioutil.CheckClose(w, &err) + + if _, err = fmt.Fprintf(w, "tree %s\n", b.TreeHash.String()); err != nil { + return err + } + + for _, parent := range b.ParentHashes { + if _, err = fmt.Fprintf(w, "parent %s\n", parent.String()); err != nil { + return err + } + } + + if _, err = fmt.Fprint(w, "author "); err != nil { + return err + } + + if err = b.Author.Encode(w); err != nil { + return err + } + + if _, err = fmt.Fprint(w, "\ncommitter "); err != nil { + return err + } + + if err = b.Committer.Encode(w); err != nil { + return err + } + + if b.PGPSignature != "" && includeSig { + if _, err = fmt.Fprint(w, "\n"+headerpgp+" "); err != nil { + return err + } + + // Split all the signature lines and re-write with a left padding and + // newline. Use join for this so it's clear that a newline should not be + // added after this section, as it will be added when the message is + // printed. + signature := strings.TrimSuffix(b.PGPSignature, "\n") + lines := strings.Split(signature, "\n") + if _, err = fmt.Fprint(w, strings.Join(lines, "\n ")); err != nil { + return err + } + } + + if _, err = fmt.Fprintf(w, "\n\n%s", b.Message); err != nil { + return err + } + + return err +} + +// Stats returns the stats of a commit. +func (c *Commit) Stats() (FileStats, error) { + return c.StatsContext(context.Background()) +} + +// StatsContext returns the stats of a commit. Error will be return if context +// expires. Provided context must be non-nil. +func (c *Commit) StatsContext(ctx context.Context) (FileStats, error) { + fromTree, err := c.Tree() + if err != nil { + return nil, err + } + + toTree := &Tree{} + if c.NumParents() != 0 { + firstParent, err := c.Parents().Next() + if err != nil { + return nil, err + } + + toTree, err = firstParent.Tree() + if err != nil { + return nil, err + } + } + + patch, err := toTree.PatchContext(ctx, fromTree) + if err != nil { + return nil, err + } + + return getFileStatsFromFilePatches(patch.FilePatches()), nil +} + +func (c *Commit) String() string { + return fmt.Sprintf( + "%s %s\nAuthor: %s\nDate: %s\n\n%s\n", + plumbing.CommitObject, c.Hash, c.Author.String(), + c.Author.When.Format(DateFormat), indent(c.Message), + ) +} + +// Verify performs PGP verification of the commit with a provided armored +// keyring and returns openpgp.Entity associated with verifying key on success. +func (c *Commit) Verify(armoredKeyRing string) (*openpgp.Entity, error) { + keyRingReader := strings.NewReader(armoredKeyRing) + keyring, err := openpgp.ReadArmoredKeyRing(keyRingReader) + if err != nil { + return nil, err + } + + // Extract signature. + signature := strings.NewReader(c.PGPSignature) + + encoded := &plumbing.MemoryObject{} + // Encode commit components, excluding signature and get a reader object. + if err := c.EncodeWithoutSignature(encoded); err != nil { + return nil, err + } + er, err := encoded.Reader() + if err != nil { + return nil, err + } + + return openpgp.CheckArmoredDetachedSignature(keyring, er, signature) +} + +func indent(t string) string { + var output []string + for _, line := range strings.Split(t, "\n") { + if len(line) != 0 { + line = " " + line + } + + output = append(output, line) + } + + return strings.Join(output, "\n") +} + +// CommitIter is a generic closable interface for iterating over commits. +type CommitIter interface { + Next() (*Commit, error) + ForEach(func(*Commit) error) error + Close() +} + +// storerCommitIter provides an iterator from commits in an EncodedObjectStorer. +type storerCommitIter struct { + storer.EncodedObjectIter + s storer.EncodedObjectStorer +} + +// NewCommitIter takes a storer.EncodedObjectStorer and a +// storer.EncodedObjectIter and returns a CommitIter that iterates over all +// commits contained in the storer.EncodedObjectIter. +// +// Any non-commit object returned by the storer.EncodedObjectIter is skipped. +func NewCommitIter(s storer.EncodedObjectStorer, iter storer.EncodedObjectIter) CommitIter { + return &storerCommitIter{iter, s} +} + +// Next moves the iterator to the next commit and returns a pointer to it. If +// there are no more commits, it returns io.EOF. +func (iter *storerCommitIter) Next() (*Commit, error) { + obj, err := iter.EncodedObjectIter.Next() + if err != nil { + return nil, err + } + + return DecodeCommit(iter.s, obj) +} + +// ForEach call the cb function for each commit contained on this iter until +// an error appends or the end of the iter is reached. If ErrStop is sent +// the iteration is stopped but no error is returned. The iterator is closed. +func (iter *storerCommitIter) ForEach(cb func(*Commit) error) error { + return iter.EncodedObjectIter.ForEach(func(obj plumbing.EncodedObject) error { + c, err := DecodeCommit(iter.s, obj) + if err != nil { + return err + } + + return cb(c) + }) +} + +func (iter *storerCommitIter) Close() { + iter.EncodedObjectIter.Close() +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker.go new file mode 100644 index 000000000..a96b6a4cf --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker.go @@ -0,0 +1,327 @@ +package object + +import ( + "container/list" + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/storage" +) + +type commitPreIterator struct { + seenExternal map[plumbing.Hash]bool + seen map[plumbing.Hash]bool + stack []CommitIter + start *Commit +} + +// NewCommitPreorderIter returns a CommitIter that walks the commit history, +// starting at the given commit and visiting its parents in pre-order. +// The given callback will be called for each visited commit. Each commit will +// be visited only once. If the callback returns an error, walking will stop +// and will return the error. Other errors might be returned if the history +// cannot be traversed (e.g. missing objects). Ignore allows to skip some +// commits from being iterated. +func NewCommitPreorderIter( + c *Commit, + seenExternal map[plumbing.Hash]bool, + ignore []plumbing.Hash, +) CommitIter { + seen := make(map[plumbing.Hash]bool) + for _, h := range ignore { + seen[h] = true + } + + return &commitPreIterator{ + seenExternal: seenExternal, + seen: seen, + stack: make([]CommitIter, 0), + start: c, + } +} + +func (w *commitPreIterator) Next() (*Commit, error) { + var c *Commit + for { + if w.start != nil { + c = w.start + w.start = nil + } else { + current := len(w.stack) - 1 + if current < 0 { + return nil, io.EOF + } + + var err error + c, err = w.stack[current].Next() + if err == io.EOF { + w.stack = w.stack[:current] + continue + } + + if err != nil { + return nil, err + } + } + + if w.seen[c.Hash] || w.seenExternal[c.Hash] { + continue + } + + w.seen[c.Hash] = true + + if c.NumParents() > 0 { + w.stack = append(w.stack, filteredParentIter(c, w.seen)) + } + + return c, nil + } +} + +func filteredParentIter(c *Commit, seen map[plumbing.Hash]bool) CommitIter { + var hashes []plumbing.Hash + for _, h := range c.ParentHashes { + if !seen[h] { + hashes = append(hashes, h) + } + } + + return NewCommitIter(c.s, + storer.NewEncodedObjectLookupIter(c.s, plumbing.CommitObject, hashes), + ) +} + +func (w *commitPreIterator) ForEach(cb func(*Commit) error) error { + for { + c, err := w.Next() + if err == io.EOF { + break + } + if err != nil { + return err + } + + err = cb(c) + if err == storer.ErrStop { + break + } + if err != nil { + return err + } + } + + return nil +} + +func (w *commitPreIterator) Close() {} + +type commitPostIterator struct { + stack []*Commit + seen map[plumbing.Hash]bool +} + +// NewCommitPostorderIter returns a CommitIter that walks the commit +// history like WalkCommitHistory but in post-order. This means that after +// walking a merge commit, the merged commit will be walked before the base +// it was merged on. This can be useful if you wish to see the history in +// chronological order. Ignore allows to skip some commits from being iterated. +func NewCommitPostorderIter(c *Commit, ignore []plumbing.Hash) CommitIter { + seen := make(map[plumbing.Hash]bool) + for _, h := range ignore { + seen[h] = true + } + + return &commitPostIterator{ + stack: []*Commit{c}, + seen: seen, + } +} + +func (w *commitPostIterator) Next() (*Commit, error) { + for { + if len(w.stack) == 0 { + return nil, io.EOF + } + + c := w.stack[len(w.stack)-1] + w.stack = w.stack[:len(w.stack)-1] + + if w.seen[c.Hash] { + continue + } + + w.seen[c.Hash] = true + + return c, c.Parents().ForEach(func(p *Commit) error { + w.stack = append(w.stack, p) + return nil + }) + } +} + +func (w *commitPostIterator) ForEach(cb func(*Commit) error) error { + for { + c, err := w.Next() + if err == io.EOF { + break + } + if err != nil { + return err + } + + err = cb(c) + if err == storer.ErrStop { + break + } + if err != nil { + return err + } + } + + return nil +} + +func (w *commitPostIterator) Close() {} + +// commitAllIterator stands for commit iterator for all refs. +type commitAllIterator struct { + // currCommit points to the current commit. + currCommit *list.Element +} + +// NewCommitAllIter returns a new commit iterator for all refs. +// repoStorer is a repo Storer used to get commits and references. +// commitIterFunc is a commit iterator function, used to iterate through ref commits in chosen order +func NewCommitAllIter(repoStorer storage.Storer, commitIterFunc func(*Commit) CommitIter) (CommitIter, error) { + commitsPath := list.New() + commitsLookup := make(map[plumbing.Hash]*list.Element) + head, err := storer.ResolveReference(repoStorer, plumbing.HEAD) + if err == nil { + err = addReference(repoStorer, commitIterFunc, head, commitsPath, commitsLookup) + } + + if err != nil && err != plumbing.ErrReferenceNotFound { + return nil, err + } + + // add all references along with the HEAD + refIter, err := repoStorer.IterReferences() + if err != nil { + return nil, err + } + defer refIter.Close() + + for { + ref, err := refIter.Next() + if err == io.EOF { + break + } + + if err == plumbing.ErrReferenceNotFound { + continue + } + + if err != nil { + return nil, err + } + + if err = addReference(repoStorer, commitIterFunc, ref, commitsPath, commitsLookup); err != nil { + return nil, err + } + } + + return &commitAllIterator{commitsPath.Front()}, nil +} + +func addReference( + repoStorer storage.Storer, + commitIterFunc func(*Commit) CommitIter, + ref *plumbing.Reference, + commitsPath *list.List, + commitsLookup map[plumbing.Hash]*list.Element) error { + + _, exists := commitsLookup[ref.Hash()] + if exists { + // we already have it - skip the reference. + return nil + } + + refCommit, _ := GetCommit(repoStorer, ref.Hash()) + if refCommit == nil { + // if it's not a commit - skip it. + return nil + } + + var ( + refCommits []*Commit + parent *list.Element + ) + // collect all ref commits to add + commitIter := commitIterFunc(refCommit) + for c, e := commitIter.Next(); e == nil; { + parent, exists = commitsLookup[c.Hash] + if exists { + break + } + refCommits = append(refCommits, c) + c, e = commitIter.Next() + } + commitIter.Close() + + if parent == nil { + // common parent - not found + // add all commits to the path from this ref (maybe it's a HEAD and we don't have anything, yet) + for _, c := range refCommits { + parent = commitsPath.PushBack(c) + commitsLookup[c.Hash] = parent + } + } else { + // add ref's commits to the path in reverse order (from the latest) + for i := len(refCommits) - 1; i >= 0; i-- { + c := refCommits[i] + // insert before found common parent + parent = commitsPath.InsertBefore(c, parent) + commitsLookup[c.Hash] = parent + } + } + + return nil +} + +func (it *commitAllIterator) Next() (*Commit, error) { + if it.currCommit == nil { + return nil, io.EOF + } + + c := it.currCommit.Value.(*Commit) + it.currCommit = it.currCommit.Next() + + return c, nil +} + +func (it *commitAllIterator) ForEach(cb func(*Commit) error) error { + for { + c, err := it.Next() + if err == io.EOF { + break + } + if err != nil { + return err + } + + err = cb(c) + if err == storer.ErrStop { + break + } + if err != nil { + return err + } + } + + return nil +} + +func (it *commitAllIterator) Close() { + it.currCommit = nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_bfs.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_bfs.go new file mode 100644 index 000000000..8047fa9bc --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_bfs.go @@ -0,0 +1,100 @@ +package object + +import ( + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/storer" +) + +type bfsCommitIterator struct { + seenExternal map[plumbing.Hash]bool + seen map[plumbing.Hash]bool + queue []*Commit +} + +// NewCommitIterBSF returns a CommitIter that walks the commit history, +// starting at the given commit and visiting its parents in pre-order. +// The given callback will be called for each visited commit. Each commit will +// be visited only once. If the callback returns an error, walking will stop +// and will return the error. Other errors might be returned if the history +// cannot be traversed (e.g. missing objects). Ignore allows to skip some +// commits from being iterated. +func NewCommitIterBSF( + c *Commit, + seenExternal map[plumbing.Hash]bool, + ignore []plumbing.Hash, +) CommitIter { + seen := make(map[plumbing.Hash]bool) + for _, h := range ignore { + seen[h] = true + } + + return &bfsCommitIterator{ + seenExternal: seenExternal, + seen: seen, + queue: []*Commit{c}, + } +} + +func (w *bfsCommitIterator) appendHash(store storer.EncodedObjectStorer, h plumbing.Hash) error { + if w.seen[h] || w.seenExternal[h] { + return nil + } + c, err := GetCommit(store, h) + if err != nil { + return err + } + w.queue = append(w.queue, c) + return nil +} + +func (w *bfsCommitIterator) Next() (*Commit, error) { + var c *Commit + for { + if len(w.queue) == 0 { + return nil, io.EOF + } + c = w.queue[0] + w.queue = w.queue[1:] + + if w.seen[c.Hash] || w.seenExternal[c.Hash] { + continue + } + + w.seen[c.Hash] = true + + for _, h := range c.ParentHashes { + err := w.appendHash(c.s, h) + if err != nil { + return nil, err + } + } + + return c, nil + } +} + +func (w *bfsCommitIterator) ForEach(cb func(*Commit) error) error { + for { + c, err := w.Next() + if err == io.EOF { + break + } + if err != nil { + return err + } + + err = cb(c) + if err == storer.ErrStop { + break + } + if err != nil { + return err + } + } + + return nil +} + +func (w *bfsCommitIterator) Close() {} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_bfs_filtered.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_bfs_filtered.go new file mode 100644 index 000000000..e87c3dbbb --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_bfs_filtered.go @@ -0,0 +1,176 @@ +package object + +import ( + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/storer" +) + +// NewFilterCommitIter returns a CommitIter that walks the commit history, +// starting at the passed commit and visiting its parents in Breadth-first order. +// The commits returned by the CommitIter will validate the passed CommitFilter. +// The history won't be transversed beyond a commit if isLimit is true for it. +// Each commit will be visited only once. +// If the commit history can not be traversed, or the Close() method is called, +// the CommitIter won't return more commits. +// If no isValid is passed, all ancestors of from commit will be valid. +// If no isLimit is limit, all ancestors of all commits will be visited. +func NewFilterCommitIter( + from *Commit, + isValid *CommitFilter, + isLimit *CommitFilter, +) CommitIter { + var validFilter CommitFilter + if isValid == nil { + validFilter = func(_ *Commit) bool { + return true + } + } else { + validFilter = *isValid + } + + var limitFilter CommitFilter + if isLimit == nil { + limitFilter = func(_ *Commit) bool { + return false + } + } else { + limitFilter = *isLimit + } + + return &filterCommitIter{ + isValid: validFilter, + isLimit: limitFilter, + visited: map[plumbing.Hash]struct{}{}, + queue: []*Commit{from}, + } +} + +// CommitFilter returns a boolean for the passed Commit +type CommitFilter func(*Commit) bool + +// filterCommitIter implements CommitIter +type filterCommitIter struct { + isValid CommitFilter + isLimit CommitFilter + visited map[plumbing.Hash]struct{} + queue []*Commit + lastErr error +} + +// Next returns the next commit of the CommitIter. +// It will return io.EOF if there are no more commits to visit, +// or an error if the history could not be traversed. +func (w *filterCommitIter) Next() (*Commit, error) { + var commit *Commit + var err error + for { + commit, err = w.popNewFromQueue() + if err != nil { + return nil, w.close(err) + } + + w.visited[commit.Hash] = struct{}{} + + if !w.isLimit(commit) { + err = w.addToQueue(commit.s, commit.ParentHashes...) + if err != nil { + return nil, w.close(err) + } + } + + if w.isValid(commit) { + return commit, nil + } + } +} + +// ForEach runs the passed callback over each Commit returned by the CommitIter +// until the callback returns an error or there is no more commits to traverse. +func (w *filterCommitIter) ForEach(cb func(*Commit) error) error { + for { + commit, err := w.Next() + if err == io.EOF { + break + } + + if err != nil { + return err + } + + if err := cb(commit); err == storer.ErrStop { + break + } else if err != nil { + return err + } + } + + return nil +} + +// Error returns the error that caused that the CommitIter is no longer returning commits +func (w *filterCommitIter) Error() error { + return w.lastErr +} + +// Close closes the CommitIter +func (w *filterCommitIter) Close() { + w.visited = map[plumbing.Hash]struct{}{} + w.queue = []*Commit{} + w.isLimit = nil + w.isValid = nil +} + +// close closes the CommitIter with an error +func (w *filterCommitIter) close(err error) error { + w.Close() + w.lastErr = err + return err +} + +// popNewFromQueue returns the first new commit from the internal fifo queue, +// or an io.EOF error if the queue is empty +func (w *filterCommitIter) popNewFromQueue() (*Commit, error) { + var first *Commit + for { + if len(w.queue) == 0 { + if w.lastErr != nil { + return nil, w.lastErr + } + + return nil, io.EOF + } + + first = w.queue[0] + w.queue = w.queue[1:] + if _, ok := w.visited[first.Hash]; ok { + continue + } + + return first, nil + } +} + +// addToQueue adds the passed commits to the internal fifo queue if they weren't seen +// or returns an error if the passed hashes could not be used to get valid commits +func (w *filterCommitIter) addToQueue( + store storer.EncodedObjectStorer, + hashes ...plumbing.Hash, +) error { + for _, hash := range hashes { + if _, ok := w.visited[hash]; ok { + continue + } + + commit, err := GetCommit(store, hash) + if err != nil { + return err + } + + w.queue = append(w.queue, commit) + } + + return nil +} + diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_ctime.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_ctime.go new file mode 100644 index 000000000..fbddf1d23 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_ctime.go @@ -0,0 +1,103 @@ +package object + +import ( + "io" + + "github.com/emirpasic/gods/trees/binaryheap" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/storer" +) + +type commitIteratorByCTime struct { + seenExternal map[plumbing.Hash]bool + seen map[plumbing.Hash]bool + heap *binaryheap.Heap +} + +// NewCommitIterCTime returns a CommitIter that walks the commit history, +// starting at the given commit and visiting its parents while preserving Committer Time order. +// this appears to be the closest order to `git log` +// The given callback will be called for each visited commit. Each commit will +// be visited only once. If the callback returns an error, walking will stop +// and will return the error. Other errors might be returned if the history +// cannot be traversed (e.g. missing objects). Ignore allows to skip some +// commits from being iterated. +func NewCommitIterCTime( + c *Commit, + seenExternal map[plumbing.Hash]bool, + ignore []plumbing.Hash, +) CommitIter { + seen := make(map[plumbing.Hash]bool) + for _, h := range ignore { + seen[h] = true + } + + heap := binaryheap.NewWith(func(a, b interface{}) int { + if a.(*Commit).Committer.When.Before(b.(*Commit).Committer.When) { + return 1 + } + return -1 + }) + heap.Push(c) + + return &commitIteratorByCTime{ + seenExternal: seenExternal, + seen: seen, + heap: heap, + } +} + +func (w *commitIteratorByCTime) Next() (*Commit, error) { + var c *Commit + for { + cIn, ok := w.heap.Pop() + if !ok { + return nil, io.EOF + } + c = cIn.(*Commit) + + if w.seen[c.Hash] || w.seenExternal[c.Hash] { + continue + } + + w.seen[c.Hash] = true + + for _, h := range c.ParentHashes { + if w.seen[h] || w.seenExternal[h] { + continue + } + pc, err := GetCommit(c.s, h) + if err != nil { + return nil, err + } + w.heap.Push(pc) + } + + return c, nil + } +} + +func (w *commitIteratorByCTime) ForEach(cb func(*Commit) error) error { + for { + c, err := w.Next() + if err == io.EOF { + break + } + if err != nil { + return err + } + + err = cb(c) + if err == storer.ErrStop { + break + } + if err != nil { + return err + } + } + + return nil +} + +func (w *commitIteratorByCTime) Close() {} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_limit.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_limit.go new file mode 100644 index 000000000..ac56a71c4 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_limit.go @@ -0,0 +1,65 @@ +package object + +import ( + "io" + "time" + + "github.com/go-git/go-git/v5/plumbing/storer" +) + +type commitLimitIter struct { + sourceIter CommitIter + limitOptions LogLimitOptions +} + +type LogLimitOptions struct { + Since *time.Time + Until *time.Time +} + +func NewCommitLimitIterFromIter(commitIter CommitIter, limitOptions LogLimitOptions) CommitIter { + iterator := new(commitLimitIter) + iterator.sourceIter = commitIter + iterator.limitOptions = limitOptions + return iterator +} + +func (c *commitLimitIter) Next() (*Commit, error) { + for { + commit, err := c.sourceIter.Next() + if err != nil { + return nil, err + } + + if c.limitOptions.Since != nil && commit.Committer.When.Before(*c.limitOptions.Since) { + continue + } + if c.limitOptions.Until != nil && commit.Committer.When.After(*c.limitOptions.Until) { + continue + } + return commit, nil + } +} + +func (c *commitLimitIter) ForEach(cb func(*Commit) error) error { + for { + commit, nextErr := c.Next() + if nextErr == io.EOF { + break + } + if nextErr != nil { + return nextErr + } + err := cb(commit) + if err == storer.ErrStop { + return nil + } else if err != nil { + return err + } + } + return nil +} + +func (c *commitLimitIter) Close() { + c.sourceIter.Close() +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_path.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_path.go new file mode 100644 index 000000000..af6f745d2 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_path.go @@ -0,0 +1,161 @@ +package object + +import ( + "io" + + "github.com/go-git/go-git/v5/plumbing" + + "github.com/go-git/go-git/v5/plumbing/storer" +) + +type commitPathIter struct { + pathFilter func(string) bool + sourceIter CommitIter + currentCommit *Commit + checkParent bool +} + +// NewCommitPathIterFromIter returns a commit iterator which performs diffTree between +// successive trees returned from the commit iterator from the argument. The purpose of this is +// to find the commits that explain how the files that match the path came to be. +// If checkParent is true then the function double checks if potential parent (next commit in a path) +// is one of the parents in the tree (it's used by `git log --all`). +// pathFilter is a function that takes path of file as argument and returns true if we want it +func NewCommitPathIterFromIter(pathFilter func(string) bool, commitIter CommitIter, checkParent bool) CommitIter { + iterator := new(commitPathIter) + iterator.sourceIter = commitIter + iterator.pathFilter = pathFilter + iterator.checkParent = checkParent + return iterator +} + +// this function is kept for compatibilty, can be replaced with NewCommitPathIterFromIter +func NewCommitFileIterFromIter(fileName string, commitIter CommitIter, checkParent bool) CommitIter { + return NewCommitPathIterFromIter( + func(path string) bool { + return path == fileName + }, + commitIter, + checkParent, + ) +} + +func (c *commitPathIter) Next() (*Commit, error) { + if c.currentCommit == nil { + var err error + c.currentCommit, err = c.sourceIter.Next() + if err != nil { + return nil, err + } + } + commit, commitErr := c.getNextFileCommit() + + // Setting current-commit to nil to prevent unwanted states when errors are raised + if commitErr != nil { + c.currentCommit = nil + } + return commit, commitErr +} + +func (c *commitPathIter) getNextFileCommit() (*Commit, error) { + for { + // Parent-commit can be nil if the current-commit is the initial commit + parentCommit, parentCommitErr := c.sourceIter.Next() + if parentCommitErr != nil { + // If the parent-commit is beyond the initial commit, keep it nil + if parentCommitErr != io.EOF { + return nil, parentCommitErr + } + parentCommit = nil + } + + // Fetch the trees of the current and parent commits + currentTree, currTreeErr := c.currentCommit.Tree() + if currTreeErr != nil { + return nil, currTreeErr + } + + var parentTree *Tree + if parentCommit != nil { + var parentTreeErr error + parentTree, parentTreeErr = parentCommit.Tree() + if parentTreeErr != nil { + return nil, parentTreeErr + } + } + + // Find diff between current and parent trees + changes, diffErr := DiffTree(currentTree, parentTree) + if diffErr != nil { + return nil, diffErr + } + + found := c.hasFileChange(changes, parentCommit) + + // Storing the current-commit in-case a change is found, and + // Updating the current-commit for the next-iteration + prevCommit := c.currentCommit + c.currentCommit = parentCommit + + if found { + return prevCommit, nil + } + + // If not matches found and if parent-commit is beyond the initial commit, then return with EOF + if parentCommit == nil { + return nil, io.EOF + } + } +} + +func (c *commitPathIter) hasFileChange(changes Changes, parent *Commit) bool { + for _, change := range changes { + if !c.pathFilter(change.name()) { + continue + } + + // filename matches, now check if source iterator contains all commits (from all refs) + if c.checkParent { + if parent != nil && isParentHash(parent.Hash, c.currentCommit) { + return true + } + continue + } + + return true + } + + return false +} + +func isParentHash(hash plumbing.Hash, commit *Commit) bool { + for _, h := range commit.ParentHashes { + if h == hash { + return true + } + } + return false +} + +func (c *commitPathIter) ForEach(cb func(*Commit) error) error { + for { + commit, nextErr := c.Next() + if nextErr == io.EOF { + break + } + if nextErr != nil { + return nextErr + } + err := cb(commit) + if err == storer.ErrStop { + return nil + } else if err != nil { + return err + } + } + return nil +} + +func (c *commitPathIter) Close() { + c.sourceIter.Close() +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/common.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/common.go new file mode 100644 index 000000000..3591f5f0a --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/common.go @@ -0,0 +1,12 @@ +package object + +import ( + "bufio" + "sync" +) + +var bufPool = sync.Pool{ + New: func() interface{} { + return bufio.NewReader(nil) + }, +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/difftree.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/difftree.go new file mode 100644 index 000000000..7c2222702 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/difftree.go @@ -0,0 +1,98 @@ +package object + +import ( + "bytes" + "context" + + "github.com/go-git/go-git/v5/utils/merkletrie" + "github.com/go-git/go-git/v5/utils/merkletrie/noder" +) + +// DiffTree compares the content and mode of the blobs found via two +// tree objects. +// DiffTree does not perform rename detection, use DiffTreeWithOptions +// instead to detect renames. +func DiffTree(a, b *Tree) (Changes, error) { + return DiffTreeContext(context.Background(), a, b) +} + +// DiffTreeContext compares the content and mode of the blobs found via two +// tree objects. Provided context must be non-nil. +// An error will be returned if context expires. +func DiffTreeContext(ctx context.Context, a, b *Tree) (Changes, error) { + return DiffTreeWithOptions(ctx, a, b, nil) +} + +// DiffTreeOptions are the configurable options when performing a diff tree. +type DiffTreeOptions struct { + // DetectRenames is whether the diff tree will use rename detection. + DetectRenames bool + // RenameScore is the threshold to of similarity between files to consider + // that a pair of delete and insert are a rename. The number must be + // exactly between 0 and 100. + RenameScore uint + // RenameLimit is the maximum amount of files that can be compared when + // detecting renames. The number of comparisons that have to be performed + // is equal to the number of deleted files * the number of added files. + // That means, that if 100 files were deleted and 50 files were added, 5000 + // file comparisons may be needed. So, if the rename limit is 50, the number + // of both deleted and added needs to be equal or less than 50. + // A value of 0 means no limit. + RenameLimit uint + // OnlyExactRenames performs only detection of exact renames and will not perform + // any detection of renames based on file similarity. + OnlyExactRenames bool +} + +// DefaultDiffTreeOptions are the default and recommended options for the +// diff tree. +var DefaultDiffTreeOptions = &DiffTreeOptions{ + DetectRenames: true, + RenameScore: 60, + RenameLimit: 0, + OnlyExactRenames: false, +} + +// DiffTreeWithOptions compares the content and mode of the blobs found +// via two tree objects with the given options. The provided context +// must be non-nil. +// If no options are passed, no rename detection will be performed. The +// recommended options are DefaultDiffTreeOptions. +// An error will be returned if the context expires. +// This function will be deprecated and removed in v6 so the default +// behaviour of DiffTree is to detect renames. +func DiffTreeWithOptions( + ctx context.Context, + a, b *Tree, + opts *DiffTreeOptions, +) (Changes, error) { + from := NewTreeRootNode(a) + to := NewTreeRootNode(b) + + hashEqual := func(a, b noder.Hasher) bool { + return bytes.Equal(a.Hash(), b.Hash()) + } + + merkletrieChanges, err := merkletrie.DiffTreeContext(ctx, from, to, hashEqual) + if err != nil { + if err == merkletrie.ErrCanceled { + return nil, ErrCanceled + } + return nil, err + } + + changes, err := newChanges(merkletrieChanges) + if err != nil { + return nil, err + } + + if opts == nil { + opts = new(DiffTreeOptions) + } + + if opts.DetectRenames { + return DetectRenames(changes, opts) + } + + return changes, nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/file.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/file.go new file mode 100644 index 000000000..6cc5367d8 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/file.go @@ -0,0 +1,137 @@ +package object + +import ( + "bytes" + "io" + "strings" + + "github.com/go-git/go-git/v5/plumbing/filemode" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/utils/binary" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +// File represents git file objects. +type File struct { + // Name is the path of the file. It might be relative to a tree, + // depending of the function that generates it. + Name string + // Mode is the file mode. + Mode filemode.FileMode + // Blob with the contents of the file. + Blob +} + +// NewFile returns a File based on the given blob object +func NewFile(name string, m filemode.FileMode, b *Blob) *File { + return &File{Name: name, Mode: m, Blob: *b} +} + +// Contents returns the contents of a file as a string. +func (f *File) Contents() (content string, err error) { + reader, err := f.Reader() + if err != nil { + return "", err + } + defer ioutil.CheckClose(reader, &err) + + buf := new(bytes.Buffer) + if _, err := buf.ReadFrom(reader); err != nil { + return "", err + } + + return buf.String(), nil +} + +// IsBinary returns if the file is binary or not +func (f *File) IsBinary() (bin bool, err error) { + reader, err := f.Reader() + if err != nil { + return false, err + } + defer ioutil.CheckClose(reader, &err) + + return binary.IsBinary(reader) +} + +// Lines returns a slice of lines from the contents of a file, stripping +// all end of line characters. If the last line is empty (does not end +// in an end of line), it is also stripped. +func (f *File) Lines() ([]string, error) { + content, err := f.Contents() + if err != nil { + return nil, err + } + + splits := strings.Split(content, "\n") + // remove the last line if it is empty + if splits[len(splits)-1] == "" { + return splits[:len(splits)-1], nil + } + + return splits, nil +} + +// FileIter provides an iterator for the files in a tree. +type FileIter struct { + s storer.EncodedObjectStorer + w TreeWalker +} + +// NewFileIter takes a storer.EncodedObjectStorer and a Tree and returns a +// *FileIter that iterates over all files contained in the tree, recursively. +func NewFileIter(s storer.EncodedObjectStorer, t *Tree) *FileIter { + return &FileIter{s: s, w: *NewTreeWalker(t, true, nil)} +} + +// Next moves the iterator to the next file and returns a pointer to it. If +// there are no more files, it returns io.EOF. +func (iter *FileIter) Next() (*File, error) { + for { + name, entry, err := iter.w.Next() + if err != nil { + return nil, err + } + + if entry.Mode == filemode.Dir || entry.Mode == filemode.Submodule { + continue + } + + blob, err := GetBlob(iter.s, entry.Hash) + if err != nil { + return nil, err + } + + return NewFile(name, entry.Mode, blob), nil + } +} + +// ForEach call the cb function for each file contained in this iter until +// an error happens or the end of the iter is reached. If plumbing.ErrStop is sent +// the iteration is stop but no error is returned. The iterator is closed. +func (iter *FileIter) ForEach(cb func(*File) error) error { + defer iter.Close() + + for { + f, err := iter.Next() + if err != nil { + if err == io.EOF { + return nil + } + + return err + } + + if err := cb(f); err != nil { + if err == storer.ErrStop { + return nil + } + + return err + } + } +} + +func (iter *FileIter) Close() { + iter.w.Close() +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/merge_base.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/merge_base.go new file mode 100644 index 000000000..b412361d0 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/merge_base.go @@ -0,0 +1,210 @@ +package object + +import ( + "fmt" + "sort" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/storer" +) + +// errIsReachable is thrown when first commit is an ancestor of the second +var errIsReachable = fmt.Errorf("first is reachable from second") + +// MergeBase mimics the behavior of `git merge-base actual other`, returning the +// best common ancestor between the actual and the passed one. +// The best common ancestors can not be reached from other common ancestors. +func (c *Commit) MergeBase(other *Commit) ([]*Commit, error) { + // use sortedByCommitDateDesc strategy + sorted := sortByCommitDateDesc(c, other) + newer := sorted[0] + older := sorted[1] + + newerHistory, err := ancestorsIndex(older, newer) + if err == errIsReachable { + return []*Commit{older}, nil + } + + if err != nil { + return nil, err + } + + var res []*Commit + inNewerHistory := isInIndexCommitFilter(newerHistory) + resIter := NewFilterCommitIter(older, &inNewerHistory, &inNewerHistory) + _ = resIter.ForEach(func(commit *Commit) error { + res = append(res, commit) + return nil + }) + + return Independents(res) +} + +// IsAncestor returns true if the actual commit is ancestor of the passed one. +// It returns an error if the history is not transversable +// It mimics the behavior of `git merge --is-ancestor actual other` +func (c *Commit) IsAncestor(other *Commit) (bool, error) { + found := false + iter := NewCommitPreorderIter(other, nil, nil) + err := iter.ForEach(func(comm *Commit) error { + if comm.Hash != c.Hash { + return nil + } + + found = true + return storer.ErrStop + }) + + return found, err +} + +// ancestorsIndex returns a map with the ancestors of the starting commit if the +// excluded one is not one of them. It returns errIsReachable if the excluded commit +// is ancestor of the starting, or another error if the history is not traversable. +func ancestorsIndex(excluded, starting *Commit) (map[plumbing.Hash]struct{}, error) { + if excluded.Hash.String() == starting.Hash.String() { + return nil, errIsReachable + } + + startingHistory := map[plumbing.Hash]struct{}{} + startingIter := NewCommitIterBSF(starting, nil, nil) + err := startingIter.ForEach(func(commit *Commit) error { + if commit.Hash == excluded.Hash { + return errIsReachable + } + + startingHistory[commit.Hash] = struct{}{} + return nil + }) + + if err != nil { + return nil, err + } + + return startingHistory, nil +} + +// Independents returns a subset of the passed commits, that are not reachable the others +// It mimics the behavior of `git merge-base --independent commit...`. +func Independents(commits []*Commit) ([]*Commit, error) { + // use sortedByCommitDateDesc strategy + candidates := sortByCommitDateDesc(commits...) + candidates = removeDuplicated(candidates) + + seen := map[plumbing.Hash]struct{}{} + var isLimit CommitFilter = func(commit *Commit) bool { + _, ok := seen[commit.Hash] + return ok + } + + if len(candidates) < 2 { + return candidates, nil + } + + pos := 0 + for { + from := candidates[pos] + others := remove(candidates, from) + fromHistoryIter := NewFilterCommitIter(from, nil, &isLimit) + err := fromHistoryIter.ForEach(func(fromAncestor *Commit) error { + for _, other := range others { + if fromAncestor.Hash == other.Hash { + candidates = remove(candidates, other) + others = remove(others, other) + } + } + + if len(candidates) == 1 { + return storer.ErrStop + } + + seen[fromAncestor.Hash] = struct{}{} + return nil + }) + + if err != nil { + return nil, err + } + + nextPos := indexOf(candidates, from) + 1 + if nextPos >= len(candidates) { + break + } + + pos = nextPos + } + + return candidates, nil +} + +// sortByCommitDateDesc returns the passed commits, sorted by `committer.When desc` +// +// Following this strategy, it is tried to reduce the time needed when walking +// the history from one commit to reach the others. It is assumed that ancestors +// use to be committed before its descendant; +// That way `Independents(A^, A)` will be processed as being `Independents(A, A^)`; +// so starting by `A` it will be reached `A^` way sooner than walking from `A^` +// to the initial commit, and then from `A` to `A^`. +func sortByCommitDateDesc(commits ...*Commit) []*Commit { + sorted := make([]*Commit, len(commits)) + copy(sorted, commits) + sort.Slice(sorted, func(i, j int) bool { + return sorted[i].Committer.When.After(sorted[j].Committer.When) + }) + + return sorted +} + +// indexOf returns the first position where target was found in the passed commits +func indexOf(commits []*Commit, target *Commit) int { + for i, commit := range commits { + if target.Hash == commit.Hash { + return i + } + } + + return -1 +} + +// remove returns the passed commits excluding the commit toDelete +func remove(commits []*Commit, toDelete *Commit) []*Commit { + res := make([]*Commit, len(commits)) + j := 0 + for _, commit := range commits { + if commit.Hash == toDelete.Hash { + continue + } + + res[j] = commit + j++ + } + + return res[:j] +} + +// removeDuplicated removes duplicated commits from the passed slice of commits +func removeDuplicated(commits []*Commit) []*Commit { + seen := make(map[plumbing.Hash]struct{}, len(commits)) + res := make([]*Commit, len(commits)) + j := 0 + for _, commit := range commits { + if _, ok := seen[commit.Hash]; ok { + continue + } + + seen[commit.Hash] = struct{}{} + res[j] = commit + j++ + } + + return res[:j] +} + +// isInIndexCommitFilter returns a commitFilter that returns true +// if the commit is in the passed index. +func isInIndexCommitFilter(index map[plumbing.Hash]struct{}) CommitFilter { + return func(c *Commit) bool { + _, ok := index[c.Hash] + return ok + } +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/object.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/object.go new file mode 100644 index 000000000..13b1e91c9 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/object.go @@ -0,0 +1,239 @@ +// Package object contains implementations of all Git objects and utility +// functions to work with them. +package object + +import ( + "bytes" + "errors" + "fmt" + "io" + "strconv" + "time" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/storer" +) + +// ErrUnsupportedObject trigger when a non-supported object is being decoded. +var ErrUnsupportedObject = errors.New("unsupported object type") + +// Object is a generic representation of any git object. It is implemented by +// Commit, Tree, Blob, and Tag, and includes the functions that are common to +// them. +// +// Object is returned when an object can be of any type. It is frequently used +// with a type cast to acquire the specific type of object: +// +// func process(obj Object) { +// switch o := obj.(type) { +// case *Commit: +// // o is a Commit +// case *Tree: +// // o is a Tree +// case *Blob: +// // o is a Blob +// case *Tag: +// // o is a Tag +// } +// } +// +// This interface is intentionally different from plumbing.EncodedObject, which +// is a lower level interface used by storage implementations to read and write +// objects in its encoded form. +type Object interface { + ID() plumbing.Hash + Type() plumbing.ObjectType + Decode(plumbing.EncodedObject) error + Encode(plumbing.EncodedObject) error +} + +// GetObject gets an object from an object storer and decodes it. +func GetObject(s storer.EncodedObjectStorer, h plumbing.Hash) (Object, error) { + o, err := s.EncodedObject(plumbing.AnyObject, h) + if err != nil { + return nil, err + } + + return DecodeObject(s, o) +} + +// DecodeObject decodes an encoded object into an Object and associates it to +// the given object storer. +func DecodeObject(s storer.EncodedObjectStorer, o plumbing.EncodedObject) (Object, error) { + switch o.Type() { + case plumbing.CommitObject: + return DecodeCommit(s, o) + case plumbing.TreeObject: + return DecodeTree(s, o) + case plumbing.BlobObject: + return DecodeBlob(o) + case plumbing.TagObject: + return DecodeTag(s, o) + default: + return nil, plumbing.ErrInvalidType + } +} + +// DateFormat is the format being used in the original git implementation +const DateFormat = "Mon Jan 02 15:04:05 2006 -0700" + +// Signature is used to identify who and when created a commit or tag. +type Signature struct { + // Name represents a person name. It is an arbitrary string. + Name string + // Email is an email, but it cannot be assumed to be well-formed. + Email string + // When is the timestamp of the signature. + When time.Time +} + +// Decode decodes a byte slice into a signature +func (s *Signature) Decode(b []byte) { + open := bytes.LastIndexByte(b, '<') + close := bytes.LastIndexByte(b, '>') + if open == -1 || close == -1 { + return + } + + if close < open { + return + } + + s.Name = string(bytes.Trim(b[:open], " ")) + s.Email = string(b[open+1 : close]) + + hasTime := close+2 < len(b) + if hasTime { + s.decodeTimeAndTimeZone(b[close+2:]) + } +} + +// Encode encodes a Signature into a writer. +func (s *Signature) Encode(w io.Writer) error { + if _, err := fmt.Fprintf(w, "%s <%s> ", s.Name, s.Email); err != nil { + return err + } + if err := s.encodeTimeAndTimeZone(w); err != nil { + return err + } + return nil +} + +var timeZoneLength = 5 + +func (s *Signature) decodeTimeAndTimeZone(b []byte) { + space := bytes.IndexByte(b, ' ') + if space == -1 { + space = len(b) + } + + ts, err := strconv.ParseInt(string(b[:space]), 10, 64) + if err != nil { + return + } + + s.When = time.Unix(ts, 0).In(time.UTC) + var tzStart = space + 1 + if tzStart >= len(b) || tzStart+timeZoneLength > len(b) { + return + } + + timezone := string(b[tzStart : tzStart+timeZoneLength]) + tzhours, err1 := strconv.ParseInt(timezone[0:3], 10, 64) + tzmins, err2 := strconv.ParseInt(timezone[3:], 10, 64) + if err1 != nil || err2 != nil { + return + } + if tzhours < 0 { + tzmins *= -1 + } + + tz := time.FixedZone("", int(tzhours*60*60+tzmins*60)) + + s.When = s.When.In(tz) +} + +func (s *Signature) encodeTimeAndTimeZone(w io.Writer) error { + u := s.When.Unix() + if u < 0 { + u = 0 + } + _, err := fmt.Fprintf(w, "%d %s", u, s.When.Format("-0700")) + return err +} + +func (s *Signature) String() string { + return fmt.Sprintf("%s <%s>", s.Name, s.Email) +} + +// ObjectIter provides an iterator for a set of objects. +type ObjectIter struct { + storer.EncodedObjectIter + s storer.EncodedObjectStorer +} + +// NewObjectIter takes a storer.EncodedObjectStorer and a +// storer.EncodedObjectIter and returns an *ObjectIter that iterates over all +// objects contained in the storer.EncodedObjectIter. +func NewObjectIter(s storer.EncodedObjectStorer, iter storer.EncodedObjectIter) *ObjectIter { + return &ObjectIter{iter, s} +} + +// Next moves the iterator to the next object and returns a pointer to it. If +// there are no more objects, it returns io.EOF. +func (iter *ObjectIter) Next() (Object, error) { + for { + obj, err := iter.EncodedObjectIter.Next() + if err != nil { + return nil, err + } + + o, err := iter.toObject(obj) + if err == plumbing.ErrInvalidType { + continue + } + + if err != nil { + return nil, err + } + + return o, nil + } +} + +// ForEach call the cb function for each object contained on this iter until +// an error happens or the end of the iter is reached. If ErrStop is sent +// the iteration is stop but no error is returned. The iterator is closed. +func (iter *ObjectIter) ForEach(cb func(Object) error) error { + return iter.EncodedObjectIter.ForEach(func(obj plumbing.EncodedObject) error { + o, err := iter.toObject(obj) + if err == plumbing.ErrInvalidType { + return nil + } + + if err != nil { + return err + } + + return cb(o) + }) +} + +func (iter *ObjectIter) toObject(obj plumbing.EncodedObject) (Object, error) { + switch obj.Type() { + case plumbing.BlobObject: + blob := &Blob{} + return blob, blob.Decode(obj) + case plumbing.TreeObject: + tree := &Tree{s: iter.s} + return tree, tree.Decode(obj) + case plumbing.CommitObject: + commit := &Commit{} + return commit, commit.Decode(obj) + case plumbing.TagObject: + tag := &Tag{} + return tag, tag.Decode(obj) + default: + return nil, plumbing.ErrInvalidType + } +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/patch.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/patch.go new file mode 100644 index 000000000..1135a40a4 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/patch.go @@ -0,0 +1,346 @@ +package object + +import ( + "bytes" + "context" + "errors" + "fmt" + "io" + "math" + "strings" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/filemode" + fdiff "github.com/go-git/go-git/v5/plumbing/format/diff" + "github.com/go-git/go-git/v5/utils/diff" + + dmp "github.com/sergi/go-diff/diffmatchpatch" +) + +var ( + ErrCanceled = errors.New("operation canceled") +) + +func getPatch(message string, changes ...*Change) (*Patch, error) { + ctx := context.Background() + return getPatchContext(ctx, message, changes...) +} + +func getPatchContext(ctx context.Context, message string, changes ...*Change) (*Patch, error) { + var filePatches []fdiff.FilePatch + for _, c := range changes { + select { + case <-ctx.Done(): + return nil, ErrCanceled + default: + } + + fp, err := filePatchWithContext(ctx, c) + if err != nil { + return nil, err + } + + filePatches = append(filePatches, fp) + } + + return &Patch{message, filePatches}, nil +} + +func filePatchWithContext(ctx context.Context, c *Change) (fdiff.FilePatch, error) { + from, to, err := c.Files() + if err != nil { + return nil, err + } + fromContent, fIsBinary, err := fileContent(from) + if err != nil { + return nil, err + } + + toContent, tIsBinary, err := fileContent(to) + if err != nil { + return nil, err + } + + if fIsBinary || tIsBinary { + return &textFilePatch{from: c.From, to: c.To}, nil + } + + diffs := diff.Do(fromContent, toContent) + + var chunks []fdiff.Chunk + for _, d := range diffs { + select { + case <-ctx.Done(): + return nil, ErrCanceled + default: + } + + var op fdiff.Operation + switch d.Type { + case dmp.DiffEqual: + op = fdiff.Equal + case dmp.DiffDelete: + op = fdiff.Delete + case dmp.DiffInsert: + op = fdiff.Add + } + + chunks = append(chunks, &textChunk{d.Text, op}) + } + + return &textFilePatch{ + chunks: chunks, + from: c.From, + to: c.To, + }, nil + +} + +func filePatch(c *Change) (fdiff.FilePatch, error) { + return filePatchWithContext(context.Background(), c) +} + +func fileContent(f *File) (content string, isBinary bool, err error) { + if f == nil { + return + } + + isBinary, err = f.IsBinary() + if err != nil || isBinary { + return + } + + content, err = f.Contents() + + return +} + +// Patch is an implementation of fdiff.Patch interface +type Patch struct { + message string + filePatches []fdiff.FilePatch +} + +func (t *Patch) FilePatches() []fdiff.FilePatch { + return t.filePatches +} + +func (t *Patch) Message() string { + return t.message +} + +func (p *Patch) Encode(w io.Writer) error { + ue := fdiff.NewUnifiedEncoder(w, fdiff.DefaultContextLines) + + return ue.Encode(p) +} + +func (p *Patch) Stats() FileStats { + return getFileStatsFromFilePatches(p.FilePatches()) +} + +func (p *Patch) String() string { + buf := bytes.NewBuffer(nil) + err := p.Encode(buf) + if err != nil { + return fmt.Sprintf("malformed patch: %s", err.Error()) + } + + return buf.String() +} + +// changeEntryWrapper is an implementation of fdiff.File interface +type changeEntryWrapper struct { + ce ChangeEntry +} + +func (f *changeEntryWrapper) Hash() plumbing.Hash { + if !f.ce.TreeEntry.Mode.IsFile() { + return plumbing.ZeroHash + } + + return f.ce.TreeEntry.Hash +} + +func (f *changeEntryWrapper) Mode() filemode.FileMode { + return f.ce.TreeEntry.Mode +} +func (f *changeEntryWrapper) Path() string { + if !f.ce.TreeEntry.Mode.IsFile() { + return "" + } + + return f.ce.Name +} + +func (f *changeEntryWrapper) Empty() bool { + return !f.ce.TreeEntry.Mode.IsFile() +} + +// textFilePatch is an implementation of fdiff.FilePatch interface +type textFilePatch struct { + chunks []fdiff.Chunk + from, to ChangeEntry +} + +func (tf *textFilePatch) Files() (from fdiff.File, to fdiff.File) { + f := &changeEntryWrapper{tf.from} + t := &changeEntryWrapper{tf.to} + + if !f.Empty() { + from = f + } + + if !t.Empty() { + to = t + } + + return +} + +func (t *textFilePatch) IsBinary() bool { + return len(t.chunks) == 0 +} + +func (t *textFilePatch) Chunks() []fdiff.Chunk { + return t.chunks +} + +// textChunk is an implementation of fdiff.Chunk interface +type textChunk struct { + content string + op fdiff.Operation +} + +func (t *textChunk) Content() string { + return t.content +} + +func (t *textChunk) Type() fdiff.Operation { + return t.op +} + +// FileStat stores the status of changes in content of a file. +type FileStat struct { + Name string + Addition int + Deletion int +} + +func (fs FileStat) String() string { + return printStat([]FileStat{fs}) +} + +// FileStats is a collection of FileStat. +type FileStats []FileStat + +func (fileStats FileStats) String() string { + return printStat(fileStats) +} + +func printStat(fileStats []FileStat) string { + padLength := float64(len(" ")) + newlineLength := float64(len("\n")) + separatorLength := float64(len("|")) + // Soft line length limit. The text length calculation below excludes + // length of the change number. Adding that would take it closer to 80, + // but probably not more than 80, until it's a huge number. + lineLength := 72.0 + + // Get the longest filename and longest total change. + var longestLength float64 + var longestTotalChange float64 + for _, fs := range fileStats { + if int(longestLength) < len(fs.Name) { + longestLength = float64(len(fs.Name)) + } + totalChange := fs.Addition + fs.Deletion + if int(longestTotalChange) < totalChange { + longestTotalChange = float64(totalChange) + } + } + + // Parts of the output: + // |<+++/---> + // example: " main.go | 10 +++++++--- " + + // + leftTextLength := padLength + longestLength + padLength + + // <+++++/-----> + // Excluding number length here. + rightTextLength := padLength + padLength + newlineLength + + totalTextArea := leftTextLength + separatorLength + rightTextLength + heightOfHistogram := lineLength - totalTextArea + + // Scale the histogram. + var scaleFactor float64 + if longestTotalChange > heightOfHistogram { + // Scale down to heightOfHistogram. + scaleFactor = longestTotalChange / heightOfHistogram + } else { + scaleFactor = 1.0 + } + + finalOutput := "" + for _, fs := range fileStats { + addn := float64(fs.Addition) + deln := float64(fs.Deletion) + adds := strings.Repeat("+", int(math.Floor(addn/scaleFactor))) + dels := strings.Repeat("-", int(math.Floor(deln/scaleFactor))) + finalOutput += fmt.Sprintf(" %s | %d %s%s\n", fs.Name, (fs.Addition + fs.Deletion), adds, dels) + } + + return finalOutput +} + +func getFileStatsFromFilePatches(filePatches []fdiff.FilePatch) FileStats { + var fileStats FileStats + + for _, fp := range filePatches { + // ignore empty patches (binary files, submodule refs updates) + if len(fp.Chunks()) == 0 { + continue + } + + cs := FileStat{} + from, to := fp.Files() + if from == nil { + // New File is created. + cs.Name = to.Path() + } else if to == nil { + // File is deleted. + cs.Name = from.Path() + } else if from.Path() != to.Path() { + // File is renamed. Not supported. + // cs.Name = fmt.Sprintf("%s => %s", from.Path(), to.Path()) + } else { + cs.Name = from.Path() + } + + for _, chunk := range fp.Chunks() { + s := chunk.Content() + if len(s) == 0 { + continue + } + + switch chunk.Type() { + case fdiff.Add: + cs.Addition += strings.Count(s, "\n") + if s[len(s)-1] != '\n' { + cs.Addition++ + } + case fdiff.Delete: + cs.Deletion += strings.Count(s, "\n") + if s[len(s)-1] != '\n' { + cs.Deletion++ + } + } + } + + fileStats = append(fileStats, cs) + } + + return fileStats +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/rename.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/rename.go new file mode 100644 index 000000000..35af1d62d --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/rename.go @@ -0,0 +1,813 @@ +package object + +import ( + "errors" + "io" + "sort" + "strings" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/filemode" + "github.com/go-git/go-git/v5/utils/ioutil" + "github.com/go-git/go-git/v5/utils/merkletrie" +) + +// DetectRenames detects the renames in the given changes on two trees with +// the given options. It will return the given changes grouping additions and +// deletions into modifications when possible. +// If options is nil, the default diff tree options will be used. +func DetectRenames( + changes Changes, + opts *DiffTreeOptions, +) (Changes, error) { + if opts == nil { + opts = DefaultDiffTreeOptions + } + + detector := &renameDetector{ + renameScore: int(opts.RenameScore), + renameLimit: int(opts.RenameLimit), + onlyExact: opts.OnlyExactRenames, + } + + for _, c := range changes { + action, err := c.Action() + if err != nil { + return nil, err + } + + switch action { + case merkletrie.Insert: + detector.added = append(detector.added, c) + case merkletrie.Delete: + detector.deleted = append(detector.deleted, c) + default: + detector.modified = append(detector.modified, c) + } + } + + return detector.detect() +} + +// renameDetector will detect and resolve renames in a set of changes. +// see: https://github.com/eclipse/jgit/blob/master/org.eclipse.jgit/src/org/eclipse/jgit/diff/RenameDetector.java +type renameDetector struct { + added []*Change + deleted []*Change + modified []*Change + + renameScore int + renameLimit int + onlyExact bool +} + +// detectExactRenames detects matches files that were deleted with files that +// were added where the hash is the same on both. If there are multiple targets +// the one with the most similar path will be chosen as the rename and the +// rest as either deletions or additions. +func (d *renameDetector) detectExactRenames() { + added := groupChangesByHash(d.added) + deletes := groupChangesByHash(d.deleted) + var uniqueAdds []*Change + var nonUniqueAdds [][]*Change + var addedLeft []*Change + + for _, cs := range added { + if len(cs) == 1 { + uniqueAdds = append(uniqueAdds, cs[0]) + } else { + nonUniqueAdds = append(nonUniqueAdds, cs) + } + } + + for _, c := range uniqueAdds { + hash := changeHash(c) + deleted := deletes[hash] + + if len(deleted) == 1 { + if sameMode(c, deleted[0]) { + d.modified = append(d.modified, &Change{From: deleted[0].From, To: c.To}) + delete(deletes, hash) + } else { + addedLeft = append(addedLeft, c) + } + } else if len(deleted) > 1 { + bestMatch := bestNameMatch(c, deleted) + if bestMatch != nil && sameMode(c, bestMatch) { + d.modified = append(d.modified, &Change{From: bestMatch.From, To: c.To}) + delete(deletes, hash) + + var newDeletes = make([]*Change, 0, len(deleted)-1) + for _, d := range deleted { + if d != bestMatch { + newDeletes = append(newDeletes, d) + } + } + deletes[hash] = newDeletes + } + } else { + addedLeft = append(addedLeft, c) + } + } + + for _, added := range nonUniqueAdds { + hash := changeHash(added[0]) + deleted := deletes[hash] + + if len(deleted) == 1 { + deleted := deleted[0] + bestMatch := bestNameMatch(deleted, added) + if bestMatch != nil && sameMode(deleted, bestMatch) { + d.modified = append(d.modified, &Change{From: deleted.From, To: bestMatch.To}) + delete(deletes, hash) + + for _, c := range added { + if c != bestMatch { + addedLeft = append(addedLeft, c) + } + } + } else { + addedLeft = append(addedLeft, added...) + } + } else if len(deleted) > 1 { + maxSize := len(deleted) * len(added) + if d.renameLimit > 0 && d.renameLimit < maxSize { + maxSize = d.renameLimit + } + + matrix := make(similarityMatrix, 0, maxSize) + + for delIdx, del := range deleted { + deletedName := changeName(del) + + for addIdx, add := range added { + addedName := changeName(add) + + score := nameSimilarityScore(addedName, deletedName) + matrix = append(matrix, similarityPair{added: addIdx, deleted: delIdx, score: score}) + + if len(matrix) >= maxSize { + break + } + } + + if len(matrix) >= maxSize { + break + } + } + + sort.Stable(matrix) + + usedAdds := make(map[*Change]struct{}) + usedDeletes := make(map[*Change]struct{}) + for i := len(matrix) - 1; i >= 0; i-- { + del := deleted[matrix[i].deleted] + add := added[matrix[i].added] + + if add == nil || del == nil { + // it was already matched + continue + } + + usedAdds[add] = struct{}{} + usedDeletes[del] = struct{}{} + d.modified = append(d.modified, &Change{From: del.From, To: add.To}) + added[matrix[i].added] = nil + deleted[matrix[i].deleted] = nil + } + + for _, c := range added { + if _, ok := usedAdds[c]; !ok && c != nil { + addedLeft = append(addedLeft, c) + } + } + + var newDeletes = make([]*Change, 0, len(deleted)-len(usedDeletes)) + for _, c := range deleted { + if _, ok := usedDeletes[c]; !ok && c != nil { + newDeletes = append(newDeletes, c) + } + } + deletes[hash] = newDeletes + } else { + addedLeft = append(addedLeft, added...) + } + } + + d.added = addedLeft + d.deleted = nil + for _, dels := range deletes { + d.deleted = append(d.deleted, dels...) + } +} + +// detectContentRenames detects renames based on the similarity of the content +// in the files by building a matrix of pairs between sources and destinations +// and matching by the highest score. +// see: https://github.com/eclipse/jgit/blob/master/org.eclipse.jgit/src/org/eclipse/jgit/diff/SimilarityRenameDetector.java +func (d *renameDetector) detectContentRenames() error { + cnt := max(len(d.added), len(d.deleted)) + if d.renameLimit > 0 && cnt > d.renameLimit { + return nil + } + + srcs, dsts := d.deleted, d.added + matrix, err := buildSimilarityMatrix(srcs, dsts, d.renameScore) + if err != nil { + return err + } + renames := make([]*Change, 0, min(len(matrix), len(dsts))) + + // Match rename pairs on a first come, first serve basis until + // we have looked at everything that is above the minimum score. + for i := len(matrix) - 1; i >= 0; i-- { + pair := matrix[i] + src := srcs[pair.deleted] + dst := dsts[pair.added] + + if dst == nil || src == nil { + // It was already matched before + continue + } + + renames = append(renames, &Change{From: src.From, To: dst.To}) + + // Claim destination and source as matched + dsts[pair.added] = nil + srcs[pair.deleted] = nil + } + + d.modified = append(d.modified, renames...) + d.added = compactChanges(dsts) + d.deleted = compactChanges(srcs) + + return nil +} + +func (d *renameDetector) detect() (Changes, error) { + if len(d.added) > 0 && len(d.deleted) > 0 { + d.detectExactRenames() + + if !d.onlyExact { + if err := d.detectContentRenames(); err != nil { + return nil, err + } + } + } + + result := make(Changes, 0, len(d.added)+len(d.deleted)+len(d.modified)) + result = append(result, d.added...) + result = append(result, d.deleted...) + result = append(result, d.modified...) + + sort.Stable(result) + + return result, nil +} + +func bestNameMatch(change *Change, changes []*Change) *Change { + var best *Change + var bestScore int + + cname := changeName(change) + + for _, c := range changes { + score := nameSimilarityScore(cname, changeName(c)) + if score > bestScore { + bestScore = score + best = c + } + } + + return best +} + +func nameSimilarityScore(a, b string) int { + aDirLen := strings.LastIndexByte(a, '/') + 1 + bDirLen := strings.LastIndexByte(b, '/') + 1 + + dirMin := min(aDirLen, bDirLen) + dirMax := max(aDirLen, bDirLen) + + var dirScoreLtr, dirScoreRtl int + if dirMax == 0 { + dirScoreLtr = 100 + dirScoreRtl = 100 + } else { + var dirSim int + + for ; dirSim < dirMin; dirSim++ { + if a[dirSim] != b[dirSim] { + break + } + } + + dirScoreLtr = dirSim * 100 / dirMax + + if dirScoreLtr == 100 { + dirScoreRtl = 100 + } else { + for dirSim = 0; dirSim < dirMin; dirSim++ { + if a[aDirLen-1-dirSim] != b[bDirLen-1-dirSim] { + break + } + } + dirScoreRtl = dirSim * 100 / dirMax + } + } + + fileMin := min(len(a)-aDirLen, len(b)-bDirLen) + fileMax := max(len(a)-aDirLen, len(b)-bDirLen) + + fileSim := 0 + for ; fileSim < fileMin; fileSim++ { + if a[len(a)-1-fileSim] != b[len(b)-1-fileSim] { + break + } + } + fileScore := fileSim * 100 / fileMax + + return (((dirScoreLtr + dirScoreRtl) * 25) + (fileScore * 50)) / 100 +} + +func changeName(c *Change) string { + if c.To != empty { + return c.To.Name + } + return c.From.Name +} + +func changeHash(c *Change) plumbing.Hash { + if c.To != empty { + return c.To.TreeEntry.Hash + } + + return c.From.TreeEntry.Hash +} + +func changeMode(c *Change) filemode.FileMode { + if c.To != empty { + return c.To.TreeEntry.Mode + } + + return c.From.TreeEntry.Mode +} + +func sameMode(a, b *Change) bool { + return changeMode(a) == changeMode(b) +} + +func groupChangesByHash(changes []*Change) map[plumbing.Hash][]*Change { + var result = make(map[plumbing.Hash][]*Change) + for _, c := range changes { + hash := changeHash(c) + result[hash] = append(result[hash], c) + } + return result +} + +type similarityMatrix []similarityPair + +func (m similarityMatrix) Len() int { return len(m) } +func (m similarityMatrix) Swap(i, j int) { m[i], m[j] = m[j], m[i] } +func (m similarityMatrix) Less(i, j int) bool { + if m[i].score == m[j].score { + if m[i].added == m[j].added { + return m[i].deleted < m[j].deleted + } + return m[i].added < m[j].added + } + return m[i].score < m[j].score +} + +type similarityPair struct { + // index of the added file + added int + // index of the deleted file + deleted int + // similarity score + score int +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} + +func min(a, b int) int { + if a < b { + return a + } + return b +} + +func buildSimilarityMatrix(srcs, dsts []*Change, renameScore int) (similarityMatrix, error) { + // Allocate for the worst-case scenario where every pair has a score + // that we need to consider. We might not need that many. + matrix := make(similarityMatrix, 0, len(srcs)*len(dsts)) + srcSizes := make([]int64, len(srcs)) + dstSizes := make([]int64, len(dsts)) + dstTooLarge := make(map[int]bool) + + // Consider each pair of files, if the score is above the minimum + // threshold we need to record that scoring in the matrix so we can + // later find the best matches. +outerLoop: + for srcIdx, src := range srcs { + if changeMode(src) != filemode.Regular { + continue + } + + // Declare the from file and the similarity index here to be able to + // reuse it inside the inner loop. The reason to not initialize them + // here is so we can skip the initialization in case they happen to + // not be needed later. They will be initialized inside the inner + // loop if and only if they're needed and reused in subsequent passes. + var from *File + var s *similarityIndex + var err error + for dstIdx, dst := range dsts { + if changeMode(dst) != filemode.Regular { + continue + } + + if dstTooLarge[dstIdx] { + continue + } + + var to *File + srcSize := srcSizes[srcIdx] + if srcSize == 0 { + from, _, err = src.Files() + if err != nil { + return nil, err + } + srcSize = from.Size + 1 + srcSizes[srcIdx] = srcSize + } + + dstSize := dstSizes[dstIdx] + if dstSize == 0 { + _, to, err = dst.Files() + if err != nil { + return nil, err + } + dstSize = to.Size + 1 + dstSizes[dstIdx] = dstSize + } + + min, max := srcSize, dstSize + if dstSize < srcSize { + min = dstSize + max = srcSize + } + + if int(min*100/max) < renameScore { + // File sizes are too different to be a match + continue + } + + if s == nil { + s, err = fileSimilarityIndex(from) + if err != nil { + if err == errIndexFull { + continue outerLoop + } + return nil, err + } + } + + if to == nil { + _, to, err = dst.Files() + if err != nil { + return nil, err + } + } + + di, err := fileSimilarityIndex(to) + if err != nil { + if err == errIndexFull { + dstTooLarge[dstIdx] = true + } + + return nil, err + } + + contentScore := s.score(di, 10000) + // The name score returns a value between 0 and 100, so we need to + // convert it to the same range as the content score. + nameScore := nameSimilarityScore(src.From.Name, dst.To.Name) * 100 + score := (contentScore*99 + nameScore*1) / 10000 + + if score < renameScore { + continue + } + + matrix = append(matrix, similarityPair{added: dstIdx, deleted: srcIdx, score: score}) + } + } + + sort.Stable(matrix) + + return matrix, nil +} + +func compactChanges(changes []*Change) []*Change { + var result []*Change + for _, c := range changes { + if c != nil { + result = append(result, c) + } + } + return result +} + +const ( + keyShift = 32 + maxCountValue = (1 << keyShift) - 1 +) + +var errIndexFull = errors.New("index is full") + +// similarityIndex is an index structure of lines/blocks in one file. +// This structure can be used to compute an approximation of the similarity +// between two files. +// To save space in memory, this index uses a space efficient encoding which +// will not exceed 1MiB per instance. The index starts out at a smaller size +// (closer to 2KiB), but may grow as more distinct blocks withing the scanned +// file are discovered. +// see: https://github.com/eclipse/jgit/blob/master/org.eclipse.jgit/src/org/eclipse/jgit/diff/SimilarityIndex.java +type similarityIndex struct { + hashed uint64 + // number of non-zero entries in hashes + numHashes int + growAt int + hashes []keyCountPair + hashBits int +} + +func fileSimilarityIndex(f *File) (*similarityIndex, error) { + idx := newSimilarityIndex() + if err := idx.hash(f); err != nil { + return nil, err + } + + sort.Stable(keyCountPairs(idx.hashes)) + + return idx, nil +} + +func newSimilarityIndex() *similarityIndex { + return &similarityIndex{ + hashBits: 8, + hashes: make([]keyCountPair, 1<<8), + growAt: shouldGrowAt(8), + } +} + +func (i *similarityIndex) hash(f *File) error { + isBin, err := f.IsBinary() + if err != nil { + return err + } + + r, err := f.Reader() + if err != nil { + return err + } + + defer ioutil.CheckClose(r, &err) + + return i.hashContent(r, f.Size, isBin) +} + +func (i *similarityIndex) hashContent(r io.Reader, size int64, isBin bool) error { + var buf = make([]byte, 4096) + var ptr, cnt int + remaining := size + + for 0 < remaining { + hash := 5381 + var blockHashedCnt uint64 + + // Hash one line or block, whatever happens first + n := int64(0) + for { + if ptr == cnt { + ptr = 0 + var err error + cnt, err = io.ReadFull(r, buf) + if err != nil && err != io.ErrUnexpectedEOF { + return err + } + + if cnt == 0 { + return io.EOF + } + } + n++ + c := buf[ptr] & 0xff + ptr++ + + // Ignore CR in CRLF sequence if it's text + if !isBin && c == '\r' && ptr < cnt && buf[ptr] == '\n' { + continue + } + blockHashedCnt++ + + if c == '\n' { + break + } + + hash = (hash << 5) + hash + int(c) + + if n >= 64 || n >= remaining { + break + } + } + i.hashed += blockHashedCnt + if err := i.add(hash, blockHashedCnt); err != nil { + return err + } + remaining -= n + } + + return nil +} + +// score computes the similarity score between this index and another one. +// A region of a file is defined as a line in a text file or a fixed-size +// block in a binary file. To prepare an index, each region in the file is +// hashed; the values and counts of hashes are retained in a sorted table. +// Define the similarity fraction F as the count of matching regions between +// the two files divided between the maximum count of regions in either file. +// The similarity score is F multiplied by the maxScore constant, yielding a +// range [0, maxScore]. It is defined as maxScore for the degenerate case of +// two empty files. +// The similarity score is symmetrical; i.e. a.score(b) == b.score(a). +func (i *similarityIndex) score(other *similarityIndex, maxScore int) int { + var maxHashed = i.hashed + if maxHashed < other.hashed { + maxHashed = other.hashed + } + if maxHashed == 0 { + return maxScore + } + + return int(i.common(other) * uint64(maxScore) / maxHashed) +} + +func (i *similarityIndex) common(dst *similarityIndex) uint64 { + srcIdx, dstIdx := 0, 0 + if i.numHashes == 0 || dst.numHashes == 0 { + return 0 + } + + var common uint64 + srcKey, dstKey := i.hashes[srcIdx].key(), dst.hashes[dstIdx].key() + + for { + if srcKey == dstKey { + srcCnt, dstCnt := i.hashes[srcIdx].count(), dst.hashes[dstIdx].count() + if srcCnt < dstCnt { + common += srcCnt + } else { + common += dstCnt + } + + srcIdx++ + if srcIdx == len(i.hashes) { + break + } + srcKey = i.hashes[srcIdx].key() + + dstIdx++ + if dstIdx == len(dst.hashes) { + break + } + dstKey = dst.hashes[dstIdx].key() + } else if srcKey < dstKey { + // Region of src that is not in dst + srcIdx++ + if srcIdx == len(i.hashes) { + break + } + srcKey = i.hashes[srcIdx].key() + } else { + // Region of dst that is not in src + dstIdx++ + if dstIdx == len(dst.hashes) { + break + } + dstKey = dst.hashes[dstIdx].key() + } + } + + return common +} + +func (i *similarityIndex) add(key int, cnt uint64) error { + key = int(uint32(key)*0x9e370001 >> 1) + + j := i.slot(key) + for { + v := i.hashes[j] + if v == 0 { + // It's an empty slot, so we can store it here. + if i.growAt <= i.numHashes { + if err := i.grow(); err != nil { + return err + } + j = i.slot(key) + continue + } + + var err error + i.hashes[j], err = newKeyCountPair(key, cnt) + if err != nil { + return err + } + i.numHashes++ + return nil + } else if v.key() == key { + // It's the same key, so increment the counter. + var err error + i.hashes[j], err = newKeyCountPair(key, v.count()+cnt) + if err != nil { + return err + } + return nil + } else if j+1 >= len(i.hashes) { + j = 0 + } else { + j++ + } + } +} + +type keyCountPair uint64 + +func newKeyCountPair(key int, cnt uint64) (keyCountPair, error) { + if cnt > maxCountValue { + return 0, errIndexFull + } + + return keyCountPair((uint64(key) << keyShift) | cnt), nil +} + +func (p keyCountPair) key() int { + return int(p >> keyShift) +} + +func (p keyCountPair) count() uint64 { + return uint64(p) & maxCountValue +} + +func (i *similarityIndex) slot(key int) int { + // We use 31 - hashBits because the upper bit was already forced + // to be 0 and we want the remaining high bits to be used as the + // table slot. + return int(uint32(key) >> uint(31 - i.hashBits)) +} + +func shouldGrowAt(hashBits int) int { + return (1 << uint(hashBits)) * (hashBits - 3) / hashBits +} + +func (i *similarityIndex) grow() error { + if i.hashBits == 30 { + return errIndexFull + } + + old := i.hashes + + i.hashBits++ + i.growAt = shouldGrowAt(i.hashBits) + + // TODO(erizocosmico): find a way to check if it will OOM and return + // errIndexFull instead. + i.hashes = make([]keyCountPair, 1<= len(i.hashes) { + j = 0 + } + } + i.hashes[j] = v + } + } + + return nil +} + +type keyCountPairs []keyCountPair + +func (p keyCountPairs) Len() int { return len(p) } +func (p keyCountPairs) Swap(i, j int) { p[i], p[j] = p[j], p[i] } +func (p keyCountPairs) Less(i, j int) bool { return p[i] < p[j] } diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/tag.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/tag.go new file mode 100644 index 000000000..464165804 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/tag.go @@ -0,0 +1,357 @@ +package object + +import ( + "bufio" + "bytes" + "fmt" + "io" + stdioutil "io/ioutil" + "strings" + + "golang.org/x/crypto/openpgp" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +// Tag represents an annotated tag object. It points to a single git object of +// any type, but tags typically are applied to commit or blob objects. It +// provides a reference that associates the target with a tag name. It also +// contains meta-information about the tag, including the tagger, tag date and +// message. +// +// Note that this is not used for lightweight tags. +// +// https://git-scm.com/book/en/v2/Git-Internals-Git-References#Tags +type Tag struct { + // Hash of the tag. + Hash plumbing.Hash + // Name of the tag. + Name string + // Tagger is the one who created the tag. + Tagger Signature + // Message is an arbitrary text message. + Message string + // PGPSignature is the PGP signature of the tag. + PGPSignature string + // TargetType is the object type of the target. + TargetType plumbing.ObjectType + // Target is the hash of the target object. + Target plumbing.Hash + + s storer.EncodedObjectStorer +} + +// GetTag gets a tag from an object storer and decodes it. +func GetTag(s storer.EncodedObjectStorer, h plumbing.Hash) (*Tag, error) { + o, err := s.EncodedObject(plumbing.TagObject, h) + if err != nil { + return nil, err + } + + return DecodeTag(s, o) +} + +// DecodeTag decodes an encoded object into a *Commit and associates it to the +// given object storer. +func DecodeTag(s storer.EncodedObjectStorer, o plumbing.EncodedObject) (*Tag, error) { + t := &Tag{s: s} + if err := t.Decode(o); err != nil { + return nil, err + } + + return t, nil +} + +// ID returns the object ID of the tag, not the object that the tag references. +// The returned value will always match the current value of Tag.Hash. +// +// ID is present to fulfill the Object interface. +func (t *Tag) ID() plumbing.Hash { + return t.Hash +} + +// Type returns the type of object. It always returns plumbing.TagObject. +// +// Type is present to fulfill the Object interface. +func (t *Tag) Type() plumbing.ObjectType { + return plumbing.TagObject +} + +// Decode transforms a plumbing.EncodedObject into a Tag struct. +func (t *Tag) Decode(o plumbing.EncodedObject) (err error) { + if o.Type() != plumbing.TagObject { + return ErrUnsupportedObject + } + + t.Hash = o.Hash() + + reader, err := o.Reader() + if err != nil { + return err + } + defer ioutil.CheckClose(reader, &err) + + r := bufPool.Get().(*bufio.Reader) + defer bufPool.Put(r) + r.Reset(reader) + for { + var line []byte + line, err = r.ReadBytes('\n') + if err != nil && err != io.EOF { + return err + } + + line = bytes.TrimSpace(line) + if len(line) == 0 { + break // Start of message + } + + split := bytes.SplitN(line, []byte{' '}, 2) + switch string(split[0]) { + case "object": + t.Target = plumbing.NewHash(string(split[1])) + case "type": + t.TargetType, err = plumbing.ParseObjectType(string(split[1])) + if err != nil { + return err + } + case "tag": + t.Name = string(split[1]) + case "tagger": + t.Tagger.Decode(split[1]) + } + + if err == io.EOF { + return nil + } + } + + data, err := stdioutil.ReadAll(r) + if err != nil { + return err + } + + var pgpsig bool + // Check if data contains PGP signature. + if bytes.Contains(data, []byte(beginpgp)) { + // Split the lines at newline. + messageAndSig := bytes.Split(data, []byte("\n")) + + for _, l := range messageAndSig { + if pgpsig { + if bytes.Contains(l, []byte(endpgp)) { + t.PGPSignature += endpgp + "\n" + break + } else { + t.PGPSignature += string(l) + "\n" + } + continue + } + + // Check if it's the beginning of a PGP signature. + if bytes.Contains(l, []byte(beginpgp)) { + t.PGPSignature += beginpgp + "\n" + pgpsig = true + continue + } + + t.Message += string(l) + "\n" + } + } else { + t.Message = string(data) + } + + return nil +} + +// Encode transforms a Tag into a plumbing.EncodedObject. +func (t *Tag) Encode(o plumbing.EncodedObject) error { + return t.encode(o, true) +} + +// EncodeWithoutSignature export a Tag into a plumbing.EncodedObject without the signature (correspond to the payload of the PGP signature). +func (t *Tag) EncodeWithoutSignature(o plumbing.EncodedObject) error { + return t.encode(o, false) +} + +func (t *Tag) encode(o plumbing.EncodedObject, includeSig bool) (err error) { + o.SetType(plumbing.TagObject) + w, err := o.Writer() + if err != nil { + return err + } + defer ioutil.CheckClose(w, &err) + + if _, err = fmt.Fprintf(w, + "object %s\ntype %s\ntag %s\ntagger ", + t.Target.String(), t.TargetType.Bytes(), t.Name); err != nil { + return err + } + + if err = t.Tagger.Encode(w); err != nil { + return err + } + + if _, err = fmt.Fprint(w, "\n\n"); err != nil { + return err + } + + if _, err = fmt.Fprint(w, t.Message); err != nil { + return err + } + + // Note that this is highly sensitive to what it sent along in the message. + // Message *always* needs to end with a newline, or else the message and the + // signature will be concatenated into a corrupt object. Since this is a + // lower-level method, we assume you know what you are doing and have already + // done the needful on the message in the caller. + if includeSig { + if _, err = fmt.Fprint(w, t.PGPSignature); err != nil { + return err + } + } + + return err +} + +// Commit returns the commit pointed to by the tag. If the tag points to a +// different type of object ErrUnsupportedObject will be returned. +func (t *Tag) Commit() (*Commit, error) { + if t.TargetType != plumbing.CommitObject { + return nil, ErrUnsupportedObject + } + + o, err := t.s.EncodedObject(plumbing.CommitObject, t.Target) + if err != nil { + return nil, err + } + + return DecodeCommit(t.s, o) +} + +// Tree returns the tree pointed to by the tag. If the tag points to a commit +// object the tree of that commit will be returned. If the tag does not point +// to a commit or tree object ErrUnsupportedObject will be returned. +func (t *Tag) Tree() (*Tree, error) { + switch t.TargetType { + case plumbing.CommitObject: + c, err := t.Commit() + if err != nil { + return nil, err + } + + return c.Tree() + case plumbing.TreeObject: + return GetTree(t.s, t.Target) + default: + return nil, ErrUnsupportedObject + } +} + +// Blob returns the blob pointed to by the tag. If the tag points to a +// different type of object ErrUnsupportedObject will be returned. +func (t *Tag) Blob() (*Blob, error) { + if t.TargetType != plumbing.BlobObject { + return nil, ErrUnsupportedObject + } + + return GetBlob(t.s, t.Target) +} + +// Object returns the object pointed to by the tag. +func (t *Tag) Object() (Object, error) { + o, err := t.s.EncodedObject(t.TargetType, t.Target) + if err != nil { + return nil, err + } + + return DecodeObject(t.s, o) +} + +// String returns the meta information contained in the tag as a formatted +// string. +func (t *Tag) String() string { + obj, _ := t.Object() + + return fmt.Sprintf( + "%s %s\nTagger: %s\nDate: %s\n\n%s\n%s", + plumbing.TagObject, t.Name, t.Tagger.String(), t.Tagger.When.Format(DateFormat), + t.Message, objectAsString(obj), + ) +} + +// Verify performs PGP verification of the tag with a provided armored +// keyring and returns openpgp.Entity associated with verifying key on success. +func (t *Tag) Verify(armoredKeyRing string) (*openpgp.Entity, error) { + keyRingReader := strings.NewReader(armoredKeyRing) + keyring, err := openpgp.ReadArmoredKeyRing(keyRingReader) + if err != nil { + return nil, err + } + + // Extract signature. + signature := strings.NewReader(t.PGPSignature) + + encoded := &plumbing.MemoryObject{} + // Encode tag components, excluding signature and get a reader object. + if err := t.EncodeWithoutSignature(encoded); err != nil { + return nil, err + } + er, err := encoded.Reader() + if err != nil { + return nil, err + } + + return openpgp.CheckArmoredDetachedSignature(keyring, er, signature) +} + +// TagIter provides an iterator for a set of tags. +type TagIter struct { + storer.EncodedObjectIter + s storer.EncodedObjectStorer +} + +// NewTagIter takes a storer.EncodedObjectStorer and a +// storer.EncodedObjectIter and returns a *TagIter that iterates over all +// tags contained in the storer.EncodedObjectIter. +// +// Any non-tag object returned by the storer.EncodedObjectIter is skipped. +func NewTagIter(s storer.EncodedObjectStorer, iter storer.EncodedObjectIter) *TagIter { + return &TagIter{iter, s} +} + +// Next moves the iterator to the next tag and returns a pointer to it. If +// there are no more tags, it returns io.EOF. +func (iter *TagIter) Next() (*Tag, error) { + obj, err := iter.EncodedObjectIter.Next() + if err != nil { + return nil, err + } + + return DecodeTag(iter.s, obj) +} + +// ForEach call the cb function for each tag contained on this iter until +// an error happens or the end of the iter is reached. If ErrStop is sent +// the iteration is stop but no error is returned. The iterator is closed. +func (iter *TagIter) ForEach(cb func(*Tag) error) error { + return iter.EncodedObjectIter.ForEach(func(obj plumbing.EncodedObject) error { + t, err := DecodeTag(iter.s, obj) + if err != nil { + return err + } + + return cb(t) + }) +} + +func objectAsString(obj Object) string { + switch o := obj.(type) { + case *Commit: + return o.String() + default: + return "" + } +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/tree.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/tree.go new file mode 100644 index 000000000..5e6378ca4 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/tree.go @@ -0,0 +1,525 @@ +package object + +import ( + "bufio" + "context" + "errors" + "fmt" + "io" + "path" + "path/filepath" + "strings" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/filemode" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +const ( + maxTreeDepth = 1024 + startingStackSize = 8 +) + +// New errors defined by this package. +var ( + ErrMaxTreeDepth = errors.New("maximum tree depth exceeded") + ErrFileNotFound = errors.New("file not found") + ErrDirectoryNotFound = errors.New("directory not found") + ErrEntryNotFound = errors.New("entry not found") +) + +// Tree is basically like a directory - it references a bunch of other trees +// and/or blobs (i.e. files and sub-directories) +type Tree struct { + Entries []TreeEntry + Hash plumbing.Hash + + s storer.EncodedObjectStorer + m map[string]*TreeEntry + t map[string]*Tree // tree path cache +} + +// GetTree gets a tree from an object storer and decodes it. +func GetTree(s storer.EncodedObjectStorer, h plumbing.Hash) (*Tree, error) { + o, err := s.EncodedObject(plumbing.TreeObject, h) + if err != nil { + return nil, err + } + + return DecodeTree(s, o) +} + +// DecodeTree decodes an encoded object into a *Tree and associates it to the +// given object storer. +func DecodeTree(s storer.EncodedObjectStorer, o plumbing.EncodedObject) (*Tree, error) { + t := &Tree{s: s} + if err := t.Decode(o); err != nil { + return nil, err + } + + return t, nil +} + +// TreeEntry represents a file +type TreeEntry struct { + Name string + Mode filemode.FileMode + Hash plumbing.Hash +} + +// File returns the hash of the file identified by the `path` argument. +// The path is interpreted as relative to the tree receiver. +func (t *Tree) File(path string) (*File, error) { + e, err := t.FindEntry(path) + if err != nil { + return nil, ErrFileNotFound + } + + blob, err := GetBlob(t.s, e.Hash) + if err != nil { + if err == plumbing.ErrObjectNotFound { + return nil, ErrFileNotFound + } + return nil, err + } + + return NewFile(path, e.Mode, blob), nil +} + +// Size returns the plaintext size of an object, without reading it +// into memory. +func (t *Tree) Size(path string) (int64, error) { + e, err := t.FindEntry(path) + if err != nil { + return 0, ErrEntryNotFound + } + + return t.s.EncodedObjectSize(e.Hash) +} + +// Tree returns the tree identified by the `path` argument. +// The path is interpreted as relative to the tree receiver. +func (t *Tree) Tree(path string) (*Tree, error) { + e, err := t.FindEntry(path) + if err != nil { + return nil, ErrDirectoryNotFound + } + + tree, err := GetTree(t.s, e.Hash) + if err == plumbing.ErrObjectNotFound { + return nil, ErrDirectoryNotFound + } + + return tree, err +} + +// TreeEntryFile returns the *File for a given *TreeEntry. +func (t *Tree) TreeEntryFile(e *TreeEntry) (*File, error) { + blob, err := GetBlob(t.s, e.Hash) + if err != nil { + return nil, err + } + + return NewFile(e.Name, e.Mode, blob), nil +} + +// FindEntry search a TreeEntry in this tree or any subtree. +func (t *Tree) FindEntry(path string) (*TreeEntry, error) { + if t.t == nil { + t.t = make(map[string]*Tree) + } + + pathParts := strings.Split(path, "/") + startingTree := t + pathCurrent := "" + + // search for the longest path in the tree path cache + for i := len(pathParts) - 1; i > 1; i-- { + path := filepath.Join(pathParts[:i]...) + + tree, ok := t.t[path] + if ok { + startingTree = tree + pathParts = pathParts[i:] + pathCurrent = path + + break + } + } + + var tree *Tree + var err error + for tree = startingTree; len(pathParts) > 1; pathParts = pathParts[1:] { + if tree, err = tree.dir(pathParts[0]); err != nil { + return nil, err + } + + pathCurrent = filepath.Join(pathCurrent, pathParts[0]) + t.t[pathCurrent] = tree + } + + return tree.entry(pathParts[0]) +} + +func (t *Tree) dir(baseName string) (*Tree, error) { + entry, err := t.entry(baseName) + if err != nil { + return nil, ErrDirectoryNotFound + } + + obj, err := t.s.EncodedObject(plumbing.TreeObject, entry.Hash) + if err != nil { + return nil, err + } + + tree := &Tree{s: t.s} + err = tree.Decode(obj) + + return tree, err +} + +func (t *Tree) entry(baseName string) (*TreeEntry, error) { + if t.m == nil { + t.buildMap() + } + + entry, ok := t.m[baseName] + if !ok { + return nil, ErrEntryNotFound + } + + return entry, nil +} + +// Files returns a FileIter allowing to iterate over the Tree +func (t *Tree) Files() *FileIter { + return NewFileIter(t.s, t) +} + +// ID returns the object ID of the tree. The returned value will always match +// the current value of Tree.Hash. +// +// ID is present to fulfill the Object interface. +func (t *Tree) ID() plumbing.Hash { + return t.Hash +} + +// Type returns the type of object. It always returns plumbing.TreeObject. +func (t *Tree) Type() plumbing.ObjectType { + return plumbing.TreeObject +} + +// Decode transform an plumbing.EncodedObject into a Tree struct +func (t *Tree) Decode(o plumbing.EncodedObject) (err error) { + if o.Type() != plumbing.TreeObject { + return ErrUnsupportedObject + } + + t.Hash = o.Hash() + if o.Size() == 0 { + return nil + } + + t.Entries = nil + t.m = nil + + reader, err := o.Reader() + if err != nil { + return err + } + defer ioutil.CheckClose(reader, &err) + + r := bufPool.Get().(*bufio.Reader) + defer bufPool.Put(r) + r.Reset(reader) + for { + str, err := r.ReadString(' ') + if err != nil { + if err == io.EOF { + break + } + + return err + } + str = str[:len(str)-1] // strip last byte (' ') + + mode, err := filemode.New(str) + if err != nil { + return err + } + + name, err := r.ReadString(0) + if err != nil && err != io.EOF { + return err + } + + var hash plumbing.Hash + if _, err = io.ReadFull(r, hash[:]); err != nil { + return err + } + + baseName := name[:len(name)-1] + t.Entries = append(t.Entries, TreeEntry{ + Hash: hash, + Mode: mode, + Name: baseName, + }) + } + + return nil +} + +// Encode transforms a Tree into a plumbing.EncodedObject. +func (t *Tree) Encode(o plumbing.EncodedObject) (err error) { + o.SetType(plumbing.TreeObject) + w, err := o.Writer() + if err != nil { + return err + } + + defer ioutil.CheckClose(w, &err) + for _, entry := range t.Entries { + if _, err = fmt.Fprintf(w, "%o %s", entry.Mode, entry.Name); err != nil { + return err + } + + if _, err = w.Write([]byte{0x00}); err != nil { + return err + } + + if _, err = w.Write(entry.Hash[:]); err != nil { + return err + } + } + + return err +} + +func (t *Tree) buildMap() { + t.m = make(map[string]*TreeEntry) + for i := 0; i < len(t.Entries); i++ { + t.m[t.Entries[i].Name] = &t.Entries[i] + } +} + +// Diff returns a list of changes between this tree and the provided one +func (t *Tree) Diff(to *Tree) (Changes, error) { + return t.DiffContext(context.Background(), to) +} + +// DiffContext returns a list of changes between this tree and the provided one +// Error will be returned if context expires. Provided context must be non nil. +// +// NOTE: Since version 5.1.0 the renames are correctly handled, the settings +// used are the recommended options DefaultDiffTreeOptions. +func (t *Tree) DiffContext(ctx context.Context, to *Tree) (Changes, error) { + return DiffTreeWithOptions(ctx, t, to, DefaultDiffTreeOptions) +} + +// Patch returns a slice of Patch objects with all the changes between trees +// in chunks. This representation can be used to create several diff outputs. +func (t *Tree) Patch(to *Tree) (*Patch, error) { + return t.PatchContext(context.Background(), to) +} + +// PatchContext returns a slice of Patch objects with all the changes between +// trees in chunks. This representation can be used to create several diff +// outputs. If context expires, an error will be returned. Provided context must +// be non-nil. +// +// NOTE: Since version 5.1.0 the renames are correctly handled, the settings +// used are the recommended options DefaultDiffTreeOptions. +func (t *Tree) PatchContext(ctx context.Context, to *Tree) (*Patch, error) { + changes, err := t.DiffContext(ctx, to) + if err != nil { + return nil, err + } + + return changes.PatchContext(ctx) +} + +// treeEntryIter facilitates iterating through the TreeEntry objects in a Tree. +type treeEntryIter struct { + t *Tree + pos int +} + +func (iter *treeEntryIter) Next() (TreeEntry, error) { + if iter.pos >= len(iter.t.Entries) { + return TreeEntry{}, io.EOF + } + iter.pos++ + return iter.t.Entries[iter.pos-1], nil +} + +// TreeWalker provides a means of walking through all of the entries in a Tree. +type TreeWalker struct { + stack []*treeEntryIter + base string + recursive bool + seen map[plumbing.Hash]bool + + s storer.EncodedObjectStorer + t *Tree +} + +// NewTreeWalker returns a new TreeWalker for the given tree. +// +// It is the caller's responsibility to call Close() when finished with the +// tree walker. +func NewTreeWalker(t *Tree, recursive bool, seen map[plumbing.Hash]bool) *TreeWalker { + stack := make([]*treeEntryIter, 0, startingStackSize) + stack = append(stack, &treeEntryIter{t, 0}) + + return &TreeWalker{ + stack: stack, + recursive: recursive, + seen: seen, + + s: t.s, + t: t, + } +} + +// Next returns the next object from the tree. Objects are returned in order +// and subtrees are included. After the last object has been returned further +// calls to Next() will return io.EOF. +// +// In the current implementation any objects which cannot be found in the +// underlying repository will be skipped automatically. It is possible that this +// may change in future versions. +func (w *TreeWalker) Next() (name string, entry TreeEntry, err error) { + var obj *Tree + for { + current := len(w.stack) - 1 + if current < 0 { + // Nothing left on the stack so we're finished + err = io.EOF + return + } + + if current > maxTreeDepth { + // We're probably following bad data or some self-referencing tree + err = ErrMaxTreeDepth + return + } + + entry, err = w.stack[current].Next() + if err == io.EOF { + // Finished with the current tree, move back up to the parent + w.stack = w.stack[:current] + w.base, _ = path.Split(w.base) + w.base = strings.TrimSuffix(w.base, "/") + continue + } + + if err != nil { + return + } + + if w.seen[entry.Hash] { + continue + } + + if entry.Mode == filemode.Dir { + obj, err = GetTree(w.s, entry.Hash) + } + + name = simpleJoin(w.base, entry.Name) + + if err != nil { + err = io.EOF + return + } + + break + } + + if !w.recursive { + return + } + + if obj != nil { + w.stack = append(w.stack, &treeEntryIter{obj, 0}) + w.base = simpleJoin(w.base, entry.Name) + } + + return +} + +// Tree returns the tree that the tree walker most recently operated on. +func (w *TreeWalker) Tree() *Tree { + current := len(w.stack) - 1 + if w.stack[current].pos == 0 { + current-- + } + + if current < 0 { + return nil + } + + return w.stack[current].t +} + +// Close releases any resources used by the TreeWalker. +func (w *TreeWalker) Close() { + w.stack = nil +} + +// TreeIter provides an iterator for a set of trees. +type TreeIter struct { + storer.EncodedObjectIter + s storer.EncodedObjectStorer +} + +// NewTreeIter takes a storer.EncodedObjectStorer and a +// storer.EncodedObjectIter and returns a *TreeIter that iterates over all +// tree contained in the storer.EncodedObjectIter. +// +// Any non-tree object returned by the storer.EncodedObjectIter is skipped. +func NewTreeIter(s storer.EncodedObjectStorer, iter storer.EncodedObjectIter) *TreeIter { + return &TreeIter{iter, s} +} + +// Next moves the iterator to the next tree and returns a pointer to it. If +// there are no more trees, it returns io.EOF. +func (iter *TreeIter) Next() (*Tree, error) { + for { + obj, err := iter.EncodedObjectIter.Next() + if err != nil { + return nil, err + } + + if obj.Type() != plumbing.TreeObject { + continue + } + + return DecodeTree(iter.s, obj) + } +} + +// ForEach call the cb function for each tree contained on this iter until +// an error happens or the end of the iter is reached. If ErrStop is sent +// the iteration is stop but no error is returned. The iterator is closed. +func (iter *TreeIter) ForEach(cb func(*Tree) error) error { + return iter.EncodedObjectIter.ForEach(func(obj plumbing.EncodedObject) error { + if obj.Type() != plumbing.TreeObject { + return nil + } + + t, err := DecodeTree(iter.s, obj) + if err != nil { + return err + } + + return cb(t) + }) +} + +func simpleJoin(parent, child string) string { + if len(parent) > 0 { + return parent + "/" + child + } + return child +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/treenoder.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/treenoder.go new file mode 100644 index 000000000..b4891b957 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/treenoder.go @@ -0,0 +1,136 @@ +package object + +import ( + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/filemode" + "github.com/go-git/go-git/v5/utils/merkletrie/noder" +) + +// A treenoder is a helper type that wraps git trees into merkletrie +// noders. +// +// As a merkletrie noder doesn't understand the concept of modes (e.g. +// file permissions), the treenoder includes the mode of the git tree in +// the hash, so changes in the modes will be detected as modifications +// to the file contents by the merkletrie difftree algorithm. This is +// consistent with how the "git diff-tree" command works. +type treeNoder struct { + parent *Tree // the root node is its own parent + name string // empty string for the root node + mode filemode.FileMode + hash plumbing.Hash + children []noder.Noder // memoized +} + +// NewTreeRootNode returns the root node of a Tree +func NewTreeRootNode(t *Tree) noder.Noder { + if t == nil { + return &treeNoder{} + } + + return &treeNoder{ + parent: t, + name: "", + mode: filemode.Dir, + hash: t.Hash, + } +} + +func (t *treeNoder) isRoot() bool { + return t.name == "" +} + +func (t *treeNoder) String() string { + return "treeNoder <" + t.name + ">" +} + +func (t *treeNoder) Hash() []byte { + if t.mode == filemode.Deprecated { + return append(t.hash[:], filemode.Regular.Bytes()...) + } + return append(t.hash[:], t.mode.Bytes()...) +} + +func (t *treeNoder) Name() string { + return t.name +} + +func (t *treeNoder) IsDir() bool { + return t.mode == filemode.Dir +} + +// Children will return the children of a treenoder as treenoders, +// building them from the children of the wrapped git tree. +func (t *treeNoder) Children() ([]noder.Noder, error) { + if t.mode != filemode.Dir { + return noder.NoChildren, nil + } + + // children are memoized for efficiency + if t.children != nil { + return t.children, nil + } + + // the parent of the returned children will be ourself as a tree if + // we are a not the root treenoder. The root is special as it + // is is own parent. + parent := t.parent + if !t.isRoot() { + var err error + if parent, err = t.parent.Tree(t.name); err != nil { + return nil, err + } + } + + return transformChildren(parent) +} + +// Returns the children of a tree as treenoders. +// Efficiency is key here. +func transformChildren(t *Tree) ([]noder.Noder, error) { + var err error + var e TreeEntry + + // there will be more tree entries than children in the tree, + // due to submodules and empty directories, but I think it is still + // worth it to pre-allocate the whole array now, even if sometimes + // is bigger than needed. + ret := make([]noder.Noder, 0, len(t.Entries)) + + walker := NewTreeWalker(t, false, nil) // don't recurse + // don't defer walker.Close() for efficiency reasons. + for { + _, e, err = walker.Next() + if err == io.EOF { + break + } + if err != nil { + walker.Close() + return nil, err + } + + ret = append(ret, &treeNoder{ + parent: t, + name: e.Name, + mode: e.Mode, + hash: e.Hash, + }) + } + walker.Close() + + return ret, nil +} + +// len(t.tree.Entries) != the number of elements walked by treewalker +// for some reason because of empty directories, submodules, etc, so we +// have to walk here. +func (t *treeNoder) NumChildren() (int, error) { + children, err := t.Children() + if err != nil { + return 0, err + } + + return len(children), nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs.go new file mode 100644 index 000000000..1bd724cad --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs.go @@ -0,0 +1,211 @@ +package packp + +import ( + "fmt" + "sort" + "strings" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/capability" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/storage/memory" +) + +// AdvRefs values represent the information transmitted on an +// advertised-refs message. Values from this type are not zero-value +// safe, use the New function instead. +type AdvRefs struct { + // Prefix stores prefix payloads. + // + // When using this message over (smart) HTTP, you have to add a pktline + // before the whole thing with the following payload: + // + // '# service=$servicename" LF + // + // Moreover, some (all) git HTTP smart servers will send a flush-pkt + // just after the first pkt-line. + // + // To accommodate both situations, the Prefix field allow you to store + // any data you want to send before the actual pktlines. It will also + // be filled up with whatever is found on the line. + Prefix [][]byte + // Head stores the resolved HEAD reference if present. + // This can be present with git-upload-pack, not with git-receive-pack. + Head *plumbing.Hash + // Capabilities are the capabilities. + Capabilities *capability.List + // References are the hash references. + References map[string]plumbing.Hash + // Peeled are the peeled hash references. + Peeled map[string]plumbing.Hash + // Shallows are the shallow object ids. + Shallows []plumbing.Hash +} + +// NewAdvRefs returns a pointer to a new AdvRefs value, ready to be used. +func NewAdvRefs() *AdvRefs { + return &AdvRefs{ + Prefix: [][]byte{}, + Capabilities: capability.NewList(), + References: make(map[string]plumbing.Hash), + Peeled: make(map[string]plumbing.Hash), + Shallows: []plumbing.Hash{}, + } +} + +func (a *AdvRefs) AddReference(r *plumbing.Reference) error { + switch r.Type() { + case plumbing.SymbolicReference: + v := fmt.Sprintf("%s:%s", r.Name().String(), r.Target().String()) + a.Capabilities.Add(capability.SymRef, v) + case plumbing.HashReference: + a.References[r.Name().String()] = r.Hash() + default: + return plumbing.ErrInvalidType + } + + return nil +} + +func (a *AdvRefs) AllReferences() (memory.ReferenceStorage, error) { + s := memory.ReferenceStorage{} + if err := a.addRefs(s); err != nil { + return s, plumbing.NewUnexpectedError(err) + } + + return s, nil +} + +func (a *AdvRefs) addRefs(s storer.ReferenceStorer) error { + for name, hash := range a.References { + ref := plumbing.NewReferenceFromStrings(name, hash.String()) + if err := s.SetReference(ref); err != nil { + return err + } + } + + if a.supportSymrefs() { + return a.addSymbolicRefs(s) + } + + return a.resolveHead(s) +} + +// If the server does not support symrefs capability, +// we need to guess the reference where HEAD is pointing to. +// +// Git versions prior to 1.8.4.3 has an special procedure to get +// the reference where is pointing to HEAD: +// - Check if a reference called master exists. If exists and it +// has the same hash as HEAD hash, we can say that HEAD is pointing to master +// - If master does not exists or does not have the same hash as HEAD, +// order references and check in that order if that reference has the same +// hash than HEAD. If yes, set HEAD pointing to that branch hash +// - If no reference is found, throw an error +func (a *AdvRefs) resolveHead(s storer.ReferenceStorer) error { + if a.Head == nil { + return nil + } + + ref, err := s.Reference(plumbing.Master) + + // check first if HEAD is pointing to master + if err == nil { + ok, err := a.createHeadIfCorrectReference(ref, s) + if err != nil { + return err + } + + if ok { + return nil + } + } + + if err != nil && err != plumbing.ErrReferenceNotFound { + return err + } + + // From here we are trying to guess the branch that HEAD is pointing + refIter, err := s.IterReferences() + if err != nil { + return err + } + + var refNames []string + err = refIter.ForEach(func(r *plumbing.Reference) error { + refNames = append(refNames, string(r.Name())) + return nil + }) + if err != nil { + return err + } + + sort.Strings(refNames) + + var headSet bool + for _, refName := range refNames { + ref, err := s.Reference(plumbing.ReferenceName(refName)) + if err != nil { + return err + } + ok, err := a.createHeadIfCorrectReference(ref, s) + if err != nil { + return err + } + if ok { + headSet = true + break + } + } + + if !headSet { + return plumbing.ErrReferenceNotFound + } + + return nil +} + +func (a *AdvRefs) createHeadIfCorrectReference( + reference *plumbing.Reference, + s storer.ReferenceStorer) (bool, error) { + if reference.Hash() == *a.Head { + headRef := plumbing.NewSymbolicReference(plumbing.HEAD, reference.Name()) + if err := s.SetReference(headRef); err != nil { + return false, err + } + + return true, nil + } + + return false, nil +} + +func (a *AdvRefs) addSymbolicRefs(s storer.ReferenceStorer) error { + for _, symref := range a.Capabilities.Get(capability.SymRef) { + chunks := strings.Split(symref, ":") + if len(chunks) != 2 { + err := fmt.Errorf("bad number of `:` in symref value (%q)", symref) + return plumbing.NewUnexpectedError(err) + } + name := plumbing.ReferenceName(chunks[0]) + target := plumbing.ReferenceName(chunks[1]) + ref := plumbing.NewSymbolicReference(name, target) + if err := s.SetReference(ref); err != nil { + return nil + } + } + + return nil +} + +func (a *AdvRefs) supportSymrefs() bool { + return a.Capabilities.Supports(capability.SymRef) +} + +// IsEmpty returns true if doesn't contain any reference. +func (a *AdvRefs) IsEmpty() bool { + return a.Head == nil && + len(a.References) == 0 && + len(a.Peeled) == 0 && + len(a.Shallows) == 0 +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs_decode.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs_decode.go new file mode 100644 index 000000000..63bbe5ab1 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs_decode.go @@ -0,0 +1,288 @@ +package packp + +import ( + "bytes" + "encoding/hex" + "errors" + "fmt" + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/pktline" +) + +// Decode reads the next advertised-refs message form its input and +// stores it in the AdvRefs. +func (a *AdvRefs) Decode(r io.Reader) error { + d := newAdvRefsDecoder(r) + return d.Decode(a) +} + +type advRefsDecoder struct { + s *pktline.Scanner // a pkt-line scanner from the input stream + line []byte // current pkt-line contents, use parser.nextLine() to make it advance + nLine int // current pkt-line number for debugging, begins at 1 + hash plumbing.Hash // last hash read + err error // sticky error, use the parser.error() method to fill this out + data *AdvRefs // parsed data is stored here +} + +var ( + // ErrEmptyAdvRefs is returned by Decode if it gets an empty advertised + // references message. + ErrEmptyAdvRefs = errors.New("empty advertised-ref message") + // ErrEmptyInput is returned by Decode if the input is empty. + ErrEmptyInput = errors.New("empty input") +) + +func newAdvRefsDecoder(r io.Reader) *advRefsDecoder { + return &advRefsDecoder{ + s: pktline.NewScanner(r), + } +} + +func (d *advRefsDecoder) Decode(v *AdvRefs) error { + d.data = v + + for state := decodePrefix; state != nil; { + state = state(d) + } + + return d.err +} + +type decoderStateFn func(*advRefsDecoder) decoderStateFn + +// fills out the parser sticky error +func (d *advRefsDecoder) error(format string, a ...interface{}) { + msg := fmt.Sprintf( + "pkt-line %d: %s", d.nLine, + fmt.Sprintf(format, a...), + ) + + d.err = NewErrUnexpectedData(msg, d.line) +} + +// Reads a new pkt-line from the scanner, makes its payload available as +// p.line and increments p.nLine. A successful invocation returns true, +// otherwise, false is returned and the sticky error is filled out +// accordingly. Trims eols at the end of the payloads. +func (d *advRefsDecoder) nextLine() bool { + d.nLine++ + + if !d.s.Scan() { + if d.err = d.s.Err(); d.err != nil { + return false + } + + if d.nLine == 1 { + d.err = ErrEmptyInput + return false + } + + d.error("EOF") + return false + } + + d.line = d.s.Bytes() + d.line = bytes.TrimSuffix(d.line, eol) + + return true +} + +// The HTTP smart prefix is often followed by a flush-pkt. +func decodePrefix(d *advRefsDecoder) decoderStateFn { + if ok := d.nextLine(); !ok { + return nil + } + + if !isPrefix(d.line) { + return decodeFirstHash + } + + tmp := make([]byte, len(d.line)) + copy(tmp, d.line) + d.data.Prefix = append(d.data.Prefix, tmp) + if ok := d.nextLine(); !ok { + return nil + } + + if !isFlush(d.line) { + return decodeFirstHash + } + + d.data.Prefix = append(d.data.Prefix, pktline.Flush) + if ok := d.nextLine(); !ok { + return nil + } + + return decodeFirstHash +} + +func isPrefix(payload []byte) bool { + return len(payload) > 0 && payload[0] == '#' +} + +// If the first hash is zero, then a no-refs is coming. Otherwise, a +// list-of-refs is coming, and the hash will be followed by the first +// advertised ref. +func decodeFirstHash(p *advRefsDecoder) decoderStateFn { + // If the repository is empty, we receive a flush here (HTTP). + if isFlush(p.line) { + p.err = ErrEmptyAdvRefs + return nil + } + + if len(p.line) < hashSize { + p.error("cannot read hash, pkt-line too short") + return nil + } + + if _, err := hex.Decode(p.hash[:], p.line[:hashSize]); err != nil { + p.error("invalid hash text: %s", err) + return nil + } + + p.line = p.line[hashSize:] + + if p.hash.IsZero() { + return decodeSkipNoRefs + } + + return decodeFirstRef +} + +// Skips SP "capabilities^{}" NUL +func decodeSkipNoRefs(p *advRefsDecoder) decoderStateFn { + if len(p.line) < len(noHeadMark) { + p.error("too short zero-id ref") + return nil + } + + if !bytes.HasPrefix(p.line, noHeadMark) { + p.error("malformed zero-id ref") + return nil + } + + p.line = p.line[len(noHeadMark):] + + return decodeCaps +} + +// decode the refname, expects SP refname NULL +func decodeFirstRef(l *advRefsDecoder) decoderStateFn { + if len(l.line) < 3 { + l.error("line too short after hash") + return nil + } + + if !bytes.HasPrefix(l.line, sp) { + l.error("no space after hash") + return nil + } + l.line = l.line[1:] + + chunks := bytes.SplitN(l.line, null, 2) + if len(chunks) < 2 { + l.error("NULL not found") + return nil + } + ref := chunks[0] + l.line = chunks[1] + + if bytes.Equal(ref, []byte(head)) { + l.data.Head = &l.hash + } else { + l.data.References[string(ref)] = l.hash + } + + return decodeCaps +} + +func decodeCaps(p *advRefsDecoder) decoderStateFn { + if err := p.data.Capabilities.Decode(p.line); err != nil { + p.error("invalid capabilities: %s", err) + return nil + } + + return decodeOtherRefs +} + +// The refs are either tips (obj-id SP refname) or a peeled (obj-id SP refname^{}). +// If there are no refs, then there might be a shallow or flush-ptk. +func decodeOtherRefs(p *advRefsDecoder) decoderStateFn { + if ok := p.nextLine(); !ok { + return nil + } + + if bytes.HasPrefix(p.line, shallow) { + return decodeShallow + } + + if len(p.line) == 0 { + return nil + } + + saveTo := p.data.References + if bytes.HasSuffix(p.line, peeled) { + p.line = bytes.TrimSuffix(p.line, peeled) + saveTo = p.data.Peeled + } + + ref, hash, err := readRef(p.line) + if err != nil { + p.error("%s", err) + return nil + } + saveTo[ref] = hash + + return decodeOtherRefs +} + +// Reads a ref-name +func readRef(data []byte) (string, plumbing.Hash, error) { + chunks := bytes.Split(data, sp) + switch { + case len(chunks) == 1: + return "", plumbing.ZeroHash, fmt.Errorf("malformed ref data: no space was found") + case len(chunks) > 2: + return "", plumbing.ZeroHash, fmt.Errorf("malformed ref data: more than one space found") + default: + return string(chunks[1]), plumbing.NewHash(string(chunks[0])), nil + } +} + +// Keeps reading shallows until a flush-pkt is found +func decodeShallow(p *advRefsDecoder) decoderStateFn { + if !bytes.HasPrefix(p.line, shallow) { + p.error("malformed shallow prefix, found %q... instead", p.line[:len(shallow)]) + return nil + } + p.line = bytes.TrimPrefix(p.line, shallow) + + if len(p.line) != hashSize { + p.error(fmt.Sprintf( + "malformed shallow hash: wrong length, expected 40 bytes, read %d bytes", + len(p.line))) + return nil + } + + text := p.line[:hashSize] + var h plumbing.Hash + if _, err := hex.Decode(h[:], text); err != nil { + p.error("invalid hash text: %s", err) + return nil + } + + p.data.Shallows = append(p.data.Shallows, h) + + if ok := p.nextLine(); !ok { + return nil + } + + if len(p.line) == 0 { + return nil // successful parse of the advertised-refs message + } + + return decodeShallow +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs_encode.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs_encode.go new file mode 100644 index 000000000..fb9bd883f --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs_encode.go @@ -0,0 +1,176 @@ +package packp + +import ( + "bytes" + "fmt" + "io" + "sort" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/pktline" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/capability" +) + +// Encode writes the AdvRefs encoding to a writer. +// +// All the payloads will end with a newline character. Capabilities, +// references and shallows are written in alphabetical order, except for +// peeled references that always follow their corresponding references. +func (a *AdvRefs) Encode(w io.Writer) error { + e := newAdvRefsEncoder(w) + return e.Encode(a) +} + +type advRefsEncoder struct { + data *AdvRefs // data to encode + pe *pktline.Encoder // where to write the encoded data + firstRefName string // reference name to encode in the first pkt-line (HEAD if present) + firstRefHash plumbing.Hash // hash referenced to encode in the first pkt-line (HEAD if present) + sortedRefs []string // hash references to encode ordered by increasing order + err error // sticky error + +} + +func newAdvRefsEncoder(w io.Writer) *advRefsEncoder { + return &advRefsEncoder{ + pe: pktline.NewEncoder(w), + } +} + +func (e *advRefsEncoder) Encode(v *AdvRefs) error { + e.data = v + e.sortRefs() + e.setFirstRef() + + for state := encodePrefix; state != nil; { + state = state(e) + } + + return e.err +} + +func (e *advRefsEncoder) sortRefs() { + if len(e.data.References) > 0 { + refs := make([]string, 0, len(e.data.References)) + for refName := range e.data.References { + refs = append(refs, refName) + } + + sort.Strings(refs) + e.sortedRefs = refs + } +} + +func (e *advRefsEncoder) setFirstRef() { + if e.data.Head != nil { + e.firstRefName = head + e.firstRefHash = *e.data.Head + return + } + + if len(e.sortedRefs) > 0 { + refName := e.sortedRefs[0] + e.firstRefName = refName + e.firstRefHash = e.data.References[refName] + } +} + +type encoderStateFn func(*advRefsEncoder) encoderStateFn + +func encodePrefix(e *advRefsEncoder) encoderStateFn { + for _, p := range e.data.Prefix { + if bytes.Equal(p, pktline.Flush) { + if e.err = e.pe.Flush(); e.err != nil { + return nil + } + continue + } + if e.err = e.pe.Encodef("%s\n", string(p)); e.err != nil { + return nil + } + } + + return encodeFirstLine +} + +// Adds the first pkt-line payload: head hash, head ref and capabilities. +// If HEAD ref is not found, the first reference ordered in increasing order will be used. +// If there aren't HEAD neither refs, the first line will be "PKT-LINE(zero-id SP "capabilities^{}" NUL capability-list)". +// See: https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt +// See: https://github.com/git/git/blob/master/Documentation/technical/protocol-common.txt +func encodeFirstLine(e *advRefsEncoder) encoderStateFn { + const formatFirstLine = "%s %s\x00%s\n" + var firstLine string + capabilities := formatCaps(e.data.Capabilities) + + if e.firstRefName == "" { + firstLine = fmt.Sprintf(formatFirstLine, plumbing.ZeroHash.String(), "capabilities^{}", capabilities) + } else { + firstLine = fmt.Sprintf(formatFirstLine, e.firstRefHash.String(), e.firstRefName, capabilities) + + } + + if e.err = e.pe.EncodeString(firstLine); e.err != nil { + return nil + } + + return encodeRefs +} + +func formatCaps(c *capability.List) string { + if c == nil { + return "" + } + + return c.String() +} + +// Adds the (sorted) refs: hash SP refname EOL +// and their peeled refs if any. +func encodeRefs(e *advRefsEncoder) encoderStateFn { + for _, r := range e.sortedRefs { + if r == e.firstRefName { + continue + } + + hash := e.data.References[r] + if e.err = e.pe.Encodef("%s %s\n", hash.String(), r); e.err != nil { + return nil + } + + if hash, ok := e.data.Peeled[r]; ok { + if e.err = e.pe.Encodef("%s %s^{}\n", hash.String(), r); e.err != nil { + return nil + } + } + } + + return encodeShallow +} + +// Adds the (sorted) shallows: "shallow" SP hash EOL +func encodeShallow(e *advRefsEncoder) encoderStateFn { + sorted := sortShallows(e.data.Shallows) + for _, hash := range sorted { + if e.err = e.pe.Encodef("shallow %s\n", hash); e.err != nil { + return nil + } + } + + return encodeFlush +} + +func sortShallows(c []plumbing.Hash) []string { + ret := []string{} + for _, h := range c { + ret = append(ret, h.String()) + } + sort.Strings(ret) + + return ret +} + +func encodeFlush(e *advRefsEncoder) encoderStateFn { + e.err = e.pe.Flush() + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/capability/capability.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/capability/capability.go new file mode 100644 index 000000000..a12978115 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/capability/capability.go @@ -0,0 +1,252 @@ +// Package capability defines the server and client capabilities. +package capability + +// Capability describes a server or client capability. +type Capability string + +func (n Capability) String() string { + return string(n) +} + +const ( + // MultiACK capability allows the server to return "ACK obj-id continue" as + // soon as it finds a commit that it can use as a common base, between the + // client's wants and the client's have set. + // + // By sending this early, the server can potentially head off the client + // from walking any further down that particular branch of the client's + // repository history. The client may still need to walk down other + // branches, sending have lines for those, until the server has a + // complete cut across the DAG, or the client has said "done". + // + // Without multi_ack, a client sends have lines in --date-order until + // the server has found a common base. That means the client will send + // have lines that are already known by the server to be common, because + // they overlap in time with another branch that the server hasn't found + // a common base on yet. + // + // For example suppose the client has commits in caps that the server + // doesn't and the server has commits in lower case that the client + // doesn't, as in the following diagram: + // + // +---- u ---------------------- x + // / +----- y + // / / + // a -- b -- c -- d -- E -- F + // \ + // +--- Q -- R -- S + // + // If the client wants x,y and starts out by saying have F,S, the server + // doesn't know what F,S is. Eventually the client says "have d" and + // the server sends "ACK d continue" to let the client know to stop + // walking down that line (so don't send c-b-a), but it's not done yet, + // it needs a base for x. The client keeps going with S-R-Q, until a + // gets reached, at which point the server has a clear base and it all + // ends. + // + // Without multi_ack the client would have sent that c-b-a chain anyway, + // interleaved with S-R-Q. + MultiACK Capability = "multi_ack" + // MultiACKDetailed is an extension of multi_ack that permits client to + // better understand the server's in-memory state. + MultiACKDetailed Capability = "multi_ack_detailed" + // NoDone should only be used with the smart HTTP protocol. If + // multi_ack_detailed and no-done are both present, then the sender is + // free to immediately send a pack following its first "ACK obj-id ready" + // message. + // + // Without no-done in the smart HTTP protocol, the server session would + // end and the client has to make another trip to send "done" before + // the server can send the pack. no-done removes the last round and + // thus slightly reduces latency. + NoDone Capability = "no-done" + // ThinPack is one with deltas which reference base objects not + // contained within the pack (but are known to exist at the receiving + // end). This can reduce the network traffic significantly, but it + // requires the receiving end to know how to "thicken" these packs by + // adding the missing bases to the pack. + // + // The upload-pack server advertises 'thin-pack' when it can generate + // and send a thin pack. A client requests the 'thin-pack' capability + // when it understands how to "thicken" it, notifying the server that + // it can receive such a pack. A client MUST NOT request the + // 'thin-pack' capability if it cannot turn a thin pack into a + // self-contained pack. + // + // Receive-pack, on the other hand, is assumed by default to be able to + // handle thin packs, but can ask the client not to use the feature by + // advertising the 'no-thin' capability. A client MUST NOT send a thin + // pack if the server advertises the 'no-thin' capability. + // + // The reasons for this asymmetry are historical. The receive-pack + // program did not exist until after the invention of thin packs, so + // historically the reference implementation of receive-pack always + // understood thin packs. Adding 'no-thin' later allowed receive-pack + // to disable the feature in a backwards-compatible manner. + ThinPack Capability = "thin-pack" + // Sideband means that server can send, and client understand multiplexed + // progress reports and error info interleaved with the packfile itself. + // + // These two options are mutually exclusive. A modern client always + // favors Sideband64k. + // + // Either mode indicates that the packfile data will be streamed broken + // up into packets of up to either 1000 bytes in the case of 'side_band', + // or 65520 bytes in the case of 'side_band_64k'. Each packet is made up + // of a leading 4-byte pkt-line length of how much data is in the packet, + // followed by a 1-byte stream code, followed by the actual data. + // + // The stream code can be one of: + // + // 1 - pack data + // 2 - progress messages + // 3 - fatal error message just before stream aborts + // + // The "side-band-64k" capability came about as a way for newer clients + // that can handle much larger packets to request packets that are + // actually crammed nearly full, while maintaining backward compatibility + // for the older clients. + // + // Further, with side-band and its up to 1000-byte messages, it's actually + // 999 bytes of payload and 1 byte for the stream code. With side-band-64k, + // same deal, you have up to 65519 bytes of data and 1 byte for the stream + // code. + // + // The client MUST send only maximum of one of "side-band" and "side- + // band-64k". Server MUST diagnose it as an error if client requests + // both. + Sideband Capability = "side-band" + Sideband64k Capability = "side-band-64k" + // OFSDelta server can send, and client understand PACKv2 with delta + // referring to its base by position in pack rather than by an obj-id. That + // is, they can send/read OBJ_OFS_DELTA (aka type 6) in a packfile. + OFSDelta Capability = "ofs-delta" + // Agent the server may optionally send this capability to notify the client + // that the server is running version `X`. The client may optionally return + // its own agent string by responding with an `agent=Y` capability (but it + // MUST NOT do so if the server did not mention the agent capability). The + // `X` and `Y` strings may contain any printable ASCII characters except + // space (i.e., the byte range 32 < x < 127), and are typically of the form + // "package/version" (e.g., "git/1.8.3.1"). The agent strings are purely + // informative for statistics and debugging purposes, and MUST NOT be used + // to programmatically assume the presence or absence of particular features. + Agent Capability = "agent" + // Shallow capability adds "deepen", "shallow" and "unshallow" commands to + // the fetch-pack/upload-pack protocol so clients can request shallow + // clones. + Shallow Capability = "shallow" + // DeepenSince adds "deepen-since" command to fetch-pack/upload-pack + // protocol so the client can request shallow clones that are cut at a + // specific time, instead of depth. Internally it's equivalent of doing + // "rev-list --max-age=" on the server side. "deepen-since" + // cannot be used with "deepen". + DeepenSince Capability = "deepen-since" + // DeepenNot adds "deepen-not" command to fetch-pack/upload-pack + // protocol so the client can request shallow clones that are cut at a + // specific revision, instead of depth. Internally it's equivalent of + // doing "rev-list --not " on the server side. "deepen-not" + // cannot be used with "deepen", but can be used with "deepen-since". + DeepenNot Capability = "deepen-not" + // DeepenRelative if this capability is requested by the client, the + // semantics of "deepen" command is changed. The "depth" argument is the + // depth from the current shallow boundary, instead of the depth from + // remote refs. + DeepenRelative Capability = "deepen-relative" + // NoProgress the client was started with "git clone -q" or something, and + // doesn't want that side band 2. Basically the client just says "I do not + // wish to receive stream 2 on sideband, so do not send it to me, and if + // you did, I will drop it on the floor anyway". However, the sideband + // channel 3 is still used for error responses. + NoProgress Capability = "no-progress" + // IncludeTag capability is about sending annotated tags if we are + // sending objects they point to. If we pack an object to the client, and + // a tag object points exactly at that object, we pack the tag object too. + // In general this allows a client to get all new annotated tags when it + // fetches a branch, in a single network connection. + // + // Clients MAY always send include-tag, hardcoding it into a request when + // the server advertises this capability. The decision for a client to + // request include-tag only has to do with the client's desires for tag + // data, whether or not a server had advertised objects in the + // refs/tags/* namespace. + // + // Servers MUST pack the tags if their referrant is packed and the client + // has requested include-tags. + // + // Clients MUST be prepared for the case where a server has ignored + // include-tag and has not actually sent tags in the pack. In such + // cases the client SHOULD issue a subsequent fetch to acquire the tags + // that include-tag would have otherwise given the client. + // + // The server SHOULD send include-tag, if it supports it, regardless + // of whether or not there are tags available. + IncludeTag Capability = "include-tag" + // ReportStatus the receive-pack process can receive a 'report-status' + // capability, which tells it that the client wants a report of what + // happened after a packfile upload and reference update. If the pushing + // client requests this capability, after unpacking and updating references + // the server will respond with whether the packfile unpacked successfully + // and if each reference was updated successfully. If any of those were not + // successful, it will send back an error message. See pack-protocol.txt + // for example messages. + ReportStatus Capability = "report-status" + // DeleteRefs If the server sends back this capability, it means that + // it is capable of accepting a zero-id value as the target + // value of a reference update. It is not sent back by the client, it + // simply informs the client that it can be sent zero-id values + // to delete references + DeleteRefs Capability = "delete-refs" + // Quiet If the receive-pack server advertises this capability, it is + // capable of silencing human-readable progress output which otherwise may + // be shown when processing the received pack. A send-pack client should + // respond with the 'quiet' capability to suppress server-side progress + // reporting if the local progress reporting is also being suppressed + // (e.g., via `push -q`, or if stderr does not go to a tty). + Quiet Capability = "quiet" + // Atomic If the server sends this capability it is capable of accepting + // atomic pushes. If the pushing client requests this capability, the server + // will update the refs in one atomic transaction. Either all refs are + // updated or none. + Atomic Capability = "atomic" + // PushOptions If the server sends this capability it is able to accept + // push options after the update commands have been sent, but before the + // packfile is streamed. If the pushing client requests this capability, + // the server will pass the options to the pre- and post- receive hooks + // that process this push request. + PushOptions Capability = "push-options" + // AllowTipSHA1InWant if the upload-pack server advertises this capability, + // fetch-pack may send "want" lines with SHA-1s that exist at the server but + // are not advertised by upload-pack. + AllowTipSHA1InWant Capability = "allow-tip-sha1-in-want" + // AllowReachableSHA1InWant if the upload-pack server advertises this + // capability, fetch-pack may send "want" lines with SHA-1s that exist at + // the server but are not advertised by upload-pack. + AllowReachableSHA1InWant Capability = "allow-reachable-sha1-in-want" + // PushCert the receive-pack server that advertises this capability is + // willing to accept a signed push certificate, and asks the to be + // included in the push certificate. A send-pack client MUST NOT + // send a push-cert packet unless the receive-pack server advertises + // this capability. + PushCert Capability = "push-cert" + // SymRef symbolic reference support for better negotiation. + SymRef Capability = "symref" +) + +const DefaultAgent = "go-git/4.x" + +var known = map[Capability]bool{ + MultiACK: true, MultiACKDetailed: true, NoDone: true, ThinPack: true, + Sideband: true, Sideband64k: true, OFSDelta: true, Agent: true, + Shallow: true, DeepenSince: true, DeepenNot: true, DeepenRelative: true, + NoProgress: true, IncludeTag: true, ReportStatus: true, DeleteRefs: true, + Quiet: true, Atomic: true, PushOptions: true, AllowTipSHA1InWant: true, + AllowReachableSHA1InWant: true, PushCert: true, SymRef: true, +} + +var requiresArgument = map[Capability]bool{ + Agent: true, PushCert: true, SymRef: true, +} + +var multipleArgument = map[Capability]bool{ + SymRef: true, +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/capability/list.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/capability/list.go new file mode 100644 index 000000000..96092112d --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/capability/list.go @@ -0,0 +1,196 @@ +package capability + +import ( + "bytes" + "errors" + "fmt" + "strings" +) + +var ( + // ErrArgumentsRequired is returned if no arguments are giving with a + // capability that requires arguments + ErrArgumentsRequired = errors.New("arguments required") + // ErrArguments is returned if arguments are given with a capabilities that + // not supports arguments + ErrArguments = errors.New("arguments not allowed") + // ErrEmptyArgument is returned when an empty value is given + ErrEmptyArgument = errors.New("empty argument") + // ErrMultipleArguments multiple argument given to a capabilities that not + // support it + ErrMultipleArguments = errors.New("multiple arguments not allowed") +) + +// List represents a list of capabilities +type List struct { + m map[Capability]*entry + sort []string +} + +type entry struct { + Name Capability + Values []string +} + +// NewList returns a new List of capabilities +func NewList() *List { + return &List{ + m: make(map[Capability]*entry), + } +} + +// IsEmpty returns true if the List is empty +func (l *List) IsEmpty() bool { + return len(l.sort) == 0 +} + +// Decode decodes list of capabilities from raw into the list +func (l *List) Decode(raw []byte) error { + // git 1.x receive pack used to send a leading space on its + // git-receive-pack capabilities announcement. We just trim space to be + // tolerant to space changes in different versions. + raw = bytes.TrimSpace(raw) + + if len(raw) == 0 { + return nil + } + + for _, data := range bytes.Split(raw, []byte{' '}) { + pair := bytes.SplitN(data, []byte{'='}, 2) + + c := Capability(pair[0]) + if len(pair) == 1 { + if err := l.Add(c); err != nil { + return err + } + + continue + } + + if err := l.Add(c, string(pair[1])); err != nil { + return err + } + } + + return nil +} + +// Get returns the values for a capability +func (l *List) Get(capability Capability) []string { + if _, ok := l.m[capability]; !ok { + return nil + } + + return l.m[capability].Values +} + +// Set sets a capability removing the previous values +func (l *List) Set(capability Capability, values ...string) error { + if _, ok := l.m[capability]; ok { + delete(l.m, capability) + } + + return l.Add(capability, values...) +} + +// Add adds a capability, values are optional +func (l *List) Add(c Capability, values ...string) error { + if err := l.validate(c, values); err != nil { + return err + } + + if !l.Supports(c) { + l.m[c] = &entry{Name: c} + l.sort = append(l.sort, c.String()) + } + + if len(values) == 0 { + return nil + } + + if known[c] && !multipleArgument[c] && len(l.m[c].Values) > 0 { + return ErrMultipleArguments + } + + l.m[c].Values = append(l.m[c].Values, values...) + return nil +} + +func (l *List) validateNoEmptyArgs(values []string) error { + for _, v := range values { + if v == "" { + return ErrEmptyArgument + } + } + return nil +} + +func (l *List) validate(c Capability, values []string) error { + if !known[c] { + return l.validateNoEmptyArgs(values) + } + if requiresArgument[c] && len(values) == 0 { + return ErrArgumentsRequired + } + + if !requiresArgument[c] && len(values) != 0 { + return ErrArguments + } + + if !multipleArgument[c] && len(values) > 1 { + return ErrMultipleArguments + } + return l.validateNoEmptyArgs(values) +} + +// Supports returns true if capability is present +func (l *List) Supports(capability Capability) bool { + _, ok := l.m[capability] + return ok +} + +// Delete deletes a capability from the List +func (l *List) Delete(capability Capability) { + if !l.Supports(capability) { + return + } + + delete(l.m, capability) + for i, c := range l.sort { + if c != string(capability) { + continue + } + + l.sort = append(l.sort[:i], l.sort[i+1:]...) + return + } +} + +// All returns a slice with all defined capabilities. +func (l *List) All() []Capability { + var cs []Capability + for _, key := range l.sort { + cs = append(cs, Capability(key)) + } + + return cs +} + +// String generates the capabilities strings, the capabilities are sorted in +// insertion order +func (l *List) String() string { + var o []string + for _, key := range l.sort { + cap := l.m[Capability(key)] + if len(cap.Values) == 0 { + o = append(o, key) + continue + } + + for _, value := range cap.Values { + o = append(o, fmt.Sprintf("%s=%s", key, value)) + } + } + + return strings.Join(o, " ") +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/common.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/common.go new file mode 100644 index 000000000..ab07ac8f7 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/common.go @@ -0,0 +1,70 @@ +package packp + +import ( + "fmt" +) + +type stateFn func() stateFn + +const ( + // common + hashSize = 40 + + // advrefs + head = "HEAD" + noHead = "capabilities^{}" +) + +var ( + // common + sp = []byte(" ") + eol = []byte("\n") + eq = []byte{'='} + + // advertised-refs + null = []byte("\x00") + peeled = []byte("^{}") + noHeadMark = []byte(" capabilities^{}\x00") + + // upload-request + want = []byte("want ") + shallow = []byte("shallow ") + deepen = []byte("deepen") + deepenCommits = []byte("deepen ") + deepenSince = []byte("deepen-since ") + deepenReference = []byte("deepen-not ") + + // shallow-update + unshallow = []byte("unshallow ") + + // server-response + ack = []byte("ACK") + nak = []byte("NAK") + + // updreq + shallowNoSp = []byte("shallow") +) + +func isFlush(payload []byte) bool { + return len(payload) == 0 +} + +// ErrUnexpectedData represents an unexpected data decoding a message +type ErrUnexpectedData struct { + Msg string + Data []byte +} + +// NewErrUnexpectedData returns a new ErrUnexpectedData containing the data and +// the message given +func NewErrUnexpectedData(msg string, data []byte) error { + return &ErrUnexpectedData{Msg: msg, Data: data} +} + +func (err *ErrUnexpectedData) Error() string { + if len(err.Data) == 0 { + return err.Msg + } + + return fmt.Sprintf("%s (%s)", err.Msg, err.Data) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/doc.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/doc.go new file mode 100644 index 000000000..4950d1d66 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/doc.go @@ -0,0 +1,724 @@ +package packp + +/* + +A nice way to trace the real data transmitted and received by git, use: + +GIT_TRACE_PACKET=true git ls-remote http://github.com/src-d/go-git +GIT_TRACE_PACKET=true git clone http://github.com/src-d/go-git + +Here follows a copy of the current protocol specification at the time of +this writing. + +(Please notice that most http git servers will add a flush-pkt after the +first pkt-line when using HTTP smart.) + + +Documentation Common to Pack and Http Protocols +=============================================== + +ABNF Notation +------------- + +ABNF notation as described by RFC 5234 is used within the protocol documents, +except the following replacement core rules are used: +---- + HEXDIG = DIGIT / "a" / "b" / "c" / "d" / "e" / "f" +---- + +We also define the following common rules: +---- + NUL = %x00 + zero-id = 40*"0" + obj-id = 40*(HEXDIGIT) + + refname = "HEAD" + refname /= "refs/" +---- + +A refname is a hierarchical octet string beginning with "refs/" and +not violating the 'git-check-ref-format' command's validation rules. +More specifically, they: + +. They can include slash `/` for hierarchical (directory) + grouping, but no slash-separated component can begin with a + dot `.`. + +. They must contain at least one `/`. This enforces the presence of a + category like `heads/`, `tags/` etc. but the actual names are not + restricted. + +. They cannot have two consecutive dots `..` anywhere. + +. They cannot have ASCII control characters (i.e. bytes whose + values are lower than \040, or \177 `DEL`), space, tilde `~`, + caret `^`, colon `:`, question-mark `?`, asterisk `*`, + or open bracket `[` anywhere. + +. They cannot end with a slash `/` or a dot `.`. + +. They cannot end with the sequence `.lock`. + +. They cannot contain a sequence `@{`. + +. They cannot contain a `\\`. + + +pkt-line Format +--------------- + +Much (but not all) of the payload is described around pkt-lines. + +A pkt-line is a variable length binary string. The first four bytes +of the line, the pkt-len, indicates the total length of the line, +in hexadecimal. The pkt-len includes the 4 bytes used to contain +the length's hexadecimal representation. + +A pkt-line MAY contain binary data, so implementors MUST ensure +pkt-line parsing/formatting routines are 8-bit clean. + +A non-binary line SHOULD BE terminated by an LF, which if present +MUST be included in the total length. Receivers MUST treat pkt-lines +with non-binary data the same whether or not they contain the trailing +LF (stripping the LF if present, and not complaining when it is +missing). + +The maximum length of a pkt-line's data component is 65516 bytes. +Implementations MUST NOT send pkt-line whose length exceeds 65520 +(65516 bytes of payload + 4 bytes of length data). + +Implementations SHOULD NOT send an empty pkt-line ("0004"). + +A pkt-line with a length field of 0 ("0000"), called a flush-pkt, +is a special case and MUST be handled differently than an empty +pkt-line ("0004"). + +---- + pkt-line = data-pkt / flush-pkt + + data-pkt = pkt-len pkt-payload + pkt-len = 4*(HEXDIG) + pkt-payload = (pkt-len - 4)*(OCTET) + + flush-pkt = "0000" +---- + +Examples (as C-style strings): + +---- + pkt-line actual value + --------------------------------- + "0006a\n" "a\n" + "0005a" "a" + "000bfoobar\n" "foobar\n" + "0004" "" +---- + +Packfile transfer protocols +=========================== + +Git supports transferring data in packfiles over the ssh://, git://, http:// and +file:// transports. There exist two sets of protocols, one for pushing +data from a client to a server and another for fetching data from a +server to a client. The three transports (ssh, git, file) use the same +protocol to transfer data. http is documented in http-protocol.txt. + +The processes invoked in the canonical Git implementation are 'upload-pack' +on the server side and 'fetch-pack' on the client side for fetching data; +then 'receive-pack' on the server and 'send-pack' on the client for pushing +data. The protocol functions to have a server tell a client what is +currently on the server, then for the two to negotiate the smallest amount +of data to send in order to fully update one or the other. + +pkt-line Format +--------------- + +The descriptions below build on the pkt-line format described in +protocol-common.txt. When the grammar indicate `PKT-LINE(...)`, unless +otherwise noted the usual pkt-line LF rules apply: the sender SHOULD +include a LF, but the receiver MUST NOT complain if it is not present. + +Transports +---------- +There are three transports over which the packfile protocol is +initiated. The Git transport is a simple, unauthenticated server that +takes the command (almost always 'upload-pack', though Git +servers can be configured to be globally writable, in which 'receive- +pack' initiation is also allowed) with which the client wishes to +communicate and executes it and connects it to the requesting +process. + +In the SSH transport, the client just runs the 'upload-pack' +or 'receive-pack' process on the server over the SSH protocol and then +communicates with that invoked process over the SSH connection. + +The file:// transport runs the 'upload-pack' or 'receive-pack' +process locally and communicates with it over a pipe. + +Git Transport +------------- + +The Git transport starts off by sending the command and repository +on the wire using the pkt-line format, followed by a NUL byte and a +hostname parameter, terminated by a NUL byte. + + 0032git-upload-pack /project.git\0host=myserver.com\0 + +-- + git-proto-request = request-command SP pathname NUL [ host-parameter NUL ] + request-command = "git-upload-pack" / "git-receive-pack" / + "git-upload-archive" ; case sensitive + pathname = *( %x01-ff ) ; exclude NUL + host-parameter = "host=" hostname [ ":" port ] +-- + +Only host-parameter is allowed in the git-proto-request. Clients +MUST NOT attempt to send additional parameters. It is used for the +git-daemon name based virtual hosting. See --interpolated-path +option to git daemon, with the %H/%CH format characters. + +Basically what the Git client is doing to connect to an 'upload-pack' +process on the server side over the Git protocol is this: + + $ echo -e -n \ + "0039git-upload-pack /schacon/gitbook.git\0host=example.com\0" | + nc -v example.com 9418 + +If the server refuses the request for some reasons, it could abort +gracefully with an error message. + +---- + error-line = PKT-LINE("ERR" SP explanation-text) +---- + + +SSH Transport +------------- + +Initiating the upload-pack or receive-pack processes over SSH is +executing the binary on the server via SSH remote execution. +It is basically equivalent to running this: + + $ ssh git.example.com "git-upload-pack '/project.git'" + +For a server to support Git pushing and pulling for a given user over +SSH, that user needs to be able to execute one or both of those +commands via the SSH shell that they are provided on login. On some +systems, that shell access is limited to only being able to run those +two commands, or even just one of them. + +In an ssh:// format URI, it's absolute in the URI, so the '/' after +the host name (or port number) is sent as an argument, which is then +read by the remote git-upload-pack exactly as is, so it's effectively +an absolute path in the remote filesystem. + + git clone ssh://user@example.com/project.git + | + v + ssh user@example.com "git-upload-pack '/project.git'" + +In a "user@host:path" format URI, its relative to the user's home +directory, because the Git client will run: + + git clone user@example.com:project.git + | + v + ssh user@example.com "git-upload-pack 'project.git'" + +The exception is if a '~' is used, in which case +we execute it without the leading '/'. + + ssh://user@example.com/~alice/project.git, + | + v + ssh user@example.com "git-upload-pack '~alice/project.git'" + +A few things to remember here: + +- The "command name" is spelled with dash (e.g. git-upload-pack), but + this can be overridden by the client; + +- The repository path is always quoted with single quotes. + +Fetching Data From a Server +--------------------------- + +When one Git repository wants to get data that a second repository +has, the first can 'fetch' from the second. This operation determines +what data the server has that the client does not then streams that +data down to the client in packfile format. + + +Reference Discovery +------------------- + +When the client initially connects the server will immediately respond +with a listing of each reference it has (all branches and tags) along +with the object name that each reference currently points to. + + $ echo -e -n "0039git-upload-pack /schacon/gitbook.git\0host=example.com\0" | + nc -v example.com 9418 + 00887217a7c7e582c46cec22a130adf4b9d7d950fba0 HEAD\0multi_ack thin-pack + side-band side-band-64k ofs-delta shallow no-progress include-tag + 00441d3fcd5ced445d1abc402225c0b8a1299641f497 refs/heads/integration + 003f7217a7c7e582c46cec22a130adf4b9d7d950fba0 refs/heads/master + 003cb88d2441cac0977faf98efc80305012112238d9d refs/tags/v0.9 + 003c525128480b96c89e6418b1e40909bf6c5b2d580f refs/tags/v1.0 + 003fe92df48743b7bc7d26bcaabfddde0a1e20cae47c refs/tags/v1.0^{} + 0000 + +The returned response is a pkt-line stream describing each ref and +its current value. The stream MUST be sorted by name according to +the C locale ordering. + +If HEAD is a valid ref, HEAD MUST appear as the first advertised +ref. If HEAD is not a valid ref, HEAD MUST NOT appear in the +advertisement list at all, but other refs may still appear. + +The stream MUST include capability declarations behind a NUL on the +first ref. The peeled value of a ref (that is "ref^{}") MUST be +immediately after the ref itself, if presented. A conforming server +MUST peel the ref if it's an annotated tag. + +---- + advertised-refs = (no-refs / list-of-refs) + *shallow + flush-pkt + + no-refs = PKT-LINE(zero-id SP "capabilities^{}" + NUL capability-list) + + list-of-refs = first-ref *other-ref + first-ref = PKT-LINE(obj-id SP refname + NUL capability-list) + + other-ref = PKT-LINE(other-tip / other-peeled) + other-tip = obj-id SP refname + other-peeled = obj-id SP refname "^{}" + + shallow = PKT-LINE("shallow" SP obj-id) + + capability-list = capability *(SP capability) + capability = 1*(LC_ALPHA / DIGIT / "-" / "_") + LC_ALPHA = %x61-7A +---- + +Server and client MUST use lowercase for obj-id, both MUST treat obj-id +as case-insensitive. + +See protocol-capabilities.txt for a list of allowed server capabilities +and descriptions. + +Packfile Negotiation +-------------------- +After reference and capabilities discovery, the client can decide to +terminate the connection by sending a flush-pkt, telling the server it can +now gracefully terminate, and disconnect, when it does not need any pack +data. This can happen with the ls-remote command, and also can happen when +the client already is up-to-date. + +Otherwise, it enters the negotiation phase, where the client and +server determine what the minimal packfile necessary for transport is, +by telling the server what objects it wants, its shallow objects +(if any), and the maximum commit depth it wants (if any). The client +will also send a list of the capabilities it wants to be in effect, +out of what the server said it could do with the first 'want' line. + +---- + upload-request = want-list + *shallow-line + *1depth-request + flush-pkt + + want-list = first-want + *additional-want + + shallow-line = PKT-LINE("shallow" SP obj-id) + + depth-request = PKT-LINE("deepen" SP depth) / + PKT-LINE("deepen-since" SP timestamp) / + PKT-LINE("deepen-not" SP ref) + + first-want = PKT-LINE("want" SP obj-id SP capability-list) + additional-want = PKT-LINE("want" SP obj-id) + + depth = 1*DIGIT +---- + +Clients MUST send all the obj-ids it wants from the reference +discovery phase as 'want' lines. Clients MUST send at least one +'want' command in the request body. Clients MUST NOT mention an +obj-id in a 'want' command which did not appear in the response +obtained through ref discovery. + +The client MUST write all obj-ids which it only has shallow copies +of (meaning that it does not have the parents of a commit) as +'shallow' lines so that the server is aware of the limitations of +the client's history. + +The client now sends the maximum commit history depth it wants for +this transaction, which is the number of commits it wants from the +tip of the history, if any, as a 'deepen' line. A depth of 0 is the +same as not making a depth request. The client does not want to receive +any commits beyond this depth, nor does it want objects needed only to +complete those commits. Commits whose parents are not received as a +result are defined as shallow and marked as such in the server. This +information is sent back to the client in the next step. + +Once all the 'want's and 'shallow's (and optional 'deepen') are +transferred, clients MUST send a flush-pkt, to tell the server side +that it is done sending the list. + +Otherwise, if the client sent a positive depth request, the server +will determine which commits will and will not be shallow and +send this information to the client. If the client did not request +a positive depth, this step is skipped. + +---- + shallow-update = *shallow-line + *unshallow-line + flush-pkt + + shallow-line = PKT-LINE("shallow" SP obj-id) + + unshallow-line = PKT-LINE("unshallow" SP obj-id) +---- + +If the client has requested a positive depth, the server will compute +the set of commits which are no deeper than the desired depth. The set +of commits start at the client's wants. + +The server writes 'shallow' lines for each +commit whose parents will not be sent as a result. The server writes +an 'unshallow' line for each commit which the client has indicated is +shallow, but is no longer shallow at the currently requested depth +(that is, its parents will now be sent). The server MUST NOT mark +as unshallow anything which the client has not indicated was shallow. + +Now the client will send a list of the obj-ids it has using 'have' +lines, so the server can make a packfile that only contains the objects +that the client needs. In multi_ack mode, the canonical implementation +will send up to 32 of these at a time, then will send a flush-pkt. The +canonical implementation will skip ahead and send the next 32 immediately, +so that there is always a block of 32 "in-flight on the wire" at a time. + +---- + upload-haves = have-list + compute-end + + have-list = *have-line + have-line = PKT-LINE("have" SP obj-id) + compute-end = flush-pkt / PKT-LINE("done") +---- + +If the server reads 'have' lines, it then will respond by ACKing any +of the obj-ids the client said it had that the server also has. The +server will ACK obj-ids differently depending on which ack mode is +chosen by the client. + +In multi_ack mode: + + * the server will respond with 'ACK obj-id continue' for any common + commits. + + * once the server has found an acceptable common base commit and is + ready to make a packfile, it will blindly ACK all 'have' obj-ids + back to the client. + + * the server will then send a 'NAK' and then wait for another response + from the client - either a 'done' or another list of 'have' lines. + +In multi_ack_detailed mode: + + * the server will differentiate the ACKs where it is signaling + that it is ready to send data with 'ACK obj-id ready' lines, and + signals the identified common commits with 'ACK obj-id common' lines. + +Without either multi_ack or multi_ack_detailed: + + * upload-pack sends "ACK obj-id" on the first common object it finds. + After that it says nothing until the client gives it a "done". + + * upload-pack sends "NAK" on a flush-pkt if no common object + has been found yet. If one has been found, and thus an ACK + was already sent, it's silent on the flush-pkt. + +After the client has gotten enough ACK responses that it can determine +that the server has enough information to send an efficient packfile +(in the canonical implementation, this is determined when it has received +enough ACKs that it can color everything left in the --date-order queue +as common with the server, or the --date-order queue is empty), or the +client determines that it wants to give up (in the canonical implementation, +this is determined when the client sends 256 'have' lines without getting +any of them ACKed by the server - meaning there is nothing in common and +the server should just send all of its objects), then the client will send +a 'done' command. The 'done' command signals to the server that the client +is ready to receive its packfile data. + +However, the 256 limit *only* turns on in the canonical client +implementation if we have received at least one "ACK %s continue" +during a prior round. This helps to ensure that at least one common +ancestor is found before we give up entirely. + +Once the 'done' line is read from the client, the server will either +send a final 'ACK obj-id' or it will send a 'NAK'. 'obj-id' is the object +name of the last commit determined to be common. The server only sends +ACK after 'done' if there is at least one common base and multi_ack or +multi_ack_detailed is enabled. The server always sends NAK after 'done' +if there is no common base found. + +Then the server will start sending its packfile data. + +---- + server-response = *ack_multi ack / nak + ack_multi = PKT-LINE("ACK" SP obj-id ack_status) + ack_status = "continue" / "common" / "ready" + ack = PKT-LINE("ACK" SP obj-id) + nak = PKT-LINE("NAK") +---- + +A simple clone may look like this (with no 'have' lines): + +---- + C: 0054want 74730d410fcb6603ace96f1dc55ea6196122532d multi_ack \ + side-band-64k ofs-delta\n + C: 0032want 7d1665144a3a975c05f1f43902ddaf084e784dbe\n + C: 0032want 5a3f6be755bbb7deae50065988cbfa1ffa9ab68a\n + C: 0032want 7e47fe2bd8d01d481f44d7af0531bd93d3b21c01\n + C: 0032want 74730d410fcb6603ace96f1dc55ea6196122532d\n + C: 0000 + C: 0009done\n + + S: 0008NAK\n + S: [PACKFILE] +---- + +An incremental update (fetch) response might look like this: + +---- + C: 0054want 74730d410fcb6603ace96f1dc55ea6196122532d multi_ack \ + side-band-64k ofs-delta\n + C: 0032want 7d1665144a3a975c05f1f43902ddaf084e784dbe\n + C: 0032want 5a3f6be755bbb7deae50065988cbfa1ffa9ab68a\n + C: 0000 + C: 0032have 7e47fe2bd8d01d481f44d7af0531bd93d3b21c01\n + C: [30 more have lines] + C: 0032have 74730d410fcb6603ace96f1dc55ea6196122532d\n + C: 0000 + + S: 003aACK 7e47fe2bd8d01d481f44d7af0531bd93d3b21c01 continue\n + S: 003aACK 74730d410fcb6603ace96f1dc55ea6196122532d continue\n + S: 0008NAK\n + + C: 0009done\n + + S: 0031ACK 74730d410fcb6603ace96f1dc55ea6196122532d\n + S: [PACKFILE] +---- + + +Packfile Data +------------- + +Now that the client and server have finished negotiation about what +the minimal amount of data that needs to be sent to the client is, the server +will construct and send the required data in packfile format. + +See pack-format.txt for what the packfile itself actually looks like. + +If 'side-band' or 'side-band-64k' capabilities have been specified by +the client, the server will send the packfile data multiplexed. + +Each packet starting with the packet-line length of the amount of data +that follows, followed by a single byte specifying the sideband the +following data is coming in on. + +In 'side-band' mode, it will send up to 999 data bytes plus 1 control +code, for a total of up to 1000 bytes in a pkt-line. In 'side-band-64k' +mode it will send up to 65519 data bytes plus 1 control code, for a +total of up to 65520 bytes in a pkt-line. + +The sideband byte will be a '1', '2' or a '3'. Sideband '1' will contain +packfile data, sideband '2' will be used for progress information that the +client will generally print to stderr and sideband '3' is used for error +information. + +If no 'side-band' capability was specified, the server will stream the +entire packfile without multiplexing. + + +Pushing Data To a Server +------------------------ + +Pushing data to a server will invoke the 'receive-pack' process on the +server, which will allow the client to tell it which references it should +update and then send all the data the server will need for those new +references to be complete. Once all the data is received and validated, +the server will then update its references to what the client specified. + +Authentication +-------------- + +The protocol itself contains no authentication mechanisms. That is to be +handled by the transport, such as SSH, before the 'receive-pack' process is +invoked. If 'receive-pack' is configured over the Git transport, those +repositories will be writable by anyone who can access that port (9418) as +that transport is unauthenticated. + +Reference Discovery +------------------- + +The reference discovery phase is done nearly the same way as it is in the +fetching protocol. Each reference obj-id and name on the server is sent +in packet-line format to the client, followed by a flush-pkt. The only +real difference is that the capability listing is different - the only +possible values are 'report-status', 'delete-refs', 'ofs-delta' and +'push-options'. + +Reference Update Request and Packfile Transfer +---------------------------------------------- + +Once the client knows what references the server is at, it can send a +list of reference update requests. For each reference on the server +that it wants to update, it sends a line listing the obj-id currently on +the server, the obj-id the client would like to update it to and the name +of the reference. + +This list is followed by a flush-pkt. Then the push options are transmitted +one per packet followed by another flush-pkt. After that the packfile that +should contain all the objects that the server will need to complete the new +references will be sent. + +---- + update-request = *shallow ( command-list | push-cert ) [packfile] + + shallow = PKT-LINE("shallow" SP obj-id) + + command-list = PKT-LINE(command NUL capability-list) + *PKT-LINE(command) + flush-pkt + + command = create / delete / update + create = zero-id SP new-id SP name + delete = old-id SP zero-id SP name + update = old-id SP new-id SP name + + old-id = obj-id + new-id = obj-id + + push-cert = PKT-LINE("push-cert" NUL capability-list LF) + PKT-LINE("certificate version 0.1" LF) + PKT-LINE("pusher" SP ident LF) + PKT-LINE("pushee" SP url LF) + PKT-LINE("nonce" SP nonce LF) + PKT-LINE(LF) + *PKT-LINE(command LF) + *PKT-LINE(gpg-signature-lines LF) + PKT-LINE("push-cert-end" LF) + + packfile = "PACK" 28*(OCTET) +---- + +If the receiving end does not support delete-refs, the sending end MUST +NOT ask for delete command. + +If the receiving end does not support push-cert, the sending end +MUST NOT send a push-cert command. When a push-cert command is +sent, command-list MUST NOT be sent; the commands recorded in the +push certificate is used instead. + +The packfile MUST NOT be sent if the only command used is 'delete'. + +A packfile MUST be sent if either create or update command is used, +even if the server already has all the necessary objects. In this +case the client MUST send an empty packfile. The only time this +is likely to happen is if the client is creating +a new branch or a tag that points to an existing obj-id. + +The server will receive the packfile, unpack it, then validate each +reference that is being updated that it hasn't changed while the request +was being processed (the obj-id is still the same as the old-id), and +it will run any update hooks to make sure that the update is acceptable. +If all of that is fine, the server will then update the references. + +Push Certificate +---------------- + +A push certificate begins with a set of header lines. After the +header and an empty line, the protocol commands follow, one per +line. Note that the trailing LF in push-cert PKT-LINEs is _not_ +optional; it must be present. + +Currently, the following header fields are defined: + +`pusher` ident:: + Identify the GPG key in "Human Readable Name " + format. + +`pushee` url:: + The repository URL (anonymized, if the URL contains + authentication material) the user who ran `git push` + intended to push into. + +`nonce` nonce:: + The 'nonce' string the receiving repository asked the + pushing user to include in the certificate, to prevent + replay attacks. + +The GPG signature lines are a detached signature for the contents +recorded in the push certificate before the signature block begins. +The detached signature is used to certify that the commands were +given by the pusher, who must be the signer. + +Report Status +------------- + +After receiving the pack data from the sender, the receiver sends a +report if 'report-status' capability is in effect. +It is a short listing of what happened in that update. It will first +list the status of the packfile unpacking as either 'unpack ok' or +'unpack [error]'. Then it will list the status for each of the references +that it tried to update. Each line is either 'ok [refname]' if the +update was successful, or 'ng [refname] [error]' if the update was not. + +---- + report-status = unpack-status + 1*(command-status) + flush-pkt + + unpack-status = PKT-LINE("unpack" SP unpack-result) + unpack-result = "ok" / error-msg + + command-status = command-ok / command-fail + command-ok = PKT-LINE("ok" SP refname) + command-fail = PKT-LINE("ng" SP refname SP error-msg) + + error-msg = 1*(OCTECT) ; where not "ok" +---- + +Updates can be unsuccessful for a number of reasons. The reference can have +changed since the reference discovery phase was originally sent, meaning +someone pushed in the meantime. The reference being pushed could be a +non-fast-forward reference and the update hooks or configuration could be +set to not allow that, etc. Also, some references can be updated while others +can be rejected. + +An example client/server communication might look like this: + +---- + S: 007c74730d410fcb6603ace96f1dc55ea6196122532d refs/heads/local\0report-status delete-refs ofs-delta\n + S: 003e7d1665144a3a975c05f1f43902ddaf084e784dbe refs/heads/debug\n + S: 003f74730d410fcb6603ace96f1dc55ea6196122532d refs/heads/master\n + S: 003f74730d410fcb6603ace96f1dc55ea6196122532d refs/heads/team\n + S: 0000 + + C: 003e7d1665144a3a975c05f1f43902ddaf084e784dbe 74730d410fcb6603ace96f1dc55ea6196122532d refs/heads/debug\n + C: 003e74730d410fcb6603ace96f1dc55ea6196122532d 5a3f6be755bbb7deae50065988cbfa1ffa9ab68a refs/heads/master\n + C: 0000 + C: [PACKDATA] + + S: 000eunpack ok\n + S: 0018ok refs/heads/debug\n + S: 002ang refs/heads/master non-fast-forward\n +---- +*/ diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/report_status.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/report_status.go new file mode 100644 index 000000000..e2a0a108b --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/report_status.go @@ -0,0 +1,165 @@ +package packp + +import ( + "bytes" + "fmt" + "io" + "strings" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/pktline" +) + +const ( + ok = "ok" +) + +// ReportStatus is a report status message, as used in the git-receive-pack +// process whenever the 'report-status' capability is negotiated. +type ReportStatus struct { + UnpackStatus string + CommandStatuses []*CommandStatus +} + +// NewReportStatus creates a new ReportStatus message. +func NewReportStatus() *ReportStatus { + return &ReportStatus{} +} + +// Error returns the first error if any. +func (s *ReportStatus) Error() error { + if s.UnpackStatus != ok { + return fmt.Errorf("unpack error: %s", s.UnpackStatus) + } + + for _, s := range s.CommandStatuses { + if err := s.Error(); err != nil { + return err + } + } + + return nil +} + +// Encode writes the report status to a writer. +func (s *ReportStatus) Encode(w io.Writer) error { + e := pktline.NewEncoder(w) + if err := e.Encodef("unpack %s\n", s.UnpackStatus); err != nil { + return err + } + + for _, cs := range s.CommandStatuses { + if err := cs.encode(w); err != nil { + return err + } + } + + return e.Flush() +} + +// Decode reads from the given reader and decodes a report-status message. It +// does not read more input than what is needed to fill the report status. +func (s *ReportStatus) Decode(r io.Reader) error { + scan := pktline.NewScanner(r) + if err := s.scanFirstLine(scan); err != nil { + return err + } + + if err := s.decodeReportStatus(scan.Bytes()); err != nil { + return err + } + + flushed := false + for scan.Scan() { + b := scan.Bytes() + if isFlush(b) { + flushed = true + break + } + + if err := s.decodeCommandStatus(b); err != nil { + return err + } + } + + if !flushed { + return fmt.Errorf("missing flush") + } + + return scan.Err() +} + +func (s *ReportStatus) scanFirstLine(scan *pktline.Scanner) error { + if scan.Scan() { + return nil + } + + if scan.Err() != nil { + return scan.Err() + } + + return io.ErrUnexpectedEOF +} + +func (s *ReportStatus) decodeReportStatus(b []byte) error { + if isFlush(b) { + return fmt.Errorf("premature flush") + } + + b = bytes.TrimSuffix(b, eol) + + line := string(b) + fields := strings.SplitN(line, " ", 2) + if len(fields) != 2 || fields[0] != "unpack" { + return fmt.Errorf("malformed unpack status: %s", line) + } + + s.UnpackStatus = fields[1] + return nil +} + +func (s *ReportStatus) decodeCommandStatus(b []byte) error { + b = bytes.TrimSuffix(b, eol) + + line := string(b) + fields := strings.SplitN(line, " ", 3) + status := ok + if len(fields) == 3 && fields[0] == "ng" { + status = fields[2] + } else if len(fields) != 2 || fields[0] != "ok" { + return fmt.Errorf("malformed command status: %s", line) + } + + cs := &CommandStatus{ + ReferenceName: plumbing.ReferenceName(fields[1]), + Status: status, + } + s.CommandStatuses = append(s.CommandStatuses, cs) + return nil +} + +// CommandStatus is the status of a reference in a report status. +// See ReportStatus struct. +type CommandStatus struct { + ReferenceName plumbing.ReferenceName + Status string +} + +// Error returns the error, if any. +func (s *CommandStatus) Error() error { + if s.Status == ok { + return nil + } + + return fmt.Errorf("command error on %s: %s", + s.ReferenceName.String(), s.Status) +} + +func (s *CommandStatus) encode(w io.Writer) error { + e := pktline.NewEncoder(w) + if s.Error() == nil { + return e.Encodef("ok %s\n", s.ReferenceName.String()) + } + + return e.Encodef("ng %s %s\n", s.ReferenceName.String(), s.Status) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/shallowupd.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/shallowupd.go new file mode 100644 index 000000000..fe4fe6887 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/shallowupd.go @@ -0,0 +1,92 @@ +package packp + +import ( + "bytes" + "fmt" + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/pktline" +) + +const ( + shallowLineLen = 48 + unshallowLineLen = 50 +) + +type ShallowUpdate struct { + Shallows []plumbing.Hash + Unshallows []plumbing.Hash +} + +func (r *ShallowUpdate) Decode(reader io.Reader) error { + s := pktline.NewScanner(reader) + + for s.Scan() { + line := s.Bytes() + line = bytes.TrimSpace(line) + + var err error + switch { + case bytes.HasPrefix(line, shallow): + err = r.decodeShallowLine(line) + case bytes.HasPrefix(line, unshallow): + err = r.decodeUnshallowLine(line) + case bytes.Equal(line, pktline.Flush): + return nil + } + + if err != nil { + return err + } + } + + return s.Err() +} + +func (r *ShallowUpdate) decodeShallowLine(line []byte) error { + hash, err := r.decodeLine(line, shallow, shallowLineLen) + if err != nil { + return err + } + + r.Shallows = append(r.Shallows, hash) + return nil +} + +func (r *ShallowUpdate) decodeUnshallowLine(line []byte) error { + hash, err := r.decodeLine(line, unshallow, unshallowLineLen) + if err != nil { + return err + } + + r.Unshallows = append(r.Unshallows, hash) + return nil +} + +func (r *ShallowUpdate) decodeLine(line, prefix []byte, expLen int) (plumbing.Hash, error) { + if len(line) != expLen { + return plumbing.ZeroHash, fmt.Errorf("malformed %s%q", prefix, line) + } + + raw := string(line[expLen-40 : expLen]) + return plumbing.NewHash(raw), nil +} + +func (r *ShallowUpdate) Encode(w io.Writer) error { + e := pktline.NewEncoder(w) + + for _, h := range r.Shallows { + if err := e.Encodef("%s%s\n", shallow, h.String()); err != nil { + return err + } + } + + for _, h := range r.Unshallows { + if err := e.Encodef("%s%s\n", unshallow, h.String()); err != nil { + return err + } + } + + return e.Flush() +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/common.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/common.go new file mode 100644 index 000000000..de5001281 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/common.go @@ -0,0 +1,33 @@ +package sideband + +// Type sideband type "side-band" or "side-band-64k" +type Type int8 + +const ( + // Sideband legacy sideband type up to 1000-byte messages + Sideband Type = iota + // Sideband64k sideband type up to 65519-byte messages + Sideband64k Type = iota + + // MaxPackedSize for Sideband type + MaxPackedSize = 1000 + // MaxPackedSize64k for Sideband64k type + MaxPackedSize64k = 65520 +) + +// Channel sideband channel +type Channel byte + +// WithPayload encode the payload as a message +func (ch Channel) WithPayload(payload []byte) []byte { + return append([]byte{byte(ch)}, payload...) +} + +const ( + // PackData packfile content + PackData Channel = 1 + // ProgressMessage progress messages + ProgressMessage Channel = 2 + // ErrorMessage fatal error message just before stream aborts + ErrorMessage Channel = 3 +) diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/demux.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/demux.go new file mode 100644 index 000000000..0116f962e --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/demux.go @@ -0,0 +1,148 @@ +package sideband + +import ( + "errors" + "fmt" + "io" + + "github.com/go-git/go-git/v5/plumbing/format/pktline" +) + +// ErrMaxPackedExceeded returned by Read, if the maximum packed size is exceeded +var ErrMaxPackedExceeded = errors.New("max. packed size exceeded") + +// Progress where the progress information is stored +type Progress interface { + io.Writer +} + +// Demuxer demultiplexes the progress reports and error info interleaved with the +// packfile itself. +// +// A sideband has three different channels the main one, called PackData, contains +// the packfile data; the ErrorMessage channel, that contains server errors; and +// the last one, ProgressMessage channel, containing information about the ongoing +// task happening in the server (optional, can be suppressed sending NoProgress +// or Quiet capabilities to the server) +// +// In order to demultiplex the data stream, method `Read` should be called to +// retrieve the PackData channel, the incoming data from the ProgressMessage is +// written at `Progress` (if any), if any message is retrieved from the +// ErrorMessage channel an error is returned and we can assume that the +// connection has been closed. +type Demuxer struct { + t Type + r io.Reader + s *pktline.Scanner + + max int + pending []byte + + // Progress is where the progress messages are stored + Progress Progress +} + +// NewDemuxer returns a new Demuxer for the given t and read from r +func NewDemuxer(t Type, r io.Reader) *Demuxer { + max := MaxPackedSize64k + if t == Sideband { + max = MaxPackedSize + } + + return &Demuxer{ + t: t, + r: r, + max: max, + s: pktline.NewScanner(r), + } +} + +// Read reads up to len(p) bytes from the PackData channel into p, an error can +// be return if an error happens when reading or if a message is sent in the +// ErrorMessage channel. +// +// When a ProgressMessage is read, is not copy to b, instead of this is written +// to the Progress +func (d *Demuxer) Read(b []byte) (n int, err error) { + var read, req int + + req = len(b) + for read < req { + n, err := d.doRead(b[read:req]) + read += n + + if err != nil { + return read, err + } + } + + return read, nil +} + +func (d *Demuxer) doRead(b []byte) (int, error) { + read, err := d.nextPackData() + size := len(read) + wanted := len(b) + + if size > wanted { + d.pending = read[wanted:] + } + + if wanted > size { + wanted = size + } + + size = copy(b, read[:wanted]) + return size, err +} + +func (d *Demuxer) nextPackData() ([]byte, error) { + content := d.getPending() + if len(content) != 0 { + return content, nil + } + + if !d.s.Scan() { + if err := d.s.Err(); err != nil { + return nil, err + } + + return nil, io.EOF + } + + content = d.s.Bytes() + + size := len(content) + if size == 0 { + return nil, nil + } else if size > d.max { + return nil, ErrMaxPackedExceeded + } + + switch Channel(content[0]) { + case PackData: + return content[1:], nil + case ProgressMessage: + if d.Progress != nil { + _, err := d.Progress.Write(content[1:]) + return nil, err + } + case ErrorMessage: + return nil, fmt.Errorf("unexpected error: %s", content[1:]) + default: + return nil, fmt.Errorf("unknown channel %s", content) + } + + return nil, nil +} + +func (d *Demuxer) getPending() (b []byte) { + if len(d.pending) == 0 { + return nil + } + + content := d.pending + d.pending = nil + + return content +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/doc.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/doc.go new file mode 100644 index 000000000..c5d242952 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/doc.go @@ -0,0 +1,31 @@ +// Package sideband implements a sideband mutiplex/demultiplexer +package sideband + +// If 'side-band' or 'side-band-64k' capabilities have been specified by +// the client, the server will send the packfile data multiplexed. +// +// Either mode indicates that the packfile data will be streamed broken +// up into packets of up to either 1000 bytes in the case of 'side_band', +// or 65520 bytes in the case of 'side_band_64k'. Each packet is made up +// of a leading 4-byte pkt-line length of how much data is in the packet, +// followed by a 1-byte stream code, followed by the actual data. +// +// The stream code can be one of: +// +// 1 - pack data +// 2 - progress messages +// 3 - fatal error message just before stream aborts +// +// The "side-band-64k" capability came about as a way for newer clients +// that can handle much larger packets to request packets that are +// actually crammed nearly full, while maintaining backward compatibility +// for the older clients. +// +// Further, with side-band and its up to 1000-byte messages, it's actually +// 999 bytes of payload and 1 byte for the stream code. With side-band-64k, +// same deal, you have up to 65519 bytes of data and 1 byte for the stream +// code. +// +// The client MUST send only maximum of one of "side-band" and "side- +// band-64k". Server MUST diagnose it as an error if client requests +// both. diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/muxer.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/muxer.go new file mode 100644 index 000000000..d51ac8269 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/muxer.go @@ -0,0 +1,65 @@ +package sideband + +import ( + "io" + + "github.com/go-git/go-git/v5/plumbing/format/pktline" +) + +// Muxer multiplex the packfile along with the progress messages and the error +// information. The multiplex is perform using pktline format. +type Muxer struct { + max int + e *pktline.Encoder +} + +const chLen = 1 + +// NewMuxer returns a new Muxer for the given t that writes on w. +// +// If t is equal to `Sideband` the max pack size is set to MaxPackedSize, in any +// other value is given, max pack is set to MaxPackedSize64k, that is the +// maximum length of a line in pktline format. +func NewMuxer(t Type, w io.Writer) *Muxer { + max := MaxPackedSize64k + if t == Sideband { + max = MaxPackedSize + } + + return &Muxer{ + max: max - chLen, + e: pktline.NewEncoder(w), + } +} + +// Write writes p in the PackData channel +func (m *Muxer) Write(p []byte) (int, error) { + return m.WriteChannel(PackData, p) +} + +// WriteChannel writes p in the given channel. This method can be used with any +// channel, but is recommend use it only for the ProgressMessage and +// ErrorMessage channels and use Write for the PackData channel +func (m *Muxer) WriteChannel(t Channel, p []byte) (int, error) { + wrote := 0 + size := len(p) + for wrote < size { + n, err := m.doWrite(t, p[wrote:]) + wrote += n + + if err != nil { + return wrote, err + } + } + + return wrote, nil +} + +func (m *Muxer) doWrite(ch Channel, p []byte) (int, error) { + sz := len(p) + if sz > m.max { + sz = m.max + } + + return sz, m.e.Encode(ch.WithPayload(p[:sz])) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/srvresp.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/srvresp.go new file mode 100644 index 000000000..b3a7ee804 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/srvresp.go @@ -0,0 +1,127 @@ +package packp + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/pktline" +) + +const ackLineLen = 44 + +// ServerResponse object acknowledgement from upload-pack service +type ServerResponse struct { + ACKs []plumbing.Hash +} + +// Decode decodes the response into the struct, isMultiACK should be true, if +// the request was done with multi_ack or multi_ack_detailed capabilities. +func (r *ServerResponse) Decode(reader *bufio.Reader, isMultiACK bool) error { + // TODO: implement support for multi_ack or multi_ack_detailed responses + if isMultiACK { + return errors.New("multi_ack and multi_ack_detailed are not supported") + } + + s := pktline.NewScanner(reader) + + for s.Scan() { + line := s.Bytes() + + if err := r.decodeLine(line); err != nil { + return err + } + + // we need to detect when the end of a response header and the beginning + // of a packfile header happened, some requests to the git daemon + // produces a duplicate ACK header even when multi_ack is not supported. + stop, err := r.stopReading(reader) + if err != nil { + return err + } + + if stop { + break + } + } + + return s.Err() +} + +// stopReading detects when a valid command such as ACK or NAK is found to be +// read in the buffer without moving the read pointer. +func (r *ServerResponse) stopReading(reader *bufio.Reader) (bool, error) { + ahead, err := reader.Peek(7) + if err == io.EOF { + return true, nil + } + + if err != nil { + return false, err + } + + if len(ahead) > 4 && r.isValidCommand(ahead[0:3]) { + return false, nil + } + + if len(ahead) == 7 && r.isValidCommand(ahead[4:]) { + return false, nil + } + + return true, nil +} + +func (r *ServerResponse) isValidCommand(b []byte) bool { + commands := [][]byte{ack, nak} + for _, c := range commands { + if bytes.Equal(b, c) { + return true + } + } + + return false +} + +func (r *ServerResponse) decodeLine(line []byte) error { + if len(line) == 0 { + return fmt.Errorf("unexpected flush") + } + + if bytes.Equal(line[0:3], ack) { + return r.decodeACKLine(line) + } + + if bytes.Equal(line[0:3], nak) { + return nil + } + + return fmt.Errorf("unexpected content %q", string(line)) +} + +func (r *ServerResponse) decodeACKLine(line []byte) error { + if len(line) < ackLineLen { + return fmt.Errorf("malformed ACK %q", line) + } + + sp := bytes.Index(line, []byte(" ")) + h := plumbing.NewHash(string(line[sp+1 : sp+41])) + r.ACKs = append(r.ACKs, h) + return nil +} + +// Encode encodes the ServerResponse into a writer. +func (r *ServerResponse) Encode(w io.Writer) error { + if len(r.ACKs) > 1 { + return errors.New("multi_ack and multi_ack_detailed are not supported") + } + + e := pktline.NewEncoder(w) + if len(r.ACKs) == 0 { + return e.Encodef("%s\n", nak) + } + + return e.Encodef("%s %s\n", ack, r.ACKs[0].String()) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/ulreq.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/ulreq.go new file mode 100644 index 000000000..44db8e401 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/ulreq.go @@ -0,0 +1,168 @@ +package packp + +import ( + "fmt" + "time" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/capability" +) + +// UploadRequest values represent the information transmitted on a +// upload-request message. Values from this type are not zero-value +// safe, use the New function instead. +// This is a low level type, use UploadPackRequest instead. +type UploadRequest struct { + Capabilities *capability.List + Wants []plumbing.Hash + Shallows []plumbing.Hash + Depth Depth +} + +// Depth values stores the desired depth of the requested packfile: see +// DepthCommit, DepthSince and DepthReference. +type Depth interface { + isDepth() + IsZero() bool +} + +// DepthCommits values stores the maximum number of requested commits in +// the packfile. Zero means infinite. A negative value will have +// undefined consequences. +type DepthCommits int + +func (d DepthCommits) isDepth() {} + +func (d DepthCommits) IsZero() bool { + return d == 0 +} + +// DepthSince values requests only commits newer than the specified time. +type DepthSince time.Time + +func (d DepthSince) isDepth() {} + +func (d DepthSince) IsZero() bool { + return time.Time(d).IsZero() +} + +// DepthReference requests only commits not to found in the specified reference. +type DepthReference string + +func (d DepthReference) isDepth() {} + +func (d DepthReference) IsZero() bool { + return string(d) == "" +} + +// NewUploadRequest returns a pointer to a new UploadRequest value, ready to be +// used. It has no capabilities, wants or shallows and an infinite depth. Please +// note that to encode an upload-request it has to have at least one wanted hash. +func NewUploadRequest() *UploadRequest { + return &UploadRequest{ + Capabilities: capability.NewList(), + Wants: []plumbing.Hash{}, + Shallows: []plumbing.Hash{}, + Depth: DepthCommits(0), + } +} + +// NewUploadRequestFromCapabilities returns a pointer to a new UploadRequest +// value, the request capabilities are filled with the most optimal ones, based +// on the adv value (advertised capabilities), the UploadRequest generated it +// has no wants or shallows and an infinite depth. +func NewUploadRequestFromCapabilities(adv *capability.List) *UploadRequest { + r := NewUploadRequest() + + if adv.Supports(capability.MultiACKDetailed) { + r.Capabilities.Set(capability.MultiACKDetailed) + } else if adv.Supports(capability.MultiACK) { + r.Capabilities.Set(capability.MultiACK) + } + + if adv.Supports(capability.Sideband64k) { + r.Capabilities.Set(capability.Sideband64k) + } else if adv.Supports(capability.Sideband) { + r.Capabilities.Set(capability.Sideband) + } + + if adv.Supports(capability.ThinPack) { + r.Capabilities.Set(capability.ThinPack) + } + + if adv.Supports(capability.OFSDelta) { + r.Capabilities.Set(capability.OFSDelta) + } + + if adv.Supports(capability.Agent) { + r.Capabilities.Set(capability.Agent, capability.DefaultAgent) + } + + return r +} + +// Validate validates the content of UploadRequest, following the next rules: +// - Wants MUST have at least one reference +// - capability.Shallow MUST be present if Shallows is not empty +// - is a non-zero DepthCommits is given capability.Shallow MUST be present +// - is a DepthSince is given capability.Shallow MUST be present +// - is a DepthReference is given capability.DeepenNot MUST be present +// - MUST contain only maximum of one of capability.Sideband and capability.Sideband64k +// - MUST contain only maximum of one of capability.MultiACK and capability.MultiACKDetailed +func (r *UploadRequest) Validate() error { + if len(r.Wants) == 0 { + return fmt.Errorf("want can't be empty") + } + + if err := r.validateRequiredCapabilities(); err != nil { + return err + } + + if err := r.validateConflictCapabilities(); err != nil { + return err + } + + return nil +} + +func (r *UploadRequest) validateRequiredCapabilities() error { + msg := "missing capability %s" + + if len(r.Shallows) != 0 && !r.Capabilities.Supports(capability.Shallow) { + return fmt.Errorf(msg, capability.Shallow) + } + + switch r.Depth.(type) { + case DepthCommits: + if r.Depth != DepthCommits(0) { + if !r.Capabilities.Supports(capability.Shallow) { + return fmt.Errorf(msg, capability.Shallow) + } + } + case DepthSince: + if !r.Capabilities.Supports(capability.DeepenSince) { + return fmt.Errorf(msg, capability.DeepenSince) + } + case DepthReference: + if !r.Capabilities.Supports(capability.DeepenNot) { + return fmt.Errorf(msg, capability.DeepenNot) + } + } + + return nil +} + +func (r *UploadRequest) validateConflictCapabilities() error { + msg := "capabilities %s and %s are mutually exclusive" + if r.Capabilities.Supports(capability.Sideband) && + r.Capabilities.Supports(capability.Sideband64k) { + return fmt.Errorf(msg, capability.Sideband, capability.Sideband64k) + } + + if r.Capabilities.Supports(capability.MultiACK) && + r.Capabilities.Supports(capability.MultiACKDetailed) { + return fmt.Errorf(msg, capability.MultiACK, capability.MultiACKDetailed) + } + + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/ulreq_decode.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/ulreq_decode.go new file mode 100644 index 000000000..449b729a5 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/ulreq_decode.go @@ -0,0 +1,257 @@ +package packp + +import ( + "bytes" + "encoding/hex" + "fmt" + "io" + "strconv" + "time" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/pktline" +) + +// Decode reads the next upload-request form its input and +// stores it in the UploadRequest. +func (u *UploadRequest) Decode(r io.Reader) error { + d := newUlReqDecoder(r) + return d.Decode(u) +} + +type ulReqDecoder struct { + s *pktline.Scanner // a pkt-line scanner from the input stream + line []byte // current pkt-line contents, use parser.nextLine() to make it advance + nLine int // current pkt-line number for debugging, begins at 1 + err error // sticky error, use the parser.error() method to fill this out + data *UploadRequest // parsed data is stored here +} + +func newUlReqDecoder(r io.Reader) *ulReqDecoder { + return &ulReqDecoder{ + s: pktline.NewScanner(r), + } +} + +func (d *ulReqDecoder) Decode(v *UploadRequest) error { + d.data = v + + for state := d.decodeFirstWant; state != nil; { + state = state() + } + + return d.err +} + +// fills out the parser stiky error +func (d *ulReqDecoder) error(format string, a ...interface{}) { + msg := fmt.Sprintf( + "pkt-line %d: %s", d.nLine, + fmt.Sprintf(format, a...), + ) + + d.err = NewErrUnexpectedData(msg, d.line) +} + +// Reads a new pkt-line from the scanner, makes its payload available as +// p.line and increments p.nLine. A successful invocation returns true, +// otherwise, false is returned and the sticky error is filled out +// accordingly. Trims eols at the end of the payloads. +func (d *ulReqDecoder) nextLine() bool { + d.nLine++ + + if !d.s.Scan() { + if d.err = d.s.Err(); d.err != nil { + return false + } + + d.error("EOF") + return false + } + + d.line = d.s.Bytes() + d.line = bytes.TrimSuffix(d.line, eol) + + return true +} + +// Expected format: want [ capabilities] +func (d *ulReqDecoder) decodeFirstWant() stateFn { + if ok := d.nextLine(); !ok { + return nil + } + + if !bytes.HasPrefix(d.line, want) { + d.error("missing 'want ' prefix") + return nil + } + d.line = bytes.TrimPrefix(d.line, want) + + hash, ok := d.readHash() + if !ok { + return nil + } + d.data.Wants = append(d.data.Wants, hash) + + return d.decodeCaps +} + +func (d *ulReqDecoder) readHash() (plumbing.Hash, bool) { + if len(d.line) < hashSize { + d.err = fmt.Errorf("malformed hash: %v", d.line) + return plumbing.ZeroHash, false + } + + var hash plumbing.Hash + if _, err := hex.Decode(hash[:], d.line[:hashSize]); err != nil { + d.error("invalid hash text: %s", err) + return plumbing.ZeroHash, false + } + d.line = d.line[hashSize:] + + return hash, true +} + +// Expected format: sp cap1 sp cap2 sp cap3... +func (d *ulReqDecoder) decodeCaps() stateFn { + d.line = bytes.TrimPrefix(d.line, sp) + if err := d.data.Capabilities.Decode(d.line); err != nil { + d.error("invalid capabilities: %s", err) + } + + return d.decodeOtherWants +} + +// Expected format: want +func (d *ulReqDecoder) decodeOtherWants() stateFn { + if ok := d.nextLine(); !ok { + return nil + } + + if bytes.HasPrefix(d.line, shallow) { + return d.decodeShallow + } + + if bytes.HasPrefix(d.line, deepen) { + return d.decodeDeepen + } + + if len(d.line) == 0 { + return nil + } + + if !bytes.HasPrefix(d.line, want) { + d.error("unexpected payload while expecting a want: %q", d.line) + return nil + } + d.line = bytes.TrimPrefix(d.line, want) + + hash, ok := d.readHash() + if !ok { + return nil + } + d.data.Wants = append(d.data.Wants, hash) + + return d.decodeOtherWants +} + +// Expected format: shallow +func (d *ulReqDecoder) decodeShallow() stateFn { + if bytes.HasPrefix(d.line, deepen) { + return d.decodeDeepen + } + + if len(d.line) == 0 { + return nil + } + + if !bytes.HasPrefix(d.line, shallow) { + d.error("unexpected payload while expecting a shallow: %q", d.line) + return nil + } + d.line = bytes.TrimPrefix(d.line, shallow) + + hash, ok := d.readHash() + if !ok { + return nil + } + d.data.Shallows = append(d.data.Shallows, hash) + + if ok := d.nextLine(); !ok { + return nil + } + + return d.decodeShallow +} + +// Expected format: deepen / deepen-since
    / deepen-not +func (d *ulReqDecoder) decodeDeepen() stateFn { + if bytes.HasPrefix(d.line, deepenCommits) { + return d.decodeDeepenCommits + } + + if bytes.HasPrefix(d.line, deepenSince) { + return d.decodeDeepenSince + } + + if bytes.HasPrefix(d.line, deepenReference) { + return d.decodeDeepenReference + } + + if len(d.line) == 0 { + return nil + } + + d.error("unexpected deepen specification: %q", d.line) + return nil +} + +func (d *ulReqDecoder) decodeDeepenCommits() stateFn { + d.line = bytes.TrimPrefix(d.line, deepenCommits) + + var n int + if n, d.err = strconv.Atoi(string(d.line)); d.err != nil { + return nil + } + if n < 0 { + d.err = fmt.Errorf("negative depth") + return nil + } + d.data.Depth = DepthCommits(n) + + return d.decodeFlush +} + +func (d *ulReqDecoder) decodeDeepenSince() stateFn { + d.line = bytes.TrimPrefix(d.line, deepenSince) + + var secs int64 + secs, d.err = strconv.ParseInt(string(d.line), 10, 64) + if d.err != nil { + return nil + } + t := time.Unix(secs, 0).UTC() + d.data.Depth = DepthSince(t) + + return d.decodeFlush +} + +func (d *ulReqDecoder) decodeDeepenReference() stateFn { + d.line = bytes.TrimPrefix(d.line, deepenReference) + + d.data.Depth = DepthReference(string(d.line)) + + return d.decodeFlush +} + +func (d *ulReqDecoder) decodeFlush() stateFn { + if ok := d.nextLine(); !ok { + return nil + } + + if len(d.line) != 0 { + d.err = fmt.Errorf("unexpected payload while expecting a flush-pkt: %q", d.line) + } + + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/ulreq_encode.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/ulreq_encode.go new file mode 100644 index 000000000..486307688 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/ulreq_encode.go @@ -0,0 +1,145 @@ +package packp + +import ( + "bytes" + "fmt" + "io" + "time" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/pktline" +) + +// Encode writes the UlReq encoding of u to the stream. +// +// All the payloads will end with a newline character. Wants and +// shallows are sorted alphabetically. A depth of 0 means no depth +// request is sent. +func (u *UploadRequest) Encode(w io.Writer) error { + e := newUlReqEncoder(w) + return e.Encode(u) +} + +type ulReqEncoder struct { + pe *pktline.Encoder // where to write the encoded data + data *UploadRequest // the data to encode + err error // sticky error +} + +func newUlReqEncoder(w io.Writer) *ulReqEncoder { + return &ulReqEncoder{ + pe: pktline.NewEncoder(w), + } +} + +func (e *ulReqEncoder) Encode(v *UploadRequest) error { + e.data = v + + if len(v.Wants) == 0 { + return fmt.Errorf("empty wants provided") + } + + plumbing.HashesSort(e.data.Wants) + for state := e.encodeFirstWant; state != nil; { + state = state() + } + + return e.err +} + +func (e *ulReqEncoder) encodeFirstWant() stateFn { + var err error + if e.data.Capabilities.IsEmpty() { + err = e.pe.Encodef("want %s\n", e.data.Wants[0]) + } else { + err = e.pe.Encodef( + "want %s %s\n", + e.data.Wants[0], + e.data.Capabilities.String(), + ) + } + + if err != nil { + e.err = fmt.Errorf("encoding first want line: %s", err) + return nil + } + + return e.encodeAdditionalWants +} + +func (e *ulReqEncoder) encodeAdditionalWants() stateFn { + last := e.data.Wants[0] + for _, w := range e.data.Wants[1:] { + if bytes.Equal(last[:], w[:]) { + continue + } + + if err := e.pe.Encodef("want %s\n", w); err != nil { + e.err = fmt.Errorf("encoding want %q: %s", w, err) + return nil + } + + last = w + } + + return e.encodeShallows +} + +func (e *ulReqEncoder) encodeShallows() stateFn { + plumbing.HashesSort(e.data.Shallows) + + var last plumbing.Hash + for _, s := range e.data.Shallows { + if bytes.Equal(last[:], s[:]) { + continue + } + + if err := e.pe.Encodef("shallow %s\n", s); err != nil { + e.err = fmt.Errorf("encoding shallow %q: %s", s, err) + return nil + } + + last = s + } + + return e.encodeDepth +} + +func (e *ulReqEncoder) encodeDepth() stateFn { + switch depth := e.data.Depth.(type) { + case DepthCommits: + if depth != 0 { + commits := int(depth) + if err := e.pe.Encodef("deepen %d\n", commits); err != nil { + e.err = fmt.Errorf("encoding depth %d: %s", depth, err) + return nil + } + } + case DepthSince: + when := time.Time(depth).UTC() + if err := e.pe.Encodef("deepen-since %d\n", when.Unix()); err != nil { + e.err = fmt.Errorf("encoding depth %s: %s", when, err) + return nil + } + case DepthReference: + reference := string(depth) + if err := e.pe.Encodef("deepen-not %s\n", reference); err != nil { + e.err = fmt.Errorf("encoding depth %s: %s", reference, err) + return nil + } + default: + e.err = fmt.Errorf("unsupported depth type") + return nil + } + + return e.encodeFlush +} + +func (e *ulReqEncoder) encodeFlush() stateFn { + if err := e.pe.Flush(); err != nil { + e.err = fmt.Errorf("encoding flush-pkt: %s", err) + return nil + } + + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq.go new file mode 100644 index 000000000..b63b02340 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq.go @@ -0,0 +1,122 @@ +package packp + +import ( + "errors" + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/capability" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband" +) + +var ( + ErrEmptyCommands = errors.New("commands cannot be empty") + ErrMalformedCommand = errors.New("malformed command") +) + +// ReferenceUpdateRequest values represent reference upload requests. +// Values from this type are not zero-value safe, use the New function instead. +type ReferenceUpdateRequest struct { + Capabilities *capability.List + Commands []*Command + Shallow *plumbing.Hash + // Packfile contains an optional packfile reader. + Packfile io.ReadCloser + + // Progress receives sideband progress messages from the server + Progress sideband.Progress +} + +// New returns a pointer to a new ReferenceUpdateRequest value. +func NewReferenceUpdateRequest() *ReferenceUpdateRequest { + return &ReferenceUpdateRequest{ + // TODO: Add support for push-cert + Capabilities: capability.NewList(), + Commands: nil, + } +} + +// NewReferenceUpdateRequestFromCapabilities returns a pointer to a new +// ReferenceUpdateRequest value, the request capabilities are filled with the +// most optimal ones, based on the adv value (advertised capabilities), the +// ReferenceUpdateRequest contains no commands +// +// It does set the following capabilities: +// - agent +// - report-status +// - ofs-delta +// - ref-delta +// - delete-refs +// It leaves up to the user to add the following capabilities later: +// - atomic +// - ofs-delta +// - side-band +// - side-band-64k +// - quiet +// - push-cert +func NewReferenceUpdateRequestFromCapabilities(adv *capability.List) *ReferenceUpdateRequest { + r := NewReferenceUpdateRequest() + + if adv.Supports(capability.Agent) { + r.Capabilities.Set(capability.Agent, capability.DefaultAgent) + } + + if adv.Supports(capability.ReportStatus) { + r.Capabilities.Set(capability.ReportStatus) + } + + return r +} + +func (r *ReferenceUpdateRequest) validate() error { + if len(r.Commands) == 0 { + return ErrEmptyCommands + } + + for _, c := range r.Commands { + if err := c.validate(); err != nil { + return err + } + } + + return nil +} + +type Action string + +const ( + Create Action = "create" + Update = "update" + Delete = "delete" + Invalid = "invalid" +) + +type Command struct { + Name plumbing.ReferenceName + Old plumbing.Hash + New plumbing.Hash +} + +func (c *Command) Action() Action { + if c.Old == plumbing.ZeroHash && c.New == plumbing.ZeroHash { + return Invalid + } + + if c.Old == plumbing.ZeroHash { + return Create + } + + if c.New == plumbing.ZeroHash { + return Delete + } + + return Update +} + +func (c *Command) validate() error { + if c.Action() == Invalid { + return ErrMalformedCommand + } + + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq_decode.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq_decode.go new file mode 100644 index 000000000..2c9843a56 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq_decode.go @@ -0,0 +1,250 @@ +package packp + +import ( + "bytes" + "encoding/hex" + "errors" + "fmt" + "io" + "io/ioutil" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/pktline" +) + +var ( + shallowLineLength = len(shallow) + hashSize + minCommandLength = hashSize*2 + 2 + 1 + minCommandAndCapsLength = minCommandLength + 1 +) + +var ( + ErrEmpty = errors.New("empty update-request message") + errNoCommands = errors.New("unexpected EOF before any command") + errMissingCapabilitiesDelimiter = errors.New("capabilities delimiter not found") +) + +func errMalformedRequest(reason string) error { + return fmt.Errorf("malformed request: %s", reason) +} + +func errInvalidHashSize(got int) error { + return fmt.Errorf("invalid hash size: expected %d, got %d", + hashSize, got) +} + +func errInvalidHash(err error) error { + return fmt.Errorf("invalid hash: %s", err.Error()) +} + +func errInvalidShallowLineLength(got int) error { + return errMalformedRequest(fmt.Sprintf( + "invalid shallow line length: expected %d, got %d", + shallowLineLength, got)) +} + +func errInvalidCommandCapabilitiesLineLength(got int) error { + return errMalformedRequest(fmt.Sprintf( + "invalid command and capabilities line length: expected at least %d, got %d", + minCommandAndCapsLength, got)) +} + +func errInvalidCommandLineLength(got int) error { + return errMalformedRequest(fmt.Sprintf( + "invalid command line length: expected at least %d, got %d", + minCommandLength, got)) +} + +func errInvalidShallowObjId(err error) error { + return errMalformedRequest( + fmt.Sprintf("invalid shallow object id: %s", err.Error())) +} + +func errInvalidOldObjId(err error) error { + return errMalformedRequest( + fmt.Sprintf("invalid old object id: %s", err.Error())) +} + +func errInvalidNewObjId(err error) error { + return errMalformedRequest( + fmt.Sprintf("invalid new object id: %s", err.Error())) +} + +func errMalformedCommand(err error) error { + return errMalformedRequest(fmt.Sprintf( + "malformed command: %s", err.Error())) +} + +// Decode reads the next update-request message form the reader and wr +func (req *ReferenceUpdateRequest) Decode(r io.Reader) error { + var rc io.ReadCloser + var ok bool + rc, ok = r.(io.ReadCloser) + if !ok { + rc = ioutil.NopCloser(r) + } + + d := &updReqDecoder{r: rc, s: pktline.NewScanner(r)} + return d.Decode(req) +} + +type updReqDecoder struct { + r io.ReadCloser + s *pktline.Scanner + req *ReferenceUpdateRequest +} + +func (d *updReqDecoder) Decode(req *ReferenceUpdateRequest) error { + d.req = req + funcs := []func() error{ + d.scanLine, + d.decodeShallow, + d.decodeCommandAndCapabilities, + d.decodeCommands, + d.setPackfile, + req.validate, + } + + for _, f := range funcs { + if err := f(); err != nil { + return err + } + } + + return nil +} + +func (d *updReqDecoder) scanLine() error { + if ok := d.s.Scan(); !ok { + return d.scanErrorOr(ErrEmpty) + } + + return nil +} + +func (d *updReqDecoder) decodeShallow() error { + b := d.s.Bytes() + + if !bytes.HasPrefix(b, shallowNoSp) { + return nil + } + + if len(b) != shallowLineLength { + return errInvalidShallowLineLength(len(b)) + } + + h, err := parseHash(string(b[len(shallow):])) + if err != nil { + return errInvalidShallowObjId(err) + } + + if ok := d.s.Scan(); !ok { + return d.scanErrorOr(errNoCommands) + } + + d.req.Shallow = &h + + return nil +} + +func (d *updReqDecoder) decodeCommands() error { + for { + b := d.s.Bytes() + if bytes.Equal(b, pktline.Flush) { + return nil + } + + c, err := parseCommand(b) + if err != nil { + return err + } + + d.req.Commands = append(d.req.Commands, c) + + if ok := d.s.Scan(); !ok { + return d.s.Err() + } + } +} + +func (d *updReqDecoder) decodeCommandAndCapabilities() error { + b := d.s.Bytes() + i := bytes.IndexByte(b, 0) + if i == -1 { + return errMissingCapabilitiesDelimiter + } + + if len(b) < minCommandAndCapsLength { + return errInvalidCommandCapabilitiesLineLength(len(b)) + } + + cmd, err := parseCommand(b[:i]) + if err != nil { + return err + } + + d.req.Commands = append(d.req.Commands, cmd) + + if err := d.req.Capabilities.Decode(b[i+1:]); err != nil { + return err + } + + if err := d.scanLine(); err != nil { + return err + } + + return nil +} + +func (d *updReqDecoder) setPackfile() error { + d.req.Packfile = d.r + + return nil +} + +func parseCommand(b []byte) (*Command, error) { + if len(b) < minCommandLength { + return nil, errInvalidCommandLineLength(len(b)) + } + + var ( + os, ns string + n plumbing.ReferenceName + ) + if _, err := fmt.Sscanf(string(b), "%s %s %s", &os, &ns, &n); err != nil { + return nil, errMalformedCommand(err) + } + + oh, err := parseHash(os) + if err != nil { + return nil, errInvalidOldObjId(err) + } + + nh, err := parseHash(ns) + if err != nil { + return nil, errInvalidNewObjId(err) + } + + return &Command{Old: oh, New: nh, Name: n}, nil +} + +func parseHash(s string) (plumbing.Hash, error) { + if len(s) != hashSize { + return plumbing.ZeroHash, errInvalidHashSize(len(s)) + } + + if _, err := hex.DecodeString(s); err != nil { + return plumbing.ZeroHash, errInvalidHash(err) + } + + h := plumbing.NewHash(s) + return h, nil +} + +func (d *updReqDecoder) scanErrorOr(origErr error) error { + if err := d.s.Err(); err != nil { + return err + } + + return origErr +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq_encode.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq_encode.go new file mode 100644 index 000000000..6a79653f1 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq_encode.go @@ -0,0 +1,75 @@ +package packp + +import ( + "fmt" + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/pktline" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/capability" +) + +var ( + zeroHashString = plumbing.ZeroHash.String() +) + +// Encode writes the ReferenceUpdateRequest encoding to the stream. +func (r *ReferenceUpdateRequest) Encode(w io.Writer) error { + if err := r.validate(); err != nil { + return err + } + + e := pktline.NewEncoder(w) + + if err := r.encodeShallow(e, r.Shallow); err != nil { + return err + } + + if err := r.encodeCommands(e, r.Commands, r.Capabilities); err != nil { + return err + } + + if r.Packfile != nil { + if _, err := io.Copy(w, r.Packfile); err != nil { + return err + } + + return r.Packfile.Close() + } + + return nil +} + +func (r *ReferenceUpdateRequest) encodeShallow(e *pktline.Encoder, + h *plumbing.Hash) error { + + if h == nil { + return nil + } + + objId := []byte(h.String()) + return e.Encodef("%s%s", shallow, objId) +} + +func (r *ReferenceUpdateRequest) encodeCommands(e *pktline.Encoder, + cmds []*Command, cap *capability.List) error { + + if err := e.Encodef("%s\x00%s", + formatCommand(cmds[0]), cap.String()); err != nil { + return err + } + + for _, cmd := range cmds[1:] { + if err := e.Encodef(formatCommand(cmd)); err != nil { + return err + } + } + + return e.Flush() +} + +func formatCommand(cmd *Command) string { + o := cmd.Old.String() + n := cmd.New.String() + return fmt.Sprintf("%s %s %s", o, n, cmd.Name) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/uppackreq.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/uppackreq.go new file mode 100644 index 000000000..de2206b3f --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/uppackreq.go @@ -0,0 +1,98 @@ +package packp + +import ( + "bytes" + "fmt" + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/pktline" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/capability" +) + +// UploadPackRequest represents a upload-pack request. +// Zero-value is not safe, use NewUploadPackRequest instead. +type UploadPackRequest struct { + UploadRequest + UploadHaves +} + +// NewUploadPackRequest creates a new UploadPackRequest and returns a pointer. +func NewUploadPackRequest() *UploadPackRequest { + ur := NewUploadRequest() + return &UploadPackRequest{ + UploadHaves: UploadHaves{}, + UploadRequest: *ur, + } +} + +// NewUploadPackRequestFromCapabilities creates a new UploadPackRequest and +// returns a pointer. The request capabilities are filled with the most optimal +// ones, based on the adv value (advertised capabilities), the UploadPackRequest +// it has no wants, haves or shallows and an infinite depth +func NewUploadPackRequestFromCapabilities(adv *capability.List) *UploadPackRequest { + ur := NewUploadRequestFromCapabilities(adv) + return &UploadPackRequest{ + UploadHaves: UploadHaves{}, + UploadRequest: *ur, + } +} + +// IsEmpty a request if empty if Haves are contained in the Wants, or if Wants +// length is zero +func (r *UploadPackRequest) IsEmpty() bool { + return isSubset(r.Wants, r.Haves) +} + +func isSubset(needle []plumbing.Hash, haystack []plumbing.Hash) bool { + for _, h := range needle { + found := false + for _, oh := range haystack { + if h == oh { + found = true + break + } + } + + if !found { + return false + } + } + + return true +} + +// UploadHaves is a message to signal the references that a client has in a +// upload-pack. Do not use this directly. Use UploadPackRequest request instead. +type UploadHaves struct { + Haves []plumbing.Hash +} + +// Encode encodes the UploadHaves into the Writer. If flush is true, a flush +// command will be encoded at the end of the writer content. +func (u *UploadHaves) Encode(w io.Writer, flush bool) error { + e := pktline.NewEncoder(w) + + plumbing.HashesSort(u.Haves) + + var last plumbing.Hash + for _, have := range u.Haves { + if bytes.Equal(last[:], have[:]) { + continue + } + + if err := e.Encodef("have %s\n", have); err != nil { + return fmt.Errorf("sending haves for %q: %s", have, err) + } + + last = have + } + + if flush && len(u.Haves) != 0 { + if err := e.Flush(); err != nil { + return fmt.Errorf("sending flush-pkt after haves: %s", err) + } + } + + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/uppackresp.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/uppackresp.go new file mode 100644 index 000000000..a9a7192ea --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/uppackresp.go @@ -0,0 +1,109 @@ +package packp + +import ( + "errors" + "io" + + "bufio" + + "github.com/go-git/go-git/v5/plumbing/protocol/packp/capability" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +// ErrUploadPackResponseNotDecoded is returned if Read is called without +// decoding first +var ErrUploadPackResponseNotDecoded = errors.New("upload-pack-response should be decoded") + +// UploadPackResponse contains all the information responded by the upload-pack +// service, the response implements io.ReadCloser that allows to read the +// packfile directly from it. +type UploadPackResponse struct { + ShallowUpdate + ServerResponse + + r io.ReadCloser + isShallow bool + isMultiACK bool + isOk bool +} + +// NewUploadPackResponse create a new UploadPackResponse instance, the request +// being responded by the response is required. +func NewUploadPackResponse(req *UploadPackRequest) *UploadPackResponse { + isShallow := !req.Depth.IsZero() + isMultiACK := req.Capabilities.Supports(capability.MultiACK) || + req.Capabilities.Supports(capability.MultiACKDetailed) + + return &UploadPackResponse{ + isShallow: isShallow, + isMultiACK: isMultiACK, + } +} + +// NewUploadPackResponseWithPackfile creates a new UploadPackResponse instance, +// and sets its packfile reader. +func NewUploadPackResponseWithPackfile(req *UploadPackRequest, + pf io.ReadCloser) *UploadPackResponse { + + r := NewUploadPackResponse(req) + r.r = pf + return r +} + +// Decode decodes all the responses sent by upload-pack service into the struct +// and prepares it to read the packfile using the Read method +func (r *UploadPackResponse) Decode(reader io.ReadCloser) error { + buf := bufio.NewReader(reader) + + if r.isShallow { + if err := r.ShallowUpdate.Decode(buf); err != nil { + return err + } + } + + if err := r.ServerResponse.Decode(buf, r.isMultiACK); err != nil { + return err + } + + // now the reader is ready to read the packfile content + r.r = ioutil.NewReadCloser(buf, reader) + + return nil +} + +// Encode encodes an UploadPackResponse. +func (r *UploadPackResponse) Encode(w io.Writer) (err error) { + if r.isShallow { + if err := r.ShallowUpdate.Encode(w); err != nil { + return err + } + } + + if err := r.ServerResponse.Encode(w); err != nil { + return err + } + + defer ioutil.CheckClose(r.r, &err) + _, err = io.Copy(w, r.r) + return err +} + +// Read reads the packfile data, if the request was done with any Sideband +// capability the content read should be demultiplexed. If the methods wasn't +// called before the ErrUploadPackResponseNotDecoded will be return +func (r *UploadPackResponse) Read(p []byte) (int, error) { + if r.r == nil { + return 0, ErrUploadPackResponseNotDecoded + } + + return r.r.Read(p) +} + +// Close the underlying reader, if any +func (r *UploadPackResponse) Close() error { + if r.r == nil { + return nil + } + + return r.r.Close() +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/reference.go b/vendor/github.com/go-git/go-git/v5/plumbing/reference.go new file mode 100644 index 000000000..08e908f1f --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/reference.go @@ -0,0 +1,209 @@ +package plumbing + +import ( + "errors" + "fmt" + "strings" +) + +const ( + refPrefix = "refs/" + refHeadPrefix = refPrefix + "heads/" + refTagPrefix = refPrefix + "tags/" + refRemotePrefix = refPrefix + "remotes/" + refNotePrefix = refPrefix + "notes/" + symrefPrefix = "ref: " +) + +// RefRevParseRules are a set of rules to parse references into short names. +// These are the same rules as used by git in shorten_unambiguous_ref. +// See: https://github.com/git/git/blob/e0aaa1b6532cfce93d87af9bc813fb2e7a7ce9d7/refs.c#L417 +var RefRevParseRules = []string{ + "refs/%s", + "refs/tags/%s", + "refs/heads/%s", + "refs/remotes/%s", + "refs/remotes/%s/HEAD", +} + +var ( + ErrReferenceNotFound = errors.New("reference not found") +) + +// ReferenceType reference type's +type ReferenceType int8 + +const ( + InvalidReference ReferenceType = 0 + HashReference ReferenceType = 1 + SymbolicReference ReferenceType = 2 +) + +func (r ReferenceType) String() string { + switch r { + case InvalidReference: + return "invalid-reference" + case HashReference: + return "hash-reference" + case SymbolicReference: + return "symbolic-reference" + } + + return "" +} + +// ReferenceName reference name's +type ReferenceName string + +// NewBranchReferenceName returns a reference name describing a branch based on +// his short name. +func NewBranchReferenceName(name string) ReferenceName { + return ReferenceName(refHeadPrefix + name) +} + +// NewNoteReferenceName returns a reference name describing a note based on his +// short name. +func NewNoteReferenceName(name string) ReferenceName { + return ReferenceName(refNotePrefix + name) +} + +// NewRemoteReferenceName returns a reference name describing a remote branch +// based on his short name and the remote name. +func NewRemoteReferenceName(remote, name string) ReferenceName { + return ReferenceName(refRemotePrefix + fmt.Sprintf("%s/%s", remote, name)) +} + +// NewRemoteHEADReferenceName returns a reference name describing a the HEAD +// branch of a remote. +func NewRemoteHEADReferenceName(remote string) ReferenceName { + return ReferenceName(refRemotePrefix + fmt.Sprintf("%s/%s", remote, HEAD)) +} + +// NewTagReferenceName returns a reference name describing a tag based on short +// his name. +func NewTagReferenceName(name string) ReferenceName { + return ReferenceName(refTagPrefix + name) +} + +// IsBranch check if a reference is a branch +func (r ReferenceName) IsBranch() bool { + return strings.HasPrefix(string(r), refHeadPrefix) +} + +// IsNote check if a reference is a note +func (r ReferenceName) IsNote() bool { + return strings.HasPrefix(string(r), refNotePrefix) +} + +// IsRemote check if a reference is a remote +func (r ReferenceName) IsRemote() bool { + return strings.HasPrefix(string(r), refRemotePrefix) +} + +// IsTag check if a reference is a tag +func (r ReferenceName) IsTag() bool { + return strings.HasPrefix(string(r), refTagPrefix) +} + +func (r ReferenceName) String() string { + return string(r) +} + +// Short returns the short name of a ReferenceName +func (r ReferenceName) Short() string { + s := string(r) + res := s + for _, format := range RefRevParseRules { + _, err := fmt.Sscanf(s, format, &res) + if err == nil { + continue + } + } + + return res +} + +const ( + HEAD ReferenceName = "HEAD" + Master ReferenceName = "refs/heads/master" +) + +// Reference is a representation of git reference +type Reference struct { + t ReferenceType + n ReferenceName + h Hash + target ReferenceName +} + +// NewReferenceFromStrings creates a reference from name and target as string, +// the resulting reference can be a SymbolicReference or a HashReference base +// on the target provided +func NewReferenceFromStrings(name, target string) *Reference { + n := ReferenceName(name) + + if strings.HasPrefix(target, symrefPrefix) { + target := ReferenceName(target[len(symrefPrefix):]) + return NewSymbolicReference(n, target) + } + + return NewHashReference(n, NewHash(target)) +} + +// NewSymbolicReference creates a new SymbolicReference reference +func NewSymbolicReference(n, target ReferenceName) *Reference { + return &Reference{ + t: SymbolicReference, + n: n, + target: target, + } +} + +// NewHashReference creates a new HashReference reference +func NewHashReference(n ReferenceName, h Hash) *Reference { + return &Reference{ + t: HashReference, + n: n, + h: h, + } +} + +// Type return the type of a reference +func (r *Reference) Type() ReferenceType { + return r.t +} + +// Name return the name of a reference +func (r *Reference) Name() ReferenceName { + return r.n +} + +// Hash return the hash of a hash reference +func (r *Reference) Hash() Hash { + return r.h +} + +// Target return the target of a symbolic reference +func (r *Reference) Target() ReferenceName { + return r.target +} + +// Strings dump a reference as a [2]string +func (r *Reference) Strings() [2]string { + var o [2]string + o[0] = r.Name().String() + + switch r.Type() { + case HashReference: + o[1] = r.Hash().String() + case SymbolicReference: + o[1] = symrefPrefix + r.Target().String() + } + + return o +} + +func (r *Reference) String() string { + s := r.Strings() + return fmt.Sprintf("%s %s", s[1], s[0]) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/revision.go b/vendor/github.com/go-git/go-git/v5/plumbing/revision.go new file mode 100644 index 000000000..5f053b200 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/revision.go @@ -0,0 +1,11 @@ +package plumbing + +// Revision represents a git revision +// to get more details about git revisions +// please check git manual page : +// https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html +type Revision string + +func (r Revision) String() string { + return string(r) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/revlist/revlist.go b/vendor/github.com/go-git/go-git/v5/plumbing/revlist/revlist.go new file mode 100644 index 000000000..b9109870f --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/revlist/revlist.go @@ -0,0 +1,230 @@ +// Package revlist provides support to access the ancestors of commits, in a +// similar way as the git-rev-list command. +package revlist + +import ( + "fmt" + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/filemode" + "github.com/go-git/go-git/v5/plumbing/object" + "github.com/go-git/go-git/v5/plumbing/storer" +) + +// Objects applies a complementary set. It gets all the hashes from all +// the reachable objects from the given objects. Ignore param are object hashes +// that we want to ignore on the result. All that objects must be accessible +// from the object storer. +func Objects( + s storer.EncodedObjectStorer, + objs, + ignore []plumbing.Hash, +) ([]plumbing.Hash, error) { + return ObjectsWithStorageForIgnores(s, s, objs, ignore) +} + +// ObjectsWithStorageForIgnores is the same as Objects, but a +// secondary storage layer can be provided, to be used to finding the +// full set of objects to be ignored while finding the reachable +// objects. This is useful when the main `s` storage layer is slow +// and/or remote, while the ignore list is available somewhere local. +func ObjectsWithStorageForIgnores( + s, ignoreStore storer.EncodedObjectStorer, + objs, + ignore []plumbing.Hash, +) ([]plumbing.Hash, error) { + ignore, err := objects(ignoreStore, ignore, nil, true) + if err != nil { + return nil, err + } + + return objects(s, objs, ignore, false) +} + +func objects( + s storer.EncodedObjectStorer, + objects, + ignore []plumbing.Hash, + allowMissingObjects bool, +) ([]plumbing.Hash, error) { + seen := hashListToSet(ignore) + result := make(map[plumbing.Hash]bool) + visited := make(map[plumbing.Hash]bool) + + walkerFunc := func(h plumbing.Hash) { + if !seen[h] { + result[h] = true + seen[h] = true + } + } + + for _, h := range objects { + if err := processObject(s, h, seen, visited, ignore, walkerFunc); err != nil { + if allowMissingObjects && err == plumbing.ErrObjectNotFound { + continue + } + + return nil, err + } + } + + return hashSetToList(result), nil +} + +// processObject obtains the object using the hash an process it depending of its type +func processObject( + s storer.EncodedObjectStorer, + h plumbing.Hash, + seen map[plumbing.Hash]bool, + visited map[plumbing.Hash]bool, + ignore []plumbing.Hash, + walkerFunc func(h plumbing.Hash), +) error { + if seen[h] { + return nil + } + + o, err := s.EncodedObject(plumbing.AnyObject, h) + if err != nil { + return err + } + + do, err := object.DecodeObject(s, o) + if err != nil { + return err + } + + switch do := do.(type) { + case *object.Commit: + return reachableObjects(do, seen, visited, ignore, walkerFunc) + case *object.Tree: + return iterateCommitTrees(seen, do, walkerFunc) + case *object.Tag: + walkerFunc(do.Hash) + return processObject(s, do.Target, seen, visited, ignore, walkerFunc) + case *object.Blob: + walkerFunc(do.Hash) + default: + return fmt.Errorf("object type not valid: %s. "+ + "Object reference: %s", o.Type(), o.Hash()) + } + + return nil +} + +// reachableObjects returns, using the callback function, all the reachable +// objects from the specified commit. To avoid to iterate over seen commits, +// if a commit hash is into the 'seen' set, we will not iterate all his trees +// and blobs objects. +func reachableObjects( + commit *object.Commit, + seen map[plumbing.Hash]bool, + visited map[plumbing.Hash]bool, + ignore []plumbing.Hash, + cb func(h plumbing.Hash), +) error { + i := object.NewCommitPreorderIter(commit, seen, ignore) + pending := make(map[plumbing.Hash]bool) + addPendingParents(pending, visited, commit) + for { + commit, err := i.Next() + if err == io.EOF { + break + } + + if err != nil { + return err + } + + if pending[commit.Hash] { + delete(pending, commit.Hash) + } + + addPendingParents(pending, visited, commit) + + if visited[commit.Hash] && len(pending) == 0 { + break + } + + if seen[commit.Hash] { + continue + } + + cb(commit.Hash) + + tree, err := commit.Tree() + if err != nil { + return err + } + + if err := iterateCommitTrees(seen, tree, cb); err != nil { + return err + } + } + + return nil +} + +func addPendingParents(pending, visited map[plumbing.Hash]bool, commit *object.Commit) { + for _, p := range commit.ParentHashes { + if !visited[p] { + pending[p] = true + } + } +} + +// iterateCommitTrees iterate all reachable trees from the given commit +func iterateCommitTrees( + seen map[plumbing.Hash]bool, + tree *object.Tree, + cb func(h plumbing.Hash), +) error { + if seen[tree.Hash] { + return nil + } + + cb(tree.Hash) + + treeWalker := object.NewTreeWalker(tree, true, seen) + + for { + _, e, err := treeWalker.Next() + if err == io.EOF { + break + } + if err != nil { + return err + } + + if e.Mode == filemode.Submodule { + continue + } + + if seen[e.Hash] { + continue + } + + cb(e.Hash) + } + + return nil +} + +func hashSetToList(hashes map[plumbing.Hash]bool) []plumbing.Hash { + var result []plumbing.Hash + for key := range hashes { + result = append(result, key) + } + + return result +} + +func hashListToSet(hashes []plumbing.Hash) map[plumbing.Hash]bool { + result := make(map[plumbing.Hash]bool) + for _, h := range hashes { + result[h] = true + } + + return result +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/storer/doc.go b/vendor/github.com/go-git/go-git/v5/plumbing/storer/doc.go new file mode 100644 index 000000000..4d4f179c6 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/storer/doc.go @@ -0,0 +1,2 @@ +// Package storer defines the interfaces to store objects, references, etc. +package storer diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/storer/index.go b/vendor/github.com/go-git/go-git/v5/plumbing/storer/index.go new file mode 100644 index 000000000..33113949b --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/storer/index.go @@ -0,0 +1,9 @@ +package storer + +import "github.com/go-git/go-git/v5/plumbing/format/index" + +// IndexStorer generic storage of index.Index +type IndexStorer interface { + SetIndex(*index.Index) error + Index() (*index.Index, error) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/storer/object.go b/vendor/github.com/go-git/go-git/v5/plumbing/storer/object.go new file mode 100644 index 000000000..dfe309db1 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/storer/object.go @@ -0,0 +1,288 @@ +package storer + +import ( + "errors" + "io" + "time" + + "github.com/go-git/go-git/v5/plumbing" +) + +var ( + //ErrStop is used to stop a ForEach function in an Iter + ErrStop = errors.New("stop iter") +) + +// EncodedObjectStorer generic storage of objects +type EncodedObjectStorer interface { + // NewEncodedObject returns a new plumbing.EncodedObject, the real type + // of the object can be a custom implementation or the default one, + // plumbing.MemoryObject. + NewEncodedObject() plumbing.EncodedObject + // SetEncodedObject saves an object into the storage, the object should + // be create with the NewEncodedObject, method, and file if the type is + // not supported. + SetEncodedObject(plumbing.EncodedObject) (plumbing.Hash, error) + // EncodedObject gets an object by hash with the given + // plumbing.ObjectType. Implementors should return + // (nil, plumbing.ErrObjectNotFound) if an object doesn't exist with + // both the given hash and object type. + // + // Valid plumbing.ObjectType values are CommitObject, BlobObject, TagObject, + // TreeObject and AnyObject. If plumbing.AnyObject is given, the object must + // be looked up regardless of its type. + EncodedObject(plumbing.ObjectType, plumbing.Hash) (plumbing.EncodedObject, error) + // IterObjects returns a custom EncodedObjectStorer over all the object + // on the storage. + // + // Valid plumbing.ObjectType values are CommitObject, BlobObject, TagObject, + IterEncodedObjects(plumbing.ObjectType) (EncodedObjectIter, error) + // HasEncodedObject returns ErrObjNotFound if the object doesn't + // exist. If the object does exist, it returns nil. + HasEncodedObject(plumbing.Hash) error + // EncodedObjectSize returns the plaintext size of the encoded object. + EncodedObjectSize(plumbing.Hash) (int64, error) +} + +// DeltaObjectStorer is an EncodedObjectStorer that can return delta +// objects. +type DeltaObjectStorer interface { + // DeltaObject is the same as EncodedObject but without resolving deltas. + // Deltas will be returned as plumbing.DeltaObject instances. + DeltaObject(plumbing.ObjectType, plumbing.Hash) (plumbing.EncodedObject, error) +} + +// Transactioner is a optional method for ObjectStorer, it enable transaction +// base write and read operations in the storage +type Transactioner interface { + // Begin starts a transaction. + Begin() Transaction +} + +// LooseObjectStorer is an optional interface for managing "loose" +// objects, i.e. those not in packfiles. +type LooseObjectStorer interface { + // ForEachObjectHash iterates over all the (loose) object hashes + // in the repository without necessarily having to read those objects. + // Objects only inside pack files may be omitted. + // If ErrStop is sent the iteration is stop but no error is returned. + ForEachObjectHash(func(plumbing.Hash) error) error + // LooseObjectTime looks up the (m)time associated with the + // loose object (that is not in a pack file). Some + // implementations (e.g. without loose objects) + // always return an error. + LooseObjectTime(plumbing.Hash) (time.Time, error) + // DeleteLooseObject deletes a loose object if it exists. + DeleteLooseObject(plumbing.Hash) error +} + +// PackedObjectStorer is an optional interface for managing objects in +// packfiles. +type PackedObjectStorer interface { + // ObjectPacks returns hashes of object packs if the underlying + // implementation has pack files. + ObjectPacks() ([]plumbing.Hash, error) + // DeleteOldObjectPackAndIndex deletes an object pack and the corresponding index file if they exist. + // Deletion is only performed if the pack is older than the supplied time (or the time is zero). + DeleteOldObjectPackAndIndex(plumbing.Hash, time.Time) error +} + +// PackfileWriter is a optional method for ObjectStorer, it enable direct write +// of packfile to the storage +type PackfileWriter interface { + // PackfileWriter returns a writer for writing a packfile to the storage + // + // If the Storer not implements PackfileWriter the objects should be written + // using the Set method. + PackfileWriter() (io.WriteCloser, error) +} + +// EncodedObjectIter is a generic closable interface for iterating over objects. +type EncodedObjectIter interface { + Next() (plumbing.EncodedObject, error) + ForEach(func(plumbing.EncodedObject) error) error + Close() +} + +// Transaction is an in-progress storage transaction. A transaction must end +// with a call to Commit or Rollback. +type Transaction interface { + SetEncodedObject(plumbing.EncodedObject) (plumbing.Hash, error) + EncodedObject(plumbing.ObjectType, plumbing.Hash) (plumbing.EncodedObject, error) + Commit() error + Rollback() error +} + +// EncodedObjectLookupIter implements EncodedObjectIter. It iterates over a +// series of object hashes and yields their associated objects by retrieving +// each one from object storage. The retrievals are lazy and only occur when the +// iterator moves forward with a call to Next(). +// +// The EncodedObjectLookupIter must be closed with a call to Close() when it is +// no longer needed. +type EncodedObjectLookupIter struct { + storage EncodedObjectStorer + series []plumbing.Hash + t plumbing.ObjectType + pos int +} + +// NewEncodedObjectLookupIter returns an object iterator given an object storage +// and a slice of object hashes. +func NewEncodedObjectLookupIter( + storage EncodedObjectStorer, t plumbing.ObjectType, series []plumbing.Hash) *EncodedObjectLookupIter { + return &EncodedObjectLookupIter{ + storage: storage, + series: series, + t: t, + } +} + +// Next returns the next object from the iterator. If the iterator has reached +// the end it will return io.EOF as an error. If the object can't be found in +// the object storage, it will return plumbing.ErrObjectNotFound as an error. +// If the object is retrieved successfully error will be nil. +func (iter *EncodedObjectLookupIter) Next() (plumbing.EncodedObject, error) { + if iter.pos >= len(iter.series) { + return nil, io.EOF + } + + hash := iter.series[iter.pos] + obj, err := iter.storage.EncodedObject(iter.t, hash) + if err == nil { + iter.pos++ + } + + return obj, err +} + +// ForEach call the cb function for each object contained on this iter until +// an error happens or the end of the iter is reached. If ErrStop is sent +// the iteration is stop but no error is returned. The iterator is closed. +func (iter *EncodedObjectLookupIter) ForEach(cb func(plumbing.EncodedObject) error) error { + return ForEachIterator(iter, cb) +} + +// Close releases any resources used by the iterator. +func (iter *EncodedObjectLookupIter) Close() { + iter.pos = len(iter.series) +} + +// EncodedObjectSliceIter implements EncodedObjectIter. It iterates over a +// series of objects stored in a slice and yields each one in turn when Next() +// is called. +// +// The EncodedObjectSliceIter must be closed with a call to Close() when it is +// no longer needed. +type EncodedObjectSliceIter struct { + series []plumbing.EncodedObject +} + +// NewEncodedObjectSliceIter returns an object iterator for the given slice of +// objects. +func NewEncodedObjectSliceIter(series []plumbing.EncodedObject) *EncodedObjectSliceIter { + return &EncodedObjectSliceIter{ + series: series, + } +} + +// Next returns the next object from the iterator. If the iterator has reached +// the end it will return io.EOF as an error. If the object is retrieved +// successfully error will be nil. +func (iter *EncodedObjectSliceIter) Next() (plumbing.EncodedObject, error) { + if len(iter.series) == 0 { + return nil, io.EOF + } + + obj := iter.series[0] + iter.series = iter.series[1:] + + return obj, nil +} + +// ForEach call the cb function for each object contained on this iter until +// an error happens or the end of the iter is reached. If ErrStop is sent +// the iteration is stop but no error is returned. The iterator is closed. +func (iter *EncodedObjectSliceIter) ForEach(cb func(plumbing.EncodedObject) error) error { + return ForEachIterator(iter, cb) +} + +// Close releases any resources used by the iterator. +func (iter *EncodedObjectSliceIter) Close() { + iter.series = []plumbing.EncodedObject{} +} + +// MultiEncodedObjectIter implements EncodedObjectIter. It iterates over several +// EncodedObjectIter, +// +// The MultiObjectIter must be closed with a call to Close() when it is no +// longer needed. +type MultiEncodedObjectIter struct { + iters []EncodedObjectIter +} + +// NewMultiEncodedObjectIter returns an object iterator for the given slice of +// EncodedObjectIters. +func NewMultiEncodedObjectIter(iters []EncodedObjectIter) EncodedObjectIter { + return &MultiEncodedObjectIter{iters: iters} +} + +// Next returns the next object from the iterator, if one iterator reach io.EOF +// is removed and the next one is used. +func (iter *MultiEncodedObjectIter) Next() (plumbing.EncodedObject, error) { + if len(iter.iters) == 0 { + return nil, io.EOF + } + + obj, err := iter.iters[0].Next() + if err == io.EOF { + iter.iters[0].Close() + iter.iters = iter.iters[1:] + return iter.Next() + } + + return obj, err +} + +// ForEach call the cb function for each object contained on this iter until +// an error happens or the end of the iter is reached. If ErrStop is sent +// the iteration is stop but no error is returned. The iterator is closed. +func (iter *MultiEncodedObjectIter) ForEach(cb func(plumbing.EncodedObject) error) error { + return ForEachIterator(iter, cb) +} + +// Close releases any resources used by the iterator. +func (iter *MultiEncodedObjectIter) Close() { + for _, i := range iter.iters { + i.Close() + } +} + +type bareIterator interface { + Next() (plumbing.EncodedObject, error) + Close() +} + +// ForEachIterator is a helper function to build iterators without need to +// rewrite the same ForEach function each time. +func ForEachIterator(iter bareIterator, cb func(plumbing.EncodedObject) error) error { + defer iter.Close() + for { + obj, err := iter.Next() + if err != nil { + if err == io.EOF { + return nil + } + + return err + } + + if err := cb(obj); err != nil { + if err == ErrStop { + return nil + } + + return err + } + } +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/storer/reference.go b/vendor/github.com/go-git/go-git/v5/plumbing/storer/reference.go new file mode 100644 index 000000000..1d74ef3c6 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/storer/reference.go @@ -0,0 +1,240 @@ +package storer + +import ( + "errors" + "io" + + "github.com/go-git/go-git/v5/plumbing" +) + +const MaxResolveRecursion = 1024 + +// ErrMaxResolveRecursion is returned by ResolveReference is MaxResolveRecursion +// is exceeded +var ErrMaxResolveRecursion = errors.New("max. recursion level reached") + +// ReferenceStorer is a generic storage of references. +type ReferenceStorer interface { + SetReference(*plumbing.Reference) error + // CheckAndSetReference sets the reference `new`, but if `old` is + // not `nil`, it first checks that the current stored value for + // `old.Name()` matches the given reference value in `old`. If + // not, it returns an error and doesn't update `new`. + CheckAndSetReference(new, old *plumbing.Reference) error + Reference(plumbing.ReferenceName) (*plumbing.Reference, error) + IterReferences() (ReferenceIter, error) + RemoveReference(plumbing.ReferenceName) error + CountLooseRefs() (int, error) + PackRefs() error +} + +// ReferenceIter is a generic closable interface for iterating over references. +type ReferenceIter interface { + Next() (*plumbing.Reference, error) + ForEach(func(*plumbing.Reference) error) error + Close() +} + +type referenceFilteredIter struct { + ff func(r *plumbing.Reference) bool + iter ReferenceIter +} + +// NewReferenceFilteredIter returns a reference iterator for the given reference +// Iterator. This iterator will iterate only references that accomplish the +// provided function. +func NewReferenceFilteredIter( + ff func(r *plumbing.Reference) bool, iter ReferenceIter) ReferenceIter { + return &referenceFilteredIter{ff, iter} +} + +// Next returns the next reference from the iterator. If the iterator has reached +// the end it will return io.EOF as an error. +func (iter *referenceFilteredIter) Next() (*plumbing.Reference, error) { + for { + r, err := iter.iter.Next() + if err != nil { + return nil, err + } + + if iter.ff(r) { + return r, nil + } + + continue + } +} + +// ForEach call the cb function for each reference contained on this iter until +// an error happens or the end of the iter is reached. If ErrStop is sent +// the iteration is stopped but no error is returned. The iterator is closed. +func (iter *referenceFilteredIter) ForEach(cb func(*plumbing.Reference) error) error { + defer iter.Close() + for { + r, err := iter.Next() + if err == io.EOF { + break + } + if err != nil { + return err + } + + if err := cb(r); err != nil { + if err == ErrStop { + break + } + + return err + } + } + + return nil +} + +// Close releases any resources used by the iterator. +func (iter *referenceFilteredIter) Close() { + iter.iter.Close() +} + +// ReferenceSliceIter implements ReferenceIter. It iterates over a series of +// references stored in a slice and yields each one in turn when Next() is +// called. +// +// The ReferenceSliceIter must be closed with a call to Close() when it is no +// longer needed. +type ReferenceSliceIter struct { + series []*plumbing.Reference + pos int +} + +// NewReferenceSliceIter returns a reference iterator for the given slice of +// objects. +func NewReferenceSliceIter(series []*plumbing.Reference) ReferenceIter { + return &ReferenceSliceIter{ + series: series, + } +} + +// Next returns the next reference from the iterator. If the iterator has +// reached the end it will return io.EOF as an error. +func (iter *ReferenceSliceIter) Next() (*plumbing.Reference, error) { + if iter.pos >= len(iter.series) { + return nil, io.EOF + } + + obj := iter.series[iter.pos] + iter.pos++ + return obj, nil +} + +// ForEach call the cb function for each reference contained on this iter until +// an error happens or the end of the iter is reached. If ErrStop is sent +// the iteration is stop but no error is returned. The iterator is closed. +func (iter *ReferenceSliceIter) ForEach(cb func(*plumbing.Reference) error) error { + return forEachReferenceIter(iter, cb) +} + +type bareReferenceIterator interface { + Next() (*plumbing.Reference, error) + Close() +} + +func forEachReferenceIter(iter bareReferenceIterator, cb func(*plumbing.Reference) error) error { + defer iter.Close() + for { + obj, err := iter.Next() + if err != nil { + if err == io.EOF { + return nil + } + + return err + } + + if err := cb(obj); err != nil { + if err == ErrStop { + return nil + } + + return err + } + } +} + +// Close releases any resources used by the iterator. +func (iter *ReferenceSliceIter) Close() { + iter.pos = len(iter.series) +} + +// MultiReferenceIter implements ReferenceIter. It iterates over several +// ReferenceIter, +// +// The MultiReferenceIter must be closed with a call to Close() when it is no +// longer needed. +type MultiReferenceIter struct { + iters []ReferenceIter +} + +// NewMultiReferenceIter returns an reference iterator for the given slice of +// EncodedObjectIters. +func NewMultiReferenceIter(iters []ReferenceIter) ReferenceIter { + return &MultiReferenceIter{iters: iters} +} + +// Next returns the next reference from the iterator, if one iterator reach +// io.EOF is removed and the next one is used. +func (iter *MultiReferenceIter) Next() (*plumbing.Reference, error) { + if len(iter.iters) == 0 { + return nil, io.EOF + } + + obj, err := iter.iters[0].Next() + if err == io.EOF { + iter.iters[0].Close() + iter.iters = iter.iters[1:] + return iter.Next() + } + + return obj, err +} + +// ForEach call the cb function for each reference contained on this iter until +// an error happens or the end of the iter is reached. If ErrStop is sent +// the iteration is stop but no error is returned. The iterator is closed. +func (iter *MultiReferenceIter) ForEach(cb func(*plumbing.Reference) error) error { + return forEachReferenceIter(iter, cb) +} + +// Close releases any resources used by the iterator. +func (iter *MultiReferenceIter) Close() { + for _, i := range iter.iters { + i.Close() + } +} + +// ResolveReference resolves a SymbolicReference to a HashReference. +func ResolveReference(s ReferenceStorer, n plumbing.ReferenceName) (*plumbing.Reference, error) { + r, err := s.Reference(n) + if err != nil || r == nil { + return r, err + } + return resolveReference(s, r, 0) +} + +func resolveReference(s ReferenceStorer, r *plumbing.Reference, recursion int) (*plumbing.Reference, error) { + if r.Type() != plumbing.SymbolicReference { + return r, nil + } + + if recursion > MaxResolveRecursion { + return nil, ErrMaxResolveRecursion + } + + t, err := s.Reference(r.Target()) + if err != nil { + return nil, err + } + + recursion++ + return resolveReference(s, t, recursion) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/storer/shallow.go b/vendor/github.com/go-git/go-git/v5/plumbing/storer/shallow.go new file mode 100644 index 000000000..39ef5ea5c --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/storer/shallow.go @@ -0,0 +1,10 @@ +package storer + +import "github.com/go-git/go-git/v5/plumbing" + +// ShallowStorer is a storage of references to shallow commits by hash, +// meaning that these commits have missing parents because of a shallow fetch. +type ShallowStorer interface { + SetShallow([]plumbing.Hash) error + Shallow() ([]plumbing.Hash, error) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/storer/storer.go b/vendor/github.com/go-git/go-git/v5/plumbing/storer/storer.go new file mode 100644 index 000000000..c7bc65a0c --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/storer/storer.go @@ -0,0 +1,15 @@ +package storer + +// Storer is a basic storer for encoded objects and references. +type Storer interface { + EncodedObjectStorer + ReferenceStorer +} + +// Initializer should be implemented by storers that require to perform any +// operation when creating a new repository (i.e. git init). +type Initializer interface { + // Init performs initialization of the storer and returns the error, if + // any. + Init() error +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/client/client.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/client/client.go new file mode 100644 index 000000000..4f6d210e9 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/client/client.go @@ -0,0 +1,48 @@ +// Package client contains helper function to deal with the different client +// protocols. +package client + +import ( + "fmt" + + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/plumbing/transport/file" + "github.com/go-git/go-git/v5/plumbing/transport/git" + "github.com/go-git/go-git/v5/plumbing/transport/http" + "github.com/go-git/go-git/v5/plumbing/transport/ssh" +) + +// Protocols are the protocols supported by default. +var Protocols = map[string]transport.Transport{ + "http": http.DefaultClient, + "https": http.DefaultClient, + "ssh": ssh.DefaultClient, + "git": git.DefaultClient, + "file": file.DefaultClient, +} + +// InstallProtocol adds or modifies an existing protocol. +func InstallProtocol(scheme string, c transport.Transport) { + if c == nil { + delete(Protocols, scheme) + return + } + + Protocols[scheme] = c +} + +// NewClient returns the appropriate client among of the set of known protocols: +// http://, https://, ssh:// and file://. +// See `InstallProtocol` to add or modify protocols. +func NewClient(endpoint *transport.Endpoint) (transport.Transport, error) { + f, ok := Protocols[endpoint.Protocol] + if !ok { + return nil, fmt.Errorf("unsupported scheme %q", endpoint.Protocol) + } + + if f == nil { + return nil, fmt.Errorf("malformed client for scheme %q, client is defined as nil", endpoint.Protocol) + } + + return f, nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/common.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/common.go new file mode 100644 index 000000000..ead215557 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/common.go @@ -0,0 +1,274 @@ +// Package transport includes the implementation for different transport +// protocols. +// +// `Client` can be used to fetch and send packfiles to a git server. +// The `client` package provides higher level functions to instantiate the +// appropriate `Client` based on the repository URL. +// +// go-git supports HTTP and SSH (see `Protocols`), but you can also install +// your own protocols (see the `client` package). +// +// Each protocol has its own implementation of `Client`, but you should +// generally not use them directly, use `client.NewClient` instead. +package transport + +import ( + "bytes" + "context" + "errors" + "fmt" + "io" + "net/url" + "strconv" + "strings" + + giturl "github.com/go-git/go-git/v5/internal/url" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/protocol/packp" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/capability" +) + +var ( + ErrRepositoryNotFound = errors.New("repository not found") + ErrEmptyRemoteRepository = errors.New("remote repository is empty") + ErrAuthenticationRequired = errors.New("authentication required") + ErrAuthorizationFailed = errors.New("authorization failed") + ErrEmptyUploadPackRequest = errors.New("empty git-upload-pack given") + ErrInvalidAuthMethod = errors.New("invalid auth method") + ErrAlreadyConnected = errors.New("session already established") +) + +const ( + UploadPackServiceName = "git-upload-pack" + ReceivePackServiceName = "git-receive-pack" +) + +// Transport can initiate git-upload-pack and git-receive-pack processes. +// It is implemented both by the client and the server, making this a RPC. +type Transport interface { + // NewUploadPackSession starts a git-upload-pack session for an endpoint. + NewUploadPackSession(*Endpoint, AuthMethod) (UploadPackSession, error) + // NewReceivePackSession starts a git-receive-pack session for an endpoint. + NewReceivePackSession(*Endpoint, AuthMethod) (ReceivePackSession, error) +} + +type Session interface { + // AdvertisedReferences retrieves the advertised references for a + // repository. + // If the repository does not exist, returns ErrRepositoryNotFound. + // If the repository exists, but is empty, returns ErrEmptyRemoteRepository. + AdvertisedReferences() (*packp.AdvRefs, error) + io.Closer +} + +type AuthMethod interface { + fmt.Stringer + Name() string +} + +// UploadPackSession represents a git-upload-pack session. +// A git-upload-pack session has two steps: reference discovery +// (AdvertisedReferences) and uploading pack (UploadPack). +type UploadPackSession interface { + Session + // UploadPack takes a git-upload-pack request and returns a response, + // including a packfile. Don't be confused by terminology, the client + // side of a git-upload-pack is called git-fetch-pack, although here + // the same interface is used to make it RPC-like. + UploadPack(context.Context, *packp.UploadPackRequest) (*packp.UploadPackResponse, error) +} + +// ReceivePackSession represents a git-receive-pack session. +// A git-receive-pack session has two steps: reference discovery +// (AdvertisedReferences) and receiving pack (ReceivePack). +// In that order. +type ReceivePackSession interface { + Session + // ReceivePack sends an update references request and a packfile + // reader and returns a ReportStatus and error. Don't be confused by + // terminology, the client side of a git-receive-pack is called + // git-send-pack, although here the same interface is used to make it + // RPC-like. + ReceivePack(context.Context, *packp.ReferenceUpdateRequest) (*packp.ReportStatus, error) +} + +// Endpoint represents a Git URL in any supported protocol. +type Endpoint struct { + // Protocol is the protocol of the endpoint (e.g. git, https, file). + Protocol string + // User is the user. + User string + // Password is the password. + Password string + // Host is the host. + Host string + // Port is the port to connect, if 0 the default port for the given protocol + // wil be used. + Port int + // Path is the repository path. + Path string +} + +var defaultPorts = map[string]int{ + "http": 80, + "https": 443, + "git": 9418, + "ssh": 22, +} + +// String returns a string representation of the Git URL. +func (u *Endpoint) String() string { + var buf bytes.Buffer + if u.Protocol != "" { + buf.WriteString(u.Protocol) + buf.WriteByte(':') + } + + if u.Protocol != "" || u.Host != "" || u.User != "" || u.Password != "" { + buf.WriteString("//") + + if u.User != "" || u.Password != "" { + buf.WriteString(url.PathEscape(u.User)) + if u.Password != "" { + buf.WriteByte(':') + buf.WriteString(url.PathEscape(u.Password)) + } + + buf.WriteByte('@') + } + + if u.Host != "" { + buf.WriteString(u.Host) + + if u.Port != 0 { + port, ok := defaultPorts[strings.ToLower(u.Protocol)] + if !ok || ok && port != u.Port { + fmt.Fprintf(&buf, ":%d", u.Port) + } + } + } + } + + if u.Path != "" && u.Path[0] != '/' && u.Host != "" { + buf.WriteByte('/') + } + + buf.WriteString(u.Path) + return buf.String() +} + +func NewEndpoint(endpoint string) (*Endpoint, error) { + if e, ok := parseSCPLike(endpoint); ok { + return e, nil + } + + if e, ok := parseFile(endpoint); ok { + return e, nil + } + + return parseURL(endpoint) +} + +func parseURL(endpoint string) (*Endpoint, error) { + u, err := url.Parse(endpoint) + if err != nil { + return nil, err + } + + if !u.IsAbs() { + return nil, plumbing.NewPermanentError(fmt.Errorf( + "invalid endpoint: %s", endpoint, + )) + } + + var user, pass string + if u.User != nil { + user = u.User.Username() + pass, _ = u.User.Password() + } + + return &Endpoint{ + Protocol: u.Scheme, + User: user, + Password: pass, + Host: u.Hostname(), + Port: getPort(u), + Path: getPath(u), + }, nil +} + +func getPort(u *url.URL) int { + p := u.Port() + if p == "" { + return 0 + } + + i, err := strconv.Atoi(p) + if err != nil { + return 0 + } + + return i +} + +func getPath(u *url.URL) string { + var res string = u.Path + if u.RawQuery != "" { + res += "?" + u.RawQuery + } + + if u.Fragment != "" { + res += "#" + u.Fragment + } + + return res +} + +func parseSCPLike(endpoint string) (*Endpoint, bool) { + if giturl.MatchesScheme(endpoint) || !giturl.MatchesScpLike(endpoint) { + return nil, false + } + + user, host, portStr, path := giturl.FindScpLikeComponents(endpoint) + port, err := strconv.Atoi(portStr) + if err != nil { + port = 22 + } + + return &Endpoint{ + Protocol: "ssh", + User: user, + Host: host, + Port: port, + Path: path, + }, true +} + +func parseFile(endpoint string) (*Endpoint, bool) { + if giturl.MatchesScheme(endpoint) { + return nil, false + } + + path := endpoint + return &Endpoint{ + Protocol: "file", + Path: path, + }, true +} + +// UnsupportedCapabilities are the capabilities not supported by any client +// implementation +var UnsupportedCapabilities = []capability.Capability{ + capability.MultiACK, + capability.MultiACKDetailed, + capability.ThinPack, +} + +// FilterUnsupportedCapabilities it filter out all the UnsupportedCapabilities +// from a capability.List, the intended usage is on the client implementation +// to filter the capabilities from an AdvRefs message. +func FilterUnsupportedCapabilities(list *capability.List) { + for _, c := range UnsupportedCapabilities { + list.Delete(c) + } +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/file/client.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/file/client.go new file mode 100644 index 000000000..f6e23652a --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/file/client.go @@ -0,0 +1,156 @@ +// Package file implements the file transport protocol. +package file + +import ( + "bufio" + "errors" + "io" + "os" + "os/exec" + "path/filepath" + "strings" + + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/plumbing/transport/internal/common" +) + +// DefaultClient is the default local client. +var DefaultClient = NewClient( + transport.UploadPackServiceName, + transport.ReceivePackServiceName, +) + +type runner struct { + UploadPackBin string + ReceivePackBin string +} + +// NewClient returns a new local client using the given git-upload-pack and +// git-receive-pack binaries. +func NewClient(uploadPackBin, receivePackBin string) transport.Transport { + return common.NewClient(&runner{ + UploadPackBin: uploadPackBin, + ReceivePackBin: receivePackBin, + }) +} + +func prefixExecPath(cmd string) (string, error) { + // Use `git --exec-path` to find the exec path. + execCmd := exec.Command("git", "--exec-path") + + stdout, err := execCmd.StdoutPipe() + if err != nil { + return "", err + } + stdoutBuf := bufio.NewReader(stdout) + + err = execCmd.Start() + if err != nil { + return "", err + } + + execPathBytes, isPrefix, err := stdoutBuf.ReadLine() + if err != nil { + return "", err + } + if isPrefix { + return "", errors.New("Couldn't read exec-path line all at once") + } + + err = execCmd.Wait() + if err != nil { + return "", err + } + execPath := string(execPathBytes) + execPath = strings.TrimSpace(execPath) + cmd = filepath.Join(execPath, cmd) + + // Make sure it actually exists. + _, err = exec.LookPath(cmd) + if err != nil { + return "", err + } + return cmd, nil +} + +func (r *runner) Command(cmd string, ep *transport.Endpoint, auth transport.AuthMethod, +) (common.Command, error) { + + switch cmd { + case transport.UploadPackServiceName: + cmd = r.UploadPackBin + case transport.ReceivePackServiceName: + cmd = r.ReceivePackBin + } + + _, err := exec.LookPath(cmd) + if err != nil { + if e, ok := err.(*exec.Error); ok && e.Err == exec.ErrNotFound { + cmd, err = prefixExecPath(cmd) + if err != nil { + return nil, err + } + } else { + return nil, err + } + } + + return &command{cmd: exec.Command(cmd, ep.Path)}, nil +} + +type command struct { + cmd *exec.Cmd + stderrCloser io.Closer + closed bool +} + +func (c *command) Start() error { + return c.cmd.Start() +} + +func (c *command) StderrPipe() (io.Reader, error) { + // Pipe returned by Command.StderrPipe has a race with Read + Command.Wait. + // We use an io.Pipe and close it after the command finishes. + r, w := io.Pipe() + c.cmd.Stderr = w + c.stderrCloser = r + return r, nil +} + +func (c *command) StdinPipe() (io.WriteCloser, error) { + return c.cmd.StdinPipe() +} + +func (c *command) StdoutPipe() (io.Reader, error) { + return c.cmd.StdoutPipe() +} + +func (c *command) Kill() error { + c.cmd.Process.Kill() + return c.Close() +} + +// Close waits for the command to exit. +func (c *command) Close() error { + if c.closed { + return nil + } + + defer func() { + c.closed = true + _ = c.stderrCloser.Close() + + }() + + err := c.cmd.Wait() + if _, ok := err.(*os.PathError); ok { + return nil + } + + // When a repository does not exist, the command exits with code 128. + if _, ok := err.(*exec.ExitError); ok { + return nil + } + + return err +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/file/server.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/file/server.go new file mode 100644 index 000000000..b45d7a71c --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/file/server.go @@ -0,0 +1,53 @@ +package file + +import ( + "fmt" + "os" + + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/plumbing/transport/internal/common" + "github.com/go-git/go-git/v5/plumbing/transport/server" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +// ServeUploadPack serves a git-upload-pack request using standard output, input +// and error. This is meant to be used when implementing a git-upload-pack +// command. +func ServeUploadPack(path string) error { + ep, err := transport.NewEndpoint(path) + if err != nil { + return err + } + + // TODO: define and implement a server-side AuthMethod + s, err := server.DefaultServer.NewUploadPackSession(ep, nil) + if err != nil { + return fmt.Errorf("error creating session: %s", err) + } + + return common.ServeUploadPack(srvCmd, s) +} + +// ServeReceivePack serves a git-receive-pack request using standard output, +// input and error. This is meant to be used when implementing a +// git-receive-pack command. +func ServeReceivePack(path string) error { + ep, err := transport.NewEndpoint(path) + if err != nil { + return err + } + + // TODO: define and implement a server-side AuthMethod + s, err := server.DefaultServer.NewReceivePackSession(ep, nil) + if err != nil { + return fmt.Errorf("error creating session: %s", err) + } + + return common.ServeReceivePack(srvCmd, s) +} + +var srvCmd = common.ServerCommand{ + Stdin: os.Stdin, + Stdout: ioutil.WriteNopCloser(os.Stdout), + Stderr: os.Stderr, +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/git/common.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/git/common.go new file mode 100644 index 000000000..306aae261 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/git/common.go @@ -0,0 +1,109 @@ +// Package git implements the git transport protocol. +package git + +import ( + "fmt" + "io" + "net" + + "github.com/go-git/go-git/v5/plumbing/format/pktline" + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/plumbing/transport/internal/common" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +// DefaultClient is the default git client. +var DefaultClient = common.NewClient(&runner{}) + +const DefaultPort = 9418 + +type runner struct{} + +// Command returns a new Command for the given cmd in the given Endpoint +func (r *runner) Command(cmd string, ep *transport.Endpoint, auth transport.AuthMethod) (common.Command, error) { + // auth not allowed since git protocol doesn't support authentication + if auth != nil { + return nil, transport.ErrInvalidAuthMethod + } + c := &command{command: cmd, endpoint: ep} + if err := c.connect(); err != nil { + return nil, err + } + return c, nil +} + +type command struct { + conn net.Conn + connected bool + command string + endpoint *transport.Endpoint +} + +// Start executes the command sending the required message to the TCP connection +func (c *command) Start() error { + cmd := endpointToCommand(c.command, c.endpoint) + + e := pktline.NewEncoder(c.conn) + return e.Encode([]byte(cmd)) +} + +func (c *command) connect() error { + if c.connected { + return transport.ErrAlreadyConnected + } + + var err error + c.conn, err = net.Dial("tcp", c.getHostWithPort()) + if err != nil { + return err + } + + c.connected = true + return nil +} + +func (c *command) getHostWithPort() string { + host := c.endpoint.Host + port := c.endpoint.Port + if port <= 0 { + port = DefaultPort + } + + return fmt.Sprintf("%s:%d", host, port) +} + +// StderrPipe git protocol doesn't have any dedicated error channel +func (c *command) StderrPipe() (io.Reader, error) { + return nil, nil +} + +// StdinPipe return the underlying connection as WriteCloser, wrapped to prevent +// call to the Close function from the connection, a command execution in git +// protocol can't be closed or killed +func (c *command) StdinPipe() (io.WriteCloser, error) { + return ioutil.WriteNopCloser(c.conn), nil +} + +// StdoutPipe return the underlying connection as Reader +func (c *command) StdoutPipe() (io.Reader, error) { + return c.conn, nil +} + +func endpointToCommand(cmd string, ep *transport.Endpoint) string { + host := ep.Host + if ep.Port != DefaultPort { + host = fmt.Sprintf("%s:%d", ep.Host, ep.Port) + } + + return fmt.Sprintf("%s %s%chost=%s%c", cmd, ep.Path, 0, host, 0) +} + +// Close closes the TCP connection and connection. +func (c *command) Close() error { + if !c.connected { + return nil + } + + c.connected = false + return c.conn.Close() +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/common.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/common.go new file mode 100644 index 000000000..aeedc5bb5 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/common.go @@ -0,0 +1,281 @@ +// Package http implements the HTTP transport protocol. +package http + +import ( + "bytes" + "fmt" + "net" + "net/http" + "strconv" + "strings" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/protocol/packp" + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +// it requires a bytes.Buffer, because we need to know the length +func applyHeadersToRequest(req *http.Request, content *bytes.Buffer, host string, requestType string) { + req.Header.Add("User-Agent", "git/1.0") + req.Header.Add("Host", host) // host:port + + if content == nil { + req.Header.Add("Accept", "*/*") + return + } + + req.Header.Add("Accept", fmt.Sprintf("application/x-%s-result", requestType)) + req.Header.Add("Content-Type", fmt.Sprintf("application/x-%s-request", requestType)) + req.Header.Add("Content-Length", strconv.Itoa(content.Len())) +} + +const infoRefsPath = "/info/refs" + +func advertisedReferences(s *session, serviceName string) (ref *packp.AdvRefs, err error) { + url := fmt.Sprintf( + "%s%s?service=%s", + s.endpoint.String(), infoRefsPath, serviceName, + ) + + req, err := http.NewRequest(http.MethodGet, url, nil) + if err != nil { + return nil, err + } + + s.ApplyAuthToRequest(req) + applyHeadersToRequest(req, nil, s.endpoint.Host, serviceName) + res, err := s.client.Do(req) + if err != nil { + return nil, err + } + + s.ModifyEndpointIfRedirect(res) + defer ioutil.CheckClose(res.Body, &err) + + if err = NewErr(res); err != nil { + return nil, err + } + + ar := packp.NewAdvRefs() + if err = ar.Decode(res.Body); err != nil { + if err == packp.ErrEmptyAdvRefs { + err = transport.ErrEmptyRemoteRepository + } + + return nil, err + } + + transport.FilterUnsupportedCapabilities(ar.Capabilities) + s.advRefs = ar + + return ar, nil +} + +type client struct { + c *http.Client +} + +// DefaultClient is the default HTTP client, which uses `http.DefaultClient`. +var DefaultClient = NewClient(nil) + +// NewClient creates a new client with a custom net/http client. +// See `InstallProtocol` to install and override default http client. +// Unless a properly initialized client is given, it will fall back into +// `http.DefaultClient`. +// +// Note that for HTTP client cannot distinguish between private repositories and +// unexistent repositories on GitHub. So it returns `ErrAuthorizationRequired` +// for both. +func NewClient(c *http.Client) transport.Transport { + if c == nil { + return &client{http.DefaultClient} + } + + return &client{ + c: c, + } +} + +func (c *client) NewUploadPackSession(ep *transport.Endpoint, auth transport.AuthMethod) ( + transport.UploadPackSession, error) { + + return newUploadPackSession(c.c, ep, auth) +} + +func (c *client) NewReceivePackSession(ep *transport.Endpoint, auth transport.AuthMethod) ( + transport.ReceivePackSession, error) { + + return newReceivePackSession(c.c, ep, auth) +} + +type session struct { + auth AuthMethod + client *http.Client + endpoint *transport.Endpoint + advRefs *packp.AdvRefs +} + +func newSession(c *http.Client, ep *transport.Endpoint, auth transport.AuthMethod) (*session, error) { + s := &session{ + auth: basicAuthFromEndpoint(ep), + client: c, + endpoint: ep, + } + if auth != nil { + a, ok := auth.(AuthMethod) + if !ok { + return nil, transport.ErrInvalidAuthMethod + } + + s.auth = a + } + + return s, nil +} + +func (s *session) ApplyAuthToRequest(req *http.Request) { + if s.auth == nil { + return + } + + s.auth.SetAuth(req) +} + +func (s *session) ModifyEndpointIfRedirect(res *http.Response) { + if res.Request == nil { + return + } + + r := res.Request + if !strings.HasSuffix(r.URL.Path, infoRefsPath) { + return + } + + h, p, err := net.SplitHostPort(r.URL.Host) + if err != nil { + h = r.URL.Host + } + if p != "" { + port, err := strconv.Atoi(p) + if err == nil { + s.endpoint.Port = port + } + } + s.endpoint.Host = h + + s.endpoint.Protocol = r.URL.Scheme + s.endpoint.Path = r.URL.Path[:len(r.URL.Path)-len(infoRefsPath)] +} + +func (*session) Close() error { + return nil +} + +// AuthMethod is concrete implementation of common.AuthMethod for HTTP services +type AuthMethod interface { + transport.AuthMethod + SetAuth(r *http.Request) +} + +func basicAuthFromEndpoint(ep *transport.Endpoint) *BasicAuth { + u := ep.User + if u == "" { + return nil + } + + return &BasicAuth{u, ep.Password} +} + +// BasicAuth represent a HTTP basic auth +type BasicAuth struct { + Username, Password string +} + +func (a *BasicAuth) SetAuth(r *http.Request) { + if a == nil { + return + } + + r.SetBasicAuth(a.Username, a.Password) +} + +// Name is name of the auth +func (a *BasicAuth) Name() string { + return "http-basic-auth" +} + +func (a *BasicAuth) String() string { + masked := "*******" + if a.Password == "" { + masked = "" + } + + return fmt.Sprintf("%s - %s:%s", a.Name(), a.Username, masked) +} + +// TokenAuth implements an http.AuthMethod that can be used with http transport +// to authenticate with HTTP token authentication (also known as bearer +// authentication). +// +// IMPORTANT: If you are looking to use OAuth tokens with popular servers (e.g. +// GitHub, Bitbucket, GitLab) you should use BasicAuth instead. These servers +// use basic HTTP authentication, with the OAuth token as user or password. +// Check the documentation of your git server for details. +type TokenAuth struct { + Token string +} + +func (a *TokenAuth) SetAuth(r *http.Request) { + if a == nil { + return + } + r.Header.Add("Authorization", fmt.Sprintf("Bearer %s", a.Token)) +} + +// Name is name of the auth +func (a *TokenAuth) Name() string { + return "http-token-auth" +} + +func (a *TokenAuth) String() string { + masked := "*******" + if a.Token == "" { + masked = "" + } + return fmt.Sprintf("%s - %s", a.Name(), masked) +} + +// Err is a dedicated error to return errors based on status code +type Err struct { + Response *http.Response +} + +// NewErr returns a new Err based on a http response +func NewErr(r *http.Response) error { + if r.StatusCode >= http.StatusOK && r.StatusCode < http.StatusMultipleChoices { + return nil + } + + switch r.StatusCode { + case http.StatusUnauthorized: + return transport.ErrAuthenticationRequired + case http.StatusForbidden: + return transport.ErrAuthorizationFailed + case http.StatusNotFound: + return transport.ErrRepositoryNotFound + } + + return plumbing.NewUnexpectedError(&Err{r}) +} + +// StatusCode returns the status code of the response +func (e *Err) StatusCode() int { + return e.Response.StatusCode +} + +func (e *Err) Error() string { + return fmt.Sprintf("unexpected requesting %q status code: %d", + e.Response.Request.URL, e.Response.StatusCode, + ) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/receive_pack.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/receive_pack.go new file mode 100644 index 000000000..433dfcfda --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/receive_pack.go @@ -0,0 +1,106 @@ +package http + +import ( + "bytes" + "context" + "fmt" + "io" + "net/http" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/protocol/packp" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/capability" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband" + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +type rpSession struct { + *session +} + +func newReceivePackSession(c *http.Client, ep *transport.Endpoint, auth transport.AuthMethod) (transport.ReceivePackSession, error) { + s, err := newSession(c, ep, auth) + return &rpSession{s}, err +} + +func (s *rpSession) AdvertisedReferences() (*packp.AdvRefs, error) { + return advertisedReferences(s.session, transport.ReceivePackServiceName) +} + +func (s *rpSession) ReceivePack(ctx context.Context, req *packp.ReferenceUpdateRequest) ( + *packp.ReportStatus, error) { + url := fmt.Sprintf( + "%s/%s", + s.endpoint.String(), transport.ReceivePackServiceName, + ) + + buf := bytes.NewBuffer(nil) + if err := req.Encode(buf); err != nil { + return nil, err + } + + res, err := s.doRequest(ctx, http.MethodPost, url, buf) + if err != nil { + return nil, err + } + + r, err := ioutil.NonEmptyReader(res.Body) + if err == ioutil.ErrEmptyReader { + return nil, nil + } + + if err != nil { + return nil, err + } + + var d *sideband.Demuxer + if req.Capabilities.Supports(capability.Sideband64k) { + d = sideband.NewDemuxer(sideband.Sideband64k, r) + } else if req.Capabilities.Supports(capability.Sideband) { + d = sideband.NewDemuxer(sideband.Sideband, r) + } + if d != nil { + d.Progress = req.Progress + r = d + } + + rc := ioutil.NewReadCloser(r, res.Body) + + report := packp.NewReportStatus() + if err := report.Decode(rc); err != nil { + return nil, err + } + + return report, report.Error() +} + +func (s *rpSession) doRequest( + ctx context.Context, method, url string, content *bytes.Buffer, +) (*http.Response, error) { + + var body io.Reader + if content != nil { + body = content + } + + req, err := http.NewRequest(method, url, body) + if err != nil { + return nil, plumbing.NewPermanentError(err) + } + + applyHeadersToRequest(req, content, s.endpoint.Host, transport.ReceivePackServiceName) + s.ApplyAuthToRequest(req) + + res, err := s.client.Do(req.WithContext(ctx)) + if err != nil { + return nil, plumbing.NewUnexpectedError(err) + } + + if err := NewErr(res); err != nil { + _ = res.Body.Close() + return nil, err + } + + return res, nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/upload_pack.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/upload_pack.go new file mode 100644 index 000000000..db3708940 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/upload_pack.go @@ -0,0 +1,123 @@ +package http + +import ( + "bytes" + "context" + "fmt" + "io" + "net/http" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/pktline" + "github.com/go-git/go-git/v5/plumbing/protocol/packp" + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/plumbing/transport/internal/common" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +type upSession struct { + *session +} + +func newUploadPackSession(c *http.Client, ep *transport.Endpoint, auth transport.AuthMethod) (transport.UploadPackSession, error) { + s, err := newSession(c, ep, auth) + return &upSession{s}, err +} + +func (s *upSession) AdvertisedReferences() (*packp.AdvRefs, error) { + return advertisedReferences(s.session, transport.UploadPackServiceName) +} + +func (s *upSession) UploadPack( + ctx context.Context, req *packp.UploadPackRequest, +) (*packp.UploadPackResponse, error) { + + if req.IsEmpty() { + return nil, transport.ErrEmptyUploadPackRequest + } + + if err := req.Validate(); err != nil { + return nil, err + } + + url := fmt.Sprintf( + "%s/%s", + s.endpoint.String(), transport.UploadPackServiceName, + ) + + content, err := uploadPackRequestToReader(req) + if err != nil { + return nil, err + } + + res, err := s.doRequest(ctx, http.MethodPost, url, content) + if err != nil { + return nil, err + } + + r, err := ioutil.NonEmptyReader(res.Body) + if err != nil { + if err == ioutil.ErrEmptyReader || err == io.ErrUnexpectedEOF { + return nil, transport.ErrEmptyUploadPackRequest + } + + return nil, err + } + + rc := ioutil.NewReadCloser(r, res.Body) + return common.DecodeUploadPackResponse(rc, req) +} + +// Close does nothing. +func (s *upSession) Close() error { + return nil +} + +func (s *upSession) doRequest( + ctx context.Context, method, url string, content *bytes.Buffer, +) (*http.Response, error) { + + var body io.Reader + if content != nil { + body = content + } + + req, err := http.NewRequest(method, url, body) + if err != nil { + return nil, plumbing.NewPermanentError(err) + } + + applyHeadersToRequest(req, content, s.endpoint.Host, transport.UploadPackServiceName) + s.ApplyAuthToRequest(req) + + res, err := s.client.Do(req.WithContext(ctx)) + if err != nil { + return nil, plumbing.NewUnexpectedError(err) + } + + if err := NewErr(res); err != nil { + _ = res.Body.Close() + return nil, err + } + + return res, nil +} + +func uploadPackRequestToReader(req *packp.UploadPackRequest) (*bytes.Buffer, error) { + buf := bytes.NewBuffer(nil) + e := pktline.NewEncoder(buf) + + if err := req.UploadRequest.Encode(buf); err != nil { + return nil, fmt.Errorf("sending upload-req message: %s", err) + } + + if err := req.UploadHaves.Encode(buf, false); err != nil { + return nil, fmt.Errorf("sending haves message: %s", err) + } + + if err := e.EncodeString("done\n"); err != nil { + return nil, err + } + + return buf, nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/internal/common/common.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/internal/common/common.go new file mode 100644 index 000000000..89432e34c --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/internal/common/common.go @@ -0,0 +1,474 @@ +// Package common implements the git pack protocol with a pluggable transport. +// This is a low-level package to implement new transports. Use a concrete +// implementation instead (e.g. http, file, ssh). +// +// A simple example of usage can be found in the file package. +package common + +import ( + "bufio" + "context" + "errors" + "fmt" + "io" + stdioutil "io/ioutil" + "strings" + "time" + + "github.com/go-git/go-git/v5/plumbing/format/pktline" + "github.com/go-git/go-git/v5/plumbing/protocol/packp" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/capability" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband" + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +const ( + readErrorSecondsTimeout = 10 +) + +var ( + ErrTimeoutExceeded = errors.New("timeout exceeded") +) + +// Commander creates Command instances. This is the main entry point for +// transport implementations. +type Commander interface { + // Command creates a new Command for the given git command and + // endpoint. cmd can be git-upload-pack or git-receive-pack. An + // error should be returned if the endpoint is not supported or the + // command cannot be created (e.g. binary does not exist, connection + // cannot be established). + Command(cmd string, ep *transport.Endpoint, auth transport.AuthMethod) (Command, error) +} + +// Command is used for a single command execution. +// This interface is modeled after exec.Cmd and ssh.Session in the standard +// library. +type Command interface { + // StderrPipe returns a pipe that will be connected to the command's + // standard error when the command starts. It should not be called after + // Start. + StderrPipe() (io.Reader, error) + // StdinPipe returns a pipe that will be connected to the command's + // standard input when the command starts. It should not be called after + // Start. The pipe should be closed when no more input is expected. + StdinPipe() (io.WriteCloser, error) + // StdoutPipe returns a pipe that will be connected to the command's + // standard output when the command starts. It should not be called after + // Start. + StdoutPipe() (io.Reader, error) + // Start starts the specified command. It does not wait for it to + // complete. + Start() error + // Close closes the command and releases any resources used by it. It + // will block until the command exits. + Close() error +} + +// CommandKiller expands the Command interface, enabling it for being killed. +type CommandKiller interface { + // Kill and close the session whatever the state it is. It will block until + // the command is terminated. + Kill() error +} + +type client struct { + cmdr Commander +} + +// NewClient creates a new client using the given Commander. +func NewClient(runner Commander) transport.Transport { + return &client{runner} +} + +// NewUploadPackSession creates a new UploadPackSession. +func (c *client) NewUploadPackSession(ep *transport.Endpoint, auth transport.AuthMethod) ( + transport.UploadPackSession, error) { + + return c.newSession(transport.UploadPackServiceName, ep, auth) +} + +// NewReceivePackSession creates a new ReceivePackSession. +func (c *client) NewReceivePackSession(ep *transport.Endpoint, auth transport.AuthMethod) ( + transport.ReceivePackSession, error) { + + return c.newSession(transport.ReceivePackServiceName, ep, auth) +} + +type session struct { + Stdin io.WriteCloser + Stdout io.Reader + Command Command + + isReceivePack bool + advRefs *packp.AdvRefs + packRun bool + finished bool + firstErrLine chan string +} + +func (c *client) newSession(s string, ep *transport.Endpoint, auth transport.AuthMethod) (*session, error) { + cmd, err := c.cmdr.Command(s, ep, auth) + if err != nil { + return nil, err + } + + stdin, err := cmd.StdinPipe() + if err != nil { + return nil, err + } + + stdout, err := cmd.StdoutPipe() + if err != nil { + return nil, err + } + + stderr, err := cmd.StderrPipe() + if err != nil { + return nil, err + } + + if err := cmd.Start(); err != nil { + return nil, err + } + + return &session{ + Stdin: stdin, + Stdout: stdout, + Command: cmd, + firstErrLine: c.listenFirstError(stderr), + isReceivePack: s == transport.ReceivePackServiceName, + }, nil +} + +func (c *client) listenFirstError(r io.Reader) chan string { + if r == nil { + return nil + } + + errLine := make(chan string, 1) + go func() { + s := bufio.NewScanner(r) + if s.Scan() { + errLine <- s.Text() + } else { + close(errLine) + } + + _, _ = io.Copy(stdioutil.Discard, r) + }() + + return errLine +} + +// AdvertisedReferences retrieves the advertised references from the server. +func (s *session) AdvertisedReferences() (*packp.AdvRefs, error) { + if s.advRefs != nil { + return s.advRefs, nil + } + + ar := packp.NewAdvRefs() + if err := ar.Decode(s.Stdout); err != nil { + if err := s.handleAdvRefDecodeError(err); err != nil { + return nil, err + } + } + + // Some servers like jGit, announce capabilities instead of returning an + // packp message with a flush. This verifies that we received a empty + // adv-refs, even it contains capabilities. + if !s.isReceivePack && ar.IsEmpty() { + return nil, transport.ErrEmptyRemoteRepository + } + + transport.FilterUnsupportedCapabilities(ar.Capabilities) + s.advRefs = ar + return ar, nil +} + +func (s *session) handleAdvRefDecodeError(err error) error { + // If repository is not found, we get empty stdout and server writes an + // error to stderr. + if err == packp.ErrEmptyInput { + s.finished = true + if err := s.checkNotFoundError(); err != nil { + return err + } + + return io.ErrUnexpectedEOF + } + + // For empty (but existing) repositories, we get empty advertised-references + // message. But valid. That is, it includes at least a flush. + if err == packp.ErrEmptyAdvRefs { + // Empty repositories are valid for git-receive-pack. + if s.isReceivePack { + return nil + } + + if err := s.finish(); err != nil { + return err + } + + return transport.ErrEmptyRemoteRepository + } + + // Some server sends the errors as normal content (git protocol), so when + // we try to decode it fails, we need to check the content of it, to detect + // not found errors + if uerr, ok := err.(*packp.ErrUnexpectedData); ok { + if isRepoNotFoundError(string(uerr.Data)) { + return transport.ErrRepositoryNotFound + } + } + + return err +} + +// UploadPack performs a request to the server to fetch a packfile. A reader is +// returned with the packfile content. The reader must be closed after reading. +func (s *session) UploadPack(ctx context.Context, req *packp.UploadPackRequest) (*packp.UploadPackResponse, error) { + if req.IsEmpty() { + return nil, transport.ErrEmptyUploadPackRequest + } + + if err := req.Validate(); err != nil { + return nil, err + } + + if _, err := s.AdvertisedReferences(); err != nil { + return nil, err + } + + s.packRun = true + + in := s.StdinContext(ctx) + out := s.StdoutContext(ctx) + + if err := uploadPack(in, out, req); err != nil { + return nil, err + } + + r, err := ioutil.NonEmptyReader(out) + if err == ioutil.ErrEmptyReader { + if c, ok := s.Stdout.(io.Closer); ok { + _ = c.Close() + } + + return nil, transport.ErrEmptyUploadPackRequest + } + + if err != nil { + return nil, err + } + + rc := ioutil.NewReadCloser(r, s) + return DecodeUploadPackResponse(rc, req) +} + +func (s *session) StdinContext(ctx context.Context) io.WriteCloser { + return ioutil.NewWriteCloserOnError( + ioutil.NewContextWriteCloser(ctx, s.Stdin), + s.onError, + ) +} + +func (s *session) StdoutContext(ctx context.Context) io.Reader { + return ioutil.NewReaderOnError( + ioutil.NewContextReader(ctx, s.Stdout), + s.onError, + ) +} + +func (s *session) onError(err error) { + if k, ok := s.Command.(CommandKiller); ok { + _ = k.Kill() + } + + _ = s.Close() +} + +func (s *session) ReceivePack(ctx context.Context, req *packp.ReferenceUpdateRequest) (*packp.ReportStatus, error) { + if _, err := s.AdvertisedReferences(); err != nil { + return nil, err + } + + s.packRun = true + + w := s.StdinContext(ctx) + if err := req.Encode(w); err != nil { + return nil, err + } + + if err := w.Close(); err != nil { + return nil, err + } + + if !req.Capabilities.Supports(capability.ReportStatus) { + // If we don't have report-status, we can only + // check return value error. + return nil, s.Command.Close() + } + + r := s.StdoutContext(ctx) + + var d *sideband.Demuxer + if req.Capabilities.Supports(capability.Sideband64k) { + d = sideband.NewDemuxer(sideband.Sideband64k, r) + } else if req.Capabilities.Supports(capability.Sideband) { + d = sideband.NewDemuxer(sideband.Sideband, r) + } + if d != nil { + d.Progress = req.Progress + r = d + } + + report := packp.NewReportStatus() + if err := report.Decode(r); err != nil { + return nil, err + } + + if err := report.Error(); err != nil { + defer s.Close() + return report, err + } + + return report, s.Command.Close() +} + +func (s *session) finish() error { + if s.finished { + return nil + } + + s.finished = true + + // If we did not run a upload/receive-pack, we close the connection + // gracefully by sending a flush packet to the server. If the server + // operates correctly, it will exit with status 0. + if !s.packRun { + _, err := s.Stdin.Write(pktline.FlushPkt) + return err + } + + return nil +} + +func (s *session) Close() (err error) { + err = s.finish() + + defer ioutil.CheckClose(s.Command, &err) + return +} + +func (s *session) checkNotFoundError() error { + t := time.NewTicker(time.Second * readErrorSecondsTimeout) + defer t.Stop() + + select { + case <-t.C: + return ErrTimeoutExceeded + case line, ok := <-s.firstErrLine: + if !ok { + return nil + } + + if isRepoNotFoundError(line) { + return transport.ErrRepositoryNotFound + } + + return fmt.Errorf("unknown error: %s", line) + } +} + +var ( + githubRepoNotFoundErr = "ERROR: Repository not found." + bitbucketRepoNotFoundErr = "conq: repository does not exist." + localRepoNotFoundErr = "does not appear to be a git repository" + gitProtocolNotFoundErr = "ERR \n Repository not found." + gitProtocolNoSuchErr = "ERR no such repository" + gitProtocolAccessDeniedErr = "ERR access denied" + gogsAccessDeniedErr = "Gogs: Repository does not exist or you do not have access" +) + +func isRepoNotFoundError(s string) bool { + if strings.HasPrefix(s, githubRepoNotFoundErr) { + return true + } + + if strings.HasPrefix(s, bitbucketRepoNotFoundErr) { + return true + } + + if strings.HasSuffix(s, localRepoNotFoundErr) { + return true + } + + if strings.HasPrefix(s, gitProtocolNotFoundErr) { + return true + } + + if strings.HasPrefix(s, gitProtocolNoSuchErr) { + return true + } + + if strings.HasPrefix(s, gitProtocolAccessDeniedErr) { + return true + } + + if strings.HasPrefix(s, gogsAccessDeniedErr) { + return true + } + + return false +} + +var ( + nak = []byte("NAK") + eol = []byte("\n") +) + +// uploadPack implements the git-upload-pack protocol. +func uploadPack(w io.WriteCloser, r io.Reader, req *packp.UploadPackRequest) error { + // TODO support multi_ack mode + // TODO support multi_ack_detailed mode + // TODO support acks for common objects + // TODO build a proper state machine for all these processing options + + if err := req.UploadRequest.Encode(w); err != nil { + return fmt.Errorf("sending upload-req message: %s", err) + } + + if err := req.UploadHaves.Encode(w, true); err != nil { + return fmt.Errorf("sending haves message: %s", err) + } + + if err := sendDone(w); err != nil { + return fmt.Errorf("sending done message: %s", err) + } + + if err := w.Close(); err != nil { + return fmt.Errorf("closing input: %s", err) + } + + return nil +} + +func sendDone(w io.Writer) error { + e := pktline.NewEncoder(w) + + return e.Encodef("done\n") +} + +// DecodeUploadPackResponse decodes r into a new packp.UploadPackResponse +func DecodeUploadPackResponse(r io.ReadCloser, req *packp.UploadPackRequest) ( + *packp.UploadPackResponse, error, +) { + res := packp.NewUploadPackResponse(req) + if err := res.Decode(r); err != nil { + return nil, fmt.Errorf("error decoding upload-pack response: %s", err) + } + + return res, nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/internal/common/server.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/internal/common/server.go new file mode 100644 index 000000000..e2480848a --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/internal/common/server.go @@ -0,0 +1,73 @@ +package common + +import ( + "context" + "fmt" + "io" + + "github.com/go-git/go-git/v5/plumbing/protocol/packp" + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +// ServerCommand is used for a single server command execution. +type ServerCommand struct { + Stderr io.Writer + Stdout io.WriteCloser + Stdin io.Reader +} + +func ServeUploadPack(cmd ServerCommand, s transport.UploadPackSession) (err error) { + ioutil.CheckClose(cmd.Stdout, &err) + + ar, err := s.AdvertisedReferences() + if err != nil { + return err + } + + if err := ar.Encode(cmd.Stdout); err != nil { + return err + } + + req := packp.NewUploadPackRequest() + if err := req.Decode(cmd.Stdin); err != nil { + return err + } + + var resp *packp.UploadPackResponse + resp, err = s.UploadPack(context.TODO(), req) + if err != nil { + return err + } + + return resp.Encode(cmd.Stdout) +} + +func ServeReceivePack(cmd ServerCommand, s transport.ReceivePackSession) error { + ar, err := s.AdvertisedReferences() + if err != nil { + return fmt.Errorf("internal error in advertised references: %s", err) + } + + if err := ar.Encode(cmd.Stdout); err != nil { + return fmt.Errorf("error in advertised references encoding: %s", err) + } + + req := packp.NewReferenceUpdateRequest() + if err := req.Decode(cmd.Stdin); err != nil { + return fmt.Errorf("error decoding: %s", err) + } + + rs, err := s.ReceivePack(context.TODO(), req) + if rs != nil { + if err := rs.Encode(cmd.Stdout); err != nil { + return fmt.Errorf("error in encoding report status %s", err) + } + } + + if err != nil { + return fmt.Errorf("error in receive pack: %s", err) + } + + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/server/loader.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/server/loader.go new file mode 100644 index 000000000..e7e2b075e --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/server/loader.go @@ -0,0 +1,64 @@ +package server + +import ( + "github.com/go-git/go-git/v5/plumbing/cache" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/storage/filesystem" + + "github.com/go-git/go-billy/v5" + "github.com/go-git/go-billy/v5/osfs" +) + +// DefaultLoader is a filesystem loader ignoring host and resolving paths to /. +var DefaultLoader = NewFilesystemLoader(osfs.New("")) + +// Loader loads repository's storer.Storer based on an optional host and a path. +type Loader interface { + // Load loads a storer.Storer given a transport.Endpoint. + // Returns transport.ErrRepositoryNotFound if the repository does not + // exist. + Load(ep *transport.Endpoint) (storer.Storer, error) +} + +type fsLoader struct { + base billy.Filesystem +} + +// NewFilesystemLoader creates a Loader that ignores host and resolves paths +// with a given base filesystem. +func NewFilesystemLoader(base billy.Filesystem) Loader { + return &fsLoader{base} +} + +// Load looks up the endpoint's path in the base file system and returns a +// storer for it. Returns transport.ErrRepositoryNotFound if a repository does +// not exist in the given path. +func (l *fsLoader) Load(ep *transport.Endpoint) (storer.Storer, error) { + fs, err := l.base.Chroot(ep.Path) + if err != nil { + return nil, err + } + + if _, err := fs.Stat("config"); err != nil { + return nil, transport.ErrRepositoryNotFound + } + + return filesystem.NewStorage(fs, cache.NewObjectLRUDefault()), nil +} + +// MapLoader is a Loader that uses a lookup map of storer.Storer by +// transport.Endpoint. +type MapLoader map[string]storer.Storer + +// Load returns a storer.Storer for given a transport.Endpoint by looking it up +// in the map. Returns transport.ErrRepositoryNotFound if the endpoint does not +// exist. +func (l MapLoader) Load(ep *transport.Endpoint) (storer.Storer, error) { + s, ok := l[ep.String()] + if !ok { + return nil, transport.ErrRepositoryNotFound + } + + return s, nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/server/server.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/server/server.go new file mode 100644 index 000000000..727f90215 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/server/server.go @@ -0,0 +1,424 @@ +// Package server implements the git server protocol. For most use cases, the +// transport-specific implementations should be used. +package server + +import ( + "context" + "errors" + "fmt" + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/packfile" + "github.com/go-git/go-git/v5/plumbing/protocol/packp" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/capability" + "github.com/go-git/go-git/v5/plumbing/revlist" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +var DefaultServer = NewServer(DefaultLoader) + +type server struct { + loader Loader + handler *handler +} + +// NewServer returns a transport.Transport implementing a git server, +// independent of transport. Each transport must wrap this. +func NewServer(loader Loader) transport.Transport { + return &server{ + loader, + &handler{asClient: false}, + } +} + +// NewClient returns a transport.Transport implementing a client with an +// embedded server. +func NewClient(loader Loader) transport.Transport { + return &server{ + loader, + &handler{asClient: true}, + } +} + +func (s *server) NewUploadPackSession(ep *transport.Endpoint, auth transport.AuthMethod) (transport.UploadPackSession, error) { + sto, err := s.loader.Load(ep) + if err != nil { + return nil, err + } + + return s.handler.NewUploadPackSession(sto) +} + +func (s *server) NewReceivePackSession(ep *transport.Endpoint, auth transport.AuthMethod) (transport.ReceivePackSession, error) { + sto, err := s.loader.Load(ep) + if err != nil { + return nil, err + } + + return s.handler.NewReceivePackSession(sto) +} + +type handler struct { + asClient bool +} + +func (h *handler) NewUploadPackSession(s storer.Storer) (transport.UploadPackSession, error) { + return &upSession{ + session: session{storer: s, asClient: h.asClient}, + }, nil +} + +func (h *handler) NewReceivePackSession(s storer.Storer) (transport.ReceivePackSession, error) { + return &rpSession{ + session: session{storer: s, asClient: h.asClient}, + cmdStatus: map[plumbing.ReferenceName]error{}, + }, nil +} + +type session struct { + storer storer.Storer + caps *capability.List + asClient bool +} + +func (s *session) Close() error { + return nil +} + +func (s *session) SetAuth(transport.AuthMethod) error { + //TODO: deprecate + return nil +} + +func (s *session) checkSupportedCapabilities(cl *capability.List) error { + for _, c := range cl.All() { + if !s.caps.Supports(c) { + return fmt.Errorf("unsupported capability: %s", c) + } + } + + return nil +} + +type upSession struct { + session +} + +func (s *upSession) AdvertisedReferences() (*packp.AdvRefs, error) { + ar := packp.NewAdvRefs() + + if err := s.setSupportedCapabilities(ar.Capabilities); err != nil { + return nil, err + } + + s.caps = ar.Capabilities + + if err := setReferences(s.storer, ar); err != nil { + return nil, err + } + + if err := setHEAD(s.storer, ar); err != nil { + return nil, err + } + + if s.asClient && len(ar.References) == 0 { + return nil, transport.ErrEmptyRemoteRepository + } + + return ar, nil +} + +func (s *upSession) UploadPack(ctx context.Context, req *packp.UploadPackRequest) (*packp.UploadPackResponse, error) { + if req.IsEmpty() { + return nil, transport.ErrEmptyUploadPackRequest + } + + if err := req.Validate(); err != nil { + return nil, err + } + + if s.caps == nil { + s.caps = capability.NewList() + if err := s.setSupportedCapabilities(s.caps); err != nil { + return nil, err + } + } + + if err := s.checkSupportedCapabilities(req.Capabilities); err != nil { + return nil, err + } + + s.caps = req.Capabilities + + if len(req.Shallows) > 0 { + return nil, fmt.Errorf("shallow not supported") + } + + objs, err := s.objectsToUpload(req) + if err != nil { + return nil, err + } + + pr, pw := io.Pipe() + e := packfile.NewEncoder(pw, s.storer, false) + go func() { + // TODO: plumb through a pack window. + _, err := e.Encode(objs, 10) + pw.CloseWithError(err) + }() + + return packp.NewUploadPackResponseWithPackfile(req, + ioutil.NewContextReadCloser(ctx, pr), + ), nil +} + +func (s *upSession) objectsToUpload(req *packp.UploadPackRequest) ([]plumbing.Hash, error) { + haves, err := revlist.Objects(s.storer, req.Haves, nil) + if err != nil { + return nil, err + } + + return revlist.Objects(s.storer, req.Wants, haves) +} + +func (*upSession) setSupportedCapabilities(c *capability.List) error { + if err := c.Set(capability.Agent, capability.DefaultAgent); err != nil { + return err + } + + if err := c.Set(capability.OFSDelta); err != nil { + return err + } + + return nil +} + +type rpSession struct { + session + cmdStatus map[plumbing.ReferenceName]error + firstErr error + unpackErr error +} + +func (s *rpSession) AdvertisedReferences() (*packp.AdvRefs, error) { + ar := packp.NewAdvRefs() + + if err := s.setSupportedCapabilities(ar.Capabilities); err != nil { + return nil, err + } + + s.caps = ar.Capabilities + + if err := setReferences(s.storer, ar); err != nil { + return nil, err + } + + if err := setHEAD(s.storer, ar); err != nil { + return nil, err + } + + return ar, nil +} + +var ( + ErrUpdateReference = errors.New("failed to update ref") +) + +func (s *rpSession) ReceivePack(ctx context.Context, req *packp.ReferenceUpdateRequest) (*packp.ReportStatus, error) { + if s.caps == nil { + s.caps = capability.NewList() + if err := s.setSupportedCapabilities(s.caps); err != nil { + return nil, err + } + } + + if err := s.checkSupportedCapabilities(req.Capabilities); err != nil { + return nil, err + } + + s.caps = req.Capabilities + + //TODO: Implement 'atomic' update of references. + + if req.Packfile != nil { + r := ioutil.NewContextReadCloser(ctx, req.Packfile) + if err := s.writePackfile(r); err != nil { + s.unpackErr = err + s.firstErr = err + return s.reportStatus(), err + } + } + + s.updateReferences(req) + return s.reportStatus(), s.firstErr +} + +func (s *rpSession) updateReferences(req *packp.ReferenceUpdateRequest) { + for _, cmd := range req.Commands { + exists, err := referenceExists(s.storer, cmd.Name) + if err != nil { + s.setStatus(cmd.Name, err) + continue + } + + switch cmd.Action() { + case packp.Create: + if exists { + s.setStatus(cmd.Name, ErrUpdateReference) + continue + } + + ref := plumbing.NewHashReference(cmd.Name, cmd.New) + err := s.storer.SetReference(ref) + s.setStatus(cmd.Name, err) + case packp.Delete: + if !exists { + s.setStatus(cmd.Name, ErrUpdateReference) + continue + } + + err := s.storer.RemoveReference(cmd.Name) + s.setStatus(cmd.Name, err) + case packp.Update: + if !exists { + s.setStatus(cmd.Name, ErrUpdateReference) + continue + } + + ref := plumbing.NewHashReference(cmd.Name, cmd.New) + err := s.storer.SetReference(ref) + s.setStatus(cmd.Name, err) + } + } +} + +func (s *rpSession) writePackfile(r io.ReadCloser) error { + if r == nil { + return nil + } + + if err := packfile.UpdateObjectStorage(s.storer, r); err != nil { + _ = r.Close() + return err + } + + return r.Close() +} + +func (s *rpSession) setStatus(ref plumbing.ReferenceName, err error) { + s.cmdStatus[ref] = err + if s.firstErr == nil && err != nil { + s.firstErr = err + } +} + +func (s *rpSession) reportStatus() *packp.ReportStatus { + if !s.caps.Supports(capability.ReportStatus) { + return nil + } + + rs := packp.NewReportStatus() + rs.UnpackStatus = "ok" + + if s.unpackErr != nil { + rs.UnpackStatus = s.unpackErr.Error() + } + + if s.cmdStatus == nil { + return rs + } + + for ref, err := range s.cmdStatus { + msg := "ok" + if err != nil { + msg = err.Error() + } + status := &packp.CommandStatus{ + ReferenceName: ref, + Status: msg, + } + rs.CommandStatuses = append(rs.CommandStatuses, status) + } + + return rs +} + +func (*rpSession) setSupportedCapabilities(c *capability.List) error { + if err := c.Set(capability.Agent, capability.DefaultAgent); err != nil { + return err + } + + if err := c.Set(capability.OFSDelta); err != nil { + return err + } + + if err := c.Set(capability.DeleteRefs); err != nil { + return err + } + + return c.Set(capability.ReportStatus) +} + +func setHEAD(s storer.Storer, ar *packp.AdvRefs) error { + ref, err := s.Reference(plumbing.HEAD) + if err == plumbing.ErrReferenceNotFound { + return nil + } + + if err != nil { + return err + } + + if ref.Type() == plumbing.SymbolicReference { + if err := ar.AddReference(ref); err != nil { + return nil + } + + ref, err = storer.ResolveReference(s, ref.Target()) + if err == plumbing.ErrReferenceNotFound { + return nil + } + + if err != nil { + return err + } + } + + if ref.Type() != plumbing.HashReference { + return plumbing.ErrInvalidType + } + + h := ref.Hash() + ar.Head = &h + + return nil +} + +func setReferences(s storer.Storer, ar *packp.AdvRefs) error { + //TODO: add peeled references. + iter, err := s.IterReferences() + if err != nil { + return err + } + + return iter.ForEach(func(ref *plumbing.Reference) error { + if ref.Type() != plumbing.HashReference { + return nil + } + + ar.References[ref.Name().String()] = ref.Hash() + return nil + }) +} + +func referenceExists(s storer.ReferenceStorer, n plumbing.ReferenceName) (bool, error) { + _, err := s.Reference(n) + if err == plumbing.ErrReferenceNotFound { + return false, nil + } + + return err == nil, err +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/ssh/auth_method.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/ssh/auth_method.go new file mode 100644 index 000000000..b79a74e41 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/ssh/auth_method.go @@ -0,0 +1,322 @@ +package ssh + +import ( + "crypto/x509" + "encoding/pem" + "errors" + "fmt" + "io/ioutil" + "os" + "os/user" + "path/filepath" + + "github.com/go-git/go-git/v5/plumbing/transport" + + "github.com/mitchellh/go-homedir" + "github.com/xanzy/ssh-agent" + "golang.org/x/crypto/ssh" + "golang.org/x/crypto/ssh/knownhosts" +) + +const DefaultUsername = "git" + +// AuthMethod is the interface all auth methods for the ssh client +// must implement. The clientConfig method returns the ssh client +// configuration needed to establish an ssh connection. +type AuthMethod interface { + transport.AuthMethod + // ClientConfig should return a valid ssh.ClientConfig to be used to create + // a connection to the SSH server. + ClientConfig() (*ssh.ClientConfig, error) +} + +// The names of the AuthMethod implementations. To be returned by the +// Name() method. Most git servers only allow PublicKeysName and +// PublicKeysCallbackName. +const ( + KeyboardInteractiveName = "ssh-keyboard-interactive" + PasswordName = "ssh-password" + PasswordCallbackName = "ssh-password-callback" + PublicKeysName = "ssh-public-keys" + PublicKeysCallbackName = "ssh-public-key-callback" +) + +// KeyboardInteractive implements AuthMethod by using a +// prompt/response sequence controlled by the server. +type KeyboardInteractive struct { + User string + Challenge ssh.KeyboardInteractiveChallenge + HostKeyCallbackHelper +} + +func (a *KeyboardInteractive) Name() string { + return KeyboardInteractiveName +} + +func (a *KeyboardInteractive) String() string { + return fmt.Sprintf("user: %s, name: %s", a.User, a.Name()) +} + +func (a *KeyboardInteractive) ClientConfig() (*ssh.ClientConfig, error) { + return a.SetHostKeyCallback(&ssh.ClientConfig{ + User: a.User, + Auth: []ssh.AuthMethod{ + a.Challenge, + }, + }) +} + +// Password implements AuthMethod by using the given password. +type Password struct { + User string + Password string + HostKeyCallbackHelper +} + +func (a *Password) Name() string { + return PasswordName +} + +func (a *Password) String() string { + return fmt.Sprintf("user: %s, name: %s", a.User, a.Name()) +} + +func (a *Password) ClientConfig() (*ssh.ClientConfig, error) { + return a.SetHostKeyCallback(&ssh.ClientConfig{ + User: a.User, + Auth: []ssh.AuthMethod{ssh.Password(a.Password)}, + }) +} + +// PasswordCallback implements AuthMethod by using a callback +// to fetch the password. +type PasswordCallback struct { + User string + Callback func() (pass string, err error) + HostKeyCallbackHelper +} + +func (a *PasswordCallback) Name() string { + return PasswordCallbackName +} + +func (a *PasswordCallback) String() string { + return fmt.Sprintf("user: %s, name: %s", a.User, a.Name()) +} + +func (a *PasswordCallback) ClientConfig() (*ssh.ClientConfig, error) { + return a.SetHostKeyCallback(&ssh.ClientConfig{ + User: a.User, + Auth: []ssh.AuthMethod{ssh.PasswordCallback(a.Callback)}, + }) +} + +// PublicKeys implements AuthMethod by using the given key pairs. +type PublicKeys struct { + User string + Signer ssh.Signer + HostKeyCallbackHelper +} + +// NewPublicKeys returns a PublicKeys from a PEM encoded private key. An +// encryption password should be given if the pemBytes contains a password +// encrypted PEM block otherwise password should be empty. It supports RSA +// (PKCS#1), DSA (OpenSSL), and ECDSA private keys. +func NewPublicKeys(user string, pemBytes []byte, password string) (*PublicKeys, error) { + block, _ := pem.Decode(pemBytes) + if block == nil { + return nil, errors.New("invalid PEM data") + } + if x509.IsEncryptedPEMBlock(block) { + key, err := x509.DecryptPEMBlock(block, []byte(password)) + if err != nil { + return nil, err + } + + block = &pem.Block{Type: block.Type, Bytes: key} + pemBytes = pem.EncodeToMemory(block) + } + + signer, err := ssh.ParsePrivateKey(pemBytes) + if err != nil { + return nil, err + } + + return &PublicKeys{User: user, Signer: signer}, nil +} + +// NewPublicKeysFromFile returns a PublicKeys from a file containing a PEM +// encoded private key. An encryption password should be given if the pemBytes +// contains a password encrypted PEM block otherwise password should be empty. +func NewPublicKeysFromFile(user, pemFile, password string) (*PublicKeys, error) { + bytes, err := ioutil.ReadFile(pemFile) + if err != nil { + return nil, err + } + + return NewPublicKeys(user, bytes, password) +} + +func (a *PublicKeys) Name() string { + return PublicKeysName +} + +func (a *PublicKeys) String() string { + return fmt.Sprintf("user: %s, name: %s", a.User, a.Name()) +} + +func (a *PublicKeys) ClientConfig() (*ssh.ClientConfig, error) { + return a.SetHostKeyCallback(&ssh.ClientConfig{ + User: a.User, + Auth: []ssh.AuthMethod{ssh.PublicKeys(a.Signer)}, + }) +} + +func username() (string, error) { + var username string + if user, err := user.Current(); err == nil { + username = user.Username + } else { + username = os.Getenv("USER") + } + + if username == "" { + return "", errors.New("failed to get username") + } + + return username, nil +} + +// PublicKeysCallback implements AuthMethod by asking a +// ssh.agent.Agent to act as a signer. +type PublicKeysCallback struct { + User string + Callback func() (signers []ssh.Signer, err error) + HostKeyCallbackHelper +} + +// NewSSHAgentAuth returns a PublicKeysCallback based on a SSH agent, it opens +// a pipe with the SSH agent and uses the pipe as the implementer of the public +// key callback function. +func NewSSHAgentAuth(u string) (*PublicKeysCallback, error) { + var err error + if u == "" { + u, err = username() + if err != nil { + return nil, err + } + } + + a, _, err := sshagent.New() + if err != nil { + return nil, fmt.Errorf("error creating SSH agent: %q", err) + } + + return &PublicKeysCallback{ + User: u, + Callback: a.Signers, + }, nil +} + +func (a *PublicKeysCallback) Name() string { + return PublicKeysCallbackName +} + +func (a *PublicKeysCallback) String() string { + return fmt.Sprintf("user: %s, name: %s", a.User, a.Name()) +} + +func (a *PublicKeysCallback) ClientConfig() (*ssh.ClientConfig, error) { + return a.SetHostKeyCallback(&ssh.ClientConfig{ + User: a.User, + Auth: []ssh.AuthMethod{ssh.PublicKeysCallback(a.Callback)}, + }) +} + +// NewKnownHostsCallback returns ssh.HostKeyCallback based on a file based on a +// known_hosts file. http://man.openbsd.org/sshd#SSH_KNOWN_HOSTS_FILE_FORMAT +// +// If list of files is empty, then it will be read from the SSH_KNOWN_HOSTS +// environment variable, example: +// /home/foo/custom_known_hosts_file:/etc/custom_known/hosts_file +// +// If SSH_KNOWN_HOSTS is not set the following file locations will be used: +// ~/.ssh/known_hosts +// /etc/ssh/ssh_known_hosts +func NewKnownHostsCallback(files ...string) (ssh.HostKeyCallback, error) { + var err error + + if len(files) == 0 { + if files, err = getDefaultKnownHostsFiles(); err != nil { + return nil, err + } + } + + if files, err = filterKnownHostsFiles(files...); err != nil { + return nil, err + } + + return knownhosts.New(files...) +} + +func getDefaultKnownHostsFiles() ([]string, error) { + files := filepath.SplitList(os.Getenv("SSH_KNOWN_HOSTS")) + if len(files) != 0 { + return files, nil + } + + homeDirPath, err := homedir.Dir() + if err != nil { + return nil, err + } + + return []string{ + filepath.Join(homeDirPath, "/.ssh/known_hosts"), + "/etc/ssh/ssh_known_hosts", + }, nil +} + +func filterKnownHostsFiles(files ...string) ([]string, error) { + var out []string + for _, file := range files { + _, err := os.Stat(file) + if err == nil { + out = append(out, file) + continue + } + + if !os.IsNotExist(err) { + return nil, err + } + } + + if len(out) == 0 { + return nil, fmt.Errorf("unable to find any valid known_hosts file, set SSH_KNOWN_HOSTS env variable") + } + + return out, nil +} + +// HostKeyCallbackHelper is a helper that provides common functionality to +// configure HostKeyCallback into a ssh.ClientConfig. +type HostKeyCallbackHelper struct { + // HostKeyCallback is the function type used for verifying server keys. + // If nil default callback will be create using NewKnownHostsCallback + // without argument. + HostKeyCallback ssh.HostKeyCallback +} + +// SetHostKeyCallback sets the field HostKeyCallback in the given cfg. If +// HostKeyCallback is empty a default callback is created using +// NewKnownHostsCallback. +func (m *HostKeyCallbackHelper) SetHostKeyCallback(cfg *ssh.ClientConfig) (*ssh.ClientConfig, error) { + var err error + if m.HostKeyCallback == nil { + if m.HostKeyCallback, err = NewKnownHostsCallback(); err != nil { + return cfg, err + } + } + + cfg.HostKeyCallback = m.HostKeyCallback + return cfg, nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/ssh/common.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/ssh/common.go new file mode 100644 index 000000000..c05ded986 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/ssh/common.go @@ -0,0 +1,228 @@ +// Package ssh implements the SSH transport protocol. +package ssh + +import ( + "context" + "fmt" + "reflect" + "strconv" + + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/plumbing/transport/internal/common" + + "github.com/kevinburke/ssh_config" + "golang.org/x/crypto/ssh" + "golang.org/x/net/proxy" +) + +// DefaultClient is the default SSH client. +var DefaultClient = NewClient(nil) + +// DefaultSSHConfig is the reader used to access parameters stored in the +// system's ssh_config files. If nil all the ssh_config are ignored. +var DefaultSSHConfig sshConfig = ssh_config.DefaultUserSettings + +type sshConfig interface { + Get(alias, key string) string +} + +// NewClient creates a new SSH client with an optional *ssh.ClientConfig. +func NewClient(config *ssh.ClientConfig) transport.Transport { + return common.NewClient(&runner{config: config}) +} + +// DefaultAuthBuilder is the function used to create a default AuthMethod, when +// the user doesn't provide any. +var DefaultAuthBuilder = func(user string) (AuthMethod, error) { + return NewSSHAgentAuth(user) +} + +const DefaultPort = 22 + +type runner struct { + config *ssh.ClientConfig +} + +func (r *runner) Command(cmd string, ep *transport.Endpoint, auth transport.AuthMethod) (common.Command, error) { + c := &command{command: cmd, endpoint: ep, config: r.config} + if auth != nil { + c.setAuth(auth) + } + + if err := c.connect(); err != nil { + return nil, err + } + return c, nil +} + +type command struct { + *ssh.Session + connected bool + command string + endpoint *transport.Endpoint + client *ssh.Client + auth AuthMethod + config *ssh.ClientConfig +} + +func (c *command) setAuth(auth transport.AuthMethod) error { + a, ok := auth.(AuthMethod) + if !ok { + return transport.ErrInvalidAuthMethod + } + + c.auth = a + return nil +} + +func (c *command) Start() error { + return c.Session.Start(endpointToCommand(c.command, c.endpoint)) +} + +// Close closes the SSH session and connection. +func (c *command) Close() error { + if !c.connected { + return nil + } + + c.connected = false + + //XXX: If did read the full packfile, then the session might be already + // closed. + _ = c.Session.Close() + + return c.client.Close() +} + +// connect connects to the SSH server, unless a AuthMethod was set with +// SetAuth method, by default uses an auth method based on PublicKeysCallback, +// it connects to a SSH agent, using the address stored in the SSH_AUTH_SOCK +// environment var. +func (c *command) connect() error { + if c.connected { + return transport.ErrAlreadyConnected + } + + if c.auth == nil { + if err := c.setAuthFromEndpoint(); err != nil { + return err + } + } + + var err error + config, err := c.auth.ClientConfig() + if err != nil { + return err + } + + overrideConfig(c.config, config) + + c.client, err = dial("tcp", c.getHostWithPort(), config) + if err != nil { + return err + } + + c.Session, err = c.client.NewSession() + if err != nil { + _ = c.client.Close() + return err + } + + c.connected = true + return nil +} + +func dial(network, addr string, config *ssh.ClientConfig) (*ssh.Client, error) { + var ( + ctx = context.Background() + cancel context.CancelFunc + ) + if config.Timeout > 0 { + ctx, cancel = context.WithTimeout(ctx, config.Timeout) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + conn, err := proxy.Dial(ctx, network, addr) + if err != nil { + return nil, err + } + c, chans, reqs, err := ssh.NewClientConn(conn, addr, config) + if err != nil { + return nil, err + } + return ssh.NewClient(c, chans, reqs), nil +} + +func (c *command) getHostWithPort() string { + if addr, found := c.doGetHostWithPortFromSSHConfig(); found { + return addr + } + + host := c.endpoint.Host + port := c.endpoint.Port + if port <= 0 { + port = DefaultPort + } + + return fmt.Sprintf("%s:%d", host, port) +} + +func (c *command) doGetHostWithPortFromSSHConfig() (addr string, found bool) { + if DefaultSSHConfig == nil { + return + } + + host := c.endpoint.Host + port := c.endpoint.Port + + configHost := DefaultSSHConfig.Get(c.endpoint.Host, "Hostname") + if configHost != "" { + host = configHost + found = true + } + + if !found { + return + } + + configPort := DefaultSSHConfig.Get(c.endpoint.Host, "Port") + if configPort != "" { + if i, err := strconv.Atoi(configPort); err == nil { + port = i + } + } + + addr = fmt.Sprintf("%s:%d", host, port) + return +} + +func (c *command) setAuthFromEndpoint() error { + var err error + c.auth, err = DefaultAuthBuilder(c.endpoint.User) + return err +} + +func endpointToCommand(cmd string, ep *transport.Endpoint) string { + return fmt.Sprintf("%s '%s'", cmd, ep.Path) +} + +func overrideConfig(overrides *ssh.ClientConfig, c *ssh.ClientConfig) { + if overrides == nil { + return + } + + t := reflect.TypeOf(*c) + vc := reflect.ValueOf(c).Elem() + vo := reflect.ValueOf(overrides).Elem() + + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + vcf := vc.FieldByName(f.Name) + vof := vo.FieldByName(f.Name) + vcf.Set(vof) + } + + *c = vc.Interface().(ssh.ClientConfig) +} diff --git a/vendor/github.com/go-git/go-git/v5/prune.go b/vendor/github.com/go-git/go-git/v5/prune.go new file mode 100644 index 000000000..cc5907a14 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/prune.go @@ -0,0 +1,66 @@ +package git + +import ( + "errors" + "time" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/storer" +) + +type PruneHandler func(unreferencedObjectHash plumbing.Hash) error +type PruneOptions struct { + // OnlyObjectsOlderThan if set to non-zero value + // selects only objects older than the time provided. + OnlyObjectsOlderThan time.Time + // Handler is called on matching objects + Handler PruneHandler +} + +var ErrLooseObjectsNotSupported = errors.New("Loose objects not supported") + +// DeleteObject deletes an object from a repository. +// The type conveniently matches PruneHandler. +func (r *Repository) DeleteObject(hash plumbing.Hash) error { + los, ok := r.Storer.(storer.LooseObjectStorer) + if !ok { + return ErrLooseObjectsNotSupported + } + + return los.DeleteLooseObject(hash) +} + +func (r *Repository) Prune(opt PruneOptions) error { + los, ok := r.Storer.(storer.LooseObjectStorer) + if !ok { + return ErrLooseObjectsNotSupported + } + + pw := newObjectWalker(r.Storer) + err := pw.walkAllRefs() + if err != nil { + return err + } + // Now walk all (loose) objects in storage. + return los.ForEachObjectHash(func(hash plumbing.Hash) error { + // Get out if we have seen this object. + if pw.isSeen(hash) { + return nil + } + // Otherwise it is a candidate for pruning. + // Check out for too new objects next. + if !opt.OnlyObjectsOlderThan.IsZero() { + // Errors here are non-fatal. The object may be e.g. packed. + // Or concurrently deleted. Skip such objects. + t, err := los.LooseObjectTime(hash) + if err != nil { + return nil + } + // Skip too new objects. + if !t.Before(opt.OnlyObjectsOlderThan) { + return nil + } + } + return opt.Handler(hash) + }) +} diff --git a/vendor/github.com/go-git/go-git/v5/references.go b/vendor/github.com/go-git/go-git/v5/references.go new file mode 100644 index 000000000..6d96035af --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/references.go @@ -0,0 +1,264 @@ +package git + +import ( + "io" + "sort" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/object" + "github.com/go-git/go-git/v5/utils/diff" + + "github.com/sergi/go-diff/diffmatchpatch" +) + +// References returns a slice of Commits for the file at "path", starting from +// the commit provided that contains the file from the provided path. The last +// commit into the returned slice is the commit where the file was created. +// If the provided commit does not contains the specified path, a nil slice is +// returned. The commits are sorted in commit order, newer to older. +// +// Caveats: +// +// - Moves and copies are not currently supported. +// +// - Cherry-picks are not detected unless there are no commits between them and +// therefore can appear repeated in the list. (see git path-id for hints on how +// to fix this). +func references(c *object.Commit, path string) ([]*object.Commit, error) { + var result []*object.Commit + seen := make(map[plumbing.Hash]struct{}) + if err := walkGraph(&result, &seen, c, path); err != nil { + return nil, err + } + + // TODO result should be returned without ordering + sortCommits(result) + + // for merges of identical cherry-picks + return removeComp(path, result, equivalent) +} + +type commitSorterer struct { + l []*object.Commit +} + +func (s commitSorterer) Len() int { + return len(s.l) +} + +func (s commitSorterer) Less(i, j int) bool { + return s.l[i].Committer.When.Before(s.l[j].Committer.When) || + s.l[i].Committer.When.Equal(s.l[j].Committer.When) && + s.l[i].Author.When.Before(s.l[j].Author.When) +} + +func (s commitSorterer) Swap(i, j int) { + s.l[i], s.l[j] = s.l[j], s.l[i] +} + +// SortCommits sorts a commit list by commit date, from older to newer. +func sortCommits(l []*object.Commit) { + s := &commitSorterer{l} + sort.Sort(s) +} + +// Recursive traversal of the commit graph, generating a linear history of the +// path. +func walkGraph(result *[]*object.Commit, seen *map[plumbing.Hash]struct{}, current *object.Commit, path string) error { + // check and update seen + if _, ok := (*seen)[current.Hash]; ok { + return nil + } + (*seen)[current.Hash] = struct{}{} + + // if the path is not in the current commit, stop searching. + if _, err := current.File(path); err != nil { + return nil + } + + // optimization: don't traverse branches that does not + // contain the path. + parents, err := parentsContainingPath(path, current) + if err != nil { + return err + } + switch len(parents) { + // if the path is not found in any of its parents, the path was + // created by this commit; we must add it to the revisions list and + // stop searching. This includes the case when current is the + // initial commit. + case 0: + *result = append(*result, current) + return nil + case 1: // only one parent contains the path + // if the file contents has change, add the current commit + different, err := differentContents(path, current, parents) + if err != nil { + return err + } + if len(different) == 1 { + *result = append(*result, current) + } + // in any case, walk the parent + return walkGraph(result, seen, parents[0], path) + default: // more than one parent contains the path + // TODO: detect merges that had a conflict, because they must be + // included in the result here. + for _, p := range parents { + err := walkGraph(result, seen, p, path) + if err != nil { + return err + } + } + } + return nil +} + +func parentsContainingPath(path string, c *object.Commit) ([]*object.Commit, error) { + // TODO: benchmark this method making git.object.Commit.parent public instead of using + // an iterator + var result []*object.Commit + iter := c.Parents() + for { + parent, err := iter.Next() + if err == io.EOF { + return result, nil + } + if err != nil { + return nil, err + } + if _, err := parent.File(path); err == nil { + result = append(result, parent) + } + } +} + +// Returns an slice of the commits in "cs" that has the file "path", but with different +// contents than what can be found in "c". +func differentContents(path string, c *object.Commit, cs []*object.Commit) ([]*object.Commit, error) { + result := make([]*object.Commit, 0, len(cs)) + h, found := blobHash(path, c) + if !found { + return nil, object.ErrFileNotFound + } + for _, cx := range cs { + if hx, found := blobHash(path, cx); found && h != hx { + result = append(result, cx) + } + } + return result, nil +} + +// blobHash returns the hash of a path in a commit +func blobHash(path string, commit *object.Commit) (hash plumbing.Hash, found bool) { + file, err := commit.File(path) + if err != nil { + var empty plumbing.Hash + return empty, found + } + return file.Hash, true +} + +type contentsComparatorFn func(path string, a, b *object.Commit) (bool, error) + +// Returns a new slice of commits, with duplicates removed. Expects a +// sorted commit list. Duplication is defined according to "comp". It +// will always keep the first commit of a series of duplicated commits. +func removeComp(path string, cs []*object.Commit, comp contentsComparatorFn) ([]*object.Commit, error) { + result := make([]*object.Commit, 0, len(cs)) + if len(cs) == 0 { + return result, nil + } + result = append(result, cs[0]) + for i := 1; i < len(cs); i++ { + equals, err := comp(path, cs[i], cs[i-1]) + if err != nil { + return nil, err + } + if !equals { + result = append(result, cs[i]) + } + } + return result, nil +} + +// Equivalent commits are commits whose patch is the same. +func equivalent(path string, a, b *object.Commit) (bool, error) { + numParentsA := a.NumParents() + numParentsB := b.NumParents() + + // the first commit is not equivalent to anyone + // and "I think" merges can not be equivalent to anything + if numParentsA != 1 || numParentsB != 1 { + return false, nil + } + + diffsA, err := patch(a, path) + if err != nil { + return false, err + } + diffsB, err := patch(b, path) + if err != nil { + return false, err + } + + return sameDiffs(diffsA, diffsB), nil +} + +func patch(c *object.Commit, path string) ([]diffmatchpatch.Diff, error) { + // get contents of the file in the commit + file, err := c.File(path) + if err != nil { + return nil, err + } + content, err := file.Contents() + if err != nil { + return nil, err + } + + // get contents of the file in the first parent of the commit + var contentParent string + iter := c.Parents() + parent, err := iter.Next() + if err != nil { + return nil, err + } + file, err = parent.File(path) + if err != nil { + contentParent = "" + } else { + contentParent, err = file.Contents() + if err != nil { + return nil, err + } + } + + // compare the contents of parent and child + return diff.Do(content, contentParent), nil +} + +func sameDiffs(a, b []diffmatchpatch.Diff) bool { + if len(a) != len(b) { + return false + } + for i := range a { + if !sameDiff(a[i], b[i]) { + return false + } + } + return true +} + +func sameDiff(a, b diffmatchpatch.Diff) bool { + if a.Type != b.Type { + return false + } + switch a.Type { + case 0: + return countLines(a.Text) == countLines(b.Text) + case 1, -1: + return a.Text == b.Text + default: + panic("unreachable") + } +} diff --git a/vendor/github.com/go-git/go-git/v5/remote.go b/vendor/github.com/go-git/go-git/v5/remote.go new file mode 100644 index 000000000..e642c5729 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/remote.go @@ -0,0 +1,1154 @@ +package git + +import ( + "context" + "errors" + "fmt" + "io" + + "github.com/go-git/go-billy/v5/osfs" + "github.com/go-git/go-git/v5/config" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/cache" + "github.com/go-git/go-git/v5/plumbing/format/packfile" + "github.com/go-git/go-git/v5/plumbing/object" + "github.com/go-git/go-git/v5/plumbing/protocol/packp" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/capability" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband" + "github.com/go-git/go-git/v5/plumbing/revlist" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/plumbing/transport/client" + "github.com/go-git/go-git/v5/storage" + "github.com/go-git/go-git/v5/storage/filesystem" + "github.com/go-git/go-git/v5/storage/memory" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +var ( + NoErrAlreadyUpToDate = errors.New("already up-to-date") + ErrDeleteRefNotSupported = errors.New("server does not support delete-refs") + ErrForceNeeded = errors.New("some refs were not updated") + ErrExactSHA1NotSupported = errors.New("server does not support exact SHA1 refspec") +) + +const ( + // This describes the maximum number of commits to walk when + // computing the haves to send to a server, for each ref in the + // repo containing this remote, when not using the multi-ack + // protocol. Setting this to 0 means there is no limit. + maxHavesToVisitPerRef = 100 +) + +// Remote represents a connection to a remote repository. +type Remote struct { + c *config.RemoteConfig + s storage.Storer +} + +// NewRemote creates a new Remote. +// The intended purpose is to use the Remote for tasks such as listing remote references (like using git ls-remote). +// Otherwise Remotes should be created via the use of a Repository. +func NewRemote(s storage.Storer, c *config.RemoteConfig) *Remote { + return &Remote{s: s, c: c} +} + +// Config returns the RemoteConfig object used to instantiate this Remote. +func (r *Remote) Config() *config.RemoteConfig { + return r.c +} + +func (r *Remote) String() string { + var fetch, push string + if len(r.c.URLs) > 0 { + fetch = r.c.URLs[0] + push = r.c.URLs[0] + } + + return fmt.Sprintf("%s\t%s (fetch)\n%[1]s\t%[3]s (push)", r.c.Name, fetch, push) +} + +// Push performs a push to the remote. Returns NoErrAlreadyUpToDate if the +// remote was already up-to-date. +func (r *Remote) Push(o *PushOptions) error { + return r.PushContext(context.Background(), o) +} + +// PushContext performs a push to the remote. Returns NoErrAlreadyUpToDate if +// the remote was already up-to-date. +// +// The provided Context must be non-nil. If the context expires before the +// operation is complete, an error is returned. The context only affects to the +// transport operations. +func (r *Remote) PushContext(ctx context.Context, o *PushOptions) (err error) { + if err := o.Validate(); err != nil { + return err + } + + if o.RemoteName != r.c.Name { + return fmt.Errorf("remote names don't match: %s != %s", o.RemoteName, r.c.Name) + } + + s, err := newSendPackSession(r.c.URLs[0], o.Auth) + if err != nil { + return err + } + + defer ioutil.CheckClose(s, &err) + + ar, err := s.AdvertisedReferences() + if err != nil { + return err + } + + remoteRefs, err := ar.AllReferences() + if err != nil { + return err + } + + isDelete := false + allDelete := true + for _, rs := range o.RefSpecs { + if rs.IsDelete() { + isDelete = true + } else { + allDelete = false + } + if isDelete && !allDelete { + break + } + } + + if isDelete && !ar.Capabilities.Supports(capability.DeleteRefs) { + return ErrDeleteRefNotSupported + } + + if o.Force { + for i := 0; i < len(o.RefSpecs); i++ { + rs := &o.RefSpecs[i] + if !rs.IsForceUpdate() { + o.RefSpecs[i] = config.RefSpec("+" + rs.String()) + } + } + } + + localRefs, err := r.references() + if err != nil { + return err + } + + req, err := r.newReferenceUpdateRequest(o, localRefs, remoteRefs, ar) + if err != nil { + return err + } + + if len(req.Commands) == 0 { + return NoErrAlreadyUpToDate + } + + objects := objectsToPush(req.Commands) + + haves, err := referencesToHashes(remoteRefs) + if err != nil { + return err + } + + stop, err := r.s.Shallow() + if err != nil { + return err + } + + // if we have shallow we should include this as part of the objects that + // we are aware. + haves = append(haves, stop...) + + var hashesToPush []plumbing.Hash + // Avoid the expensive revlist operation if we're only doing deletes. + if !allDelete { + if r.c.IsFirstURLLocal() { + // If we're are pushing to a local repo, it might be much + // faster to use a local storage layer to get the commits + // to ignore, when calculating the object revlist. + localStorer := filesystem.NewStorage( + osfs.New(r.c.URLs[0]), cache.NewObjectLRUDefault()) + hashesToPush, err = revlist.ObjectsWithStorageForIgnores( + r.s, localStorer, objects, haves) + } else { + hashesToPush, err = revlist.Objects(r.s, objects, haves) + } + if err != nil { + return err + } + } + + if len(hashesToPush) == 0 { + allDelete = true + for _, command := range req.Commands { + if command.Action() != packp.Delete { + allDelete = false + break + } + } + } + + rs, err := pushHashes(ctx, s, r.s, req, hashesToPush, r.useRefDeltas(ar), allDelete) + if err != nil { + return err + } + + if err = rs.Error(); err != nil { + return err + } + + return r.updateRemoteReferenceStorage(req, rs) +} + +func (r *Remote) useRefDeltas(ar *packp.AdvRefs) bool { + return !ar.Capabilities.Supports(capability.OFSDelta) +} + +func (r *Remote) newReferenceUpdateRequest( + o *PushOptions, + localRefs []*plumbing.Reference, + remoteRefs storer.ReferenceStorer, + ar *packp.AdvRefs, +) (*packp.ReferenceUpdateRequest, error) { + req := packp.NewReferenceUpdateRequestFromCapabilities(ar.Capabilities) + + if o.Progress != nil { + req.Progress = o.Progress + if ar.Capabilities.Supports(capability.Sideband64k) { + req.Capabilities.Set(capability.Sideband64k) + } else if ar.Capabilities.Supports(capability.Sideband) { + req.Capabilities.Set(capability.Sideband) + } + } + + if err := r.addReferencesToUpdate(o.RefSpecs, localRefs, remoteRefs, req, o.Prune); err != nil { + return nil, err + } + + return req, nil +} + +func (r *Remote) updateRemoteReferenceStorage( + req *packp.ReferenceUpdateRequest, + result *packp.ReportStatus, +) error { + + for _, spec := range r.c.Fetch { + for _, c := range req.Commands { + if !spec.Match(c.Name) { + continue + } + + local := spec.Dst(c.Name) + ref := plumbing.NewHashReference(local, c.New) + switch c.Action() { + case packp.Create, packp.Update: + if err := r.s.SetReference(ref); err != nil { + return err + } + case packp.Delete: + if err := r.s.RemoveReference(local); err != nil { + return err + } + } + } + } + + return nil +} + +// FetchContext fetches references along with the objects necessary to complete +// their histories. +// +// Returns nil if the operation is successful, NoErrAlreadyUpToDate if there are +// no changes to be fetched, or an error. +// +// The provided Context must be non-nil. If the context expires before the +// operation is complete, an error is returned. The context only affects to the +// transport operations. +func (r *Remote) FetchContext(ctx context.Context, o *FetchOptions) error { + _, err := r.fetch(ctx, o) + return err +} + +// Fetch fetches references along with the objects necessary to complete their +// histories. +// +// Returns nil if the operation is successful, NoErrAlreadyUpToDate if there are +// no changes to be fetched, or an error. +func (r *Remote) Fetch(o *FetchOptions) error { + return r.FetchContext(context.Background(), o) +} + +func (r *Remote) fetch(ctx context.Context, o *FetchOptions) (sto storer.ReferenceStorer, err error) { + if o.RemoteName == "" { + o.RemoteName = r.c.Name + } + + if err = o.Validate(); err != nil { + return nil, err + } + + if len(o.RefSpecs) == 0 { + o.RefSpecs = r.c.Fetch + } + + s, err := newUploadPackSession(r.c.URLs[0], o.Auth) + if err != nil { + return nil, err + } + + defer ioutil.CheckClose(s, &err) + + ar, err := s.AdvertisedReferences() + if err != nil { + return nil, err + } + + req, err := r.newUploadPackRequest(o, ar) + if err != nil { + return nil, err + } + + if err := r.isSupportedRefSpec(o.RefSpecs, ar); err != nil { + return nil, err + } + + remoteRefs, err := ar.AllReferences() + if err != nil { + return nil, err + } + + localRefs, err := r.references() + if err != nil { + return nil, err + } + + refs, err := calculateRefs(o.RefSpecs, remoteRefs, o.Tags) + if err != nil { + return nil, err + } + + req.Wants, err = getWants(r.s, refs) + if len(req.Wants) > 0 { + req.Haves, err = getHaves(localRefs, remoteRefs, r.s) + if err != nil { + return nil, err + } + + if err = r.fetchPack(ctx, o, s, req); err != nil { + return nil, err + } + } + + updated, err := r.updateLocalReferenceStorage(o.RefSpecs, refs, remoteRefs, o.Tags, o.Force) + if err != nil { + return nil, err + } + + if !updated { + return remoteRefs, NoErrAlreadyUpToDate + } + + return remoteRefs, nil +} + +func newUploadPackSession(url string, auth transport.AuthMethod) (transport.UploadPackSession, error) { + c, ep, err := newClient(url) + if err != nil { + return nil, err + } + + return c.NewUploadPackSession(ep, auth) +} + +func newSendPackSession(url string, auth transport.AuthMethod) (transport.ReceivePackSession, error) { + c, ep, err := newClient(url) + if err != nil { + return nil, err + } + + return c.NewReceivePackSession(ep, auth) +} + +func newClient(url string) (transport.Transport, *transport.Endpoint, error) { + ep, err := transport.NewEndpoint(url) + if err != nil { + return nil, nil, err + } + + c, err := client.NewClient(ep) + if err != nil { + return nil, nil, err + } + + return c, ep, err +} + +func (r *Remote) fetchPack(ctx context.Context, o *FetchOptions, s transport.UploadPackSession, + req *packp.UploadPackRequest) (err error) { + + reader, err := s.UploadPack(ctx, req) + if err != nil { + return err + } + + defer ioutil.CheckClose(reader, &err) + + if err = r.updateShallow(o, reader); err != nil { + return err + } + + if err = packfile.UpdateObjectStorage(r.s, + buildSidebandIfSupported(req.Capabilities, reader, o.Progress), + ); err != nil { + return err + } + + return err +} + +func (r *Remote) addReferencesToUpdate( + refspecs []config.RefSpec, + localRefs []*plumbing.Reference, + remoteRefs storer.ReferenceStorer, + req *packp.ReferenceUpdateRequest, + prune bool, +) error { + // This references dictionary will be used to search references by name. + refsDict := make(map[string]*plumbing.Reference) + for _, ref := range localRefs { + refsDict[ref.Name().String()] = ref + } + + for _, rs := range refspecs { + if rs.IsDelete() { + if err := r.deleteReferences(rs, remoteRefs, refsDict, req, false); err != nil { + return err + } + } else { + err := r.addOrUpdateReferences(rs, localRefs, refsDict, remoteRefs, req) + if err != nil { + return err + } + + if prune { + if err := r.deleteReferences(rs, remoteRefs, refsDict, req, true); err != nil { + return err + } + } + } + } + + return nil +} + +func (r *Remote) addOrUpdateReferences( + rs config.RefSpec, + localRefs []*plumbing.Reference, + refsDict map[string]*plumbing.Reference, + remoteRefs storer.ReferenceStorer, + req *packp.ReferenceUpdateRequest, +) error { + // If it is not a wilcard refspec we can directly search for the reference + // in the references dictionary. + if !rs.IsWildcard() { + ref, ok := refsDict[rs.Src()] + if !ok { + return nil + } + + return r.addReferenceIfRefSpecMatches(rs, remoteRefs, ref, req) + } + + for _, ref := range localRefs { + err := r.addReferenceIfRefSpecMatches(rs, remoteRefs, ref, req) + if err != nil { + return err + } + } + + return nil +} + +func (r *Remote) deleteReferences(rs config.RefSpec, + remoteRefs storer.ReferenceStorer, + refsDict map[string]*plumbing.Reference, + req *packp.ReferenceUpdateRequest, + prune bool) error { + iter, err := remoteRefs.IterReferences() + if err != nil { + return err + } + + return iter.ForEach(func(ref *plumbing.Reference) error { + if ref.Type() != plumbing.HashReference { + return nil + } + + if prune { + rs := rs.Reverse() + if !rs.Match(ref.Name()) { + return nil + } + + if _, ok := refsDict[rs.Dst(ref.Name()).String()]; ok { + return nil + } + } else { + if rs.Dst("") != ref.Name() { + return nil + } + } + + cmd := &packp.Command{ + Name: ref.Name(), + Old: ref.Hash(), + New: plumbing.ZeroHash, + } + req.Commands = append(req.Commands, cmd) + return nil + }) +} + +func (r *Remote) addReferenceIfRefSpecMatches(rs config.RefSpec, + remoteRefs storer.ReferenceStorer, localRef *plumbing.Reference, + req *packp.ReferenceUpdateRequest) error { + + if localRef.Type() != plumbing.HashReference { + return nil + } + + if !rs.Match(localRef.Name()) { + return nil + } + + cmd := &packp.Command{ + Name: rs.Dst(localRef.Name()), + Old: plumbing.ZeroHash, + New: localRef.Hash(), + } + + remoteRef, err := remoteRefs.Reference(cmd.Name) + if err == nil { + if remoteRef.Type() != plumbing.HashReference { + //TODO: check actual git behavior here + return nil + } + + cmd.Old = remoteRef.Hash() + } else if err != plumbing.ErrReferenceNotFound { + return err + } + + if cmd.Old == cmd.New { + return nil + } + + if !rs.IsForceUpdate() { + if err := checkFastForwardUpdate(r.s, remoteRefs, cmd); err != nil { + return err + } + } + + req.Commands = append(req.Commands, cmd) + return nil +} + +func (r *Remote) references() ([]*plumbing.Reference, error) { + var localRefs []*plumbing.Reference + + iter, err := r.s.IterReferences() + if err != nil { + return nil, err + } + + for { + ref, err := iter.Next() + if err == io.EOF { + break + } + + if err != nil { + return nil, err + } + + localRefs = append(localRefs, ref) + } + + return localRefs, nil +} + +func getRemoteRefsFromStorer(remoteRefStorer storer.ReferenceStorer) ( + map[plumbing.Hash]bool, error) { + remoteRefs := map[plumbing.Hash]bool{} + iter, err := remoteRefStorer.IterReferences() + if err != nil { + return nil, err + } + err = iter.ForEach(func(ref *plumbing.Reference) error { + if ref.Type() != plumbing.HashReference { + return nil + } + remoteRefs[ref.Hash()] = true + return nil + }) + if err != nil { + return nil, err + } + return remoteRefs, nil +} + +// getHavesFromRef populates the given `haves` map with the given +// reference, and up to `maxHavesToVisitPerRef` ancestor commits. +func getHavesFromRef( + ref *plumbing.Reference, + remoteRefs map[plumbing.Hash]bool, + s storage.Storer, + haves map[plumbing.Hash]bool, +) error { + h := ref.Hash() + if haves[h] { + return nil + } + + // No need to load the commit if we know the remote already + // has this hash. + if remoteRefs[h] { + haves[h] = true + return nil + } + + commit, err := object.GetCommit(s, h) + if err != nil { + // Ignore the error if this isn't a commit. + haves[ref.Hash()] = true + return nil + } + + // Until go-git supports proper commit negotiation during an + // upload pack request, include up to `maxHavesToVisitPerRef` + // commits from the history of each ref. + walker := object.NewCommitPreorderIter(commit, haves, nil) + toVisit := maxHavesToVisitPerRef + return walker.ForEach(func(c *object.Commit) error { + haves[c.Hash] = true + toVisit-- + // If toVisit starts out at 0 (indicating there is no + // max), then it will be negative here and we won't stop + // early. + if toVisit == 0 || remoteRefs[c.Hash] { + return storer.ErrStop + } + return nil + }) +} + +func getHaves( + localRefs []*plumbing.Reference, + remoteRefStorer storer.ReferenceStorer, + s storage.Storer, +) ([]plumbing.Hash, error) { + haves := map[plumbing.Hash]bool{} + + // Build a map of all the remote references, to avoid loading too + // many parent commits for references we know don't need to be + // transferred. + remoteRefs, err := getRemoteRefsFromStorer(remoteRefStorer) + if err != nil { + return nil, err + } + + for _, ref := range localRefs { + if haves[ref.Hash()] { + continue + } + + if ref.Type() != plumbing.HashReference { + continue + } + + err = getHavesFromRef(ref, remoteRefs, s, haves) + if err != nil { + return nil, err + } + } + + var result []plumbing.Hash + for h := range haves { + result = append(result, h) + } + + return result, nil +} + +const refspecAllTags = "+refs/tags/*:refs/tags/*" + +func calculateRefs( + spec []config.RefSpec, + remoteRefs storer.ReferenceStorer, + tagMode TagMode, +) (memory.ReferenceStorage, error) { + if tagMode == AllTags { + spec = append(spec, refspecAllTags) + } + + refs := make(memory.ReferenceStorage) + for _, s := range spec { + if err := doCalculateRefs(s, remoteRefs, refs); err != nil { + return nil, err + } + } + + return refs, nil +} + +func doCalculateRefs( + s config.RefSpec, + remoteRefs storer.ReferenceStorer, + refs memory.ReferenceStorage, +) error { + iter, err := remoteRefs.IterReferences() + if err != nil { + return err + } + + if s.IsExactSHA1() { + ref := plumbing.NewHashReference(s.Dst(""), plumbing.NewHash(s.Src())) + return refs.SetReference(ref) + } + + var matched bool + err = iter.ForEach(func(ref *plumbing.Reference) error { + if !s.Match(ref.Name()) { + return nil + } + + if ref.Type() == plumbing.SymbolicReference { + target, err := storer.ResolveReference(remoteRefs, ref.Name()) + if err != nil { + return err + } + + ref = plumbing.NewHashReference(ref.Name(), target.Hash()) + } + + if ref.Type() != plumbing.HashReference { + return nil + } + + matched = true + if err := refs.SetReference(ref); err != nil { + return err + } + + if !s.IsWildcard() { + return storer.ErrStop + } + + return nil + }) + + if !matched && !s.IsWildcard() { + return fmt.Errorf("couldn't find remote ref %q", s.Src()) + } + + return err +} + +func getWants(localStorer storage.Storer, refs memory.ReferenceStorage) ([]plumbing.Hash, error) { + wants := map[plumbing.Hash]bool{} + for _, ref := range refs { + hash := ref.Hash() + exists, err := objectExists(localStorer, ref.Hash()) + if err != nil { + return nil, err + } + + if !exists { + wants[hash] = true + } + } + + var result []plumbing.Hash + for h := range wants { + result = append(result, h) + } + + return result, nil +} + +func objectExists(s storer.EncodedObjectStorer, h plumbing.Hash) (bool, error) { + _, err := s.EncodedObject(plumbing.AnyObject, h) + if err == plumbing.ErrObjectNotFound { + return false, nil + } + + return true, err +} + +func checkFastForwardUpdate(s storer.EncodedObjectStorer, remoteRefs storer.ReferenceStorer, cmd *packp.Command) error { + if cmd.Old == plumbing.ZeroHash { + _, err := remoteRefs.Reference(cmd.Name) + if err == plumbing.ErrReferenceNotFound { + return nil + } + + if err != nil { + return err + } + + return fmt.Errorf("non-fast-forward update: %s", cmd.Name.String()) + } + + ff, err := isFastForward(s, cmd.Old, cmd.New) + if err != nil { + return err + } + + if !ff { + return fmt.Errorf("non-fast-forward update: %s", cmd.Name.String()) + } + + return nil +} + +func isFastForward(s storer.EncodedObjectStorer, old, new plumbing.Hash) (bool, error) { + c, err := object.GetCommit(s, new) + if err != nil { + return false, err + } + + found := false + iter := object.NewCommitPreorderIter(c, nil, nil) + err = iter.ForEach(func(c *object.Commit) error { + if c.Hash != old { + return nil + } + + found = true + return storer.ErrStop + }) + return found, err +} + +func (r *Remote) newUploadPackRequest(o *FetchOptions, + ar *packp.AdvRefs) (*packp.UploadPackRequest, error) { + + req := packp.NewUploadPackRequestFromCapabilities(ar.Capabilities) + + if o.Depth != 0 { + req.Depth = packp.DepthCommits(o.Depth) + if err := req.Capabilities.Set(capability.Shallow); err != nil { + return nil, err + } + } + + if o.Progress == nil && ar.Capabilities.Supports(capability.NoProgress) { + if err := req.Capabilities.Set(capability.NoProgress); err != nil { + return nil, err + } + } + + isWildcard := true + for _, s := range o.RefSpecs { + if !s.IsWildcard() { + isWildcard = false + break + } + } + + if isWildcard && o.Tags == TagFollowing && ar.Capabilities.Supports(capability.IncludeTag) { + if err := req.Capabilities.Set(capability.IncludeTag); err != nil { + return nil, err + } + } + + return req, nil +} + +func (r *Remote) isSupportedRefSpec(refs []config.RefSpec, ar *packp.AdvRefs) error { + var containsIsExact bool + for _, ref := range refs { + if ref.IsExactSHA1() { + containsIsExact = true + } + } + + if !containsIsExact { + return nil + } + + if ar.Capabilities.Supports(capability.AllowReachableSHA1InWant) || + ar.Capabilities.Supports(capability.AllowTipSHA1InWant) { + return nil + } + + return ErrExactSHA1NotSupported +} + +func buildSidebandIfSupported(l *capability.List, reader io.Reader, p sideband.Progress) io.Reader { + var t sideband.Type + + switch { + case l.Supports(capability.Sideband): + t = sideband.Sideband + case l.Supports(capability.Sideband64k): + t = sideband.Sideband64k + default: + return reader + } + + d := sideband.NewDemuxer(t, reader) + d.Progress = p + + return d +} + +func (r *Remote) updateLocalReferenceStorage( + specs []config.RefSpec, + fetchedRefs, remoteRefs memory.ReferenceStorage, + tagMode TagMode, + force bool, +) (updated bool, err error) { + isWildcard := true + forceNeeded := false + + for _, spec := range specs { + if !spec.IsWildcard() { + isWildcard = false + } + + for _, ref := range fetchedRefs { + if !spec.Match(ref.Name()) && !spec.IsExactSHA1() { + continue + } + + if ref.Type() != plumbing.HashReference { + continue + } + + localName := spec.Dst(ref.Name()) + old, _ := storer.ResolveReference(r.s, localName) + new := plumbing.NewHashReference(localName, ref.Hash()) + + // If the ref exists locally as a branch and force is not specified, + // only update if the new ref is an ancestor of the old + if old != nil && old.Name().IsBranch() && !force && !spec.IsForceUpdate() { + ff, err := isFastForward(r.s, old.Hash(), new.Hash()) + if err != nil { + return updated, err + } + + if !ff { + forceNeeded = true + continue + } + } + + refUpdated, err := checkAndUpdateReferenceStorerIfNeeded(r.s, new, old) + if err != nil { + return updated, err + } + + if refUpdated { + updated = true + } + } + } + + if tagMode == NoTags { + return updated, nil + } + + tags := fetchedRefs + if isWildcard { + tags = remoteRefs + } + tagUpdated, err := r.buildFetchedTags(tags) + if err != nil { + return updated, err + } + + if tagUpdated { + updated = true + } + + if forceNeeded { + err = ErrForceNeeded + } + + return +} + +func (r *Remote) buildFetchedTags(refs memory.ReferenceStorage) (updated bool, err error) { + for _, ref := range refs { + if !ref.Name().IsTag() { + continue + } + + _, err := r.s.EncodedObject(plumbing.AnyObject, ref.Hash()) + if err == plumbing.ErrObjectNotFound { + continue + } + + if err != nil { + return false, err + } + + refUpdated, err := updateReferenceStorerIfNeeded(r.s, ref) + if err != nil { + return updated, err + } + + if refUpdated { + updated = true + } + } + + return +} + +// List the references on the remote repository. +func (r *Remote) List(o *ListOptions) (rfs []*plumbing.Reference, err error) { + s, err := newUploadPackSession(r.c.URLs[0], o.Auth) + if err != nil { + return nil, err + } + + defer ioutil.CheckClose(s, &err) + + ar, err := s.AdvertisedReferences() + if err != nil { + return nil, err + } + + allRefs, err := ar.AllReferences() + if err != nil { + return nil, err + } + + refs, err := allRefs.IterReferences() + if err != nil { + return nil, err + } + + var resultRefs []*plumbing.Reference + refs.ForEach(func(ref *plumbing.Reference) error { + resultRefs = append(resultRefs, ref) + return nil + }) + + return resultRefs, nil +} + +func objectsToPush(commands []*packp.Command) []plumbing.Hash { + var objects []plumbing.Hash + for _, cmd := range commands { + if cmd.New == plumbing.ZeroHash { + continue + } + + objects = append(objects, cmd.New) + } + return objects +} + +func referencesToHashes(refs storer.ReferenceStorer) ([]plumbing.Hash, error) { + iter, err := refs.IterReferences() + if err != nil { + return nil, err + } + + var hs []plumbing.Hash + err = iter.ForEach(func(ref *plumbing.Reference) error { + if ref.Type() != plumbing.HashReference { + return nil + } + + hs = append(hs, ref.Hash()) + return nil + }) + if err != nil { + return nil, err + } + + return hs, nil +} + +func pushHashes( + ctx context.Context, + sess transport.ReceivePackSession, + s storage.Storer, + req *packp.ReferenceUpdateRequest, + hs []plumbing.Hash, + useRefDeltas bool, + allDelete bool, +) (*packp.ReportStatus, error) { + + rd, wr := io.Pipe() + + config, err := s.Config() + if err != nil { + return nil, err + } + + // Set buffer size to 1 so the error message can be written when + // ReceivePack fails. Otherwise the goroutine will be blocked writing + // to the channel. + done := make(chan error, 1) + + if !allDelete { + req.Packfile = rd + go func() { + e := packfile.NewEncoder(wr, s, useRefDeltas) + if _, err := e.Encode(hs, config.Pack.Window); err != nil { + done <- wr.CloseWithError(err) + return + } + + done <- wr.Close() + }() + } else { + close(done) + } + + rs, err := sess.ReceivePack(ctx, req) + if err != nil { + // close the pipe to unlock encode write + _ = rd.Close() + return nil, err + } + + if err := <-done; err != nil { + return nil, err + } + + return rs, nil +} + +func (r *Remote) updateShallow(o *FetchOptions, resp *packp.UploadPackResponse) error { + if o.Depth == 0 || len(resp.Shallows) == 0 { + return nil + } + + shallows, err := r.s.Shallow() + if err != nil { + return err + } + +outer: + for _, s := range resp.Shallows { + for _, oldS := range shallows { + if s == oldS { + continue outer + } + } + shallows = append(shallows, s) + } + + return r.s.SetShallow(shallows) +} diff --git a/vendor/github.com/go-git/go-git/v5/repository.go b/vendor/github.com/go-git/go-git/v5/repository.go new file mode 100644 index 000000000..47318d113 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/repository.go @@ -0,0 +1,1614 @@ +package git + +import ( + "bytes" + "context" + "errors" + "fmt" + "io" + stdioutil "io/ioutil" + "os" + "path" + "path/filepath" + "strings" + "time" + + "github.com/go-git/go-git/v5/config" + "github.com/go-git/go-git/v5/internal/revision" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/cache" + "github.com/go-git/go-git/v5/plumbing/format/packfile" + "github.com/go-git/go-git/v5/plumbing/object" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/storage" + "github.com/go-git/go-git/v5/storage/filesystem" + "github.com/go-git/go-git/v5/utils/ioutil" + "github.com/imdario/mergo" + "golang.org/x/crypto/openpgp" + + "github.com/go-git/go-billy/v5" + "github.com/go-git/go-billy/v5/osfs" +) + +// GitDirName this is a special folder where all the git stuff is. +const GitDirName = ".git" + +var ( + // ErrBranchExists an error stating the specified branch already exists + ErrBranchExists = errors.New("branch already exists") + // ErrBranchNotFound an error stating the specified branch does not exist + ErrBranchNotFound = errors.New("branch not found") + // ErrTagExists an error stating the specified tag already exists + ErrTagExists = errors.New("tag already exists") + // ErrTagNotFound an error stating the specified tag does not exist + ErrTagNotFound = errors.New("tag not found") + // ErrFetching is returned when the packfile could not be downloaded + ErrFetching = errors.New("unable to fetch packfile") + + ErrInvalidReference = errors.New("invalid reference, should be a tag or a branch") + ErrRepositoryNotExists = errors.New("repository does not exist") + ErrRepositoryAlreadyExists = errors.New("repository already exists") + ErrRemoteNotFound = errors.New("remote not found") + ErrRemoteExists = errors.New("remote already exists") + ErrAnonymousRemoteName = errors.New("anonymous remote name must be 'anonymous'") + ErrWorktreeNotProvided = errors.New("worktree should be provided") + ErrIsBareRepository = errors.New("worktree not available in a bare repository") + ErrUnableToResolveCommit = errors.New("unable to resolve commit") + ErrPackedObjectsNotSupported = errors.New("Packed objects not supported") +) + +// Repository represents a git repository +type Repository struct { + Storer storage.Storer + + r map[string]*Remote + wt billy.Filesystem +} + +// Init creates an empty git repository, based on the given Storer and worktree. +// The worktree Filesystem is optional, if nil a bare repository is created. If +// the given storer is not empty ErrRepositoryAlreadyExists is returned +func Init(s storage.Storer, worktree billy.Filesystem) (*Repository, error) { + if err := initStorer(s); err != nil { + return nil, err + } + + r := newRepository(s, worktree) + _, err := r.Reference(plumbing.HEAD, false) + switch err { + case plumbing.ErrReferenceNotFound: + case nil: + return nil, ErrRepositoryAlreadyExists + default: + return nil, err + } + + h := plumbing.NewSymbolicReference(plumbing.HEAD, plumbing.Master) + if err := s.SetReference(h); err != nil { + return nil, err + } + + if worktree == nil { + r.setIsBare(true) + return r, nil + } + + return r, setWorktreeAndStoragePaths(r, worktree) +} + +func initStorer(s storer.Storer) error { + i, ok := s.(storer.Initializer) + if !ok { + return nil + } + + return i.Init() +} + +func setWorktreeAndStoragePaths(r *Repository, worktree billy.Filesystem) error { + type fsBased interface { + Filesystem() billy.Filesystem + } + + // .git file is only created if the storage is file based and the file + // system is osfs.OS + fs, isFSBased := r.Storer.(fsBased) + if !isFSBased { + return nil + } + + if err := createDotGitFile(worktree, fs.Filesystem()); err != nil { + return err + } + + return setConfigWorktree(r, worktree, fs.Filesystem()) +} + +func createDotGitFile(worktree, storage billy.Filesystem) error { + path, err := filepath.Rel(worktree.Root(), storage.Root()) + if err != nil { + path = storage.Root() + } + + if path == GitDirName { + // not needed, since the folder is the default place + return nil + } + + f, err := worktree.Create(GitDirName) + if err != nil { + return err + } + + defer f.Close() + _, err = fmt.Fprintf(f, "gitdir: %s\n", path) + return err +} + +func setConfigWorktree(r *Repository, worktree, storage billy.Filesystem) error { + path, err := filepath.Rel(storage.Root(), worktree.Root()) + if err != nil { + path = worktree.Root() + } + + if path == ".." { + // not needed, since the folder is the default place + return nil + } + + cfg, err := r.Config() + if err != nil { + return err + } + + cfg.Core.Worktree = path + return r.Storer.SetConfig(cfg) +} + +// Open opens a git repository using the given Storer and worktree filesystem, +// if the given storer is complete empty ErrRepositoryNotExists is returned. +// The worktree can be nil when the repository being opened is bare, if the +// repository is a normal one (not bare) and worktree is nil the err +// ErrWorktreeNotProvided is returned +func Open(s storage.Storer, worktree billy.Filesystem) (*Repository, error) { + _, err := s.Reference(plumbing.HEAD) + if err == plumbing.ErrReferenceNotFound { + return nil, ErrRepositoryNotExists + } + + if err != nil { + return nil, err + } + + return newRepository(s, worktree), nil +} + +// Clone a repository into the given Storer and worktree Filesystem with the +// given options, if worktree is nil a bare repository is created. If the given +// storer is not empty ErrRepositoryAlreadyExists is returned. +// +// The provided Context must be non-nil. If the context expires before the +// operation is complete, an error is returned. The context only affects to the +// transport operations. +func Clone(s storage.Storer, worktree billy.Filesystem, o *CloneOptions) (*Repository, error) { + return CloneContext(context.Background(), s, worktree, o) +} + +// CloneContext a repository into the given Storer and worktree Filesystem with +// the given options, if worktree is nil a bare repository is created. If the +// given storer is not empty ErrRepositoryAlreadyExists is returned. +// +// The provided Context must be non-nil. If the context expires before the +// operation is complete, an error is returned. The context only affects to the +// transport operations. +func CloneContext( + ctx context.Context, s storage.Storer, worktree billy.Filesystem, o *CloneOptions, +) (*Repository, error) { + r, err := Init(s, worktree) + if err != nil { + return nil, err + } + + return r, r.clone(ctx, o) +} + +// PlainInit create an empty git repository at the given path. isBare defines +// if the repository will have worktree (non-bare) or not (bare), if the path +// is not empty ErrRepositoryAlreadyExists is returned. +func PlainInit(path string, isBare bool) (*Repository, error) { + var wt, dot billy.Filesystem + + if isBare { + dot = osfs.New(path) + } else { + wt = osfs.New(path) + dot, _ = wt.Chroot(GitDirName) + } + + s := filesystem.NewStorage(dot, cache.NewObjectLRUDefault()) + + return Init(s, wt) +} + +// PlainOpen opens a git repository from the given path. It detects if the +// repository is bare or a normal one. If the path doesn't contain a valid +// repository ErrRepositoryNotExists is returned +func PlainOpen(path string) (*Repository, error) { + return PlainOpenWithOptions(path, &PlainOpenOptions{}) +} + +// PlainOpenWithOptions opens a git repository from the given path with specific +// options. See PlainOpen for more info. +func PlainOpenWithOptions(path string, o *PlainOpenOptions) (*Repository, error) { + dot, wt, err := dotGitToOSFilesystems(path, o.DetectDotGit) + if err != nil { + return nil, err + } + + if _, err := dot.Stat(""); err != nil { + if os.IsNotExist(err) { + return nil, ErrRepositoryNotExists + } + + return nil, err + } + + s := filesystem.NewStorage(dot, cache.NewObjectLRUDefault()) + + return Open(s, wt) +} + +func dotGitToOSFilesystems(path string, detect bool) (dot, wt billy.Filesystem, err error) { + if path, err = filepath.Abs(path); err != nil { + return nil, nil, err + } + var fs billy.Filesystem + var fi os.FileInfo + for { + fs = osfs.New(path) + fi, err = fs.Stat(GitDirName) + if err == nil { + // no error; stop + break + } + if !os.IsNotExist(err) { + // unknown error; stop + return nil, nil, err + } + if detect { + // try its parent as long as we haven't reached + // the root dir + if dir := filepath.Dir(path); dir != path { + path = dir + continue + } + } + // not detecting via parent dirs and the dir does not exist; + // stop + return fs, nil, nil + } + + if fi.IsDir() { + dot, err = fs.Chroot(GitDirName) + return dot, fs, err + } + + dot, err = dotGitFileToOSFilesystem(path, fs) + if err != nil { + return nil, nil, err + } + + return dot, fs, nil +} + +func dotGitFileToOSFilesystem(path string, fs billy.Filesystem) (bfs billy.Filesystem, err error) { + f, err := fs.Open(GitDirName) + if err != nil { + return nil, err + } + defer ioutil.CheckClose(f, &err) + + b, err := stdioutil.ReadAll(f) + if err != nil { + return nil, err + } + + line := string(b) + const prefix = "gitdir: " + if !strings.HasPrefix(line, prefix) { + return nil, fmt.Errorf(".git file has no %s prefix", prefix) + } + + gitdir := strings.Split(line[len(prefix):], "\n")[0] + gitdir = strings.TrimSpace(gitdir) + if filepath.IsAbs(gitdir) { + return osfs.New(gitdir), nil + } + + return osfs.New(fs.Join(path, gitdir)), nil +} + +// PlainClone a repository into the path with the given options, isBare defines +// if the new repository will be bare or normal. If the path is not empty +// ErrRepositoryAlreadyExists is returned. +// +// TODO(mcuadros): move isBare to CloneOptions in v5 +func PlainClone(path string, isBare bool, o *CloneOptions) (*Repository, error) { + return PlainCloneContext(context.Background(), path, isBare, o) +} + +// PlainCloneContext a repository into the path with the given options, isBare +// defines if the new repository will be bare or normal. If the path is not empty +// ErrRepositoryAlreadyExists is returned. +// +// The provided Context must be non-nil. If the context expires before the +// operation is complete, an error is returned. The context only affects to the +// transport operations. +// +// TODO(mcuadros): move isBare to CloneOptions in v5 +// TODO(smola): refuse upfront to clone on a non-empty directory in v5, see #1027 +func PlainCloneContext(ctx context.Context, path string, isBare bool, o *CloneOptions) (*Repository, error) { + cleanup, cleanupParent, err := checkIfCleanupIsNeeded(path) + if err != nil { + return nil, err + } + + r, err := PlainInit(path, isBare) + if err != nil { + return nil, err + } + + err = r.clone(ctx, o) + if err != nil && err != ErrRepositoryAlreadyExists { + if cleanup { + cleanUpDir(path, cleanupParent) + } + } + + return r, err +} + +func newRepository(s storage.Storer, worktree billy.Filesystem) *Repository { + return &Repository{ + Storer: s, + wt: worktree, + r: make(map[string]*Remote), + } +} + +func checkIfCleanupIsNeeded(path string) (cleanup bool, cleanParent bool, err error) { + fi, err := os.Stat(path) + if err != nil { + if os.IsNotExist(err) { + return true, true, nil + } + + return false, false, err + } + + if !fi.IsDir() { + return false, false, fmt.Errorf("path is not a directory: %s", path) + } + + f, err := os.Open(path) + if err != nil { + return false, false, err + } + + defer ioutil.CheckClose(f, &err) + + _, err = f.Readdirnames(1) + if err == io.EOF { + return true, false, nil + } + + if err != nil { + return false, false, err + } + + return false, false, nil +} + +func cleanUpDir(path string, all bool) error { + if all { + return os.RemoveAll(path) + } + + f, err := os.Open(path) + if err != nil { + return err + } + + defer ioutil.CheckClose(f, &err) + + names, err := f.Readdirnames(-1) + if err != nil { + return err + } + + for _, name := range names { + if err := os.RemoveAll(filepath.Join(path, name)); err != nil { + return err + } + } + + return err +} + +// Config return the repository config. In a filesystem backed repository this +// means read the `.git/config`. +func (r *Repository) Config() (*config.Config, error) { + return r.Storer.Config() +} + +// SetConfig marshall and writes the repository config. In a filesystem backed +// repository this means write the `.git/config`. This function should be called +// with the result of `Repository.Config` and never with the output of +// `Repository.ConfigScoped`. +func (r *Repository) SetConfig(cfg *config.Config) error { + return r.Storer.SetConfig(cfg) +} + +// ConfigScoped returns the repository config, merged with requested scope and +// lower. For example if, config.GlobalScope is given the local and global config +// are returned merged in one config value. +func (r *Repository) ConfigScoped(scope config.Scope) (*config.Config, error) { + // TODO(mcuadros): v6, add this as ConfigOptions.Scoped + + var err error + system := config.NewConfig() + if scope >= config.SystemScope { + system, err = config.LoadConfig(config.SystemScope) + if err != nil { + return nil, err + } + } + + global := config.NewConfig() + if scope >= config.GlobalScope { + global, err = config.LoadConfig(config.GlobalScope) + if err != nil { + return nil, err + } + } + + local, err := r.Storer.Config() + if err != nil { + return nil, err + } + + _ = mergo.Merge(global, system) + _ = mergo.Merge(local, global) + return local, nil +} + +// Remote return a remote if exists +func (r *Repository) Remote(name string) (*Remote, error) { + cfg, err := r.Config() + if err != nil { + return nil, err + } + + c, ok := cfg.Remotes[name] + if !ok { + return nil, ErrRemoteNotFound + } + + return NewRemote(r.Storer, c), nil +} + +// Remotes returns a list with all the remotes +func (r *Repository) Remotes() ([]*Remote, error) { + cfg, err := r.Config() + if err != nil { + return nil, err + } + + remotes := make([]*Remote, len(cfg.Remotes)) + + var i int + for _, c := range cfg.Remotes { + remotes[i] = NewRemote(r.Storer, c) + i++ + } + + return remotes, nil +} + +// CreateRemote creates a new remote +func (r *Repository) CreateRemote(c *config.RemoteConfig) (*Remote, error) { + if err := c.Validate(); err != nil { + return nil, err + } + + remote := NewRemote(r.Storer, c) + + cfg, err := r.Config() + if err != nil { + return nil, err + } + + if _, ok := cfg.Remotes[c.Name]; ok { + return nil, ErrRemoteExists + } + + cfg.Remotes[c.Name] = c + return remote, r.Storer.SetConfig(cfg) +} + +// CreateRemoteAnonymous creates a new anonymous remote. c.Name must be "anonymous". +// It's used like 'git fetch git@github.com:src-d/go-git.git master:master'. +func (r *Repository) CreateRemoteAnonymous(c *config.RemoteConfig) (*Remote, error) { + if err := c.Validate(); err != nil { + return nil, err + } + + if c.Name != "anonymous" { + return nil, ErrAnonymousRemoteName + } + + remote := NewRemote(r.Storer, c) + + return remote, nil +} + +// DeleteRemote delete a remote from the repository and delete the config +func (r *Repository) DeleteRemote(name string) error { + cfg, err := r.Config() + if err != nil { + return err + } + + if _, ok := cfg.Remotes[name]; !ok { + return ErrRemoteNotFound + } + + delete(cfg.Remotes, name) + return r.Storer.SetConfig(cfg) +} + +// Branch return a Branch if exists +func (r *Repository) Branch(name string) (*config.Branch, error) { + cfg, err := r.Config() + if err != nil { + return nil, err + } + + b, ok := cfg.Branches[name] + if !ok { + return nil, ErrBranchNotFound + } + + return b, nil +} + +// CreateBranch creates a new Branch +func (r *Repository) CreateBranch(c *config.Branch) error { + if err := c.Validate(); err != nil { + return err + } + + cfg, err := r.Config() + if err != nil { + return err + } + + if _, ok := cfg.Branches[c.Name]; ok { + return ErrBranchExists + } + + cfg.Branches[c.Name] = c + return r.Storer.SetConfig(cfg) +} + +// DeleteBranch delete a Branch from the repository and delete the config +func (r *Repository) DeleteBranch(name string) error { + cfg, err := r.Config() + if err != nil { + return err + } + + if _, ok := cfg.Branches[name]; !ok { + return ErrBranchNotFound + } + + delete(cfg.Branches, name) + return r.Storer.SetConfig(cfg) +} + +// CreateTag creates a tag. If opts is included, the tag is an annotated tag, +// otherwise a lightweight tag is created. +func (r *Repository) CreateTag(name string, hash plumbing.Hash, opts *CreateTagOptions) (*plumbing.Reference, error) { + rname := plumbing.ReferenceName(path.Join("refs", "tags", name)) + + _, err := r.Storer.Reference(rname) + switch err { + case nil: + // Tag exists, this is an error + return nil, ErrTagExists + case plumbing.ErrReferenceNotFound: + // Tag missing, available for creation, pass this + default: + // Some other error + return nil, err + } + + var target plumbing.Hash + if opts != nil { + target, err = r.createTagObject(name, hash, opts) + if err != nil { + return nil, err + } + } else { + target = hash + } + + ref := plumbing.NewHashReference(rname, target) + if err = r.Storer.SetReference(ref); err != nil { + return nil, err + } + + return ref, nil +} + +func (r *Repository) createTagObject(name string, hash plumbing.Hash, opts *CreateTagOptions) (plumbing.Hash, error) { + if err := opts.Validate(r, hash); err != nil { + return plumbing.ZeroHash, err + } + + rawobj, err := object.GetObject(r.Storer, hash) + if err != nil { + return plumbing.ZeroHash, err + } + + tag := &object.Tag{ + Name: name, + Tagger: *opts.Tagger, + Message: opts.Message, + TargetType: rawobj.Type(), + Target: hash, + } + + if opts.SignKey != nil { + sig, err := r.buildTagSignature(tag, opts.SignKey) + if err != nil { + return plumbing.ZeroHash, err + } + + tag.PGPSignature = sig + } + + obj := r.Storer.NewEncodedObject() + if err := tag.Encode(obj); err != nil { + return plumbing.ZeroHash, err + } + + return r.Storer.SetEncodedObject(obj) +} + +func (r *Repository) buildTagSignature(tag *object.Tag, signKey *openpgp.Entity) (string, error) { + encoded := &plumbing.MemoryObject{} + if err := tag.Encode(encoded); err != nil { + return "", err + } + + rdr, err := encoded.Reader() + if err != nil { + return "", err + } + + var b bytes.Buffer + if err := openpgp.ArmoredDetachSign(&b, signKey, rdr, nil); err != nil { + return "", err + } + + return b.String(), nil +} + +// Tag returns a tag from the repository. +// +// If you want to check to see if the tag is an annotated tag, you can call +// TagObject on the hash of the reference in ForEach: +// +// ref, err := r.Tag("v0.1.0") +// if err != nil { +// // Handle error +// } +// +// obj, err := r.TagObject(ref.Hash()) +// switch err { +// case nil: +// // Tag object present +// case plumbing.ErrObjectNotFound: +// // Not a tag object +// default: +// // Some other error +// } +// +func (r *Repository) Tag(name string) (*plumbing.Reference, error) { + ref, err := r.Reference(plumbing.ReferenceName(path.Join("refs", "tags", name)), false) + if err != nil { + if err == plumbing.ErrReferenceNotFound { + // Return a friendly error for this one, versus just ReferenceNotFound. + return nil, ErrTagNotFound + } + + return nil, err + } + + return ref, nil +} + +// DeleteTag deletes a tag from the repository. +func (r *Repository) DeleteTag(name string) error { + _, err := r.Tag(name) + if err != nil { + return err + } + + return r.Storer.RemoveReference(plumbing.ReferenceName(path.Join("refs", "tags", name))) +} + +func (r *Repository) resolveToCommitHash(h plumbing.Hash) (plumbing.Hash, error) { + obj, err := r.Storer.EncodedObject(plumbing.AnyObject, h) + if err != nil { + return plumbing.ZeroHash, err + } + switch obj.Type() { + case plumbing.TagObject: + t, err := object.DecodeTag(r.Storer, obj) + if err != nil { + return plumbing.ZeroHash, err + } + return r.resolveToCommitHash(t.Target) + case plumbing.CommitObject: + return h, nil + default: + return plumbing.ZeroHash, ErrUnableToResolveCommit + } +} + +// Clone clones a remote repository +func (r *Repository) clone(ctx context.Context, o *CloneOptions) error { + if err := o.Validate(); err != nil { + return err + } + + c := &config.RemoteConfig{ + Name: o.RemoteName, + URLs: []string{o.URL}, + Fetch: r.cloneRefSpec(o), + } + + if _, err := r.CreateRemote(c); err != nil { + return err + } + + ref, err := r.fetchAndUpdateReferences(ctx, &FetchOptions{ + RefSpecs: c.Fetch, + Depth: o.Depth, + Auth: o.Auth, + Progress: o.Progress, + Tags: o.Tags, + RemoteName: o.RemoteName, + }, o.ReferenceName) + if err != nil { + return err + } + + if r.wt != nil && !o.NoCheckout { + w, err := r.Worktree() + if err != nil { + return err + } + + head, err := r.Head() + if err != nil { + return err + } + + if err := w.Reset(&ResetOptions{ + Mode: MergeReset, + Commit: head.Hash(), + }); err != nil { + return err + } + + if o.RecurseSubmodules != NoRecurseSubmodules { + if err := w.updateSubmodules(&SubmoduleUpdateOptions{ + RecurseSubmodules: o.RecurseSubmodules, + Auth: o.Auth, + }); err != nil { + return err + } + } + } + + if err := r.updateRemoteConfigIfNeeded(o, c, ref); err != nil { + return err + } + + if ref.Name().IsBranch() { + branchRef := ref.Name() + branchName := strings.Split(string(branchRef), "refs/heads/")[1] + + b := &config.Branch{ + Name: branchName, + Merge: branchRef, + } + if o.RemoteName == "" { + b.Remote = "origin" + } else { + b.Remote = o.RemoteName + } + if err := r.CreateBranch(b); err != nil { + return err + } + } + + return nil +} + +const ( + refspecTag = "+refs/tags/%s:refs/tags/%[1]s" + refspecSingleBranch = "+refs/heads/%s:refs/remotes/%s/%[1]s" + refspecSingleBranchHEAD = "+HEAD:refs/remotes/%s/HEAD" +) + +func (r *Repository) cloneRefSpec(o *CloneOptions) []config.RefSpec { + switch { + case o.ReferenceName.IsTag(): + return []config.RefSpec{ + config.RefSpec(fmt.Sprintf(refspecTag, o.ReferenceName.Short())), + } + case o.SingleBranch && o.ReferenceName == plumbing.HEAD: + return []config.RefSpec{ + config.RefSpec(fmt.Sprintf(refspecSingleBranchHEAD, o.RemoteName)), + config.RefSpec(fmt.Sprintf(refspecSingleBranch, plumbing.Master.Short(), o.RemoteName)), + } + case o.SingleBranch: + return []config.RefSpec{ + config.RefSpec(fmt.Sprintf(refspecSingleBranch, o.ReferenceName.Short(), o.RemoteName)), + } + default: + return []config.RefSpec{ + config.RefSpec(fmt.Sprintf(config.DefaultFetchRefSpec, o.RemoteName)), + } + } +} + +func (r *Repository) setIsBare(isBare bool) error { + cfg, err := r.Config() + if err != nil { + return err + } + + cfg.Core.IsBare = isBare + return r.Storer.SetConfig(cfg) +} + +func (r *Repository) updateRemoteConfigIfNeeded(o *CloneOptions, c *config.RemoteConfig, head *plumbing.Reference) error { + if !o.SingleBranch { + return nil + } + + c.Fetch = r.cloneRefSpec(o) + + cfg, err := r.Config() + if err != nil { + return err + } + + cfg.Remotes[c.Name] = c + return r.Storer.SetConfig(cfg) +} + +func (r *Repository) fetchAndUpdateReferences( + ctx context.Context, o *FetchOptions, ref plumbing.ReferenceName, +) (*plumbing.Reference, error) { + + if err := o.Validate(); err != nil { + return nil, err + } + + remote, err := r.Remote(o.RemoteName) + if err != nil { + return nil, err + } + + objsUpdated := true + remoteRefs, err := remote.fetch(ctx, o) + if err == NoErrAlreadyUpToDate { + objsUpdated = false + } else if err == packfile.ErrEmptyPackfile { + return nil, ErrFetching + } else if err != nil { + return nil, err + } + + resolvedRef, err := storer.ResolveReference(remoteRefs, ref) + if err != nil { + return nil, err + } + + refsUpdated, err := r.updateReferences(remote.c.Fetch, resolvedRef) + if err != nil { + return nil, err + } + + if !objsUpdated && !refsUpdated { + return nil, NoErrAlreadyUpToDate + } + + return resolvedRef, nil +} + +func (r *Repository) updateReferences(spec []config.RefSpec, + resolvedRef *plumbing.Reference) (updated bool, err error) { + + if !resolvedRef.Name().IsBranch() { + // Detached HEAD mode + h, err := r.resolveToCommitHash(resolvedRef.Hash()) + if err != nil { + return false, err + } + head := plumbing.NewHashReference(plumbing.HEAD, h) + return updateReferenceStorerIfNeeded(r.Storer, head) + } + + refs := []*plumbing.Reference{ + // Create local reference for the resolved ref + resolvedRef, + // Create local symbolic HEAD + plumbing.NewSymbolicReference(plumbing.HEAD, resolvedRef.Name()), + } + + refs = append(refs, r.calculateRemoteHeadReference(spec, resolvedRef)...) + + for _, ref := range refs { + u, err := updateReferenceStorerIfNeeded(r.Storer, ref) + if err != nil { + return updated, err + } + + if u { + updated = true + } + } + + return +} + +func (r *Repository) calculateRemoteHeadReference(spec []config.RefSpec, + resolvedHead *plumbing.Reference) []*plumbing.Reference { + + var refs []*plumbing.Reference + + // Create resolved HEAD reference with remote prefix if it does not + // exist. This is needed when using single branch and HEAD. + for _, rs := range spec { + name := resolvedHead.Name() + if !rs.Match(name) { + continue + } + + name = rs.Dst(name) + _, err := r.Storer.Reference(name) + if err == plumbing.ErrReferenceNotFound { + refs = append(refs, plumbing.NewHashReference(name, resolvedHead.Hash())) + } + } + + return refs +} + +func checkAndUpdateReferenceStorerIfNeeded( + s storer.ReferenceStorer, r, old *plumbing.Reference) ( + updated bool, err error) { + p, err := s.Reference(r.Name()) + if err != nil && err != plumbing.ErrReferenceNotFound { + return false, err + } + + // we use the string method to compare references, is the easiest way + if err == plumbing.ErrReferenceNotFound || r.String() != p.String() { + if err := s.CheckAndSetReference(r, old); err != nil { + return false, err + } + + return true, nil + } + + return false, nil +} + +func updateReferenceStorerIfNeeded( + s storer.ReferenceStorer, r *plumbing.Reference) (updated bool, err error) { + return checkAndUpdateReferenceStorerIfNeeded(s, r, nil) +} + +// Fetch fetches references along with the objects necessary to complete +// their histories, from the remote named as FetchOptions.RemoteName. +// +// Returns nil if the operation is successful, NoErrAlreadyUpToDate if there are +// no changes to be fetched, or an error. +func (r *Repository) Fetch(o *FetchOptions) error { + return r.FetchContext(context.Background(), o) +} + +// FetchContext fetches references along with the objects necessary to complete +// their histories, from the remote named as FetchOptions.RemoteName. +// +// Returns nil if the operation is successful, NoErrAlreadyUpToDate if there are +// no changes to be fetched, or an error. +// +// The provided Context must be non-nil. If the context expires before the +// operation is complete, an error is returned. The context only affects to the +// transport operations. +func (r *Repository) FetchContext(ctx context.Context, o *FetchOptions) error { + if err := o.Validate(); err != nil { + return err + } + + remote, err := r.Remote(o.RemoteName) + if err != nil { + return err + } + + return remote.FetchContext(ctx, o) +} + +// Push performs a push to the remote. Returns NoErrAlreadyUpToDate if +// the remote was already up-to-date, from the remote named as +// FetchOptions.RemoteName. +func (r *Repository) Push(o *PushOptions) error { + return r.PushContext(context.Background(), o) +} + +// PushContext performs a push to the remote. Returns NoErrAlreadyUpToDate if +// the remote was already up-to-date, from the remote named as +// FetchOptions.RemoteName. +// +// The provided Context must be non-nil. If the context expires before the +// operation is complete, an error is returned. The context only affects to the +// transport operations. +func (r *Repository) PushContext(ctx context.Context, o *PushOptions) error { + if err := o.Validate(); err != nil { + return err + } + + remote, err := r.Remote(o.RemoteName) + if err != nil { + return err + } + + return remote.PushContext(ctx, o) +} + +// Log returns the commit history from the given LogOptions. +func (r *Repository) Log(o *LogOptions) (object.CommitIter, error) { + fn := commitIterFunc(o.Order) + if fn == nil { + return nil, fmt.Errorf("invalid Order=%v", o.Order) + } + + var ( + it object.CommitIter + err error + ) + if o.All { + it, err = r.logAll(fn) + } else { + it, err = r.log(o.From, fn) + } + + if err != nil { + return nil, err + } + + if o.FileName != nil { + // for `git log --all` also check parent (if the next commit comes from the real parent) + it = r.logWithFile(*o.FileName, it, o.All) + } + if o.PathFilter != nil { + it = r.logWithPathFilter(o.PathFilter, it, o.All) + } + + if o.Since != nil || o.Until != nil { + limitOptions := object.LogLimitOptions{Since: o.Since, Until: o.Until} + it = r.logWithLimit(it, limitOptions) + } + + return it, nil +} + +func (r *Repository) log(from plumbing.Hash, commitIterFunc func(*object.Commit) object.CommitIter) (object.CommitIter, error) { + h := from + if from == plumbing.ZeroHash { + head, err := r.Head() + if err != nil { + return nil, err + } + + h = head.Hash() + } + + commit, err := r.CommitObject(h) + if err != nil { + return nil, err + } + return commitIterFunc(commit), nil +} + +func (r *Repository) logAll(commitIterFunc func(*object.Commit) object.CommitIter) (object.CommitIter, error) { + return object.NewCommitAllIter(r.Storer, commitIterFunc) +} + +func (*Repository) logWithFile(fileName string, commitIter object.CommitIter, checkParent bool) object.CommitIter { + return object.NewCommitPathIterFromIter( + func(path string) bool { + return path == fileName + }, + commitIter, + checkParent, + ) +} + +func (*Repository) logWithPathFilter(pathFilter func(string) bool, commitIter object.CommitIter, checkParent bool) object.CommitIter { + return object.NewCommitPathIterFromIter( + pathFilter, + commitIter, + checkParent, + ) +} + +func (*Repository) logWithLimit(commitIter object.CommitIter, limitOptions object.LogLimitOptions) object.CommitIter { + return object.NewCommitLimitIterFromIter(commitIter, limitOptions) +} + +func commitIterFunc(order LogOrder) func(c *object.Commit) object.CommitIter { + switch order { + case LogOrderDefault: + return func(c *object.Commit) object.CommitIter { + return object.NewCommitPreorderIter(c, nil, nil) + } + case LogOrderDFS: + return func(c *object.Commit) object.CommitIter { + return object.NewCommitPreorderIter(c, nil, nil) + } + case LogOrderDFSPost: + return func(c *object.Commit) object.CommitIter { + return object.NewCommitPostorderIter(c, nil) + } + case LogOrderBSF: + return func(c *object.Commit) object.CommitIter { + return object.NewCommitIterBSF(c, nil, nil) + } + case LogOrderCommitterTime: + return func(c *object.Commit) object.CommitIter { + return object.NewCommitIterCTime(c, nil, nil) + } + } + return nil +} + +// Tags returns all the tag References in a repository. +// +// If you want to check to see if the tag is an annotated tag, you can call +// TagObject on the hash Reference passed in through ForEach: +// +// iter, err := r.Tags() +// if err != nil { +// // Handle error +// } +// +// if err := iter.ForEach(func (ref *plumbing.Reference) error { +// obj, err := r.TagObject(ref.Hash()) +// switch err { +// case nil: +// // Tag object present +// case plumbing.ErrObjectNotFound: +// // Not a tag object +// default: +// // Some other error +// return err +// } +// }); err != nil { +// // Handle outer iterator error +// } +// +func (r *Repository) Tags() (storer.ReferenceIter, error) { + refIter, err := r.Storer.IterReferences() + if err != nil { + return nil, err + } + + return storer.NewReferenceFilteredIter( + func(r *plumbing.Reference) bool { + return r.Name().IsTag() + }, refIter), nil +} + +// Branches returns all the References that are Branches. +func (r *Repository) Branches() (storer.ReferenceIter, error) { + refIter, err := r.Storer.IterReferences() + if err != nil { + return nil, err + } + + return storer.NewReferenceFilteredIter( + func(r *plumbing.Reference) bool { + return r.Name().IsBranch() + }, refIter), nil +} + +// Notes returns all the References that are notes. For more information: +// https://git-scm.com/docs/git-notes +func (r *Repository) Notes() (storer.ReferenceIter, error) { + refIter, err := r.Storer.IterReferences() + if err != nil { + return nil, err + } + + return storer.NewReferenceFilteredIter( + func(r *plumbing.Reference) bool { + return r.Name().IsNote() + }, refIter), nil +} + +// TreeObject return a Tree with the given hash. If not found +// plumbing.ErrObjectNotFound is returned +func (r *Repository) TreeObject(h plumbing.Hash) (*object.Tree, error) { + return object.GetTree(r.Storer, h) +} + +// TreeObjects returns an unsorted TreeIter with all the trees in the repository +func (r *Repository) TreeObjects() (*object.TreeIter, error) { + iter, err := r.Storer.IterEncodedObjects(plumbing.TreeObject) + if err != nil { + return nil, err + } + + return object.NewTreeIter(r.Storer, iter), nil +} + +// CommitObject return a Commit with the given hash. If not found +// plumbing.ErrObjectNotFound is returned. +func (r *Repository) CommitObject(h plumbing.Hash) (*object.Commit, error) { + return object.GetCommit(r.Storer, h) +} + +// CommitObjects returns an unsorted CommitIter with all the commits in the repository. +func (r *Repository) CommitObjects() (object.CommitIter, error) { + iter, err := r.Storer.IterEncodedObjects(plumbing.CommitObject) + if err != nil { + return nil, err + } + + return object.NewCommitIter(r.Storer, iter), nil +} + +// BlobObject returns a Blob with the given hash. If not found +// plumbing.ErrObjectNotFound is returned. +func (r *Repository) BlobObject(h plumbing.Hash) (*object.Blob, error) { + return object.GetBlob(r.Storer, h) +} + +// BlobObjects returns an unsorted BlobIter with all the blobs in the repository. +func (r *Repository) BlobObjects() (*object.BlobIter, error) { + iter, err := r.Storer.IterEncodedObjects(plumbing.BlobObject) + if err != nil { + return nil, err + } + + return object.NewBlobIter(r.Storer, iter), nil +} + +// TagObject returns a Tag with the given hash. If not found +// plumbing.ErrObjectNotFound is returned. This method only returns +// annotated Tags, no lightweight Tags. +func (r *Repository) TagObject(h plumbing.Hash) (*object.Tag, error) { + return object.GetTag(r.Storer, h) +} + +// TagObjects returns a unsorted TagIter that can step through all of the annotated +// tags in the repository. +func (r *Repository) TagObjects() (*object.TagIter, error) { + iter, err := r.Storer.IterEncodedObjects(plumbing.TagObject) + if err != nil { + return nil, err + } + + return object.NewTagIter(r.Storer, iter), nil +} + +// Object returns an Object with the given hash. If not found +// plumbing.ErrObjectNotFound is returned. +func (r *Repository) Object(t plumbing.ObjectType, h plumbing.Hash) (object.Object, error) { + obj, err := r.Storer.EncodedObject(t, h) + if err != nil { + return nil, err + } + + return object.DecodeObject(r.Storer, obj) +} + +// Objects returns an unsorted ObjectIter with all the objects in the repository. +func (r *Repository) Objects() (*object.ObjectIter, error) { + iter, err := r.Storer.IterEncodedObjects(plumbing.AnyObject) + if err != nil { + return nil, err + } + + return object.NewObjectIter(r.Storer, iter), nil +} + +// Head returns the reference where HEAD is pointing to. +func (r *Repository) Head() (*plumbing.Reference, error) { + return storer.ResolveReference(r.Storer, plumbing.HEAD) +} + +// Reference returns the reference for a given reference name. If resolved is +// true, any symbolic reference will be resolved. +func (r *Repository) Reference(name plumbing.ReferenceName, resolved bool) ( + *plumbing.Reference, error) { + + if resolved { + return storer.ResolveReference(r.Storer, name) + } + + return r.Storer.Reference(name) +} + +// References returns an unsorted ReferenceIter for all references. +func (r *Repository) References() (storer.ReferenceIter, error) { + return r.Storer.IterReferences() +} + +// Worktree returns a worktree based on the given fs, if nil the default +// worktree will be used. +func (r *Repository) Worktree() (*Worktree, error) { + if r.wt == nil { + return nil, ErrIsBareRepository + } + + return &Worktree{r: r, Filesystem: r.wt}, nil +} + +// ResolveRevision resolves revision to corresponding hash. It will always +// resolve to a commit hash, not a tree or annotated tag. +// +// Implemented resolvers : HEAD, branch, tag, heads/branch, refs/heads/branch, +// refs/tags/tag, refs/remotes/origin/branch, refs/remotes/origin/HEAD, tilde and caret (HEAD~1, master~^, tag~2, ref/heads/master~1, ...), selection by text (HEAD^{/fix nasty bug}) +func (r *Repository) ResolveRevision(rev plumbing.Revision) (*plumbing.Hash, error) { + p := revision.NewParserFromString(string(rev)) + + items, err := p.Parse() + + if err != nil { + return nil, err + } + + var commit *object.Commit + + for _, item := range items { + switch item.(type) { + case revision.Ref: + revisionRef := item.(revision.Ref) + + var tryHashes []plumbing.Hash + + maybeHash := plumbing.NewHash(string(revisionRef)) + + if !maybeHash.IsZero() { + tryHashes = append(tryHashes, maybeHash) + } + + for _, rule := range append([]string{"%s"}, plumbing.RefRevParseRules...) { + ref, err := storer.ResolveReference(r.Storer, plumbing.ReferenceName(fmt.Sprintf(rule, revisionRef))) + + if err == nil { + tryHashes = append(tryHashes, ref.Hash()) + break + } + } + + // in ambiguous cases, `git rev-parse` will emit a warning, but + // will always return the oid in preference to a ref; we don't have + // the ability to emit a warning here, so (for speed purposes) + // don't bother to detect the ambiguity either, just return in the + // priority that git would. + gotOne := false + for _, hash := range tryHashes { + commitObj, err := r.CommitObject(hash) + if err == nil { + commit = commitObj + gotOne = true + break + } + + tagObj, err := r.TagObject(hash) + if err == nil { + // If the tag target lookup fails here, this most likely + // represents some sort of repo corruption, so let the + // error bubble up. + tagCommit, err := tagObj.Commit() + if err != nil { + return &plumbing.ZeroHash, err + } + commit = tagCommit + gotOne = true + break + } + } + + if !gotOne { + return &plumbing.ZeroHash, plumbing.ErrReferenceNotFound + } + + case revision.CaretPath: + depth := item.(revision.CaretPath).Depth + + if depth == 0 { + break + } + + iter := commit.Parents() + + c, err := iter.Next() + + if err != nil { + return &plumbing.ZeroHash, err + } + + if depth == 1 { + commit = c + + break + } + + c, err = iter.Next() + + if err != nil { + return &plumbing.ZeroHash, err + } + + commit = c + case revision.TildePath: + for i := 0; i < item.(revision.TildePath).Depth; i++ { + c, err := commit.Parents().Next() + + if err != nil { + return &plumbing.ZeroHash, err + } + + commit = c + } + case revision.CaretReg: + history := object.NewCommitPreorderIter(commit, nil, nil) + + re := item.(revision.CaretReg).Regexp + negate := item.(revision.CaretReg).Negate + + var c *object.Commit + + err := history.ForEach(func(hc *object.Commit) error { + if !negate && re.MatchString(hc.Message) { + c = hc + return storer.ErrStop + } + + if negate && !re.MatchString(hc.Message) { + c = hc + return storer.ErrStop + } + + return nil + }) + if err != nil { + return &plumbing.ZeroHash, err + } + + if c == nil { + return &plumbing.ZeroHash, fmt.Errorf(`No commit message match regexp : "%s"`, re.String()) + } + + commit = c + } + } + + return &commit.Hash, nil +} + +type RepackConfig struct { + // UseRefDeltas configures whether packfile encoder will use reference deltas. + // By default OFSDeltaObject is used. + UseRefDeltas bool + // OnlyDeletePacksOlderThan if set to non-zero value + // selects only objects older than the time provided. + OnlyDeletePacksOlderThan time.Time +} + +func (r *Repository) RepackObjects(cfg *RepackConfig) (err error) { + pos, ok := r.Storer.(storer.PackedObjectStorer) + if !ok { + return ErrPackedObjectsNotSupported + } + + // Get the existing object packs. + hs, err := pos.ObjectPacks() + if err != nil { + return err + } + + // Create a new pack. + nh, err := r.createNewObjectPack(cfg) + if err != nil { + return err + } + + // Delete old packs. + for _, h := range hs { + // Skip if new hash is the same as an old one. + if h == nh { + continue + } + err = pos.DeleteOldObjectPackAndIndex(h, cfg.OnlyDeletePacksOlderThan) + if err != nil { + return err + } + } + + return nil +} + +// createNewObjectPack is a helper for RepackObjects taking care +// of creating a new pack. It is used so the the PackfileWriter +// deferred close has the right scope. +func (r *Repository) createNewObjectPack(cfg *RepackConfig) (h plumbing.Hash, err error) { + ow := newObjectWalker(r.Storer) + err = ow.walkAllRefs() + if err != nil { + return h, err + } + objs := make([]plumbing.Hash, 0, len(ow.seen)) + for h := range ow.seen { + objs = append(objs, h) + } + pfw, ok := r.Storer.(storer.PackfileWriter) + if !ok { + return h, fmt.Errorf("Repository storer is not a storer.PackfileWriter") + } + wc, err := pfw.PackfileWriter() + if err != nil { + return h, err + } + defer ioutil.CheckClose(wc, &err) + scfg, err := r.Config() + if err != nil { + return h, err + } + enc := packfile.NewEncoder(wc, r.Storer, cfg.UseRefDeltas) + h, err = enc.Encode(objs, scfg.Pack.Window) + if err != nil { + return h, err + } + + // Delete the packed, loose objects. + if los, ok := r.Storer.(storer.LooseObjectStorer); ok { + err = los.ForEachObjectHash(func(hash plumbing.Hash) error { + if ow.isSeen(hash) { + err = los.DeleteLooseObject(hash) + if err != nil { + return err + } + } + return nil + }) + if err != nil { + return h, err + } + } + + return h, err +} diff --git a/vendor/github.com/go-git/go-git/v5/status.go b/vendor/github.com/go-git/go-git/v5/status.go new file mode 100644 index 000000000..7f18e0227 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/status.go @@ -0,0 +1,79 @@ +package git + +import ( + "bytes" + "fmt" + "path/filepath" +) + +// Status represents the current status of a Worktree. +// The key of the map is the path of the file. +type Status map[string]*FileStatus + +// File returns the FileStatus for a given path, if the FileStatus doesn't +// exists a new FileStatus is added to the map using the path as key. +func (s Status) File(path string) *FileStatus { + if _, ok := (s)[path]; !ok { + s[path] = &FileStatus{Worktree: Untracked, Staging: Untracked} + } + + return s[path] +} + +// IsUntracked checks if file for given path is 'Untracked' +func (s Status) IsUntracked(path string) bool { + stat, ok := (s)[filepath.ToSlash(path)] + return ok && stat.Worktree == Untracked +} + +// IsClean returns true if all the files are in Unmodified status. +func (s Status) IsClean() bool { + for _, status := range s { + if status.Worktree != Unmodified || status.Staging != Unmodified { + return false + } + } + + return true +} + +func (s Status) String() string { + buf := bytes.NewBuffer(nil) + for path, status := range s { + if status.Staging == Unmodified && status.Worktree == Unmodified { + continue + } + + if status.Staging == Renamed { + path = fmt.Sprintf("%s -> %s", path, status.Extra) + } + + fmt.Fprintf(buf, "%c%c %s\n", status.Staging, status.Worktree, path) + } + + return buf.String() +} + +// FileStatus contains the status of a file in the worktree +type FileStatus struct { + // Staging is the status of a file in the staging area + Staging StatusCode + // Worktree is the status of a file in the worktree + Worktree StatusCode + // Extra contains extra information, such as the previous name in a rename + Extra string +} + +// StatusCode status code of a file in the Worktree +type StatusCode byte + +const ( + Unmodified StatusCode = ' ' + Untracked StatusCode = '?' + Modified StatusCode = 'M' + Added StatusCode = 'A' + Deleted StatusCode = 'D' + Renamed StatusCode = 'R' + Copied StatusCode = 'C' + UpdatedButUnmerged StatusCode = 'U' +) diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/config.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/config.go new file mode 100644 index 000000000..78a646465 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/config.go @@ -0,0 +1,48 @@ +package filesystem + +import ( + "os" + + "github.com/go-git/go-git/v5/config" + "github.com/go-git/go-git/v5/storage/filesystem/dotgit" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +type ConfigStorage struct { + dir *dotgit.DotGit +} + +func (c *ConfigStorage) Config() (conf *config.Config, err error) { + f, err := c.dir.Config() + if err != nil { + if os.IsNotExist(err) { + return config.NewConfig(), nil + } + + return nil, err + } + + defer ioutil.CheckClose(f, &err) + return config.ReadConfig(f) +} + +func (c *ConfigStorage) SetConfig(cfg *config.Config) (err error) { + if err = cfg.Validate(); err != nil { + return err + } + + f, err := c.dir.ConfigWriter() + if err != nil { + return err + } + + defer ioutil.CheckClose(f, &err) + + b, err := cfg.Marshal() + if err != nil { + return err + } + + _, err = f.Write(b) + return err +} diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/deltaobject.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/deltaobject.go new file mode 100644 index 000000000..6ab2cdf38 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/deltaobject.go @@ -0,0 +1,37 @@ +package filesystem + +import ( + "github.com/go-git/go-git/v5/plumbing" +) + +type deltaObject struct { + plumbing.EncodedObject + base plumbing.Hash + hash plumbing.Hash + size int64 +} + +func newDeltaObject( + obj plumbing.EncodedObject, + hash plumbing.Hash, + base plumbing.Hash, + size int64) plumbing.DeltaObject { + return &deltaObject{ + EncodedObject: obj, + hash: hash, + base: base, + size: size, + } +} + +func (o *deltaObject) BaseHash() plumbing.Hash { + return o.base +} + +func (o *deltaObject) ActualSize() int64 { + return o.size +} + +func (o *deltaObject) ActualHash() plumbing.Hash { + return o.hash +} diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit.go new file mode 100644 index 000000000..83c768307 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit.go @@ -0,0 +1,1111 @@ +// https://github.com/git/git/blob/master/Documentation/gitrepository-layout.txt +package dotgit + +import ( + "bufio" + "errors" + "fmt" + "io" + stdioutil "io/ioutil" + "os" + "path/filepath" + "strings" + "time" + + "github.com/go-git/go-billy/v5/osfs" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/storage" + "github.com/go-git/go-git/v5/utils/ioutil" + + "github.com/go-git/go-billy/v5" +) + +const ( + suffix = ".git" + packedRefsPath = "packed-refs" + configPath = "config" + indexPath = "index" + shallowPath = "shallow" + modulePath = "modules" + objectsPath = "objects" + packPath = "pack" + refsPath = "refs" + + tmpPackedRefsPrefix = "._packed-refs" + + packPrefix = "pack-" + packExt = ".pack" + idxExt = ".idx" +) + +var ( + // ErrNotFound is returned by New when the path is not found. + ErrNotFound = errors.New("path not found") + // ErrIdxNotFound is returned by Idxfile when the idx file is not found + ErrIdxNotFound = errors.New("idx file not found") + // ErrPackfileNotFound is returned by Packfile when the packfile is not found + ErrPackfileNotFound = errors.New("packfile not found") + // ErrConfigNotFound is returned by Config when the config is not found + ErrConfigNotFound = errors.New("config file not found") + // ErrPackedRefsDuplicatedRef is returned when a duplicated reference is + // found in the packed-ref file. This is usually the case for corrupted git + // repositories. + ErrPackedRefsDuplicatedRef = errors.New("duplicated ref found in packed-ref file") + // ErrPackedRefsBadFormat is returned when the packed-ref file corrupt. + ErrPackedRefsBadFormat = errors.New("malformed packed-ref") + // ErrSymRefTargetNotFound is returned when a symbolic reference is + // targeting a non-existing object. This usually means the repository + // is corrupt. + ErrSymRefTargetNotFound = errors.New("symbolic reference target not found") + // ErrIsDir is returned when a reference file is attempting to be read, + // but the path specified is a directory. + ErrIsDir = errors.New("reference path is a directory") +) + +// Options holds configuration for the storage. +type Options struct { + // ExclusiveAccess means that the filesystem is not modified externally + // while the repo is open. + ExclusiveAccess bool + // KeepDescriptors makes the file descriptors to be reused but they will + // need to be manually closed calling Close(). + KeepDescriptors bool +} + +// The DotGit type represents a local git repository on disk. This +// type is not zero-value-safe, use the New function to initialize it. +type DotGit struct { + options Options + fs billy.Filesystem + + // incoming object directory information + incomingChecked bool + incomingDirName string + + objectList []plumbing.Hash + objectMap map[plumbing.Hash]struct{} + packList []plumbing.Hash + packMap map[plumbing.Hash]struct{} + + files map[plumbing.Hash]billy.File +} + +// New returns a DotGit value ready to be used. The path argument must +// be the absolute path of a git repository directory (e.g. +// "/foo/bar/.git"). +func New(fs billy.Filesystem) *DotGit { + return NewWithOptions(fs, Options{}) +} + +// NewWithOptions sets non default configuration options. +// See New for complete help. +func NewWithOptions(fs billy.Filesystem, o Options) *DotGit { + return &DotGit{ + options: o, + fs: fs, + } +} + +// Initialize creates all the folder scaffolding. +func (d *DotGit) Initialize() error { + mustExists := []string{ + d.fs.Join("objects", "info"), + d.fs.Join("objects", "pack"), + d.fs.Join("refs", "heads"), + d.fs.Join("refs", "tags"), + } + + for _, path := range mustExists { + _, err := d.fs.Stat(path) + if err == nil { + continue + } + + if !os.IsNotExist(err) { + return err + } + + if err := d.fs.MkdirAll(path, os.ModeDir|os.ModePerm); err != nil { + return err + } + } + + return nil +} + +// Close closes all opened files. +func (d *DotGit) Close() error { + var firstError error + if d.files != nil { + for _, f := range d.files { + err := f.Close() + if err != nil && firstError == nil { + firstError = err + continue + } + } + + d.files = nil + } + + if firstError != nil { + return firstError + } + + return nil +} + +// ConfigWriter returns a file pointer for write to the config file +func (d *DotGit) ConfigWriter() (billy.File, error) { + return d.fs.Create(configPath) +} + +// Config returns a file pointer for read to the config file +func (d *DotGit) Config() (billy.File, error) { + return d.fs.Open(configPath) +} + +// IndexWriter returns a file pointer for write to the index file +func (d *DotGit) IndexWriter() (billy.File, error) { + return d.fs.Create(indexPath) +} + +// Index returns a file pointer for read to the index file +func (d *DotGit) Index() (billy.File, error) { + return d.fs.Open(indexPath) +} + +// ShallowWriter returns a file pointer for write to the shallow file +func (d *DotGit) ShallowWriter() (billy.File, error) { + return d.fs.Create(shallowPath) +} + +// Shallow returns a file pointer for read to the shallow file +func (d *DotGit) Shallow() (billy.File, error) { + f, err := d.fs.Open(shallowPath) + if err != nil { + if os.IsNotExist(err) { + return nil, nil + } + + return nil, err + } + + return f, nil +} + +// NewObjectPack return a writer for a new packfile, it saves the packfile to +// disk and also generates and save the index for the given packfile. +func (d *DotGit) NewObjectPack() (*PackWriter, error) { + d.cleanPackList() + return newPackWrite(d.fs) +} + +// ObjectPacks returns the list of availables packfiles +func (d *DotGit) ObjectPacks() ([]plumbing.Hash, error) { + if !d.options.ExclusiveAccess { + return d.objectPacks() + } + + err := d.genPackList() + if err != nil { + return nil, err + } + + return d.packList, nil +} + +func (d *DotGit) objectPacks() ([]plumbing.Hash, error) { + packDir := d.fs.Join(objectsPath, packPath) + files, err := d.fs.ReadDir(packDir) + if err != nil { + if os.IsNotExist(err) { + return nil, nil + } + + return nil, err + } + + var packs []plumbing.Hash + for _, f := range files { + n := f.Name() + if !strings.HasSuffix(n, packExt) || !strings.HasPrefix(n, packPrefix) { + continue + } + + h := plumbing.NewHash(n[5 : len(n)-5]) //pack-(hash).pack + if h.IsZero() { + // Ignore files with badly-formatted names. + continue + } + packs = append(packs, h) + } + + return packs, nil +} + +func (d *DotGit) objectPackPath(hash plumbing.Hash, extension string) string { + return d.fs.Join(objectsPath, packPath, fmt.Sprintf("pack-%s.%s", hash.String(), extension)) +} + +func (d *DotGit) objectPackOpen(hash plumbing.Hash, extension string) (billy.File, error) { + if d.options.KeepDescriptors && extension == "pack" { + if d.files == nil { + d.files = make(map[plumbing.Hash]billy.File) + } + + f, ok := d.files[hash] + if ok { + return f, nil + } + } + + err := d.hasPack(hash) + if err != nil { + return nil, err + } + + path := d.objectPackPath(hash, extension) + pack, err := d.fs.Open(path) + if err != nil { + if os.IsNotExist(err) { + return nil, ErrPackfileNotFound + } + + return nil, err + } + + if d.options.KeepDescriptors && extension == "pack" { + d.files[hash] = pack + } + + return pack, nil +} + +// ObjectPack returns a fs.File of the given packfile +func (d *DotGit) ObjectPack(hash plumbing.Hash) (billy.File, error) { + err := d.hasPack(hash) + if err != nil { + return nil, err + } + + return d.objectPackOpen(hash, `pack`) +} + +// ObjectPackIdx returns a fs.File of the index file for a given packfile +func (d *DotGit) ObjectPackIdx(hash plumbing.Hash) (billy.File, error) { + err := d.hasPack(hash) + if err != nil { + return nil, err + } + + return d.objectPackOpen(hash, `idx`) +} + +func (d *DotGit) DeleteOldObjectPackAndIndex(hash plumbing.Hash, t time.Time) error { + d.cleanPackList() + + path := d.objectPackPath(hash, `pack`) + if !t.IsZero() { + fi, err := d.fs.Stat(path) + if err != nil { + return err + } + // too new, skip deletion. + if !fi.ModTime().Before(t) { + return nil + } + } + err := d.fs.Remove(path) + if err != nil { + return err + } + return d.fs.Remove(d.objectPackPath(hash, `idx`)) +} + +// NewObject return a writer for a new object file. +func (d *DotGit) NewObject() (*ObjectWriter, error) { + d.cleanObjectList() + + return newObjectWriter(d.fs) +} + +// Objects returns a slice with the hashes of objects found under the +// .git/objects/ directory. +func (d *DotGit) Objects() ([]plumbing.Hash, error) { + if d.options.ExclusiveAccess { + err := d.genObjectList() + if err != nil { + return nil, err + } + + return d.objectList, nil + } + + var objects []plumbing.Hash + err := d.ForEachObjectHash(func(hash plumbing.Hash) error { + objects = append(objects, hash) + return nil + }) + if err != nil { + return nil, err + } + return objects, nil +} + +// ForEachObjectHash iterates over the hashes of objects found under the +// .git/objects/ directory and executes the provided function. +func (d *DotGit) ForEachObjectHash(fun func(plumbing.Hash) error) error { + if !d.options.ExclusiveAccess { + return d.forEachObjectHash(fun) + } + + err := d.genObjectList() + if err != nil { + return err + } + + for _, h := range d.objectList { + err := fun(h) + if err != nil { + return err + } + } + + return nil +} + +func (d *DotGit) forEachObjectHash(fun func(plumbing.Hash) error) error { + files, err := d.fs.ReadDir(objectsPath) + if err != nil { + if os.IsNotExist(err) { + return nil + } + + return err + } + + for _, f := range files { + if f.IsDir() && len(f.Name()) == 2 && isHex(f.Name()) { + base := f.Name() + d, err := d.fs.ReadDir(d.fs.Join(objectsPath, base)) + if err != nil { + return err + } + + for _, o := range d { + h := plumbing.NewHash(base + o.Name()) + if h.IsZero() { + // Ignore files with badly-formatted names. + continue + } + err = fun(h) + if err != nil { + return err + } + } + } + } + + return nil +} + +func (d *DotGit) cleanObjectList() { + d.objectMap = nil + d.objectList = nil +} + +func (d *DotGit) genObjectList() error { + if d.objectMap != nil { + return nil + } + + d.objectMap = make(map[plumbing.Hash]struct{}) + return d.forEachObjectHash(func(h plumbing.Hash) error { + d.objectList = append(d.objectList, h) + d.objectMap[h] = struct{}{} + + return nil + }) +} + +func (d *DotGit) hasObject(h plumbing.Hash) error { + if !d.options.ExclusiveAccess { + return nil + } + + err := d.genObjectList() + if err != nil { + return err + } + + _, ok := d.objectMap[h] + if !ok { + return plumbing.ErrObjectNotFound + } + + return nil +} + +func (d *DotGit) cleanPackList() { + d.packMap = nil + d.packList = nil +} + +func (d *DotGit) genPackList() error { + if d.packMap != nil { + return nil + } + + op, err := d.objectPacks() + if err != nil { + return err + } + + d.packMap = make(map[plumbing.Hash]struct{}) + d.packList = nil + + for _, h := range op { + d.packList = append(d.packList, h) + d.packMap[h] = struct{}{} + } + + return nil +} + +func (d *DotGit) hasPack(h plumbing.Hash) error { + if !d.options.ExclusiveAccess { + return nil + } + + err := d.genPackList() + if err != nil { + return err + } + + _, ok := d.packMap[h] + if !ok { + return ErrPackfileNotFound + } + + return nil +} + +func (d *DotGit) objectPath(h plumbing.Hash) string { + hash := h.String() + return d.fs.Join(objectsPath, hash[0:2], hash[2:40]) +} + +// incomingObjectPath is intended to add support for a git pre-receive hook +// to be written it adds support for go-git to find objects in an "incoming" +// directory, so that the library can be used to write a pre-receive hook +// that deals with the incoming objects. +// +// More on git hooks found here : https://git-scm.com/docs/githooks +// More on 'quarantine'/incoming directory here: +// https://git-scm.com/docs/git-receive-pack +func (d *DotGit) incomingObjectPath(h plumbing.Hash) string { + hString := h.String() + + if d.incomingDirName == "" { + return d.fs.Join(objectsPath, hString[0:2], hString[2:40]) + } + + return d.fs.Join(objectsPath, d.incomingDirName, hString[0:2], hString[2:40]) +} + +// hasIncomingObjects searches for an incoming directory and keeps its name +// so it doesn't have to be found each time an object is accessed. +func (d *DotGit) hasIncomingObjects() bool { + if !d.incomingChecked { + directoryContents, err := d.fs.ReadDir(objectsPath) + if err == nil { + for _, file := range directoryContents { + if strings.HasPrefix(file.Name(), "incoming-") && file.IsDir() { + d.incomingDirName = file.Name() + } + } + } + + d.incomingChecked = true + } + + return d.incomingDirName != "" +} + +// Object returns a fs.File pointing the object file, if exists +func (d *DotGit) Object(h plumbing.Hash) (billy.File, error) { + err := d.hasObject(h) + if err != nil { + return nil, err + } + + obj1, err1 := d.fs.Open(d.objectPath(h)) + if os.IsNotExist(err1) && d.hasIncomingObjects() { + obj2, err2 := d.fs.Open(d.incomingObjectPath(h)) + if err2 != nil { + return obj1, err1 + } + return obj2, err2 + } + return obj1, err1 +} + +// ObjectStat returns a os.FileInfo pointing the object file, if exists +func (d *DotGit) ObjectStat(h plumbing.Hash) (os.FileInfo, error) { + err := d.hasObject(h) + if err != nil { + return nil, err + } + + obj1, err1 := d.fs.Stat(d.objectPath(h)) + if os.IsNotExist(err1) && d.hasIncomingObjects() { + obj2, err2 := d.fs.Stat(d.incomingObjectPath(h)) + if err2 != nil { + return obj1, err1 + } + return obj2, err2 + } + return obj1, err1 +} + +// ObjectDelete removes the object file, if exists +func (d *DotGit) ObjectDelete(h plumbing.Hash) error { + d.cleanObjectList() + + err1 := d.fs.Remove(d.objectPath(h)) + if os.IsNotExist(err1) && d.hasIncomingObjects() { + err2 := d.fs.Remove(d.incomingObjectPath(h)) + if err2 != nil { + return err1 + } + return err2 + } + return err1 +} + +func (d *DotGit) readReferenceFrom(rd io.Reader, name string) (ref *plumbing.Reference, err error) { + b, err := stdioutil.ReadAll(rd) + if err != nil { + return nil, err + } + + line := strings.TrimSpace(string(b)) + return plumbing.NewReferenceFromStrings(name, line), nil +} + +func (d *DotGit) checkReferenceAndTruncate(f billy.File, old *plumbing.Reference) error { + if old == nil { + return nil + } + ref, err := d.readReferenceFrom(f, old.Name().String()) + if err != nil { + return err + } + if ref.Hash() != old.Hash() { + return storage.ErrReferenceHasChanged + } + _, err = f.Seek(0, io.SeekStart) + if err != nil { + return err + } + return f.Truncate(0) +} + +func (d *DotGit) SetRef(r, old *plumbing.Reference) error { + var content string + switch r.Type() { + case plumbing.SymbolicReference: + content = fmt.Sprintf("ref: %s\n", r.Target()) + case plumbing.HashReference: + content = fmt.Sprintln(r.Hash().String()) + } + + fileName := r.Name().String() + + return d.setRef(fileName, content, old) +} + +// Refs scans the git directory collecting references, which it returns. +// Symbolic references are resolved and included in the output. +func (d *DotGit) Refs() ([]*plumbing.Reference, error) { + var refs []*plumbing.Reference + var seen = make(map[plumbing.ReferenceName]bool) + if err := d.addRefsFromRefDir(&refs, seen); err != nil { + return nil, err + } + + if err := d.addRefsFromPackedRefs(&refs, seen); err != nil { + return nil, err + } + + if err := d.addRefFromHEAD(&refs); err != nil { + return nil, err + } + + return refs, nil +} + +// Ref returns the reference for a given reference name. +func (d *DotGit) Ref(name plumbing.ReferenceName) (*plumbing.Reference, error) { + ref, err := d.readReferenceFile(".", name.String()) + if err == nil { + return ref, nil + } + + return d.packedRef(name) +} + +func (d *DotGit) findPackedRefsInFile(f billy.File) ([]*plumbing.Reference, error) { + s := bufio.NewScanner(f) + var refs []*plumbing.Reference + for s.Scan() { + ref, err := d.processLine(s.Text()) + if err != nil { + return nil, err + } + + if ref != nil { + refs = append(refs, ref) + } + } + + return refs, s.Err() +} + +func (d *DotGit) findPackedRefs() (r []*plumbing.Reference, err error) { + f, err := d.fs.Open(packedRefsPath) + if err != nil { + if os.IsNotExist(err) { + return nil, nil + } + return nil, err + } + + defer ioutil.CheckClose(f, &err) + return d.findPackedRefsInFile(f) +} + +func (d *DotGit) packedRef(name plumbing.ReferenceName) (*plumbing.Reference, error) { + refs, err := d.findPackedRefs() + if err != nil { + return nil, err + } + + for _, ref := range refs { + if ref.Name() == name { + return ref, nil + } + } + + return nil, plumbing.ErrReferenceNotFound +} + +// RemoveRef removes a reference by name. +func (d *DotGit) RemoveRef(name plumbing.ReferenceName) error { + path := d.fs.Join(".", name.String()) + _, err := d.fs.Stat(path) + if err == nil { + err = d.fs.Remove(path) + // Drop down to remove it from the packed refs file, too. + } + + if err != nil && !os.IsNotExist(err) { + return err + } + + return d.rewritePackedRefsWithoutRef(name) +} + +func (d *DotGit) addRefsFromPackedRefs(refs *[]*plumbing.Reference, seen map[plumbing.ReferenceName]bool) (err error) { + packedRefs, err := d.findPackedRefs() + if err != nil { + return err + } + + for _, ref := range packedRefs { + if !seen[ref.Name()] { + *refs = append(*refs, ref) + seen[ref.Name()] = true + } + } + return nil +} + +func (d *DotGit) addRefsFromPackedRefsFile(refs *[]*plumbing.Reference, f billy.File, seen map[plumbing.ReferenceName]bool) (err error) { + packedRefs, err := d.findPackedRefsInFile(f) + if err != nil { + return err + } + + for _, ref := range packedRefs { + if !seen[ref.Name()] { + *refs = append(*refs, ref) + seen[ref.Name()] = true + } + } + return nil +} + +func (d *DotGit) openAndLockPackedRefs(doCreate bool) ( + pr billy.File, err error) { + var f billy.File + defer func() { + if err != nil && f != nil { + ioutil.CheckClose(f, &err) + } + }() + + // File mode is retrieved from a constant defined in the target specific + // files (dotgit_rewrite_packed_refs_*). Some modes are not available + // in all filesystems. + openFlags := d.openAndLockPackedRefsMode() + if doCreate { + openFlags |= os.O_CREATE + } + + // Keep trying to open and lock the file until we're sure the file + // didn't change between the open and the lock. + for { + f, err = d.fs.OpenFile(packedRefsPath, openFlags, 0600) + if err != nil { + if os.IsNotExist(err) && !doCreate { + return nil, nil + } + + return nil, err + } + fi, err := d.fs.Stat(packedRefsPath) + if err != nil { + return nil, err + } + mtime := fi.ModTime() + + err = f.Lock() + if err != nil { + return nil, err + } + + fi, err = d.fs.Stat(packedRefsPath) + if err != nil { + return nil, err + } + if mtime.Equal(fi.ModTime()) { + break + } + // The file has changed since we opened it. Close and retry. + err = f.Close() + if err != nil { + return nil, err + } + } + return f, nil +} + +func (d *DotGit) rewritePackedRefsWithoutRef(name plumbing.ReferenceName) (err error) { + pr, err := d.openAndLockPackedRefs(false) + if err != nil { + return err + } + if pr == nil { + return nil + } + defer ioutil.CheckClose(pr, &err) + + // Creating the temp file in the same directory as the target file + // improves our chances for rename operation to be atomic. + tmp, err := d.fs.TempFile("", tmpPackedRefsPrefix) + if err != nil { + return err + } + tmpName := tmp.Name() + defer func() { + ioutil.CheckClose(tmp, &err) + _ = d.fs.Remove(tmpName) // don't check err, we might have renamed it + }() + + s := bufio.NewScanner(pr) + found := false + for s.Scan() { + line := s.Text() + ref, err := d.processLine(line) + if err != nil { + return err + } + + if ref != nil && ref.Name() == name { + found = true + continue + } + + if _, err := fmt.Fprintln(tmp, line); err != nil { + return err + } + } + + if err := s.Err(); err != nil { + return err + } + + if !found { + return nil + } + + return d.rewritePackedRefsWhileLocked(tmp, pr) +} + +// process lines from a packed-refs file +func (d *DotGit) processLine(line string) (*plumbing.Reference, error) { + if len(line) == 0 { + return nil, nil + } + + switch line[0] { + case '#': // comment - ignore + return nil, nil + case '^': // annotated tag commit of the previous line - ignore + return nil, nil + default: + ws := strings.Split(line, " ") // hash then ref + if len(ws) != 2 { + return nil, ErrPackedRefsBadFormat + } + + return plumbing.NewReferenceFromStrings(ws[1], ws[0]), nil + } +} + +func (d *DotGit) addRefsFromRefDir(refs *[]*plumbing.Reference, seen map[plumbing.ReferenceName]bool) error { + return d.walkReferencesTree(refs, []string{refsPath}, seen) +} + +func (d *DotGit) walkReferencesTree(refs *[]*plumbing.Reference, relPath []string, seen map[plumbing.ReferenceName]bool) error { + files, err := d.fs.ReadDir(d.fs.Join(relPath...)) + if err != nil { + if os.IsNotExist(err) { + return nil + } + + return err + } + + for _, f := range files { + newRelPath := append(append([]string(nil), relPath...), f.Name()) + if f.IsDir() { + if err = d.walkReferencesTree(refs, newRelPath, seen); err != nil { + return err + } + + continue + } + + ref, err := d.readReferenceFile(".", strings.Join(newRelPath, "/")) + if err != nil { + return err + } + + if ref != nil && !seen[ref.Name()] { + *refs = append(*refs, ref) + seen[ref.Name()] = true + } + } + + return nil +} + +func (d *DotGit) addRefFromHEAD(refs *[]*plumbing.Reference) error { + ref, err := d.readReferenceFile(".", "HEAD") + if err != nil { + if os.IsNotExist(err) { + return nil + } + + return err + } + + *refs = append(*refs, ref) + return nil +} + +func (d *DotGit) readReferenceFile(path, name string) (ref *plumbing.Reference, err error) { + path = d.fs.Join(path, d.fs.Join(strings.Split(name, "/")...)) + st, err := d.fs.Stat(path) + if err != nil { + return nil, err + } + if st.IsDir() { + return nil, ErrIsDir + } + + f, err := d.fs.Open(path) + if err != nil { + return nil, err + } + defer ioutil.CheckClose(f, &err) + + return d.readReferenceFrom(f, name) +} + +func (d *DotGit) CountLooseRefs() (int, error) { + var refs []*plumbing.Reference + var seen = make(map[plumbing.ReferenceName]bool) + if err := d.addRefsFromRefDir(&refs, seen); err != nil { + return 0, err + } + + return len(refs), nil +} + +// PackRefs packs all loose refs into the packed-refs file. +// +// This implementation only works under the assumption that the view +// of the file system won't be updated during this operation. This +// strategy would not work on a general file system though, without +// locking each loose reference and checking it again before deleting +// the file, because otherwise an updated reference could sneak in and +// then be deleted by the packed-refs process. Alternatively, every +// ref update could also lock packed-refs, so only one lock is +// required during ref-packing. But that would worsen performance in +// the common case. +// +// TODO: add an "all" boolean like the `git pack-refs --all` flag. +// When `all` is false, it would only pack refs that have already been +// packed, plus all tags. +func (d *DotGit) PackRefs() (err error) { + // Lock packed-refs, and create it if it doesn't exist yet. + f, err := d.openAndLockPackedRefs(true) + if err != nil { + return err + } + defer ioutil.CheckClose(f, &err) + + // Gather all refs using addRefsFromRefDir and addRefsFromPackedRefs. + var refs []*plumbing.Reference + seen := make(map[plumbing.ReferenceName]bool) + if err = d.addRefsFromRefDir(&refs, seen); err != nil { + return err + } + if len(refs) == 0 { + // Nothing to do! + return nil + } + numLooseRefs := len(refs) + if err = d.addRefsFromPackedRefsFile(&refs, f, seen); err != nil { + return err + } + + // Write them all to a new temp packed-refs file. + tmp, err := d.fs.TempFile("", tmpPackedRefsPrefix) + if err != nil { + return err + } + tmpName := tmp.Name() + defer func() { + ioutil.CheckClose(tmp, &err) + _ = d.fs.Remove(tmpName) // don't check err, we might have renamed it + }() + + w := bufio.NewWriter(tmp) + for _, ref := range refs { + _, err = w.WriteString(ref.String() + "\n") + if err != nil { + return err + } + } + err = w.Flush() + if err != nil { + return err + } + + // Rename the temp packed-refs file. + err = d.rewritePackedRefsWhileLocked(tmp, f) + if err != nil { + return err + } + + // Delete all the loose refs, while still holding the packed-refs + // lock. + for _, ref := range refs[:numLooseRefs] { + path := d.fs.Join(".", ref.Name().String()) + err = d.fs.Remove(path) + if err != nil && !os.IsNotExist(err) { + return err + } + } + + return nil +} + +// Module return a billy.Filesystem pointing to the module folder +func (d *DotGit) Module(name string) (billy.Filesystem, error) { + return d.fs.Chroot(d.fs.Join(modulePath, name)) +} + +// Alternates returns DotGit(s) based off paths in objects/info/alternates if +// available. This can be used to checks if it's a shared repository. +func (d *DotGit) Alternates() ([]*DotGit, error) { + altpath := d.fs.Join("objects", "info", "alternates") + f, err := d.fs.Open(altpath) + if err != nil { + return nil, err + } + defer f.Close() + + var alternates []*DotGit + + // Read alternate paths line-by-line and create DotGit objects. + scanner := bufio.NewScanner(f) + for scanner.Scan() { + path := scanner.Text() + if !filepath.IsAbs(path) { + // For relative paths, we can perform an internal conversion to + // slash so that they work cross-platform. + slashPath := filepath.ToSlash(path) + // If the path is not absolute, it must be relative to object + // database (.git/objects/info). + // https://www.kernel.org/pub/software/scm/git/docs/gitrepository-layout.html + // Hence, derive a path relative to DotGit's root. + // "../../../reponame/.git/" -> "../../reponame/.git" + // Remove the first ../ + relpath := filepath.Join(strings.Split(slashPath, "/")[1:]...) + normalPath := filepath.FromSlash(relpath) + path = filepath.Join(d.fs.Root(), normalPath) + } + fs := osfs.New(filepath.Dir(path)) + alternates = append(alternates, New(fs)) + } + + if err = scanner.Err(); err != nil { + return nil, err + } + + return alternates, nil +} + +// Fs returns the underlying filesystem of the DotGit folder. +func (d *DotGit) Fs() billy.Filesystem { + return d.fs +} + +func isHex(s string) bool { + for _, b := range []byte(s) { + if isNum(b) { + continue + } + if isHexAlpha(b) { + continue + } + + return false + } + + return true +} + +func isNum(b byte) bool { + return b >= '0' && b <= '9' +} + +func isHexAlpha(b byte) bool { + return b >= 'a' && b <= 'f' || b >= 'A' && b <= 'F' +} diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit_rewrite_packed_refs.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit_rewrite_packed_refs.go new file mode 100644 index 000000000..43263eadf --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit_rewrite_packed_refs.go @@ -0,0 +1,81 @@ +package dotgit + +import ( + "io" + "os" + "runtime" + + "github.com/go-git/go-billy/v5" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +func (d *DotGit) openAndLockPackedRefsMode() int { + if billy.CapabilityCheck(d.fs, billy.ReadAndWriteCapability) { + return os.O_RDWR + } + + return os.O_RDONLY +} + +func (d *DotGit) rewritePackedRefsWhileLocked( + tmp billy.File, pr billy.File) error { + // Try plain rename. If we aren't using the bare Windows filesystem as the + // storage layer, we might be able to get away with a rename over a locked + // file. + err := d.fs.Rename(tmp.Name(), pr.Name()) + if err == nil { + return nil + } + + // If we are in a filesystem that does not support rename (e.g. sivafs) + // a full copy is done. + if err == billy.ErrNotSupported { + return d.copyNewFile(tmp, pr) + } + + if runtime.GOOS != "windows" { + return err + } + + // Otherwise, Windows doesn't let us rename over a locked file, so + // we have to do a straight copy. Unfortunately this could result + // in a partially-written file if the process fails before the + // copy completes. + return d.copyToExistingFile(tmp, pr) +} + +func (d *DotGit) copyToExistingFile(tmp, pr billy.File) error { + _, err := pr.Seek(0, io.SeekStart) + if err != nil { + return err + } + err = pr.Truncate(0) + if err != nil { + return err + } + _, err = tmp.Seek(0, io.SeekStart) + if err != nil { + return err + } + _, err = io.Copy(pr, tmp) + + return err +} + +func (d *DotGit) copyNewFile(tmp billy.File, pr billy.File) (err error) { + prWrite, err := d.fs.Create(pr.Name()) + if err != nil { + return err + } + + defer ioutil.CheckClose(prWrite, &err) + + _, err = tmp.Seek(0, io.SeekStart) + if err != nil { + return err + } + + _, err = io.Copy(prWrite, tmp) + + return err +} diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit_setref.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit_setref.go new file mode 100644 index 000000000..c057f5c48 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit_setref.go @@ -0,0 +1,90 @@ +package dotgit + +import ( + "fmt" + "os" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/utils/ioutil" + + "github.com/go-git/go-billy/v5" +) + +func (d *DotGit) setRef(fileName, content string, old *plumbing.Reference) (err error) { + if billy.CapabilityCheck(d.fs, billy.ReadAndWriteCapability) { + return d.setRefRwfs(fileName, content, old) + } + + return d.setRefNorwfs(fileName, content, old) +} + +func (d *DotGit) setRefRwfs(fileName, content string, old *plumbing.Reference) (err error) { + // If we are not checking an old ref, just truncate the file. + mode := os.O_RDWR | os.O_CREATE + if old == nil { + mode |= os.O_TRUNC + } + + f, err := d.fs.OpenFile(fileName, mode, 0666) + if err != nil { + return err + } + + defer ioutil.CheckClose(f, &err) + + // Lock is unlocked by the deferred Close above. This is because Unlock + // does not imply a fsync and thus there would be a race between + // Unlock+Close and other concurrent writers. Adding Sync to go-billy + // could work, but this is better (and avoids superfluous syncs). + err = f.Lock() + if err != nil { + return err + } + + // this is a no-op to call even when old is nil. + err = d.checkReferenceAndTruncate(f, old) + if err != nil { + return err + } + + _, err = f.Write([]byte(content)) + return err +} + +// There are some filesystems that don't support opening files in RDWD mode. +// In these filesystems the standard SetRef function can not be used as it +// reads the reference file to check that it's not modified before updating it. +// +// This version of the function writes the reference without extra checks +// making it compatible with these simple filesystems. This is usually not +// a problem as they should be accessed by only one process at a time. +func (d *DotGit) setRefNorwfs(fileName, content string, old *plumbing.Reference) error { + _, err := d.fs.Stat(fileName) + if err == nil && old != nil { + fRead, err := d.fs.Open(fileName) + if err != nil { + return err + } + + ref, err := d.readReferenceFrom(fRead, old.Name().String()) + fRead.Close() + + if err != nil { + return err + } + + if ref.Hash() != old.Hash() { + return fmt.Errorf("reference has changed concurrently") + } + } + + f, err := d.fs.Create(fileName) + if err != nil { + return err + } + + defer f.Close() + + _, err = f.Write([]byte(content)) + return err +} diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/writers.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/writers.go new file mode 100644 index 000000000..e2ede938c --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/writers.go @@ -0,0 +1,284 @@ +package dotgit + +import ( + "fmt" + "io" + "sync/atomic" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/idxfile" + "github.com/go-git/go-git/v5/plumbing/format/objfile" + "github.com/go-git/go-git/v5/plumbing/format/packfile" + + "github.com/go-git/go-billy/v5" +) + +// PackWriter is a io.Writer that generates the packfile index simultaneously, +// a packfile.Decoder is used with a file reader to read the file being written +// this operation is synchronized with the write operations. +// The packfile is written in a temp file, when Close is called this file +// is renamed/moved (depends on the Filesystem implementation) to the final +// location, if the PackWriter is not used, nothing is written +type PackWriter struct { + Notify func(plumbing.Hash, *idxfile.Writer) + + fs billy.Filesystem + fr, fw billy.File + synced *syncedReader + checksum plumbing.Hash + parser *packfile.Parser + writer *idxfile.Writer + result chan error +} + +func newPackWrite(fs billy.Filesystem) (*PackWriter, error) { + fw, err := fs.TempFile(fs.Join(objectsPath, packPath), "tmp_pack_") + if err != nil { + return nil, err + } + + fr, err := fs.Open(fw.Name()) + if err != nil { + return nil, err + } + + writer := &PackWriter{ + fs: fs, + fw: fw, + fr: fr, + synced: newSyncedReader(fw, fr), + result: make(chan error), + } + + go writer.buildIndex() + return writer, nil +} + +func (w *PackWriter) buildIndex() { + s := packfile.NewScanner(w.synced) + w.writer = new(idxfile.Writer) + var err error + w.parser, err = packfile.NewParser(s, w.writer) + if err != nil { + w.result <- err + return + } + + checksum, err := w.parser.Parse() + if err != nil { + w.result <- err + return + } + + w.checksum = checksum + w.result <- err +} + +// waitBuildIndex waits until buildIndex function finishes, this can terminate +// with a packfile.ErrEmptyPackfile, this means that nothing was written so we +// ignore the error +func (w *PackWriter) waitBuildIndex() error { + err := <-w.result + if err == packfile.ErrEmptyPackfile { + return nil + } + + return err +} + +func (w *PackWriter) Write(p []byte) (int, error) { + return w.synced.Write(p) +} + +// Close closes all the file descriptors and save the final packfile, if nothing +// was written, the tempfiles are deleted without writing a packfile. +func (w *PackWriter) Close() error { + defer func() { + if w.Notify != nil && w.writer != nil && w.writer.Finished() { + w.Notify(w.checksum, w.writer) + } + + close(w.result) + }() + + if err := w.synced.Close(); err != nil { + return err + } + + if err := w.waitBuildIndex(); err != nil { + return err + } + + if err := w.fr.Close(); err != nil { + return err + } + + if err := w.fw.Close(); err != nil { + return err + } + + if w.writer == nil || !w.writer.Finished() { + return w.clean() + } + + return w.save() +} + +func (w *PackWriter) clean() error { + return w.fs.Remove(w.fw.Name()) +} + +func (w *PackWriter) save() error { + base := w.fs.Join(objectsPath, packPath, fmt.Sprintf("pack-%s", w.checksum)) + idx, err := w.fs.Create(fmt.Sprintf("%s.idx", base)) + if err != nil { + return err + } + + if err := w.encodeIdx(idx); err != nil { + return err + } + + if err := idx.Close(); err != nil { + return err + } + + return w.fs.Rename(w.fw.Name(), fmt.Sprintf("%s.pack", base)) +} + +func (w *PackWriter) encodeIdx(writer io.Writer) error { + idx, err := w.writer.Index() + if err != nil { + return err + } + + e := idxfile.NewEncoder(writer) + _, err = e.Encode(idx) + return err +} + +type syncedReader struct { + w io.Writer + r io.ReadSeeker + + blocked, done uint32 + written, read uint64 + news chan bool +} + +func newSyncedReader(w io.Writer, r io.ReadSeeker) *syncedReader { + return &syncedReader{ + w: w, + r: r, + news: make(chan bool), + } +} + +func (s *syncedReader) Write(p []byte) (n int, err error) { + defer func() { + written := atomic.AddUint64(&s.written, uint64(n)) + read := atomic.LoadUint64(&s.read) + if written > read { + s.wake() + } + }() + + n, err = s.w.Write(p) + return +} + +func (s *syncedReader) Read(p []byte) (n int, err error) { + defer func() { atomic.AddUint64(&s.read, uint64(n)) }() + + for { + s.sleep() + n, err = s.r.Read(p) + if err == io.EOF && !s.isDone() && n == 0 { + continue + } + + break + } + + return +} + +func (s *syncedReader) isDone() bool { + return atomic.LoadUint32(&s.done) == 1 +} + +func (s *syncedReader) isBlocked() bool { + return atomic.LoadUint32(&s.blocked) == 1 +} + +func (s *syncedReader) wake() { + if s.isBlocked() { + atomic.StoreUint32(&s.blocked, 0) + s.news <- true + } +} + +func (s *syncedReader) sleep() { + read := atomic.LoadUint64(&s.read) + written := atomic.LoadUint64(&s.written) + if read >= written { + atomic.StoreUint32(&s.blocked, 1) + <-s.news + } + +} + +func (s *syncedReader) Seek(offset int64, whence int) (int64, error) { + if whence == io.SeekCurrent { + return s.r.Seek(offset, whence) + } + + p, err := s.r.Seek(offset, whence) + atomic.StoreUint64(&s.read, uint64(p)) + + return p, err +} + +func (s *syncedReader) Close() error { + atomic.StoreUint32(&s.done, 1) + close(s.news) + return nil +} + +type ObjectWriter struct { + objfile.Writer + fs billy.Filesystem + f billy.File +} + +func newObjectWriter(fs billy.Filesystem) (*ObjectWriter, error) { + f, err := fs.TempFile(fs.Join(objectsPath, packPath), "tmp_obj_") + if err != nil { + return nil, err + } + + return &ObjectWriter{ + Writer: (*objfile.NewWriter(f)), + fs: fs, + f: f, + }, nil +} + +func (w *ObjectWriter) Close() error { + if err := w.Writer.Close(); err != nil { + return err + } + + if err := w.f.Close(); err != nil { + return err + } + + return w.save() +} + +func (w *ObjectWriter) save() error { + hash := w.Hash().String() + file := w.fs.Join(objectsPath, hash[0:2], hash[2:40]) + + return w.fs.Rename(w.f.Name(), file) +} diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/index.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/index.go new file mode 100644 index 000000000..a19176f83 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/index.go @@ -0,0 +1,54 @@ +package filesystem + +import ( + "bufio" + "os" + + "github.com/go-git/go-git/v5/plumbing/format/index" + "github.com/go-git/go-git/v5/storage/filesystem/dotgit" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +type IndexStorage struct { + dir *dotgit.DotGit +} + +func (s *IndexStorage) SetIndex(idx *index.Index) (err error) { + f, err := s.dir.IndexWriter() + if err != nil { + return err + } + + defer ioutil.CheckClose(f, &err) + bw := bufio.NewWriter(f) + defer func() { + if e := bw.Flush(); err == nil && e != nil { + err = e + } + }() + + e := index.NewEncoder(bw) + err = e.Encode(idx) + return err +} + +func (s *IndexStorage) Index() (i *index.Index, err error) { + idx := &index.Index{ + Version: 2, + } + + f, err := s.dir.Index() + if err != nil { + if os.IsNotExist(err) { + return idx, nil + } + + return nil, err + } + + defer ioutil.CheckClose(f, &err) + + d := index.NewDecoder(bufio.NewReader(f)) + err = d.Decode(idx) + return idx, err +} diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/module.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/module.go new file mode 100644 index 000000000..20336c118 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/module.go @@ -0,0 +1,20 @@ +package filesystem + +import ( + "github.com/go-git/go-git/v5/plumbing/cache" + "github.com/go-git/go-git/v5/storage" + "github.com/go-git/go-git/v5/storage/filesystem/dotgit" +) + +type ModuleStorage struct { + dir *dotgit.DotGit +} + +func (s *ModuleStorage) Module(name string) (storage.Storer, error) { + fs, err := s.dir.Module(name) + if err != nil { + return nil, err + } + + return NewStorage(fs, cache.NewObjectLRUDefault()), nil +} diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/object.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/object.go new file mode 100644 index 000000000..743717439 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/object.go @@ -0,0 +1,817 @@ +package filesystem + +import ( + "io" + "os" + "time" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/cache" + "github.com/go-git/go-git/v5/plumbing/format/idxfile" + "github.com/go-git/go-git/v5/plumbing/format/objfile" + "github.com/go-git/go-git/v5/plumbing/format/packfile" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/storage/filesystem/dotgit" + "github.com/go-git/go-git/v5/utils/ioutil" + + "github.com/go-git/go-billy/v5" +) + +type ObjectStorage struct { + options Options + + // objectCache is an object cache uses to cache delta's bases and also recently + // loaded loose objects + objectCache cache.Object + + dir *dotgit.DotGit + index map[plumbing.Hash]idxfile.Index + + packList []plumbing.Hash + packListIdx int + packfiles map[plumbing.Hash]*packfile.Packfile +} + +// NewObjectStorage creates a new ObjectStorage with the given .git directory and cache. +func NewObjectStorage(dir *dotgit.DotGit, objectCache cache.Object) *ObjectStorage { + return NewObjectStorageWithOptions(dir, objectCache, Options{}) +} + +// NewObjectStorageWithOptions creates a new ObjectStorage with the given .git directory, cache and extra options +func NewObjectStorageWithOptions(dir *dotgit.DotGit, objectCache cache.Object, ops Options) *ObjectStorage { + return &ObjectStorage{ + options: ops, + objectCache: objectCache, + dir: dir, + } +} + +func (s *ObjectStorage) requireIndex() error { + if s.index != nil { + return nil + } + + s.index = make(map[plumbing.Hash]idxfile.Index) + packs, err := s.dir.ObjectPacks() + if err != nil { + return err + } + + for _, h := range packs { + if err := s.loadIdxFile(h); err != nil { + return err + } + } + + return nil +} + +// Reindex indexes again all packfiles. Useful if git changed packfiles externally +func (s *ObjectStorage) Reindex() { + s.index = nil +} + +func (s *ObjectStorage) loadIdxFile(h plumbing.Hash) (err error) { + f, err := s.dir.ObjectPackIdx(h) + if err != nil { + return err + } + + defer ioutil.CheckClose(f, &err) + + idxf := idxfile.NewMemoryIndex() + d := idxfile.NewDecoder(f) + if err = d.Decode(idxf); err != nil { + return err + } + + s.index[h] = idxf + return err +} + +func (s *ObjectStorage) NewEncodedObject() plumbing.EncodedObject { + return &plumbing.MemoryObject{} +} + +func (s *ObjectStorage) PackfileWriter() (io.WriteCloser, error) { + if err := s.requireIndex(); err != nil { + return nil, err + } + + w, err := s.dir.NewObjectPack() + if err != nil { + return nil, err + } + + w.Notify = func(h plumbing.Hash, writer *idxfile.Writer) { + index, err := writer.Index() + if err == nil { + s.index[h] = index + } + } + + return w, nil +} + +// SetEncodedObject adds a new object to the storage. +func (s *ObjectStorage) SetEncodedObject(o plumbing.EncodedObject) (h plumbing.Hash, err error) { + if o.Type() == plumbing.OFSDeltaObject || o.Type() == plumbing.REFDeltaObject { + return plumbing.ZeroHash, plumbing.ErrInvalidType + } + + ow, err := s.dir.NewObject() + if err != nil { + return plumbing.ZeroHash, err + } + + defer ioutil.CheckClose(ow, &err) + + or, err := o.Reader() + if err != nil { + return plumbing.ZeroHash, err + } + + defer ioutil.CheckClose(or, &err) + + if err = ow.WriteHeader(o.Type(), o.Size()); err != nil { + return plumbing.ZeroHash, err + } + + if _, err = io.Copy(ow, or); err != nil { + return plumbing.ZeroHash, err + } + + return o.Hash(), err +} + +// HasEncodedObject returns nil if the object exists, without actually +// reading the object data from storage. +func (s *ObjectStorage) HasEncodedObject(h plumbing.Hash) (err error) { + // Check unpacked objects + f, err := s.dir.Object(h) + if err != nil { + if !os.IsNotExist(err) { + return err + } + // Fall through to check packed objects. + } else { + defer ioutil.CheckClose(f, &err) + return nil + } + + // Check packed objects. + if err := s.requireIndex(); err != nil { + return err + } + _, _, offset := s.findObjectInPackfile(h) + if offset == -1 { + return plumbing.ErrObjectNotFound + } + return nil +} + +func (s *ObjectStorage) encodedObjectSizeFromUnpacked(h plumbing.Hash) ( + size int64, err error) { + f, err := s.dir.Object(h) + if err != nil { + if os.IsNotExist(err) { + return 0, plumbing.ErrObjectNotFound + } + + return 0, err + } + + r, err := objfile.NewReader(f) + if err != nil { + return 0, err + } + defer ioutil.CheckClose(r, &err) + + _, size, err = r.Header() + return size, err +} + +func (s *ObjectStorage) packfile(idx idxfile.Index, pack plumbing.Hash) (*packfile.Packfile, error) { + if p := s.packfileFromCache(pack); p != nil { + return p, nil + } + + f, err := s.dir.ObjectPack(pack) + if err != nil { + return nil, err + } + + var p *packfile.Packfile + if s.objectCache != nil { + p = packfile.NewPackfileWithCache(idx, s.dir.Fs(), f, s.objectCache) + } else { + p = packfile.NewPackfile(idx, s.dir.Fs(), f) + } + + return p, s.storePackfileInCache(pack, p) +} + +func (s *ObjectStorage) packfileFromCache(hash plumbing.Hash) *packfile.Packfile { + if s.packfiles == nil { + if s.options.KeepDescriptors { + s.packfiles = make(map[plumbing.Hash]*packfile.Packfile) + } else if s.options.MaxOpenDescriptors > 0 { + s.packList = make([]plumbing.Hash, s.options.MaxOpenDescriptors) + s.packfiles = make(map[plumbing.Hash]*packfile.Packfile, s.options.MaxOpenDescriptors) + } + } + + return s.packfiles[hash] +} + +func (s *ObjectStorage) storePackfileInCache(hash plumbing.Hash, p *packfile.Packfile) error { + if s.options.KeepDescriptors { + s.packfiles[hash] = p + return nil + } + + if s.options.MaxOpenDescriptors <= 0 { + return nil + } + + // start over as the limit of packList is hit + if s.packListIdx >= len(s.packList) { + s.packListIdx = 0 + } + + // close the existing packfile if open + if next := s.packList[s.packListIdx]; !next.IsZero() { + open := s.packfiles[next] + delete(s.packfiles, next) + if open != nil { + if err := open.Close(); err != nil { + return err + } + } + } + + // cache newly open packfile + s.packList[s.packListIdx] = hash + s.packfiles[hash] = p + s.packListIdx++ + + return nil +} + +func (s *ObjectStorage) encodedObjectSizeFromPackfile(h plumbing.Hash) ( + size int64, err error) { + if err := s.requireIndex(); err != nil { + return 0, err + } + + pack, _, offset := s.findObjectInPackfile(h) + if offset == -1 { + return 0, plumbing.ErrObjectNotFound + } + + idx := s.index[pack] + hash, err := idx.FindHash(offset) + if err == nil { + obj, ok := s.objectCache.Get(hash) + if ok { + return obj.Size(), nil + } + } else if err != nil && err != plumbing.ErrObjectNotFound { + return 0, err + } + + p, err := s.packfile(idx, pack) + if err != nil { + return 0, err + } + + if !s.options.KeepDescriptors && s.options.MaxOpenDescriptors == 0 { + defer ioutil.CheckClose(p, &err) + } + + return p.GetSizeByOffset(offset) +} + +// EncodedObjectSize returns the plaintext size of the given object, +// without actually reading the full object data from storage. +func (s *ObjectStorage) EncodedObjectSize(h plumbing.Hash) ( + size int64, err error) { + size, err = s.encodedObjectSizeFromUnpacked(h) + if err != nil && err != plumbing.ErrObjectNotFound { + return 0, err + } else if err == nil { + return size, nil + } + + return s.encodedObjectSizeFromPackfile(h) +} + +// EncodedObject returns the object with the given hash, by searching for it in +// the packfile and the git object directories. +func (s *ObjectStorage) EncodedObject(t plumbing.ObjectType, h plumbing.Hash) (plumbing.EncodedObject, error) { + var obj plumbing.EncodedObject + var err error + + if s.index != nil { + obj, err = s.getFromPackfile(h, false) + if err == plumbing.ErrObjectNotFound { + obj, err = s.getFromUnpacked(h) + } + } else { + obj, err = s.getFromUnpacked(h) + if err == plumbing.ErrObjectNotFound { + obj, err = s.getFromPackfile(h, false) + } + } + + // If the error is still object not found, check if it's a shared object + // repository. + if err == plumbing.ErrObjectNotFound { + dotgits, e := s.dir.Alternates() + if e == nil { + // Create a new object storage with the DotGit(s) and check for the + // required hash object. Skip when not found. + for _, dg := range dotgits { + o := NewObjectStorage(dg, s.objectCache) + enobj, enerr := o.EncodedObject(t, h) + if enerr != nil { + continue + } + return enobj, nil + } + } + } + + if err != nil { + return nil, err + } + + if plumbing.AnyObject != t && obj.Type() != t { + return nil, plumbing.ErrObjectNotFound + } + + return obj, nil +} + +// DeltaObject returns the object with the given hash, by searching for +// it in the packfile and the git object directories. +func (s *ObjectStorage) DeltaObject(t plumbing.ObjectType, + h plumbing.Hash) (plumbing.EncodedObject, error) { + obj, err := s.getFromUnpacked(h) + if err == plumbing.ErrObjectNotFound { + obj, err = s.getFromPackfile(h, true) + } + + if err != nil { + return nil, err + } + + if plumbing.AnyObject != t && obj.Type() != t { + return nil, plumbing.ErrObjectNotFound + } + + return obj, nil +} + +func (s *ObjectStorage) getFromUnpacked(h plumbing.Hash) (obj plumbing.EncodedObject, err error) { + f, err := s.dir.Object(h) + if err != nil { + if os.IsNotExist(err) { + return nil, plumbing.ErrObjectNotFound + } + + return nil, err + } + defer ioutil.CheckClose(f, &err) + + if cacheObj, found := s.objectCache.Get(h); found { + return cacheObj, nil + } + + obj = s.NewEncodedObject() + r, err := objfile.NewReader(f) + if err != nil { + return nil, err + } + + defer ioutil.CheckClose(r, &err) + + t, size, err := r.Header() + if err != nil { + return nil, err + } + + obj.SetType(t) + obj.SetSize(size) + w, err := obj.Writer() + if err != nil { + return nil, err + } + + defer ioutil.CheckClose(w, &err) + + s.objectCache.Put(obj) + + _, err = io.Copy(w, r) + return obj, err +} + +// Get returns the object with the given hash, by searching for it in +// the packfile. +func (s *ObjectStorage) getFromPackfile(h plumbing.Hash, canBeDelta bool) ( + plumbing.EncodedObject, error) { + + if err := s.requireIndex(); err != nil { + return nil, err + } + + pack, hash, offset := s.findObjectInPackfile(h) + if offset == -1 { + return nil, plumbing.ErrObjectNotFound + } + + idx := s.index[pack] + p, err := s.packfile(idx, pack) + if err != nil { + return nil, err + } + + if !s.options.KeepDescriptors && s.options.MaxOpenDescriptors == 0 { + defer ioutil.CheckClose(p, &err) + } + + if canBeDelta { + return s.decodeDeltaObjectAt(p, offset, hash) + } + + return s.decodeObjectAt(p, offset) +} + +func (s *ObjectStorage) decodeObjectAt( + p *packfile.Packfile, + offset int64, +) (plumbing.EncodedObject, error) { + hash, err := p.FindHash(offset) + if err == nil { + obj, ok := s.objectCache.Get(hash) + if ok { + return obj, nil + } + } + + if err != nil && err != plumbing.ErrObjectNotFound { + return nil, err + } + + return p.GetByOffset(offset) +} + +func (s *ObjectStorage) decodeDeltaObjectAt( + p *packfile.Packfile, + offset int64, + hash plumbing.Hash, +) (plumbing.EncodedObject, error) { + scan := p.Scanner() + header, err := scan.SeekObjectHeader(offset) + if err != nil { + return nil, err + } + + var ( + base plumbing.Hash + ) + + switch header.Type { + case plumbing.REFDeltaObject: + base = header.Reference + case plumbing.OFSDeltaObject: + base, err = p.FindHash(header.OffsetReference) + if err != nil { + return nil, err + } + default: + return s.decodeObjectAt(p, offset) + } + + obj := &plumbing.MemoryObject{} + obj.SetType(header.Type) + w, err := obj.Writer() + if err != nil { + return nil, err + } + + if _, _, err := scan.NextObject(w); err != nil { + return nil, err + } + + return newDeltaObject(obj, hash, base, header.Length), nil +} + +func (s *ObjectStorage) findObjectInPackfile(h plumbing.Hash) (plumbing.Hash, plumbing.Hash, int64) { + for packfile, index := range s.index { + offset, err := index.FindOffset(h) + if err == nil { + return packfile, h, offset + } + } + + return plumbing.ZeroHash, plumbing.ZeroHash, -1 +} + +// IterEncodedObjects returns an iterator for all the objects in the packfile +// with the given type. +func (s *ObjectStorage) IterEncodedObjects(t plumbing.ObjectType) (storer.EncodedObjectIter, error) { + objects, err := s.dir.Objects() + if err != nil { + return nil, err + } + + seen := make(map[plumbing.Hash]struct{}) + var iters []storer.EncodedObjectIter + if len(objects) != 0 { + iters = append(iters, &objectsIter{s: s, t: t, h: objects}) + seen = hashListAsMap(objects) + } + + packi, err := s.buildPackfileIters(t, seen) + if err != nil { + return nil, err + } + + iters = append(iters, packi) + return storer.NewMultiEncodedObjectIter(iters), nil +} + +func (s *ObjectStorage) buildPackfileIters( + t plumbing.ObjectType, + seen map[plumbing.Hash]struct{}, +) (storer.EncodedObjectIter, error) { + if err := s.requireIndex(); err != nil { + return nil, err + } + + packs, err := s.dir.ObjectPacks() + if err != nil { + return nil, err + } + return &lazyPackfilesIter{ + hashes: packs, + open: func(h plumbing.Hash) (storer.EncodedObjectIter, error) { + pack, err := s.dir.ObjectPack(h) + if err != nil { + return nil, err + } + return newPackfileIter( + s.dir.Fs(), pack, t, seen, s.index[h], + s.objectCache, s.options.KeepDescriptors, + ) + }, + }, nil +} + +// Close closes all opened files. +func (s *ObjectStorage) Close() error { + var firstError error + if s.options.KeepDescriptors || s.options.MaxOpenDescriptors > 0 { + for _, packfile := range s.packfiles { + err := packfile.Close() + if firstError == nil && err != nil { + firstError = err + } + } + } + + s.packfiles = nil + s.dir.Close() + + return firstError +} + +type lazyPackfilesIter struct { + hashes []plumbing.Hash + open func(h plumbing.Hash) (storer.EncodedObjectIter, error) + cur storer.EncodedObjectIter +} + +func (it *lazyPackfilesIter) Next() (plumbing.EncodedObject, error) { + for { + if it.cur == nil { + if len(it.hashes) == 0 { + return nil, io.EOF + } + h := it.hashes[0] + it.hashes = it.hashes[1:] + + sub, err := it.open(h) + if err == io.EOF { + continue + } else if err != nil { + return nil, err + } + it.cur = sub + } + ob, err := it.cur.Next() + if err == io.EOF { + it.cur.Close() + it.cur = nil + continue + } else if err != nil { + return nil, err + } + return ob, nil + } +} + +func (it *lazyPackfilesIter) ForEach(cb func(plumbing.EncodedObject) error) error { + return storer.ForEachIterator(it, cb) +} + +func (it *lazyPackfilesIter) Close() { + if it.cur != nil { + it.cur.Close() + it.cur = nil + } + it.hashes = nil +} + +type packfileIter struct { + pack billy.File + iter storer.EncodedObjectIter + seen map[plumbing.Hash]struct{} + + // tells whether the pack file should be left open after iteration or not + keepPack bool +} + +// NewPackfileIter returns a new EncodedObjectIter for the provided packfile +// and object type. Packfile and index file will be closed after they're +// used. If keepPack is true the packfile won't be closed after the iteration +// finished. +func NewPackfileIter( + fs billy.Filesystem, + f billy.File, + idxFile billy.File, + t plumbing.ObjectType, + keepPack bool, +) (storer.EncodedObjectIter, error) { + idx := idxfile.NewMemoryIndex() + if err := idxfile.NewDecoder(idxFile).Decode(idx); err != nil { + return nil, err + } + + if err := idxFile.Close(); err != nil { + return nil, err + } + + seen := make(map[plumbing.Hash]struct{}) + return newPackfileIter(fs, f, t, seen, idx, nil, keepPack) +} + +func newPackfileIter( + fs billy.Filesystem, + f billy.File, + t plumbing.ObjectType, + seen map[plumbing.Hash]struct{}, + index idxfile.Index, + cache cache.Object, + keepPack bool, +) (storer.EncodedObjectIter, error) { + var p *packfile.Packfile + if cache != nil { + p = packfile.NewPackfileWithCache(index, fs, f, cache) + } else { + p = packfile.NewPackfile(index, fs, f) + } + + iter, err := p.GetByType(t) + if err != nil { + return nil, err + } + + return &packfileIter{ + pack: f, + iter: iter, + seen: seen, + keepPack: keepPack, + }, nil +} + +func (iter *packfileIter) Next() (plumbing.EncodedObject, error) { + for { + obj, err := iter.iter.Next() + if err != nil { + return nil, err + } + + if _, ok := iter.seen[obj.Hash()]; ok { + continue + } + + return obj, nil + } +} + +func (iter *packfileIter) ForEach(cb func(plumbing.EncodedObject) error) error { + for { + o, err := iter.Next() + if err != nil { + if err == io.EOF { + iter.Close() + return nil + } + return err + } + + if err := cb(o); err != nil { + return err + } + } +} + +func (iter *packfileIter) Close() { + iter.iter.Close() + if !iter.keepPack { + _ = iter.pack.Close() + } +} + +type objectsIter struct { + s *ObjectStorage + t plumbing.ObjectType + h []plumbing.Hash +} + +func (iter *objectsIter) Next() (plumbing.EncodedObject, error) { + if len(iter.h) == 0 { + return nil, io.EOF + } + + obj, err := iter.s.getFromUnpacked(iter.h[0]) + iter.h = iter.h[1:] + + if err != nil { + return nil, err + } + + if iter.t != plumbing.AnyObject && iter.t != obj.Type() { + return iter.Next() + } + + return obj, err +} + +func (iter *objectsIter) ForEach(cb func(plumbing.EncodedObject) error) error { + for { + o, err := iter.Next() + if err != nil { + if err == io.EOF { + return nil + } + return err + } + + if err := cb(o); err != nil { + return err + } + } +} + +func (iter *objectsIter) Close() { + iter.h = []plumbing.Hash{} +} + +func hashListAsMap(l []plumbing.Hash) map[plumbing.Hash]struct{} { + m := make(map[plumbing.Hash]struct{}, len(l)) + for _, h := range l { + m[h] = struct{}{} + } + return m +} + +func (s *ObjectStorage) ForEachObjectHash(fun func(plumbing.Hash) error) error { + err := s.dir.ForEachObjectHash(fun) + if err == storer.ErrStop { + return nil + } + return err +} + +func (s *ObjectStorage) LooseObjectTime(hash plumbing.Hash) (time.Time, error) { + fi, err := s.dir.ObjectStat(hash) + if err != nil { + return time.Time{}, err + } + return fi.ModTime(), nil +} + +func (s *ObjectStorage) DeleteLooseObject(hash plumbing.Hash) error { + return s.dir.ObjectDelete(hash) +} + +func (s *ObjectStorage) ObjectPacks() ([]plumbing.Hash, error) { + return s.dir.ObjectPacks() +} + +func (s *ObjectStorage) DeleteOldObjectPackAndIndex(h plumbing.Hash, t time.Time) error { + return s.dir.DeleteOldObjectPackAndIndex(h, t) +} diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/reference.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/reference.go new file mode 100644 index 000000000..aabcd7308 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/reference.go @@ -0,0 +1,44 @@ +package filesystem + +import ( + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/storage/filesystem/dotgit" +) + +type ReferenceStorage struct { + dir *dotgit.DotGit +} + +func (r *ReferenceStorage) SetReference(ref *plumbing.Reference) error { + return r.dir.SetRef(ref, nil) +} + +func (r *ReferenceStorage) CheckAndSetReference(ref, old *plumbing.Reference) error { + return r.dir.SetRef(ref, old) +} + +func (r *ReferenceStorage) Reference(n plumbing.ReferenceName) (*plumbing.Reference, error) { + return r.dir.Ref(n) +} + +func (r *ReferenceStorage) IterReferences() (storer.ReferenceIter, error) { + refs, err := r.dir.Refs() + if err != nil { + return nil, err + } + + return storer.NewReferenceSliceIter(refs), nil +} + +func (r *ReferenceStorage) RemoveReference(n plumbing.ReferenceName) error { + return r.dir.RemoveRef(n) +} + +func (r *ReferenceStorage) CountLooseRefs() (int, error) { + return r.dir.CountLooseRefs() +} + +func (r *ReferenceStorage) PackRefs() error { + return r.dir.PackRefs() +} diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/shallow.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/shallow.go new file mode 100644 index 000000000..afb600cf2 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/shallow.go @@ -0,0 +1,54 @@ +package filesystem + +import ( + "bufio" + "fmt" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/storage/filesystem/dotgit" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +// ShallowStorage where the shallow commits are stored, an internal to +// manipulate the shallow file +type ShallowStorage struct { + dir *dotgit.DotGit +} + +// SetShallow save the shallows in the shallow file in the .git folder as one +// commit per line represented by 40-byte hexadecimal object terminated by a +// newline. +func (s *ShallowStorage) SetShallow(commits []plumbing.Hash) error { + f, err := s.dir.ShallowWriter() + if err != nil { + return err + } + + defer ioutil.CheckClose(f, &err) + for _, h := range commits { + if _, err := fmt.Fprintf(f, "%s\n", h); err != nil { + return err + } + } + + return err +} + +// Shallow return the shallow commits reading from shallo file from .git +func (s *ShallowStorage) Shallow() ([]plumbing.Hash, error) { + f, err := s.dir.Shallow() + if f == nil || err != nil { + return nil, err + } + + defer ioutil.CheckClose(f, &err) + + var hash []plumbing.Hash + + scn := bufio.NewScanner(f) + for scn.Scan() { + hash = append(hash, plumbing.NewHash(scn.Text())) + } + + return hash, scn.Err() +} diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/storage.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/storage.go new file mode 100644 index 000000000..8b69b27b0 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/storage.go @@ -0,0 +1,73 @@ +// Package filesystem is a storage backend base on filesystems +package filesystem + +import ( + "github.com/go-git/go-git/v5/plumbing/cache" + "github.com/go-git/go-git/v5/storage/filesystem/dotgit" + + "github.com/go-git/go-billy/v5" +) + +// Storage is an implementation of git.Storer that stores data on disk in the +// standard git format (this is, the .git directory). Zero values of this type +// are not safe to use, see the NewStorage function below. +type Storage struct { + fs billy.Filesystem + dir *dotgit.DotGit + + ObjectStorage + ReferenceStorage + IndexStorage + ShallowStorage + ConfigStorage + ModuleStorage +} + +// Options holds configuration for the storage. +type Options struct { + // ExclusiveAccess means that the filesystem is not modified externally + // while the repo is open. + ExclusiveAccess bool + // KeepDescriptors makes the file descriptors to be reused but they will + // need to be manually closed calling Close(). + KeepDescriptors bool + // MaxOpenDescriptors is the max number of file descriptors to keep + // open. If KeepDescriptors is true, all file descriptors will remain open. + MaxOpenDescriptors int +} + +// NewStorage returns a new Storage backed by a given `fs.Filesystem` and cache. +func NewStorage(fs billy.Filesystem, cache cache.Object) *Storage { + return NewStorageWithOptions(fs, cache, Options{}) +} + +// NewStorageWithOptions returns a new Storage with extra options, +// backed by a given `fs.Filesystem` and cache. +func NewStorageWithOptions(fs billy.Filesystem, cache cache.Object, ops Options) *Storage { + dirOps := dotgit.Options{ + ExclusiveAccess: ops.ExclusiveAccess, + } + dir := dotgit.NewWithOptions(fs, dirOps) + + return &Storage{ + fs: fs, + dir: dir, + + ObjectStorage: *NewObjectStorageWithOptions(dir, cache, ops), + ReferenceStorage: ReferenceStorage{dir: dir}, + IndexStorage: IndexStorage{dir: dir}, + ShallowStorage: ShallowStorage{dir: dir}, + ConfigStorage: ConfigStorage{dir: dir}, + ModuleStorage: ModuleStorage{dir: dir}, + } +} + +// Filesystem returns the underlying filesystem +func (s *Storage) Filesystem() billy.Filesystem { + return s.fs +} + +// Init initializes .git directory +func (s *Storage) Init() error { + return s.dir.Initialize() +} diff --git a/vendor/github.com/go-git/go-git/v5/storage/memory/storage.go b/vendor/github.com/go-git/go-git/v5/storage/memory/storage.go new file mode 100644 index 000000000..fdf8fcfc6 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/memory/storage.go @@ -0,0 +1,320 @@ +// Package memory is a storage backend base on memory +package memory + +import ( + "fmt" + "time" + + "github.com/go-git/go-git/v5/config" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/index" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/storage" +) + +var ErrUnsupportedObjectType = fmt.Errorf("unsupported object type") + +// Storage is an implementation of git.Storer that stores data on memory, being +// ephemeral. The use of this storage should be done in controlled environments, +// since the representation in memory of some repository can fill the machine +// memory. in the other hand this storage has the best performance. +type Storage struct { + ConfigStorage + ObjectStorage + ShallowStorage + IndexStorage + ReferenceStorage + ModuleStorage +} + +// NewStorage returns a new Storage base on memory +func NewStorage() *Storage { + return &Storage{ + ReferenceStorage: make(ReferenceStorage), + ConfigStorage: ConfigStorage{}, + ShallowStorage: ShallowStorage{}, + ObjectStorage: ObjectStorage{ + Objects: make(map[plumbing.Hash]plumbing.EncodedObject), + Commits: make(map[plumbing.Hash]plumbing.EncodedObject), + Trees: make(map[plumbing.Hash]plumbing.EncodedObject), + Blobs: make(map[plumbing.Hash]plumbing.EncodedObject), + Tags: make(map[plumbing.Hash]plumbing.EncodedObject), + }, + ModuleStorage: make(ModuleStorage), + } +} + +type ConfigStorage struct { + config *config.Config +} + +func (c *ConfigStorage) SetConfig(cfg *config.Config) error { + if err := cfg.Validate(); err != nil { + return err + } + + c.config = cfg + return nil +} + +func (c *ConfigStorage) Config() (*config.Config, error) { + if c.config == nil { + c.config = config.NewConfig() + } + + return c.config, nil +} + +type IndexStorage struct { + index *index.Index +} + +func (c *IndexStorage) SetIndex(idx *index.Index) error { + c.index = idx + return nil +} + +func (c *IndexStorage) Index() (*index.Index, error) { + if c.index == nil { + c.index = &index.Index{Version: 2} + } + + return c.index, nil +} + +type ObjectStorage struct { + Objects map[plumbing.Hash]plumbing.EncodedObject + Commits map[plumbing.Hash]plumbing.EncodedObject + Trees map[plumbing.Hash]plumbing.EncodedObject + Blobs map[plumbing.Hash]plumbing.EncodedObject + Tags map[plumbing.Hash]plumbing.EncodedObject +} + +func (o *ObjectStorage) NewEncodedObject() plumbing.EncodedObject { + return &plumbing.MemoryObject{} +} + +func (o *ObjectStorage) SetEncodedObject(obj plumbing.EncodedObject) (plumbing.Hash, error) { + h := obj.Hash() + o.Objects[h] = obj + + switch obj.Type() { + case plumbing.CommitObject: + o.Commits[h] = o.Objects[h] + case plumbing.TreeObject: + o.Trees[h] = o.Objects[h] + case plumbing.BlobObject: + o.Blobs[h] = o.Objects[h] + case plumbing.TagObject: + o.Tags[h] = o.Objects[h] + default: + return h, ErrUnsupportedObjectType + } + + return h, nil +} + +func (o *ObjectStorage) HasEncodedObject(h plumbing.Hash) (err error) { + if _, ok := o.Objects[h]; !ok { + return plumbing.ErrObjectNotFound + } + return nil +} + +func (o *ObjectStorage) EncodedObjectSize(h plumbing.Hash) ( + size int64, err error) { + obj, ok := o.Objects[h] + if !ok { + return 0, plumbing.ErrObjectNotFound + } + + return obj.Size(), nil +} + +func (o *ObjectStorage) EncodedObject(t plumbing.ObjectType, h plumbing.Hash) (plumbing.EncodedObject, error) { + obj, ok := o.Objects[h] + if !ok || (plumbing.AnyObject != t && obj.Type() != t) { + return nil, plumbing.ErrObjectNotFound + } + + return obj, nil +} + +func (o *ObjectStorage) IterEncodedObjects(t plumbing.ObjectType) (storer.EncodedObjectIter, error) { + var series []plumbing.EncodedObject + switch t { + case plumbing.AnyObject: + series = flattenObjectMap(o.Objects) + case plumbing.CommitObject: + series = flattenObjectMap(o.Commits) + case plumbing.TreeObject: + series = flattenObjectMap(o.Trees) + case plumbing.BlobObject: + series = flattenObjectMap(o.Blobs) + case plumbing.TagObject: + series = flattenObjectMap(o.Tags) + } + + return storer.NewEncodedObjectSliceIter(series), nil +} + +func flattenObjectMap(m map[plumbing.Hash]plumbing.EncodedObject) []plumbing.EncodedObject { + objects := make([]plumbing.EncodedObject, 0, len(m)) + for _, obj := range m { + objects = append(objects, obj) + } + return objects +} + +func (o *ObjectStorage) Begin() storer.Transaction { + return &TxObjectStorage{ + Storage: o, + Objects: make(map[plumbing.Hash]plumbing.EncodedObject), + } +} + +func (o *ObjectStorage) ForEachObjectHash(fun func(plumbing.Hash) error) error { + for h := range o.Objects { + err := fun(h) + if err != nil { + if err == storer.ErrStop { + return nil + } + return err + } + } + return nil +} + +func (o *ObjectStorage) ObjectPacks() ([]plumbing.Hash, error) { + return nil, nil +} +func (o *ObjectStorage) DeleteOldObjectPackAndIndex(plumbing.Hash, time.Time) error { + return nil +} + +var errNotSupported = fmt.Errorf("Not supported") + +func (s *ObjectStorage) LooseObjectTime(hash plumbing.Hash) (time.Time, error) { + return time.Time{}, errNotSupported +} +func (s *ObjectStorage) DeleteLooseObject(plumbing.Hash) error { + return errNotSupported +} + +type TxObjectStorage struct { + Storage *ObjectStorage + Objects map[plumbing.Hash]plumbing.EncodedObject +} + +func (tx *TxObjectStorage) SetEncodedObject(obj plumbing.EncodedObject) (plumbing.Hash, error) { + h := obj.Hash() + tx.Objects[h] = obj + + return h, nil +} + +func (tx *TxObjectStorage) EncodedObject(t plumbing.ObjectType, h plumbing.Hash) (plumbing.EncodedObject, error) { + obj, ok := tx.Objects[h] + if !ok || (plumbing.AnyObject != t && obj.Type() != t) { + return nil, plumbing.ErrObjectNotFound + } + + return obj, nil +} + +func (tx *TxObjectStorage) Commit() error { + for h, obj := range tx.Objects { + delete(tx.Objects, h) + if _, err := tx.Storage.SetEncodedObject(obj); err != nil { + return err + } + } + + return nil +} + +func (tx *TxObjectStorage) Rollback() error { + tx.Objects = make(map[plumbing.Hash]plumbing.EncodedObject) + return nil +} + +type ReferenceStorage map[plumbing.ReferenceName]*plumbing.Reference + +func (r ReferenceStorage) SetReference(ref *plumbing.Reference) error { + if ref != nil { + r[ref.Name()] = ref + } + + return nil +} + +func (r ReferenceStorage) CheckAndSetReference(ref, old *plumbing.Reference) error { + if ref == nil { + return nil + } + + if old != nil { + tmp := r[ref.Name()] + if tmp != nil && tmp.Hash() != old.Hash() { + return storage.ErrReferenceHasChanged + } + } + r[ref.Name()] = ref + return nil +} + +func (r ReferenceStorage) Reference(n plumbing.ReferenceName) (*plumbing.Reference, error) { + ref, ok := r[n] + if !ok { + return nil, plumbing.ErrReferenceNotFound + } + + return ref, nil +} + +func (r ReferenceStorage) IterReferences() (storer.ReferenceIter, error) { + var refs []*plumbing.Reference + for _, ref := range r { + refs = append(refs, ref) + } + + return storer.NewReferenceSliceIter(refs), nil +} + +func (r ReferenceStorage) CountLooseRefs() (int, error) { + return len(r), nil +} + +func (r ReferenceStorage) PackRefs() error { + return nil +} + +func (r ReferenceStorage) RemoveReference(n plumbing.ReferenceName) error { + delete(r, n) + return nil +} + +type ShallowStorage []plumbing.Hash + +func (s *ShallowStorage) SetShallow(commits []plumbing.Hash) error { + *s = commits + return nil +} + +func (s ShallowStorage) Shallow() ([]plumbing.Hash, error) { + return s, nil +} + +type ModuleStorage map[string]*Storage + +func (s ModuleStorage) Module(name string) (storage.Storer, error) { + if m, ok := s[name]; ok { + return m, nil + } + + m := NewStorage() + s[name] = m + + return m, nil +} diff --git a/vendor/github.com/go-git/go-git/v5/storage/storer.go b/vendor/github.com/go-git/go-git/v5/storage/storer.go new file mode 100644 index 000000000..4800ac7ba --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/storer.go @@ -0,0 +1,30 @@ +package storage + +import ( + "errors" + + "github.com/go-git/go-git/v5/config" + "github.com/go-git/go-git/v5/plumbing/storer" +) + +var ErrReferenceHasChanged = errors.New("reference has changed concurrently") + +// Storer is a generic storage of objects, references and any information +// related to a particular repository. The package github.com/go-git/go-git/v5/storage +// contains two implementation a filesystem base implementation (such as `.git`) +// and a memory implementations being ephemeral +type Storer interface { + storer.EncodedObjectStorer + storer.ReferenceStorer + storer.ShallowStorer + storer.IndexStorer + config.ConfigStorer + ModuleStorer +} + +// ModuleStorer allows interact with the modules' Storers +type ModuleStorer interface { + // Module returns a Storer representing a submodule, if not exists returns a + // new empty Storer is returned + Module(name string) (Storer, error) +} diff --git a/vendor/github.com/go-git/go-git/v5/submodule.go b/vendor/github.com/go-git/go-git/v5/submodule.go new file mode 100644 index 000000000..dff26b0d8 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/submodule.go @@ -0,0 +1,357 @@ +package git + +import ( + "bytes" + "context" + "errors" + "fmt" + + "github.com/go-git/go-billy/v5" + "github.com/go-git/go-git/v5/config" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/index" +) + +var ( + ErrSubmoduleAlreadyInitialized = errors.New("submodule already initialized") + ErrSubmoduleNotInitialized = errors.New("submodule not initialized") +) + +// Submodule a submodule allows you to keep another Git repository in a +// subdirectory of your repository. +type Submodule struct { + // initialized defines if a submodule was already initialized. + initialized bool + + c *config.Submodule + w *Worktree +} + +// Config returns the submodule config +func (s *Submodule) Config() *config.Submodule { + return s.c +} + +// Init initialize the submodule reading the recorded Entry in the index for +// the given submodule +func (s *Submodule) Init() error { + cfg, err := s.w.r.Config() + if err != nil { + return err + } + + _, ok := cfg.Submodules[s.c.Name] + if ok { + return ErrSubmoduleAlreadyInitialized + } + + s.initialized = true + + cfg.Submodules[s.c.Name] = s.c + return s.w.r.Storer.SetConfig(cfg) +} + +// Status returns the status of the submodule. +func (s *Submodule) Status() (*SubmoduleStatus, error) { + idx, err := s.w.r.Storer.Index() + if err != nil { + return nil, err + } + + return s.status(idx) +} + +func (s *Submodule) status(idx *index.Index) (*SubmoduleStatus, error) { + status := &SubmoduleStatus{ + Path: s.c.Path, + } + + e, err := idx.Entry(s.c.Path) + if err != nil && err != index.ErrEntryNotFound { + return nil, err + } + + if e != nil { + status.Expected = e.Hash + } + + if !s.initialized { + return status, nil + } + + r, err := s.Repository() + if err != nil { + return nil, err + } + + head, err := r.Head() + if err == nil { + status.Current = head.Hash() + } + + if err != nil && err == plumbing.ErrReferenceNotFound { + err = nil + } + + return status, err +} + +// Repository returns the Repository represented by this submodule +func (s *Submodule) Repository() (*Repository, error) { + if !s.initialized { + return nil, ErrSubmoduleNotInitialized + } + + storer, err := s.w.r.Storer.Module(s.c.Name) + if err != nil { + return nil, err + } + + _, err = storer.Reference(plumbing.HEAD) + if err != nil && err != plumbing.ErrReferenceNotFound { + return nil, err + } + + var exists bool + if err == nil { + exists = true + } + + var worktree billy.Filesystem + if worktree, err = s.w.Filesystem.Chroot(s.c.Path); err != nil { + return nil, err + } + + if exists { + return Open(storer, worktree) + } + + r, err := Init(storer, worktree) + if err != nil { + return nil, err + } + + _, err = r.CreateRemote(&config.RemoteConfig{ + Name: DefaultRemoteName, + URLs: []string{s.c.URL}, + }) + + return r, err +} + +// Update the registered submodule to match what the superproject expects, the +// submodule should be initialized first calling the Init method or setting in +// the options SubmoduleUpdateOptions.Init equals true +func (s *Submodule) Update(o *SubmoduleUpdateOptions) error { + return s.UpdateContext(context.Background(), o) +} + +// UpdateContext the registered submodule to match what the superproject +// expects, the submodule should be initialized first calling the Init method or +// setting in the options SubmoduleUpdateOptions.Init equals true. +// +// The provided Context must be non-nil. If the context expires before the +// operation is complete, an error is returned. The context only affects to the +// transport operations. +func (s *Submodule) UpdateContext(ctx context.Context, o *SubmoduleUpdateOptions) error { + return s.update(ctx, o, plumbing.ZeroHash) +} + +func (s *Submodule) update(ctx context.Context, o *SubmoduleUpdateOptions, forceHash plumbing.Hash) error { + if !s.initialized && !o.Init { + return ErrSubmoduleNotInitialized + } + + if !s.initialized && o.Init { + if err := s.Init(); err != nil { + return err + } + } + + idx, err := s.w.r.Storer.Index() + if err != nil { + return err + } + + hash := forceHash + if hash.IsZero() { + e, err := idx.Entry(s.c.Path) + if err != nil { + return err + } + + hash = e.Hash + } + + r, err := s.Repository() + if err != nil { + return err + } + + if err := s.fetchAndCheckout(ctx, r, o, hash); err != nil { + return err + } + + return s.doRecursiveUpdate(r, o) +} + +func (s *Submodule) doRecursiveUpdate(r *Repository, o *SubmoduleUpdateOptions) error { + if o.RecurseSubmodules == NoRecurseSubmodules { + return nil + } + + w, err := r.Worktree() + if err != nil { + return err + } + + l, err := w.Submodules() + if err != nil { + return err + } + + new := &SubmoduleUpdateOptions{} + *new = *o + + new.RecurseSubmodules-- + return l.Update(new) +} + +func (s *Submodule) fetchAndCheckout( + ctx context.Context, r *Repository, o *SubmoduleUpdateOptions, hash plumbing.Hash, +) error { + if !o.NoFetch { + err := r.FetchContext(ctx, &FetchOptions{Auth: o.Auth}) + if err != nil && err != NoErrAlreadyUpToDate { + return err + } + } + + w, err := r.Worktree() + if err != nil { + return err + } + + if err := w.Checkout(&CheckoutOptions{Hash: hash}); err != nil { + return err + } + + head := plumbing.NewHashReference(plumbing.HEAD, hash) + return r.Storer.SetReference(head) +} + +// Submodules list of several submodules from the same repository. +type Submodules []*Submodule + +// Init initializes the submodules in this list. +func (s Submodules) Init() error { + for _, sub := range s { + if err := sub.Init(); err != nil { + return err + } + } + + return nil +} + +// Update updates all the submodules in this list. +func (s Submodules) Update(o *SubmoduleUpdateOptions) error { + return s.UpdateContext(context.Background(), o) +} + +// UpdateContext updates all the submodules in this list. +// +// The provided Context must be non-nil. If the context expires before the +// operation is complete, an error is returned. The context only affects to the +// transport operations. +func (s Submodules) UpdateContext(ctx context.Context, o *SubmoduleUpdateOptions) error { + for _, sub := range s { + if err := sub.UpdateContext(ctx, o); err != nil { + return err + } + } + + return nil +} + +// Status returns the status of the submodules. +func (s Submodules) Status() (SubmodulesStatus, error) { + var list SubmodulesStatus + + var r *Repository + for _, sub := range s { + if r == nil { + r = sub.w.r + } + + idx, err := r.Storer.Index() + if err != nil { + return nil, err + } + + status, err := sub.status(idx) + if err != nil { + return nil, err + } + + list = append(list, status) + } + + return list, nil +} + +// SubmodulesStatus contains the status for all submodiles in the worktree +type SubmodulesStatus []*SubmoduleStatus + +// String is equivalent to `git submodule status` +func (s SubmodulesStatus) String() string { + buf := bytes.NewBuffer(nil) + for _, sub := range s { + fmt.Fprintln(buf, sub) + } + + return buf.String() +} + +// SubmoduleStatus contains the status for a submodule in the worktree +type SubmoduleStatus struct { + Path string + Current plumbing.Hash + Expected plumbing.Hash + Branch plumbing.ReferenceName +} + +// IsClean is the HEAD of the submodule is equals to the expected commit +func (s *SubmoduleStatus) IsClean() bool { + return s.Current == s.Expected +} + +// String is equivalent to `git submodule status ` +// +// This will print the SHA-1 of the currently checked out commit for a +// submodule, along with the submodule path and the output of git describe fo +// the SHA-1. Each SHA-1 will be prefixed with - if the submodule is not +// initialized, + if the currently checked out submodule commit does not match +// the SHA-1 found in the index of the containing repository. +func (s *SubmoduleStatus) String() string { + var extra string + var status = ' ' + + if s.Current.IsZero() { + status = '-' + } else if !s.IsClean() { + status = '+' + } + + if len(s.Branch) != 0 { + extra = string(s.Branch[5:]) + } else if !s.Current.IsZero() { + extra = s.Current.String()[:7] + } + + if extra != "" { + extra = fmt.Sprintf(" (%s)", extra) + } + + return fmt.Sprintf("%c%s %s%s", status, s.Expected, s.Path, extra) +} diff --git a/vendor/github.com/go-git/go-git/v5/utils/binary/read.go b/vendor/github.com/go-git/go-git/v5/utils/binary/read.go new file mode 100644 index 000000000..a14d48db9 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/binary/read.go @@ -0,0 +1,180 @@ +// Package binary implements sintax-sugar functions on top of the standard +// library binary package +package binary + +import ( + "bufio" + "encoding/binary" + "io" + + "github.com/go-git/go-git/v5/plumbing" +) + +// Read reads structured binary data from r into data. Bytes are read and +// decoded in BigEndian order +// https://golang.org/pkg/encoding/binary/#Read +func Read(r io.Reader, data ...interface{}) error { + for _, v := range data { + if err := binary.Read(r, binary.BigEndian, v); err != nil { + return err + } + } + + return nil +} + +// ReadUntil reads from r untin delim is found +func ReadUntil(r io.Reader, delim byte) ([]byte, error) { + if bufr, ok := r.(*bufio.Reader); ok { + return ReadUntilFromBufioReader(bufr, delim) + } + + var buf [1]byte + value := make([]byte, 0, 16) + for { + if _, err := io.ReadFull(r, buf[:]); err != nil { + if err == io.EOF { + return nil, err + } + + return nil, err + } + + if buf[0] == delim { + return value, nil + } + + value = append(value, buf[0]) + } +} + +// ReadUntilFromBufioReader is like bufio.ReadBytes but drops the delimiter +// from the result. +func ReadUntilFromBufioReader(r *bufio.Reader, delim byte) ([]byte, error) { + value, err := r.ReadBytes(delim) + if err != nil || len(value) == 0 { + return nil, err + } + + return value[:len(value)-1], nil +} + +// ReadVariableWidthInt reads and returns an int in Git VLQ special format: +// +// Ordinary VLQ has some redundancies, example: the number 358 can be +// encoded as the 2-octet VLQ 0x8166 or the 3-octet VLQ 0x808166 or the +// 4-octet VLQ 0x80808166 and so forth. +// +// To avoid these redundancies, the VLQ format used in Git removes this +// prepending redundancy and extends the representable range of shorter +// VLQs by adding an offset to VLQs of 2 or more octets in such a way +// that the lowest possible value for such an (N+1)-octet VLQ becomes +// exactly one more than the maximum possible value for an N-octet VLQ. +// In particular, since a 1-octet VLQ can store a maximum value of 127, +// the minimum 2-octet VLQ (0x8000) is assigned the value 128 instead of +// 0. Conversely, the maximum value of such a 2-octet VLQ (0xff7f) is +// 16511 instead of just 16383. Similarly, the minimum 3-octet VLQ +// (0x808000) has a value of 16512 instead of zero, which means +// that the maximum 3-octet VLQ (0xffff7f) is 2113663 instead of +// just 2097151. And so forth. +// +// This is how the offset is saved in C: +// +// dheader[pos] = ofs & 127; +// while (ofs >>= 7) +// dheader[--pos] = 128 | (--ofs & 127); +// +func ReadVariableWidthInt(r io.Reader) (int64, error) { + var c byte + if err := Read(r, &c); err != nil { + return 0, err + } + + var v = int64(c & maskLength) + for c&maskContinue > 0 { + v++ + if err := Read(r, &c); err != nil { + return 0, err + } + + v = (v << lengthBits) + int64(c&maskLength) + } + + return v, nil +} + +const ( + maskContinue = uint8(128) // 1000 000 + maskLength = uint8(127) // 0111 1111 + lengthBits = uint8(7) // subsequent bytes has 7 bits to store the length +) + +// ReadUint64 reads 8 bytes and returns them as a BigEndian uint32 +func ReadUint64(r io.Reader) (uint64, error) { + var v uint64 + if err := binary.Read(r, binary.BigEndian, &v); err != nil { + return 0, err + } + + return v, nil +} + +// ReadUint32 reads 4 bytes and returns them as a BigEndian uint32 +func ReadUint32(r io.Reader) (uint32, error) { + var v uint32 + if err := binary.Read(r, binary.BigEndian, &v); err != nil { + return 0, err + } + + return v, nil +} + +// ReadUint16 reads 2 bytes and returns them as a BigEndian uint16 +func ReadUint16(r io.Reader) (uint16, error) { + var v uint16 + if err := binary.Read(r, binary.BigEndian, &v); err != nil { + return 0, err + } + + return v, nil +} + +// ReadHash reads a plumbing.Hash from r +func ReadHash(r io.Reader) (plumbing.Hash, error) { + var h plumbing.Hash + if err := binary.Read(r, binary.BigEndian, h[:]); err != nil { + return plumbing.ZeroHash, err + } + + return h, nil +} + +const sniffLen = 8000 + +// IsBinary detects if data is a binary value based on: +// http://git.kernel.org/cgit/git/git.git/tree/xdiff-interface.c?id=HEAD#n198 +func IsBinary(r io.Reader) (bool, error) { + reader := bufio.NewReader(r) + c := 0 + for { + if c == sniffLen { + break + } + + b, err := reader.ReadByte() + if err == io.EOF { + break + } + if err != nil { + return false, err + } + + if b == byte(0) { + return true, nil + } + + c++ + } + + return false, nil +} diff --git a/vendor/github.com/go-git/go-git/v5/utils/binary/write.go b/vendor/github.com/go-git/go-git/v5/utils/binary/write.go new file mode 100644 index 000000000..c08c73a06 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/binary/write.go @@ -0,0 +1,50 @@ +package binary + +import ( + "encoding/binary" + "io" +) + +// Write writes the binary representation of data into w, using BigEndian order +// https://golang.org/pkg/encoding/binary/#Write +func Write(w io.Writer, data ...interface{}) error { + for _, v := range data { + if err := binary.Write(w, binary.BigEndian, v); err != nil { + return err + } + } + + return nil +} + +func WriteVariableWidthInt(w io.Writer, n int64) error { + buf := []byte{byte(n & 0x7f)} + n >>= 7 + for n != 0 { + n-- + buf = append([]byte{0x80 | (byte(n & 0x7f))}, buf...) + n >>= 7 + } + + _, err := w.Write(buf) + + return err +} + +// WriteUint64 writes the binary representation of a uint64 into w, in BigEndian +// order +func WriteUint64(w io.Writer, value uint64) error { + return binary.Write(w, binary.BigEndian, value) +} + +// WriteUint32 writes the binary representation of a uint32 into w, in BigEndian +// order +func WriteUint32(w io.Writer, value uint32) error { + return binary.Write(w, binary.BigEndian, value) +} + +// WriteUint16 writes the binary representation of a uint16 into w, in BigEndian +// order +func WriteUint16(w io.Writer, value uint16) error { + return binary.Write(w, binary.BigEndian, value) +} diff --git a/vendor/github.com/go-git/go-git/v5/utils/diff/diff.go b/vendor/github.com/go-git/go-git/v5/utils/diff/diff.go new file mode 100644 index 000000000..6142ed051 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/diff/diff.go @@ -0,0 +1,61 @@ +// Package diff implements line oriented diffs, similar to the ancient +// Unix diff command. +// +// The current implementation is just a wrapper around Sergi's +// go-diff/diffmatchpatch library, which is a go port of Neil +// Fraser's google-diff-match-patch code +package diff + +import ( + "bytes" + "time" + + "github.com/sergi/go-diff/diffmatchpatch" +) + +// Do computes the (line oriented) modifications needed to turn the src +// string into the dst string. The underlying algorithm is Meyers, +// its complexity is O(N*d) where N is min(lines(src), lines(dst)) and d +// is the size of the diff. +func Do(src, dst string) (diffs []diffmatchpatch.Diff) { + // the default timeout is time.Second which may be too small under heavy load + return DoWithTimeout(src, dst, time.Hour) +} + +// DoWithTimeout computes the (line oriented) modifications needed to turn the src +// string into the dst string. The `timeout` argument specifies the maximum +// amount of time it is allowed to spend in this function. If the timeout +// is exceeded, the parts of the strings which were not considered are turned into +// a bulk delete+insert and the half-baked suboptimal result is returned at once. +// The underlying algorithm is Meyers, its complexity is O(N*d) where N is +// min(lines(src), lines(dst)) and d is the size of the diff. +func DoWithTimeout (src, dst string, timeout time.Duration) (diffs []diffmatchpatch.Diff) { + dmp := diffmatchpatch.New() + dmp.DiffTimeout = timeout + wSrc, wDst, warray := dmp.DiffLinesToRunes(src, dst) + diffs = dmp.DiffMainRunes(wSrc, wDst, false) + diffs = dmp.DiffCharsToLines(diffs, warray) + return diffs +} + +// Dst computes and returns the destination text. +func Dst(diffs []diffmatchpatch.Diff) string { + var text bytes.Buffer + for _, d := range diffs { + if d.Type != diffmatchpatch.DiffDelete { + text.WriteString(d.Text) + } + } + return text.String() +} + +// Src computes and returns the source text +func Src(diffs []diffmatchpatch.Diff) string { + var text bytes.Buffer + for _, d := range diffs { + if d.Type != diffmatchpatch.DiffInsert { + text.WriteString(d.Text) + } + } + return text.String() +} diff --git a/vendor/github.com/go-git/go-git/v5/utils/ioutil/common.go b/vendor/github.com/go-git/go-git/v5/utils/ioutil/common.go new file mode 100644 index 000000000..e9dcbfe49 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/ioutil/common.go @@ -0,0 +1,170 @@ +// Package ioutil implements some I/O utility functions. +package ioutil + +import ( + "bufio" + "context" + "errors" + "io" + + "github.com/jbenet/go-context/io" +) + +type readPeeker interface { + io.Reader + Peek(int) ([]byte, error) +} + +var ( + ErrEmptyReader = errors.New("reader is empty") +) + +// NonEmptyReader takes a reader and returns it if it is not empty, or +// `ErrEmptyReader` if it is empty. If there is an error when reading the first +// byte of the given reader, it will be propagated. +func NonEmptyReader(r io.Reader) (io.Reader, error) { + pr, ok := r.(readPeeker) + if !ok { + pr = bufio.NewReader(r) + } + + _, err := pr.Peek(1) + if err == io.EOF { + return nil, ErrEmptyReader + } + + if err != nil { + return nil, err + } + + return pr, nil +} + +type readCloser struct { + io.Reader + closer io.Closer +} + +func (r *readCloser) Close() error { + return r.closer.Close() +} + +// NewReadCloser creates an `io.ReadCloser` with the given `io.Reader` and +// `io.Closer`. +func NewReadCloser(r io.Reader, c io.Closer) io.ReadCloser { + return &readCloser{Reader: r, closer: c} +} + +type writeCloser struct { + io.Writer + closer io.Closer +} + +func (r *writeCloser) Close() error { + return r.closer.Close() +} + +// NewWriteCloser creates an `io.WriteCloser` with the given `io.Writer` and +// `io.Closer`. +func NewWriteCloser(w io.Writer, c io.Closer) io.WriteCloser { + return &writeCloser{Writer: w, closer: c} +} + +type writeNopCloser struct { + io.Writer +} + +func (writeNopCloser) Close() error { return nil } + +// WriteNopCloser returns a WriteCloser with a no-op Close method wrapping +// the provided Writer w. +func WriteNopCloser(w io.Writer) io.WriteCloser { + return writeNopCloser{w} +} + +// CheckClose calls Close on the given io.Closer. If the given *error points to +// nil, it will be assigned the error returned by Close. Otherwise, any error +// returned by Close will be ignored. CheckClose is usually called with defer. +func CheckClose(c io.Closer, err *error) { + if cerr := c.Close(); cerr != nil && *err == nil { + *err = cerr + } +} + +// NewContextWriter wraps a writer to make it respect given Context. +// If there is a blocking write, the returned Writer will return whenever the +// context is cancelled (the return values are n=0 and err=ctx.Err()). +func NewContextWriter(ctx context.Context, w io.Writer) io.Writer { + return ctxio.NewWriter(ctx, w) +} + +// NewContextReader wraps a reader to make it respect given Context. +// If there is a blocking read, the returned Reader will return whenever the +// context is cancelled (the return values are n=0 and err=ctx.Err()). +func NewContextReader(ctx context.Context, r io.Reader) io.Reader { + return ctxio.NewReader(ctx, r) +} + +// NewContextWriteCloser as NewContextWriter but with io.Closer interface. +func NewContextWriteCloser(ctx context.Context, w io.WriteCloser) io.WriteCloser { + ctxw := ctxio.NewWriter(ctx, w) + return NewWriteCloser(ctxw, w) +} + +// NewContextReadCloser as NewContextReader but with io.Closer interface. +func NewContextReadCloser(ctx context.Context, r io.ReadCloser) io.ReadCloser { + ctxr := ctxio.NewReader(ctx, r) + return NewReadCloser(ctxr, r) +} + +type readerOnError struct { + io.Reader + notify func(error) +} + +// NewReaderOnError returns a io.Reader that call the notify function when an +// unexpected (!io.EOF) error happens, after call Read function. +func NewReaderOnError(r io.Reader, notify func(error)) io.Reader { + return &readerOnError{r, notify} +} + +// NewReadCloserOnError returns a io.ReadCloser that call the notify function +// when an unexpected (!io.EOF) error happens, after call Read function. +func NewReadCloserOnError(r io.ReadCloser, notify func(error)) io.ReadCloser { + return NewReadCloser(NewReaderOnError(r, notify), r) +} + +func (r *readerOnError) Read(buf []byte) (n int, err error) { + n, err = r.Reader.Read(buf) + if err != nil && err != io.EOF { + r.notify(err) + } + + return +} + +type writerOnError struct { + io.Writer + notify func(error) +} + +// NewWriterOnError returns a io.Writer that call the notify function when an +// unexpected (!io.EOF) error happens, after call Write function. +func NewWriterOnError(w io.Writer, notify func(error)) io.Writer { + return &writerOnError{w, notify} +} + +// NewWriteCloserOnError returns a io.WriteCloser that call the notify function +//when an unexpected (!io.EOF) error happens, after call Write function. +func NewWriteCloserOnError(w io.WriteCloser, notify func(error)) io.WriteCloser { + return NewWriteCloser(NewWriterOnError(w, notify), w) +} + +func (r *writerOnError) Write(p []byte) (n int, err error) { + n, err = r.Writer.Write(p) + if err != nil && err != io.EOF { + r.notify(err) + } + + return +} diff --git a/vendor/github.com/go-git/go-git/v5/utils/merkletrie/change.go b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/change.go new file mode 100644 index 000000000..cc6dc8907 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/change.go @@ -0,0 +1,149 @@ +package merkletrie + +import ( + "fmt" + "io" + + "github.com/go-git/go-git/v5/utils/merkletrie/noder" +) + +// Action values represent the kind of things a Change can represent: +// insertion, deletions or modifications of files. +type Action int + +// The set of possible actions in a change. +const ( + _ Action = iota + Insert + Delete + Modify +) + +// String returns the action as a human readable text. +func (a Action) String() string { + switch a { + case Insert: + return "Insert" + case Delete: + return "Delete" + case Modify: + return "Modify" + default: + panic(fmt.Sprintf("unsupported action: %d", a)) + } +} + +// A Change value represent how a noder has change between to merkletries. +type Change struct { + // The noder before the change or nil if it was inserted. + From noder.Path + // The noder after the change or nil if it was deleted. + To noder.Path +} + +// Action is convenience method that returns what Action c represents. +func (c *Change) Action() (Action, error) { + if c.From == nil && c.To == nil { + return Action(0), fmt.Errorf("malformed change: nil from and to") + } + if c.From == nil { + return Insert, nil + } + if c.To == nil { + return Delete, nil + } + + return Modify, nil +} + +// NewInsert returns a new Change representing the insertion of n. +func NewInsert(n noder.Path) Change { return Change{To: n} } + +// NewDelete returns a new Change representing the deletion of n. +func NewDelete(n noder.Path) Change { return Change{From: n} } + +// NewModify returns a new Change representing that a has been modified and +// it is now b. +func NewModify(a, b noder.Path) Change { + return Change{ + From: a, + To: b, + } +} + +// String returns a single change in human readable form, using the +// format: '<' + action + space + path + '>'. The contents of the file +// before or after the change are not included in this format. +// +// Example: inserting a file at the path a/b/c.txt will return "". +func (c Change) String() string { + action, err := c.Action() + if err != nil { + panic(err) + } + + var path string + if action == Delete { + path = c.From.String() + } else { + path = c.To.String() + } + + return fmt.Sprintf("<%s %s>", action, path) +} + +// Changes is a list of changes between to merkletries. +type Changes []Change + +// NewChanges returns an empty list of changes. +func NewChanges() Changes { + return Changes{} +} + +// Add adds the change c to the list of changes. +func (l *Changes) Add(c Change) { + *l = append(*l, c) +} + +// AddRecursiveInsert adds the required changes to insert all the +// file-like noders found in root, recursively. +func (l *Changes) AddRecursiveInsert(root noder.Path) error { + return l.addRecursive(root, NewInsert) +} + +// AddRecursiveDelete adds the required changes to delete all the +// file-like noders found in root, recursively. +func (l *Changes) AddRecursiveDelete(root noder.Path) error { + return l.addRecursive(root, NewDelete) +} + +type noderToChangeFn func(noder.Path) Change // NewInsert or NewDelete + +func (l *Changes) addRecursive(root noder.Path, ctor noderToChangeFn) error { + if !root.IsDir() { + l.Add(ctor(root)) + return nil + } + + i, err := NewIterFromPath(root) + if err != nil { + return err + } + + var current noder.Path + for { + if current, err = i.Step(); err != nil { + if err == io.EOF { + break + } + return err + } + if current.IsDir() { + continue + } + l.Add(ctor(current)) + } + + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/utils/merkletrie/difftree.go b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/difftree.go new file mode 100644 index 000000000..bd084b2ab --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/difftree.go @@ -0,0 +1,428 @@ +package merkletrie + +// The focus of this difftree implementation is to save time by +// skipping whole directories if their hash is the same in both +// trees. +// +// The diff algorithm implemented here is based on the doubleiter +// type defined in this same package; we will iterate over both +// trees at the same time, while comparing the current noders in +// each iterator. Depending on how they differ we will output the +// corresponding changes and move the iterators further over both +// trees. +// +// The table bellow show all the possible comparison results, along +// with what changes should we produce and how to advance the +// iterators. +// +// The table is implemented by the switches in this function, +// diffTwoNodes, diffTwoNodesSameName and diffTwoDirs. +// +// Many Bothans died to bring us this information, make sure you +// understand the table before modifying this code. + +// # Cases +// +// When comparing noders in both trees you will find yourself in +// one of 169 possible cases, but if we ignore moves, we can +// simplify a lot the search space into the following table: +// +// - "-": nothing, no file or directory +// - a<>: an empty file named "a". +// - a<1>: a file named "a", with "1" as its contents. +// - a<2>: a file named "a", with "2" as its contents. +// - a(): an empty dir named "a". +// - a(...): a dir named "a", with some files and/or dirs inside (possibly +// empty). +// - a(;;;): a dir named "a", with some other files and/or dirs inside +// (possibly empty), which different from the ones in "a(...)". +// +// \ to - a<> a<1> a<2> a() a(...) a(;;;) +// from \ +// - 00 01 02 03 04 05 06 +// a<> 10 11 12 13 14 15 16 +// a<1> 20 21 22 23 24 25 26 +// a<2> 30 31 32 33 34 35 36 +// a() 40 41 42 43 44 45 46 +// a(...) 50 51 52 53 54 55 56 +// a(;;;) 60 61 62 63 64 65 66 +// +// Every (from, to) combination in the table is a special case, but +// some of them can be merged into some more general cases, for +// instance 11 and 22 can be merged into the general case: both +// noders are equal. +// +// Here is a full list of all the cases that are similar and how to +// merge them together into more general cases. Each general case +// is labeled with an uppercase letter for further reference, and it +// is followed by the pseudocode of the checks you have to perfrom +// on both noders to see if you are in such a case, the actions to +// perform (i.e. what changes to output) and how to advance the +// iterators of each tree to continue the comparison process. +// +// ## A. Impossible: 00 +// +// ## B. Same thing on both sides: 11, 22, 33, 44, 55, 66 +// - check: `SameName() && SameHash()` +// - action: do nothing. +// - advance: `FromNext(); ToNext()` +// +// ### C. To was created: 01, 02, 03, 04, 05, 06 +// - check: `DifferentName() && ToBeforeFrom()` +// - action: insertRecursively(to) +// - advance: `ToNext()` +// +// ### D. From was deleted: 10, 20, 30, 40, 50, 60 +// - check: `DifferentName() && FromBeforeTo()` +// - action: `DeleteRecursively(from)` +// - advance: `FromNext()` +// +// ### E. Empty file to file with contents: 12, 13 +// - check: `SameName() && DifferentHash() && FromIsFile() && +// ToIsFile() && FromIsEmpty()` +// - action: `modifyFile(from, to)` +// - advance: `FromNext()` or `FromStep()` +// +// ### E'. file with contents to empty file: 21, 31 +// - check: `SameName() && DifferentHash() && FromIsFile() && +// ToIsFile() && ToIsEmpty()` +// - action: `modifyFile(from, to)` +// - advance: `FromNext()` or `FromStep()` +// +// ### F. empty file to empty dir with the same name: 14 +// - check: `SameName() && FromIsFile() && FromIsEmpty() && +// ToIsDir() && ToIsEmpty()` +// - action: `DeleteFile(from); InsertEmptyDir(to)` +// - advance: `FromNext(); ToNext()` +// +// ### F'. empty dir to empty file of the same name: 41 +// - check: `SameName() && FromIsDir() && FromIsEmpty && +// ToIsFile() && ToIsEmpty()` +// - action: `DeleteEmptyDir(from); InsertFile(to)` +// - advance: `FromNext(); ToNext()` or step for any of them. +// +// ### G. empty file to non-empty dir of the same name: 15, 16 +// - check: `SameName() && FromIsFile() && ToIsDir() && +// FromIsEmpty() && ToIsNotEmpty()` +// - action: `DeleteFile(from); InsertDirRecursively(to)` +// - advance: `FromNext(); ToNext()` +// +// ### G'. non-empty dir to empty file of the same name: 51, 61 +// - check: `SameName() && FromIsDir() && FromIsNotEmpty() && +// ToIsFile() && FromIsEmpty()` +// - action: `DeleteDirRecursively(from); InsertFile(to)` +// - advance: `FromNext(); ToNext()` +// +// ### H. modify file contents: 23, 32 +// - check: `SameName() && FromIsFile() && ToIsFile() && +// FromIsNotEmpty() && ToIsNotEmpty()` +// - action: `ModifyFile(from, to)` +// - advance: `FromNext(); ToNext()` +// +// ### I. file with contents to empty dir: 24, 34 +// - check: `SameName() && DifferentHash() && FromIsFile() && +// FromIsNotEmpty() && ToIsDir() && ToIsEmpty()` +// - action: `DeleteFile(from); InsertEmptyDir(to)` +// - advance: `FromNext(); ToNext()` +// +// ### I'. empty dir to file with contents: 42, 43 +// - check: `SameName() && DifferentHash() && FromIsDir() && +// FromIsEmpty() && ToIsFile() && ToIsEmpty()` +// - action: `DeleteDir(from); InsertFile(to)` +// - advance: `FromNext(); ToNext()` +// +// ### J. file with contents to dir with contents: 25, 26, 35, 36 +// - check: `SameName() && DifferentHash() && FromIsFile() && +// FromIsNotEmpty() && ToIsDir() && ToIsNotEmpty()` +// - action: `DeleteFile(from); InsertDirRecursively(to)` +// - advance: `FromNext(); ToNext()` +// +// ### J'. dir with contents to file with contents: 52, 62, 53, 63 +// - check: `SameName() && DifferentHash() && FromIsDir() && +// FromIsNotEmpty() && ToIsFile() && ToIsNotEmpty()` +// - action: `DeleteDirRecursively(from); InsertFile(to)` +// - advance: `FromNext(); ToNext()` +// +// ### K. empty dir to dir with contents: 45, 46 +// - check: `SameName() && DifferentHash() && FromIsDir() && +// FromIsEmpty() && ToIsDir() && ToIsNotEmpty()` +// - action: `InsertChildrenRecursively(to)` +// - advance: `FromNext(); ToNext()` +// +// ### K'. dir with contents to empty dir: 54, 64 +// - check: `SameName() && DifferentHash() && FromIsDir() && +// FromIsEmpty() && ToIsDir() && ToIsNotEmpty()` +// - action: `DeleteChildrenRecursively(from)` +// - advance: `FromNext(); ToNext()` +// +// ### L. dir with contents to dir with different contents: 56, 65 +// - check: `SameName() && DifferentHash() && FromIsDir() && +// FromIsNotEmpty() && ToIsDir() && ToIsNotEmpty()` +// - action: nothing +// - advance: `FromStep(); ToStep()` +// +// + +// All these cases can be further simplified by a truth table +// reduction process, in which we gather similar checks together to +// make the final code easier to read and understand. +// +// The first 6 columns are the outputs of the checks to perform on +// both noders. I have labeled them 1 to 6, this is what they mean: +// +// 1: SameName() +// 2: SameHash() +// 3: FromIsDir() +// 4: ToIsDir() +// 5: FromIsEmpty() +// 6: ToIsEmpty() +// +// The from and to columns are a fsnoder example of the elements +// that you will find on each tree under the specified comparison +// results (columns 1 to 6). +// +// The type column identifies the case we are into, from the list above. +// +// The type' column identifies the new set of reduced cases, using +// lowercase letters, and they are explained after the table. +// +// The last column is the set of actions and advances for each case. +// +// "---" means impossible except in case of hash collision. +// +// advance meaning: +// - NN: from.Next(); to.Next() +// - SS: from.Step(); to.Step() +// +// 1 2 3 4 5 6 | from | to |type|type'|action ; advance +// ------------+--------+--------+----+------------------------------------ +// 0 0 0 0 0 0 | | | | | if !SameName() { +// . | | | | | if FromBeforeTo() { +// . | | | D | d | delete(from); from.Next() +// . | | | | | } else { +// . | | | C | c | insert(to); to.Next() +// . | | | | | } +// 0 1 1 1 1 1 | | | | | } +// 1 0 0 0 0 0 | a<1> | a<2> | H | e | modify(from, to); NN +// 1 0 0 0 0 1 | a<1> | a<> | E' | e | modify(from, to); NN +// 1 0 0 0 1 0 | a<> | a<1> | E | e | modify(from, to); NN +// 1 0 0 0 1 1 | ---- | ---- | | e | +// 1 0 0 1 0 0 | a<1> | a(...) | J | f | delete(from); insert(to); NN +// 1 0 0 1 0 1 | a<1> | a() | I | f | delete(from); insert(to); NN +// 1 0 0 1 1 0 | a<> | a(...) | G | f | delete(from); insert(to); NN +// 1 0 0 1 1 1 | a<> | a() | F | f | delete(from); insert(to); NN +// 1 0 1 0 0 0 | a(...) | a<1> | J' | f | delete(from); insert(to); NN +// 1 0 1 0 0 1 | a(...) | a<> | G' | f | delete(from); insert(to); NN +// 1 0 1 0 1 0 | a() | a<1> | I' | f | delete(from); insert(to); NN +// 1 0 1 0 1 1 | a() | a<> | F' | f | delete(from); insert(to); NN +// 1 0 1 1 0 0 | a(...) | a(;;;) | L | g | nothing; SS +// 1 0 1 1 0 1 | a(...) | a() | K' | h | deleteChildren(from); NN +// 1 0 1 1 1 0 | a() | a(...) | K | i | insertChildren(to); NN +// 1 0 1 1 1 1 | ---- | ---- | | | +// 1 1 0 0 0 0 | a<1> | a<1> | B | b | nothing; NN +// 1 1 0 0 0 1 | ---- | ---- | | b | +// 1 1 0 0 1 0 | ---- | ---- | | b | +// 1 1 0 0 1 1 | a<> | a<> | B | b | nothing; NN +// 1 1 0 1 0 0 | ---- | ---- | | b | +// 1 1 0 1 0 1 | ---- | ---- | | b | +// 1 1 0 1 1 0 | ---- | ---- | | b | +// 1 1 0 1 1 1 | ---- | ---- | | b | +// 1 1 1 0 0 0 | ---- | ---- | | b | +// 1 1 1 0 0 1 | ---- | ---- | | b | +// 1 1 1 0 1 0 | ---- | ---- | | b | +// 1 1 1 0 1 1 | ---- | ---- | | b | +// 1 1 1 1 0 0 | a(...) | a(...) | B | b | nothing; NN +// 1 1 1 1 0 1 | ---- | ---- | | b | +// 1 1 1 1 1 0 | ---- | ---- | | b | +// 1 1 1 1 1 1 | a() | a() | B | b | nothing; NN +// +// c and d: +// if !SameName() +// d if FromBeforeTo() +// c else +// b: SameName) && sameHash() +// e: SameName() && !sameHash() && BothAreFiles() +// f: SameName() && !sameHash() && FileAndDir() +// g: SameName() && !sameHash() && BothAreDirs() && NoneIsEmpty +// i: SameName() && !sameHash() && BothAreDirs() && FromIsEmpty +// h: else of i + +import ( + "context" + "errors" + "fmt" + + "github.com/go-git/go-git/v5/utils/merkletrie/noder" +) + +var ( + // ErrCanceled is returned whenever the operation is canceled. + ErrCanceled = errors.New("operation canceled") +) + +// DiffTree calculates the list of changes between two merkletries. It +// uses the provided hashEqual callback to compare noders. +func DiffTree( + fromTree, + toTree noder.Noder, + hashEqual noder.Equal, +) (Changes, error) { + return DiffTreeContext(context.Background(), fromTree, toTree, hashEqual) +} + +// DiffTreeContext calculates the list of changes between two merkletries. It +// uses the provided hashEqual callback to compare noders. +// Error will be returned if context expires +// Provided context must be non nil +func DiffTreeContext(ctx context.Context, fromTree, toTree noder.Noder, + hashEqual noder.Equal) (Changes, error) { + ret := NewChanges() + + ii, err := newDoubleIter(fromTree, toTree, hashEqual) + if err != nil { + return nil, err + } + + for { + select { + case <-ctx.Done(): + return nil, ErrCanceled + default: + } + + from := ii.from.current + to := ii.to.current + + switch r := ii.remaining(); r { + case noMoreNoders: + return ret, nil + case onlyFromRemains: + if err = ret.AddRecursiveDelete(from); err != nil { + return nil, err + } + if err = ii.nextFrom(); err != nil { + return nil, err + } + case onlyToRemains: + if err = ret.AddRecursiveInsert(to); err != nil { + return nil, err + } + if err = ii.nextTo(); err != nil { + return nil, err + } + case bothHaveNodes: + if err = diffNodes(&ret, ii); err != nil { + return nil, err + } + default: + panic(fmt.Sprintf("unknown remaining value: %d", r)) + } + } +} + +func diffNodes(changes *Changes, ii *doubleIter) error { + from := ii.from.current + to := ii.to.current + var err error + + // compare their full paths as strings + switch from.Compare(to) { + case -1: + if err = changes.AddRecursiveDelete(from); err != nil { + return err + } + if err = ii.nextFrom(); err != nil { + return err + } + case 1: + if err = changes.AddRecursiveInsert(to); err != nil { + return err + } + if err = ii.nextTo(); err != nil { + return err + } + default: + if err := diffNodesSameName(changes, ii); err != nil { + return err + } + } + + return nil +} + +func diffNodesSameName(changes *Changes, ii *doubleIter) error { + from := ii.from.current + to := ii.to.current + + status, err := ii.compare() + if err != nil { + return err + } + + switch { + case status.sameHash: + // do nothing + if err = ii.nextBoth(); err != nil { + return err + } + case status.bothAreFiles: + changes.Add(NewModify(from, to)) + if err = ii.nextBoth(); err != nil { + return err + } + case status.fileAndDir: + if err = changes.AddRecursiveDelete(from); err != nil { + return err + } + if err = changes.AddRecursiveInsert(to); err != nil { + return err + } + if err = ii.nextBoth(); err != nil { + return err + } + case status.bothAreDirs: + if err = diffDirs(changes, ii); err != nil { + return err + } + default: + return fmt.Errorf("bad status from double iterator") + } + + return nil +} + +func diffDirs(changes *Changes, ii *doubleIter) error { + from := ii.from.current + to := ii.to.current + + status, err := ii.compare() + if err != nil { + return err + } + + switch { + case status.fromIsEmptyDir: + if err = changes.AddRecursiveInsert(to); err != nil { + return err + } + if err = ii.nextBoth(); err != nil { + return err + } + case status.toIsEmptyDir: + if err = changes.AddRecursiveDelete(from); err != nil { + return err + } + if err = ii.nextBoth(); err != nil { + return err + } + case !status.fromIsEmptyDir && !status.toIsEmptyDir: + // do nothing + if err = ii.stepBoth(); err != nil { + return err + } + default: + return fmt.Errorf("both dirs are empty but has different hash") + } + + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/utils/merkletrie/doc.go b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/doc.go new file mode 100644 index 000000000..5204024ad --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/doc.go @@ -0,0 +1,34 @@ +/* +Package merkletrie provides support for n-ary trees that are at the same +time Merkle trees and Radix trees (tries). + +Git trees are Radix n-ary trees in virtue of the names of their +tree entries. At the same time, git trees are Merkle trees thanks to +their hashes. + +This package defines Merkle tries as nodes that should have: + +- a hash: the Merkle part of the Merkle trie + +- a key: the Radix part of the Merkle trie + +The Merkle hash condition is not enforced by this package though. This +means that the hash of a node doesn't have to take into account the hashes of +their children, which is good for testing purposes. + +Nodes in the Merkle trie are abstracted by the Noder interface. The +intended use is that git trees implements this interface, either +directly or using a simple wrapper. + +This package provides an iterator for merkletries that can skip whole +directory-like noders and an efficient merkletrie comparison algorithm. + +When comparing git trees, the simple approach of alphabetically sorting +their elements and comparing the resulting lists is too slow as it +depends linearly on the number of files in the trees: When a directory +has lots of files but none of them has been modified, this approach is +very expensive. We can do better by prunning whole directories that +have not change, just by looking at their hashes. This package provides +the tools to do exactly that. +*/ +package merkletrie diff --git a/vendor/github.com/go-git/go-git/v5/utils/merkletrie/doubleiter.go b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/doubleiter.go new file mode 100644 index 000000000..4a4341b38 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/doubleiter.go @@ -0,0 +1,187 @@ +package merkletrie + +import ( + "fmt" + "io" + + "github.com/go-git/go-git/v5/utils/merkletrie/noder" +) + +// A doubleIter is a convenience type to keep track of the current +// noders in two merkletries that are going to be iterated in parallel. +// It has methods for: +// +// - iterating over the merkletries, both at the same time or +// individually: nextFrom, nextTo, nextBoth, stepBoth +// +// - checking if there are noders left in one or both of them with the +// remaining method and its associated returned type. +// +// - comparing the current noders of both merkletries in several ways, +// with the compare method and its associated returned type. +type doubleIter struct { + from struct { + iter *Iter + current noder.Path // nil if no more nodes + } + to struct { + iter *Iter + current noder.Path // nil if no more nodes + } + hashEqual noder.Equal +} + +// NewdoubleIter returns a new doubleIter for the merkletries "from" and +// "to". The hashEqual callback function will be used by the doubleIter +// to compare the hash of the noders in the merkletries. The doubleIter +// will be initialized to the first elements in each merkletrie if any. +func newDoubleIter(from, to noder.Noder, hashEqual noder.Equal) ( + *doubleIter, error) { + var ii doubleIter + var err error + + if ii.from.iter, err = NewIter(from); err != nil { + return nil, fmt.Errorf("from: %s", err) + } + if ii.from.current, err = ii.from.iter.Next(); turnEOFIntoNil(err) != nil { + return nil, fmt.Errorf("from: %s", err) + } + + if ii.to.iter, err = NewIter(to); err != nil { + return nil, fmt.Errorf("to: %s", err) + } + if ii.to.current, err = ii.to.iter.Next(); turnEOFIntoNil(err) != nil { + return nil, fmt.Errorf("to: %s", err) + } + + ii.hashEqual = hashEqual + + return &ii, nil +} + +func turnEOFIntoNil(e error) error { + if e != nil && e != io.EOF { + return e + } + return nil +} + +// NextBoth makes d advance to the next noder in both merkletries. If +// any of them is a directory, it skips its contents. +func (d *doubleIter) nextBoth() error { + if err := d.nextFrom(); err != nil { + return err + } + if err := d.nextTo(); err != nil { + return err + } + + return nil +} + +// NextFrom makes d advance to the next noder in the "from" merkletrie, +// skipping its contents if it is a directory. +func (d *doubleIter) nextFrom() (err error) { + d.from.current, err = d.from.iter.Next() + return turnEOFIntoNil(err) +} + +// NextTo makes d advance to the next noder in the "to" merkletrie, +// skipping its contents if it is a directory. +func (d *doubleIter) nextTo() (err error) { + d.to.current, err = d.to.iter.Next() + return turnEOFIntoNil(err) +} + +// StepBoth makes d advance to the next noder in both merkletries, +// getting deeper into directories if that is the case. +func (d *doubleIter) stepBoth() (err error) { + if d.from.current, err = d.from.iter.Step(); turnEOFIntoNil(err) != nil { + return err + } + if d.to.current, err = d.to.iter.Step(); turnEOFIntoNil(err) != nil { + return err + } + return nil +} + +// Remaining returns if there are no more noders in the tree, if both +// have noders or if one of them doesn't. +func (d *doubleIter) remaining() remaining { + if d.from.current == nil && d.to.current == nil { + return noMoreNoders + } + + if d.from.current == nil && d.to.current != nil { + return onlyToRemains + } + + if d.from.current != nil && d.to.current == nil { + return onlyFromRemains + } + + return bothHaveNodes +} + +// Remaining values tells you whether both trees still have noders, or +// only one of them or none of them. +type remaining int + +const ( + noMoreNoders remaining = iota + onlyToRemains + onlyFromRemains + bothHaveNodes +) + +// Compare returns the comparison between the current elements in the +// merkletries. +func (d *doubleIter) compare() (s comparison, err error) { + s.sameHash = d.hashEqual(d.from.current, d.to.current) + + fromIsDir := d.from.current.IsDir() + toIsDir := d.to.current.IsDir() + + s.bothAreDirs = fromIsDir && toIsDir + s.bothAreFiles = !fromIsDir && !toIsDir + s.fileAndDir = !s.bothAreDirs && !s.bothAreFiles + + fromNumChildren, err := d.from.current.NumChildren() + if err != nil { + return comparison{}, fmt.Errorf("from: %s", err) + } + + toNumChildren, err := d.to.current.NumChildren() + if err != nil { + return comparison{}, fmt.Errorf("to: %s", err) + } + + s.fromIsEmptyDir = fromIsDir && fromNumChildren == 0 + s.toIsEmptyDir = toIsDir && toNumChildren == 0 + + return +} + +// Answers to a lot of questions you can ask about how to noders are +// equal or different. +type comparison struct { + // the following are only valid if both nodes have the same name + // (i.e. nameComparison == 0) + + // Do both nodes have the same hash? + sameHash bool + // Are both nodes files? + bothAreFiles bool + + // the following are only valid if any of the noders are dirs, + // this is, if !bothAreFiles + + // Is one a file and the other a dir? + fileAndDir bool + // Are both nodes dirs? + bothAreDirs bool + // Is the from node an empty dir? + fromIsEmptyDir bool + // Is the to Node an empty dir? + toIsEmptyDir bool +} diff --git a/vendor/github.com/go-git/go-git/v5/utils/merkletrie/filesystem/node.go b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/filesystem/node.go new file mode 100644 index 000000000..165bd42fc --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/filesystem/node.go @@ -0,0 +1,196 @@ +package filesystem + +import ( + "io" + "os" + "path" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/filemode" + "github.com/go-git/go-git/v5/utils/merkletrie/noder" + + "github.com/go-git/go-billy/v5" +) + +var ignore = map[string]bool{ + ".git": true, +} + +// The node represents a file or a directory in a billy.Filesystem. It +// implements the interface noder.Noder of merkletrie package. +// +// This implementation implements a "standard" hash method being able to be +// compared with any other noder.Noder implementation inside of go-git. +type node struct { + fs billy.Filesystem + submodules map[string]plumbing.Hash + + path string + hash []byte + children []noder.Noder + isDir bool +} + +// NewRootNode returns the root node based on a given billy.Filesystem. +// +// In order to provide the submodule hash status, a map[string]plumbing.Hash +// should be provided where the key is the path of the submodule and the commit +// of the submodule HEAD +func NewRootNode( + fs billy.Filesystem, + submodules map[string]plumbing.Hash, +) noder.Noder { + return &node{fs: fs, submodules: submodules, isDir: true} +} + +// Hash the hash of a filesystem is the result of concatenating the computed +// plumbing.Hash of the file as a Blob and its plumbing.FileMode; that way the +// difftree algorithm will detect changes in the contents of files and also in +// their mode. +// +// The hash of a directory is always a 24-bytes slice of zero values +func (n *node) Hash() []byte { + return n.hash +} + +func (n *node) Name() string { + return path.Base(n.path) +} + +func (n *node) IsDir() bool { + return n.isDir +} + +func (n *node) Children() ([]noder.Noder, error) { + if err := n.calculateChildren(); err != nil { + return nil, err + } + + return n.children, nil +} + +func (n *node) NumChildren() (int, error) { + if err := n.calculateChildren(); err != nil { + return -1, err + } + + return len(n.children), nil +} + +func (n *node) calculateChildren() error { + if !n.IsDir() { + return nil + } + + if len(n.children) != 0 { + return nil + } + + files, err := n.fs.ReadDir(n.path) + if err != nil { + if os.IsNotExist(err) { + return nil + } + + return nil + } + + for _, file := range files { + if _, ok := ignore[file.Name()]; ok { + continue + } + + c, err := n.newChildNode(file) + if err != nil { + return err + } + + n.children = append(n.children, c) + } + + return nil +} + +func (n *node) newChildNode(file os.FileInfo) (*node, error) { + path := path.Join(n.path, file.Name()) + + hash, err := n.calculateHash(path, file) + if err != nil { + return nil, err + } + + node := &node{ + fs: n.fs, + submodules: n.submodules, + + path: path, + hash: hash, + isDir: file.IsDir(), + } + + if hash, isSubmodule := n.submodules[path]; isSubmodule { + node.hash = append(hash[:], filemode.Submodule.Bytes()...) + node.isDir = false + } + + return node, nil +} + +func (n *node) calculateHash(path string, file os.FileInfo) ([]byte, error) { + if file.IsDir() { + return make([]byte, 24), nil + } + + var hash plumbing.Hash + var err error + if file.Mode()&os.ModeSymlink != 0 { + hash, err = n.doCalculateHashForSymlink(path, file) + } else { + hash, err = n.doCalculateHashForRegular(path, file) + } + + if err != nil { + return nil, err + } + + mode, err := filemode.NewFromOSFileMode(file.Mode()) + if err != nil { + return nil, err + } + + return append(hash[:], mode.Bytes()...), nil +} + +func (n *node) doCalculateHashForRegular(path string, file os.FileInfo) (plumbing.Hash, error) { + f, err := n.fs.Open(path) + if err != nil { + return plumbing.ZeroHash, err + } + + defer f.Close() + + h := plumbing.NewHasher(plumbing.BlobObject, file.Size()) + if _, err := io.Copy(h, f); err != nil { + return plumbing.ZeroHash, err + } + + return h.Sum(), nil +} + +func (n *node) doCalculateHashForSymlink(path string, file os.FileInfo) (plumbing.Hash, error) { + target, err := n.fs.Readlink(path) + if err != nil { + return plumbing.ZeroHash, err + } + + h := plumbing.NewHasher(plumbing.BlobObject, file.Size()) + if _, err := h.Write([]byte(target)); err != nil { + return plumbing.ZeroHash, err + } + + return h.Sum(), nil +} + +func (n *node) String() string { + return n.path +} diff --git a/vendor/github.com/go-git/go-git/v5/utils/merkletrie/index/node.go b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/index/node.go new file mode 100644 index 000000000..d05b0c694 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/index/node.go @@ -0,0 +1,90 @@ +package index + +import ( + "path" + "strings" + + "github.com/go-git/go-git/v5/plumbing/format/index" + "github.com/go-git/go-git/v5/utils/merkletrie/noder" +) + +// The node represents a index.Entry or a directory inferred from the path +// of all entries. It implements the interface noder.Noder of merkletrie +// package. +// +// This implementation implements a "standard" hash method being able to be +// compared with any other noder.Noder implementation inside of go-git +type node struct { + path string + entry *index.Entry + children []noder.Noder + isDir bool +} + +// NewRootNode returns the root node of a computed tree from a index.Index, +func NewRootNode(idx *index.Index) noder.Noder { + const rootNode = "" + + m := map[string]*node{rootNode: {isDir: true}} + + for _, e := range idx.Entries { + parts := strings.Split(e.Name, string("/")) + + var fullpath string + for _, part := range parts { + parent := fullpath + fullpath = path.Join(fullpath, part) + + if _, ok := m[fullpath]; ok { + continue + } + + n := &node{path: fullpath} + if fullpath == e.Name { + n.entry = e + } else { + n.isDir = true + } + + m[n.path] = n + m[parent].children = append(m[parent].children, n) + } + } + + return m[rootNode] +} + +func (n *node) String() string { + return n.path +} + +// Hash the hash of a filesystem is a 24-byte slice, is the result of +// concatenating the computed plumbing.Hash of the file as a Blob and its +// plumbing.FileMode; that way the difftree algorithm will detect changes in the +// contents of files and also in their mode. +// +// If the node is computed and not based on a index.Entry the hash is equals +// to a 24-bytes slices of zero values. +func (n *node) Hash() []byte { + if n.entry == nil { + return make([]byte, 24) + } + + return append(n.entry.Hash[:], n.entry.Mode.Bytes()...) +} + +func (n *node) Name() string { + return path.Base(n.path) +} + +func (n *node) IsDir() bool { + return n.isDir +} + +func (n *node) Children() ([]noder.Noder, error) { + return n.children, nil +} + +func (n *node) NumChildren() (int, error) { + return len(n.children), nil +} diff --git a/vendor/github.com/go-git/go-git/v5/utils/merkletrie/internal/frame/frame.go b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/internal/frame/frame.go new file mode 100644 index 000000000..131878a1c --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/internal/frame/frame.go @@ -0,0 +1,91 @@ +package frame + +import ( + "bytes" + "fmt" + "sort" + "strings" + + "github.com/go-git/go-git/v5/utils/merkletrie/noder" +) + +// A Frame is a collection of siblings in a trie, sorted alphabetically +// by name. +type Frame struct { + // siblings, sorted in reverse alphabetical order by name + stack []noder.Noder +} + +type byName []noder.Noder + +func (a byName) Len() int { return len(a) } +func (a byName) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byName) Less(i, j int) bool { + return strings.Compare(a[i].Name(), a[j].Name()) < 0 +} + +// New returns a frame with the children of the provided node. +func New(n noder.Noder) (*Frame, error) { + children, err := n.Children() + if err != nil { + return nil, err + } + + sort.Sort(sort.Reverse(byName(children))) + return &Frame{ + stack: children, + }, nil +} + +// String returns the quoted names of the noders in the frame sorted in +// alphabetical order by name, surrounded by square brackets and +// separated by comas. +// +// Examples: +// [] +// ["a", "b"] +func (f *Frame) String() string { + var buf bytes.Buffer + _ = buf.WriteByte('[') + + sep := "" + for i := f.Len() - 1; i >= 0; i-- { + _, _ = buf.WriteString(sep) + sep = ", " + _, _ = buf.WriteString(fmt.Sprintf("%q", f.stack[i].Name())) + } + + _ = buf.WriteByte(']') + + return buf.String() +} + +// First returns, but dont extract, the noder with the alphabetically +// smaller name in the frame and true if the frame was not empty. +// Otherwise it returns nil and false. +func (f *Frame) First() (noder.Noder, bool) { + if f.Len() == 0 { + return nil, false + } + + top := f.Len() - 1 + + return f.stack[top], true +} + +// Drop extracts the noder with the alphabetically smaller name in the +// frame or does nothing if the frame was empty. +func (f *Frame) Drop() { + if f.Len() == 0 { + return + } + + top := f.Len() - 1 + f.stack[top] = nil + f.stack = f.stack[:top] +} + +// Len returns the number of noders in the frame. +func (f *Frame) Len() int { + return len(f.stack) +} diff --git a/vendor/github.com/go-git/go-git/v5/utils/merkletrie/iter.go b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/iter.go new file mode 100644 index 000000000..d75afec46 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/iter.go @@ -0,0 +1,216 @@ +package merkletrie + +import ( + "fmt" + "io" + + "github.com/go-git/go-git/v5/utils/merkletrie/internal/frame" + "github.com/go-git/go-git/v5/utils/merkletrie/noder" +) + +// Iter is an iterator for merkletries (only the trie part of the +// merkletrie is relevant here, it does not use the Hasher interface). +// +// The iteration is performed in depth-first pre-order. Entries at each +// depth are traversed in (case-sensitive) alphabetical order. +// +// This is the kind of traversal you will expect when listing ordinary +// files and directories recursively, for example: +// +// Trie Traversal order +// ---- --------------- +// . +// / | \ c +// / | \ d/ +// d c z ===> d/a +// / \ d/b +// b a z +// +// +// This iterator is somewhat especial as you can chose to skip whole +// "directories" when iterating: +// +// - The Step method will iterate normally. +// +// - the Next method will not descend deeper into the tree. +// +// For example, if the iterator is at `d/`, the Step method will return +// `d/a` while the Next would have returned `z` instead (skipping `d/` +// and its descendants). The name of the these two methods are based on +// the well known "next" and "step" operations, quite common in +// debuggers, like gdb. +// +// The paths returned by the iterator will be relative, if the iterator +// was created from a single node, or absolute, if the iterator was +// created from the path to the node (the path will be prefixed to all +// returned paths). +type Iter struct { + // Tells if the iteration has started. + hasStarted bool + // The top of this stack has the current node and its siblings. The + // rest of the stack keeps the ancestors of the current node and + // their corresponding siblings. The current element is always the + // top element of the top frame. + // + // When "step"ping into a node, its children are pushed as a new + // frame. + // + // When "next"ing pass a node, the current element is dropped by + // popping the top frame. + frameStack []*frame.Frame + // The base path used to turn the relative paths used internally by + // the iterator into absolute paths used by external applications. + // For relative iterator this will be nil. + base noder.Path +} + +// NewIter returns a new relative iterator using the provider noder as +// its unnamed root. When iterating, all returned paths will be +// relative to node. +func NewIter(n noder.Noder) (*Iter, error) { + return newIter(n, nil) +} + +// NewIterFromPath returns a new absolute iterator from the noder at the +// end of the path p. When iterating, all returned paths will be +// absolute, using the root of the path p as their root. +func NewIterFromPath(p noder.Path) (*Iter, error) { + return newIter(p, p) // Path implements Noder +} + +func newIter(root noder.Noder, base noder.Path) (*Iter, error) { + ret := &Iter{ + base: base, + } + + if root == nil { + return ret, nil + } + + frame, err := frame.New(root) + if err != nil { + return nil, err + } + ret.push(frame) + + return ret, nil +} + +func (iter *Iter) top() (*frame.Frame, bool) { + if len(iter.frameStack) == 0 { + return nil, false + } + top := len(iter.frameStack) - 1 + + return iter.frameStack[top], true +} + +func (iter *Iter) push(f *frame.Frame) { + iter.frameStack = append(iter.frameStack, f) +} + +const ( + doDescend = true + dontDescend = false +) + +// Next returns the path of the next node without descending deeper into +// the trie and nil. If there are no more entries in the trie it +// returns nil and io.EOF. In case of error, it will return nil and the +// error. +func (iter *Iter) Next() (noder.Path, error) { + return iter.advance(dontDescend) +} + +// Step returns the path to the next node in the trie, descending deeper +// into it if needed, and nil. If there are no more nodes in the trie, +// it returns nil and io.EOF. In case of error, it will return nil and +// the error. +func (iter *Iter) Step() (noder.Path, error) { + return iter.advance(doDescend) +} + +// Advances the iterator in the desired direction: descend or +// dontDescend. +// +// Returns the new current element and a nil error on success. If there +// are no more elements in the trie below the base, it returns nil, and +// io.EOF. Returns nil and an error in case of errors. +func (iter *Iter) advance(wantDescend bool) (noder.Path, error) { + current, err := iter.current() + if err != nil { + return nil, err + } + + // The first time we just return the current node. + if !iter.hasStarted { + iter.hasStarted = true + return current, nil + } + + // Advances means getting a next current node, either its first child or + // its next sibling, depending if we must descend or not. + numChildren, err := current.NumChildren() + if err != nil { + return nil, err + } + + mustDescend := numChildren != 0 && wantDescend + if mustDescend { + // descend: add a new frame with the current's children. + frame, err := frame.New(current) + if err != nil { + return nil, err + } + iter.push(frame) + } else { + // don't descend: just drop the current node + iter.drop() + } + + return iter.current() +} + +// Returns the path to the current node, adding the base if there was +// one, and a nil error. If there were no noders left, it returns nil +// and io.EOF. If an error occurred, it returns nil and the error. +func (iter *Iter) current() (noder.Path, error) { + if topFrame, ok := iter.top(); !ok { + return nil, io.EOF + } else if _, ok := topFrame.First(); !ok { + return nil, io.EOF + } + + ret := make(noder.Path, 0, len(iter.base)+len(iter.frameStack)) + + // concat the base... + ret = append(ret, iter.base...) + // ... and the current node and all its ancestors + for i, f := range iter.frameStack { + t, ok := f.First() + if !ok { + panic(fmt.Sprintf("frame %d is empty", i)) + } + ret = append(ret, t) + } + + return ret, nil +} + +// removes the current node if any, and all the frames that become empty as a +// consequence of this action. +func (iter *Iter) drop() { + frame, ok := iter.top() + if !ok { + return + } + + frame.Drop() + // if the frame is empty, remove it and its parent, recursively + if frame.Len() == 0 { + top := len(iter.frameStack) - 1 + iter.frameStack[top] = nil + iter.frameStack = iter.frameStack[:top] + iter.drop() + } +} diff --git a/vendor/github.com/go-git/go-git/v5/utils/merkletrie/noder/noder.go b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/noder/noder.go new file mode 100644 index 000000000..d6b3de4ad --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/noder/noder.go @@ -0,0 +1,59 @@ +// Package noder provide an interface for defining nodes in a +// merkletrie, their hashes and their paths (a noders and its +// ancestors). +// +// The hasher interface is easy to implement naively by elements that +// already have a hash, like git blobs and trees. More sophisticated +// implementations can implement the Equal function in exotic ways +// though: for instance, comparing the modification time of directories +// in a filesystem. +package noder + +import "fmt" + +// Hasher interface is implemented by types that can tell you +// their hash. +type Hasher interface { + Hash() []byte +} + +// Equal functions take two hashers and return if they are equal. +// +// These functions are expected to be faster than reflect.Equal or +// reflect.DeepEqual because they can compare just the hash of the +// objects, instead of their contents, so they are expected to be O(1). +type Equal func(a, b Hasher) bool + +// The Noder interface is implemented by the elements of a Merkle Trie. +// +// There are two types of elements in a Merkle Trie: +// +// - file-like nodes: they cannot have children. +// +// - directory-like nodes: they can have 0 or more children and their +// hash is calculated by combining their children hashes. +type Noder interface { + Hasher + fmt.Stringer // for testing purposes + // Name returns the name of an element (relative, not its full + // path). + Name() string + // IsDir returns true if the element is a directory-like node or + // false if it is a file-like node. + IsDir() bool + // Children returns the children of the element. Note that empty + // directory-like noders and file-like noders will both return + // NoChildren. + Children() ([]Noder, error) + // NumChildren returns the number of children this element has. + // + // This method is an optimization: the number of children is easily + // calculated as the length of the value returned by the Children + // method (above); yet, some implementations will be able to + // implement NumChildren in O(1) while Children is usually more + // complex. + NumChildren() (int, error) +} + +// NoChildren represents the children of a noder without children. +var NoChildren = []Noder{} diff --git a/vendor/github.com/go-git/go-git/v5/utils/merkletrie/noder/path.go b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/noder/path.go new file mode 100644 index 000000000..1c7ef54ee --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/noder/path.go @@ -0,0 +1,90 @@ +package noder + +import ( + "bytes" + "strings" +) + +// Path values represent a noder and its ancestors. The root goes first +// and the actual final noder the path is referring to will be the last. +// +// A path implements the Noder interface, redirecting all the interface +// calls to its final noder. +// +// Paths build from an empty Noder slice are not valid paths and should +// not be used. +type Path []Noder + +// String returns the full path of the final noder as a string, using +// "/" as the separator. +func (p Path) String() string { + var buf bytes.Buffer + sep := "" + for _, e := range p { + _, _ = buf.WriteString(sep) + sep = "/" + _, _ = buf.WriteString(e.Name()) + } + + return buf.String() +} + +// Last returns the final noder in the path. +func (p Path) Last() Noder { + return p[len(p)-1] +} + +// Hash returns the hash of the final noder of the path. +func (p Path) Hash() []byte { + return p.Last().Hash() +} + +// Name returns the name of the final noder of the path. +func (p Path) Name() string { + return p.Last().Name() +} + +// IsDir returns if the final noder of the path is a directory-like +// noder. +func (p Path) IsDir() bool { + return p.Last().IsDir() +} + +// Children returns the children of the final noder in the path. +func (p Path) Children() ([]Noder, error) { + return p.Last().Children() +} + +// NumChildren returns the number of children the final noder of the +// path has. +func (p Path) NumChildren() (int, error) { + return p.Last().NumChildren() +} + +// Compare returns -1, 0 or 1 if the path p is smaller, equal or bigger +// than other, in "directory order"; for example: +// +// "a" < "b" +// "a/b/c/d/z" < "b" +// "a/b/a" > "a/b" +func (p Path) Compare(other Path) int { + i := 0 + for { + switch { + case len(other) == len(p) && i == len(p): + return 0 + case i == len(other): + return 1 + case i == len(p): + return -1 + default: + // We do *not* normalize Unicode here. CGit doesn't. + // https://github.com/src-d/go-git/issues/1057 + cmp := strings.Compare(p[i].Name(), other[i].Name()) + if cmp != 0 { + return cmp + } + } + i++ + } +} diff --git a/vendor/github.com/go-git/go-git/v5/worktree.go b/vendor/github.com/go-git/go-git/v5/worktree.go new file mode 100644 index 000000000..7f394d484 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/worktree.go @@ -0,0 +1,954 @@ +package git + +import ( + "context" + "errors" + "fmt" + "io" + stdioutil "io/ioutil" + "os" + "path/filepath" + "strings" + "sync" + + "github.com/go-git/go-git/v5/config" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/filemode" + "github.com/go-git/go-git/v5/plumbing/format/gitignore" + "github.com/go-git/go-git/v5/plumbing/format/index" + "github.com/go-git/go-git/v5/plumbing/object" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/utils/ioutil" + "github.com/go-git/go-git/v5/utils/merkletrie" + + "github.com/go-git/go-billy/v5" + "github.com/go-git/go-billy/v5/util" +) + +var ( + ErrWorktreeNotClean = errors.New("worktree is not clean") + ErrSubmoduleNotFound = errors.New("submodule not found") + ErrUnstagedChanges = errors.New("worktree contains unstaged changes") + ErrGitModulesSymlink = errors.New(gitmodulesFile + " is a symlink") + ErrNonFastForwardUpdate = errors.New("non-fast-forward update") +) + +// Worktree represents a git worktree. +type Worktree struct { + // Filesystem underlying filesystem. + Filesystem billy.Filesystem + // External excludes not found in the repository .gitignore + Excludes []gitignore.Pattern + + r *Repository +} + +// Pull incorporates changes from a remote repository into the current branch. +// Returns nil if the operation is successful, NoErrAlreadyUpToDate if there are +// no changes to be fetched, or an error. +// +// Pull only supports merges where the can be resolved as a fast-forward. +func (w *Worktree) Pull(o *PullOptions) error { + return w.PullContext(context.Background(), o) +} + +// PullContext incorporates changes from a remote repository into the current +// branch. Returns nil if the operation is successful, NoErrAlreadyUpToDate if +// there are no changes to be fetched, or an error. +// +// Pull only supports merges where the can be resolved as a fast-forward. +// +// The provided Context must be non-nil. If the context expires before the +// operation is complete, an error is returned. The context only affects to the +// transport operations. +func (w *Worktree) PullContext(ctx context.Context, o *PullOptions) error { + if err := o.Validate(); err != nil { + return err + } + + remote, err := w.r.Remote(o.RemoteName) + if err != nil { + return err + } + + fetchHead, err := remote.fetch(ctx, &FetchOptions{ + RemoteName: o.RemoteName, + Depth: o.Depth, + Auth: o.Auth, + Progress: o.Progress, + Force: o.Force, + }) + + updated := true + if err == NoErrAlreadyUpToDate { + updated = false + } else if err != nil { + return err + } + + ref, err := storer.ResolveReference(fetchHead, o.ReferenceName) + if err != nil { + return err + } + + head, err := w.r.Head() + if err == nil { + if !updated && head.Hash() == ref.Hash() { + return NoErrAlreadyUpToDate + } + + ff, err := isFastForward(w.r.Storer, head.Hash(), ref.Hash()) + if err != nil { + return err + } + + if !ff { + return ErrNonFastForwardUpdate + } + } + + if err != nil && err != plumbing.ErrReferenceNotFound { + return err + } + + if err := w.updateHEAD(ref.Hash()); err != nil { + return err + } + + if err := w.Reset(&ResetOptions{ + Mode: MergeReset, + Commit: ref.Hash(), + }); err != nil { + return err + } + + if o.RecurseSubmodules != NoRecurseSubmodules { + return w.updateSubmodules(&SubmoduleUpdateOptions{ + RecurseSubmodules: o.RecurseSubmodules, + Auth: o.Auth, + }) + } + + return nil +} + +func (w *Worktree) updateSubmodules(o *SubmoduleUpdateOptions) error { + s, err := w.Submodules() + if err != nil { + return err + } + o.Init = true + return s.Update(o) +} + +// Checkout switch branches or restore working tree files. +func (w *Worktree) Checkout(opts *CheckoutOptions) error { + if err := opts.Validate(); err != nil { + return err + } + + if opts.Create { + if err := w.createBranch(opts); err != nil { + return err + } + } + + c, err := w.getCommitFromCheckoutOptions(opts) + if err != nil { + return err + } + + ro := &ResetOptions{Commit: c, Mode: MergeReset} + if opts.Force { + ro.Mode = HardReset + } else if opts.Keep { + ro.Mode = SoftReset + } + + if !opts.Hash.IsZero() && !opts.Create { + err = w.setHEADToCommit(opts.Hash) + } else { + err = w.setHEADToBranch(opts.Branch, c) + } + + if err != nil { + return err + } + + return w.Reset(ro) +} +func (w *Worktree) createBranch(opts *CheckoutOptions) error { + _, err := w.r.Storer.Reference(opts.Branch) + if err == nil { + return fmt.Errorf("a branch named %q already exists", opts.Branch) + } + + if err != plumbing.ErrReferenceNotFound { + return err + } + + if opts.Hash.IsZero() { + ref, err := w.r.Head() + if err != nil { + return err + } + + opts.Hash = ref.Hash() + } + + return w.r.Storer.SetReference( + plumbing.NewHashReference(opts.Branch, opts.Hash), + ) +} + +func (w *Worktree) getCommitFromCheckoutOptions(opts *CheckoutOptions) (plumbing.Hash, error) { + if !opts.Hash.IsZero() { + return opts.Hash, nil + } + + b, err := w.r.Reference(opts.Branch, true) + if err != nil { + return plumbing.ZeroHash, err + } + + if !b.Name().IsTag() { + return b.Hash(), nil + } + + o, err := w.r.Object(plumbing.AnyObject, b.Hash()) + if err != nil { + return plumbing.ZeroHash, err + } + + switch o := o.(type) { + case *object.Tag: + if o.TargetType != plumbing.CommitObject { + return plumbing.ZeroHash, fmt.Errorf("unsupported tag object target %q", o.TargetType) + } + + return o.Target, nil + case *object.Commit: + return o.Hash, nil + } + + return plumbing.ZeroHash, fmt.Errorf("unsupported tag target %q", o.Type()) +} + +func (w *Worktree) setHEADToCommit(commit plumbing.Hash) error { + head := plumbing.NewHashReference(plumbing.HEAD, commit) + return w.r.Storer.SetReference(head) +} + +func (w *Worktree) setHEADToBranch(branch plumbing.ReferenceName, commit plumbing.Hash) error { + target, err := w.r.Storer.Reference(branch) + if err != nil { + return err + } + + var head *plumbing.Reference + if target.Name().IsBranch() { + head = plumbing.NewSymbolicReference(plumbing.HEAD, target.Name()) + } else { + head = plumbing.NewHashReference(plumbing.HEAD, commit) + } + + return w.r.Storer.SetReference(head) +} + +// Reset the worktree to a specified state. +func (w *Worktree) Reset(opts *ResetOptions) error { + if err := opts.Validate(w.r); err != nil { + return err + } + + if opts.Mode == MergeReset { + unstaged, err := w.containsUnstagedChanges() + if err != nil { + return err + } + + if unstaged { + return ErrUnstagedChanges + } + } + + if err := w.setHEADCommit(opts.Commit); err != nil { + return err + } + + if opts.Mode == SoftReset { + return nil + } + + t, err := w.getTreeFromCommitHash(opts.Commit) + if err != nil { + return err + } + + if opts.Mode == MixedReset || opts.Mode == MergeReset || opts.Mode == HardReset { + if err := w.resetIndex(t); err != nil { + return err + } + } + + if opts.Mode == MergeReset || opts.Mode == HardReset { + if err := w.resetWorktree(t); err != nil { + return err + } + } + + return nil +} + +func (w *Worktree) resetIndex(t *object.Tree) error { + idx, err := w.r.Storer.Index() + if err != nil { + return err + } + b := newIndexBuilder(idx) + + changes, err := w.diffTreeWithStaging(t, true) + if err != nil { + return err + } + + for _, ch := range changes { + a, err := ch.Action() + if err != nil { + return err + } + + var name string + var e *object.TreeEntry + + switch a { + case merkletrie.Modify, merkletrie.Insert: + name = ch.To.String() + e, err = t.FindEntry(name) + if err != nil { + return err + } + case merkletrie.Delete: + name = ch.From.String() + } + + b.Remove(name) + if e == nil { + continue + } + + b.Add(&index.Entry{ + Name: name, + Hash: e.Hash, + Mode: e.Mode, + }) + + } + + b.Write(idx) + return w.r.Storer.SetIndex(idx) +} + +func (w *Worktree) resetWorktree(t *object.Tree) error { + changes, err := w.diffStagingWithWorktree(true) + if err != nil { + return err + } + + idx, err := w.r.Storer.Index() + if err != nil { + return err + } + b := newIndexBuilder(idx) + + for _, ch := range changes { + if err := w.checkoutChange(ch, t, b); err != nil { + return err + } + } + + b.Write(idx) + return w.r.Storer.SetIndex(idx) +} + +func (w *Worktree) checkoutChange(ch merkletrie.Change, t *object.Tree, idx *indexBuilder) error { + a, err := ch.Action() + if err != nil { + return err + } + + var e *object.TreeEntry + var name string + var isSubmodule bool + + switch a { + case merkletrie.Modify, merkletrie.Insert: + name = ch.To.String() + e, err = t.FindEntry(name) + if err != nil { + return err + } + + isSubmodule = e.Mode == filemode.Submodule + case merkletrie.Delete: + return rmFileAndDirIfEmpty(w.Filesystem, ch.From.String()) + } + + if isSubmodule { + return w.checkoutChangeSubmodule(name, a, e, idx) + } + + return w.checkoutChangeRegularFile(name, a, t, e, idx) +} + +func (w *Worktree) containsUnstagedChanges() (bool, error) { + ch, err := w.diffStagingWithWorktree(false) + if err != nil { + return false, err + } + + for _, c := range ch { + a, err := c.Action() + if err != nil { + return false, err + } + + if a == merkletrie.Insert { + continue + } + + return true, nil + } + + return false, nil +} + +func (w *Worktree) setHEADCommit(commit plumbing.Hash) error { + head, err := w.r.Reference(plumbing.HEAD, false) + if err != nil { + return err + } + + if head.Type() == plumbing.HashReference { + head = plumbing.NewHashReference(plumbing.HEAD, commit) + return w.r.Storer.SetReference(head) + } + + branch, err := w.r.Reference(head.Target(), false) + if err != nil { + return err + } + + if !branch.Name().IsBranch() { + return fmt.Errorf("invalid HEAD target should be a branch, found %s", branch.Type()) + } + + branch = plumbing.NewHashReference(branch.Name(), commit) + return w.r.Storer.SetReference(branch) +} + +func (w *Worktree) checkoutChangeSubmodule(name string, + a merkletrie.Action, + e *object.TreeEntry, + idx *indexBuilder, +) error { + switch a { + case merkletrie.Modify: + sub, err := w.Submodule(name) + if err != nil { + return err + } + + if !sub.initialized { + return nil + } + + return w.addIndexFromTreeEntry(name, e, idx) + case merkletrie.Insert: + mode, err := e.Mode.ToOSFileMode() + if err != nil { + return err + } + + if err := w.Filesystem.MkdirAll(name, mode); err != nil { + return err + } + + return w.addIndexFromTreeEntry(name, e, idx) + } + + return nil +} + +func (w *Worktree) checkoutChangeRegularFile(name string, + a merkletrie.Action, + t *object.Tree, + e *object.TreeEntry, + idx *indexBuilder, +) error { + switch a { + case merkletrie.Modify: + idx.Remove(name) + + // to apply perm changes the file is deleted, billy doesn't implement + // chmod + if err := w.Filesystem.Remove(name); err != nil { + return err + } + + fallthrough + case merkletrie.Insert: + f, err := t.File(name) + if err != nil { + return err + } + + if err := w.checkoutFile(f); err != nil { + return err + } + + return w.addIndexFromFile(name, e.Hash, idx) + } + + return nil +} + +var copyBufferPool = sync.Pool{ + New: func() interface{} { + return make([]byte, 32*1024) + }, +} + +func (w *Worktree) checkoutFile(f *object.File) (err error) { + mode, err := f.Mode.ToOSFileMode() + if err != nil { + return + } + + if mode&os.ModeSymlink != 0 { + return w.checkoutFileSymlink(f) + } + + from, err := f.Reader() + if err != nil { + return + } + + defer ioutil.CheckClose(from, &err) + + to, err := w.Filesystem.OpenFile(f.Name, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, mode.Perm()) + if err != nil { + return + } + + defer ioutil.CheckClose(to, &err) + buf := copyBufferPool.Get().([]byte) + _, err = io.CopyBuffer(to, from, buf) + copyBufferPool.Put(buf) + return +} + +func (w *Worktree) checkoutFileSymlink(f *object.File) (err error) { + from, err := f.Reader() + if err != nil { + return + } + + defer ioutil.CheckClose(from, &err) + + bytes, err := stdioutil.ReadAll(from) + if err != nil { + return + } + + err = w.Filesystem.Symlink(string(bytes), f.Name) + + // On windows, this might fail. + // Follow Git on Windows behavior by writing the link as it is. + if err != nil && isSymlinkWindowsNonAdmin(err) { + mode, _ := f.Mode.ToOSFileMode() + + to, err := w.Filesystem.OpenFile(f.Name, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, mode.Perm()) + if err != nil { + return err + } + + defer ioutil.CheckClose(to, &err) + + _, err = to.Write(bytes) + return err + } + return +} + +func (w *Worktree) addIndexFromTreeEntry(name string, f *object.TreeEntry, idx *indexBuilder) error { + idx.Remove(name) + idx.Add(&index.Entry{ + Hash: f.Hash, + Name: name, + Mode: filemode.Submodule, + }) + return nil +} + +func (w *Worktree) addIndexFromFile(name string, h plumbing.Hash, idx *indexBuilder) error { + idx.Remove(name) + fi, err := w.Filesystem.Lstat(name) + if err != nil { + return err + } + + mode, err := filemode.NewFromOSFileMode(fi.Mode()) + if err != nil { + return err + } + + e := &index.Entry{ + Hash: h, + Name: name, + Mode: mode, + ModifiedAt: fi.ModTime(), + Size: uint32(fi.Size()), + } + + // if the FileInfo.Sys() comes from os the ctime, dev, inode, uid and gid + // can be retrieved, otherwise this doesn't apply + if fillSystemInfo != nil { + fillSystemInfo(e, fi.Sys()) + } + idx.Add(e) + return nil +} + +func (w *Worktree) getTreeFromCommitHash(commit plumbing.Hash) (*object.Tree, error) { + c, err := w.r.CommitObject(commit) + if err != nil { + return nil, err + } + + return c.Tree() +} + +var fillSystemInfo func(e *index.Entry, sys interface{}) + +const gitmodulesFile = ".gitmodules" + +// Submodule returns the submodule with the given name +func (w *Worktree) Submodule(name string) (*Submodule, error) { + l, err := w.Submodules() + if err != nil { + return nil, err + } + + for _, m := range l { + if m.Config().Name == name { + return m, nil + } + } + + return nil, ErrSubmoduleNotFound +} + +// Submodules returns all the available submodules +func (w *Worktree) Submodules() (Submodules, error) { + l := make(Submodules, 0) + m, err := w.readGitmodulesFile() + if err != nil || m == nil { + return l, err + } + + c, err := w.r.Config() + if err != nil { + return nil, err + } + + for _, s := range m.Submodules { + l = append(l, w.newSubmodule(s, c.Submodules[s.Name])) + } + + return l, nil +} + +func (w *Worktree) newSubmodule(fromModules, fromConfig *config.Submodule) *Submodule { + m := &Submodule{w: w} + m.initialized = fromConfig != nil + + if !m.initialized { + m.c = fromModules + return m + } + + m.c = fromConfig + m.c.Path = fromModules.Path + return m +} + +func (w *Worktree) isSymlink(path string) bool { + if s, err := w.Filesystem.Lstat(path); err == nil { + return s.Mode()&os.ModeSymlink != 0 + } + return false +} + +func (w *Worktree) readGitmodulesFile() (*config.Modules, error) { + if w.isSymlink(gitmodulesFile) { + return nil, ErrGitModulesSymlink + } + + f, err := w.Filesystem.Open(gitmodulesFile) + if err != nil { + if os.IsNotExist(err) { + return nil, nil + } + + return nil, err + } + + defer f.Close() + input, err := stdioutil.ReadAll(f) + if err != nil { + return nil, err + } + + m := config.NewModules() + return m, m.Unmarshal(input) +} + +// Clean the worktree by removing untracked files. +// An empty dir could be removed - this is what `git clean -f -d .` does. +func (w *Worktree) Clean(opts *CleanOptions) error { + s, err := w.Status() + if err != nil { + return err + } + + root := "" + files, err := w.Filesystem.ReadDir(root) + if err != nil { + return err + } + return w.doClean(s, opts, root, files) +} + +func (w *Worktree) doClean(status Status, opts *CleanOptions, dir string, files []os.FileInfo) error { + for _, fi := range files { + if fi.Name() == GitDirName { + continue + } + + // relative path under the root + path := filepath.Join(dir, fi.Name()) + if fi.IsDir() { + if !opts.Dir { + continue + } + + subfiles, err := w.Filesystem.ReadDir(path) + if err != nil { + return err + } + err = w.doClean(status, opts, path, subfiles) + if err != nil { + return err + } + } else { + if status.IsUntracked(path) { + if err := w.Filesystem.Remove(path); err != nil { + return err + } + } + } + } + + if opts.Dir { + return doCleanDirectories(w.Filesystem, dir) + } + return nil +} + +// GrepResult is structure of a grep result. +type GrepResult struct { + // FileName is the name of file which contains match. + FileName string + // LineNumber is the line number of a file at which a match was found. + LineNumber int + // Content is the content of the file at the matching line. + Content string + // TreeName is the name of the tree (reference name/commit hash) at + // which the match was performed. + TreeName string +} + +func (gr GrepResult) String() string { + return fmt.Sprintf("%s:%s:%d:%s", gr.TreeName, gr.FileName, gr.LineNumber, gr.Content) +} + +// Grep performs grep on a worktree. +func (w *Worktree) Grep(opts *GrepOptions) ([]GrepResult, error) { + if err := opts.Validate(w); err != nil { + return nil, err + } + + // Obtain commit hash from options (CommitHash or ReferenceName). + var commitHash plumbing.Hash + // treeName contains the value of TreeName in GrepResult. + var treeName string + + if opts.ReferenceName != "" { + ref, err := w.r.Reference(opts.ReferenceName, true) + if err != nil { + return nil, err + } + commitHash = ref.Hash() + treeName = opts.ReferenceName.String() + } else if !opts.CommitHash.IsZero() { + commitHash = opts.CommitHash + treeName = opts.CommitHash.String() + } + + // Obtain a tree from the commit hash and get a tracked files iterator from + // the tree. + tree, err := w.getTreeFromCommitHash(commitHash) + if err != nil { + return nil, err + } + fileiter := tree.Files() + + return findMatchInFiles(fileiter, treeName, opts) +} + +// findMatchInFiles takes a FileIter, worktree name and GrepOptions, and +// returns a slice of GrepResult containing the result of regex pattern matching +// in content of all the files. +func findMatchInFiles(fileiter *object.FileIter, treeName string, opts *GrepOptions) ([]GrepResult, error) { + var results []GrepResult + + err := fileiter.ForEach(func(file *object.File) error { + var fileInPathSpec bool + + // When no pathspecs are provided, search all the files. + if len(opts.PathSpecs) == 0 { + fileInPathSpec = true + } + + // Check if the file name matches with the pathspec. Break out of the + // loop once a match is found. + for _, pathSpec := range opts.PathSpecs { + if pathSpec != nil && pathSpec.MatchString(file.Name) { + fileInPathSpec = true + break + } + } + + // If the file does not match with any of the pathspec, skip it. + if !fileInPathSpec { + return nil + } + + grepResults, err := findMatchInFile(file, treeName, opts) + if err != nil { + return err + } + results = append(results, grepResults...) + + return nil + }) + + return results, err +} + +// findMatchInFile takes a single File, worktree name and GrepOptions, +// and returns a slice of GrepResult containing the result of regex pattern +// matching in the given file. +func findMatchInFile(file *object.File, treeName string, opts *GrepOptions) ([]GrepResult, error) { + var grepResults []GrepResult + + content, err := file.Contents() + if err != nil { + return grepResults, err + } + + // Split the file content and parse line-by-line. + contentByLine := strings.Split(content, "\n") + for lineNum, cnt := range contentByLine { + addToResult := false + + // Match the patterns and content. Break out of the loop once a + // match is found. + for _, pattern := range opts.Patterns { + if pattern != nil && pattern.MatchString(cnt) { + // Add to result only if invert match is not enabled. + if !opts.InvertMatch { + addToResult = true + break + } + } else if opts.InvertMatch { + // If matching fails, and invert match is enabled, add to + // results. + addToResult = true + break + } + } + + if addToResult { + grepResults = append(grepResults, GrepResult{ + FileName: file.Name, + LineNumber: lineNum + 1, + Content: cnt, + TreeName: treeName, + }) + } + } + + return grepResults, nil +} + +func rmFileAndDirIfEmpty(fs billy.Filesystem, name string) error { + if err := util.RemoveAll(fs, name); err != nil { + return err + } + + dir := filepath.Dir(name) + return doCleanDirectories(fs, dir) +} + +// doCleanDirectories removes empty subdirs (without files) +func doCleanDirectories(fs billy.Filesystem, dir string) error { + files, err := fs.ReadDir(dir) + if err != nil { + return err + } + if len(files) == 0 { + return fs.Remove(dir) + } + return nil +} + +type indexBuilder struct { + entries map[string]*index.Entry +} + +func newIndexBuilder(idx *index.Index) *indexBuilder { + entries := make(map[string]*index.Entry, len(idx.Entries)) + for _, e := range idx.Entries { + entries[e.Name] = e + } + return &indexBuilder{ + entries: entries, + } +} + +func (b *indexBuilder) Write(idx *index.Index) { + idx.Entries = idx.Entries[:0] + for _, e := range b.entries { + idx.Entries = append(idx.Entries, e) + } +} + +func (b *indexBuilder) Add(e *index.Entry) { + b.entries[e.Name] = e +} + +func (b *indexBuilder) Remove(name string) { + delete(b.entries, filepath.ToSlash(name)) +} diff --git a/vendor/github.com/go-git/go-git/v5/worktree_bsd.go b/vendor/github.com/go-git/go-git/v5/worktree_bsd.go new file mode 100644 index 000000000..d4ea32758 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/worktree_bsd.go @@ -0,0 +1,26 @@ +// +build darwin freebsd netbsd + +package git + +import ( + "syscall" + "time" + + "github.com/go-git/go-git/v5/plumbing/format/index" +) + +func init() { + fillSystemInfo = func(e *index.Entry, sys interface{}) { + if os, ok := sys.(*syscall.Stat_t); ok { + e.CreatedAt = time.Unix(int64(os.Atimespec.Sec), int64(os.Atimespec.Nsec)) + e.Dev = uint32(os.Dev) + e.Inode = uint32(os.Ino) + e.GID = os.Gid + e.UID = os.Uid + } + } +} + +func isSymlinkWindowsNonAdmin(err error) bool { + return false +} diff --git a/vendor/github.com/go-git/go-git/v5/worktree_commit.go b/vendor/github.com/go-git/go-git/v5/worktree_commit.go new file mode 100644 index 000000000..63eb2e867 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/worktree_commit.go @@ -0,0 +1,228 @@ +package git + +import ( + "bytes" + "path" + "sort" + "strings" + + "golang.org/x/crypto/openpgp" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/filemode" + "github.com/go-git/go-git/v5/plumbing/format/index" + "github.com/go-git/go-git/v5/plumbing/object" + "github.com/go-git/go-git/v5/storage" + + "github.com/go-git/go-billy/v5" +) + +// Commit stores the current contents of the index in a new commit along with +// a log message from the user describing the changes. +func (w *Worktree) Commit(msg string, opts *CommitOptions) (plumbing.Hash, error) { + if err := opts.Validate(w.r); err != nil { + return plumbing.ZeroHash, err + } + + if opts.All { + if err := w.autoAddModifiedAndDeleted(); err != nil { + return plumbing.ZeroHash, err + } + } + + idx, err := w.r.Storer.Index() + if err != nil { + return plumbing.ZeroHash, err + } + + h := &buildTreeHelper{ + fs: w.Filesystem, + s: w.r.Storer, + } + + tree, err := h.BuildTree(idx) + if err != nil { + return plumbing.ZeroHash, err + } + + commit, err := w.buildCommitObject(msg, opts, tree) + if err != nil { + return plumbing.ZeroHash, err + } + + return commit, w.updateHEAD(commit) +} + +func (w *Worktree) autoAddModifiedAndDeleted() error { + s, err := w.Status() + if err != nil { + return err + } + + for path, fs := range s { + if fs.Worktree != Modified && fs.Worktree != Deleted { + continue + } + + if _, err := w.Add(path); err != nil { + return err + } + } + + return nil +} + +func (w *Worktree) updateHEAD(commit plumbing.Hash) error { + head, err := w.r.Storer.Reference(plumbing.HEAD) + if err != nil { + return err + } + + name := plumbing.HEAD + if head.Type() != plumbing.HashReference { + name = head.Target() + } + + ref := plumbing.NewHashReference(name, commit) + return w.r.Storer.SetReference(ref) +} + +func (w *Worktree) buildCommitObject(msg string, opts *CommitOptions, tree plumbing.Hash) (plumbing.Hash, error) { + commit := &object.Commit{ + Author: *opts.Author, + Committer: *opts.Committer, + Message: msg, + TreeHash: tree, + ParentHashes: opts.Parents, + } + + if opts.SignKey != nil { + sig, err := w.buildCommitSignature(commit, opts.SignKey) + if err != nil { + return plumbing.ZeroHash, err + } + commit.PGPSignature = sig + } + + obj := w.r.Storer.NewEncodedObject() + if err := commit.Encode(obj); err != nil { + return plumbing.ZeroHash, err + } + return w.r.Storer.SetEncodedObject(obj) +} + +func (w *Worktree) buildCommitSignature(commit *object.Commit, signKey *openpgp.Entity) (string, error) { + encoded := &plumbing.MemoryObject{} + if err := commit.Encode(encoded); err != nil { + return "", err + } + r, err := encoded.Reader() + if err != nil { + return "", err + } + var b bytes.Buffer + if err := openpgp.ArmoredDetachSign(&b, signKey, r, nil); err != nil { + return "", err + } + return b.String(), nil +} + +// buildTreeHelper converts a given index.Index file into multiple git objects +// reading the blobs from the given filesystem and creating the trees from the +// index structure. The created objects are pushed to a given Storer. +type buildTreeHelper struct { + fs billy.Filesystem + s storage.Storer + + trees map[string]*object.Tree + entries map[string]*object.TreeEntry +} + +// BuildTree builds the tree objects and push its to the storer, the hash +// of the root tree is returned. +func (h *buildTreeHelper) BuildTree(idx *index.Index) (plumbing.Hash, error) { + const rootNode = "" + h.trees = map[string]*object.Tree{rootNode: {}} + h.entries = map[string]*object.TreeEntry{} + + for _, e := range idx.Entries { + if err := h.commitIndexEntry(e); err != nil { + return plumbing.ZeroHash, err + } + } + + return h.copyTreeToStorageRecursive(rootNode, h.trees[rootNode]) +} + +func (h *buildTreeHelper) commitIndexEntry(e *index.Entry) error { + parts := strings.Split(e.Name, "/") + + var fullpath string + for _, part := range parts { + parent := fullpath + fullpath = path.Join(fullpath, part) + + h.doBuildTree(e, parent, fullpath) + } + + return nil +} + +func (h *buildTreeHelper) doBuildTree(e *index.Entry, parent, fullpath string) { + if _, ok := h.trees[fullpath]; ok { + return + } + + if _, ok := h.entries[fullpath]; ok { + return + } + + te := object.TreeEntry{Name: path.Base(fullpath)} + + if fullpath == e.Name { + te.Mode = e.Mode + te.Hash = e.Hash + } else { + te.Mode = filemode.Dir + h.trees[fullpath] = &object.Tree{} + } + + h.trees[parent].Entries = append(h.trees[parent].Entries, te) +} + +type sortableEntries []object.TreeEntry + +func (sortableEntries) sortName(te object.TreeEntry) string { + if te.Mode == filemode.Dir { + return te.Name + "/" + } + return te.Name +} +func (se sortableEntries) Len() int { return len(se) } +func (se sortableEntries) Less(i int, j int) bool { return se.sortName(se[i]) < se.sortName(se[j]) } +func (se sortableEntries) Swap(i int, j int) { se[i], se[j] = se[j], se[i] } + +func (h *buildTreeHelper) copyTreeToStorageRecursive(parent string, t *object.Tree) (plumbing.Hash, error) { + sort.Sort(sortableEntries(t.Entries)) + for i, e := range t.Entries { + if e.Mode != filemode.Dir && !e.Hash.IsZero() { + continue + } + + path := path.Join(parent, e.Name) + + var err error + e.Hash, err = h.copyTreeToStorageRecursive(path, h.trees[path]) + if err != nil { + return plumbing.ZeroHash, err + } + + t.Entries[i] = e + } + + o := h.s.NewEncodedObject() + if err := t.Encode(o); err != nil { + return plumbing.ZeroHash, err + } + + return h.s.SetEncodedObject(o) +} diff --git a/vendor/github.com/go-git/go-git/v5/worktree_linux.go b/vendor/github.com/go-git/go-git/v5/worktree_linux.go new file mode 100644 index 000000000..cf0db2524 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/worktree_linux.go @@ -0,0 +1,26 @@ +// +build linux + +package git + +import ( + "syscall" + "time" + + "github.com/go-git/go-git/v5/plumbing/format/index" +) + +func init() { + fillSystemInfo = func(e *index.Entry, sys interface{}) { + if os, ok := sys.(*syscall.Stat_t); ok { + e.CreatedAt = time.Unix(int64(os.Ctim.Sec), int64(os.Ctim.Nsec)) + e.Dev = uint32(os.Dev) + e.Inode = uint32(os.Ino) + e.GID = os.Gid + e.UID = os.Uid + } + } +} + +func isSymlinkWindowsNonAdmin(err error) bool { + return false +} diff --git a/vendor/github.com/go-git/go-git/v5/worktree_plan9.go b/vendor/github.com/go-git/go-git/v5/worktree_plan9.go new file mode 100644 index 000000000..8cedf71a3 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/worktree_plan9.go @@ -0,0 +1,31 @@ +package git + +import ( + "syscall" + "time" + + "github.com/go-git/go-git/v5/plumbing/format/index" +) + +func init() { + fillSystemInfo = func(e *index.Entry, sys interface{}) { + if os, ok := sys.(*syscall.Dir); ok { + // Plan 9 doesn't have a CreatedAt field. + e.CreatedAt = time.Unix(int64(os.Mtime), 0) + + e.Dev = uint32(os.Dev) + + // Plan 9 has no Inode. + // ext2srv(4) appears to store Inode in Qid.Path. + e.Inode = uint32(os.Qid.Path) + + // Plan 9 has string UID/GID + e.GID = 0 + e.UID = 0 + } + } +} + +func isSymlinkWindowsNonAdmin(err error) bool { + return true +} diff --git a/vendor/github.com/go-git/go-git/v5/worktree_status.go b/vendor/github.com/go-git/go-git/v5/worktree_status.go new file mode 100644 index 000000000..1542f5e6a --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/worktree_status.go @@ -0,0 +1,660 @@ +package git + +import ( + "bytes" + "errors" + "io" + "os" + "path" + "path/filepath" + + "github.com/go-git/go-billy/v5/util" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/filemode" + "github.com/go-git/go-git/v5/plumbing/format/gitignore" + "github.com/go-git/go-git/v5/plumbing/format/index" + "github.com/go-git/go-git/v5/plumbing/object" + "github.com/go-git/go-git/v5/utils/ioutil" + "github.com/go-git/go-git/v5/utils/merkletrie" + "github.com/go-git/go-git/v5/utils/merkletrie/filesystem" + mindex "github.com/go-git/go-git/v5/utils/merkletrie/index" + "github.com/go-git/go-git/v5/utils/merkletrie/noder" +) + +var ( + // ErrDestinationExists in an Move operation means that the target exists on + // the worktree. + ErrDestinationExists = errors.New("destination exists") + // ErrGlobNoMatches in an AddGlob if the glob pattern does not match any + // files in the worktree. + ErrGlobNoMatches = errors.New("glob pattern did not match any files") +) + +// Status returns the working tree status. +func (w *Worktree) Status() (Status, error) { + var hash plumbing.Hash + + ref, err := w.r.Head() + if err != nil && err != plumbing.ErrReferenceNotFound { + return nil, err + } + + if err == nil { + hash = ref.Hash() + } + + return w.status(hash) +} + +func (w *Worktree) status(commit plumbing.Hash) (Status, error) { + s := make(Status) + + left, err := w.diffCommitWithStaging(commit, false) + if err != nil { + return nil, err + } + + for _, ch := range left { + a, err := ch.Action() + if err != nil { + return nil, err + } + + fs := s.File(nameFromAction(&ch)) + fs.Worktree = Unmodified + + switch a { + case merkletrie.Delete: + s.File(ch.From.String()).Staging = Deleted + case merkletrie.Insert: + s.File(ch.To.String()).Staging = Added + case merkletrie.Modify: + s.File(ch.To.String()).Staging = Modified + } + } + + right, err := w.diffStagingWithWorktree(false) + if err != nil { + return nil, err + } + + for _, ch := range right { + a, err := ch.Action() + if err != nil { + return nil, err + } + + fs := s.File(nameFromAction(&ch)) + if fs.Staging == Untracked { + fs.Staging = Unmodified + } + + switch a { + case merkletrie.Delete: + fs.Worktree = Deleted + case merkletrie.Insert: + fs.Worktree = Untracked + fs.Staging = Untracked + case merkletrie.Modify: + fs.Worktree = Modified + } + } + + return s, nil +} + +func nameFromAction(ch *merkletrie.Change) string { + name := ch.To.String() + if name == "" { + return ch.From.String() + } + + return name +} + +func (w *Worktree) diffStagingWithWorktree(reverse bool) (merkletrie.Changes, error) { + idx, err := w.r.Storer.Index() + if err != nil { + return nil, err + } + + from := mindex.NewRootNode(idx) + submodules, err := w.getSubmodulesStatus() + if err != nil { + return nil, err + } + + to := filesystem.NewRootNode(w.Filesystem, submodules) + + var c merkletrie.Changes + if reverse { + c, err = merkletrie.DiffTree(to, from, diffTreeIsEquals) + } else { + c, err = merkletrie.DiffTree(from, to, diffTreeIsEquals) + } + + if err != nil { + return nil, err + } + + return w.excludeIgnoredChanges(c), nil +} + +func (w *Worktree) excludeIgnoredChanges(changes merkletrie.Changes) merkletrie.Changes { + patterns, err := gitignore.ReadPatterns(w.Filesystem, nil) + if err != nil { + return changes + } + + patterns = append(patterns, w.Excludes...) + + if len(patterns) == 0 { + return changes + } + + m := gitignore.NewMatcher(patterns) + + var res merkletrie.Changes + for _, ch := range changes { + var path []string + for _, n := range ch.To { + path = append(path, n.Name()) + } + if len(path) == 0 { + for _, n := range ch.From { + path = append(path, n.Name()) + } + } + if len(path) != 0 { + isDir := (len(ch.To) > 0 && ch.To.IsDir()) || (len(ch.From) > 0 && ch.From.IsDir()) + if m.Match(path, isDir) { + continue + } + } + res = append(res, ch) + } + return res +} + +func (w *Worktree) getSubmodulesStatus() (map[string]plumbing.Hash, error) { + o := map[string]plumbing.Hash{} + + sub, err := w.Submodules() + if err != nil { + return nil, err + } + + status, err := sub.Status() + if err != nil { + return nil, err + } + + for _, s := range status { + if s.Current.IsZero() { + o[s.Path] = s.Expected + continue + } + + o[s.Path] = s.Current + } + + return o, nil +} + +func (w *Worktree) diffCommitWithStaging(commit plumbing.Hash, reverse bool) (merkletrie.Changes, error) { + var t *object.Tree + if !commit.IsZero() { + c, err := w.r.CommitObject(commit) + if err != nil { + return nil, err + } + + t, err = c.Tree() + if err != nil { + return nil, err + } + } + + return w.diffTreeWithStaging(t, reverse) +} + +func (w *Worktree) diffTreeWithStaging(t *object.Tree, reverse bool) (merkletrie.Changes, error) { + var from noder.Noder + if t != nil { + from = object.NewTreeRootNode(t) + } + + idx, err := w.r.Storer.Index() + if err != nil { + return nil, err + } + + to := mindex.NewRootNode(idx) + + if reverse { + return merkletrie.DiffTree(to, from, diffTreeIsEquals) + } + + return merkletrie.DiffTree(from, to, diffTreeIsEquals) +} + +var emptyNoderHash = make([]byte, 24) + +// diffTreeIsEquals is a implementation of noder.Equals, used to compare +// noder.Noder, it compare the content and the length of the hashes. +// +// Since some of the noder.Noder implementations doesn't compute a hash for +// some directories, if any of the hashes is a 24-byte slice of zero values +// the comparison is not done and the hashes are take as different. +func diffTreeIsEquals(a, b noder.Hasher) bool { + hashA := a.Hash() + hashB := b.Hash() + + if bytes.Equal(hashA, emptyNoderHash) || bytes.Equal(hashB, emptyNoderHash) { + return false + } + + return bytes.Equal(hashA, hashB) +} + +// Add adds the file contents of a file in the worktree to the index. if the +// file is already staged in the index no error is returned. If a file deleted +// from the Workspace is given, the file is removed from the index. If a +// directory given, adds the files and all his sub-directories recursively in +// the worktree to the index. If any of the files is already staged in the index +// no error is returned. When path is a file, the blob.Hash is returned. +func (w *Worktree) Add(path string) (plumbing.Hash, error) { + // TODO(mcuadros): remove plumbing.Hash from signature at v5. + s, err := w.Status() + if err != nil { + return plumbing.ZeroHash, err + } + + idx, err := w.r.Storer.Index() + if err != nil { + return plumbing.ZeroHash, err + } + + var h plumbing.Hash + var added bool + + fi, err := w.Filesystem.Lstat(path) + if err != nil || !fi.IsDir() { + added, h, err = w.doAddFile(idx, s, path) + } else { + added, err = w.doAddDirectory(idx, s, path) + } + + if err != nil { + return h, err + } + + if !added { + return h, nil + } + + return h, w.r.Storer.SetIndex(idx) +} + +func (w *Worktree) doAddDirectory(idx *index.Index, s Status, directory string) (added bool, err error) { + files, err := w.Filesystem.ReadDir(directory) + if err != nil { + return false, err + } + + for _, file := range files { + name := path.Join(directory, file.Name()) + + var a bool + if file.IsDir() { + if file.Name() == GitDirName { + // ignore special git directory + continue + } + a, err = w.doAddDirectory(idx, s, name) + } else { + a, _, err = w.doAddFile(idx, s, name) + } + + if err != nil { + return + } + + if !added && a { + added = true + } + } + + return +} + +// AddGlob adds all paths, matching pattern, to the index. If pattern matches a +// directory path, all directory contents are added to the index recursively. No +// error is returned if all matching paths are already staged in index. +func (w *Worktree) AddGlob(pattern string) error { + files, err := util.Glob(w.Filesystem, pattern) + if err != nil { + return err + } + + if len(files) == 0 { + return ErrGlobNoMatches + } + + s, err := w.Status() + if err != nil { + return err + } + + idx, err := w.r.Storer.Index() + if err != nil { + return err + } + + var saveIndex bool + for _, file := range files { + fi, err := w.Filesystem.Lstat(file) + if err != nil { + return err + } + + var added bool + if fi.IsDir() { + added, err = w.doAddDirectory(idx, s, file) + } else { + added, _, err = w.doAddFile(idx, s, file) + } + + if err != nil { + return err + } + + if !saveIndex && added { + saveIndex = true + } + } + + if saveIndex { + return w.r.Storer.SetIndex(idx) + } + + return nil +} + +// doAddFile create a new blob from path and update the index, added is true if +// the file added is different from the index. +func (w *Worktree) doAddFile(idx *index.Index, s Status, path string) (added bool, h plumbing.Hash, err error) { + if s.File(path).Worktree == Unmodified { + return false, h, nil + } + + h, err = w.copyFileToStorage(path) + if err != nil { + if os.IsNotExist(err) { + added = true + h, err = w.deleteFromIndex(idx, path) + } + + return + } + + if err := w.addOrUpdateFileToIndex(idx, path, h); err != nil { + return false, h, err + } + + return true, h, err +} + +func (w *Worktree) copyFileToStorage(path string) (hash plumbing.Hash, err error) { + fi, err := w.Filesystem.Lstat(path) + if err != nil { + return plumbing.ZeroHash, err + } + + obj := w.r.Storer.NewEncodedObject() + obj.SetType(plumbing.BlobObject) + obj.SetSize(fi.Size()) + + writer, err := obj.Writer() + if err != nil { + return plumbing.ZeroHash, err + } + + defer ioutil.CheckClose(writer, &err) + + if fi.Mode()&os.ModeSymlink != 0 { + err = w.fillEncodedObjectFromSymlink(writer, path, fi) + } else { + err = w.fillEncodedObjectFromFile(writer, path, fi) + } + + if err != nil { + return plumbing.ZeroHash, err + } + + return w.r.Storer.SetEncodedObject(obj) +} + +func (w *Worktree) fillEncodedObjectFromFile(dst io.Writer, path string, fi os.FileInfo) (err error) { + src, err := w.Filesystem.Open(path) + if err != nil { + return err + } + + defer ioutil.CheckClose(src, &err) + + if _, err := io.Copy(dst, src); err != nil { + return err + } + + return err +} + +func (w *Worktree) fillEncodedObjectFromSymlink(dst io.Writer, path string, fi os.FileInfo) error { + target, err := w.Filesystem.Readlink(path) + if err != nil { + return err + } + + _, err = dst.Write([]byte(target)) + return err +} + +func (w *Worktree) addOrUpdateFileToIndex(idx *index.Index, filename string, h plumbing.Hash) error { + e, err := idx.Entry(filename) + if err != nil && err != index.ErrEntryNotFound { + return err + } + + if err == index.ErrEntryNotFound { + return w.doAddFileToIndex(idx, filename, h) + } + + return w.doUpdateFileToIndex(e, filename, h) +} + +func (w *Worktree) doAddFileToIndex(idx *index.Index, filename string, h plumbing.Hash) error { + return w.doUpdateFileToIndex(idx.Add(filename), filename, h) +} + +func (w *Worktree) doUpdateFileToIndex(e *index.Entry, filename string, h plumbing.Hash) error { + info, err := w.Filesystem.Lstat(filename) + if err != nil { + return err + } + + e.Hash = h + e.ModifiedAt = info.ModTime() + e.Mode, err = filemode.NewFromOSFileMode(info.Mode()) + if err != nil { + return err + } + + if e.Mode.IsRegular() { + e.Size = uint32(info.Size()) + } + + fillSystemInfo(e, info.Sys()) + return nil +} + +// Remove removes files from the working tree and from the index. +func (w *Worktree) Remove(path string) (plumbing.Hash, error) { + // TODO(mcuadros): remove plumbing.Hash from signature at v5. + idx, err := w.r.Storer.Index() + if err != nil { + return plumbing.ZeroHash, err + } + + var h plumbing.Hash + + fi, err := w.Filesystem.Lstat(path) + if err != nil || !fi.IsDir() { + h, err = w.doRemoveFile(idx, path) + } else { + _, err = w.doRemoveDirectory(idx, path) + } + if err != nil { + return h, err + } + + return h, w.r.Storer.SetIndex(idx) +} + +func (w *Worktree) doRemoveDirectory(idx *index.Index, directory string) (removed bool, err error) { + files, err := w.Filesystem.ReadDir(directory) + if err != nil { + return false, err + } + + for _, file := range files { + name := path.Join(directory, file.Name()) + + var r bool + if file.IsDir() { + r, err = w.doRemoveDirectory(idx, name) + } else { + _, err = w.doRemoveFile(idx, name) + if err == index.ErrEntryNotFound { + err = nil + } + } + + if err != nil { + return + } + + if !removed && r { + removed = true + } + } + + err = w.removeEmptyDirectory(directory) + return +} + +func (w *Worktree) removeEmptyDirectory(path string) error { + files, err := w.Filesystem.ReadDir(path) + if err != nil { + return err + } + + if len(files) != 0 { + return nil + } + + return w.Filesystem.Remove(path) +} + +func (w *Worktree) doRemoveFile(idx *index.Index, path string) (plumbing.Hash, error) { + hash, err := w.deleteFromIndex(idx, path) + if err != nil { + return plumbing.ZeroHash, err + } + + return hash, w.deleteFromFilesystem(path) +} + +func (w *Worktree) deleteFromIndex(idx *index.Index, path string) (plumbing.Hash, error) { + e, err := idx.Remove(path) + if err != nil { + return plumbing.ZeroHash, err + } + + return e.Hash, nil +} + +func (w *Worktree) deleteFromFilesystem(path string) error { + err := w.Filesystem.Remove(path) + if os.IsNotExist(err) { + return nil + } + + return err +} + +// RemoveGlob removes all paths, matching pattern, from the index. If pattern +// matches a directory path, all directory contents are removed from the index +// recursively. +func (w *Worktree) RemoveGlob(pattern string) error { + idx, err := w.r.Storer.Index() + if err != nil { + return err + } + + entries, err := idx.Glob(pattern) + if err != nil { + return err + } + + for _, e := range entries { + file := filepath.FromSlash(e.Name) + if _, err := w.Filesystem.Lstat(file); err != nil && !os.IsNotExist(err) { + return err + } + + if _, err := w.doRemoveFile(idx, file); err != nil { + return err + } + + dir, _ := filepath.Split(file) + if err := w.removeEmptyDirectory(dir); err != nil { + return err + } + } + + return w.r.Storer.SetIndex(idx) +} + +// Move moves or rename a file in the worktree and the index, directories are +// not supported. +func (w *Worktree) Move(from, to string) (plumbing.Hash, error) { + // TODO(mcuadros): support directories and/or implement support for glob + if _, err := w.Filesystem.Lstat(from); err != nil { + return plumbing.ZeroHash, err + } + + if _, err := w.Filesystem.Lstat(to); err == nil { + return plumbing.ZeroHash, ErrDestinationExists + } + + idx, err := w.r.Storer.Index() + if err != nil { + return plumbing.ZeroHash, err + } + + hash, err := w.deleteFromIndex(idx, from) + if err != nil { + return plumbing.ZeroHash, err + } + + if err := w.Filesystem.Rename(from, to); err != nil { + return hash, err + } + + if err := w.addOrUpdateFileToIndex(idx, to, hash); err != nil { + return hash, err + } + + return hash, w.r.Storer.SetIndex(idx) +} diff --git a/vendor/github.com/go-git/go-git/v5/worktree_unix_other.go b/vendor/github.com/go-git/go-git/v5/worktree_unix_other.go new file mode 100644 index 000000000..f45966be9 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/worktree_unix_other.go @@ -0,0 +1,26 @@ +// +build openbsd dragonfly solaris + +package git + +import ( + "syscall" + "time" + + "github.com/go-git/go-git/v5/plumbing/format/index" +) + +func init() { + fillSystemInfo = func(e *index.Entry, sys interface{}) { + if os, ok := sys.(*syscall.Stat_t); ok { + e.CreatedAt = time.Unix(int64(os.Atim.Sec), int64(os.Atim.Nsec)) + e.Dev = uint32(os.Dev) + e.Inode = uint32(os.Ino) + e.GID = os.Gid + e.UID = os.Uid + } + } +} + +func isSymlinkWindowsNonAdmin(err error) bool { + return false +} diff --git a/vendor/github.com/go-git/go-git/v5/worktree_windows.go b/vendor/github.com/go-git/go-git/v5/worktree_windows.go new file mode 100644 index 000000000..1928f9712 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/worktree_windows.go @@ -0,0 +1,35 @@ +// +build windows + +package git + +import ( + "os" + "syscall" + "time" + + "github.com/go-git/go-git/v5/plumbing/format/index" +) + +func init() { + fillSystemInfo = func(e *index.Entry, sys interface{}) { + if os, ok := sys.(*syscall.Win32FileAttributeData); ok { + seconds := os.CreationTime.Nanoseconds() / 1000000000 + nanoseconds := os.CreationTime.Nanoseconds() - seconds*1000000000 + e.CreatedAt = time.Unix(seconds, nanoseconds) + } + } +} + +func isSymlinkWindowsNonAdmin(err error) bool { + const ERROR_PRIVILEGE_NOT_HELD syscall.Errno = 1314 + + if err != nil { + if errLink, ok := err.(*os.LinkError); ok { + if errNo, ok := errLink.Err.(syscall.Errno); ok { + return errNo == ERROR_PRIVILEGE_NOT_HELD + } + } + } + + return false +} diff --git a/vendor/github.com/go-ini/ini/.travis.yml b/vendor/github.com/go-ini/ini/.travis.yml deleted file mode 100644 index 75fe7b74b..000000000 --- a/vendor/github.com/go-ini/ini/.travis.yml +++ /dev/null @@ -1,16 +0,0 @@ -sudo: false -language: go -go: - - 1.5.x - - 1.6.x - - 1.7.x - - 1.8.x - - 1.9.x - - 1.10.x - -script: - - go get golang.org/x/tools/cmd/cover - - go get github.com/smartystreets/goconvey - - mkdir -p $HOME/gopath/src/gopkg.in - - ln -s $HOME/gopath/src/github.com/go-ini/ini $HOME/gopath/src/gopkg.in/ini.v1 - - go test -v -cover -race diff --git a/vendor/github.com/go-ini/ini/Makefile b/vendor/github.com/go-ini/ini/Makefile deleted file mode 100644 index af27ff076..000000000 --- a/vendor/github.com/go-ini/ini/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -.PHONY: build test bench vet coverage - -build: vet bench - -test: - go test -v -cover -race - -bench: - go test -v -cover -race -test.bench=. -test.benchmem - -vet: - go vet - -coverage: - go test -coverprofile=c.out && go tool cover -html=c.out && rm c.out diff --git a/vendor/github.com/go-ini/ini/README.md b/vendor/github.com/go-ini/ini/README.md deleted file mode 100644 index 95d920d6b..000000000 --- a/vendor/github.com/go-ini/ini/README.md +++ /dev/null @@ -1,44 +0,0 @@ -INI [![Build Status](https://travis-ci.org/go-ini/ini.svg?branch=master)](https://travis-ci.org/go-ini/ini) [![Sourcegraph](https://sourcegraph.com/github.com/go-ini/ini/-/badge.svg)](https://sourcegraph.com/github.com/go-ini/ini?badge) -=== - -![](https://avatars0.githubusercontent.com/u/10216035?v=3&s=200) - -Package ini provides INI file read and write functionality in Go. - -## Features - -- Load from multiple data sources(`[]byte`, file and `io.ReadCloser`) with overwrites. -- Read with recursion values. -- Read with parent-child sections. -- Read with auto-increment key names. -- Read with multiple-line values. -- Read with tons of helper methods. -- Read and convert values to Go types. -- Read and **WRITE** comments of sections and keys. -- Manipulate sections, keys and comments with ease. -- Keep sections and keys in order as you parse and save. - -## Installation - -To use a tagged revision: - -```sh -$ go get gopkg.in/ini.v1 -``` - -To use with latest changes: - -```sh -$ go get github.com/go-ini/ini -``` - -Please add `-u` flag to update in the future. - -## Getting Help - -- [Getting Started](https://ini.unknwon.io/docs/intro/getting_started) -- [API Documentation](https://gowalker.org/gopkg.in/ini.v1) - -## License - -This project is under Apache v2 License. See the [LICENSE](LICENSE) file for the full license text. diff --git a/vendor/github.com/go-ini/ini/error.go b/vendor/github.com/go-ini/ini/error.go deleted file mode 100644 index 80afe7431..000000000 --- a/vendor/github.com/go-ini/ini/error.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2016 Unknwon -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package ini - -import ( - "fmt" -) - -type ErrDelimiterNotFound struct { - Line string -} - -func IsErrDelimiterNotFound(err error) bool { - _, ok := err.(ErrDelimiterNotFound) - return ok -} - -func (err ErrDelimiterNotFound) Error() string { - return fmt.Sprintf("key-value delimiter not found: %s", err.Line) -} diff --git a/vendor/github.com/go-ini/ini/file.go b/vendor/github.com/go-ini/ini/file.go deleted file mode 100644 index d7982c323..000000000 --- a/vendor/github.com/go-ini/ini/file.go +++ /dev/null @@ -1,407 +0,0 @@ -// Copyright 2017 Unknwon -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package ini - -import ( - "bytes" - "errors" - "fmt" - "io" - "io/ioutil" - "os" - "strings" - "sync" -) - -// File represents a combination of a or more INI file(s) in memory. -type File struct { - options LoadOptions - dataSources []dataSource - - // Should make things safe, but sometimes doesn't matter. - BlockMode bool - lock sync.RWMutex - - // To keep data in order. - sectionList []string - // Actual data is stored here. - sections map[string]*Section - - NameMapper - ValueMapper -} - -// newFile initializes File object with given data sources. -func newFile(dataSources []dataSource, opts LoadOptions) *File { - return &File{ - BlockMode: true, - dataSources: dataSources, - sections: make(map[string]*Section), - sectionList: make([]string, 0, 10), - options: opts, - } -} - -// Empty returns an empty file object. -func Empty() *File { - // Ignore error here, we sure our data is good. - f, _ := Load([]byte("")) - return f -} - -// NewSection creates a new section. -func (f *File) NewSection(name string) (*Section, error) { - if len(name) == 0 { - return nil, errors.New("error creating new section: empty section name") - } else if f.options.Insensitive && name != DEFAULT_SECTION { - name = strings.ToLower(name) - } - - if f.BlockMode { - f.lock.Lock() - defer f.lock.Unlock() - } - - if inSlice(name, f.sectionList) { - return f.sections[name], nil - } - - f.sectionList = append(f.sectionList, name) - f.sections[name] = newSection(f, name) - return f.sections[name], nil -} - -// NewRawSection creates a new section with an unparseable body. -func (f *File) NewRawSection(name, body string) (*Section, error) { - section, err := f.NewSection(name) - if err != nil { - return nil, err - } - - section.isRawSection = true - section.rawBody = body - return section, nil -} - -// NewSections creates a list of sections. -func (f *File) NewSections(names ...string) (err error) { - for _, name := range names { - if _, err = f.NewSection(name); err != nil { - return err - } - } - return nil -} - -// GetSection returns section by given name. -func (f *File) GetSection(name string) (*Section, error) { - if len(name) == 0 { - name = DEFAULT_SECTION - } - if f.options.Insensitive { - name = strings.ToLower(name) - } - - if f.BlockMode { - f.lock.RLock() - defer f.lock.RUnlock() - } - - sec := f.sections[name] - if sec == nil { - return nil, fmt.Errorf("section '%s' does not exist", name) - } - return sec, nil -} - -// Section assumes named section exists and returns a zero-value when not. -func (f *File) Section(name string) *Section { - sec, err := f.GetSection(name) - if err != nil { - // Note: It's OK here because the only possible error is empty section name, - // but if it's empty, this piece of code won't be executed. - sec, _ = f.NewSection(name) - return sec - } - return sec -} - -// Section returns list of Section. -func (f *File) Sections() []*Section { - if f.BlockMode { - f.lock.RLock() - defer f.lock.RUnlock() - } - - sections := make([]*Section, len(f.sectionList)) - for i, name := range f.sectionList { - sections[i] = f.sections[name] - } - return sections -} - -// ChildSections returns a list of child sections of given section name. -func (f *File) ChildSections(name string) []*Section { - return f.Section(name).ChildSections() -} - -// SectionStrings returns list of section names. -func (f *File) SectionStrings() []string { - list := make([]string, len(f.sectionList)) - copy(list, f.sectionList) - return list -} - -// DeleteSection deletes a section. -func (f *File) DeleteSection(name string) { - if f.BlockMode { - f.lock.Lock() - defer f.lock.Unlock() - } - - if len(name) == 0 { - name = DEFAULT_SECTION - } - - for i, s := range f.sectionList { - if s == name { - f.sectionList = append(f.sectionList[:i], f.sectionList[i+1:]...) - delete(f.sections, name) - return - } - } -} - -func (f *File) reload(s dataSource) error { - r, err := s.ReadCloser() - if err != nil { - return err - } - defer r.Close() - - return f.parse(r) -} - -// Reload reloads and parses all data sources. -func (f *File) Reload() (err error) { - for _, s := range f.dataSources { - if err = f.reload(s); err != nil { - // In loose mode, we create an empty default section for nonexistent files. - if os.IsNotExist(err) && f.options.Loose { - f.parse(bytes.NewBuffer(nil)) - continue - } - return err - } - } - return nil -} - -// Append appends one or more data sources and reloads automatically. -func (f *File) Append(source interface{}, others ...interface{}) error { - ds, err := parseDataSource(source) - if err != nil { - return err - } - f.dataSources = append(f.dataSources, ds) - for _, s := range others { - ds, err = parseDataSource(s) - if err != nil { - return err - } - f.dataSources = append(f.dataSources, ds) - } - return f.Reload() -} - -func (f *File) writeToBuffer(indent string) (*bytes.Buffer, error) { - equalSign := "=" - if PrettyFormat || PrettyEqual { - equalSign = " = " - } - - // Use buffer to make sure target is safe until finish encoding. - buf := bytes.NewBuffer(nil) - for i, sname := range f.sectionList { - sec := f.Section(sname) - if len(sec.Comment) > 0 { - if sec.Comment[0] != '#' && sec.Comment[0] != ';' { - sec.Comment = "; " + sec.Comment - } else { - sec.Comment = sec.Comment[:1] + " " + strings.TrimSpace(sec.Comment[1:]) - } - if _, err := buf.WriteString(sec.Comment + LineBreak); err != nil { - return nil, err - } - } - - if i > 0 || DefaultHeader { - if _, err := buf.WriteString("[" + sname + "]" + LineBreak); err != nil { - return nil, err - } - } else { - // Write nothing if default section is empty - if len(sec.keyList) == 0 { - continue - } - } - - if sec.isRawSection { - if _, err := buf.WriteString(sec.rawBody); err != nil { - return nil, err - } - - if PrettySection { - // Put a line between sections - if _, err := buf.WriteString(LineBreak); err != nil { - return nil, err - } - } - continue - } - - // Count and generate alignment length and buffer spaces using the - // longest key. Keys may be modifed if they contain certain characters so - // we need to take that into account in our calculation. - alignLength := 0 - if PrettyFormat { - for _, kname := range sec.keyList { - keyLength := len(kname) - // First case will surround key by ` and second by """ - if strings.ContainsAny(kname, "\"=:") { - keyLength += 2 - } else if strings.Contains(kname, "`") { - keyLength += 6 - } - - if keyLength > alignLength { - alignLength = keyLength - } - } - } - alignSpaces := bytes.Repeat([]byte(" "), alignLength) - - KEY_LIST: - for _, kname := range sec.keyList { - key := sec.Key(kname) - if len(key.Comment) > 0 { - if len(indent) > 0 && sname != DEFAULT_SECTION { - buf.WriteString(indent) - } - if key.Comment[0] != '#' && key.Comment[0] != ';' { - key.Comment = "; " + key.Comment - } else { - key.Comment = key.Comment[:1] + " " + strings.TrimSpace(key.Comment[1:]) - } - - // Support multiline comments - key.Comment = strings.Replace(key.Comment, "\n", "\n; ", -1) - - if _, err := buf.WriteString(key.Comment + LineBreak); err != nil { - return nil, err - } - } - - if len(indent) > 0 && sname != DEFAULT_SECTION { - buf.WriteString(indent) - } - - switch { - case key.isAutoIncrement: - kname = "-" - case strings.ContainsAny(kname, "\"=:"): - kname = "`" + kname + "`" - case strings.Contains(kname, "`"): - kname = `"""` + kname + `"""` - } - - for _, val := range key.ValueWithShadows() { - if _, err := buf.WriteString(kname); err != nil { - return nil, err - } - - if key.isBooleanType { - if kname != sec.keyList[len(sec.keyList)-1] { - buf.WriteString(LineBreak) - } - continue KEY_LIST - } - - // Write out alignment spaces before "=" sign - if PrettyFormat { - buf.Write(alignSpaces[:alignLength-len(kname)]) - } - - // In case key value contains "\n", "`", "\"", "#" or ";" - if strings.ContainsAny(val, "\n`") { - val = `"""` + val + `"""` - } else if !f.options.IgnoreInlineComment && strings.ContainsAny(val, "#;") { - val = "`" + val + "`" - } - if _, err := buf.WriteString(equalSign + val + LineBreak); err != nil { - return nil, err - } - } - - for _, val := range key.nestedValues { - if _, err := buf.WriteString(indent + " " + val + LineBreak); err != nil { - return nil, err - } - } - } - - if PrettySection { - // Put a line between sections - if _, err := buf.WriteString(LineBreak); err != nil { - return nil, err - } - } - } - - return buf, nil -} - -// WriteToIndent writes content into io.Writer with given indention. -// If PrettyFormat has been set to be true, -// it will align "=" sign with spaces under each section. -func (f *File) WriteToIndent(w io.Writer, indent string) (int64, error) { - buf, err := f.writeToBuffer(indent) - if err != nil { - return 0, err - } - return buf.WriteTo(w) -} - -// WriteTo writes file content into io.Writer. -func (f *File) WriteTo(w io.Writer) (int64, error) { - return f.WriteToIndent(w, "") -} - -// SaveToIndent writes content to file system with given value indention. -func (f *File) SaveToIndent(filename, indent string) error { - // Note: Because we are truncating with os.Create, - // so it's safer to save to a temporary file location and rename afte done. - buf, err := f.writeToBuffer(indent) - if err != nil { - return err - } - - return ioutil.WriteFile(filename, buf.Bytes(), 0666) -} - -// SaveTo writes content to file system. -func (f *File) SaveTo(filename string) error { - return f.SaveToIndent(filename, "") -} diff --git a/vendor/github.com/go-ini/ini/ini.go b/vendor/github.com/go-ini/ini/ini.go deleted file mode 100644 index d98353229..000000000 --- a/vendor/github.com/go-ini/ini/ini.go +++ /dev/null @@ -1,202 +0,0 @@ -// Copyright 2014 Unknwon -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -// Package ini provides INI file read and write functionality in Go. -package ini - -import ( - "bytes" - "fmt" - "io" - "io/ioutil" - "os" - "regexp" - "runtime" -) - -const ( - // Name for default section. You can use this constant or the string literal. - // In most of cases, an empty string is all you need to access the section. - DEFAULT_SECTION = "DEFAULT" - - // Maximum allowed depth when recursively substituing variable names. - _DEPTH_VALUES = 99 - _VERSION = "1.36.0" -) - -// Version returns current package version literal. -func Version() string { - return _VERSION -} - -var ( - // Delimiter to determine or compose a new line. - // This variable will be changed to "\r\n" automatically on Windows - // at package init time. - LineBreak = "\n" - - // Variable regexp pattern: %(variable)s - varPattern = regexp.MustCompile(`%\(([^\)]+)\)s`) - - // Indicate whether to align "=" sign with spaces to produce pretty output - // or reduce all possible spaces for compact format. - PrettyFormat = true - - // Place spaces around "=" sign even when PrettyFormat is false - PrettyEqual = false - - // Explicitly write DEFAULT section header - DefaultHeader = false - - // Indicate whether to put a line between sections - PrettySection = true -) - -func init() { - if runtime.GOOS == "windows" { - LineBreak = "\r\n" - } -} - -func inSlice(str string, s []string) bool { - for _, v := range s { - if str == v { - return true - } - } - return false -} - -// dataSource is an interface that returns object which can be read and closed. -type dataSource interface { - ReadCloser() (io.ReadCloser, error) -} - -// sourceFile represents an object that contains content on the local file system. -type sourceFile struct { - name string -} - -func (s sourceFile) ReadCloser() (_ io.ReadCloser, err error) { - return os.Open(s.name) -} - -// sourceData represents an object that contains content in memory. -type sourceData struct { - data []byte -} - -func (s *sourceData) ReadCloser() (io.ReadCloser, error) { - return ioutil.NopCloser(bytes.NewReader(s.data)), nil -} - -// sourceReadCloser represents an input stream with Close method. -type sourceReadCloser struct { - reader io.ReadCloser -} - -func (s *sourceReadCloser) ReadCloser() (io.ReadCloser, error) { - return s.reader, nil -} - -func parseDataSource(source interface{}) (dataSource, error) { - switch s := source.(type) { - case string: - return sourceFile{s}, nil - case []byte: - return &sourceData{s}, nil - case io.ReadCloser: - return &sourceReadCloser{s}, nil - default: - return nil, fmt.Errorf("error parsing data source: unknown type '%s'", s) - } -} - -type LoadOptions struct { - // Loose indicates whether the parser should ignore nonexistent files or return error. - Loose bool - // Insensitive indicates whether the parser forces all section and key names to lowercase. - Insensitive bool - // IgnoreContinuation indicates whether to ignore continuation lines while parsing. - IgnoreContinuation bool - // IgnoreInlineComment indicates whether to ignore comments at the end of value and treat it as part of value. - IgnoreInlineComment bool - // AllowBooleanKeys indicates whether to allow boolean type keys or treat as value is missing. - // This type of keys are mostly used in my.cnf. - AllowBooleanKeys bool - // AllowShadows indicates whether to keep track of keys with same name under same section. - AllowShadows bool - // AllowNestedValues indicates whether to allow AWS-like nested values. - // Docs: http://docs.aws.amazon.com/cli/latest/topic/config-vars.html#nested-values - AllowNestedValues bool - // AllowPythonMultilineValues indicates whether to allow Python-like multi-line values. - // Docs: https://docs.python.org/3/library/configparser.html#supported-ini-file-structure - // Relevant quote: Values can also span multiple lines, as long as they are indented deeper - // than the first line of the value. - AllowPythonMultilineValues bool - // UnescapeValueDoubleQuotes indicates whether to unescape double quotes inside value to regular format - // when value is surrounded by double quotes, e.g. key="a \"value\"" => key=a "value" - UnescapeValueDoubleQuotes bool - // UnescapeValueCommentSymbols indicates to unescape comment symbols (\# and \;) inside value to regular format - // when value is NOT surrounded by any quotes. - // Note: UNSTABLE, behavior might change to only unescape inside double quotes but may noy necessary at all. - UnescapeValueCommentSymbols bool - // Some INI formats allow group blocks that store a block of raw content that doesn't otherwise - // conform to key/value pairs. Specify the names of those blocks here. - UnparseableSections []string -} - -func LoadSources(opts LoadOptions, source interface{}, others ...interface{}) (_ *File, err error) { - sources := make([]dataSource, len(others)+1) - sources[0], err = parseDataSource(source) - if err != nil { - return nil, err - } - for i := range others { - sources[i+1], err = parseDataSource(others[i]) - if err != nil { - return nil, err - } - } - f := newFile(sources, opts) - if err = f.Reload(); err != nil { - return nil, err - } - return f, nil -} - -// Load loads and parses from INI data sources. -// Arguments can be mixed of file name with string type, or raw data in []byte. -// It will return error if list contains nonexistent files. -func Load(source interface{}, others ...interface{}) (*File, error) { - return LoadSources(LoadOptions{}, source, others...) -} - -// LooseLoad has exactly same functionality as Load function -// except it ignores nonexistent files instead of returning error. -func LooseLoad(source interface{}, others ...interface{}) (*File, error) { - return LoadSources(LoadOptions{Loose: true}, source, others...) -} - -// InsensitiveLoad has exactly same functionality as Load function -// except it forces all section and key names to be lowercased. -func InsensitiveLoad(source interface{}, others ...interface{}) (*File, error) { - return LoadSources(LoadOptions{Insensitive: true}, source, others...) -} - -// InsensitiveLoad has exactly same functionality as Load function -// except it allows have shadow keys. -func ShadowLoad(source interface{}, others ...interface{}) (*File, error) { - return LoadSources(LoadOptions{AllowShadows: true}, source, others...) -} diff --git a/vendor/github.com/go-ini/ini/key.go b/vendor/github.com/go-ini/ini/key.go deleted file mode 100644 index 7c8566a1b..000000000 --- a/vendor/github.com/go-ini/ini/key.go +++ /dev/null @@ -1,751 +0,0 @@ -// Copyright 2014 Unknwon -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package ini - -import ( - "bytes" - "errors" - "fmt" - "strconv" - "strings" - "time" -) - -// Key represents a key under a section. -type Key struct { - s *Section - Comment string - name string - value string - isAutoIncrement bool - isBooleanType bool - - isShadow bool - shadows []*Key - - nestedValues []string -} - -// newKey simply return a key object with given values. -func newKey(s *Section, name, val string) *Key { - return &Key{ - s: s, - name: name, - value: val, - } -} - -func (k *Key) addShadow(val string) error { - if k.isShadow { - return errors.New("cannot add shadow to another shadow key") - } else if k.isAutoIncrement || k.isBooleanType { - return errors.New("cannot add shadow to auto-increment or boolean key") - } - - shadow := newKey(k.s, k.name, val) - shadow.isShadow = true - k.shadows = append(k.shadows, shadow) - return nil -} - -// AddShadow adds a new shadow key to itself. -func (k *Key) AddShadow(val string) error { - if !k.s.f.options.AllowShadows { - return errors.New("shadow key is not allowed") - } - return k.addShadow(val) -} - -func (k *Key) addNestedValue(val string) error { - if k.isAutoIncrement || k.isBooleanType { - return errors.New("cannot add nested value to auto-increment or boolean key") - } - - k.nestedValues = append(k.nestedValues, val) - return nil -} - -func (k *Key) AddNestedValue(val string) error { - if !k.s.f.options.AllowNestedValues { - return errors.New("nested value is not allowed") - } - return k.addNestedValue(val) -} - -// ValueMapper represents a mapping function for values, e.g. os.ExpandEnv -type ValueMapper func(string) string - -// Name returns name of key. -func (k *Key) Name() string { - return k.name -} - -// Value returns raw value of key for performance purpose. -func (k *Key) Value() string { - return k.value -} - -// ValueWithShadows returns raw values of key and its shadows if any. -func (k *Key) ValueWithShadows() []string { - if len(k.shadows) == 0 { - return []string{k.value} - } - vals := make([]string, len(k.shadows)+1) - vals[0] = k.value - for i := range k.shadows { - vals[i+1] = k.shadows[i].value - } - return vals -} - -// NestedValues returns nested values stored in the key. -// It is possible returned value is nil if no nested values stored in the key. -func (k *Key) NestedValues() []string { - return k.nestedValues -} - -// transformValue takes a raw value and transforms to its final string. -func (k *Key) transformValue(val string) string { - if k.s.f.ValueMapper != nil { - val = k.s.f.ValueMapper(val) - } - - // Fail-fast if no indicate char found for recursive value - if !strings.Contains(val, "%") { - return val - } - for i := 0; i < _DEPTH_VALUES; i++ { - vr := varPattern.FindString(val) - if len(vr) == 0 { - break - } - - // Take off leading '%(' and trailing ')s'. - noption := strings.TrimLeft(vr, "%(") - noption = strings.TrimRight(noption, ")s") - - // Search in the same section. - nk, err := k.s.GetKey(noption) - if err != nil || k == nk { - // Search again in default section. - nk, _ = k.s.f.Section("").GetKey(noption) - } - - // Substitute by new value and take off leading '%(' and trailing ')s'. - val = strings.Replace(val, vr, nk.value, -1) - } - return val -} - -// String returns string representation of value. -func (k *Key) String() string { - return k.transformValue(k.value) -} - -// Validate accepts a validate function which can -// return modifed result as key value. -func (k *Key) Validate(fn func(string) string) string { - return fn(k.String()) -} - -// parseBool returns the boolean value represented by the string. -// -// It accepts 1, t, T, TRUE, true, True, YES, yes, Yes, y, ON, on, On, -// 0, f, F, FALSE, false, False, NO, no, No, n, OFF, off, Off. -// Any other value returns an error. -func parseBool(str string) (value bool, err error) { - switch str { - case "1", "t", "T", "true", "TRUE", "True", "YES", "yes", "Yes", "y", "ON", "on", "On": - return true, nil - case "0", "f", "F", "false", "FALSE", "False", "NO", "no", "No", "n", "OFF", "off", "Off": - return false, nil - } - return false, fmt.Errorf("parsing \"%s\": invalid syntax", str) -} - -// Bool returns bool type value. -func (k *Key) Bool() (bool, error) { - return parseBool(k.String()) -} - -// Float64 returns float64 type value. -func (k *Key) Float64() (float64, error) { - return strconv.ParseFloat(k.String(), 64) -} - -// Int returns int type value. -func (k *Key) Int() (int, error) { - return strconv.Atoi(k.String()) -} - -// Int64 returns int64 type value. -func (k *Key) Int64() (int64, error) { - return strconv.ParseInt(k.String(), 10, 64) -} - -// Uint returns uint type valued. -func (k *Key) Uint() (uint, error) { - u, e := strconv.ParseUint(k.String(), 10, 64) - return uint(u), e -} - -// Uint64 returns uint64 type value. -func (k *Key) Uint64() (uint64, error) { - return strconv.ParseUint(k.String(), 10, 64) -} - -// Duration returns time.Duration type value. -func (k *Key) Duration() (time.Duration, error) { - return time.ParseDuration(k.String()) -} - -// TimeFormat parses with given format and returns time.Time type value. -func (k *Key) TimeFormat(format string) (time.Time, error) { - return time.Parse(format, k.String()) -} - -// Time parses with RFC3339 format and returns time.Time type value. -func (k *Key) Time() (time.Time, error) { - return k.TimeFormat(time.RFC3339) -} - -// MustString returns default value if key value is empty. -func (k *Key) MustString(defaultVal string) string { - val := k.String() - if len(val) == 0 { - k.value = defaultVal - return defaultVal - } - return val -} - -// MustBool always returns value without error, -// it returns false if error occurs. -func (k *Key) MustBool(defaultVal ...bool) bool { - val, err := k.Bool() - if len(defaultVal) > 0 && err != nil { - k.value = strconv.FormatBool(defaultVal[0]) - return defaultVal[0] - } - return val -} - -// MustFloat64 always returns value without error, -// it returns 0.0 if error occurs. -func (k *Key) MustFloat64(defaultVal ...float64) float64 { - val, err := k.Float64() - if len(defaultVal) > 0 && err != nil { - k.value = strconv.FormatFloat(defaultVal[0], 'f', -1, 64) - return defaultVal[0] - } - return val -} - -// MustInt always returns value without error, -// it returns 0 if error occurs. -func (k *Key) MustInt(defaultVal ...int) int { - val, err := k.Int() - if len(defaultVal) > 0 && err != nil { - k.value = strconv.FormatInt(int64(defaultVal[0]), 10) - return defaultVal[0] - } - return val -} - -// MustInt64 always returns value without error, -// it returns 0 if error occurs. -func (k *Key) MustInt64(defaultVal ...int64) int64 { - val, err := k.Int64() - if len(defaultVal) > 0 && err != nil { - k.value = strconv.FormatInt(defaultVal[0], 10) - return defaultVal[0] - } - return val -} - -// MustUint always returns value without error, -// it returns 0 if error occurs. -func (k *Key) MustUint(defaultVal ...uint) uint { - val, err := k.Uint() - if len(defaultVal) > 0 && err != nil { - k.value = strconv.FormatUint(uint64(defaultVal[0]), 10) - return defaultVal[0] - } - return val -} - -// MustUint64 always returns value without error, -// it returns 0 if error occurs. -func (k *Key) MustUint64(defaultVal ...uint64) uint64 { - val, err := k.Uint64() - if len(defaultVal) > 0 && err != nil { - k.value = strconv.FormatUint(defaultVal[0], 10) - return defaultVal[0] - } - return val -} - -// MustDuration always returns value without error, -// it returns zero value if error occurs. -func (k *Key) MustDuration(defaultVal ...time.Duration) time.Duration { - val, err := k.Duration() - if len(defaultVal) > 0 && err != nil { - k.value = defaultVal[0].String() - return defaultVal[0] - } - return val -} - -// MustTimeFormat always parses with given format and returns value without error, -// it returns zero value if error occurs. -func (k *Key) MustTimeFormat(format string, defaultVal ...time.Time) time.Time { - val, err := k.TimeFormat(format) - if len(defaultVal) > 0 && err != nil { - k.value = defaultVal[0].Format(format) - return defaultVal[0] - } - return val -} - -// MustTime always parses with RFC3339 format and returns value without error, -// it returns zero value if error occurs. -func (k *Key) MustTime(defaultVal ...time.Time) time.Time { - return k.MustTimeFormat(time.RFC3339, defaultVal...) -} - -// In always returns value without error, -// it returns default value if error occurs or doesn't fit into candidates. -func (k *Key) In(defaultVal string, candidates []string) string { - val := k.String() - for _, cand := range candidates { - if val == cand { - return val - } - } - return defaultVal -} - -// InFloat64 always returns value without error, -// it returns default value if error occurs or doesn't fit into candidates. -func (k *Key) InFloat64(defaultVal float64, candidates []float64) float64 { - val := k.MustFloat64() - for _, cand := range candidates { - if val == cand { - return val - } - } - return defaultVal -} - -// InInt always returns value without error, -// it returns default value if error occurs or doesn't fit into candidates. -func (k *Key) InInt(defaultVal int, candidates []int) int { - val := k.MustInt() - for _, cand := range candidates { - if val == cand { - return val - } - } - return defaultVal -} - -// InInt64 always returns value without error, -// it returns default value if error occurs or doesn't fit into candidates. -func (k *Key) InInt64(defaultVal int64, candidates []int64) int64 { - val := k.MustInt64() - for _, cand := range candidates { - if val == cand { - return val - } - } - return defaultVal -} - -// InUint always returns value without error, -// it returns default value if error occurs or doesn't fit into candidates. -func (k *Key) InUint(defaultVal uint, candidates []uint) uint { - val := k.MustUint() - for _, cand := range candidates { - if val == cand { - return val - } - } - return defaultVal -} - -// InUint64 always returns value without error, -// it returns default value if error occurs or doesn't fit into candidates. -func (k *Key) InUint64(defaultVal uint64, candidates []uint64) uint64 { - val := k.MustUint64() - for _, cand := range candidates { - if val == cand { - return val - } - } - return defaultVal -} - -// InTimeFormat always parses with given format and returns value without error, -// it returns default value if error occurs or doesn't fit into candidates. -func (k *Key) InTimeFormat(format string, defaultVal time.Time, candidates []time.Time) time.Time { - val := k.MustTimeFormat(format) - for _, cand := range candidates { - if val == cand { - return val - } - } - return defaultVal -} - -// InTime always parses with RFC3339 format and returns value without error, -// it returns default value if error occurs or doesn't fit into candidates. -func (k *Key) InTime(defaultVal time.Time, candidates []time.Time) time.Time { - return k.InTimeFormat(time.RFC3339, defaultVal, candidates) -} - -// RangeFloat64 checks if value is in given range inclusively, -// and returns default value if it's not. -func (k *Key) RangeFloat64(defaultVal, min, max float64) float64 { - val := k.MustFloat64() - if val < min || val > max { - return defaultVal - } - return val -} - -// RangeInt checks if value is in given range inclusively, -// and returns default value if it's not. -func (k *Key) RangeInt(defaultVal, min, max int) int { - val := k.MustInt() - if val < min || val > max { - return defaultVal - } - return val -} - -// RangeInt64 checks if value is in given range inclusively, -// and returns default value if it's not. -func (k *Key) RangeInt64(defaultVal, min, max int64) int64 { - val := k.MustInt64() - if val < min || val > max { - return defaultVal - } - return val -} - -// RangeTimeFormat checks if value with given format is in given range inclusively, -// and returns default value if it's not. -func (k *Key) RangeTimeFormat(format string, defaultVal, min, max time.Time) time.Time { - val := k.MustTimeFormat(format) - if val.Unix() < min.Unix() || val.Unix() > max.Unix() { - return defaultVal - } - return val -} - -// RangeTime checks if value with RFC3339 format is in given range inclusively, -// and returns default value if it's not. -func (k *Key) RangeTime(defaultVal, min, max time.Time) time.Time { - return k.RangeTimeFormat(time.RFC3339, defaultVal, min, max) -} - -// Strings returns list of string divided by given delimiter. -func (k *Key) Strings(delim string) []string { - str := k.String() - if len(str) == 0 { - return []string{} - } - - runes := []rune(str) - vals := make([]string, 0, 2) - var buf bytes.Buffer - escape := false - idx := 0 - for { - if escape { - escape = false - if runes[idx] != '\\' && !strings.HasPrefix(string(runes[idx:]), delim) { - buf.WriteRune('\\') - } - buf.WriteRune(runes[idx]) - } else { - if runes[idx] == '\\' { - escape = true - } else if strings.HasPrefix(string(runes[idx:]), delim) { - idx += len(delim) - 1 - vals = append(vals, strings.TrimSpace(buf.String())) - buf.Reset() - } else { - buf.WriteRune(runes[idx]) - } - } - idx += 1 - if idx == len(runes) { - break - } - } - - if buf.Len() > 0 { - vals = append(vals, strings.TrimSpace(buf.String())) - } - - return vals -} - -// StringsWithShadows returns list of string divided by given delimiter. -// Shadows will also be appended if any. -func (k *Key) StringsWithShadows(delim string) []string { - vals := k.ValueWithShadows() - results := make([]string, 0, len(vals)*2) - for i := range vals { - if len(vals) == 0 { - continue - } - - results = append(results, strings.Split(vals[i], delim)...) - } - - for i := range results { - results[i] = k.transformValue(strings.TrimSpace(results[i])) - } - return results -} - -// Float64s returns list of float64 divided by given delimiter. Any invalid input will be treated as zero value. -func (k *Key) Float64s(delim string) []float64 { - vals, _ := k.parseFloat64s(k.Strings(delim), true, false) - return vals -} - -// Ints returns list of int divided by given delimiter. Any invalid input will be treated as zero value. -func (k *Key) Ints(delim string) []int { - vals, _ := k.parseInts(k.Strings(delim), true, false) - return vals -} - -// Int64s returns list of int64 divided by given delimiter. Any invalid input will be treated as zero value. -func (k *Key) Int64s(delim string) []int64 { - vals, _ := k.parseInt64s(k.Strings(delim), true, false) - return vals -} - -// Uints returns list of uint divided by given delimiter. Any invalid input will be treated as zero value. -func (k *Key) Uints(delim string) []uint { - vals, _ := k.parseUints(k.Strings(delim), true, false) - return vals -} - -// Uint64s returns list of uint64 divided by given delimiter. Any invalid input will be treated as zero value. -func (k *Key) Uint64s(delim string) []uint64 { - vals, _ := k.parseUint64s(k.Strings(delim), true, false) - return vals -} - -// TimesFormat parses with given format and returns list of time.Time divided by given delimiter. -// Any invalid input will be treated as zero value (0001-01-01 00:00:00 +0000 UTC). -func (k *Key) TimesFormat(format, delim string) []time.Time { - vals, _ := k.parseTimesFormat(format, k.Strings(delim), true, false) - return vals -} - -// Times parses with RFC3339 format and returns list of time.Time divided by given delimiter. -// Any invalid input will be treated as zero value (0001-01-01 00:00:00 +0000 UTC). -func (k *Key) Times(delim string) []time.Time { - return k.TimesFormat(time.RFC3339, delim) -} - -// ValidFloat64s returns list of float64 divided by given delimiter. If some value is not float, then -// it will not be included to result list. -func (k *Key) ValidFloat64s(delim string) []float64 { - vals, _ := k.parseFloat64s(k.Strings(delim), false, false) - return vals -} - -// ValidInts returns list of int divided by given delimiter. If some value is not integer, then it will -// not be included to result list. -func (k *Key) ValidInts(delim string) []int { - vals, _ := k.parseInts(k.Strings(delim), false, false) - return vals -} - -// ValidInt64s returns list of int64 divided by given delimiter. If some value is not 64-bit integer, -// then it will not be included to result list. -func (k *Key) ValidInt64s(delim string) []int64 { - vals, _ := k.parseInt64s(k.Strings(delim), false, false) - return vals -} - -// ValidUints returns list of uint divided by given delimiter. If some value is not unsigned integer, -// then it will not be included to result list. -func (k *Key) ValidUints(delim string) []uint { - vals, _ := k.parseUints(k.Strings(delim), false, false) - return vals -} - -// ValidUint64s returns list of uint64 divided by given delimiter. If some value is not 64-bit unsigned -// integer, then it will not be included to result list. -func (k *Key) ValidUint64s(delim string) []uint64 { - vals, _ := k.parseUint64s(k.Strings(delim), false, false) - return vals -} - -// ValidTimesFormat parses with given format and returns list of time.Time divided by given delimiter. -func (k *Key) ValidTimesFormat(format, delim string) []time.Time { - vals, _ := k.parseTimesFormat(format, k.Strings(delim), false, false) - return vals -} - -// ValidTimes parses with RFC3339 format and returns list of time.Time divided by given delimiter. -func (k *Key) ValidTimes(delim string) []time.Time { - return k.ValidTimesFormat(time.RFC3339, delim) -} - -// StrictFloat64s returns list of float64 divided by given delimiter or error on first invalid input. -func (k *Key) StrictFloat64s(delim string) ([]float64, error) { - return k.parseFloat64s(k.Strings(delim), false, true) -} - -// StrictInts returns list of int divided by given delimiter or error on first invalid input. -func (k *Key) StrictInts(delim string) ([]int, error) { - return k.parseInts(k.Strings(delim), false, true) -} - -// StrictInt64s returns list of int64 divided by given delimiter or error on first invalid input. -func (k *Key) StrictInt64s(delim string) ([]int64, error) { - return k.parseInt64s(k.Strings(delim), false, true) -} - -// StrictUints returns list of uint divided by given delimiter or error on first invalid input. -func (k *Key) StrictUints(delim string) ([]uint, error) { - return k.parseUints(k.Strings(delim), false, true) -} - -// StrictUint64s returns list of uint64 divided by given delimiter or error on first invalid input. -func (k *Key) StrictUint64s(delim string) ([]uint64, error) { - return k.parseUint64s(k.Strings(delim), false, true) -} - -// StrictTimesFormat parses with given format and returns list of time.Time divided by given delimiter -// or error on first invalid input. -func (k *Key) StrictTimesFormat(format, delim string) ([]time.Time, error) { - return k.parseTimesFormat(format, k.Strings(delim), false, true) -} - -// StrictTimes parses with RFC3339 format and returns list of time.Time divided by given delimiter -// or error on first invalid input. -func (k *Key) StrictTimes(delim string) ([]time.Time, error) { - return k.StrictTimesFormat(time.RFC3339, delim) -} - -// parseFloat64s transforms strings to float64s. -func (k *Key) parseFloat64s(strs []string, addInvalid, returnOnInvalid bool) ([]float64, error) { - vals := make([]float64, 0, len(strs)) - for _, str := range strs { - val, err := strconv.ParseFloat(str, 64) - if err != nil && returnOnInvalid { - return nil, err - } - if err == nil || addInvalid { - vals = append(vals, val) - } - } - return vals, nil -} - -// parseInts transforms strings to ints. -func (k *Key) parseInts(strs []string, addInvalid, returnOnInvalid bool) ([]int, error) { - vals := make([]int, 0, len(strs)) - for _, str := range strs { - val, err := strconv.Atoi(str) - if err != nil && returnOnInvalid { - return nil, err - } - if err == nil || addInvalid { - vals = append(vals, val) - } - } - return vals, nil -} - -// parseInt64s transforms strings to int64s. -func (k *Key) parseInt64s(strs []string, addInvalid, returnOnInvalid bool) ([]int64, error) { - vals := make([]int64, 0, len(strs)) - for _, str := range strs { - val, err := strconv.ParseInt(str, 10, 64) - if err != nil && returnOnInvalid { - return nil, err - } - if err == nil || addInvalid { - vals = append(vals, val) - } - } - return vals, nil -} - -// parseUints transforms strings to uints. -func (k *Key) parseUints(strs []string, addInvalid, returnOnInvalid bool) ([]uint, error) { - vals := make([]uint, 0, len(strs)) - for _, str := range strs { - val, err := strconv.ParseUint(str, 10, 0) - if err != nil && returnOnInvalid { - return nil, err - } - if err == nil || addInvalid { - vals = append(vals, uint(val)) - } - } - return vals, nil -} - -// parseUint64s transforms strings to uint64s. -func (k *Key) parseUint64s(strs []string, addInvalid, returnOnInvalid bool) ([]uint64, error) { - vals := make([]uint64, 0, len(strs)) - for _, str := range strs { - val, err := strconv.ParseUint(str, 10, 64) - if err != nil && returnOnInvalid { - return nil, err - } - if err == nil || addInvalid { - vals = append(vals, val) - } - } - return vals, nil -} - -// parseTimesFormat transforms strings to times in given format. -func (k *Key) parseTimesFormat(format string, strs []string, addInvalid, returnOnInvalid bool) ([]time.Time, error) { - vals := make([]time.Time, 0, len(strs)) - for _, str := range strs { - val, err := time.Parse(format, str) - if err != nil && returnOnInvalid { - return nil, err - } - if err == nil || addInvalid { - vals = append(vals, val) - } - } - return vals, nil -} - -// SetValue changes key value. -func (k *Key) SetValue(v string) { - if k.s.f.BlockMode { - k.s.f.lock.Lock() - defer k.s.f.lock.Unlock() - } - - k.value = v - k.s.keysHash[k.name] = v -} diff --git a/vendor/github.com/go-ini/ini/parser.go b/vendor/github.com/go-ini/ini/parser.go deleted file mode 100644 index 826e893c0..000000000 --- a/vendor/github.com/go-ini/ini/parser.go +++ /dev/null @@ -1,477 +0,0 @@ -// Copyright 2015 Unknwon -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package ini - -import ( - "bufio" - "bytes" - "fmt" - "io" - "regexp" - "strconv" - "strings" - "unicode" -) - -var pythonMultiline = regexp.MustCompile("^(\\s+)([^\n]+)") - -type tokenType int - -const ( - _TOKEN_INVALID tokenType = iota - _TOKEN_COMMENT - _TOKEN_SECTION - _TOKEN_KEY -) - -type parser struct { - buf *bufio.Reader - isEOF bool - count int - comment *bytes.Buffer -} - -func newParser(r io.Reader) *parser { - return &parser{ - buf: bufio.NewReader(r), - count: 1, - comment: &bytes.Buffer{}, - } -} - -// BOM handles header of UTF-8, UTF-16 LE and UTF-16 BE's BOM format. -// http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding -func (p *parser) BOM() error { - mask, err := p.buf.Peek(2) - if err != nil && err != io.EOF { - return err - } else if len(mask) < 2 { - return nil - } - - switch { - case mask[0] == 254 && mask[1] == 255: - fallthrough - case mask[0] == 255 && mask[1] == 254: - p.buf.Read(mask) - case mask[0] == 239 && mask[1] == 187: - mask, err := p.buf.Peek(3) - if err != nil && err != io.EOF { - return err - } else if len(mask) < 3 { - return nil - } - if mask[2] == 191 { - p.buf.Read(mask) - } - } - return nil -} - -func (p *parser) readUntil(delim byte) ([]byte, error) { - data, err := p.buf.ReadBytes(delim) - if err != nil { - if err == io.EOF { - p.isEOF = true - } else { - return nil, err - } - } - return data, nil -} - -func cleanComment(in []byte) ([]byte, bool) { - i := bytes.IndexAny(in, "#;") - if i == -1 { - return nil, false - } - return in[i:], true -} - -func readKeyName(in []byte) (string, int, error) { - line := string(in) - - // Check if key name surrounded by quotes. - var keyQuote string - if line[0] == '"' { - if len(line) > 6 && string(line[0:3]) == `"""` { - keyQuote = `"""` - } else { - keyQuote = `"` - } - } else if line[0] == '`' { - keyQuote = "`" - } - - // Get out key name - endIdx := -1 - if len(keyQuote) > 0 { - startIdx := len(keyQuote) - // FIXME: fail case -> """"""name"""=value - pos := strings.Index(line[startIdx:], keyQuote) - if pos == -1 { - return "", -1, fmt.Errorf("missing closing key quote: %s", line) - } - pos += startIdx - - // Find key-value delimiter - i := strings.IndexAny(line[pos+startIdx:], "=:") - if i < 0 { - return "", -1, ErrDelimiterNotFound{line} - } - endIdx = pos + i - return strings.TrimSpace(line[startIdx:pos]), endIdx + startIdx + 1, nil - } - - endIdx = strings.IndexAny(line, "=:") - if endIdx < 0 { - return "", -1, ErrDelimiterNotFound{line} - } - return strings.TrimSpace(line[0:endIdx]), endIdx + 1, nil -} - -func (p *parser) readMultilines(line, val, valQuote string) (string, error) { - for { - data, err := p.readUntil('\n') - if err != nil { - return "", err - } - next := string(data) - - pos := strings.LastIndex(next, valQuote) - if pos > -1 { - val += next[:pos] - - comment, has := cleanComment([]byte(next[pos:])) - if has { - p.comment.Write(bytes.TrimSpace(comment)) - } - break - } - val += next - if p.isEOF { - return "", fmt.Errorf("missing closing key quote from '%s' to '%s'", line, next) - } - } - return val, nil -} - -func (p *parser) readContinuationLines(val string) (string, error) { - for { - data, err := p.readUntil('\n') - if err != nil { - return "", err - } - next := strings.TrimSpace(string(data)) - - if len(next) == 0 { - break - } - val += next - if val[len(val)-1] != '\\' { - break - } - val = val[:len(val)-1] - } - return val, nil -} - -// hasSurroundedQuote check if and only if the first and last characters -// are quotes \" or \'. -// It returns false if any other parts also contain same kind of quotes. -func hasSurroundedQuote(in string, quote byte) bool { - return len(in) >= 2 && in[0] == quote && in[len(in)-1] == quote && - strings.IndexByte(in[1:], quote) == len(in)-2 -} - -func (p *parser) readValue(in []byte, - parserBufferSize int, - ignoreContinuation, ignoreInlineComment, unescapeValueDoubleQuotes, unescapeValueCommentSymbols, allowPythonMultilines bool) (string, error) { - - line := strings.TrimLeftFunc(string(in), unicode.IsSpace) - if len(line) == 0 { - return "", nil - } - - var valQuote string - if len(line) > 3 && string(line[0:3]) == `"""` { - valQuote = `"""` - } else if line[0] == '`' { - valQuote = "`" - } else if unescapeValueDoubleQuotes && line[0] == '"' { - valQuote = `"` - } - - if len(valQuote) > 0 { - startIdx := len(valQuote) - pos := strings.LastIndex(line[startIdx:], valQuote) - // Check for multi-line value - if pos == -1 { - return p.readMultilines(line, line[startIdx:], valQuote) - } - - if unescapeValueDoubleQuotes && valQuote == `"` { - return strings.Replace(line[startIdx:pos+startIdx], `\"`, `"`, -1), nil - } - return line[startIdx : pos+startIdx], nil - } - - lastChar := line[len(line)-1] - // Won't be able to reach here if value only contains whitespace - line = strings.TrimSpace(line) - trimmedLastChar := line[len(line)-1] - - // Check continuation lines when desired - if !ignoreContinuation && trimmedLastChar == '\\' { - return p.readContinuationLines(line[:len(line)-1]) - } - - // Check if ignore inline comment - if !ignoreInlineComment { - i := strings.IndexAny(line, "#;") - if i > -1 { - p.comment.WriteString(line[i:]) - line = strings.TrimSpace(line[:i]) - } - } - - // Trim single and double quotes - if hasSurroundedQuote(line, '\'') || - hasSurroundedQuote(line, '"') { - line = line[1 : len(line)-1] - } else if len(valQuote) == 0 && unescapeValueCommentSymbols { - if strings.Contains(line, `\;`) { - line = strings.Replace(line, `\;`, ";", -1) - } - if strings.Contains(line, `\#`) { - line = strings.Replace(line, `\#`, "#", -1) - } - } else if allowPythonMultilines && lastChar == '\n' { - parserBufferPeekResult, _ := p.buf.Peek(parserBufferSize) - peekBuffer := bytes.NewBuffer(parserBufferPeekResult) - - identSize := -1 - val := line - - for { - peekData, peekErr := peekBuffer.ReadBytes('\n') - if peekErr != nil { - if peekErr == io.EOF { - return val, nil - } - return "", peekErr - } - - peekMatches := pythonMultiline.FindStringSubmatch(string(peekData)) - if len(peekMatches) != 3 { - return val, nil - } - - currentIdentSize := len(peekMatches[1]) - // NOTE: Return if not a python-ini multi-line value. - if currentIdentSize < 0 { - return val, nil - } - identSize = currentIdentSize - - // NOTE: Just advance the parser reader (buffer) in-sync with the peek buffer. - _, err := p.readUntil('\n') - if err != nil { - return "", err - } - - val += fmt.Sprintf("\n%s", peekMatches[2]) - } - - // NOTE: If it was a Python multi-line value, - // return the appended value. - if identSize > 0 { - return val, nil - } - } - - return line, nil -} - -// parse parses data through an io.Reader. -func (f *File) parse(reader io.Reader) (err error) { - p := newParser(reader) - if err = p.BOM(); err != nil { - return fmt.Errorf("BOM: %v", err) - } - - // Ignore error because default section name is never empty string. - name := DEFAULT_SECTION - if f.options.Insensitive { - name = strings.ToLower(DEFAULT_SECTION) - } - section, _ := f.NewSection(name) - - // This "last" is not strictly equivalent to "previous one" if current key is not the first nested key - var isLastValueEmpty bool - var lastRegularKey *Key - - var line []byte - var inUnparseableSection bool - - // NOTE: Iterate and increase `currentPeekSize` until - // the size of the parser buffer is found. - // TODO: When Golang 1.10 is the lowest version supported, - // replace with `parserBufferSize := p.buf.Size()`. - parserBufferSize := 0 - // NOTE: Peek 1kb at a time. - currentPeekSize := 1024 - - if f.options.AllowPythonMultilineValues { - for { - peekBytes, _ := p.buf.Peek(currentPeekSize) - peekBytesLength := len(peekBytes) - - if parserBufferSize >= peekBytesLength { - break - } - - currentPeekSize *= 2 - parserBufferSize = peekBytesLength - } - } - - for !p.isEOF { - line, err = p.readUntil('\n') - if err != nil { - return err - } - - if f.options.AllowNestedValues && - isLastValueEmpty && len(line) > 0 { - if line[0] == ' ' || line[0] == '\t' { - lastRegularKey.addNestedValue(string(bytes.TrimSpace(line))) - continue - } - } - - line = bytes.TrimLeftFunc(line, unicode.IsSpace) - if len(line) == 0 { - continue - } - - // Comments - if line[0] == '#' || line[0] == ';' { - // Note: we do not care ending line break, - // it is needed for adding second line, - // so just clean it once at the end when set to value. - p.comment.Write(line) - continue - } - - // Section - if line[0] == '[' { - // Read to the next ']' (TODO: support quoted strings) - // TODO(unknwon): use LastIndexByte when stop supporting Go1.4 - closeIdx := bytes.LastIndex(line, []byte("]")) - if closeIdx == -1 { - return fmt.Errorf("unclosed section: %s", line) - } - - name := string(line[1:closeIdx]) - section, err = f.NewSection(name) - if err != nil { - return err - } - - comment, has := cleanComment(line[closeIdx+1:]) - if has { - p.comment.Write(comment) - } - - section.Comment = strings.TrimSpace(p.comment.String()) - - // Reset aotu-counter and comments - p.comment.Reset() - p.count = 1 - - inUnparseableSection = false - for i := range f.options.UnparseableSections { - if f.options.UnparseableSections[i] == name || - (f.options.Insensitive && strings.ToLower(f.options.UnparseableSections[i]) == strings.ToLower(name)) { - inUnparseableSection = true - continue - } - } - continue - } - - if inUnparseableSection { - section.isRawSection = true - section.rawBody += string(line) - continue - } - - kname, offset, err := readKeyName(line) - if err != nil { - // Treat as boolean key when desired, and whole line is key name. - if IsErrDelimiterNotFound(err) && f.options.AllowBooleanKeys { - kname, err := p.readValue(line, - parserBufferSize, - f.options.IgnoreContinuation, - f.options.IgnoreInlineComment, - f.options.UnescapeValueDoubleQuotes, - f.options.UnescapeValueCommentSymbols, - f.options.AllowPythonMultilineValues) - if err != nil { - return err - } - key, err := section.NewBooleanKey(kname) - if err != nil { - return err - } - key.Comment = strings.TrimSpace(p.comment.String()) - p.comment.Reset() - continue - } - return err - } - - // Auto increment. - isAutoIncr := false - if kname == "-" { - isAutoIncr = true - kname = "#" + strconv.Itoa(p.count) - p.count++ - } - - value, err := p.readValue(line[offset:], - parserBufferSize, - f.options.IgnoreContinuation, - f.options.IgnoreInlineComment, - f.options.UnescapeValueDoubleQuotes, - f.options.UnescapeValueCommentSymbols, - f.options.AllowPythonMultilineValues) - if err != nil { - return err - } - isLastValueEmpty = len(value) == 0 - - key, err := section.NewKey(kname, value) - if err != nil { - return err - } - key.isAutoIncrement = isAutoIncr - key.Comment = strings.TrimSpace(p.comment.String()) - p.comment.Reset() - lastRegularKey = key - } - return nil -} diff --git a/vendor/github.com/go-ini/ini/section.go b/vendor/github.com/go-ini/ini/section.go deleted file mode 100644 index d8a402619..000000000 --- a/vendor/github.com/go-ini/ini/section.go +++ /dev/null @@ -1,257 +0,0 @@ -// Copyright 2014 Unknwon -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package ini - -import ( - "errors" - "fmt" - "strings" -) - -// Section represents a config section. -type Section struct { - f *File - Comment string - name string - keys map[string]*Key - keyList []string - keysHash map[string]string - - isRawSection bool - rawBody string -} - -func newSection(f *File, name string) *Section { - return &Section{ - f: f, - name: name, - keys: make(map[string]*Key), - keyList: make([]string, 0, 10), - keysHash: make(map[string]string), - } -} - -// Name returns name of Section. -func (s *Section) Name() string { - return s.name -} - -// Body returns rawBody of Section if the section was marked as unparseable. -// It still follows the other rules of the INI format surrounding leading/trailing whitespace. -func (s *Section) Body() string { - return strings.TrimSpace(s.rawBody) -} - -// SetBody updates body content only if section is raw. -func (s *Section) SetBody(body string) { - if !s.isRawSection { - return - } - s.rawBody = body -} - -// NewKey creates a new key to given section. -func (s *Section) NewKey(name, val string) (*Key, error) { - if len(name) == 0 { - return nil, errors.New("error creating new key: empty key name") - } else if s.f.options.Insensitive { - name = strings.ToLower(name) - } - - if s.f.BlockMode { - s.f.lock.Lock() - defer s.f.lock.Unlock() - } - - if inSlice(name, s.keyList) { - if s.f.options.AllowShadows { - if err := s.keys[name].addShadow(val); err != nil { - return nil, err - } - } else { - s.keys[name].value = val - } - return s.keys[name], nil - } - - s.keyList = append(s.keyList, name) - s.keys[name] = newKey(s, name, val) - s.keysHash[name] = val - return s.keys[name], nil -} - -// NewBooleanKey creates a new boolean type key to given section. -func (s *Section) NewBooleanKey(name string) (*Key, error) { - key, err := s.NewKey(name, "true") - if err != nil { - return nil, err - } - - key.isBooleanType = true - return key, nil -} - -// GetKey returns key in section by given name. -func (s *Section) GetKey(name string) (*Key, error) { - // FIXME: change to section level lock? - if s.f.BlockMode { - s.f.lock.RLock() - } - if s.f.options.Insensitive { - name = strings.ToLower(name) - } - key := s.keys[name] - if s.f.BlockMode { - s.f.lock.RUnlock() - } - - if key == nil { - // Check if it is a child-section. - sname := s.name - for { - if i := strings.LastIndex(sname, "."); i > -1 { - sname = sname[:i] - sec, err := s.f.GetSection(sname) - if err != nil { - continue - } - return sec.GetKey(name) - } else { - break - } - } - return nil, fmt.Errorf("error when getting key of section '%s': key '%s' not exists", s.name, name) - } - return key, nil -} - -// HasKey returns true if section contains a key with given name. -func (s *Section) HasKey(name string) bool { - key, _ := s.GetKey(name) - return key != nil -} - -// Haskey is a backwards-compatible name for HasKey. -// TODO: delete me in v2 -func (s *Section) Haskey(name string) bool { - return s.HasKey(name) -} - -// HasValue returns true if section contains given raw value. -func (s *Section) HasValue(value string) bool { - if s.f.BlockMode { - s.f.lock.RLock() - defer s.f.lock.RUnlock() - } - - for _, k := range s.keys { - if value == k.value { - return true - } - } - return false -} - -// Key assumes named Key exists in section and returns a zero-value when not. -func (s *Section) Key(name string) *Key { - key, err := s.GetKey(name) - if err != nil { - // It's OK here because the only possible error is empty key name, - // but if it's empty, this piece of code won't be executed. - key, _ = s.NewKey(name, "") - return key - } - return key -} - -// Keys returns list of keys of section. -func (s *Section) Keys() []*Key { - keys := make([]*Key, len(s.keyList)) - for i := range s.keyList { - keys[i] = s.Key(s.keyList[i]) - } - return keys -} - -// ParentKeys returns list of keys of parent section. -func (s *Section) ParentKeys() []*Key { - var parentKeys []*Key - sname := s.name - for { - if i := strings.LastIndex(sname, "."); i > -1 { - sname = sname[:i] - sec, err := s.f.GetSection(sname) - if err != nil { - continue - } - parentKeys = append(parentKeys, sec.Keys()...) - } else { - break - } - - } - return parentKeys -} - -// KeyStrings returns list of key names of section. -func (s *Section) KeyStrings() []string { - list := make([]string, len(s.keyList)) - copy(list, s.keyList) - return list -} - -// KeysHash returns keys hash consisting of names and values. -func (s *Section) KeysHash() map[string]string { - if s.f.BlockMode { - s.f.lock.RLock() - defer s.f.lock.RUnlock() - } - - hash := map[string]string{} - for key, value := range s.keysHash { - hash[key] = value - } - return hash -} - -// DeleteKey deletes a key from section. -func (s *Section) DeleteKey(name string) { - if s.f.BlockMode { - s.f.lock.Lock() - defer s.f.lock.Unlock() - } - - for i, k := range s.keyList { - if k == name { - s.keyList = append(s.keyList[:i], s.keyList[i+1:]...) - delete(s.keys, name) - return - } - } -} - -// ChildSections returns a list of child sections of current section. -// For example, "[parent.child1]" and "[parent.child12]" are child sections -// of section "[parent]". -func (s *Section) ChildSections() []*Section { - prefix := s.name + "." - children := make([]*Section, 0, 3) - for _, name := range s.f.sectionList { - if strings.HasPrefix(name, prefix) { - children = append(children, s.f.sections[name]) - } - } - return children -} diff --git a/vendor/github.com/go-ini/ini/struct.go b/vendor/github.com/go-ini/ini/struct.go deleted file mode 100644 index 9719dc698..000000000 --- a/vendor/github.com/go-ini/ini/struct.go +++ /dev/null @@ -1,512 +0,0 @@ -// Copyright 2014 Unknwon -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package ini - -import ( - "bytes" - "errors" - "fmt" - "reflect" - "strings" - "time" - "unicode" -) - -// NameMapper represents a ini tag name mapper. -type NameMapper func(string) string - -// Built-in name getters. -var ( - // AllCapsUnderscore converts to format ALL_CAPS_UNDERSCORE. - AllCapsUnderscore NameMapper = func(raw string) string { - newstr := make([]rune, 0, len(raw)) - for i, chr := range raw { - if isUpper := 'A' <= chr && chr <= 'Z'; isUpper { - if i > 0 { - newstr = append(newstr, '_') - } - } - newstr = append(newstr, unicode.ToUpper(chr)) - } - return string(newstr) - } - // TitleUnderscore converts to format title_underscore. - TitleUnderscore NameMapper = func(raw string) string { - newstr := make([]rune, 0, len(raw)) - for i, chr := range raw { - if isUpper := 'A' <= chr && chr <= 'Z'; isUpper { - if i > 0 { - newstr = append(newstr, '_') - } - chr -= ('A' - 'a') - } - newstr = append(newstr, chr) - } - return string(newstr) - } -) - -func (s *Section) parseFieldName(raw, actual string) string { - if len(actual) > 0 { - return actual - } - if s.f.NameMapper != nil { - return s.f.NameMapper(raw) - } - return raw -} - -func parseDelim(actual string) string { - if len(actual) > 0 { - return actual - } - return "," -} - -var reflectTime = reflect.TypeOf(time.Now()).Kind() - -// setSliceWithProperType sets proper values to slice based on its type. -func setSliceWithProperType(key *Key, field reflect.Value, delim string, allowShadow, isStrict bool) error { - var strs []string - if allowShadow { - strs = key.StringsWithShadows(delim) - } else { - strs = key.Strings(delim) - } - - numVals := len(strs) - if numVals == 0 { - return nil - } - - var vals interface{} - var err error - - sliceOf := field.Type().Elem().Kind() - switch sliceOf { - case reflect.String: - vals = strs - case reflect.Int: - vals, err = key.parseInts(strs, true, false) - case reflect.Int64: - vals, err = key.parseInt64s(strs, true, false) - case reflect.Uint: - vals, err = key.parseUints(strs, true, false) - case reflect.Uint64: - vals, err = key.parseUint64s(strs, true, false) - case reflect.Float64: - vals, err = key.parseFloat64s(strs, true, false) - case reflectTime: - vals, err = key.parseTimesFormat(time.RFC3339, strs, true, false) - default: - return fmt.Errorf("unsupported type '[]%s'", sliceOf) - } - if err != nil && isStrict { - return err - } - - slice := reflect.MakeSlice(field.Type(), numVals, numVals) - for i := 0; i < numVals; i++ { - switch sliceOf { - case reflect.String: - slice.Index(i).Set(reflect.ValueOf(vals.([]string)[i])) - case reflect.Int: - slice.Index(i).Set(reflect.ValueOf(vals.([]int)[i])) - case reflect.Int64: - slice.Index(i).Set(reflect.ValueOf(vals.([]int64)[i])) - case reflect.Uint: - slice.Index(i).Set(reflect.ValueOf(vals.([]uint)[i])) - case reflect.Uint64: - slice.Index(i).Set(reflect.ValueOf(vals.([]uint64)[i])) - case reflect.Float64: - slice.Index(i).Set(reflect.ValueOf(vals.([]float64)[i])) - case reflectTime: - slice.Index(i).Set(reflect.ValueOf(vals.([]time.Time)[i])) - } - } - field.Set(slice) - return nil -} - -func wrapStrictError(err error, isStrict bool) error { - if isStrict { - return err - } - return nil -} - -// setWithProperType sets proper value to field based on its type, -// but it does not return error for failing parsing, -// because we want to use default value that is already assigned to strcut. -func setWithProperType(t reflect.Type, key *Key, field reflect.Value, delim string, allowShadow, isStrict bool) error { - switch t.Kind() { - case reflect.String: - if len(key.String()) == 0 { - return nil - } - field.SetString(key.String()) - case reflect.Bool: - boolVal, err := key.Bool() - if err != nil { - return wrapStrictError(err, isStrict) - } - field.SetBool(boolVal) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - durationVal, err := key.Duration() - // Skip zero value - if err == nil && int64(durationVal) > 0 { - field.Set(reflect.ValueOf(durationVal)) - return nil - } - - intVal, err := key.Int64() - if err != nil { - return wrapStrictError(err, isStrict) - } - field.SetInt(intVal) - // byte is an alias for uint8, so supporting uint8 breaks support for byte - case reflect.Uint, reflect.Uint16, reflect.Uint32, reflect.Uint64: - durationVal, err := key.Duration() - // Skip zero value - if err == nil && int(durationVal) > 0 { - field.Set(reflect.ValueOf(durationVal)) - return nil - } - - uintVal, err := key.Uint64() - if err != nil { - return wrapStrictError(err, isStrict) - } - field.SetUint(uintVal) - - case reflect.Float32, reflect.Float64: - floatVal, err := key.Float64() - if err != nil { - return wrapStrictError(err, isStrict) - } - field.SetFloat(floatVal) - case reflectTime: - timeVal, err := key.Time() - if err != nil { - return wrapStrictError(err, isStrict) - } - field.Set(reflect.ValueOf(timeVal)) - case reflect.Slice: - return setSliceWithProperType(key, field, delim, allowShadow, isStrict) - default: - return fmt.Errorf("unsupported type '%s'", t) - } - return nil -} - -func parseTagOptions(tag string) (rawName string, omitEmpty bool, allowShadow bool) { - opts := strings.SplitN(tag, ",", 3) - rawName = opts[0] - if len(opts) > 1 { - omitEmpty = opts[1] == "omitempty" - } - if len(opts) > 2 { - allowShadow = opts[2] == "allowshadow" - } - return rawName, omitEmpty, allowShadow -} - -func (s *Section) mapTo(val reflect.Value, isStrict bool) error { - if val.Kind() == reflect.Ptr { - val = val.Elem() - } - typ := val.Type() - - for i := 0; i < typ.NumField(); i++ { - field := val.Field(i) - tpField := typ.Field(i) - - tag := tpField.Tag.Get("ini") - if tag == "-" { - continue - } - - rawName, _, allowShadow := parseTagOptions(tag) - fieldName := s.parseFieldName(tpField.Name, rawName) - if len(fieldName) == 0 || !field.CanSet() { - continue - } - - isAnonymous := tpField.Type.Kind() == reflect.Ptr && tpField.Anonymous - isStruct := tpField.Type.Kind() == reflect.Struct - if isAnonymous { - field.Set(reflect.New(tpField.Type.Elem())) - } - - if isAnonymous || isStruct { - if sec, err := s.f.GetSection(fieldName); err == nil { - if err = sec.mapTo(field, isStrict); err != nil { - return fmt.Errorf("error mapping field(%s): %v", fieldName, err) - } - continue - } - } - - if key, err := s.GetKey(fieldName); err == nil { - delim := parseDelim(tpField.Tag.Get("delim")) - if err = setWithProperType(tpField.Type, key, field, delim, allowShadow, isStrict); err != nil { - return fmt.Errorf("error mapping field(%s): %v", fieldName, err) - } - } - } - return nil -} - -// MapTo maps section to given struct. -func (s *Section) MapTo(v interface{}) error { - typ := reflect.TypeOf(v) - val := reflect.ValueOf(v) - if typ.Kind() == reflect.Ptr { - typ = typ.Elem() - val = val.Elem() - } else { - return errors.New("cannot map to non-pointer struct") - } - - return s.mapTo(val, false) -} - -// MapTo maps section to given struct in strict mode, -// which returns all possible error including value parsing error. -func (s *Section) StrictMapTo(v interface{}) error { - typ := reflect.TypeOf(v) - val := reflect.ValueOf(v) - if typ.Kind() == reflect.Ptr { - typ = typ.Elem() - val = val.Elem() - } else { - return errors.New("cannot map to non-pointer struct") - } - - return s.mapTo(val, true) -} - -// MapTo maps file to given struct. -func (f *File) MapTo(v interface{}) error { - return f.Section("").MapTo(v) -} - -// MapTo maps file to given struct in strict mode, -// which returns all possible error including value parsing error. -func (f *File) StrictMapTo(v interface{}) error { - return f.Section("").StrictMapTo(v) -} - -// MapTo maps data sources to given struct with name mapper. -func MapToWithMapper(v interface{}, mapper NameMapper, source interface{}, others ...interface{}) error { - cfg, err := Load(source, others...) - if err != nil { - return err - } - cfg.NameMapper = mapper - return cfg.MapTo(v) -} - -// StrictMapToWithMapper maps data sources to given struct with name mapper in strict mode, -// which returns all possible error including value parsing error. -func StrictMapToWithMapper(v interface{}, mapper NameMapper, source interface{}, others ...interface{}) error { - cfg, err := Load(source, others...) - if err != nil { - return err - } - cfg.NameMapper = mapper - return cfg.StrictMapTo(v) -} - -// MapTo maps data sources to given struct. -func MapTo(v, source interface{}, others ...interface{}) error { - return MapToWithMapper(v, nil, source, others...) -} - -// StrictMapTo maps data sources to given struct in strict mode, -// which returns all possible error including value parsing error. -func StrictMapTo(v, source interface{}, others ...interface{}) error { - return StrictMapToWithMapper(v, nil, source, others...) -} - -// reflectSliceWithProperType does the opposite thing as setSliceWithProperType. -func reflectSliceWithProperType(key *Key, field reflect.Value, delim string) error { - slice := field.Slice(0, field.Len()) - if field.Len() == 0 { - return nil - } - - var buf bytes.Buffer - sliceOf := field.Type().Elem().Kind() - for i := 0; i < field.Len(); i++ { - switch sliceOf { - case reflect.String: - buf.WriteString(slice.Index(i).String()) - case reflect.Int, reflect.Int64: - buf.WriteString(fmt.Sprint(slice.Index(i).Int())) - case reflect.Uint, reflect.Uint64: - buf.WriteString(fmt.Sprint(slice.Index(i).Uint())) - case reflect.Float64: - buf.WriteString(fmt.Sprint(slice.Index(i).Float())) - case reflectTime: - buf.WriteString(slice.Index(i).Interface().(time.Time).Format(time.RFC3339)) - default: - return fmt.Errorf("unsupported type '[]%s'", sliceOf) - } - buf.WriteString(delim) - } - key.SetValue(buf.String()[:buf.Len()-1]) - return nil -} - -// reflectWithProperType does the opposite thing as setWithProperType. -func reflectWithProperType(t reflect.Type, key *Key, field reflect.Value, delim string) error { - switch t.Kind() { - case reflect.String: - key.SetValue(field.String()) - case reflect.Bool: - key.SetValue(fmt.Sprint(field.Bool())) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - key.SetValue(fmt.Sprint(field.Int())) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - key.SetValue(fmt.Sprint(field.Uint())) - case reflect.Float32, reflect.Float64: - key.SetValue(fmt.Sprint(field.Float())) - case reflectTime: - key.SetValue(fmt.Sprint(field.Interface().(time.Time).Format(time.RFC3339))) - case reflect.Slice: - return reflectSliceWithProperType(key, field, delim) - default: - return fmt.Errorf("unsupported type '%s'", t) - } - return nil -} - -// CR: copied from encoding/json/encode.go with modifications of time.Time support. -// TODO: add more test coverage. -func isEmptyValue(v reflect.Value) bool { - switch v.Kind() { - case reflect.Array, reflect.Map, reflect.Slice, reflect.String: - return v.Len() == 0 - case reflect.Bool: - return !v.Bool() - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return v.Int() == 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return v.Uint() == 0 - case reflect.Float32, reflect.Float64: - return v.Float() == 0 - case reflect.Interface, reflect.Ptr: - return v.IsNil() - case reflectTime: - t, ok := v.Interface().(time.Time) - return ok && t.IsZero() - } - return false -} - -func (s *Section) reflectFrom(val reflect.Value) error { - if val.Kind() == reflect.Ptr { - val = val.Elem() - } - typ := val.Type() - - for i := 0; i < typ.NumField(); i++ { - field := val.Field(i) - tpField := typ.Field(i) - - tag := tpField.Tag.Get("ini") - if tag == "-" { - continue - } - - opts := strings.SplitN(tag, ",", 2) - if len(opts) == 2 && opts[1] == "omitempty" && isEmptyValue(field) { - continue - } - - fieldName := s.parseFieldName(tpField.Name, opts[0]) - if len(fieldName) == 0 || !field.CanSet() { - continue - } - - if (tpField.Type.Kind() == reflect.Ptr && tpField.Anonymous) || - (tpField.Type.Kind() == reflect.Struct && tpField.Type.Name() != "Time") { - // Note: The only error here is section doesn't exist. - sec, err := s.f.GetSection(fieldName) - if err != nil { - // Note: fieldName can never be empty here, ignore error. - sec, _ = s.f.NewSection(fieldName) - } - - // Add comment from comment tag - if len(sec.Comment) == 0 { - sec.Comment = tpField.Tag.Get("comment") - } - - if err = sec.reflectFrom(field); err != nil { - return fmt.Errorf("error reflecting field (%s): %v", fieldName, err) - } - continue - } - - // Note: Same reason as secion. - key, err := s.GetKey(fieldName) - if err != nil { - key, _ = s.NewKey(fieldName, "") - } - - // Add comment from comment tag - if len(key.Comment) == 0 { - key.Comment = tpField.Tag.Get("comment") - } - - if err = reflectWithProperType(tpField.Type, key, field, parseDelim(tpField.Tag.Get("delim"))); err != nil { - return fmt.Errorf("error reflecting field (%s): %v", fieldName, err) - } - - } - return nil -} - -// ReflectFrom reflects secion from given struct. -func (s *Section) ReflectFrom(v interface{}) error { - typ := reflect.TypeOf(v) - val := reflect.ValueOf(v) - if typ.Kind() == reflect.Ptr { - typ = typ.Elem() - val = val.Elem() - } else { - return errors.New("cannot reflect from non-pointer struct") - } - - return s.reflectFrom(val) -} - -// ReflectFrom reflects file from given struct. -func (f *File) ReflectFrom(v interface{}) error { - return f.Section("").ReflectFrom(v) -} - -// ReflectFrom reflects data sources from given struct with name mapper. -func ReflectFromWithMapper(cfg *File, v interface{}, mapper NameMapper) error { - cfg.NameMapper = mapper - return cfg.ReflectFrom(v) -} - -// ReflectFrom reflects data sources from given struct. -func ReflectFrom(cfg *File, v interface{}) error { - return ReflectFromWithMapper(cfg, v, nil) -} diff --git a/vendor/github.com/go-ole/go-ole/.travis.yml b/vendor/github.com/go-ole/go-ole/.travis.yml index 0c2c02bdf..28f740cd5 100644 --- a/vendor/github.com/go-ole/go-ole/.travis.yml +++ b/vendor/github.com/go-ole/go-ole/.travis.yml @@ -2,8 +2,7 @@ language: go sudo: false go: - - 1.1 - - 1.2 - - 1.3 - - 1.4 + - 1.9.x + - 1.10.x + - 1.11.x - tip diff --git a/vendor/github.com/go-ole/go-ole/README.md b/vendor/github.com/go-ole/go-ole/README.md index 0ea9db33c..7b577558d 100644 --- a/vendor/github.com/go-ole/go-ole/README.md +++ b/vendor/github.com/go-ole/go-ole/README.md @@ -1,4 +1,4 @@ -#Go OLE +# Go OLE [![Build status](https://ci.appveyor.com/api/projects/status/qr0u2sf7q43us9fj?svg=true)](https://ci.appveyor.com/project/jacobsantos/go-ole-jgs28) [![Build Status](https://travis-ci.org/go-ole/go-ole.svg?branch=master)](https://travis-ci.org/go-ole/go-ole) @@ -35,12 +35,12 @@ AppVeyor is used to build on Windows using the (in-development) test COM server. The tests currently do run and do pass and this should be maintained with commits. -##Versioning +## Versioning Go OLE uses [semantic versioning](http://semver.org) for version numbers, which is similar to the version contract of the Go language. Which means that the major version will always maintain backwards compatibility with minor versions. Minor versions will only add new additions and changes. Fixes will always be in patch. This contract should allow you to upgrade to new minor and patch versions without breakage or modifications to your existing code. Leave a ticket, if there is breakage, so that it could be fixed. -##LICENSE +## LICENSE Under the MIT License: http://mattn.mit-license.org/2013 diff --git a/vendor/github.com/go-ole/go-ole/com.go b/vendor/github.com/go-ole/go-ole/com.go index 75ebbf13f..6f986b189 100644 --- a/vendor/github.com/go-ole/go-ole/com.go +++ b/vendor/github.com/go-ole/go-ole/com.go @@ -3,9 +3,7 @@ package ole import ( - "errors" "syscall" - "time" "unicode/utf16" "unsafe" ) @@ -21,6 +19,7 @@ var ( procStringFromCLSID, _ = modole32.FindProc("StringFromCLSID") procStringFromIID, _ = modole32.FindProc("StringFromIID") procIIDFromString, _ = modole32.FindProc("IIDFromString") + procCoGetObject, _ = modole32.FindProc("CoGetObject") procGetUserDefaultLCID, _ = modkernel32.FindProc("GetUserDefaultLCID") procCopyMemory, _ = modkernel32.FindProc("RtlMoveMemory") procVariantInit, _ = modoleaut32.FindProc("VariantInit") @@ -209,6 +208,32 @@ func GetActiveObject(clsid *GUID, iid *GUID) (unk *IUnknown, err error) { return } +type BindOpts struct { + CbStruct uint32 + GrfFlags uint32 + GrfMode uint32 + TickCountDeadline uint32 +} + +// GetObject retrieves pointer to active object. +func GetObject(programID string, bindOpts *BindOpts, iid *GUID) (unk *IUnknown, err error) { + if bindOpts != nil { + bindOpts.CbStruct = uint32(unsafe.Sizeof(BindOpts{})) + } + if iid == nil { + iid = IID_IUnknown + } + hr, _, _ := procCoGetObject.Call( + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(programID))), + uintptr(unsafe.Pointer(bindOpts)), + uintptr(unsafe.Pointer(iid)), + uintptr(unsafe.Pointer(&unk))) + if hr != 0 { + err = NewError(hr) + } + return +} + // VariantInit initializes variant. func VariantInit(v *VARIANT) (err error) { hr, _, _ := procVariantInit.Call(uintptr(unsafe.Pointer(v))) @@ -317,13 +342,3 @@ func DispatchMessage(msg *Msg) (ret int32) { ret = int32(r0) return } - -// GetVariantDate converts COM Variant Time value to Go time.Time. -func GetVariantDate(value float64) (time.Time, error) { - var st syscall.Systemtime - r, _, _ := procVariantTimeToSystemTime.Call(uintptr(value), uintptr(unsafe.Pointer(&st))) - if r != 0 { - return time.Date(int(st.Year), time.Month(st.Month), int(st.Day), int(st.Hour), int(st.Minute), int(st.Second), int(st.Milliseconds/1000), time.UTC), nil - } - return time.Now(), errors.New("Could not convert to time, passing current time.") -} diff --git a/vendor/github.com/go-ole/go-ole/com_func.go b/vendor/github.com/go-ole/go-ole/com_func.go index 425aad323..cef539d9d 100644 --- a/vendor/github.com/go-ole/go-ole/com_func.go +++ b/vendor/github.com/go-ole/go-ole/com_func.go @@ -169,6 +169,6 @@ func DispatchMessage(msg *Msg) int32 { return int32(0) } -func GetVariantDate(value float64) (time.Time, error) { +func GetVariantDate(value uint64) (time.Time, error) { return time.Now(), NewError(E_NOTIMPL) } diff --git a/vendor/github.com/go-ole/go-ole/go.mod b/vendor/github.com/go-ole/go-ole/go.mod new file mode 100644 index 000000000..df98533ea --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/go.mod @@ -0,0 +1,3 @@ +module github.com/go-ole/go-ole + +go 1.12 diff --git a/vendor/github.com/go-ole/go-ole/idispatch_windows.go b/vendor/github.com/go-ole/go-ole/idispatch_windows.go index 020e4f51b..6ec180b55 100644 --- a/vendor/github.com/go-ole/go-ole/idispatch_windows.go +++ b/vendor/github.com/go-ole/go-ole/idispatch_windows.go @@ -3,6 +3,7 @@ package ole import ( + "math/big" "syscall" "time" "unsafe" @@ -132,6 +133,8 @@ func invoke(disp *IDispatch, dispid int32, dispatch int16, params ...interface{} vargs[n] = NewVariant(VT_R8, *(*int64)(unsafe.Pointer(&vv))) case *float64: vargs[n] = NewVariant(VT_R8|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*float64))))) + case *big.Int: + vargs[n] = NewVariant(VT_DECIMAL, v.(*big.Int).Int64()) case string: vargs[n] = NewVariant(VT_BSTR, int64(uintptr(unsafe.Pointer(SysAllocStringLen(v.(string)))))) case *string: diff --git a/vendor/github.com/go-ole/go-ole/safearray_func.go b/vendor/github.com/go-ole/go-ole/safearray_func.go index 8ff0baa41..0dee670ce 100644 --- a/vendor/github.com/go-ole/go-ole/safearray_func.go +++ b/vendor/github.com/go-ole/go-ole/safearray_func.go @@ -124,12 +124,12 @@ func safeArrayGetElementSize(safearray *SafeArray) (*uint32, error) { } // safeArrayGetElement retrieves element at given index. -func safeArrayGetElement(safearray *SafeArray, index int64, pv unsafe.Pointer) error { +func safeArrayGetElement(safearray *SafeArray, index int32, pv unsafe.Pointer) error { return NewError(E_NOTIMPL) } // safeArrayGetElement retrieves element at given index and converts to string. -func safeArrayGetElementString(safearray *SafeArray, index int64) (string, error) { +func safeArrayGetElementString(safearray *SafeArray, index int32) (string, error) { return "", NewError(E_NOTIMPL) } @@ -146,8 +146,8 @@ func safeArrayGetIID(safearray *SafeArray) (*GUID, error) { // multidimensional array. // // AKA: SafeArrayGetLBound in Windows API. -func safeArrayGetLBound(safearray *SafeArray, dimension uint32) (int64, error) { - return int64(0), NewError(E_NOTIMPL) +func safeArrayGetLBound(safearray *SafeArray, dimension uint32) (int32, error) { + return int32(0), NewError(E_NOTIMPL) } // safeArrayGetUBound returns upper bounds of SafeArray. @@ -156,8 +156,8 @@ func safeArrayGetLBound(safearray *SafeArray, dimension uint32) (int64, error) { // multidimensional array. // // AKA: SafeArrayGetUBound in Windows API. -func safeArrayGetUBound(safearray *SafeArray, dimension uint32) (int64, error) { - return int64(0), NewError(E_NOTIMPL) +func safeArrayGetUBound(safearray *SafeArray, dimension uint32) (int32, error) { + return int32(0), NewError(E_NOTIMPL) } // safeArrayGetVartype returns data type of SafeArray. diff --git a/vendor/github.com/go-ole/go-ole/safearray_windows.go b/vendor/github.com/go-ole/go-ole/safearray_windows.go index b27936e24..b48a2394d 100644 --- a/vendor/github.com/go-ole/go-ole/safearray_windows.go +++ b/vendor/github.com/go-ole/go-ole/safearray_windows.go @@ -205,7 +205,7 @@ func safeArrayGetElementSize(safearray *SafeArray) (length *uint32, err error) { } // safeArrayGetElement retrieves element at given index. -func safeArrayGetElement(safearray *SafeArray, index int64, pv unsafe.Pointer) error { +func safeArrayGetElement(safearray *SafeArray, index int32, pv unsafe.Pointer) error { return convertHresultToError( procSafeArrayGetElement.Call( uintptr(unsafe.Pointer(safearray)), @@ -214,7 +214,7 @@ func safeArrayGetElement(safearray *SafeArray, index int64, pv unsafe.Pointer) e } // safeArrayGetElementString retrieves element at given index and converts to string. -func safeArrayGetElementString(safearray *SafeArray, index int64) (str string, err error) { +func safeArrayGetElementString(safearray *SafeArray, index int32) (str string, err error) { var element *int16 err = convertHresultToError( procSafeArrayGetElement.Call( @@ -243,7 +243,7 @@ func safeArrayGetIID(safearray *SafeArray) (guid *GUID, err error) { // multidimensional array. // // AKA: SafeArrayGetLBound in Windows API. -func safeArrayGetLBound(safearray *SafeArray, dimension uint32) (lowerBound int64, err error) { +func safeArrayGetLBound(safearray *SafeArray, dimension uint32) (lowerBound int32, err error) { err = convertHresultToError( procSafeArrayGetLBound.Call( uintptr(unsafe.Pointer(safearray)), @@ -258,7 +258,7 @@ func safeArrayGetLBound(safearray *SafeArray, dimension uint32) (lowerBound int6 // multidimensional array. // // AKA: SafeArrayGetUBound in Windows API. -func safeArrayGetUBound(safearray *SafeArray, dimension uint32) (upperBound int64, err error) { +func safeArrayGetUBound(safearray *SafeArray, dimension uint32) (upperBound int32, err error) { err = convertHresultToError( procSafeArrayGetUBound.Call( uintptr(unsafe.Pointer(safearray)), diff --git a/vendor/github.com/go-ole/go-ole/safearrayconversion.go b/vendor/github.com/go-ole/go-ole/safearrayconversion.go index ffeb2b97b..259f488ec 100644 --- a/vendor/github.com/go-ole/go-ole/safearrayconversion.go +++ b/vendor/github.com/go-ole/go-ole/safearrayconversion.go @@ -14,7 +14,7 @@ func (sac *SafeArrayConversion) ToStringArray() (strings []string) { totalElements, _ := sac.TotalElements(0) strings = make([]string, totalElements) - for i := int64(0); i < totalElements; i++ { + for i := int32(0); i < totalElements; i++ { strings[int32(i)], _ = safeArrayGetElementString(sac.Array, i) } @@ -25,7 +25,7 @@ func (sac *SafeArrayConversion) ToByteArray() (bytes []byte) { totalElements, _ := sac.TotalElements(0) bytes = make([]byte, totalElements) - for i := int64(0); i < totalElements; i++ { + for i := int32(0); i < totalElements; i++ { safeArrayGetElement(sac.Array, i, unsafe.Pointer(&bytes[int32(i)])) } @@ -37,59 +37,59 @@ func (sac *SafeArrayConversion) ToValueArray() (values []interface{}) { values = make([]interface{}, totalElements) vt, _ := safeArrayGetVartype(sac.Array) - for i := 0; i < int(totalElements); i++ { + for i := int32(0); i < totalElements; i++ { switch VT(vt) { case VT_BOOL: var v bool - safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v)) + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) values[i] = v case VT_I1: var v int8 - safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v)) + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) values[i] = v case VT_I2: var v int16 - safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v)) + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) values[i] = v case VT_I4: var v int32 - safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v)) + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) values[i] = v case VT_I8: var v int64 - safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v)) + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) values[i] = v case VT_UI1: var v uint8 - safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v)) + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) values[i] = v case VT_UI2: var v uint16 - safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v)) + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) values[i] = v case VT_UI4: var v uint32 - safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v)) + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) values[i] = v case VT_UI8: var v uint64 - safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v)) + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) values[i] = v case VT_R4: var v float32 - safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v)) + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) values[i] = v case VT_R8: var v float64 - safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v)) + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) values[i] = v case VT_BSTR: var v string - safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v)) + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) values[i] = v case VT_VARIANT: var v VARIANT - safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v)) + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) values[i] = v.Value() default: // TODO @@ -111,14 +111,14 @@ func (sac *SafeArrayConversion) GetSize() (length *uint32, err error) { return safeArrayGetElementSize(sac.Array) } -func (sac *SafeArrayConversion) TotalElements(index uint32) (totalElements int64, err error) { +func (sac *SafeArrayConversion) TotalElements(index uint32) (totalElements int32, err error) { if index < 1 { index = 1 } // Get array bounds - var LowerBounds int64 - var UpperBounds int64 + var LowerBounds int32 + var UpperBounds int32 LowerBounds, err = safeArrayGetLBound(sac.Array, index) if err != nil { diff --git a/vendor/github.com/go-ole/go-ole/variant.go b/vendor/github.com/go-ole/go-ole/variant.go index 36969725e..967a23fea 100644 --- a/vendor/github.com/go-ole/go-ole/variant.go +++ b/vendor/github.com/go-ole/go-ole/variant.go @@ -88,10 +88,10 @@ func (v *VARIANT) Value() interface{} { return v.ToString() case VT_DATE: // VT_DATE type will either return float64 or time.Time. - d := float64(v.Val) + d := uint64(v.Val) date, err := GetVariantDate(d) if err != nil { - return d + return float64(v.Val) } return date case VT_UNKNOWN: diff --git a/vendor/github.com/go-ole/go-ole/variant_date_386.go b/vendor/github.com/go-ole/go-ole/variant_date_386.go new file mode 100644 index 000000000..1b970f63f --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/variant_date_386.go @@ -0,0 +1,22 @@ +// +build windows,386 + +package ole + +import ( + "errors" + "syscall" + "time" + "unsafe" +) + +// GetVariantDate converts COM Variant Time value to Go time.Time. +func GetVariantDate(value uint64) (time.Time, error) { + var st syscall.Systemtime + v1 := uint32(value) + v2 := uint32(value >> 32) + r, _, _ := procVariantTimeToSystemTime.Call(uintptr(v1), uintptr(v2), uintptr(unsafe.Pointer(&st))) + if r != 0 { + return time.Date(int(st.Year), time.Month(st.Month), int(st.Day), int(st.Hour), int(st.Minute), int(st.Second), int(st.Milliseconds/1000), time.UTC), nil + } + return time.Now(), errors.New("Could not convert to time, passing current time.") +} diff --git a/vendor/github.com/go-ole/go-ole/variant_date_amd64.go b/vendor/github.com/go-ole/go-ole/variant_date_amd64.go new file mode 100644 index 000000000..6952f1f0d --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/variant_date_amd64.go @@ -0,0 +1,20 @@ +// +build windows,amd64 + +package ole + +import ( + "errors" + "syscall" + "time" + "unsafe" +) + +// GetVariantDate converts COM Variant Time value to Go time.Time. +func GetVariantDate(value uint64) (time.Time, error) { + var st syscall.Systemtime + r, _, _ := procVariantTimeToSystemTime.Call(uintptr(value), uintptr(unsafe.Pointer(&st))) + if r != 0 { + return time.Date(int(st.Year), time.Month(st.Month), int(st.Day), int(st.Hour), int(st.Minute), int(st.Second), int(st.Milliseconds/1000), time.UTC), nil + } + return time.Now(), errors.New("Could not convert to time, passing current time.") +} diff --git a/vendor/github.com/go-ole/go-ole/variant_ppc64le.go b/vendor/github.com/go-ole/go-ole/variant_ppc64le.go new file mode 100644 index 000000000..326427a7d --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/variant_ppc64le.go @@ -0,0 +1,12 @@ +// +build ppc64le + +package ole + +type VARIANT struct { + VT VT // 2 + wReserved1 uint16 // 4 + wReserved2 uint16 // 6 + wReserved3 uint16 // 8 + Val int64 // 16 + _ [8]byte // 24 +} diff --git a/vendor/github.com/go-stack/stack/.travis.yml b/vendor/github.com/go-stack/stack/.travis.yml index e91cc9a0a..5c5a2b516 100644 --- a/vendor/github.com/go-stack/stack/.travis.yml +++ b/vendor/github.com/go-stack/stack/.travis.yml @@ -1,9 +1,11 @@ language: go sudo: false go: - - 1.7 - - 1.8 - - 1.9 + - 1.7.x + - 1.8.x + - 1.9.x + - 1.10.x + - 1.11.x - tip before_install: diff --git a/vendor/github.com/go-stack/stack/go.mod b/vendor/github.com/go-stack/stack/go.mod new file mode 100644 index 000000000..96a53a109 --- /dev/null +++ b/vendor/github.com/go-stack/stack/go.mod @@ -0,0 +1 @@ +module github.com/go-stack/stack diff --git a/vendor/github.com/go-stack/stack/stack.go b/vendor/github.com/go-stack/stack/stack.go index 1bc6971d8..ac3b93b14 100644 --- a/vendor/github.com/go-stack/stack/stack.go +++ b/vendor/github.com/go-stack/stack/stack.go @@ -81,7 +81,9 @@ var ErrNoFunc = errors.New("no call stack information") // // It accepts the '+' and '#' flags for most of the verbs as follows. // -// %+s path of source file relative to the compile time GOPATH +// %+s path of source file relative to the compile time GOPATH, +// or the module path joined to the path of source file relative +// to module root // %#s full path of source file // %+n import path qualified function name // %+k full package path @@ -100,7 +102,7 @@ func (c Call) Format(s fmt.State, verb rune) { case s.Flag('#'): // done case s.Flag('+'): - file = file[pkgIndex(file, c.frame.Function):] + file = pkgFilePath(&c.frame) default: const sep = "/" if i := strings.LastIndex(file, sep); i != -1 { @@ -285,6 +287,80 @@ func pkgIndex(file, funcName string) int { return i + len(sep) } +// pkgFilePath returns the frame's filepath relative to the compile-time GOPATH, +// or its module path joined to its path relative to the module root. +// +// As of Go 1.11 there is no direct way to know the compile time GOPATH or +// module paths at runtime, but we can piece together the desired information +// from available information. We note that runtime.Frame.Function contains the +// function name qualified by the package path, which includes the module path +// but not the GOPATH. We can extract the package path from that and append the +// last segments of the file path to arrive at the desired package qualified +// file path. For example, given: +// +// GOPATH /home/user +// import path pkg/sub +// frame.File /home/user/src/pkg/sub/file.go +// frame.Function pkg/sub.Type.Method +// Desired return pkg/sub/file.go +// +// It appears that we simply need to trim ".Type.Method" from frame.Function and +// append "/" + path.Base(file). +// +// But there are other wrinkles. Although it is idiomatic to do so, the internal +// name of a package is not required to match the last segment of its import +// path. In addition, the introduction of modules in Go 1.11 allows working +// without a GOPATH. So we also must make these work right: +// +// GOPATH /home/user +// import path pkg/go-sub +// package name sub +// frame.File /home/user/src/pkg/go-sub/file.go +// frame.Function pkg/sub.Type.Method +// Desired return pkg/go-sub/file.go +// +// Module path pkg/v2 +// import path pkg/v2/go-sub +// package name sub +// frame.File /home/user/cloned-pkg/go-sub/file.go +// frame.Function pkg/v2/sub.Type.Method +// Desired return pkg/v2/go-sub/file.go +// +// We can handle all of these situations by using the package path extracted +// from frame.Function up to, but not including, the last segment as the prefix +// and the last two segments of frame.File as the suffix of the returned path. +// This preserves the existing behavior when working in a GOPATH without modules +// and a semantically equivalent behavior when used in module aware project. +func pkgFilePath(frame *runtime.Frame) string { + pre := pkgPrefix(frame.Function) + post := pathSuffix(frame.File) + if pre == "" { + return post + } + return pre + "/" + post +} + +// pkgPrefix returns the import path of the function's package with the final +// segment removed. +func pkgPrefix(funcName string) string { + const pathSep = "/" + end := strings.LastIndex(funcName, pathSep) + if end == -1 { + return "" + } + return funcName[:end] +} + +// pathSuffix returns the last two segments of path. +func pathSuffix(path string) string { + const pathSep = "/" + lastSep := strings.LastIndex(path, pathSep) + if lastSep == -1 { + return path + } + return path[strings.LastIndex(path[:lastSep], pathSep)+1:] +} + var runtimePath string func init() { diff --git a/vendor/github.com/go-yaml/yaml/README.md b/vendor/github.com/go-yaml/yaml/README.md index b50c6e877..2ed3314c7 100644 --- a/vendor/github.com/go-yaml/yaml/README.md +++ b/vendor/github.com/go-yaml/yaml/README.md @@ -48,6 +48,8 @@ The yaml package is licensed under the Apache License 2.0. Please see the LICENS Example ------- +Some more examples can be found in the "examples" folder. + ```Go package main diff --git a/vendor/github.com/go-yaml/yaml/apic.go b/vendor/github.com/go-yaml/yaml/apic.go index 1f7e87e67..3e24a0d7d 100644 --- a/vendor/github.com/go-yaml/yaml/apic.go +++ b/vendor/github.com/go-yaml/yaml/apic.go @@ -468,7 +468,7 @@ func yaml_event_delete(event *yaml_event_t) { // } context // tag_directive *yaml_tag_directive_t // -// context.error = YAML_NO_ERROR // Eliminate a compiler warning. +// context.error = YAML_NO_ERROR // Eliminate a compliler warning. // // assert(document) // Non-NULL document object is expected. // diff --git a/vendor/github.com/go-yaml/yaml/decode.go b/vendor/github.com/go-yaml/yaml/decode.go index e4e56e28e..c8eac1642 100644 --- a/vendor/github.com/go-yaml/yaml/decode.go +++ b/vendor/github.com/go-yaml/yaml/decode.go @@ -113,10 +113,6 @@ func (p *parser) fail() { var line int if p.parser.problem_mark.line != 0 { line = p.parser.problem_mark.line - // Scanner errors don't iterate line before returning error - if p.parser.error == yaml_SCANNER_ERROR { - line++ - } } else if p.parser.context_mark.line != 0 { line = p.parser.context_mark.line } @@ -434,7 +430,6 @@ func (d *decoder) scalar(n *node, out reflect.Value) bool { // reasons we set it as a string, so that code that unmarshals // timestamp-like values into interface{} will continue to // see a string and not a time.Time. - // TODO(v3) Drop this. out.Set(reflect.ValueOf(n.value)) } else { out.Set(reflect.ValueOf(resolved)) @@ -547,10 +542,6 @@ func (d *decoder) sequence(n *node, out reflect.Value) (good bool) { switch out.Kind() { case reflect.Slice: out.Set(reflect.MakeSlice(out.Type(), l, l)) - case reflect.Array: - if l != out.Len() { - failf("invalid array: want %d elements but got %d", out.Len(), l) - } case reflect.Interface: // No type hints. Will have to use a generic sequence. iface = out @@ -569,9 +560,7 @@ func (d *decoder) sequence(n *node, out reflect.Value) (good bool) { j++ } } - if out.Kind() != reflect.Array { - out.Set(out.Slice(0, j)) - } + out.Set(out.Slice(0, j)) if iface.IsValid() { iface.Set(out) } diff --git a/vendor/github.com/go-yaml/yaml/emitterc.go b/vendor/github.com/go-yaml/yaml/emitterc.go index a1c2cc526..cf0db118a 100644 --- a/vendor/github.com/go-yaml/yaml/emitterc.go +++ b/vendor/github.com/go-yaml/yaml/emitterc.go @@ -843,7 +843,7 @@ func yaml_emitter_select_scalar_style(emitter *yaml_emitter_t, event *yaml_event return true } -// Write an anchor. +// Write an achor. func yaml_emitter_process_anchor(emitter *yaml_emitter_t) bool { if emitter.anchor_data.anchor == nil { return true diff --git a/vendor/github.com/go-yaml/yaml/encode.go b/vendor/github.com/go-yaml/yaml/encode.go index a14435e82..1e730eff6 100644 --- a/vendor/github.com/go-yaml/yaml/encode.go +++ b/vendor/github.com/go-yaml/yaml/encode.go @@ -131,7 +131,7 @@ func (e *encoder) marshal(tag string, in reflect.Value) { } else { e.structv(tag, in) } - case reflect.Slice, reflect.Array: + case reflect.Slice: if in.Type().Elem() == mapItemType { e.itemsv(tag, in) } else { @@ -328,18 +328,14 @@ func (e *encoder) uintv(tag string, in reflect.Value) { func (e *encoder) timev(tag string, in reflect.Value) { t := in.Interface().(time.Time) - s := t.Format(time.RFC3339Nano) - e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) + if tag == "" { + tag = yaml_TIMESTAMP_TAG + } + e.emitScalar(t.Format(time.RFC3339Nano), "", tag, yaml_PLAIN_SCALAR_STYLE) } func (e *encoder) floatv(tag string, in reflect.Value) { - // Issue #352: When formatting, use the precision of the underlying value - precision := 64 - if in.Kind() == reflect.Float32 { - precision = 32 - } - - s := strconv.FormatFloat(in.Float(), 'g', -1, precision) + s := strconv.FormatFloat(in.Float(), 'g', -1, 64) switch s { case "+Inf": s = ".inf" diff --git a/vendor/github.com/go-yaml/yaml/go.mod b/vendor/github.com/go-yaml/yaml/go.mod deleted file mode 100644 index 1934e8769..000000000 --- a/vendor/github.com/go-yaml/yaml/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module "gopkg.in/yaml.v2" - -require ( - "gopkg.in/check.v1" v0.0.0-20161208181325-20d25e280405 -) diff --git a/vendor/github.com/go-yaml/yaml/readerc.go b/vendor/github.com/go-yaml/yaml/readerc.go index 7c1f5fac3..f45079171 100644 --- a/vendor/github.com/go-yaml/yaml/readerc.go +++ b/vendor/github.com/go-yaml/yaml/readerc.go @@ -93,18 +93,9 @@ func yaml_parser_update_buffer(parser *yaml_parser_t, length int) bool { panic("read handler must be set") } - // [Go] This function was changed to guarantee the requested length size at EOF. - // The fact we need to do this is pretty awful, but the description above implies - // for that to be the case, and there are tests - // If the EOF flag is set and the raw buffer is empty, do nothing. if parser.eof && parser.raw_buffer_pos == len(parser.raw_buffer) { - // [Go] ACTUALLY! Read the documentation of this function above. - // This is just broken. To return true, we need to have the - // given length in the buffer. Not doing that means every single - // check that calls this function to make sure the buffer has a - // given length is Go) panicking; or C) accessing invalid memory. - //return true + return true } // Return if the buffer contains enough characters. @@ -398,15 +389,6 @@ func yaml_parser_update_buffer(parser *yaml_parser_t, length int) bool { break } } - // [Go] Read the documentation of this function above. To return true, - // we need to have the given length in the buffer. Not doing that means - // every single check that calls this function to make sure the buffer - // has a given length is Go) panicking; or C) accessing invalid memory. - // This happens here due to the EOF above breaking early. - for buffer_len < length { - parser.buffer[buffer_len] = 0 - buffer_len++ - } parser.buffer = parser.buffer[:buffer_len] return true } diff --git a/vendor/github.com/go-yaml/yaml/resolve.go b/vendor/github.com/go-yaml/yaml/resolve.go index 6c151db6f..ea90bd5e0 100644 --- a/vendor/github.com/go-yaml/yaml/resolve.go +++ b/vendor/github.com/go-yaml/yaml/resolve.go @@ -92,19 +92,6 @@ func resolve(tag string, in string) (rtag string, out interface{}) { switch tag { case "", rtag, yaml_STR_TAG, yaml_BINARY_TAG: return - case yaml_FLOAT_TAG: - if rtag == yaml_INT_TAG { - switch v := out.(type) { - case int64: - rtag = yaml_FLOAT_TAG - out = float64(v) - return - case int: - rtag = yaml_FLOAT_TAG - out = float64(v) - return - } - } } failf("cannot decode %s `%s` as a %s", shortTag(rtag), in, shortTag(tag)) }() @@ -180,12 +167,12 @@ func resolve(tag string, in string) (rtag string, out interface{}) { return yaml_INT_TAG, uintv } } else if strings.HasPrefix(plain, "-0b") { - intv, err := strconv.ParseInt("-" + plain[3:], 2, 64) + intv, err := strconv.ParseInt(plain[3:], 2, 64) if err == nil { - if true || intv == int64(int(intv)) { - return yaml_INT_TAG, int(intv) + if intv == int64(int(intv)) { + return yaml_INT_TAG, -int(intv) } else { - return yaml_INT_TAG, intv + return yaml_INT_TAG, -intv } } } @@ -224,10 +211,10 @@ func encodeBase64(s string) string { // This is a subset of the formats allowed by the regular expression // defined at http://yaml.org/type/timestamp.html. var allowedTimestampFormats = []string{ - "2006-1-2T15:4:5.999999999Z07:00", // RCF3339Nano with short date fields. - "2006-1-2t15:4:5.999999999Z07:00", // RFC3339Nano with short date fields and lower-case "t". - "2006-1-2 15:4:5.999999999", // space separated with no time zone - "2006-1-2", // date only + "2006-1-2T15:4:5Z07:00", + "2006-1-2t15:4:5Z07:00", // RFC3339 with lower-case "t". + "2006-1-2 15:4:5", // space separated with no time zone + "2006-1-2", // date only // Notable exception: time.Parse cannot handle: "2001-12-14 21:59:43.10 -5" // from the set of examples. } diff --git a/vendor/github.com/go-yaml/yaml/scannerc.go b/vendor/github.com/go-yaml/yaml/scannerc.go index 077fd1dd2..492a9845d 100644 --- a/vendor/github.com/go-yaml/yaml/scannerc.go +++ b/vendor/github.com/go-yaml/yaml/scannerc.go @@ -871,6 +871,12 @@ func yaml_parser_save_simple_key(parser *yaml_parser_t) bool { required := parser.flow_level == 0 && parser.indent == parser.mark.column + // A simple key is required only when it is the first token in the current + // line. Therefore it is always allowed. But we add a check anyway. + if required && !parser.simple_key_allowed { + panic("should not happen") + } + // // If the current position may start a simple key, save it. // @@ -2469,10 +2475,6 @@ func yaml_parser_scan_flow_scalar(parser *yaml_parser_t, token *yaml_token_t, si } } - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - // Check if we are at the end of the scalar. if single { if parser.buffer[parser.buffer_pos] == '\'' { @@ -2485,6 +2487,10 @@ func yaml_parser_scan_flow_scalar(parser *yaml_parser_t, token *yaml_token_t, si } // Consume blank characters. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) { if is_blank(parser.buffer, parser.buffer_pos) { // Consume a space or a tab character. @@ -2641,10 +2647,10 @@ func yaml_parser_scan_plain_scalar(parser *yaml_parser_t, token *yaml_token_t) b for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) { if is_blank(parser.buffer, parser.buffer_pos) { - // Check for tab characters that abuse indentation. + // Check for tab character that abuse indentation. if leading_blanks && parser.mark.column < indent && is_tab(parser.buffer, parser.buffer_pos) { yaml_parser_set_scanner_error(parser, "while scanning a plain scalar", - start_mark, "found a tab character that violates indentation") + start_mark, "found a tab character that violate indentation") return false } diff --git a/vendor/github.com/go-yaml/yaml/sorter.go b/vendor/github.com/go-yaml/yaml/sorter.go index 4c45e660a..5958822f9 100644 --- a/vendor/github.com/go-yaml/yaml/sorter.go +++ b/vendor/github.com/go-yaml/yaml/sorter.go @@ -51,15 +51,6 @@ func (l keyList) Less(i, j int) bool { } var ai, bi int var an, bn int64 - if ar[i] == '0' || br[i] == '0' { - for j := i-1; j >= 0 && unicode.IsDigit(ar[j]); j-- { - if ar[j] != '0' { - an = 1 - bn = 1 - break - } - } - } for ai = i; ai < len(ar) && unicode.IsDigit(ar[ai]); ai++ { an = an*10 + int64(ar[ai]-'0') } diff --git a/vendor/github.com/go-yaml/yaml/yaml.go b/vendor/github.com/go-yaml/yaml/yaml.go index de85aa4cd..483aae587 100644 --- a/vendor/github.com/go-yaml/yaml/yaml.go +++ b/vendor/github.com/go-yaml/yaml/yaml.go @@ -157,8 +157,8 @@ func unmarshal(in []byte, out interface{}, strict bool) (err error) { // of the generated document will reflect the structure of the value itself. // Maps and pointers (to struct, string, int, etc) are accepted as the in value. // -// Struct fields are only marshalled if they are exported (have an upper case -// first letter), and are marshalled using the field name lowercased as the +// Struct fields are only unmarshalled if they are exported (have an upper case +// first letter), and are unmarshalled using the field name lowercased as the // default key. Custom keys may be defined via the "yaml" name in the field // tag: the content preceding the first comma is used as the key, and the // following comma-separated options are used to tweak the marshalling process. diff --git a/vendor/github.com/golang/dep/Gopkg.lock b/vendor/github.com/golang/dep/Gopkg.lock index 6e9b2f605..b4333103d 100644 --- a/vendor/github.com/golang/dep/Gopkg.lock +++ b/vendor/github.com/golang/dep/Gopkg.lock @@ -2,12 +2,12 @@ [[projects]] - digest = "1:0579669610e7b4268094959686738fce4833e8274793f09df8fe5ab2ff2f5efd" + branch = "2.x" + digest = "1:ee2887fecb4d923fa90f8dd9cf33e876bf9260fed62f2ca5a5c3f41b4eb07683" name = "github.com/Masterminds/semver" packages = ["."] pruneopts = "NUT" - revision = "fe7c21038085e01e67044ec1efe3afb1eaa59f75" - version = "v3.0.1" + revision = "24642bd0573145a5ee04f9be773641695289be46" [[projects]] digest = "1:442020d26d1f891d5014cae4353b6ff589562c2b303504627de3660adf3fb217" diff --git a/vendor/github.com/golang/dep/Gopkg.toml b/vendor/github.com/golang/dep/Gopkg.toml index c0c4b3e25..933a368ca 100644 --- a/vendor/github.com/golang/dep/Gopkg.toml +++ b/vendor/github.com/golang/dep/Gopkg.toml @@ -1,6 +1,6 @@ [[constraint]] name = "github.com/Masterminds/semver" - version = "3.0.1" + branch = "2.x" [[constraint]] name = "github.com/Masterminds/vcs" diff --git a/vendor/github.com/golang/dep/gps/example.go b/vendor/github.com/golang/dep/gps/example.go deleted file mode 100644 index 33c252137..000000000 --- a/vendor/github.com/golang/dep/gps/example.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "go/build" - "io/ioutil" - "log" - "os" - "path/filepath" - "strings" - - "github.com/golang/dep/gps" - "github.com/golang/dep/gps/pkgtree" -) - -// This is probably the simplest possible implementation of gps. It does the -// substantive work that `go get` does, except: -// 1. It drops the resulting tree into vendor instead of GOPATH -// 2. It prefers semver tags (if available) over branches -// 3. It removes any vendor directories nested within dependencies -// -// This will compile and work...and then blow away any vendor directory present -// in the cwd. Be careful! -func main() { - // Assume the current directory is correctly placed on a GOPATH, and that it's the - // root of the project. - root, _ := os.Getwd() - srcprefix := filepath.Join(build.Default.GOPATH, "src") + string(filepath.Separator) - importroot := filepath.ToSlash(strings.TrimPrefix(root, srcprefix)) - - // Set up params, including tracing - params := gps.SolveParameters{ - RootDir: root, - TraceLogger: log.New(os.Stdout, "", 0), - ProjectAnalyzer: NaiveAnalyzer{}, - } - // Perform static analysis on the current project to find all of its imports. - params.RootPackageTree, _ = pkgtree.ListPackages(root, importroot) - - // Set up a SourceManager. This manages interaction with sources (repositories). - tempdir, _ := ioutil.TempDir("", "gps-repocache") - sourcemgr, _ := gps.NewSourceManager(gps.SourceManagerConfig{Cachedir: filepath.Join(tempdir)}) - defer sourcemgr.Release() - - // Prep and run the solver - solver, _ := gps.Prepare(params, sourcemgr) - solution, err := solver.Solve() - if err == nil { - // If no failure, blow away the vendor dir and write a new one out, - // stripping nested vendor directories as we go. - os.RemoveAll(filepath.Join(root, "vendor")) - pruneOpts := gps.CascadingPruneOptions{ - DefaultOptions: gps.PruneNestedVendorDirs | gps.PruneUnusedPackages | gps.PruneGoTestFiles, - } - gps.WriteDepTree(filepath.Join(root, "vendor"), solution, sourcemgr, pruneOpts, nil) - } -} - -// NaiveAnalyzer is a project analyzer that implements gps.ProjectAnalyzer interface. -type NaiveAnalyzer struct{} - -// DeriveManifestAndLock is called when the solver needs manifest/lock data -// for a particular dependency project (identified by the gps.ProjectRoot -// parameter) at a particular version. That version will be checked out in a -// directory rooted at path. -func (a NaiveAnalyzer) DeriveManifestAndLock(path string, n gps.ProjectRoot) (gps.Manifest, gps.Lock, error) { - return nil, nil, nil -} - -// Info reports the name and version of the analyzer. This is used internally as part -// of gps' hashing memoization scheme. -func (a NaiveAnalyzer) Info() gps.ProjectAnalyzerInfo { - return gps.ProjectAnalyzerInfo{ - Name: "example-analyzer", - Version: 1, - } -} diff --git a/vendor/github.com/golang/dep/install.sh b/vendor/github.com/golang/dep/install.sh old mode 100755 new mode 100644 diff --git a/vendor/github.com/golang/dep/internal/fs/testdata/symlinks/file-symlink b/vendor/github.com/golang/dep/internal/fs/testdata/symlinks/file-symlink deleted file mode 120000 index 4c52274de..000000000 --- a/vendor/github.com/golang/dep/internal/fs/testdata/symlinks/file-symlink +++ /dev/null @@ -1 +0,0 @@ -../test.file \ No newline at end of file diff --git a/vendor/github.com/golang/dep/internal/fs/testdata/symlinks/invalid-symlink b/vendor/github.com/golang/dep/internal/fs/testdata/symlinks/invalid-symlink deleted file mode 120000 index 0edf4f301..000000000 --- a/vendor/github.com/golang/dep/internal/fs/testdata/symlinks/invalid-symlink +++ /dev/null @@ -1 +0,0 @@ -/non/existing/file \ No newline at end of file diff --git a/vendor/github.com/golang/dep/internal/fs/testdata/symlinks/windows-file-symlink b/vendor/github.com/golang/dep/internal/fs/testdata/symlinks/windows-file-symlink deleted file mode 120000 index af1d6c8f5..000000000 --- a/vendor/github.com/golang/dep/internal/fs/testdata/symlinks/windows-file-symlink +++ /dev/null @@ -1 +0,0 @@ -C:/Users/ibrahim/go/src/github.com/golang/dep/internal/fs/testdata/test.file \ No newline at end of file diff --git a/vendor/github.com/golang/groupcache/LICENSE b/vendor/github.com/golang/groupcache/LICENSE new file mode 100644 index 000000000..37ec93a14 --- /dev/null +++ b/vendor/github.com/golang/groupcache/LICENSE @@ -0,0 +1,191 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +2. Grant of Copyright License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +3. Grant of Patent License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. + +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source form +of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. + +5. Submission of Contributions. + +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. + +6. Trademarks. + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. + +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +8. Limitation of Liability. + +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same "printed page" as the copyright notice for easier identification within +third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/golang/groupcache/lru/lru.go b/vendor/github.com/golang/groupcache/lru/lru.go new file mode 100644 index 000000000..eac1c7664 --- /dev/null +++ b/vendor/github.com/golang/groupcache/lru/lru.go @@ -0,0 +1,133 @@ +/* +Copyright 2013 Google Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package lru implements an LRU cache. +package lru + +import "container/list" + +// Cache is an LRU cache. It is not safe for concurrent access. +type Cache struct { + // MaxEntries is the maximum number of cache entries before + // an item is evicted. Zero means no limit. + MaxEntries int + + // OnEvicted optionally specifies a callback function to be + // executed when an entry is purged from the cache. + OnEvicted func(key Key, value interface{}) + + ll *list.List + cache map[interface{}]*list.Element +} + +// A Key may be any value that is comparable. See http://golang.org/ref/spec#Comparison_operators +type Key interface{} + +type entry struct { + key Key + value interface{} +} + +// New creates a new Cache. +// If maxEntries is zero, the cache has no limit and it's assumed +// that eviction is done by the caller. +func New(maxEntries int) *Cache { + return &Cache{ + MaxEntries: maxEntries, + ll: list.New(), + cache: make(map[interface{}]*list.Element), + } +} + +// Add adds a value to the cache. +func (c *Cache) Add(key Key, value interface{}) { + if c.cache == nil { + c.cache = make(map[interface{}]*list.Element) + c.ll = list.New() + } + if ee, ok := c.cache[key]; ok { + c.ll.MoveToFront(ee) + ee.Value.(*entry).value = value + return + } + ele := c.ll.PushFront(&entry{key, value}) + c.cache[key] = ele + if c.MaxEntries != 0 && c.ll.Len() > c.MaxEntries { + c.RemoveOldest() + } +} + +// Get looks up a key's value from the cache. +func (c *Cache) Get(key Key) (value interface{}, ok bool) { + if c.cache == nil { + return + } + if ele, hit := c.cache[key]; hit { + c.ll.MoveToFront(ele) + return ele.Value.(*entry).value, true + } + return +} + +// Remove removes the provided key from the cache. +func (c *Cache) Remove(key Key) { + if c.cache == nil { + return + } + if ele, hit := c.cache[key]; hit { + c.removeElement(ele) + } +} + +// RemoveOldest removes the oldest item from the cache. +func (c *Cache) RemoveOldest() { + if c.cache == nil { + return + } + ele := c.ll.Back() + if ele != nil { + c.removeElement(ele) + } +} + +func (c *Cache) removeElement(e *list.Element) { + c.ll.Remove(e) + kv := e.Value.(*entry) + delete(c.cache, kv.key) + if c.OnEvicted != nil { + c.OnEvicted(kv.key, kv.value) + } +} + +// Len returns the number of items in the cache. +func (c *Cache) Len() int { + if c.cache == nil { + return 0 + } + return c.ll.Len() +} + +// Clear purges all stored items from the cache. +func (c *Cache) Clear() { + if c.OnEvicted != nil { + for _, e := range c.cache { + kv := e.Value.(*entry) + c.OnEvicted(kv.key, kv.value) + } + } + c.ll = nil + c.cache = nil +} diff --git a/vendor/github.com/golang/snappy/go.mod b/vendor/github.com/golang/snappy/go.mod new file mode 100644 index 000000000..f6406bb2c --- /dev/null +++ b/vendor/github.com/golang/snappy/go.mod @@ -0,0 +1 @@ +module github.com/golang/snappy diff --git a/vendor/github.com/google/go-cmp/cmp/compare.go b/vendor/github.com/google/go-cmp/cmp/compare.go index 2133562b0..580ae2097 100644 --- a/vendor/github.com/google/go-cmp/cmp/compare.go +++ b/vendor/github.com/google/go-cmp/cmp/compare.go @@ -6,6 +6,10 @@ // // This package is intended to be a more powerful and safer alternative to // reflect.DeepEqual for comparing whether two values are semantically equal. +// It is intended to only be used in tests, as performance is not a goal and +// it may panic if it cannot compare the values. Its propensity towards +// panicking means that its unsuitable for production environments where a +// spurious panic may be fatal. // // The primary features of cmp are: // @@ -22,8 +26,8 @@ // equality is determined by recursively comparing the primitive kinds on both // values, much like reflect.DeepEqual. Unlike reflect.DeepEqual, unexported // fields are not compared by default; they result in panics unless suppressed -// by using an Ignore option (see cmpopts.IgnoreUnexported) or explicitly compared -// using the AllowUnexported option. +// by using an Ignore option (see cmpopts.IgnoreUnexported) or explicitly +// compared using the Exporter option. package cmp import ( @@ -62,8 +66,8 @@ import ( // // Structs are equal if recursively calling Equal on all fields report equal. // If a struct contains unexported fields, Equal panics unless an Ignore option -// (e.g., cmpopts.IgnoreUnexported) ignores that field or the AllowUnexported -// option explicitly permits comparing the unexported field. +// (e.g., cmpopts.IgnoreUnexported) ignores that field or the Exporter option +// explicitly permits comparing the unexported field. // // Slices are equal if they are both nil or both non-nil, where recursively // calling Equal on all non-ignored slice or array elements report equal. @@ -80,31 +84,14 @@ import ( // Pointers and interfaces are equal if they are both nil or both non-nil, // where they have the same underlying concrete type and recursively // calling Equal on the underlying values reports equal. +// +// Before recursing into a pointer, slice element, or map, the current path +// is checked to detect whether the address has already been visited. +// If there is a cycle, then the pointed at values are considered equal +// only if both addresses were previously visited in the same path step. func Equal(x, y interface{}, opts ...Option) bool { - vx := reflect.ValueOf(x) - vy := reflect.ValueOf(y) - - // If the inputs are different types, auto-wrap them in an empty interface - // so that they have the same parent type. - var t reflect.Type - if !vx.IsValid() || !vy.IsValid() || vx.Type() != vy.Type() { - t = reflect.TypeOf((*interface{})(nil)).Elem() - if vx.IsValid() { - vvx := reflect.New(t).Elem() - vvx.Set(vx) - vx = vvx - } - if vy.IsValid() { - vvy := reflect.New(t).Elem() - vvy.Set(vy) - vy = vvy - } - } else { - t = vx.Type() - } - s := newState(opts) - s.compareAny(&pathStep{t, vx, vy}) + s.compareAny(rootStep(x, y)) return s.result.Equal() } @@ -123,20 +110,63 @@ func Equal(x, y interface{}, opts ...Option) bool { // Do not depend on this output being stable. If you need the ability to // programmatically interpret the difference, consider using a custom Reporter. func Diff(x, y interface{}, opts ...Option) string { + s := newState(opts) + + // Optimization: If there are no other reporters, we can optimize for the + // common case where the result is equal (and thus no reported difference). + // This avoids the expensive construction of a difference tree. + if len(s.reporters) == 0 { + s.compareAny(rootStep(x, y)) + if s.result.Equal() { + return "" + } + s.result = diff.Result{} // Reset results + } + r := new(defaultReporter) - eq := Equal(x, y, Options(opts), Reporter(r)) + s.reporters = append(s.reporters, reporter{r}) + s.compareAny(rootStep(x, y)) d := r.String() - if (d == "") != eq { + if (d == "") != s.result.Equal() { panic("inconsistent difference and equality results") } return d } +// rootStep constructs the first path step. If x and y have differing types, +// then they are stored within an empty interface type. +func rootStep(x, y interface{}) PathStep { + vx := reflect.ValueOf(x) + vy := reflect.ValueOf(y) + + // If the inputs are different types, auto-wrap them in an empty interface + // so that they have the same parent type. + var t reflect.Type + if !vx.IsValid() || !vy.IsValid() || vx.Type() != vy.Type() { + t = reflect.TypeOf((*interface{})(nil)).Elem() + if vx.IsValid() { + vvx := reflect.New(t).Elem() + vvx.Set(vx) + vx = vvx + } + if vy.IsValid() { + vvy := reflect.New(t).Elem() + vvy.Set(vy) + vy = vvy + } + } else { + t = vx.Type() + } + + return &pathStep{t, vx, vy} +} + type state struct { // These fields represent the "comparison state". // Calling statelessCompare must not result in observable changes to these. result diff.Result // The current result of comparison curPath Path // The current path in the value tree + curPtrs pointerPath // The current set of visited pointers reporters []reporter // Optional reporters // recChecker checks for infinite cycles applying the same set of @@ -148,13 +178,14 @@ type state struct { dynChecker dynChecker // These fields, once set by processOption, will not change. - exporters map[reflect.Type]bool // Set of structs with unexported field visibility - opts Options // List of all fundamental and filter options + exporters []exporter // List of exporters for structs with unexported fields + opts Options // List of all fundamental and filter options } func newState(opts []Option) *state { // Always ensure a validator option exists to validate the inputs. s := &state{opts: Options{validator{}}} + s.curPtrs.Init() s.processOption(Options(opts)) return s } @@ -174,13 +205,8 @@ func (s *state) processOption(opt Option) { panic(fmt.Sprintf("cannot use an unfiltered option: %v", opt)) } s.opts = append(s.opts, opt) - case visibleStructs: - if s.exporters == nil { - s.exporters = make(map[reflect.Type]bool) - } - for t := range opt { - s.exporters[t] = true - } + case exporter: + s.exporters = append(s.exporters, opt) case reporter: s.reporters = append(s.reporters, opt) default: @@ -192,9 +218,9 @@ func (s *state) processOption(opt Option) { // This function is stateless in that it does not alter the current result, // or output to any registered reporters. func (s *state) statelessCompare(step PathStep) diff.Result { - // We do not save and restore the curPath because all of the compareX - // methods should properly push and pop from the path. - // It is an implementation bug if the contents of curPath differs from + // We do not save and restore curPath and curPtrs because all of the + // compareX methods should properly push and pop from them. + // It is an implementation bug if the contents of the paths differ from // when calling this function to when returning from it. oldResult, oldReporters := s.result, s.reporters @@ -216,9 +242,17 @@ func (s *state) compareAny(step PathStep) { } s.recChecker.Check(s.curPath) - // Obtain the current type and values. + // Cycle-detection for slice elements (see NOTE in compareSlice). t := step.Type() vx, vy := step.Values() + if si, ok := step.(SliceIndex); ok && si.isSlice && vx.IsValid() && vy.IsValid() { + px, py := vx.Addr(), vy.Addr() + if eq, visited := s.curPtrs.Push(px, py); visited { + s.report(eq, reportByCycle) + return + } + defer s.curPtrs.Pop(px, py) + } // Rule 1: Check whether an option applies on this node in the value tree. if s.tryOptions(t, vx, vy) { @@ -342,7 +376,7 @@ func detectRaces(c chan<- reflect.Value, f reflect.Value, vs ...reflect.Value) { // assuming that T is assignable to R. // Otherwise, it returns the input value as is. func sanitizeValue(v reflect.Value, t reflect.Type) reflect.Value { - // TODO(dsnet): Workaround for reflect bug (https://golang.org/issue/22143). + // TODO(≥go1.10): Workaround for reflect bug (https://golang.org/issue/22143). if !flags.AtLeastGo110 { if v.Kind() == reflect.Interface && v.IsNil() && v.Type() != t { return reflect.New(t).Elem() @@ -352,8 +386,10 @@ func sanitizeValue(v reflect.Value, t reflect.Type) reflect.Value { } func (s *state) compareStruct(t reflect.Type, vx, vy reflect.Value) { + var addr bool var vax, vay reflect.Value // Addressable versions of vx and vy + var mayForce, mayForceInit bool step := StructField{&structField{}} for i := 0; i < t.NumField(); i++ { step.typ = t.Field(i).Type @@ -372,10 +408,18 @@ func (s *state) compareStruct(t reflect.Type, vx, vy reflect.Value) { // For retrieveUnexportedField to work, the parent struct must // be addressable. Create a new copy of the values if // necessary to make them addressable. + addr = vx.CanAddr() || vy.CanAddr() vax = makeAddressable(vx) vay = makeAddressable(vy) } - step.mayForce = s.exporters[t] + if !mayForceInit { + for _, xf := range s.exporters { + mayForce = mayForce || xf(t) + } + mayForceInit = true + } + step.mayForce = mayForce + step.paddr = addr step.pvx = vax step.pvy = vay step.field = t.Field(i) @@ -391,9 +435,21 @@ func (s *state) compareSlice(t reflect.Type, vx, vy reflect.Value) { return } - // TODO: Support cyclic data structures. + // NOTE: It is incorrect to call curPtrs.Push on the slice header pointer + // since slices represents a list of pointers, rather than a single pointer. + // The pointer checking logic must be handled on a per-element basis + // in compareAny. + // + // A slice header (see reflect.SliceHeader) in Go is a tuple of a starting + // pointer P, a length N, and a capacity C. Supposing each slice element has + // a memory size of M, then the slice is equivalent to the list of pointers: + // [P+i*M for i in range(N)] + // + // For example, v[:0] and v[:1] are slices with the same starting pointer, + // but they are clearly different values. Using the slice pointer alone + // violates the assumption that equal pointers implies equal values. - step := SliceIndex{&sliceIndex{pathStep: pathStep{typ: t.Elem()}}} + step := SliceIndex{&sliceIndex{pathStep: pathStep{typ: t.Elem()}, isSlice: isSlice}} withIndexes := func(ix, iy int) SliceIndex { if ix >= 0 { step.vx, step.xkey = vx.Index(ix), ix @@ -470,7 +526,12 @@ func (s *state) compareMap(t reflect.Type, vx, vy reflect.Value) { return } - // TODO: Support cyclic data structures. + // Cycle-detection for maps. + if eq, visited := s.curPtrs.Push(vx, vy); visited { + s.report(eq, reportByCycle) + return + } + defer s.curPtrs.Pop(vx, vy) // We combine and sort the two map keys so that we can perform the // comparisons in a deterministic order. @@ -507,7 +568,12 @@ func (s *state) comparePtr(t reflect.Type, vx, vy reflect.Value) { return } - // TODO: Support cyclic data structures. + // Cycle-detection for pointers. + if eq, visited := s.curPtrs.Push(vx, vy); visited { + s.report(eq, reportByCycle) + return + } + defer s.curPtrs.Pop(vx, vy) vx, vy = vx.Elem(), vy.Elem() s.compareAny(Indirect{&indirect{pathStep{t.Elem(), vx, vy}}}) diff --git a/vendor/github.com/google/go-cmp/cmp/export_panic.go b/vendor/github.com/google/go-cmp/cmp/export_panic.go index abc3a1c3e..dfa5d2137 100644 --- a/vendor/github.com/google/go-cmp/cmp/export_panic.go +++ b/vendor/github.com/google/go-cmp/cmp/export_panic.go @@ -8,8 +8,8 @@ package cmp import "reflect" -const supportAllowUnexported = false +const supportExporters = false -func retrieveUnexportedField(reflect.Value, reflect.StructField) reflect.Value { - panic("retrieveUnexportedField is not implemented") +func retrieveUnexportedField(reflect.Value, reflect.StructField, bool) reflect.Value { + panic("no support for forcibly accessing unexported fields") } diff --git a/vendor/github.com/google/go-cmp/cmp/export_unsafe.go b/vendor/github.com/google/go-cmp/cmp/export_unsafe.go index 59d4ee91b..351f1a34b 100644 --- a/vendor/github.com/google/go-cmp/cmp/export_unsafe.go +++ b/vendor/github.com/google/go-cmp/cmp/export_unsafe.go @@ -11,13 +11,25 @@ import ( "unsafe" ) -const supportAllowUnexported = true +const supportExporters = true // retrieveUnexportedField uses unsafe to forcibly retrieve any field from // a struct such that the value has read-write permissions. // // The parent struct, v, must be addressable, while f must be a StructField -// describing the field to retrieve. -func retrieveUnexportedField(v reflect.Value, f reflect.StructField) reflect.Value { - return reflect.NewAt(f.Type, unsafe.Pointer(v.UnsafeAddr()+f.Offset)).Elem() +// describing the field to retrieve. If addr is false, +// then the returned value will be shallowed copied to be non-addressable. +func retrieveUnexportedField(v reflect.Value, f reflect.StructField, addr bool) reflect.Value { + ve := reflect.NewAt(f.Type, unsafe.Pointer(uintptr(unsafe.Pointer(v.UnsafeAddr()))+f.Offset)).Elem() + if !addr { + // A field is addressable if and only if the struct is addressable. + // If the original parent value was not addressable, shallow copy the + // value to make it non-addressable to avoid leaking an implementation + // detail of how forcibly exporting a field works. + if ve.Kind() == reflect.Interface && ve.IsNil() { + return reflect.Zero(f.Type) + } + return reflect.ValueOf(ve.Interface()).Convert(f.Type) + } + return ve } diff --git a/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go b/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go index 3d2e42662..730e223ee 100644 --- a/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go +++ b/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go @@ -12,6 +12,13 @@ // is more important than obtaining a minimal Levenshtein distance. package diff +import ( + "math/rand" + "time" + + "github.com/google/go-cmp/cmp/internal/flags" +) + // EditType represents a single operation within an edit-script. type EditType uint8 @@ -112,6 +119,8 @@ func (r Result) Similar() bool { return r.NumSame+1 >= r.NumDiff } +var randInt = rand.New(rand.NewSource(time.Now().Unix())).Intn(2) + // Difference reports whether two lists of lengths nx and ny are equal // given the definition of equality provided as f. // @@ -159,6 +168,17 @@ func Difference(nx, ny int, f EqualFunc) (es EditScript) { // A vertical edge is equivalent to inserting a symbol from list Y. // A diagonal edge is equivalent to a matching symbol between both X and Y. + // To ensure flexibility in changing the algorithm in the future, + // introduce some degree of deliberate instability. + // This is achieved by fiddling the zigzag iterator to start searching + // the graph starting from the bottom-right versus than the top-left. + // The result may differ depending on the starting search location, + // but still produces a valid edit script. + zigzagInit := randInt // either 0 or 1 + if flags.Deterministic { + zigzagInit = 0 + } + // Invariants: // • 0 ≤ fwdPath.X ≤ (fwdFrontier.X, revFrontier.X) ≤ revPath.X ≤ nx // • 0 ≤ fwdPath.Y ≤ (fwdFrontier.Y, revFrontier.Y) ≤ revPath.Y ≤ ny @@ -209,7 +229,7 @@ func Difference(nx, ny int, f EqualFunc) (es EditScript) { if fwdFrontier.X >= revFrontier.X || fwdFrontier.Y >= revFrontier.Y || searchBudget == 0 { break } - for stop1, stop2, i := false, false, 0; !(stop1 && stop2) && searchBudget > 0; i++ { + for stop1, stop2, i := false, false, zigzagInit; !(stop1 && stop2) && searchBudget > 0; i++ { // Search in a diagonal pattern for a match. z := zigzag(i) p := point{fwdFrontier.X + z, fwdFrontier.Y - z} diff --git a/vendor/github.com/google/go-cmp/cmp/internal/value/name.go b/vendor/github.com/google/go-cmp/cmp/internal/value/name.go new file mode 100644 index 000000000..8228e7d51 --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/internal/value/name.go @@ -0,0 +1,157 @@ +// Copyright 2020, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +package value + +import ( + "reflect" + "strconv" +) + +// TypeString is nearly identical to reflect.Type.String, +// but has an additional option to specify that full type names be used. +func TypeString(t reflect.Type, qualified bool) string { + return string(appendTypeName(nil, t, qualified, false)) +} + +func appendTypeName(b []byte, t reflect.Type, qualified, elideFunc bool) []byte { + // BUG: Go reflection provides no way to disambiguate two named types + // of the same name and within the same package, + // but declared within the namespace of different functions. + + // Named type. + if t.Name() != "" { + if qualified && t.PkgPath() != "" { + b = append(b, '"') + b = append(b, t.PkgPath()...) + b = append(b, '"') + b = append(b, '.') + b = append(b, t.Name()...) + } else { + b = append(b, t.String()...) + } + return b + } + + // Unnamed type. + switch k := t.Kind(); k { + case reflect.Bool, reflect.String, reflect.UnsafePointer, + reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, + reflect.Float32, reflect.Float64, reflect.Complex64, reflect.Complex128: + b = append(b, k.String()...) + case reflect.Chan: + if t.ChanDir() == reflect.RecvDir { + b = append(b, "<-"...) + } + b = append(b, "chan"...) + if t.ChanDir() == reflect.SendDir { + b = append(b, "<-"...) + } + b = append(b, ' ') + b = appendTypeName(b, t.Elem(), qualified, false) + case reflect.Func: + if !elideFunc { + b = append(b, "func"...) + } + b = append(b, '(') + for i := 0; i < t.NumIn(); i++ { + if i > 0 { + b = append(b, ", "...) + } + if i == t.NumIn()-1 && t.IsVariadic() { + b = append(b, "..."...) + b = appendTypeName(b, t.In(i).Elem(), qualified, false) + } else { + b = appendTypeName(b, t.In(i), qualified, false) + } + } + b = append(b, ')') + switch t.NumOut() { + case 0: + // Do nothing + case 1: + b = append(b, ' ') + b = appendTypeName(b, t.Out(0), qualified, false) + default: + b = append(b, " ("...) + for i := 0; i < t.NumOut(); i++ { + if i > 0 { + b = append(b, ", "...) + } + b = appendTypeName(b, t.Out(i), qualified, false) + } + b = append(b, ')') + } + case reflect.Struct: + b = append(b, "struct{ "...) + for i := 0; i < t.NumField(); i++ { + if i > 0 { + b = append(b, "; "...) + } + sf := t.Field(i) + if !sf.Anonymous { + if qualified && sf.PkgPath != "" { + b = append(b, '"') + b = append(b, sf.PkgPath...) + b = append(b, '"') + b = append(b, '.') + } + b = append(b, sf.Name...) + b = append(b, ' ') + } + b = appendTypeName(b, sf.Type, qualified, false) + if sf.Tag != "" { + b = append(b, ' ') + b = strconv.AppendQuote(b, string(sf.Tag)) + } + } + if b[len(b)-1] == ' ' { + b = b[:len(b)-1] + } else { + b = append(b, ' ') + } + b = append(b, '}') + case reflect.Slice, reflect.Array: + b = append(b, '[') + if k == reflect.Array { + b = strconv.AppendUint(b, uint64(t.Len()), 10) + } + b = append(b, ']') + b = appendTypeName(b, t.Elem(), qualified, false) + case reflect.Map: + b = append(b, "map["...) + b = appendTypeName(b, t.Key(), qualified, false) + b = append(b, ']') + b = appendTypeName(b, t.Elem(), qualified, false) + case reflect.Ptr: + b = append(b, '*') + b = appendTypeName(b, t.Elem(), qualified, false) + case reflect.Interface: + b = append(b, "interface{ "...) + for i := 0; i < t.NumMethod(); i++ { + if i > 0 { + b = append(b, "; "...) + } + m := t.Method(i) + if qualified && m.PkgPath != "" { + b = append(b, '"') + b = append(b, m.PkgPath...) + b = append(b, '"') + b = append(b, '.') + } + b = append(b, m.Name...) + b = appendTypeName(b, m.Type, qualified, true) + } + if b[len(b)-1] == ' ' { + b = b[:len(b)-1] + } else { + b = append(b, ' ') + } + b = append(b, '}') + default: + panic("invalid kind: " + k.String()) + } + return b +} diff --git a/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_purego.go b/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_purego.go index 0a01c4796..e9e384a1c 100644 --- a/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_purego.go +++ b/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_purego.go @@ -21,3 +21,13 @@ func PointerOf(v reflect.Value) Pointer { // assumes that the GC implementation does not use a moving collector. return Pointer{v.Pointer(), v.Type()} } + +// IsNil reports whether the pointer is nil. +func (p Pointer) IsNil() bool { + return p.p == 0 +} + +// Uintptr returns the pointer as a uintptr. +func (p Pointer) Uintptr() uintptr { + return p.p +} diff --git a/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_unsafe.go b/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_unsafe.go index da134ae2a..b50c17ec7 100644 --- a/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_unsafe.go +++ b/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_unsafe.go @@ -24,3 +24,13 @@ func PointerOf(v reflect.Value) Pointer { // which is necessary if the GC ever uses a moving collector. return Pointer{unsafe.Pointer(v.Pointer()), v.Type()} } + +// IsNil reports whether the pointer is nil. +func (p Pointer) IsNil() bool { + return p.p == nil +} + +// Uintptr returns the pointer as a uintptr. +func (p Pointer) Uintptr() uintptr { + return uintptr(p.p) +} diff --git a/vendor/github.com/google/go-cmp/cmp/options.go b/vendor/github.com/google/go-cmp/cmp/options.go index 793448160..abbd2a63b 100644 --- a/vendor/github.com/google/go-cmp/cmp/options.go +++ b/vendor/github.com/google/go-cmp/cmp/options.go @@ -225,8 +225,20 @@ func (validator) apply(s *state, vx, vy reflect.Value) { // Unable to Interface implies unexported field without visibility access. if !vx.CanInterface() || !vy.CanInterface() { - const help = "consider using a custom Comparer; if you control the implementation of type, you can also consider AllowUnexported or cmpopts.IgnoreUnexported" - panic(fmt.Sprintf("cannot handle unexported field: %#v\n%s", s.curPath, help)) + const help = "consider using a custom Comparer; if you control the implementation of type, you can also consider using an Exporter, AllowUnexported, or cmpopts.IgnoreUnexported" + var name string + if t := s.curPath.Index(-2).Type(); t.Name() != "" { + // Named type with unexported fields. + name = fmt.Sprintf("%q.%v", t.PkgPath(), t.Name()) // e.g., "path/to/package".MyType + } else { + // Unnamed type with unexported fields. Derive PkgPath from field. + var pkgPath string + for i := 0; i < t.NumField() && pkgPath == ""; i++ { + pkgPath = t.Field(i).PkgPath + } + name = fmt.Sprintf("%q.(%v)", pkgPath, t.String()) // e.g., "path/to/package".(struct { a int }) + } + panic(fmt.Sprintf("cannot handle unexported field at %#v:\n\t%v\n%s", s.curPath, name, help)) } panic("not reachable") @@ -360,9 +372,8 @@ func (cm comparer) String() string { return fmt.Sprintf("Comparer(%s)", function.NameOf(cm.fnc)) } -// AllowUnexported returns an Option that forcibly allows operations on -// unexported fields in certain structs, which are specified by passing in a -// value of each struct type. +// Exporter returns an Option that specifies whether Equal is allowed to +// introspect into the unexported fields of certain struct types. // // Users of this option must understand that comparing on unexported fields // from external packages is not safe since changes in the internal @@ -386,10 +397,24 @@ func (cm comparer) String() string { // // In other cases, the cmpopts.IgnoreUnexported option can be used to ignore // all unexported fields on specified struct types. -func AllowUnexported(types ...interface{}) Option { - if !supportAllowUnexported { - panic("AllowUnexported is not supported on purego builds, Google App Engine Standard, or GopherJS") +func Exporter(f func(reflect.Type) bool) Option { + if !supportExporters { + panic("Exporter is not supported on purego builds") } + return exporter(f) +} + +type exporter func(reflect.Type) bool + +func (exporter) filter(_ *state, _ reflect.Type, _, _ reflect.Value) applicableOption { + panic("not implemented") +} + +// AllowUnexported returns an Options that allows Equal to forcibly introspect +// unexported fields of the specified struct types. +// +// See Exporter for the proper use of this option. +func AllowUnexported(types ...interface{}) Option { m := make(map[reflect.Type]bool) for _, typ := range types { t := reflect.TypeOf(typ) @@ -398,13 +423,7 @@ func AllowUnexported(types ...interface{}) Option { } m[t] = true } - return visibleStructs(m) -} - -type visibleStructs map[reflect.Type]bool - -func (visibleStructs) filter(_ *state, _ reflect.Type, _, _ reflect.Value) applicableOption { - panic("not implemented") + return exporter(func(t reflect.Type) bool { return m[t] }) } // Result represents the comparison result for a single node and @@ -436,6 +455,11 @@ func (r Result) ByFunc() bool { return r.flags&reportByFunc != 0 } +// ByCycle reports whether a reference cycle was detected. +func (r Result) ByCycle() bool { + return r.flags&reportByCycle != 0 +} + type resultFlags uint const ( @@ -446,6 +470,7 @@ const ( reportByIgnore reportByMethod reportByFunc + reportByCycle ) // Reporter is an Option that can be passed to Equal. When Equal traverses diff --git a/vendor/github.com/google/go-cmp/cmp/path.go b/vendor/github.com/google/go-cmp/cmp/path.go index 96fffd291..603dbb002 100644 --- a/vendor/github.com/google/go-cmp/cmp/path.go +++ b/vendor/github.com/google/go-cmp/cmp/path.go @@ -10,6 +10,8 @@ import ( "strings" "unicode" "unicode/utf8" + + "github.com/google/go-cmp/cmp/internal/value" ) // Path is a list of PathSteps describing the sequence of operations to get @@ -41,7 +43,7 @@ type PathStep interface { // In some cases, one or both may be invalid or have restrictions: // • For StructField, both are not interface-able if the current field // is unexported and the struct type is not explicitly permitted by - // AllowUnexported to traverse unexported fields. + // an Exporter to traverse unexported fields. // • For SliceIndex, one may be invalid if an element is missing from // either the x or y slice. // • For MapIndex, one may be invalid if an entry is missing from @@ -175,7 +177,8 @@ type structField struct { // pvx, pvy, and field are only valid if unexported is true. unexported bool mayForce bool // Forcibly allow visibility - pvx, pvy reflect.Value // Parent values + paddr bool // Was parent addressable? + pvx, pvy reflect.Value // Parent values (always addressible) field reflect.StructField // Field information } @@ -187,8 +190,8 @@ func (sf StructField) Values() (vx, vy reflect.Value) { // Forcibly obtain read-write access to an unexported struct field. if sf.mayForce { - vx = retrieveUnexportedField(sf.pvx, sf.field) - vy = retrieveUnexportedField(sf.pvy, sf.field) + vx = retrieveUnexportedField(sf.pvx, sf.field, sf.paddr) + vy = retrieveUnexportedField(sf.pvy, sf.field, sf.paddr) return vx, vy // CanInterface reports true } return sf.vx, sf.vy // CanInterface reports false @@ -207,6 +210,7 @@ type SliceIndex struct{ *sliceIndex } type sliceIndex struct { pathStep xkey, ykey int + isSlice bool // False for reflect.Array } func (si SliceIndex) Type() reflect.Type { return si.typ } @@ -301,6 +305,72 @@ func (tf Transform) Func() reflect.Value { return tf.trans.fnc } // The == operator can be used to detect the exact option used. func (tf Transform) Option() Option { return tf.trans } +// pointerPath represents a dual-stack of pointers encountered when +// recursively traversing the x and y values. This data structure supports +// detection of cycles and determining whether the cycles are equal. +// In Go, cycles can occur via pointers, slices, and maps. +// +// The pointerPath uses a map to represent a stack; where descension into a +// pointer pushes the address onto the stack, and ascension from a pointer +// pops the address from the stack. Thus, when traversing into a pointer from +// reflect.Ptr, reflect.Slice element, or reflect.Map, we can detect cycles +// by checking whether the pointer has already been visited. The cycle detection +// uses a seperate stack for the x and y values. +// +// If a cycle is detected we need to determine whether the two pointers +// should be considered equal. The definition of equality chosen by Equal +// requires two graphs to have the same structure. To determine this, both the +// x and y values must have a cycle where the previous pointers were also +// encountered together as a pair. +// +// Semantically, this is equivalent to augmenting Indirect, SliceIndex, and +// MapIndex with pointer information for the x and y values. +// Suppose px and py are two pointers to compare, we then search the +// Path for whether px was ever encountered in the Path history of x, and +// similarly so with py. If either side has a cycle, the comparison is only +// equal if both px and py have a cycle resulting from the same PathStep. +// +// Using a map as a stack is more performant as we can perform cycle detection +// in O(1) instead of O(N) where N is len(Path). +type pointerPath struct { + // mx is keyed by x pointers, where the value is the associated y pointer. + mx map[value.Pointer]value.Pointer + // my is keyed by y pointers, where the value is the associated x pointer. + my map[value.Pointer]value.Pointer +} + +func (p *pointerPath) Init() { + p.mx = make(map[value.Pointer]value.Pointer) + p.my = make(map[value.Pointer]value.Pointer) +} + +// Push indicates intent to descend into pointers vx and vy where +// visited reports whether either has been seen before. If visited before, +// equal reports whether both pointers were encountered together. +// Pop must be called if and only if the pointers were never visited. +// +// The pointers vx and vy must be a reflect.Ptr, reflect.Slice, or reflect.Map +// and be non-nil. +func (p pointerPath) Push(vx, vy reflect.Value) (equal, visited bool) { + px := value.PointerOf(vx) + py := value.PointerOf(vy) + _, ok1 := p.mx[px] + _, ok2 := p.my[py] + if ok1 || ok2 { + equal = p.mx[px] == py && p.my[py] == px // Pointers paired together + return equal, true + } + p.mx[px] = py + p.my[py] = px + return false, false +} + +// Pop ascends from pointers vx and vy. +func (p pointerPath) Pop(vx, vy reflect.Value) { + delete(p.mx, value.PointerOf(vx)) + delete(p.my, value.PointerOf(vy)) +} + // isExported reports whether the identifier is exported. func isExported(id string) bool { r, _ := utf8.DecodeRuneInString(id) diff --git a/vendor/github.com/google/go-cmp/cmp/report.go b/vendor/github.com/google/go-cmp/cmp/report.go index 6ddf29993..aafcb3635 100644 --- a/vendor/github.com/google/go-cmp/cmp/report.go +++ b/vendor/github.com/google/go-cmp/cmp/report.go @@ -41,7 +41,10 @@ func (r *defaultReporter) String() string { if r.root.NumDiff == 0 { return "" } - return formatOptions{}.FormatDiff(r.root).String() + ptrs := new(pointerReferences) + text := formatOptions{}.FormatDiff(r.root, ptrs) + resolveReferences(text) + return text.String() } func assert(ok bool) { diff --git a/vendor/github.com/google/go-cmp/cmp/report_compare.go b/vendor/github.com/google/go-cmp/cmp/report_compare.go index 17a05eede..9e2180964 100644 --- a/vendor/github.com/google/go-cmp/cmp/report_compare.go +++ b/vendor/github.com/google/go-cmp/cmp/report_compare.go @@ -11,14 +11,6 @@ import ( "github.com/google/go-cmp/cmp/internal/value" ) -// TODO: Enforce limits? -// * Enforce maximum number of records to print per node? -// * Enforce maximum size in bytes allowed? -// * As a heuristic, use less verbosity for equal nodes than unequal nodes. -// TODO: Enforce unique outputs? -// * Avoid Stringer methods if it results in same output? -// * Print pointer address if outputs still equal? - // numContextRecords is the number of surrounding equal records to print. const numContextRecords = 2 @@ -71,24 +63,66 @@ func (opts formatOptions) WithTypeMode(t typeMode) formatOptions { opts.TypeMode = t return opts } +func (opts formatOptions) WithVerbosity(level int) formatOptions { + opts.VerbosityLevel = level + opts.LimitVerbosity = true + return opts +} +func (opts formatOptions) verbosity() uint { + switch { + case opts.VerbosityLevel < 0: + return 0 + case opts.VerbosityLevel > 16: + return 16 // some reasonable maximum to avoid shift overflow + default: + return uint(opts.VerbosityLevel) + } +} + +const maxVerbosityPreset = 3 + +// verbosityPreset modifies the verbosity settings given an index +// between 0 and maxVerbosityPreset, inclusive. +func verbosityPreset(opts formatOptions, i int) formatOptions { + opts.VerbosityLevel = int(opts.verbosity()) + 2*i + if i > 0 { + opts.AvoidStringer = true + } + if i >= maxVerbosityPreset { + opts.PrintAddresses = true + opts.QualifiedNames = true + } + return opts +} // FormatDiff converts a valueNode tree into a textNode tree, where the later // is a textual representation of the differences detected in the former. -func (opts formatOptions) FormatDiff(v *valueNode) textNode { +func (opts formatOptions) FormatDiff(v *valueNode, ptrs *pointerReferences) (out textNode) { + if opts.DiffMode == diffIdentical { + opts = opts.WithVerbosity(1) + } else { + opts = opts.WithVerbosity(3) + } + // Check whether we have specialized formatting for this node. // This is not necessary, but helpful for producing more readable outputs. if opts.CanFormatDiffSlice(v) { return opts.FormatDiffSlice(v) } + var parentKind reflect.Kind + if v.parent != nil && v.parent.TransformerName == "" { + parentKind = v.parent.Type.Kind() + } + // For leaf nodes, format the value based on the reflect.Values alone. if v.MaxDepth == 0 { switch opts.DiffMode { case diffUnknown, diffIdentical: // Format Equal. if v.NumDiff == 0 { - outx := opts.FormatValue(v.ValueX, visitedPointers{}) - outy := opts.FormatValue(v.ValueY, visitedPointers{}) + outx := opts.FormatValue(v.ValueX, parentKind, ptrs) + outy := opts.FormatValue(v.ValueY, parentKind, ptrs) if v.NumIgnored > 0 && v.NumSame == 0 { return textEllipsis } else if outx.Len() < outy.Len() { @@ -101,8 +135,13 @@ func (opts formatOptions) FormatDiff(v *valueNode) textNode { // Format unequal. assert(opts.DiffMode == diffUnknown) var list textList - outx := opts.WithTypeMode(elideType).FormatValue(v.ValueX, visitedPointers{}) - outy := opts.WithTypeMode(elideType).FormatValue(v.ValueY, visitedPointers{}) + outx := opts.WithTypeMode(elideType).FormatValue(v.ValueX, parentKind, ptrs) + outy := opts.WithTypeMode(elideType).FormatValue(v.ValueY, parentKind, ptrs) + for i := 0; i <= maxVerbosityPreset && outx != nil && outy != nil && outx.Equal(outy); i++ { + opts2 := verbosityPreset(opts, i).WithTypeMode(elideType) + outx = opts2.FormatValue(v.ValueX, parentKind, ptrs) + outy = opts2.FormatValue(v.ValueY, parentKind, ptrs) + } if outx != nil { list = append(list, textRecord{Diff: '-', Value: outx}) } @@ -111,34 +150,57 @@ func (opts formatOptions) FormatDiff(v *valueNode) textNode { } return opts.WithTypeMode(emitType).FormatType(v.Type, list) case diffRemoved: - return opts.FormatValue(v.ValueX, visitedPointers{}) + return opts.FormatValue(v.ValueX, parentKind, ptrs) case diffInserted: - return opts.FormatValue(v.ValueY, visitedPointers{}) + return opts.FormatValue(v.ValueY, parentKind, ptrs) default: panic("invalid diff mode") } } + // Register slice element to support cycle detection. + if parentKind == reflect.Slice { + ptrRefs := ptrs.PushPair(v.ValueX, v.ValueY, opts.DiffMode, true) + defer ptrs.Pop() + defer func() { out = wrapTrunkReferences(ptrRefs, out) }() + } + // Descend into the child value node. if v.TransformerName != "" { - out := opts.WithTypeMode(emitType).FormatDiff(v.Value) - out = textWrap{"Inverse(" + v.TransformerName + ", ", out, ")"} + out := opts.WithTypeMode(emitType).FormatDiff(v.Value, ptrs) + out = &textWrap{Prefix: "Inverse(" + v.TransformerName + ", ", Value: out, Suffix: ")"} return opts.FormatType(v.Type, out) } else { switch k := v.Type.Kind(); k { - case reflect.Struct, reflect.Array, reflect.Slice, reflect.Map: - return opts.FormatType(v.Type, opts.formatDiffList(v.Records, k)) + case reflect.Struct, reflect.Array, reflect.Slice: + out = opts.formatDiffList(v.Records, k, ptrs) + out = opts.FormatType(v.Type, out) + case reflect.Map: + // Register map to support cycle detection. + ptrRefs := ptrs.PushPair(v.ValueX, v.ValueY, opts.DiffMode, false) + defer ptrs.Pop() + + out = opts.formatDiffList(v.Records, k, ptrs) + out = wrapTrunkReferences(ptrRefs, out) + out = opts.FormatType(v.Type, out) case reflect.Ptr: - return textWrap{"&", opts.FormatDiff(v.Value), ""} + // Register pointer to support cycle detection. + ptrRefs := ptrs.PushPair(v.ValueX, v.ValueY, opts.DiffMode, false) + defer ptrs.Pop() + + out = opts.FormatDiff(v.Value, ptrs) + out = wrapTrunkReferences(ptrRefs, out) + out = &textWrap{Prefix: "&", Value: out} case reflect.Interface: - return opts.WithTypeMode(emitType).FormatDiff(v.Value) + out = opts.WithTypeMode(emitType).FormatDiff(v.Value, ptrs) default: panic(fmt.Sprintf("%v cannot have children", k)) } + return out } } -func (opts formatOptions) formatDiffList(recs []reportRecord, k reflect.Kind) textNode { +func (opts formatOptions) formatDiffList(recs []reportRecord, k reflect.Kind, ptrs *pointerReferences) textNode { // Derive record name based on the data structure kind. var name string var formatKey func(reflect.Value) string @@ -154,7 +216,17 @@ func (opts formatOptions) formatDiffList(recs []reportRecord, k reflect.Kind) te case reflect.Map: name = "entry" opts = opts.WithTypeMode(elideType) - formatKey = formatMapKey + formatKey = func(v reflect.Value) string { return formatMapKey(v, false, ptrs) } + } + + maxLen := -1 + if opts.LimitVerbosity { + if opts.DiffMode == diffIdentical { + maxLen = ((1 << opts.verbosity()) >> 1) << 2 // 0, 4, 8, 16, 32, etc... + } else { + maxLen = (1 << opts.verbosity()) << 1 // 2, 4, 8, 16, 32, 64, etc... + } + opts.VerbosityLevel-- } // Handle unification. @@ -163,6 +235,11 @@ func (opts formatOptions) formatDiffList(recs []reportRecord, k reflect.Kind) te var list textList var deferredEllipsis bool // Add final "..." to indicate records were dropped for _, r := range recs { + if len(list) == maxLen { + deferredEllipsis = true + break + } + // Elide struct fields that are zero value. if k == reflect.Struct { var isZero bool @@ -186,23 +263,31 @@ func (opts formatOptions) formatDiffList(recs []reportRecord, k reflect.Kind) te } continue } - if out := opts.FormatDiff(r.Value); out != nil { + if out := opts.FormatDiff(r.Value, ptrs); out != nil { list = append(list, textRecord{Key: formatKey(r.Key), Value: out}) } } if deferredEllipsis { list.AppendEllipsis(diffStats{}) } - return textWrap{"{", list, "}"} + return &textWrap{Prefix: "{", Value: list, Suffix: "}"} case diffUnknown: default: panic("invalid diff mode") } // Handle differencing. + var numDiffs int var list textList + var keys []reflect.Value // invariant: len(list) == len(keys) groups := coalesceAdjacentRecords(name, recs) + maxGroup := diffStats{Name: name} for i, ds := range groups { + if maxLen >= 0 && numDiffs >= maxLen { + maxGroup = maxGroup.Append(ds) + continue + } + // Handle equal records. if ds.NumDiff() == 0 { // Compute the number of leading and trailing records to print. @@ -226,16 +311,21 @@ func (opts formatOptions) formatDiffList(recs []reportRecord, k reflect.Kind) te // Format the equal values. for _, r := range recs[:numLo] { - out := opts.WithDiffMode(diffIdentical).FormatDiff(r.Value) + out := opts.WithDiffMode(diffIdentical).FormatDiff(r.Value, ptrs) list = append(list, textRecord{Key: formatKey(r.Key), Value: out}) + keys = append(keys, r.Key) } if numEqual > numLo+numHi { ds.NumIdentical -= numLo + numHi list.AppendEllipsis(ds) + for len(keys) < len(list) { + keys = append(keys, reflect.Value{}) + } } for _, r := range recs[numEqual-numHi : numEqual] { - out := opts.WithDiffMode(diffIdentical).FormatDiff(r.Value) + out := opts.WithDiffMode(diffIdentical).FormatDiff(r.Value, ptrs) list = append(list, textRecord{Key: formatKey(r.Key), Value: out}) + keys = append(keys, r.Key) } recs = recs[numEqual:] continue @@ -247,24 +337,70 @@ func (opts formatOptions) formatDiffList(recs []reportRecord, k reflect.Kind) te case opts.CanFormatDiffSlice(r.Value): out := opts.FormatDiffSlice(r.Value) list = append(list, textRecord{Key: formatKey(r.Key), Value: out}) + keys = append(keys, r.Key) case r.Value.NumChildren == r.Value.MaxDepth: - outx := opts.WithDiffMode(diffRemoved).FormatDiff(r.Value) - outy := opts.WithDiffMode(diffInserted).FormatDiff(r.Value) + outx := opts.WithDiffMode(diffRemoved).FormatDiff(r.Value, ptrs) + outy := opts.WithDiffMode(diffInserted).FormatDiff(r.Value, ptrs) + for i := 0; i <= maxVerbosityPreset && outx != nil && outy != nil && outx.Equal(outy); i++ { + opts2 := verbosityPreset(opts, i) + outx = opts2.WithDiffMode(diffRemoved).FormatDiff(r.Value, ptrs) + outy = opts2.WithDiffMode(diffInserted).FormatDiff(r.Value, ptrs) + } if outx != nil { list = append(list, textRecord{Diff: diffRemoved, Key: formatKey(r.Key), Value: outx}) + keys = append(keys, r.Key) } if outy != nil { list = append(list, textRecord{Diff: diffInserted, Key: formatKey(r.Key), Value: outy}) + keys = append(keys, r.Key) } default: - out := opts.FormatDiff(r.Value) + out := opts.FormatDiff(r.Value, ptrs) list = append(list, textRecord{Key: formatKey(r.Key), Value: out}) + keys = append(keys, r.Key) } } recs = recs[ds.NumDiff():] + numDiffs += ds.NumDiff() + } + if maxGroup.IsZero() { + assert(len(recs) == 0) + } else { + list.AppendEllipsis(maxGroup) + for len(keys) < len(list) { + keys = append(keys, reflect.Value{}) + } } - assert(len(recs) == 0) - return textWrap{"{", list, "}"} + assert(len(list) == len(keys)) + + // For maps, the default formatting logic uses fmt.Stringer which may + // produce ambiguous output. Avoid calling String to disambiguate. + if k == reflect.Map { + var ambiguous bool + seenKeys := map[string]reflect.Value{} + for i, currKey := range keys { + if currKey.IsValid() { + strKey := list[i].Key + prevKey, seen := seenKeys[strKey] + if seen && prevKey.CanInterface() && currKey.CanInterface() { + ambiguous = prevKey.Interface() != currKey.Interface() + if ambiguous { + break + } + } + seenKeys[strKey] = currKey + } + } + if ambiguous { + for i, k := range keys { + if k.IsValid() { + list[i].Key = formatMapKey(k, true, ptrs) + } + } + } + } + + return &textWrap{Prefix: "{", Value: list, Suffix: "}"} } // coalesceAdjacentRecords coalesces the list of records into groups of diff --git a/vendor/github.com/google/go-cmp/cmp/report_references.go b/vendor/github.com/google/go-cmp/cmp/report_references.go new file mode 100644 index 000000000..d620c2c20 --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/report_references.go @@ -0,0 +1,264 @@ +// Copyright 2020, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +package cmp + +import ( + "fmt" + "reflect" + "strings" + + "github.com/google/go-cmp/cmp/internal/flags" + "github.com/google/go-cmp/cmp/internal/value" +) + +const ( + pointerDelimPrefix = "⟪" + pointerDelimSuffix = "⟫" +) + +// formatPointer prints the address of the pointer. +func formatPointer(p value.Pointer, withDelims bool) string { + v := p.Uintptr() + if flags.Deterministic { + v = 0xdeadf00f // Only used for stable testing purposes + } + if withDelims { + return pointerDelimPrefix + formatHex(uint64(v)) + pointerDelimSuffix + } + return formatHex(uint64(v)) +} + +// pointerReferences is a stack of pointers visited so far. +type pointerReferences [][2]value.Pointer + +func (ps *pointerReferences) PushPair(vx, vy reflect.Value, d diffMode, deref bool) (pp [2]value.Pointer) { + if deref && vx.IsValid() { + vx = vx.Addr() + } + if deref && vy.IsValid() { + vy = vy.Addr() + } + switch d { + case diffUnknown, diffIdentical: + pp = [2]value.Pointer{value.PointerOf(vx), value.PointerOf(vy)} + case diffRemoved: + pp = [2]value.Pointer{value.PointerOf(vx), value.Pointer{}} + case diffInserted: + pp = [2]value.Pointer{value.Pointer{}, value.PointerOf(vy)} + } + *ps = append(*ps, pp) + return pp +} + +func (ps *pointerReferences) Push(v reflect.Value) (p value.Pointer, seen bool) { + p = value.PointerOf(v) + for _, pp := range *ps { + if p == pp[0] || p == pp[1] { + return p, true + } + } + *ps = append(*ps, [2]value.Pointer{p, p}) + return p, false +} + +func (ps *pointerReferences) Pop() { + *ps = (*ps)[:len(*ps)-1] +} + +// trunkReferences is metadata for a textNode indicating that the sub-tree +// represents the value for either pointer in a pair of references. +type trunkReferences struct{ pp [2]value.Pointer } + +// trunkReference is metadata for a textNode indicating that the sub-tree +// represents the value for the given pointer reference. +type trunkReference struct{ p value.Pointer } + +// leafReference is metadata for a textNode indicating that the value is +// truncated as it refers to another part of the tree (i.e., a trunk). +type leafReference struct{ p value.Pointer } + +func wrapTrunkReferences(pp [2]value.Pointer, s textNode) textNode { + switch { + case pp[0].IsNil(): + return &textWrap{Value: s, Metadata: trunkReference{pp[1]}} + case pp[1].IsNil(): + return &textWrap{Value: s, Metadata: trunkReference{pp[0]}} + case pp[0] == pp[1]: + return &textWrap{Value: s, Metadata: trunkReference{pp[0]}} + default: + return &textWrap{Value: s, Metadata: trunkReferences{pp}} + } +} +func wrapTrunkReference(p value.Pointer, printAddress bool, s textNode) textNode { + var prefix string + if printAddress { + prefix = formatPointer(p, true) + } + return &textWrap{Prefix: prefix, Value: s, Metadata: trunkReference{p}} +} +func makeLeafReference(p value.Pointer, printAddress bool) textNode { + out := &textWrap{Prefix: "(", Value: textEllipsis, Suffix: ")"} + var prefix string + if printAddress { + prefix = formatPointer(p, true) + } + return &textWrap{Prefix: prefix, Value: out, Metadata: leafReference{p}} +} + +// resolveReferences walks the textNode tree searching for any leaf reference +// metadata and resolves each against the corresponding trunk references. +// Since pointer addresses in memory are not particularly readable to the user, +// it replaces each pointer value with an arbitrary and unique reference ID. +func resolveReferences(s textNode) { + var walkNodes func(textNode, func(textNode)) + walkNodes = func(s textNode, f func(textNode)) { + f(s) + switch s := s.(type) { + case *textWrap: + walkNodes(s.Value, f) + case textList: + for _, r := range s { + walkNodes(r.Value, f) + } + } + } + + // Collect all trunks and leaves with reference metadata. + var trunks, leaves []*textWrap + walkNodes(s, func(s textNode) { + if s, ok := s.(*textWrap); ok { + switch s.Metadata.(type) { + case leafReference: + leaves = append(leaves, s) + case trunkReference, trunkReferences: + trunks = append(trunks, s) + } + } + }) + + // No leaf references to resolve. + if len(leaves) == 0 { + return + } + + // Collect the set of all leaf references to resolve. + leafPtrs := make(map[value.Pointer]bool) + for _, leaf := range leaves { + leafPtrs[leaf.Metadata.(leafReference).p] = true + } + + // Collect the set of trunk pointers that are always paired together. + // This allows us to assign a single ID to both pointers for brevity. + // If a pointer in a pair ever occurs by itself or as a different pair, + // then the pair is broken. + pairedTrunkPtrs := make(map[value.Pointer]value.Pointer) + unpair := func(p value.Pointer) { + if !pairedTrunkPtrs[p].IsNil() { + pairedTrunkPtrs[pairedTrunkPtrs[p]] = value.Pointer{} // invalidate other half + } + pairedTrunkPtrs[p] = value.Pointer{} // invalidate this half + } + for _, trunk := range trunks { + switch p := trunk.Metadata.(type) { + case trunkReference: + unpair(p.p) // standalone pointer cannot be part of a pair + case trunkReferences: + p0, ok0 := pairedTrunkPtrs[p.pp[0]] + p1, ok1 := pairedTrunkPtrs[p.pp[1]] + switch { + case !ok0 && !ok1: + // Register the newly seen pair. + pairedTrunkPtrs[p.pp[0]] = p.pp[1] + pairedTrunkPtrs[p.pp[1]] = p.pp[0] + case ok0 && ok1 && p0 == p.pp[1] && p1 == p.pp[0]: + // Exact pair already seen; do nothing. + default: + // Pair conflicts with some other pair; break all pairs. + unpair(p.pp[0]) + unpair(p.pp[1]) + } + } + } + + // Correlate each pointer referenced by leaves to a unique identifier, + // and print the IDs for each trunk that matches those pointers. + var nextID uint + ptrIDs := make(map[value.Pointer]uint) + newID := func() uint { + id := nextID + nextID++ + return id + } + for _, trunk := range trunks { + switch p := trunk.Metadata.(type) { + case trunkReference: + if print := leafPtrs[p.p]; print { + id, ok := ptrIDs[p.p] + if !ok { + id = newID() + ptrIDs[p.p] = id + } + trunk.Prefix = updateReferencePrefix(trunk.Prefix, formatReference(id)) + } + case trunkReferences: + print0 := leafPtrs[p.pp[0]] + print1 := leafPtrs[p.pp[1]] + if print0 || print1 { + id0, ok0 := ptrIDs[p.pp[0]] + id1, ok1 := ptrIDs[p.pp[1]] + isPair := pairedTrunkPtrs[p.pp[0]] == p.pp[1] && pairedTrunkPtrs[p.pp[1]] == p.pp[0] + if isPair { + var id uint + assert(ok0 == ok1) // must be seen together or not at all + if ok0 { + assert(id0 == id1) // must have the same ID + id = id0 + } else { + id = newID() + ptrIDs[p.pp[0]] = id + ptrIDs[p.pp[1]] = id + } + trunk.Prefix = updateReferencePrefix(trunk.Prefix, formatReference(id)) + } else { + if print0 && !ok0 { + id0 = newID() + ptrIDs[p.pp[0]] = id0 + } + if print1 && !ok1 { + id1 = newID() + ptrIDs[p.pp[1]] = id1 + } + switch { + case print0 && print1: + trunk.Prefix = updateReferencePrefix(trunk.Prefix, formatReference(id0)+","+formatReference(id1)) + case print0: + trunk.Prefix = updateReferencePrefix(trunk.Prefix, formatReference(id0)) + case print1: + trunk.Prefix = updateReferencePrefix(trunk.Prefix, formatReference(id1)) + } + } + } + } + } + + // Update all leaf references with the unique identifier. + for _, leaf := range leaves { + if id, ok := ptrIDs[leaf.Metadata.(leafReference).p]; ok { + leaf.Prefix = updateReferencePrefix(leaf.Prefix, formatReference(id)) + } + } +} + +func formatReference(id uint) string { + return fmt.Sprintf("ref#%d", id) +} + +func updateReferencePrefix(prefix, ref string) string { + if prefix == "" { + return pointerDelimPrefix + ref + pointerDelimSuffix + } + suffix := strings.TrimPrefix(prefix, pointerDelimPrefix) + return pointerDelimPrefix + ref + ": " + suffix +} diff --git a/vendor/github.com/google/go-cmp/cmp/report_reflect.go b/vendor/github.com/google/go-cmp/cmp/report_reflect.go index 2761b6289..2d722ea51 100644 --- a/vendor/github.com/google/go-cmp/cmp/report_reflect.go +++ b/vendor/github.com/google/go-cmp/cmp/report_reflect.go @@ -10,8 +10,8 @@ import ( "strconv" "strings" "unicode" + "unicode/utf8" - "github.com/google/go-cmp/cmp/internal/flags" "github.com/google/go-cmp/cmp/internal/value" ) @@ -20,14 +20,22 @@ type formatValueOptions struct { // methods like error.Error or fmt.Stringer.String. AvoidStringer bool - // ShallowPointers controls whether to avoid descending into pointers. - // Useful when printing map keys, where pointer comparison is performed - // on the pointer address rather than the pointed-at value. - ShallowPointers bool - // PrintAddresses controls whether to print the address of all pointers, // slice elements, and maps. PrintAddresses bool + + // QualifiedNames controls whether FormatType uses the fully qualified name + // (including the full package path as opposed to just the package name). + QualifiedNames bool + + // VerbosityLevel controls the amount of output to produce. + // A higher value produces more output. A value of zero or lower produces + // no output (represented using an ellipsis). + // If LimitVerbosity is false, then the level is treated as infinite. + VerbosityLevel int + + // LimitVerbosity specifies that formatting should respect VerbosityLevel. + LimitVerbosity bool } // FormatType prints the type as if it were wrapping s. @@ -44,12 +52,15 @@ func (opts formatOptions) FormatType(t reflect.Type, s textNode) textNode { default: return s } + if opts.DiffMode == diffIdentical { + return s // elide type for identical nodes + } case elideType: return s } // Determine the type label, applying special handling for unnamed types. - typeName := t.String() + typeName := value.TypeString(t, opts.QualifiedNames) if t.Name() == "" { // According to Go grammar, certain type literals contain symbols that // do not strongly bind to the next lexicographical token (e.g., *T). @@ -57,39 +68,78 @@ func (opts formatOptions) FormatType(t reflect.Type, s textNode) textNode { case reflect.Chan, reflect.Func, reflect.Ptr: typeName = "(" + typeName + ")" } - typeName = strings.Replace(typeName, "struct {", "struct{", -1) - typeName = strings.Replace(typeName, "interface {", "interface{", -1) } + return &textWrap{Prefix: typeName, Value: wrapParens(s)} +} - // Avoid wrap the value in parenthesis if unnecessary. - if s, ok := s.(textWrap); ok { - hasParens := strings.HasPrefix(s.Prefix, "(") && strings.HasSuffix(s.Suffix, ")") - hasBraces := strings.HasPrefix(s.Prefix, "{") && strings.HasSuffix(s.Suffix, "}") +// wrapParens wraps s with a set of parenthesis, but avoids it if the +// wrapped node itself is already surrounded by a pair of parenthesis or braces. +// It handles unwrapping one level of pointer-reference nodes. +func wrapParens(s textNode) textNode { + var refNode *textWrap + if s2, ok := s.(*textWrap); ok { + // Unwrap a single pointer reference node. + switch s2.Metadata.(type) { + case leafReference, trunkReference, trunkReferences: + refNode = s2 + if s3, ok := refNode.Value.(*textWrap); ok { + s2 = s3 + } + } + + // Already has delimiters that make parenthesis unnecessary. + hasParens := strings.HasPrefix(s2.Prefix, "(") && strings.HasSuffix(s2.Suffix, ")") + hasBraces := strings.HasPrefix(s2.Prefix, "{") && strings.HasSuffix(s2.Suffix, "}") if hasParens || hasBraces { - return textWrap{typeName, s, ""} + return s } } - return textWrap{typeName + "(", s, ")"} + if refNode != nil { + refNode.Value = &textWrap{Prefix: "(", Value: refNode.Value, Suffix: ")"} + return s + } + return &textWrap{Prefix: "(", Value: s, Suffix: ")"} } // FormatValue prints the reflect.Value, taking extra care to avoid descending -// into pointers already in m. As pointers are visited, m is also updated. -func (opts formatOptions) FormatValue(v reflect.Value, m visitedPointers) (out textNode) { +// into pointers already in ptrs. As pointers are visited, ptrs is also updated. +func (opts formatOptions) FormatValue(v reflect.Value, parentKind reflect.Kind, ptrs *pointerReferences) (out textNode) { if !v.IsValid() { return nil } t := v.Type() + // Check slice element for cycles. + if parentKind == reflect.Slice { + ptrRef, visited := ptrs.Push(v.Addr()) + if visited { + return makeLeafReference(ptrRef, false) + } + defer ptrs.Pop() + defer func() { out = wrapTrunkReference(ptrRef, false, out) }() + } + // Check whether there is an Error or String method to call. if !opts.AvoidStringer && v.CanInterface() { // Avoid calling Error or String methods on nil receivers since many // implementations crash when doing so. if (t.Kind() != reflect.Ptr && t.Kind() != reflect.Interface) || !v.IsNil() { + var prefix, strVal string switch v := v.Interface().(type) { case error: - return textLine("e" + formatString(v.Error())) + prefix, strVal = "e", v.Error() case fmt.Stringer: - return textLine("s" + formatString(v.String())) + prefix, strVal = "s", v.String() + } + if prefix != "" { + maxLen := len(strVal) + if opts.LimitVerbosity { + maxLen = (1 << opts.verbosity()) << 5 // 32, 64, 128, 256, etc... + } + if len(strVal) > maxLen+len(textEllipsis) { + return textLine(prefix + formatString(strVal[:maxLen]) + string(textEllipsis)) + } + return textLine(prefix + formatString(strVal)) } } } @@ -102,94 +152,136 @@ func (opts formatOptions) FormatValue(v reflect.Value, m visitedPointers) (out t } }() - var ptr string switch t.Kind() { case reflect.Bool: return textLine(fmt.Sprint(v.Bool())) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return textLine(fmt.Sprint(v.Int())) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - // Unnamed uints are usually bytes or words, so use hexadecimal. - if t.PkgPath() == "" || t.Kind() == reflect.Uintptr { + case reflect.Uint, reflect.Uint16, reflect.Uint32, reflect.Uint64: + return textLine(fmt.Sprint(v.Uint())) + case reflect.Uint8: + if parentKind == reflect.Slice || parentKind == reflect.Array { return textLine(formatHex(v.Uint())) } return textLine(fmt.Sprint(v.Uint())) + case reflect.Uintptr: + return textLine(formatHex(v.Uint())) case reflect.Float32, reflect.Float64: return textLine(fmt.Sprint(v.Float())) case reflect.Complex64, reflect.Complex128: return textLine(fmt.Sprint(v.Complex())) case reflect.String: + maxLen := v.Len() + if opts.LimitVerbosity { + maxLen = (1 << opts.verbosity()) << 5 // 32, 64, 128, 256, etc... + } + if v.Len() > maxLen+len(textEllipsis) { + return textLine(formatString(v.String()[:maxLen]) + string(textEllipsis)) + } return textLine(formatString(v.String())) case reflect.UnsafePointer, reflect.Chan, reflect.Func: - return textLine(formatPointer(v)) + return textLine(formatPointer(value.PointerOf(v), true)) case reflect.Struct: var list textList + v := makeAddressable(v) // needed for retrieveUnexportedField + maxLen := v.NumField() + if opts.LimitVerbosity { + maxLen = ((1 << opts.verbosity()) >> 1) << 2 // 0, 4, 8, 16, 32, etc... + opts.VerbosityLevel-- + } for i := 0; i < v.NumField(); i++ { vv := v.Field(i) if value.IsZero(vv) { continue // Elide fields with zero values } - s := opts.WithTypeMode(autoType).FormatValue(vv, m) - list = append(list, textRecord{Key: t.Field(i).Name, Value: s}) + if len(list) == maxLen { + list.AppendEllipsis(diffStats{}) + break + } + sf := t.Field(i) + if supportExporters && !isExported(sf.Name) { + vv = retrieveUnexportedField(v, sf, true) + } + s := opts.WithTypeMode(autoType).FormatValue(vv, t.Kind(), ptrs) + list = append(list, textRecord{Key: sf.Name, Value: s}) } - return textWrap{"{", list, "}"} + return &textWrap{Prefix: "{", Value: list, Suffix: "}"} case reflect.Slice: if v.IsNil() { return textNil } - if opts.PrintAddresses { - ptr = formatPointer(v) - } fallthrough case reflect.Array: + maxLen := v.Len() + if opts.LimitVerbosity { + maxLen = ((1 << opts.verbosity()) >> 1) << 2 // 0, 4, 8, 16, 32, etc... + opts.VerbosityLevel-- + } var list textList for i := 0; i < v.Len(); i++ { - vi := v.Index(i) - if vi.CanAddr() { // Check for cyclic elements - p := vi.Addr() - if m.Visit(p) { - var out textNode - out = textLine(formatPointer(p)) - out = opts.WithTypeMode(emitType).FormatType(p.Type(), out) - out = textWrap{"*", out, ""} - list = append(list, textRecord{Value: out}) - continue - } + if len(list) == maxLen { + list.AppendEllipsis(diffStats{}) + break } - s := opts.WithTypeMode(elideType).FormatValue(vi, m) + s := opts.WithTypeMode(elideType).FormatValue(v.Index(i), t.Kind(), ptrs) list = append(list, textRecord{Value: s}) } - return textWrap{ptr + "{", list, "}"} + + out = &textWrap{Prefix: "{", Value: list, Suffix: "}"} + if t.Kind() == reflect.Slice && opts.PrintAddresses { + header := fmt.Sprintf("ptr:%v, len:%d, cap:%d", formatPointer(value.PointerOf(v), false), v.Len(), v.Cap()) + out = &textWrap{Prefix: pointerDelimPrefix + header + pointerDelimSuffix, Value: out} + } + return out case reflect.Map: if v.IsNil() { return textNil } - if m.Visit(v) { - return textLine(formatPointer(v)) + + // Check pointer for cycles. + ptrRef, visited := ptrs.Push(v) + if visited { + return makeLeafReference(ptrRef, opts.PrintAddresses) } + defer ptrs.Pop() + maxLen := v.Len() + if opts.LimitVerbosity { + maxLen = ((1 << opts.verbosity()) >> 1) << 2 // 0, 4, 8, 16, 32, etc... + opts.VerbosityLevel-- + } var list textList for _, k := range value.SortKeys(v.MapKeys()) { - sk := formatMapKey(k) - sv := opts.WithTypeMode(elideType).FormatValue(v.MapIndex(k), m) + if len(list) == maxLen { + list.AppendEllipsis(diffStats{}) + break + } + sk := formatMapKey(k, false, ptrs) + sv := opts.WithTypeMode(elideType).FormatValue(v.MapIndex(k), t.Kind(), ptrs) list = append(list, textRecord{Key: sk, Value: sv}) } - if opts.PrintAddresses { - ptr = formatPointer(v) - } - return textWrap{ptr + "{", list, "}"} + + out = &textWrap{Prefix: "{", Value: list, Suffix: "}"} + out = wrapTrunkReference(ptrRef, opts.PrintAddresses, out) + return out case reflect.Ptr: if v.IsNil() { return textNil } - if m.Visit(v) || opts.ShallowPointers { - return textLine(formatPointer(v)) - } - if opts.PrintAddresses { - ptr = formatPointer(v) + + // Check pointer for cycles. + ptrRef, visited := ptrs.Push(v) + if visited { + out = makeLeafReference(ptrRef, opts.PrintAddresses) + return &textWrap{Prefix: "&", Value: out} } + defer ptrs.Pop() + skipType = true // Let the underlying value print the type instead - return textWrap{"&" + ptr, opts.FormatValue(v.Elem(), m), ""} + out = opts.FormatValue(v.Elem(), t.Kind(), ptrs) + out = wrapTrunkReference(ptrRef, opts.PrintAddresses, out) + out = &textWrap{Prefix: "&", Value: out} + return out case reflect.Interface: if v.IsNil() { return textNil @@ -197,7 +289,7 @@ func (opts formatOptions) FormatValue(v reflect.Value, m visitedPointers) (out t // Interfaces accept different concrete types, // so configure the underlying value to explicitly print the type. skipType = true // Print the concrete type instead - return opts.WithTypeMode(emitType).FormatValue(v.Elem(), m) + return opts.WithTypeMode(emitType).FormatValue(v.Elem(), t.Kind(), ptrs) default: panic(fmt.Sprintf("%v kind not handled", v.Kind())) } @@ -205,11 +297,14 @@ func (opts formatOptions) FormatValue(v reflect.Value, m visitedPointers) (out t // formatMapKey formats v as if it were a map key. // The result is guaranteed to be a single line. -func formatMapKey(v reflect.Value) string { +func formatMapKey(v reflect.Value, disambiguate bool, ptrs *pointerReferences) string { var opts formatOptions + opts.DiffMode = diffIdentical opts.TypeMode = elideType - opts.ShallowPointers = true - s := opts.FormatValue(v, visitedPointers{}).String() + opts.PrintAddresses = disambiguate + opts.AvoidStringer = disambiguate + opts.QualifiedNames = disambiguate + s := opts.FormatValue(v, reflect.Map, ptrs).String() return strings.TrimSpace(s) } @@ -227,7 +322,7 @@ func formatString(s string) string { rawInvalid := func(r rune) bool { return r == '`' || r == '\n' || !(unicode.IsPrint(r) || r == '\t') } - if strings.IndexFunc(s, rawInvalid) < 0 { + if utf8.ValidString(s) && strings.IndexFunc(s, rawInvalid) < 0 { return "`" + s + "`" } return qs @@ -256,23 +351,3 @@ func formatHex(u uint64) string { } return fmt.Sprintf(f, u) } - -// formatPointer prints the address of the pointer. -func formatPointer(v reflect.Value) string { - p := v.Pointer() - if flags.Deterministic { - p = 0xdeadf00f // Only used for stable testing purposes - } - return fmt.Sprintf("⟪0x%x⟫", p) -} - -type visitedPointers map[value.Pointer]struct{} - -// Visit inserts pointer v into the visited map and reports whether it had -// already been visited before. -func (m visitedPointers) Visit(v reflect.Value) bool { - p := value.PointerOf(v) - _, visited := m[p] - m[p] = struct{}{} - return visited -} diff --git a/vendor/github.com/google/go-cmp/cmp/report_slices.go b/vendor/github.com/google/go-cmp/cmp/report_slices.go index eafcf2e4c..35315dad3 100644 --- a/vendor/github.com/google/go-cmp/cmp/report_slices.go +++ b/vendor/github.com/google/go-cmp/cmp/report_slices.go @@ -8,6 +8,7 @@ import ( "bytes" "fmt" "reflect" + "strconv" "strings" "unicode" "unicode/utf8" @@ -23,11 +24,25 @@ func (opts formatOptions) CanFormatDiffSlice(v *valueNode) bool { return false // Must be formatting in diff mode case v.NumDiff == 0: return false // No differences detected - case v.NumIgnored+v.NumCompared+v.NumTransformed > 0: - // TODO: Handle the case where someone uses bytes.Equal on a large slice. - return false // Some custom option was used to determined equality case !v.ValueX.IsValid() || !v.ValueY.IsValid(): return false // Both values must be valid + case v.Type.Kind() == reflect.Slice && (v.ValueX.Len() == 0 || v.ValueY.Len() == 0): + return false // Both slice values have to be non-empty + case v.NumIgnored > 0: + return false // Some ignore option was used + case v.NumTransformed > 0: + return false // Some transform option was used + case v.NumCompared > 1: + return false // More than one comparison was used + case v.NumCompared == 1 && v.Type.Name() != "": + // The need for cmp to check applicability of options on every element + // in a slice is a significant performance detriment for large []byte. + // The workaround is to specify Comparer(bytes.Equal), + // which enables cmp to compare []byte more efficiently. + // If they differ, we still want to provide batched diffing. + // The logic disallows named types since they tend to have their own + // String method, with nicer formatting than what this provides. + return false } switch t := v.Type; t.Kind() { @@ -82,7 +97,7 @@ func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode { } if isText || isBinary { var numLines, lastLineIdx, maxLineLen int - isBinary = false + isBinary = !utf8.ValidString(sx) || !utf8.ValidString(sy) for i, r := range sx + sy { if !(unicode.IsPrint(r) || unicode.IsSpace(r)) || r == utf8.RuneError { isBinary = true @@ -97,7 +112,7 @@ func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode { } } isText = !isBinary - isLinedText = isText && numLines >= 4 && maxLineLen <= 256 + isLinedText = isText && numLines >= 4 && maxLineLen <= 1024 } // Format the string into printable records. @@ -117,6 +132,83 @@ func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode { }, ) delim = "\n" + + // If possible, use a custom triple-quote (""") syntax for printing + // differences in a string literal. This format is more readable, + // but has edge-cases where differences are visually indistinguishable. + // This format is avoided under the following conditions: + // • A line starts with `"""` + // • A line starts with "..." + // • A line contains non-printable characters + // • Adjacent different lines differ only by whitespace + // + // For example: + // """ + // ... // 3 identical lines + // foo + // bar + // - baz + // + BAZ + // """ + isTripleQuoted := true + prevRemoveLines := map[string]bool{} + prevInsertLines := map[string]bool{} + var list2 textList + list2 = append(list2, textRecord{Value: textLine(`"""`), ElideComma: true}) + for _, r := range list { + if !r.Value.Equal(textEllipsis) { + line, _ := strconv.Unquote(string(r.Value.(textLine))) + line = strings.TrimPrefix(strings.TrimSuffix(line, "\r"), "\r") // trim leading/trailing carriage returns for legacy Windows endline support + normLine := strings.Map(func(r rune) rune { + if unicode.IsSpace(r) { + return -1 // drop whitespace to avoid visually indistinguishable output + } + return r + }, line) + isPrintable := func(r rune) bool { + return unicode.IsPrint(r) || r == '\t' // specially treat tab as printable + } + isTripleQuoted = !strings.HasPrefix(line, `"""`) && !strings.HasPrefix(line, "...") && strings.TrimFunc(line, isPrintable) == "" + switch r.Diff { + case diffRemoved: + isTripleQuoted = isTripleQuoted && !prevInsertLines[normLine] + prevRemoveLines[normLine] = true + case diffInserted: + isTripleQuoted = isTripleQuoted && !prevRemoveLines[normLine] + prevInsertLines[normLine] = true + } + if !isTripleQuoted { + break + } + r.Value = textLine(line) + r.ElideComma = true + } + if !(r.Diff == diffRemoved || r.Diff == diffInserted) { // start a new non-adjacent difference group + prevRemoveLines = map[string]bool{} + prevInsertLines = map[string]bool{} + } + list2 = append(list2, r) + } + if r := list2[len(list2)-1]; r.Diff == diffIdentical && len(r.Value.(textLine)) == 0 { + list2 = list2[:len(list2)-1] // elide single empty line at the end + } + list2 = append(list2, textRecord{Value: textLine(`"""`), ElideComma: true}) + if isTripleQuoted { + var out textNode = &textWrap{Prefix: "(", Value: list2, Suffix: ")"} + switch t.Kind() { + case reflect.String: + if t != reflect.TypeOf(string("")) { + out = opts.FormatType(t, out) + } + case reflect.Slice: + // Always emit type for slices since the triple-quote syntax + // looks like a string (not a slice). + opts = opts.WithTypeMode(emitType) + out = opts.FormatType(t, out) + } + return out + } + // If the text appears to be single-lined text, // then perform differencing in approximately fixed-sized chunks. // The output is printed as quoted strings. @@ -129,6 +221,7 @@ func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode { }, ) delim = "" + // If the text appears to be binary data, // then perform differencing in approximately fixed-sized chunks. // The output is inspired by hexdump. @@ -145,6 +238,7 @@ func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode { return textRecord{Diff: d, Value: textLine(s), Comment: comment} }, ) + // For all other slices of primitive types, // then perform differencing in approximately fixed-sized chunks. // The size of each chunk depends on the width of the element kind. @@ -172,7 +266,9 @@ func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode { switch t.Elem().Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: ss = append(ss, fmt.Sprint(v.Index(i).Int())) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + case reflect.Uint, reflect.Uint16, reflect.Uint32, reflect.Uint64: + ss = append(ss, fmt.Sprint(v.Index(i).Uint())) + case reflect.Uint8, reflect.Uintptr: ss = append(ss, formatHex(v.Index(i).Uint())) case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Complex64, reflect.Complex128: ss = append(ss, fmt.Sprint(v.Index(i).Interface())) @@ -185,7 +281,7 @@ func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode { } // Wrap the output with appropriate type information. - var out textNode = textWrap{"{", list, "}"} + var out textNode = &textWrap{Prefix: "{", Value: list, Suffix: "}"} if !isText { // The "{...}" byte-sequence literal is not valid Go syntax for strings. // Emit the type for extra clarity (e.g. "string{...}"). @@ -196,12 +292,12 @@ func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode { } switch t.Kind() { case reflect.String: - out = textWrap{"strings.Join(", out, fmt.Sprintf(", %q)", delim)} + out = &textWrap{Prefix: "strings.Join(", Value: out, Suffix: fmt.Sprintf(", %q)", delim)} if t != reflect.TypeOf(string("")) { out = opts.FormatType(t, out) } case reflect.Slice: - out = textWrap{"bytes.Join(", out, fmt.Sprintf(", %q)", delim)} + out = &textWrap{Prefix: "bytes.Join(", Value: out, Suffix: fmt.Sprintf(", %q)", delim)} if t != reflect.TypeOf([]byte(nil)) { out = opts.FormatType(t, out) } @@ -242,9 +338,22 @@ func (opts formatOptions) formatDiffSlice( return n0 - v.Len() } + var numDiffs int + maxLen := -1 + if opts.LimitVerbosity { + maxLen = (1 << opts.verbosity()) << 2 // 4, 8, 16, 32, 64, etc... + opts.VerbosityLevel-- + } + groups := coalesceAdjacentEdits(name, es) groups = coalesceInterveningIdentical(groups, chunkSize/4) + maxGroup := diffStats{Name: name} for i, ds := range groups { + if maxLen >= 0 && numDiffs >= maxLen { + maxGroup = maxGroup.Append(ds) + continue + } + // Print equal. if ds.NumDiff() == 0 { // Compute the number of leading and trailing equal bytes to print. @@ -273,12 +382,18 @@ func (opts formatOptions) formatDiffSlice( } // Print unequal. + len0 := len(list) nx := appendChunks(vx.Slice(0, ds.NumIdentical+ds.NumRemoved+ds.NumModified), diffRemoved) vx = vx.Slice(nx, vx.Len()) ny := appendChunks(vy.Slice(0, ds.NumIdentical+ds.NumInserted+ds.NumModified), diffInserted) vy = vy.Slice(ny, vy.Len()) + numDiffs += len(list) - len0 + } + if maxGroup.IsZero() { + assert(vx.Len() == 0 && vy.Len() == 0) + } else { + list.AppendEllipsis(maxGroup) } - assert(vx.Len() == 0 && vy.Len() == 0) return list } diff --git a/vendor/github.com/google/go-cmp/cmp/report_text.go b/vendor/github.com/google/go-cmp/cmp/report_text.go index 8b8fcab7b..8b12c05cd 100644 --- a/vendor/github.com/google/go-cmp/cmp/report_text.go +++ b/vendor/github.com/google/go-cmp/cmp/report_text.go @@ -10,12 +10,15 @@ import ( "math/rand" "strings" "time" + "unicode/utf8" "github.com/google/go-cmp/cmp/internal/flags" ) var randBool = rand.New(rand.NewSource(time.Now().Unix())).Intn(2) == 0 +const maxColumnLength = 80 + type indentMode int func (n indentMode) appendIndent(b []byte, d diffMode) []byte { @@ -91,21 +94,22 @@ type textNode interface { // textWrap is a wrapper that concatenates a prefix and/or a suffix // to the underlying node. type textWrap struct { - Prefix string // e.g., "bytes.Buffer{" - Value textNode // textWrap | textList | textLine - Suffix string // e.g., "}" + Prefix string // e.g., "bytes.Buffer{" + Value textNode // textWrap | textList | textLine + Suffix string // e.g., "}" + Metadata interface{} // arbitrary metadata; has no effect on formatting } -func (s textWrap) Len() int { +func (s *textWrap) Len() int { return len(s.Prefix) + s.Value.Len() + len(s.Suffix) } -func (s1 textWrap) Equal(s2 textNode) bool { - if s2, ok := s2.(textWrap); ok { +func (s1 *textWrap) Equal(s2 textNode) bool { + if s2, ok := s2.(*textWrap); ok { return s1.Prefix == s2.Prefix && s1.Value.Equal(s2.Value) && s1.Suffix == s2.Suffix } return false } -func (s textWrap) String() string { +func (s *textWrap) String() string { var d diffMode var n indentMode _, s2 := s.formatCompactTo(nil, d) @@ -114,7 +118,7 @@ func (s textWrap) String() string { b = append(b, '\n') // Trailing newline return string(b) } -func (s textWrap) formatCompactTo(b []byte, d diffMode) ([]byte, textNode) { +func (s *textWrap) formatCompactTo(b []byte, d diffMode) ([]byte, textNode) { n0 := len(b) // Original buffer length b = append(b, s.Prefix...) b, s.Value = s.Value.formatCompactTo(b, d) @@ -124,7 +128,7 @@ func (s textWrap) formatCompactTo(b []byte, d diffMode) ([]byte, textNode) { } return b, s } -func (s textWrap) formatExpandedTo(b []byte, d diffMode, n indentMode) []byte { +func (s *textWrap) formatExpandedTo(b []byte, d diffMode, n indentMode) []byte { b = append(b, s.Prefix...) b = s.Value.formatExpandedTo(b, d, n) b = append(b, s.Suffix...) @@ -136,22 +140,23 @@ func (s textWrap) formatExpandedTo(b []byte, d diffMode, n indentMode) []byte { // of the textList.formatCompactTo method. type textList []textRecord type textRecord struct { - Diff diffMode // e.g., 0 or '-' or '+' - Key string // e.g., "MyField" - Value textNode // textWrap | textLine - Comment fmt.Stringer // e.g., "6 identical fields" + Diff diffMode // e.g., 0 or '-' or '+' + Key string // e.g., "MyField" + Value textNode // textWrap | textLine + ElideComma bool // avoid trailing comma + Comment fmt.Stringer // e.g., "6 identical fields" } // AppendEllipsis appends a new ellipsis node to the list if none already // exists at the end. If cs is non-zero it coalesces the statistics with the // previous diffStats. func (s *textList) AppendEllipsis(ds diffStats) { - hasStats := ds != diffStats{} + hasStats := !ds.IsZero() if len(*s) == 0 || !(*s)[len(*s)-1].Value.Equal(textEllipsis) { if hasStats { - *s = append(*s, textRecord{Value: textEllipsis, Comment: ds}) + *s = append(*s, textRecord{Value: textEllipsis, ElideComma: true, Comment: ds}) } else { - *s = append(*s, textRecord{Value: textEllipsis}) + *s = append(*s, textRecord{Value: textEllipsis, ElideComma: true}) } return } @@ -191,7 +196,7 @@ func (s1 textList) Equal(s2 textNode) bool { } func (s textList) String() string { - return textWrap{"{", s, "}"}.String() + return (&textWrap{Prefix: "{", Value: s, Suffix: "}"}).String() } func (s textList) formatCompactTo(b []byte, d diffMode) ([]byte, textNode) { @@ -221,7 +226,7 @@ func (s textList) formatCompactTo(b []byte, d diffMode) ([]byte, textNode) { } // Force multi-lined output when printing a removed/inserted node that // is sufficiently long. - if (d == diffInserted || d == diffRemoved) && len(b[n0:]) > 80 { + if (d == diffInserted || d == diffRemoved) && len(b[n0:]) > maxColumnLength { multiLine = true } if !multiLine { @@ -236,16 +241,50 @@ func (s textList) formatExpandedTo(b []byte, d diffMode, n indentMode) []byte { _, isLine := r.Value.(textLine) return r.Key == "" || !isLine }, - func(r textRecord) int { return len(r.Key) }, + func(r textRecord) int { return utf8.RuneCountInString(r.Key) }, ) alignValueLens := s.alignLens( func(r textRecord) bool { _, isLine := r.Value.(textLine) return !isLine || r.Value.Equal(textEllipsis) || r.Comment == nil }, - func(r textRecord) int { return len(r.Value.(textLine)) }, + func(r textRecord) int { return utf8.RuneCount(r.Value.(textLine)) }, ) + // Format lists of simple lists in a batched form. + // If the list is sequence of only textLine values, + // then batch multiple values on a single line. + var isSimple bool + for _, r := range s { + _, isLine := r.Value.(textLine) + isSimple = r.Diff == 0 && r.Key == "" && isLine && r.Comment == nil + if !isSimple { + break + } + } + if isSimple { + n++ + var batch []byte + emitBatch := func() { + if len(batch) > 0 { + b = n.appendIndent(append(b, '\n'), d) + b = append(b, bytes.TrimRight(batch, " ")...) + batch = batch[:0] + } + } + for _, r := range s { + line := r.Value.(textLine) + if len(batch)+len(line)+len(", ") > maxColumnLength { + emitBatch() + } + batch = append(batch, line...) + batch = append(batch, ", "...) + } + emitBatch() + n-- + return n.appendIndent(append(b, '\n'), d) + } + // Format the list as a multi-lined output. n++ for i, r := range s { @@ -256,7 +295,7 @@ func (s textList) formatExpandedTo(b []byte, d diffMode, n indentMode) []byte { b = alignKeyLens[i].appendChar(b, ' ') b = r.Value.formatExpandedTo(b, d|r.Diff, n) - if !r.Value.Equal(textEllipsis) { + if !r.ElideComma { b = append(b, ',') } b = alignValueLens[i].appendChar(b, ' ') @@ -332,6 +371,11 @@ type diffStats struct { NumModified int } +func (s diffStats) IsZero() bool { + s.Name = "" + return s == diffStats{} +} + func (s diffStats) NumDiff() int { return s.NumRemoved + s.NumInserted + s.NumModified } diff --git a/vendor/github.com/google/uuid/go.mod b/vendor/github.com/google/uuid/go.mod new file mode 100644 index 000000000..fc84cd79d --- /dev/null +++ b/vendor/github.com/google/uuid/go.mod @@ -0,0 +1 @@ +module github.com/google/uuid diff --git a/vendor/github.com/google/uuid/node.go b/vendor/github.com/google/uuid/node.go index 3e4e90dc4..d651a2b06 100644 --- a/vendor/github.com/google/uuid/node.go +++ b/vendor/github.com/google/uuid/node.go @@ -48,6 +48,7 @@ func setNodeInterface(name string) bool { // does not specify a specific interface generate a random Node ID // (section 4.1.6) if name == "" { + ifname = "random" randomBits(nodeID[:]) return true } diff --git a/vendor/github.com/google/uuid/uuid.go b/vendor/github.com/google/uuid/uuid.go index 7f3643fe9..524404cc5 100644 --- a/vendor/github.com/google/uuid/uuid.go +++ b/vendor/github.com/google/uuid/uuid.go @@ -1,4 +1,4 @@ -// Copyright 2016 Google Inc. All rights reserved. +// Copyright 2018 Google Inc. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. @@ -35,20 +35,43 @@ const ( var rander = rand.Reader // random function -// Parse decodes s into a UUID or returns an error. Both the UUID form of -// xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx and -// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx are decoded. +// Parse decodes s into a UUID or returns an error. Both the standard UUID +// forms of xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx and +// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx are decoded as well as the +// Microsoft encoding {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} and the raw hex +// encoding: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. func Parse(s string) (UUID, error) { var uuid UUID - if len(s) != 36 { - if len(s) != 36+9 { - return uuid, fmt.Errorf("invalid UUID length: %d", len(s)) - } + switch len(s) { + // xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + case 36: + + // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + case 36 + 9: if strings.ToLower(s[:9]) != "urn:uuid:" { return uuid, fmt.Errorf("invalid urn prefix: %q", s[:9]) } s = s[9:] + + // {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} + case 36 + 2: + s = s[1:] + + // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + case 32: + var ok bool + for i := range uuid { + uuid[i], ok = xtob(s[i*2], s[i*2+1]) + if !ok { + return uuid, errors.New("invalid UUID format") + } + } + return uuid, nil + default: + return uuid, fmt.Errorf("invalid UUID length: %d", len(s)) } + // s is now at least 36 bytes long + // it must be of the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx if s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' { return uuid, errors.New("invalid UUID format") } @@ -70,15 +93,29 @@ func Parse(s string) (UUID, error) { // ParseBytes is like Parse, except it parses a byte slice instead of a string. func ParseBytes(b []byte) (UUID, error) { var uuid UUID - if len(b) != 36 { - if len(b) != 36+9 { - return uuid, fmt.Errorf("invalid UUID length: %d", len(b)) - } + switch len(b) { + case 36: // xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + case 36 + 9: // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx if !bytes.Equal(bytes.ToLower(b[:9]), []byte("urn:uuid:")) { return uuid, fmt.Errorf("invalid urn prefix: %q", b[:9]) } b = b[9:] + case 36 + 2: // {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} + b = b[1:] + case 32: // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + var ok bool + for i := 0; i < 32; i += 2 { + uuid[i/2], ok = xtob(b[i], b[i+1]) + if !ok { + return uuid, errors.New("invalid UUID format") + } + } + return uuid, nil + default: + return uuid, fmt.Errorf("invalid UUID length: %d", len(b)) } + // s is now at least 36 bytes long + // it must be of the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx if b[8] != '-' || b[13] != '-' || b[18] != '-' || b[23] != '-' { return uuid, errors.New("invalid UUID format") } @@ -97,6 +134,16 @@ func ParseBytes(b []byte) (UUID, error) { return uuid, nil } +// MustParse is like Parse but panics if the string cannot be parsed. +// It simplifies safe initialization of global variables holding compiled UUIDs. +func MustParse(s string) UUID { + uuid, err := Parse(s) + if err != nil { + panic(`uuid: Parse(` + s + `): ` + err.Error()) + } + return uuid +} + // FromBytes creates a new UUID from a byte slice. Returns an error if the slice // does not have a length of 16. The bytes are copied from the slice. func FromBytes(b []byte) (uuid UUID, err error) { @@ -130,7 +177,7 @@ func (uuid UUID) URN() string { } func encodeHex(dst []byte, uuid UUID) { - hex.Encode(dst[:], uuid[:4]) + hex.Encode(dst, uuid[:4]) dst[8] = '-' hex.Encode(dst[9:13], uuid[4:6]) dst[13] = '-' diff --git a/vendor/github.com/googleapis/gax-go/.gitignore b/vendor/github.com/googleapis/gax-go/.gitignore deleted file mode 100644 index 289bf1eb7..000000000 --- a/vendor/github.com/googleapis/gax-go/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.cover diff --git a/vendor/github.com/googleapis/gax-go/.travis.yml b/vendor/github.com/googleapis/gax-go/.travis.yml deleted file mode 100644 index 6db28b6c6..000000000 --- a/vendor/github.com/googleapis/gax-go/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -sudo: false -language: go -go: - - 1.6 - - 1.7 -before_install: - - go get golang.org/x/tools/cmd/cover - - go get golang.org/x/tools/cmd/goimports -script: - - gofmt -l . - - goimports -l . - - go tool vet . - - go test -coverprofile=coverage.txt -covermode=atomic -after_success: - - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/googleapis/gax-go/CONTRIBUTING.md b/vendor/github.com/googleapis/gax-go/CONTRIBUTING.md deleted file mode 100644 index 2827b7d3f..000000000 --- a/vendor/github.com/googleapis/gax-go/CONTRIBUTING.md +++ /dev/null @@ -1,27 +0,0 @@ -Want to contribute? Great! First, read this page (including the small print at the end). - -### Before you contribute -Before we can use your code, you must sign the -[Google Individual Contributor License Agreement] -(https://cla.developers.google.com/about/google-individual) -(CLA), which you can do online. The CLA is necessary mainly because you own the -copyright to your changes, even after your contribution becomes part of our -codebase, so we need your permission to use and distribute your code. We also -need to be sure of various other things—for instance that you'll tell us if you -know that your code infringes on other people's patents. You don't have to sign -the CLA until after you've submitted your code for review and a member has -approved it, but you must do it before we can put your code into our codebase. -Before you start working on a larger contribution, you should get in touch with -us first through the issue tracker with your idea so that we can help out and -possibly guide you. Coordinating up front makes it much easier to avoid -frustration later on. - -### Code reviews -All submissions, including submissions by project members, require review. We -use Github pull requests for this purpose. - -### The small print -Contributions made by corporations are covered by a different agreement than -the one above, the -[Software Grant and Corporate Contributor License Agreement] -(https://cla.developers.google.com/about/google-corporate). diff --git a/vendor/github.com/googleapis/gax-go/README.md b/vendor/github.com/googleapis/gax-go/README.md deleted file mode 100644 index 3cedd5be9..000000000 --- a/vendor/github.com/googleapis/gax-go/README.md +++ /dev/null @@ -1,24 +0,0 @@ -Google API Extensions for Go -============================ - -[![Build Status](https://travis-ci.org/googleapis/gax-go.svg?branch=master)](https://travis-ci.org/googleapis/gax-go) -[![Code Coverage](https://img.shields.io/codecov/c/github/googleapis/gax-go.svg)](https://codecov.io/github/googleapis/gax-go) - -Google API Extensions for Go (gax-go) is a set of modules which aids the -development of APIs for clients and servers based on `gRPC` and Google API -conventions. - -Application code will rarely need to use this library directly, -but the code generated automatically from API definition files can use it -to simplify code generation and to provide more convenient and idiomatic API surface. - -**This project is currently experimental and not supported.** - -Go Versions -=========== -This library requires Go 1.6 or above. - -License -======= -BSD - please see [LICENSE](https://github.com/googleapis/gax-go/blob/master/LICENSE) -for more information. diff --git a/vendor/github.com/googleapis/gax-go/header.go b/vendor/github.com/googleapis/gax-go/header.go deleted file mode 100644 index d81455ecc..000000000 --- a/vendor/github.com/googleapis/gax-go/header.go +++ /dev/null @@ -1,24 +0,0 @@ -package gax - -import "bytes" - -// XGoogHeader is for use by the Google Cloud Libraries only. -// -// XGoogHeader formats key-value pairs. -// The resulting string is suitable for x-goog-api-client header. -func XGoogHeader(keyval ...string) string { - if len(keyval) == 0 { - return "" - } - if len(keyval)%2 != 0 { - panic("gax.Header: odd argument count") - } - var buf bytes.Buffer - for i := 0; i < len(keyval); i += 2 { - buf.WriteByte(' ') - buf.WriteString(keyval[i]) - buf.WriteByte('/') - buf.WriteString(keyval[i+1]) - } - return buf.String()[1:] -} diff --git a/vendor/github.com/googleapis/gax-go/LICENSE b/vendor/github.com/googleapis/gax-go/v2/LICENSE similarity index 100% rename from vendor/github.com/googleapis/gax-go/LICENSE rename to vendor/github.com/googleapis/gax-go/v2/LICENSE diff --git a/vendor/github.com/googleapis/gax-go/call_option.go b/vendor/github.com/googleapis/gax-go/v2/call_option.go similarity index 90% rename from vendor/github.com/googleapis/gax-go/call_option.go rename to vendor/github.com/googleapis/gax-go/v2/call_option.go index 7b621643e..b1d53dd19 100644 --- a/vendor/github.com/googleapis/gax-go/call_option.go +++ b/vendor/github.com/googleapis/gax-go/v2/call_option.go @@ -113,6 +113,7 @@ type Backoff struct { cur time.Duration } +// Pause returns the next time.Duration that the caller should use to backoff. func (bo *Backoff) Pause() time.Duration { if bo.Initial == 0 { bo.Initial = time.Second @@ -126,10 +127,11 @@ func (bo *Backoff) Pause() time.Duration { if bo.Multiplier < 1 { bo.Multiplier = 2 } - // Select a duration between zero and the current max. It might seem counterintuitive to - // have so much jitter, but https://www.awsarchitectureblog.com/2015/03/backoff.html - // argues that that is the best strategy. - d := time.Duration(rand.Int63n(int64(bo.cur))) + // Select a duration between 1ns and the current max. It might seem + // counterintuitive to have so much jitter, but + // https://www.awsarchitectureblog.com/2015/03/backoff.html argues that + // that is the best strategy. + d := time.Duration(1 + rand.Int63n(int64(bo.cur))) bo.cur = time.Duration(float64(bo.cur) * bo.Multiplier) if bo.cur > bo.Max { bo.cur = bo.Max @@ -143,10 +145,12 @@ func (o grpcOpt) Resolve(s *CallSettings) { s.GRPC = o } +// WithGRPCOptions allows passing gRPC call options during client creation. func WithGRPCOptions(opt ...grpc.CallOption) CallOption { return grpcOpt(append([]grpc.CallOption(nil), opt...)) } +// CallSettings allow fine-grained control over how calls are made. type CallSettings struct { // Retry returns a Retryer to be used to control retry logic of a method call. // If Retry is nil or the returned Retryer is nil, the call will not be retried. diff --git a/vendor/github.com/googleapis/gax-go/gax.go b/vendor/github.com/googleapis/gax-go/v2/gax.go similarity index 95% rename from vendor/github.com/googleapis/gax-go/gax.go rename to vendor/github.com/googleapis/gax-go/v2/gax.go index 5ebedff0d..8040dcb0c 100644 --- a/vendor/github.com/googleapis/gax-go/gax.go +++ b/vendor/github.com/googleapis/gax-go/v2/gax.go @@ -33,8 +33,7 @@ // Application code will rarely need to use this library directly. // However, code generated automatically from API definition files can use it // to simplify code generation and to provide more convenient and idiomatic API surfaces. -// -// This project is currently experimental and not supported. package gax -const Version = "0.1.0" +// Version specifies the gax-go version being used. +const Version = "2.0.3" diff --git a/vendor/github.com/googleapis/gax-go/v2/go.mod b/vendor/github.com/googleapis/gax-go/v2/go.mod new file mode 100644 index 000000000..0c91100b9 --- /dev/null +++ b/vendor/github.com/googleapis/gax-go/v2/go.mod @@ -0,0 +1,5 @@ +module github.com/googleapis/gax-go/v2 + +go 1.12 + +require google.golang.org/grpc v1.19.0 diff --git a/vendor/github.com/googleapis/gax-go/v2/go.sum b/vendor/github.com/googleapis/gax-go/v2/go.sum new file mode 100644 index 000000000..7fa23ecf9 --- /dev/null +++ b/vendor/github.com/googleapis/gax-go/v2/go.sum @@ -0,0 +1,25 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d h1:g9qWBGx4puODJTMVyoPrpoxPFgVGd+z1DZwjfRu4d0I= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522 h1:Ve1ORMCxvRmSXBwJK+t3Oy+V2vRW2OetUQBq4rJIkZE= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/grpc v1.19.0 h1:cfg4PD8YEdSFnm7qLV4++93WcmhH2nIUhMjhdCvl3j8= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/vendor/github.com/googleapis/gax-go/v2/header.go b/vendor/github.com/googleapis/gax-go/v2/header.go new file mode 100644 index 000000000..139371a0b --- /dev/null +++ b/vendor/github.com/googleapis/gax-go/v2/header.go @@ -0,0 +1,53 @@ +// Copyright 2018, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package gax + +import "bytes" + +// XGoogHeader is for use by the Google Cloud Libraries only. +// +// XGoogHeader formats key-value pairs. +// The resulting string is suitable for x-goog-api-client header. +func XGoogHeader(keyval ...string) string { + if len(keyval) == 0 { + return "" + } + if len(keyval)%2 != 0 { + panic("gax.Header: odd argument count") + } + var buf bytes.Buffer + for i := 0; i < len(keyval); i += 2 { + buf.WriteByte(' ') + buf.WriteString(keyval[i]) + buf.WriteByte('/') + buf.WriteString(keyval[i+1]) + } + return buf.String()[1:] +} diff --git a/vendor/github.com/googleapis/gax-go/invoke.go b/vendor/github.com/googleapis/gax-go/v2/invoke.go similarity index 83% rename from vendor/github.com/googleapis/gax-go/invoke.go rename to vendor/github.com/googleapis/gax-go/v2/invoke.go index 86049d826..fe31dd004 100644 --- a/vendor/github.com/googleapis/gax-go/invoke.go +++ b/vendor/github.com/googleapis/gax-go/v2/invoke.go @@ -30,12 +30,12 @@ package gax import ( + "context" + "strings" "time" - - "golang.org/x/net/context" ) -// A user defined call stub. +// APICall is a user defined call stub. type APICall func(context.Context, CallSettings) error // Invoke calls the given APICall, @@ -74,6 +74,15 @@ func invoke(ctx context.Context, call APICall, settings CallSettings, sp sleeper if settings.Retry == nil { return err } + // Never retry permanent certificate errors. (e.x. if ca-certificates + // are not installed). We should only make very few, targeted + // exceptions: many (other) status=Unavailable should be retried, such + // as if there's a network hiccup, or the internet goes out for a + // minute. This is also why here we are doing string parsing instead of + // simply making Unavailable a non-retried code elsewhere. + if strings.Contains(err.Error(), "x509: certificate signed by unknown authority") { + return err + } if retryer == nil { if r := settings.Retry(); r != nil { retryer = r diff --git a/vendor/github.com/hhatto/gorst/parser.leg b/vendor/github.com/hhatto/gorst/parser.leg index a45fddb3a..a8c4bced5 100644 --- a/vendor/github.com/hhatto/gorst/parser.leg +++ b/vendor/github.com/hhatto/gorst/parser.leg @@ -759,14 +759,6 @@ UnquotedReference = NonindentSpace $$.key = REFERENCE } -UrlReference = ( NonindentSpace | Sp ) - ":target:" Sp s:RefSrc BlankLine - { - $$ = p.mkLink(p.mkString(yytext), yytext, "") - s = nil - $$.key = REFERENCE - } - UnquotedLinkSource = < ( ( !'_' !':' !'`' ( Nonspacechar ) )+ )* > { $$ = p.mkString(yytext) } diff --git a/vendor/github.com/hhatto/gorst/parser.leg.go b/vendor/github.com/hhatto/gorst/parser.leg.go index 9ad2893fb..61622d394 100644 --- a/vendor/github.com/hhatto/gorst/parser.leg.go +++ b/vendor/github.com/hhatto/gorst/parser.leg.go @@ -305,7 +305,6 @@ const ( ruleReference ruleQuotedReference ruleUnquotedReference - ruleUrlReference ruleUnquotedLinkSource ruleRefSource ruleQuotedRefSource @@ -376,7 +375,7 @@ type yyParser struct { state Buffer string Min, Max int - rules [252]func() bool + rules [251]func() bool commit func(int) bool ResetBuffer func(string) string } @@ -536,29 +535,29 @@ func (p *yyParser) Init() { g = nil l = nil + yyval[yyp-3] = t yyval[yyp-4] = g yyval[yyp-1] = l yyval[yyp-2] = a - yyval[yyp-3] = t }, /* 10 CodeBlock */ func(yytext string, _ int) { - l := yyval[yyp-1] - a := yyval[yyp-2] + a := yyval[yyp-1] + l := yyval[yyp-2] a = cons(yy, a) - yyval[yyp-1] = l - yyval[yyp-2] = a + yyval[yyp-2] = l + yyval[yyp-1] = a }, /* 11 CodeBlock */ func(yytext string, _ int) { - l := yyval[yyp-1] - a := yyval[yyp-2] + l := yyval[yyp-2] + a := yyval[yyp-1] yy = p.mkCodeBlock(a, l.contents.str) l = nil - yyval[yyp-1] = l - yyval[yyp-2] = a + yyval[yyp-2] = l + yyval[yyp-1] = a }, /* 12 DoctestBlock */ func(yytext string, _ int) { @@ -907,8 +906,8 @@ func (p *yyParser) Init() { a := yyval[yyp-1] c := yyval[yyp-2] a = cons(yy, a) - yyval[yyp-1] = a yyval[yyp-2] = c + yyval[yyp-1] = a }, /* 62 Inlines */ func(yytext string, _ int) { @@ -1005,8 +1004,8 @@ func (p *yyParser) Init() { a := yyval[yyp-1] b := yyval[yyp-2] a = cons(b, a) - yyval[yyp-2] = b yyval[yyp-1] = a + yyval[yyp-2] = b }, /* 79 Emph */ func(yytext string, _ int) { @@ -1018,19 +1017,19 @@ func (p *yyParser) Init() { }, /* 80 Strong */ func(yytext string, _ int) { - a := yyval[yyp-1] - b := yyval[yyp-2] + b := yyval[yyp-1] + a := yyval[yyp-2] a = cons(b, a) - yyval[yyp-1] = a - yyval[yyp-2] = b + yyval[yyp-2] = a + yyval[yyp-1] = b }, /* 81 Strong */ func(yytext string, _ int) { - a := yyval[yyp-1] - b := yyval[yyp-2] + a := yyval[yyp-2] + b := yyval[yyp-1] yy = p.mkList(STRONG, a) - yyval[yyp-1] = a - yyval[yyp-2] = b + yyval[yyp-2] = a + yyval[yyp-1] = b }, /* 82 Strike */ func(yytext string, _ int) { @@ -1079,18 +1078,18 @@ func (p *yyParser) Init() { }, /* 86 ExplicitLink */ func(yytext string, _ int) { - t := yyval[yyp-1] - l := yyval[yyp-2] - s := yyval[yyp-3] + l := yyval[yyp-1] + s := yyval[yyp-2] + t := yyval[yyp-3] yy = p.mkLink(l.children, s.contents.str, t.contents.str) s = nil t = nil l = nil - yyval[yyp-2] = l - yyval[yyp-3] = s - yyval[yyp-1] = t + yyval[yyp-1] = l + yyval[yyp-2] = s + yyval[yyp-3] = t }, /* 87 Source */ func(yytext string, _ int) { @@ -1122,16 +1121,16 @@ func (p *yyParser) Init() { }, /* 92 QuotedReference */ func(yytext string, _ int) { - c := yyval[yyp-1] - s := yyval[yyp-2] + s := yyval[yyp-1] + c := yyval[yyp-2] yy = p.mkLink(p.mkString(c.contents.str), s.contents.str, "") s = nil c = nil yy.key = REFERENCE - yyval[yyp-1] = c - yyval[yyp-2] = s + yyval[yyp-2] = c + yyval[yyp-1] = s }, /* 93 UnquotedReference */ func(yytext string, _ int) { @@ -1146,39 +1145,29 @@ func (p *yyParser) Init() { yyval[yyp-1] = c yyval[yyp-2] = s }, - /* 94 UrlReference */ - func(yytext string, _ int) { - s := yyval[yyp-1] - - yy = p.mkLink(p.mkString(yytext), yytext, "") - s = nil - yy.key = REFERENCE - - yyval[yyp-1] = s - }, - /* 95 UnquotedLinkSource */ + /* 94 UnquotedLinkSource */ func(yytext string, _ int) { yy = p.mkString(yytext) }, - /* 96 RefSource */ + /* 95 RefSource */ func(yytext string, _ int) { yy = p.mkString(yytext) }, - /* 97 QuotedRefSource */ + /* 96 QuotedRefSource */ func(yytext string, _ int) { yy = p.mkString(yytext) }, - /* 98 EmbeddedRefSource */ + /* 97 EmbeddedRefSource */ func(yytext string, _ int) { yy = p.mkString(yytext) }, - /* 99 Label */ + /* 98 Label */ func(yytext string, _ int) { a := yyval[yyp-1] a = cons(yy, a) yyval[yyp-1] = a }, - /* 100 Label */ + /* 99 Label */ func(yytext string, _ int) { a := yyval[yyp-1] @@ -1186,12 +1175,12 @@ func (p *yyParser) Init() { yyval[yyp-1] = a }, - /* 101 RefSrc */ + /* 100 RefSrc */ func(yytext string, _ int) { yy = p.mkString(yytext) yy.key = HTML }, - /* 102 References */ + /* 101 References */ func(yytext string, _ int) { a := yyval[yyp-1] b := yyval[yyp-2] @@ -1199,7 +1188,7 @@ func (p *yyParser) Init() { yyval[yyp-1] = a yyval[yyp-2] = b }, - /* 103 References */ + /* 102 References */ func(yytext string, _ int) { a := yyval[yyp-1] b := yyval[yyp-2] @@ -1209,12 +1198,12 @@ func (p *yyParser) Init() { yyval[yyp-1] = a yyval[yyp-2] = b }, - /* 104 Code */ + /* 103 Code */ func(yytext string, _ int) { yy = p.mkString(yytext) yy.key = CODE }, - /* 105 RawHtml */ + /* 104 RawHtml */ func(yytext string, _ int) { if p.extension.FilterHTML { yy = p.mkList(LIST, nil) @@ -1224,43 +1213,43 @@ func (p *yyParser) Init() { } }, - /* 106 StartList */ + /* 105 StartList */ func(yytext string, _ int) { yy = nil }, - /* 107 DoctestLine */ + /* 106 DoctestLine */ func(yytext string, _ int) { yy = p.mkString(">>> " + yytext) }, - /* 108 Line */ + /* 107 Line */ func(yytext string, _ int) { yy = p.mkString(yytext) }, - /* 109 Apostrophe */ + /* 108 Apostrophe */ func(yytext string, _ int) { yy = p.mkElem(APOSTROPHE) }, - /* 110 Ellipsis */ + /* 109 Ellipsis */ func(yytext string, _ int) { yy = p.mkElem(ELLIPSIS) }, - /* 111 EnDash */ + /* 110 EnDash */ func(yytext string, _ int) { yy = p.mkElem(ENDASH) }, - /* 112 EmDash */ + /* 111 EmDash */ func(yytext string, _ int) { yy = p.mkElem(EMDASH) }, - /* 113 SingleQuoted */ + /* 112 SingleQuoted */ func(yytext string, _ int) { a := yyval[yyp-1] b := yyval[yyp-2] a = cons(b, a) - yyval[yyp-1] = a yyval[yyp-2] = b + yyval[yyp-1] = a }, - /* 114 SingleQuoted */ + /* 113 SingleQuoted */ func(yytext string, _ int) { a := yyval[yyp-1] b := yyval[yyp-2] @@ -1268,23 +1257,23 @@ func (p *yyParser) Init() { yyval[yyp-1] = a yyval[yyp-2] = b }, - /* 115 DoubleQuoted */ + /* 114 DoubleQuoted */ func(yytext string, _ int) { - b := yyval[yyp-1] - a := yyval[yyp-2] + a := yyval[yyp-1] + b := yyval[yyp-2] a = cons(b, a) - yyval[yyp-2] = a - yyval[yyp-1] = b + yyval[yyp-1] = a + yyval[yyp-2] = b }, - /* 116 DoubleQuoted */ + /* 115 DoubleQuoted */ func(yytext string, _ int) { - a := yyval[yyp-2] - b := yyval[yyp-1] + b := yyval[yyp-2] + a := yyval[yyp-1] yy = p.mkList(DOUBLEQUOTED, a) - yyval[yyp-2] = a - yyval[yyp-1] = b + yyval[yyp-1] = a + yyval[yyp-2] = b }, - /* 117 NoteReference */ + /* 116 NoteReference */ func(yytext string, _ int) { ref := yyval[yyp-1] @@ -1299,43 +1288,43 @@ func (p *yyParser) Init() { yyval[yyp-1] = ref }, - /* 118 RawNoteReference */ + /* 117 RawNoteReference */ func(yytext string, _ int) { yy = p.mkString(yytext) }, - /* 119 Note */ + /* 118 Note */ func(yytext string, _ int) { - ref := yyval[yyp-1] - a := yyval[yyp-2] + a := yyval[yyp-1] + ref := yyval[yyp-2] a = cons(yy, a) - yyval[yyp-1] = ref - yyval[yyp-2] = a + yyval[yyp-2] = ref + yyval[yyp-1] = a }, - /* 120 Note */ + /* 119 Note */ func(yytext string, _ int) { - ref := yyval[yyp-1] - a := yyval[yyp-2] + ref := yyval[yyp-2] + a := yyval[yyp-1] a = cons(yy, a) - yyval[yyp-2] = a - yyval[yyp-1] = ref + yyval[yyp-2] = ref + yyval[yyp-1] = a }, - /* 121 Note */ + /* 120 Note */ func(yytext string, _ int) { - ref := yyval[yyp-1] - a := yyval[yyp-2] + ref := yyval[yyp-2] + a := yyval[yyp-1] yy = p.mkList(NOTE, a) yy.contents.str = ref.contents.str - yyval[yyp-1] = ref - yyval[yyp-2] = a + yyval[yyp-2] = ref + yyval[yyp-1] = a }, - /* 122 Footnote */ + /* 121 Footnote */ func(yytext string, _ int) { a := yyval[yyp-1] a = cons(yy, a) yyval[yyp-1] = a }, - /* 123 Footnote */ + /* 122 Footnote */ func(yytext string, _ int) { a := yyval[yyp-1] @@ -1345,7 +1334,7 @@ func (p *yyParser) Init() { yyval[yyp-1] = a }, - /* 124 Notes */ + /* 123 Notes */ func(yytext string, _ int) { a := yyval[yyp-1] b := yyval[yyp-2] @@ -1353,7 +1342,7 @@ func (p *yyParser) Init() { yyval[yyp-1] = a yyval[yyp-2] = b }, - /* 125 Notes */ + /* 124 Notes */ func(yytext string, _ int) { a := yyval[yyp-1] b := yyval[yyp-2] @@ -1361,19 +1350,19 @@ func (p *yyParser) Init() { yyval[yyp-1] = a yyval[yyp-2] = b }, - /* 126 RawNoteBlock */ + /* 125 RawNoteBlock */ func(yytext string, _ int) { a := yyval[yyp-1] a = cons(yy, a) yyval[yyp-1] = a }, - /* 127 RawNoteBlock */ + /* 126 RawNoteBlock */ func(yytext string, _ int) { a := yyval[yyp-1] a = cons(p.mkString(yytext), a) yyval[yyp-1] = a }, - /* 128 RawNoteBlock */ + /* 127 RawNoteBlock */ func(yytext string, _ int) { a := yyval[yyp-1] yy = p.mkStringFromList(a, true) @@ -1382,25 +1371,25 @@ func (p *yyParser) Init() { yyval[yyp-1] = a }, - /* 129 DefinitionList */ + /* 128 DefinitionList */ func(yytext string, _ int) { a := yyval[yyp-1] a = cons(yy, a) yyval[yyp-1] = a }, - /* 130 DefinitionList */ + /* 129 DefinitionList */ func(yytext string, _ int) { a := yyval[yyp-1] yy = p.mkList(DEFINITIONLIST, a) yyval[yyp-1] = a }, - /* 131 Definition */ + /* 130 Definition */ func(yytext string, _ int) { a := yyval[yyp-1] a = cons(yy, a) yyval[yyp-1] = a }, - /* 132 Definition */ + /* 131 Definition */ func(yytext string, _ int) { a := yyval[yyp-1] @@ -1411,19 +1400,19 @@ func (p *yyParser) Init() { yyval[yyp-1] = a }, - /* 133 Definition */ + /* 132 Definition */ func(yytext string, _ int) { a := yyval[yyp-1] yy = p.mkList(LIST, a) yyval[yyp-1] = a }, - /* 134 DListTitle */ + /* 133 DListTitle */ func(yytext string, _ int) { a := yyval[yyp-1] a = cons(yy, a) yyval[yyp-1] = a }, - /* 135 DListTitle */ + /* 134 DListTitle */ func(yytext string, _ int) { a := yyval[yyp-1] yy = p.mkList(LIST, a) @@ -1451,7 +1440,7 @@ func (p *yyParser) Init() { }, } const ( - yyPush = 136 + iota + yyPush = 135 + iota yyPop yySet ) @@ -2087,7 +2076,7 @@ func (p *yyParser) Init() { if !p.rules[ruleSource]() { goto ko } - doarg(yySet, -1) + doarg(yySet, -2) if !p.rules[ruleBlankLine]() { goto ko } @@ -2097,7 +2086,7 @@ func (p *yyParser) Init() { if !p.rules[ruleStartList]() { goto ko } - doarg(yySet, -2) + doarg(yySet, -1) if !p.rules[ruleVerbatimChunk]() { goto ko } @@ -9379,7 +9368,7 @@ func (p *yyParser) Init() { if !p.rules[ruleStartList]() { goto ko } - doarg(yySet, -1) + doarg(yySet, -2) if !matchString("**") { goto ok4 } @@ -9388,7 +9377,7 @@ func (p *yyParser) Init() { if !p.rules[ruleInline]() { goto ko } - doarg(yySet, -2) + doarg(yySet, -1) do(80) loop: { @@ -9401,7 +9390,7 @@ func (p *yyParser) Init() { if !p.rules[ruleInline]() { goto out } - doarg(yySet, -2) + doarg(yySet, -1) do(80) goto loop out: @@ -9608,7 +9597,7 @@ func (p *yyParser) Init() { if !p.rules[ruleLabel]() { goto ko } - doarg(yySet, -2) + doarg(yySet, -1) if !matchChar('(') { goto ko } @@ -9618,14 +9607,14 @@ func (p *yyParser) Init() { if !p.rules[ruleSource]() { goto ko } - doarg(yySet, -3) + doarg(yySet, -2) if !p.rules[ruleSpnl]() { goto ko } if !p.rules[ruleTitle]() { goto ko } - doarg(yySet, -1) + doarg(yySet, -3) if !p.rules[ruleSp]() { goto ko } @@ -10114,7 +10103,7 @@ func (p *yyParser) Init() { if !p.rules[ruleQuotedRefSource]() { goto ko } - doarg(yySet, -1) + doarg(yySet, -2) if !matchString("``:") { goto ok2 } @@ -10126,7 +10115,7 @@ func (p *yyParser) Init() { if !p.rules[ruleRefSrc]() { goto ko } - doarg(yySet, -2) + doarg(yySet, -1) if !p.rules[ruleBlankLine]() { goto ko } @@ -10175,45 +10164,7 @@ func (p *yyParser) Init() { position, thunkPosition = position0, thunkPosition0 return }, - /* 187 UrlReference <- ((NonindentSpace / Sp) ':target:' Sp RefSrc BlankLine { - yy = p.mkLink(p.mkString(yytext), yytext, "") - s = nil - yy.key = REFERENCE - }) */ - func() (match bool) { - position0, thunkPosition0 := position, thunkPosition - doarg(yyPush, 1) - if !p.rules[ruleNonindentSpace]() { - goto nextAlt - } - goto ok - nextAlt: - if !p.rules[ruleSp]() { - goto ko - } - ok: - if !matchString(":target:") { - goto ko - } - if !p.rules[ruleSp]() { - goto ko - } - if !p.rules[ruleRefSrc]() { - goto ko - } - doarg(yySet, -1) - if !p.rules[ruleBlankLine]() { - goto ko - } - do(94) - doarg(yyPop, 1) - match = true - return - ko: - position, thunkPosition = position0, thunkPosition0 - return - }, - /* 188 UnquotedLinkSource <- (< (!'_' !':' !'`' Nonspacechar)+* > { yy = p.mkString(yytext) }) */ + /* 187 UnquotedLinkSource <- (< (!'_' !':' !'`' Nonspacechar)+* > { yy = p.mkString(yytext) }) */ func() (match bool) { begin = position loop: @@ -10245,11 +10196,11 @@ func (p *yyParser) Init() { goto loop out: end = position - do(95) + do(94) match = true return }, - /* 189 RefSource <- (< (!'_' !':' !'`' (' ' / Nonspacechar))+* > { yy = p.mkString(yytext) }) */ + /* 188 RefSource <- (< (!'_' !':' !'`' (' ' / Nonspacechar))+* > { yy = p.mkString(yytext) }) */ func() (match bool) { begin = position loop: @@ -10293,11 +10244,11 @@ func (p *yyParser) Init() { goto loop out: end = position - do(96) + do(95) match = true return }, - /* 190 QuotedRefSource <- (< (!':' !'`' (' ' / Nonspacechar))+* > { yy = p.mkString(yytext) }) */ + /* 189 QuotedRefSource <- (< (!':' !'`' (' ' / Nonspacechar))+* > { yy = p.mkString(yytext) }) */ func() (match bool) { begin = position loop: @@ -10341,11 +10292,11 @@ func (p *yyParser) Init() { goto loop out: end = position - do(97) + do(96) match = true return }, - /* 191 EmbeddedRefSource <- (< (!'<' !':' !'`' (' ' / Nonspacechar / BlankLine))+* > { yy = p.mkString(yytext) }) */ + /* 190 EmbeddedRefSource <- (< (!'<' !':' !'`' (' ' / Nonspacechar / BlankLine))+* > { yy = p.mkString(yytext) }) */ func() (match bool) { begin = position loop: @@ -10399,11 +10350,11 @@ func (p *yyParser) Init() { goto loop out: end = position - do(98) + do(97) match = true return }, - /* 192 Label <- ('[' ((!'^' &{p.extension.Notes}) / (&. &{!p.extension.Notes})) StartList (!']' Inline { a = cons(yy, a) })* ']' { + /* 191 Label <- ('[' ((!'^' &{p.extension.Notes}) / (&. &{!p.extension.Notes})) StartList (!']' Inline { a = cons(yy, a) })* ']' { yy = p.mkList(LIST, a) }) */ func() (match bool) { @@ -10440,7 +10391,7 @@ func (p *yyParser) Init() { if !p.rules[ruleInline]() { goto out } - do(99) + do(98) goto loop out: position = position1 @@ -10448,7 +10399,7 @@ func (p *yyParser) Init() { if !matchChar(']') { goto ko } - do(100) + do(99) doarg(yyPop, 1) match = true return @@ -10456,7 +10407,7 @@ func (p *yyParser) Init() { position, thunkPosition = position0, thunkPosition0 return }, - /* 193 RefSrc <- (< Nonspacechar+ > { yy = p.mkString(yytext) + /* 192 RefSrc <- (< Nonspacechar+ > { yy = p.mkString(yytext) yy.key = HTML }) */ func() (match bool) { position0 := position @@ -10471,14 +10422,14 @@ func (p *yyParser) Init() { goto loop out: end = position - do(101) + do(100) match = true return ko: position = position0 return }, - /* 194 References <- (StartList ((Reference { a = cons(b, a) }) / SkipBlock)* { p.references = reverse(a) + /* 193 References <- (StartList ((Reference { a = cons(b, a) }) / SkipBlock)* { p.references = reverse(a) p.state.heap.hasGlobals = true } commit) */ func() (match bool) { @@ -10497,7 +10448,7 @@ func (p *yyParser) Init() { goto nextAlt } doarg(yySet, -2) - do(102) + do(101) goto ok nextAlt: position, thunkPosition = position2, thunkPosition2 @@ -10510,7 +10461,7 @@ func (p *yyParser) Init() { out: position, thunkPosition = position1, thunkPosition1 } - do(103) + do(102) if !(p.commit(thunkPosition0)) { goto ko } @@ -10521,7 +10472,7 @@ func (p *yyParser) Init() { position, thunkPosition = position0, thunkPosition0 return }, - /* 195 Ticks2 <- ('``' !'`') */ + /* 194 Ticks2 <- ('``' !'`') */ func() (match bool) { position0 := position if !matchString("``") { @@ -10536,7 +10487,7 @@ func (p *yyParser) Init() { position = position0 return }, - /* 196 Code <- (Ticks2 < ((!'`' Nonspacechar)+ / ((&[`] (!Ticks2 '`')) | (&[_] '_') | (&[\t\n\r ] (!(Sp Ticks2) ((&[\n\r] (Newline !BlankLine)) | (&[\t ] Spacechar))))))+ > Ticks2 { yy = p.mkString(yytext); yy.key = CODE }) */ + /* 195 Code <- (Ticks2 < ((!'`' Nonspacechar)+ / ((&[`] (!Ticks2 '`')) | (&[_] '_') | (&[\t\n\r ] (!(Sp Ticks2) ((&[\n\r] (Newline !BlankLine)) | (&[\t ] Spacechar))))))+ > Ticks2 { yy = p.mkString(yytext); yy.key = CODE }) */ func() (match bool) { position0 := position if !p.rules[ruleTicks2]() { @@ -10698,14 +10649,14 @@ func (p *yyParser) Init() { if !p.rules[ruleTicks2]() { goto ko } - do(104) + do(103) match = true return ko: position = position0 return }, - /* 197 RawHtml <- (< (HtmlComment / HtmlBlockScript / HtmlTag) > { if p.extension.FilterHTML { + /* 196 RawHtml <- (< (HtmlComment / HtmlBlockScript / HtmlTag) > { if p.extension.FilterHTML { yy = p.mkList(LIST, nil) } else { yy = p.mkString(yytext) @@ -10730,14 +10681,14 @@ func (p *yyParser) Init() { } ok: end = position - do(105) + do(104) match = true return ko: position = position0 return }, - /* 198 BlankLine <- (Sp Newline) */ + /* 197 BlankLine <- (Sp Newline) */ func() (match bool) { position0 := position if !p.rules[ruleSp]() { @@ -10752,7 +10703,7 @@ func (p *yyParser) Init() { position = position0 return }, - /* 199 Quoted <- ((&[\'] ('\'' (!'\'' .)* '\'')) | (&[\"] ('"' (!'"' .)* '"'))) */ + /* 198 Quoted <- ((&[\'] ('\'' (!'\'' .)* '\'')) | (&[\"] ('"' (!'"' .)* '"'))) */ func() (match bool) { position0 := position { @@ -10804,7 +10755,7 @@ func (p *yyParser) Init() { position = position0 return }, - /* 200 HtmlAttribute <- (((&[\-] '-') | (&[0-9A-Za-z] [A-Za-z0-9]))+ Spnl ('=' Spnl (Quoted / (!'>' Nonspacechar)+))? Spnl) */ + /* 199 HtmlAttribute <- (((&[\-] '-') | (&[0-9A-Za-z] [A-Za-z0-9]))+ Spnl ('=' Spnl (Quoted / (!'>' Nonspacechar)+))? Spnl) */ func() (match bool) { position0 := position { @@ -10882,7 +10833,7 @@ func (p *yyParser) Init() { position = position0 return }, - /* 201 HtmlComment <- ('' .)* '-->') */ + /* 200 HtmlComment <- ('' .)* '-->') */ func() (match bool) { position0 := position if !matchString(" As for 0b0000, and also includes support for half-precision floating-point arithmetic. + f |= FPHP + f |= ASIMDHP + } + } + if procFeatures&(0xf<<16) != 0 { + f |= FP + } + + instAttrReg0, instAttrReg1 := getInstAttributes() + + // https://developer.arm.com/docs/ddi0595/b/aarch64-system-registers/id_aa64isar0_el1 + // + // ID_AA64ISAR0_EL1 - Instruction Set Attribute Register 0 + // x--------------------------------------------------x + // | Name | bits | visible | + // |--------------------------------------------------| + // | TS | [55-52] | y | + // |--------------------------------------------------| + // | FHM | [51-48] | y | + // |--------------------------------------------------| + // | DP | [47-44] | y | + // |--------------------------------------------------| + // | SM4 | [43-40] | y | + // |--------------------------------------------------| + // | SM3 | [39-36] | y | + // |--------------------------------------------------| + // | SHA3 | [35-32] | y | + // |--------------------------------------------------| + // | RDM | [31-28] | y | + // |--------------------------------------------------| + // | ATOMICS | [23-20] | y | + // |--------------------------------------------------| + // | CRC32 | [19-16] | y | + // |--------------------------------------------------| + // | SHA2 | [15-12] | y | + // |--------------------------------------------------| + // | SHA1 | [11-8] | y | + // |--------------------------------------------------| + // | AES | [7-4] | y | + // x--------------------------------------------------x + + // if instAttrReg0&(0xf<<52) != 0 { + // fmt.Println("TS") + // } + // if instAttrReg0&(0xf<<48) != 0 { + // fmt.Println("FHM") + // } + if instAttrReg0&(0xf<<44) != 0 { + f |= ASIMDDP + } + if instAttrReg0&(0xf<<40) != 0 { + f |= SM4 + } + if instAttrReg0&(0xf<<36) != 0 { + f |= SM3 + } + if instAttrReg0&(0xf<<32) != 0 { + f |= SHA3 + } + if instAttrReg0&(0xf<<28) != 0 { + f |= ASIMDRDM + } + if instAttrReg0&(0xf<<20) != 0 { + f |= ATOMICS + } + if instAttrReg0&(0xf<<16) != 0 { + f |= CRC32 + } + if instAttrReg0&(0xf<<12) != 0 { + f |= SHA2 + } + if instAttrReg0&(0xf<<12) == 2<<12 { + // https://developer.arm.com/docs/ddi0595/b/aarch64-system-registers/id_aa64isar0_el1 + // 0b0010 --> As 0b0001, plus SHA512H, SHA512H2, SHA512SU0, and SHA512SU1 instructions implemented. + f |= SHA512 + } + if instAttrReg0&(0xf<<8) != 0 { + f |= SHA1 + } + if instAttrReg0&(0xf<<4) != 0 { + f |= AES + } + if instAttrReg0&(0xf<<4) == 2<<4 { + // https://developer.arm.com/docs/ddi0595/b/aarch64-system-registers/id_aa64isar0_el1 + // 0b0010 --> As for 0b0001, plus PMULL/PMULL2 instructions operating on 64-bit data quantities. + f |= PMULL + } + + // https://developer.arm.com/docs/ddi0595/b/aarch64-system-registers/id_aa64isar1_el1 + // + // ID_AA64ISAR1_EL1 - Instruction set attribute register 1 + // x--------------------------------------------------x + // | Name | bits | visible | + // |--------------------------------------------------| + // | GPI | [31-28] | y | + // |--------------------------------------------------| + // | GPA | [27-24] | y | + // |--------------------------------------------------| + // | LRCPC | [23-20] | y | + // |--------------------------------------------------| + // | FCMA | [19-16] | y | + // |--------------------------------------------------| + // | JSCVT | [15-12] | y | + // |--------------------------------------------------| + // | API | [11-8] | y | + // |--------------------------------------------------| + // | APA | [7-4] | y | + // |--------------------------------------------------| + // | DPB | [3-0] | y | + // x--------------------------------------------------x + + // if instAttrReg1&(0xf<<28) != 0 { + // fmt.Println("GPI") + // } + if instAttrReg1&(0xf<<28) != 24 { + f |= GPA + } + if instAttrReg1&(0xf<<20) != 0 { + f |= LRCPC + } + if instAttrReg1&(0xf<<16) != 0 { + f |= FCMA + } + if instAttrReg1&(0xf<<12) != 0 { + f |= JSCVT + } + // if instAttrReg1&(0xf<<8) != 0 { + // fmt.Println("API") + // } + // if instAttrReg1&(0xf<<4) != 0 { + // fmt.Println("APA") + // } + if instAttrReg1&(0xf<<0) != 0 { + f |= DCPOP + } + c.Arm = f +} diff --git a/vendor/github.com/klauspost/cpuid/detect_intel.go b/vendor/github.com/klauspost/cpuid/detect_intel.go new file mode 100644 index 000000000..363951b3b --- /dev/null +++ b/vendor/github.com/klauspost/cpuid/detect_intel.go @@ -0,0 +1,33 @@ +// Copyright (c) 2015 Klaus Post, released under MIT License. See LICENSE file. + +//+build 386,!gccgo,!noasm amd64,!gccgo,!noasm,!appengine + +package cpuid + +func asmCpuid(op uint32) (eax, ebx, ecx, edx uint32) +func asmCpuidex(op, op2 uint32) (eax, ebx, ecx, edx uint32) +func asmXgetbv(index uint32) (eax, edx uint32) +func asmRdtscpAsm() (eax, ebx, ecx, edx uint32) + +func initCPU() { + cpuid = asmCpuid + cpuidex = asmCpuidex + xgetbv = asmXgetbv + rdtscpAsm = asmRdtscpAsm +} + +func addInfo(c *CPUInfo) { + c.maxFunc = maxFunctionID() + c.maxExFunc = maxExtendedFunction() + c.BrandName = brandName() + c.CacheLine = cacheLine() + c.Family, c.Model = familyModel() + c.Features = support() + c.SGX = hasSGX(c.Features&SGX != 0, c.Features&SGXLC != 0) + c.ThreadsPerCore = threadsPerCore() + c.LogicalCores = logicalCores() + c.PhysicalCores = physicalCores() + c.VendorID, c.VendorString = vendorID() + c.Hz = hertz(c.BrandName) + c.cacheSize() +} diff --git a/vendor/github.com/klauspost/cpuid/detect_ref.go b/vendor/github.com/klauspost/cpuid/detect_ref.go new file mode 100644 index 000000000..970ff3d22 --- /dev/null +++ b/vendor/github.com/klauspost/cpuid/detect_ref.go @@ -0,0 +1,14 @@ +// Copyright (c) 2015 Klaus Post, released under MIT License. See LICENSE file. + +//+build !amd64,!386,!arm64 gccgo noasm appengine + +package cpuid + +func initCPU() { + cpuid = func(uint32) (a, b, c, d uint32) { return 0, 0, 0, 0 } + cpuidex = func(x, y uint32) (a, b, c, d uint32) { return 0, 0, 0, 0 } + xgetbv = func(uint32) (a, b uint32) { return 0, 0 } + rdtscpAsm = func() (a, b, c, d uint32) { return 0, 0, 0, 0 } +} + +func addInfo(info *CPUInfo) {} diff --git a/vendor/github.com/klauspost/cpuid/go.mod b/vendor/github.com/klauspost/cpuid/go.mod new file mode 100644 index 000000000..55563f2a8 --- /dev/null +++ b/vendor/github.com/klauspost/cpuid/go.mod @@ -0,0 +1,3 @@ +module github.com/klauspost/cpuid + +go 1.12 diff --git a/vendor/github.com/kr/pretty/.gitignore b/vendor/github.com/kr/pretty/.gitignore deleted file mode 100644 index 1f0a99f2f..000000000 --- a/vendor/github.com/kr/pretty/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -[568].out -_go* -_test* -_obj diff --git a/vendor/github.com/kr/pretty/License b/vendor/github.com/kr/pretty/License deleted file mode 100644 index 05c783ccf..000000000 --- a/vendor/github.com/kr/pretty/License +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright 2012 Keith Rarick - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/github.com/kr/pretty/Readme b/vendor/github.com/kr/pretty/Readme deleted file mode 100644 index c589fc622..000000000 --- a/vendor/github.com/kr/pretty/Readme +++ /dev/null @@ -1,9 +0,0 @@ -package pretty - - import "github.com/kr/pretty" - - Package pretty provides pretty-printing for Go values. - -Documentation - - http://godoc.org/github.com/kr/pretty diff --git a/vendor/github.com/kr/pretty/diff.go b/vendor/github.com/kr/pretty/diff.go deleted file mode 100644 index 6aa7f743a..000000000 --- a/vendor/github.com/kr/pretty/diff.go +++ /dev/null @@ -1,265 +0,0 @@ -package pretty - -import ( - "fmt" - "io" - "reflect" -) - -type sbuf []string - -func (p *sbuf) Printf(format string, a ...interface{}) { - s := fmt.Sprintf(format, a...) - *p = append(*p, s) -} - -// Diff returns a slice where each element describes -// a difference between a and b. -func Diff(a, b interface{}) (desc []string) { - Pdiff((*sbuf)(&desc), a, b) - return desc -} - -// wprintfer calls Fprintf on w for each Printf call -// with a trailing newline. -type wprintfer struct{ w io.Writer } - -func (p *wprintfer) Printf(format string, a ...interface{}) { - fmt.Fprintf(p.w, format+"\n", a...) -} - -// Fdiff writes to w a description of the differences between a and b. -func Fdiff(w io.Writer, a, b interface{}) { - Pdiff(&wprintfer{w}, a, b) -} - -type Printfer interface { - Printf(format string, a ...interface{}) -} - -// Pdiff prints to p a description of the differences between a and b. -// It calls Printf once for each difference, with no trailing newline. -// The standard library log.Logger is a Printfer. -func Pdiff(p Printfer, a, b interface{}) { - diffPrinter{w: p}.diff(reflect.ValueOf(a), reflect.ValueOf(b)) -} - -type Logfer interface { - Logf(format string, a ...interface{}) -} - -// logprintfer calls Fprintf on w for each Printf call -// with a trailing newline. -type logprintfer struct{ l Logfer } - -func (p *logprintfer) Printf(format string, a ...interface{}) { - p.l.Logf(format, a...) -} - -// Ldiff prints to l a description of the differences between a and b. -// It calls Logf once for each difference, with no trailing newline. -// The standard library testing.T and testing.B are Logfers. -func Ldiff(l Logfer, a, b interface{}) { - Pdiff(&logprintfer{l}, a, b) -} - -type diffPrinter struct { - w Printfer - l string // label -} - -func (w diffPrinter) printf(f string, a ...interface{}) { - var l string - if w.l != "" { - l = w.l + ": " - } - w.w.Printf(l+f, a...) -} - -func (w diffPrinter) diff(av, bv reflect.Value) { - if !av.IsValid() && bv.IsValid() { - w.printf("nil != %# v", formatter{v: bv, quote: true}) - return - } - if av.IsValid() && !bv.IsValid() { - w.printf("%# v != nil", formatter{v: av, quote: true}) - return - } - if !av.IsValid() && !bv.IsValid() { - return - } - - at := av.Type() - bt := bv.Type() - if at != bt { - w.printf("%v != %v", at, bt) - return - } - - switch kind := at.Kind(); kind { - case reflect.Bool: - if a, b := av.Bool(), bv.Bool(); a != b { - w.printf("%v != %v", a, b) - } - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - if a, b := av.Int(), bv.Int(); a != b { - w.printf("%d != %d", a, b) - } - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - if a, b := av.Uint(), bv.Uint(); a != b { - w.printf("%d != %d", a, b) - } - case reflect.Float32, reflect.Float64: - if a, b := av.Float(), bv.Float(); a != b { - w.printf("%v != %v", a, b) - } - case reflect.Complex64, reflect.Complex128: - if a, b := av.Complex(), bv.Complex(); a != b { - w.printf("%v != %v", a, b) - } - case reflect.Array: - n := av.Len() - for i := 0; i < n; i++ { - w.relabel(fmt.Sprintf("[%d]", i)).diff(av.Index(i), bv.Index(i)) - } - case reflect.Chan, reflect.Func, reflect.UnsafePointer: - if a, b := av.Pointer(), bv.Pointer(); a != b { - w.printf("%#x != %#x", a, b) - } - case reflect.Interface: - w.diff(av.Elem(), bv.Elem()) - case reflect.Map: - ak, both, bk := keyDiff(av.MapKeys(), bv.MapKeys()) - for _, k := range ak { - w := w.relabel(fmt.Sprintf("[%#v]", k)) - w.printf("%q != (missing)", av.MapIndex(k)) - } - for _, k := range both { - w := w.relabel(fmt.Sprintf("[%#v]", k)) - w.diff(av.MapIndex(k), bv.MapIndex(k)) - } - for _, k := range bk { - w := w.relabel(fmt.Sprintf("[%#v]", k)) - w.printf("(missing) != %q", bv.MapIndex(k)) - } - case reflect.Ptr: - switch { - case av.IsNil() && !bv.IsNil(): - w.printf("nil != %# v", formatter{v: bv, quote: true}) - case !av.IsNil() && bv.IsNil(): - w.printf("%# v != nil", formatter{v: av, quote: true}) - case !av.IsNil() && !bv.IsNil(): - w.diff(av.Elem(), bv.Elem()) - } - case reflect.Slice: - lenA := av.Len() - lenB := bv.Len() - if lenA != lenB { - w.printf("%s[%d] != %s[%d]", av.Type(), lenA, bv.Type(), lenB) - break - } - for i := 0; i < lenA; i++ { - w.relabel(fmt.Sprintf("[%d]", i)).diff(av.Index(i), bv.Index(i)) - } - case reflect.String: - if a, b := av.String(), bv.String(); a != b { - w.printf("%q != %q", a, b) - } - case reflect.Struct: - for i := 0; i < av.NumField(); i++ { - w.relabel(at.Field(i).Name).diff(av.Field(i), bv.Field(i)) - } - default: - panic("unknown reflect Kind: " + kind.String()) - } -} - -func (d diffPrinter) relabel(name string) (d1 diffPrinter) { - d1 = d - if d.l != "" && name[0] != '[' { - d1.l += "." - } - d1.l += name - return d1 -} - -// keyEqual compares a and b for equality. -// Both a and b must be valid map keys. -func keyEqual(av, bv reflect.Value) bool { - if !av.IsValid() && !bv.IsValid() { - return true - } - if !av.IsValid() || !bv.IsValid() || av.Type() != bv.Type() { - return false - } - switch kind := av.Kind(); kind { - case reflect.Bool: - a, b := av.Bool(), bv.Bool() - return a == b - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - a, b := av.Int(), bv.Int() - return a == b - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - a, b := av.Uint(), bv.Uint() - return a == b - case reflect.Float32, reflect.Float64: - a, b := av.Float(), bv.Float() - return a == b - case reflect.Complex64, reflect.Complex128: - a, b := av.Complex(), bv.Complex() - return a == b - case reflect.Array: - for i := 0; i < av.Len(); i++ { - if !keyEqual(av.Index(i), bv.Index(i)) { - return false - } - } - return true - case reflect.Chan, reflect.UnsafePointer, reflect.Ptr: - a, b := av.Pointer(), bv.Pointer() - return a == b - case reflect.Interface: - return keyEqual(av.Elem(), bv.Elem()) - case reflect.String: - a, b := av.String(), bv.String() - return a == b - case reflect.Struct: - for i := 0; i < av.NumField(); i++ { - if !keyEqual(av.Field(i), bv.Field(i)) { - return false - } - } - return true - default: - panic("invalid map key type " + av.Type().String()) - } -} - -func keyDiff(a, b []reflect.Value) (ak, both, bk []reflect.Value) { - for _, av := range a { - inBoth := false - for _, bv := range b { - if keyEqual(av, bv) { - inBoth = true - both = append(both, av) - break - } - } - if !inBoth { - ak = append(ak, av) - } - } - for _, bv := range b { - inBoth := false - for _, av := range a { - if keyEqual(av, bv) { - inBoth = true - break - } - } - if !inBoth { - bk = append(bk, bv) - } - } - return -} diff --git a/vendor/github.com/kr/pretty/formatter.go b/vendor/github.com/kr/pretty/formatter.go deleted file mode 100644 index a317d7b8e..000000000 --- a/vendor/github.com/kr/pretty/formatter.go +++ /dev/null @@ -1,328 +0,0 @@ -package pretty - -import ( - "fmt" - "io" - "reflect" - "strconv" - "text/tabwriter" - - "github.com/kr/text" -) - -type formatter struct { - v reflect.Value - force bool - quote bool -} - -// Formatter makes a wrapper, f, that will format x as go source with line -// breaks and tabs. Object f responds to the "%v" formatting verb when both the -// "#" and " " (space) flags are set, for example: -// -// fmt.Sprintf("%# v", Formatter(x)) -// -// If one of these two flags is not set, or any other verb is used, f will -// format x according to the usual rules of package fmt. -// In particular, if x satisfies fmt.Formatter, then x.Format will be called. -func Formatter(x interface{}) (f fmt.Formatter) { - return formatter{v: reflect.ValueOf(x), quote: true} -} - -func (fo formatter) String() string { - return fmt.Sprint(fo.v.Interface()) // unwrap it -} - -func (fo formatter) passThrough(f fmt.State, c rune) { - s := "%" - for i := 0; i < 128; i++ { - if f.Flag(i) { - s += string(i) - } - } - if w, ok := f.Width(); ok { - s += fmt.Sprintf("%d", w) - } - if p, ok := f.Precision(); ok { - s += fmt.Sprintf(".%d", p) - } - s += string(c) - fmt.Fprintf(f, s, fo.v.Interface()) -} - -func (fo formatter) Format(f fmt.State, c rune) { - if fo.force || c == 'v' && f.Flag('#') && f.Flag(' ') { - w := tabwriter.NewWriter(f, 4, 4, 1, ' ', 0) - p := &printer{tw: w, Writer: w, visited: make(map[visit]int)} - p.printValue(fo.v, true, fo.quote) - w.Flush() - return - } - fo.passThrough(f, c) -} - -type printer struct { - io.Writer - tw *tabwriter.Writer - visited map[visit]int - depth int -} - -func (p *printer) indent() *printer { - q := *p - q.tw = tabwriter.NewWriter(p.Writer, 4, 4, 1, ' ', 0) - q.Writer = text.NewIndentWriter(q.tw, []byte{'\t'}) - return &q -} - -func (p *printer) printInline(v reflect.Value, x interface{}, showType bool) { - if showType { - io.WriteString(p, v.Type().String()) - fmt.Fprintf(p, "(%#v)", x) - } else { - fmt.Fprintf(p, "%#v", x) - } -} - -// printValue must keep track of already-printed pointer values to avoid -// infinite recursion. -type visit struct { - v uintptr - typ reflect.Type -} - -func (p *printer) printValue(v reflect.Value, showType, quote bool) { - if p.depth > 10 { - io.WriteString(p, "!%v(DEPTH EXCEEDED)") - return - } - - switch v.Kind() { - case reflect.Bool: - p.printInline(v, v.Bool(), showType) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - p.printInline(v, v.Int(), showType) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - p.printInline(v, v.Uint(), showType) - case reflect.Float32, reflect.Float64: - p.printInline(v, v.Float(), showType) - case reflect.Complex64, reflect.Complex128: - fmt.Fprintf(p, "%#v", v.Complex()) - case reflect.String: - p.fmtString(v.String(), quote) - case reflect.Map: - t := v.Type() - if showType { - io.WriteString(p, t.String()) - } - writeByte(p, '{') - if nonzero(v) { - expand := !canInline(v.Type()) - pp := p - if expand { - writeByte(p, '\n') - pp = p.indent() - } - keys := v.MapKeys() - for i := 0; i < v.Len(); i++ { - showTypeInStruct := true - k := keys[i] - mv := v.MapIndex(k) - pp.printValue(k, false, true) - writeByte(pp, ':') - if expand { - writeByte(pp, '\t') - } - showTypeInStruct = t.Elem().Kind() == reflect.Interface - pp.printValue(mv, showTypeInStruct, true) - if expand { - io.WriteString(pp, ",\n") - } else if i < v.Len()-1 { - io.WriteString(pp, ", ") - } - } - if expand { - pp.tw.Flush() - } - } - writeByte(p, '}') - case reflect.Struct: - t := v.Type() - if v.CanAddr() { - addr := v.UnsafeAddr() - vis := visit{addr, t} - if vd, ok := p.visited[vis]; ok && vd < p.depth { - p.fmtString(t.String()+"{(CYCLIC REFERENCE)}", false) - break // don't print v again - } - p.visited[vis] = p.depth - } - - if showType { - io.WriteString(p, t.String()) - } - writeByte(p, '{') - if nonzero(v) { - expand := !canInline(v.Type()) - pp := p - if expand { - writeByte(p, '\n') - pp = p.indent() - } - for i := 0; i < v.NumField(); i++ { - showTypeInStruct := true - if f := t.Field(i); f.Name != "" { - io.WriteString(pp, f.Name) - writeByte(pp, ':') - if expand { - writeByte(pp, '\t') - } - showTypeInStruct = labelType(f.Type) - } - pp.printValue(getField(v, i), showTypeInStruct, true) - if expand { - io.WriteString(pp, ",\n") - } else if i < v.NumField()-1 { - io.WriteString(pp, ", ") - } - } - if expand { - pp.tw.Flush() - } - } - writeByte(p, '}') - case reflect.Interface: - switch e := v.Elem(); { - case e.Kind() == reflect.Invalid: - io.WriteString(p, "nil") - case e.IsValid(): - pp := *p - pp.depth++ - pp.printValue(e, showType, true) - default: - io.WriteString(p, v.Type().String()) - io.WriteString(p, "(nil)") - } - case reflect.Array, reflect.Slice: - t := v.Type() - if showType { - io.WriteString(p, t.String()) - } - if v.Kind() == reflect.Slice && v.IsNil() && showType { - io.WriteString(p, "(nil)") - break - } - if v.Kind() == reflect.Slice && v.IsNil() { - io.WriteString(p, "nil") - break - } - writeByte(p, '{') - expand := !canInline(v.Type()) - pp := p - if expand { - writeByte(p, '\n') - pp = p.indent() - } - for i := 0; i < v.Len(); i++ { - showTypeInSlice := t.Elem().Kind() == reflect.Interface - pp.printValue(v.Index(i), showTypeInSlice, true) - if expand { - io.WriteString(pp, ",\n") - } else if i < v.Len()-1 { - io.WriteString(pp, ", ") - } - } - if expand { - pp.tw.Flush() - } - writeByte(p, '}') - case reflect.Ptr: - e := v.Elem() - if !e.IsValid() { - writeByte(p, '(') - io.WriteString(p, v.Type().String()) - io.WriteString(p, ")(nil)") - } else { - pp := *p - pp.depth++ - writeByte(pp, '&') - pp.printValue(e, true, true) - } - case reflect.Chan: - x := v.Pointer() - if showType { - writeByte(p, '(') - io.WriteString(p, v.Type().String()) - fmt.Fprintf(p, ")(%#v)", x) - } else { - fmt.Fprintf(p, "%#v", x) - } - case reflect.Func: - io.WriteString(p, v.Type().String()) - io.WriteString(p, " {...}") - case reflect.UnsafePointer: - p.printInline(v, v.Pointer(), showType) - case reflect.Invalid: - io.WriteString(p, "nil") - } -} - -func canInline(t reflect.Type) bool { - switch t.Kind() { - case reflect.Map: - return !canExpand(t.Elem()) - case reflect.Struct: - for i := 0; i < t.NumField(); i++ { - if canExpand(t.Field(i).Type) { - return false - } - } - return true - case reflect.Interface: - return false - case reflect.Array, reflect.Slice: - return !canExpand(t.Elem()) - case reflect.Ptr: - return false - case reflect.Chan, reflect.Func, reflect.UnsafePointer: - return false - } - return true -} - -func canExpand(t reflect.Type) bool { - switch t.Kind() { - case reflect.Map, reflect.Struct, - reflect.Interface, reflect.Array, reflect.Slice, - reflect.Ptr: - return true - } - return false -} - -func labelType(t reflect.Type) bool { - switch t.Kind() { - case reflect.Interface, reflect.Struct: - return true - } - return false -} - -func (p *printer) fmtString(s string, quote bool) { - if quote { - s = strconv.Quote(s) - } - io.WriteString(p, s) -} - -func writeByte(w io.Writer, b byte) { - w.Write([]byte{b}) -} - -func getField(v reflect.Value, i int) reflect.Value { - val := v.Field(i) - if val.Kind() == reflect.Interface && !val.IsNil() { - val = val.Elem() - } - return val -} diff --git a/vendor/github.com/kr/pretty/go.mod b/vendor/github.com/kr/pretty/go.mod deleted file mode 100644 index 1e2953314..000000000 --- a/vendor/github.com/kr/pretty/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module "github.com/kr/pretty" - -require "github.com/kr/text" v0.1.0 diff --git a/vendor/github.com/kr/pretty/pretty.go b/vendor/github.com/kr/pretty/pretty.go deleted file mode 100644 index 49423ec7f..000000000 --- a/vendor/github.com/kr/pretty/pretty.go +++ /dev/null @@ -1,108 +0,0 @@ -// Package pretty provides pretty-printing for Go values. This is -// useful during debugging, to avoid wrapping long output lines in -// the terminal. -// -// It provides a function, Formatter, that can be used with any -// function that accepts a format string. It also provides -// convenience wrappers for functions in packages fmt and log. -package pretty - -import ( - "fmt" - "io" - "log" - "reflect" -) - -// Errorf is a convenience wrapper for fmt.Errorf. -// -// Calling Errorf(f, x, y) is equivalent to -// fmt.Errorf(f, Formatter(x), Formatter(y)). -func Errorf(format string, a ...interface{}) error { - return fmt.Errorf(format, wrap(a, false)...) -} - -// Fprintf is a convenience wrapper for fmt.Fprintf. -// -// Calling Fprintf(w, f, x, y) is equivalent to -// fmt.Fprintf(w, f, Formatter(x), Formatter(y)). -func Fprintf(w io.Writer, format string, a ...interface{}) (n int, error error) { - return fmt.Fprintf(w, format, wrap(a, false)...) -} - -// Log is a convenience wrapper for log.Printf. -// -// Calling Log(x, y) is equivalent to -// log.Print(Formatter(x), Formatter(y)), but each operand is -// formatted with "%# v". -func Log(a ...interface{}) { - log.Print(wrap(a, true)...) -} - -// Logf is a convenience wrapper for log.Printf. -// -// Calling Logf(f, x, y) is equivalent to -// log.Printf(f, Formatter(x), Formatter(y)). -func Logf(format string, a ...interface{}) { - log.Printf(format, wrap(a, false)...) -} - -// Logln is a convenience wrapper for log.Printf. -// -// Calling Logln(x, y) is equivalent to -// log.Println(Formatter(x), Formatter(y)), but each operand is -// formatted with "%# v". -func Logln(a ...interface{}) { - log.Println(wrap(a, true)...) -} - -// Print pretty-prints its operands and writes to standard output. -// -// Calling Print(x, y) is equivalent to -// fmt.Print(Formatter(x), Formatter(y)), but each operand is -// formatted with "%# v". -func Print(a ...interface{}) (n int, errno error) { - return fmt.Print(wrap(a, true)...) -} - -// Printf is a convenience wrapper for fmt.Printf. -// -// Calling Printf(f, x, y) is equivalent to -// fmt.Printf(f, Formatter(x), Formatter(y)). -func Printf(format string, a ...interface{}) (n int, errno error) { - return fmt.Printf(format, wrap(a, false)...) -} - -// Println pretty-prints its operands and writes to standard output. -// -// Calling Print(x, y) is equivalent to -// fmt.Println(Formatter(x), Formatter(y)), but each operand is -// formatted with "%# v". -func Println(a ...interface{}) (n int, errno error) { - return fmt.Println(wrap(a, true)...) -} - -// Sprint is a convenience wrapper for fmt.Sprintf. -// -// Calling Sprint(x, y) is equivalent to -// fmt.Sprint(Formatter(x), Formatter(y)), but each operand is -// formatted with "%# v". -func Sprint(a ...interface{}) string { - return fmt.Sprint(wrap(a, true)...) -} - -// Sprintf is a convenience wrapper for fmt.Sprintf. -// -// Calling Sprintf(f, x, y) is equivalent to -// fmt.Sprintf(f, Formatter(x), Formatter(y)). -func Sprintf(format string, a ...interface{}) string { - return fmt.Sprintf(format, wrap(a, false)...) -} - -func wrap(a []interface{}, force bool) []interface{} { - w := make([]interface{}, len(a)) - for i, x := range a { - w[i] = formatter{v: reflect.ValueOf(x), force: force} - } - return w -} diff --git a/vendor/github.com/kr/pretty/zero.go b/vendor/github.com/kr/pretty/zero.go deleted file mode 100644 index abb5b6fc1..000000000 --- a/vendor/github.com/kr/pretty/zero.go +++ /dev/null @@ -1,41 +0,0 @@ -package pretty - -import ( - "reflect" -) - -func nonzero(v reflect.Value) bool { - switch v.Kind() { - case reflect.Bool: - return v.Bool() - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return v.Int() != 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return v.Uint() != 0 - case reflect.Float32, reflect.Float64: - return v.Float() != 0 - case reflect.Complex64, reflect.Complex128: - return v.Complex() != complex(0, 0) - case reflect.String: - return v.String() != "" - case reflect.Struct: - for i := 0; i < v.NumField(); i++ { - if nonzero(getField(v, i)) { - return true - } - } - return false - case reflect.Array: - for i := 0; i < v.Len(); i++ { - if nonzero(v.Index(i)) { - return true - } - } - return false - case reflect.Map, reflect.Interface, reflect.Slice, reflect.Ptr, reflect.Chan, reflect.Func: - return !v.IsNil() - case reflect.UnsafePointer: - return v.Pointer() != 0 - } - return true -} diff --git a/vendor/github.com/kr/text/License b/vendor/github.com/kr/text/License deleted file mode 100644 index 480a32805..000000000 --- a/vendor/github.com/kr/text/License +++ /dev/null @@ -1,19 +0,0 @@ -Copyright 2012 Keith Rarick - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/github.com/kr/text/Readme b/vendor/github.com/kr/text/Readme deleted file mode 100644 index 7e6e7c068..000000000 --- a/vendor/github.com/kr/text/Readme +++ /dev/null @@ -1,3 +0,0 @@ -This is a Go package for manipulating paragraphs of text. - -See http://go.pkgdoc.org/github.com/kr/text for full documentation. diff --git a/vendor/github.com/kr/text/doc.go b/vendor/github.com/kr/text/doc.go deleted file mode 100644 index cf4c198f9..000000000 --- a/vendor/github.com/kr/text/doc.go +++ /dev/null @@ -1,3 +0,0 @@ -// Package text provides rudimentary functions for manipulating text in -// paragraphs. -package text diff --git a/vendor/github.com/kr/text/go.mod b/vendor/github.com/kr/text/go.mod deleted file mode 100644 index fa0528b9a..000000000 --- a/vendor/github.com/kr/text/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module "github.com/kr/text" - -require "github.com/kr/pty" v1.1.1 diff --git a/vendor/github.com/kr/text/indent.go b/vendor/github.com/kr/text/indent.go deleted file mode 100644 index 4ebac45c0..000000000 --- a/vendor/github.com/kr/text/indent.go +++ /dev/null @@ -1,74 +0,0 @@ -package text - -import ( - "io" -) - -// Indent inserts prefix at the beginning of each non-empty line of s. The -// end-of-line marker is NL. -func Indent(s, prefix string) string { - return string(IndentBytes([]byte(s), []byte(prefix))) -} - -// IndentBytes inserts prefix at the beginning of each non-empty line of b. -// The end-of-line marker is NL. -func IndentBytes(b, prefix []byte) []byte { - var res []byte - bol := true - for _, c := range b { - if bol && c != '\n' { - res = append(res, prefix...) - } - res = append(res, c) - bol = c == '\n' - } - return res -} - -// Writer indents each line of its input. -type indentWriter struct { - w io.Writer - bol bool - pre [][]byte - sel int - off int -} - -// NewIndentWriter makes a new write filter that indents the input -// lines. Each line is prefixed in order with the corresponding -// element of pre. If there are more lines than elements, the last -// element of pre is repeated for each subsequent line. -func NewIndentWriter(w io.Writer, pre ...[]byte) io.Writer { - return &indentWriter{ - w: w, - pre: pre, - bol: true, - } -} - -// The only errors returned are from the underlying indentWriter. -func (w *indentWriter) Write(p []byte) (n int, err error) { - for _, c := range p { - if w.bol { - var i int - i, err = w.w.Write(w.pre[w.sel][w.off:]) - w.off += i - if err != nil { - return n, err - } - } - _, err = w.w.Write([]byte{c}) - if err != nil { - return n, err - } - n++ - w.bol = c == '\n' - if w.bol { - w.off = 0 - if w.sel < len(w.pre)-1 { - w.sel++ - } - } - } - return n, nil -} diff --git a/vendor/github.com/kr/text/wrap.go b/vendor/github.com/kr/text/wrap.go deleted file mode 100644 index b09bb0373..000000000 --- a/vendor/github.com/kr/text/wrap.go +++ /dev/null @@ -1,86 +0,0 @@ -package text - -import ( - "bytes" - "math" -) - -var ( - nl = []byte{'\n'} - sp = []byte{' '} -) - -const defaultPenalty = 1e5 - -// Wrap wraps s into a paragraph of lines of length lim, with minimal -// raggedness. -func Wrap(s string, lim int) string { - return string(WrapBytes([]byte(s), lim)) -} - -// WrapBytes wraps b into a paragraph of lines of length lim, with minimal -// raggedness. -func WrapBytes(b []byte, lim int) []byte { - words := bytes.Split(bytes.Replace(bytes.TrimSpace(b), nl, sp, -1), sp) - var lines [][]byte - for _, line := range WrapWords(words, 1, lim, defaultPenalty) { - lines = append(lines, bytes.Join(line, sp)) - } - return bytes.Join(lines, nl) -} - -// WrapWords is the low-level line-breaking algorithm, useful if you need more -// control over the details of the text wrapping process. For most uses, either -// Wrap or WrapBytes will be sufficient and more convenient. -// -// WrapWords splits a list of words into lines with minimal "raggedness", -// treating each byte as one unit, accounting for spc units between adjacent -// words on each line, and attempting to limit lines to lim units. Raggedness -// is the total error over all lines, where error is the square of the -// difference of the length of the line and lim. Too-long lines (which only -// happen when a single word is longer than lim units) have pen penalty units -// added to the error. -func WrapWords(words [][]byte, spc, lim, pen int) [][][]byte { - n := len(words) - - length := make([][]int, n) - for i := 0; i < n; i++ { - length[i] = make([]int, n) - length[i][i] = len(words[i]) - for j := i + 1; j < n; j++ { - length[i][j] = length[i][j-1] + spc + len(words[j]) - } - } - - nbrk := make([]int, n) - cost := make([]int, n) - for i := range cost { - cost[i] = math.MaxInt32 - } - for i := n - 1; i >= 0; i-- { - if length[i][n-1] <= lim || i == n-1 { - cost[i] = 0 - nbrk[i] = n - } else { - for j := i + 1; j < n; j++ { - d := lim - length[i][j-1] - c := d*d + cost[j] - if length[i][j-1] > lim { - c += pen // too-long lines get a worse penalty - } - if c < cost[i] { - cost[i] = c - nbrk[i] = j - } - } - } - } - - var lines [][][]byte - i := 0 - for i < n { - lines = append(lines, words[i:nbrk[i]]) - i = nbrk[i] - } - return lines -} diff --git a/vendor/github.com/mattn/go-colorable/.travis.yml b/vendor/github.com/mattn/go-colorable/.travis.yml index 98db8f060..7942c565c 100644 --- a/vendor/github.com/mattn/go-colorable/.travis.yml +++ b/vendor/github.com/mattn/go-colorable/.travis.yml @@ -1,9 +1,15 @@ language: go +sudo: false go: + - 1.13.x - tip before_install: - - go get github.com/mattn/goveralls - - go get golang.org/x/tools/cmd/cover + - go get -t -v ./... + script: - - $HOME/gopath/bin/goveralls -repotoken xnXqRGwgW3SXIguzxf90ZSK1GPYZPaGrw + - ./go.test.sh + +after_success: + - bash <(curl -s https://codecov.io/bash) + diff --git a/vendor/github.com/mattn/go-colorable/README.md b/vendor/github.com/mattn/go-colorable/README.md index 56729a92c..e055952b6 100644 --- a/vendor/github.com/mattn/go-colorable/README.md +++ b/vendor/github.com/mattn/go-colorable/README.md @@ -1,8 +1,8 @@ # go-colorable -[![Godoc Reference](https://godoc.org/github.com/mattn/go-colorable?status.svg)](http://godoc.org/github.com/mattn/go-colorable) [![Build Status](https://travis-ci.org/mattn/go-colorable.svg?branch=master)](https://travis-ci.org/mattn/go-colorable) -[![Coverage Status](https://coveralls.io/repos/github/mattn/go-colorable/badge.svg?branch=master)](https://coveralls.io/github/mattn/go-colorable?branch=master) +[![Codecov](https://codecov.io/gh/mattn/go-colorable/branch/master/graph/badge.svg)](https://codecov.io/gh/mattn/go-colorable) +[![GoDoc](https://godoc.org/github.com/mattn/go-colorable?status.svg)](http://godoc.org/github.com/mattn/go-colorable) [![Go Report Card](https://goreportcard.com/badge/mattn/go-colorable)](https://goreportcard.com/report/mattn/go-colorable) Colorable writer for windows. diff --git a/vendor/github.com/mattn/go-colorable/colorable_appengine.go b/vendor/github.com/mattn/go-colorable/colorable_appengine.go index 1f28d773d..1f7806fe1 100644 --- a/vendor/github.com/mattn/go-colorable/colorable_appengine.go +++ b/vendor/github.com/mattn/go-colorable/colorable_appengine.go @@ -9,7 +9,7 @@ import ( _ "github.com/mattn/go-isatty" ) -// NewColorable return new instance of Writer which handle escape sequence. +// NewColorable returns new instance of Writer which handles escape sequence. func NewColorable(file *os.File) io.Writer { if file == nil { panic("nil passed instead of *os.File to NewColorable()") @@ -18,12 +18,20 @@ func NewColorable(file *os.File) io.Writer { return file } -// NewColorableStdout return new instance of Writer which handle escape sequence for stdout. +// NewColorableStdout returns new instance of Writer which handles escape sequence for stdout. func NewColorableStdout() io.Writer { return os.Stdout } -// NewColorableStderr return new instance of Writer which handle escape sequence for stderr. +// NewColorableStderr returns new instance of Writer which handles escape sequence for stderr. func NewColorableStderr() io.Writer { return os.Stderr } + +// EnableColorsStdout enable colors if possible. +func EnableColorsStdout(enabled *bool) func() { + if enabled != nil { + *enabled = true + } + return func() {} +} diff --git a/vendor/github.com/mattn/go-colorable/colorable_others.go b/vendor/github.com/mattn/go-colorable/colorable_others.go index 887f203dc..08cbd1e0f 100644 --- a/vendor/github.com/mattn/go-colorable/colorable_others.go +++ b/vendor/github.com/mattn/go-colorable/colorable_others.go @@ -10,7 +10,7 @@ import ( _ "github.com/mattn/go-isatty" ) -// NewColorable return new instance of Writer which handle escape sequence. +// NewColorable returns new instance of Writer which handles escape sequence. func NewColorable(file *os.File) io.Writer { if file == nil { panic("nil passed instead of *os.File to NewColorable()") @@ -19,12 +19,20 @@ func NewColorable(file *os.File) io.Writer { return file } -// NewColorableStdout return new instance of Writer which handle escape sequence for stdout. +// NewColorableStdout returns new instance of Writer which handles escape sequence for stdout. func NewColorableStdout() io.Writer { return os.Stdout } -// NewColorableStderr return new instance of Writer which handle escape sequence for stderr. +// NewColorableStderr returns new instance of Writer which handles escape sequence for stderr. func NewColorableStderr() io.Writer { return os.Stderr } + +// EnableColorsStdout enable colors if possible. +func EnableColorsStdout(enabled *bool) func() { + if enabled != nil { + *enabled = true + } + return func() {} +} diff --git a/vendor/github.com/mattn/go-colorable/colorable_windows.go b/vendor/github.com/mattn/go-colorable/colorable_windows.go index e17a5474e..04c4229c4 100644 --- a/vendor/github.com/mattn/go-colorable/colorable_windows.go +++ b/vendor/github.com/mattn/go-colorable/colorable_windows.go @@ -10,6 +10,7 @@ import ( "os" "strconv" "strings" + "sync" "syscall" "unsafe" @@ -27,6 +28,18 @@ const ( backgroundRed = 0x40 backgroundIntensity = 0x80 backgroundMask = (backgroundRed | backgroundBlue | backgroundGreen | backgroundIntensity) + commonLvbUnderscore = 0x8000 + + cENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x4 +) + +const ( + genericRead = 0x80000000 + genericWrite = 0x40000000 +) + +const ( + consoleTextmodeBuffer = 0x1 ) type wchar uint16 @@ -69,23 +82,33 @@ var ( procGetConsoleCursorInfo = kernel32.NewProc("GetConsoleCursorInfo") procSetConsoleCursorInfo = kernel32.NewProc("SetConsoleCursorInfo") procSetConsoleTitle = kernel32.NewProc("SetConsoleTitleW") + procGetConsoleMode = kernel32.NewProc("GetConsoleMode") + procSetConsoleMode = kernel32.NewProc("SetConsoleMode") + procCreateConsoleScreenBuffer = kernel32.NewProc("CreateConsoleScreenBuffer") ) -// Writer provide colorable Writer to the console +// Writer provides colorable Writer to the console type Writer struct { - out io.Writer - handle syscall.Handle - oldattr word - oldpos coord + out io.Writer + handle syscall.Handle + althandle syscall.Handle + oldattr word + oldpos coord + rest bytes.Buffer + mutex sync.Mutex } -// NewColorable return new instance of Writer which handle escape sequence from File. +// NewColorable returns new instance of Writer which handles escape sequence from File. func NewColorable(file *os.File) io.Writer { if file == nil { panic("nil passed instead of *os.File to NewColorable()") } if isatty.IsTerminal(file.Fd()) { + var mode uint32 + if r, _, _ := procGetConsoleMode.Call(file.Fd(), uintptr(unsafe.Pointer(&mode))); r != 0 && mode&cENABLE_VIRTUAL_TERMINAL_PROCESSING != 0 { + return file + } var csbi consoleScreenBufferInfo handle := syscall.Handle(file.Fd()) procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) @@ -94,12 +117,12 @@ func NewColorable(file *os.File) io.Writer { return file } -// NewColorableStdout return new instance of Writer which handle escape sequence for stdout. +// NewColorableStdout returns new instance of Writer which handles escape sequence for stdout. func NewColorableStdout() io.Writer { return NewColorable(os.Stdout) } -// NewColorableStderr return new instance of Writer which handle escape sequence for stderr. +// NewColorableStderr returns new instance of Writer which handles escape sequence for stderr. func NewColorableStderr() io.Writer { return NewColorable(os.Stderr) } @@ -402,12 +425,33 @@ func doTitleSequence(er *bytes.Reader) error { return nil } -// Write write data on console +// returns Atoi(s) unless s == "" in which case it returns def +func atoiWithDefault(s string, def int) (int, error) { + if s == "" { + return def, nil + } + return strconv.Atoi(s) +} + +// Write writes data on console func (w *Writer) Write(data []byte) (n int, err error) { + w.mutex.Lock() + defer w.mutex.Unlock() var csbi consoleScreenBufferInfo procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) - er := bytes.NewReader(data) + handle := w.handle + + var er *bytes.Reader + if w.rest.Len() > 0 { + var rest bytes.Buffer + w.rest.WriteTo(&rest) + w.rest.Reset() + rest.Write(data) + er = bytes.NewReader(rest.Bytes()) + } else { + er = bytes.NewReader(data) + } var bw [1]byte loop: for { @@ -425,91 +469,123 @@ loop: break loop } - if c2 == ']' { - if err := doTitleSequence(er); err != nil { + switch c2 { + case '>': + continue + case ']': + w.rest.WriteByte(c1) + w.rest.WriteByte(c2) + er.WriteTo(&w.rest) + if bytes.IndexByte(w.rest.Bytes(), 0x07) == -1 { break loop } + er = bytes.NewReader(w.rest.Bytes()[2:]) + err := doTitleSequence(er) + if err != nil { + break loop + } + w.rest.Reset() continue - } - if c2 != 0x5b { + // https://github.com/mattn/go-colorable/issues/27 + case '7': + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) + w.oldpos = csbi.cursorPosition + continue + case '8': + procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&w.oldpos))) + continue + case 0x5b: + // execute part after switch + default: continue } + w.rest.WriteByte(c1) + w.rest.WriteByte(c2) + er.WriteTo(&w.rest) + var buf bytes.Buffer var m byte - for { - c, err := er.ReadByte() - if err != nil { - break loop - } + for i, c := range w.rest.Bytes()[2:] { if ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '@' { m = c + er = bytes.NewReader(w.rest.Bytes()[2+i+1:]) + w.rest.Reset() break } buf.Write([]byte(string(c))) } + if m == 0 { + break loop + } switch m { case 'A': - n, err = strconv.Atoi(buf.String()) + n, err = atoiWithDefault(buf.String(), 1) if err != nil { continue } - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) csbi.cursorPosition.y -= short(n) - procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) case 'B': - n, err = strconv.Atoi(buf.String()) + n, err = atoiWithDefault(buf.String(), 1) if err != nil { continue } - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) csbi.cursorPosition.y += short(n) - procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) case 'C': - n, err = strconv.Atoi(buf.String()) + n, err = atoiWithDefault(buf.String(), 1) if err != nil { continue } - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) csbi.cursorPosition.x += short(n) - procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) case 'D': - n, err = strconv.Atoi(buf.String()) + n, err = atoiWithDefault(buf.String(), 1) if err != nil { continue } - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) csbi.cursorPosition.x -= short(n) - procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + if csbi.cursorPosition.x < 0 { + csbi.cursorPosition.x = 0 + } + procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) case 'E': n, err = strconv.Atoi(buf.String()) if err != nil { continue } - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) csbi.cursorPosition.x = 0 csbi.cursorPosition.y += short(n) - procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) case 'F': n, err = strconv.Atoi(buf.String()) if err != nil { continue } - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) csbi.cursorPosition.x = 0 csbi.cursorPosition.y -= short(n) - procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) case 'G': n, err = strconv.Atoi(buf.String()) if err != nil { continue } - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + if n < 1 { + n = 1 + } + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) csbi.cursorPosition.x = short(n - 1) - procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) case 'H', 'f': - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) if buf.Len() > 0 { token := strings.Split(buf.String(), ";") switch len(token) { @@ -534,7 +610,7 @@ loop: } else { csbi.cursorPosition.y = 0 } - procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) case 'J': n := 0 if buf.Len() > 0 { @@ -545,20 +621,20 @@ loop: } var count, written dword var cursor coord - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) switch n { case 0: cursor = coord{x: csbi.cursorPosition.x, y: csbi.cursorPosition.y} - count = dword(csbi.size.x - csbi.cursorPosition.x + (csbi.size.y-csbi.cursorPosition.y)*csbi.size.x) + count = dword(csbi.size.x) - dword(csbi.cursorPosition.x) + dword(csbi.size.y-csbi.cursorPosition.y)*dword(csbi.size.x) case 1: cursor = coord{x: csbi.window.left, y: csbi.window.top} - count = dword(csbi.size.x - csbi.cursorPosition.x + (csbi.window.top-csbi.cursorPosition.y)*csbi.size.x) + count = dword(csbi.size.x) - dword(csbi.cursorPosition.x) + dword(csbi.window.top-csbi.cursorPosition.y)*dword(csbi.size.x) case 2: cursor = coord{x: csbi.window.left, y: csbi.window.top} - count = dword(csbi.size.x - csbi.cursorPosition.x + (csbi.size.y-csbi.cursorPosition.y)*csbi.size.x) + count = dword(csbi.size.x) - dword(csbi.cursorPosition.x) + dword(csbi.size.y-csbi.cursorPosition.y)*dword(csbi.size.x) } - procFillConsoleOutputCharacter.Call(uintptr(w.handle), uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) - procFillConsoleOutputAttribute.Call(uintptr(w.handle), uintptr(csbi.attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) + procFillConsoleOutputCharacter.Call(uintptr(handle), uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) + procFillConsoleOutputAttribute.Call(uintptr(handle), uintptr(csbi.attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) case 'K': n := 0 if buf.Len() > 0 { @@ -567,28 +643,42 @@ loop: continue } } - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) var cursor coord var count, written dword switch n { case 0: - cursor = coord{x: csbi.cursorPosition.x + 1, y: csbi.cursorPosition.y} - count = dword(csbi.size.x - csbi.cursorPosition.x - 1) + cursor = coord{x: csbi.cursorPosition.x, y: csbi.cursorPosition.y} + count = dword(csbi.size.x - csbi.cursorPosition.x) case 1: - cursor = coord{x: csbi.window.left, y: csbi.window.top + csbi.cursorPosition.y} + cursor = coord{x: csbi.window.left, y: csbi.cursorPosition.y} count = dword(csbi.size.x - csbi.cursorPosition.x) case 2: - cursor = coord{x: csbi.window.left, y: csbi.window.top + csbi.cursorPosition.y} + cursor = coord{x: csbi.window.left, y: csbi.cursorPosition.y} count = dword(csbi.size.x) } - procFillConsoleOutputCharacter.Call(uintptr(w.handle), uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) - procFillConsoleOutputAttribute.Call(uintptr(w.handle), uintptr(csbi.attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) + procFillConsoleOutputCharacter.Call(uintptr(handle), uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) + procFillConsoleOutputAttribute.Call(uintptr(handle), uintptr(csbi.attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) + case 'X': + n := 0 + if buf.Len() > 0 { + n, err = strconv.Atoi(buf.String()) + if err != nil { + continue + } + } + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) + var cursor coord + var written dword + cursor = coord{x: csbi.cursorPosition.x, y: csbi.cursorPosition.y} + procFillConsoleOutputCharacter.Call(uintptr(handle), uintptr(' '), uintptr(n), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) + procFillConsoleOutputAttribute.Call(uintptr(handle), uintptr(csbi.attributes), uintptr(n), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) case 'm': - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) attr := csbi.attributes cs := buf.String() if cs == "" { - procSetConsoleTextAttribute.Call(uintptr(w.handle), uintptr(w.oldattr)) + procSetConsoleTextAttribute.Call(uintptr(handle), uintptr(w.oldattr)) continue } token := strings.Split(cs, ";") @@ -598,14 +688,19 @@ loop: switch { case n == 0 || n == 100: attr = w.oldattr - case 1 <= n && n <= 5: - attr |= foregroundIntensity - case n == 7: - attr = ((attr & foregroundMask) << 4) | ((attr & backgroundMask) >> 4) - case n == 22 || n == 25: + case n == 4: + attr |= commonLvbUnderscore + case (1 <= n && n <= 3) || n == 5: attr |= foregroundIntensity - case n == 27: - attr = ((attr & foregroundMask) << 4) | ((attr & backgroundMask) >> 4) + case n == 7 || n == 27: + attr = + (attr &^ (foregroundMask | backgroundMask)) | + ((attr & foregroundMask) << 4) | + ((attr & backgroundMask) >> 4) + case n == 22: + attr &^= foregroundIntensity + case n == 24: + attr &^= commonLvbUnderscore case 30 <= n && n <= 37: attr &= backgroundMask if (n-30)&1 != 0 { @@ -627,6 +722,21 @@ loop: attr |= n256foreAttr[n256] i += 2 } + } else if len(token) == 5 && token[i+1] == "2" { + var r, g, b int + r, _ = strconv.Atoi(token[i+2]) + g, _ = strconv.Atoi(token[i+3]) + b, _ = strconv.Atoi(token[i+4]) + i += 4 + if r > 127 { + attr |= foregroundRed + } + if g > 127 { + attr |= foregroundGreen + } + if b > 127 { + attr |= foregroundBlue + } } else { attr = attr & (w.oldattr & backgroundMask) } @@ -654,6 +764,21 @@ loop: attr |= n256backAttr[n256] i += 2 } + } else if len(token) == 5 && token[i+1] == "2" { + var r, g, b int + r, _ = strconv.Atoi(token[i+2]) + g, _ = strconv.Atoi(token[i+3]) + b, _ = strconv.Atoi(token[i+4]) + i += 4 + if r > 127 { + attr |= backgroundRed + } + if g > 127 { + attr |= backgroundGreen + } + if b > 127 { + attr |= backgroundBlue + } } else { attr = attr & (w.oldattr & foregroundMask) } @@ -685,38 +810,52 @@ loop: attr |= backgroundBlue } } - procSetConsoleTextAttribute.Call(uintptr(w.handle), uintptr(attr)) + procSetConsoleTextAttribute.Call(uintptr(handle), uintptr(attr)) } } case 'h': var ci consoleCursorInfo cs := buf.String() if cs == "5>" { - procGetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) + procGetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) ci.visible = 0 - procSetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) + procSetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) } else if cs == "?25" { - procGetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) + procGetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) ci.visible = 1 - procSetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) + procSetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) + } else if cs == "?1049" { + if w.althandle == 0 { + h, _, _ := procCreateConsoleScreenBuffer.Call(uintptr(genericRead|genericWrite), 0, 0, uintptr(consoleTextmodeBuffer), 0, 0) + w.althandle = syscall.Handle(h) + if w.althandle != 0 { + handle = w.althandle + } + } } case 'l': var ci consoleCursorInfo cs := buf.String() if cs == "5>" { - procGetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) + procGetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) ci.visible = 1 - procSetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) + procSetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) } else if cs == "?25" { - procGetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) + procGetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) ci.visible = 0 - procSetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) + procSetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) + } else if cs == "?1049" { + if w.althandle != 0 { + syscall.CloseHandle(w.althandle) + w.althandle = 0 + handle = w.handle + } } case 's': - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) w.oldpos = csbi.cursorPosition case 'u': - procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&w.oldpos))) + procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&w.oldpos))) } } @@ -882,3 +1021,23 @@ func n256setup() { n256backAttr[i] = c.backgroundAttr() } } + +// EnableColorsStdout enable colors if possible. +func EnableColorsStdout(enabled *bool) func() { + var mode uint32 + h := os.Stdout.Fd() + if r, _, _ := procGetConsoleMode.Call(h, uintptr(unsafe.Pointer(&mode))); r != 0 { + if r, _, _ = procSetConsoleMode.Call(h, uintptr(mode|cENABLE_VIRTUAL_TERMINAL_PROCESSING)); r != 0 { + if enabled != nil { + *enabled = true + } + return func() { + procSetConsoleMode.Call(h, uintptr(mode)) + } + } + } + if enabled != nil { + *enabled = true + } + return func() {} +} diff --git a/vendor/github.com/mattn/go-colorable/go.mod b/vendor/github.com/mattn/go-colorable/go.mod new file mode 100644 index 000000000..1e590b819 --- /dev/null +++ b/vendor/github.com/mattn/go-colorable/go.mod @@ -0,0 +1,8 @@ +module github.com/mattn/go-colorable + +require ( + github.com/mattn/go-isatty v0.0.12 + golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae // indirect +) + +go 1.13 diff --git a/vendor/github.com/mattn/go-colorable/go.sum b/vendor/github.com/mattn/go-colorable/go.sum new file mode 100644 index 000000000..cf5b95d97 --- /dev/null +++ b/vendor/github.com/mattn/go-colorable/go.sum @@ -0,0 +1,5 @@ +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/mattn/go-colorable/go.test.sh b/vendor/github.com/mattn/go-colorable/go.test.sh new file mode 100644 index 000000000..012162b07 --- /dev/null +++ b/vendor/github.com/mattn/go-colorable/go.test.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -e +echo "" > coverage.txt + +for d in $(go list ./... | grep -v vendor); do + go test -race -coverprofile=profile.out -covermode=atomic "$d" + if [ -f profile.out ]; then + cat profile.out >> coverage.txt + rm profile.out + fi +done diff --git a/vendor/github.com/mattn/go-colorable/noncolorable.go b/vendor/github.com/mattn/go-colorable/noncolorable.go index 9721e16f4..95f2c6be2 100644 --- a/vendor/github.com/mattn/go-colorable/noncolorable.go +++ b/vendor/github.com/mattn/go-colorable/noncolorable.go @@ -5,17 +5,17 @@ import ( "io" ) -// NonColorable hold writer but remove escape sequence. +// NonColorable holds writer but removes escape sequence. type NonColorable struct { out io.Writer } -// NewNonColorable return new instance of Writer which remove escape sequence from Writer. +// NewNonColorable returns new instance of Writer which removes escape sequence from Writer. func NewNonColorable(w io.Writer) io.Writer { return &NonColorable{out: w} } -// Write write data on console +// Write writes data on console func (w *NonColorable) Write(data []byte) (n int, err error) { er := bytes.NewReader(data) var bw [1]byte diff --git a/vendor/github.com/mattn/go-isatty/.travis.yml b/vendor/github.com/mattn/go-isatty/.travis.yml index b9f8b239c..604314dd4 100644 --- a/vendor/github.com/mattn/go-isatty/.travis.yml +++ b/vendor/github.com/mattn/go-isatty/.travis.yml @@ -1,9 +1,14 @@ language: go +sudo: false go: + - 1.13.x - tip before_install: - - go get github.com/mattn/goveralls - - go get golang.org/x/tools/cmd/cover + - go get -t -v ./... + script: - - $HOME/gopath/bin/goveralls -repotoken 3gHdORO5k5ziZcWMBxnd9LrMZaJs8m9x5 + - ./go.test.sh + +after_success: + - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/mattn/go-isatty/README.md b/vendor/github.com/mattn/go-isatty/README.md index 1e69004bb..38418353e 100644 --- a/vendor/github.com/mattn/go-isatty/README.md +++ b/vendor/github.com/mattn/go-isatty/README.md @@ -1,7 +1,7 @@ # go-isatty [![Godoc Reference](https://godoc.org/github.com/mattn/go-isatty?status.svg)](http://godoc.org/github.com/mattn/go-isatty) -[![Build Status](https://travis-ci.org/mattn/go-isatty.svg?branch=master)](https://travis-ci.org/mattn/go-isatty) +[![Codecov](https://codecov.io/gh/mattn/go-isatty/branch/master/graph/badge.svg)](https://codecov.io/gh/mattn/go-isatty) [![Coverage Status](https://coveralls.io/repos/github/mattn/go-isatty/badge.svg?branch=master)](https://coveralls.io/github/mattn/go-isatty?branch=master) [![Go Report Card](https://goreportcard.com/badge/mattn/go-isatty)](https://goreportcard.com/report/mattn/go-isatty) diff --git a/vendor/github.com/mattn/go-isatty/go.mod b/vendor/github.com/mattn/go-isatty/go.mod new file mode 100644 index 000000000..605c4c221 --- /dev/null +++ b/vendor/github.com/mattn/go-isatty/go.mod @@ -0,0 +1,5 @@ +module github.com/mattn/go-isatty + +go 1.12 + +require golang.org/x/sys v0.0.0-20200116001909-b77594299b42 diff --git a/vendor/github.com/mattn/go-isatty/go.sum b/vendor/github.com/mattn/go-isatty/go.sum new file mode 100644 index 000000000..912e29cbc --- /dev/null +++ b/vendor/github.com/mattn/go-isatty/go.sum @@ -0,0 +1,2 @@ +golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/mattn/go-isatty/go.test.sh b/vendor/github.com/mattn/go-isatty/go.test.sh new file mode 100644 index 000000000..012162b07 --- /dev/null +++ b/vendor/github.com/mattn/go-isatty/go.test.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -e +echo "" > coverage.txt + +for d in $(go list ./... | grep -v vendor); do + go test -race -coverprofile=profile.out -covermode=atomic "$d" + if [ -f profile.out ]; then + cat profile.out >> coverage.txt + rm profile.out + fi +done diff --git a/vendor/github.com/mattn/go-isatty/isatty_appengine.go b/vendor/github.com/mattn/go-isatty/isatty_appengine.go deleted file mode 100644 index 9584a9884..000000000 --- a/vendor/github.com/mattn/go-isatty/isatty_appengine.go +++ /dev/null @@ -1,15 +0,0 @@ -// +build appengine - -package isatty - -// IsTerminal returns true if the file descriptor is terminal which -// is always false on on appengine classic which is a sandboxed PaaS. -func IsTerminal(fd uintptr) bool { - return false -} - -// IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2 -// terminal. This is also always false on this environment. -func IsCygwinTerminal(fd uintptr) bool { - return false -} diff --git a/vendor/github.com/mattn/go-isatty/isatty_bsd.go b/vendor/github.com/mattn/go-isatty/isatty_bsd.go index 42f2514d1..711f28808 100644 --- a/vendor/github.com/mattn/go-isatty/isatty_bsd.go +++ b/vendor/github.com/mattn/go-isatty/isatty_bsd.go @@ -3,16 +3,16 @@ package isatty -import ( - "syscall" - "unsafe" -) - -const ioctlReadTermios = syscall.TIOCGETA +import "golang.org/x/sys/unix" // IsTerminal return true if the file descriptor is terminal. func IsTerminal(fd uintptr) bool { - var termios syscall.Termios - _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) - return err == 0 + _, err := unix.IoctlGetTermios(int(fd), unix.TIOCGETA) + return err == nil +} + +// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 +// terminal. This is also always false on this environment. +func IsCygwinTerminal(fd uintptr) bool { + return false } diff --git a/vendor/github.com/mattn/go-isatty/isatty_linux.go b/vendor/github.com/mattn/go-isatty/isatty_linux.go deleted file mode 100644 index 7384cf991..000000000 --- a/vendor/github.com/mattn/go-isatty/isatty_linux.go +++ /dev/null @@ -1,18 +0,0 @@ -// +build linux -// +build !appengine,!ppc64,!ppc64le - -package isatty - -import ( - "syscall" - "unsafe" -) - -const ioctlReadTermios = syscall.TCGETS - -// IsTerminal return true if the file descriptor is terminal. -func IsTerminal(fd uintptr) bool { - var termios syscall.Termios - _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) - return err == 0 -} diff --git a/vendor/github.com/mattn/go-isatty/isatty_linux_ppc64x.go b/vendor/github.com/mattn/go-isatty/isatty_linux_ppc64x.go deleted file mode 100644 index 44e5d2130..000000000 --- a/vendor/github.com/mattn/go-isatty/isatty_linux_ppc64x.go +++ /dev/null @@ -1,19 +0,0 @@ -// +build linux -// +build ppc64 ppc64le - -package isatty - -import ( - "unsafe" - - syscall "golang.org/x/sys/unix" -) - -const ioctlReadTermios = syscall.TCGETS - -// IsTerminal return true if the file descriptor is terminal. -func IsTerminal(fd uintptr) bool { - var termios syscall.Termios - _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) - return err == 0 -} diff --git a/vendor/github.com/mattn/go-isatty/isatty_others.go b/vendor/github.com/mattn/go-isatty/isatty_others.go index ff4de3d9a..ff714a376 100644 --- a/vendor/github.com/mattn/go-isatty/isatty_others.go +++ b/vendor/github.com/mattn/go-isatty/isatty_others.go @@ -1,8 +1,13 @@ -// +build !windows -// +build !appengine +// +build appengine js nacl package isatty +// IsTerminal returns true if the file descriptor is terminal which +// is always false on js and appengine classic which is a sandboxed PaaS. +func IsTerminal(fd uintptr) bool { + return false +} + // IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2 // terminal. This is also always false on this environment. func IsCygwinTerminal(fd uintptr) bool { diff --git a/vendor/github.com/mattn/go-isatty/isatty_plan9.go b/vendor/github.com/mattn/go-isatty/isatty_plan9.go new file mode 100644 index 000000000..c5b6e0c08 --- /dev/null +++ b/vendor/github.com/mattn/go-isatty/isatty_plan9.go @@ -0,0 +1,22 @@ +// +build plan9 + +package isatty + +import ( + "syscall" +) + +// IsTerminal returns true if the given file descriptor is a terminal. +func IsTerminal(fd uintptr) bool { + path, err := syscall.Fd2path(int(fd)) + if err != nil { + return false + } + return path == "/dev/cons" || path == "/mnt/term/dev/cons" +} + +// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 +// terminal. This is also always false on this environment. +func IsCygwinTerminal(fd uintptr) bool { + return false +} diff --git a/vendor/github.com/mattn/go-isatty/isatty_solaris.go b/vendor/github.com/mattn/go-isatty/isatty_solaris.go index 1f0c6bf53..bdd5c79a0 100644 --- a/vendor/github.com/mattn/go-isatty/isatty_solaris.go +++ b/vendor/github.com/mattn/go-isatty/isatty_solaris.go @@ -14,3 +14,9 @@ func IsTerminal(fd uintptr) bool { err := unix.IoctlSetTermio(int(fd), unix.TCGETA, &termio) return err == nil } + +// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 +// terminal. This is also always false on this environment. +func IsCygwinTerminal(fd uintptr) bool { + return false +} diff --git a/vendor/github.com/mattn/go-isatty/isatty_tcgets.go b/vendor/github.com/mattn/go-isatty/isatty_tcgets.go new file mode 100644 index 000000000..31a1ca973 --- /dev/null +++ b/vendor/github.com/mattn/go-isatty/isatty_tcgets.go @@ -0,0 +1,18 @@ +// +build linux aix +// +build !appengine + +package isatty + +import "golang.org/x/sys/unix" + +// IsTerminal return true if the file descriptor is terminal. +func IsTerminal(fd uintptr) bool { + _, err := unix.IoctlGetTermios(int(fd), unix.TCGETS) + return err == nil +} + +// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 +// terminal. This is also always false on this environment. +func IsCygwinTerminal(fd uintptr) bool { + return false +} diff --git a/vendor/github.com/mattn/go-isatty/isatty_windows.go b/vendor/github.com/mattn/go-isatty/isatty_windows.go index af51cbcaa..1fa869154 100644 --- a/vendor/github.com/mattn/go-isatty/isatty_windows.go +++ b/vendor/github.com/mattn/go-isatty/isatty_windows.go @@ -4,6 +4,7 @@ package isatty import ( + "errors" "strings" "syscall" "unicode/utf16" @@ -11,15 +12,18 @@ import ( ) const ( - fileNameInfo uintptr = 2 - fileTypePipe = 3 + objectNameInfo uintptr = 1 + fileNameInfo = 2 + fileTypePipe = 3 ) var ( kernel32 = syscall.NewLazyDLL("kernel32.dll") + ntdll = syscall.NewLazyDLL("ntdll.dll") procGetConsoleMode = kernel32.NewProc("GetConsoleMode") procGetFileInformationByHandleEx = kernel32.NewProc("GetFileInformationByHandleEx") procGetFileType = kernel32.NewProc("GetFileType") + procNtQueryObject = ntdll.NewProc("NtQueryObject") ) func init() { @@ -45,7 +49,10 @@ func isCygwinPipeName(name string) bool { return false } - if token[0] != `\msys` && token[0] != `\cygwin` { + if token[0] != `\msys` && + token[0] != `\cygwin` && + token[0] != `\Device\NamedPipe\msys` && + token[0] != `\Device\NamedPipe\cygwin` { return false } @@ -68,11 +75,35 @@ func isCygwinPipeName(name string) bool { return true } +// getFileNameByHandle use the undocomented ntdll NtQueryObject to get file full name from file handler +// since GetFileInformationByHandleEx is not avilable under windows Vista and still some old fashion +// guys are using Windows XP, this is a workaround for those guys, it will also work on system from +// Windows vista to 10 +// see https://stackoverflow.com/a/18792477 for details +func getFileNameByHandle(fd uintptr) (string, error) { + if procNtQueryObject == nil { + return "", errors.New("ntdll.dll: NtQueryObject not supported") + } + + var buf [4 + syscall.MAX_PATH]uint16 + var result int + r, _, e := syscall.Syscall6(procNtQueryObject.Addr(), 5, + fd, objectNameInfo, uintptr(unsafe.Pointer(&buf)), uintptr(2*len(buf)), uintptr(unsafe.Pointer(&result)), 0) + if r != 0 { + return "", e + } + return string(utf16.Decode(buf[4 : 4+buf[0]/2])), nil +} + // IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2 // terminal. func IsCygwinTerminal(fd uintptr) bool { if procGetFileInformationByHandleEx == nil { - return false + name, err := getFileNameByHandle(fd) + if err != nil { + return false + } + return isCygwinPipeName(name) } // Cygwin/msys's pty is a pipe. diff --git a/vendor/github.com/mattn/go-isatty/renovate.json b/vendor/github.com/mattn/go-isatty/renovate.json new file mode 100644 index 000000000..5ae9d96b7 --- /dev/null +++ b/vendor/github.com/mattn/go-isatty/renovate.json @@ -0,0 +1,8 @@ +{ + "extends": [ + "config:base" + ], + "postUpdateOptions": [ + "gomodTidy" + ] +} diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore new file mode 100644 index 000000000..e16fb946b --- /dev/null +++ b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore @@ -0,0 +1 @@ +cover.dat diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile new file mode 100644 index 000000000..81be21437 --- /dev/null +++ b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile @@ -0,0 +1,7 @@ +all: + +cover: + go test -cover -v -coverprofile=cover.dat ./... + go tool cover -func cover.dat + +.PHONY: cover diff --git a/vendor/github.com/mholt/archiver/build.bash b/vendor/github.com/mholt/archiver/build.bash old mode 100755 new mode 100644 diff --git a/vendor/github.com/minio/minio-go/LICENSE b/vendor/github.com/minio/md5-simd/LICENSE similarity index 100% rename from vendor/github.com/minio/minio-go/LICENSE rename to vendor/github.com/minio/md5-simd/LICENSE diff --git a/vendor/github.com/minio/md5-simd/README.md b/vendor/github.com/minio/md5-simd/README.md new file mode 100644 index 000000000..374214d1a --- /dev/null +++ b/vendor/github.com/minio/md5-simd/README.md @@ -0,0 +1,196 @@ + +# md5-simd + +This is a SIMD accelerated MD5 package, allowing up to either 8 (AVX2) or 16 (AVX512) independent MD5 sums to be calculated on a single CPU core. + +It was originally based on the [md5vec](https://github.com/igneous-systems/md5vec) repository by Igneous Systems, but has been made more flexible by amongst others supporting different message sizes per lane and adding AVX512. + +`md5-simd` integrates a similar mechanism as described in [minio/sha256-simd](https://github.com/minio/sha256-simd#support-for-avx512) for making it easy for clients to take advantages of the parallel nature of the MD5 calculation. This will result in reduced overall CPU load. + +It is important to understand that `md5-simd` **does not speed up** a single threaded MD5 hash sum. +Rather it allows multiple __independent__ MD5 sums to be computed in parallel on the same CPU core, +thereby making more efficient usage of the computing resources. + +## Usage + +[![Documentation](https://godoc.org/github.com/minio/md5-simd?status.svg)](https://pkg.go.dev/github.com/minio/md5-simd?tab=doc) + + +In order to use `md5-simd`, you must first create an `Server` which can be +used to instantiate one or more objects for MD5 hashing. + +These objects conform to the regular [`hash.Hash`](https://pkg.go.dev/hash?tab=doc#Hash) interface +and as such the normal Write/Reset/Sum functionality works as expected. + +As an example: +``` + // Create server + server := md5simd.NewServer() + defer server.Close() + + // Create hashing object (conforming to hash.Hash) + md5Hash := server.NewHash() + defer md5Hash.Close() + + // Write one (or more) blocks + md5Hash.Write(block) + + // Return digest + digest := md5Hash.Sum([]byte{}) +``` + +To keep performance both a [Server](https://pkg.go.dev/github.com/minio/md5-simd?tab=doc#Server) +and individual [Hasher](https://pkg.go.dev/github.com/minio/md5-simd?tab=doc#Hasher) should +be closed using the `Close()` function when no longer needed. + +A Hasher can efficiently be re-used by using [`Reset()`](https://pkg.go.dev/hash?tab=doc#Hash) functionality. + +In case your system does not support the instructions required it will fall back to using `crypto/md5` for hashing. + +## Limitations + +As explained above `md5-simd` does not speed up an individual MD5 hash sum computation, +unless some hierarchical tree construct is used but this will result in different outcomes. +Running a single hash on a server results in approximately half the throughput. + +Instead, it allows running multiple MD5 calculations in parallel on a single CPU core. +This can be beneficial in e.g. multi-threaded server applications where many go-routines +are dealing with many requests and multiple MD5 calculations can be packed/scheduled for parallel execution on a single core. + +This will result in a lower overall CPU usage as compared to using the standard `crypto/md5` +functionality where each MD5 hash computation will consume a single thread (core). + +It is best to test and measure the overall CPU usage in a representative usage scenario in your application +to get an overall understanding of the benefits of `md5-simd` as compared to `crypto/md5`, ideally under heavy CPU load. + +Also note that `md5-simd` is best meant to work with large objects, +so if your application only hashes small objects of a few kilobytes +you may be better of by using `crypto/md5`. + +## Performance + +For the best performance writes should be a multiple of 64 bytes, ideally a multiple of 32KB. +To help with that a [`buffered := bufio.NewWriterSize(hasher, 32<<10)`](https://golang.org/pkg/bufio/#NewWriterSize) +can be inserted if you are unsure of the sizes of the writes. +Remember to [flush](https://golang.org/pkg/bufio/#Writer.Flush) `buffered` before reading the hash. + +A single 'server' can process 16 streams concurrently with 1 core (AVX-512) or 2 cores (AVX2). +In situations where it is likely that more than 16 streams are fully loaded it may be beneficial +to use multiple servers. + +The following chart compares the multi-core performance between `crypto/md5` vs the AVX2 vs the AVX512 code: + +![md5-performance-overview](chart/Multi-core-MD5-Aggregated-Hashing-Performance.png) + +Compared to `crypto/md5`, the AVX2 version is up to 4x faster: + +``` +$ benchcmp crypto-md5.txt avx2.txt +benchmark old MB/s new MB/s speedup +BenchmarkParallel/32KB-4 2229.22 7370.50 3.31x +BenchmarkParallel/64KB-4 2233.61 8248.46 3.69x +BenchmarkParallel/128KB-4 2235.43 8660.74 3.87x +BenchmarkParallel/256KB-4 2236.39 8863.87 3.96x +BenchmarkParallel/512KB-4 2238.05 8985.39 4.01x +BenchmarkParallel/1MB-4 2233.56 9042.62 4.05x +BenchmarkParallel/2MB-4 2224.11 9014.46 4.05x +BenchmarkParallel/4MB-4 2199.78 8993.61 4.09x +BenchmarkParallel/8MB-4 2182.48 8748.22 4.01x +``` + +Compared to `crypto/md5`, the AVX512 is up to 8x faster (for larger block sizes): + +``` +$ benchcmp crypto-md5.txt avx512.txt +benchmark old MB/s new MB/s speedup +BenchmarkParallel/32KB-4 2229.22 11605.78 5.21x +BenchmarkParallel/64KB-4 2233.61 14329.65 6.42x +BenchmarkParallel/128KB-4 2235.43 16166.39 7.23x +BenchmarkParallel/256KB-4 2236.39 15570.09 6.96x +BenchmarkParallel/512KB-4 2238.05 16705.83 7.46x +BenchmarkParallel/1MB-4 2233.56 16941.95 7.59x +BenchmarkParallel/2MB-4 2224.11 17136.01 7.70x +BenchmarkParallel/4MB-4 2199.78 17218.61 7.83x +BenchmarkParallel/8MB-4 2182.48 17252.88 7.91x +``` + +These measurements were performed on AWS EC2 instance of type `c5.xlarge` equipped with a Xeon Platinum 8124M CPU at 3.0 GHz. + + +## Operation + +To make operation as easy as possible there is a “Server” coordinating everything. The server keeps track of individual hash states and updates them as new data comes in. This can be visualized as follows: + +![server-architecture](chart/server-architecture.png) + +The data is sent to the server from each hash input in blocks of up to 32KB per round. In our testing we found this to be the block size that yielded the best results. + +Whenever there is data available the server will collect data for up to 16 hashes and process all 16 lanes in parallel. This means that if 16 hashes have data available all the lanes will be filled. However since that may not be the case, the server will fill less lanes and do a round anyway. Lanes can also be partially filled if less than 32KB of data is written. + +![server-lanes-example](chart/server-lanes-example.png) + +In this example 4 lanes are fully filled and 2 lanes are partially filled. In this case the black areas will simply be masked out from the results and ignored. This is also why calculating a single hash on a server will not result in any speedup and hash writes should be a multiple of 32KB for the best performance. + +For AVX512 all 16 calculations will be done on a single core, on AVX2 on 2 cores if there is data for more than 8 lanes. +So for optimal usage there should be data available for all 16 hashes. It may be perfectly reasonable to use more than 16 concurrent hashes. + + +## Design & Tech + +md5-simd has both an AVX2 (8-lane parallel), and an AVX512 (16-lane parallel version) algorithm to accelerate the computation with the following function definitions: +``` +//go:noescape +func block8(state *uint32, base uintptr, bufs *int32, cache *byte, n int) + +//go:noescape +func block16(state *uint32, ptrs *int64, mask uint64, n int) +``` + +The AVX2 version is based on the [md5vec](https://github.com/igneous-systems/md5vec) repository and is essentially unchanged except for minor (cosmetic) changes. + +The AVX512 version is derived from the AVX2 version but adds some further optimizations and simplifications. + +### Caching in upper ZMM registers + +The AVX2 version passes in a `cache8` block of memory (about 0.5 KB) for temporary storage of intermediate results during `ROUND1` which are subsequently used during `ROUND2` through to `ROUND4`. + +Since AVX512 has double the amount of registers (32 ZMM registers as compared to 16 YMM registers), it is possible to use the upper 16 ZMM registers for keeping the intermediate states on the CPU. As such, there is no need to pass in a corresponding `cache16` into the AVX512 block function. + +### Direct loading using 64-bit pointers + +The AVX2 uses the `VPGATHERDD` instruction (for YMM) to do a parallel load of 8 lanes using (8 independent) 32-bit offets. Since there is no control over how the 8 slices that are passed into the (Golang) `blockMd5` function are laid out into memory, it is not possible to derive a "base" address and corresponding offsets (all within 32-bits) for all 8 slices. + +As such the AVX2 version uses an interim buffer to collect the byte slices to be hashed from all 8 inut slices and passed this buffer along with (fixed) 32-bit offsets into the assembly code. + +For the AVX512 version this interim buffer is not needed since the AVX512 code uses a pair of `VPGATHERQD` instructions to directly dereference 64-bit pointers (from a base register address that is initialized to zero). + +Note that two load (gather) instructions are needed because the AVX512 version processes 16-lanes in parallel, requiring 16 times 64-bit = 1024 bits in total to be loaded. A simple `VALIGND` and `VPORD` are subsequently used to merge the lower and upper halves together into a single ZMM register (that contains 16 lanes of 32-bit DWORDS). + +### Masking support + +Due to the fact that pointers are passed directly from the Golang slices, we need to protect against NULL pointers. +For this a 16-bit mask is passed in the AVX512 assembly code which is used during the `VPGATHERQD` instructions to mask out lanes that could otherwise result in segment violations. + +### Minor optimizations + +The `roll` macro (three instructions on AVX2) is no longer needed for AVX512 and is replaced by a single `VPROLD` instruction. + +Also several logical operations from the various ROUNDS of the AVX2 version could be combined into a single instruction using ternary logic (with the `VPTERMLOGD` instruction), resulting in a further simplification and speed-up. + +## Low level block function performance + +The benchmark below shows the (single thread) maximum performance of the `block()` function for AVX2 (having 8 lanes) and AVX512 (having 16 lanes). Also the baseline single-core performance from the standard `crypto/md5` package is shown for comparison. + +``` +BenchmarkCryptoMd5-4 687.66 MB/s 0 B/op 0 allocs/op +BenchmarkBlock8-4 4144.80 MB/s 0 B/op 0 allocs/op +BenchmarkBlock16-4 8228.88 MB/s 0 B/op 0 allocs/op +``` + +## License + +`md5-simd` is released under the Apache License v2.0. You can find the complete text in the file LICENSE. + +## Contributing + +Contributions are welcome, please send PRs for any enhancements. \ No newline at end of file diff --git a/vendor/github.com/minio/md5-simd/block-generic.go b/vendor/github.com/minio/md5-simd/block-generic.go new file mode 100644 index 000000000..eb333b93f --- /dev/null +++ b/vendor/github.com/minio/md5-simd/block-generic.go @@ -0,0 +1,132 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Code generated by go run gen.go -output md5block.go; DO NOT EDIT. + +package md5simd + +import ( + "encoding/binary" + "math/bits" +) + +type digest struct { + s [4]uint32 + x [BlockSize]byte + nx int + len uint64 +} + +func blockGeneric(dig *digest, p []byte) { + // load state + a, b, c, d := dig.s[0], dig.s[1], dig.s[2], dig.s[3] + + for i := 0; i <= len(p)-BlockSize; i += BlockSize { + // eliminate bounds checks on p + q := p[i:] + q = q[:BlockSize:BlockSize] + + // save current state + aa, bb, cc, dd := a, b, c, d + + // load input block + x0 := binary.LittleEndian.Uint32(q[4*0x0:]) + x1 := binary.LittleEndian.Uint32(q[4*0x1:]) + x2 := binary.LittleEndian.Uint32(q[4*0x2:]) + x3 := binary.LittleEndian.Uint32(q[4*0x3:]) + x4 := binary.LittleEndian.Uint32(q[4*0x4:]) + x5 := binary.LittleEndian.Uint32(q[4*0x5:]) + x6 := binary.LittleEndian.Uint32(q[4*0x6:]) + x7 := binary.LittleEndian.Uint32(q[4*0x7:]) + x8 := binary.LittleEndian.Uint32(q[4*0x8:]) + x9 := binary.LittleEndian.Uint32(q[4*0x9:]) + xa := binary.LittleEndian.Uint32(q[4*0xa:]) + xb := binary.LittleEndian.Uint32(q[4*0xb:]) + xc := binary.LittleEndian.Uint32(q[4*0xc:]) + xd := binary.LittleEndian.Uint32(q[4*0xd:]) + xe := binary.LittleEndian.Uint32(q[4*0xe:]) + xf := binary.LittleEndian.Uint32(q[4*0xf:]) + + // round 1 + a = b + bits.RotateLeft32((((c^d)&b)^d)+a+x0+0xd76aa478, 7) + d = a + bits.RotateLeft32((((b^c)&a)^c)+d+x1+0xe8c7b756, 12) + c = d + bits.RotateLeft32((((a^b)&d)^b)+c+x2+0x242070db, 17) + b = c + bits.RotateLeft32((((d^a)&c)^a)+b+x3+0xc1bdceee, 22) + a = b + bits.RotateLeft32((((c^d)&b)^d)+a+x4+0xf57c0faf, 7) + d = a + bits.RotateLeft32((((b^c)&a)^c)+d+x5+0x4787c62a, 12) + c = d + bits.RotateLeft32((((a^b)&d)^b)+c+x6+0xa8304613, 17) + b = c + bits.RotateLeft32((((d^a)&c)^a)+b+x7+0xfd469501, 22) + a = b + bits.RotateLeft32((((c^d)&b)^d)+a+x8+0x698098d8, 7) + d = a + bits.RotateLeft32((((b^c)&a)^c)+d+x9+0x8b44f7af, 12) + c = d + bits.RotateLeft32((((a^b)&d)^b)+c+xa+0xffff5bb1, 17) + b = c + bits.RotateLeft32((((d^a)&c)^a)+b+xb+0x895cd7be, 22) + a = b + bits.RotateLeft32((((c^d)&b)^d)+a+xc+0x6b901122, 7) + d = a + bits.RotateLeft32((((b^c)&a)^c)+d+xd+0xfd987193, 12) + c = d + bits.RotateLeft32((((a^b)&d)^b)+c+xe+0xa679438e, 17) + b = c + bits.RotateLeft32((((d^a)&c)^a)+b+xf+0x49b40821, 22) + + // round 2 + a = b + bits.RotateLeft32((((b^c)&d)^c)+a+x1+0xf61e2562, 5) + d = a + bits.RotateLeft32((((a^b)&c)^b)+d+x6+0xc040b340, 9) + c = d + bits.RotateLeft32((((d^a)&b)^a)+c+xb+0x265e5a51, 14) + b = c + bits.RotateLeft32((((c^d)&a)^d)+b+x0+0xe9b6c7aa, 20) + a = b + bits.RotateLeft32((((b^c)&d)^c)+a+x5+0xd62f105d, 5) + d = a + bits.RotateLeft32((((a^b)&c)^b)+d+xa+0x02441453, 9) + c = d + bits.RotateLeft32((((d^a)&b)^a)+c+xf+0xd8a1e681, 14) + b = c + bits.RotateLeft32((((c^d)&a)^d)+b+x4+0xe7d3fbc8, 20) + a = b + bits.RotateLeft32((((b^c)&d)^c)+a+x9+0x21e1cde6, 5) + d = a + bits.RotateLeft32((((a^b)&c)^b)+d+xe+0xc33707d6, 9) + c = d + bits.RotateLeft32((((d^a)&b)^a)+c+x3+0xf4d50d87, 14) + b = c + bits.RotateLeft32((((c^d)&a)^d)+b+x8+0x455a14ed, 20) + a = b + bits.RotateLeft32((((b^c)&d)^c)+a+xd+0xa9e3e905, 5) + d = a + bits.RotateLeft32((((a^b)&c)^b)+d+x2+0xfcefa3f8, 9) + c = d + bits.RotateLeft32((((d^a)&b)^a)+c+x7+0x676f02d9, 14) + b = c + bits.RotateLeft32((((c^d)&a)^d)+b+xc+0x8d2a4c8a, 20) + + // round 3 + a = b + bits.RotateLeft32((b^c^d)+a+x5+0xfffa3942, 4) + d = a + bits.RotateLeft32((a^b^c)+d+x8+0x8771f681, 11) + c = d + bits.RotateLeft32((d^a^b)+c+xb+0x6d9d6122, 16) + b = c + bits.RotateLeft32((c^d^a)+b+xe+0xfde5380c, 23) + a = b + bits.RotateLeft32((b^c^d)+a+x1+0xa4beea44, 4) + d = a + bits.RotateLeft32((a^b^c)+d+x4+0x4bdecfa9, 11) + c = d + bits.RotateLeft32((d^a^b)+c+x7+0xf6bb4b60, 16) + b = c + bits.RotateLeft32((c^d^a)+b+xa+0xbebfbc70, 23) + a = b + bits.RotateLeft32((b^c^d)+a+xd+0x289b7ec6, 4) + d = a + bits.RotateLeft32((a^b^c)+d+x0+0xeaa127fa, 11) + c = d + bits.RotateLeft32((d^a^b)+c+x3+0xd4ef3085, 16) + b = c + bits.RotateLeft32((c^d^a)+b+x6+0x04881d05, 23) + a = b + bits.RotateLeft32((b^c^d)+a+x9+0xd9d4d039, 4) + d = a + bits.RotateLeft32((a^b^c)+d+xc+0xe6db99e5, 11) + c = d + bits.RotateLeft32((d^a^b)+c+xf+0x1fa27cf8, 16) + b = c + bits.RotateLeft32((c^d^a)+b+x2+0xc4ac5665, 23) + + // round 4 + a = b + bits.RotateLeft32((c^(b|^d))+a+x0+0xf4292244, 6) + d = a + bits.RotateLeft32((b^(a|^c))+d+x7+0x432aff97, 10) + c = d + bits.RotateLeft32((a^(d|^b))+c+xe+0xab9423a7, 15) + b = c + bits.RotateLeft32((d^(c|^a))+b+x5+0xfc93a039, 21) + a = b + bits.RotateLeft32((c^(b|^d))+a+xc+0x655b59c3, 6) + d = a + bits.RotateLeft32((b^(a|^c))+d+x3+0x8f0ccc92, 10) + c = d + bits.RotateLeft32((a^(d|^b))+c+xa+0xffeff47d, 15) + b = c + bits.RotateLeft32((d^(c|^a))+b+x1+0x85845dd1, 21) + a = b + bits.RotateLeft32((c^(b|^d))+a+x8+0x6fa87e4f, 6) + d = a + bits.RotateLeft32((b^(a|^c))+d+xf+0xfe2ce6e0, 10) + c = d + bits.RotateLeft32((a^(d|^b))+c+x6+0xa3014314, 15) + b = c + bits.RotateLeft32((d^(c|^a))+b+xd+0x4e0811a1, 21) + a = b + bits.RotateLeft32((c^(b|^d))+a+x4+0xf7537e82, 6) + d = a + bits.RotateLeft32((b^(a|^c))+d+xb+0xbd3af235, 10) + c = d + bits.RotateLeft32((a^(d|^b))+c+x2+0x2ad7d2bb, 15) + b = c + bits.RotateLeft32((d^(c|^a))+b+x9+0xeb86d391, 21) + + // add saved state + a += aa + b += bb + c += cc + d += dd + } + + // save state + dig.s[0], dig.s[1], dig.s[2], dig.s[3] = a, b, c, d +} diff --git a/vendor/github.com/minio/md5-simd/block16_amd64.s b/vendor/github.com/minio/md5-simd/block16_amd64.s new file mode 100644 index 000000000..d32c12200 --- /dev/null +++ b/vendor/github.com/minio/md5-simd/block16_amd64.s @@ -0,0 +1,227 @@ +// Copyright (c) 2020 MinIO Inc. All rights reserved. +// Use of this source code is governed by a license that can be +// found in the LICENSE file. + +// This is the AVX512 implementation of the MD5 block function (16-way parallel) + +#define prep(index) \ + KMOVQ kmask, ktmp \ + VPGATHERDD index*4(base)(ptrs*1), ktmp, mem + +#define ROUND1(a, b, c, d, index, const, shift) \ + VXORPS c, tmp, tmp \ + VPADDD 64*const(consts), a, a \ + VPADDD mem, a, a \ + VPTERNLOGD $0x6C, b, d, tmp \ + prep(index) \ + VPADDD tmp, a, a \ + VPROLD $shift, a, a \ + VMOVAPD c, tmp \ + VPADDD b, a, a + +#define ROUND1noload(a, b, c, d, const, shift) \ + VXORPS c, tmp, tmp \ + VPADDD 64*const(consts), a, a \ + VPADDD mem, a, a \ + VPTERNLOGD $0x6C, b, d, tmp \ + VPADDD tmp, a, a \ + VPROLD $shift, a, a \ + VMOVAPD c, tmp \ + VPADDD b, a, a + +#define ROUND2(a, b, c, d, zreg, const, shift) \ + VPADDD 64*const(consts), a, a \ + VPADDD zreg, a, a \ + VANDNPS c, tmp, tmp \ + VPTERNLOGD $0xEC, b, tmp, tmp2 \ + VMOVAPD c, tmp \ + VPADDD tmp2, a, a \ + VMOVAPD c, tmp2 \ + VPROLD $shift, a, a \ + VPADDD b, a, a + +#define ROUND3(a, b, c, d, zreg, const, shift) \ + VPADDD 64*const(consts), a, a \ + VPADDD zreg, a, a \ + VPTERNLOGD $0x96, b, d, tmp \ + VPADDD tmp, a, a \ + VPROLD $shift, a, a \ + VMOVAPD b, tmp \ + VPADDD b, a, a + +#define ROUND4(a, b, c, d, zreg, const, shift) \ + VPADDD 64*const(consts), a, a \ + VPADDD zreg, a, a \ + VPTERNLOGD $0x36, b, c, tmp \ + VPADDD tmp, a, a \ + VPROLD $shift, a, a \ + VXORPS c, ones, tmp \ + VPADDD b, a, a + +TEXT ·block16(SB),4,$0-40 + + MOVQ state+0(FP), BX + MOVQ base+8(FP), SI + MOVQ ptrs+16(FP), AX + KMOVQ mask+24(FP), K1 + MOVQ n+32(FP), DX + MOVQ ·avx512md5consts+0(SB), DI + +#define a Z0 +#define b Z1 +#define c Z2 +#define d Z3 + +#define sa Z4 +#define sb Z5 +#define sc Z6 +#define sd Z7 + +#define tmp Z8 +#define tmp2 Z9 +#define ptrs Z10 +#define ones Z12 +#define mem Z15 + +#define kmask K1 +#define ktmp K3 + +// ---------------------------------------------------------- +// Registers Z16 through to Z31 are used for caching purposes +// ---------------------------------------------------------- + + +#define dig BX +#define count DX +#define base SI +#define consts DI + + // load digest into state registers + VMOVUPD (dig), a + VMOVUPD 0x40(dig), b + VMOVUPD 0x80(dig), c + VMOVUPD 0xc0(dig), d + + // load source pointers + VMOVUPD 0x00(AX), ptrs + + MOVQ $-1, AX + VPBROADCASTQ AX, ones + +loop: + VMOVAPD a, sa + VMOVAPD b, sb + VMOVAPD c, sc + VMOVAPD d, sd + + prep(0) + VMOVAPD d, tmp + VMOVAPD mem, Z16 + + ROUND1(a,b,c,d, 1,0x00, 7) + VMOVAPD mem, Z17 + ROUND1(d,a,b,c, 2,0x01,12) + VMOVAPD mem, Z18 + ROUND1(c,d,a,b, 3,0x02,17) + VMOVAPD mem, Z19 + ROUND1(b,c,d,a, 4,0x03,22) + VMOVAPD mem, Z20 + ROUND1(a,b,c,d, 5,0x04, 7) + VMOVAPD mem, Z21 + ROUND1(d,a,b,c, 6,0x05,12) + VMOVAPD mem, Z22 + ROUND1(c,d,a,b, 7,0x06,17) + VMOVAPD mem, Z23 + ROUND1(b,c,d,a, 8,0x07,22) + VMOVAPD mem, Z24 + ROUND1(a,b,c,d, 9,0x08, 7) + VMOVAPD mem, Z25 + ROUND1(d,a,b,c,10,0x09,12) + VMOVAPD mem, Z26 + ROUND1(c,d,a,b,11,0x0a,17) + VMOVAPD mem, Z27 + ROUND1(b,c,d,a,12,0x0b,22) + VMOVAPD mem, Z28 + ROUND1(a,b,c,d,13,0x0c, 7) + VMOVAPD mem, Z29 + ROUND1(d,a,b,c,14,0x0d,12) + VMOVAPD mem, Z30 + ROUND1(c,d,a,b,15,0x0e,17) + VMOVAPD mem, Z31 + + ROUND1noload(b,c,d,a, 0x0f,22) + + VMOVAPD d, tmp + VMOVAPD d, tmp2 + + ROUND2(a,b,c,d, Z17,0x10, 5) + ROUND2(d,a,b,c, Z22,0x11, 9) + ROUND2(c,d,a,b, Z27,0x12,14) + ROUND2(b,c,d,a, Z16,0x13,20) + ROUND2(a,b,c,d, Z21,0x14, 5) + ROUND2(d,a,b,c, Z26,0x15, 9) + ROUND2(c,d,a,b, Z31,0x16,14) + ROUND2(b,c,d,a, Z20,0x17,20) + ROUND2(a,b,c,d, Z25,0x18, 5) + ROUND2(d,a,b,c, Z30,0x19, 9) + ROUND2(c,d,a,b, Z19,0x1a,14) + ROUND2(b,c,d,a, Z24,0x1b,20) + ROUND2(a,b,c,d, Z29,0x1c, 5) + ROUND2(d,a,b,c, Z18,0x1d, 9) + ROUND2(c,d,a,b, Z23,0x1e,14) + ROUND2(b,c,d,a, Z28,0x1f,20) + + VMOVAPD c, tmp + + ROUND3(a,b,c,d, Z21,0x20, 4) + ROUND3(d,a,b,c, Z24,0x21,11) + ROUND3(c,d,a,b, Z27,0x22,16) + ROUND3(b,c,d,a, Z30,0x23,23) + ROUND3(a,b,c,d, Z17,0x24, 4) + ROUND3(d,a,b,c, Z20,0x25,11) + ROUND3(c,d,a,b, Z23,0x26,16) + ROUND3(b,c,d,a, Z26,0x27,23) + ROUND3(a,b,c,d, Z29,0x28, 4) + ROUND3(d,a,b,c, Z16,0x29,11) + ROUND3(c,d,a,b, Z19,0x2a,16) + ROUND3(b,c,d,a, Z22,0x2b,23) + ROUND3(a,b,c,d, Z25,0x2c, 4) + ROUND3(d,a,b,c, Z28,0x2d,11) + ROUND3(c,d,a,b, Z31,0x2e,16) + ROUND3(b,c,d,a, Z18,0x2f,23) + + VXORPS d, ones, tmp + + ROUND4(a,b,c,d, Z16,0x30, 6) + ROUND4(d,a,b,c, Z23,0x31,10) + ROUND4(c,d,a,b, Z30,0x32,15) + ROUND4(b,c,d,a, Z21,0x33,21) + ROUND4(a,b,c,d, Z28,0x34, 6) + ROUND4(d,a,b,c, Z19,0x35,10) + ROUND4(c,d,a,b, Z26,0x36,15) + ROUND4(b,c,d,a, Z17,0x37,21) + ROUND4(a,b,c,d, Z24,0x38, 6) + ROUND4(d,a,b,c, Z31,0x39,10) + ROUND4(c,d,a,b, Z22,0x3a,15) + ROUND4(b,c,d,a, Z29,0x3b,21) + ROUND4(a,b,c,d, Z20,0x3c, 6) + ROUND4(d,a,b,c, Z27,0x3d,10) + ROUND4(c,d,a,b, Z18,0x3e,15) + ROUND4(b,c,d,a, Z25,0x3f,21) + + VPADDD sa, a, a + VPADDD sb, b, b + VPADDD sc, c, c + VPADDD sd, d, d + + LEAQ 64(base), base + SUBQ $64, count + JNE loop + + VMOVUPD a, (dig) + VMOVUPD b, 0x40(dig) + VMOVUPD c, 0x80(dig) + VMOVUPD d, 0xc0(dig) + + VZEROUPPER + RET diff --git a/vendor/github.com/minio/md5-simd/block8_amd64.s b/vendor/github.com/minio/md5-simd/block8_amd64.s new file mode 100644 index 000000000..f5f1d9cab --- /dev/null +++ b/vendor/github.com/minio/md5-simd/block8_amd64.s @@ -0,0 +1,279 @@ +// Copyright (c) 2018 Igneous Systems +// MIT License +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +// Copyright (c) 2020 MinIO Inc. All rights reserved. +// Use of this source code is governed by a license that can be +// found in the LICENSE file. + +// This is the AVX2 implementation of the MD5 block function (8-way parallel) + +// block8(state *uint64, base uintptr, bufs *int32, cache *byte, n int) +TEXT ·block8(SB), 4, $0-40 + MOVQ state+0(FP), BX + MOVQ base+8(FP), SI + MOVQ bufs+16(FP), AX + MOVQ cache+24(FP), CX + MOVQ n+32(FP), DX + MOVQ ·avx256md5consts+0(SB), DI + + // Align cache (which is stack allocated by the compiler) + // to a 256 bit boundary (ymm register alignment) + // The cache8 type is deliberately oversized to permit this. + ADDQ $31, CX + ANDB $-32, CL + +#define a Y0 +#define b Y1 +#define c Y2 +#define d Y3 + +#define sa Y4 +#define sb Y5 +#define sc Y6 +#define sd Y7 + +#define tmp Y8 +#define tmp2 Y9 + +#define mask Y10 +#define off Y11 + +#define ones Y12 + +#define rtmp1 Y13 +#define rtmp2 Y14 + +#define mem Y15 + +#define dig BX +#define cache CX +#define count DX +#define base SI +#define consts DI + +#define prepmask \ + VXORPS mask, mask, mask \ + VPCMPGTD mask, off, mask + +#define prep(index) \ + VMOVAPD mask, rtmp2 \ + VPGATHERDD rtmp2, index*4(base)(off*1), mem + +#define load(index) \ + VMOVAPD index*32(cache), mem + +#define store(index) \ + VMOVAPD mem, index*32(cache) + +#define roll(shift, a) \ + VPSLLD $shift, a, rtmp1 \ + VPSRLD $32-shift, a, a \ + VORPS rtmp1, a, a + +#define ROUND1(a, b, c, d, index, const, shift) \ + VXORPS c, tmp, tmp \ + VPADDD 32*const(consts), a, a \ + VPADDD mem, a, a \ + VANDPS b, tmp, tmp \ + VXORPS d, tmp, tmp \ + prep(index) \ + VPADDD tmp, a, a \ + roll(shift,a) \ + VMOVAPD c, tmp \ + VPADDD b, a, a + +#define ROUND1load(a, b, c, d, index, const, shift) \ + VXORPS c, tmp, tmp \ + VPADDD 32*const(consts), a, a \ + VPADDD mem, a, a \ + VANDPS b, tmp, tmp \ + VXORPS d, tmp, tmp \ + load(index) \ + VPADDD tmp, a, a \ + roll(shift,a) \ + VMOVAPD c, tmp \ + VPADDD b, a, a + +#define ROUND2(a, b, c, d, index, const, shift) \ + VPADDD 32*const(consts), a, a \ + VPADDD mem, a, a \ + VANDPS b, tmp2, tmp2 \ + VANDNPS c, tmp, tmp \ + load(index) \ + VORPS tmp, tmp2, tmp2 \ + VMOVAPD c, tmp \ + VPADDD tmp2, a, a \ + VMOVAPD c, tmp2 \ + roll(shift,a) \ + VPADDD b, a, a + +#define ROUND3(a, b, c, d, index, const, shift) \ + VPADDD 32*const(consts), a, a \ + VPADDD mem, a, a \ + load(index) \ + VXORPS d, tmp, tmp \ + VXORPS b, tmp, tmp \ + VPADDD tmp, a, a \ + roll(shift,a) \ + VMOVAPD b, tmp \ + VPADDD b, a, a + +#define ROUND4(a, b, c, d, index, const, shift) \ + VPADDD 32*const(consts), a, a \ + VPADDD mem, a, a \ + VORPS b, tmp, tmp \ + VXORPS c, tmp, tmp \ + VPADDD tmp, a, a \ + load(index) \ + roll(shift,a) \ + VXORPS c, ones, tmp \ + VPADDD b, a, a + + // load digest into state registers + VMOVUPD (dig), a + VMOVUPD 32(dig), b + VMOVUPD 64(dig), c + VMOVUPD 96(dig), d + + // load source buffer offsets + VMOVUPD (AX), off + + prepmask + VPCMPEQD ones, ones, ones + +loop: + VMOVAPD a, sa + VMOVAPD b, sb + VMOVAPD c, sc + VMOVAPD d, sd + + prep(0) + VMOVAPD d, tmp + store(0) + + ROUND1(a,b,c,d, 1,0x00, 7) + store(1) + ROUND1(d,a,b,c, 2,0x01,12) + store(2) + ROUND1(c,d,a,b, 3,0x02,17) + store(3) + ROUND1(b,c,d,a, 4,0x03,22) + store(4) + ROUND1(a,b,c,d, 5,0x04, 7) + store(5) + ROUND1(d,a,b,c, 6,0x05,12) + store(6) + ROUND1(c,d,a,b, 7,0x06,17) + store(7) + ROUND1(b,c,d,a, 8,0x07,22) + store(8) + ROUND1(a,b,c,d, 9,0x08, 7) + store(9) + ROUND1(d,a,b,c,10,0x09,12) + store(10) + ROUND1(c,d,a,b,11,0x0a,17) + store(11) + ROUND1(b,c,d,a,12,0x0b,22) + store(12) + ROUND1(a,b,c,d,13,0x0c, 7) + store(13) + ROUND1(d,a,b,c,14,0x0d,12) + store(14) + ROUND1(c,d,a,b,15,0x0e,17) + store(15) + ROUND1load(b,c,d,a, 1,0x0f,22) + + VMOVAPD d, tmp + VMOVAPD d, tmp2 + + ROUND2(a,b,c,d, 6,0x10, 5) + ROUND2(d,a,b,c,11,0x11, 9) + ROUND2(c,d,a,b, 0,0x12,14) + ROUND2(b,c,d,a, 5,0x13,20) + ROUND2(a,b,c,d,10,0x14, 5) + ROUND2(d,a,b,c,15,0x15, 9) + ROUND2(c,d,a,b, 4,0x16,14) + ROUND2(b,c,d,a, 9,0x17,20) + ROUND2(a,b,c,d,14,0x18, 5) + ROUND2(d,a,b,c, 3,0x19, 9) + ROUND2(c,d,a,b, 8,0x1a,14) + ROUND2(b,c,d,a,13,0x1b,20) + ROUND2(a,b,c,d, 2,0x1c, 5) + ROUND2(d,a,b,c, 7,0x1d, 9) + ROUND2(c,d,a,b,12,0x1e,14) + ROUND2(b,c,d,a, 0,0x1f,20) + + load(5) + VMOVAPD c, tmp + + ROUND3(a,b,c,d, 8,0x20, 4) + ROUND3(d,a,b,c,11,0x21,11) + ROUND3(c,d,a,b,14,0x22,16) + ROUND3(b,c,d,a, 1,0x23,23) + ROUND3(a,b,c,d, 4,0x24, 4) + ROUND3(d,a,b,c, 7,0x25,11) + ROUND3(c,d,a,b,10,0x26,16) + ROUND3(b,c,d,a,13,0x27,23) + ROUND3(a,b,c,d, 0,0x28, 4) + ROUND3(d,a,b,c, 3,0x29,11) + ROUND3(c,d,a,b, 6,0x2a,16) + ROUND3(b,c,d,a, 9,0x2b,23) + ROUND3(a,b,c,d,12,0x2c, 4) + ROUND3(d,a,b,c,15,0x2d,11) + ROUND3(c,d,a,b, 2,0x2e,16) + ROUND3(b,c,d,a, 0,0x2f,23) + + load(0) + VXORPS d, ones, tmp + + ROUND4(a,b,c,d, 7,0x30, 6) + ROUND4(d,a,b,c,14,0x31,10) + ROUND4(c,d,a,b, 5,0x32,15) + ROUND4(b,c,d,a,12,0x33,21) + ROUND4(a,b,c,d, 3,0x34, 6) + ROUND4(d,a,b,c,10,0x35,10) + ROUND4(c,d,a,b, 1,0x36,15) + ROUND4(b,c,d,a, 8,0x37,21) + ROUND4(a,b,c,d,15,0x38, 6) + ROUND4(d,a,b,c, 6,0x39,10) + ROUND4(c,d,a,b,13,0x3a,15) + ROUND4(b,c,d,a, 4,0x3b,21) + ROUND4(a,b,c,d,11,0x3c, 6) + ROUND4(d,a,b,c, 2,0x3d,10) + ROUND4(c,d,a,b, 9,0x3e,15) + ROUND4(b,c,d,a, 0,0x3f,21) + + VPADDD sa, a, a + VPADDD sb, b, b + VPADDD sc, c, c + VPADDD sd, d, d + + LEAQ 64(base), base + SUBQ $64, count + JNE loop + + VMOVUPD a, (dig) + VMOVUPD b, 32(dig) + VMOVUPD c, 64(dig) + VMOVUPD d, 96(dig) + + VZEROUPPER + RET diff --git a/vendor/github.com/minio/md5-simd/block_amd64.go b/vendor/github.com/minio/md5-simd/block_amd64.go new file mode 100644 index 000000000..27d6ce00e --- /dev/null +++ b/vendor/github.com/minio/md5-simd/block_amd64.go @@ -0,0 +1,199 @@ +//+build !noasm,!appengine,gc + +// Copyright (c) 2020 MinIO Inc. All rights reserved. +// Use of this source code is governed by a license that can be +// found in the LICENSE file. + +package md5simd + +import ( + "fmt" + "math" + "sync" + "unsafe" + + "github.com/klauspost/cpuid" +) + +var hasAVX512 bool + +//go:noescape +func block8(state *uint32, base uintptr, bufs *int32, cache *byte, n int) + +//go:noescape +func block16(state *uint32, base uintptr, ptrs *int32, mask uint64, n int) + +// 8-way 4x uint32 digests in 4 ymm registers +// (ymm0, ymm1, ymm2, ymm3) +type digest8 struct { + v0, v1, v2, v3 [8]uint32 +} + +// Stack cache for 8x64 byte md5.BlockSize bytes. +// Must be 32-byte aligned, so allocate 512+32 and +// align upwards at runtime. +type cache8 [512 + 32]byte + +// MD5 magic numbers for one lane of hashing; inflated +// 8x below at init time. +var md5consts = [64]uint32{ + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391, +} + +// inflate the consts 8-way for 8x md5 (256 bit ymm registers) +var avx256md5consts = func(c []uint32) []uint32 { + inf := make([]uint32, 8*len(c)) + for i := range c { + for j := 0; j < 8; j++ { + inf[(i*8)+j] = c[i] + } + } + return inf +}(md5consts[:]) + +// 16-way 4x uint32 digests in 4 zmm registers +type digest16 struct { + v0, v1, v2, v3 [16]uint32 +} + +// inflate the consts 16-way for 16x md5 (512 bit zmm registers) +var avx512md5consts = func(c []uint32) []uint32 { + inf := make([]uint32, 16*len(c)) + for i := range c { + for j := 0; j < 16; j++ { + inf[(i*16)+j] = c[i] + } + } + return inf +}(md5consts[:]) + +func init() { + hasAVX512 = cpuid.CPU.AVX512F() +} + +// Interface function to assembly code +func (s *md5Server) blockMd5_x16(d *digest16, input [16][]byte, half bool) { + if hasAVX512 { + blockMd5_avx512(d, input, s.allBufs, &s.maskRounds16) + } else { + d8a, d8b := digest8{}, digest8{} + for i := range d8a.v0 { + j := i + 8 + d8a.v0[i], d8a.v1[i], d8a.v2[i], d8a.v3[i] = d.v0[i], d.v1[i], d.v2[i], d.v3[i] + if !half { + d8b.v0[i], d8b.v1[i], d8b.v2[i], d8b.v3[i] = d.v0[j], d.v1[j], d.v2[j], d.v3[j] + } + } + + i8 := [2][8][]byte{} + for i := range i8[0] { + i8[0][i], i8[1][i] = input[i], input[8+i] + } + if half { + blockMd5_avx2(&d8a, i8[0], s.allBufs, &s.maskRounds8a) + } else { + wg := sync.WaitGroup{} + wg.Add(2) + go func() { blockMd5_avx2(&d8a, i8[0], s.allBufs, &s.maskRounds8a); wg.Done() }() + go func() { blockMd5_avx2(&d8b, i8[1], s.allBufs, &s.maskRounds8b); wg.Done() }() + wg.Wait() + } + + for i := range d8a.v0 { + j := i + 8 + d.v0[i], d.v1[i], d.v2[i], d.v3[i] = d8a.v0[i], d8a.v1[i], d8a.v2[i], d8a.v3[i] + if !half { + d.v0[j], d.v1[j], d.v2[j], d.v3[j] = d8b.v0[i], d8b.v1[i], d8b.v2[i], d8b.v3[i] + } + } + } +} + +// Interface function to AVX512 assembly code +func blockMd5_avx512(s *digest16, input [16][]byte, base []byte, maskRounds *[16]maskRounds) { + baseMin := uint64(uintptr(unsafe.Pointer(&(base[0])))) + ptrs := [16]int32{} + + for i := range ptrs { + if len(input[i]) > 0 { + if len(input[i]) > internalBlockSize { + panic(fmt.Sprintf("Sanity check fails for lane %d: maximum input length cannot exceed internalBlockSize", i)) + } + + off := uint64(uintptr(unsafe.Pointer(&(input[i][0])))) - baseMin + if off > math.MaxUint32 { + panic(fmt.Sprintf("invalid buffer sent with offset %x", off)) + } + ptrs[i] = int32(off) + } + } + + sdup := *s // create copy of initial states to receive intermediate updates + + rounds := generateMaskAndRounds16(input, maskRounds) + + for r := 0; r < rounds; r++ { + m := maskRounds[r] + + block16(&sdup.v0[0], uintptr(baseMin), &ptrs[0], m.mask, int(64*m.rounds)) + + for j := 0; j < len(ptrs); j++ { + ptrs[j] += int32(64 * m.rounds) // update pointers for next round + if m.mask&(1< 0 { + if len(input[i]) > internalBlockSize { + panic(fmt.Sprintf("Sanity check fails for lane %d: maximum input length cannot exceed internalBlockSize", i)) + } + + off := uint64(uintptr(unsafe.Pointer(&(input[i][0])))) - baseMin + if off > math.MaxUint32 { + panic(fmt.Sprintf("invalid buffer sent with offset %x", off)) + } + ptrs[i] = int32(off) + } + } + + sdup := *s // create copy of initial states to receive intermediate updates + + rounds := generateMaskAndRounds8(input, maskRounds) + + for r := 0; r < rounds; r++ { + m := maskRounds[r] + var cache cache8 // stack storage for block8 tmp state + block8(&sdup.v0[0], uintptr(baseMin), &ptrs[0], &cache[0], int(64*m.rounds)) + + for j := 0; j < len(ptrs); j++ { + ptrs[j] += int32(64 * m.rounds) // update pointers for next round + if m.mask&(1< internalBlockSize { + l = internalBlockSize + } + nnn, err := d.write(p[:l]) + if err != nil { + return nn, err + } + nn += nnn + p = p[l:] + + if len(p) == 0 { + break + } + + } + return +} + +func (d *md5Digest) write(p []byte) (nn int, err error) { + + nn = len(p) + d.len += uint64(nn) + if d.nx > 0 { + n := copy(d.x[d.nx:], p) + d.nx += n + if d.nx == BlockSize { + // Create a copy of the overflow buffer in order to send it async over the channel + // (since we will modify the overflow buffer down below with any access beyond multiples of 64) + tmp := <-d.buffers + tmp = tmp[:BlockSize] + copy(tmp, d.x[:]) + d.sendBlock(blockInput{uid: d.uid, msg: tmp}, len(p)-n < BlockSize) + d.nx = 0 + } + p = p[n:] + } + if len(p) >= BlockSize { + n := len(p) &^ (BlockSize - 1) + buf := <-d.buffers + buf = buf[:n] + copy(buf, p) + d.sendBlock(blockInput{uid: d.uid, msg: buf}, len(p)-n < BlockSize) + p = p[n:] + } + if len(p) > 0 { + d.nx = copy(d.x[:], p) + } + return +} + +func (d *md5Digest) Close() { + if d.blocksCh != nil { + close(d.blocksCh) + d.blocksCh = nil + } +} + +// Sum - Return MD5 sum in bytes +func (d *md5Digest) Sum(in []byte) (result []byte) { + if d.blocksCh == nil { + panic("sum after close") + } + + trail := <-d.buffers + trail = append(trail[:0], d.x[:d.nx]...) + + length := d.len + // Padding. Add a 1 bit and 0 bits until 56 bytes mod 64. + var tmp [64]byte + tmp[0] = 0x80 + if length%64 < 56 { + trail = append(trail, tmp[0:56-length%64]...) + } else { + trail = append(trail, tmp[0:64+56-length%64]...) + } + + // Length in bits. + length <<= 3 + binary.LittleEndian.PutUint64(tmp[:], length) // append length in bits + + trail = append(trail, tmp[0:8]...) + if len(trail)%BlockSize != 0 { + panic(fmt.Errorf("internal error: sum block was not aligned. len=%d, nx=%d", len(trail), d.nx)) + } + sumCh := make(chan sumResult, 1) + d.sendBlock(blockInput{uid: d.uid, msg: trail, sumCh: sumCh}, true) + + sum := <-sumCh + + return append(in, sum.digest[:]...) +} + +// sendBlock will send a block for processing. +// If cycle is true we will block on cycle, otherwise we will only block +// if the block channel is full. +func (d *md5Digest) sendBlock(bi blockInput, cycle bool) { + if cycle { + select { + case d.blocksCh <- bi: + d.cycleServer <- d.uid + } + return + } + // Only block on cycle if we filled the buffer + select { + case d.blocksCh <- bi: + return + default: + d.cycleServer <- d.uid + d.blocksCh <- bi + } +} diff --git a/vendor/github.com/minio/md5-simd/md5-server_amd64.go b/vendor/github.com/minio/md5-simd/md5-server_amd64.go new file mode 100644 index 000000000..461059537 --- /dev/null +++ b/vendor/github.com/minio/md5-simd/md5-server_amd64.go @@ -0,0 +1,307 @@ +//+build !noasm,!appengine,gc + +// Copyright (c) 2020 MinIO Inc. All rights reserved. +// Use of this source code is governed by a license that can be +// found in the LICENSE file. + +package md5simd + +import ( + "encoding/binary" + "fmt" + "runtime" + + "github.com/klauspost/cpuid" +) + +// MD5 initialization constants +const ( + // Lanes is the number of concurrently calculated hashes. + Lanes = 16 + + init0 = 0x67452301 + init1 = 0xefcdab89 + init2 = 0x98badcfe + init3 = 0x10325476 +) + +// md5ServerUID - Does not start at 0 but next multiple of 16 so as to be able to +// differentiate with default initialisation value of 0 +const md5ServerUID = Lanes + +const buffersPerLane = 3 + +// Message to send across input channel +type blockInput struct { + uid uint64 + msg []byte + sumCh chan sumResult + reset bool +} + +type sumResult struct { + digest [Size]byte +} + +type lanesInfo [Lanes]blockInput + +// md5Server - Type to implement parallel handling of MD5 invocations +type md5Server struct { + uidCounter uint64 + cycle chan uint64 // client with uid has update. + newInput chan newClient // Add new client. + digests map[uint64][Size]byte // Map of uids to (interim) digest results + maskRounds16 [16]maskRounds // Pre-allocated static array for max 16 rounds + maskRounds8a [8]maskRounds // Pre-allocated static array for max 8 rounds (1st AVX2 core) + maskRounds8b [8]maskRounds // Pre-allocated static array for max 8 rounds (2nd AVX2 core) + allBufs []byte // Preallocated buffer. + buffers chan []byte // Preallocated buffers, sliced from allBufs. +} + +// NewServer - Create new object for parallel processing handling +func NewServer() Server { + if !cpuid.CPU.AVX2() { + return &fallbackServer{} + } + md5srv := &md5Server{} + md5srv.digests = make(map[uint64][Size]byte) + md5srv.newInput = make(chan newClient, Lanes) + md5srv.cycle = make(chan uint64, Lanes*10) + md5srv.uidCounter = md5ServerUID - 1 + md5srv.allBufs = make([]byte, 32+buffersPerLane*Lanes*internalBlockSize) + md5srv.buffers = make(chan []byte, buffersPerLane*Lanes) + // Fill buffers. + for i := 0; i < buffersPerLane*Lanes; i++ { + s := 32 + i*internalBlockSize + md5srv.buffers <- md5srv.allBufs[s : s+internalBlockSize : s+internalBlockSize] + } + + // Start a single thread for reading from the input channel + go md5srv.process(md5srv.newInput) + return md5srv +} + +type newClient struct { + uid uint64 + input chan blockInput +} + +// process - Sole handler for reading from the input channel. +func (s *md5Server) process(newClients chan newClient) { + // To fill up as many lanes as possible: + // + // 1. Wait for a cycle id. + // 2. If not already in a lane, add, otherwise leave on channel + // 3. Start timer + // 4. Check if lanes is full, if so, goto 10 (process). + // 5. If timeout, goto 10. + // 6. Wait for new id (goto 2) or timeout (goto 10). + // 10. Process. + // 11. Check all input if there is already input, if so add to lanes. + // 12. Goto 1 + + // lanes contains the lanes. + var lanes lanesInfo + // lanesFilled contains the number of filled lanes for current cycle. + var lanesFilled int + // clients contains active clients + var clients = make(map[uint64]chan blockInput, Lanes) + + addToLane := func(uid uint64) { + cl, ok := clients[uid] + if !ok { + // Unknown client. Maybe it was already removed. + return + } + // Check if we already have it. + for _, lane := range lanes[:lanesFilled] { + if lane.uid == uid { + return + } + } + // Continue until we get a block or there is nothing on channel + for { + select { + case block, ok := <-cl: + if !ok { + // Client disconnected + delete(clients, block.uid) + return + } + if block.uid != uid { + panic(fmt.Errorf("uid mismatch, %d (block) != %d (client)", block.uid, uid)) + } + // If reset message, reset and we're done + if block.reset { + delete(s.digests, uid) + continue + } + + // If requesting sum, we will need to maintain state. + if block.sumCh != nil { + var dig digest + d, ok := s.digests[uid] + if ok { + dig.s[0] = binary.LittleEndian.Uint32(d[0:4]) + dig.s[1] = binary.LittleEndian.Uint32(d[4:8]) + dig.s[2] = binary.LittleEndian.Uint32(d[8:12]) + dig.s[3] = binary.LittleEndian.Uint32(d[12:16]) + } else { + dig.s[0], dig.s[1], dig.s[2], dig.s[3] = init0, init1, init2, init3 + } + + sum := sumResult{} + // Add end block to current digest. + blockGeneric(&dig, block.msg) + + binary.LittleEndian.PutUint32(sum.digest[0:], dig.s[0]) + binary.LittleEndian.PutUint32(sum.digest[4:], dig.s[1]) + binary.LittleEndian.PutUint32(sum.digest[8:], dig.s[2]) + binary.LittleEndian.PutUint32(sum.digest[12:], dig.s[3]) + block.sumCh <- sum + if block.msg != nil { + s.buffers <- block.msg + } + continue + } + if len(block.msg) == 0 { + continue + } + lanes[lanesFilled] = block + lanesFilled++ + return + default: + return + } + } + } + addNewClient := func(cl newClient) { + if _, ok := clients[cl.uid]; ok { + panic("internal error: duplicate client registration") + } + clients[cl.uid] = cl.input + } + + allLanesFilled := func() bool { + return lanesFilled == Lanes || lanesFilled >= len(clients) + } + + for { + // Step 1. + for lanesFilled == 0 { + select { + case cl, ok := <-newClients: + if !ok { + return + } + addNewClient(cl) + // Check if it already sent a payload. + addToLane(cl.uid) + continue + case uid := <-s.cycle: + addToLane(uid) + } + } + + fillLanes: + for !allLanesFilled() { + select { + case cl, ok := <-newClients: + if !ok { + return + } + addNewClient(cl) + + case uid := <-s.cycle: + addToLane(uid) + default: + // Nothing more queued... + break fillLanes + } + } + + // If we did not fill all lanes, check if there is more waiting + if !allLanesFilled() { + runtime.Gosched() + for uid := range clients { + addToLane(uid) + if allLanesFilled() { + break + } + } + } + if false { + if !allLanesFilled() { + fmt.Println("Not all lanes filled", lanesFilled, "of", len(clients)) + //pprof.Lookup("goroutine").WriteTo(os.Stdout, 1) + } else if true { + fmt.Println("all lanes filled") + } + } + // Process the lanes we could collect + s.blocks(lanes[:lanesFilled]) + + // Clear lanes... + lanesFilled = 0 + // Add all current queued + for uid := range clients { + addToLane(uid) + if allLanesFilled() { + break + } + } + } +} + +func (s *md5Server) Close() { + if s.newInput != nil { + close(s.newInput) + s.newInput = nil + } +} + +// Invoke assembly and send results back +func (s *md5Server) blocks(lanes []blockInput) { + inputs := [16][]byte{} + for i := range lanes { + inputs[i] = lanes[i].msg + } + + // Collect active digests... + state := s.getDigests(lanes) + // Process all lanes... + s.blockMd5_x16(&state, inputs, len(lanes) <= 8) + + for i, lane := range lanes { + uid := lane.uid + dig := [Size]byte{} + binary.LittleEndian.PutUint32(dig[0:], state.v0[i]) + binary.LittleEndian.PutUint32(dig[4:], state.v1[i]) + binary.LittleEndian.PutUint32(dig[8:], state.v2[i]) + binary.LittleEndian.PutUint32(dig[12:], state.v3[i]) + + s.digests[uid] = dig + if lane.msg != nil { + s.buffers <- lane.msg + } + lanes[i] = blockInput{} + } +} + +func (s *md5Server) getDigests(lanes []blockInput) (d digest16) { + for i, lane := range lanes { + a, ok := s.digests[lane.uid] + if ok { + d.v0[i] = binary.LittleEndian.Uint32(a[0:4]) + d.v1[i] = binary.LittleEndian.Uint32(a[4:8]) + d.v2[i] = binary.LittleEndian.Uint32(a[8:12]) + d.v3[i] = binary.LittleEndian.Uint32(a[12:16]) + } else { + d.v0[i] = init0 + d.v1[i] = init1 + d.v2[i] = init2 + d.v3[i] = init3 + } + } + return +} diff --git a/vendor/github.com/minio/md5-simd/md5-server_fallback.go b/vendor/github.com/minio/md5-simd/md5-server_fallback.go new file mode 100644 index 000000000..7814dada3 --- /dev/null +++ b/vendor/github.com/minio/md5-simd/md5-server_fallback.go @@ -0,0 +1,12 @@ +//+build !amd64 appengine !gc noasm + +// Copyright (c) 2020 MinIO Inc. All rights reserved. +// Use of this source code is governed by a license that can be +// found in the LICENSE file. + +package md5simd + +// NewServer - Create new object for parallel processing handling +func NewServer() *fallbackServer { + return &fallbackServer{} +} diff --git a/vendor/github.com/minio/md5-simd/md5-util_amd64.go b/vendor/github.com/minio/md5-simd/md5-util_amd64.go new file mode 100644 index 000000000..32bbae4a0 --- /dev/null +++ b/vendor/github.com/minio/md5-simd/md5-util_amd64.go @@ -0,0 +1,70 @@ +// Copyright (c) 2020 MinIO Inc. All rights reserved. +// Use of this source code is governed by a license that can be +// found in the LICENSE file. + +package md5simd + +import ( + "sort" +) + +// Helper struct for sorting blocks based on length +type lane struct { + len uint + pos uint +} + +// Helper struct for generating number of rounds in combination with mask for valid lanes +type maskRounds struct { + mask uint64 + rounds uint64 +} + +func generateMaskAndRounds8(input [8][]byte, mr *[8]maskRounds) (rounds int) { + // Sort on blocks length small to large + var sorted [8]lane + for c, inpt := range input { + sorted[c] = lane{uint(len(inpt)), uint(c)} + } + sort.Slice(sorted[:], func(i, j int) bool { return sorted[i].len < sorted[j].len }) + + // Create mask array including 'rounds' (of processing blocks of 64 bytes) between masks + m, round := uint64(0xff), uint64(0) + + for _, s := range sorted { + if s.len > 0 { + if uint64(s.len)>>6 > round { + mr[rounds] = maskRounds{m, (uint64(s.len) >> 6) - round} + rounds++ + } + round = uint64(s.len) >> 6 + } + m = m & ^(1 << uint(s.pos)) + } + return +} + +func generateMaskAndRounds16(input [16][]byte, mr *[16]maskRounds) (rounds int) { + + // Sort on blocks length small to large + var sorted [16]lane + for c, inpt := range input { + sorted[c] = lane{uint(len(inpt)), uint(c)} + } + sort.Slice(sorted[:], func(i, j int) bool { return sorted[i].len < sorted[j].len }) + + // Create mask array including 'rounds' (of processing blocks of 64 bytes) between masks + m, round := uint64(0xffff), uint64(0) + + for _, s := range sorted { + if s.len > 0 { + if uint64(s.len)>>6 > round { + mr[rounds] = maskRounds{m, (uint64(s.len) >> 6) - round} + rounds++ + } + round = uint64(s.len) >> 6 + } + m = m & ^(1 << uint(s.pos)) + } + return +} diff --git a/vendor/github.com/minio/md5-simd/md5.go b/vendor/github.com/minio/md5-simd/md5.go new file mode 100644 index 000000000..4f56b79d0 --- /dev/null +++ b/vendor/github.com/minio/md5-simd/md5.go @@ -0,0 +1,57 @@ +package md5simd + +import ( + "crypto/md5" + "hash" + "sync" +) + +const ( + // The blocksize of MD5 in bytes. + BlockSize = 64 + + // The size of an MD5 checksum in bytes. + Size = 16 + + // internalBlockSize is the internal block size. + internalBlockSize = 32 << 10 +) + +type Server interface { + NewHash() Hasher + Close() +} + +type Hasher interface { + hash.Hash + Close() +} + +// md5Wrapper is a wrapper around the builtin hasher. +type md5Wrapper struct { + hash.Hash +} + +var md5Pool = sync.Pool{New: func() interface{} { + return md5.New() +}} + +// fallbackServer - Fallback when no assembly is available. +type fallbackServer struct { +} + +// NewHash -- return regular Golang md5 hashing from crypto +func (s *fallbackServer) NewHash() Hasher { + return &md5Wrapper{Hash: md5Pool.New().(hash.Hash)} +} + +func (s *fallbackServer) Close() { +} + +func (m *md5Wrapper) Close() { + if m.Hash != nil { + m.Reset() + md5Pool.Put(m.Hash) + m.Hash = nil + } +} diff --git a/vendor/github.com/minio/minio-go/.gitignore b/vendor/github.com/minio/minio-go/.gitignore deleted file mode 100644 index fa967abd7..000000000 --- a/vendor/github.com/minio/minio-go/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -*~ -*.test -validator diff --git a/vendor/github.com/minio/minio-go/.travis.yml b/vendor/github.com/minio/minio-go/.travis.yml deleted file mode 100644 index 4ae1eadf0..000000000 --- a/vendor/github.com/minio/minio-go/.travis.yml +++ /dev/null @@ -1,30 +0,0 @@ -sudo: false -language: go - -os: -- linux - -env: -- ARCH=x86_64 -- ARCH=i686 - -go: -- 1.7.4 -- 1.8.x -- 1.9.x -- tip - -matrix: - fast_finish: true - allow_failures: - - go: tip - -addons: - apt: - packages: - - devscripts - -script: -- diff -au <(gofmt -d .) <(printf "") -- diff -au <(licensecheck --check '.go$' --recursive --lines 0 * | grep -v -w 'Apache (v2.0)') <(printf "") -- make diff --git a/vendor/github.com/minio/minio-go/MAINTAINERS.md b/vendor/github.com/minio/minio-go/MAINTAINERS.md deleted file mode 100644 index 17973078e..000000000 --- a/vendor/github.com/minio/minio-go/MAINTAINERS.md +++ /dev/null @@ -1,35 +0,0 @@ -# For maintainers only - -## Responsibilities - -Please go through this link [Maintainer Responsibility](https://gist.github.com/abperiasamy/f4d9b31d3186bbd26522) - -### Making new releases -Tag and sign your release commit, additionally this step requires you to have access to Minio's trusted private key. -```sh -$ export GNUPGHOME=/media/${USER}/minio/trusted -$ git tag -s 4.0.0 -$ git push -$ git push --tags -``` - -### Update version -Once release has been made update `libraryVersion` constant in `api.go` to next to be released version. - -```sh -$ grep libraryVersion api.go - libraryVersion = "4.0.1" -``` - -Commit your changes -``` -$ git commit -a -m "Update version for next release" --author "Minio Trusted " -``` - -### Announce -Announce new release by adding release notes at https://github.com/minio/minio-go/releases from `trusted@minio.io` account. Release notes requires two sections `highlights` and `changelog`. Highlights is a bulleted list of salient features in this release and Changelog contains list of all commits since the last release. - -To generate `changelog` -```sh -$ git log --no-color --pretty=format:'-%d %s (%cr) <%an>' .. -``` diff --git a/vendor/github.com/minio/minio-go/Makefile b/vendor/github.com/minio/minio-go/Makefile deleted file mode 100644 index bad81ffaf..000000000 --- a/vendor/github.com/minio/minio-go/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -all: checks - -checks: - @go get -t ./... - @go vet ./... - @SERVER_ENDPOINT=play.minio.io:9000 ACCESS_KEY=Q3AM3UQ867SPQQA43P2F SECRET_KEY=zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG ENABLE_HTTPS=1 MINT_MODE=full go test -race -v ./... - @go get github.com/dustin/go-humanize/... - @go get github.com/sirupsen/logrus/... - @SERVER_ENDPOINT=play.minio.io:9000 ACCESS_KEY=Q3AM3UQ867SPQQA43P2F SECRET_KEY=zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG ENABLE_HTTPS=1 MINT_MODE=full go run functional_tests.go - @mkdir -p /tmp/examples && for i in $(echo examples/s3/*); do go build -o /tmp/examples/$(basename ${i:0:-3}) ${i}; done - @go get -u github.com/a8m/mark/... - @go get -u github.com/minio/cli/... - @go get -u golang.org/x/tools/cmd/goimports - @go get -u github.com/gernest/wow/... - @go build docs/validator.go && ./validator -m docs/API.md -t docs/checker.go.tpl diff --git a/vendor/github.com/minio/minio-go/NOTICE b/vendor/github.com/minio/minio-go/NOTICE deleted file mode 100644 index c521791c5..000000000 --- a/vendor/github.com/minio/minio-go/NOTICE +++ /dev/null @@ -1,2 +0,0 @@ -minio-go -Copyright 2015-2017 Minio, Inc. \ No newline at end of file diff --git a/vendor/github.com/minio/minio-go/README.md b/vendor/github.com/minio/minio-go/README.md deleted file mode 100644 index e004a4b05..000000000 --- a/vendor/github.com/minio/minio-go/README.md +++ /dev/null @@ -1,232 +0,0 @@ -# Minio Go Client SDK for Amazon S3 Compatible Cloud Storage [![Slack](https://slack.minio.io/slack?type=svg)](https://slack.minio.io) [![Sourcegraph](https://sourcegraph.com/github.com/minio/minio-go/-/badge.svg)](https://sourcegraph.com/github.com/minio/minio-go?badge) [![Apache V2 License](http://img.shields.io/badge/license-Apache%20V2-blue.svg)](https://github.com/minio/minio-go/blob/master/LICENSE) - -The Minio Go Client SDK provides simple APIs to access any Amazon S3 compatible object storage. - -This quickstart guide will show you how to install the Minio client SDK, connect to Minio, and provide a walkthrough for a simple file uploader. For a complete list of APIs and examples, please take a look at the [Go Client API Reference](https://docs.minio.io/docs/golang-client-api-reference). - -This document assumes that you have a working [Go development environment](https://docs.minio.io/docs/how-to-install-golang). - -## Download from Github -```sh -go get -u github.com/minio/minio-go -``` - -## Initialize Minio Client -Minio client requires the following four parameters specified to connect to an Amazon S3 compatible object storage. - -| Parameter | Description| -| :--- | :--- | -| endpoint | URL to object storage service. | -| accessKeyID | Access key is the user ID that uniquely identifies your account. | -| secretAccessKey | Secret key is the password to your account. | -| secure | Set this value to 'true' to enable secure (HTTPS) access. | - - -```go -package main - -import ( - "github.com/minio/minio-go" - "log" -) - -func main() { - endpoint := "play.minio.io:9000" - accessKeyID := "Q3AM3UQ867SPQQA43P2F" - secretAccessKey := "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG" - useSSL := true - - // Initialize minio client object. - minioClient, err := minio.New(endpoint, accessKeyID, secretAccessKey, useSSL) - if err != nil { - log.Fatalln(err) - } - - log.Printf("%#v\n", minioClient) // minioClient is now setup -} -``` - -## Quick Start Example - File Uploader -This example program connects to an object storage server, creates a bucket and uploads a file to the bucket. - -We will use the Minio server running at [https://play.minio.io:9000](https://play.minio.io:9000) in this example. Feel free to use this service for testing and development. Access credentials shown in this example are open to the public. - -### FileUploader.go -```go -package main - -import ( - "github.com/minio/minio-go" - "log" -) - -func main() { - endpoint := "play.minio.io:9000" - accessKeyID := "Q3AM3UQ867SPQQA43P2F" - secretAccessKey := "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG" - useSSL := true - - // Initialize minio client object. - minioClient, err := minio.New(endpoint, accessKeyID, secretAccessKey, useSSL) - if err != nil { - log.Fatalln(err) - } - - // Make a new bucket called mymusic. - bucketName := "mymusic" - location := "us-east-1" - - err = minioClient.MakeBucket(bucketName, location) - if err != nil { - // Check to see if we already own this bucket (which happens if you run this twice) - exists, err := minioClient.BucketExists(bucketName) - if err == nil && exists { - log.Printf("We already own %s\n", bucketName) - } else { - log.Fatalln(err) - } - } - log.Printf("Successfully created %s\n", bucketName) - - // Upload the zip file - objectName := "golden-oldies.zip" - filePath := "/tmp/golden-oldies.zip" - contentType := "application/zip" - - // Upload the zip file with FPutObject - n, err := minioClient.FPutObject(bucketName, objectName, filePath, minio.PutObjectOptions{ContentType:contentType}) - if err != nil { - log.Fatalln(err) - } - - log.Printf("Successfully uploaded %s of size %d\n", objectName, n) -} -``` - -### Run FileUploader -```sh -go run file-uploader.go -2016/08/13 17:03:28 Successfully created mymusic -2016/08/13 17:03:40 Successfully uploaded golden-oldies.zip of size 16253413 - -mc ls play/mymusic/ -[2016-05-27 16:02:16 PDT] 17MiB golden-oldies.zip -``` - -## API Reference -The full API Reference is available here. - -* [Complete API Reference](https://docs.minio.io/docs/golang-client-api-reference) - -### API Reference : Bucket Operations -* [`MakeBucket`](https://docs.minio.io/docs/golang-client-api-reference#MakeBucket) -* [`ListBuckets`](https://docs.minio.io/docs/golang-client-api-reference#ListBuckets) -* [`BucketExists`](https://docs.minio.io/docs/golang-client-api-reference#BucketExists) -* [`RemoveBucket`](https://docs.minio.io/docs/golang-client-api-reference#RemoveBucket) -* [`ListObjects`](https://docs.minio.io/docs/golang-client-api-reference#ListObjects) -* [`ListObjectsV2`](https://docs.minio.io/docs/golang-client-api-reference#ListObjectsV2) -* [`ListIncompleteUploads`](https://docs.minio.io/docs/golang-client-api-reference#ListIncompleteUploads) - -### API Reference : Bucket policy Operations -* [`SetBucketPolicy`](https://docs.minio.io/docs/golang-client-api-reference#SetBucketPolicy) -* [`GetBucketPolicy`](https://docs.minio.io/docs/golang-client-api-reference#GetBucketPolicy) - -### API Reference : Bucket notification Operations -* [`SetBucketNotification`](https://docs.minio.io/docs/golang-client-api-reference#SetBucketNotification) -* [`GetBucketNotification`](https://docs.minio.io/docs/golang-client-api-reference#GetBucketNotification) -* [`RemoveAllBucketNotification`](https://docs.minio.io/docs/golang-client-api-reference#RemoveAllBucketNotification) -* [`ListenBucketNotification`](https://docs.minio.io/docs/golang-client-api-reference#ListenBucketNotification) (Minio Extension) - -### API Reference : File Object Operations -* [`FPutObject`](https://docs.minio.io/docs/golang-client-api-reference#FPutObject) -* [`FGetObject`](https://docs.minio.io/docs/golang-client-api-reference#FGetObject) -* [`FPutObjectWithContext`](https://docs.minio.io/docs/golang-client-api-reference#FPutObjectWithContext) -* [`FGetObjectWithContext`](https://docs.minio.io/docs/golang-client-api-reference#FGetObjectWithContext) - -### API Reference : Object Operations -* [`GetObject`](https://docs.minio.io/docs/golang-client-api-reference#GetObject) -* [`PutObject`](https://docs.minio.io/docs/golang-client-api-reference#PutObject) -* [`GetObjectWithContext`](https://docs.minio.io/docs/golang-client-api-reference#GetObjectWithContext) -* [`PutObjectWithContext`](https://docs.minio.io/docs/golang-client-api-reference#PutObjectWithContext) -* [`PutObjectStreaming`](https://docs.minio.io/docs/golang-client-api-reference#PutObjectStreaming) -* [`StatObject`](https://docs.minio.io/docs/golang-client-api-reference#StatObject) -* [`CopyObject`](https://docs.minio.io/docs/golang-client-api-reference#CopyObject) -* [`RemoveObject`](https://docs.minio.io/docs/golang-client-api-reference#RemoveObject) -* [`RemoveObjects`](https://docs.minio.io/docs/golang-client-api-reference#RemoveObjects) -* [`RemoveIncompleteUpload`](https://docs.minio.io/docs/golang-client-api-reference#RemoveIncompleteUpload) - -### API Reference : Presigned Operations -* [`PresignedGetObject`](https://docs.minio.io/docs/golang-client-api-reference#PresignedGetObject) -* [`PresignedPutObject`](https://docs.minio.io/docs/golang-client-api-reference#PresignedPutObject) -* [`PresignedHeadObject`](https://docs.minio.io/docs/golang-client-api-reference#PresignedHeadObject) -* [`PresignedPostPolicy`](https://docs.minio.io/docs/golang-client-api-reference#PresignedPostPolicy) - -### API Reference : Client custom settings -* [`SetAppInfo`](http://docs.minio.io/docs/golang-client-api-reference#SetAppInfo) -* [`SetCustomTransport`](http://docs.minio.io/docs/golang-client-api-reference#SetCustomTransport) -* [`TraceOn`](http://docs.minio.io/docs/golang-client-api-reference#TraceOn) -* [`TraceOff`](http://docs.minio.io/docs/golang-client-api-reference#TraceOff) - -## Full Examples - -### Full Examples : Bucket Operations -* [makebucket.go](https://github.com/minio/minio-go/blob/master/examples/s3/makebucket.go) -* [listbuckets.go](https://github.com/minio/minio-go/blob/master/examples/s3/listbuckets.go) -* [bucketexists.go](https://github.com/minio/minio-go/blob/master/examples/s3/bucketexists.go) -* [removebucket.go](https://github.com/minio/minio-go/blob/master/examples/s3/removebucket.go) -* [listobjects.go](https://github.com/minio/minio-go/blob/master/examples/s3/listobjects.go) -* [listobjectsV2.go](https://github.com/minio/minio-go/blob/master/examples/s3/listobjectsV2.go) -* [listincompleteuploads.go](https://github.com/minio/minio-go/blob/master/examples/s3/listincompleteuploads.go) - -### Full Examples : Bucket policy Operations -* [setbucketpolicy.go](https://github.com/minio/minio-go/blob/master/examples/s3/setbucketpolicy.go) -* [getbucketpolicy.go](https://github.com/minio/minio-go/blob/master/examples/s3/getbucketpolicy.go) -* [listbucketpolicies.go](https://github.com/minio/minio-go/blob/master/examples/s3/listbucketpolicies.go) - -### Full Examples : Bucket notification Operations -* [setbucketnotification.go](https://github.com/minio/minio-go/blob/master/examples/s3/setbucketnotification.go) -* [getbucketnotification.go](https://github.com/minio/minio-go/blob/master/examples/s3/getbucketnotification.go) -* [removeallbucketnotification.go](https://github.com/minio/minio-go/blob/master/examples/s3/removeallbucketnotification.go) -* [listenbucketnotification.go](https://github.com/minio/minio-go/blob/master/examples/minio/listenbucketnotification.go) (Minio Extension) - -### Full Examples : File Object Operations -* [fputobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/fputobject.go) -* [fgetobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/fgetobject.go) -* [fputobject-context.go](https://github.com/minio/minio-go/blob/master/examples/s3/fputobject-context.go) -* [fgetobject-context.go](https://github.com/minio/minio-go/blob/master/examples/s3/fgetobject-context.go) - -### Full Examples : Object Operations -* [putobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/putobject.go) -* [getobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/getobject.go) -* [putobject-context.go](https://github.com/minio/minio-go/blob/master/examples/s3/putobject-context.go) -* [getobject-context.go](https://github.com/minio/minio-go/blob/master/examples/s3/getobject-context.go) -* [statobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/statobject.go) -* [copyobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/copyobject.go) -* [removeobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/removeobject.go) -* [removeincompleteupload.go](https://github.com/minio/minio-go/blob/master/examples/s3/removeincompleteupload.go) -* [removeobjects.go](https://github.com/minio/minio-go/blob/master/examples/s3/removeobjects.go) - -### Full Examples : Encrypted Object Operations -* [put-encrypted-object.go](https://github.com/minio/minio-go/blob/master/examples/s3/put-encrypted-object.go) -* [get-encrypted-object.go](https://github.com/minio/minio-go/blob/master/examples/s3/get-encrypted-object.go) -* [fput-encrypted-object.go](https://github.com/minio/minio-go/blob/master/examples/s3/fputencrypted-object.go) - -### Full Examples : Presigned Operations -* [presignedgetobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/presignedgetobject.go) -* [presignedputobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/presignedputobject.go) -* [presignedheadobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/presignedheadobject.go) -* [presignedpostpolicy.go](https://github.com/minio/minio-go/blob/master/examples/s3/presignedpostpolicy.go) - -## Explore Further -* [Complete Documentation](https://docs.minio.io) -* [Minio Go Client SDK API Reference](https://docs.minio.io/docs/golang-client-api-reference) -* [Go Music Player App Full Application Example](https://docs.minio.io/docs/go-music-player-app) - -## Contribute -[Contributors Guide](https://github.com/minio/minio-go/blob/master/CONTRIBUTING.md) - -[![Build Status](https://travis-ci.org/minio/minio-go.svg)](https://travis-ci.org/minio/minio-go) -[![Build status](https://ci.appveyor.com/api/projects/status/1d05e6nvxcelmrak?svg=true)](https://ci.appveyor.com/project/harshavardhana/minio-go) - -## License -This SDK is distributed under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0), see [LICENSE](./LICENSE) and [NOTICE](./NOTICE) for more information. diff --git a/vendor/github.com/minio/minio-go/README_zh_CN.md b/vendor/github.com/minio/minio-go/README_zh_CN.md deleted file mode 100644 index a5acf199e..000000000 --- a/vendor/github.com/minio/minio-go/README_zh_CN.md +++ /dev/null @@ -1,245 +0,0 @@ -# 适用于与Amazon S3兼容云存储的Minio Go SDK [![Slack](https://slack.minio.io/slack?type=svg)](https://slack.minio.io) [![Sourcegraph](https://sourcegraph.com/github.com/minio/minio-go/-/badge.svg)](https://sourcegraph.com/github.com/minio/minio-go?badge) - -Minio Go Client SDK提供了简单的API来访问任何与Amazon S3兼容的对象存储服务。 - -**支持的云存储:** - -- AWS Signature Version 4 - - Amazon S3 - - Minio - -- AWS Signature Version 2 - - Google Cloud Storage (兼容模式) - - Openstack Swift + Swift3 middleware - - Ceph Object Gateway - - Riak CS - -本文我们将学习如何安装Minio client SDK,连接到Minio,并提供一下文件上传的示例。对于完整的API以及示例,请参考[Go Client API Reference](https://docs.minio.io/docs/golang-client-api-reference)。 - -本文假设你已经有 [Go开发环境](https://docs.minio.io/docs/how-to-install-golang)。 - -## 从Github下载 -```sh -go get -u github.com/minio/minio-go -``` - -## 初始化Minio Client -Minio client需要以下4个参数来连接与Amazon S3兼容的对象存储。 - -| 参数 | 描述| -| :--- | :--- | -| endpoint | 对象存储服务的URL | -| accessKeyID | Access key是唯一标识你的账户的用户ID。 | -| secretAccessKey | Secret key是你账户的密码。 | -| secure | true代表使用HTTPS | - - -```go -package main - -import ( - "github.com/minio/minio-go" - "log" -) - -func main() { - endpoint := "play.minio.io:9000" - accessKeyID := "Q3AM3UQ867SPQQA43P2F" - secretAccessKey := "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG" - useSSL := true - - // 初使化 minio client对象。 - minioClient, err := minio.New(endpoint, accessKeyID, secretAccessKey, useSSL) - if err != nil { - log.Fatalln(err) - } - - log.Printf("%#v\n", minioClient) // minioClient初使化成功 -} -``` - -## 示例-文件上传 -本示例连接到一个对象存储服务,创建一个存储桶并上传一个文件到存储桶中。 - -我们在本示例中使用运行在 [https://play.minio.io:9000](https://play.minio.io:9000) 上的Minio服务,你可以用这个服务来开发和测试。示例中的访问凭据是公开的。 - -### FileUploader.go -```go -package main - -import ( - "github.com/minio/minio-go" - "log" -) - -func main() { - endpoint := "play.minio.io:9000" - accessKeyID := "Q3AM3UQ867SPQQA43P2F" - secretAccessKey := "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG" - useSSL := true - - // 初使化minio client对象。 - minioClient, err := minio.New(endpoint, accessKeyID, secretAccessKey, useSSL) - if err != nil { - log.Fatalln(err) - } - - // 创建一个叫mymusic的存储桶。 - bucketName := "mymusic" - location := "us-east-1" - - err = minioClient.MakeBucket(bucketName, location) - if err != nil { - // 检查存储桶是否已经存在。 - exists, err := minioClient.BucketExists(bucketName) - if err == nil && exists { - log.Printf("We already own %s\n", bucketName) - } else { - log.Fatalln(err) - } - } - log.Printf("Successfully created %s\n", bucketName) - - // 上传一个zip文件。 - objectName := "golden-oldies.zip" - filePath := "/tmp/golden-oldies.zip" - contentType := "application/zip" - - // 使用FPutObject上传一个zip文件。 - n, err := minioClient.FPutObject(bucketName, objectName, filePath, minio.PutObjectOptions{ContentType:contentType}) - if err != nil { - log.Fatalln(err) - } - - log.Printf("Successfully uploaded %s of size %d\n", objectName, n) -} -``` - -### 运行FileUploader -```sh -go run file-uploader.go -2016/08/13 17:03:28 Successfully created mymusic -2016/08/13 17:03:40 Successfully uploaded golden-oldies.zip of size 16253413 - -mc ls play/mymusic/ -[2016-05-27 16:02:16 PDT] 17MiB golden-oldies.zip -``` - -## API文档 -完整的API文档在这里。 -* [完整API文档](https://docs.minio.io/docs/golang-client-api-reference) - -### API文档 : 操作存储桶 -* [`MakeBucket`](https://docs.minio.io/docs/golang-client-api-reference#MakeBucket) -* [`ListBuckets`](https://docs.minio.io/docs/golang-client-api-reference#ListBuckets) -* [`BucketExists`](https://docs.minio.io/docs/golang-client-api-reference#BucketExists) -* [`RemoveBucket`](https://docs.minio.io/docs/golang-client-api-reference#RemoveBucket) -* [`ListObjects`](https://docs.minio.io/docs/golang-client-api-reference#ListObjects) -* [`ListObjectsV2`](https://docs.minio.io/docs/golang-client-api-reference#ListObjectsV2) -* [`ListIncompleteUploads`](https://docs.minio.io/docs/golang-client-api-reference#ListIncompleteUploads) - -### API文档 : 存储桶策略 -* [`SetBucketPolicy`](https://docs.minio.io/docs/golang-client-api-reference#SetBucketPolicy) -* [`GetBucketPolicy`](https://docs.minio.io/docs/golang-client-api-reference#GetBucketPolicy) - -### API文档 : 存储桶通知 -* [`SetBucketNotification`](https://docs.minio.io/docs/golang-client-api-reference#SetBucketNotification) -* [`GetBucketNotification`](https://docs.minio.io/docs/golang-client-api-reference#GetBucketNotification) -* [`RemoveAllBucketNotification`](https://docs.minio.io/docs/golang-client-api-reference#RemoveAllBucketNotification) -* [`ListenBucketNotification`](https://docs.minio.io/docs/golang-client-api-reference#ListenBucketNotification) (Minio Extension) - -### API文档 : 操作文件对象 -* [`FPutObject`](https://docs.minio.io/docs/golang-client-api-reference#FPutObject) -* [`FGetObject`](https://docs.minio.io/docs/golang-client-api-reference#FPutObject) -* [`FPutObjectWithContext`](https://docs.minio.io/docs/golang-client-api-reference#FPutObjectWithContext) -* [`FGetObjectWithContext`](https://docs.minio.io/docs/golang-client-api-reference#FGetObjectWithContext) - -### API文档 : 操作对象 -* [`GetObject`](https://docs.minio.io/docs/golang-client-api-reference#GetObject) -* [`PutObject`](https://docs.minio.io/docs/golang-client-api-reference#PutObject) -* [`GetObjectWithContext`](https://docs.minio.io/docs/golang-client-api-reference#GetObjectWithContext) -* [`PutObjectWithContext`](https://docs.minio.io/docs/golang-client-api-reference#PutObjectWithContext) -* [`PutObjectStreaming`](https://docs.minio.io/docs/golang-client-api-reference#PutObjectStreaming) -* [`StatObject`](https://docs.minio.io/docs/golang-client-api-reference#StatObject) -* [`CopyObject`](https://docs.minio.io/docs/golang-client-api-reference#CopyObject) -* [`RemoveObject`](https://docs.minio.io/docs/golang-client-api-reference#RemoveObject) -* [`RemoveObjects`](https://docs.minio.io/docs/golang-client-api-reference#RemoveObjects) -* [`RemoveIncompleteUpload`](https://docs.minio.io/docs/golang-client-api-reference#RemoveIncompleteUpload) - -### API文档: 操作加密对象 -* [`GetEncryptedObject`](https://docs.minio.io/docs/golang-client-api-reference#GetEncryptedObject) -* [`PutEncryptedObject`](https://docs.minio.io/docs/golang-client-api-reference#PutEncryptedObject) - -### API文档 : Presigned操作 -* [`PresignedGetObject`](https://docs.minio.io/docs/golang-client-api-reference#PresignedGetObject) -* [`PresignedPutObject`](https://docs.minio.io/docs/golang-client-api-reference#PresignedPutObject) -* [`PresignedHeadObject`](https://docs.minio.io/docs/golang-client-api-reference#PresignedHeadObject) -* [`PresignedPostPolicy`](https://docs.minio.io/docs/golang-client-api-reference#PresignedPostPolicy) - -### API文档 : 客户端自定义设置 -* [`SetAppInfo`](http://docs.minio.io/docs/golang-client-api-reference#SetAppInfo) -* [`SetCustomTransport`](http://docs.minio.io/docs/golang-client-api-reference#SetCustomTransport) -* [`TraceOn`](http://docs.minio.io/docs/golang-client-api-reference#TraceOn) -* [`TraceOff`](http://docs.minio.io/docs/golang-client-api-reference#TraceOff) - -## 完整示例 - -### 完整示例 : 操作存储桶 -* [makebucket.go](https://github.com/minio/minio-go/blob/master/examples/s3/makebucket.go) -* [listbuckets.go](https://github.com/minio/minio-go/blob/master/examples/s3/listbuckets.go) -* [bucketexists.go](https://github.com/minio/minio-go/blob/master/examples/s3/bucketexists.go) -* [removebucket.go](https://github.com/minio/minio-go/blob/master/examples/s3/removebucket.go) -* [listobjects.go](https://github.com/minio/minio-go/blob/master/examples/s3/listobjects.go) -* [listobjectsV2.go](https://github.com/minio/minio-go/blob/master/examples/s3/listobjectsV2.go) -* [listincompleteuploads.go](https://github.com/minio/minio-go/blob/master/examples/s3/listincompleteuploads.go) - -### 完整示例 : 存储桶策略 -* [setbucketpolicy.go](https://github.com/minio/minio-go/blob/master/examples/s3/setbucketpolicy.go) -* [getbucketpolicy.go](https://github.com/minio/minio-go/blob/master/examples/s3/getbucketpolicy.go) -* [listbucketpolicies.go](https://github.com/minio/minio-go/blob/master/examples/s3/listbucketpolicies.go) - -### 完整示例 : 存储桶通知 -* [setbucketnotification.go](https://github.com/minio/minio-go/blob/master/examples/s3/setbucketnotification.go) -* [getbucketnotification.go](https://github.com/minio/minio-go/blob/master/examples/s3/getbucketnotification.go) -* [removeallbucketnotification.go](https://github.com/minio/minio-go/blob/master/examples/s3/removeallbucketnotification.go) -* [listenbucketnotification.go](https://github.com/minio/minio-go/blob/master/examples/minio/listenbucketnotification.go) (Minio扩展) - -### 完整示例 : 操作文件对象 -* [fputobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/fputobject.go) -* [fgetobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/fgetobject.go) -* [fputobject-context.go](https://github.com/minio/minio-go/blob/master/examples/s3/fputobject-context.go) -* [fgetobject-context.go](https://github.com/minio/minio-go/blob/master/examples/s3/fgetobject-context.go) - -### 完整示例 : 操作对象 -* [putobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/putobject.go) -* [getobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/getobject.go) -* [putobject-context.go](https://github.com/minio/minio-go/blob/master/examples/s3/putobject-context.go) -* [getobject-context.go](https://github.com/minio/minio-go/blob/master/examples/s3/getobject-context.go) -* [statobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/statobject.go) -* [copyobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/copyobject.go) -* [removeobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/removeobject.go) -* [removeincompleteupload.go](https://github.com/minio/minio-go/blob/master/examples/s3/removeincompleteupload.go) -* [removeobjects.go](https://github.com/minio/minio-go/blob/master/examples/s3/removeobjects.go) - -### 完整示例 : 操作加密对象 -* [put-encrypted-object.go](https://github.com/minio/minio-go/blob/master/examples/s3/put-encrypted-object.go) -* [get-encrypted-object.go](https://github.com/minio/minio-go/blob/master/examples/s3/get-encrypted-object.go) -* [fput-encrypted-object.go](https://github.com/minio/minio-go/blob/master/examples/s3/fputencrypted-object.go) - -### 完整示例 : Presigned操作 -* [presignedgetobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/presignedgetobject.go) -* [presignedputobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/presignedputobject.go) -* [presignedheadobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/presignedheadobject.go) -* [presignedpostpolicy.go](https://github.com/minio/minio-go/blob/master/examples/s3/presignedpostpolicy.go) - -## 了解更多 -* [完整文档](https://docs.minio.io) -* [Minio Go Client SDK API文档](https://docs.minio.io/docs/golang-client-api-reference) -* [Go 音乐播放器完整示例](https://docs.minio.io/docs/go-music-player-app) - -## 贡献 -[贡献指南](https://github.com/minio/minio-go/blob/master/docs/zh_CN/CONTRIBUTING.md) - -[![Build Status](https://travis-ci.org/minio/minio-go.svg)](https://travis-ci.org/minio/minio-go) -[![Build status](https://ci.appveyor.com/api/projects/status/1d05e6nvxcelmrak?svg=true)](https://ci.appveyor.com/project/harshavardhana/minio-go) - diff --git a/vendor/github.com/minio/minio-go/api-compose-object.go b/vendor/github.com/minio/minio-go/api-compose-object.go deleted file mode 100644 index 5d3ede70d..000000000 --- a/vendor/github.com/minio/minio-go/api-compose-object.go +++ /dev/null @@ -1,562 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2017, 2018 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import ( - "context" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/url" - "strconv" - "strings" - "time" - - "github.com/minio/minio-go/pkg/encrypt" - "github.com/minio/minio-go/pkg/s3utils" -) - -// DestinationInfo - type with information about the object to be -// created via server-side copy requests, using the Compose API. -type DestinationInfo struct { - bucket, object string - encryption encrypt.ServerSide - - // if no user-metadata is provided, it is copied from source - // (when there is only once source object in the compose - // request) - userMetadata map[string]string -} - -// NewDestinationInfo - creates a compose-object/copy-source -// destination info object. -// -// `encSSEC` is the key info for server-side-encryption with customer -// provided key. If it is nil, no encryption is performed. -// -// `userMeta` is the user-metadata key-value pairs to be set on the -// destination. The keys are automatically prefixed with `x-amz-meta-` -// if needed. If nil is passed, and if only a single source (of any -// size) is provided in the ComposeObject call, then metadata from the -// source is copied to the destination. -func NewDestinationInfo(bucket, object string, sse encrypt.ServerSide, userMeta map[string]string) (d DestinationInfo, err error) { - // Input validation. - if err = s3utils.CheckValidBucketName(bucket); err != nil { - return d, err - } - if err = s3utils.CheckValidObjectName(object); err != nil { - return d, err - } - - // Process custom-metadata to remove a `x-amz-meta-` prefix if - // present and validate that keys are distinct (after this - // prefix removal). - m := make(map[string]string) - for k, v := range userMeta { - if strings.HasPrefix(strings.ToLower(k), "x-amz-meta-") { - k = k[len("x-amz-meta-"):] - } - if _, ok := m[k]; ok { - return d, ErrInvalidArgument(fmt.Sprintf("Cannot add both %s and x-amz-meta-%s keys as custom metadata", k, k)) - } - m[k] = v - } - - return DestinationInfo{ - bucket: bucket, - object: object, - encryption: sse, - userMetadata: m, - }, nil -} - -// getUserMetaHeadersMap - construct appropriate key-value pairs to send -// as headers from metadata map to pass into copy-object request. For -// single part copy-object (i.e. non-multipart object), enable the -// withCopyDirectiveHeader to set the `x-amz-metadata-directive` to -// `REPLACE`, so that metadata headers from the source are not copied -// over. -func (d *DestinationInfo) getUserMetaHeadersMap(withCopyDirectiveHeader bool) map[string]string { - if len(d.userMetadata) == 0 { - return nil - } - r := make(map[string]string) - if withCopyDirectiveHeader { - r["x-amz-metadata-directive"] = "REPLACE" - } - for k, v := range d.userMetadata { - r["x-amz-meta-"+k] = v - } - return r -} - -// SourceInfo - represents a source object to be copied, using -// server-side copying APIs. -type SourceInfo struct { - bucket, object string - start, end int64 - encryption encrypt.ServerSide - // Headers to send with the upload-part-copy request involving - // this source object. - Headers http.Header -} - -// NewSourceInfo - create a compose-object/copy-object source info -// object. -// -// `decryptSSEC` is the decryption key using server-side-encryption -// with customer provided key. It may be nil if the source is not -// encrypted. -func NewSourceInfo(bucket, object string, sse encrypt.ServerSide) SourceInfo { - r := SourceInfo{ - bucket: bucket, - object: object, - start: -1, // range is unspecified by default - encryption: sse, - Headers: make(http.Header), - } - - // Set the source header - r.Headers.Set("x-amz-copy-source", s3utils.EncodePath(bucket+"/"+object)) - return r -} - -// SetRange - Set the start and end offset of the source object to be -// copied. If this method is not called, the whole source object is -// copied. -func (s *SourceInfo) SetRange(start, end int64) error { - if start > end || start < 0 { - return ErrInvalidArgument("start must be non-negative, and start must be at most end.") - } - // Note that 0 <= start <= end - s.start, s.end = start, end - return nil -} - -// SetMatchETagCond - Set ETag match condition. The object is copied -// only if the etag of the source matches the value given here. -func (s *SourceInfo) SetMatchETagCond(etag string) error { - if etag == "" { - return ErrInvalidArgument("ETag cannot be empty.") - } - s.Headers.Set("x-amz-copy-source-if-match", etag) - return nil -} - -// SetMatchETagExceptCond - Set the ETag match exception -// condition. The object is copied only if the etag of the source is -// not the value given here. -func (s *SourceInfo) SetMatchETagExceptCond(etag string) error { - if etag == "" { - return ErrInvalidArgument("ETag cannot be empty.") - } - s.Headers.Set("x-amz-copy-source-if-none-match", etag) - return nil -} - -// SetModifiedSinceCond - Set the modified since condition. -func (s *SourceInfo) SetModifiedSinceCond(modTime time.Time) error { - if modTime.IsZero() { - return ErrInvalidArgument("Input time cannot be 0.") - } - s.Headers.Set("x-amz-copy-source-if-modified-since", modTime.Format(http.TimeFormat)) - return nil -} - -// SetUnmodifiedSinceCond - Set the unmodified since condition. -func (s *SourceInfo) SetUnmodifiedSinceCond(modTime time.Time) error { - if modTime.IsZero() { - return ErrInvalidArgument("Input time cannot be 0.") - } - s.Headers.Set("x-amz-copy-source-if-unmodified-since", modTime.Format(http.TimeFormat)) - return nil -} - -// Helper to fetch size and etag of an object using a StatObject call. -func (s *SourceInfo) getProps(c Client) (size int64, etag string, userMeta map[string]string, err error) { - // Get object info - need size and etag here. Also, decryption - // headers are added to the stat request if given. - var objInfo ObjectInfo - opts := StatObjectOptions{GetObjectOptions{ServerSideEncryption: encrypt.SSE(s.encryption)}} - objInfo, err = c.statObject(context.Background(), s.bucket, s.object, opts) - if err != nil { - err = ErrInvalidArgument(fmt.Sprintf("Could not stat object - %s/%s: %v", s.bucket, s.object, err)) - } else { - size = objInfo.Size - etag = objInfo.ETag - userMeta = make(map[string]string) - for k, v := range objInfo.Metadata { - if strings.HasPrefix(k, "x-amz-meta-") { - if len(v) > 0 { - userMeta[k] = v[0] - } - } - } - } - return -} - -// Low level implementation of CopyObject API, supports only upto 5GiB worth of copy. -func (c Client) copyObjectDo(ctx context.Context, srcBucket, srcObject, destBucket, destObject string, - metadata map[string]string) (ObjectInfo, error) { - - // Build headers. - headers := make(http.Header) - - // Set all the metadata headers. - for k, v := range metadata { - headers.Set(k, v) - } - - // Set the source header - headers.Set("x-amz-copy-source", s3utils.EncodePath(srcBucket+"/"+srcObject)) - - // Send upload-part-copy request - resp, err := c.executeMethod(ctx, "PUT", requestMetadata{ - bucketName: destBucket, - objectName: destObject, - customHeader: headers, - }) - defer closeResponse(resp) - if err != nil { - return ObjectInfo{}, err - } - - // Check if we got an error response. - if resp.StatusCode != http.StatusOK { - return ObjectInfo{}, httpRespToErrorResponse(resp, srcBucket, srcObject) - } - - cpObjRes := copyObjectResult{} - err = xmlDecoder(resp.Body, &cpObjRes) - if err != nil { - return ObjectInfo{}, err - } - - objInfo := ObjectInfo{ - Key: destObject, - ETag: strings.Trim(cpObjRes.ETag, "\""), - LastModified: cpObjRes.LastModified, - } - return objInfo, nil -} - -func (c Client) copyObjectPartDo(ctx context.Context, srcBucket, srcObject, destBucket, destObject string, uploadID string, - partID int, startOffset int64, length int64, metadata map[string]string) (p CompletePart, err error) { - - headers := make(http.Header) - - // Set source - headers.Set("x-amz-copy-source", s3utils.EncodePath(srcBucket+"/"+srcObject)) - - if startOffset < 0 { - return p, ErrInvalidArgument("startOffset must be non-negative") - } - - if length >= 0 { - headers.Set("x-amz-copy-source-range", fmt.Sprintf("bytes=%d-%d", startOffset, startOffset+length-1)) - } - - for k, v := range metadata { - headers.Set(k, v) - } - - queryValues := make(url.Values) - queryValues.Set("partNumber", strconv.Itoa(partID)) - queryValues.Set("uploadId", uploadID) - - resp, err := c.executeMethod(ctx, "PUT", requestMetadata{ - bucketName: destBucket, - objectName: destObject, - customHeader: headers, - queryValues: queryValues, - }) - defer closeResponse(resp) - if err != nil { - return - } - - // Check if we got an error response. - if resp.StatusCode != http.StatusOK { - return p, httpRespToErrorResponse(resp, destBucket, destObject) - } - - // Decode copy-part response on success. - cpObjRes := copyObjectResult{} - err = xmlDecoder(resp.Body, &cpObjRes) - if err != nil { - return p, err - } - p.PartNumber, p.ETag = partID, cpObjRes.ETag - return p, nil -} - -// uploadPartCopy - helper function to create a part in a multipart -// upload via an upload-part-copy request -// https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadUploadPartCopy.html -func (c Client) uploadPartCopy(ctx context.Context, bucket, object, uploadID string, partNumber int, - headers http.Header) (p CompletePart, err error) { - - // Build query parameters - urlValues := make(url.Values) - urlValues.Set("partNumber", strconv.Itoa(partNumber)) - urlValues.Set("uploadId", uploadID) - - // Send upload-part-copy request - resp, err := c.executeMethod(ctx, "PUT", requestMetadata{ - bucketName: bucket, - objectName: object, - customHeader: headers, - queryValues: urlValues, - }) - defer closeResponse(resp) - if err != nil { - return p, err - } - - // Check if we got an error response. - if resp.StatusCode != http.StatusOK { - return p, httpRespToErrorResponse(resp, bucket, object) - } - - // Decode copy-part response on success. - cpObjRes := copyObjectResult{} - err = xmlDecoder(resp.Body, &cpObjRes) - if err != nil { - return p, err - } - p.PartNumber, p.ETag = partNumber, cpObjRes.ETag - return p, nil -} - -// ComposeObjectWithProgress - creates an object using server-side copying of -// existing objects. It takes a list of source objects (with optional -// offsets) and concatenates them into a new object using only -// server-side copying operations. Optionally takes progress reader hook -// for applications to look at current progress. -func (c Client) ComposeObjectWithProgress(dst DestinationInfo, srcs []SourceInfo, progress io.Reader) error { - if len(srcs) < 1 || len(srcs) > maxPartsCount { - return ErrInvalidArgument("There must be as least one and up to 10000 source objects.") - } - ctx := context.Background() - srcSizes := make([]int64, len(srcs)) - var totalSize, size, totalParts int64 - var srcUserMeta map[string]string - var etag string - var err error - for i, src := range srcs { - size, etag, srcUserMeta, err = src.getProps(c) - if err != nil { - return err - } - - // Error out if client side encryption is used in this source object when - // more than one source objects are given. - if len(srcs) > 1 && src.Headers.Get("x-amz-meta-x-amz-key") != "" { - return ErrInvalidArgument( - fmt.Sprintf("Client side encryption is used in source object %s/%s", src.bucket, src.object)) - } - - // Since we did a HEAD to get size, we use the ETag - // value to make sure the object has not changed by - // the time we perform the copy. This is done, only if - // the user has not set their own ETag match - // condition. - if src.Headers.Get("x-amz-copy-source-if-match") == "" { - src.SetMatchETagCond(etag) - } - - // Check if a segment is specified, and if so, is the - // segment within object bounds? - if src.start != -1 { - // Since range is specified, - // 0 <= src.start <= src.end - // so only invalid case to check is: - if src.end >= size { - return ErrInvalidArgument( - fmt.Sprintf("SourceInfo %d has invalid segment-to-copy [%d, %d] (size is %d)", - i, src.start, src.end, size)) - } - size = src.end - src.start + 1 - } - - // Only the last source may be less than `absMinPartSize` - if size < absMinPartSize && i < len(srcs)-1 { - return ErrInvalidArgument( - fmt.Sprintf("SourceInfo %d is too small (%d) and it is not the last part", i, size)) - } - - // Is data to copy too large? - totalSize += size - if totalSize > maxMultipartPutObjectSize { - return ErrInvalidArgument(fmt.Sprintf("Cannot compose an object of size %d (> 5TiB)", totalSize)) - } - - // record source size - srcSizes[i] = size - - // calculate parts needed for current source - totalParts += partsRequired(size) - // Do we need more parts than we are allowed? - if totalParts > maxPartsCount { - return ErrInvalidArgument(fmt.Sprintf( - "Your proposed compose object requires more than %d parts", maxPartsCount)) - } - } - - // Single source object case (i.e. when only one source is - // involved, it is being copied wholly and at most 5GiB in - // size, emptyfiles are also supported). - if (totalParts == 1 && srcs[0].start == -1 && totalSize <= maxPartSize) || (totalSize == 0) { - return c.CopyObjectWithProgress(dst, srcs[0], progress) - } - - // Now, handle multipart-copy cases. - - // 1. Initiate a new multipart upload. - - // Set user-metadata on the destination object. If no - // user-metadata is specified, and there is only one source, - // (only) then metadata from source is copied. - userMeta := dst.getUserMetaHeadersMap(false) - metaMap := userMeta - if len(userMeta) == 0 && len(srcs) == 1 { - metaMap = srcUserMeta - } - metaHeaders := make(map[string]string) - for k, v := range metaMap { - metaHeaders[k] = v - } - - uploadID, err := c.newUploadID(ctx, dst.bucket, dst.object, PutObjectOptions{ServerSideEncryption: dst.encryption, UserMetadata: metaHeaders}) - if err != nil { - return err - } - - // 2. Perform copy part uploads - objParts := []CompletePart{} - partIndex := 1 - for i, src := range srcs { - h := src.Headers - if src.encryption != nil { - src.encryption.Marshal(h) - } - // Add destination encryption headers - if dst.encryption != nil { - dst.encryption.Marshal(h) - } - - // calculate start/end indices of parts after - // splitting. - startIdx, endIdx := calculateEvenSplits(srcSizes[i], src) - for j, start := range startIdx { - end := endIdx[j] - - // Add (or reset) source range header for - // upload part copy request. - h.Set("x-amz-copy-source-range", - fmt.Sprintf("bytes=%d-%d", start, end)) - - // make upload-part-copy request - complPart, err := c.uploadPartCopy(ctx, dst.bucket, - dst.object, uploadID, partIndex, h) - if err != nil { - return err - } - if progress != nil { - io.CopyN(ioutil.Discard, progress, start+end-1) - } - objParts = append(objParts, complPart) - partIndex++ - } - } - - // 3. Make final complete-multipart request. - _, err = c.completeMultipartUpload(ctx, dst.bucket, dst.object, uploadID, - completeMultipartUpload{Parts: objParts}) - if err != nil { - return err - } - return nil -} - -// ComposeObject - creates an object using server-side copying of -// existing objects. It takes a list of source objects (with optional -// offsets) and concatenates them into a new object using only -// server-side copying operations. -func (c Client) ComposeObject(dst DestinationInfo, srcs []SourceInfo) error { - return c.ComposeObjectWithProgress(dst, srcs, nil) -} - -// partsRequired is maximum parts possible with -// max part size of ceiling(maxMultipartPutObjectSize / (maxPartsCount - 1)) -func partsRequired(size int64) int64 { - maxPartSize := maxMultipartPutObjectSize / (maxPartsCount - 1) - r := size / int64(maxPartSize) - if size%int64(maxPartSize) > 0 { - r++ - } - return r -} - -// calculateEvenSplits - computes splits for a source and returns -// start and end index slices. Splits happen evenly to be sure that no -// part is less than 5MiB, as that could fail the multipart request if -// it is not the last part. -func calculateEvenSplits(size int64, src SourceInfo) (startIndex, endIndex []int64) { - if size == 0 { - return - } - - reqParts := partsRequired(size) - startIndex = make([]int64, reqParts) - endIndex = make([]int64, reqParts) - // Compute number of required parts `k`, as: - // - // k = ceiling(size / copyPartSize) - // - // Now, distribute the `size` bytes in the source into - // k parts as evenly as possible: - // - // r parts sized (q+1) bytes, and - // (k - r) parts sized q bytes, where - // - // size = q * k + r (by simple division of size by k, - // so that 0 <= r < k) - // - start := src.start - if start == -1 { - start = 0 - } - quot, rem := size/reqParts, size%reqParts - nextStart := start - for j := int64(0); j < reqParts; j++ { - curPartSize := quot - if j < rem { - curPartSize++ - } - - cStart := nextStart - cEnd := cStart + curPartSize - 1 - nextStart = cEnd + 1 - - startIndex[j], endIndex[j] = cStart, cEnd - } - return -} diff --git a/vendor/github.com/minio/minio-go/api-datatypes.go b/vendor/github.com/minio/minio-go/api-datatypes.go deleted file mode 100644 index 63fc08905..000000000 --- a/vendor/github.com/minio/minio-go/api-datatypes.go +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import ( - "net/http" - "time" -) - -// BucketInfo container for bucket metadata. -type BucketInfo struct { - // The name of the bucket. - Name string `json:"name"` - // Date the bucket was created. - CreationDate time.Time `json:"creationDate"` -} - -// ObjectInfo container for object metadata. -type ObjectInfo struct { - // An ETag is optionally set to md5sum of an object. In case of multipart objects, - // ETag is of the form MD5SUM-N where MD5SUM is md5sum of all individual md5sums of - // each parts concatenated into one string. - ETag string `json:"etag"` - - Key string `json:"name"` // Name of the object - LastModified time.Time `json:"lastModified"` // Date and time the object was last modified. - Size int64 `json:"size"` // Size in bytes of the object. - ContentType string `json:"contentType"` // A standard MIME type describing the format of the object data. - - // Collection of additional metadata on the object. - // eg: x-amz-meta-*, content-encoding etc. - Metadata http.Header `json:"metadata" xml:"-"` - - // Owner name. - Owner struct { - DisplayName string `json:"name"` - ID string `json:"id"` - } `json:"owner"` - - // The class of storage used to store the object. - StorageClass string `json:"storageClass"` - - // Error - Err error `json:"-"` -} - -// ObjectMultipartInfo container for multipart object metadata. -type ObjectMultipartInfo struct { - // Date and time at which the multipart upload was initiated. - Initiated time.Time `type:"timestamp" timestampFormat:"iso8601"` - - Initiator initiator - Owner owner - - // The type of storage to use for the object. Defaults to 'STANDARD'. - StorageClass string - - // Key of the object for which the multipart upload was initiated. - Key string - - // Size in bytes of the object. - Size int64 - - // Upload ID that identifies the multipart upload. - UploadID string `xml:"UploadId"` - - // Error - Err error -} diff --git a/vendor/github.com/minio/minio-go/api-get-object-context.go b/vendor/github.com/minio/minio-go/api-get-object-context.go deleted file mode 100644 index f8dfac7d6..000000000 --- a/vendor/github.com/minio/minio-go/api-get-object-context.go +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import "context" - -// GetObjectWithContext - returns an seekable, readable object. -// The options can be used to specify the GET request further. -func (c Client) GetObjectWithContext(ctx context.Context, bucketName, objectName string, opts GetObjectOptions) (*Object, error) { - return c.getObjectWithContext(ctx, bucketName, objectName, opts) -} diff --git a/vendor/github.com/minio/minio-go/api-get-object-file.go b/vendor/github.com/minio/minio-go/api-get-object-file.go deleted file mode 100644 index a852220a2..000000000 --- a/vendor/github.com/minio/minio-go/api-get-object-file.go +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import ( - "context" - "io" - "os" - "path/filepath" - - "github.com/minio/minio-go/pkg/s3utils" -) - -// FGetObjectWithContext - download contents of an object to a local file. -// The options can be used to specify the GET request further. -func (c Client) FGetObjectWithContext(ctx context.Context, bucketName, objectName, filePath string, opts GetObjectOptions) error { - return c.fGetObjectWithContext(ctx, bucketName, objectName, filePath, opts) -} - -// FGetObject - download contents of an object to a local file. -func (c Client) FGetObject(bucketName, objectName, filePath string, opts GetObjectOptions) error { - return c.fGetObjectWithContext(context.Background(), bucketName, objectName, filePath, opts) -} - -// fGetObjectWithContext - fgetObject wrapper function with context -func (c Client) fGetObjectWithContext(ctx context.Context, bucketName, objectName, filePath string, opts GetObjectOptions) error { - // Input validation. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - return err - } - if err := s3utils.CheckValidObjectName(objectName); err != nil { - return err - } - - // Verify if destination already exists. - st, err := os.Stat(filePath) - if err == nil { - // If the destination exists and is a directory. - if st.IsDir() { - return ErrInvalidArgument("fileName is a directory.") - } - } - - // Proceed if file does not exist. return for all other errors. - if err != nil { - if !os.IsNotExist(err) { - return err - } - } - - // Extract top level directory. - objectDir, _ := filepath.Split(filePath) - if objectDir != "" { - // Create any missing top level directories. - if err := os.MkdirAll(objectDir, 0700); err != nil { - return err - } - } - - // Gather md5sum. - objectStat, err := c.StatObject(bucketName, objectName, StatObjectOptions{opts}) - if err != nil { - return err - } - - // Write to a temporary file "fileName.part.minio" before saving. - filePartPath := filePath + objectStat.ETag + ".part.minio" - - // If exists, open in append mode. If not create it as a part file. - filePart, err := os.OpenFile(filePartPath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600) - if err != nil { - return err - } - - // Issue Stat to get the current offset. - st, err = filePart.Stat() - if err != nil { - return err - } - - // Initialize get object request headers to set the - // appropriate range offsets to read from. - if st.Size() > 0 { - opts.SetRange(st.Size(), 0) - } - - // Seek to current position for incoming reader. - objectReader, objectStat, err := c.getObject(ctx, bucketName, objectName, opts) - if err != nil { - return err - } - - // Write to the part file. - if _, err = io.CopyN(filePart, objectReader, objectStat.Size); err != nil { - return err - } - - // Close the file before rename, this is specifically needed for Windows users. - if err = filePart.Close(); err != nil { - return err - } - - // Safely completed. Now commit by renaming to actual filename. - if err = os.Rename(filePartPath, filePath); err != nil { - return err - } - - // Return. - return nil -} diff --git a/vendor/github.com/minio/minio-go/api-get-policy.go b/vendor/github.com/minio/minio-go/api-get-policy.go deleted file mode 100644 index 12d4c590e..000000000 --- a/vendor/github.com/minio/minio-go/api-get-policy.go +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import ( - "context" - "io/ioutil" - "net/http" - "net/url" - - "github.com/minio/minio-go/pkg/s3utils" -) - -// GetBucketPolicy - get bucket policy at a given path. -func (c Client) GetBucketPolicy(bucketName string) (string, error) { - // Input validation. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - return "", err - } - bucketPolicy, err := c.getBucketPolicy(bucketName) - if err != nil { - errResponse := ToErrorResponse(err) - if errResponse.Code == "NoSuchBucketPolicy" { - return "", nil - } - return "", err - } - return bucketPolicy, nil -} - -// Request server for current bucket policy. -func (c Client) getBucketPolicy(bucketName string) (string, error) { - // Get resources properly escaped and lined up before - // using them in http request. - urlValues := make(url.Values) - urlValues.Set("policy", "") - - // Execute GET on bucket to list objects. - resp, err := c.executeMethod(context.Background(), "GET", requestMetadata{ - bucketName: bucketName, - queryValues: urlValues, - contentSHA256Hex: emptySHA256Hex, - }) - - defer closeResponse(resp) - if err != nil { - return "", err - } - - if resp != nil { - if resp.StatusCode != http.StatusOK { - return "", httpRespToErrorResponse(resp, bucketName, "") - } - } - - bucketPolicyBuf, err := ioutil.ReadAll(resp.Body) - if err != nil { - return "", err - } - - policy := string(bucketPolicyBuf) - return policy, err -} diff --git a/vendor/github.com/minio/minio-go/api-list.go b/vendor/github.com/minio/minio-go/api-list.go deleted file mode 100644 index 04f757339..000000000 --- a/vendor/github.com/minio/minio-go/api-list.go +++ /dev/null @@ -1,720 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import ( - "context" - "errors" - "fmt" - "net/http" - "net/url" - "strings" - - "github.com/minio/minio-go/pkg/s3utils" -) - -// ListBuckets list all buckets owned by this authenticated user. -// -// This call requires explicit authentication, no anonymous requests are -// allowed for listing buckets. -// -// api := client.New(....) -// for message := range api.ListBuckets() { -// fmt.Println(message) -// } -// -func (c Client) ListBuckets() ([]BucketInfo, error) { - // Execute GET on service. - resp, err := c.executeMethod(context.Background(), "GET", requestMetadata{contentSHA256Hex: emptySHA256Hex}) - defer closeResponse(resp) - if err != nil { - return nil, err - } - if resp != nil { - if resp.StatusCode != http.StatusOK { - return nil, httpRespToErrorResponse(resp, "", "") - } - } - listAllMyBucketsResult := listAllMyBucketsResult{} - err = xmlDecoder(resp.Body, &listAllMyBucketsResult) - if err != nil { - return nil, err - } - return listAllMyBucketsResult.Buckets.Bucket, nil -} - -/// Bucket Read Operations. - -// ListObjectsV2 lists all objects matching the objectPrefix from -// the specified bucket. If recursion is enabled it would list -// all subdirectories and all its contents. -// -// Your input parameters are just bucketName, objectPrefix, recursive -// and a done channel for pro-actively closing the internal go -// routine. If you enable recursive as 'true' this function will -// return back all the objects in a given bucket name and object -// prefix. -// -// api := client.New(....) -// // Create a done channel. -// doneCh := make(chan struct{}) -// defer close(doneCh) -// // Recursively list all objects in 'mytestbucket' -// recursive := true -// for message := range api.ListObjectsV2("mytestbucket", "starthere", recursive, doneCh) { -// fmt.Println(message) -// } -// -func (c Client) ListObjectsV2(bucketName, objectPrefix string, recursive bool, doneCh <-chan struct{}) <-chan ObjectInfo { - // Allocate new list objects channel. - objectStatCh := make(chan ObjectInfo, 1) - // Default listing is delimited at "/" - delimiter := "/" - if recursive { - // If recursive we do not delimit. - delimiter = "" - } - - // Return object owner information by default - fetchOwner := true - - // Validate bucket name. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - defer close(objectStatCh) - objectStatCh <- ObjectInfo{ - Err: err, - } - return objectStatCh - } - - // Validate incoming object prefix. - if err := s3utils.CheckValidObjectNamePrefix(objectPrefix); err != nil { - defer close(objectStatCh) - objectStatCh <- ObjectInfo{ - Err: err, - } - return objectStatCh - } - - // Initiate list objects goroutine here. - go func(objectStatCh chan<- ObjectInfo) { - defer close(objectStatCh) - // Save continuationToken for next request. - var continuationToken string - for { - // Get list of objects a maximum of 1000 per request. - result, err := c.listObjectsV2Query(bucketName, objectPrefix, continuationToken, fetchOwner, delimiter, 1000, "") - if err != nil { - objectStatCh <- ObjectInfo{ - Err: err, - } - return - } - - // If contents are available loop through and send over channel. - for _, object := range result.Contents { - select { - // Send object content. - case objectStatCh <- object: - // If receives done from the caller, return here. - case <-doneCh: - return - } - } - - // Send all common prefixes if any. - // NOTE: prefixes are only present if the request is delimited. - for _, obj := range result.CommonPrefixes { - select { - // Send object prefixes. - case objectStatCh <- ObjectInfo{ - Key: obj.Prefix, - Size: 0, - }: - // If receives done from the caller, return here. - case <-doneCh: - return - } - } - - // If continuation token present, save it for next request. - if result.NextContinuationToken != "" { - continuationToken = result.NextContinuationToken - } - - // Listing ends result is not truncated, return right here. - if !result.IsTruncated { - return - } - } - }(objectStatCh) - return objectStatCh -} - -// listObjectsV2Query - (List Objects V2) - List some or all (up to 1000) of the objects in a bucket. -// -// You can use the request parameters as selection criteria to return a subset of the objects in a bucket. -// request parameters :- -// --------- -// ?continuation-token - Used to continue iterating over a set of objects -// ?delimiter - A delimiter is a character you use to group keys. -// ?prefix - Limits the response to keys that begin with the specified prefix. -// ?max-keys - Sets the maximum number of keys returned in the response body. -// ?start-after - Specifies the key to start after when listing objects in a bucket. -func (c Client) listObjectsV2Query(bucketName, objectPrefix, continuationToken string, fetchOwner bool, delimiter string, maxkeys int, startAfter string) (ListBucketV2Result, error) { - // Validate bucket name. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - return ListBucketV2Result{}, err - } - // Validate object prefix. - if err := s3utils.CheckValidObjectNamePrefix(objectPrefix); err != nil { - return ListBucketV2Result{}, err - } - // Get resources properly escaped and lined up before - // using them in http request. - urlValues := make(url.Values) - - // Always set list-type in ListObjects V2 - urlValues.Set("list-type", "2") - - // Set object prefix. - if objectPrefix != "" { - urlValues.Set("prefix", objectPrefix) - } - // Set continuation token - if continuationToken != "" { - urlValues.Set("continuation-token", continuationToken) - } - // Set delimiter. - if delimiter != "" { - urlValues.Set("delimiter", delimiter) - } - - // Fetch owner when listing - if fetchOwner { - urlValues.Set("fetch-owner", "true") - } - - // maxkeys should default to 1000 or less. - if maxkeys == 0 || maxkeys > 1000 { - maxkeys = 1000 - } - // Set max keys. - urlValues.Set("max-keys", fmt.Sprintf("%d", maxkeys)) - - // Set start-after - if startAfter != "" { - urlValues.Set("start-after", startAfter) - } - - // Execute GET on bucket to list objects. - resp, err := c.executeMethod(context.Background(), "GET", requestMetadata{ - bucketName: bucketName, - queryValues: urlValues, - contentSHA256Hex: emptySHA256Hex, - }) - defer closeResponse(resp) - if err != nil { - return ListBucketV2Result{}, err - } - if resp != nil { - if resp.StatusCode != http.StatusOK { - return ListBucketV2Result{}, httpRespToErrorResponse(resp, bucketName, "") - } - } - - // Decode listBuckets XML. - listBucketResult := ListBucketV2Result{} - if err = xmlDecoder(resp.Body, &listBucketResult); err != nil { - return listBucketResult, err - } - - // This is an additional verification check to make - // sure proper responses are received. - if listBucketResult.IsTruncated && listBucketResult.NextContinuationToken == "" { - return listBucketResult, errors.New("Truncated response should have continuation token set") - } - - // Success. - return listBucketResult, nil -} - -// ListObjects - (List Objects) - List some objects or all recursively. -// -// ListObjects lists all objects matching the objectPrefix from -// the specified bucket. If recursion is enabled it would list -// all subdirectories and all its contents. -// -// Your input parameters are just bucketName, objectPrefix, recursive -// and a done channel for pro-actively closing the internal go -// routine. If you enable recursive as 'true' this function will -// return back all the objects in a given bucket name and object -// prefix. -// -// api := client.New(....) -// // Create a done channel. -// doneCh := make(chan struct{}) -// defer close(doneCh) -// // Recurively list all objects in 'mytestbucket' -// recursive := true -// for message := range api.ListObjects("mytestbucket", "starthere", recursive, doneCh) { -// fmt.Println(message) -// } -// -func (c Client) ListObjects(bucketName, objectPrefix string, recursive bool, doneCh <-chan struct{}) <-chan ObjectInfo { - // Allocate new list objects channel. - objectStatCh := make(chan ObjectInfo, 1) - // Default listing is delimited at "/" - delimiter := "/" - if recursive { - // If recursive we do not delimit. - delimiter = "" - } - // Validate bucket name. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - defer close(objectStatCh) - objectStatCh <- ObjectInfo{ - Err: err, - } - return objectStatCh - } - // Validate incoming object prefix. - if err := s3utils.CheckValidObjectNamePrefix(objectPrefix); err != nil { - defer close(objectStatCh) - objectStatCh <- ObjectInfo{ - Err: err, - } - return objectStatCh - } - - // Initiate list objects goroutine here. - go func(objectStatCh chan<- ObjectInfo) { - defer close(objectStatCh) - // Save marker for next request. - var marker string - for { - // Get list of objects a maximum of 1000 per request. - result, err := c.listObjectsQuery(bucketName, objectPrefix, marker, delimiter, 1000) - if err != nil { - objectStatCh <- ObjectInfo{ - Err: err, - } - return - } - - // If contents are available loop through and send over channel. - for _, object := range result.Contents { - // Save the marker. - marker = object.Key - select { - // Send object content. - case objectStatCh <- object: - // If receives done from the caller, return here. - case <-doneCh: - return - } - } - - // Send all common prefixes if any. - // NOTE: prefixes are only present if the request is delimited. - for _, obj := range result.CommonPrefixes { - object := ObjectInfo{} - object.Key = obj.Prefix - object.Size = 0 - select { - // Send object prefixes. - case objectStatCh <- object: - // If receives done from the caller, return here. - case <-doneCh: - return - } - } - - // If next marker present, save it for next request. - if result.NextMarker != "" { - marker = result.NextMarker - } - - // Listing ends result is not truncated, return right here. - if !result.IsTruncated { - return - } - } - }(objectStatCh) - return objectStatCh -} - -// listObjects - (List Objects) - List some or all (up to 1000) of the objects in a bucket. -// -// You can use the request parameters as selection criteria to return a subset of the objects in a bucket. -// request parameters :- -// --------- -// ?marker - Specifies the key to start with when listing objects in a bucket. -// ?delimiter - A delimiter is a character you use to group keys. -// ?prefix - Limits the response to keys that begin with the specified prefix. -// ?max-keys - Sets the maximum number of keys returned in the response body. -func (c Client) listObjectsQuery(bucketName, objectPrefix, objectMarker, delimiter string, maxkeys int) (ListBucketResult, error) { - // Validate bucket name. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - return ListBucketResult{}, err - } - // Validate object prefix. - if err := s3utils.CheckValidObjectNamePrefix(objectPrefix); err != nil { - return ListBucketResult{}, err - } - // Get resources properly escaped and lined up before - // using them in http request. - urlValues := make(url.Values) - // Set object prefix. - if objectPrefix != "" { - urlValues.Set("prefix", objectPrefix) - } - // Set object marker. - if objectMarker != "" { - urlValues.Set("marker", objectMarker) - } - // Set delimiter. - if delimiter != "" { - urlValues.Set("delimiter", delimiter) - } - - // maxkeys should default to 1000 or less. - if maxkeys == 0 || maxkeys > 1000 { - maxkeys = 1000 - } - // Set max keys. - urlValues.Set("max-keys", fmt.Sprintf("%d", maxkeys)) - - // Execute GET on bucket to list objects. - resp, err := c.executeMethod(context.Background(), "GET", requestMetadata{ - bucketName: bucketName, - queryValues: urlValues, - contentSHA256Hex: emptySHA256Hex, - }) - defer closeResponse(resp) - if err != nil { - return ListBucketResult{}, err - } - if resp != nil { - if resp.StatusCode != http.StatusOK { - return ListBucketResult{}, httpRespToErrorResponse(resp, bucketName, "") - } - } - // Decode listBuckets XML. - listBucketResult := ListBucketResult{} - err = xmlDecoder(resp.Body, &listBucketResult) - if err != nil { - return listBucketResult, err - } - return listBucketResult, nil -} - -// ListIncompleteUploads - List incompletely uploaded multipart objects. -// -// ListIncompleteUploads lists all incompleted objects matching the -// objectPrefix from the specified bucket. If recursion is enabled -// it would list all subdirectories and all its contents. -// -// Your input parameters are just bucketName, objectPrefix, recursive -// and a done channel to pro-actively close the internal go routine. -// If you enable recursive as 'true' this function will return back all -// the multipart objects in a given bucket name. -// -// api := client.New(....) -// // Create a done channel. -// doneCh := make(chan struct{}) -// defer close(doneCh) -// // Recurively list all objects in 'mytestbucket' -// recursive := true -// for message := range api.ListIncompleteUploads("mytestbucket", "starthere", recursive) { -// fmt.Println(message) -// } -// -func (c Client) ListIncompleteUploads(bucketName, objectPrefix string, recursive bool, doneCh <-chan struct{}) <-chan ObjectMultipartInfo { - // Turn on size aggregation of individual parts. - isAggregateSize := true - return c.listIncompleteUploads(bucketName, objectPrefix, recursive, isAggregateSize, doneCh) -} - -// listIncompleteUploads lists all incomplete uploads. -func (c Client) listIncompleteUploads(bucketName, objectPrefix string, recursive, aggregateSize bool, doneCh <-chan struct{}) <-chan ObjectMultipartInfo { - // Allocate channel for multipart uploads. - objectMultipartStatCh := make(chan ObjectMultipartInfo, 1) - // Delimiter is set to "/" by default. - delimiter := "/" - if recursive { - // If recursive do not delimit. - delimiter = "" - } - // Validate bucket name. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - defer close(objectMultipartStatCh) - objectMultipartStatCh <- ObjectMultipartInfo{ - Err: err, - } - return objectMultipartStatCh - } - // Validate incoming object prefix. - if err := s3utils.CheckValidObjectNamePrefix(objectPrefix); err != nil { - defer close(objectMultipartStatCh) - objectMultipartStatCh <- ObjectMultipartInfo{ - Err: err, - } - return objectMultipartStatCh - } - go func(objectMultipartStatCh chan<- ObjectMultipartInfo) { - defer close(objectMultipartStatCh) - // object and upload ID marker for future requests. - var objectMarker string - var uploadIDMarker string - for { - // list all multipart uploads. - result, err := c.listMultipartUploadsQuery(bucketName, objectMarker, uploadIDMarker, objectPrefix, delimiter, 1000) - if err != nil { - objectMultipartStatCh <- ObjectMultipartInfo{ - Err: err, - } - return - } - // Save objectMarker and uploadIDMarker for next request. - objectMarker = result.NextKeyMarker - uploadIDMarker = result.NextUploadIDMarker - // Send all multipart uploads. - for _, obj := range result.Uploads { - // Calculate total size of the uploaded parts if 'aggregateSize' is enabled. - if aggregateSize { - // Get total multipart size. - obj.Size, err = c.getTotalMultipartSize(bucketName, obj.Key, obj.UploadID) - if err != nil { - objectMultipartStatCh <- ObjectMultipartInfo{ - Err: err, - } - continue - } - } - select { - // Send individual uploads here. - case objectMultipartStatCh <- obj: - // If done channel return here. - case <-doneCh: - return - } - } - // Send all common prefixes if any. - // NOTE: prefixes are only present if the request is delimited. - for _, obj := range result.CommonPrefixes { - object := ObjectMultipartInfo{} - object.Key = obj.Prefix - object.Size = 0 - select { - // Send delimited prefixes here. - case objectMultipartStatCh <- object: - // If done channel return here. - case <-doneCh: - return - } - } - // Listing ends if result not truncated, return right here. - if !result.IsTruncated { - return - } - } - }(objectMultipartStatCh) - // return. - return objectMultipartStatCh -} - -// listMultipartUploads - (List Multipart Uploads). -// - Lists some or all (up to 1000) in-progress multipart uploads in a bucket. -// -// You can use the request parameters as selection criteria to return a subset of the uploads in a bucket. -// request parameters. :- -// --------- -// ?key-marker - Specifies the multipart upload after which listing should begin. -// ?upload-id-marker - Together with key-marker specifies the multipart upload after which listing should begin. -// ?delimiter - A delimiter is a character you use to group keys. -// ?prefix - Limits the response to keys that begin with the specified prefix. -// ?max-uploads - Sets the maximum number of multipart uploads returned in the response body. -func (c Client) listMultipartUploadsQuery(bucketName, keyMarker, uploadIDMarker, prefix, delimiter string, maxUploads int) (ListMultipartUploadsResult, error) { - // Get resources properly escaped and lined up before using them in http request. - urlValues := make(url.Values) - // Set uploads. - urlValues.Set("uploads", "") - // Set object key marker. - if keyMarker != "" { - urlValues.Set("key-marker", keyMarker) - } - // Set upload id marker. - if uploadIDMarker != "" { - urlValues.Set("upload-id-marker", uploadIDMarker) - } - // Set prefix marker. - if prefix != "" { - urlValues.Set("prefix", prefix) - } - // Set delimiter. - if delimiter != "" { - urlValues.Set("delimiter", delimiter) - } - - // maxUploads should be 1000 or less. - if maxUploads == 0 || maxUploads > 1000 { - maxUploads = 1000 - } - // Set max-uploads. - urlValues.Set("max-uploads", fmt.Sprintf("%d", maxUploads)) - - // Execute GET on bucketName to list multipart uploads. - resp, err := c.executeMethod(context.Background(), "GET", requestMetadata{ - bucketName: bucketName, - queryValues: urlValues, - contentSHA256Hex: emptySHA256Hex, - }) - defer closeResponse(resp) - if err != nil { - return ListMultipartUploadsResult{}, err - } - if resp != nil { - if resp.StatusCode != http.StatusOK { - return ListMultipartUploadsResult{}, httpRespToErrorResponse(resp, bucketName, "") - } - } - // Decode response body. - listMultipartUploadsResult := ListMultipartUploadsResult{} - err = xmlDecoder(resp.Body, &listMultipartUploadsResult) - if err != nil { - return listMultipartUploadsResult, err - } - return listMultipartUploadsResult, nil -} - -// listObjectParts list all object parts recursively. -func (c Client) listObjectParts(bucketName, objectName, uploadID string) (partsInfo map[int]ObjectPart, err error) { - // Part number marker for the next batch of request. - var nextPartNumberMarker int - partsInfo = make(map[int]ObjectPart) - for { - // Get list of uploaded parts a maximum of 1000 per request. - listObjPartsResult, err := c.listObjectPartsQuery(bucketName, objectName, uploadID, nextPartNumberMarker, 1000) - if err != nil { - return nil, err - } - // Append to parts info. - for _, part := range listObjPartsResult.ObjectParts { - // Trim off the odd double quotes from ETag in the beginning and end. - part.ETag = strings.TrimPrefix(part.ETag, "\"") - part.ETag = strings.TrimSuffix(part.ETag, "\"") - partsInfo[part.PartNumber] = part - } - // Keep part number marker, for the next iteration. - nextPartNumberMarker = listObjPartsResult.NextPartNumberMarker - // Listing ends result is not truncated, return right here. - if !listObjPartsResult.IsTruncated { - break - } - } - - // Return all the parts. - return partsInfo, nil -} - -// findUploadIDs lists all incomplete uploads and find the uploadIDs of the matching object name. -func (c Client) findUploadIDs(bucketName, objectName string) ([]string, error) { - var uploadIDs []string - // Make list incomplete uploads recursive. - isRecursive := true - // Turn off size aggregation of individual parts, in this request. - isAggregateSize := false - // Create done channel to cleanup the routine. - doneCh := make(chan struct{}) - defer close(doneCh) - // List all incomplete uploads. - for mpUpload := range c.listIncompleteUploads(bucketName, objectName, isRecursive, isAggregateSize, doneCh) { - if mpUpload.Err != nil { - return nil, mpUpload.Err - } - if objectName == mpUpload.Key { - uploadIDs = append(uploadIDs, mpUpload.UploadID) - } - } - // Return the latest upload id. - return uploadIDs, nil -} - -// getTotalMultipartSize - calculate total uploaded size for the a given multipart object. -func (c Client) getTotalMultipartSize(bucketName, objectName, uploadID string) (size int64, err error) { - // Iterate over all parts and aggregate the size. - partsInfo, err := c.listObjectParts(bucketName, objectName, uploadID) - if err != nil { - return 0, err - } - for _, partInfo := range partsInfo { - size += partInfo.Size - } - return size, nil -} - -// listObjectPartsQuery (List Parts query) -// - lists some or all (up to 1000) parts that have been uploaded -// for a specific multipart upload -// -// You can use the request parameters as selection criteria to return -// a subset of the uploads in a bucket, request parameters :- -// --------- -// ?part-number-marker - Specifies the part after which listing should -// begin. -// ?max-parts - Maximum parts to be listed per request. -func (c Client) listObjectPartsQuery(bucketName, objectName, uploadID string, partNumberMarker, maxParts int) (ListObjectPartsResult, error) { - // Get resources properly escaped and lined up before using them in http request. - urlValues := make(url.Values) - // Set part number marker. - urlValues.Set("part-number-marker", fmt.Sprintf("%d", partNumberMarker)) - // Set upload id. - urlValues.Set("uploadId", uploadID) - - // maxParts should be 1000 or less. - if maxParts == 0 || maxParts > 1000 { - maxParts = 1000 - } - // Set max parts. - urlValues.Set("max-parts", fmt.Sprintf("%d", maxParts)) - - // Execute GET on objectName to get list of parts. - resp, err := c.executeMethod(context.Background(), "GET", requestMetadata{ - bucketName: bucketName, - objectName: objectName, - queryValues: urlValues, - contentSHA256Hex: emptySHA256Hex, - }) - defer closeResponse(resp) - if err != nil { - return ListObjectPartsResult{}, err - } - if resp != nil { - if resp.StatusCode != http.StatusOK { - return ListObjectPartsResult{}, httpRespToErrorResponse(resp, bucketName, objectName) - } - } - // Decode list object parts XML. - listObjectPartsResult := ListObjectPartsResult{} - err = xmlDecoder(resp.Body, &listObjectPartsResult) - if err != nil { - return listObjectPartsResult, err - } - return listObjectPartsResult, nil -} diff --git a/vendor/github.com/minio/minio-go/api-notification.go b/vendor/github.com/minio/minio-go/api-notification.go deleted file mode 100644 index 1c01e362b..000000000 --- a/vendor/github.com/minio/minio-go/api-notification.go +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import ( - "bufio" - "context" - "encoding/json" - "io" - "net/http" - "net/url" - "time" - - "github.com/minio/minio-go/pkg/s3utils" -) - -// GetBucketNotification - get bucket notification at a given path. -func (c Client) GetBucketNotification(bucketName string) (bucketNotification BucketNotification, err error) { - // Input validation. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - return BucketNotification{}, err - } - notification, err := c.getBucketNotification(bucketName) - if err != nil { - return BucketNotification{}, err - } - return notification, nil -} - -// Request server for notification rules. -func (c Client) getBucketNotification(bucketName string) (BucketNotification, error) { - urlValues := make(url.Values) - urlValues.Set("notification", "") - - // Execute GET on bucket to list objects. - resp, err := c.executeMethod(context.Background(), "GET", requestMetadata{ - bucketName: bucketName, - queryValues: urlValues, - contentSHA256Hex: emptySHA256Hex, - }) - - defer closeResponse(resp) - if err != nil { - return BucketNotification{}, err - } - return processBucketNotificationResponse(bucketName, resp) - -} - -// processes the GetNotification http response from the server. -func processBucketNotificationResponse(bucketName string, resp *http.Response) (BucketNotification, error) { - if resp.StatusCode != http.StatusOK { - errResponse := httpRespToErrorResponse(resp, bucketName, "") - return BucketNotification{}, errResponse - } - var bucketNotification BucketNotification - err := xmlDecoder(resp.Body, &bucketNotification) - if err != nil { - return BucketNotification{}, err - } - return bucketNotification, nil -} - -// Indentity represents the user id, this is a compliance field. -type identity struct { - PrincipalID string `json:"principalId"` -} - -// Notification event bucket metadata. -type bucketMeta struct { - Name string `json:"name"` - OwnerIdentity identity `json:"ownerIdentity"` - ARN string `json:"arn"` -} - -// Notification event object metadata. -type objectMeta struct { - Key string `json:"key"` - Size int64 `json:"size,omitempty"` - ETag string `json:"eTag,omitempty"` - VersionID string `json:"versionId,omitempty"` - Sequencer string `json:"sequencer"` -} - -// Notification event server specific metadata. -type eventMeta struct { - SchemaVersion string `json:"s3SchemaVersion"` - ConfigurationID string `json:"configurationId"` - Bucket bucketMeta `json:"bucket"` - Object objectMeta `json:"object"` -} - -// sourceInfo represents information on the client that -// triggered the event notification. -type sourceInfo struct { - Host string `json:"host"` - Port string `json:"port"` - UserAgent string `json:"userAgent"` -} - -// NotificationEvent represents an Amazon an S3 bucket notification event. -type NotificationEvent struct { - EventVersion string `json:"eventVersion"` - EventSource string `json:"eventSource"` - AwsRegion string `json:"awsRegion"` - EventTime string `json:"eventTime"` - EventName string `json:"eventName"` - UserIdentity identity `json:"userIdentity"` - RequestParameters map[string]string `json:"requestParameters"` - ResponseElements map[string]string `json:"responseElements"` - S3 eventMeta `json:"s3"` - Source sourceInfo `json:"source"` -} - -// NotificationInfo - represents the collection of notification events, additionally -// also reports errors if any while listening on bucket notifications. -type NotificationInfo struct { - Records []NotificationEvent - Err error -} - -// ListenBucketNotification - listen on bucket notifications. -func (c Client) ListenBucketNotification(bucketName, prefix, suffix string, events []string, doneCh <-chan struct{}) <-chan NotificationInfo { - notificationInfoCh := make(chan NotificationInfo, 1) - // Only success, start a routine to start reading line by line. - go func(notificationInfoCh chan<- NotificationInfo) { - defer close(notificationInfoCh) - - // Validate the bucket name. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - notificationInfoCh <- NotificationInfo{ - Err: err, - } - return - } - - // Check ARN partition to verify if listening bucket is supported - if s3utils.IsAmazonEndpoint(*c.endpointURL) || s3utils.IsGoogleEndpoint(*c.endpointURL) { - notificationInfoCh <- NotificationInfo{ - Err: ErrAPINotSupported("Listening for bucket notification is specific only to `minio` server endpoints"), - } - return - } - - // Continuously run and listen on bucket notification. - // Create a done channel to control 'ListObjects' go routine. - retryDoneCh := make(chan struct{}, 1) - - // Indicate to our routine to exit cleanly upon return. - defer close(retryDoneCh) - - // Wait on the jitter retry loop. - for range c.newRetryTimerContinous(time.Second, time.Second*30, MaxJitter, retryDoneCh) { - urlValues := make(url.Values) - urlValues.Set("prefix", prefix) - urlValues.Set("suffix", suffix) - urlValues["events"] = events - - // Execute GET on bucket to list objects. - resp, err := c.executeMethod(context.Background(), "GET", requestMetadata{ - bucketName: bucketName, - queryValues: urlValues, - contentSHA256Hex: emptySHA256Hex, - }) - if err != nil { - notificationInfoCh <- NotificationInfo{ - Err: err, - } - return - } - - // Validate http response, upon error return quickly. - if resp.StatusCode != http.StatusOK { - errResponse := httpRespToErrorResponse(resp, bucketName, "") - notificationInfoCh <- NotificationInfo{ - Err: errResponse, - } - return - } - - // Initialize a new bufio scanner, to read line by line. - bio := bufio.NewScanner(resp.Body) - - // Close the response body. - defer resp.Body.Close() - - // Unmarshal each line, returns marshalled values. - for bio.Scan() { - var notificationInfo NotificationInfo - if err = json.Unmarshal(bio.Bytes(), ¬ificationInfo); err != nil { - continue - } - // Send notificationInfo - select { - case notificationInfoCh <- notificationInfo: - case <-doneCh: - return - } - } - // Look for any underlying errors. - if err = bio.Err(); err != nil { - // For an unexpected connection drop from server, we close the body - // and re-connect. - if err == io.ErrUnexpectedEOF { - resp.Body.Close() - } - } - } - }(notificationInfoCh) - - // Returns the notification info channel, for caller to start reading from. - return notificationInfoCh -} diff --git a/vendor/github.com/minio/minio-go/api-presigned.go b/vendor/github.com/minio/minio-go/api-presigned.go deleted file mode 100644 index a2c060786..000000000 --- a/vendor/github.com/minio/minio-go/api-presigned.go +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import ( - "errors" - "net/http" - "net/url" - "time" - - "github.com/minio/minio-go/pkg/s3signer" - "github.com/minio/minio-go/pkg/s3utils" -) - -// presignURL - Returns a presigned URL for an input 'method'. -// Expires maximum is 7days - ie. 604800 and minimum is 1. -func (c Client) presignURL(method string, bucketName string, objectName string, expires time.Duration, reqParams url.Values) (u *url.URL, err error) { - // Input validation. - if method == "" { - return nil, ErrInvalidArgument("method cannot be empty.") - } - if err = s3utils.CheckValidBucketName(bucketName); err != nil { - return nil, err - } - if err = isValidExpiry(expires); err != nil { - return nil, err - } - - // Convert expires into seconds. - expireSeconds := int64(expires / time.Second) - reqMetadata := requestMetadata{ - presignURL: true, - bucketName: bucketName, - objectName: objectName, - expires: expireSeconds, - queryValues: reqParams, - } - - // Instantiate a new request. - // Since expires is set newRequest will presign the request. - var req *http.Request - if req, err = c.newRequest(method, reqMetadata); err != nil { - return nil, err - } - return req.URL, nil -} - -// PresignedGetObject - Returns a presigned URL to access an object -// data without credentials. URL can have a maximum expiry of -// upto 7days or a minimum of 1sec. Additionally you can override -// a set of response headers using the query parameters. -func (c Client) PresignedGetObject(bucketName string, objectName string, expires time.Duration, reqParams url.Values) (u *url.URL, err error) { - if err = s3utils.CheckValidObjectName(objectName); err != nil { - return nil, err - } - return c.presignURL("GET", bucketName, objectName, expires, reqParams) -} - -// PresignedHeadObject - Returns a presigned URL to access object -// metadata without credentials. URL can have a maximum expiry of -// upto 7days or a minimum of 1sec. Additionally you can override -// a set of response headers using the query parameters. -func (c Client) PresignedHeadObject(bucketName string, objectName string, expires time.Duration, reqParams url.Values) (u *url.URL, err error) { - if err = s3utils.CheckValidObjectName(objectName); err != nil { - return nil, err - } - return c.presignURL("HEAD", bucketName, objectName, expires, reqParams) -} - -// PresignedPutObject - Returns a presigned URL to upload an object -// without credentials. URL can have a maximum expiry of upto 7days -// or a minimum of 1sec. -func (c Client) PresignedPutObject(bucketName string, objectName string, expires time.Duration) (u *url.URL, err error) { - if err = s3utils.CheckValidObjectName(objectName); err != nil { - return nil, err - } - return c.presignURL("PUT", bucketName, objectName, expires, nil) -} - -// Presign - returns a presigned URL for any http method of your choice -// along with custom request params. URL can have a maximum expiry of -// upto 7days or a minimum of 1sec. -func (c Client) Presign(method string, bucketName string, objectName string, expires time.Duration, reqParams url.Values) (u *url.URL, err error) { - return c.presignURL(method, bucketName, objectName, expires, reqParams) -} - -// PresignedPostPolicy - Returns POST urlString, form data to upload an object. -func (c Client) PresignedPostPolicy(p *PostPolicy) (u *url.URL, formData map[string]string, err error) { - // Validate input arguments. - if p.expiration.IsZero() { - return nil, nil, errors.New("Expiration time must be specified") - } - if _, ok := p.formData["key"]; !ok { - return nil, nil, errors.New("object key must be specified") - } - if _, ok := p.formData["bucket"]; !ok { - return nil, nil, errors.New("bucket name must be specified") - } - - bucketName := p.formData["bucket"] - // Fetch the bucket location. - location, err := c.getBucketLocation(bucketName) - if err != nil { - return nil, nil, err - } - - isVirtualHost := c.isVirtualHostStyleRequest(*c.endpointURL, bucketName) - - u, err = c.makeTargetURL(bucketName, "", location, isVirtualHost, nil) - if err != nil { - return nil, nil, err - } - - // Get credentials from the configured credentials provider. - credValues, err := c.credsProvider.Get() - if err != nil { - return nil, nil, err - } - - var ( - signerType = credValues.SignerType - sessionToken = credValues.SessionToken - accessKeyID = credValues.AccessKeyID - secretAccessKey = credValues.SecretAccessKey - ) - - if signerType.IsAnonymous() { - return nil, nil, ErrInvalidArgument("Presigned operations are not supported for anonymous credentials") - } - - // Keep time. - t := time.Now().UTC() - // For signature version '2' handle here. - if signerType.IsV2() { - policyBase64 := p.base64() - p.formData["policy"] = policyBase64 - // For Google endpoint set this value to be 'GoogleAccessId'. - if s3utils.IsGoogleEndpoint(*c.endpointURL) { - p.formData["GoogleAccessId"] = accessKeyID - } else { - // For all other endpoints set this value to be 'AWSAccessKeyId'. - p.formData["AWSAccessKeyId"] = accessKeyID - } - // Sign the policy. - p.formData["signature"] = s3signer.PostPresignSignatureV2(policyBase64, secretAccessKey) - return u, p.formData, nil - } - - // Add date policy. - if err = p.addNewPolicy(policyCondition{ - matchType: "eq", - condition: "$x-amz-date", - value: t.Format(iso8601DateFormat), - }); err != nil { - return nil, nil, err - } - - // Add algorithm policy. - if err = p.addNewPolicy(policyCondition{ - matchType: "eq", - condition: "$x-amz-algorithm", - value: signV4Algorithm, - }); err != nil { - return nil, nil, err - } - - // Add a credential policy. - credential := s3signer.GetCredential(accessKeyID, location, t) - if err = p.addNewPolicy(policyCondition{ - matchType: "eq", - condition: "$x-amz-credential", - value: credential, - }); err != nil { - return nil, nil, err - } - - if sessionToken != "" { - if err = p.addNewPolicy(policyCondition{ - matchType: "eq", - condition: "$x-amz-security-token", - value: sessionToken, - }); err != nil { - return nil, nil, err - } - } - - // Get base64 encoded policy. - policyBase64 := p.base64() - - // Fill in the form data. - p.formData["policy"] = policyBase64 - p.formData["x-amz-algorithm"] = signV4Algorithm - p.formData["x-amz-credential"] = credential - p.formData["x-amz-date"] = t.Format(iso8601DateFormat) - if sessionToken != "" { - p.formData["x-amz-security-token"] = sessionToken - } - p.formData["x-amz-signature"] = s3signer.PostPresignSignatureV4(policyBase64, t, secretAccessKey, location) - return u, p.formData, nil -} diff --git a/vendor/github.com/minio/minio-go/api-put-bucket.go b/vendor/github.com/minio/minio-go/api-put-bucket.go deleted file mode 100644 index cb9d8f27a..000000000 --- a/vendor/github.com/minio/minio-go/api-put-bucket.go +++ /dev/null @@ -1,225 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import ( - "bytes" - "context" - "encoding/xml" - "io/ioutil" - "net/http" - "net/url" - "strings" - - "github.com/minio/minio-go/pkg/s3utils" -) - -/// Bucket operations - -// MakeBucket creates a new bucket with bucketName. -// -// Location is an optional argument, by default all buckets are -// created in US Standard Region. -// -// For Amazon S3 for more supported regions - http://docs.aws.amazon.com/general/latest/gr/rande.html -// For Google Cloud Storage for more supported regions - https://cloud.google.com/storage/docs/bucket-locations -func (c Client) MakeBucket(bucketName string, location string) (err error) { - defer func() { - // Save the location into cache on a successful makeBucket response. - if err == nil { - c.bucketLocCache.Set(bucketName, location) - } - }() - - // Validate the input arguments. - if err := s3utils.CheckValidBucketNameStrict(bucketName); err != nil { - return err - } - - // If location is empty, treat is a default region 'us-east-1'. - if location == "" { - location = "us-east-1" - // For custom region clients, default - // to custom region instead not 'us-east-1'. - if c.region != "" { - location = c.region - } - } - // PUT bucket request metadata. - reqMetadata := requestMetadata{ - bucketName: bucketName, - bucketLocation: location, - } - - // If location is not 'us-east-1' create bucket location config. - if location != "us-east-1" && location != "" { - createBucketConfig := createBucketConfiguration{} - createBucketConfig.Location = location - var createBucketConfigBytes []byte - createBucketConfigBytes, err = xml.Marshal(createBucketConfig) - if err != nil { - return err - } - reqMetadata.contentMD5Base64 = sumMD5Base64(createBucketConfigBytes) - reqMetadata.contentSHA256Hex = sum256Hex(createBucketConfigBytes) - reqMetadata.contentBody = bytes.NewReader(createBucketConfigBytes) - reqMetadata.contentLength = int64(len(createBucketConfigBytes)) - } - - // Execute PUT to create a new bucket. - resp, err := c.executeMethod(context.Background(), "PUT", reqMetadata) - defer closeResponse(resp) - if err != nil { - return err - } - - if resp != nil { - if resp.StatusCode != http.StatusOK { - return httpRespToErrorResponse(resp, bucketName, "") - } - } - - // Success. - return nil -} - -// SetBucketPolicy set the access permissions on an existing bucket. -func (c Client) SetBucketPolicy(bucketName, policy string) error { - // Input validation. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - return err - } - - // If policy is empty then delete the bucket policy. - if policy == "" { - return c.removeBucketPolicy(bucketName) - } - - // Save the updated policies. - return c.putBucketPolicy(bucketName, policy) -} - -// Saves a new bucket policy. -func (c Client) putBucketPolicy(bucketName, policy string) error { - // Input validation. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - return err - } - - // Get resources properly escaped and lined up before - // using them in http request. - urlValues := make(url.Values) - urlValues.Set("policy", "") - - // Content-length is mandatory for put policy request - policyReader := strings.NewReader(policy) - b, err := ioutil.ReadAll(policyReader) - if err != nil { - return err - } - - reqMetadata := requestMetadata{ - bucketName: bucketName, - queryValues: urlValues, - contentBody: policyReader, - contentLength: int64(len(b)), - } - - // Execute PUT to upload a new bucket policy. - resp, err := c.executeMethod(context.Background(), "PUT", reqMetadata) - defer closeResponse(resp) - if err != nil { - return err - } - if resp != nil { - if resp.StatusCode != http.StatusNoContent { - return httpRespToErrorResponse(resp, bucketName, "") - } - } - return nil -} - -// Removes all policies on a bucket. -func (c Client) removeBucketPolicy(bucketName string) error { - // Input validation. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - return err - } - // Get resources properly escaped and lined up before - // using them in http request. - urlValues := make(url.Values) - urlValues.Set("policy", "") - - // Execute DELETE on objectName. - resp, err := c.executeMethod(context.Background(), "DELETE", requestMetadata{ - bucketName: bucketName, - queryValues: urlValues, - contentSHA256Hex: emptySHA256Hex, - }) - defer closeResponse(resp) - if err != nil { - return err - } - return nil -} - -// SetBucketNotification saves a new bucket notification. -func (c Client) SetBucketNotification(bucketName string, bucketNotification BucketNotification) error { - // Input validation. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - return err - } - - // Get resources properly escaped and lined up before - // using them in http request. - urlValues := make(url.Values) - urlValues.Set("notification", "") - - notifBytes, err := xml.Marshal(bucketNotification) - if err != nil { - return err - } - - notifBuffer := bytes.NewReader(notifBytes) - reqMetadata := requestMetadata{ - bucketName: bucketName, - queryValues: urlValues, - contentBody: notifBuffer, - contentLength: int64(len(notifBytes)), - contentMD5Base64: sumMD5Base64(notifBytes), - contentSHA256Hex: sum256Hex(notifBytes), - } - - // Execute PUT to upload a new bucket notification. - resp, err := c.executeMethod(context.Background(), "PUT", reqMetadata) - defer closeResponse(resp) - if err != nil { - return err - } - if resp != nil { - if resp.StatusCode != http.StatusOK { - return httpRespToErrorResponse(resp, bucketName, "") - } - } - return nil -} - -// RemoveAllBucketNotification - Remove bucket notification clears all previously specified config -func (c Client) RemoveAllBucketNotification(bucketName string) error { - return c.SetBucketNotification(bucketName, BucketNotification{}) -} diff --git a/vendor/github.com/minio/minio-go/api-put-object-common.go b/vendor/github.com/minio/minio-go/api-put-object-common.go deleted file mode 100644 index c16c3c69a..000000000 --- a/vendor/github.com/minio/minio-go/api-put-object-common.go +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import ( - "context" - "io" - "math" - "os" - - "github.com/minio/minio-go/pkg/s3utils" -) - -// Verify if reader is *minio.Object -func isObject(reader io.Reader) (ok bool) { - _, ok = reader.(*Object) - return -} - -// Verify if reader is a generic ReaderAt -func isReadAt(reader io.Reader) (ok bool) { - _, ok = reader.(io.ReaderAt) - if ok { - var v *os.File - v, ok = reader.(*os.File) - if ok { - // Stdin, Stdout and Stderr all have *os.File type - // which happen to also be io.ReaderAt compatible - // we need to add special conditions for them to - // be ignored by this function. - for _, f := range []string{ - "/dev/stdin", - "/dev/stdout", - "/dev/stderr", - } { - if f == v.Name() { - ok = false - break - } - } - } - } - return -} - -// optimalPartInfo - calculate the optimal part info for a given -// object size. -// -// NOTE: Assumption here is that for any object to be uploaded to any S3 compatible -// object storage it will have the following parameters as constants. -// -// maxPartsCount - 10000 -// minPartSize - 64MiB -// maxMultipartPutObjectSize - 5TiB -// -func optimalPartInfo(objectSize int64) (totalPartsCount int, partSize int64, lastPartSize int64, err error) { - // object size is '-1' set it to 5TiB. - if objectSize == -1 { - objectSize = maxMultipartPutObjectSize - } - // object size is larger than supported maximum. - if objectSize > maxMultipartPutObjectSize { - err = ErrEntityTooLarge(objectSize, maxMultipartPutObjectSize, "", "") - return - } - // Use floats for part size for all calculations to avoid - // overflows during float64 to int64 conversions. - partSizeFlt := math.Ceil(float64(objectSize / maxPartsCount)) - partSizeFlt = math.Ceil(partSizeFlt/minPartSize) * minPartSize - // Total parts count. - totalPartsCount = int(math.Ceil(float64(objectSize) / partSizeFlt)) - // Part size. - partSize = int64(partSizeFlt) - // Last part size. - lastPartSize = objectSize - int64(totalPartsCount-1)*partSize - return totalPartsCount, partSize, lastPartSize, nil -} - -// getUploadID - fetch upload id if already present for an object name -// or initiate a new request to fetch a new upload id. -func (c Client) newUploadID(ctx context.Context, bucketName, objectName string, opts PutObjectOptions) (uploadID string, err error) { - // Input validation. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - return "", err - } - if err := s3utils.CheckValidObjectName(objectName); err != nil { - return "", err - } - - // Initiate multipart upload for an object. - initMultipartUploadResult, err := c.initiateMultipartUpload(ctx, bucketName, objectName, opts) - if err != nil { - return "", err - } - return initMultipartUploadResult.UploadID, nil -} diff --git a/vendor/github.com/minio/minio-go/api-put-object-context.go b/vendor/github.com/minio/minio-go/api-put-object-context.go deleted file mode 100644 index ff4663e2f..000000000 --- a/vendor/github.com/minio/minio-go/api-put-object-context.go +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import ( - "context" - "io" -) - -// PutObjectWithContext - Identical to PutObject call, but accepts context to facilitate request cancellation. -func (c Client) PutObjectWithContext(ctx context.Context, bucketName, objectName string, reader io.Reader, objectSize int64, - opts PutObjectOptions) (n int64, err error) { - err = opts.validate() - if err != nil { - return 0, err - } - return c.putObjectCommon(ctx, bucketName, objectName, reader, objectSize, opts) -} diff --git a/vendor/github.com/minio/minio-go/api-put-object-copy.go b/vendor/github.com/minio/minio-go/api-put-object-copy.go deleted file mode 100644 index 21322ef6a..000000000 --- a/vendor/github.com/minio/minio-go/api-put-object-copy.go +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2017, 2018 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import ( - "context" - "io" - "io/ioutil" - "net/http" - - "github.com/minio/minio-go/pkg/encrypt" -) - -// CopyObject - copy a source object into a new object -func (c Client) CopyObject(dst DestinationInfo, src SourceInfo) error { - return c.CopyObjectWithProgress(dst, src, nil) -} - -// CopyObjectWithProgress - copy a source object into a new object, optionally takes -// progress bar input to notify current progress. -func (c Client) CopyObjectWithProgress(dst DestinationInfo, src SourceInfo, progress io.Reader) error { - header := make(http.Header) - for k, v := range src.Headers { - header[k] = v - } - - var err error - var size int64 - // If progress bar is specified, size should be requested as well initiate a StatObject request. - if progress != nil { - size, _, _, err = src.getProps(c) - if err != nil { - return err - } - } - - if src.encryption != nil { - encrypt.SSECopy(src.encryption).Marshal(header) - } - - if dst.encryption != nil { - dst.encryption.Marshal(header) - } - for k, v := range dst.getUserMetaHeadersMap(true) { - header.Set(k, v) - } - - resp, err := c.executeMethod(context.Background(), "PUT", requestMetadata{ - bucketName: dst.bucket, - objectName: dst.object, - customHeader: header, - }) - if err != nil { - return err - } - defer closeResponse(resp) - - if resp.StatusCode != http.StatusOK { - return httpRespToErrorResponse(resp, dst.bucket, dst.object) - } - - // Update the progress properly after successful copy. - if progress != nil { - io.CopyN(ioutil.Discard, progress, size) - } - - return nil -} diff --git a/vendor/github.com/minio/minio-go/api-put-object-file-context.go b/vendor/github.com/minio/minio-go/api-put-object-file-context.go deleted file mode 100644 index 140a9c069..000000000 --- a/vendor/github.com/minio/minio-go/api-put-object-file-context.go +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import ( - "context" - "mime" - "os" - "path/filepath" - - "github.com/minio/minio-go/pkg/s3utils" -) - -// FPutObjectWithContext - Create an object in a bucket, with contents from file at filePath. Allows request cancellation. -func (c Client) FPutObjectWithContext(ctx context.Context, bucketName, objectName, filePath string, opts PutObjectOptions) (n int64, err error) { - // Input validation. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - return 0, err - } - if err := s3utils.CheckValidObjectName(objectName); err != nil { - return 0, err - } - - // Open the referenced file. - fileReader, err := os.Open(filePath) - // If any error fail quickly here. - if err != nil { - return 0, err - } - defer fileReader.Close() - - // Save the file stat. - fileStat, err := fileReader.Stat() - if err != nil { - return 0, err - } - - // Save the file size. - fileSize := fileStat.Size() - - // Set contentType based on filepath extension if not given or default - // value of "application/octet-stream" if the extension has no associated type. - if opts.ContentType == "" { - if opts.ContentType = mime.TypeByExtension(filepath.Ext(filePath)); opts.ContentType == "" { - opts.ContentType = "application/octet-stream" - } - } - return c.PutObjectWithContext(ctx, bucketName, objectName, fileReader, fileSize, opts) -} diff --git a/vendor/github.com/minio/minio-go/api-put-object-file.go b/vendor/github.com/minio/minio-go/api-put-object-file.go deleted file mode 100644 index 7c8e05117..000000000 --- a/vendor/github.com/minio/minio-go/api-put-object-file.go +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import ( - "context" -) - -// FPutObject - Create an object in a bucket, with contents from file at filePath -func (c Client) FPutObject(bucketName, objectName, filePath string, opts PutObjectOptions) (n int64, err error) { - return c.FPutObjectWithContext(context.Background(), bucketName, objectName, filePath, opts) -} diff --git a/vendor/github.com/minio/minio-go/api-put-object-multipart.go b/vendor/github.com/minio/minio-go/api-put-object-multipart.go deleted file mode 100644 index 52dc069d0..000000000 --- a/vendor/github.com/minio/minio-go/api-put-object-multipart.go +++ /dev/null @@ -1,368 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import ( - "bytes" - "context" - "encoding/base64" - "encoding/hex" - "encoding/xml" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/url" - "runtime/debug" - "sort" - "strconv" - "strings" - - "github.com/minio/minio-go/pkg/encrypt" - "github.com/minio/minio-go/pkg/s3utils" -) - -func (c Client) putObjectMultipart(ctx context.Context, bucketName, objectName string, reader io.Reader, size int64, - opts PutObjectOptions) (n int64, err error) { - n, err = c.putObjectMultipartNoStream(ctx, bucketName, objectName, reader, opts) - if err != nil { - errResp := ToErrorResponse(err) - // Verify if multipart functionality is not available, if not - // fall back to single PutObject operation. - if errResp.Code == "AccessDenied" && strings.Contains(errResp.Message, "Access Denied") { - // Verify if size of reader is greater than '5GiB'. - if size > maxSinglePutObjectSize { - return 0, ErrEntityTooLarge(size, maxSinglePutObjectSize, bucketName, objectName) - } - // Fall back to uploading as single PutObject operation. - return c.putObjectNoChecksum(ctx, bucketName, objectName, reader, size, opts) - } - } - return n, err -} - -func (c Client) putObjectMultipartNoStream(ctx context.Context, bucketName, objectName string, reader io.Reader, opts PutObjectOptions) (n int64, err error) { - // Input validation. - if err = s3utils.CheckValidBucketName(bucketName); err != nil { - return 0, err - } - if err = s3utils.CheckValidObjectName(objectName); err != nil { - return 0, err - } - - // Total data read and written to server. should be equal to - // 'size' at the end of the call. - var totalUploadedSize int64 - - // Complete multipart upload. - var complMultipartUpload completeMultipartUpload - - // Calculate the optimal parts info for a given size. - totalPartsCount, partSize, _, err := optimalPartInfo(-1) - if err != nil { - return 0, err - } - - // Initiate a new multipart upload. - uploadID, err := c.newUploadID(ctx, bucketName, objectName, opts) - if err != nil { - return 0, err - } - - defer func() { - if err != nil { - c.abortMultipartUpload(ctx, bucketName, objectName, uploadID) - } - }() - - // Part number always starts with '1'. - partNumber := 1 - - // Initialize parts uploaded map. - partsInfo := make(map[int]ObjectPart) - - // Create a buffer. - buf := make([]byte, partSize) - defer debug.FreeOSMemory() - - for partNumber <= totalPartsCount { - // Choose hash algorithms to be calculated by hashCopyN, - // avoid sha256 with non-v4 signature request or - // HTTPS connection. - hashAlgos, hashSums := c.hashMaterials() - - length, rErr := io.ReadFull(reader, buf) - if rErr == io.EOF { - break - } - if rErr != nil && rErr != io.ErrUnexpectedEOF { - return 0, rErr - } - - // Calculates hash sums while copying partSize bytes into cw. - for k, v := range hashAlgos { - v.Write(buf[:length]) - hashSums[k] = v.Sum(nil) - } - - // Update progress reader appropriately to the latest offset - // as we read from the source. - rd := newHook(bytes.NewReader(buf[:length]), opts.Progress) - - // Checksums.. - var ( - md5Base64 string - sha256Hex string - ) - if hashSums["md5"] != nil { - md5Base64 = base64.StdEncoding.EncodeToString(hashSums["md5"]) - } - if hashSums["sha256"] != nil { - sha256Hex = hex.EncodeToString(hashSums["sha256"]) - } - - // Proceed to upload the part. - var objPart ObjectPart - objPart, err = c.uploadPart(ctx, bucketName, objectName, uploadID, rd, partNumber, - md5Base64, sha256Hex, int64(length), opts.ServerSideEncryption) - if err != nil { - return totalUploadedSize, err - } - - // Save successfully uploaded part metadata. - partsInfo[partNumber] = objPart - - // Save successfully uploaded size. - totalUploadedSize += int64(length) - - // Increment part number. - partNumber++ - - // For unknown size, Read EOF we break away. - // We do not have to upload till totalPartsCount. - if rErr == io.EOF { - break - } - } - - // Loop over total uploaded parts to save them in - // Parts array before completing the multipart request. - for i := 1; i < partNumber; i++ { - part, ok := partsInfo[i] - if !ok { - return 0, ErrInvalidArgument(fmt.Sprintf("Missing part number %d", i)) - } - complMultipartUpload.Parts = append(complMultipartUpload.Parts, CompletePart{ - ETag: part.ETag, - PartNumber: part.PartNumber, - }) - } - - // Sort all completed parts. - sort.Sort(completedParts(complMultipartUpload.Parts)) - if _, err = c.completeMultipartUpload(ctx, bucketName, objectName, uploadID, complMultipartUpload); err != nil { - return totalUploadedSize, err - } - - // Return final size. - return totalUploadedSize, nil -} - -// initiateMultipartUpload - Initiates a multipart upload and returns an upload ID. -func (c Client) initiateMultipartUpload(ctx context.Context, bucketName, objectName string, opts PutObjectOptions) (initiateMultipartUploadResult, error) { - // Input validation. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - return initiateMultipartUploadResult{}, err - } - if err := s3utils.CheckValidObjectName(objectName); err != nil { - return initiateMultipartUploadResult{}, err - } - - // Initialize url queries. - urlValues := make(url.Values) - urlValues.Set("uploads", "") - - // Set ContentType header. - customHeader := opts.Header() - - reqMetadata := requestMetadata{ - bucketName: bucketName, - objectName: objectName, - queryValues: urlValues, - customHeader: customHeader, - } - - // Execute POST on an objectName to initiate multipart upload. - resp, err := c.executeMethod(ctx, "POST", reqMetadata) - defer closeResponse(resp) - if err != nil { - return initiateMultipartUploadResult{}, err - } - if resp != nil { - if resp.StatusCode != http.StatusOK { - return initiateMultipartUploadResult{}, httpRespToErrorResponse(resp, bucketName, objectName) - } - } - // Decode xml for new multipart upload. - initiateMultipartUploadResult := initiateMultipartUploadResult{} - err = xmlDecoder(resp.Body, &initiateMultipartUploadResult) - if err != nil { - return initiateMultipartUploadResult, err - } - return initiateMultipartUploadResult, nil -} - -// uploadPart - Uploads a part in a multipart upload. -func (c Client) uploadPart(ctx context.Context, bucketName, objectName, uploadID string, reader io.Reader, - partNumber int, md5Base64, sha256Hex string, size int64, sse encrypt.ServerSide) (ObjectPart, error) { - // Input validation. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - return ObjectPart{}, err - } - if err := s3utils.CheckValidObjectName(objectName); err != nil { - return ObjectPart{}, err - } - if size > maxPartSize { - return ObjectPart{}, ErrEntityTooLarge(size, maxPartSize, bucketName, objectName) - } - if size <= -1 { - return ObjectPart{}, ErrEntityTooSmall(size, bucketName, objectName) - } - if partNumber <= 0 { - return ObjectPart{}, ErrInvalidArgument("Part number cannot be negative or equal to zero.") - } - if uploadID == "" { - return ObjectPart{}, ErrInvalidArgument("UploadID cannot be empty.") - } - - // Get resources properly escaped and lined up before using them in http request. - urlValues := make(url.Values) - // Set part number. - urlValues.Set("partNumber", strconv.Itoa(partNumber)) - // Set upload id. - urlValues.Set("uploadId", uploadID) - - // Set encryption headers, if any. - customHeader := make(http.Header) - if sse != nil && sse.Type() != encrypt.S3 && sse.Type() != encrypt.KMS { - sse.Marshal(customHeader) - } - - reqMetadata := requestMetadata{ - bucketName: bucketName, - objectName: objectName, - queryValues: urlValues, - customHeader: customHeader, - contentBody: reader, - contentLength: size, - contentMD5Base64: md5Base64, - contentSHA256Hex: sha256Hex, - } - - // Execute PUT on each part. - resp, err := c.executeMethod(ctx, "PUT", reqMetadata) - defer closeResponse(resp) - if err != nil { - return ObjectPart{}, err - } - if resp != nil { - if resp.StatusCode != http.StatusOK { - return ObjectPart{}, httpRespToErrorResponse(resp, bucketName, objectName) - } - } - // Once successfully uploaded, return completed part. - objPart := ObjectPart{} - objPart.Size = size - objPart.PartNumber = partNumber - // Trim off the odd double quotes from ETag in the beginning and end. - objPart.ETag = strings.TrimPrefix(resp.Header.Get("ETag"), "\"") - objPart.ETag = strings.TrimSuffix(objPart.ETag, "\"") - return objPart, nil -} - -// completeMultipartUpload - Completes a multipart upload by assembling previously uploaded parts. -func (c Client) completeMultipartUpload(ctx context.Context, bucketName, objectName, uploadID string, - complete completeMultipartUpload) (completeMultipartUploadResult, error) { - // Input validation. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - return completeMultipartUploadResult{}, err - } - if err := s3utils.CheckValidObjectName(objectName); err != nil { - return completeMultipartUploadResult{}, err - } - - // Initialize url queries. - urlValues := make(url.Values) - urlValues.Set("uploadId", uploadID) - // Marshal complete multipart body. - completeMultipartUploadBytes, err := xml.Marshal(complete) - if err != nil { - return completeMultipartUploadResult{}, err - } - - // Instantiate all the complete multipart buffer. - completeMultipartUploadBuffer := bytes.NewReader(completeMultipartUploadBytes) - reqMetadata := requestMetadata{ - bucketName: bucketName, - objectName: objectName, - queryValues: urlValues, - contentBody: completeMultipartUploadBuffer, - contentLength: int64(len(completeMultipartUploadBytes)), - contentSHA256Hex: sum256Hex(completeMultipartUploadBytes), - } - - // Execute POST to complete multipart upload for an objectName. - resp, err := c.executeMethod(ctx, "POST", reqMetadata) - defer closeResponse(resp) - if err != nil { - return completeMultipartUploadResult{}, err - } - if resp != nil { - if resp.StatusCode != http.StatusOK { - return completeMultipartUploadResult{}, httpRespToErrorResponse(resp, bucketName, objectName) - } - } - - // Read resp.Body into a []bytes to parse for Error response inside the body - var b []byte - b, err = ioutil.ReadAll(resp.Body) - if err != nil { - return completeMultipartUploadResult{}, err - } - // Decode completed multipart upload response on success. - completeMultipartUploadResult := completeMultipartUploadResult{} - err = xmlDecoder(bytes.NewReader(b), &completeMultipartUploadResult) - if err != nil { - // xml parsing failure due to presence an ill-formed xml fragment - return completeMultipartUploadResult, err - } else if completeMultipartUploadResult.Bucket == "" { - // xml's Decode method ignores well-formed xml that don't apply to the type of value supplied. - // In this case, it would leave completeMultipartUploadResult with the corresponding zero-values - // of the members. - - // Decode completed multipart upload response on failure - completeMultipartUploadErr := ErrorResponse{} - err = xmlDecoder(bytes.NewReader(b), &completeMultipartUploadErr) - if err != nil { - // xml parsing failure due to presence an ill-formed xml fragment - return completeMultipartUploadResult, err - } - return completeMultipartUploadResult, completeMultipartUploadErr - } - return completeMultipartUploadResult, nil -} diff --git a/vendor/github.com/minio/minio-go/api-put-object-streaming.go b/vendor/github.com/minio/minio-go/api-put-object-streaming.go deleted file mode 100644 index 211d1c23c..000000000 --- a/vendor/github.com/minio/minio-go/api-put-object-streaming.go +++ /dev/null @@ -1,417 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import ( - "context" - "fmt" - "io" - "net/http" - "sort" - "strings" - - "github.com/minio/minio-go/pkg/s3utils" -) - -// putObjectMultipartStream - upload a large object using -// multipart upload and streaming signature for signing payload. -// Comprehensive put object operation involving multipart uploads. -// -// Following code handles these types of readers. -// -// - *minio.Object -// - Any reader which has a method 'ReadAt()' -// -func (c Client) putObjectMultipartStream(ctx context.Context, bucketName, objectName string, - reader io.Reader, size int64, opts PutObjectOptions) (n int64, err error) { - - if !isObject(reader) && isReadAt(reader) { - // Verify if the reader implements ReadAt and it is not a *minio.Object then we will use parallel uploader. - n, err = c.putObjectMultipartStreamFromReadAt(ctx, bucketName, objectName, reader.(io.ReaderAt), size, opts) - } else { - n, err = c.putObjectMultipartStreamNoChecksum(ctx, bucketName, objectName, reader, size, opts) - } - if err != nil { - errResp := ToErrorResponse(err) - // Verify if multipart functionality is not available, if not - // fall back to single PutObject operation. - if errResp.Code == "AccessDenied" && strings.Contains(errResp.Message, "Access Denied") { - // Verify if size of reader is greater than '5GiB'. - if size > maxSinglePutObjectSize { - return 0, ErrEntityTooLarge(size, maxSinglePutObjectSize, bucketName, objectName) - } - // Fall back to uploading as single PutObject operation. - return c.putObjectNoChecksum(ctx, bucketName, objectName, reader, size, opts) - } - } - return n, err -} - -// uploadedPartRes - the response received from a part upload. -type uploadedPartRes struct { - Error error // Any error encountered while uploading the part. - PartNum int // Number of the part uploaded. - Size int64 // Size of the part uploaded. - Part *ObjectPart -} - -type uploadPartReq struct { - PartNum int // Number of the part uploaded. - Part *ObjectPart // Size of the part uploaded. -} - -// putObjectMultipartFromReadAt - Uploads files bigger than 64MiB. -// Supports all readers which implements io.ReaderAt interface -// (ReadAt method). -// -// NOTE: This function is meant to be used for all readers which -// implement io.ReaderAt which allows us for resuming multipart -// uploads but reading at an offset, which would avoid re-read the -// data which was already uploaded. Internally this function uses -// temporary files for staging all the data, these temporary files are -// cleaned automatically when the caller i.e http client closes the -// stream after uploading all the contents successfully. -func (c Client) putObjectMultipartStreamFromReadAt(ctx context.Context, bucketName, objectName string, - reader io.ReaderAt, size int64, opts PutObjectOptions) (n int64, err error) { - // Input validation. - if err = s3utils.CheckValidBucketName(bucketName); err != nil { - return 0, err - } - if err = s3utils.CheckValidObjectName(objectName); err != nil { - return 0, err - } - - // Calculate the optimal parts info for a given size. - totalPartsCount, partSize, lastPartSize, err := optimalPartInfo(size) - if err != nil { - return 0, err - } - - // Initiate a new multipart upload. - uploadID, err := c.newUploadID(ctx, bucketName, objectName, opts) - if err != nil { - return 0, err - } - - // Aborts the multipart upload in progress, if the - // function returns any error, since we do not resume - // we should purge the parts which have been uploaded - // to relinquish storage space. - defer func() { - if err != nil { - c.abortMultipartUpload(ctx, bucketName, objectName, uploadID) - } - }() - - // Total data read and written to server. should be equal to 'size' at the end of the call. - var totalUploadedSize int64 - - // Complete multipart upload. - var complMultipartUpload completeMultipartUpload - - // Declare a channel that sends the next part number to be uploaded. - // Buffered to 10000 because thats the maximum number of parts allowed - // by S3. - uploadPartsCh := make(chan uploadPartReq, 10000) - - // Declare a channel that sends back the response of a part upload. - // Buffered to 10000 because thats the maximum number of parts allowed - // by S3. - uploadedPartsCh := make(chan uploadedPartRes, 10000) - - // Used for readability, lastPartNumber is always totalPartsCount. - lastPartNumber := totalPartsCount - - // Send each part number to the channel to be processed. - for p := 1; p <= totalPartsCount; p++ { - uploadPartsCh <- uploadPartReq{PartNum: p, Part: nil} - } - close(uploadPartsCh) - // Receive each part number from the channel allowing three parallel uploads. - for w := 1; w <= opts.getNumThreads(); w++ { - go func(partSize int64) { - // Each worker will draw from the part channel and upload in parallel. - for uploadReq := range uploadPartsCh { - - // If partNumber was not uploaded we calculate the missing - // part offset and size. For all other part numbers we - // calculate offset based on multiples of partSize. - readOffset := int64(uploadReq.PartNum-1) * partSize - - // As a special case if partNumber is lastPartNumber, we - // calculate the offset based on the last part size. - if uploadReq.PartNum == lastPartNumber { - readOffset = (size - lastPartSize) - partSize = lastPartSize - } - - // Get a section reader on a particular offset. - sectionReader := newHook(io.NewSectionReader(reader, readOffset, partSize), opts.Progress) - - // Proceed to upload the part. - var objPart ObjectPart - objPart, err = c.uploadPart(ctx, bucketName, objectName, uploadID, - sectionReader, uploadReq.PartNum, - "", "", partSize, opts.ServerSideEncryption) - if err != nil { - uploadedPartsCh <- uploadedPartRes{ - Size: 0, - Error: err, - } - // Exit the goroutine. - return - } - - // Save successfully uploaded part metadata. - uploadReq.Part = &objPart - - // Send successful part info through the channel. - uploadedPartsCh <- uploadedPartRes{ - Size: objPart.Size, - PartNum: uploadReq.PartNum, - Part: uploadReq.Part, - Error: nil, - } - } - }(partSize) - } - - // Gather the responses as they occur and update any - // progress bar. - for u := 1; u <= totalPartsCount; u++ { - uploadRes := <-uploadedPartsCh - if uploadRes.Error != nil { - return totalUploadedSize, uploadRes.Error - } - // Retrieve each uploaded part and store it to be completed. - // part, ok := partsInfo[uploadRes.PartNum] - part := uploadRes.Part - if part == nil { - return 0, ErrInvalidArgument(fmt.Sprintf("Missing part number %d", uploadRes.PartNum)) - } - // Update the totalUploadedSize. - totalUploadedSize += uploadRes.Size - // Store the parts to be completed in order. - complMultipartUpload.Parts = append(complMultipartUpload.Parts, CompletePart{ - ETag: part.ETag, - PartNumber: part.PartNumber, - }) - } - - // Verify if we uploaded all the data. - if totalUploadedSize != size { - return totalUploadedSize, ErrUnexpectedEOF(totalUploadedSize, size, bucketName, objectName) - } - - // Sort all completed parts. - sort.Sort(completedParts(complMultipartUpload.Parts)) - _, err = c.completeMultipartUpload(ctx, bucketName, objectName, uploadID, complMultipartUpload) - if err != nil { - return totalUploadedSize, err - } - - // Return final size. - return totalUploadedSize, nil -} - -func (c Client) putObjectMultipartStreamNoChecksum(ctx context.Context, bucketName, objectName string, - reader io.Reader, size int64, opts PutObjectOptions) (n int64, err error) { - // Input validation. - if err = s3utils.CheckValidBucketName(bucketName); err != nil { - return 0, err - } - if err = s3utils.CheckValidObjectName(objectName); err != nil { - return 0, err - } - - // Calculate the optimal parts info for a given size. - totalPartsCount, partSize, lastPartSize, err := optimalPartInfo(size) - if err != nil { - return 0, err - } - // Initiates a new multipart request - uploadID, err := c.newUploadID(ctx, bucketName, objectName, opts) - if err != nil { - return 0, err - } - - // Aborts the multipart upload if the function returns - // any error, since we do not resume we should purge - // the parts which have been uploaded to relinquish - // storage space. - defer func() { - if err != nil { - c.abortMultipartUpload(ctx, bucketName, objectName, uploadID) - } - }() - - // Total data read and written to server. should be equal to 'size' at the end of the call. - var totalUploadedSize int64 - - // Initialize parts uploaded map. - partsInfo := make(map[int]ObjectPart) - - // Part number always starts with '1'. - var partNumber int - for partNumber = 1; partNumber <= totalPartsCount; partNumber++ { - // Update progress reader appropriately to the latest offset - // as we read from the source. - hookReader := newHook(reader, opts.Progress) - - // Proceed to upload the part. - if partNumber == totalPartsCount { - partSize = lastPartSize - } - var objPart ObjectPart - objPart, err = c.uploadPart(ctx, bucketName, objectName, uploadID, - io.LimitReader(hookReader, partSize), - partNumber, "", "", partSize, opts.ServerSideEncryption) - if err != nil { - return totalUploadedSize, err - } - - // Save successfully uploaded part metadata. - partsInfo[partNumber] = objPart - - // Save successfully uploaded size. - totalUploadedSize += partSize - } - - // Verify if we uploaded all the data. - if size > 0 { - if totalUploadedSize != size { - return totalUploadedSize, ErrUnexpectedEOF(totalUploadedSize, size, bucketName, objectName) - } - } - - // Complete multipart upload. - var complMultipartUpload completeMultipartUpload - - // Loop over total uploaded parts to save them in - // Parts array before completing the multipart request. - for i := 1; i < partNumber; i++ { - part, ok := partsInfo[i] - if !ok { - return 0, ErrInvalidArgument(fmt.Sprintf("Missing part number %d", i)) - } - complMultipartUpload.Parts = append(complMultipartUpload.Parts, CompletePart{ - ETag: part.ETag, - PartNumber: part.PartNumber, - }) - } - - // Sort all completed parts. - sort.Sort(completedParts(complMultipartUpload.Parts)) - _, err = c.completeMultipartUpload(ctx, bucketName, objectName, uploadID, complMultipartUpload) - if err != nil { - return totalUploadedSize, err - } - - // Return final size. - return totalUploadedSize, nil -} - -// putObjectNoChecksum special function used Google Cloud Storage. This special function -// is used for Google Cloud Storage since Google's multipart API is not S3 compatible. -func (c Client) putObjectNoChecksum(ctx context.Context, bucketName, objectName string, reader io.Reader, size int64, opts PutObjectOptions) (n int64, err error) { - // Input validation. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - return 0, err - } - if err := s3utils.CheckValidObjectName(objectName); err != nil { - return 0, err - } - - // Size -1 is only supported on Google Cloud Storage, we error - // out in all other situations. - if size < 0 && !s3utils.IsGoogleEndpoint(*c.endpointURL) { - return 0, ErrEntityTooSmall(size, bucketName, objectName) - } - if size > 0 { - if isReadAt(reader) && !isObject(reader) { - seeker, _ := reader.(io.Seeker) - offset, err := seeker.Seek(0, io.SeekCurrent) - if err != nil { - return 0, ErrInvalidArgument(err.Error()) - } - reader = io.NewSectionReader(reader.(io.ReaderAt), offset, size) - } - } - - // Update progress reader appropriately to the latest offset as we - // read from the source. - readSeeker := newHook(reader, opts.Progress) - - // This function does not calculate sha256 and md5sum for payload. - // Execute put object. - st, err := c.putObjectDo(ctx, bucketName, objectName, readSeeker, "", "", size, opts) - if err != nil { - return 0, err - } - if st.Size != size { - return 0, ErrUnexpectedEOF(st.Size, size, bucketName, objectName) - } - return size, nil -} - -// putObjectDo - executes the put object http operation. -// NOTE: You must have WRITE permissions on a bucket to add an object to it. -func (c Client) putObjectDo(ctx context.Context, bucketName, objectName string, reader io.Reader, md5Base64, sha256Hex string, size int64, opts PutObjectOptions) (ObjectInfo, error) { - // Input validation. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - return ObjectInfo{}, err - } - if err := s3utils.CheckValidObjectName(objectName); err != nil { - return ObjectInfo{}, err - } - // Set headers. - customHeader := opts.Header() - - // Populate request metadata. - reqMetadata := requestMetadata{ - bucketName: bucketName, - objectName: objectName, - customHeader: customHeader, - contentBody: reader, - contentLength: size, - contentMD5Base64: md5Base64, - contentSHA256Hex: sha256Hex, - } - - // Execute PUT an objectName. - resp, err := c.executeMethod(ctx, "PUT", reqMetadata) - defer closeResponse(resp) - if err != nil { - return ObjectInfo{}, err - } - if resp != nil { - if resp.StatusCode != http.StatusOK { - return ObjectInfo{}, httpRespToErrorResponse(resp, bucketName, objectName) - } - } - - var objInfo ObjectInfo - // Trim off the odd double quotes from ETag in the beginning and end. - objInfo.ETag = strings.TrimPrefix(resp.Header.Get("ETag"), "\"") - objInfo.ETag = strings.TrimSuffix(objInfo.ETag, "\"") - // A success here means data was written to server successfully. - objInfo.Size = size - - // Return here. - return objInfo, nil -} diff --git a/vendor/github.com/minio/minio-go/api-put-object.go b/vendor/github.com/minio/minio-go/api-put-object.go deleted file mode 100644 index 0330cd99d..000000000 --- a/vendor/github.com/minio/minio-go/api-put-object.go +++ /dev/null @@ -1,267 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import ( - "bytes" - "context" - "fmt" - "io" - "net/http" - "runtime/debug" - "sort" - - "github.com/minio/minio-go/pkg/encrypt" - "github.com/minio/minio-go/pkg/s3utils" - "golang.org/x/net/http/httpguts" -) - -// PutObjectOptions represents options specified by user for PutObject call -type PutObjectOptions struct { - UserMetadata map[string]string - Progress io.Reader - ContentType string - ContentEncoding string - ContentDisposition string - ContentLanguage string - CacheControl string - ServerSideEncryption encrypt.ServerSide - NumThreads uint - StorageClass string - WebsiteRedirectLocation string -} - -// getNumThreads - gets the number of threads to be used in the multipart -// put object operation -func (opts PutObjectOptions) getNumThreads() (numThreads int) { - if opts.NumThreads > 0 { - numThreads = int(opts.NumThreads) - } else { - numThreads = totalWorkers - } - return -} - -// Header - constructs the headers from metadata entered by user in -// PutObjectOptions struct -func (opts PutObjectOptions) Header() (header http.Header) { - header = make(http.Header) - - if opts.ContentType != "" { - header["Content-Type"] = []string{opts.ContentType} - } else { - header["Content-Type"] = []string{"application/octet-stream"} - } - if opts.ContentEncoding != "" { - header["Content-Encoding"] = []string{opts.ContentEncoding} - } - if opts.ContentDisposition != "" { - header["Content-Disposition"] = []string{opts.ContentDisposition} - } - if opts.ContentLanguage != "" { - header["Content-Language"] = []string{opts.ContentLanguage} - } - if opts.CacheControl != "" { - header["Cache-Control"] = []string{opts.CacheControl} - } - if opts.ServerSideEncryption != nil { - opts.ServerSideEncryption.Marshal(header) - } - if opts.StorageClass != "" { - header[amzStorageClass] = []string{opts.StorageClass} - } - if opts.WebsiteRedirectLocation != "" { - header[amzWebsiteRedirectLocation] = []string{opts.WebsiteRedirectLocation} - } - for k, v := range opts.UserMetadata { - if !isAmzHeader(k) && !isStandardHeader(k) && !isStorageClassHeader(k) { - header["X-Amz-Meta-"+k] = []string{v} - } else { - header[k] = []string{v} - } - } - return -} - -// validate() checks if the UserMetadata map has standard headers or and raises an error if so. -func (opts PutObjectOptions) validate() (err error) { - for k, v := range opts.UserMetadata { - if !httpguts.ValidHeaderFieldName(k) || isStandardHeader(k) || isSSEHeader(k) || isStorageClassHeader(k) { - return ErrInvalidArgument(k + " unsupported user defined metadata name") - } - if !httpguts.ValidHeaderFieldValue(v) { - return ErrInvalidArgument(v + " unsupported user defined metadata value") - } - } - return nil -} - -// completedParts is a collection of parts sortable by their part numbers. -// used for sorting the uploaded parts before completing the multipart request. -type completedParts []CompletePart - -func (a completedParts) Len() int { return len(a) } -func (a completedParts) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a completedParts) Less(i, j int) bool { return a[i].PartNumber < a[j].PartNumber } - -// PutObject creates an object in a bucket. -// -// You must have WRITE permissions on a bucket to create an object. -// -// - For size smaller than 64MiB PutObject automatically does a -// single atomic Put operation. -// - For size larger than 64MiB PutObject automatically does a -// multipart Put operation. -// - For size input as -1 PutObject does a multipart Put operation -// until input stream reaches EOF. Maximum object size that can -// be uploaded through this operation will be 5TiB. -func (c Client) PutObject(bucketName, objectName string, reader io.Reader, objectSize int64, - opts PutObjectOptions) (n int64, err error) { - return c.PutObjectWithContext(context.Background(), bucketName, objectName, reader, objectSize, opts) -} - -func (c Client) putObjectCommon(ctx context.Context, bucketName, objectName string, reader io.Reader, size int64, opts PutObjectOptions) (n int64, err error) { - // Check for largest object size allowed. - if size > int64(maxMultipartPutObjectSize) { - return 0, ErrEntityTooLarge(size, maxMultipartPutObjectSize, bucketName, objectName) - } - - // NOTE: Streaming signature is not supported by GCS. - if s3utils.IsGoogleEndpoint(*c.endpointURL) { - // Do not compute MD5 for Google Cloud Storage. - return c.putObjectNoChecksum(ctx, bucketName, objectName, reader, size, opts) - } - - if c.overrideSignerType.IsV2() { - if size >= 0 && size < minPartSize { - return c.putObjectNoChecksum(ctx, bucketName, objectName, reader, size, opts) - } - return c.putObjectMultipart(ctx, bucketName, objectName, reader, size, opts) - } - if size < 0 { - return c.putObjectMultipartStreamNoLength(ctx, bucketName, objectName, reader, opts) - } - - if size < minPartSize { - return c.putObjectNoChecksum(ctx, bucketName, objectName, reader, size, opts) - } - // For all sizes greater than 64MiB do multipart. - return c.putObjectMultipartStream(ctx, bucketName, objectName, reader, size, opts) -} - -func (c Client) putObjectMultipartStreamNoLength(ctx context.Context, bucketName, objectName string, reader io.Reader, opts PutObjectOptions) (n int64, err error) { - // Input validation. - if err = s3utils.CheckValidBucketName(bucketName); err != nil { - return 0, err - } - if err = s3utils.CheckValidObjectName(objectName); err != nil { - return 0, err - } - - // Total data read and written to server. should be equal to - // 'size' at the end of the call. - var totalUploadedSize int64 - - // Complete multipart upload. - var complMultipartUpload completeMultipartUpload - - // Calculate the optimal parts info for a given size. - totalPartsCount, partSize, _, err := optimalPartInfo(-1) - if err != nil { - return 0, err - } - // Initiate a new multipart upload. - uploadID, err := c.newUploadID(ctx, bucketName, objectName, opts) - if err != nil { - return 0, err - } - - defer func() { - if err != nil { - c.abortMultipartUpload(ctx, bucketName, objectName, uploadID) - } - }() - - // Part number always starts with '1'. - partNumber := 1 - - // Initialize parts uploaded map. - partsInfo := make(map[int]ObjectPart) - - // Create a buffer. - buf := make([]byte, partSize) - defer debug.FreeOSMemory() - - for partNumber <= totalPartsCount { - length, rErr := io.ReadFull(reader, buf) - if rErr == io.EOF && partNumber > 1 { - break - } - if rErr != nil && rErr != io.ErrUnexpectedEOF && rErr != io.EOF { - return 0, rErr - } - // Update progress reader appropriately to the latest offset - // as we read from the source. - rd := newHook(bytes.NewReader(buf[:length]), opts.Progress) - - // Proceed to upload the part. - var objPart ObjectPart - objPart, err = c.uploadPart(ctx, bucketName, objectName, uploadID, rd, partNumber, - "", "", int64(length), opts.ServerSideEncryption) - if err != nil { - return totalUploadedSize, err - } - - // Save successfully uploaded part metadata. - partsInfo[partNumber] = objPart - - // Save successfully uploaded size. - totalUploadedSize += int64(length) - - // Increment part number. - partNumber++ - - // For unknown size, Read EOF we break away. - // We do not have to upload till totalPartsCount. - if rErr == io.EOF { - break - } - } - - // Loop over total uploaded parts to save them in - // Parts array before completing the multipart request. - for i := 1; i < partNumber; i++ { - part, ok := partsInfo[i] - if !ok { - return 0, ErrInvalidArgument(fmt.Sprintf("Missing part number %d", i)) - } - complMultipartUpload.Parts = append(complMultipartUpload.Parts, CompletePart{ - ETag: part.ETag, - PartNumber: part.PartNumber, - }) - } - - // Sort all completed parts. - sort.Sort(completedParts(complMultipartUpload.Parts)) - if _, err = c.completeMultipartUpload(ctx, bucketName, objectName, uploadID, complMultipartUpload); err != nil { - return totalUploadedSize, err - } - - // Return final size. - return totalUploadedSize, nil -} diff --git a/vendor/github.com/minio/minio-go/api-remove.go b/vendor/github.com/minio/minio-go/api-remove.go deleted file mode 100644 index f33df4dfc..000000000 --- a/vendor/github.com/minio/minio-go/api-remove.go +++ /dev/null @@ -1,303 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import ( - "bytes" - "context" - "encoding/xml" - "io" - "net/http" - "net/url" - - "github.com/minio/minio-go/pkg/s3utils" -) - -// RemoveBucket deletes the bucket name. -// -// All objects (including all object versions and delete markers). -// in the bucket must be deleted before successfully attempting this request. -func (c Client) RemoveBucket(bucketName string) error { - // Input validation. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - return err - } - // Execute DELETE on bucket. - resp, err := c.executeMethod(context.Background(), "DELETE", requestMetadata{ - bucketName: bucketName, - contentSHA256Hex: emptySHA256Hex, - }) - defer closeResponse(resp) - if err != nil { - return err - } - if resp != nil { - if resp.StatusCode != http.StatusNoContent { - return httpRespToErrorResponse(resp, bucketName, "") - } - } - - // Remove the location from cache on a successful delete. - c.bucketLocCache.Delete(bucketName) - - return nil -} - -// RemoveObject remove an object from a bucket. -func (c Client) RemoveObject(bucketName, objectName string) error { - // Input validation. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - return err - } - if err := s3utils.CheckValidObjectName(objectName); err != nil { - return err - } - // Execute DELETE on objectName. - resp, err := c.executeMethod(context.Background(), "DELETE", requestMetadata{ - bucketName: bucketName, - objectName: objectName, - contentSHA256Hex: emptySHA256Hex, - }) - defer closeResponse(resp) - if err != nil { - return err - } - if resp != nil { - // if some unexpected error happened and max retry is reached, we want to let client know - if resp.StatusCode != http.StatusNoContent { - return httpRespToErrorResponse(resp, bucketName, objectName) - } - } - - // DeleteObject always responds with http '204' even for - // objects which do not exist. So no need to handle them - // specifically. - return nil -} - -// RemoveObjectError - container of Multi Delete S3 API error -type RemoveObjectError struct { - ObjectName string - Err error -} - -// generateRemoveMultiObjects - generate the XML request for remove multi objects request -func generateRemoveMultiObjectsRequest(objects []string) []byte { - rmObjects := []deleteObject{} - for _, obj := range objects { - rmObjects = append(rmObjects, deleteObject{Key: obj}) - } - xmlBytes, _ := xml.Marshal(deleteMultiObjects{Objects: rmObjects, Quiet: true}) - return xmlBytes -} - -// processRemoveMultiObjectsResponse - parse the remove multi objects web service -// and return the success/failure result status for each object -func processRemoveMultiObjectsResponse(body io.Reader, objects []string, errorCh chan<- RemoveObjectError) { - // Parse multi delete XML response - rmResult := &deleteMultiObjectsResult{} - err := xmlDecoder(body, rmResult) - if err != nil { - errorCh <- RemoveObjectError{ObjectName: "", Err: err} - return - } - - // Fill deletion that returned an error. - for _, obj := range rmResult.UnDeletedObjects { - errorCh <- RemoveObjectError{ - ObjectName: obj.Key, - Err: ErrorResponse{ - Code: obj.Code, - Message: obj.Message, - }, - } - } -} - -// RemoveObjectsWithContext - Identical to RemoveObjects call, but accepts context to facilitate request cancellation. -func (c Client) RemoveObjectsWithContext(ctx context.Context, bucketName string, objectsCh <-chan string) <-chan RemoveObjectError { - errorCh := make(chan RemoveObjectError, 1) - - // Validate if bucket name is valid. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - defer close(errorCh) - errorCh <- RemoveObjectError{ - Err: err, - } - return errorCh - } - // Validate objects channel to be properly allocated. - if objectsCh == nil { - defer close(errorCh) - errorCh <- RemoveObjectError{ - Err: ErrInvalidArgument("Objects channel cannot be nil"), - } - return errorCh - } - - // Generate and call MultiDelete S3 requests based on entries received from objectsCh - go func(errorCh chan<- RemoveObjectError) { - maxEntries := 1000 - finish := false - urlValues := make(url.Values) - urlValues.Set("delete", "") - - // Close error channel when Multi delete finishes. - defer close(errorCh) - - // Loop over entries by 1000 and call MultiDelete requests - for { - if finish { - break - } - count := 0 - var batch []string - - // Try to gather 1000 entries - for object := range objectsCh { - batch = append(batch, object) - if count++; count >= maxEntries { - break - } - } - if count == 0 { - // Multi Objects Delete API doesn't accept empty object list, quit immediately - break - } - if count < maxEntries { - // We didn't have 1000 entries, so this is the last batch - finish = true - } - - // Generate remove multi objects XML request - removeBytes := generateRemoveMultiObjectsRequest(batch) - // Execute GET on bucket to list objects. - resp, err := c.executeMethod(ctx, "POST", requestMetadata{ - bucketName: bucketName, - queryValues: urlValues, - contentBody: bytes.NewReader(removeBytes), - contentLength: int64(len(removeBytes)), - contentMD5Base64: sumMD5Base64(removeBytes), - contentSHA256Hex: sum256Hex(removeBytes), - }) - if resp != nil { - if resp.StatusCode != http.StatusOK { - e := httpRespToErrorResponse(resp, bucketName, "") - errorCh <- RemoveObjectError{ObjectName: "", Err: e} - } - } - if err != nil { - for _, b := range batch { - errorCh <- RemoveObjectError{ObjectName: b, Err: err} - } - continue - } - - // Process multiobjects remove xml response - processRemoveMultiObjectsResponse(resp.Body, batch, errorCh) - - closeResponse(resp) - } - }(errorCh) - return errorCh -} - -// RemoveObjects removes multiple objects from a bucket. -// The list of objects to remove are received from objectsCh. -// Remove failures are sent back via error channel. -func (c Client) RemoveObjects(bucketName string, objectsCh <-chan string) <-chan RemoveObjectError { - return c.RemoveObjectsWithContext(context.Background(), bucketName, objectsCh) -} - -// RemoveIncompleteUpload aborts an partially uploaded object. -func (c Client) RemoveIncompleteUpload(bucketName, objectName string) error { - // Input validation. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - return err - } - if err := s3utils.CheckValidObjectName(objectName); err != nil { - return err - } - // Find multipart upload ids of the object to be aborted. - uploadIDs, err := c.findUploadIDs(bucketName, objectName) - if err != nil { - return err - } - - for _, uploadID := range uploadIDs { - // abort incomplete multipart upload, based on the upload id passed. - err := c.abortMultipartUpload(context.Background(), bucketName, objectName, uploadID) - if err != nil { - return err - } - } - - return nil -} - -// abortMultipartUpload aborts a multipart upload for the given -// uploadID, all previously uploaded parts are deleted. -func (c Client) abortMultipartUpload(ctx context.Context, bucketName, objectName, uploadID string) error { - // Input validation. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - return err - } - if err := s3utils.CheckValidObjectName(objectName); err != nil { - return err - } - - // Initialize url queries. - urlValues := make(url.Values) - urlValues.Set("uploadId", uploadID) - - // Execute DELETE on multipart upload. - resp, err := c.executeMethod(ctx, "DELETE", requestMetadata{ - bucketName: bucketName, - objectName: objectName, - queryValues: urlValues, - contentSHA256Hex: emptySHA256Hex, - }) - defer closeResponse(resp) - if err != nil { - return err - } - if resp != nil { - if resp.StatusCode != http.StatusNoContent { - // Abort has no response body, handle it for any errors. - var errorResponse ErrorResponse - switch resp.StatusCode { - case http.StatusNotFound: - // This is needed specifically for abort and it cannot - // be converged into default case. - errorResponse = ErrorResponse{ - Code: "NoSuchUpload", - Message: "The specified multipart upload does not exist.", - BucketName: bucketName, - Key: objectName, - RequestID: resp.Header.Get("x-amz-request-id"), - HostID: resp.Header.Get("x-amz-id-2"), - Region: resp.Header.Get("x-amz-bucket-region"), - } - default: - return httpRespToErrorResponse(resp, bucketName, objectName) - } - return errorResponse - } - } - return nil -} diff --git a/vendor/github.com/minio/minio-go/api-s3-datatypes.go b/vendor/github.com/minio/minio-go/api-s3-datatypes.go deleted file mode 100644 index 8d8880c05..000000000 --- a/vendor/github.com/minio/minio-go/api-s3-datatypes.go +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import ( - "encoding/xml" - "time" -) - -// listAllMyBucketsResult container for listBuckets response. -type listAllMyBucketsResult struct { - // Container for one or more buckets. - Buckets struct { - Bucket []BucketInfo - } - Owner owner -} - -// owner container for bucket owner information. -type owner struct { - DisplayName string - ID string -} - -// CommonPrefix container for prefix response. -type CommonPrefix struct { - Prefix string -} - -// ListBucketV2Result container for listObjects response version 2. -type ListBucketV2Result struct { - // A response can contain CommonPrefixes only if you have - // specified a delimiter. - CommonPrefixes []CommonPrefix - // Metadata about each object returned. - Contents []ObjectInfo - Delimiter string - - // Encoding type used to encode object keys in the response. - EncodingType string - - // A flag that indicates whether or not ListObjects returned all of the results - // that satisfied the search criteria. - IsTruncated bool - MaxKeys int64 - Name string - - // Hold the token that will be sent in the next request to fetch the next group of keys - NextContinuationToken string - - ContinuationToken string - Prefix string - - // FetchOwner and StartAfter are currently not used - FetchOwner string - StartAfter string -} - -// ListBucketResult container for listObjects response. -type ListBucketResult struct { - // A response can contain CommonPrefixes only if you have - // specified a delimiter. - CommonPrefixes []CommonPrefix - // Metadata about each object returned. - Contents []ObjectInfo - Delimiter string - - // Encoding type used to encode object keys in the response. - EncodingType string - - // A flag that indicates whether or not ListObjects returned all of the results - // that satisfied the search criteria. - IsTruncated bool - Marker string - MaxKeys int64 - Name string - - // When response is truncated (the IsTruncated element value in - // the response is true), you can use the key name in this field - // as marker in the subsequent request to get next set of objects. - // Object storage lists objects in alphabetical order Note: This - // element is returned only if you have delimiter request - // parameter specified. If response does not include the NextMaker - // and it is truncated, you can use the value of the last Key in - // the response as the marker in the subsequent request to get the - // next set of object keys. - NextMarker string - Prefix string -} - -// ListMultipartUploadsResult container for ListMultipartUploads response -type ListMultipartUploadsResult struct { - Bucket string - KeyMarker string - UploadIDMarker string `xml:"UploadIdMarker"` - NextKeyMarker string - NextUploadIDMarker string `xml:"NextUploadIdMarker"` - EncodingType string - MaxUploads int64 - IsTruncated bool - Uploads []ObjectMultipartInfo `xml:"Upload"` - Prefix string - Delimiter string - // A response can contain CommonPrefixes only if you specify a delimiter. - CommonPrefixes []CommonPrefix -} - -// initiator container for who initiated multipart upload. -type initiator struct { - ID string - DisplayName string -} - -// copyObjectResult container for copy object response. -type copyObjectResult struct { - ETag string - LastModified time.Time // time string format "2006-01-02T15:04:05.000Z" -} - -// ObjectPart container for particular part of an object. -type ObjectPart struct { - // Part number identifies the part. - PartNumber int - - // Date and time the part was uploaded. - LastModified time.Time - - // Entity tag returned when the part was uploaded, usually md5sum - // of the part. - ETag string - - // Size of the uploaded part data. - Size int64 -} - -// ListObjectPartsResult container for ListObjectParts response. -type ListObjectPartsResult struct { - Bucket string - Key string - UploadID string `xml:"UploadId"` - - Initiator initiator - Owner owner - - StorageClass string - PartNumberMarker int - NextPartNumberMarker int - MaxParts int - - // Indicates whether the returned list of parts is truncated. - IsTruncated bool - ObjectParts []ObjectPart `xml:"Part"` - - EncodingType string -} - -// initiateMultipartUploadResult container for InitiateMultiPartUpload -// response. -type initiateMultipartUploadResult struct { - Bucket string - Key string - UploadID string `xml:"UploadId"` -} - -// completeMultipartUploadResult container for completed multipart -// upload response. -type completeMultipartUploadResult struct { - Location string - Bucket string - Key string - ETag string -} - -// CompletePart sub container lists individual part numbers and their -// md5sum, part of completeMultipartUpload. -type CompletePart struct { - XMLName xml.Name `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Part" json:"-"` - - // Part number identifies the part. - PartNumber int - ETag string -} - -// completeMultipartUpload container for completing multipart upload. -type completeMultipartUpload struct { - XMLName xml.Name `xml:"http://s3.amazonaws.com/doc/2006-03-01/ CompleteMultipartUpload" json:"-"` - Parts []CompletePart `xml:"Part"` -} - -// createBucketConfiguration container for bucket configuration. -type createBucketConfiguration struct { - XMLName xml.Name `xml:"http://s3.amazonaws.com/doc/2006-03-01/ CreateBucketConfiguration" json:"-"` - Location string `xml:"LocationConstraint"` -} - -// deleteObject container for Delete element in MultiObjects Delete XML request -type deleteObject struct { - Key string - VersionID string `xml:"VersionId,omitempty"` -} - -// deletedObject container for Deleted element in MultiObjects Delete XML response -type deletedObject struct { - Key string - VersionID string `xml:"VersionId,omitempty"` - // These fields are ignored. - DeleteMarker bool - DeleteMarkerVersionID string -} - -// nonDeletedObject container for Error element (failed deletion) in MultiObjects Delete XML response -type nonDeletedObject struct { - Key string - Code string - Message string -} - -// deletedMultiObjects container for MultiObjects Delete XML request -type deleteMultiObjects struct { - XMLName xml.Name `xml:"Delete"` - Quiet bool - Objects []deleteObject `xml:"Object"` -} - -// deletedMultiObjectsResult container for MultiObjects Delete XML response -type deleteMultiObjectsResult struct { - XMLName xml.Name `xml:"DeleteResult"` - DeletedObjects []deletedObject `xml:"Deleted"` - UnDeletedObjects []nonDeletedObject `xml:"Error"` -} diff --git a/vendor/github.com/minio/minio-go/api-stat.go b/vendor/github.com/minio/minio-go/api-stat.go deleted file mode 100644 index 3b054c34a..000000000 --- a/vendor/github.com/minio/minio-go/api-stat.go +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import ( - "context" - "net/http" - "strconv" - "strings" - "time" - - "github.com/minio/minio-go/pkg/s3utils" -) - -// BucketExists verify if bucket exists and you have permission to access it. -func (c Client) BucketExists(bucketName string) (bool, error) { - // Input validation. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - return false, err - } - - // Execute HEAD on bucketName. - resp, err := c.executeMethod(context.Background(), "HEAD", requestMetadata{ - bucketName: bucketName, - contentSHA256Hex: emptySHA256Hex, - }) - defer closeResponse(resp) - if err != nil { - if ToErrorResponse(err).Code == "NoSuchBucket" { - return false, nil - } - return false, err - } - if resp != nil { - if resp.StatusCode != http.StatusOK { - return false, httpRespToErrorResponse(resp, bucketName, "") - } - } - return true, nil -} - -// List of header keys to be filtered, usually -// from all S3 API http responses. -var defaultFilterKeys = []string{ - "Connection", - "Transfer-Encoding", - "Accept-Ranges", - "Date", - "Server", - "Vary", - "x-amz-bucket-region", - "x-amz-request-id", - "x-amz-id-2", - "Content-Security-Policy", - "X-Xss-Protection", - - // Add new headers to be ignored. -} - -// Extract only necessary metadata header key/values by -// filtering them out with a list of custom header keys. -func extractObjMetadata(header http.Header) http.Header { - filterKeys := append([]string{ - "ETag", - "Content-Length", - "Last-Modified", - "Content-Type", - }, defaultFilterKeys...) - return filterHeader(header, filterKeys) -} - -// StatObject verifies if object exists and you have permission to access. -func (c Client) StatObject(bucketName, objectName string, opts StatObjectOptions) (ObjectInfo, error) { - // Input validation. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - return ObjectInfo{}, err - } - if err := s3utils.CheckValidObjectName(objectName); err != nil { - return ObjectInfo{}, err - } - return c.statObject(context.Background(), bucketName, objectName, opts) -} - -// Lower level API for statObject supporting pre-conditions and range headers. -func (c Client) statObject(ctx context.Context, bucketName, objectName string, opts StatObjectOptions) (ObjectInfo, error) { - // Input validation. - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - return ObjectInfo{}, err - } - if err := s3utils.CheckValidObjectName(objectName); err != nil { - return ObjectInfo{}, err - } - - // Execute HEAD on objectName. - resp, err := c.executeMethod(ctx, "HEAD", requestMetadata{ - bucketName: bucketName, - objectName: objectName, - contentSHA256Hex: emptySHA256Hex, - customHeader: opts.Header(), - }) - defer closeResponse(resp) - if err != nil { - return ObjectInfo{}, err - } - if resp != nil { - if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusPartialContent { - return ObjectInfo{}, httpRespToErrorResponse(resp, bucketName, objectName) - } - } - - // Trim off the odd double quotes from ETag in the beginning and end. - md5sum := strings.TrimPrefix(resp.Header.Get("ETag"), "\"") - md5sum = strings.TrimSuffix(md5sum, "\"") - - // Parse content length is exists - var size int64 = -1 - contentLengthStr := resp.Header.Get("Content-Length") - if contentLengthStr != "" { - size, err = strconv.ParseInt(contentLengthStr, 10, 64) - if err != nil { - // Content-Length is not valid - return ObjectInfo{}, ErrorResponse{ - Code: "InternalError", - Message: "Content-Length is invalid. " + reportIssue, - BucketName: bucketName, - Key: objectName, - RequestID: resp.Header.Get("x-amz-request-id"), - HostID: resp.Header.Get("x-amz-id-2"), - Region: resp.Header.Get("x-amz-bucket-region"), - } - } - } - - // Parse Last-Modified has http time format. - date, err := time.Parse(http.TimeFormat, resp.Header.Get("Last-Modified")) - if err != nil { - return ObjectInfo{}, ErrorResponse{ - Code: "InternalError", - Message: "Last-Modified time format is invalid. " + reportIssue, - BucketName: bucketName, - Key: objectName, - RequestID: resp.Header.Get("x-amz-request-id"), - HostID: resp.Header.Get("x-amz-id-2"), - Region: resp.Header.Get("x-amz-bucket-region"), - } - } - - // Fetch content type if any present. - contentType := strings.TrimSpace(resp.Header.Get("Content-Type")) - if contentType == "" { - contentType = "application/octet-stream" - } - - // Save object metadata info. - return ObjectInfo{ - ETag: md5sum, - Key: objectName, - Size: size, - LastModified: date, - ContentType: contentType, - // Extract only the relevant header keys describing the object. - // following function filters out a list of standard set of keys - // which are not part of object metadata. - Metadata: extractObjMetadata(resp.Header), - }, nil -} diff --git a/vendor/github.com/minio/minio-go/api.go b/vendor/github.com/minio/minio-go/api.go deleted file mode 100644 index 5856ed2b1..000000000 --- a/vendor/github.com/minio/minio-go/api.go +++ /dev/null @@ -1,900 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2018 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import ( - "bytes" - "context" - "crypto/md5" - "crypto/sha256" - "errors" - "fmt" - "hash" - "io" - "io/ioutil" - "math/rand" - "net" - "net/http" - "net/http/httputil" - "net/url" - "os" - "runtime" - "strings" - "sync" - "time" - - "github.com/minio/minio-go/pkg/credentials" - "github.com/minio/minio-go/pkg/s3signer" - "github.com/minio/minio-go/pkg/s3utils" -) - -// Client implements Amazon S3 compatible methods. -type Client struct { - /// Standard options. - - // Parsed endpoint url provided by the user. - endpointURL *url.URL - - // Holds various credential providers. - credsProvider *credentials.Credentials - - // Custom signerType value overrides all credentials. - overrideSignerType credentials.SignatureType - - // User supplied. - appInfo struct { - appName string - appVersion string - } - - // Indicate whether we are using https or not - secure bool - - // Needs allocation. - httpClient *http.Client - bucketLocCache *bucketLocationCache - - // Advanced functionality. - isTraceEnabled bool - traceOutput io.Writer - - // S3 specific accelerated endpoint. - s3AccelerateEndpoint string - - // Region endpoint - region string - - // Random seed. - random *rand.Rand - - // lookup indicates type of url lookup supported by server. If not specified, - // default to Auto. - lookup BucketLookupType -} - -// Options for New method -type Options struct { - Creds *credentials.Credentials - Secure bool - Region string - BucketLookup BucketLookupType - // Add future fields here -} - -// Global constants. -const ( - libraryName = "minio-go" - libraryVersion = "v6.0.5" -) - -// User Agent should always following the below style. -// Please open an issue to discuss any new changes here. -// -// Minio (OS; ARCH) LIB/VER APP/VER -const ( - libraryUserAgentPrefix = "Minio (" + runtime.GOOS + "; " + runtime.GOARCH + ") " - libraryUserAgent = libraryUserAgentPrefix + libraryName + "/" + libraryVersion -) - -// BucketLookupType is type of url lookup supported by server. -type BucketLookupType int - -// Different types of url lookup supported by the server.Initialized to BucketLookupAuto -const ( - BucketLookupAuto BucketLookupType = iota - BucketLookupDNS - BucketLookupPath -) - -// NewV2 - instantiate minio client with Amazon S3 signature version -// '2' compatibility. -func NewV2(endpoint string, accessKeyID, secretAccessKey string, secure bool) (*Client, error) { - creds := credentials.NewStaticV2(accessKeyID, secretAccessKey, "") - clnt, err := privateNew(endpoint, creds, secure, "", BucketLookupAuto) - if err != nil { - return nil, err - } - clnt.overrideSignerType = credentials.SignatureV2 - return clnt, nil -} - -// NewV4 - instantiate minio client with Amazon S3 signature version -// '4' compatibility. -func NewV4(endpoint string, accessKeyID, secretAccessKey string, secure bool) (*Client, error) { - creds := credentials.NewStaticV4(accessKeyID, secretAccessKey, "") - clnt, err := privateNew(endpoint, creds, secure, "", BucketLookupAuto) - if err != nil { - return nil, err - } - clnt.overrideSignerType = credentials.SignatureV4 - return clnt, nil -} - -// New - instantiate minio client, adds automatic verification of signature. -func New(endpoint, accessKeyID, secretAccessKey string, secure bool) (*Client, error) { - creds := credentials.NewStaticV4(accessKeyID, secretAccessKey, "") - clnt, err := privateNew(endpoint, creds, secure, "", BucketLookupAuto) - if err != nil { - return nil, err - } - // Google cloud storage should be set to signature V2, force it if not. - if s3utils.IsGoogleEndpoint(*clnt.endpointURL) { - clnt.overrideSignerType = credentials.SignatureV2 - } - // If Amazon S3 set to signature v4. - if s3utils.IsAmazonEndpoint(*clnt.endpointURL) { - clnt.overrideSignerType = credentials.SignatureV4 - } - return clnt, nil -} - -// NewWithCredentials - instantiate minio client with credentials provider -// for retrieving credentials from various credentials provider such as -// IAM, File, Env etc. -func NewWithCredentials(endpoint string, creds *credentials.Credentials, secure bool, region string) (*Client, error) { - return privateNew(endpoint, creds, secure, region, BucketLookupAuto) -} - -// NewWithRegion - instantiate minio client, with region configured. Unlike New(), -// NewWithRegion avoids bucket-location lookup operations and it is slightly faster. -// Use this function when if your application deals with single region. -func NewWithRegion(endpoint, accessKeyID, secretAccessKey string, secure bool, region string) (*Client, error) { - creds := credentials.NewStaticV4(accessKeyID, secretAccessKey, "") - return privateNew(endpoint, creds, secure, region, BucketLookupAuto) -} - -// NewWithOptions - instantiate minio client with options -func NewWithOptions(endpoint string, opts *Options) (*Client, error) { - return privateNew(endpoint, opts.Creds, opts.Secure, opts.Region, opts.BucketLookup) -} - -// lockedRandSource provides protected rand source, implements rand.Source interface. -type lockedRandSource struct { - lk sync.Mutex - src rand.Source -} - -// Int63 returns a non-negative pseudo-random 63-bit integer as an int64. -func (r *lockedRandSource) Int63() (n int64) { - r.lk.Lock() - n = r.src.Int63() - r.lk.Unlock() - return -} - -// Seed uses the provided seed value to initialize the generator to a -// deterministic state. -func (r *lockedRandSource) Seed(seed int64) { - r.lk.Lock() - r.src.Seed(seed) - r.lk.Unlock() -} - -// Redirect requests by re signing the request. -func (c *Client) redirectHeaders(req *http.Request, via []*http.Request) error { - if len(via) >= 5 { - return errors.New("stopped after 5 redirects") - } - if len(via) == 0 { - return nil - } - lastRequest := via[len(via)-1] - var reAuth bool - for attr, val := range lastRequest.Header { - // if hosts do not match do not copy Authorization header - if attr == "Authorization" && req.Host != lastRequest.Host { - reAuth = true - continue - } - if _, ok := req.Header[attr]; !ok { - req.Header[attr] = val - } - } - - *c.endpointURL = *req.URL - - value, err := c.credsProvider.Get() - if err != nil { - return err - } - var ( - signerType = value.SignerType - accessKeyID = value.AccessKeyID - secretAccessKey = value.SecretAccessKey - sessionToken = value.SessionToken - region = c.region - ) - - // Custom signer set then override the behavior. - if c.overrideSignerType != credentials.SignatureDefault { - signerType = c.overrideSignerType - } - - // If signerType returned by credentials helper is anonymous, - // then do not sign regardless of signerType override. - if value.SignerType == credentials.SignatureAnonymous { - signerType = credentials.SignatureAnonymous - } - - if reAuth { - // Check if there is no region override, if not get it from the URL if possible. - if region == "" { - region = s3utils.GetRegionFromURL(*c.endpointURL) - } - switch { - case signerType.IsV2(): - return errors.New("signature V2 cannot support redirection") - case signerType.IsV4(): - req = s3signer.SignV4(*req, accessKeyID, secretAccessKey, sessionToken, getDefaultLocation(*c.endpointURL, region)) - } - } - return nil -} - -func privateNew(endpoint string, creds *credentials.Credentials, secure bool, region string, lookup BucketLookupType) (*Client, error) { - // construct endpoint. - endpointURL, err := getEndpointURL(endpoint, secure) - if err != nil { - return nil, err - } - - // instantiate new Client. - clnt := new(Client) - - // Save the credentials. - clnt.credsProvider = creds - - // Remember whether we are using https or not - clnt.secure = secure - - // Save endpoint URL, user agent for future uses. - clnt.endpointURL = endpointURL - - // Instantiate http client and bucket location cache. - clnt.httpClient = &http.Client{ - Transport: DefaultTransport, - CheckRedirect: clnt.redirectHeaders, - } - - // Sets custom region, if region is empty bucket location cache is used automatically. - if region == "" { - region = s3utils.GetRegionFromURL(*clnt.endpointURL) - } - clnt.region = region - - // Instantiate bucket location cache. - clnt.bucketLocCache = newBucketLocationCache() - - // Introduce a new locked random seed. - clnt.random = rand.New(&lockedRandSource{src: rand.NewSource(time.Now().UTC().UnixNano())}) - - // Sets bucket lookup style, whether server accepts DNS or Path lookup. Default is Auto - determined - // by the SDK. When Auto is specified, DNS lookup is used for Amazon/Google cloud endpoints and Path for all other endpoints. - clnt.lookup = lookup - // Return. - return clnt, nil -} - -// SetAppInfo - add application details to user agent. -func (c *Client) SetAppInfo(appName string, appVersion string) { - // if app name and version not set, we do not set a new user agent. - if appName != "" && appVersion != "" { - c.appInfo = struct { - appName string - appVersion string - }{} - c.appInfo.appName = appName - c.appInfo.appVersion = appVersion - } -} - -// SetCustomTransport - set new custom transport. -func (c *Client) SetCustomTransport(customHTTPTransport http.RoundTripper) { - // Set this to override default transport - // ``http.DefaultTransport``. - // - // This transport is usually needed for debugging OR to add your - // own custom TLS certificates on the client transport, for custom - // CA's and certs which are not part of standard certificate - // authority follow this example :- - // - // tr := &http.Transport{ - // TLSClientConfig: &tls.Config{RootCAs: pool}, - // DisableCompression: true, - // } - // api.SetCustomTransport(tr) - // - if c.httpClient != nil { - c.httpClient.Transport = customHTTPTransport - } -} - -// TraceOn - enable HTTP tracing. -func (c *Client) TraceOn(outputStream io.Writer) { - // if outputStream is nil then default to os.Stdout. - if outputStream == nil { - outputStream = os.Stdout - } - // Sets a new output stream. - c.traceOutput = outputStream - - // Enable tracing. - c.isTraceEnabled = true -} - -// TraceOff - disable HTTP tracing. -func (c *Client) TraceOff() { - // Disable tracing. - c.isTraceEnabled = false -} - -// SetS3TransferAccelerate - turns s3 accelerated endpoint on or off for all your -// requests. This feature is only specific to S3 for all other endpoints this -// function does nothing. To read further details on s3 transfer acceleration -// please vist - -// http://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html -func (c *Client) SetS3TransferAccelerate(accelerateEndpoint string) { - if s3utils.IsAmazonEndpoint(*c.endpointURL) { - c.s3AccelerateEndpoint = accelerateEndpoint - } -} - -// Hash materials provides relevant initialized hash algo writers -// based on the expected signature type. -// -// - For signature v4 request if the connection is insecure compute only sha256. -// - For signature v4 request if the connection is secure compute only md5. -// - For anonymous request compute md5. -func (c *Client) hashMaterials() (hashAlgos map[string]hash.Hash, hashSums map[string][]byte) { - hashSums = make(map[string][]byte) - hashAlgos = make(map[string]hash.Hash) - if c.overrideSignerType.IsV4() { - if c.secure { - hashAlgos["md5"] = md5.New() - } else { - hashAlgos["sha256"] = sha256.New() - } - } else { - if c.overrideSignerType.IsAnonymous() { - hashAlgos["md5"] = md5.New() - } - } - return hashAlgos, hashSums -} - -// requestMetadata - is container for all the values to make a request. -type requestMetadata struct { - // If set newRequest presigns the URL. - presignURL bool - - // User supplied. - bucketName string - objectName string - queryValues url.Values - customHeader http.Header - expires int64 - - // Generated by our internal code. - bucketLocation string - contentBody io.Reader - contentLength int64 - contentMD5Base64 string // carries base64 encoded md5sum - contentSHA256Hex string // carries hex encoded sha256sum -} - -// dumpHTTP - dump HTTP request and response. -func (c Client) dumpHTTP(req *http.Request, resp *http.Response) error { - // Starts http dump. - _, err := fmt.Fprintln(c.traceOutput, "---------START-HTTP---------") - if err != nil { - return err - } - - // Filter out Signature field from Authorization header. - origAuth := req.Header.Get("Authorization") - if origAuth != "" { - req.Header.Set("Authorization", redactSignature(origAuth)) - } - - // Only display request header. - reqTrace, err := httputil.DumpRequestOut(req, false) - if err != nil { - return err - } - - // Write request to trace output. - _, err = fmt.Fprint(c.traceOutput, string(reqTrace)) - if err != nil { - return err - } - - // Only display response header. - var respTrace []byte - - // For errors we make sure to dump response body as well. - if resp.StatusCode != http.StatusOK && - resp.StatusCode != http.StatusPartialContent && - resp.StatusCode != http.StatusNoContent { - respTrace, err = httputil.DumpResponse(resp, true) - if err != nil { - return err - } - } else { - // WORKAROUND for https://github.com/golang/go/issues/13942. - // httputil.DumpResponse does not print response headers for - // all successful calls which have response ContentLength set - // to zero. Keep this workaround until the above bug is fixed. - if resp.ContentLength == 0 { - var buffer bytes.Buffer - if err = resp.Header.Write(&buffer); err != nil { - return err - } - respTrace = buffer.Bytes() - respTrace = append(respTrace, []byte("\r\n")...) - } else { - respTrace, err = httputil.DumpResponse(resp, false) - if err != nil { - return err - } - } - } - - // Write response to trace output. - _, err = fmt.Fprint(c.traceOutput, strings.TrimSuffix(string(respTrace), "\r\n")) - if err != nil { - return err - } - - // Ends the http dump. - _, err = fmt.Fprintln(c.traceOutput, "---------END-HTTP---------") - if err != nil { - return err - } - - // Returns success. - return nil -} - -// do - execute http request. -func (c Client) do(req *http.Request) (*http.Response, error) { - resp, err := c.httpClient.Do(req) - if err != nil { - // Handle this specifically for now until future Golang versions fix this issue properly. - if urlErr, ok := err.(*url.Error); ok { - if strings.Contains(urlErr.Err.Error(), "EOF") { - return nil, &url.Error{ - Op: urlErr.Op, - URL: urlErr.URL, - Err: errors.New("Connection closed by foreign host " + urlErr.URL + ". Retry again."), - } - } - } - return nil, err - } - - // Response cannot be non-nil, report error if thats the case. - if resp == nil { - msg := "Response is empty. " + reportIssue - return nil, ErrInvalidArgument(msg) - } - - // If trace is enabled, dump http request and response. - if c.isTraceEnabled { - err = c.dumpHTTP(req, resp) - if err != nil { - return nil, err - } - } - - return resp, nil -} - -// List of success status. -var successStatus = []int{ - http.StatusOK, - http.StatusNoContent, - http.StatusPartialContent, -} - -// executeMethod - instantiates a given method, and retries the -// request upon any error up to maxRetries attempts in a binomially -// delayed manner using a standard back off algorithm. -func (c Client) executeMethod(ctx context.Context, method string, metadata requestMetadata) (res *http.Response, err error) { - var isRetryable bool // Indicates if request can be retried. - var bodySeeker io.Seeker // Extracted seeker from io.Reader. - var reqRetry = MaxRetry // Indicates how many times we can retry the request - - if metadata.contentBody != nil { - // Check if body is seekable then it is retryable. - bodySeeker, isRetryable = metadata.contentBody.(io.Seeker) - switch bodySeeker { - case os.Stdin, os.Stdout, os.Stderr: - isRetryable = false - } - // Retry only when reader is seekable - if !isRetryable { - reqRetry = 1 - } - - // Figure out if the body can be closed - if yes - // we will definitely close it upon the function - // return. - bodyCloser, ok := metadata.contentBody.(io.Closer) - if ok { - defer bodyCloser.Close() - } - } - - // Create a done channel to control 'newRetryTimer' go routine. - doneCh := make(chan struct{}, 1) - - // Indicate to our routine to exit cleanly upon return. - defer close(doneCh) - - // Blank indentifier is kept here on purpose since 'range' without - // blank identifiers is only supported since go1.4 - // https://golang.org/doc/go1.4#forrange. - for range c.newRetryTimer(reqRetry, DefaultRetryUnit, DefaultRetryCap, MaxJitter, doneCh) { - // Retry executes the following function body if request has an - // error until maxRetries have been exhausted, retry attempts are - // performed after waiting for a given period of time in a - // binomial fashion. - if isRetryable { - // Seek back to beginning for each attempt. - if _, err = bodySeeker.Seek(0, 0); err != nil { - // If seek failed, no need to retry. - return nil, err - } - } - - // Instantiate a new request. - var req *http.Request - req, err = c.newRequest(method, metadata) - if err != nil { - errResponse := ToErrorResponse(err) - if isS3CodeRetryable(errResponse.Code) { - continue // Retry. - } - return nil, err - } - - // Add context to request - req = req.WithContext(ctx) - - // Initiate the request. - res, err = c.do(req) - if err != nil { - // For supported network errors verify. - if isNetErrorRetryable(err) { - continue // Retry. - } - // For other errors, return here no need to retry. - return nil, err - } - - // For any known successful http status, return quickly. - for _, httpStatus := range successStatus { - if httpStatus == res.StatusCode { - return res, nil - } - } - - // Read the body to be saved later. - errBodyBytes, err := ioutil.ReadAll(res.Body) - // res.Body should be closed - closeResponse(res) - if err != nil { - return nil, err - } - - // Save the body. - errBodySeeker := bytes.NewReader(errBodyBytes) - res.Body = ioutil.NopCloser(errBodySeeker) - - // For errors verify if its retryable otherwise fail quickly. - errResponse := ToErrorResponse(httpRespToErrorResponse(res, metadata.bucketName, metadata.objectName)) - - // Save the body back again. - errBodySeeker.Seek(0, 0) // Seek back to starting point. - res.Body = ioutil.NopCloser(errBodySeeker) - - // Bucket region if set in error response and the error - // code dictates invalid region, we can retry the request - // with the new region. - // - // Additionally we should only retry if bucketLocation and custom - // region is empty. - if metadata.bucketLocation == "" && c.region == "" { - if errResponse.Code == "AuthorizationHeaderMalformed" || errResponse.Code == "InvalidRegion" { - if metadata.bucketName != "" && errResponse.Region != "" { - // Gather Cached location only if bucketName is present. - if _, cachedLocationError := c.bucketLocCache.Get(metadata.bucketName); cachedLocationError != false { - c.bucketLocCache.Set(metadata.bucketName, errResponse.Region) - continue // Retry. - } - } - } - } - - // Verify if error response code is retryable. - if isS3CodeRetryable(errResponse.Code) { - continue // Retry. - } - - // Verify if http status code is retryable. - if isHTTPStatusRetryable(res.StatusCode) { - continue // Retry. - } - - // For all other cases break out of the retry loop. - break - } - return res, err -} - -// newRequest - instantiate a new HTTP request for a given method. -func (c Client) newRequest(method string, metadata requestMetadata) (req *http.Request, err error) { - // If no method is supplied default to 'POST'. - if method == "" { - method = "POST" - } - - location := metadata.bucketLocation - if location == "" { - if metadata.bucketName != "" { - // Gather location only if bucketName is present. - location, err = c.getBucketLocation(metadata.bucketName) - if err != nil { - if ToErrorResponse(err).Code != "AccessDenied" { - return nil, err - } - } - // Upon AccessDenied error on fetching bucket location, default - // to possible locations based on endpoint URL. This can usually - // happen when GetBucketLocation() is disabled using IAM policies. - } - if location == "" { - location = getDefaultLocation(*c.endpointURL, c.region) - } - } - - // Look if target url supports virtual host. - isVirtualHost := c.isVirtualHostStyleRequest(*c.endpointURL, metadata.bucketName) - - // Construct a new target URL. - targetURL, err := c.makeTargetURL(metadata.bucketName, metadata.objectName, location, isVirtualHost, metadata.queryValues) - if err != nil { - return nil, err - } - - // Initialize a new HTTP request for the method. - req, err = http.NewRequest(method, targetURL.String(), nil) - if err != nil { - return nil, err - } - - // Get credentials from the configured credentials provider. - value, err := c.credsProvider.Get() - if err != nil { - return nil, err - } - - var ( - signerType = value.SignerType - accessKeyID = value.AccessKeyID - secretAccessKey = value.SecretAccessKey - sessionToken = value.SessionToken - ) - - // Custom signer set then override the behavior. - if c.overrideSignerType != credentials.SignatureDefault { - signerType = c.overrideSignerType - } - - // If signerType returned by credentials helper is anonymous, - // then do not sign regardless of signerType override. - if value.SignerType == credentials.SignatureAnonymous { - signerType = credentials.SignatureAnonymous - } - - // Generate presign url if needed, return right here. - if metadata.expires != 0 && metadata.presignURL { - if signerType.IsAnonymous() { - return nil, ErrInvalidArgument("Presigned URLs cannot be generated with anonymous credentials.") - } - if signerType.IsV2() { - // Presign URL with signature v2. - req = s3signer.PreSignV2(*req, accessKeyID, secretAccessKey, metadata.expires, isVirtualHost) - } else if signerType.IsV4() { - // Presign URL with signature v4. - req = s3signer.PreSignV4(*req, accessKeyID, secretAccessKey, sessionToken, location, metadata.expires) - } - return req, nil - } - - // Set 'User-Agent' header for the request. - c.setUserAgent(req) - - // Set all headers. - for k, v := range metadata.customHeader { - req.Header.Set(k, v[0]) - } - - // Go net/http notoriously closes the request body. - // - The request Body, if non-nil, will be closed by the underlying Transport, even on errors. - // This can cause underlying *os.File seekers to fail, avoid that - // by making sure to wrap the closer as a nop. - if metadata.contentLength == 0 { - req.Body = nil - } else { - req.Body = ioutil.NopCloser(metadata.contentBody) - } - - // Set incoming content-length. - req.ContentLength = metadata.contentLength - if req.ContentLength <= -1 { - // For unknown content length, we upload using transfer-encoding: chunked. - req.TransferEncoding = []string{"chunked"} - } - - // set md5Sum for content protection. - if len(metadata.contentMD5Base64) > 0 { - req.Header.Set("Content-Md5", metadata.contentMD5Base64) - } - - // For anonymous requests just return. - if signerType.IsAnonymous() { - return req, nil - } - - switch { - case signerType.IsV2(): - // Add signature version '2' authorization header. - req = s3signer.SignV2(*req, accessKeyID, secretAccessKey, isVirtualHost) - case metadata.objectName != "" && method == "PUT" && metadata.customHeader.Get("X-Amz-Copy-Source") == "" && !c.secure: - // Streaming signature is used by default for a PUT object request. Additionally we also - // look if the initialized client is secure, if yes then we don't need to perform - // streaming signature. - req = s3signer.StreamingSignV4(req, accessKeyID, - secretAccessKey, sessionToken, location, metadata.contentLength, time.Now().UTC()) - default: - // Set sha256 sum for signature calculation only with signature version '4'. - shaHeader := unsignedPayload - if metadata.contentSHA256Hex != "" { - shaHeader = metadata.contentSHA256Hex - } - req.Header.Set("X-Amz-Content-Sha256", shaHeader) - - // Add signature version '4' authorization header. - req = s3signer.SignV4(*req, accessKeyID, secretAccessKey, sessionToken, location) - } - - // Return request. - return req, nil -} - -// set User agent. -func (c Client) setUserAgent(req *http.Request) { - req.Header.Set("User-Agent", libraryUserAgent) - if c.appInfo.appName != "" && c.appInfo.appVersion != "" { - req.Header.Set("User-Agent", libraryUserAgent+" "+c.appInfo.appName+"/"+c.appInfo.appVersion) - } -} - -// makeTargetURL make a new target url. -func (c Client) makeTargetURL(bucketName, objectName, bucketLocation string, isVirtualHostStyle bool, queryValues url.Values) (*url.URL, error) { - host := c.endpointURL.Host - // For Amazon S3 endpoint, try to fetch location based endpoint. - if s3utils.IsAmazonEndpoint(*c.endpointURL) { - if c.s3AccelerateEndpoint != "" && bucketName != "" { - // http://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html - // Disable transfer acceleration for non-compliant bucket names. - if strings.Contains(bucketName, ".") { - return nil, ErrTransferAccelerationBucket(bucketName) - } - // If transfer acceleration is requested set new host. - // For more details about enabling transfer acceleration read here. - // http://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html - host = c.s3AccelerateEndpoint - } else { - // Do not change the host if the endpoint URL is a FIPS S3 endpoint. - if !s3utils.IsAmazonFIPSGovCloudEndpoint(*c.endpointURL) { - // Fetch new host based on the bucket location. - host = getS3Endpoint(bucketLocation) - } - } - } - - // Save scheme. - scheme := c.endpointURL.Scheme - - // Strip port 80 and 443 so we won't send these ports in Host header. - // The reason is that browsers and curl automatically remove :80 and :443 - // with the generated presigned urls, then a signature mismatch error. - if h, p, err := net.SplitHostPort(host); err == nil { - if scheme == "http" && p == "80" || scheme == "https" && p == "443" { - host = h - } - } - - urlStr := scheme + "://" + host + "/" - // Make URL only if bucketName is available, otherwise use the - // endpoint URL. - if bucketName != "" { - // If endpoint supports virtual host style use that always. - // Currently only S3 and Google Cloud Storage would support - // virtual host style. - if isVirtualHostStyle { - urlStr = scheme + "://" + bucketName + "." + host + "/" - if objectName != "" { - urlStr = urlStr + s3utils.EncodePath(objectName) - } - } else { - // If not fall back to using path style. - urlStr = urlStr + bucketName + "/" - if objectName != "" { - urlStr = urlStr + s3utils.EncodePath(objectName) - } - } - } - - // If there are any query values, add them to the end. - if len(queryValues) > 0 { - urlStr = urlStr + "?" + s3utils.QueryEncode(queryValues) - } - - return url.Parse(urlStr) -} - -// returns true if virtual hosted style requests are to be used. -func (c *Client) isVirtualHostStyleRequest(url url.URL, bucketName string) bool { - if bucketName == "" { - return false - } - - if c.lookup == BucketLookupDNS { - return true - } - if c.lookup == BucketLookupPath { - return false - } - - // default to virtual only for Amazon/Google storage. In all other cases use - // path style requests - return s3utils.IsVirtualHostSupported(url, bucketName) -} diff --git a/vendor/github.com/minio/minio-go/appveyor.yml b/vendor/github.com/minio/minio-go/appveyor.yml deleted file mode 100644 index aa9f840e5..000000000 --- a/vendor/github.com/minio/minio-go/appveyor.yml +++ /dev/null @@ -1,39 +0,0 @@ -# version format -version: "{build}" - -# Operating system (build VM template) -os: Windows Server 2012 R2 - -clone_folder: c:\gopath\src\github.com\minio\minio-go - -# environment variables -environment: - GOPATH: c:\gopath - GO15VENDOREXPERIMENT: 1 - -# scripts that run after cloning repository -install: - - set PATH=%GOPATH%\bin;c:\go\bin;%PATH% - - go version - - go env - - go get -u github.com/golang/lint/golint - - go get -u github.com/remyoudompheng/go-misc/deadcode - - go get -u github.com/gordonklaus/ineffassign - - go get -u golang.org/x/crypto/argon2 - - go get -t ./... - -# to run your custom scripts instead of automatic MSBuild -build_script: - - go vet ./... - - gofmt -s -l . - - golint -set_exit_status github.com/minio/minio-go... - - deadcode - - ineffassign . - - go test -short -v - - go test -short -race -v - -# to disable automatic tests -test: off - -# to disable deployment -deploy: off diff --git a/vendor/github.com/minio/minio-go/bucket-cache.go b/vendor/github.com/minio/minio-go/bucket-cache.go deleted file mode 100644 index cac7ad792..000000000 --- a/vendor/github.com/minio/minio-go/bucket-cache.go +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import ( - "net/http" - "net/url" - "path" - "sync" - - "github.com/minio/minio-go/pkg/credentials" - "github.com/minio/minio-go/pkg/s3signer" - "github.com/minio/minio-go/pkg/s3utils" -) - -// bucketLocationCache - Provides simple mechanism to hold bucket -// locations in memory. -type bucketLocationCache struct { - // mutex is used for handling the concurrent - // read/write requests for cache. - sync.RWMutex - - // items holds the cached bucket locations. - items map[string]string -} - -// newBucketLocationCache - Provides a new bucket location cache to be -// used internally with the client object. -func newBucketLocationCache() *bucketLocationCache { - return &bucketLocationCache{ - items: make(map[string]string), - } -} - -// Get - Returns a value of a given key if it exists. -func (r *bucketLocationCache) Get(bucketName string) (location string, ok bool) { - r.RLock() - defer r.RUnlock() - location, ok = r.items[bucketName] - return -} - -// Set - Will persist a value into cache. -func (r *bucketLocationCache) Set(bucketName string, location string) { - r.Lock() - defer r.Unlock() - r.items[bucketName] = location -} - -// Delete - Deletes a bucket name from cache. -func (r *bucketLocationCache) Delete(bucketName string) { - r.Lock() - defer r.Unlock() - delete(r.items, bucketName) -} - -// GetBucketLocation - get location for the bucket name from location cache, if not -// fetch freshly by making a new request. -func (c Client) GetBucketLocation(bucketName string) (string, error) { - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - return "", err - } - return c.getBucketLocation(bucketName) -} - -// getBucketLocation - Get location for the bucketName from location map cache, if not -// fetch freshly by making a new request. -func (c Client) getBucketLocation(bucketName string) (string, error) { - if err := s3utils.CheckValidBucketName(bucketName); err != nil { - return "", err - } - - // Region set then no need to fetch bucket location. - if c.region != "" { - return c.region, nil - } - - if location, ok := c.bucketLocCache.Get(bucketName); ok { - return location, nil - } - - // Initialize a new request. - req, err := c.getBucketLocationRequest(bucketName) - if err != nil { - return "", err - } - - // Initiate the request. - resp, err := c.do(req) - defer closeResponse(resp) - if err != nil { - return "", err - } - location, err := processBucketLocationResponse(resp, bucketName) - if err != nil { - return "", err - } - c.bucketLocCache.Set(bucketName, location) - return location, nil -} - -// processes the getBucketLocation http response from the server. -func processBucketLocationResponse(resp *http.Response, bucketName string) (bucketLocation string, err error) { - if resp != nil { - if resp.StatusCode != http.StatusOK { - err = httpRespToErrorResponse(resp, bucketName, "") - errResp := ToErrorResponse(err) - // For access denied error, it could be an anonymous - // request. Move forward and let the top level callers - // succeed if possible based on their policy. - if errResp.Code == "AccessDenied" { - return "us-east-1", nil - } - return "", err - } - } - - // Extract location. - var locationConstraint string - err = xmlDecoder(resp.Body, &locationConstraint) - if err != nil { - return "", err - } - - location := locationConstraint - // Location is empty will be 'us-east-1'. - if location == "" { - location = "us-east-1" - } - - // Location can be 'EU' convert it to meaningful 'eu-west-1'. - if location == "EU" { - location = "eu-west-1" - } - - // Save the location into cache. - - // Return. - return location, nil -} - -// getBucketLocationRequest - Wrapper creates a new getBucketLocation request. -func (c Client) getBucketLocationRequest(bucketName string) (*http.Request, error) { - // Set location query. - urlValues := make(url.Values) - urlValues.Set("location", "") - - // Set get bucket location always as path style. - targetURL := c.endpointURL - targetURL.Path = path.Join(bucketName, "") + "/" - targetURL.RawQuery = urlValues.Encode() - - // Get a new HTTP request for the method. - req, err := http.NewRequest("GET", targetURL.String(), nil) - if err != nil { - return nil, err - } - - // Set UserAgent for the request. - c.setUserAgent(req) - - // Get credentials from the configured credentials provider. - value, err := c.credsProvider.Get() - if err != nil { - return nil, err - } - - var ( - signerType = value.SignerType - accessKeyID = value.AccessKeyID - secretAccessKey = value.SecretAccessKey - sessionToken = value.SessionToken - ) - - // Custom signer set then override the behavior. - if c.overrideSignerType != credentials.SignatureDefault { - signerType = c.overrideSignerType - } - - // If signerType returned by credentials helper is anonymous, - // then do not sign regardless of signerType override. - if value.SignerType == credentials.SignatureAnonymous { - signerType = credentials.SignatureAnonymous - } - - if signerType.IsAnonymous() { - return req, nil - } - - if signerType.IsV2() { - // Get Bucket Location calls should be always path style - isVirtualHost := false - req = s3signer.SignV2(*req, accessKeyID, secretAccessKey, isVirtualHost) - return req, nil - } - - // Set sha256 sum for signature calculation only with signature version '4'. - contentSha256 := emptySHA256Hex - if c.secure { - contentSha256 = unsignedPayload - } - - req.Header.Set("X-Amz-Content-Sha256", contentSha256) - req = s3signer.SignV4(*req, accessKeyID, secretAccessKey, sessionToken, "us-east-1") - return req, nil -} diff --git a/vendor/github.com/minio/minio-go/bucket-notification.go b/vendor/github.com/minio/minio-go/bucket-notification.go deleted file mode 100644 index ea303dd9d..000000000 --- a/vendor/github.com/minio/minio-go/bucket-notification.go +++ /dev/null @@ -1,273 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import ( - "encoding/xml" - - "github.com/minio/minio-go/pkg/set" -) - -// NotificationEventType is a S3 notification event associated to the bucket notification configuration -type NotificationEventType string - -// The role of all event types are described in : -// http://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html#notification-how-to-event-types-and-destinations -const ( - ObjectCreatedAll NotificationEventType = "s3:ObjectCreated:*" - ObjectCreatedPut = "s3:ObjectCreated:Put" - ObjectCreatedPost = "s3:ObjectCreated:Post" - ObjectCreatedCopy = "s3:ObjectCreated:Copy" - ObjectCreatedCompleteMultipartUpload = "s3:ObjectCreated:CompleteMultipartUpload" - ObjectAccessedGet = "s3:ObjectAccessed:Get" - ObjectAccessedHead = "s3:ObjectAccessed:Head" - ObjectAccessedAll = "s3:ObjectAccessed:*" - ObjectRemovedAll = "s3:ObjectRemoved:*" - ObjectRemovedDelete = "s3:ObjectRemoved:Delete" - ObjectRemovedDeleteMarkerCreated = "s3:ObjectRemoved:DeleteMarkerCreated" - ObjectReducedRedundancyLostObject = "s3:ReducedRedundancyLostObject" -) - -// FilterRule - child of S3Key, a tag in the notification xml which -// carries suffix/prefix filters -type FilterRule struct { - Name string `xml:"Name"` - Value string `xml:"Value"` -} - -// S3Key - child of Filter, a tag in the notification xml which -// carries suffix/prefix filters -type S3Key struct { - FilterRules []FilterRule `xml:"FilterRule,omitempty"` -} - -// Filter - a tag in the notification xml structure which carries -// suffix/prefix filters -type Filter struct { - S3Key S3Key `xml:"S3Key,omitempty"` -} - -// Arn - holds ARN information that will be sent to the web service, -// ARN desciption can be found in http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html -type Arn struct { - Partition string - Service string - Region string - AccountID string - Resource string -} - -// NewArn creates new ARN based on the given partition, service, region, account id and resource -func NewArn(partition, service, region, accountID, resource string) Arn { - return Arn{Partition: partition, - Service: service, - Region: region, - AccountID: accountID, - Resource: resource} -} - -// Return the string format of the ARN -func (arn Arn) String() string { - return "arn:" + arn.Partition + ":" + arn.Service + ":" + arn.Region + ":" + arn.AccountID + ":" + arn.Resource -} - -// NotificationConfig - represents one single notification configuration -// such as topic, queue or lambda configuration. -type NotificationConfig struct { - ID string `xml:"Id,omitempty"` - Arn Arn `xml:"-"` - Events []NotificationEventType `xml:"Event"` - Filter *Filter `xml:"Filter,omitempty"` -} - -// NewNotificationConfig creates one notification config and sets the given ARN -func NewNotificationConfig(arn Arn) NotificationConfig { - return NotificationConfig{Arn: arn, Filter: &Filter{}} -} - -// AddEvents adds one event to the current notification config -func (t *NotificationConfig) AddEvents(events ...NotificationEventType) { - t.Events = append(t.Events, events...) -} - -// AddFilterSuffix sets the suffix configuration to the current notification config -func (t *NotificationConfig) AddFilterSuffix(suffix string) { - if t.Filter == nil { - t.Filter = &Filter{} - } - newFilterRule := FilterRule{Name: "suffix", Value: suffix} - // Replace any suffix rule if existing and add to the list otherwise - for index := range t.Filter.S3Key.FilterRules { - if t.Filter.S3Key.FilterRules[index].Name == "suffix" { - t.Filter.S3Key.FilterRules[index] = newFilterRule - return - } - } - t.Filter.S3Key.FilterRules = append(t.Filter.S3Key.FilterRules, newFilterRule) -} - -// AddFilterPrefix sets the prefix configuration to the current notification config -func (t *NotificationConfig) AddFilterPrefix(prefix string) { - if t.Filter == nil { - t.Filter = &Filter{} - } - newFilterRule := FilterRule{Name: "prefix", Value: prefix} - // Replace any prefix rule if existing and add to the list otherwise - for index := range t.Filter.S3Key.FilterRules { - if t.Filter.S3Key.FilterRules[index].Name == "prefix" { - t.Filter.S3Key.FilterRules[index] = newFilterRule - return - } - } - t.Filter.S3Key.FilterRules = append(t.Filter.S3Key.FilterRules, newFilterRule) -} - -// TopicConfig carries one single topic notification configuration -type TopicConfig struct { - NotificationConfig - Topic string `xml:"Topic"` -} - -// QueueConfig carries one single queue notification configuration -type QueueConfig struct { - NotificationConfig - Queue string `xml:"Queue"` -} - -// LambdaConfig carries one single cloudfunction notification configuration -type LambdaConfig struct { - NotificationConfig - Lambda string `xml:"CloudFunction"` -} - -// BucketNotification - the struct that represents the whole XML to be sent to the web service -type BucketNotification struct { - XMLName xml.Name `xml:"NotificationConfiguration"` - LambdaConfigs []LambdaConfig `xml:"CloudFunctionConfiguration"` - TopicConfigs []TopicConfig `xml:"TopicConfiguration"` - QueueConfigs []QueueConfig `xml:"QueueConfiguration"` -} - -// AddTopic adds a given topic config to the general bucket notification config -func (b *BucketNotification) AddTopic(topicConfig NotificationConfig) bool { - newTopicConfig := TopicConfig{NotificationConfig: topicConfig, Topic: topicConfig.Arn.String()} - for _, n := range b.TopicConfigs { - // If new config matches existing one - if n.Topic == newTopicConfig.Arn.String() && newTopicConfig.Filter == n.Filter { - - existingConfig := set.NewStringSet() - for _, v := range n.Events { - existingConfig.Add(string(v)) - } - - newConfig := set.NewStringSet() - for _, v := range topicConfig.Events { - newConfig.Add(string(v)) - } - - if !newConfig.Intersection(existingConfig).IsEmpty() { - return false - } - } - } - b.TopicConfigs = append(b.TopicConfigs, newTopicConfig) - return true -} - -// AddQueue adds a given queue config to the general bucket notification config -func (b *BucketNotification) AddQueue(queueConfig NotificationConfig) bool { - newQueueConfig := QueueConfig{NotificationConfig: queueConfig, Queue: queueConfig.Arn.String()} - for _, n := range b.QueueConfigs { - if n.Queue == newQueueConfig.Arn.String() && newQueueConfig.Filter == n.Filter { - - existingConfig := set.NewStringSet() - for _, v := range n.Events { - existingConfig.Add(string(v)) - } - - newConfig := set.NewStringSet() - for _, v := range queueConfig.Events { - newConfig.Add(string(v)) - } - - if !newConfig.Intersection(existingConfig).IsEmpty() { - return false - } - } - } - b.QueueConfigs = append(b.QueueConfigs, newQueueConfig) - return true -} - -// AddLambda adds a given lambda config to the general bucket notification config -func (b *BucketNotification) AddLambda(lambdaConfig NotificationConfig) bool { - newLambdaConfig := LambdaConfig{NotificationConfig: lambdaConfig, Lambda: lambdaConfig.Arn.String()} - for _, n := range b.LambdaConfigs { - if n.Lambda == newLambdaConfig.Arn.String() && newLambdaConfig.Filter == n.Filter { - - existingConfig := set.NewStringSet() - for _, v := range n.Events { - existingConfig.Add(string(v)) - } - - newConfig := set.NewStringSet() - for _, v := range lambdaConfig.Events { - newConfig.Add(string(v)) - } - - if !newConfig.Intersection(existingConfig).IsEmpty() { - return false - } - } - } - b.LambdaConfigs = append(b.LambdaConfigs, newLambdaConfig) - return true -} - -// RemoveTopicByArn removes all topic configurations that match the exact specified ARN -func (b *BucketNotification) RemoveTopicByArn(arn Arn) { - var topics []TopicConfig - for _, topic := range b.TopicConfigs { - if topic.Topic != arn.String() { - topics = append(topics, topic) - } - } - b.TopicConfigs = topics -} - -// RemoveQueueByArn removes all queue configurations that match the exact specified ARN -func (b *BucketNotification) RemoveQueueByArn(arn Arn) { - var queues []QueueConfig - for _, queue := range b.QueueConfigs { - if queue.Queue != arn.String() { - queues = append(queues, queue) - } - } - b.QueueConfigs = queues -} - -// RemoveLambdaByArn removes all lambda configurations that match the exact specified ARN -func (b *BucketNotification) RemoveLambdaByArn(arn Arn) { - var lambdas []LambdaConfig - for _, lambda := range b.LambdaConfigs { - if lambda.Lambda != arn.String() { - lambdas = append(lambdas, lambda) - } - } - b.LambdaConfigs = lambdas -} diff --git a/vendor/github.com/minio/minio-go/constants.go b/vendor/github.com/minio/minio-go/constants.go deleted file mode 100644 index 737742318..000000000 --- a/vendor/github.com/minio/minio-go/constants.go +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -/// Multipart upload defaults. - -// absMinPartSize - absolute minimum part size (5 MiB) below which -// a part in a multipart upload may not be uploaded. -const absMinPartSize = 1024 * 1024 * 5 - -// minPartSize - minimum part size 64MiB per object after which -// putObject behaves internally as multipart. -const minPartSize = 1024 * 1024 * 64 - -// maxPartsCount - maximum number of parts for a single multipart session. -const maxPartsCount = 10000 - -// maxPartSize - maximum part size 5GiB for a single multipart upload -// operation. -const maxPartSize = 1024 * 1024 * 1024 * 5 - -// maxSinglePutObjectSize - maximum size 5GiB of object per PUT -// operation. -const maxSinglePutObjectSize = 1024 * 1024 * 1024 * 5 - -// maxMultipartPutObjectSize - maximum size 5TiB of object for -// Multipart operation. -const maxMultipartPutObjectSize = 1024 * 1024 * 1024 * 1024 * 5 - -// unsignedPayload - value to be set to X-Amz-Content-Sha256 header when -// we don't want to sign the request payload -const unsignedPayload = "UNSIGNED-PAYLOAD" - -// Total number of parallel workers used for multipart operation. -const totalWorkers = 4 - -// Signature related constants. -const ( - signV4Algorithm = "AWS4-HMAC-SHA256" - iso8601DateFormat = "20060102T150405Z" -) - -// Storage class header constant. -const amzStorageClass = "X-Amz-Storage-Class" - -// Website redirect location header constant -const amzWebsiteRedirectLocation = "X-Amz-Website-Redirect-Location" diff --git a/vendor/github.com/minio/minio-go/core.go b/vendor/github.com/minio/minio-go/core.go deleted file mode 100644 index a5017d868..000000000 --- a/vendor/github.com/minio/minio-go/core.go +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import ( - "context" - "io" - "strings" -) - -// Core - Inherits Client and adds new methods to expose the low level S3 APIs. -type Core struct { - *Client -} - -// NewCore - Returns new initialized a Core client, this CoreClient should be -// only used under special conditions such as need to access lower primitives -// and being able to use them to write your own wrappers. -func NewCore(endpoint string, accessKeyID, secretAccessKey string, secure bool) (*Core, error) { - var s3Client Core - client, err := NewV4(endpoint, accessKeyID, secretAccessKey, secure) - if err != nil { - return nil, err - } - s3Client.Client = client - return &s3Client, nil -} - -// ListObjects - List all the objects at a prefix, optionally with marker and delimiter -// you can further filter the results. -func (c Core) ListObjects(bucket, prefix, marker, delimiter string, maxKeys int) (result ListBucketResult, err error) { - return c.listObjectsQuery(bucket, prefix, marker, delimiter, maxKeys) -} - -// ListObjectsV2 - Lists all the objects at a prefix, similar to ListObjects() but uses -// continuationToken instead of marker to support iteration over the results. -func (c Core) ListObjectsV2(bucketName, objectPrefix, continuationToken string, fetchOwner bool, delimiter string, maxkeys int, startAfter string) (ListBucketV2Result, error) { - return c.listObjectsV2Query(bucketName, objectPrefix, continuationToken, fetchOwner, delimiter, maxkeys, startAfter) -} - -// CopyObject - copies an object from source object to destination object on server side. -func (c Core) CopyObject(sourceBucket, sourceObject, destBucket, destObject string, metadata map[string]string) (ObjectInfo, error) { - return c.copyObjectDo(context.Background(), sourceBucket, sourceObject, destBucket, destObject, metadata) -} - -// CopyObjectPart - creates a part in a multipart upload by copying (a -// part of) an existing object. -func (c Core) CopyObjectPart(srcBucket, srcObject, destBucket, destObject string, uploadID string, - partID int, startOffset, length int64, metadata map[string]string) (p CompletePart, err error) { - - return c.copyObjectPartDo(context.Background(), srcBucket, srcObject, destBucket, destObject, uploadID, - partID, startOffset, length, metadata) -} - -// PutObject - Upload object. Uploads using single PUT call. -func (c Core) PutObject(bucket, object string, data io.Reader, size int64, md5Base64, sha256Hex string, metadata map[string]string) (ObjectInfo, error) { - opts := PutObjectOptions{} - m := make(map[string]string) - for k, v := range metadata { - if strings.ToLower(k) == "content-encoding" { - opts.ContentEncoding = v - } else if strings.ToLower(k) == "content-disposition" { - opts.ContentDisposition = v - } else if strings.ToLower(k) == "content-language" { - opts.ContentLanguage = v - } else if strings.ToLower(k) == "content-type" { - opts.ContentType = v - } else if strings.ToLower(k) == "cache-control" { - opts.CacheControl = v - } else if strings.ToLower(k) == strings.ToLower(amzWebsiteRedirectLocation) { - opts.WebsiteRedirectLocation = v - } else { - m[k] = metadata[k] - } - } - opts.UserMetadata = m - return c.putObjectDo(context.Background(), bucket, object, data, md5Base64, sha256Hex, size, opts) -} - -// NewMultipartUpload - Initiates new multipart upload and returns the new uploadID. -func (c Core) NewMultipartUpload(bucket, object string, opts PutObjectOptions) (uploadID string, err error) { - result, err := c.initiateMultipartUpload(context.Background(), bucket, object, opts) - return result.UploadID, err -} - -// ListMultipartUploads - List incomplete uploads. -func (c Core) ListMultipartUploads(bucket, prefix, keyMarker, uploadIDMarker, delimiter string, maxUploads int) (result ListMultipartUploadsResult, err error) { - return c.listMultipartUploadsQuery(bucket, keyMarker, uploadIDMarker, prefix, delimiter, maxUploads) -} - -// PutObjectPart - Upload an object part. -func (c Core) PutObjectPart(bucket, object, uploadID string, partID int, data io.Reader, size int64, md5Base64, sha256Hex string) (ObjectPart, error) { - return c.uploadPart(context.Background(), bucket, object, uploadID, data, partID, md5Base64, sha256Hex, size, nil) -} - -// ListObjectParts - List uploaded parts of an incomplete upload.x -func (c Core) ListObjectParts(bucket, object, uploadID string, partNumberMarker int, maxParts int) (result ListObjectPartsResult, err error) { - return c.listObjectPartsQuery(bucket, object, uploadID, partNumberMarker, maxParts) -} - -// CompleteMultipartUpload - Concatenate uploaded parts and commit to an object. -func (c Core) CompleteMultipartUpload(bucket, object, uploadID string, parts []CompletePart) error { - _, err := c.completeMultipartUpload(context.Background(), bucket, object, uploadID, completeMultipartUpload{ - Parts: parts, - }) - return err -} - -// AbortMultipartUpload - Abort an incomplete upload. -func (c Core) AbortMultipartUpload(bucket, object, uploadID string) error { - return c.abortMultipartUpload(context.Background(), bucket, object, uploadID) -} - -// GetBucketPolicy - fetches bucket access policy for a given bucket. -func (c Core) GetBucketPolicy(bucket string) (string, error) { - return c.getBucketPolicy(bucket) -} - -// PutBucketPolicy - applies a new bucket access policy for a given bucket. -func (c Core) PutBucketPolicy(bucket, bucketPolicy string) error { - return c.putBucketPolicy(bucket, bucketPolicy) -} - -// GetObject is a lower level API implemented to support reading -// partial objects and also downloading objects with special conditions -// matching etag, modtime etc. -func (c Core) GetObject(bucketName, objectName string, opts GetObjectOptions) (io.ReadCloser, ObjectInfo, error) { - return c.getObject(context.Background(), bucketName, objectName, opts) -} - -// StatObject is a lower level API implemented to support special -// conditions matching etag, modtime on a request. -func (c Core) StatObject(bucketName, objectName string, opts StatObjectOptions) (ObjectInfo, error) { - return c.statObject(context.Background(), bucketName, objectName, opts) -} diff --git a/vendor/github.com/minio/minio-go/functional_tests.go b/vendor/github.com/minio/minio-go/functional_tests.go deleted file mode 100644 index 207cbd03c..000000000 --- a/vendor/github.com/minio/minio-go/functional_tests.go +++ /dev/null @@ -1,7506 +0,0 @@ -// +build ignore - -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package main - -import ( - "bytes" - "context" - "encoding/json" - "errors" - "fmt" - "io" - "io/ioutil" - "math/rand" - "mime/multipart" - "net/http" - "net/url" - "os" - "path/filepath" - "reflect" - "runtime" - "strconv" - "strings" - "time" - - humanize "github.com/dustin/go-humanize" - minio "github.com/minio/minio-go" - log "github.com/sirupsen/logrus" - - "github.com/minio/minio-go/pkg/encrypt" -) - -const letterBytes = "abcdefghijklmnopqrstuvwxyz01234569" -const ( - letterIdxBits = 6 // 6 bits to represent a letter index - letterIdxMask = 1<= 0; { - if remain == 0 { - cache, remain = src.Int63(), letterIdxMax - } - if idx := int(cache & letterIdxMask); idx < len(letterBytes) { - b[i] = letterBytes[idx] - i-- - } - cache >>= letterIdxBits - remain-- - } - return prefix + string(b[0:30-len(prefix)]) -} - -var dataFileMap = map[string]int{ - "datafile-1-b": 1, - "datafile-10-kB": 10 * humanize.KiByte, - "datafile-33-kB": 33 * humanize.KiByte, - "datafile-100-kB": 100 * humanize.KiByte, - "datafile-1.03-MB": 1056 * humanize.KiByte, - "datafile-1-MB": 1 * humanize.MiByte, - "datafile-5-MB": 5 * humanize.MiByte, - "datafile-6-MB": 6 * humanize.MiByte, - "datafile-11-MB": 11 * humanize.MiByte, - "datafile-65-MB": 65 * humanize.MiByte, -} - -func isFullMode() bool { - return os.Getenv("MINT_MODE") == "full" -} - -func getFuncName() string { - pc, _, _, _ := runtime.Caller(1) - return strings.TrimPrefix(runtime.FuncForPC(pc).Name(), "main.") -} - -// Tests bucket re-create errors. -func testMakeBucketError() { - region := "eu-central-1" - - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "MakeBucket(bucketName, region)" - // initialize logging params - args := map[string]interface{}{ - "bucketName": "", - "region": region, - } - - // skipping region functional tests for non s3 runs - if os.Getenv(serverEndpoint) != "s3.amazonaws.com" { - ignoredLog(testName, function, args, startTime, "Skipped region functional tests for non s3 runs").Info() - return - } - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.New( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket in 'eu-central-1'. - if err = c.MakeBucket(bucketName, region); err != nil { - logError(testName, function, args, startTime, "", "MakeBucket Failed", err) - return - } - if err = c.MakeBucket(bucketName, region); err == nil { - logError(testName, function, args, startTime, "", "Bucket already exists", err) - return - } - // Verify valid error response from server. - if minio.ToErrorResponse(err).Code != "BucketAlreadyExists" && - minio.ToErrorResponse(err).Code != "BucketAlreadyOwnedByYou" { - logError(testName, function, args, startTime, "", "Invalid error returned by server", err) - return - } - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - successLogger(testName, function, args, startTime).Info() -} - -func testMetadataSizeLimit() { - startTime := time.Now() - testName := getFuncName() - function := "PutObject(bucketName, objectName, reader, objectSize, opts)" - args := map[string]interface{}{ - "bucketName": "", - "objectName": "", - "opts.UserMetadata": "", - } - rand.Seed(startTime.Unix()) - - // Instantiate new minio client object. - c, err := minio.New( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client creation failed", err) - return - } - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "") - args["objectName"] = objectName - - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "Make bucket failed", err) - return - } - - const HeaderSizeLimit = 8 * 1024 - const UserMetadataLimit = 2 * 1024 - - // Meta-data greater than the 2 KB limit of AWS - PUT calls with this meta-data should fail - metadata := make(map[string]string) - metadata["X-Amz-Meta-Mint-Test"] = string(bytes.Repeat([]byte("m"), 1+UserMetadataLimit-len("X-Amz-Meta-Mint-Test"))) - args["metadata"] = fmt.Sprint(metadata) - - _, err = c.PutObject(bucketName, objectName, bytes.NewReader(nil), 0, minio.PutObjectOptions{UserMetadata: metadata}) - if err == nil { - logError(testName, function, args, startTime, "", "Created object with user-defined metadata exceeding metadata size limits", nil) - return - } - - // Meta-data (headers) greater than the 8 KB limit of AWS - PUT calls with this meta-data should fail - metadata = make(map[string]string) - metadata["X-Amz-Mint-Test"] = string(bytes.Repeat([]byte("m"), 1+HeaderSizeLimit-len("X-Amz-Mint-Test"))) - args["metadata"] = fmt.Sprint(metadata) - _, err = c.PutObject(bucketName, objectName, bytes.NewReader(nil), 0, minio.PutObjectOptions{UserMetadata: metadata}) - if err == nil { - logError(testName, function, args, startTime, "", "Created object with headers exceeding header size limits", nil) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -// Tests various bucket supported formats. -func testMakeBucketRegions() { - region := "eu-central-1" - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "MakeBucket(bucketName, region)" - // initialize logging params - args := map[string]interface{}{ - "bucketName": "", - "region": region, - } - - // skipping region functional tests for non s3 runs - if os.Getenv(serverEndpoint) != "s3.amazonaws.com" { - ignoredLog(testName, function, args, startTime, "Skipped region functional tests for non s3 runs").Info() - return - } - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.New( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket in 'eu-central-1'. - if err = c.MakeBucket(bucketName, region); err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - // Make a new bucket with '.' in its name, in 'us-west-2'. This - // request is internally staged into a path style instead of - // virtual host style. - region = "us-west-2" - args["region"] = region - if err = c.MakeBucket(bucketName+".withperiod", region); err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName+".withperiod", c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - successLogger(testName, function, args, startTime).Info() -} - -// Test PutObject using a large data to trigger multipart readat -func testPutObjectReadAt() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "PutObject(bucketName, objectName, reader, opts)" - args := map[string]interface{}{ - "bucketName": "", - "objectName": "", - "opts": "objectContentType", - } - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.New( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "Make bucket failed", err) - return - } - - bufSize := dataFileMap["datafile-65-MB"] - var reader = getDataReader("datafile-65-MB") - defer reader.Close() - - // Save the data - objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "") - args["objectName"] = objectName - - // Object content type - objectContentType := "binary/octet-stream" - args["objectContentType"] = objectContentType - - n, err := c.PutObject(bucketName, objectName, reader, int64(bufSize), minio.PutObjectOptions{ContentType: objectContentType}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - - if n != int64(bufSize) { - logError(testName, function, args, startTime, "", "Number of bytes returned by PutObject does not match, expected "+string(bufSize)+" got "+string(n), err) - return - } - - // Read the data back - r, err := c.GetObject(bucketName, objectName, minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "Get Object failed", err) - return - } - - st, err := r.Stat() - if err != nil { - logError(testName, function, args, startTime, "", "Stat Object failed", err) - return - } - if st.Size != int64(bufSize) { - logError(testName, function, args, startTime, "", fmt.Sprintf("Number of bytes in stat does not match, expected %d got %d", bufSize, st.Size), err) - return - } - if st.ContentType != objectContentType && st.ContentType != "application/octet-stream" { - logError(testName, function, args, startTime, "", "Content types don't match", err) - return - } - if err := r.Close(); err != nil { - logError(testName, function, args, startTime, "", "Object Close failed", err) - return - } - if err := r.Close(); err == nil { - logError(testName, function, args, startTime, "", "Object is already closed, didn't return error on Close", err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -// Test PutObject using a large data to trigger multipart readat -func testPutObjectWithMetadata() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "PutObject(bucketName, objectName, reader,size, opts)" - args := map[string]interface{}{ - "bucketName": "", - "objectName": "", - "opts": "minio.PutObjectOptions{UserMetadata: metadata, Progress: progress}", - } - - if !isFullMode() { - ignoredLog(testName, function, args, startTime, "Skipping functional tests for short/quick runs").Info() - return - } - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.New( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "Make bucket failed", err) - return - } - - bufSize := dataFileMap["datafile-65-MB"] - var reader = getDataReader("datafile-65-MB") - defer reader.Close() - - // Save the data - objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "") - args["objectName"] = objectName - - // Object custom metadata - customContentType := "custom/contenttype" - - args["metadata"] = map[string][]string{ - "Content-Type": {customContentType}, - } - - n, err := c.PutObject(bucketName, objectName, reader, int64(bufSize), minio.PutObjectOptions{ - ContentType: customContentType}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - - if n != int64(bufSize) { - logError(testName, function, args, startTime, "", "Number of bytes returned by PutObject does not match, expected "+string(bufSize)+" got "+string(n), err) - return - } - - // Read the data back - r, err := c.GetObject(bucketName, objectName, minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "GetObject failed", err) - return - } - - st, err := r.Stat() - if err != nil { - logError(testName, function, args, startTime, "", "Stat failed", err) - return - } - if st.Size != int64(bufSize) { - logError(testName, function, args, startTime, "", "Number of bytes returned by PutObject does not match GetObject, expected "+string(bufSize)+" got "+string(st.Size), err) - return - } - if st.ContentType != customContentType && st.ContentType != "application/octet-stream" { - logError(testName, function, args, startTime, "", "ContentType does not match, expected "+customContentType+" got "+st.ContentType, err) - return - } - if err := r.Close(); err != nil { - logError(testName, function, args, startTime, "", "Object Close failed", err) - return - } - if err := r.Close(); err == nil { - logError(testName, function, args, startTime, "", "Object already closed, should respond with error", err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -func testPutObjectWithContentLanguage() { - // initialize logging params - objectName := "test-object" - startTime := time.Now() - testName := getFuncName() - function := "PutObject(bucketName, objectName, reader, size, opts)" - args := map[string]interface{}{ - "bucketName": "", - "objectName": objectName, - "size": -1, - "opts": "", - } - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.NewV4( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - data := bytes.Repeat([]byte("a"), int(0)) - n, err := c.PutObject(bucketName, objectName, bytes.NewReader(data), int64(0), minio.PutObjectOptions{ - ContentLanguage: "en", - }) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - - if n != 0 { - logError(testName, function, args, startTime, "", "Expected upload object '0' doesn't match with PutObject return value", err) - return - } - - objInfo, err := c.StatObject(bucketName, objectName, minio.StatObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "StatObject failed", err) - return - } - - if objInfo.Metadata.Get("Content-Language") != "en" { - logError(testName, function, args, startTime, "", "Expected content-language 'en' doesn't match with StatObject return value", err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -// Test put object with streaming signature. -func testPutObjectStreaming() { - // initialize logging params - objectName := "test-object" - startTime := time.Now() - testName := getFuncName() - function := "PutObject(bucketName, objectName, reader,size,opts)" - args := map[string]interface{}{ - "bucketName": "", - "objectName": objectName, - "size": -1, - "opts": "", - } - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.NewV4( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - // Upload an object. - sizes := []int64{0, 64*1024 - 1, 64 * 1024} - - for _, size := range sizes { - data := bytes.Repeat([]byte("a"), int(size)) - n, err := c.PutObject(bucketName, objectName, bytes.NewReader(data), int64(size), minio.PutObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObjectStreaming failed", err) - return - } - - if n != size { - logError(testName, function, args, startTime, "", "Expected upload object size doesn't match with PutObjectStreaming return value", err) - return - } - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -// Test get object seeker from the end, using whence set to '2'. -func testGetObjectSeekEnd() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "GetObject(bucketName, objectName)" - args := map[string]interface{}{} - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.New( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - // Generate 33K of data. - bufSize := dataFileMap["datafile-33-kB"] - var reader = getDataReader("datafile-33-kB") - defer reader.Close() - - // Save the data - objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "") - args["objectName"] = objectName - - buf, err := ioutil.ReadAll(reader) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAll failed", err) - return - } - - n, err := c.PutObject(bucketName, objectName, bytes.NewReader(buf), int64(len(buf)), minio.PutObjectOptions{ContentType: "binary/octet-stream"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - - if n != int64(bufSize) { - logError(testName, function, args, startTime, "", "Number of bytes read does not match, expected "+string(int64(bufSize))+" got "+string(n), err) - return - } - - // Read the data back - r, err := c.GetObject(bucketName, objectName, minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "GetObject failed", err) - return - } - - st, err := r.Stat() - if err != nil { - logError(testName, function, args, startTime, "", "Stat failed", err) - return - } - - if st.Size != int64(bufSize) { - logError(testName, function, args, startTime, "", "Number of bytes read does not match, expected "+string(int64(bufSize))+" got "+string(st.Size), err) - return - } - - pos, err := r.Seek(-100, 2) - if err != nil { - logError(testName, function, args, startTime, "", "Object Seek failed", err) - return - } - if pos != st.Size-100 { - logError(testName, function, args, startTime, "", "Incorrect position", err) - return - } - buf2 := make([]byte, 100) - m, err := io.ReadFull(r, buf2) - if err != nil { - logError(testName, function, args, startTime, "", "Error reading through io.ReadFull", err) - return - } - if m != len(buf2) { - logError(testName, function, args, startTime, "", "Number of bytes dont match, expected "+string(len(buf2))+" got "+string(m), err) - return - } - hexBuf1 := fmt.Sprintf("%02x", buf[len(buf)-100:]) - hexBuf2 := fmt.Sprintf("%02x", buf2[:m]) - if hexBuf1 != hexBuf2 { - logError(testName, function, args, startTime, "", "Values at same index dont match", err) - return - } - pos, err = r.Seek(-100, 2) - if err != nil { - logError(testName, function, args, startTime, "", "Object Seek failed", err) - return - } - if pos != st.Size-100 { - logError(testName, function, args, startTime, "", "Incorrect position", err) - return - } - if err = r.Close(); err != nil { - logError(testName, function, args, startTime, "", "ObjectClose failed", err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -// Test get object reader to not throw error on being closed twice. -func testGetObjectClosedTwice() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "GetObject(bucketName, objectName)" - args := map[string]interface{}{} - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.New( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - // Generate 33K of data. - bufSize := dataFileMap["datafile-33-kB"] - var reader = getDataReader("datafile-33-kB") - defer reader.Close() - - // Save the data - objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "") - args["objectName"] = objectName - - n, err := c.PutObject(bucketName, objectName, reader, int64(bufSize), minio.PutObjectOptions{ContentType: "binary/octet-stream"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - - if n != int64(bufSize) { - logError(testName, function, args, startTime, "", "PutObject response doesn't match sent bytes, expected "+string(int64(bufSize))+" got "+string(n), err) - return - } - - // Read the data back - r, err := c.GetObject(bucketName, objectName, minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "GetObject failed", err) - return - } - - st, err := r.Stat() - if err != nil { - logError(testName, function, args, startTime, "", "Stat failed", err) - return - } - if st.Size != int64(bufSize) { - logError(testName, function, args, startTime, "", "Number of bytes in stat does not match, expected "+string(int64(bufSize))+" got "+string(st.Size), err) - return - } - if err := r.Close(); err != nil { - logError(testName, function, args, startTime, "", "Object Close failed", err) - return - } - if err := r.Close(); err == nil { - logError(testName, function, args, startTime, "", "Already closed object. No error returned", err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -// Test RemoveObjectsWithContext request context cancels after timeout -func testRemoveObjectsWithContext() { - // Initialize logging params. - startTime := time.Now() - testName := getFuncName() - function := "RemoveObjectsWithContext(ctx, bucketName, objectsCh)" - args := map[string]interface{}{ - "bucketName": "", - } - - // Seed random based on current tie. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client. - c, err := minio.New( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client object creation failed", err) - return - } - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - // Enable tracing, write to stdout. - // c.TraceOn(os.Stderr) - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - } - - // Generate put data. - r := bytes.NewReader(bytes.Repeat([]byte("a"), 8)) - - // Multi remove of 20 objects. - nrObjects := 20 - objectsCh := make(chan string) - go func() { - defer close(objectsCh) - for i := 0; i < nrObjects; i++ { - objectName := "sample" + strconv.Itoa(i) + ".txt" - _, err = c.PutObject(bucketName, objectName, r, 8, minio.PutObjectOptions{ContentType: "application/octet-stream"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - continue - } - objectsCh <- objectName - } - }() - // Set context to cancel in 1 nanosecond. - ctx, cancel := context.WithTimeout(context.Background(), 1*time.Nanosecond) - args["ctx"] = ctx - defer cancel() - - // Call RemoveObjectsWithContext API with short timeout. - errorCh := c.RemoveObjectsWithContext(ctx, bucketName, objectsCh) - // Check for error. - select { - case r := <-errorCh: - if r.Err == nil { - logError(testName, function, args, startTime, "", "RemoveObjectsWithContext should fail on short timeout", err) - return - } - } - // Set context with longer timeout. - ctx, cancel = context.WithTimeout(context.Background(), 1*time.Hour) - args["ctx"] = ctx - defer cancel() - // Perform RemoveObjectsWithContext with the longer timeout. Expect the removals to succeed. - errorCh = c.RemoveObjectsWithContext(ctx, bucketName, objectsCh) - select { - case r, more := <-errorCh: - if more || r.Err != nil { - logError(testName, function, args, startTime, "", "Unexpected error", r.Err) - return - } - } - - // Delete all objects and buckets. - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - successLogger(testName, function, args, startTime).Info() -} - -// Test removing multiple objects with Remove API -func testRemoveMultipleObjects() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "RemoveObjects(bucketName, objectsCh)" - args := map[string]interface{}{ - "bucketName": "", - } - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.New( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - - if err != nil { - logError(testName, function, args, startTime, "", "Minio client object creation failed", err) - return - } - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Enable tracing, write to stdout. - // c.TraceOn(os.Stderr) - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - r := bytes.NewReader(bytes.Repeat([]byte("a"), 8)) - - // Multi remove of 1100 objects - nrObjects := 200 - - objectsCh := make(chan string) - - go func() { - defer close(objectsCh) - // Upload objects and send them to objectsCh - for i := 0; i < nrObjects; i++ { - objectName := "sample" + strconv.Itoa(i) + ".txt" - _, err = c.PutObject(bucketName, objectName, r, 8, minio.PutObjectOptions{ContentType: "application/octet-stream"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - continue - } - objectsCh <- objectName - } - }() - - // Call RemoveObjects API - errorCh := c.RemoveObjects(bucketName, objectsCh) - - // Check if errorCh doesn't receive any error - select { - case r, more := <-errorCh: - if more { - logError(testName, function, args, startTime, "", "Unexpected error", r.Err) - return - } - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -// Tests FPutObject of a big file to trigger multipart -func testFPutObjectMultipart() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "FPutObject(bucketName, objectName, fileName, opts)" - args := map[string]interface{}{ - "bucketName": "", - "objectName": "", - "fileName": "", - "opts": "", - } - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.New( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - // Upload 4 parts to utilize all 3 'workers' in multipart and still have a part to upload. - var fileName = getMintDataDirFilePath("datafile-65-MB") - if fileName == "" { - // Make a temp file with minPartSize bytes of data. - file, err := ioutil.TempFile(os.TempDir(), "FPutObjectTest") - if err != nil { - logError(testName, function, args, startTime, "", "TempFile creation failed", err) - return - } - // Upload 2 parts to utilize all 3 'workers' in multipart and still have a part to upload. - if _, err = io.Copy(file, getDataReader("datafile-65-MB")); err != nil { - logError(testName, function, args, startTime, "", "Copy failed", err) - return - } - if err = file.Close(); err != nil { - logError(testName, function, args, startTime, "", "File Close failed", err) - return - } - fileName = file.Name() - args["fileName"] = fileName - } - totalSize := dataFileMap["datafile-65-MB"] - // Set base object name - objectName := bucketName + "FPutObject" + "-standard" - args["objectName"] = objectName - - objectContentType := "testapplication/octet-stream" - args["objectContentType"] = objectContentType - - // Perform standard FPutObject with contentType provided (Expecting application/octet-stream) - n, err := c.FPutObject(bucketName, objectName, fileName, minio.PutObjectOptions{ContentType: objectContentType}) - if err != nil { - logError(testName, function, args, startTime, "", "FPutObject failed", err) - return - } - if n != int64(totalSize) { - logError(testName, function, args, startTime, "", "FPutObject failed", err) - return - } - - r, err := c.GetObject(bucketName, objectName, minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "GetObject failed", err) - return - } - objInfo, err := r.Stat() - if err != nil { - logError(testName, function, args, startTime, "", "Unexpected error", err) - return - } - if objInfo.Size != int64(totalSize) { - logError(testName, function, args, startTime, "", "Number of bytes does not match, expected "+string(int64(totalSize))+" got "+string(objInfo.Size), err) - return - } - if objInfo.ContentType != objectContentType && objInfo.ContentType != "application/octet-stream" { - logError(testName, function, args, startTime, "", "ContentType doesn't match", err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -// Tests FPutObject with null contentType (default = application/octet-stream) -func testFPutObject() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "FPutObject(bucketName, objectName, fileName, opts)" - - args := map[string]interface{}{ - "bucketName": "", - "objectName": "", - "fileName": "", - "opts": "", - } - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.New( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - location := "us-east-1" - - // Make a new bucket. - args["bucketName"] = bucketName - args["location"] = location - function = "MakeBucket()bucketName, location" - err = c.MakeBucket(bucketName, location) - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - // Upload 3 parts worth of data to use all 3 of multiparts 'workers' and have an extra part. - // Use different data in part for multipart tests to check parts are uploaded in correct order. - var fName = getMintDataDirFilePath("datafile-65-MB") - if fName == "" { - // Make a temp file with minPartSize bytes of data. - file, err := ioutil.TempFile(os.TempDir(), "FPutObjectTest") - if err != nil { - logError(testName, function, args, startTime, "", "TempFile creation failed", err) - return - } - - // Upload 3 parts to utilize all 3 'workers' in multipart and still have a part to upload. - if _, err = io.Copy(file, getDataReader("datafile-65-MB")); err != nil { - logError(testName, function, args, startTime, "", "File copy failed", err) - return - } - // Close the file pro-actively for windows. - if err = file.Close(); err != nil { - logError(testName, function, args, startTime, "", "File close failed", err) - return - } - defer os.Remove(file.Name()) - fName = file.Name() - } - totalSize := dataFileMap["datafile-65-MB"] - - // Set base object name - function = "FPutObject(bucketName, objectName, fileName, opts)" - objectName := bucketName + "FPutObject" - args["objectName"] = objectName + "-standard" - args["fileName"] = fName - args["opts"] = minio.PutObjectOptions{ContentType: "application/octet-stream"} - - // Perform standard FPutObject with contentType provided (Expecting application/octet-stream) - n, err := c.FPutObject(bucketName, objectName+"-standard", fName, minio.PutObjectOptions{ContentType: "application/octet-stream"}) - - if err != nil { - logError(testName, function, args, startTime, "", "FPutObject failed", err) - return - } - if n != int64(totalSize) { - logError(testName, function, args, startTime, "", "Number of bytes does not match, expected "+string(totalSize)+", got "+string(n), err) - return - } - - // Perform FPutObject with no contentType provided (Expecting application/octet-stream) - args["objectName"] = objectName + "-Octet" - n, err = c.FPutObject(bucketName, objectName+"-Octet", fName, minio.PutObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "File close failed", err) - return - } - if n != int64(totalSize) { - logError(testName, function, args, startTime, "", "Number of bytes does not match, expected "+string(totalSize)+", got "+string(n), err) - return - } - srcFile, err := os.Open(fName) - if err != nil { - logError(testName, function, args, startTime, "", "File open failed", err) - return - } - defer srcFile.Close() - // Add extension to temp file name - tmpFile, err := os.Create(fName + ".gtar") - if err != nil { - logError(testName, function, args, startTime, "", "File create failed", err) - return - } - defer tmpFile.Close() - _, err = io.Copy(tmpFile, srcFile) - if err != nil { - logError(testName, function, args, startTime, "", "File copy failed", err) - return - } - - // Perform FPutObject with no contentType provided (Expecting application/x-gtar) - args["objectName"] = objectName + "-GTar" - args["opts"] = minio.PutObjectOptions{} - n, err = c.FPutObject(bucketName, objectName+"-GTar", fName+".gtar", minio.PutObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "FPutObject failed", err) - return - } - if n != int64(totalSize) { - logError(testName, function, args, startTime, "", "Number of bytes does not match, expected "+string(totalSize)+", got "+string(n), err) - return - } - - // Check headers - function = "StatObject(bucketName, objectName, opts)" - args["objectName"] = objectName + "-standard" - rStandard, err := c.StatObject(bucketName, objectName+"-standard", minio.StatObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "StatObject failed", err) - return - } - if rStandard.ContentType != "application/octet-stream" { - logError(testName, function, args, startTime, "", "ContentType does not match, expected application/octet-stream, got "+rStandard.ContentType, err) - return - } - - function = "StatObject(bucketName, objectName, opts)" - args["objectName"] = objectName + "-Octet" - rOctet, err := c.StatObject(bucketName, objectName+"-Octet", minio.StatObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "StatObject failed", err) - return - } - if rOctet.ContentType != "application/octet-stream" { - logError(testName, function, args, startTime, "", "ContentType does not match, expected application/octet-stream, got "+rOctet.ContentType, err) - return - } - - function = "StatObject(bucketName, objectName, opts)" - args["objectName"] = objectName + "-GTar" - rGTar, err := c.StatObject(bucketName, objectName+"-GTar", minio.StatObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "StatObject failed", err) - return - } - if rGTar.ContentType != "application/x-gtar" && rGTar.ContentType != "application/octet-stream" { - logError(testName, function, args, startTime, "", "ContentType does not match, expected application/x-gtar or application/octet-stream, got "+rGTar.ContentType, err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - if err = os.Remove(fName + ".gtar"); err != nil { - logError(testName, function, args, startTime, "", "File remove failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -// Tests FPutObjectWithContext request context cancels after timeout -func testFPutObjectWithContext() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "FPutObject(bucketName, objectName, fileName, opts)" - args := map[string]interface{}{ - "bucketName": "", - "objectName": "", - "fileName": "", - "opts": "", - } - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.New( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - // Upload 1 parts worth of data to use multipart upload. - // Use different data in part for multipart tests to check parts are uploaded in correct order. - var fName = getMintDataDirFilePath("datafile-1-MB") - if fName == "" { - // Make a temp file with 1 MiB bytes of data. - file, err := ioutil.TempFile(os.TempDir(), "FPutObjectWithContextTest") - if err != nil { - logError(testName, function, args, startTime, "", "TempFile creation failed", err) - return - } - - // Upload 1 parts to trigger multipart upload - if _, err = io.Copy(file, getDataReader("datafile-1-MB")); err != nil { - logError(testName, function, args, startTime, "", "File copy failed", err) - return - } - // Close the file pro-actively for windows. - if err = file.Close(); err != nil { - logError(testName, function, args, startTime, "", "File close failed", err) - return - } - defer os.Remove(file.Name()) - fName = file.Name() - } - totalSize := dataFileMap["datafile-1-MB"] - - // Set base object name - objectName := bucketName + "FPutObjectWithContext" - args["objectName"] = objectName - ctx, cancel := context.WithTimeout(context.Background(), 1*time.Nanosecond) - args["ctx"] = ctx - defer cancel() - - // Perform standard FPutObjectWithContext with contentType provided (Expecting application/octet-stream) - _, err = c.FPutObjectWithContext(ctx, bucketName, objectName+"-Shorttimeout", fName, minio.PutObjectOptions{ContentType: "application/octet-stream"}) - if err == nil { - logError(testName, function, args, startTime, "", "FPutObjectWithContext should fail on short timeout", err) - return - } - ctx, cancel = context.WithTimeout(context.Background(), 1*time.Hour) - defer cancel() - // Perform FPutObjectWithContext with a long timeout. Expect the put object to succeed - n, err := c.FPutObjectWithContext(ctx, bucketName, objectName+"-Longtimeout", fName, minio.PutObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "FPutObjectWithContext shouldn't fail on long timeout", err) - return - } - if n != int64(totalSize) { - logError(testName, function, args, startTime, "", "Number of bytes does not match, expected "+string(totalSize)+", got "+string(n), err) - return - } - - _, err = c.StatObject(bucketName, objectName+"-Longtimeout", minio.StatObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "StatObject failed", err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() - -} - -// Tests FPutObjectWithContext request context cancels after timeout -func testFPutObjectWithContextV2() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "FPutObjectWithContext(ctx, bucketName, objectName, fileName, opts)" - args := map[string]interface{}{ - "bucketName": "", - "objectName": "", - "opts": "minio.PutObjectOptions{ContentType:objectContentType}", - } - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.NewV2( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - // Upload 1 parts worth of data to use multipart upload. - // Use different data in part for multipart tests to check parts are uploaded in correct order. - var fName = getMintDataDirFilePath("datafile-1-MB") - if fName == "" { - // Make a temp file with 1 MiB bytes of data. - file, err := ioutil.TempFile(os.TempDir(), "FPutObjectWithContextTest") - if err != nil { - logError(testName, function, args, startTime, "", "Temp file creation failed", err) - return - } - - // Upload 1 parts to trigger multipart upload - if _, err = io.Copy(file, getDataReader("datafile-1-MB")); err != nil { - logError(testName, function, args, startTime, "", "File copy failed", err) - return - } - - // Close the file pro-actively for windows. - if err = file.Close(); err != nil { - logError(testName, function, args, startTime, "", "File close failed", err) - return - } - defer os.Remove(file.Name()) - fName = file.Name() - } - totalSize := dataFileMap["datafile-1-MB"] - - // Set base object name - objectName := bucketName + "FPutObjectWithContext" - args["objectName"] = objectName - - ctx, cancel := context.WithTimeout(context.Background(), 1*time.Nanosecond) - args["ctx"] = ctx - defer cancel() - - // Perform standard FPutObjectWithContext with contentType provided (Expecting application/octet-stream) - _, err = c.FPutObjectWithContext(ctx, bucketName, objectName+"-Shorttimeout", fName, minio.PutObjectOptions{ContentType: "application/octet-stream"}) - if err == nil { - logError(testName, function, args, startTime, "", "FPutObjectWithContext should fail on short timeout", err) - return - } - ctx, cancel = context.WithTimeout(context.Background(), 1*time.Hour) - defer cancel() - // Perform FPutObjectWithContext with a long timeout. Expect the put object to succeed - n, err := c.FPutObjectWithContext(ctx, bucketName, objectName+"-Longtimeout", fName, minio.PutObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "FPutObjectWithContext shouldn't fail on longer timeout", err) - return - } - if n != int64(totalSize) { - logError(testName, function, args, startTime, "", "Number of bytes does not match:wanted"+string(totalSize)+" got "+string(n), err) - return - } - - _, err = c.StatObject(bucketName, objectName+"-Longtimeout", minio.StatObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "StatObject failed", err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() - -} - -// Test validates putObject with context to see if request cancellation is honored. -func testPutObjectWithContext() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "PutObjectWithContext(ctx, bucketName, objectName, fileName, opts)" - args := map[string]interface{}{ - "ctx": "", - "bucketName": "", - "objectName": "", - "opts": "", - } - // Instantiate new minio client object. - c, err := minio.NewV4( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Make a new bucket. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket call failed", err) - return - } - bufSize := dataFileMap["datafile-33-kB"] - var reader = getDataReader("datafile-33-kB") - defer reader.Close() - objectName := fmt.Sprintf("test-file-%v", rand.Uint32()) - args["objectName"] = objectName - - ctx, cancel := context.WithTimeout(context.Background(), 1*time.Nanosecond) - args["ctx"] = ctx - args["opts"] = minio.PutObjectOptions{ContentType: "binary/octet-stream"} - defer cancel() - - _, err = c.PutObjectWithContext(ctx, bucketName, objectName, reader, int64(bufSize), minio.PutObjectOptions{ContentType: "binary/octet-stream"}) - if err == nil { - logError(testName, function, args, startTime, "", "PutObjectWithContext should fail on short timeout", err) - return - } - - ctx, cancel = context.WithTimeout(context.Background(), 1*time.Hour) - args["ctx"] = ctx - - defer cancel() - reader = getDataReader("datafile-33-kB") - defer reader.Close() - _, err = c.PutObjectWithContext(ctx, bucketName, objectName, reader, int64(bufSize), minio.PutObjectOptions{ContentType: "binary/octet-stream"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObjectWithContext with long timeout failed", err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() - -} - -// Tests get object ReaderSeeker interface methods. -func testGetObjectReadSeekFunctional() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "GetObject(bucketName, objectName)" - args := map[string]interface{}{} - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.New( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - defer func() { - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - }() - - // Generate 33K of data. - bufSize := dataFileMap["datafile-33-kB"] - var reader = getDataReader("datafile-33-kB") - defer reader.Close() - - objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "") - args["objectName"] = objectName - - buf, err := ioutil.ReadAll(reader) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAll failed", err) - return - } - - // Save the data - n, err := c.PutObject(bucketName, objectName, bytes.NewReader(buf), int64(len(buf)), minio.PutObjectOptions{ContentType: "binary/octet-stream"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - - if n != int64(bufSize) { - logError(testName, function, args, startTime, "", "Number of bytes does not match, expected "+string(int64(bufSize))+", got "+string(n), err) - return - } - - // Read the data back - r, err := c.GetObject(bucketName, objectName, minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "GetObject failed", err) - return - } - - st, err := r.Stat() - if err != nil { - logError(testName, function, args, startTime, "", "Stat object failed", err) - return - } - - if st.Size != int64(bufSize) { - logError(testName, function, args, startTime, "", "Number of bytes does not match, expected "+string(int64(bufSize))+", got "+string(st.Size), err) - return - } - - // This following function helps us to compare data from the reader after seek - // with the data from the original buffer - cmpData := func(r io.Reader, start, end int) { - if end-start == 0 { - return - } - buffer := bytes.NewBuffer([]byte{}) - if _, err := io.CopyN(buffer, r, int64(bufSize)); err != nil { - if err != io.EOF { - logError(testName, function, args, startTime, "", "CopyN failed", err) - return - } - } - if !bytes.Equal(buf[start:end], buffer.Bytes()) { - logError(testName, function, args, startTime, "", "Incorrect read bytes v/s original buffer", err) - return - } - } - - // Generic seek error for errors other than io.EOF - seekErr := errors.New("seek error") - - testCases := []struct { - offset int64 - whence int - pos int64 - err error - shouldCmp bool - start int - end int - }{ - // Start from offset 0, fetch data and compare - {0, 0, 0, nil, true, 0, 0}, - // Start from offset 2048, fetch data and compare - {2048, 0, 2048, nil, true, 2048, bufSize}, - // Start from offset larger than possible - {int64(bufSize) + 1024, 0, 0, seekErr, false, 0, 0}, - // Move to offset 0 without comparing - {0, 0, 0, nil, false, 0, 0}, - // Move one step forward and compare - {1, 1, 1, nil, true, 1, bufSize}, - // Move larger than possible - {int64(bufSize), 1, 0, seekErr, false, 0, 0}, - // Provide negative offset with CUR_SEEK - {int64(-1), 1, 0, seekErr, false, 0, 0}, - // Test with whence SEEK_END and with positive offset - {1024, 2, int64(bufSize) - 1024, io.EOF, true, 0, 0}, - // Test with whence SEEK_END and with negative offset - {-1024, 2, int64(bufSize) - 1024, nil, true, bufSize - 1024, bufSize}, - // Test with whence SEEK_END and with large negative offset - {-int64(bufSize) * 2, 2, 0, seekErr, true, 0, 0}, - } - - for i, testCase := range testCases { - // Perform seek operation - n, err := r.Seek(testCase.offset, testCase.whence) - // We expect an error - if testCase.err == seekErr && err == nil { - logError(testName, function, args, startTime, "", "Test "+string(i+1)+", unexpected err value: expected: "+testCase.err.Error()+", found: "+err.Error(), err) - return - } - // We expect a specific error - if testCase.err != seekErr && testCase.err != err { - logError(testName, function, args, startTime, "", "Test "+string(i+1)+", unexpected err value: expected: "+testCase.err.Error()+", found: "+err.Error(), err) - return - } - // If we expect an error go to the next loop - if testCase.err != nil { - continue - } - // Check the returned seek pos - if n != testCase.pos { - logError(testName, function, args, startTime, "", "Test "+string(i+1)+", number of bytes seeked does not match, expected "+string(testCase.pos)+", got "+string(n), err) - return - } - // Compare only if shouldCmp is activated - if testCase.shouldCmp { - cmpData(r, testCase.start, testCase.end) - } - } - successLogger(testName, function, args, startTime).Info() -} - -// Tests get object ReaderAt interface methods. -func testGetObjectReadAtFunctional() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "GetObject(bucketName, objectName)" - args := map[string]interface{}{} - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.New( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - // Generate 33K of data. - bufSize := dataFileMap["datafile-33-kB"] - var reader = getDataReader("datafile-33-kB") - defer reader.Close() - - objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "") - args["objectName"] = objectName - - buf, err := ioutil.ReadAll(reader) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAll failed", err) - return - } - - // Save the data - n, err := c.PutObject(bucketName, objectName, bytes.NewReader(buf), int64(len(buf)), minio.PutObjectOptions{ContentType: "binary/octet-stream"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - - if n != int64(bufSize) { - logError(testName, function, args, startTime, "", "Number of bytes does not match, expected "+string(int64(bufSize))+", got "+string(n), err) - return - } - - // read the data back - r, err := c.GetObject(bucketName, objectName, minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - offset := int64(2048) - - // read directly - buf1 := make([]byte, 512) - buf2 := make([]byte, 512) - buf3 := make([]byte, 512) - buf4 := make([]byte, 512) - - // Test readAt before stat is called such that objectInfo doesn't change. - m, err := r.ReadAt(buf1, offset) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAt failed", err) - return - } - if m != len(buf1) { - logError(testName, function, args, startTime, "", "ReadAt read shorter bytes before reaching EOF, expected "+string(len(buf1))+", got "+string(m), err) - return - } - if !bytes.Equal(buf1, buf[offset:offset+512]) { - logError(testName, function, args, startTime, "", "Incorrect read between two ReadAt from same offset", err) - return - } - offset += 512 - - st, err := r.Stat() - if err != nil { - logError(testName, function, args, startTime, "", "Stat failed", err) - return - } - - if st.Size != int64(bufSize) { - logError(testName, function, args, startTime, "", "Number of bytes in stat does not match, expected "+string(int64(bufSize))+", got "+string(st.Size), err) - return - } - - m, err = r.ReadAt(buf2, offset) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAt failed", err) - return - } - if m != len(buf2) { - logError(testName, function, args, startTime, "", "ReadAt read shorter bytes before reaching EOF, expected "+string(len(buf2))+", got "+string(m), err) - return - } - if !bytes.Equal(buf2, buf[offset:offset+512]) { - logError(testName, function, args, startTime, "", "Incorrect read between two ReadAt from same offset", err) - return - } - - offset += 512 - m, err = r.ReadAt(buf3, offset) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAt failed", err) - return - } - if m != len(buf3) { - logError(testName, function, args, startTime, "", "ReadAt read shorter bytes before reaching EOF, expected "+string(len(buf3))+", got "+string(m), err) - return - } - if !bytes.Equal(buf3, buf[offset:offset+512]) { - logError(testName, function, args, startTime, "", "Incorrect read between two ReadAt from same offset", err) - return - } - offset += 512 - m, err = r.ReadAt(buf4, offset) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAt failed", err) - return - } - if m != len(buf4) { - logError(testName, function, args, startTime, "", "ReadAt read shorter bytes before reaching EOF, expected "+string(len(buf4))+", got "+string(m), err) - return - } - if !bytes.Equal(buf4, buf[offset:offset+512]) { - logError(testName, function, args, startTime, "", "Incorrect read between two ReadAt from same offset", err) - return - } - - buf5 := make([]byte, n) - // Read the whole object. - m, err = r.ReadAt(buf5, 0) - if err != nil { - if err != io.EOF { - logError(testName, function, args, startTime, "", "ReadAt failed", err) - return - } - } - if m != len(buf5) { - logError(testName, function, args, startTime, "", "ReadAt read shorter bytes before reaching EOF, expected "+string(len(buf5))+", got "+string(m), err) - return - } - if !bytes.Equal(buf, buf5) { - logError(testName, function, args, startTime, "", "Incorrect data read in GetObject, than what was previously uploaded", err) - return - } - - buf6 := make([]byte, n+1) - // Read the whole object and beyond. - _, err = r.ReadAt(buf6, 0) - if err != nil { - if err != io.EOF { - logError(testName, function, args, startTime, "", "ReadAt failed", err) - return - } - } - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - successLogger(testName, function, args, startTime).Info() -} - -// Test Presigned Post Policy -func testPresignedPostPolicy() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "PresignedPostPolicy(policy)" - args := map[string]interface{}{ - "policy": "", - } - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object - c, err := minio.NewV4( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - - // Make a new bucket in 'us-east-1' (source bucket). - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - // Generate 33K of data. - bufSize := dataFileMap["datafile-33-kB"] - var reader = getDataReader("datafile-33-kB") - defer reader.Close() - - objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "") - metadataKey := randString(60, rand.NewSource(time.Now().UnixNano()), "") - metadataValue := randString(60, rand.NewSource(time.Now().UnixNano()), "") - - buf, err := ioutil.ReadAll(reader) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAll failed", err) - return - } - - // Save the data - n, err := c.PutObject(bucketName, objectName, bytes.NewReader(buf), int64(len(buf)), minio.PutObjectOptions{ContentType: "binary/octet-stream"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - - if n != int64(bufSize) { - logError(testName, function, args, startTime, "", "Number of bytes does not match, expected "+string(int64(bufSize))+" got "+string(n), err) - return - } - - policy := minio.NewPostPolicy() - - if err := policy.SetBucket(""); err == nil { - logError(testName, function, args, startTime, "", "SetBucket did not fail for invalid conditions", err) - return - } - if err := policy.SetKey(""); err == nil { - logError(testName, function, args, startTime, "", "SetKey did not fail for invalid conditions", err) - return - } - if err := policy.SetKeyStartsWith(""); err == nil { - logError(testName, function, args, startTime, "", "SetKeyStartsWith did not fail for invalid conditions", err) - return - } - if err := policy.SetExpires(time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC)); err == nil { - logError(testName, function, args, startTime, "", "SetExpires did not fail for invalid conditions", err) - return - } - if err := policy.SetContentType(""); err == nil { - logError(testName, function, args, startTime, "", "SetContentType did not fail for invalid conditions", err) - return - } - if err := policy.SetContentLengthRange(1024*1024, 1024); err == nil { - logError(testName, function, args, startTime, "", "SetContentLengthRange did not fail for invalid conditions", err) - return - } - if err := policy.SetUserMetadata("", ""); err == nil { - logError(testName, function, args, startTime, "", "SetUserMetadata did not fail for invalid conditions", err) - return - } - - policy.SetBucket(bucketName) - policy.SetKey(objectName) - policy.SetExpires(time.Now().UTC().AddDate(0, 0, 10)) // expires in 10 days - policy.SetContentType("binary/octet-stream") - policy.SetContentLengthRange(10, 1024*1024) - policy.SetUserMetadata(metadataKey, metadataValue) - args["policy"] = policy.String() - - presignedPostPolicyURL, formData, err := c.PresignedPostPolicy(policy) - if err != nil { - logError(testName, function, args, startTime, "", "PresignedPostPolicy failed", err) - return - } - - var formBuf bytes.Buffer - writer := multipart.NewWriter(&formBuf) - for k, v := range formData { - writer.WriteField(k, v) - } - - // Get a 33KB file to upload and test if set post policy works - var filePath = getMintDataDirFilePath("datafile-33-kB") - if filePath == "" { - // Make a temp file with 33 KB data. - file, err := ioutil.TempFile(os.TempDir(), "PresignedPostPolicyTest") - if err != nil { - logError(testName, function, args, startTime, "", "TempFile creation failed", err) - return - } - if _, err = io.Copy(file, getDataReader("datafile-33-kB")); err != nil { - logError(testName, function, args, startTime, "", "Copy failed", err) - return - } - if err = file.Close(); err != nil { - logError(testName, function, args, startTime, "", "File Close failed", err) - return - } - filePath = file.Name() - } - - // add file to post request - f, err := os.Open(filePath) - defer f.Close() - if err != nil { - logError(testName, function, args, startTime, "", "File open failed", err) - return - } - w, err := writer.CreateFormFile("file", filePath) - if err != nil { - logError(testName, function, args, startTime, "", "CreateFormFile failed", err) - return - } - - _, err = io.Copy(w, f) - if err != nil { - logError(testName, function, args, startTime, "", "Copy failed", err) - return - } - writer.Close() - - // make post request with correct form data - res, err := http.Post(presignedPostPolicyURL.String(), writer.FormDataContentType(), bytes.NewReader(formBuf.Bytes())) - if err != nil { - logError(testName, function, args, startTime, "", "Http request failed", err) - return - } - defer res.Body.Close() - if res.StatusCode != http.StatusNoContent { - logError(testName, function, args, startTime, "", "Http request failed", errors.New(res.Status)) - return - } - - // expected path should be absolute path of the object - var scheme string - if mustParseBool(os.Getenv(enableHTTPS)) { - scheme = "https://" - } else { - scheme = "http://" - } - - expectedLocation := scheme + os.Getenv(serverEndpoint) + "/" + bucketName + "/" + objectName - expectedLocationBucketDNS := scheme + bucketName + "." + os.Getenv(serverEndpoint) + "/" + objectName - - if val, ok := res.Header["Location"]; ok { - if val[0] != expectedLocation && val[0] != expectedLocationBucketDNS { - logError(testName, function, args, startTime, "", "Location in header response is incorrect", err) - return - } - } else { - logError(testName, function, args, startTime, "", "Location not found in header response", err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -// Tests copy object -func testCopyObject() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "CopyObject(dst, src)" - args := map[string]interface{}{} - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object - c, err := minio.NewV4( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - - // Make a new bucket in 'us-east-1' (source bucket). - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - // Make a new bucket in 'us-east-1' (destination bucket). - err = c.MakeBucket(bucketName+"-copy", "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - // Generate 33K of data. - bufSize := dataFileMap["datafile-33-kB"] - var reader = getDataReader("datafile-33-kB") - - // Save the data - objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "") - n, err := c.PutObject(bucketName, objectName, reader, int64(bufSize), minio.PutObjectOptions{ContentType: "binary/octet-stream"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - - if n != int64(bufSize) { - logError(testName, function, args, startTime, "", "Number of bytes does not match, expected "+string(int64(bufSize))+", got "+string(n), err) - return - } - - r, err := c.GetObject(bucketName, objectName, minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "GetObject failed", err) - return - } - // Check the various fields of source object against destination object. - objInfo, err := r.Stat() - if err != nil { - logError(testName, function, args, startTime, "", "Stat failed", err) - return - } - - // Copy Source - src := minio.NewSourceInfo(bucketName, objectName, nil) - args["src"] = src - - // Set copy conditions. - - // All invalid conditions first. - err = src.SetModifiedSinceCond(time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC)) - if err == nil { - logError(testName, function, args, startTime, "", "SetModifiedSinceCond did not fail for invalid conditions", err) - return - } - err = src.SetUnmodifiedSinceCond(time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC)) - if err == nil { - logError(testName, function, args, startTime, "", "SetUnmodifiedSinceCond did not fail for invalid conditions", err) - return - } - err = src.SetMatchETagCond("") - if err == nil { - logError(testName, function, args, startTime, "", "SetMatchETagCond did not fail for invalid conditions", err) - return - } - err = src.SetMatchETagExceptCond("") - if err == nil { - logError(testName, function, args, startTime, "", "SetMatchETagExceptCond did not fail for invalid conditions", err) - return - } - - err = src.SetModifiedSinceCond(time.Date(2014, time.April, 0, 0, 0, 0, 0, time.UTC)) - if err != nil { - logError(testName, function, args, startTime, "", "SetModifiedSinceCond failed", err) - return - } - err = src.SetMatchETagCond(objInfo.ETag) - if err != nil { - logError(testName, function, args, startTime, "", "SetMatchETagCond failed", err) - return - } - - dst, err := minio.NewDestinationInfo(bucketName+"-copy", objectName+"-copy", nil, nil) - args["dst"] = dst - if err != nil { - logError(testName, function, args, startTime, "", "NewDestinationInfo failed", err) - return - } - - // Perform the Copy - err = c.CopyObject(dst, src) - if err != nil { - logError(testName, function, args, startTime, "", "CopyObject failed", err) - return - } - - // Source object - r, err = c.GetObject(bucketName, objectName, minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "GetObject failed", err) - return - } - - // Destination object - readerCopy, err := c.GetObject(bucketName+"-copy", objectName+"-copy", minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "GetObject failed", err) - return - } - // Check the various fields of source object against destination object. - objInfo, err = r.Stat() - if err != nil { - logError(testName, function, args, startTime, "", "Stat failed", err) - return - } - objInfoCopy, err := readerCopy.Stat() - if err != nil { - logError(testName, function, args, startTime, "", "Stat failed", err) - return - } - if objInfo.Size != objInfoCopy.Size { - logError(testName, function, args, startTime, "", "Number of bytes does not match, expected "+string(objInfoCopy.Size)+", got "+string(objInfo.Size), err) - return - } - - // Close all the get readers before proceeding with CopyObject operations. - r.Close() - readerCopy.Close() - - // CopyObject again but with wrong conditions - src = minio.NewSourceInfo(bucketName, objectName, nil) - err = src.SetUnmodifiedSinceCond(time.Date(2014, time.April, 0, 0, 0, 0, 0, time.UTC)) - if err != nil { - logError(testName, function, args, startTime, "", "SetUnmodifiedSinceCond failed", err) - return - } - err = src.SetMatchETagExceptCond(objInfo.ETag) - if err != nil { - logError(testName, function, args, startTime, "", "SetMatchETagExceptCond failed", err) - return - } - - // Perform the Copy which should fail - err = c.CopyObject(dst, src) - if err == nil { - logError(testName, function, args, startTime, "", "CopyObject did not fail for invalid conditions", err) - return - } - - // Perform the Copy which should update only metadata. - src = minio.NewSourceInfo(bucketName, objectName, nil) - dst, err = minio.NewDestinationInfo(bucketName, objectName, nil, map[string]string{ - "Copy": "should be same", - }) - args["dst"] = dst - args["src"] = src - if err != nil { - logError(testName, function, args, startTime, "", "NewDestinationInfo failed", err) - return - } - - err = c.CopyObject(dst, src) - if err != nil { - logError(testName, function, args, startTime, "", "CopyObject shouldn't fail", err) - return - } - - oi, err := c.StatObject(bucketName, objectName, minio.StatObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "StatObject failed", err) - return - } - - stOpts := minio.StatObjectOptions{} - stOpts.SetMatchETag(oi.ETag) - objInfo, err = c.StatObject(bucketName, objectName, stOpts) - if err != nil { - logError(testName, function, args, startTime, "", "CopyObject ETag should match and not fail", err) - return - } - - if objInfo.Metadata.Get("x-amz-meta-copy") != "should be same" { - logError(testName, function, args, startTime, "", "CopyObject modified metadata should match", err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - if err = cleanupBucket(bucketName+"-copy", c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - successLogger(testName, function, args, startTime).Info() -} - -// Tests SSE-C get object ReaderSeeker interface methods. -func testEncryptedGetObjectReadSeekFunctional() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "GetObject(bucketName, objectName)" - args := map[string]interface{}{} - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.New( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - defer func() { - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - }() - - // Generate 65MiB of data. - bufSize := dataFileMap["datafile-65-MB"] - var reader = getDataReader("datafile-65-MB") - defer reader.Close() - - objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "") - args["objectName"] = objectName - - buf, err := ioutil.ReadAll(reader) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAll failed", err) - return - } - - // Save the data - n, err := c.PutObject(bucketName, objectName, bytes.NewReader(buf), int64(len(buf)), minio.PutObjectOptions{ - ContentType: "binary/octet-stream", - ServerSideEncryption: encrypt.DefaultPBKDF([]byte("correct horse battery staple"), []byte(bucketName+objectName)), - }) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - - if n != int64(bufSize) { - logError(testName, function, args, startTime, "", "Number of bytes does not match, expected "+string(int64(bufSize))+", got "+string(n), err) - return - } - - // Read the data back - r, err := c.GetObject(bucketName, objectName, minio.GetObjectOptions{ - ServerSideEncryption: encrypt.DefaultPBKDF([]byte("correct horse battery staple"), []byte(bucketName+objectName)), - }) - if err != nil { - logError(testName, function, args, startTime, "", "GetObject failed", err) - return - } - defer r.Close() - - st, err := r.Stat() - if err != nil { - logError(testName, function, args, startTime, "", "Stat object failed", err) - return - } - - if st.Size != int64(bufSize) { - logError(testName, function, args, startTime, "", "Number of bytes does not match, expected "+string(int64(bufSize))+", got "+string(st.Size), err) - return - } - - // This following function helps us to compare data from the reader after seek - // with the data from the original buffer - cmpData := func(r io.Reader, start, end int) { - if end-start == 0 { - return - } - buffer := bytes.NewBuffer([]byte{}) - if _, err := io.CopyN(buffer, r, int64(bufSize)); err != nil { - if err != io.EOF { - logError(testName, function, args, startTime, "", "CopyN failed", err) - return - } - } - if !bytes.Equal(buf[start:end], buffer.Bytes()) { - logError(testName, function, args, startTime, "", "Incorrect read bytes v/s original buffer", err) - return - } - } - - testCases := []struct { - offset int64 - whence int - pos int64 - err error - shouldCmp bool - start int - end int - }{ - // Start from offset 0, fetch data and compare - {0, 0, 0, nil, true, 0, 0}, - // Start from offset 2048, fetch data and compare - {2048, 0, 2048, nil, true, 2048, bufSize}, - // Start from offset larger than possible - {int64(bufSize) + 1024, 0, 0, io.EOF, false, 0, 0}, - // Move to offset 0 without comparing - {0, 0, 0, nil, false, 0, 0}, - // Move one step forward and compare - {1, 1, 1, nil, true, 1, bufSize}, - // Move larger than possible - {int64(bufSize), 1, 0, io.EOF, false, 0, 0}, - // Provide negative offset with CUR_SEEK - {int64(-1), 1, 0, fmt.Errorf("Negative position not allowed for 1"), false, 0, 0}, - // Test with whence SEEK_END and with positive offset - {1024, 2, 0, io.EOF, false, 0, 0}, - // Test with whence SEEK_END and with negative offset - {-1024, 2, int64(bufSize) - 1024, nil, true, bufSize - 1024, bufSize}, - // Test with whence SEEK_END and with large negative offset - {-int64(bufSize) * 2, 2, 0, fmt.Errorf("Seeking at negative offset not allowed for 2"), false, 0, 0}, - // Test with invalid whence - {0, 3, 0, fmt.Errorf("Invalid whence 3"), false, 0, 0}, - } - - for i, testCase := range testCases { - // Perform seek operation - n, err := r.Seek(testCase.offset, testCase.whence) - if err != nil && testCase.err == nil { - // We expected success. - logError(testName, function, args, startTime, "", - fmt.Sprintf("Test %d, unexpected err value: expected: %s, found: %s", i+1, testCase.err, err), err) - return - } - if err == nil && testCase.err != nil { - // We expected failure, but got success. - logError(testName, function, args, startTime, "", - fmt.Sprintf("Test %d, unexpected err value: expected: %s, found: %s", i+1, testCase.err, err), err) - return - } - if err != nil && testCase.err != nil { - if err.Error() != testCase.err.Error() { - // We expect a specific error - logError(testName, function, args, startTime, "", - fmt.Sprintf("Test %d, unexpected err value: expected: %s, found: %s", i+1, testCase.err, err), err) - return - } - } - // Check the returned seek pos - if n != testCase.pos { - logError(testName, function, args, startTime, "", - fmt.Sprintf("Test %d, number of bytes seeked does not match, expected %d, got %d", i+1, testCase.pos, n), err) - return - } - // Compare only if shouldCmp is activated - if testCase.shouldCmp { - cmpData(r, testCase.start, testCase.end) - } - } - - successLogger(testName, function, args, startTime).Info() -} - -// Tests SSE-C get object ReaderAt interface methods. -func testEncryptedGetObjectReadAtFunctional() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "GetObject(bucketName, objectName)" - args := map[string]interface{}{} - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.New( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - // Generate 65MiB of data. - bufSize := dataFileMap["datafile-65-MB"] - var reader = getDataReader("datafile-65-MB") - defer reader.Close() - - objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "") - args["objectName"] = objectName - - buf, err := ioutil.ReadAll(reader) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAll failed", err) - return - } - - // Save the data - n, err := c.PutObject(bucketName, objectName, bytes.NewReader(buf), int64(len(buf)), minio.PutObjectOptions{ - ContentType: "binary/octet-stream", - ServerSideEncryption: encrypt.DefaultPBKDF([]byte("correct horse battery staple"), []byte(bucketName+objectName)), - }) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - - if n != int64(bufSize) { - logError(testName, function, args, startTime, "", "Number of bytes does not match, expected "+string(int64(bufSize))+", got "+string(n), err) - return - } - - // read the data back - r, err := c.GetObject(bucketName, objectName, minio.GetObjectOptions{ - ServerSideEncryption: encrypt.DefaultPBKDF([]byte("correct horse battery staple"), []byte(bucketName+objectName)), - }) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - defer r.Close() - - offset := int64(2048) - - // read directly - buf1 := make([]byte, 512) - buf2 := make([]byte, 512) - buf3 := make([]byte, 512) - buf4 := make([]byte, 512) - - // Test readAt before stat is called such that objectInfo doesn't change. - m, err := r.ReadAt(buf1, offset) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAt failed", err) - return - } - if m != len(buf1) { - logError(testName, function, args, startTime, "", "ReadAt read shorter bytes before reaching EOF, expected "+string(len(buf1))+", got "+string(m), err) - return - } - if !bytes.Equal(buf1, buf[offset:offset+512]) { - logError(testName, function, args, startTime, "", "Incorrect read between two ReadAt from same offset", err) - return - } - offset += 512 - - st, err := r.Stat() - if err != nil { - logError(testName, function, args, startTime, "", "Stat failed", err) - return - } - - if st.Size != int64(bufSize) { - logError(testName, function, args, startTime, "", "Number of bytes in stat does not match, expected "+string(int64(bufSize))+", got "+string(st.Size), err) - return - } - - m, err = r.ReadAt(buf2, offset) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAt failed", err) - return - } - if m != len(buf2) { - logError(testName, function, args, startTime, "", "ReadAt read shorter bytes before reaching EOF, expected "+string(len(buf2))+", got "+string(m), err) - return - } - if !bytes.Equal(buf2, buf[offset:offset+512]) { - logError(testName, function, args, startTime, "", "Incorrect read between two ReadAt from same offset", err) - return - } - offset += 512 - m, err = r.ReadAt(buf3, offset) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAt failed", err) - return - } - if m != len(buf3) { - logError(testName, function, args, startTime, "", "ReadAt read shorter bytes before reaching EOF, expected "+string(len(buf3))+", got "+string(m), err) - return - } - if !bytes.Equal(buf3, buf[offset:offset+512]) { - logError(testName, function, args, startTime, "", "Incorrect read between two ReadAt from same offset", err) - return - } - offset += 512 - m, err = r.ReadAt(buf4, offset) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAt failed", err) - return - } - if m != len(buf4) { - logError(testName, function, args, startTime, "", "ReadAt read shorter bytes before reaching EOF, expected "+string(len(buf4))+", got "+string(m), err) - return - } - if !bytes.Equal(buf4, buf[offset:offset+512]) { - logError(testName, function, args, startTime, "", "Incorrect read between two ReadAt from same offset", err) - return - } - - buf5 := make([]byte, n) - // Read the whole object. - m, err = r.ReadAt(buf5, 0) - if err != nil { - if err != io.EOF { - logError(testName, function, args, startTime, "", "ReadAt failed", err) - return - } - } - if m != len(buf5) { - logError(testName, function, args, startTime, "", "ReadAt read shorter bytes before reaching EOF, expected "+string(len(buf5))+", got "+string(m), err) - return - } - if !bytes.Equal(buf, buf5) { - logError(testName, function, args, startTime, "", "Incorrect data read in GetObject, than what was previously uploaded", err) - return - } - - buf6 := make([]byte, n+1) - // Read the whole object and beyond. - _, err = r.ReadAt(buf6, 0) - if err != nil { - if err != io.EOF { - logError(testName, function, args, startTime, "", "ReadAt failed", err) - return - } - } - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - successLogger(testName, function, args, startTime).Info() -} - -// TestEncryptionPutGet tests client side encryption -func testEncryptionPutGet() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "PutEncryptedObject(bucketName, objectName, reader, sse)" - args := map[string]interface{}{ - "bucketName": "", - "objectName": "", - "sse": "", - } - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object - c, err := minio.NewV4( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - testCases := []struct { - buf []byte - }{ - {buf: bytes.Repeat([]byte("F"), 1)}, - {buf: bytes.Repeat([]byte("F"), 15)}, - {buf: bytes.Repeat([]byte("F"), 16)}, - {buf: bytes.Repeat([]byte("F"), 17)}, - {buf: bytes.Repeat([]byte("F"), 31)}, - {buf: bytes.Repeat([]byte("F"), 32)}, - {buf: bytes.Repeat([]byte("F"), 33)}, - {buf: bytes.Repeat([]byte("F"), 1024)}, - {buf: bytes.Repeat([]byte("F"), 1024*2)}, - {buf: bytes.Repeat([]byte("F"), 1024*1024)}, - } - - const password = "correct horse battery staple" // https://xkcd.com/936/ - - for i, testCase := range testCases { - // Generate a random object name - objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "") - args["objectName"] = objectName - - // Secured object - sse := encrypt.DefaultPBKDF([]byte(password), []byte(bucketName+objectName)) - args["sse"] = sse - - // Put encrypted data - _, err = c.PutObject(bucketName, objectName, bytes.NewReader(testCase.buf), int64(len(testCase.buf)), minio.PutObjectOptions{ServerSideEncryption: sse}) - if err != nil { - logError(testName, function, args, startTime, "", "PutEncryptedObject failed", err) - return - } - - // Read the data back - r, err := c.GetObject(bucketName, objectName, minio.GetObjectOptions{ServerSideEncryption: sse}) - if err != nil { - logError(testName, function, args, startTime, "", "GetEncryptedObject failed", err) - return - } - defer r.Close() - - // Compare the sent object with the received one - recvBuffer := bytes.NewBuffer([]byte{}) - if _, err = io.Copy(recvBuffer, r); err != nil { - logError(testName, function, args, startTime, "", "Test "+string(i+1)+", error: "+err.Error(), err) - return - } - if recvBuffer.Len() != len(testCase.buf) { - logError(testName, function, args, startTime, "", "Test "+string(i+1)+", Number of bytes of received object does not match, expected "+string(len(testCase.buf))+", got "+string(recvBuffer.Len()), err) - return - } - if !bytes.Equal(testCase.buf, recvBuffer.Bytes()) { - logError(testName, function, args, startTime, "", "Test "+string(i+1)+", Encrypted sent is not equal to decrypted, expected "+string(testCase.buf)+", got "+string(recvBuffer.Bytes()), err) - return - } - - successLogger(testName, function, args, startTime).Info() - - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -// TestEncryptionFPut tests client side encryption -func testEncryptionFPut() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "FPutEncryptedObject(bucketName, objectName, filePath, contentType, sse)" - args := map[string]interface{}{ - "bucketName": "", - "objectName": "", - "filePath": "", - "contentType": "", - "sse": "", - } - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object - c, err := minio.NewV4( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - // Object custom metadata - customContentType := "custom/contenttype" - args["metadata"] = customContentType - - testCases := []struct { - buf []byte - }{ - {buf: bytes.Repeat([]byte("F"), 0)}, - {buf: bytes.Repeat([]byte("F"), 1)}, - {buf: bytes.Repeat([]byte("F"), 15)}, - {buf: bytes.Repeat([]byte("F"), 16)}, - {buf: bytes.Repeat([]byte("F"), 17)}, - {buf: bytes.Repeat([]byte("F"), 31)}, - {buf: bytes.Repeat([]byte("F"), 32)}, - {buf: bytes.Repeat([]byte("F"), 33)}, - {buf: bytes.Repeat([]byte("F"), 1024)}, - {buf: bytes.Repeat([]byte("F"), 1024*2)}, - {buf: bytes.Repeat([]byte("F"), 1024*1024)}, - } - - const password = "correct horse battery staple" // https://xkcd.com/936/ - for i, testCase := range testCases { - // Generate a random object name - objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "") - args["objectName"] = objectName - - // Secured object - sse := encrypt.DefaultPBKDF([]byte(password), []byte(bucketName+objectName)) - args["sse"] = sse - - // Generate a random file name. - fileName := randString(60, rand.NewSource(time.Now().UnixNano()), "") - file, err := os.Create(fileName) - if err != nil { - logError(testName, function, args, startTime, "", "file create failed", err) - return - } - _, err = file.Write(testCase.buf) - if err != nil { - logError(testName, function, args, startTime, "", "file write failed", err) - return - } - file.Close() - // Put encrypted data - if _, err = c.FPutObject(bucketName, objectName, fileName, minio.PutObjectOptions{ServerSideEncryption: sse}); err != nil { - logError(testName, function, args, startTime, "", "FPutEncryptedObject failed", err) - return - } - - // Read the data back - r, err := c.GetObject(bucketName, objectName, minio.GetObjectOptions{ServerSideEncryption: sse}) - if err != nil { - logError(testName, function, args, startTime, "", "GetEncryptedObject failed", err) - return - } - defer r.Close() - - // Compare the sent object with the received one - recvBuffer := bytes.NewBuffer([]byte{}) - if _, err = io.Copy(recvBuffer, r); err != nil { - logError(testName, function, args, startTime, "", "Test "+string(i+1)+", error: "+err.Error(), err) - return - } - if recvBuffer.Len() != len(testCase.buf) { - logError(testName, function, args, startTime, "", "Test "+string(i+1)+", Number of bytes of received object does not match, expected "+string(len(testCase.buf))+", got "+string(recvBuffer.Len()), err) - return - } - if !bytes.Equal(testCase.buf, recvBuffer.Bytes()) { - logError(testName, function, args, startTime, "", "Test "+string(i+1)+", Encrypted sent is not equal to decrypted, expected "+string(testCase.buf)+", got "+string(recvBuffer.Bytes()), err) - return - } - - if err = os.Remove(fileName); err != nil { - logError(testName, function, args, startTime, "", "File remove failed", err) - return - } - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -func testBucketNotification() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "SetBucketNotification(bucketName)" - args := map[string]interface{}{ - "bucketName": "", - } - - if os.Getenv("NOTIFY_BUCKET") == "" || - os.Getenv("NOTIFY_SERVICE") == "" || - os.Getenv("NOTIFY_REGION") == "" || - os.Getenv("NOTIFY_ACCOUNTID") == "" || - os.Getenv("NOTIFY_RESOURCE") == "" { - ignoredLog(testName, function, args, startTime, "Skipped notification test as it is not configured").Info() - return - } - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - c, err := minio.New( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client object creation failed", err) - return - } - - // Enable to debug - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - bucketName := os.Getenv("NOTIFY_BUCKET") - args["bucketName"] = bucketName - - topicArn := minio.NewArn("aws", os.Getenv("NOTIFY_SERVICE"), os.Getenv("NOTIFY_REGION"), os.Getenv("NOTIFY_ACCOUNTID"), os.Getenv("NOTIFY_RESOURCE")) - queueArn := minio.NewArn("aws", "dummy-service", "dummy-region", "dummy-accountid", "dummy-resource") - - topicConfig := minio.NewNotificationConfig(topicArn) - - topicConfig.AddEvents(minio.ObjectCreatedAll, minio.ObjectRemovedAll) - topicConfig.AddFilterSuffix("jpg") - - queueConfig := minio.NewNotificationConfig(queueArn) - queueConfig.AddEvents(minio.ObjectCreatedAll) - queueConfig.AddFilterPrefix("photos/") - - bNotification := minio.BucketNotification{} - bNotification.AddTopic(topicConfig) - - // Add the same topicConfig again, should have no effect - // because it is duplicated - bNotification.AddTopic(topicConfig) - if len(bNotification.TopicConfigs) != 1 { - logError(testName, function, args, startTime, "", "Duplicate entry added", err) - return - } - - // Add and remove a queue config - bNotification.AddQueue(queueConfig) - bNotification.RemoveQueueByArn(queueArn) - - err = c.SetBucketNotification(bucketName, bNotification) - if err != nil { - logError(testName, function, args, startTime, "", "SetBucketNotification failed", err) - return - } - - bNotification, err = c.GetBucketNotification(bucketName) - if err != nil { - logError(testName, function, args, startTime, "", "GetBucketNotification failed", err) - return - } - - if len(bNotification.TopicConfigs) != 1 { - logError(testName, function, args, startTime, "", "Topic config is empty", err) - return - } - - if bNotification.TopicConfigs[0].Filter.S3Key.FilterRules[0].Value != "jpg" { - logError(testName, function, args, startTime, "", "Couldn't get the suffix", err) - return - } - - err = c.RemoveAllBucketNotification(bucketName) - if err != nil { - logError(testName, function, args, startTime, "", "RemoveAllBucketNotification failed", err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -// Tests comprehensive list of all methods. -func testFunctional() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "testFunctional()" - functionAll := "" - args := map[string]interface{}{} - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - c, err := minio.New( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, nil, startTime, "", "Minio client object creation failed", err) - return - } - - // Enable to debug - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - - // Make a new bucket. - function = "MakeBucket(bucketName, region)" - functionAll = "MakeBucket(bucketName, region)" - args["bucketName"] = bucketName - err = c.MakeBucket(bucketName, "us-east-1") - - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - // Generate a random file name. - fileName := randString(60, rand.NewSource(time.Now().UnixNano()), "") - file, err := os.Create(fileName) - if err != nil { - logError(testName, function, args, startTime, "", "File creation failed", err) - return - } - for i := 0; i < 3; i++ { - buf := make([]byte, rand.Intn(1<<19)) - _, err = file.Write(buf) - if err != nil { - logError(testName, function, args, startTime, "", "File write failed", err) - return - } - } - file.Close() - - // Verify if bucket exits and you have access. - var exists bool - function = "BucketExists(bucketName)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - } - exists, err = c.BucketExists(bucketName) - - if err != nil { - logError(testName, function, args, startTime, "", "BucketExists failed", err) - return - } - if !exists { - logError(testName, function, args, startTime, "", "Could not find the bucket", err) - return - } - - // Asserting the default bucket policy. - function = "GetBucketPolicy(bucketName)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - } - nilPolicy, err := c.GetBucketPolicy(bucketName) - if err != nil { - logError(testName, function, args, startTime, "", "GetBucketPolicy failed", err) - return - } - if nilPolicy != "" { - logError(testName, function, args, startTime, "", "policy should be set to nil", err) - return - } - - // Set the bucket policy to 'public readonly'. - function = "SetBucketPolicy(bucketName, readOnlyPolicy)" - functionAll += ", " + function - - readOnlyPolicy := `{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"AWS":["*"]},"Action":["s3:ListBucket"],"Resource":["arn:aws:s3:::` + bucketName + `"]}]}` - args = map[string]interface{}{ - "bucketName": bucketName, - "bucketPolicy": readOnlyPolicy, - } - - err = c.SetBucketPolicy(bucketName, readOnlyPolicy) - if err != nil { - logError(testName, function, args, startTime, "", "SetBucketPolicy failed", err) - return - } - // should return policy `readonly`. - function = "GetBucketPolicy(bucketName)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - } - _, err = c.GetBucketPolicy(bucketName) - if err != nil { - logError(testName, function, args, startTime, "", "GetBucketPolicy failed", err) - return - } - - // Make the bucket 'public writeonly'. - function = "SetBucketPolicy(bucketName, writeOnlyPolicy)" - functionAll += ", " + function - - writeOnlyPolicy := `{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"AWS":["*"]},"Action":["s3:ListBucketMultipartUploads"],"Resource":["arn:aws:s3:::` + bucketName + `"]}]}` - args = map[string]interface{}{ - "bucketName": bucketName, - "bucketPolicy": writeOnlyPolicy, - } - err = c.SetBucketPolicy(bucketName, writeOnlyPolicy) - - if err != nil { - logError(testName, function, args, startTime, "", "SetBucketPolicy failed", err) - return - } - // should return policy `writeonly`. - function = "GetBucketPolicy(bucketName)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - } - - _, err = c.GetBucketPolicy(bucketName) - if err != nil { - logError(testName, function, args, startTime, "", "GetBucketPolicy failed", err) - return - } - - // Make the bucket 'public read/write'. - function = "SetBucketPolicy(bucketName, readWritePolicy)" - functionAll += ", " + function - - readWritePolicy := `{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"AWS":["*"]},"Action":["s3:ListBucket","s3:ListBucketMultipartUploads"],"Resource":["arn:aws:s3:::` + bucketName + `"]}]}` - - args = map[string]interface{}{ - "bucketName": bucketName, - "bucketPolicy": readWritePolicy, - } - err = c.SetBucketPolicy(bucketName, readWritePolicy) - - if err != nil { - logError(testName, function, args, startTime, "", "SetBucketPolicy failed", err) - return - } - // should return policy `readwrite`. - function = "GetBucketPolicy(bucketName)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - } - _, err = c.GetBucketPolicy(bucketName) - if err != nil { - logError(testName, function, args, startTime, "", "GetBucketPolicy failed", err) - return - } - - // List all buckets. - function = "ListBuckets()" - functionAll += ", " + function - args = nil - buckets, err := c.ListBuckets() - - if len(buckets) == 0 { - logError(testName, function, args, startTime, "", "Found bucket list to be empty", err) - return - } - if err != nil { - logError(testName, function, args, startTime, "", "ListBuckets failed", err) - return - } - - // Verify if previously created bucket is listed in list buckets. - bucketFound := false - for _, bucket := range buckets { - if bucket.Name == bucketName { - bucketFound = true - } - } - - // If bucket not found error out. - if !bucketFound { - logError(testName, function, args, startTime, "", "Bucket: "+bucketName+" not found", err) - return - } - - objectName := bucketName + "unique" - - // Generate data - buf := bytes.Repeat([]byte("f"), 1<<19) - - function = "PutObject(bucketName, objectName, reader, contentType)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - "objectName": objectName, - "contentType": "", - } - - n, err := c.PutObject(bucketName, objectName, bytes.NewReader(buf), int64(len(buf)), minio.PutObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - - if n != int64(len(buf)) { - logError(testName, function, args, startTime, "", "Length doesn't match, expected "+string(int64(len(buf)))+" got "+string(n), err) - return - } - - args = map[string]interface{}{ - "bucketName": bucketName, - "objectName": objectName + "-nolength", - "contentType": "binary/octet-stream", - } - - n, err = c.PutObject(bucketName, objectName+"-nolength", bytes.NewReader(buf), int64(len(buf)), minio.PutObjectOptions{ContentType: "binary/octet-stream"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - - if n != int64(len(buf)) { - logError(testName, function, args, startTime, "", "Length doesn't match, expected "+string(int64(len(buf)))+" got "+string(n), err) - return - } - - // Instantiate a done channel to close all listing. - doneCh := make(chan struct{}) - defer close(doneCh) - - objFound := false - isRecursive := true // Recursive is true. - - function = "ListObjects(bucketName, objectName, isRecursive, doneCh)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - "objectName": objectName, - "isRecursive": isRecursive, - } - - for obj := range c.ListObjects(bucketName, objectName, isRecursive, doneCh) { - if obj.Key == objectName { - objFound = true - break - } - } - if !objFound { - logError(testName, function, args, startTime, "", "Object "+objectName+" not found", err) - return - } - - objFound = false - isRecursive = true // Recursive is true. - function = "ListObjectsV2(bucketName, objectName, isRecursive, doneCh)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - "objectName": objectName, - "isRecursive": isRecursive, - } - - for obj := range c.ListObjectsV2(bucketName, objectName, isRecursive, doneCh) { - if obj.Key == objectName { - objFound = true - break - } - } - if !objFound { - logError(testName, function, args, startTime, "", "Object "+objectName+" not found", err) - return - } - - incompObjNotFound := true - - function = "ListIncompleteUploads(bucketName, objectName, isRecursive, doneCh)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - "objectName": objectName, - "isRecursive": isRecursive, - } - - for objIncompl := range c.ListIncompleteUploads(bucketName, objectName, isRecursive, doneCh) { - if objIncompl.Key != "" { - incompObjNotFound = false - break - } - } - if !incompObjNotFound { - logError(testName, function, args, startTime, "", "Unexpected dangling incomplete upload found", err) - return - } - - function = "GetObject(bucketName, objectName)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - "objectName": objectName, - } - newReader, err := c.GetObject(bucketName, objectName, minio.GetObjectOptions{}) - - if err != nil { - logError(testName, function, args, startTime, "", "GetObject failed", err) - return - } - - newReadBytes, err := ioutil.ReadAll(newReader) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAll failed", err) - return - } - - if !bytes.Equal(newReadBytes, buf) { - logError(testName, function, args, startTime, "", "GetObject bytes mismatch", err) - return - } - newReader.Close() - - function = "FGetObject(bucketName, objectName, fileName)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - "objectName": objectName, - "fileName": fileName + "-f", - } - err = c.FGetObject(bucketName, objectName, fileName+"-f", minio.GetObjectOptions{}) - - if err != nil { - logError(testName, function, args, startTime, "", "FGetObject failed", err) - return - } - - function = "PresignedHeadObject(bucketName, objectName, expires, reqParams)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - "objectName": "", - "expires": 3600 * time.Second, - } - if _, err = c.PresignedHeadObject(bucketName, "", 3600*time.Second, nil); err == nil { - logError(testName, function, args, startTime, "", "PresignedHeadObject success", err) - return - } - - // Generate presigned HEAD object url. - function = "PresignedHeadObject(bucketName, objectName, expires, reqParams)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - "objectName": objectName, - "expires": 3600 * time.Second, - } - presignedHeadURL, err := c.PresignedHeadObject(bucketName, objectName, 3600*time.Second, nil) - - if err != nil { - logError(testName, function, args, startTime, "", "PresignedHeadObject failed", err) - return - } - // Verify if presigned url works. - resp, err := http.Head(presignedHeadURL.String()) - if err != nil { - logError(testName, function, args, startTime, "", "PresignedHeadObject response incorrect", err) - return - } - if resp.StatusCode != http.StatusOK { - logError(testName, function, args, startTime, "", "PresignedHeadObject response incorrect, status "+string(resp.StatusCode), err) - return - } - if resp.Header.Get("ETag") == "" { - logError(testName, function, args, startTime, "", "PresignedHeadObject response incorrect", err) - return - } - resp.Body.Close() - - function = "PresignedGetObject(bucketName, objectName, expires, reqParams)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - "objectName": "", - "expires": 3600 * time.Second, - } - _, err = c.PresignedGetObject(bucketName, "", 3600*time.Second, nil) - if err == nil { - logError(testName, function, args, startTime, "", "PresignedGetObject success", err) - return - } - - // Generate presigned GET object url. - function = "PresignedGetObject(bucketName, objectName, expires, reqParams)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - "objectName": objectName, - "expires": 3600 * time.Second, - } - presignedGetURL, err := c.PresignedGetObject(bucketName, objectName, 3600*time.Second, nil) - - if err != nil { - logError(testName, function, args, startTime, "", "PresignedGetObject failed", err) - return - } - - // Verify if presigned url works. - resp, err = http.Get(presignedGetURL.String()) - if err != nil { - logError(testName, function, args, startTime, "", "PresignedGetObject response incorrect", err) - return - } - if resp.StatusCode != http.StatusOK { - logError(testName, function, args, startTime, "", "PresignedGetObject response incorrect, status "+string(resp.StatusCode), err) - return - } - newPresignedBytes, err := ioutil.ReadAll(resp.Body) - if err != nil { - logError(testName, function, args, startTime, "", "PresignedGetObject response incorrect", err) - return - } - resp.Body.Close() - if !bytes.Equal(newPresignedBytes, buf) { - logError(testName, function, args, startTime, "", "PresignedGetObject response incorrect", err) - return - } - - // Set request parameters. - reqParams := make(url.Values) - reqParams.Set("response-content-disposition", "attachment; filename=\"test.txt\"") - args = map[string]interface{}{ - "bucketName": bucketName, - "objectName": objectName, - "expires": 3600 * time.Second, - "reqParams": reqParams, - } - presignedGetURL, err = c.PresignedGetObject(bucketName, objectName, 3600*time.Second, reqParams) - - if err != nil { - logError(testName, function, args, startTime, "", "PresignedGetObject failed", err) - return - } - // Verify if presigned url works. - resp, err = http.Get(presignedGetURL.String()) - if err != nil { - logError(testName, function, args, startTime, "", "PresignedGetObject response incorrect", err) - return - } - if resp.StatusCode != http.StatusOK { - logError(testName, function, args, startTime, "", "PresignedGetObject response incorrect, status "+string(resp.StatusCode), err) - return - } - newPresignedBytes, err = ioutil.ReadAll(resp.Body) - if err != nil { - logError(testName, function, args, startTime, "", "PresignedGetObject response incorrect", err) - return - } - if !bytes.Equal(newPresignedBytes, buf) { - logError(testName, function, args, startTime, "", "Bytes mismatch for presigned GET URL", err) - return - } - if resp.Header.Get("Content-Disposition") != "attachment; filename=\"test.txt\"" { - logError(testName, function, args, startTime, "", "wrong Content-Disposition received "+string(resp.Header.Get("Content-Disposition")), err) - return - } - - function = "PresignedPutObject(bucketName, objectName, expires)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - "objectName": "", - "expires": 3600 * time.Second, - } - _, err = c.PresignedPutObject(bucketName, "", 3600*time.Second) - if err == nil { - logError(testName, function, args, startTime, "", "PresignedPutObject success", err) - return - } - - function = "PresignedPutObject(bucketName, objectName, expires)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - "objectName": objectName + "-presigned", - "expires": 3600 * time.Second, - } - presignedPutURL, err := c.PresignedPutObject(bucketName, objectName+"-presigned", 3600*time.Second) - - if err != nil { - logError(testName, function, args, startTime, "", "PresignedPutObject failed", err) - return - } - - buf = bytes.Repeat([]byte("g"), 1<<19) - - req, err := http.NewRequest("PUT", presignedPutURL.String(), bytes.NewReader(buf)) - if err != nil { - logError(testName, function, args, startTime, "", "Couldn't make HTTP request with PresignedPutObject URL", err) - return - } - httpClient := &http.Client{ - // Setting a sensible time out of 30secs to wait for response - // headers. Request is pro-actively cancelled after 30secs - // with no response. - Timeout: 30 * time.Second, - Transport: http.DefaultTransport, - } - resp, err = httpClient.Do(req) - if err != nil { - logError(testName, function, args, startTime, "", "PresignedPutObject failed", err) - return - } - - newReader, err = c.GetObject(bucketName, objectName+"-presigned", minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "GetObject after PresignedPutObject failed", err) - return - } - - newReadBytes, err = ioutil.ReadAll(newReader) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAll after GetObject failed", err) - return - } - - if !bytes.Equal(newReadBytes, buf) { - logError(testName, function, args, startTime, "", "Bytes mismatch", err) - return - } - - function = "RemoveObject(bucketName, objectName)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - "objectName": objectName, - } - err = c.RemoveObject(bucketName, objectName) - - if err != nil { - logError(testName, function, args, startTime, "", "RemoveObject failed", err) - return - } - args["objectName"] = objectName + "-f" - err = c.RemoveObject(bucketName, objectName+"-f") - - if err != nil { - logError(testName, function, args, startTime, "", "RemoveObject failed", err) - return - } - - args["objectName"] = objectName + "-nolength" - err = c.RemoveObject(bucketName, objectName+"-nolength") - - if err != nil { - logError(testName, function, args, startTime, "", "RemoveObject failed", err) - return - } - - args["objectName"] = objectName + "-presigned" - err = c.RemoveObject(bucketName, objectName+"-presigned") - - if err != nil { - logError(testName, function, args, startTime, "", "RemoveObject failed", err) - return - } - - function = "RemoveBucket(bucketName)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - } - err = c.RemoveBucket(bucketName) - - if err != nil { - logError(testName, function, args, startTime, "", "RemoveBucket failed", err) - return - } - err = c.RemoveBucket(bucketName) - if err == nil { - logError(testName, function, args, startTime, "", "RemoveBucket did not fail for invalid bucket name", err) - return - } - if err.Error() != "The specified bucket does not exist" { - logError(testName, function, args, startTime, "", "RemoveBucket failed", err) - return - } - - if err = os.Remove(fileName); err != nil { - logError(testName, function, args, startTime, "", "File Remove failed", err) - return - } - if err = os.Remove(fileName + "-f"); err != nil { - logError(testName, function, args, startTime, "", "File Remove failed", err) - return - } - successLogger(testName, functionAll, args, startTime).Info() -} - -// Test for validating GetObject Reader* methods functioning when the -// object is modified in the object store. -func testGetObjectModified() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "GetObject(bucketName, objectName)" - args := map[string]interface{}{} - - // Instantiate new minio client object. - c, err := minio.NewV4( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - - if err != nil { - logError(testName, function, args, startTime, "", "Minio client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Make a new bucket. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - defer c.RemoveBucket(bucketName) - - // Upload an object. - objectName := "myobject" - args["objectName"] = objectName - content := "helloworld" - _, err = c.PutObject(bucketName, objectName, strings.NewReader(content), int64(len(content)), minio.PutObjectOptions{ContentType: "application/text"}) - if err != nil { - logError(testName, function, args, startTime, "", "Failed to upload "+objectName+", to bucket "+bucketName, err) - return - } - - defer c.RemoveObject(bucketName, objectName) - - reader, err := c.GetObject(bucketName, objectName, minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "Failed to GetObject "+objectName+", from bucket "+bucketName, err) - return - } - defer reader.Close() - - // Read a few bytes of the object. - b := make([]byte, 5) - n, err := reader.ReadAt(b, 0) - if err != nil { - logError(testName, function, args, startTime, "", "Failed to read object "+objectName+", from bucket "+bucketName+" at an offset", err) - return - } - - // Upload different contents to the same object while object is being read. - newContent := "goodbyeworld" - _, err = c.PutObject(bucketName, objectName, strings.NewReader(newContent), int64(len(newContent)), minio.PutObjectOptions{ContentType: "application/text"}) - if err != nil { - logError(testName, function, args, startTime, "", "Failed to upload "+objectName+", to bucket "+bucketName, err) - return - } - - // Confirm that a Stat() call in between doesn't change the Object's cached etag. - _, err = reader.Stat() - expectedError := "At least one of the pre-conditions you specified did not hold" - if err.Error() != expectedError { - logError(testName, function, args, startTime, "", "Expected Stat to fail with error "+expectedError+", but received "+err.Error(), err) - return - } - - // Read again only to find object contents have been modified since last read. - _, err = reader.ReadAt(b, int64(n)) - if err.Error() != expectedError { - logError(testName, function, args, startTime, "", "Expected ReadAt to fail with error "+expectedError+", but received "+err.Error(), err) - return - } - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -// Test validates putObject to upload a file seeked at a given offset. -func testPutObjectUploadSeekedObject() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "PutObject(bucketName, objectName, fileToUpload, contentType)" - args := map[string]interface{}{ - "bucketName": "", - "objectName": "", - "fileToUpload": "", - "contentType": "binary/octet-stream", - } - - // Instantiate new minio client object. - c, err := minio.NewV4( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Make a new bucket. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - defer c.RemoveBucket(bucketName) - - var tempfile *os.File - - if fileName := getMintDataDirFilePath("datafile-100-kB"); fileName != "" { - tempfile, err = os.Open(fileName) - if err != nil { - logError(testName, function, args, startTime, "", "File open failed", err) - return - } - args["fileToUpload"] = fileName - } else { - tempfile, err = ioutil.TempFile("", "minio-go-upload-test-") - if err != nil { - logError(testName, function, args, startTime, "", "TempFile create failed", err) - return - } - args["fileToUpload"] = tempfile.Name() - - // Generate 100kB data - if _, err = io.Copy(tempfile, getDataReader("datafile-100-kB")); err != nil { - logError(testName, function, args, startTime, "", "File copy failed", err) - return - } - - defer os.Remove(tempfile.Name()) - - // Seek back to the beginning of the file. - tempfile.Seek(0, 0) - } - var length = 100 * humanize.KiByte - objectName := fmt.Sprintf("test-file-%v", rand.Uint32()) - args["objectName"] = objectName - - offset := length / 2 - if _, err = tempfile.Seek(int64(offset), 0); err != nil { - logError(testName, function, args, startTime, "", "TempFile seek failed", err) - return - } - - n, err := c.PutObject(bucketName, objectName, tempfile, int64(length-offset), minio.PutObjectOptions{ContentType: "binary/octet-stream"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - if n != int64(length-offset) { - logError(testName, function, args, startTime, "", fmt.Sprintf("Invalid length returned, expected %d got %d", int64(length-offset), n), err) - return - } - tempfile.Close() - - obj, err := c.GetObject(bucketName, objectName, minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "GetObject failed", err) - return - } - defer obj.Close() - - n, err = obj.Seek(int64(offset), 0) - if err != nil { - logError(testName, function, args, startTime, "", "Seek failed", err) - return - } - if n != int64(offset) { - logError(testName, function, args, startTime, "", fmt.Sprintf("Invalid offset returned, expected %d got %d", int64(offset), n), err) - return - } - - n, err = c.PutObject(bucketName, objectName+"getobject", obj, int64(length-offset), minio.PutObjectOptions{ContentType: "binary/octet-stream"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - if n != int64(length-offset) { - logError(testName, function, args, startTime, "", fmt.Sprintf("Invalid offset returned, expected %d got %d", int64(length-offset), n), err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -// Tests bucket re-create errors. -func testMakeBucketErrorV2() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "MakeBucket(bucketName, region)" - args := map[string]interface{}{ - "bucketName": "", - "region": "eu-west-1", - } - - if os.Getenv(serverEndpoint) != "s3.amazonaws.com" { - ignoredLog(testName, function, args, startTime, "Skipped region functional tests for non s3 runs").Info() - return - } - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.NewV2( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio v2 client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - region := "eu-west-1" - args["bucketName"] = bucketName - args["region"] = region - - // Make a new bucket in 'eu-west-1'. - if err = c.MakeBucket(bucketName, region); err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - if err = c.MakeBucket(bucketName, region); err == nil { - logError(testName, function, args, startTime, "", "MakeBucket did not fail for existing bucket name", err) - return - } - // Verify valid error response from server. - if minio.ToErrorResponse(err).Code != "BucketAlreadyExists" && - minio.ToErrorResponse(err).Code != "BucketAlreadyOwnedByYou" { - logError(testName, function, args, startTime, "", "Invalid error returned by server", err) - } - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -// Test get object reader to not throw error on being closed twice. -func testGetObjectClosedTwiceV2() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "MakeBucket(bucketName, region)" - args := map[string]interface{}{ - "bucketName": "", - "region": "eu-west-1", - } - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.NewV2( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio v2 client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - // Generate 33K of data. - bufSize := dataFileMap["datafile-33-kB"] - var reader = getDataReader("datafile-33-kB") - defer reader.Close() - - // Save the data - objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "") - args["objectName"] = objectName - - n, err := c.PutObject(bucketName, objectName, reader, int64(bufSize), minio.PutObjectOptions{ContentType: "binary/octet-stream"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - - if n != int64(bufSize) { - logError(testName, function, args, startTime, "", "Number of bytes does not match, expected "+string(bufSize)+" got "+string(n), err) - return - } - - // Read the data back - r, err := c.GetObject(bucketName, objectName, minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "GetObject failed", err) - return - } - - st, err := r.Stat() - if err != nil { - logError(testName, function, args, startTime, "", "Stat failed", err) - return - } - - if st.Size != int64(bufSize) { - logError(testName, function, args, startTime, "", "Number of bytes does not match, expected "+string(bufSize)+" got "+string(st.Size), err) - return - } - if err := r.Close(); err != nil { - logError(testName, function, args, startTime, "", "Stat failed", err) - return - } - if err := r.Close(); err == nil { - logError(testName, function, args, startTime, "", "Object is already closed, should return error", err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -// Tests FPutObject hidden contentType setting -func testFPutObjectV2() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "FPutObject(bucketName, objectName, fileName, opts)" - args := map[string]interface{}{ - "bucketName": "", - "objectName": "", - "fileName": "", - "opts": "", - } - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.NewV2( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio v2 client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - // Make a temp file with 11*1024*1024 bytes of data. - file, err := ioutil.TempFile(os.TempDir(), "FPutObjectTest") - if err != nil { - logError(testName, function, args, startTime, "", "TempFile creation failed", err) - return - } - - r := bytes.NewReader(bytes.Repeat([]byte("b"), 11*1024*1024)) - n, err := io.CopyN(file, r, 11*1024*1024) - if err != nil { - logError(testName, function, args, startTime, "", "Copy failed", err) - return - } - if n != int64(11*1024*1024) { - logError(testName, function, args, startTime, "", "Number of bytes does not match, expected "+string(int64(11*1024*1024))+" got "+string(n), err) - return - } - - // Close the file pro-actively for windows. - err = file.Close() - if err != nil { - logError(testName, function, args, startTime, "", "File close failed", err) - return - } - - // Set base object name - objectName := bucketName + "FPutObject" - args["objectName"] = objectName - args["fileName"] = file.Name() - - // Perform standard FPutObject with contentType provided (Expecting application/octet-stream) - n, err = c.FPutObject(bucketName, objectName+"-standard", file.Name(), minio.PutObjectOptions{ContentType: "application/octet-stream"}) - if err != nil { - logError(testName, function, args, startTime, "", "FPutObject failed", err) - return - } - if n != int64(11*1024*1024) { - logError(testName, function, args, startTime, "", "Number of bytes does not match, expected "+string(int64(11*1024*1024))+" got "+string(n), err) - return - } - - // Perform FPutObject with no contentType provided (Expecting application/octet-stream) - args["objectName"] = objectName + "-Octet" - args["contentType"] = "" - - n, err = c.FPutObject(bucketName, objectName+"-Octet", file.Name(), minio.PutObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "FPutObject failed", err) - return - } - if n != int64(11*1024*1024) { - logError(testName, function, args, startTime, "", "Number of bytes does not match, expected "+string(int64(11*1024*1024))+" got "+string(n), err) - return - } - - // Add extension to temp file name - fileName := file.Name() - err = os.Rename(file.Name(), fileName+".gtar") - if err != nil { - logError(testName, function, args, startTime, "", "Rename failed", err) - return - } - - // Perform FPutObject with no contentType provided (Expecting application/x-gtar) - args["objectName"] = objectName + "-Octet" - args["contentType"] = "" - args["fileName"] = fileName + ".gtar" - - n, err = c.FPutObject(bucketName, objectName+"-GTar", fileName+".gtar", minio.PutObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "FPutObject failed", err) - return - } - if n != int64(11*1024*1024) { - logError(testName, function, args, startTime, "", "Number of bytes does not match, expected "+string(int64(11*1024*1024))+" got "+string(n), err) - return - } - - // Check headers - rStandard, err := c.StatObject(bucketName, objectName+"-standard", minio.StatObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "StatObject failed", err) - return - } - if rStandard.ContentType != "application/octet-stream" { - logError(testName, function, args, startTime, "", "Content-Type headers mismatched, expected: application/octet-stream , got "+rStandard.ContentType, err) - return - } - - rOctet, err := c.StatObject(bucketName, objectName+"-Octet", minio.StatObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "StatObject failed", err) - return - } - if rOctet.ContentType != "application/octet-stream" { - logError(testName, function, args, startTime, "", "Content-Type headers mismatched, expected: application/octet-stream , got "+rOctet.ContentType, err) - return - } - - rGTar, err := c.StatObject(bucketName, objectName+"-GTar", minio.StatObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "StatObject failed", err) - return - } - if rGTar.ContentType != "application/x-gtar" && rGTar.ContentType != "application/octet-stream" { - logError(testName, function, args, startTime, "", "Content-Type headers mismatched, expected: application/x-gtar , got "+rGTar.ContentType, err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - err = os.Remove(fileName + ".gtar") - if err != nil { - logError(testName, function, args, startTime, "", "File remove failed", err) - return - } - successLogger(testName, function, args, startTime).Info() -} - -// Tests various bucket supported formats. -func testMakeBucketRegionsV2() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "MakeBucket(bucketName, region)" - args := map[string]interface{}{ - "bucketName": "", - "region": "eu-west-1", - } - - if os.Getenv(serverEndpoint) != "s3.amazonaws.com" { - ignoredLog(testName, function, args, startTime, "Skipped region functional tests for non s3 runs").Info() - return - } - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.NewV2( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio v2 client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket in 'eu-central-1'. - if err = c.MakeBucket(bucketName, "eu-west-1"); err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - // Make a new bucket with '.' in its name, in 'us-west-2'. This - // request is internally staged into a path style instead of - // virtual host style. - if err = c.MakeBucket(bucketName+".withperiod", "us-west-2"); err != nil { - args["bucketName"] = bucketName + ".withperiod" - args["region"] = "us-west-2" - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName+".withperiod", c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -// Tests get object ReaderSeeker interface methods. -func testGetObjectReadSeekFunctionalV2() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "GetObject(bucketName, objectName)" - args := map[string]interface{}{} - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.NewV2( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio v2 client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - // Generate 33K of data. - bufSize := dataFileMap["datafile-33-kB"] - var reader = getDataReader("datafile-33-kB") - defer reader.Close() - - objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "") - args["objectName"] = objectName - - buf, err := ioutil.ReadAll(reader) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAll failed", err) - return - } - - // Save the data. - n, err := c.PutObject(bucketName, objectName, bytes.NewReader(buf), int64(bufSize), minio.PutObjectOptions{ContentType: "binary/octet-stream"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - - if n != int64(bufSize) { - logError(testName, function, args, startTime, "", "Number of bytes does not match, expected "+string(int64(bufSize))+" got "+string(n), err) - return - } - - // Read the data back - r, err := c.GetObject(bucketName, objectName, minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "GetObject failed", err) - return - } - defer r.Close() - - st, err := r.Stat() - if err != nil { - logError(testName, function, args, startTime, "", "Stat failed", err) - return - } - - if st.Size != int64(bufSize) { - logError(testName, function, args, startTime, "", "Number of bytes in stat does not match, expected "+string(int64(bufSize))+" got "+string(st.Size), err) - return - } - - offset := int64(2048) - n, err = r.Seek(offset, 0) - if err != nil { - logError(testName, function, args, startTime, "", "Seek failed", err) - return - } - if n != offset { - logError(testName, function, args, startTime, "", "Number of seeked bytes does not match, expected "+string(offset)+" got "+string(n), err) - return - } - n, err = r.Seek(0, 1) - if err != nil { - logError(testName, function, args, startTime, "", "Seek failed", err) - return - } - if n != offset { - logError(testName, function, args, startTime, "", "Number of seeked bytes does not match, expected "+string(offset)+" got "+string(n), err) - return - } - _, err = r.Seek(offset, 2) - if err == nil { - logError(testName, function, args, startTime, "", "Seek on positive offset for whence '2' should error out", err) - return - } - n, err = r.Seek(-offset, 2) - if err != nil { - logError(testName, function, args, startTime, "", "Seek failed", err) - return - } - if n != st.Size-offset { - logError(testName, function, args, startTime, "", "Number of seeked bytes does not match, expected "+string(st.Size-offset)+" got "+string(n), err) - return - } - - var buffer1 bytes.Buffer - if _, err = io.CopyN(&buffer1, r, st.Size); err != nil { - if err != io.EOF { - logError(testName, function, args, startTime, "", "Copy failed", err) - return - } - } - if !bytes.Equal(buf[len(buf)-int(offset):], buffer1.Bytes()) { - logError(testName, function, args, startTime, "", "Incorrect read bytes v/s original buffer", err) - return - } - - // Seek again and read again. - n, err = r.Seek(offset-1, 0) - if err != nil { - logError(testName, function, args, startTime, "", "Seek failed", err) - return - } - if n != (offset - 1) { - logError(testName, function, args, startTime, "", "Number of seeked bytes does not match, expected "+string(offset-1)+" got "+string(n), err) - return - } - - var buffer2 bytes.Buffer - if _, err = io.CopyN(&buffer2, r, st.Size); err != nil { - if err != io.EOF { - logError(testName, function, args, startTime, "", "Copy failed", err) - return - } - } - // Verify now lesser bytes. - if !bytes.Equal(buf[2047:], buffer2.Bytes()) { - logError(testName, function, args, startTime, "", "Incorrect read bytes v/s original buffer", err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -// Tests get object ReaderAt interface methods. -func testGetObjectReadAtFunctionalV2() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "GetObject(bucketName, objectName)" - args := map[string]interface{}{} - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.NewV2( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio v2 client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - // Generate 33K of data. - bufSize := dataFileMap["datafile-33-kB"] - var reader = getDataReader("datafile-33-kB") - defer reader.Close() - - objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "") - args["objectName"] = objectName - - buf, err := ioutil.ReadAll(reader) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAll failed", err) - return - } - - // Save the data - n, err := c.PutObject(bucketName, objectName, bytes.NewReader(buf), int64(bufSize), minio.PutObjectOptions{ContentType: "binary/octet-stream"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - - if n != int64(bufSize) { - logError(testName, function, args, startTime, "", "Number of bytes does not match, expected "+string(bufSize)+" got "+string(n), err) - return - } - - // Read the data back - r, err := c.GetObject(bucketName, objectName, minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "GetObject failed", err) - return - } - defer r.Close() - - st, err := r.Stat() - if err != nil { - logError(testName, function, args, startTime, "", "Stat failed", err) - return - } - - if st.Size != int64(bufSize) { - logError(testName, function, args, startTime, "", "Number of bytes does not match, expected "+string(bufSize)+" got "+string(st.Size), err) - return - } - - offset := int64(2048) - - // Read directly - buf2 := make([]byte, 512) - buf3 := make([]byte, 512) - buf4 := make([]byte, 512) - - m, err := r.ReadAt(buf2, offset) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAt failed", err) - return - } - if m != len(buf2) { - logError(testName, function, args, startTime, "", "ReadAt read shorter bytes before reaching EOF, expected "+string(len(buf2))+" got "+string(m), err) - return - } - if !bytes.Equal(buf2, buf[offset:offset+512]) { - logError(testName, function, args, startTime, "", "Incorrect read between two ReadAt from same offset", err) - return - } - offset += 512 - m, err = r.ReadAt(buf3, offset) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAt failed", err) - return - } - if m != len(buf3) { - logError(testName, function, args, startTime, "", "ReadAt read shorter bytes before reaching EOF, expected "+string(len(buf3))+" got "+string(m), err) - return - } - if !bytes.Equal(buf3, buf[offset:offset+512]) { - logError(testName, function, args, startTime, "", "Incorrect read between two ReadAt from same offset", err) - return - } - offset += 512 - m, err = r.ReadAt(buf4, offset) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAt failed", err) - return - } - if m != len(buf4) { - logError(testName, function, args, startTime, "", "ReadAt read shorter bytes before reaching EOF, expected "+string(len(buf4))+" got "+string(m), err) - return - } - if !bytes.Equal(buf4, buf[offset:offset+512]) { - logError(testName, function, args, startTime, "", "Incorrect read between two ReadAt from same offset", err) - return - } - - buf5 := make([]byte, n) - // Read the whole object. - m, err = r.ReadAt(buf5, 0) - if err != nil { - if err != io.EOF { - logError(testName, function, args, startTime, "", "ReadAt failed", err) - return - } - } - if m != len(buf5) { - logError(testName, function, args, startTime, "", "ReadAt read shorter bytes before reaching EOF, expected "+string(len(buf5))+" got "+string(m), err) - return - } - if !bytes.Equal(buf, buf5) { - logError(testName, function, args, startTime, "", "Incorrect data read in GetObject, than what was previously uploaded", err) - return - } - - buf6 := make([]byte, n+1) - // Read the whole object and beyond. - _, err = r.ReadAt(buf6, 0) - if err != nil { - if err != io.EOF { - logError(testName, function, args, startTime, "", "ReadAt failed", err) - return - } - } - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -// Tests copy object -func testCopyObjectV2() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "CopyObject(destination, source)" - args := map[string]interface{}{} - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object - c, err := minio.NewV2( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio v2 client object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - - // Make a new bucket in 'us-east-1' (source bucket). - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - // Make a new bucket in 'us-east-1' (destination bucket). - err = c.MakeBucket(bucketName+"-copy", "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - // Generate 33K of data. - bufSize := dataFileMap["datafile-33-kB"] - var reader = getDataReader("datafile-33-kB") - defer reader.Close() - - // Save the data - objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "") - n, err := c.PutObject(bucketName, objectName, reader, int64(bufSize), minio.PutObjectOptions{ContentType: "binary/octet-stream"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - - if n != int64(bufSize) { - logError(testName, function, args, startTime, "", "Number of bytes does not match, expected "+string(int64(bufSize))+" got "+string(n), err) - return - } - - r, err := c.GetObject(bucketName, objectName, minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "GetObject failed", err) - return - } - // Check the various fields of source object against destination object. - objInfo, err := r.Stat() - if err != nil { - logError(testName, function, args, startTime, "", "Stat failed", err) - return - } - r.Close() - - // Copy Source - src := minio.NewSourceInfo(bucketName, objectName, nil) - args["source"] = src - - // Set copy conditions. - - // All invalid conditions first. - err = src.SetModifiedSinceCond(time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC)) - if err == nil { - logError(testName, function, args, startTime, "", "SetModifiedSinceCond did not fail for invalid conditions", err) - return - } - err = src.SetUnmodifiedSinceCond(time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC)) - if err == nil { - logError(testName, function, args, startTime, "", "SetUnmodifiedSinceCond did not fail for invalid conditions", err) - return - } - err = src.SetMatchETagCond("") - if err == nil { - logError(testName, function, args, startTime, "", "SetMatchETagCond did not fail for invalid conditions", err) - return - } - err = src.SetMatchETagExceptCond("") - if err == nil { - logError(testName, function, args, startTime, "", "SetMatchETagExceptCond did not fail for invalid conditions", err) - return - } - - err = src.SetModifiedSinceCond(time.Date(2014, time.April, 0, 0, 0, 0, 0, time.UTC)) - if err != nil { - logError(testName, function, args, startTime, "", "SetModifiedSinceCond failed", err) - return - } - err = src.SetMatchETagCond(objInfo.ETag) - if err != nil { - logError(testName, function, args, startTime, "", "SetMatchETagCond failed", err) - return - } - - dst, err := minio.NewDestinationInfo(bucketName+"-copy", objectName+"-copy", nil, nil) - args["destination"] = dst - if err != nil { - logError(testName, function, args, startTime, "", "NewDestinationInfo failed", err) - return - } - - // Perform the Copy - err = c.CopyObject(dst, src) - if err != nil { - logError(testName, function, args, startTime, "", "CopyObject failed", err) - return - } - - // Source object - r, err = c.GetObject(bucketName, objectName, minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "GetObject failed", err) - return - } - // Destination object - readerCopy, err := c.GetObject(bucketName+"-copy", objectName+"-copy", minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "GetObject failed", err) - return - } - // Check the various fields of source object against destination object. - objInfo, err = r.Stat() - if err != nil { - logError(testName, function, args, startTime, "", "Stat failed", err) - return - } - objInfoCopy, err := readerCopy.Stat() - if err != nil { - logError(testName, function, args, startTime, "", "Stat failed", err) - return - } - if objInfo.Size != objInfoCopy.Size { - logError(testName, function, args, startTime, "", "Number of bytes does not match, expected "+string(objInfoCopy.Size)+" got "+string(objInfo.Size), err) - return - } - - // Close all the readers. - r.Close() - readerCopy.Close() - - // CopyObject again but with wrong conditions - src = minio.NewSourceInfo(bucketName, objectName, nil) - err = src.SetUnmodifiedSinceCond(time.Date(2014, time.April, 0, 0, 0, 0, 0, time.UTC)) - if err != nil { - logError(testName, function, args, startTime, "", "SetUnmodifiedSinceCond failed", err) - return - } - err = src.SetMatchETagExceptCond(objInfo.ETag) - if err != nil { - logError(testName, function, args, startTime, "", "SetMatchETagExceptCond failed", err) - return - } - - // Perform the Copy which should fail - err = c.CopyObject(dst, src) - if err == nil { - logError(testName, function, args, startTime, "", "CopyObject did not fail for invalid conditions", err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - if err = cleanupBucket(bucketName+"-copy", c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - successLogger(testName, function, args, startTime).Info() -} - -func testComposeObjectErrorCasesWrapper(c *minio.Client) { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "ComposeObject(destination, sourceList)" - args := map[string]interface{}{} - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - - // Make a new bucket in 'us-east-1' (source bucket). - err := c.MakeBucket(bucketName, "us-east-1") - - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - // Test that more than 10K source objects cannot be - // concatenated. - srcArr := [10001]minio.SourceInfo{} - srcSlice := srcArr[:] - dst, err := minio.NewDestinationInfo(bucketName, "object", nil, nil) - if err != nil { - logError(testName, function, args, startTime, "", "NewDestinationInfo failed", err) - return - } - - args["destination"] = dst - // Just explain about srcArr in args["sourceList"] - // to stop having 10,001 null headers logged - args["sourceList"] = "source array of 10,001 elements" - if err := c.ComposeObject(dst, srcSlice); err == nil { - logError(testName, function, args, startTime, "", "Expected error in ComposeObject", err) - return - } else if err.Error() != "There must be as least one and up to 10000 source objects." { - logError(testName, function, args, startTime, "", "Got unexpected error", err) - return - } - - // Create a source with invalid offset spec and check that - // error is returned: - // 1. Create the source object. - const badSrcSize = 5 * 1024 * 1024 - buf := bytes.Repeat([]byte("1"), badSrcSize) - _, err = c.PutObject(bucketName, "badObject", bytes.NewReader(buf), int64(len(buf)), minio.PutObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - // 2. Set invalid range spec on the object (going beyond - // object size) - badSrc := minio.NewSourceInfo(bucketName, "badObject", nil) - err = badSrc.SetRange(1, badSrcSize) - if err != nil { - logError(testName, function, args, startTime, "", "Setting NewSourceInfo failed", err) - return - } - // 3. ComposeObject call should fail. - if err := c.ComposeObject(dst, []minio.SourceInfo{badSrc}); err == nil { - logError(testName, function, args, startTime, "", "ComposeObject expected to fail", err) - return - } else if !strings.Contains(err.Error(), "has invalid segment-to-copy") { - logError(testName, function, args, startTime, "", "Got invalid error", err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -// Test expected error cases -func testComposeObjectErrorCasesV2() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "ComposeObject(destination, sourceList)" - args := map[string]interface{}{} - - // Instantiate new minio client object - c, err := minio.NewV2( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio v2 client object creation failed", err) - return - } - - testComposeObjectErrorCasesWrapper(c) -} - -func testComposeMultipleSources(c *minio.Client) { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "ComposeObject(destination, sourceList)" - args := map[string]interface{}{ - "destination": "", - "sourceList": "", - } - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - // Make a new bucket in 'us-east-1' (source bucket). - err := c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - // Upload a small source object - const srcSize = 1024 * 1024 * 5 - buf := bytes.Repeat([]byte("1"), srcSize) - _, err = c.PutObject(bucketName, "srcObject", bytes.NewReader(buf), int64(srcSize), minio.PutObjectOptions{ContentType: "binary/octet-stream"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - - // We will append 10 copies of the object. - srcs := []minio.SourceInfo{} - for i := 0; i < 10; i++ { - srcs = append(srcs, minio.NewSourceInfo(bucketName, "srcObject", nil)) - } - // make the last part very small - err = srcs[9].SetRange(0, 0) - if err != nil { - logError(testName, function, args, startTime, "", "SetRange failed", err) - return - } - args["sourceList"] = srcs - - dst, err := minio.NewDestinationInfo(bucketName, "dstObject", nil, nil) - args["destination"] = dst - - if err != nil { - logError(testName, function, args, startTime, "", "NewDestinationInfo failed", err) - return - } - err = c.ComposeObject(dst, srcs) - if err != nil { - logError(testName, function, args, startTime, "", "ComposeObject failed", err) - return - } - - objProps, err := c.StatObject(bucketName, "dstObject", minio.StatObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "StatObject failed", err) - return - } - - if objProps.Size != 9*srcSize+1 { - logError(testName, function, args, startTime, "", "Size mismatched! Expected "+string(10000*srcSize)+" got "+string(objProps.Size), err) - return - } - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - successLogger(testName, function, args, startTime).Info() -} - -// Test concatenating multiple objects objects -func testCompose10KSourcesV2() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "ComposeObject(destination, sourceList)" - args := map[string]interface{}{} - - // Instantiate new minio client object - c, err := minio.NewV2( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio v2 client object creation failed", err) - return - } - - testComposeMultipleSources(c) -} - -func testEncryptedEmptyObject() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "PutObject(bucketName, objectName, reader, objectSize, opts)" - args := map[string]interface{}{} - - // Instantiate new minio client object - c, err := minio.NewV4( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio v4 client object creation failed", err) - return - } - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - // Make a new bucket in 'us-east-1' (source bucket). - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - sse := encrypt.DefaultPBKDF([]byte("correct horse battery staple"), []byte(bucketName+"object")) - - // 1. create an sse-c encrypted object to copy by uploading - const srcSize = 0 - var buf []byte // Empty buffer - args["objectName"] = "object" - _, err = c.PutObject(bucketName, "object", bytes.NewReader(buf), int64(len(buf)), minio.PutObjectOptions{ServerSideEncryption: sse}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject call failed", err) - return - } - - // 2. Test CopyObject for an empty object - dstInfo, err := minio.NewDestinationInfo(bucketName, "new-object", sse, nil) - if err != nil { - args["objectName"] = "new-object" - function = "NewDestinationInfo(bucketName, objectName, sse, userMetadata)" - logError(testName, function, args, startTime, "", "NewDestinationInfo failed", err) - return - } - srcInfo := minio.NewSourceInfo(bucketName, "object", sse) - if err = c.CopyObject(dstInfo, srcInfo); err != nil { - function = "CopyObject(dstInfo, srcInfo)" - logError(testName, function, map[string]interface{}{}, startTime, "", "CopyObject failed", err) - return - } - - // 3. Test Key rotation - newSSE := encrypt.DefaultPBKDF([]byte("Don't Panic"), []byte(bucketName+"new-object")) - dstInfo, err = minio.NewDestinationInfo(bucketName, "new-object", newSSE, nil) - if err != nil { - args["objectName"] = "new-object" - function = "NewDestinationInfo(bucketName, objectName, encryptSSEC, userMetadata)" - logError(testName, function, args, startTime, "", "NewDestinationInfo failed", err) - return - } - - srcInfo = minio.NewSourceInfo(bucketName, "new-object", sse) - if err = c.CopyObject(dstInfo, srcInfo); err != nil { - function = "CopyObject(dstInfo, srcInfo)" - logError(testName, function, map[string]interface{}{}, startTime, "", "CopyObject with key rotation failed", err) - return - } - - // 4. Download the object. - reader, err := c.GetObject(bucketName, "new-object", minio.GetObjectOptions{ServerSideEncryption: newSSE}) - if err != nil { - logError(testName, function, args, startTime, "", "GetObject failed", err) - return - } - defer reader.Close() - - decBytes, err := ioutil.ReadAll(reader) - if err != nil { - logError(testName, function, map[string]interface{}{}, startTime, "", "ReadAll failed", err) - return - } - if !bytes.Equal(decBytes, buf) { - logError(testName, function, map[string]interface{}{}, startTime, "", "Downloaded object doesn't match the empty encrypted object", err) - return - } - // Delete all objects and buckets - delete(args, "objectName") - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -func testEncryptedCopyObjectWrapper(c *minio.Client) { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "CopyObject(destination, source)" - args := map[string]interface{}{} - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - // Make a new bucket in 'us-east-1' (source bucket). - err := c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - sseSrc := encrypt.DefaultPBKDF([]byte("correct horse battery staple"), []byte(bucketName+"srcObject")) - sseDst := encrypt.DefaultPBKDF([]byte("correct horse battery staple"), []byte(bucketName+"dstObject")) - - // 1. create an sse-c encrypted object to copy by uploading - const srcSize = 1024 * 1024 - buf := bytes.Repeat([]byte("abcde"), srcSize) // gives a buffer of 5MiB - _, err = c.PutObject(bucketName, "srcObject", bytes.NewReader(buf), int64(len(buf)), minio.PutObjectOptions{ - ServerSideEncryption: sseSrc, - }) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject call failed", err) - return - } - - // 2. copy object and change encryption key - src := minio.NewSourceInfo(bucketName, "srcObject", sseSrc) - args["source"] = src - dst, err := minio.NewDestinationInfo(bucketName, "dstObject", sseDst, nil) - if err != nil { - logError(testName, function, args, startTime, "", "NewDestinationInfo failed", err) - return - } - args["destination"] = dst - - err = c.CopyObject(dst, src) - if err != nil { - logError(testName, function, args, startTime, "", "CopyObject failed", err) - return - } - - // 3. get copied object and check if content is equal - coreClient := minio.Core{c} - reader, _, err := coreClient.GetObject(bucketName, "dstObject", minio.GetObjectOptions{ServerSideEncryption: sseDst}) - if err != nil { - logError(testName, function, args, startTime, "", "GetObject failed", err) - return - } - - decBytes, err := ioutil.ReadAll(reader) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAll failed", err) - return - } - if !bytes.Equal(decBytes, buf) { - logError(testName, function, args, startTime, "", "Downloaded object mismatched for encrypted object", err) - return - } - reader.Close() - - // Test key rotation for source object in-place. - newSSE := encrypt.DefaultPBKDF([]byte("Don't Panic"), []byte(bucketName+"srcObject")) // replace key - dst, err = minio.NewDestinationInfo(bucketName, "srcObject", newSSE, nil) - if err != nil { - logError(testName, function, args, startTime, "", "NewDestinationInfo failed", err) - return - } - args["destination"] = dst - - err = c.CopyObject(dst, src) - if err != nil { - logError(testName, function, args, startTime, "", "CopyObject failed", err) - return - } - - // Get copied object and check if content is equal - reader, _, err = coreClient.GetObject(bucketName, "srcObject", minio.GetObjectOptions{ServerSideEncryption: newSSE}) - if err != nil { - logError(testName, function, args, startTime, "", "GetObject failed", err) - return - } - - decBytes, err = ioutil.ReadAll(reader) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAll failed", err) - return - } - if !bytes.Equal(decBytes, buf) { - logError(testName, function, args, startTime, "", "Downloaded object mismatched for encrypted object", err) - return - } - reader.Close() - - // Test in-place decryption. - dst, err = minio.NewDestinationInfo(bucketName, "srcObject", nil, nil) - if err != nil { - logError(testName, function, args, startTime, "", "NewDestinationInfo failed", err) - return - } - args["destination"] = dst - - src = minio.NewSourceInfo(bucketName, "srcObject", newSSE) - args["source"] = src - err = c.CopyObject(dst, src) - if err != nil { - logError(testName, function, args, startTime, "", "CopyObject failed", err) - return - } - - // Get copied decrypted object and check if content is equal - reader, _, err = coreClient.GetObject(bucketName, "srcObject", minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "GetObject failed", err) - return - } - defer reader.Close() - - decBytes, err = ioutil.ReadAll(reader) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAll failed", err) - return - } - if !bytes.Equal(decBytes, buf) { - logError(testName, function, args, startTime, "", "Downloaded object mismatched for encrypted object", err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -// Test encrypted copy object -func testEncryptedCopyObject() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "CopyObject(destination, source)" - args := map[string]interface{}{} - - // Instantiate new minio client object - c, err := minio.NewV4( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio v2 client object creation failed", err) - return - } - - // c.TraceOn(os.Stderr) - testEncryptedCopyObjectWrapper(c) -} - -// Test encrypted copy object -func testEncryptedCopyObjectV2() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "CopyObject(destination, source)" - args := map[string]interface{}{} - - // Instantiate new minio client object - c, err := minio.NewV2( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio v2 client object creation failed", err) - return - } - - // c.TraceOn(os.Stderr) - testEncryptedCopyObjectWrapper(c) -} - -func testDecryptedCopyObject() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "CopyObject(destination, source)" - args := map[string]interface{}{} - - // Instantiate new minio client object - c, err := minio.New( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio v2 client object creation failed", err) - return - } - - bucketName, objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-"), "object" - if err = c.MakeBucket(bucketName, "us-east-1"); err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - encryption := encrypt.DefaultPBKDF([]byte("correct horse battery staple"), []byte(bucketName+objectName)) - _, err = c.PutObject(bucketName, objectName, bytes.NewReader(bytes.Repeat([]byte("a"), 1024*1024)), 1024*1024, minio.PutObjectOptions{ - ServerSideEncryption: encryption, - }) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject call failed", err) - return - } - - src := minio.NewSourceInfo(bucketName, objectName, encrypt.SSECopy(encryption)) - args["source"] = src - dst, err := minio.NewDestinationInfo(bucketName, "decrypted-"+objectName, nil, nil) - if err != nil { - logError(testName, function, args, startTime, "", "NewDestinationInfo failed", err) - return - } - args["destination"] = dst - - if err = c.CopyObject(dst, src); err != nil { - logError(testName, function, args, startTime, "", "CopyObject failed", err) - return - } - if _, err = c.GetObject(bucketName, "decrypted-"+objectName, minio.GetObjectOptions{}); err != nil { - logError(testName, function, args, startTime, "", "GetObject failed", err) - return - } - successLogger(testName, function, args, startTime).Info() -} - -func testUserMetadataCopying() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "CopyObject(destination, source)" - args := map[string]interface{}{} - - // Instantiate new minio client object - c, err := minio.NewV4( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client object creation failed", err) - return - } - - // c.TraceOn(os.Stderr) - testUserMetadataCopyingWrapper(c) -} - -func testUserMetadataCopyingWrapper(c *minio.Client) { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "CopyObject(destination, source)" - args := map[string]interface{}{} - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - // Make a new bucket in 'us-east-1' (source bucket). - err := c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - fetchMeta := func(object string) (h http.Header) { - objInfo, err := c.StatObject(bucketName, object, minio.StatObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "Stat failed", err) - return - } - h = make(http.Header) - for k, vs := range objInfo.Metadata { - if strings.HasPrefix(strings.ToLower(k), "x-amz-meta-") { - for _, v := range vs { - h.Add(k, v) - } - } - } - return h - } - - // 1. create a client encrypted object to copy by uploading - const srcSize = 1024 * 1024 - buf := bytes.Repeat([]byte("abcde"), srcSize) // gives a buffer of 5MiB - metadata := make(http.Header) - metadata.Set("x-amz-meta-myheader", "myvalue") - m := make(map[string]string) - m["x-amz-meta-myheader"] = "myvalue" - _, err = c.PutObject(bucketName, "srcObject", - bytes.NewReader(buf), int64(len(buf)), minio.PutObjectOptions{UserMetadata: m}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObjectWithMetadata failed", err) - return - } - if !reflect.DeepEqual(metadata, fetchMeta("srcObject")) { - logError(testName, function, args, startTime, "", "Metadata match failed", err) - return - } - - // 2. create source - src := minio.NewSourceInfo(bucketName, "srcObject", nil) - // 2.1 create destination with metadata set - dst1, err := minio.NewDestinationInfo(bucketName, "dstObject-1", nil, map[string]string{"notmyheader": "notmyvalue"}) - if err != nil { - logError(testName, function, args, startTime, "", "NewDestinationInfo failed", err) - return - } - - // 3. Check that copying to an object with metadata set resets - // the headers on the copy. - args["source"] = src - args["destination"] = dst1 - err = c.CopyObject(dst1, src) - if err != nil { - logError(testName, function, args, startTime, "", "CopyObject failed", err) - return - } - - expectedHeaders := make(http.Header) - expectedHeaders.Set("x-amz-meta-notmyheader", "notmyvalue") - if !reflect.DeepEqual(expectedHeaders, fetchMeta("dstObject-1")) { - logError(testName, function, args, startTime, "", "Metadata match failed", err) - return - } - - // 4. create destination with no metadata set and same source - dst2, err := minio.NewDestinationInfo(bucketName, "dstObject-2", nil, nil) - if err != nil { - logError(testName, function, args, startTime, "", "NewDestinationInfo failed", err) - return - } - src = minio.NewSourceInfo(bucketName, "srcObject", nil) - - // 5. Check that copying to an object with no metadata set, - // copies metadata. - args["source"] = src - args["destination"] = dst2 - err = c.CopyObject(dst2, src) - if err != nil { - logError(testName, function, args, startTime, "", "CopyObject failed", err) - return - } - - expectedHeaders = metadata - if !reflect.DeepEqual(expectedHeaders, fetchMeta("dstObject-2")) { - logError(testName, function, args, startTime, "", "Metadata match failed", err) - return - } - - // 6. Compose a pair of sources. - srcs := []minio.SourceInfo{ - minio.NewSourceInfo(bucketName, "srcObject", nil), - minio.NewSourceInfo(bucketName, "srcObject", nil), - } - dst3, err := minio.NewDestinationInfo(bucketName, "dstObject-3", nil, nil) - if err != nil { - logError(testName, function, args, startTime, "", "NewDestinationInfo failed", err) - return - } - - function = "ComposeObject(destination, sources)" - args["source"] = srcs - args["destination"] = dst3 - err = c.ComposeObject(dst3, srcs) - if err != nil { - logError(testName, function, args, startTime, "", "ComposeObject failed", err) - return - } - - // Check that no headers are copied in this case - if !reflect.DeepEqual(make(http.Header), fetchMeta("dstObject-3")) { - logError(testName, function, args, startTime, "", "Metadata match failed", err) - return - } - - // 7. Compose a pair of sources with dest user metadata set. - srcs = []minio.SourceInfo{ - minio.NewSourceInfo(bucketName, "srcObject", nil), - minio.NewSourceInfo(bucketName, "srcObject", nil), - } - dst4, err := minio.NewDestinationInfo(bucketName, "dstObject-4", nil, map[string]string{"notmyheader": "notmyvalue"}) - if err != nil { - logError(testName, function, args, startTime, "", "NewDestinationInfo failed", err) - return - } - - function = "ComposeObject(destination, sources)" - args["source"] = srcs - args["destination"] = dst4 - err = c.ComposeObject(dst4, srcs) - if err != nil { - logError(testName, function, args, startTime, "", "ComposeObject failed", err) - return - } - - // Check that no headers are copied in this case - expectedHeaders = make(http.Header) - expectedHeaders.Set("x-amz-meta-notmyheader", "notmyvalue") - if !reflect.DeepEqual(expectedHeaders, fetchMeta("dstObject-4")) { - logError(testName, function, args, startTime, "", "Metadata match failed", err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -func testUserMetadataCopyingV2() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "CopyObject(destination, source)" - args := map[string]interface{}{} - - // Instantiate new minio client object - c, err := minio.NewV2( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client v2 object creation failed", err) - return - } - - // c.TraceOn(os.Stderr) - testUserMetadataCopyingWrapper(c) -} - -func testStorageClassMetadataPutObject() { - // initialize logging params - startTime := time.Now() - function := "testStorageClassMetadataPutObject()" - args := map[string]interface{}{} - testName := getFuncName() - - // Instantiate new minio client object - c, err := minio.NewV4( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio v4 client object creation failed", err) - return - } - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test") - // Make a new bucket in 'us-east-1' (source bucket). - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - fetchMeta := func(object string) (h http.Header) { - objInfo, err := c.StatObject(bucketName, object, minio.StatObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "Stat failed", err) - return - } - h = make(http.Header) - for k, vs := range objInfo.Metadata { - if strings.HasPrefix(strings.ToLower(k), "x-amz-storage-class") { - for _, v := range vs { - h.Add(k, v) - } - } - } - return h - } - - metadata := make(http.Header) - metadata.Set("x-amz-storage-class", "REDUCED_REDUNDANCY") - - emptyMetadata := make(http.Header) - - const srcSize = 1024 * 1024 - buf := bytes.Repeat([]byte("abcde"), srcSize) // gives a buffer of 1MiB - - _, err = c.PutObject(bucketName, "srcObjectRRSClass", - bytes.NewReader(buf), int64(len(buf)), minio.PutObjectOptions{StorageClass: "REDUCED_REDUNDANCY"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - - // Get the returned metadata - returnedMeta := fetchMeta("srcObjectRRSClass") - - // The response metada should either be equal to metadata (with REDUCED_REDUNDANCY) or emptyMetadata (in case of gateways) - if !reflect.DeepEqual(metadata, returnedMeta) && !reflect.DeepEqual(emptyMetadata, returnedMeta) { - logError(testName, function, args, startTime, "", "Metadata match failed", err) - return - } - - metadata = make(http.Header) - metadata.Set("x-amz-storage-class", "STANDARD") - - _, err = c.PutObject(bucketName, "srcObjectSSClass", - bytes.NewReader(buf), int64(len(buf)), minio.PutObjectOptions{StorageClass: "STANDARD"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - if reflect.DeepEqual(metadata, fetchMeta("srcObjectSSClass")) { - logError(testName, function, args, startTime, "", "Metadata verification failed, STANDARD storage class should not be a part of response metadata", err) - return - } - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - successLogger(testName, function, args, startTime).Info() -} - -func testStorageClassInvalidMetadataPutObject() { - // initialize logging params - startTime := time.Now() - function := "testStorageClassInvalidMetadataPutObject()" - args := map[string]interface{}{} - testName := getFuncName() - - // Instantiate new minio client object - c, err := minio.NewV4( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio v4 client object creation failed", err) - return - } - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test") - // Make a new bucket in 'us-east-1' (source bucket). - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - const srcSize = 1024 * 1024 - buf := bytes.Repeat([]byte("abcde"), srcSize) // gives a buffer of 1MiB - - _, err = c.PutObject(bucketName, "srcObjectRRSClass", - bytes.NewReader(buf), int64(len(buf)), minio.PutObjectOptions{StorageClass: "INVALID_STORAGE_CLASS"}) - if err == nil { - logError(testName, function, args, startTime, "", "PutObject with invalid storage class passed, was expected to fail", err) - return - } - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - successLogger(testName, function, args, startTime).Info() -} - -func testStorageClassMetadataCopyObject() { - // initialize logging params - startTime := time.Now() - function := "testStorageClassMetadataCopyObject()" - args := map[string]interface{}{} - testName := getFuncName() - - // Instantiate new minio client object - c, err := minio.NewV4( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio v4 client object creation failed", err) - return - } - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test") - // Make a new bucket in 'us-east-1' (source bucket). - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - fetchMeta := func(object string) (h http.Header) { - objInfo, err := c.StatObject(bucketName, object, minio.StatObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "Stat failed", err) - return - } - h = make(http.Header) - for k, vs := range objInfo.Metadata { - if strings.HasPrefix(strings.ToLower(k), "x-amz-storage-class") { - for _, v := range vs { - h.Add(k, v) - } - } - } - return h - } - - metadata := make(http.Header) - metadata.Set("x-amz-storage-class", "REDUCED_REDUNDANCY") - - emptyMetadata := make(http.Header) - - const srcSize = 1024 * 1024 - buf := bytes.Repeat([]byte("abcde"), srcSize) - - // Put an object with RRS Storage class - _, err = c.PutObject(bucketName, "srcObjectRRSClass", - bytes.NewReader(buf), int64(len(buf)), minio.PutObjectOptions{StorageClass: "REDUCED_REDUNDANCY"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - - // Make server side copy of object uploaded in previous step - src := minio.NewSourceInfo(bucketName, "srcObjectRRSClass", nil) - dst, err := minio.NewDestinationInfo(bucketName, "srcObjectRRSClassCopy", nil, nil) - c.CopyObject(dst, src) - - // Get the returned metadata - returnedMeta := fetchMeta("srcObjectRRSClassCopy") - - // The response metada should either be equal to metadata (with REDUCED_REDUNDANCY) or emptyMetadata (in case of gateways) - if !reflect.DeepEqual(metadata, returnedMeta) && !reflect.DeepEqual(emptyMetadata, returnedMeta) { - logError(testName, function, args, startTime, "", "Metadata match failed", err) - return - } - - metadata = make(http.Header) - metadata.Set("x-amz-storage-class", "STANDARD") - - // Put an object with Standard Storage class - _, err = c.PutObject(bucketName, "srcObjectSSClass", - bytes.NewReader(buf), int64(len(buf)), minio.PutObjectOptions{StorageClass: "STANDARD"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - - // Make server side copy of object uploaded in previous step - src = minio.NewSourceInfo(bucketName, "srcObjectSSClass", nil) - dst, err = minio.NewDestinationInfo(bucketName, "srcObjectSSClassCopy", nil, nil) - c.CopyObject(dst, src) - - // Fetch the meta data of copied object - if reflect.DeepEqual(metadata, fetchMeta("srcObjectSSClassCopy")) { - logError(testName, function, args, startTime, "", "Metadata verification failed, STANDARD storage class should not be a part of response metadata", err) - return - } - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - successLogger(testName, function, args, startTime).Info() -} - -// Test put object with size -1 byte object. -func testPutObjectNoLengthV2() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "PutObject(bucketName, objectName, reader, size, opts)" - args := map[string]interface{}{ - "bucketName": "", - "objectName": "", - "size": -1, - "opts": "", - } - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.NewV2( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client v2 object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - objectName := bucketName + "unique" - args["objectName"] = objectName - - bufSize := dataFileMap["datafile-65-MB"] - var reader = getDataReader("datafile-65-MB") - defer reader.Close() - args["size"] = bufSize - - // Upload an object. - n, err := c.PutObject(bucketName, objectName, reader, -1, minio.PutObjectOptions{}) - - if err != nil { - logError(testName, function, args, startTime, "", "PutObjectWithSize failed", err) - return - } - if n != int64(bufSize) { - logError(testName, function, args, startTime, "", "Expected upload object size "+string(bufSize)+" got "+string(n), err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -// Test put objects of unknown size. -func testPutObjectsUnknownV2() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "PutObject(bucketName, objectName, reader,size,opts)" - args := map[string]interface{}{ - "bucketName": "", - "objectName": "", - "size": "", - "opts": "", - } - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.NewV2( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client v2 object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - // Issues are revealed by trying to upload multiple files of unknown size - // sequentially (on 4GB machines) - for i := 1; i <= 4; i++ { - // Simulate that we could be receiving byte slices of data that we want - // to upload as a file - rpipe, wpipe := io.Pipe() - defer rpipe.Close() - go func() { - b := []byte("test") - wpipe.Write(b) - wpipe.Close() - }() - - // Upload the object. - objectName := fmt.Sprintf("%sunique%d", bucketName, i) - args["objectName"] = objectName - - n, err := c.PutObject(bucketName, objectName, rpipe, -1, minio.PutObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObjectStreaming failed", err) - return - } - args["size"] = n - if n != int64(4) { - logError(testName, function, args, startTime, "", "Expected upload object size "+string(4)+" got "+string(n), err) - return - } - - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -// Test put object with 0 byte object. -func testPutObject0ByteV2() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "PutObject(bucketName, objectName, reader, size, opts)" - args := map[string]interface{}{ - "bucketName": "", - "objectName": "", - "size": 0, - "opts": "", - } - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.NewV2( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client v2 object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - objectName := bucketName + "unique" - args["objectName"] = objectName - args["opts"] = minio.PutObjectOptions{} - - // Upload an object. - n, err := c.PutObject(bucketName, objectName, bytes.NewReader([]byte("")), 0, minio.PutObjectOptions{}) - - if err != nil { - logError(testName, function, args, startTime, "", "PutObjectWithSize failed", err) - return - } - if n != 0 { - logError(testName, function, args, startTime, "", "Expected upload object size 0 but got "+string(n), err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() -} - -// Test expected error cases -func testComposeObjectErrorCases() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "ComposeObject(destination, sourceList)" - args := map[string]interface{}{} - - // Instantiate new minio client object - c, err := minio.NewV4( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client object creation failed", err) - return - } - - testComposeObjectErrorCasesWrapper(c) -} - -// Test concatenating 10K objects -func testCompose10KSources() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "ComposeObject(destination, sourceList)" - args := map[string]interface{}{} - - // Instantiate new minio client object - c, err := minio.NewV4( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client object creation failed", err) - return - } - - testComposeMultipleSources(c) -} - -// Tests comprehensive list of all methods. -func testFunctionalV2() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "testFunctionalV2()" - functionAll := "" - args := map[string]interface{}{} - - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - c, err := minio.NewV2( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client v2 object creation failed", err) - return - } - - // Enable to debug - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - location := "us-east-1" - // Make a new bucket. - function = "MakeBucket(bucketName, location)" - functionAll = "MakeBucket(bucketName, location)" - args = map[string]interface{}{ - "bucketName": bucketName, - "location": location, - } - err = c.MakeBucket(bucketName, location) - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - // Generate a random file name. - fileName := randString(60, rand.NewSource(time.Now().UnixNano()), "") - file, err := os.Create(fileName) - if err != nil { - logError(testName, function, args, startTime, "", "file create failed", err) - return - } - for i := 0; i < 3; i++ { - buf := make([]byte, rand.Intn(1<<19)) - _, err = file.Write(buf) - if err != nil { - logError(testName, function, args, startTime, "", "file write failed", err) - return - } - } - file.Close() - - // Verify if bucket exits and you have access. - var exists bool - function = "BucketExists(bucketName)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - } - exists, err = c.BucketExists(bucketName) - if err != nil { - logError(testName, function, args, startTime, "", "BucketExists failed", err) - return - } - if !exists { - logError(testName, function, args, startTime, "", "Could not find existing bucket "+bucketName, err) - return - } - - // Make the bucket 'public read/write'. - function = "SetBucketPolicy(bucketName, bucketPolicy)" - functionAll += ", " + function - - readWritePolicy := `{"Version": "2012-10-17","Statement": [{"Action": ["s3:ListBucketMultipartUploads", "s3:ListBucket"],"Effect": "Allow","Principal": {"AWS": ["*"]},"Resource": ["arn:aws:s3:::` + bucketName + `"],"Sid": ""}]}` - - args = map[string]interface{}{ - "bucketName": bucketName, - "bucketPolicy": readWritePolicy, - } - err = c.SetBucketPolicy(bucketName, readWritePolicy) - - if err != nil { - logError(testName, function, args, startTime, "", "SetBucketPolicy failed", err) - return - } - - // List all buckets. - function = "ListBuckets()" - functionAll += ", " + function - args = nil - buckets, err := c.ListBuckets() - if len(buckets) == 0 { - logError(testName, function, args, startTime, "", "List buckets cannot be empty", err) - return - } - if err != nil { - logError(testName, function, args, startTime, "", "ListBuckets failed", err) - return - } - - // Verify if previously created bucket is listed in list buckets. - bucketFound := false - for _, bucket := range buckets { - if bucket.Name == bucketName { - bucketFound = true - } - } - - // If bucket not found error out. - if !bucketFound { - logError(testName, function, args, startTime, "", "Bucket "+bucketName+"not found", err) - return - } - - objectName := bucketName + "unique" - - // Generate data - buf := bytes.Repeat([]byte("n"), rand.Intn(1<<19)) - - args = map[string]interface{}{ - "bucketName": bucketName, - "objectName": objectName, - "contentType": "", - } - n, err := c.PutObject(bucketName, objectName, bytes.NewReader(buf), int64(len(buf)), minio.PutObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - if n != int64(len(buf)) { - logError(testName, function, args, startTime, "", "Expected uploaded object length "+string(len(buf))+" got "+string(n), err) - return - } - - objectNameNoLength := objectName + "-nolength" - args["objectName"] = objectNameNoLength - n, err = c.PutObject(bucketName, objectNameNoLength, bytes.NewReader(buf), int64(len(buf)), minio.PutObjectOptions{ContentType: "binary/octet-stream"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - - if n != int64(len(buf)) { - logError(testName, function, args, startTime, "", "Expected uploaded object length "+string(len(buf))+" got "+string(n), err) - return - } - - // Instantiate a done channel to close all listing. - doneCh := make(chan struct{}) - defer close(doneCh) - - objFound := false - isRecursive := true // Recursive is true. - function = "ListObjects(bucketName, objectName, isRecursive, doneCh)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - "objectName": objectName, - "isRecursive": isRecursive, - } - for obj := range c.ListObjects(bucketName, objectName, isRecursive, doneCh) { - if obj.Key == objectName { - objFound = true - break - } - } - if !objFound { - logError(testName, function, args, startTime, "", "Could not find existing object "+objectName, err) - return - } - - incompObjNotFound := true - function = "ListIncompleteUploads(bucketName, objectName, isRecursive, doneCh)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - "objectName": objectName, - "isRecursive": isRecursive, - } - for objIncompl := range c.ListIncompleteUploads(bucketName, objectName, isRecursive, doneCh) { - if objIncompl.Key != "" { - incompObjNotFound = false - break - } - } - if !incompObjNotFound { - logError(testName, function, args, startTime, "", "Unexpected dangling incomplete upload found", err) - return - } - - function = "GetObject(bucketName, objectName)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - "objectName": objectName, - } - newReader, err := c.GetObject(bucketName, objectName, minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "GetObject failed", err) - return - } - - newReadBytes, err := ioutil.ReadAll(newReader) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAll failed", err) - return - } - newReader.Close() - - if !bytes.Equal(newReadBytes, buf) { - logError(testName, function, args, startTime, "", "Bytes mismatch", err) - return - } - - function = "FGetObject(bucketName, objectName, fileName)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - "objectName": objectName, - "fileName": fileName + "-f", - } - err = c.FGetObject(bucketName, objectName, fileName+"-f", minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "FgetObject failed", err) - return - } - - // Generate presigned HEAD object url. - function = "PresignedHeadObject(bucketName, objectName, expires, reqParams)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - "objectName": objectName, - "expires": 3600 * time.Second, - } - presignedHeadURL, err := c.PresignedHeadObject(bucketName, objectName, 3600*time.Second, nil) - if err != nil { - logError(testName, function, args, startTime, "", "PresignedHeadObject failed", err) - return - } - // Verify if presigned url works. - resp, err := http.Head(presignedHeadURL.String()) - if err != nil { - logError(testName, function, args, startTime, "", "PresignedHeadObject URL head request failed", err) - return - } - if resp.StatusCode != http.StatusOK { - logError(testName, function, args, startTime, "", "PresignedHeadObject URL returns status "+string(resp.StatusCode), err) - return - } - if resp.Header.Get("ETag") == "" { - logError(testName, function, args, startTime, "", "Got empty ETag", err) - return - } - resp.Body.Close() - - // Generate presigned GET object url. - function = "PresignedGetObject(bucketName, objectName, expires, reqParams)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - "objectName": objectName, - "expires": 3600 * time.Second, - } - presignedGetURL, err := c.PresignedGetObject(bucketName, objectName, 3600*time.Second, nil) - if err != nil { - logError(testName, function, args, startTime, "", "PresignedGetObject failed", err) - return - } - // Verify if presigned url works. - resp, err = http.Get(presignedGetURL.String()) - if err != nil { - logError(testName, function, args, startTime, "", "PresignedGetObject URL GET request failed", err) - return - } - if resp.StatusCode != http.StatusOK { - logError(testName, function, args, startTime, "", "PresignedGetObject URL returns status "+string(resp.StatusCode), err) - return - } - newPresignedBytes, err := ioutil.ReadAll(resp.Body) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAll failed", err) - return - } - resp.Body.Close() - if !bytes.Equal(newPresignedBytes, buf) { - logError(testName, function, args, startTime, "", "Bytes mismatch", err) - return - } - - // Set request parameters. - reqParams := make(url.Values) - reqParams.Set("response-content-disposition", "attachment; filename=\"test.txt\"") - // Generate presigned GET object url. - args["reqParams"] = reqParams - presignedGetURL, err = c.PresignedGetObject(bucketName, objectName, 3600*time.Second, reqParams) - if err != nil { - logError(testName, function, args, startTime, "", "PresignedGetObject failed", err) - return - } - // Verify if presigned url works. - resp, err = http.Get(presignedGetURL.String()) - if err != nil { - logError(testName, function, args, startTime, "", "PresignedGetObject URL GET request failed", err) - return - } - if resp.StatusCode != http.StatusOK { - logError(testName, function, args, startTime, "", "PresignedGetObject URL returns status "+string(resp.StatusCode), err) - return - } - newPresignedBytes, err = ioutil.ReadAll(resp.Body) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAll failed", err) - return - } - if !bytes.Equal(newPresignedBytes, buf) { - logError(testName, function, args, startTime, "", "Bytes mismatch", err) - return - } - // Verify content disposition. - if resp.Header.Get("Content-Disposition") != "attachment; filename=\"test.txt\"" { - logError(testName, function, args, startTime, "", "wrong Content-Disposition received ", err) - return - } - - function = "PresignedPutObject(bucketName, objectName, expires)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - "objectName": objectName + "-presigned", - "expires": 3600 * time.Second, - } - presignedPutURL, err := c.PresignedPutObject(bucketName, objectName+"-presigned", 3600*time.Second) - if err != nil { - logError(testName, function, args, startTime, "", "PresignedPutObject failed", err) - return - } - - // Generate data more than 32K - buf = bytes.Repeat([]byte("1"), rand.Intn(1<<10)+32*1024) - - req, err := http.NewRequest("PUT", presignedPutURL.String(), bytes.NewReader(buf)) - if err != nil { - logError(testName, function, args, startTime, "", "HTTP request to PresignedPutObject URL failed", err) - return - } - httpClient := &http.Client{ - // Setting a sensible time out of 30secs to wait for response - // headers. Request is pro-actively cancelled after 30secs - // with no response. - Timeout: 30 * time.Second, - Transport: http.DefaultTransport, - } - resp, err = httpClient.Do(req) - if err != nil { - logError(testName, function, args, startTime, "", "HTTP request to PresignedPutObject URL failed", err) - return - } - - function = "GetObject(bucketName, objectName)" - functionAll += ", " + function - args = map[string]interface{}{ - "bucketName": bucketName, - "objectName": objectName + "-presigned", - } - newReader, err = c.GetObject(bucketName, objectName+"-presigned", minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "GetObject failed", err) - return - } - - newReadBytes, err = ioutil.ReadAll(newReader) - if err != nil { - logError(testName, function, args, startTime, "", "ReadAll failed", err) - return - } - newReader.Close() - - if !bytes.Equal(newReadBytes, buf) { - logError(testName, function, args, startTime, "", "Bytes mismatch", err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - if err = os.Remove(fileName); err != nil { - logError(testName, function, args, startTime, "", "File remove failed", err) - return - } - if err = os.Remove(fileName + "-f"); err != nil { - logError(testName, function, args, startTime, "", "File removes failed", err) - return - } - successLogger(testName, functionAll, args, startTime).Info() -} - -// Test get object with GetObjectWithContext -func testGetObjectWithContext() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "GetObjectWithContext(ctx, bucketName, objectName)" - args := map[string]interface{}{ - "ctx": "", - "bucketName": "", - "objectName": "", - } - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.NewV4( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client v4 object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - bufSize := dataFileMap["datafile-33-kB"] - var reader = getDataReader("datafile-33-kB") - defer reader.Close() - // Save the data - objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "") - args["objectName"] = objectName - - _, err = c.PutObject(bucketName, objectName, reader, int64(bufSize), minio.PutObjectOptions{ContentType: "binary/octet-stream"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - - ctx, cancel := context.WithTimeout(context.Background(), 1*time.Nanosecond) - args["ctx"] = ctx - defer cancel() - - r, err := c.GetObjectWithContext(ctx, bucketName, objectName, minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "GetObjectWithContext failed unexpectedly", err) - return - } - - if _, err = r.Stat(); err == nil { - logError(testName, function, args, startTime, "", "GetObjectWithContext should fail on short timeout", err) - return - } - r.Close() - - ctx, cancel = context.WithTimeout(context.Background(), 1*time.Hour) - args["ctx"] = ctx - defer cancel() - - // Read the data back - r, err = c.GetObjectWithContext(ctx, bucketName, objectName, minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "GetObjectWithContext failed", err) - return - } - - st, err := r.Stat() - if err != nil { - logError(testName, function, args, startTime, "", "object Stat call failed", err) - return - } - if st.Size != int64(bufSize) { - logError(testName, function, args, startTime, "", "Number of bytes in stat does not match: want "+string(bufSize)+", got"+string(st.Size), err) - return - } - if err := r.Close(); err != nil { - logError(testName, function, args, startTime, "", "object Close() call failed", err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() - -} - -// Test get object with FGetObjectWithContext -func testFGetObjectWithContext() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "FGetObjectWithContext(ctx, bucketName, objectName, fileName)" - args := map[string]interface{}{ - "ctx": "", - "bucketName": "", - "objectName": "", - "fileName": "", - } - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.NewV4( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client v4 object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - bufSize := dataFileMap["datafile-1-MB"] - var reader = getDataReader("datafile-1-MB") - defer reader.Close() - // Save the data - objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "") - args["objectName"] = objectName - - _, err = c.PutObject(bucketName, objectName, reader, int64(bufSize), minio.PutObjectOptions{ContentType: "binary/octet-stream"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject failed", err) - return - } - - ctx, cancel := context.WithTimeout(context.Background(), 1*time.Nanosecond) - args["ctx"] = ctx - defer cancel() - - fileName := "tempfile-context" - args["fileName"] = fileName - // Read the data back - err = c.FGetObjectWithContext(ctx, bucketName, objectName, fileName+"-f", minio.GetObjectOptions{}) - if err == nil { - logError(testName, function, args, startTime, "", "FGetObjectWithContext should fail on short timeout", err) - return - } - ctx, cancel = context.WithTimeout(context.Background(), 1*time.Hour) - defer cancel() - - // Read the data back - err = c.FGetObjectWithContext(ctx, bucketName, objectName, fileName+"-fcontext", minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "FGetObjectWithContext with long timeout failed", err) - return - } - if err = os.Remove(fileName + "-fcontext"); err != nil { - logError(testName, function, args, startTime, "", "Remove file failed", err) - return - } - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() - -} - -// Test validates putObject with context to see if request cancellation is honored for V2. -func testPutObjectWithContextV2() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "PutObjectWithContext(ctx, bucketName, objectName, reader, size, opts)" - args := map[string]interface{}{ - "ctx": "", - "bucketName": "", - "objectName": "", - "size": "", - "opts": "", - } - // Instantiate new minio client object. - c, err := minio.NewV2( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client v2 object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Make a new bucket. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - defer c.RemoveBucket(bucketName) - bufSize := dataFileMap["datatfile-33-kB"] - var reader = getDataReader("datafile-33-kB") - defer reader.Close() - - objectName := fmt.Sprintf("test-file-%v", rand.Uint32()) - args["objectName"] = objectName - - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - args["ctx"] = ctx - args["size"] = bufSize - defer cancel() - - _, err = c.PutObjectWithContext(ctx, bucketName, objectName, reader, int64(bufSize), minio.PutObjectOptions{ContentType: "binary/octet-stream"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObjectWithContext with short timeout failed", err) - return - } - - ctx, cancel = context.WithTimeout(context.Background(), 1*time.Hour) - args["ctx"] = ctx - - defer cancel() - reader = getDataReader("datafile-33-kB") - defer reader.Close() - _, err = c.PutObjectWithContext(ctx, bucketName, objectName, reader, int64(bufSize), minio.PutObjectOptions{ContentType: "binary/octet-stream"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObjectWithContext with long timeout failed", err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() - -} - -// Test get object with GetObjectWithContext -func testGetObjectWithContextV2() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "GetObjectWithContext(ctx, bucketName, objectName)" - args := map[string]interface{}{ - "ctx": "", - "bucketName": "", - "objectName": "", - } - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.NewV2( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client v2 object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - bufSize := dataFileMap["datafile-33-kB"] - var reader = getDataReader("datafile-33-kB") - defer reader.Close() - // Save the data - objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "") - args["objectName"] = objectName - - _, err = c.PutObject(bucketName, objectName, reader, int64(bufSize), minio.PutObjectOptions{ContentType: "binary/octet-stream"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject call failed", err) - return - } - - ctx, cancel := context.WithTimeout(context.Background(), 1*time.Nanosecond) - args["ctx"] = ctx - defer cancel() - - r, err := c.GetObjectWithContext(ctx, bucketName, objectName, minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "GetObjectWithContext failed unexpectedly", err) - return - } - if _, err = r.Stat(); err == nil { - logError(testName, function, args, startTime, "", "GetObjectWithContext should fail on short timeout", err) - return - } - r.Close() - - ctx, cancel = context.WithTimeout(context.Background(), 1*time.Hour) - defer cancel() - - // Read the data back - r, err = c.GetObjectWithContext(ctx, bucketName, objectName, minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "GetObjectWithContext shouldn't fail on longer timeout", err) - return - } - - st, err := r.Stat() - if err != nil { - logError(testName, function, args, startTime, "", "object Stat call failed", err) - return - } - if st.Size != int64(bufSize) { - logError(testName, function, args, startTime, "", "Number of bytes in stat does not match, expected "+string(bufSize)+" got "+string(st.Size), err) - return - } - if err := r.Close(); err != nil { - logError(testName, function, args, startTime, "", " object Close() call failed", err) - return - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() - -} - -// Test get object with FGetObjectWithContext -func testFGetObjectWithContextV2() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "FGetObjectWithContext(ctx, bucketName, objectName,fileName)" - args := map[string]interface{}{ - "ctx": "", - "bucketName": "", - "objectName": "", - "fileName": "", - } - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.NewV2( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client v2 object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket call failed", err) - return - } - - bufSize := dataFileMap["datatfile-1-MB"] - var reader = getDataReader("datafile-1-MB") - defer reader.Close() - // Save the data - objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "") - args["objectName"] = objectName - - _, err = c.PutObject(bucketName, objectName, reader, int64(bufSize), minio.PutObjectOptions{ContentType: "binary/octet-stream"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject call failed", err) - return - } - - ctx, cancel := context.WithTimeout(context.Background(), 1*time.Nanosecond) - args["ctx"] = ctx - defer cancel() - - fileName := "tempfile-context" - args["fileName"] = fileName - - // Read the data back - err = c.FGetObjectWithContext(ctx, bucketName, objectName, fileName+"-f", minio.GetObjectOptions{}) - if err == nil { - logError(testName, function, args, startTime, "", "FGetObjectWithContext should fail on short timeout", err) - return - } - ctx, cancel = context.WithTimeout(context.Background(), 1*time.Hour) - defer cancel() - - // Read the data back - err = c.FGetObjectWithContext(ctx, bucketName, objectName, fileName+"-fcontext", minio.GetObjectOptions{}) - if err != nil { - logError(testName, function, args, startTime, "", "FGetObjectWithContext call shouldn't fail on long timeout", err) - return - } - - if err = os.Remove(fileName + "-fcontext"); err != nil { - logError(testName, function, args, startTime, "", "Remove file failed", err) - return - } - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() - -} - -// Test list object v1 and V2 storage class fields -func testListObjects() { - // initialize logging params - startTime := time.Now() - testName := getFuncName() - function := "ListObjects(bucketName, objectPrefix, recursive, doneCh)" - args := map[string]interface{}{ - "bucketName": "", - "objectPrefix": "", - "recursive": "true", - } - // Seed random based on current time. - rand.Seed(time.Now().Unix()) - - // Instantiate new minio client object. - c, err := minio.New( - os.Getenv(serverEndpoint), - os.Getenv(accessKey), - os.Getenv(secretKey), - mustParseBool(os.Getenv(enableHTTPS)), - ) - if err != nil { - logError(testName, function, args, startTime, "", "Minio client v4 object creation failed", err) - return - } - - // Enable tracing, write to stderr. - // c.TraceOn(os.Stderr) - - // Set user agent. - c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0") - - // Generate a new random bucket name. - bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-") - args["bucketName"] = bucketName - - // Make a new bucket. - err = c.MakeBucket(bucketName, "us-east-1") - if err != nil { - logError(testName, function, args, startTime, "", "MakeBucket failed", err) - return - } - - bufSize := dataFileMap["datafile-33-kB"] - var reader = getDataReader("datafile-33-kB") - defer reader.Close() - - // Save the data - objectName1 := randString(60, rand.NewSource(time.Now().UnixNano()), "") - - _, err = c.PutObject(bucketName, objectName1, reader, int64(bufSize), minio.PutObjectOptions{ContentType: "binary/octet-stream", StorageClass: "STANDARD"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject1 call failed", err) - return - } - - bufSize1 := dataFileMap["datafile-33-kB"] - var reader1 = getDataReader("datafile-33-kB") - defer reader1.Close() - objectName2 := randString(60, rand.NewSource(time.Now().UnixNano()), "") - - _, err = c.PutObject(bucketName, objectName2, reader1, int64(bufSize1), minio.PutObjectOptions{ContentType: "binary/octet-stream", StorageClass: "REDUCED_REDUNDANCY"}) - if err != nil { - logError(testName, function, args, startTime, "", "PutObject2 call failed", err) - return - } - - // Create a done channel to control 'ListObjects' go routine. - doneCh := make(chan struct{}) - // Exit cleanly upon return. - defer close(doneCh) - - // check for storage-class from ListObjects result - for objInfo := range c.ListObjects(bucketName, "", true, doneCh) { - if objInfo.Err != nil { - logError(testName, function, args, startTime, "", "ListObjects failed unexpectedly", err) - return - } - if objInfo.Key == objectName1 && objInfo.StorageClass != "STANDARD" { - // Ignored as Gateways (Azure/GCS etc) wont return storage class - ignoredLog(testName, function, args, startTime, "ListObjects doesn't return expected storage class").Info() - } - if objInfo.Key == objectName2 && objInfo.StorageClass != "REDUCED_REDUNDANCY" { - // Ignored as Gateways (Azure/GCS etc) wont return storage class - ignoredLog(testName, function, args, startTime, "ListObjects doesn't return expected storage class").Info() - } - } - - // check for storage-class from ListObjectsV2 result - for objInfo := range c.ListObjectsV2(bucketName, "", true, doneCh) { - if objInfo.Err != nil { - logError(testName, function, args, startTime, "", "ListObjectsV2 failed unexpectedly", err) - return - } - if objInfo.Key == objectName1 && objInfo.StorageClass != "STANDARD" { - // Ignored as Gateways (Azure/GCS etc) wont return storage class - ignoredLog(testName, function, args, startTime, "ListObjectsV2 doesn't return expected storage class").Info() - } - if objInfo.Key == objectName2 && objInfo.StorageClass != "REDUCED_REDUNDANCY" { - // Ignored as Gateways (Azure/GCS etc) wont return storage class - ignoredLog(testName, function, args, startTime, "ListObjectsV2 doesn't return expected storage class").Info() - } - } - - // Delete all objects and buckets - if err = cleanupBucket(bucketName, c); err != nil { - logError(testName, function, args, startTime, "", "Cleanup failed", err) - return - } - - successLogger(testName, function, args, startTime).Info() - -} - -// Convert string to bool and always return false if any error -func mustParseBool(str string) bool { - b, err := strconv.ParseBool(str) - if err != nil { - return false - } - return b -} - -func main() { - // Output to stdout instead of the default stderr - log.SetOutput(os.Stdout) - // create custom formatter - mintFormatter := mintJSONFormatter{} - // set custom formatter - log.SetFormatter(&mintFormatter) - // log Info or above -- success cases are Info level, failures are Fatal level - log.SetLevel(log.InfoLevel) - - tls := mustParseBool(os.Getenv(enableHTTPS)) - // execute tests - if isFullMode() { - testMakeBucketErrorV2() - testGetObjectClosedTwiceV2() - testFPutObjectV2() - testMakeBucketRegionsV2() - testGetObjectReadSeekFunctionalV2() - testGetObjectReadAtFunctionalV2() - testCopyObjectV2() - testFunctionalV2() - testComposeObjectErrorCasesV2() - testCompose10KSourcesV2() - testUserMetadataCopyingV2() - testPutObject0ByteV2() - testPutObjectNoLengthV2() - testPutObjectsUnknownV2() - testGetObjectWithContextV2() - testFPutObjectWithContextV2() - testFGetObjectWithContextV2() - testPutObjectWithContextV2() - testMakeBucketError() - testMakeBucketRegions() - testPutObjectWithMetadata() - testPutObjectReadAt() - testPutObjectStreaming() - testGetObjectSeekEnd() - testGetObjectClosedTwice() - testRemoveMultipleObjects() - testFPutObjectMultipart() - testFPutObject() - testGetObjectReadSeekFunctional() - testGetObjectReadAtFunctional() - testPresignedPostPolicy() - testCopyObject() - testComposeObjectErrorCases() - testCompose10KSources() - testUserMetadataCopying() - testBucketNotification() - testFunctional() - testGetObjectModified() - testPutObjectUploadSeekedObject() - testGetObjectWithContext() - testFPutObjectWithContext() - testFGetObjectWithContext() - testPutObjectWithContext() - testStorageClassMetadataPutObject() - testStorageClassInvalidMetadataPutObject() - testStorageClassMetadataCopyObject() - testPutObjectWithContentLanguage() - testListObjects() - - // SSE-C tests will only work over TLS connection. - if tls { - testEncryptionPutGet() - testEncryptionFPut() - testEncryptedGetObjectReadAtFunctional() - testEncryptedGetObjectReadSeekFunctional() - testEncryptedCopyObjectV2() - testEncryptedCopyObject() - testEncryptedEmptyObject() - testDecryptedCopyObject() - } - } else { - testFunctional() - testFunctionalV2() - } -} diff --git a/vendor/github.com/minio/minio-go/pkg/credentials/credentials.go b/vendor/github.com/minio/minio-go/pkg/credentials/credentials.go deleted file mode 100644 index 4bfdad413..000000000 --- a/vendor/github.com/minio/minio-go/pkg/credentials/credentials.go +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package credentials - -import ( - "sync" - "time" -) - -// A Value is the AWS credentials value for individual credential fields. -type Value struct { - // AWS Access key ID - AccessKeyID string - - // AWS Secret Access Key - SecretAccessKey string - - // AWS Session Token - SessionToken string - - // Signature Type. - SignerType SignatureType -} - -// A Provider is the interface for any component which will provide credentials -// Value. A provider is required to manage its own Expired state, and what to -// be expired means. -type Provider interface { - // Retrieve returns nil if it successfully retrieved the value. - // Error is returned if the value were not obtainable, or empty. - Retrieve() (Value, error) - - // IsExpired returns if the credentials are no longer valid, and need - // to be retrieved. - IsExpired() bool -} - -// A Expiry provides shared expiration logic to be used by credentials -// providers to implement expiry functionality. -// -// The best method to use this struct is as an anonymous field within the -// provider's struct. -// -// Example: -// type IAMCredentialProvider struct { -// Expiry -// ... -// } -type Expiry struct { - // The date/time when to expire on - expiration time.Time - - // If set will be used by IsExpired to determine the current time. - // Defaults to time.Now if CurrentTime is not set. - CurrentTime func() time.Time -} - -// SetExpiration sets the expiration IsExpired will check when called. -// -// If window is greater than 0 the expiration time will be reduced by the -// window value. -// -// Using a window is helpful to trigger credentials to expire sooner than -// the expiration time given to ensure no requests are made with expired -// tokens. -func (e *Expiry) SetExpiration(expiration time.Time, window time.Duration) { - e.expiration = expiration - if window > 0 { - e.expiration = e.expiration.Add(-window) - } -} - -// IsExpired returns if the credentials are expired. -func (e *Expiry) IsExpired() bool { - if e.CurrentTime == nil { - e.CurrentTime = time.Now - } - return e.expiration.Before(e.CurrentTime()) -} - -// Credentials - A container for synchronous safe retrieval of credentials Value. -// Credentials will cache the credentials value until they expire. Once the value -// expires the next Get will attempt to retrieve valid credentials. -// -// Credentials is safe to use across multiple goroutines and will manage the -// synchronous state so the Providers do not need to implement their own -// synchronization. -// -// The first Credentials.Get() will always call Provider.Retrieve() to get the -// first instance of the credentials Value. All calls to Get() after that -// will return the cached credentials Value until IsExpired() returns true. -type Credentials struct { - sync.Mutex - - creds Value - forceRefresh bool - provider Provider -} - -// New returns a pointer to a new Credentials with the provider set. -func New(provider Provider) *Credentials { - return &Credentials{ - provider: provider, - forceRefresh: true, - } -} - -// Get returns the credentials value, or error if the credentials Value failed -// to be retrieved. -// -// Will return the cached credentials Value if it has not expired. If the -// credentials Value has expired the Provider's Retrieve() will be called -// to refresh the credentials. -// -// If Credentials.Expire() was called the credentials Value will be force -// expired, and the next call to Get() will cause them to be refreshed. -func (c *Credentials) Get() (Value, error) { - c.Lock() - defer c.Unlock() - - if c.isExpired() { - creds, err := c.provider.Retrieve() - if err != nil { - return Value{}, err - } - c.creds = creds - c.forceRefresh = false - } - - return c.creds, nil -} - -// Expire expires the credentials and forces them to be retrieved on the -// next call to Get(). -// -// This will override the Provider's expired state, and force Credentials -// to call the Provider's Retrieve(). -func (c *Credentials) Expire() { - c.Lock() - defer c.Unlock() - - c.forceRefresh = true -} - -// IsExpired returns if the credentials are no longer valid, and need -// to be refreshed. -// -// If the Credentials were forced to be expired with Expire() this will -// reflect that override. -func (c *Credentials) IsExpired() bool { - c.Lock() - defer c.Unlock() - - return c.isExpired() -} - -// isExpired helper method wrapping the definition of expired credentials. -func (c *Credentials) isExpired() bool { - return c.forceRefresh || c.provider.IsExpired() -} diff --git a/vendor/github.com/minio/minio-go/pkg/credentials/doc.go b/vendor/github.com/minio/minio-go/pkg/credentials/doc.go deleted file mode 100644 index c48784ba8..000000000 --- a/vendor/github.com/minio/minio-go/pkg/credentials/doc.go +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// Package credentials provides credential retrieval and management -// for S3 compatible object storage. -// -// By default the Credentials.Get() will cache the successful result of a -// Provider's Retrieve() until Provider.IsExpired() returns true. At which -// point Credentials will call Provider's Retrieve() to get new credential Value. -// -// The Provider is responsible for determining when credentials have expired. -// It is also important to note that Credentials will always call Retrieve the -// first time Credentials.Get() is called. -// -// Example of using the environment variable credentials. -// -// creds := NewFromEnv() -// // Retrieve the credentials value -// credValue, err := creds.Get() -// if err != nil { -// // handle error -// } -// -// Example of forcing credentials to expire and be refreshed on the next Get(). -// This may be helpful to proactively expire credentials and refresh them sooner -// than they would naturally expire on their own. -// -// creds := NewFromIAM("") -// creds.Expire() -// credsValue, err := creds.Get() -// // New credentials will be retrieved instead of from cache. -// -// -// Custom Provider -// -// Each Provider built into this package also provides a helper method to generate -// a Credentials pointer setup with the provider. To use a custom Provider just -// create a type which satisfies the Provider interface and pass it to the -// NewCredentials method. -// -// type MyProvider struct{} -// func (m *MyProvider) Retrieve() (Value, error) {...} -// func (m *MyProvider) IsExpired() bool {...} -// -// creds := NewCredentials(&MyProvider{}) -// credValue, err := creds.Get() -// -package credentials diff --git a/vendor/github.com/minio/minio-go/pkg/credentials/iam_aws.go b/vendor/github.com/minio/minio-go/pkg/credentials/iam_aws.go deleted file mode 100644 index 637df7466..000000000 --- a/vendor/github.com/minio/minio-go/pkg/credentials/iam_aws.go +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package credentials - -import ( - "bufio" - "encoding/json" - "errors" - "net/http" - "net/url" - "path" - "time" -) - -// DefaultExpiryWindow - Default expiry window. -// ExpiryWindow will allow the credentials to trigger refreshing -// prior to the credentials actually expiring. This is beneficial -// so race conditions with expiring credentials do not cause -// request to fail unexpectedly due to ExpiredTokenException exceptions. -const DefaultExpiryWindow = time.Second * 10 // 10 secs - -// A IAM retrieves credentials from the EC2 service, and keeps track if -// those credentials are expired. -type IAM struct { - Expiry - - // Required http Client to use when connecting to IAM metadata service. - Client *http.Client - - // Custom endpoint to fetch IAM role credentials. - endpoint string -} - -// IAM Roles for Amazon EC2 -// http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html -const ( - defaultIAMRoleEndpoint = "http://169.254.169.254" - defaultIAMSecurityCredsPath = "/latest/meta-data/iam/security-credentials" -) - -// NewIAM returns a pointer to a new Credentials object wrapping -// the IAM. Takes a ConfigProvider to create a EC2Metadata client. -// The ConfigProvider is satisfied by the session.Session type. -func NewIAM(endpoint string) *Credentials { - if endpoint == "" { - endpoint = defaultIAMRoleEndpoint - } - p := &IAM{ - Client: &http.Client{ - Transport: http.DefaultTransport, - }, - endpoint: endpoint, - } - return New(p) -} - -// Retrieve retrieves credentials from the EC2 service. -// Error will be returned if the request fails, or unable to extract -// the desired -func (m *IAM) Retrieve() (Value, error) { - roleCreds, err := getCredentials(m.Client, m.endpoint) - if err != nil { - return Value{}, err - } - - // Expiry window is set to 10secs. - m.SetExpiration(roleCreds.Expiration, DefaultExpiryWindow) - - return Value{ - AccessKeyID: roleCreds.AccessKeyID, - SecretAccessKey: roleCreds.SecretAccessKey, - SessionToken: roleCreds.Token, - SignerType: SignatureV4, - }, nil -} - -// A ec2RoleCredRespBody provides the shape for unmarshaling credential -// request responses. -type ec2RoleCredRespBody struct { - // Success State - Expiration time.Time - AccessKeyID string - SecretAccessKey string - Token string - - // Error state - Code string - Message string - - // Unused params. - LastUpdated time.Time - Type string -} - -// Get the final IAM role URL where the request will -// be sent to fetch the rolling access credentials. -// http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html -func getIAMRoleURL(endpoint string) (*url.URL, error) { - if endpoint == "" { - endpoint = defaultIAMRoleEndpoint - } - u, err := url.Parse(endpoint) - if err != nil { - return nil, err - } - u.Path = defaultIAMSecurityCredsPath - return u, nil -} - -// listRoleNames lists of credential role names associated -// with the current EC2 service. If there are no credentials, -// or there is an error making or receiving the request. -// http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html -func listRoleNames(client *http.Client, u *url.URL) ([]string, error) { - req, err := http.NewRequest("GET", u.String(), nil) - if err != nil { - return nil, err - } - resp, err := client.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return nil, errors.New(resp.Status) - } - - credsList := []string{} - s := bufio.NewScanner(resp.Body) - for s.Scan() { - credsList = append(credsList, s.Text()) - } - - if err := s.Err(); err != nil { - return nil, err - } - - return credsList, nil -} - -// getCredentials - obtains the credentials from the IAM role name associated with -// the current EC2 service. -// -// If the credentials cannot be found, or there is an error -// reading the response an error will be returned. -func getCredentials(client *http.Client, endpoint string) (ec2RoleCredRespBody, error) { - // http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html - u, err := getIAMRoleURL(endpoint) - if err != nil { - return ec2RoleCredRespBody{}, err - } - - // http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html - roleNames, err := listRoleNames(client, u) - if err != nil { - return ec2RoleCredRespBody{}, err - } - - if len(roleNames) == 0 { - return ec2RoleCredRespBody{}, errors.New("No IAM roles attached to this EC2 service") - } - - // http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html - // - An instance profile can contain only one IAM role. This limit cannot be increased. - roleName := roleNames[0] - - // http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html - // The following command retrieves the security credentials for an - // IAM role named `s3access`. - // - // $ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/s3access - // - u.Path = path.Join(u.Path, roleName) - req, err := http.NewRequest("GET", u.String(), nil) - if err != nil { - return ec2RoleCredRespBody{}, err - } - - resp, err := client.Do(req) - if err != nil { - return ec2RoleCredRespBody{}, err - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return ec2RoleCredRespBody{}, errors.New(resp.Status) - } - - respCreds := ec2RoleCredRespBody{} - if err := json.NewDecoder(resp.Body).Decode(&respCreds); err != nil { - return ec2RoleCredRespBody{}, err - } - - if respCreds.Code != "Success" { - // If an error code was returned something failed requesting the role. - return ec2RoleCredRespBody{}, errors.New(respCreds.Message) - } - - return respCreds, nil -} diff --git a/vendor/github.com/minio/minio-go/pkg/credentials/static.go b/vendor/github.com/minio/minio-go/pkg/credentials/static.go deleted file mode 100644 index 8b0ba711c..000000000 --- a/vendor/github.com/minio/minio-go/pkg/credentials/static.go +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package credentials - -// A Static is a set of credentials which are set programmatically, -// and will never expire. -type Static struct { - Value -} - -// NewStaticV2 returns a pointer to a new Credentials object -// wrapping a static credentials value provider, signature is -// set to v2. If access and secret are not specified then -// regardless of signature type set it Value will return -// as anonymous. -func NewStaticV2(id, secret, token string) *Credentials { - return NewStatic(id, secret, token, SignatureV2) -} - -// NewStaticV4 is similar to NewStaticV2 with similar considerations. -func NewStaticV4(id, secret, token string) *Credentials { - return NewStatic(id, secret, token, SignatureV4) -} - -// NewStatic returns a pointer to a new Credentials object -// wrapping a static credentials value provider. -func NewStatic(id, secret, token string, signerType SignatureType) *Credentials { - return New(&Static{ - Value: Value{ - AccessKeyID: id, - SecretAccessKey: secret, - SessionToken: token, - SignerType: signerType, - }, - }) -} - -// Retrieve returns the static credentials. -func (s *Static) Retrieve() (Value, error) { - if s.AccessKeyID == "" || s.SecretAccessKey == "" { - // Anonymous is not an error - return Value{SignerType: SignatureAnonymous}, nil - } - return s.Value, nil -} - -// IsExpired returns if the credentials are expired. -// -// For Static, the credentials never expired. -func (s *Static) IsExpired() bool { - return false -} diff --git a/vendor/github.com/minio/minio-go/pkg/s3signer/utils.go b/vendor/github.com/minio/minio-go/pkg/s3signer/utils.go deleted file mode 100644 index 33b175208..000000000 --- a/vendor/github.com/minio/minio-go/pkg/s3signer/utils.go +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package s3signer - -import ( - "crypto/hmac" - "crypto/sha256" - "net/http" -) - -// unsignedPayload - value to be set to X-Amz-Content-Sha256 header when -const unsignedPayload = "UNSIGNED-PAYLOAD" - -// sum256 calculate sha256 sum for an input byte array. -func sum256(data []byte) []byte { - hash := sha256.New() - hash.Write(data) - return hash.Sum(nil) -} - -// sumHMAC calculate hmac between two input byte array. -func sumHMAC(key []byte, data []byte) []byte { - hash := hmac.New(sha256.New, key) - hash.Write(data) - return hash.Sum(nil) -} - -// getHostAddr returns host header if available, otherwise returns host from URL -func getHostAddr(req *http.Request) string { - if req.Host != "" { - return req.Host - } - return req.URL.Host -} diff --git a/vendor/github.com/minio/minio-go/pkg/s3utils/utils.go b/vendor/github.com/minio/minio-go/pkg/s3utils/utils.go deleted file mode 100644 index bfeb73e41..000000000 --- a/vendor/github.com/minio/minio-go/pkg/s3utils/utils.go +++ /dev/null @@ -1,302 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package s3utils - -import ( - "bytes" - "encoding/hex" - "errors" - "net" - "net/url" - "regexp" - "sort" - "strings" - "unicode/utf8" -) - -// Sentinel URL is the default url value which is invalid. -var sentinelURL = url.URL{} - -// IsValidDomain validates if input string is a valid domain name. -func IsValidDomain(host string) bool { - // See RFC 1035, RFC 3696. - host = strings.TrimSpace(host) - if len(host) == 0 || len(host) > 255 { - return false - } - // host cannot start or end with "-" - if host[len(host)-1:] == "-" || host[:1] == "-" { - return false - } - // host cannot start or end with "_" - if host[len(host)-1:] == "_" || host[:1] == "_" { - return false - } - // host cannot start or end with a "." - if host[len(host)-1:] == "." || host[:1] == "." { - return false - } - // All non alphanumeric characters are invalid. - if strings.ContainsAny(host, "`~!@#$%^&*()+={}[]|\\\"';:> 1 { - return parts[1] - } - parts = amazonS3HostHyphen.FindStringSubmatch(endpointURL.Host) - if len(parts) > 1 { - return parts[1] - } - parts = amazonS3ChinaHost.FindStringSubmatch(endpointURL.Host) - if len(parts) > 1 { - return parts[1] - } - parts = amazonS3HostDot.FindStringSubmatch(endpointURL.Host) - if len(parts) > 1 { - return parts[1] - } - return "" -} - -// IsAmazonEndpoint - Match if it is exactly Amazon S3 endpoint. -func IsAmazonEndpoint(endpointURL url.URL) bool { - if endpointURL.Host == "s3-external-1.amazonaws.com" || endpointURL.Host == "s3.amazonaws.com" { - return true - } - return GetRegionFromURL(endpointURL) != "" -} - -// IsAmazonGovCloudEndpoint - Match if it is exactly Amazon S3 GovCloud endpoint. -func IsAmazonGovCloudEndpoint(endpointURL url.URL) bool { - if endpointURL == sentinelURL { - return false - } - return (endpointURL.Host == "s3-us-gov-west-1.amazonaws.com" || - IsAmazonFIPSGovCloudEndpoint(endpointURL)) -} - -// IsAmazonFIPSGovCloudEndpoint - Match if it is exactly Amazon S3 FIPS GovCloud endpoint. -func IsAmazonFIPSGovCloudEndpoint(endpointURL url.URL) bool { - if endpointURL == sentinelURL { - return false - } - return endpointURL.Host == "s3-fips-us-gov-west-1.amazonaws.com" -} - -// IsGoogleEndpoint - Match if it is exactly Google cloud storage endpoint. -func IsGoogleEndpoint(endpointURL url.URL) bool { - if endpointURL == sentinelURL { - return false - } - return endpointURL.Host == "storage.googleapis.com" -} - -// Expects ascii encoded strings - from output of urlEncodePath -func percentEncodeSlash(s string) string { - return strings.Replace(s, "/", "%2F", -1) -} - -// QueryEncode - encodes query values in their URL encoded form. In -// addition to the percent encoding performed by urlEncodePath() used -// here, it also percent encodes '/' (forward slash) -func QueryEncode(v url.Values) string { - if v == nil { - return "" - } - var buf bytes.Buffer - keys := make([]string, 0, len(v)) - for k := range v { - keys = append(keys, k) - } - sort.Strings(keys) - for _, k := range keys { - vs := v[k] - prefix := percentEncodeSlash(EncodePath(k)) + "=" - for _, v := range vs { - if buf.Len() > 0 { - buf.WriteByte('&') - } - buf.WriteString(prefix) - buf.WriteString(percentEncodeSlash(EncodePath(v))) - } - } - return buf.String() -} - -// if object matches reserved string, no need to encode them -var reservedObjectNames = regexp.MustCompile("^[a-zA-Z0-9-_.~/]+$") - -// EncodePath encode the strings from UTF-8 byte representations to HTML hex escape sequences -// -// This is necessary since regular url.Parse() and url.Encode() functions do not support UTF-8 -// non english characters cannot be parsed due to the nature in which url.Encode() is written -// -// This function on the other hand is a direct replacement for url.Encode() technique to support -// pretty much every UTF-8 character. -func EncodePath(pathName string) string { - if reservedObjectNames.MatchString(pathName) { - return pathName - } - var encodedPathname string - for _, s := range pathName { - if 'A' <= s && s <= 'Z' || 'a' <= s && s <= 'z' || '0' <= s && s <= '9' { // §2.3 Unreserved characters (mark) - encodedPathname = encodedPathname + string(s) - continue - } - switch s { - case '-', '_', '.', '~', '/': // §2.3 Unreserved characters (mark) - encodedPathname = encodedPathname + string(s) - continue - default: - len := utf8.RuneLen(s) - if len < 0 { - // if utf8 cannot convert return the same string as is - return pathName - } - u := make([]byte, len) - utf8.EncodeRune(u, s) - for _, r := range u { - hex := hex.EncodeToString([]byte{r}) - encodedPathname = encodedPathname + "%" + strings.ToUpper(hex) - } - } - } - return encodedPathname -} - -// We support '.' with bucket names but we fallback to using path -// style requests instead for such buckets. -var ( - validBucketName = regexp.MustCompile(`^[A-Za-z0-9][A-Za-z0-9\.\-\_\:]{1,61}[A-Za-z0-9]$`) - validBucketNameStrict = regexp.MustCompile(`^[a-z0-9][a-z0-9\.\-]{1,61}[a-z0-9]$`) - ipAddress = regexp.MustCompile(`^(\d+\.){3}\d+$`) -) - -// Common checker for both stricter and basic validation. -func checkBucketNameCommon(bucketName string, strict bool) (err error) { - if strings.TrimSpace(bucketName) == "" { - return errors.New("Bucket name cannot be empty") - } - if len(bucketName) < 3 { - return errors.New("Bucket name cannot be smaller than 3 characters") - } - if len(bucketName) > 63 { - return errors.New("Bucket name cannot be greater than 63 characters") - } - if ipAddress.MatchString(bucketName) { - return errors.New("Bucket name cannot be an ip address") - } - if strings.Contains(bucketName, "..") { - return errors.New("Bucket name contains invalid characters") - } - if strict { - if !validBucketNameStrict.MatchString(bucketName) { - err = errors.New("Bucket name contains invalid characters") - } - return err - } - if !validBucketName.MatchString(bucketName) { - err = errors.New("Bucket name contains invalid characters") - } - return err -} - -// CheckValidBucketName - checks if we have a valid input bucket name. -func CheckValidBucketName(bucketName string) (err error) { - return checkBucketNameCommon(bucketName, false) -} - -// CheckValidBucketNameStrict - checks if we have a valid input bucket name. -// This is a stricter version. -// - http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html -func CheckValidBucketNameStrict(bucketName string) (err error) { - return checkBucketNameCommon(bucketName, true) -} - -// CheckValidObjectNamePrefix - checks if we have a valid input object name prefix. -// - http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html -func CheckValidObjectNamePrefix(objectName string) error { - if len(objectName) > 1024 { - return errors.New("Object name cannot be greater than 1024 characters") - } - if !utf8.ValidString(objectName) { - return errors.New("Object name with non UTF-8 strings are not supported") - } - return nil -} - -// CheckValidObjectName - checks if we have a valid input object name. -// - http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html -func CheckValidObjectName(objectName string) error { - if strings.TrimSpace(objectName) == "" { - return errors.New("Object name cannot be empty") - } - return CheckValidObjectNamePrefix(objectName) -} diff --git a/vendor/github.com/minio/minio-go/post-policy.go b/vendor/github.com/minio/minio-go/post-policy.go deleted file mode 100644 index b3ae7050a..000000000 --- a/vendor/github.com/minio/minio-go/post-policy.go +++ /dev/null @@ -1,248 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import ( - "encoding/base64" - "fmt" - "strings" - "time" -) - -// expirationDateFormat date format for expiration key in json policy. -const expirationDateFormat = "2006-01-02T15:04:05.999Z" - -// policyCondition explanation: -// http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-HTTPPOSTConstructPolicy.html -// -// Example: -// -// policyCondition { -// matchType: "$eq", -// key: "$Content-Type", -// value: "image/png", -// } -// -type policyCondition struct { - matchType string - condition string - value string -} - -// PostPolicy - Provides strict static type conversion and validation -// for Amazon S3's POST policy JSON string. -type PostPolicy struct { - // Expiration date and time of the POST policy. - expiration time.Time - // Collection of different policy conditions. - conditions []policyCondition - // ContentLengthRange minimum and maximum allowable size for the - // uploaded content. - contentLengthRange struct { - min int64 - max int64 - } - - // Post form data. - formData map[string]string -} - -// NewPostPolicy - Instantiate new post policy. -func NewPostPolicy() *PostPolicy { - p := &PostPolicy{} - p.conditions = make([]policyCondition, 0) - p.formData = make(map[string]string) - return p -} - -// SetExpires - Sets expiration time for the new policy. -func (p *PostPolicy) SetExpires(t time.Time) error { - if t.IsZero() { - return ErrInvalidArgument("No expiry time set.") - } - p.expiration = t - return nil -} - -// SetKey - Sets an object name for the policy based upload. -func (p *PostPolicy) SetKey(key string) error { - if strings.TrimSpace(key) == "" || key == "" { - return ErrInvalidArgument("Object name is empty.") - } - policyCond := policyCondition{ - matchType: "eq", - condition: "$key", - value: key, - } - if err := p.addNewPolicy(policyCond); err != nil { - return err - } - p.formData["key"] = key - return nil -} - -// SetKeyStartsWith - Sets an object name that an policy based upload -// can start with. -func (p *PostPolicy) SetKeyStartsWith(keyStartsWith string) error { - if strings.TrimSpace(keyStartsWith) == "" || keyStartsWith == "" { - return ErrInvalidArgument("Object prefix is empty.") - } - policyCond := policyCondition{ - matchType: "starts-with", - condition: "$key", - value: keyStartsWith, - } - if err := p.addNewPolicy(policyCond); err != nil { - return err - } - p.formData["key"] = keyStartsWith - return nil -} - -// SetBucket - Sets bucket at which objects will be uploaded to. -func (p *PostPolicy) SetBucket(bucketName string) error { - if strings.TrimSpace(bucketName) == "" || bucketName == "" { - return ErrInvalidArgument("Bucket name is empty.") - } - policyCond := policyCondition{ - matchType: "eq", - condition: "$bucket", - value: bucketName, - } - if err := p.addNewPolicy(policyCond); err != nil { - return err - } - p.formData["bucket"] = bucketName - return nil -} - -// SetContentType - Sets content-type of the object for this policy -// based upload. -func (p *PostPolicy) SetContentType(contentType string) error { - if strings.TrimSpace(contentType) == "" || contentType == "" { - return ErrInvalidArgument("No content type specified.") - } - policyCond := policyCondition{ - matchType: "eq", - condition: "$Content-Type", - value: contentType, - } - if err := p.addNewPolicy(policyCond); err != nil { - return err - } - p.formData["Content-Type"] = contentType - return nil -} - -// SetContentLengthRange - Set new min and max content length -// condition for all incoming uploads. -func (p *PostPolicy) SetContentLengthRange(min, max int64) error { - if min > max { - return ErrInvalidArgument("Minimum limit is larger than maximum limit.") - } - if min < 0 { - return ErrInvalidArgument("Minimum limit cannot be negative.") - } - if max < 0 { - return ErrInvalidArgument("Maximum limit cannot be negative.") - } - p.contentLengthRange.min = min - p.contentLengthRange.max = max - return nil -} - -// SetSuccessStatusAction - Sets the status success code of the object for this policy -// based upload. -func (p *PostPolicy) SetSuccessStatusAction(status string) error { - if strings.TrimSpace(status) == "" || status == "" { - return ErrInvalidArgument("Status is empty") - } - policyCond := policyCondition{ - matchType: "eq", - condition: "$success_action_status", - value: status, - } - if err := p.addNewPolicy(policyCond); err != nil { - return err - } - p.formData["success_action_status"] = status - return nil -} - -// SetUserMetadata - Set user metadata as a key/value couple. -// Can be retrieved through a HEAD request or an event. -func (p *PostPolicy) SetUserMetadata(key string, value string) error { - if strings.TrimSpace(key) == "" || key == "" { - return ErrInvalidArgument("Key is empty") - } - if strings.TrimSpace(value) == "" || value == "" { - return ErrInvalidArgument("Value is empty") - } - headerName := fmt.Sprintf("x-amz-meta-%s", key) - policyCond := policyCondition{ - matchType: "eq", - condition: fmt.Sprintf("$%s", headerName), - value: value, - } - if err := p.addNewPolicy(policyCond); err != nil { - return err - } - p.formData[headerName] = value - return nil -} - -// addNewPolicy - internal helper to validate adding new policies. -func (p *PostPolicy) addNewPolicy(policyCond policyCondition) error { - if policyCond.matchType == "" || policyCond.condition == "" || policyCond.value == "" { - return ErrInvalidArgument("Policy fields are empty.") - } - p.conditions = append(p.conditions, policyCond) - return nil -} - -// Stringer interface for printing policy in json formatted string. -func (p PostPolicy) String() string { - return string(p.marshalJSON()) -} - -// marshalJSON - Provides Marshalled JSON in bytes. -func (p PostPolicy) marshalJSON() []byte { - expirationStr := `"expiration":"` + p.expiration.Format(expirationDateFormat) + `"` - var conditionsStr string - conditions := []string{} - for _, po := range p.conditions { - conditions = append(conditions, fmt.Sprintf("[\"%s\",\"%s\",\"%s\"]", po.matchType, po.condition, po.value)) - } - if p.contentLengthRange.min != 0 || p.contentLengthRange.max != 0 { - conditions = append(conditions, fmt.Sprintf("[\"content-length-range\", %d, %d]", - p.contentLengthRange.min, p.contentLengthRange.max)) - } - if len(conditions) > 0 { - conditionsStr = `"conditions":[` + strings.Join(conditions, ",") + "]" - } - retStr := "{" - retStr = retStr + expirationStr + "," - retStr = retStr + conditionsStr - retStr = retStr + "}" - return []byte(retStr) -} - -// base64 - Produces base64 of PostPolicy's Marshalled json. -func (p PostPolicy) base64() string { - return base64.StdEncoding.EncodeToString(p.marshalJSON()) -} diff --git a/vendor/github.com/minio/minio-go/retry.go b/vendor/github.com/minio/minio-go/retry.go deleted file mode 100644 index 22c94347e..000000000 --- a/vendor/github.com/minio/minio-go/retry.go +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import ( - "net" - "net/http" - "net/url" - "strings" - "time" -) - -// MaxRetry is the maximum number of retries before stopping. -var MaxRetry = 10 - -// MaxJitter will randomize over the full exponential backoff time -const MaxJitter = 1.0 - -// NoJitter disables the use of jitter for randomizing the exponential backoff time -const NoJitter = 0.0 - -// DefaultRetryUnit - default unit multiplicative per retry. -// defaults to 1 second. -const DefaultRetryUnit = time.Second - -// DefaultRetryCap - Each retry attempt never waits no longer than -// this maximum time duration. -const DefaultRetryCap = time.Second * 30 - -// newRetryTimer creates a timer with exponentially increasing -// delays until the maximum retry attempts are reached. -func (c Client) newRetryTimer(maxRetry int, unit time.Duration, cap time.Duration, jitter float64, doneCh chan struct{}) <-chan int { - attemptCh := make(chan int) - - // computes the exponential backoff duration according to - // https://www.awsarchitectureblog.com/2015/03/backoff.html - exponentialBackoffWait := func(attempt int) time.Duration { - // normalize jitter to the range [0, 1.0] - if jitter < NoJitter { - jitter = NoJitter - } - if jitter > MaxJitter { - jitter = MaxJitter - } - - //sleep = random_between(0, min(cap, base * 2 ** attempt)) - sleep := unit * time.Duration(1< cap { - sleep = cap - } - if jitter != NoJitter { - sleep -= time.Duration(c.random.Float64() * float64(sleep) * jitter) - } - return sleep - } - - go func() { - defer close(attemptCh) - for i := 0; i < maxRetry; i++ { - select { - // Attempts start from 1. - case attemptCh <- i + 1: - case <-doneCh: - // Stop the routine. - return - } - time.Sleep(exponentialBackoffWait(i)) - } - }() - return attemptCh -} - -// isNetErrorRetryable - is network error retryable. -func isNetErrorRetryable(err error) bool { - if err == nil { - return false - } - switch err.(type) { - case net.Error: - switch err.(type) { - case *net.DNSError, *net.OpError, net.UnknownNetworkError: - return true - case *url.Error: - // For a URL error, where it replies back "connection closed" - // retry again. - if strings.Contains(err.Error(), "Connection closed by foreign host") { - return true - } - default: - if strings.Contains(err.Error(), "net/http: TLS handshake timeout") { - // If error is - tlsHandshakeTimeoutError, retry. - return true - } else if strings.Contains(err.Error(), "i/o timeout") { - // If error is - tcp timeoutError, retry. - return true - } else if strings.Contains(err.Error(), "connection timed out") { - // If err is a net.Dial timeout, retry. - return true - } else if strings.Contains(err.Error(), "net/http: HTTP/1.x transport connection broken") { - // If error is transport connection broken, retry. - return true - } - } - } - return false -} - -// List of AWS S3 error codes which are retryable. -var retryableS3Codes = map[string]struct{}{ - "RequestError": {}, - "RequestTimeout": {}, - "Throttling": {}, - "ThrottlingException": {}, - "RequestLimitExceeded": {}, - "RequestThrottled": {}, - "InternalError": {}, - "ExpiredToken": {}, - "ExpiredTokenException": {}, - "SlowDown": {}, - // Add more AWS S3 codes here. -} - -// isS3CodeRetryable - is s3 error code retryable. -func isS3CodeRetryable(s3Code string) (ok bool) { - _, ok = retryableS3Codes[s3Code] - return ok -} - -// List of HTTP status codes which are retryable. -var retryableHTTPStatusCodes = map[int]struct{}{ - 429: {}, // http.StatusTooManyRequests is not part of the Go 1.5 library, yet - http.StatusInternalServerError: {}, - http.StatusBadGateway: {}, - http.StatusServiceUnavailable: {}, - // Add more HTTP status codes here. -} - -// isHTTPStatusRetryable - is HTTP error code retryable. -func isHTTPStatusRetryable(httpStatusCode int) (ok bool) { - _, ok = retryableHTTPStatusCodes[httpStatusCode] - return ok -} diff --git a/vendor/github.com/minio/minio-go/s3-endpoints.go b/vendor/github.com/minio/minio-go/s3-endpoints.go deleted file mode 100644 index 058929501..000000000 --- a/vendor/github.com/minio/minio-go/s3-endpoints.go +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -// awsS3EndpointMap Amazon S3 endpoint map. -var awsS3EndpointMap = map[string]string{ - "us-east-1": "s3.amazonaws.com", - "us-east-2": "s3-us-east-2.amazonaws.com", - "us-west-2": "s3-us-west-2.amazonaws.com", - "us-west-1": "s3-us-west-1.amazonaws.com", - "ca-central-1": "s3-ca-central-1.amazonaws.com", - "eu-west-1": "s3-eu-west-1.amazonaws.com", - "eu-west-2": "s3-eu-west-2.amazonaws.com", - "eu-west-3": "s3-eu-west-3.amazonaws.com", - "eu-central-1": "s3-eu-central-1.amazonaws.com", - "ap-south-1": "s3-ap-south-1.amazonaws.com", - "ap-southeast-1": "s3-ap-southeast-1.amazonaws.com", - "ap-southeast-2": "s3-ap-southeast-2.amazonaws.com", - "ap-northeast-1": "s3-ap-northeast-1.amazonaws.com", - "ap-northeast-2": "s3-ap-northeast-2.amazonaws.com", - "sa-east-1": "s3-sa-east-1.amazonaws.com", - "us-gov-west-1": "s3-us-gov-west-1.amazonaws.com", - "cn-north-1": "s3.cn-north-1.amazonaws.com.cn", - "cn-northwest-1": "s3.cn-northwest-1.amazonaws.com.cn", -} - -// getS3Endpoint get Amazon S3 endpoint based on the bucket location. -func getS3Endpoint(bucketLocation string) (s3Endpoint string) { - s3Endpoint, ok := awsS3EndpointMap[bucketLocation] - if !ok { - // Default to 's3.amazonaws.com' endpoint. - s3Endpoint = "s3.amazonaws.com" - } - return s3Endpoint -} diff --git a/vendor/github.com/minio/minio-go/transport.go b/vendor/github.com/minio/minio-go/transport.go deleted file mode 100644 index 88700cfe7..000000000 --- a/vendor/github.com/minio/minio-go/transport.go +++ /dev/null @@ -1,50 +0,0 @@ -// +build go1.7 go1.8 - -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2017-2018 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import ( - "net" - "net/http" - "time" -) - -// DefaultTransport - this default transport is similar to -// http.DefaultTransport but with additional param DisableCompression -// is set to true to avoid decompressing content with 'gzip' encoding. -var DefaultTransport http.RoundTripper = &http.Transport{ - Proxy: http.ProxyFromEnvironment, - DialContext: (&net.Dialer{ - Timeout: 30 * time.Second, - KeepAlive: 30 * time.Second, - DualStack: true, - }).DialContext, - MaxIdleConns: 100, - MaxIdleConnsPerHost: 100, - IdleConnTimeout: 90 * time.Second, - TLSHandshakeTimeout: 10 * time.Second, - ExpectContinueTimeout: 1 * time.Second, - // Set this value so that the underlying transport round-tripper - // doesn't try to auto decode the body of objects with - // content-encoding set to `gzip`. - // - // Refer: - // https://golang.org/src/net/http/transport.go?h=roundTrip#L1843 - DisableCompression: true, -} diff --git a/vendor/github.com/minio/minio-go/utils.go b/vendor/github.com/minio/minio-go/utils.go deleted file mode 100644 index f80e25c41..000000000 --- a/vendor/github.com/minio/minio-go/utils.go +++ /dev/null @@ -1,271 +0,0 @@ -/* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package minio - -import ( - "crypto/md5" - "crypto/sha256" - "encoding/base64" - "encoding/hex" - "encoding/xml" - "io" - "io/ioutil" - "net" - "net/http" - "net/url" - "regexp" - "strings" - "time" - - "github.com/minio/minio-go/pkg/s3utils" -) - -// xmlDecoder provide decoded value in xml. -func xmlDecoder(body io.Reader, v interface{}) error { - d := xml.NewDecoder(body) - return d.Decode(v) -} - -// sum256 calculate sha256sum for an input byte array, returns hex encoded. -func sum256Hex(data []byte) string { - hash := sha256.New() - hash.Write(data) - return hex.EncodeToString(hash.Sum(nil)) -} - -// sumMD5Base64 calculate md5sum for an input byte array, returns base64 encoded. -func sumMD5Base64(data []byte) string { - hash := md5.New() - hash.Write(data) - return base64.StdEncoding.EncodeToString(hash.Sum(nil)) -} - -// getEndpointURL - construct a new endpoint. -func getEndpointURL(endpoint string, secure bool) (*url.URL, error) { - if strings.Contains(endpoint, ":") { - host, _, err := net.SplitHostPort(endpoint) - if err != nil { - return nil, err - } - if !s3utils.IsValidIP(host) && !s3utils.IsValidDomain(host) { - msg := "Endpoint: " + endpoint + " does not follow ip address or domain name standards." - return nil, ErrInvalidArgument(msg) - } - } else { - if !s3utils.IsValidIP(endpoint) && !s3utils.IsValidDomain(endpoint) { - msg := "Endpoint: " + endpoint + " does not follow ip address or domain name standards." - return nil, ErrInvalidArgument(msg) - } - } - // If secure is false, use 'http' scheme. - scheme := "https" - if !secure { - scheme = "http" - } - - // Construct a secured endpoint URL. - endpointURLStr := scheme + "://" + endpoint - endpointURL, err := url.Parse(endpointURLStr) - if err != nil { - return nil, err - } - - // Validate incoming endpoint URL. - if err := isValidEndpointURL(*endpointURL); err != nil { - return nil, err - } - return endpointURL, nil -} - -// closeResponse close non nil response with any response Body. -// convenient wrapper to drain any remaining data on response body. -// -// Subsequently this allows golang http RoundTripper -// to re-use the same connection for future requests. -func closeResponse(resp *http.Response) { - // Callers should close resp.Body when done reading from it. - // If resp.Body is not closed, the Client's underlying RoundTripper - // (typically Transport) may not be able to re-use a persistent TCP - // connection to the server for a subsequent "keep-alive" request. - if resp != nil && resp.Body != nil { - // Drain any remaining Body and then close the connection. - // Without this closing connection would disallow re-using - // the same connection for future uses. - // - http://stackoverflow.com/a/17961593/4465767 - io.Copy(ioutil.Discard, resp.Body) - resp.Body.Close() - } -} - -var ( - // Hex encoded string of nil sha256sum bytes. - emptySHA256Hex = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" - - // Sentinel URL is the default url value which is invalid. - sentinelURL = url.URL{} -) - -// Verify if input endpoint URL is valid. -func isValidEndpointURL(endpointURL url.URL) error { - if endpointURL == sentinelURL { - return ErrInvalidArgument("Endpoint url cannot be empty.") - } - if endpointURL.Path != "/" && endpointURL.Path != "" { - return ErrInvalidArgument("Endpoint url cannot have fully qualified paths.") - } - if strings.Contains(endpointURL.Host, ".s3.amazonaws.com") { - if !s3utils.IsAmazonEndpoint(endpointURL) { - return ErrInvalidArgument("Amazon S3 endpoint should be 's3.amazonaws.com'.") - } - } - if strings.Contains(endpointURL.Host, ".googleapis.com") { - if !s3utils.IsGoogleEndpoint(endpointURL) { - return ErrInvalidArgument("Google Cloud Storage endpoint should be 'storage.googleapis.com'.") - } - } - return nil -} - -// Verify if input expires value is valid. -func isValidExpiry(expires time.Duration) error { - expireSeconds := int64(expires / time.Second) - if expireSeconds < 1 { - return ErrInvalidArgument("Expires cannot be lesser than 1 second.") - } - if expireSeconds > 604800 { - return ErrInvalidArgument("Expires cannot be greater than 7 days.") - } - return nil -} - -// make a copy of http.Header -func cloneHeader(h http.Header) http.Header { - h2 := make(http.Header, len(h)) - for k, vv := range h { - vv2 := make([]string, len(vv)) - copy(vv2, vv) - h2[k] = vv2 - } - return h2 -} - -// Filter relevant response headers from -// the HEAD, GET http response. The function takes -// a list of headers which are filtered out and -// returned as a new http header. -func filterHeader(header http.Header, filterKeys []string) (filteredHeader http.Header) { - filteredHeader = cloneHeader(header) - for _, key := range filterKeys { - filteredHeader.Del(key) - } - return filteredHeader -} - -// regCred matches credential string in HTTP header -var regCred = regexp.MustCompile("Credential=([A-Z0-9]+)/") - -// regCred matches signature string in HTTP header -var regSign = regexp.MustCompile("Signature=([[0-9a-f]+)") - -// Redact out signature value from authorization string. -func redactSignature(origAuth string) string { - if !strings.HasPrefix(origAuth, signV4Algorithm) { - // Set a temporary redacted auth - return "AWS **REDACTED**:**REDACTED**" - } - - /// Signature V4 authorization header. - - // Strip out accessKeyID from: - // Credential=////aws4_request - newAuth := regCred.ReplaceAllString(origAuth, "Credential=**REDACTED**/") - - // Strip out 256-bit signature from: Signature=<256-bit signature> - return regSign.ReplaceAllString(newAuth, "Signature=**REDACTED**") -} - -// Get default location returns the location based on the input -// URL `u`, if region override is provided then all location -// defaults to regionOverride. -// -// If no other cases match then the location is set to `us-east-1` -// as a last resort. -func getDefaultLocation(u url.URL, regionOverride string) (location string) { - if regionOverride != "" { - return regionOverride - } - region := s3utils.GetRegionFromURL(u) - if region == "" { - region = "us-east-1" - } - return region -} - -var supportedHeaders = []string{ - "content-type", - "cache-control", - "content-encoding", - "content-disposition", - "content-language", - "x-amz-website-redirect-location", - // Add more supported headers here. -} - -// isStorageClassHeader returns true if the header is a supported storage class header -func isStorageClassHeader(headerKey string) bool { - return strings.ToLower(amzStorageClass) == strings.ToLower(headerKey) -} - -// isStandardHeader returns true if header is a supported header and not a custom header -func isStandardHeader(headerKey string) bool { - key := strings.ToLower(headerKey) - for _, header := range supportedHeaders { - if strings.ToLower(header) == key { - return true - } - } - return false -} - -// sseHeaders is list of server side encryption headers -var sseHeaders = []string{ - "x-amz-server-side-encryption", - "x-amz-server-side-encryption-aws-kms-key-id", - "x-amz-server-side-encryption-context", - "x-amz-server-side-encryption-customer-algorithm", - "x-amz-server-side-encryption-customer-key", - "x-amz-server-side-encryption-customer-key-MD5", -} - -// isSSEHeader returns true if header is a server side encryption header. -func isSSEHeader(headerKey string) bool { - key := strings.ToLower(headerKey) - for _, h := range sseHeaders { - if strings.ToLower(h) == key { - return true - } - } - return false -} - -// isAmzHeader returns true if header is a x-amz-meta-* or x-amz-acl header. -func isAmzHeader(headerKey string) bool { - key := strings.ToLower(headerKey) - - return strings.HasPrefix(key, "x-amz-meta-") || key == "x-amz-acl" -} diff --git a/vendor/github.com/minio/minio-go/v7/.gitignore b/vendor/github.com/minio/minio-go/v7/.gitignore new file mode 100644 index 000000000..8081bd0ff --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/.gitignore @@ -0,0 +1,4 @@ +*~ +*.test +validator +golangci-lint \ No newline at end of file diff --git a/vendor/github.com/minio/minio-go/v7/.golangci.yml b/vendor/github.com/minio/minio-go/v7/.golangci.yml new file mode 100644 index 000000000..7d1dd3352 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/.golangci.yml @@ -0,0 +1,16 @@ +linters-settings: + misspell: + locale: US + +linters: + disable-all: true + enable: + - typecheck + - goimports + - misspell + - govet + - golint + - ineffassign + - gosimple + - deadcode + - structcheck diff --git a/vendor/github.com/minio/minio-go/v7/CNAME b/vendor/github.com/minio/minio-go/v7/CNAME new file mode 100644 index 000000000..d365a7bb2 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/CNAME @@ -0,0 +1 @@ +minio-go.min.io \ No newline at end of file diff --git a/vendor/github.com/minio/minio-go/CONTRIBUTING.md b/vendor/github.com/minio/minio-go/v7/CONTRIBUTING.md similarity index 100% rename from vendor/github.com/minio/minio-go/CONTRIBUTING.md rename to vendor/github.com/minio/minio-go/v7/CONTRIBUTING.md diff --git a/vendor/github.com/minio/minio/pkg/s3select/internal/parquet-go/LICENSE b/vendor/github.com/minio/minio-go/v7/LICENSE similarity index 100% rename from vendor/github.com/minio/minio/pkg/s3select/internal/parquet-go/LICENSE rename to vendor/github.com/minio/minio-go/v7/LICENSE diff --git a/vendor/github.com/minio/minio-go/v7/MAINTAINERS.md b/vendor/github.com/minio/minio-go/v7/MAINTAINERS.md new file mode 100644 index 000000000..f640dfb9f --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/MAINTAINERS.md @@ -0,0 +1,35 @@ +# For maintainers only + +## Responsibilities + +Please go through this link [Maintainer Responsibility](https://gist.github.com/abperiasamy/f4d9b31d3186bbd26522) + +### Making new releases +Tag and sign your release commit, additionally this step requires you to have access to MinIO's trusted private key. +```sh +$ export GNUPGHOME=/media/${USER}/minio/trusted +$ git tag -s 4.0.0 +$ git push +$ git push --tags +``` + +### Update version +Once release has been made update `libraryVersion` constant in `api.go` to next to be released version. + +```sh +$ grep libraryVersion api.go + libraryVersion = "4.0.1" +``` + +Commit your changes +``` +$ git commit -a -m "Update version for next release" --author "MinIO Trusted " +``` + +### Announce +Announce new release by adding release notes at https://github.com/minio/minio-go/releases from `trusted@min.io` account. Release notes requires two sections `highlights` and `changelog`. Highlights is a bulleted list of salient features in this release and Changelog contains list of all commits since the last release. + +To generate `changelog` +```sh +$ git log --no-color --pretty=format:'-%d %s (%cr) <%an>' .. +``` diff --git a/vendor/github.com/minio/minio-go/v7/Makefile b/vendor/github.com/minio/minio-go/v7/Makefile new file mode 100644 index 000000000..d9b433443 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/Makefile @@ -0,0 +1,31 @@ +GOPATH := $(shell go env GOPATH) + +all: checks + +.PHONY: examples docs + +checks: lint vet test examples functional-test + +lint: + @mkdir -p ${GOPATH}/bin + @which golangci-lint 1>/dev/null || (echo "Installing golangci-lint" && curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(GOPATH)/bin v1.27.0) + @echo "Running $@ check" + @GO111MODULE=on ${GOPATH}/bin/golangci-lint cache clean + @GO111MODULE=on ${GOPATH}/bin/golangci-lint run --timeout=5m --config ./.golangci.yml + +vet: + @GO111MODULE=on go vet ./... + +test: + @GO111MODULE=on SERVER_ENDPOINT=localhost:9000 ACCESS_KEY=minio SECRET_KEY=minio123 ENABLE_HTTPS=1 MINT_MODE=full go test -race -v ./... + +examples: + @mkdir -p /tmp/examples && for i in $(echo examples/s3/*); do go build -o /tmp/examples/$(basename ${i:0:-3}) ${i}; done + +functional-test: + @GO111MODULE=on SERVER_ENDPOINT=localhost:9000 ACCESS_KEY=minio SECRET_KEY=minio123 ENABLE_HTTPS=1 MINT_MODE=full go run functional_tests.go + +clean: + @echo "Cleaning up all the generated files" + @find . -name '*.test' | xargs rm -fv + @find . -name '*~' | xargs rm -fv diff --git a/vendor/github.com/minio/minio-go/v7/NOTICE b/vendor/github.com/minio/minio-go/v7/NOTICE new file mode 100644 index 000000000..1e8fd3b92 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/NOTICE @@ -0,0 +1,9 @@ +MinIO Cloud Storage, (C) 2014-2020 MinIO, Inc. + +This product includes software developed at MinIO, Inc. +(https://min.io/). + +The MinIO project contains unmodified/modified subcomponents too with +separate copyright notices and license terms. Your use of the source +code for these subcomponents is subject to the terms and conditions +of Apache License Version 2.0 diff --git a/vendor/github.com/minio/minio-go/v7/README.md b/vendor/github.com/minio/minio-go/v7/README.md new file mode 100644 index 000000000..d289f615a --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/README.md @@ -0,0 +1,253 @@ +# MinIO Go Client SDK for Amazon S3 Compatible Cloud Storage [![Slack](https://slack.min.io/slack?type=svg)](https://slack.min.io) [![Sourcegraph](https://sourcegraph.com/github.com/minio/minio-go/-/badge.svg)](https://sourcegraph.com/github.com/minio/minio-go?badge) [![Apache V2 License](http://img.shields.io/badge/license-Apache%20V2-blue.svg)](https://github.com/minio/minio-go/blob/master/LICENSE) + +The MinIO Go Client SDK provides simple APIs to access any Amazon S3 compatible object storage. + +This quickstart guide will show you how to install the MinIO client SDK, connect to MinIO, and provide a walkthrough for a simple file uploader. For a complete list of APIs and examples, please take a look at the [Go Client API Reference](https://docs.min.io/docs/golang-client-api-reference). + +This document assumes that you have a working [Go development environment](https://golang.org/doc/install). + +## Download from Github +```sh +GO111MODULE=on go get github.com/minio/minio-go/v7 +``` + +## Initialize MinIO Client +MinIO client requires the following four parameters specified to connect to an Amazon S3 compatible object storage. + +| Parameter | Description| +| :--- | :--- | +| endpoint | URL to object storage service. | +| _minio.Options_ | All the options such as credentials, custom transport etc. | + + +```go +package main + +import ( + "log" + + "github.com/minio/minio-go/v7" + "github.com/minio/minio-go/v7/pkg/credentials" +) + +func main() { + endpoint := "play.min.io" + accessKeyID := "Q3AM3UQ867SPQQA43P2F" + secretAccessKey := "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG" + useSSL := true + + // Initialize minio client object. + minioClient, err := minio.New(endpoint, &minio.Options{ + Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""), + Secure: useSSL, + }) + if err != nil { + log.Fatalln(err) + } + + log.Printf("%#v\n", minioClient) // minioClient is now set up +} +``` + +## Quick Start Example - File Uploader +This example program connects to an object storage server, creates a bucket and uploads a file to the bucket. + +We will use the MinIO server running at [https://play.min.io](https://play.min.io) in this example. Feel free to use this service for testing and development. Access credentials shown in this example are open to the public. + +### FileUploader.go +```go +package main + +import ( + "context" + "log" + + "github.com/minio/minio-go/v7" + "github.com/minio/minio-go/v7/pkg/credentials" +) + +func main() { + ctx := context.Background() + endpoint := "play.min.io" + accessKeyID := "Q3AM3UQ867SPQQA43P2F" + secretAccessKey := "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG" + useSSL := true + + // Initialize minio client object. + minioClient, err := minio.New(endpoint, &minio.Options{ + Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""), + Secure: useSSL, + }) + if err != nil { + log.Fatalln(err) + } + + // Make a new bucket called mymusic. + bucketName := "mymusic" + location := "us-east-1" + + err = minioClient.MakeBucket(ctx, bucketName, minio.MakeBucketOptions{Region: location}) + if err != nil { + // Check to see if we already own this bucket (which happens if you run this twice) + exists, errBucketExists := minioClient.BucketExists(ctx, bucketName) + if errBucketExists == nil && exists { + log.Printf("We already own %s\n", bucketName) + } else { + log.Fatalln(err) + } + } else { + log.Printf("Successfully created %s\n", bucketName) + } + + // Upload the zip file + objectName := "golden-oldies.zip" + filePath := "/tmp/golden-oldies.zip" + contentType := "application/zip" + + // Upload the zip file with FPutObject + n, err := minioClient.FPutObject(ctx, bucketName, objectName, filePath, minio.PutObjectOptions{ContentType: contentType}) + if err != nil { + log.Fatalln(err) + } + + log.Printf("Successfully uploaded %s of size %d\n", objectName, n) +} +``` + +### Run FileUploader +```sh +go run file-uploader.go +2016/08/13 17:03:28 Successfully created mymusic +2016/08/13 17:03:40 Successfully uploaded golden-oldies.zip of size 16253413 + +mc ls play/mymusic/ +[2016-05-27 16:02:16 PDT] 17MiB golden-oldies.zip +``` + +## API Reference +The full API Reference is available here. + +* [Complete API Reference](https://docs.min.io/docs/golang-client-api-reference) + +### API Reference : Bucket Operations +* [`MakeBucket`](https://docs.min.io/docs/golang-client-api-reference#MakeBucket) +* [`ListBuckets`](https://docs.min.io/docs/golang-client-api-reference#ListBuckets) +* [`BucketExists`](https://docs.min.io/docs/golang-client-api-reference#BucketExists) +* [`RemoveBucket`](https://docs.min.io/docs/golang-client-api-reference#RemoveBucket) +* [`ListObjects`](https://docs.min.io/docs/golang-client-api-reference#ListObjects) +* [`ListObjectsV2`](https://docs.min.io/docs/golang-client-api-reference#ListObjectsV2) +* [`ListIncompleteUploads`](https://docs.min.io/docs/golang-client-api-reference#ListIncompleteUploads) + +### API Reference : Bucket policy Operations +* [`SetBucketPolicy`](https://docs.min.io/docs/golang-client-api-reference#SetBucketPolicy) +* [`GetBucketPolicy`](https://docs.min.io/docs/golang-client-api-reference#GetBucketPolicy) + +### API Reference : Bucket notification Operations +* [`SetBucketNotification`](https://docs.min.io/docs/golang-client-api-reference#SetBucketNotification) +* [`GetBucketNotification`](https://docs.min.io/docs/golang-client-api-reference#GetBucketNotification) +* [`RemoveAllBucketNotification`](https://docs.min.io/docs/golang-client-api-reference#RemoveAllBucketNotification) +* [`ListenBucketNotification`](https://docs.min.io/docs/golang-client-api-reference#ListenBucketNotification) (MinIO Extension) +* [`ListenNotification`](https://docs.min.io/docs/golang-client-api-reference#ListenNotification) (MinIO Extension) + +### API Reference : File Object Operations +* [`FPutObject`](https://docs.min.io/docs/golang-client-api-reference#FPutObject) +* [`FGetObject`](https://docs.min.io/docs/golang-client-api-reference#FGetObject) + +### API Reference : Object Operations +* [`GetObject`](https://docs.min.io/docs/golang-client-api-reference#GetObject) +* [`PutObject`](https://docs.min.io/docs/golang-client-api-reference#PutObject) +* [`PutObjectStreaming`](https://docs.min.io/docs/golang-client-api-reference#PutObjectStreaming) +* [`StatObject`](https://docs.min.io/docs/golang-client-api-reference#StatObject) +* [`CopyObject`](https://docs.min.io/docs/golang-client-api-reference#CopyObject) +* [`RemoveObject`](https://docs.min.io/docs/golang-client-api-reference#RemoveObject) +* [`RemoveObjects`](https://docs.min.io/docs/golang-client-api-reference#RemoveObjects) +* [`RemoveIncompleteUpload`](https://docs.min.io/docs/golang-client-api-reference#RemoveIncompleteUpload) +* [`SelectObjectContent`](https://docs.min.io/docs/golang-client-api-reference#SelectObjectContent) + + +### API Reference : Presigned Operations +* [`PresignedGetObject`](https://docs.min.io/docs/golang-client-api-reference#PresignedGetObject) +* [`PresignedPutObject`](https://docs.min.io/docs/golang-client-api-reference#PresignedPutObject) +* [`PresignedHeadObject`](https://docs.min.io/docs/golang-client-api-reference#PresignedHeadObject) +* [`PresignedPostPolicy`](https://docs.min.io/docs/golang-client-api-reference#PresignedPostPolicy) + +### API Reference : Client custom settings +* [`SetAppInfo`](http://docs.min.io/docs/golang-client-api-reference#SetAppInfo) +* [`SetCustomTransport`](http://docs.min.io/docs/golang-client-api-reference#SetCustomTransport) +* [`TraceOn`](http://docs.min.io/docs/golang-client-api-reference#TraceOn) +* [`TraceOff`](http://docs.min.io/docs/golang-client-api-reference#TraceOff) + +## Full Examples + +### Full Examples : Bucket Operations +* [makebucket.go](https://github.com/minio/minio-go/blob/master/examples/s3/makebucket.go) +* [listbuckets.go](https://github.com/minio/minio-go/blob/master/examples/s3/listbuckets.go) +* [bucketexists.go](https://github.com/minio/minio-go/blob/master/examples/s3/bucketexists.go) +* [removebucket.go](https://github.com/minio/minio-go/blob/master/examples/s3/removebucket.go) +* [listobjects.go](https://github.com/minio/minio-go/blob/master/examples/s3/listobjects.go) +* [listobjectsV2.go](https://github.com/minio/minio-go/blob/master/examples/s3/listobjectsV2.go) +* [listincompleteuploads.go](https://github.com/minio/minio-go/blob/master/examples/s3/listincompleteuploads.go) + +### Full Examples : Bucket policy Operations +* [setbucketpolicy.go](https://github.com/minio/minio-go/blob/master/examples/s3/setbucketpolicy.go) +* [getbucketpolicy.go](https://github.com/minio/minio-go/blob/master/examples/s3/getbucketpolicy.go) +* [listbucketpolicies.go](https://github.com/minio/minio-go/blob/master/examples/s3/listbucketpolicies.go) + +### Full Examples : Bucket lifecycle Operations +* [setbucketlifecycle.go](https://github.com/minio/minio-go/blob/master/examples/s3/setbucketlifecycle.go) +* [getbucketlifecycle.go](https://github.com/minio/minio-go/blob/master/examples/s3/getbucketlifecycle.go) + +### Full Examples : Bucket encryption Operations +* [setbucketencryption.go](https://github.com/minio/minio-go/blob/master/examples/s3/setbucketencryption.go) +* [getbucketencryption.go](https://github.com/minio/minio-go/blob/master/examples/s3/getbucketencryption.go) +* [deletebucketencryption.go](https://github.com/minio/minio-go/blob/master/examples/s3/deletebucketencryption.go) + +### Full Examples : Bucket replication Operations +* [setbucketreplication.go](https://github.com/minio/minio-go/blob/master/examples/s3/setbucketreplication.go) +* [getbucketreplication.go](https://github.com/minio/minio-go/blob/master/examples/s3/getbucketreplication.go) +* [removebucketreplication.go](https://github.com/minio/minio-go/blob/master/examples/s3/removebucketreplication.go) + +### Full Examples : Bucket notification Operations +* [setbucketnotification.go](https://github.com/minio/minio-go/blob/master/examples/s3/setbucketnotification.go) +* [getbucketnotification.go](https://github.com/minio/minio-go/blob/master/examples/s3/getbucketnotification.go) +* [removeallbucketnotification.go](https://github.com/minio/minio-go/blob/master/examples/s3/removeallbucketnotification.go) +* [listenbucketnotification.go](https://github.com/minio/minio-go/blob/master/examples/minio/listenbucketnotification.go) (MinIO Extension) +* [listennotification.go](https://github.com/minio/minio-go/blob/master/examples/minio/listen-notification.go) (MinIO Extension) + +### Full Examples : File Object Operations +* [fputobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/fputobject.go) +* [fgetobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/fgetobject.go) +* [fputobject-context.go](https://github.com/minio/minio-go/blob/master/examples/s3/fputobject-context.go) +* [fgetobject-context.go](https://github.com/minio/minio-go/blob/master/examples/s3/fgetobject-context.go) + +### Full Examples : Object Operations +* [putobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/putobject.go) +* [getobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/getobject.go) +* [putobject-context.go](https://github.com/minio/minio-go/blob/master/examples/s3/putobject-context.go) +* [getobject-context.go](https://github.com/minio/minio-go/blob/master/examples/s3/getobject-context.go) +* [statobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/statobject.go) +* [copyobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/copyobject.go) +* [removeobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/removeobject.go) +* [removeincompleteupload.go](https://github.com/minio/minio-go/blob/master/examples/s3/removeincompleteupload.go) +* [removeobjects.go](https://github.com/minio/minio-go/blob/master/examples/s3/removeobjects.go) + +### Full Examples : Encrypted Object Operations +* [put-encrypted-object.go](https://github.com/minio/minio-go/blob/master/examples/s3/put-encrypted-object.go) +* [get-encrypted-object.go](https://github.com/minio/minio-go/blob/master/examples/s3/get-encrypted-object.go) +* [fput-encrypted-object.go](https://github.com/minio/minio-go/blob/master/examples/s3/fputencrypted-object.go) + +### Full Examples : Presigned Operations +* [presignedgetobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/presignedgetobject.go) +* [presignedputobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/presignedputobject.go) +* [presignedheadobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/presignedheadobject.go) +* [presignedpostpolicy.go](https://github.com/minio/minio-go/blob/master/examples/s3/presignedpostpolicy.go) + +## Explore Further +* [Complete Documentation](https://docs.min.io) +* [MinIO Go Client SDK API Reference](https://docs.min.io/docs/golang-client-api-reference) + +## Contribute +[Contributors Guide](https://github.com/minio/minio-go/blob/master/CONTRIBUTING.md) + +## License +This SDK is distributed under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0), see [LICENSE](./LICENSE) and [NOTICE](./NOTICE) for more information. diff --git a/vendor/github.com/minio/minio-go/v7/README_zh_CN.md b/vendor/github.com/minio/minio-go/v7/README_zh_CN.md new file mode 100644 index 000000000..0911b0905 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/README_zh_CN.md @@ -0,0 +1,236 @@ +# 适用于与Amazon S3兼容云存储的MinIO Go SDK [![Slack](https://slack.min.io/slack?type=svg)](https://slack.min.io) [![Sourcegraph](https://sourcegraph.com/github.com/minio/minio-go/-/badge.svg)](https://sourcegraph.com/github.com/minio/minio-go?badge) + +MinIO Go Client SDK提供了简单的API来访问任何与Amazon S3兼容的对象存储服务。 + +**支持的云存储:** + +- AWS Signature Version 4 + - Amazon S3 + - MinIO + +- AWS Signature Version 2 + - Google Cloud Storage (兼容模式) + - Openstack Swift + Swift3 middleware + - Ceph Object Gateway + - Riak CS + +本文我们将学习如何安装MinIO client SDK,连接到MinIO,并提供一下文件上传的示例。对于完整的API以及示例,请参考[Go Client API Reference](https://docs.min.io/docs/golang-client-api-reference)。 + +本文假设你已经有 [Go开发环境](https://golang.org/doc/install)。 + +## 从Github下载 +```sh +go get -u github.com/minio/minio-go +``` + +## 初始化MinIO Client +MinIO client需要以下4个参数来连接与Amazon S3兼容的对象存储。 + +| 参数 | 描述| +| :--- | :--- | +| endpoint | 对象存储服务的URL | +| accessKeyID | Access key是唯一标识你的账户的用户ID。 | +| secretAccessKey | Secret key是你账户的密码。 | +| secure | true代表使用HTTPS | + + +```go +package main + +import ( + "github.com/minio/minio-go/v7" + "log" +) + +func main() { + endpoint := "play.min.io" + accessKeyID := "Q3AM3UQ867SPQQA43P2F" + secretAccessKey := "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG" + useSSL := true + + // 初使化 minio client对象。 + minioClient, err := minio.New(endpoint, accessKeyID, secretAccessKey, useSSL) + if err != nil { + log.Fatalln(err) + } + + log.Printf("%#v\n", minioClient) // minioClient初使化成功 +} +``` + +## 示例-文件上传 +本示例连接到一个对象存储服务,创建一个存储桶并上传一个文件到存储桶中。 + +我们在本示例中使用运行在 [https://play.min.io](https://play.min.io) 上的MinIO服务,你可以用这个服务来开发和测试。示例中的访问凭据是公开的。 + +### FileUploader.go +```go +package main + +import ( + "github.com/minio/minio-go/v7" + "log" +) + +func main() { + endpoint := "play.min.io" + accessKeyID := "Q3AM3UQ867SPQQA43P2F" + secretAccessKey := "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG" + useSSL := true + + // 初使化minio client对象。 + minioClient, err := minio.New(endpoint, accessKeyID, secretAccessKey, useSSL) + if err != nil { + log.Fatalln(err) + } + + // 创建一个叫mymusic的存储桶。 + bucketName := "mymusic" + location := "us-east-1" + + err = minioClient.MakeBucket(bucketName, location) + if err != nil { + // 检查存储桶是否已经存在。 + exists, err := minioClient.BucketExists(bucketName) + if err == nil && exists { + log.Printf("We already own %s\n", bucketName) + } else { + log.Fatalln(err) + } + } + log.Printf("Successfully created %s\n", bucketName) + + // 上传一个zip文件。 + objectName := "golden-oldies.zip" + filePath := "/tmp/golden-oldies.zip" + contentType := "application/zip" + + // 使用FPutObject上传一个zip文件。 + n, err := minioClient.FPutObject(bucketName, objectName, filePath, minio.PutObjectOptions{ContentType:contentType}) + if err != nil { + log.Fatalln(err) + } + + log.Printf("Successfully uploaded %s of size %d\n", objectName, n) +} +``` + +### 运行FileUploader +```sh +go run file-uploader.go +2016/08/13 17:03:28 Successfully created mymusic +2016/08/13 17:03:40 Successfully uploaded golden-oldies.zip of size 16253413 + +mc ls play/mymusic/ +[2016-05-27 16:02:16 PDT] 17MiB golden-oldies.zip +``` + +## API文档 +完整的API文档在这里。 +* [完整API文档](https://docs.min.io/docs/golang-client-api-reference) + +### API文档 : 操作存储桶 +* [`MakeBucket`](https://docs.min.io/docs/golang-client-api-reference#MakeBucket) +* [`ListBuckets`](https://docs.min.io/docs/golang-client-api-reference#ListBuckets) +* [`BucketExists`](https://docs.min.io/docs/golang-client-api-reference#BucketExists) +* [`RemoveBucket`](https://docs.min.io/docs/golang-client-api-reference#RemoveBucket) +* [`ListObjects`](https://docs.min.io/docs/golang-client-api-reference#ListObjects) +* [`ListObjectsV2`](https://docs.min.io/docs/golang-client-api-reference#ListObjectsV2) +* [`ListIncompleteUploads`](https://docs.min.io/docs/golang-client-api-reference#ListIncompleteUploads) + +### API文档 : 存储桶策略 +* [`SetBucketPolicy`](https://docs.min.io/docs/golang-client-api-reference#SetBucketPolicy) +* [`GetBucketPolicy`](https://docs.min.io/docs/golang-client-api-reference#GetBucketPolicy) + +### API文档 : 存储桶通知 +* [`SetBucketNotification`](https://docs.min.io/docs/golang-client-api-reference#SetBucketNotification) +* [`GetBucketNotification`](https://docs.min.io/docs/golang-client-api-reference#GetBucketNotification) +* [`RemoveAllBucketNotification`](https://docs.min.io/docs/golang-client-api-reference#RemoveAllBucketNotification) +* [`ListenBucketNotification`](https://docs.min.io/docs/golang-client-api-reference#ListenBucketNotification) (MinIO Extension) + +### API文档 : 操作文件对象 +* [`FPutObject`](https://docs.min.io/docs/golang-client-api-reference#FPutObject) +* [`FGetObject`](https://docs.min.io/docs/golang-client-api-reference#FPutObject) + +### API文档 : 操作对象 +* [`GetObject`](https://docs.min.io/docs/golang-client-api-reference#GetObject) +* [`PutObject`](https://docs.min.io/docs/golang-client-api-reference#PutObject) +* [`PutObjectStreaming`](https://docs.min.io/docs/golang-client-api-reference#PutObjectStreaming) +* [`StatObject`](https://docs.min.io/docs/golang-client-api-reference#StatObject) +* [`CopyObject`](https://docs.min.io/docs/golang-client-api-reference#CopyObject) +* [`RemoveObject`](https://docs.min.io/docs/golang-client-api-reference#RemoveObject) +* [`RemoveObjects`](https://docs.min.io/docs/golang-client-api-reference#RemoveObjects) +* [`RemoveIncompleteUpload`](https://docs.min.io/docs/golang-client-api-reference#RemoveIncompleteUpload) + +### API文档: 操作加密对象 +* [`GetEncryptedObject`](https://docs.min.io/docs/golang-client-api-reference#GetEncryptedObject) +* [`PutEncryptedObject`](https://docs.min.io/docs/golang-client-api-reference#PutEncryptedObject) + +### API文档 : Presigned操作 +* [`PresignedGetObject`](https://docs.min.io/docs/golang-client-api-reference#PresignedGetObject) +* [`PresignedPutObject`](https://docs.min.io/docs/golang-client-api-reference#PresignedPutObject) +* [`PresignedHeadObject`](https://docs.min.io/docs/golang-client-api-reference#PresignedHeadObject) +* [`PresignedPostPolicy`](https://docs.min.io/docs/golang-client-api-reference#PresignedPostPolicy) + +### API文档 : 客户端自定义设置 +* [`SetAppInfo`](http://docs.min.io/docs/golang-client-api-reference#SetAppInfo) +* [`SetCustomTransport`](http://docs.min.io/docs/golang-client-api-reference#SetCustomTransport) +* [`TraceOn`](http://docs.min.io/docs/golang-client-api-reference#TraceOn) +* [`TraceOff`](http://docs.min.io/docs/golang-client-api-reference#TraceOff) + +## 完整示例 + +### 完整示例 : 操作存储桶 +* [makebucket.go](https://github.com/minio/minio-go/blob/master/examples/s3/makebucket.go) +* [listbuckets.go](https://github.com/minio/minio-go/blob/master/examples/s3/listbuckets.go) +* [bucketexists.go](https://github.com/minio/minio-go/blob/master/examples/s3/bucketexists.go) +* [removebucket.go](https://github.com/minio/minio-go/blob/master/examples/s3/removebucket.go) +* [listobjects.go](https://github.com/minio/minio-go/blob/master/examples/s3/listobjects.go) +* [listobjectsV2.go](https://github.com/minio/minio-go/blob/master/examples/s3/listobjectsV2.go) +* [listincompleteuploads.go](https://github.com/minio/minio-go/blob/master/examples/s3/listincompleteuploads.go) + +### 完整示例 : 存储桶策略 +* [setbucketpolicy.go](https://github.com/minio/minio-go/blob/master/examples/s3/setbucketpolicy.go) +* [getbucketpolicy.go](https://github.com/minio/minio-go/blob/master/examples/s3/getbucketpolicy.go) +* [listbucketpolicies.go](https://github.com/minio/minio-go/blob/master/examples/s3/listbucketpolicies.go) + +### 完整示例 : 存储桶通知 +* [setbucketnotification.go](https://github.com/minio/minio-go/blob/master/examples/s3/setbucketnotification.go) +* [getbucketnotification.go](https://github.com/minio/minio-go/blob/master/examples/s3/getbucketnotification.go) +* [removeallbucketnotification.go](https://github.com/minio/minio-go/blob/master/examples/s3/removeallbucketnotification.go) +* [listenbucketnotification.go](https://github.com/minio/minio-go/blob/master/examples/minio/listenbucketnotification.go) (MinIO扩展) + +### 完整示例 : 操作文件对象 +* [fputobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/fputobject.go) +* [fgetobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/fgetobject.go) +* [fputobject-context.go](https://github.com/minio/minio-go/blob/master/examples/s3/fputobject-context.go) +* [fgetobject-context.go](https://github.com/minio/minio-go/blob/master/examples/s3/fgetobject-context.go) + +### 完整示例 : 操作对象 +* [putobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/putobject.go) +* [getobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/getobject.go) +* [putobject-context.go](https://github.com/minio/minio-go/blob/master/examples/s3/putobject-context.go) +* [getobject-context.go](https://github.com/minio/minio-go/blob/master/examples/s3/getobject-context.go) +* [statobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/statobject.go) +* [copyobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/copyobject.go) +* [removeobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/removeobject.go) +* [removeincompleteupload.go](https://github.com/minio/minio-go/blob/master/examples/s3/removeincompleteupload.go) +* [removeobjects.go](https://github.com/minio/minio-go/blob/master/examples/s3/removeobjects.go) + +### 完整示例 : 操作加密对象 +* [put-encrypted-object.go](https://github.com/minio/minio-go/blob/master/examples/s3/put-encrypted-object.go) +* [get-encrypted-object.go](https://github.com/minio/minio-go/blob/master/examples/s3/get-encrypted-object.go) +* [fput-encrypted-object.go](https://github.com/minio/minio-go/blob/master/examples/s3/fputencrypted-object.go) + +### 完整示例 : Presigned操作 +* [presignedgetobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/presignedgetobject.go) +* [presignedputobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/presignedputobject.go) +* [presignedheadobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/presignedheadobject.go) +* [presignedpostpolicy.go](https://github.com/minio/minio-go/blob/master/examples/s3/presignedpostpolicy.go) + +## 了解更多 +* [完整文档](https://docs.min.io) +* [MinIO Go Client SDK API文档](https://docs.min.io/docs/golang-client-api-reference) + +## 贡献 +[贡献指南](https://github.com/minio/minio-go/blob/master/docs/zh_CN/CONTRIBUTING.md) diff --git a/vendor/github.com/minio/minio-go/v7/api-bucket-encryption.go b/vendor/github.com/minio/minio-go/v7/api-bucket-encryption.go new file mode 100644 index 000000000..e02ab84af --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-bucket-encryption.go @@ -0,0 +1,134 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2020 MinIO, Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "bytes" + "context" + "encoding/xml" + "net/http" + "net/url" + + "github.com/minio/minio-go/v7/pkg/s3utils" + "github.com/minio/minio-go/v7/pkg/sse" +) + +// SetBucketEncryption sets the default encryption configuration on an existing bucket. +func (c Client) SetBucketEncryption(ctx context.Context, bucketName string, config *sse.Configuration) error { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return err + } + + if config == nil { + return errInvalidArgument("configuration cannot be empty") + } + + buf, err := xml.Marshal(config) + if err != nil { + return err + } + + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + urlValues.Set("encryption", "") + + // Content-length is mandatory to set a default encryption configuration + reqMetadata := requestMetadata{ + bucketName: bucketName, + queryValues: urlValues, + contentBody: bytes.NewReader(buf), + contentLength: int64(len(buf)), + contentMD5Base64: sumMD5Base64(buf), + } + + // Execute PUT to upload a new bucket default encryption configuration. + resp, err := c.executeMethod(ctx, http.MethodPut, reqMetadata) + defer closeResponse(resp) + if err != nil { + return err + } + if resp.StatusCode != http.StatusOK { + return httpRespToErrorResponse(resp, bucketName, "") + } + return nil +} + +// RemoveBucketEncryption removes the default encryption configuration on a bucket with a context to control cancellations and timeouts. +func (c Client) RemoveBucketEncryption(ctx context.Context, bucketName string) error { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return err + } + + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + urlValues.Set("encryption", "") + + // DELETE default encryption configuration on a bucket. + resp, err := c.executeMethod(ctx, http.MethodDelete, requestMetadata{ + bucketName: bucketName, + queryValues: urlValues, + contentSHA256Hex: emptySHA256Hex, + }) + defer closeResponse(resp) + if err != nil { + return err + } + if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusNoContent { + return httpRespToErrorResponse(resp, bucketName, "") + } + return nil +} + +// GetBucketEncryption gets the default encryption configuration +// on an existing bucket with a context to control cancellations and timeouts. +func (c Client) GetBucketEncryption(ctx context.Context, bucketName string) (*sse.Configuration, error) { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return nil, err + } + + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + urlValues.Set("encryption", "") + + // Execute GET on bucket to get the default encryption configuration. + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ + bucketName: bucketName, + queryValues: urlValues, + }) + + defer closeResponse(resp) + if err != nil { + return nil, err + } + + if resp.StatusCode != http.StatusOK { + return nil, httpRespToErrorResponse(resp, bucketName, "") + } + + encryptionConfig := &sse.Configuration{} + if err = xmlDecoder(resp.Body, encryptionConfig); err != nil { + return nil, err + } + + return encryptionConfig, nil +} diff --git a/vendor/github.com/minio/minio-go/v7/api-bucket-lifecycle.go b/vendor/github.com/minio/minio-go/v7/api-bucket-lifecycle.go new file mode 100644 index 000000000..e1fac813c --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-bucket-lifecycle.go @@ -0,0 +1,147 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2020 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "bytes" + "context" + "encoding/xml" + "io/ioutil" + "net/http" + "net/url" + + "github.com/minio/minio-go/v7/pkg/lifecycle" + "github.com/minio/minio-go/v7/pkg/s3utils" +) + +// SetBucketLifecycle set the lifecycle on an existing bucket. +func (c Client) SetBucketLifecycle(ctx context.Context, bucketName string, config *lifecycle.Configuration) error { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return err + } + + // If lifecycle is empty then delete it. + if config.Empty() { + return c.removeBucketLifecycle(ctx, bucketName) + } + + buf, err := xml.Marshal(config) + if err != nil { + return err + } + + // Save the updated lifecycle. + return c.putBucketLifecycle(ctx, bucketName, buf) +} + +// Saves a new bucket lifecycle. +func (c Client) putBucketLifecycle(ctx context.Context, bucketName string, buf []byte) error { + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + urlValues.Set("lifecycle", "") + + // Content-length is mandatory for put lifecycle request + reqMetadata := requestMetadata{ + bucketName: bucketName, + queryValues: urlValues, + contentBody: bytes.NewReader(buf), + contentLength: int64(len(buf)), + contentMD5Base64: sumMD5Base64(buf), + } + + // Execute PUT to upload a new bucket lifecycle. + resp, err := c.executeMethod(ctx, http.MethodPut, reqMetadata) + defer closeResponse(resp) + if err != nil { + return err + } + if resp != nil { + if resp.StatusCode != http.StatusOK { + return httpRespToErrorResponse(resp, bucketName, "") + } + } + return nil +} + +// Remove lifecycle from a bucket. +func (c Client) removeBucketLifecycle(ctx context.Context, bucketName string) error { + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + urlValues.Set("lifecycle", "") + + // Execute DELETE on objectName. + resp, err := c.executeMethod(ctx, http.MethodDelete, requestMetadata{ + bucketName: bucketName, + queryValues: urlValues, + contentSHA256Hex: emptySHA256Hex, + }) + defer closeResponse(resp) + if err != nil { + return err + } + return nil +} + +// GetBucketLifecycle fetch bucket lifecycle configuration +func (c Client) GetBucketLifecycle(ctx context.Context, bucketName string) (*lifecycle.Configuration, error) { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return nil, err + } + + bucketLifecycle, err := c.getBucketLifecycle(ctx, bucketName) + if err != nil { + return nil, err + } + + config := lifecycle.NewConfiguration() + if err = xml.Unmarshal(bucketLifecycle, config); err != nil { + return nil, err + } + return config, nil +} + +// Request server for current bucket lifecycle. +func (c Client) getBucketLifecycle(ctx context.Context, bucketName string) ([]byte, error) { + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + urlValues.Set("lifecycle", "") + + // Execute GET on bucket to get lifecycle. + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ + bucketName: bucketName, + queryValues: urlValues, + }) + + defer closeResponse(resp) + if err != nil { + return nil, err + } + + if resp != nil { + if resp.StatusCode != http.StatusOK { + return nil, httpRespToErrorResponse(resp, bucketName, "") + } + } + + return ioutil.ReadAll(resp.Body) +} diff --git a/vendor/github.com/minio/minio-go/v7/api-bucket-notification.go b/vendor/github.com/minio/minio-go/v7/api-bucket-notification.go new file mode 100644 index 000000000..76787ecab --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-bucket-notification.go @@ -0,0 +1,255 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2017-2020 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "bufio" + "bytes" + "context" + "encoding/xml" + "net/http" + "net/url" + "time" + + jsoniter "github.com/json-iterator/go" + "github.com/minio/minio-go/v7/pkg/notification" + "github.com/minio/minio-go/v7/pkg/s3utils" +) + +// SetBucketNotification saves a new bucket notification with a context to control cancellations and timeouts. +func (c Client) SetBucketNotification(ctx context.Context, bucketName string, config notification.Configuration) error { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return err + } + + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + urlValues.Set("notification", "") + + notifBytes, err := xml.Marshal(&config) + if err != nil { + return err + } + + notifBuffer := bytes.NewReader(notifBytes) + reqMetadata := requestMetadata{ + bucketName: bucketName, + queryValues: urlValues, + contentBody: notifBuffer, + contentLength: int64(len(notifBytes)), + contentMD5Base64: sumMD5Base64(notifBytes), + contentSHA256Hex: sum256Hex(notifBytes), + } + + // Execute PUT to upload a new bucket notification. + resp, err := c.executeMethod(ctx, http.MethodPut, reqMetadata) + defer closeResponse(resp) + if err != nil { + return err + } + if resp != nil { + if resp.StatusCode != http.StatusOK { + return httpRespToErrorResponse(resp, bucketName, "") + } + } + return nil +} + +// RemoveAllBucketNotification - Remove bucket notification clears all previously specified config +func (c Client) RemoveAllBucketNotification(ctx context.Context, bucketName string) error { + return c.SetBucketNotification(ctx, bucketName, notification.Configuration{}) +} + +// GetBucketNotification returns current bucket notification configuration +func (c Client) GetBucketNotification(ctx context.Context, bucketName string) (bucketNotification notification.Configuration, err error) { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return notification.Configuration{}, err + } + return c.getBucketNotification(ctx, bucketName) +} + +// Request server for notification rules. +func (c Client) getBucketNotification(ctx context.Context, bucketName string) (notification.Configuration, error) { + urlValues := make(url.Values) + urlValues.Set("notification", "") + + // Execute GET on bucket to list objects. + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ + bucketName: bucketName, + queryValues: urlValues, + contentSHA256Hex: emptySHA256Hex, + }) + + defer closeResponse(resp) + if err != nil { + return notification.Configuration{}, err + } + return processBucketNotificationResponse(bucketName, resp) + +} + +// processes the GetNotification http response from the server. +func processBucketNotificationResponse(bucketName string, resp *http.Response) (notification.Configuration, error) { + if resp.StatusCode != http.StatusOK { + errResponse := httpRespToErrorResponse(resp, bucketName, "") + return notification.Configuration{}, errResponse + } + var bucketNotification notification.Configuration + err := xmlDecoder(resp.Body, &bucketNotification) + if err != nil { + return notification.Configuration{}, err + } + return bucketNotification, nil +} + +// ListenNotification listen for all events, this is a MinIO specific API +func (c Client) ListenNotification(ctx context.Context, prefix, suffix string, events []string) <-chan notification.Info { + return c.ListenBucketNotification(ctx, "", prefix, suffix, events) +} + +// ListenBucketNotification listen for bucket events, this is a MinIO specific API +func (c Client) ListenBucketNotification(ctx context.Context, bucketName, prefix, suffix string, events []string) <-chan notification.Info { + notificationInfoCh := make(chan notification.Info, 1) + const notificationCapacity = 4 * 1024 * 1024 + notificationEventBuffer := make([]byte, notificationCapacity) + // Only success, start a routine to start reading line by line. + go func(notificationInfoCh chan<- notification.Info) { + defer close(notificationInfoCh) + + // Validate the bucket name. + if bucketName != "" { + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + select { + case notificationInfoCh <- notification.Info{ + Err: err, + }: + case <-ctx.Done(): + } + return + } + } + + // Check ARN partition to verify if listening bucket is supported + if s3utils.IsAmazonEndpoint(*c.endpointURL) || s3utils.IsGoogleEndpoint(*c.endpointURL) { + select { + case notificationInfoCh <- notification.Info{ + Err: errAPINotSupported("Listening for bucket notification is specific only to `minio` server endpoints"), + }: + case <-ctx.Done(): + } + return + } + + // Continuously run and listen on bucket notification. + // Create a done channel to control 'ListObjects' go routine. + retryDoneCh := make(chan struct{}, 1) + + // Indicate to our routine to exit cleanly upon return. + defer close(retryDoneCh) + + // Prepare urlValues to pass into the request on every loop + urlValues := make(url.Values) + urlValues.Set("prefix", prefix) + urlValues.Set("suffix", suffix) + urlValues["events"] = events + + // Wait on the jitter retry loop. + for range c.newRetryTimerContinous(time.Second, time.Second*30, MaxJitter, retryDoneCh) { + // Execute GET on bucket to list objects. + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ + bucketName: bucketName, + queryValues: urlValues, + contentSHA256Hex: emptySHA256Hex, + }) + if err != nil { + select { + case notificationInfoCh <- notification.Info{ + Err: err, + }: + case <-ctx.Done(): + } + return + } + + // Validate http response, upon error return quickly. + if resp.StatusCode != http.StatusOK { + errResponse := httpRespToErrorResponse(resp, bucketName, "") + select { + case notificationInfoCh <- notification.Info{ + Err: errResponse, + }: + case <-ctx.Done(): + } + return + } + + // Initialize a new bufio scanner, to read line by line. + bio := bufio.NewScanner(resp.Body) + + // Use a higher buffer to support unexpected + // caching done by proxies + bio.Buffer(notificationEventBuffer, notificationCapacity) + var json = jsoniter.ConfigCompatibleWithStandardLibrary + + // Unmarshal each line, returns marshaled values. + for bio.Scan() { + var notificationInfo notification.Info + if err = json.Unmarshal(bio.Bytes(), ¬ificationInfo); err != nil { + // Unexpected error during json unmarshal, send + // the error to caller for actionable as needed. + select { + case notificationInfoCh <- notification.Info{ + Err: err, + }: + case <-ctx.Done(): + return + } + closeResponse(resp) + continue + } + // Send notificationInfo + select { + case notificationInfoCh <- notificationInfo: + case <-ctx.Done(): + closeResponse(resp) + return + } + } + + if err = bio.Err(); err != nil { + select { + case notificationInfoCh <- notification.Info{ + Err: err, + }: + case <-ctx.Done(): + return + } + } + + // Close current connection before looping further. + closeResponse(resp) + + } + }(notificationInfoCh) + + // Returns the notification info channel, for caller to start reading from. + return notificationInfoCh +} diff --git a/vendor/github.com/minio/minio-go/v7/api-bucket-policy.go b/vendor/github.com/minio/minio-go/v7/api-bucket-policy.go new file mode 100644 index 000000000..72676f344 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-bucket-policy.go @@ -0,0 +1,142 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2020 MinIO, Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "context" + "io/ioutil" + "net/http" + "net/url" + "strings" + + "github.com/minio/minio-go/v7/pkg/s3utils" +) + +// SetBucketPolicy sets the access permissions on an existing bucket. +func (c Client) SetBucketPolicy(ctx context.Context, bucketName, policy string) error { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return err + } + + // If policy is empty then delete the bucket policy. + if policy == "" { + return c.removeBucketPolicy(ctx, bucketName) + } + + // Save the updated policies. + return c.putBucketPolicy(ctx, bucketName, policy) +} + +// Saves a new bucket policy. +func (c Client) putBucketPolicy(ctx context.Context, bucketName, policy string) error { + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + urlValues.Set("policy", "") + + reqMetadata := requestMetadata{ + bucketName: bucketName, + queryValues: urlValues, + contentBody: strings.NewReader(policy), + contentLength: int64(len(policy)), + } + + // Execute PUT to upload a new bucket policy. + resp, err := c.executeMethod(ctx, http.MethodPut, reqMetadata) + defer closeResponse(resp) + if err != nil { + return err + } + if resp != nil { + if resp.StatusCode != http.StatusNoContent { + return httpRespToErrorResponse(resp, bucketName, "") + } + } + return nil +} + +// Removes all policies on a bucket. +func (c Client) removeBucketPolicy(ctx context.Context, bucketName string) error { + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + urlValues.Set("policy", "") + + // Execute DELETE on objectName. + resp, err := c.executeMethod(ctx, http.MethodDelete, requestMetadata{ + bucketName: bucketName, + queryValues: urlValues, + contentSHA256Hex: emptySHA256Hex, + }) + defer closeResponse(resp) + if err != nil { + return err + } + return nil +} + +// GetBucketPolicy returns the current policy +func (c Client) GetBucketPolicy(ctx context.Context, bucketName string) (string, error) { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return "", err + } + bucketPolicy, err := c.getBucketPolicy(ctx, bucketName) + if err != nil { + errResponse := ToErrorResponse(err) + if errResponse.Code == "NoSuchBucketPolicy" { + return "", nil + } + return "", err + } + return bucketPolicy, nil +} + +// Request server for current bucket policy. +func (c Client) getBucketPolicy(ctx context.Context, bucketName string) (string, error) { + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + urlValues.Set("policy", "") + + // Execute GET on bucket to list objects. + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ + bucketName: bucketName, + queryValues: urlValues, + contentSHA256Hex: emptySHA256Hex, + }) + + defer closeResponse(resp) + if err != nil { + return "", err + } + + if resp != nil { + if resp.StatusCode != http.StatusOK { + return "", httpRespToErrorResponse(resp, bucketName, "") + } + } + + bucketPolicyBuf, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", err + } + + policy := string(bucketPolicyBuf) + return policy, err +} diff --git a/vendor/github.com/minio/minio-go/v7/api-bucket-replication.go b/vendor/github.com/minio/minio-go/v7/api-bucket-replication.go new file mode 100644 index 000000000..bfd5ea436 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-bucket-replication.go @@ -0,0 +1,149 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2020 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "bytes" + "context" + "encoding/xml" + "net/http" + "net/url" + + "github.com/minio/minio-go/v7/pkg/replication" + "github.com/minio/minio-go/v7/pkg/s3utils" +) + +// RemoveBucketReplication removes a replication config on an existing bucket. +func (c Client) RemoveBucketReplication(ctx context.Context, bucketName string) error { + return c.removeBucketReplication(ctx, bucketName) +} + +// SetBucketReplication sets a replication config on an existing bucket. +func (c Client) SetBucketReplication(ctx context.Context, bucketName string, cfg replication.Config) error { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return err + } + + // If replication is empty then delete it. + if cfg.Empty() { + return c.removeBucketReplication(ctx, bucketName) + } + // Save the updated replication. + return c.putBucketReplication(ctx, bucketName, cfg) +} + +// Saves a new bucket replication. +func (c Client) putBucketReplication(ctx context.Context, bucketName string, cfg replication.Config) error { + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + urlValues.Set("replication", "") + replication, err := xml.Marshal(cfg) + if err != nil { + return err + } + + reqMetadata := requestMetadata{ + bucketName: bucketName, + queryValues: urlValues, + contentBody: bytes.NewReader(replication), + contentLength: int64(len(replication)), + contentMD5Base64: sumMD5Base64(replication), + } + + // Execute PUT to upload a new bucket replication config. + resp, err := c.executeMethod(ctx, http.MethodPut, reqMetadata) + defer closeResponse(resp) + if err != nil { + return err + } + + if resp.StatusCode != http.StatusOK { + return httpRespToErrorResponse(resp, bucketName, "") + } + + return nil +} + +// Remove replication from a bucket. +func (c Client) removeBucketReplication(ctx context.Context, bucketName string) error { + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + urlValues.Set("replication", "") + + // Execute DELETE on objectName. + resp, err := c.executeMethod(ctx, http.MethodDelete, requestMetadata{ + bucketName: bucketName, + queryValues: urlValues, + contentSHA256Hex: emptySHA256Hex, + }) + defer closeResponse(resp) + if err != nil { + return err + } + return nil +} + +// GetBucketReplication fetches bucket replication configuration.If config is not +// found, returns empty config with nil error. +func (c Client) GetBucketReplication(ctx context.Context, bucketName string) (cfg replication.Config, err error) { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return cfg, err + } + bucketReplicationCfg, err := c.getBucketReplication(ctx, bucketName) + if err != nil { + errResponse := ToErrorResponse(err) + if errResponse.Code == "ReplicationConfigurationNotFoundError" { + return cfg, nil + } + return cfg, err + } + return bucketReplicationCfg, nil +} + +// Request server for current bucket replication config. +func (c Client) getBucketReplication(ctx context.Context, bucketName string) (cfg replication.Config, err error) { + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + urlValues.Set("replication", "") + + // Execute GET on bucket to get replication config. + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ + bucketName: bucketName, + queryValues: urlValues, + }) + + defer closeResponse(resp) + if err != nil { + return cfg, err + } + + if resp.StatusCode != http.StatusOK { + return cfg, httpRespToErrorResponse(resp, bucketName, "") + } + + if err = xmlDecoder(resp.Body, &cfg); err != nil { + return cfg, err + } + + return cfg, nil +} diff --git a/vendor/github.com/minio/minio-go/v7/api-bucket-tagging.go b/vendor/github.com/minio/minio-go/v7/api-bucket-tagging.go new file mode 100644 index 000000000..fcb966e63 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-bucket-tagging.go @@ -0,0 +1,135 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2020 MinIO, Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "bytes" + "context" + "encoding/xml" + "errors" + "io" + "io/ioutil" + "net/http" + "net/url" + + "github.com/minio/minio-go/v7/pkg/s3utils" + "github.com/minio/minio-go/v7/pkg/tags" +) + +// GetBucketTagging fetch tagging configuration for a bucket with a +// context to control cancellations and timeouts. +func (c Client) GetBucketTagging(ctx context.Context, bucketName string) (*tags.Tags, error) { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return nil, err + } + + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + urlValues.Set("tagging", "") + + // Execute GET on bucket to get tagging configuration. + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ + bucketName: bucketName, + queryValues: urlValues, + }) + + defer closeResponse(resp) + if err != nil { + return nil, err + } + + if resp.StatusCode != http.StatusOK { + return nil, httpRespToErrorResponse(resp, bucketName, "") + } + + defer io.Copy(ioutil.Discard, resp.Body) + return tags.ParseBucketXML(resp.Body) +} + +// SetBucketTagging sets tagging configuration for a bucket +// with a context to control cancellations and timeouts. +func (c Client) SetBucketTagging(ctx context.Context, bucketName string, tags *tags.Tags) error { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return err + } + + if tags == nil { + return errors.New("nil tags passed") + } + + buf, err := xml.Marshal(tags) + if err != nil { + return err + } + + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + urlValues.Set("tagging", "") + + // Content-length is mandatory to set a default encryption configuration + reqMetadata := requestMetadata{ + bucketName: bucketName, + queryValues: urlValues, + contentBody: bytes.NewReader(buf), + contentLength: int64(len(buf)), + contentMD5Base64: sumMD5Base64(buf), + } + + // Execute PUT on bucket to put tagging configuration. + resp, err := c.executeMethod(ctx, http.MethodPut, reqMetadata) + defer closeResponse(resp) + if err != nil { + return err + } + if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusNoContent { + return httpRespToErrorResponse(resp, bucketName, "") + } + return nil +} + +// RemoveBucketTagging removes tagging configuration for a +// bucket with a context to control cancellations and timeouts. +func (c Client) RemoveBucketTagging(ctx context.Context, bucketName string) error { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return err + } + + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + urlValues.Set("tagging", "") + + // Execute DELETE on bucket to remove tagging configuration. + resp, err := c.executeMethod(ctx, http.MethodDelete, requestMetadata{ + bucketName: bucketName, + queryValues: urlValues, + contentSHA256Hex: emptySHA256Hex, + }) + defer closeResponse(resp) + if err != nil { + return err + } + if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusNoContent { + return httpRespToErrorResponse(resp, bucketName, "") + } + return nil +} diff --git a/vendor/github.com/minio/minio-go/v7/api-bucket-versioning.go b/vendor/github.com/minio/minio-go/v7/api-bucket-versioning.go new file mode 100644 index 000000000..0889d43b0 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-bucket-versioning.go @@ -0,0 +1,120 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2020 MinIO, Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "bytes" + "context" + "encoding/xml" + "net/http" + "net/url" + + "github.com/minio/minio-go/v7/pkg/s3utils" +) + +// SetBucketVersioning sets a bucket versioning configuration +func (c Client) SetBucketVersioning(ctx context.Context, bucketName string, config BucketVersioningConfiguration) error { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return err + } + + buf, err := xml.Marshal(config) + if err != nil { + return err + } + + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + urlValues.Set("versioning", "") + + reqMetadata := requestMetadata{ + bucketName: bucketName, + queryValues: urlValues, + contentBody: bytes.NewReader(buf), + contentLength: int64(len(buf)), + contentMD5Base64: sumMD5Base64(buf), + contentSHA256Hex: sum256Hex(buf), + } + + // Execute PUT to set a bucket versioning. + resp, err := c.executeMethod(ctx, http.MethodPut, reqMetadata) + defer closeResponse(resp) + if err != nil { + return err + } + if resp != nil { + if resp.StatusCode != http.StatusOK { + return httpRespToErrorResponse(resp, bucketName, "") + } + } + return nil +} + +// EnableVersioning - enable object versioning in given bucket. +func (c Client) EnableVersioning(ctx context.Context, bucketName string) error { + return c.SetBucketVersioning(ctx, bucketName, BucketVersioningConfiguration{Status: "Enabled"}) +} + +// SuspendVersioning - suspend object versioning in given bucket. +func (c Client) SuspendVersioning(ctx context.Context, bucketName string) error { + return c.SetBucketVersioning(ctx, bucketName, BucketVersioningConfiguration{Status: "Suspended"}) +} + +// BucketVersioningConfiguration is the versioning configuration structure +type BucketVersioningConfiguration struct { + XMLName xml.Name `xml:"VersioningConfiguration"` + Status string `xml:"Status"` + MFADelete string `xml:"MfaDelete,omitempty"` +} + +// GetBucketVersioning gets the versioning configuration on +// an existing bucket with a context to control cancellations and timeouts. +func (c Client) GetBucketVersioning(ctx context.Context, bucketName string) (BucketVersioningConfiguration, error) { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return BucketVersioningConfiguration{}, err + } + + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + urlValues.Set("versioning", "") + + // Execute GET on bucket to get the versioning configuration. + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ + bucketName: bucketName, + queryValues: urlValues, + }) + + defer closeResponse(resp) + if err != nil { + return BucketVersioningConfiguration{}, err + } + + if resp.StatusCode != http.StatusOK { + return BucketVersioningConfiguration{}, httpRespToErrorResponse(resp, bucketName, "") + } + + versioningConfig := BucketVersioningConfiguration{} + if err = xmlDecoder(resp.Body, &versioningConfig); err != nil { + return versioningConfig, err + } + + return versioningConfig, nil +} diff --git a/vendor/github.com/minio/minio-go/v7/api-compose-object.go b/vendor/github.com/minio/minio-go/v7/api-compose-object.go new file mode 100644 index 000000000..e10737558 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-compose-object.go @@ -0,0 +1,552 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2017, 2018 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "context" + "fmt" + "io" + "io/ioutil" + "net/http" + "net/url" + "strconv" + "strings" + "time" + + "github.com/minio/minio-go/v7/pkg/encrypt" + "github.com/minio/minio-go/v7/pkg/s3utils" +) + +// CopyDestOptions represents options specified by user for CopyObject/ComposeObject APIs +type CopyDestOptions struct { + Bucket string // points to destination bucket + Object string // points to destination object + + // `Encryption` is the key info for server-side-encryption with customer + // provided key. If it is nil, no encryption is performed. + Encryption encrypt.ServerSide + + // `userMeta` is the user-metadata key-value pairs to be set on the + // destination. The keys are automatically prefixed with `x-amz-meta-` + // if needed. If nil is passed, and if only a single source (of any + // size) is provided in the ComposeObject call, then metadata from the + // source is copied to the destination. + // if no user-metadata is provided, it is copied from source + // (when there is only once source object in the compose + // request) + UserMetadata map[string]string + // UserMetadata is only set to destination if ReplaceMetadata is true + // other value is UserMetadata is ignored and we preserve src.UserMetadata + // NOTE: if you set this value to true and now metadata is present + // in UserMetadata your destination object will not have any metadata + // set. + ReplaceMetadata bool + + // `userTags` is the user defined object tags to be set on destination. + // This will be set only if the `replaceTags` field is set to true. + // Otherwise this field is ignored + UserTags map[string]string + ReplaceTags bool + + // Specifies whether you want to apply a Legal Hold to the copied object. + LegalHold LegalHoldStatus + + // Object Retention related fields + Mode RetentionMode + RetainUntilDate time.Time + + Size int64 // Needs to be specified if progress bar is specified. + // Progress of the entire copy operation will be sent here. + Progress io.Reader +} + +// Process custom-metadata to remove a `x-amz-meta-` prefix if +// present and validate that keys are distinct (after this +// prefix removal). +func filterCustomMeta(userMeta map[string]string) map[string]string { + m := make(map[string]string) + for k, v := range userMeta { + if strings.HasPrefix(strings.ToLower(k), "x-amz-meta-") { + k = k[len("x-amz-meta-"):] + } + if _, ok := m[k]; ok { + continue + } + m[k] = v + } + return m +} + +// Marshal converts all the CopyDestOptions into their +// equivalent HTTP header representation +func (opts CopyDestOptions) Marshal(header http.Header) { + const replaceDirective = "REPLACE" + if opts.ReplaceTags { + header.Set(amzTaggingHeaderDirective, replaceDirective) + if tags := s3utils.TagEncode(opts.UserTags); tags != "" { + header.Set(amzTaggingHeader, tags) + } + } + + if opts.LegalHold != LegalHoldStatus("") { + header.Set(amzLegalHoldHeader, opts.LegalHold.String()) + } + + if opts.Mode != RetentionMode("") && !opts.RetainUntilDate.IsZero() { + header.Set(amzLockMode, opts.Mode.String()) + header.Set(amzLockRetainUntil, opts.RetainUntilDate.Format(time.RFC3339)) + } + + if opts.Encryption != nil { + opts.Encryption.Marshal(header) + } + + if opts.ReplaceMetadata { + header.Set("x-amz-metadata-directive", replaceDirective) + for k, v := range filterCustomMeta(opts.UserMetadata) { + if isAmzHeader(k) || isStandardHeader(k) || isStorageClassHeader(k) { + header.Set(k, v) + } else { + header.Set("x-amz-meta-"+k, v) + } + } + } +} + +// toDestinationInfo returns a validated copyOptions object. +func (opts CopyDestOptions) validate() (err error) { + // Input validation. + if err = s3utils.CheckValidBucketName(opts.Bucket); err != nil { + return err + } + if err = s3utils.CheckValidObjectName(opts.Object); err != nil { + return err + } + if opts.Progress != nil && opts.Size < 0 { + return errInvalidArgument("For progress bar effective size needs to be specified") + } + return nil +} + +// CopySrcOptions represents a source object to be copied, using +// server-side copying APIs. +type CopySrcOptions struct { + Bucket, Object string + VersionID string + MatchETag string + NoMatchETag string + MatchModifiedSince time.Time + MatchUnmodifiedSince time.Time + MatchRange bool + Start, End int64 + Encryption encrypt.ServerSide +} + +// Marshal converts all the CopySrcOptions into their +// equivalent HTTP header representation +func (opts CopySrcOptions) Marshal(header http.Header) { + // Set the source header + header.Set("x-amz-copy-source", s3utils.EncodePath(opts.Bucket+"/"+opts.Object)) + if opts.VersionID != "" { + header.Set("x-amz-copy-source", s3utils.EncodePath(opts.Bucket+"/"+opts.Object)+"?versionId="+opts.VersionID) + } + + if opts.MatchETag != "" { + header.Set("x-amz-copy-source-if-match", opts.MatchETag) + } + if opts.NoMatchETag != "" { + header.Set("x-amz-copy-source-if-none-match", opts.NoMatchETag) + } + + if !opts.MatchModifiedSince.IsZero() { + header.Set("x-amz-copy-source-if-modified-since", opts.MatchModifiedSince.Format(http.TimeFormat)) + } + if !opts.MatchUnmodifiedSince.IsZero() { + header.Set("x-amz-copy-source-if-unmodified-since", opts.MatchUnmodifiedSince.Format(http.TimeFormat)) + } + + if opts.Encryption != nil { + encrypt.SSECopy(opts.Encryption).Marshal(header) + } +} + +func (opts CopySrcOptions) validate() (err error) { + // Input validation. + if err = s3utils.CheckValidBucketName(opts.Bucket); err != nil { + return err + } + if err = s3utils.CheckValidObjectName(opts.Object); err != nil { + return err + } + if opts.Start > opts.End || opts.Start < 0 { + return errInvalidArgument("start must be non-negative, and start must be at most end.") + } + return nil +} + +// Low level implementation of CopyObject API, supports only upto 5GiB worth of copy. +func (c Client) copyObjectDo(ctx context.Context, srcBucket, srcObject, destBucket, destObject string, + metadata map[string]string) (ObjectInfo, error) { + + // Build headers. + headers := make(http.Header) + + // Set all the metadata headers. + for k, v := range metadata { + headers.Set(k, v) + } + + // Set the source header + headers.Set("x-amz-copy-source", s3utils.EncodePath(srcBucket+"/"+srcObject)) + + // Send upload-part-copy request + resp, err := c.executeMethod(ctx, http.MethodPut, requestMetadata{ + bucketName: destBucket, + objectName: destObject, + customHeader: headers, + }) + defer closeResponse(resp) + if err != nil { + return ObjectInfo{}, err + } + + // Check if we got an error response. + if resp.StatusCode != http.StatusOK { + return ObjectInfo{}, httpRespToErrorResponse(resp, srcBucket, srcObject) + } + + cpObjRes := copyObjectResult{} + err = xmlDecoder(resp.Body, &cpObjRes) + if err != nil { + return ObjectInfo{}, err + } + + objInfo := ObjectInfo{ + Key: destObject, + ETag: strings.Trim(cpObjRes.ETag, "\""), + LastModified: cpObjRes.LastModified, + } + return objInfo, nil +} + +func (c Client) copyObjectPartDo(ctx context.Context, srcBucket, srcObject, destBucket, destObject string, uploadID string, + partID int, startOffset int64, length int64, metadata map[string]string) (p CompletePart, err error) { + + headers := make(http.Header) + + // Set source + headers.Set("x-amz-copy-source", s3utils.EncodePath(srcBucket+"/"+srcObject)) + + if startOffset < 0 { + return p, errInvalidArgument("startOffset must be non-negative") + } + + if length >= 0 { + headers.Set("x-amz-copy-source-range", fmt.Sprintf("bytes=%d-%d", startOffset, startOffset+length-1)) + } + + for k, v := range metadata { + headers.Set(k, v) + } + + queryValues := make(url.Values) + queryValues.Set("partNumber", strconv.Itoa(partID)) + queryValues.Set("uploadId", uploadID) + + resp, err := c.executeMethod(ctx, http.MethodPut, requestMetadata{ + bucketName: destBucket, + objectName: destObject, + customHeader: headers, + queryValues: queryValues, + }) + defer closeResponse(resp) + if err != nil { + return + } + + // Check if we got an error response. + if resp.StatusCode != http.StatusOK { + return p, httpRespToErrorResponse(resp, destBucket, destObject) + } + + // Decode copy-part response on success. + cpObjRes := copyObjectResult{} + err = xmlDecoder(resp.Body, &cpObjRes) + if err != nil { + return p, err + } + p.PartNumber, p.ETag = partID, cpObjRes.ETag + return p, nil +} + +// uploadPartCopy - helper function to create a part in a multipart +// upload via an upload-part-copy request +// https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadUploadPartCopy.html +func (c Client) uploadPartCopy(ctx context.Context, bucket, object, uploadID string, partNumber int, + headers http.Header) (p CompletePart, err error) { + + // Build query parameters + urlValues := make(url.Values) + urlValues.Set("partNumber", strconv.Itoa(partNumber)) + urlValues.Set("uploadId", uploadID) + + // Send upload-part-copy request + resp, err := c.executeMethod(ctx, http.MethodPut, requestMetadata{ + bucketName: bucket, + objectName: object, + customHeader: headers, + queryValues: urlValues, + }) + defer closeResponse(resp) + if err != nil { + return p, err + } + + // Check if we got an error response. + if resp.StatusCode != http.StatusOK { + return p, httpRespToErrorResponse(resp, bucket, object) + } + + // Decode copy-part response on success. + cpObjRes := copyObjectResult{} + err = xmlDecoder(resp.Body, &cpObjRes) + if err != nil { + return p, err + } + p.PartNumber, p.ETag = partNumber, cpObjRes.ETag + return p, nil +} + +// ComposeObject - creates an object using server-side copying +// of existing objects. It takes a list of source objects (with optional offsets) +// and concatenates them into a new object using only server-side copying +// operations. Optionally takes progress reader hook for applications to +// look at current progress. +func (c Client) ComposeObject(ctx context.Context, dst CopyDestOptions, srcs ...CopySrcOptions) (UploadInfo, error) { + if len(srcs) < 1 || len(srcs) > maxPartsCount { + return UploadInfo{}, errInvalidArgument("There must be as least one and up to 10000 source objects.") + } + + for _, src := range srcs { + if err := src.validate(); err != nil { + return UploadInfo{}, err + } + } + + if err := dst.validate(); err != nil { + return UploadInfo{}, err + } + + srcObjectInfos := make([]ObjectInfo, len(srcs)) + srcObjectSizes := make([]int64, len(srcs)) + var totalSize, totalParts int64 + var err error + for i, src := range srcs { + opts := StatObjectOptions{ServerSideEncryption: encrypt.SSE(src.Encryption), VersionID: src.VersionID} + srcObjectInfos[i], err = c.statObject(context.Background(), src.Bucket, src.Object, opts) + if err != nil { + return UploadInfo{}, err + } + + srcCopySize := srcObjectInfos[i].Size + // Check if a segment is specified, and if so, is the + // segment within object bounds? + if src.MatchRange { + // Since range is specified, + // 0 <= src.start <= src.end + // so only invalid case to check is: + if src.End >= srcCopySize || src.Start < 0 { + return UploadInfo{}, errInvalidArgument( + fmt.Sprintf("CopySrcOptions %d has invalid segment-to-copy [%d, %d] (size is %d)", + i, src.Start, src.End, srcCopySize)) + } + srcCopySize = src.End - src.Start + 1 + } + + // Only the last source may be less than `absMinPartSize` + if srcCopySize < absMinPartSize && i < len(srcs)-1 { + return UploadInfo{}, errInvalidArgument( + fmt.Sprintf("CopySrcOptions %d is too small (%d) and it is not the last part", i, srcCopySize)) + } + + // Is data to copy too large? + totalSize += srcCopySize + if totalSize > maxMultipartPutObjectSize { + return UploadInfo{}, errInvalidArgument(fmt.Sprintf("Cannot compose an object of size %d (> 5TiB)", totalSize)) + } + + // record source size + srcObjectSizes[i] = srcCopySize + + // calculate parts needed for current source + totalParts += partsRequired(srcCopySize) + // Do we need more parts than we are allowed? + if totalParts > maxPartsCount { + return UploadInfo{}, errInvalidArgument(fmt.Sprintf( + "Your proposed compose object requires more than %d parts", maxPartsCount)) + } + } + + // Single source object case (i.e. when only one source is + // involved, it is being copied wholly and at most 5GiB in + // size, emptyfiles are also supported). + if (totalParts == 1 && srcs[0].Start == -1 && totalSize <= maxPartSize) || (totalSize == 0) { + return c.CopyObject(ctx, dst, srcs[0]) + } + + // Now, handle multipart-copy cases. + + // 1. Ensure that the object has not been changed while + // we are copying data. + for i, src := range srcs { + src.MatchETag = srcObjectInfos[i].ETag + } + + // 2. Initiate a new multipart upload. + + // Set user-metadata on the destination object. If no + // user-metadata is specified, and there is only one source, + // (only) then metadata from source is copied. + var userMeta map[string]string + if dst.ReplaceMetadata { + userMeta = dst.UserMetadata + } else { + userMeta = srcObjectInfos[0].UserMetadata + } + + var userTags map[string]string + if dst.ReplaceTags { + userTags = dst.UserTags + } else { + userTags = srcObjectInfos[0].UserTags + } + + uploadID, err := c.newUploadID(ctx, dst.Bucket, dst.Object, PutObjectOptions{ + ServerSideEncryption: dst.Encryption, + UserMetadata: userMeta, + UserTags: userTags, + Mode: dst.Mode, + RetainUntilDate: dst.RetainUntilDate, + LegalHold: dst.LegalHold, + }) + if err != nil { + return UploadInfo{}, err + } + + // 3. Perform copy part uploads + objParts := []CompletePart{} + partIndex := 1 + for i, src := range srcs { + var h = make(http.Header) + src.Marshal(h) + if dst.Encryption != nil && dst.Encryption.Type() == encrypt.SSEC { + dst.Encryption.Marshal(h) + } + + // calculate start/end indices of parts after + // splitting. + startIdx, endIdx := calculateEvenSplits(srcObjectSizes[i], src) + for j, start := range startIdx { + end := endIdx[j] + + // Add (or reset) source range header for + // upload part copy request. + h.Set("x-amz-copy-source-range", + fmt.Sprintf("bytes=%d-%d", start, end)) + + // make upload-part-copy request + complPart, err := c.uploadPartCopy(ctx, dst.Bucket, + dst.Object, uploadID, partIndex, h) + if err != nil { + return UploadInfo{}, err + } + if dst.Progress != nil { + io.CopyN(ioutil.Discard, dst.Progress, end-start+1) + } + objParts = append(objParts, complPart) + partIndex++ + } + } + + // 4. Make final complete-multipart request. + uploadInfo, err := c.completeMultipartUpload(ctx, dst.Bucket, dst.Object, uploadID, + completeMultipartUpload{Parts: objParts}) + if err != nil { + return UploadInfo{}, err + } + + uploadInfo.Size = totalSize + return uploadInfo, nil +} + +// partsRequired is maximum parts possible with +// max part size of ceiling(maxMultipartPutObjectSize / (maxPartsCount - 1)) +func partsRequired(size int64) int64 { + maxPartSize := maxMultipartPutObjectSize / (maxPartsCount - 1) + r := size / int64(maxPartSize) + if size%int64(maxPartSize) > 0 { + r++ + } + return r +} + +// calculateEvenSplits - computes splits for a source and returns +// start and end index slices. Splits happen evenly to be sure that no +// part is less than 5MiB, as that could fail the multipart request if +// it is not the last part. +func calculateEvenSplits(size int64, src CopySrcOptions) (startIndex, endIndex []int64) { + if size == 0 { + return + } + + reqParts := partsRequired(size) + startIndex = make([]int64, reqParts) + endIndex = make([]int64, reqParts) + // Compute number of required parts `k`, as: + // + // k = ceiling(size / copyPartSize) + // + // Now, distribute the `size` bytes in the source into + // k parts as evenly as possible: + // + // r parts sized (q+1) bytes, and + // (k - r) parts sized q bytes, where + // + // size = q * k + r (by simple division of size by k, + // so that 0 <= r < k) + // + start := src.Start + if start == -1 { + start = 0 + } + quot, rem := size/reqParts, size%reqParts + nextStart := start + for j := int64(0); j < reqParts; j++ { + curPartSize := quot + if j < rem { + curPartSize++ + } + + cStart := nextStart + cEnd := cStart + curPartSize - 1 + nextStart = cEnd + 1 + + startIndex[j], endIndex[j] = cStart, cEnd + } + return +} diff --git a/vendor/github.com/minio/minio-go/v7/api-datatypes.go b/vendor/github.com/minio/minio-go/v7/api-datatypes.go new file mode 100644 index 000000000..970e1fa5e --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-datatypes.go @@ -0,0 +1,173 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2020 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "encoding/xml" + "io" + "net/http" + "time" +) + +// BucketInfo container for bucket metadata. +type BucketInfo struct { + // The name of the bucket. + Name string `json:"name"` + // Date the bucket was created. + CreationDate time.Time `json:"creationDate"` +} + +// StringMap represents map with custom UnmarshalXML +type StringMap map[string]string + +// UnmarshalXML unmarshals the XML into a map of string to strings, +// creating a key in the map for each tag and setting it's value to the +// tags contents. +// +// The fact this function is on the pointer of Map is important, so that +// if m is nil it can be initialized, which is often the case if m is +// nested in another xml structural. This is also why the first thing done +// on the first line is initialize it. +func (m *StringMap) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + *m = StringMap{} + type xmlMapEntry struct { + XMLName xml.Name + Value string `xml:",chardata"` + } + for { + var e xmlMapEntry + err := d.Decode(&e) + if err == io.EOF { + break + } else if err != nil { + return err + } + (*m)[e.XMLName.Local] = e.Value + } + return nil +} + +// Owner name. +type Owner struct { + DisplayName string `json:"name"` + ID string `json:"id"` +} + +// UploadInfo contains information about the +// newly uploaded or copied object. +type UploadInfo struct { + Bucket string + Key string + ETag string + Size int64 + LastModified time.Time + Location string + VersionID string + + // Lifecycle expiry-date and ruleID associated with the expiry + // not to be confused with `Expires` HTTP header. + Expiration time.Time + ExpirationRuleID string +} + +// ObjectInfo container for object metadata. +type ObjectInfo struct { + // An ETag is optionally set to md5sum of an object. In case of multipart objects, + // ETag is of the form MD5SUM-N where MD5SUM is md5sum of all individual md5sums of + // each parts concatenated into one string. + ETag string `json:"etag"` + + Key string `json:"name"` // Name of the object + LastModified time.Time `json:"lastModified"` // Date and time the object was last modified. + Size int64 `json:"size"` // Size in bytes of the object. + ContentType string `json:"contentType"` // A standard MIME type describing the format of the object data. + Expires time.Time `json:"expires"` // The date and time at which the object is no longer able to be cached. + + // Collection of additional metadata on the object. + // eg: x-amz-meta-*, content-encoding etc. + Metadata http.Header `json:"metadata" xml:"-"` + + // x-amz-meta-* headers stripped "x-amz-meta-" prefix containing the first value. + UserMetadata StringMap `json:"userMetadata"` + + // x-amz-tagging values in their k/v values. + UserTags map[string]string `json:"userTags"` + + // x-amz-tagging-count value + UserTagCount int + + // Owner name. + Owner Owner + + // ACL grant. + Grant []struct { + Grantee struct { + ID string `xml:"ID"` + DisplayName string `xml:"DisplayName"` + URI string `xml:"URI"` + } `xml:"Grantee"` + Permission string `xml:"Permission"` + } `xml:"Grant"` + + // The class of storage used to store the object. + StorageClass string `json:"storageClass"` + + // Versioning related information + IsLatest bool + IsDeleteMarker bool + VersionID string `xml:"VersionId"` + + // x-amz-replication-status value is either in one of the following states + // - COMPLETE + // - PENDING + // - FAILED + // - REPLICA (on the destination) + ReplicationStatus string `xml:"ReplicationStatus"` + + // Lifecycle expiry-date and ruleID associated with the expiry + // not to be confused with `Expires` HTTP header. + Expiration time.Time + ExpirationRuleID string + + // Error + Err error `json:"-"` +} + +// ObjectMultipartInfo container for multipart object metadata. +type ObjectMultipartInfo struct { + // Date and time at which the multipart upload was initiated. + Initiated time.Time `type:"timestamp" timestampFormat:"iso8601"` + + Initiator initiator + Owner owner + + // The type of storage to use for the object. Defaults to 'STANDARD'. + StorageClass string + + // Key of the object for which the multipart upload was initiated. + Key string + + // Size in bytes of the object. + Size int64 + + // Upload ID that identifies the multipart upload. + UploadID string `xml:"UploadId"` + + // Error + Err error +} diff --git a/vendor/github.com/minio/minio-go/api-error-response.go b/vendor/github.com/minio/minio-go/v7/api-error-response.go similarity index 79% rename from vendor/github.com/minio/minio-go/api-error-response.go rename to vendor/github.com/minio/minio-go/v7/api-error-response.go index 655991cff..f439a8870 100644 --- a/vendor/github.com/minio/minio-go/api-error-response.go +++ b/vendor/github.com/minio/minio-go/v7/api-error-response.go @@ -1,6 +1,6 @@ /* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2020 MinIO, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,6 +36,8 @@ import ( */ // ErrorResponse - Is the typed error returned by all API operations. +// ErrorResponse struct should be comparable since it is compared inside +// golang http API (https://github.com/golang/go/issues/29768) type ErrorResponse struct { XMLName xml.Name `xml:"Error" json:"-"` Code string @@ -49,11 +51,11 @@ type ErrorResponse struct { // only in HEAD bucket and ListObjects response. Region string + // Captures the server string returned in response header. + Server string + // Underlying HTTP status code for the returned error StatusCode int `xml:"-" json:"-"` - - // Headers of the returned S3 XML error - Headers http.Header `xml:"-" json:"-"` } // ToErrorResponse - Returns parsed ErrorResponse struct from body and @@ -61,7 +63,7 @@ type ErrorResponse struct { // // For example: // -// import s3 "github.com/minio/minio-go" +// import s3 "github.com/minio/minio-go/v7" // ... // ... // reader, stat, err := s3.GetObject(...) @@ -101,11 +103,12 @@ const ( func httpRespToErrorResponse(resp *http.Response, bucketName, objectName string) error { if resp == nil { msg := "Response is empty. " + reportIssue - return ErrInvalidArgument(msg) + return errInvalidArgument(msg) } errResp := ErrorResponse{ StatusCode: resp.StatusCode, + Server: resp.Header.Get("Server"), } err := xmlDecoder(resp.Body, &errResp) @@ -177,14 +180,11 @@ func httpRespToErrorResponse(resp *http.Response, bucketName, objectName string) errResp.Message = fmt.Sprintf("Region does not match, expecting region ‘%s’.", errResp.Region) } - // Save headers returned in the API XML error - errResp.Headers = resp.Header - return errResp } -// ErrTransferAccelerationBucket - bucket name is invalid to be used with transfer acceleration. -func ErrTransferAccelerationBucket(bucketName string) error { +// errTransferAccelerationBucket - bucket name is invalid to be used with transfer acceleration. +func errTransferAccelerationBucket(bucketName string) error { return ErrorResponse{ StatusCode: http.StatusBadRequest, Code: "InvalidArgument", @@ -193,8 +193,8 @@ func ErrTransferAccelerationBucket(bucketName string) error { } } -// ErrEntityTooLarge - Input size is larger than supported maximum. -func ErrEntityTooLarge(totalSize, maxObjectSize int64, bucketName, objectName string) error { +// errEntityTooLarge - Input size is larger than supported maximum. +func errEntityTooLarge(totalSize, maxObjectSize int64, bucketName, objectName string) error { msg := fmt.Sprintf("Your proposed upload size ‘%d’ exceeds the maximum allowed object size ‘%d’ for single PUT operation.", totalSize, maxObjectSize) return ErrorResponse{ StatusCode: http.StatusBadRequest, @@ -205,8 +205,8 @@ func ErrEntityTooLarge(totalSize, maxObjectSize int64, bucketName, objectName st } } -// ErrEntityTooSmall - Input size is smaller than supported minimum. -func ErrEntityTooSmall(totalSize int64, bucketName, objectName string) error { +// errEntityTooSmall - Input size is smaller than supported minimum. +func errEntityTooSmall(totalSize int64, bucketName, objectName string) error { msg := fmt.Sprintf("Your proposed upload size ‘%d’ is below the minimum allowed object size ‘0B’ for single PUT operation.", totalSize) return ErrorResponse{ StatusCode: http.StatusBadRequest, @@ -217,8 +217,8 @@ func ErrEntityTooSmall(totalSize int64, bucketName, objectName string) error { } } -// ErrUnexpectedEOF - Unexpected end of file reached. -func ErrUnexpectedEOF(totalRead, totalSize int64, bucketName, objectName string) error { +// errUnexpectedEOF - Unexpected end of file reached. +func errUnexpectedEOF(totalRead, totalSize int64, bucketName, objectName string) error { msg := fmt.Sprintf("Data read ‘%d’ is not equal to the size ‘%d’ of the input Reader.", totalRead, totalSize) return ErrorResponse{ StatusCode: http.StatusBadRequest, @@ -229,8 +229,8 @@ func ErrUnexpectedEOF(totalRead, totalSize int64, bucketName, objectName string) } } -// ErrInvalidBucketName - Invalid bucket name response. -func ErrInvalidBucketName(message string) error { +// errInvalidBucketName - Invalid bucket name response. +func errInvalidBucketName(message string) error { return ErrorResponse{ StatusCode: http.StatusBadRequest, Code: "InvalidBucketName", @@ -239,8 +239,8 @@ func ErrInvalidBucketName(message string) error { } } -// ErrInvalidObjectName - Invalid object name response. -func ErrInvalidObjectName(message string) error { +// errInvalidObjectName - Invalid object name response. +func errInvalidObjectName(message string) error { return ErrorResponse{ StatusCode: http.StatusNotFound, Code: "NoSuchKey", @@ -249,12 +249,8 @@ func ErrInvalidObjectName(message string) error { } } -// ErrInvalidObjectPrefix - Invalid object prefix response is -// similar to object name response. -var ErrInvalidObjectPrefix = ErrInvalidObjectName - -// ErrInvalidArgument - Invalid argument response. -func ErrInvalidArgument(message string) error { +// errInvalidArgument - Invalid argument response. +func errInvalidArgument(message string) error { return ErrorResponse{ StatusCode: http.StatusBadRequest, Code: "InvalidArgument", @@ -263,20 +259,9 @@ func ErrInvalidArgument(message string) error { } } -// ErrNoSuchBucketPolicy - No Such Bucket Policy response -// The specified bucket does not have a bucket policy. -func ErrNoSuchBucketPolicy(message string) error { - return ErrorResponse{ - StatusCode: http.StatusNotFound, - Code: "NoSuchBucketPolicy", - Message: message, - RequestID: "minio", - } -} - -// ErrAPINotSupported - API not supported response +// errAPINotSupported - API not supported response // The specified API call is not supported -func ErrAPINotSupported(message string) error { +func errAPINotSupported(message string) error { return ErrorResponse{ StatusCode: http.StatusNotImplemented, Code: "APINotSupported", diff --git a/vendor/github.com/minio/minio-go/v7/api-get-object-acl.go b/vendor/github.com/minio/minio-go/v7/api-get-object-acl.go new file mode 100644 index 000000000..afa53079d --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-get-object-acl.go @@ -0,0 +1,140 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2018 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "context" + "net/http" + "net/url" +) + +type accessControlPolicy struct { + Owner struct { + ID string `xml:"ID"` + DisplayName string `xml:"DisplayName"` + } `xml:"Owner"` + AccessControlList struct { + Grant []struct { + Grantee struct { + ID string `xml:"ID"` + DisplayName string `xml:"DisplayName"` + URI string `xml:"URI"` + } `xml:"Grantee"` + Permission string `xml:"Permission"` + } `xml:"Grant"` + } `xml:"AccessControlList"` +} + +// GetObjectACL get object ACLs +func (c Client) GetObjectACL(ctx context.Context, bucketName, objectName string) (*ObjectInfo, error) { + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ + bucketName: bucketName, + objectName: objectName, + queryValues: url.Values{ + "acl": []string{""}, + }, + }) + if err != nil { + return nil, err + } + defer closeResponse(resp) + + if resp.StatusCode != http.StatusOK { + return nil, httpRespToErrorResponse(resp, bucketName, objectName) + } + + res := &accessControlPolicy{} + + if err := xmlDecoder(resp.Body, res); err != nil { + return nil, err + } + + objInfo, err := c.statObject(ctx, bucketName, objectName, StatObjectOptions{}) + if err != nil { + return nil, err + } + + objInfo.Owner.DisplayName = res.Owner.DisplayName + objInfo.Owner.ID = res.Owner.ID + + objInfo.Grant = append(objInfo.Grant, res.AccessControlList.Grant...) + + cannedACL := getCannedACL(res) + if cannedACL != "" { + objInfo.Metadata.Add("X-Amz-Acl", cannedACL) + return &objInfo, nil + } + + grantACL := getAmzGrantACL(res) + for k, v := range grantACL { + objInfo.Metadata[k] = v + } + + return &objInfo, nil +} + +func getCannedACL(aCPolicy *accessControlPolicy) string { + grants := aCPolicy.AccessControlList.Grant + + switch { + case len(grants) == 1: + if grants[0].Grantee.URI == "" && grants[0].Permission == "FULL_CONTROL" { + return "private" + } + case len(grants) == 2: + for _, g := range grants { + if g.Grantee.URI == "http://acs.amazonaws.com/groups/global/AuthenticatedUsers" && g.Permission == "READ" { + return "authenticated-read" + } + if g.Grantee.URI == "http://acs.amazonaws.com/groups/global/AllUsers" && g.Permission == "READ" { + return "public-read" + } + if g.Permission == "READ" && g.Grantee.ID == aCPolicy.Owner.ID { + return "bucket-owner-read" + } + } + case len(grants) == 3: + for _, g := range grants { + if g.Grantee.URI == "http://acs.amazonaws.com/groups/global/AllUsers" && g.Permission == "WRITE" { + return "public-read-write" + } + } + } + return "" +} + +func getAmzGrantACL(aCPolicy *accessControlPolicy) map[string][]string { + grants := aCPolicy.AccessControlList.Grant + res := map[string][]string{} + + for _, g := range grants { + switch { + case g.Permission == "READ": + res["X-Amz-Grant-Read"] = append(res["X-Amz-Grant-Read"], "id="+g.Grantee.ID) + case g.Permission == "WRITE": + res["X-Amz-Grant-Write"] = append(res["X-Amz-Grant-Write"], "id="+g.Grantee.ID) + case g.Permission == "READ_ACP": + res["X-Amz-Grant-Read-Acp"] = append(res["X-Amz-Grant-Read-Acp"], "id="+g.Grantee.ID) + case g.Permission == "WRITE_ACP": + res["X-Amz-Grant-Write-Acp"] = append(res["X-Amz-Grant-Write-Acp"], "id="+g.Grantee.ID) + case g.Permission == "FULL_CONTROL": + res["X-Amz-Grant-Full-Control"] = append(res["X-Amz-Grant-Full-Control"], "id="+g.Grantee.ID) + } + } + return res +} diff --git a/vendor/github.com/minio/minio-go/v7/api-get-object-file.go b/vendor/github.com/minio/minio-go/v7/api-get-object-file.go new file mode 100644 index 000000000..bccff4578 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-get-object-file.go @@ -0,0 +1,127 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2017 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "context" + "io" + "os" + "path/filepath" + + "github.com/minio/minio-go/v7/pkg/s3utils" +) + +// FGetObject - download contents of an object to a local file. +// The options can be used to specify the GET request further. +func (c Client) FGetObject(ctx context.Context, bucketName, objectName, filePath string, opts GetObjectOptions) error { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return err + } + if err := s3utils.CheckValidObjectName(objectName); err != nil { + return err + } + + // Verify if destination already exists. + st, err := os.Stat(filePath) + if err == nil { + // If the destination exists and is a directory. + if st.IsDir() { + return errInvalidArgument("fileName is a directory.") + } + } + + // Proceed if file does not exist. return for all other errors. + if err != nil { + if !os.IsNotExist(err) { + return err + } + } + + // Extract top level directory. + objectDir, _ := filepath.Split(filePath) + if objectDir != "" { + // Create any missing top level directories. + if err := os.MkdirAll(objectDir, 0700); err != nil { + return err + } + } + + // Gather md5sum. + objectStat, err := c.StatObject(ctx, bucketName, objectName, StatObjectOptions(opts)) + if err != nil { + return err + } + + // Write to a temporary file "fileName.part.minio" before saving. + filePartPath := filePath + objectStat.ETag + ".part.minio" + + // If exists, open in append mode. If not create it as a part file. + filePart, err := os.OpenFile(filePartPath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600) + if err != nil { + return err + } + + // If we return early with an error, be sure to close and delete + // filePart. If we have an error along the way there is a chance + // that filePart is somehow damaged, and we should discard it. + closeAndRemove := true + defer func() { + if closeAndRemove { + _ = filePart.Close() + _ = os.Remove(filePartPath) + } + }() + + // Issue Stat to get the current offset. + st, err = filePart.Stat() + if err != nil { + return err + } + + // Initialize get object request headers to set the + // appropriate range offsets to read from. + if st.Size() > 0 { + opts.SetRange(st.Size(), 0) + } + + // Seek to current position for incoming reader. + objectReader, objectStat, _, err := c.getObject(ctx, bucketName, objectName, opts) + if err != nil { + return err + } + + // Write to the part file. + if _, err = io.CopyN(filePart, objectReader, objectStat.Size); err != nil { + return err + } + + // Close the file before rename, this is specifically needed for Windows users. + closeAndRemove = false + if err = filePart.Close(); err != nil { + return err + } + + // Safely completed. Now commit by renaming to actual filename. + if err = os.Rename(filePartPath, filePath); err != nil { + return err + } + + // Return. + return nil +} diff --git a/vendor/github.com/minio/minio-go/api-get-object.go b/vendor/github.com/minio/minio-go/v7/api-get-object.go similarity index 84% rename from vendor/github.com/minio/minio-go/api-get-object.go rename to vendor/github.com/minio/minio-go/v7/api-get-object.go index 0bf556ec6..2df1112a9 100644 --- a/vendor/github.com/minio/minio-go/api-get-object.go +++ b/vendor/github.com/minio/minio-go/v7/api-get-object.go @@ -1,6 +1,6 @@ /* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2020 MinIO, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,20 +23,14 @@ import ( "fmt" "io" "net/http" - "strings" + "net/url" "sync" - "time" - "github.com/minio/minio-go/pkg/s3utils" + "github.com/minio/minio-go/v7/pkg/s3utils" ) -// GetObject - returns an seekable, readable object. -func (c Client) GetObject(bucketName, objectName string, opts GetObjectOptions) (*Object, error) { - return c.getObjectWithContext(context.Background(), bucketName, objectName, opts) -} - // GetObject wrapper function that accepts a request context -func (c Client) getObjectWithContext(ctx context.Context, bucketName, objectName string, opts GetObjectOptions) (*Object, error) { +func (c Client) GetObject(ctx context.Context, bucketName, objectName string, opts GetObjectOptions) (*Object, error) { // Input validation. if err := s3utils.CheckValidBucketName(bucketName); err != nil { return nil, err @@ -45,6 +39,14 @@ func (c Client) getObjectWithContext(ctx context.Context, bucketName, objectName return nil, err } + // Detect if snowball is server location we are talking to. + var snowball bool + if location, ok := c.bucketLocCache.Get(bucketName); ok { + if location == "snowball" { + snowball = true + } + } + var httpReader io.ReadCloser var objectInfo ObjectInfo var err error @@ -92,7 +94,7 @@ func (c Client) getObjectWithContext(ctx context.Context, bucketName, objectName } else if req.Offset > 0 { opts.SetRange(req.Offset, 0) } - httpReader, objectInfo, err = c.getObject(ctx, bucketName, objectName, opts) + httpReader, objectInfo, _, err = c.getObject(ctx, bucketName, objectName, opts) if err != nil { resCh <- getResponse{Error: err} return @@ -100,7 +102,7 @@ func (c Client) getObjectWithContext(ctx context.Context, bucketName, objectName etag = objectInfo.ETag // Read at least firstReq.Buffer bytes, if not we have // reached our EOF. - size, err := io.ReadFull(httpReader, req.Buffer) + size, err := readFull(httpReader, req.Buffer) if size > 0 && err == io.ErrUnexpectedEOF { // If an EOF happens after reading some but not // all the bytes ReadFull returns ErrUnexpectedEOF @@ -119,7 +121,7 @@ func (c Client) getObjectWithContext(ctx context.Context, bucketName, objectName // Remove range header if already set, for stat Operations to get original file size. delete(opts.headers, "Range") - objectInfo, err = c.statObject(ctx, bucketName, objectName, StatObjectOptions{opts}) + objectInfo, err = c.statObject(ctx, bucketName, objectName, StatObjectOptions(opts)) if err != nil { resCh <- getResponse{ Error: err, @@ -136,10 +138,13 @@ func (c Client) getObjectWithContext(ctx context.Context, bucketName, objectName } else if req.settingObjectInfo { // Request is just to get objectInfo. // Remove range header if already set, for stat Operations to get original file size. delete(opts.headers, "Range") - if etag != "" { + // Check whether this is snowball + // if yes do not use If-Match feature + // it doesn't work. + if etag != "" && !snowball { opts.SetMatchETag(etag) } - objectInfo, err := c.statObject(ctx, bucketName, objectName, StatObjectOptions{opts}) + objectInfo, err := c.statObject(ctx, bucketName, objectName, StatObjectOptions(opts)) if err != nil { resCh <- getResponse{ Error: err, @@ -159,7 +164,10 @@ func (c Client) getObjectWithContext(ctx context.Context, bucketName, objectName // new ones when they haven't been already. // All readAt requests are new requests. if req.DidOffsetChange || !req.beenRead { - if etag != "" { + // Check whether this is snowball + // if yes do not use If-Match feature + // it doesn't work. + if etag != "" && !snowball { opts.SetMatchETag(etag) } if httpReader != nil { @@ -173,7 +181,7 @@ func (c Client) getObjectWithContext(ctx context.Context, bucketName, objectName } else if req.Offset > 0 { // Range is set with respect to the offset. opts.SetRange(req.Offset, 0) } - httpReader, objectInfo, err = c.getObject(ctx, bucketName, objectName, opts) + httpReader, objectInfo, _, err = c.getObject(ctx, bucketName, objectName, opts) if err != nil { resCh <- getResponse{ Error: err, @@ -184,8 +192,8 @@ func (c Client) getObjectWithContext(ctx context.Context, bucketName, objectName // Read at least req.Buffer bytes, if not we have // reached our EOF. - size, err := io.ReadFull(httpReader, req.Buffer) - if err == io.ErrUnexpectedEOF { + size, err := readFull(httpReader, req.Buffer) + if size > 0 && err == io.ErrUnexpectedEOF { // If an EOF happens after reading some but not // all the bytes ReadFull returns ErrUnexpectedEOF err = io.EOF @@ -310,7 +318,7 @@ func (o *Object) setOffset(bytesRead int64) error { // io.EOF upon end of file. func (o *Object) Read(b []byte) (n int, err error) { if o == nil { - return 0, ErrInvalidArgument("Object is nil") + return 0, errInvalidArgument("Object is nil") } // Locking. @@ -321,6 +329,7 @@ func (o *Object) Read(b []byte) (n int, err error) { if o.prevErr != nil || o.isClosed { return 0, o.prevErr } + // Create a new request. readReq := getRequest{ isReadOp: true, @@ -363,7 +372,7 @@ func (o *Object) Read(b []byte) (n int, err error) { // Stat returns the ObjectInfo structure describing Object. func (o *Object) Stat() (ObjectInfo, error) { if o == nil { - return ObjectInfo{}, ErrInvalidArgument("Object is nil") + return ObjectInfo{}, errInvalidArgument("Object is nil") } // Locking. o.mutex.Lock() @@ -395,7 +404,7 @@ func (o *Object) Stat() (ObjectInfo, error) { // file, that error is io.EOF. func (o *Object) ReadAt(b []byte, offset int64) (n int, err error) { if o == nil { - return 0, ErrInvalidArgument("Object is nil") + return 0, errInvalidArgument("Object is nil") } // Locking. @@ -403,10 +412,13 @@ func (o *Object) ReadAt(b []byte, offset int64) (n int, err error) { defer o.mutex.Unlock() // prevErr is error which was saved in previous operation. - if o.prevErr != nil || o.isClosed { + if o.prevErr != nil && o.prevErr != io.EOF || o.isClosed { return 0, o.prevErr } + // Set the current offset to ReadAt offset, because the current offset will be shifted at the end of this method. + o.currOffset = offset + // Can only compare offsets to size when size has been set. if o.objectInfoSet { // If offset is negative than we return io.EOF. @@ -469,23 +481,21 @@ func (o *Object) ReadAt(b []byte, offset int64) (n int, err error) { // underlying object is not closed. func (o *Object) Seek(offset int64, whence int) (n int64, err error) { if o == nil { - return 0, ErrInvalidArgument("Object is nil") + return 0, errInvalidArgument("Object is nil") } // Locking. o.mutex.Lock() defer o.mutex.Unlock() - if o.prevErr != nil { - // At EOF seeking is legal allow only io.EOF, for any other errors we return. - if o.prevErr != io.EOF { - return 0, o.prevErr - } + // At EOF seeking is legal allow only io.EOF, for any other errors we return. + if o.prevErr != nil && o.prevErr != io.EOF { + return 0, o.prevErr } // Negative offset is valid for whence of '2'. if offset < 0 && whence != 2 { - return 0, ErrInvalidArgument(fmt.Sprintf("Negative position not allowed for %d", whence)) + return 0, errInvalidArgument(fmt.Sprintf("Negative position not allowed for %d", whence)) } // This is the first request. So before anything else @@ -509,7 +519,7 @@ func (o *Object) Seek(offset int64, whence int) (n int64, err error) { // Switch through whence. switch whence { default: - return 0, ErrInvalidArgument(fmt.Sprintf("Invalid whence %d", whence)) + return 0, errInvalidArgument(fmt.Sprintf("Invalid whence %d", whence)) case 0: if o.objectInfo.Size > -1 && offset > o.objectInfo.Size { return 0, io.EOF @@ -523,7 +533,7 @@ func (o *Object) Seek(offset int64, whence int) (n int64, err error) { case 2: // If we don't know the object size return an error for io.SeekEnd if o.objectInfo.Size < 0 { - return 0, ErrInvalidArgument("Whence END is not supported when the object size is unknown") + return 0, errInvalidArgument("Whence END is not supported when the object size is unknown") } // Seeking to positive offset is valid for whence '2', but // since we are backing a Reader we have reached 'EOF' if @@ -533,7 +543,7 @@ func (o *Object) Seek(offset int64, whence int) (n int64, err error) { } // Seeking to negative position not allowed for whence. if o.objectInfo.Size+offset < 0 { - return 0, ErrInvalidArgument(fmt.Sprintf("Seeking at negative offset not allowed for %d", whence)) + return 0, errInvalidArgument(fmt.Sprintf("Seeking at negative offset not allowed for %d", whence)) } o.currOffset = o.objectInfo.Size + offset } @@ -554,7 +564,7 @@ func (o *Object) Seek(offset int64, whence int) (n int64, err error) { // for subsequent Close() calls. func (o *Object) Close() (err error) { if o == nil { - return ErrInvalidArgument("Object is nil") + return errInvalidArgument("Object is nil") } // Locking. o.mutex.Lock() @@ -594,66 +604,43 @@ func newObject(reqCh chan<- getRequest, resCh <-chan getResponse, doneCh chan<- // // For more information about the HTTP Range header. // go to http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35. -func (c Client) getObject(ctx context.Context, bucketName, objectName string, opts GetObjectOptions) (io.ReadCloser, ObjectInfo, error) { +func (c Client) getObject(ctx context.Context, bucketName, objectName string, opts GetObjectOptions) (io.ReadCloser, ObjectInfo, http.Header, error) { // Validate input arguments. if err := s3utils.CheckValidBucketName(bucketName); err != nil { - return nil, ObjectInfo{}, err + return nil, ObjectInfo{}, nil, err } if err := s3utils.CheckValidObjectName(objectName); err != nil { - return nil, ObjectInfo{}, err + return nil, ObjectInfo{}, nil, err + } + + urlValues := make(url.Values) + if opts.VersionID != "" { + urlValues.Set("versionId", opts.VersionID) } // Execute GET on objectName. - resp, err := c.executeMethod(ctx, "GET", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ bucketName: bucketName, objectName: objectName, + queryValues: urlValues, customHeader: opts.Header(), contentSHA256Hex: emptySHA256Hex, }) if err != nil { - return nil, ObjectInfo{}, err + return nil, ObjectInfo{}, nil, err } if resp != nil { if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusPartialContent { - return nil, ObjectInfo{}, httpRespToErrorResponse(resp, bucketName, objectName) + return nil, ObjectInfo{}, nil, httpRespToErrorResponse(resp, bucketName, objectName) } } - // Trim off the odd double quotes from ETag in the beginning and end. - md5sum := strings.TrimPrefix(resp.Header.Get("ETag"), "\"") - md5sum = strings.TrimSuffix(md5sum, "\"") - - // Parse the date. - date, err := time.Parse(http.TimeFormat, resp.Header.Get("Last-Modified")) + objectStat, err := ToObjectInfo(bucketName, objectName, resp.Header) if err != nil { - msg := "Last-Modified time format not recognized. " + reportIssue - return nil, ObjectInfo{}, ErrorResponse{ - Code: "InternalError", - Message: msg, - RequestID: resp.Header.Get("x-amz-request-id"), - HostID: resp.Header.Get("x-amz-id-2"), - Region: resp.Header.Get("x-amz-bucket-region"), - } - } - - // Get content-type. - contentType := strings.TrimSpace(resp.Header.Get("Content-Type")) - if contentType == "" { - contentType = "application/octet-stream" - } - - objectStat := ObjectInfo{ - ETag: md5sum, - Key: objectName, - Size: resp.ContentLength, - LastModified: date, - ContentType: contentType, - // Extract only the relevant header keys describing the object. - // following function filters out a list of standard set of keys - // which are not part of object metadata. - Metadata: extractObjMetadata(resp.Header), + closeResponse(resp) + return nil, ObjectInfo{}, nil, err } // do not close body here, caller will close - return resp.Body, objectStat, nil + return resp.Body, objectStat, resp.Header, nil } diff --git a/vendor/github.com/minio/minio-go/api-get-options.go b/vendor/github.com/minio/minio-go/v7/api-get-options.go similarity index 86% rename from vendor/github.com/minio/minio-go/api-get-options.go rename to vendor/github.com/minio/minio-go/v7/api-get-options.go index a5a87526f..5f3ed3656 100644 --- a/vendor/github.com/minio/minio-go/api-get-options.go +++ b/vendor/github.com/minio/minio-go/v7/api-get-options.go @@ -1,6 +1,6 @@ /* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2020 MinIO, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,7 +22,7 @@ import ( "net/http" "time" - "github.com/minio/minio-go/pkg/encrypt" + "github.com/minio/minio-go/v7/pkg/encrypt" ) // GetObjectOptions are used to specify additional headers or options @@ -30,13 +30,12 @@ import ( type GetObjectOptions struct { headers map[string]string ServerSideEncryption encrypt.ServerSide + VersionID string } // StatObjectOptions are used to specify additional headers or options // during GET info/stat requests. -type StatObjectOptions struct { - GetObjectOptions -} +type StatObjectOptions = GetObjectOptions // Header returns the http.Header representation of the GET options. func (o GetObjectOptions) Header() http.Header { @@ -44,7 +43,7 @@ func (o GetObjectOptions) Header() http.Header { for k, v := range o.headers { headers.Set(k, v) } - if o.ServerSideEncryption != nil && o.ServerSideEncryption.Type() != encrypt.S3 { + if o.ServerSideEncryption != nil && o.ServerSideEncryption.Type() == encrypt.SSEC { o.ServerSideEncryption.Marshal(headers) } return headers @@ -63,7 +62,7 @@ func (o *GetObjectOptions) Set(key, value string) { // SetMatchETag - set match etag. func (o *GetObjectOptions) SetMatchETag(etag string) error { if etag == "" { - return ErrInvalidArgument("ETag cannot be empty.") + return errInvalidArgument("ETag cannot be empty.") } o.Set("If-Match", "\""+etag+"\"") return nil @@ -72,7 +71,7 @@ func (o *GetObjectOptions) SetMatchETag(etag string) error { // SetMatchETagExcept - set match etag except. func (o *GetObjectOptions) SetMatchETagExcept(etag string) error { if etag == "" { - return ErrInvalidArgument("ETag cannot be empty.") + return errInvalidArgument("ETag cannot be empty.") } o.Set("If-None-Match", "\""+etag+"\"") return nil @@ -81,7 +80,7 @@ func (o *GetObjectOptions) SetMatchETagExcept(etag string) error { // SetUnmodified - set unmodified time since. func (o *GetObjectOptions) SetUnmodified(modTime time.Time) error { if modTime.IsZero() { - return ErrInvalidArgument("Modified since cannot be empty.") + return errInvalidArgument("Modified since cannot be empty.") } o.Set("If-Unmodified-Since", modTime.Format(http.TimeFormat)) return nil @@ -90,7 +89,7 @@ func (o *GetObjectOptions) SetUnmodified(modTime time.Time) error { // SetModified - set modified time since. func (o *GetObjectOptions) SetModified(modTime time.Time) error { if modTime.IsZero() { - return ErrInvalidArgument("Modified since cannot be empty.") + return errInvalidArgument("Modified since cannot be empty.") } o.Set("If-Modified-Since", modTime.Format(http.TimeFormat)) return nil @@ -119,7 +118,7 @@ func (o *GetObjectOptions) SetRange(start, end int64) error { // bytes=-3-0 // bytes=-3--2 // are invalid. - return ErrInvalidArgument( + return errInvalidArgument( fmt.Sprintf( "Invalid range specified: start=%d end=%d", start, end)) diff --git a/vendor/github.com/minio/minio-go/v7/api-list.go b/vendor/github.com/minio/minio-go/v7/api-list.go new file mode 100644 index 000000000..7996c11e9 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-list.go @@ -0,0 +1,950 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2020 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "context" + "fmt" + "net/http" + "net/url" + + "github.com/minio/minio-go/v7/pkg/s3utils" +) + +// ListBuckets list all buckets owned by this authenticated user. +// +// This call requires explicit authentication, no anonymous requests are +// allowed for listing buckets. +// +// api := client.New(....) +// for message := range api.ListBuckets(context.Background()) { +// fmt.Println(message) +// } +// +func (c Client) ListBuckets(ctx context.Context) ([]BucketInfo, error) { + // Execute GET on service. + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{contentSHA256Hex: emptySHA256Hex}) + defer closeResponse(resp) + if err != nil { + return nil, err + } + if resp != nil { + if resp.StatusCode != http.StatusOK { + return nil, httpRespToErrorResponse(resp, "", "") + } + } + listAllMyBucketsResult := listAllMyBucketsResult{} + err = xmlDecoder(resp.Body, &listAllMyBucketsResult) + if err != nil { + return nil, err + } + return listAllMyBucketsResult.Buckets.Bucket, nil +} + +/// Bucket Read Operations. + +func (c Client) listObjectsV2(ctx context.Context, bucketName, objectPrefix string, recursive, metadata bool, maxKeys int) <-chan ObjectInfo { + // Allocate new list objects channel. + objectStatCh := make(chan ObjectInfo, 1) + // Default listing is delimited at "/" + delimiter := "/" + if recursive { + // If recursive we do not delimit. + delimiter = "" + } + + // Return object owner information by default + fetchOwner := true + + // Validate bucket name. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + defer close(objectStatCh) + objectStatCh <- ObjectInfo{ + Err: err, + } + return objectStatCh + } + + // Validate incoming object prefix. + if err := s3utils.CheckValidObjectNamePrefix(objectPrefix); err != nil { + defer close(objectStatCh) + objectStatCh <- ObjectInfo{ + Err: err, + } + return objectStatCh + } + + // Initiate list objects goroutine here. + go func(objectStatCh chan<- ObjectInfo) { + defer close(objectStatCh) + // Save continuationToken for next request. + var continuationToken string + for { + // Get list of objects a maximum of 1000 per request. + result, err := c.listObjectsV2Query(ctx, bucketName, objectPrefix, continuationToken, + fetchOwner, metadata, delimiter, maxKeys) + if err != nil { + objectStatCh <- ObjectInfo{ + Err: err, + } + return + } + + // If contents are available loop through and send over channel. + for _, object := range result.Contents { + object.ETag = trimEtag(object.ETag) + select { + // Send object content. + case objectStatCh <- object: + // If receives done from the caller, return here. + case <-ctx.Done(): + return + } + } + + // Send all common prefixes if any. + // NOTE: prefixes are only present if the request is delimited. + for _, obj := range result.CommonPrefixes { + select { + // Send object prefixes. + case objectStatCh <- ObjectInfo{Key: obj.Prefix}: + // If receives done from the caller, return here. + case <-ctx.Done(): + return + } + } + + // If continuation token present, save it for next request. + if result.NextContinuationToken != "" { + continuationToken = result.NextContinuationToken + } + + // Listing ends result is not truncated, return right here. + if !result.IsTruncated { + return + } + } + }(objectStatCh) + return objectStatCh +} + +// listObjectsV2Query - (List Objects V2) - List some or all (up to 1000) of the objects in a bucket. +// +// You can use the request parameters as selection criteria to return a subset of the objects in a bucket. +// request parameters :- +// --------- +// ?continuation-token - Used to continue iterating over a set of objects +// ?delimiter - A delimiter is a character you use to group keys. +// ?prefix - Limits the response to keys that begin with the specified prefix. +// ?max-keys - Sets the maximum number of keys returned in the response body. +// ?metadata - Specifies if we want metadata for the objects as part of list operation. +func (c Client) listObjectsV2Query(ctx context.Context, bucketName, objectPrefix, continuationToken string, fetchOwner, metadata bool, delimiter string, maxkeys int) (ListBucketV2Result, error) { + // Validate bucket name. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return ListBucketV2Result{}, err + } + // Validate object prefix. + if err := s3utils.CheckValidObjectNamePrefix(objectPrefix); err != nil { + return ListBucketV2Result{}, err + } + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + + // Always set list-type in ListObjects V2 + urlValues.Set("list-type", "2") + + if metadata { + urlValues.Set("metadata", "true") + } + + // Always set encoding-type in ListObjects V2 + urlValues.Set("encoding-type", "url") + + // Set object prefix, prefix value to be set to empty is okay. + urlValues.Set("prefix", objectPrefix) + + // Set delimiter, delimiter value to be set to empty is okay. + urlValues.Set("delimiter", delimiter) + + // Set continuation token + if continuationToken != "" { + urlValues.Set("continuation-token", continuationToken) + } + + // Fetch owner when listing + if fetchOwner { + urlValues.Set("fetch-owner", "true") + } + + // Set max keys. + if maxkeys > 0 { + urlValues.Set("max-keys", fmt.Sprintf("%d", maxkeys)) + } + + // Execute GET on bucket to list objects. + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ + bucketName: bucketName, + queryValues: urlValues, + contentSHA256Hex: emptySHA256Hex, + }) + defer closeResponse(resp) + if err != nil { + return ListBucketV2Result{}, err + } + if resp != nil { + if resp.StatusCode != http.StatusOK { + return ListBucketV2Result{}, httpRespToErrorResponse(resp, bucketName, "") + } + } + + // Decode listBuckets XML. + listBucketResult := ListBucketV2Result{} + if err = xmlDecoder(resp.Body, &listBucketResult); err != nil { + return listBucketResult, err + } + + // This is an additional verification check to make + // sure proper responses are received. + if listBucketResult.IsTruncated && listBucketResult.NextContinuationToken == "" { + return listBucketResult, ErrorResponse{ + Code: "NotImplemented", + Message: "Truncated response should have continuation token set", + } + } + + for i, obj := range listBucketResult.Contents { + listBucketResult.Contents[i].Key, err = decodeS3Name(obj.Key, listBucketResult.EncodingType) + if err != nil { + return listBucketResult, err + } + } + + for i, obj := range listBucketResult.CommonPrefixes { + listBucketResult.CommonPrefixes[i].Prefix, err = decodeS3Name(obj.Prefix, listBucketResult.EncodingType) + if err != nil { + return listBucketResult, err + } + } + + // Success. + return listBucketResult, nil +} + +func (c Client) listObjects(ctx context.Context, bucketName, objectPrefix string, recursive bool, maxKeys int) <-chan ObjectInfo { + // Allocate new list objects channel. + objectStatCh := make(chan ObjectInfo, 1) + // Default listing is delimited at "/" + delimiter := "/" + if recursive { + // If recursive we do not delimit. + delimiter = "" + } + // Validate bucket name. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + defer close(objectStatCh) + objectStatCh <- ObjectInfo{ + Err: err, + } + return objectStatCh + } + // Validate incoming object prefix. + if err := s3utils.CheckValidObjectNamePrefix(objectPrefix); err != nil { + defer close(objectStatCh) + objectStatCh <- ObjectInfo{ + Err: err, + } + return objectStatCh + } + + // Initiate list objects goroutine here. + go func(objectStatCh chan<- ObjectInfo) { + defer close(objectStatCh) + + marker := "" + for { + // Get list of objects a maximum of 1000 per request. + result, err := c.listObjectsQuery(ctx, bucketName, objectPrefix, marker, delimiter, maxKeys) + if err != nil { + objectStatCh <- ObjectInfo{ + Err: err, + } + return + } + + // If contents are available loop through and send over channel. + for _, object := range result.Contents { + // Save the marker. + marker = object.Key + select { + // Send object content. + case objectStatCh <- object: + // If receives done from the caller, return here. + case <-ctx.Done(): + return + } + } + + // Send all common prefixes if any. + // NOTE: prefixes are only present if the request is delimited. + for _, obj := range result.CommonPrefixes { + select { + // Send object prefixes. + case objectStatCh <- ObjectInfo{Key: obj.Prefix}: + // If receives done from the caller, return here. + case <-ctx.Done(): + return + } + } + + // If next marker present, save it for next request. + if result.NextMarker != "" { + marker = result.NextMarker + } + + // Listing ends result is not truncated, return right here. + if !result.IsTruncated { + return + } + } + }(objectStatCh) + return objectStatCh +} + +func (c Client) listObjectVersions(ctx context.Context, bucketName, prefix string, recursive bool, maxKeys int) <-chan ObjectInfo { + // Allocate new list objects channel. + resultCh := make(chan ObjectInfo, 1) + // Default listing is delimited at "/" + delimiter := "/" + if recursive { + // If recursive we do not delimit. + delimiter = "" + } + + // Validate bucket name. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + defer close(resultCh) + resultCh <- ObjectInfo{ + Err: err, + } + return resultCh + } + + // Validate incoming object prefix. + if err := s3utils.CheckValidObjectNamePrefix(prefix); err != nil { + defer close(resultCh) + resultCh <- ObjectInfo{ + Err: err, + } + return resultCh + } + + // Initiate list objects goroutine here. + go func(resultCh chan<- ObjectInfo) { + defer close(resultCh) + + var ( + keyMarker = "" + versionIDMarker = "" + ) + + for { + // Get list of objects a maximum of 1000 per request. + result, err := c.listObjectVersionsQuery(ctx, bucketName, prefix, keyMarker, versionIDMarker, delimiter, maxKeys) + if err != nil { + resultCh <- ObjectInfo{ + Err: err, + } + return + } + + // If contents are available loop through and send over channel. + for _, version := range result.Versions { + info := ObjectInfo{ + ETag: trimEtag(version.ETag), + Key: version.Key, + LastModified: version.LastModified, + Size: version.Size, + Owner: version.Owner, + StorageClass: version.StorageClass, + IsLatest: version.IsLatest, + VersionID: version.VersionID, + + IsDeleteMarker: version.isDeleteMarker, + } + select { + // Send object version info. + case resultCh <- info: + // If receives done from the caller, return here. + case <-ctx.Done(): + return + } + } + + // Send all common prefixes if any. + // NOTE: prefixes are only present if the request is delimited. + for _, obj := range result.CommonPrefixes { + select { + // Send object prefixes. + case resultCh <- ObjectInfo{Key: obj.Prefix}: + // If receives done from the caller, return here. + case <-ctx.Done(): + return + } + } + + // If next key marker is present, save it for next request. + if result.NextKeyMarker != "" { + keyMarker = result.NextKeyMarker + } + + // If next version id marker is present, save it for next request. + if result.NextVersionIDMarker != "" { + versionIDMarker = result.NextVersionIDMarker + } + + // Listing ends result is not truncated, return right here. + if !result.IsTruncated { + return + } + } + }(resultCh) + return resultCh +} + +// listObjectVersions - (List Object Versions) - List some or all (up to 1000) of the existing objects +// and their versions in a bucket. +// +// You can use the request parameters as selection criteria to return a subset of the objects in a bucket. +// request parameters :- +// --------- +// ?key-marker - Specifies the key to start with when listing objects in a bucket. +// ?version-id-marker - Specifies the version id marker to start with when listing objects with versions in a bucket. +// ?delimiter - A delimiter is a character you use to group keys. +// ?prefix - Limits the response to keys that begin with the specified prefix. +// ?max-keys - Sets the maximum number of keys returned in the response body. +func (c Client) listObjectVersionsQuery(ctx context.Context, bucketName, prefix, keyMarker, versionIDMarker, delimiter string, maxkeys int) (ListVersionsResult, error) { + // Validate bucket name. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return ListVersionsResult{}, err + } + // Validate object prefix. + if err := s3utils.CheckValidObjectNamePrefix(prefix); err != nil { + return ListVersionsResult{}, err + } + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + + // Set versions to trigger versioning API + urlValues.Set("versions", "") + + // Set object prefix, prefix value to be set to empty is okay. + urlValues.Set("prefix", prefix) + + // Set delimiter, delimiter value to be set to empty is okay. + urlValues.Set("delimiter", delimiter) + + // Set object marker. + if keyMarker != "" { + urlValues.Set("key-marker", keyMarker) + } + + // Set max keys. + if maxkeys > 0 { + urlValues.Set("max-keys", fmt.Sprintf("%d", maxkeys)) + } + + // Set version ID marker + if versionIDMarker != "" { + urlValues.Set("version-id-marker", versionIDMarker) + } + + // Always set encoding-type + urlValues.Set("encoding-type", "url") + + // Execute GET on bucket to list objects. + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ + bucketName: bucketName, + queryValues: urlValues, + contentSHA256Hex: emptySHA256Hex, + }) + defer closeResponse(resp) + if err != nil { + return ListVersionsResult{}, err + } + if resp != nil { + if resp.StatusCode != http.StatusOK { + return ListVersionsResult{}, httpRespToErrorResponse(resp, bucketName, "") + } + } + + // Decode ListVersionsResult XML. + listObjectVersionsOutput := ListVersionsResult{} + err = xmlDecoder(resp.Body, &listObjectVersionsOutput) + if err != nil { + return ListVersionsResult{}, err + } + + for i, obj := range listObjectVersionsOutput.Versions { + listObjectVersionsOutput.Versions[i].Key, err = decodeS3Name(obj.Key, listObjectVersionsOutput.EncodingType) + if err != nil { + return listObjectVersionsOutput, err + } + } + + for i, obj := range listObjectVersionsOutput.CommonPrefixes { + listObjectVersionsOutput.CommonPrefixes[i].Prefix, err = decodeS3Name(obj.Prefix, listObjectVersionsOutput.EncodingType) + if err != nil { + return listObjectVersionsOutput, err + } + } + + if listObjectVersionsOutput.NextKeyMarker != "" { + listObjectVersionsOutput.NextKeyMarker, err = decodeS3Name(listObjectVersionsOutput.NextKeyMarker, listObjectVersionsOutput.EncodingType) + if err != nil { + return listObjectVersionsOutput, err + } + } + + return listObjectVersionsOutput, nil +} + +// listObjects - (List Objects) - List some or all (up to 1000) of the objects in a bucket. +// +// You can use the request parameters as selection criteria to return a subset of the objects in a bucket. +// request parameters :- +// --------- +// ?marker - Specifies the key to start with when listing objects in a bucket. +// ?delimiter - A delimiter is a character you use to group keys. +// ?prefix - Limits the response to keys that begin with the specified prefix. +// ?max-keys - Sets the maximum number of keys returned in the response body. +func (c Client) listObjectsQuery(ctx context.Context, bucketName, objectPrefix, objectMarker, delimiter string, maxkeys int) (ListBucketResult, error) { + // Validate bucket name. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return ListBucketResult{}, err + } + // Validate object prefix. + if err := s3utils.CheckValidObjectNamePrefix(objectPrefix); err != nil { + return ListBucketResult{}, err + } + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + + // Set object prefix, prefix value to be set to empty is okay. + urlValues.Set("prefix", objectPrefix) + + // Set delimiter, delimiter value to be set to empty is okay. + urlValues.Set("delimiter", delimiter) + + // Set object marker. + if objectMarker != "" { + urlValues.Set("marker", objectMarker) + } + + // Set max keys. + if maxkeys > 0 { + urlValues.Set("max-keys", fmt.Sprintf("%d", maxkeys)) + } + + // Always set encoding-type + urlValues.Set("encoding-type", "url") + + // Execute GET on bucket to list objects. + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ + bucketName: bucketName, + queryValues: urlValues, + contentSHA256Hex: emptySHA256Hex, + }) + defer closeResponse(resp) + if err != nil { + return ListBucketResult{}, err + } + if resp != nil { + if resp.StatusCode != http.StatusOK { + return ListBucketResult{}, httpRespToErrorResponse(resp, bucketName, "") + } + } + // Decode listBuckets XML. + listBucketResult := ListBucketResult{} + err = xmlDecoder(resp.Body, &listBucketResult) + if err != nil { + return listBucketResult, err + } + + for i, obj := range listBucketResult.Contents { + listBucketResult.Contents[i].Key, err = decodeS3Name(obj.Key, listBucketResult.EncodingType) + if err != nil { + return listBucketResult, err + } + } + + for i, obj := range listBucketResult.CommonPrefixes { + listBucketResult.CommonPrefixes[i].Prefix, err = decodeS3Name(obj.Prefix, listBucketResult.EncodingType) + if err != nil { + return listBucketResult, err + } + } + + if listBucketResult.NextMarker != "" { + listBucketResult.NextMarker, err = decodeS3Name(listBucketResult.NextMarker, listBucketResult.EncodingType) + if err != nil { + return listBucketResult, err + } + } + + return listBucketResult, nil +} + +// ListObjectsOptions holds all options of a list object request +type ListObjectsOptions struct { + // Include objects versions in the listing + WithVersions bool + // Include objects metadata in the listing + WithMetadata bool + // Only list objects with the prefix + Prefix string + // Ignore '/' delimiter + Recursive bool + // The maximum number of objects requested per + // batch, advanced use-case not useful for most + // applications + MaxKeys int + + // Use the deprecated list objects V1 API + UseV1 bool +} + +// ListObjects returns objects list after evaluating the passed options. +// +// api := client.New(....) +// for object := range api.ListObjects(ctx, "mytestbucket", minio.ListObjectsOptions{Prefix: "starthere", Recursive:true}) { +// fmt.Println(object) +// } +// +func (c Client) ListObjects(ctx context.Context, bucketName string, opts ListObjectsOptions) <-chan ObjectInfo { + if opts.WithVersions { + return c.listObjectVersions(ctx, bucketName, opts.Prefix, opts.Recursive, opts.MaxKeys) + } + + // Use legacy list objects v1 API + if opts.UseV1 { + return c.listObjects(ctx, bucketName, opts.Prefix, opts.Recursive, opts.MaxKeys) + } + + // Check whether this is snowball region, if yes ListObjectsV2 doesn't work, fallback to listObjectsV1. + if location, ok := c.bucketLocCache.Get(bucketName); ok { + if location == "snowball" { + return c.listObjects(ctx, bucketName, opts.Prefix, opts.Recursive, opts.MaxKeys) + } + } + + return c.listObjectsV2(ctx, bucketName, opts.Prefix, opts.Recursive, opts.WithMetadata, opts.MaxKeys) +} + +// ListIncompleteUploads - List incompletely uploaded multipart objects. +// +// ListIncompleteUploads lists all incompleted objects matching the +// objectPrefix from the specified bucket. If recursion is enabled +// it would list all subdirectories and all its contents. +// +// Your input parameters are just bucketName, objectPrefix, recursive. +// If you enable recursive as 'true' this function will return back all +// the multipart objects in a given bucket name. +// +// api := client.New(....) +// // Recurively list all objects in 'mytestbucket' +// recursive := true +// for message := range api.ListIncompleteUploads(context.Background(), "mytestbucket", "starthere", recursive) { +// fmt.Println(message) +// } +func (c Client) ListIncompleteUploads(ctx context.Context, bucketName, objectPrefix string, recursive bool) <-chan ObjectMultipartInfo { + return c.listIncompleteUploads(ctx, bucketName, objectPrefix, recursive) +} + +// listIncompleteUploads lists all incomplete uploads. +func (c Client) listIncompleteUploads(ctx context.Context, bucketName, objectPrefix string, recursive bool) <-chan ObjectMultipartInfo { + // Allocate channel for multipart uploads. + objectMultipartStatCh := make(chan ObjectMultipartInfo, 1) + // Delimiter is set to "/" by default. + delimiter := "/" + if recursive { + // If recursive do not delimit. + delimiter = "" + } + // Validate bucket name. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + defer close(objectMultipartStatCh) + objectMultipartStatCh <- ObjectMultipartInfo{ + Err: err, + } + return objectMultipartStatCh + } + // Validate incoming object prefix. + if err := s3utils.CheckValidObjectNamePrefix(objectPrefix); err != nil { + defer close(objectMultipartStatCh) + objectMultipartStatCh <- ObjectMultipartInfo{ + Err: err, + } + return objectMultipartStatCh + } + go func(objectMultipartStatCh chan<- ObjectMultipartInfo) { + defer close(objectMultipartStatCh) + // object and upload ID marker for future requests. + var objectMarker string + var uploadIDMarker string + for { + // list all multipart uploads. + result, err := c.listMultipartUploadsQuery(ctx, bucketName, objectMarker, uploadIDMarker, objectPrefix, delimiter, 0) + if err != nil { + objectMultipartStatCh <- ObjectMultipartInfo{ + Err: err, + } + return + } + objectMarker = result.NextKeyMarker + uploadIDMarker = result.NextUploadIDMarker + + // Send all multipart uploads. + for _, obj := range result.Uploads { + // Calculate total size of the uploaded parts if 'aggregateSize' is enabled. + select { + // Send individual uploads here. + case objectMultipartStatCh <- obj: + // If the context is canceled + case <-ctx.Done(): + return + } + } + // Send all common prefixes if any. + // NOTE: prefixes are only present if the request is delimited. + for _, obj := range result.CommonPrefixes { + select { + // Send delimited prefixes here. + case objectMultipartStatCh <- ObjectMultipartInfo{Key: obj.Prefix, Size: 0}: + // If context is canceled. + case <-ctx.Done(): + return + } + } + // Listing ends if result not truncated, return right here. + if !result.IsTruncated { + return + } + } + }(objectMultipartStatCh) + // return. + return objectMultipartStatCh + +} + +// listMultipartUploadsQuery - (List Multipart Uploads). +// - Lists some or all (up to 1000) in-progress multipart uploads in a bucket. +// +// You can use the request parameters as selection criteria to return a subset of the uploads in a bucket. +// request parameters. :- +// --------- +// ?key-marker - Specifies the multipart upload after which listing should begin. +// ?upload-id-marker - Together with key-marker specifies the multipart upload after which listing should begin. +// ?delimiter - A delimiter is a character you use to group keys. +// ?prefix - Limits the response to keys that begin with the specified prefix. +// ?max-uploads - Sets the maximum number of multipart uploads returned in the response body. +func (c Client) listMultipartUploadsQuery(ctx context.Context, bucketName, keyMarker, uploadIDMarker, prefix, delimiter string, maxUploads int) (ListMultipartUploadsResult, error) { + // Get resources properly escaped and lined up before using them in http request. + urlValues := make(url.Values) + // Set uploads. + urlValues.Set("uploads", "") + // Set object key marker. + if keyMarker != "" { + urlValues.Set("key-marker", keyMarker) + } + // Set upload id marker. + if uploadIDMarker != "" { + urlValues.Set("upload-id-marker", uploadIDMarker) + } + + // Set object prefix, prefix value to be set to empty is okay. + urlValues.Set("prefix", prefix) + + // Set delimiter, delimiter value to be set to empty is okay. + urlValues.Set("delimiter", delimiter) + + // Always set encoding-type + urlValues.Set("encoding-type", "url") + + // maxUploads should be 1000 or less. + if maxUploads > 0 { + // Set max-uploads. + urlValues.Set("max-uploads", fmt.Sprintf("%d", maxUploads)) + } + + // Execute GET on bucketName to list multipart uploads. + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ + bucketName: bucketName, + queryValues: urlValues, + contentSHA256Hex: emptySHA256Hex, + }) + defer closeResponse(resp) + if err != nil { + return ListMultipartUploadsResult{}, err + } + if resp != nil { + if resp.StatusCode != http.StatusOK { + return ListMultipartUploadsResult{}, httpRespToErrorResponse(resp, bucketName, "") + } + } + // Decode response body. + listMultipartUploadsResult := ListMultipartUploadsResult{} + err = xmlDecoder(resp.Body, &listMultipartUploadsResult) + if err != nil { + return listMultipartUploadsResult, err + } + + listMultipartUploadsResult.NextKeyMarker, err = decodeS3Name(listMultipartUploadsResult.NextKeyMarker, listMultipartUploadsResult.EncodingType) + if err != nil { + return listMultipartUploadsResult, err + } + + listMultipartUploadsResult.NextUploadIDMarker, err = decodeS3Name(listMultipartUploadsResult.NextUploadIDMarker, listMultipartUploadsResult.EncodingType) + if err != nil { + return listMultipartUploadsResult, err + } + + for i, obj := range listMultipartUploadsResult.Uploads { + listMultipartUploadsResult.Uploads[i].Key, err = decodeS3Name(obj.Key, listMultipartUploadsResult.EncodingType) + if err != nil { + return listMultipartUploadsResult, err + } + } + + for i, obj := range listMultipartUploadsResult.CommonPrefixes { + listMultipartUploadsResult.CommonPrefixes[i].Prefix, err = decodeS3Name(obj.Prefix, listMultipartUploadsResult.EncodingType) + if err != nil { + return listMultipartUploadsResult, err + } + } + + return listMultipartUploadsResult, nil +} + +// listObjectParts list all object parts recursively. +func (c Client) listObjectParts(ctx context.Context, bucketName, objectName, uploadID string) (partsInfo map[int]ObjectPart, err error) { + // Part number marker for the next batch of request. + var nextPartNumberMarker int + partsInfo = make(map[int]ObjectPart) + for { + // Get list of uploaded parts a maximum of 1000 per request. + listObjPartsResult, err := c.listObjectPartsQuery(ctx, bucketName, objectName, uploadID, nextPartNumberMarker, 1000) + if err != nil { + return nil, err + } + // Append to parts info. + for _, part := range listObjPartsResult.ObjectParts { + // Trim off the odd double quotes from ETag in the beginning and end. + part.ETag = trimEtag(part.ETag) + partsInfo[part.PartNumber] = part + } + // Keep part number marker, for the next iteration. + nextPartNumberMarker = listObjPartsResult.NextPartNumberMarker + // Listing ends result is not truncated, return right here. + if !listObjPartsResult.IsTruncated { + break + } + } + + // Return all the parts. + return partsInfo, nil +} + +// findUploadIDs lists all incomplete uploads and find the uploadIDs of the matching object name. +func (c Client) findUploadIDs(ctx context.Context, bucketName, objectName string) ([]string, error) { + var uploadIDs []string + // Make list incomplete uploads recursive. + isRecursive := true + // List all incomplete uploads. + for mpUpload := range c.listIncompleteUploads(ctx, bucketName, objectName, isRecursive) { + if mpUpload.Err != nil { + return nil, mpUpload.Err + } + if objectName == mpUpload.Key { + uploadIDs = append(uploadIDs, mpUpload.UploadID) + } + } + // Return the latest upload id. + return uploadIDs, nil +} + +// listObjectPartsQuery (List Parts query) +// - lists some or all (up to 1000) parts that have been uploaded +// for a specific multipart upload +// +// You can use the request parameters as selection criteria to return +// a subset of the uploads in a bucket, request parameters :- +// --------- +// ?part-number-marker - Specifies the part after which listing should +// begin. +// ?max-parts - Maximum parts to be listed per request. +func (c Client) listObjectPartsQuery(ctx context.Context, bucketName, objectName, uploadID string, partNumberMarker, maxParts int) (ListObjectPartsResult, error) { + // Get resources properly escaped and lined up before using them in http request. + urlValues := make(url.Values) + // Set part number marker. + urlValues.Set("part-number-marker", fmt.Sprintf("%d", partNumberMarker)) + // Set upload id. + urlValues.Set("uploadId", uploadID) + + // maxParts should be 1000 or less. + if maxParts > 0 { + // Set max parts. + urlValues.Set("max-parts", fmt.Sprintf("%d", maxParts)) + } + + // Execute GET on objectName to get list of parts. + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ + bucketName: bucketName, + objectName: objectName, + queryValues: urlValues, + contentSHA256Hex: emptySHA256Hex, + }) + defer closeResponse(resp) + if err != nil { + return ListObjectPartsResult{}, err + } + if resp != nil { + if resp.StatusCode != http.StatusOK { + return ListObjectPartsResult{}, httpRespToErrorResponse(resp, bucketName, objectName) + } + } + // Decode list object parts XML. + listObjectPartsResult := ListObjectPartsResult{} + err = xmlDecoder(resp.Body, &listObjectPartsResult) + if err != nil { + return listObjectPartsResult, err + } + return listObjectPartsResult, nil +} + +// Decode an S3 object name according to the encoding type +func decodeS3Name(name, encodingType string) (string, error) { + switch encodingType { + case "url": + return url.QueryUnescape(name) + default: + return name, nil + } +} diff --git a/vendor/github.com/minio/minio-go/v7/api-object-legal-hold.go b/vendor/github.com/minio/minio-go/v7/api-object-legal-hold.go new file mode 100644 index 000000000..b139c1687 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-object-legal-hold.go @@ -0,0 +1,176 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2020 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "bytes" + "context" + "encoding/xml" + "fmt" + "net/http" + "net/url" + + "github.com/minio/minio-go/v7/pkg/s3utils" +) + +// objectLegalHold - object legal hold specified in +// https://docs.aws.amazon.com/AmazonS3/latest/API/archive-RESTObjectPUTLegalHold.html +type objectLegalHold struct { + XMLNS string `xml:"xmlns,attr,omitempty"` + XMLName xml.Name `xml:"LegalHold"` + Status LegalHoldStatus `xml:"Status,omitempty"` +} + +// PutObjectLegalHoldOptions represents options specified by user for PutObjectLegalHold call +type PutObjectLegalHoldOptions struct { + VersionID string + Status *LegalHoldStatus +} + +// GetObjectLegalHoldOptions represents options specified by user for GetObjectLegalHold call +type GetObjectLegalHoldOptions struct { + VersionID string +} + +// LegalHoldStatus - object legal hold status. +type LegalHoldStatus string + +const ( + // LegalHoldEnabled indicates legal hold is enabled + LegalHoldEnabled LegalHoldStatus = "ON" + + // LegalHoldDisabled indicates legal hold is disabled + LegalHoldDisabled LegalHoldStatus = "OFF" +) + +func (r LegalHoldStatus) String() string { + return string(r) +} + +// IsValid - check whether this legal hold status is valid or not. +func (r LegalHoldStatus) IsValid() bool { + return r == LegalHoldEnabled || r == LegalHoldDisabled +} + +func newObjectLegalHold(status *LegalHoldStatus) (*objectLegalHold, error) { + if status == nil { + return nil, fmt.Errorf("Status not set") + } + if !status.IsValid() { + return nil, fmt.Errorf("invalid legal hold status `%v`", status) + } + legalHold := &objectLegalHold{ + Status: *status, + } + return legalHold, nil +} + +// PutObjectLegalHold : sets object legal hold for a given object and versionID. +func (c Client) PutObjectLegalHold(ctx context.Context, bucketName, objectName string, opts PutObjectLegalHoldOptions) error { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return err + } + + if err := s3utils.CheckValidObjectName(objectName); err != nil { + return err + } + + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + urlValues.Set("legal-hold", "") + + if opts.VersionID != "" { + urlValues.Set("versionId", opts.VersionID) + } + + lh, err := newObjectLegalHold(opts.Status) + if err != nil { + return err + } + + lhData, err := xml.Marshal(lh) + if err != nil { + return err + } + + reqMetadata := requestMetadata{ + bucketName: bucketName, + objectName: objectName, + queryValues: urlValues, + contentBody: bytes.NewReader(lhData), + contentLength: int64(len(lhData)), + contentMD5Base64: sumMD5Base64(lhData), + contentSHA256Hex: sum256Hex(lhData), + } + + // Execute PUT Object Legal Hold. + resp, err := c.executeMethod(ctx, http.MethodPut, reqMetadata) + defer closeResponse(resp) + if err != nil { + return err + } + if resp != nil { + if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusNoContent { + return httpRespToErrorResponse(resp, bucketName, objectName) + } + } + return nil +} + +// GetObjectLegalHold gets legal-hold status of given object. +func (c Client) GetObjectLegalHold(ctx context.Context, bucketName, objectName string, opts GetObjectLegalHoldOptions) (status *LegalHoldStatus, err error) { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return nil, err + } + + if err := s3utils.CheckValidObjectName(objectName); err != nil { + return nil, err + } + urlValues := make(url.Values) + urlValues.Set("legal-hold", "") + + if opts.VersionID != "" { + urlValues.Set("versionId", opts.VersionID) + } + + // Execute GET on bucket to list objects. + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ + bucketName: bucketName, + objectName: objectName, + queryValues: urlValues, + contentSHA256Hex: emptySHA256Hex, + }) + defer closeResponse(resp) + if err != nil { + return nil, err + } + if resp != nil { + if resp.StatusCode != http.StatusOK { + return nil, httpRespToErrorResponse(resp, bucketName, objectName) + } + } + lh := &objectLegalHold{} + if err = xml.NewDecoder(resp.Body).Decode(lh); err != nil { + return nil, err + } + + return &lh.Status, nil +} diff --git a/vendor/github.com/minio/minio-go/v7/api-object-lock.go b/vendor/github.com/minio/minio-go/v7/api-object-lock.go new file mode 100644 index 000000000..29f52b054 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-object-lock.go @@ -0,0 +1,241 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2019 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "bytes" + "context" + "encoding/xml" + "fmt" + "net/http" + "net/url" + "time" + + "github.com/minio/minio-go/v7/pkg/s3utils" +) + +// RetentionMode - object retention mode. +type RetentionMode string + +const ( + // Governance - governance mode. + Governance RetentionMode = "GOVERNANCE" + + // Compliance - compliance mode. + Compliance RetentionMode = "COMPLIANCE" +) + +func (r RetentionMode) String() string { + return string(r) +} + +// IsValid - check whether this retention mode is valid or not. +func (r RetentionMode) IsValid() bool { + return r == Governance || r == Compliance +} + +// ValidityUnit - retention validity unit. +type ValidityUnit string + +const ( + // Days - denotes no. of days. + Days ValidityUnit = "DAYS" + + // Years - denotes no. of years. + Years ValidityUnit = "YEARS" +) + +func (unit ValidityUnit) String() string { + return string(unit) +} + +// IsValid - check whether this validity unit is valid or not. +func (unit ValidityUnit) isValid() bool { + return unit == Days || unit == Years +} + +// Retention - bucket level retention configuration. +type Retention struct { + Mode RetentionMode + Validity time.Duration +} + +func (r Retention) String() string { + return fmt.Sprintf("{Mode:%v, Validity:%v}", r.Mode, r.Validity) +} + +// IsEmpty - returns whether retention is empty or not. +func (r Retention) IsEmpty() bool { + return r.Mode == "" || r.Validity == 0 +} + +// objectLockConfig - object lock configuration specified in +// https://docs.aws.amazon.com/AmazonS3/latest/API/Type_API_ObjectLockConfiguration.html +type objectLockConfig struct { + XMLNS string `xml:"xmlns,attr,omitempty"` + XMLName xml.Name `xml:"ObjectLockConfiguration"` + ObjectLockEnabled string `xml:"ObjectLockEnabled"` + Rule *struct { + DefaultRetention struct { + Mode RetentionMode `xml:"Mode"` + Days *uint `xml:"Days"` + Years *uint `xml:"Years"` + } `xml:"DefaultRetention"` + } `xml:"Rule,omitempty"` +} + +func newObjectLockConfig(mode *RetentionMode, validity *uint, unit *ValidityUnit) (*objectLockConfig, error) { + config := &objectLockConfig{ + ObjectLockEnabled: "Enabled", + } + + if mode != nil && validity != nil && unit != nil { + if !mode.IsValid() { + return nil, fmt.Errorf("invalid retention mode `%v`", mode) + } + + if !unit.isValid() { + return nil, fmt.Errorf("invalid validity unit `%v`", unit) + } + + config.Rule = &struct { + DefaultRetention struct { + Mode RetentionMode `xml:"Mode"` + Days *uint `xml:"Days"` + Years *uint `xml:"Years"` + } `xml:"DefaultRetention"` + }{} + + config.Rule.DefaultRetention.Mode = *mode + if *unit == Days { + config.Rule.DefaultRetention.Days = validity + } else { + config.Rule.DefaultRetention.Years = validity + } + + return config, nil + } + + if mode == nil && validity == nil && unit == nil { + return config, nil + } + + return nil, fmt.Errorf("all of retention mode, validity and validity unit must be passed") +} + +// SetBucketObjectLockConfig sets object lock configuration in given bucket. mode, validity and unit are either all set or all nil. +func (c Client) SetBucketObjectLockConfig(ctx context.Context, bucketName string, mode *RetentionMode, validity *uint, unit *ValidityUnit) error { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return err + } + + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + urlValues.Set("object-lock", "") + + config, err := newObjectLockConfig(mode, validity, unit) + if err != nil { + return err + } + + configData, err := xml.Marshal(config) + if err != nil { + return err + } + + reqMetadata := requestMetadata{ + bucketName: bucketName, + queryValues: urlValues, + contentBody: bytes.NewReader(configData), + contentLength: int64(len(configData)), + contentMD5Base64: sumMD5Base64(configData), + contentSHA256Hex: sum256Hex(configData), + } + + // Execute PUT bucket object lock configuration. + resp, err := c.executeMethod(ctx, http.MethodPut, reqMetadata) + defer closeResponse(resp) + if err != nil { + return err + } + if resp != nil { + if resp.StatusCode != http.StatusOK { + return httpRespToErrorResponse(resp, bucketName, "") + } + } + return nil +} + +// GetObjectLockConfig gets object lock configuration of given bucket. +func (c Client) GetObjectLockConfig(ctx context.Context, bucketName string) (objectLock string, mode *RetentionMode, validity *uint, unit *ValidityUnit, err error) { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return "", nil, nil, nil, err + } + + urlValues := make(url.Values) + urlValues.Set("object-lock", "") + + // Execute GET on bucket to list objects. + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ + bucketName: bucketName, + queryValues: urlValues, + contentSHA256Hex: emptySHA256Hex, + }) + defer closeResponse(resp) + if err != nil { + return "", nil, nil, nil, err + } + if resp != nil { + if resp.StatusCode != http.StatusOK { + return "", nil, nil, nil, httpRespToErrorResponse(resp, bucketName, "") + } + } + config := &objectLockConfig{} + if err = xml.NewDecoder(resp.Body).Decode(config); err != nil { + return "", nil, nil, nil, err + } + + if config.Rule != nil { + mode = &config.Rule.DefaultRetention.Mode + if config.Rule.DefaultRetention.Days != nil { + validity = config.Rule.DefaultRetention.Days + days := Days + unit = &days + } else { + validity = config.Rule.DefaultRetention.Years + years := Years + unit = &years + } + return config.ObjectLockEnabled, mode, validity, unit, nil + } + return config.ObjectLockEnabled, nil, nil, nil, nil +} + +// GetBucketObjectLockConfig gets object lock configuration of given bucket. +func (c Client) GetBucketObjectLockConfig(ctx context.Context, bucketName string) (mode *RetentionMode, validity *uint, unit *ValidityUnit, err error) { + _, mode, validity, unit, err = c.GetObjectLockConfig(ctx, bucketName) + return mode, validity, unit, err +} + +// SetObjectLockConfig sets object lock configuration in given bucket. mode, validity and unit are either all set or all nil. +func (c Client) SetObjectLockConfig(ctx context.Context, bucketName string, mode *RetentionMode, validity *uint, unit *ValidityUnit) error { + return c.SetBucketObjectLockConfig(ctx, bucketName, mode, validity, unit) +} diff --git a/vendor/github.com/minio/minio-go/v7/api-object-retention.go b/vendor/github.com/minio/minio-go/v7/api-object-retention.go new file mode 100644 index 000000000..54f2762de --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-object-retention.go @@ -0,0 +1,165 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2019-2020 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "bytes" + "context" + "encoding/xml" + "fmt" + "net/http" + "net/url" + "time" + + "github.com/minio/minio-go/v7/pkg/s3utils" +) + +// objectRetention - object retention specified in +// https://docs.aws.amazon.com/AmazonS3/latest/API/Type_API_ObjectLockConfiguration.html +type objectRetention struct { + XMLNS string `xml:"xmlns,attr,omitempty"` + XMLName xml.Name `xml:"Retention"` + Mode RetentionMode `xml:"Mode,omitempty"` + RetainUntilDate *time.Time `type:"timestamp" timestampFormat:"iso8601" xml:"RetainUntilDate,omitempty"` +} + +func newObjectRetention(mode *RetentionMode, date *time.Time) (*objectRetention, error) { + objectRetention := &objectRetention{} + + if date != nil && !date.IsZero() { + objectRetention.RetainUntilDate = date + } + if mode != nil { + if !mode.IsValid() { + return nil, fmt.Errorf("invalid retention mode `%v`", mode) + } + objectRetention.Mode = *mode + } + + return objectRetention, nil +} + +// PutObjectRetentionOptions represents options specified by user for PutObject call +type PutObjectRetentionOptions struct { + GovernanceBypass bool + Mode *RetentionMode + RetainUntilDate *time.Time + VersionID string +} + +// PutObjectRetention sets object retention for a given object and versionID. +func (c Client) PutObjectRetention(ctx context.Context, bucketName, objectName string, opts PutObjectRetentionOptions) error { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return err + } + + if err := s3utils.CheckValidObjectName(objectName); err != nil { + return err + } + + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + urlValues.Set("retention", "") + + if opts.VersionID != "" { + urlValues.Set("versionId", opts.VersionID) + } + + retention, err := newObjectRetention(opts.Mode, opts.RetainUntilDate) + if err != nil { + return err + } + + retentionData, err := xml.Marshal(retention) + if err != nil { + return err + } + + // Build headers. + headers := make(http.Header) + + if opts.GovernanceBypass { + // Set the bypass goverenance retention header + headers.Set(amzBypassGovernance, "true") + } + + reqMetadata := requestMetadata{ + bucketName: bucketName, + objectName: objectName, + queryValues: urlValues, + contentBody: bytes.NewReader(retentionData), + contentLength: int64(len(retentionData)), + contentMD5Base64: sumMD5Base64(retentionData), + contentSHA256Hex: sum256Hex(retentionData), + customHeader: headers, + } + + // Execute PUT Object Retention. + resp, err := c.executeMethod(ctx, http.MethodPut, reqMetadata) + defer closeResponse(resp) + if err != nil { + return err + } + if resp != nil { + if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusNoContent { + return httpRespToErrorResponse(resp, bucketName, objectName) + } + } + return nil +} + +// GetObjectRetention gets retention of given object. +func (c Client) GetObjectRetention(ctx context.Context, bucketName, objectName, versionID string) (mode *RetentionMode, retainUntilDate *time.Time, err error) { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return nil, nil, err + } + + if err := s3utils.CheckValidObjectName(objectName); err != nil { + return nil, nil, err + } + urlValues := make(url.Values) + urlValues.Set("retention", "") + if versionID != "" { + urlValues.Set("versionId", versionID) + } + // Execute GET on bucket to list objects. + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ + bucketName: bucketName, + objectName: objectName, + queryValues: urlValues, + contentSHA256Hex: emptySHA256Hex, + }) + defer closeResponse(resp) + if err != nil { + return nil, nil, err + } + if resp != nil { + if resp.StatusCode != http.StatusOK { + return nil, nil, httpRespToErrorResponse(resp, bucketName, objectName) + } + } + retention := &objectRetention{} + if err = xml.NewDecoder(resp.Body).Decode(retention); err != nil { + return nil, nil, err + } + + return &retention.Mode, retention.RetainUntilDate, nil +} diff --git a/vendor/github.com/minio/minio-go/v7/api-object-tagging.go b/vendor/github.com/minio/minio-go/v7/api-object-tagging.go new file mode 100644 index 000000000..2709efcd1 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-object-tagging.go @@ -0,0 +1,157 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2020 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "bytes" + "context" + "encoding/xml" + "net/http" + "net/url" + + "github.com/minio/minio-go/v7/pkg/s3utils" + "github.com/minio/minio-go/v7/pkg/tags" +) + +// PutObjectTaggingOptions holds an object version id +// to update tag(s) of a specific object version +type PutObjectTaggingOptions struct { + VersionID string +} + +// PutObjectTagging replaces or creates object tag(s) and can target +// a specific object version in a versioned bucket. +func (c Client) PutObjectTagging(ctx context.Context, bucketName, objectName string, otags *tags.Tags, opts PutObjectTaggingOptions) error { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return err + } + + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + urlValues.Set("tagging", "") + + if opts.VersionID != "" { + urlValues.Set("versionId", opts.VersionID) + } + + reqBytes, err := xml.Marshal(otags) + if err != nil { + return err + } + + reqMetadata := requestMetadata{ + bucketName: bucketName, + objectName: objectName, + queryValues: urlValues, + contentBody: bytes.NewReader(reqBytes), + contentLength: int64(len(reqBytes)), + contentMD5Base64: sumMD5Base64(reqBytes), + } + + // Execute PUT to set a object tagging. + resp, err := c.executeMethod(ctx, http.MethodPut, reqMetadata) + defer closeResponse(resp) + if err != nil { + return err + } + if resp != nil { + if resp.StatusCode != http.StatusOK { + return httpRespToErrorResponse(resp, bucketName, objectName) + } + } + return nil +} + +// GetObjectTaggingOptions holds the object version ID +// to fetch the tagging key/value pairs +type GetObjectTaggingOptions struct { + VersionID string +} + +// GetObjectTagging fetches object tag(s) with options to target +// a specific object version in a versioned bucket. +func (c Client) GetObjectTagging(ctx context.Context, bucketName, objectName string, opts GetObjectTaggingOptions) (*tags.Tags, error) { + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + urlValues.Set("tagging", "") + + if opts.VersionID != "" { + urlValues.Set("versionId", opts.VersionID) + } + + // Execute GET on object to get object tag(s) + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ + bucketName: bucketName, + objectName: objectName, + queryValues: urlValues, + }) + + defer closeResponse(resp) + if err != nil { + return nil, err + } + + if resp != nil { + if resp.StatusCode != http.StatusOK { + return nil, httpRespToErrorResponse(resp, bucketName, objectName) + } + } + + return tags.ParseObjectXML(resp.Body) +} + +// RemoveObjectTaggingOptions holds the version id of the object to remove +type RemoveObjectTaggingOptions struct { + VersionID string +} + +// RemoveObjectTagging removes object tag(s) with options to control a specific object +// version in a versioned bucket +func (c Client) RemoveObjectTagging(ctx context.Context, bucketName, objectName string, opts RemoveObjectTaggingOptions) error { + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + urlValues.Set("tagging", "") + + if opts.VersionID != "" { + urlValues.Set("versionId", opts.VersionID) + } + + // Execute DELETE on object to remove object tag(s) + resp, err := c.executeMethod(ctx, http.MethodDelete, requestMetadata{ + bucketName: bucketName, + objectName: objectName, + queryValues: urlValues, + }) + + defer closeResponse(resp) + if err != nil { + return err + } + + if resp != nil { + // S3 returns "204 No content" after Object tag deletion. + if resp.StatusCode != http.StatusNoContent { + return httpRespToErrorResponse(resp, bucketName, objectName) + } + } + return err +} diff --git a/vendor/github.com/minio/minio-go/v7/api-presigned.go b/vendor/github.com/minio/minio-go/v7/api-presigned.go new file mode 100644 index 000000000..80c363da5 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-presigned.go @@ -0,0 +1,216 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2017 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "context" + "errors" + "net/http" + "net/url" + "time" + + "github.com/minio/minio-go/v7/pkg/s3utils" + "github.com/minio/minio-go/v7/pkg/signer" +) + +// presignURL - Returns a presigned URL for an input 'method'. +// Expires maximum is 7days - ie. 604800 and minimum is 1. +func (c Client) presignURL(ctx context.Context, method string, bucketName string, objectName string, expires time.Duration, reqParams url.Values) (u *url.URL, err error) { + // Input validation. + if method == "" { + return nil, errInvalidArgument("method cannot be empty.") + } + if err = s3utils.CheckValidBucketName(bucketName); err != nil { + return nil, err + } + if err = isValidExpiry(expires); err != nil { + return nil, err + } + + // Convert expires into seconds. + expireSeconds := int64(expires / time.Second) + reqMetadata := requestMetadata{ + presignURL: true, + bucketName: bucketName, + objectName: objectName, + expires: expireSeconds, + queryValues: reqParams, + } + + // Instantiate a new request. + // Since expires is set newRequest will presign the request. + var req *http.Request + if req, err = c.newRequest(ctx, method, reqMetadata); err != nil { + return nil, err + } + return req.URL, nil +} + +// PresignedGetObject - Returns a presigned URL to access an object +// data without credentials. URL can have a maximum expiry of +// upto 7days or a minimum of 1sec. Additionally you can override +// a set of response headers using the query parameters. +func (c Client) PresignedGetObject(ctx context.Context, bucketName string, objectName string, expires time.Duration, reqParams url.Values) (u *url.URL, err error) { + if err = s3utils.CheckValidObjectName(objectName); err != nil { + return nil, err + } + return c.presignURL(ctx, http.MethodGet, bucketName, objectName, expires, reqParams) +} + +// PresignedHeadObject - Returns a presigned URL to access +// object metadata without credentials. URL can have a maximum expiry +// of upto 7days or a minimum of 1sec. Additionally you can override +// a set of response headers using the query parameters. +func (c Client) PresignedHeadObject(ctx context.Context, bucketName string, objectName string, expires time.Duration, reqParams url.Values) (u *url.URL, err error) { + if err = s3utils.CheckValidObjectName(objectName); err != nil { + return nil, err + } + return c.presignURL(ctx, http.MethodHead, bucketName, objectName, expires, reqParams) +} + +// PresignedPutObject - Returns a presigned URL to upload an object +// without credentials. URL can have a maximum expiry of upto 7days +// or a minimum of 1sec. +func (c Client) PresignedPutObject(ctx context.Context, bucketName string, objectName string, expires time.Duration) (u *url.URL, err error) { + if err = s3utils.CheckValidObjectName(objectName); err != nil { + return nil, err + } + return c.presignURL(ctx, http.MethodPut, bucketName, objectName, expires, nil) +} + +// Presign - returns a presigned URL for any http method of your choice +// along with custom request params. URL can have a maximum expiry of +// upto 7days or a minimum of 1sec. +func (c Client) Presign(ctx context.Context, method string, bucketName string, objectName string, expires time.Duration, reqParams url.Values) (u *url.URL, err error) { + return c.presignURL(ctx, method, bucketName, objectName, expires, reqParams) +} + +// PresignedPostPolicy - Returns POST urlString, form data to upload an object. +func (c Client) PresignedPostPolicy(ctx context.Context, p *PostPolicy) (u *url.URL, formData map[string]string, err error) { + // Validate input arguments. + if p.expiration.IsZero() { + return nil, nil, errors.New("Expiration time must be specified") + } + if _, ok := p.formData["key"]; !ok { + return nil, nil, errors.New("object key must be specified") + } + if _, ok := p.formData["bucket"]; !ok { + return nil, nil, errors.New("bucket name must be specified") + } + + bucketName := p.formData["bucket"] + // Fetch the bucket location. + location, err := c.getBucketLocation(ctx, bucketName) + if err != nil { + return nil, nil, err + } + + isVirtualHost := c.isVirtualHostStyleRequest(*c.endpointURL, bucketName) + + u, err = c.makeTargetURL(bucketName, "", location, isVirtualHost, nil) + if err != nil { + return nil, nil, err + } + + // Get credentials from the configured credentials provider. + credValues, err := c.credsProvider.Get() + if err != nil { + return nil, nil, err + } + + var ( + signerType = credValues.SignerType + sessionToken = credValues.SessionToken + accessKeyID = credValues.AccessKeyID + secretAccessKey = credValues.SecretAccessKey + ) + + if signerType.IsAnonymous() { + return nil, nil, errInvalidArgument("Presigned operations are not supported for anonymous credentials") + } + + // Keep time. + t := time.Now().UTC() + // For signature version '2' handle here. + if signerType.IsV2() { + policyBase64 := p.base64() + p.formData["policy"] = policyBase64 + // For Google endpoint set this value to be 'GoogleAccessId'. + if s3utils.IsGoogleEndpoint(*c.endpointURL) { + p.formData["GoogleAccessId"] = accessKeyID + } else { + // For all other endpoints set this value to be 'AWSAccessKeyId'. + p.formData["AWSAccessKeyId"] = accessKeyID + } + // Sign the policy. + p.formData["signature"] = signer.PostPresignSignatureV2(policyBase64, secretAccessKey) + return u, p.formData, nil + } + + // Add date policy. + if err = p.addNewPolicy(policyCondition{ + matchType: "eq", + condition: "$x-amz-date", + value: t.Format(iso8601DateFormat), + }); err != nil { + return nil, nil, err + } + + // Add algorithm policy. + if err = p.addNewPolicy(policyCondition{ + matchType: "eq", + condition: "$x-amz-algorithm", + value: signV4Algorithm, + }); err != nil { + return nil, nil, err + } + + // Add a credential policy. + credential := signer.GetCredential(accessKeyID, location, t, signer.ServiceTypeS3) + if err = p.addNewPolicy(policyCondition{ + matchType: "eq", + condition: "$x-amz-credential", + value: credential, + }); err != nil { + return nil, nil, err + } + + if sessionToken != "" { + if err = p.addNewPolicy(policyCondition{ + matchType: "eq", + condition: "$x-amz-security-token", + value: sessionToken, + }); err != nil { + return nil, nil, err + } + } + + // Get base64 encoded policy. + policyBase64 := p.base64() + + // Fill in the form data. + p.formData["policy"] = policyBase64 + p.formData["x-amz-algorithm"] = signV4Algorithm + p.formData["x-amz-credential"] = credential + p.formData["x-amz-date"] = t.Format(iso8601DateFormat) + if sessionToken != "" { + p.formData["x-amz-security-token"] = sessionToken + } + p.formData["x-amz-signature"] = signer.PostPresignSignatureV4(policyBase64, t, secretAccessKey, location) + return u, p.formData, nil +} diff --git a/vendor/github.com/minio/minio-go/v7/api-put-bucket.go b/vendor/github.com/minio/minio-go/v7/api-put-bucket.go new file mode 100644 index 000000000..df9fe98af --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-put-bucket.go @@ -0,0 +1,123 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2020 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "bytes" + "context" + "encoding/xml" + "net/http" + + "github.com/minio/minio-go/v7/pkg/s3utils" +) + +/// Bucket operations +func (c Client) makeBucket(ctx context.Context, bucketName string, opts MakeBucketOptions) (err error) { + // Validate the input arguments. + if err := s3utils.CheckValidBucketNameStrict(bucketName); err != nil { + return err + } + + err = c.doMakeBucket(ctx, bucketName, opts.Region, opts.ObjectLocking) + if err != nil && (opts.Region == "" || opts.Region == "us-east-1") { + if resp, ok := err.(ErrorResponse); ok && resp.Code == "AuthorizationHeaderMalformed" && resp.Region != "" { + err = c.doMakeBucket(ctx, bucketName, resp.Region, opts.ObjectLocking) + } + } + return err +} + +func (c Client) doMakeBucket(ctx context.Context, bucketName string, location string, objectLockEnabled bool) (err error) { + defer func() { + // Save the location into cache on a successful makeBucket response. + if err == nil { + c.bucketLocCache.Set(bucketName, location) + } + }() + + // If location is empty, treat is a default region 'us-east-1'. + if location == "" { + location = "us-east-1" + // For custom region clients, default + // to custom region instead not 'us-east-1'. + if c.region != "" { + location = c.region + } + } + // PUT bucket request metadata. + reqMetadata := requestMetadata{ + bucketName: bucketName, + bucketLocation: location, + } + + if objectLockEnabled { + headers := make(http.Header) + headers.Add("x-amz-bucket-object-lock-enabled", "true") + reqMetadata.customHeader = headers + } + + // If location is not 'us-east-1' create bucket location config. + if location != "us-east-1" && location != "" { + createBucketConfig := createBucketConfiguration{} + createBucketConfig.Location = location + var createBucketConfigBytes []byte + createBucketConfigBytes, err = xml.Marshal(createBucketConfig) + if err != nil { + return err + } + reqMetadata.contentMD5Base64 = sumMD5Base64(createBucketConfigBytes) + reqMetadata.contentSHA256Hex = sum256Hex(createBucketConfigBytes) + reqMetadata.contentBody = bytes.NewReader(createBucketConfigBytes) + reqMetadata.contentLength = int64(len(createBucketConfigBytes)) + } + + // Execute PUT to create a new bucket. + resp, err := c.executeMethod(ctx, http.MethodPut, reqMetadata) + defer closeResponse(resp) + if err != nil { + return err + } + + if resp != nil { + if resp.StatusCode != http.StatusOK { + return httpRespToErrorResponse(resp, bucketName, "") + } + } + + // Success. + return nil +} + +// MakeBucketOptions holds all options to tweak bucket creation +type MakeBucketOptions struct { + // Bucket location + Region string + // Enable object locking + ObjectLocking bool +} + +// MakeBucket creates a new bucket with bucketName with a context to control cancellations and timeouts. +// +// Location is an optional argument, by default all buckets are +// created in US Standard Region. +// +// For Amazon S3 for more supported regions - http://docs.aws.amazon.com/general/latest/gr/rande.html +// For Google Cloud Storage for more supported regions - https://cloud.google.com/storage/docs/bucket-locations +func (c Client) MakeBucket(ctx context.Context, bucketName string, opts MakeBucketOptions) (err error) { + return c.makeBucket(ctx, bucketName, opts) +} diff --git a/vendor/github.com/minio/minio-go/v7/api-put-object-common.go b/vendor/github.com/minio/minio-go/v7/api-put-object-common.go new file mode 100644 index 000000000..3d0408e53 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-put-object-common.go @@ -0,0 +1,148 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2017 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "context" + "io" + "math" + "os" + + "github.com/minio/minio-go/v7/pkg/s3utils" +) + +// Verify if reader is *minio.Object +func isObject(reader io.Reader) (ok bool) { + _, ok = reader.(*Object) + return +} + +// Verify if reader is a generic ReaderAt +func isReadAt(reader io.Reader) (ok bool) { + var v *os.File + v, ok = reader.(*os.File) + if ok { + // Stdin, Stdout and Stderr all have *os.File type + // which happen to also be io.ReaderAt compatible + // we need to add special conditions for them to + // be ignored by this function. + for _, f := range []string{ + "/dev/stdin", + "/dev/stdout", + "/dev/stderr", + } { + if f == v.Name() { + ok = false + break + } + } + } else { + _, ok = reader.(io.ReaderAt) + } + return +} + +// optimalPartInfo - calculate the optimal part info for a given +// object size. +// +// NOTE: Assumption here is that for any object to be uploaded to any S3 compatible +// object storage it will have the following parameters as constants. +// +// maxPartsCount - 10000 +// minPartSize - 128MiB +// maxMultipartPutObjectSize - 5TiB +// +func optimalPartInfo(objectSize int64, configuredPartSize uint64) (totalPartsCount int, partSize int64, lastPartSize int64, err error) { + // object size is '-1' set it to 5TiB. + var unknownSize bool + if objectSize == -1 { + unknownSize = true + objectSize = maxMultipartPutObjectSize + } + + // object size is larger than supported maximum. + if objectSize > maxMultipartPutObjectSize { + err = errEntityTooLarge(objectSize, maxMultipartPutObjectSize, "", "") + return + } + + var partSizeFlt float64 + if configuredPartSize > 0 { + if int64(configuredPartSize) > objectSize { + err = errEntityTooLarge(int64(configuredPartSize), objectSize, "", "") + return + } + + if !unknownSize { + if objectSize > (int64(configuredPartSize) * maxPartsCount) { + err = errInvalidArgument("Part size * max_parts(10000) is lesser than input objectSize.") + return + } + } + + if configuredPartSize < absMinPartSize { + err = errInvalidArgument("Input part size is smaller than allowed minimum of 5MiB.") + return + } + + if configuredPartSize > maxPartSize { + err = errInvalidArgument("Input part size is bigger than allowed maximum of 5GiB.") + return + } + + partSizeFlt = float64(configuredPartSize) + if unknownSize { + // If input has unknown size and part size is configured + // keep it to maximum allowed as per 10000 parts. + objectSize = int64(configuredPartSize) * maxPartsCount + } + } else { + configuredPartSize = minPartSize + // Use floats for part size for all calculations to avoid + // overflows during float64 to int64 conversions. + partSizeFlt = float64(objectSize / maxPartsCount) + partSizeFlt = math.Ceil(partSizeFlt/float64(configuredPartSize)) * float64(configuredPartSize) + } + + // Total parts count. + totalPartsCount = int(math.Ceil(float64(objectSize) / partSizeFlt)) + // Part size. + partSize = int64(partSizeFlt) + // Last part size. + lastPartSize = objectSize - int64(totalPartsCount-1)*partSize + return totalPartsCount, partSize, lastPartSize, nil +} + +// getUploadID - fetch upload id if already present for an object name +// or initiate a new request to fetch a new upload id. +func (c Client) newUploadID(ctx context.Context, bucketName, objectName string, opts PutObjectOptions) (uploadID string, err error) { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return "", err + } + if err := s3utils.CheckValidObjectName(objectName); err != nil { + return "", err + } + + // Initiate multipart upload for an object. + initMultipartUploadResult, err := c.initiateMultipartUpload(ctx, bucketName, objectName, opts) + if err != nil { + return "", err + } + return initMultipartUploadResult.UploadID, nil +} diff --git a/vendor/github.com/minio/minio-go/v7/api-put-object-copy.go b/vendor/github.com/minio/minio-go/v7/api-put-object-copy.go new file mode 100644 index 000000000..9af036ec0 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-put-object-copy.go @@ -0,0 +1,77 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2017, 2018 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "context" + "io" + "io/ioutil" + "net/http" +) + +// CopyObject - copy a source object into a new object +func (c Client) CopyObject(ctx context.Context, dst CopyDestOptions, src CopySrcOptions) (UploadInfo, error) { + if err := src.validate(); err != nil { + return UploadInfo{}, err + } + + if err := dst.validate(); err != nil { + return UploadInfo{}, err + } + + header := make(http.Header) + dst.Marshal(header) + src.Marshal(header) + + resp, err := c.executeMethod(ctx, http.MethodPut, requestMetadata{ + bucketName: dst.Bucket, + objectName: dst.Object, + customHeader: header, + }) + if err != nil { + return UploadInfo{}, err + } + defer closeResponse(resp) + + if resp.StatusCode != http.StatusOK { + return UploadInfo{}, httpRespToErrorResponse(resp, dst.Bucket, dst.Object) + } + + // Update the progress properly after successful copy. + if dst.Progress != nil { + io.Copy(ioutil.Discard, io.LimitReader(dst.Progress, dst.Size)) + } + + cpObjRes := copyObjectResult{} + if err = xmlDecoder(resp.Body, &cpObjRes); err != nil { + return UploadInfo{}, err + } + + // extract lifecycle expiry date and rule ID + expTime, ruleID := amzExpirationToExpiryDateRuleID(resp.Header.Get(amzExpiration)) + + return UploadInfo{ + Bucket: dst.Bucket, + Key: dst.Object, + LastModified: cpObjRes.LastModified, + ETag: trimEtag(resp.Header.Get("ETag")), + VersionID: resp.Header.Get(amzVersionID), + Expiration: expTime, + ExpirationRuleID: ruleID, + }, nil +} diff --git a/vendor/github.com/minio/minio-go/v7/api-put-object-file-context.go b/vendor/github.com/minio/minio-go/v7/api-put-object-file-context.go new file mode 100644 index 000000000..6c0f20df3 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-put-object-file-context.go @@ -0,0 +1,64 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2017 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "context" + "mime" + "os" + "path/filepath" + + "github.com/minio/minio-go/v7/pkg/s3utils" +) + +// FPutObject - Create an object in a bucket, with contents from file at filePath. Allows request cancellation. +func (c Client) FPutObject(ctx context.Context, bucketName, objectName, filePath string, opts PutObjectOptions) (info UploadInfo, err error) { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return UploadInfo{}, err + } + if err := s3utils.CheckValidObjectName(objectName); err != nil { + return UploadInfo{}, err + } + + // Open the referenced file. + fileReader, err := os.Open(filePath) + // If any error fail quickly here. + if err != nil { + return UploadInfo{}, err + } + defer fileReader.Close() + + // Save the file stat. + fileStat, err := fileReader.Stat() + if err != nil { + return UploadInfo{}, err + } + + // Save the file size. + fileSize := fileStat.Size() + + // Set contentType based on filepath extension if not given or default + // value of "application/octet-stream" if the extension has no associated type. + if opts.ContentType == "" { + if opts.ContentType = mime.TypeByExtension(filepath.Ext(filePath)); opts.ContentType == "" { + opts.ContentType = "application/octet-stream" + } + } + return c.PutObject(ctx, bucketName, objectName, fileReader, fileSize, opts) +} diff --git a/vendor/github.com/minio/minio-go/v7/api-put-object-multipart.go b/vendor/github.com/minio/minio-go/v7/api-put-object-multipart.go new file mode 100644 index 000000000..1c862ad96 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-put-object-multipart.go @@ -0,0 +1,385 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2017 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "bytes" + "context" + "encoding/base64" + "encoding/hex" + "encoding/xml" + "fmt" + "io" + "io/ioutil" + "net/http" + "net/url" + "sort" + "strconv" + "strings" + + "github.com/minio/minio-go/v7/pkg/encrypt" + "github.com/minio/minio-go/v7/pkg/s3utils" +) + +func (c Client) putObjectMultipart(ctx context.Context, bucketName, objectName string, reader io.Reader, size int64, + opts PutObjectOptions) (info UploadInfo, err error) { + info, err = c.putObjectMultipartNoStream(ctx, bucketName, objectName, reader, opts) + if err != nil { + errResp := ToErrorResponse(err) + // Verify if multipart functionality is not available, if not + // fall back to single PutObject operation. + if errResp.Code == "AccessDenied" && strings.Contains(errResp.Message, "Access Denied") { + // Verify if size of reader is greater than '5GiB'. + if size > maxSinglePutObjectSize { + return UploadInfo{}, errEntityTooLarge(size, maxSinglePutObjectSize, bucketName, objectName) + } + // Fall back to uploading as single PutObject operation. + return c.putObject(ctx, bucketName, objectName, reader, size, opts) + } + } + return info, err +} + +func (c Client) putObjectMultipartNoStream(ctx context.Context, bucketName, objectName string, reader io.Reader, opts PutObjectOptions) (info UploadInfo, err error) { + // Input validation. + if err = s3utils.CheckValidBucketName(bucketName); err != nil { + return UploadInfo{}, err + } + if err = s3utils.CheckValidObjectName(objectName); err != nil { + return UploadInfo{}, err + } + + // Total data read and written to server. should be equal to + // 'size' at the end of the call. + var totalUploadedSize int64 + + // Complete multipart upload. + var complMultipartUpload completeMultipartUpload + + // Calculate the optimal parts info for a given size. + totalPartsCount, partSize, _, err := optimalPartInfo(-1, opts.PartSize) + if err != nil { + return UploadInfo{}, err + } + + // Initiate a new multipart upload. + uploadID, err := c.newUploadID(ctx, bucketName, objectName, opts) + if err != nil { + return UploadInfo{}, err + } + + defer func() { + if err != nil { + c.abortMultipartUpload(ctx, bucketName, objectName, uploadID) + } + }() + + // Part number always starts with '1'. + partNumber := 1 + + // Initialize parts uploaded map. + partsInfo := make(map[int]ObjectPart) + + // Create a buffer. + buf := make([]byte, partSize) + + for partNumber <= totalPartsCount { + // Choose hash algorithms to be calculated by hashCopyN, + // avoid sha256 with non-v4 signature request or + // HTTPS connection. + hashAlgos, hashSums := c.hashMaterials(opts.SendContentMd5) + + length, rErr := readFull(reader, buf) + if rErr == io.EOF && partNumber > 1 { + break + } + + if rErr != nil && rErr != io.ErrUnexpectedEOF && rErr != io.EOF { + return UploadInfo{}, rErr + } + + // Calculates hash sums while copying partSize bytes into cw. + for k, v := range hashAlgos { + v.Write(buf[:length]) + hashSums[k] = v.Sum(nil) + v.Close() + } + + // Update progress reader appropriately to the latest offset + // as we read from the source. + rd := newHook(bytes.NewReader(buf[:length]), opts.Progress) + + // Checksums.. + var ( + md5Base64 string + sha256Hex string + ) + if hashSums["md5"] != nil { + md5Base64 = base64.StdEncoding.EncodeToString(hashSums["md5"]) + } + if hashSums["sha256"] != nil { + sha256Hex = hex.EncodeToString(hashSums["sha256"]) + } + + // Proceed to upload the part. + objPart, uerr := c.uploadPart(ctx, bucketName, objectName, uploadID, rd, partNumber, + md5Base64, sha256Hex, int64(length), opts.ServerSideEncryption) + if uerr != nil { + return UploadInfo{}, uerr + } + + // Save successfully uploaded part metadata. + partsInfo[partNumber] = objPart + + // Save successfully uploaded size. + totalUploadedSize += int64(length) + + // Increment part number. + partNumber++ + + // For unknown size, Read EOF we break away. + // We do not have to upload till totalPartsCount. + if rErr == io.EOF { + break + } + } + + // Loop over total uploaded parts to save them in + // Parts array before completing the multipart request. + for i := 1; i < partNumber; i++ { + part, ok := partsInfo[i] + if !ok { + return UploadInfo{}, errInvalidArgument(fmt.Sprintf("Missing part number %d", i)) + } + complMultipartUpload.Parts = append(complMultipartUpload.Parts, CompletePart{ + ETag: part.ETag, + PartNumber: part.PartNumber, + }) + } + + // Sort all completed parts. + sort.Sort(completedParts(complMultipartUpload.Parts)) + + uploadInfo, err := c.completeMultipartUpload(ctx, bucketName, objectName, uploadID, complMultipartUpload) + if err != nil { + return UploadInfo{}, err + } + + uploadInfo.Size = totalUploadedSize + return uploadInfo, nil +} + +// initiateMultipartUpload - Initiates a multipart upload and returns an upload ID. +func (c Client) initiateMultipartUpload(ctx context.Context, bucketName, objectName string, opts PutObjectOptions) (initiateMultipartUploadResult, error) { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return initiateMultipartUploadResult{}, err + } + if err := s3utils.CheckValidObjectName(objectName); err != nil { + return initiateMultipartUploadResult{}, err + } + + // Initialize url queries. + urlValues := make(url.Values) + urlValues.Set("uploads", "") + + // Set ContentType header. + customHeader := opts.Header() + + reqMetadata := requestMetadata{ + bucketName: bucketName, + objectName: objectName, + queryValues: urlValues, + customHeader: customHeader, + } + + // Execute POST on an objectName to initiate multipart upload. + resp, err := c.executeMethod(ctx, http.MethodPost, reqMetadata) + defer closeResponse(resp) + if err != nil { + return initiateMultipartUploadResult{}, err + } + if resp != nil { + if resp.StatusCode != http.StatusOK { + return initiateMultipartUploadResult{}, httpRespToErrorResponse(resp, bucketName, objectName) + } + } + // Decode xml for new multipart upload. + initiateMultipartUploadResult := initiateMultipartUploadResult{} + err = xmlDecoder(resp.Body, &initiateMultipartUploadResult) + if err != nil { + return initiateMultipartUploadResult, err + } + return initiateMultipartUploadResult, nil +} + +// uploadPart - Uploads a part in a multipart upload. +func (c Client) uploadPart(ctx context.Context, bucketName, objectName, uploadID string, reader io.Reader, + partNumber int, md5Base64, sha256Hex string, size int64, sse encrypt.ServerSide) (ObjectPart, error) { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return ObjectPart{}, err + } + if err := s3utils.CheckValidObjectName(objectName); err != nil { + return ObjectPart{}, err + } + if size > maxPartSize { + return ObjectPart{}, errEntityTooLarge(size, maxPartSize, bucketName, objectName) + } + if size <= -1 { + return ObjectPart{}, errEntityTooSmall(size, bucketName, objectName) + } + if partNumber <= 0 { + return ObjectPart{}, errInvalidArgument("Part number cannot be negative or equal to zero.") + } + if uploadID == "" { + return ObjectPart{}, errInvalidArgument("UploadID cannot be empty.") + } + + // Get resources properly escaped and lined up before using them in http request. + urlValues := make(url.Values) + // Set part number. + urlValues.Set("partNumber", strconv.Itoa(partNumber)) + // Set upload id. + urlValues.Set("uploadId", uploadID) + + // Set encryption headers, if any. + customHeader := make(http.Header) + // https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadUploadPart.html + // Server-side encryption is supported by the S3 Multipart Upload actions. + // Unless you are using a customer-provided encryption key, you don't need + // to specify the encryption parameters in each UploadPart request. + if sse != nil && sse.Type() == encrypt.SSEC { + sse.Marshal(customHeader) + } + + reqMetadata := requestMetadata{ + bucketName: bucketName, + objectName: objectName, + queryValues: urlValues, + customHeader: customHeader, + contentBody: reader, + contentLength: size, + contentMD5Base64: md5Base64, + contentSHA256Hex: sha256Hex, + } + + // Execute PUT on each part. + resp, err := c.executeMethod(ctx, http.MethodPut, reqMetadata) + defer closeResponse(resp) + if err != nil { + return ObjectPart{}, err + } + if resp != nil { + if resp.StatusCode != http.StatusOK { + return ObjectPart{}, httpRespToErrorResponse(resp, bucketName, objectName) + } + } + // Once successfully uploaded, return completed part. + objPart := ObjectPart{} + objPart.Size = size + objPart.PartNumber = partNumber + // Trim off the odd double quotes from ETag in the beginning and end. + objPart.ETag = trimEtag(resp.Header.Get("ETag")) + return objPart, nil +} + +// completeMultipartUpload - Completes a multipart upload by assembling previously uploaded parts. +func (c Client) completeMultipartUpload(ctx context.Context, bucketName, objectName, uploadID string, + complete completeMultipartUpload) (UploadInfo, error) { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return UploadInfo{}, err + } + if err := s3utils.CheckValidObjectName(objectName); err != nil { + return UploadInfo{}, err + } + + // Initialize url queries. + urlValues := make(url.Values) + urlValues.Set("uploadId", uploadID) + // Marshal complete multipart body. + completeMultipartUploadBytes, err := xml.Marshal(complete) + if err != nil { + return UploadInfo{}, err + } + + // Instantiate all the complete multipart buffer. + completeMultipartUploadBuffer := bytes.NewReader(completeMultipartUploadBytes) + reqMetadata := requestMetadata{ + bucketName: bucketName, + objectName: objectName, + queryValues: urlValues, + contentBody: completeMultipartUploadBuffer, + contentLength: int64(len(completeMultipartUploadBytes)), + contentSHA256Hex: sum256Hex(completeMultipartUploadBytes), + } + + // Execute POST to complete multipart upload for an objectName. + resp, err := c.executeMethod(ctx, http.MethodPost, reqMetadata) + defer closeResponse(resp) + if err != nil { + return UploadInfo{}, err + } + if resp != nil { + if resp.StatusCode != http.StatusOK { + return UploadInfo{}, httpRespToErrorResponse(resp, bucketName, objectName) + } + } + + // Read resp.Body into a []bytes to parse for Error response inside the body + var b []byte + b, err = ioutil.ReadAll(resp.Body) + if err != nil { + return UploadInfo{}, err + } + // Decode completed multipart upload response on success. + completeMultipartUploadResult := completeMultipartUploadResult{} + err = xmlDecoder(bytes.NewReader(b), &completeMultipartUploadResult) + if err != nil { + // xml parsing failure due to presence an ill-formed xml fragment + return UploadInfo{}, err + } else if completeMultipartUploadResult.Bucket == "" { + // xml's Decode method ignores well-formed xml that don't apply to the type of value supplied. + // In this case, it would leave completeMultipartUploadResult with the corresponding zero-values + // of the members. + + // Decode completed multipart upload response on failure + completeMultipartUploadErr := ErrorResponse{} + err = xmlDecoder(bytes.NewReader(b), &completeMultipartUploadErr) + if err != nil { + // xml parsing failure due to presence an ill-formed xml fragment + return UploadInfo{}, err + } + return UploadInfo{}, completeMultipartUploadErr + } + + // extract lifecycle expiry date and rule ID + expTime, ruleID := amzExpirationToExpiryDateRuleID(resp.Header.Get(amzExpiration)) + + return UploadInfo{ + Bucket: completeMultipartUploadResult.Bucket, + Key: completeMultipartUploadResult.Key, + ETag: trimEtag(completeMultipartUploadResult.ETag), + VersionID: resp.Header.Get(amzVersionID), + Location: completeMultipartUploadResult.Location, + Expiration: expTime, + ExpirationRuleID: ruleID, + }, nil + +} diff --git a/vendor/github.com/minio/minio-go/v7/api-put-object-streaming.go b/vendor/github.com/minio/minio-go/v7/api-put-object-streaming.go new file mode 100644 index 000000000..cd2909632 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-put-object-streaming.go @@ -0,0 +1,490 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2017 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "bytes" + "context" + "encoding/base64" + "fmt" + "io" + "net/http" + "net/url" + "sort" + "strings" + + "github.com/google/uuid" + "github.com/minio/minio-go/v7/pkg/s3utils" +) + +// putObjectMultipartStream - upload a large object using +// multipart upload and streaming signature for signing payload. +// Comprehensive put object operation involving multipart uploads. +// +// Following code handles these types of readers. +// +// - *minio.Object +// - Any reader which has a method 'ReadAt()' +// +func (c Client) putObjectMultipartStream(ctx context.Context, bucketName, objectName string, + reader io.Reader, size int64, opts PutObjectOptions) (info UploadInfo, err error) { + + if !isObject(reader) && isReadAt(reader) && !opts.SendContentMd5 { + // Verify if the reader implements ReadAt and it is not a *minio.Object then we will use parallel uploader. + info, err = c.putObjectMultipartStreamFromReadAt(ctx, bucketName, objectName, reader.(io.ReaderAt), size, opts) + } else { + info, err = c.putObjectMultipartStreamOptionalChecksum(ctx, bucketName, objectName, reader, size, opts) + } + if err != nil { + errResp := ToErrorResponse(err) + // Verify if multipart functionality is not available, if not + // fall back to single PutObject operation. + if errResp.Code == "AccessDenied" && strings.Contains(errResp.Message, "Access Denied") { + // Verify if size of reader is greater than '5GiB'. + if size > maxSinglePutObjectSize { + return UploadInfo{}, errEntityTooLarge(size, maxSinglePutObjectSize, bucketName, objectName) + } + // Fall back to uploading as single PutObject operation. + return c.putObject(ctx, bucketName, objectName, reader, size, opts) + } + } + return info, err +} + +// uploadedPartRes - the response received from a part upload. +type uploadedPartRes struct { + Error error // Any error encountered while uploading the part. + PartNum int // Number of the part uploaded. + Size int64 // Size of the part uploaded. + Part ObjectPart +} + +type uploadPartReq struct { + PartNum int // Number of the part uploaded. + Part ObjectPart // Size of the part uploaded. +} + +// putObjectMultipartFromReadAt - Uploads files bigger than 128MiB. +// Supports all readers which implements io.ReaderAt interface +// (ReadAt method). +// +// NOTE: This function is meant to be used for all readers which +// implement io.ReaderAt which allows us for resuming multipart +// uploads but reading at an offset, which would avoid re-read the +// data which was already uploaded. Internally this function uses +// temporary files for staging all the data, these temporary files are +// cleaned automatically when the caller i.e http client closes the +// stream after uploading all the contents successfully. +func (c Client) putObjectMultipartStreamFromReadAt(ctx context.Context, bucketName, objectName string, + reader io.ReaderAt, size int64, opts PutObjectOptions) (info UploadInfo, err error) { + // Input validation. + if err = s3utils.CheckValidBucketName(bucketName); err != nil { + return UploadInfo{}, err + } + if err = s3utils.CheckValidObjectName(objectName); err != nil { + return UploadInfo{}, err + } + + // Calculate the optimal parts info for a given size. + totalPartsCount, partSize, lastPartSize, err := optimalPartInfo(size, opts.PartSize) + if err != nil { + return UploadInfo{}, err + } + + // Initiate a new multipart upload. + uploadID, err := c.newUploadID(ctx, bucketName, objectName, opts) + if err != nil { + return UploadInfo{}, err + } + + // Aborts the multipart upload in progress, if the + // function returns any error, since we do not resume + // we should purge the parts which have been uploaded + // to relinquish storage space. + defer func() { + if err != nil { + c.abortMultipartUpload(ctx, bucketName, objectName, uploadID) + } + }() + + // Total data read and written to server. should be equal to 'size' at the end of the call. + var totalUploadedSize int64 + + // Complete multipart upload. + var complMultipartUpload completeMultipartUpload + + // Declare a channel that sends the next part number to be uploaded. + // Buffered to 10000 because thats the maximum number of parts allowed + // by S3. + uploadPartsCh := make(chan uploadPartReq, 10000) + + // Declare a channel that sends back the response of a part upload. + // Buffered to 10000 because thats the maximum number of parts allowed + // by S3. + uploadedPartsCh := make(chan uploadedPartRes, 10000) + + // Used for readability, lastPartNumber is always totalPartsCount. + lastPartNumber := totalPartsCount + + // Send each part number to the channel to be processed. + for p := 1; p <= totalPartsCount; p++ { + uploadPartsCh <- uploadPartReq{PartNum: p} + } + close(uploadPartsCh) + + var partsBuf = make([][]byte, opts.getNumThreads()) + for i := range partsBuf { + partsBuf[i] = make([]byte, partSize) + } + + // Receive each part number from the channel allowing three parallel uploads. + for w := 1; w <= opts.getNumThreads(); w++ { + go func(w int, partSize int64) { + // Each worker will draw from the part channel and upload in parallel. + for uploadReq := range uploadPartsCh { + + // If partNumber was not uploaded we calculate the missing + // part offset and size. For all other part numbers we + // calculate offset based on multiples of partSize. + readOffset := int64(uploadReq.PartNum-1) * partSize + + // As a special case if partNumber is lastPartNumber, we + // calculate the offset based on the last part size. + if uploadReq.PartNum == lastPartNumber { + readOffset = (size - lastPartSize) + partSize = lastPartSize + } + + n, rerr := readFull(io.NewSectionReader(reader, readOffset, partSize), partsBuf[w-1][:partSize]) + if rerr != nil && rerr != io.ErrUnexpectedEOF && err != io.EOF { + uploadedPartsCh <- uploadedPartRes{ + Error: rerr, + } + // Exit the goroutine. + return + } + + // Get a section reader on a particular offset. + hookReader := newHook(bytes.NewReader(partsBuf[w-1][:n]), opts.Progress) + + // Proceed to upload the part. + objPart, err := c.uploadPart(ctx, bucketName, objectName, + uploadID, hookReader, uploadReq.PartNum, + "", "", partSize, opts.ServerSideEncryption) + if err != nil { + uploadedPartsCh <- uploadedPartRes{ + Error: err, + } + // Exit the goroutine. + return + } + + // Save successfully uploaded part metadata. + uploadReq.Part = objPart + + // Send successful part info through the channel. + uploadedPartsCh <- uploadedPartRes{ + Size: objPart.Size, + PartNum: uploadReq.PartNum, + Part: uploadReq.Part, + } + } + }(w, partSize) + } + + // Gather the responses as they occur and update any + // progress bar. + for u := 1; u <= totalPartsCount; u++ { + uploadRes := <-uploadedPartsCh + if uploadRes.Error != nil { + return UploadInfo{}, uploadRes.Error + } + // Update the totalUploadedSize. + totalUploadedSize += uploadRes.Size + // Store the parts to be completed in order. + complMultipartUpload.Parts = append(complMultipartUpload.Parts, CompletePart{ + ETag: uploadRes.Part.ETag, + PartNumber: uploadRes.Part.PartNumber, + }) + } + + // Verify if we uploaded all the data. + if totalUploadedSize != size { + return UploadInfo{}, errUnexpectedEOF(totalUploadedSize, size, bucketName, objectName) + } + + // Sort all completed parts. + sort.Sort(completedParts(complMultipartUpload.Parts)) + + uploadInfo, err := c.completeMultipartUpload(ctx, bucketName, objectName, uploadID, complMultipartUpload) + if err != nil { + return UploadInfo{}, err + } + + uploadInfo.Size = totalUploadedSize + return uploadInfo, nil +} + +func (c Client) putObjectMultipartStreamOptionalChecksum(ctx context.Context, bucketName, objectName string, + reader io.Reader, size int64, opts PutObjectOptions) (info UploadInfo, err error) { + // Input validation. + if err = s3utils.CheckValidBucketName(bucketName); err != nil { + return UploadInfo{}, err + } + if err = s3utils.CheckValidObjectName(objectName); err != nil { + return UploadInfo{}, err + } + + // Calculate the optimal parts info for a given size. + totalPartsCount, partSize, lastPartSize, err := optimalPartInfo(size, opts.PartSize) + if err != nil { + return UploadInfo{}, err + } + // Initiates a new multipart request + uploadID, err := c.newUploadID(ctx, bucketName, objectName, opts) + if err != nil { + return UploadInfo{}, err + } + + // Aborts the multipart upload if the function returns + // any error, since we do not resume we should purge + // the parts which have been uploaded to relinquish + // storage space. + defer func() { + if err != nil { + c.abortMultipartUpload(ctx, bucketName, objectName, uploadID) + } + }() + + // Total data read and written to server. should be equal to 'size' at the end of the call. + var totalUploadedSize int64 + + // Initialize parts uploaded map. + partsInfo := make(map[int]ObjectPart) + + // Create a buffer. + buf := make([]byte, partSize) + + // Avoid declaring variables in the for loop + var md5Base64 string + var hookReader io.Reader + + // Part number always starts with '1'. + var partNumber int + for partNumber = 1; partNumber <= totalPartsCount; partNumber++ { + + // Proceed to upload the part. + if partNumber == totalPartsCount { + partSize = lastPartSize + } + + if opts.SendContentMd5 { + length, rerr := readFull(reader, buf) + if rerr == io.EOF && partNumber > 1 { + break + } + + if rerr != nil && rerr != io.ErrUnexpectedEOF && err != io.EOF { + return UploadInfo{}, rerr + } + + // Calculate md5sum. + hash := c.md5Hasher() + hash.Write(buf[:length]) + md5Base64 = base64.StdEncoding.EncodeToString(hash.Sum(nil)) + hash.Close() + + // Update progress reader appropriately to the latest offset + // as we read from the source. + hookReader = newHook(bytes.NewReader(buf[:length]), opts.Progress) + } else { + // Update progress reader appropriately to the latest offset + // as we read from the source. + hookReader = newHook(reader, opts.Progress) + } + + objPart, uerr := c.uploadPart(ctx, bucketName, objectName, uploadID, + io.LimitReader(hookReader, partSize), + partNumber, md5Base64, "", partSize, opts.ServerSideEncryption) + if uerr != nil { + return UploadInfo{}, uerr + } + + // Save successfully uploaded part metadata. + partsInfo[partNumber] = objPart + + // Save successfully uploaded size. + totalUploadedSize += partSize + } + + // Verify if we uploaded all the data. + if size > 0 { + if totalUploadedSize != size { + return UploadInfo{}, errUnexpectedEOF(totalUploadedSize, size, bucketName, objectName) + } + } + + // Complete multipart upload. + var complMultipartUpload completeMultipartUpload + + // Loop over total uploaded parts to save them in + // Parts array before completing the multipart request. + for i := 1; i < partNumber; i++ { + part, ok := partsInfo[i] + if !ok { + return UploadInfo{}, errInvalidArgument(fmt.Sprintf("Missing part number %d", i)) + } + complMultipartUpload.Parts = append(complMultipartUpload.Parts, CompletePart{ + ETag: part.ETag, + PartNumber: part.PartNumber, + }) + } + + // Sort all completed parts. + sort.Sort(completedParts(complMultipartUpload.Parts)) + + uploadInfo, err := c.completeMultipartUpload(ctx, bucketName, objectName, uploadID, complMultipartUpload) + if err != nil { + return UploadInfo{}, err + } + + uploadInfo.Size = totalUploadedSize + return uploadInfo, nil +} + +// putObject special function used Google Cloud Storage. This special function +// is used for Google Cloud Storage since Google's multipart API is not S3 compatible. +func (c Client) putObject(ctx context.Context, bucketName, objectName string, reader io.Reader, size int64, opts PutObjectOptions) (info UploadInfo, err error) { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return UploadInfo{}, err + } + if err := s3utils.CheckValidObjectName(objectName); err != nil { + return UploadInfo{}, err + } + + // Size -1 is only supported on Google Cloud Storage, we error + // out in all other situations. + if size < 0 && !s3utils.IsGoogleEndpoint(*c.endpointURL) { + return UploadInfo{}, errEntityTooSmall(size, bucketName, objectName) + } + + if opts.SendContentMd5 && s3utils.IsGoogleEndpoint(*c.endpointURL) && size < 0 { + return UploadInfo{}, errInvalidArgument("MD5Sum cannot be calculated with size '-1'") + } + + if size > 0 { + if isReadAt(reader) && !isObject(reader) { + seeker, ok := reader.(io.Seeker) + if ok { + offset, err := seeker.Seek(0, io.SeekCurrent) + if err != nil { + return UploadInfo{}, errInvalidArgument(err.Error()) + } + reader = io.NewSectionReader(reader.(io.ReaderAt), offset, size) + } + } + } + + var md5Base64 string + if opts.SendContentMd5 { + // Create a buffer. + buf := make([]byte, size) + + length, rErr := readFull(reader, buf) + if rErr != nil && rErr != io.ErrUnexpectedEOF && rErr != io.EOF { + return UploadInfo{}, rErr + } + + // Calculate md5sum. + hash := c.md5Hasher() + hash.Write(buf[:length]) + md5Base64 = base64.StdEncoding.EncodeToString(hash.Sum(nil)) + reader = bytes.NewReader(buf[:length]) + hash.Close() + } + + // Update progress reader appropriately to the latest offset as we + // read from the source. + readSeeker := newHook(reader, opts.Progress) + + // This function does not calculate sha256 and md5sum for payload. + // Execute put object. + return c.putObjectDo(ctx, bucketName, objectName, readSeeker, md5Base64, "", size, opts) +} + +// putObjectDo - executes the put object http operation. +// NOTE: You must have WRITE permissions on a bucket to add an object to it. +func (c Client) putObjectDo(ctx context.Context, bucketName, objectName string, reader io.Reader, md5Base64, sha256Hex string, size int64, opts PutObjectOptions) (UploadInfo, error) { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return UploadInfo{}, err + } + if err := s3utils.CheckValidObjectName(objectName); err != nil { + return UploadInfo{}, err + } + // Set headers. + customHeader := opts.Header() + + // Populate request metadata. + reqMetadata := requestMetadata{ + bucketName: bucketName, + objectName: objectName, + customHeader: customHeader, + contentBody: reader, + contentLength: size, + contentMD5Base64: md5Base64, + contentSHA256Hex: sha256Hex, + } + if opts.ReplicationVersionID != "" { + if _, err := uuid.Parse(opts.ReplicationVersionID); err != nil { + return UploadInfo{}, errInvalidArgument(err.Error()) + } + urlValues := make(url.Values) + urlValues.Set("versionId", opts.ReplicationVersionID) + if opts.ReplicationETag != "" { + urlValues.Set("etag", opts.ReplicationETag) + } + reqMetadata.queryValues = urlValues + } + + // Execute PUT an objectName. + resp, err := c.executeMethod(ctx, http.MethodPut, reqMetadata) + defer closeResponse(resp) + if err != nil { + return UploadInfo{}, err + } + if resp != nil { + if resp.StatusCode != http.StatusOK { + return UploadInfo{}, httpRespToErrorResponse(resp, bucketName, objectName) + } + } + + // extract lifecycle expiry date and rule ID + expTime, ruleID := amzExpirationToExpiryDateRuleID(resp.Header.Get(amzExpiration)) + + return UploadInfo{ + Bucket: bucketName, + Key: objectName, + ETag: trimEtag(resp.Header.Get("ETag")), + VersionID: resp.Header.Get(amzVersionID), + Size: size, + Expiration: expTime, + ExpirationRuleID: ruleID, + }, nil +} diff --git a/vendor/github.com/minio/minio-go/v7/api-put-object.go b/vendor/github.com/minio/minio-go/v7/api-put-object.go new file mode 100644 index 000000000..14a2c16a0 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-put-object.go @@ -0,0 +1,360 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2017 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "bytes" + "context" + "encoding/base64" + "errors" + "fmt" + "io" + "net/http" + "sort" + "time" + + "github.com/minio/minio-go/v7/pkg/encrypt" + "github.com/minio/minio-go/v7/pkg/s3utils" + "golang.org/x/net/http/httpguts" +) + +// ReplicationStatus represents replication status of object +type ReplicationStatus string + +const ( + // ReplicationStatusPending indicates replication is pending + ReplicationStatusPending ReplicationStatus = "PENDING" + // ReplicationStatusComplete indicates replication completed ok + ReplicationStatusComplete ReplicationStatus = "COMPLETE" + // ReplicationStatusFailed indicates replication failed + ReplicationStatusFailed ReplicationStatus = "FAILED" + // ReplicationStatusReplica indicates object is a replica of a source + ReplicationStatusReplica ReplicationStatus = "REPLICA" +) + +// Empty returns true if no replication status set. +func (r ReplicationStatus) Empty() bool { + return r == "" +} + +// PutObjectOptions represents options specified by user for PutObject call +type PutObjectOptions struct { + UserMetadata map[string]string + UserTags map[string]string + Progress io.Reader + ContentType string + ContentEncoding string + ContentDisposition string + ContentLanguage string + CacheControl string + Mode RetentionMode + RetainUntilDate time.Time + ServerSideEncryption encrypt.ServerSide + NumThreads uint + StorageClass string + WebsiteRedirectLocation string + PartSize uint64 + LegalHold LegalHoldStatus + SendContentMd5 bool + DisableMultipart bool + ReplicationVersionID string + ReplicationETag string + ReplicationStatus ReplicationStatus + ReplicationMTime time.Time +} + +// getNumThreads - gets the number of threads to be used in the multipart +// put object operation +func (opts PutObjectOptions) getNumThreads() (numThreads int) { + if opts.NumThreads > 0 { + numThreads = int(opts.NumThreads) + } else { + numThreads = totalWorkers + } + return +} + +// Header - constructs the headers from metadata entered by user in +// PutObjectOptions struct +func (opts PutObjectOptions) Header() (header http.Header) { + header = make(http.Header) + + contentType := opts.ContentType + if contentType == "" { + contentType = "application/octet-stream" + } + header.Set("Content-Type", contentType) + + if opts.ContentEncoding != "" { + header.Set("Content-Encoding", opts.ContentEncoding) + } + if opts.ContentDisposition != "" { + header.Set("Content-Disposition", opts.ContentDisposition) + } + if opts.ContentLanguage != "" { + header.Set("Content-Language", opts.ContentLanguage) + } + if opts.CacheControl != "" { + header.Set("Cache-Control", opts.CacheControl) + } + + if opts.Mode != "" { + header.Set(amzLockMode, opts.Mode.String()) + } + + if !opts.RetainUntilDate.IsZero() { + header.Set("X-Amz-Object-Lock-Retain-Until-Date", opts.RetainUntilDate.Format(time.RFC3339)) + } + + if opts.LegalHold != "" { + header.Set(amzLegalHoldHeader, opts.LegalHold.String()) + } + + if opts.ServerSideEncryption != nil { + opts.ServerSideEncryption.Marshal(header) + } + + if opts.StorageClass != "" { + header.Set(amzStorageClass, opts.StorageClass) + } + + if opts.WebsiteRedirectLocation != "" { + header.Set(amzWebsiteRedirectLocation, opts.WebsiteRedirectLocation) + } + + if !opts.ReplicationStatus.Empty() { + header.Set(amzBucketReplicationStatus, string(opts.ReplicationStatus)) + } + if !opts.ReplicationMTime.IsZero() { + header.Set(minIOBucketReplicationSourceMTime, opts.ReplicationMTime.Format(time.RFC3339)) + } + if opts.ReplicationETag != "" { + header.Set(minIOBucketReplicationETag, opts.ReplicationETag) + } + if len(opts.UserTags) != 0 { + header.Set(amzTaggingHeader, s3utils.TagEncode(opts.UserTags)) + } + + for k, v := range opts.UserMetadata { + if isAmzHeader(k) || isStandardHeader(k) || isStorageClassHeader(k) { + header.Set(k, v) + } else { + header.Set("x-amz-meta-"+k, v) + } + } + return +} + +// validate() checks if the UserMetadata map has standard headers or and raises an error if so. +func (opts PutObjectOptions) validate() (err error) { + for k, v := range opts.UserMetadata { + if !httpguts.ValidHeaderFieldName(k) || isStandardHeader(k) || isSSEHeader(k) || isStorageClassHeader(k) { + return errInvalidArgument(k + " unsupported user defined metadata name") + } + if !httpguts.ValidHeaderFieldValue(v) { + return errInvalidArgument(v + " unsupported user defined metadata value") + } + } + if opts.Mode != "" && !opts.Mode.IsValid() { + return errInvalidArgument(opts.Mode.String() + " unsupported retention mode") + } + if opts.LegalHold != "" && !opts.LegalHold.IsValid() { + return errInvalidArgument(opts.LegalHold.String() + " unsupported legal-hold status") + } + return nil +} + +// completedParts is a collection of parts sortable by their part numbers. +// used for sorting the uploaded parts before completing the multipart request. +type completedParts []CompletePart + +func (a completedParts) Len() int { return len(a) } +func (a completedParts) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a completedParts) Less(i, j int) bool { return a[i].PartNumber < a[j].PartNumber } + +// PutObject creates an object in a bucket. +// +// You must have WRITE permissions on a bucket to create an object. +// +// - For size smaller than 128MiB PutObject automatically does a +// single atomic Put operation. +// - For size larger than 128MiB PutObject automatically does a +// multipart Put operation. +// - For size input as -1 PutObject does a multipart Put operation +// until input stream reaches EOF. Maximum object size that can +// be uploaded through this operation will be 5TiB. +func (c Client) PutObject(ctx context.Context, bucketName, objectName string, reader io.Reader, objectSize int64, + opts PutObjectOptions) (info UploadInfo, err error) { + if objectSize < 0 && opts.DisableMultipart { + return UploadInfo{}, errors.New("object size must be provided with disable multipart upload") + } + + err = opts.validate() + if err != nil { + return UploadInfo{}, err + } + + return c.putObjectCommon(ctx, bucketName, objectName, reader, objectSize, opts) +} + +func (c Client) putObjectCommon(ctx context.Context, bucketName, objectName string, reader io.Reader, size int64, opts PutObjectOptions) (info UploadInfo, err error) { + // Check for largest object size allowed. + if size > int64(maxMultipartPutObjectSize) { + return UploadInfo{}, errEntityTooLarge(size, maxMultipartPutObjectSize, bucketName, objectName) + } + + // NOTE: Streaming signature is not supported by GCS. + if s3utils.IsGoogleEndpoint(*c.endpointURL) { + return c.putObject(ctx, bucketName, objectName, reader, size, opts) + } + + partSize := opts.PartSize + if opts.PartSize == 0 { + partSize = minPartSize + } + + if c.overrideSignerType.IsV2() { + if size >= 0 && size < int64(partSize) || opts.DisableMultipart { + return c.putObject(ctx, bucketName, objectName, reader, size, opts) + } + return c.putObjectMultipart(ctx, bucketName, objectName, reader, size, opts) + } + + if size < 0 { + return c.putObjectMultipartStreamNoLength(ctx, bucketName, objectName, reader, opts) + } + + if size < int64(partSize) || opts.DisableMultipart { + return c.putObject(ctx, bucketName, objectName, reader, size, opts) + } + + return c.putObjectMultipartStream(ctx, bucketName, objectName, reader, size, opts) +} + +func (c Client) putObjectMultipartStreamNoLength(ctx context.Context, bucketName, objectName string, reader io.Reader, opts PutObjectOptions) (info UploadInfo, err error) { + // Input validation. + if err = s3utils.CheckValidBucketName(bucketName); err != nil { + return UploadInfo{}, err + } + if err = s3utils.CheckValidObjectName(objectName); err != nil { + return UploadInfo{}, err + } + + // Total data read and written to server. should be equal to + // 'size' at the end of the call. + var totalUploadedSize int64 + + // Complete multipart upload. + var complMultipartUpload completeMultipartUpload + + // Calculate the optimal parts info for a given size. + totalPartsCount, partSize, _, err := optimalPartInfo(-1, opts.PartSize) + if err != nil { + return UploadInfo{}, err + } + // Initiate a new multipart upload. + uploadID, err := c.newUploadID(ctx, bucketName, objectName, opts) + if err != nil { + return UploadInfo{}, err + } + + defer func() { + if err != nil { + c.abortMultipartUpload(ctx, bucketName, objectName, uploadID) + } + }() + + // Part number always starts with '1'. + partNumber := 1 + + // Initialize parts uploaded map. + partsInfo := make(map[int]ObjectPart) + + // Create a buffer. + buf := make([]byte, partSize) + + for partNumber <= totalPartsCount { + length, rerr := readFull(reader, buf) + if rerr == io.EOF && partNumber > 1 { + break + } + + if rerr != nil && rerr != io.ErrUnexpectedEOF && rerr != io.EOF { + return UploadInfo{}, rerr + } + + var md5Base64 string + if opts.SendContentMd5 { + // Calculate md5sum. + hash := c.md5Hasher() + hash.Write(buf[:length]) + md5Base64 = base64.StdEncoding.EncodeToString(hash.Sum(nil)) + hash.Close() + } + + // Update progress reader appropriately to the latest offset + // as we read from the source. + rd := newHook(bytes.NewReader(buf[:length]), opts.Progress) + + // Proceed to upload the part. + objPart, uerr := c.uploadPart(ctx, bucketName, objectName, uploadID, rd, partNumber, + md5Base64, "", int64(length), opts.ServerSideEncryption) + if uerr != nil { + return UploadInfo{}, uerr + } + + // Save successfully uploaded part metadata. + partsInfo[partNumber] = objPart + + // Save successfully uploaded size. + totalUploadedSize += int64(length) + + // Increment part number. + partNumber++ + + // For unknown size, Read EOF we break away. + // We do not have to upload till totalPartsCount. + if rerr == io.EOF { + break + } + } + + // Loop over total uploaded parts to save them in + // Parts array before completing the multipart request. + for i := 1; i < partNumber; i++ { + part, ok := partsInfo[i] + if !ok { + return UploadInfo{}, errInvalidArgument(fmt.Sprintf("Missing part number %d", i)) + } + complMultipartUpload.Parts = append(complMultipartUpload.Parts, CompletePart{ + ETag: part.ETag, + PartNumber: part.PartNumber, + }) + } + + // Sort all completed parts. + sort.Sort(completedParts(complMultipartUpload.Parts)) + + uploadInfo, err := c.completeMultipartUpload(ctx, bucketName, objectName, uploadID, complMultipartUpload) + if err != nil { + return UploadInfo{}, err + } + + uploadInfo.Size = totalUploadedSize + return uploadInfo, nil +} diff --git a/vendor/github.com/minio/minio-go/v7/api-remove.go b/vendor/github.com/minio/minio-go/v7/api-remove.go new file mode 100644 index 000000000..6c2ab7802 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-remove.go @@ -0,0 +1,345 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2020 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "bytes" + "context" + "encoding/xml" + "io" + "net/http" + "net/url" + + "github.com/minio/minio-go/v7/pkg/s3utils" +) + +// RemoveBucket deletes the bucket name. +// +// All objects (including all object versions and delete markers). +// in the bucket must be deleted before successfully attempting this request. +func (c Client) RemoveBucket(ctx context.Context, bucketName string) error { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return err + } + // Execute DELETE on bucket. + resp, err := c.executeMethod(ctx, http.MethodDelete, requestMetadata{ + bucketName: bucketName, + contentSHA256Hex: emptySHA256Hex, + }) + defer closeResponse(resp) + if err != nil { + return err + } + if resp != nil { + if resp.StatusCode != http.StatusNoContent { + return httpRespToErrorResponse(resp, bucketName, "") + } + } + + // Remove the location from cache on a successful delete. + c.bucketLocCache.Delete(bucketName) + + return nil +} + +// RemoveObjectOptions represents options specified by user for RemoveObject call +type RemoveObjectOptions struct { + GovernanceBypass bool + VersionID string +} + +// RemoveObject removes an object from a bucket. +func (c Client) RemoveObject(ctx context.Context, bucketName, objectName string, opts RemoveObjectOptions) error { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return err + } + if err := s3utils.CheckValidObjectName(objectName); err != nil { + return err + } + + // Get resources properly escaped and lined up before + // using them in http request. + urlValues := make(url.Values) + + if opts.VersionID != "" { + urlValues.Set("versionId", opts.VersionID) + } + + // Build headers. + headers := make(http.Header) + + if opts.GovernanceBypass { + // Set the bypass goverenance retention header + headers.Set(amzBypassGovernance, "true") + } + // Execute DELETE on objectName. + resp, err := c.executeMethod(ctx, http.MethodDelete, requestMetadata{ + bucketName: bucketName, + objectName: objectName, + contentSHA256Hex: emptySHA256Hex, + queryValues: urlValues, + customHeader: headers, + }) + defer closeResponse(resp) + if err != nil { + return err + } + if resp != nil { + // if some unexpected error happened and max retry is reached, we want to let client know + if resp.StatusCode != http.StatusNoContent { + return httpRespToErrorResponse(resp, bucketName, objectName) + } + } + + // DeleteObject always responds with http '204' even for + // objects which do not exist. So no need to handle them + // specifically. + return nil +} + +// RemoveObjectError - container of Multi Delete S3 API error +type RemoveObjectError struct { + ObjectName string + VersionID string + Err error +} + +// generateRemoveMultiObjects - generate the XML request for remove multi objects request +func generateRemoveMultiObjectsRequest(objects []ObjectInfo) []byte { + delObjects := []deleteObject{} + for _, obj := range objects { + delObjects = append(delObjects, deleteObject{ + Key: obj.Key, + VersionID: obj.VersionID, + }) + } + xmlBytes, _ := xml.Marshal(deleteMultiObjects{Objects: delObjects, Quiet: true}) + return xmlBytes +} + +// processRemoveMultiObjectsResponse - parse the remove multi objects web service +// and return the success/failure result status for each object +func processRemoveMultiObjectsResponse(body io.Reader, objects []ObjectInfo, errorCh chan<- RemoveObjectError) { + // Parse multi delete XML response + rmResult := &deleteMultiObjectsResult{} + err := xmlDecoder(body, rmResult) + if err != nil { + errorCh <- RemoveObjectError{ObjectName: "", Err: err} + return + } + + // Fill deletion that returned an error. + for _, obj := range rmResult.UnDeletedObjects { + errorCh <- RemoveObjectError{ + ObjectName: obj.Key, + Err: ErrorResponse{ + Code: obj.Code, + Message: obj.Message, + }, + } + } +} + +// RemoveObjectsOptions represents options specified by user for RemoveObjects call +type RemoveObjectsOptions struct { + GovernanceBypass bool +} + +// RemoveObjects removes multiple objects from a bucket while +// it is possible to specify objects versions which are received from +// objectsCh. Remove failures are sent back via error channel. +func (c Client) RemoveObjects(ctx context.Context, bucketName string, objectsCh <-chan ObjectInfo, opts RemoveObjectsOptions) <-chan RemoveObjectError { + errorCh := make(chan RemoveObjectError, 1) + + // Validate if bucket name is valid. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + defer close(errorCh) + errorCh <- RemoveObjectError{ + Err: err, + } + return errorCh + } + // Validate objects channel to be properly allocated. + if objectsCh == nil { + defer close(errorCh) + errorCh <- RemoveObjectError{ + Err: errInvalidArgument("Objects channel cannot be nil"), + } + return errorCh + } + + go c.removeObjects(ctx, bucketName, objectsCh, errorCh, opts) + return errorCh +} + +// Generate and call MultiDelete S3 requests based on entries received from objectsCh +func (c Client) removeObjects(ctx context.Context, bucketName string, objectsCh <-chan ObjectInfo, errorCh chan<- RemoveObjectError, opts RemoveObjectsOptions) { + maxEntries := 1000 + finish := false + urlValues := make(url.Values) + urlValues.Set("delete", "") + + // Close error channel when Multi delete finishes. + defer close(errorCh) + + // Loop over entries by 1000 and call MultiDelete requests + for { + if finish { + break + } + count := 0 + var batch []ObjectInfo + + // Try to gather 1000 entries + for object := range objectsCh { + batch = append(batch, object) + if count++; count >= maxEntries { + break + } + } + if count == 0 { + // Multi Objects Delete API doesn't accept empty object list, quit immediately + break + } + if count < maxEntries { + // We didn't have 1000 entries, so this is the last batch + finish = true + } + + // Build headers. + headers := make(http.Header) + if opts.GovernanceBypass { + // Set the bypass goverenance retention header + headers.Set(amzBypassGovernance, "true") + } + + // Generate remove multi objects XML request + removeBytes := generateRemoveMultiObjectsRequest(batch) + // Execute GET on bucket to list objects. + resp, err := c.executeMethod(ctx, http.MethodPost, requestMetadata{ + bucketName: bucketName, + queryValues: urlValues, + contentBody: bytes.NewReader(removeBytes), + contentLength: int64(len(removeBytes)), + contentMD5Base64: sumMD5Base64(removeBytes), + contentSHA256Hex: sum256Hex(removeBytes), + customHeader: headers, + }) + if resp != nil { + if resp.StatusCode != http.StatusOK { + e := httpRespToErrorResponse(resp, bucketName, "") + errorCh <- RemoveObjectError{ObjectName: "", Err: e} + } + } + if err != nil { + for _, b := range batch { + errorCh <- RemoveObjectError{ + ObjectName: b.Key, + VersionID: b.VersionID, + Err: err, + } + } + continue + } + + // Process multiobjects remove xml response + processRemoveMultiObjectsResponse(resp.Body, batch, errorCh) + + closeResponse(resp) + } +} + +// RemoveIncompleteUpload aborts an partially uploaded object. +func (c Client) RemoveIncompleteUpload(ctx context.Context, bucketName, objectName string) error { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return err + } + if err := s3utils.CheckValidObjectName(objectName); err != nil { + return err + } + // Find multipart upload ids of the object to be aborted. + uploadIDs, err := c.findUploadIDs(ctx, bucketName, objectName) + if err != nil { + return err + } + + for _, uploadID := range uploadIDs { + // abort incomplete multipart upload, based on the upload id passed. + err := c.abortMultipartUpload(ctx, bucketName, objectName, uploadID) + if err != nil { + return err + } + } + + return nil +} + +// abortMultipartUpload aborts a multipart upload for the given +// uploadID, all previously uploaded parts are deleted. +func (c Client) abortMultipartUpload(ctx context.Context, bucketName, objectName, uploadID string) error { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return err + } + if err := s3utils.CheckValidObjectName(objectName); err != nil { + return err + } + + // Initialize url queries. + urlValues := make(url.Values) + urlValues.Set("uploadId", uploadID) + + // Execute DELETE on multipart upload. + resp, err := c.executeMethod(ctx, http.MethodDelete, requestMetadata{ + bucketName: bucketName, + objectName: objectName, + queryValues: urlValues, + contentSHA256Hex: emptySHA256Hex, + }) + defer closeResponse(resp) + if err != nil { + return err + } + if resp != nil { + if resp.StatusCode != http.StatusNoContent { + // Abort has no response body, handle it for any errors. + var errorResponse ErrorResponse + switch resp.StatusCode { + case http.StatusNotFound: + // This is needed specifically for abort and it cannot + // be converged into default case. + errorResponse = ErrorResponse{ + Code: "NoSuchUpload", + Message: "The specified multipart upload does not exist.", + BucketName: bucketName, + Key: objectName, + RequestID: resp.Header.Get("x-amz-request-id"), + HostID: resp.Header.Get("x-amz-id-2"), + Region: resp.Header.Get("x-amz-bucket-region"), + } + default: + return httpRespToErrorResponse(resp, bucketName, objectName) + } + return errorResponse + } + } + return nil +} diff --git a/vendor/github.com/minio/minio-go/v7/api-s3-datatypes.go b/vendor/github.com/minio/minio-go/v7/api-s3-datatypes.go new file mode 100644 index 000000000..ac3445745 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-s3-datatypes.go @@ -0,0 +1,345 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2020 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "encoding/xml" + "errors" + "io" + "reflect" + "time" +) + +// listAllMyBucketsResult container for listBuckets response. +type listAllMyBucketsResult struct { + // Container for one or more buckets. + Buckets struct { + Bucket []BucketInfo + } + Owner owner +} + +// owner container for bucket owner information. +type owner struct { + DisplayName string + ID string +} + +// CommonPrefix container for prefix response. +type CommonPrefix struct { + Prefix string +} + +// ListBucketV2Result container for listObjects response version 2. +type ListBucketV2Result struct { + // A response can contain CommonPrefixes only if you have + // specified a delimiter. + CommonPrefixes []CommonPrefix + // Metadata about each object returned. + Contents []ObjectInfo + Delimiter string + + // Encoding type used to encode object keys in the response. + EncodingType string + + // A flag that indicates whether or not ListObjects returned all of the results + // that satisfied the search criteria. + IsTruncated bool + MaxKeys int64 + Name string + + // Hold the token that will be sent in the next request to fetch the next group of keys + NextContinuationToken string + + ContinuationToken string + Prefix string + + // FetchOwner and StartAfter are currently not used + FetchOwner string + StartAfter string +} + +// Version is an element in the list object versions response +type Version struct { + ETag string + IsLatest bool + Key string + LastModified time.Time + Owner Owner + Size int64 + StorageClass string + VersionID string `xml:"VersionId"` + + isDeleteMarker bool +} + +// ListVersionsResult is an element in the list object versions response +type ListVersionsResult struct { + Versions []Version + + CommonPrefixes []CommonPrefix + Name string + Prefix string + Delimiter string + MaxKeys int64 + EncodingType string + IsTruncated bool + KeyMarker string + VersionIDMarker string + NextKeyMarker string + NextVersionIDMarker string +} + +// UnmarshalXML is a custom unmarshal code for the response of ListObjectVersions, the custom +// code will unmarshal and tags and save them in Versions field to +// preserve the lexical order of the listing. +func (l *ListVersionsResult) UnmarshalXML(d *xml.Decoder, start xml.StartElement) (err error) { + for { + // Read tokens from the XML document in a stream. + t, err := d.Token() + if err != nil { + if err == io.EOF { + break + } + return err + } + + switch se := t.(type) { + case xml.StartElement: + tagName := se.Name.Local + switch tagName { + case "Name", "Prefix", + "Delimiter", "EncodingType", + "KeyMarker", "VersionIdMarker", + "NextKeyMarker", "NextVersionIdMarker": + var s string + if err = d.DecodeElement(&s, &se); err != nil { + return err + } + v := reflect.ValueOf(l).Elem().FieldByName(tagName) + if v.IsValid() { + v.SetString(s) + } + case "IsTruncated": // bool + var b bool + if err = d.DecodeElement(&b, &se); err != nil { + return err + } + l.IsTruncated = b + case "MaxKeys": // int64 + var i int64 + if err = d.DecodeElement(&i, &se); err != nil { + return err + } + l.MaxKeys = i + case "CommonPrefixes": + var cp CommonPrefix + if err = d.DecodeElement(&cp, &se); err != nil { + return err + } + l.CommonPrefixes = append(l.CommonPrefixes, cp) + case "DeleteMarker", "Version": + var v Version + if err = d.DecodeElement(&v, &se); err != nil { + return err + } + if tagName == "DeleteMarker" { + v.isDeleteMarker = true + } + l.Versions = append(l.Versions, v) + default: + return errors.New("unrecognized option:" + tagName) + } + + } + } + return nil +} + +// ListBucketResult container for listObjects response. +type ListBucketResult struct { + // A response can contain CommonPrefixes only if you have + // specified a delimiter. + CommonPrefixes []CommonPrefix + // Metadata about each object returned. + Contents []ObjectInfo + Delimiter string + + // Encoding type used to encode object keys in the response. + EncodingType string + + // A flag that indicates whether or not ListObjects returned all of the results + // that satisfied the search criteria. + IsTruncated bool + Marker string + MaxKeys int64 + Name string + + // When response is truncated (the IsTruncated element value in + // the response is true), you can use the key name in this field + // as marker in the subsequent request to get next set of objects. + // Object storage lists objects in alphabetical order Note: This + // element is returned only if you have delimiter request + // parameter specified. If response does not include the NextMaker + // and it is truncated, you can use the value of the last Key in + // the response as the marker in the subsequent request to get the + // next set of object keys. + NextMarker string + Prefix string +} + +// ListMultipartUploadsResult container for ListMultipartUploads response +type ListMultipartUploadsResult struct { + Bucket string + KeyMarker string + UploadIDMarker string `xml:"UploadIdMarker"` + NextKeyMarker string + NextUploadIDMarker string `xml:"NextUploadIdMarker"` + EncodingType string + MaxUploads int64 + IsTruncated bool + Uploads []ObjectMultipartInfo `xml:"Upload"` + Prefix string + Delimiter string + // A response can contain CommonPrefixes only if you specify a delimiter. + CommonPrefixes []CommonPrefix +} + +// initiator container for who initiated multipart upload. +type initiator struct { + ID string + DisplayName string +} + +// copyObjectResult container for copy object response. +type copyObjectResult struct { + ETag string + LastModified time.Time // time string format "2006-01-02T15:04:05.000Z" +} + +// ObjectPart container for particular part of an object. +type ObjectPart struct { + // Part number identifies the part. + PartNumber int + + // Date and time the part was uploaded. + LastModified time.Time + + // Entity tag returned when the part was uploaded, usually md5sum + // of the part. + ETag string + + // Size of the uploaded part data. + Size int64 +} + +// ListObjectPartsResult container for ListObjectParts response. +type ListObjectPartsResult struct { + Bucket string + Key string + UploadID string `xml:"UploadId"` + + Initiator initiator + Owner owner + + StorageClass string + PartNumberMarker int + NextPartNumberMarker int + MaxParts int + + // Indicates whether the returned list of parts is truncated. + IsTruncated bool + ObjectParts []ObjectPart `xml:"Part"` + + EncodingType string +} + +// initiateMultipartUploadResult container for InitiateMultiPartUpload +// response. +type initiateMultipartUploadResult struct { + Bucket string + Key string + UploadID string `xml:"UploadId"` +} + +// completeMultipartUploadResult container for completed multipart +// upload response. +type completeMultipartUploadResult struct { + Location string + Bucket string + Key string + ETag string +} + +// CompletePart sub container lists individual part numbers and their +// md5sum, part of completeMultipartUpload. +type CompletePart struct { + XMLName xml.Name `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Part" json:"-"` + + // Part number identifies the part. + PartNumber int + ETag string +} + +// completeMultipartUpload container for completing multipart upload. +type completeMultipartUpload struct { + XMLName xml.Name `xml:"http://s3.amazonaws.com/doc/2006-03-01/ CompleteMultipartUpload" json:"-"` + Parts []CompletePart `xml:"Part"` +} + +// createBucketConfiguration container for bucket configuration. +type createBucketConfiguration struct { + XMLName xml.Name `xml:"http://s3.amazonaws.com/doc/2006-03-01/ CreateBucketConfiguration" json:"-"` + Location string `xml:"LocationConstraint"` +} + +// deleteObject container for Delete element in MultiObjects Delete XML request +type deleteObject struct { + Key string + VersionID string `xml:"VersionId,omitempty"` +} + +// deletedObject container for Deleted element in MultiObjects Delete XML response +type deletedObject struct { + Key string + VersionID string `xml:"VersionId,omitempty"` + // These fields are ignored. + DeleteMarker bool + DeleteMarkerVersionID string +} + +// nonDeletedObject container for Error element (failed deletion) in MultiObjects Delete XML response +type nonDeletedObject struct { + Key string + Code string + Message string +} + +// deletedMultiObjects container for MultiObjects Delete XML request +type deleteMultiObjects struct { + XMLName xml.Name `xml:"Delete"` + Quiet bool + Objects []deleteObject `xml:"Object"` +} + +// deletedMultiObjectsResult container for MultiObjects Delete XML response +type deleteMultiObjectsResult struct { + XMLName xml.Name `xml:"DeleteResult"` + DeletedObjects []deletedObject `xml:"Deleted"` + UnDeletedObjects []nonDeletedObject `xml:"Error"` +} diff --git a/vendor/github.com/minio/minio-go/v7/api-select.go b/vendor/github.com/minio/minio-go/v7/api-select.go new file mode 100644 index 000000000..e35cf02bf --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-select.go @@ -0,0 +1,751 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * (C) 2018-2020 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "bytes" + "context" + "encoding/binary" + "encoding/xml" + "errors" + "fmt" + "hash" + "hash/crc32" + "io" + "net/http" + "net/url" + "strings" + + "github.com/minio/minio-go/v7/pkg/encrypt" + "github.com/minio/minio-go/v7/pkg/s3utils" +) + +// CSVFileHeaderInfo - is the parameter for whether to utilize headers. +type CSVFileHeaderInfo string + +// Constants for file header info. +const ( + CSVFileHeaderInfoNone CSVFileHeaderInfo = "NONE" + CSVFileHeaderInfoIgnore = "IGNORE" + CSVFileHeaderInfoUse = "USE" +) + +// SelectCompressionType - is the parameter for what type of compression is +// present +type SelectCompressionType string + +// Constants for compression types under select API. +const ( + SelectCompressionNONE SelectCompressionType = "NONE" + SelectCompressionGZIP = "GZIP" + SelectCompressionBZIP = "BZIP2" +) + +// CSVQuoteFields - is the parameter for how CSV fields are quoted. +type CSVQuoteFields string + +// Constants for csv quote styles. +const ( + CSVQuoteFieldsAlways CSVQuoteFields = "Always" + CSVQuoteFieldsAsNeeded = "AsNeeded" +) + +// QueryExpressionType - is of what syntax the expression is, this should only +// be SQL +type QueryExpressionType string + +// Constants for expression type. +const ( + QueryExpressionTypeSQL QueryExpressionType = "SQL" +) + +// JSONType determines json input serialization type. +type JSONType string + +// Constants for JSONTypes. +const ( + JSONDocumentType JSONType = "DOCUMENT" + JSONLinesType = "LINES" +) + +// ParquetInputOptions parquet input specific options +type ParquetInputOptions struct{} + +// CSVInputOptions csv input specific options +type CSVInputOptions struct { + FileHeaderInfo CSVFileHeaderInfo + fileHeaderInfoSet bool + + RecordDelimiter string + recordDelimiterSet bool + + FieldDelimiter string + fieldDelimiterSet bool + + QuoteCharacter string + quoteCharacterSet bool + + QuoteEscapeCharacter string + quoteEscapeCharacterSet bool + + Comments string + commentsSet bool +} + +// SetFileHeaderInfo sets the file header info in the CSV input options +func (c *CSVInputOptions) SetFileHeaderInfo(val CSVFileHeaderInfo) { + c.FileHeaderInfo = val + c.fileHeaderInfoSet = true +} + +// SetRecordDelimiter sets the record delimiter in the CSV input options +func (c *CSVInputOptions) SetRecordDelimiter(val string) { + c.RecordDelimiter = val + c.recordDelimiterSet = true +} + +// SetFieldDelimiter sets the field delimiter in the CSV input options +func (c *CSVInputOptions) SetFieldDelimiter(val string) { + c.FieldDelimiter = val + c.fieldDelimiterSet = true +} + +// SetQuoteCharacter sets the quote character in the CSV input options +func (c *CSVInputOptions) SetQuoteCharacter(val string) { + c.QuoteCharacter = val + c.quoteCharacterSet = true +} + +// SetQuoteEscapeCharacter sets the quote escape character in the CSV input options +func (c *CSVInputOptions) SetQuoteEscapeCharacter(val string) { + c.QuoteEscapeCharacter = val + c.quoteEscapeCharacterSet = true +} + +// SetComments sets the comments character in the CSV input options +func (c *CSVInputOptions) SetComments(val string) { + c.Comments = val + c.commentsSet = true +} + +// MarshalXML - produces the xml representation of the CSV input options struct +func (c CSVInputOptions) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + if err := e.EncodeToken(start); err != nil { + return err + } + if c.FileHeaderInfo != "" || c.fileHeaderInfoSet { + if err := e.EncodeElement(c.FileHeaderInfo, xml.StartElement{Name: xml.Name{Local: "FileHeaderInfo"}}); err != nil { + return err + } + } + + if c.RecordDelimiter != "" || c.recordDelimiterSet { + if err := e.EncodeElement(c.RecordDelimiter, xml.StartElement{Name: xml.Name{Local: "RecordDelimiter"}}); err != nil { + return err + } + } + + if c.FieldDelimiter != "" || c.fieldDelimiterSet { + if err := e.EncodeElement(c.FieldDelimiter, xml.StartElement{Name: xml.Name{Local: "FieldDelimiter"}}); err != nil { + return err + } + } + + if c.QuoteCharacter != "" || c.quoteCharacterSet { + if err := e.EncodeElement(c.QuoteCharacter, xml.StartElement{Name: xml.Name{Local: "QuoteCharacter"}}); err != nil { + return err + } + } + + if c.QuoteEscapeCharacter != "" || c.quoteEscapeCharacterSet { + if err := e.EncodeElement(c.QuoteEscapeCharacter, xml.StartElement{Name: xml.Name{Local: "QuoteEscapeCharacter"}}); err != nil { + return err + } + } + + if c.Comments != "" || c.commentsSet { + if err := e.EncodeElement(c.Comments, xml.StartElement{Name: xml.Name{Local: "Comments"}}); err != nil { + return err + } + } + + return e.EncodeToken(xml.EndElement{Name: start.Name}) +} + +// CSVOutputOptions csv output specific options +type CSVOutputOptions struct { + QuoteFields CSVQuoteFields + quoteFieldsSet bool + + RecordDelimiter string + recordDelimiterSet bool + + FieldDelimiter string + fieldDelimiterSet bool + + QuoteCharacter string + quoteCharacterSet bool + + QuoteEscapeCharacter string + quoteEscapeCharacterSet bool +} + +// SetQuoteFields sets the quote field parameter in the CSV output options +func (c *CSVOutputOptions) SetQuoteFields(val CSVQuoteFields) { + c.QuoteFields = val + c.quoteFieldsSet = true +} + +// SetRecordDelimiter sets the record delimiter character in the CSV output options +func (c *CSVOutputOptions) SetRecordDelimiter(val string) { + c.RecordDelimiter = val + c.recordDelimiterSet = true +} + +// SetFieldDelimiter sets the field delimiter character in the CSV output options +func (c *CSVOutputOptions) SetFieldDelimiter(val string) { + c.FieldDelimiter = val + c.fieldDelimiterSet = true +} + +// SetQuoteCharacter sets the quote character in the CSV output options +func (c *CSVOutputOptions) SetQuoteCharacter(val string) { + c.QuoteCharacter = val + c.quoteCharacterSet = true +} + +// SetQuoteEscapeCharacter sets the quote escape character in the CSV output options +func (c *CSVOutputOptions) SetQuoteEscapeCharacter(val string) { + c.QuoteEscapeCharacter = val + c.quoteEscapeCharacterSet = true +} + +// MarshalXML - produces the xml representation of the CSVOutputOptions struct +func (c CSVOutputOptions) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + if err := e.EncodeToken(start); err != nil { + return err + } + + if c.QuoteFields != "" || c.quoteFieldsSet { + if err := e.EncodeElement(c.QuoteFields, xml.StartElement{Name: xml.Name{Local: "QuoteFields"}}); err != nil { + return err + } + } + + if c.RecordDelimiter != "" || c.recordDelimiterSet { + if err := e.EncodeElement(c.RecordDelimiter, xml.StartElement{Name: xml.Name{Local: "RecordDelimiter"}}); err != nil { + return err + } + } + + if c.FieldDelimiter != "" || c.fieldDelimiterSet { + if err := e.EncodeElement(c.FieldDelimiter, xml.StartElement{Name: xml.Name{Local: "FieldDelimiter"}}); err != nil { + return err + } + } + + if c.QuoteCharacter != "" || c.quoteCharacterSet { + if err := e.EncodeElement(c.QuoteCharacter, xml.StartElement{Name: xml.Name{Local: "QuoteCharacter"}}); err != nil { + return err + } + } + + if c.QuoteEscapeCharacter != "" || c.quoteEscapeCharacterSet { + if err := e.EncodeElement(c.QuoteEscapeCharacter, xml.StartElement{Name: xml.Name{Local: "QuoteEscapeCharacter"}}); err != nil { + return err + } + } + + return e.EncodeToken(xml.EndElement{Name: start.Name}) +} + +// JSONInputOptions json input specific options +type JSONInputOptions struct { + Type JSONType + typeSet bool +} + +// SetType sets the JSON type in the JSON input options +func (j *JSONInputOptions) SetType(typ JSONType) { + j.Type = typ + j.typeSet = true +} + +// MarshalXML - produces the xml representation of the JSONInputOptions struct +func (j JSONInputOptions) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + if err := e.EncodeToken(start); err != nil { + return err + } + + if j.Type != "" || j.typeSet { + if err := e.EncodeElement(j.Type, xml.StartElement{Name: xml.Name{Local: "Type"}}); err != nil { + return err + } + } + + return e.EncodeToken(xml.EndElement{Name: start.Name}) +} + +// JSONOutputOptions - json output specific options +type JSONOutputOptions struct { + RecordDelimiter string + recordDelimiterSet bool +} + +// SetRecordDelimiter sets the record delimiter in the JSON output options +func (j *JSONOutputOptions) SetRecordDelimiter(val string) { + j.RecordDelimiter = val + j.recordDelimiterSet = true +} + +// MarshalXML - produces the xml representation of the JSONOutputOptions struct +func (j JSONOutputOptions) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + if err := e.EncodeToken(start); err != nil { + return err + } + + if j.RecordDelimiter != "" || j.recordDelimiterSet { + if err := e.EncodeElement(j.RecordDelimiter, xml.StartElement{Name: xml.Name{Local: "RecordDelimiter"}}); err != nil { + return err + } + } + + return e.EncodeToken(xml.EndElement{Name: start.Name}) +} + +// SelectObjectInputSerialization - input serialization parameters +type SelectObjectInputSerialization struct { + CompressionType SelectCompressionType + Parquet *ParquetInputOptions `xml:"Parquet,omitempty"` + CSV *CSVInputOptions `xml:"CSV,omitempty"` + JSON *JSONInputOptions `xml:"JSON,omitempty"` +} + +// SelectObjectOutputSerialization - output serialization parameters. +type SelectObjectOutputSerialization struct { + CSV *CSVOutputOptions `xml:"CSV,omitempty"` + JSON *JSONOutputOptions `xml:"JSON,omitempty"` +} + +// SelectObjectOptions - represents the input select body +type SelectObjectOptions struct { + XMLName xml.Name `xml:"SelectObjectContentRequest" json:"-"` + ServerSideEncryption encrypt.ServerSide `xml:"-"` + Expression string + ExpressionType QueryExpressionType + InputSerialization SelectObjectInputSerialization + OutputSerialization SelectObjectOutputSerialization + RequestProgress struct { + Enabled bool + } +} + +// Header returns the http.Header representation of the SelectObject options. +func (o SelectObjectOptions) Header() http.Header { + headers := make(http.Header) + if o.ServerSideEncryption != nil && o.ServerSideEncryption.Type() == encrypt.SSEC { + o.ServerSideEncryption.Marshal(headers) + } + return headers +} + +// SelectObjectType - is the parameter which defines what type of object the +// operation is being performed on. +type SelectObjectType string + +// Constants for input data types. +const ( + SelectObjectTypeCSV SelectObjectType = "CSV" + SelectObjectTypeJSON = "JSON" + SelectObjectTypeParquet = "Parquet" +) + +// preludeInfo is used for keeping track of necessary information from the +// prelude. +type preludeInfo struct { + totalLen uint32 + headerLen uint32 +} + +// SelectResults is used for the streaming responses from the server. +type SelectResults struct { + pipeReader *io.PipeReader + resp *http.Response + stats *StatsMessage + progress *ProgressMessage +} + +// ProgressMessage is a struct for progress xml message. +type ProgressMessage struct { + XMLName xml.Name `xml:"Progress" json:"-"` + StatsMessage +} + +// StatsMessage is a struct for stat xml message. +type StatsMessage struct { + XMLName xml.Name `xml:"Stats" json:"-"` + BytesScanned int64 + BytesProcessed int64 + BytesReturned int64 +} + +// messageType represents the type of message. +type messageType string + +const ( + errorMsg messageType = "error" + commonMsg = "event" +) + +// eventType represents the type of event. +type eventType string + +// list of event-types returned by Select API. +const ( + endEvent eventType = "End" + recordsEvent = "Records" + progressEvent = "Progress" + statsEvent = "Stats" +) + +// contentType represents content type of event. +type contentType string + +const ( + xmlContent contentType = "text/xml" +) + +// SelectObjectContent is a implementation of http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectSELECTContent.html AWS S3 API. +func (c Client) SelectObjectContent(ctx context.Context, bucketName, objectName string, opts SelectObjectOptions) (*SelectResults, error) { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return nil, err + } + if err := s3utils.CheckValidObjectName(objectName); err != nil { + return nil, err + } + + selectReqBytes, err := xml.Marshal(opts) + if err != nil { + return nil, err + } + + urlValues := make(url.Values) + urlValues.Set("select", "") + urlValues.Set("select-type", "2") + + // Execute POST on bucket/object. + resp, err := c.executeMethod(ctx, http.MethodPost, requestMetadata{ + bucketName: bucketName, + objectName: objectName, + queryValues: urlValues, + customHeader: opts.Header(), + contentMD5Base64: sumMD5Base64(selectReqBytes), + contentSHA256Hex: sum256Hex(selectReqBytes), + contentBody: bytes.NewReader(selectReqBytes), + contentLength: int64(len(selectReqBytes)), + }) + if err != nil { + return nil, err + } + + return NewSelectResults(resp, bucketName) +} + +// NewSelectResults creates a Select Result parser that parses the response +// and returns a Reader that will return parsed and assembled select output. +func NewSelectResults(resp *http.Response, bucketName string) (*SelectResults, error) { + if resp.StatusCode != http.StatusOK { + return nil, httpRespToErrorResponse(resp, bucketName, "") + } + + pipeReader, pipeWriter := io.Pipe() + streamer := &SelectResults{ + resp: resp, + stats: &StatsMessage{}, + progress: &ProgressMessage{}, + pipeReader: pipeReader, + } + streamer.start(pipeWriter) + return streamer, nil +} + +// Close - closes the underlying response body and the stream reader. +func (s *SelectResults) Close() error { + defer closeResponse(s.resp) + return s.pipeReader.Close() +} + +// Read - is a reader compatible implementation for SelectObjectContent records. +func (s *SelectResults) Read(b []byte) (n int, err error) { + return s.pipeReader.Read(b) +} + +// Stats - information about a request's stats when processing is complete. +func (s *SelectResults) Stats() *StatsMessage { + return s.stats +} + +// Progress - information about the progress of a request. +func (s *SelectResults) Progress() *ProgressMessage { + return s.progress +} + +// start is the main function that decodes the large byte array into +// several events that are sent through the eventstream. +func (s *SelectResults) start(pipeWriter *io.PipeWriter) { + go func() { + for { + var prelude preludeInfo + var headers = make(http.Header) + var err error + + // Create CRC code + crc := crc32.New(crc32.IEEETable) + crcReader := io.TeeReader(s.resp.Body, crc) + + // Extract the prelude(12 bytes) into a struct to extract relevant information. + prelude, err = processPrelude(crcReader, crc) + if err != nil { + pipeWriter.CloseWithError(err) + closeResponse(s.resp) + return + } + + // Extract the headers(variable bytes) into a struct to extract relevant information + if prelude.headerLen > 0 { + if err = extractHeader(io.LimitReader(crcReader, int64(prelude.headerLen)), headers); err != nil { + pipeWriter.CloseWithError(err) + closeResponse(s.resp) + return + } + } + + // Get the actual payload length so that the appropriate amount of + // bytes can be read or parsed. + payloadLen := prelude.PayloadLen() + + m := messageType(headers.Get("message-type")) + + switch m { + case errorMsg: + pipeWriter.CloseWithError(errors.New(headers.Get("error-code") + ":\"" + headers.Get("error-message") + "\"")) + closeResponse(s.resp) + return + case commonMsg: + // Get content-type of the payload. + c := contentType(headers.Get("content-type")) + + // Get event type of the payload. + e := eventType(headers.Get("event-type")) + + // Handle all supported events. + switch e { + case endEvent: + pipeWriter.Close() + closeResponse(s.resp) + return + case recordsEvent: + if _, err = io.Copy(pipeWriter, io.LimitReader(crcReader, payloadLen)); err != nil { + pipeWriter.CloseWithError(err) + closeResponse(s.resp) + return + } + case progressEvent: + switch c { + case xmlContent: + if err = xmlDecoder(io.LimitReader(crcReader, payloadLen), s.progress); err != nil { + pipeWriter.CloseWithError(err) + closeResponse(s.resp) + return + } + default: + pipeWriter.CloseWithError(fmt.Errorf("Unexpected content-type %s sent for event-type %s", c, progressEvent)) + closeResponse(s.resp) + return + } + case statsEvent: + switch c { + case xmlContent: + if err = xmlDecoder(io.LimitReader(crcReader, payloadLen), s.stats); err != nil { + pipeWriter.CloseWithError(err) + closeResponse(s.resp) + return + } + default: + pipeWriter.CloseWithError(fmt.Errorf("Unexpected content-type %s sent for event-type %s", c, statsEvent)) + closeResponse(s.resp) + return + } + } + } + + // Ensures that the full message's CRC is correct and + // that the message is not corrupted + if err := checkCRC(s.resp.Body, crc.Sum32()); err != nil { + pipeWriter.CloseWithError(err) + closeResponse(s.resp) + return + } + + } + }() +} + +// PayloadLen is a function that calculates the length of the payload. +func (p preludeInfo) PayloadLen() int64 { + return int64(p.totalLen - p.headerLen - 16) +} + +// processPrelude is the function that reads the 12 bytes of the prelude and +// ensures the CRC is correct while also extracting relevant information into +// the struct, +func processPrelude(prelude io.Reader, crc hash.Hash32) (preludeInfo, error) { + var err error + var pInfo = preludeInfo{} + + // reads total length of the message (first 4 bytes) + pInfo.totalLen, err = extractUint32(prelude) + if err != nil { + return pInfo, err + } + + // reads total header length of the message (2nd 4 bytes) + pInfo.headerLen, err = extractUint32(prelude) + if err != nil { + return pInfo, err + } + + // checks that the CRC is correct (3rd 4 bytes) + preCRC := crc.Sum32() + if err := checkCRC(prelude, preCRC); err != nil { + return pInfo, err + } + + return pInfo, nil +} + +// extracts the relevant information from the Headers. +func extractHeader(body io.Reader, myHeaders http.Header) error { + for { + // extracts the first part of the header, + headerTypeName, err := extractHeaderType(body) + if err != nil { + // Since end of file, we have read all of our headers + if err == io.EOF { + break + } + return err + } + + // reads the 7 present in the header and ignores it. + extractUint8(body) + + headerValueName, err := extractHeaderValue(body) + if err != nil { + return err + } + + myHeaders.Set(headerTypeName, headerValueName) + + } + return nil +} + +// extractHeaderType extracts the first half of the header message, the header type. +func extractHeaderType(body io.Reader) (string, error) { + // extracts 2 bit integer + headerNameLen, err := extractUint8(body) + if err != nil { + return "", err + } + // extracts the string with the appropriate number of bytes + headerName, err := extractString(body, int(headerNameLen)) + if err != nil { + return "", err + } + return strings.TrimPrefix(headerName, ":"), nil +} + +// extractsHeaderValue extracts the second half of the header message, the +// header value +func extractHeaderValue(body io.Reader) (string, error) { + bodyLen, err := extractUint16(body) + if err != nil { + return "", err + } + bodyName, err := extractString(body, int(bodyLen)) + if err != nil { + return "", err + } + return bodyName, nil +} + +// extracts a string from byte array of a particular number of bytes. +func extractString(source io.Reader, lenBytes int) (string, error) { + myVal := make([]byte, lenBytes) + _, err := source.Read(myVal) + if err != nil { + return "", err + } + return string(myVal), nil +} + +// extractUint32 extracts a 4 byte integer from the byte array. +func extractUint32(r io.Reader) (uint32, error) { + buf := make([]byte, 4) + _, err := readFull(r, buf) + if err != nil { + return 0, err + } + return binary.BigEndian.Uint32(buf), nil +} + +// extractUint16 extracts a 2 byte integer from the byte array. +func extractUint16(r io.Reader) (uint16, error) { + buf := make([]byte, 2) + _, err := readFull(r, buf) + if err != nil { + return 0, err + } + return binary.BigEndian.Uint16(buf), nil +} + +// extractUint8 extracts a 1 byte integer from the byte array. +func extractUint8(r io.Reader) (uint8, error) { + buf := make([]byte, 1) + _, err := readFull(r, buf) + if err != nil { + return 0, err + } + return buf[0], nil +} + +// checkCRC ensures that the CRC matches with the one from the reader. +func checkCRC(r io.Reader, expect uint32) error { + msgCRC, err := extractUint32(r) + if err != nil { + return err + } + + if msgCRC != expect { + return fmt.Errorf("Checksum Mismatch, MessageCRC of 0x%X does not equal expected CRC of 0x%X", msgCRC, expect) + + } + return nil +} diff --git a/vendor/github.com/minio/minio-go/v7/api-stat.go b/vendor/github.com/minio/minio-go/v7/api-stat.go new file mode 100644 index 000000000..ea9c30970 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api-stat.go @@ -0,0 +1,106 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2020 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "context" + "net/http" + "net/url" + + "github.com/minio/minio-go/v7/pkg/s3utils" +) + +// BucketExists verifies if bucket exists and you have permission to access it. Allows for a Context to +// control cancellations and timeouts. +func (c Client) BucketExists(ctx context.Context, bucketName string) (bool, error) { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return false, err + } + + // Execute HEAD on bucketName. + resp, err := c.executeMethod(ctx, http.MethodHead, requestMetadata{ + bucketName: bucketName, + contentSHA256Hex: emptySHA256Hex, + }) + defer closeResponse(resp) + if err != nil { + if ToErrorResponse(err).Code == "NoSuchBucket" { + return false, nil + } + return false, err + } + if resp != nil { + resperr := httpRespToErrorResponse(resp, bucketName, "") + if ToErrorResponse(resperr).Code == "NoSuchBucket" { + return false, nil + } + if resp.StatusCode != http.StatusOK { + return false, httpRespToErrorResponse(resp, bucketName, "") + } + } + return true, nil +} + +// StatObject verifies if object exists and you have permission to access. +func (c Client) StatObject(ctx context.Context, bucketName, objectName string, opts StatObjectOptions) (ObjectInfo, error) { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return ObjectInfo{}, err + } + if err := s3utils.CheckValidObjectName(objectName); err != nil { + return ObjectInfo{}, err + } + return c.statObject(ctx, bucketName, objectName, opts) +} + +// Lower level API for statObject supporting pre-conditions and range headers. +func (c Client) statObject(ctx context.Context, bucketName, objectName string, opts StatObjectOptions) (ObjectInfo, error) { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return ObjectInfo{}, err + } + if err := s3utils.CheckValidObjectName(objectName); err != nil { + return ObjectInfo{}, err + } + + urlValues := make(url.Values) + if opts.VersionID != "" { + urlValues.Set("versionId", opts.VersionID) + } + + // Execute HEAD on objectName. + resp, err := c.executeMethod(ctx, http.MethodHead, requestMetadata{ + bucketName: bucketName, + objectName: objectName, + queryValues: urlValues, + contentSHA256Hex: emptySHA256Hex, + customHeader: opts.Header(), + }) + defer closeResponse(resp) + if err != nil { + return ObjectInfo{}, err + } + if resp != nil { + if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusPartialContent { + return ObjectInfo{}, httpRespToErrorResponse(resp, bucketName, objectName) + } + } + + return ToObjectInfo(bucketName, objectName, resp.Header) +} diff --git a/vendor/github.com/minio/minio-go/v7/api.go b/vendor/github.com/minio/minio-go/v7/api.go new file mode 100644 index 000000000..e36c79660 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/api.go @@ -0,0 +1,899 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2018 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "bytes" + "context" + "errors" + "fmt" + "io" + "io/ioutil" + "math/rand" + "net" + "net/http" + "net/http/cookiejar" + "net/http/httputil" + "net/url" + "os" + "runtime" + "strings" + "sync" + "time" + + md5simd "github.com/minio/md5-simd" + "github.com/minio/minio-go/v7/pkg/credentials" + "github.com/minio/minio-go/v7/pkg/s3utils" + "github.com/minio/minio-go/v7/pkg/signer" + "golang.org/x/net/publicsuffix" +) + +// Client implements Amazon S3 compatible methods. +type Client struct { + /// Standard options. + + // Parsed endpoint url provided by the user. + endpointURL *url.URL + + // Holds various credential providers. + credsProvider *credentials.Credentials + + // Custom signerType value overrides all credentials. + overrideSignerType credentials.SignatureType + + // User supplied. + appInfo struct { + appName string + appVersion string + } + + // Indicate whether we are using https or not + secure bool + + // Needs allocation. + httpClient *http.Client + bucketLocCache *bucketLocationCache + + // Advanced functionality. + isTraceEnabled bool + traceErrorsOnly bool + traceOutput io.Writer + + // S3 specific accelerated endpoint. + s3AccelerateEndpoint string + + // Region endpoint + region string + + // Random seed. + random *rand.Rand + + // lookup indicates type of url lookup supported by server. If not specified, + // default to Auto. + lookup BucketLookupType + + // Factory for MD5 hash functions. + md5Hasher func() md5simd.Hasher + sha256Hasher func() md5simd.Hasher +} + +// Options for New method +type Options struct { + Creds *credentials.Credentials + Secure bool + Transport http.RoundTripper + Region string + BucketLookup BucketLookupType + + // Custom hash routines. Leave nil to use standard. + CustomMD5 func() md5simd.Hasher + CustomSHA256 func() md5simd.Hasher +} + +// Global constants. +const ( + libraryName = "minio-go" + libraryVersion = "v7.0.5" +) + +// User Agent should always following the below style. +// Please open an issue to discuss any new changes here. +// +// MinIO (OS; ARCH) LIB/VER APP/VER +const ( + libraryUserAgentPrefix = "MinIO (" + runtime.GOOS + "; " + runtime.GOARCH + ") " + libraryUserAgent = libraryUserAgentPrefix + libraryName + "/" + libraryVersion +) + +// BucketLookupType is type of url lookup supported by server. +type BucketLookupType int + +// Different types of url lookup supported by the server.Initialized to BucketLookupAuto +const ( + BucketLookupAuto BucketLookupType = iota + BucketLookupDNS + BucketLookupPath +) + +// New - instantiate minio client with options +func New(endpoint string, opts *Options) (*Client, error) { + if opts == nil { + return nil, errors.New("no options provided") + } + clnt, err := privateNew(endpoint, opts) + if err != nil { + return nil, err + } + // Google cloud storage should be set to signature V2, force it if not. + if s3utils.IsGoogleEndpoint(*clnt.endpointURL) { + clnt.overrideSignerType = credentials.SignatureV2 + } + // If Amazon S3 set to signature v4. + if s3utils.IsAmazonEndpoint(*clnt.endpointURL) { + clnt.overrideSignerType = credentials.SignatureV4 + } + + return clnt, nil +} + +// EndpointURL returns the URL of the S3 endpoint. +func (c *Client) EndpointURL() *url.URL { + endpoint := *c.endpointURL // copy to prevent callers from modifying internal state + return &endpoint +} + +// lockedRandSource provides protected rand source, implements rand.Source interface. +type lockedRandSource struct { + lk sync.Mutex + src rand.Source +} + +// Int63 returns a non-negative pseudo-random 63-bit integer as an int64. +func (r *lockedRandSource) Int63() (n int64) { + r.lk.Lock() + n = r.src.Int63() + r.lk.Unlock() + return +} + +// Seed uses the provided seed value to initialize the generator to a +// deterministic state. +func (r *lockedRandSource) Seed(seed int64) { + r.lk.Lock() + r.src.Seed(seed) + r.lk.Unlock() +} + +// Redirect requests by re signing the request. +func (c *Client) redirectHeaders(req *http.Request, via []*http.Request) error { + if len(via) >= 5 { + return errors.New("stopped after 5 redirects") + } + if len(via) == 0 { + return nil + } + lastRequest := via[len(via)-1] + var reAuth bool + for attr, val := range lastRequest.Header { + // if hosts do not match do not copy Authorization header + if attr == "Authorization" && req.Host != lastRequest.Host { + reAuth = true + continue + } + if _, ok := req.Header[attr]; !ok { + req.Header[attr] = val + } + } + + *c.endpointURL = *req.URL + + value, err := c.credsProvider.Get() + if err != nil { + return err + } + var ( + signerType = value.SignerType + accessKeyID = value.AccessKeyID + secretAccessKey = value.SecretAccessKey + sessionToken = value.SessionToken + region = c.region + ) + + // Custom signer set then override the behavior. + if c.overrideSignerType != credentials.SignatureDefault { + signerType = c.overrideSignerType + } + + // If signerType returned by credentials helper is anonymous, + // then do not sign regardless of signerType override. + if value.SignerType == credentials.SignatureAnonymous { + signerType = credentials.SignatureAnonymous + } + + if reAuth { + // Check if there is no region override, if not get it from the URL if possible. + if region == "" { + region = s3utils.GetRegionFromURL(*c.endpointURL) + } + switch { + case signerType.IsV2(): + return errors.New("signature V2 cannot support redirection") + case signerType.IsV4(): + signer.SignV4(*req, accessKeyID, secretAccessKey, sessionToken, getDefaultLocation(*c.endpointURL, region)) + } + } + return nil +} + +func privateNew(endpoint string, opts *Options) (*Client, error) { + // construct endpoint. + endpointURL, err := getEndpointURL(endpoint, opts.Secure) + if err != nil { + return nil, err + } + + // Initialize cookies to preserve server sent cookies if any and replay + // them upon each request. + jar, err := cookiejar.New(&cookiejar.Options{PublicSuffixList: publicsuffix.List}) + if err != nil { + return nil, err + } + + // instantiate new Client. + clnt := new(Client) + + // Save the credentials. + clnt.credsProvider = opts.Creds + + // Remember whether we are using https or not + clnt.secure = opts.Secure + + // Save endpoint URL, user agent for future uses. + clnt.endpointURL = endpointURL + + transport := opts.Transport + if transport == nil { + transport, err = DefaultTransport(opts.Secure) + if err != nil { + return nil, err + } + } + + // Instantiate http client and bucket location cache. + clnt.httpClient = &http.Client{ + Jar: jar, + Transport: transport, + CheckRedirect: clnt.redirectHeaders, + } + + // Sets custom region, if region is empty bucket location cache is used automatically. + if opts.Region == "" { + opts.Region = s3utils.GetRegionFromURL(*clnt.endpointURL) + } + clnt.region = opts.Region + + // Instantiate bucket location cache. + clnt.bucketLocCache = newBucketLocationCache() + + // Introduce a new locked random seed. + clnt.random = rand.New(&lockedRandSource{src: rand.NewSource(time.Now().UTC().UnixNano())}) + + // Add default md5 hasher. + clnt.md5Hasher = opts.CustomMD5 + clnt.sha256Hasher = opts.CustomSHA256 + if clnt.md5Hasher == nil { + clnt.md5Hasher = newMd5Hasher + } + if clnt.sha256Hasher == nil { + clnt.sha256Hasher = newSHA256Hasher + } + // Sets bucket lookup style, whether server accepts DNS or Path lookup. Default is Auto - determined + // by the SDK. When Auto is specified, DNS lookup is used for Amazon/Google cloud endpoints and Path for all other endpoints. + clnt.lookup = opts.BucketLookup + // Return. + return clnt, nil +} + +// SetAppInfo - add application details to user agent. +func (c *Client) SetAppInfo(appName string, appVersion string) { + // if app name and version not set, we do not set a new user agent. + if appName != "" && appVersion != "" { + c.appInfo.appName = appName + c.appInfo.appVersion = appVersion + } +} + +// TraceOn - enable HTTP tracing. +func (c *Client) TraceOn(outputStream io.Writer) { + // if outputStream is nil then default to os.Stdout. + if outputStream == nil { + outputStream = os.Stdout + } + // Sets a new output stream. + c.traceOutput = outputStream + + // Enable tracing. + c.isTraceEnabled = true +} + +// TraceErrorsOnlyOn - same as TraceOn, but only errors will be traced. +func (c *Client) TraceErrorsOnlyOn(outputStream io.Writer) { + c.TraceOn(outputStream) + c.traceErrorsOnly = true +} + +// TraceErrorsOnlyOff - Turns off the errors only tracing and everything will be traced after this call. +// If all tracing needs to be turned off, call TraceOff(). +func (c *Client) TraceErrorsOnlyOff() { + c.traceErrorsOnly = false +} + +// TraceOff - disable HTTP tracing. +func (c *Client) TraceOff() { + // Disable tracing. + c.isTraceEnabled = false + c.traceErrorsOnly = false +} + +// SetS3TransferAccelerate - turns s3 accelerated endpoint on or off for all your +// requests. This feature is only specific to S3 for all other endpoints this +// function does nothing. To read further details on s3 transfer acceleration +// please vist - +// http://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html +func (c *Client) SetS3TransferAccelerate(accelerateEndpoint string) { + if s3utils.IsAmazonEndpoint(*c.endpointURL) { + c.s3AccelerateEndpoint = accelerateEndpoint + } +} + +// Hash materials provides relevant initialized hash algo writers +// based on the expected signature type. +// +// - For signature v4 request if the connection is insecure compute only sha256. +// - For signature v4 request if the connection is secure compute only md5. +// - For anonymous request compute md5. +func (c *Client) hashMaterials(isMd5Requested bool) (hashAlgos map[string]md5simd.Hasher, hashSums map[string][]byte) { + hashSums = make(map[string][]byte) + hashAlgos = make(map[string]md5simd.Hasher) + if c.overrideSignerType.IsV4() { + if c.secure { + hashAlgos["md5"] = c.md5Hasher() + } else { + hashAlgos["sha256"] = c.sha256Hasher() + } + } else { + if c.overrideSignerType.IsAnonymous() { + hashAlgos["md5"] = c.md5Hasher() + } + } + if isMd5Requested { + hashAlgos["md5"] = c.md5Hasher() + } + return hashAlgos, hashSums +} + +// requestMetadata - is container for all the values to make a request. +type requestMetadata struct { + // If set newRequest presigns the URL. + presignURL bool + + // User supplied. + bucketName string + objectName string + queryValues url.Values + customHeader http.Header + expires int64 + + // Generated by our internal code. + bucketLocation string + contentBody io.Reader + contentLength int64 + contentMD5Base64 string // carries base64 encoded md5sum + contentSHA256Hex string // carries hex encoded sha256sum +} + +// dumpHTTP - dump HTTP request and response. +func (c Client) dumpHTTP(req *http.Request, resp *http.Response) error { + // Starts http dump. + _, err := fmt.Fprintln(c.traceOutput, "---------START-HTTP---------") + if err != nil { + return err + } + + // Filter out Signature field from Authorization header. + origAuth := req.Header.Get("Authorization") + if origAuth != "" { + req.Header.Set("Authorization", redactSignature(origAuth)) + } + + // Only display request header. + reqTrace, err := httputil.DumpRequestOut(req, false) + if err != nil { + return err + } + + // Write request to trace output. + _, err = fmt.Fprint(c.traceOutput, string(reqTrace)) + if err != nil { + return err + } + + // Only display response header. + var respTrace []byte + + // For errors we make sure to dump response body as well. + if resp.StatusCode != http.StatusOK && + resp.StatusCode != http.StatusPartialContent && + resp.StatusCode != http.StatusNoContent { + respTrace, err = httputil.DumpResponse(resp, true) + if err != nil { + return err + } + } else { + respTrace, err = httputil.DumpResponse(resp, false) + if err != nil { + return err + } + } + + // Write response to trace output. + _, err = fmt.Fprint(c.traceOutput, strings.TrimSuffix(string(respTrace), "\r\n")) + if err != nil { + return err + } + + // Ends the http dump. + _, err = fmt.Fprintln(c.traceOutput, "---------END-HTTP---------") + if err != nil { + return err + } + + // Returns success. + return nil +} + +// do - execute http request. +func (c Client) do(req *http.Request) (*http.Response, error) { + resp, err := c.httpClient.Do(req) + if err != nil { + // Handle this specifically for now until future Golang versions fix this issue properly. + if urlErr, ok := err.(*url.Error); ok { + if strings.Contains(urlErr.Err.Error(), "EOF") { + return nil, &url.Error{ + Op: urlErr.Op, + URL: urlErr.URL, + Err: errors.New("Connection closed by foreign host " + urlErr.URL + ". Retry again."), + } + } + } + return nil, err + } + + // Response cannot be non-nil, report error if thats the case. + if resp == nil { + msg := "Response is empty. " + reportIssue + return nil, errInvalidArgument(msg) + } + + // If trace is enabled, dump http request and response, + // except when the traceErrorsOnly enabled and the response's status code is ok + if c.isTraceEnabled && !(c.traceErrorsOnly && resp.StatusCode == http.StatusOK) { + err = c.dumpHTTP(req, resp) + if err != nil { + return nil, err + } + } + + return resp, nil +} + +// List of success status. +var successStatus = []int{ + http.StatusOK, + http.StatusNoContent, + http.StatusPartialContent, +} + +// executeMethod - instantiates a given method, and retries the +// request upon any error up to maxRetries attempts in a binomially +// delayed manner using a standard back off algorithm. +func (c Client) executeMethod(ctx context.Context, method string, metadata requestMetadata) (res *http.Response, err error) { + var retryable bool // Indicates if request can be retried. + var bodySeeker io.Seeker // Extracted seeker from io.Reader. + var reqRetry = MaxRetry // Indicates how many times we can retry the request + + if metadata.contentBody != nil { + // Check if body is seekable then it is retryable. + bodySeeker, retryable = metadata.contentBody.(io.Seeker) + switch bodySeeker { + case os.Stdin, os.Stdout, os.Stderr: + retryable = false + } + // Retry only when reader is seekable + if !retryable { + reqRetry = 1 + } + + // Figure out if the body can be closed - if yes + // we will definitely close it upon the function + // return. + bodyCloser, ok := metadata.contentBody.(io.Closer) + if ok { + defer bodyCloser.Close() + } + } + + // Create cancel context to control 'newRetryTimer' go routine. + retryCtx, cancel := context.WithCancel(ctx) + + // Indicate to our routine to exit cleanly upon return. + defer cancel() + + // Blank indentifier is kept here on purpose since 'range' without + // blank identifiers is only supported since go1.4 + // https://golang.org/doc/go1.4#forrange. + for range c.newRetryTimer(retryCtx, reqRetry, DefaultRetryUnit, DefaultRetryCap, MaxJitter) { + // Retry executes the following function body if request has an + // error until maxRetries have been exhausted, retry attempts are + // performed after waiting for a given period of time in a + // binomial fashion. + if retryable { + // Seek back to beginning for each attempt. + if _, err = bodySeeker.Seek(0, 0); err != nil { + // If seek failed, no need to retry. + return nil, err + } + } + + // Instantiate a new request. + var req *http.Request + req, err = c.newRequest(ctx, method, metadata) + if err != nil { + errResponse := ToErrorResponse(err) + if isS3CodeRetryable(errResponse.Code) { + continue // Retry. + } + return nil, err + } + + // Initiate the request. + res, err = c.do(req) + if err != nil { + if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) { + return nil, err + } + + // Retry the request + continue + } + + // For any known successful http status, return quickly. + for _, httpStatus := range successStatus { + if httpStatus == res.StatusCode { + return res, nil + } + } + + // Read the body to be saved later. + errBodyBytes, err := ioutil.ReadAll(res.Body) + // res.Body should be closed + closeResponse(res) + if err != nil { + return nil, err + } + + // Save the body. + errBodySeeker := bytes.NewReader(errBodyBytes) + res.Body = ioutil.NopCloser(errBodySeeker) + + // For errors verify if its retryable otherwise fail quickly. + errResponse := ToErrorResponse(httpRespToErrorResponse(res, metadata.bucketName, metadata.objectName)) + + // Save the body back again. + errBodySeeker.Seek(0, 0) // Seek back to starting point. + res.Body = ioutil.NopCloser(errBodySeeker) + + // Bucket region if set in error response and the error + // code dictates invalid region, we can retry the request + // with the new region. + // + // Additionally we should only retry if bucketLocation and custom + // region is empty. + if c.region == "" { + switch errResponse.Code { + case "AuthorizationHeaderMalformed": + fallthrough + case "InvalidRegion": + fallthrough + case "AccessDenied": + if errResponse.Region == "" { + // Region is empty we simply return the error. + return res, err + } + // Region is not empty figure out a way to + // handle this appropriately. + if metadata.bucketName != "" { + // Gather Cached location only if bucketName is present. + if location, cachedOk := c.bucketLocCache.Get(metadata.bucketName); cachedOk && location != errResponse.Region { + c.bucketLocCache.Set(metadata.bucketName, errResponse.Region) + continue // Retry. + } + } else { + // This is for ListBuckets() fallback. + if errResponse.Region != metadata.bucketLocation { + // Retry if the error response has a different region + // than the request we just made. + metadata.bucketLocation = errResponse.Region + continue // Retry + } + } + } + } + + // Verify if error response code is retryable. + if isS3CodeRetryable(errResponse.Code) { + continue // Retry. + } + + // Verify if http status code is retryable. + if isHTTPStatusRetryable(res.StatusCode) { + continue // Retry. + } + + // For all other cases break out of the retry loop. + break + } + + // Return an error when retry is canceled or deadlined + if e := retryCtx.Err(); e != nil { + return nil, e + } + + return res, err +} + +// newRequest - instantiate a new HTTP request for a given method. +func (c Client) newRequest(ctx context.Context, method string, metadata requestMetadata) (req *http.Request, err error) { + // If no method is supplied default to 'POST'. + if method == "" { + method = http.MethodPost + } + + location := metadata.bucketLocation + if location == "" { + if metadata.bucketName != "" { + // Gather location only if bucketName is present. + location, err = c.getBucketLocation(ctx, metadata.bucketName) + if err != nil { + return nil, err + } + } + if location == "" { + location = getDefaultLocation(*c.endpointURL, c.region) + } + } + + // Look if target url supports virtual host. + // We explicitly disallow MakeBucket calls to not use virtual DNS style, + // since the resolution may fail. + isMakeBucket := (metadata.objectName == "" && method == http.MethodPut && len(metadata.queryValues) == 0) + isVirtualHost := c.isVirtualHostStyleRequest(*c.endpointURL, metadata.bucketName) && !isMakeBucket + + // Construct a new target URL. + targetURL, err := c.makeTargetURL(metadata.bucketName, metadata.objectName, location, + isVirtualHost, metadata.queryValues) + if err != nil { + return nil, err + } + + // Initialize a new HTTP request for the method. + req, err = http.NewRequestWithContext(ctx, method, targetURL.String(), nil) + if err != nil { + return nil, err + } + + // Get credentials from the configured credentials provider. + value, err := c.credsProvider.Get() + if err != nil { + return nil, err + } + + var ( + signerType = value.SignerType + accessKeyID = value.AccessKeyID + secretAccessKey = value.SecretAccessKey + sessionToken = value.SessionToken + ) + + // Custom signer set then override the behavior. + if c.overrideSignerType != credentials.SignatureDefault { + signerType = c.overrideSignerType + } + + // If signerType returned by credentials helper is anonymous, + // then do not sign regardless of signerType override. + if value.SignerType == credentials.SignatureAnonymous { + signerType = credentials.SignatureAnonymous + } + + // Generate presign url if needed, return right here. + if metadata.expires != 0 && metadata.presignURL { + if signerType.IsAnonymous() { + return nil, errInvalidArgument("Presigned URLs cannot be generated with anonymous credentials.") + } + if signerType.IsV2() { + // Presign URL with signature v2. + req = signer.PreSignV2(*req, accessKeyID, secretAccessKey, metadata.expires, isVirtualHost) + } else if signerType.IsV4() { + // Presign URL with signature v4. + req = signer.PreSignV4(*req, accessKeyID, secretAccessKey, sessionToken, location, metadata.expires) + } + return req, nil + } + + // Set 'User-Agent' header for the request. + c.setUserAgent(req) + + // Set all headers. + for k, v := range metadata.customHeader { + req.Header.Set(k, v[0]) + } + + // Go net/http notoriously closes the request body. + // - The request Body, if non-nil, will be closed by the underlying Transport, even on errors. + // This can cause underlying *os.File seekers to fail, avoid that + // by making sure to wrap the closer as a nop. + if metadata.contentLength == 0 { + req.Body = nil + } else { + req.Body = ioutil.NopCloser(metadata.contentBody) + } + + // Set incoming content-length. + req.ContentLength = metadata.contentLength + if req.ContentLength <= -1 { + // For unknown content length, we upload using transfer-encoding: chunked. + req.TransferEncoding = []string{"chunked"} + } + + // set md5Sum for content protection. + if len(metadata.contentMD5Base64) > 0 { + req.Header.Set("Content-Md5", metadata.contentMD5Base64) + } + + // For anonymous requests just return. + if signerType.IsAnonymous() { + return req, nil + } + + switch { + case signerType.IsV2(): + // Add signature version '2' authorization header. + req = signer.SignV2(*req, accessKeyID, secretAccessKey, isVirtualHost) + case metadata.objectName != "" && metadata.queryValues == nil && method == http.MethodPut && metadata.customHeader.Get("X-Amz-Copy-Source") == "" && !c.secure: + // Streaming signature is used by default for a PUT object request. Additionally we also + // look if the initialized client is secure, if yes then we don't need to perform + // streaming signature. + req = signer.StreamingSignV4(req, accessKeyID, + secretAccessKey, sessionToken, location, metadata.contentLength, time.Now().UTC()) + default: + // Set sha256 sum for signature calculation only with signature version '4'. + shaHeader := unsignedPayload + if metadata.contentSHA256Hex != "" { + shaHeader = metadata.contentSHA256Hex + } + req.Header.Set("X-Amz-Content-Sha256", shaHeader) + + // Add signature version '4' authorization header. + req = signer.SignV4(*req, accessKeyID, secretAccessKey, sessionToken, location) + } + + // Return request. + return req, nil +} + +// set User agent. +func (c Client) setUserAgent(req *http.Request) { + req.Header.Set("User-Agent", libraryUserAgent) + if c.appInfo.appName != "" && c.appInfo.appVersion != "" { + req.Header.Set("User-Agent", libraryUserAgent+" "+c.appInfo.appName+"/"+c.appInfo.appVersion) + } +} + +// makeTargetURL make a new target url. +func (c Client) makeTargetURL(bucketName, objectName, bucketLocation string, isVirtualHostStyle bool, queryValues url.Values) (*url.URL, error) { + host := c.endpointURL.Host + // For Amazon S3 endpoint, try to fetch location based endpoint. + if s3utils.IsAmazonEndpoint(*c.endpointURL) { + if c.s3AccelerateEndpoint != "" && bucketName != "" { + // http://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html + // Disable transfer acceleration for non-compliant bucket names. + if strings.Contains(bucketName, ".") { + return nil, errTransferAccelerationBucket(bucketName) + } + // If transfer acceleration is requested set new host. + // For more details about enabling transfer acceleration read here. + // http://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html + host = c.s3AccelerateEndpoint + } else { + // Do not change the host if the endpoint URL is a FIPS S3 endpoint. + if !s3utils.IsAmazonFIPSEndpoint(*c.endpointURL) { + // Fetch new host based on the bucket location. + host = getS3Endpoint(bucketLocation) + } + } + } + + // Save scheme. + scheme := c.endpointURL.Scheme + + // Strip port 80 and 443 so we won't send these ports in Host header. + // The reason is that browsers and curl automatically remove :80 and :443 + // with the generated presigned urls, then a signature mismatch error. + if h, p, err := net.SplitHostPort(host); err == nil { + if scheme == "http" && p == "80" || scheme == "https" && p == "443" { + host = h + } + } + + urlStr := scheme + "://" + host + "/" + // Make URL only if bucketName is available, otherwise use the + // endpoint URL. + if bucketName != "" { + // If endpoint supports virtual host style use that always. + // Currently only S3 and Google Cloud Storage would support + // virtual host style. + if isVirtualHostStyle { + urlStr = scheme + "://" + bucketName + "." + host + "/" + if objectName != "" { + urlStr = urlStr + s3utils.EncodePath(objectName) + } + } else { + // If not fall back to using path style. + urlStr = urlStr + bucketName + "/" + if objectName != "" { + urlStr = urlStr + s3utils.EncodePath(objectName) + } + } + } + + // If there are any query values, add them to the end. + if len(queryValues) > 0 { + urlStr = urlStr + "?" + s3utils.QueryEncode(queryValues) + } + + return url.Parse(urlStr) +} + +// returns true if virtual hosted style requests are to be used. +func (c *Client) isVirtualHostStyleRequest(url url.URL, bucketName string) bool { + if bucketName == "" { + return false + } + + if c.lookup == BucketLookupDNS { + return true + } + if c.lookup == BucketLookupPath { + return false + } + + // default to virtual only for Amazon/Google storage. In all other cases use + // path style requests + return s3utils.IsVirtualHostSupported(url, bucketName) +} diff --git a/vendor/github.com/minio/minio-go/v7/bucket-cache.go b/vendor/github.com/minio/minio-go/v7/bucket-cache.go new file mode 100644 index 000000000..7d485a6b1 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/bucket-cache.go @@ -0,0 +1,253 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2017 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "context" + "net" + "net/http" + "net/url" + "path" + "sync" + + "github.com/minio/minio-go/v7/pkg/credentials" + "github.com/minio/minio-go/v7/pkg/s3utils" + "github.com/minio/minio-go/v7/pkg/signer" +) + +// bucketLocationCache - Provides simple mechanism to hold bucket +// locations in memory. +type bucketLocationCache struct { + // mutex is used for handling the concurrent + // read/write requests for cache. + sync.RWMutex + + // items holds the cached bucket locations. + items map[string]string +} + +// newBucketLocationCache - Provides a new bucket location cache to be +// used internally with the client object. +func newBucketLocationCache() *bucketLocationCache { + return &bucketLocationCache{ + items: make(map[string]string), + } +} + +// Get - Returns a value of a given key if it exists. +func (r *bucketLocationCache) Get(bucketName string) (location string, ok bool) { + r.RLock() + defer r.RUnlock() + location, ok = r.items[bucketName] + return +} + +// Set - Will persist a value into cache. +func (r *bucketLocationCache) Set(bucketName string, location string) { + r.Lock() + defer r.Unlock() + r.items[bucketName] = location +} + +// Delete - Deletes a bucket name from cache. +func (r *bucketLocationCache) Delete(bucketName string) { + r.Lock() + defer r.Unlock() + delete(r.items, bucketName) +} + +// GetBucketLocation - get location for the bucket name from location cache, if not +// fetch freshly by making a new request. +func (c Client) GetBucketLocation(ctx context.Context, bucketName string) (string, error) { + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return "", err + } + return c.getBucketLocation(ctx, bucketName) +} + +// getBucketLocation - Get location for the bucketName from location map cache, if not +// fetch freshly by making a new request. +func (c Client) getBucketLocation(ctx context.Context, bucketName string) (string, error) { + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return "", err + } + + // Region set then no need to fetch bucket location. + if c.region != "" { + return c.region, nil + } + + if location, ok := c.bucketLocCache.Get(bucketName); ok { + return location, nil + } + + // Initialize a new request. + req, err := c.getBucketLocationRequest(bucketName) + if err != nil { + return "", err + } + + // Initiate the request. + resp, err := c.do(req) + defer closeResponse(resp) + if err != nil { + return "", err + } + location, err := processBucketLocationResponse(resp, bucketName) + if err != nil { + return "", err + } + c.bucketLocCache.Set(bucketName, location) + return location, nil +} + +// processes the getBucketLocation http response from the server. +func processBucketLocationResponse(resp *http.Response, bucketName string) (bucketLocation string, err error) { + if resp != nil { + if resp.StatusCode != http.StatusOK { + err = httpRespToErrorResponse(resp, bucketName, "") + errResp := ToErrorResponse(err) + // For access denied error, it could be an anonymous + // request. Move forward and let the top level callers + // succeed if possible based on their policy. + switch errResp.Code { + case "NotImplemented": + if errResp.Server == "AmazonSnowball" { + return "snowball", nil + } + case "AuthorizationHeaderMalformed": + fallthrough + case "InvalidRegion": + fallthrough + case "AccessDenied": + if errResp.Region == "" { + return "us-east-1", nil + } + return errResp.Region, nil + } + return "", err + } + } + + // Extract location. + var locationConstraint string + err = xmlDecoder(resp.Body, &locationConstraint) + if err != nil { + return "", err + } + + location := locationConstraint + // Location is empty will be 'us-east-1'. + if location == "" { + location = "us-east-1" + } + + // Location can be 'EU' convert it to meaningful 'eu-west-1'. + if location == "EU" { + location = "eu-west-1" + } + + // Save the location into cache. + + // Return. + return location, nil +} + +// getBucketLocationRequest - Wrapper creates a new getBucketLocation request. +func (c Client) getBucketLocationRequest(bucketName string) (*http.Request, error) { + // Set location query. + urlValues := make(url.Values) + urlValues.Set("location", "") + + // Set get bucket location always as path style. + targetURL := *c.endpointURL + + // as it works in makeTargetURL method from api.go file + if h, p, err := net.SplitHostPort(targetURL.Host); err == nil { + if targetURL.Scheme == "http" && p == "80" || targetURL.Scheme == "https" && p == "443" { + targetURL.Host = h + } + } + + isVirtualHost := s3utils.IsVirtualHostSupported(targetURL, bucketName) + + var urlStr string + + //only support Aliyun OSS for virtual hosted path, compatible Amazon & Google Endpoint + if isVirtualHost && s3utils.IsAliyunOSSEndpoint(targetURL) { + urlStr = c.endpointURL.Scheme + "://" + bucketName + "." + targetURL.Host + "/?location" + } else { + targetURL.Path = path.Join(bucketName, "") + "/" + targetURL.RawQuery = urlValues.Encode() + urlStr = targetURL.String() + } + + // Get a new HTTP request for the method. + req, err := http.NewRequest(http.MethodGet, urlStr, nil) + if err != nil { + return nil, err + } + + // Set UserAgent for the request. + c.setUserAgent(req) + + // Get credentials from the configured credentials provider. + value, err := c.credsProvider.Get() + if err != nil { + return nil, err + } + + var ( + signerType = value.SignerType + accessKeyID = value.AccessKeyID + secretAccessKey = value.SecretAccessKey + sessionToken = value.SessionToken + ) + + // Custom signer set then override the behavior. + if c.overrideSignerType != credentials.SignatureDefault { + signerType = c.overrideSignerType + } + + // If signerType returned by credentials helper is anonymous, + // then do not sign regardless of signerType override. + if value.SignerType == credentials.SignatureAnonymous { + signerType = credentials.SignatureAnonymous + } + + if signerType.IsAnonymous() { + return req, nil + } + + if signerType.IsV2() { + // Get Bucket Location calls should be always path style + isVirtualHost := false + req = signer.SignV2(*req, accessKeyID, secretAccessKey, isVirtualHost) + return req, nil + } + + // Set sha256 sum for signature calculation only with signature version '4'. + contentSha256 := emptySHA256Hex + if c.secure { + contentSha256 = unsignedPayload + } + + req.Header.Set("X-Amz-Content-Sha256", contentSha256) + req = signer.SignV4(*req, accessKeyID, secretAccessKey, sessionToken, "us-east-1") + return req, nil +} diff --git a/vendor/github.com/minio/minio-go/v7/code_of_conduct.md b/vendor/github.com/minio/minio-go/v7/code_of_conduct.md new file mode 100644 index 000000000..cb232c3c6 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/code_of_conduct.md @@ -0,0 +1,80 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior, in compliance with the +licensing terms applying to the Project developments. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. However, these actions shall respect the +licensing terms of the Project Developments that will always supersede such +Code of Conduct. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at dev@min.io. The project team +will review and investigate all complaints, and will respond in a way that it deems +appropriate to the circumstances. The project team is obligated to maintain +confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +This version includes a clarification to ensure that the code of conduct is in +compliance with the free software licensing terms of the project. + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/vendor/github.com/minio/minio-go/v7/constants.go b/vendor/github.com/minio/minio-go/v7/constants.go new file mode 100644 index 000000000..6a1b8d3dd --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/constants.go @@ -0,0 +1,87 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2017 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +/// Multipart upload defaults. + +// absMinPartSize - absolute minimum part size (5 MiB) below which +// a part in a multipart upload may not be uploaded. +const absMinPartSize = 1024 * 1024 * 5 + +// minPartSize - minimum part size 128MiB per object after which +// putObject behaves internally as multipart. +const minPartSize = 1024 * 1024 * 128 + +// maxPartsCount - maximum number of parts for a single multipart session. +const maxPartsCount = 10000 + +// maxPartSize - maximum part size 5GiB for a single multipart upload +// operation. +const maxPartSize = 1024 * 1024 * 1024 * 5 + +// maxSinglePutObjectSize - maximum size 5GiB of object per PUT +// operation. +const maxSinglePutObjectSize = 1024 * 1024 * 1024 * 5 + +// maxMultipartPutObjectSize - maximum size 5TiB of object for +// Multipart operation. +const maxMultipartPutObjectSize = 1024 * 1024 * 1024 * 1024 * 5 + +// unsignedPayload - value to be set to X-Amz-Content-Sha256 header when +// we don't want to sign the request payload +const unsignedPayload = "UNSIGNED-PAYLOAD" + +// Total number of parallel workers used for multipart operation. +const totalWorkers = 4 + +// Signature related constants. +const ( + signV4Algorithm = "AWS4-HMAC-SHA256" + iso8601DateFormat = "20060102T150405Z" +) + +const ( + // Storage class header. + amzStorageClass = "X-Amz-Storage-Class" + + // Website redirect location header + amzWebsiteRedirectLocation = "X-Amz-Website-Redirect-Location" + + // Object Tagging headers + amzTaggingHeader = "X-Amz-Tagging" + amzTaggingHeaderDirective = "X-Amz-Tagging-Directive" + + amzVersionID = "X-Amz-Version-Id" + amzTaggingCount = "X-Amz-Tagging-Count" + amzExpiration = "X-Amz-Expiration" + amzReplicationStatus = "X-Amz-Replication-Status" + + // Object legal hold header + amzLegalHoldHeader = "X-Amz-Object-Lock-Legal-Hold" + + // Object retention header + amzLockMode = "X-Amz-Object-Lock-Mode" + amzLockRetainUntil = "X-Amz-Object-Lock-Retain-Until-Date" + amzBypassGovernance = "X-Amz-Bypass-Governance-Retention" + + // Replication status + amzBucketReplicationStatus = "X-Amz-Replication-Status" + // Minio specific Replication extension + minIOBucketReplicationSourceMTime = "X-Minio-Source-Mtime" + minIOBucketReplicationETag = "X-Minio-Source-Etag" +) diff --git a/vendor/github.com/minio/minio-go/v7/core.go b/vendor/github.com/minio/minio-go/v7/core.go new file mode 100644 index 000000000..954e1a1bb --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/core.go @@ -0,0 +1,132 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2017 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "context" + "io" + "net/http" + + "github.com/minio/minio-go/v7/pkg/encrypt" +) + +// Core - Inherits Client and adds new methods to expose the low level S3 APIs. +type Core struct { + *Client +} + +// NewCore - Returns new initialized a Core client, this CoreClient should be +// only used under special conditions such as need to access lower primitives +// and being able to use them to write your own wrappers. +func NewCore(endpoint string, opts *Options) (*Core, error) { + var s3Client Core + client, err := New(endpoint, opts) + if err != nil { + return nil, err + } + s3Client.Client = client + return &s3Client, nil +} + +// ListObjects - List all the objects at a prefix, optionally with marker and delimiter +// you can further filter the results. +func (c Core) ListObjects(bucket, prefix, marker, delimiter string, maxKeys int) (result ListBucketResult, err error) { + return c.listObjectsQuery(context.Background(), bucket, prefix, marker, delimiter, maxKeys) +} + +// ListObjectsV2 - Lists all the objects at a prefix, similar to ListObjects() but uses +// continuationToken instead of marker to support iteration over the results. +func (c Core) ListObjectsV2(bucketName, objectPrefix, continuationToken string, fetchOwner bool, delimiter string, maxkeys int) (ListBucketV2Result, error) { + return c.listObjectsV2Query(context.Background(), bucketName, objectPrefix, continuationToken, fetchOwner, false, delimiter, maxkeys) +} + +// CopyObject - copies an object from source object to destination object on server side. +func (c Core) CopyObject(ctx context.Context, sourceBucket, sourceObject, destBucket, destObject string, metadata map[string]string) (ObjectInfo, error) { + return c.copyObjectDo(ctx, sourceBucket, sourceObject, destBucket, destObject, metadata) +} + +// CopyObjectPart - creates a part in a multipart upload by copying (a +// part of) an existing object. +func (c Core) CopyObjectPart(ctx context.Context, srcBucket, srcObject, destBucket, destObject string, uploadID string, + partID int, startOffset, length int64, metadata map[string]string) (p CompletePart, err error) { + + return c.copyObjectPartDo(ctx, srcBucket, srcObject, destBucket, destObject, uploadID, + partID, startOffset, length, metadata) +} + +// PutObject - Upload object. Uploads using single PUT call. +func (c Core) PutObject(ctx context.Context, bucket, object string, data io.Reader, size int64, md5Base64, sha256Hex string, opts PutObjectOptions) (UploadInfo, error) { + return c.putObjectDo(ctx, bucket, object, data, md5Base64, sha256Hex, size, opts) +} + +// NewMultipartUpload - Initiates new multipart upload and returns the new uploadID. +func (c Core) NewMultipartUpload(ctx context.Context, bucket, object string, opts PutObjectOptions) (uploadID string, err error) { + result, err := c.initiateMultipartUpload(ctx, bucket, object, opts) + return result.UploadID, err +} + +// ListMultipartUploads - List incomplete uploads. +func (c Core) ListMultipartUploads(ctx context.Context, bucket, prefix, keyMarker, uploadIDMarker, delimiter string, maxUploads int) (result ListMultipartUploadsResult, err error) { + return c.listMultipartUploadsQuery(ctx, bucket, keyMarker, uploadIDMarker, prefix, delimiter, maxUploads) +} + +// PutObjectPart - Upload an object part. +func (c Core) PutObjectPart(ctx context.Context, bucket, object, uploadID string, partID int, data io.Reader, size int64, md5Base64, sha256Hex string, sse encrypt.ServerSide) (ObjectPart, error) { + return c.uploadPart(ctx, bucket, object, uploadID, data, partID, md5Base64, sha256Hex, size, sse) +} + +// ListObjectParts - List uploaded parts of an incomplete upload.x +func (c Core) ListObjectParts(ctx context.Context, bucket, object, uploadID string, partNumberMarker int, maxParts int) (result ListObjectPartsResult, err error) { + return c.listObjectPartsQuery(ctx, bucket, object, uploadID, partNumberMarker, maxParts) +} + +// CompleteMultipartUpload - Concatenate uploaded parts and commit to an object. +func (c Core) CompleteMultipartUpload(ctx context.Context, bucket, object, uploadID string, parts []CompletePart) (string, error) { + res, err := c.completeMultipartUpload(ctx, bucket, object, uploadID, completeMultipartUpload{ + Parts: parts, + }) + return res.ETag, err +} + +// AbortMultipartUpload - Abort an incomplete upload. +func (c Core) AbortMultipartUpload(ctx context.Context, bucket, object, uploadID string) error { + return c.abortMultipartUpload(ctx, bucket, object, uploadID) +} + +// GetBucketPolicy - fetches bucket access policy for a given bucket. +func (c Core) GetBucketPolicy(ctx context.Context, bucket string) (string, error) { + return c.getBucketPolicy(ctx, bucket) +} + +// PutBucketPolicy - applies a new bucket access policy for a given bucket. +func (c Core) PutBucketPolicy(ctx context.Context, bucket, bucketPolicy string) error { + return c.putBucketPolicy(ctx, bucket, bucketPolicy) +} + +// GetObject is a lower level API implemented to support reading +// partial objects and also downloading objects with special conditions +// matching etag, modtime etc. +func (c Core) GetObject(ctx context.Context, bucketName, objectName string, opts GetObjectOptions) (io.ReadCloser, ObjectInfo, http.Header, error) { + return c.getObject(ctx, bucketName, objectName, opts) +} + +// StatObject is a lower level API implemented to support special +// conditions matching etag, modtime on a request. +func (c Core) StatObject(ctx context.Context, bucketName, objectName string, opts StatObjectOptions) (ObjectInfo, error) { + return c.statObject(ctx, bucketName, objectName, opts) +} diff --git a/vendor/github.com/minio/minio-go/v7/go.mod b/vendor/github.com/minio/minio-go/v7/go.mod new file mode 100644 index 000000000..448b4bbf1 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/go.mod @@ -0,0 +1,25 @@ +module github.com/minio/minio-go/v7 + +go 1.12 + +require ( + github.com/google/uuid v1.1.1 + github.com/json-iterator/go v1.1.10 + github.com/klauspost/cpuid v1.3.1 // indirect + github.com/kr/pretty v0.1.0 // indirect + github.com/minio/md5-simd v1.1.0 + github.com/minio/sha256-simd v0.1.1 + github.com/mitchellh/go-homedir v1.1.0 + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.1 // indirect + github.com/rs/xid v1.2.1 + github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a // indirect + github.com/stretchr/testify v1.4.0 // indirect + golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 + golang.org/x/net v0.0.0-20200707034311-ab3426394381 + golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae // indirect + golang.org/x/text v0.3.3 // indirect + gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect + gopkg.in/ini.v1 v1.57.0 + gopkg.in/yaml.v2 v2.2.8 // indirect +) diff --git a/vendor/github.com/minio/minio-go/v7/go.sum b/vendor/github.com/minio/minio-go/v7/go.sum new file mode 100644 index 000000000..1858b6ff3 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/go.sum @@ -0,0 +1,76 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/klauspost/cpuid v1.2.3 h1:CCtW0xUnWGVINKvE/WWOYKdsPV6mawAtvQuSl8guwQs= +github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid v1.3.1 h1:5JNjFYYQrZeKRJ0734q51WCEEn2huer72Dc7K+R/b6s= +github.com/klauspost/cpuid v1.3.1/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/minio/md5-simd v1.1.0 h1:QPfiOqlZH+Cj9teu0t9b1nTBfPbyTl16Of5MeuShdK4= +github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw= +github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU= +github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a h1:pa8hGb/2YqsZKovtsgrwcDH1RZhVbTKCjLp47XpqCDs= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 h1:DZhuSZLsGlFL4CmhA8BcRA0mnthyA/nZ00AqCUo7vHg= +golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae h1:Ih9Yo4hSPImZOpfGuA4bR/ORKTAbhZo2AbWNRCnevdo= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/ini.v1 v1.57.0 h1:9unxIsFcTt4I55uWluz+UmL95q4kdJ0buvQ1ZIqVQww= +gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/minio/minio-go/hook-reader.go b/vendor/github.com/minio/minio-go/v7/hook-reader.go similarity index 83% rename from vendor/github.com/minio/minio-go/hook-reader.go rename to vendor/github.com/minio/minio-go/v7/hook-reader.go index 8f32291d4..f251c1e95 100644 --- a/vendor/github.com/minio/minio-go/hook-reader.go +++ b/vendor/github.com/minio/minio-go/v7/hook-reader.go @@ -1,6 +1,6 @@ /* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2017 MinIO, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,10 @@ package minio -import "io" +import ( + "fmt" + "io" +) // hookReader hooks additional reader in the source stream. It is // useful for making progress bars. Second reader is appropriately @@ -34,12 +37,23 @@ func (hr *hookReader) Seek(offset int64, whence int) (n int64, err error) { // Verify for source has embedded Seeker, use it. sourceSeeker, ok := hr.source.(io.Seeker) if ok { - return sourceSeeker.Seek(offset, whence) + n, err = sourceSeeker.Seek(offset, whence) + if err != nil { + return 0, err + } } + // Verify if hook has embedded Seeker, use it. hookSeeker, ok := hr.hook.(io.Seeker) if ok { - return hookSeeker.Seek(offset, whence) + var m int64 + m, err = hookSeeker.Seek(offset, whence) + if err != nil { + return 0, err + } + if n != m { + return 0, fmt.Errorf("hook seeker seeked %d bytes, expected source %d bytes", m, n) + } } return n, nil } diff --git a/vendor/github.com/minio/minio-go/v7/pkg/credentials/assume_role.go b/vendor/github.com/minio/minio-go/v7/pkg/credentials/assume_role.go new file mode 100644 index 000000000..cc88a9ab6 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/pkg/credentials/assume_role.go @@ -0,0 +1,214 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2020 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package credentials + +import ( + "encoding/hex" + "encoding/xml" + "errors" + "io" + "io/ioutil" + "net/http" + "net/url" + "strconv" + "strings" + "time" + + "github.com/minio/minio-go/v7/pkg/signer" + sha256 "github.com/minio/sha256-simd" +) + +// AssumeRoleResponse contains the result of successful AssumeRole request. +type AssumeRoleResponse struct { + XMLName xml.Name `xml:"https://sts.amazonaws.com/doc/2011-06-15/ AssumeRoleResponse" json:"-"` + + Result AssumeRoleResult `xml:"AssumeRoleResult"` + ResponseMetadata struct { + RequestID string `xml:"RequestId,omitempty"` + } `xml:"ResponseMetadata,omitempty"` +} + +// AssumeRoleResult - Contains the response to a successful AssumeRole +// request, including temporary credentials that can be used to make +// MinIO API requests. +type AssumeRoleResult struct { + // The identifiers for the temporary security credentials that the operation + // returns. + AssumedRoleUser AssumedRoleUser `xml:",omitempty"` + + // The temporary security credentials, which include an access key ID, a secret + // access key, and a security (or session) token. + // + // Note: The size of the security token that STS APIs return is not fixed. We + // strongly recommend that you make no assumptions about the maximum size. As + // of this writing, the typical size is less than 4096 bytes, but that can vary. + // Also, future updates to AWS might require larger sizes. + Credentials struct { + AccessKey string `xml:"AccessKeyId" json:"accessKey,omitempty"` + SecretKey string `xml:"SecretAccessKey" json:"secretKey,omitempty"` + Expiration time.Time `xml:"Expiration" json:"expiration,omitempty"` + SessionToken string `xml:"SessionToken" json:"sessionToken,omitempty"` + } `xml:",omitempty"` + + // A percentage value that indicates the size of the policy in packed form. + // The service rejects any policy with a packed size greater than 100 percent, + // which means the policy exceeded the allowed space. + PackedPolicySize int `xml:",omitempty"` +} + +// A STSAssumeRole retrieves credentials from MinIO service, and keeps track if +// those credentials are expired. +type STSAssumeRole struct { + Expiry + + // Required http Client to use when connecting to MinIO STS service. + Client *http.Client + + // STS endpoint to fetch STS credentials. + STSEndpoint string + + // various options for this request. + Options STSAssumeRoleOptions +} + +// STSAssumeRoleOptions collection of various input options +// to obtain AssumeRole credentials. +type STSAssumeRoleOptions struct { + // Mandatory inputs. + AccessKey string + SecretKey string + + Location string // Optional commonly needed with AWS STS. + DurationSeconds int // Optional defaults to 1 hour. + + // Optional only valid if using with AWS STS + RoleARN string + RoleSessionName string +} + +// NewSTSAssumeRole returns a pointer to a new +// Credentials object wrapping the STSAssumeRole. +func NewSTSAssumeRole(stsEndpoint string, opts STSAssumeRoleOptions) (*Credentials, error) { + if stsEndpoint == "" { + return nil, errors.New("STS endpoint cannot be empty") + } + if opts.AccessKey == "" || opts.SecretKey == "" { + return nil, errors.New("AssumeRole credentials access/secretkey is mandatory") + } + return New(&STSAssumeRole{ + Client: &http.Client{ + Transport: http.DefaultTransport, + }, + STSEndpoint: stsEndpoint, + Options: opts, + }), nil +} + +const defaultDurationSeconds = 3600 + +// closeResponse close non nil response with any response Body. +// convenient wrapper to drain any remaining data on response body. +// +// Subsequently this allows golang http RoundTripper +// to re-use the same connection for future requests. +func closeResponse(resp *http.Response) { + // Callers should close resp.Body when done reading from it. + // If resp.Body is not closed, the Client's underlying RoundTripper + // (typically Transport) may not be able to re-use a persistent TCP + // connection to the server for a subsequent "keep-alive" request. + if resp != nil && resp.Body != nil { + // Drain any remaining Body and then close the connection. + // Without this closing connection would disallow re-using + // the same connection for future uses. + // - http://stackoverflow.com/a/17961593/4465767 + io.Copy(ioutil.Discard, resp.Body) + resp.Body.Close() + } +} + +func getAssumeRoleCredentials(clnt *http.Client, endpoint string, opts STSAssumeRoleOptions) (AssumeRoleResponse, error) { + v := url.Values{} + v.Set("Action", "AssumeRole") + v.Set("Version", "2011-06-15") + if opts.RoleARN != "" { + v.Set("RoleArn", opts.RoleARN) + } + if opts.RoleSessionName != "" { + v.Set("RoleSessionName", opts.RoleSessionName) + } + if opts.DurationSeconds > defaultDurationSeconds { + v.Set("DurationSeconds", strconv.Itoa(opts.DurationSeconds)) + } else { + v.Set("DurationSeconds", strconv.Itoa(defaultDurationSeconds)) + } + + u, err := url.Parse(endpoint) + if err != nil { + return AssumeRoleResponse{}, err + } + u.Path = "/" + + postBody := strings.NewReader(v.Encode()) + hash := sha256.New() + if _, err = io.Copy(hash, postBody); err != nil { + return AssumeRoleResponse{}, err + } + postBody.Seek(0, 0) + + req, err := http.NewRequest(http.MethodPost, u.String(), postBody) + if err != nil { + return AssumeRoleResponse{}, err + } + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + req.Header.Set("X-Amz-Content-Sha256", hex.EncodeToString(hash.Sum(nil))) + req = signer.SignV4STS(*req, opts.AccessKey, opts.SecretKey, opts.Location) + + resp, err := clnt.Do(req) + if err != nil { + return AssumeRoleResponse{}, err + } + defer closeResponse(resp) + if resp.StatusCode != http.StatusOK { + return AssumeRoleResponse{}, errors.New(resp.Status) + } + + a := AssumeRoleResponse{} + if err = xml.NewDecoder(resp.Body).Decode(&a); err != nil { + return AssumeRoleResponse{}, err + } + return a, nil +} + +// Retrieve retrieves credentials from the MinIO service. +// Error will be returned if the request fails. +func (m *STSAssumeRole) Retrieve() (Value, error) { + a, err := getAssumeRoleCredentials(m.Client, m.STSEndpoint, m.Options) + if err != nil { + return Value{}, err + } + + // Expiry window is set to 10secs. + m.SetExpiration(a.Result.Credentials.Expiration, DefaultExpiryWindow) + + return Value{ + AccessKeyID: a.Result.Credentials.AccessKey, + SecretAccessKey: a.Result.Credentials.SecretKey, + SessionToken: a.Result.Credentials.SessionToken, + SignerType: SignatureV4, + }, nil +} diff --git a/vendor/github.com/minio/minio-go/pkg/credentials/chain.go b/vendor/github.com/minio/minio-go/v7/pkg/credentials/chain.go similarity index 96% rename from vendor/github.com/minio/minio-go/pkg/credentials/chain.go rename to vendor/github.com/minio/minio-go/v7/pkg/credentials/chain.go index e29826f48..6dc8e9d05 100644 --- a/vendor/github.com/minio/minio-go/pkg/credentials/chain.go +++ b/vendor/github.com/minio/minio-go/v7/pkg/credentials/chain.go @@ -1,6 +1,6 @@ /* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2017 Minio, Inc. + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2017 MinIO, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/vendor/github.com/minio/minio-go/pkg/credentials/config.json.sample b/vendor/github.com/minio/minio-go/v7/pkg/credentials/config.json.sample similarity index 87% rename from vendor/github.com/minio/minio-go/pkg/credentials/config.json.sample rename to vendor/github.com/minio/minio-go/v7/pkg/credentials/config.json.sample index 130746f4b..d793c9e0e 100644 --- a/vendor/github.com/minio/minio-go/pkg/credentials/config.json.sample +++ b/vendor/github.com/minio/minio-go/v7/pkg/credentials/config.json.sample @@ -2,7 +2,7 @@ "version": "8", "hosts": { "play": { - "url": "https://play.minio.io:9000", + "url": "https://play.min.io", "accessKey": "Q3AM3UQ867SPQQA43P2F", "secretKey": "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG", "api": "S3v2" diff --git a/vendor/github.com/minio/minio-go/v7/pkg/credentials/credentials.go b/vendor/github.com/minio/minio-go/v7/pkg/credentials/credentials.go new file mode 100644 index 000000000..1a48751b5 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/pkg/credentials/credentials.go @@ -0,0 +1,175 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2017 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package credentials + +import ( + "sync" + "time" +) + +// A Value is the AWS credentials value for individual credential fields. +type Value struct { + // AWS Access key ID + AccessKeyID string + + // AWS Secret Access Key + SecretAccessKey string + + // AWS Session Token + SessionToken string + + // Signature Type. + SignerType SignatureType +} + +// A Provider is the interface for any component which will provide credentials +// Value. A provider is required to manage its own Expired state, and what to +// be expired means. +type Provider interface { + // Retrieve returns nil if it successfully retrieved the value. + // Error is returned if the value were not obtainable, or empty. + Retrieve() (Value, error) + + // IsExpired returns if the credentials are no longer valid, and need + // to be retrieved. + IsExpired() bool +} + +// A Expiry provides shared expiration logic to be used by credentials +// providers to implement expiry functionality. +// +// The best method to use this struct is as an anonymous field within the +// provider's struct. +// +// Example: +// type IAMCredentialProvider struct { +// Expiry +// ... +// } +type Expiry struct { + // The date/time when to expire on + expiration time.Time + + // If set will be used by IsExpired to determine the current time. + // Defaults to time.Now if CurrentTime is not set. + CurrentTime func() time.Time +} + +// SetExpiration sets the expiration IsExpired will check when called. +// +// If window is greater than 0 the expiration time will be reduced by the +// window value. +// +// Using a window is helpful to trigger credentials to expire sooner than +// the expiration time given to ensure no requests are made with expired +// tokens. +func (e *Expiry) SetExpiration(expiration time.Time, window time.Duration) { + e.expiration = expiration + if window > 0 { + e.expiration = e.expiration.Add(-window) + } +} + +// IsExpired returns if the credentials are expired. +func (e *Expiry) IsExpired() bool { + if e.CurrentTime == nil { + e.CurrentTime = time.Now + } + return e.expiration.Before(e.CurrentTime()) +} + +// Credentials - A container for synchronous safe retrieval of credentials Value. +// Credentials will cache the credentials value until they expire. Once the value +// expires the next Get will attempt to retrieve valid credentials. +// +// Credentials is safe to use across multiple goroutines and will manage the +// synchronous state so the Providers do not need to implement their own +// synchronization. +// +// The first Credentials.Get() will always call Provider.Retrieve() to get the +// first instance of the credentials Value. All calls to Get() after that +// will return the cached credentials Value until IsExpired() returns true. +type Credentials struct { + sync.Mutex + + creds Value + forceRefresh bool + provider Provider +} + +// New returns a pointer to a new Credentials with the provider set. +func New(provider Provider) *Credentials { + return &Credentials{ + provider: provider, + forceRefresh: true, + } +} + +// Get returns the credentials value, or error if the credentials Value failed +// to be retrieved. +// +// Will return the cached credentials Value if it has not expired. If the +// credentials Value has expired the Provider's Retrieve() will be called +// to refresh the credentials. +// +// If Credentials.Expire() was called the credentials Value will be force +// expired, and the next call to Get() will cause them to be refreshed. +func (c *Credentials) Get() (Value, error) { + c.Lock() + defer c.Unlock() + + if c.isExpired() { + creds, err := c.provider.Retrieve() + if err != nil { + return Value{}, err + } + c.creds = creds + c.forceRefresh = false + } + + return c.creds, nil +} + +// Expire expires the credentials and forces them to be retrieved on the +// next call to Get(). +// +// This will override the Provider's expired state, and force Credentials +// to call the Provider's Retrieve(). +func (c *Credentials) Expire() { + c.Lock() + defer c.Unlock() + + c.forceRefresh = true +} + +// IsExpired returns if the credentials are no longer valid, and need +// to be refreshed. +// +// If the Credentials were forced to be expired with Expire() this will +// reflect that override. +func (c *Credentials) IsExpired() bool { + c.Lock() + defer c.Unlock() + + return c.isExpired() +} + +// isExpired helper method wrapping the definition of expired credentials. +func (c *Credentials) isExpired() bool { + return c.forceRefresh || c.provider.IsExpired() +} diff --git a/vendor/github.com/minio/minio-go/pkg/credentials/credentials.sample b/vendor/github.com/minio/minio-go/v7/pkg/credentials/credentials.sample similarity index 100% rename from vendor/github.com/minio/minio-go/pkg/credentials/credentials.sample rename to vendor/github.com/minio/minio-go/v7/pkg/credentials/credentials.sample diff --git a/vendor/github.com/minio/minio-go/v7/pkg/credentials/doc.go b/vendor/github.com/minio/minio-go/v7/pkg/credentials/doc.go new file mode 100644 index 000000000..0c94477b7 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/pkg/credentials/doc.go @@ -0,0 +1,62 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2017 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Package credentials provides credential retrieval and management +// for S3 compatible object storage. +// +// By default the Credentials.Get() will cache the successful result of a +// Provider's Retrieve() until Provider.IsExpired() returns true. At which +// point Credentials will call Provider's Retrieve() to get new credential Value. +// +// The Provider is responsible for determining when credentials have expired. +// It is also important to note that Credentials will always call Retrieve the +// first time Credentials.Get() is called. +// +// Example of using the environment variable credentials. +// +// creds := NewFromEnv() +// // Retrieve the credentials value +// credValue, err := creds.Get() +// if err != nil { +// // handle error +// } +// +// Example of forcing credentials to expire and be refreshed on the next Get(). +// This may be helpful to proactively expire credentials and refresh them sooner +// than they would naturally expire on their own. +// +// creds := NewFromIAM("") +// creds.Expire() +// credsValue, err := creds.Get() +// // New credentials will be retrieved instead of from cache. +// +// +// Custom Provider +// +// Each Provider built into this package also provides a helper method to generate +// a Credentials pointer setup with the provider. To use a custom Provider just +// create a type which satisfies the Provider interface and pass it to the +// NewCredentials method. +// +// type MyProvider struct{} +// func (m *MyProvider) Retrieve() (Value, error) {...} +// func (m *MyProvider) IsExpired() bool {...} +// +// creds := NewCredentials(&MyProvider{}) +// credValue, err := creds.Get() +// +package credentials diff --git a/vendor/github.com/minio/minio-go/pkg/credentials/env_aws.go b/vendor/github.com/minio/minio-go/v7/pkg/credentials/env_aws.go similarity index 95% rename from vendor/github.com/minio/minio-go/pkg/credentials/env_aws.go rename to vendor/github.com/minio/minio-go/v7/pkg/credentials/env_aws.go index f9b2cc33a..b6e60d0e1 100644 --- a/vendor/github.com/minio/minio-go/pkg/credentials/env_aws.go +++ b/vendor/github.com/minio/minio-go/v7/pkg/credentials/env_aws.go @@ -1,6 +1,6 @@ /* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2017 Minio, Inc. + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2017 MinIO, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/vendor/github.com/minio/minio-go/pkg/credentials/env_minio.go b/vendor/github.com/minio/minio-go/v7/pkg/credentials/env_minio.go similarity index 94% rename from vendor/github.com/minio/minio-go/pkg/credentials/env_minio.go rename to vendor/github.com/minio/minio-go/v7/pkg/credentials/env_minio.go index d72e77185..5f1ae0d25 100644 --- a/vendor/github.com/minio/minio-go/pkg/credentials/env_minio.go +++ b/vendor/github.com/minio/minio-go/v7/pkg/credentials/env_minio.go @@ -1,6 +1,6 @@ /* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2017 Minio, Inc. + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2017 MinIO, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/vendor/github.com/minio/minio-go/pkg/credentials/file_aws_credentials.go b/vendor/github.com/minio/minio-go/v7/pkg/credentials/file_aws_credentials.go similarity index 85% rename from vendor/github.com/minio/minio-go/pkg/credentials/file_aws_credentials.go rename to vendor/github.com/minio/minio-go/v7/pkg/credentials/file_aws_credentials.go index 5ad68303a..ccc8251f4 100644 --- a/vendor/github.com/minio/minio-go/pkg/credentials/file_aws_credentials.go +++ b/vendor/github.com/minio/minio-go/v7/pkg/credentials/file_aws_credentials.go @@ -1,6 +1,6 @@ /* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2017 Minio, Inc. + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2017 MinIO, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,8 +21,8 @@ import ( "os" "path/filepath" - "github.com/go-ini/ini" homedir "github.com/mitchellh/go-homedir" + ini "gopkg.in/ini.v1" ) // A FileAWSCredentials retrieves credentials from the current user's home @@ -36,12 +36,12 @@ type FileAWSCredentials struct { // env value is empty will default to current user's home directory. // Linux/OSX: "$HOME/.aws/credentials" // Windows: "%USERPROFILE%\.aws\credentials" - filename string + Filename string // AWS Profile to extract credentials from the shared credentials file. If empty // will default to environment variable "AWS_PROFILE" or "default" if // environment variable is also not set. - profile string + Profile string // retrieved states if the credentials have been successfully retrieved. retrieved bool @@ -51,34 +51,34 @@ type FileAWSCredentials struct { // wrapping the Profile file provider. func NewFileAWSCredentials(filename string, profile string) *Credentials { return New(&FileAWSCredentials{ - filename: filename, - profile: profile, + Filename: filename, + Profile: profile, }) } // Retrieve reads and extracts the shared credentials from the current // users home directory. func (p *FileAWSCredentials) Retrieve() (Value, error) { - if p.filename == "" { - p.filename = os.Getenv("AWS_SHARED_CREDENTIALS_FILE") - if p.filename == "" { + if p.Filename == "" { + p.Filename = os.Getenv("AWS_SHARED_CREDENTIALS_FILE") + if p.Filename == "" { homeDir, err := homedir.Dir() if err != nil { return Value{}, err } - p.filename = filepath.Join(homeDir, ".aws", "credentials") + p.Filename = filepath.Join(homeDir, ".aws", "credentials") } } - if p.profile == "" { - p.profile = os.Getenv("AWS_PROFILE") - if p.profile == "" { - p.profile = "default" + if p.Profile == "" { + p.Profile = os.Getenv("AWS_PROFILE") + if p.Profile == "" { + p.Profile = "default" } } p.retrieved = false - iniProfile, err := loadProfile(p.filename, p.profile) + iniProfile, err := loadProfile(p.Filename, p.Profile) if err != nil { return Value{}, err } diff --git a/vendor/github.com/minio/minio-go/pkg/credentials/file_minio_client.go b/vendor/github.com/minio/minio-go/v7/pkg/credentials/file_minio_client.go similarity index 78% rename from vendor/github.com/minio/minio-go/pkg/credentials/file_minio_client.go rename to vendor/github.com/minio/minio-go/v7/pkg/credentials/file_minio_client.go index c282c2a2c..ca6db005b 100644 --- a/vendor/github.com/minio/minio-go/pkg/credentials/file_minio_client.go +++ b/vendor/github.com/minio/minio-go/v7/pkg/credentials/file_minio_client.go @@ -1,6 +1,6 @@ /* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2017 Minio, Inc. + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2017 MinIO, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,12 +18,12 @@ package credentials import ( - "encoding/json" "io/ioutil" "os" "path/filepath" "runtime" + jsoniter "github.com/json-iterator/go" homedir "github.com/mitchellh/go-homedir" ) @@ -38,12 +38,12 @@ type FileMinioClient struct { // env value is empty will default to current user's home directory. // Linux/OSX: "$HOME/.mc/config.json" // Windows: "%USERALIAS%\mc\config.json" - filename string + Filename string - // Minio Alias to extract credentials from the shared credentials file. If empty + // MinIO Alias to extract credentials from the shared credentials file. If empty // will default to environment variable "MINIO_ALIAS" or "default" if // environment variable is also not set. - alias string + Alias string // retrieved states if the credentials have been successfully retrieved. retrieved bool @@ -53,35 +53,39 @@ type FileMinioClient struct { // wrapping the Alias file provider. func NewFileMinioClient(filename string, alias string) *Credentials { return New(&FileMinioClient{ - filename: filename, - alias: alias, + Filename: filename, + Alias: alias, }) } // Retrieve reads and extracts the shared credentials from the current // users home directory. func (p *FileMinioClient) Retrieve() (Value, error) { - if p.filename == "" { - homeDir, err := homedir.Dir() - if err != nil { - return Value{}, err - } - p.filename = filepath.Join(homeDir, ".mc", "config.json") - if runtime.GOOS == "windows" { - p.filename = filepath.Join(homeDir, "mc", "config.json") + if p.Filename == "" { + if value, ok := os.LookupEnv("MINIO_SHARED_CREDENTIALS_FILE"); ok { + p.Filename = value + } else { + homeDir, err := homedir.Dir() + if err != nil { + return Value{}, err + } + p.Filename = filepath.Join(homeDir, ".mc", "config.json") + if runtime.GOOS == "windows" { + p.Filename = filepath.Join(homeDir, "mc", "config.json") + } } } - if p.alias == "" { - p.alias = os.Getenv("MINIO_ALIAS") - if p.alias == "" { - p.alias = "s3" + if p.Alias == "" { + p.Alias = os.Getenv("MINIO_ALIAS") + if p.Alias == "" { + p.Alias = "s3" } } p.retrieved = false - hostCfg, err := loadAlias(p.filename, p.alias) + hostCfg, err := loadAlias(p.Filename, p.Alias) if err != nil { return Value{}, err } @@ -118,6 +122,8 @@ type config struct { // returned if it fails to read from the file. func loadAlias(filename, alias string) (hostConfig, error) { cfg := &config{} + var json = jsoniter.ConfigCompatibleWithStandardLibrary + configBytes, err := ioutil.ReadFile(filename) if err != nil { return hostConfig{}, err diff --git a/vendor/github.com/minio/minio-go/v7/pkg/credentials/iam_aws.go b/vendor/github.com/minio/minio-go/v7/pkg/credentials/iam_aws.go new file mode 100644 index 000000000..ceeab84dd --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/pkg/credentials/iam_aws.go @@ -0,0 +1,326 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2017 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package credentials + +import ( + "bufio" + "errors" + "fmt" + "io/ioutil" + "net" + "net/http" + "net/url" + "os" + "path" + "time" + + jsoniter "github.com/json-iterator/go" +) + +// DefaultExpiryWindow - Default expiry window. +// ExpiryWindow will allow the credentials to trigger refreshing +// prior to the credentials actually expiring. This is beneficial +// so race conditions with expiring credentials do not cause +// request to fail unexpectedly due to ExpiredTokenException exceptions. +const DefaultExpiryWindow = time.Second * 10 // 10 secs + +// A IAM retrieves credentials from the EC2 service, and keeps track if +// those credentials are expired. +type IAM struct { + Expiry + + // Required http Client to use when connecting to IAM metadata service. + Client *http.Client + + // Custom endpoint to fetch IAM role credentials. + endpoint string +} + +// IAM Roles for Amazon EC2 +// http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html +const ( + defaultIAMRoleEndpoint = "http://169.254.169.254" + defaultECSRoleEndpoint = "http://169.254.170.2" + defaultSTSRoleEndpoint = "https://sts.amazonaws.com" + defaultIAMSecurityCredsPath = "/latest/meta-data/iam/security-credentials/" +) + +// NewIAM returns a pointer to a new Credentials object wrapping the IAM. +func NewIAM(endpoint string) *Credentials { + p := &IAM{ + Client: &http.Client{ + Transport: http.DefaultTransport, + }, + endpoint: endpoint, + } + return New(p) +} + +// Retrieve retrieves credentials from the EC2 service. +// Error will be returned if the request fails, or unable to extract +// the desired +func (m *IAM) Retrieve() (Value, error) { + var roleCreds ec2RoleCredRespBody + var err error + + endpoint := m.endpoint + switch { + case len(os.Getenv("AWS_WEB_IDENTITY_TOKEN_FILE")) > 0: + if len(endpoint) == 0 { + if len(os.Getenv("AWS_REGION")) > 0 { + endpoint = "https://sts." + os.Getenv("AWS_REGION") + ".amazonaws.com" + } else { + endpoint = defaultSTSRoleEndpoint + } + } + + creds := &STSWebIdentity{ + Client: m.Client, + stsEndpoint: endpoint, + roleARN: os.Getenv("AWS_ROLE_ARN"), + roleSessionName: os.Getenv("AWS_ROLE_SESSION_NAME"), + getWebIDTokenExpiry: func() (*WebIdentityToken, error) { + token, err := ioutil.ReadFile(os.Getenv("AWS_WEB_IDENTITY_TOKEN_FILE")) + if err != nil { + return nil, err + } + + return &WebIdentityToken{Token: string(token)}, nil + }, + } + + stsWebIdentityCreds, err := creds.Retrieve() + if err == nil { + m.SetExpiration(creds.Expiration(), DefaultExpiryWindow) + } + return stsWebIdentityCreds, err + + case len(os.Getenv("AWS_CONTAINER_CREDENTIALS_RELATIVE_URI")) > 0: + if len(endpoint) == 0 { + endpoint = fmt.Sprintf("%s%s", defaultECSRoleEndpoint, + os.Getenv("AWS_CONTAINER_CREDENTIALS_RELATIVE_URI")) + } + + roleCreds, err = getEcsTaskCredentials(m.Client, endpoint) + + case len(os.Getenv("AWS_CONTAINER_CREDENTIALS_FULL_URI")) > 0: + if len(endpoint) == 0 { + endpoint = os.Getenv("AWS_CONTAINER_CREDENTIALS_FULL_URI") + + var ok bool + if ok, err = isLoopback(endpoint); !ok { + if err == nil { + err = fmt.Errorf("uri host is not a loopback address: %s", endpoint) + } + break + } + } + + roleCreds, err = getEcsTaskCredentials(m.Client, endpoint) + + default: + roleCreds, err = getCredentials(m.Client, endpoint) + } + + if err != nil { + return Value{}, err + } + // Expiry window is set to 10secs. + m.SetExpiration(roleCreds.Expiration, DefaultExpiryWindow) + + return Value{ + AccessKeyID: roleCreds.AccessKeyID, + SecretAccessKey: roleCreds.SecretAccessKey, + SessionToken: roleCreds.Token, + SignerType: SignatureV4, + }, nil +} + +// A ec2RoleCredRespBody provides the shape for unmarshaling credential +// request responses. +type ec2RoleCredRespBody struct { + // Success State + Expiration time.Time + AccessKeyID string + SecretAccessKey string + Token string + + // Error state + Code string + Message string + + // Unused params. + LastUpdated time.Time + Type string +} + +// Get the final IAM role URL where the request will +// be sent to fetch the rolling access credentials. +// http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html +func getIAMRoleURL(endpoint string) (*url.URL, error) { + if endpoint == "" { + endpoint = defaultIAMRoleEndpoint + } + + u, err := url.Parse(endpoint) + if err != nil { + return nil, err + } + u.Path = defaultIAMSecurityCredsPath + return u, nil +} + +// listRoleNames lists of credential role names associated +// with the current EC2 service. If there are no credentials, +// or there is an error making or receiving the request. +// http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html +func listRoleNames(client *http.Client, u *url.URL) ([]string, error) { + req, err := http.NewRequest(http.MethodGet, u.String(), nil) + if err != nil { + return nil, err + } + resp, err := client.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return nil, errors.New(resp.Status) + } + + credsList := []string{} + s := bufio.NewScanner(resp.Body) + for s.Scan() { + credsList = append(credsList, s.Text()) + } + + if err := s.Err(); err != nil { + return nil, err + } + + return credsList, nil +} + +func getEcsTaskCredentials(client *http.Client, endpoint string) (ec2RoleCredRespBody, error) { + req, err := http.NewRequest(http.MethodGet, endpoint, nil) + if err != nil { + return ec2RoleCredRespBody{}, err + } + + resp, err := client.Do(req) + if err != nil { + return ec2RoleCredRespBody{}, err + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return ec2RoleCredRespBody{}, errors.New(resp.Status) + } + + respCreds := ec2RoleCredRespBody{} + if err := jsoniter.NewDecoder(resp.Body).Decode(&respCreds); err != nil { + return ec2RoleCredRespBody{}, err + } + + return respCreds, nil +} + +// getCredentials - obtains the credentials from the IAM role name associated with +// the current EC2 service. +// +// If the credentials cannot be found, or there is an error +// reading the response an error will be returned. +func getCredentials(client *http.Client, endpoint string) (ec2RoleCredRespBody, error) { + + // http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html + u, err := getIAMRoleURL(endpoint) + if err != nil { + return ec2RoleCredRespBody{}, err + } + + // http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html + roleNames, err := listRoleNames(client, u) + if err != nil { + return ec2RoleCredRespBody{}, err + } + + if len(roleNames) == 0 { + return ec2RoleCredRespBody{}, errors.New("No IAM roles attached to this EC2 service") + } + + // http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html + // - An instance profile can contain only one IAM role. This limit cannot be increased. + roleName := roleNames[0] + + // http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html + // The following command retrieves the security credentials for an + // IAM role named `s3access`. + // + // $ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/s3access + // + u.Path = path.Join(u.Path, roleName) + req, err := http.NewRequest(http.MethodGet, u.String(), nil) + if err != nil { + return ec2RoleCredRespBody{}, err + } + + resp, err := client.Do(req) + if err != nil { + return ec2RoleCredRespBody{}, err + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return ec2RoleCredRespBody{}, errors.New(resp.Status) + } + + respCreds := ec2RoleCredRespBody{} + if err := jsoniter.NewDecoder(resp.Body).Decode(&respCreds); err != nil { + return ec2RoleCredRespBody{}, err + } + + if respCreds.Code != "Success" { + // If an error code was returned something failed requesting the role. + return ec2RoleCredRespBody{}, errors.New(respCreds.Message) + } + + return respCreds, nil +} + +// isLoopback identifies if a uri's host is on a loopback address +func isLoopback(uri string) (bool, error) { + u, err := url.Parse(uri) + if err != nil { + return false, err + } + + host := u.Hostname() + if len(host) == 0 { + return false, fmt.Errorf("can't parse host from uri: %s", uri) + } + + ips, err := net.LookupHost(host) + if err != nil { + return false, err + } + for _, ip := range ips { + if !net.ParseIP(ip).IsLoopback() { + return false, nil + } + } + + return true, nil +} diff --git a/vendor/github.com/minio/minio-go/pkg/credentials/signature-type.go b/vendor/github.com/minio/minio-go/v7/pkg/credentials/signature-type.go similarity index 95% rename from vendor/github.com/minio/minio-go/pkg/credentials/signature-type.go rename to vendor/github.com/minio/minio-go/v7/pkg/credentials/signature-type.go index 1b768e8c3..b79433305 100644 --- a/vendor/github.com/minio/minio-go/pkg/credentials/signature-type.go +++ b/vendor/github.com/minio/minio-go/v7/pkg/credentials/signature-type.go @@ -1,6 +1,6 @@ /* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2017 Minio, Inc. + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2017 MinIO, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/vendor/github.com/minio/minio-go/v7/pkg/credentials/static.go b/vendor/github.com/minio/minio-go/v7/pkg/credentials/static.go new file mode 100644 index 000000000..7dde00b0a --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/pkg/credentials/static.go @@ -0,0 +1,67 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2017 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package credentials + +// A Static is a set of credentials which are set programmatically, +// and will never expire. +type Static struct { + Value +} + +// NewStaticV2 returns a pointer to a new Credentials object +// wrapping a static credentials value provider, signature is +// set to v2. If access and secret are not specified then +// regardless of signature type set it Value will return +// as anonymous. +func NewStaticV2(id, secret, token string) *Credentials { + return NewStatic(id, secret, token, SignatureV2) +} + +// NewStaticV4 is similar to NewStaticV2 with similar considerations. +func NewStaticV4(id, secret, token string) *Credentials { + return NewStatic(id, secret, token, SignatureV4) +} + +// NewStatic returns a pointer to a new Credentials object +// wrapping a static credentials value provider. +func NewStatic(id, secret, token string, signerType SignatureType) *Credentials { + return New(&Static{ + Value: Value{ + AccessKeyID: id, + SecretAccessKey: secret, + SessionToken: token, + SignerType: signerType, + }, + }) +} + +// Retrieve returns the static credentials. +func (s *Static) Retrieve() (Value, error) { + if s.AccessKeyID == "" || s.SecretAccessKey == "" { + // Anonymous is not an error + return Value{SignerType: SignatureAnonymous}, nil + } + return s.Value, nil +} + +// IsExpired returns if the credentials are expired. +// +// For Static, the credentials never expired. +func (s *Static) IsExpired() bool { + return false +} diff --git a/vendor/github.com/minio/minio-go/v7/pkg/credentials/sts_client_grants.go b/vendor/github.com/minio/minio-go/v7/pkg/credentials/sts_client_grants.go new file mode 100644 index 000000000..e89d5d4d8 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/pkg/credentials/sts_client_grants.go @@ -0,0 +1,162 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2019 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package credentials + +import ( + "encoding/xml" + "errors" + "fmt" + "net/http" + "net/url" + "time" +) + +// AssumedRoleUser - The identifiers for the temporary security credentials that +// the operation returns. Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumedRoleUser +type AssumedRoleUser struct { + Arn string + AssumedRoleID string `xml:"AssumeRoleId"` +} + +// AssumeRoleWithClientGrantsResponse contains the result of successful AssumeRoleWithClientGrants request. +type AssumeRoleWithClientGrantsResponse struct { + XMLName xml.Name `xml:"https://sts.amazonaws.com/doc/2011-06-15/ AssumeRoleWithClientGrantsResponse" json:"-"` + Result ClientGrantsResult `xml:"AssumeRoleWithClientGrantsResult"` + ResponseMetadata struct { + RequestID string `xml:"RequestId,omitempty"` + } `xml:"ResponseMetadata,omitempty"` +} + +// ClientGrantsResult - Contains the response to a successful AssumeRoleWithClientGrants +// request, including temporary credentials that can be used to make MinIO API requests. +type ClientGrantsResult struct { + AssumedRoleUser AssumedRoleUser `xml:",omitempty"` + Audience string `xml:",omitempty"` + Credentials struct { + AccessKey string `xml:"AccessKeyId" json:"accessKey,omitempty"` + SecretKey string `xml:"SecretAccessKey" json:"secretKey,omitempty"` + Expiration time.Time `xml:"Expiration" json:"expiration,omitempty"` + SessionToken string `xml:"SessionToken" json:"sessionToken,omitempty"` + } `xml:",omitempty"` + PackedPolicySize int `xml:",omitempty"` + Provider string `xml:",omitempty"` + SubjectFromClientGrantsToken string `xml:",omitempty"` +} + +// ClientGrantsToken - client grants token with expiry. +type ClientGrantsToken struct { + Token string + Expiry int +} + +// A STSClientGrants retrieves credentials from MinIO service, and keeps track if +// those credentials are expired. +type STSClientGrants struct { + Expiry + + // Required http Client to use when connecting to MinIO STS service. + Client *http.Client + + // MinIO endpoint to fetch STS credentials. + stsEndpoint string + + // getClientGrantsTokenExpiry function to retrieve tokens + // from IDP This function should return two values one is + // accessToken which is a self contained access token (JWT) + // and second return value is the expiry associated with + // this token. This is a customer provided function and + // is mandatory. + getClientGrantsTokenExpiry func() (*ClientGrantsToken, error) +} + +// NewSTSClientGrants returns a pointer to a new +// Credentials object wrapping the STSClientGrants. +func NewSTSClientGrants(stsEndpoint string, getClientGrantsTokenExpiry func() (*ClientGrantsToken, error)) (*Credentials, error) { + if stsEndpoint == "" { + return nil, errors.New("STS endpoint cannot be empty") + } + if getClientGrantsTokenExpiry == nil { + return nil, errors.New("Client grants access token and expiry retrieval function should be defined") + } + return New(&STSClientGrants{ + Client: &http.Client{ + Transport: http.DefaultTransport, + }, + stsEndpoint: stsEndpoint, + getClientGrantsTokenExpiry: getClientGrantsTokenExpiry, + }), nil +} + +func getClientGrantsCredentials(clnt *http.Client, endpoint string, + getClientGrantsTokenExpiry func() (*ClientGrantsToken, error)) (AssumeRoleWithClientGrantsResponse, error) { + + accessToken, err := getClientGrantsTokenExpiry() + if err != nil { + return AssumeRoleWithClientGrantsResponse{}, err + } + + v := url.Values{} + v.Set("Action", "AssumeRoleWithClientGrants") + v.Set("Token", accessToken.Token) + v.Set("DurationSeconds", fmt.Sprintf("%d", accessToken.Expiry)) + v.Set("Version", "2011-06-15") + + u, err := url.Parse(endpoint) + if err != nil { + return AssumeRoleWithClientGrantsResponse{}, err + } + u.RawQuery = v.Encode() + + req, err := http.NewRequest(http.MethodPost, u.String(), nil) + if err != nil { + return AssumeRoleWithClientGrantsResponse{}, err + } + resp, err := clnt.Do(req) + if err != nil { + return AssumeRoleWithClientGrantsResponse{}, err + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return AssumeRoleWithClientGrantsResponse{}, errors.New(resp.Status) + } + + a := AssumeRoleWithClientGrantsResponse{} + if err = xml.NewDecoder(resp.Body).Decode(&a); err != nil { + return AssumeRoleWithClientGrantsResponse{}, err + } + return a, nil +} + +// Retrieve retrieves credentials from the MinIO service. +// Error will be returned if the request fails. +func (m *STSClientGrants) Retrieve() (Value, error) { + a, err := getClientGrantsCredentials(m.Client, m.stsEndpoint, m.getClientGrantsTokenExpiry) + if err != nil { + return Value{}, err + } + + // Expiry window is set to 10secs. + m.SetExpiration(a.Result.Credentials.Expiration, DefaultExpiryWindow) + + return Value{ + AccessKeyID: a.Result.Credentials.AccessKey, + SecretAccessKey: a.Result.Credentials.SecretKey, + SessionToken: a.Result.Credentials.SessionToken, + SignerType: SignatureV4, + }, nil +} diff --git a/vendor/github.com/minio/minio-go/v7/pkg/credentials/sts_ldap_identity.go b/vendor/github.com/minio/minio-go/v7/pkg/credentials/sts_ldap_identity.go new file mode 100644 index 000000000..abbf61641 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/pkg/credentials/sts_ldap_identity.go @@ -0,0 +1,119 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2019 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package credentials + +import ( + "encoding/xml" + "errors" + "net/http" + "net/url" + "time" +) + +// AssumeRoleWithLDAPResponse contains the result of successful +// AssumeRoleWithLDAPIdentity request +type AssumeRoleWithLDAPResponse struct { + XMLName xml.Name `xml:"https://sts.amazonaws.com/doc/2011-06-15/ AssumeRoleWithLDAPIdentityResponse" json:"-"` + Result LDAPIdentityResult `xml:"AssumeRoleWithLDAPIdentityResult"` + ResponseMetadata struct { + RequestID string `xml:"RequestId,omitempty"` + } `xml:"ResponseMetadata,omitempty"` +} + +// LDAPIdentityResult - contains credentials for a successful +// AssumeRoleWithLDAPIdentity request. +type LDAPIdentityResult struct { + Credentials struct { + AccessKey string `xml:"AccessKeyId" json:"accessKey,omitempty"` + SecretKey string `xml:"SecretAccessKey" json:"secretKey,omitempty"` + Expiration time.Time `xml:"Expiration" json:"expiration,omitempty"` + SessionToken string `xml:"SessionToken" json:"sessionToken,omitempty"` + } `xml:",omitempty"` + + SubjectFromToken string `xml:",omitempty"` +} + +// LDAPIdentity retrieves credentials from MinIO +type LDAPIdentity struct { + Expiry + + stsEndpoint string + + ldapUsername, ldapPassword string +} + +// NewLDAPIdentity returns new credentials object that uses LDAP +// Identity. +func NewLDAPIdentity(stsEndpoint, ldapUsername, ldapPassword string) (*Credentials, error) { + return New(&LDAPIdentity{ + stsEndpoint: stsEndpoint, + ldapUsername: ldapUsername, + ldapPassword: ldapPassword, + }), nil +} + +// Retrieve gets the credential by calling the MinIO STS API for +// LDAP on the configured stsEndpoint. +func (k *LDAPIdentity) Retrieve() (value Value, err error) { + u, kerr := url.Parse(k.stsEndpoint) + if kerr != nil { + err = kerr + return + } + + clnt := &http.Client{Transport: http.DefaultTransport} + v := url.Values{} + v.Set("Action", "AssumeRoleWithLDAPIdentity") + v.Set("Version", "2011-06-15") + v.Set("LDAPUsername", k.ldapUsername) + v.Set("LDAPPassword", k.ldapPassword) + + u.RawQuery = v.Encode() + + req, kerr := http.NewRequest(http.MethodPost, u.String(), nil) + if kerr != nil { + err = kerr + return + } + + resp, kerr := clnt.Do(req) + if kerr != nil { + err = kerr + return + } + + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + err = errors.New(resp.Status) + return + } + + r := AssumeRoleWithLDAPResponse{} + if err = xml.NewDecoder(resp.Body).Decode(&r); err != nil { + return + } + + cr := r.Result.Credentials + k.SetExpiration(cr.Expiration, DefaultExpiryWindow) + return Value{ + AccessKeyID: cr.AccessKey, + SecretAccessKey: cr.SecretKey, + SessionToken: cr.SessionToken, + SignerType: SignatureV4, + }, nil +} diff --git a/vendor/github.com/minio/minio-go/v7/pkg/credentials/sts_web_identity.go b/vendor/github.com/minio/minio-go/v7/pkg/credentials/sts_web_identity.go new file mode 100644 index 000000000..5a5f6405e --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/pkg/credentials/sts_web_identity.go @@ -0,0 +1,181 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2019 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package credentials + +import ( + "encoding/xml" + "errors" + "fmt" + "net/http" + "net/url" + "strconv" + "time" +) + +// AssumeRoleWithWebIdentityResponse contains the result of successful AssumeRoleWithWebIdentity request. +type AssumeRoleWithWebIdentityResponse struct { + XMLName xml.Name `xml:"https://sts.amazonaws.com/doc/2011-06-15/ AssumeRoleWithWebIdentityResponse" json:"-"` + Result WebIdentityResult `xml:"AssumeRoleWithWebIdentityResult"` + ResponseMetadata struct { + RequestID string `xml:"RequestId,omitempty"` + } `xml:"ResponseMetadata,omitempty"` +} + +// WebIdentityResult - Contains the response to a successful AssumeRoleWithWebIdentity +// request, including temporary credentials that can be used to make MinIO API requests. +type WebIdentityResult struct { + AssumedRoleUser AssumedRoleUser `xml:",omitempty"` + Audience string `xml:",omitempty"` + Credentials struct { + AccessKey string `xml:"AccessKeyId" json:"accessKey,omitempty"` + SecretKey string `xml:"SecretAccessKey" json:"secretKey,omitempty"` + Expiration time.Time `xml:"Expiration" json:"expiration,omitempty"` + SessionToken string `xml:"SessionToken" json:"sessionToken,omitempty"` + } `xml:",omitempty"` + PackedPolicySize int `xml:",omitempty"` + Provider string `xml:",omitempty"` + SubjectFromWebIdentityToken string `xml:",omitempty"` +} + +// WebIdentityToken - web identity token with expiry. +type WebIdentityToken struct { + Token string + Expiry int +} + +// A STSWebIdentity retrieves credentials from MinIO service, and keeps track if +// those credentials are expired. +type STSWebIdentity struct { + Expiry + + // Required http Client to use when connecting to MinIO STS service. + Client *http.Client + + // MinIO endpoint to fetch STS credentials. + stsEndpoint string + + // getWebIDTokenExpiry function which returns ID tokens + // from IDP. This function should return two values one + // is ID token which is a self contained ID token (JWT) + // and second return value is the expiry associated with + // this token. + // This is a customer provided function and is mandatory. + getWebIDTokenExpiry func() (*WebIdentityToken, error) + + // roleARN is the Amazon Resource Name (ARN) of the role that the caller is + // assuming. + roleARN string + + // roleSessionName is the identifier for the assumed role session. + roleSessionName string +} + +// NewSTSWebIdentity returns a pointer to a new +// Credentials object wrapping the STSWebIdentity. +func NewSTSWebIdentity(stsEndpoint string, getWebIDTokenExpiry func() (*WebIdentityToken, error)) (*Credentials, error) { + if stsEndpoint == "" { + return nil, errors.New("STS endpoint cannot be empty") + } + if getWebIDTokenExpiry == nil { + return nil, errors.New("Web ID token and expiry retrieval function should be defined") + } + return New(&STSWebIdentity{ + Client: &http.Client{ + Transport: http.DefaultTransport, + }, + stsEndpoint: stsEndpoint, + getWebIDTokenExpiry: getWebIDTokenExpiry, + }), nil +} + +func getWebIdentityCredentials(clnt *http.Client, endpoint, roleARN, roleSessionName string, + getWebIDTokenExpiry func() (*WebIdentityToken, error)) (AssumeRoleWithWebIdentityResponse, error) { + idToken, err := getWebIDTokenExpiry() + if err != nil { + return AssumeRoleWithWebIdentityResponse{}, err + } + + v := url.Values{} + v.Set("Action", "AssumeRoleWithWebIdentity") + if len(roleARN) > 0 { + v.Set("RoleArn", roleARN) + + if len(roleSessionName) == 0 { + roleSessionName = strconv.FormatInt(time.Now().UnixNano(), 10) + } + v.Set("RoleSessionName", roleSessionName) + } + v.Set("WebIdentityToken", idToken.Token) + if idToken.Expiry > 0 { + v.Set("DurationSeconds", fmt.Sprintf("%d", idToken.Expiry)) + } + v.Set("Version", "2011-06-15") + + u, err := url.Parse(endpoint) + if err != nil { + return AssumeRoleWithWebIdentityResponse{}, err + } + + u.RawQuery = v.Encode() + + req, err := http.NewRequest(http.MethodPost, u.String(), nil) + if err != nil { + return AssumeRoleWithWebIdentityResponse{}, err + } + + resp, err := clnt.Do(req) + if err != nil { + return AssumeRoleWithWebIdentityResponse{}, err + } + + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return AssumeRoleWithWebIdentityResponse{}, errors.New(resp.Status) + } + + a := AssumeRoleWithWebIdentityResponse{} + if err = xml.NewDecoder(resp.Body).Decode(&a); err != nil { + return AssumeRoleWithWebIdentityResponse{}, err + } + + return a, nil +} + +// Retrieve retrieves credentials from the MinIO service. +// Error will be returned if the request fails. +func (m *STSWebIdentity) Retrieve() (Value, error) { + a, err := getWebIdentityCredentials(m.Client, m.stsEndpoint, m.roleARN, m.roleSessionName, m.getWebIDTokenExpiry) + if err != nil { + return Value{}, err + } + + // Expiry window is set to 10secs. + m.SetExpiration(a.Result.Credentials.Expiration, DefaultExpiryWindow) + + return Value{ + AccessKeyID: a.Result.Credentials.AccessKey, + SecretAccessKey: a.Result.Credentials.SecretKey, + SessionToken: a.Result.Credentials.SessionToken, + SignerType: SignatureV4, + }, nil +} + +// Expiration returns the expiration time of the credentials +func (m *STSWebIdentity) Expiration() time.Time { + return m.expiration +} diff --git a/vendor/github.com/minio/minio-go/pkg/encrypt/server-side.go b/vendor/github.com/minio/minio-go/v7/pkg/encrypt/server-side.go similarity index 96% rename from vendor/github.com/minio/minio-go/pkg/encrypt/server-side.go rename to vendor/github.com/minio/minio-go/v7/pkg/encrypt/server-side.go index 2d3c70f00..5276f63fc 100644 --- a/vendor/github.com/minio/minio-go/pkg/encrypt/server-side.go +++ b/vendor/github.com/minio/minio-go/v7/pkg/encrypt/server-side.go @@ -1,6 +1,6 @@ /* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2018 Minio, Inc. + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2018 MinIO, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,10 +20,10 @@ package encrypt import ( "crypto/md5" "encoding/base64" - "encoding/json" "errors" "net/http" + jsoniter "github.com/json-iterator/go" "golang.org/x/crypto/argon2" ) @@ -101,6 +101,7 @@ func NewSSEKMS(keyID string, context interface{}) (ServerSide, error) { if context == nil { return kms{key: keyID, hasContext: false}, nil } + var json = jsoniter.ConfigCompatibleWithStandardLibrary serializedContext, err := json.Marshal(context) if err != nil { return nil, err @@ -188,7 +189,9 @@ func (s kms) Type() Type { return KMS } func (s kms) Marshal(h http.Header) { h.Set(sseGenericHeader, "aws:kms") - h.Set(sseKmsKeyID, s.key) + if s.key != "" { + h.Set(sseKmsKeyID, s.key) + } if s.hasContext { h.Set(sseEncryptionContext, base64.StdEncoding.EncodeToString(s.context)) } diff --git a/vendor/github.com/minio/minio-go/v7/pkg/lifecycle/lifecycle.go b/vendor/github.com/minio/minio-go/v7/pkg/lifecycle/lifecycle.go new file mode 100644 index 000000000..3493003f7 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/pkg/lifecycle/lifecycle.go @@ -0,0 +1,282 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2020 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Package lifecycle contains all the lifecycle related data types and marshallers. +package lifecycle + +import ( + "encoding/xml" + "time" +) + +// AbortIncompleteMultipartUpload structure, not supported yet on MinIO +type AbortIncompleteMultipartUpload struct { + XMLName xml.Name `xml:"AbortIncompleteMultipartUpload,omitempty" json:"-"` + DaysAfterInitiation ExpirationDays `xml:"DaysAfterInitiation,omitempty" json:"DaysAfterInitiation,omitempty"` +} + +// IsDaysNull returns true if days field is null +func (n AbortIncompleteMultipartUpload) IsDaysNull() bool { + return n.DaysAfterInitiation == ExpirationDays(0) +} + +// MarshalXML if days after initiation is set to non-zero value +func (n AbortIncompleteMultipartUpload) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + if n.IsDaysNull() { + return nil + } + type abortIncompleteMultipartUploadWrapper AbortIncompleteMultipartUpload + return e.EncodeElement(abortIncompleteMultipartUploadWrapper(n), start) +} + +// NoncurrentVersionExpiration - Specifies when noncurrent object versions expire. +// Upon expiration, server permanently deletes the noncurrent object versions. +// Set this lifecycle configuration action on a bucket that has versioning enabled +// (or suspended) to request server delete noncurrent object versions at a +// specific period in the object's lifetime. +type NoncurrentVersionExpiration struct { + XMLName xml.Name `xml:"NoncurrentVersionExpiration" json:"-"` + NoncurrentDays ExpirationDays `xml:"NoncurrentDays,omitempty"` +} + +// NoncurrentVersionTransition structure, set this action to request server to +// transition noncurrent object versions to different set storage classes +// at a specific period in the object's lifetime. +type NoncurrentVersionTransition struct { + XMLName xml.Name `xml:"NoncurrentVersionTransition,omitempty" json:"-"` + StorageClass string `xml:"StorageClass,omitempty" json:"StorageClass,omitempty"` + NoncurrentDays ExpirationDays `xml:"NoncurrentDays,omitempty" json:"NoncurrentDays,omitempty"` +} + +// MarshalXML if non-current days not set to non zero value +func (n NoncurrentVersionExpiration) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + if n.IsDaysNull() { + return nil + } + type noncurrentVersionExpirationWrapper NoncurrentVersionExpiration + return e.EncodeElement(noncurrentVersionExpirationWrapper(n), start) +} + +// IsDaysNull returns true if days field is null +func (n NoncurrentVersionExpiration) IsDaysNull() bool { + return n.NoncurrentDays == ExpirationDays(0) +} + +// MarshalXML is extended to leave out +// tags +func (n NoncurrentVersionTransition) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + if n.NoncurrentDays == ExpirationDays(0) { + return nil + } + return e.EncodeElement(&n, start) +} + +// Tag structure key/value pair representing an object tag to apply lifecycle configuration +type Tag struct { + XMLName xml.Name `xml:"Tag,omitempty" json:"-"` + Key string `xml:"Key,omitempty" json:"Key,omitempty"` + Value string `xml:"Value,omitempty" json:"Value,omitempty"` +} + +// IsEmpty returns whether this tag is empty or not. +func (tag Tag) IsEmpty() bool { + return tag.Key == "" +} + +// Transition structure - transition details of lifecycle configuration +type Transition struct { + XMLName xml.Name `xml:"Transition" json:"-"` + Date ExpirationDate `xml:"Date,omitempty" json:"Date,omitempty"` + StorageClass string `xml:"StorageClass,omitempty" json:"StorageClass,omitempty"` + Days ExpirationDays `xml:"Days,omitempty" json:"Days,omitempty"` +} + +// IsDaysNull returns true if days field is null +func (t Transition) IsDaysNull() bool { + return t.Days == ExpirationDays(0) +} + +// IsDateNull returns true if date field is null +func (t Transition) IsDateNull() bool { + return t.Date.Time.IsZero() +} + +// IsNull returns true if both date and days fields are null +func (t Transition) IsNull() bool { + return t.IsDaysNull() && t.IsDateNull() +} + +// MarshalXML is transition is non null +func (t Transition) MarshalXML(en *xml.Encoder, startElement xml.StartElement) error { + if t.IsNull() { + return nil + } + type transitionWrapper Transition + return en.EncodeElement(transitionWrapper(t), startElement) +} + +// And And Rule for LifecycleTag, to be used in LifecycleRuleFilter +type And struct { + XMLName xml.Name `xml:"And,omitempty" json:"-"` + Prefix string `xml:"Prefix,omitempty" json:"Prefix,omitempty"` + Tags []Tag `xml:"Tag,omitempty" json:"Tags,omitempty"` +} + +// IsEmpty returns true if Tags field is null +func (a And) IsEmpty() bool { + return len(a.Tags) == 0 && a.Prefix == "" +} + +// Filter will be used in selecting rule(s) for lifecycle configuration +type Filter struct { + XMLName xml.Name `xml:"Filter" json:"-"` + And And `xml:"And,omitempty" json:"And,omitempty"` + Prefix string `xml:"Prefix,omitempty" json:"Prefix,omitempty"` + Tag Tag `xml:"Tag,omitempty" json:"-"` +} + +// MarshalXML - produces the xml representation of the Filter struct +// only one of Prefix, And and Tag should be present in the output. +func (f Filter) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + if err := e.EncodeToken(start); err != nil { + return err + } + + switch { + case !f.And.IsEmpty(): + if err := e.EncodeElement(f.And, xml.StartElement{Name: xml.Name{Local: "And"}}); err != nil { + return err + } + case !f.Tag.IsEmpty(): + if err := e.EncodeElement(f.Tag, xml.StartElement{Name: xml.Name{Local: "Tag"}}); err != nil { + return err + } + default: + // Always print Prefix field when both And & Tag are empty + if err := e.EncodeElement(f.Prefix, xml.StartElement{Name: xml.Name{Local: "Prefix"}}); err != nil { + return err + } + } + + return e.EncodeToken(xml.EndElement{Name: start.Name}) +} + +// ExpirationDays is a type alias to unmarshal Days in Expiration +type ExpirationDays int + +// MarshalXML encodes number of days to expire if it is non-zero and +// encodes empty string otherwise +func (eDays ExpirationDays) MarshalXML(e *xml.Encoder, startElement xml.StartElement) error { + if eDays == 0 { + return nil + } + return e.EncodeElement(int(eDays), startElement) +} + +// ExpirationDate is a embedded type containing time.Time to unmarshal +// Date in Expiration +type ExpirationDate struct { + time.Time +} + +// MarshalXML encodes expiration date if it is non-zero and encodes +// empty string otherwise +func (eDate ExpirationDate) MarshalXML(e *xml.Encoder, startElement xml.StartElement) error { + if eDate.Time.IsZero() { + return nil + } + return e.EncodeElement(eDate.Format(time.RFC3339), startElement) +} + +// ExpireDeleteMarker represents value of ExpiredObjectDeleteMarker field in Expiration XML element. +type ExpireDeleteMarker bool + +// MarshalXML encodes delete marker boolean into an XML form. +func (b ExpireDeleteMarker) MarshalXML(e *xml.Encoder, startElement xml.StartElement) error { + if !b { + return nil + } + type expireDeleteMarkerWrapper ExpireDeleteMarker + return e.EncodeElement(expireDeleteMarkerWrapper(b), startElement) +} + +// Expiration structure - expiration details of lifecycle configuration +type Expiration struct { + XMLName xml.Name `xml:"Expiration,omitempty" json:"-"` + Date ExpirationDate `xml:"Date,omitempty" json:"Date,omitempty"` + Days ExpirationDays `xml:"Days,omitempty" json:"Days,omitempty"` + DeleteMarker ExpireDeleteMarker `xml:"ExpiredObjectDeleteMarker,omitempty"` +} + +// IsDaysNull returns true if days field is null +func (e Expiration) IsDaysNull() bool { + return e.Days == ExpirationDays(0) +} + +// IsDateNull returns true if date field is null +func (e Expiration) IsDateNull() bool { + return e.Date.Time.IsZero() +} + +// IsNull returns true if both date and days fields are null +func (e Expiration) IsNull() bool { + return e.IsDaysNull() && e.IsDateNull() +} + +// MarshalXML is expiration is non null +func (e Expiration) MarshalXML(en *xml.Encoder, startElement xml.StartElement) error { + if e.IsNull() { + return nil + } + type expirationWrapper Expiration + return en.EncodeElement(expirationWrapper(e), startElement) +} + +// Rule represents a single rule in lifecycle configuration +type Rule struct { + XMLName xml.Name `xml:"Rule,omitempty" json:"-"` + AbortIncompleteMultipartUpload AbortIncompleteMultipartUpload `xml:"AbortIncompleteMultipartUpload,omitempty" json:"AbortIncompleteMultipartUpload,omitempty"` + Expiration Expiration `xml:"Expiration,omitempty" json:"Expiration,omitempty"` + ID string `xml:"ID" json:"ID"` + RuleFilter Filter `xml:"Filter,omitempty" json:"Filter,omitempty"` + NoncurrentVersionExpiration NoncurrentVersionExpiration `xml:"NoncurrentVersionExpiration,omitempty" json:"NoncurrentVersionExpiration,omitempty"` + NoncurrentVersionTransition NoncurrentVersionTransition `xml:"NoncurrentVersionTransition,omitempty" json:"NoncurrentVersionTransition,omitempty"` + Prefix string `xml:"Prefix,omitempty" json:"Prefix,omitempty"` + Status string `xml:"Status" json:"Status"` + Transition Transition `xml:"Transition,omitempty" json:"Transition,omitempty"` +} + +// Configuration is a collection of Rule objects. +type Configuration struct { + XMLName xml.Name `xml:"LifecycleConfiguration,omitempty" json:"-"` + Rules []Rule `xml:"Rule"` +} + +// Empty check if lifecycle configuration is empty +func (c *Configuration) Empty() bool { + if c == nil { + return true + } + return len(c.Rules) == 0 +} + +// NewConfiguration initializes a fresh lifecycle configuration +// for manipulation, such as setting and removing lifecycle rules +// and filters. +func NewConfiguration() *Configuration { + return &Configuration{} +} diff --git a/vendor/github.com/minio/minio-go/v7/pkg/notification/info.go b/vendor/github.com/minio/minio-go/v7/pkg/notification/info.go new file mode 100644 index 000000000..d0a471638 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/pkg/notification/info.go @@ -0,0 +1,78 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2017-2020 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package notification + +// Indentity represents the user id, this is a compliance field. +type identity struct { + PrincipalID string `json:"principalId"` +} + +// event bucket metadata. +type bucketMeta struct { + Name string `json:"name"` + OwnerIdentity identity `json:"ownerIdentity"` + ARN string `json:"arn"` +} + +// event object metadata. +type objectMeta struct { + Key string `json:"key"` + Size int64 `json:"size,omitempty"` + ETag string `json:"eTag,omitempty"` + ContentType string `json:"contentType,omitempty"` + UserMetadata map[string]string `json:"userMetadata,omitempty"` + VersionID string `json:"versionId,omitempty"` + Sequencer string `json:"sequencer"` +} + +// event server specific metadata. +type eventMeta struct { + SchemaVersion string `json:"s3SchemaVersion"` + ConfigurationID string `json:"configurationId"` + Bucket bucketMeta `json:"bucket"` + Object objectMeta `json:"object"` +} + +// sourceInfo represents information on the client that +// triggered the event notification. +type sourceInfo struct { + Host string `json:"host"` + Port string `json:"port"` + UserAgent string `json:"userAgent"` +} + +// Event represents an Amazon an S3 bucket notification event. +type Event struct { + EventVersion string `json:"eventVersion"` + EventSource string `json:"eventSource"` + AwsRegion string `json:"awsRegion"` + EventTime string `json:"eventTime"` + EventName string `json:"eventName"` + UserIdentity identity `json:"userIdentity"` + RequestParameters map[string]string `json:"requestParameters"` + ResponseElements map[string]string `json:"responseElements"` + S3 eventMeta `json:"s3"` + Source sourceInfo `json:"source"` +} + +// Info - represents the collection of notification events, additionally +// also reports errors if any while listening on bucket notifications. +type Info struct { + Records []Event + Err error +} diff --git a/vendor/github.com/minio/minio-go/v7/pkg/notification/notification.go b/vendor/github.com/minio/minio-go/v7/pkg/notification/notification.go new file mode 100644 index 000000000..55c58cb3b --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/pkg/notification/notification.go @@ -0,0 +1,385 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2020 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package notification + +import ( + "encoding/xml" + "errors" + "fmt" + + "github.com/minio/minio-go/v7/pkg/set" +) + +// EventType is a S3 notification event associated to the bucket notification configuration +type EventType string + +// The role of all event types are described in : +// http://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html#notification-how-to-event-types-and-destinations +const ( + ObjectCreatedAll EventType = "s3:ObjectCreated:*" + ObjectCreatedPut = "s3:ObjectCreated:Put" + ObjectCreatedPost = "s3:ObjectCreated:Post" + ObjectCreatedCopy = "s3:ObjectCreated:Copy" + ObjectCreatedCompleteMultipartUpload = "s3:ObjectCreated:CompleteMultipartUpload" + ObjectAccessedGet = "s3:ObjectAccessed:Get" + ObjectAccessedHead = "s3:ObjectAccessed:Head" + ObjectAccessedAll = "s3:ObjectAccessed:*" + ObjectRemovedAll = "s3:ObjectRemoved:*" + ObjectRemovedDelete = "s3:ObjectRemoved:Delete" + ObjectRemovedDeleteMarkerCreated = "s3:ObjectRemoved:DeleteMarkerCreated" + ObjectReducedRedundancyLostObject = "s3:ReducedRedundancyLostObject" +) + +// FilterRule - child of S3Key, a tag in the notification xml which +// carries suffix/prefix filters +type FilterRule struct { + Name string `xml:"Name"` + Value string `xml:"Value"` +} + +// S3Key - child of Filter, a tag in the notification xml which +// carries suffix/prefix filters +type S3Key struct { + FilterRules []FilterRule `xml:"FilterRule,omitempty"` +} + +// Filter - a tag in the notification xml structure which carries +// suffix/prefix filters +type Filter struct { + S3Key S3Key `xml:"S3Key,omitempty"` +} + +// Arn - holds ARN information that will be sent to the web service, +// ARN desciption can be found in http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html +type Arn struct { + Partition string + Service string + Region string + AccountID string + Resource string +} + +// NewArn creates new ARN based on the given partition, service, region, account id and resource +func NewArn(partition, service, region, accountID, resource string) Arn { + return Arn{Partition: partition, + Service: service, + Region: region, + AccountID: accountID, + Resource: resource} +} + +// String returns the string format of the ARN +func (arn Arn) String() string { + return "arn:" + arn.Partition + ":" + arn.Service + ":" + arn.Region + ":" + arn.AccountID + ":" + arn.Resource +} + +// Config - represents one single notification configuration +// such as topic, queue or lambda configuration. +type Config struct { + ID string `xml:"Id,omitempty"` + Arn Arn `xml:"-"` + Events []EventType `xml:"Event"` + Filter *Filter `xml:"Filter,omitempty"` +} + +// NewConfig creates one notification config and sets the given ARN +func NewConfig(arn Arn) Config { + return Config{Arn: arn, Filter: &Filter{}} +} + +// AddEvents adds one event to the current notification config +func (t *Config) AddEvents(events ...EventType) { + t.Events = append(t.Events, events...) +} + +// AddFilterSuffix sets the suffix configuration to the current notification config +func (t *Config) AddFilterSuffix(suffix string) { + if t.Filter == nil { + t.Filter = &Filter{} + } + newFilterRule := FilterRule{Name: "suffix", Value: suffix} + // Replace any suffix rule if existing and add to the list otherwise + for index := range t.Filter.S3Key.FilterRules { + if t.Filter.S3Key.FilterRules[index].Name == "suffix" { + t.Filter.S3Key.FilterRules[index] = newFilterRule + return + } + } + t.Filter.S3Key.FilterRules = append(t.Filter.S3Key.FilterRules, newFilterRule) +} + +// AddFilterPrefix sets the prefix configuration to the current notification config +func (t *Config) AddFilterPrefix(prefix string) { + if t.Filter == nil { + t.Filter = &Filter{} + } + newFilterRule := FilterRule{Name: "prefix", Value: prefix} + // Replace any prefix rule if existing and add to the list otherwise + for index := range t.Filter.S3Key.FilterRules { + if t.Filter.S3Key.FilterRules[index].Name == "prefix" { + t.Filter.S3Key.FilterRules[index] = newFilterRule + return + } + } + t.Filter.S3Key.FilterRules = append(t.Filter.S3Key.FilterRules, newFilterRule) +} + +// EqualEventTypeList tells whether a and b contain the same events +func EqualEventTypeList(a, b []EventType) bool { + if len(a) != len(b) { + return false + } + setA := set.NewStringSet() + for _, i := range a { + setA.Add(string(i)) + } + + setB := set.NewStringSet() + for _, i := range b { + setB.Add(string(i)) + } + + return setA.Difference(setB).IsEmpty() +} + +// EqualFilterRuleList tells whether a and b contain the same filters +func EqualFilterRuleList(a, b []FilterRule) bool { + if len(a) != len(b) { + return false + } + + setA := set.NewStringSet() + for _, i := range a { + setA.Add(fmt.Sprintf("%s-%s", i.Name, i.Value)) + } + + setB := set.NewStringSet() + for _, i := range b { + setB.Add(fmt.Sprintf("%s-%s", i.Name, i.Value)) + } + + return setA.Difference(setB).IsEmpty() +} + +// Equal returns whether this `Config` is equal to another defined by the passed parameters +func (t *Config) Equal(events []EventType, prefix, suffix string) bool { + //Compare events + passEvents := EqualEventTypeList(t.Events, events) + + //Compare filters + var newFilter []FilterRule + if prefix != "" { + newFilter = append(newFilter, FilterRule{Name: "prefix", Value: prefix}) + } + if suffix != "" { + newFilter = append(newFilter, FilterRule{Name: "suffix", Value: suffix}) + } + + passFilters := EqualFilterRuleList(t.Filter.S3Key.FilterRules, newFilter) + // if it matches events and filters, mark the index for deletion + return passEvents && passFilters +} + +// TopicConfig carries one single topic notification configuration +type TopicConfig struct { + Config + Topic string `xml:"Topic"` +} + +// QueueConfig carries one single queue notification configuration +type QueueConfig struct { + Config + Queue string `xml:"Queue"` +} + +// LambdaConfig carries one single cloudfunction notification configuration +type LambdaConfig struct { + Config + Lambda string `xml:"CloudFunction"` +} + +// Configuration - the struct that represents the whole XML to be sent to the web service +type Configuration struct { + XMLName xml.Name `xml:"NotificationConfiguration"` + LambdaConfigs []LambdaConfig `xml:"CloudFunctionConfiguration"` + TopicConfigs []TopicConfig `xml:"TopicConfiguration"` + QueueConfigs []QueueConfig `xml:"QueueConfiguration"` +} + +// AddTopic adds a given topic config to the general bucket notification config +func (b *Configuration) AddTopic(topicConfig Config) bool { + newTopicConfig := TopicConfig{Config: topicConfig, Topic: topicConfig.Arn.String()} + for _, n := range b.TopicConfigs { + // If new config matches existing one + if n.Topic == newTopicConfig.Arn.String() && newTopicConfig.Filter == n.Filter { + + existingConfig := set.NewStringSet() + for _, v := range n.Events { + existingConfig.Add(string(v)) + } + + newConfig := set.NewStringSet() + for _, v := range topicConfig.Events { + newConfig.Add(string(v)) + } + + if !newConfig.Intersection(existingConfig).IsEmpty() { + return false + } + } + } + b.TopicConfigs = append(b.TopicConfigs, newTopicConfig) + return true +} + +// AddQueue adds a given queue config to the general bucket notification config +func (b *Configuration) AddQueue(queueConfig Config) bool { + newQueueConfig := QueueConfig{Config: queueConfig, Queue: queueConfig.Arn.String()} + for _, n := range b.QueueConfigs { + if n.Queue == newQueueConfig.Arn.String() && newQueueConfig.Filter == n.Filter { + + existingConfig := set.NewStringSet() + for _, v := range n.Events { + existingConfig.Add(string(v)) + } + + newConfig := set.NewStringSet() + for _, v := range queueConfig.Events { + newConfig.Add(string(v)) + } + + if !newConfig.Intersection(existingConfig).IsEmpty() { + return false + } + } + } + b.QueueConfigs = append(b.QueueConfigs, newQueueConfig) + return true +} + +// AddLambda adds a given lambda config to the general bucket notification config +func (b *Configuration) AddLambda(lambdaConfig Config) bool { + newLambdaConfig := LambdaConfig{Config: lambdaConfig, Lambda: lambdaConfig.Arn.String()} + for _, n := range b.LambdaConfigs { + if n.Lambda == newLambdaConfig.Arn.String() && newLambdaConfig.Filter == n.Filter { + + existingConfig := set.NewStringSet() + for _, v := range n.Events { + existingConfig.Add(string(v)) + } + + newConfig := set.NewStringSet() + for _, v := range lambdaConfig.Events { + newConfig.Add(string(v)) + } + + if !newConfig.Intersection(existingConfig).IsEmpty() { + return false + } + } + } + b.LambdaConfigs = append(b.LambdaConfigs, newLambdaConfig) + return true +} + +// RemoveTopicByArn removes all topic configurations that match the exact specified ARN +func (b *Configuration) RemoveTopicByArn(arn Arn) { + var topics []TopicConfig + for _, topic := range b.TopicConfigs { + if topic.Topic != arn.String() { + topics = append(topics, topic) + } + } + b.TopicConfigs = topics +} + +// ErrNoConfigMatch is returned when a notification configuration (sqs,sns,lambda) is not found when trying to delete +var ErrNoConfigMatch = errors.New("no notification configuration matched") + +// RemoveTopicByArnEventsPrefixSuffix removes a topic configuration that match the exact specified ARN, events, prefix and suffix +func (b *Configuration) RemoveTopicByArnEventsPrefixSuffix(arn Arn, events []EventType, prefix, suffix string) error { + removeIndex := -1 + for i, v := range b.TopicConfigs { + // if it matches events and filters, mark the index for deletion + if v.Topic == arn.String() && v.Config.Equal(events, prefix, suffix) { + removeIndex = i + break // since we have at most one matching config + } + } + if removeIndex >= 0 { + b.TopicConfigs = append(b.TopicConfigs[:removeIndex], b.TopicConfigs[removeIndex+1:]...) + return nil + } + return ErrNoConfigMatch +} + +// RemoveQueueByArn removes all queue configurations that match the exact specified ARN +func (b *Configuration) RemoveQueueByArn(arn Arn) { + var queues []QueueConfig + for _, queue := range b.QueueConfigs { + if queue.Queue != arn.String() { + queues = append(queues, queue) + } + } + b.QueueConfigs = queues +} + +// RemoveQueueByArnEventsPrefixSuffix removes a queue configuration that match the exact specified ARN, events, prefix and suffix +func (b *Configuration) RemoveQueueByArnEventsPrefixSuffix(arn Arn, events []EventType, prefix, suffix string) error { + removeIndex := -1 + for i, v := range b.QueueConfigs { + // if it matches events and filters, mark the index for deletion + if v.Queue == arn.String() && v.Config.Equal(events, prefix, suffix) { + removeIndex = i + break // since we have at most one matching config + } + } + if removeIndex >= 0 { + b.QueueConfigs = append(b.QueueConfigs[:removeIndex], b.QueueConfigs[removeIndex+1:]...) + return nil + } + return ErrNoConfigMatch +} + +// RemoveLambdaByArn removes all lambda configurations that match the exact specified ARN +func (b *Configuration) RemoveLambdaByArn(arn Arn) { + var lambdas []LambdaConfig + for _, lambda := range b.LambdaConfigs { + if lambda.Lambda != arn.String() { + lambdas = append(lambdas, lambda) + } + } + b.LambdaConfigs = lambdas +} + +// RemoveLambdaByArnEventsPrefixSuffix removes a topic configuration that match the exact specified ARN, events, prefix and suffix +func (b *Configuration) RemoveLambdaByArnEventsPrefixSuffix(arn Arn, events []EventType, prefix, suffix string) error { + removeIndex := -1 + for i, v := range b.LambdaConfigs { + // if it matches events and filters, mark the index for deletion + if v.Lambda == arn.String() && v.Config.Equal(events, prefix, suffix) { + removeIndex = i + break // since we have at most one matching config + } + } + if removeIndex >= 0 { + b.LambdaConfigs = append(b.LambdaConfigs[:removeIndex], b.LambdaConfigs[removeIndex+1:]...) + return nil + } + return ErrNoConfigMatch +} diff --git a/vendor/github.com/minio/minio-go/v7/pkg/replication/replication.go b/vendor/github.com/minio/minio-go/v7/pkg/replication/replication.go new file mode 100644 index 000000000..fdd0afbc8 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/pkg/replication/replication.go @@ -0,0 +1,498 @@ +/* + * MinIO Client (C) 2020 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package replication + +import ( + "bytes" + "encoding/xml" + "fmt" + "strconv" + "strings" + "unicode/utf8" + + "github.com/rs/xid" +) + +var errInvalidFilter = fmt.Errorf("Invalid filter") + +// OptionType specifies operation to be performed on config +type OptionType string + +const ( + // AddOption specifies addition of rule to config + AddOption OptionType = "Add" + // SetOption specifies modification of existing rule to config + SetOption OptionType = "Set" + + // RemoveOption specifies rule options are for removing a rule + RemoveOption OptionType = "Remove" + // ImportOption is for getting current config + ImportOption OptionType = "Import" +) + +// Options represents options to set a replication configuration rule +type Options struct { + Op OptionType + ID string + Prefix string + RuleStatus string + Priority string + TagString string + StorageClass string + RoleArn string + DestBucket string + IsTagSet bool + IsSCSet bool +} + +// Tags returns a slice of tags for a rule +func (opts Options) Tags() []Tag { + var tagList []Tag + tagTokens := strings.Split(opts.TagString, "&") + for _, tok := range tagTokens { + if tok == "" { + break + } + kv := strings.SplitN(tok, "=", 2) + tagList = append(tagList, Tag{ + Key: kv[0], + Value: kv[1], + }) + } + return tagList +} + +// Config - replication configuration specified in +// https://docs.aws.amazon.com/AmazonS3/latest/dev/replication-add-config.html +type Config struct { + XMLName xml.Name `xml:"ReplicationConfiguration" json:"-"` + Rules []Rule `xml:"Rule" json:"Rules"` + Role string `xml:"Role" json:"Role"` +} + +// Empty returns true if config is not set +func (c *Config) Empty() bool { + return len(c.Rules) == 0 +} + +// AddRule adds a new rule to existing replication config. If a rule exists with the +// same ID, then the rule is replaced. +func (c *Config) AddRule(opts Options) error { + priority, err := strconv.Atoi(opts.Priority) + if err != nil { + return err + } + if opts.RoleArn != c.Role && c.Role != "" { + return fmt.Errorf("Role ARN does not match existing configuration") + } + var status Status + // toggle rule status for edit option + switch opts.RuleStatus { + case "enable": + status = Enabled + case "disable": + status = Disabled + default: + return fmt.Errorf("Rule state should be either [enable|disable]") + } + + tags := opts.Tags() + andVal := And{ + Tags: opts.Tags(), + } + filter := Filter{Prefix: opts.Prefix} + // only a single tag is set. + if opts.Prefix == "" && len(tags) == 1 { + filter.Tag = tags[0] + } + // both prefix and tag are present + if len(andVal.Tags) > 1 || opts.Prefix != "" { + filter.And = andVal + filter.And.Prefix = opts.Prefix + filter.Prefix = "" + filter.Tag = Tag{} + } + if opts.ID == "" { + opts.ID = xid.New().String() + } + arnStr := opts.RoleArn + if opts.RoleArn == "" { + arnStr = c.Role + } + if arnStr == "" { + return fmt.Errorf("Role ARN required") + } + tokens := strings.Split(arnStr, ":") + if len(tokens) != 6 { + return fmt.Errorf("invalid format for replication Arn") + } + if c.Role == "" { + c.Role = arnStr + } + destBucket := opts.DestBucket + // ref https://docs.aws.amazon.com/AmazonS3/latest/dev/s3-arn-format.html + if btokens := strings.Split(destBucket, ":"); len(btokens) != 6 { + if len(btokens) == 1 { + destBucket = fmt.Sprintf("arn:aws:s3:::%s", destBucket) + } else { + return fmt.Errorf("destination bucket needs to be in Arn format") + } + } + newRule := Rule{ + ID: opts.ID, + Priority: priority, + Status: status, + Filter: filter, + Destination: Destination{ + Bucket: destBucket, + StorageClass: opts.StorageClass, + }, + DeleteMarkerReplication: DeleteMarkerReplication{Status: Disabled}, + } + + // validate rule after overlaying priority for pre-existing rule being disabled. + if err := newRule.Validate(); err != nil { + return err + } + for _, rule := range c.Rules { + if rule.Priority == newRule.Priority { + return fmt.Errorf("Priority must be unique. Replication configuration already has a rule with this priority") + } + if rule.Destination.Bucket != newRule.Destination.Bucket { + return fmt.Errorf("The destination bucket must be same for all rules") + } + if rule.ID == newRule.ID { + return fmt.Errorf("A rule exists with this ID") + } + } + + c.Rules = append(c.Rules, newRule) + return nil +} + +// EditRule modifies an existing rule in replication config +func (c *Config) EditRule(opts Options) error { + if opts.ID == "" { + return fmt.Errorf("Rule ID missing") + } + rIdx := -1 + var newRule Rule + for i, rule := range c.Rules { + if rule.ID == opts.ID { + rIdx = i + newRule = rule + break + } + } + if rIdx < 0 { + return fmt.Errorf("Rule with ID %s not found in replication configuration", opts.ID) + } + prefixChg := opts.Prefix != newRule.Prefix() + if opts.IsTagSet || prefixChg { + prefix := newRule.Prefix() + if prefix != opts.Prefix { + prefix = opts.Prefix + } + tags := []Tag{newRule.Filter.Tag} + if len(newRule.Filter.And.Tags) != 0 { + tags = newRule.Filter.And.Tags + } + if opts.IsTagSet { + tags = opts.Tags() + } + andVal := And{ + Tags: tags, + } + + filter := Filter{Prefix: prefix} + // only a single tag is set. + if prefix == "" && len(tags) == 1 { + filter.Tag = tags[0] + } + // both prefix and tag are present + if len(andVal.Tags) > 1 || prefix != "" { + filter.And = andVal + filter.And.Prefix = prefix + filter.Prefix = "" + filter.Tag = Tag{} + } + newRule.Filter = filter + } + + // toggle rule status for edit option + if opts.RuleStatus != "" { + switch opts.RuleStatus { + case "enable": + newRule.Status = Enabled + case "disable": + newRule.Status = Disabled + default: + return fmt.Errorf("Rule state should be either [enable|disable]") + } + } + + if opts.IsSCSet { + newRule.Destination.StorageClass = opts.StorageClass + } + if opts.Priority != "" { + priority, err := strconv.Atoi(opts.Priority) + if err != nil { + return err + } + newRule.Priority = priority + } + if opts.DestBucket != "" { + destBucket := opts.DestBucket + // ref https://docs.aws.amazon.com/AmazonS3/latest/dev/s3-arn-format.html + if btokens := strings.Split(opts.DestBucket, ":"); len(btokens) != 6 { + if len(btokens) == 1 { + destBucket = fmt.Sprintf("arn:aws:s3:::%s", destBucket) + } else { + return fmt.Errorf("destination bucket needs to be in Arn format") + } + } + newRule.Destination.Bucket = destBucket + } + // validate rule + if err := newRule.Validate(); err != nil { + return err + } + // ensure priority and destination bucket restrictions are not violated + for idx, rule := range c.Rules { + if rule.Priority == newRule.Priority && rIdx != idx { + return fmt.Errorf("Priority must be unique. Replication configuration already has a rule with this priority") + } + if rule.Destination.Bucket != newRule.Destination.Bucket { + return fmt.Errorf("The destination bucket must be same for all rules") + } + } + + c.Rules[rIdx] = newRule + return nil +} + +// RemoveRule removes a rule from replication config. +func (c *Config) RemoveRule(opts Options) error { + var newRules []Rule + ruleFound := false + for _, rule := range c.Rules { + if rule.ID != opts.ID { + newRules = append(newRules, rule) + continue + } + ruleFound = true + } + if !ruleFound { + return fmt.Errorf("Rule with ID %s not found", opts.ID) + } + if len(newRules) == 0 { + return fmt.Errorf("Replication configuration should have at least one rule") + } + c.Rules = newRules + return nil + +} + +// Rule - a rule for replication configuration. +type Rule struct { + XMLName xml.Name `xml:"Rule" json:"-"` + ID string `xml:"ID,omitempty"` + Status Status `xml:"Status"` + Priority int `xml:"Priority"` + DeleteMarkerReplication DeleteMarkerReplication `xml:"DeleteMarkerReplication"` + Destination Destination `xml:"Destination"` + Filter Filter `xml:"Filter" json:"Filter"` +} + +// Validate validates the rule for correctness +func (r Rule) Validate() error { + if err := r.validateID(); err != nil { + return err + } + if err := r.validateStatus(); err != nil { + return err + } + if err := r.validateFilter(); err != nil { + return err + } + + if r.Priority < 0 && r.Status == Enabled { + return fmt.Errorf("Priority must be set for the rule") + } + + return nil +} + +// validateID - checks if ID is valid or not. +func (r Rule) validateID() error { + // cannot be longer than 255 characters + if len(r.ID) > 255 { + return fmt.Errorf("ID must be less than 255 characters") + } + return nil +} + +// validateStatus - checks if status is valid or not. +func (r Rule) validateStatus() error { + // Status can't be empty + if len(r.Status) == 0 { + return fmt.Errorf("status cannot be empty") + } + + // Status must be one of Enabled or Disabled + if r.Status != Enabled && r.Status != Disabled { + return fmt.Errorf("status must be set to either Enabled or Disabled") + } + return nil +} + +func (r Rule) validateFilter() error { + if err := r.Filter.Validate(); err != nil { + return err + } + return nil +} + +// Prefix - a rule can either have prefix under or under +// . This method returns the prefix from the +// location where it is available +func (r Rule) Prefix() string { + if r.Filter.Prefix != "" { + return r.Filter.Prefix + } + return r.Filter.And.Prefix +} + +// Tags - a rule can either have tag under or under +// . This method returns all the tags from the +// rule in the format tag1=value1&tag2=value2 +func (r Rule) Tags() string { + ts := []Tag{r.Filter.Tag} + if len(r.Filter.And.Tags) != 0 { + ts = r.Filter.And.Tags + } + + var buf bytes.Buffer + for _, t := range ts { + if buf.Len() > 0 { + buf.WriteString("&") + } + buf.WriteString(t.String()) + } + return buf.String() +} + +// Filter - a filter for a replication configuration Rule. +type Filter struct { + XMLName xml.Name `xml:"Filter" json:"-"` + Prefix string `json:"Prefix,omitempty"` + And And `xml:"And,omitempty" json:"And,omitempty"` + Tag Tag `xml:"Tag,omitempty" json:"Tag,omitempty"` +} + +// Validate - validates the filter element +func (f Filter) Validate() error { + // A Filter must have exactly one of Prefix, Tag, or And specified. + if !f.And.isEmpty() { + if f.Prefix != "" { + return errInvalidFilter + } + if !f.Tag.IsEmpty() { + return errInvalidFilter + } + } + if f.Prefix != "" { + if !f.Tag.IsEmpty() { + return errInvalidFilter + } + } + if !f.Tag.IsEmpty() { + if err := f.Tag.Validate(); err != nil { + return err + } + } + return nil +} + +// Tag - a tag for a replication configuration Rule filter. +type Tag struct { + XMLName xml.Name `json:"-"` + Key string `xml:"Key,omitempty" json:"Key,omitempty"` + Value string `xml:"Value,omitempty" json:"Value,omitempty"` +} + +func (tag Tag) String() string { + if tag.IsEmpty() { + return "" + } + return tag.Key + "=" + tag.Value +} + +// IsEmpty returns whether this tag is empty or not. +func (tag Tag) IsEmpty() bool { + return tag.Key == "" +} + +// Validate checks this tag. +func (tag Tag) Validate() error { + if len(tag.Key) == 0 || utf8.RuneCountInString(tag.Key) > 128 { + return fmt.Errorf("Invalid Tag Key") + } + + if utf8.RuneCountInString(tag.Value) > 256 { + return fmt.Errorf("Invalid Tag Value") + } + return nil +} + +// Destination - destination in ReplicationConfiguration. +type Destination struct { + XMLName xml.Name `xml:"Destination" json:"-"` + Bucket string `xml:"Bucket" json:"Bucket"` + StorageClass string `xml:"StorageClass,omitempty" json:"StorageClass,omitempty"` +} + +// And - a tag to combine a prefix and multiple tags for replication configuration rule. +type And struct { + XMLName xml.Name `xml:"And,omitempty" json:"-"` + Prefix string `xml:"Prefix,omitempty" json:"Prefix,omitempty"` + Tags []Tag `xml:"Tags,omitempty" json:"Tags,omitempty"` +} + +// isEmpty returns true if Tags field is null +func (a And) isEmpty() bool { + return len(a.Tags) == 0 && a.Prefix == "" +} + +// Status represents Enabled/Disabled status +type Status string + +// Supported status types +const ( + Enabled Status = "Enabled" + Disabled Status = "Disabled" +) + +// DeleteMarkerReplication - whether delete markers are replicated - https://docs.aws.amazon.com/AmazonS3/latest/dev/replication-add-config.html +type DeleteMarkerReplication struct { + Status Status `xml:"Status" json:"Status"` // should be set to "Disabled" by default +} + +// IsEmpty returns true if DeleteMarkerReplication is not set +func (d DeleteMarkerReplication) IsEmpty() bool { + return len(d.Status) == 0 +} diff --git a/vendor/github.com/minio/minio-go/v7/pkg/s3utils/utils.go b/vendor/github.com/minio/minio-go/v7/pkg/s3utils/utils.go new file mode 100644 index 000000000..65f939253 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/pkg/s3utils/utils.go @@ -0,0 +1,384 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2020 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package s3utils + +import ( + "bytes" + "encoding/hex" + "errors" + "net" + "net/url" + "regexp" + "sort" + "strings" + "unicode/utf8" +) + +// Sentinel URL is the default url value which is invalid. +var sentinelURL = url.URL{} + +// IsValidDomain validates if input string is a valid domain name. +func IsValidDomain(host string) bool { + // See RFC 1035, RFC 3696. + host = strings.TrimSpace(host) + if len(host) == 0 || len(host) > 255 { + return false + } + // host cannot start or end with "-" + if host[len(host)-1:] == "-" || host[:1] == "-" { + return false + } + // host cannot start or end with "_" + if host[len(host)-1:] == "_" || host[:1] == "_" { + return false + } + // host cannot start with a "." + if host[:1] == "." { + return false + } + // All non alphanumeric characters are invalid. + if strings.ContainsAny(host, "`~!@#$%^&*()+={}[]|\\\"';:> 1 { + return parts[1] + } + parts = amazonS3HostHyphen.FindStringSubmatch(endpointURL.Host) + if len(parts) > 1 { + return parts[1] + } + parts = amazonS3ChinaHost.FindStringSubmatch(endpointURL.Host) + if len(parts) > 1 { + return parts[1] + } + parts = amazonS3HostDot.FindStringSubmatch(endpointURL.Host) + if len(parts) > 1 { + return parts[1] + } + return "" +} + +// IsAliyunOSSEndpoint - Match if it is exactly Aliyun OSS endpoint. +func IsAliyunOSSEndpoint(endpointURL url.URL) bool { + return strings.HasSuffix(endpointURL.Host, "aliyuncs.com") +} + +// IsAmazonEndpoint - Match if it is exactly Amazon S3 endpoint. +func IsAmazonEndpoint(endpointURL url.URL) bool { + if endpointURL.Host == "s3-external-1.amazonaws.com" || endpointURL.Host == "s3.amazonaws.com" { + return true + } + return GetRegionFromURL(endpointURL) != "" +} + +// IsAmazonGovCloudEndpoint - Match if it is exactly Amazon S3 GovCloud endpoint. +func IsAmazonGovCloudEndpoint(endpointURL url.URL) bool { + if endpointURL == sentinelURL { + return false + } + return (endpointURL.Host == "s3-us-gov-west-1.amazonaws.com" || + IsAmazonFIPSGovCloudEndpoint(endpointURL)) +} + +// IsAmazonFIPSGovCloudEndpoint - Match if it is exactly Amazon S3 FIPS GovCloud endpoint. +// See https://aws.amazon.com/compliance/fips. +func IsAmazonFIPSGovCloudEndpoint(endpointURL url.URL) bool { + if endpointURL == sentinelURL { + return false + } + return endpointURL.Host == "s3-fips-us-gov-west-1.amazonaws.com" || + endpointURL.Host == "s3-fips.dualstack.us-gov-west-1.amazonaws.com" +} + +// IsAmazonFIPSUSEastWestEndpoint - Match if it is exactly Amazon S3 FIPS US East/West endpoint. +// See https://aws.amazon.com/compliance/fips. +func IsAmazonFIPSUSEastWestEndpoint(endpointURL url.URL) bool { + if endpointURL == sentinelURL { + return false + } + switch endpointURL.Host { + case "s3-fips.us-east-2.amazonaws.com": + case "s3-fips.dualstack.us-west-1.amazonaws.com": + case "s3-fips.dualstack.us-west-2.amazonaws.com": + case "s3-fips.dualstack.us-east-2.amazonaws.com": + case "s3-fips.dualstack.us-east-1.amazonaws.com": + case "s3-fips.us-west-1.amazonaws.com": + case "s3-fips.us-west-2.amazonaws.com": + case "s3-fips.us-east-1.amazonaws.com": + default: + return false + } + return true +} + +// IsAmazonFIPSEndpoint - Match if it is exactly Amazon S3 FIPS endpoint. +// See https://aws.amazon.com/compliance/fips. +func IsAmazonFIPSEndpoint(endpointURL url.URL) bool { + return IsAmazonFIPSUSEastWestEndpoint(endpointURL) || IsAmazonFIPSGovCloudEndpoint(endpointURL) +} + +// IsGoogleEndpoint - Match if it is exactly Google cloud storage endpoint. +func IsGoogleEndpoint(endpointURL url.URL) bool { + if endpointURL == sentinelURL { + return false + } + return endpointURL.Host == "storage.googleapis.com" +} + +// Expects ascii encoded strings - from output of urlEncodePath +func percentEncodeSlash(s string) string { + return strings.Replace(s, "/", "%2F", -1) +} + +// QueryEncode - encodes query values in their URL encoded form. In +// addition to the percent encoding performed by urlEncodePath() used +// here, it also percent encodes '/' (forward slash) +func QueryEncode(v url.Values) string { + if v == nil { + return "" + } + var buf bytes.Buffer + keys := make([]string, 0, len(v)) + for k := range v { + keys = append(keys, k) + } + sort.Strings(keys) + for _, k := range keys { + vs := v[k] + prefix := percentEncodeSlash(EncodePath(k)) + "=" + for _, v := range vs { + if buf.Len() > 0 { + buf.WriteByte('&') + } + buf.WriteString(prefix) + buf.WriteString(percentEncodeSlash(EncodePath(v))) + } + } + return buf.String() +} + +// TagDecode - decodes canonical tag into map of key and value. +func TagDecode(ctag string) map[string]string { + if ctag == "" { + return map[string]string{} + } + tags := strings.Split(ctag, "&") + tagMap := make(map[string]string, len(tags)) + var err error + for _, tag := range tags { + kvs := strings.SplitN(tag, "=", 2) + if len(kvs) == 0 { + return map[string]string{} + } + if len(kvs) == 1 { + return map[string]string{} + } + tagMap[kvs[0]], err = url.PathUnescape(kvs[1]) + if err != nil { + continue + } + } + return tagMap +} + +// TagEncode - encodes tag values in their URL encoded form. In +// addition to the percent encoding performed by urlEncodePath() used +// here, it also percent encodes '/' (forward slash) +func TagEncode(tags map[string]string) string { + if tags == nil { + return "" + } + values := url.Values{} + for k, v := range tags { + values[k] = []string{v} + } + return QueryEncode(values) +} + +// if object matches reserved string, no need to encode them +var reservedObjectNames = regexp.MustCompile("^[a-zA-Z0-9-_.~/]+$") + +// EncodePath encode the strings from UTF-8 byte representations to HTML hex escape sequences +// +// This is necessary since regular url.Parse() and url.Encode() functions do not support UTF-8 +// non english characters cannot be parsed due to the nature in which url.Encode() is written +// +// This function on the other hand is a direct replacement for url.Encode() technique to support +// pretty much every UTF-8 character. +func EncodePath(pathName string) string { + if reservedObjectNames.MatchString(pathName) { + return pathName + } + var encodedPathname string + for _, s := range pathName { + if 'A' <= s && s <= 'Z' || 'a' <= s && s <= 'z' || '0' <= s && s <= '9' { // §2.3 Unreserved characters (mark) + encodedPathname = encodedPathname + string(s) + continue + } + switch s { + case '-', '_', '.', '~', '/': // §2.3 Unreserved characters (mark) + encodedPathname = encodedPathname + string(s) + continue + default: + len := utf8.RuneLen(s) + if len < 0 { + // if utf8 cannot convert return the same string as is + return pathName + } + u := make([]byte, len) + utf8.EncodeRune(u, s) + for _, r := range u { + hex := hex.EncodeToString([]byte{r}) + encodedPathname = encodedPathname + "%" + strings.ToUpper(hex) + } + } + } + return encodedPathname +} + +// We support '.' with bucket names but we fallback to using path +// style requests instead for such buckets. +var ( + validBucketName = regexp.MustCompile(`^[A-Za-z0-9][A-Za-z0-9\.\-\_\:]{1,61}[A-Za-z0-9]$`) + validBucketNameStrict = regexp.MustCompile(`^[a-z0-9][a-z0-9\.\-]{1,61}[a-z0-9]$`) + ipAddress = regexp.MustCompile(`^(\d+\.){3}\d+$`) +) + +// Common checker for both stricter and basic validation. +func checkBucketNameCommon(bucketName string, strict bool) (err error) { + if strings.TrimSpace(bucketName) == "" { + return errors.New("Bucket name cannot be empty") + } + if len(bucketName) < 3 { + return errors.New("Bucket name cannot be shorter than 3 characters") + } + if len(bucketName) > 63 { + return errors.New("Bucket name cannot be longer than 63 characters") + } + if ipAddress.MatchString(bucketName) { + return errors.New("Bucket name cannot be an ip address") + } + if strings.Contains(bucketName, "..") || strings.Contains(bucketName, ".-") || strings.Contains(bucketName, "-.") { + return errors.New("Bucket name contains invalid characters") + } + if strict { + if !validBucketNameStrict.MatchString(bucketName) { + err = errors.New("Bucket name contains invalid characters") + } + return err + } + if !validBucketName.MatchString(bucketName) { + err = errors.New("Bucket name contains invalid characters") + } + return err +} + +// CheckValidBucketName - checks if we have a valid input bucket name. +func CheckValidBucketName(bucketName string) (err error) { + return checkBucketNameCommon(bucketName, false) +} + +// CheckValidBucketNameStrict - checks if we have a valid input bucket name. +// This is a stricter version. +// - http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html +func CheckValidBucketNameStrict(bucketName string) (err error) { + return checkBucketNameCommon(bucketName, true) +} + +// CheckValidObjectNamePrefix - checks if we have a valid input object name prefix. +// - http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html +func CheckValidObjectNamePrefix(objectName string) error { + if len(objectName) > 1024 { + return errors.New("Object name cannot be longer than 1024 characters") + } + if !utf8.ValidString(objectName) { + return errors.New("Object name with non UTF-8 strings are not supported") + } + return nil +} + +// CheckValidObjectName - checks if we have a valid input object name. +// - http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html +func CheckValidObjectName(objectName string) error { + if strings.TrimSpace(objectName) == "" { + return errors.New("Object name cannot be empty") + } + return CheckValidObjectNamePrefix(objectName) +} diff --git a/vendor/github.com/minio/minio-go/pkg/set/stringset.go b/vendor/github.com/minio/minio-go/v7/pkg/set/stringset.go similarity index 96% rename from vendor/github.com/minio/minio-go/pkg/set/stringset.go rename to vendor/github.com/minio/minio-go/v7/pkg/set/stringset.go index efd02629b..c35e58e1a 100644 --- a/vendor/github.com/minio/minio-go/pkg/set/stringset.go +++ b/vendor/github.com/minio/minio-go/v7/pkg/set/stringset.go @@ -1,6 +1,6 @@ /* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2017 MinIO, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,14 +18,17 @@ package set import ( - "encoding/json" "fmt" "sort" + + jsoniter "github.com/json-iterator/go" ) // StringSet - uses map as set of strings. type StringSet map[string]struct{} +var json = jsoniter.ConfigCompatibleWithStandardLibrary + // ToSlice - returns StringSet as string slice. func (set StringSet) ToSlice() []string { keys := make([]string, 0, len(set)) diff --git a/vendor/github.com/minio/minio-go/pkg/s3signer/request-signature-streaming.go b/vendor/github.com/minio/minio-go/v7/pkg/signer/request-signature-streaming.go similarity index 95% rename from vendor/github.com/minio/minio-go/pkg/s3signer/request-signature-streaming.go rename to vendor/github.com/minio/minio-go/v7/pkg/signer/request-signature-streaming.go index 156a6d63a..7b2ca91d1 100644 --- a/vendor/github.com/minio/minio-go/pkg/s3signer/request-signature-streaming.go +++ b/vendor/github.com/minio/minio-go/v7/pkg/signer/request-signature-streaming.go @@ -1,6 +1,6 @@ /* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2017 Minio, Inc. + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2017 MinIO, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,7 @@ * limitations under the License. */ -package s3signer +package signer import ( "bytes" @@ -82,7 +82,7 @@ func buildChunkStringToSign(t time.Time, region, previousSig string, chunkData [ stringToSignParts := []string{ streamingPayloadHdr, t.Format(iso8601DateFormat), - getScope(region, t), + getScope(region, t, ServiceTypeS3), previousSig, emptySHA256, hex.EncodeToString(sum256(chunkData)), @@ -118,19 +118,19 @@ func buildChunkSignature(chunkData []byte, reqTime time.Time, region, chunkStringToSign := buildChunkStringToSign(reqTime, region, previousSignature, chunkData) - signingKey := getSigningKey(secretAccessKey, region, reqTime) + signingKey := getSigningKey(secretAccessKey, region, reqTime, ServiceTypeS3) return getSignature(signingKey, chunkStringToSign) } // getSeedSignature - returns the seed signature for a given request. func (s *StreamingReader) setSeedSignature(req *http.Request) { // Get canonical request - canonicalRequest := getCanonicalRequest(*req, ignoredStreamingHeaders) + canonicalRequest := getCanonicalRequest(*req, ignoredStreamingHeaders, getHashedPayload(*req)) // Get string to sign from canonical request. - stringToSign := getStringToSignV4(s.reqTime, s.region, canonicalRequest) + stringToSign := getStringToSignV4(s.reqTime, s.region, canonicalRequest, ServiceTypeS3) - signingKey := getSigningKey(s.secretAccessKey, s.region, s.reqTime) + signingKey := getSigningKey(s.secretAccessKey, s.region, s.reqTime, ServiceTypeS3) // Calculate signature. s.seedSignature = getSignature(signingKey, stringToSign) @@ -185,7 +185,7 @@ func (s *StreamingReader) signChunk(chunkLen int) { // setStreamingAuthHeader - builds and sets authorization header value // for streaming signature. func (s *StreamingReader) setStreamingAuthHeader(req *http.Request) { - credential := GetCredential(s.accessKeyID, s.region, s.reqTime) + credential := GetCredential(s.accessKeyID, s.region, s.reqTime, ServiceTypeS3) authParts := []string{ signV4Algorithm + " Credential=" + credential, "SignedHeaders=" + getSignedHeaders(*req, ignoredStreamingHeaders), @@ -285,7 +285,7 @@ func (s *StreamingReader) Read(buf []byte) (int, error) { // bytes read from baseReader different than // content length provided. if s.bytesRead != s.contentLen { - return 0, io.ErrUnexpectedEOF + return 0, fmt.Errorf("http: ContentLength=%d with Body length %d", s.contentLen, s.bytesRead) } // Sign the chunk and write it to s.buf. diff --git a/vendor/github.com/minio/minio-go/pkg/s3signer/request-signature-v2.go b/vendor/github.com/minio/minio-go/v7/pkg/signer/request-signature-v2.go similarity index 98% rename from vendor/github.com/minio/minio-go/pkg/s3signer/request-signature-v2.go rename to vendor/github.com/minio/minio-go/v7/pkg/signer/request-signature-v2.go index b4070938e..71821a26a 100644 --- a/vendor/github.com/minio/minio-go/pkg/s3signer/request-signature-v2.go +++ b/vendor/github.com/minio/minio-go/v7/pkg/signer/request-signature-v2.go @@ -1,6 +1,6 @@ /* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2017 MinIO, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,7 @@ * limitations under the License. */ -package s3signer +package signer import ( "bytes" @@ -30,7 +30,7 @@ import ( "strings" "time" - "github.com/minio/minio-go/pkg/s3utils" + "github.com/minio/minio-go/v7/pkg/s3utils" ) // Signature and API related constants. @@ -262,6 +262,7 @@ var resourceList = []string{ "notification", "partNumber", "policy", + "replication", "requestPayment", "response-cache-control", "response-content-disposition", diff --git a/vendor/github.com/minio/minio-go/pkg/s3signer/request-signature-v4.go b/vendor/github.com/minio/minio-go/v7/pkg/signer/request-signature-v4.go similarity index 77% rename from vendor/github.com/minio/minio-go/pkg/s3signer/request-signature-v4.go rename to vendor/github.com/minio/minio-go/v7/pkg/signer/request-signature-v4.go index daf02fedf..67572b20d 100644 --- a/vendor/github.com/minio/minio-go/pkg/s3signer/request-signature-v4.go +++ b/vendor/github.com/minio/minio-go/v7/pkg/signer/request-signature-v4.go @@ -1,6 +1,6 @@ /* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2017 MinIO, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,7 @@ * limitations under the License. */ -package s3signer +package signer import ( "bytes" @@ -26,7 +26,7 @@ import ( "strings" "time" - "github.com/minio/minio-go/pkg/s3utils" + "github.com/minio/minio-go/v7/pkg/s3utils" ) // Signature and API related constants. @@ -36,6 +36,12 @@ const ( yyyymmdd = "20060102" ) +// Different service types +const ( + ServiceTypeS3 = "s3" + ServiceTypeSTS = "sts" +) + /// /// Excerpts from @lsegal - /// https://github.com/aws/aws-sdk-js/issues/659#issuecomment-120477258. @@ -47,42 +53,21 @@ const ( /// by other agents) or when customers pass requests through /// proxies, which may modify the user-agent. /// -/// Content-Length: -/// -/// This is ignored from signing because generating a pre-signed -/// URL should not provide a content-length constraint, -/// specifically when vending a S3 pre-signed PUT URL. The -/// corollary to this is that when sending regular requests -/// (non-pre-signed), the signature contains a checksum of the -/// body, which implicitly validates the payload length (since -/// changing the number of bytes would change the checksum) -/// and therefore this header is not valuable in the signature. -/// -/// Content-Type: -/// -/// Signing this header causes quite a number of problems in -/// browser environments, where browsers like to modify and -/// normalize the content-type header in different ways. There is -/// more information on this in https://goo.gl/2E9gyy. Avoiding -/// this field simplifies logic and reduces the possibility of -/// future bugs. /// /// Authorization: /// /// Is skipped for obvious reasons /// var v4IgnoredHeaders = map[string]bool{ - "Authorization": true, - "Content-Type": true, - "Content-Length": true, - "User-Agent": true, + "Authorization": true, + "User-Agent": true, } // getSigningKey hmac seed to calculate final signature. -func getSigningKey(secret, loc string, t time.Time) []byte { +func getSigningKey(secret, loc string, t time.Time, serviceType string) []byte { date := sumHMAC([]byte("AWS4"+secret), []byte(t.Format(yyyymmdd))) location := sumHMAC(date, []byte(loc)) - service := sumHMAC(location, []byte("s3")) + service := sumHMAC(location, []byte(serviceType)) signingKey := sumHMAC(service, []byte("aws4_request")) return signingKey } @@ -94,19 +79,19 @@ func getSignature(signingKey []byte, stringToSign string) string { // getScope generate a string of a specific date, an AWS region, and a // service. -func getScope(location string, t time.Time) string { +func getScope(location string, t time.Time, serviceType string) string { scope := strings.Join([]string{ t.Format(yyyymmdd), location, - "s3", + serviceType, "aws4_request", }, "/") return scope } // GetCredential generate a credential string. -func GetCredential(accessKeyID, location string, t time.Time) string { - scope := getScope(location, t) +func GetCredential(accessKeyID, location string, t time.Time, serviceType string) string { + scope := getScope(location, t, serviceType) return accessKeyID + "/" + scope } @@ -151,7 +136,7 @@ func getCanonicalHeaders(req http.Request, ignoredHeaders map[string]bool) strin if idx > 0 { buf.WriteByte(',') } - buf.WriteString(v) + buf.WriteString(signV4TrimAll(v)) } buf.WriteByte('\n') } @@ -184,7 +169,7 @@ func getSignedHeaders(req http.Request, ignoredHeaders map[string]bool) string { // \n // \n // -func getCanonicalRequest(req http.Request, ignoredHeaders map[string]bool) string { +func getCanonicalRequest(req http.Request, ignoredHeaders map[string]bool, hashedPayload string) string { req.URL.RawQuery = strings.Replace(req.URL.Query().Encode(), "+", "%20", -1) canonicalRequest := strings.Join([]string{ req.Method, @@ -192,15 +177,15 @@ func getCanonicalRequest(req http.Request, ignoredHeaders map[string]bool) strin req.URL.RawQuery, getCanonicalHeaders(req, ignoredHeaders), getSignedHeaders(req, ignoredHeaders), - getHashedPayload(req), + hashedPayload, }, "\n") return canonicalRequest } // getStringToSign a string based on selected query values. -func getStringToSignV4(t time.Time, location, canonicalRequest string) string { +func getStringToSignV4(t time.Time, location, canonicalRequest, serviceType string) string { stringToSign := signV4Algorithm + "\n" + t.Format(iso8601DateFormat) + "\n" - stringToSign = stringToSign + getScope(location, t) + "\n" + stringToSign = stringToSign + getScope(location, t, serviceType) + "\n" stringToSign = stringToSign + hex.EncodeToString(sum256([]byte(canonicalRequest))) return stringToSign } @@ -217,7 +202,7 @@ func PreSignV4(req http.Request, accessKeyID, secretAccessKey, sessionToken, loc t := time.Now().UTC() // Get credential string. - credential := GetCredential(accessKeyID, location, t) + credential := GetCredential(accessKeyID, location, t, ServiceTypeS3) // Get all signed headers. signedHeaders := getSignedHeaders(req, v4IgnoredHeaders) @@ -236,13 +221,13 @@ func PreSignV4(req http.Request, accessKeyID, secretAccessKey, sessionToken, loc req.URL.RawQuery = query.Encode() // Get canonical request. - canonicalRequest := getCanonicalRequest(req, v4IgnoredHeaders) + canonicalRequest := getCanonicalRequest(req, v4IgnoredHeaders, getHashedPayload(req)) // Get string to sign from canonical request. - stringToSign := getStringToSignV4(t, location, canonicalRequest) + stringToSign := getStringToSignV4(t, location, canonicalRequest, ServiceTypeS3) // Gext hmac signing key. - signingKey := getSigningKey(secretAccessKey, location, t) + signingKey := getSigningKey(secretAccessKey, location, t, ServiceTypeS3) // Calculate signature. signature := getSignature(signingKey, stringToSign) @@ -257,15 +242,19 @@ func PreSignV4(req http.Request, accessKeyID, secretAccessKey, sessionToken, loc // requests. func PostPresignSignatureV4(policyBase64 string, t time.Time, secretAccessKey, location string) string { // Get signining key. - signingkey := getSigningKey(secretAccessKey, location, t) + signingkey := getSigningKey(secretAccessKey, location, t, ServiceTypeS3) // Calculate signature. signature := getSignature(signingkey, policyBase64) return signature } -// SignV4 sign the request before Do(), in accordance with -// http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html. -func SignV4(req http.Request, accessKeyID, secretAccessKey, sessionToken, location string) *http.Request { +// SignV4STS - signature v4 for STS request. +func SignV4STS(req http.Request, accessKeyID, secretAccessKey, location string) *http.Request { + return signV4(req, accessKeyID, secretAccessKey, "", location, ServiceTypeSTS) +} + +// Internal function called for different service types. +func signV4(req http.Request, accessKeyID, secretAccessKey, sessionToken, location, serviceType string) *http.Request { // Signature calculation is not needed for anonymous credentials. if accessKeyID == "" || secretAccessKey == "" { return &req @@ -282,17 +271,25 @@ func SignV4(req http.Request, accessKeyID, secretAccessKey, sessionToken, locati req.Header.Set("X-Amz-Security-Token", sessionToken) } + hashedPayload := getHashedPayload(req) + if serviceType == ServiceTypeSTS { + // Content sha256 header is not sent with the request + // but it is expected to have sha256 of payload for signature + // in STS service type request. + req.Header.Del("X-Amz-Content-Sha256") + } + // Get canonical request. - canonicalRequest := getCanonicalRequest(req, v4IgnoredHeaders) + canonicalRequest := getCanonicalRequest(req, v4IgnoredHeaders, hashedPayload) // Get string to sign from canonical request. - stringToSign := getStringToSignV4(t, location, canonicalRequest) + stringToSign := getStringToSignV4(t, location, canonicalRequest, serviceType) // Get hmac signing key. - signingKey := getSigningKey(secretAccessKey, location, t) + signingKey := getSigningKey(secretAccessKey, location, t, serviceType) // Get credential string. - credential := GetCredential(accessKeyID, location, t) + credential := GetCredential(accessKeyID, location, t, serviceType) // Get all signed headers. signedHeaders := getSignedHeaders(req, v4IgnoredHeaders) @@ -313,3 +310,9 @@ func SignV4(req http.Request, accessKeyID, secretAccessKey, sessionToken, locati return &req } + +// SignV4 sign the request before Do(), in accordance with +// http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html. +func SignV4(req http.Request, accessKeyID, secretAccessKey, sessionToken, location string) *http.Request { + return signV4(req, accessKeyID, secretAccessKey, sessionToken, location, ServiceTypeS3) +} diff --git a/vendor/github.com/minio/minio-go/v7/pkg/signer/utils.go b/vendor/github.com/minio/minio-go/v7/pkg/signer/utils.go new file mode 100644 index 000000000..2192a3693 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/pkg/signer/utils.go @@ -0,0 +1,59 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2017 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package signer + +import ( + "crypto/hmac" + "net/http" + "strings" + + "github.com/minio/sha256-simd" +) + +// unsignedPayload - value to be set to X-Amz-Content-Sha256 header when +const unsignedPayload = "UNSIGNED-PAYLOAD" + +// sum256 calculate sha256 sum for an input byte array. +func sum256(data []byte) []byte { + hash := sha256.New() + hash.Write(data) + return hash.Sum(nil) +} + +// sumHMAC calculate hmac between two input byte array. +func sumHMAC(key []byte, data []byte) []byte { + hash := hmac.New(sha256.New, key) + hash.Write(data) + return hash.Sum(nil) +} + +// getHostAddr returns host header if available, otherwise returns host from URL +func getHostAddr(req *http.Request) string { + if req.Host != "" { + return req.Host + } + return req.URL.Host +} + +// Trim leading and trailing spaces and replace sequential spaces with one space, following Trimall() +// in http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html +func signV4TrimAll(input string) string { + // Compress adjacent spaces (a space is determined by + // unicode.IsSpace() internally here) to one space and return + return strings.Join(strings.Fields(input), " ") +} diff --git a/vendor/github.com/minio/minio-go/v7/pkg/sse/sse.go b/vendor/github.com/minio/minio-go/v7/pkg/sse/sse.go new file mode 100644 index 000000000..b5fb9565a --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/pkg/sse/sse.go @@ -0,0 +1,66 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2020 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package sse + +import "encoding/xml" + +// ApplySSEByDefault defines default encryption configuration, KMS or SSE. To activate +// KMS, SSEAlgoritm needs to be set to "aws:kms" +// Minio currently does not support Kms. +type ApplySSEByDefault struct { + KmsMasterKeyID string `xml:"KMSMasterKeyID,omitempty"` + SSEAlgorithm string `xml:"SSEAlgorithm"` +} + +// Rule layer encapsulates default encryption configuration +type Rule struct { + Apply ApplySSEByDefault `xml:"ApplyServerSideEncryptionByDefault"` +} + +// Configuration is the default encryption configuration structure +type Configuration struct { + XMLName xml.Name `xml:"ServerSideEncryptionConfiguration"` + Rules []Rule `xml:"Rule"` +} + +// NewConfigurationSSES3 initializes a new SSE-S3 configuration +func NewConfigurationSSES3() *Configuration { + return &Configuration{ + Rules: []Rule{ + { + Apply: ApplySSEByDefault{ + SSEAlgorithm: "AES256", + }, + }, + }, + } +} + +// NewConfigurationSSEKMS initializes a new SSE-KMS configuration +func NewConfigurationSSEKMS(kmsMasterKey string) *Configuration { + return &Configuration{ + Rules: []Rule{ + { + Apply: ApplySSEByDefault{ + KmsMasterKeyID: kmsMasterKey, + SSEAlgorithm: "aws:kms", + }, + }, + }, + } +} diff --git a/vendor/github.com/minio/minio-go/v7/pkg/tags/tags.go b/vendor/github.com/minio/minio-go/v7/pkg/tags/tags.go new file mode 100644 index 000000000..65ba38b10 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/pkg/tags/tags.go @@ -0,0 +1,342 @@ +/* + * MinIO Cloud Storage, (C) 2020 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package tags + +import ( + "encoding/xml" + "io" + "net/url" + "strings" + "unicode/utf8" +) + +// Error contains tag specific error. +type Error interface { + error + Code() string +} + +type errTag struct { + code string + message string +} + +// Code contains error code. +func (err errTag) Code() string { + return err.code +} + +// Error contains error message. +func (err errTag) Error() string { + return err.message +} + +var ( + errTooManyObjectTags = &errTag{"BadRequest", "Tags cannot be more than 10"} + errTooManyTags = &errTag{"BadRequest", "Tags cannot be more than 50"} + errInvalidTagKey = &errTag{"InvalidTag", "The TagKey you have provided is invalid"} + errInvalidTagValue = &errTag{"InvalidTag", "The TagValue you have provided is invalid"} + errDuplicateTagKey = &errTag{"InvalidTag", "Cannot provide multiple Tags with the same key"} +) + +// Tag comes with limitation as per +// https://docs.aws.amazon.com/AmazonS3/latest/dev/object-tagging.html amd +// https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html#tag-restrictions +const ( + maxKeyLength = 128 + maxValueLength = 256 + maxObjectTagCount = 10 + maxTagCount = 50 +) + +func checkKey(key string) error { + if len(key) == 0 || utf8.RuneCountInString(key) > maxKeyLength || strings.Contains(key, "&") { + return errInvalidTagKey + } + + return nil +} + +func checkValue(value string) error { + if utf8.RuneCountInString(value) > maxValueLength || strings.Contains(value, "&") { + return errInvalidTagValue + } + + return nil +} + +// Tag denotes key and value. +type Tag struct { + Key string `xml:"Key"` + Value string `xml:"Value"` +} + +func (tag Tag) String() string { + return tag.Key + "=" + tag.Value +} + +// IsEmpty returns whether this tag is empty or not. +func (tag Tag) IsEmpty() bool { + return tag.Key == "" +} + +// Validate checks this tag. +func (tag Tag) Validate() error { + if err := checkKey(tag.Key); err != nil { + return err + } + + return checkValue(tag.Value) +} + +// MarshalXML encodes to XML data. +func (tag Tag) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + if err := tag.Validate(); err != nil { + return err + } + + type subTag Tag // to avoid recursively calling MarshalXML() + return e.EncodeElement(subTag(tag), start) +} + +// UnmarshalXML decodes XML data to tag. +func (tag *Tag) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + type subTag Tag // to avoid recursively calling UnmarshalXML() + var st subTag + if err := d.DecodeElement(&st, &start); err != nil { + return err + } + + if err := Tag(st).Validate(); err != nil { + return err + } + + *tag = Tag(st) + return nil +} + +// tagSet represents list of unique tags. +type tagSet struct { + tagMap map[string]string + isObject bool +} + +func (tags tagSet) String() string { + s := []string{} + for key, value := range tags.tagMap { + s = append(s, key+"="+value) + } + + return strings.Join(s, "&") +} + +func (tags *tagSet) remove(key string) { + delete(tags.tagMap, key) +} + +func (tags *tagSet) set(key, value string, failOnExist bool) error { + if failOnExist { + if _, found := tags.tagMap[key]; found { + return errDuplicateTagKey + } + } + + if err := checkKey(key); err != nil { + return err + } + + if err := checkValue(value); err != nil { + return err + } + + if tags.isObject { + if len(tags.tagMap) == maxObjectTagCount { + return errTooManyObjectTags + } + } else if len(tags.tagMap) == maxTagCount { + return errTooManyTags + } + + tags.tagMap[key] = value + return nil +} + +func (tags tagSet) toMap() map[string]string { + m := make(map[string]string) + for key, value := range tags.tagMap { + m[key] = value + } + return m +} + +// MarshalXML encodes to XML data. +func (tags tagSet) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + tagList := struct { + Tags []Tag `xml:"Tag"` + }{} + + for key, value := range tags.tagMap { + tagList.Tags = append(tagList.Tags, Tag{key, value}) + } + + return e.EncodeElement(tagList, start) +} + +// UnmarshalXML decodes XML data to tag list. +func (tags *tagSet) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + tagList := struct { + Tags []Tag `xml:"Tag"` + }{} + + if err := d.DecodeElement(&tagList, &start); err != nil { + return err + } + + if tags.isObject { + if len(tagList.Tags) > maxObjectTagCount { + return errTooManyObjectTags + } + } else if len(tagList.Tags) > maxTagCount { + return errTooManyTags + } + + m := map[string]string{} + for _, tag := range tagList.Tags { + if _, found := m[tag.Key]; found { + return errDuplicateTagKey + } + + m[tag.Key] = tag.Value + } + + tags.tagMap = m + return nil +} + +type tagging struct { + XMLName xml.Name `xml:"Tagging"` + TagSet *tagSet `xml:"TagSet"` +} + +// Tags is list of tags of XML request/response as per +// https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketTagging.html#API_GetBucketTagging_RequestBody +type Tags tagging + +func (tags Tags) String() string { + return tags.TagSet.String() +} + +// Remove removes a tag by its key. +func (tags *Tags) Remove(key string) { + tags.TagSet.remove(key) +} + +// Set sets new tag. +func (tags *Tags) Set(key, value string) error { + return tags.TagSet.set(key, value, false) +} + +// ToMap returns copy of tags. +func (tags Tags) ToMap() map[string]string { + return tags.TagSet.toMap() +} + +// MapToObjectTags converts an input map of key and value into +// *Tags data structure with validation. +func MapToObjectTags(tagMap map[string]string) (*Tags, error) { + return NewTags(tagMap, true) +} + +// MapToBucketTags converts an input map of key and value into +// *Tags data structure with validation. +func MapToBucketTags(tagMap map[string]string) (*Tags, error) { + return NewTags(tagMap, false) +} + +// NewTags creates Tags from tagMap, If isObject is set, it validates for object tags. +func NewTags(tagMap map[string]string, isObject bool) (*Tags, error) { + tagging := &Tags{ + TagSet: &tagSet{ + tagMap: make(map[string]string), + isObject: isObject, + }, + } + + for key, value := range tagMap { + if err := tagging.TagSet.set(key, value, true); err != nil { + return nil, err + } + } + + return tagging, nil +} + +func unmarshalXML(reader io.Reader, isObject bool) (*Tags, error) { + tagging := &Tags{ + TagSet: &tagSet{ + tagMap: make(map[string]string), + isObject: isObject, + }, + } + + if err := xml.NewDecoder(reader).Decode(tagging); err != nil { + return nil, err + } + + return tagging, nil +} + +// ParseBucketXML decodes XML data of tags in reader specified in +// https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketTagging.html#API_PutBucketTagging_RequestSyntax. +func ParseBucketXML(reader io.Reader) (*Tags, error) { + return unmarshalXML(reader, false) +} + +// ParseObjectXML decodes XML data of tags in reader specified in +// https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html#API_PutObjectTagging_RequestSyntax +func ParseObjectXML(reader io.Reader) (*Tags, error) { + return unmarshalXML(reader, true) +} + +// Parse decodes HTTP query formatted string into tags which is limited by isObject. +// A query formatted string is like "key1=value1&key2=value2". +func Parse(s string, isObject bool) (*Tags, error) { + values, err := url.ParseQuery(s) + if err != nil { + return nil, err + } + + tagging := &Tags{ + TagSet: &tagSet{ + tagMap: make(map[string]string), + isObject: isObject, + }, + } + + for key := range values { + if err := tagging.TagSet.set(key, values.Get(key), true); err != nil { + return nil, err + } + } + + return tagging, nil +} + +// ParseObjectTags decodes HTTP query formatted string into tags. A query formatted string is like "key1=value1&key2=value2". +func ParseObjectTags(s string) (*Tags, error) { + return Parse(s, true) +} diff --git a/vendor/github.com/minio/minio-go/v7/post-policy.go b/vendor/github.com/minio/minio-go/v7/post-policy.go new file mode 100644 index 000000000..d489d981a --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/post-policy.go @@ -0,0 +1,309 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2017 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "encoding/base64" + "fmt" + "strings" + "time" +) + +// expirationDateFormat date format for expiration key in json policy. +const expirationDateFormat = "2006-01-02T15:04:05.999Z" + +// policyCondition explanation: +// http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-HTTPPOSTConstructPolicy.html +// +// Example: +// +// policyCondition { +// matchType: "$eq", +// key: "$Content-Type", +// value: "image/png", +// } +// +type policyCondition struct { + matchType string + condition string + value string +} + +// PostPolicy - Provides strict static type conversion and validation +// for Amazon S3's POST policy JSON string. +type PostPolicy struct { + // Expiration date and time of the POST policy. + expiration time.Time + // Collection of different policy conditions. + conditions []policyCondition + // ContentLengthRange minimum and maximum allowable size for the + // uploaded content. + contentLengthRange struct { + min int64 + max int64 + } + + // Post form data. + formData map[string]string +} + +// NewPostPolicy - Instantiate new post policy. +func NewPostPolicy() *PostPolicy { + p := &PostPolicy{} + p.conditions = make([]policyCondition, 0) + p.formData = make(map[string]string) + return p +} + +// SetExpires - Sets expiration time for the new policy. +func (p *PostPolicy) SetExpires(t time.Time) error { + if t.IsZero() { + return errInvalidArgument("No expiry time set.") + } + p.expiration = t + return nil +} + +// SetKey - Sets an object name for the policy based upload. +func (p *PostPolicy) SetKey(key string) error { + if strings.TrimSpace(key) == "" || key == "" { + return errInvalidArgument("Object name is empty.") + } + policyCond := policyCondition{ + matchType: "eq", + condition: "$key", + value: key, + } + if err := p.addNewPolicy(policyCond); err != nil { + return err + } + p.formData["key"] = key + return nil +} + +// SetKeyStartsWith - Sets an object name that an policy based upload +// can start with. +func (p *PostPolicy) SetKeyStartsWith(keyStartsWith string) error { + if strings.TrimSpace(keyStartsWith) == "" || keyStartsWith == "" { + return errInvalidArgument("Object prefix is empty.") + } + policyCond := policyCondition{ + matchType: "starts-with", + condition: "$key", + value: keyStartsWith, + } + if err := p.addNewPolicy(policyCond); err != nil { + return err + } + p.formData["key"] = keyStartsWith + return nil +} + +// SetBucket - Sets bucket at which objects will be uploaded to. +func (p *PostPolicy) SetBucket(bucketName string) error { + if strings.TrimSpace(bucketName) == "" || bucketName == "" { + return errInvalidArgument("Bucket name is empty.") + } + policyCond := policyCondition{ + matchType: "eq", + condition: "$bucket", + value: bucketName, + } + if err := p.addNewPolicy(policyCond); err != nil { + return err + } + p.formData["bucket"] = bucketName + return nil +} + +// SetCondition - Sets condition for credentials, date and algorithm +func (p *PostPolicy) SetCondition(matchType, condition, value string) error { + if strings.TrimSpace(value) == "" || value == "" { + return errInvalidArgument("No value specified for condition") + } + + policyCond := policyCondition{ + matchType: matchType, + condition: "$" + condition, + value: value, + } + if condition == "X-Amz-Credential" || condition == "X-Amz-Date" || condition == "X-Amz-Algorithm" { + if err := p.addNewPolicy(policyCond); err != nil { + return err + } + p.formData[condition] = value + return nil + } + return errInvalidArgument("Invalid condition in policy") +} + +// SetContentType - Sets content-type of the object for this policy +// based upload. +func (p *PostPolicy) SetContentType(contentType string) error { + if strings.TrimSpace(contentType) == "" || contentType == "" { + return errInvalidArgument("No content type specified.") + } + policyCond := policyCondition{ + matchType: "eq", + condition: "$Content-Type", + value: contentType, + } + if err := p.addNewPolicy(policyCond); err != nil { + return err + } + p.formData["Content-Type"] = contentType + return nil +} + +// SetContentLengthRange - Set new min and max content length +// condition for all incoming uploads. +func (p *PostPolicy) SetContentLengthRange(min, max int64) error { + if min > max { + return errInvalidArgument("Minimum limit is larger than maximum limit.") + } + if min < 0 { + return errInvalidArgument("Minimum limit cannot be negative.") + } + if max < 0 { + return errInvalidArgument("Maximum limit cannot be negative.") + } + p.contentLengthRange.min = min + p.contentLengthRange.max = max + return nil +} + +// SetSuccessActionRedirect - Sets the redirect success url of the object for this policy +// based upload. +func (p *PostPolicy) SetSuccessActionRedirect(redirect string) error { + if strings.TrimSpace(redirect) == "" || redirect == "" { + return errInvalidArgument("Redirect is empty") + } + policyCond := policyCondition{ + matchType: "eq", + condition: "$success_action_redirect", + value: redirect, + } + if err := p.addNewPolicy(policyCond); err != nil { + return err + } + p.formData["success_action_redirect"] = redirect + return nil +} + +// SetSuccessStatusAction - Sets the status success code of the object for this policy +// based upload. +func (p *PostPolicy) SetSuccessStatusAction(status string) error { + if strings.TrimSpace(status) == "" || status == "" { + return errInvalidArgument("Status is empty") + } + policyCond := policyCondition{ + matchType: "eq", + condition: "$success_action_status", + value: status, + } + if err := p.addNewPolicy(policyCond); err != nil { + return err + } + p.formData["success_action_status"] = status + return nil +} + +// SetUserMetadata - Set user metadata as a key/value couple. +// Can be retrieved through a HEAD request or an event. +func (p *PostPolicy) SetUserMetadata(key string, value string) error { + if strings.TrimSpace(key) == "" || key == "" { + return errInvalidArgument("Key is empty") + } + if strings.TrimSpace(value) == "" || value == "" { + return errInvalidArgument("Value is empty") + } + headerName := fmt.Sprintf("x-amz-meta-%s", key) + policyCond := policyCondition{ + matchType: "eq", + condition: fmt.Sprintf("$%s", headerName), + value: value, + } + if err := p.addNewPolicy(policyCond); err != nil { + return err + } + p.formData[headerName] = value + return nil +} + +// SetUserData - Set user data as a key/value couple. +// Can be retrieved through a HEAD request or an event. +func (p *PostPolicy) SetUserData(key string, value string) error { + if key == "" { + return errInvalidArgument("Key is empty") + } + if value == "" { + return errInvalidArgument("Value is empty") + } + headerName := fmt.Sprintf("x-amz-%s", key) + policyCond := policyCondition{ + matchType: "eq", + condition: fmt.Sprintf("$%s", headerName), + value: value, + } + if err := p.addNewPolicy(policyCond); err != nil { + return err + } + p.formData[headerName] = value + return nil +} + +// addNewPolicy - internal helper to validate adding new policies. +func (p *PostPolicy) addNewPolicy(policyCond policyCondition) error { + if policyCond.matchType == "" || policyCond.condition == "" || policyCond.value == "" { + return errInvalidArgument("Policy fields are empty.") + } + p.conditions = append(p.conditions, policyCond) + return nil +} + +// String function for printing policy in json formatted string. +func (p PostPolicy) String() string { + return string(p.marshalJSON()) +} + +// marshalJSON - Provides Marshaled JSON in bytes. +func (p PostPolicy) marshalJSON() []byte { + expirationStr := `"expiration":"` + p.expiration.Format(expirationDateFormat) + `"` + var conditionsStr string + conditions := []string{} + for _, po := range p.conditions { + conditions = append(conditions, fmt.Sprintf("[\"%s\",\"%s\",\"%s\"]", po.matchType, po.condition, po.value)) + } + if p.contentLengthRange.min != 0 || p.contentLengthRange.max != 0 { + conditions = append(conditions, fmt.Sprintf("[\"content-length-range\", %d, %d]", + p.contentLengthRange.min, p.contentLengthRange.max)) + } + if len(conditions) > 0 { + conditionsStr = `"conditions":[` + strings.Join(conditions, ",") + "]" + } + retStr := "{" + retStr = retStr + expirationStr + "," + retStr = retStr + conditionsStr + retStr = retStr + "}" + return []byte(retStr) +} + +// base64 - Produces base64 of PostPolicy's Marshaled json. +func (p PostPolicy) base64() string { + return base64.StdEncoding.EncodeToString(p.marshalJSON()) +} diff --git a/vendor/github.com/minio/minio-go/retry-continous.go b/vendor/github.com/minio/minio-go/v7/retry-continous.go similarity index 95% rename from vendor/github.com/minio/minio-go/retry-continous.go rename to vendor/github.com/minio/minio-go/v7/retry-continous.go index f31dfa6f2..3d25883b0 100644 --- a/vendor/github.com/minio/minio-go/retry-continous.go +++ b/vendor/github.com/minio/minio-go/v7/retry-continous.go @@ -1,6 +1,6 @@ /* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2017 MinIO, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/vendor/github.com/minio/minio-go/v7/retry.go b/vendor/github.com/minio/minio-go/v7/retry.go new file mode 100644 index 000000000..6e2826fa6 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/retry.go @@ -0,0 +1,124 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2017 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "context" + "net/http" + "time" +) + +// MaxRetry is the maximum number of retries before stopping. +var MaxRetry = 10 + +// MaxJitter will randomize over the full exponential backoff time +const MaxJitter = 1.0 + +// NoJitter disables the use of jitter for randomizing the exponential backoff time +const NoJitter = 0.0 + +// DefaultRetryUnit - default unit multiplicative per retry. +// defaults to 1 second. +const DefaultRetryUnit = time.Second + +// DefaultRetryCap - Each retry attempt never waits no longer than +// this maximum time duration. +const DefaultRetryCap = time.Second * 30 + +// newRetryTimer creates a timer with exponentially increasing +// delays until the maximum retry attempts are reached. +func (c Client) newRetryTimer(ctx context.Context, maxRetry int, unit time.Duration, cap time.Duration, jitter float64) <-chan int { + attemptCh := make(chan int) + + // computes the exponential backoff duration according to + // https://www.awsarchitectureblog.com/2015/03/backoff.html + exponentialBackoffWait := func(attempt int) time.Duration { + // normalize jitter to the range [0, 1.0] + if jitter < NoJitter { + jitter = NoJitter + } + if jitter > MaxJitter { + jitter = MaxJitter + } + + //sleep = random_between(0, min(cap, base * 2 ** attempt)) + sleep := unit * time.Duration(1< cap { + sleep = cap + } + if jitter != NoJitter { + sleep -= time.Duration(c.random.Float64() * float64(sleep) * jitter) + } + return sleep + } + + go func() { + defer close(attemptCh) + for i := 0; i < maxRetry; i++ { + select { + case attemptCh <- i + 1: + case <-ctx.Done(): + return + } + + select { + case <-time.After(exponentialBackoffWait(i)): + case <-ctx.Done(): + return + } + } + }() + return attemptCh +} + +// List of AWS S3 error codes which are retryable. +var retryableS3Codes = map[string]struct{}{ + "RequestError": {}, + "RequestTimeout": {}, + "Throttling": {}, + "ThrottlingException": {}, + "RequestLimitExceeded": {}, + "RequestThrottled": {}, + "InternalError": {}, + "ExpiredToken": {}, + "ExpiredTokenException": {}, + "SlowDown": {}, + // Add more AWS S3 codes here. +} + +// isS3CodeRetryable - is s3 error code retryable. +func isS3CodeRetryable(s3Code string) (ok bool) { + _, ok = retryableS3Codes[s3Code] + return ok +} + +// List of HTTP status codes which are retryable. +var retryableHTTPStatusCodes = map[int]struct{}{ + 429: {}, // http.StatusTooManyRequests is not part of the Go 1.5 library, yet + http.StatusInternalServerError: {}, + http.StatusBadGateway: {}, + http.StatusServiceUnavailable: {}, + http.StatusGatewayTimeout: {}, + // Add more HTTP status codes here. +} + +// isHTTPStatusRetryable - is HTTP error code retryable. +func isHTTPStatusRetryable(httpStatusCode int) (ok bool) { + _, ok = retryableHTTPStatusCodes[httpStatusCode] + return ok +} diff --git a/vendor/github.com/minio/minio-go/v7/s3-endpoints.go b/vendor/github.com/minio/minio-go/v7/s3-endpoints.go new file mode 100644 index 000000000..125d86289 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/s3-endpoints.go @@ -0,0 +1,57 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2017 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +// awsS3EndpointMap Amazon S3 endpoint map. +var awsS3EndpointMap = map[string]string{ + "us-east-1": "s3.dualstack.us-east-1.amazonaws.com", + "us-east-2": "s3.dualstack.us-east-2.amazonaws.com", + "us-west-2": "s3.dualstack.us-west-2.amazonaws.com", + "us-west-1": "s3.dualstack.us-west-1.amazonaws.com", + "ca-central-1": "s3.dualstack.ca-central-1.amazonaws.com", + "eu-west-1": "s3.dualstack.eu-west-1.amazonaws.com", + "eu-west-2": "s3.dualstack.eu-west-2.amazonaws.com", + "eu-west-3": "s3.dualstack.eu-west-3.amazonaws.com", + "eu-central-1": "s3.dualstack.eu-central-1.amazonaws.com", + "eu-north-1": "s3.dualstack.eu-north-1.amazonaws.com", + "eu-south-1": "s3.dualstack.eu-south-1.amazonaws.com", + "ap-east-1": "s3.dualstack.ap-east-1.amazonaws.com", + "ap-south-1": "s3.dualstack.ap-south-1.amazonaws.com", + "ap-southeast-1": "s3.dualstack.ap-southeast-1.amazonaws.com", + "ap-southeast-2": "s3.dualstack.ap-southeast-2.amazonaws.com", + "ap-northeast-1": "s3.dualstack.ap-northeast-1.amazonaws.com", + "ap-northeast-2": "s3.dualstack.ap-northeast-2.amazonaws.com", + "ap-northeast-3": "s3.dualstack.ap-northeast-3.amazonaws.com", + "af-south-1": "s3.dualstack.af-south-1.amazonaws.com", + "me-south-1": "s3.dualstack.me-south-1.amazonaws.com", + "sa-east-1": "s3.dualstack.sa-east-1.amazonaws.com", + "us-gov-west-1": "s3.dualstack.us-gov-west-1.amazonaws.com", + "us-gov-east-1": "s3.dualstack.us-gov-east-1.amazonaws.com", + "cn-north-1": "s3.cn-north-1.amazonaws.com.cn", + "cn-northwest-1": "s3.cn-northwest-1.amazonaws.com.cn", +} + +// getS3Endpoint get Amazon S3 endpoint based on the bucket location. +func getS3Endpoint(bucketLocation string) (s3Endpoint string) { + s3Endpoint, ok := awsS3EndpointMap[bucketLocation] + if !ok { + // Default to 's3.dualstack.us-east-1.amazonaws.com' endpoint. + s3Endpoint = "s3.dualstack.us-east-1.amazonaws.com" + } + return s3Endpoint +} diff --git a/vendor/github.com/minio/minio-go/s3-error.go b/vendor/github.com/minio/minio-go/v7/s3-error.go similarity index 97% rename from vendor/github.com/minio/minio-go/s3-error.go rename to vendor/github.com/minio/minio-go/v7/s3-error.go index f9e82334a..f365157ee 100644 --- a/vendor/github.com/minio/minio-go/s3-error.go +++ b/vendor/github.com/minio/minio-go/v7/s3-error.go @@ -1,6 +1,6 @@ /* - * Minio Go Library for Amazon S3 Compatible Cloud Storage - * Copyright 2015-2017 Minio, Inc. + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2017 MinIO, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,7 +34,7 @@ var s3ErrorResponseMap = map[string]string{ "MissingContentLength": "You must provide the Content-Length HTTP header.", "MissingContentMD5": "Missing required header for this request: Content-Md5.", "MissingRequestBodyError": "Request body is empty.", - "NoSuchBucket": "The specified bucket does not exist", + "NoSuchBucket": "The specified bucket does not exist.", "NoSuchBucketPolicy": "The bucket policy does not exist", "NoSuchKey": "The specified key does not exist.", "NoSuchUpload": "The specified multipart upload does not exist. The upload ID may be invalid, or the upload may have been aborted or completed.", diff --git a/vendor/github.com/minio/minio-go/v7/staticcheck.conf b/vendor/github.com/minio/minio-go/v7/staticcheck.conf new file mode 100644 index 000000000..71cc6f536 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/staticcheck.conf @@ -0,0 +1 @@ +checks = ["all", "-ST1005", "-ST1017", "-SA9004", "-ST1000", "-S1021"] \ No newline at end of file diff --git a/vendor/github.com/minio/minio-go/v7/transport.go b/vendor/github.com/minio/minio-go/v7/transport.go new file mode 100644 index 000000000..d5ad15b8b --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/transport.go @@ -0,0 +1,83 @@ +// +build go1.7 go1.8 + +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2017-2018 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "crypto/tls" + "crypto/x509" + "io/ioutil" + "net" + "net/http" + "os" + "time" +) + +// mustGetSystemCertPool - return system CAs or empty pool in case of error (or windows) +func mustGetSystemCertPool() *x509.CertPool { + pool, err := x509.SystemCertPool() + if err != nil { + return x509.NewCertPool() + } + return pool +} + +// DefaultTransport - this default transport is similar to +// http.DefaultTransport but with additional param DisableCompression +// is set to true to avoid decompressing content with 'gzip' encoding. +var DefaultTransport = func(secure bool) (*http.Transport, error) { + tr := &http.Transport{ + Proxy: http.ProxyFromEnvironment, + DialContext: (&net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + }).DialContext, + MaxIdleConns: 256, + MaxIdleConnsPerHost: 16, + ResponseHeaderTimeout: time.Minute, + IdleConnTimeout: time.Minute, + TLSHandshakeTimeout: 10 * time.Second, + ExpectContinueTimeout: 10 * time.Second, + // Set this value so that the underlying transport round-tripper + // doesn't try to auto decode the body of objects with + // content-encoding set to `gzip`. + // + // Refer: + // https://golang.org/src/net/http/transport.go?h=roundTrip#L1843 + DisableCompression: true, + } + + if secure { + tr.TLSClientConfig = &tls.Config{ + // Can't use SSLv3 because of POODLE and BEAST + // Can't use TLSv1.0 because of POODLE and BEAST using CBC cipher + // Can't use TLSv1.1 because of RC4 cipher usage + MinVersion: tls.VersionTLS12, + } + if f := os.Getenv("SSL_CERT_FILE"); f != "" { + rootCAs := mustGetSystemCertPool() + data, err := ioutil.ReadFile(f) + if err == nil { + rootCAs.AppendCertsFromPEM(data) + } + tr.TLSClientConfig.RootCAs = rootCAs + } + } + return tr, nil +} diff --git a/vendor/github.com/minio/minio-go/v7/utils.go b/vendor/github.com/minio/minio-go/v7/utils.go new file mode 100644 index 000000000..f1b711d22 --- /dev/null +++ b/vendor/github.com/minio/minio-go/v7/utils.go @@ -0,0 +1,485 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2017 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "crypto/md5" + "encoding/base64" + "encoding/hex" + "encoding/xml" + "fmt" + "hash" + "io" + "io/ioutil" + "net" + "net/http" + "net/url" + "regexp" + "strconv" + "strings" + "sync" + "time" + + md5simd "github.com/minio/md5-simd" + "github.com/minio/minio-go/v7/pkg/s3utils" + "github.com/minio/sha256-simd" +) + +func trimEtag(etag string) string { + etag = strings.TrimPrefix(etag, "\"") + return strings.TrimSuffix(etag, "\"") +} + +var expirationRegex = regexp.MustCompile(`expiry-date="(.*?)", rule-id="(.*?)"`) + +func amzExpirationToExpiryDateRuleID(expiration string) (time.Time, string) { + if matches := expirationRegex.FindStringSubmatch(expiration); len(matches) == 3 { + expTime, err := time.Parse(http.TimeFormat, matches[1]) + if err != nil { + return time.Time{}, "" + } + return expTime, matches[2] + } + return time.Time{}, "" +} + +// xmlDecoder provide decoded value in xml. +func xmlDecoder(body io.Reader, v interface{}) error { + d := xml.NewDecoder(body) + return d.Decode(v) +} + +// sum256 calculate sha256sum for an input byte array, returns hex encoded. +func sum256Hex(data []byte) string { + hash := newSHA256Hasher() + defer hash.Close() + hash.Write(data) + return hex.EncodeToString(hash.Sum(nil)) +} + +// sumMD5Base64 calculate md5sum for an input byte array, returns base64 encoded. +func sumMD5Base64(data []byte) string { + hash := newMd5Hasher() + defer hash.Close() + hash.Write(data) + return base64.StdEncoding.EncodeToString(hash.Sum(nil)) +} + +// getEndpointURL - construct a new endpoint. +func getEndpointURL(endpoint string, secure bool) (*url.URL, error) { + if strings.Contains(endpoint, ":") { + host, _, err := net.SplitHostPort(endpoint) + if err != nil { + return nil, err + } + if !s3utils.IsValidIP(host) && !s3utils.IsValidDomain(host) { + msg := "Endpoint: " + endpoint + " does not follow ip address or domain name standards." + return nil, errInvalidArgument(msg) + } + } else { + if !s3utils.IsValidIP(endpoint) && !s3utils.IsValidDomain(endpoint) { + msg := "Endpoint: " + endpoint + " does not follow ip address or domain name standards." + return nil, errInvalidArgument(msg) + } + } + // If secure is false, use 'http' scheme. + scheme := "https" + if !secure { + scheme = "http" + } + + // Construct a secured endpoint URL. + endpointURLStr := scheme + "://" + endpoint + endpointURL, err := url.Parse(endpointURLStr) + if err != nil { + return nil, err + } + + // Validate incoming endpoint URL. + if err := isValidEndpointURL(*endpointURL); err != nil { + return nil, err + } + return endpointURL, nil +} + +// closeResponse close non nil response with any response Body. +// convenient wrapper to drain any remaining data on response body. +// +// Subsequently this allows golang http RoundTripper +// to re-use the same connection for future requests. +func closeResponse(resp *http.Response) { + // Callers should close resp.Body when done reading from it. + // If resp.Body is not closed, the Client's underlying RoundTripper + // (typically Transport) may not be able to re-use a persistent TCP + // connection to the server for a subsequent "keep-alive" request. + if resp != nil && resp.Body != nil { + // Drain any remaining Body and then close the connection. + // Without this closing connection would disallow re-using + // the same connection for future uses. + // - http://stackoverflow.com/a/17961593/4465767 + io.Copy(ioutil.Discard, resp.Body) + resp.Body.Close() + } +} + +var ( + // Hex encoded string of nil sha256sum bytes. + emptySHA256Hex = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + + // Sentinel URL is the default url value which is invalid. + sentinelURL = url.URL{} +) + +// Verify if input endpoint URL is valid. +func isValidEndpointURL(endpointURL url.URL) error { + if endpointURL == sentinelURL { + return errInvalidArgument("Endpoint url cannot be empty.") + } + if endpointURL.Path != "/" && endpointURL.Path != "" { + return errInvalidArgument("Endpoint url cannot have fully qualified paths.") + } + if strings.Contains(endpointURL.Host, ".s3.amazonaws.com") { + if !s3utils.IsAmazonEndpoint(endpointURL) { + return errInvalidArgument("Amazon S3 endpoint should be 's3.amazonaws.com'.") + } + } + if strings.Contains(endpointURL.Host, ".googleapis.com") { + if !s3utils.IsGoogleEndpoint(endpointURL) { + return errInvalidArgument("Google Cloud Storage endpoint should be 'storage.googleapis.com'.") + } + } + return nil +} + +// Verify if input expires value is valid. +func isValidExpiry(expires time.Duration) error { + expireSeconds := int64(expires / time.Second) + if expireSeconds < 1 { + return errInvalidArgument("Expires cannot be lesser than 1 second.") + } + if expireSeconds > 604800 { + return errInvalidArgument("Expires cannot be greater than 7 days.") + } + return nil +} + +// Extract only necessary metadata header key/values by +// filtering them out with a list of custom header keys. +func extractObjMetadata(header http.Header) http.Header { + preserveKeys := []string{ + "Content-Type", + "Cache-Control", + "Content-Encoding", + "Content-Language", + "Content-Disposition", + "X-Amz-Storage-Class", + "X-Amz-Object-Lock-Mode", + "X-Amz-Object-Lock-Retain-Until-Date", + "X-Amz-Object-Lock-Legal-Hold", + "X-Amz-Website-Redirect-Location", + "X-Amz-Server-Side-Encryption", + "X-Amz-Tagging-Count", + "X-Amz-Meta-", + // Add new headers to be preserved. + // if you add new headers here, please extend + // PutObjectOptions{} to preserve them + // upon upload as well. + } + filteredHeader := make(http.Header) + for k, v := range header { + var found bool + for _, prefix := range preserveKeys { + if !strings.HasPrefix(k, prefix) { + continue + } + found = true + break + } + if found { + filteredHeader[k] = v + } + } + return filteredHeader +} + +// ToObjectInfo converts http header values into ObjectInfo type, +// extracts metadata and fills in all the necessary fields in ObjectInfo. +func ToObjectInfo(bucketName string, objectName string, h http.Header) (ObjectInfo, error) { + var err error + // Trim off the odd double quotes from ETag in the beginning and end. + etag := trimEtag(h.Get("ETag")) + + // Parse content length is exists + var size int64 = -1 + contentLengthStr := h.Get("Content-Length") + if contentLengthStr != "" { + size, err = strconv.ParseInt(contentLengthStr, 10, 64) + if err != nil { + // Content-Length is not valid + return ObjectInfo{}, ErrorResponse{ + Code: "InternalError", + Message: fmt.Sprintf("Content-Length is not an integer, failed with %v", err), + BucketName: bucketName, + Key: objectName, + RequestID: h.Get("x-amz-request-id"), + HostID: h.Get("x-amz-id-2"), + Region: h.Get("x-amz-bucket-region"), + } + } + } + + // Parse Last-Modified has http time format. + date, err := time.Parse(http.TimeFormat, h.Get("Last-Modified")) + if err != nil { + return ObjectInfo{}, ErrorResponse{ + Code: "InternalError", + Message: fmt.Sprintf("Last-Modified time format is invalid, failed with %v", err), + BucketName: bucketName, + Key: objectName, + RequestID: h.Get("x-amz-request-id"), + HostID: h.Get("x-amz-id-2"), + Region: h.Get("x-amz-bucket-region"), + } + } + + // Fetch content type if any present. + contentType := strings.TrimSpace(h.Get("Content-Type")) + if contentType == "" { + contentType = "application/octet-stream" + } + + expiryStr := h.Get("Expires") + var expiry time.Time + if expiryStr != "" { + expiry, _ = time.Parse(http.TimeFormat, expiryStr) + } + + metadata := extractObjMetadata(h) + userMetadata := make(map[string]string) + for k, v := range metadata { + if strings.HasPrefix(k, "X-Amz-Meta-") { + userMetadata[strings.TrimPrefix(k, "X-Amz-Meta-")] = v[0] + } + } + userTags := s3utils.TagDecode(h.Get(amzTaggingHeader)) + + var tagCount int + if count := h.Get(amzTaggingCount); count != "" { + tagCount, err = strconv.Atoi(count) + if err != nil { + return ObjectInfo{}, ErrorResponse{ + Code: "InternalError", + Message: fmt.Sprintf("x-amz-tagging-count is not an integer, failed with %v", err), + BucketName: bucketName, + Key: objectName, + RequestID: h.Get("x-amz-request-id"), + HostID: h.Get("x-amz-id-2"), + Region: h.Get("x-amz-bucket-region"), + } + } + } + + // extract lifecycle expiry date and rule ID + expTime, ruleID := amzExpirationToExpiryDateRuleID(h.Get(amzExpiration)) + + // Save object metadata info. + return ObjectInfo{ + ETag: etag, + Key: objectName, + Size: size, + LastModified: date, + ContentType: contentType, + Expires: expiry, + VersionID: h.Get(amzVersionID), + ReplicationStatus: h.Get(amzReplicationStatus), + Expiration: expTime, + ExpirationRuleID: ruleID, + // Extract only the relevant header keys describing the object. + // following function filters out a list of standard set of keys + // which are not part of object metadata. + Metadata: metadata, + UserMetadata: userMetadata, + UserTags: userTags, + UserTagCount: tagCount, + }, nil +} + +var readFull = func(r io.Reader, buf []byte) (n int, err error) { + // ReadFull reads exactly len(buf) bytes from r into buf. + // It returns the number of bytes copied and an error if + // fewer bytes were read. The error is EOF only if no bytes + // were read. If an EOF happens after reading some but not + // all the bytes, ReadFull returns ErrUnexpectedEOF. + // On return, n == len(buf) if and only if err == nil. + // If r returns an error having read at least len(buf) bytes, + // the error is dropped. + for n < len(buf) && err == nil { + var nn int + nn, err = r.Read(buf[n:]) + // Some spurious io.Reader's return + // io.ErrUnexpectedEOF when nn == 0 + // this behavior is undocumented + // so we are on purpose not using io.ReadFull + // implementation because this can lead + // to custom handling, to avoid that + // we simply modify the original io.ReadFull + // implementation to avoid this issue. + // io.ErrUnexpectedEOF with nn == 0 really + // means that io.EOF + if err == io.ErrUnexpectedEOF && nn == 0 { + err = io.EOF + } + n += nn + } + if n >= len(buf) { + err = nil + } else if n > 0 && err == io.EOF { + err = io.ErrUnexpectedEOF + } + return +} + +// regCred matches credential string in HTTP header +var regCred = regexp.MustCompile("Credential=([A-Z0-9]+)/") + +// regCred matches signature string in HTTP header +var regSign = regexp.MustCompile("Signature=([[0-9a-f]+)") + +// Redact out signature value from authorization string. +func redactSignature(origAuth string) string { + if !strings.HasPrefix(origAuth, signV4Algorithm) { + // Set a temporary redacted auth + return "AWS **REDACTED**:**REDACTED**" + } + + /// Signature V4 authorization header. + + // Strip out accessKeyID from: + // Credential=////aws4_request + newAuth := regCred.ReplaceAllString(origAuth, "Credential=**REDACTED**/") + + // Strip out 256-bit signature from: Signature=<256-bit signature> + return regSign.ReplaceAllString(newAuth, "Signature=**REDACTED**") +} + +// Get default location returns the location based on the input +// URL `u`, if region override is provided then all location +// defaults to regionOverride. +// +// If no other cases match then the location is set to `us-east-1` +// as a last resort. +func getDefaultLocation(u url.URL, regionOverride string) (location string) { + if regionOverride != "" { + return regionOverride + } + region := s3utils.GetRegionFromURL(u) + if region == "" { + region = "us-east-1" + } + return region +} + +var supportedHeaders = []string{ + "content-type", + "cache-control", + "content-encoding", + "content-disposition", + "content-language", + "x-amz-website-redirect-location", + "x-amz-object-lock-mode", + "x-amz-metadata-directive", + "x-amz-object-lock-retain-until-date", + "expires", + "x-amz-replication-status", + // Add more supported headers here. +} + +// isStorageClassHeader returns true if the header is a supported storage class header +func isStorageClassHeader(headerKey string) bool { + return strings.EqualFold(amzStorageClass, headerKey) +} + +// isStandardHeader returns true if header is a supported header and not a custom header +func isStandardHeader(headerKey string) bool { + key := strings.ToLower(headerKey) + for _, header := range supportedHeaders { + if strings.ToLower(header) == key { + return true + } + } + return false +} + +// sseHeaders is list of server side encryption headers +var sseHeaders = []string{ + "x-amz-server-side-encryption", + "x-amz-server-side-encryption-aws-kms-key-id", + "x-amz-server-side-encryption-context", + "x-amz-server-side-encryption-customer-algorithm", + "x-amz-server-side-encryption-customer-key", + "x-amz-server-side-encryption-customer-key-MD5", +} + +// isSSEHeader returns true if header is a server side encryption header. +func isSSEHeader(headerKey string) bool { + key := strings.ToLower(headerKey) + for _, h := range sseHeaders { + if strings.ToLower(h) == key { + return true + } + } + return false +} + +// isAmzHeader returns true if header is a x-amz-meta-* or x-amz-acl header. +func isAmzHeader(headerKey string) bool { + key := strings.ToLower(headerKey) + + return strings.HasPrefix(key, "x-amz-meta-") || strings.HasPrefix(key, "x-amz-grant-") || key == "x-amz-acl" || isSSEHeader(headerKey) +} + +var md5Pool = sync.Pool{New: func() interface{} { return md5.New() }} +var sha256Pool = sync.Pool{New: func() interface{} { return sha256.New() }} + +func newMd5Hasher() md5simd.Hasher { + return hashWrapper{Hash: md5Pool.New().(hash.Hash), isMD5: true} +} + +func newSHA256Hasher() md5simd.Hasher { + return hashWrapper{Hash: sha256Pool.New().(hash.Hash), isSHA256: true} +} + +// hashWrapper implements the md5simd.Hasher interface. +type hashWrapper struct { + hash.Hash + isMD5 bool + isSHA256 bool +} + +// Close will put the hasher back into the pool. +func (m hashWrapper) Close() { + if m.isMD5 && m.Hash != nil { + m.Reset() + md5Pool.Put(m.Hash) + } + if m.isSHA256 && m.Hash != nil { + m.Reset() + sha256Pool.Put(m.Hash) + } + m.Hash = nil +} diff --git a/vendor/github.com/pelletier/go-buffruneio/.gitignore b/vendor/github.com/minio/sha256-simd/.gitignore similarity index 100% rename from vendor/github.com/pelletier/go-buffruneio/.gitignore rename to vendor/github.com/minio/sha256-simd/.gitignore diff --git a/vendor/github.com/minio/sha256-simd/.travis.yml b/vendor/github.com/minio/sha256-simd/.travis.yml new file mode 100644 index 000000000..4f85db539 --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/.travis.yml @@ -0,0 +1,25 @@ +sudo: required +dist: trusty +language: go + +os: +- linux + +go: +- tip +- 1.12.x + +env: +- ARCH=x86_64 +- ARCH=i686 + +matrix: + fast_finish: true + allow_failures: + - go: tip + +script: +- diff -au <(gofmt -d .) <(printf "") +- go test -race -v ./... +- go vet -asmdecl . +- ./test-architectures.sh diff --git a/vendor/github.com/minio/sha256-simd/LICENSE b/vendor/github.com/minio/sha256-simd/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/minio/sha256-simd/README.md b/vendor/github.com/minio/sha256-simd/README.md new file mode 100644 index 000000000..5282d83ad --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/README.md @@ -0,0 +1,133 @@ +# sha256-simd + +Accelerate SHA256 computations in pure Go using AVX512, SHA Extensions and AVX2 for Intel and ARM64 for ARM. On AVX512 it provides an up to 8x improvement (over 3 GB/s per core) in comparison to AVX2. SHA Extensions give a performance boost of close to 4x over AVX2. + +## Introduction + +This package is designed as a replacement for `crypto/sha256`. For Intel CPUs it has two flavors for AVX512 and AVX2 (AVX/SSE are also supported). For ARM CPUs with the Cryptography Extensions, advantage is taken of the SHA2 instructions resulting in a massive performance improvement. + +This package uses Golang assembly. The AVX512 version is based on the Intel's "multi-buffer crypto library for IPSec" whereas the other Intel implementations are described in "Fast SHA-256 Implementations on Intel Architecture Processors" by J. Guilford et al. + +## New: Support for Intel SHA Extensions + +Support for the Intel SHA Extensions has been added by Kristofer Peterson (@svenski123), originally developed for spacemeshos [here](https://github.com/spacemeshos/POET/issues/23). On CPUs that support it (known thus far Intel Celeron J3455 and AMD Ryzen) it gives a significant boost in performance (with thanks to @AudriusButkevicius for reporting the results; full results [here](https://github.com/minio/sha256-simd/pull/37#issuecomment-451607827)). + +``` +$ benchcmp avx2.txt sha-ext.txt +benchmark AVX2 MB/s SHA Ext MB/s speedup +BenchmarkHash5M 514.40 1975.17 3.84x +``` + +Thanks to Kristofer Peterson, we also added additional performance changes such as optimized padding, endian conversions which sped up all implementations i.e. Intel SHA alone while doubled performance for small sizes, the other changes increased everything roughly 50%. + +## Support for AVX512 + +We have added support for AVX512 which results in an up to 8x performance improvement over AVX2 (3.0 GHz Xeon Platinum 8124M CPU): + +``` +$ benchcmp avx2.txt avx512.txt +benchmark AVX2 MB/s AVX512 MB/s speedup +BenchmarkHash5M 448.62 3498.20 7.80x +``` + +The original code was developed by Intel as part of the [multi-buffer crypto library](https://github.com/intel/intel-ipsec-mb) for IPSec or more specifically this [AVX512](https://github.com/intel/intel-ipsec-mb/blob/master/avx512/sha256_x16_avx512.asm) implementation. The key idea behind it is to process a total of 16 checksums in parallel by “transposing” 16 (independent) messages of 64 bytes between a total of 16 ZMM registers (each 64 bytes wide). + +Transposing the input messages means that in order to take full advantage of the speedup you need to have a (server) workload where multiple threads are doing SHA256 calculations in parallel. Unfortunately for this algorithm it is not possible for two message blocks processed in parallel to be dependent on one another — because then the (interim) result of the first part of the message has to be an input into the processing of the second part of the message. + +Whereas the original Intel C implementation requires some sort of explicit scheduling of messages to be processed in parallel, for Golang it makes sense to take advantage of channels in order to group messages together and use channels as well for sending back the results (thereby effectively decoupling the calculations). We have implemented a fairly simple scheduling mechanism that seems to work well in practice. + +Due to this different way of scheduling, we decided to use an explicit method to instantiate the AVX512 version. Essentially one or more AVX512 processing servers ([`Avx512Server`](https://github.com/minio/sha256-simd/blob/master/sha256blockAvx512_amd64.go#L294)) have to be created whereby each server can hash over 3 GB/s on a single core. An `hash.Hash` object ([`Avx512Digest`](https://github.com/minio/sha256-simd/blob/master/sha256blockAvx512_amd64.go#L45)) is then instantiated using one of these servers and used in the regular fashion: + +```go +import "github.com/minio/sha256-simd" + +func main() { + server := sha256.NewAvx512Server() + h512 := sha256.NewAvx512(server) + h512.Write(fileBlock) + digest := h512.Sum([]byte{}) +} +``` + +Note that, because of the scheduling overhead, for small messages (< 1 MB) you will be better off using the regular SHA256 hashing (but those are typically not performance critical anyway). Some other tips to get the best performance: +* Have many go routines doing SHA256 calculations in parallel. +* Try to Write() messages in multiples of 64 bytes. +* Try to keep the overall length of messages to a roughly similar size ie. 5 MB (this way all 16 ‘lanes’ in the AVX512 computations are contributing as much as possible). + +More detailed information can be found in this [blog](https://blog.minio.io/accelerate-sha256-up-to-8x-over-3-gb-s-per-core-with-avx512-a0b1d64f78f) post including scaling across cores. + +## Drop-In Replacement + +The following code snippet shows how you can use `github.com/minio/sha256-simd`. This will automatically select the fastest method for the architecture on which it will be executed. + +```go +import "github.com/minio/sha256-simd" + +func main() { + ... + shaWriter := sha256.New() + io.Copy(shaWriter, file) + ... +} +``` + +## Performance + +Below is the speed in MB/s for a single core (ranked fast to slow) for blocks larger than 1 MB. + +| Processor | SIMD | Speed (MB/s) | +| --------------------------------- | ------- | ------------:| +| 3.0 GHz Intel Xeon Platinum 8124M | AVX512 | 3498 | +| 3.7 GHz AMD Ryzen 7 2700X | SHA Ext | 1979 | +| 1.2 GHz ARM Cortex-A53 | ARM64 | 638 | +| 3.0 GHz Intel Xeon Platinum 8124M | AVX2 | 449 | +| 3.1 GHz Intel Core i7 | AVX | 362 | +| 3.1 GHz Intel Core i7 | SSE | 299 | + +## asm2plan9s + +In order to be able to work more easily with AVX512/AVX2 instructions, a separate tool was developed to convert SIMD instructions into the corresponding BYTE sequence as accepted by Go assembly. See [asm2plan9s](https://github.com/minio/asm2plan9s) for more information. + +## Why and benefits + +One of the most performance sensitive parts of the [Minio](https://github.com/minio/minio) object storage server is related to SHA256 hash sums calculations. For instance during multi part uploads each part that is uploaded needs to be verified for data integrity by the server. + +Other applications that can benefit from enhanced SHA256 performance are deduplication in storage systems, intrusion detection, version control systems, integrity checking, etc. + +## ARM SHA Extensions + +The 64-bit ARMv8 core has introduced new instructions for SHA1 and SHA2 acceleration as part of the [Cryptography Extensions](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0501f/CHDFJBCJ.html). Below you can see a small excerpt highlighting one of the rounds as is done for the SHA256 calculation process (for full code see [sha256block_arm64.s](https://github.com/minio/sha256-simd/blob/master/sha256block_arm64.s)). + + ``` + sha256h q2, q3, v9.4s + sha256h2 q3, q4, v9.4s + sha256su0 v5.4s, v6.4s + rev32 v8.16b, v8.16b + add v9.4s, v7.4s, v18.4s + mov v4.16b, v2.16b + sha256h q2, q3, v10.4s + sha256h2 q3, q4, v10.4s + sha256su0 v6.4s, v7.4s + sha256su1 v5.4s, v7.4s, v8.4s + ``` + +### Detailed benchmarks + +Benchmarks generated on a 1.2 Ghz Quad-Core ARM Cortex A53 equipped [Pine64](https://www.pine64.com/). + +``` +minio@minio-arm:$ benchcmp golang.txt arm64.txt +benchmark golang arm64 speedup +BenchmarkHash8Bytes-4 0.68 MB/s 5.70 MB/s 8.38x +BenchmarkHash1K-4 5.65 MB/s 326.30 MB/s 57.75x +BenchmarkHash8K-4 6.00 MB/s 570.63 MB/s 95.11x +BenchmarkHash1M-4 6.05 MB/s 638.23 MB/s 105.49x +``` + +## License + +Released under the Apache License v2.0. You can find the complete text in the file LICENSE. + +## Contributing + +Contributions are welcome, please send PRs for any enhancements. diff --git a/vendor/github.com/minio/sha256-simd/appveyor.yml b/vendor/github.com/minio/sha256-simd/appveyor.yml new file mode 100644 index 000000000..a66bfa9f2 --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/appveyor.yml @@ -0,0 +1,32 @@ +# version format +version: "{build}" + +# Operating system (build VM template) +os: Windows Server 2012 R2 + +# Platform. +platform: x64 + +clone_folder: c:\gopath\src\github.com\minio\sha256-simd + +# environment variables +environment: + GOPATH: c:\gopath + GO15VENDOREXPERIMENT: 1 + +# scripts that run after cloning repository +install: + - set PATH=%GOPATH%\bin;c:\go\bin;%PATH% + - go version + - go env + +# to run your custom scripts instead of automatic MSBuild +build_script: + - go test . + - go test -race . + +# to disable automatic tests +test: off + +# to disable deployment +deploy: off diff --git a/vendor/github.com/minio/sha256-simd/cpuid.go b/vendor/github.com/minio/sha256-simd/cpuid.go new file mode 100644 index 000000000..878ad4638 --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/cpuid.go @@ -0,0 +1,119 @@ +// Minio Cloud Storage, (C) 2016 Minio, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +package sha256 + +// True when SIMD instructions are available. +var avx512 bool +var avx2 bool +var avx bool +var sse bool +var sse2 bool +var sse3 bool +var ssse3 bool +var sse41 bool +var sse42 bool +var popcnt bool +var sha bool +var armSha = haveArmSha() + +func init() { + var _xsave bool + var _osxsave bool + var _avx bool + var _avx2 bool + var _avx512f bool + var _avx512dq bool + // var _avx512pf bool + // var _avx512er bool + // var _avx512cd bool + var _avx512bw bool + var _avx512vl bool + var _sseState bool + var _avxState bool + var _opmaskState bool + var _zmmHI256State bool + var _hi16ZmmState bool + + mfi, _, _, _ := cpuid(0) + + if mfi >= 1 { + _, _, c, d := cpuid(1) + + sse = (d & (1 << 25)) != 0 + sse2 = (d & (1 << 26)) != 0 + sse3 = (c & (1 << 0)) != 0 + ssse3 = (c & (1 << 9)) != 0 + sse41 = (c & (1 << 19)) != 0 + sse42 = (c & (1 << 20)) != 0 + popcnt = (c & (1 << 23)) != 0 + _xsave = (c & (1 << 26)) != 0 + _osxsave = (c & (1 << 27)) != 0 + _avx = (c & (1 << 28)) != 0 + } + + if mfi >= 7 { + _, b, _, _ := cpuid(7) + + _avx2 = (b & (1 << 5)) != 0 + _avx512f = (b & (1 << 16)) != 0 + _avx512dq = (b & (1 << 17)) != 0 + // _avx512pf = (b & (1 << 26)) != 0 + // _avx512er = (b & (1 << 27)) != 0 + // _avx512cd = (b & (1 << 28)) != 0 + _avx512bw = (b & (1 << 30)) != 0 + _avx512vl = (b & (1 << 31)) != 0 + sha = (b & (1 << 29)) != 0 + } + + // Stop here if XSAVE unsupported or not enabled + if !_xsave || !_osxsave { + return + } + + if _xsave && _osxsave { + a, _ := xgetbv(0) + + _sseState = (a & (1 << 1)) != 0 + _avxState = (a & (1 << 2)) != 0 + _opmaskState = (a & (1 << 5)) != 0 + _zmmHI256State = (a & (1 << 6)) != 0 + _hi16ZmmState = (a & (1 << 7)) != 0 + } else { + _sseState = true + } + + // Very unlikely that OS would enable XSAVE and then disable SSE + if !_sseState { + sse = false + sse2 = false + sse3 = false + ssse3 = false + sse41 = false + sse42 = false + } + + if _avxState { + avx = _avx + avx2 = _avx2 + } + + if _opmaskState && _zmmHI256State && _hi16ZmmState { + avx512 = (_avx512f && + _avx512dq && + _avx512bw && + _avx512vl) + } +} diff --git a/vendor/github.com/minio/sha256-simd/cpuid_386.go b/vendor/github.com/minio/sha256-simd/cpuid_386.go new file mode 100644 index 000000000..c9890be47 --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/cpuid_386.go @@ -0,0 +1,24 @@ +// Minio Cloud Storage, (C) 2016 Minio, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +package sha256 + +func cpuid(op uint32) (eax, ebx, ecx, edx uint32) +func cpuidex(op, op2 uint32) (eax, ebx, ecx, edx uint32) +func xgetbv(index uint32) (eax, edx uint32) + +func haveArmSha() bool { + return false +} diff --git a/vendor/github.com/minio/sha256-simd/cpuid_386.s b/vendor/github.com/minio/sha256-simd/cpuid_386.s new file mode 100644 index 000000000..1511cd6f6 --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/cpuid_386.s @@ -0,0 +1,53 @@ +// The MIT License (MIT) +// +// Copyright (c) 2015 Klaus Post +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +// +build 386,!gccgo + +// func cpuid(op uint32) (eax, ebx, ecx, edx uint32) +TEXT ·cpuid(SB), 7, $0 + XORL CX, CX + MOVL op+0(FP), AX + CPUID + MOVL AX, eax+4(FP) + MOVL BX, ebx+8(FP) + MOVL CX, ecx+12(FP) + MOVL DX, edx+16(FP) + RET + +// func cpuidex(op, op2 uint32) (eax, ebx, ecx, edx uint32) +TEXT ·cpuidex(SB), 7, $0 + MOVL op+0(FP), AX + MOVL op2+4(FP), CX + CPUID + MOVL AX, eax+8(FP) + MOVL BX, ebx+12(FP) + MOVL CX, ecx+16(FP) + MOVL DX, edx+20(FP) + RET + +// func xgetbv(index uint32) (eax, edx uint32) +TEXT ·xgetbv(SB), 7, $0 + MOVL index+0(FP), CX + BYTE $0x0f; BYTE $0x01; BYTE $0xd0 // XGETBV + MOVL AX, eax+4(FP) + MOVL DX, edx+8(FP) + RET diff --git a/vendor/github.com/minio/sha256-simd/cpuid_amd64.go b/vendor/github.com/minio/sha256-simd/cpuid_amd64.go new file mode 100644 index 000000000..c9890be47 --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/cpuid_amd64.go @@ -0,0 +1,24 @@ +// Minio Cloud Storage, (C) 2016 Minio, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +package sha256 + +func cpuid(op uint32) (eax, ebx, ecx, edx uint32) +func cpuidex(op, op2 uint32) (eax, ebx, ecx, edx uint32) +func xgetbv(index uint32) (eax, edx uint32) + +func haveArmSha() bool { + return false +} diff --git a/vendor/github.com/minio/sha256-simd/cpuid_amd64.s b/vendor/github.com/minio/sha256-simd/cpuid_amd64.s new file mode 100644 index 000000000..b0f414748 --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/cpuid_amd64.s @@ -0,0 +1,53 @@ +// The MIT License (MIT) +// +// Copyright (c) 2015 Klaus Post +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +// +build amd64,!gccgo + +// func cpuid(op uint32) (eax, ebx, ecx, edx uint32) +TEXT ·cpuid(SB), 7, $0 + XORQ CX, CX + MOVL op+0(FP), AX + CPUID + MOVL AX, eax+8(FP) + MOVL BX, ebx+12(FP) + MOVL CX, ecx+16(FP) + MOVL DX, edx+20(FP) + RET + +// func cpuidex(op, op2 uint32) (eax, ebx, ecx, edx uint32) +TEXT ·cpuidex(SB), 7, $0 + MOVL op+0(FP), AX + MOVL op2+4(FP), CX + CPUID + MOVL AX, eax+8(FP) + MOVL BX, ebx+12(FP) + MOVL CX, ecx+16(FP) + MOVL DX, edx+20(FP) + RET + +// func xgetbv(index uint32) (eax, edx uint32) +TEXT ·xgetbv(SB), 7, $0 + MOVL index+0(FP), CX + BYTE $0x0f; BYTE $0x01; BYTE $0xd0 // XGETBV + MOVL AX, eax+8(FP) + MOVL DX, edx+12(FP) + RET diff --git a/vendor/github.com/minio/sha256-simd/cpuid_arm.go b/vendor/github.com/minio/sha256-simd/cpuid_arm.go new file mode 100644 index 000000000..351dff4b6 --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/cpuid_arm.go @@ -0,0 +1,32 @@ +// Minio Cloud Storage, (C) 2016 Minio, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +package sha256 + +func cpuid(op uint32) (eax, ebx, ecx, edx uint32) { + return 0, 0, 0, 0 +} + +func cpuidex(op, op2 uint32) (eax, ebx, ecx, edx uint32) { + return 0, 0, 0, 0 +} + +func xgetbv(index uint32) (eax, edx uint32) { + return 0, 0 +} + +func haveArmSha() bool { + return false +} diff --git a/vendor/github.com/minio/sha256-simd/cpuid_linux_arm64.go b/vendor/github.com/minio/sha256-simd/cpuid_linux_arm64.go new file mode 100644 index 000000000..e739996d9 --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/cpuid_linux_arm64.go @@ -0,0 +1,49 @@ +// +build arm64,linux + +// Minio Cloud Storage, (C) 2016 Minio, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +package sha256 + +import ( + "bytes" + "io/ioutil" +) + +func cpuid(op uint32) (eax, ebx, ecx, edx uint32) { + return 0, 0, 0, 0 +} + +func cpuidex(op, op2 uint32) (eax, ebx, ecx, edx uint32) { + return 0, 0, 0, 0 +} + +func xgetbv(index uint32) (eax, edx uint32) { + return 0, 0 +} + +// File to check for cpu capabilities. +const procCPUInfo = "/proc/cpuinfo" + +// Feature to check for. +const sha256Feature = "sha2" + +func haveArmSha() bool { + cpuInfo, err := ioutil.ReadFile(procCPUInfo) + if err != nil { + return false + } + return bytes.Contains(cpuInfo, []byte(sha256Feature)) +} diff --git a/vendor/github.com/minio/sha256-simd/cpuid_other.go b/vendor/github.com/minio/sha256-simd/cpuid_other.go new file mode 100644 index 000000000..3e4415828 --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/cpuid_other.go @@ -0,0 +1,34 @@ +// Minio Cloud Storage, (C) 2016 Minio, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +// +build !386,!amd64,!arm,!arm64 arm64,!linux + +package sha256 + +func cpuid(op uint32) (eax, ebx, ecx, edx uint32) { + return 0, 0, 0, 0 +} + +func cpuidex(op, op2 uint32) (eax, ebx, ecx, edx uint32) { + return 0, 0, 0, 0 +} + +func xgetbv(index uint32) (eax, edx uint32) { + return 0, 0 +} + +func haveArmSha() bool { + return false +} diff --git a/vendor/github.com/minio/sha256-simd/go.mod b/vendor/github.com/minio/sha256-simd/go.mod new file mode 100644 index 000000000..4451e9eb2 --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/go.mod @@ -0,0 +1,3 @@ +module github.com/minio/sha256-simd + +go 1.12 diff --git a/vendor/github.com/minio/sha256-simd/sha256.go b/vendor/github.com/minio/sha256-simd/sha256.go new file mode 100644 index 000000000..4e1f6d2f7 --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/sha256.go @@ -0,0 +1,409 @@ +/* + * Minio Cloud Storage, (C) 2016 Minio, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package sha256 + +import ( + "crypto/sha256" + "encoding/binary" + "hash" + "runtime" +) + +// Size - The size of a SHA256 checksum in bytes. +const Size = 32 + +// BlockSize - The blocksize of SHA256 in bytes. +const BlockSize = 64 + +const ( + chunk = BlockSize + init0 = 0x6A09E667 + init1 = 0xBB67AE85 + init2 = 0x3C6EF372 + init3 = 0xA54FF53A + init4 = 0x510E527F + init5 = 0x9B05688C + init6 = 0x1F83D9AB + init7 = 0x5BE0CD19 +) + +// digest represents the partial evaluation of a checksum. +type digest struct { + h [8]uint32 + x [chunk]byte + nx int + len uint64 +} + +// Reset digest back to default +func (d *digest) Reset() { + d.h[0] = init0 + d.h[1] = init1 + d.h[2] = init2 + d.h[3] = init3 + d.h[4] = init4 + d.h[5] = init5 + d.h[6] = init6 + d.h[7] = init7 + d.nx = 0 + d.len = 0 +} + +type blockfuncType int + +const ( + blockfuncGeneric blockfuncType = iota + blockfuncAvx512 blockfuncType = iota + blockfuncAvx2 blockfuncType = iota + blockfuncAvx blockfuncType = iota + blockfuncSsse blockfuncType = iota + blockfuncSha blockfuncType = iota + blockfuncArm blockfuncType = iota +) + +var blockfunc blockfuncType + +func init() { + is386bit := runtime.GOARCH == "386" + isARM := runtime.GOARCH == "arm" + switch { + case is386bit || isARM: + blockfunc = blockfuncGeneric + case sha && ssse3 && sse41: + blockfunc = blockfuncSha + case avx2: + blockfunc = blockfuncAvx2 + case avx: + blockfunc = blockfuncAvx + case ssse3: + blockfunc = blockfuncSsse + case armSha: + blockfunc = blockfuncArm + default: + blockfunc = blockfuncGeneric + } +} + +// New returns a new hash.Hash computing the SHA256 checksum. +func New() hash.Hash { + if blockfunc != blockfuncGeneric { + d := new(digest) + d.Reset() + return d + } + // Fallback to the standard golang implementation + // if no features were found. + return sha256.New() +} + +// Sum256 - single caller sha256 helper +func Sum256(data []byte) (result [Size]byte) { + var d digest + d.Reset() + d.Write(data) + result = d.checkSum() + return +} + +// Return size of checksum +func (d *digest) Size() int { return Size } + +// Return blocksize of checksum +func (d *digest) BlockSize() int { return BlockSize } + +// Write to digest +func (d *digest) Write(p []byte) (nn int, err error) { + nn = len(p) + d.len += uint64(nn) + if d.nx > 0 { + n := copy(d.x[d.nx:], p) + d.nx += n + if d.nx == chunk { + block(d, d.x[:]) + d.nx = 0 + } + p = p[n:] + } + if len(p) >= chunk { + n := len(p) &^ (chunk - 1) + block(d, p[:n]) + p = p[n:] + } + if len(p) > 0 { + d.nx = copy(d.x[:], p) + } + return +} + +// Return sha256 sum in bytes +func (d *digest) Sum(in []byte) []byte { + // Make a copy of d0 so that caller can keep writing and summing. + d0 := *d + hash := d0.checkSum() + return append(in, hash[:]...) +} + +// Intermediate checksum function +func (d *digest) checkSum() (digest [Size]byte) { + n := d.nx + + var k [64]byte + copy(k[:], d.x[:n]) + + k[n] = 0x80 + + if n >= 56 { + block(d, k[:]) + + // clear block buffer - go compiles this to optimal 1x xorps + 4x movups + // unfortunately expressing this more succinctly results in much worse code + k[0] = 0 + k[1] = 0 + k[2] = 0 + k[3] = 0 + k[4] = 0 + k[5] = 0 + k[6] = 0 + k[7] = 0 + k[8] = 0 + k[9] = 0 + k[10] = 0 + k[11] = 0 + k[12] = 0 + k[13] = 0 + k[14] = 0 + k[15] = 0 + k[16] = 0 + k[17] = 0 + k[18] = 0 + k[19] = 0 + k[20] = 0 + k[21] = 0 + k[22] = 0 + k[23] = 0 + k[24] = 0 + k[25] = 0 + k[26] = 0 + k[27] = 0 + k[28] = 0 + k[29] = 0 + k[30] = 0 + k[31] = 0 + k[32] = 0 + k[33] = 0 + k[34] = 0 + k[35] = 0 + k[36] = 0 + k[37] = 0 + k[38] = 0 + k[39] = 0 + k[40] = 0 + k[41] = 0 + k[42] = 0 + k[43] = 0 + k[44] = 0 + k[45] = 0 + k[46] = 0 + k[47] = 0 + k[48] = 0 + k[49] = 0 + k[50] = 0 + k[51] = 0 + k[52] = 0 + k[53] = 0 + k[54] = 0 + k[55] = 0 + k[56] = 0 + k[57] = 0 + k[58] = 0 + k[59] = 0 + k[60] = 0 + k[61] = 0 + k[62] = 0 + k[63] = 0 + } + binary.BigEndian.PutUint64(k[56:64], uint64(d.len)<<3) + block(d, k[:]) + + { + const i = 0 + binary.BigEndian.PutUint32(digest[i*4:i*4+4], d.h[i]) + } + { + const i = 1 + binary.BigEndian.PutUint32(digest[i*4:i*4+4], d.h[i]) + } + { + const i = 2 + binary.BigEndian.PutUint32(digest[i*4:i*4+4], d.h[i]) + } + { + const i = 3 + binary.BigEndian.PutUint32(digest[i*4:i*4+4], d.h[i]) + } + { + const i = 4 + binary.BigEndian.PutUint32(digest[i*4:i*4+4], d.h[i]) + } + { + const i = 5 + binary.BigEndian.PutUint32(digest[i*4:i*4+4], d.h[i]) + } + { + const i = 6 + binary.BigEndian.PutUint32(digest[i*4:i*4+4], d.h[i]) + } + { + const i = 7 + binary.BigEndian.PutUint32(digest[i*4:i*4+4], d.h[i]) + } + + return +} + +func block(dig *digest, p []byte) { + if blockfunc == blockfuncSha { + blockShaGo(dig, p) + } else if blockfunc == blockfuncAvx2 { + blockAvx2Go(dig, p) + } else if blockfunc == blockfuncAvx { + blockAvxGo(dig, p) + } else if blockfunc == blockfuncSsse { + blockSsseGo(dig, p) + } else if blockfunc == blockfuncArm { + blockArmGo(dig, p) + } else if blockfunc == blockfuncGeneric { + blockGeneric(dig, p) + } +} + +func blockGeneric(dig *digest, p []byte) { + var w [64]uint32 + h0, h1, h2, h3, h4, h5, h6, h7 := dig.h[0], dig.h[1], dig.h[2], dig.h[3], dig.h[4], dig.h[5], dig.h[6], dig.h[7] + for len(p) >= chunk { + // Can interlace the computation of w with the + // rounds below if needed for speed. + for i := 0; i < 16; i++ { + j := i * 4 + w[i] = uint32(p[j])<<24 | uint32(p[j+1])<<16 | uint32(p[j+2])<<8 | uint32(p[j+3]) + } + for i := 16; i < 64; i++ { + v1 := w[i-2] + t1 := (v1>>17 | v1<<(32-17)) ^ (v1>>19 | v1<<(32-19)) ^ (v1 >> 10) + v2 := w[i-15] + t2 := (v2>>7 | v2<<(32-7)) ^ (v2>>18 | v2<<(32-18)) ^ (v2 >> 3) + w[i] = t1 + w[i-7] + t2 + w[i-16] + } + + a, b, c, d, e, f, g, h := h0, h1, h2, h3, h4, h5, h6, h7 + + for i := 0; i < 64; i++ { + t1 := h + ((e>>6 | e<<(32-6)) ^ (e>>11 | e<<(32-11)) ^ (e>>25 | e<<(32-25))) + ((e & f) ^ (^e & g)) + _K[i] + w[i] + + t2 := ((a>>2 | a<<(32-2)) ^ (a>>13 | a<<(32-13)) ^ (a>>22 | a<<(32-22))) + ((a & b) ^ (a & c) ^ (b & c)) + + h = g + g = f + f = e + e = d + t1 + d = c + c = b + b = a + a = t1 + t2 + } + + h0 += a + h1 += b + h2 += c + h3 += d + h4 += e + h5 += f + h6 += g + h7 += h + + p = p[chunk:] + } + + dig.h[0], dig.h[1], dig.h[2], dig.h[3], dig.h[4], dig.h[5], dig.h[6], dig.h[7] = h0, h1, h2, h3, h4, h5, h6, h7 +} + +var _K = []uint32{ + 0x428a2f98, + 0x71374491, + 0xb5c0fbcf, + 0xe9b5dba5, + 0x3956c25b, + 0x59f111f1, + 0x923f82a4, + 0xab1c5ed5, + 0xd807aa98, + 0x12835b01, + 0x243185be, + 0x550c7dc3, + 0x72be5d74, + 0x80deb1fe, + 0x9bdc06a7, + 0xc19bf174, + 0xe49b69c1, + 0xefbe4786, + 0x0fc19dc6, + 0x240ca1cc, + 0x2de92c6f, + 0x4a7484aa, + 0x5cb0a9dc, + 0x76f988da, + 0x983e5152, + 0xa831c66d, + 0xb00327c8, + 0xbf597fc7, + 0xc6e00bf3, + 0xd5a79147, + 0x06ca6351, + 0x14292967, + 0x27b70a85, + 0x2e1b2138, + 0x4d2c6dfc, + 0x53380d13, + 0x650a7354, + 0x766a0abb, + 0x81c2c92e, + 0x92722c85, + 0xa2bfe8a1, + 0xa81a664b, + 0xc24b8b70, + 0xc76c51a3, + 0xd192e819, + 0xd6990624, + 0xf40e3585, + 0x106aa070, + 0x19a4c116, + 0x1e376c08, + 0x2748774c, + 0x34b0bcb5, + 0x391c0cb3, + 0x4ed8aa4a, + 0x5b9cca4f, + 0x682e6ff3, + 0x748f82ee, + 0x78a5636f, + 0x84c87814, + 0x8cc70208, + 0x90befffa, + 0xa4506ceb, + 0xbef9a3f7, + 0xc67178f2, +} diff --git a/vendor/github.com/minio/sha256-simd/sha256blockAvx2_amd64.go b/vendor/github.com/minio/sha256-simd/sha256blockAvx2_amd64.go new file mode 100644 index 000000000..52fcaee6d --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/sha256blockAvx2_amd64.go @@ -0,0 +1,22 @@ +//+build !noasm,!appengine + +/* + * Minio Cloud Storage, (C) 2016 Minio, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package sha256 + +//go:noescape +func blockAvx2(h []uint32, message []uint8) diff --git a/vendor/github.com/minio/sha256-simd/sha256blockAvx2_amd64.s b/vendor/github.com/minio/sha256-simd/sha256blockAvx2_amd64.s new file mode 100644 index 000000000..80b0b739b --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/sha256blockAvx2_amd64.s @@ -0,0 +1,1449 @@ +//+build !noasm,!appengine + +// SHA256 implementation for AVX2 + +// +// Minio Cloud Storage, (C) 2016 Minio, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +// +// This code is based on an Intel White-Paper: +// "Fast SHA-256 Implementations on Intel Architecture Processors" +// +// together with the reference implementation from the following authors: +// James Guilford +// Kirk Yap +// Tim Chen +// +// For Golang it has been converted to Plan 9 assembly with the help of +// github.com/minio/asm2plan9s to assemble Intel instructions to their Plan9 +// equivalents +// + +DATA K256<>+0x000(SB)/8, $0x71374491428a2f98 +DATA K256<>+0x008(SB)/8, $0xe9b5dba5b5c0fbcf +DATA K256<>+0x010(SB)/8, $0x71374491428a2f98 +DATA K256<>+0x018(SB)/8, $0xe9b5dba5b5c0fbcf +DATA K256<>+0x020(SB)/8, $0x59f111f13956c25b +DATA K256<>+0x028(SB)/8, $0xab1c5ed5923f82a4 +DATA K256<>+0x030(SB)/8, $0x59f111f13956c25b +DATA K256<>+0x038(SB)/8, $0xab1c5ed5923f82a4 +DATA K256<>+0x040(SB)/8, $0x12835b01d807aa98 +DATA K256<>+0x048(SB)/8, $0x550c7dc3243185be +DATA K256<>+0x050(SB)/8, $0x12835b01d807aa98 +DATA K256<>+0x058(SB)/8, $0x550c7dc3243185be +DATA K256<>+0x060(SB)/8, $0x80deb1fe72be5d74 +DATA K256<>+0x068(SB)/8, $0xc19bf1749bdc06a7 +DATA K256<>+0x070(SB)/8, $0x80deb1fe72be5d74 +DATA K256<>+0x078(SB)/8, $0xc19bf1749bdc06a7 +DATA K256<>+0x080(SB)/8, $0xefbe4786e49b69c1 +DATA K256<>+0x088(SB)/8, $0x240ca1cc0fc19dc6 +DATA K256<>+0x090(SB)/8, $0xefbe4786e49b69c1 +DATA K256<>+0x098(SB)/8, $0x240ca1cc0fc19dc6 +DATA K256<>+0x0a0(SB)/8, $0x4a7484aa2de92c6f +DATA K256<>+0x0a8(SB)/8, $0x76f988da5cb0a9dc +DATA K256<>+0x0b0(SB)/8, $0x4a7484aa2de92c6f +DATA K256<>+0x0b8(SB)/8, $0x76f988da5cb0a9dc +DATA K256<>+0x0c0(SB)/8, $0xa831c66d983e5152 +DATA K256<>+0x0c8(SB)/8, $0xbf597fc7b00327c8 +DATA K256<>+0x0d0(SB)/8, $0xa831c66d983e5152 +DATA K256<>+0x0d8(SB)/8, $0xbf597fc7b00327c8 +DATA K256<>+0x0e0(SB)/8, $0xd5a79147c6e00bf3 +DATA K256<>+0x0e8(SB)/8, $0x1429296706ca6351 +DATA K256<>+0x0f0(SB)/8, $0xd5a79147c6e00bf3 +DATA K256<>+0x0f8(SB)/8, $0x1429296706ca6351 +DATA K256<>+0x100(SB)/8, $0x2e1b213827b70a85 +DATA K256<>+0x108(SB)/8, $0x53380d134d2c6dfc +DATA K256<>+0x110(SB)/8, $0x2e1b213827b70a85 +DATA K256<>+0x118(SB)/8, $0x53380d134d2c6dfc +DATA K256<>+0x120(SB)/8, $0x766a0abb650a7354 +DATA K256<>+0x128(SB)/8, $0x92722c8581c2c92e +DATA K256<>+0x130(SB)/8, $0x766a0abb650a7354 +DATA K256<>+0x138(SB)/8, $0x92722c8581c2c92e +DATA K256<>+0x140(SB)/8, $0xa81a664ba2bfe8a1 +DATA K256<>+0x148(SB)/8, $0xc76c51a3c24b8b70 +DATA K256<>+0x150(SB)/8, $0xa81a664ba2bfe8a1 +DATA K256<>+0x158(SB)/8, $0xc76c51a3c24b8b70 +DATA K256<>+0x160(SB)/8, $0xd6990624d192e819 +DATA K256<>+0x168(SB)/8, $0x106aa070f40e3585 +DATA K256<>+0x170(SB)/8, $0xd6990624d192e819 +DATA K256<>+0x178(SB)/8, $0x106aa070f40e3585 +DATA K256<>+0x180(SB)/8, $0x1e376c0819a4c116 +DATA K256<>+0x188(SB)/8, $0x34b0bcb52748774c +DATA K256<>+0x190(SB)/8, $0x1e376c0819a4c116 +DATA K256<>+0x198(SB)/8, $0x34b0bcb52748774c +DATA K256<>+0x1a0(SB)/8, $0x4ed8aa4a391c0cb3 +DATA K256<>+0x1a8(SB)/8, $0x682e6ff35b9cca4f +DATA K256<>+0x1b0(SB)/8, $0x4ed8aa4a391c0cb3 +DATA K256<>+0x1b8(SB)/8, $0x682e6ff35b9cca4f +DATA K256<>+0x1c0(SB)/8, $0x78a5636f748f82ee +DATA K256<>+0x1c8(SB)/8, $0x8cc7020884c87814 +DATA K256<>+0x1d0(SB)/8, $0x78a5636f748f82ee +DATA K256<>+0x1d8(SB)/8, $0x8cc7020884c87814 +DATA K256<>+0x1e0(SB)/8, $0xa4506ceb90befffa +DATA K256<>+0x1e8(SB)/8, $0xc67178f2bef9a3f7 +DATA K256<>+0x1f0(SB)/8, $0xa4506ceb90befffa +DATA K256<>+0x1f8(SB)/8, $0xc67178f2bef9a3f7 + +DATA K256<>+0x200(SB)/8, $0x0405060700010203 +DATA K256<>+0x208(SB)/8, $0x0c0d0e0f08090a0b +DATA K256<>+0x210(SB)/8, $0x0405060700010203 +DATA K256<>+0x218(SB)/8, $0x0c0d0e0f08090a0b +DATA K256<>+0x220(SB)/8, $0x0b0a090803020100 +DATA K256<>+0x228(SB)/8, $0xffffffffffffffff +DATA K256<>+0x230(SB)/8, $0x0b0a090803020100 +DATA K256<>+0x238(SB)/8, $0xffffffffffffffff +DATA K256<>+0x240(SB)/8, $0xffffffffffffffff +DATA K256<>+0x248(SB)/8, $0x0b0a090803020100 +DATA K256<>+0x250(SB)/8, $0xffffffffffffffff +DATA K256<>+0x258(SB)/8, $0x0b0a090803020100 + +GLOBL K256<>(SB), 8, $608 + +// We need 0x220 stack space aligned on a 512 boundary, so for the +// worstcase-aligned SP we need twice this amount, being 1088 (=0x440) +// +// SP aligned end-aligned stacksize +// 100013d0 10001400 10001620 592 +// 100013d8 10001400 10001620 584 +// 100013e0 10001600 10001820 1088 +// 100013e8 10001600 10001820 1080 + +// func blockAvx2(h []uint32, message []uint8) +TEXT ·blockAvx2(SB),$1088-48 + + MOVQ h+0(FP), DI // DI: &h + MOVQ message_base+24(FP), SI // SI: &message + MOVQ message_len+32(FP), DX // len(message) + ADDQ SI, DX // end pointer of input + MOVQ SP, R11 // copy stack pointer + ADDQ $0x220, SP // sp += 0x220 + ANDQ $0xfffffffffffffe00, SP // align stack frame + ADDQ $0x1c0, SP + MOVQ DI, 0x40(SP) // save ctx + MOVQ SI, 0x48(SP) // save input + MOVQ DX, 0x50(SP) // save end pointer + MOVQ R11, 0x58(SP) // save copy of stack pointer + + WORD $0xf8c5; BYTE $0x77 // vzeroupper + ADDQ $0x40, SI // input++ + MOVL (DI), AX + MOVQ SI, R12 // borrow $T1 + MOVL 4(DI), BX + CMPQ SI, DX // $_end + MOVL 8(DI), CX + LONG $0xe4440f4c // cmove r12,rsp /* next block or random data */ + MOVL 12(DI), DX + MOVL 16(DI), R8 + MOVL 20(DI), R9 + MOVL 24(DI), R10 + MOVL 28(DI), R11 + + LEAQ K256<>(SB), BP + LONG $0x856f7dc5; LONG $0x00000220 // VMOVDQA YMM8, 0x220[rbp] /* vmovdqa ymm8,YMMWORD PTR [rip+0x220] */ + LONG $0x8d6f7dc5; LONG $0x00000240 // VMOVDQA YMM9, 0x240[rbp] /* vmovdqa ymm9,YMMWORD PTR [rip+0x240] */ + LONG $0x956f7dc5; LONG $0x00000200 // VMOVDQA YMM10, 0x200[rbp] /* vmovdqa ymm7,YMMWORD PTR [rip+0x200] */ + +loop0: + LONG $0x6f7dc1c4; BYTE $0xfa // VMOVDQA YMM7, YMM10 + + // Load first 16 dwords from two blocks + MOVOU -64(SI), X0 // vmovdqu xmm0,XMMWORD PTR [rsi-0x40] + MOVOU -48(SI), X1 // vmovdqu xmm1,XMMWORD PTR [rsi-0x30] + MOVOU -32(SI), X2 // vmovdqu xmm2,XMMWORD PTR [rsi-0x20] + MOVOU -16(SI), X3 // vmovdqu xmm3,XMMWORD PTR [rsi-0x10] + + // Byte swap data and transpose data into high/low + LONG $0x387dc3c4; WORD $0x2404; BYTE $0x01 // vinserti128 ymm0,ymm0,[r12],0x1 + LONG $0x3875c3c4; LONG $0x0110244c // vinserti128 ymm1,ymm1,0x10[r12],0x1 + LONG $0x007de2c4; BYTE $0xc7 // vpshufb ymm0,ymm0,ymm7 + LONG $0x386dc3c4; LONG $0x01202454 // vinserti128 ymm2,ymm2,0x20[r12],0x1 + LONG $0x0075e2c4; BYTE $0xcf // vpshufb ymm1,ymm1,ymm7 + LONG $0x3865c3c4; LONG $0x0130245c // vinserti128 ymm3,ymm3,0x30[r12],0x1 + + LEAQ K256<>(SB), BP + LONG $0x006de2c4; BYTE $0xd7 // vpshufb ymm2,ymm2,ymm7 + LONG $0x65fefdc5; BYTE $0x00 // vpaddd ymm4,ymm0,[rbp] + LONG $0x0065e2c4; BYTE $0xdf // vpshufb ymm3,ymm3,ymm7 + LONG $0x6dfef5c5; BYTE $0x20 // vpaddd ymm5,ymm1,0x20[rbp] + LONG $0x75feedc5; BYTE $0x40 // vpaddd ymm6,ymm2,0x40[rbp] + LONG $0x7dfee5c5; BYTE $0x60 // vpaddd ymm7,ymm3,0x60[rbp] + + LONG $0x247ffdc5; BYTE $0x24 // vmovdqa [rsp],ymm4 + XORQ R14, R14 + LONG $0x6c7ffdc5; WORD $0x2024 // vmovdqa [rsp+0x20],ymm5 + + ADDQ $-0x40, SP + MOVQ BX, DI + LONG $0x347ffdc5; BYTE $0x24 // vmovdqa [rsp],ymm6 + XORQ CX, DI // magic + LONG $0x7c7ffdc5; WORD $0x2024 // vmovdqa [rsp+0x20],ymm7 + MOVQ R9, R12 + ADDQ $0x80, BP + +loop1: + // Schedule 48 input dwords, by doing 3 rounds of 12 each + // Note: SIMD instructions are interleaved with the SHA calculations + ADDQ $-0x40, SP + LONG $0x0f75e3c4; WORD $0x04e0 // vpalignr ymm4,ymm1,ymm0,0x4 + + // ROUND(AX, BX, CX, DX, R8, R9, R10, R11, R12, R13, R14, R15, DI, SP, 0x80) + LONG $0x249c0344; LONG $0x00000080 // add r11d,[rsp+0x80] + WORD $0x2145; BYTE $0xc4 // and r12d,r8d + LONG $0xf07b43c4; WORD $0x19e8 // rorx r13d,r8d,0x19 + LONG $0x0f65e3c4; WORD $0x04fa // vpalignr ymm7,ymm3,ymm2,0x4 + LONG $0xf07b43c4; WORD $0x0bf8 // rorx r15d,r8d,0xb + LONG $0x30048d42 // lea eax,[rax+r14*1] + LONG $0x231c8d47 // lea r11d,[r11+r12*1] + LONG $0xd472cdc5; BYTE $0x07 // vpsrld ymm6,ymm4,0x7 + LONG $0xf23842c4; BYTE $0xe2 // andn r12d,r8d,r10d + WORD $0x3145; BYTE $0xfd // xor r13d,r15d + LONG $0xf07b43c4; WORD $0x06f0 // rorx r14d,r8d,0x6 + LONG $0xc7fefdc5 // vpaddd ymm0,ymm0,ymm7 + LONG $0x231c8d47 // lea r11d,[r11+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8941; BYTE $0xc7 // mov r15d,eax + LONG $0xd472c5c5; BYTE $0x03 // vpsrld ymm7,ymm4,0x3 + LONG $0xf07b63c4; WORD $0x16e0 // rorx r12d,eax,0x16 + LONG $0x2b1c8d47 // lea r11d,[r11+r13*1] + WORD $0x3141; BYTE $0xdf // xor r15d,ebx + LONG $0xf472d5c5; BYTE $0x0e // vpslld ymm5,ymm4,0xe + LONG $0xf07b63c4; WORD $0x0df0 // rorx r14d,eax,0xd + LONG $0xf07b63c4; WORD $0x02e8 // rorx r13d,eax,0x2 + LONG $0x1a148d42 // lea edx,[rdx+r11*1] + LONG $0xe6efc5c5 // vpxor ymm4,ymm7,ymm6 + WORD $0x2144; BYTE $0xff // and edi,r15d + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0xdf31 // xor edi,ebx + LONG $0xfb70fdc5; BYTE $0xfa // vpshufd ymm7,ymm3,0xfa + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x3b1c8d45 // lea r11d,[r11+rdi*1] + WORD $0x8945; BYTE $0xc4 // mov r12d,r8d + LONG $0xd672cdc5; BYTE $0x0b // vpsrld ymm6,ymm6,0xb + + // ROUND(R11, AX, BX, CX, DX, R8, R9, R10, R12, R13, R14, DI, R15, SP, 0x84) + LONG $0x24940344; LONG $0x00000084 // add r10d,[rsp+0x84] + WORD $0x2141; BYTE $0xd4 // and r12d,edx + LONG $0xf07b63c4; WORD $0x19ea // rorx r13d,edx,0x19 + LONG $0xe5efddc5 // vpxor ymm4,ymm4,ymm5 + LONG $0xf07be3c4; WORD $0x0bfa // rorx edi,edx,0xb + LONG $0x331c8d47 // lea r11d,[r11+r14*1] + LONG $0x22148d47 // lea r10d,[r10+r12*1] + LONG $0xf572d5c5; BYTE $0x0b // vpslld ymm5,ymm5,0xb + LONG $0xf26842c4; BYTE $0xe1 // andn r12d,edx,r9d + WORD $0x3141; BYTE $0xfd // xor r13d,edi + LONG $0xf07b63c4; WORD $0x06f2 // rorx r14d,edx,0x6 + LONG $0xe6efddc5 // vpxor ymm4,ymm4,ymm6 + LONG $0x22148d47 // lea r10d,[r10+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8944; BYTE $0xdf // mov edi,r11d + LONG $0xd772cdc5; BYTE $0x0a // vpsrld ymm6,ymm7,0xa + LONG $0xf07b43c4; WORD $0x16e3 // rorx r12d,r11d,0x16 + LONG $0x2a148d47 // lea r10d,[r10+r13*1] + WORD $0xc731 // xor edi,eax + LONG $0xe5efddc5 // vpxor ymm4,ymm4,ymm5 + LONG $0xf07b43c4; WORD $0x0df3 // rorx r14d,r11d,0xd + LONG $0xf07b43c4; WORD $0x02eb // rorx r13d,r11d,0x2 + LONG $0x110c8d42 // lea ecx,[rcx+r10*1] + LONG $0xd773c5c5; BYTE $0x11 // vpsrlq ymm7,ymm7,0x11 + WORD $0x2141; BYTE $0xff // and r15d,edi + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3141; BYTE $0xc7 // xor r15d,eax + LONG $0xc4fefdc5 // vpaddd ymm0,ymm0,ymm4 + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x3a148d47 // lea r10d,[r10+r15*1] + WORD $0x8941; BYTE $0xd4 // mov r12d,edx + LONG $0xf7efcdc5 // vpxor ymm6,ymm6,ymm7 + + // ROUND(R10, R11, AX, BX, CX, DX, R8, R9, R12, R13, R14, R15, DI, SP, 0x88) + LONG $0x248c0344; LONG $0x00000088 // add r9d,[rsp+0x88] + WORD $0x2141; BYTE $0xcc // and r12d,ecx + LONG $0xf07b63c4; WORD $0x19e9 // rorx r13d,ecx,0x19 + LONG $0xd773c5c5; BYTE $0x02 // vpsrlq ymm7,ymm7,0x2 + LONG $0xf07b63c4; WORD $0x0bf9 // rorx r15d,ecx,0xb + LONG $0x32148d47 // lea r10d,[r10+r14*1] + LONG $0x210c8d47 // lea r9d,[r9+r12*1] + LONG $0xf7efcdc5 // vpxor ymm6,ymm6,ymm7 + LONG $0xf27042c4; BYTE $0xe0 // andn r12d,ecx,r8d + WORD $0x3145; BYTE $0xfd // xor r13d,r15d + LONG $0xf07b63c4; WORD $0x06f1 // rorx r14d,ecx,0x6 + LONG $0x004dc2c4; BYTE $0xf0 // vpshufb ymm6,ymm6,ymm8 + LONG $0x210c8d47 // lea r9d,[r9+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8945; BYTE $0xd7 // mov r15d,r10d + LONG $0xc6fefdc5 // vpaddd ymm0,ymm0,ymm6 + LONG $0xf07b43c4; WORD $0x16e2 // rorx r12d,r10d,0x16 + LONG $0x290c8d47 // lea r9d,[r9+r13*1] + WORD $0x3145; BYTE $0xdf // xor r15d,r11d + LONG $0xf870fdc5; BYTE $0x50 // vpshufd ymm7,ymm0,0x50 + LONG $0xf07b43c4; WORD $0x0df2 // rorx r14d,r10d,0xd + LONG $0xf07b43c4; WORD $0x02ea // rorx r13d,r10d,0x2 + LONG $0x0b1c8d42 // lea ebx,[rbx+r9*1] + LONG $0xd772cdc5; BYTE $0x0a // vpsrld ymm6,ymm7,0xa + WORD $0x2144; BYTE $0xff // and edi,r15d + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3144; BYTE $0xdf // xor edi,r11d + LONG $0xd773c5c5; BYTE $0x11 // vpsrlq ymm7,ymm7,0x11 + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x390c8d45 // lea r9d,[r9+rdi*1] + WORD $0x8941; BYTE $0xcc // mov r12d,ecx + LONG $0xf7efcdc5 // vpxor ymm6,ymm6,ymm7 + + // ROUND(R9, R10, R11, AX, BX, CX, DX, R8, R12, R13, R14, DI, R15, SP, 0x8c) + LONG $0x24840344; LONG $0x0000008c // add r8d,[rsp+0x8c] + WORD $0x2141; BYTE $0xdc // and r12d,ebx + LONG $0xf07b63c4; WORD $0x19eb // rorx r13d,ebx,0x19 + LONG $0xd773c5c5; BYTE $0x02 // vpsrlq ymm7,ymm7,0x2 + LONG $0xf07be3c4; WORD $0x0bfb // rorx edi,ebx,0xb + LONG $0x310c8d47 // lea r9d,[r9+r14*1] + LONG $0x20048d47 // lea r8d,[r8+r12*1] + LONG $0xf7efcdc5 // vpxor ymm6,ymm6,ymm7 + LONG $0xf26062c4; BYTE $0xe2 // andn r12d,ebx,edx + WORD $0x3141; BYTE $0xfd // xor r13d,edi + LONG $0xf07b63c4; WORD $0x06f3 // rorx r14d,ebx,0x6 + LONG $0x004dc2c4; BYTE $0xf1 // vpshufb ymm6,ymm6,ymm9 + LONG $0x20048d47 // lea r8d,[r8+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8944; BYTE $0xcf // mov edi,r9d + LONG $0xc6fefdc5 // vpaddd ymm0,ymm0,ymm6 + LONG $0xf07b43c4; WORD $0x16e1 // rorx r12d,r9d,0x16 + LONG $0x28048d47 // lea r8d,[r8+r13*1] + WORD $0x3144; BYTE $0xd7 // xor edi,r10d + LONG $0x75fefdc5; BYTE $0x00 // vpaddd ymm6,ymm0,[rbp+0x0] + LONG $0xf07b43c4; WORD $0x0df1 // rorx r14d,r9d,0xd + LONG $0xf07b43c4; WORD $0x02e9 // rorx r13d,r9d,0x2 + LONG $0x00048d42 // lea eax,[rax+r8*1] + WORD $0x2141; BYTE $0xff // and r15d,edi + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3145; BYTE $0xd7 // xor r15d,r10d + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x38048d47 // lea r8d,[r8+r15*1] + WORD $0x8941; BYTE $0xdc // mov r12d,ebx + + LONG $0x347ffdc5; BYTE $0x24 // vmovdqa [rsp],ymm6 + LONG $0x0f6de3c4; WORD $0x04e1 // vpalignr ymm4,ymm2,ymm1,0x4 + + // ROUND(R8, R9, R10, R11, AX, BX, CX, DX, R12, R13, R14, R15, DI, SP, 0xa0) + LONG $0xa0249403; WORD $0x0000; BYTE $0x00 // add edx,[rsp+0xa0] + WORD $0x2141; BYTE $0xc4 // and r12d,eax + LONG $0xf07b63c4; WORD $0x19e8 // rorx r13d,eax,0x19 + LONG $0x0f7de3c4; WORD $0x04fb // vpalignr ymm7,ymm0,ymm3,0x4 + LONG $0xf07b63c4; WORD $0x0bf8 // rorx r15d,eax,0xb + LONG $0x30048d47 // lea r8d,[r8+r14*1] + LONG $0x22148d42 // lea edx,[rdx+r12*1] + LONG $0xd472cdc5; BYTE $0x07 // vpsrld ymm6,ymm4,0x7 + LONG $0xf27862c4; BYTE $0xe1 // andn r12d,eax,ecx + WORD $0x3145; BYTE $0xfd // xor r13d,r15d + LONG $0xf07b63c4; WORD $0x06f0 // rorx r14d,eax,0x6 + LONG $0xcffef5c5 // vpaddd ymm1,ymm1,ymm7 + LONG $0x22148d42 // lea edx,[rdx+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8945; BYTE $0xc7 // mov r15d,r8d + LONG $0xd472c5c5; BYTE $0x03 // vpsrld ymm7,ymm4,0x3 + LONG $0xf07b43c4; WORD $0x16e0 // rorx r12d,r8d,0x16 + LONG $0x2a148d42 // lea edx,[rdx+r13*1] + WORD $0x3145; BYTE $0xcf // xor r15d,r9d + LONG $0xf472d5c5; BYTE $0x0e // vpslld ymm5,ymm4,0xe + LONG $0xf07b43c4; WORD $0x0df0 // rorx r14d,r8d,0xd + LONG $0xf07b43c4; WORD $0x02e8 // rorx r13d,r8d,0x2 + LONG $0x131c8d45 // lea r11d,[r11+rdx*1] + LONG $0xe6efc5c5 // vpxor ymm4,ymm7,ymm6 + WORD $0x2144; BYTE $0xff // and edi,r15d + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3144; BYTE $0xcf // xor edi,r9d + LONG $0xf870fdc5; BYTE $0xfa // vpshufd ymm7,ymm0,0xfa + WORD $0x3145; BYTE $0xee // xor r14d,r13d + WORD $0x148d; BYTE $0x3a // lea edx,[rdx+rdi*1] + WORD $0x8941; BYTE $0xc4 // mov r12d,eax + LONG $0xd672cdc5; BYTE $0x0b // vpsrld ymm6,ymm6,0xb + + // ROUND(DX, R8, R9, R10, R11, AX, BX, CX, R12, R13, R14, DI, R15, SP, 0xa4) + LONG $0xa4248c03; WORD $0x0000; BYTE $0x00 // add ecx,[rsp+0xa4] + WORD $0x2145; BYTE $0xdc // and r12d,r11d + LONG $0xf07b43c4; WORD $0x19eb // rorx r13d,r11d,0x19 + LONG $0xe5efddc5 // vpxor ymm4,ymm4,ymm5 + LONG $0xf07bc3c4; WORD $0x0bfb // rorx edi,r11d,0xb + LONG $0x32148d42 // lea edx,[rdx+r14*1] + LONG $0x210c8d42 // lea ecx,[rcx+r12*1] + LONG $0xf572d5c5; BYTE $0x0b // vpslld ymm5,ymm5,0xb + LONG $0xf22062c4; BYTE $0xe3 // andn r12d,r11d,ebx + WORD $0x3141; BYTE $0xfd // xor r13d,edi + LONG $0xf07b43c4; WORD $0x06f3 // rorx r14d,r11d,0x6 + LONG $0xe6efddc5 // vpxor ymm4,ymm4,ymm6 + LONG $0x210c8d42 // lea ecx,[rcx+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0xd789 // mov edi,edx + LONG $0xd772cdc5; BYTE $0x0a // vpsrld ymm6,ymm7,0xa + LONG $0xf07b63c4; WORD $0x16e2 // rorx r12d,edx,0x16 + LONG $0x290c8d42 // lea ecx,[rcx+r13*1] + WORD $0x3144; BYTE $0xc7 // xor edi,r8d + LONG $0xe5efddc5 // vpxor ymm4,ymm4,ymm5 + LONG $0xf07b63c4; WORD $0x0df2 // rorx r14d,edx,0xd + LONG $0xf07b63c4; WORD $0x02ea // rorx r13d,edx,0x2 + LONG $0x0a148d45 // lea r10d,[r10+rcx*1] + LONG $0xd773c5c5; BYTE $0x11 // vpsrlq ymm7,ymm7,0x11 + WORD $0x2141; BYTE $0xff // and r15d,edi + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3145; BYTE $0xc7 // xor r15d,r8d + LONG $0xccfef5c5 // vpaddd ymm1,ymm1,ymm4 + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x390c8d42 // lea ecx,[rcx+r15*1] + WORD $0x8945; BYTE $0xdc // mov r12d,r11d + LONG $0xf7efcdc5 // vpxor ymm6,ymm6,ymm7 + + // ROUND(CX, DX, R8, R9, R10, R11, AX, BX, R12, R13, R14, R15, DI, SP, 0xa8) + LONG $0xa8249c03; WORD $0x0000; BYTE $0x00 // add ebx,[rsp+0xa8] + WORD $0x2145; BYTE $0xd4 // and r12d,r10d + LONG $0xf07b43c4; WORD $0x19ea // rorx r13d,r10d,0x19 + LONG $0xd773c5c5; BYTE $0x02 // vpsrlq ymm7,ymm7,0x2 + LONG $0xf07b43c4; WORD $0x0bfa // rorx r15d,r10d,0xb + LONG $0x310c8d42 // lea ecx,[rcx+r14*1] + LONG $0x231c8d42 // lea ebx,[rbx+r12*1] + LONG $0xf7efcdc5 // vpxor ymm6,ymm6,ymm7 + LONG $0xf22862c4; BYTE $0xe0 // andn r12d,r10d,eax + WORD $0x3145; BYTE $0xfd // xor r13d,r15d + LONG $0xf07b43c4; WORD $0x06f2 // rorx r14d,r10d,0x6 + LONG $0x004dc2c4; BYTE $0xf0 // vpshufb ymm6,ymm6,ymm8 + LONG $0x231c8d42 // lea ebx,[rbx+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8941; BYTE $0xcf // mov r15d,ecx + LONG $0xcefef5c5 // vpaddd ymm1,ymm1,ymm6 + LONG $0xf07b63c4; WORD $0x16e1 // rorx r12d,ecx,0x16 + LONG $0x2b1c8d42 // lea ebx,[rbx+r13*1] + WORD $0x3141; BYTE $0xd7 // xor r15d,edx + LONG $0xf970fdc5; BYTE $0x50 // vpshufd ymm7,ymm1,0x50 + LONG $0xf07b63c4; WORD $0x0df1 // rorx r14d,ecx,0xd + LONG $0xf07b63c4; WORD $0x02e9 // rorx r13d,ecx,0x2 + LONG $0x190c8d45 // lea r9d,[r9+rbx*1] + LONG $0xd772cdc5; BYTE $0x0a // vpsrld ymm6,ymm7,0xa + WORD $0x2144; BYTE $0xff // and edi,r15d + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0xd731 // xor edi,edx + LONG $0xd773c5c5; BYTE $0x11 // vpsrlq ymm7,ymm7,0x11 + WORD $0x3145; BYTE $0xee // xor r14d,r13d + WORD $0x1c8d; BYTE $0x3b // lea ebx,[rbx+rdi*1] + WORD $0x8945; BYTE $0xd4 // mov r12d,r10d + LONG $0xf7efcdc5 // vpxor ymm6,ymm6,ymm7 + + // ROUND(BX, CX, DX, R8, R9, R10, R11, AX, R12, R13, R14, DI, R15, SP, 0xac) + LONG $0xac248403; WORD $0x0000; BYTE $0x00 // add eax,[rsp+0xac] + WORD $0x2145; BYTE $0xcc // and r12d,r9d + LONG $0xf07b43c4; WORD $0x19e9 // rorx r13d,r9d,0x19 + LONG $0xd773c5c5; BYTE $0x02 // vpsrlq ymm7,ymm7,0x2 + LONG $0xf07bc3c4; WORD $0x0bf9 // rorx edi,r9d,0xb + LONG $0x331c8d42 // lea ebx,[rbx+r14*1] + LONG $0x20048d42 // lea eax,[rax+r12*1] + LONG $0xf7efcdc5 // vpxor ymm6,ymm6,ymm7 + LONG $0xf23042c4; BYTE $0xe3 // andn r12d,r9d,r11d + WORD $0x3141; BYTE $0xfd // xor r13d,edi + LONG $0xf07b43c4; WORD $0x06f1 // rorx r14d,r9d,0x6 + LONG $0x004dc2c4; BYTE $0xf1 // vpshufb ymm6,ymm6,ymm9 + LONG $0x20048d42 // lea eax,[rax+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0xdf89 // mov edi,ebx + LONG $0xcefef5c5 // vpaddd ymm1,ymm1,ymm6 + LONG $0xf07b63c4; WORD $0x16e3 // rorx r12d,ebx,0x16 + LONG $0x28048d42 // lea eax,[rax+r13*1] + WORD $0xcf31 // xor edi,ecx + LONG $0x75fef5c5; BYTE $0x20 // vpaddd ymm6,ymm1,[rbp+0x20] + LONG $0xf07b63c4; WORD $0x0df3 // rorx r14d,ebx,0xd + LONG $0xf07b63c4; WORD $0x02eb // rorx r13d,ebx,0x2 + LONG $0x00048d45 // lea r8d,[r8+rax*1] + WORD $0x2141; BYTE $0xff // and r15d,edi + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3141; BYTE $0xcf // xor r15d,ecx + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x38048d42 // lea eax,[rax+r15*1] + WORD $0x8945; BYTE $0xcc // mov r12d,r9d + + LONG $0x747ffdc5; WORD $0x2024 // vmovdqa [rsp+0x20],ymm6 + + LONG $0x24648d48; BYTE $0xc0 // lea rsp,[rsp-0x40] + LONG $0x0f65e3c4; WORD $0x04e2 // vpalignr ymm4,ymm3,ymm2,0x4 + + // ROUND(AX, BX, CX, DX, R8, R9, R10, R11, R12, R13, R14, R15, DI, SP, 0x80) + LONG $0x249c0344; LONG $0x00000080 // add r11d,[rsp+0x80] + WORD $0x2145; BYTE $0xc4 // and r12d,r8d + LONG $0xf07b43c4; WORD $0x19e8 // rorx r13d,r8d,0x19 + LONG $0x0f75e3c4; WORD $0x04f8 // vpalignr ymm7,ymm1,ymm0,0x4 + LONG $0xf07b43c4; WORD $0x0bf8 // rorx r15d,r8d,0xb + LONG $0x30048d42 // lea eax,[rax+r14*1] + LONG $0x231c8d47 // lea r11d,[r11+r12*1] + LONG $0xd472cdc5; BYTE $0x07 // vpsrld ymm6,ymm4,0x7 + LONG $0xf23842c4; BYTE $0xe2 // andn r12d,r8d,r10d + WORD $0x3145; BYTE $0xfd // xor r13d,r15d + LONG $0xf07b43c4; WORD $0x06f0 // rorx r14d,r8d,0x6 + LONG $0xd7feedc5 // vpaddd ymm2,ymm2,ymm7 + LONG $0x231c8d47 // lea r11d,[r11+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8941; BYTE $0xc7 // mov r15d,eax + LONG $0xd472c5c5; BYTE $0x03 // vpsrld ymm7,ymm4,0x3 + LONG $0xf07b63c4; WORD $0x16e0 // rorx r12d,eax,0x16 + LONG $0x2b1c8d47 // lea r11d,[r11+r13*1] + WORD $0x3141; BYTE $0xdf // xor r15d,ebx + LONG $0xf472d5c5; BYTE $0x0e // vpslld ymm5,ymm4,0xe + LONG $0xf07b63c4; WORD $0x0df0 // rorx r14d,eax,0xd + LONG $0xf07b63c4; WORD $0x02e8 // rorx r13d,eax,0x2 + LONG $0x1a148d42 // lea edx,[rdx+r11*1] + LONG $0xe6efc5c5 // vpxor ymm4,ymm7,ymm6 + WORD $0x2144; BYTE $0xff // and edi,r15d + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0xdf31 // xor edi,ebx + LONG $0xf970fdc5; BYTE $0xfa // vpshufd ymm7,ymm1,0xfa + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x3b1c8d45 // lea r11d,[r11+rdi*1] + WORD $0x8945; BYTE $0xc4 // mov r12d,r8d + LONG $0xd672cdc5; BYTE $0x0b // vpsrld ymm6,ymm6,0xb + + // ROUND(R11, AX, BX, CX, DX, R8, R9, R10, R12, R13, R14, DI, R15, SP, 0x84) + LONG $0x24940344; LONG $0x00000084 // add r10d,[rsp+0x84] + WORD $0x2141; BYTE $0xd4 // and r12d,edx + LONG $0xf07b63c4; WORD $0x19ea // rorx r13d,edx,0x19 + LONG $0xe5efddc5 // vpxor ymm4,ymm4,ymm5 + LONG $0xf07be3c4; WORD $0x0bfa // rorx edi,edx,0xb + LONG $0x331c8d47 // lea r11d,[r11+r14*1] + LONG $0x22148d47 // lea r10d,[r10+r12*1] + LONG $0xf572d5c5; BYTE $0x0b // vpslld ymm5,ymm5,0xb + LONG $0xf26842c4; BYTE $0xe1 // andn r12d,edx,r9d + WORD $0x3141; BYTE $0xfd // xor r13d,edi + LONG $0xf07b63c4; WORD $0x06f2 // rorx r14d,edx,0x6 + LONG $0xe6efddc5 // vpxor ymm4,ymm4,ymm6 + LONG $0x22148d47 // lea r10d,[r10+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8944; BYTE $0xdf // mov edi,r11d + LONG $0xd772cdc5; BYTE $0x0a // vpsrld ymm6,ymm7,0xa + LONG $0xf07b43c4; WORD $0x16e3 // rorx r12d,r11d,0x16 + LONG $0x2a148d47 // lea r10d,[r10+r13*1] + WORD $0xc731 // xor edi,eax + LONG $0xe5efddc5 // vpxor ymm4,ymm4,ymm5 + LONG $0xf07b43c4; WORD $0x0df3 // rorx r14d,r11d,0xd + LONG $0xf07b43c4; WORD $0x02eb // rorx r13d,r11d,0x2 + LONG $0x110c8d42 // lea ecx,[rcx+r10*1] + LONG $0xd773c5c5; BYTE $0x11 // vpsrlq ymm7,ymm7,0x11 + WORD $0x2141; BYTE $0xff // and r15d,edi + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3141; BYTE $0xc7 // xor r15d,eax + LONG $0xd4feedc5 // vpaddd ymm2,ymm2,ymm4 + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x3a148d47 // lea r10d,[r10+r15*1] + WORD $0x8941; BYTE $0xd4 // mov r12d,edx + LONG $0xf7efcdc5 // vpxor ymm6,ymm6,ymm7 + + // ROUND(R10, R11, AX, BX, CX, DX, R8, R9, R12, R13, R14, R15, DI, SP, 0x88) + LONG $0x248c0344; LONG $0x00000088 // add r9d,[rsp+0x88] + WORD $0x2141; BYTE $0xcc // and r12d,ecx + LONG $0xf07b63c4; WORD $0x19e9 // rorx r13d,ecx,0x19 + LONG $0xd773c5c5; BYTE $0x02 // vpsrlq ymm7,ymm7,0x2 + LONG $0xf07b63c4; WORD $0x0bf9 // rorx r15d,ecx,0xb + LONG $0x32148d47 // lea r10d,[r10+r14*1] + LONG $0x210c8d47 // lea r9d,[r9+r12*1] + LONG $0xf7efcdc5 // vpxor ymm6,ymm6,ymm7 + LONG $0xf27042c4; BYTE $0xe0 // andn r12d,ecx,r8d + WORD $0x3145; BYTE $0xfd // xor r13d,r15d + LONG $0xf07b63c4; WORD $0x06f1 // rorx r14d,ecx,0x6 + LONG $0x004dc2c4; BYTE $0xf0 // vpshufb ymm6,ymm6,ymm8 + LONG $0x210c8d47 // lea r9d,[r9+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8945; BYTE $0xd7 // mov r15d,r10d + LONG $0xd6feedc5 // vpaddd ymm2,ymm2,ymm6 + LONG $0xf07b43c4; WORD $0x16e2 // rorx r12d,r10d,0x16 + LONG $0x290c8d47 // lea r9d,[r9+r13*1] + WORD $0x3145; BYTE $0xdf // xor r15d,r11d + LONG $0xfa70fdc5; BYTE $0x50 // vpshufd ymm7,ymm2,0x50 + LONG $0xf07b43c4; WORD $0x0df2 // rorx r14d,r10d,0xd + LONG $0xf07b43c4; WORD $0x02ea // rorx r13d,r10d,0x2 + LONG $0x0b1c8d42 // lea ebx,[rbx+r9*1] + LONG $0xd772cdc5; BYTE $0x0a // vpsrld ymm6,ymm7,0xa + WORD $0x2144; BYTE $0xff // and edi,r15d + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3144; BYTE $0xdf // xor edi,r11d + LONG $0xd773c5c5; BYTE $0x11 // vpsrlq ymm7,ymm7,0x11 + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x390c8d45 // lea r9d,[r9+rdi*1] + WORD $0x8941; BYTE $0xcc // mov r12d,ecx + LONG $0xf7efcdc5 // vpxor ymm6,ymm6,ymm7 + + // ROUND(R9, R10, R11, AX, BX, CX, DX, R8, R12, R13, R14, DI, R15, SP, 0x8c) + LONG $0x24840344; LONG $0x0000008c // add r8d,[rsp+0x8c] + WORD $0x2141; BYTE $0xdc // and r12d,ebx + LONG $0xf07b63c4; WORD $0x19eb // rorx r13d,ebx,0x19 + LONG $0xd773c5c5; BYTE $0x02 // vpsrlq ymm7,ymm7,0x2 + LONG $0xf07be3c4; WORD $0x0bfb // rorx edi,ebx,0xb + LONG $0x310c8d47 // lea r9d,[r9+r14*1] + LONG $0x20048d47 // lea r8d,[r8+r12*1] + LONG $0xf7efcdc5 // vpxor ymm6,ymm6,ymm7 + LONG $0xf26062c4; BYTE $0xe2 // andn r12d,ebx,edx + WORD $0x3141; BYTE $0xfd // xor r13d,edi + LONG $0xf07b63c4; WORD $0x06f3 // rorx r14d,ebx,0x6 + LONG $0x004dc2c4; BYTE $0xf1 // vpshufb ymm6,ymm6,ymm9 + LONG $0x20048d47 // lea r8d,[r8+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8944; BYTE $0xcf // mov edi,r9d + LONG $0xd6feedc5 // vpaddd ymm2,ymm2,ymm6 + LONG $0xf07b43c4; WORD $0x16e1 // rorx r12d,r9d,0x16 + LONG $0x28048d47 // lea r8d,[r8+r13*1] + WORD $0x3144; BYTE $0xd7 // xor edi,r10d + LONG $0x75feedc5; BYTE $0x40 // vpaddd ymm6,ymm2,[rbp+0x40] + LONG $0xf07b43c4; WORD $0x0df1 // rorx r14d,r9d,0xd + LONG $0xf07b43c4; WORD $0x02e9 // rorx r13d,r9d,0x2 + LONG $0x00048d42 // lea eax,[rax+r8*1] + WORD $0x2141; BYTE $0xff // and r15d,edi + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3145; BYTE $0xd7 // xor r15d,r10d + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x38048d47 // lea r8d,[r8+r15*1] + WORD $0x8941; BYTE $0xdc // mov r12d,ebx + + LONG $0x347ffdc5; BYTE $0x24 // vmovdqa [rsp],ymm6 + LONG $0x0f7de3c4; WORD $0x04e3 // vpalignr ymm4,ymm0,ymm3,0x4 + + // ROUND(R8, R9, R10, R11, AX, BX, CX, DX, R12, R13, R14, R15, DI, SP, 0xa0) + LONG $0xa0249403; WORD $0x0000; BYTE $0x00 // add edx,[rsp+0xa0] + WORD $0x2141; BYTE $0xc4 // and r12d,eax + LONG $0xf07b63c4; WORD $0x19e8 // rorx r13d,eax,0x19 + LONG $0x0f6de3c4; WORD $0x04f9 // vpalignr ymm7,ymm2,ymm1,0x4 + LONG $0xf07b63c4; WORD $0x0bf8 // rorx r15d,eax,0xb + LONG $0x30048d47 // lea r8d,[r8+r14*1] + LONG $0x22148d42 // lea edx,[rdx+r12*1] + LONG $0xd472cdc5; BYTE $0x07 // vpsrld ymm6,ymm4,0x7 + LONG $0xf27862c4; BYTE $0xe1 // andn r12d,eax,ecx + WORD $0x3145; BYTE $0xfd // xor r13d,r15d + LONG $0xf07b63c4; WORD $0x06f0 // rorx r14d,eax,0x6 + LONG $0xdffee5c5 // vpaddd ymm3,ymm3,ymm7 + LONG $0x22148d42 // lea edx,[rdx+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8945; BYTE $0xc7 // mov r15d,r8d + LONG $0xd472c5c5; BYTE $0x03 // vpsrld ymm7,ymm4,0x3 + LONG $0xf07b43c4; WORD $0x16e0 // rorx r12d,r8d,0x16 + LONG $0x2a148d42 // lea edx,[rdx+r13*1] + WORD $0x3145; BYTE $0xcf // xor r15d,r9d + LONG $0xf472d5c5; BYTE $0x0e // vpslld ymm5,ymm4,0xe + LONG $0xf07b43c4; WORD $0x0df0 // rorx r14d,r8d,0xd + LONG $0xf07b43c4; WORD $0x02e8 // rorx r13d,r8d,0x2 + LONG $0x131c8d45 // lea r11d,[r11+rdx*1] + LONG $0xe6efc5c5 // vpxor ymm4,ymm7,ymm6 + WORD $0x2144; BYTE $0xff // and edi,r15d + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3144; BYTE $0xcf // xor edi,r9d + LONG $0xfa70fdc5; BYTE $0xfa // vpshufd ymm7,ymm2,0xfa + WORD $0x3145; BYTE $0xee // xor r14d,r13d + WORD $0x148d; BYTE $0x3a // lea edx,[rdx+rdi*1] + WORD $0x8941; BYTE $0xc4 // mov r12d,eax + LONG $0xd672cdc5; BYTE $0x0b // vpsrld ymm6,ymm6,0xb + + // ROUND(DX, R8, R9, R10, R11, AX, BX, CX, R12, R13, R14, DI, R15, SP, 0xa4) + LONG $0xa4248c03; WORD $0x0000; BYTE $0x00 // add ecx,[rsp+0xa4] + WORD $0x2145; BYTE $0xdc // and r12d,r11d + LONG $0xf07b43c4; WORD $0x19eb // rorx r13d,r11d,0x19 + LONG $0xe5efddc5 // vpxor ymm4,ymm4,ymm5 + LONG $0xf07bc3c4; WORD $0x0bfb // rorx edi,r11d,0xb + LONG $0x32148d42 // lea edx,[rdx+r14*1] + LONG $0x210c8d42 // lea ecx,[rcx+r12*1] + LONG $0xf572d5c5; BYTE $0x0b // vpslld ymm5,ymm5,0xb + LONG $0xf22062c4; BYTE $0xe3 // andn r12d,r11d,ebx + WORD $0x3141; BYTE $0xfd // xor r13d,edi + LONG $0xf07b43c4; WORD $0x06f3 // rorx r14d,r11d,0x6 + LONG $0xe6efddc5 // vpxor ymm4,ymm4,ymm6 + LONG $0x210c8d42 // lea ecx,[rcx+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0xd789 // mov edi,edx + LONG $0xd772cdc5; BYTE $0x0a // vpsrld ymm6,ymm7,0xa + LONG $0xf07b63c4; WORD $0x16e2 // rorx r12d,edx,0x16 + LONG $0x290c8d42 // lea ecx,[rcx+r13*1] + WORD $0x3144; BYTE $0xc7 // xor edi,r8d + LONG $0xe5efddc5 // vpxor ymm4,ymm4,ymm5 + LONG $0xf07b63c4; WORD $0x0df2 // rorx r14d,edx,0xd + LONG $0xf07b63c4; WORD $0x02ea // rorx r13d,edx,0x2 + LONG $0x0a148d45 // lea r10d,[r10+rcx*1] + LONG $0xd773c5c5; BYTE $0x11 // vpsrlq ymm7,ymm7,0x11 + WORD $0x2141; BYTE $0xff // and r15d,edi + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3145; BYTE $0xc7 // xor r15d,r8d + LONG $0xdcfee5c5 // vpaddd ymm3,ymm3,ymm4 + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x390c8d42 // lea ecx,[rcx+r15*1] + WORD $0x8945; BYTE $0xdc // mov r12d,r11d + LONG $0xf7efcdc5 // vpxor ymm6,ymm6,ymm7 + + // ROUND(CX, DX, R8, R9, R10, R11, AX, BX, R12, R13, R14, R15, DI, SP, 0xa8) + LONG $0xa8249c03; WORD $0x0000; BYTE $0x00 // add ebx,[rsp+0xa8] + WORD $0x2145; BYTE $0xd4 // and r12d,r10d + LONG $0xf07b43c4; WORD $0x19ea // rorx r13d,r10d,0x19 + LONG $0xd773c5c5; BYTE $0x02 // vpsrlq ymm7,ymm7,0x2 + LONG $0xf07b43c4; WORD $0x0bfa // rorx r15d,r10d,0xb + LONG $0x310c8d42 // lea ecx,[rcx+r14*1] + LONG $0x231c8d42 // lea ebx,[rbx+r12*1] + LONG $0xf7efcdc5 // vpxor ymm6,ymm6,ymm7 + LONG $0xf22862c4; BYTE $0xe0 // andn r12d,r10d,eax + WORD $0x3145; BYTE $0xfd // xor r13d,r15d + LONG $0xf07b43c4; WORD $0x06f2 // rorx r14d,r10d,0x6 + LONG $0x004dc2c4; BYTE $0xf0 // vpshufb ymm6,ymm6,ymm8 + LONG $0x231c8d42 // lea ebx,[rbx+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8941; BYTE $0xcf // mov r15d,ecx + LONG $0xdefee5c5 // vpaddd ymm3,ymm3,ymm6 + LONG $0xf07b63c4; WORD $0x16e1 // rorx r12d,ecx,0x16 + LONG $0x2b1c8d42 // lea ebx,[rbx+r13*1] + WORD $0x3141; BYTE $0xd7 // xor r15d,edx + LONG $0xfb70fdc5; BYTE $0x50 // vpshufd ymm7,ymm3,0x50 + LONG $0xf07b63c4; WORD $0x0df1 // rorx r14d,ecx,0xd + LONG $0xf07b63c4; WORD $0x02e9 // rorx r13d,ecx,0x2 + LONG $0x190c8d45 // lea r9d,[r9+rbx*1] + LONG $0xd772cdc5; BYTE $0x0a // vpsrld ymm6,ymm7,0xa + WORD $0x2144; BYTE $0xff // and edi,r15d + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0xd731 // xor edi,edx + LONG $0xd773c5c5; BYTE $0x11 // vpsrlq ymm7,ymm7,0x11 + WORD $0x3145; BYTE $0xee // xor r14d,r13d + WORD $0x1c8d; BYTE $0x3b // lea ebx,[rbx+rdi*1] + WORD $0x8945; BYTE $0xd4 // mov r12d,r10d + LONG $0xf7efcdc5 // vpxor ymm6,ymm6,ymm7 + + // ROUND(BX, CX, DX, R8, R9, R10, R11, AX, R12, R13, R14, DI, R15, SP, 0xac) + LONG $0xac248403; WORD $0x0000; BYTE $0x00 // add eax,[rsp+0xac] + WORD $0x2145; BYTE $0xcc // and r12d,r9d + LONG $0xf07b43c4; WORD $0x19e9 // rorx r13d,r9d,0x19 + LONG $0xd773c5c5; BYTE $0x02 // vpsrlq ymm7,ymm7,0x2 + LONG $0xf07bc3c4; WORD $0x0bf9 // rorx edi,r9d,0xb + LONG $0x331c8d42 // lea ebx,[rbx+r14*1] + LONG $0x20048d42 // lea eax,[rax+r12*1] + LONG $0xf7efcdc5 // vpxor ymm6,ymm6,ymm7 + LONG $0xf23042c4; BYTE $0xe3 // andn r12d,r9d,r11d + WORD $0x3141; BYTE $0xfd // xor r13d,edi + LONG $0xf07b43c4; WORD $0x06f1 // rorx r14d,r9d,0x6 + LONG $0x004dc2c4; BYTE $0xf1 // vpshufb ymm6,ymm6,ymm9 + LONG $0x20048d42 // lea eax,[rax+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0xdf89 // mov edi,ebx + LONG $0xdefee5c5 // vpaddd ymm3,ymm3,ymm6 + LONG $0xf07b63c4; WORD $0x16e3 // rorx r12d,ebx,0x16 + LONG $0x28048d42 // lea eax,[rax+r13*1] + WORD $0xcf31 // xor edi,ecx + LONG $0x75fee5c5; BYTE $0x60 // vpaddd ymm6,ymm3,[rbp+0x60] + LONG $0xf07b63c4; WORD $0x0df3 // rorx r14d,ebx,0xd + LONG $0xf07b63c4; WORD $0x02eb // rorx r13d,ebx,0x2 + LONG $0x00048d45 // lea r8d,[r8+rax*1] + WORD $0x2141; BYTE $0xff // and r15d,edi + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3141; BYTE $0xcf // xor r15d,ecx + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x38048d42 // lea eax,[rax+r15*1] + WORD $0x8945; BYTE $0xcc // mov r12d,r9d + + LONG $0x747ffdc5; WORD $0x2024 // vmovdqa [rsp+0x20],ymm6 + ADDQ $0x80, BP + + CMPB 0x3(BP), $0x0 + JNE loop1 + + // ROUND(AX, BX, CX, DX, R8, R9, R10, R11, R12, R13, R14, R15, DI, SP, 0x40) + LONG $0x245c0344; BYTE $0x40 // add r11d,[rsp+0x40] + WORD $0x2145; BYTE $0xc4 // and r12d,r8d + LONG $0xf07b43c4; WORD $0x19e8 // rorx r13d,r8d,0x19 + LONG $0xf07b43c4; WORD $0x0bf8 // rorx r15d,r8d,0xb + LONG $0x30048d42 // lea eax,[rax+r14*1] + LONG $0x231c8d47 // lea r11d,[r11+r12*1] + LONG $0xf23842c4; BYTE $0xe2 // andn r12d,r8d,r10d + WORD $0x3145; BYTE $0xfd // xor r13d,r15d + LONG $0xf07b43c4; WORD $0x06f0 // rorx r14d,r8d,0x6 + LONG $0x231c8d47 // lea r11d,[r11+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8941; BYTE $0xc7 // mov r15d,eax + LONG $0xf07b63c4; WORD $0x16e0 // rorx r12d,eax,0x16 + LONG $0x2b1c8d47 // lea r11d,[r11+r13*1] + WORD $0x3141; BYTE $0xdf // xor r15d,ebx + LONG $0xf07b63c4; WORD $0x0df0 // rorx r14d,eax,0xd + LONG $0xf07b63c4; WORD $0x02e8 // rorx r13d,eax,0x2 + LONG $0x1a148d42 // lea edx,[rdx+r11*1] + WORD $0x2144; BYTE $0xff // and edi,r15d + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0xdf31 // xor edi,ebx + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x3b1c8d45 // lea r11d,[r11+rdi*1] + WORD $0x8945; BYTE $0xc4 // mov r12d,r8d + + // ROUND(R11, AX, BX, CX, DX, R8, R9, R10, R12, R13, R14, DI, R15, SP, 0x44) + LONG $0x24540344; BYTE $0x44 // add r10d,[rsp+0x44] + WORD $0x2141; BYTE $0xd4 // and r12d,edx + LONG $0xf07b63c4; WORD $0x19ea // rorx r13d,edx,0x19 + LONG $0xf07be3c4; WORD $0x0bfa // rorx edi,edx,0xb + LONG $0x331c8d47 // lea r11d,[r11+r14*1] + LONG $0x22148d47 // lea r10d,[r10+r12*1] + LONG $0xf26842c4; BYTE $0xe1 // andn r12d,edx,r9d + WORD $0x3141; BYTE $0xfd // xor r13d,edi + LONG $0xf07b63c4; WORD $0x06f2 // rorx r14d,edx,0x6 + LONG $0x22148d47 // lea r10d,[r10+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8944; BYTE $0xdf // mov edi,r11d + LONG $0xf07b43c4; WORD $0x16e3 // rorx r12d,r11d,0x16 + LONG $0x2a148d47 // lea r10d,[r10+r13*1] + WORD $0xc731 // xor edi,eax + LONG $0xf07b43c4; WORD $0x0df3 // rorx r14d,r11d,0xd + LONG $0xf07b43c4; WORD $0x02eb // rorx r13d,r11d,0x2 + LONG $0x110c8d42 // lea ecx,[rcx+r10*1] + WORD $0x2141; BYTE $0xff // and r15d,edi + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3141; BYTE $0xc7 // xor r15d,eax + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x3a148d47 // lea r10d,[r10+r15*1] + WORD $0x8941; BYTE $0xd4 // mov r12d,edx + + // ROUND(R10, R11, AX, BX, CX, DX, R8, R9, R12, R13, R14, R15, DI, SP, 0x48) + LONG $0x244c0344; BYTE $0x48 // add r9d,[rsp+0x48] + WORD $0x2141; BYTE $0xcc // and r12d,ecx + LONG $0xf07b63c4; WORD $0x19e9 // rorx r13d,ecx,0x19 + LONG $0xf07b63c4; WORD $0x0bf9 // rorx r15d,ecx,0xb + LONG $0x32148d47 // lea r10d,[r10+r14*1] + LONG $0x210c8d47 // lea r9d,[r9+r12*1] + LONG $0xf27042c4; BYTE $0xe0 // andn r12d,ecx,r8d + WORD $0x3145; BYTE $0xfd // xor r13d,r15d + LONG $0xf07b63c4; WORD $0x06f1 // rorx r14d,ecx,0x6 + LONG $0x210c8d47 // lea r9d,[r9+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8945; BYTE $0xd7 // mov r15d,r10d + LONG $0xf07b43c4; WORD $0x16e2 // rorx r12d,r10d,0x16 + LONG $0x290c8d47 // lea r9d,[r9+r13*1] + WORD $0x3145; BYTE $0xdf // xor r15d,r11d + LONG $0xf07b43c4; WORD $0x0df2 // rorx r14d,r10d,0xd + LONG $0xf07b43c4; WORD $0x02ea // rorx r13d,r10d,0x2 + LONG $0x0b1c8d42 // lea ebx,[rbx+r9*1] + WORD $0x2144; BYTE $0xff // and edi,r15d + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3144; BYTE $0xdf // xor edi,r11d + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x390c8d45 // lea r9d,[r9+rdi*1] + WORD $0x8941; BYTE $0xcc // mov r12d,ecx + + // ROUND(R9, R10, R11, AX, BX, CX, DX, R8, R12, R13, R14, DI, R15, SP, 0x4c) + LONG $0x24440344; BYTE $0x4c // add r8d,[rsp+0x4c] + WORD $0x2141; BYTE $0xdc // and r12d,ebx + LONG $0xf07b63c4; WORD $0x19eb // rorx r13d,ebx,0x19 + LONG $0xf07be3c4; WORD $0x0bfb // rorx edi,ebx,0xb + LONG $0x310c8d47 // lea r9d,[r9+r14*1] + LONG $0x20048d47 // lea r8d,[r8+r12*1] + LONG $0xf26062c4; BYTE $0xe2 // andn r12d,ebx,edx + WORD $0x3141; BYTE $0xfd // xor r13d,edi + LONG $0xf07b63c4; WORD $0x06f3 // rorx r14d,ebx,0x6 + LONG $0x20048d47 // lea r8d,[r8+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8944; BYTE $0xcf // mov edi,r9d + LONG $0xf07b43c4; WORD $0x16e1 // rorx r12d,r9d,0x16 + LONG $0x28048d47 // lea r8d,[r8+r13*1] + WORD $0x3144; BYTE $0xd7 // xor edi,r10d + LONG $0xf07b43c4; WORD $0x0df1 // rorx r14d,r9d,0xd + LONG $0xf07b43c4; WORD $0x02e9 // rorx r13d,r9d,0x2 + LONG $0x00048d42 // lea eax,[rax+r8*1] + WORD $0x2141; BYTE $0xff // and r15d,edi + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3145; BYTE $0xd7 // xor r15d,r10d + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x38048d47 // lea r8d,[r8+r15*1] + WORD $0x8941; BYTE $0xdc // mov r12d,ebx + + // ROUND(R8, R9, R10, R11, AX, BX, CX, DX, R12, R13, R14, R15, DI, SP, 0x60) + LONG $0x60245403 // add edx,[rsp+0x60] + WORD $0x2141; BYTE $0xc4 // and r12d,eax + LONG $0xf07b63c4; WORD $0x19e8 // rorx r13d,eax,0x19 + LONG $0xf07b63c4; WORD $0x0bf8 // rorx r15d,eax,0xb + LONG $0x30048d47 // lea r8d,[r8+r14*1] + LONG $0x22148d42 // lea edx,[rdx+r12*1] + LONG $0xf27862c4; BYTE $0xe1 // andn r12d,eax,ecx + WORD $0x3145; BYTE $0xfd // xor r13d,r15d + LONG $0xf07b63c4; WORD $0x06f0 // rorx r14d,eax,0x6 + LONG $0x22148d42 // lea edx,[rdx+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8945; BYTE $0xc7 // mov r15d,r8d + LONG $0xf07b43c4; WORD $0x16e0 // rorx r12d,r8d,0x16 + LONG $0x2a148d42 // lea edx,[rdx+r13*1] + WORD $0x3145; BYTE $0xcf // xor r15d,r9d + LONG $0xf07b43c4; WORD $0x0df0 // rorx r14d,r8d,0xd + LONG $0xf07b43c4; WORD $0x02e8 // rorx r13d,r8d,0x2 + LONG $0x131c8d45 // lea r11d,[r11+rdx*1] + WORD $0x2144; BYTE $0xff // and edi,r15d + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3144; BYTE $0xcf // xor edi,r9d + WORD $0x3145; BYTE $0xee // xor r14d,r13d + WORD $0x148d; BYTE $0x3a // lea edx,[rdx+rdi*1] + WORD $0x8941; BYTE $0xc4 // mov r12d,eax + + // ROUND(DX, R8, R9, R10, R11, AX, BX, CX, R12, R13, R14, DI, R15, SP, 0x64) + LONG $0x64244c03 // add ecx,[rsp+0x64] + WORD $0x2145; BYTE $0xdc // and r12d,r11d + LONG $0xf07b43c4; WORD $0x19eb // rorx r13d,r11d,0x19 + LONG $0xf07bc3c4; WORD $0x0bfb // rorx edi,r11d,0xb + LONG $0x32148d42 // lea edx,[rdx+r14*1] + LONG $0x210c8d42 // lea ecx,[rcx+r12*1] + LONG $0xf22062c4; BYTE $0xe3 // andn r12d,r11d,ebx + WORD $0x3141; BYTE $0xfd // xor r13d,edi + LONG $0xf07b43c4; WORD $0x06f3 // rorx r14d,r11d,0x6 + LONG $0x210c8d42 // lea ecx,[rcx+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0xd789 // mov edi,edx + LONG $0xf07b63c4; WORD $0x16e2 // rorx r12d,edx,0x16 + LONG $0x290c8d42 // lea ecx,[rcx+r13*1] + WORD $0x3144; BYTE $0xc7 // xor edi,r8d + LONG $0xf07b63c4; WORD $0x0df2 // rorx r14d,edx,0xd + LONG $0xf07b63c4; WORD $0x02ea // rorx r13d,edx,0x2 + LONG $0x0a148d45 // lea r10d,[r10+rcx*1] + WORD $0x2141; BYTE $0xff // and r15d,edi + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3145; BYTE $0xc7 // xor r15d,r8d + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x390c8d42 // lea ecx,[rcx+r15*1] + WORD $0x8945; BYTE $0xdc // mov r12d,r11d + + // ROUND(CX, DX, R8, R9, R10, R11, AX, BX, R12, R13, R14, R15, DI, SP, 0x68) + LONG $0x68245c03 // add ebx,[rsp+0x68] + WORD $0x2145; BYTE $0xd4 // and r12d,r10d + LONG $0xf07b43c4; WORD $0x19ea // rorx r13d,r10d,0x19 + LONG $0xf07b43c4; WORD $0x0bfa // rorx r15d,r10d,0xb + LONG $0x310c8d42 // lea ecx,[rcx+r14*1] + LONG $0x231c8d42 // lea ebx,[rbx+r12*1] + LONG $0xf22862c4; BYTE $0xe0 // andn r12d,r10d,eax + WORD $0x3145; BYTE $0xfd // xor r13d,r15d + LONG $0xf07b43c4; WORD $0x06f2 // rorx r14d,r10d,0x6 + LONG $0x231c8d42 // lea ebx,[rbx+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8941; BYTE $0xcf // mov r15d,ecx + LONG $0xf07b63c4; WORD $0x16e1 // rorx r12d,ecx,0x16 + LONG $0x2b1c8d42 // lea ebx,[rbx+r13*1] + WORD $0x3141; BYTE $0xd7 // xor r15d,edx + LONG $0xf07b63c4; WORD $0x0df1 // rorx r14d,ecx,0xd + LONG $0xf07b63c4; WORD $0x02e9 // rorx r13d,ecx,0x2 + LONG $0x190c8d45 // lea r9d,[r9+rbx*1] + WORD $0x2144; BYTE $0xff // and edi,r15d + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0xd731 // xor edi,edx + WORD $0x3145; BYTE $0xee // xor r14d,r13d + WORD $0x1c8d; BYTE $0x3b // lea ebx,[rbx+rdi*1] + WORD $0x8945; BYTE $0xd4 // mov r12d,r10d + + // ROUND(BX, CX, DX, R8, R9, R10, R11, AX, R12, R13, R14, DI, R15, SP, 0x6c) + LONG $0x6c244403 // add eax,[rsp+0x6c] + WORD $0x2145; BYTE $0xcc // and r12d,r9d + LONG $0xf07b43c4; WORD $0x19e9 // rorx r13d,r9d,0x19 + LONG $0xf07bc3c4; WORD $0x0bf9 // rorx edi,r9d,0xb + LONG $0x331c8d42 // lea ebx,[rbx+r14*1] + LONG $0x20048d42 // lea eax,[rax+r12*1] + LONG $0xf23042c4; BYTE $0xe3 // andn r12d,r9d,r11d + WORD $0x3141; BYTE $0xfd // xor r13d,edi + LONG $0xf07b43c4; WORD $0x06f1 // rorx r14d,r9d,0x6 + LONG $0x20048d42 // lea eax,[rax+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0xdf89 // mov edi,ebx + LONG $0xf07b63c4; WORD $0x16e3 // rorx r12d,ebx,0x16 + LONG $0x28048d42 // lea eax,[rax+r13*1] + WORD $0xcf31 // xor edi,ecx + LONG $0xf07b63c4; WORD $0x0df3 // rorx r14d,ebx,0xd + LONG $0xf07b63c4; WORD $0x02eb // rorx r13d,ebx,0x2 + LONG $0x00048d45 // lea r8d,[r8+rax*1] + WORD $0x2141; BYTE $0xff // and r15d,edi + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3141; BYTE $0xcf // xor r15d,ecx + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x38048d42 // lea eax,[rax+r15*1] + WORD $0x8945; BYTE $0xcc // mov r12d,r9d + + // ROUND(AX, BX, CX, DX, R8, R9, R10, R11, R12, R13, R14, R15, DI, SP, 0x00) + LONG $0x241c0344 // add r11d,[rsp] + WORD $0x2145; BYTE $0xc4 // and r12d,r8d + LONG $0xf07b43c4; WORD $0x19e8 // rorx r13d,r8d,0x19 + LONG $0xf07b43c4; WORD $0x0bf8 // rorx r15d,r8d,0xb + LONG $0x30048d42 // lea eax,[rax+r14*1] + LONG $0x231c8d47 // lea r11d,[r11+r12*1] + LONG $0xf23842c4; BYTE $0xe2 // andn r12d,r8d,r10d + WORD $0x3145; BYTE $0xfd // xor r13d,r15d + LONG $0xf07b43c4; WORD $0x06f0 // rorx r14d,r8d,0x6 + LONG $0x231c8d47 // lea r11d,[r11+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8941; BYTE $0xc7 // mov r15d,eax + LONG $0xf07b63c4; WORD $0x16e0 // rorx r12d,eax,0x16 + LONG $0x2b1c8d47 // lea r11d,[r11+r13*1] + WORD $0x3141; BYTE $0xdf // xor r15d,ebx + LONG $0xf07b63c4; WORD $0x0df0 // rorx r14d,eax,0xd + LONG $0xf07b63c4; WORD $0x02e8 // rorx r13d,eax,0x2 + LONG $0x1a148d42 // lea edx,[rdx+r11*1] + WORD $0x2144; BYTE $0xff // and edi,r15d + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0xdf31 // xor edi,ebx + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x3b1c8d45 // lea r11d,[r11+rdi*1] + WORD $0x8945; BYTE $0xc4 // mov r12d,r8d + + // ROUND(R11, AX, BX, CX, DX, R8, R9, R10, R12, R13, R14, DI, R15, SP, 0x04) + LONG $0x24540344; BYTE $0x04 // add r10d,[rsp+0x4] + WORD $0x2141; BYTE $0xd4 // and r12d,edx + LONG $0xf07b63c4; WORD $0x19ea // rorx r13d,edx,0x19 + LONG $0xf07be3c4; WORD $0x0bfa // rorx edi,edx,0xb + LONG $0x331c8d47 // lea r11d,[r11+r14*1] + LONG $0x22148d47 // lea r10d,[r10+r12*1] + LONG $0xf26842c4; BYTE $0xe1 // andn r12d,edx,r9d + WORD $0x3141; BYTE $0xfd // xor r13d,edi + LONG $0xf07b63c4; WORD $0x06f2 // rorx r14d,edx,0x6 + LONG $0x22148d47 // lea r10d,[r10+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8944; BYTE $0xdf // mov edi,r11d + LONG $0xf07b43c4; WORD $0x16e3 // rorx r12d,r11d,0x16 + LONG $0x2a148d47 // lea r10d,[r10+r13*1] + WORD $0xc731 // xor edi,eax + LONG $0xf07b43c4; WORD $0x0df3 // rorx r14d,r11d,0xd + LONG $0xf07b43c4; WORD $0x02eb // rorx r13d,r11d,0x2 + LONG $0x110c8d42 // lea ecx,[rcx+r10*1] + WORD $0x2141; BYTE $0xff // and r15d,edi + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3141; BYTE $0xc7 // xor r15d,eax + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x3a148d47 // lea r10d,[r10+r15*1] + WORD $0x8941; BYTE $0xd4 // mov r12d,edx + + // ROUND(R10, R11, AX, BX, CX, DX, R8, R9, R12, R13, R14, R15, DI, SP, 0x08) + LONG $0x244c0344; BYTE $0x08 // add r9d,[rsp+0x8] + WORD $0x2141; BYTE $0xcc // and r12d,ecx + LONG $0xf07b63c4; WORD $0x19e9 // rorx r13d,ecx,0x19 + LONG $0xf07b63c4; WORD $0x0bf9 // rorx r15d,ecx,0xb + LONG $0x32148d47 // lea r10d,[r10+r14*1] + LONG $0x210c8d47 // lea r9d,[r9+r12*1] + LONG $0xf27042c4; BYTE $0xe0 // andn r12d,ecx,r8d + WORD $0x3145; BYTE $0xfd // xor r13d,r15d + LONG $0xf07b63c4; WORD $0x06f1 // rorx r14d,ecx,0x6 + LONG $0x210c8d47 // lea r9d,[r9+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8945; BYTE $0xd7 // mov r15d,r10d + LONG $0xf07b43c4; WORD $0x16e2 // rorx r12d,r10d,0x16 + LONG $0x290c8d47 // lea r9d,[r9+r13*1] + WORD $0x3145; BYTE $0xdf // xor r15d,r11d + LONG $0xf07b43c4; WORD $0x0df2 // rorx r14d,r10d,0xd + LONG $0xf07b43c4; WORD $0x02ea // rorx r13d,r10d,0x2 + LONG $0x0b1c8d42 // lea ebx,[rbx+r9*1] + WORD $0x2144; BYTE $0xff // and edi,r15d + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3144; BYTE $0xdf // xor edi,r11d + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x390c8d45 // lea r9d,[r9+rdi*1] + WORD $0x8941; BYTE $0xcc // mov r12d,ecx + + // ROUND(R9, R10, R11, AX, BX, CX, DX, R8, R12, R13, R14, DI, R15, SP, 0x0c) + LONG $0x24440344; BYTE $0x0c // add r8d,[rsp+0xc] + WORD $0x2141; BYTE $0xdc // and r12d,ebx + LONG $0xf07b63c4; WORD $0x19eb // rorx r13d,ebx,0x19 + LONG $0xf07be3c4; WORD $0x0bfb // rorx edi,ebx,0xb + LONG $0x310c8d47 // lea r9d,[r9+r14*1] + LONG $0x20048d47 // lea r8d,[r8+r12*1] + LONG $0xf26062c4; BYTE $0xe2 // andn r12d,ebx,edx + WORD $0x3141; BYTE $0xfd // xor r13d,edi + LONG $0xf07b63c4; WORD $0x06f3 // rorx r14d,ebx,0x6 + LONG $0x20048d47 // lea r8d,[r8+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8944; BYTE $0xcf // mov edi,r9d + LONG $0xf07b43c4; WORD $0x16e1 // rorx r12d,r9d,0x16 + LONG $0x28048d47 // lea r8d,[r8+r13*1] + WORD $0x3144; BYTE $0xd7 // xor edi,r10d + LONG $0xf07b43c4; WORD $0x0df1 // rorx r14d,r9d,0xd + LONG $0xf07b43c4; WORD $0x02e9 // rorx r13d,r9d,0x2 + LONG $0x00048d42 // lea eax,[rax+r8*1] + WORD $0x2141; BYTE $0xff // and r15d,edi + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3145; BYTE $0xd7 // xor r15d,r10d + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x38048d47 // lea r8d,[r8+r15*1] + WORD $0x8941; BYTE $0xdc // mov r12d,ebx + + // ROUND(R8, R9, R10, R11, AX, BX, CX, DX, R12, R13, R14, R15, DI, SP, 0x20) + LONG $0x20245403 // add edx,[rsp+0x20] + WORD $0x2141; BYTE $0xc4 // and r12d,eax + LONG $0xf07b63c4; WORD $0x19e8 // rorx r13d,eax,0x19 + LONG $0xf07b63c4; WORD $0x0bf8 // rorx r15d,eax,0xb + LONG $0x30048d47 // lea r8d,[r8+r14*1] + LONG $0x22148d42 // lea edx,[rdx+r12*1] + LONG $0xf27862c4; BYTE $0xe1 // andn r12d,eax,ecx + WORD $0x3145; BYTE $0xfd // xor r13d,r15d + LONG $0xf07b63c4; WORD $0x06f0 // rorx r14d,eax,0x6 + LONG $0x22148d42 // lea edx,[rdx+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8945; BYTE $0xc7 // mov r15d,r8d + LONG $0xf07b43c4; WORD $0x16e0 // rorx r12d,r8d,0x16 + LONG $0x2a148d42 // lea edx,[rdx+r13*1] + WORD $0x3145; BYTE $0xcf // xor r15d,r9d + LONG $0xf07b43c4; WORD $0x0df0 // rorx r14d,r8d,0xd + LONG $0xf07b43c4; WORD $0x02e8 // rorx r13d,r8d,0x2 + LONG $0x131c8d45 // lea r11d,[r11+rdx*1] + WORD $0x2144; BYTE $0xff // and edi,r15d + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3144; BYTE $0xcf // xor edi,r9d + WORD $0x3145; BYTE $0xee // xor r14d,r13d + WORD $0x148d; BYTE $0x3a // lea edx,[rdx+rdi*1] + WORD $0x8941; BYTE $0xc4 // mov r12d,eax + + // ROUND(DX, R8, R9, R10, R11, AX, BX, CX, R12, R13, R14, DI, R15, SP, 0x24) + LONG $0x24244c03 // add ecx,[rsp+0x24] + WORD $0x2145; BYTE $0xdc // and r12d,r11d + LONG $0xf07b43c4; WORD $0x19eb // rorx r13d,r11d,0x19 + LONG $0xf07bc3c4; WORD $0x0bfb // rorx edi,r11d,0xb + LONG $0x32148d42 // lea edx,[rdx+r14*1] + LONG $0x210c8d42 // lea ecx,[rcx+r12*1] + LONG $0xf22062c4; BYTE $0xe3 // andn r12d,r11d,ebx + WORD $0x3141; BYTE $0xfd // xor r13d,edi + LONG $0xf07b43c4; WORD $0x06f3 // rorx r14d,r11d,0x6 + LONG $0x210c8d42 // lea ecx,[rcx+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0xd789 // mov edi,edx + LONG $0xf07b63c4; WORD $0x16e2 // rorx r12d,edx,0x16 + LONG $0x290c8d42 // lea ecx,[rcx+r13*1] + WORD $0x3144; BYTE $0xc7 // xor edi,r8d + LONG $0xf07b63c4; WORD $0x0df2 // rorx r14d,edx,0xd + LONG $0xf07b63c4; WORD $0x02ea // rorx r13d,edx,0x2 + LONG $0x0a148d45 // lea r10d,[r10+rcx*1] + WORD $0x2141; BYTE $0xff // and r15d,edi + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3145; BYTE $0xc7 // xor r15d,r8d + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x390c8d42 // lea ecx,[rcx+r15*1] + WORD $0x8945; BYTE $0xdc // mov r12d,r11d + + // ROUND(CX, DX, R8, R9, R10, R11, AX, BX, R12, R13, R14, R15, DI, SP, 0x28) + LONG $0x28245c03 // add ebx,[rsp+0x28] + WORD $0x2145; BYTE $0xd4 // and r12d,r10d + LONG $0xf07b43c4; WORD $0x19ea // rorx r13d,r10d,0x19 + LONG $0xf07b43c4; WORD $0x0bfa // rorx r15d,r10d,0xb + LONG $0x310c8d42 // lea ecx,[rcx+r14*1] + LONG $0x231c8d42 // lea ebx,[rbx+r12*1] + LONG $0xf22862c4; BYTE $0xe0 // andn r12d,r10d,eax + WORD $0x3145; BYTE $0xfd // xor r13d,r15d + LONG $0xf07b43c4; WORD $0x06f2 // rorx r14d,r10d,0x6 + LONG $0x231c8d42 // lea ebx,[rbx+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8941; BYTE $0xcf // mov r15d,ecx + LONG $0xf07b63c4; WORD $0x16e1 // rorx r12d,ecx,0x16 + LONG $0x2b1c8d42 // lea ebx,[rbx+r13*1] + WORD $0x3141; BYTE $0xd7 // xor r15d,edx + LONG $0xf07b63c4; WORD $0x0df1 // rorx r14d,ecx,0xd + LONG $0xf07b63c4; WORD $0x02e9 // rorx r13d,ecx,0x2 + LONG $0x190c8d45 // lea r9d,[r9+rbx*1] + WORD $0x2144; BYTE $0xff // and edi,r15d + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0xd731 // xor edi,edx + WORD $0x3145; BYTE $0xee // xor r14d,r13d + WORD $0x1c8d; BYTE $0x3b // lea ebx,[rbx+rdi*1] + WORD $0x8945; BYTE $0xd4 // mov r12d,r10d + + // ROUND(BX, CX, DX, R8, R9, R10, R11, AX, R12, R13, R14, DI, R15, SP, 0x2c) + LONG $0x2c244403 // add eax,[rsp+0x2c] + WORD $0x2145; BYTE $0xcc // and r12d,r9d + LONG $0xf07b43c4; WORD $0x19e9 // rorx r13d,r9d,0x19 + LONG $0xf07bc3c4; WORD $0x0bf9 // rorx edi,r9d,0xb + LONG $0x331c8d42 // lea ebx,[rbx+r14*1] + LONG $0x20048d42 // lea eax,[rax+r12*1] + LONG $0xf23042c4; BYTE $0xe3 // andn r12d,r9d,r11d + WORD $0x3141; BYTE $0xfd // xor r13d,edi + LONG $0xf07b43c4; WORD $0x06f1 // rorx r14d,r9d,0x6 + LONG $0x20048d42 // lea eax,[rax+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0xdf89 // mov edi,ebx + LONG $0xf07b63c4; WORD $0x16e3 // rorx r12d,ebx,0x16 + LONG $0x28048d42 // lea eax,[rax+r13*1] + WORD $0xcf31 // xor edi,ecx + LONG $0xf07b63c4; WORD $0x0df3 // rorx r14d,ebx,0xd + LONG $0xf07b63c4; WORD $0x02eb // rorx r13d,ebx,0x2 + LONG $0x00048d45 // lea r8d,[r8+rax*1] + WORD $0x2141; BYTE $0xff // and r15d,edi + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3141; BYTE $0xcf // xor r15d,ecx + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x38048d42 // lea eax,[rax+r15*1] + WORD $0x8945; BYTE $0xcc // mov r12d,r9d + + MOVQ 0x200(SP), DI // $_ctx + ADDQ R14, AX + + LEAQ 0x1c0(SP), BP + + ADDL (DI), AX + ADDL 4(DI), BX + ADDL 8(DI), CX + ADDL 12(DI), DX + ADDL 16(DI), R8 + ADDL 20(DI), R9 + ADDL 24(DI), R10 + ADDL 28(DI), R11 + + MOVL AX, (DI) + MOVL BX, 4(DI) + MOVL CX, 8(DI) + MOVL DX, 12(DI) + MOVL R8, 16(DI) + MOVL R9, 20(DI) + MOVL R10, 24(DI) + MOVL R11, 28(DI) + + CMPQ SI, 0x50(BP) // $_end + JE done + + XORQ R14, R14 + MOVQ BX, DI + XORQ CX, DI // magic + MOVQ R9, R12 + +loop2: + // ROUND(AX, BX, CX, DX, R8, R9, R10, R11, R12, R13, R14, R15, DI, BP, 0x10) + LONG $0x105d0344 // add r11d,[rbp+0x10] + WORD $0x2145; BYTE $0xc4 // and r12d,r8d + LONG $0xf07b43c4; WORD $0x19e8 // rorx r13d,r8d,0x19 + LONG $0xf07b43c4; WORD $0x0bf8 // rorx r15d,r8d,0xb + LONG $0x30048d42 // lea eax,[rax+r14*1] + LONG $0x231c8d47 // lea r11d,[r11+r12*1] + LONG $0xf23842c4; BYTE $0xe2 // andn r12d,r8d,r10d + WORD $0x3145; BYTE $0xfd // xor r13d,r15d + LONG $0xf07b43c4; WORD $0x06f0 // rorx r14d,r8d,0x6 + LONG $0x231c8d47 // lea r11d,[r11+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8941; BYTE $0xc7 // mov r15d,eax + LONG $0xf07b63c4; WORD $0x16e0 // rorx r12d,eax,0x16 + LONG $0x2b1c8d47 // lea r11d,[r11+r13*1] + WORD $0x3141; BYTE $0xdf // xor r15d,ebx + LONG $0xf07b63c4; WORD $0x0df0 // rorx r14d,eax,0xd + LONG $0xf07b63c4; WORD $0x02e8 // rorx r13d,eax,0x2 + LONG $0x1a148d42 // lea edx,[rdx+r11*1] + WORD $0x2144; BYTE $0xff // and edi,r15d + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0xdf31 // xor edi,ebx + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x3b1c8d45 // lea r11d,[r11+rdi*1] + WORD $0x8945; BYTE $0xc4 // mov r12d,r8d + + // ROUND(R11, AX, BX, CX, DX, R8, R9, R10, R12, R13, R14, DI, R15, BP, 0x14) + LONG $0x14550344 // add r10d,[rbp+0x14] + WORD $0x2141; BYTE $0xd4 // and r12d,edx + LONG $0xf07b63c4; WORD $0x19ea // rorx r13d,edx,0x19 + LONG $0xf07be3c4; WORD $0x0bfa // rorx edi,edx,0xb + LONG $0x331c8d47 // lea r11d,[r11+r14*1] + LONG $0x22148d47 // lea r10d,[r10+r12*1] + LONG $0xf26842c4; BYTE $0xe1 // andn r12d,edx,r9d + WORD $0x3141; BYTE $0xfd // xor r13d,edi + LONG $0xf07b63c4; WORD $0x06f2 // rorx r14d,edx,0x6 + LONG $0x22148d47 // lea r10d,[r10+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8944; BYTE $0xdf // mov edi,r11d + LONG $0xf07b43c4; WORD $0x16e3 // rorx r12d,r11d,0x16 + LONG $0x2a148d47 // lea r10d,[r10+r13*1] + WORD $0xc731 // xor edi,eax + LONG $0xf07b43c4; WORD $0x0df3 // rorx r14d,r11d,0xd + LONG $0xf07b43c4; WORD $0x02eb // rorx r13d,r11d,0x2 + LONG $0x110c8d42 // lea ecx,[rcx+r10*1] + WORD $0x2141; BYTE $0xff // and r15d,edi + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3141; BYTE $0xc7 // xor r15d,eax + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x3a148d47 // lea r10d,[r10+r15*1] + WORD $0x8941; BYTE $0xd4 // mov r12d,edx + + // ROUND(R10, R11, AX, BX, CX, DX, R8, R9, R12, R13, R14, R15, DI, BP, 0x18) + LONG $0x184d0344 // add r9d,[rbp+0x18] + WORD $0x2141; BYTE $0xcc // and r12d,ecx + LONG $0xf07b63c4; WORD $0x19e9 // rorx r13d,ecx,0x19 + LONG $0xf07b63c4; WORD $0x0bf9 // rorx r15d,ecx,0xb + LONG $0x32148d47 // lea r10d,[r10+r14*1] + LONG $0x210c8d47 // lea r9d,[r9+r12*1] + LONG $0xf27042c4; BYTE $0xe0 // andn r12d,ecx,r8d + WORD $0x3145; BYTE $0xfd // xor r13d,r15d + LONG $0xf07b63c4; WORD $0x06f1 // rorx r14d,ecx,0x6 + LONG $0x210c8d47 // lea r9d,[r9+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8945; BYTE $0xd7 // mov r15d,r10d + LONG $0xf07b43c4; WORD $0x16e2 // rorx r12d,r10d,0x16 + LONG $0x290c8d47 // lea r9d,[r9+r13*1] + WORD $0x3145; BYTE $0xdf // xor r15d,r11d + LONG $0xf07b43c4; WORD $0x0df2 // rorx r14d,r10d,0xd + LONG $0xf07b43c4; WORD $0x02ea // rorx r13d,r10d,0x2 + LONG $0x0b1c8d42 // lea ebx,[rbx+r9*1] + WORD $0x2144; BYTE $0xff // and edi,r15d + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3144; BYTE $0xdf // xor edi,r11d + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x390c8d45 // lea r9d,[r9+rdi*1] + WORD $0x8941; BYTE $0xcc // mov r12d,ecx + + // ROUND(R9, R10, R11, AX, BX, CX, DX, R8, R12, R13, R14, DI, R15, BP, 0x1c) + LONG $0x1c450344 // add r8d,[rbp+0x1c] + WORD $0x2141; BYTE $0xdc // and r12d,ebx + LONG $0xf07b63c4; WORD $0x19eb // rorx r13d,ebx,0x19 + LONG $0xf07be3c4; WORD $0x0bfb // rorx edi,ebx,0xb + LONG $0x310c8d47 // lea r9d,[r9+r14*1] + LONG $0x20048d47 // lea r8d,[r8+r12*1] + LONG $0xf26062c4; BYTE $0xe2 // andn r12d,ebx,edx + WORD $0x3141; BYTE $0xfd // xor r13d,edi + LONG $0xf07b63c4; WORD $0x06f3 // rorx r14d,ebx,0x6 + LONG $0x20048d47 // lea r8d,[r8+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8944; BYTE $0xcf // mov edi,r9d + LONG $0xf07b43c4; WORD $0x16e1 // rorx r12d,r9d,0x16 + LONG $0x28048d47 // lea r8d,[r8+r13*1] + WORD $0x3144; BYTE $0xd7 // xor edi,r10d + LONG $0xf07b43c4; WORD $0x0df1 // rorx r14d,r9d,0xd + LONG $0xf07b43c4; WORD $0x02e9 // rorx r13d,r9d,0x2 + LONG $0x00048d42 // lea eax,[rax+r8*1] + WORD $0x2141; BYTE $0xff // and r15d,edi + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3145; BYTE $0xd7 // xor r15d,r10d + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x38048d47 // lea r8d,[r8+r15*1] + WORD $0x8941; BYTE $0xdc // mov r12d,ebx + + // ROUND(R8, R9, R10, R11, AX, BX, CX, DX, R12, R13, R14, R15, DI, BP, 0x30) + WORD $0x5503; BYTE $0x30 // add edx,[rbp+0x30] + WORD $0x2141; BYTE $0xc4 // and r12d,eax + LONG $0xf07b63c4; WORD $0x19e8 // rorx r13d,eax,0x19 + LONG $0xf07b63c4; WORD $0x0bf8 // rorx r15d,eax,0xb + LONG $0x30048d47 // lea r8d,[r8+r14*1] + LONG $0x22148d42 // lea edx,[rdx+r12*1] + LONG $0xf27862c4; BYTE $0xe1 // andn r12d,eax,ecx + WORD $0x3145; BYTE $0xfd // xor r13d,r15d + LONG $0xf07b63c4; WORD $0x06f0 // rorx r14d,eax,0x6 + LONG $0x22148d42 // lea edx,[rdx+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8945; BYTE $0xc7 // mov r15d,r8d + LONG $0xf07b43c4; WORD $0x16e0 // rorx r12d,r8d,0x16 + LONG $0x2a148d42 // lea edx,[rdx+r13*1] + WORD $0x3145; BYTE $0xcf // xor r15d,r9d + LONG $0xf07b43c4; WORD $0x0df0 // rorx r14d,r8d,0xd + LONG $0xf07b43c4; WORD $0x02e8 // rorx r13d,r8d,0x2 + LONG $0x131c8d45 // lea r11d,[r11+rdx*1] + WORD $0x2144; BYTE $0xff // and edi,r15d + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3144; BYTE $0xcf // xor edi,r9d + WORD $0x3145; BYTE $0xee // xor r14d,r13d + WORD $0x148d; BYTE $0x3a // lea edx,[rdx+rdi*1] + WORD $0x8941; BYTE $0xc4 // mov r12d,eax + + // ROUND(DX, R8, R9, R10, R11, AX, BX, CX, R12, R13, R14, DI, R15, BP, 0x34) + WORD $0x4d03; BYTE $0x34 // add ecx,[rbp+0x34] + WORD $0x2145; BYTE $0xdc // and r12d,r11d + LONG $0xf07b43c4; WORD $0x19eb // rorx r13d,r11d,0x19 + LONG $0xf07bc3c4; WORD $0x0bfb // rorx edi,r11d,0xb + LONG $0x32148d42 // lea edx,[rdx+r14*1] + LONG $0x210c8d42 // lea ecx,[rcx+r12*1] + LONG $0xf22062c4; BYTE $0xe3 // andn r12d,r11d,ebx + WORD $0x3141; BYTE $0xfd // xor r13d,edi + LONG $0xf07b43c4; WORD $0x06f3 // rorx r14d,r11d,0x6 + LONG $0x210c8d42 // lea ecx,[rcx+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0xd789 // mov edi,edx + LONG $0xf07b63c4; WORD $0x16e2 // rorx r12d,edx,0x16 + LONG $0x290c8d42 // lea ecx,[rcx+r13*1] + WORD $0x3144; BYTE $0xc7 // xor edi,r8d + LONG $0xf07b63c4; WORD $0x0df2 // rorx r14d,edx,0xd + LONG $0xf07b63c4; WORD $0x02ea // rorx r13d,edx,0x2 + LONG $0x0a148d45 // lea r10d,[r10+rcx*1] + WORD $0x2141; BYTE $0xff // and r15d,edi + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3145; BYTE $0xc7 // xor r15d,r8d + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x390c8d42 // lea ecx,[rcx+r15*1] + WORD $0x8945; BYTE $0xdc // mov r12d,r11d + + // ROUND(CX, DX, R8, R9, R10, R11, AX, BX, R12, R13, R14, R15, DI, BP, 0x38) + WORD $0x5d03; BYTE $0x38 // add ebx,[rbp+0x38] + WORD $0x2145; BYTE $0xd4 // and r12d,r10d + LONG $0xf07b43c4; WORD $0x19ea // rorx r13d,r10d,0x19 + LONG $0xf07b43c4; WORD $0x0bfa // rorx r15d,r10d,0xb + LONG $0x310c8d42 // lea ecx,[rcx+r14*1] + LONG $0x231c8d42 // lea ebx,[rbx+r12*1] + LONG $0xf22862c4; BYTE $0xe0 // andn r12d,r10d,eax + WORD $0x3145; BYTE $0xfd // xor r13d,r15d + LONG $0xf07b43c4; WORD $0x06f2 // rorx r14d,r10d,0x6 + LONG $0x231c8d42 // lea ebx,[rbx+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0x8941; BYTE $0xcf // mov r15d,ecx + LONG $0xf07b63c4; WORD $0x16e1 // rorx r12d,ecx,0x16 + LONG $0x2b1c8d42 // lea ebx,[rbx+r13*1] + WORD $0x3141; BYTE $0xd7 // xor r15d,edx + LONG $0xf07b63c4; WORD $0x0df1 // rorx r14d,ecx,0xd + LONG $0xf07b63c4; WORD $0x02e9 // rorx r13d,ecx,0x2 + LONG $0x190c8d45 // lea r9d,[r9+rbx*1] + WORD $0x2144; BYTE $0xff // and edi,r15d + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0xd731 // xor edi,edx + WORD $0x3145; BYTE $0xee // xor r14d,r13d + WORD $0x1c8d; BYTE $0x3b // lea ebx,[rbx+rdi*1] + WORD $0x8945; BYTE $0xd4 // mov r12d,r10d + + // ROUND(BX, CX, DX, R8, R9, R10, R11, AX, R12, R13, R14, DI, R15, BP, 0x3c) + WORD $0x4503; BYTE $0x3c // add eax,[rbp+0x3c] + WORD $0x2145; BYTE $0xcc // and r12d,r9d + LONG $0xf07b43c4; WORD $0x19e9 // rorx r13d,r9d,0x19 + LONG $0xf07bc3c4; WORD $0x0bf9 // rorx edi,r9d,0xb + LONG $0x331c8d42 // lea ebx,[rbx+r14*1] + LONG $0x20048d42 // lea eax,[rax+r12*1] + LONG $0xf23042c4; BYTE $0xe3 // andn r12d,r9d,r11d + WORD $0x3141; BYTE $0xfd // xor r13d,edi + LONG $0xf07b43c4; WORD $0x06f1 // rorx r14d,r9d,0x6 + LONG $0x20048d42 // lea eax,[rax+r12*1] + WORD $0x3145; BYTE $0xf5 // xor r13d,r14d + WORD $0xdf89 // mov edi,ebx + LONG $0xf07b63c4; WORD $0x16e3 // rorx r12d,ebx,0x16 + LONG $0x28048d42 // lea eax,[rax+r13*1] + WORD $0xcf31 // xor edi,ecx + LONG $0xf07b63c4; WORD $0x0df3 // rorx r14d,ebx,0xd + LONG $0xf07b63c4; WORD $0x02eb // rorx r13d,ebx,0x2 + LONG $0x00048d45 // lea r8d,[r8+rax*1] + WORD $0x2141; BYTE $0xff // and r15d,edi + WORD $0x3145; BYTE $0xe6 // xor r14d,r12d + WORD $0x3141; BYTE $0xcf // xor r15d,ecx + WORD $0x3145; BYTE $0xee // xor r14d,r13d + LONG $0x38048d42 // lea eax,[rax+r15*1] + WORD $0x8945; BYTE $0xcc // mov r12d,r9d + + ADDQ $-0x40, BP + CMPQ BP, SP + JAE loop2 + + MOVQ 0x200(SP), DI // $_ctx + ADDQ R14, AX + + ADDQ $0x1c0, SP + + ADDL (DI), AX + ADDL 4(DI), BX + ADDL 8(DI), CX + ADDL 12(DI), DX + ADDL 16(DI), R8 + ADDL 20(DI), R9 + + ADDQ $0x80, SI // input += 2 + ADDL 24(DI), R10 + MOVQ SI, R12 + ADDL 28(DI), R11 + CMPQ SI, 0x50(SP) // input == _end + + MOVL AX, (DI) + LONG $0xe4440f4c // cmove r12,rsp /* next block or stale data */ + MOVL AX, (DI) + MOVL BX, 4(DI) + MOVL CX, 8(DI) + MOVL DX, 12(DI) + MOVL R8, 16(DI) + MOVL R9, 20(DI) + MOVL R10, 24(DI) + MOVL R11, 28(DI) + + JBE loop0 + LEAQ (SP), BP + +done: + MOVQ BP, SP + MOVQ 0x58(SP), SP // restore saved stack pointer + WORD $0xf8c5; BYTE $0x77 // vzeroupper + + RET + diff --git a/vendor/github.com/minio/sha256-simd/sha256blockAvx512_amd64.asm b/vendor/github.com/minio/sha256-simd/sha256blockAvx512_amd64.asm new file mode 100644 index 000000000..c959b1aa2 --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/sha256blockAvx512_amd64.asm @@ -0,0 +1,686 @@ + +// 16x Parallel implementation of SHA256 for AVX512 + +// +// Minio Cloud Storage, (C) 2017 Minio, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +// This code is based on the Intel Multi-Buffer Crypto for IPSec library +// and more specifically the following implementation: +// https://github.com/intel/intel-ipsec-mb/blob/master/avx512/sha256_x16_avx512.asm +// +// For Golang it has been converted into Plan 9 assembly with the help of +// github.com/minio/asm2plan9s to assemble the AVX512 instructions +// + +// Copyright (c) 2017, Intel Corporation +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of Intel Corporation nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#define SHA256_DIGEST_ROW_SIZE 64 + +// arg1 +#define STATE rdi +#define STATE_P9 DI +// arg2 +#define INP_SIZE rsi +#define INP_SIZE_P9 SI + +#define IDX rcx +#define TBL rdx +#define TBL_P9 DX + +#define INPUT rax +#define INPUT_P9 AX + +#define inp0 r9 +#define SCRATCH_P9 R12 +#define SCRATCH r12 +#define maskp r13 +#define MASKP_P9 R13 +#define mask r14 +#define MASK_P9 R14 + +#define A zmm0 +#define B zmm1 +#define C zmm2 +#define D zmm3 +#define E zmm4 +#define F zmm5 +#define G zmm6 +#define H zmm7 +#define T1 zmm8 +#define TMP0 zmm9 +#define TMP1 zmm10 +#define TMP2 zmm11 +#define TMP3 zmm12 +#define TMP4 zmm13 +#define TMP5 zmm14 +#define TMP6 zmm15 + +#define W0 zmm16 +#define W1 zmm17 +#define W2 zmm18 +#define W3 zmm19 +#define W4 zmm20 +#define W5 zmm21 +#define W6 zmm22 +#define W7 zmm23 +#define W8 zmm24 +#define W9 zmm25 +#define W10 zmm26 +#define W11 zmm27 +#define W12 zmm28 +#define W13 zmm29 +#define W14 zmm30 +#define W15 zmm31 + + +#define TRANSPOSE16(_r0, _r1, _r2, _r3, _r4, _r5, _r6, _r7, _r8, _r9, _r10, _r11, _r12, _r13, _r14, _r15, _t0, _t1) \ + \ + \ // input r0 = {a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0} + \ // r1 = {b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0} + \ // r2 = {c15 c14 c13 c12 c11 c10 c9 c8 c7 c6 c5 c4 c3 c2 c1 c0} + \ // r3 = {d15 d14 d13 d12 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0} + \ // r4 = {e15 e14 e13 e12 e11 e10 e9 e8 e7 e6 e5 e4 e3 e2 e1 e0} + \ // r5 = {f15 f14 f13 f12 f11 f10 f9 f8 f7 f6 f5 f4 f3 f2 f1 f0} + \ // r6 = {g15 g14 g13 g12 g11 g10 g9 g8 g7 g6 g5 g4 g3 g2 g1 g0} + \ // r7 = {h15 h14 h13 h12 h11 h10 h9 h8 h7 h6 h5 h4 h3 h2 h1 h0} + \ // r8 = {i15 i14 i13 i12 i11 i10 i9 i8 i7 i6 i5 i4 i3 i2 i1 i0} + \ // r9 = {j15 j14 j13 j12 j11 j10 j9 j8 j7 j6 j5 j4 j3 j2 j1 j0} + \ // r10 = {k15 k14 k13 k12 k11 k10 k9 k8 k7 k6 k5 k4 k3 k2 k1 k0} + \ // r11 = {l15 l14 l13 l12 l11 l10 l9 l8 l7 l6 l5 l4 l3 l2 l1 l0} + \ // r12 = {m15 m14 m13 m12 m11 m10 m9 m8 m7 m6 m5 m4 m3 m2 m1 m0} + \ // r13 = {n15 n14 n13 n12 n11 n10 n9 n8 n7 n6 n5 n4 n3 n2 n1 n0} + \ // r14 = {o15 o14 o13 o12 o11 o10 o9 o8 o7 o6 o5 o4 o3 o2 o1 o0} + \ // r15 = {p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0} + \ + \ // output r0 = { p0 o0 n0 m0 l0 k0 j0 i0 h0 g0 f0 e0 d0 c0 b0 a0} + \ // r1 = { p1 o1 n1 m1 l1 k1 j1 i1 h1 g1 f1 e1 d1 c1 b1 a1} + \ // r2 = { p2 o2 n2 m2 l2 k2 j2 i2 h2 g2 f2 e2 d2 c2 b2 a2} + \ // r3 = { p3 o3 n3 m3 l3 k3 j3 i3 h3 g3 f3 e3 d3 c3 b3 a3} + \ // r4 = { p4 o4 n4 m4 l4 k4 j4 i4 h4 g4 f4 e4 d4 c4 b4 a4} + \ // r5 = { p5 o5 n5 m5 l5 k5 j5 i5 h5 g5 f5 e5 d5 c5 b5 a5} + \ // r6 = { p6 o6 n6 m6 l6 k6 j6 i6 h6 g6 f6 e6 d6 c6 b6 a6} + \ // r7 = { p7 o7 n7 m7 l7 k7 j7 i7 h7 g7 f7 e7 d7 c7 b7 a7} + \ // r8 = { p8 o8 n8 m8 l8 k8 j8 i8 h8 g8 f8 e8 d8 c8 b8 a8} + \ // r9 = { p9 o9 n9 m9 l9 k9 j9 i9 h9 g9 f9 e9 d9 c9 b9 a9} + \ // r10 = {p10 o10 n10 m10 l10 k10 j10 i10 h10 g10 f10 e10 d10 c10 b10 a10} + \ // r11 = {p11 o11 n11 m11 l11 k11 j11 i11 h11 g11 f11 e11 d11 c11 b11 a11} + \ // r12 = {p12 o12 n12 m12 l12 k12 j12 i12 h12 g12 f12 e12 d12 c12 b12 a12} + \ // r13 = {p13 o13 n13 m13 l13 k13 j13 i13 h13 g13 f13 e13 d13 c13 b13 a13} + \ // r14 = {p14 o14 n14 m14 l14 k14 j14 i14 h14 g14 f14 e14 d14 c14 b14 a14} + \ // r15 = {p15 o15 n15 m15 l15 k15 j15 i15 h15 g15 f15 e15 d15 c15 b15 a15} + \ + \ // process top half + vshufps _t0, _r0, _r1, 0x44 \ // t0 = {b13 b12 a13 a12 b9 b8 a9 a8 b5 b4 a5 a4 b1 b0 a1 a0} + vshufps _r0, _r0, _r1, 0xEE \ // r0 = {b15 b14 a15 a14 b11 b10 a11 a10 b7 b6 a7 a6 b3 b2 a3 a2} + vshufps _t1, _r2, _r3, 0x44 \ // t1 = {d13 d12 c13 c12 d9 d8 c9 c8 d5 d4 c5 c4 d1 d0 c1 c0} + vshufps _r2, _r2, _r3, 0xEE \ // r2 = {d15 d14 c15 c14 d11 d10 c11 c10 d7 d6 c7 c6 d3 d2 c3 c2} + \ + vshufps _r3, _t0, _t1, 0xDD \ // r3 = {d13 c13 b13 a13 d9 c9 b9 a9 d5 c5 b5 a5 d1 c1 b1 a1} + vshufps _r1, _r0, _r2, 0x88 \ // r1 = {d14 c14 b14 a14 d10 c10 b10 a10 d6 c6 b6 a6 d2 c2 b2 a2} + vshufps _r0, _r0, _r2, 0xDD \ // r0 = {d15 c15 b15 a15 d11 c11 b11 a11 d7 c7 b7 a7 d3 c3 b3 a3} + vshufps _t0, _t0, _t1, 0x88 \ // t0 = {d12 c12 b12 a12 d8 c8 b8 a8 d4 c4 b4 a4 d0 c0 b0 a0} + \ + \ // use r2 in place of t0 + vshufps _r2, _r4, _r5, 0x44 \ // r2 = {f13 f12 e13 e12 f9 f8 e9 e8 f5 f4 e5 e4 f1 f0 e1 e0} + vshufps _r4, _r4, _r5, 0xEE \ // r4 = {f15 f14 e15 e14 f11 f10 e11 e10 f7 f6 e7 e6 f3 f2 e3 e2} + vshufps _t1, _r6, _r7, 0x44 \ // t1 = {h13 h12 g13 g12 h9 h8 g9 g8 h5 h4 g5 g4 h1 h0 g1 g0} + vshufps _r6, _r6, _r7, 0xEE \ // r6 = {h15 h14 g15 g14 h11 h10 g11 g10 h7 h6 g7 g6 h3 h2 g3 g2} + \ + vshufps _r7, _r2, _t1, 0xDD \ // r7 = {h13 g13 f13 e13 h9 g9 f9 e9 h5 g5 f5 e5 h1 g1 f1 e1} + vshufps _r5, _r4, _r6, 0x88 \ // r5 = {h14 g14 f14 e14 h10 g10 f10 e10 h6 g6 f6 e6 h2 g2 f2 e2} + vshufps _r4, _r4, _r6, 0xDD \ // r4 = {h15 g15 f15 e15 h11 g11 f11 e11 h7 g7 f7 e7 h3 g3 f3 e3} + vshufps _r2, _r2, _t1, 0x88 \ // r2 = {h12 g12 f12 e12 h8 g8 f8 e8 h4 g4 f4 e4 h0 g0 f0 e0} + \ + \ // use r6 in place of t0 + vshufps _r6, _r8, _r9, 0x44 \ // r6 = {j13 j12 i13 i12 j9 j8 i9 i8 j5 j4 i5 i4 j1 j0 i1 i0} + vshufps _r8, _r8, _r9, 0xEE \ // r8 = {j15 j14 i15 i14 j11 j10 i11 i10 j7 j6 i7 i6 j3 j2 i3 i2} + vshufps _t1, _r10, _r11, 0x44 \ // t1 = {l13 l12 k13 k12 l9 l8 k9 k8 l5 l4 k5 k4 l1 l0 k1 k0} + vshufps _r10, _r10, _r11, 0xEE \ // r10 = {l15 l14 k15 k14 l11 l10 k11 k10 l7 l6 k7 k6 l3 l2 k3 k2} + \ + vshufps _r11, _r6, _t1, 0xDD \ // r11 = {l13 k13 j13 113 l9 k9 j9 i9 l5 k5 j5 i5 l1 k1 j1 i1} + vshufps _r9, _r8, _r10, 0x88 \ // r9 = {l14 k14 j14 114 l10 k10 j10 i10 l6 k6 j6 i6 l2 k2 j2 i2} + vshufps _r8, _r8, _r10, 0xDD \ // r8 = {l15 k15 j15 115 l11 k11 j11 i11 l7 k7 j7 i7 l3 k3 j3 i3} + vshufps _r6, _r6, _t1, 0x88 \ // r6 = {l12 k12 j12 112 l8 k8 j8 i8 l4 k4 j4 i4 l0 k0 j0 i0} + \ + \ // use r10 in place of t0 + vshufps _r10, _r12, _r13, 0x44 \ // r10 = {n13 n12 m13 m12 n9 n8 m9 m8 n5 n4 m5 m4 n1 n0 a1 m0} + vshufps _r12, _r12, _r13, 0xEE \ // r12 = {n15 n14 m15 m14 n11 n10 m11 m10 n7 n6 m7 m6 n3 n2 a3 m2} + vshufps _t1, _r14, _r15, 0x44 \ // t1 = {p13 p12 013 012 p9 p8 09 08 p5 p4 05 04 p1 p0 01 00} + vshufps _r14, _r14, _r15, 0xEE \ // r14 = {p15 p14 015 014 p11 p10 011 010 p7 p6 07 06 p3 p2 03 02} + \ + vshufps _r15, _r10, _t1, 0xDD \ // r15 = {p13 013 n13 m13 p9 09 n9 m9 p5 05 n5 m5 p1 01 n1 m1} + vshufps _r13, _r12, _r14, 0x88 \ // r13 = {p14 014 n14 m14 p10 010 n10 m10 p6 06 n6 m6 p2 02 n2 m2} + vshufps _r12, _r12, _r14, 0xDD \ // r12 = {p15 015 n15 m15 p11 011 n11 m11 p7 07 n7 m7 p3 03 n3 m3} + vshufps _r10, _r10, _t1, 0x88 \ // r10 = {p12 012 n12 m12 p8 08 n8 m8 p4 04 n4 m4 p0 00 n0 m0} + \ + \ // At this point, the registers that contain interesting data are: + \ // t0, r3, r1, r0, r2, r7, r5, r4, r6, r11, r9, r8, r10, r15, r13, r12 + \ // Can use t1 and r14 as scratch registers + LEAQ PSHUFFLE_TRANSPOSE16_MASK1<>(SB), BX \ + LEAQ PSHUFFLE_TRANSPOSE16_MASK2<>(SB), R8 \ + \ + vmovdqu32 _r14, [rbx] \ + vpermi2q _r14, _t0, _r2 \ // r14 = {h8 g8 f8 e8 d8 c8 b8 a8 h0 g0 f0 e0 d0 c0 b0 a0} + vmovdqu32 _t1, [r8] \ + vpermi2q _t1, _t0, _r2 \ // t1 = {h12 g12 f12 e12 d12 c12 b12 a12 h4 g4 f4 e4 d4 c4 b4 a4} + \ + vmovdqu32 _r2, [rbx] \ + vpermi2q _r2, _r3, _r7 \ // r2 = {h9 g9 f9 e9 d9 c9 b9 a9 h1 g1 f1 e1 d1 c1 b1 a1} + vmovdqu32 _t0, [r8] \ + vpermi2q _t0, _r3, _r7 \ // t0 = {h13 g13 f13 e13 d13 c13 b13 a13 h5 g5 f5 e5 d5 c5 b5 a5} + \ + vmovdqu32 _r3, [rbx] \ + vpermi2q _r3, _r1, _r5 \ // r3 = {h10 g10 f10 e10 d10 c10 b10 a10 h2 g2 f2 e2 d2 c2 b2 a2} + vmovdqu32 _r7, [r8] \ + vpermi2q _r7, _r1, _r5 \ // r7 = {h14 g14 f14 e14 d14 c14 b14 a14 h6 g6 f6 e6 d6 c6 b6 a6} + \ + vmovdqu32 _r1, [rbx] \ + vpermi2q _r1, _r0, _r4 \ // r1 = {h11 g11 f11 e11 d11 c11 b11 a11 h3 g3 f3 e3 d3 c3 b3 a3} + vmovdqu32 _r5, [r8] \ + vpermi2q _r5, _r0, _r4 \ // r5 = {h15 g15 f15 e15 d15 c15 b15 a15 h7 g7 f7 e7 d7 c7 b7 a7} + \ + vmovdqu32 _r0, [rbx] \ + vpermi2q _r0, _r6, _r10 \ // r0 = {p8 o8 n8 m8 l8 k8 j8 i8 p0 o0 n0 m0 l0 k0 j0 i0} + vmovdqu32 _r4, [r8] \ + vpermi2q _r4, _r6, _r10 \ // r4 = {p12 o12 n12 m12 l12 k12 j12 i12 p4 o4 n4 m4 l4 k4 j4 i4} + \ + vmovdqu32 _r6, [rbx] \ + vpermi2q _r6, _r11, _r15 \ // r6 = {p9 o9 n9 m9 l9 k9 j9 i9 p1 o1 n1 m1 l1 k1 j1 i1} + vmovdqu32 _r10, [r8] \ + vpermi2q _r10, _r11, _r15 \ // r10 = {p13 o13 n13 m13 l13 k13 j13 i13 p5 o5 n5 m5 l5 k5 j5 i5} + \ + vmovdqu32 _r11, [rbx] \ + vpermi2q _r11, _r9, _r13 \ // r11 = {p10 o10 n10 m10 l10 k10 j10 i10 p2 o2 n2 m2 l2 k2 j2 i2} + vmovdqu32 _r15, [r8] \ + vpermi2q _r15, _r9, _r13 \ // r15 = {p14 o14 n14 m14 l14 k14 j14 i14 p6 o6 n6 m6 l6 k6 j6 i6} + \ + vmovdqu32 _r9, [rbx] \ + vpermi2q _r9, _r8, _r12 \ // r9 = {p11 o11 n11 m11 l11 k11 j11 i11 p3 o3 n3 m3 l3 k3 j3 i3} + vmovdqu32 _r13, [r8] \ + vpermi2q _r13, _r8, _r12 \ // r13 = {p15 o15 n15 m15 l15 k15 j15 i15 p7 o7 n7 m7 l7 k7 j7 i7} + \ + \ // At this point r8 and r12 can be used as scratch registers + vshuff64x2 _r8, _r14, _r0, 0xEE \ // r8 = {p8 o8 n8 m8 l8 k8 j8 i8 h8 g8 f8 e8 d8 c8 b8 a8} + vshuff64x2 _r0, _r14, _r0, 0x44 \ // r0 = {p0 o0 n0 m0 l0 k0 j0 i0 h0 g0 f0 e0 d0 c0 b0 a0} + \ + vshuff64x2 _r12, _t1, _r4, 0xEE \ // r12 = {p12 o12 n12 m12 l12 k12 j12 i12 h12 g12 f12 e12 d12 c12 b12 a12} + vshuff64x2 _r4, _t1, _r4, 0x44 \ // r4 = {p4 o4 n4 m4 l4 k4 j4 i4 h4 g4 f4 e4 d4 c4 b4 a4} + \ + vshuff64x2 _r14, _r7, _r15, 0xEE \ // r14 = {p14 o14 n14 m14 l14 k14 j14 i14 h14 g14 f14 e14 d14 c14 b14 a14} + vshuff64x2 _t1, _r7, _r15, 0x44 \ // t1 = {p6 o6 n6 m6 l6 k6 j6 i6 h6 g6 f6 e6 d6 c6 b6 a6} + \ + vshuff64x2 _r15, _r5, _r13, 0xEE \ // r15 = {p15 o15 n15 m15 l15 k15 j15 i15 h15 g15 f15 e15 d15 c15 b15 a15} + vshuff64x2 _r7, _r5, _r13, 0x44 \ // r7 = {p7 o7 n7 m7 l7 k7 j7 i7 h7 g7 f7 e7 d7 c7 b7 a7} + \ + vshuff64x2 _r13, _t0, _r10, 0xEE \ // r13 = {p13 o13 n13 m13 l13 k13 j13 i13 h13 g13 f13 e13 d13 c13 b13 a13} + vshuff64x2 _r5, _t0, _r10, 0x44 \ // r5 = {p5 o5 n5 m5 l5 k5 j5 i5 h5 g5 f5 e5 d5 c5 b5 a5} + \ + vshuff64x2 _r10, _r3, _r11, 0xEE \ // r10 = {p10 o10 n10 m10 l10 k10 j10 i10 h10 g10 f10 e10 d10 c10 b10 a10} + vshuff64x2 _t0, _r3, _r11, 0x44 \ // t0 = {p2 o2 n2 m2 l2 k2 j2 i2 h2 g2 f2 e2 d2 c2 b2 a2} + \ + vshuff64x2 _r11, _r1, _r9, 0xEE \ // r11 = {p11 o11 n11 m11 l11 k11 j11 i11 h11 g11 f11 e11 d11 c11 b11 a11} + vshuff64x2 _r3, _r1, _r9, 0x44 \ // r3 = {p3 o3 n3 m3 l3 k3 j3 i3 h3 g3 f3 e3 d3 c3 b3 a3} + \ + vshuff64x2 _r9, _r2, _r6, 0xEE \ // r9 = {p9 o9 n9 m9 l9 k9 j9 i9 h9 g9 f9 e9 d9 c9 b9 a9} + vshuff64x2 _r1, _r2, _r6, 0x44 \ // r1 = {p1 o1 n1 m1 l1 k1 j1 i1 h1 g1 f1 e1 d1 c1 b1 a1} + \ + vmovdqu32 _r2, _t0 \ // r2 = {p2 o2 n2 m2 l2 k2 j2 i2 h2 g2 f2 e2 d2 c2 b2 a2} + vmovdqu32 _r6, _t1 \ // r6 = {p6 o6 n6 m6 l6 k6 j6 i6 h6 g6 f6 e6 d6 c6 b6 a6} + + +// CH(A, B, C) = (A&B) ^ (~A&C) +// MAJ(E, F, G) = (E&F) ^ (E&G) ^ (F&G) +// SIGMA0 = ROR_2 ^ ROR_13 ^ ROR_22 +// SIGMA1 = ROR_6 ^ ROR_11 ^ ROR_25 +// sigma0 = ROR_7 ^ ROR_18 ^ SHR_3 +// sigma1 = ROR_17 ^ ROR_19 ^ SHR_10 + +// Main processing loop per round +#define PROCESS_LOOP(_WT, _ROUND, _A, _B, _C, _D, _E, _F, _G, _H) \ + \ // T1 = H + SIGMA1(E) + CH(E, F, G) + Kt + Wt + \ // T2 = SIGMA0(A) + MAJ(A, B, C) + \ // H=G, G=F, F=E, E=D+T1, D=C, C=B, B=A, A=T1+T2 + \ + \ // H becomes T2, then add T1 for A + \ // D becomes D + T1 for E + \ + vpaddd T1, _H, TMP3 \ // T1 = H + Kt + vmovdqu32 TMP0, _E \ + vprord TMP1, _E, 6 \ // ROR_6(E) + vprord TMP2, _E, 11 \ // ROR_11(E) + vprord TMP3, _E, 25 \ // ROR_25(E) + vpternlogd TMP0, _F, _G, 0xCA \ // TMP0 = CH(E,F,G) + vpaddd T1, T1, _WT \ // T1 = T1 + Wt + vpternlogd TMP1, TMP2, TMP3, 0x96 \ // TMP1 = SIGMA1(E) + vpaddd T1, T1, TMP0 \ // T1 = T1 + CH(E,F,G) + vpaddd T1, T1, TMP1 \ // T1 = T1 + SIGMA1(E) + vpaddd _D, _D, T1 \ // D = D + T1 + \ + vprord _H, _A, 2 \ // ROR_2(A) + vprord TMP2, _A, 13 \ // ROR_13(A) + vprord TMP3, _A, 22 \ // ROR_22(A) + vmovdqu32 TMP0, _A \ + vpternlogd TMP0, _B, _C, 0xE8 \ // TMP0 = MAJ(A,B,C) + vpternlogd _H, TMP2, TMP3, 0x96 \ // H(T2) = SIGMA0(A) + vpaddd _H, _H, TMP0 \ // H(T2) = SIGMA0(A) + MAJ(A,B,C) + vpaddd _H, _H, T1 \ // H(A) = H(T2) + T1 + \ + vmovdqu32 TMP3, [TBL + ((_ROUND+1)*64)] \ // Next Kt + + +#define MSG_SCHED_ROUND_16_63(_WT, _WTp1, _WTp9, _WTp14) \ + vprord TMP4, _WTp14, 17 \ // ROR_17(Wt-2) + vprord TMP5, _WTp14, 19 \ // ROR_19(Wt-2) + vpsrld TMP6, _WTp14, 10 \ // SHR_10(Wt-2) + vpternlogd TMP4, TMP5, TMP6, 0x96 \ // TMP4 = sigma1(Wt-2) + \ + vpaddd _WT, _WT, TMP4 \ // Wt = Wt-16 + sigma1(Wt-2) + vpaddd _WT, _WT, _WTp9 \ // Wt = Wt-16 + sigma1(Wt-2) + Wt-7 + \ + vprord TMP4, _WTp1, 7 \ // ROR_7(Wt-15) + vprord TMP5, _WTp1, 18 \ // ROR_18(Wt-15) + vpsrld TMP6, _WTp1, 3 \ // SHR_3(Wt-15) + vpternlogd TMP4, TMP5, TMP6, 0x96 \ // TMP4 = sigma0(Wt-15) + \ + vpaddd _WT, _WT, TMP4 \ // Wt = Wt-16 + sigma1(Wt-2) + + \ // Wt-7 + sigma0(Wt-15) + + + +// Note this is reading in a block of data for one lane +// When all 16 are read, the data must be transposed to build msg schedule +#define MSG_SCHED_ROUND_00_15(_WT, OFFSET, LABEL) \ + TESTQ $(1<(SB), TBL_P9 + vmovdqu32 TMP2, [TBL] + + // Get first K from table + MOVQ table+16(FP), TBL_P9 + vmovdqu32 TMP3, [TBL] + + // Save digests for later addition + vmovdqu32 [SCRATCH + 64*0], A + vmovdqu32 [SCRATCH + 64*1], B + vmovdqu32 [SCRATCH + 64*2], C + vmovdqu32 [SCRATCH + 64*3], D + vmovdqu32 [SCRATCH + 64*4], E + vmovdqu32 [SCRATCH + 64*5], F + vmovdqu32 [SCRATCH + 64*6], G + vmovdqu32 [SCRATCH + 64*7], H + + add IDX, 64 + + // Transpose input data + TRANSPOSE16(W0, W1, W2, W3, W4, W5, W6, W7, W8, W9, W10, W11, W12, W13, W14, W15, TMP0, TMP1) + + vpshufb W0, W0, TMP2 + vpshufb W1, W1, TMP2 + vpshufb W2, W2, TMP2 + vpshufb W3, W3, TMP2 + vpshufb W4, W4, TMP2 + vpshufb W5, W5, TMP2 + vpshufb W6, W6, TMP2 + vpshufb W7, W7, TMP2 + vpshufb W8, W8, TMP2 + vpshufb W9, W9, TMP2 + vpshufb W10, W10, TMP2 + vpshufb W11, W11, TMP2 + vpshufb W12, W12, TMP2 + vpshufb W13, W13, TMP2 + vpshufb W14, W14, TMP2 + vpshufb W15, W15, TMP2 + + // MSG Schedule for W0-W15 is now complete in registers + // Process first 48 rounds + // Calculate next Wt+16 after processing is complete and Wt is unneeded + + PROCESS_LOOP( W0, 0, A, B, C, D, E, F, G, H) + MSG_SCHED_ROUND_16_63( W0, W1, W9, W14) + PROCESS_LOOP( W1, 1, H, A, B, C, D, E, F, G) + MSG_SCHED_ROUND_16_63( W1, W2, W10, W15) + PROCESS_LOOP( W2, 2, G, H, A, B, C, D, E, F) + MSG_SCHED_ROUND_16_63( W2, W3, W11, W0) + PROCESS_LOOP( W3, 3, F, G, H, A, B, C, D, E) + MSG_SCHED_ROUND_16_63( W3, W4, W12, W1) + PROCESS_LOOP( W4, 4, E, F, G, H, A, B, C, D) + MSG_SCHED_ROUND_16_63( W4, W5, W13, W2) + PROCESS_LOOP( W5, 5, D, E, F, G, H, A, B, C) + MSG_SCHED_ROUND_16_63( W5, W6, W14, W3) + PROCESS_LOOP( W6, 6, C, D, E, F, G, H, A, B) + MSG_SCHED_ROUND_16_63( W6, W7, W15, W4) + PROCESS_LOOP( W7, 7, B, C, D, E, F, G, H, A) + MSG_SCHED_ROUND_16_63( W7, W8, W0, W5) + PROCESS_LOOP( W8, 8, A, B, C, D, E, F, G, H) + MSG_SCHED_ROUND_16_63( W8, W9, W1, W6) + PROCESS_LOOP( W9, 9, H, A, B, C, D, E, F, G) + MSG_SCHED_ROUND_16_63( W9, W10, W2, W7) + PROCESS_LOOP(W10, 10, G, H, A, B, C, D, E, F) + MSG_SCHED_ROUND_16_63(W10, W11, W3, W8) + PROCESS_LOOP(W11, 11, F, G, H, A, B, C, D, E) + MSG_SCHED_ROUND_16_63(W11, W12, W4, W9) + PROCESS_LOOP(W12, 12, E, F, G, H, A, B, C, D) + MSG_SCHED_ROUND_16_63(W12, W13, W5, W10) + PROCESS_LOOP(W13, 13, D, E, F, G, H, A, B, C) + MSG_SCHED_ROUND_16_63(W13, W14, W6, W11) + PROCESS_LOOP(W14, 14, C, D, E, F, G, H, A, B) + MSG_SCHED_ROUND_16_63(W14, W15, W7, W12) + PROCESS_LOOP(W15, 15, B, C, D, E, F, G, H, A) + MSG_SCHED_ROUND_16_63(W15, W0, W8, W13) + PROCESS_LOOP( W0, 16, A, B, C, D, E, F, G, H) + MSG_SCHED_ROUND_16_63( W0, W1, W9, W14) + PROCESS_LOOP( W1, 17, H, A, B, C, D, E, F, G) + MSG_SCHED_ROUND_16_63( W1, W2, W10, W15) + PROCESS_LOOP( W2, 18, G, H, A, B, C, D, E, F) + MSG_SCHED_ROUND_16_63( W2, W3, W11, W0) + PROCESS_LOOP( W3, 19, F, G, H, A, B, C, D, E) + MSG_SCHED_ROUND_16_63( W3, W4, W12, W1) + PROCESS_LOOP( W4, 20, E, F, G, H, A, B, C, D) + MSG_SCHED_ROUND_16_63( W4, W5, W13, W2) + PROCESS_LOOP( W5, 21, D, E, F, G, H, A, B, C) + MSG_SCHED_ROUND_16_63( W5, W6, W14, W3) + PROCESS_LOOP( W6, 22, C, D, E, F, G, H, A, B) + MSG_SCHED_ROUND_16_63( W6, W7, W15, W4) + PROCESS_LOOP( W7, 23, B, C, D, E, F, G, H, A) + MSG_SCHED_ROUND_16_63( W7, W8, W0, W5) + PROCESS_LOOP( W8, 24, A, B, C, D, E, F, G, H) + MSG_SCHED_ROUND_16_63( W8, W9, W1, W6) + PROCESS_LOOP( W9, 25, H, A, B, C, D, E, F, G) + MSG_SCHED_ROUND_16_63( W9, W10, W2, W7) + PROCESS_LOOP(W10, 26, G, H, A, B, C, D, E, F) + MSG_SCHED_ROUND_16_63(W10, W11, W3, W8) + PROCESS_LOOP(W11, 27, F, G, H, A, B, C, D, E) + MSG_SCHED_ROUND_16_63(W11, W12, W4, W9) + PROCESS_LOOP(W12, 28, E, F, G, H, A, B, C, D) + MSG_SCHED_ROUND_16_63(W12, W13, W5, W10) + PROCESS_LOOP(W13, 29, D, E, F, G, H, A, B, C) + MSG_SCHED_ROUND_16_63(W13, W14, W6, W11) + PROCESS_LOOP(W14, 30, C, D, E, F, G, H, A, B) + MSG_SCHED_ROUND_16_63(W14, W15, W7, W12) + PROCESS_LOOP(W15, 31, B, C, D, E, F, G, H, A) + MSG_SCHED_ROUND_16_63(W15, W0, W8, W13) + PROCESS_LOOP( W0, 32, A, B, C, D, E, F, G, H) + MSG_SCHED_ROUND_16_63( W0, W1, W9, W14) + PROCESS_LOOP( W1, 33, H, A, B, C, D, E, F, G) + MSG_SCHED_ROUND_16_63( W1, W2, W10, W15) + PROCESS_LOOP( W2, 34, G, H, A, B, C, D, E, F) + MSG_SCHED_ROUND_16_63( W2, W3, W11, W0) + PROCESS_LOOP( W3, 35, F, G, H, A, B, C, D, E) + MSG_SCHED_ROUND_16_63( W3, W4, W12, W1) + PROCESS_LOOP( W4, 36, E, F, G, H, A, B, C, D) + MSG_SCHED_ROUND_16_63( W4, W5, W13, W2) + PROCESS_LOOP( W5, 37, D, E, F, G, H, A, B, C) + MSG_SCHED_ROUND_16_63( W5, W6, W14, W3) + PROCESS_LOOP( W6, 38, C, D, E, F, G, H, A, B) + MSG_SCHED_ROUND_16_63( W6, W7, W15, W4) + PROCESS_LOOP( W7, 39, B, C, D, E, F, G, H, A) + MSG_SCHED_ROUND_16_63( W7, W8, W0, W5) + PROCESS_LOOP( W8, 40, A, B, C, D, E, F, G, H) + MSG_SCHED_ROUND_16_63( W8, W9, W1, W6) + PROCESS_LOOP( W9, 41, H, A, B, C, D, E, F, G) + MSG_SCHED_ROUND_16_63( W9, W10, W2, W7) + PROCESS_LOOP(W10, 42, G, H, A, B, C, D, E, F) + MSG_SCHED_ROUND_16_63(W10, W11, W3, W8) + PROCESS_LOOP(W11, 43, F, G, H, A, B, C, D, E) + MSG_SCHED_ROUND_16_63(W11, W12, W4, W9) + PROCESS_LOOP(W12, 44, E, F, G, H, A, B, C, D) + MSG_SCHED_ROUND_16_63(W12, W13, W5, W10) + PROCESS_LOOP(W13, 45, D, E, F, G, H, A, B, C) + MSG_SCHED_ROUND_16_63(W13, W14, W6, W11) + PROCESS_LOOP(W14, 46, C, D, E, F, G, H, A, B) + MSG_SCHED_ROUND_16_63(W14, W15, W7, W12) + PROCESS_LOOP(W15, 47, B, C, D, E, F, G, H, A) + MSG_SCHED_ROUND_16_63(W15, W0, W8, W13) + + // Check if this is the last block + sub INP_SIZE, 1 + JE lastLoop + + // Load next mask for inputs + ADDQ $8, MASKP_P9 + MOVQ (MASKP_P9), MASK_P9 + + // Process last 16 rounds + // Read in next block msg data for use in first 16 words of msg sched + + PROCESS_LOOP( W0, 48, A, B, C, D, E, F, G, H) + MSG_SCHED_ROUND_00_15( W0, 0, skipNext0) + PROCESS_LOOP( W1, 49, H, A, B, C, D, E, F, G) + MSG_SCHED_ROUND_00_15( W1, 1, skipNext1) + PROCESS_LOOP( W2, 50, G, H, A, B, C, D, E, F) + MSG_SCHED_ROUND_00_15( W2, 2, skipNext2) + PROCESS_LOOP( W3, 51, F, G, H, A, B, C, D, E) + MSG_SCHED_ROUND_00_15( W3, 3, skipNext3) + PROCESS_LOOP( W4, 52, E, F, G, H, A, B, C, D) + MSG_SCHED_ROUND_00_15( W4, 4, skipNext4) + PROCESS_LOOP( W5, 53, D, E, F, G, H, A, B, C) + MSG_SCHED_ROUND_00_15( W5, 5, skipNext5) + PROCESS_LOOP( W6, 54, C, D, E, F, G, H, A, B) + MSG_SCHED_ROUND_00_15( W6, 6, skipNext6) + PROCESS_LOOP( W7, 55, B, C, D, E, F, G, H, A) + MSG_SCHED_ROUND_00_15( W7, 7, skipNext7) + PROCESS_LOOP( W8, 56, A, B, C, D, E, F, G, H) + MSG_SCHED_ROUND_00_15( W8, 8, skipNext8) + PROCESS_LOOP( W9, 57, H, A, B, C, D, E, F, G) + MSG_SCHED_ROUND_00_15( W9, 9, skipNext9) + PROCESS_LOOP(W10, 58, G, H, A, B, C, D, E, F) + MSG_SCHED_ROUND_00_15(W10, 10, skipNext10) + PROCESS_LOOP(W11, 59, F, G, H, A, B, C, D, E) + MSG_SCHED_ROUND_00_15(W11, 11, skipNext11) + PROCESS_LOOP(W12, 60, E, F, G, H, A, B, C, D) + MSG_SCHED_ROUND_00_15(W12, 12, skipNext12) + PROCESS_LOOP(W13, 61, D, E, F, G, H, A, B, C) + MSG_SCHED_ROUND_00_15(W13, 13, skipNext13) + PROCESS_LOOP(W14, 62, C, D, E, F, G, H, A, B) + MSG_SCHED_ROUND_00_15(W14, 14, skipNext14) + PROCESS_LOOP(W15, 63, B, C, D, E, F, G, H, A) + MSG_SCHED_ROUND_00_15(W15, 15, skipNext15) + + // Add old digest + vmovdqu32 TMP2, A + vmovdqu32 A, [SCRATCH + 64*0] + vpaddd A{k1}, A, TMP2 + vmovdqu32 TMP2, B + vmovdqu32 B, [SCRATCH + 64*1] + vpaddd B{k1}, B, TMP2 + vmovdqu32 TMP2, C + vmovdqu32 C, [SCRATCH + 64*2] + vpaddd C{k1}, C, TMP2 + vmovdqu32 TMP2, D + vmovdqu32 D, [SCRATCH + 64*3] + vpaddd D{k1}, D, TMP2 + vmovdqu32 TMP2, E + vmovdqu32 E, [SCRATCH + 64*4] + vpaddd E{k1}, E, TMP2 + vmovdqu32 TMP2, F + vmovdqu32 F, [SCRATCH + 64*5] + vpaddd F{k1}, F, TMP2 + vmovdqu32 TMP2, G + vmovdqu32 G, [SCRATCH + 64*6] + vpaddd G{k1}, G, TMP2 + vmovdqu32 TMP2, H + vmovdqu32 H, [SCRATCH + 64*7] + vpaddd H{k1}, H, TMP2 + + kmovq k1, mask + JMP lloop + +lastLoop: + // Process last 16 rounds + PROCESS_LOOP( W0, 48, A, B, C, D, E, F, G, H) + PROCESS_LOOP( W1, 49, H, A, B, C, D, E, F, G) + PROCESS_LOOP( W2, 50, G, H, A, B, C, D, E, F) + PROCESS_LOOP( W3, 51, F, G, H, A, B, C, D, E) + PROCESS_LOOP( W4, 52, E, F, G, H, A, B, C, D) + PROCESS_LOOP( W5, 53, D, E, F, G, H, A, B, C) + PROCESS_LOOP( W6, 54, C, D, E, F, G, H, A, B) + PROCESS_LOOP( W7, 55, B, C, D, E, F, G, H, A) + PROCESS_LOOP( W8, 56, A, B, C, D, E, F, G, H) + PROCESS_LOOP( W9, 57, H, A, B, C, D, E, F, G) + PROCESS_LOOP(W10, 58, G, H, A, B, C, D, E, F) + PROCESS_LOOP(W11, 59, F, G, H, A, B, C, D, E) + PROCESS_LOOP(W12, 60, E, F, G, H, A, B, C, D) + PROCESS_LOOP(W13, 61, D, E, F, G, H, A, B, C) + PROCESS_LOOP(W14, 62, C, D, E, F, G, H, A, B) + PROCESS_LOOP(W15, 63, B, C, D, E, F, G, H, A) + + // Add old digest + vmovdqu32 TMP2, A + vmovdqu32 A, [SCRATCH + 64*0] + vpaddd A{k1}, A, TMP2 + vmovdqu32 TMP2, B + vmovdqu32 B, [SCRATCH + 64*1] + vpaddd B{k1}, B, TMP2 + vmovdqu32 TMP2, C + vmovdqu32 C, [SCRATCH + 64*2] + vpaddd C{k1}, C, TMP2 + vmovdqu32 TMP2, D + vmovdqu32 D, [SCRATCH + 64*3] + vpaddd D{k1}, D, TMP2 + vmovdqu32 TMP2, E + vmovdqu32 E, [SCRATCH + 64*4] + vpaddd E{k1}, E, TMP2 + vmovdqu32 TMP2, F + vmovdqu32 F, [SCRATCH + 64*5] + vpaddd F{k1}, F, TMP2 + vmovdqu32 TMP2, G + vmovdqu32 G, [SCRATCH + 64*6] + vpaddd G{k1}, G, TMP2 + vmovdqu32 TMP2, H + vmovdqu32 H, [SCRATCH + 64*7] + vpaddd H{k1}, H, TMP2 + + // Write out digest + vmovdqu32 [STATE + 0*SHA256_DIGEST_ROW_SIZE], A + vmovdqu32 [STATE + 1*SHA256_DIGEST_ROW_SIZE], B + vmovdqu32 [STATE + 2*SHA256_DIGEST_ROW_SIZE], C + vmovdqu32 [STATE + 3*SHA256_DIGEST_ROW_SIZE], D + vmovdqu32 [STATE + 4*SHA256_DIGEST_ROW_SIZE], E + vmovdqu32 [STATE + 5*SHA256_DIGEST_ROW_SIZE], F + vmovdqu32 [STATE + 6*SHA256_DIGEST_ROW_SIZE], G + vmovdqu32 [STATE + 7*SHA256_DIGEST_ROW_SIZE], H + + VZEROUPPER + RET + +// +// Tables +// + +DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x000(SB)/8, $0x0405060700010203 +DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x008(SB)/8, $0x0c0d0e0f08090a0b +DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x010(SB)/8, $0x0405060700010203 +DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x018(SB)/8, $0x0c0d0e0f08090a0b +DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x020(SB)/8, $0x0405060700010203 +DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x028(SB)/8, $0x0c0d0e0f08090a0b +DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x030(SB)/8, $0x0405060700010203 +DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x038(SB)/8, $0x0c0d0e0f08090a0b +GLOBL PSHUFFLE_BYTE_FLIP_MASK<>(SB), 8, $64 + +DATA PSHUFFLE_TRANSPOSE16_MASK1<>+0x000(SB)/8, $0x0000000000000000 +DATA PSHUFFLE_TRANSPOSE16_MASK1<>+0x008(SB)/8, $0x0000000000000001 +DATA PSHUFFLE_TRANSPOSE16_MASK1<>+0x010(SB)/8, $0x0000000000000008 +DATA PSHUFFLE_TRANSPOSE16_MASK1<>+0x018(SB)/8, $0x0000000000000009 +DATA PSHUFFLE_TRANSPOSE16_MASK1<>+0x020(SB)/8, $0x0000000000000004 +DATA PSHUFFLE_TRANSPOSE16_MASK1<>+0x028(SB)/8, $0x0000000000000005 +DATA PSHUFFLE_TRANSPOSE16_MASK1<>+0x030(SB)/8, $0x000000000000000C +DATA PSHUFFLE_TRANSPOSE16_MASK1<>+0x038(SB)/8, $0x000000000000000D +GLOBL PSHUFFLE_TRANSPOSE16_MASK1<>(SB), 8, $64 + +DATA PSHUFFLE_TRANSPOSE16_MASK2<>+0x000(SB)/8, $0x0000000000000002 +DATA PSHUFFLE_TRANSPOSE16_MASK2<>+0x008(SB)/8, $0x0000000000000003 +DATA PSHUFFLE_TRANSPOSE16_MASK2<>+0x010(SB)/8, $0x000000000000000A +DATA PSHUFFLE_TRANSPOSE16_MASK2<>+0x018(SB)/8, $0x000000000000000B +DATA PSHUFFLE_TRANSPOSE16_MASK2<>+0x020(SB)/8, $0x0000000000000006 +DATA PSHUFFLE_TRANSPOSE16_MASK2<>+0x028(SB)/8, $0x0000000000000007 +DATA PSHUFFLE_TRANSPOSE16_MASK2<>+0x030(SB)/8, $0x000000000000000E +DATA PSHUFFLE_TRANSPOSE16_MASK2<>+0x038(SB)/8, $0x000000000000000F +GLOBL PSHUFFLE_TRANSPOSE16_MASK2<>(SB), 8, $64 diff --git a/vendor/github.com/minio/sha256-simd/sha256blockAvx512_amd64.go b/vendor/github.com/minio/sha256-simd/sha256blockAvx512_amd64.go new file mode 100644 index 000000000..db8e48d31 --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/sha256blockAvx512_amd64.go @@ -0,0 +1,500 @@ +//+build !noasm,!appengine + +/* + * Minio Cloud Storage, (C) 2017 Minio, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package sha256 + +import ( + "encoding/binary" + "errors" + "hash" + "sort" + "sync/atomic" + "time" +) + +//go:noescape +func sha256X16Avx512(digests *[512]byte, scratch *[512]byte, table *[512]uint64, mask []uint64, inputs [16][]byte) + +// Avx512ServerUID - Do not start at 0 but next multiple of 16 so as to be able to +// differentiate with default initialiation value of 0 +const Avx512ServerUID = 16 + +var uidCounter uint64 + +// NewAvx512 - initialize sha256 Avx512 implementation. +func NewAvx512(a512srv *Avx512Server) hash.Hash { + uid := atomic.AddUint64(&uidCounter, 1) + return &Avx512Digest{uid: uid, a512srv: a512srv} +} + +// Avx512Digest - Type for computing SHA256 using Avx512 +type Avx512Digest struct { + uid uint64 + a512srv *Avx512Server + x [chunk]byte + nx int + len uint64 + final bool + result [Size]byte +} + +// Size - Return size of checksum +func (d *Avx512Digest) Size() int { return Size } + +// BlockSize - Return blocksize of checksum +func (d Avx512Digest) BlockSize() int { return BlockSize } + +// Reset - reset sha digest to its initial values +func (d *Avx512Digest) Reset() { + d.a512srv.blocksCh <- blockInput{uid: d.uid, reset: true} + d.nx = 0 + d.len = 0 + d.final = false +} + +// Write to digest +func (d *Avx512Digest) Write(p []byte) (nn int, err error) { + + if d.final { + return 0, errors.New("Avx512Digest already finalized. Reset first before writing again") + } + + nn = len(p) + d.len += uint64(nn) + if d.nx > 0 { + n := copy(d.x[d.nx:], p) + d.nx += n + if d.nx == chunk { + d.a512srv.blocksCh <- blockInput{uid: d.uid, msg: d.x[:]} + d.nx = 0 + } + p = p[n:] + } + if len(p) >= chunk { + n := len(p) &^ (chunk - 1) + d.a512srv.blocksCh <- blockInput{uid: d.uid, msg: p[:n]} + p = p[n:] + } + if len(p) > 0 { + d.nx = copy(d.x[:], p) + } + return +} + +// Sum - Return sha256 sum in bytes +func (d *Avx512Digest) Sum(in []byte) (result []byte) { + + if d.final { + return append(in, d.result[:]...) + } + + trail := make([]byte, 0, 128) + trail = append(trail, d.x[:d.nx]...) + + len := d.len + // Padding. Add a 1 bit and 0 bits until 56 bytes mod 64. + var tmp [64]byte + tmp[0] = 0x80 + if len%64 < 56 { + trail = append(trail, tmp[0:56-len%64]...) + } else { + trail = append(trail, tmp[0:64+56-len%64]...) + } + d.nx = 0 + + // Length in bits. + len <<= 3 + for i := uint(0); i < 8; i++ { + tmp[i] = byte(len >> (56 - 8*i)) + } + trail = append(trail, tmp[0:8]...) + + sumCh := make(chan [Size]byte) + d.a512srv.blocksCh <- blockInput{uid: d.uid, msg: trail, final: true, sumCh: sumCh} + d.result = <-sumCh + d.final = true + return append(in, d.result[:]...) +} + +var table = [512]uint64{ + 0x428a2f98428a2f98, 0x428a2f98428a2f98, 0x428a2f98428a2f98, 0x428a2f98428a2f98, + 0x428a2f98428a2f98, 0x428a2f98428a2f98, 0x428a2f98428a2f98, 0x428a2f98428a2f98, + 0x7137449171374491, 0x7137449171374491, 0x7137449171374491, 0x7137449171374491, + 0x7137449171374491, 0x7137449171374491, 0x7137449171374491, 0x7137449171374491, + 0xb5c0fbcfb5c0fbcf, 0xb5c0fbcfb5c0fbcf, 0xb5c0fbcfb5c0fbcf, 0xb5c0fbcfb5c0fbcf, + 0xb5c0fbcfb5c0fbcf, 0xb5c0fbcfb5c0fbcf, 0xb5c0fbcfb5c0fbcf, 0xb5c0fbcfb5c0fbcf, + 0xe9b5dba5e9b5dba5, 0xe9b5dba5e9b5dba5, 0xe9b5dba5e9b5dba5, 0xe9b5dba5e9b5dba5, + 0xe9b5dba5e9b5dba5, 0xe9b5dba5e9b5dba5, 0xe9b5dba5e9b5dba5, 0xe9b5dba5e9b5dba5, + 0x3956c25b3956c25b, 0x3956c25b3956c25b, 0x3956c25b3956c25b, 0x3956c25b3956c25b, + 0x3956c25b3956c25b, 0x3956c25b3956c25b, 0x3956c25b3956c25b, 0x3956c25b3956c25b, + 0x59f111f159f111f1, 0x59f111f159f111f1, 0x59f111f159f111f1, 0x59f111f159f111f1, + 0x59f111f159f111f1, 0x59f111f159f111f1, 0x59f111f159f111f1, 0x59f111f159f111f1, + 0x923f82a4923f82a4, 0x923f82a4923f82a4, 0x923f82a4923f82a4, 0x923f82a4923f82a4, + 0x923f82a4923f82a4, 0x923f82a4923f82a4, 0x923f82a4923f82a4, 0x923f82a4923f82a4, + 0xab1c5ed5ab1c5ed5, 0xab1c5ed5ab1c5ed5, 0xab1c5ed5ab1c5ed5, 0xab1c5ed5ab1c5ed5, + 0xab1c5ed5ab1c5ed5, 0xab1c5ed5ab1c5ed5, 0xab1c5ed5ab1c5ed5, 0xab1c5ed5ab1c5ed5, + 0xd807aa98d807aa98, 0xd807aa98d807aa98, 0xd807aa98d807aa98, 0xd807aa98d807aa98, + 0xd807aa98d807aa98, 0xd807aa98d807aa98, 0xd807aa98d807aa98, 0xd807aa98d807aa98, + 0x12835b0112835b01, 0x12835b0112835b01, 0x12835b0112835b01, 0x12835b0112835b01, + 0x12835b0112835b01, 0x12835b0112835b01, 0x12835b0112835b01, 0x12835b0112835b01, + 0x243185be243185be, 0x243185be243185be, 0x243185be243185be, 0x243185be243185be, + 0x243185be243185be, 0x243185be243185be, 0x243185be243185be, 0x243185be243185be, + 0x550c7dc3550c7dc3, 0x550c7dc3550c7dc3, 0x550c7dc3550c7dc3, 0x550c7dc3550c7dc3, + 0x550c7dc3550c7dc3, 0x550c7dc3550c7dc3, 0x550c7dc3550c7dc3, 0x550c7dc3550c7dc3, + 0x72be5d7472be5d74, 0x72be5d7472be5d74, 0x72be5d7472be5d74, 0x72be5d7472be5d74, + 0x72be5d7472be5d74, 0x72be5d7472be5d74, 0x72be5d7472be5d74, 0x72be5d7472be5d74, + 0x80deb1fe80deb1fe, 0x80deb1fe80deb1fe, 0x80deb1fe80deb1fe, 0x80deb1fe80deb1fe, + 0x80deb1fe80deb1fe, 0x80deb1fe80deb1fe, 0x80deb1fe80deb1fe, 0x80deb1fe80deb1fe, + 0x9bdc06a79bdc06a7, 0x9bdc06a79bdc06a7, 0x9bdc06a79bdc06a7, 0x9bdc06a79bdc06a7, + 0x9bdc06a79bdc06a7, 0x9bdc06a79bdc06a7, 0x9bdc06a79bdc06a7, 0x9bdc06a79bdc06a7, + 0xc19bf174c19bf174, 0xc19bf174c19bf174, 0xc19bf174c19bf174, 0xc19bf174c19bf174, + 0xc19bf174c19bf174, 0xc19bf174c19bf174, 0xc19bf174c19bf174, 0xc19bf174c19bf174, + 0xe49b69c1e49b69c1, 0xe49b69c1e49b69c1, 0xe49b69c1e49b69c1, 0xe49b69c1e49b69c1, + 0xe49b69c1e49b69c1, 0xe49b69c1e49b69c1, 0xe49b69c1e49b69c1, 0xe49b69c1e49b69c1, + 0xefbe4786efbe4786, 0xefbe4786efbe4786, 0xefbe4786efbe4786, 0xefbe4786efbe4786, + 0xefbe4786efbe4786, 0xefbe4786efbe4786, 0xefbe4786efbe4786, 0xefbe4786efbe4786, + 0x0fc19dc60fc19dc6, 0x0fc19dc60fc19dc6, 0x0fc19dc60fc19dc6, 0x0fc19dc60fc19dc6, + 0x0fc19dc60fc19dc6, 0x0fc19dc60fc19dc6, 0x0fc19dc60fc19dc6, 0x0fc19dc60fc19dc6, + 0x240ca1cc240ca1cc, 0x240ca1cc240ca1cc, 0x240ca1cc240ca1cc, 0x240ca1cc240ca1cc, + 0x240ca1cc240ca1cc, 0x240ca1cc240ca1cc, 0x240ca1cc240ca1cc, 0x240ca1cc240ca1cc, + 0x2de92c6f2de92c6f, 0x2de92c6f2de92c6f, 0x2de92c6f2de92c6f, 0x2de92c6f2de92c6f, + 0x2de92c6f2de92c6f, 0x2de92c6f2de92c6f, 0x2de92c6f2de92c6f, 0x2de92c6f2de92c6f, + 0x4a7484aa4a7484aa, 0x4a7484aa4a7484aa, 0x4a7484aa4a7484aa, 0x4a7484aa4a7484aa, + 0x4a7484aa4a7484aa, 0x4a7484aa4a7484aa, 0x4a7484aa4a7484aa, 0x4a7484aa4a7484aa, + 0x5cb0a9dc5cb0a9dc, 0x5cb0a9dc5cb0a9dc, 0x5cb0a9dc5cb0a9dc, 0x5cb0a9dc5cb0a9dc, + 0x5cb0a9dc5cb0a9dc, 0x5cb0a9dc5cb0a9dc, 0x5cb0a9dc5cb0a9dc, 0x5cb0a9dc5cb0a9dc, + 0x76f988da76f988da, 0x76f988da76f988da, 0x76f988da76f988da, 0x76f988da76f988da, + 0x76f988da76f988da, 0x76f988da76f988da, 0x76f988da76f988da, 0x76f988da76f988da, + 0x983e5152983e5152, 0x983e5152983e5152, 0x983e5152983e5152, 0x983e5152983e5152, + 0x983e5152983e5152, 0x983e5152983e5152, 0x983e5152983e5152, 0x983e5152983e5152, + 0xa831c66da831c66d, 0xa831c66da831c66d, 0xa831c66da831c66d, 0xa831c66da831c66d, + 0xa831c66da831c66d, 0xa831c66da831c66d, 0xa831c66da831c66d, 0xa831c66da831c66d, + 0xb00327c8b00327c8, 0xb00327c8b00327c8, 0xb00327c8b00327c8, 0xb00327c8b00327c8, + 0xb00327c8b00327c8, 0xb00327c8b00327c8, 0xb00327c8b00327c8, 0xb00327c8b00327c8, + 0xbf597fc7bf597fc7, 0xbf597fc7bf597fc7, 0xbf597fc7bf597fc7, 0xbf597fc7bf597fc7, + 0xbf597fc7bf597fc7, 0xbf597fc7bf597fc7, 0xbf597fc7bf597fc7, 0xbf597fc7bf597fc7, + 0xc6e00bf3c6e00bf3, 0xc6e00bf3c6e00bf3, 0xc6e00bf3c6e00bf3, 0xc6e00bf3c6e00bf3, + 0xc6e00bf3c6e00bf3, 0xc6e00bf3c6e00bf3, 0xc6e00bf3c6e00bf3, 0xc6e00bf3c6e00bf3, + 0xd5a79147d5a79147, 0xd5a79147d5a79147, 0xd5a79147d5a79147, 0xd5a79147d5a79147, + 0xd5a79147d5a79147, 0xd5a79147d5a79147, 0xd5a79147d5a79147, 0xd5a79147d5a79147, + 0x06ca635106ca6351, 0x06ca635106ca6351, 0x06ca635106ca6351, 0x06ca635106ca6351, + 0x06ca635106ca6351, 0x06ca635106ca6351, 0x06ca635106ca6351, 0x06ca635106ca6351, + 0x1429296714292967, 0x1429296714292967, 0x1429296714292967, 0x1429296714292967, + 0x1429296714292967, 0x1429296714292967, 0x1429296714292967, 0x1429296714292967, + 0x27b70a8527b70a85, 0x27b70a8527b70a85, 0x27b70a8527b70a85, 0x27b70a8527b70a85, + 0x27b70a8527b70a85, 0x27b70a8527b70a85, 0x27b70a8527b70a85, 0x27b70a8527b70a85, + 0x2e1b21382e1b2138, 0x2e1b21382e1b2138, 0x2e1b21382e1b2138, 0x2e1b21382e1b2138, + 0x2e1b21382e1b2138, 0x2e1b21382e1b2138, 0x2e1b21382e1b2138, 0x2e1b21382e1b2138, + 0x4d2c6dfc4d2c6dfc, 0x4d2c6dfc4d2c6dfc, 0x4d2c6dfc4d2c6dfc, 0x4d2c6dfc4d2c6dfc, + 0x4d2c6dfc4d2c6dfc, 0x4d2c6dfc4d2c6dfc, 0x4d2c6dfc4d2c6dfc, 0x4d2c6dfc4d2c6dfc, + 0x53380d1353380d13, 0x53380d1353380d13, 0x53380d1353380d13, 0x53380d1353380d13, + 0x53380d1353380d13, 0x53380d1353380d13, 0x53380d1353380d13, 0x53380d1353380d13, + 0x650a7354650a7354, 0x650a7354650a7354, 0x650a7354650a7354, 0x650a7354650a7354, + 0x650a7354650a7354, 0x650a7354650a7354, 0x650a7354650a7354, 0x650a7354650a7354, + 0x766a0abb766a0abb, 0x766a0abb766a0abb, 0x766a0abb766a0abb, 0x766a0abb766a0abb, + 0x766a0abb766a0abb, 0x766a0abb766a0abb, 0x766a0abb766a0abb, 0x766a0abb766a0abb, + 0x81c2c92e81c2c92e, 0x81c2c92e81c2c92e, 0x81c2c92e81c2c92e, 0x81c2c92e81c2c92e, + 0x81c2c92e81c2c92e, 0x81c2c92e81c2c92e, 0x81c2c92e81c2c92e, 0x81c2c92e81c2c92e, + 0x92722c8592722c85, 0x92722c8592722c85, 0x92722c8592722c85, 0x92722c8592722c85, + 0x92722c8592722c85, 0x92722c8592722c85, 0x92722c8592722c85, 0x92722c8592722c85, + 0xa2bfe8a1a2bfe8a1, 0xa2bfe8a1a2bfe8a1, 0xa2bfe8a1a2bfe8a1, 0xa2bfe8a1a2bfe8a1, + 0xa2bfe8a1a2bfe8a1, 0xa2bfe8a1a2bfe8a1, 0xa2bfe8a1a2bfe8a1, 0xa2bfe8a1a2bfe8a1, + 0xa81a664ba81a664b, 0xa81a664ba81a664b, 0xa81a664ba81a664b, 0xa81a664ba81a664b, + 0xa81a664ba81a664b, 0xa81a664ba81a664b, 0xa81a664ba81a664b, 0xa81a664ba81a664b, + 0xc24b8b70c24b8b70, 0xc24b8b70c24b8b70, 0xc24b8b70c24b8b70, 0xc24b8b70c24b8b70, + 0xc24b8b70c24b8b70, 0xc24b8b70c24b8b70, 0xc24b8b70c24b8b70, 0xc24b8b70c24b8b70, + 0xc76c51a3c76c51a3, 0xc76c51a3c76c51a3, 0xc76c51a3c76c51a3, 0xc76c51a3c76c51a3, + 0xc76c51a3c76c51a3, 0xc76c51a3c76c51a3, 0xc76c51a3c76c51a3, 0xc76c51a3c76c51a3, + 0xd192e819d192e819, 0xd192e819d192e819, 0xd192e819d192e819, 0xd192e819d192e819, + 0xd192e819d192e819, 0xd192e819d192e819, 0xd192e819d192e819, 0xd192e819d192e819, + 0xd6990624d6990624, 0xd6990624d6990624, 0xd6990624d6990624, 0xd6990624d6990624, + 0xd6990624d6990624, 0xd6990624d6990624, 0xd6990624d6990624, 0xd6990624d6990624, + 0xf40e3585f40e3585, 0xf40e3585f40e3585, 0xf40e3585f40e3585, 0xf40e3585f40e3585, + 0xf40e3585f40e3585, 0xf40e3585f40e3585, 0xf40e3585f40e3585, 0xf40e3585f40e3585, + 0x106aa070106aa070, 0x106aa070106aa070, 0x106aa070106aa070, 0x106aa070106aa070, + 0x106aa070106aa070, 0x106aa070106aa070, 0x106aa070106aa070, 0x106aa070106aa070, + 0x19a4c11619a4c116, 0x19a4c11619a4c116, 0x19a4c11619a4c116, 0x19a4c11619a4c116, + 0x19a4c11619a4c116, 0x19a4c11619a4c116, 0x19a4c11619a4c116, 0x19a4c11619a4c116, + 0x1e376c081e376c08, 0x1e376c081e376c08, 0x1e376c081e376c08, 0x1e376c081e376c08, + 0x1e376c081e376c08, 0x1e376c081e376c08, 0x1e376c081e376c08, 0x1e376c081e376c08, + 0x2748774c2748774c, 0x2748774c2748774c, 0x2748774c2748774c, 0x2748774c2748774c, + 0x2748774c2748774c, 0x2748774c2748774c, 0x2748774c2748774c, 0x2748774c2748774c, + 0x34b0bcb534b0bcb5, 0x34b0bcb534b0bcb5, 0x34b0bcb534b0bcb5, 0x34b0bcb534b0bcb5, + 0x34b0bcb534b0bcb5, 0x34b0bcb534b0bcb5, 0x34b0bcb534b0bcb5, 0x34b0bcb534b0bcb5, + 0x391c0cb3391c0cb3, 0x391c0cb3391c0cb3, 0x391c0cb3391c0cb3, 0x391c0cb3391c0cb3, + 0x391c0cb3391c0cb3, 0x391c0cb3391c0cb3, 0x391c0cb3391c0cb3, 0x391c0cb3391c0cb3, + 0x4ed8aa4a4ed8aa4a, 0x4ed8aa4a4ed8aa4a, 0x4ed8aa4a4ed8aa4a, 0x4ed8aa4a4ed8aa4a, + 0x4ed8aa4a4ed8aa4a, 0x4ed8aa4a4ed8aa4a, 0x4ed8aa4a4ed8aa4a, 0x4ed8aa4a4ed8aa4a, + 0x5b9cca4f5b9cca4f, 0x5b9cca4f5b9cca4f, 0x5b9cca4f5b9cca4f, 0x5b9cca4f5b9cca4f, + 0x5b9cca4f5b9cca4f, 0x5b9cca4f5b9cca4f, 0x5b9cca4f5b9cca4f, 0x5b9cca4f5b9cca4f, + 0x682e6ff3682e6ff3, 0x682e6ff3682e6ff3, 0x682e6ff3682e6ff3, 0x682e6ff3682e6ff3, + 0x682e6ff3682e6ff3, 0x682e6ff3682e6ff3, 0x682e6ff3682e6ff3, 0x682e6ff3682e6ff3, + 0x748f82ee748f82ee, 0x748f82ee748f82ee, 0x748f82ee748f82ee, 0x748f82ee748f82ee, + 0x748f82ee748f82ee, 0x748f82ee748f82ee, 0x748f82ee748f82ee, 0x748f82ee748f82ee, + 0x78a5636f78a5636f, 0x78a5636f78a5636f, 0x78a5636f78a5636f, 0x78a5636f78a5636f, + 0x78a5636f78a5636f, 0x78a5636f78a5636f, 0x78a5636f78a5636f, 0x78a5636f78a5636f, + 0x84c8781484c87814, 0x84c8781484c87814, 0x84c8781484c87814, 0x84c8781484c87814, + 0x84c8781484c87814, 0x84c8781484c87814, 0x84c8781484c87814, 0x84c8781484c87814, + 0x8cc702088cc70208, 0x8cc702088cc70208, 0x8cc702088cc70208, 0x8cc702088cc70208, + 0x8cc702088cc70208, 0x8cc702088cc70208, 0x8cc702088cc70208, 0x8cc702088cc70208, + 0x90befffa90befffa, 0x90befffa90befffa, 0x90befffa90befffa, 0x90befffa90befffa, + 0x90befffa90befffa, 0x90befffa90befffa, 0x90befffa90befffa, 0x90befffa90befffa, + 0xa4506ceba4506ceb, 0xa4506ceba4506ceb, 0xa4506ceba4506ceb, 0xa4506ceba4506ceb, + 0xa4506ceba4506ceb, 0xa4506ceba4506ceb, 0xa4506ceba4506ceb, 0xa4506ceba4506ceb, + 0xbef9a3f7bef9a3f7, 0xbef9a3f7bef9a3f7, 0xbef9a3f7bef9a3f7, 0xbef9a3f7bef9a3f7, + 0xbef9a3f7bef9a3f7, 0xbef9a3f7bef9a3f7, 0xbef9a3f7bef9a3f7, 0xbef9a3f7bef9a3f7, + 0xc67178f2c67178f2, 0xc67178f2c67178f2, 0xc67178f2c67178f2, 0xc67178f2c67178f2, + 0xc67178f2c67178f2, 0xc67178f2c67178f2, 0xc67178f2c67178f2, 0xc67178f2c67178f2} + +// Interface function to assembly ode +func blockAvx512(digests *[512]byte, input [16][]byte, mask []uint64) [16][Size]byte { + + scratch := [512]byte{} + sha256X16Avx512(digests, &scratch, &table, mask, input) + + output := [16][Size]byte{} + for i := 0; i < 16; i++ { + output[i] = getDigest(i, digests[:]) + } + + return output +} + +func getDigest(index int, state []byte) (sum [Size]byte) { + for j := 0; j < 16; j += 2 { + for i := index*4 + j*Size; i < index*4+(j+1)*Size; i += Size { + binary.BigEndian.PutUint32(sum[j*2:], binary.LittleEndian.Uint32(state[i:i+4])) + } + } + return +} + +// Message to send across input channel +type blockInput struct { + uid uint64 + msg []byte + reset bool + final bool + sumCh chan [Size]byte +} + +// Avx512Server - Type to implement 16x parallel handling of SHA256 invocations +type Avx512Server struct { + blocksCh chan blockInput // Input channel + totalIn int // Total number of inputs waiting to be processed + lanes [16]Avx512LaneInfo // Array with info per lane (out of 16) + digests map[uint64][Size]byte // Map of uids to (interim) digest results +} + +// Avx512LaneInfo - Info for each lane +type Avx512LaneInfo struct { + uid uint64 // unique identification for this SHA processing + block []byte // input block to be processed + outputCh chan [Size]byte // channel for output result +} + +// NewAvx512Server - Create new object for parallel processing handling +func NewAvx512Server() *Avx512Server { + a512srv := &Avx512Server{} + a512srv.digests = make(map[uint64][Size]byte) + a512srv.blocksCh = make(chan blockInput) + + // Start a single thread for reading from the input channel + go a512srv.Process() + return a512srv +} + +// Process - Sole handler for reading from the input channel +func (a512srv *Avx512Server) Process() { + for { + select { + case block := <-a512srv.blocksCh: + if block.reset { + a512srv.reset(block.uid) + continue + } + index := block.uid & 0xf + // fmt.Println("Adding message:", block.uid, index) + + if a512srv.lanes[index].block != nil { // If slot is already filled, process all inputs + //fmt.Println("Invoking Blocks()") + a512srv.blocks() + } + a512srv.totalIn++ + a512srv.lanes[index] = Avx512LaneInfo{uid: block.uid, block: block.msg} + if block.final { + a512srv.lanes[index].outputCh = block.sumCh + } + if a512srv.totalIn == len(a512srv.lanes) { + // fmt.Println("Invoking Blocks() while FULL: ") + a512srv.blocks() + } + + // TODO: test with larger timeout + case <-time.After(1 * time.Microsecond): + for _, lane := range a512srv.lanes { + if lane.block != nil { // check if there is any input to process + // fmt.Println("Invoking Blocks() on TIMEOUT: ") + a512srv.blocks() + break // we are done + } + } + } + } +} + +// Do a reset for this calculation +func (a512srv *Avx512Server) reset(uid uint64) { + + // Check if there is a message still waiting to be processed (and remove if so) + for i, lane := range a512srv.lanes { + if lane.uid == uid { + if lane.block != nil { + a512srv.lanes[i] = Avx512LaneInfo{} // clear message + a512srv.totalIn-- + } + } + } + + // Delete entry from hash map + delete(a512srv.digests, uid) +} + +// Invoke assembly and send results back +func (a512srv *Avx512Server) blocks() { + + inputs := [16][]byte{} + for i := range inputs { + inputs[i] = a512srv.lanes[i].block + } + + mask := expandMask(genMask(inputs)) + outputs := blockAvx512(a512srv.getDigests(), inputs, mask) + + a512srv.totalIn = 0 + for i := 0; i < len(outputs); i++ { + uid, outputCh := a512srv.lanes[i].uid, a512srv.lanes[i].outputCh + a512srv.digests[uid] = outputs[i] + a512srv.lanes[i] = Avx512LaneInfo{} + + if outputCh != nil { + // Send back result + outputCh <- outputs[i] + delete(a512srv.digests, uid) // Delete entry from hashmap + } + } +} + +func (a512srv *Avx512Server) Write(uid uint64, p []byte) (nn int, err error) { + a512srv.blocksCh <- blockInput{uid: uid, msg: p} + return len(p), nil +} + +// Sum - return sha256 sum in bytes for a given sum id. +func (a512srv *Avx512Server) Sum(uid uint64, p []byte) [32]byte { + sumCh := make(chan [32]byte) + a512srv.blocksCh <- blockInput{uid: uid, msg: p, final: true, sumCh: sumCh} + return <-sumCh +} + +func (a512srv *Avx512Server) getDigests() *[512]byte { + digests := [512]byte{} + for i, lane := range a512srv.lanes { + a, ok := a512srv.digests[lane.uid] + if ok { + binary.BigEndian.PutUint32(digests[(i+0*16)*4:], binary.LittleEndian.Uint32(a[0:4])) + binary.BigEndian.PutUint32(digests[(i+1*16)*4:], binary.LittleEndian.Uint32(a[4:8])) + binary.BigEndian.PutUint32(digests[(i+2*16)*4:], binary.LittleEndian.Uint32(a[8:12])) + binary.BigEndian.PutUint32(digests[(i+3*16)*4:], binary.LittleEndian.Uint32(a[12:16])) + binary.BigEndian.PutUint32(digests[(i+4*16)*4:], binary.LittleEndian.Uint32(a[16:20])) + binary.BigEndian.PutUint32(digests[(i+5*16)*4:], binary.LittleEndian.Uint32(a[20:24])) + binary.BigEndian.PutUint32(digests[(i+6*16)*4:], binary.LittleEndian.Uint32(a[24:28])) + binary.BigEndian.PutUint32(digests[(i+7*16)*4:], binary.LittleEndian.Uint32(a[28:32])) + } else { + binary.LittleEndian.PutUint32(digests[(i+0*16)*4:], init0) + binary.LittleEndian.PutUint32(digests[(i+1*16)*4:], init1) + binary.LittleEndian.PutUint32(digests[(i+2*16)*4:], init2) + binary.LittleEndian.PutUint32(digests[(i+3*16)*4:], init3) + binary.LittleEndian.PutUint32(digests[(i+4*16)*4:], init4) + binary.LittleEndian.PutUint32(digests[(i+5*16)*4:], init5) + binary.LittleEndian.PutUint32(digests[(i+6*16)*4:], init6) + binary.LittleEndian.PutUint32(digests[(i+7*16)*4:], init7) + } + } + return &digests +} + +// Helper struct for sorting blocks based on length +type lane struct { + len uint + pos uint +} + +type lanes []lane + +func (lns lanes) Len() int { return len(lns) } +func (lns lanes) Swap(i, j int) { lns[i], lns[j] = lns[j], lns[i] } +func (lns lanes) Less(i, j int) bool { return lns[i].len < lns[j].len } + +// Helper struct for +type maskRounds struct { + mask uint64 + rounds uint64 +} + +func genMask(input [16][]byte) [16]maskRounds { + + // Sort on blocks length small to large + var sorted [16]lane + for c, inpt := range input { + sorted[c] = lane{uint(len(inpt)), uint(c)} + } + sort.Sort(lanes(sorted[:])) + + // Create mask array including 'rounds' between masks + m, round, index := uint64(0xffff), uint64(0), 0 + var mr [16]maskRounds + for _, s := range sorted { + if s.len > 0 { + if uint64(s.len)>>6 > round { + mr[index] = maskRounds{m, (uint64(s.len) >> 6) - round} + index++ + } + round = uint64(s.len) >> 6 + } + m = m & ^(1 << uint(s.pos)) + } + + return mr +} + +// TODO: remove function +func expandMask(mr [16]maskRounds) []uint64 { + size := uint64(0) + for _, r := range mr { + size += r.rounds + } + result, index := make([]uint64, size), 0 + for _, r := range mr { + for j := uint64(0); j < r.rounds; j++ { + result[index] = r.mask + index++ + } + } + return result +} diff --git a/vendor/github.com/minio/sha256-simd/sha256blockAvx512_amd64.s b/vendor/github.com/minio/sha256-simd/sha256blockAvx512_amd64.s new file mode 100644 index 000000000..275bcacbc --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/sha256blockAvx512_amd64.s @@ -0,0 +1,267 @@ +//+build !noasm,!appengine + +TEXT ·sha256X16Avx512(SB), 7, $0 + MOVQ digests+0(FP), DI + MOVQ scratch+8(FP), R12 + MOVQ mask_len+32(FP), SI + MOVQ mask_base+24(FP), R13 + MOVQ (R13), R14 + LONG $0x92fbc1c4; BYTE $0xce + LEAQ inputs+48(FP), AX + QUAD $0xf162076f487ef162; QUAD $0x7ef162014f6f487e; QUAD $0x487ef16202576f48; QUAD $0x6f487ef162035f6f; QUAD $0x6f6f487ef1620467; QUAD $0x06776f487ef16205; LONG $0x487ef162; WORD $0x7f6f; BYTE $0x07 + MOVQ table+16(FP), DX + WORD $0x3148; BYTE $0xc9 + TESTQ $(1<<0), R14 + JE skipInput0 + MOVQ 0*24(AX), R9 + LONG $0x487cc162; WORD $0x0410; BYTE $0x09 + +skipInput0: + TESTQ $(1<<1), R14 + JE skipInput1 + MOVQ 1*24(AX), R9 + LONG $0x487cc162; WORD $0x0c10; BYTE $0x09 + +skipInput1: + TESTQ $(1<<2), R14 + JE skipInput2 + MOVQ 2*24(AX), R9 + LONG $0x487cc162; WORD $0x1410; BYTE $0x09 + +skipInput2: + TESTQ $(1<<3), R14 + JE skipInput3 + MOVQ 3*24(AX), R9 + LONG $0x487cc162; WORD $0x1c10; BYTE $0x09 + +skipInput3: + TESTQ $(1<<4), R14 + JE skipInput4 + MOVQ 4*24(AX), R9 + LONG $0x487cc162; WORD $0x2410; BYTE $0x09 + +skipInput4: + TESTQ $(1<<5), R14 + JE skipInput5 + MOVQ 5*24(AX), R9 + LONG $0x487cc162; WORD $0x2c10; BYTE $0x09 + +skipInput5: + TESTQ $(1<<6), R14 + JE skipInput6 + MOVQ 6*24(AX), R9 + LONG $0x487cc162; WORD $0x3410; BYTE $0x09 + +skipInput6: + TESTQ $(1<<7), R14 + JE skipInput7 + MOVQ 7*24(AX), R9 + LONG $0x487cc162; WORD $0x3c10; BYTE $0x09 + +skipInput7: + TESTQ $(1<<8), R14 + JE skipInput8 + MOVQ 8*24(AX), R9 + LONG $0x487c4162; WORD $0x0410; BYTE $0x09 + +skipInput8: + TESTQ $(1<<9), R14 + JE skipInput9 + MOVQ 9*24(AX), R9 + LONG $0x487c4162; WORD $0x0c10; BYTE $0x09 + +skipInput9: + TESTQ $(1<<10), R14 + JE skipInput10 + MOVQ 10*24(AX), R9 + LONG $0x487c4162; WORD $0x1410; BYTE $0x09 + +skipInput10: + TESTQ $(1<<11), R14 + JE skipInput11 + MOVQ 11*24(AX), R9 + LONG $0x487c4162; WORD $0x1c10; BYTE $0x09 + +skipInput11: + TESTQ $(1<<12), R14 + JE skipInput12 + MOVQ 12*24(AX), R9 + LONG $0x487c4162; WORD $0x2410; BYTE $0x09 + +skipInput12: + TESTQ $(1<<13), R14 + JE skipInput13 + MOVQ 13*24(AX), R9 + LONG $0x487c4162; WORD $0x2c10; BYTE $0x09 + +skipInput13: + TESTQ $(1<<14), R14 + JE skipInput14 + MOVQ 14*24(AX), R9 + LONG $0x487c4162; WORD $0x3410; BYTE $0x09 + +skipInput14: + TESTQ $(1<<15), R14 + JE skipInput15 + MOVQ 15*24(AX), R9 + LONG $0x487c4162; WORD $0x3c10; BYTE $0x09 + +skipInput15: +lloop: + LEAQ PSHUFFLE_BYTE_FLIP_MASK<>(SB), DX + LONG $0x487e7162; WORD $0x1a6f + MOVQ table+16(FP), DX + QUAD $0xd162226f487e7162; QUAD $0x7ed16224047f487e; QUAD $0x7ed16201244c7f48; QUAD $0x7ed1620224547f48; QUAD $0x7ed16203245c7f48; QUAD $0x7ed1620424647f48; QUAD $0x7ed16205246c7f48; QUAD $0x7ed1620624747f48; QUAD $0xc1834807247c7f48; QUAD $0x44c9c6407c316240; QUAD $0x62eec1c6407ca162; QUAD $0xa16244d3c6406c31; QUAD $0x34c162eed3c6406c; QUAD $0x407ca162dddac648; QUAD $0xc6407ca16288cac6; QUAD $0xcac648345162ddc2; QUAD $0x44d5c6405ca16288; QUAD $0x62eee5c6405ca162; QUAD $0xa16244d7c6404c31; QUAD $0x6cc162eef7c6404c; QUAD $0x405ca162ddfac640; QUAD $0xc6405ca16288eec6; QUAD $0xd2c6406cc162dde6; QUAD $0x44f1c6403c816288; QUAD $0x62eec1c6403c0162; QUAD $0x016244d3c6402c11; QUAD $0x4c4162eed3c6402c; QUAD $0x403c0162dddac640; QUAD $0xc6403c016288cac6; QUAD $0xf2c6404cc162ddc2; QUAD $0x44d5c6401c016288; QUAD $0x62eee5c6401c0162; QUAD $0x016244d7c6400c11; QUAD $0x2c4162eef7c6400c; QUAD $0x401c0162ddfac640; QUAD $0xc6401c016288eec6; QUAD $0xd2c6402c4162dde6; BYTE $0x88 + LEAQ PSHUFFLE_TRANSPOSE16_MASK1<>(SB), BX + LEAQ PSHUFFLE_TRANSPOSE16_MASK2<>(SB), R8 + QUAD $0x2262336f487e6162; QUAD $0x487e5162f27648b5; QUAD $0xd27648b53262106f; QUAD $0xa262136f487ee162; QUAD $0x487e5162d77640e5; QUAD $0xcf7640e53262086f; QUAD $0xa2621b6f487ee162; QUAD $0x487ec162dd7640f5; QUAD $0xfd7640f5a262386f; QUAD $0xa2620b6f487ee162; QUAD $0x487ec162cc7640fd; QUAD $0xec7640fda262286f; QUAD $0x8262036f487ee162; QUAD $0x487ec162c27640cd; QUAD $0xe27640cd8262206f; QUAD $0x8262336f487ee162; QUAD $0x487e4162f77640a5; QUAD $0xd77640a50262106f; QUAD $0x02621b6f487e6162; QUAD $0x487e4162dd7640b5; QUAD $0xfd7640b50262386f; QUAD $0x02620b6f487e6162; QUAD $0x487e4162cc7640bd; QUAD $0xec7640bd0262286f; QUAD $0x62eec023408d2362; QUAD $0x236244c023408da3; QUAD $0xada362eee42348ad; QUAD $0x40c5036244e42348; QUAD $0x2340c51362eef723; QUAD $0xfd2340d5036244d7; QUAD $0x44fd2340d58362ee; QUAD $0x62eeea2348b50362; QUAD $0x036244ea2348b583; QUAD $0xe51362eed32340e5; QUAD $0x40f5036244cb2340; QUAD $0x2340f58362eed923; QUAD $0xce2340ed236244d9; QUAD $0x44ce2340eda362ee; QUAD $0xc162d16f487ec162; QUAD $0x407dc262f26f487e; QUAD $0xcb004075c262c300; QUAD $0xc262d300406dc262; QUAD $0x405dc262db004065; QUAD $0xeb004055c262e300; QUAD $0xc262f300404dc262; QUAD $0x403d4262fb004045; QUAD $0xcb0040354262c300; QUAD $0x4262d300402d4262; QUAD $0x401d4262db004025; QUAD $0xeb0040154262e300; QUAD $0x4262f300400d4262; QUAD $0x48455162fb004005; QUAD $0xcc6f487e7162c4fe; QUAD $0x6206c472482df162; QUAD $0xf1620bc4724825f1; QUAD $0x55736219c472481d; QUAD $0x483d3162cace2548; QUAD $0xd42548255362c0fe; QUAD $0x62c1fe483d516296; QUAD $0x65d162c2fe483d51; QUAD $0x724845f162d8fe48; QUAD $0xc0724825f16202c0; QUAD $0x16c072481df1620d; QUAD $0x7362c86f487e7162; QUAD $0x25d362e8ca254875; QUAD $0x4845d16296fc2548; QUAD $0xf8fe4845d162f9fe; QUAD $0x6201626f487e7162; QUAD $0x916211c672481591; QUAD $0x05916213c672480d; QUAD $0x480d53620ad67248; QUAD $0xfe407dc16296ef25; QUAD $0x62c1fe407d8162c5; QUAD $0xb16207c1724815b1; QUAD $0x05b16212c172480d; QUAD $0x480d536203d17248; QUAD $0xfe407dc16296ef25; QUAD $0x62c4fe484d5162c5; QUAD $0x2df162cb6f487e71; QUAD $0x4825f16206c37248; QUAD $0x72481df1620bc372; QUAD $0xcd25485d736219c3; QUAD $0x62c1fe483d3162ca; QUAD $0x516296d425482553; QUAD $0x483d5162c1fe483d; QUAD $0xd0fe486dd162c2fe; QUAD $0x6202c772484df162; QUAD $0xf1620dc7724825f1; QUAD $0x7e716216c772481d; QUAD $0x25487d7362cf6f48; QUAD $0xf4254825d362e8c9; QUAD $0x62f1fe484dd16296; QUAD $0x7e7162f0fe484dd1; QUAD $0x4815916202626f48; QUAD $0x72480d916211c772; QUAD $0xd7724805916213c7; QUAD $0x96ef25480d53620a; QUAD $0x8162cdfe4075c162; QUAD $0x4815b162cafe4075; QUAD $0x72480db16207c272; QUAD $0xd2724805b16212c2; QUAD $0x96ef25480d536203; QUAD $0x5162cdfe4075c162; QUAD $0x487e7162c4fe4855; QUAD $0xc272482df162ca6f; QUAD $0x0bc2724825f16206; QUAD $0x6219c272481df162; QUAD $0x3162cacc25486573; QUAD $0x48255362c2fe483d; QUAD $0xfe483d516296d425; QUAD $0x62c2fe483d5162c1; QUAD $0x55f162c8fe4875d1; QUAD $0x4825f16202c67248; QUAD $0x72481df1620dc672; QUAD $0xce6f487e716216c6; QUAD $0x62e8c82548457362; QUAD $0xd16296ec254825d3; QUAD $0x4855d162e9fe4855; QUAD $0x626f487e7162e8fe; QUAD $0x11c0724815b16203; QUAD $0x6213c072480db162; QUAD $0x53620ad0724805b1; QUAD $0x6dc16296ef25480d; QUAD $0xfe406d8162d5fe40; QUAD $0x07c3724815b162d3; QUAD $0x6212c372480db162; QUAD $0x536203d3724805b1; QUAD $0x6dc16296ef25480d; QUAD $0xfe485d5162d5fe40; QUAD $0x62c96f487e7162c4; QUAD $0xf16206c172482df1; QUAD $0x1df1620bc1724825; QUAD $0x486d736219c17248; QUAD $0xfe483d3162cacb25; QUAD $0x96d42548255362c3; QUAD $0x5162c1fe483d5162; QUAD $0x487dd162c2fe483d; QUAD $0xc572485df162c0fe; QUAD $0x0dc5724825f16202; QUAD $0x6216c572481df162; QUAD $0x4d7362cd6f487e71; QUAD $0x4825d362e8cf2548; QUAD $0xfe485dd16296e425; QUAD $0x62e0fe485dd162e1; QUAD $0xb16204626f487e71; QUAD $0x0db16211c1724815; QUAD $0x4805b16213c17248; QUAD $0x25480d53620ad172; QUAD $0xddfe4065c16296ef; QUAD $0xb162dcfe40658162; QUAD $0x0db16207c4724815; QUAD $0x4805b16212c47248; QUAD $0x25480d536203d472; QUAD $0xddfe4065c16296ef; QUAD $0x7162c4fe48655162; QUAD $0x482df162c86f487e; QUAD $0x724825f16206c072; QUAD $0xc072481df1620bc0; QUAD $0xcaca254875736219; QUAD $0x5362c4fe483d3162; QUAD $0x3d516296d4254825; QUAD $0xfe483d5162c1fe48; QUAD $0x62f8fe4845d162c2; QUAD $0xf16202c4724865f1; QUAD $0x1df1620dc4724825; QUAD $0x487e716216c47248; QUAD $0xce2548557362cc6f; QUAD $0x96dc254825d362e8; QUAD $0xd162d9fe4865d162; QUAD $0x487e7162d8fe4865; QUAD $0x724815b16205626f; QUAD $0xc272480db16211c2; QUAD $0x0ad2724805b16213; QUAD $0x6296ef25480d5362; QUAD $0x5d8162e5fe405dc1; QUAD $0x724815b162e5fe40; QUAD $0xc572480db16207c5; QUAD $0x03d5724805b16212; QUAD $0x6296ef25480d5362; QUAD $0x6d5162e5fe405dc1; QUAD $0x6f487e7162c4fe48; QUAD $0x06c772482df162cf; QUAD $0x620bc7724825f162; QUAD $0x736219c772481df1; QUAD $0x3d3162cac925487d; QUAD $0x2548255362c5fe48; QUAD $0xc1fe483d516296d4; QUAD $0xd162c2fe483d5162; QUAD $0x486df162f0fe484d; QUAD $0x724825f16202c372; QUAD $0xc372481df1620dc3; QUAD $0x62cb6f487e716216; QUAD $0xd362e8cd25485d73; QUAD $0x6dd16296d4254825; QUAD $0xfe486dd162d1fe48; QUAD $0x06626f487e7162d0; QUAD $0x6211c3724815b162; QUAD $0xb16213c372480db1; QUAD $0x0d53620ad3724805; QUAD $0x4055c16296ef2548; QUAD $0xeefe40558162edfe; QUAD $0x6207c6724815b162; QUAD $0xb16212c672480db1; QUAD $0x0d536203d6724805; QUAD $0x4055c16296ef2548; QUAD $0xc4fe48755162edfe; QUAD $0xf162ce6f487e7162; QUAD $0x25f16206c672482d; QUAD $0x481df1620bc67248; QUAD $0x254845736219c672; QUAD $0xc6fe483d3162cac8; QUAD $0x6296d42548255362; QUAD $0x3d5162c1fe483d51; QUAD $0xfe4855d162c2fe48; QUAD $0x02c2724875f162e8; QUAD $0x620dc2724825f162; QUAD $0x716216c272481df1; QUAD $0x48657362ca6f487e; QUAD $0x254825d362e8cc25; QUAD $0xc9fe4875d16296cc; QUAD $0x7162c8fe4875d162; QUAD $0x15b16207626f487e; QUAD $0x480db16211c47248; QUAD $0x724805b16213c472; QUAD $0xef25480d53620ad4; QUAD $0x62f5fe404dc16296; QUAD $0x15b162f7fe404d81; QUAD $0x480db16207c77248; QUAD $0x724805b16212c772; QUAD $0xef25480d536203d7; QUAD $0x62f5fe404dc16296; QUAD $0x7e7162c4fe487d51; QUAD $0x72482df162cd6f48; QUAD $0xc5724825f16206c5; QUAD $0x19c572481df1620b; QUAD $0x62cacf25484d7362; QUAD $0x255362c7fe483d31; QUAD $0x483d516296d42548; QUAD $0xc2fe483d5162c1fe; QUAD $0xf162e0fe485dd162; QUAD $0x25f16202c172487d; QUAD $0x481df1620dc17248; QUAD $0x6f487e716216c172; QUAD $0xe8cb25486d7362c9; QUAD $0x6296c4254825d362; QUAD $0x7dd162c1fe487dd1; QUAD $0x6f487e7162c0fe48; QUAD $0xc5724815b1620862; QUAD $0x13c572480db16211; QUAD $0x620ad5724805b162; QUAD $0xc16296ef25480d53; QUAD $0x4045a162fdfe4045; QUAD $0xc07248159162f8fe; QUAD $0x12c072480d916207; QUAD $0x6203d07248059162; QUAD $0xc16296ef25480d53; QUAD $0x48455162fdfe4045; QUAD $0xcc6f487e7162c4fe; QUAD $0x6206c472482df162; QUAD $0xf1620bc4724825f1; QUAD $0x55736219c472481d; QUAD $0x483d1162cace2548; QUAD $0xd42548255362c0fe; QUAD $0x62c1fe483d516296; QUAD $0x65d162c2fe483d51; QUAD $0x724845f162d8fe48; QUAD $0xc0724825f16202c0; QUAD $0x16c072481df1620d; QUAD $0x7362c86f487e7162; QUAD $0x25d362e8ca254875; QUAD $0x4845d16296fc2548; QUAD $0xf8fe4845d162f9fe; QUAD $0x6209626f487e7162; QUAD $0xb16211c6724815b1; QUAD $0x05b16213c672480d; QUAD $0x480d53620ad67248; QUAD $0xfe403d416296ef25; QUAD $0x62c1fe403d2162c5; QUAD $0x916207c172481591; QUAD $0x05916212c172480d; QUAD $0x480d536203d17248; QUAD $0xfe403d416296ef25; QUAD $0x62c4fe484d5162c5; QUAD $0x2df162cb6f487e71; QUAD $0x4825f16206c37248; QUAD $0x72481df1620bc372; QUAD $0xcd25485d736219c3; QUAD $0x62c1fe483d1162ca; QUAD $0x516296d425482553; QUAD $0x483d5162c1fe483d; QUAD $0xd0fe486dd162c2fe; QUAD $0x6202c772484df162; QUAD $0xf1620dc7724825f1; QUAD $0x7e716216c772481d; QUAD $0x25487d7362cf6f48; QUAD $0xf4254825d362e8c9; QUAD $0x62f1fe484dd16296; QUAD $0x7e7162f0fe484dd1; QUAD $0x4815b1620a626f48; QUAD $0x72480db16211c772; QUAD $0xd7724805b16213c7; QUAD $0x96ef25480d53620a; QUAD $0x2162cdfe40354162; QUAD $0x48159162cafe4035; QUAD $0x72480d916207c272; QUAD $0xd2724805916212c2; QUAD $0x96ef25480d536203; QUAD $0x5162cdfe40354162; QUAD $0x487e7162c4fe4855; QUAD $0xc272482df162ca6f; QUAD $0x0bc2724825f16206; QUAD $0x6219c272481df162; QUAD $0x1162cacc25486573; QUAD $0x48255362c2fe483d; QUAD $0xfe483d516296d425; QUAD $0x62c2fe483d5162c1; QUAD $0x55f162c8fe4875d1; QUAD $0x4825f16202c67248; QUAD $0x72481df1620dc672; QUAD $0xce6f487e716216c6; QUAD $0x62e8c82548457362; QUAD $0xd16296ec254825d3; QUAD $0x4855d162e9fe4855; QUAD $0x626f487e7162e8fe; QUAD $0x11c072481591620b; QUAD $0x6213c072480d9162; QUAD $0x53620ad072480591; QUAD $0x2d416296ef25480d; QUAD $0xfe402d2162d5fe40; QUAD $0x07c37248159162d3; QUAD $0x6212c372480d9162; QUAD $0x536203d372480591; QUAD $0x2d416296ef25480d; QUAD $0xfe485d5162d5fe40; QUAD $0x62c96f487e7162c4; QUAD $0xf16206c172482df1; QUAD $0x1df1620bc1724825; QUAD $0x486d736219c17248; QUAD $0xfe483d1162cacb25; QUAD $0x96d42548255362c3; QUAD $0x5162c1fe483d5162; QUAD $0x487dd162c2fe483d; QUAD $0xc572485df162c0fe; QUAD $0x0dc5724825f16202; QUAD $0x6216c572481df162; QUAD $0x4d7362cd6f487e71; QUAD $0x4825d362e8cf2548; QUAD $0xfe485dd16296e425; QUAD $0x62e0fe485dd162e1; QUAD $0x91620c626f487e71; QUAD $0x0d916211c1724815; QUAD $0x4805916213c17248; QUAD $0x25480d53620ad172; QUAD $0xddfe4025416296ef; QUAD $0x9162dcfe40252162; QUAD $0x0d916207c4724815; QUAD $0x4805916212c47248; QUAD $0x25480d536203d472; QUAD $0xddfe4025416296ef; QUAD $0x7162c4fe48655162; QUAD $0x482df162c86f487e; QUAD $0x724825f16206c072; QUAD $0xc072481df1620bc0; QUAD $0xcaca254875736219; QUAD $0x5362c4fe483d1162; QUAD $0x3d516296d4254825; QUAD $0xfe483d5162c1fe48; QUAD $0x62f8fe4845d162c2; QUAD $0xf16202c4724865f1; QUAD $0x1df1620dc4724825; QUAD $0x487e716216c47248; QUAD $0xce2548557362cc6f; QUAD $0x96dc254825d362e8; QUAD $0xd162d9fe4865d162; QUAD $0x487e7162d8fe4865; QUAD $0x72481591620d626f; QUAD $0xc272480d916211c2; QUAD $0x0ad2724805916213; QUAD $0x6296ef25480d5362; QUAD $0x1d2162e5fe401d41; QUAD $0x7248159162e5fe40; QUAD $0xc572480d916207c5; QUAD $0x03d5724805916212; QUAD $0x6296ef25480d5362; QUAD $0x6d5162e5fe401d41; QUAD $0x6f487e7162c4fe48; QUAD $0x06c772482df162cf; QUAD $0x620bc7724825f162; QUAD $0x736219c772481df1; QUAD $0x3d1162cac925487d; QUAD $0x2548255362c5fe48; QUAD $0xc1fe483d516296d4; QUAD $0xd162c2fe483d5162; QUAD $0x486df162f0fe484d; QUAD $0x724825f16202c372; QUAD $0xc372481df1620dc3; QUAD $0x62cb6f487e716216; QUAD $0xd362e8cd25485d73; QUAD $0x6dd16296d4254825; QUAD $0xfe486dd162d1fe48; QUAD $0x0e626f487e7162d0; QUAD $0x6211c37248159162; QUAD $0x916213c372480d91; QUAD $0x0d53620ad3724805; QUAD $0x4015416296ef2548; QUAD $0xeefe40152162edfe; QUAD $0x6207c67248159162; QUAD $0x916212c672480d91; QUAD $0x0d536203d6724805; QUAD $0x4015416296ef2548; QUAD $0xc4fe48755162edfe; QUAD $0xf162ce6f487e7162; QUAD $0x25f16206c672482d; QUAD $0x481df1620bc67248; QUAD $0x254845736219c672; QUAD $0xc6fe483d1162cac8; QUAD $0x6296d42548255362; QUAD $0x3d5162c1fe483d51; QUAD $0xfe4855d162c2fe48; QUAD $0x02c2724875f162e8; QUAD $0x620dc2724825f162; QUAD $0x716216c272481df1; QUAD $0x48657362ca6f487e; QUAD $0x254825d362e8cc25; QUAD $0xc9fe4875d16296cc; QUAD $0x7162c8fe4875d162; QUAD $0x1591620f626f487e; QUAD $0x480d916211c47248; QUAD $0x724805916213c472; QUAD $0xef25480d53620ad4; QUAD $0x62f5fe400d416296; QUAD $0x159162f7fe400d21; QUAD $0x480d916207c77248; QUAD $0x724805916212c772; QUAD $0xef25480d536203d7; QUAD $0x62f5fe400d416296; QUAD $0x7e7162c4fe487d51; QUAD $0x72482df162cd6f48; QUAD $0xc5724825f16206c5; QUAD $0x19c572481df1620b; QUAD $0x62cacf25484d7362; QUAD $0x255362c7fe483d11; QUAD $0x483d516296d42548; QUAD $0xc2fe483d5162c1fe; QUAD $0xf162e0fe485dd162; QUAD $0x25f16202c172487d; QUAD $0x481df1620dc17248; QUAD $0x6f487e716216c172; QUAD $0xe8cb25486d7362c9; QUAD $0x6296c4254825d362; QUAD $0x7dd162c1fe487dd1; QUAD $0x6f487e7162c0fe48; QUAD $0xc572481591621062; QUAD $0x13c572480d916211; QUAD $0x620ad57248059162; QUAD $0x416296ef25480d53; QUAD $0x40050162fdfe4005; QUAD $0xc0724815b162f8fe; QUAD $0x12c072480db16207; QUAD $0x6203d0724805b162; QUAD $0x416296ef25480d53; QUAD $0x48455162fdfe4005; QUAD $0xcc6f487e7162c4fe; QUAD $0x6206c472482df162; QUAD $0xf1620bc4724825f1; QUAD $0x55736219c472481d; QUAD $0x483d3162cace2548; QUAD $0xd42548255362c0fe; QUAD $0x62c1fe483d516296; QUAD $0x65d162c2fe483d51; QUAD $0x724845f162d8fe48; QUAD $0xc0724825f16202c0; QUAD $0x16c072481df1620d; QUAD $0x7362c86f487e7162; QUAD $0x25d362e8ca254875; QUAD $0x4845d16296fc2548; QUAD $0xf8fe4845d162f9fe; QUAD $0x6211626f487e7162; QUAD $0x916211c672481591; QUAD $0x05916213c672480d; QUAD $0x480d53620ad67248; QUAD $0xfe407dc16296ef25; QUAD $0x62c1fe407d8162c5; QUAD $0xb16207c1724815b1; QUAD $0x05b16212c172480d; QUAD $0x480d536203d17248; QUAD $0xfe407dc16296ef25; QUAD $0x62c4fe484d5162c5; QUAD $0x2df162cb6f487e71; QUAD $0x4825f16206c37248; QUAD $0x72481df1620bc372; QUAD $0xcd25485d736219c3; QUAD $0x62c1fe483d3162ca; QUAD $0x516296d425482553; QUAD $0x483d5162c1fe483d; QUAD $0xd0fe486dd162c2fe; QUAD $0x6202c772484df162; QUAD $0xf1620dc7724825f1; QUAD $0x7e716216c772481d; QUAD $0x25487d7362cf6f48; QUAD $0xf4254825d362e8c9; QUAD $0x62f1fe484dd16296; QUAD $0x7e7162f0fe484dd1; QUAD $0x4815916212626f48; QUAD $0x72480d916211c772; QUAD $0xd7724805916213c7; QUAD $0x96ef25480d53620a; QUAD $0x8162cdfe4075c162; QUAD $0x4815b162cafe4075; QUAD $0x72480db16207c272; QUAD $0xd2724805b16212c2; QUAD $0x96ef25480d536203; QUAD $0x5162cdfe4075c162; QUAD $0x487e7162c4fe4855; QUAD $0xc272482df162ca6f; QUAD $0x0bc2724825f16206; QUAD $0x6219c272481df162; QUAD $0x3162cacc25486573; QUAD $0x48255362c2fe483d; QUAD $0xfe483d516296d425; QUAD $0x62c2fe483d5162c1; QUAD $0x55f162c8fe4875d1; QUAD $0x4825f16202c67248; QUAD $0x72481df1620dc672; QUAD $0xce6f487e716216c6; QUAD $0x62e8c82548457362; QUAD $0xd16296ec254825d3; QUAD $0x4855d162e9fe4855; QUAD $0x626f487e7162e8fe; QUAD $0x11c0724815b16213; QUAD $0x6213c072480db162; QUAD $0x53620ad0724805b1; QUAD $0x6dc16296ef25480d; QUAD $0xfe406d8162d5fe40; QUAD $0x07c3724815b162d3; QUAD $0x6212c372480db162; QUAD $0x536203d3724805b1; QUAD $0x6dc16296ef25480d; QUAD $0xfe485d5162d5fe40; QUAD $0x62c96f487e7162c4; QUAD $0xf16206c172482df1; QUAD $0x1df1620bc1724825; QUAD $0x486d736219c17248; QUAD $0xfe483d3162cacb25; QUAD $0x96d42548255362c3; QUAD $0x5162c1fe483d5162; QUAD $0x487dd162c2fe483d; QUAD $0xc572485df162c0fe; QUAD $0x0dc5724825f16202; QUAD $0x6216c572481df162; QUAD $0x4d7362cd6f487e71; QUAD $0x4825d362e8cf2548; QUAD $0xfe485dd16296e425; QUAD $0x62e0fe485dd162e1; QUAD $0xb16214626f487e71; QUAD $0x0db16211c1724815; QUAD $0x4805b16213c17248; QUAD $0x25480d53620ad172; QUAD $0xddfe4065c16296ef; QUAD $0xb162dcfe40658162; QUAD $0x0db16207c4724815; QUAD $0x4805b16212c47248; QUAD $0x25480d536203d472; QUAD $0xddfe4065c16296ef; QUAD $0x7162c4fe48655162; QUAD $0x482df162c86f487e; QUAD $0x724825f16206c072; QUAD $0xc072481df1620bc0; QUAD $0xcaca254875736219; QUAD $0x5362c4fe483d3162; QUAD $0x3d516296d4254825; QUAD $0xfe483d5162c1fe48; QUAD $0x62f8fe4845d162c2; QUAD $0xf16202c4724865f1; QUAD $0x1df1620dc4724825; QUAD $0x487e716216c47248; QUAD $0xce2548557362cc6f; QUAD $0x96dc254825d362e8; QUAD $0xd162d9fe4865d162; QUAD $0x487e7162d8fe4865; QUAD $0x724815b16215626f; QUAD $0xc272480db16211c2; QUAD $0x0ad2724805b16213; QUAD $0x6296ef25480d5362; QUAD $0x5d8162e5fe405dc1; QUAD $0x724815b162e5fe40; QUAD $0xc572480db16207c5; QUAD $0x03d5724805b16212; QUAD $0x6296ef25480d5362; QUAD $0x6d5162e5fe405dc1; QUAD $0x6f487e7162c4fe48; QUAD $0x06c772482df162cf; QUAD $0x620bc7724825f162; QUAD $0x736219c772481df1; QUAD $0x3d3162cac925487d; QUAD $0x2548255362c5fe48; QUAD $0xc1fe483d516296d4; QUAD $0xd162c2fe483d5162; QUAD $0x486df162f0fe484d; QUAD $0x724825f16202c372; QUAD $0xc372481df1620dc3; QUAD $0x62cb6f487e716216; QUAD $0xd362e8cd25485d73; QUAD $0x6dd16296d4254825; QUAD $0xfe486dd162d1fe48; QUAD $0x16626f487e7162d0; QUAD $0x6211c3724815b162; QUAD $0xb16213c372480db1; QUAD $0x0d53620ad3724805; QUAD $0x4055c16296ef2548; QUAD $0xeefe40558162edfe; QUAD $0x6207c6724815b162; QUAD $0xb16212c672480db1; QUAD $0x0d536203d6724805; QUAD $0x4055c16296ef2548; QUAD $0xc4fe48755162edfe; QUAD $0xf162ce6f487e7162; QUAD $0x25f16206c672482d; QUAD $0x481df1620bc67248; QUAD $0x254845736219c672; QUAD $0xc6fe483d3162cac8; QUAD $0x6296d42548255362; QUAD $0x3d5162c1fe483d51; QUAD $0xfe4855d162c2fe48; QUAD $0x02c2724875f162e8; QUAD $0x620dc2724825f162; QUAD $0x716216c272481df1; QUAD $0x48657362ca6f487e; QUAD $0x254825d362e8cc25; QUAD $0xc9fe4875d16296cc; QUAD $0x7162c8fe4875d162; QUAD $0x15b16217626f487e; QUAD $0x480db16211c47248; QUAD $0x724805b16213c472; QUAD $0xef25480d53620ad4; QUAD $0x62f5fe404dc16296; QUAD $0x15b162f7fe404d81; QUAD $0x480db16207c77248; QUAD $0x724805b16212c772; QUAD $0xef25480d536203d7; QUAD $0x62f5fe404dc16296; QUAD $0x7e7162c4fe487d51; QUAD $0x72482df162cd6f48; QUAD $0xc5724825f16206c5; QUAD $0x19c572481df1620b; QUAD $0x62cacf25484d7362; QUAD $0x255362c7fe483d31; QUAD $0x483d516296d42548; QUAD $0xc2fe483d5162c1fe; QUAD $0xf162e0fe485dd162; QUAD $0x25f16202c172487d; QUAD $0x481df1620dc17248; QUAD $0x6f487e716216c172; QUAD $0xe8cb25486d7362c9; QUAD $0x6296c4254825d362; QUAD $0x7dd162c1fe487dd1; QUAD $0x6f487e7162c0fe48; QUAD $0xc5724815b1621862; QUAD $0x13c572480db16211; QUAD $0x620ad5724805b162; QUAD $0xc16296ef25480d53; QUAD $0x4045a162fdfe4045; QUAD $0xc07248159162f8fe; QUAD $0x12c072480d916207; QUAD $0x6203d07248059162; QUAD $0xc16296ef25480d53; QUAD $0x48455162fdfe4045; QUAD $0xcc6f487e7162c4fe; QUAD $0x6206c472482df162; QUAD $0xf1620bc4724825f1; QUAD $0x55736219c472481d; QUAD $0x483d1162cace2548; QUAD $0xd42548255362c0fe; QUAD $0x62c1fe483d516296; QUAD $0x65d162c2fe483d51; QUAD $0x724845f162d8fe48; QUAD $0xc0724825f16202c0; QUAD $0x16c072481df1620d; QUAD $0x7362c86f487e7162; QUAD $0x25d362e8ca254875; QUAD $0x4845d16296fc2548; QUAD $0xf8fe4845d162f9fe; QUAD $0x6219626f487e7162; QUAD $0xb16211c6724815b1; QUAD $0x05b16213c672480d; QUAD $0x480d53620ad67248; QUAD $0xfe403d416296ef25; QUAD $0x62c1fe403d2162c5; QUAD $0x916207c172481591; QUAD $0x05916212c172480d; QUAD $0x480d536203d17248; QUAD $0xfe403d416296ef25; QUAD $0x62c4fe484d5162c5; QUAD $0x2df162cb6f487e71; QUAD $0x4825f16206c37248; QUAD $0x72481df1620bc372; QUAD $0xcd25485d736219c3; QUAD $0x62c1fe483d1162ca; QUAD $0x516296d425482553; QUAD $0x483d5162c1fe483d; QUAD $0xd0fe486dd162c2fe; QUAD $0x6202c772484df162; QUAD $0xf1620dc7724825f1; QUAD $0x7e716216c772481d; QUAD $0x25487d7362cf6f48; QUAD $0xf4254825d362e8c9; QUAD $0x62f1fe484dd16296; QUAD $0x7e7162f0fe484dd1; QUAD $0x4815b1621a626f48; QUAD $0x72480db16211c772; QUAD $0xd7724805b16213c7; QUAD $0x96ef25480d53620a; QUAD $0x2162cdfe40354162; QUAD $0x48159162cafe4035; QUAD $0x72480d916207c272; QUAD $0xd2724805916212c2; QUAD $0x96ef25480d536203; QUAD $0x5162cdfe40354162; QUAD $0x487e7162c4fe4855; QUAD $0xc272482df162ca6f; QUAD $0x0bc2724825f16206; QUAD $0x6219c272481df162; QUAD $0x1162cacc25486573; QUAD $0x48255362c2fe483d; QUAD $0xfe483d516296d425; QUAD $0x62c2fe483d5162c1; QUAD $0x55f162c8fe4875d1; QUAD $0x4825f16202c67248; QUAD $0x72481df1620dc672; QUAD $0xce6f487e716216c6; QUAD $0x62e8c82548457362; QUAD $0xd16296ec254825d3; QUAD $0x4855d162e9fe4855; QUAD $0x626f487e7162e8fe; QUAD $0x11c072481591621b; QUAD $0x6213c072480d9162; QUAD $0x53620ad072480591; QUAD $0x2d416296ef25480d; QUAD $0xfe402d2162d5fe40; QUAD $0x07c37248159162d3; QUAD $0x6212c372480d9162; QUAD $0x536203d372480591; QUAD $0x2d416296ef25480d; QUAD $0xfe485d5162d5fe40; QUAD $0x62c96f487e7162c4; QUAD $0xf16206c172482df1; QUAD $0x1df1620bc1724825; QUAD $0x486d736219c17248; QUAD $0xfe483d1162cacb25; QUAD $0x96d42548255362c3; QUAD $0x5162c1fe483d5162; QUAD $0x487dd162c2fe483d; QUAD $0xc572485df162c0fe; QUAD $0x0dc5724825f16202; QUAD $0x6216c572481df162; QUAD $0x4d7362cd6f487e71; QUAD $0x4825d362e8cf2548; QUAD $0xfe485dd16296e425; QUAD $0x62e0fe485dd162e1; QUAD $0x91621c626f487e71; QUAD $0x0d916211c1724815; QUAD $0x4805916213c17248; QUAD $0x25480d53620ad172; QUAD $0xddfe4025416296ef; QUAD $0x9162dcfe40252162; QUAD $0x0d916207c4724815; QUAD $0x4805916212c47248; QUAD $0x25480d536203d472; QUAD $0xddfe4025416296ef; QUAD $0x7162c4fe48655162; QUAD $0x482df162c86f487e; QUAD $0x724825f16206c072; QUAD $0xc072481df1620bc0; QUAD $0xcaca254875736219; QUAD $0x5362c4fe483d1162; QUAD $0x3d516296d4254825; QUAD $0xfe483d5162c1fe48; QUAD $0x62f8fe4845d162c2; QUAD $0xf16202c4724865f1; QUAD $0x1df1620dc4724825; QUAD $0x487e716216c47248; QUAD $0xce2548557362cc6f; QUAD $0x96dc254825d362e8; QUAD $0xd162d9fe4865d162; QUAD $0x487e7162d8fe4865; QUAD $0x72481591621d626f; QUAD $0xc272480d916211c2; QUAD $0x0ad2724805916213; QUAD $0x6296ef25480d5362; QUAD $0x1d2162e5fe401d41; QUAD $0x7248159162e5fe40; QUAD $0xc572480d916207c5; QUAD $0x03d5724805916212; QUAD $0x6296ef25480d5362; QUAD $0x6d5162e5fe401d41; QUAD $0x6f487e7162c4fe48; QUAD $0x06c772482df162cf; QUAD $0x620bc7724825f162; QUAD $0x736219c772481df1; QUAD $0x3d1162cac925487d; QUAD $0x2548255362c5fe48; QUAD $0xc1fe483d516296d4; QUAD $0xd162c2fe483d5162; QUAD $0x486df162f0fe484d; QUAD $0x724825f16202c372; QUAD $0xc372481df1620dc3; QUAD $0x62cb6f487e716216; QUAD $0xd362e8cd25485d73; QUAD $0x6dd16296d4254825; QUAD $0xfe486dd162d1fe48; QUAD $0x1e626f487e7162d0; QUAD $0x6211c37248159162; QUAD $0x916213c372480d91; QUAD $0x0d53620ad3724805; QUAD $0x4015416296ef2548; QUAD $0xeefe40152162edfe; QUAD $0x6207c67248159162; QUAD $0x916212c672480d91; QUAD $0x0d536203d6724805; QUAD $0x4015416296ef2548; QUAD $0xc4fe48755162edfe; QUAD $0xf162ce6f487e7162; QUAD $0x25f16206c672482d; QUAD $0x481df1620bc67248; QUAD $0x254845736219c672; QUAD $0xc6fe483d1162cac8; QUAD $0x6296d42548255362; QUAD $0x3d5162c1fe483d51; QUAD $0xfe4855d162c2fe48; QUAD $0x02c2724875f162e8; QUAD $0x620dc2724825f162; QUAD $0x716216c272481df1; QUAD $0x48657362ca6f487e; QUAD $0x254825d362e8cc25; QUAD $0xc9fe4875d16296cc; QUAD $0x7162c8fe4875d162; QUAD $0x1591621f626f487e; QUAD $0x480d916211c47248; QUAD $0x724805916213c472; QUAD $0xef25480d53620ad4; QUAD $0x62f5fe400d416296; QUAD $0x159162f7fe400d21; QUAD $0x480d916207c77248; QUAD $0x724805916212c772; QUAD $0xef25480d536203d7; QUAD $0x62f5fe400d416296; QUAD $0x7e7162c4fe487d51; QUAD $0x72482df162cd6f48; QUAD $0xc5724825f16206c5; QUAD $0x19c572481df1620b; QUAD $0x62cacf25484d7362; QUAD $0x255362c7fe483d11; QUAD $0x483d516296d42548; QUAD $0xc2fe483d5162c1fe; QUAD $0xf162e0fe485dd162; QUAD $0x25f16202c172487d; QUAD $0x481df1620dc17248; QUAD $0x6f487e716216c172; QUAD $0xe8cb25486d7362c9; QUAD $0x6296c4254825d362; QUAD $0x7dd162c1fe487dd1; QUAD $0x6f487e7162c0fe48; QUAD $0xc572481591622062; QUAD $0x13c572480d916211; QUAD $0x620ad57248059162; QUAD $0x416296ef25480d53; QUAD $0x40050162fdfe4005; QUAD $0xc0724815b162f8fe; QUAD $0x12c072480db16207; QUAD $0x6203d0724805b162; QUAD $0x416296ef25480d53; QUAD $0x48455162fdfe4005; QUAD $0xcc6f487e7162c4fe; QUAD $0x6206c472482df162; QUAD $0xf1620bc4724825f1; QUAD $0x55736219c472481d; QUAD $0x483d3162cace2548; QUAD $0xd42548255362c0fe; QUAD $0x62c1fe483d516296; QUAD $0x65d162c2fe483d51; QUAD $0x724845f162d8fe48; QUAD $0xc0724825f16202c0; QUAD $0x16c072481df1620d; QUAD $0x7362c86f487e7162; QUAD $0x25d362e8ca254875; QUAD $0x4845d16296fc2548; QUAD $0xf8fe4845d162f9fe; QUAD $0x6221626f487e7162; QUAD $0x916211c672481591; QUAD $0x05916213c672480d; QUAD $0x480d53620ad67248; QUAD $0xfe407dc16296ef25; QUAD $0x62c1fe407d8162c5; QUAD $0xb16207c1724815b1; QUAD $0x05b16212c172480d; QUAD $0x480d536203d17248; QUAD $0xfe407dc16296ef25; QUAD $0x62c4fe484d5162c5; QUAD $0x2df162cb6f487e71; QUAD $0x4825f16206c37248; QUAD $0x72481df1620bc372; QUAD $0xcd25485d736219c3; QUAD $0x62c1fe483d3162ca; QUAD $0x516296d425482553; QUAD $0x483d5162c1fe483d; QUAD $0xd0fe486dd162c2fe; QUAD $0x6202c772484df162; QUAD $0xf1620dc7724825f1; QUAD $0x7e716216c772481d; QUAD $0x25487d7362cf6f48; QUAD $0xf4254825d362e8c9; QUAD $0x62f1fe484dd16296; QUAD $0x7e7162f0fe484dd1; QUAD $0x4815916222626f48; QUAD $0x72480d916211c772; QUAD $0xd7724805916213c7; QUAD $0x96ef25480d53620a; QUAD $0x8162cdfe4075c162; QUAD $0x4815b162cafe4075; QUAD $0x72480db16207c272; QUAD $0xd2724805b16212c2; QUAD $0x96ef25480d536203; QUAD $0x5162cdfe4075c162; QUAD $0x487e7162c4fe4855; QUAD $0xc272482df162ca6f; QUAD $0x0bc2724825f16206; QUAD $0x6219c272481df162; QUAD $0x3162cacc25486573; QUAD $0x48255362c2fe483d; QUAD $0xfe483d516296d425; QUAD $0x62c2fe483d5162c1; QUAD $0x55f162c8fe4875d1; QUAD $0x4825f16202c67248; QUAD $0x72481df1620dc672; QUAD $0xce6f487e716216c6; QUAD $0x62e8c82548457362; QUAD $0xd16296ec254825d3; QUAD $0x4855d162e9fe4855; QUAD $0x626f487e7162e8fe; QUAD $0x11c0724815b16223; QUAD $0x6213c072480db162; QUAD $0x53620ad0724805b1; QUAD $0x6dc16296ef25480d; QUAD $0xfe406d8162d5fe40; QUAD $0x07c3724815b162d3; QUAD $0x6212c372480db162; QUAD $0x536203d3724805b1; QUAD $0x6dc16296ef25480d; QUAD $0xfe485d5162d5fe40; QUAD $0x62c96f487e7162c4; QUAD $0xf16206c172482df1; QUAD $0x1df1620bc1724825; QUAD $0x486d736219c17248; QUAD $0xfe483d3162cacb25; QUAD $0x96d42548255362c3; QUAD $0x5162c1fe483d5162; QUAD $0x487dd162c2fe483d; QUAD $0xc572485df162c0fe; QUAD $0x0dc5724825f16202; QUAD $0x6216c572481df162; QUAD $0x4d7362cd6f487e71; QUAD $0x4825d362e8cf2548; QUAD $0xfe485dd16296e425; QUAD $0x62e0fe485dd162e1; QUAD $0xb16224626f487e71; QUAD $0x0db16211c1724815; QUAD $0x4805b16213c17248; QUAD $0x25480d53620ad172; QUAD $0xddfe4065c16296ef; QUAD $0xb162dcfe40658162; QUAD $0x0db16207c4724815; QUAD $0x4805b16212c47248; QUAD $0x25480d536203d472; QUAD $0xddfe4065c16296ef; QUAD $0x7162c4fe48655162; QUAD $0x482df162c86f487e; QUAD $0x724825f16206c072; QUAD $0xc072481df1620bc0; QUAD $0xcaca254875736219; QUAD $0x5362c4fe483d3162; QUAD $0x3d516296d4254825; QUAD $0xfe483d5162c1fe48; QUAD $0x62f8fe4845d162c2; QUAD $0xf16202c4724865f1; QUAD $0x1df1620dc4724825; QUAD $0x487e716216c47248; QUAD $0xce2548557362cc6f; QUAD $0x96dc254825d362e8; QUAD $0xd162d9fe4865d162; QUAD $0x487e7162d8fe4865; QUAD $0x724815b16225626f; QUAD $0xc272480db16211c2; QUAD $0x0ad2724805b16213; QUAD $0x6296ef25480d5362; QUAD $0x5d8162e5fe405dc1; QUAD $0x724815b162e5fe40; QUAD $0xc572480db16207c5; QUAD $0x03d5724805b16212; QUAD $0x6296ef25480d5362; QUAD $0x6d5162e5fe405dc1; QUAD $0x6f487e7162c4fe48; QUAD $0x06c772482df162cf; QUAD $0x620bc7724825f162; QUAD $0x736219c772481df1; QUAD $0x3d3162cac925487d; QUAD $0x2548255362c5fe48; QUAD $0xc1fe483d516296d4; QUAD $0xd162c2fe483d5162; QUAD $0x486df162f0fe484d; QUAD $0x724825f16202c372; QUAD $0xc372481df1620dc3; QUAD $0x62cb6f487e716216; QUAD $0xd362e8cd25485d73; QUAD $0x6dd16296d4254825; QUAD $0xfe486dd162d1fe48; QUAD $0x26626f487e7162d0; QUAD $0x6211c3724815b162; QUAD $0xb16213c372480db1; QUAD $0x0d53620ad3724805; QUAD $0x4055c16296ef2548; QUAD $0xeefe40558162edfe; QUAD $0x6207c6724815b162; QUAD $0xb16212c672480db1; QUAD $0x0d536203d6724805; QUAD $0x4055c16296ef2548; QUAD $0xc4fe48755162edfe; QUAD $0xf162ce6f487e7162; QUAD $0x25f16206c672482d; QUAD $0x481df1620bc67248; QUAD $0x254845736219c672; QUAD $0xc6fe483d3162cac8; QUAD $0x6296d42548255362; QUAD $0x3d5162c1fe483d51; QUAD $0xfe4855d162c2fe48; QUAD $0x02c2724875f162e8; QUAD $0x620dc2724825f162; QUAD $0x716216c272481df1; QUAD $0x48657362ca6f487e; QUAD $0x254825d362e8cc25; QUAD $0xc9fe4875d16296cc; QUAD $0x7162c8fe4875d162; QUAD $0x15b16227626f487e; QUAD $0x480db16211c47248; QUAD $0x724805b16213c472; QUAD $0xef25480d53620ad4; QUAD $0x62f5fe404dc16296; QUAD $0x15b162f7fe404d81; QUAD $0x480db16207c77248; QUAD $0x724805b16212c772; QUAD $0xef25480d536203d7; QUAD $0x62f5fe404dc16296; QUAD $0x7e7162c4fe487d51; QUAD $0x72482df162cd6f48; QUAD $0xc5724825f16206c5; QUAD $0x19c572481df1620b; QUAD $0x62cacf25484d7362; QUAD $0x255362c7fe483d31; QUAD $0x483d516296d42548; QUAD $0xc2fe483d5162c1fe; QUAD $0xf162e0fe485dd162; QUAD $0x25f16202c172487d; QUAD $0x481df1620dc17248; QUAD $0x6f487e716216c172; QUAD $0xe8cb25486d7362c9; QUAD $0x6296c4254825d362; QUAD $0x7dd162c1fe487dd1; QUAD $0x6f487e7162c0fe48; QUAD $0xc5724815b1622862; QUAD $0x13c572480db16211; QUAD $0x620ad5724805b162; QUAD $0xc16296ef25480d53; QUAD $0x4045a162fdfe4045; QUAD $0xc07248159162f8fe; QUAD $0x12c072480d916207; QUAD $0x6203d07248059162; QUAD $0xc16296ef25480d53; QUAD $0x48455162fdfe4045; QUAD $0xcc6f487e7162c4fe; QUAD $0x6206c472482df162; QUAD $0xf1620bc4724825f1; QUAD $0x55736219c472481d; QUAD $0x483d1162cace2548; QUAD $0xd42548255362c0fe; QUAD $0x62c1fe483d516296; QUAD $0x65d162c2fe483d51; QUAD $0x724845f162d8fe48; QUAD $0xc0724825f16202c0; QUAD $0x16c072481df1620d; QUAD $0x7362c86f487e7162; QUAD $0x25d362e8ca254875; QUAD $0x4845d16296fc2548; QUAD $0xf8fe4845d162f9fe; QUAD $0x6229626f487e7162; QUAD $0xb16211c6724815b1; QUAD $0x05b16213c672480d; QUAD $0x480d53620ad67248; QUAD $0xfe403d416296ef25; QUAD $0x62c1fe403d2162c5; QUAD $0x916207c172481591; QUAD $0x05916212c172480d; QUAD $0x480d536203d17248; QUAD $0xfe403d416296ef25; QUAD $0x62c4fe484d5162c5; QUAD $0x2df162cb6f487e71; QUAD $0x4825f16206c37248; QUAD $0x72481df1620bc372; QUAD $0xcd25485d736219c3; QUAD $0x62c1fe483d1162ca; QUAD $0x516296d425482553; QUAD $0x483d5162c1fe483d; QUAD $0xd0fe486dd162c2fe; QUAD $0x6202c772484df162; QUAD $0xf1620dc7724825f1; QUAD $0x7e716216c772481d; QUAD $0x25487d7362cf6f48; QUAD $0xf4254825d362e8c9; QUAD $0x62f1fe484dd16296; QUAD $0x7e7162f0fe484dd1; QUAD $0x4815b1622a626f48; QUAD $0x72480db16211c772; QUAD $0xd7724805b16213c7; QUAD $0x96ef25480d53620a; QUAD $0x2162cdfe40354162; QUAD $0x48159162cafe4035; QUAD $0x72480d916207c272; QUAD $0xd2724805916212c2; QUAD $0x96ef25480d536203; QUAD $0x5162cdfe40354162; QUAD $0x487e7162c4fe4855; QUAD $0xc272482df162ca6f; QUAD $0x0bc2724825f16206; QUAD $0x6219c272481df162; QUAD $0x1162cacc25486573; QUAD $0x48255362c2fe483d; QUAD $0xfe483d516296d425; QUAD $0x62c2fe483d5162c1; QUAD $0x55f162c8fe4875d1; QUAD $0x4825f16202c67248; QUAD $0x72481df1620dc672; QUAD $0xce6f487e716216c6; QUAD $0x62e8c82548457362; QUAD $0xd16296ec254825d3; QUAD $0x4855d162e9fe4855; QUAD $0x626f487e7162e8fe; QUAD $0x11c072481591622b; QUAD $0x6213c072480d9162; QUAD $0x53620ad072480591; QUAD $0x2d416296ef25480d; QUAD $0xfe402d2162d5fe40; QUAD $0x07c37248159162d3; QUAD $0x6212c372480d9162; QUAD $0x536203d372480591; QUAD $0x2d416296ef25480d; QUAD $0xfe485d5162d5fe40; QUAD $0x62c96f487e7162c4; QUAD $0xf16206c172482df1; QUAD $0x1df1620bc1724825; QUAD $0x486d736219c17248; QUAD $0xfe483d1162cacb25; QUAD $0x96d42548255362c3; QUAD $0x5162c1fe483d5162; QUAD $0x487dd162c2fe483d; QUAD $0xc572485df162c0fe; QUAD $0x0dc5724825f16202; QUAD $0x6216c572481df162; QUAD $0x4d7362cd6f487e71; QUAD $0x4825d362e8cf2548; QUAD $0xfe485dd16296e425; QUAD $0x62e0fe485dd162e1; QUAD $0x91622c626f487e71; QUAD $0x0d916211c1724815; QUAD $0x4805916213c17248; QUAD $0x25480d53620ad172; QUAD $0xddfe4025416296ef; QUAD $0x9162dcfe40252162; QUAD $0x0d916207c4724815; QUAD $0x4805916212c47248; QUAD $0x25480d536203d472; QUAD $0xddfe4025416296ef; QUAD $0x7162c4fe48655162; QUAD $0x482df162c86f487e; QUAD $0x724825f16206c072; QUAD $0xc072481df1620bc0; QUAD $0xcaca254875736219; QUAD $0x5362c4fe483d1162; QUAD $0x3d516296d4254825; QUAD $0xfe483d5162c1fe48; QUAD $0x62f8fe4845d162c2; QUAD $0xf16202c4724865f1; QUAD $0x1df1620dc4724825; QUAD $0x487e716216c47248; QUAD $0xce2548557362cc6f; QUAD $0x96dc254825d362e8; QUAD $0xd162d9fe4865d162; QUAD $0x487e7162d8fe4865; QUAD $0x72481591622d626f; QUAD $0xc272480d916211c2; QUAD $0x0ad2724805916213; QUAD $0x6296ef25480d5362; QUAD $0x1d2162e5fe401d41; QUAD $0x7248159162e5fe40; QUAD $0xc572480d916207c5; QUAD $0x03d5724805916212; QUAD $0x6296ef25480d5362; QUAD $0x6d5162e5fe401d41; QUAD $0x6f487e7162c4fe48; QUAD $0x06c772482df162cf; QUAD $0x620bc7724825f162; QUAD $0x736219c772481df1; QUAD $0x3d1162cac925487d; QUAD $0x2548255362c5fe48; QUAD $0xc1fe483d516296d4; QUAD $0xd162c2fe483d5162; QUAD $0x486df162f0fe484d; QUAD $0x724825f16202c372; QUAD $0xc372481df1620dc3; QUAD $0x62cb6f487e716216; QUAD $0xd362e8cd25485d73; QUAD $0x6dd16296d4254825; QUAD $0xfe486dd162d1fe48; QUAD $0x2e626f487e7162d0; QUAD $0x6211c37248159162; QUAD $0x916213c372480d91; QUAD $0x0d53620ad3724805; QUAD $0x4015416296ef2548; QUAD $0xeefe40152162edfe; QUAD $0x6207c67248159162; QUAD $0x916212c672480d91; QUAD $0x0d536203d6724805; QUAD $0x4015416296ef2548; QUAD $0xc4fe48755162edfe; QUAD $0xf162ce6f487e7162; QUAD $0x25f16206c672482d; QUAD $0x481df1620bc67248; QUAD $0x254845736219c672; QUAD $0xc6fe483d1162cac8; QUAD $0x6296d42548255362; QUAD $0x3d5162c1fe483d51; QUAD $0xfe4855d162c2fe48; QUAD $0x02c2724875f162e8; QUAD $0x620dc2724825f162; QUAD $0x716216c272481df1; QUAD $0x48657362ca6f487e; QUAD $0x254825d362e8cc25; QUAD $0xc9fe4875d16296cc; QUAD $0x7162c8fe4875d162; QUAD $0x1591622f626f487e; QUAD $0x480d916211c47248; QUAD $0x724805916213c472; QUAD $0xef25480d53620ad4; QUAD $0x62f5fe400d416296; QUAD $0x159162f7fe400d21; QUAD $0x480d916207c77248; QUAD $0x724805916212c772; QUAD $0xef25480d536203d7; QUAD $0x62f5fe400d416296; QUAD $0x7e7162c4fe487d51; QUAD $0x72482df162cd6f48; QUAD $0xc5724825f16206c5; QUAD $0x19c572481df1620b; QUAD $0x62cacf25484d7362; QUAD $0x255362c7fe483d11; QUAD $0x483d516296d42548; QUAD $0xc2fe483d5162c1fe; QUAD $0xf162e0fe485dd162; QUAD $0x25f16202c172487d; QUAD $0x481df1620dc17248; QUAD $0x6f487e716216c172; QUAD $0xe8cb25486d7362c9; QUAD $0x6296c4254825d362; QUAD $0x7dd162c1fe487dd1; QUAD $0x6f487e7162c0fe48; QUAD $0xc572481591623062; QUAD $0x13c572480d916211; QUAD $0x620ad57248059162; QUAD $0x416296ef25480d53; QUAD $0x40050162fdfe4005; QUAD $0xc0724815b162f8fe; QUAD $0x12c072480db16207; QUAD $0x6203d0724805b162; QUAD $0x416296ef25480d53; QUAD $0x01ee8348fdfe4005 + JE lastLoop + ADDQ $8, R13 + MOVQ (R13), R14 + QUAD $0x7162c4fe48455162; QUAD $0x482df162cc6f487e; QUAD $0x724825f16206c472; QUAD $0xc472481df1620bc4; QUAD $0xcace254855736219; QUAD $0x5362c0fe483d3162; QUAD $0x3d516296d4254825; QUAD $0xfe483d5162c1fe48; QUAD $0x62d8fe4865d162c2; QUAD $0xf16202c0724845f1; QUAD $0x1df1620dc0724825; QUAD $0x487e716216c07248; QUAD $0xca2548757362c86f; QUAD $0x96fc254825d362e8; QUAD $0xd162f9fe4845d162; QUAD $0x487e7162f8fe4845; WORD $0x626f; BYTE $0x31 + TESTQ $(1<<0), R14 + JE skipNext0 + MOVQ 0*24(AX), R9 + LONG $0x487cc162; WORD $0x0410; BYTE $0x09 + +skipNext0: + QUAD $0x7162c4fe484d5162; QUAD $0x482df162cb6f487e; QUAD $0x724825f16206c372; QUAD $0xc372481df1620bc3; QUAD $0xcacd25485d736219; QUAD $0x5362c1fe483d3162; QUAD $0x3d516296d4254825; QUAD $0xfe483d5162c1fe48; QUAD $0x62d0fe486dd162c2; QUAD $0xf16202c772484df1; QUAD $0x1df1620dc7724825; QUAD $0x487e716216c77248; QUAD $0xc925487d7362cf6f; QUAD $0x96f4254825d362e8; QUAD $0xd162f1fe484dd162; QUAD $0x487e7162f0fe484d; WORD $0x626f; BYTE $0x32 + TESTQ $(1<<1), R14 + JE skipNext1 + MOVQ 1*24(AX), R9 + LONG $0x487cc162; WORD $0x0c10; BYTE $0x09 + +skipNext1: + QUAD $0x7162c4fe48555162; QUAD $0x482df162ca6f487e; QUAD $0x724825f16206c272; QUAD $0xc272481df1620bc2; QUAD $0xcacc254865736219; QUAD $0x5362c2fe483d3162; QUAD $0x3d516296d4254825; QUAD $0xfe483d5162c1fe48; QUAD $0x62c8fe4875d162c2; QUAD $0xf16202c6724855f1; QUAD $0x1df1620dc6724825; QUAD $0x487e716216c67248; QUAD $0xc82548457362ce6f; QUAD $0x96ec254825d362e8; QUAD $0xd162e9fe4855d162; QUAD $0x487e7162e8fe4855; WORD $0x626f; BYTE $0x33 + TESTQ $(1<<2), R14 + JE skipNext2 + MOVQ 2*24(AX), R9 + LONG $0x487cc162; WORD $0x1410; BYTE $0x09 + +skipNext2: + QUAD $0x7162c4fe485d5162; QUAD $0x482df162c96f487e; QUAD $0x724825f16206c172; QUAD $0xc172481df1620bc1; QUAD $0xcacb25486d736219; QUAD $0x5362c3fe483d3162; QUAD $0x3d516296d4254825; QUAD $0xfe483d5162c1fe48; QUAD $0x62c0fe487dd162c2; QUAD $0xf16202c572485df1; QUAD $0x1df1620dc5724825; QUAD $0x487e716216c57248; QUAD $0xcf25484d7362cd6f; QUAD $0x96e4254825d362e8; QUAD $0xd162e1fe485dd162; QUAD $0x487e7162e0fe485d; WORD $0x626f; BYTE $0x34 + TESTQ $(1<<3), R14 + JE skipNext3 + MOVQ 3*24(AX), R9 + LONG $0x487cc162; WORD $0x1c10; BYTE $0x09 + +skipNext3: + QUAD $0x7162c4fe48655162; QUAD $0x482df162c86f487e; QUAD $0x724825f16206c072; QUAD $0xc072481df1620bc0; QUAD $0xcaca254875736219; QUAD $0x5362c4fe483d3162; QUAD $0x3d516296d4254825; QUAD $0xfe483d5162c1fe48; QUAD $0x62f8fe4845d162c2; QUAD $0xf16202c4724865f1; QUAD $0x1df1620dc4724825; QUAD $0x487e716216c47248; QUAD $0xce2548557362cc6f; QUAD $0x96dc254825d362e8; QUAD $0xd162d9fe4865d162; QUAD $0x487e7162d8fe4865; WORD $0x626f; BYTE $0x35 + TESTQ $(1<<4), R14 + JE skipNext4 + MOVQ 4*24(AX), R9 + LONG $0x487cc162; WORD $0x2410; BYTE $0x09 + +skipNext4: + QUAD $0x7162c4fe486d5162; QUAD $0x482df162cf6f487e; QUAD $0x724825f16206c772; QUAD $0xc772481df1620bc7; QUAD $0xcac925487d736219; QUAD $0x5362c5fe483d3162; QUAD $0x3d516296d4254825; QUAD $0xfe483d5162c1fe48; QUAD $0x62f0fe484dd162c2; QUAD $0xf16202c372486df1; QUAD $0x1df1620dc3724825; QUAD $0x487e716216c37248; QUAD $0xcd25485d7362cb6f; QUAD $0x96d4254825d362e8; QUAD $0xd162d1fe486dd162; QUAD $0x487e7162d0fe486d; WORD $0x626f; BYTE $0x36 + TESTQ $(1<<5), R14 + JE skipNext5 + MOVQ 5*24(AX), R9 + LONG $0x487cc162; WORD $0x2c10; BYTE $0x09 + +skipNext5: + QUAD $0x7162c4fe48755162; QUAD $0x482df162ce6f487e; QUAD $0x724825f16206c672; QUAD $0xc672481df1620bc6; QUAD $0xcac8254845736219; QUAD $0x5362c6fe483d3162; QUAD $0x3d516296d4254825; QUAD $0xfe483d5162c1fe48; QUAD $0x62e8fe4855d162c2; QUAD $0xf16202c2724875f1; QUAD $0x1df1620dc2724825; QUAD $0x487e716216c27248; QUAD $0xcc2548657362ca6f; QUAD $0x96cc254825d362e8; QUAD $0xd162c9fe4875d162; QUAD $0x487e7162c8fe4875; WORD $0x626f; BYTE $0x37 + TESTQ $(1<<6), R14 + JE skipNext6 + MOVQ 6*24(AX), R9 + LONG $0x487cc162; WORD $0x3410; BYTE $0x09 + +skipNext6: + QUAD $0x7162c4fe487d5162; QUAD $0x482df162cd6f487e; QUAD $0x724825f16206c572; QUAD $0xc572481df1620bc5; QUAD $0xcacf25484d736219; QUAD $0x5362c7fe483d3162; QUAD $0x3d516296d4254825; QUAD $0xfe483d5162c1fe48; QUAD $0x62e0fe485dd162c2; QUAD $0xf16202c172487df1; QUAD $0x1df1620dc1724825; QUAD $0x487e716216c17248; QUAD $0xcb25486d7362c96f; QUAD $0x96c4254825d362e8; QUAD $0xd162c1fe487dd162; QUAD $0x487e7162c0fe487d; WORD $0x626f; BYTE $0x38 + TESTQ $(1<<7), R14 + JE skipNext7 + MOVQ 7*24(AX), R9 + LONG $0x487cc162; WORD $0x3c10; BYTE $0x09 + +skipNext7: + QUAD $0x7162c4fe48455162; QUAD $0x482df162cc6f487e; QUAD $0x724825f16206c472; QUAD $0xc472481df1620bc4; QUAD $0xcace254855736219; QUAD $0x5362c0fe483d1162; QUAD $0x3d516296d4254825; QUAD $0xfe483d5162c1fe48; QUAD $0x62d8fe4865d162c2; QUAD $0xf16202c0724845f1; QUAD $0x1df1620dc0724825; QUAD $0x487e716216c07248; QUAD $0xca2548757362c86f; QUAD $0x96fc254825d362e8; QUAD $0xd162f9fe4845d162; QUAD $0x487e7162f8fe4845; WORD $0x626f; BYTE $0x39 + TESTQ $(1<<8), R14 + JE skipNext8 + MOVQ 8*24(AX), R9 + LONG $0x487c4162; WORD $0x0410; BYTE $0x09 + +skipNext8: + QUAD $0x7162c4fe484d5162; QUAD $0x482df162cb6f487e; QUAD $0x724825f16206c372; QUAD $0xc372481df1620bc3; QUAD $0xcacd25485d736219; QUAD $0x5362c1fe483d1162; QUAD $0x3d516296d4254825; QUAD $0xfe483d5162c1fe48; QUAD $0x62d0fe486dd162c2; QUAD $0xf16202c772484df1; QUAD $0x1df1620dc7724825; QUAD $0x487e716216c77248; QUAD $0xc925487d7362cf6f; QUAD $0x96f4254825d362e8; QUAD $0xd162f1fe484dd162; QUAD $0x487e7162f0fe484d; WORD $0x626f; BYTE $0x3a + TESTQ $(1<<9), R14 + JE skipNext9 + MOVQ 9*24(AX), R9 + LONG $0x487c4162; WORD $0x0c10; BYTE $0x09 + +skipNext9: + QUAD $0x7162c4fe48555162; QUAD $0x482df162ca6f487e; QUAD $0x724825f16206c272; QUAD $0xc272481df1620bc2; QUAD $0xcacc254865736219; QUAD $0x5362c2fe483d1162; QUAD $0x3d516296d4254825; QUAD $0xfe483d5162c1fe48; QUAD $0x62c8fe4875d162c2; QUAD $0xf16202c6724855f1; QUAD $0x1df1620dc6724825; QUAD $0x487e716216c67248; QUAD $0xc82548457362ce6f; QUAD $0x96ec254825d362e8; QUAD $0xd162e9fe4855d162; QUAD $0x487e7162e8fe4855; WORD $0x626f; BYTE $0x3b + TESTQ $(1<<10), R14 + JE skipNext10 + MOVQ 10*24(AX), R9 + LONG $0x487c4162; WORD $0x1410; BYTE $0x09 + +skipNext10: + QUAD $0x7162c4fe485d5162; QUAD $0x482df162c96f487e; QUAD $0x724825f16206c172; QUAD $0xc172481df1620bc1; QUAD $0xcacb25486d736219; QUAD $0x5362c3fe483d1162; QUAD $0x3d516296d4254825; QUAD $0xfe483d5162c1fe48; QUAD $0x62c0fe487dd162c2; QUAD $0xf16202c572485df1; QUAD $0x1df1620dc5724825; QUAD $0x487e716216c57248; QUAD $0xcf25484d7362cd6f; QUAD $0x96e4254825d362e8; QUAD $0xd162e1fe485dd162; QUAD $0x487e7162e0fe485d; WORD $0x626f; BYTE $0x3c + TESTQ $(1<<11), R14 + JE skipNext11 + MOVQ 11*24(AX), R9 + LONG $0x487c4162; WORD $0x1c10; BYTE $0x09 + +skipNext11: + QUAD $0x7162c4fe48655162; QUAD $0x482df162c86f487e; QUAD $0x724825f16206c072; QUAD $0xc072481df1620bc0; QUAD $0xcaca254875736219; QUAD $0x5362c4fe483d1162; QUAD $0x3d516296d4254825; QUAD $0xfe483d5162c1fe48; QUAD $0x62f8fe4845d162c2; QUAD $0xf16202c4724865f1; QUAD $0x1df1620dc4724825; QUAD $0x487e716216c47248; QUAD $0xce2548557362cc6f; QUAD $0x96dc254825d362e8; QUAD $0xd162d9fe4865d162; QUAD $0x487e7162d8fe4865; WORD $0x626f; BYTE $0x3d + TESTQ $(1<<12), R14 + JE skipNext12 + MOVQ 12*24(AX), R9 + LONG $0x487c4162; WORD $0x2410; BYTE $0x09 + +skipNext12: + QUAD $0x7162c4fe486d5162; QUAD $0x482df162cf6f487e; QUAD $0x724825f16206c772; QUAD $0xc772481df1620bc7; QUAD $0xcac925487d736219; QUAD $0x5362c5fe483d1162; QUAD $0x3d516296d4254825; QUAD $0xfe483d5162c1fe48; QUAD $0x62f0fe484dd162c2; QUAD $0xf16202c372486df1; QUAD $0x1df1620dc3724825; QUAD $0x487e716216c37248; QUAD $0xcd25485d7362cb6f; QUAD $0x96d4254825d362e8; QUAD $0xd162d1fe486dd162; QUAD $0x487e7162d0fe486d; WORD $0x626f; BYTE $0x3e + TESTQ $(1<<13), R14 + JE skipNext13 + MOVQ 13*24(AX), R9 + LONG $0x487c4162; WORD $0x2c10; BYTE $0x09 + +skipNext13: + QUAD $0x7162c4fe48755162; QUAD $0x482df162ce6f487e; QUAD $0x724825f16206c672; QUAD $0xc672481df1620bc6; QUAD $0xcac8254845736219; QUAD $0x5362c6fe483d1162; QUAD $0x3d516296d4254825; QUAD $0xfe483d5162c1fe48; QUAD $0x62e8fe4855d162c2; QUAD $0xf16202c2724875f1; QUAD $0x1df1620dc2724825; QUAD $0x487e716216c27248; QUAD $0xcc2548657362ca6f; QUAD $0x96cc254825d362e8; QUAD $0xd162c9fe4875d162; QUAD $0x487e7162c8fe4875; WORD $0x626f; BYTE $0x3f + TESTQ $(1<<14), R14 + JE skipNext14 + MOVQ 14*24(AX), R9 + LONG $0x487c4162; WORD $0x3410; BYTE $0x09 + +skipNext14: + QUAD $0x7162c4fe487d5162; QUAD $0x482df162cd6f487e; QUAD $0x724825f16206c572; QUAD $0xc572481df1620bc5; QUAD $0xcacf25484d736219; QUAD $0x5362c7fe483d1162; QUAD $0x3d516296d4254825; QUAD $0xfe483d5162c1fe48; QUAD $0x62e0fe485dd162c2; QUAD $0xf16202c172487df1; QUAD $0x1df1620dc1724825; QUAD $0x487e716216c17248; QUAD $0xcb25486d7362c96f; QUAD $0x96c4254825d362e8; QUAD $0xd162c1fe487dd162; QUAD $0x487e7162c0fe487d; WORD $0x626f; BYTE $0x40 + TESTQ $(1<<15), R14 + JE skipNext15 + MOVQ 15*24(AX), R9 + LONG $0x487c4162; WORD $0x3c10; BYTE $0x09 + +skipNext15: + QUAD $0xd162d86f487e7162; QUAD $0x7dd16224046f487e; QUAD $0x6f487e7162c3fe49; QUAD $0x244c6f487ed162d9; QUAD $0x62cbfe4975d16201; QUAD $0x7ed162da6f487e71; QUAD $0x6dd1620224546f48; QUAD $0x6f487e7162d3fe49; QUAD $0x245c6f487ed162db; QUAD $0x62dbfe4965d16203; QUAD $0x7ed162dc6f487e71; QUAD $0x5dd1620424646f48; QUAD $0x6f487e7162e3fe49; QUAD $0x246c6f487ed162dd; QUAD $0x62ebfe4955d16205; QUAD $0x7ed162de6f487e71; QUAD $0x4dd1620624746f48; QUAD $0x6f487e7162f3fe49; QUAD $0x247c6f487ed162df; QUAD $0xc4fbfe4945d16207; LONG $0xce92fbc1 + JMP lloop + +lastLoop: + QUAD $0x7162c4fe48455162; QUAD $0x482df162cc6f487e; QUAD $0x724825f16206c472; QUAD $0xc472481df1620bc4; QUAD $0xcace254855736219; QUAD $0x5362c0fe483d3162; QUAD $0x3d516296d4254825; QUAD $0xfe483d5162c1fe48; QUAD $0x62d8fe4865d162c2; QUAD $0xf16202c0724845f1; QUAD $0x1df1620dc0724825; QUAD $0x487e716216c07248; QUAD $0xca2548757362c86f; QUAD $0x96fc254825d362e8; QUAD $0xd162f9fe4845d162; QUAD $0x487e7162f8fe4845; QUAD $0xfe484d516231626f; QUAD $0x62cb6f487e7162c4; QUAD $0xf16206c372482df1; QUAD $0x1df1620bc3724825; QUAD $0x485d736219c37248; QUAD $0xfe483d3162cacd25; QUAD $0x96d42548255362c1; QUAD $0x5162c1fe483d5162; QUAD $0x486dd162c2fe483d; QUAD $0xc772484df162d0fe; QUAD $0x0dc7724825f16202; QUAD $0x6216c772481df162; QUAD $0x7d7362cf6f487e71; QUAD $0x4825d362e8c92548; QUAD $0xfe484dd16296f425; QUAD $0x62f0fe484dd162f1; QUAD $0x516232626f487e71; QUAD $0x487e7162c4fe4855; QUAD $0xc272482df162ca6f; QUAD $0x0bc2724825f16206; QUAD $0x6219c272481df162; QUAD $0x3162cacc25486573; QUAD $0x48255362c2fe483d; QUAD $0xfe483d516296d425; QUAD $0x62c2fe483d5162c1; QUAD $0x55f162c8fe4875d1; QUAD $0x4825f16202c67248; QUAD $0x72481df1620dc672; QUAD $0xce6f487e716216c6; QUAD $0x62e8c82548457362; QUAD $0xd16296ec254825d3; QUAD $0x4855d162e9fe4855; QUAD $0x626f487e7162e8fe; QUAD $0x62c4fe485d516233; QUAD $0x2df162c96f487e71; QUAD $0x4825f16206c17248; QUAD $0x72481df1620bc172; QUAD $0xcb25486d736219c1; QUAD $0x62c3fe483d3162ca; QUAD $0x516296d425482553; QUAD $0x483d5162c1fe483d; QUAD $0xc0fe487dd162c2fe; QUAD $0x6202c572485df162; QUAD $0xf1620dc5724825f1; QUAD $0x7e716216c572481d; QUAD $0x25484d7362cd6f48; QUAD $0xe4254825d362e8cf; QUAD $0x62e1fe485dd16296; QUAD $0x7e7162e0fe485dd1; QUAD $0x4865516234626f48; QUAD $0xc86f487e7162c4fe; QUAD $0x6206c072482df162; QUAD $0xf1620bc0724825f1; QUAD $0x75736219c072481d; QUAD $0x483d3162caca2548; QUAD $0xd42548255362c4fe; QUAD $0x62c1fe483d516296; QUAD $0x45d162c2fe483d51; QUAD $0x724865f162f8fe48; QUAD $0xc4724825f16202c4; QUAD $0x16c472481df1620d; QUAD $0x7362cc6f487e7162; QUAD $0x25d362e8ce254855; QUAD $0x4865d16296dc2548; QUAD $0xd8fe4865d162d9fe; QUAD $0x6235626f487e7162; QUAD $0x7e7162c4fe486d51; QUAD $0x72482df162cf6f48; QUAD $0xc7724825f16206c7; QUAD $0x19c772481df1620b; QUAD $0x62cac925487d7362; QUAD $0x255362c5fe483d31; QUAD $0x483d516296d42548; QUAD $0xc2fe483d5162c1fe; QUAD $0xf162f0fe484dd162; QUAD $0x25f16202c372486d; QUAD $0x481df1620dc37248; QUAD $0x6f487e716216c372; QUAD $0xe8cd25485d7362cb; QUAD $0x6296d4254825d362; QUAD $0x6dd162d1fe486dd1; QUAD $0x6f487e7162d0fe48; QUAD $0xc4fe487551623662; QUAD $0xf162ce6f487e7162; QUAD $0x25f16206c672482d; QUAD $0x481df1620bc67248; QUAD $0x254845736219c672; QUAD $0xc6fe483d3162cac8; QUAD $0x6296d42548255362; QUAD $0x3d5162c1fe483d51; QUAD $0xfe4855d162c2fe48; QUAD $0x02c2724875f162e8; QUAD $0x620dc2724825f162; QUAD $0x716216c272481df1; QUAD $0x48657362ca6f487e; QUAD $0x254825d362e8cc25; QUAD $0xc9fe4875d16296cc; QUAD $0x7162c8fe4875d162; QUAD $0x7d516237626f487e; QUAD $0x6f487e7162c4fe48; QUAD $0x06c572482df162cd; QUAD $0x620bc5724825f162; QUAD $0x736219c572481df1; QUAD $0x3d3162cacf25484d; QUAD $0x2548255362c7fe48; QUAD $0xc1fe483d516296d4; QUAD $0xd162c2fe483d5162; QUAD $0x487df162e0fe485d; QUAD $0x724825f16202c172; QUAD $0xc172481df1620dc1; QUAD $0x62c96f487e716216; QUAD $0xd362e8cb25486d73; QUAD $0x7dd16296c4254825; QUAD $0xfe487dd162c1fe48; QUAD $0x38626f487e7162c0; QUAD $0x7162c4fe48455162; QUAD $0x482df162cc6f487e; QUAD $0x724825f16206c472; QUAD $0xc472481df1620bc4; QUAD $0xcace254855736219; QUAD $0x5362c0fe483d1162; QUAD $0x3d516296d4254825; QUAD $0xfe483d5162c1fe48; QUAD $0x62d8fe4865d162c2; QUAD $0xf16202c0724845f1; QUAD $0x1df1620dc0724825; QUAD $0x487e716216c07248; QUAD $0xca2548757362c86f; QUAD $0x96fc254825d362e8; QUAD $0xd162f9fe4845d162; QUAD $0x487e7162f8fe4845; QUAD $0xfe484d516239626f; QUAD $0x62cb6f487e7162c4; QUAD $0xf16206c372482df1; QUAD $0x1df1620bc3724825; QUAD $0x485d736219c37248; QUAD $0xfe483d1162cacd25; QUAD $0x96d42548255362c1; QUAD $0x5162c1fe483d5162; QUAD $0x486dd162c2fe483d; QUAD $0xc772484df162d0fe; QUAD $0x0dc7724825f16202; QUAD $0x6216c772481df162; QUAD $0x7d7362cf6f487e71; QUAD $0x4825d362e8c92548; QUAD $0xfe484dd16296f425; QUAD $0x62f0fe484dd162f1; QUAD $0x51623a626f487e71; QUAD $0x487e7162c4fe4855; QUAD $0xc272482df162ca6f; QUAD $0x0bc2724825f16206; QUAD $0x6219c272481df162; QUAD $0x1162cacc25486573; QUAD $0x48255362c2fe483d; QUAD $0xfe483d516296d425; QUAD $0x62c2fe483d5162c1; QUAD $0x55f162c8fe4875d1; QUAD $0x4825f16202c67248; QUAD $0x72481df1620dc672; QUAD $0xce6f487e716216c6; QUAD $0x62e8c82548457362; QUAD $0xd16296ec254825d3; QUAD $0x4855d162e9fe4855; QUAD $0x626f487e7162e8fe; QUAD $0x62c4fe485d51623b; QUAD $0x2df162c96f487e71; QUAD $0x4825f16206c17248; QUAD $0x72481df1620bc172; QUAD $0xcb25486d736219c1; QUAD $0x62c3fe483d1162ca; QUAD $0x516296d425482553; QUAD $0x483d5162c1fe483d; QUAD $0xc0fe487dd162c2fe; QUAD $0x6202c572485df162; QUAD $0xf1620dc5724825f1; QUAD $0x7e716216c572481d; QUAD $0x25484d7362cd6f48; QUAD $0xe4254825d362e8cf; QUAD $0x62e1fe485dd16296; QUAD $0x7e7162e0fe485dd1; QUAD $0x486551623c626f48; QUAD $0xc86f487e7162c4fe; QUAD $0x6206c072482df162; QUAD $0xf1620bc0724825f1; QUAD $0x75736219c072481d; QUAD $0x483d1162caca2548; QUAD $0xd42548255362c4fe; QUAD $0x62c1fe483d516296; QUAD $0x45d162c2fe483d51; QUAD $0x724865f162f8fe48; QUAD $0xc4724825f16202c4; QUAD $0x16c472481df1620d; QUAD $0x7362cc6f487e7162; QUAD $0x25d362e8ce254855; QUAD $0x4865d16296dc2548; QUAD $0xd8fe4865d162d9fe; QUAD $0x623d626f487e7162; QUAD $0x7e7162c4fe486d51; QUAD $0x72482df162cf6f48; QUAD $0xc7724825f16206c7; QUAD $0x19c772481df1620b; QUAD $0x62cac925487d7362; QUAD $0x255362c5fe483d11; QUAD $0x483d516296d42548; QUAD $0xc2fe483d5162c1fe; QUAD $0xf162f0fe484dd162; QUAD $0x25f16202c372486d; QUAD $0x481df1620dc37248; QUAD $0x6f487e716216c372; QUAD $0xe8cd25485d7362cb; QUAD $0x6296d4254825d362; QUAD $0x6dd162d1fe486dd1; QUAD $0x6f487e7162d0fe48; QUAD $0xc4fe487551623e62; QUAD $0xf162ce6f487e7162; QUAD $0x25f16206c672482d; QUAD $0x481df1620bc67248; QUAD $0x254845736219c672; QUAD $0xc6fe483d1162cac8; QUAD $0x6296d42548255362; QUAD $0x3d5162c1fe483d51; QUAD $0xfe4855d162c2fe48; QUAD $0x02c2724875f162e8; QUAD $0x620dc2724825f162; QUAD $0x716216c272481df1; QUAD $0x48657362ca6f487e; QUAD $0x254825d362e8cc25; QUAD $0xc9fe4875d16296cc; QUAD $0x7162c8fe4875d162; QUAD $0x7d51623f626f487e; QUAD $0x6f487e7162c4fe48; QUAD $0x06c572482df162cd; QUAD $0x620bc5724825f162; QUAD $0x736219c572481df1; QUAD $0x3d1162cacf25484d; QUAD $0x2548255362c7fe48; QUAD $0xc1fe483d516296d4; QUAD $0xd162c2fe483d5162; QUAD $0x487df162e0fe485d; QUAD $0x724825f16202c172; QUAD $0xc172481df1620dc1; QUAD $0x62c96f487e716216; QUAD $0xd362e8cb25486d73; QUAD $0x7dd16296c4254825; QUAD $0xfe487dd162c1fe48; QUAD $0x40626f487e7162c0; QUAD $0xd162d86f487e7162; QUAD $0x7dd16224046f487e; QUAD $0x6f487e7162c3fe49; QUAD $0x244c6f487ed162d9; QUAD $0x62cbfe4975d16201; QUAD $0x7ed162da6f487e71; QUAD $0x6dd1620224546f48; QUAD $0x6f487e7162d3fe49; QUAD $0x245c6f487ed162db; QUAD $0x62dbfe4965d16203; QUAD $0x7ed162dc6f487e71; QUAD $0x5dd1620424646f48; QUAD $0x6f487e7162e3fe49; QUAD $0x246c6f487ed162dd; QUAD $0x62ebfe4955d16205; QUAD $0x7ed162de6f487e71; QUAD $0x4dd1620624746f48; QUAD $0x6f487e7162f3fe49; QUAD $0x247c6f487ed162df; QUAD $0x62fbfe4945d16207; QUAD $0x7ef162077f487ef1; QUAD $0x487ef162014f7f48; QUAD $0x7f487ef16202577f; QUAD $0x677f487ef162035f; QUAD $0x056f7f487ef16204; QUAD $0x6206777f487ef162; LONG $0x7f487ef1; WORD $0x077f + VZEROUPPER + RET + +DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x000(SB)/8, $0x0405060700010203 +DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x008(SB)/8, $0x0c0d0e0f08090a0b +DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x010(SB)/8, $0x0405060700010203 +DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x018(SB)/8, $0x0c0d0e0f08090a0b +DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x020(SB)/8, $0x0405060700010203 +DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x028(SB)/8, $0x0c0d0e0f08090a0b +DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x030(SB)/8, $0x0405060700010203 +DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x038(SB)/8, $0x0c0d0e0f08090a0b +GLOBL PSHUFFLE_BYTE_FLIP_MASK<>(SB), 8, $64 +DATA PSHUFFLE_TRANSPOSE16_MASK1<>+0x000(SB)/8, $0x0000000000000000 +DATA PSHUFFLE_TRANSPOSE16_MASK1<>+0x008(SB)/8, $0x0000000000000001 +DATA PSHUFFLE_TRANSPOSE16_MASK1<>+0x010(SB)/8, $0x0000000000000008 +DATA PSHUFFLE_TRANSPOSE16_MASK1<>+0x018(SB)/8, $0x0000000000000009 +DATA PSHUFFLE_TRANSPOSE16_MASK1<>+0x020(SB)/8, $0x0000000000000004 +DATA PSHUFFLE_TRANSPOSE16_MASK1<>+0x028(SB)/8, $0x0000000000000005 +DATA PSHUFFLE_TRANSPOSE16_MASK1<>+0x030(SB)/8, $0x000000000000000C +DATA PSHUFFLE_TRANSPOSE16_MASK1<>+0x038(SB)/8, $0x000000000000000D +GLOBL PSHUFFLE_TRANSPOSE16_MASK1<>(SB), 8, $64 +DATA PSHUFFLE_TRANSPOSE16_MASK2<>+0x000(SB)/8, $0x0000000000000002 +DATA PSHUFFLE_TRANSPOSE16_MASK2<>+0x008(SB)/8, $0x0000000000000003 +DATA PSHUFFLE_TRANSPOSE16_MASK2<>+0x010(SB)/8, $0x000000000000000A +DATA PSHUFFLE_TRANSPOSE16_MASK2<>+0x018(SB)/8, $0x000000000000000B +DATA PSHUFFLE_TRANSPOSE16_MASK2<>+0x020(SB)/8, $0x0000000000000006 +DATA PSHUFFLE_TRANSPOSE16_MASK2<>+0x028(SB)/8, $0x0000000000000007 +DATA PSHUFFLE_TRANSPOSE16_MASK2<>+0x030(SB)/8, $0x000000000000000E +DATA PSHUFFLE_TRANSPOSE16_MASK2<>+0x038(SB)/8, $0x000000000000000F +GLOBL PSHUFFLE_TRANSPOSE16_MASK2<>(SB), 8, $64 diff --git a/vendor/github.com/minio/sha256-simd/sha256blockAvx_amd64.go b/vendor/github.com/minio/sha256-simd/sha256blockAvx_amd64.go new file mode 100644 index 000000000..c2f71181f --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/sha256blockAvx_amd64.go @@ -0,0 +1,22 @@ +//+build !noasm,!appengine + +/* + * Minio Cloud Storage, (C) 2016 Minio, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package sha256 + +//go:noescape +func blockAvx(h []uint32, message []uint8, reserved0, reserved1, reserved2, reserved3 uint64) diff --git a/vendor/github.com/minio/sha256-simd/sha256blockAvx_amd64.s b/vendor/github.com/minio/sha256-simd/sha256blockAvx_amd64.s new file mode 100644 index 000000000..9f444d49f --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/sha256blockAvx_amd64.s @@ -0,0 +1,408 @@ +//+build !noasm,!appengine + +// SHA256 implementation for AVX + +// +// Minio Cloud Storage, (C) 2016 Minio, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +// +// This code is based on an Intel White-Paper: +// "Fast SHA-256 Implementations on Intel Architecture Processors" +// +// together with the reference implementation from the following authors: +// James Guilford +// Kirk Yap +// Tim Chen +// +// For Golang it has been converted to Plan 9 assembly with the help of +// github.com/minio/asm2plan9s to assemble Intel instructions to their Plan9 +// equivalents +// + +#include "textflag.h" + +#define ROTATE_XS \ + MOVOU X4, X15 \ + MOVOU X5, X4 \ + MOVOU X6, X5 \ + MOVOU X7, X6 \ + MOVOU X15, X7 + +// compute s0 four at a time and s1 two at a time +// compute W[-16] + W[-7] 4 at a time +#define FOUR_ROUNDS_AND_SCHED(a, b, c, d, e, f, g, h) \ + MOVL e, R13 \ // y0 = e + ROLL $18, R13 \ // y0 = e >> (25-11) + MOVL a, R14 \ // y1 = a + LONG $0x0f41e3c4; WORD $0x04c6 \ // VPALIGNR XMM0,XMM7,XMM6,0x4 /* XTMP0 = W[-7] */ + ROLL $23, R14 \ // y1 = a >> (22-13) + XORL e, R13 \ // y0 = e ^ (e >> (25-11)) + MOVL f, R15 \ // y2 = f + ROLL $27, R13 \ // y0 = (e >> (11-6)) ^ (e >> (25-6)) + XORL a, R14 \ // y1 = a ^ (a >> (22-13) + XORL g, R15 \ // y2 = f^g + LONG $0xc4fef9c5 \ // VPADDD XMM0,XMM0,XMM4 /* XTMP0 = W[-7] + W[-16] */ + XORL e, R13 \ // y0 = e ^ (e >> (11-6)) ^ (e >> (25-6) ) + ANDL e, R15 \ // y2 = (f^g)&e + ROLL $21, R14 \ // y1 = (a >> (13-2)) ^ (a >> (22-2)) + \ + \ // compute s0 + \ + LONG $0x0f51e3c4; WORD $0x04cc \ // VPALIGNR XMM1,XMM5,XMM4,0x4 /* XTMP1 = W[-15] */ + XORL a, R14 \ // y1 = a ^ (a >> (13-2)) ^ (a >> (22-2)) + ROLL $26, R13 \ // y0 = S1 = (e>>6) & (e>>11) ^ (e>>25) + XORL g, R15 \ // y2 = CH = ((f^g)&e)^g + ROLL $30, R14 \ // y1 = S0 = (a>>2) ^ (a>>13) ^ (a>>22) + ADDL R13, R15 \ // y2 = S1 + CH + ADDL _xfer+48(FP), R15 \ // y2 = k + w + S1 + CH + MOVL a, R13 \ // y0 = a + ADDL R15, h \ // h = h + S1 + CH + k + w + \ // ROTATE_ARGS + MOVL a, R15 \ // y2 = a + LONG $0xd172e9c5; BYTE $0x07 \ // VPSRLD XMM2,XMM1,0x7 /* */ + ORL c, R13 \ // y0 = a|c + ADDL h, d \ // d = d + h + S1 + CH + k + w + ANDL c, R15 \ // y2 = a&c + LONG $0xf172e1c5; BYTE $0x19 \ // VPSLLD XMM3,XMM1,0x19 /* */ + ANDL b, R13 \ // y0 = (a|c)&b + ADDL R14, h \ // h = h + S1 + CH + k + w + S0 + LONG $0xdaebe1c5 \ // VPOR XMM3,XMM3,XMM2 /* XTMP1 = W[-15] MY_ROR 7 */ + ORL R15, R13 \ // y0 = MAJ = (a|c)&b)|(a&c) + ADDL R13, h \ // h = h + S1 + CH + k + w + S0 + MAJ + \ // ROTATE_ARGS + MOVL d, R13 \ // y0 = e + MOVL h, R14 \ // y1 = a + ROLL $18, R13 \ // y0 = e >> (25-11) + XORL d, R13 \ // y0 = e ^ (e >> (25-11)) + MOVL e, R15 \ // y2 = f + ROLL $23, R14 \ // y1 = a >> (22-13) + LONG $0xd172e9c5; BYTE $0x12 \ // VPSRLD XMM2,XMM1,0x12 /* */ + XORL h, R14 \ // y1 = a ^ (a >> (22-13) + ROLL $27, R13 \ // y0 = (e >> (11-6)) ^ (e >> (25-6)) + XORL f, R15 \ // y2 = f^g + LONG $0xd172b9c5; BYTE $0x03 \ // VPSRLD XMM8,XMM1,0x3 /* XTMP4 = W[-15] >> 3 */ + ROLL $21, R14 \ // y1 = (a >> (13-2)) ^ (a >> (22-2)) + XORL d, R13 \ // y0 = e ^ (e >> (11-6)) ^ (e >> (25-6)) + ANDL d, R15 \ // y2 = (f^g)&e + ROLL $26, R13 \ // y0 = S1 = (e>>6) & (e>>11) ^ (e>>25) + LONG $0xf172f1c5; BYTE $0x0e \ // VPSLLD XMM1,XMM1,0xe /* */ + XORL h, R14 \ // y1 = a ^ (a >> (13-2)) ^ (a >> (22-2)) + XORL f, R15 \ // y2 = CH = ((f^g)&e)^g + LONG $0xd9efe1c5 \ // VPXOR XMM3,XMM3,XMM1 /* */ + ADDL R13, R15 \ // y2 = S1 + CH + ADDL _xfer+52(FP), R15 \ // y2 = k + w + S1 + CH + ROLL $30, R14 \ // y1 = S0 = (a>>2) ^ (a>>13) ^ (a>>22) + LONG $0xdaefe1c5 \ // VPXOR XMM3,XMM3,XMM2 /* XTMP1 = W[-15] MY_ROR 7 ^ W[-15] MY_ROR */ + MOVL h, R13 \ // y0 = a + ADDL R15, g \ // h = h + S1 + CH + k + w + MOVL h, R15 \ // y2 = a + LONG $0xef61c1c4; BYTE $0xc8 \ // VPXOR XMM1,XMM3,XMM8 /* XTMP1 = s0 */ + ORL b, R13 \ // y0 = a|c + ADDL g, c \ // d = d + h + S1 + CH + k + w + ANDL b, R15 \ // y2 = a&c + \ + \ // compute low s1 + \ + LONG $0xd770f9c5; BYTE $0xfa \ // VPSHUFD XMM2,XMM7,0xfa /* XTMP2 = W[-2] {BBAA} */ + ANDL a, R13 \ // y0 = (a|c)&b + ADDL R14, g \ // h = h + S1 + CH + k + w + S0 + LONG $0xc1fef9c5 \ // VPADDD XMM0,XMM0,XMM1 /* XTMP0 = W[-16] + W[-7] + s0 */ + ORL R15, R13 \ // y0 = MAJ = (a|c)&b)|(a&c) + ADDL R13, g \ // h = h + S1 + CH + k + w + S0 + MAJ + \ // ROTATE_ARGS + MOVL c, R13 \ // y0 = e + MOVL g, R14 \ // y1 = a + ROLL $18, R13 \ // y0 = e >> (25-11) + XORL c, R13 \ // y0 = e ^ (e >> (25-11)) + ROLL $23, R14 \ // y1 = a >> (22-13) + MOVL d, R15 \ // y2 = f + XORL g, R14 \ // y1 = a ^ (a >> (22-13) + ROLL $27, R13 \ // y0 = (e >> (11-6)) ^ (e >> (25-6)) + LONG $0xd272b9c5; BYTE $0x0a \ // VPSRLD XMM8,XMM2,0xa /* XTMP4 = W[-2] >> 10 {BBAA} */ + XORL e, R15 \ // y2 = f^g + LONG $0xd273e1c5; BYTE $0x13 \ // VPSRLQ XMM3,XMM2,0x13 /* XTMP3 = W[-2] MY_ROR 19 {xBxA} */ + XORL c, R13 \ // y0 = e ^ (e >> (11-6)) ^ (e >> (25-6)) + ANDL c, R15 \ // y2 = (f^g)&e + LONG $0xd273e9c5; BYTE $0x11 \ // VPSRLQ XMM2,XMM2,0x11 /* XTMP2 = W[-2] MY_ROR 17 {xBxA} */ + ROLL $21, R14 \ // y1 = (a >> (13-2)) ^ (a >> (22-2)) + XORL g, R14 \ // y1 = a ^ (a >> (13-2)) ^ (a >> (22-2)) + XORL e, R15 \ // y2 = CH = ((f^g)&e)^g + ROLL $26, R13 \ // y0 = S1 = (e>>6) & (e>>11) ^ (e>>25) + LONG $0xd3efe9c5 \ // VPXOR XMM2,XMM2,XMM3 /* */ + ADDL R13, R15 \ // y2 = S1 + CH + ROLL $30, R14 \ // y1 = S0 = (a>>2) ^ (a>>13) ^ (a>>22) + ADDL _xfer+56(FP), R15 \ // y2 = k + w + S1 + CH + LONG $0xc2ef39c5 \ // VPXOR XMM8,XMM8,XMM2 /* XTMP4 = s1 {xBxA} */ + MOVL g, R13 \ // y0 = a + ADDL R15, f \ // h = h + S1 + CH + k + w + MOVL g, R15 \ // y2 = a + LONG $0x003942c4; BYTE $0xc2 \ // VPSHUFB XMM8,XMM8,XMM10 /* XTMP4 = s1 {00BA} */ + ORL a, R13 \ // y0 = a|c + ADDL f, b \ // d = d + h + S1 + CH + k + w + ANDL a, R15 \ // y2 = a&c + LONG $0xfe79c1c4; BYTE $0xc0 \ // VPADDD XMM0,XMM0,XMM8 /* XTMP0 = {..., ..., W[1], W[0]} */ + ANDL h, R13 \ // y0 = (a|c)&b + ADDL R14, f \ // h = h + S1 + CH + k + w + S0 + \ + \ // compute high s1 + \ + LONG $0xd070f9c5; BYTE $0x50 \ // VPSHUFD XMM2,XMM0,0x50 /* XTMP2 = W[-2] {DDCC} */ + ORL R15, R13 \ // y0 = MAJ = (a|c)&b)|(a&c) + ADDL R13, f \ // h = h + S1 + CH + k + w + S0 + MAJ + \ // ROTATE_ARGS + MOVL b, R13 \ // y0 = e + ROLL $18, R13 \ // y0 = e >> (25-11) + MOVL f, R14 \ // y1 = a + ROLL $23, R14 \ // y1 = a >> (22-13) + XORL b, R13 \ // y0 = e ^ (e >> (25-11)) + MOVL c, R15 \ // y2 = f + ROLL $27, R13 \ // y0 = (e >> (11-6)) ^ (e >> (25-6)) + LONG $0xd272a1c5; BYTE $0x0a \ // VPSRLD XMM11,XMM2,0xa /* XTMP5 = W[-2] >> 10 {DDCC} */ + XORL f, R14 \ // y1 = a ^ (a >> (22-13) + XORL d, R15 \ // y2 = f^g + LONG $0xd273e1c5; BYTE $0x13 \ // VPSRLQ XMM3,XMM2,0x13 /* XTMP3 = W[-2] MY_ROR 19 {xDxC} */ + XORL b, R13 \ // y0 = e ^ (e >> (11-6)) ^ (e >> (25-6)) + ANDL b, R15 \ // y2 = (f^g)&e + ROLL $21, R14 \ // y1 = (a >> (13-2)) ^ (a >> (22-2)) + LONG $0xd273e9c5; BYTE $0x11 \ // VPSRLQ XMM2,XMM2,0x11 /* XTMP2 = W[-2] MY_ROR 17 {xDxC} */ + XORL f, R14 \ // y1 = a ^ (a >> (13-2)) ^ (a >> (22-2)) + ROLL $26, R13 \ // y0 = S1 = (e>>6) & (e>>11) ^ (e>>25) + XORL d, R15 \ // y2 = CH = ((f^g)&e)^g + LONG $0xd3efe9c5 \ // VPXOR XMM2,XMM2,XMM3 /* */ + ROLL $30, R14 \ // y1 = S0 = (a>>2) ^ (a>>13) ^ (a>>22) + ADDL R13, R15 \ // y2 = S1 + CH + ADDL _xfer+60(FP), R15 \ // y2 = k + w + S1 + CH + LONG $0xdaef21c5 \ // VPXOR XMM11,XMM11,XMM2 /* XTMP5 = s1 {xDxC} */ + MOVL f, R13 \ // y0 = a + ADDL R15, e \ // h = h + S1 + CH + k + w + MOVL f, R15 \ // y2 = a + LONG $0x002142c4; BYTE $0xdc \ // VPSHUFB XMM11,XMM11,XMM12 /* XTMP5 = s1 {DC00} */ + ORL h, R13 \ // y0 = a|c + ADDL e, a \ // d = d + h + S1 + CH + k + w + ANDL h, R15 \ // y2 = a&c + LONG $0xe0fea1c5 \ // VPADDD XMM4,XMM11,XMM0 /* X0 = {W[3], W[2], W[1], W[0]} */ + ANDL g, R13 \ // y0 = (a|c)&b + ADDL R14, e \ // h = h + S1 + CH + k + w + S0 + ORL R15, R13 \ // y0 = MAJ = (a|c)&b)|(a&c) + ADDL R13, e \ // h = h + S1 + CH + k + w + S0 + MAJ + \ // ROTATE_ARGS + ROTATE_XS + +#define DO_ROUND(a, b, c, d, e, f, g, h, offset) \ + MOVL e, R13 \ // y0 = e + ROLL $18, R13 \ // y0 = e >> (25-11) + MOVL a, R14 \ // y1 = a + XORL e, R13 \ // y0 = e ^ (e >> (25-11)) + ROLL $23, R14 \ // y1 = a >> (22-13) + MOVL f, R15 \ // y2 = f + XORL a, R14 \ // y1 = a ^ (a >> (22-13) + ROLL $27, R13 \ // y0 = (e >> (11-6)) ^ (e >> (25-6)) + XORL g, R15 \ // y2 = f^g + XORL e, R13 \ // y0 = e ^ (e >> (11-6)) ^ (e >> (25-6)) + ROLL $21, R14 \ // y1 = (a >> (13-2)) ^ (a >> (22-2)) + ANDL e, R15 \ // y2 = (f^g)&e + XORL a, R14 \ // y1 = a ^ (a >> (13-2)) ^ (a >> (22-2)) + ROLL $26, R13 \ // y0 = S1 = (e>>6) & (e>>11) ^ (e>>25) + XORL g, R15 \ // y2 = CH = ((f^g)&e)^g + ADDL R13, R15 \ // y2 = S1 + CH + ROLL $30, R14 \ // y1 = S0 = (a>>2) ^ (a>>13) ^ (a>>22) + ADDL _xfer+offset(FP), R15 \ // y2 = k + w + S1 + CH + MOVL a, R13 \ // y0 = a + ADDL R15, h \ // h = h + S1 + CH + k + w + MOVL a, R15 \ // y2 = a + ORL c, R13 \ // y0 = a|c + ADDL h, d \ // d = d + h + S1 + CH + k + w + ANDL c, R15 \ // y2 = a&c + ANDL b, R13 \ // y0 = (a|c)&b + ADDL R14, h \ // h = h + S1 + CH + k + w + S0 + ORL R15, R13 \ // y0 = MAJ = (a|c)&b)|(a&c) + ADDL R13, h // h = h + S1 + CH + k + w + S0 + MAJ + +// func blockAvx(h []uint32, message []uint8, reserved0, reserved1, reserved2, reserved3 uint64) +TEXT ·blockAvx(SB), 7, $0-80 + + MOVQ h+0(FP), SI // SI: &h + MOVQ message_base+24(FP), R8 // &message + MOVQ message_len+32(FP), R9 // length of message + CMPQ R9, $0 + JEQ done_hash + ADDQ R8, R9 + MOVQ R9, reserved2+64(FP) // store end of message + + // Register definition + // a --> eax + // b --> ebx + // c --> ecx + // d --> r8d + // e --> edx + // f --> r9d + // g --> r10d + // h --> r11d + // + // y0 --> r13d + // y1 --> r14d + // y2 --> r15d + + MOVL (0*4)(SI), AX // a = H0 + MOVL (1*4)(SI), BX // b = H1 + MOVL (2*4)(SI), CX // c = H2 + MOVL (3*4)(SI), R8 // d = H3 + MOVL (4*4)(SI), DX // e = H4 + MOVL (5*4)(SI), R9 // f = H5 + MOVL (6*4)(SI), R10 // g = H6 + MOVL (7*4)(SI), R11 // h = H7 + + MOVOU bflipMask<>(SB), X13 + MOVOU shuf00BA<>(SB), X10 // shuffle xBxA -> 00BA + MOVOU shufDC00<>(SB), X12 // shuffle xDxC -> DC00 + + MOVQ message_base+24(FP), SI // SI: &message + +loop0: + LEAQ constants<>(SB), BP + + // byte swap first 16 dwords + MOVOU 0*16(SI), X4 + LONG $0x0059c2c4; BYTE $0xe5 // VPSHUFB XMM4, XMM4, XMM13 + MOVOU 1*16(SI), X5 + LONG $0x0051c2c4; BYTE $0xed // VPSHUFB XMM5, XMM5, XMM13 + MOVOU 2*16(SI), X6 + LONG $0x0049c2c4; BYTE $0xf5 // VPSHUFB XMM6, XMM6, XMM13 + MOVOU 3*16(SI), X7 + LONG $0x0041c2c4; BYTE $0xfd // VPSHUFB XMM7, XMM7, XMM13 + + MOVQ SI, reserved3+72(FP) + MOVD $0x3, DI + + // schedule 48 input dwords, by doing 3 rounds of 16 each +loop1: + LONG $0x4dfe59c5; BYTE $0x00 // VPADDD XMM9, XMM4, 0[RBP] /* Add 1st constant to first part of message */ + MOVOU X9, reserved0+48(FP) + FOUR_ROUNDS_AND_SCHED(AX, BX, CX, R8, DX, R9, R10, R11) + + LONG $0x4dfe59c5; BYTE $0x10 // VPADDD XMM9, XMM4, 16[RBP] /* Add 2nd constant to message */ + MOVOU X9, reserved0+48(FP) + FOUR_ROUNDS_AND_SCHED(DX, R9, R10, R11, AX, BX, CX, R8) + + LONG $0x4dfe59c5; BYTE $0x20 // VPADDD XMM9, XMM4, 32[RBP] /* Add 3rd constant to message */ + MOVOU X9, reserved0+48(FP) + FOUR_ROUNDS_AND_SCHED(AX, BX, CX, R8, DX, R9, R10, R11) + + LONG $0x4dfe59c5; BYTE $0x30 // VPADDD XMM9, XMM4, 48[RBP] /* Add 4th constant to message */ + MOVOU X9, reserved0+48(FP) + ADDQ $64, BP + FOUR_ROUNDS_AND_SCHED(DX, R9, R10, R11, AX, BX, CX, R8) + + SUBQ $1, DI + JNE loop1 + + MOVD $0x2, DI + +loop2: + LONG $0x4dfe59c5; BYTE $0x00 // VPADDD XMM9, XMM4, 0[RBP] /* Add 1st constant to first part of message */ + MOVOU X9, reserved0+48(FP) + DO_ROUND( AX, BX, CX, R8, DX, R9, R10, R11, 48) + DO_ROUND(R11, AX, BX, CX, R8, DX, R9, R10, 52) + DO_ROUND(R10, R11, AX, BX, CX, R8, DX, R9, 56) + DO_ROUND( R9, R10, R11, AX, BX, CX, R8, DX, 60) + + LONG $0x4dfe51c5; BYTE $0x10 // VPADDD XMM9, XMM5, 16[RBP] /* Add 2nd constant to message */ + MOVOU X9, reserved0+48(FP) + ADDQ $32, BP + DO_ROUND( DX, R9, R10, R11, AX, BX, CX, R8, 48) + DO_ROUND( R8, DX, R9, R10, R11, AX, BX, CX, 52) + DO_ROUND( CX, R8, DX, R9, R10, R11, AX, BX, 56) + DO_ROUND( BX, CX, R8, DX, R9, R10, R11, AX, 60) + + MOVOU X6, X4 + MOVOU X7, X5 + + SUBQ $1, DI + JNE loop2 + + MOVQ h+0(FP), SI // SI: &h + ADDL (0*4)(SI), AX // H0 = a + H0 + MOVL AX, (0*4)(SI) + ADDL (1*4)(SI), BX // H1 = b + H1 + MOVL BX, (1*4)(SI) + ADDL (2*4)(SI), CX // H2 = c + H2 + MOVL CX, (2*4)(SI) + ADDL (3*4)(SI), R8 // H3 = d + H3 + MOVL R8, (3*4)(SI) + ADDL (4*4)(SI), DX // H4 = e + H4 + MOVL DX, (4*4)(SI) + ADDL (5*4)(SI), R9 // H5 = f + H5 + MOVL R9, (5*4)(SI) + ADDL (6*4)(SI), R10 // H6 = g + H6 + MOVL R10, (6*4)(SI) + ADDL (7*4)(SI), R11 // H7 = h + H7 + MOVL R11, (7*4)(SI) + + MOVQ reserved3+72(FP), SI + ADDQ $64, SI + CMPQ reserved2+64(FP), SI + JNE loop0 + +done_hash: + RET + +// Constants table +DATA constants<>+0x0(SB)/8, $0x71374491428a2f98 +DATA constants<>+0x8(SB)/8, $0xe9b5dba5b5c0fbcf +DATA constants<>+0x10(SB)/8, $0x59f111f13956c25b +DATA constants<>+0x18(SB)/8, $0xab1c5ed5923f82a4 +DATA constants<>+0x20(SB)/8, $0x12835b01d807aa98 +DATA constants<>+0x28(SB)/8, $0x550c7dc3243185be +DATA constants<>+0x30(SB)/8, $0x80deb1fe72be5d74 +DATA constants<>+0x38(SB)/8, $0xc19bf1749bdc06a7 +DATA constants<>+0x40(SB)/8, $0xefbe4786e49b69c1 +DATA constants<>+0x48(SB)/8, $0x240ca1cc0fc19dc6 +DATA constants<>+0x50(SB)/8, $0x4a7484aa2de92c6f +DATA constants<>+0x58(SB)/8, $0x76f988da5cb0a9dc +DATA constants<>+0x60(SB)/8, $0xa831c66d983e5152 +DATA constants<>+0x68(SB)/8, $0xbf597fc7b00327c8 +DATA constants<>+0x70(SB)/8, $0xd5a79147c6e00bf3 +DATA constants<>+0x78(SB)/8, $0x1429296706ca6351 +DATA constants<>+0x80(SB)/8, $0x2e1b213827b70a85 +DATA constants<>+0x88(SB)/8, $0x53380d134d2c6dfc +DATA constants<>+0x90(SB)/8, $0x766a0abb650a7354 +DATA constants<>+0x98(SB)/8, $0x92722c8581c2c92e +DATA constants<>+0xa0(SB)/8, $0xa81a664ba2bfe8a1 +DATA constants<>+0xa8(SB)/8, $0xc76c51a3c24b8b70 +DATA constants<>+0xb0(SB)/8, $0xd6990624d192e819 +DATA constants<>+0xb8(SB)/8, $0x106aa070f40e3585 +DATA constants<>+0xc0(SB)/8, $0x1e376c0819a4c116 +DATA constants<>+0xc8(SB)/8, $0x34b0bcb52748774c +DATA constants<>+0xd0(SB)/8, $0x4ed8aa4a391c0cb3 +DATA constants<>+0xd8(SB)/8, $0x682e6ff35b9cca4f +DATA constants<>+0xe0(SB)/8, $0x78a5636f748f82ee +DATA constants<>+0xe8(SB)/8, $0x8cc7020884c87814 +DATA constants<>+0xf0(SB)/8, $0xa4506ceb90befffa +DATA constants<>+0xf8(SB)/8, $0xc67178f2bef9a3f7 + +DATA bflipMask<>+0x00(SB)/8, $0x0405060700010203 +DATA bflipMask<>+0x08(SB)/8, $0x0c0d0e0f08090a0b + +DATA shuf00BA<>+0x00(SB)/8, $0x0b0a090803020100 +DATA shuf00BA<>+0x08(SB)/8, $0xFFFFFFFFFFFFFFFF + +DATA shufDC00<>+0x00(SB)/8, $0xFFFFFFFFFFFFFFFF +DATA shufDC00<>+0x08(SB)/8, $0x0b0a090803020100 + +GLOBL constants<>(SB), 8, $256 +GLOBL bflipMask<>(SB), (NOPTR+RODATA), $16 +GLOBL shuf00BA<>(SB), (NOPTR+RODATA), $16 +GLOBL shufDC00<>(SB), (NOPTR+RODATA), $16 diff --git a/vendor/github.com/minio/sha256-simd/sha256blockSha_amd64.go b/vendor/github.com/minio/sha256-simd/sha256blockSha_amd64.go new file mode 100644 index 000000000..483689ef0 --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/sha256blockSha_amd64.go @@ -0,0 +1,6 @@ +//+build !noasm,!appengine + +package sha256 + +//go:noescape +func blockSha(h *[8]uint32, message []uint8) diff --git a/vendor/github.com/minio/sha256-simd/sha256blockSha_amd64.s b/vendor/github.com/minio/sha256-simd/sha256blockSha_amd64.s new file mode 100644 index 000000000..909fc0ef8 --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/sha256blockSha_amd64.s @@ -0,0 +1,266 @@ +//+build !noasm,!appengine + +// SHA intrinsic version of SHA256 + +// Kristofer Peterson, (C) 2018. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include "textflag.h" + +DATA K<>+0x00(SB)/4, $0x428a2f98 +DATA K<>+0x04(SB)/4, $0x71374491 +DATA K<>+0x08(SB)/4, $0xb5c0fbcf +DATA K<>+0x0c(SB)/4, $0xe9b5dba5 +DATA K<>+0x10(SB)/4, $0x3956c25b +DATA K<>+0x14(SB)/4, $0x59f111f1 +DATA K<>+0x18(SB)/4, $0x923f82a4 +DATA K<>+0x1c(SB)/4, $0xab1c5ed5 +DATA K<>+0x20(SB)/4, $0xd807aa98 +DATA K<>+0x24(SB)/4, $0x12835b01 +DATA K<>+0x28(SB)/4, $0x243185be +DATA K<>+0x2c(SB)/4, $0x550c7dc3 +DATA K<>+0x30(SB)/4, $0x72be5d74 +DATA K<>+0x34(SB)/4, $0x80deb1fe +DATA K<>+0x38(SB)/4, $0x9bdc06a7 +DATA K<>+0x3c(SB)/4, $0xc19bf174 +DATA K<>+0x40(SB)/4, $0xe49b69c1 +DATA K<>+0x44(SB)/4, $0xefbe4786 +DATA K<>+0x48(SB)/4, $0x0fc19dc6 +DATA K<>+0x4c(SB)/4, $0x240ca1cc +DATA K<>+0x50(SB)/4, $0x2de92c6f +DATA K<>+0x54(SB)/4, $0x4a7484aa +DATA K<>+0x58(SB)/4, $0x5cb0a9dc +DATA K<>+0x5c(SB)/4, $0x76f988da +DATA K<>+0x60(SB)/4, $0x983e5152 +DATA K<>+0x64(SB)/4, $0xa831c66d +DATA K<>+0x68(SB)/4, $0xb00327c8 +DATA K<>+0x6c(SB)/4, $0xbf597fc7 +DATA K<>+0x70(SB)/4, $0xc6e00bf3 +DATA K<>+0x74(SB)/4, $0xd5a79147 +DATA K<>+0x78(SB)/4, $0x06ca6351 +DATA K<>+0x7c(SB)/4, $0x14292967 +DATA K<>+0x80(SB)/4, $0x27b70a85 +DATA K<>+0x84(SB)/4, $0x2e1b2138 +DATA K<>+0x88(SB)/4, $0x4d2c6dfc +DATA K<>+0x8c(SB)/4, $0x53380d13 +DATA K<>+0x90(SB)/4, $0x650a7354 +DATA K<>+0x94(SB)/4, $0x766a0abb +DATA K<>+0x98(SB)/4, $0x81c2c92e +DATA K<>+0x9c(SB)/4, $0x92722c85 +DATA K<>+0xa0(SB)/4, $0xa2bfe8a1 +DATA K<>+0xa4(SB)/4, $0xa81a664b +DATA K<>+0xa8(SB)/4, $0xc24b8b70 +DATA K<>+0xac(SB)/4, $0xc76c51a3 +DATA K<>+0xb0(SB)/4, $0xd192e819 +DATA K<>+0xb4(SB)/4, $0xd6990624 +DATA K<>+0xb8(SB)/4, $0xf40e3585 +DATA K<>+0xbc(SB)/4, $0x106aa070 +DATA K<>+0xc0(SB)/4, $0x19a4c116 +DATA K<>+0xc4(SB)/4, $0x1e376c08 +DATA K<>+0xc8(SB)/4, $0x2748774c +DATA K<>+0xcc(SB)/4, $0x34b0bcb5 +DATA K<>+0xd0(SB)/4, $0x391c0cb3 +DATA K<>+0xd4(SB)/4, $0x4ed8aa4a +DATA K<>+0xd8(SB)/4, $0x5b9cca4f +DATA K<>+0xdc(SB)/4, $0x682e6ff3 +DATA K<>+0xe0(SB)/4, $0x748f82ee +DATA K<>+0xe4(SB)/4, $0x78a5636f +DATA K<>+0xe8(SB)/4, $0x84c87814 +DATA K<>+0xec(SB)/4, $0x8cc70208 +DATA K<>+0xf0(SB)/4, $0x90befffa +DATA K<>+0xf4(SB)/4, $0xa4506ceb +DATA K<>+0xf8(SB)/4, $0xbef9a3f7 +DATA K<>+0xfc(SB)/4, $0xc67178f2 +GLOBL K<>(SB), RODATA|NOPTR, $256 + +DATA SHUF_MASK<>+0x00(SB)/8, $0x0405060700010203 +DATA SHUF_MASK<>+0x08(SB)/8, $0x0c0d0e0f08090a0b +GLOBL SHUF_MASK<>(SB), RODATA|NOPTR, $16 + +// Register Usage +// BX base address of constant table (constant) +// DX hash_state (constant) +// SI hash_data.data +// DI hash_data.data + hash_data.length - 64 (constant) +// X0 scratch +// X1 scratch +// X2 working hash state // ABEF +// X3 working hash state // CDGH +// X4 first 16 bytes of block +// X5 second 16 bytes of block +// X6 third 16 bytes of block +// X7 fourth 16 bytes of block +// X12 saved hash state // ABEF +// X13 saved hash state // CDGH +// X15 data shuffle mask (constant) + +TEXT ·blockSha(SB), NOSPLIT, $0-32 + MOVQ h+0(FP), DX + MOVQ message_base+8(FP), SI + MOVQ message_len+16(FP), DI + LEAQ -64(SI)(DI*1), DI + MOVOU (DX), X2 + MOVOU 16(DX), X1 + MOVO X2, X3 + PUNPCKLLQ X1, X2 + PUNPCKHLQ X1, X3 + PSHUFD $0x27, X2, X2 + PSHUFD $0x27, X3, X3 + MOVO SHUF_MASK<>(SB), X15 + LEAQ K<>(SB), BX + + JMP TEST + +LOOP: + MOVO X2, X12 + MOVO X3, X13 + + // load block and shuffle + MOVOU (SI), X4 + MOVOU 16(SI), X5 + MOVOU 32(SI), X6 + MOVOU 48(SI), X7 + PSHUFB X15, X4 + PSHUFB X15, X5 + PSHUFB X15, X6 + PSHUFB X15, X7 + +#define ROUND456 \ + PADDL X5, X0 \ + LONG $0xdacb380f \ // SHA256RNDS2 XMM3, XMM2 + MOVO X5, X1 \ + LONG $0x0f3a0f66; WORD $0x04cc \ // PALIGNR XMM1, XMM4, 4 + PADDL X1, X6 \ + LONG $0xf5cd380f \ // SHA256MSG2 XMM6, XMM5 + PSHUFD $0x4e, X0, X0 \ + LONG $0xd3cb380f \ // SHA256RNDS2 XMM2, XMM3 + LONG $0xe5cc380f // SHA256MSG1 XMM4, XMM5 + +#define ROUND567 \ + PADDL X6, X0 \ + LONG $0xdacb380f \ // SHA256RNDS2 XMM3, XMM2 + MOVO X6, X1 \ + LONG $0x0f3a0f66; WORD $0x04cd \ // PALIGNR XMM1, XMM5, 4 + PADDL X1, X7 \ + LONG $0xfecd380f \ // SHA256MSG2 XMM7, XMM6 + PSHUFD $0x4e, X0, X0 \ + LONG $0xd3cb380f \ // SHA256RNDS2 XMM2, XMM3 + LONG $0xeecc380f // SHA256MSG1 XMM5, XMM6 + +#define ROUND674 \ + PADDL X7, X0 \ + LONG $0xdacb380f \ // SHA256RNDS2 XMM3, XMM2 + MOVO X7, X1 \ + LONG $0x0f3a0f66; WORD $0x04ce \ // PALIGNR XMM1, XMM6, 4 + PADDL X1, X4 \ + LONG $0xe7cd380f \ // SHA256MSG2 XMM4, XMM7 + PSHUFD $0x4e, X0, X0 \ + LONG $0xd3cb380f \ // SHA256RNDS2 XMM2, XMM3 + LONG $0xf7cc380f // SHA256MSG1 XMM6, XMM7 + +#define ROUND745 \ + PADDL X4, X0 \ + LONG $0xdacb380f \ // SHA256RNDS2 XMM3, XMM2 + MOVO X4, X1 \ + LONG $0x0f3a0f66; WORD $0x04cf \ // PALIGNR XMM1, XMM7, 4 + PADDL X1, X5 \ + LONG $0xeccd380f \ // SHA256MSG2 XMM5, XMM4 + PSHUFD $0x4e, X0, X0 \ + LONG $0xd3cb380f \ // SHA256RNDS2 XMM2, XMM3 + LONG $0xfccc380f // SHA256MSG1 XMM7, XMM4 + + // rounds 0-3 + MOVO (BX), X0 + PADDL X4, X0 + LONG $0xdacb380f // SHA256RNDS2 XMM3, XMM2 + PSHUFD $0x4e, X0, X0 + LONG $0xd3cb380f // SHA256RNDS2 XMM2, XMM3 + + // rounds 4-7 + MOVO 1*16(BX), X0 + PADDL X5, X0 + LONG $0xdacb380f // SHA256RNDS2 XMM3, XMM2 + PSHUFD $0x4e, X0, X0 + LONG $0xd3cb380f // SHA256RNDS2 XMM2, XMM3 + LONG $0xe5cc380f // SHA256MSG1 XMM4, XMM5 + + // rounds 8-11 + MOVO 2*16(BX), X0 + PADDL X6, X0 + LONG $0xdacb380f // SHA256RNDS2 XMM3, XMM2 + PSHUFD $0x4e, X0, X0 + LONG $0xd3cb380f // SHA256RNDS2 XMM2, XMM3 + LONG $0xeecc380f // SHA256MSG1 XMM5, XMM6 + + MOVO 3*16(BX), X0; ROUND674 // rounds 12-15 + MOVO 4*16(BX), X0; ROUND745 // rounds 16-19 + MOVO 5*16(BX), X0; ROUND456 // rounds 20-23 + MOVO 6*16(BX), X0; ROUND567 // rounds 24-27 + MOVO 7*16(BX), X0; ROUND674 // rounds 28-31 + MOVO 8*16(BX), X0; ROUND745 // rounds 32-35 + MOVO 9*16(BX), X0; ROUND456 // rounds 36-39 + MOVO 10*16(BX), X0; ROUND567 // rounds 40-43 + MOVO 11*16(BX), X0; ROUND674 // rounds 44-47 + MOVO 12*16(BX), X0; ROUND745 // rounds 48-51 + + // rounds 52-55 + MOVO 13*16(BX), X0 + PADDL X5, X0 + LONG $0xdacb380f // SHA256RNDS2 XMM3, XMM2 + MOVO X5, X1 + LONG $0x0f3a0f66; WORD $0x04cc // PALIGNR XMM1, XMM4, 4 + PADDL X1, X6 + LONG $0xf5cd380f // SHA256MSG2 XMM6, XMM5 + PSHUFD $0x4e, X0, X0 + LONG $0xd3cb380f // SHA256RNDS2 XMM2, XMM3 + + // rounds 56-59 + MOVO 14*16(BX), X0 + PADDL X6, X0 + LONG $0xdacb380f // SHA256RNDS2 XMM3, XMM2 + MOVO X6, X1 + LONG $0x0f3a0f66; WORD $0x04cd // PALIGNR XMM1, XMM5, 4 + PADDL X1, X7 + LONG $0xfecd380f // SHA256MSG2 XMM7, XMM6 + PSHUFD $0x4e, X0, X0 + LONG $0xd3cb380f // SHA256RNDS2 XMM2, XMM3 + + // rounds 60-63 + MOVO 15*16(BX), X0 + PADDL X7, X0 + LONG $0xdacb380f // SHA256RNDS2 XMM3, XMM2 + PSHUFD $0x4e, X0, X0 + LONG $0xd3cb380f // SHA256RNDS2 XMM2, XMM3 + + PADDL X12, X2 + PADDL X13, X3 + + ADDQ $64, SI + +TEST: + CMPQ SI, DI + JBE LOOP + + PSHUFD $0x4e, X3, X0 + LONG $0x0e3a0f66; WORD $0xf0c2 // PBLENDW XMM0, XMM2, 0xf0 + PSHUFD $0x4e, X2, X1 + LONG $0x0e3a0f66; WORD $0x0fcb // PBLENDW XMM1, XMM3, 0x0f + PSHUFD $0x1b, X0, X0 + PSHUFD $0x1b, X1, X1 + + MOVOU X0, (DX) + MOVOU X1, 16(DX) + + RET diff --git a/vendor/github.com/minio/sha256-simd/sha256blockSsse_amd64.go b/vendor/github.com/minio/sha256-simd/sha256blockSsse_amd64.go new file mode 100644 index 000000000..1ae2320bd --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/sha256blockSsse_amd64.go @@ -0,0 +1,22 @@ +//+build !noasm,!appengine + +/* + * Minio Cloud Storage, (C) 2016 Minio, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package sha256 + +//go:noescape +func blockSsse(h []uint32, message []uint8, reserved0, reserved1, reserved2, reserved3 uint64) diff --git a/vendor/github.com/minio/sha256-simd/sha256blockSsse_amd64.s b/vendor/github.com/minio/sha256-simd/sha256blockSsse_amd64.s new file mode 100644 index 000000000..7afb45c87 --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/sha256blockSsse_amd64.s @@ -0,0 +1,429 @@ +//+build !noasm,!appengine + +// SHA256 implementation for SSSE3 + +// +// Minio Cloud Storage, (C) 2016 Minio, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +// +// This code is based on an Intel White-Paper: +// "Fast SHA-256 Implementations on Intel Architecture Processors" +// +// together with the reference implementation from the following authors: +// James Guilford +// Kirk Yap +// Tim Chen +// +// For Golang it has been converted to Plan 9 assembly with the help of +// github.com/minio/asm2plan9s to assemble Intel instructions to their Plan9 +// equivalents +// + +#include "textflag.h" + +#define ROTATE_XS \ + MOVOU X4, X15 \ + MOVOU X5, X4 \ + MOVOU X6, X5 \ + MOVOU X7, X6 \ + MOVOU X15, X7 + +// compute s0 four at a time and s1 two at a time +// compute W[-16] + W[-7] 4 at a time +#define FOUR_ROUNDS_AND_SCHED(a, b, c, d, e, f, g, h) \ + MOVL e, R13 \ // y0 = e + ROLL $18, R13 \ // y0 = e >> (25-11) + MOVL a, R14 \ // y1 = a + MOVOU X7, X0 \ + LONG $0x0f3a0f66; WORD $0x04c6 \ // PALIGNR XMM0,XMM6,0x4 /* XTMP0 = W[-7] */ + ROLL $23, R14 \ // y1 = a >> (22-13) + XORL e, R13 \ // y0 = e ^ (e >> (25-11)) + MOVL f, R15 \ // y2 = f + ROLL $27, R13 \ // y0 = (e >> (11-6)) ^ (e >> (25-6)) + XORL a, R14 \ // y1 = a ^ (a >> (22-13) + XORL g, R15 \ // y2 = f^g + LONG $0xc4fe0f66 \ // PADDD XMM0,XMM4 /* XTMP0 = W[-7] + W[-16] */ + XORL e, R13 \ // y0 = e ^ (e >> (11-6)) ^ (e >> (25-6) ) + ANDL e, R15 \ // y2 = (f^g)&e + ROLL $21, R14 \ // y1 = (a >> (13-2)) ^ (a >> (22-2)) + \ + \ // compute s0 + \ + MOVOU X5, X1 \ + LONG $0x0f3a0f66; WORD $0x04cc \ // PALIGNR XMM1,XMM4,0x4 /* XTMP1 = W[-15] */ + XORL a, R14 \ // y1 = a ^ (a >> (13-2)) ^ (a >> (22-2)) + ROLL $26, R13 \ // y0 = S1 = (e>>6) & (e>>11) ^ (e>>25) + XORL g, R15 \ // y2 = CH = ((f^g)&e)^g + ROLL $30, R14 \ // y1 = S0 = (a>>2) ^ (a>>13) ^ (a>>22) + ADDL R13, R15 \ // y2 = S1 + CH + ADDL _xfer+48(FP), R15 \ // y2 = k + w + S1 + CH + MOVL a, R13 \ // y0 = a + ADDL R15, h \ // h = h + S1 + CH + k + w + \ // ROTATE_ARGS + MOVL a, R15 \ // y2 = a + MOVOU X1, X2 \ + LONG $0xd2720f66; BYTE $0x07 \ // PSRLD XMM2,0x7 /* */ + ORL c, R13 \ // y0 = a|c + ADDL h, d \ // d = d + h + S1 + CH + k + w + ANDL c, R15 \ // y2 = a&c + MOVOU X1, X3 \ + LONG $0xf3720f66; BYTE $0x19 \ // PSLLD XMM3,0x19 /* */ + ANDL b, R13 \ // y0 = (a|c)&b + ADDL R14, h \ // h = h + S1 + CH + k + w + S0 + LONG $0xdaeb0f66 \ // POR XMM3,XMM2 /* XTMP1 = W[-15] MY_ROR 7 */ + ORL R15, R13 \ // y0 = MAJ = (a|c)&b)|(a&c) + ADDL R13, h \ // h = h + S1 + CH + k + w + S0 + MAJ + \ // ROTATE_ARGS + MOVL d, R13 \ // y0 = e + MOVL h, R14 \ // y1 = a + ROLL $18, R13 \ // y0 = e >> (25-11) + XORL d, R13 \ // y0 = e ^ (e >> (25-11)) + MOVL e, R15 \ // y2 = f + ROLL $23, R14 \ // y1 = a >> (22-13) + MOVOU X1, X2 \ + LONG $0xd2720f66; BYTE $0x12 \ // PSRLD XMM2,0x12 /* */ + XORL h, R14 \ // y1 = a ^ (a >> (22-13) + ROLL $27, R13 \ // y0 = (e >> (11-6)) ^ (e >> (25-6)) + XORL f, R15 \ // y2 = f^g + MOVOU X1, X8 \ + LONG $0x720f4166; WORD $0x03d0 \ // PSRLD XMM8,0x3 /* XTMP4 = W[-15] >> 3 */ + ROLL $21, R14 \ // y1 = (a >> (13-2)) ^ (a >> (22-2)) + XORL d, R13 \ // y0 = e ^ (e >> (11-6)) ^ (e >> (25-6)) + ANDL d, R15 \ // y2 = (f^g)&e + ROLL $26, R13 \ // y0 = S1 = (e>>6) & (e>>11) ^ (e>>25) + LONG $0xf1720f66; BYTE $0x0e \ // PSLLD XMM1,0xe /* */ + XORL h, R14 \ // y1 = a ^ (a >> (13-2)) ^ (a >> (22-2)) + XORL f, R15 \ // y2 = CH = ((f^g)&e)^g + LONG $0xd9ef0f66 \ // PXOR XMM3,XMM1 /* */ + ADDL R13, R15 \ // y2 = S1 + CH + ADDL _xfer+52(FP), R15 \ // y2 = k + w + S1 + CH + ROLL $30, R14 \ // y1 = S0 = (a>>2) ^ (a>>13) ^ (a>>22) + LONG $0xdaef0f66 \ // PXOR XMM3,XMM2 /* XTMP1 = W[-15] MY_ROR 7 ^ W[-15] MY_ROR */ + MOVL h, R13 \ // y0 = a + ADDL R15, g \ // h = h + S1 + CH + k + w + MOVL h, R15 \ // y2 = a + MOVOU X3, X1 \ + LONG $0xef0f4166; BYTE $0xc8 \ // PXOR XMM1,XMM8 /* XTMP1 = s0 */ + ORL b, R13 \ // y0 = a|c + ADDL g, c \ // d = d + h + S1 + CH + k + w + ANDL b, R15 \ // y2 = a&c + \ + \ // compute low s1 + \ + LONG $0xd7700f66; BYTE $0xfa \ // PSHUFD XMM2,XMM7,0xfa /* XTMP2 = W[-2] {BBAA} */ + ANDL a, R13 \ // y0 = (a|c)&b + ADDL R14, g \ // h = h + S1 + CH + k + w + S0 + LONG $0xc1fe0f66 \ // PADDD XMM0,XMM1 /* XTMP0 = W[-16] + W[-7] + s0 */ + ORL R15, R13 \ // y0 = MAJ = (a|c)&b)|(a&c) + ADDL R13, g \ // h = h + S1 + CH + k + w + S0 + MAJ + \ // ROTATE_ARGS + MOVL c, R13 \ // y0 = e + MOVL g, R14 \ // y1 = a + ROLL $18, R13 \ // y0 = e >> (25-11) + XORL c, R13 \ // y0 = e ^ (e >> (25-11)) + ROLL $23, R14 \ // y1 = a >> (22-13) + MOVL d, R15 \ // y2 = f + XORL g, R14 \ // y1 = a ^ (a >> (22-13) + ROLL $27, R13 \ // y0 = (e >> (11-6)) ^ (e >> (25-6)) + MOVOU X2, X8 \ + LONG $0x720f4166; WORD $0x0ad0 \ // PSRLD XMM8,0xa /* XTMP4 = W[-2] >> 10 {BBAA} */ + XORL e, R15 \ // y2 = f^g + MOVOU X2, X3 \ + LONG $0xd3730f66; BYTE $0x13 \ // PSRLQ XMM3,0x13 /* XTMP3 = W[-2] MY_ROR 19 {xBxA} */ + XORL c, R13 \ // y0 = e ^ (e >> (11-6)) ^ (e >> (25-6)) + ANDL c, R15 \ // y2 = (f^g)&e + LONG $0xd2730f66; BYTE $0x11 \ // PSRLQ XMM2,0x11 /* XTMP2 = W[-2] MY_ROR 17 {xBxA} */ + ROLL $21, R14 \ // y1 = (a >> (13-2)) ^ (a >> (22-2)) + XORL g, R14 \ // y1 = a ^ (a >> (13-2)) ^ (a >> (22-2)) + XORL e, R15 \ // y2 = CH = ((f^g)&e)^g + ROLL $26, R13 \ // y0 = S1 = (e>>6) & (e>>11) ^ (e>>25) + LONG $0xd3ef0f66 \ // PXOR XMM2,XMM3 /* */ + ADDL R13, R15 \ // y2 = S1 + CH + ROLL $30, R14 \ // y1 = S0 = (a>>2) ^ (a>>13) ^ (a>>22) + ADDL _xfer+56(FP), R15 \ // y2 = k + w + S1 + CH + LONG $0xef0f4466; BYTE $0xc2 \ // PXOR XMM8,XMM2 /* XTMP4 = s1 {xBxA} */ + MOVL g, R13 \ // y0 = a + ADDL R15, f \ // h = h + S1 + CH + k + w + MOVL g, R15 \ // y2 = a + LONG $0x380f4566; WORD $0xc200 \ // PSHUFB XMM8,XMM10 /* XTMP4 = s1 {00BA} */ + ORL a, R13 \ // y0 = a|c + ADDL f, b \ // d = d + h + S1 + CH + k + w + ANDL a, R15 \ // y2 = a&c + LONG $0xfe0f4166; BYTE $0xc0 \ // PADDD XMM0,XMM8 /* XTMP0 = {..., ..., W[1], W[0]} */ + ANDL h, R13 \ // y0 = (a|c)&b + ADDL R14, f \ // h = h + S1 + CH + k + w + S0 + \ + \ // compute high s1 + \ + LONG $0xd0700f66; BYTE $0x50 \ // PSHUFD XMM2,XMM0,0x50 /* XTMP2 = W[-2] {DDCC} */ + ORL R15, R13 \ // y0 = MAJ = (a|c)&b)|(a&c) + ADDL R13, f \ // h = h + S1 + CH + k + w + S0 + MAJ + \ // ROTATE_ARGS + MOVL b, R13 \ // y0 = e + ROLL $18, R13 \ // y0 = e >> (25-11) + MOVL f, R14 \ // y1 = a + ROLL $23, R14 \ // y1 = a >> (22-13) + XORL b, R13 \ // y0 = e ^ (e >> (25-11)) + MOVL c, R15 \ // y2 = f + ROLL $27, R13 \ // y0 = (e >> (11-6)) ^ (e >> (25-6)) + MOVOU X2, X11 \ + LONG $0x720f4166; WORD $0x0ad3 \ // PSRLD XMM11,0xa /* XTMP5 = W[-2] >> 10 {DDCC} */ + XORL f, R14 \ // y1 = a ^ (a >> (22-13) + XORL d, R15 \ // y2 = f^g + MOVOU X2, X3 \ + LONG $0xd3730f66; BYTE $0x13 \ // PSRLQ XMM3,0x13 /* XTMP3 = W[-2] MY_ROR 19 {xDxC} */ + XORL b, R13 \ // y0 = e ^ (e >> (11-6)) ^ (e >> (25-6)) + ANDL b, R15 \ // y2 = (f^g)&e + ROLL $21, R14 \ // y1 = (a >> (13-2)) ^ (a >> (22-2)) + LONG $0xd2730f66; BYTE $0x11 \ // PSRLQ XMM2,0x11 /* XTMP2 = W[-2] MY_ROR 17 {xDxC} */ + XORL f, R14 \ // y1 = a ^ (a >> (13-2)) ^ (a >> (22-2)) + ROLL $26, R13 \ // y0 = S1 = (e>>6) & (e>>11) ^ (e>>25) + XORL d, R15 \ // y2 = CH = ((f^g)&e)^g + LONG $0xd3ef0f66 \ // PXOR XMM2,XMM3 /* */ + ROLL $30, R14 \ // y1 = S0 = (a>>2) ^ (a>>13) ^ (a>>22) + ADDL R13, R15 \ // y2 = S1 + CH + ADDL _xfer+60(FP), R15 \ // y2 = k + w + S1 + CH + LONG $0xef0f4466; BYTE $0xda \ // PXOR XMM11,XMM2 /* XTMP5 = s1 {xDxC} */ + MOVL f, R13 \ // y0 = a + ADDL R15, e \ // h = h + S1 + CH + k + w + MOVL f, R15 \ // y2 = a + LONG $0x380f4566; WORD $0xdc00 \ // PSHUFB XMM11,XMM12 /* XTMP5 = s1 {DC00} */ + ORL h, R13 \ // y0 = a|c + ADDL e, a \ // d = d + h + S1 + CH + k + w + ANDL h, R15 \ // y2 = a&c + MOVOU X11, X4 \ + LONG $0xe0fe0f66 \ // PADDD XMM4,XMM0 /* X0 = {W[3], W[2], W[1], W[0]} */ + ANDL g, R13 \ // y0 = (a|c)&b + ADDL R14, e \ // h = h + S1 + CH + k + w + S0 + ORL R15, R13 \ // y0 = MAJ = (a|c)&b)|(a&c) + ADDL R13, e \ // h = h + S1 + CH + k + w + S0 + MAJ + \ // ROTATE_ARGS + ROTATE_XS + +#define DO_ROUND(a, b, c, d, e, f, g, h, offset) \ + MOVL e, R13 \ // y0 = e + ROLL $18, R13 \ // y0 = e >> (25-11) + MOVL a, R14 \ // y1 = a + XORL e, R13 \ // y0 = e ^ (e >> (25-11)) + ROLL $23, R14 \ // y1 = a >> (22-13) + MOVL f, R15 \ // y2 = f + XORL a, R14 \ // y1 = a ^ (a >> (22-13) + ROLL $27, R13 \ // y0 = (e >> (11-6)) ^ (e >> (25-6)) + XORL g, R15 \ // y2 = f^g + XORL e, R13 \ // y0 = e ^ (e >> (11-6)) ^ (e >> (25-6)) + ROLL $21, R14 \ // y1 = (a >> (13-2)) ^ (a >> (22-2)) + ANDL e, R15 \ // y2 = (f^g)&e + XORL a, R14 \ // y1 = a ^ (a >> (13-2)) ^ (a >> (22-2)) + ROLL $26, R13 \ // y0 = S1 = (e>>6) & (e>>11) ^ (e>>25) + XORL g, R15 \ // y2 = CH = ((f^g)&e)^g + ADDL R13, R15 \ // y2 = S1 + CH + ROLL $30, R14 \ // y1 = S0 = (a>>2) ^ (a>>13) ^ (a>>22) + ADDL _xfer+offset(FP), R15 \ // y2 = k + w + S1 + CH + MOVL a, R13 \ // y0 = a + ADDL R15, h \ // h = h + S1 + CH + k + w + MOVL a, R15 \ // y2 = a + ORL c, R13 \ // y0 = a|c + ADDL h, d \ // d = d + h + S1 + CH + k + w + ANDL c, R15 \ // y2 = a&c + ANDL b, R13 \ // y0 = (a|c)&b + ADDL R14, h \ // h = h + S1 + CH + k + w + S0 + ORL R15, R13 \ // y0 = MAJ = (a|c)&b)|(a&c) + ADDL R13, h // h = h + S1 + CH + k + w + S0 + MAJ + +// func blockSsse(h []uint32, message []uint8, reserved0, reserved1, reserved2, reserved3 uint64) +TEXT ·blockSsse(SB), 7, $0-80 + + MOVQ h+0(FP), SI // SI: &h + MOVQ message_base+24(FP), R8 // &message + MOVQ message_len+32(FP), R9 // length of message + CMPQ R9, $0 + JEQ done_hash + ADDQ R8, R9 + MOVQ R9, reserved2+64(FP) // store end of message + + // Register definition + // a --> eax + // b --> ebx + // c --> ecx + // d --> r8d + // e --> edx + // f --> r9d + // g --> r10d + // h --> r11d + // + // y0 --> r13d + // y1 --> r14d + // y2 --> r15d + + MOVL (0*4)(SI), AX // a = H0 + MOVL (1*4)(SI), BX // b = H1 + MOVL (2*4)(SI), CX // c = H2 + MOVL (3*4)(SI), R8 // d = H3 + MOVL (4*4)(SI), DX // e = H4 + MOVL (5*4)(SI), R9 // f = H5 + MOVL (6*4)(SI), R10 // g = H6 + MOVL (7*4)(SI), R11 // h = H7 + + MOVOU bflipMask<>(SB), X13 + MOVOU shuf00BA<>(SB), X10 // shuffle xBxA -> 00BA + MOVOU shufDC00<>(SB), X12 // shuffle xDxC -> DC00 + + MOVQ message_base+24(FP), SI // SI: &message + +loop0: + LEAQ constants<>(SB), BP + + // byte swap first 16 dwords + MOVOU 0*16(SI), X4 + LONG $0x380f4166; WORD $0xe500 // PSHUFB XMM4, XMM13 + MOVOU 1*16(SI), X5 + LONG $0x380f4166; WORD $0xed00 // PSHUFB XMM5, XMM13 + MOVOU 2*16(SI), X6 + LONG $0x380f4166; WORD $0xf500 // PSHUFB XMM6, XMM13 + MOVOU 3*16(SI), X7 + LONG $0x380f4166; WORD $0xfd00 // PSHUFB XMM7, XMM13 + + MOVQ SI, reserved3+72(FP) + MOVD $0x3, DI + + // Align + // nop WORD PTR [rax+rax*1+0x0] + + // schedule 48 input dwords, by doing 3 rounds of 16 each +loop1: + MOVOU X4, X9 + LONG $0xfe0f4466; WORD $0x004d // PADDD XMM9, 0[RBP] /* Add 1st constant to first part of message */ + MOVOU X9, reserved0+48(FP) + FOUR_ROUNDS_AND_SCHED(AX, BX, CX, R8, DX, R9, R10, R11) + + MOVOU X4, X9 + LONG $0xfe0f4466; WORD $0x104d // PADDD XMM9, 16[RBP] /* Add 2nd constant to message */ + MOVOU X9, reserved0+48(FP) + FOUR_ROUNDS_AND_SCHED(DX, R9, R10, R11, AX, BX, CX, R8) + + MOVOU X4, X9 + LONG $0xfe0f4466; WORD $0x204d // PADDD XMM9, 32[RBP] /* Add 3rd constant to message */ + MOVOU X9, reserved0+48(FP) + FOUR_ROUNDS_AND_SCHED(AX, BX, CX, R8, DX, R9, R10, R11) + + MOVOU X4, X9 + LONG $0xfe0f4466; WORD $0x304d // PADDD XMM9, 48[RBP] /* Add 4th constant to message */ + MOVOU X9, reserved0+48(FP) + ADDQ $64, BP + FOUR_ROUNDS_AND_SCHED(DX, R9, R10, R11, AX, BX, CX, R8) + + SUBQ $1, DI + JNE loop1 + + MOVD $0x2, DI + +loop2: + MOVOU X4, X9 + LONG $0xfe0f4466; WORD $0x004d // PADDD XMM9, 0[RBP] /* Add 1st constant to first part of message */ + MOVOU X9, reserved0+48(FP) + DO_ROUND( AX, BX, CX, R8, DX, R9, R10, R11, 48) + DO_ROUND(R11, AX, BX, CX, R8, DX, R9, R10, 52) + DO_ROUND(R10, R11, AX, BX, CX, R8, DX, R9, 56) + DO_ROUND( R9, R10, R11, AX, BX, CX, R8, DX, 60) + + MOVOU X5, X9 + LONG $0xfe0f4466; WORD $0x104d // PADDD XMM9, 16[RBP] /* Add 2nd constant to message */ + MOVOU X9, reserved0+48(FP) + ADDQ $32, BP + DO_ROUND( DX, R9, R10, R11, AX, BX, CX, R8, 48) + DO_ROUND( R8, DX, R9, R10, R11, AX, BX, CX, 52) + DO_ROUND( CX, R8, DX, R9, R10, R11, AX, BX, 56) + DO_ROUND( BX, CX, R8, DX, R9, R10, R11, AX, 60) + + MOVOU X6, X4 + MOVOU X7, X5 + + SUBQ $1, DI + JNE loop2 + + MOVQ h+0(FP), SI // SI: &h + ADDL (0*4)(SI), AX // H0 = a + H0 + MOVL AX, (0*4)(SI) + ADDL (1*4)(SI), BX // H1 = b + H1 + MOVL BX, (1*4)(SI) + ADDL (2*4)(SI), CX // H2 = c + H2 + MOVL CX, (2*4)(SI) + ADDL (3*4)(SI), R8 // H3 = d + H3 + MOVL R8, (3*4)(SI) + ADDL (4*4)(SI), DX // H4 = e + H4 + MOVL DX, (4*4)(SI) + ADDL (5*4)(SI), R9 // H5 = f + H5 + MOVL R9, (5*4)(SI) + ADDL (6*4)(SI), R10 // H6 = g + H6 + MOVL R10, (6*4)(SI) + ADDL (7*4)(SI), R11 // H7 = h + H7 + MOVL R11, (7*4)(SI) + + MOVQ reserved3+72(FP), SI + ADDQ $64, SI + CMPQ reserved2+64(FP), SI + JNE loop0 + +done_hash: + RET + +// Constants table +DATA constants<>+0x0(SB)/8, $0x71374491428a2f98 +DATA constants<>+0x8(SB)/8, $0xe9b5dba5b5c0fbcf +DATA constants<>+0x10(SB)/8, $0x59f111f13956c25b +DATA constants<>+0x18(SB)/8, $0xab1c5ed5923f82a4 +DATA constants<>+0x20(SB)/8, $0x12835b01d807aa98 +DATA constants<>+0x28(SB)/8, $0x550c7dc3243185be +DATA constants<>+0x30(SB)/8, $0x80deb1fe72be5d74 +DATA constants<>+0x38(SB)/8, $0xc19bf1749bdc06a7 +DATA constants<>+0x40(SB)/8, $0xefbe4786e49b69c1 +DATA constants<>+0x48(SB)/8, $0x240ca1cc0fc19dc6 +DATA constants<>+0x50(SB)/8, $0x4a7484aa2de92c6f +DATA constants<>+0x58(SB)/8, $0x76f988da5cb0a9dc +DATA constants<>+0x60(SB)/8, $0xa831c66d983e5152 +DATA constants<>+0x68(SB)/8, $0xbf597fc7b00327c8 +DATA constants<>+0x70(SB)/8, $0xd5a79147c6e00bf3 +DATA constants<>+0x78(SB)/8, $0x1429296706ca6351 +DATA constants<>+0x80(SB)/8, $0x2e1b213827b70a85 +DATA constants<>+0x88(SB)/8, $0x53380d134d2c6dfc +DATA constants<>+0x90(SB)/8, $0x766a0abb650a7354 +DATA constants<>+0x98(SB)/8, $0x92722c8581c2c92e +DATA constants<>+0xa0(SB)/8, $0xa81a664ba2bfe8a1 +DATA constants<>+0xa8(SB)/8, $0xc76c51a3c24b8b70 +DATA constants<>+0xb0(SB)/8, $0xd6990624d192e819 +DATA constants<>+0xb8(SB)/8, $0x106aa070f40e3585 +DATA constants<>+0xc0(SB)/8, $0x1e376c0819a4c116 +DATA constants<>+0xc8(SB)/8, $0x34b0bcb52748774c +DATA constants<>+0xd0(SB)/8, $0x4ed8aa4a391c0cb3 +DATA constants<>+0xd8(SB)/8, $0x682e6ff35b9cca4f +DATA constants<>+0xe0(SB)/8, $0x78a5636f748f82ee +DATA constants<>+0xe8(SB)/8, $0x8cc7020884c87814 +DATA constants<>+0xf0(SB)/8, $0xa4506ceb90befffa +DATA constants<>+0xf8(SB)/8, $0xc67178f2bef9a3f7 + +DATA bflipMask<>+0x00(SB)/8, $0x0405060700010203 +DATA bflipMask<>+0x08(SB)/8, $0x0c0d0e0f08090a0b + +DATA shuf00BA<>+0x00(SB)/8, $0x0b0a090803020100 +DATA shuf00BA<>+0x08(SB)/8, $0xFFFFFFFFFFFFFFFF + +DATA shufDC00<>+0x00(SB)/8, $0xFFFFFFFFFFFFFFFF +DATA shufDC00<>+0x08(SB)/8, $0x0b0a090803020100 + +GLOBL constants<>(SB), 8, $256 +GLOBL bflipMask<>(SB), (NOPTR+RODATA), $16 +GLOBL shuf00BA<>(SB), (NOPTR+RODATA), $16 +GLOBL shufDC00<>(SB), (NOPTR+RODATA), $16 diff --git a/vendor/github.com/minio/sha256-simd/sha256block_amd64.go b/vendor/github.com/minio/sha256-simd/sha256block_amd64.go new file mode 100644 index 000000000..1c4d97f0c --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/sha256block_amd64.go @@ -0,0 +1,53 @@ +//+build !noasm,!appengine + +/* + * Minio Cloud Storage, (C) 2016 Minio, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package sha256 + +func blockArmGo(dig *digest, p []byte) {} + +func blockAvxGo(dig *digest, p []byte) { + + h := []uint32{dig.h[0], dig.h[1], dig.h[2], dig.h[3], dig.h[4], dig.h[5], dig.h[6], dig.h[7]} + + blockAvx(h[:], p[:], 0, 0, 0, 0) + + dig.h[0], dig.h[1], dig.h[2], dig.h[3], dig.h[4], dig.h[5], dig.h[6], dig.h[7] = h[0], h[1], h[2], h[3], h[4], h[5], h[6], h[7] +} + +func blockAvx2Go(dig *digest, p []byte) { + + h := []uint32{dig.h[0], dig.h[1], dig.h[2], dig.h[3], dig.h[4], dig.h[5], dig.h[6], dig.h[7]} + + blockAvx2(h[:], p[:]) + + dig.h[0], dig.h[1], dig.h[2], dig.h[3], dig.h[4], dig.h[5], dig.h[6], dig.h[7] = h[0], h[1], h[2], h[3], h[4], h[5], h[6], h[7] +} + +func blockSsseGo(dig *digest, p []byte) { + + h := []uint32{dig.h[0], dig.h[1], dig.h[2], dig.h[3], dig.h[4], dig.h[5], dig.h[6], dig.h[7]} + + blockSsse(h[:], p[:], 0, 0, 0, 0) + + dig.h[0], dig.h[1], dig.h[2], dig.h[3], dig.h[4], dig.h[5], dig.h[6], dig.h[7] = h[0], h[1], h[2], h[3], h[4], h[5], h[6], h[7] +} + +func blockShaGo(dig *digest, p []byte) { + + blockSha(&dig.h, p) +} diff --git a/vendor/github.com/minio/sha256-simd/sha256block_arm64.go b/vendor/github.com/minio/sha256-simd/sha256block_arm64.go new file mode 100644 index 000000000..0979c20ae --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/sha256block_arm64.go @@ -0,0 +1,37 @@ +//+build !noasm,!appengine + +/* + * Minio Cloud Storage, (C) 2016 Minio, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package sha256 + +func blockAvx2Go(dig *digest, p []byte) {} +func blockAvxGo(dig *digest, p []byte) {} +func blockSsseGo(dig *digest, p []byte) {} +func blockShaGo(dig *digest, p []byte) {} + +//go:noescape +func blockArm(h []uint32, message []uint8) + +func blockArmGo(dig *digest, p []byte) { + + h := []uint32{dig.h[0], dig.h[1], dig.h[2], dig.h[3], dig.h[4], dig.h[5], dig.h[6], dig.h[7]} + + blockArm(h[:], p[:]) + + dig.h[0], dig.h[1], dig.h[2], dig.h[3], dig.h[4], dig.h[5], dig.h[6], dig.h[7] = h[0], h[1], h[2], h[3], h[4], + h[5], h[6], h[7] +} diff --git a/vendor/github.com/minio/sha256-simd/sha256block_arm64.s b/vendor/github.com/minio/sha256-simd/sha256block_arm64.s new file mode 100644 index 000000000..c6ddb3717 --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/sha256block_arm64.s @@ -0,0 +1,192 @@ +//+build !noasm,!appengine + +// ARM64 version of SHA256 + +// +// Minio Cloud Storage, (C) 2016 Minio, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +// +// Based on implementation as found in https://github.com/jocover/sha256-armv8 +// +// Use github.com/minio/asm2plan9s on this file to assemble ARM instructions to +// their Plan9 equivalents +// + +TEXT ·blockArm(SB), 7, $0 + MOVD h+0(FP), R0 + MOVD message+24(FP), R1 + MOVD message_len+32(FP), R2 // length of message + SUBS $64, R2 + BMI complete + + // Load constants table pointer + MOVD $·constants(SB), R3 + + // Cache constants table in registers v16 - v31 + WORD $0x4cdf2870 // ld1 {v16.4s-v19.4s}, [x3], #64 + WORD $0x4cdf7800 // ld1 {v0.4s}, [x0], #16 + WORD $0x4cdf2874 // ld1 {v20.4s-v23.4s}, [x3], #64 + + WORD $0x4c407801 // ld1 {v1.4s}, [x0] + WORD $0x4cdf2878 // ld1 {v24.4s-v27.4s}, [x3], #64 + WORD $0xd1004000 // sub x0, x0, #0x10 + WORD $0x4cdf287c // ld1 {v28.4s-v31.4s}, [x3], #64 + +loop: + // Main loop + WORD $0x4cdf2025 // ld1 {v5.16b-v8.16b}, [x1], #64 + WORD $0x4ea01c02 // mov v2.16b, v0.16b + WORD $0x4ea11c23 // mov v3.16b, v1.16b + WORD $0x6e2008a5 // rev32 v5.16b, v5.16b + WORD $0x6e2008c6 // rev32 v6.16b, v6.16b + WORD $0x4eb084a9 // add v9.4s, v5.4s, v16.4s + WORD $0x6e2008e7 // rev32 v7.16b, v7.16b + WORD $0x4eb184ca // add v10.4s, v6.4s, v17.4s + WORD $0x4ea21c44 // mov v4.16b, v2.16b + WORD $0x5e094062 // sha256h q2, q3, v9.4s + WORD $0x5e095083 // sha256h2 q3, q4, v9.4s + WORD $0x5e2828c5 // sha256su0 v5.4s, v6.4s + WORD $0x6e200908 // rev32 v8.16b, v8.16b + WORD $0x4eb284e9 // add v9.4s, v7.4s, v18.4s + WORD $0x4ea21c44 // mov v4.16b, v2.16b + WORD $0x5e0a4062 // sha256h q2, q3, v10.4s + WORD $0x5e0a5083 // sha256h2 q3, q4, v10.4s + WORD $0x5e2828e6 // sha256su0 v6.4s, v7.4s + WORD $0x5e0860e5 // sha256su1 v5.4s, v7.4s, v8.4s + WORD $0x4eb3850a // add v10.4s, v8.4s, v19.4s + WORD $0x4ea21c44 // mov v4.16b, v2.16b + WORD $0x5e094062 // sha256h q2, q3, v9.4s + WORD $0x5e095083 // sha256h2 q3, q4, v9.4s + WORD $0x5e282907 // sha256su0 v7.4s, v8.4s + WORD $0x5e056106 // sha256su1 v6.4s, v8.4s, v5.4s + WORD $0x4eb484a9 // add v9.4s, v5.4s, v20.4s + WORD $0x4ea21c44 // mov v4.16b, v2.16b + WORD $0x5e0a4062 // sha256h q2, q3, v10.4s + WORD $0x5e0a5083 // sha256h2 q3, q4, v10.4s + WORD $0x5e2828a8 // sha256su0 v8.4s, v5.4s + WORD $0x5e0660a7 // sha256su1 v7.4s, v5.4s, v6.4s + WORD $0x4eb584ca // add v10.4s, v6.4s, v21.4s + WORD $0x4ea21c44 // mov v4.16b, v2.16b + WORD $0x5e094062 // sha256h q2, q3, v9.4s + WORD $0x5e095083 // sha256h2 q3, q4, v9.4s + WORD $0x5e2828c5 // sha256su0 v5.4s, v6.4s + WORD $0x5e0760c8 // sha256su1 v8.4s, v6.4s, v7.4s + WORD $0x4eb684e9 // add v9.4s, v7.4s, v22.4s + WORD $0x4ea21c44 // mov v4.16b, v2.16b + WORD $0x5e0a4062 // sha256h q2, q3, v10.4s + WORD $0x5e0a5083 // sha256h2 q3, q4, v10.4s + WORD $0x5e2828e6 // sha256su0 v6.4s, v7.4s + WORD $0x5e0860e5 // sha256su1 v5.4s, v7.4s, v8.4s + WORD $0x4eb7850a // add v10.4s, v8.4s, v23.4s + WORD $0x4ea21c44 // mov v4.16b, v2.16b + WORD $0x5e094062 // sha256h q2, q3, v9.4s + WORD $0x5e095083 // sha256h2 q3, q4, v9.4s + WORD $0x5e282907 // sha256su0 v7.4s, v8.4s + WORD $0x5e056106 // sha256su1 v6.4s, v8.4s, v5.4s + WORD $0x4eb884a9 // add v9.4s, v5.4s, v24.4s + WORD $0x4ea21c44 // mov v4.16b, v2.16b + WORD $0x5e0a4062 // sha256h q2, q3, v10.4s + WORD $0x5e0a5083 // sha256h2 q3, q4, v10.4s + WORD $0x5e2828a8 // sha256su0 v8.4s, v5.4s + WORD $0x5e0660a7 // sha256su1 v7.4s, v5.4s, v6.4s + WORD $0x4eb984ca // add v10.4s, v6.4s, v25.4s + WORD $0x4ea21c44 // mov v4.16b, v2.16b + WORD $0x5e094062 // sha256h q2, q3, v9.4s + WORD $0x5e095083 // sha256h2 q3, q4, v9.4s + WORD $0x5e2828c5 // sha256su0 v5.4s, v6.4s + WORD $0x5e0760c8 // sha256su1 v8.4s, v6.4s, v7.4s + WORD $0x4eba84e9 // add v9.4s, v7.4s, v26.4s + WORD $0x4ea21c44 // mov v4.16b, v2.16b + WORD $0x5e0a4062 // sha256h q2, q3, v10.4s + WORD $0x5e0a5083 // sha256h2 q3, q4, v10.4s + WORD $0x5e2828e6 // sha256su0 v6.4s, v7.4s + WORD $0x5e0860e5 // sha256su1 v5.4s, v7.4s, v8.4s + WORD $0x4ebb850a // add v10.4s, v8.4s, v27.4s + WORD $0x4ea21c44 // mov v4.16b, v2.16b + WORD $0x5e094062 // sha256h q2, q3, v9.4s + WORD $0x5e095083 // sha256h2 q3, q4, v9.4s + WORD $0x5e282907 // sha256su0 v7.4s, v8.4s + WORD $0x5e056106 // sha256su1 v6.4s, v8.4s, v5.4s + WORD $0x4ebc84a9 // add v9.4s, v5.4s, v28.4s + WORD $0x4ea21c44 // mov v4.16b, v2.16b + WORD $0x5e0a4062 // sha256h q2, q3, v10.4s + WORD $0x5e0a5083 // sha256h2 q3, q4, v10.4s + WORD $0x5e2828a8 // sha256su0 v8.4s, v5.4s + WORD $0x5e0660a7 // sha256su1 v7.4s, v5.4s, v6.4s + WORD $0x4ebd84ca // add v10.4s, v6.4s, v29.4s + WORD $0x4ea21c44 // mov v4.16b, v2.16b + WORD $0x5e094062 // sha256h q2, q3, v9.4s + WORD $0x5e095083 // sha256h2 q3, q4, v9.4s + WORD $0x5e0760c8 // sha256su1 v8.4s, v6.4s, v7.4s + WORD $0x4ebe84e9 // add v9.4s, v7.4s, v30.4s + WORD $0x4ea21c44 // mov v4.16b, v2.16b + WORD $0x5e0a4062 // sha256h q2, q3, v10.4s + WORD $0x5e0a5083 // sha256h2 q3, q4, v10.4s + WORD $0x4ebf850a // add v10.4s, v8.4s, v31.4s + WORD $0x4ea21c44 // mov v4.16b, v2.16b + WORD $0x5e094062 // sha256h q2, q3, v9.4s + WORD $0x5e095083 // sha256h2 q3, q4, v9.4s + WORD $0x4ea21c44 // mov v4.16b, v2.16b + WORD $0x5e0a4062 // sha256h q2, q3, v10.4s + WORD $0x5e0a5083 // sha256h2 q3, q4, v10.4s + WORD $0x4ea38421 // add v1.4s, v1.4s, v3.4s + WORD $0x4ea28400 // add v0.4s, v0.4s, v2.4s + + SUBS $64, R2 + BPL loop + + // Store result + WORD $0x4c00a800 // st1 {v0.4s, v1.4s}, [x0] + +complete: + RET + +// Constants table +DATA ·constants+0x0(SB)/8, $0x71374491428a2f98 +DATA ·constants+0x8(SB)/8, $0xe9b5dba5b5c0fbcf +DATA ·constants+0x10(SB)/8, $0x59f111f13956c25b +DATA ·constants+0x18(SB)/8, $0xab1c5ed5923f82a4 +DATA ·constants+0x20(SB)/8, $0x12835b01d807aa98 +DATA ·constants+0x28(SB)/8, $0x550c7dc3243185be +DATA ·constants+0x30(SB)/8, $0x80deb1fe72be5d74 +DATA ·constants+0x38(SB)/8, $0xc19bf1749bdc06a7 +DATA ·constants+0x40(SB)/8, $0xefbe4786e49b69c1 +DATA ·constants+0x48(SB)/8, $0x240ca1cc0fc19dc6 +DATA ·constants+0x50(SB)/8, $0x4a7484aa2de92c6f +DATA ·constants+0x58(SB)/8, $0x76f988da5cb0a9dc +DATA ·constants+0x60(SB)/8, $0xa831c66d983e5152 +DATA ·constants+0x68(SB)/8, $0xbf597fc7b00327c8 +DATA ·constants+0x70(SB)/8, $0xd5a79147c6e00bf3 +DATA ·constants+0x78(SB)/8, $0x1429296706ca6351 +DATA ·constants+0x80(SB)/8, $0x2e1b213827b70a85 +DATA ·constants+0x88(SB)/8, $0x53380d134d2c6dfc +DATA ·constants+0x90(SB)/8, $0x766a0abb650a7354 +DATA ·constants+0x98(SB)/8, $0x92722c8581c2c92e +DATA ·constants+0xa0(SB)/8, $0xa81a664ba2bfe8a1 +DATA ·constants+0xa8(SB)/8, $0xc76c51a3c24b8b70 +DATA ·constants+0xb0(SB)/8, $0xd6990624d192e819 +DATA ·constants+0xb8(SB)/8, $0x106aa070f40e3585 +DATA ·constants+0xc0(SB)/8, $0x1e376c0819a4c116 +DATA ·constants+0xc8(SB)/8, $0x34b0bcb52748774c +DATA ·constants+0xd0(SB)/8, $0x4ed8aa4a391c0cb3 +DATA ·constants+0xd8(SB)/8, $0x682e6ff35b9cca4f +DATA ·constants+0xe0(SB)/8, $0x78a5636f748f82ee +DATA ·constants+0xe8(SB)/8, $0x8cc7020884c87814 +DATA ·constants+0xf0(SB)/8, $0xa4506ceb90befffa +DATA ·constants+0xf8(SB)/8, $0xc67178f2bef9a3f7 + +GLOBL ·constants(SB), 8, $256 + diff --git a/vendor/github.com/minio/sha256-simd/sha256block_other.go b/vendor/github.com/minio/sha256-simd/sha256block_other.go new file mode 100644 index 000000000..0187c950a --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/sha256block_other.go @@ -0,0 +1,25 @@ +//+build appengine noasm !amd64,!arm64 + +/* + * Minio Cloud Storage, (C) 2019 Minio, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package sha256 + +func blockAvx2Go(dig *digest, p []byte) {} +func blockAvxGo(dig *digest, p []byte) {} +func blockSsseGo(dig *digest, p []byte) {} +func blockShaGo(dig *digest, p []byte) {} +func blockArmGo(dig *digest, p []byte) {} diff --git a/vendor/github.com/minio/sha256-simd/test-architectures.sh b/vendor/github.com/minio/sha256-simd/test-architectures.sh new file mode 100644 index 000000000..50150eaab --- /dev/null +++ b/vendor/github.com/minio/sha256-simd/test-architectures.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +set -e + +go tool dist list | while IFS=/ read os arch; do + echo "Checking $os/$arch..." + echo " normal" + GOARCH=$arch GOOS=$os go build -o /dev/null ./... + echo " noasm" + GOARCH=$arch GOOS=$os go build -tags noasm -o /dev/null ./... + echo " appengine" + GOARCH=$arch GOOS=$os go build -tags appengine -o /dev/null ./... + echo " noasm,appengine" + GOARCH=$arch GOOS=$os go build -tags 'appengine noasm' -o /dev/null ./... +done diff --git a/vendor/github.com/mitchellh/go-homedir/go.mod b/vendor/github.com/mitchellh/go-homedir/go.mod new file mode 100644 index 000000000..7efa09a04 --- /dev/null +++ b/vendor/github.com/mitchellh/go-homedir/go.mod @@ -0,0 +1 @@ +module github.com/mitchellh/go-homedir diff --git a/vendor/github.com/mitchellh/go-homedir/homedir.go b/vendor/github.com/mitchellh/go-homedir/homedir.go index 47e1f9ef8..25378537e 100644 --- a/vendor/github.com/mitchellh/go-homedir/homedir.go +++ b/vendor/github.com/mitchellh/go-homedir/homedir.go @@ -76,34 +76,62 @@ func Expand(path string) (string, error) { return filepath.Join(dir, path[1:]), nil } +// Reset clears the cache, forcing the next call to Dir to re-detect +// the home directory. This generally never has to be called, but can be +// useful in tests if you're modifying the home directory via the HOME +// env var or something. +func Reset() { + cacheLock.Lock() + defer cacheLock.Unlock() + homedirCache = "" +} + func dirUnix() (string, error) { + homeEnv := "HOME" + if runtime.GOOS == "plan9" { + // On plan9, env vars are lowercase. + homeEnv = "home" + } + // First prefer the HOME environmental variable - if home := os.Getenv("HOME"); home != "" { + if home := os.Getenv(homeEnv); home != "" { return home, nil } - // If that fails, try getent var stdout bytes.Buffer - cmd := exec.Command("getent", "passwd", strconv.Itoa(os.Getuid())) - cmd.Stdout = &stdout - if err := cmd.Run(); err != nil { - // If the error is ErrNotFound, we ignore it. Otherwise, return it. - if err != exec.ErrNotFound { - return "", err + + // If that fails, try OS specific commands + if runtime.GOOS == "darwin" { + cmd := exec.Command("sh", "-c", `dscl -q . -read /Users/"$(whoami)" NFSHomeDirectory | sed 's/^[^ ]*: //'`) + cmd.Stdout = &stdout + if err := cmd.Run(); err == nil { + result := strings.TrimSpace(stdout.String()) + if result != "" { + return result, nil + } } } else { - if passwd := strings.TrimSpace(stdout.String()); passwd != "" { - // username:password:uid:gid:gecos:home:shell - passwdParts := strings.SplitN(passwd, ":", 7) - if len(passwdParts) > 5 { - return passwdParts[5], nil + cmd := exec.Command("getent", "passwd", strconv.Itoa(os.Getuid())) + cmd.Stdout = &stdout + if err := cmd.Run(); err != nil { + // If the error is ErrNotFound, we ignore it. Otherwise, return it. + if err != exec.ErrNotFound { + return "", err + } + } else { + if passwd := strings.TrimSpace(stdout.String()); passwd != "" { + // username:password:uid:gid:gecos:home:shell + passwdParts := strings.SplitN(passwd, ":", 7) + if len(passwdParts) > 5 { + return passwdParts[5], nil + } } } } // If all else fails, try the shell stdout.Reset() - cmd = exec.Command("sh", "-c", "cd && pwd") + cmd := exec.Command("sh", "-c", "cd && pwd") cmd.Stdout = &stdout if err := cmd.Run(); err != nil { return "", err @@ -123,14 +151,16 @@ func dirWindows() (string, error) { return home, nil } + // Prefer standard environment variable USERPROFILE + if home := os.Getenv("USERPROFILE"); home != "" { + return home, nil + } + drive := os.Getenv("HOMEDRIVE") path := os.Getenv("HOMEPATH") home := drive + path if drive == "" || path == "" { - home = os.Getenv("USERPROFILE") - } - if home == "" { - return "", errors.New("HOMEDRIVE, HOMEPATH, and USERPROFILE are blank") + return "", errors.New("HOMEDRIVE, HOMEPATH, or USERPROFILE are blank") } return home, nil diff --git a/vendor/github.com/modern-go/concurrent/.gitignore b/vendor/github.com/modern-go/concurrent/.gitignore new file mode 100644 index 000000000..3f2bc4741 --- /dev/null +++ b/vendor/github.com/modern-go/concurrent/.gitignore @@ -0,0 +1 @@ +/coverage.txt diff --git a/vendor/github.com/modern-go/concurrent/.travis.yml b/vendor/github.com/modern-go/concurrent/.travis.yml new file mode 100644 index 000000000..449e67cd0 --- /dev/null +++ b/vendor/github.com/modern-go/concurrent/.travis.yml @@ -0,0 +1,14 @@ +language: go + +go: + - 1.8.x + - 1.x + +before_install: + - go get -t -v ./... + +script: + - ./test.sh + +after_success: + - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/modern-go/concurrent/LICENSE b/vendor/github.com/modern-go/concurrent/LICENSE new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/vendor/github.com/modern-go/concurrent/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/modern-go/concurrent/README.md b/vendor/github.com/modern-go/concurrent/README.md new file mode 100644 index 000000000..acab3200a --- /dev/null +++ b/vendor/github.com/modern-go/concurrent/README.md @@ -0,0 +1,49 @@ +# concurrent + +[![Sourcegraph](https://sourcegraph.com/github.com/modern-go/concurrent/-/badge.svg)](https://sourcegraph.com/github.com/modern-go/concurrent?badge) +[![GoDoc](http://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)](http://godoc.org/github.com/modern-go/concurrent) +[![Build Status](https://travis-ci.org/modern-go/concurrent.svg?branch=master)](https://travis-ci.org/modern-go/concurrent) +[![codecov](https://codecov.io/gh/modern-go/concurrent/branch/master/graph/badge.svg)](https://codecov.io/gh/modern-go/concurrent) +[![rcard](https://goreportcard.com/badge/github.com/modern-go/concurrent)](https://goreportcard.com/report/github.com/modern-go/concurrent) +[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://raw.githubusercontent.com/modern-go/concurrent/master/LICENSE) + +* concurrent.Map: backport sync.Map for go below 1.9 +* concurrent.Executor: goroutine with explicit ownership and cancellable + +# concurrent.Map + +because sync.Map is only available in go 1.9, we can use concurrent.Map to make code portable + +```go +m := concurrent.NewMap() +m.Store("hello", "world") +elem, found := m.Load("hello") +// elem will be "world" +// found will be true +``` + +# concurrent.Executor + +```go +executor := concurrent.NewUnboundedExecutor() +executor.Go(func(ctx context.Context) { + everyMillisecond := time.NewTicker(time.Millisecond) + for { + select { + case <-ctx.Done(): + fmt.Println("goroutine exited") + return + case <-everyMillisecond.C: + // do something + } + } +}) +time.Sleep(time.Second) +executor.StopAndWaitForever() +fmt.Println("executor stopped") +``` + +attach goroutine to executor instance, so that we can + +* cancel it by stop the executor with Stop/StopAndWait/StopAndWaitForever +* handle panic by callback: the default behavior will no longer crash your application \ No newline at end of file diff --git a/vendor/github.com/modern-go/concurrent/executor.go b/vendor/github.com/modern-go/concurrent/executor.go new file mode 100644 index 000000000..623dba1ac --- /dev/null +++ b/vendor/github.com/modern-go/concurrent/executor.go @@ -0,0 +1,14 @@ +package concurrent + +import "context" + +// Executor replace go keyword to start a new goroutine +// the goroutine should cancel itself if the context passed in has been cancelled +// the goroutine started by the executor, is owned by the executor +// we can cancel all executors owned by the executor just by stop the executor itself +// however Executor interface does not Stop method, the one starting and owning executor +// should use the concrete type of executor, instead of this interface. +type Executor interface { + // Go starts a new goroutine controlled by the context + Go(handler func(ctx context.Context)) +} diff --git a/vendor/github.com/modern-go/concurrent/go_above_19.go b/vendor/github.com/modern-go/concurrent/go_above_19.go new file mode 100644 index 000000000..aeabf8c4f --- /dev/null +++ b/vendor/github.com/modern-go/concurrent/go_above_19.go @@ -0,0 +1,15 @@ +//+build go1.9 + +package concurrent + +import "sync" + +// Map is a wrapper for sync.Map introduced in go1.9 +type Map struct { + sync.Map +} + +// NewMap creates a thread safe Map +func NewMap() *Map { + return &Map{} +} diff --git a/vendor/github.com/modern-go/concurrent/go_below_19.go b/vendor/github.com/modern-go/concurrent/go_below_19.go new file mode 100644 index 000000000..b9c8df7f4 --- /dev/null +++ b/vendor/github.com/modern-go/concurrent/go_below_19.go @@ -0,0 +1,33 @@ +//+build !go1.9 + +package concurrent + +import "sync" + +// Map implements a thread safe map for go version below 1.9 using mutex +type Map struct { + lock sync.RWMutex + data map[interface{}]interface{} +} + +// NewMap creates a thread safe map +func NewMap() *Map { + return &Map{ + data: make(map[interface{}]interface{}, 32), + } +} + +// Load is same as sync.Map Load +func (m *Map) Load(key interface{}) (elem interface{}, found bool) { + m.lock.RLock() + elem, found = m.data[key] + m.lock.RUnlock() + return +} + +// Load is same as sync.Map Store +func (m *Map) Store(key interface{}, elem interface{}) { + m.lock.Lock() + m.data[key] = elem + m.lock.Unlock() +} diff --git a/vendor/github.com/modern-go/concurrent/log.go b/vendor/github.com/modern-go/concurrent/log.go new file mode 100644 index 000000000..9756fcc75 --- /dev/null +++ b/vendor/github.com/modern-go/concurrent/log.go @@ -0,0 +1,13 @@ +package concurrent + +import ( + "os" + "log" + "io/ioutil" +) + +// ErrorLogger is used to print out error, can be set to writer other than stderr +var ErrorLogger = log.New(os.Stderr, "", 0) + +// InfoLogger is used to print informational message, default to off +var InfoLogger = log.New(ioutil.Discard, "", 0) \ No newline at end of file diff --git a/vendor/github.com/modern-go/concurrent/test.sh b/vendor/github.com/modern-go/concurrent/test.sh new file mode 100644 index 000000000..d1e6b2ec5 --- /dev/null +++ b/vendor/github.com/modern-go/concurrent/test.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -e +echo "" > coverage.txt + +for d in $(go list ./... | grep -v vendor); do + go test -coverprofile=profile.out -coverpkg=github.com/modern-go/concurrent $d + if [ -f profile.out ]; then + cat profile.out >> coverage.txt + rm profile.out + fi +done diff --git a/vendor/github.com/modern-go/concurrent/unbounded_executor.go b/vendor/github.com/modern-go/concurrent/unbounded_executor.go new file mode 100644 index 000000000..05a77dceb --- /dev/null +++ b/vendor/github.com/modern-go/concurrent/unbounded_executor.go @@ -0,0 +1,119 @@ +package concurrent + +import ( + "context" + "fmt" + "runtime" + "runtime/debug" + "sync" + "time" + "reflect" +) + +// HandlePanic logs goroutine panic by default +var HandlePanic = func(recovered interface{}, funcName string) { + ErrorLogger.Println(fmt.Sprintf("%s panic: %v", funcName, recovered)) + ErrorLogger.Println(string(debug.Stack())) +} + +// UnboundedExecutor is a executor without limits on counts of alive goroutines +// it tracks the goroutine started by it, and can cancel them when shutdown +type UnboundedExecutor struct { + ctx context.Context + cancel context.CancelFunc + activeGoroutinesMutex *sync.Mutex + activeGoroutines map[string]int + HandlePanic func(recovered interface{}, funcName string) +} + +// GlobalUnboundedExecutor has the life cycle of the program itself +// any goroutine want to be shutdown before main exit can be started from this executor +// GlobalUnboundedExecutor expects the main function to call stop +// it does not magically knows the main function exits +var GlobalUnboundedExecutor = NewUnboundedExecutor() + +// NewUnboundedExecutor creates a new UnboundedExecutor, +// UnboundedExecutor can not be created by &UnboundedExecutor{} +// HandlePanic can be set with a callback to override global HandlePanic +func NewUnboundedExecutor() *UnboundedExecutor { + ctx, cancel := context.WithCancel(context.TODO()) + return &UnboundedExecutor{ + ctx: ctx, + cancel: cancel, + activeGoroutinesMutex: &sync.Mutex{}, + activeGoroutines: map[string]int{}, + } +} + +// Go starts a new goroutine and tracks its lifecycle. +// Panic will be recovered and logged automatically, except for StopSignal +func (executor *UnboundedExecutor) Go(handler func(ctx context.Context)) { + pc := reflect.ValueOf(handler).Pointer() + f := runtime.FuncForPC(pc) + funcName := f.Name() + file, line := f.FileLine(pc) + executor.activeGoroutinesMutex.Lock() + defer executor.activeGoroutinesMutex.Unlock() + startFrom := fmt.Sprintf("%s:%d", file, line) + executor.activeGoroutines[startFrom] += 1 + go func() { + defer func() { + recovered := recover() + // if you want to quit a goroutine without trigger HandlePanic + // use runtime.Goexit() to quit + if recovered != nil { + if executor.HandlePanic == nil { + HandlePanic(recovered, funcName) + } else { + executor.HandlePanic(recovered, funcName) + } + } + executor.activeGoroutinesMutex.Lock() + executor.activeGoroutines[startFrom] -= 1 + executor.activeGoroutinesMutex.Unlock() + }() + handler(executor.ctx) + }() +} + +// Stop cancel all goroutines started by this executor without wait +func (executor *UnboundedExecutor) Stop() { + executor.cancel() +} + +// StopAndWaitForever cancel all goroutines started by this executor and +// wait until all goroutines exited +func (executor *UnboundedExecutor) StopAndWaitForever() { + executor.StopAndWait(context.Background()) +} + +// StopAndWait cancel all goroutines started by this executor and wait. +// Wait can be cancelled by the context passed in. +func (executor *UnboundedExecutor) StopAndWait(ctx context.Context) { + executor.cancel() + for { + oneHundredMilliseconds := time.NewTimer(time.Millisecond * 100) + select { + case <-oneHundredMilliseconds.C: + if executor.checkNoActiveGoroutines() { + return + } + case <-ctx.Done(): + return + } + } +} + +func (executor *UnboundedExecutor) checkNoActiveGoroutines() bool { + executor.activeGoroutinesMutex.Lock() + defer executor.activeGoroutinesMutex.Unlock() + for startFrom, count := range executor.activeGoroutines { + if count > 0 { + InfoLogger.Println("UnboundedExecutor is still waiting goroutines to quit", + "startFrom", startFrom, + "count", count) + return false + } + } + return true +} diff --git a/vendor/github.com/modern-go/reflect2/.gitignore b/vendor/github.com/modern-go/reflect2/.gitignore new file mode 100644 index 000000000..7b26c946d --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/.gitignore @@ -0,0 +1,2 @@ +/vendor +/coverage.txt diff --git a/vendor/github.com/modern-go/reflect2/.travis.yml b/vendor/github.com/modern-go/reflect2/.travis.yml new file mode 100644 index 000000000..fbb43744d --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/.travis.yml @@ -0,0 +1,15 @@ +language: go + +go: + - 1.8.x + - 1.x + +before_install: + - go get -t -v ./... + - go get -t -v github.com/modern-go/reflect2-tests/... + +script: + - ./test.sh + +after_success: + - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/modern-go/reflect2/Gopkg.lock b/vendor/github.com/modern-go/reflect2/Gopkg.lock new file mode 100644 index 000000000..2a3a69893 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/Gopkg.lock @@ -0,0 +1,15 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + name = "github.com/modern-go/concurrent" + packages = ["."] + revision = "e0a39a4cb4216ea8db28e22a69f4ec25610d513a" + version = "1.0.0" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + inputs-digest = "daee8a88b3498b61c5640056665b8b9eea062006f5e596bbb6a3ed9119a11ec7" + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/vendor/github.com/modern-go/reflect2/Gopkg.toml b/vendor/github.com/modern-go/reflect2/Gopkg.toml new file mode 100644 index 000000000..2f4f4dbdc --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/Gopkg.toml @@ -0,0 +1,35 @@ +# Gopkg.toml example +# +# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html +# for detailed Gopkg.toml documentation. +# +# required = ["github.com/user/thing/cmd/thing"] +# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] +# +# [[constraint]] +# name = "github.com/user/project" +# version = "1.0.0" +# +# [[constraint]] +# name = "github.com/user/project2" +# branch = "dev" +# source = "github.com/myfork/project2" +# +# [[override]] +# name = "github.com/x/y" +# version = "2.4.0" +# +# [prune] +# non-go = false +# go-tests = true +# unused-packages = true + +ignored = [] + +[[constraint]] + name = "github.com/modern-go/concurrent" + version = "1.0.0" + +[prune] + go-tests = true + unused-packages = true diff --git a/vendor/github.com/modern-go/reflect2/LICENSE b/vendor/github.com/modern-go/reflect2/LICENSE new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/modern-go/reflect2/README.md b/vendor/github.com/modern-go/reflect2/README.md new file mode 100644 index 000000000..6f968aab9 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/README.md @@ -0,0 +1,71 @@ +# reflect2 + +[![Sourcegraph](https://sourcegraph.com/github.com/modern-go/reflect2/-/badge.svg)](https://sourcegraph.com/github.com/modern-go/reflect2?badge) +[![GoDoc](http://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)](http://godoc.org/github.com/modern-go/reflect2) +[![Build Status](https://travis-ci.org/modern-go/reflect2.svg?branch=master)](https://travis-ci.org/modern-go/reflect2) +[![codecov](https://codecov.io/gh/modern-go/reflect2/branch/master/graph/badge.svg)](https://codecov.io/gh/modern-go/reflect2) +[![rcard](https://goreportcard.com/badge/github.com/modern-go/reflect2)](https://goreportcard.com/report/github.com/modern-go/reflect2) +[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://raw.githubusercontent.com/modern-go/reflect2/master/LICENSE) + +reflect api that avoids runtime reflect.Value cost + +* reflect get/set interface{}, with type checking +* reflect get/set unsafe.Pointer, without type checking +* `reflect2.TypeByName` works like `Class.forName` found in java + +[json-iterator](https://github.com/json-iterator/go) use this package to save runtime dispatching cost. +This package is designed for low level libraries to optimize reflection performance. +General application should still use reflect standard library. + +# reflect2.TypeByName + +```go +// given package is github.com/your/awesome-package +type MyStruct struct { + // ... +} + +// will return the type +reflect2.TypeByName("awesome-package.MyStruct") +// however, if the type has not been used +// it will be eliminated by compiler, so we can not get it in runtime +``` + +# reflect2 get/set interface{} + +```go +valType := reflect2.TypeOf(1) +i := 1 +j := 10 +valType.Set(&i, &j) +// i will be 10 +``` + +to get set `type`, always use its pointer `*type` + +# reflect2 get/set unsafe.Pointer + +```go +valType := reflect2.TypeOf(1) +i := 1 +j := 10 +valType.UnsafeSet(unsafe.Pointer(&i), unsafe.Pointer(&j)) +// i will be 10 +``` + +to get set `type`, always use its pointer `*type` + +# benchmark + +Benchmark is not necessary for this package. It does nothing actually. +As it is just a thin wrapper to make go runtime public. +Both `reflect2` and `reflect` call same function +provided by `runtime` package exposed by go language. + +# unsafe safety + +Instead of casting `[]byte` to `sliceHeader` in your application using unsafe. +We can use reflect2 instead. This way, if `sliceHeader` changes in the future, +only reflect2 need to be upgraded. + +reflect2 tries its best to keep the implementation same as reflect (by testing). \ No newline at end of file diff --git a/vendor/github.com/modern-go/reflect2/go_above_17.go b/vendor/github.com/modern-go/reflect2/go_above_17.go new file mode 100644 index 000000000..5c1cea868 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/go_above_17.go @@ -0,0 +1,8 @@ +//+build go1.7 + +package reflect2 + +import "unsafe" + +//go:linkname resolveTypeOff reflect.resolveTypeOff +func resolveTypeOff(rtype unsafe.Pointer, off int32) unsafe.Pointer diff --git a/vendor/github.com/modern-go/reflect2/go_above_19.go b/vendor/github.com/modern-go/reflect2/go_above_19.go new file mode 100644 index 000000000..c7e3b7801 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/go_above_19.go @@ -0,0 +1,14 @@ +//+build go1.9 + +package reflect2 + +import ( + "unsafe" +) + +//go:linkname makemap reflect.makemap +func makemap(rtype unsafe.Pointer, cap int) (m unsafe.Pointer) + +func makeMapWithSize(rtype unsafe.Pointer, cap int) unsafe.Pointer { + return makemap(rtype, cap) +} diff --git a/vendor/github.com/modern-go/reflect2/go_below_17.go b/vendor/github.com/modern-go/reflect2/go_below_17.go new file mode 100644 index 000000000..65a93c889 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/go_below_17.go @@ -0,0 +1,9 @@ +//+build !go1.7 + +package reflect2 + +import "unsafe" + +func resolveTypeOff(rtype unsafe.Pointer, off int32) unsafe.Pointer { + return nil +} diff --git a/vendor/github.com/modern-go/reflect2/go_below_19.go b/vendor/github.com/modern-go/reflect2/go_below_19.go new file mode 100644 index 000000000..b050ef70c --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/go_below_19.go @@ -0,0 +1,14 @@ +//+build !go1.9 + +package reflect2 + +import ( + "unsafe" +) + +//go:linkname makemap reflect.makemap +func makemap(rtype unsafe.Pointer) (m unsafe.Pointer) + +func makeMapWithSize(rtype unsafe.Pointer, cap int) unsafe.Pointer { + return makemap(rtype) +} diff --git a/vendor/github.com/modern-go/reflect2/reflect2.go b/vendor/github.com/modern-go/reflect2/reflect2.go new file mode 100644 index 000000000..63b49c799 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/reflect2.go @@ -0,0 +1,298 @@ +package reflect2 + +import ( + "github.com/modern-go/concurrent" + "reflect" + "unsafe" +) + +type Type interface { + Kind() reflect.Kind + // New return pointer to data of this type + New() interface{} + // UnsafeNew return the allocated space pointed by unsafe.Pointer + UnsafeNew() unsafe.Pointer + // PackEFace cast a unsafe pointer to object represented pointer + PackEFace(ptr unsafe.Pointer) interface{} + // Indirect dereference object represented pointer to this type + Indirect(obj interface{}) interface{} + // UnsafeIndirect dereference pointer to this type + UnsafeIndirect(ptr unsafe.Pointer) interface{} + // Type1 returns reflect.Type + Type1() reflect.Type + Implements(thatType Type) bool + String() string + RType() uintptr + // interface{} of this type has pointer like behavior + LikePtr() bool + IsNullable() bool + IsNil(obj interface{}) bool + UnsafeIsNil(ptr unsafe.Pointer) bool + Set(obj interface{}, val interface{}) + UnsafeSet(ptr unsafe.Pointer, val unsafe.Pointer) + AssignableTo(anotherType Type) bool +} + +type ListType interface { + Type + Elem() Type + SetIndex(obj interface{}, index int, elem interface{}) + UnsafeSetIndex(obj unsafe.Pointer, index int, elem unsafe.Pointer) + GetIndex(obj interface{}, index int) interface{} + UnsafeGetIndex(obj unsafe.Pointer, index int) unsafe.Pointer +} + +type ArrayType interface { + ListType + Len() int +} + +type SliceType interface { + ListType + MakeSlice(length int, cap int) interface{} + UnsafeMakeSlice(length int, cap int) unsafe.Pointer + Grow(obj interface{}, newLength int) + UnsafeGrow(ptr unsafe.Pointer, newLength int) + Append(obj interface{}, elem interface{}) + UnsafeAppend(obj unsafe.Pointer, elem unsafe.Pointer) + LengthOf(obj interface{}) int + UnsafeLengthOf(ptr unsafe.Pointer) int + SetNil(obj interface{}) + UnsafeSetNil(ptr unsafe.Pointer) + Cap(obj interface{}) int + UnsafeCap(ptr unsafe.Pointer) int +} + +type StructType interface { + Type + NumField() int + Field(i int) StructField + FieldByName(name string) StructField + FieldByIndex(index []int) StructField + FieldByNameFunc(match func(string) bool) StructField +} + +type StructField interface { + Offset() uintptr + Name() string + PkgPath() string + Type() Type + Tag() reflect.StructTag + Index() []int + Anonymous() bool + Set(obj interface{}, value interface{}) + UnsafeSet(obj unsafe.Pointer, value unsafe.Pointer) + Get(obj interface{}) interface{} + UnsafeGet(obj unsafe.Pointer) unsafe.Pointer +} + +type MapType interface { + Type + Key() Type + Elem() Type + MakeMap(cap int) interface{} + UnsafeMakeMap(cap int) unsafe.Pointer + SetIndex(obj interface{}, key interface{}, elem interface{}) + UnsafeSetIndex(obj unsafe.Pointer, key unsafe.Pointer, elem unsafe.Pointer) + TryGetIndex(obj interface{}, key interface{}) (interface{}, bool) + GetIndex(obj interface{}, key interface{}) interface{} + UnsafeGetIndex(obj unsafe.Pointer, key unsafe.Pointer) unsafe.Pointer + Iterate(obj interface{}) MapIterator + UnsafeIterate(obj unsafe.Pointer) MapIterator +} + +type MapIterator interface { + HasNext() bool + Next() (key interface{}, elem interface{}) + UnsafeNext() (key unsafe.Pointer, elem unsafe.Pointer) +} + +type PtrType interface { + Type + Elem() Type +} + +type InterfaceType interface { + NumMethod() int +} + +type Config struct { + UseSafeImplementation bool +} + +type API interface { + TypeOf(obj interface{}) Type + Type2(type1 reflect.Type) Type +} + +var ConfigUnsafe = Config{UseSafeImplementation: false}.Froze() +var ConfigSafe = Config{UseSafeImplementation: true}.Froze() + +type frozenConfig struct { + useSafeImplementation bool + cache *concurrent.Map +} + +func (cfg Config) Froze() *frozenConfig { + return &frozenConfig{ + useSafeImplementation: cfg.UseSafeImplementation, + cache: concurrent.NewMap(), + } +} + +func (cfg *frozenConfig) TypeOf(obj interface{}) Type { + cacheKey := uintptr(unpackEFace(obj).rtype) + typeObj, found := cfg.cache.Load(cacheKey) + if found { + return typeObj.(Type) + } + return cfg.Type2(reflect.TypeOf(obj)) +} + +func (cfg *frozenConfig) Type2(type1 reflect.Type) Type { + if type1 == nil { + return nil + } + cacheKey := uintptr(unpackEFace(type1).data) + typeObj, found := cfg.cache.Load(cacheKey) + if found { + return typeObj.(Type) + } + type2 := cfg.wrapType(type1) + cfg.cache.Store(cacheKey, type2) + return type2 +} + +func (cfg *frozenConfig) wrapType(type1 reflect.Type) Type { + safeType := safeType{Type: type1, cfg: cfg} + switch type1.Kind() { + case reflect.Struct: + if cfg.useSafeImplementation { + return &safeStructType{safeType} + } + return newUnsafeStructType(cfg, type1) + case reflect.Array: + if cfg.useSafeImplementation { + return &safeSliceType{safeType} + } + return newUnsafeArrayType(cfg, type1) + case reflect.Slice: + if cfg.useSafeImplementation { + return &safeSliceType{safeType} + } + return newUnsafeSliceType(cfg, type1) + case reflect.Map: + if cfg.useSafeImplementation { + return &safeMapType{safeType} + } + return newUnsafeMapType(cfg, type1) + case reflect.Ptr, reflect.Chan, reflect.Func: + if cfg.useSafeImplementation { + return &safeMapType{safeType} + } + return newUnsafePtrType(cfg, type1) + case reflect.Interface: + if cfg.useSafeImplementation { + return &safeMapType{safeType} + } + if type1.NumMethod() == 0 { + return newUnsafeEFaceType(cfg, type1) + } + return newUnsafeIFaceType(cfg, type1) + default: + if cfg.useSafeImplementation { + return &safeType + } + return newUnsafeType(cfg, type1) + } +} + +func TypeOf(obj interface{}) Type { + return ConfigUnsafe.TypeOf(obj) +} + +func TypeOfPtr(obj interface{}) PtrType { + return TypeOf(obj).(PtrType) +} + +func Type2(type1 reflect.Type) Type { + if type1 == nil { + return nil + } + return ConfigUnsafe.Type2(type1) +} + +func PtrTo(typ Type) Type { + return Type2(reflect.PtrTo(typ.Type1())) +} + +func PtrOf(obj interface{}) unsafe.Pointer { + return unpackEFace(obj).data +} + +func RTypeOf(obj interface{}) uintptr { + return uintptr(unpackEFace(obj).rtype) +} + +func IsNil(obj interface{}) bool { + if obj == nil { + return true + } + return unpackEFace(obj).data == nil +} + +func IsNullable(kind reflect.Kind) bool { + switch kind { + case reflect.Ptr, reflect.Map, reflect.Chan, reflect.Func, reflect.Slice, reflect.Interface: + return true + } + return false +} + +func likePtrKind(kind reflect.Kind) bool { + switch kind { + case reflect.Ptr, reflect.Map, reflect.Chan, reflect.Func: + return true + } + return false +} + +func likePtrType(typ reflect.Type) bool { + if likePtrKind(typ.Kind()) { + return true + } + if typ.Kind() == reflect.Struct { + if typ.NumField() != 1 { + return false + } + return likePtrType(typ.Field(0).Type) + } + if typ.Kind() == reflect.Array { + if typ.Len() != 1 { + return false + } + return likePtrType(typ.Elem()) + } + return false +} + +// NoEscape hides a pointer from escape analysis. noescape is +// the identity function but escape analysis doesn't think the +// output depends on the input. noescape is inlined and currently +// compiles down to zero instructions. +// USE CAREFULLY! +//go:nosplit +func NoEscape(p unsafe.Pointer) unsafe.Pointer { + x := uintptr(p) + return unsafe.Pointer(x ^ 0) +} + +func UnsafeCastString(str string) []byte { + stringHeader := (*reflect.StringHeader)(unsafe.Pointer(&str)) + sliceHeader := &reflect.SliceHeader{ + Data: stringHeader.Data, + Cap: stringHeader.Len, + Len: stringHeader.Len, + } + return *(*[]byte)(unsafe.Pointer(sliceHeader)) +} diff --git a/vendor/github.com/modern-go/reflect2/reflect2_amd64.s b/vendor/github.com/modern-go/reflect2/reflect2_amd64.s new file mode 100644 index 000000000..e69de29bb diff --git a/vendor/github.com/modern-go/reflect2/reflect2_kind.go b/vendor/github.com/modern-go/reflect2/reflect2_kind.go new file mode 100644 index 000000000..62f299e40 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/reflect2_kind.go @@ -0,0 +1,30 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +// DefaultTypeOfKind return the non aliased default type for the kind +func DefaultTypeOfKind(kind reflect.Kind) Type { + return kindTypes[kind] +} + +var kindTypes = map[reflect.Kind]Type{ + reflect.Bool: TypeOf(true), + reflect.Uint8: TypeOf(uint8(0)), + reflect.Int8: TypeOf(int8(0)), + reflect.Uint16: TypeOf(uint16(0)), + reflect.Int16: TypeOf(int16(0)), + reflect.Uint32: TypeOf(uint32(0)), + reflect.Int32: TypeOf(int32(0)), + reflect.Uint64: TypeOf(uint64(0)), + reflect.Int64: TypeOf(int64(0)), + reflect.Uint: TypeOf(uint(0)), + reflect.Int: TypeOf(int(0)), + reflect.Float32: TypeOf(float32(0)), + reflect.Float64: TypeOf(float64(0)), + reflect.Uintptr: TypeOf(uintptr(0)), + reflect.String: TypeOf(""), + reflect.UnsafePointer: TypeOf(unsafe.Pointer(nil)), +} diff --git a/vendor/github.com/modern-go/reflect2/relfect2_386.s b/vendor/github.com/modern-go/reflect2/relfect2_386.s new file mode 100644 index 000000000..e69de29bb diff --git a/vendor/github.com/modern-go/reflect2/relfect2_amd64p32.s b/vendor/github.com/modern-go/reflect2/relfect2_amd64p32.s new file mode 100644 index 000000000..e69de29bb diff --git a/vendor/github.com/modern-go/reflect2/relfect2_arm.s b/vendor/github.com/modern-go/reflect2/relfect2_arm.s new file mode 100644 index 000000000..e69de29bb diff --git a/vendor/github.com/modern-go/reflect2/relfect2_arm64.s b/vendor/github.com/modern-go/reflect2/relfect2_arm64.s new file mode 100644 index 000000000..e69de29bb diff --git a/vendor/github.com/modern-go/reflect2/relfect2_mips64x.s b/vendor/github.com/modern-go/reflect2/relfect2_mips64x.s new file mode 100644 index 000000000..e69de29bb diff --git a/vendor/github.com/modern-go/reflect2/relfect2_mipsx.s b/vendor/github.com/modern-go/reflect2/relfect2_mipsx.s new file mode 100644 index 000000000..e69de29bb diff --git a/vendor/github.com/modern-go/reflect2/relfect2_ppc64x.s b/vendor/github.com/modern-go/reflect2/relfect2_ppc64x.s new file mode 100644 index 000000000..e69de29bb diff --git a/vendor/github.com/modern-go/reflect2/relfect2_s390x.s b/vendor/github.com/modern-go/reflect2/relfect2_s390x.s new file mode 100644 index 000000000..e69de29bb diff --git a/vendor/github.com/modern-go/reflect2/safe_field.go b/vendor/github.com/modern-go/reflect2/safe_field.go new file mode 100644 index 000000000..d4ba1f4f8 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/safe_field.go @@ -0,0 +1,58 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +type safeField struct { + reflect.StructField +} + +func (field *safeField) Offset() uintptr { + return field.StructField.Offset +} + +func (field *safeField) Name() string { + return field.StructField.Name +} + +func (field *safeField) PkgPath() string { + return field.StructField.PkgPath +} + +func (field *safeField) Type() Type { + panic("not implemented") +} + +func (field *safeField) Tag() reflect.StructTag { + return field.StructField.Tag +} + +func (field *safeField) Index() []int { + return field.StructField.Index +} + +func (field *safeField) Anonymous() bool { + return field.StructField.Anonymous +} + +func (field *safeField) Set(obj interface{}, value interface{}) { + val := reflect.ValueOf(obj).Elem() + val.FieldByIndex(field.Index()).Set(reflect.ValueOf(value).Elem()) +} + +func (field *safeField) UnsafeSet(obj unsafe.Pointer, value unsafe.Pointer) { + panic("unsafe operation is not supported") +} + +func (field *safeField) Get(obj interface{}) interface{} { + val := reflect.ValueOf(obj).Elem().FieldByIndex(field.Index()) + ptr := reflect.New(val.Type()) + ptr.Elem().Set(val) + return ptr.Interface() +} + +func (field *safeField) UnsafeGet(obj unsafe.Pointer) unsafe.Pointer { + panic("does not support unsafe operation") +} diff --git a/vendor/github.com/modern-go/reflect2/safe_map.go b/vendor/github.com/modern-go/reflect2/safe_map.go new file mode 100644 index 000000000..88362205a --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/safe_map.go @@ -0,0 +1,101 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +type safeMapType struct { + safeType +} + +func (type2 *safeMapType) Key() Type { + return type2.safeType.cfg.Type2(type2.Type.Key()) +} + +func (type2 *safeMapType) MakeMap(cap int) interface{} { + ptr := reflect.New(type2.Type) + ptr.Elem().Set(reflect.MakeMap(type2.Type)) + return ptr.Interface() +} + +func (type2 *safeMapType) UnsafeMakeMap(cap int) unsafe.Pointer { + panic("does not support unsafe operation") +} + +func (type2 *safeMapType) SetIndex(obj interface{}, key interface{}, elem interface{}) { + keyVal := reflect.ValueOf(key) + elemVal := reflect.ValueOf(elem) + val := reflect.ValueOf(obj) + val.Elem().SetMapIndex(keyVal.Elem(), elemVal.Elem()) +} + +func (type2 *safeMapType) UnsafeSetIndex(obj unsafe.Pointer, key unsafe.Pointer, elem unsafe.Pointer) { + panic("does not support unsafe operation") +} + +func (type2 *safeMapType) TryGetIndex(obj interface{}, key interface{}) (interface{}, bool) { + keyVal := reflect.ValueOf(key) + if key == nil { + keyVal = reflect.New(type2.Type.Key()).Elem() + } + val := reflect.ValueOf(obj).MapIndex(keyVal) + if !val.IsValid() { + return nil, false + } + return val.Interface(), true +} + +func (type2 *safeMapType) GetIndex(obj interface{}, key interface{}) interface{} { + val := reflect.ValueOf(obj).Elem() + keyVal := reflect.ValueOf(key).Elem() + elemVal := val.MapIndex(keyVal) + if !elemVal.IsValid() { + ptr := reflect.New(reflect.PtrTo(val.Type().Elem())) + return ptr.Elem().Interface() + } + ptr := reflect.New(elemVal.Type()) + ptr.Elem().Set(elemVal) + return ptr.Interface() +} + +func (type2 *safeMapType) UnsafeGetIndex(obj unsafe.Pointer, key unsafe.Pointer) unsafe.Pointer { + panic("does not support unsafe operation") +} + +func (type2 *safeMapType) Iterate(obj interface{}) MapIterator { + m := reflect.ValueOf(obj).Elem() + return &safeMapIterator{ + m: m, + keys: m.MapKeys(), + } +} + +func (type2 *safeMapType) UnsafeIterate(obj unsafe.Pointer) MapIterator { + panic("does not support unsafe operation") +} + +type safeMapIterator struct { + i int + m reflect.Value + keys []reflect.Value +} + +func (iter *safeMapIterator) HasNext() bool { + return iter.i != len(iter.keys) +} + +func (iter *safeMapIterator) Next() (interface{}, interface{}) { + key := iter.keys[iter.i] + elem := iter.m.MapIndex(key) + iter.i += 1 + keyPtr := reflect.New(key.Type()) + keyPtr.Elem().Set(key) + elemPtr := reflect.New(elem.Type()) + elemPtr.Elem().Set(elem) + return keyPtr.Interface(), elemPtr.Interface() +} + +func (iter *safeMapIterator) UnsafeNext() (unsafe.Pointer, unsafe.Pointer) { + panic("does not support unsafe operation") +} diff --git a/vendor/github.com/modern-go/reflect2/safe_slice.go b/vendor/github.com/modern-go/reflect2/safe_slice.go new file mode 100644 index 000000000..bcce6fd20 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/safe_slice.go @@ -0,0 +1,92 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +type safeSliceType struct { + safeType +} + +func (type2 *safeSliceType) SetIndex(obj interface{}, index int, value interface{}) { + val := reflect.ValueOf(obj).Elem() + elem := reflect.ValueOf(value).Elem() + val.Index(index).Set(elem) +} + +func (type2 *safeSliceType) UnsafeSetIndex(obj unsafe.Pointer, index int, value unsafe.Pointer) { + panic("does not support unsafe operation") +} + +func (type2 *safeSliceType) GetIndex(obj interface{}, index int) interface{} { + val := reflect.ValueOf(obj).Elem() + elem := val.Index(index) + ptr := reflect.New(elem.Type()) + ptr.Elem().Set(elem) + return ptr.Interface() +} + +func (type2 *safeSliceType) UnsafeGetIndex(obj unsafe.Pointer, index int) unsafe.Pointer { + panic("does not support unsafe operation") +} + +func (type2 *safeSliceType) MakeSlice(length int, cap int) interface{} { + val := reflect.MakeSlice(type2.Type, length, cap) + ptr := reflect.New(val.Type()) + ptr.Elem().Set(val) + return ptr.Interface() +} + +func (type2 *safeSliceType) UnsafeMakeSlice(length int, cap int) unsafe.Pointer { + panic("does not support unsafe operation") +} + +func (type2 *safeSliceType) Grow(obj interface{}, newLength int) { + oldCap := type2.Cap(obj) + oldSlice := reflect.ValueOf(obj).Elem() + delta := newLength - oldCap + deltaVals := make([]reflect.Value, delta) + newSlice := reflect.Append(oldSlice, deltaVals...) + oldSlice.Set(newSlice) +} + +func (type2 *safeSliceType) UnsafeGrow(ptr unsafe.Pointer, newLength int) { + panic("does not support unsafe operation") +} + +func (type2 *safeSliceType) Append(obj interface{}, elem interface{}) { + val := reflect.ValueOf(obj).Elem() + elemVal := reflect.ValueOf(elem).Elem() + newVal := reflect.Append(val, elemVal) + val.Set(newVal) +} + +func (type2 *safeSliceType) UnsafeAppend(obj unsafe.Pointer, elem unsafe.Pointer) { + panic("does not support unsafe operation") +} + +func (type2 *safeSliceType) SetNil(obj interface{}) { + val := reflect.ValueOf(obj).Elem() + val.Set(reflect.Zero(val.Type())) +} + +func (type2 *safeSliceType) UnsafeSetNil(ptr unsafe.Pointer) { + panic("does not support unsafe operation") +} + +func (type2 *safeSliceType) LengthOf(obj interface{}) int { + return reflect.ValueOf(obj).Elem().Len() +} + +func (type2 *safeSliceType) UnsafeLengthOf(ptr unsafe.Pointer) int { + panic("does not support unsafe operation") +} + +func (type2 *safeSliceType) Cap(obj interface{}) int { + return reflect.ValueOf(obj).Elem().Cap() +} + +func (type2 *safeSliceType) UnsafeCap(ptr unsafe.Pointer) int { + panic("does not support unsafe operation") +} diff --git a/vendor/github.com/modern-go/reflect2/safe_struct.go b/vendor/github.com/modern-go/reflect2/safe_struct.go new file mode 100644 index 000000000..e5fb9b313 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/safe_struct.go @@ -0,0 +1,29 @@ +package reflect2 + +type safeStructType struct { + safeType +} + +func (type2 *safeStructType) FieldByName(name string) StructField { + field, found := type2.Type.FieldByName(name) + if !found { + panic("field " + name + " not found") + } + return &safeField{StructField: field} +} + +func (type2 *safeStructType) Field(i int) StructField { + return &safeField{StructField: type2.Type.Field(i)} +} + +func (type2 *safeStructType) FieldByIndex(index []int) StructField { + return &safeField{StructField: type2.Type.FieldByIndex(index)} +} + +func (type2 *safeStructType) FieldByNameFunc(match func(string) bool) StructField { + field, found := type2.Type.FieldByNameFunc(match) + if !found { + panic("field match condition not found in " + type2.Type.String()) + } + return &safeField{StructField: field} +} diff --git a/vendor/github.com/modern-go/reflect2/safe_type.go b/vendor/github.com/modern-go/reflect2/safe_type.go new file mode 100644 index 000000000..ee4e7bb6e --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/safe_type.go @@ -0,0 +1,78 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +type safeType struct { + reflect.Type + cfg *frozenConfig +} + +func (type2 *safeType) New() interface{} { + return reflect.New(type2.Type).Interface() +} + +func (type2 *safeType) UnsafeNew() unsafe.Pointer { + panic("does not support unsafe operation") +} + +func (type2 *safeType) Elem() Type { + return type2.cfg.Type2(type2.Type.Elem()) +} + +func (type2 *safeType) Type1() reflect.Type { + return type2.Type +} + +func (type2 *safeType) PackEFace(ptr unsafe.Pointer) interface{} { + panic("does not support unsafe operation") +} + +func (type2 *safeType) Implements(thatType Type) bool { + return type2.Type.Implements(thatType.Type1()) +} + +func (type2 *safeType) RType() uintptr { + panic("does not support unsafe operation") +} + +func (type2 *safeType) Indirect(obj interface{}) interface{} { + return reflect.Indirect(reflect.ValueOf(obj)).Interface() +} + +func (type2 *safeType) UnsafeIndirect(ptr unsafe.Pointer) interface{} { + panic("does not support unsafe operation") +} + +func (type2 *safeType) LikePtr() bool { + panic("does not support unsafe operation") +} + +func (type2 *safeType) IsNullable() bool { + return IsNullable(type2.Kind()) +} + +func (type2 *safeType) IsNil(obj interface{}) bool { + if obj == nil { + return true + } + return reflect.ValueOf(obj).Elem().IsNil() +} + +func (type2 *safeType) UnsafeIsNil(ptr unsafe.Pointer) bool { + panic("does not support unsafe operation") +} + +func (type2 *safeType) Set(obj interface{}, val interface{}) { + reflect.ValueOf(obj).Elem().Set(reflect.ValueOf(val).Elem()) +} + +func (type2 *safeType) UnsafeSet(ptr unsafe.Pointer, val unsafe.Pointer) { + panic("does not support unsafe operation") +} + +func (type2 *safeType) AssignableTo(anotherType Type) bool { + return type2.Type1().AssignableTo(anotherType.Type1()) +} diff --git a/vendor/github.com/modern-go/reflect2/test.sh b/vendor/github.com/modern-go/reflect2/test.sh new file mode 100644 index 000000000..3d2b9768c --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/test.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -e +echo "" > coverage.txt + +for d in $(go list github.com/modern-go/reflect2-tests/... | grep -v vendor); do + go test -coverprofile=profile.out -coverpkg=github.com/modern-go/reflect2 $d + if [ -f profile.out ]; then + cat profile.out >> coverage.txt + rm profile.out + fi +done diff --git a/vendor/github.com/modern-go/reflect2/type_map.go b/vendor/github.com/modern-go/reflect2/type_map.go new file mode 100644 index 000000000..3acfb5580 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/type_map.go @@ -0,0 +1,113 @@ +package reflect2 + +import ( + "reflect" + "runtime" + "strings" + "sync" + "unsafe" +) + +// typelinks1 for 1.5 ~ 1.6 +//go:linkname typelinks1 reflect.typelinks +func typelinks1() [][]unsafe.Pointer + +// typelinks2 for 1.7 ~ +//go:linkname typelinks2 reflect.typelinks +func typelinks2() (sections []unsafe.Pointer, offset [][]int32) + +// initOnce guards initialization of types and packages +var initOnce sync.Once + +var types map[string]reflect.Type +var packages map[string]map[string]reflect.Type + +// discoverTypes initializes types and packages +func discoverTypes() { + types = make(map[string]reflect.Type) + packages = make(map[string]map[string]reflect.Type) + + ver := runtime.Version() + if ver == "go1.5" || strings.HasPrefix(ver, "go1.5.") { + loadGo15Types() + } else if ver == "go1.6" || strings.HasPrefix(ver, "go1.6.") { + loadGo15Types() + } else { + loadGo17Types() + } +} + +func loadGo15Types() { + var obj interface{} = reflect.TypeOf(0) + typePtrss := typelinks1() + for _, typePtrs := range typePtrss { + for _, typePtr := range typePtrs { + (*emptyInterface)(unsafe.Pointer(&obj)).word = typePtr + typ := obj.(reflect.Type) + if typ.Kind() == reflect.Ptr && typ.Elem().Kind() == reflect.Struct { + loadedType := typ.Elem() + pkgTypes := packages[loadedType.PkgPath()] + if pkgTypes == nil { + pkgTypes = map[string]reflect.Type{} + packages[loadedType.PkgPath()] = pkgTypes + } + types[loadedType.String()] = loadedType + pkgTypes[loadedType.Name()] = loadedType + } + if typ.Kind() == reflect.Slice && typ.Elem().Kind() == reflect.Ptr && + typ.Elem().Elem().Kind() == reflect.Struct { + loadedType := typ.Elem().Elem() + pkgTypes := packages[loadedType.PkgPath()] + if pkgTypes == nil { + pkgTypes = map[string]reflect.Type{} + packages[loadedType.PkgPath()] = pkgTypes + } + types[loadedType.String()] = loadedType + pkgTypes[loadedType.Name()] = loadedType + } + } + } +} + +func loadGo17Types() { + var obj interface{} = reflect.TypeOf(0) + sections, offset := typelinks2() + for i, offs := range offset { + rodata := sections[i] + for _, off := range offs { + (*emptyInterface)(unsafe.Pointer(&obj)).word = resolveTypeOff(unsafe.Pointer(rodata), off) + typ := obj.(reflect.Type) + if typ.Kind() == reflect.Ptr && typ.Elem().Kind() == reflect.Struct { + loadedType := typ.Elem() + pkgTypes := packages[loadedType.PkgPath()] + if pkgTypes == nil { + pkgTypes = map[string]reflect.Type{} + packages[loadedType.PkgPath()] = pkgTypes + } + types[loadedType.String()] = loadedType + pkgTypes[loadedType.Name()] = loadedType + } + } + } +} + +type emptyInterface struct { + typ unsafe.Pointer + word unsafe.Pointer +} + +// TypeByName return the type by its name, just like Class.forName in java +func TypeByName(typeName string) Type { + initOnce.Do(discoverTypes) + return Type2(types[typeName]) +} + +// TypeByPackageName return the type by its package and name +func TypeByPackageName(pkgPath string, name string) Type { + initOnce.Do(discoverTypes) + pkgTypes := packages[pkgPath] + if pkgTypes == nil { + return nil + } + return Type2(pkgTypes[name]) +} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_array.go b/vendor/github.com/modern-go/reflect2/unsafe_array.go new file mode 100644 index 000000000..76cbdba6e --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/unsafe_array.go @@ -0,0 +1,65 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +type UnsafeArrayType struct { + unsafeType + elemRType unsafe.Pointer + pElemRType unsafe.Pointer + elemSize uintptr + likePtr bool +} + +func newUnsafeArrayType(cfg *frozenConfig, type1 reflect.Type) *UnsafeArrayType { + return &UnsafeArrayType{ + unsafeType: *newUnsafeType(cfg, type1), + elemRType: unpackEFace(type1.Elem()).data, + pElemRType: unpackEFace(reflect.PtrTo(type1.Elem())).data, + elemSize: type1.Elem().Size(), + likePtr: likePtrType(type1), + } +} + +func (type2 *UnsafeArrayType) LikePtr() bool { + return type2.likePtr +} + +func (type2 *UnsafeArrayType) Indirect(obj interface{}) interface{} { + objEFace := unpackEFace(obj) + assertType("Type.Indirect argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIndirect(objEFace.data) +} + +func (type2 *UnsafeArrayType) UnsafeIndirect(ptr unsafe.Pointer) interface{} { + if type2.likePtr { + return packEFace(type2.rtype, *(*unsafe.Pointer)(ptr)) + } + return packEFace(type2.rtype, ptr) +} + +func (type2 *UnsafeArrayType) SetIndex(obj interface{}, index int, elem interface{}) { + objEFace := unpackEFace(obj) + assertType("ArrayType.SetIndex argument 1", type2.ptrRType, objEFace.rtype) + elemEFace := unpackEFace(elem) + assertType("ArrayType.SetIndex argument 3", type2.pElemRType, elemEFace.rtype) + type2.UnsafeSetIndex(objEFace.data, index, elemEFace.data) +} + +func (type2 *UnsafeArrayType) UnsafeSetIndex(obj unsafe.Pointer, index int, elem unsafe.Pointer) { + elemPtr := arrayAt(obj, index, type2.elemSize, "i < s.Len") + typedmemmove(type2.elemRType, elemPtr, elem) +} + +func (type2 *UnsafeArrayType) GetIndex(obj interface{}, index int) interface{} { + objEFace := unpackEFace(obj) + assertType("ArrayType.GetIndex argument 1", type2.ptrRType, objEFace.rtype) + elemPtr := type2.UnsafeGetIndex(objEFace.data, index) + return packEFace(type2.pElemRType, elemPtr) +} + +func (type2 *UnsafeArrayType) UnsafeGetIndex(obj unsafe.Pointer, index int) unsafe.Pointer { + return arrayAt(obj, index, type2.elemSize, "i < s.Len") +} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_eface.go b/vendor/github.com/modern-go/reflect2/unsafe_eface.go new file mode 100644 index 000000000..805010f3a --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/unsafe_eface.go @@ -0,0 +1,59 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +type eface struct { + rtype unsafe.Pointer + data unsafe.Pointer +} + +func unpackEFace(obj interface{}) *eface { + return (*eface)(unsafe.Pointer(&obj)) +} + +func packEFace(rtype unsafe.Pointer, data unsafe.Pointer) interface{} { + var i interface{} + e := (*eface)(unsafe.Pointer(&i)) + e.rtype = rtype + e.data = data + return i +} + +type UnsafeEFaceType struct { + unsafeType +} + +func newUnsafeEFaceType(cfg *frozenConfig, type1 reflect.Type) *UnsafeEFaceType { + return &UnsafeEFaceType{ + unsafeType: *newUnsafeType(cfg, type1), + } +} + +func (type2 *UnsafeEFaceType) IsNil(obj interface{}) bool { + if obj == nil { + return true + } + objEFace := unpackEFace(obj) + assertType("Type.IsNil argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIsNil(objEFace.data) +} + +func (type2 *UnsafeEFaceType) UnsafeIsNil(ptr unsafe.Pointer) bool { + if ptr == nil { + return true + } + return unpackEFace(*(*interface{})(ptr)).data == nil +} + +func (type2 *UnsafeEFaceType) Indirect(obj interface{}) interface{} { + objEFace := unpackEFace(obj) + assertType("Type.Indirect argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIndirect(objEFace.data) +} + +func (type2 *UnsafeEFaceType) UnsafeIndirect(ptr unsafe.Pointer) interface{} { + return *(*interface{})(ptr) +} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_field.go b/vendor/github.com/modern-go/reflect2/unsafe_field.go new file mode 100644 index 000000000..5eb53130a --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/unsafe_field.go @@ -0,0 +1,74 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +type UnsafeStructField struct { + reflect.StructField + structType *UnsafeStructType + rtype unsafe.Pointer + ptrRType unsafe.Pointer +} + +func newUnsafeStructField(structType *UnsafeStructType, structField reflect.StructField) *UnsafeStructField { + return &UnsafeStructField{ + StructField: structField, + rtype: unpackEFace(structField.Type).data, + ptrRType: unpackEFace(reflect.PtrTo(structField.Type)).data, + structType: structType, + } +} + +func (field *UnsafeStructField) Offset() uintptr { + return field.StructField.Offset +} + +func (field *UnsafeStructField) Name() string { + return field.StructField.Name +} + +func (field *UnsafeStructField) PkgPath() string { + return field.StructField.PkgPath +} + +func (field *UnsafeStructField) Type() Type { + return field.structType.cfg.Type2(field.StructField.Type) +} + +func (field *UnsafeStructField) Tag() reflect.StructTag { + return field.StructField.Tag +} + +func (field *UnsafeStructField) Index() []int { + return field.StructField.Index +} + +func (field *UnsafeStructField) Anonymous() bool { + return field.StructField.Anonymous +} + +func (field *UnsafeStructField) Set(obj interface{}, value interface{}) { + objEFace := unpackEFace(obj) + assertType("StructField.SetIndex argument 1", field.structType.ptrRType, objEFace.rtype) + valueEFace := unpackEFace(value) + assertType("StructField.SetIndex argument 2", field.ptrRType, valueEFace.rtype) + field.UnsafeSet(objEFace.data, valueEFace.data) +} + +func (field *UnsafeStructField) UnsafeSet(obj unsafe.Pointer, value unsafe.Pointer) { + fieldPtr := add(obj, field.StructField.Offset, "same as non-reflect &v.field") + typedmemmove(field.rtype, fieldPtr, value) +} + +func (field *UnsafeStructField) Get(obj interface{}) interface{} { + objEFace := unpackEFace(obj) + assertType("StructField.GetIndex argument 1", field.structType.ptrRType, objEFace.rtype) + value := field.UnsafeGet(objEFace.data) + return packEFace(field.ptrRType, value) +} + +func (field *UnsafeStructField) UnsafeGet(obj unsafe.Pointer) unsafe.Pointer { + return add(obj, field.StructField.Offset, "same as non-reflect &v.field") +} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_iface.go b/vendor/github.com/modern-go/reflect2/unsafe_iface.go new file mode 100644 index 000000000..b60195533 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/unsafe_iface.go @@ -0,0 +1,64 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +type iface struct { + itab *itab + data unsafe.Pointer +} + +type itab struct { + ignore unsafe.Pointer + rtype unsafe.Pointer +} + +func IFaceToEFace(ptr unsafe.Pointer) interface{} { + iface := (*iface)(ptr) + if iface.itab == nil { + return nil + } + return packEFace(iface.itab.rtype, iface.data) +} + +type UnsafeIFaceType struct { + unsafeType +} + +func newUnsafeIFaceType(cfg *frozenConfig, type1 reflect.Type) *UnsafeIFaceType { + return &UnsafeIFaceType{ + unsafeType: *newUnsafeType(cfg, type1), + } +} + +func (type2 *UnsafeIFaceType) Indirect(obj interface{}) interface{} { + objEFace := unpackEFace(obj) + assertType("Type.Indirect argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIndirect(objEFace.data) +} + +func (type2 *UnsafeIFaceType) UnsafeIndirect(ptr unsafe.Pointer) interface{} { + return IFaceToEFace(ptr) +} + +func (type2 *UnsafeIFaceType) IsNil(obj interface{}) bool { + if obj == nil { + return true + } + objEFace := unpackEFace(obj) + assertType("Type.IsNil argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIsNil(objEFace.data) +} + +func (type2 *UnsafeIFaceType) UnsafeIsNil(ptr unsafe.Pointer) bool { + if ptr == nil { + return true + } + iface := (*iface)(ptr) + if iface.itab == nil { + return true + } + return false +} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_link.go b/vendor/github.com/modern-go/reflect2/unsafe_link.go new file mode 100644 index 000000000..57229c8db --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/unsafe_link.go @@ -0,0 +1,70 @@ +package reflect2 + +import "unsafe" + +//go:linkname unsafe_New reflect.unsafe_New +func unsafe_New(rtype unsafe.Pointer) unsafe.Pointer + +//go:linkname typedmemmove reflect.typedmemmove +func typedmemmove(rtype unsafe.Pointer, dst, src unsafe.Pointer) + +//go:linkname unsafe_NewArray reflect.unsafe_NewArray +func unsafe_NewArray(rtype unsafe.Pointer, length int) unsafe.Pointer + +// typedslicecopy copies a slice of elemType values from src to dst, +// returning the number of elements copied. +//go:linkname typedslicecopy reflect.typedslicecopy +//go:noescape +func typedslicecopy(elemType unsafe.Pointer, dst, src sliceHeader) int + +//go:linkname mapassign reflect.mapassign +//go:noescape +func mapassign(rtype unsafe.Pointer, m unsafe.Pointer, key, val unsafe.Pointer) + +//go:linkname mapaccess reflect.mapaccess +//go:noescape +func mapaccess(rtype unsafe.Pointer, m unsafe.Pointer, key unsafe.Pointer) (val unsafe.Pointer) + +// m escapes into the return value, but the caller of mapiterinit +// doesn't let the return value escape. +//go:noescape +//go:linkname mapiterinit reflect.mapiterinit +func mapiterinit(rtype unsafe.Pointer, m unsafe.Pointer) *hiter + +//go:noescape +//go:linkname mapiternext reflect.mapiternext +func mapiternext(it *hiter) + +//go:linkname ifaceE2I reflect.ifaceE2I +func ifaceE2I(rtype unsafe.Pointer, src interface{}, dst unsafe.Pointer) + +// A hash iteration structure. +// If you modify hiter, also change cmd/internal/gc/reflect.go to indicate +// the layout of this structure. +type hiter struct { + key unsafe.Pointer // Must be in first position. Write nil to indicate iteration end (see cmd/internal/gc/range.go). + value unsafe.Pointer // Must be in second position (see cmd/internal/gc/range.go). + // rest fields are ignored +} + +// add returns p+x. +// +// The whySafe string is ignored, so that the function still inlines +// as efficiently as p+x, but all call sites should use the string to +// record why the addition is safe, which is to say why the addition +// does not cause x to advance to the very end of p's allocation +// and therefore point incorrectly at the next block in memory. +func add(p unsafe.Pointer, x uintptr, whySafe string) unsafe.Pointer { + return unsafe.Pointer(uintptr(p) + x) +} + +// arrayAt returns the i-th element of p, +// an array whose elements are eltSize bytes wide. +// The array pointed at by p must have at least i+1 elements: +// it is invalid (but impossible to check here) to pass i >= len, +// because then the result will point outside the array. +// whySafe must explain why i < len. (Passing "i < len" is fine; +// the benefit is to surface this assumption at the call site.) +func arrayAt(p unsafe.Pointer, i int, eltSize uintptr, whySafe string) unsafe.Pointer { + return add(p, uintptr(i)*eltSize, "i < len") +} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_map.go b/vendor/github.com/modern-go/reflect2/unsafe_map.go new file mode 100644 index 000000000..f2e76e6bb --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/unsafe_map.go @@ -0,0 +1,138 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +type UnsafeMapType struct { + unsafeType + pKeyRType unsafe.Pointer + pElemRType unsafe.Pointer +} + +func newUnsafeMapType(cfg *frozenConfig, type1 reflect.Type) MapType { + return &UnsafeMapType{ + unsafeType: *newUnsafeType(cfg, type1), + pKeyRType: unpackEFace(reflect.PtrTo(type1.Key())).data, + pElemRType: unpackEFace(reflect.PtrTo(type1.Elem())).data, + } +} + +func (type2 *UnsafeMapType) IsNil(obj interface{}) bool { + if obj == nil { + return true + } + objEFace := unpackEFace(obj) + assertType("Type.IsNil argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIsNil(objEFace.data) +} + +func (type2 *UnsafeMapType) UnsafeIsNil(ptr unsafe.Pointer) bool { + if ptr == nil { + return true + } + return *(*unsafe.Pointer)(ptr) == nil +} + +func (type2 *UnsafeMapType) LikePtr() bool { + return true +} + +func (type2 *UnsafeMapType) Indirect(obj interface{}) interface{} { + objEFace := unpackEFace(obj) + assertType("MapType.Indirect argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIndirect(objEFace.data) +} + +func (type2 *UnsafeMapType) UnsafeIndirect(ptr unsafe.Pointer) interface{} { + return packEFace(type2.rtype, *(*unsafe.Pointer)(ptr)) +} + +func (type2 *UnsafeMapType) Key() Type { + return type2.cfg.Type2(type2.Type.Key()) +} + +func (type2 *UnsafeMapType) MakeMap(cap int) interface{} { + return packEFace(type2.ptrRType, type2.UnsafeMakeMap(cap)) +} + +func (type2 *UnsafeMapType) UnsafeMakeMap(cap int) unsafe.Pointer { + m := makeMapWithSize(type2.rtype, cap) + return unsafe.Pointer(&m) +} + +func (type2 *UnsafeMapType) SetIndex(obj interface{}, key interface{}, elem interface{}) { + objEFace := unpackEFace(obj) + assertType("MapType.SetIndex argument 1", type2.ptrRType, objEFace.rtype) + keyEFace := unpackEFace(key) + assertType("MapType.SetIndex argument 2", type2.pKeyRType, keyEFace.rtype) + elemEFace := unpackEFace(elem) + assertType("MapType.SetIndex argument 3", type2.pElemRType, elemEFace.rtype) + type2.UnsafeSetIndex(objEFace.data, keyEFace.data, elemEFace.data) +} + +func (type2 *UnsafeMapType) UnsafeSetIndex(obj unsafe.Pointer, key unsafe.Pointer, elem unsafe.Pointer) { + mapassign(type2.rtype, *(*unsafe.Pointer)(obj), key, elem) +} + +func (type2 *UnsafeMapType) TryGetIndex(obj interface{}, key interface{}) (interface{}, bool) { + objEFace := unpackEFace(obj) + assertType("MapType.TryGetIndex argument 1", type2.ptrRType, objEFace.rtype) + keyEFace := unpackEFace(key) + assertType("MapType.TryGetIndex argument 2", type2.pKeyRType, keyEFace.rtype) + elemPtr := type2.UnsafeGetIndex(objEFace.data, keyEFace.data) + if elemPtr == nil { + return nil, false + } + return packEFace(type2.pElemRType, elemPtr), true +} + +func (type2 *UnsafeMapType) GetIndex(obj interface{}, key interface{}) interface{} { + objEFace := unpackEFace(obj) + assertType("MapType.GetIndex argument 1", type2.ptrRType, objEFace.rtype) + keyEFace := unpackEFace(key) + assertType("MapType.GetIndex argument 2", type2.pKeyRType, keyEFace.rtype) + elemPtr := type2.UnsafeGetIndex(objEFace.data, keyEFace.data) + return packEFace(type2.pElemRType, elemPtr) +} + +func (type2 *UnsafeMapType) UnsafeGetIndex(obj unsafe.Pointer, key unsafe.Pointer) unsafe.Pointer { + return mapaccess(type2.rtype, *(*unsafe.Pointer)(obj), key) +} + +func (type2 *UnsafeMapType) Iterate(obj interface{}) MapIterator { + objEFace := unpackEFace(obj) + assertType("MapType.Iterate argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIterate(objEFace.data) +} + +func (type2 *UnsafeMapType) UnsafeIterate(obj unsafe.Pointer) MapIterator { + return &UnsafeMapIterator{ + hiter: mapiterinit(type2.rtype, *(*unsafe.Pointer)(obj)), + pKeyRType: type2.pKeyRType, + pElemRType: type2.pElemRType, + } +} + +type UnsafeMapIterator struct { + *hiter + pKeyRType unsafe.Pointer + pElemRType unsafe.Pointer +} + +func (iter *UnsafeMapIterator) HasNext() bool { + return iter.key != nil +} + +func (iter *UnsafeMapIterator) Next() (interface{}, interface{}) { + key, elem := iter.UnsafeNext() + return packEFace(iter.pKeyRType, key), packEFace(iter.pElemRType, elem) +} + +func (iter *UnsafeMapIterator) UnsafeNext() (unsafe.Pointer, unsafe.Pointer) { + key := iter.key + elem := iter.value + mapiternext(iter.hiter) + return key, elem +} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_ptr.go b/vendor/github.com/modern-go/reflect2/unsafe_ptr.go new file mode 100644 index 000000000..8e5ec9cf4 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/unsafe_ptr.go @@ -0,0 +1,46 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +type UnsafePtrType struct { + unsafeType +} + +func newUnsafePtrType(cfg *frozenConfig, type1 reflect.Type) *UnsafePtrType { + return &UnsafePtrType{ + unsafeType: *newUnsafeType(cfg, type1), + } +} + +func (type2 *UnsafePtrType) IsNil(obj interface{}) bool { + if obj == nil { + return true + } + objEFace := unpackEFace(obj) + assertType("Type.IsNil argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIsNil(objEFace.data) +} + +func (type2 *UnsafePtrType) UnsafeIsNil(ptr unsafe.Pointer) bool { + if ptr == nil { + return true + } + return *(*unsafe.Pointer)(ptr) == nil +} + +func (type2 *UnsafePtrType) LikePtr() bool { + return true +} + +func (type2 *UnsafePtrType) Indirect(obj interface{}) interface{} { + objEFace := unpackEFace(obj) + assertType("Type.Indirect argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIndirect(objEFace.data) +} + +func (type2 *UnsafePtrType) UnsafeIndirect(ptr unsafe.Pointer) interface{} { + return packEFace(type2.rtype, *(*unsafe.Pointer)(ptr)) +} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_slice.go b/vendor/github.com/modern-go/reflect2/unsafe_slice.go new file mode 100644 index 000000000..1c6d876c7 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/unsafe_slice.go @@ -0,0 +1,177 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +// sliceHeader is a safe version of SliceHeader used within this package. +type sliceHeader struct { + Data unsafe.Pointer + Len int + Cap int +} + +type UnsafeSliceType struct { + unsafeType + elemRType unsafe.Pointer + pElemRType unsafe.Pointer + elemSize uintptr +} + +func newUnsafeSliceType(cfg *frozenConfig, type1 reflect.Type) SliceType { + elemType := type1.Elem() + return &UnsafeSliceType{ + unsafeType: *newUnsafeType(cfg, type1), + pElemRType: unpackEFace(reflect.PtrTo(elemType)).data, + elemRType: unpackEFace(elemType).data, + elemSize: elemType.Size(), + } +} + +func (type2 *UnsafeSliceType) Set(obj interface{}, val interface{}) { + objEFace := unpackEFace(obj) + assertType("Type.Set argument 1", type2.ptrRType, objEFace.rtype) + valEFace := unpackEFace(val) + assertType("Type.Set argument 2", type2.ptrRType, valEFace.rtype) + type2.UnsafeSet(objEFace.data, valEFace.data) +} + +func (type2 *UnsafeSliceType) UnsafeSet(ptr unsafe.Pointer, val unsafe.Pointer) { + *(*sliceHeader)(ptr) = *(*sliceHeader)(val) +} + +func (type2 *UnsafeSliceType) IsNil(obj interface{}) bool { + if obj == nil { + return true + } + objEFace := unpackEFace(obj) + assertType("Type.IsNil argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIsNil(objEFace.data) +} + +func (type2 *UnsafeSliceType) UnsafeIsNil(ptr unsafe.Pointer) bool { + if ptr == nil { + return true + } + return (*sliceHeader)(ptr).Data == nil +} + +func (type2 *UnsafeSliceType) SetNil(obj interface{}) { + objEFace := unpackEFace(obj) + assertType("SliceType.SetNil argument 1", type2.ptrRType, objEFace.rtype) + type2.UnsafeSetNil(objEFace.data) +} + +func (type2 *UnsafeSliceType) UnsafeSetNil(ptr unsafe.Pointer) { + header := (*sliceHeader)(ptr) + header.Len = 0 + header.Cap = 0 + header.Data = nil +} + +func (type2 *UnsafeSliceType) MakeSlice(length int, cap int) interface{} { + return packEFace(type2.ptrRType, type2.UnsafeMakeSlice(length, cap)) +} + +func (type2 *UnsafeSliceType) UnsafeMakeSlice(length int, cap int) unsafe.Pointer { + header := &sliceHeader{unsafe_NewArray(type2.elemRType, cap), length, cap} + return unsafe.Pointer(header) +} + +func (type2 *UnsafeSliceType) LengthOf(obj interface{}) int { + objEFace := unpackEFace(obj) + assertType("SliceType.Len argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeLengthOf(objEFace.data) +} + +func (type2 *UnsafeSliceType) UnsafeLengthOf(obj unsafe.Pointer) int { + header := (*sliceHeader)(obj) + return header.Len +} + +func (type2 *UnsafeSliceType) SetIndex(obj interface{}, index int, elem interface{}) { + objEFace := unpackEFace(obj) + assertType("SliceType.SetIndex argument 1", type2.ptrRType, objEFace.rtype) + elemEFace := unpackEFace(elem) + assertType("SliceType.SetIndex argument 3", type2.pElemRType, elemEFace.rtype) + type2.UnsafeSetIndex(objEFace.data, index, elemEFace.data) +} + +func (type2 *UnsafeSliceType) UnsafeSetIndex(obj unsafe.Pointer, index int, elem unsafe.Pointer) { + header := (*sliceHeader)(obj) + elemPtr := arrayAt(header.Data, index, type2.elemSize, "i < s.Len") + typedmemmove(type2.elemRType, elemPtr, elem) +} + +func (type2 *UnsafeSliceType) GetIndex(obj interface{}, index int) interface{} { + objEFace := unpackEFace(obj) + assertType("SliceType.GetIndex argument 1", type2.ptrRType, objEFace.rtype) + elemPtr := type2.UnsafeGetIndex(objEFace.data, index) + return packEFace(type2.pElemRType, elemPtr) +} + +func (type2 *UnsafeSliceType) UnsafeGetIndex(obj unsafe.Pointer, index int) unsafe.Pointer { + header := (*sliceHeader)(obj) + return arrayAt(header.Data, index, type2.elemSize, "i < s.Len") +} + +func (type2 *UnsafeSliceType) Append(obj interface{}, elem interface{}) { + objEFace := unpackEFace(obj) + assertType("SliceType.Append argument 1", type2.ptrRType, objEFace.rtype) + elemEFace := unpackEFace(elem) + assertType("SliceType.Append argument 2", type2.pElemRType, elemEFace.rtype) + type2.UnsafeAppend(objEFace.data, elemEFace.data) +} + +func (type2 *UnsafeSliceType) UnsafeAppend(obj unsafe.Pointer, elem unsafe.Pointer) { + header := (*sliceHeader)(obj) + oldLen := header.Len + type2.UnsafeGrow(obj, oldLen+1) + type2.UnsafeSetIndex(obj, oldLen, elem) +} + +func (type2 *UnsafeSliceType) Cap(obj interface{}) int { + objEFace := unpackEFace(obj) + assertType("SliceType.Cap argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeCap(objEFace.data) +} + +func (type2 *UnsafeSliceType) UnsafeCap(ptr unsafe.Pointer) int { + return (*sliceHeader)(ptr).Cap +} + +func (type2 *UnsafeSliceType) Grow(obj interface{}, newLength int) { + objEFace := unpackEFace(obj) + assertType("SliceType.Grow argument 1", type2.ptrRType, objEFace.rtype) + type2.UnsafeGrow(objEFace.data, newLength) +} + +func (type2 *UnsafeSliceType) UnsafeGrow(obj unsafe.Pointer, newLength int) { + header := (*sliceHeader)(obj) + if newLength <= header.Cap { + header.Len = newLength + return + } + newCap := calcNewCap(header.Cap, newLength) + newHeader := (*sliceHeader)(type2.UnsafeMakeSlice(header.Len, newCap)) + typedslicecopy(type2.elemRType, *newHeader, *header) + header.Data = newHeader.Data + header.Cap = newHeader.Cap + header.Len = newLength +} + +func calcNewCap(cap int, expectedCap int) int { + if cap == 0 { + cap = expectedCap + } else { + for cap < expectedCap { + if cap < 1024 { + cap += cap + } else { + cap += cap / 4 + } + } + } + return cap +} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_struct.go b/vendor/github.com/modern-go/reflect2/unsafe_struct.go new file mode 100644 index 000000000..804d91663 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/unsafe_struct.go @@ -0,0 +1,59 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +type UnsafeStructType struct { + unsafeType + likePtr bool +} + +func newUnsafeStructType(cfg *frozenConfig, type1 reflect.Type) *UnsafeStructType { + return &UnsafeStructType{ + unsafeType: *newUnsafeType(cfg, type1), + likePtr: likePtrType(type1), + } +} + +func (type2 *UnsafeStructType) LikePtr() bool { + return type2.likePtr +} + +func (type2 *UnsafeStructType) Indirect(obj interface{}) interface{} { + objEFace := unpackEFace(obj) + assertType("Type.Indirect argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIndirect(objEFace.data) +} + +func (type2 *UnsafeStructType) UnsafeIndirect(ptr unsafe.Pointer) interface{} { + if type2.likePtr { + return packEFace(type2.rtype, *(*unsafe.Pointer)(ptr)) + } + return packEFace(type2.rtype, ptr) +} + +func (type2 *UnsafeStructType) FieldByName(name string) StructField { + structField, found := type2.Type.FieldByName(name) + if !found { + return nil + } + return newUnsafeStructField(type2, structField) +} + +func (type2 *UnsafeStructType) Field(i int) StructField { + return newUnsafeStructField(type2, type2.Type.Field(i)) +} + +func (type2 *UnsafeStructType) FieldByIndex(index []int) StructField { + return newUnsafeStructField(type2, type2.Type.FieldByIndex(index)) +} + +func (type2 *UnsafeStructType) FieldByNameFunc(match func(string) bool) StructField { + structField, found := type2.Type.FieldByNameFunc(match) + if !found { + panic("field match condition not found in " + type2.Type.String()) + } + return newUnsafeStructField(type2, structField) +} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_type.go b/vendor/github.com/modern-go/reflect2/unsafe_type.go new file mode 100644 index 000000000..13941716c --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/unsafe_type.go @@ -0,0 +1,85 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +type unsafeType struct { + safeType + rtype unsafe.Pointer + ptrRType unsafe.Pointer +} + +func newUnsafeType(cfg *frozenConfig, type1 reflect.Type) *unsafeType { + return &unsafeType{ + safeType: safeType{ + Type: type1, + cfg: cfg, + }, + rtype: unpackEFace(type1).data, + ptrRType: unpackEFace(reflect.PtrTo(type1)).data, + } +} + +func (type2 *unsafeType) Set(obj interface{}, val interface{}) { + objEFace := unpackEFace(obj) + assertType("Type.Set argument 1", type2.ptrRType, objEFace.rtype) + valEFace := unpackEFace(val) + assertType("Type.Set argument 2", type2.ptrRType, valEFace.rtype) + type2.UnsafeSet(objEFace.data, valEFace.data) +} + +func (type2 *unsafeType) UnsafeSet(ptr unsafe.Pointer, val unsafe.Pointer) { + typedmemmove(type2.rtype, ptr, val) +} + +func (type2 *unsafeType) IsNil(obj interface{}) bool { + objEFace := unpackEFace(obj) + assertType("Type.IsNil argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIsNil(objEFace.data) +} + +func (type2 *unsafeType) UnsafeIsNil(ptr unsafe.Pointer) bool { + return ptr == nil +} + +func (type2 *unsafeType) UnsafeNew() unsafe.Pointer { + return unsafe_New(type2.rtype) +} + +func (type2 *unsafeType) New() interface{} { + return packEFace(type2.ptrRType, type2.UnsafeNew()) +} + +func (type2 *unsafeType) PackEFace(ptr unsafe.Pointer) interface{} { + return packEFace(type2.ptrRType, ptr) +} + +func (type2 *unsafeType) RType() uintptr { + return uintptr(type2.rtype) +} + +func (type2 *unsafeType) Indirect(obj interface{}) interface{} { + objEFace := unpackEFace(obj) + assertType("Type.Indirect argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIndirect(objEFace.data) +} + +func (type2 *unsafeType) UnsafeIndirect(obj unsafe.Pointer) interface{} { + return packEFace(type2.rtype, obj) +} + +func (type2 *unsafeType) LikePtr() bool { + return false +} + +func assertType(where string, expectRType unsafe.Pointer, actualRType unsafe.Pointer) { + if expectRType != actualRType { + expectType := reflect.TypeOf(0) + (*iface)(unsafe.Pointer(&expectType)).data = expectRType + actualType := reflect.TypeOf(0) + (*iface)(unsafe.Pointer(&actualType)).data = actualRType + panic(where + ": expect " + expectType.String() + ", actual " + actualType.String()) + } +} diff --git a/vendor/github.com/montanaflynn/stats/.travis.yml b/vendor/github.com/montanaflynn/stats/.travis.yml index 697dcb759..8148ff536 100644 --- a/vendor/github.com/montanaflynn/stats/.travis.yml +++ b/vendor/github.com/montanaflynn/stats/.travis.yml @@ -1,17 +1,13 @@ language: go go: - - 1.1 - - 1.2 - - 1.3 - - 1.4 - - 1.5 - - tip + - stable + - master before_install: - - sudo pip install codecov + - go get github.com/mattn/goveralls script: - - go test + - go test -v -covermode=count -coverprofile=coverage.out after_success: - - codecov + - $GOPATH/bin/goveralls -coverprofile=coverage.out -service=travis-ci notifications: email: recipients: diff --git a/vendor/github.com/montanaflynn/stats/README.md b/vendor/github.com/montanaflynn/stats/README.md index 5f8a9291b..a27f7edf4 100644 --- a/vendor/github.com/montanaflynn/stats/README.md +++ b/vendor/github.com/montanaflynn/stats/README.md @@ -1,8 +1,9 @@ -# Stats [![][travis-svg]][travis-url] [![][coveralls-svg]][coveralls-url] [![][godoc-svg]][godoc-url] [![][license-svg]][license-url] +# Stats [![][travis-svg]][travis-url] [![][coveralls-svg]][coveralls-url] [![][goreport-svg]][goreport-url] [![][godoc-svg]][godoc-url] [![][license-svg]][license-url] -A statistics package with many functions missing from the Golang standard library. See the [CHANGELOG.md](https://github.com/montanaflynn/stats/blob/master/CHANGELOG.md) for API changes and tagged releases you can vendor into your projects. +A well tested and comprehensive Golang statistics library package with no dependencies. + +If you have any suggestions, problems or bug reports please [create an issue](https://github.com/montanaflynn/stats/issues) and I'll do my best to accommodate you. In addition simply starring the repo would show your support for the project and be very much appreciated! -> Statistics are used much like a drunk uses a lamppost: for support, not illumination. **- Vin Scully** ## Installation @@ -10,55 +11,130 @@ A statistics package with many functions missing from the Golang standard librar go get github.com/montanaflynn/stats ``` -**Protip:** `go get -u github.com/montanaflynn/stats` updates stats to the latest version. - -## Usage - -The [entire API documentation](http://godoc.org/github.com/montanaflynn/stats) is available on GoDoc.org - -You can view docs offline with the following commands: - -``` -godoc ./ -godoc ./ Median -godoc ./ Float64Data -``` - -**Protip:** Generate HTML docs with `godoc -http=:4444` - -## Example +## Example Usage All the functions can be seen in [examples/main.go](https://github.com/montanaflynn/stats/blob/master/examples/main.go) but here's a little taste: ```go -// start with the some source data to use -var data = []float64{1, 2, 3, 4, 4, 5} +// start with some source data to use +data := []float64{1.0, 2.1, 3.2, 4.823, 4.1, 5.8} + +// you could also use different types like this +// data := stats.LoadRawData([]int{1, 2, 3, 4, 5}) +// data := stats.LoadRawData([]interface{}{1.1, "2", 3}) +// etc... median, _ := stats.Median(data) -fmt.Println(median) // 3.5 +fmt.Println(median) // 3.65 roundedMedian, _ := stats.Round(median, 0) fmt.Println(roundedMedian) // 4 ``` -**Protip:** You can [call methods](https://github.com/montanaflynn/stats/blob/master/examples/methods.go) on the data if using the Float64Data type: +## Documentation + +The [entire API documentation](http://godoc.org/github.com/montanaflynn/stats) is available on GoDoc.org + +You can view docs offline with the following commands: ``` -var d stats.Float64Data = data +# Command line +godoc ./ +godoc ./ Median +godoc ./ Float64Data -max, _ := d.Max() -fmt.Println(max) // 5 +# Local website +godoc -http=:4444 +open http://localhost:4444/pkg/github.com/montanaflynn/stats/ ``` -## Contributing +The exported API is as follows: -If you have any suggestions, criticism or bug reports please [create an issue](https://github.com/montanaflynn/stats/issues) and I'll do my best to accommodate you. In addition simply starring the repo would show your support for the project and be very much appreciated! +```go +var ( + EmptyInputErr = statsErr{"Input must not be empty."} + NaNErr = statsErr{"Not a number."} + NegativeErr = statsErr{"Must not contain negative values."} + ZeroErr = statsErr{"Must not contain zero values."} + BoundsErr = statsErr{"Input is outside of range."} + SizeErr = statsErr{"Must be the same length."} + InfValue = statsErr{"Value is infinite."} + YCoordErr = statsErr{"Y Value must be greater than zero."} +) + +type Float64Data []float64 + +func LoadRawData(raw interface{}) (f Float64Data) {} +func AutoCorrelation(data Float64Data, lags int) (float64, error) {} +func ChebyshevDistance(dataPointX, dataPointY []float64) (distance float64, err error) {} +func Correlation(data1, data2 Float64Data) (float64, error) {} +func Covariance(data1, data2 Float64Data) (float64, error) {} +func CovariancePopulation(data1, data2 Float64Data) (float64, error) {} +func CumulativeSum(input Float64Data) ([]float64, error) {} +func EuclideanDistance(dataPointX, dataPointY []float64) (distance float64, err error) {} +func GeometricMean(input Float64Data) (float64, error) {} +func HarmonicMean(input Float64Data) (float64, error) {} +func InterQuartileRange(input Float64Data) (float64, error) {} +func ManhattanDistance(dataPointX, dataPointY []float64) (distance float64, err error) {} +func Max(input Float64Data) (max float64, err error) {} +func Mean(input Float64Data) (float64, error) {} +func Median(input Float64Data) (median float64, err error) {} +func MedianAbsoluteDeviation(input Float64Data) (mad float64, err error) {} +func MedianAbsoluteDeviationPopulation(input Float64Data) (mad float64, err error) {} +func Midhinge(input Float64Data) (float64, error) {} +func Min(input Float64Data) (min float64, err error) {} +func MinkowskiDistance(dataPointX, dataPointY []float64, lambda float64) (distance float64, err error) {} +func Mode(input Float64Data) (mode []float64, err error) {} +func Pearson(data1, data2 Float64Data) (float64, error) {} +func Percentile(input Float64Data, percent float64) (percentile float64, err error) {} +func PercentileNearestRank(input Float64Data, percent float64) (percentile float64, err error) {} +func PopulationVariance(input Float64Data) (pvar float64, err error) {} +func Round(input float64, places int) (rounded float64, err error) {} +func Sample(input Float64Data, takenum int, replacement bool) ([]float64, error) {} +func SampleVariance(input Float64Data) (svar float64, err error) {} +func Sigmoid(input Float64Data) ([]float64, error) {} +func SoftMax(input Float64Data) ([]float64, error) {} +func StandardDeviation(input Float64Data) (sdev float64, err error) {} +func StandardDeviationPopulation(input Float64Data) (sdev float64, err error) {} +func StandardDeviationSample(input Float64Data) (sdev float64, err error) {} +func StdDevP(input Float64Data) (sdev float64, err error) {} +func StdDevS(input Float64Data) (sdev float64, err error) {} +func Sum(input Float64Data) (sum float64, err error) {} +func Trimean(input Float64Data) (float64, error) {} +func VarP(input Float64Data) (sdev float64, err error) {} +func VarS(input Float64Data) (sdev float64, err error) {} +func Variance(input Float64Data) (sdev float64, err error) {} + +type Coordinate struct { + X, Y float64 +} + +type Series []Coordinate + +func ExponentialRegression(s Series) (regressions Series, err error) {} +func LinearRegression(s Series) (regressions Series, err error) {} +func LogarithmicRegression(s Series) (regressions Series, err error) {} + +type Outliers struct { + Mild Float64Data + Extreme Float64Data +} + +type Quartiles struct { + Q1 float64 + Q2 float64 + Q3 float64 +} + +func Quartile(input Float64Data) (Quartiles, error) {} +func QuartileOutliers(input Float64Data) (Outliers, error) {} +``` -### Pull Requests +## Contributing -Pull request are always welcome no matter how big or small. Here's an easy way to do it: +Pull request are always welcome no matter how big or small. I've included a [Makefile](https://github.com/montanaflynn/stats/blob/master/Makefile) that has a lot of helper targets for common actions such as linting, testing, code coverage reporting and more. -1. Fork it and clone your fork +1. Fork the repo and clone your fork 2. Create new branch (`git checkout -b some-thing`) 3. Make the desired changes 4. Ensure tests pass (`go test -cover` or `make test`) @@ -68,21 +144,14 @@ Pull request are always welcome no matter how big or small. Here's an easy way t To make things as seamless as possible please also consider the following steps: -- Update `README.md` to include new public types or functions in the documentation section. -- Update `examples/main.go` with a simple example of the new feature. -- Keep 100% code coverage (you can check with `make coverage`). -- Run [`gometalinter`](https://github.com/alecthomas/gometalinter) and make your code pass. -- Squash needless commits into single units of work with `git rebase -i new-feature`. - -#### Makefile - -I've included a [Makefile](https://github.com/montanaflynn/stats/blob/master/Makefile) that has a lot of helper targets for common actions such as linting, testing, code coverage reporting and more. - -**Protip:** `watch -n 1 make check` will continuously format and test your code. +- Update `examples/main.go` with a simple example of the new feature +- Update `README.md` documentation section with any new exported API +- Keep 100% code coverage (you can check with `make coverage`) +- Squash commits into single units of work with `git rebase -i new-feature` ## MIT License -Copyright (c) 2014-2015 Montana Flynn +Copyright (c) 2014-2019 Montana Flynn Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: @@ -96,6 +165,9 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI [coveralls-url]: https://coveralls.io/r/montanaflynn/stats?branch=master [coveralls-svg]: https://img.shields.io/coveralls/montanaflynn/stats.svg +[goreport-url]: https://goreportcard.com/report/github.com/montanaflynn/stats +[goreport-svg]: https://goreportcard.com/badge/github.com/montanaflynn/stats + [godoc-url]: https://godoc.org/github.com/montanaflynn/stats [godoc-svg]: https://godoc.org/github.com/montanaflynn/stats?status.svg diff --git a/vendor/github.com/montanaflynn/stats/correlation.go b/vendor/github.com/montanaflynn/stats/correlation.go index d759bf8c4..549f94ba3 100644 --- a/vendor/github.com/montanaflynn/stats/correlation.go +++ b/vendor/github.com/montanaflynn/stats/correlation.go @@ -1,6 +1,8 @@ package stats -import "math" +import ( + "math" +) // Correlation describes the degree of relationship between two sets of data func Correlation(data1, data2 Float64Data) (float64, error) { @@ -9,7 +11,7 @@ func Correlation(data1, data2 Float64Data) (float64, error) { l2 := data2.Len() if l1 == 0 || l2 == 0 { - return math.NaN(), EmptyInput + return math.NaN(), EmptyInputErr } if l1 != l2 { @@ -27,7 +29,32 @@ func Correlation(data1, data2 Float64Data) (float64, error) { return covp / (sdev1 * sdev2), nil } -// Pearson calculates the Pearson product-moment correlation coefficient between two variables. +// Pearson calculates the Pearson product-moment correlation coefficient between two variables func Pearson(data1, data2 Float64Data) (float64, error) { return Correlation(data1, data2) } + +// Autocorrelation is the correlation of a signal with a delayed copy of itself as a function of delay +func AutoCorrelation(data Float64Data, lags int) (float64, error) { + if len(data) < 1 { + return 0, EmptyInputErr + } + + mean, _ := Mean(data) + + var result, q float64 + + for i := 0; i < lags; i++ { + v := (data[0] - mean) * (data[0] - mean) + for i := 1; i < len(data); i++ { + delta0 := data[i-1] - mean + delta1 := data[i] - mean + q += (delta0*delta1 - q) / float64(i+1) + v += (delta1*delta1 - v) / float64(i+1) + } + + result = q / v + } + + return result, nil +} diff --git a/vendor/github.com/montanaflynn/stats/cumulative_sum.go b/vendor/github.com/montanaflynn/stats/cumulative_sum.go new file mode 100644 index 000000000..e5305daf3 --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/cumulative_sum.go @@ -0,0 +1,21 @@ +package stats + +// CumulativeSum calculates the cumulative sum of the input slice +func CumulativeSum(input Float64Data) ([]float64, error) { + + if input.Len() == 0 { + return Float64Data{}, EmptyInput + } + + cumSum := make([]float64, input.Len()) + + for i, val := range input { + if i == 0 { + cumSum[i] = val + } else { + cumSum[i] = cumSum[i-1] + val + } + } + + return cumSum, nil +} diff --git a/vendor/github.com/montanaflynn/stats/data.go b/vendor/github.com/montanaflynn/stats/data.go index a087f457a..33b5db7dd 100644 --- a/vendor/github.com/montanaflynn/stats/data.go +++ b/vendor/github.com/montanaflynn/stats/data.go @@ -24,6 +24,9 @@ func (f Float64Data) Max() (float64, error) { return Max(f) } // Sum returns the total of all the numbers in the data func (f Float64Data) Sum() (float64, error) { return Sum(f) } +// CumulativeSum returns the cumulative sum of the data +func (f Float64Data) CumulativeSum() ([]float64, error) { return CumulativeSum(f) } + // Mean returns the mean of the data func (f Float64Data) Mean() (float64, error) { return Mean(f) } @@ -84,6 +87,11 @@ func (f Float64Data) Correlation(d Float64Data) (float64, error) { return Correlation(f, d) } +// Autocorrelation is the correlation of a signal with a delayed copy of itself as a function of delay +func (f Float64Data) AutoCorrelation(lags int) (float64, error) { + return AutoCorrelation(f, lags) +} + // Pearson calculates the Pearson product-moment correlation coefficient between two variables. func (f Float64Data) Pearson(d Float64Data) (float64, error) { return Pearson(f, d) diff --git a/vendor/github.com/montanaflynn/stats/data_set_distances.go b/vendor/github.com/montanaflynn/stats/data_set_distances.go deleted file mode 100644 index 2e549c8d4..000000000 --- a/vendor/github.com/montanaflynn/stats/data_set_distances.go +++ /dev/null @@ -1,94 +0,0 @@ -package stats - -import ( - "math" -) - -// Validate data for distance calculation -func validateData(dataPointX, dataPointY []float64) error { - if len(dataPointX) == 0 || len(dataPointY) == 0 { - return EmptyInput - } - - if len(dataPointX) != len(dataPointY) { - return SizeErr - } - return nil -} - -// Computes Chebyshev distance between two data sets -func ChebyshevDistance(dataPointX, dataPointY []float64) (distance float64, err error) { - err = validateData(dataPointX, dataPointY) - if err != nil { - return math.NaN(), err - } - var tempDistance float64 - for i := 0; i < len(dataPointY); i++ { - tempDistance = math.Abs(dataPointX[i] - dataPointY[i]) - if distance < tempDistance { - distance = tempDistance - } - } - return distance, nil -} - -// -// Computes Euclidean distance between two data sets -// -func EuclideanDistance(dataPointX, dataPointY []float64) (distance float64, err error) { - - err = validateData(dataPointX, dataPointY) - if err != nil { - return math.NaN(), err - } - distance = 0 - for i := 0; i < len(dataPointX); i++ { - distance = distance + ((dataPointX[i] - dataPointY[i]) * (dataPointX[i] - dataPointY[i])) - } - return math.Sqrt(distance), nil -} - -// -// Computes Manhattan distance between two data sets -// -func ManhattanDistance(dataPointX, dataPointY []float64) (distance float64, err error) { - err = validateData(dataPointX, dataPointY) - if err != nil { - return math.NaN(), err - } - distance = 0 - for i := 0; i < len(dataPointX); i++ { - distance = distance + math.Abs(dataPointX[i]-dataPointY[i]) - } - return distance, nil -} - -// -// Computes minkowski distance between two data sets. -// -// Input: -// dataPointX: First set of data points -// dataPointY: Second set of data points. Length of both data -// sets must be equal. -// lambda: aka p or city blocks; With lambda = 1 -// returned distance is manhattan distance and -// lambda = 2; it is euclidean distance. Lambda -// reaching to infinite - distance would be chebysev -// distance. -// Output: -// Distance or error -// -func MinkowskiDistance(dataPointX, dataPointY []float64, lambda float64) (distance float64, err error) { - err = validateData(dataPointX, dataPointY) - if err != nil { - return math.NaN(), err - } - for i := 0; i < len(dataPointY); i++ { - distance = distance + math.Pow(math.Abs(dataPointX[i]-dataPointY[i]), lambda) - } - distance = math.Pow(distance, float64(1/lambda)) - if math.IsInf(distance, 1) == true { - return math.NaN(), InfValue - } - return distance, nil -} diff --git a/vendor/github.com/montanaflynn/stats/deviation.go b/vendor/github.com/montanaflynn/stats/deviation.go index 539c02bcf..73ff2cbad 100644 --- a/vendor/github.com/montanaflynn/stats/deviation.go +++ b/vendor/github.com/montanaflynn/stats/deviation.go @@ -10,7 +10,7 @@ func MedianAbsoluteDeviation(input Float64Data) (mad float64, err error) { // MedianAbsoluteDeviationPopulation finds the median of the absolute deviations from the population median func MedianAbsoluteDeviationPopulation(input Float64Data) (mad float64, err error) { if input.Len() == 0 { - return math.NaN(), EmptyInput + return math.NaN(), EmptyInputErr } i := copyslice(input) @@ -32,7 +32,7 @@ func StandardDeviation(input Float64Data) (sdev float64, err error) { func StandardDeviationPopulation(input Float64Data) (sdev float64, err error) { if input.Len() == 0 { - return math.NaN(), EmptyInput + return math.NaN(), EmptyInputErr } // Get the population variance @@ -46,7 +46,7 @@ func StandardDeviationPopulation(input Float64Data) (sdev float64, err error) { func StandardDeviationSample(input Float64Data) (sdev float64, err error) { if input.Len() == 0 { - return math.NaN(), EmptyInput + return math.NaN(), EmptyInputErr } // Get the sample variance diff --git a/vendor/github.com/montanaflynn/stats/distances.go b/vendor/github.com/montanaflynn/stats/distances.go new file mode 100644 index 000000000..d5bd240d2 --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/distances.go @@ -0,0 +1,88 @@ +package stats + +import ( + "math" +) + +// Validate data for distance calculation +func validateData(dataPointX, dataPointY []float64) error { + if len(dataPointX) == 0 || len(dataPointY) == 0 { + return EmptyInputErr + } + + if len(dataPointX) != len(dataPointY) { + return SizeErr + } + return nil +} + +// ChebyshevDistance computes the Chebyshev distance between two data sets +func ChebyshevDistance(dataPointX, dataPointY []float64) (distance float64, err error) { + err = validateData(dataPointX, dataPointY) + if err != nil { + return math.NaN(), err + } + var tempDistance float64 + for i := 0; i < len(dataPointY); i++ { + tempDistance = math.Abs(dataPointX[i] - dataPointY[i]) + if distance < tempDistance { + distance = tempDistance + } + } + return distance, nil +} + +// EuclideanDistance computes the Euclidean distance between two data sets +func EuclideanDistance(dataPointX, dataPointY []float64) (distance float64, err error) { + + err = validateData(dataPointX, dataPointY) + if err != nil { + return math.NaN(), err + } + distance = 0 + for i := 0; i < len(dataPointX); i++ { + distance = distance + ((dataPointX[i] - dataPointY[i]) * (dataPointX[i] - dataPointY[i])) + } + return math.Sqrt(distance), nil +} + +// ManhattanDistance computes the Manhattan distance between two data sets +func ManhattanDistance(dataPointX, dataPointY []float64) (distance float64, err error) { + err = validateData(dataPointX, dataPointY) + if err != nil { + return math.NaN(), err + } + distance = 0 + for i := 0; i < len(dataPointX); i++ { + distance = distance + math.Abs(dataPointX[i]-dataPointY[i]) + } + return distance, nil +} + +// MinkowskiDistance computes the Minkowski distance between two data sets +// +// Arguments: +// dataPointX: First set of data points +// dataPointY: Second set of data points. Length of both data +// sets must be equal. +// lambda: aka p or city blocks; With lambda = 1 +// returned distance is manhattan distance and +// lambda = 2; it is euclidean distance. Lambda +// reaching to infinite - distance would be chebysev +// distance. +// Return: +// Distance or error +func MinkowskiDistance(dataPointX, dataPointY []float64, lambda float64) (distance float64, err error) { + err = validateData(dataPointX, dataPointY) + if err != nil { + return math.NaN(), err + } + for i := 0; i < len(dataPointY); i++ { + distance = distance + math.Pow(math.Abs(dataPointX[i]-dataPointY[i]), lambda) + } + distance = math.Pow(distance, 1/lambda) + if math.IsInf(distance, 1) { + return math.NaN(), InfValue + } + return distance, nil +} diff --git a/vendor/github.com/montanaflynn/stats/errors.go b/vendor/github.com/montanaflynn/stats/errors.go index 0bb32f0dd..4ca9cfb4b 100644 --- a/vendor/github.com/montanaflynn/stats/errors.go +++ b/vendor/github.com/montanaflynn/stats/errors.go @@ -8,15 +8,19 @@ func (s statsErr) Error() string { return s.err } +func (s statsErr) String() string { + return s.err +} + // These are the package-wide error values. // All error identification should use these values. var ( - EmptyInput = statsErr{"Input must not be empty."} - SampleSize = statsErr{"Samples number must be less than input length."} - NaNErr = statsErr{"Not a number"} - NegativeErr = statsErr{"Slice must not contain negative values."} - ZeroErr = statsErr{"Slice must not contain zero values."} - BoundsErr = statsErr{"Input is outside of range."} - SizeErr = statsErr{"Slices must be the same length."} - InfValue = statsErr{"Value is infinite."} + EmptyInputErr = statsErr{"Input must not be empty."} + NaNErr = statsErr{"Not a number."} + NegativeErr = statsErr{"Must not contain negative values."} + ZeroErr = statsErr{"Must not contain zero values."} + BoundsErr = statsErr{"Input is outside of range."} + SizeErr = statsErr{"Must be the same length."} + InfValue = statsErr{"Value is infinite."} + YCoordErr = statsErr{"Y Value must be greater than zero."} ) diff --git a/vendor/github.com/montanaflynn/stats/legacy.go b/vendor/github.com/montanaflynn/stats/legacy.go index 17557abd9..5d772ad48 100644 --- a/vendor/github.com/montanaflynn/stats/legacy.go +++ b/vendor/github.com/montanaflynn/stats/legacy.go @@ -34,3 +34,6 @@ func ExpReg(s []Coordinate) (regressions []Coordinate, err error) { func LogReg(s []Coordinate) (regressions []Coordinate, err error) { return LogarithmicRegression(s) } + +// EmptyInput legacy error name didn't end with Err +var EmptyInput = EmptyInputErr diff --git a/vendor/github.com/montanaflynn/stats/load.go b/vendor/github.com/montanaflynn/stats/load.go index 1012d0bb5..b5789e56f 100644 --- a/vendor/github.com/montanaflynn/stats/load.go +++ b/vendor/github.com/montanaflynn/stats/load.go @@ -40,7 +40,7 @@ func LoadRawData(raw interface{}) (f Float64Data) { return s case []bool: for _, v := range t { - if v == true { + if v { s = append(s, 1.0) } else { s = append(s, 0.0) @@ -138,7 +138,7 @@ func LoadRawData(raw interface{}) (f Float64Data) { return s case map[int]bool: for i := 0; i < len(t); i++ { - if t[i] == true { + if t[i] { s = append(s, 1.0) } else { s = append(s, 0.0) @@ -171,7 +171,7 @@ func LoadRawData(raw interface{}) (f Float64Data) { f = append(f, fl) } case bool: - if t == true { + if t { f = append(f, 1.0) } else { f = append(f, 0.0) diff --git a/vendor/github.com/montanaflynn/stats/max.go b/vendor/github.com/montanaflynn/stats/max.go index d0fdd42b4..bb8c83c32 100644 --- a/vendor/github.com/montanaflynn/stats/max.go +++ b/vendor/github.com/montanaflynn/stats/max.go @@ -1,13 +1,15 @@ package stats -import "math" +import ( + "math" +) // Max finds the highest number in a slice func Max(input Float64Data) (max float64, err error) { // Return an error if there are no numbers if input.Len() == 0 { - return math.NaN(), EmptyInput + return math.NaN(), EmptyInputErr } // Get the first value as the starting point diff --git a/vendor/github.com/montanaflynn/stats/mean.go b/vendor/github.com/montanaflynn/stats/mean.go index 944bb6572..a78d299ae 100644 --- a/vendor/github.com/montanaflynn/stats/mean.go +++ b/vendor/github.com/montanaflynn/stats/mean.go @@ -6,7 +6,7 @@ import "math" func Mean(input Float64Data) (float64, error) { if input.Len() == 0 { - return math.NaN(), EmptyInput + return math.NaN(), EmptyInputErr } sum, _ := input.Sum() @@ -19,7 +19,7 @@ func GeometricMean(input Float64Data) (float64, error) { l := input.Len() if l == 0 { - return math.NaN(), EmptyInput + return math.NaN(), EmptyInputErr } // Get the product of all the numbers @@ -41,7 +41,7 @@ func HarmonicMean(input Float64Data) (float64, error) { l := input.Len() if l == 0 { - return math.NaN(), EmptyInput + return math.NaN(), EmptyInputErr } // Get the sum of all the numbers reciprocals and return an diff --git a/vendor/github.com/montanaflynn/stats/median.go b/vendor/github.com/montanaflynn/stats/median.go index b13d8394b..a678c3653 100644 --- a/vendor/github.com/montanaflynn/stats/median.go +++ b/vendor/github.com/montanaflynn/stats/median.go @@ -14,11 +14,11 @@ func Median(input Float64Data) (median float64, err error) { // For odd numbers we just use the middle number l := len(c) if l == 0 { - return math.NaN(), EmptyInput + return math.NaN(), EmptyInputErr } else if l%2 == 0 { median, _ = Mean(c[l/2-1 : l/2+1]) } else { - median = float64(c[l/2]) + median = c[l/2] } return median, nil diff --git a/vendor/github.com/montanaflynn/stats/min.go b/vendor/github.com/montanaflynn/stats/min.go index 4383852e1..bf7e70acf 100644 --- a/vendor/github.com/montanaflynn/stats/min.go +++ b/vendor/github.com/montanaflynn/stats/min.go @@ -10,7 +10,7 @@ func Min(input Float64Data) (min float64, err error) { // Return an error if there are no numbers if l == 0 { - return math.NaN(), EmptyInput + return math.NaN(), EmptyInputErr } // Get the first value as the starting point diff --git a/vendor/github.com/montanaflynn/stats/mode.go b/vendor/github.com/montanaflynn/stats/mode.go index 1160faf28..058bbf361 100644 --- a/vendor/github.com/montanaflynn/stats/mode.go +++ b/vendor/github.com/montanaflynn/stats/mode.go @@ -7,7 +7,7 @@ func Mode(input Float64Data) (mode []float64, err error) { if l == 1 { return input, nil } else if l == 0 { - return nil, EmptyInput + return nil, EmptyInputErr } c := sortedCopyDif(input) diff --git a/vendor/github.com/montanaflynn/stats/outlier.go b/vendor/github.com/montanaflynn/stats/outlier.go index e969180ea..7c9795bd3 100644 --- a/vendor/github.com/montanaflynn/stats/outlier.go +++ b/vendor/github.com/montanaflynn/stats/outlier.go @@ -9,7 +9,7 @@ type Outliers struct { // QuartileOutliers finds the mild and extreme outliers func QuartileOutliers(input Float64Data) (Outliers, error) { if input.Len() == 0 { - return Outliers{}, EmptyInput + return Outliers{}, EmptyInputErr } // Start by sorting a copy of the slice diff --git a/vendor/github.com/montanaflynn/stats/percentile.go b/vendor/github.com/montanaflynn/stats/percentile.go index baf24d8e3..2f8c64d3f 100644 --- a/vendor/github.com/montanaflynn/stats/percentile.go +++ b/vendor/github.com/montanaflynn/stats/percentile.go @@ -1,12 +1,14 @@ package stats -import "math" +import ( + "math" +) // Percentile finds the relative standing in a slice of floats func Percentile(input Float64Data, percent float64) (percentile float64, err error) { if input.Len() == 0 { - return math.NaN(), EmptyInput + return math.NaN(), EmptyInputErr } if percent <= 0 || percent > 100 { @@ -52,7 +54,7 @@ func PercentileNearestRank(input Float64Data, percent float64) (percentile float // Return an error for empty slices if il == 0 { - return math.NaN(), EmptyInput + return math.NaN(), EmptyInputErr } // Return error for less than 0 or greater than 100 percentages diff --git a/vendor/github.com/montanaflynn/stats/quartile.go b/vendor/github.com/montanaflynn/stats/quartile.go index 29bb3a37a..40bbf6e57 100644 --- a/vendor/github.com/montanaflynn/stats/quartile.go +++ b/vendor/github.com/montanaflynn/stats/quartile.go @@ -14,7 +14,7 @@ func Quartile(input Float64Data) (Quartiles, error) { il := input.Len() if il == 0 { - return Quartiles{}, EmptyInput + return Quartiles{}, EmptyInputErr } // Start by sorting a copy of the slice @@ -44,7 +44,7 @@ func Quartile(input Float64Data) (Quartiles, error) { // InterQuartileRange finds the range between Q1 and Q3 func InterQuartileRange(input Float64Data) (float64, error) { if input.Len() == 0 { - return math.NaN(), EmptyInput + return math.NaN(), EmptyInputErr } qs, _ := Quartile(input) iqr := qs.Q3 - qs.Q1 @@ -54,7 +54,7 @@ func InterQuartileRange(input Float64Data) (float64, error) { // Midhinge finds the average of the first and third quartiles func Midhinge(input Float64Data) (float64, error) { if input.Len() == 0 { - return math.NaN(), EmptyInput + return math.NaN(), EmptyInputErr } qs, _ := Quartile(input) mh := (qs.Q1 + qs.Q3) / 2 @@ -64,7 +64,7 @@ func Midhinge(input Float64Data) (float64, error) { // Trimean finds the average of the median and the midhinge func Trimean(input Float64Data) (float64, error) { if input.Len() == 0 { - return math.NaN(), EmptyInput + return math.NaN(), EmptyInputErr } c := sortedCopy(input) diff --git a/vendor/github.com/montanaflynn/stats/regression.go b/vendor/github.com/montanaflynn/stats/regression.go index a37a74060..401d95120 100644 --- a/vendor/github.com/montanaflynn/stats/regression.go +++ b/vendor/github.com/montanaflynn/stats/regression.go @@ -14,7 +14,7 @@ type Coordinate struct { func LinearRegression(s Series) (regressions Series, err error) { if len(s) == 0 { - return nil, EmptyInput + return nil, EmptyInputErr } // Placeholder for the math to be done @@ -44,19 +44,21 @@ func LinearRegression(s Series) (regressions Series, err error) { } return regressions, nil - } // ExponentialRegression returns an exponential regression on data series func ExponentialRegression(s Series) (regressions Series, err error) { if len(s) == 0 { - return nil, EmptyInput + return nil, EmptyInputErr } var sum [6]float64 for i := 0; i < len(s); i++ { + if s[i].Y < 0 { + return nil, YCoordErr + } sum[0] += s[i].X sum[1] += s[i].Y sum[2] += s[i].X * s[i].X * s[i].Y @@ -77,14 +79,13 @@ func ExponentialRegression(s Series) (regressions Series, err error) { } return regressions, nil - } // LogarithmicRegression returns an logarithmic regression on data series func LogarithmicRegression(s Series) (regressions Series, err error) { if len(s) == 0 { - return nil, EmptyInput + return nil, EmptyInputErr } var sum [4]float64 @@ -109,5 +110,4 @@ func LogarithmicRegression(s Series) (regressions Series, err error) { } return regressions, nil - } diff --git a/vendor/github.com/montanaflynn/stats/sample.go b/vendor/github.com/montanaflynn/stats/sample.go index a52f6dcaa..7562801bc 100644 --- a/vendor/github.com/montanaflynn/stats/sample.go +++ b/vendor/github.com/montanaflynn/stats/sample.go @@ -6,7 +6,7 @@ import "math/rand" func Sample(input Float64Data, takenum int, replacement bool) ([]float64, error) { if input.Len() == 0 { - return nil, EmptyInput + return nil, EmptyInputErr } length := input.Len() diff --git a/vendor/github.com/montanaflynn/stats/sigmoid.go b/vendor/github.com/montanaflynn/stats/sigmoid.go new file mode 100644 index 000000000..5f2559d81 --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/sigmoid.go @@ -0,0 +1,18 @@ +package stats + +import "math" + +// Sigmoid returns the input values in the range of -1 to 1 +// along the sigmoid or s-shaped curve, commonly used in +// machine learning while training neural networks as an +// activation function. +func Sigmoid(input Float64Data) ([]float64, error) { + if input.Len() == 0 { + return Float64Data{}, EmptyInput + } + s := make([]float64, len(input)) + for i, v := range input { + s[i] = 1 / (1 + math.Exp(-v)) + } + return s, nil +} diff --git a/vendor/github.com/montanaflynn/stats/softmax.go b/vendor/github.com/montanaflynn/stats/softmax.go new file mode 100644 index 000000000..85072642b --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/softmax.go @@ -0,0 +1,25 @@ +package stats + +import "math" + +// SoftMax returns the input values in the range of 0 to 1 +// with sum of all the probabilities being equal to one. It +// is commonly used in machine learning neural networks. +func SoftMax(input Float64Data) ([]float64, error) { + if input.Len() == 0 { + return Float64Data{}, EmptyInput + } + + s := 0.0 + c, _ := Max(input) + for _, e := range input { + s += math.Exp(e - c) + } + + sm := make([]float64, len(input)) + for i, v := range input { + sm[i] = math.Exp(v-c) / s + } + + return sm, nil +} diff --git a/vendor/github.com/montanaflynn/stats/sum.go b/vendor/github.com/montanaflynn/stats/sum.go index 53485f17c..15b611d17 100644 --- a/vendor/github.com/montanaflynn/stats/sum.go +++ b/vendor/github.com/montanaflynn/stats/sum.go @@ -6,7 +6,7 @@ import "math" func Sum(input Float64Data) (sum float64, err error) { if input.Len() == 0 { - return math.NaN(), EmptyInput + return math.NaN(), EmptyInputErr } // Add em up diff --git a/vendor/github.com/montanaflynn/stats/variance.go b/vendor/github.com/montanaflynn/stats/variance.go index 66e60c941..a6445690d 100644 --- a/vendor/github.com/montanaflynn/stats/variance.go +++ b/vendor/github.com/montanaflynn/stats/variance.go @@ -6,14 +6,14 @@ import "math" func _variance(input Float64Data, sample int) (variance float64, err error) { if input.Len() == 0 { - return math.NaN(), EmptyInput + return math.NaN(), EmptyInputErr } // Sum the square of the mean subtracted from each number m, _ := Mean(input) for _, n := range input { - variance += (float64(n) - m) * (float64(n) - m) + variance += (n - m) * (n - m) } // When getting the mean of the squared differences @@ -56,7 +56,7 @@ func Covariance(data1, data2 Float64Data) (float64, error) { l2 := data2.Len() if l1 == 0 || l2 == 0 { - return math.NaN(), EmptyInput + return math.NaN(), EmptyInputErr } if l1 != l2 { @@ -84,7 +84,7 @@ func CovariancePopulation(data1, data2 Float64Data) (float64, error) { l2 := data2.Len() if l1 == 0 || l2 == 0 { - return math.NaN(), EmptyInput + return math.NaN(), EmptyInputErr } if l1 != l2 { diff --git a/vendor/github.com/mozilla/tls-observatory/LICENSE b/vendor/github.com/mozilla/tls-observatory/LICENSE deleted file mode 100644 index be2cc4dfb..000000000 --- a/vendor/github.com/mozilla/tls-observatory/LICENSE +++ /dev/null @@ -1,362 +0,0 @@ -Mozilla Public License, version 2.0 - -1. Definitions - -1.1. "Contributor" - - means each individual or legal entity that creates, contributes to the - creation of, or owns Covered Software. - -1.2. "Contributor Version" - - means the combination of the Contributions of others (if any) used by a - Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - - means Source Code Form to which the initial Contributor has attached the - notice in Exhibit A, the Executable Form of such Source Code Form, and - Modifications of such Source Code Form, in each case including portions - thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - a. that the initial Contributor has attached the notice described in - Exhibit B to the Covered Software; or - - b. that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the terms of - a Secondary License. - -1.6. "Executable Form" - - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - - means a work that combines Covered Software with other material, in a - separate file or files, that is not Covered Software. - -1.8. "License" - - means this document. - -1.9. "Licensable" - - means having the right to grant, to the maximum extent possible, whether - at the time of the initial grant or subsequently, any and all of the - rights conveyed by this License. - -1.10. "Modifications" - - means any of the following: - - a. any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered Software; or - - b. any new file in Source Code Form that contains any Covered Software. - -1.11. "Patent Claims" of a Contributor - - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the License, - by the making, using, selling, offering for sale, having made, import, - or transfer of either its Contributions or its Contributor Version. - -1.12. "Secondary License" - - means either the GNU General Public License, Version 2.0, the GNU Lesser - General Public License, Version 2.1, the GNU Affero General Public - License, Version 3.0, or any later versions of those licenses. - -1.13. "Source Code Form" - - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that controls, is - controlled by, or is under common control with You. For purposes of this - definition, "control" means (a) the power, direct or indirect, to cause - the direction or management of such entity, whether by contract or - otherwise, or (b) ownership of more than fifty percent (50%) of the - outstanding shares or beneficial ownership of such entity. - - -2. License Grants and Conditions - -2.1. Grants - - Each Contributor hereby grants You a world-wide, royalty-free, - non-exclusive license: - - a. under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - - b. under Patent Claims of such Contributor to make, use, sell, offer for - sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - - The licenses granted in Section 2.1 with respect to any Contribution - become effective for each Contribution on the date the Contributor first - distributes such Contribution. - -2.3. Limitations on Grant Scope - - The licenses granted in this Section 2 are the only rights granted under - this License. No additional rights or licenses will be implied from the - distribution or licensing of Covered Software under this License. - Notwithstanding Section 2.1(b) above, no patent license is granted by a - Contributor: - - a. for any code that a Contributor has removed from Covered Software; or - - b. for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - - c. under Patent Claims infringed by Covered Software in the absence of - its Contributions. - - This License does not grant any rights in the trademarks, service marks, - or logos of any Contributor (except as may be necessary to comply with - the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - - No Contributor makes additional grants as a result of Your choice to - distribute the Covered Software under a subsequent version of this - License (see Section 10.2) or under the terms of a Secondary License (if - permitted under the terms of Section 3.3). - -2.5. Representation - - Each Contributor represents that the Contributor believes its - Contributions are its original creation(s) or it has sufficient rights to - grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - - This License is not intended to limit any rights You have under - applicable copyright doctrines of fair use, fair dealing, or other - equivalents. - -2.7. Conditions - - Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in - Section 2.1. - - -3. Responsibilities - -3.1. Distribution of Source Form - - All distribution of Covered Software in Source Code Form, including any - Modifications that You create or to which You contribute, must be under - the terms of this License. You must inform recipients that the Source - Code Form of the Covered Software is governed by the terms of this - License, and how they can obtain a copy of this License. You may not - attempt to alter or restrict the recipients' rights in the Source Code - Form. - -3.2. Distribution of Executable Form - - If You distribute Covered Software in Executable Form then: - - a. such Covered Software must also be made available in Source Code Form, - as described in Section 3.1, and You must inform recipients of the - Executable Form how they can obtain a copy of such Source Code Form by - reasonable means in a timely manner, at a charge no more than the cost - of distribution to the recipient; and - - b. You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter the - recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - - You may create and distribute a Larger Work under terms of Your choice, - provided that You also comply with the requirements of this License for - the Covered Software. If the Larger Work is a combination of Covered - Software with a work governed by one or more Secondary Licenses, and the - Covered Software is not Incompatible With Secondary Licenses, this - License permits You to additionally distribute such Covered Software - under the terms of such Secondary License(s), so that the recipient of - the Larger Work may, at their option, further distribute the Covered - Software under the terms of either this License or such Secondary - License(s). - -3.4. Notices - - You may not remove or alter the substance of any license notices - (including copyright notices, patent notices, disclaimers of warranty, or - limitations of liability) contained within the Source Code Form of the - Covered Software, except that You may alter any license notices to the - extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - - You may choose to offer, and to charge a fee for, warranty, support, - indemnity or liability obligations to one or more recipients of Covered - Software. However, You may do so only on Your own behalf, and not on - behalf of any Contributor. You must make it absolutely clear that any - such warranty, support, indemnity, or liability obligation is offered by - You alone, and You hereby agree to indemnify every Contributor for any - liability incurred by such Contributor as a result of warranty, support, - indemnity or liability terms You offer. You may include additional - disclaimers of warranty and limitations of liability specific to any - jurisdiction. - -4. Inability to Comply Due to Statute or Regulation - - If it is impossible for You to comply with any of the terms of this License - with respect to some or all of the Covered Software due to statute, - judicial order, or regulation then You must: (a) comply with the terms of - this License to the maximum extent possible; and (b) describe the - limitations and the code they affect. Such description must be placed in a - text file included with all distributions of the Covered Software under - this License. Except to the extent prohibited by statute or regulation, - such description must be sufficiently detailed for a recipient of ordinary - skill to be able to understand it. - -5. Termination - -5.1. The rights granted under this License will terminate automatically if You - fail to comply with any of its terms. However, if You become compliant, - then the rights granted under this License from a particular Contributor - are reinstated (a) provisionally, unless and until such Contributor - explicitly and finally terminates Your grants, and (b) on an ongoing - basis, if such Contributor fails to notify You of the non-compliance by - some reasonable means prior to 60 days after You have come back into - compliance. Moreover, Your grants from a particular Contributor are - reinstated on an ongoing basis if such Contributor notifies You of the - non-compliance by some reasonable means, this is the first time You have - received notice of non-compliance with this License from such - Contributor, and You become compliant prior to 30 days after Your receipt - of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent - infringement claim (excluding declaratory judgment actions, - counter-claims, and cross-claims) alleging that a Contributor Version - directly or indirectly infringes any patent, then the rights granted to - You by any and all Contributors for the Covered Software under Section - 2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user - license agreements (excluding distributors and resellers) which have been - validly granted by You or Your distributors under this License prior to - termination shall survive termination. - -6. Disclaimer of Warranty - - Covered Software is provided under this License on an "as is" basis, - without warranty of any kind, either expressed, implied, or statutory, - including, without limitation, warranties that the Covered Software is free - of defects, merchantable, fit for a particular purpose or non-infringing. - The entire risk as to the quality and performance of the Covered Software - is with You. Should any Covered Software prove defective in any respect, - You (not any Contributor) assume the cost of any necessary servicing, - repair, or correction. This disclaimer of warranty constitutes an essential - part of this License. No use of any Covered Software is authorized under - this License except under this disclaimer. - -7. Limitation of Liability - - Under no circumstances and under no legal theory, whether tort (including - negligence), contract, or otherwise, shall any Contributor, or anyone who - distributes Covered Software as permitted above, be liable to You for any - direct, indirect, special, incidental, or consequential damages of any - character including, without limitation, damages for lost profits, loss of - goodwill, work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses, even if such party shall have been - informed of the possibility of such damages. This limitation of liability - shall not apply to liability for death or personal injury resulting from - such party's negligence to the extent applicable law prohibits such - limitation. Some jurisdictions do not allow the exclusion or limitation of - incidental or consequential damages, so this exclusion and limitation may - not apply to You. - -8. Litigation - - Any litigation relating to this License may be brought only in the courts - of a jurisdiction where the defendant maintains its principal place of - business and such litigation shall be governed by laws of that - jurisdiction, without reference to its conflict-of-law provisions. Nothing - in this Section shall prevent a party's ability to bring cross-claims or - counter-claims. - -9. Miscellaneous - - This License represents the complete agreement concerning the subject - matter hereof. If any provision of this License is held to be - unenforceable, such provision shall be reformed only to the extent - necessary to make it enforceable. Any law or regulation which provides that - the language of a contract shall be construed against the drafter shall not - be used to construe this License against a Contributor. - - -10. Versions of the License - -10.1. New Versions - - Mozilla Foundation is the license steward. Except as provided in Section - 10.3, no one other than the license steward has the right to modify or - publish new versions of this License. Each version will be given a - distinguishing version number. - -10.2. Effect of New Versions - - You may distribute the Covered Software under the terms of the version - of the License under which You originally received the Covered Software, - or under the terms of any subsequent version published by the license - steward. - -10.3. Modified Versions - - If you create software not governed by this License, and you want to - create a new license for such software, you may create and use a - modified version of this License if you rename the license and remove - any references to the name of the license steward (except to note that - such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary - Licenses If You choose to distribute Source Code Form that is - Incompatible With Secondary Licenses under the terms of this version of - the License, the notice described in Exhibit B of this License must be - attached. - -Exhibit A - Source Code Form License Notice - - This Source Code Form is subject to the - terms of the Mozilla Public License, v. - 2.0. If a copy of the MPL was not - distributed with this file, You can - obtain one at - http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular file, -then You may include the notice in a location (such as a LICENSE file in a -relevant directory) where a recipient would be likely to look for such a -notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice - - This Source Code Form is "Incompatible - With Secondary Licenses", as defined by - the Mozilla Public License, v. 2.0. diff --git a/vendor/github.com/mozilla/tls-observatory/constants/ciphersuites.go b/vendor/github.com/mozilla/tls-observatory/constants/ciphersuites.go deleted file mode 100644 index b6899b1a4..000000000 --- a/vendor/github.com/mozilla/tls-observatory/constants/ciphersuites.go +++ /dev/null @@ -1,1800 +0,0 @@ -package constants - -type CipherSuite struct { - IANAName string `json:"iana_name"` - GnuTLSName string `json:"gnutls_name"` - NSSName string `json:"nss_name"` - Protocol string `json:"protocol"` - ProtocolCode uint64 `json:"protocol_code"` - Kx string `json:"kx"` - Au string `json:"au"` - Enc Encryption `json:"encryption"` - Mac string `json:"mac"` - Code uint64 `json:"code"` -} - -type Encryption struct { - Cipher string `json:"cipher"` - Bits int `json:"bits"` -} - -var CipherSuites = map[string]CipherSuite{ - "AES128-GCM-SHA256": CipherSuite{ - IANAName: "TLS_RSA_WITH_AES_128_GCM_SHA256", - GnuTLSName: "TLS_RSA_AES_128_GCM_SHA256", - NSSName: "TLS_RSA_WITH_AES_128_GCM_SHA256", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "RSA", - Au: "RSA", - Enc: Encryption{ - Cipher: "AESGCM", - Bits: 128, - }, - Mac: "AEAD", - Code: 156, - }, - "AES128-SHA": CipherSuite{ - IANAName: "TLS_RSA_WITH_AES_128_CBC_SHA", - GnuTLSName: "TLS_RSA_AES_128_CBC_SHA1", - NSSName: "TLS_RSA_WITH_AES_128_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "RSA", - Au: "RSA", - Enc: Encryption{ - Cipher: "AES", - Bits: 128, - }, - Mac: "SHA1", - Code: 47, - }, - "AES128-SHA256": CipherSuite{ - IANAName: "TLS_RSA_WITH_AES_128_CBC_SHA256", - GnuTLSName: "TLS_RSA_AES_128_CBC_SHA256", - NSSName: "TLS_RSA_WITH_AES_128_CBC_SHA256", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "RSA", - Au: "RSA", - Enc: Encryption{ - Cipher: "AES", - Bits: 128, - }, - Mac: "SHA256", - Code: 60, - }, - "AES256-GCM-SHA384": CipherSuite{ - IANAName: "TLS_RSA_WITH_AES_256_GCM_SHA384", - GnuTLSName: "TLS_RSA_AES_256_GCM_SHA384", - NSSName: "TLS_RSA_WITH_AES_256_GCM_SHA384", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "RSA", - Au: "RSA", - Enc: Encryption{ - Cipher: "AESGCM", - Bits: 256, - }, - Mac: "AEAD", - Code: 157, - }, - "AES256-SHA": CipherSuite{ - IANAName: "TLS_RSA_WITH_AES_256_CBC_SHA", - GnuTLSName: "TLS_RSA_AES_256_CBC_SHA1", - NSSName: "TLS_RSA_WITH_AES_256_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "RSA", - Au: "RSA", - Enc: Encryption{ - Cipher: "AES", - Bits: 256, - }, - Mac: "SHA1", - Code: 53, - }, - "AES256-SHA256": CipherSuite{ - IANAName: "TLS_RSA_WITH_AES_256_CBC_SHA256", - GnuTLSName: "TLS_RSA_AES_256_CBC_SHA256", - NSSName: "TLS_RSA_WITH_AES_256_CBC_SHA256", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "RSA", - Au: "RSA", - Enc: Encryption{ - Cipher: "AES", - Bits: 256, - }, - Mac: "SHA256", - Code: 61, - }, - "CAMELLIA128-SHA": CipherSuite{ - IANAName: "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA", - GnuTLSName: "TLS_RSA_CAMELLIA_128_CBC_SHA1", - NSSName: "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "RSA", - Au: "RSA", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 128, - }, - Mac: "SHA1", - Code: 65, - }, - "CAMELLIA128-SHA256": CipherSuite{ - IANAName: "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256", - GnuTLSName: "TLS_RSA_CAMELLIA_128_CBC_SHA256", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "RSA", - Au: "RSA", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 128, - }, - Mac: "SHA256", - Code: 186, - }, - "CAMELLIA256-SHA": CipherSuite{ - IANAName: "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA", - GnuTLSName: "TLS_RSA_CAMELLIA_256_CBC_SHA1", - NSSName: "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "RSA", - Au: "RSA", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 256, - }, - Mac: "SHA1", - Code: 132, - }, - "CAMELLIA256-SHA256": CipherSuite{ - IANAName: "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256", - GnuTLSName: "TLS_RSA_CAMELLIA_256_CBC_SHA256", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "RSA", - Au: "RSA", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 256, - }, - Mac: "SHA256", - Code: 192, - }, - "DES-CBC3-SHA": CipherSuite{ - IANAName: "TLS_RSA_WITH_3DES_EDE_CBC_SHA", - GnuTLSName: "TLS_RSA_3DES_EDE_CBC_SHA1", - NSSName: "TLS_RSA_WITH_3DES_EDE_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "RSA", - Au: "RSA", - Enc: Encryption{ - Cipher: "3DES", - Bits: 168, - }, - Mac: "SHA1", - Code: 10, - }, - "DH-DSS-AES128-GCM-SHA256": CipherSuite{ - IANAName: "TLS_DH_DSS_WITH_AES_128_GCM_SHA256", - GnuTLSName: "", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "DH/DSS", - Au: "DH", - Enc: Encryption{ - Cipher: "AESGCM", - Bits: 128, - }, - Mac: "AEAD", - Code: 164, - }, - "DH-DSS-AES128-SHA": CipherSuite{ - IANAName: "TLS_DH_DSS_WITH_AES_128_CBC_SHA", - GnuTLSName: "", - NSSName: "TLS_DH_DSS_WITH_AES_128_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "DH/DSS", - Au: "DH", - Enc: Encryption{ - Cipher: "AES", - Bits: 128, - }, - Mac: "SHA1", - Code: 48, - }, - "DH-DSS-AES128-SHA256": CipherSuite{ - IANAName: "TLS_DH_DSS_WITH_AES_128_CBC_SHA256", - GnuTLSName: "", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "DH/DSS", - Au: "DH", - Enc: Encryption{ - Cipher: "AES", - Bits: 128, - }, - Mac: "SHA256", - Code: 62, - }, - "DH-DSS-AES256-GCM-SHA384": CipherSuite{ - IANAName: "TLS_DH_DSS_WITH_AES_256_GCM_SHA384", - GnuTLSName: "", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "DH/DSS", - Au: "DH", - Enc: Encryption{ - Cipher: "AESGCM", - Bits: 256, - }, - Mac: "AEAD", - Code: 165, - }, - "DH-DSS-AES256-SHA": CipherSuite{ - IANAName: "TLS_DH_DSS_WITH_AES_256_CBC_SHA", - GnuTLSName: "", - NSSName: "TLS_DH_DSS_WITH_AES_256_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "DH/DSS", - Au: "DH", - Enc: Encryption{ - Cipher: "AES", - Bits: 256, - }, - Mac: "SHA1", - Code: 54, - }, - "DH-DSS-AES256-SHA256": CipherSuite{ - IANAName: "TLS_DH_DSS_WITH_AES_256_CBC_SHA256", - GnuTLSName: "", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "DH/DSS", - Au: "DH", - Enc: Encryption{ - Cipher: "AES", - Bits: 256, - }, - Mac: "SHA256", - Code: 104, - }, - "DH-DSS-CAMELLIA128-SHA": CipherSuite{ - IANAName: "TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA", - GnuTLSName: "", - NSSName: "TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "DH/DSS", - Au: "DH", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 128, - }, - Mac: "SHA1", - Code: 66, - }, - "DH-DSS-CAMELLIA128-SHA256": CipherSuite{ - IANAName: "TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256", - GnuTLSName: "", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "DH/DSS", - Au: "DH", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 128, - }, - Mac: "SHA256", - Code: 187, - }, - "DH-DSS-CAMELLIA256-SHA": CipherSuite{ - IANAName: "TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA", - GnuTLSName: "", - NSSName: "TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "DH/DSS", - Au: "DH", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 256, - }, - Mac: "SHA1", - Code: 133, - }, - "DH-DSS-CAMELLIA256-SHA256": CipherSuite{ - IANAName: "TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256", - GnuTLSName: "", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "DH/DSS", - Au: "DH", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 256, - }, - Mac: "SHA256", - Code: 193, - }, - "DH-DSS-DES-CBC3-SHA": CipherSuite{ - IANAName: "TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA", - GnuTLSName: "", - NSSName: "TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "DH/DSS", - Au: "DH", - Enc: Encryption{ - Cipher: "3DES", - Bits: 168, - }, - Mac: "SHA1", - Code: 13, - }, - "DH-DSS-SEED-SHA": CipherSuite{ - IANAName: "TLS_DH_DSS_WITH_SEED_CBC_SHA", - GnuTLSName: "", - NSSName: "", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "DH/DSS", - Au: "DH", - Enc: Encryption{ - Cipher: "SEED", - Bits: 128, - }, - Mac: "SHA1", - Code: 151, - }, - "DH-RSA-AES128-GCM-SHA256": CipherSuite{ - IANAName: "TLS_DH_RSA_WITH_AES_128_GCM_SHA256", - GnuTLSName: "", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "DH/RSA", - Au: "DH", - Enc: Encryption{ - Cipher: "AESGCM", - Bits: 128, - }, - Mac: "AEAD", - Code: 160, - }, - "DH-RSA-AES128-SHA": CipherSuite{ - IANAName: "TLS_DH_RSA_WITH_AES_128_CBC_SHA", - GnuTLSName: "", - NSSName: "TLS_DH_RSA_WITH_AES_128_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "DH/RSA", - Au: "DH", - Enc: Encryption{ - Cipher: "AES", - Bits: 128, - }, - Mac: "SHA1", - Code: 49, - }, - "DH-RSA-AES128-SHA256": CipherSuite{ - IANAName: "TLS_DH_RSA_WITH_AES_128_CBC_SHA256", - GnuTLSName: "", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "DH/RSA", - Au: "DH", - Enc: Encryption{ - Cipher: "AES", - Bits: 128, - }, - Mac: "SHA256", - Code: 63, - }, - "DH-RSA-AES256-GCM-SHA384": CipherSuite{ - IANAName: "TLS_DH_RSA_WITH_AES_256_GCM_SHA384", - GnuTLSName: "", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "DH/RSA", - Au: "DH", - Enc: Encryption{ - Cipher: "AESGCM", - Bits: 256, - }, - Mac: "AEAD", - Code: 161, - }, - "DH-RSA-AES256-SHA": CipherSuite{ - IANAName: "TLS_DH_RSA_WITH_AES_256_CBC_SHA", - GnuTLSName: "", - NSSName: "TLS_DH_RSA_WITH_AES_256_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "DH/RSA", - Au: "DH", - Enc: Encryption{ - Cipher: "AES", - Bits: 256, - }, - Mac: "SHA1", - Code: 55, - }, - "DH-RSA-AES256-SHA256": CipherSuite{ - IANAName: "TLS_DH_RSA_WITH_AES_256_CBC_SHA256", - GnuTLSName: "", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "DH/RSA", - Au: "DH", - Enc: Encryption{ - Cipher: "AES", - Bits: 256, - }, - Mac: "SHA256", - Code: 105, - }, - "DH-RSA-CAMELLIA128-SHA": CipherSuite{ - IANAName: "TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA", - GnuTLSName: "", - NSSName: "TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "DH/RSA", - Au: "DH", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 128, - }, - Mac: "SHA1", - Code: 67, - }, - "DH-RSA-CAMELLIA128-SHA256": CipherSuite{ - IANAName: "TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256", - GnuTLSName: "", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "DH/RSA", - Au: "DH", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 128, - }, - Mac: "SHA256", - Code: 188, - }, - "DH-RSA-CAMELLIA256-SHA": CipherSuite{ - IANAName: "TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA", - GnuTLSName: "", - NSSName: "TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "DH/RSA", - Au: "DH", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 256, - }, - Mac: "SHA1", - Code: 134, - }, - "DH-RSA-CAMELLIA256-SHA256": CipherSuite{ - IANAName: "TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256", - GnuTLSName: "", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "DH/RSA", - Au: "DH", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 256, - }, - Mac: "SHA256", - Code: 194, - }, - "DH-RSA-DES-CBC3-SHA": CipherSuite{ - IANAName: "TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA", - GnuTLSName: "", - NSSName: "TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "DH/RSA", - Au: "DH", - Enc: Encryption{ - Cipher: "3DES", - Bits: 168, - }, - Mac: "SHA1", - Code: 16, - }, - "DH-RSA-SEED-SHA": CipherSuite{ - IANAName: "TLS_DH_RSA_WITH_SEED_CBC_SHA", - GnuTLSName: "", - NSSName: "", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "DH/RSA", - Au: "DH", - Enc: Encryption{ - Cipher: "SEED", - Bits: 128, - }, - Mac: "SHA1", - Code: 152, - }, - "DHE-DSS-AES128-GCM-SHA256": CipherSuite{ - IANAName: "TLS_DHE_DSS_WITH_AES_128_GCM_SHA256", - GnuTLSName: "TLS_DHE_DSS_AES_128_GCM_SHA256", - NSSName: "TLS_DHE_DSS_WITH_AES_128_GCM_SHA256", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "DH", - Au: "DSS", - Enc: Encryption{ - Cipher: "AESGCM", - Bits: 128, - }, - Mac: "AEAD", - Code: 162, - }, - "DHE-DSS-AES128-SHA": CipherSuite{ - IANAName: "TLS_DHE_DSS_WITH_AES_128_CBC_SHA", - GnuTLSName: "TLS_DHE_DSS_AES_128_CBC_SHA1", - NSSName: "TLS_DHE_DSS_WITH_AES_128_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "DH", - Au: "DSS", - Enc: Encryption{ - Cipher: "AES", - Bits: 128, - }, - Mac: "SHA1", - Code: 50, - }, - "DHE-DSS-AES128-SHA256": CipherSuite{ - IANAName: "TLS_DHE_DSS_WITH_AES_128_CBC_SHA256", - GnuTLSName: "TLS_DHE_DSS_AES_128_CBC_SHA256", - NSSName: "TLS_DHE_DSS_WITH_AES_128_CBC_SHA256", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "DH", - Au: "DSS", - Enc: Encryption{ - Cipher: "AES", - Bits: 128, - }, - Mac: "SHA256", - Code: 64, - }, - "DHE-DSS-AES256-GCM-SHA384": CipherSuite{ - IANAName: "TLS_DHE_DSS_WITH_AES_256_GCM_SHA384", - GnuTLSName: "TLS_DHE_DSS_AES_256_GCM_SHA384", - NSSName: "TLS_DHE_DSS_WITH_AES_256_GCM_SHA384", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "DH", - Au: "DSS", - Enc: Encryption{ - Cipher: "AESGCM", - Bits: 256, - }, - Mac: "AEAD", - Code: 163, - }, - "DHE-DSS-AES256-SHA": CipherSuite{ - IANAName: "TLS_DHE_DSS_WITH_AES_256_CBC_SHA", - GnuTLSName: "TLS_DHE_DSS_AES_256_CBC_SHA1", - NSSName: "TLS_DHE_DSS_WITH_AES_256_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "DH", - Au: "DSS", - Enc: Encryption{ - Cipher: "AES", - Bits: 256, - }, - Mac: "SHA1", - Code: 56, - }, - "DHE-DSS-AES256-SHA256": CipherSuite{ - IANAName: "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256", - GnuTLSName: "TLS_DHE_DSS_AES_256_CBC_SHA256", - NSSName: "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "DH", - Au: "DSS", - Enc: Encryption{ - Cipher: "AES", - Bits: 256, - }, - Mac: "SHA256", - Code: 106, - }, - "DHE-DSS-CAMELLIA128-SHA": CipherSuite{ - IANAName: "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA", - GnuTLSName: "TLS_DHE_DSS_CAMELLIA_128_CBC_SHA1", - NSSName: "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "DH", - Au: "DSS", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 128, - }, - Mac: "SHA1", - Code: 68, - }, - "DHE-DSS-CAMELLIA128-SHA256": CipherSuite{ - IANAName: "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256", - GnuTLSName: "TLS_DHE_DSS_CAMELLIA_128_CBC_SHA256", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "DH", - Au: "DSS", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 128, - }, - Mac: "SHA256", - Code: 189, - }, - "DHE-DSS-CAMELLIA256-SHA": CipherSuite{ - IANAName: "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA", - GnuTLSName: "TLS_DHE_DSS_CAMELLIA_256_CBC_SHA1", - NSSName: "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "DH", - Au: "DSS", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 256, - }, - Mac: "SHA1", - Code: 135, - }, - "DHE-DSS-CAMELLIA256-SHA256": CipherSuite{ - IANAName: "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256", - GnuTLSName: "TLS_DHE_DSS_CAMELLIA_256_CBC_SHA256", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "DH", - Au: "DSS", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 256, - }, - Mac: "SHA256", - Code: 195, - }, - "DHE-DSS-RC4-SHA": CipherSuite{ - IANAName: "", - GnuTLSName: "", - NSSName: "", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "DH", - Au: "DSS", - Enc: Encryption{ - Cipher: "RC4", - Bits: 128, - }, - Mac: "SHA1", - Code: 102, - }, - "DHE-DSS-SEED-SHA": CipherSuite{ - IANAName: "TLS_DHE_DSS_WITH_SEED_CBC_SHA", - GnuTLSName: "", - NSSName: "", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "DH", - Au: "DSS", - Enc: Encryption{ - Cipher: "SEED", - Bits: 128, - }, - Mac: "SHA1", - Code: 153, - }, - "DHE-RSA-AES128-GCM-SHA256": CipherSuite{ - IANAName: "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256", - GnuTLSName: "TLS_DHE_RSA_AES_128_GCM_SHA256", - NSSName: "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "DH", - Au: "RSA", - Enc: Encryption{ - Cipher: "AESGCM", - Bits: 128, - }, - Mac: "AEAD", - Code: 158, - }, - "DHE-RSA-AES128-SHA": CipherSuite{ - IANAName: "TLS_DHE_RSA_WITH_AES_128_CBC_SHA", - GnuTLSName: "TLS_DHE_RSA_AES_128_CBC_SHA1", - NSSName: "TLS_DHE_RSA_WITH_AES_128_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "DH", - Au: "RSA", - Enc: Encryption{ - Cipher: "AES", - Bits: 128, - }, - Mac: "SHA1", - Code: 51, - }, - "DHE-RSA-AES128-SHA256": CipherSuite{ - IANAName: "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256", - GnuTLSName: "TLS_DHE_RSA_AES_128_CBC_SHA256", - NSSName: "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "DH", - Au: "RSA", - Enc: Encryption{ - Cipher: "AES", - Bits: 128, - }, - Mac: "SHA256", - Code: 103, - }, - "DHE-RSA-AES256-GCM-SHA384": CipherSuite{ - IANAName: "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384", - GnuTLSName: "TLS_DHE_RSA_AES_256_GCM_SHA384", - NSSName: "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "DH", - Au: "RSA", - Enc: Encryption{ - Cipher: "AESGCM", - Bits: 256, - }, - Mac: "AEAD", - Code: 159, - }, - "DHE-RSA-AES256-SHA": CipherSuite{ - IANAName: "TLS_DHE_RSA_WITH_AES_256_CBC_SHA", - GnuTLSName: "TLS_DHE_RSA_AES_256_CBC_SHA1", - NSSName: "TLS_DHE_RSA_WITH_AES_256_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "DH", - Au: "RSA", - Enc: Encryption{ - Cipher: "AES", - Bits: 256, - }, - Mac: "SHA1", - Code: 57, - }, - "DHE-RSA-AES256-SHA256": CipherSuite{ - IANAName: "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256", - GnuTLSName: "TLS_DHE_RSA_AES_256_CBC_SHA256", - NSSName: "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "DH", - Au: "RSA", - Enc: Encryption{ - Cipher: "AES", - Bits: 256, - }, - Mac: "SHA256", - Code: 107, - }, - "DHE-RSA-CAMELLIA128-SHA": CipherSuite{ - IANAName: "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA", - GnuTLSName: "TLS_DHE_RSA_CAMELLIA_128_CBC_SHA1", - NSSName: "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "DH", - Au: "RSA", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 128, - }, - Mac: "SHA1", - Code: 69, - }, - "DHE-RSA-CAMELLIA128-SHA256": CipherSuite{ - IANAName: "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256", - GnuTLSName: "TLS_DHE_RSA_CAMELLIA_128_CBC_SHA256", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "DH", - Au: "RSA", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 128, - }, - Mac: "SHA256", - Code: 190, - }, - "DHE-RSA-CAMELLIA256-SHA": CipherSuite{ - IANAName: "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA", - GnuTLSName: "TLS_DHE_RSA_CAMELLIA_256_CBC_SHA1", - NSSName: "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "DH", - Au: "RSA", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 256, - }, - Mac: "SHA1", - Code: 136, - }, - "DHE-RSA-CAMELLIA256-SHA256": CipherSuite{ - IANAName: "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256", - GnuTLSName: "TLS_DHE_RSA_CAMELLIA_256_CBC_SHA256", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "DH", - Au: "RSA", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 256, - }, - Mac: "SHA256", - Code: 196, - }, - "DHE-RSA-CHACHA20-POLY1305-OLD": CipherSuite{ - IANAName: "", - GnuTLSName: "", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "DH", - Au: "RSA", - Enc: Encryption{ - Cipher: "ChaCha20", - Bits: 256, - }, - Mac: "AEAD", - Code: 52245, - }, - "DHE-RSA-CHACHA20-POLY1305": CipherSuite{ - IANAName: "", - GnuTLSName: "TLS_DHE_RSA_CHACHA20_POLY1305", - NSSName: "TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256,", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "DH", - Au: "RSA", - Enc: Encryption{ - Cipher: "ChaCha20", - Bits: 256, - }, - Mac: "AEAD", - Code: 52394, - }, - "DHE-RSA-SEED-SHA": CipherSuite{ - IANAName: "TLS_DHE_RSA_WITH_SEED_CBC_SHA", - GnuTLSName: "", - NSSName: "", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "DH", - Au: "RSA", - Enc: Encryption{ - Cipher: "SEED", - Bits: 128, - }, - Mac: "SHA1", - Code: 154, - }, - "ECDH-ECDSA-AES128-GCM-SHA256": CipherSuite{ - IANAName: "TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256", - GnuTLSName: "", - NSSName: "TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH/ECDSA", - Au: "ECDH", - Enc: Encryption{ - Cipher: "AESGCM", - Bits: 128, - }, - Mac: "AEAD", - Code: 49197, - }, - "ECDH-ECDSA-AES128-SHA": CipherSuite{ - IANAName: "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA", - GnuTLSName: "", - NSSName: "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "ECDH/ECDSA", - Au: "ECDH", - Enc: Encryption{ - Cipher: "AES", - Bits: 128, - }, - Mac: "SHA1", - Code: 49156, - }, - "ECDH-ECDSA-AES128-SHA256": CipherSuite{ - IANAName: "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256", - GnuTLSName: "", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH/ECDSA", - Au: "ECDH", - Enc: Encryption{ - Cipher: "AES", - Bits: 128, - }, - Mac: "SHA256", - Code: 49189, - }, - "ECDH-ECDSA-AES256-GCM-SHA384": CipherSuite{ - IANAName: "TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384", - GnuTLSName: "", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH/ECDSA", - Au: "ECDH", - Enc: Encryption{ - Cipher: "AESGCM", - Bits: 256, - }, - Mac: "AEAD", - Code: 49198, - }, - "ECDH-ECDSA-AES256-SHA": CipherSuite{ - IANAName: "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA", - GnuTLSName: "", - NSSName: "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "ECDH/ECDSA", - Au: "ECDH", - Enc: Encryption{ - Cipher: "AES", - Bits: 256, - }, - Mac: "SHA1", - Code: 49157, - }, - "ECDH-ECDSA-AES256-SHA384": CipherSuite{ - IANAName: "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384", - GnuTLSName: "", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH/ECDSA", - Au: "ECDH", - Enc: Encryption{ - Cipher: "AES", - Bits: 256, - }, - Mac: "SHA384", - Code: 49190, - }, - "ECDH-ECDSA-CAMELLIA128-SHA256": CipherSuite{ - IANAName: "TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256", - GnuTLSName: "", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH/ECDSA", - Au: "ECDH", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 128, - }, - Mac: "SHA256", - Code: 49268, - }, - "ECDH-ECDSA-CAMELLIA256-SHA384": CipherSuite{ - IANAName: "TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384", - GnuTLSName: "", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH/ECDSA", - Au: "ECDH", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 256, - }, - Mac: "SHA384", - Code: 49269, - }, - "ECDH-ECDSA-DES-CBC3-SHA": CipherSuite{ - IANAName: "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA", - GnuTLSName: "", - NSSName: "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "ECDH/ECDSA", - Au: "ECDH", - Enc: Encryption{ - Cipher: "3DES", - Bits: 168, - }, - Mac: "SHA1", - Code: 49155, - }, - "ECDH-ECDSA-RC4-SHA": CipherSuite{ - IANAName: "TLS_ECDH_ECDSA_WITH_RC4_128_SHA", - GnuTLSName: "", - NSSName: "TLS_ECDH_ECDSA_WITH_RC4_128_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "ECDH/ECDSA", - Au: "ECDH", - Enc: Encryption{ - Cipher: "RC4", - Bits: 128, - }, - Mac: "SHA1", - Code: 49154, - }, - "ECDH-RSA-AES128-GCM-SHA256": CipherSuite{ - IANAName: "TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256", - GnuTLSName: "", - NSSName: "TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH/RSA", - Au: "ECDH", - Enc: Encryption{ - Cipher: "AESGCM", - Bits: 128, - }, - Mac: "AEAD", - Code: 49201, - }, - "ECDH-RSA-AES128-SHA": CipherSuite{ - IANAName: "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA", - GnuTLSName: "", - NSSName: "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "ECDH/RSA", - Au: "ECDH", - Enc: Encryption{ - Cipher: "AES", - Bits: 128, - }, - Mac: "SHA1", - Code: 49166, - }, - "ECDH-RSA-AES128-SHA256": CipherSuite{ - IANAName: "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256", - GnuTLSName: "", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH/RSA", - Au: "ECDH", - Enc: Encryption{ - Cipher: "AES", - Bits: 128, - }, - Mac: "SHA256", - Code: 49193, - }, - "ECDH-RSA-AES256-GCM-SHA384": CipherSuite{ - IANAName: "TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384", - GnuTLSName: "", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH/RSA", - Au: "ECDH", - Enc: Encryption{ - Cipher: "AESGCM", - Bits: 256, - }, - Mac: "AEAD", - Code: 49202, - }, - "ECDH-RSA-AES256-SHA": CipherSuite{ - IANAName: "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA", - GnuTLSName: "", - NSSName: "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "ECDH/RSA", - Au: "ECDH", - Enc: Encryption{ - Cipher: "AES", - Bits: 256, - }, - Mac: "SHA1", - Code: 49167, - }, - "ECDH-RSA-AES256-SHA384": CipherSuite{ - IANAName: "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384", - GnuTLSName: "", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH/RSA", - Au: "ECDH", - Enc: Encryption{ - Cipher: "AES", - Bits: 256, - }, - Mac: "SHA384", - Code: 49194, - }, - "ECDH-RSA-CAMELLIA128-SHA256": CipherSuite{ - IANAName: "TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256", - GnuTLSName: "", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH/RSA", - Au: "ECDH", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 128, - }, - Mac: "SHA256", - Code: 49272, - }, - "ECDH-RSA-CAMELLIA256-SHA384": CipherSuite{ - IANAName: "TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384", - GnuTLSName: "", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH/RSA", - Au: "ECDH", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 256, - }, - Mac: "SHA384", - Code: 49273, - }, - "ECDH-RSA-DES-CBC3-SHA": CipherSuite{ - IANAName: "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA", - GnuTLSName: "", - NSSName: "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "ECDH/RSA", - Au: "ECDH", - Enc: Encryption{ - Cipher: "3DES", - Bits: 168, - }, - Mac: "SHA1", - Code: 49165, - }, - "ECDH-RSA-RC4-SHA": CipherSuite{ - IANAName: "TLS_ECDH_RSA_WITH_RC4_128_SHA", - GnuTLSName: "", - NSSName: "TLS_ECDH_RSA_WITH_RC4_128_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "ECDH/RSA", - Au: "ECDH", - Enc: Encryption{ - Cipher: "RC4", - Bits: 128, - }, - Mac: "SHA1", - Code: 49164, - }, - "ECDHE-ECDSA-AES128-GCM-SHA256": CipherSuite{ - IANAName: "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", - GnuTLSName: "TLS_ECDHE_ECDSA_AES_128_GCM_SHA256", - NSSName: "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH", - Au: "ECDSA", - Enc: Encryption{ - Cipher: "AESGCM", - Bits: 128, - }, - Mac: "AEAD", - Code: 49195, - }, - "ECDHE-ECDSA-AES128-SHA": CipherSuite{ - IANAName: "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", - GnuTLSName: "TLS_ECDHE_ECDSA_AES_128_CBC_SHA1", - NSSName: "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "ECDH", - Au: "ECDSA", - Enc: Encryption{ - Cipher: "AES", - Bits: 128, - }, - Mac: "SHA1", - Code: 49161, - }, - "ECDHE-ECDSA-AES128-SHA256": CipherSuite{ - IANAName: "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", - GnuTLSName: "TLS_ECDHE_ECDSA_AES_128_CBC_SHA256", - NSSName: "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH", - Au: "ECDSA", - Enc: Encryption{ - Cipher: "AES", - Bits: 128, - }, - Mac: "SHA256", - Code: 49187, - }, - "ECDHE-ECDSA-AES256-GCM-SHA384": CipherSuite{ - IANAName: "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", - GnuTLSName: "TLS_ECDHE_ECDSA_AES_256_GCM_SHA384", - NSSName: "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH", - Au: "ECDSA", - Enc: Encryption{ - Cipher: "AESGCM", - Bits: 256, - }, - Mac: "AEAD", - Code: 49196, - }, - "ECDHE-ECDSA-AES256-SHA": CipherSuite{ - IANAName: "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", - GnuTLSName: "TLS_ECDHE_ECDSA_AES_256_CBC_SHA1", - NSSName: "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "ECDH", - Au: "ECDSA", - Enc: Encryption{ - Cipher: "AES", - Bits: 256, - }, - Mac: "SHA1", - Code: 49162, - }, - "ECDHE-ECDSA-AES256-SHA384": CipherSuite{ - IANAName: "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384", - GnuTLSName: "TLS_ECDHE_ECDSA_AES_256_CBC_SHA384", - NSSName: "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH", - Au: "ECDSA", - Enc: Encryption{ - Cipher: "AES", - Bits: 256, - }, - Mac: "SHA384", - Code: 49188, - }, - "ECDHE-ECDSA-CAMELLIA128-SHA256": CipherSuite{ - IANAName: "TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256", - GnuTLSName: "TLS_ECDHE_ECDSA_CAMELLIA_128_CBC_SHA256", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH", - Au: "ECDSA", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 128, - }, - Mac: "SHA256", - Code: 49266, - }, - "ECDHE-ECDSA-CAMELLIA256-SHA384": CipherSuite{ - IANAName: "TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384", - GnuTLSName: "TLS_ECDHE_ECDSA_CAMELLIA_256_CBC_SHA384", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH", - Au: "ECDSA", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 256, - }, - Mac: "SHA384", - Code: 49267, - }, - "ECDHE-ECDSA-CHACHA20-POLY1305-OLD": CipherSuite{ - IANAName: "", - GnuTLSName: "", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH", - Au: "ECDSA", - Enc: Encryption{ - Cipher: "ChaCha20", - Bits: 256, - }, - Mac: "AEAD", - Code: 52244, - }, - "ECDHE-ECDSA-CHACHA20-POLY1305": CipherSuite{ - IANAName: "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305", - GnuTLSName: "TLS_ECDHE_ECDSA_CHACHA20_POLY1305", - NSSName: "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH", - Au: "ECDSA", - Enc: Encryption{ - Cipher: "ChaCha20", - Bits: 256, - }, - Mac: "AEAD", - Code: 52393, - }, - "ECDHE-ECDSA-DES-CBC3-SHA": CipherSuite{ - IANAName: "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA", - GnuTLSName: "TLS_ECDHE_ECDSA_3DES_EDE_CBC_SHA1", - NSSName: "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "ECDH", - Au: "ECDSA", - Enc: Encryption{ - Cipher: "3DES", - Bits: 168, - }, - Mac: "SHA1", - Code: 49160, - }, - "ECDHE-ECDSA-RC4-SHA": CipherSuite{ - IANAName: "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", - GnuTLSName: "TLS_ECDHE_ECDSA_ARCFOUR_128_SHA1", - NSSName: "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "ECDH", - Au: "ECDSA", - Enc: Encryption{ - Cipher: "RC4", - Bits: 128, - }, - Mac: "SHA1", - Code: 49159, - }, - "ECDHE-RSA-AES128-GCM-SHA256": CipherSuite{ - IANAName: "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", - GnuTLSName: "TLS_ECDHE_RSA_AES_128_GCM_SHA256", - NSSName: "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH", - Au: "RSA", - Enc: Encryption{ - Cipher: "AESGCM", - Bits: 128, - }, - Mac: "AEAD", - Code: 49199, - }, - "ECDHE-RSA-AES128-SHA": CipherSuite{ - IANAName: "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", - GnuTLSName: "TLS_ECDHE_RSA_AES_128_CBC_SHA1", - NSSName: "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "ECDH", - Au: "RSA", - Enc: Encryption{ - Cipher: "AES", - Bits: 128, - }, - Mac: "SHA1", - Code: 49171, - }, - "ECDHE-RSA-AES128-SHA256": CipherSuite{ - IANAName: "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", - GnuTLSName: "TLS_ECDHE_RSA_AES_128_CBC_SHA256", - NSSName: "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH", - Au: "RSA", - Enc: Encryption{ - Cipher: "AES", - Bits: 128, - }, - Mac: "SHA256", - Code: 49191, - }, - "ECDHE-RSA-AES256-GCM-SHA384": CipherSuite{ - IANAName: "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", - GnuTLSName: "TLS_ECDHE_RSA_AES_256_GCM_SHA384", - NSSName: "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH", - Au: "RSA", - Enc: Encryption{ - Cipher: "AESGCM", - Bits: 256, - }, - Mac: "AEAD", - Code: 49200, - }, - "ECDHE-RSA-AES256-SHA": CipherSuite{ - IANAName: "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", - GnuTLSName: "TLS_ECDHE_RSA_AES_256_CBC_SHA1", - NSSName: "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "ECDH", - Au: "RSA", - Enc: Encryption{ - Cipher: "AES", - Bits: 256, - }, - Mac: "SHA1", - Code: 49172, - }, - "ECDHE-RSA-AES256-SHA384": CipherSuite{ - IANAName: "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384", - GnuTLSName: "TLS_ECDHE_RSA_AES_256_CBC_SHA384", - NSSName: "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH", - Au: "RSA", - Enc: Encryption{ - Cipher: "AES", - Bits: 256, - }, - Mac: "SHA384", - Code: 49192, - }, - "ECDHE-RSA-CAMELLIA128-SHA256": CipherSuite{ - IANAName: "TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256", - GnuTLSName: "TLS_ECDHE_RSA_CAMELLIA_128_CBC_SHA256", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH", - Au: "RSA", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 128, - }, - Mac: "SHA256", - Code: 49270, - }, - "ECDHE-RSA-CAMELLIA256-SHA384": CipherSuite{ - IANAName: "TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384", - GnuTLSName: "TLS_ECDHE_RSA_CAMELLIA_256_CBC_SHA384", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH", - Au: "RSA", - Enc: Encryption{ - Cipher: "Camellia", - Bits: 256, - }, - Mac: "SHA384", - Code: 49271, - }, - "ECDHE-RSA-CHACHA20-POLY1305-OLD": CipherSuite{ - IANAName: "", - GnuTLSName: "", - NSSName: "", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH", - Au: "RSA", - Enc: Encryption{ - Cipher: "ChaCha20", - Bits: 256, - }, - Mac: "AEAD", - Code: 52243, - }, - "ECDHE-RSA-CHACHA20-POLY1305": CipherSuite{ - IANAName: "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305", - GnuTLSName: "TLS_ECDHE_RSA_CHACHA20_POLY1305", - NSSName: "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256", - Protocol: "TLSv1.2", ProtocolCode: 771, - Kx: "ECDH", - Au: "RSA", - Enc: Encryption{ - Cipher: "ChaCha20", - Bits: 256, - }, - Mac: "AEAD", - Code: 52392, - }, - "ECDHE-RSA-DES-CBC3-SHA": CipherSuite{ - IANAName: "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA", - GnuTLSName: "TLS_ECDHE_RSA_3DES_EDE_CBC_SHA1", - NSSName: "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "ECDH", - Au: "RSA", - Enc: Encryption{ - Cipher: "3DES", - Bits: 168, - }, - Mac: "SHA1", - Code: 49170, - }, - "ECDHE-RSA-RC4-SHA": CipherSuite{ - IANAName: "TLS_ECDHE_RSA_WITH_RC4_128_SHA", - GnuTLSName: "TLS_ECDHE_RSA_ARCFOUR_128_SHA1", - NSSName: "TLS_ECDHE_RSA_WITH_RC4_128_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "ECDH", - Au: "RSA", - Enc: Encryption{ - Cipher: "RC4", - Bits: 128, - }, - Mac: "SHA1", - Code: 49169, - }, - "EDH-DSS-DES-CBC3-SHA": CipherSuite{ - IANAName: "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA", - GnuTLSName: "TLS_DHE_DSS_3DES_EDE_CBC_SHA1", - NSSName: "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "DH", - Au: "DSS", - Enc: Encryption{ - Cipher: "3DES", - Bits: 168, - }, - Mac: "SHA1", - Code: 19, - }, - "EDH-RSA-DES-CBC3-SHA": CipherSuite{ - IANAName: "TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA", - GnuTLSName: "TLS_DHE_RSA_3DES_EDE_CBC_SHA1", - NSSName: "TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "DH", - Au: "RSA", - Enc: Encryption{ - Cipher: "3DES", - Bits: 168, - }, - Mac: "SHA1", - Code: 22, - }, - "IDEA-CBC-SHA": CipherSuite{ - IANAName: "TLS_RSA_WITH_IDEA_CBC_SHA", - GnuTLSName: "", - NSSName: "TLS_RSA_WITH_IDEA_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "RSA", - Au: "RSA", - Enc: Encryption{ - Cipher: "IDEA", - Bits: 128, - }, - Mac: "SHA1", - Code: 7, - }, - "PSK-3DES-EDE-CBC-SHA": CipherSuite{ - IANAName: "TLS_PSK_WITH_3DES_EDE_CBC_SHA", - GnuTLSName: "TLS_PSK_3DES_EDE_CBC_SHA1", - NSSName: "", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "PSK", - Au: "PSK", - Enc: Encryption{ - Cipher: "3DES", - Bits: 168, - }, - Mac: "SHA1", - Code: 139, - }, - "PSK-AES128-CBC-SHA": CipherSuite{ - IANAName: "TLS_PSK_WITH_AES_128_CBC_SHA", - GnuTLSName: "TLS_PSK_AES_128_CBC_SHA1", - NSSName: "", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "PSK", - Au: "PSK", - Enc: Encryption{ - Cipher: "AES", - Bits: 128, - }, - Mac: "SHA1", - Code: 140, - }, - "PSK-AES256-CBC-SHA": CipherSuite{ - IANAName: "TLS_PSK_WITH_AES_256_CBC_SHA", - GnuTLSName: "TLS_PSK_AES_256_CBC_SHA1", - NSSName: "", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "PSK", - Au: "PSK", - Enc: Encryption{ - Cipher: "AES", - Bits: 256, - }, - Mac: "SHA1", - Code: 141, - }, - "PSK-RC4-SHA": CipherSuite{ - IANAName: "TLS_PSK_WITH_RC4_128_SHA", - GnuTLSName: "TLS_PSK_ARCFOUR_128_SHA1", - NSSName: "", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "PSK", - Au: "PSK", - Enc: Encryption{ - Cipher: "RC4", - Bits: 128, - }, - Mac: "SHA1", - Code: 138, - }, - "RC4-MD5": CipherSuite{ - IANAName: "TLS_RSA_WITH_RC4_128_MD5", - GnuTLSName: "TLS_RSA_ARCFOUR_128_MD5", - NSSName: "TLS_RSA_WITH_RC4_128_MD5", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "RSA", - Au: "RSA", - Enc: Encryption{ - Cipher: "RC4", - Bits: 128, - }, - Mac: "MD5", - Code: 4, - }, - "RC4-SHA": CipherSuite{ - IANAName: "TLS_RSA_WITH_RC4_128_SHA", - GnuTLSName: "TLS_RSA_ARCFOUR_128_SHA1", - NSSName: "TLS_RSA_WITH_RC4_128_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "RSA", - Au: "RSA", - Enc: Encryption{ - Cipher: "RC4", - Bits: 128, - }, - Mac: "SHA1", - Code: 5, - }, - "RSA-PSK-3DES-EDE-CBC-SHA": CipherSuite{ - IANAName: "TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA", - GnuTLSName: "TLS_RSA_PSK_3DES_EDE_CBC_SHA1", - NSSName: "", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "RSAPSK", - Au: "RSA", - Enc: Encryption{ - Cipher: "3DES", - Bits: 168, - }, - Mac: "SHA1", - Code: 147, - }, - "RSA-PSK-AES128-CBC-SHA": CipherSuite{ - IANAName: "TLS_RSA_PSK_WITH_AES_128_CBC_SHA", - GnuTLSName: "TLS_RSA_PSK_AES_128_CBC_SHA1", - NSSName: "", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "RSAPSK", - Au: "RSA", - Enc: Encryption{ - Cipher: "AES", - Bits: 128, - }, - Mac: "SHA1", - Code: 148, - }, - "RSA-PSK-AES256-CBC-SHA": CipherSuite{ - IANAName: "TLS_RSA_PSK_WITH_AES_256_CBC_SHA", - GnuTLSName: "TLS_RSA_PSK_AES_256_CBC_SHA1", - NSSName: "", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "RSAPSK", - Au: "RSA", - Enc: Encryption{ - Cipher: "AES", - Bits: 256, - }, - Mac: "SHA1", - Code: 149, - }, - "RSA-PSK-RC4-SHA": CipherSuite{ - IANAName: "TLS_RSA_PSK_WITH_RC4_128_SHA", - GnuTLSName: "TLS_RSA_PSK_ARCFOUR_128_SHA1", - NSSName: "", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "RSAPSK", - Au: "RSA", - Enc: Encryption{ - Cipher: "RC4", - Bits: 128, - }, - Mac: "SHA1", - Code: 146, - }, - "SEED-SHA": CipherSuite{ - IANAName: "TLS_RSA_WITH_SEED_CBC_SHA", - GnuTLSName: "", - NSSName: "TLS_RSA_WITH_SEED_CBC_SHA", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "RSA", - Au: "RSA", - Enc: Encryption{ - Cipher: "SEED", - Bits: 128, - }, - Mac: "SHA1", - Code: 150, - }, - "SRP-3DES-EDE-CBC-SHA": CipherSuite{ - IANAName: "TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA", - GnuTLSName: "TLS_SRP_SHA_3DES_EDE_CBC_SHA1", - NSSName: "", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "SRP", - Au: "SRP", - Enc: Encryption{ - Cipher: "3DES", - Bits: 168, - }, - Mac: "SHA1", - Code: 49178, - }, - "SRP-AES-128-CBC-SHA": CipherSuite{ - IANAName: "TLS_SRP_SHA_WITH_AES_128_CBC_SHA", - GnuTLSName: "TLS_SRP_SHA_AES_128_CBC_SHA1", - NSSName: "", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "SRP", - Au: "SRP", - Enc: Encryption{ - Cipher: "AES", - Bits: 128, - }, - Mac: "SHA1", - Code: 49181, - }, - "SRP-AES-256-CBC-SHA": CipherSuite{ - IANAName: "TLS_SRP_SHA_WITH_AES_256_CBC_SHA", - GnuTLSName: "TLS_SRP_SHA_AES_256_CBC_SHA1", - NSSName: "", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "SRP", - Au: "SRP", - Enc: Encryption{ - Cipher: "AES", - Bits: 256, - }, - Mac: "SHA1", - Code: 49184, - }, - "SRP-DSS-3DES-EDE-CBC-SHA": CipherSuite{ - IANAName: "TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA", - GnuTLSName: "TLS_SRP_SHA_DSS_3DES_EDE_CBC_SHA1", - NSSName: "", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "SRP", - Au: "DSS", - Enc: Encryption{ - Cipher: "3DES", - Bits: 168, - }, - Mac: "SHA1", - Code: 49180, - }, - "SRP-DSS-AES-128-CBC-SHA": CipherSuite{ - IANAName: "TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA", - GnuTLSName: "TLS_SRP_SHA_DSS_AES_128_CBC_SHA1", - NSSName: "", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "SRP", - Au: "DSS", - Enc: Encryption{ - Cipher: "AES", - Bits: 128, - }, - Mac: "SHA1", - Code: 49183, - }, - "SRP-DSS-AES-256-CBC-SHA": CipherSuite{ - IANAName: "TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA", - GnuTLSName: "TLS_SRP_SHA_DSS_AES_256_CBC_SHA1", - NSSName: "", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "SRP", - Au: "DSS", - Enc: Encryption{ - Cipher: "AES", - Bits: 256, - }, - Mac: "SHA1", - Code: 49186, - }, - "SRP-RSA-3DES-EDE-CBC-SHA": CipherSuite{ - IANAName: "TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA", - GnuTLSName: "TLS_SRP_SHA_RSA_3DES_EDE_CBC_SHA1", - NSSName: "", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "SRP", - Au: "RSA", - Enc: Encryption{ - Cipher: "3DES", - Bits: 168, - }, - Mac: "SHA1", - Code: 49179, - }, - "SRP-RSA-AES-128-CBC-SHA": CipherSuite{ - IANAName: "TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA", - GnuTLSName: "TLS_SRP_SHA_RSA_AES_128_CBC_SHA1", - NSSName: "", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "SRP", - Au: "RSA", - Enc: Encryption{ - Cipher: "AES", - Bits: 128, - }, - Mac: "SHA1", - Code: 49182, - }, - "SRP-RSA-AES-256-CBC-SHA": CipherSuite{ - IANAName: "TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA", - GnuTLSName: "TLS_SRP_SHA_RSA_AES_256_CBC_SHA1", - NSSName: "", - Protocol: "SSLv3", ProtocolCode: 768, - Kx: "SRP", - Au: "RSA", - Enc: Encryption{ - Cipher: "AES", - Bits: 256, - }, - Mac: "SHA1", - Code: 49185, - }, -} diff --git a/vendor/github.com/mozilla/tls-observatory/constants/curves.go b/vendor/github.com/mozilla/tls-observatory/constants/curves.go deleted file mode 100644 index 33335c1cd..000000000 --- a/vendor/github.com/mozilla/tls-observatory/constants/curves.go +++ /dev/null @@ -1,194 +0,0 @@ -package constants - -// Curve is the definition of an elliptic curve -type Curve struct { - Name string `json:"iana_name"` - OpenSSLName string `json:"openssl_name,omitempty"` - PFSName string `json:"pfs_name,omitempty"` - Code uint64 `json:"code"` -} - -// Curves is a list of known IANA curves with their code point, -// IANA name, openssl name and PFS alias used by openssl -var Curves = []Curve{ - Curve{ - Code: 1, - Name: "sect163k1", - OpenSSLName: "", - PFSName: "K-163", - }, - Curve{ - Code: 2, - Name: "sect163r1", - OpenSSLName: "", - PFSName: "", - }, - Curve{ - Code: 3, - Name: "sect163r2", - OpenSSLName: "", - PFSName: "B-163", - }, - Curve{ - Code: 4, - Name: "sect193r1", - OpenSSLName: "", - PFSName: "", - }, - Curve{ - Code: 5, - Name: "sect193r2", - OpenSSLName: "", - PFSName: "", - }, - Curve{ - Code: 6, - Name: "sect233k1", - OpenSSLName: "", - PFSName: "K-233", - }, - Curve{ - Code: 7, - Name: "sect233r1", - OpenSSLName: "", - PFSName: "", - }, - Curve{ - Code: 8, - Name: "sect239k1", - OpenSSLName: "", - PFSName: "", - }, - Curve{ - Code: 9, - Name: "sect283k1", - OpenSSLName: "", - PFSName: "K-283", - }, - Curve{ - Code: 10, - Name: "sect283r1", - OpenSSLName: "", - PFSName: "B-283", - }, - Curve{ - Code: 11, - Name: "sect409k1", - OpenSSLName: "", - PFSName: "K-409", - }, - Curve{ - Code: 12, - Name: "sect409r1", - OpenSSLName: "", - PFSName: "B-409", - }, - Curve{ - Code: 13, - Name: "sect571k1", - OpenSSLName: "", - PFSName: "K-571", - }, - Curve{ - Code: 14, - Name: "sect571r1", - OpenSSLName: "", - PFSName: "B-571", - }, - Curve{ - Code: 15, - Name: "secp160k1", - OpenSSLName: "", - PFSName: "", - }, - Curve{ - Code: 16, - Name: "secp160r1", - OpenSSLName: "", - PFSName: "", - }, - Curve{ - Code: 17, - Name: "secp160r2", - OpenSSLName: "", - PFSName: "", - }, - Curve{ - Code: 18, - Name: "secp192k1", - OpenSSLName: "", - PFSName: "", - }, - Curve{ - Code: 19, - Name: "secp192r1", - OpenSSLName: "prime192v1", - PFSName: "P-192", - }, - Curve{ - Code: 20, - Name: "secp224k1", - OpenSSLName: "", - PFSName: "", - }, - Curve{ - Code: 21, - Name: "secp224r1", - OpenSSLName: "", - PFSName: "P-224", - }, - Curve{ - Code: 22, - Name: "secp256k1", - OpenSSLName: "", - PFSName: "", - }, - Curve{ - Code: 23, - Name: "secp256r1", - OpenSSLName: "prime256v1", - PFSName: "P-256", - }, - Curve{ - Code: 24, - Name: "secp384r1", - OpenSSLName: "", - PFSName: "P-384", - }, - Curve{ - Code: 25, - Name: "secp521r1", - OpenSSLName: "", - PFSName: "P-521", - }, - Curve{ - Code: 26, - Name: "brainpoolP256r1", - OpenSSLName: "", - PFSName: "", - }, - Curve{ - Code: 27, - Name: "brainpoolP384r1", - OpenSSLName: "", - PFSName: "", - }, - Curve{ - Code: 28, - Name: "brainpoolP512r1", - OpenSSLName: "", - PFSName: "", - }, - Curve{ - Code: 29, - Name: "ecdh_x25519", - OpenSSLName: "", - PFSName: "", - }, - Curve{ - Code: 30, - Name: "ecdh_x448", - OpenSSLName: "", - PFSName: "", - }, -} diff --git a/vendor/github.com/mozilla/tls-observatory/constants/protocols.go b/vendor/github.com/mozilla/tls-observatory/constants/protocols.go deleted file mode 100644 index ae304ffbc..000000000 --- a/vendor/github.com/mozilla/tls-observatory/constants/protocols.go +++ /dev/null @@ -1,25 +0,0 @@ -package constants - -type Protocol struct { - OpenSSLName string `json:"openssl_name"` - Code int `json:"code"` -} - -var Protocols = []Protocol{ - Protocol{ - OpenSSLName: "SSLv3", - Code: 768, - }, - Protocol{ - OpenSSLName: "TLSv1", - Code: 769, - }, - Protocol{ - OpenSSLName: "TLSv1.1", - Code: 770, - }, - Protocol{ - OpenSSLName: "TLSv1.2", - Code: 771, - }, -} diff --git a/vendor/github.com/nbutton23/zxcvbn-go/Makefile b/vendor/github.com/nbutton23/zxcvbn-go/Makefile new file mode 100644 index 000000000..6aa13e006 --- /dev/null +++ b/vendor/github.com/nbutton23/zxcvbn-go/Makefile @@ -0,0 +1,15 @@ +PKG_LIST = $$( go list ./... | grep -v /vendor/ | grep -v "zxcvbn-go/data" ) + +.DEFAULT_GOAL := help + +.PHONY: help +help: + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + +.PHONY: test +test: ## Run `go test {Package list}` on the packages + go test $(PKG_LIST) + +.PHONY: lint +lint: ## Run `golint {Package list}` + golint $(PKG_LIST) \ No newline at end of file diff --git a/vendor/github.com/nbutton23/zxcvbn-go/adjacency/adjcmartix.go b/vendor/github.com/nbutton23/zxcvbn-go/adjacency/adjcmartix.go index 3320d5968..66ad30b82 100644 --- a/vendor/github.com/nbutton23/zxcvbn-go/adjacency/adjcmartix.go +++ b/vendor/github.com/nbutton23/zxcvbn-go/adjacency/adjcmartix.go @@ -3,65 +3,76 @@ package adjacency import ( "encoding/json" "log" - // "fmt" + "github.com/nbutton23/zxcvbn-go/data" ) -type AdjacencyGraph struct { +// Graph holds information about different graphs +type Graph struct { Graph map[string][]string averageDegree float64 Name string } -var AdjacencyGph = make(map[string]AdjacencyGraph) +// GraphMap is a map of all graphs +var GraphMap = make(map[string]Graph) func init() { - AdjacencyGph["qwerty"] = BuildQwerty() - AdjacencyGph["dvorak"] = BuildDvorak() - AdjacencyGph["keypad"] = BuildKeypad() - AdjacencyGph["macKeypad"] = BuildMacKeypad() - AdjacencyGph["l33t"] = BuildLeet() + GraphMap["qwerty"] = BuildQwerty() + GraphMap["dvorak"] = BuildDvorak() + GraphMap["keypad"] = BuildKeypad() + GraphMap["macKeypad"] = BuildMacKeypad() + GraphMap["l33t"] = BuildLeet() } -func BuildQwerty() AdjacencyGraph { - data, err := zxcvbn_data.Asset("data/Qwerty.json") +//BuildQwerty builds the Qwerty Graph +func BuildQwerty() Graph { + data, err := data.Asset("data/Qwerty.json") if err != nil { panic("Can't find asset") } - return GetAdjancencyGraphFromFile(data, "qwerty") + return getAdjancencyGraphFromFile(data, "qwerty") } -func BuildDvorak() AdjacencyGraph { - data, err := zxcvbn_data.Asset("data/Dvorak.json") + +//BuildDvorak builds the Dvorak Graph +func BuildDvorak() Graph { + data, err := data.Asset("data/Dvorak.json") if err != nil { panic("Can't find asset") } - return GetAdjancencyGraphFromFile(data, "dvorak") + return getAdjancencyGraphFromFile(data, "dvorak") } -func BuildKeypad() AdjacencyGraph { - data, err := zxcvbn_data.Asset("data/Keypad.json") + +//BuildKeypad builds the Keypad Graph +func BuildKeypad() Graph { + data, err := data.Asset("data/Keypad.json") if err != nil { panic("Can't find asset") } - return GetAdjancencyGraphFromFile(data, "keypad") + return getAdjancencyGraphFromFile(data, "keypad") } -func BuildMacKeypad() AdjacencyGraph { - data, err := zxcvbn_data.Asset("data/MacKeypad.json") + +//BuildMacKeypad builds the Mac Keypad Graph +func BuildMacKeypad() Graph { + data, err := data.Asset("data/MacKeypad.json") if err != nil { panic("Can't find asset") } - return GetAdjancencyGraphFromFile(data, "mac_keypad") + return getAdjancencyGraphFromFile(data, "mac_keypad") } -func BuildLeet() AdjacencyGraph { - data, err := zxcvbn_data.Asset("data/L33t.json") + +//BuildLeet builds the L33T Graph +func BuildLeet() Graph { + data, err := data.Asset("data/L33t.json") if err != nil { panic("Can't find asset") } - return GetAdjancencyGraphFromFile(data, "keypad") + return getAdjancencyGraphFromFile(data, "keypad") } -func GetAdjancencyGraphFromFile(data []byte, name string) AdjacencyGraph { +func getAdjancencyGraphFromFile(data []byte, name string) Graph { - var graph AdjacencyGraph + var graph Graph err := json.Unmarshal(data, &graph) if err != nil { log.Fatal(err) @@ -70,10 +81,11 @@ func GetAdjancencyGraphFromFile(data []byte, name string) AdjacencyGraph { return graph } +// CalculateAvgDegree calclates the average degree between nodes in the graph //on qwerty, 'g' has degree 6, being adjacent to 'ftyhbv'. '\' has degree 1. //this calculates the average over all keys. //TODO double check that i ported this correctly scoring.coffee ln 5 -func (adjGrp AdjacencyGraph) CalculateAvgDegree() float64 { +func (adjGrp Graph) CalculateAvgDegree() float64 { if adjGrp.averageDegree != float64(0) { return adjGrp.averageDegree } @@ -82,7 +94,7 @@ func (adjGrp AdjacencyGraph) CalculateAvgDegree() float64 { for _, value := range adjGrp.Graph { for _, char := range value { - if char != "" || char != " " { + if len(char) != 0 || char != " " { avg += float64(len(char)) count++ } diff --git a/vendor/github.com/nbutton23/zxcvbn-go/data/bindata.go b/vendor/github.com/nbutton23/zxcvbn-go/data/bindata.go index e5dfede4d..f3a0c010c 100644 --- a/vendor/github.com/nbutton23/zxcvbn-go/data/bindata.go +++ b/vendor/github.com/nbutton23/zxcvbn-go/data/bindata.go @@ -12,7 +12,7 @@ // data/Surnames.json // DO NOT EDIT! -package zxcvbn_data +package data import ( "bytes" diff --git a/vendor/github.com/nbutton23/zxcvbn-go/entropy/entropyCalculator.go b/vendor/github.com/nbutton23/zxcvbn-go/entropy/entropyCalculator.go index 028732d26..8f57ea0a4 100644 --- a/vendor/github.com/nbutton23/zxcvbn-go/entropy/entropyCalculator.go +++ b/vendor/github.com/nbutton23/zxcvbn-go/entropy/entropyCalculator.go @@ -10,19 +10,20 @@ import ( ) const ( - START_UPPER string = `^[A-Z][^A-Z]+$` - END_UPPER string = `^[^A-Z]+[A-Z]$'` - ALL_UPPER string = `^[A-Z]+$` - NUM_YEARS = float64(119) // years match against 1900 - 2019 - NUM_MONTHS = float64(12) - NUM_DAYS = float64(31) + numYears = float64(119) // years match against 1900 - 2019 + numMonths = float64(12) + numDays = float64(31) ) var ( - KEYPAD_STARTING_POSITIONS = len(adjacency.AdjacencyGph["keypad"].Graph) - KEYPAD_AVG_DEGREE = adjacency.AdjacencyGph["keypad"].CalculateAvgDegree() + startUpperRx = regexp.MustCompile(`^[A-Z][^A-Z]+$`) + endUpperRx = regexp.MustCompile(`^[^A-Z]+[A-Z]$'`) + allUpperRx = regexp.MustCompile(`^[A-Z]+$`) + keyPadStartingPositions = len(adjacency.GraphMap["keypad"].Graph) + keyPadAvgDegree = adjacency.GraphMap["keypad"].CalculateAvgDegree() ) +// DictionaryEntropy calculates the entropy of a dictionary match func DictionaryEntropy(match match.Match, rank float64) float64 { baseEntropy := math.Log2(rank) upperCaseEntropy := extraUpperCaseEntropy(match) @@ -49,9 +50,7 @@ func extraUpperCaseEntropy(match match.Match) float64 { //so it only doubles the search space (uncapitalized + capitalized): 1 extra bit of entropy. //allcaps and end-capitalized are common enough too, underestimate as 1 extra bit to be safe. - for _, regex := range []string{START_UPPER, END_UPPER, ALL_UPPER} { - matcher := regexp.MustCompile(regex) - + for _, matcher := range []*regexp.Regexp{startUpperRx, endUpperRx, allUpperRx} { if matcher.MatchString(word) { return float64(1) } @@ -72,7 +71,7 @@ func extraUpperCaseEntropy(match match.Match) float64 { var possibililities float64 for i := float64(0); i <= math.Min(countUpper, countLower); i++ { - possibililities += float64(zxcvbn_math.NChoseK(totalLenght, i)) + possibililities += float64(zxcvbnmath.NChoseK(totalLenght, i)) } if possibililities < 1 { @@ -82,6 +81,7 @@ func extraUpperCaseEntropy(match match.Match) float64 { return float64(math.Log2(possibililities)) } +// SpatialEntropy calculates the entropy for spatial matches func SpatialEntropy(match match.Match, turns int, shiftCount int) float64 { var s, d float64 if match.DictionaryName == "qwerty" || match.DictionaryName == "dvorak" { @@ -89,8 +89,8 @@ func SpatialEntropy(match match.Match, turns int, shiftCount int) float64 { s = float64(len(adjacency.BuildQwerty().Graph)) d = adjacency.BuildQwerty().CalculateAvgDegree() } else { - s = float64(KEYPAD_STARTING_POSITIONS) - d = KEYPAD_AVG_DEGREE + s = float64(keyPadStartingPositions) + d = keyPadAvgDegree } possibilities := float64(0) @@ -102,7 +102,7 @@ func SpatialEntropy(match match.Match, turns int, shiftCount int) float64 { for i := float64(2); i <= length+1; i++ { possibleTurns := math.Min(float64(turns), i-1) for j := float64(1); j <= possibleTurns+1; j++ { - x := zxcvbn_math.NChoseK(i-1, j-1) * s * math.Pow(d, j) + x := zxcvbnmath.NChoseK(i-1, j-1) * s * math.Pow(d, j) possibilities += x } } @@ -116,7 +116,7 @@ func SpatialEntropy(match match.Match, turns int, shiftCount int) float64 { U := length - S for i := float64(0); i < math.Min(S, U)+1; i++ { - possibilities += zxcvbn_math.NChoseK(S+U, i) + possibilities += zxcvbnmath.NChoseK(S+U, i) } entropy += math.Log2(possibilities) @@ -125,6 +125,7 @@ func SpatialEntropy(match match.Match, turns int, shiftCount int) float64 { return entropy } +// RepeatEntropy calculates the entropy for repeating entropy func RepeatEntropy(match match.Match) float64 { cardinality := CalcBruteForceCardinality(match.Token) entropy := math.Log2(cardinality * float64(len(match.Token))) @@ -132,6 +133,7 @@ func RepeatEntropy(match match.Match) float64 { return entropy } +// CalcBruteForceCardinality calculates the brute force cardinality //TODO: Validate against python func CalcBruteForceCardinality(password string) float64 { lower, upper, digits, symbols := float64(0), float64(0), float64(0), float64(0) @@ -152,6 +154,7 @@ func CalcBruteForceCardinality(password string) float64 { return cardinality } +// SequenceEntropy calculates the entropy for sequences such as 4567 or cdef func SequenceEntropy(match match.Match, dictionaryLength int, ascending bool) float64 { firstChar := match.Token[0] baseEntropy := float64(0) @@ -171,6 +174,7 @@ func SequenceEntropy(match match.Match, dictionaryLength int, ascending bool) fl return baseEntropy + math.Log2(float64(len(match.Token))) } +// ExtraLeetEntropy calulates the added entropy provied by l33t substitustions func ExtraLeetEntropy(match match.Match, password string) float64 { var subsitutions float64 var unsub float64 @@ -187,7 +191,7 @@ func ExtraLeetEntropy(match match.Match, password string) float64 { var possibilities float64 for i := float64(0); i <= math.Min(subsitutions, unsub)+1; i++ { - possibilities += zxcvbn_math.NChoseK(subsitutions+unsub, i) + possibilities += zxcvbnmath.NChoseK(subsitutions+unsub, i) } if possibilities <= 1 { @@ -196,16 +200,13 @@ func ExtraLeetEntropy(match match.Match, password string) float64 { return math.Log2(possibilities) } -func YearEntropy(dateMatch match.DateMatch) float64 { - return math.Log2(NUM_YEARS) -} - +// DateEntropy calculates the entropy provided by a date func DateEntropy(dateMatch match.DateMatch) float64 { var entropy float64 if dateMatch.Year < 100 { - entropy = math.Log2(NUM_DAYS * NUM_MONTHS * 100) + entropy = math.Log2(numDays * numMonths * 100) } else { - entropy = math.Log2(NUM_DAYS * NUM_MONTHS * NUM_YEARS) + entropy = math.Log2(numDays * numMonths * numYears) } if dateMatch.Separator != "" { diff --git a/vendor/github.com/nbutton23/zxcvbn-go/frequency/frequency.go b/vendor/github.com/nbutton23/zxcvbn-go/frequency/frequency.go index 5718830ad..d056e4d4e 100644 --- a/vendor/github.com/nbutton23/zxcvbn-go/frequency/frequency.go +++ b/vendor/github.com/nbutton23/zxcvbn-go/frequency/frequency.go @@ -2,16 +2,19 @@ package frequency import ( "encoding/json" - "github.com/nbutton23/zxcvbn-go/data" "log" + + "github.com/nbutton23/zxcvbn-go/data" ) -type FrequencyList struct { +// List holds a frequency list +type List struct { Name string List []string } -var FrequencyLists = make(map[string]FrequencyList) +// Lists holds all the frequency list in a map +var Lists = make(map[string]List) func init() { maleFilePath := getAsset("data/MaleNames.json") @@ -20,24 +23,24 @@ func init() { englishFilePath := getAsset("data/English.json") passwordsFilePath := getAsset("data/Passwords.json") - FrequencyLists["MaleNames"] = GetStringListFromAsset(maleFilePath, "MaleNames") - FrequencyLists["FemaleNames"] = GetStringListFromAsset(femaleFilePath, "FemaleNames") - FrequencyLists["Surname"] = GetStringListFromAsset(surnameFilePath, "Surname") - FrequencyLists["English"] = GetStringListFromAsset(englishFilePath, "English") - FrequencyLists["Passwords"] = GetStringListFromAsset(passwordsFilePath, "Passwords") + Lists["MaleNames"] = getStringListFromAsset(maleFilePath, "MaleNames") + Lists["FemaleNames"] = getStringListFromAsset(femaleFilePath, "FemaleNames") + Lists["Surname"] = getStringListFromAsset(surnameFilePath, "Surname") + Lists["English"] = getStringListFromAsset(englishFilePath, "English") + Lists["Passwords"] = getStringListFromAsset(passwordsFilePath, "Passwords") } func getAsset(name string) []byte { - data, err := zxcvbn_data.Asset(name) + data, err := data.Asset(name) if err != nil { panic("Error getting asset " + name) } return data } -func GetStringListFromAsset(data []byte, name string) FrequencyList { +func getStringListFromAsset(data []byte, name string) List { - var tempList FrequencyList + var tempList List err := json.Unmarshal(data, &tempList) if err != nil { log.Fatal(err) diff --git a/vendor/github.com/nbutton23/zxcvbn-go/match/match.go b/vendor/github.com/nbutton23/zxcvbn-go/match/match.go index 052394394..dd30bea04 100644 --- a/vendor/github.com/nbutton23/zxcvbn-go/match/match.go +++ b/vendor/github.com/nbutton23/zxcvbn-go/match/match.go @@ -1,5 +1,6 @@ package match +//Matches is an alies for []Match used for sorting type Matches []Match func (s Matches) Len() int { @@ -18,6 +19,7 @@ func (s Matches) Less(i, j int) bool { } } +// Match represents different matches type Match struct { Pattern string I, J int @@ -26,6 +28,7 @@ type Match struct { Entropy float64 } +//DateMatch is specifilly a match for type date type DateMatch struct { Pattern string I, J int @@ -34,6 +37,7 @@ type DateMatch struct { Day, Month, Year int64 } +//Matcher are a func and ID that can be used to match different passwords type Matcher struct { MatchingFunc func(password string) []Match ID string diff --git a/vendor/github.com/nbutton23/zxcvbn-go/matching/dateMatchers.go b/vendor/github.com/nbutton23/zxcvbn-go/matching/dateMatchers.go index e55b3da8a..8dfdf2410 100644 --- a/vendor/github.com/nbutton23/zxcvbn-go/matching/dateMatchers.go +++ b/vendor/github.com/nbutton23/zxcvbn-go/matching/dateMatchers.go @@ -10,16 +10,24 @@ import ( ) const ( - DATESEP_MATCHER_NAME = "DATESEP" - DATEWITHOUTSEP_MATCHER_NAME = "DATEWITHOUT" + dateSepMatcherName = "DATESEP" + dateWithOutSepMatcherName = "DATEWITHOUT" ) +var ( + dateRxYearSuffix = regexp.MustCompile(`((\d{1,2})(\s|-|\/|\\|_|\.)(\d{1,2})(\s|-|\/|\\|_|\.)(19\d{2}|200\d|201\d|\d{2}))`) + dateRxYearPrefix = regexp.MustCompile(`((19\d{2}|200\d|201\d|\d{2})(\s|-|/|\\|_|\.)(\d{1,2})(\s|-|/|\\|_|\.)(\d{1,2}))`) + dateWithOutSepMatch = regexp.MustCompile(`\d{4,8}`) +) + +//FilterDateSepMatcher can be pass to zxcvbn-go.PasswordStrength to skip that matcher func FilterDateSepMatcher(m match.Matcher) bool { - return m.ID == DATESEP_MATCHER_NAME + return m.ID == dateSepMatcherName } +//FilterDateWithoutSepMatcher can be pass to zxcvbn-go.PasswordStrength to skip that matcher func FilterDateWithoutSepMatcher(m match.Matcher) bool { - return m.ID == DATEWITHOUTSEP_MATCHER_NAME + return m.ID == dateWithOutSepMatcherName } func checkDate(day, month, year int64) (bool, int64, int64, int64) { @@ -60,9 +68,8 @@ func dateSepMatchHelper(password string) []match.DateMatch { var matches []match.DateMatch - matcher := regexp.MustCompile(DATE_RX_YEAR_SUFFIX) - for _, v := range matcher.FindAllString(password, len(password)) { - splitV := matcher.FindAllStringSubmatch(v, len(v)) + for _, v := range dateRxYearSuffix.FindAllString(password, len(password)) { + splitV := dateRxYearSuffix.FindAllStringSubmatch(v, len(v)) i := strings.Index(password, v) j := i + len(v) day, _ := strconv.ParseInt(splitV[0][4], 10, 16) @@ -72,9 +79,8 @@ func dateSepMatchHelper(password string) []match.DateMatch { matches = append(matches, match) } - matcher = regexp.MustCompile(DATE_RX_YEAR_PREFIX) - for _, v := range matcher.FindAllString(password, len(password)) { - splitV := matcher.FindAllStringSubmatch(v, len(v)) + for _, v := range dateRxYearPrefix.FindAllString(password, len(password)) { + splitV := dateRxYearPrefix.FindAllStringSubmatch(v, len(v)) i := strings.Index(password, v) j := i + len(v) day, _ := strconv.ParseInt(splitV[0][4], 10, 16) @@ -98,13 +104,13 @@ func dateSepMatchHelper(password string) []match.DateMatch { } -type DateMatchCandidate struct { +type dateMatchCandidate struct { DayMonth string Year string I, J int } -type DateMatchCandidateTwo struct { +type dateMatchCandidateTwo struct { Day string Month string Year string @@ -132,13 +138,12 @@ func dateWithoutSepMatch(password string) []match.Match { //TODO Has issues with 6 digit dates func dateWithoutSepMatchHelper(password string) (matches []match.DateMatch) { - matcher := regexp.MustCompile(DATE_WITHOUT_SEP_MATCH) - for _, v := range matcher.FindAllString(password, len(password)) { + for _, v := range dateWithOutSepMatch.FindAllString(password, len(password)) { i := strings.Index(password, v) j := i + len(v) length := len(v) lastIndex := length - 1 - var candidatesRoundOne []DateMatchCandidate + var candidatesRoundOne []dateMatchCandidate if length <= 6 { //2-digit year prefix @@ -155,7 +160,7 @@ func dateWithoutSepMatchHelper(password string) (matches []match.DateMatch) { candidatesRoundOne = append(candidatesRoundOne, buildDateMatchCandidate(v[0:lastIndex-3], v[lastIndex-3:], i, j)) } - var candidatesRoundTwo []DateMatchCandidateTwo + var candidatesRoundTwo []dateMatchCandidateTwo for _, c := range candidatesRoundOne { if len(c.DayMonth) == 2 { candidatesRoundTwo = append(candidatesRoundTwo, buildDateMatchCandidateTwo(c.DayMonth[0:0], c.DayMonth[1:1], c.Year, c.I, c.J)) @@ -194,11 +199,11 @@ func dateWithoutSepMatchHelper(password string) (matches []match.DateMatch) { return matches } -func buildDateMatchCandidate(dayMonth, year string, i, j int) DateMatchCandidate { - return DateMatchCandidate{DayMonth: dayMonth, Year: year, I: i, J: j} +func buildDateMatchCandidate(dayMonth, year string, i, j int) dateMatchCandidate { + return dateMatchCandidate{DayMonth: dayMonth, Year: year, I: i, J: j} } -func buildDateMatchCandidateTwo(day, month string, year string, i, j int) DateMatchCandidateTwo { +func buildDateMatchCandidateTwo(day, month string, year string, i, j int) dateMatchCandidateTwo { - return DateMatchCandidateTwo{Day: day, Month: month, Year: year, I: i, J: j} + return dateMatchCandidateTwo{Day: day, Month: month, Year: year, I: i, J: j} } diff --git a/vendor/github.com/nbutton23/zxcvbn-go/matching/dictionaryMatch.go b/vendor/github.com/nbutton23/zxcvbn-go/matching/dictionaryMatch.go index b76921f0d..4ddb2c3b0 100644 --- a/vendor/github.com/nbutton23/zxcvbn-go/matching/dictionaryMatch.go +++ b/vendor/github.com/nbutton23/zxcvbn-go/matching/dictionaryMatch.go @@ -1,9 +1,10 @@ package matching import ( + "strings" + "github.com/nbutton23/zxcvbn-go/entropy" "github.com/nbutton23/zxcvbn-go/match" - "strings" ) func buildDictMatcher(dictName string, rankedDict map[string]int) func(password string) []match.Match { @@ -18,19 +19,21 @@ func buildDictMatcher(dictName string, rankedDict map[string]int) func(password } func dictionaryMatch(password string, dictionaryName string, rankedDict map[string]int) []match.Match { - length := len(password) var results []match.Match pwLower := strings.ToLower(password) + pwLowerRunes := []rune(pwLower) + length := len(pwLowerRunes) + for i := 0; i < length; i++ { for j := i; j < length; j++ { - word := pwLower[i : j+1] - if val, ok := rankedDict[word]; ok { + word := pwLowerRunes[i : j+1] + if val, ok := rankedDict[string(word)]; ok { matchDic := match.Match{Pattern: "dictionary", DictionaryName: dictionaryName, I: i, J: j, - Token: password[i : j+1], + Token: string([]rune(password)[i : j+1]), } matchDic.Entropy = entropy.DictionaryEntropy(matchDic, float64(val)) diff --git a/vendor/github.com/nbutton23/zxcvbn-go/matching/leet.go b/vendor/github.com/nbutton23/zxcvbn-go/matching/leet.go index 7185744c9..610f1973f 100644 --- a/vendor/github.com/nbutton23/zxcvbn-go/matching/leet.go +++ b/vendor/github.com/nbutton23/zxcvbn-go/matching/leet.go @@ -7,22 +7,21 @@ import ( "github.com/nbutton23/zxcvbn-go/match" ) -const L33T_MATCHER_NAME = "l33t" +// L33TMatcherName id +const L33TMatcherName = "l33t" +//FilterL33tMatcher can be pass to zxcvbn-go.PasswordStrength to skip that matcher func FilterL33tMatcher(m match.Matcher) bool { - return m.ID == L33T_MATCHER_NAME + return m.ID == L33TMatcherName } func l33tMatch(password string) []match.Match { - - substitutions := relevantL33tSubtable(password) - - permutations := getAllPermutationsOfLeetSubstitutions(password, substitutions) + permutations := getPermutations(password) var matches []match.Match for _, permutation := range permutations { - for _, mather := range DICTIONARY_MATCHERS { + for _, mather := range dictionaryMatchers { matches = append(matches, mather.MatchingFunc(permutation)...) } } @@ -35,41 +34,201 @@ func l33tMatch(password string) []match.Match { return matches } -func getAllPermutationsOfLeetSubstitutions(password string, substitutionsMap map[string][]string) []string { +// This function creates a list of permutations based on a fixed table stored on data. The table +// will be reduced in order to proceed in the function using only relevant values (see +// relevantL33tSubtable). +func getPermutations(password string) []string { + substitutions := relevantL33tSubtable(password) + permutations := getAllPermutationsOfLeetSubstitutions(password, substitutions) + return permutations +} - var permutations []string +// This function loads the table from data but only keep in memory the values that are present +// inside the provided password. +func relevantL33tSubtable(password string) map[string][]string { + relevantSubs := make(map[string][]string) + for key, values := range l33tTable.Graph { + for _, value := range values { + if strings.Contains(password, value) { + relevantSubs[key] = append(relevantSubs[key], value) + } + } + } - for index, char := range password { - for value, splice := range substitutionsMap { - for _, sub := range splice { - if string(char) == sub { - var permutation string - permutation = password[:index] + value + password[index+1:] + return relevantSubs +} - permutations = append(permutations, permutation) - if index < len(permutation) { - tempPermutations := getAllPermutationsOfLeetSubstitutions(permutation[index+1:], substitutionsMap) - for _, temp := range tempPermutations { - permutations = append(permutations, permutation[:index+1]+temp) - } +// This function creates the list of permutations of a given password using the provided table as +// reference for its operation. +func getAllPermutationsOfLeetSubstitutions(password string, table map[string][]string) []string { + result := []string{} + + // create a list of tables without conflicting keys/values (this happens for "|", "7" and "1") + noConflictsTables := createListOfMapsWithoutConflicts(table) + for _, noConflictsTable := range noConflictsTables { + substitutionsMaps := createSubstitutionsMapsFromTable(noConflictsTable) + for _, substitutionsMap := range substitutionsMaps { + newValue := createWordForSubstitutionMap(password, substitutionsMap) + if !stringSliceContainsValue(result, newValue) { + result = append(result, newValue) + } + } + } + + return result +} + +// Create the possible list of maps removing the conflicts from it. As an example, the value "|" +// may represent "i" and "l". For each representation of the conflicting value, a new map is +// created. This may grow exponencialy according to the number of conflicts. The number of maps +// returned by this function may be reduced if the relevantL33tSubtable function was called to +// identify only relevant items. +func createListOfMapsWithoutConflicts(table map[string][]string) []map[string][]string { + // the resulting list starts with the provided table + result := []map[string][]string{} + result = append(result, table) + + // iterate over the list of conflicts in order to expand the maps for each one + conflicts := retrieveConflictsListFromTable(table) + for _, value := range conflicts { + newMapList := []map[string][]string{} + + // for each conflict a new list of maps will be created for every already known map + for _, currentMap := range result { + newMaps := createDifferentMapsForLeetChar(currentMap, value) + newMapList = append(newMapList, newMaps...) + } + + result = newMapList + } + + return result +} + +// This function retrieves the list of values that appear for one or more keys. This is usefull to +// know which l33t chars can represent more than one letter. +func retrieveConflictsListFromTable(table map[string][]string) []string { + result := []string{} + foundValues := []string{} - } + for _, values := range table { + for _, value := range values { + if stringSliceContainsValue(foundValues, value) { + // only add on results if it was not identified as conflict before + if !stringSliceContainsValue(result, value) { + result = append(result, value) } + } else { + foundValues = append(foundValues, value) } } } - return permutations + return result } -func relevantL33tSubtable(password string) map[string][]string { - relevantSubs := make(map[string][]string) - for key, values := range L33T_TABLE.Graph { +// This function aims to create different maps for a given char if this char represents a conflict. +// If the specified char is not a conflit one, the same map will be returned. In scenarios which +// the provided char can not be found on map, an empty list will be returned. This function was +// designed to be used on conflicts situations. +func createDifferentMapsForLeetChar(table map[string][]string, leetChar string) []map[string][]string { + result := []map[string][]string{} + + keysWithSameValue := retrieveListOfKeysWithSpecificValueFromTable(table, leetChar) + for _, key := range keysWithSameValue { + newMap := copyMapRemovingSameValueFromOtherKeys(table, key, leetChar) + result = append(result, newMap) + } + + return result +} + +// This function retrieves the list of keys that can be represented using the given value. +func retrieveListOfKeysWithSpecificValueFromTable(table map[string][]string, valueToFind string) []string { + result := []string{} + + for key, values := range table { for _, value := range values { - if strings.Contains(password, value) { - relevantSubs[key] = append(relevantSubs[key], value) + if value == valueToFind && !stringSliceContainsValue(result, key) { + result = append(result, key) } } } - return relevantSubs + + return result +} + +// This function returns a lsit of substitution map from a given table. Each map in the result will +// provide only one representation for each value. As an example, if the provided map contains the +// values "@" and "4" in the possibilities to represent "a", two maps will be created where one +// will contain "a" mapping to "@" and the other one will provide "a" mapping to "4". +func createSubstitutionsMapsFromTable(table map[string][]string) []map[string]string { + result := []map[string]string{{"": ""}} + + for key, values := range table { + newResult := []map[string]string{} + + for _, mapInCurrentResult := range result { + for _, value := range values { + newMapForValue := copyMap(mapInCurrentResult) + newMapForValue[key] = value + newResult = append(newResult, newMapForValue) + } + } + + result = newResult + } + + // verification to make sure that the slice was filled + if len(result) == 1 && len(result[0]) == 1 && result[0][""] == "" { + return []map[string]string{} + } + + return result +} + +// This function replaces the values provided on substitution map over the provided word. +func createWordForSubstitutionMap(word string, substitutionMap map[string]string) string { + result := word + for key, value := range substitutionMap { + result = strings.Replace(result, value, key, -1) + } + + return result +} + +func stringSliceContainsValue(slice []string, value string) bool { + for _, valueInSlice := range slice { + if valueInSlice == value { + return true + } + } + + return false +} + +func copyMap(table map[string]string) map[string]string { + result := make(map[string]string) + + for key, value := range table { + result[key] = value + } + + return result +} + +// This function creates a new map based on the one provided but excluding possible representations +// of the same value on other keys. +func copyMapRemovingSameValueFromOtherKeys(table map[string][]string, keyToFix string, valueToFix string) map[string][]string { + result := make(map[string][]string) + + for key, values := range table { + for _, value := range values { + if !(value == valueToFix && key != keyToFix) { + result[key] = append(result[key], value) + } + } + } + + return result } diff --git a/vendor/github.com/nbutton23/zxcvbn-go/matching/matching.go b/vendor/github.com/nbutton23/zxcvbn-go/matching/matching.go index 70f1631d0..4577db8a4 100644 --- a/vendor/github.com/nbutton23/zxcvbn-go/matching/matching.go +++ b/vendor/github.com/nbutton23/zxcvbn-go/matching/matching.go @@ -9,28 +9,23 @@ import ( ) var ( - DICTIONARY_MATCHERS []match.Matcher - MATCHERS []match.Matcher - ADJACENCY_GRAPHS []adjacency.AdjacencyGraph - L33T_TABLE adjacency.AdjacencyGraph + dictionaryMatchers []match.Matcher + matchers []match.Matcher + adjacencyGraphs []adjacency.Graph + l33tTable adjacency.Graph - SEQUENCES map[string]string -) - -const ( - DATE_RX_YEAR_SUFFIX string = `((\d{1,2})(\s|-|\/|\\|_|\.)(\d{1,2})(\s|-|\/|\\|_|\.)(19\d{2}|200\d|201\d|\d{2}))` - DATE_RX_YEAR_PREFIX string = `((19\d{2}|200\d|201\d|\d{2})(\s|-|/|\\|_|\.)(\d{1,2})(\s|-|/|\\|_|\.)(\d{1,2}))` - DATE_WITHOUT_SEP_MATCH string = `\d{4,8}` + sequences map[string]string ) func init() { loadFrequencyList() } +// Omnimatch runs all matchers against the password func Omnimatch(password string, userInputs []string, filters ...func(match.Matcher) bool) (matches []match.Match) { //Can I run into the issue where nil is not equal to nil? - if DICTIONARY_MATCHERS == nil || ADJACENCY_GRAPHS == nil { + if dictionaryMatchers == nil || adjacencyGraphs == nil { loadFrequencyList() } @@ -39,7 +34,7 @@ func Omnimatch(password string, userInputs []string, filters ...func(match.Match matches = userInputMatcher(password) } - for _, matcher := range MATCHERS { + for _, matcher := range matchers { shouldBeFiltered := false for i := range filters { if filters[i](matcher) { @@ -57,31 +52,31 @@ func Omnimatch(password string, userInputs []string, filters ...func(match.Match func loadFrequencyList() { - for n, list := range frequency.FrequencyLists { - DICTIONARY_MATCHERS = append(DICTIONARY_MATCHERS, match.Matcher{MatchingFunc: buildDictMatcher(n, buildRankedDict(list.List)), ID: n}) + for n, list := range frequency.Lists { + dictionaryMatchers = append(dictionaryMatchers, match.Matcher{MatchingFunc: buildDictMatcher(n, buildRankedDict(list.List)), ID: n}) } - L33T_TABLE = adjacency.AdjacencyGph["l33t"] + l33tTable = adjacency.GraphMap["l33t"] - ADJACENCY_GRAPHS = append(ADJACENCY_GRAPHS, adjacency.AdjacencyGph["qwerty"]) - ADJACENCY_GRAPHS = append(ADJACENCY_GRAPHS, adjacency.AdjacencyGph["dvorak"]) - ADJACENCY_GRAPHS = append(ADJACENCY_GRAPHS, adjacency.AdjacencyGph["keypad"]) - ADJACENCY_GRAPHS = append(ADJACENCY_GRAPHS, adjacency.AdjacencyGph["macKeypad"]) + adjacencyGraphs = append(adjacencyGraphs, adjacency.GraphMap["qwerty"]) + adjacencyGraphs = append(adjacencyGraphs, adjacency.GraphMap["dvorak"]) + adjacencyGraphs = append(adjacencyGraphs, adjacency.GraphMap["keypad"]) + adjacencyGraphs = append(adjacencyGraphs, adjacency.GraphMap["macKeypad"]) //l33tFilePath, _ := filepath.Abs("adjacency/L33t.json") //L33T_TABLE = adjacency.GetAdjancencyGraphFromFile(l33tFilePath, "l33t") - SEQUENCES = make(map[string]string) - SEQUENCES["lower"] = "abcdefghijklmnopqrstuvwxyz" - SEQUENCES["upper"] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - SEQUENCES["digits"] = "0123456789" - - MATCHERS = append(MATCHERS, DICTIONARY_MATCHERS...) - MATCHERS = append(MATCHERS, match.Matcher{MatchingFunc: spatialMatch, ID: SPATIAL_MATCHER_NAME}) - MATCHERS = append(MATCHERS, match.Matcher{MatchingFunc: repeatMatch, ID: REPEAT_MATCHER_NAME}) - MATCHERS = append(MATCHERS, match.Matcher{MatchingFunc: sequenceMatch, ID: SEQUENCE_MATCHER_NAME}) - MATCHERS = append(MATCHERS, match.Matcher{MatchingFunc: l33tMatch, ID: L33T_MATCHER_NAME}) - MATCHERS = append(MATCHERS, match.Matcher{MatchingFunc: dateSepMatcher, ID: DATESEP_MATCHER_NAME}) - MATCHERS = append(MATCHERS, match.Matcher{MatchingFunc: dateWithoutSepMatch, ID: DATEWITHOUTSEP_MATCHER_NAME}) + sequences = make(map[string]string) + sequences["lower"] = "abcdefghijklmnopqrstuvwxyz" + sequences["upper"] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + sequences["digits"] = "0123456789" + + matchers = append(matchers, dictionaryMatchers...) + matchers = append(matchers, match.Matcher{MatchingFunc: spatialMatch, ID: spatialMatcherName}) + matchers = append(matchers, match.Matcher{MatchingFunc: repeatMatch, ID: repeatMatcherName}) + matchers = append(matchers, match.Matcher{MatchingFunc: sequenceMatch, ID: sequenceMatcherName}) + matchers = append(matchers, match.Matcher{MatchingFunc: l33tMatch, ID: L33TMatcherName}) + matchers = append(matchers, match.Matcher{MatchingFunc: dateSepMatcher, ID: dateSepMatcherName}) + matchers = append(matchers, match.Matcher{MatchingFunc: dateWithoutSepMatch, ID: dateWithOutSepMatcherName}) } diff --git a/vendor/github.com/nbutton23/zxcvbn-go/matching/repeatMatch.go b/vendor/github.com/nbutton23/zxcvbn-go/matching/repeatMatch.go index 97bd33b4c..a93e45935 100644 --- a/vendor/github.com/nbutton23/zxcvbn-go/matching/repeatMatch.go +++ b/vendor/github.com/nbutton23/zxcvbn-go/matching/repeatMatch.go @@ -7,10 +7,11 @@ import ( "github.com/nbutton23/zxcvbn-go/match" ) -const REPEAT_MATCHER_NAME = "REPEAT" +const repeatMatcherName = "REPEAT" +//FilterRepeatMatcher can be pass to zxcvbn-go.PasswordStrength to skip that matcher func FilterRepeatMatcher(m match.Matcher) bool { - return m.ID == REPEAT_MATCHER_NAME + return m.ID == repeatMatcherName } func repeatMatch(password string) []match.Match { diff --git a/vendor/github.com/nbutton23/zxcvbn-go/matching/sequenceMatch.go b/vendor/github.com/nbutton23/zxcvbn-go/matching/sequenceMatch.go index 89f152659..e0ed05229 100644 --- a/vendor/github.com/nbutton23/zxcvbn-go/matching/sequenceMatch.go +++ b/vendor/github.com/nbutton23/zxcvbn-go/matching/sequenceMatch.go @@ -7,10 +7,11 @@ import ( "github.com/nbutton23/zxcvbn-go/match" ) -const SEQUENCE_MATCHER_NAME = "SEQ" +const sequenceMatcherName = "SEQ" +//FilterSequenceMatcher can be pass to zxcvbn-go.PasswordStrength to skip that matcher func FilterSequenceMatcher(m match.Matcher) bool { - return m.ID == SEQUENCE_MATCHER_NAME + return m.ID == sequenceMatcherName } func sequenceMatch(password string) []match.Match { @@ -20,7 +21,7 @@ func sequenceMatch(password string) []match.Match { var seq string var seqName string seqDirection := 0 - for seqCandidateName, seqCandidate := range SEQUENCES { + for seqCandidateName, seqCandidate := range sequences { iN := strings.Index(seqCandidate, string(password[i])) var jN int if j < len(password) { @@ -64,7 +65,7 @@ func sequenceMatch(password string) []match.Match { } break } else { - j += 1 + j++ } } diff --git a/vendor/github.com/nbutton23/zxcvbn-go/matching/spatialMatch.go b/vendor/github.com/nbutton23/zxcvbn-go/matching/spatialMatch.go index 145cfb8b1..fd858f5d1 100644 --- a/vendor/github.com/nbutton23/zxcvbn-go/matching/spatialMatch.go +++ b/vendor/github.com/nbutton23/zxcvbn-go/matching/spatialMatch.go @@ -8,14 +8,15 @@ import ( "github.com/nbutton23/zxcvbn-go/match" ) -const SPATIAL_MATCHER_NAME = "SPATIAL" +const spatialMatcherName = "SPATIAL" +//FilterSpatialMatcher can be pass to zxcvbn-go.PasswordStrength to skip that matcher func FilterSpatialMatcher(m match.Matcher) bool { - return m.ID == SPATIAL_MATCHER_NAME + return m.ID == spatialMatcherName } func spatialMatch(password string) (matches []match.Match) { - for _, graph := range ADJACENCY_GRAPHS { + for _, graph := range adjacencyGraphs { if graph.Graph != nil { matches = append(matches, spatialMatchHelper(password, graph)...) } @@ -23,7 +24,7 @@ func spatialMatch(password string) (matches []match.Match) { return matches } -func spatialMatchHelper(password string, graph adjacency.AdjacencyGraph) (matches []match.Match) { +func spatialMatchHelper(password string, graph adjacency.Graph) (matches []match.Match) { for i := 0; i < len(password)-1; { j := i + 1 @@ -42,7 +43,7 @@ func spatialMatchHelper(password string, graph adjacency.AdjacencyGraph) (matche if j < len(password) { curChar := password[j] for _, adj := range adjacents { - curDirection += 1 + curDirection++ if strings.Index(adj, string(curChar)) != -1 { found = true @@ -51,13 +52,13 @@ func spatialMatchHelper(password string, graph adjacency.AdjacencyGraph) (matche if strings.Index(adj, string(curChar)) == 1 { //index 1 in the adjacency means the key is shifted, 0 means unshifted: A vs a, % vs 5, etc. //for example, 'q' is adjacent to the entry '2@'. @ is shifted w/ index 1, 2 is unshifted. - shiftedCount += 1 + shiftedCount++ } if lastDirection != foundDirection { //adding a turn is correct even in the initial case when last_direction is null: //every spatial pattern starts with a turn. - turns += 1 + turns++ lastDirection = foundDirection } break @@ -67,7 +68,7 @@ func spatialMatchHelper(password string, graph adjacency.AdjacencyGraph) (matche //if the current pattern continued, extend j and try to grow again if found { - j += 1 + j++ } else { //otherwise push the pattern discovered so far, if any... //don't consider length 1 or 2 chains. diff --git a/vendor/github.com/nbutton23/zxcvbn-go/scoring/scoring.go b/vendor/github.com/nbutton23/zxcvbn-go/scoring/scoring.go index 0456fd7c2..4f68a6dca 100644 --- a/vendor/github.com/nbutton23/zxcvbn-go/scoring/scoring.go +++ b/vendor/github.com/nbutton23/zxcvbn-go/scoring/scoring.go @@ -10,19 +10,16 @@ import ( ) const ( - START_UPPER string = `^[A-Z][^A-Z]+$` - END_UPPER string = `^[^A-Z]+[A-Z]$'` - ALL_UPPER string = `^[A-Z]+$` - //for a hash function like bcrypt/scrypt/PBKDF2, 10ms per guess is a safe lower bound. //(usually a guess would take longer -- this assumes fast hardware and a small work factor.) //adjust for your site accordingly if you use another hash function, possibly by //several orders of magnitude! - SINGLE_GUESS float64 = 0.010 - NUM_ATTACKERS float64 = 100 //Cores used to make guesses - SECONDS_PER_GUESS float64 = SINGLE_GUESS / NUM_ATTACKERS + singleGuess float64 = 0.010 + numAttackers float64 = 100 //Cores used to make guesses + secondsPerGuess float64 = singleGuess / numAttackers ) +// MinEntropyMatch is the lowest entropy match found type MinEntropyMatch struct { Password string Entropy float64 @@ -34,7 +31,7 @@ type MinEntropyMatch struct { } /* -Returns minimum entropy +MinimumEntropyMatchSequence returns the minimum entropy Takes a list of overlapping matches, returns the non-overlapping sublist with minimum entropy. O(nm) dp alg for length-n password with m candidate matches. @@ -130,13 +127,13 @@ func get(a []float64, i int) float64 { } func entropyToCrackTime(entropy float64) float64 { - crackTime := (0.5 * math.Pow(float64(2), entropy)) * SECONDS_PER_GUESS + crackTime := (0.5 * math.Pow(float64(2), entropy)) * secondsPerGuess return crackTime } func roundToXDigits(number float64, digits int) float64 { - return zxcvbn_math.Round(number, .5, digits) + return zxcvbnmath.Round(number, .5, digits) } func displayTime(seconds float64) string { diff --git a/vendor/github.com/nbutton23/zxcvbn-go/utils/math/mathutils.go b/vendor/github.com/nbutton23/zxcvbn-go/utils/math/mathutils.go index d885479c3..1b989d194 100644 --- a/vendor/github.com/nbutton23/zxcvbn-go/utils/math/mathutils.go +++ b/vendor/github.com/nbutton23/zxcvbn-go/utils/math/mathutils.go @@ -1,12 +1,11 @@ -package zxcvbn_math +package zxcvbnmath import "math" -/** +/* +NChoseK http://blog.plover.com/math/choose.html I am surprised that I have to define these. . . Maybe i just didn't look hard enough for a lib. */ - -//http://blog.plover.com/math/choose.html func NChoseK(n, k float64) float64 { if k > n { return 0 @@ -25,6 +24,7 @@ func NChoseK(n, k float64) float64 { return r } +// Round a number func Round(val float64, roundOn float64, places int) (newVal float64) { var round float64 pow := math.Pow(10, float64(places)) diff --git a/vendor/github.com/nbutton23/zxcvbn-go/zxcvbn.go b/vendor/github.com/nbutton23/zxcvbn-go/zxcvbn.go index 086270c68..9c34b1c8c 100644 --- a/vendor/github.com/nbutton23/zxcvbn-go/zxcvbn.go +++ b/vendor/github.com/nbutton23/zxcvbn-go/zxcvbn.go @@ -9,6 +9,7 @@ import ( "github.com/nbutton23/zxcvbn-go/utils/math" ) +// PasswordStrength takes a password, userInputs and optional filters and returns a MinEntropyMatch func PasswordStrength(password string, userInputs []string, filters ...func(match.Matcher) bool) scoring.MinEntropyMatch { start := time.Now() matches := matching.Omnimatch(password, userInputs, filters...) @@ -16,6 +17,6 @@ func PasswordStrength(password string, userInputs []string, filters ...func(matc end := time.Now() calcTime := end.Nanosecond() - start.Nanosecond() - result.CalcTime = zxcvbn_math.Round(float64(calcTime)*time.Nanosecond.Seconds(), .5, 3) + result.CalcTime = zxcvbnmath.Round(float64(calcTime)*time.Nanosecond.Seconds(), .5, 3) return result } diff --git a/vendor/github.com/nightlyone/lockfile/.travis.yml b/vendor/github.com/nightlyone/lockfile/.travis.yml index 76e5962bf..4f0af474a 100644 --- a/vendor/github.com/nightlyone/lockfile/.travis.yml +++ b/vendor/github.com/nightlyone/lockfile/.travis.yml @@ -1,7 +1,7 @@ language: go go: - - 1.4.3 - - 1.6.2 + - 1.13 + - 1.14 - tip # Only test commits to production branch and all pull requests diff --git a/vendor/github.com/nightlyone/lockfile/go.mod b/vendor/github.com/nightlyone/lockfile/go.mod new file mode 100644 index 000000000..5133ff715 --- /dev/null +++ b/vendor/github.com/nightlyone/lockfile/go.mod @@ -0,0 +1,3 @@ +module github.com/nightlyone/lockfile + +go 1.11 diff --git a/vendor/github.com/nightlyone/lockfile/lockfile.go b/vendor/github.com/nightlyone/lockfile/lockfile.go index af2d84a55..76bdfbe09 100644 --- a/vendor/github.com/nightlyone/lockfile/lockfile.go +++ b/vendor/github.com/nightlyone/lockfile/lockfile.go @@ -26,7 +26,7 @@ func (t TemporaryError) Error() string { return string(t) } // Temporary returns always true. // It exists, so you can detect it via // if te, ok := err.(interface{ Temporary() bool }); ok { -// fmt.Println("I am a temporay error situation, so wait and retry") +// fmt.Println("I am a temporary error situation, so wait and retry") // } func (t TemporaryError) Temporary() bool { return true } @@ -45,6 +45,7 @@ func New(path string) (Lockfile, error) { if !filepath.IsAbs(path) { return Lockfile(""), ErrNeedAbsPath } + return Lockfile(path), nil } @@ -63,6 +64,7 @@ func (l Lockfile) GetOwner() (*os.Process, error) { if err != nil { return nil, err } + running, err := isRunning(pid) if err != nil { return nil, err @@ -73,10 +75,11 @@ func (l Lockfile) GetOwner() (*os.Process, error) { if err != nil { return nil, err } + return proc, nil } - return nil, ErrDeadOwner + return nil, ErrDeadOwner } // TryLock tries to own the lock. @@ -93,44 +96,38 @@ func (l Lockfile) TryLock() error { panic(ErrNeedAbsPath) } - tmplock, err := ioutil.TempFile(filepath.Dir(name), filepath.Base(name)+".") + tmplock, cleanup, err := makePidFile(name, os.Getpid()) if err != nil { return err } - cleanup := func() { - _ = tmplock.Close() - _ = os.Remove(tmplock.Name()) - } defer cleanup() - if err := writePidLine(tmplock, os.Getpid()); err != nil { - return err - } - - // EEXIST and similiar error codes, caught by os.IsExist, are intentionally ignored, + // EEXIST and similar error codes, caught by os.IsExist, are intentionally ignored, // as it means that someone was faster creating this link // and ignoring this kind of error is part of the algorithm. - // The we will probably fail the pid owner check later, if this process is still alive. + // Then we will probably fail the pid owner check later, if this process is still alive. // We cannot ignore ALL errors, since failure to support hard links, disk full // as well as many other errors can happen to a filesystem operation // and we really want to abort on those. - if err := os.Link(tmplock.Name(), name); err != nil { + if err := os.Link(tmplock, name); err != nil { if !os.IsExist(err) { return err } } - fiTmp, err := os.Lstat(tmplock.Name()) + fiTmp, err := os.Lstat(tmplock) if err != nil { return err } + fiLock, err := os.Lstat(name) if err != nil { // tell user that a retry would be a good idea if os.IsNotExist(err) { return ErrNotExist } + return err } @@ -148,8 +145,7 @@ func (l Lockfile) TryLock() error { if proc.Pid != os.Getpid() { return ErrBusy } - case ErrDeadOwner, ErrInvalidPid: - // cases we can fix below + case ErrDeadOwner, ErrInvalidPid: // cases we can fix below } // clean stale/invalid lockfile @@ -165,7 +161,7 @@ func (l Lockfile) TryLock() error { return l.TryLock() } -// Unlock a lock again, if we owned it. Returns any error that happend during release of lock. +// Unlock a lock again, if we owned it. Returns any error that happened during release of lock. func (l Lockfile) Unlock() error { proc, err := l.GetOwner() switch err { @@ -189,11 +185,6 @@ func (l Lockfile) Unlock() error { } } -func writePidLine(w io.Writer, pid int) error { - _, err := io.WriteString(w, fmt.Sprintf("%d\n", pid)) - return err -} - func scanPidLine(content []byte) (int, error) { if len(content) == 0 { return 0, ErrInvalidPid @@ -207,5 +198,25 @@ func scanPidLine(content []byte) (int, error) { if pid <= 0 { return 0, ErrInvalidPid } + return pid, nil } + +func makePidFile(name string, pid int) (tmpname string, cleanup func(), err error) { + tmplock, err := ioutil.TempFile(filepath.Dir(name), filepath.Base(name)+".") + if err != nil { + return "", nil, err + } + + cleanup = func() { + _ = tmplock.Close() + _ = os.Remove(tmplock.Name()) + } + + if _, err := io.WriteString(tmplock, fmt.Sprintf("%d\n", pid)); err != nil { + cleanup() // Do cleanup here, so call doesn't have to. + return "", nil, err + } + + return tmplock.Name(), cleanup, nil +} diff --git a/vendor/github.com/nightlyone/lockfile/lockfile_unix.go b/vendor/github.com/nightlyone/lockfile/lockfile_unix.go index d724e701b..d43e9b5ee 100644 --- a/vendor/github.com/nightlyone/lockfile/lockfile_unix.go +++ b/vendor/github.com/nightlyone/lockfile/lockfile_unix.go @@ -16,5 +16,6 @@ func isRunning(pid int) (bool, error) { if err := proc.Signal(syscall.Signal(0)); err != nil { return false, nil } + return true, nil } diff --git a/vendor/github.com/onsi/ginkgo/.gitignore b/vendor/github.com/onsi/ginkgo/.gitignore deleted file mode 100644 index b9f9659d2..000000000 --- a/vendor/github.com/onsi/ginkgo/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -.DS_Store -TODO -tmp/**/* -*.coverprofile -.vscode -.idea/ -*.log diff --git a/vendor/github.com/onsi/ginkgo/.travis.yml b/vendor/github.com/onsi/ginkgo/.travis.yml deleted file mode 100644 index 9da4c5b5e..000000000 --- a/vendor/github.com/onsi/ginkgo/.travis.yml +++ /dev/null @@ -1,18 +0,0 @@ -language: go -go: - - 1.10.x - - 1.11.x - - 1.12.x - - tip - -# allow internal package imports, necessary for forked repositories -go_import_path: github.com/onsi/ginkgo - -install: - - go get -v -t ./... - - go get golang.org/x/tools/cmd/cover - - go get github.com/onsi/gomega - - go install github.com/onsi/ginkgo/ginkgo - - export PATH=$PATH:$HOME/gopath/bin - -script: $HOME/gopath/bin/ginkgo -r --randomizeAllSpecs --randomizeSuites --race --trace && go vet diff --git a/vendor/github.com/onsi/ginkgo/CHANGELOG.md b/vendor/github.com/onsi/ginkgo/CHANGELOG.md deleted file mode 100644 index 020496c9d..000000000 --- a/vendor/github.com/onsi/ginkgo/CHANGELOG.md +++ /dev/null @@ -1,258 +0,0 @@ -## 1.10.3 - -### Fixes -- Set go_import_path in travis.yml to allow internal packages in forks (#607) [3b721db] -- Add integration test [d90e0dc] -- Fix coverage files combining [e5dde8c] -- A new CLI option: -ginkgo.reportFile (#601) [034fd25] - -## 1.10.2 - -### Fixes -- speed up table entry generateIt() (#609) [5049dc5] -- Fix. Write errors to stderr instead of stdout (#610) [7bb3091] - -## 1.10.1 - -### Fixes -- stack backtrace: fix skipping (#600) [2a4c0bd] - -## 1.10.0 - -### Fixes -- stack backtrace: fix alignment and skipping [66915d6] -- fix typo in documentation [8f97b93] - -## 1.9.0 - -### Features -- Option to print output into report, when tests have passed [0545415] - -### Fixes -- Fixed typos in comments [0ecbc58] -- gofmt code [a7f8bfb] -- Simplify code [7454d00] -- Simplify concatenation, incrementation and function assignment [4825557] -- Avoid unnecessary conversions [9d9403c] -- JUnit: include more detailed information about panic [19cca4b] -- Print help to stdout when the user asks for help [4cb7441] - - -## 1.8.0 - -### New Features -- allow config of the vet flag for `go test` (#562) [3cd45fa] -- Support projects using go modules [d56ee76] - -### Fixes and Minor Improvements -- chore(godoc): fixes typos in Measurement funcs [dbaca8e] -- Optimize focus to avoid allocations [f493786] -- Ensure generated test file names are underscored [505cc35] - -## 1.7.0 - -### New Features -- Add JustAfterEach (#484) [0d4f080] - -### Fixes -- Correctly round suite time in junit reporter [2445fc1] -- Avoid using -i argument to go test for Golang 1.10+ [46bbc26] - -## 1.6.0 - -### New Features -- add --debug flag to emit node output to files (#499) [39febac] - -### Fixes -- fix: for `go vet` to pass [69338ec] -- docs: fix for contributing instructions [7004cb1] -- consolidate and streamline contribution docs (#494) [d848015] -- Make generated Junit file compatable with "Maven Surefire" (#488) [e51bee6] -- all: gofmt [000d317] -- Increase eventually timeout to 30s [c73579c] -- Clarify asynchronous test behaviour [294d8f4] -- Travis badge should only show master [26d2143] - -## 1.5.0 5/10/2018 - -### New Features -- Supports go v1.10 (#443, #446, #451) [e873237, 468e89e, e37dbfe, a37f4c0, c0b857d, bca5260, 4177ca8] -- Add a When() synonym for Context() (#386) [747514b, 7484dad, 7354a07, dd826c8] -- Re-add noisySkippings flag [652e15c] -- Allow coverage to be displayed for focused specs (#367) [11459a8] -- Handle -outputdir flag (#364) [228e3a8] -- Handle -coverprofile flag (#355) [43392d5] - -### Fixes -- When using custom reporters register the custom reporters *before* the default reporter. This allows users to see the output of any print statements in their customer reporters. (#365) [8382b23] -- When running a test and calculating the coverage using the `-coverprofile` and `-outputdir` flags, Ginkgo fails with an error if the directory does not exist. This is due to an [issue in go 1.10](https://github.com/golang/go/issues/24588) (#446) [b36a6e0] -- `unfocus` command ignores vendor folder (#459) [e5e551c, c556e43, a3b6351, 9a820dd] -- Ignore packages whose tests are all ignored by go (#456) [7430ca7, 6d8be98] -- Increase the threshold when checking time measuments (#455) [2f714bf, 68f622c] -- Fix race condition in coverage tests (#423) [a5a8ff7, ab9c08b] -- Add an extra new line after reporting spec run completion for test2json [874520d] -- added name name field to junit reported testsuite [ae61c63] -- Do not set the run time of a spec when the dryRun flag is used (#438) [457e2d9, ba8e856] -- Process FWhen and FSpecify when unfocusing (#434) [9008c7b, ee65bd, df87dfe] -- Synchronise the access to the state of specs to avoid race conditions (#430) [7d481bc, ae6829d] -- Added Duration on GinkgoTestDescription (#383) [5f49dad, 528417e, 0747408, 329d7ed] -- Fix Ginkgo stack trace on failure for Specify (#415) [b977ede, 65ca40e, 6c46eb8] -- Update README with Go 1.6+, Golang -> Go (#409) [17f6b97, bc14b66, 20d1598] -- Use fmt.Errorf instead of errors.New(fmt.Sprintf (#401) [a299f56, 44e2eaa] -- Imports in generated code should follow conventions (#398) [0bec0b0, e8536d8] -- Prevent data race error when Recording a benchmark value from multiple go routines (#390) [c0c4881, 7a241e9] -- Replace GOPATH in Environment [4b883f0] - - -## 1.4.0 7/16/2017 - -- `ginkgo` now provides a hint if you accidentally forget to run `ginkgo bootstrap` to generate a `*_suite_test.go` file that actually invokes the Ginkgo test runner. [#345](https://github.com/onsi/ginkgo/pull/345) -- thanks to improvements in `go test -c` `ginkgo` no longer needs to fix Go's compilation output to ensure compilation errors are expressed relative to the CWD. [#357] -- `ginkgo watch -watchRegExp=...` allows you to specify a custom regular expression to watch. Only files matching the regular expression are watched for changes (the default is `\.go$`) [#356] -- `ginkgo` now always emits compilation output. Previously, only failed compilation output was printed out. [#277] -- `ginkgo -requireSuite` now fails the test run if there are `*_test.go` files but `go test` fails to detect any tests. Typically this means you forgot to run `ginkgo bootstrap` to generate a suite file. [#344] -- `ginkgo -timeout=DURATION` allows you to adjust the timeout for the entire test suite (default is 24 hours) [#248] - -## 1.3.0 3/28/2017 - -Improvements: - -- Significantly improved parallel test distribution. Now instead of pre-sharding test cases across workers (which can result in idle workers and poor test performance) Ginkgo uses a shared queue to keep all workers busy until all tests are complete. This improves test-time performance and consistency. -- `Skip(message)` can be used to skip the current test. -- Added `extensions/table` - a Ginkgo DSL for [Table Driven Tests](http://onsi.github.io/ginkgo/#table-driven-tests) -- Add `GinkgoRandomSeed()` - shorthand for `config.GinkgoConfig.RandomSeed` -- Support for retrying flaky tests with `--flakeAttempts` -- `ginkgo ./...` now recurses as you'd expect -- Added `Specify` a synonym for `It` -- Support colorise on Windows -- Broader support for various go compilation flags in the `ginkgo` CLI - -Bug Fixes: - -- Ginkgo tests now fail when you `panic(nil)` (#167) - -## 1.2.0 5/31/2015 - -Improvements - -- `ginkgo -coverpkg` calls down to `go test -coverpkg` (#160) -- `ginkgo -afterSuiteHook COMMAND` invokes the passed-in `COMMAND` after a test suite completes (#152) -- Relaxed requirement for Go 1.4+. `ginkgo` now works with Go v1.3+ (#166) - -## 1.2.0-beta - -Ginkgo now requires Go 1.4+ - -Improvements: - -- Call reporters in reverse order when announcing spec completion -- allows custom reporters to emit output before the default reporter does. -- Improved focus behavior. Now, this: - - ```golang - FDescribe("Some describe", func() { - It("A", func() {}) - - FIt("B", func() {}) - }) - ``` - - will run `B` but *not* `A`. This tends to be a common usage pattern when in the thick of writing and debugging tests. -- When `SIGINT` is received, Ginkgo will emit the contents of the `GinkgoWriter` before running the `AfterSuite`. Useful for debugging stuck tests. -- When `--progress` is set, Ginkgo will write test progress (in particular, Ginkgo will say when it is about to run a BeforeEach, AfterEach, It, etc...) to the `GinkgoWriter`. This is useful for debugging stuck tests and tests that generate many logs. -- Improved output when an error occurs in a setup or teardown block. -- When `--dryRun` is set, Ginkgo will walk the spec tree and emit to its reporter *without* actually running anything. Best paired with `-v` to understand which specs will run in which order. -- Add `By` to help document long `It`s. `By` simply writes to the `GinkgoWriter`. -- Add support for precompiled tests: - - `ginkgo build ` will now compile the package, producing a file named `package.test` - - The compiled `package.test` file can be run directly. This runs the tests in series. - - To run precompiled tests in parallel, you can run: `ginkgo -p package.test` -- Support `bootstrap`ping and `generate`ing [Agouti](http://agouti.org) specs. -- `ginkgo generate` and `ginkgo bootstrap` now honor the package name already defined in a given directory -- The `ginkgo` CLI ignores `SIGQUIT`. Prevents its stack dump from interlacing with the underlying test suite's stack dump. -- The `ginkgo` CLI now compiles tests into a temporary directory instead of the package directory. This necessitates upgrading to Go v1.4+. -- `ginkgo -notify` now works on Linux - -Bug Fixes: - -- If --skipPackages is used and all packages are skipped, Ginkgo should exit 0. -- Fix tempfile leak when running in parallel -- Fix incorrect failure message when a panic occurs during a parallel test run -- Fixed an issue where a pending test within a focused context (or a focused test within a pending context) would skip all other tests. -- Be more consistent about handling SIGTERM as well as SIGINT -- When interupted while concurrently compiling test suites in the background, Ginkgo now cleans up the compiled artifacts. -- Fixed a long standing bug where `ginkgo -p` would hang if a process spawned by one of the Ginkgo parallel nodes does not exit. (Hooray!) - -## 1.1.0 (8/2/2014) - -No changes, just dropping the beta. - -## 1.1.0-beta (7/22/2014) -New Features: - -- `ginkgo watch` now monitors packages *and their dependencies* for changes. The depth of the dependency tree can be modified with the `-depth` flag. -- Test suites with a programmatic focus (`FIt`, `FDescribe`, etc...) exit with non-zero status code, even when they pass. This allows CI systems to detect accidental commits of focused test suites. -- `ginkgo -p` runs the testsuite in parallel with an auto-detected number of nodes. -- `ginkgo -tags=TAG_LIST` passes a list of tags down to the `go build` command. -- `ginkgo --failFast` aborts the test suite after the first failure. -- `ginkgo generate file_1 file_2` can take multiple file arguments. -- Ginkgo now summarizes any spec failures that occured at the end of the test run. -- `ginkgo --randomizeSuites` will run tests *suites* in random order using the generated/passed-in seed. - -Improvements: - -- `ginkgo -skipPackage` now takes a comma-separated list of strings. If the *relative path* to a package matches one of the entries in the comma-separated list, that package is skipped. -- `ginkgo --untilItFails` no longer recompiles between attempts. -- Ginkgo now panics when a runnable node (`It`, `BeforeEach`, `JustBeforeEach`, `AfterEach`, `Measure`) is nested within another runnable node. This is always a mistake. Any test suites that panic because of this change should be fixed. - -Bug Fixes: - -- `ginkgo boostrap` and `ginkgo generate` no longer fail when dealing with `hyphen-separated-packages`. -- parallel specs are now better distributed across nodes - fixed a crashing bug where (for example) distributing 11 tests across 7 nodes would panic - -## 1.0.0 (5/24/2014) -New Features: - -- Add `GinkgoParallelNode()` - shorthand for `config.GinkgoConfig.ParallelNode` - -Improvements: - -- When compilation fails, the compilation output is rewritten to present a correct *relative* path. Allows ⌘-clicking in iTerm open the file in your text editor. -- `--untilItFails` and `ginkgo watch` now generate new random seeds between test runs, unless a particular random seed is specified. - -Bug Fixes: - -- `-cover` now generates a correctly combined coverprofile when running with in parallel with multiple `-node`s. -- Print out the contents of the `GinkgoWriter` when `BeforeSuite` or `AfterSuite` fail. -- Fix all remaining race conditions in Ginkgo's test suite. - -## 1.0.0-beta (4/14/2014) -Breaking changes: - -- `thirdparty/gomocktestreporter` is gone. Use `GinkgoT()` instead -- Modified the Reporter interface -- `watch` is now a subcommand, not a flag. - -DSL changes: - -- `BeforeSuite` and `AfterSuite` for setting up and tearing down test suites. -- `AfterSuite` is triggered on interrupt (`^C`) as well as exit. -- `SynchronizedBeforeSuite` and `SynchronizedAfterSuite` for setting up and tearing down singleton resources across parallel nodes. - -CLI changes: - -- `watch` is now a subcommand, not a flag -- `--nodot` flag can be passed to `ginkgo generate` and `ginkgo bootstrap` to avoid dot imports. This explicitly imports all exported identifiers in Ginkgo and Gomega. Refreshing this list can be done by running `ginkgo nodot` -- Additional arguments can be passed to specs. Pass them after the `--` separator -- `--skipPackage` flag takes a regexp and ignores any packages with package names passing said regexp. -- `--trace` flag prints out full stack traces when errors occur, not just the line at which the error occurs. - -Misc: - -- Start using semantic versioning -- Start maintaining changelog - -Major refactor: - -- Pull out Ginkgo's internal to `internal` -- Rename `example` everywhere to `spec` -- Much more! diff --git a/vendor/github.com/onsi/ginkgo/CONTRIBUTING.md b/vendor/github.com/onsi/ginkgo/CONTRIBUTING.md deleted file mode 100644 index 908b95c2c..000000000 --- a/vendor/github.com/onsi/ginkgo/CONTRIBUTING.md +++ /dev/null @@ -1,33 +0,0 @@ -# Contributing to Ginkgo - -Your contributions to Ginkgo are essential for its long-term maintenance and improvement. - -- Please **open an issue first** - describe what problem you are trying to solve and give the community a forum for input and feedback ahead of investing time in writing code! -- Ensure adequate test coverage: - - When adding to the Ginkgo library, add unit and/or integration tests (under the `integration` folder). - - When adding to the Ginkgo CLI, note that there are very few unit tests. Please add an integration test. -- Update the documentation. Ginko uses `godoc` comments and documentation on the `gh-pages` branch. - If relevant, please submit a docs PR to that branch alongside your code PR. - -Thanks for supporting Ginkgo! - -## Setup - -Fork the repo, then: - -``` -go get github.com/onsi/ginkgo -go get github.com/onsi/gomega/... -cd $GOPATH/src/github.com/onsi/ginkgo -git remote add fork git@github.com:/ginkgo.git - -ginkgo -r -p # ensure tests are green -go vet ./... # ensure linter is happy -``` - -## Making the PR - - go to a new branch `git checkout -b my-feature` - - make your changes - - run tests and linter again (see above) - - `git push fork` - - open PR 🎉 diff --git a/vendor/github.com/onsi/ginkgo/LICENSE b/vendor/github.com/onsi/ginkgo/LICENSE deleted file mode 100644 index 9415ee72c..000000000 --- a/vendor/github.com/onsi/ginkgo/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2013-2014 Onsi Fakhouri - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/onsi/ginkgo/README.md b/vendor/github.com/onsi/ginkgo/README.md deleted file mode 100644 index cdf8d054a..000000000 --- a/vendor/github.com/onsi/ginkgo/README.md +++ /dev/null @@ -1,121 +0,0 @@ -![Ginkgo: A Go BDD Testing Framework](http://onsi.github.io/ginkgo/images/ginkgo.png) - -[![Build Status](https://travis-ci.org/onsi/ginkgo.svg?branch=master)](https://travis-ci.org/onsi/ginkgo) - -Jump to the [docs](http://onsi.github.io/ginkgo/) to learn more. To start rolling your Ginkgo tests *now* [keep reading](#set-me-up)! - -If you have a question, comment, bug report, feature request, etc. please open a GitHub issue. - -## Feature List - -- Ginkgo uses Go's `testing` package and can live alongside your existing `testing` tests. It's easy to [bootstrap](http://onsi.github.io/ginkgo/#bootstrapping-a-suite) and start writing your [first tests](http://onsi.github.io/ginkgo/#adding-specs-to-a-suite) - -- Structure your BDD-style tests expressively: - - Nestable [`Describe`, `Context` and `When` container blocks](http://onsi.github.io/ginkgo/#organizing-specs-with-containers-describe-and-context) - - [`BeforeEach` and `AfterEach` blocks](http://onsi.github.io/ginkgo/#extracting-common-setup-beforeeach) for setup and teardown - - [`It` and `Specify` blocks](http://onsi.github.io/ginkgo/#individual-specs-) that hold your assertions - - [`JustBeforeEach` blocks](http://onsi.github.io/ginkgo/#separating-creation-and-configuration-justbeforeeach) that separate creation from configuration (also known as the subject action pattern). - - [`BeforeSuite` and `AfterSuite` blocks](http://onsi.github.io/ginkgo/#global-setup-and-teardown-beforesuite-and-aftersuite) to prep for and cleanup after a suite. - -- A comprehensive test runner that lets you: - - Mark specs as [pending](http://onsi.github.io/ginkgo/#pending-specs) - - [Focus](http://onsi.github.io/ginkgo/#focused-specs) individual specs, and groups of specs, either programmatically or on the command line - - Run your tests in [random order](http://onsi.github.io/ginkgo/#spec-permutation), and then reuse random seeds to replicate the same order. - - Break up your test suite into parallel processes for straightforward [test parallelization](http://onsi.github.io/ginkgo/#parallel-specs) - -- `ginkgo`: a command line interface with plenty of handy command line arguments for [running your tests](http://onsi.github.io/ginkgo/#running-tests) and [generating](http://onsi.github.io/ginkgo/#generators) test files. Here are a few choice examples: - - `ginkgo -nodes=N` runs your tests in `N` parallel processes and print out coherent output in realtime - - `ginkgo -cover` runs your tests using Go's code coverage tool - - `ginkgo convert` converts an XUnit-style `testing` package to a Ginkgo-style package - - `ginkgo -focus="REGEXP"` and `ginkgo -skip="REGEXP"` allow you to specify a subset of tests to run via regular expression - - `ginkgo -r` runs all tests suites under the current directory - - `ginkgo -v` prints out identifying information for each tests just before it runs - - And much more: run `ginkgo help` for details! - - The `ginkgo` CLI is convenient, but purely optional -- Ginkgo works just fine with `go test` - -- `ginkgo watch` [watches](https://onsi.github.io/ginkgo/#watching-for-changes) packages *and their dependencies* for changes, then reruns tests. Run tests immediately as you develop! - -- Built-in support for testing [asynchronicity](http://onsi.github.io/ginkgo/#asynchronous-tests) - -- Built-in support for [benchmarking](http://onsi.github.io/ginkgo/#benchmark-tests) your code. Control the number of benchmark samples as you gather runtimes and other, arbitrary, bits of numerical information about your code. - -- [Completions for Sublime Text](https://github.com/onsi/ginkgo-sublime-completions): just use [Package Control](https://sublime.wbond.net/) to install `Ginkgo Completions`. - -- [Completions for VSCode](https://github.com/onsi/vscode-ginkgo): just use VSCode's extension installer to install `vscode-ginkgo`. - -- Straightforward support for third-party testing libraries such as [Gomock](https://code.google.com/p/gomock/) and [Testify](https://github.com/stretchr/testify). Check out the [docs](http://onsi.github.io/ginkgo/#third-party-integrations) for details. - -- A modular architecture that lets you easily: - - Write [custom reporters](http://onsi.github.io/ginkgo/#writing-custom-reporters) (for example, Ginkgo comes with a [JUnit XML reporter](http://onsi.github.io/ginkgo/#generating-junit-xml-output) and a TeamCity reporter). - - [Adapt an existing matcher library (or write your own!)](http://onsi.github.io/ginkgo/#using-other-matcher-libraries) to work with Ginkgo - -## [Gomega](http://github.com/onsi/gomega): Ginkgo's Preferred Matcher Library - -Ginkgo is best paired with Gomega. Learn more about Gomega [here](http://onsi.github.io/gomega/) - -## [Agouti](http://github.com/sclevine/agouti): A Go Acceptance Testing Framework - -Agouti allows you run WebDriver integration tests. Learn more about Agouti [here](http://agouti.org) - -## Set Me Up! - -You'll need the Go command-line tools. Ginkgo is tested with Go 1.6+, but preferably you should get the latest. Follow the [installation instructions](https://golang.org/doc/install) if you don't have it installed. - -```bash - -go get -u github.com/onsi/ginkgo/ginkgo # installs the ginkgo CLI -go get -u github.com/onsi/gomega/... # fetches the matcher library - -cd path/to/package/you/want/to/test - -ginkgo bootstrap # set up a new ginkgo suite -ginkgo generate # will create a sample test file. edit this file and add your tests then... - -go test # to run your tests - -ginkgo # also runs your tests - -``` - -## I'm new to Go: What are my testing options? - -Of course, I heartily recommend [Ginkgo](https://github.com/onsi/ginkgo) and [Gomega](https://github.com/onsi/gomega). Both packages are seeing heavy, daily, production use on a number of projects and boast a mature and comprehensive feature-set. - -With that said, it's great to know what your options are :) - -### What Go gives you out of the box - -Testing is a first class citizen in Go, however Go's built-in testing primitives are somewhat limited: The [testing](http://golang.org/pkg/testing) package provides basic XUnit style tests and no assertion library. - -### Matcher libraries for Go's XUnit style tests - -A number of matcher libraries have been written to augment Go's built-in XUnit style tests. Here are two that have gained traction: - -- [testify](https://github.com/stretchr/testify) -- [gocheck](http://labix.org/gocheck) - -You can also use Ginkgo's matcher library [Gomega](https://github.com/onsi/gomega) in [XUnit style tests](http://onsi.github.io/gomega/#using-gomega-with-golangs-xunitstyle-tests) - -### BDD style testing frameworks - -There are a handful of BDD-style testing frameworks written for Go. Here are a few: - -- [Ginkgo](https://github.com/onsi/ginkgo) ;) -- [GoConvey](https://github.com/smartystreets/goconvey) -- [Goblin](https://github.com/franela/goblin) -- [Mao](https://github.com/azer/mao) -- [Zen](https://github.com/pranavraja/zen) - -Finally, @shageman has [put together](https://github.com/shageman/gotestit) a comprehensive comparison of Go testing libraries. - -Go explore! - -## License - -Ginkgo is MIT-Licensed - -## Contributing - -See [CONTRIBUTING.md](CONTRIBUTING.md) diff --git a/vendor/github.com/onsi/ginkgo/RELEASING.md b/vendor/github.com/onsi/ginkgo/RELEASING.md deleted file mode 100644 index 1e298c2da..000000000 --- a/vendor/github.com/onsi/ginkgo/RELEASING.md +++ /dev/null @@ -1,14 +0,0 @@ -A Ginkgo release is a tagged git sha and a GitHub release. To cut a release: - -1. Ensure CHANGELOG.md is up to date. - - Use `git log --pretty=format:'- %s [%h]' HEAD...vX.X.X` to list all the commits since the last release - - Categorize the changes into - - Breaking Changes (requires a major version) - - New Features (minor version) - - Fixes (fix version) - - Maintenance (which in general should not be mentioned in `CHANGELOG.md` as they have no user impact) -1. Update `VERSION` in `config/config.go` -1. Create a commit with the version number as the commit message (e.g. `v1.3.0`) -1. Tag the commit with the version number as the tag name (e.g. `v1.3.0`) -1. Push the commit and tag to GitHub -1. Create a new [GitHub release](https://help.github.com/articles/creating-releases/) with the version number as the tag (e.g. `v1.3.0`). List the key changes in the release notes. diff --git a/vendor/github.com/onsi/ginkgo/config/config.go b/vendor/github.com/onsi/ginkgo/config/config.go deleted file mode 100644 index 89ec2b29a..000000000 --- a/vendor/github.com/onsi/ginkgo/config/config.go +++ /dev/null @@ -1,213 +0,0 @@ -/* -Ginkgo accepts a number of configuration options. - -These are documented [here](http://onsi.github.io/ginkgo/#the_ginkgo_cli) - -You can also learn more via - - ginkgo help - -or (I kid you not): - - go test -asdf -*/ -package config - -import ( - "flag" - "time" - - "fmt" -) - -const VERSION = "1.10.3" - -type GinkgoConfigType struct { - RandomSeed int64 - RandomizeAllSpecs bool - RegexScansFilePath bool - FocusString string - SkipString string - SkipMeasurements bool - FailOnPending bool - FailFast bool - FlakeAttempts int - EmitSpecProgress bool - DryRun bool - DebugParallel bool - - ParallelNode int - ParallelTotal int - SyncHost string - StreamHost string -} - -var GinkgoConfig = GinkgoConfigType{} - -type DefaultReporterConfigType struct { - NoColor bool - SlowSpecThreshold float64 - NoisyPendings bool - NoisySkippings bool - Succinct bool - Verbose bool - FullTrace bool - ReportPassed bool - ReportFile string -} - -var DefaultReporterConfig = DefaultReporterConfigType{} - -func processPrefix(prefix string) string { - if prefix != "" { - prefix += "." - } - return prefix -} - -func Flags(flagSet *flag.FlagSet, prefix string, includeParallelFlags bool) { - prefix = processPrefix(prefix) - flagSet.Int64Var(&(GinkgoConfig.RandomSeed), prefix+"seed", time.Now().Unix(), "The seed used to randomize the spec suite.") - flagSet.BoolVar(&(GinkgoConfig.RandomizeAllSpecs), prefix+"randomizeAllSpecs", false, "If set, ginkgo will randomize all specs together. By default, ginkgo only randomizes the top level Describe, Context and When groups.") - flagSet.BoolVar(&(GinkgoConfig.SkipMeasurements), prefix+"skipMeasurements", false, "If set, ginkgo will skip any measurement specs.") - flagSet.BoolVar(&(GinkgoConfig.FailOnPending), prefix+"failOnPending", false, "If set, ginkgo will mark the test suite as failed if any specs are pending.") - flagSet.BoolVar(&(GinkgoConfig.FailFast), prefix+"failFast", false, "If set, ginkgo will stop running a test suite after a failure occurs.") - - flagSet.BoolVar(&(GinkgoConfig.DryRun), prefix+"dryRun", false, "If set, ginkgo will walk the test hierarchy without actually running anything. Best paired with -v.") - - flagSet.StringVar(&(GinkgoConfig.FocusString), prefix+"focus", "", "If set, ginkgo will only run specs that match this regular expression.") - flagSet.StringVar(&(GinkgoConfig.SkipString), prefix+"skip", "", "If set, ginkgo will only run specs that do not match this regular expression.") - - flagSet.BoolVar(&(GinkgoConfig.RegexScansFilePath), prefix+"regexScansFilePath", false, "If set, ginkgo regex matching also will look at the file path (code location).") - - flagSet.IntVar(&(GinkgoConfig.FlakeAttempts), prefix+"flakeAttempts", 1, "Make up to this many attempts to run each spec. Please note that if any of the attempts succeed, the suite will not be failed. But any failures will still be recorded.") - - flagSet.BoolVar(&(GinkgoConfig.EmitSpecProgress), prefix+"progress", false, "If set, ginkgo will emit progress information as each spec runs to the GinkgoWriter.") - - flagSet.BoolVar(&(GinkgoConfig.DebugParallel), prefix+"debug", false, "If set, ginkgo will emit node output to files when running in parallel.") - - if includeParallelFlags { - flagSet.IntVar(&(GinkgoConfig.ParallelNode), prefix+"parallel.node", 1, "This worker node's (one-indexed) node number. For running specs in parallel.") - flagSet.IntVar(&(GinkgoConfig.ParallelTotal), prefix+"parallel.total", 1, "The total number of worker nodes. For running specs in parallel.") - flagSet.StringVar(&(GinkgoConfig.SyncHost), prefix+"parallel.synchost", "", "The address for the server that will synchronize the running nodes.") - flagSet.StringVar(&(GinkgoConfig.StreamHost), prefix+"parallel.streamhost", "", "The address for the server that the running nodes should stream data to.") - } - - flagSet.BoolVar(&(DefaultReporterConfig.NoColor), prefix+"noColor", false, "If set, suppress color output in default reporter.") - flagSet.Float64Var(&(DefaultReporterConfig.SlowSpecThreshold), prefix+"slowSpecThreshold", 5.0, "(in seconds) Specs that take longer to run than this threshold are flagged as slow by the default reporter.") - flagSet.BoolVar(&(DefaultReporterConfig.NoisyPendings), prefix+"noisyPendings", true, "If set, default reporter will shout about pending tests.") - flagSet.BoolVar(&(DefaultReporterConfig.NoisySkippings), prefix+"noisySkippings", true, "If set, default reporter will shout about skipping tests.") - flagSet.BoolVar(&(DefaultReporterConfig.Verbose), prefix+"v", false, "If set, default reporter print out all specs as they begin.") - flagSet.BoolVar(&(DefaultReporterConfig.Succinct), prefix+"succinct", false, "If set, default reporter prints out a very succinct report") - flagSet.BoolVar(&(DefaultReporterConfig.FullTrace), prefix+"trace", false, "If set, default reporter prints out the full stack trace when a failure occurs") - flagSet.BoolVar(&(DefaultReporterConfig.ReportPassed), prefix+"reportPassed", false, "If set, default reporter prints out captured output of passed tests.") - flagSet.StringVar(&(DefaultReporterConfig.ReportFile), prefix+"reportFile", "", "Override the default reporter output file path.") - -} - -func BuildFlagArgs(prefix string, ginkgo GinkgoConfigType, reporter DefaultReporterConfigType) []string { - prefix = processPrefix(prefix) - result := make([]string, 0) - - if ginkgo.RandomSeed > 0 { - result = append(result, fmt.Sprintf("--%sseed=%d", prefix, ginkgo.RandomSeed)) - } - - if ginkgo.RandomizeAllSpecs { - result = append(result, fmt.Sprintf("--%srandomizeAllSpecs", prefix)) - } - - if ginkgo.SkipMeasurements { - result = append(result, fmt.Sprintf("--%sskipMeasurements", prefix)) - } - - if ginkgo.FailOnPending { - result = append(result, fmt.Sprintf("--%sfailOnPending", prefix)) - } - - if ginkgo.FailFast { - result = append(result, fmt.Sprintf("--%sfailFast", prefix)) - } - - if ginkgo.DryRun { - result = append(result, fmt.Sprintf("--%sdryRun", prefix)) - } - - if ginkgo.FocusString != "" { - result = append(result, fmt.Sprintf("--%sfocus=%s", prefix, ginkgo.FocusString)) - } - - if ginkgo.SkipString != "" { - result = append(result, fmt.Sprintf("--%sskip=%s", prefix, ginkgo.SkipString)) - } - - if ginkgo.FlakeAttempts > 1 { - result = append(result, fmt.Sprintf("--%sflakeAttempts=%d", prefix, ginkgo.FlakeAttempts)) - } - - if ginkgo.EmitSpecProgress { - result = append(result, fmt.Sprintf("--%sprogress", prefix)) - } - - if ginkgo.DebugParallel { - result = append(result, fmt.Sprintf("--%sdebug", prefix)) - } - - if ginkgo.ParallelNode != 0 { - result = append(result, fmt.Sprintf("--%sparallel.node=%d", prefix, ginkgo.ParallelNode)) - } - - if ginkgo.ParallelTotal != 0 { - result = append(result, fmt.Sprintf("--%sparallel.total=%d", prefix, ginkgo.ParallelTotal)) - } - - if ginkgo.StreamHost != "" { - result = append(result, fmt.Sprintf("--%sparallel.streamhost=%s", prefix, ginkgo.StreamHost)) - } - - if ginkgo.SyncHost != "" { - result = append(result, fmt.Sprintf("--%sparallel.synchost=%s", prefix, ginkgo.SyncHost)) - } - - if ginkgo.RegexScansFilePath { - result = append(result, fmt.Sprintf("--%sregexScansFilePath", prefix)) - } - - if reporter.NoColor { - result = append(result, fmt.Sprintf("--%snoColor", prefix)) - } - - if reporter.SlowSpecThreshold > 0 { - result = append(result, fmt.Sprintf("--%sslowSpecThreshold=%.5f", prefix, reporter.SlowSpecThreshold)) - } - - if !reporter.NoisyPendings { - result = append(result, fmt.Sprintf("--%snoisyPendings=false", prefix)) - } - - if !reporter.NoisySkippings { - result = append(result, fmt.Sprintf("--%snoisySkippings=false", prefix)) - } - - if reporter.Verbose { - result = append(result, fmt.Sprintf("--%sv", prefix)) - } - - if reporter.Succinct { - result = append(result, fmt.Sprintf("--%ssuccinct", prefix)) - } - - if reporter.FullTrace { - result = append(result, fmt.Sprintf("--%strace", prefix)) - } - - if reporter.ReportPassed { - result = append(result, fmt.Sprintf("--%sreportPassed", prefix)) - } - - if reporter.ReportFile != "" { - result = append(result, fmt.Sprintf("--%sreportFile=%s", prefix, reporter.ReportFile)) - } - - return result -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo_dsl.go b/vendor/github.com/onsi/ginkgo/ginkgo_dsl.go deleted file mode 100644 index 3cbf89a35..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo_dsl.go +++ /dev/null @@ -1,624 +0,0 @@ -/* -Ginkgo is a BDD-style testing framework for Golang - -The godoc documentation describes Ginkgo's API. More comprehensive documentation (with examples!) is available at http://onsi.github.io/ginkgo/ - -Ginkgo's preferred matcher library is [Gomega](http://github.com/onsi/gomega) - -Ginkgo on Github: http://github.com/onsi/ginkgo - -Ginkgo is MIT-Licensed -*/ -package ginkgo - -import ( - "flag" - "fmt" - "io" - "net/http" - "os" - "strings" - "time" - - "github.com/onsi/ginkgo/config" - "github.com/onsi/ginkgo/internal/codelocation" - "github.com/onsi/ginkgo/internal/failer" - "github.com/onsi/ginkgo/internal/remote" - "github.com/onsi/ginkgo/internal/suite" - "github.com/onsi/ginkgo/internal/testingtproxy" - "github.com/onsi/ginkgo/internal/writer" - "github.com/onsi/ginkgo/reporters" - "github.com/onsi/ginkgo/reporters/stenographer" - colorable "github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable" - "github.com/onsi/ginkgo/types" -) - -const GINKGO_VERSION = config.VERSION -const GINKGO_PANIC = ` -Your test failed. -Ginkgo panics to prevent subsequent assertions from running. -Normally Ginkgo rescues this panic so you shouldn't see it. - -But, if you make an assertion in a goroutine, Ginkgo can't capture the panic. -To circumvent this, you should call - - defer GinkgoRecover() - -at the top of the goroutine that caused this panic. -` -const defaultTimeout = 1 - -var globalSuite *suite.Suite -var globalFailer *failer.Failer - -func init() { - config.Flags(flag.CommandLine, "ginkgo", true) - GinkgoWriter = writer.New(os.Stdout) - globalFailer = failer.New() - globalSuite = suite.New(globalFailer) -} - -//GinkgoWriter implements an io.Writer -//When running in verbose mode any writes to GinkgoWriter will be immediately printed -//to stdout. Otherwise, GinkgoWriter will buffer any writes produced during the current test and flush them to screen -//only if the current test fails. -var GinkgoWriter io.Writer - -//The interface by which Ginkgo receives *testing.T -type GinkgoTestingT interface { - Fail() -} - -//GinkgoRandomSeed returns the seed used to randomize spec execution order. It is -//useful for seeding your own pseudorandom number generators (PRNGs) to ensure -//consistent executions from run to run, where your tests contain variability (for -//example, when selecting random test data). -func GinkgoRandomSeed() int64 { - return config.GinkgoConfig.RandomSeed -} - -//GinkgoParallelNode returns the parallel node number for the current ginkgo process -//The node number is 1-indexed -func GinkgoParallelNode() int { - return config.GinkgoConfig.ParallelNode -} - -//Some matcher libraries or legacy codebases require a *testing.T -//GinkgoT implements an interface analogous to *testing.T and can be used if -//the library in question accepts *testing.T through an interface -// -// For example, with testify: -// assert.Equal(GinkgoT(), 123, 123, "they should be equal") -// -// Or with gomock: -// gomock.NewController(GinkgoT()) -// -// GinkgoT() takes an optional offset argument that can be used to get the -// correct line number associated with the failure. -func GinkgoT(optionalOffset ...int) GinkgoTInterface { - offset := 3 - if len(optionalOffset) > 0 { - offset = optionalOffset[0] - } - return testingtproxy.New(GinkgoWriter, Fail, offset) -} - -//The interface returned by GinkgoT(). This covers most of the methods -//in the testing package's T. -type GinkgoTInterface interface { - Fail() - Error(args ...interface{}) - Errorf(format string, args ...interface{}) - FailNow() - Fatal(args ...interface{}) - Fatalf(format string, args ...interface{}) - Log(args ...interface{}) - Logf(format string, args ...interface{}) - Failed() bool - Parallel() - Skip(args ...interface{}) - Skipf(format string, args ...interface{}) - SkipNow() - Skipped() bool -} - -//Custom Ginkgo test reporters must implement the Reporter interface. -// -//The custom reporter is passed in a SuiteSummary when the suite begins and ends, -//and a SpecSummary just before a spec begins and just after a spec ends -type Reporter reporters.Reporter - -//Asynchronous specs are given a channel of the Done type. You must close or write to the channel -//to tell Ginkgo that your async test is done. -type Done chan<- interface{} - -//GinkgoTestDescription represents the information about the current running test returned by CurrentGinkgoTestDescription -// FullTestText: a concatenation of ComponentTexts and the TestText -// ComponentTexts: a list of all texts for the Describes & Contexts leading up to the current test -// TestText: the text in the actual It or Measure node -// IsMeasurement: true if the current test is a measurement -// FileName: the name of the file containing the current test -// LineNumber: the line number for the current test -// Failed: if the current test has failed, this will be true (useful in an AfterEach) -type GinkgoTestDescription struct { - FullTestText string - ComponentTexts []string - TestText string - - IsMeasurement bool - - FileName string - LineNumber int - - Failed bool - Duration time.Duration -} - -//CurrentGinkgoTestDescripton returns information about the current running test. -func CurrentGinkgoTestDescription() GinkgoTestDescription { - summary, ok := globalSuite.CurrentRunningSpecSummary() - if !ok { - return GinkgoTestDescription{} - } - - subjectCodeLocation := summary.ComponentCodeLocations[len(summary.ComponentCodeLocations)-1] - - return GinkgoTestDescription{ - ComponentTexts: summary.ComponentTexts[1:], - FullTestText: strings.Join(summary.ComponentTexts[1:], " "), - TestText: summary.ComponentTexts[len(summary.ComponentTexts)-1], - IsMeasurement: summary.IsMeasurement, - FileName: subjectCodeLocation.FileName, - LineNumber: subjectCodeLocation.LineNumber, - Failed: summary.HasFailureState(), - Duration: summary.RunTime, - } -} - -//Measurement tests receive a Benchmarker. -// -//You use the Time() function to time how long the passed in body function takes to run -//You use the RecordValue() function to track arbitrary numerical measurements. -//The RecordValueWithPrecision() function can be used alternatively to provide the unit -//and resolution of the numeric measurement. -//The optional info argument is passed to the test reporter and can be used to -// provide the measurement data to a custom reporter with context. -// -//See http://onsi.github.io/ginkgo/#benchmark_tests for more details -type Benchmarker interface { - Time(name string, body func(), info ...interface{}) (elapsedTime time.Duration) - RecordValue(name string, value float64, info ...interface{}) - RecordValueWithPrecision(name string, value float64, units string, precision int, info ...interface{}) -} - -//RunSpecs is the entry point for the Ginkgo test runner. -//You must call this within a Golang testing TestX(t *testing.T) function. -// -//To bootstrap a test suite you can use the Ginkgo CLI: -// -// ginkgo bootstrap -func RunSpecs(t GinkgoTestingT, description string) bool { - specReporters := []Reporter{buildDefaultReporter()} - if config.DefaultReporterConfig.ReportFile != "" { - reportFile := config.DefaultReporterConfig.ReportFile - specReporters[0] = reporters.NewJUnitReporter(reportFile) - return RunSpecsWithDefaultAndCustomReporters(t, description, specReporters) - } - return RunSpecsWithCustomReporters(t, description, specReporters) -} - -//To run your tests with Ginkgo's default reporter and your custom reporter(s), replace -//RunSpecs() with this method. -func RunSpecsWithDefaultAndCustomReporters(t GinkgoTestingT, description string, specReporters []Reporter) bool { - specReporters = append(specReporters, buildDefaultReporter()) - return RunSpecsWithCustomReporters(t, description, specReporters) -} - -//To run your tests with your custom reporter(s) (and *not* Ginkgo's default reporter), replace -//RunSpecs() with this method. Note that parallel tests will not work correctly without the default reporter -func RunSpecsWithCustomReporters(t GinkgoTestingT, description string, specReporters []Reporter) bool { - writer := GinkgoWriter.(*writer.Writer) - writer.SetStream(config.DefaultReporterConfig.Verbose) - reporters := make([]reporters.Reporter, len(specReporters)) - for i, reporter := range specReporters { - reporters[i] = reporter - } - passed, hasFocusedTests := globalSuite.Run(t, description, reporters, writer, config.GinkgoConfig) - if passed && hasFocusedTests && strings.TrimSpace(os.Getenv("GINKGO_EDITOR_INTEGRATION")) == "" { - fmt.Println("PASS | FOCUSED") - os.Exit(types.GINKGO_FOCUS_EXIT_CODE) - } - return passed -} - -func buildDefaultReporter() Reporter { - remoteReportingServer := config.GinkgoConfig.StreamHost - if remoteReportingServer == "" { - stenographer := stenographer.New(!config.DefaultReporterConfig.NoColor, config.GinkgoConfig.FlakeAttempts > 1, colorable.NewColorableStdout()) - return reporters.NewDefaultReporter(config.DefaultReporterConfig, stenographer) - } else { - debugFile := "" - if config.GinkgoConfig.DebugParallel { - debugFile = fmt.Sprintf("ginkgo-node-%d.log", config.GinkgoConfig.ParallelNode) - } - return remote.NewForwardingReporter(config.DefaultReporterConfig, remoteReportingServer, &http.Client{}, remote.NewOutputInterceptor(), GinkgoWriter.(*writer.Writer), debugFile) - } -} - -//Skip notifies Ginkgo that the current spec was skipped. -func Skip(message string, callerSkip ...int) { - skip := 0 - if len(callerSkip) > 0 { - skip = callerSkip[0] - } - - globalFailer.Skip(message, codelocation.New(skip+1)) - panic(GINKGO_PANIC) -} - -//Fail notifies Ginkgo that the current spec has failed. (Gomega will call Fail for you automatically when an assertion fails.) -func Fail(message string, callerSkip ...int) { - skip := 0 - if len(callerSkip) > 0 { - skip = callerSkip[0] - } - - globalFailer.Fail(message, codelocation.New(skip+1)) - panic(GINKGO_PANIC) -} - -//GinkgoRecover should be deferred at the top of any spawned goroutine that (may) call `Fail` -//Since Gomega assertions call fail, you should throw a `defer GinkgoRecover()` at the top of any goroutine that -//calls out to Gomega -// -//Here's why: Ginkgo's `Fail` method records the failure and then panics to prevent -//further assertions from running. This panic must be recovered. Ginkgo does this for you -//if the panic originates in a Ginkgo node (an It, BeforeEach, etc...) -// -//Unfortunately, if a panic originates on a goroutine *launched* from one of these nodes there's no -//way for Ginkgo to rescue the panic. To do this, you must remember to `defer GinkgoRecover()` at the top of such a goroutine. -func GinkgoRecover() { - e := recover() - if e != nil { - globalFailer.Panic(codelocation.New(1), e) - } -} - -//Describe blocks allow you to organize your specs. A Describe block can contain any number of -//BeforeEach, AfterEach, JustBeforeEach, It, and Measurement blocks. -// -//In addition you can nest Describe, Context and When blocks. Describe, Context and When blocks are functionally -//equivalent. The difference is purely semantic -- you typically Describe the behavior of an object -//or method and, within that Describe, outline a number of Contexts and Whens. -func Describe(text string, body func()) bool { - globalSuite.PushContainerNode(text, body, types.FlagTypeNone, codelocation.New(1)) - return true -} - -//You can focus the tests within a describe block using FDescribe -func FDescribe(text string, body func()) bool { - globalSuite.PushContainerNode(text, body, types.FlagTypeFocused, codelocation.New(1)) - return true -} - -//You can mark the tests within a describe block as pending using PDescribe -func PDescribe(text string, body func()) bool { - globalSuite.PushContainerNode(text, body, types.FlagTypePending, codelocation.New(1)) - return true -} - -//You can mark the tests within a describe block as pending using XDescribe -func XDescribe(text string, body func()) bool { - globalSuite.PushContainerNode(text, body, types.FlagTypePending, codelocation.New(1)) - return true -} - -//Context blocks allow you to organize your specs. A Context block can contain any number of -//BeforeEach, AfterEach, JustBeforeEach, It, and Measurement blocks. -// -//In addition you can nest Describe, Context and When blocks. Describe, Context and When blocks are functionally -//equivalent. The difference is purely semantic -- you typical Describe the behavior of an object -//or method and, within that Describe, outline a number of Contexts and Whens. -func Context(text string, body func()) bool { - globalSuite.PushContainerNode(text, body, types.FlagTypeNone, codelocation.New(1)) - return true -} - -//You can focus the tests within a describe block using FContext -func FContext(text string, body func()) bool { - globalSuite.PushContainerNode(text, body, types.FlagTypeFocused, codelocation.New(1)) - return true -} - -//You can mark the tests within a describe block as pending using PContext -func PContext(text string, body func()) bool { - globalSuite.PushContainerNode(text, body, types.FlagTypePending, codelocation.New(1)) - return true -} - -//You can mark the tests within a describe block as pending using XContext -func XContext(text string, body func()) bool { - globalSuite.PushContainerNode(text, body, types.FlagTypePending, codelocation.New(1)) - return true -} - -//When blocks allow you to organize your specs. A When block can contain any number of -//BeforeEach, AfterEach, JustBeforeEach, It, and Measurement blocks. -// -//In addition you can nest Describe, Context and When blocks. Describe, Context and When blocks are functionally -//equivalent. The difference is purely semantic -- you typical Describe the behavior of an object -//or method and, within that Describe, outline a number of Contexts and Whens. -func When(text string, body func()) bool { - globalSuite.PushContainerNode("when "+text, body, types.FlagTypeNone, codelocation.New(1)) - return true -} - -//You can focus the tests within a describe block using FWhen -func FWhen(text string, body func()) bool { - globalSuite.PushContainerNode("when "+text, body, types.FlagTypeFocused, codelocation.New(1)) - return true -} - -//You can mark the tests within a describe block as pending using PWhen -func PWhen(text string, body func()) bool { - globalSuite.PushContainerNode("when "+text, body, types.FlagTypePending, codelocation.New(1)) - return true -} - -//You can mark the tests within a describe block as pending using XWhen -func XWhen(text string, body func()) bool { - globalSuite.PushContainerNode("when "+text, body, types.FlagTypePending, codelocation.New(1)) - return true -} - -//It blocks contain your test code and assertions. You cannot nest any other Ginkgo blocks -//within an It block. -// -//Ginkgo will normally run It blocks synchronously. To perform asynchronous tests, pass a -//function that accepts a Done channel. When you do this, you can also provide an optional timeout. -func It(text string, body interface{}, timeout ...float64) bool { - globalSuite.PushItNode(text, body, types.FlagTypeNone, codelocation.New(1), parseTimeout(timeout...)) - return true -} - -//You can focus individual Its using FIt -func FIt(text string, body interface{}, timeout ...float64) bool { - globalSuite.PushItNode(text, body, types.FlagTypeFocused, codelocation.New(1), parseTimeout(timeout...)) - return true -} - -//You can mark Its as pending using PIt -func PIt(text string, _ ...interface{}) bool { - globalSuite.PushItNode(text, func() {}, types.FlagTypePending, codelocation.New(1), 0) - return true -} - -//You can mark Its as pending using XIt -func XIt(text string, _ ...interface{}) bool { - globalSuite.PushItNode(text, func() {}, types.FlagTypePending, codelocation.New(1), 0) - return true -} - -//Specify blocks are aliases for It blocks and allow for more natural wording in situations -//which "It" does not fit into a natural sentence flow. All the same protocols apply for Specify blocks -//which apply to It blocks. -func Specify(text string, body interface{}, timeout ...float64) bool { - globalSuite.PushItNode(text, body, types.FlagTypeNone, codelocation.New(1), parseTimeout(timeout...)) - return true -} - -//You can focus individual Specifys using FSpecify -func FSpecify(text string, body interface{}, timeout ...float64) bool { - globalSuite.PushItNode(text, body, types.FlagTypeFocused, codelocation.New(1), parseTimeout(timeout...)) - return true -} - -//You can mark Specifys as pending using PSpecify -func PSpecify(text string, is ...interface{}) bool { - globalSuite.PushItNode(text, func() {}, types.FlagTypePending, codelocation.New(1), 0) - return true -} - -//You can mark Specifys as pending using XSpecify -func XSpecify(text string, is ...interface{}) bool { - globalSuite.PushItNode(text, func() {}, types.FlagTypePending, codelocation.New(1), 0) - return true -} - -//By allows you to better document large Its. -// -//Generally you should try to keep your Its short and to the point. This is not always possible, however, -//especially in the context of integration tests that capture a particular workflow. -// -//By allows you to document such flows. By must be called within a runnable node (It, BeforeEach, Measure, etc...) -//By will simply log the passed in text to the GinkgoWriter. If By is handed a function it will immediately run the function. -func By(text string, callbacks ...func()) { - preamble := "\x1b[1mSTEP\x1b[0m" - if config.DefaultReporterConfig.NoColor { - preamble = "STEP" - } - fmt.Fprintln(GinkgoWriter, preamble+": "+text) - if len(callbacks) == 1 { - callbacks[0]() - } - if len(callbacks) > 1 { - panic("just one callback per By, please") - } -} - -//Measure blocks run the passed in body function repeatedly (determined by the samples argument) -//and accumulate metrics provided to the Benchmarker by the body function. -// -//The body function must have the signature: -// func(b Benchmarker) -func Measure(text string, body interface{}, samples int) bool { - globalSuite.PushMeasureNode(text, body, types.FlagTypeNone, codelocation.New(1), samples) - return true -} - -//You can focus individual Measures using FMeasure -func FMeasure(text string, body interface{}, samples int) bool { - globalSuite.PushMeasureNode(text, body, types.FlagTypeFocused, codelocation.New(1), samples) - return true -} - -//You can mark Measurements as pending using PMeasure -func PMeasure(text string, _ ...interface{}) bool { - globalSuite.PushMeasureNode(text, func(b Benchmarker) {}, types.FlagTypePending, codelocation.New(1), 0) - return true -} - -//You can mark Measurements as pending using XMeasure -func XMeasure(text string, _ ...interface{}) bool { - globalSuite.PushMeasureNode(text, func(b Benchmarker) {}, types.FlagTypePending, codelocation.New(1), 0) - return true -} - -//BeforeSuite blocks are run just once before any specs are run. When running in parallel, each -//parallel node process will call BeforeSuite. -// -//BeforeSuite blocks can be made asynchronous by providing a body function that accepts a Done channel -// -//You may only register *one* BeforeSuite handler per test suite. You typically do so in your bootstrap file at the top level. -func BeforeSuite(body interface{}, timeout ...float64) bool { - globalSuite.SetBeforeSuiteNode(body, codelocation.New(1), parseTimeout(timeout...)) - return true -} - -//AfterSuite blocks are *always* run after all the specs regardless of whether specs have passed or failed. -//Moreover, if Ginkgo receives an interrupt signal (^C) it will attempt to run the AfterSuite before exiting. -// -//When running in parallel, each parallel node process will call AfterSuite. -// -//AfterSuite blocks can be made asynchronous by providing a body function that accepts a Done channel -// -//You may only register *one* AfterSuite handler per test suite. You typically do so in your bootstrap file at the top level. -func AfterSuite(body interface{}, timeout ...float64) bool { - globalSuite.SetAfterSuiteNode(body, codelocation.New(1), parseTimeout(timeout...)) - return true -} - -//SynchronizedBeforeSuite blocks are primarily meant to solve the problem of setting up singleton external resources shared across -//nodes when running tests in parallel. For example, say you have a shared database that you can only start one instance of that -//must be used in your tests. When running in parallel, only one node should set up the database and all other nodes should wait -//until that node is done before running. -// -//SynchronizedBeforeSuite accomplishes this by taking *two* function arguments. The first is only run on parallel node #1. The second is -//run on all nodes, but *only* after the first function completes successfully. Ginkgo also makes it possible to send data from the first function (on Node 1) -//to the second function (on all the other nodes). -// -//The functions have the following signatures. The first function (which only runs on node 1) has the signature: -// -// func() []byte -// -//or, to run asynchronously: -// -// func(done Done) []byte -// -//The byte array returned by the first function is then passed to the second function, which has the signature: -// -// func(data []byte) -// -//or, to run asynchronously: -// -// func(data []byte, done Done) -// -//Here's a simple pseudo-code example that starts a shared database on Node 1 and shares the database's address with the other nodes: -// -// var dbClient db.Client -// var dbRunner db.Runner -// -// var _ = SynchronizedBeforeSuite(func() []byte { -// dbRunner = db.NewRunner() -// err := dbRunner.Start() -// Ω(err).ShouldNot(HaveOccurred()) -// return []byte(dbRunner.URL) -// }, func(data []byte) { -// dbClient = db.NewClient() -// err := dbClient.Connect(string(data)) -// Ω(err).ShouldNot(HaveOccurred()) -// }) -func SynchronizedBeforeSuite(node1Body interface{}, allNodesBody interface{}, timeout ...float64) bool { - globalSuite.SetSynchronizedBeforeSuiteNode( - node1Body, - allNodesBody, - codelocation.New(1), - parseTimeout(timeout...), - ) - return true -} - -//SynchronizedAfterSuite blocks complement the SynchronizedBeforeSuite blocks in solving the problem of setting up -//external singleton resources shared across nodes when running tests in parallel. -// -//SynchronizedAfterSuite accomplishes this by taking *two* function arguments. The first runs on all nodes. The second runs only on parallel node #1 -//and *only* after all other nodes have finished and exited. This ensures that node 1, and any resources it is running, remain alive until -//all other nodes are finished. -// -//Both functions have the same signature: either func() or func(done Done) to run asynchronously. -// -//Here's a pseudo-code example that complements that given in SynchronizedBeforeSuite. Here, SynchronizedAfterSuite is used to tear down the shared database -//only after all nodes have finished: -// -// var _ = SynchronizedAfterSuite(func() { -// dbClient.Cleanup() -// }, func() { -// dbRunner.Stop() -// }) -func SynchronizedAfterSuite(allNodesBody interface{}, node1Body interface{}, timeout ...float64) bool { - globalSuite.SetSynchronizedAfterSuiteNode( - allNodesBody, - node1Body, - codelocation.New(1), - parseTimeout(timeout...), - ) - return true -} - -//BeforeEach blocks are run before It blocks. When multiple BeforeEach blocks are defined in nested -//Describe and Context blocks the outermost BeforeEach blocks are run first. -// -//Like It blocks, BeforeEach blocks can be made asynchronous by providing a body function that accepts -//a Done channel -func BeforeEach(body interface{}, timeout ...float64) bool { - globalSuite.PushBeforeEachNode(body, codelocation.New(1), parseTimeout(timeout...)) - return true -} - -//JustBeforeEach blocks are run before It blocks but *after* all BeforeEach blocks. For more details, -//read the [documentation](http://onsi.github.io/ginkgo/#separating_creation_and_configuration_) -// -//Like It blocks, BeforeEach blocks can be made asynchronous by providing a body function that accepts -//a Done channel -func JustBeforeEach(body interface{}, timeout ...float64) bool { - globalSuite.PushJustBeforeEachNode(body, codelocation.New(1), parseTimeout(timeout...)) - return true -} - -//JustAfterEach blocks are run after It blocks but *before* all AfterEach blocks. For more details, -//read the [documentation](http://onsi.github.io/ginkgo/#separating_creation_and_configuration_) -// -//Like It blocks, JustAfterEach blocks can be made asynchronous by providing a body function that accepts -//a Done channel -func JustAfterEach(body interface{}, timeout ...float64) bool { - globalSuite.PushJustAfterEachNode(body, codelocation.New(1), parseTimeout(timeout...)) - return true -} - -//AfterEach blocks are run after It blocks. When multiple AfterEach blocks are defined in nested -//Describe and Context blocks the innermost AfterEach blocks are run first. -// -//Like It blocks, AfterEach blocks can be made asynchronous by providing a body function that accepts -//a Done channel -func AfterEach(body interface{}, timeout ...float64) bool { - globalSuite.PushAfterEachNode(body, codelocation.New(1), parseTimeout(timeout...)) - return true -} - -func parseTimeout(timeout ...float64) time.Duration { - if len(timeout) == 0 { - return time.Duration(defaultTimeout * int64(time.Second)) - } else { - return time.Duration(timeout[0] * float64(time.Second)) - } -} diff --git a/vendor/github.com/onsi/ginkgo/internal/codelocation/code_location.go b/vendor/github.com/onsi/ginkgo/internal/codelocation/code_location.go deleted file mode 100644 index aa89d6cba..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/codelocation/code_location.go +++ /dev/null @@ -1,48 +0,0 @@ -package codelocation - -import ( - "regexp" - "runtime" - "runtime/debug" - "strings" - - "github.com/onsi/ginkgo/types" -) - -func New(skip int) types.CodeLocation { - _, file, line, _ := runtime.Caller(skip + 1) - stackTrace := PruneStack(string(debug.Stack()), skip+1) - return types.CodeLocation{FileName: file, LineNumber: line, FullStackTrace: stackTrace} -} - -// PruneStack removes references to functions that are internal to Ginkgo -// and the Go runtime from a stack string and a certain number of stack entries -// at the beginning of the stack. The stack string has the format -// as returned by runtime/debug.Stack. The leading goroutine information is -// optional and always removed if present. Beware that runtime/debug.Stack -// adds itself as first entry, so typically skip must be >= 1 to remove that -// entry. -func PruneStack(fullStackTrace string, skip int) string { - stack := strings.Split(fullStackTrace, "\n") - // Ensure that the even entries are the method names and the - // the odd entries the source code information. - if len(stack) > 0 && strings.HasPrefix(stack[0], "goroutine ") { - // Ignore "goroutine 29 [running]:" line. - stack = stack[1:] - } - // The "+1" is for skipping over the initial entry, which is - // runtime/debug.Stack() itself. - if len(stack) > 2*(skip+1) { - stack = stack[2*(skip+1):] - } - prunedStack := []string{} - re := regexp.MustCompile(`\/ginkgo\/|\/pkg\/testing\/|\/pkg\/runtime\/`) - for i := 0; i < len(stack)/2; i++ { - // We filter out based on the source code file name. - if !re.Match([]byte(stack[i*2+1])) { - prunedStack = append(prunedStack, stack[i*2]) - prunedStack = append(prunedStack, stack[i*2+1]) - } - } - return strings.Join(prunedStack, "\n") -} diff --git a/vendor/github.com/onsi/ginkgo/internal/containernode/container_node.go b/vendor/github.com/onsi/ginkgo/internal/containernode/container_node.go deleted file mode 100644 index 0737746dc..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/containernode/container_node.go +++ /dev/null @@ -1,151 +0,0 @@ -package containernode - -import ( - "math/rand" - "sort" - - "github.com/onsi/ginkgo/internal/leafnodes" - "github.com/onsi/ginkgo/types" -) - -type subjectOrContainerNode struct { - containerNode *ContainerNode - subjectNode leafnodes.SubjectNode -} - -func (n subjectOrContainerNode) text() string { - if n.containerNode != nil { - return n.containerNode.Text() - } else { - return n.subjectNode.Text() - } -} - -type CollatedNodes struct { - Containers []*ContainerNode - Subject leafnodes.SubjectNode -} - -type ContainerNode struct { - text string - flag types.FlagType - codeLocation types.CodeLocation - - setupNodes []leafnodes.BasicNode - subjectAndContainerNodes []subjectOrContainerNode -} - -func New(text string, flag types.FlagType, codeLocation types.CodeLocation) *ContainerNode { - return &ContainerNode{ - text: text, - flag: flag, - codeLocation: codeLocation, - } -} - -func (container *ContainerNode) Shuffle(r *rand.Rand) { - sort.Sort(container) - permutation := r.Perm(len(container.subjectAndContainerNodes)) - shuffledNodes := make([]subjectOrContainerNode, len(container.subjectAndContainerNodes)) - for i, j := range permutation { - shuffledNodes[i] = container.subjectAndContainerNodes[j] - } - container.subjectAndContainerNodes = shuffledNodes -} - -func (node *ContainerNode) BackPropagateProgrammaticFocus() bool { - if node.flag == types.FlagTypePending { - return false - } - - shouldUnfocus := false - for _, subjectOrContainerNode := range node.subjectAndContainerNodes { - if subjectOrContainerNode.containerNode != nil { - shouldUnfocus = subjectOrContainerNode.containerNode.BackPropagateProgrammaticFocus() || shouldUnfocus - } else { - shouldUnfocus = (subjectOrContainerNode.subjectNode.Flag() == types.FlagTypeFocused) || shouldUnfocus - } - } - - if shouldUnfocus { - if node.flag == types.FlagTypeFocused { - node.flag = types.FlagTypeNone - } - return true - } - - return node.flag == types.FlagTypeFocused -} - -func (node *ContainerNode) Collate() []CollatedNodes { - return node.collate([]*ContainerNode{}) -} - -func (node *ContainerNode) collate(enclosingContainers []*ContainerNode) []CollatedNodes { - collated := make([]CollatedNodes, 0) - - containers := make([]*ContainerNode, len(enclosingContainers)) - copy(containers, enclosingContainers) - containers = append(containers, node) - - for _, subjectOrContainer := range node.subjectAndContainerNodes { - if subjectOrContainer.containerNode != nil { - collated = append(collated, subjectOrContainer.containerNode.collate(containers)...) - } else { - collated = append(collated, CollatedNodes{ - Containers: containers, - Subject: subjectOrContainer.subjectNode, - }) - } - } - - return collated -} - -func (node *ContainerNode) PushContainerNode(container *ContainerNode) { - node.subjectAndContainerNodes = append(node.subjectAndContainerNodes, subjectOrContainerNode{containerNode: container}) -} - -func (node *ContainerNode) PushSubjectNode(subject leafnodes.SubjectNode) { - node.subjectAndContainerNodes = append(node.subjectAndContainerNodes, subjectOrContainerNode{subjectNode: subject}) -} - -func (node *ContainerNode) PushSetupNode(setupNode leafnodes.BasicNode) { - node.setupNodes = append(node.setupNodes, setupNode) -} - -func (node *ContainerNode) SetupNodesOfType(nodeType types.SpecComponentType) []leafnodes.BasicNode { - nodes := []leafnodes.BasicNode{} - for _, setupNode := range node.setupNodes { - if setupNode.Type() == nodeType { - nodes = append(nodes, setupNode) - } - } - return nodes -} - -func (node *ContainerNode) Text() string { - return node.text -} - -func (node *ContainerNode) CodeLocation() types.CodeLocation { - return node.codeLocation -} - -func (node *ContainerNode) Flag() types.FlagType { - return node.flag -} - -//sort.Interface - -func (node *ContainerNode) Len() int { - return len(node.subjectAndContainerNodes) -} - -func (node *ContainerNode) Less(i, j int) bool { - return node.subjectAndContainerNodes[i].text() < node.subjectAndContainerNodes[j].text() -} - -func (node *ContainerNode) Swap(i, j int) { - node.subjectAndContainerNodes[i], node.subjectAndContainerNodes[j] = node.subjectAndContainerNodes[j], node.subjectAndContainerNodes[i] -} diff --git a/vendor/github.com/onsi/ginkgo/internal/failer/failer.go b/vendor/github.com/onsi/ginkgo/internal/failer/failer.go deleted file mode 100644 index 678ea2514..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/failer/failer.go +++ /dev/null @@ -1,92 +0,0 @@ -package failer - -import ( - "fmt" - "sync" - - "github.com/onsi/ginkgo/types" -) - -type Failer struct { - lock *sync.Mutex - failure types.SpecFailure - state types.SpecState -} - -func New() *Failer { - return &Failer{ - lock: &sync.Mutex{}, - state: types.SpecStatePassed, - } -} - -func (f *Failer) Panic(location types.CodeLocation, forwardedPanic interface{}) { - f.lock.Lock() - defer f.lock.Unlock() - - if f.state == types.SpecStatePassed { - f.state = types.SpecStatePanicked - f.failure = types.SpecFailure{ - Message: "Test Panicked", - Location: location, - ForwardedPanic: fmt.Sprintf("%v", forwardedPanic), - } - } -} - -func (f *Failer) Timeout(location types.CodeLocation) { - f.lock.Lock() - defer f.lock.Unlock() - - if f.state == types.SpecStatePassed { - f.state = types.SpecStateTimedOut - f.failure = types.SpecFailure{ - Message: "Timed out", - Location: location, - } - } -} - -func (f *Failer) Fail(message string, location types.CodeLocation) { - f.lock.Lock() - defer f.lock.Unlock() - - if f.state == types.SpecStatePassed { - f.state = types.SpecStateFailed - f.failure = types.SpecFailure{ - Message: message, - Location: location, - } - } -} - -func (f *Failer) Drain(componentType types.SpecComponentType, componentIndex int, componentCodeLocation types.CodeLocation) (types.SpecFailure, types.SpecState) { - f.lock.Lock() - defer f.lock.Unlock() - - failure := f.failure - outcome := f.state - if outcome != types.SpecStatePassed { - failure.ComponentType = componentType - failure.ComponentIndex = componentIndex - failure.ComponentCodeLocation = componentCodeLocation - } - - f.state = types.SpecStatePassed - f.failure = types.SpecFailure{} - - return failure, outcome -} - -func (f *Failer) Skip(message string, location types.CodeLocation) { - f.lock.Lock() - defer f.lock.Unlock() - - if f.state == types.SpecStatePassed { - f.state = types.SpecStateSkipped - f.failure = types.SpecFailure{ - Message: message, - Location: location, - } - } -} diff --git a/vendor/github.com/onsi/ginkgo/internal/leafnodes/benchmarker.go b/vendor/github.com/onsi/ginkgo/internal/leafnodes/benchmarker.go deleted file mode 100644 index 393901e11..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/leafnodes/benchmarker.go +++ /dev/null @@ -1,103 +0,0 @@ -package leafnodes - -import ( - "math" - "time" - - "sync" - - "github.com/onsi/ginkgo/types" -) - -type benchmarker struct { - mu sync.Mutex - measurements map[string]*types.SpecMeasurement - orderCounter int -} - -func newBenchmarker() *benchmarker { - return &benchmarker{ - measurements: make(map[string]*types.SpecMeasurement), - } -} - -func (b *benchmarker) Time(name string, body func(), info ...interface{}) (elapsedTime time.Duration) { - t := time.Now() - body() - elapsedTime = time.Since(t) - - b.mu.Lock() - defer b.mu.Unlock() - measurement := b.getMeasurement(name, "Fastest Time", "Slowest Time", "Average Time", "s", 3, info...) - measurement.Results = append(measurement.Results, elapsedTime.Seconds()) - - return -} - -func (b *benchmarker) RecordValue(name string, value float64, info ...interface{}) { - b.mu.Lock() - measurement := b.getMeasurement(name, "Smallest", " Largest", " Average", "", 3, info...) - defer b.mu.Unlock() - measurement.Results = append(measurement.Results, value) -} - -func (b *benchmarker) RecordValueWithPrecision(name string, value float64, units string, precision int, info ...interface{}) { - b.mu.Lock() - measurement := b.getMeasurement(name, "Smallest", " Largest", " Average", units, precision, info...) - defer b.mu.Unlock() - measurement.Results = append(measurement.Results, value) -} - -func (b *benchmarker) getMeasurement(name string, smallestLabel string, largestLabel string, averageLabel string, units string, precision int, info ...interface{}) *types.SpecMeasurement { - measurement, ok := b.measurements[name] - if !ok { - var computedInfo interface{} - computedInfo = nil - if len(info) > 0 { - computedInfo = info[0] - } - measurement = &types.SpecMeasurement{ - Name: name, - Info: computedInfo, - Order: b.orderCounter, - SmallestLabel: smallestLabel, - LargestLabel: largestLabel, - AverageLabel: averageLabel, - Units: units, - Precision: precision, - Results: make([]float64, 0), - } - b.measurements[name] = measurement - b.orderCounter++ - } - - return measurement -} - -func (b *benchmarker) measurementsReport() map[string]*types.SpecMeasurement { - b.mu.Lock() - defer b.mu.Unlock() - for _, measurement := range b.measurements { - measurement.Smallest = math.MaxFloat64 - measurement.Largest = -math.MaxFloat64 - sum := float64(0) - sumOfSquares := float64(0) - - for _, result := range measurement.Results { - if result > measurement.Largest { - measurement.Largest = result - } - if result < measurement.Smallest { - measurement.Smallest = result - } - sum += result - sumOfSquares += result * result - } - - n := float64(len(measurement.Results)) - measurement.Average = sum / n - measurement.StdDeviation = math.Sqrt(sumOfSquares/n - (sum/n)*(sum/n)) - } - - return b.measurements -} diff --git a/vendor/github.com/onsi/ginkgo/internal/leafnodes/interfaces.go b/vendor/github.com/onsi/ginkgo/internal/leafnodes/interfaces.go deleted file mode 100644 index 8c3902d60..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/leafnodes/interfaces.go +++ /dev/null @@ -1,19 +0,0 @@ -package leafnodes - -import ( - "github.com/onsi/ginkgo/types" -) - -type BasicNode interface { - Type() types.SpecComponentType - Run() (types.SpecState, types.SpecFailure) - CodeLocation() types.CodeLocation -} - -type SubjectNode interface { - BasicNode - - Text() string - Flag() types.FlagType - Samples() int -} diff --git a/vendor/github.com/onsi/ginkgo/internal/leafnodes/it_node.go b/vendor/github.com/onsi/ginkgo/internal/leafnodes/it_node.go deleted file mode 100644 index 6eded7b76..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/leafnodes/it_node.go +++ /dev/null @@ -1,47 +0,0 @@ -package leafnodes - -import ( - "time" - - "github.com/onsi/ginkgo/internal/failer" - "github.com/onsi/ginkgo/types" -) - -type ItNode struct { - runner *runner - - flag types.FlagType - text string -} - -func NewItNode(text string, body interface{}, flag types.FlagType, codeLocation types.CodeLocation, timeout time.Duration, failer *failer.Failer, componentIndex int) *ItNode { - return &ItNode{ - runner: newRunner(body, codeLocation, timeout, failer, types.SpecComponentTypeIt, componentIndex), - flag: flag, - text: text, - } -} - -func (node *ItNode) Run() (outcome types.SpecState, failure types.SpecFailure) { - return node.runner.run() -} - -func (node *ItNode) Type() types.SpecComponentType { - return types.SpecComponentTypeIt -} - -func (node *ItNode) Text() string { - return node.text -} - -func (node *ItNode) Flag() types.FlagType { - return node.flag -} - -func (node *ItNode) CodeLocation() types.CodeLocation { - return node.runner.codeLocation -} - -func (node *ItNode) Samples() int { - return 1 -} diff --git a/vendor/github.com/onsi/ginkgo/internal/leafnodes/measure_node.go b/vendor/github.com/onsi/ginkgo/internal/leafnodes/measure_node.go deleted file mode 100644 index 3ab9a6d55..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/leafnodes/measure_node.go +++ /dev/null @@ -1,62 +0,0 @@ -package leafnodes - -import ( - "reflect" - - "github.com/onsi/ginkgo/internal/failer" - "github.com/onsi/ginkgo/types" -) - -type MeasureNode struct { - runner *runner - - text string - flag types.FlagType - samples int - benchmarker *benchmarker -} - -func NewMeasureNode(text string, body interface{}, flag types.FlagType, codeLocation types.CodeLocation, samples int, failer *failer.Failer, componentIndex int) *MeasureNode { - benchmarker := newBenchmarker() - - wrappedBody := func() { - reflect.ValueOf(body).Call([]reflect.Value{reflect.ValueOf(benchmarker)}) - } - - return &MeasureNode{ - runner: newRunner(wrappedBody, codeLocation, 0, failer, types.SpecComponentTypeMeasure, componentIndex), - - text: text, - flag: flag, - samples: samples, - benchmarker: benchmarker, - } -} - -func (node *MeasureNode) Run() (outcome types.SpecState, failure types.SpecFailure) { - return node.runner.run() -} - -func (node *MeasureNode) MeasurementsReport() map[string]*types.SpecMeasurement { - return node.benchmarker.measurementsReport() -} - -func (node *MeasureNode) Type() types.SpecComponentType { - return types.SpecComponentTypeMeasure -} - -func (node *MeasureNode) Text() string { - return node.text -} - -func (node *MeasureNode) Flag() types.FlagType { - return node.flag -} - -func (node *MeasureNode) CodeLocation() types.CodeLocation { - return node.runner.codeLocation -} - -func (node *MeasureNode) Samples() int { - return node.samples -} diff --git a/vendor/github.com/onsi/ginkgo/internal/leafnodes/runner.go b/vendor/github.com/onsi/ginkgo/internal/leafnodes/runner.go deleted file mode 100644 index 16cb66c3e..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/leafnodes/runner.go +++ /dev/null @@ -1,117 +0,0 @@ -package leafnodes - -import ( - "fmt" - "reflect" - "time" - - "github.com/onsi/ginkgo/internal/codelocation" - "github.com/onsi/ginkgo/internal/failer" - "github.com/onsi/ginkgo/types" -) - -type runner struct { - isAsync bool - asyncFunc func(chan<- interface{}) - syncFunc func() - codeLocation types.CodeLocation - timeoutThreshold time.Duration - nodeType types.SpecComponentType - componentIndex int - failer *failer.Failer -} - -func newRunner(body interface{}, codeLocation types.CodeLocation, timeout time.Duration, failer *failer.Failer, nodeType types.SpecComponentType, componentIndex int) *runner { - bodyType := reflect.TypeOf(body) - if bodyType.Kind() != reflect.Func { - panic(fmt.Sprintf("Expected a function but got something else at %v", codeLocation)) - } - - runner := &runner{ - codeLocation: codeLocation, - timeoutThreshold: timeout, - failer: failer, - nodeType: nodeType, - componentIndex: componentIndex, - } - - switch bodyType.NumIn() { - case 0: - runner.syncFunc = body.(func()) - return runner - case 1: - if !(bodyType.In(0).Kind() == reflect.Chan && bodyType.In(0).Elem().Kind() == reflect.Interface) { - panic(fmt.Sprintf("Must pass a Done channel to function at %v", codeLocation)) - } - - wrappedBody := func(done chan<- interface{}) { - bodyValue := reflect.ValueOf(body) - bodyValue.Call([]reflect.Value{reflect.ValueOf(done)}) - } - - runner.isAsync = true - runner.asyncFunc = wrappedBody - return runner - } - - panic(fmt.Sprintf("Too many arguments to function at %v", codeLocation)) -} - -func (r *runner) run() (outcome types.SpecState, failure types.SpecFailure) { - if r.isAsync { - return r.runAsync() - } else { - return r.runSync() - } -} - -func (r *runner) runAsync() (outcome types.SpecState, failure types.SpecFailure) { - done := make(chan interface{}, 1) - - go func() { - finished := false - - defer func() { - if e := recover(); e != nil || !finished { - r.failer.Panic(codelocation.New(2), e) - select { - case <-done: - break - default: - close(done) - } - } - }() - - r.asyncFunc(done) - finished = true - }() - - // If this goroutine gets no CPU time before the select block, - // the <-done case may complete even if the test took longer than the timeoutThreshold. - // This can cause flaky behaviour, but we haven't seen it in the wild. - select { - case <-done: - case <-time.After(r.timeoutThreshold): - r.failer.Timeout(r.codeLocation) - } - - failure, outcome = r.failer.Drain(r.nodeType, r.componentIndex, r.codeLocation) - return -} -func (r *runner) runSync() (outcome types.SpecState, failure types.SpecFailure) { - finished := false - - defer func() { - if e := recover(); e != nil || !finished { - r.failer.Panic(codelocation.New(2), e) - } - - failure, outcome = r.failer.Drain(r.nodeType, r.componentIndex, r.codeLocation) - }() - - r.syncFunc() - finished = true - - return -} diff --git a/vendor/github.com/onsi/ginkgo/internal/leafnodes/setup_nodes.go b/vendor/github.com/onsi/ginkgo/internal/leafnodes/setup_nodes.go deleted file mode 100644 index e3e9cb7c5..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/leafnodes/setup_nodes.go +++ /dev/null @@ -1,48 +0,0 @@ -package leafnodes - -import ( - "time" - - "github.com/onsi/ginkgo/internal/failer" - "github.com/onsi/ginkgo/types" -) - -type SetupNode struct { - runner *runner -} - -func (node *SetupNode) Run() (outcome types.SpecState, failure types.SpecFailure) { - return node.runner.run() -} - -func (node *SetupNode) Type() types.SpecComponentType { - return node.runner.nodeType -} - -func (node *SetupNode) CodeLocation() types.CodeLocation { - return node.runner.codeLocation -} - -func NewBeforeEachNode(body interface{}, codeLocation types.CodeLocation, timeout time.Duration, failer *failer.Failer, componentIndex int) *SetupNode { - return &SetupNode{ - runner: newRunner(body, codeLocation, timeout, failer, types.SpecComponentTypeBeforeEach, componentIndex), - } -} - -func NewAfterEachNode(body interface{}, codeLocation types.CodeLocation, timeout time.Duration, failer *failer.Failer, componentIndex int) *SetupNode { - return &SetupNode{ - runner: newRunner(body, codeLocation, timeout, failer, types.SpecComponentTypeAfterEach, componentIndex), - } -} - -func NewJustBeforeEachNode(body interface{}, codeLocation types.CodeLocation, timeout time.Duration, failer *failer.Failer, componentIndex int) *SetupNode { - return &SetupNode{ - runner: newRunner(body, codeLocation, timeout, failer, types.SpecComponentTypeJustBeforeEach, componentIndex), - } -} - -func NewJustAfterEachNode(body interface{}, codeLocation types.CodeLocation, timeout time.Duration, failer *failer.Failer, componentIndex int) *SetupNode { - return &SetupNode{ - runner: newRunner(body, codeLocation, timeout, failer, types.SpecComponentTypeJustAfterEach, componentIndex), - } -} diff --git a/vendor/github.com/onsi/ginkgo/internal/leafnodes/suite_nodes.go b/vendor/github.com/onsi/ginkgo/internal/leafnodes/suite_nodes.go deleted file mode 100644 index 80f16ed78..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/leafnodes/suite_nodes.go +++ /dev/null @@ -1,55 +0,0 @@ -package leafnodes - -import ( - "time" - - "github.com/onsi/ginkgo/internal/failer" - "github.com/onsi/ginkgo/types" -) - -type SuiteNode interface { - Run(parallelNode int, parallelTotal int, syncHost string) bool - Passed() bool - Summary() *types.SetupSummary -} - -type simpleSuiteNode struct { - runner *runner - outcome types.SpecState - failure types.SpecFailure - runTime time.Duration -} - -func (node *simpleSuiteNode) Run(parallelNode int, parallelTotal int, syncHost string) bool { - t := time.Now() - node.outcome, node.failure = node.runner.run() - node.runTime = time.Since(t) - - return node.outcome == types.SpecStatePassed -} - -func (node *simpleSuiteNode) Passed() bool { - return node.outcome == types.SpecStatePassed -} - -func (node *simpleSuiteNode) Summary() *types.SetupSummary { - return &types.SetupSummary{ - ComponentType: node.runner.nodeType, - CodeLocation: node.runner.codeLocation, - State: node.outcome, - RunTime: node.runTime, - Failure: node.failure, - } -} - -func NewBeforeSuiteNode(body interface{}, codeLocation types.CodeLocation, timeout time.Duration, failer *failer.Failer) SuiteNode { - return &simpleSuiteNode{ - runner: newRunner(body, codeLocation, timeout, failer, types.SpecComponentTypeBeforeSuite, 0), - } -} - -func NewAfterSuiteNode(body interface{}, codeLocation types.CodeLocation, timeout time.Duration, failer *failer.Failer) SuiteNode { - return &simpleSuiteNode{ - runner: newRunner(body, codeLocation, timeout, failer, types.SpecComponentTypeAfterSuite, 0), - } -} diff --git a/vendor/github.com/onsi/ginkgo/internal/leafnodes/synchronized_after_suite_node.go b/vendor/github.com/onsi/ginkgo/internal/leafnodes/synchronized_after_suite_node.go deleted file mode 100644 index a721d0cf7..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/leafnodes/synchronized_after_suite_node.go +++ /dev/null @@ -1,90 +0,0 @@ -package leafnodes - -import ( - "encoding/json" - "io/ioutil" - "net/http" - "time" - - "github.com/onsi/ginkgo/internal/failer" - "github.com/onsi/ginkgo/types" -) - -type synchronizedAfterSuiteNode struct { - runnerA *runner - runnerB *runner - - outcome types.SpecState - failure types.SpecFailure - runTime time.Duration -} - -func NewSynchronizedAfterSuiteNode(bodyA interface{}, bodyB interface{}, codeLocation types.CodeLocation, timeout time.Duration, failer *failer.Failer) SuiteNode { - return &synchronizedAfterSuiteNode{ - runnerA: newRunner(bodyA, codeLocation, timeout, failer, types.SpecComponentTypeAfterSuite, 0), - runnerB: newRunner(bodyB, codeLocation, timeout, failer, types.SpecComponentTypeAfterSuite, 0), - } -} - -func (node *synchronizedAfterSuiteNode) Run(parallelNode int, parallelTotal int, syncHost string) bool { - node.outcome, node.failure = node.runnerA.run() - - if parallelNode == 1 { - if parallelTotal > 1 { - node.waitUntilOtherNodesAreDone(syncHost) - } - - outcome, failure := node.runnerB.run() - - if node.outcome == types.SpecStatePassed { - node.outcome, node.failure = outcome, failure - } - } - - return node.outcome == types.SpecStatePassed -} - -func (node *synchronizedAfterSuiteNode) Passed() bool { - return node.outcome == types.SpecStatePassed -} - -func (node *synchronizedAfterSuiteNode) Summary() *types.SetupSummary { - return &types.SetupSummary{ - ComponentType: node.runnerA.nodeType, - CodeLocation: node.runnerA.codeLocation, - State: node.outcome, - RunTime: node.runTime, - Failure: node.failure, - } -} - -func (node *synchronizedAfterSuiteNode) waitUntilOtherNodesAreDone(syncHost string) { - for { - if node.canRun(syncHost) { - return - } - - time.Sleep(50 * time.Millisecond) - } -} - -func (node *synchronizedAfterSuiteNode) canRun(syncHost string) bool { - resp, err := http.Get(syncHost + "/RemoteAfterSuiteData") - if err != nil || resp.StatusCode != http.StatusOK { - return false - } - - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return false - } - resp.Body.Close() - - afterSuiteData := types.RemoteAfterSuiteData{} - err = json.Unmarshal(body, &afterSuiteData) - if err != nil { - return false - } - - return afterSuiteData.CanRun -} diff --git a/vendor/github.com/onsi/ginkgo/internal/leafnodes/synchronized_before_suite_node.go b/vendor/github.com/onsi/ginkgo/internal/leafnodes/synchronized_before_suite_node.go deleted file mode 100644 index d5c889319..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/leafnodes/synchronized_before_suite_node.go +++ /dev/null @@ -1,181 +0,0 @@ -package leafnodes - -import ( - "bytes" - "encoding/json" - "io/ioutil" - "net/http" - "reflect" - "time" - - "github.com/onsi/ginkgo/internal/failer" - "github.com/onsi/ginkgo/types" -) - -type synchronizedBeforeSuiteNode struct { - runnerA *runner - runnerB *runner - - data []byte - - outcome types.SpecState - failure types.SpecFailure - runTime time.Duration -} - -func NewSynchronizedBeforeSuiteNode(bodyA interface{}, bodyB interface{}, codeLocation types.CodeLocation, timeout time.Duration, failer *failer.Failer) SuiteNode { - node := &synchronizedBeforeSuiteNode{} - - node.runnerA = newRunner(node.wrapA(bodyA), codeLocation, timeout, failer, types.SpecComponentTypeBeforeSuite, 0) - node.runnerB = newRunner(node.wrapB(bodyB), codeLocation, timeout, failer, types.SpecComponentTypeBeforeSuite, 0) - - return node -} - -func (node *synchronizedBeforeSuiteNode) Run(parallelNode int, parallelTotal int, syncHost string) bool { - t := time.Now() - defer func() { - node.runTime = time.Since(t) - }() - - if parallelNode == 1 { - node.outcome, node.failure = node.runA(parallelTotal, syncHost) - } else { - node.outcome, node.failure = node.waitForA(syncHost) - } - - if node.outcome != types.SpecStatePassed { - return false - } - node.outcome, node.failure = node.runnerB.run() - - return node.outcome == types.SpecStatePassed -} - -func (node *synchronizedBeforeSuiteNode) runA(parallelTotal int, syncHost string) (types.SpecState, types.SpecFailure) { - outcome, failure := node.runnerA.run() - - if parallelTotal > 1 { - state := types.RemoteBeforeSuiteStatePassed - if outcome != types.SpecStatePassed { - state = types.RemoteBeforeSuiteStateFailed - } - json := (types.RemoteBeforeSuiteData{ - Data: node.data, - State: state, - }).ToJSON() - http.Post(syncHost+"/BeforeSuiteState", "application/json", bytes.NewBuffer(json)) - } - - return outcome, failure -} - -func (node *synchronizedBeforeSuiteNode) waitForA(syncHost string) (types.SpecState, types.SpecFailure) { - failure := func(message string) types.SpecFailure { - return types.SpecFailure{ - Message: message, - Location: node.runnerA.codeLocation, - ComponentType: node.runnerA.nodeType, - ComponentIndex: node.runnerA.componentIndex, - ComponentCodeLocation: node.runnerA.codeLocation, - } - } - for { - resp, err := http.Get(syncHost + "/BeforeSuiteState") - if err != nil || resp.StatusCode != http.StatusOK { - return types.SpecStateFailed, failure("Failed to fetch BeforeSuite state") - } - - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return types.SpecStateFailed, failure("Failed to read BeforeSuite state") - } - resp.Body.Close() - - beforeSuiteData := types.RemoteBeforeSuiteData{} - err = json.Unmarshal(body, &beforeSuiteData) - if err != nil { - return types.SpecStateFailed, failure("Failed to decode BeforeSuite state") - } - - switch beforeSuiteData.State { - case types.RemoteBeforeSuiteStatePassed: - node.data = beforeSuiteData.Data - return types.SpecStatePassed, types.SpecFailure{} - case types.RemoteBeforeSuiteStateFailed: - return types.SpecStateFailed, failure("BeforeSuite on Node 1 failed") - case types.RemoteBeforeSuiteStateDisappeared: - return types.SpecStateFailed, failure("Node 1 disappeared before completing BeforeSuite") - } - - time.Sleep(50 * time.Millisecond) - } -} - -func (node *synchronizedBeforeSuiteNode) Passed() bool { - return node.outcome == types.SpecStatePassed -} - -func (node *synchronizedBeforeSuiteNode) Summary() *types.SetupSummary { - return &types.SetupSummary{ - ComponentType: node.runnerA.nodeType, - CodeLocation: node.runnerA.codeLocation, - State: node.outcome, - RunTime: node.runTime, - Failure: node.failure, - } -} - -func (node *synchronizedBeforeSuiteNode) wrapA(bodyA interface{}) interface{} { - typeA := reflect.TypeOf(bodyA) - if typeA.Kind() != reflect.Func { - panic("SynchronizedBeforeSuite expects a function as its first argument") - } - - takesNothing := typeA.NumIn() == 0 - takesADoneChannel := typeA.NumIn() == 1 && typeA.In(0).Kind() == reflect.Chan && typeA.In(0).Elem().Kind() == reflect.Interface - returnsBytes := typeA.NumOut() == 1 && typeA.Out(0).Kind() == reflect.Slice && typeA.Out(0).Elem().Kind() == reflect.Uint8 - - if !((takesNothing || takesADoneChannel) && returnsBytes) { - panic("SynchronizedBeforeSuite's first argument should be a function that returns []byte and either takes no arguments or takes a Done channel.") - } - - if takesADoneChannel { - return func(done chan<- interface{}) { - out := reflect.ValueOf(bodyA).Call([]reflect.Value{reflect.ValueOf(done)}) - node.data = out[0].Interface().([]byte) - } - } - - return func() { - out := reflect.ValueOf(bodyA).Call([]reflect.Value{}) - node.data = out[0].Interface().([]byte) - } -} - -func (node *synchronizedBeforeSuiteNode) wrapB(bodyB interface{}) interface{} { - typeB := reflect.TypeOf(bodyB) - if typeB.Kind() != reflect.Func { - panic("SynchronizedBeforeSuite expects a function as its second argument") - } - - returnsNothing := typeB.NumOut() == 0 - takesBytesOnly := typeB.NumIn() == 1 && typeB.In(0).Kind() == reflect.Slice && typeB.In(0).Elem().Kind() == reflect.Uint8 - takesBytesAndDone := typeB.NumIn() == 2 && - typeB.In(0).Kind() == reflect.Slice && typeB.In(0).Elem().Kind() == reflect.Uint8 && - typeB.In(1).Kind() == reflect.Chan && typeB.In(1).Elem().Kind() == reflect.Interface - - if !((takesBytesOnly || takesBytesAndDone) && returnsNothing) { - panic("SynchronizedBeforeSuite's second argument should be a function that returns nothing and either takes []byte or ([]byte, Done)") - } - - if takesBytesAndDone { - return func(done chan<- interface{}) { - reflect.ValueOf(bodyB).Call([]reflect.Value{reflect.ValueOf(node.data), reflect.ValueOf(done)}) - } - } - - return func() { - reflect.ValueOf(bodyB).Call([]reflect.Value{reflect.ValueOf(node.data)}) - } -} diff --git a/vendor/github.com/onsi/ginkgo/internal/remote/aggregator.go b/vendor/github.com/onsi/ginkgo/internal/remote/aggregator.go deleted file mode 100644 index f9ab30067..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/remote/aggregator.go +++ /dev/null @@ -1,249 +0,0 @@ -/* - -Aggregator is a reporter used by the Ginkgo CLI to aggregate and present parallel test output -coherently as tests complete. You shouldn't need to use this in your code. To run tests in parallel: - - ginkgo -nodes=N - -where N is the number of nodes you desire. -*/ -package remote - -import ( - "time" - - "github.com/onsi/ginkgo/config" - "github.com/onsi/ginkgo/reporters/stenographer" - "github.com/onsi/ginkgo/types" -) - -type configAndSuite struct { - config config.GinkgoConfigType - summary *types.SuiteSummary -} - -type Aggregator struct { - nodeCount int - config config.DefaultReporterConfigType - stenographer stenographer.Stenographer - result chan bool - - suiteBeginnings chan configAndSuite - aggregatedSuiteBeginnings []configAndSuite - - beforeSuites chan *types.SetupSummary - aggregatedBeforeSuites []*types.SetupSummary - - afterSuites chan *types.SetupSummary - aggregatedAfterSuites []*types.SetupSummary - - specCompletions chan *types.SpecSummary - completedSpecs []*types.SpecSummary - - suiteEndings chan *types.SuiteSummary - aggregatedSuiteEndings []*types.SuiteSummary - specs []*types.SpecSummary - - startTime time.Time -} - -func NewAggregator(nodeCount int, result chan bool, config config.DefaultReporterConfigType, stenographer stenographer.Stenographer) *Aggregator { - aggregator := &Aggregator{ - nodeCount: nodeCount, - result: result, - config: config, - stenographer: stenographer, - - suiteBeginnings: make(chan configAndSuite), - beforeSuites: make(chan *types.SetupSummary), - afterSuites: make(chan *types.SetupSummary), - specCompletions: make(chan *types.SpecSummary), - suiteEndings: make(chan *types.SuiteSummary), - } - - go aggregator.mux() - - return aggregator -} - -func (aggregator *Aggregator) SpecSuiteWillBegin(config config.GinkgoConfigType, summary *types.SuiteSummary) { - aggregator.suiteBeginnings <- configAndSuite{config, summary} -} - -func (aggregator *Aggregator) BeforeSuiteDidRun(setupSummary *types.SetupSummary) { - aggregator.beforeSuites <- setupSummary -} - -func (aggregator *Aggregator) AfterSuiteDidRun(setupSummary *types.SetupSummary) { - aggregator.afterSuites <- setupSummary -} - -func (aggregator *Aggregator) SpecWillRun(specSummary *types.SpecSummary) { - //noop -} - -func (aggregator *Aggregator) SpecDidComplete(specSummary *types.SpecSummary) { - aggregator.specCompletions <- specSummary -} - -func (aggregator *Aggregator) SpecSuiteDidEnd(summary *types.SuiteSummary) { - aggregator.suiteEndings <- summary -} - -func (aggregator *Aggregator) mux() { -loop: - for { - select { - case configAndSuite := <-aggregator.suiteBeginnings: - aggregator.registerSuiteBeginning(configAndSuite) - case setupSummary := <-aggregator.beforeSuites: - aggregator.registerBeforeSuite(setupSummary) - case setupSummary := <-aggregator.afterSuites: - aggregator.registerAfterSuite(setupSummary) - case specSummary := <-aggregator.specCompletions: - aggregator.registerSpecCompletion(specSummary) - case suite := <-aggregator.suiteEndings: - finished, passed := aggregator.registerSuiteEnding(suite) - if finished { - aggregator.result <- passed - break loop - } - } - } -} - -func (aggregator *Aggregator) registerSuiteBeginning(configAndSuite configAndSuite) { - aggregator.aggregatedSuiteBeginnings = append(aggregator.aggregatedSuiteBeginnings, configAndSuite) - - if len(aggregator.aggregatedSuiteBeginnings) == 1 { - aggregator.startTime = time.Now() - } - - if len(aggregator.aggregatedSuiteBeginnings) != aggregator.nodeCount { - return - } - - aggregator.stenographer.AnnounceSuite(configAndSuite.summary.SuiteDescription, configAndSuite.config.RandomSeed, configAndSuite.config.RandomizeAllSpecs, aggregator.config.Succinct) - - totalNumberOfSpecs := 0 - if len(aggregator.aggregatedSuiteBeginnings) > 0 { - totalNumberOfSpecs = configAndSuite.summary.NumberOfSpecsBeforeParallelization - } - - aggregator.stenographer.AnnounceTotalNumberOfSpecs(totalNumberOfSpecs, aggregator.config.Succinct) - aggregator.stenographer.AnnounceAggregatedParallelRun(aggregator.nodeCount, aggregator.config.Succinct) - aggregator.flushCompletedSpecs() -} - -func (aggregator *Aggregator) registerBeforeSuite(setupSummary *types.SetupSummary) { - aggregator.aggregatedBeforeSuites = append(aggregator.aggregatedBeforeSuites, setupSummary) - aggregator.flushCompletedSpecs() -} - -func (aggregator *Aggregator) registerAfterSuite(setupSummary *types.SetupSummary) { - aggregator.aggregatedAfterSuites = append(aggregator.aggregatedAfterSuites, setupSummary) - aggregator.flushCompletedSpecs() -} - -func (aggregator *Aggregator) registerSpecCompletion(specSummary *types.SpecSummary) { - aggregator.completedSpecs = append(aggregator.completedSpecs, specSummary) - aggregator.specs = append(aggregator.specs, specSummary) - aggregator.flushCompletedSpecs() -} - -func (aggregator *Aggregator) flushCompletedSpecs() { - if len(aggregator.aggregatedSuiteBeginnings) != aggregator.nodeCount { - return - } - - for _, setupSummary := range aggregator.aggregatedBeforeSuites { - aggregator.announceBeforeSuite(setupSummary) - } - - for _, specSummary := range aggregator.completedSpecs { - aggregator.announceSpec(specSummary) - } - - for _, setupSummary := range aggregator.aggregatedAfterSuites { - aggregator.announceAfterSuite(setupSummary) - } - - aggregator.aggregatedBeforeSuites = []*types.SetupSummary{} - aggregator.completedSpecs = []*types.SpecSummary{} - aggregator.aggregatedAfterSuites = []*types.SetupSummary{} -} - -func (aggregator *Aggregator) announceBeforeSuite(setupSummary *types.SetupSummary) { - aggregator.stenographer.AnnounceCapturedOutput(setupSummary.CapturedOutput) - if setupSummary.State != types.SpecStatePassed { - aggregator.stenographer.AnnounceBeforeSuiteFailure(setupSummary, aggregator.config.Succinct, aggregator.config.FullTrace) - } -} - -func (aggregator *Aggregator) announceAfterSuite(setupSummary *types.SetupSummary) { - aggregator.stenographer.AnnounceCapturedOutput(setupSummary.CapturedOutput) - if setupSummary.State != types.SpecStatePassed { - aggregator.stenographer.AnnounceAfterSuiteFailure(setupSummary, aggregator.config.Succinct, aggregator.config.FullTrace) - } -} - -func (aggregator *Aggregator) announceSpec(specSummary *types.SpecSummary) { - if aggregator.config.Verbose && specSummary.State != types.SpecStatePending && specSummary.State != types.SpecStateSkipped { - aggregator.stenographer.AnnounceSpecWillRun(specSummary) - } - - aggregator.stenographer.AnnounceCapturedOutput(specSummary.CapturedOutput) - - switch specSummary.State { - case types.SpecStatePassed: - if specSummary.IsMeasurement { - aggregator.stenographer.AnnounceSuccesfulMeasurement(specSummary, aggregator.config.Succinct) - } else if specSummary.RunTime.Seconds() >= aggregator.config.SlowSpecThreshold { - aggregator.stenographer.AnnounceSuccesfulSlowSpec(specSummary, aggregator.config.Succinct) - } else { - aggregator.stenographer.AnnounceSuccesfulSpec(specSummary) - } - - case types.SpecStatePending: - aggregator.stenographer.AnnouncePendingSpec(specSummary, aggregator.config.NoisyPendings && !aggregator.config.Succinct) - case types.SpecStateSkipped: - aggregator.stenographer.AnnounceSkippedSpec(specSummary, aggregator.config.Succinct || !aggregator.config.NoisySkippings, aggregator.config.FullTrace) - case types.SpecStateTimedOut: - aggregator.stenographer.AnnounceSpecTimedOut(specSummary, aggregator.config.Succinct, aggregator.config.FullTrace) - case types.SpecStatePanicked: - aggregator.stenographer.AnnounceSpecPanicked(specSummary, aggregator.config.Succinct, aggregator.config.FullTrace) - case types.SpecStateFailed: - aggregator.stenographer.AnnounceSpecFailed(specSummary, aggregator.config.Succinct, aggregator.config.FullTrace) - } -} - -func (aggregator *Aggregator) registerSuiteEnding(suite *types.SuiteSummary) (finished bool, passed bool) { - aggregator.aggregatedSuiteEndings = append(aggregator.aggregatedSuiteEndings, suite) - if len(aggregator.aggregatedSuiteEndings) < aggregator.nodeCount { - return false, false - } - - aggregatedSuiteSummary := &types.SuiteSummary{} - aggregatedSuiteSummary.SuiteSucceeded = true - - for _, suiteSummary := range aggregator.aggregatedSuiteEndings { - if !suiteSummary.SuiteSucceeded { - aggregatedSuiteSummary.SuiteSucceeded = false - } - - aggregatedSuiteSummary.NumberOfSpecsThatWillBeRun += suiteSummary.NumberOfSpecsThatWillBeRun - aggregatedSuiteSummary.NumberOfTotalSpecs += suiteSummary.NumberOfTotalSpecs - aggregatedSuiteSummary.NumberOfPassedSpecs += suiteSummary.NumberOfPassedSpecs - aggregatedSuiteSummary.NumberOfFailedSpecs += suiteSummary.NumberOfFailedSpecs - aggregatedSuiteSummary.NumberOfPendingSpecs += suiteSummary.NumberOfPendingSpecs - aggregatedSuiteSummary.NumberOfSkippedSpecs += suiteSummary.NumberOfSkippedSpecs - aggregatedSuiteSummary.NumberOfFlakedSpecs += suiteSummary.NumberOfFlakedSpecs - } - - aggregatedSuiteSummary.RunTime = time.Since(aggregator.startTime) - - aggregator.stenographer.SummarizeFailures(aggregator.specs) - aggregator.stenographer.AnnounceSpecRunCompletion(aggregatedSuiteSummary, aggregator.config.Succinct) - - return true, aggregatedSuiteSummary.SuiteSucceeded -} diff --git a/vendor/github.com/onsi/ginkgo/internal/remote/forwarding_reporter.go b/vendor/github.com/onsi/ginkgo/internal/remote/forwarding_reporter.go deleted file mode 100644 index 284bc62e5..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/remote/forwarding_reporter.go +++ /dev/null @@ -1,147 +0,0 @@ -package remote - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" - "os" - - "github.com/onsi/ginkgo/internal/writer" - "github.com/onsi/ginkgo/reporters" - "github.com/onsi/ginkgo/reporters/stenographer" - - "github.com/onsi/ginkgo/config" - "github.com/onsi/ginkgo/types" -) - -//An interface to net/http's client to allow the injection of fakes under test -type Poster interface { - Post(url string, bodyType string, body io.Reader) (resp *http.Response, err error) -} - -/* -The ForwardingReporter is a Ginkgo reporter that forwards information to -a Ginkgo remote server. - -When streaming parallel test output, this repoter is automatically installed by Ginkgo. - -This is accomplished by passing in the GINKGO_REMOTE_REPORTING_SERVER environment variable to `go test`, the Ginkgo test runner -detects this environment variable (which should contain the host of the server) and automatically installs a ForwardingReporter -in place of Ginkgo's DefaultReporter. -*/ - -type ForwardingReporter struct { - serverHost string - poster Poster - outputInterceptor OutputInterceptor - debugMode bool - debugFile *os.File - nestedReporter *reporters.DefaultReporter -} - -func NewForwardingReporter(config config.DefaultReporterConfigType, serverHost string, poster Poster, outputInterceptor OutputInterceptor, ginkgoWriter *writer.Writer, debugFile string) *ForwardingReporter { - reporter := &ForwardingReporter{ - serverHost: serverHost, - poster: poster, - outputInterceptor: outputInterceptor, - } - - if debugFile != "" { - var err error - reporter.debugMode = true - reporter.debugFile, err = os.Create(debugFile) - if err != nil { - fmt.Println(err.Error()) - os.Exit(1) - } - - if !config.Verbose { - //if verbose is true then the GinkgoWriter emits to stdout. Don't _also_ redirect GinkgoWriter output as that will result in duplication. - ginkgoWriter.AndRedirectTo(reporter.debugFile) - } - outputInterceptor.StreamTo(reporter.debugFile) //This is not working - - stenographer := stenographer.New(false, true, reporter.debugFile) - config.Succinct = false - config.Verbose = true - config.FullTrace = true - reporter.nestedReporter = reporters.NewDefaultReporter(config, stenographer) - } - - return reporter -} - -func (reporter *ForwardingReporter) post(path string, data interface{}) { - encoded, _ := json.Marshal(data) - buffer := bytes.NewBuffer(encoded) - reporter.poster.Post(reporter.serverHost+path, "application/json", buffer) -} - -func (reporter *ForwardingReporter) SpecSuiteWillBegin(conf config.GinkgoConfigType, summary *types.SuiteSummary) { - data := struct { - Config config.GinkgoConfigType `json:"config"` - Summary *types.SuiteSummary `json:"suite-summary"` - }{ - conf, - summary, - } - - reporter.outputInterceptor.StartInterceptingOutput() - if reporter.debugMode { - reporter.nestedReporter.SpecSuiteWillBegin(conf, summary) - reporter.debugFile.Sync() - } - reporter.post("/SpecSuiteWillBegin", data) -} - -func (reporter *ForwardingReporter) BeforeSuiteDidRun(setupSummary *types.SetupSummary) { - output, _ := reporter.outputInterceptor.StopInterceptingAndReturnOutput() - reporter.outputInterceptor.StartInterceptingOutput() - setupSummary.CapturedOutput = output - if reporter.debugMode { - reporter.nestedReporter.BeforeSuiteDidRun(setupSummary) - reporter.debugFile.Sync() - } - reporter.post("/BeforeSuiteDidRun", setupSummary) -} - -func (reporter *ForwardingReporter) SpecWillRun(specSummary *types.SpecSummary) { - if reporter.debugMode { - reporter.nestedReporter.SpecWillRun(specSummary) - reporter.debugFile.Sync() - } - reporter.post("/SpecWillRun", specSummary) -} - -func (reporter *ForwardingReporter) SpecDidComplete(specSummary *types.SpecSummary) { - output, _ := reporter.outputInterceptor.StopInterceptingAndReturnOutput() - reporter.outputInterceptor.StartInterceptingOutput() - specSummary.CapturedOutput = output - if reporter.debugMode { - reporter.nestedReporter.SpecDidComplete(specSummary) - reporter.debugFile.Sync() - } - reporter.post("/SpecDidComplete", specSummary) -} - -func (reporter *ForwardingReporter) AfterSuiteDidRun(setupSummary *types.SetupSummary) { - output, _ := reporter.outputInterceptor.StopInterceptingAndReturnOutput() - reporter.outputInterceptor.StartInterceptingOutput() - setupSummary.CapturedOutput = output - if reporter.debugMode { - reporter.nestedReporter.AfterSuiteDidRun(setupSummary) - reporter.debugFile.Sync() - } - reporter.post("/AfterSuiteDidRun", setupSummary) -} - -func (reporter *ForwardingReporter) SpecSuiteDidEnd(summary *types.SuiteSummary) { - reporter.outputInterceptor.StopInterceptingAndReturnOutput() - if reporter.debugMode { - reporter.nestedReporter.SpecSuiteDidEnd(summary) - reporter.debugFile.Sync() - } - reporter.post("/SpecSuiteDidEnd", summary) -} diff --git a/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor.go b/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor.go deleted file mode 100644 index 5154abe87..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor.go +++ /dev/null @@ -1,13 +0,0 @@ -package remote - -import "os" - -/* -The OutputInterceptor is used by the ForwardingReporter to -intercept and capture all stdin and stderr output during a test run. -*/ -type OutputInterceptor interface { - StartInterceptingOutput() error - StopInterceptingAndReturnOutput() (string, error) - StreamTo(*os.File) -} diff --git a/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_unix.go b/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_unix.go deleted file mode 100644 index ab6622a29..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_unix.go +++ /dev/null @@ -1,83 +0,0 @@ -// +build freebsd openbsd netbsd dragonfly darwin linux solaris - -package remote - -import ( - "errors" - "io/ioutil" - "os" - - "github.com/hpcloud/tail" -) - -func NewOutputInterceptor() OutputInterceptor { - return &outputInterceptor{} -} - -type outputInterceptor struct { - redirectFile *os.File - streamTarget *os.File - intercepting bool - tailer *tail.Tail - doneTailing chan bool -} - -func (interceptor *outputInterceptor) StartInterceptingOutput() error { - if interceptor.intercepting { - return errors.New("Already intercepting output!") - } - interceptor.intercepting = true - - var err error - - interceptor.redirectFile, err = ioutil.TempFile("", "ginkgo-output") - if err != nil { - return err - } - - // Call a function in ./syscall_dup_*.go - // If building for everything other than linux_arm64, - // use a "normal" syscall.Dup2(oldfd, newfd) call. If building for linux_arm64 (which doesn't have syscall.Dup2) - // call syscall.Dup3(oldfd, newfd, 0). They are nearly identical, see: http://linux.die.net/man/2/dup3 - syscallDup(int(interceptor.redirectFile.Fd()), 1) - syscallDup(int(interceptor.redirectFile.Fd()), 2) - - if interceptor.streamTarget != nil { - interceptor.tailer, _ = tail.TailFile(interceptor.redirectFile.Name(), tail.Config{Follow: true}) - interceptor.doneTailing = make(chan bool) - - go func() { - for line := range interceptor.tailer.Lines { - interceptor.streamTarget.Write([]byte(line.Text + "\n")) - } - close(interceptor.doneTailing) - }() - } - - return nil -} - -func (interceptor *outputInterceptor) StopInterceptingAndReturnOutput() (string, error) { - if !interceptor.intercepting { - return "", errors.New("Not intercepting output!") - } - - interceptor.redirectFile.Close() - output, err := ioutil.ReadFile(interceptor.redirectFile.Name()) - os.Remove(interceptor.redirectFile.Name()) - - interceptor.intercepting = false - - if interceptor.streamTarget != nil { - interceptor.tailer.Stop() - interceptor.tailer.Cleanup() - <-interceptor.doneTailing - interceptor.streamTarget.Sync() - } - - return string(output), err -} - -func (interceptor *outputInterceptor) StreamTo(out *os.File) { - interceptor.streamTarget = out -} diff --git a/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_win.go b/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_win.go deleted file mode 100644 index 40c790336..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_win.go +++ /dev/null @@ -1,36 +0,0 @@ -// +build windows - -package remote - -import ( - "errors" - "os" -) - -func NewOutputInterceptor() OutputInterceptor { - return &outputInterceptor{} -} - -type outputInterceptor struct { - intercepting bool -} - -func (interceptor *outputInterceptor) StartInterceptingOutput() error { - if interceptor.intercepting { - return errors.New("Already intercepting output!") - } - interceptor.intercepting = true - - // not working on windows... - - return nil -} - -func (interceptor *outputInterceptor) StopInterceptingAndReturnOutput() (string, error) { - // not working on windows... - interceptor.intercepting = false - - return "", nil -} - -func (interceptor *outputInterceptor) StreamTo(*os.File) {} diff --git a/vendor/github.com/onsi/ginkgo/internal/remote/server.go b/vendor/github.com/onsi/ginkgo/internal/remote/server.go deleted file mode 100644 index 93e9dac05..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/remote/server.go +++ /dev/null @@ -1,224 +0,0 @@ -/* - -The remote package provides the pieces to allow Ginkgo test suites to report to remote listeners. -This is used, primarily, to enable streaming parallel test output but has, in principal, broader applications (e.g. streaming test output to a browser). - -*/ - -package remote - -import ( - "encoding/json" - "io/ioutil" - "net" - "net/http" - "sync" - - "github.com/onsi/ginkgo/internal/spec_iterator" - - "github.com/onsi/ginkgo/config" - "github.com/onsi/ginkgo/reporters" - "github.com/onsi/ginkgo/types" -) - -/* -Server spins up on an automatically selected port and listens for communication from the forwarding reporter. -It then forwards that communication to attached reporters. -*/ -type Server struct { - listener net.Listener - reporters []reporters.Reporter - alives []func() bool - lock *sync.Mutex - beforeSuiteData types.RemoteBeforeSuiteData - parallelTotal int - counter int -} - -//Create a new server, automatically selecting a port -func NewServer(parallelTotal int) (*Server, error) { - listener, err := net.Listen("tcp", "127.0.0.1:0") - if err != nil { - return nil, err - } - return &Server{ - listener: listener, - lock: &sync.Mutex{}, - alives: make([]func() bool, parallelTotal), - beforeSuiteData: types.RemoteBeforeSuiteData{Data: nil, State: types.RemoteBeforeSuiteStatePending}, - parallelTotal: parallelTotal, - }, nil -} - -//Start the server. You don't need to `go s.Start()`, just `s.Start()` -func (server *Server) Start() { - httpServer := &http.Server{} - mux := http.NewServeMux() - httpServer.Handler = mux - - //streaming endpoints - mux.HandleFunc("/SpecSuiteWillBegin", server.specSuiteWillBegin) - mux.HandleFunc("/BeforeSuiteDidRun", server.beforeSuiteDidRun) - mux.HandleFunc("/AfterSuiteDidRun", server.afterSuiteDidRun) - mux.HandleFunc("/SpecWillRun", server.specWillRun) - mux.HandleFunc("/SpecDidComplete", server.specDidComplete) - mux.HandleFunc("/SpecSuiteDidEnd", server.specSuiteDidEnd) - - //synchronization endpoints - mux.HandleFunc("/BeforeSuiteState", server.handleBeforeSuiteState) - mux.HandleFunc("/RemoteAfterSuiteData", server.handleRemoteAfterSuiteData) - mux.HandleFunc("/counter", server.handleCounter) - mux.HandleFunc("/has-counter", server.handleHasCounter) //for backward compatibility - - go httpServer.Serve(server.listener) -} - -//Stop the server -func (server *Server) Close() { - server.listener.Close() -} - -//The address the server can be reached it. Pass this into the `ForwardingReporter`. -func (server *Server) Address() string { - return "http://" + server.listener.Addr().String() -} - -// -// Streaming Endpoints -// - -//The server will forward all received messages to Ginkgo reporters registered with `RegisterReporters` -func (server *Server) readAll(request *http.Request) []byte { - defer request.Body.Close() - body, _ := ioutil.ReadAll(request.Body) - return body -} - -func (server *Server) RegisterReporters(reporters ...reporters.Reporter) { - server.reporters = reporters -} - -func (server *Server) specSuiteWillBegin(writer http.ResponseWriter, request *http.Request) { - body := server.readAll(request) - - var data struct { - Config config.GinkgoConfigType `json:"config"` - Summary *types.SuiteSummary `json:"suite-summary"` - } - - json.Unmarshal(body, &data) - - for _, reporter := range server.reporters { - reporter.SpecSuiteWillBegin(data.Config, data.Summary) - } -} - -func (server *Server) beforeSuiteDidRun(writer http.ResponseWriter, request *http.Request) { - body := server.readAll(request) - var setupSummary *types.SetupSummary - json.Unmarshal(body, &setupSummary) - - for _, reporter := range server.reporters { - reporter.BeforeSuiteDidRun(setupSummary) - } -} - -func (server *Server) afterSuiteDidRun(writer http.ResponseWriter, request *http.Request) { - body := server.readAll(request) - var setupSummary *types.SetupSummary - json.Unmarshal(body, &setupSummary) - - for _, reporter := range server.reporters { - reporter.AfterSuiteDidRun(setupSummary) - } -} - -func (server *Server) specWillRun(writer http.ResponseWriter, request *http.Request) { - body := server.readAll(request) - var specSummary *types.SpecSummary - json.Unmarshal(body, &specSummary) - - for _, reporter := range server.reporters { - reporter.SpecWillRun(specSummary) - } -} - -func (server *Server) specDidComplete(writer http.ResponseWriter, request *http.Request) { - body := server.readAll(request) - var specSummary *types.SpecSummary - json.Unmarshal(body, &specSummary) - - for _, reporter := range server.reporters { - reporter.SpecDidComplete(specSummary) - } -} - -func (server *Server) specSuiteDidEnd(writer http.ResponseWriter, request *http.Request) { - body := server.readAll(request) - var suiteSummary *types.SuiteSummary - json.Unmarshal(body, &suiteSummary) - - for _, reporter := range server.reporters { - reporter.SpecSuiteDidEnd(suiteSummary) - } -} - -// -// Synchronization Endpoints -// - -func (server *Server) RegisterAlive(node int, alive func() bool) { - server.lock.Lock() - defer server.lock.Unlock() - server.alives[node-1] = alive -} - -func (server *Server) nodeIsAlive(node int) bool { - server.lock.Lock() - defer server.lock.Unlock() - alive := server.alives[node-1] - if alive == nil { - return true - } - return alive() -} - -func (server *Server) handleBeforeSuiteState(writer http.ResponseWriter, request *http.Request) { - if request.Method == "POST" { - dec := json.NewDecoder(request.Body) - dec.Decode(&(server.beforeSuiteData)) - } else { - beforeSuiteData := server.beforeSuiteData - if beforeSuiteData.State == types.RemoteBeforeSuiteStatePending && !server.nodeIsAlive(1) { - beforeSuiteData.State = types.RemoteBeforeSuiteStateDisappeared - } - enc := json.NewEncoder(writer) - enc.Encode(beforeSuiteData) - } -} - -func (server *Server) handleRemoteAfterSuiteData(writer http.ResponseWriter, request *http.Request) { - afterSuiteData := types.RemoteAfterSuiteData{ - CanRun: true, - } - for i := 2; i <= server.parallelTotal; i++ { - afterSuiteData.CanRun = afterSuiteData.CanRun && !server.nodeIsAlive(i) - } - - enc := json.NewEncoder(writer) - enc.Encode(afterSuiteData) -} - -func (server *Server) handleCounter(writer http.ResponseWriter, request *http.Request) { - c := spec_iterator.Counter{} - server.lock.Lock() - c.Index = server.counter - server.counter++ - server.lock.Unlock() - - json.NewEncoder(writer).Encode(c) -} - -func (server *Server) handleHasCounter(writer http.ResponseWriter, request *http.Request) { - writer.Write([]byte("")) -} diff --git a/vendor/github.com/onsi/ginkgo/internal/remote/syscall_dup_linux_arm64.go b/vendor/github.com/onsi/ginkgo/internal/remote/syscall_dup_linux_arm64.go deleted file mode 100644 index 9550d37b3..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/remote/syscall_dup_linux_arm64.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build linux,arm64 - -package remote - -import "syscall" - -// linux_arm64 doesn't have syscall.Dup2 which ginkgo uses, so -// use the nearly identical syscall.Dup3 instead -func syscallDup(oldfd int, newfd int) (err error) { - return syscall.Dup3(oldfd, newfd, 0) -} diff --git a/vendor/github.com/onsi/ginkgo/internal/remote/syscall_dup_solaris.go b/vendor/github.com/onsi/ginkgo/internal/remote/syscall_dup_solaris.go deleted file mode 100644 index 75ef7fb78..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/remote/syscall_dup_solaris.go +++ /dev/null @@ -1,9 +0,0 @@ -// +build solaris - -package remote - -import "golang.org/x/sys/unix" - -func syscallDup(oldfd int, newfd int) (err error) { - return unix.Dup2(oldfd, newfd) -} diff --git a/vendor/github.com/onsi/ginkgo/internal/remote/syscall_dup_unix.go b/vendor/github.com/onsi/ginkgo/internal/remote/syscall_dup_unix.go deleted file mode 100644 index ef6255960..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/remote/syscall_dup_unix.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build !linux !arm64 -// +build !windows -// +build !solaris - -package remote - -import "syscall" - -func syscallDup(oldfd int, newfd int) (err error) { - return syscall.Dup2(oldfd, newfd) -} diff --git a/vendor/github.com/onsi/ginkgo/internal/spec/spec.go b/vendor/github.com/onsi/ginkgo/internal/spec/spec.go deleted file mode 100644 index 6eef40a0e..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/spec/spec.go +++ /dev/null @@ -1,247 +0,0 @@ -package spec - -import ( - "fmt" - "io" - "time" - - "sync" - - "github.com/onsi/ginkgo/internal/containernode" - "github.com/onsi/ginkgo/internal/leafnodes" - "github.com/onsi/ginkgo/types" -) - -type Spec struct { - subject leafnodes.SubjectNode - focused bool - announceProgress bool - - containers []*containernode.ContainerNode - - state types.SpecState - runTime time.Duration - startTime time.Time - failure types.SpecFailure - previousFailures bool - - stateMutex *sync.Mutex -} - -func New(subject leafnodes.SubjectNode, containers []*containernode.ContainerNode, announceProgress bool) *Spec { - spec := &Spec{ - subject: subject, - containers: containers, - focused: subject.Flag() == types.FlagTypeFocused, - announceProgress: announceProgress, - stateMutex: &sync.Mutex{}, - } - - spec.processFlag(subject.Flag()) - for i := len(containers) - 1; i >= 0; i-- { - spec.processFlag(containers[i].Flag()) - } - - return spec -} - -func (spec *Spec) processFlag(flag types.FlagType) { - if flag == types.FlagTypeFocused { - spec.focused = true - } else if flag == types.FlagTypePending { - spec.setState(types.SpecStatePending) - } -} - -func (spec *Spec) Skip() { - spec.setState(types.SpecStateSkipped) -} - -func (spec *Spec) Failed() bool { - return spec.getState() == types.SpecStateFailed || spec.getState() == types.SpecStatePanicked || spec.getState() == types.SpecStateTimedOut -} - -func (spec *Spec) Passed() bool { - return spec.getState() == types.SpecStatePassed -} - -func (spec *Spec) Flaked() bool { - return spec.getState() == types.SpecStatePassed && spec.previousFailures -} - -func (spec *Spec) Pending() bool { - return spec.getState() == types.SpecStatePending -} - -func (spec *Spec) Skipped() bool { - return spec.getState() == types.SpecStateSkipped -} - -func (spec *Spec) Focused() bool { - return spec.focused -} - -func (spec *Spec) IsMeasurement() bool { - return spec.subject.Type() == types.SpecComponentTypeMeasure -} - -func (spec *Spec) Summary(suiteID string) *types.SpecSummary { - componentTexts := make([]string, len(spec.containers)+1) - componentCodeLocations := make([]types.CodeLocation, len(spec.containers)+1) - - for i, container := range spec.containers { - componentTexts[i] = container.Text() - componentCodeLocations[i] = container.CodeLocation() - } - - componentTexts[len(spec.containers)] = spec.subject.Text() - componentCodeLocations[len(spec.containers)] = spec.subject.CodeLocation() - - runTime := spec.runTime - if runTime == 0 && !spec.startTime.IsZero() { - runTime = time.Since(spec.startTime) - } - - return &types.SpecSummary{ - IsMeasurement: spec.IsMeasurement(), - NumberOfSamples: spec.subject.Samples(), - ComponentTexts: componentTexts, - ComponentCodeLocations: componentCodeLocations, - State: spec.getState(), - RunTime: runTime, - Failure: spec.failure, - Measurements: spec.measurementsReport(), - SuiteID: suiteID, - } -} - -func (spec *Spec) ConcatenatedString() string { - s := "" - for _, container := range spec.containers { - s += container.Text() + " " - } - - return s + spec.subject.Text() -} - -func (spec *Spec) Run(writer io.Writer) { - if spec.getState() == types.SpecStateFailed { - spec.previousFailures = true - } - - spec.startTime = time.Now() - defer func() { - spec.runTime = time.Since(spec.startTime) - }() - - for sample := 0; sample < spec.subject.Samples(); sample++ { - spec.runSample(sample, writer) - - if spec.getState() != types.SpecStatePassed { - return - } - } -} - -func (spec *Spec) getState() types.SpecState { - spec.stateMutex.Lock() - defer spec.stateMutex.Unlock() - return spec.state -} - -func (spec *Spec) setState(state types.SpecState) { - spec.stateMutex.Lock() - defer spec.stateMutex.Unlock() - spec.state = state -} - -func (spec *Spec) runSample(sample int, writer io.Writer) { - spec.setState(types.SpecStatePassed) - spec.failure = types.SpecFailure{} - innerMostContainerIndexToUnwind := -1 - - defer func() { - for i := innerMostContainerIndexToUnwind; i >= 0; i-- { - container := spec.containers[i] - for _, justAfterEach := range container.SetupNodesOfType(types.SpecComponentTypeJustAfterEach) { - spec.announceSetupNode(writer, "JustAfterEach", container, justAfterEach) - justAfterEachState, justAfterEachFailure := justAfterEach.Run() - if justAfterEachState != types.SpecStatePassed && spec.state == types.SpecStatePassed { - spec.state = justAfterEachState - spec.failure = justAfterEachFailure - } - } - } - - for i := innerMostContainerIndexToUnwind; i >= 0; i-- { - container := spec.containers[i] - for _, afterEach := range container.SetupNodesOfType(types.SpecComponentTypeAfterEach) { - spec.announceSetupNode(writer, "AfterEach", container, afterEach) - afterEachState, afterEachFailure := afterEach.Run() - if afterEachState != types.SpecStatePassed && spec.getState() == types.SpecStatePassed { - spec.setState(afterEachState) - spec.failure = afterEachFailure - } - } - } - }() - - for i, container := range spec.containers { - innerMostContainerIndexToUnwind = i - for _, beforeEach := range container.SetupNodesOfType(types.SpecComponentTypeBeforeEach) { - spec.announceSetupNode(writer, "BeforeEach", container, beforeEach) - s, f := beforeEach.Run() - spec.failure = f - spec.setState(s) - if spec.getState() != types.SpecStatePassed { - return - } - } - } - - for _, container := range spec.containers { - for _, justBeforeEach := range container.SetupNodesOfType(types.SpecComponentTypeJustBeforeEach) { - spec.announceSetupNode(writer, "JustBeforeEach", container, justBeforeEach) - s, f := justBeforeEach.Run() - spec.failure = f - spec.setState(s) - if spec.getState() != types.SpecStatePassed { - return - } - } - } - - spec.announceSubject(writer, spec.subject) - s, f := spec.subject.Run() - spec.failure = f - spec.setState(s) -} - -func (spec *Spec) announceSetupNode(writer io.Writer, nodeType string, container *containernode.ContainerNode, setupNode leafnodes.BasicNode) { - if spec.announceProgress { - s := fmt.Sprintf("[%s] %s\n %s\n", nodeType, container.Text(), setupNode.CodeLocation().String()) - writer.Write([]byte(s)) - } -} - -func (spec *Spec) announceSubject(writer io.Writer, subject leafnodes.SubjectNode) { - if spec.announceProgress { - nodeType := "" - switch subject.Type() { - case types.SpecComponentTypeIt: - nodeType = "It" - case types.SpecComponentTypeMeasure: - nodeType = "Measure" - } - s := fmt.Sprintf("[%s] %s\n %s\n", nodeType, subject.Text(), subject.CodeLocation().String()) - writer.Write([]byte(s)) - } -} - -func (spec *Spec) measurementsReport() map[string]*types.SpecMeasurement { - if !spec.IsMeasurement() || spec.Failed() { - return map[string]*types.SpecMeasurement{} - } - - return spec.subject.(*leafnodes.MeasureNode).MeasurementsReport() -} diff --git a/vendor/github.com/onsi/ginkgo/internal/spec/specs.go b/vendor/github.com/onsi/ginkgo/internal/spec/specs.go deleted file mode 100644 index 8a2007137..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/spec/specs.go +++ /dev/null @@ -1,144 +0,0 @@ -package spec - -import ( - "math/rand" - "regexp" - "sort" -) - -type Specs struct { - specs []*Spec - names []string - - hasProgrammaticFocus bool - RegexScansFilePath bool -} - -func NewSpecs(specs []*Spec) *Specs { - names := make([]string, len(specs)) - for i, spec := range specs { - names[i] = spec.ConcatenatedString() - } - return &Specs{ - specs: specs, - names: names, - } -} - -func (e *Specs) Specs() []*Spec { - return e.specs -} - -func (e *Specs) HasProgrammaticFocus() bool { - return e.hasProgrammaticFocus -} - -func (e *Specs) Shuffle(r *rand.Rand) { - sort.Sort(e) - permutation := r.Perm(len(e.specs)) - shuffledSpecs := make([]*Spec, len(e.specs)) - names := make([]string, len(e.specs)) - for i, j := range permutation { - shuffledSpecs[i] = e.specs[j] - names[i] = e.names[j] - } - e.specs = shuffledSpecs - e.names = names -} - -func (e *Specs) ApplyFocus(description string, focusString string, skipString string) { - if focusString == "" && skipString == "" { - e.applyProgrammaticFocus() - } else { - e.applyRegExpFocusAndSkip(description, focusString, skipString) - } -} - -func (e *Specs) applyProgrammaticFocus() { - e.hasProgrammaticFocus = false - for _, spec := range e.specs { - if spec.Focused() && !spec.Pending() { - e.hasProgrammaticFocus = true - break - } - } - - if e.hasProgrammaticFocus { - for _, spec := range e.specs { - if !spec.Focused() { - spec.Skip() - } - } - } -} - -// toMatch returns a byte[] to be used by regex matchers. When adding new behaviours to the matching function, -// this is the place which we append to. -func (e *Specs) toMatch(description string, i int) []byte { - if i > len(e.names) { - return nil - } - if e.RegexScansFilePath { - return []byte( - description + " " + - e.names[i] + " " + - e.specs[i].subject.CodeLocation().FileName) - } else { - return []byte( - description + " " + - e.names[i]) - } -} - -func (e *Specs) applyRegExpFocusAndSkip(description string, focusString string, skipString string) { - var focusFilter *regexp.Regexp - if focusString != "" { - focusFilter = regexp.MustCompile(focusString) - } - var skipFilter *regexp.Regexp - if skipString != "" { - skipFilter = regexp.MustCompile(skipString) - } - - for i, spec := range e.specs { - matchesFocus := true - matchesSkip := false - - toMatch := e.toMatch(description, i) - - if focusFilter != nil { - matchesFocus = focusFilter.Match(toMatch) - } - - if skipFilter != nil { - matchesSkip = skipFilter.Match(toMatch) - } - - if !matchesFocus || matchesSkip { - spec.Skip() - } - } -} - -func (e *Specs) SkipMeasurements() { - for _, spec := range e.specs { - if spec.IsMeasurement() { - spec.Skip() - } - } -} - -//sort.Interface - -func (e *Specs) Len() int { - return len(e.specs) -} - -func (e *Specs) Less(i, j int) bool { - return e.names[i] < e.names[j] -} - -func (e *Specs) Swap(i, j int) { - e.names[i], e.names[j] = e.names[j], e.names[i] - e.specs[i], e.specs[j] = e.specs[j], e.specs[i] -} diff --git a/vendor/github.com/onsi/ginkgo/internal/spec_iterator/index_computer.go b/vendor/github.com/onsi/ginkgo/internal/spec_iterator/index_computer.go deleted file mode 100644 index 82272554a..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/spec_iterator/index_computer.go +++ /dev/null @@ -1,55 +0,0 @@ -package spec_iterator - -func ParallelizedIndexRange(length int, parallelTotal int, parallelNode int) (startIndex int, count int) { - if length == 0 { - return 0, 0 - } - - // We have more nodes than tests. Trivial case. - if parallelTotal >= length { - if parallelNode > length { - return 0, 0 - } else { - return parallelNode - 1, 1 - } - } - - // This is the minimum amount of tests that a node will be required to run - minTestsPerNode := length / parallelTotal - - // This is the maximum amount of tests that a node will be required to run - // The algorithm guarantees that this would be equal to at least the minimum amount - // and at most one more - maxTestsPerNode := minTestsPerNode - if length%parallelTotal != 0 { - maxTestsPerNode++ - } - - // Number of nodes that will have to run the maximum amount of tests per node - numMaxLoadNodes := length % parallelTotal - - // Number of nodes that precede the current node and will have to run the maximum amount of tests per node - var numPrecedingMaxLoadNodes int - if parallelNode > numMaxLoadNodes { - numPrecedingMaxLoadNodes = numMaxLoadNodes - } else { - numPrecedingMaxLoadNodes = parallelNode - 1 - } - - // Number of nodes that precede the current node and will have to run the minimum amount of tests per node - var numPrecedingMinLoadNodes int - if parallelNode <= numMaxLoadNodes { - numPrecedingMinLoadNodes = 0 - } else { - numPrecedingMinLoadNodes = parallelNode - numMaxLoadNodes - 1 - } - - // Evaluate the test start index and number of tests to run - startIndex = numPrecedingMaxLoadNodes*maxTestsPerNode + numPrecedingMinLoadNodes*minTestsPerNode - if parallelNode > numMaxLoadNodes { - count = minTestsPerNode - } else { - count = maxTestsPerNode - } - return -} diff --git a/vendor/github.com/onsi/ginkgo/internal/spec_iterator/parallel_spec_iterator.go b/vendor/github.com/onsi/ginkgo/internal/spec_iterator/parallel_spec_iterator.go deleted file mode 100644 index 99f548bca..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/spec_iterator/parallel_spec_iterator.go +++ /dev/null @@ -1,59 +0,0 @@ -package spec_iterator - -import ( - "encoding/json" - "fmt" - "net/http" - - "github.com/onsi/ginkgo/internal/spec" -) - -type ParallelIterator struct { - specs []*spec.Spec - host string - client *http.Client -} - -func NewParallelIterator(specs []*spec.Spec, host string) *ParallelIterator { - return &ParallelIterator{ - specs: specs, - host: host, - client: &http.Client{}, - } -} - -func (s *ParallelIterator) Next() (*spec.Spec, error) { - resp, err := s.client.Get(s.host + "/counter") - if err != nil { - return nil, err - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("unexpected status code %d", resp.StatusCode) - } - - var counter Counter - err = json.NewDecoder(resp.Body).Decode(&counter) - if err != nil { - return nil, err - } - - if counter.Index >= len(s.specs) { - return nil, ErrClosed - } - - return s.specs[counter.Index], nil -} - -func (s *ParallelIterator) NumberOfSpecsPriorToIteration() int { - return len(s.specs) -} - -func (s *ParallelIterator) NumberOfSpecsToProcessIfKnown() (int, bool) { - return -1, false -} - -func (s *ParallelIterator) NumberOfSpecsThatWillBeRunIfKnown() (int, bool) { - return -1, false -} diff --git a/vendor/github.com/onsi/ginkgo/internal/spec_iterator/serial_spec_iterator.go b/vendor/github.com/onsi/ginkgo/internal/spec_iterator/serial_spec_iterator.go deleted file mode 100644 index a51c93b8b..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/spec_iterator/serial_spec_iterator.go +++ /dev/null @@ -1,45 +0,0 @@ -package spec_iterator - -import ( - "github.com/onsi/ginkgo/internal/spec" -) - -type SerialIterator struct { - specs []*spec.Spec - index int -} - -func NewSerialIterator(specs []*spec.Spec) *SerialIterator { - return &SerialIterator{ - specs: specs, - index: 0, - } -} - -func (s *SerialIterator) Next() (*spec.Spec, error) { - if s.index >= len(s.specs) { - return nil, ErrClosed - } - - spec := s.specs[s.index] - s.index += 1 - return spec, nil -} - -func (s *SerialIterator) NumberOfSpecsPriorToIteration() int { - return len(s.specs) -} - -func (s *SerialIterator) NumberOfSpecsToProcessIfKnown() (int, bool) { - return len(s.specs), true -} - -func (s *SerialIterator) NumberOfSpecsThatWillBeRunIfKnown() (int, bool) { - count := 0 - for _, s := range s.specs { - if !s.Skipped() && !s.Pending() { - count += 1 - } - } - return count, true -} diff --git a/vendor/github.com/onsi/ginkgo/internal/spec_iterator/sharded_parallel_spec_iterator.go b/vendor/github.com/onsi/ginkgo/internal/spec_iterator/sharded_parallel_spec_iterator.go deleted file mode 100644 index ad4a3ea3c..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/spec_iterator/sharded_parallel_spec_iterator.go +++ /dev/null @@ -1,47 +0,0 @@ -package spec_iterator - -import "github.com/onsi/ginkgo/internal/spec" - -type ShardedParallelIterator struct { - specs []*spec.Spec - index int - maxIndex int -} - -func NewShardedParallelIterator(specs []*spec.Spec, total int, node int) *ShardedParallelIterator { - startIndex, count := ParallelizedIndexRange(len(specs), total, node) - - return &ShardedParallelIterator{ - specs: specs, - index: startIndex, - maxIndex: startIndex + count, - } -} - -func (s *ShardedParallelIterator) Next() (*spec.Spec, error) { - if s.index >= s.maxIndex { - return nil, ErrClosed - } - - spec := s.specs[s.index] - s.index += 1 - return spec, nil -} - -func (s *ShardedParallelIterator) NumberOfSpecsPriorToIteration() int { - return len(s.specs) -} - -func (s *ShardedParallelIterator) NumberOfSpecsToProcessIfKnown() (int, bool) { - return s.maxIndex - s.index, true -} - -func (s *ShardedParallelIterator) NumberOfSpecsThatWillBeRunIfKnown() (int, bool) { - count := 0 - for i := s.index; i < s.maxIndex; i += 1 { - if !s.specs[i].Skipped() && !s.specs[i].Pending() { - count += 1 - } - } - return count, true -} diff --git a/vendor/github.com/onsi/ginkgo/internal/spec_iterator/spec_iterator.go b/vendor/github.com/onsi/ginkgo/internal/spec_iterator/spec_iterator.go deleted file mode 100644 index 74bffad64..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/spec_iterator/spec_iterator.go +++ /dev/null @@ -1,20 +0,0 @@ -package spec_iterator - -import ( - "errors" - - "github.com/onsi/ginkgo/internal/spec" -) - -var ErrClosed = errors.New("no more specs to run") - -type SpecIterator interface { - Next() (*spec.Spec, error) - NumberOfSpecsPriorToIteration() int - NumberOfSpecsToProcessIfKnown() (int, bool) - NumberOfSpecsThatWillBeRunIfKnown() (int, bool) -} - -type Counter struct { - Index int `json:"index"` -} diff --git a/vendor/github.com/onsi/ginkgo/internal/specrunner/random_id.go b/vendor/github.com/onsi/ginkgo/internal/specrunner/random_id.go deleted file mode 100644 index a0b8b62d5..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/specrunner/random_id.go +++ /dev/null @@ -1,15 +0,0 @@ -package specrunner - -import ( - "crypto/rand" - "fmt" -) - -func randomID() string { - b := make([]byte, 8) - _, err := rand.Read(b) - if err != nil { - return "" - } - return fmt.Sprintf("%x-%x-%x-%x", b[0:2], b[2:4], b[4:6], b[6:8]) -} diff --git a/vendor/github.com/onsi/ginkgo/internal/specrunner/spec_runner.go b/vendor/github.com/onsi/ginkgo/internal/specrunner/spec_runner.go deleted file mode 100644 index c9a0a60d8..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/specrunner/spec_runner.go +++ /dev/null @@ -1,411 +0,0 @@ -package specrunner - -import ( - "fmt" - "os" - "os/signal" - "sync" - "syscall" - - "github.com/onsi/ginkgo/internal/spec_iterator" - - "github.com/onsi/ginkgo/config" - "github.com/onsi/ginkgo/internal/leafnodes" - "github.com/onsi/ginkgo/internal/spec" - Writer "github.com/onsi/ginkgo/internal/writer" - "github.com/onsi/ginkgo/reporters" - "github.com/onsi/ginkgo/types" - - "time" -) - -type SpecRunner struct { - description string - beforeSuiteNode leafnodes.SuiteNode - iterator spec_iterator.SpecIterator - afterSuiteNode leafnodes.SuiteNode - reporters []reporters.Reporter - startTime time.Time - suiteID string - runningSpec *spec.Spec - writer Writer.WriterInterface - config config.GinkgoConfigType - interrupted bool - processedSpecs []*spec.Spec - lock *sync.Mutex -} - -func New(description string, beforeSuiteNode leafnodes.SuiteNode, iterator spec_iterator.SpecIterator, afterSuiteNode leafnodes.SuiteNode, reporters []reporters.Reporter, writer Writer.WriterInterface, config config.GinkgoConfigType) *SpecRunner { - return &SpecRunner{ - description: description, - beforeSuiteNode: beforeSuiteNode, - iterator: iterator, - afterSuiteNode: afterSuiteNode, - reporters: reporters, - writer: writer, - config: config, - suiteID: randomID(), - lock: &sync.Mutex{}, - } -} - -func (runner *SpecRunner) Run() bool { - if runner.config.DryRun { - runner.performDryRun() - return true - } - - runner.reportSuiteWillBegin() - signalRegistered := make(chan struct{}) - go runner.registerForInterrupts(signalRegistered) - <-signalRegistered - - suitePassed := runner.runBeforeSuite() - - if suitePassed { - suitePassed = runner.runSpecs() - } - - runner.blockForeverIfInterrupted() - - suitePassed = runner.runAfterSuite() && suitePassed - - runner.reportSuiteDidEnd(suitePassed) - - return suitePassed -} - -func (runner *SpecRunner) performDryRun() { - runner.reportSuiteWillBegin() - - if runner.beforeSuiteNode != nil { - summary := runner.beforeSuiteNode.Summary() - summary.State = types.SpecStatePassed - runner.reportBeforeSuite(summary) - } - - for { - spec, err := runner.iterator.Next() - if err == spec_iterator.ErrClosed { - break - } - if err != nil { - fmt.Println("failed to iterate over tests:\n" + err.Error()) - break - } - - runner.processedSpecs = append(runner.processedSpecs, spec) - - summary := spec.Summary(runner.suiteID) - runner.reportSpecWillRun(summary) - if summary.State == types.SpecStateInvalid { - summary.State = types.SpecStatePassed - } - runner.reportSpecDidComplete(summary, false) - } - - if runner.afterSuiteNode != nil { - summary := runner.afterSuiteNode.Summary() - summary.State = types.SpecStatePassed - runner.reportAfterSuite(summary) - } - - runner.reportSuiteDidEnd(true) -} - -func (runner *SpecRunner) runBeforeSuite() bool { - if runner.beforeSuiteNode == nil || runner.wasInterrupted() { - return true - } - - runner.writer.Truncate() - conf := runner.config - passed := runner.beforeSuiteNode.Run(conf.ParallelNode, conf.ParallelTotal, conf.SyncHost) - if !passed { - runner.writer.DumpOut() - } - runner.reportBeforeSuite(runner.beforeSuiteNode.Summary()) - return passed -} - -func (runner *SpecRunner) runAfterSuite() bool { - if runner.afterSuiteNode == nil { - return true - } - - runner.writer.Truncate() - conf := runner.config - passed := runner.afterSuiteNode.Run(conf.ParallelNode, conf.ParallelTotal, conf.SyncHost) - if !passed { - runner.writer.DumpOut() - } - runner.reportAfterSuite(runner.afterSuiteNode.Summary()) - return passed -} - -func (runner *SpecRunner) runSpecs() bool { - suiteFailed := false - skipRemainingSpecs := false - for { - spec, err := runner.iterator.Next() - if err == spec_iterator.ErrClosed { - break - } - if err != nil { - fmt.Println("failed to iterate over tests:\n" + err.Error()) - suiteFailed = true - break - } - - runner.processedSpecs = append(runner.processedSpecs, spec) - - if runner.wasInterrupted() { - break - } - if skipRemainingSpecs { - spec.Skip() - } - - if !spec.Skipped() && !spec.Pending() { - if passed := runner.runSpec(spec); !passed { - suiteFailed = true - } - } else if spec.Pending() && runner.config.FailOnPending { - runner.reportSpecWillRun(spec.Summary(runner.suiteID)) - suiteFailed = true - runner.reportSpecDidComplete(spec.Summary(runner.suiteID), spec.Failed()) - } else { - runner.reportSpecWillRun(spec.Summary(runner.suiteID)) - runner.reportSpecDidComplete(spec.Summary(runner.suiteID), spec.Failed()) - } - - if spec.Failed() && runner.config.FailFast { - skipRemainingSpecs = true - } - } - - return !suiteFailed -} - -func (runner *SpecRunner) runSpec(spec *spec.Spec) (passed bool) { - maxAttempts := 1 - if runner.config.FlakeAttempts > 0 { - // uninitialized configs count as 1 - maxAttempts = runner.config.FlakeAttempts - } - - for i := 0; i < maxAttempts; i++ { - runner.reportSpecWillRun(spec.Summary(runner.suiteID)) - runner.runningSpec = spec - spec.Run(runner.writer) - runner.runningSpec = nil - runner.reportSpecDidComplete(spec.Summary(runner.suiteID), spec.Failed()) - if !spec.Failed() { - return true - } - } - return false -} - -func (runner *SpecRunner) CurrentSpecSummary() (*types.SpecSummary, bool) { - if runner.runningSpec == nil { - return nil, false - } - - return runner.runningSpec.Summary(runner.suiteID), true -} - -func (runner *SpecRunner) registerForInterrupts(signalRegistered chan struct{}) { - c := make(chan os.Signal, 1) - signal.Notify(c, os.Interrupt, syscall.SIGTERM) - close(signalRegistered) - - <-c - signal.Stop(c) - runner.markInterrupted() - go runner.registerForHardInterrupts() - runner.writer.DumpOutWithHeader(` -Received interrupt. Emitting contents of GinkgoWriter... ---------------------------------------------------------- -`) - if runner.afterSuiteNode != nil { - fmt.Fprint(os.Stderr, ` ---------------------------------------------------------- -Received interrupt. Running AfterSuite... -^C again to terminate immediately -`) - runner.runAfterSuite() - } - runner.reportSuiteDidEnd(false) - os.Exit(1) -} - -func (runner *SpecRunner) registerForHardInterrupts() { - c := make(chan os.Signal, 1) - signal.Notify(c, os.Interrupt, syscall.SIGTERM) - - <-c - fmt.Fprintln(os.Stderr, "\nReceived second interrupt. Shutting down.") - os.Exit(1) -} - -func (runner *SpecRunner) blockForeverIfInterrupted() { - runner.lock.Lock() - interrupted := runner.interrupted - runner.lock.Unlock() - - if interrupted { - select {} - } -} - -func (runner *SpecRunner) markInterrupted() { - runner.lock.Lock() - defer runner.lock.Unlock() - runner.interrupted = true -} - -func (runner *SpecRunner) wasInterrupted() bool { - runner.lock.Lock() - defer runner.lock.Unlock() - return runner.interrupted -} - -func (runner *SpecRunner) reportSuiteWillBegin() { - runner.startTime = time.Now() - summary := runner.suiteWillBeginSummary() - for _, reporter := range runner.reporters { - reporter.SpecSuiteWillBegin(runner.config, summary) - } -} - -func (runner *SpecRunner) reportBeforeSuite(summary *types.SetupSummary) { - for _, reporter := range runner.reporters { - reporter.BeforeSuiteDidRun(summary) - } -} - -func (runner *SpecRunner) reportAfterSuite(summary *types.SetupSummary) { - for _, reporter := range runner.reporters { - reporter.AfterSuiteDidRun(summary) - } -} - -func (runner *SpecRunner) reportSpecWillRun(summary *types.SpecSummary) { - runner.writer.Truncate() - - for _, reporter := range runner.reporters { - reporter.SpecWillRun(summary) - } -} - -func (runner *SpecRunner) reportSpecDidComplete(summary *types.SpecSummary, failed bool) { - if len(summary.CapturedOutput) == 0 { - summary.CapturedOutput = string(runner.writer.Bytes()) - } - for i := len(runner.reporters) - 1; i >= 1; i-- { - runner.reporters[i].SpecDidComplete(summary) - } - - if failed { - runner.writer.DumpOut() - } - - runner.reporters[0].SpecDidComplete(summary) -} - -func (runner *SpecRunner) reportSuiteDidEnd(success bool) { - summary := runner.suiteDidEndSummary(success) - summary.RunTime = time.Since(runner.startTime) - for _, reporter := range runner.reporters { - reporter.SpecSuiteDidEnd(summary) - } -} - -func (runner *SpecRunner) countSpecsThatRanSatisfying(filter func(ex *spec.Spec) bool) (count int) { - count = 0 - - for _, spec := range runner.processedSpecs { - if filter(spec) { - count++ - } - } - - return count -} - -func (runner *SpecRunner) suiteDidEndSummary(success bool) *types.SuiteSummary { - numberOfSpecsThatWillBeRun := runner.countSpecsThatRanSatisfying(func(ex *spec.Spec) bool { - return !ex.Skipped() && !ex.Pending() - }) - - numberOfPendingSpecs := runner.countSpecsThatRanSatisfying(func(ex *spec.Spec) bool { - return ex.Pending() - }) - - numberOfSkippedSpecs := runner.countSpecsThatRanSatisfying(func(ex *spec.Spec) bool { - return ex.Skipped() - }) - - numberOfPassedSpecs := runner.countSpecsThatRanSatisfying(func(ex *spec.Spec) bool { - return ex.Passed() - }) - - numberOfFlakedSpecs := runner.countSpecsThatRanSatisfying(func(ex *spec.Spec) bool { - return ex.Flaked() - }) - - numberOfFailedSpecs := runner.countSpecsThatRanSatisfying(func(ex *spec.Spec) bool { - return ex.Failed() - }) - - if runner.beforeSuiteNode != nil && !runner.beforeSuiteNode.Passed() && !runner.config.DryRun { - var known bool - numberOfSpecsThatWillBeRun, known = runner.iterator.NumberOfSpecsThatWillBeRunIfKnown() - if !known { - numberOfSpecsThatWillBeRun = runner.iterator.NumberOfSpecsPriorToIteration() - } - numberOfFailedSpecs = numberOfSpecsThatWillBeRun - } - - return &types.SuiteSummary{ - SuiteDescription: runner.description, - SuiteSucceeded: success, - SuiteID: runner.suiteID, - - NumberOfSpecsBeforeParallelization: runner.iterator.NumberOfSpecsPriorToIteration(), - NumberOfTotalSpecs: len(runner.processedSpecs), - NumberOfSpecsThatWillBeRun: numberOfSpecsThatWillBeRun, - NumberOfPendingSpecs: numberOfPendingSpecs, - NumberOfSkippedSpecs: numberOfSkippedSpecs, - NumberOfPassedSpecs: numberOfPassedSpecs, - NumberOfFailedSpecs: numberOfFailedSpecs, - NumberOfFlakedSpecs: numberOfFlakedSpecs, - } -} - -func (runner *SpecRunner) suiteWillBeginSummary() *types.SuiteSummary { - numTotal, known := runner.iterator.NumberOfSpecsToProcessIfKnown() - if !known { - numTotal = -1 - } - - numToRun, known := runner.iterator.NumberOfSpecsThatWillBeRunIfKnown() - if !known { - numToRun = -1 - } - - return &types.SuiteSummary{ - SuiteDescription: runner.description, - SuiteID: runner.suiteID, - - NumberOfSpecsBeforeParallelization: runner.iterator.NumberOfSpecsPriorToIteration(), - NumberOfTotalSpecs: numTotal, - NumberOfSpecsThatWillBeRun: numToRun, - NumberOfPendingSpecs: -1, - NumberOfSkippedSpecs: -1, - NumberOfPassedSpecs: -1, - NumberOfFailedSpecs: -1, - NumberOfFlakedSpecs: -1, - } -} diff --git a/vendor/github.com/onsi/ginkgo/internal/suite/suite.go b/vendor/github.com/onsi/ginkgo/internal/suite/suite.go deleted file mode 100644 index 3104bbc88..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/suite/suite.go +++ /dev/null @@ -1,190 +0,0 @@ -package suite - -import ( - "math/rand" - "net/http" - "time" - - "github.com/onsi/ginkgo/internal/spec_iterator" - - "github.com/onsi/ginkgo/config" - "github.com/onsi/ginkgo/internal/containernode" - "github.com/onsi/ginkgo/internal/failer" - "github.com/onsi/ginkgo/internal/leafnodes" - "github.com/onsi/ginkgo/internal/spec" - "github.com/onsi/ginkgo/internal/specrunner" - "github.com/onsi/ginkgo/internal/writer" - "github.com/onsi/ginkgo/reporters" - "github.com/onsi/ginkgo/types" -) - -type ginkgoTestingT interface { - Fail() -} - -type Suite struct { - topLevelContainer *containernode.ContainerNode - currentContainer *containernode.ContainerNode - containerIndex int - beforeSuiteNode leafnodes.SuiteNode - afterSuiteNode leafnodes.SuiteNode - runner *specrunner.SpecRunner - failer *failer.Failer - running bool -} - -func New(failer *failer.Failer) *Suite { - topLevelContainer := containernode.New("[Top Level]", types.FlagTypeNone, types.CodeLocation{}) - - return &Suite{ - topLevelContainer: topLevelContainer, - currentContainer: topLevelContainer, - failer: failer, - containerIndex: 1, - } -} - -func (suite *Suite) Run(t ginkgoTestingT, description string, reporters []reporters.Reporter, writer writer.WriterInterface, config config.GinkgoConfigType) (bool, bool) { - if config.ParallelTotal < 1 { - panic("ginkgo.parallel.total must be >= 1") - } - - if config.ParallelNode > config.ParallelTotal || config.ParallelNode < 1 { - panic("ginkgo.parallel.node is one-indexed and must be <= ginkgo.parallel.total") - } - - r := rand.New(rand.NewSource(config.RandomSeed)) - suite.topLevelContainer.Shuffle(r) - iterator, hasProgrammaticFocus := suite.generateSpecsIterator(description, config) - suite.runner = specrunner.New(description, suite.beforeSuiteNode, iterator, suite.afterSuiteNode, reporters, writer, config) - - suite.running = true - success := suite.runner.Run() - if !success { - t.Fail() - } - return success, hasProgrammaticFocus -} - -func (suite *Suite) generateSpecsIterator(description string, config config.GinkgoConfigType) (spec_iterator.SpecIterator, bool) { - specsSlice := []*spec.Spec{} - suite.topLevelContainer.BackPropagateProgrammaticFocus() - for _, collatedNodes := range suite.topLevelContainer.Collate() { - specsSlice = append(specsSlice, spec.New(collatedNodes.Subject, collatedNodes.Containers, config.EmitSpecProgress)) - } - - specs := spec.NewSpecs(specsSlice) - specs.RegexScansFilePath = config.RegexScansFilePath - - if config.RandomizeAllSpecs { - specs.Shuffle(rand.New(rand.NewSource(config.RandomSeed))) - } - - specs.ApplyFocus(description, config.FocusString, config.SkipString) - - if config.SkipMeasurements { - specs.SkipMeasurements() - } - - var iterator spec_iterator.SpecIterator - - if config.ParallelTotal > 1 { - iterator = spec_iterator.NewParallelIterator(specs.Specs(), config.SyncHost) - resp, err := http.Get(config.SyncHost + "/has-counter") - if err != nil || resp.StatusCode != http.StatusOK { - iterator = spec_iterator.NewShardedParallelIterator(specs.Specs(), config.ParallelTotal, config.ParallelNode) - } - } else { - iterator = spec_iterator.NewSerialIterator(specs.Specs()) - } - - return iterator, specs.HasProgrammaticFocus() -} - -func (suite *Suite) CurrentRunningSpecSummary() (*types.SpecSummary, bool) { - return suite.runner.CurrentSpecSummary() -} - -func (suite *Suite) SetBeforeSuiteNode(body interface{}, codeLocation types.CodeLocation, timeout time.Duration) { - if suite.beforeSuiteNode != nil { - panic("You may only call BeforeSuite once!") - } - suite.beforeSuiteNode = leafnodes.NewBeforeSuiteNode(body, codeLocation, timeout, suite.failer) -} - -func (suite *Suite) SetAfterSuiteNode(body interface{}, codeLocation types.CodeLocation, timeout time.Duration) { - if suite.afterSuiteNode != nil { - panic("You may only call AfterSuite once!") - } - suite.afterSuiteNode = leafnodes.NewAfterSuiteNode(body, codeLocation, timeout, suite.failer) -} - -func (suite *Suite) SetSynchronizedBeforeSuiteNode(bodyA interface{}, bodyB interface{}, codeLocation types.CodeLocation, timeout time.Duration) { - if suite.beforeSuiteNode != nil { - panic("You may only call BeforeSuite once!") - } - suite.beforeSuiteNode = leafnodes.NewSynchronizedBeforeSuiteNode(bodyA, bodyB, codeLocation, timeout, suite.failer) -} - -func (suite *Suite) SetSynchronizedAfterSuiteNode(bodyA interface{}, bodyB interface{}, codeLocation types.CodeLocation, timeout time.Duration) { - if suite.afterSuiteNode != nil { - panic("You may only call AfterSuite once!") - } - suite.afterSuiteNode = leafnodes.NewSynchronizedAfterSuiteNode(bodyA, bodyB, codeLocation, timeout, suite.failer) -} - -func (suite *Suite) PushContainerNode(text string, body func(), flag types.FlagType, codeLocation types.CodeLocation) { - container := containernode.New(text, flag, codeLocation) - suite.currentContainer.PushContainerNode(container) - - previousContainer := suite.currentContainer - suite.currentContainer = container - suite.containerIndex++ - - body() - - suite.containerIndex-- - suite.currentContainer = previousContainer -} - -func (suite *Suite) PushItNode(text string, body interface{}, flag types.FlagType, codeLocation types.CodeLocation, timeout time.Duration) { - if suite.running { - suite.failer.Fail("You may only call It from within a Describe, Context or When", codeLocation) - } - suite.currentContainer.PushSubjectNode(leafnodes.NewItNode(text, body, flag, codeLocation, timeout, suite.failer, suite.containerIndex)) -} - -func (suite *Suite) PushMeasureNode(text string, body interface{}, flag types.FlagType, codeLocation types.CodeLocation, samples int) { - if suite.running { - suite.failer.Fail("You may only call Measure from within a Describe, Context or When", codeLocation) - } - suite.currentContainer.PushSubjectNode(leafnodes.NewMeasureNode(text, body, flag, codeLocation, samples, suite.failer, suite.containerIndex)) -} - -func (suite *Suite) PushBeforeEachNode(body interface{}, codeLocation types.CodeLocation, timeout time.Duration) { - if suite.running { - suite.failer.Fail("You may only call BeforeEach from within a Describe, Context or When", codeLocation) - } - suite.currentContainer.PushSetupNode(leafnodes.NewBeforeEachNode(body, codeLocation, timeout, suite.failer, suite.containerIndex)) -} - -func (suite *Suite) PushJustBeforeEachNode(body interface{}, codeLocation types.CodeLocation, timeout time.Duration) { - if suite.running { - suite.failer.Fail("You may only call JustBeforeEach from within a Describe, Context or When", codeLocation) - } - suite.currentContainer.PushSetupNode(leafnodes.NewJustBeforeEachNode(body, codeLocation, timeout, suite.failer, suite.containerIndex)) -} - -func (suite *Suite) PushJustAfterEachNode(body interface{}, codeLocation types.CodeLocation, timeout time.Duration) { - if suite.running { - suite.failer.Fail("You may only call JustAfterEach from within a Describe or Context", codeLocation) - } - suite.currentContainer.PushSetupNode(leafnodes.NewJustAfterEachNode(body, codeLocation, timeout, suite.failer, suite.containerIndex)) -} - -func (suite *Suite) PushAfterEachNode(body interface{}, codeLocation types.CodeLocation, timeout time.Duration) { - if suite.running { - suite.failer.Fail("You may only call AfterEach from within a Describe, Context or When", codeLocation) - } - suite.currentContainer.PushSetupNode(leafnodes.NewAfterEachNode(body, codeLocation, timeout, suite.failer, suite.containerIndex)) -} diff --git a/vendor/github.com/onsi/ginkgo/internal/testingtproxy/testing_t_proxy.go b/vendor/github.com/onsi/ginkgo/internal/testingtproxy/testing_t_proxy.go deleted file mode 100644 index 090445d08..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/testingtproxy/testing_t_proxy.go +++ /dev/null @@ -1,76 +0,0 @@ -package testingtproxy - -import ( - "fmt" - "io" -) - -type failFunc func(message string, callerSkip ...int) - -func New(writer io.Writer, fail failFunc, offset int) *ginkgoTestingTProxy { - return &ginkgoTestingTProxy{ - fail: fail, - offset: offset, - writer: writer, - } -} - -type ginkgoTestingTProxy struct { - fail failFunc - offset int - writer io.Writer -} - -func (t *ginkgoTestingTProxy) Error(args ...interface{}) { - t.fail(fmt.Sprintln(args...), t.offset) -} - -func (t *ginkgoTestingTProxy) Errorf(format string, args ...interface{}) { - t.fail(fmt.Sprintf(format, args...), t.offset) -} - -func (t *ginkgoTestingTProxy) Fail() { - t.fail("failed", t.offset) -} - -func (t *ginkgoTestingTProxy) FailNow() { - t.fail("failed", t.offset) -} - -func (t *ginkgoTestingTProxy) Fatal(args ...interface{}) { - t.fail(fmt.Sprintln(args...), t.offset) -} - -func (t *ginkgoTestingTProxy) Fatalf(format string, args ...interface{}) { - t.fail(fmt.Sprintf(format, args...), t.offset) -} - -func (t *ginkgoTestingTProxy) Log(args ...interface{}) { - fmt.Fprintln(t.writer, args...) -} - -func (t *ginkgoTestingTProxy) Logf(format string, args ...interface{}) { - t.Log(fmt.Sprintf(format, args...)) -} - -func (t *ginkgoTestingTProxy) Failed() bool { - return false -} - -func (t *ginkgoTestingTProxy) Parallel() { -} - -func (t *ginkgoTestingTProxy) Skip(args ...interface{}) { - fmt.Println(args...) -} - -func (t *ginkgoTestingTProxy) Skipf(format string, args ...interface{}) { - t.Skip(fmt.Sprintf(format, args...)) -} - -func (t *ginkgoTestingTProxy) SkipNow() { -} - -func (t *ginkgoTestingTProxy) Skipped() bool { - return false -} diff --git a/vendor/github.com/onsi/ginkgo/internal/writer/fake_writer.go b/vendor/github.com/onsi/ginkgo/internal/writer/fake_writer.go deleted file mode 100644 index 6739c3f60..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/writer/fake_writer.go +++ /dev/null @@ -1,36 +0,0 @@ -package writer - -type FakeGinkgoWriter struct { - EventStream []string -} - -func NewFake() *FakeGinkgoWriter { - return &FakeGinkgoWriter{ - EventStream: []string{}, - } -} - -func (writer *FakeGinkgoWriter) AddEvent(event string) { - writer.EventStream = append(writer.EventStream, event) -} - -func (writer *FakeGinkgoWriter) Truncate() { - writer.EventStream = append(writer.EventStream, "TRUNCATE") -} - -func (writer *FakeGinkgoWriter) DumpOut() { - writer.EventStream = append(writer.EventStream, "DUMP") -} - -func (writer *FakeGinkgoWriter) DumpOutWithHeader(header string) { - writer.EventStream = append(writer.EventStream, "DUMP_WITH_HEADER: "+header) -} - -func (writer *FakeGinkgoWriter) Bytes() []byte { - writer.EventStream = append(writer.EventStream, "BYTES") - return nil -} - -func (writer *FakeGinkgoWriter) Write(data []byte) (n int, err error) { - return 0, nil -} diff --git a/vendor/github.com/onsi/ginkgo/internal/writer/writer.go b/vendor/github.com/onsi/ginkgo/internal/writer/writer.go deleted file mode 100644 index 98eca3bdd..000000000 --- a/vendor/github.com/onsi/ginkgo/internal/writer/writer.go +++ /dev/null @@ -1,89 +0,0 @@ -package writer - -import ( - "bytes" - "io" - "sync" -) - -type WriterInterface interface { - io.Writer - - Truncate() - DumpOut() - DumpOutWithHeader(header string) - Bytes() []byte -} - -type Writer struct { - buffer *bytes.Buffer - outWriter io.Writer - lock *sync.Mutex - stream bool - redirector io.Writer -} - -func New(outWriter io.Writer) *Writer { - return &Writer{ - buffer: &bytes.Buffer{}, - lock: &sync.Mutex{}, - outWriter: outWriter, - stream: true, - } -} - -func (w *Writer) AndRedirectTo(writer io.Writer) { - w.redirector = writer -} - -func (w *Writer) SetStream(stream bool) { - w.lock.Lock() - defer w.lock.Unlock() - w.stream = stream -} - -func (w *Writer) Write(b []byte) (n int, err error) { - w.lock.Lock() - defer w.lock.Unlock() - - n, err = w.buffer.Write(b) - if w.redirector != nil { - w.redirector.Write(b) - } - if w.stream { - return w.outWriter.Write(b) - } - return n, err -} - -func (w *Writer) Truncate() { - w.lock.Lock() - defer w.lock.Unlock() - w.buffer.Reset() -} - -func (w *Writer) DumpOut() { - w.lock.Lock() - defer w.lock.Unlock() - if !w.stream { - w.buffer.WriteTo(w.outWriter) - } -} - -func (w *Writer) Bytes() []byte { - w.lock.Lock() - defer w.lock.Unlock() - b := w.buffer.Bytes() - copied := make([]byte, len(b)) - copy(copied, b) - return copied -} - -func (w *Writer) DumpOutWithHeader(header string) { - w.lock.Lock() - defer w.lock.Unlock() - if !w.stream && w.buffer.Len() > 0 { - w.outWriter.Write([]byte(header)) - w.buffer.WriteTo(w.outWriter) - } -} diff --git a/vendor/github.com/onsi/ginkgo/reporters/default_reporter.go b/vendor/github.com/onsi/ginkgo/reporters/default_reporter.go deleted file mode 100644 index c76283b46..000000000 --- a/vendor/github.com/onsi/ginkgo/reporters/default_reporter.go +++ /dev/null @@ -1,87 +0,0 @@ -/* -Ginkgo's Default Reporter - -A number of command line flags are available to tweak Ginkgo's default output. - -These are documented [here](http://onsi.github.io/ginkgo/#running_tests) -*/ -package reporters - -import ( - "github.com/onsi/ginkgo/config" - "github.com/onsi/ginkgo/reporters/stenographer" - "github.com/onsi/ginkgo/types" -) - -type DefaultReporter struct { - config config.DefaultReporterConfigType - stenographer stenographer.Stenographer - specSummaries []*types.SpecSummary -} - -func NewDefaultReporter(config config.DefaultReporterConfigType, stenographer stenographer.Stenographer) *DefaultReporter { - return &DefaultReporter{ - config: config, - stenographer: stenographer, - } -} - -func (reporter *DefaultReporter) SpecSuiteWillBegin(config config.GinkgoConfigType, summary *types.SuiteSummary) { - reporter.stenographer.AnnounceSuite(summary.SuiteDescription, config.RandomSeed, config.RandomizeAllSpecs, reporter.config.Succinct) - if config.ParallelTotal > 1 { - reporter.stenographer.AnnounceParallelRun(config.ParallelNode, config.ParallelTotal, reporter.config.Succinct) - } else { - reporter.stenographer.AnnounceNumberOfSpecs(summary.NumberOfSpecsThatWillBeRun, summary.NumberOfTotalSpecs, reporter.config.Succinct) - } -} - -func (reporter *DefaultReporter) BeforeSuiteDidRun(setupSummary *types.SetupSummary) { - if setupSummary.State != types.SpecStatePassed { - reporter.stenographer.AnnounceBeforeSuiteFailure(setupSummary, reporter.config.Succinct, reporter.config.FullTrace) - } -} - -func (reporter *DefaultReporter) AfterSuiteDidRun(setupSummary *types.SetupSummary) { - if setupSummary.State != types.SpecStatePassed { - reporter.stenographer.AnnounceAfterSuiteFailure(setupSummary, reporter.config.Succinct, reporter.config.FullTrace) - } -} - -func (reporter *DefaultReporter) SpecWillRun(specSummary *types.SpecSummary) { - if reporter.config.Verbose && !reporter.config.Succinct && specSummary.State != types.SpecStatePending && specSummary.State != types.SpecStateSkipped { - reporter.stenographer.AnnounceSpecWillRun(specSummary) - } -} - -func (reporter *DefaultReporter) SpecDidComplete(specSummary *types.SpecSummary) { - switch specSummary.State { - case types.SpecStatePassed: - if specSummary.IsMeasurement { - reporter.stenographer.AnnounceSuccesfulMeasurement(specSummary, reporter.config.Succinct) - } else if specSummary.RunTime.Seconds() >= reporter.config.SlowSpecThreshold { - reporter.stenographer.AnnounceSuccesfulSlowSpec(specSummary, reporter.config.Succinct) - } else { - reporter.stenographer.AnnounceSuccesfulSpec(specSummary) - if reporter.config.ReportPassed { - reporter.stenographer.AnnounceCapturedOutput(specSummary.CapturedOutput) - } - } - case types.SpecStatePending: - reporter.stenographer.AnnouncePendingSpec(specSummary, reporter.config.NoisyPendings && !reporter.config.Succinct) - case types.SpecStateSkipped: - reporter.stenographer.AnnounceSkippedSpec(specSummary, reporter.config.Succinct || !reporter.config.NoisySkippings, reporter.config.FullTrace) - case types.SpecStateTimedOut: - reporter.stenographer.AnnounceSpecTimedOut(specSummary, reporter.config.Succinct, reporter.config.FullTrace) - case types.SpecStatePanicked: - reporter.stenographer.AnnounceSpecPanicked(specSummary, reporter.config.Succinct, reporter.config.FullTrace) - case types.SpecStateFailed: - reporter.stenographer.AnnounceSpecFailed(specSummary, reporter.config.Succinct, reporter.config.FullTrace) - } - - reporter.specSummaries = append(reporter.specSummaries, specSummary) -} - -func (reporter *DefaultReporter) SpecSuiteDidEnd(summary *types.SuiteSummary) { - reporter.stenographer.SummarizeFailures(reporter.specSummaries) - reporter.stenographer.AnnounceSpecRunCompletion(summary, reporter.config.Succinct) -} diff --git a/vendor/github.com/onsi/ginkgo/reporters/fake_reporter.go b/vendor/github.com/onsi/ginkgo/reporters/fake_reporter.go deleted file mode 100644 index 27db47949..000000000 --- a/vendor/github.com/onsi/ginkgo/reporters/fake_reporter.go +++ /dev/null @@ -1,59 +0,0 @@ -package reporters - -import ( - "github.com/onsi/ginkgo/config" - "github.com/onsi/ginkgo/types" -) - -//FakeReporter is useful for testing purposes -type FakeReporter struct { - Config config.GinkgoConfigType - - BeginSummary *types.SuiteSummary - BeforeSuiteSummary *types.SetupSummary - SpecWillRunSummaries []*types.SpecSummary - SpecSummaries []*types.SpecSummary - AfterSuiteSummary *types.SetupSummary - EndSummary *types.SuiteSummary - - SpecWillRunStub func(specSummary *types.SpecSummary) - SpecDidCompleteStub func(specSummary *types.SpecSummary) -} - -func NewFakeReporter() *FakeReporter { - return &FakeReporter{ - SpecWillRunSummaries: make([]*types.SpecSummary, 0), - SpecSummaries: make([]*types.SpecSummary, 0), - } -} - -func (fakeR *FakeReporter) SpecSuiteWillBegin(config config.GinkgoConfigType, summary *types.SuiteSummary) { - fakeR.Config = config - fakeR.BeginSummary = summary -} - -func (fakeR *FakeReporter) BeforeSuiteDidRun(setupSummary *types.SetupSummary) { - fakeR.BeforeSuiteSummary = setupSummary -} - -func (fakeR *FakeReporter) SpecWillRun(specSummary *types.SpecSummary) { - if fakeR.SpecWillRunStub != nil { - fakeR.SpecWillRunStub(specSummary) - } - fakeR.SpecWillRunSummaries = append(fakeR.SpecWillRunSummaries, specSummary) -} - -func (fakeR *FakeReporter) SpecDidComplete(specSummary *types.SpecSummary) { - if fakeR.SpecDidCompleteStub != nil { - fakeR.SpecDidCompleteStub(specSummary) - } - fakeR.SpecSummaries = append(fakeR.SpecSummaries, specSummary) -} - -func (fakeR *FakeReporter) AfterSuiteDidRun(setupSummary *types.SetupSummary) { - fakeR.AfterSuiteSummary = setupSummary -} - -func (fakeR *FakeReporter) SpecSuiteDidEnd(summary *types.SuiteSummary) { - fakeR.EndSummary = summary -} diff --git a/vendor/github.com/onsi/ginkgo/reporters/junit_reporter.go b/vendor/github.com/onsi/ginkgo/reporters/junit_reporter.go deleted file mode 100644 index d76e2fe77..000000000 --- a/vendor/github.com/onsi/ginkgo/reporters/junit_reporter.go +++ /dev/null @@ -1,182 +0,0 @@ -/* - -JUnit XML Reporter for Ginkgo - -For usage instructions: http://onsi.github.io/ginkgo/#generating_junit_xml_output - -*/ - -package reporters - -import ( - "encoding/xml" - "fmt" - "math" - "os" - "path/filepath" - "strings" - - "github.com/onsi/ginkgo/config" - "github.com/onsi/ginkgo/types" -) - -type JUnitTestSuite struct { - XMLName xml.Name `xml:"testsuite"` - TestCases []JUnitTestCase `xml:"testcase"` - Name string `xml:"name,attr"` - Tests int `xml:"tests,attr"` - Failures int `xml:"failures,attr"` - Errors int `xml:"errors,attr"` - Time float64 `xml:"time,attr"` -} - -type JUnitTestCase struct { - Name string `xml:"name,attr"` - ClassName string `xml:"classname,attr"` - PassedMessage *JUnitPassedMessage `xml:"passed,omitempty"` - FailureMessage *JUnitFailureMessage `xml:"failure,omitempty"` - Skipped *JUnitSkipped `xml:"skipped,omitempty"` - Time float64 `xml:"time,attr"` - SystemOut string `xml:"system-out,omitempty"` -} - -type JUnitPassedMessage struct { - Message string `xml:",chardata"` -} - -type JUnitFailureMessage struct { - Type string `xml:"type,attr"` - Message string `xml:",chardata"` -} - -type JUnitSkipped struct { - XMLName xml.Name `xml:"skipped"` -} - -type JUnitReporter struct { - suite JUnitTestSuite - filename string - testSuiteName string - ReporterConfig config.DefaultReporterConfigType -} - -//NewJUnitReporter creates a new JUnit XML reporter. The XML will be stored in the passed in filename. -func NewJUnitReporter(filename string) *JUnitReporter { - return &JUnitReporter{ - filename: filename, - } -} - -func (reporter *JUnitReporter) SpecSuiteWillBegin(ginkgoConfig config.GinkgoConfigType, summary *types.SuiteSummary) { - reporter.suite = JUnitTestSuite{ - Name: summary.SuiteDescription, - TestCases: []JUnitTestCase{}, - } - reporter.testSuiteName = summary.SuiteDescription - reporter.ReporterConfig = config.DefaultReporterConfig -} - -func (reporter *JUnitReporter) SpecWillRun(specSummary *types.SpecSummary) { -} - -func (reporter *JUnitReporter) BeforeSuiteDidRun(setupSummary *types.SetupSummary) { - reporter.handleSetupSummary("BeforeSuite", setupSummary) -} - -func (reporter *JUnitReporter) AfterSuiteDidRun(setupSummary *types.SetupSummary) { - reporter.handleSetupSummary("AfterSuite", setupSummary) -} - -func failureMessage(failure types.SpecFailure) string { - return fmt.Sprintf("%s\n%s\n%s", failure.ComponentCodeLocation.String(), failure.Message, failure.Location.String()) -} - -func (reporter *JUnitReporter) handleSetupSummary(name string, setupSummary *types.SetupSummary) { - if setupSummary.State != types.SpecStatePassed { - testCase := JUnitTestCase{ - Name: name, - ClassName: reporter.testSuiteName, - } - - testCase.FailureMessage = &JUnitFailureMessage{ - Type: reporter.failureTypeForState(setupSummary.State), - Message: failureMessage(setupSummary.Failure), - } - testCase.SystemOut = setupSummary.CapturedOutput - testCase.Time = setupSummary.RunTime.Seconds() - reporter.suite.TestCases = append(reporter.suite.TestCases, testCase) - } -} - -func (reporter *JUnitReporter) SpecDidComplete(specSummary *types.SpecSummary) { - testCase := JUnitTestCase{ - Name: strings.Join(specSummary.ComponentTexts[1:], " "), - ClassName: reporter.testSuiteName, - } - if reporter.ReporterConfig.ReportPassed && specSummary.State == types.SpecStatePassed { - testCase.PassedMessage = &JUnitPassedMessage{ - Message: specSummary.CapturedOutput, - } - } - if specSummary.State == types.SpecStateFailed || specSummary.State == types.SpecStateTimedOut || specSummary.State == types.SpecStatePanicked { - testCase.FailureMessage = &JUnitFailureMessage{ - Type: reporter.failureTypeForState(specSummary.State), - Message: failureMessage(specSummary.Failure), - } - if specSummary.State == types.SpecStatePanicked { - testCase.FailureMessage.Message += fmt.Sprintf("\n\nPanic: %s\n\nFull stack:\n%s", - specSummary.Failure.ForwardedPanic, - specSummary.Failure.Location.FullStackTrace) - } - testCase.SystemOut = specSummary.CapturedOutput - } - if specSummary.State == types.SpecStateSkipped || specSummary.State == types.SpecStatePending { - testCase.Skipped = &JUnitSkipped{} - } - testCase.Time = specSummary.RunTime.Seconds() - reporter.suite.TestCases = append(reporter.suite.TestCases, testCase) -} - -func (reporter *JUnitReporter) SpecSuiteDidEnd(summary *types.SuiteSummary) { - reporter.suite.Tests = summary.NumberOfSpecsThatWillBeRun - reporter.suite.Time = math.Trunc(summary.RunTime.Seconds()*1000) / 1000 - reporter.suite.Failures = summary.NumberOfFailedSpecs - reporter.suite.Errors = 0 - if reporter.ReporterConfig.ReportFile != "" { - reporter.filename = reporter.ReporterConfig.ReportFile - fmt.Printf("\nJUnit path was configured: %s\n", reporter.filename) - } - filePath, _ := filepath.Abs(reporter.filename) - dirPath := filepath.Dir(filePath) - err := os.MkdirAll(dirPath, os.ModePerm) - if err != nil { - fmt.Printf("\nFailed to create JUnit directory: %s\n\t%s", filePath, err.Error()) - } - file, err := os.Create(filePath) - if err != nil { - fmt.Fprintf(os.Stderr, "Failed to create JUnit report file: %s\n\t%s", filePath, err.Error()) - } - defer file.Close() - file.WriteString(xml.Header) - encoder := xml.NewEncoder(file) - encoder.Indent(" ", " ") - err = encoder.Encode(reporter.suite) - if err == nil { - fmt.Fprintf(os.Stdout, "\nJUnit report was created: %s\n", filePath) - } else { - fmt.Fprintf(os.Stderr,"\nFailed to generate JUnit report data:\n\t%s", err.Error()) - } -} - -func (reporter *JUnitReporter) failureTypeForState(state types.SpecState) string { - switch state { - case types.SpecStateFailed: - return "Failure" - case types.SpecStateTimedOut: - return "Timeout" - case types.SpecStatePanicked: - return "Panic" - default: - return "" - } -} diff --git a/vendor/github.com/onsi/ginkgo/reporters/reporter.go b/vendor/github.com/onsi/ginkgo/reporters/reporter.go deleted file mode 100644 index 348b9dfce..000000000 --- a/vendor/github.com/onsi/ginkgo/reporters/reporter.go +++ /dev/null @@ -1,15 +0,0 @@ -package reporters - -import ( - "github.com/onsi/ginkgo/config" - "github.com/onsi/ginkgo/types" -) - -type Reporter interface { - SpecSuiteWillBegin(config config.GinkgoConfigType, summary *types.SuiteSummary) - BeforeSuiteDidRun(setupSummary *types.SetupSummary) - SpecWillRun(specSummary *types.SpecSummary) - SpecDidComplete(specSummary *types.SpecSummary) - AfterSuiteDidRun(setupSummary *types.SetupSummary) - SpecSuiteDidEnd(summary *types.SuiteSummary) -} diff --git a/vendor/github.com/onsi/ginkgo/reporters/stenographer/console_logging.go b/vendor/github.com/onsi/ginkgo/reporters/stenographer/console_logging.go deleted file mode 100644 index 45b8f8869..000000000 --- a/vendor/github.com/onsi/ginkgo/reporters/stenographer/console_logging.go +++ /dev/null @@ -1,64 +0,0 @@ -package stenographer - -import ( - "fmt" - "strings" -) - -func (s *consoleStenographer) colorize(colorCode string, format string, args ...interface{}) string { - var out string - - if len(args) > 0 { - out = fmt.Sprintf(format, args...) - } else { - out = format - } - - if s.color { - return fmt.Sprintf("%s%s%s", colorCode, out, defaultStyle) - } else { - return out - } -} - -func (s *consoleStenographer) printBanner(text string, bannerCharacter string) { - fmt.Fprintln(s.w, text) - fmt.Fprintln(s.w, strings.Repeat(bannerCharacter, len(text))) -} - -func (s *consoleStenographer) printNewLine() { - fmt.Fprintln(s.w, "") -} - -func (s *consoleStenographer) printDelimiter() { - fmt.Fprintln(s.w, s.colorize(grayColor, "%s", strings.Repeat("-", 30))) -} - -func (s *consoleStenographer) print(indentation int, format string, args ...interface{}) { - fmt.Fprint(s.w, s.indent(indentation, format, args...)) -} - -func (s *consoleStenographer) println(indentation int, format string, args ...interface{}) { - fmt.Fprintln(s.w, s.indent(indentation, format, args...)) -} - -func (s *consoleStenographer) indent(indentation int, format string, args ...interface{}) string { - var text string - - if len(args) > 0 { - text = fmt.Sprintf(format, args...) - } else { - text = format - } - - stringArray := strings.Split(text, "\n") - padding := "" - if indentation >= 0 { - padding = strings.Repeat(" ", indentation) - } - for i, s := range stringArray { - stringArray[i] = fmt.Sprintf("%s%s", padding, s) - } - - return strings.Join(stringArray, "\n") -} diff --git a/vendor/github.com/onsi/ginkgo/reporters/stenographer/fake_stenographer.go b/vendor/github.com/onsi/ginkgo/reporters/stenographer/fake_stenographer.go deleted file mode 100644 index 98854e7d9..000000000 --- a/vendor/github.com/onsi/ginkgo/reporters/stenographer/fake_stenographer.go +++ /dev/null @@ -1,142 +0,0 @@ -package stenographer - -import ( - "sync" - - "github.com/onsi/ginkgo/types" -) - -func NewFakeStenographerCall(method string, args ...interface{}) FakeStenographerCall { - return FakeStenographerCall{ - Method: method, - Args: args, - } -} - -type FakeStenographer struct { - calls []FakeStenographerCall - lock *sync.Mutex -} - -type FakeStenographerCall struct { - Method string - Args []interface{} -} - -func NewFakeStenographer() *FakeStenographer { - stenographer := &FakeStenographer{ - lock: &sync.Mutex{}, - } - stenographer.Reset() - return stenographer -} - -func (stenographer *FakeStenographer) Calls() []FakeStenographerCall { - stenographer.lock.Lock() - defer stenographer.lock.Unlock() - - return stenographer.calls -} - -func (stenographer *FakeStenographer) Reset() { - stenographer.lock.Lock() - defer stenographer.lock.Unlock() - - stenographer.calls = make([]FakeStenographerCall, 0) -} - -func (stenographer *FakeStenographer) CallsTo(method string) []FakeStenographerCall { - stenographer.lock.Lock() - defer stenographer.lock.Unlock() - - results := make([]FakeStenographerCall, 0) - for _, call := range stenographer.calls { - if call.Method == method { - results = append(results, call) - } - } - - return results -} - -func (stenographer *FakeStenographer) registerCall(method string, args ...interface{}) { - stenographer.lock.Lock() - defer stenographer.lock.Unlock() - - stenographer.calls = append(stenographer.calls, NewFakeStenographerCall(method, args...)) -} - -func (stenographer *FakeStenographer) AnnounceSuite(description string, randomSeed int64, randomizingAll bool, succinct bool) { - stenographer.registerCall("AnnounceSuite", description, randomSeed, randomizingAll, succinct) -} - -func (stenographer *FakeStenographer) AnnounceAggregatedParallelRun(nodes int, succinct bool) { - stenographer.registerCall("AnnounceAggregatedParallelRun", nodes, succinct) -} - -func (stenographer *FakeStenographer) AnnounceParallelRun(node int, nodes int, succinct bool) { - stenographer.registerCall("AnnounceParallelRun", node, nodes, succinct) -} - -func (stenographer *FakeStenographer) AnnounceNumberOfSpecs(specsToRun int, total int, succinct bool) { - stenographer.registerCall("AnnounceNumberOfSpecs", specsToRun, total, succinct) -} - -func (stenographer *FakeStenographer) AnnounceTotalNumberOfSpecs(total int, succinct bool) { - stenographer.registerCall("AnnounceTotalNumberOfSpecs", total, succinct) -} - -func (stenographer *FakeStenographer) AnnounceSpecRunCompletion(summary *types.SuiteSummary, succinct bool) { - stenographer.registerCall("AnnounceSpecRunCompletion", summary, succinct) -} - -func (stenographer *FakeStenographer) AnnounceSpecWillRun(spec *types.SpecSummary) { - stenographer.registerCall("AnnounceSpecWillRun", spec) -} - -func (stenographer *FakeStenographer) AnnounceBeforeSuiteFailure(summary *types.SetupSummary, succinct bool, fullTrace bool) { - stenographer.registerCall("AnnounceBeforeSuiteFailure", summary, succinct, fullTrace) -} - -func (stenographer *FakeStenographer) AnnounceAfterSuiteFailure(summary *types.SetupSummary, succinct bool, fullTrace bool) { - stenographer.registerCall("AnnounceAfterSuiteFailure", summary, succinct, fullTrace) -} -func (stenographer *FakeStenographer) AnnounceCapturedOutput(output string) { - stenographer.registerCall("AnnounceCapturedOutput", output) -} - -func (stenographer *FakeStenographer) AnnounceSuccesfulSpec(spec *types.SpecSummary) { - stenographer.registerCall("AnnounceSuccesfulSpec", spec) -} - -func (stenographer *FakeStenographer) AnnounceSuccesfulSlowSpec(spec *types.SpecSummary, succinct bool) { - stenographer.registerCall("AnnounceSuccesfulSlowSpec", spec, succinct) -} - -func (stenographer *FakeStenographer) AnnounceSuccesfulMeasurement(spec *types.SpecSummary, succinct bool) { - stenographer.registerCall("AnnounceSuccesfulMeasurement", spec, succinct) -} - -func (stenographer *FakeStenographer) AnnouncePendingSpec(spec *types.SpecSummary, noisy bool) { - stenographer.registerCall("AnnouncePendingSpec", spec, noisy) -} - -func (stenographer *FakeStenographer) AnnounceSkippedSpec(spec *types.SpecSummary, succinct bool, fullTrace bool) { - stenographer.registerCall("AnnounceSkippedSpec", spec, succinct, fullTrace) -} - -func (stenographer *FakeStenographer) AnnounceSpecTimedOut(spec *types.SpecSummary, succinct bool, fullTrace bool) { - stenographer.registerCall("AnnounceSpecTimedOut", spec, succinct, fullTrace) -} - -func (stenographer *FakeStenographer) AnnounceSpecPanicked(spec *types.SpecSummary, succinct bool, fullTrace bool) { - stenographer.registerCall("AnnounceSpecPanicked", spec, succinct, fullTrace) -} - -func (stenographer *FakeStenographer) AnnounceSpecFailed(spec *types.SpecSummary, succinct bool, fullTrace bool) { - stenographer.registerCall("AnnounceSpecFailed", spec, succinct, fullTrace) -} - -func (stenographer *FakeStenographer) SummarizeFailures(summaries []*types.SpecSummary) { - stenographer.registerCall("SummarizeFailures", summaries) -} diff --git a/vendor/github.com/onsi/ginkgo/reporters/stenographer/stenographer.go b/vendor/github.com/onsi/ginkgo/reporters/stenographer/stenographer.go deleted file mode 100644 index 601c74d66..000000000 --- a/vendor/github.com/onsi/ginkgo/reporters/stenographer/stenographer.go +++ /dev/null @@ -1,572 +0,0 @@ -/* -The stenographer is used by Ginkgo's reporters to generate output. - -Move along, nothing to see here. -*/ - -package stenographer - -import ( - "fmt" - "io" - "runtime" - "strings" - - "github.com/onsi/ginkgo/types" -) - -const defaultStyle = "\x1b[0m" -const boldStyle = "\x1b[1m" -const redColor = "\x1b[91m" -const greenColor = "\x1b[32m" -const yellowColor = "\x1b[33m" -const cyanColor = "\x1b[36m" -const grayColor = "\x1b[90m" -const lightGrayColor = "\x1b[37m" - -type cursorStateType int - -const ( - cursorStateTop cursorStateType = iota - cursorStateStreaming - cursorStateMidBlock - cursorStateEndBlock -) - -type Stenographer interface { - AnnounceSuite(description string, randomSeed int64, randomizingAll bool, succinct bool) - AnnounceAggregatedParallelRun(nodes int, succinct bool) - AnnounceParallelRun(node int, nodes int, succinct bool) - AnnounceTotalNumberOfSpecs(total int, succinct bool) - AnnounceNumberOfSpecs(specsToRun int, total int, succinct bool) - AnnounceSpecRunCompletion(summary *types.SuiteSummary, succinct bool) - - AnnounceSpecWillRun(spec *types.SpecSummary) - AnnounceBeforeSuiteFailure(summary *types.SetupSummary, succinct bool, fullTrace bool) - AnnounceAfterSuiteFailure(summary *types.SetupSummary, succinct bool, fullTrace bool) - - AnnounceCapturedOutput(output string) - - AnnounceSuccesfulSpec(spec *types.SpecSummary) - AnnounceSuccesfulSlowSpec(spec *types.SpecSummary, succinct bool) - AnnounceSuccesfulMeasurement(spec *types.SpecSummary, succinct bool) - - AnnouncePendingSpec(spec *types.SpecSummary, noisy bool) - AnnounceSkippedSpec(spec *types.SpecSummary, succinct bool, fullTrace bool) - - AnnounceSpecTimedOut(spec *types.SpecSummary, succinct bool, fullTrace bool) - AnnounceSpecPanicked(spec *types.SpecSummary, succinct bool, fullTrace bool) - AnnounceSpecFailed(spec *types.SpecSummary, succinct bool, fullTrace bool) - - SummarizeFailures(summaries []*types.SpecSummary) -} - -func New(color bool, enableFlakes bool, writer io.Writer) Stenographer { - denoter := "•" - if runtime.GOOS == "windows" { - denoter = "+" - } - return &consoleStenographer{ - color: color, - denoter: denoter, - cursorState: cursorStateTop, - enableFlakes: enableFlakes, - w: writer, - } -} - -type consoleStenographer struct { - color bool - denoter string - cursorState cursorStateType - enableFlakes bool - w io.Writer -} - -var alternatingColors = []string{defaultStyle, grayColor} - -func (s *consoleStenographer) AnnounceSuite(description string, randomSeed int64, randomizingAll bool, succinct bool) { - if succinct { - s.print(0, "[%d] %s ", randomSeed, s.colorize(boldStyle, description)) - return - } - s.printBanner(fmt.Sprintf("Running Suite: %s", description), "=") - s.print(0, "Random Seed: %s", s.colorize(boldStyle, "%d", randomSeed)) - if randomizingAll { - s.print(0, " - Will randomize all specs") - } - s.printNewLine() -} - -func (s *consoleStenographer) AnnounceParallelRun(node int, nodes int, succinct bool) { - if succinct { - s.print(0, "- node #%d ", node) - return - } - s.println(0, - "Parallel test node %s/%s.", - s.colorize(boldStyle, "%d", node), - s.colorize(boldStyle, "%d", nodes), - ) - s.printNewLine() -} - -func (s *consoleStenographer) AnnounceAggregatedParallelRun(nodes int, succinct bool) { - if succinct { - s.print(0, "- %d nodes ", nodes) - return - } - s.println(0, - "Running in parallel across %s nodes", - s.colorize(boldStyle, "%d", nodes), - ) - s.printNewLine() -} - -func (s *consoleStenographer) AnnounceNumberOfSpecs(specsToRun int, total int, succinct bool) { - if succinct { - s.print(0, "- %d/%d specs ", specsToRun, total) - s.stream() - return - } - s.println(0, - "Will run %s of %s specs", - s.colorize(boldStyle, "%d", specsToRun), - s.colorize(boldStyle, "%d", total), - ) - - s.printNewLine() -} - -func (s *consoleStenographer) AnnounceTotalNumberOfSpecs(total int, succinct bool) { - if succinct { - s.print(0, "- %d specs ", total) - s.stream() - return - } - s.println(0, - "Will run %s specs", - s.colorize(boldStyle, "%d", total), - ) - - s.printNewLine() -} - -func (s *consoleStenographer) AnnounceSpecRunCompletion(summary *types.SuiteSummary, succinct bool) { - if succinct && summary.SuiteSucceeded { - s.print(0, " %s %s ", s.colorize(greenColor, "SUCCESS!"), summary.RunTime) - return - } - s.printNewLine() - color := greenColor - if !summary.SuiteSucceeded { - color = redColor - } - s.println(0, s.colorize(boldStyle+color, "Ran %d of %d Specs in %.3f seconds", summary.NumberOfSpecsThatWillBeRun, summary.NumberOfTotalSpecs, summary.RunTime.Seconds())) - - status := "" - if summary.SuiteSucceeded { - status = s.colorize(boldStyle+greenColor, "SUCCESS!") - } else { - status = s.colorize(boldStyle+redColor, "FAIL!") - } - - flakes := "" - if s.enableFlakes { - flakes = " | " + s.colorize(yellowColor+boldStyle, "%d Flaked", summary.NumberOfFlakedSpecs) - } - - s.print(0, - "%s -- %s | %s | %s | %s\n", - status, - s.colorize(greenColor+boldStyle, "%d Passed", summary.NumberOfPassedSpecs), - s.colorize(redColor+boldStyle, "%d Failed", summary.NumberOfFailedSpecs)+flakes, - s.colorize(yellowColor+boldStyle, "%d Pending", summary.NumberOfPendingSpecs), - s.colorize(cyanColor+boldStyle, "%d Skipped", summary.NumberOfSkippedSpecs), - ) -} - -func (s *consoleStenographer) AnnounceSpecWillRun(spec *types.SpecSummary) { - s.startBlock() - for i, text := range spec.ComponentTexts[1 : len(spec.ComponentTexts)-1] { - s.print(0, s.colorize(alternatingColors[i%2], text)+" ") - } - - indentation := 0 - if len(spec.ComponentTexts) > 2 { - indentation = 1 - s.printNewLine() - } - index := len(spec.ComponentTexts) - 1 - s.print(indentation, s.colorize(boldStyle, spec.ComponentTexts[index])) - s.printNewLine() - s.print(indentation, s.colorize(lightGrayColor, spec.ComponentCodeLocations[index].String())) - s.printNewLine() - s.midBlock() -} - -func (s *consoleStenographer) AnnounceBeforeSuiteFailure(summary *types.SetupSummary, succinct bool, fullTrace bool) { - s.announceSetupFailure("BeforeSuite", summary, succinct, fullTrace) -} - -func (s *consoleStenographer) AnnounceAfterSuiteFailure(summary *types.SetupSummary, succinct bool, fullTrace bool) { - s.announceSetupFailure("AfterSuite", summary, succinct, fullTrace) -} - -func (s *consoleStenographer) announceSetupFailure(name string, summary *types.SetupSummary, succinct bool, fullTrace bool) { - s.startBlock() - var message string - switch summary.State { - case types.SpecStateFailed: - message = "Failure" - case types.SpecStatePanicked: - message = "Panic" - case types.SpecStateTimedOut: - message = "Timeout" - } - - s.println(0, s.colorize(redColor+boldStyle, "%s [%.3f seconds]", message, summary.RunTime.Seconds())) - - indentation := s.printCodeLocationBlock([]string{name}, []types.CodeLocation{summary.CodeLocation}, summary.ComponentType, 0, summary.State, true) - - s.printNewLine() - s.printFailure(indentation, summary.State, summary.Failure, fullTrace) - - s.endBlock() -} - -func (s *consoleStenographer) AnnounceCapturedOutput(output string) { - if output == "" { - return - } - - s.startBlock() - s.println(0, output) - s.midBlock() -} - -func (s *consoleStenographer) AnnounceSuccesfulSpec(spec *types.SpecSummary) { - s.print(0, s.colorize(greenColor, s.denoter)) - s.stream() -} - -func (s *consoleStenographer) AnnounceSuccesfulSlowSpec(spec *types.SpecSummary, succinct bool) { - s.printBlockWithMessage( - s.colorize(greenColor, "%s [SLOW TEST:%.3f seconds]", s.denoter, spec.RunTime.Seconds()), - "", - spec, - succinct, - ) -} - -func (s *consoleStenographer) AnnounceSuccesfulMeasurement(spec *types.SpecSummary, succinct bool) { - s.printBlockWithMessage( - s.colorize(greenColor, "%s [MEASUREMENT]", s.denoter), - s.measurementReport(spec, succinct), - spec, - succinct, - ) -} - -func (s *consoleStenographer) AnnouncePendingSpec(spec *types.SpecSummary, noisy bool) { - if noisy { - s.printBlockWithMessage( - s.colorize(yellowColor, "P [PENDING]"), - "", - spec, - false, - ) - } else { - s.print(0, s.colorize(yellowColor, "P")) - s.stream() - } -} - -func (s *consoleStenographer) AnnounceSkippedSpec(spec *types.SpecSummary, succinct bool, fullTrace bool) { - // Skips at runtime will have a non-empty spec.Failure. All others should be succinct. - if succinct || spec.Failure == (types.SpecFailure{}) { - s.print(0, s.colorize(cyanColor, "S")) - s.stream() - } else { - s.startBlock() - s.println(0, s.colorize(cyanColor+boldStyle, "S [SKIPPING]%s [%.3f seconds]", s.failureContext(spec.Failure.ComponentType), spec.RunTime.Seconds())) - - indentation := s.printCodeLocationBlock(spec.ComponentTexts, spec.ComponentCodeLocations, spec.Failure.ComponentType, spec.Failure.ComponentIndex, spec.State, succinct) - - s.printNewLine() - s.printSkip(indentation, spec.Failure) - s.endBlock() - } -} - -func (s *consoleStenographer) AnnounceSpecTimedOut(spec *types.SpecSummary, succinct bool, fullTrace bool) { - s.printSpecFailure(fmt.Sprintf("%s... Timeout", s.denoter), spec, succinct, fullTrace) -} - -func (s *consoleStenographer) AnnounceSpecPanicked(spec *types.SpecSummary, succinct bool, fullTrace bool) { - s.printSpecFailure(fmt.Sprintf("%s! Panic", s.denoter), spec, succinct, fullTrace) -} - -func (s *consoleStenographer) AnnounceSpecFailed(spec *types.SpecSummary, succinct bool, fullTrace bool) { - s.printSpecFailure(fmt.Sprintf("%s Failure", s.denoter), spec, succinct, fullTrace) -} - -func (s *consoleStenographer) SummarizeFailures(summaries []*types.SpecSummary) { - failingSpecs := []*types.SpecSummary{} - - for _, summary := range summaries { - if summary.HasFailureState() { - failingSpecs = append(failingSpecs, summary) - } - } - - if len(failingSpecs) == 0 { - return - } - - s.printNewLine() - s.printNewLine() - plural := "s" - if len(failingSpecs) == 1 { - plural = "" - } - s.println(0, s.colorize(redColor+boldStyle, "Summarizing %d Failure%s:", len(failingSpecs), plural)) - for _, summary := range failingSpecs { - s.printNewLine() - if summary.HasFailureState() { - if summary.TimedOut() { - s.print(0, s.colorize(redColor+boldStyle, "[Timeout...] ")) - } else if summary.Panicked() { - s.print(0, s.colorize(redColor+boldStyle, "[Panic!] ")) - } else if summary.Failed() { - s.print(0, s.colorize(redColor+boldStyle, "[Fail] ")) - } - s.printSpecContext(summary.ComponentTexts, summary.ComponentCodeLocations, summary.Failure.ComponentType, summary.Failure.ComponentIndex, summary.State, true) - s.printNewLine() - s.println(0, s.colorize(lightGrayColor, summary.Failure.Location.String())) - } - } -} - -func (s *consoleStenographer) startBlock() { - if s.cursorState == cursorStateStreaming { - s.printNewLine() - s.printDelimiter() - } else if s.cursorState == cursorStateMidBlock { - s.printNewLine() - } -} - -func (s *consoleStenographer) midBlock() { - s.cursorState = cursorStateMidBlock -} - -func (s *consoleStenographer) endBlock() { - s.printDelimiter() - s.cursorState = cursorStateEndBlock -} - -func (s *consoleStenographer) stream() { - s.cursorState = cursorStateStreaming -} - -func (s *consoleStenographer) printBlockWithMessage(header string, message string, spec *types.SpecSummary, succinct bool) { - s.startBlock() - s.println(0, header) - - indentation := s.printCodeLocationBlock(spec.ComponentTexts, spec.ComponentCodeLocations, types.SpecComponentTypeInvalid, 0, spec.State, succinct) - - if message != "" { - s.printNewLine() - s.println(indentation, message) - } - - s.endBlock() -} - -func (s *consoleStenographer) printSpecFailure(message string, spec *types.SpecSummary, succinct bool, fullTrace bool) { - s.startBlock() - s.println(0, s.colorize(redColor+boldStyle, "%s%s [%.3f seconds]", message, s.failureContext(spec.Failure.ComponentType), spec.RunTime.Seconds())) - - indentation := s.printCodeLocationBlock(spec.ComponentTexts, spec.ComponentCodeLocations, spec.Failure.ComponentType, spec.Failure.ComponentIndex, spec.State, succinct) - - s.printNewLine() - s.printFailure(indentation, spec.State, spec.Failure, fullTrace) - s.endBlock() -} - -func (s *consoleStenographer) failureContext(failedComponentType types.SpecComponentType) string { - switch failedComponentType { - case types.SpecComponentTypeBeforeSuite: - return " in Suite Setup (BeforeSuite)" - case types.SpecComponentTypeAfterSuite: - return " in Suite Teardown (AfterSuite)" - case types.SpecComponentTypeBeforeEach: - return " in Spec Setup (BeforeEach)" - case types.SpecComponentTypeJustBeforeEach: - return " in Spec Setup (JustBeforeEach)" - case types.SpecComponentTypeAfterEach: - return " in Spec Teardown (AfterEach)" - } - - return "" -} - -func (s *consoleStenographer) printSkip(indentation int, spec types.SpecFailure) { - s.println(indentation, s.colorize(cyanColor, spec.Message)) - s.printNewLine() - s.println(indentation, spec.Location.String()) -} - -func (s *consoleStenographer) printFailure(indentation int, state types.SpecState, failure types.SpecFailure, fullTrace bool) { - if state == types.SpecStatePanicked { - s.println(indentation, s.colorize(redColor+boldStyle, failure.Message)) - s.println(indentation, s.colorize(redColor, failure.ForwardedPanic)) - s.println(indentation, failure.Location.String()) - s.printNewLine() - s.println(indentation, s.colorize(redColor, "Full Stack Trace")) - s.println(indentation, failure.Location.FullStackTrace) - } else { - s.println(indentation, s.colorize(redColor, failure.Message)) - s.printNewLine() - s.println(indentation, failure.Location.String()) - if fullTrace { - s.printNewLine() - s.println(indentation, s.colorize(redColor, "Full Stack Trace")) - s.println(indentation, failure.Location.FullStackTrace) - } - } -} - -func (s *consoleStenographer) printSpecContext(componentTexts []string, componentCodeLocations []types.CodeLocation, failedComponentType types.SpecComponentType, failedComponentIndex int, state types.SpecState, succinct bool) int { - startIndex := 1 - indentation := 0 - - if len(componentTexts) == 1 { - startIndex = 0 - } - - for i := startIndex; i < len(componentTexts); i++ { - if (state.IsFailure() || state == types.SpecStateSkipped) && i == failedComponentIndex { - color := redColor - if state == types.SpecStateSkipped { - color = cyanColor - } - blockType := "" - switch failedComponentType { - case types.SpecComponentTypeBeforeSuite: - blockType = "BeforeSuite" - case types.SpecComponentTypeAfterSuite: - blockType = "AfterSuite" - case types.SpecComponentTypeBeforeEach: - blockType = "BeforeEach" - case types.SpecComponentTypeJustBeforeEach: - blockType = "JustBeforeEach" - case types.SpecComponentTypeAfterEach: - blockType = "AfterEach" - case types.SpecComponentTypeIt: - blockType = "It" - case types.SpecComponentTypeMeasure: - blockType = "Measurement" - } - if succinct { - s.print(0, s.colorize(color+boldStyle, "[%s] %s ", blockType, componentTexts[i])) - } else { - s.println(indentation, s.colorize(color+boldStyle, "%s [%s]", componentTexts[i], blockType)) - s.println(indentation, s.colorize(grayColor, "%s", componentCodeLocations[i])) - } - } else { - if succinct { - s.print(0, s.colorize(alternatingColors[i%2], "%s ", componentTexts[i])) - } else { - s.println(indentation, componentTexts[i]) - s.println(indentation, s.colorize(grayColor, "%s", componentCodeLocations[i])) - } - } - indentation++ - } - - return indentation -} - -func (s *consoleStenographer) printCodeLocationBlock(componentTexts []string, componentCodeLocations []types.CodeLocation, failedComponentType types.SpecComponentType, failedComponentIndex int, state types.SpecState, succinct bool) int { - indentation := s.printSpecContext(componentTexts, componentCodeLocations, failedComponentType, failedComponentIndex, state, succinct) - - if succinct { - if len(componentTexts) > 0 { - s.printNewLine() - s.print(0, s.colorize(lightGrayColor, "%s", componentCodeLocations[len(componentCodeLocations)-1])) - } - s.printNewLine() - indentation = 1 - } else { - indentation-- - } - - return indentation -} - -func (s *consoleStenographer) orderedMeasurementKeys(measurements map[string]*types.SpecMeasurement) []string { - orderedKeys := make([]string, len(measurements)) - for key, measurement := range measurements { - orderedKeys[measurement.Order] = key - } - return orderedKeys -} - -func (s *consoleStenographer) measurementReport(spec *types.SpecSummary, succinct bool) string { - if len(spec.Measurements) == 0 { - return "Found no measurements" - } - - message := []string{} - orderedKeys := s.orderedMeasurementKeys(spec.Measurements) - - if succinct { - message = append(message, fmt.Sprintf("%s samples:", s.colorize(boldStyle, "%d", spec.NumberOfSamples))) - for _, key := range orderedKeys { - measurement := spec.Measurements[key] - message = append(message, fmt.Sprintf(" %s - %s: %s%s, %s: %s%s ± %s%s, %s: %s%s", - s.colorize(boldStyle, "%s", measurement.Name), - measurement.SmallestLabel, - s.colorize(greenColor, measurement.PrecisionFmt(), measurement.Smallest), - measurement.Units, - measurement.AverageLabel, - s.colorize(cyanColor, measurement.PrecisionFmt(), measurement.Average), - measurement.Units, - s.colorize(cyanColor, measurement.PrecisionFmt(), measurement.StdDeviation), - measurement.Units, - measurement.LargestLabel, - s.colorize(redColor, measurement.PrecisionFmt(), measurement.Largest), - measurement.Units, - )) - } - } else { - message = append(message, fmt.Sprintf("Ran %s samples:", s.colorize(boldStyle, "%d", spec.NumberOfSamples))) - for _, key := range orderedKeys { - measurement := spec.Measurements[key] - info := "" - if measurement.Info != nil { - message = append(message, fmt.Sprintf("%v", measurement.Info)) - } - - message = append(message, fmt.Sprintf("%s:\n%s %s: %s%s\n %s: %s%s\n %s: %s%s ± %s%s", - s.colorize(boldStyle, "%s", measurement.Name), - info, - measurement.SmallestLabel, - s.colorize(greenColor, measurement.PrecisionFmt(), measurement.Smallest), - measurement.Units, - measurement.LargestLabel, - s.colorize(redColor, measurement.PrecisionFmt(), measurement.Largest), - measurement.Units, - measurement.AverageLabel, - s.colorize(cyanColor, measurement.PrecisionFmt(), measurement.Average), - measurement.Units, - s.colorize(cyanColor, measurement.PrecisionFmt(), measurement.StdDeviation), - measurement.Units, - )) - } - } - - return strings.Join(message, "\n") -} diff --git a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable/LICENSE b/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable/LICENSE deleted file mode 100644 index 91b5cef30..000000000 --- a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Yasuhiro Matsumoto - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable/README.md b/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable/README.md deleted file mode 100644 index e84226a73..000000000 --- a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# go-colorable - -Colorable writer for windows. - -For example, most of logger packages doesn't show colors on windows. (I know we can do it with ansicon. But I don't want.) -This package is possible to handle escape sequence for ansi color on windows. - -## Too Bad! - -![](https://raw.githubusercontent.com/mattn/go-colorable/gh-pages/bad.png) - - -## So Good! - -![](https://raw.githubusercontent.com/mattn/go-colorable/gh-pages/good.png) - -## Usage - -```go -logrus.SetFormatter(&logrus.TextFormatter{ForceColors: true}) -logrus.SetOutput(colorable.NewColorableStdout()) - -logrus.Info("succeeded") -logrus.Warn("not correct") -logrus.Error("something error") -logrus.Fatal("panic") -``` - -You can compile above code on non-windows OSs. - -## Installation - -``` -$ go get github.com/mattn/go-colorable -``` - -# License - -MIT - -# Author - -Yasuhiro Matsumoto (a.k.a mattn) diff --git a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable/colorable_others.go b/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable/colorable_others.go deleted file mode 100644 index 52d6653b3..000000000 --- a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable/colorable_others.go +++ /dev/null @@ -1,24 +0,0 @@ -// +build !windows - -package colorable - -import ( - "io" - "os" -) - -func NewColorable(file *os.File) io.Writer { - if file == nil { - panic("nil passed instead of *os.File to NewColorable()") - } - - return file -} - -func NewColorableStdout() io.Writer { - return os.Stdout -} - -func NewColorableStderr() io.Writer { - return os.Stderr -} diff --git a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable/colorable_windows.go b/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable/colorable_windows.go deleted file mode 100644 index 108800923..000000000 --- a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable/colorable_windows.go +++ /dev/null @@ -1,783 +0,0 @@ -package colorable - -import ( - "bytes" - "fmt" - "io" - "math" - "os" - "strconv" - "strings" - "syscall" - "unsafe" - - "github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty" -) - -const ( - foregroundBlue = 0x1 - foregroundGreen = 0x2 - foregroundRed = 0x4 - foregroundIntensity = 0x8 - foregroundMask = (foregroundRed | foregroundBlue | foregroundGreen | foregroundIntensity) - backgroundBlue = 0x10 - backgroundGreen = 0x20 - backgroundRed = 0x40 - backgroundIntensity = 0x80 - backgroundMask = (backgroundRed | backgroundBlue | backgroundGreen | backgroundIntensity) -) - -type wchar uint16 -type short int16 -type dword uint32 -type word uint16 - -type coord struct { - x short - y short -} - -type smallRect struct { - left short - top short - right short - bottom short -} - -type consoleScreenBufferInfo struct { - size coord - cursorPosition coord - attributes word - window smallRect - maximumWindowSize coord -} - -var ( - kernel32 = syscall.NewLazyDLL("kernel32.dll") - procGetConsoleScreenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo") - procSetConsoleTextAttribute = kernel32.NewProc("SetConsoleTextAttribute") - procSetConsoleCursorPosition = kernel32.NewProc("SetConsoleCursorPosition") - procFillConsoleOutputCharacter = kernel32.NewProc("FillConsoleOutputCharacterW") - procFillConsoleOutputAttribute = kernel32.NewProc("FillConsoleOutputAttribute") -) - -type Writer struct { - out io.Writer - handle syscall.Handle - lastbuf bytes.Buffer - oldattr word -} - -func NewColorable(file *os.File) io.Writer { - if file == nil { - panic("nil passed instead of *os.File to NewColorable()") - } - - if isatty.IsTerminal(file.Fd()) { - var csbi consoleScreenBufferInfo - handle := syscall.Handle(file.Fd()) - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - return &Writer{out: file, handle: handle, oldattr: csbi.attributes} - } else { - return file - } -} - -func NewColorableStdout() io.Writer { - return NewColorable(os.Stdout) -} - -func NewColorableStderr() io.Writer { - return NewColorable(os.Stderr) -} - -var color256 = map[int]int{ - 0: 0x000000, - 1: 0x800000, - 2: 0x008000, - 3: 0x808000, - 4: 0x000080, - 5: 0x800080, - 6: 0x008080, - 7: 0xc0c0c0, - 8: 0x808080, - 9: 0xff0000, - 10: 0x00ff00, - 11: 0xffff00, - 12: 0x0000ff, - 13: 0xff00ff, - 14: 0x00ffff, - 15: 0xffffff, - 16: 0x000000, - 17: 0x00005f, - 18: 0x000087, - 19: 0x0000af, - 20: 0x0000d7, - 21: 0x0000ff, - 22: 0x005f00, - 23: 0x005f5f, - 24: 0x005f87, - 25: 0x005faf, - 26: 0x005fd7, - 27: 0x005fff, - 28: 0x008700, - 29: 0x00875f, - 30: 0x008787, - 31: 0x0087af, - 32: 0x0087d7, - 33: 0x0087ff, - 34: 0x00af00, - 35: 0x00af5f, - 36: 0x00af87, - 37: 0x00afaf, - 38: 0x00afd7, - 39: 0x00afff, - 40: 0x00d700, - 41: 0x00d75f, - 42: 0x00d787, - 43: 0x00d7af, - 44: 0x00d7d7, - 45: 0x00d7ff, - 46: 0x00ff00, - 47: 0x00ff5f, - 48: 0x00ff87, - 49: 0x00ffaf, - 50: 0x00ffd7, - 51: 0x00ffff, - 52: 0x5f0000, - 53: 0x5f005f, - 54: 0x5f0087, - 55: 0x5f00af, - 56: 0x5f00d7, - 57: 0x5f00ff, - 58: 0x5f5f00, - 59: 0x5f5f5f, - 60: 0x5f5f87, - 61: 0x5f5faf, - 62: 0x5f5fd7, - 63: 0x5f5fff, - 64: 0x5f8700, - 65: 0x5f875f, - 66: 0x5f8787, - 67: 0x5f87af, - 68: 0x5f87d7, - 69: 0x5f87ff, - 70: 0x5faf00, - 71: 0x5faf5f, - 72: 0x5faf87, - 73: 0x5fafaf, - 74: 0x5fafd7, - 75: 0x5fafff, - 76: 0x5fd700, - 77: 0x5fd75f, - 78: 0x5fd787, - 79: 0x5fd7af, - 80: 0x5fd7d7, - 81: 0x5fd7ff, - 82: 0x5fff00, - 83: 0x5fff5f, - 84: 0x5fff87, - 85: 0x5fffaf, - 86: 0x5fffd7, - 87: 0x5fffff, - 88: 0x870000, - 89: 0x87005f, - 90: 0x870087, - 91: 0x8700af, - 92: 0x8700d7, - 93: 0x8700ff, - 94: 0x875f00, - 95: 0x875f5f, - 96: 0x875f87, - 97: 0x875faf, - 98: 0x875fd7, - 99: 0x875fff, - 100: 0x878700, - 101: 0x87875f, - 102: 0x878787, - 103: 0x8787af, - 104: 0x8787d7, - 105: 0x8787ff, - 106: 0x87af00, - 107: 0x87af5f, - 108: 0x87af87, - 109: 0x87afaf, - 110: 0x87afd7, - 111: 0x87afff, - 112: 0x87d700, - 113: 0x87d75f, - 114: 0x87d787, - 115: 0x87d7af, - 116: 0x87d7d7, - 117: 0x87d7ff, - 118: 0x87ff00, - 119: 0x87ff5f, - 120: 0x87ff87, - 121: 0x87ffaf, - 122: 0x87ffd7, - 123: 0x87ffff, - 124: 0xaf0000, - 125: 0xaf005f, - 126: 0xaf0087, - 127: 0xaf00af, - 128: 0xaf00d7, - 129: 0xaf00ff, - 130: 0xaf5f00, - 131: 0xaf5f5f, - 132: 0xaf5f87, - 133: 0xaf5faf, - 134: 0xaf5fd7, - 135: 0xaf5fff, - 136: 0xaf8700, - 137: 0xaf875f, - 138: 0xaf8787, - 139: 0xaf87af, - 140: 0xaf87d7, - 141: 0xaf87ff, - 142: 0xafaf00, - 143: 0xafaf5f, - 144: 0xafaf87, - 145: 0xafafaf, - 146: 0xafafd7, - 147: 0xafafff, - 148: 0xafd700, - 149: 0xafd75f, - 150: 0xafd787, - 151: 0xafd7af, - 152: 0xafd7d7, - 153: 0xafd7ff, - 154: 0xafff00, - 155: 0xafff5f, - 156: 0xafff87, - 157: 0xafffaf, - 158: 0xafffd7, - 159: 0xafffff, - 160: 0xd70000, - 161: 0xd7005f, - 162: 0xd70087, - 163: 0xd700af, - 164: 0xd700d7, - 165: 0xd700ff, - 166: 0xd75f00, - 167: 0xd75f5f, - 168: 0xd75f87, - 169: 0xd75faf, - 170: 0xd75fd7, - 171: 0xd75fff, - 172: 0xd78700, - 173: 0xd7875f, - 174: 0xd78787, - 175: 0xd787af, - 176: 0xd787d7, - 177: 0xd787ff, - 178: 0xd7af00, - 179: 0xd7af5f, - 180: 0xd7af87, - 181: 0xd7afaf, - 182: 0xd7afd7, - 183: 0xd7afff, - 184: 0xd7d700, - 185: 0xd7d75f, - 186: 0xd7d787, - 187: 0xd7d7af, - 188: 0xd7d7d7, - 189: 0xd7d7ff, - 190: 0xd7ff00, - 191: 0xd7ff5f, - 192: 0xd7ff87, - 193: 0xd7ffaf, - 194: 0xd7ffd7, - 195: 0xd7ffff, - 196: 0xff0000, - 197: 0xff005f, - 198: 0xff0087, - 199: 0xff00af, - 200: 0xff00d7, - 201: 0xff00ff, - 202: 0xff5f00, - 203: 0xff5f5f, - 204: 0xff5f87, - 205: 0xff5faf, - 206: 0xff5fd7, - 207: 0xff5fff, - 208: 0xff8700, - 209: 0xff875f, - 210: 0xff8787, - 211: 0xff87af, - 212: 0xff87d7, - 213: 0xff87ff, - 214: 0xffaf00, - 215: 0xffaf5f, - 216: 0xffaf87, - 217: 0xffafaf, - 218: 0xffafd7, - 219: 0xffafff, - 220: 0xffd700, - 221: 0xffd75f, - 222: 0xffd787, - 223: 0xffd7af, - 224: 0xffd7d7, - 225: 0xffd7ff, - 226: 0xffff00, - 227: 0xffff5f, - 228: 0xffff87, - 229: 0xffffaf, - 230: 0xffffd7, - 231: 0xffffff, - 232: 0x080808, - 233: 0x121212, - 234: 0x1c1c1c, - 235: 0x262626, - 236: 0x303030, - 237: 0x3a3a3a, - 238: 0x444444, - 239: 0x4e4e4e, - 240: 0x585858, - 241: 0x626262, - 242: 0x6c6c6c, - 243: 0x767676, - 244: 0x808080, - 245: 0x8a8a8a, - 246: 0x949494, - 247: 0x9e9e9e, - 248: 0xa8a8a8, - 249: 0xb2b2b2, - 250: 0xbcbcbc, - 251: 0xc6c6c6, - 252: 0xd0d0d0, - 253: 0xdadada, - 254: 0xe4e4e4, - 255: 0xeeeeee, -} - -func (w *Writer) Write(data []byte) (n int, err error) { - var csbi consoleScreenBufferInfo - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) - - er := bytes.NewBuffer(data) -loop: - for { - r1, _, err := procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) - if r1 == 0 { - break loop - } - - c1, _, err := er.ReadRune() - if err != nil { - break loop - } - if c1 != 0x1b { - fmt.Fprint(w.out, string(c1)) - continue - } - c2, _, err := er.ReadRune() - if err != nil { - w.lastbuf.WriteRune(c1) - break loop - } - if c2 != 0x5b { - w.lastbuf.WriteRune(c1) - w.lastbuf.WriteRune(c2) - continue - } - - var buf bytes.Buffer - var m rune - for { - c, _, err := er.ReadRune() - if err != nil { - w.lastbuf.WriteRune(c1) - w.lastbuf.WriteRune(c2) - w.lastbuf.Write(buf.Bytes()) - break loop - } - if ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '@' { - m = c - break - } - buf.Write([]byte(string(c))) - } - - var csbi consoleScreenBufferInfo - switch m { - case 'A': - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.y -= short(n) - procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'B': - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.y += short(n) - procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'C': - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.x -= short(n) - procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'D': - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - if n, err = strconv.Atoi(buf.String()); err == nil { - var csbi consoleScreenBufferInfo - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.x += short(n) - procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - } - case 'E': - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.x = 0 - csbi.cursorPosition.y += short(n) - procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'F': - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.x = 0 - csbi.cursorPosition.y -= short(n) - procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'G': - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.x = short(n) - procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'H': - token := strings.Split(buf.String(), ";") - if len(token) != 2 { - continue - } - n1, err := strconv.Atoi(token[0]) - if err != nil { - continue - } - n2, err := strconv.Atoi(token[1]) - if err != nil { - continue - } - csbi.cursorPosition.x = short(n2) - csbi.cursorPosition.x = short(n1) - procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'J': - n, err := strconv.Atoi(buf.String()) - if err != nil { - continue - } - var cursor coord - switch n { - case 0: - cursor = coord{x: csbi.cursorPosition.x, y: csbi.cursorPosition.y} - case 1: - cursor = coord{x: csbi.window.left, y: csbi.window.top} - case 2: - cursor = coord{x: csbi.window.left, y: csbi.window.top} - } - var count, written dword - count = dword(csbi.size.x - csbi.cursorPosition.x + (csbi.size.y-csbi.cursorPosition.y)*csbi.size.x) - procFillConsoleOutputCharacter.Call(uintptr(w.handle), uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) - procFillConsoleOutputAttribute.Call(uintptr(w.handle), uintptr(csbi.attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) - case 'K': - n, err := strconv.Atoi(buf.String()) - if err != nil { - continue - } - var cursor coord - switch n { - case 0: - cursor = coord{x: csbi.cursorPosition.x, y: csbi.cursorPosition.y} - case 1: - cursor = coord{x: csbi.window.left, y: csbi.window.top + csbi.cursorPosition.y} - case 2: - cursor = coord{x: csbi.window.left, y: csbi.window.top + csbi.cursorPosition.y} - } - var count, written dword - count = dword(csbi.size.x - csbi.cursorPosition.x) - procFillConsoleOutputCharacter.Call(uintptr(w.handle), uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) - procFillConsoleOutputAttribute.Call(uintptr(w.handle), uintptr(csbi.attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) - case 'm': - attr := csbi.attributes - cs := buf.String() - if cs == "" { - procSetConsoleTextAttribute.Call(uintptr(w.handle), uintptr(w.oldattr)) - continue - } - token := strings.Split(cs, ";") - for i := 0; i < len(token); i += 1 { - ns := token[i] - if n, err = strconv.Atoi(ns); err == nil { - switch { - case n == 0 || n == 100: - attr = w.oldattr - case 1 <= n && n <= 5: - attr |= foregroundIntensity - case n == 7: - attr = ((attr & foregroundMask) << 4) | ((attr & backgroundMask) >> 4) - case 22 == n || n == 25 || n == 25: - attr |= foregroundIntensity - case n == 27: - attr = ((attr & foregroundMask) << 4) | ((attr & backgroundMask) >> 4) - case 30 <= n && n <= 37: - attr = (attr & backgroundMask) - if (n-30)&1 != 0 { - attr |= foregroundRed - } - if (n-30)&2 != 0 { - attr |= foregroundGreen - } - if (n-30)&4 != 0 { - attr |= foregroundBlue - } - case n == 38: // set foreground color. - if i < len(token)-2 && (token[i+1] == "5" || token[i+1] == "05") { - if n256, err := strconv.Atoi(token[i+2]); err == nil { - if n256foreAttr == nil { - n256setup() - } - attr &= backgroundMask - attr |= n256foreAttr[n256] - i += 2 - } - } else { - attr = attr & (w.oldattr & backgroundMask) - } - case n == 39: // reset foreground color. - attr &= backgroundMask - attr |= w.oldattr & foregroundMask - case 40 <= n && n <= 47: - attr = (attr & foregroundMask) - if (n-40)&1 != 0 { - attr |= backgroundRed - } - if (n-40)&2 != 0 { - attr |= backgroundGreen - } - if (n-40)&4 != 0 { - attr |= backgroundBlue - } - case n == 48: // set background color. - if i < len(token)-2 && token[i+1] == "5" { - if n256, err := strconv.Atoi(token[i+2]); err == nil { - if n256backAttr == nil { - n256setup() - } - attr &= foregroundMask - attr |= n256backAttr[n256] - i += 2 - } - } else { - attr = attr & (w.oldattr & foregroundMask) - } - case n == 49: // reset foreground color. - attr &= foregroundMask - attr |= w.oldattr & backgroundMask - case 90 <= n && n <= 97: - attr = (attr & backgroundMask) - attr |= foregroundIntensity - if (n-90)&1 != 0 { - attr |= foregroundRed - } - if (n-90)&2 != 0 { - attr |= foregroundGreen - } - if (n-90)&4 != 0 { - attr |= foregroundBlue - } - case 100 <= n && n <= 107: - attr = (attr & foregroundMask) - attr |= backgroundIntensity - if (n-100)&1 != 0 { - attr |= backgroundRed - } - if (n-100)&2 != 0 { - attr |= backgroundGreen - } - if (n-100)&4 != 0 { - attr |= backgroundBlue - } - } - procSetConsoleTextAttribute.Call(uintptr(w.handle), uintptr(attr)) - } - } - } - } - return len(data) - w.lastbuf.Len(), nil -} - -type consoleColor struct { - rgb int - red bool - green bool - blue bool - intensity bool -} - -func (c consoleColor) foregroundAttr() (attr word) { - if c.red { - attr |= foregroundRed - } - if c.green { - attr |= foregroundGreen - } - if c.blue { - attr |= foregroundBlue - } - if c.intensity { - attr |= foregroundIntensity - } - return -} - -func (c consoleColor) backgroundAttr() (attr word) { - if c.red { - attr |= backgroundRed - } - if c.green { - attr |= backgroundGreen - } - if c.blue { - attr |= backgroundBlue - } - if c.intensity { - attr |= backgroundIntensity - } - return -} - -var color16 = []consoleColor{ - consoleColor{0x000000, false, false, false, false}, - consoleColor{0x000080, false, false, true, false}, - consoleColor{0x008000, false, true, false, false}, - consoleColor{0x008080, false, true, true, false}, - consoleColor{0x800000, true, false, false, false}, - consoleColor{0x800080, true, false, true, false}, - consoleColor{0x808000, true, true, false, false}, - consoleColor{0xc0c0c0, true, true, true, false}, - consoleColor{0x808080, false, false, false, true}, - consoleColor{0x0000ff, false, false, true, true}, - consoleColor{0x00ff00, false, true, false, true}, - consoleColor{0x00ffff, false, true, true, true}, - consoleColor{0xff0000, true, false, false, true}, - consoleColor{0xff00ff, true, false, true, true}, - consoleColor{0xffff00, true, true, false, true}, - consoleColor{0xffffff, true, true, true, true}, -} - -type hsv struct { - h, s, v float32 -} - -func (a hsv) dist(b hsv) float32 { - dh := a.h - b.h - switch { - case dh > 0.5: - dh = 1 - dh - case dh < -0.5: - dh = -1 - dh - } - ds := a.s - b.s - dv := a.v - b.v - return float32(math.Sqrt(float64(dh*dh + ds*ds + dv*dv))) -} - -func toHSV(rgb int) hsv { - r, g, b := float32((rgb&0xFF0000)>>16)/256.0, - float32((rgb&0x00FF00)>>8)/256.0, - float32(rgb&0x0000FF)/256.0 - min, max := minmax3f(r, g, b) - h := max - min - if h > 0 { - if max == r { - h = (g - b) / h - if h < 0 { - h += 6 - } - } else if max == g { - h = 2 + (b-r)/h - } else { - h = 4 + (r-g)/h - } - } - h /= 6.0 - s := max - min - if max != 0 { - s /= max - } - v := max - return hsv{h: h, s: s, v: v} -} - -type hsvTable []hsv - -func toHSVTable(rgbTable []consoleColor) hsvTable { - t := make(hsvTable, len(rgbTable)) - for i, c := range rgbTable { - t[i] = toHSV(c.rgb) - } - return t -} - -func (t hsvTable) find(rgb int) consoleColor { - hsv := toHSV(rgb) - n := 7 - l := float32(5.0) - for i, p := range t { - d := hsv.dist(p) - if d < l { - l, n = d, i - } - } - return color16[n] -} - -func minmax3f(a, b, c float32) (min, max float32) { - if a < b { - if b < c { - return a, c - } else if a < c { - return a, b - } else { - return c, b - } - } else { - if a < c { - return b, c - } else if b < c { - return b, a - } else { - return c, a - } - } -} - -var n256foreAttr []word -var n256backAttr []word - -func n256setup() { - n256foreAttr = make([]word, 256) - n256backAttr = make([]word, 256) - t := toHSVTable(color16) - for i, rgb := range color256 { - c := t.find(rgb) - n256foreAttr[i] = c.foregroundAttr() - n256backAttr[i] = c.backgroundAttr() - } -} diff --git a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable/noncolorable.go b/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable/noncolorable.go deleted file mode 100644 index fb976dbd8..000000000 --- a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable/noncolorable.go +++ /dev/null @@ -1,57 +0,0 @@ -package colorable - -import ( - "bytes" - "fmt" - "io" -) - -type NonColorable struct { - out io.Writer - lastbuf bytes.Buffer -} - -func NewNonColorable(w io.Writer) io.Writer { - return &NonColorable{out: w} -} - -func (w *NonColorable) Write(data []byte) (n int, err error) { - er := bytes.NewBuffer(data) -loop: - for { - c1, _, err := er.ReadRune() - if err != nil { - break loop - } - if c1 != 0x1b { - fmt.Fprint(w.out, string(c1)) - continue - } - c2, _, err := er.ReadRune() - if err != nil { - w.lastbuf.WriteRune(c1) - break loop - } - if c2 != 0x5b { - w.lastbuf.WriteRune(c1) - w.lastbuf.WriteRune(c2) - continue - } - - var buf bytes.Buffer - for { - c, _, err := er.ReadRune() - if err != nil { - w.lastbuf.WriteRune(c1) - w.lastbuf.WriteRune(c2) - w.lastbuf.Write(buf.Bytes()) - break loop - } - if ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '@' { - break - } - buf.Write([]byte(string(c))) - } - } - return len(data) - w.lastbuf.Len(), nil -} diff --git a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/LICENSE b/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/LICENSE deleted file mode 100644 index 65dc692b6..000000000 --- a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/LICENSE +++ /dev/null @@ -1,9 +0,0 @@ -Copyright (c) Yasuhiro MATSUMOTO - -MIT License (Expat) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/README.md b/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/README.md deleted file mode 100644 index 74845de4a..000000000 --- a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# go-isatty - -isatty for golang - -## Usage - -```go -package main - -import ( - "fmt" - "github.com/mattn/go-isatty" - "os" -) - -func main() { - if isatty.IsTerminal(os.Stdout.Fd()) { - fmt.Println("Is Terminal") - } else { - fmt.Println("Is Not Terminal") - } -} -``` - -## Installation - -``` -$ go get github.com/mattn/go-isatty -``` - -# License - -MIT - -# Author - -Yasuhiro Matsumoto (a.k.a mattn) diff --git a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/doc.go b/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/doc.go deleted file mode 100644 index 17d4f90eb..000000000 --- a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package isatty implements interface to isatty -package isatty diff --git a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/isatty_appengine.go b/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/isatty_appengine.go deleted file mode 100644 index 83c588773..000000000 --- a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/isatty_appengine.go +++ /dev/null @@ -1,9 +0,0 @@ -// +build appengine - -package isatty - -// IsTerminal returns true if the file descriptor is terminal which -// is always false on on appengine classic which is a sandboxed PaaS. -func IsTerminal(fd uintptr) bool { - return false -} diff --git a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/isatty_bsd.go b/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/isatty_bsd.go deleted file mode 100644 index 98ffe86a4..000000000 --- a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/isatty_bsd.go +++ /dev/null @@ -1,18 +0,0 @@ -// +build darwin freebsd openbsd netbsd -// +build !appengine - -package isatty - -import ( - "syscall" - "unsafe" -) - -const ioctlReadTermios = syscall.TIOCGETA - -// IsTerminal return true if the file descriptor is terminal. -func IsTerminal(fd uintptr) bool { - var termios syscall.Termios - _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) - return err == 0 -} diff --git a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/isatty_linux.go b/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/isatty_linux.go deleted file mode 100644 index 9d24bac1d..000000000 --- a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/isatty_linux.go +++ /dev/null @@ -1,18 +0,0 @@ -// +build linux -// +build !appengine - -package isatty - -import ( - "syscall" - "unsafe" -) - -const ioctlReadTermios = syscall.TCGETS - -// IsTerminal return true if the file descriptor is terminal. -func IsTerminal(fd uintptr) bool { - var termios syscall.Termios - _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) - return err == 0 -} diff --git a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/isatty_solaris.go b/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/isatty_solaris.go deleted file mode 100644 index 1f0c6bf53..000000000 --- a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/isatty_solaris.go +++ /dev/null @@ -1,16 +0,0 @@ -// +build solaris -// +build !appengine - -package isatty - -import ( - "golang.org/x/sys/unix" -) - -// IsTerminal returns true if the given file descriptor is a terminal. -// see: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libbc/libc/gen/common/isatty.c -func IsTerminal(fd uintptr) bool { - var termio unix.Termio - err := unix.IoctlSetTermio(int(fd), unix.TCGETA, &termio) - return err == nil -} diff --git a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/isatty_windows.go b/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/isatty_windows.go deleted file mode 100644 index 83c398b16..000000000 --- a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/isatty_windows.go +++ /dev/null @@ -1,19 +0,0 @@ -// +build windows -// +build !appengine - -package isatty - -import ( - "syscall" - "unsafe" -) - -var kernel32 = syscall.NewLazyDLL("kernel32.dll") -var procGetConsoleMode = kernel32.NewProc("GetConsoleMode") - -// IsTerminal return true if the file descriptor is terminal. -func IsTerminal(fd uintptr) bool { - var st uint32 - r, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, fd, uintptr(unsafe.Pointer(&st)), 0) - return r != 0 && e == 0 -} diff --git a/vendor/github.com/onsi/ginkgo/reporters/teamcity_reporter.go b/vendor/github.com/onsi/ginkgo/reporters/teamcity_reporter.go deleted file mode 100644 index c8e27b2a7..000000000 --- a/vendor/github.com/onsi/ginkgo/reporters/teamcity_reporter.go +++ /dev/null @@ -1,98 +0,0 @@ -/* - -TeamCity Reporter for Ginkgo - -Makes use of TeamCity's support for Service Messages -http://confluence.jetbrains.com/display/TCD7/Build+Script+Interaction+with+TeamCity#BuildScriptInteractionwithTeamCity-ReportingTests -*/ - -package reporters - -import ( - "fmt" - "io" - "strings" - - "github.com/onsi/ginkgo/config" - "github.com/onsi/ginkgo/types" -) - -const ( - messageId = "##teamcity" -) - -type TeamCityReporter struct { - writer io.Writer - testSuiteName string - ReporterConfig config.DefaultReporterConfigType -} - -func NewTeamCityReporter(writer io.Writer) *TeamCityReporter { - return &TeamCityReporter{ - writer: writer, - } -} - -func (reporter *TeamCityReporter) SpecSuiteWillBegin(config config.GinkgoConfigType, summary *types.SuiteSummary) { - reporter.testSuiteName = escape(summary.SuiteDescription) - fmt.Fprintf(reporter.writer, "%s[testSuiteStarted name='%s']", messageId, reporter.testSuiteName) -} - -func (reporter *TeamCityReporter) BeforeSuiteDidRun(setupSummary *types.SetupSummary) { - reporter.handleSetupSummary("BeforeSuite", setupSummary) -} - -func (reporter *TeamCityReporter) AfterSuiteDidRun(setupSummary *types.SetupSummary) { - reporter.handleSetupSummary("AfterSuite", setupSummary) -} - -func (reporter *TeamCityReporter) handleSetupSummary(name string, setupSummary *types.SetupSummary) { - if setupSummary.State != types.SpecStatePassed { - testName := escape(name) - fmt.Fprintf(reporter.writer, "%s[testStarted name='%s']", messageId, testName) - message := escape(setupSummary.Failure.ComponentCodeLocation.String()) - details := escape(setupSummary.Failure.Message) - fmt.Fprintf(reporter.writer, "%s[testFailed name='%s' message='%s' details='%s']", messageId, testName, message, details) - durationInMilliseconds := setupSummary.RunTime.Seconds() * 1000 - fmt.Fprintf(reporter.writer, "%s[testFinished name='%s' duration='%v']", messageId, testName, durationInMilliseconds) - } -} - -func (reporter *TeamCityReporter) SpecWillRun(specSummary *types.SpecSummary) { - testName := escape(strings.Join(specSummary.ComponentTexts[1:], " ")) - fmt.Fprintf(reporter.writer, "%s[testStarted name='%s']", messageId, testName) -} - -func (reporter *TeamCityReporter) SpecDidComplete(specSummary *types.SpecSummary) { - testName := escape(strings.Join(specSummary.ComponentTexts[1:], " ")) - - if reporter.ReporterConfig.ReportPassed && specSummary.State == types.SpecStatePassed { - details := escape(specSummary.CapturedOutput) - fmt.Fprintf(reporter.writer, "%s[testPassed name='%s' details='%s']", messageId, testName, details) - } - if specSummary.State == types.SpecStateFailed || specSummary.State == types.SpecStateTimedOut || specSummary.State == types.SpecStatePanicked { - message := escape(specSummary.Failure.ComponentCodeLocation.String()) - details := escape(specSummary.Failure.Message) - fmt.Fprintf(reporter.writer, "%s[testFailed name='%s' message='%s' details='%s']", messageId, testName, message, details) - } - if specSummary.State == types.SpecStateSkipped || specSummary.State == types.SpecStatePending { - fmt.Fprintf(reporter.writer, "%s[testIgnored name='%s']", messageId, testName) - } - - durationInMilliseconds := specSummary.RunTime.Seconds() * 1000 - fmt.Fprintf(reporter.writer, "%s[testFinished name='%s' duration='%v']", messageId, testName, durationInMilliseconds) -} - -func (reporter *TeamCityReporter) SpecSuiteDidEnd(summary *types.SuiteSummary) { - fmt.Fprintf(reporter.writer, "%s[testSuiteFinished name='%s']", messageId, reporter.testSuiteName) -} - -func escape(output string) string { - output = strings.Replace(output, "|", "||", -1) - output = strings.Replace(output, "'", "|'", -1) - output = strings.Replace(output, "\n", "|n", -1) - output = strings.Replace(output, "\r", "|r", -1) - output = strings.Replace(output, "[", "|[", -1) - output = strings.Replace(output, "]", "|]", -1) - return output -} diff --git a/vendor/github.com/onsi/ginkgo/types/code_location.go b/vendor/github.com/onsi/ginkgo/types/code_location.go deleted file mode 100644 index 935a89e13..000000000 --- a/vendor/github.com/onsi/ginkgo/types/code_location.go +++ /dev/null @@ -1,15 +0,0 @@ -package types - -import ( - "fmt" -) - -type CodeLocation struct { - FileName string - LineNumber int - FullStackTrace string -} - -func (codeLocation CodeLocation) String() string { - return fmt.Sprintf("%s:%d", codeLocation.FileName, codeLocation.LineNumber) -} diff --git a/vendor/github.com/onsi/ginkgo/types/synchronization.go b/vendor/github.com/onsi/ginkgo/types/synchronization.go deleted file mode 100644 index fdd6ed5bd..000000000 --- a/vendor/github.com/onsi/ginkgo/types/synchronization.go +++ /dev/null @@ -1,30 +0,0 @@ -package types - -import ( - "encoding/json" -) - -type RemoteBeforeSuiteState int - -const ( - RemoteBeforeSuiteStateInvalid RemoteBeforeSuiteState = iota - - RemoteBeforeSuiteStatePending - RemoteBeforeSuiteStatePassed - RemoteBeforeSuiteStateFailed - RemoteBeforeSuiteStateDisappeared -) - -type RemoteBeforeSuiteData struct { - Data []byte - State RemoteBeforeSuiteState -} - -func (r RemoteBeforeSuiteData) ToJSON() []byte { - data, _ := json.Marshal(r) - return data -} - -type RemoteAfterSuiteData struct { - CanRun bool -} diff --git a/vendor/github.com/onsi/ginkgo/types/types.go b/vendor/github.com/onsi/ginkgo/types/types.go deleted file mode 100644 index e4e32b761..000000000 --- a/vendor/github.com/onsi/ginkgo/types/types.go +++ /dev/null @@ -1,174 +0,0 @@ -package types - -import ( - "strconv" - "time" -) - -const GINKGO_FOCUS_EXIT_CODE = 197 - -/* -SuiteSummary represents the a summary of the test suite and is passed to both -Reporter.SpecSuiteWillBegin -Reporter.SpecSuiteDidEnd - -this is unfortunate as these two methods should receive different objects. When running in parallel -each node does not deterministically know how many specs it will end up running. - -Unfortunately making such a change would break backward compatibility. - -Until Ginkgo 2.0 comes out we will continue to reuse this struct but populate unknown fields -with -1. -*/ -type SuiteSummary struct { - SuiteDescription string - SuiteSucceeded bool - SuiteID string - - NumberOfSpecsBeforeParallelization int - NumberOfTotalSpecs int - NumberOfSpecsThatWillBeRun int - NumberOfPendingSpecs int - NumberOfSkippedSpecs int - NumberOfPassedSpecs int - NumberOfFailedSpecs int - // Flaked specs are those that failed initially, but then passed on a - // subsequent try. - NumberOfFlakedSpecs int - RunTime time.Duration -} - -type SpecSummary struct { - ComponentTexts []string - ComponentCodeLocations []CodeLocation - - State SpecState - RunTime time.Duration - Failure SpecFailure - IsMeasurement bool - NumberOfSamples int - Measurements map[string]*SpecMeasurement - - CapturedOutput string - SuiteID string -} - -func (s SpecSummary) HasFailureState() bool { - return s.State.IsFailure() -} - -func (s SpecSummary) TimedOut() bool { - return s.State == SpecStateTimedOut -} - -func (s SpecSummary) Panicked() bool { - return s.State == SpecStatePanicked -} - -func (s SpecSummary) Failed() bool { - return s.State == SpecStateFailed -} - -func (s SpecSummary) Passed() bool { - return s.State == SpecStatePassed -} - -func (s SpecSummary) Skipped() bool { - return s.State == SpecStateSkipped -} - -func (s SpecSummary) Pending() bool { - return s.State == SpecStatePending -} - -type SetupSummary struct { - ComponentType SpecComponentType - CodeLocation CodeLocation - - State SpecState - RunTime time.Duration - Failure SpecFailure - - CapturedOutput string - SuiteID string -} - -type SpecFailure struct { - Message string - Location CodeLocation - ForwardedPanic string - - ComponentIndex int - ComponentType SpecComponentType - ComponentCodeLocation CodeLocation -} - -type SpecMeasurement struct { - Name string - Info interface{} - Order int - - Results []float64 - - Smallest float64 - Largest float64 - Average float64 - StdDeviation float64 - - SmallestLabel string - LargestLabel string - AverageLabel string - Units string - Precision int -} - -func (s SpecMeasurement) PrecisionFmt() string { - if s.Precision == 0 { - return "%f" - } - - str := strconv.Itoa(s.Precision) - - return "%." + str + "f" -} - -type SpecState uint - -const ( - SpecStateInvalid SpecState = iota - - SpecStatePending - SpecStateSkipped - SpecStatePassed - SpecStateFailed - SpecStatePanicked - SpecStateTimedOut -) - -func (state SpecState) IsFailure() bool { - return state == SpecStateTimedOut || state == SpecStatePanicked || state == SpecStateFailed -} - -type SpecComponentType uint - -const ( - SpecComponentTypeInvalid SpecComponentType = iota - - SpecComponentTypeContainer - SpecComponentTypeBeforeSuite - SpecComponentTypeAfterSuite - SpecComponentTypeBeforeEach - SpecComponentTypeJustBeforeEach - SpecComponentTypeJustAfterEach - SpecComponentTypeAfterEach - SpecComponentTypeIt - SpecComponentTypeMeasure -) - -type FlagType uint - -const ( - FlagTypeNone FlagType = iota - FlagTypeFocused - FlagTypePending -) diff --git a/vendor/github.com/onsi/gomega/.gitignore b/vendor/github.com/onsi/gomega/.gitignore deleted file mode 100644 index 720c13cba..000000000 --- a/vendor/github.com/onsi/gomega/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.DS_Store -*.test -. -.idea -gomega.iml diff --git a/vendor/github.com/onsi/gomega/.travis.yml b/vendor/github.com/onsi/gomega/.travis.yml deleted file mode 100644 index d147e451d..000000000 --- a/vendor/github.com/onsi/gomega/.travis.yml +++ /dev/null @@ -1,18 +0,0 @@ -language: go - -go: - - 1.10.x - - 1.11.x - - 1.12.x - - gotip - -env: - - GO111MODULE=on - -install: - - go get -v ./... - - go build ./... - - go get github.com/onsi/ginkgo - - go install github.com/onsi/ginkgo/ginkgo - -script: make test diff --git a/vendor/github.com/onsi/gomega/CHANGELOG.md b/vendor/github.com/onsi/gomega/CHANGELOG.md deleted file mode 100644 index ecbdd2734..000000000 --- a/vendor/github.com/onsi/gomega/CHANGELOG.md +++ /dev/null @@ -1,173 +0,0 @@ -## 1.7.1 - -### Fixes -- Bump go-yaml version to cover fixed ddos heuristic (#362) [95e431e] - -## 1.7.0 - -### Features -- export format property variables (#347) [642e5ba] - -### Fixes -- minor fix in the documentation of ExpectWithOffset (#358) [beea727] - -## 1.6.0 - -### Features - -- Display special chars on error [41e1b26] -- Add BeElementOf matcher [6a48b48] - -### Fixes - -- Remove duplication in XML matcher tests [cc1a6cb] -- Remove unnecessary conversions (#357) [7bf756a] -- Fixed import order (#353) [2e3b965] -- Added missing error handling in test (#355) [c98d3eb] -- Simplify code (#356) [0001ed9] -- Simplify code (#354) [0d9100e] -- Fixed typos (#352) [3f647c4] -- Add failure message tests to BeElementOf matcher [efe19c3] -- Update go-testcov untested sections [37ee382] -- Mark all uncovered files so go-testcov ./... works [53b150e] -- Reenable gotip in travis [5c249dc] -- Fix the typo of comment (#345) [f0e010e] -- Optimize contain_element_matcher [abeb93d] - - -## 1.5.0 - -### Features - -- Added MatchKeys matchers [8b909fc] - -### Fixes and Minor Improvements - -- Add type aliases to remove stuttering [03b0461] -- Don't run session_test.go on windows (#324) [5533ce8] - -## 1.4.3 - -### Fixes: - -- ensure file name and line numbers are correctly reported for XUnit [6fff58f] -- Fixed matcher for content-type (#305) [69d9b43] - -## 1.4.2 - -### Fixes: - -- Add go.mod and go.sum files to define the gomega go module [f3de367, a085d30] -- Work around go vet issue with Go v1.11 (#300) [40dd6ad] -- Better output when using with go XUnit-style tests, fixes #255 (#297) [29a4b97] -- Fix MatchJSON fail to parse json.RawMessage (#298) [ae19f1b] -- show threshold in failure message of BeNumericallyMatcher (#293) [4bbecc8] - -## 1.4.1 - -### Fixes: - -- Update documentation formatting and examples (#289) [9be8410] -- allow 'Receive' matcher to be used with concrete types (#286) [41673fd] -- Fix data race in ghttp server (#283) [7ac6b01] -- Travis badge should only show master [cc102ab] - -## 1.4.0 - -### Features -- Make string pretty diff user configurable (#273) [eb112ce, 649b44d] - -### Fixes -- Use httputil.DumpRequest to pretty-print unhandled requests (#278) [a4ff0fc, b7d1a52] -- fix typo floa32 > float32 (#272) [041ae3b, 6e33911] -- Fix link to documentation on adding your own matchers (#270) [bb2c830, fcebc62] -- Use setters and getters to avoid race condition (#262) [13057c3, a9c79f1] -- Avoid sending a signal if the process is not alive (#259) [b8043e5, 4fc1762] -- Improve message from AssignableToTypeOf when expected value is nil (#281) [9c1fb20] - -## 1.3.0 - -Improvements: - -- The `Equal` matcher matches byte slices more performantly. -- Improved how `MatchError` matches error strings. -- `MatchXML` ignores the order of xml node attributes. -- Improve support for XUnit style golang tests. ([#254](https://github.com/onsi/gomega/issues/254)) - -Bug Fixes: - -- Diff generation now handles multi-byte sequences correctly. -- Multiple goroutines can now call `gexec.Build` concurrently. - -## 1.2.0 - -Improvements: - -- Added `BeSent` which attempts to send a value down a channel and fails if the attempt blocks. Can be paired with `Eventually` to safely send a value down a channel with a timeout. -- `Ω`, `Expect`, `Eventually`, and `Consistently` now immediately `panic` if there is no registered fail handler. This is always a mistake that can hide failing tests. -- `Receive()` no longer errors when passed a closed channel, it's perfectly fine to attempt to read from a closed channel so Ω(c).Should(Receive()) always fails and Ω(c).ShoudlNot(Receive()) always passes with a closed channel. -- Added `HavePrefix` and `HaveSuffix` matchers. -- `ghttp` can now handle concurrent requests. -- Added `Succeed` which allows one to write `Ω(MyFunction()).Should(Succeed())`. -- Improved `ghttp`'s behavior around failing assertions and panics: - - If a registered handler makes a failing assertion `ghttp` will return `500`. - - If a registered handler panics, `ghttp` will return `500` *and* fail the test. This is new behavior that may cause existing code to break. This code is almost certainly incorrect and creating a false positive. -- `ghttp` servers can take an `io.Writer`. `ghttp` will write a line to the writer when each request arrives. -- Added `WithTransform` matcher to allow munging input data before feeding into the relevant matcher -- Added boolean `And`, `Or`, and `Not` matchers to allow creating composite matchers -- Added `gbytes.TimeoutCloser`, `gbytes.TimeoutReader`, and `gbytes.TimeoutWriter` - these are convenience wrappers that timeout if the underlying Closer/Reader/Writer does not return within the alloted time. -- Added `gbytes.BufferReader` - this constructs a `gbytes.Buffer` that asynchronously reads the passed-in `io.Reader` into its buffer. - -Bug Fixes: -- gexec: `session.Wait` now uses `EventuallyWithOffset` to get the right line number in the failure. -- `ContainElement` no longer bails if a passed-in matcher errors. - -## 1.0 (8/2/2014) - -No changes. Dropping "beta" from the version number. - -## 1.0.0-beta (7/8/2014) -Breaking Changes: - -- Changed OmegaMatcher interface. Instead of having `Match` return failure messages, two new methods `FailureMessage` and `NegatedFailureMessage` are called instead. -- Moved and renamed OmegaFailHandler to types.GomegaFailHandler and OmegaMatcher to types.GomegaMatcher. Any references to OmegaMatcher in any custom matchers will need to be changed to point to types.GomegaMatcher - -New Test-Support Features: - -- `ghttp`: supports testing http clients - - Provides a flexible fake http server - - Provides a collection of chainable http handlers that perform assertions. -- `gbytes`: supports making ordered assertions against streams of data - - Provides a `gbytes.Buffer` - - Provides a `Say` matcher to perform ordered assertions against output data -- `gexec`: supports testing external processes - - Provides support for building Go binaries - - Wraps and starts `exec.Cmd` commands - - Makes it easy to assert against stdout and stderr - - Makes it easy to send signals and wait for processes to exit - - Provides an `Exit` matcher to assert against exit code. - -DSL Changes: - -- `Eventually` and `Consistently` can accept `time.Duration` interval and polling inputs. -- The default timeouts for `Eventually` and `Consistently` are now configurable. - -New Matchers: - -- `ConsistOf`: order-independent assertion against the elements of an array/slice or keys of a map. -- `BeTemporally`: like `BeNumerically` but for `time.Time` -- `HaveKeyWithValue`: asserts a map has a given key with the given value. - -Updated Matchers: - -- `Receive` matcher can take a matcher as an argument and passes only if the channel under test receives an objet that satisfies the passed-in matcher. -- Matchers that implement `MatchMayChangeInTheFuture(actual interface{}) bool` can inform `Eventually` and/or `Consistently` when a match has no chance of changing status in the future. For example, `Receive` returns `false` when a channel is closed. - -Misc: - -- Start using semantic versioning -- Start maintaining changelog - -Major refactor: - -- Pull out Gomega's internal to `internal` diff --git a/vendor/github.com/onsi/gomega/CONTRIBUTING.md b/vendor/github.com/onsi/gomega/CONTRIBUTING.md deleted file mode 100644 index 0d7a09928..000000000 --- a/vendor/github.com/onsi/gomega/CONTRIBUTING.md +++ /dev/null @@ -1,14 +0,0 @@ -# Contributing to Gomega - -Your contributions to Gomega are essential for its long-term maintenance and improvement. To make a contribution: - -- Please **open an issue first** - describe what problem you are trying to solve and give the community a forum for input and feedback ahead of investing time in writing code! -- Ensure adequate test coverage: - - Make sure to add appropriate unit tests - - Please run all tests locally (`ginkgo -r -p`) and make sure they go green before submitting the PR - - Please run following linter locally `go vet ./...` and make sure output does not contain any warnings -- Update the documentation. In addition to standard `godoc` comments Gomega has extensive documentation on the `gh-pages` branch. If relevant, please submit a docs PR to that branch alongside your code PR. - -If you're a committer, check out RELEASING.md to learn how to cut a release. - -Thanks for supporting Gomega! diff --git a/vendor/github.com/onsi/gomega/LICENSE b/vendor/github.com/onsi/gomega/LICENSE deleted file mode 100644 index 9415ee72c..000000000 --- a/vendor/github.com/onsi/gomega/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2013-2014 Onsi Fakhouri - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/onsi/gomega/Makefile b/vendor/github.com/onsi/gomega/Makefile deleted file mode 100644 index c92cd56e3..000000000 --- a/vendor/github.com/onsi/gomega/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -test: - [ -z "`gofmt -s -w -l -e .`" ] - go vet - ginkgo -p -r --randomizeAllSpecs --failOnPending --randomizeSuites --race - -.PHONY: test diff --git a/vendor/github.com/onsi/gomega/README.md b/vendor/github.com/onsi/gomega/README.md deleted file mode 100644 index 76aa6b558..000000000 --- a/vendor/github.com/onsi/gomega/README.md +++ /dev/null @@ -1,21 +0,0 @@ -![Gomega: Ginkgo's Preferred Matcher Library](http://onsi.github.io/gomega/images/gomega.png) - -[![Build Status](https://travis-ci.org/onsi/gomega.svg?branch=master)](https://travis-ci.org/onsi/gomega) - -Jump straight to the [docs](http://onsi.github.io/gomega/) to learn about Gomega, including a list of [all available matchers](http://onsi.github.io/gomega/#provided-matchers). - -If you have a question, comment, bug report, feature request, etc. please open a GitHub issue. - -## [Ginkgo](http://github.com/onsi/ginkgo): a BDD Testing Framework for Golang - -Learn more about Ginkgo [here](http://onsi.github.io/ginkgo/) - -## Community Matchers - -A collection of community matchers is available on the [wiki](https://github.com/onsi/gomega/wiki). - -## License - -Gomega is MIT-Licensed - -The `ConsistOf` matcher uses [goraph](https://github.com/amitkgupta/goraph) which is embedded in the source to simplify distribution. goraph has an MIT license. diff --git a/vendor/github.com/onsi/gomega/RELEASING.md b/vendor/github.com/onsi/gomega/RELEASING.md deleted file mode 100644 index 998d64ee7..000000000 --- a/vendor/github.com/onsi/gomega/RELEASING.md +++ /dev/null @@ -1,12 +0,0 @@ -A Gomega release is a tagged sha and a GitHub release. To cut a release: - -1. Ensure CHANGELOG.md is up to date. - - Use `git log --pretty=format:'- %s [%h]' HEAD...vX.X.X` to list all the commits since the last release - - Categorize the changes into - - Breaking Changes (requires a major version) - - New Features (minor version) - - Fixes (fix version) - - Maintenance (which in general should not be mentioned in `CHANGELOG.md` as they have no user impact) -2. Update GOMEGA_VERSION in `gomega_dsl.go` -3. Push a commit with the version number as the commit message (e.g. `v1.3.0`) -4. Create a new [GitHub release](https://help.github.com/articles/creating-releases/) with the version number as the tag (e.g. `v1.3.0`). List the key changes in the release notes. diff --git a/vendor/github.com/onsi/gomega/format/format.go b/vendor/github.com/onsi/gomega/format/format.go deleted file mode 100644 index fae25adce..000000000 --- a/vendor/github.com/onsi/gomega/format/format.go +++ /dev/null @@ -1,397 +0,0 @@ -/* -Gomega's format package pretty-prints objects. It explores input objects recursively and generates formatted, indented output with type information. -*/ - -// untested sections: 4 - -package format - -import ( - "fmt" - "reflect" - "strconv" - "strings" - "time" -) - -// Use MaxDepth to set the maximum recursion depth when printing deeply nested objects -var MaxDepth = uint(10) - -/* -By default, all objects (even those that implement fmt.Stringer and fmt.GoStringer) are recursively inspected to generate output. - -Set UseStringerRepresentation = true to use GoString (for fmt.GoStringers) or String (for fmt.Stringer) instead. - -Note that GoString and String don't always have all the information you need to understand why a test failed! -*/ -var UseStringerRepresentation = false - -/* -Print the content of context objects. By default it will be suppressed. - -Set PrintContextObjects = true to enable printing of the context internals. -*/ -var PrintContextObjects = false - -// TruncatedDiff choose if we should display a truncated pretty diff or not -var TruncatedDiff = true - -// TruncateThreshold (default 50) specifies the maximum length string to print in string comparison assertion error -// messages. -var TruncateThreshold uint = 50 - -// CharactersAroundMismatchToInclude (default 5) specifies how many contextual characters should be printed before and -// after the first diff location in a truncated string assertion error message. -var CharactersAroundMismatchToInclude uint = 5 - -// Ctx interface defined here to keep backwards compatibility with go < 1.7 -// It matches the context.Context interface -type Ctx interface { - Deadline() (deadline time.Time, ok bool) - Done() <-chan struct{} - Err() error - Value(key interface{}) interface{} -} - -var contextType = reflect.TypeOf((*Ctx)(nil)).Elem() -var timeType = reflect.TypeOf(time.Time{}) - -//The default indentation string emitted by the format package -var Indent = " " - -var longFormThreshold = 20 - -/* -Generates a formatted matcher success/failure message of the form: - - Expected - - - - -If expected is omitted, then the message looks like: - - Expected - - -*/ -func Message(actual interface{}, message string, expected ...interface{}) string { - if len(expected) == 0 { - return fmt.Sprintf("Expected\n%s\n%s", Object(actual, 1), message) - } - return fmt.Sprintf("Expected\n%s\n%s\n%s", Object(actual, 1), message, Object(expected[0], 1)) -} - -/* - -Generates a nicely formatted matcher success / failure message - -Much like Message(...), but it attempts to pretty print diffs in strings - -Expected - : "...aaaaabaaaaa..." -to equal | - : "...aaaaazaaaaa..." - -*/ - -func MessageWithDiff(actual, message, expected string) string { - if TruncatedDiff && len(actual) >= int(TruncateThreshold) && len(expected) >= int(TruncateThreshold) { - diffPoint := findFirstMismatch(actual, expected) - formattedActual := truncateAndFormat(actual, diffPoint) - formattedExpected := truncateAndFormat(expected, diffPoint) - - spacesBeforeFormattedMismatch := findFirstMismatch(formattedActual, formattedExpected) - - tabLength := 4 - spaceFromMessageToActual := tabLength + len(": ") - len(message) - padding := strings.Repeat(" ", spaceFromMessageToActual+spacesBeforeFormattedMismatch) + "|" - return Message(formattedActual, message+padding, formattedExpected) - } - - actual = escapedWithGoSyntax(actual) - expected = escapedWithGoSyntax(expected) - - return Message(actual, message, expected) -} - -func escapedWithGoSyntax(str string) string { - withQuotes := fmt.Sprintf("%q", str) - return withQuotes[1 : len(withQuotes)-1] -} - -func truncateAndFormat(str string, index int) string { - leftPadding := `...` - rightPadding := `...` - - start := index - int(CharactersAroundMismatchToInclude) - if start < 0 { - start = 0 - leftPadding = "" - } - - // slice index must include the mis-matched character - lengthOfMismatchedCharacter := 1 - end := index + int(CharactersAroundMismatchToInclude) + lengthOfMismatchedCharacter - if end > len(str) { - end = len(str) - rightPadding = "" - - } - return fmt.Sprintf("\"%s\"", leftPadding+str[start:end]+rightPadding) -} - -func findFirstMismatch(a, b string) int { - aSlice := strings.Split(a, "") - bSlice := strings.Split(b, "") - - for index, str := range aSlice { - if index > len(bSlice)-1 { - return index - } - if str != bSlice[index] { - return index - } - } - - if len(b) > len(a) { - return len(a) + 1 - } - - return 0 -} - -/* -Pretty prints the passed in object at the passed in indentation level. - -Object recurses into deeply nested objects emitting pretty-printed representations of their components. - -Modify format.MaxDepth to control how deep the recursion is allowed to go -Set format.UseStringerRepresentation to true to return object.GoString() or object.String() when available instead of -recursing into the object. - -Set PrintContextObjects to true to print the content of objects implementing context.Context -*/ -func Object(object interface{}, indentation uint) string { - indent := strings.Repeat(Indent, int(indentation)) - value := reflect.ValueOf(object) - return fmt.Sprintf("%s<%s>: %s", indent, formatType(object), formatValue(value, indentation)) -} - -/* -IndentString takes a string and indents each line by the specified amount. -*/ -func IndentString(s string, indentation uint) string { - components := strings.Split(s, "\n") - result := "" - indent := strings.Repeat(Indent, int(indentation)) - for i, component := range components { - result += indent + component - if i < len(components)-1 { - result += "\n" - } - } - - return result -} - -func formatType(object interface{}) string { - t := reflect.TypeOf(object) - if t == nil { - return "nil" - } - switch t.Kind() { - case reflect.Chan: - v := reflect.ValueOf(object) - return fmt.Sprintf("%T | len:%d, cap:%d", object, v.Len(), v.Cap()) - case reflect.Ptr: - return fmt.Sprintf("%T | %p", object, object) - case reflect.Slice: - v := reflect.ValueOf(object) - return fmt.Sprintf("%T | len:%d, cap:%d", object, v.Len(), v.Cap()) - case reflect.Map: - v := reflect.ValueOf(object) - return fmt.Sprintf("%T | len:%d", object, v.Len()) - default: - return fmt.Sprintf("%T", object) - } -} - -func formatValue(value reflect.Value, indentation uint) string { - if indentation > MaxDepth { - return "..." - } - - if isNilValue(value) { - return "nil" - } - - if UseStringerRepresentation { - if value.CanInterface() { - obj := value.Interface() - switch x := obj.(type) { - case fmt.GoStringer: - return x.GoString() - case fmt.Stringer: - return x.String() - } - } - } - - if !PrintContextObjects { - if value.Type().Implements(contextType) && indentation > 1 { - return "" - } - } - - switch value.Kind() { - case reflect.Bool: - return fmt.Sprintf("%v", value.Bool()) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return fmt.Sprintf("%v", value.Int()) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - return fmt.Sprintf("%v", value.Uint()) - case reflect.Uintptr: - return fmt.Sprintf("0x%x", value.Uint()) - case reflect.Float32, reflect.Float64: - return fmt.Sprintf("%v", value.Float()) - case reflect.Complex64, reflect.Complex128: - return fmt.Sprintf("%v", value.Complex()) - case reflect.Chan: - return fmt.Sprintf("0x%x", value.Pointer()) - case reflect.Func: - return fmt.Sprintf("0x%x", value.Pointer()) - case reflect.Ptr: - return formatValue(value.Elem(), indentation) - case reflect.Slice: - return formatSlice(value, indentation) - case reflect.String: - return formatString(value.String(), indentation) - case reflect.Array: - return formatSlice(value, indentation) - case reflect.Map: - return formatMap(value, indentation) - case reflect.Struct: - if value.Type() == timeType && value.CanInterface() { - t, _ := value.Interface().(time.Time) - return t.Format(time.RFC3339Nano) - } - return formatStruct(value, indentation) - case reflect.Interface: - return formatValue(value.Elem(), indentation) - default: - if value.CanInterface() { - return fmt.Sprintf("%#v", value.Interface()) - } - return fmt.Sprintf("%#v", value) - } -} - -func formatString(object interface{}, indentation uint) string { - if indentation == 1 { - s := fmt.Sprintf("%s", object) - components := strings.Split(s, "\n") - result := "" - for i, component := range components { - if i == 0 { - result += component - } else { - result += Indent + component - } - if i < len(components)-1 { - result += "\n" - } - } - - return result - } else { - return fmt.Sprintf("%q", object) - } -} - -func formatSlice(v reflect.Value, indentation uint) string { - if v.Kind() == reflect.Slice && v.Type().Elem().Kind() == reflect.Uint8 && isPrintableString(string(v.Bytes())) { - return formatString(v.Bytes(), indentation) - } - - l := v.Len() - result := make([]string, l) - longest := 0 - for i := 0; i < l; i++ { - result[i] = formatValue(v.Index(i), indentation+1) - if len(result[i]) > longest { - longest = len(result[i]) - } - } - - if longest > longFormThreshold { - indenter := strings.Repeat(Indent, int(indentation)) - return fmt.Sprintf("[\n%s%s,\n%s]", indenter+Indent, strings.Join(result, ",\n"+indenter+Indent), indenter) - } - return fmt.Sprintf("[%s]", strings.Join(result, ", ")) -} - -func formatMap(v reflect.Value, indentation uint) string { - l := v.Len() - result := make([]string, l) - - longest := 0 - for i, key := range v.MapKeys() { - value := v.MapIndex(key) - result[i] = fmt.Sprintf("%s: %s", formatValue(key, indentation+1), formatValue(value, indentation+1)) - if len(result[i]) > longest { - longest = len(result[i]) - } - } - - if longest > longFormThreshold { - indenter := strings.Repeat(Indent, int(indentation)) - return fmt.Sprintf("{\n%s%s,\n%s}", indenter+Indent, strings.Join(result, ",\n"+indenter+Indent), indenter) - } - return fmt.Sprintf("{%s}", strings.Join(result, ", ")) -} - -func formatStruct(v reflect.Value, indentation uint) string { - t := v.Type() - - l := v.NumField() - result := []string{} - longest := 0 - for i := 0; i < l; i++ { - structField := t.Field(i) - fieldEntry := v.Field(i) - representation := fmt.Sprintf("%s: %s", structField.Name, formatValue(fieldEntry, indentation+1)) - result = append(result, representation) - if len(representation) > longest { - longest = len(representation) - } - } - if longest > longFormThreshold { - indenter := strings.Repeat(Indent, int(indentation)) - return fmt.Sprintf("{\n%s%s,\n%s}", indenter+Indent, strings.Join(result, ",\n"+indenter+Indent), indenter) - } - return fmt.Sprintf("{%s}", strings.Join(result, ", ")) -} - -func isNilValue(a reflect.Value) bool { - switch a.Kind() { - case reflect.Invalid: - return true - case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: - return a.IsNil() - } - - return false -} - -/* -Returns true when the string is entirely made of printable runes, false otherwise. -*/ -func isPrintableString(str string) bool { - for _, runeValue := range str { - if !strconv.IsPrint(runeValue) { - return false - } - } - return true -} diff --git a/vendor/github.com/onsi/gomega/go.mod b/vendor/github.com/onsi/gomega/go.mod deleted file mode 100644 index 177a541c4..000000000 --- a/vendor/github.com/onsi/gomega/go.mod +++ /dev/null @@ -1,16 +0,0 @@ -module github.com/onsi/gomega - -require ( - github.com/fsnotify/fsnotify v1.4.7 // indirect - github.com/golang/protobuf v1.2.0 - github.com/hpcloud/tail v1.0.0 // indirect - github.com/onsi/ginkgo v1.6.0 - golang.org/x/net v0.0.0-20180906233101-161cd47e91fd - golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f // indirect - golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e // indirect - golang.org/x/text v0.3.0 // indirect - gopkg.in/fsnotify.v1 v1.4.7 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - gopkg.in/yaml.v2 v2.2.4 -) - diff --git a/vendor/github.com/onsi/gomega/go.sum b/vendor/github.com/onsi/gomega/go.sum deleted file mode 100644 index bbcc05d3e..000000000 --- a/vendor/github.com/onsi/gomega/go.sum +++ /dev/null @@ -1,24 +0,0 @@ -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/onsi/gomega/gomega_dsl.go b/vendor/github.com/onsi/gomega/gomega_dsl.go deleted file mode 100644 index 85505f2ec..000000000 --- a/vendor/github.com/onsi/gomega/gomega_dsl.go +++ /dev/null @@ -1,429 +0,0 @@ -/* -Gomega is the Ginkgo BDD-style testing framework's preferred matcher library. - -The godoc documentation describes Gomega's API. More comprehensive documentation (with examples!) is available at http://onsi.github.io/gomega/ - -Gomega on Github: http://github.com/onsi/gomega - -Learn more about Ginkgo online: http://onsi.github.io/ginkgo - -Ginkgo on Github: http://github.com/onsi/ginkgo - -Gomega is MIT-Licensed -*/ -package gomega - -import ( - "fmt" - "reflect" - "time" - - "github.com/onsi/gomega/internal/assertion" - "github.com/onsi/gomega/internal/asyncassertion" - "github.com/onsi/gomega/internal/testingtsupport" - "github.com/onsi/gomega/types" -) - -const GOMEGA_VERSION = "1.7.1" - -const nilFailHandlerPanic = `You are trying to make an assertion, but Gomega's fail handler is nil. -If you're using Ginkgo then you probably forgot to put your assertion in an It(). -Alternatively, you may have forgotten to register a fail handler with RegisterFailHandler() or RegisterTestingT(). -Depending on your vendoring solution you may be inadvertently importing gomega and subpackages (e.g. ghhtp, gexec,...) from different locations. -` - -var globalFailWrapper *types.GomegaFailWrapper - -var defaultEventuallyTimeout = time.Second -var defaultEventuallyPollingInterval = 10 * time.Millisecond -var defaultConsistentlyDuration = 100 * time.Millisecond -var defaultConsistentlyPollingInterval = 10 * time.Millisecond - -// RegisterFailHandler connects Ginkgo to Gomega. When a matcher fails -// the fail handler passed into RegisterFailHandler is called. -func RegisterFailHandler(handler types.GomegaFailHandler) { - RegisterFailHandlerWithT(testingtsupport.EmptyTWithHelper{}, handler) -} - -// RegisterFailHandlerWithT ensures that the given types.TWithHelper and fail handler -// are used globally. -func RegisterFailHandlerWithT(t types.TWithHelper, handler types.GomegaFailHandler) { - if handler == nil { - globalFailWrapper = nil - return - } - - globalFailWrapper = &types.GomegaFailWrapper{ - Fail: handler, - TWithHelper: t, - } -} - -// RegisterTestingT connects Gomega to Golang's XUnit style -// Testing.T tests. It is now deprecated and you should use NewWithT() instead. -// -// Legacy Documentation: -// -// You'll need to call this at the top of each XUnit style test: -// -// func TestFarmHasCow(t *testing.T) { -// RegisterTestingT(t) -// -// f := farm.New([]string{"Cow", "Horse"}) -// Expect(f.HasCow()).To(BeTrue(), "Farm should have cow") -// } -// -// Note that this *testing.T is registered *globally* by Gomega (this is why you don't have to -// pass `t` down to the matcher itself). This means that you cannot run the XUnit style tests -// in parallel as the global fail handler cannot point to more than one testing.T at a time. -// -// NewWithT() does not have this limitation -// -// (As an aside: Ginkgo gets around this limitation by running parallel tests in different *processes*). -func RegisterTestingT(t types.GomegaTestingT) { - tWithHelper, hasHelper := t.(types.TWithHelper) - if !hasHelper { - RegisterFailHandler(testingtsupport.BuildTestingTGomegaFailWrapper(t).Fail) - return - } - RegisterFailHandlerWithT(tWithHelper, testingtsupport.BuildTestingTGomegaFailWrapper(t).Fail) -} - -// InterceptGomegaFailures runs a given callback and returns an array of -// failure messages generated by any Gomega assertions within the callback. -// -// This is accomplished by temporarily replacing the *global* fail handler -// with a fail handler that simply annotates failures. The original fail handler -// is reset when InterceptGomegaFailures returns. -// -// This is most useful when testing custom matchers, but can also be used to check -// on a value using a Gomega assertion without causing a test failure. -func InterceptGomegaFailures(f func()) []string { - originalHandler := globalFailWrapper.Fail - failures := []string{} - RegisterFailHandler(func(message string, callerSkip ...int) { - failures = append(failures, message) - }) - f() - RegisterFailHandler(originalHandler) - return failures -} - -// Ω wraps an actual value allowing assertions to be made on it: -// Ω("foo").Should(Equal("foo")) -// -// If Ω is passed more than one argument it will pass the *first* argument to the matcher. -// All subsequent arguments will be required to be nil/zero. -// -// This is convenient if you want to make an assertion on a method/function that returns -// a value and an error - a common patter in Go. -// -// For example, given a function with signature: -// func MyAmazingThing() (int, error) -// -// Then: -// Ω(MyAmazingThing()).Should(Equal(3)) -// Will succeed only if `MyAmazingThing()` returns `(3, nil)` -// -// Ω and Expect are identical -func Ω(actual interface{}, extra ...interface{}) Assertion { - return ExpectWithOffset(0, actual, extra...) -} - -// Expect wraps an actual value allowing assertions to be made on it: -// Expect("foo").To(Equal("foo")) -// -// If Expect is passed more than one argument it will pass the *first* argument to the matcher. -// All subsequent arguments will be required to be nil/zero. -// -// This is convenient if you want to make an assertion on a method/function that returns -// a value and an error - a common patter in Go. -// -// For example, given a function with signature: -// func MyAmazingThing() (int, error) -// -// Then: -// Expect(MyAmazingThing()).Should(Equal(3)) -// Will succeed only if `MyAmazingThing()` returns `(3, nil)` -// -// Expect and Ω are identical -func Expect(actual interface{}, extra ...interface{}) Assertion { - return ExpectWithOffset(0, actual, extra...) -} - -// ExpectWithOffset wraps an actual value allowing assertions to be made on it: -// ExpectWithOffset(1, "foo").To(Equal("foo")) -// -// Unlike `Expect` and `Ω`, `ExpectWithOffset` takes an additional integer argument -// that is used to modify the call-stack offset when computing line numbers. -// -// This is most useful in helper functions that make assertions. If you want Gomega's -// error message to refer to the calling line in the test (as opposed to the line in the helper function) -// set the first argument of `ExpectWithOffset` appropriately. -func ExpectWithOffset(offset int, actual interface{}, extra ...interface{}) Assertion { - if globalFailWrapper == nil { - panic(nilFailHandlerPanic) - } - return assertion.New(actual, globalFailWrapper, offset, extra...) -} - -// Eventually wraps an actual value allowing assertions to be made on it. -// The assertion is tried periodically until it passes or a timeout occurs. -// -// Both the timeout and polling interval are configurable as optional arguments: -// The first optional argument is the timeout -// The second optional argument is the polling interval -// -// Both intervals can either be specified as time.Duration, parsable duration strings or as floats/integers. In the -// last case they are interpreted as seconds. -// -// If Eventually is passed an actual that is a function taking no arguments and returning at least one value, -// then Eventually will call the function periodically and try the matcher against the function's first return value. -// -// Example: -// -// Eventually(func() int { -// return thingImPolling.Count() -// }).Should(BeNumerically(">=", 17)) -// -// Note that this example could be rewritten: -// -// Eventually(thingImPolling.Count).Should(BeNumerically(">=", 17)) -// -// If the function returns more than one value, then Eventually will pass the first value to the matcher and -// assert that all other values are nil/zero. -// This allows you to pass Eventually a function that returns a value and an error - a common pattern in Go. -// -// For example, consider a method that returns a value and an error: -// func FetchFromDB() (string, error) -// -// Then -// Eventually(FetchFromDB).Should(Equal("hasselhoff")) -// -// Will pass only if the the returned error is nil and the returned string passes the matcher. -// -// Eventually's default timeout is 1 second, and its default polling interval is 10ms -func Eventually(actual interface{}, intervals ...interface{}) AsyncAssertion { - return EventuallyWithOffset(0, actual, intervals...) -} - -// EventuallyWithOffset operates like Eventually but takes an additional -// initial argument to indicate an offset in the call stack. This is useful when building helper -// functions that contain matchers. To learn more, read about `ExpectWithOffset`. -func EventuallyWithOffset(offset int, actual interface{}, intervals ...interface{}) AsyncAssertion { - if globalFailWrapper == nil { - panic(nilFailHandlerPanic) - } - timeoutInterval := defaultEventuallyTimeout - pollingInterval := defaultEventuallyPollingInterval - if len(intervals) > 0 { - timeoutInterval = toDuration(intervals[0]) - } - if len(intervals) > 1 { - pollingInterval = toDuration(intervals[1]) - } - return asyncassertion.New(asyncassertion.AsyncAssertionTypeEventually, actual, globalFailWrapper, timeoutInterval, pollingInterval, offset) -} - -// Consistently wraps an actual value allowing assertions to be made on it. -// The assertion is tried periodically and is required to pass for a period of time. -// -// Both the total time and polling interval are configurable as optional arguments: -// The first optional argument is the duration that Consistently will run for -// The second optional argument is the polling interval -// -// Both intervals can either be specified as time.Duration, parsable duration strings or as floats/integers. In the -// last case they are interpreted as seconds. -// -// If Consistently is passed an actual that is a function taking no arguments and returning at least one value, -// then Consistently will call the function periodically and try the matcher against the function's first return value. -// -// If the function returns more than one value, then Consistently will pass the first value to the matcher and -// assert that all other values are nil/zero. -// This allows you to pass Consistently a function that returns a value and an error - a common pattern in Go. -// -// Consistently is useful in cases where you want to assert that something *does not happen* over a period of time. -// For example, you want to assert that a goroutine does *not* send data down a channel. In this case, you could: -// -// Consistently(channel).ShouldNot(Receive()) -// -// Consistently's default duration is 100ms, and its default polling interval is 10ms -func Consistently(actual interface{}, intervals ...interface{}) AsyncAssertion { - return ConsistentlyWithOffset(0, actual, intervals...) -} - -// ConsistentlyWithOffset operates like Consistnetly but takes an additional -// initial argument to indicate an offset in the call stack. This is useful when building helper -// functions that contain matchers. To learn more, read about `ExpectWithOffset`. -func ConsistentlyWithOffset(offset int, actual interface{}, intervals ...interface{}) AsyncAssertion { - if globalFailWrapper == nil { - panic(nilFailHandlerPanic) - } - timeoutInterval := defaultConsistentlyDuration - pollingInterval := defaultConsistentlyPollingInterval - if len(intervals) > 0 { - timeoutInterval = toDuration(intervals[0]) - } - if len(intervals) > 1 { - pollingInterval = toDuration(intervals[1]) - } - return asyncassertion.New(asyncassertion.AsyncAssertionTypeConsistently, actual, globalFailWrapper, timeoutInterval, pollingInterval, offset) -} - -// SetDefaultEventuallyTimeout sets the default timeout duration for Eventually. Eventually will repeatedly poll your condition until it succeeds, or until this timeout elapses. -func SetDefaultEventuallyTimeout(t time.Duration) { - defaultEventuallyTimeout = t -} - -// SetDefaultEventuallyPollingInterval sets the default polling interval for Eventually. -func SetDefaultEventuallyPollingInterval(t time.Duration) { - defaultEventuallyPollingInterval = t -} - -// SetDefaultConsistentlyDuration sets the default duration for Consistently. Consistently will verify that your condition is satisfied for this long. -func SetDefaultConsistentlyDuration(t time.Duration) { - defaultConsistentlyDuration = t -} - -// SetDefaultConsistentlyPollingInterval sets the default polling interval for Consistently. -func SetDefaultConsistentlyPollingInterval(t time.Duration) { - defaultConsistentlyPollingInterval = t -} - -// AsyncAssertion is returned by Eventually and Consistently and polls the actual value passed into Eventually against -// the matcher passed to the Should and ShouldNot methods. -// -// Both Should and ShouldNot take a variadic optionalDescription argument. This is passed on to -// fmt.Sprintf() and is used to annotate failure messages. This allows you to make your failure messages more -// descriptive. -// -// Both Should and ShouldNot return a boolean that is true if the assertion passed and false if it failed. -// -// Example: -// -// Eventually(myChannel).Should(Receive(), "Something should have come down the pipe.") -// Consistently(myChannel).ShouldNot(Receive(), "Nothing should have come down the pipe.") -type AsyncAssertion interface { - Should(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool - ShouldNot(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool -} - -// GomegaAsyncAssertion is deprecated in favor of AsyncAssertion, which does not stutter. -type GomegaAsyncAssertion = AsyncAssertion - -// Assertion is returned by Ω and Expect and compares the actual value to the matcher -// passed to the Should/ShouldNot and To/ToNot/NotTo methods. -// -// Typically Should/ShouldNot are used with Ω and To/ToNot/NotTo are used with Expect -// though this is not enforced. -// -// All methods take a variadic optionalDescription argument. This is passed on to fmt.Sprintf() -// and is used to annotate failure messages. -// -// All methods return a bool that is true if the assertion passed and false if it failed. -// -// Example: -// -// Ω(farm.HasCow()).Should(BeTrue(), "Farm %v should have a cow", farm) -type Assertion interface { - Should(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool - ShouldNot(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool - - To(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool - ToNot(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool - NotTo(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool -} - -// GomegaAssertion is deprecated in favor of Assertion, which does not stutter. -type GomegaAssertion = Assertion - -// OmegaMatcher is deprecated in favor of the better-named and better-organized types.GomegaMatcher but sticks around to support existing code that uses it -type OmegaMatcher types.GomegaMatcher - -// WithT wraps a *testing.T and provides `Expect`, `Eventually`, and `Consistently` methods. This allows you to leverage -// Gomega's rich ecosystem of matchers in standard `testing` test suites. -// -// Use `NewWithT` to instantiate a `WithT` -type WithT struct { - t types.GomegaTestingT -} - -// GomegaWithT is deprecated in favor of gomega.WithT, which does not stutter. -type GomegaWithT = WithT - -// NewWithT takes a *testing.T and returngs a `gomega.WithT` allowing you to use `Expect`, `Eventually`, and `Consistently` along with -// Gomega's rich ecosystem of matchers in standard `testing` test suits. -// -// func TestFarmHasCow(t *testing.T) { -// g := gomega.NewWithT(t) -// -// f := farm.New([]string{"Cow", "Horse"}) -// g.Expect(f.HasCow()).To(BeTrue(), "Farm should have cow") -// } -func NewWithT(t types.GomegaTestingT) *WithT { - return &WithT{ - t: t, - } -} - -// NewGomegaWithT is deprecated in favor of gomega.NewWithT, which does not stutter. -func NewGomegaWithT(t types.GomegaTestingT) *GomegaWithT { - return NewWithT(t) -} - -// Expect is used to make assertions. See documentation for Expect. -func (g *WithT) Expect(actual interface{}, extra ...interface{}) Assertion { - return assertion.New(actual, testingtsupport.BuildTestingTGomegaFailWrapper(g.t), 0, extra...) -} - -// Eventually is used to make asynchronous assertions. See documentation for Eventually. -func (g *WithT) Eventually(actual interface{}, intervals ...interface{}) AsyncAssertion { - timeoutInterval := defaultEventuallyTimeout - pollingInterval := defaultEventuallyPollingInterval - if len(intervals) > 0 { - timeoutInterval = toDuration(intervals[0]) - } - if len(intervals) > 1 { - pollingInterval = toDuration(intervals[1]) - } - return asyncassertion.New(asyncassertion.AsyncAssertionTypeEventually, actual, testingtsupport.BuildTestingTGomegaFailWrapper(g.t), timeoutInterval, pollingInterval, 0) -} - -// Consistently is used to make asynchronous assertions. See documentation for Consistently. -func (g *WithT) Consistently(actual interface{}, intervals ...interface{}) AsyncAssertion { - timeoutInterval := defaultConsistentlyDuration - pollingInterval := defaultConsistentlyPollingInterval - if len(intervals) > 0 { - timeoutInterval = toDuration(intervals[0]) - } - if len(intervals) > 1 { - pollingInterval = toDuration(intervals[1]) - } - return asyncassertion.New(asyncassertion.AsyncAssertionTypeConsistently, actual, testingtsupport.BuildTestingTGomegaFailWrapper(g.t), timeoutInterval, pollingInterval, 0) -} - -func toDuration(input interface{}) time.Duration { - duration, ok := input.(time.Duration) - if ok { - return duration - } - - value := reflect.ValueOf(input) - kind := reflect.TypeOf(input).Kind() - - if reflect.Int <= kind && kind <= reflect.Int64 { - return time.Duration(value.Int()) * time.Second - } else if reflect.Uint <= kind && kind <= reflect.Uint64 { - return time.Duration(value.Uint()) * time.Second - } else if reflect.Float32 <= kind && kind <= reflect.Float64 { - return time.Duration(value.Float() * float64(time.Second)) - } else if reflect.String == kind { - duration, err := time.ParseDuration(value.String()) - if err != nil { - panic(fmt.Sprintf("%#v is not a valid parsable duration string.", input)) - } - return duration - } - - panic(fmt.Sprintf("%v is not a valid interval. Must be time.Duration, parsable duration string or a number.", input)) -} diff --git a/vendor/github.com/onsi/gomega/internal/assertion/assertion.go b/vendor/github.com/onsi/gomega/internal/assertion/assertion.go deleted file mode 100644 index 00197b67a..000000000 --- a/vendor/github.com/onsi/gomega/internal/assertion/assertion.go +++ /dev/null @@ -1,105 +0,0 @@ -package assertion - -import ( - "fmt" - "reflect" - - "github.com/onsi/gomega/types" -) - -type Assertion struct { - actualInput interface{} - failWrapper *types.GomegaFailWrapper - offset int - extra []interface{} -} - -func New(actualInput interface{}, failWrapper *types.GomegaFailWrapper, offset int, extra ...interface{}) *Assertion { - return &Assertion{ - actualInput: actualInput, - failWrapper: failWrapper, - offset: offset, - extra: extra, - } -} - -func (assertion *Assertion) Should(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool { - assertion.failWrapper.TWithHelper.Helper() - return assertion.vetExtras(optionalDescription...) && assertion.match(matcher, true, optionalDescription...) -} - -func (assertion *Assertion) ShouldNot(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool { - assertion.failWrapper.TWithHelper.Helper() - return assertion.vetExtras(optionalDescription...) && assertion.match(matcher, false, optionalDescription...) -} - -func (assertion *Assertion) To(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool { - assertion.failWrapper.TWithHelper.Helper() - return assertion.vetExtras(optionalDescription...) && assertion.match(matcher, true, optionalDescription...) -} - -func (assertion *Assertion) ToNot(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool { - assertion.failWrapper.TWithHelper.Helper() - return assertion.vetExtras(optionalDescription...) && assertion.match(matcher, false, optionalDescription...) -} - -func (assertion *Assertion) NotTo(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool { - assertion.failWrapper.TWithHelper.Helper() - return assertion.vetExtras(optionalDescription...) && assertion.match(matcher, false, optionalDescription...) -} - -func (assertion *Assertion) buildDescription(optionalDescription ...interface{}) string { - switch len(optionalDescription) { - case 0: - return "" - default: - return fmt.Sprintf(optionalDescription[0].(string), optionalDescription[1:]...) + "\n" - } -} - -func (assertion *Assertion) match(matcher types.GomegaMatcher, desiredMatch bool, optionalDescription ...interface{}) bool { - matches, err := matcher.Match(assertion.actualInput) - description := assertion.buildDescription(optionalDescription...) - assertion.failWrapper.TWithHelper.Helper() - if err != nil { - assertion.failWrapper.Fail(description+err.Error(), 2+assertion.offset) - return false - } - if matches != desiredMatch { - var message string - if desiredMatch { - message = matcher.FailureMessage(assertion.actualInput) - } else { - message = matcher.NegatedFailureMessage(assertion.actualInput) - } - assertion.failWrapper.Fail(description+message, 2+assertion.offset) - return false - } - - return true -} - -func (assertion *Assertion) vetExtras(optionalDescription ...interface{}) bool { - success, message := vetExtras(assertion.extra) - if success { - return true - } - - description := assertion.buildDescription(optionalDescription...) - assertion.failWrapper.TWithHelper.Helper() - assertion.failWrapper.Fail(description+message, 2+assertion.offset) - return false -} - -func vetExtras(extras []interface{}) (bool, string) { - for i, extra := range extras { - if extra != nil { - zeroValue := reflect.Zero(reflect.TypeOf(extra)).Interface() - if !reflect.DeepEqual(zeroValue, extra) { - message := fmt.Sprintf("Unexpected non-nil/non-zero extra argument at index %d:\n\t<%T>: %#v", i+1, extra, extra) - return false, message - } - } - } - return true, "" -} diff --git a/vendor/github.com/onsi/gomega/internal/asyncassertion/async_assertion.go b/vendor/github.com/onsi/gomega/internal/asyncassertion/async_assertion.go deleted file mode 100644 index a233e48c0..000000000 --- a/vendor/github.com/onsi/gomega/internal/asyncassertion/async_assertion.go +++ /dev/null @@ -1,196 +0,0 @@ -// untested sections: 2 - -package asyncassertion - -import ( - "errors" - "fmt" - "reflect" - "time" - - "github.com/onsi/gomega/internal/oraclematcher" - "github.com/onsi/gomega/types" -) - -type AsyncAssertionType uint - -const ( - AsyncAssertionTypeEventually AsyncAssertionType = iota - AsyncAssertionTypeConsistently -) - -type AsyncAssertion struct { - asyncType AsyncAssertionType - actualInput interface{} - timeoutInterval time.Duration - pollingInterval time.Duration - failWrapper *types.GomegaFailWrapper - offset int -} - -func New(asyncType AsyncAssertionType, actualInput interface{}, failWrapper *types.GomegaFailWrapper, timeoutInterval time.Duration, pollingInterval time.Duration, offset int) *AsyncAssertion { - actualType := reflect.TypeOf(actualInput) - if actualType.Kind() == reflect.Func { - if actualType.NumIn() != 0 || actualType.NumOut() == 0 { - panic("Expected a function with no arguments and one or more return values.") - } - } - - return &AsyncAssertion{ - asyncType: asyncType, - actualInput: actualInput, - failWrapper: failWrapper, - timeoutInterval: timeoutInterval, - pollingInterval: pollingInterval, - offset: offset, - } -} - -func (assertion *AsyncAssertion) Should(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool { - assertion.failWrapper.TWithHelper.Helper() - return assertion.match(matcher, true, optionalDescription...) -} - -func (assertion *AsyncAssertion) ShouldNot(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool { - assertion.failWrapper.TWithHelper.Helper() - return assertion.match(matcher, false, optionalDescription...) -} - -func (assertion *AsyncAssertion) buildDescription(optionalDescription ...interface{}) string { - switch len(optionalDescription) { - case 0: - return "" - default: - return fmt.Sprintf(optionalDescription[0].(string), optionalDescription[1:]...) + "\n" - } -} - -func (assertion *AsyncAssertion) actualInputIsAFunction() bool { - actualType := reflect.TypeOf(assertion.actualInput) - return actualType.Kind() == reflect.Func && actualType.NumIn() == 0 && actualType.NumOut() > 0 -} - -func (assertion *AsyncAssertion) pollActual() (interface{}, error) { - if assertion.actualInputIsAFunction() { - values := reflect.ValueOf(assertion.actualInput).Call([]reflect.Value{}) - - extras := []interface{}{} - for _, value := range values[1:] { - extras = append(extras, value.Interface()) - } - - success, message := vetExtras(extras) - - if !success { - return nil, errors.New(message) - } - - return values[0].Interface(), nil - } - - return assertion.actualInput, nil -} - -func (assertion *AsyncAssertion) matcherMayChange(matcher types.GomegaMatcher, value interface{}) bool { - if assertion.actualInputIsAFunction() { - return true - } - - return oraclematcher.MatchMayChangeInTheFuture(matcher, value) -} - -func (assertion *AsyncAssertion) match(matcher types.GomegaMatcher, desiredMatch bool, optionalDescription ...interface{}) bool { - timer := time.Now() - timeout := time.After(assertion.timeoutInterval) - - description := assertion.buildDescription(optionalDescription...) - - var matches bool - var err error - mayChange := true - value, err := assertion.pollActual() - if err == nil { - mayChange = assertion.matcherMayChange(matcher, value) - matches, err = matcher.Match(value) - } - - assertion.failWrapper.TWithHelper.Helper() - - fail := func(preamble string) { - errMsg := "" - message := "" - if err != nil { - errMsg = "Error: " + err.Error() - } else { - if desiredMatch { - message = matcher.FailureMessage(value) - } else { - message = matcher.NegatedFailureMessage(value) - } - } - assertion.failWrapper.TWithHelper.Helper() - assertion.failWrapper.Fail(fmt.Sprintf("%s after %.3fs.\n%s%s%s", preamble, time.Since(timer).Seconds(), description, message, errMsg), 3+assertion.offset) - } - - if assertion.asyncType == AsyncAssertionTypeEventually { - for { - if err == nil && matches == desiredMatch { - return true - } - - if !mayChange { - fail("No future change is possible. Bailing out early") - return false - } - - select { - case <-time.After(assertion.pollingInterval): - value, err = assertion.pollActual() - if err == nil { - mayChange = assertion.matcherMayChange(matcher, value) - matches, err = matcher.Match(value) - } - case <-timeout: - fail("Timed out") - return false - } - } - } else if assertion.asyncType == AsyncAssertionTypeConsistently { - for { - if !(err == nil && matches == desiredMatch) { - fail("Failed") - return false - } - - if !mayChange { - return true - } - - select { - case <-time.After(assertion.pollingInterval): - value, err = assertion.pollActual() - if err == nil { - mayChange = assertion.matcherMayChange(matcher, value) - matches, err = matcher.Match(value) - } - case <-timeout: - return true - } - } - } - - return false -} - -func vetExtras(extras []interface{}) (bool, string) { - for i, extra := range extras { - if extra != nil { - zeroValue := reflect.Zero(reflect.TypeOf(extra)).Interface() - if !reflect.DeepEqual(zeroValue, extra) { - message := fmt.Sprintf("Unexpected non-nil/non-zero extra argument at index %d:\n\t<%T>: %#v", i+1, extra, extra) - return false, message - } - } - } - return true, "" -} diff --git a/vendor/github.com/onsi/gomega/internal/oraclematcher/oracle_matcher.go b/vendor/github.com/onsi/gomega/internal/oraclematcher/oracle_matcher.go deleted file mode 100644 index 66cad88a1..000000000 --- a/vendor/github.com/onsi/gomega/internal/oraclematcher/oracle_matcher.go +++ /dev/null @@ -1,25 +0,0 @@ -package oraclematcher - -import "github.com/onsi/gomega/types" - -/* -GomegaMatchers that also match the OracleMatcher interface can convey information about -whether or not their result will change upon future attempts. - -This allows `Eventually` and `Consistently` to short circuit if success becomes impossible. - -For example, a process' exit code can never change. So, gexec's Exit matcher returns `true` -for `MatchMayChangeInTheFuture` until the process exits, at which point it returns `false` forevermore. -*/ -type OracleMatcher interface { - MatchMayChangeInTheFuture(actual interface{}) bool -} - -func MatchMayChangeInTheFuture(matcher types.GomegaMatcher, value interface{}) bool { - oracleMatcher, ok := matcher.(OracleMatcher) - if !ok { - return true - } - - return oracleMatcher.MatchMayChangeInTheFuture(value) -} diff --git a/vendor/github.com/onsi/gomega/internal/testingtsupport/testing_t_support.go b/vendor/github.com/onsi/gomega/internal/testingtsupport/testing_t_support.go deleted file mode 100644 index bb27032f6..000000000 --- a/vendor/github.com/onsi/gomega/internal/testingtsupport/testing_t_support.go +++ /dev/null @@ -1,60 +0,0 @@ -package testingtsupport - -import ( - "regexp" - "runtime/debug" - "strings" - - "github.com/onsi/gomega/types" -) - -var StackTracePruneRE = regexp.MustCompile(`\/gomega\/|\/ginkgo\/|\/pkg\/testing\/|\/pkg\/runtime\/`) - -type EmptyTWithHelper struct{} - -func (e EmptyTWithHelper) Helper() {} - -type gomegaTestingT interface { - Fatalf(format string, args ...interface{}) -} - -func BuildTestingTGomegaFailWrapper(t gomegaTestingT) *types.GomegaFailWrapper { - tWithHelper, hasHelper := t.(types.TWithHelper) - if !hasHelper { - tWithHelper = EmptyTWithHelper{} - } - - fail := func(message string, callerSkip ...int) { - if hasHelper { - tWithHelper.Helper() - t.Fatalf("\n%s", message) - } else { - skip := 2 - if len(callerSkip) > 0 { - skip += callerSkip[0] - } - stackTrace := pruneStack(string(debug.Stack()), skip) - t.Fatalf("\n%s\n%s\n", stackTrace, message) - } - } - - return &types.GomegaFailWrapper{ - Fail: fail, - TWithHelper: tWithHelper, - } -} - -func pruneStack(fullStackTrace string, skip int) string { - stack := strings.Split(fullStackTrace, "\n")[1:] - if len(stack) > 2*skip { - stack = stack[2*skip:] - } - prunedStack := []string{} - for i := 0; i < len(stack)/2; i++ { - if !StackTracePruneRE.Match([]byte(stack[i*2])) { - prunedStack = append(prunedStack, stack[i*2]) - prunedStack = append(prunedStack, stack[i*2+1]) - } - } - return strings.Join(prunedStack, "\n") -} diff --git a/vendor/github.com/onsi/gomega/matchers.go b/vendor/github.com/onsi/gomega/matchers.go deleted file mode 100644 index 9ec8893cb..000000000 --- a/vendor/github.com/onsi/gomega/matchers.go +++ /dev/null @@ -1,443 +0,0 @@ -package gomega - -import ( - "time" - - "github.com/onsi/gomega/matchers" - "github.com/onsi/gomega/types" -) - -//Equal uses reflect.DeepEqual to compare actual with expected. Equal is strict about -//types when performing comparisons. -//It is an error for both actual and expected to be nil. Use BeNil() instead. -func Equal(expected interface{}) types.GomegaMatcher { - return &matchers.EqualMatcher{ - Expected: expected, - } -} - -//BeEquivalentTo is more lax than Equal, allowing equality between different types. -//This is done by converting actual to have the type of expected before -//attempting equality with reflect.DeepEqual. -//It is an error for actual and expected to be nil. Use BeNil() instead. -func BeEquivalentTo(expected interface{}) types.GomegaMatcher { - return &matchers.BeEquivalentToMatcher{ - Expected: expected, - } -} - -//BeIdenticalTo uses the == operator to compare actual with expected. -//BeIdenticalTo is strict about types when performing comparisons. -//It is an error for both actual and expected to be nil. Use BeNil() instead. -func BeIdenticalTo(expected interface{}) types.GomegaMatcher { - return &matchers.BeIdenticalToMatcher{ - Expected: expected, - } -} - -//BeNil succeeds if actual is nil -func BeNil() types.GomegaMatcher { - return &matchers.BeNilMatcher{} -} - -//BeTrue succeeds if actual is true -func BeTrue() types.GomegaMatcher { - return &matchers.BeTrueMatcher{} -} - -//BeFalse succeeds if actual is false -func BeFalse() types.GomegaMatcher { - return &matchers.BeFalseMatcher{} -} - -//HaveOccurred succeeds if actual is a non-nil error -//The typical Go error checking pattern looks like: -// err := SomethingThatMightFail() -// Expect(err).ShouldNot(HaveOccurred()) -func HaveOccurred() types.GomegaMatcher { - return &matchers.HaveOccurredMatcher{} -} - -//Succeed passes if actual is a nil error -//Succeed is intended to be used with functions that return a single error value. Instead of -// err := SomethingThatMightFail() -// Expect(err).ShouldNot(HaveOccurred()) -// -//You can write: -// Expect(SomethingThatMightFail()).Should(Succeed()) -// -//It is a mistake to use Succeed with a function that has multiple return values. Gomega's Ω and Expect -//functions automatically trigger failure if any return values after the first return value are non-zero/non-nil. -//This means that Ω(MultiReturnFunc()).ShouldNot(Succeed()) can never pass. -func Succeed() types.GomegaMatcher { - return &matchers.SucceedMatcher{} -} - -//MatchError succeeds if actual is a non-nil error that matches the passed in string/error. -// -//These are valid use-cases: -// Expect(err).Should(MatchError("an error")) //asserts that err.Error() == "an error" -// Expect(err).Should(MatchError(SomeError)) //asserts that err == SomeError (via reflect.DeepEqual) -// -//It is an error for err to be nil or an object that does not implement the Error interface -func MatchError(expected interface{}) types.GomegaMatcher { - return &matchers.MatchErrorMatcher{ - Expected: expected, - } -} - -//BeClosed succeeds if actual is a closed channel. -//It is an error to pass a non-channel to BeClosed, it is also an error to pass nil -// -//In order to check whether or not the channel is closed, Gomega must try to read from the channel -//(even in the `ShouldNot(BeClosed())` case). You should keep this in mind if you wish to make subsequent assertions about -//values coming down the channel. -// -//Also, if you are testing that a *buffered* channel is closed you must first read all values out of the channel before -//asserting that it is closed (it is not possible to detect that a buffered-channel has been closed until all its buffered values are read). -// -//Finally, as a corollary: it is an error to check whether or not a send-only channel is closed. -func BeClosed() types.GomegaMatcher { - return &matchers.BeClosedMatcher{} -} - -//Receive succeeds if there is a value to be received on actual. -//Actual must be a channel (and cannot be a send-only channel) -- anything else is an error. -// -//Receive returns immediately and never blocks: -// -//- If there is nothing on the channel `c` then Expect(c).Should(Receive()) will fail and Ω(c).ShouldNot(Receive()) will pass. -// -//- If the channel `c` is closed then Expect(c).Should(Receive()) will fail and Ω(c).ShouldNot(Receive()) will pass. -// -//- If there is something on the channel `c` ready to be read, then Expect(c).Should(Receive()) will pass and Ω(c).ShouldNot(Receive()) will fail. -// -//If you have a go-routine running in the background that will write to channel `c` you can: -// Eventually(c).Should(Receive()) -// -//This will timeout if nothing gets sent to `c` (you can modify the timeout interval as you normally do with `Eventually`) -// -//A similar use-case is to assert that no go-routine writes to a channel (for a period of time). You can do this with `Consistently`: -// Consistently(c).ShouldNot(Receive()) -// -//You can pass `Receive` a matcher. If you do so, it will match the received object against the matcher. For example: -// Expect(c).Should(Receive(Equal("foo"))) -// -//When given a matcher, `Receive` will always fail if there is nothing to be received on the channel. -// -//Passing Receive a matcher is especially useful when paired with Eventually: -// -// Eventually(c).Should(Receive(ContainSubstring("bar"))) -// -//will repeatedly attempt to pull values out of `c` until a value matching "bar" is received. -// -//Finally, if you want to have a reference to the value *sent* to the channel you can pass the `Receive` matcher a pointer to a variable of the appropriate type: -// var myThing thing -// Eventually(thingChan).Should(Receive(&myThing)) -// Expect(myThing.Sprocket).Should(Equal("foo")) -// Expect(myThing.IsValid()).Should(BeTrue()) -func Receive(args ...interface{}) types.GomegaMatcher { - var arg interface{} - if len(args) > 0 { - arg = args[0] - } - - return &matchers.ReceiveMatcher{ - Arg: arg, - } -} - -//BeSent succeeds if a value can be sent to actual. -//Actual must be a channel (and cannot be a receive-only channel) that can sent the type of the value passed into BeSent -- anything else is an error. -//In addition, actual must not be closed. -// -//BeSent never blocks: -// -//- If the channel `c` is not ready to receive then Expect(c).Should(BeSent("foo")) will fail immediately -//- If the channel `c` is eventually ready to receive then Eventually(c).Should(BeSent("foo")) will succeed.. presuming the channel becomes ready to receive before Eventually's timeout -//- If the channel `c` is closed then Expect(c).Should(BeSent("foo")) and Ω(c).ShouldNot(BeSent("foo")) will both fail immediately -// -//Of course, the value is actually sent to the channel. The point of `BeSent` is less to make an assertion about the availability of the channel (which is typically an implementation detail that your test should not be concerned with). -//Rather, the point of `BeSent` is to make it possible to easily and expressively write tests that can timeout on blocked channel sends. -func BeSent(arg interface{}) types.GomegaMatcher { - return &matchers.BeSentMatcher{ - Arg: arg, - } -} - -//MatchRegexp succeeds if actual is a string or stringer that matches the -//passed-in regexp. Optional arguments can be provided to construct a regexp -//via fmt.Sprintf(). -func MatchRegexp(regexp string, args ...interface{}) types.GomegaMatcher { - return &matchers.MatchRegexpMatcher{ - Regexp: regexp, - Args: args, - } -} - -//ContainSubstring succeeds if actual is a string or stringer that contains the -//passed-in substring. Optional arguments can be provided to construct the substring -//via fmt.Sprintf(). -func ContainSubstring(substr string, args ...interface{}) types.GomegaMatcher { - return &matchers.ContainSubstringMatcher{ - Substr: substr, - Args: args, - } -} - -//HavePrefix succeeds if actual is a string or stringer that contains the -//passed-in string as a prefix. Optional arguments can be provided to construct -//via fmt.Sprintf(). -func HavePrefix(prefix string, args ...interface{}) types.GomegaMatcher { - return &matchers.HavePrefixMatcher{ - Prefix: prefix, - Args: args, - } -} - -//HaveSuffix succeeds if actual is a string or stringer that contains the -//passed-in string as a suffix. Optional arguments can be provided to construct -//via fmt.Sprintf(). -func HaveSuffix(suffix string, args ...interface{}) types.GomegaMatcher { - return &matchers.HaveSuffixMatcher{ - Suffix: suffix, - Args: args, - } -} - -//MatchJSON succeeds if actual is a string or stringer of JSON that matches -//the expected JSON. The JSONs are decoded and the resulting objects are compared via -//reflect.DeepEqual so things like key-ordering and whitespace shouldn't matter. -func MatchJSON(json interface{}) types.GomegaMatcher { - return &matchers.MatchJSONMatcher{ - JSONToMatch: json, - } -} - -//MatchXML succeeds if actual is a string or stringer of XML that matches -//the expected XML. The XMLs are decoded and the resulting objects are compared via -//reflect.DeepEqual so things like whitespaces shouldn't matter. -func MatchXML(xml interface{}) types.GomegaMatcher { - return &matchers.MatchXMLMatcher{ - XMLToMatch: xml, - } -} - -//MatchYAML succeeds if actual is a string or stringer of YAML that matches -//the expected YAML. The YAML's are decoded and the resulting objects are compared via -//reflect.DeepEqual so things like key-ordering and whitespace shouldn't matter. -func MatchYAML(yaml interface{}) types.GomegaMatcher { - return &matchers.MatchYAMLMatcher{ - YAMLToMatch: yaml, - } -} - -//BeEmpty succeeds if actual is empty. Actual must be of type string, array, map, chan, or slice. -func BeEmpty() types.GomegaMatcher { - return &matchers.BeEmptyMatcher{} -} - -//HaveLen succeeds if actual has the passed-in length. Actual must be of type string, array, map, chan, or slice. -func HaveLen(count int) types.GomegaMatcher { - return &matchers.HaveLenMatcher{ - Count: count, - } -} - -//HaveCap succeeds if actual has the passed-in capacity. Actual must be of type array, chan, or slice. -func HaveCap(count int) types.GomegaMatcher { - return &matchers.HaveCapMatcher{ - Count: count, - } -} - -//BeZero succeeds if actual is the zero value for its type or if actual is nil. -func BeZero() types.GomegaMatcher { - return &matchers.BeZeroMatcher{} -} - -//ContainElement succeeds if actual contains the passed in element. -//By default ContainElement() uses Equal() to perform the match, however a -//matcher can be passed in instead: -// Expect([]string{"Foo", "FooBar"}).Should(ContainElement(ContainSubstring("Bar"))) -// -//Actual must be an array, slice or map. -//For maps, ContainElement searches through the map's values. -func ContainElement(element interface{}) types.GomegaMatcher { - return &matchers.ContainElementMatcher{ - Element: element, - } -} - -//BeElementOf succeeds if actual is contained in the passed in elements. -//BeElementOf() always uses Equal() to perform the match. -//When the passed in elements are comprised of a single element that is either an Array or Slice, BeElementOf() behaves -//as the reverse of ContainElement() that operates with Equal() to perform the match. -// Expect(2).Should(BeElementOf([]int{1, 2})) -// Expect(2).Should(BeElementOf([2]int{1, 2})) -//Otherwise, BeElementOf() provides a syntactic sugar for Or(Equal(_), Equal(_), ...): -// Expect(2).Should(BeElementOf(1, 2)) -// -//Actual must be typed. -func BeElementOf(elements ...interface{}) types.GomegaMatcher { - return &matchers.BeElementOfMatcher{ - Elements: elements, - } -} - -//ConsistOf succeeds if actual contains precisely the elements passed into the matcher. The ordering of the elements does not matter. -//By default ConsistOf() uses Equal() to match the elements, however custom matchers can be passed in instead. Here are some examples: -// -// Expect([]string{"Foo", "FooBar"}).Should(ConsistOf("FooBar", "Foo")) -// Expect([]string{"Foo", "FooBar"}).Should(ConsistOf(ContainSubstring("Bar"), "Foo")) -// Expect([]string{"Foo", "FooBar"}).Should(ConsistOf(ContainSubstring("Foo"), ContainSubstring("Foo"))) -// -//Actual must be an array, slice or map. For maps, ConsistOf matches against the map's values. -// -//You typically pass variadic arguments to ConsistOf (as in the examples above). However, if you need to pass in a slice you can provided that it -//is the only element passed in to ConsistOf: -// -// Expect([]string{"Foo", "FooBar"}).Should(ConsistOf([]string{"FooBar", "Foo"})) -// -//Note that Go's type system does not allow you to write this as ConsistOf([]string{"FooBar", "Foo"}...) as []string and []interface{} are different types - hence the need for this special rule. -func ConsistOf(elements ...interface{}) types.GomegaMatcher { - return &matchers.ConsistOfMatcher{ - Elements: elements, - } -} - -//HaveKey succeeds if actual is a map with the passed in key. -//By default HaveKey uses Equal() to perform the match, however a -//matcher can be passed in instead: -// Expect(map[string]string{"Foo": "Bar", "BazFoo": "Duck"}).Should(HaveKey(MatchRegexp(`.+Foo$`))) -func HaveKey(key interface{}) types.GomegaMatcher { - return &matchers.HaveKeyMatcher{ - Key: key, - } -} - -//HaveKeyWithValue succeeds if actual is a map with the passed in key and value. -//By default HaveKeyWithValue uses Equal() to perform the match, however a -//matcher can be passed in instead: -// Expect(map[string]string{"Foo": "Bar", "BazFoo": "Duck"}).Should(HaveKeyWithValue("Foo", "Bar")) -// Expect(map[string]string{"Foo": "Bar", "BazFoo": "Duck"}).Should(HaveKeyWithValue(MatchRegexp(`.+Foo$`), "Bar")) -func HaveKeyWithValue(key interface{}, value interface{}) types.GomegaMatcher { - return &matchers.HaveKeyWithValueMatcher{ - Key: key, - Value: value, - } -} - -//BeNumerically performs numerical assertions in a type-agnostic way. -//Actual and expected should be numbers, though the specific type of -//number is irrelevant (float32, float64, uint8, etc...). -// -//There are six, self-explanatory, supported comparators: -// Expect(1.0).Should(BeNumerically("==", 1)) -// Expect(1.0).Should(BeNumerically("~", 0.999, 0.01)) -// Expect(1.0).Should(BeNumerically(">", 0.9)) -// Expect(1.0).Should(BeNumerically(">=", 1.0)) -// Expect(1.0).Should(BeNumerically("<", 3)) -// Expect(1.0).Should(BeNumerically("<=", 1.0)) -func BeNumerically(comparator string, compareTo ...interface{}) types.GomegaMatcher { - return &matchers.BeNumericallyMatcher{ - Comparator: comparator, - CompareTo: compareTo, - } -} - -//BeTemporally compares time.Time's like BeNumerically -//Actual and expected must be time.Time. The comparators are the same as for BeNumerically -// Expect(time.Now()).Should(BeTemporally(">", time.Time{})) -// Expect(time.Now()).Should(BeTemporally("~", time.Now(), time.Second)) -func BeTemporally(comparator string, compareTo time.Time, threshold ...time.Duration) types.GomegaMatcher { - return &matchers.BeTemporallyMatcher{ - Comparator: comparator, - CompareTo: compareTo, - Threshold: threshold, - } -} - -//BeAssignableToTypeOf succeeds if actual is assignable to the type of expected. -//It will return an error when one of the values is nil. -// Expect(0).Should(BeAssignableToTypeOf(0)) // Same values -// Expect(5).Should(BeAssignableToTypeOf(-1)) // different values same type -// Expect("foo").Should(BeAssignableToTypeOf("bar")) // different values same type -// Expect(struct{ Foo string }{}).Should(BeAssignableToTypeOf(struct{ Foo string }{})) -func BeAssignableToTypeOf(expected interface{}) types.GomegaMatcher { - return &matchers.AssignableToTypeOfMatcher{ - Expected: expected, - } -} - -//Panic succeeds if actual is a function that, when invoked, panics. -//Actual must be a function that takes no arguments and returns no results. -func Panic() types.GomegaMatcher { - return &matchers.PanicMatcher{} -} - -//BeAnExistingFile succeeds if a file exists. -//Actual must be a string representing the abs path to the file being checked. -func BeAnExistingFile() types.GomegaMatcher { - return &matchers.BeAnExistingFileMatcher{} -} - -//BeARegularFile succeeds if a file exists and is a regular file. -//Actual must be a string representing the abs path to the file being checked. -func BeARegularFile() types.GomegaMatcher { - return &matchers.BeARegularFileMatcher{} -} - -//BeADirectory succeeds if a file exists and is a directory. -//Actual must be a string representing the abs path to the file being checked. -func BeADirectory() types.GomegaMatcher { - return &matchers.BeADirectoryMatcher{} -} - -//And succeeds only if all of the given matchers succeed. -//The matchers are tried in order, and will fail-fast if one doesn't succeed. -// Expect("hi").To(And(HaveLen(2), Equal("hi")) -// -//And(), Or(), Not() and WithTransform() allow matchers to be composed into complex expressions. -func And(ms ...types.GomegaMatcher) types.GomegaMatcher { - return &matchers.AndMatcher{Matchers: ms} -} - -//SatisfyAll is an alias for And(). -// Expect("hi").Should(SatisfyAll(HaveLen(2), Equal("hi"))) -func SatisfyAll(matchers ...types.GomegaMatcher) types.GomegaMatcher { - return And(matchers...) -} - -//Or succeeds if any of the given matchers succeed. -//The matchers are tried in order and will return immediately upon the first successful match. -// Expect("hi").To(Or(HaveLen(3), HaveLen(2)) -// -//And(), Or(), Not() and WithTransform() allow matchers to be composed into complex expressions. -func Or(ms ...types.GomegaMatcher) types.GomegaMatcher { - return &matchers.OrMatcher{Matchers: ms} -} - -//SatisfyAny is an alias for Or(). -// Expect("hi").SatisfyAny(Or(HaveLen(3), HaveLen(2)) -func SatisfyAny(matchers ...types.GomegaMatcher) types.GomegaMatcher { - return Or(matchers...) -} - -//Not negates the given matcher; it succeeds if the given matcher fails. -// Expect(1).To(Not(Equal(2)) -// -//And(), Or(), Not() and WithTransform() allow matchers to be composed into complex expressions. -func Not(matcher types.GomegaMatcher) types.GomegaMatcher { - return &matchers.NotMatcher{Matcher: matcher} -} - -//WithTransform applies the `transform` to the actual value and matches it against `matcher`. -//The given transform must be a function of one parameter that returns one value. -// var plus1 = func(i int) int { return i + 1 } -// Expect(1).To(WithTransform(plus1, Equal(2)) -// -//And(), Or(), Not() and WithTransform() allow matchers to be composed into complex expressions. -func WithTransform(transform interface{}, matcher types.GomegaMatcher) types.GomegaMatcher { - return matchers.NewWithTransformMatcher(transform, matcher) -} diff --git a/vendor/github.com/onsi/gomega/matchers/and.go b/vendor/github.com/onsi/gomega/matchers/and.go deleted file mode 100644 index d83a29164..000000000 --- a/vendor/github.com/onsi/gomega/matchers/and.go +++ /dev/null @@ -1,63 +0,0 @@ -package matchers - -import ( - "fmt" - - "github.com/onsi/gomega/format" - "github.com/onsi/gomega/internal/oraclematcher" - "github.com/onsi/gomega/types" -) - -type AndMatcher struct { - Matchers []types.GomegaMatcher - - // state - firstFailedMatcher types.GomegaMatcher -} - -func (m *AndMatcher) Match(actual interface{}) (success bool, err error) { - m.firstFailedMatcher = nil - for _, matcher := range m.Matchers { - success, err := matcher.Match(actual) - if !success || err != nil { - m.firstFailedMatcher = matcher - return false, err - } - } - return true, nil -} - -func (m *AndMatcher) FailureMessage(actual interface{}) (message string) { - return m.firstFailedMatcher.FailureMessage(actual) -} - -func (m *AndMatcher) NegatedFailureMessage(actual interface{}) (message string) { - // not the most beautiful list of matchers, but not bad either... - return format.Message(actual, fmt.Sprintf("To not satisfy all of these matchers: %s", m.Matchers)) -} - -func (m *AndMatcher) MatchMayChangeInTheFuture(actual interface{}) bool { - /* - Example with 3 matchers: A, B, C - - Match evaluates them: T, F, => F - So match is currently F, what should MatchMayChangeInTheFuture() return? - Seems like it only depends on B, since currently B MUST change to allow the result to become T - - Match eval: T, T, T => T - So match is currently T, what should MatchMayChangeInTheFuture() return? - Seems to depend on ANY of them being able to change to F. - */ - - if m.firstFailedMatcher == nil { - // so all matchers succeeded.. Any one of them changing would change the result. - for _, matcher := range m.Matchers { - if oraclematcher.MatchMayChangeInTheFuture(matcher, actual) { - return true - } - } - return false // none of were going to change - } - // one of the matchers failed.. it must be able to change in order to affect the result - return oraclematcher.MatchMayChangeInTheFuture(m.firstFailedMatcher, actual) -} diff --git a/vendor/github.com/onsi/gomega/matchers/assignable_to_type_of_matcher.go b/vendor/github.com/onsi/gomega/matchers/assignable_to_type_of_matcher.go deleted file mode 100644 index be4839520..000000000 --- a/vendor/github.com/onsi/gomega/matchers/assignable_to_type_of_matcher.go +++ /dev/null @@ -1,37 +0,0 @@ -// untested sections: 2 - -package matchers - -import ( - "fmt" - "reflect" - - "github.com/onsi/gomega/format" -) - -type AssignableToTypeOfMatcher struct { - Expected interface{} -} - -func (matcher *AssignableToTypeOfMatcher) Match(actual interface{}) (success bool, err error) { - if actual == nil && matcher.Expected == nil { - return false, fmt.Errorf("Refusing to compare to .\nBe explicit and use BeNil() instead. This is to avoid mistakes where both sides of an assertion are erroneously uninitialized.") - } else if matcher.Expected == nil { - return false, fmt.Errorf("Refusing to compare type to .\nBe explicit and use BeNil() instead. This is to avoid mistakes where both sides of an assertion are erroneously uninitialized.") - } else if actual == nil { - return false, nil - } - - actualType := reflect.TypeOf(actual) - expectedType := reflect.TypeOf(matcher.Expected) - - return actualType.AssignableTo(expectedType), nil -} - -func (matcher *AssignableToTypeOfMatcher) FailureMessage(actual interface{}) string { - return format.Message(actual, fmt.Sprintf("to be assignable to the type: %T", matcher.Expected)) -} - -func (matcher *AssignableToTypeOfMatcher) NegatedFailureMessage(actual interface{}) string { - return format.Message(actual, fmt.Sprintf("not to be assignable to the type: %T", matcher.Expected)) -} diff --git a/vendor/github.com/onsi/gomega/matchers/attributes_slice.go b/vendor/github.com/onsi/gomega/matchers/attributes_slice.go deleted file mode 100644 index 355b362f4..000000000 --- a/vendor/github.com/onsi/gomega/matchers/attributes_slice.go +++ /dev/null @@ -1,14 +0,0 @@ -package matchers - -import ( - "encoding/xml" - "strings" -) - -type attributesSlice []xml.Attr - -func (attrs attributesSlice) Len() int { return len(attrs) } -func (attrs attributesSlice) Less(i, j int) bool { - return strings.Compare(attrs[i].Name.Local, attrs[j].Name.Local) == -1 -} -func (attrs attributesSlice) Swap(i, j int) { attrs[i], attrs[j] = attrs[j], attrs[i] } diff --git a/vendor/github.com/onsi/gomega/matchers/be_a_directory.go b/vendor/github.com/onsi/gomega/matchers/be_a_directory.go deleted file mode 100644 index acffc8570..000000000 --- a/vendor/github.com/onsi/gomega/matchers/be_a_directory.go +++ /dev/null @@ -1,56 +0,0 @@ -// untested sections: 5 - -package matchers - -import ( - "fmt" - "os" - - "github.com/onsi/gomega/format" -) - -type notADirectoryError struct { - os.FileInfo -} - -func (t notADirectoryError) Error() string { - fileInfo := os.FileInfo(t) - switch { - case fileInfo.Mode().IsRegular(): - return "file is a regular file" - default: - return fmt.Sprintf("file mode is: %s", fileInfo.Mode().String()) - } -} - -type BeADirectoryMatcher struct { - expected interface{} - err error -} - -func (matcher *BeADirectoryMatcher) Match(actual interface{}) (success bool, err error) { - actualFilename, ok := actual.(string) - if !ok { - return false, fmt.Errorf("BeADirectoryMatcher matcher expects a file path") - } - - fileInfo, err := os.Stat(actualFilename) - if err != nil { - matcher.err = err - return false, nil - } - - if !fileInfo.Mode().IsDir() { - matcher.err = notADirectoryError{fileInfo} - return false, nil - } - return true, nil -} - -func (matcher *BeADirectoryMatcher) FailureMessage(actual interface{}) (message string) { - return format.Message(actual, fmt.Sprintf("to be a directory: %s", matcher.err)) -} - -func (matcher *BeADirectoryMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, fmt.Sprintf("not be a directory")) -} diff --git a/vendor/github.com/onsi/gomega/matchers/be_a_regular_file.go b/vendor/github.com/onsi/gomega/matchers/be_a_regular_file.go deleted file mode 100644 index 89441c800..000000000 --- a/vendor/github.com/onsi/gomega/matchers/be_a_regular_file.go +++ /dev/null @@ -1,56 +0,0 @@ -// untested sections: 5 - -package matchers - -import ( - "fmt" - "os" - - "github.com/onsi/gomega/format" -) - -type notARegularFileError struct { - os.FileInfo -} - -func (t notARegularFileError) Error() string { - fileInfo := os.FileInfo(t) - switch { - case fileInfo.IsDir(): - return "file is a directory" - default: - return fmt.Sprintf("file mode is: %s", fileInfo.Mode().String()) - } -} - -type BeARegularFileMatcher struct { - expected interface{} - err error -} - -func (matcher *BeARegularFileMatcher) Match(actual interface{}) (success bool, err error) { - actualFilename, ok := actual.(string) - if !ok { - return false, fmt.Errorf("BeARegularFileMatcher matcher expects a file path") - } - - fileInfo, err := os.Stat(actualFilename) - if err != nil { - matcher.err = err - return false, nil - } - - if !fileInfo.Mode().IsRegular() { - matcher.err = notARegularFileError{fileInfo} - return false, nil - } - return true, nil -} - -func (matcher *BeARegularFileMatcher) FailureMessage(actual interface{}) (message string) { - return format.Message(actual, fmt.Sprintf("to be a regular file: %s", matcher.err)) -} - -func (matcher *BeARegularFileMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, fmt.Sprintf("not be a regular file")) -} diff --git a/vendor/github.com/onsi/gomega/matchers/be_an_existing_file.go b/vendor/github.com/onsi/gomega/matchers/be_an_existing_file.go deleted file mode 100644 index ec6506b00..000000000 --- a/vendor/github.com/onsi/gomega/matchers/be_an_existing_file.go +++ /dev/null @@ -1,40 +0,0 @@ -// untested sections: 3 - -package matchers - -import ( - "fmt" - "os" - - "github.com/onsi/gomega/format" -) - -type BeAnExistingFileMatcher struct { - expected interface{} -} - -func (matcher *BeAnExistingFileMatcher) Match(actual interface{}) (success bool, err error) { - actualFilename, ok := actual.(string) - if !ok { - return false, fmt.Errorf("BeAnExistingFileMatcher matcher expects a file path") - } - - if _, err = os.Stat(actualFilename); err != nil { - switch { - case os.IsNotExist(err): - return false, nil - default: - return false, err - } - } - - return true, nil -} - -func (matcher *BeAnExistingFileMatcher) FailureMessage(actual interface{}) (message string) { - return format.Message(actual, fmt.Sprintf("to exist")) -} - -func (matcher *BeAnExistingFileMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, fmt.Sprintf("not to exist")) -} diff --git a/vendor/github.com/onsi/gomega/matchers/be_closed_matcher.go b/vendor/github.com/onsi/gomega/matchers/be_closed_matcher.go deleted file mode 100644 index f13c24490..000000000 --- a/vendor/github.com/onsi/gomega/matchers/be_closed_matcher.go +++ /dev/null @@ -1,48 +0,0 @@ -// untested sections: 2 - -package matchers - -import ( - "fmt" - "reflect" - - "github.com/onsi/gomega/format" -) - -type BeClosedMatcher struct { -} - -func (matcher *BeClosedMatcher) Match(actual interface{}) (success bool, err error) { - if !isChan(actual) { - return false, fmt.Errorf("BeClosed matcher expects a channel. Got:\n%s", format.Object(actual, 1)) - } - - channelType := reflect.TypeOf(actual) - channelValue := reflect.ValueOf(actual) - - if channelType.ChanDir() == reflect.SendDir { - return false, fmt.Errorf("BeClosed matcher cannot determine if a send-only channel is closed or open. Got:\n%s", format.Object(actual, 1)) - } - - winnerIndex, _, open := reflect.Select([]reflect.SelectCase{ - {Dir: reflect.SelectRecv, Chan: channelValue}, - {Dir: reflect.SelectDefault}, - }) - - var closed bool - if winnerIndex == 0 { - closed = !open - } else if winnerIndex == 1 { - closed = false - } - - return closed, nil -} - -func (matcher *BeClosedMatcher) FailureMessage(actual interface{}) (message string) { - return format.Message(actual, "to be closed") -} - -func (matcher *BeClosedMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, "to be open") -} diff --git a/vendor/github.com/onsi/gomega/matchers/be_element_of_matcher.go b/vendor/github.com/onsi/gomega/matchers/be_element_of_matcher.go deleted file mode 100644 index 1f9d7a8e6..000000000 --- a/vendor/github.com/onsi/gomega/matchers/be_element_of_matcher.go +++ /dev/null @@ -1,57 +0,0 @@ -// untested sections: 1 - -package matchers - -import ( - "fmt" - "reflect" - - "github.com/onsi/gomega/format" -) - -type BeElementOfMatcher struct { - Elements []interface{} -} - -func (matcher *BeElementOfMatcher) Match(actual interface{}) (success bool, err error) { - if reflect.TypeOf(actual) == nil { - return false, fmt.Errorf("BeElement matcher expects actual to be typed") - } - - length := len(matcher.Elements) - valueAt := func(i int) interface{} { - return matcher.Elements[i] - } - // Special handling of a single element of type Array or Slice - if length == 1 && isArrayOrSlice(valueAt(0)) { - element := valueAt(0) - value := reflect.ValueOf(element) - length = value.Len() - valueAt = func(i int) interface{} { - return value.Index(i).Interface() - } - } - - var lastError error - for i := 0; i < length; i++ { - matcher := &EqualMatcher{Expected: valueAt(i)} - success, err := matcher.Match(actual) - if err != nil { - lastError = err - continue - } - if success { - return true, nil - } - } - - return false, lastError -} - -func (matcher *BeElementOfMatcher) FailureMessage(actual interface{}) (message string) { - return format.Message(actual, "to be an element of", matcher.Elements) -} - -func (matcher *BeElementOfMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, "not to be an element of", matcher.Elements) -} diff --git a/vendor/github.com/onsi/gomega/matchers/be_empty_matcher.go b/vendor/github.com/onsi/gomega/matchers/be_empty_matcher.go deleted file mode 100644 index 527c1a1c1..000000000 --- a/vendor/github.com/onsi/gomega/matchers/be_empty_matcher.go +++ /dev/null @@ -1,29 +0,0 @@ -// untested sections: 2 - -package matchers - -import ( - "fmt" - - "github.com/onsi/gomega/format" -) - -type BeEmptyMatcher struct { -} - -func (matcher *BeEmptyMatcher) Match(actual interface{}) (success bool, err error) { - length, ok := lengthOf(actual) - if !ok { - return false, fmt.Errorf("BeEmpty matcher expects a string/array/map/channel/slice. Got:\n%s", format.Object(actual, 1)) - } - - return length == 0, nil -} - -func (matcher *BeEmptyMatcher) FailureMessage(actual interface{}) (message string) { - return format.Message(actual, "to be empty") -} - -func (matcher *BeEmptyMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, "not to be empty") -} diff --git a/vendor/github.com/onsi/gomega/matchers/be_equivalent_to_matcher.go b/vendor/github.com/onsi/gomega/matchers/be_equivalent_to_matcher.go deleted file mode 100644 index 263627f40..000000000 --- a/vendor/github.com/onsi/gomega/matchers/be_equivalent_to_matcher.go +++ /dev/null @@ -1,36 +0,0 @@ -// untested sections: 2 - -package matchers - -import ( - "fmt" - "reflect" - - "github.com/onsi/gomega/format" -) - -type BeEquivalentToMatcher struct { - Expected interface{} -} - -func (matcher *BeEquivalentToMatcher) Match(actual interface{}) (success bool, err error) { - if actual == nil && matcher.Expected == nil { - return false, fmt.Errorf("Both actual and expected must not be nil.") - } - - convertedActual := actual - - if actual != nil && matcher.Expected != nil && reflect.TypeOf(actual).ConvertibleTo(reflect.TypeOf(matcher.Expected)) { - convertedActual = reflect.ValueOf(actual).Convert(reflect.TypeOf(matcher.Expected)).Interface() - } - - return reflect.DeepEqual(convertedActual, matcher.Expected), nil -} - -func (matcher *BeEquivalentToMatcher) FailureMessage(actual interface{}) (message string) { - return format.Message(actual, "to be equivalent to", matcher.Expected) -} - -func (matcher *BeEquivalentToMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, "not to be equivalent to", matcher.Expected) -} diff --git a/vendor/github.com/onsi/gomega/matchers/be_false_matcher.go b/vendor/github.com/onsi/gomega/matchers/be_false_matcher.go deleted file mode 100644 index e326c0157..000000000 --- a/vendor/github.com/onsi/gomega/matchers/be_false_matcher.go +++ /dev/null @@ -1,28 +0,0 @@ -// untested sections: 2 - -package matchers - -import ( - "fmt" - - "github.com/onsi/gomega/format" -) - -type BeFalseMatcher struct { -} - -func (matcher *BeFalseMatcher) Match(actual interface{}) (success bool, err error) { - if !isBool(actual) { - return false, fmt.Errorf("Expected a boolean. Got:\n%s", format.Object(actual, 1)) - } - - return actual == false, nil -} - -func (matcher *BeFalseMatcher) FailureMessage(actual interface{}) (message string) { - return format.Message(actual, "to be false") -} - -func (matcher *BeFalseMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, "not to be false") -} diff --git a/vendor/github.com/onsi/gomega/matchers/be_identical_to.go b/vendor/github.com/onsi/gomega/matchers/be_identical_to.go deleted file mode 100644 index 631ce11e3..000000000 --- a/vendor/github.com/onsi/gomega/matchers/be_identical_to.go +++ /dev/null @@ -1,39 +0,0 @@ -// untested sections: 2 - -package matchers - -import ( - "fmt" - "runtime" - - "github.com/onsi/gomega/format" -) - -type BeIdenticalToMatcher struct { - Expected interface{} -} - -func (matcher *BeIdenticalToMatcher) Match(actual interface{}) (success bool, matchErr error) { - if actual == nil && matcher.Expected == nil { - return false, fmt.Errorf("Refusing to compare to .\nBe explicit and use BeNil() instead. This is to avoid mistakes where both sides of an assertion are erroneously uninitialized.") - } - - defer func() { - if r := recover(); r != nil { - if _, ok := r.(runtime.Error); ok { - success = false - matchErr = nil - } - } - }() - - return actual == matcher.Expected, nil -} - -func (matcher *BeIdenticalToMatcher) FailureMessage(actual interface{}) string { - return format.Message(actual, "to be identical to", matcher.Expected) -} - -func (matcher *BeIdenticalToMatcher) NegatedFailureMessage(actual interface{}) string { - return format.Message(actual, "not to be identical to", matcher.Expected) -} diff --git a/vendor/github.com/onsi/gomega/matchers/be_nil_matcher.go b/vendor/github.com/onsi/gomega/matchers/be_nil_matcher.go deleted file mode 100644 index 551d99d74..000000000 --- a/vendor/github.com/onsi/gomega/matchers/be_nil_matcher.go +++ /dev/null @@ -1,20 +0,0 @@ -// untested sections: 2 - -package matchers - -import "github.com/onsi/gomega/format" - -type BeNilMatcher struct { -} - -func (matcher *BeNilMatcher) Match(actual interface{}) (success bool, err error) { - return isNil(actual), nil -} - -func (matcher *BeNilMatcher) FailureMessage(actual interface{}) (message string) { - return format.Message(actual, "to be nil") -} - -func (matcher *BeNilMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, "not to be nil") -} diff --git a/vendor/github.com/onsi/gomega/matchers/be_numerically_matcher.go b/vendor/github.com/onsi/gomega/matchers/be_numerically_matcher.go deleted file mode 100644 index f72591a1a..000000000 --- a/vendor/github.com/onsi/gomega/matchers/be_numerically_matcher.go +++ /dev/null @@ -1,134 +0,0 @@ -// untested sections: 4 - -package matchers - -import ( - "fmt" - "math" - - "github.com/onsi/gomega/format" -) - -type BeNumericallyMatcher struct { - Comparator string - CompareTo []interface{} -} - -func (matcher *BeNumericallyMatcher) FailureMessage(actual interface{}) (message string) { - return matcher.FormatFailureMessage(actual, false) -} - -func (matcher *BeNumericallyMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return matcher.FormatFailureMessage(actual, true) -} - -func (matcher *BeNumericallyMatcher) FormatFailureMessage(actual interface{}, negated bool) (message string) { - if len(matcher.CompareTo) == 1 { - message = fmt.Sprintf("to be %s", matcher.Comparator) - } else { - message = fmt.Sprintf("to be within %v of %s", matcher.CompareTo[1], matcher.Comparator) - } - if negated { - message = "not " + message - } - return format.Message(actual, message, matcher.CompareTo[0]) -} - -func (matcher *BeNumericallyMatcher) Match(actual interface{}) (success bool, err error) { - if len(matcher.CompareTo) == 0 || len(matcher.CompareTo) > 2 { - return false, fmt.Errorf("BeNumerically requires 1 or 2 CompareTo arguments. Got:\n%s", format.Object(matcher.CompareTo, 1)) - } - if !isNumber(actual) { - return false, fmt.Errorf("Expected a number. Got:\n%s", format.Object(actual, 1)) - } - if !isNumber(matcher.CompareTo[0]) { - return false, fmt.Errorf("Expected a number. Got:\n%s", format.Object(matcher.CompareTo[0], 1)) - } - if len(matcher.CompareTo) == 2 && !isNumber(matcher.CompareTo[1]) { - return false, fmt.Errorf("Expected a number. Got:\n%s", format.Object(matcher.CompareTo[0], 1)) - } - - switch matcher.Comparator { - case "==", "~", ">", ">=", "<", "<=": - default: - return false, fmt.Errorf("Unknown comparator: %s", matcher.Comparator) - } - - if isFloat(actual) || isFloat(matcher.CompareTo[0]) { - var secondOperand float64 = 1e-8 - if len(matcher.CompareTo) == 2 { - secondOperand = toFloat(matcher.CompareTo[1]) - } - success = matcher.matchFloats(toFloat(actual), toFloat(matcher.CompareTo[0]), secondOperand) - } else if isInteger(actual) { - var secondOperand int64 = 0 - if len(matcher.CompareTo) == 2 { - secondOperand = toInteger(matcher.CompareTo[1]) - } - success = matcher.matchIntegers(toInteger(actual), toInteger(matcher.CompareTo[0]), secondOperand) - } else if isUnsignedInteger(actual) { - var secondOperand uint64 = 0 - if len(matcher.CompareTo) == 2 { - secondOperand = toUnsignedInteger(matcher.CompareTo[1]) - } - success = matcher.matchUnsignedIntegers(toUnsignedInteger(actual), toUnsignedInteger(matcher.CompareTo[0]), secondOperand) - } else { - return false, fmt.Errorf("Failed to compare:\n%s\n%s:\n%s", format.Object(actual, 1), matcher.Comparator, format.Object(matcher.CompareTo[0], 1)) - } - - return success, nil -} - -func (matcher *BeNumericallyMatcher) matchIntegers(actual, compareTo, threshold int64) (success bool) { - switch matcher.Comparator { - case "==", "~": - diff := actual - compareTo - return -threshold <= diff && diff <= threshold - case ">": - return (actual > compareTo) - case ">=": - return (actual >= compareTo) - case "<": - return (actual < compareTo) - case "<=": - return (actual <= compareTo) - } - return false -} - -func (matcher *BeNumericallyMatcher) matchUnsignedIntegers(actual, compareTo, threshold uint64) (success bool) { - switch matcher.Comparator { - case "==", "~": - if actual < compareTo { - actual, compareTo = compareTo, actual - } - return actual-compareTo <= threshold - case ">": - return (actual > compareTo) - case ">=": - return (actual >= compareTo) - case "<": - return (actual < compareTo) - case "<=": - return (actual <= compareTo) - } - return false -} - -func (matcher *BeNumericallyMatcher) matchFloats(actual, compareTo, threshold float64) (success bool) { - switch matcher.Comparator { - case "~": - return math.Abs(actual-compareTo) <= threshold - case "==": - return (actual == compareTo) - case ">": - return (actual > compareTo) - case ">=": - return (actual >= compareTo) - case "<": - return (actual < compareTo) - case "<=": - return (actual <= compareTo) - } - return false -} diff --git a/vendor/github.com/onsi/gomega/matchers/be_sent_matcher.go b/vendor/github.com/onsi/gomega/matchers/be_sent_matcher.go deleted file mode 100644 index cf582a3fc..000000000 --- a/vendor/github.com/onsi/gomega/matchers/be_sent_matcher.go +++ /dev/null @@ -1,73 +0,0 @@ -// untested sections: 3 - -package matchers - -import ( - "fmt" - "reflect" - - "github.com/onsi/gomega/format" -) - -type BeSentMatcher struct { - Arg interface{} - channelClosed bool -} - -func (matcher *BeSentMatcher) Match(actual interface{}) (success bool, err error) { - if !isChan(actual) { - return false, fmt.Errorf("BeSent expects a channel. Got:\n%s", format.Object(actual, 1)) - } - - channelType := reflect.TypeOf(actual) - channelValue := reflect.ValueOf(actual) - - if channelType.ChanDir() == reflect.RecvDir { - return false, fmt.Errorf("BeSent matcher cannot be passed a receive-only channel. Got:\n%s", format.Object(actual, 1)) - } - - argType := reflect.TypeOf(matcher.Arg) - assignable := argType.AssignableTo(channelType.Elem()) - - if !assignable { - return false, fmt.Errorf("Cannot pass:\n%s to the channel:\n%s\nThe types don't match.", format.Object(matcher.Arg, 1), format.Object(actual, 1)) - } - - argValue := reflect.ValueOf(matcher.Arg) - - defer func() { - if e := recover(); e != nil { - success = false - err = fmt.Errorf("Cannot send to a closed channel") - matcher.channelClosed = true - } - }() - - winnerIndex, _, _ := reflect.Select([]reflect.SelectCase{ - {Dir: reflect.SelectSend, Chan: channelValue, Send: argValue}, - {Dir: reflect.SelectDefault}, - }) - - var didSend bool - if winnerIndex == 0 { - didSend = true - } - - return didSend, nil -} - -func (matcher *BeSentMatcher) FailureMessage(actual interface{}) (message string) { - return format.Message(actual, "to send:", matcher.Arg) -} - -func (matcher *BeSentMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, "not to send:", matcher.Arg) -} - -func (matcher *BeSentMatcher) MatchMayChangeInTheFuture(actual interface{}) bool { - if !isChan(actual) { - return false - } - - return !matcher.channelClosed -} diff --git a/vendor/github.com/onsi/gomega/matchers/be_temporally_matcher.go b/vendor/github.com/onsi/gomega/matchers/be_temporally_matcher.go deleted file mode 100644 index dec4db024..000000000 --- a/vendor/github.com/onsi/gomega/matchers/be_temporally_matcher.go +++ /dev/null @@ -1,68 +0,0 @@ -// untested sections: 3 - -package matchers - -import ( - "fmt" - "time" - - "github.com/onsi/gomega/format" -) - -type BeTemporallyMatcher struct { - Comparator string - CompareTo time.Time - Threshold []time.Duration -} - -func (matcher *BeTemporallyMatcher) FailureMessage(actual interface{}) (message string) { - return format.Message(actual, fmt.Sprintf("to be %s", matcher.Comparator), matcher.CompareTo) -} - -func (matcher *BeTemporallyMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, fmt.Sprintf("not to be %s", matcher.Comparator), matcher.CompareTo) -} - -func (matcher *BeTemporallyMatcher) Match(actual interface{}) (bool, error) { - // predicate to test for time.Time type - isTime := func(t interface{}) bool { - _, ok := t.(time.Time) - return ok - } - - if !isTime(actual) { - return false, fmt.Errorf("Expected a time.Time. Got:\n%s", format.Object(actual, 1)) - } - - switch matcher.Comparator { - case "==", "~", ">", ">=", "<", "<=": - default: - return false, fmt.Errorf("Unknown comparator: %s", matcher.Comparator) - } - - var threshold = time.Millisecond - if len(matcher.Threshold) == 1 { - threshold = matcher.Threshold[0] - } - - return matcher.matchTimes(actual.(time.Time), matcher.CompareTo, threshold), nil -} - -func (matcher *BeTemporallyMatcher) matchTimes(actual, compareTo time.Time, threshold time.Duration) (success bool) { - switch matcher.Comparator { - case "==": - return actual.Equal(compareTo) - case "~": - diff := actual.Sub(compareTo) - return -threshold <= diff && diff <= threshold - case ">": - return actual.After(compareTo) - case ">=": - return !actual.Before(compareTo) - case "<": - return actual.Before(compareTo) - case "<=": - return !actual.After(compareTo) - } - return false -} diff --git a/vendor/github.com/onsi/gomega/matchers/be_true_matcher.go b/vendor/github.com/onsi/gomega/matchers/be_true_matcher.go deleted file mode 100644 index 60bc1e3fa..000000000 --- a/vendor/github.com/onsi/gomega/matchers/be_true_matcher.go +++ /dev/null @@ -1,28 +0,0 @@ -// untested sections: 2 - -package matchers - -import ( - "fmt" - - "github.com/onsi/gomega/format" -) - -type BeTrueMatcher struct { -} - -func (matcher *BeTrueMatcher) Match(actual interface{}) (success bool, err error) { - if !isBool(actual) { - return false, fmt.Errorf("Expected a boolean. Got:\n%s", format.Object(actual, 1)) - } - - return actual.(bool), nil -} - -func (matcher *BeTrueMatcher) FailureMessage(actual interface{}) (message string) { - return format.Message(actual, "to be true") -} - -func (matcher *BeTrueMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, "not to be true") -} diff --git a/vendor/github.com/onsi/gomega/matchers/be_zero_matcher.go b/vendor/github.com/onsi/gomega/matchers/be_zero_matcher.go deleted file mode 100644 index 26196f168..000000000 --- a/vendor/github.com/onsi/gomega/matchers/be_zero_matcher.go +++ /dev/null @@ -1,28 +0,0 @@ -package matchers - -import ( - "reflect" - - "github.com/onsi/gomega/format" -) - -type BeZeroMatcher struct { -} - -func (matcher *BeZeroMatcher) Match(actual interface{}) (success bool, err error) { - if actual == nil { - return true, nil - } - zeroValue := reflect.Zero(reflect.TypeOf(actual)).Interface() - - return reflect.DeepEqual(zeroValue, actual), nil - -} - -func (matcher *BeZeroMatcher) FailureMessage(actual interface{}) (message string) { - return format.Message(actual, "to be zero-valued") -} - -func (matcher *BeZeroMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, "not to be zero-valued") -} diff --git a/vendor/github.com/onsi/gomega/matchers/consist_of.go b/vendor/github.com/onsi/gomega/matchers/consist_of.go deleted file mode 100644 index cbbf61802..000000000 --- a/vendor/github.com/onsi/gomega/matchers/consist_of.go +++ /dev/null @@ -1,82 +0,0 @@ -// untested sections: 3 - -package matchers - -import ( - "fmt" - "reflect" - - "github.com/onsi/gomega/format" - "github.com/onsi/gomega/matchers/support/goraph/bipartitegraph" -) - -type ConsistOfMatcher struct { - Elements []interface{} -} - -func (matcher *ConsistOfMatcher) Match(actual interface{}) (success bool, err error) { - if !isArrayOrSlice(actual) && !isMap(actual) { - return false, fmt.Errorf("ConsistOf matcher expects an array/slice/map. Got:\n%s", format.Object(actual, 1)) - } - - elements := matcher.Elements - if len(matcher.Elements) == 1 && isArrayOrSlice(matcher.Elements[0]) { - elements = []interface{}{} - value := reflect.ValueOf(matcher.Elements[0]) - for i := 0; i < value.Len(); i++ { - elements = append(elements, value.Index(i).Interface()) - } - } - - matchers := []interface{}{} - for _, element := range elements { - matcher, isMatcher := element.(omegaMatcher) - if !isMatcher { - matcher = &EqualMatcher{Expected: element} - } - matchers = append(matchers, matcher) - } - - values := matcher.valuesOf(actual) - - if len(values) != len(matchers) { - return false, nil - } - - neighbours := func(v, m interface{}) (bool, error) { - match, err := m.(omegaMatcher).Match(v) - return match && err == nil, nil - } - - bipartiteGraph, err := bipartitegraph.NewBipartiteGraph(values, matchers, neighbours) - if err != nil { - return false, err - } - - return len(bipartiteGraph.LargestMatching()) == len(values), nil -} - -func (matcher *ConsistOfMatcher) valuesOf(actual interface{}) []interface{} { - value := reflect.ValueOf(actual) - values := []interface{}{} - if isMap(actual) { - keys := value.MapKeys() - for i := 0; i < value.Len(); i++ { - values = append(values, value.MapIndex(keys[i]).Interface()) - } - } else { - for i := 0; i < value.Len(); i++ { - values = append(values, value.Index(i).Interface()) - } - } - - return values -} - -func (matcher *ConsistOfMatcher) FailureMessage(actual interface{}) (message string) { - return format.Message(actual, "to consist of", matcher.Elements) -} - -func (matcher *ConsistOfMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, "not to consist of", matcher.Elements) -} diff --git a/vendor/github.com/onsi/gomega/matchers/contain_element_matcher.go b/vendor/github.com/onsi/gomega/matchers/contain_element_matcher.go deleted file mode 100644 index 8d6c44c7a..000000000 --- a/vendor/github.com/onsi/gomega/matchers/contain_element_matcher.go +++ /dev/null @@ -1,60 +0,0 @@ -// untested sections: 2 - -package matchers - -import ( - "fmt" - "reflect" - - "github.com/onsi/gomega/format" -) - -type ContainElementMatcher struct { - Element interface{} -} - -func (matcher *ContainElementMatcher) Match(actual interface{}) (success bool, err error) { - if !isArrayOrSlice(actual) && !isMap(actual) { - return false, fmt.Errorf("ContainElement matcher expects an array/slice/map. Got:\n%s", format.Object(actual, 1)) - } - - elemMatcher, elementIsMatcher := matcher.Element.(omegaMatcher) - if !elementIsMatcher { - elemMatcher = &EqualMatcher{Expected: matcher.Element} - } - - value := reflect.ValueOf(actual) - var valueAt func(int) interface{} - if isMap(actual) { - keys := value.MapKeys() - valueAt = func(i int) interface{} { - return value.MapIndex(keys[i]).Interface() - } - } else { - valueAt = func(i int) interface{} { - return value.Index(i).Interface() - } - } - - var lastError error - for i := 0; i < value.Len(); i++ { - success, err := elemMatcher.Match(valueAt(i)) - if err != nil { - lastError = err - continue - } - if success { - return true, nil - } - } - - return false, lastError -} - -func (matcher *ContainElementMatcher) FailureMessage(actual interface{}) (message string) { - return format.Message(actual, "to contain element matching", matcher.Element) -} - -func (matcher *ContainElementMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, "not to contain element matching", matcher.Element) -} diff --git a/vendor/github.com/onsi/gomega/matchers/contain_substring_matcher.go b/vendor/github.com/onsi/gomega/matchers/contain_substring_matcher.go deleted file mode 100644 index e725f8c27..000000000 --- a/vendor/github.com/onsi/gomega/matchers/contain_substring_matcher.go +++ /dev/null @@ -1,40 +0,0 @@ -// untested sections: 2 - -package matchers - -import ( - "fmt" - "strings" - - "github.com/onsi/gomega/format" -) - -type ContainSubstringMatcher struct { - Substr string - Args []interface{} -} - -func (matcher *ContainSubstringMatcher) Match(actual interface{}) (success bool, err error) { - actualString, ok := toString(actual) - if !ok { - return false, fmt.Errorf("ContainSubstring matcher requires a string or stringer. Got:\n%s", format.Object(actual, 1)) - } - - return strings.Contains(actualString, matcher.stringToMatch()), nil -} - -func (matcher *ContainSubstringMatcher) stringToMatch() string { - stringToMatch := matcher.Substr - if len(matcher.Args) > 0 { - stringToMatch = fmt.Sprintf(matcher.Substr, matcher.Args...) - } - return stringToMatch -} - -func (matcher *ContainSubstringMatcher) FailureMessage(actual interface{}) (message string) { - return format.Message(actual, "to contain substring", matcher.stringToMatch()) -} - -func (matcher *ContainSubstringMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, "not to contain substring", matcher.stringToMatch()) -} diff --git a/vendor/github.com/onsi/gomega/matchers/equal_matcher.go b/vendor/github.com/onsi/gomega/matchers/equal_matcher.go deleted file mode 100644 index befb7bdfd..000000000 --- a/vendor/github.com/onsi/gomega/matchers/equal_matcher.go +++ /dev/null @@ -1,42 +0,0 @@ -package matchers - -import ( - "bytes" - "fmt" - "reflect" - - "github.com/onsi/gomega/format" -) - -type EqualMatcher struct { - Expected interface{} -} - -func (matcher *EqualMatcher) Match(actual interface{}) (success bool, err error) { - if actual == nil && matcher.Expected == nil { - return false, fmt.Errorf("Refusing to compare to .\nBe explicit and use BeNil() instead. This is to avoid mistakes where both sides of an assertion are erroneously uninitialized.") - } - // Shortcut for byte slices. - // Comparing long byte slices with reflect.DeepEqual is very slow, - // so use bytes.Equal if actual and expected are both byte slices. - if actualByteSlice, ok := actual.([]byte); ok { - if expectedByteSlice, ok := matcher.Expected.([]byte); ok { - return bytes.Equal(actualByteSlice, expectedByteSlice), nil - } - } - return reflect.DeepEqual(actual, matcher.Expected), nil -} - -func (matcher *EqualMatcher) FailureMessage(actual interface{}) (message string) { - actualString, actualOK := actual.(string) - expectedString, expectedOK := matcher.Expected.(string) - if actualOK && expectedOK { - return format.MessageWithDiff(actualString, "to equal", expectedString) - } - - return format.Message(actual, "to equal", matcher.Expected) -} - -func (matcher *EqualMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, "not to equal", matcher.Expected) -} diff --git a/vendor/github.com/onsi/gomega/matchers/have_cap_matcher.go b/vendor/github.com/onsi/gomega/matchers/have_cap_matcher.go deleted file mode 100644 index 9856752f1..000000000 --- a/vendor/github.com/onsi/gomega/matchers/have_cap_matcher.go +++ /dev/null @@ -1,30 +0,0 @@ -// untested sections: 2 - -package matchers - -import ( - "fmt" - - "github.com/onsi/gomega/format" -) - -type HaveCapMatcher struct { - Count int -} - -func (matcher *HaveCapMatcher) Match(actual interface{}) (success bool, err error) { - length, ok := capOf(actual) - if !ok { - return false, fmt.Errorf("HaveCap matcher expects a array/channel/slice. Got:\n%s", format.Object(actual, 1)) - } - - return length == matcher.Count, nil -} - -func (matcher *HaveCapMatcher) FailureMessage(actual interface{}) (message string) { - return fmt.Sprintf("Expected\n%s\nto have capacity %d", format.Object(actual, 1), matcher.Count) -} - -func (matcher *HaveCapMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return fmt.Sprintf("Expected\n%s\nnot to have capacity %d", format.Object(actual, 1), matcher.Count) -} diff --git a/vendor/github.com/onsi/gomega/matchers/have_key_matcher.go b/vendor/github.com/onsi/gomega/matchers/have_key_matcher.go deleted file mode 100644 index 00cffec70..000000000 --- a/vendor/github.com/onsi/gomega/matchers/have_key_matcher.go +++ /dev/null @@ -1,56 +0,0 @@ -// untested sections: 6 - -package matchers - -import ( - "fmt" - "reflect" - - "github.com/onsi/gomega/format" -) - -type HaveKeyMatcher struct { - Key interface{} -} - -func (matcher *HaveKeyMatcher) Match(actual interface{}) (success bool, err error) { - if !isMap(actual) { - return false, fmt.Errorf("HaveKey matcher expects a map. Got:%s", format.Object(actual, 1)) - } - - keyMatcher, keyIsMatcher := matcher.Key.(omegaMatcher) - if !keyIsMatcher { - keyMatcher = &EqualMatcher{Expected: matcher.Key} - } - - keys := reflect.ValueOf(actual).MapKeys() - for i := 0; i < len(keys); i++ { - success, err := keyMatcher.Match(keys[i].Interface()) - if err != nil { - return false, fmt.Errorf("HaveKey's key matcher failed with:\n%s%s", format.Indent, err.Error()) - } - if success { - return true, nil - } - } - - return false, nil -} - -func (matcher *HaveKeyMatcher) FailureMessage(actual interface{}) (message string) { - switch matcher.Key.(type) { - case omegaMatcher: - return format.Message(actual, "to have key matching", matcher.Key) - default: - return format.Message(actual, "to have key", matcher.Key) - } -} - -func (matcher *HaveKeyMatcher) NegatedFailureMessage(actual interface{}) (message string) { - switch matcher.Key.(type) { - case omegaMatcher: - return format.Message(actual, "not to have key matching", matcher.Key) - default: - return format.Message(actual, "not to have key", matcher.Key) - } -} diff --git a/vendor/github.com/onsi/gomega/matchers/have_key_with_value_matcher.go b/vendor/github.com/onsi/gomega/matchers/have_key_with_value_matcher.go deleted file mode 100644 index 4c5916804..000000000 --- a/vendor/github.com/onsi/gomega/matchers/have_key_with_value_matcher.go +++ /dev/null @@ -1,76 +0,0 @@ -// untested sections:10 - -package matchers - -import ( - "fmt" - "reflect" - - "github.com/onsi/gomega/format" -) - -type HaveKeyWithValueMatcher struct { - Key interface{} - Value interface{} -} - -func (matcher *HaveKeyWithValueMatcher) Match(actual interface{}) (success bool, err error) { - if !isMap(actual) { - return false, fmt.Errorf("HaveKeyWithValue matcher expects a map. Got:%s", format.Object(actual, 1)) - } - - keyMatcher, keyIsMatcher := matcher.Key.(omegaMatcher) - if !keyIsMatcher { - keyMatcher = &EqualMatcher{Expected: matcher.Key} - } - - valueMatcher, valueIsMatcher := matcher.Value.(omegaMatcher) - if !valueIsMatcher { - valueMatcher = &EqualMatcher{Expected: matcher.Value} - } - - keys := reflect.ValueOf(actual).MapKeys() - for i := 0; i < len(keys); i++ { - success, err := keyMatcher.Match(keys[i].Interface()) - if err != nil { - return false, fmt.Errorf("HaveKeyWithValue's key matcher failed with:\n%s%s", format.Indent, err.Error()) - } - if success { - actualValue := reflect.ValueOf(actual).MapIndex(keys[i]) - success, err := valueMatcher.Match(actualValue.Interface()) - if err != nil { - return false, fmt.Errorf("HaveKeyWithValue's value matcher failed with:\n%s%s", format.Indent, err.Error()) - } - return success, nil - } - } - - return false, nil -} - -func (matcher *HaveKeyWithValueMatcher) FailureMessage(actual interface{}) (message string) { - str := "to have {key: value}" - if _, ok := matcher.Key.(omegaMatcher); ok { - str += " matching" - } else if _, ok := matcher.Value.(omegaMatcher); ok { - str += " matching" - } - - expect := make(map[interface{}]interface{}, 1) - expect[matcher.Key] = matcher.Value - return format.Message(actual, str, expect) -} - -func (matcher *HaveKeyWithValueMatcher) NegatedFailureMessage(actual interface{}) (message string) { - kStr := "not to have key" - if _, ok := matcher.Key.(omegaMatcher); ok { - kStr = "not to have key matching" - } - - vStr := "or that key's value not be" - if _, ok := matcher.Value.(omegaMatcher); ok { - vStr = "or to have that key's value not matching" - } - - return format.Message(actual, kStr, matcher.Key, vStr, matcher.Value) -} diff --git a/vendor/github.com/onsi/gomega/matchers/have_len_matcher.go b/vendor/github.com/onsi/gomega/matchers/have_len_matcher.go deleted file mode 100644 index ee4276189..000000000 --- a/vendor/github.com/onsi/gomega/matchers/have_len_matcher.go +++ /dev/null @@ -1,28 +0,0 @@ -package matchers - -import ( - "fmt" - - "github.com/onsi/gomega/format" -) - -type HaveLenMatcher struct { - Count int -} - -func (matcher *HaveLenMatcher) Match(actual interface{}) (success bool, err error) { - length, ok := lengthOf(actual) - if !ok { - return false, fmt.Errorf("HaveLen matcher expects a string/array/map/channel/slice. Got:\n%s", format.Object(actual, 1)) - } - - return length == matcher.Count, nil -} - -func (matcher *HaveLenMatcher) FailureMessage(actual interface{}) (message string) { - return fmt.Sprintf("Expected\n%s\nto have length %d", format.Object(actual, 1), matcher.Count) -} - -func (matcher *HaveLenMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return fmt.Sprintf("Expected\n%s\nnot to have length %d", format.Object(actual, 1), matcher.Count) -} diff --git a/vendor/github.com/onsi/gomega/matchers/have_occurred_matcher.go b/vendor/github.com/onsi/gomega/matchers/have_occurred_matcher.go deleted file mode 100644 index 5bcfdd2ad..000000000 --- a/vendor/github.com/onsi/gomega/matchers/have_occurred_matcher.go +++ /dev/null @@ -1,35 +0,0 @@ -// untested sections: 2 - -package matchers - -import ( - "fmt" - - "github.com/onsi/gomega/format" -) - -type HaveOccurredMatcher struct { -} - -func (matcher *HaveOccurredMatcher) Match(actual interface{}) (success bool, err error) { - // is purely nil? - if actual == nil { - return false, nil - } - - // must be an 'error' type - if !isError(actual) { - return false, fmt.Errorf("Expected an error-type. Got:\n%s", format.Object(actual, 1)) - } - - // must be non-nil (or a pointer to a non-nil) - return !isNil(actual), nil -} - -func (matcher *HaveOccurredMatcher) FailureMessage(actual interface{}) (message string) { - return fmt.Sprintf("Expected an error to have occurred. Got:\n%s", format.Object(actual, 1)) -} - -func (matcher *HaveOccurredMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return fmt.Sprintf("Unexpected error:\n%s\n%s\n%s", format.Object(actual, 1), format.IndentString(actual.(error).Error(), 1), "occurred") -} diff --git a/vendor/github.com/onsi/gomega/matchers/have_prefix_matcher.go b/vendor/github.com/onsi/gomega/matchers/have_prefix_matcher.go deleted file mode 100644 index 1d8e80270..000000000 --- a/vendor/github.com/onsi/gomega/matchers/have_prefix_matcher.go +++ /dev/null @@ -1,36 +0,0 @@ -package matchers - -import ( - "fmt" - - "github.com/onsi/gomega/format" -) - -type HavePrefixMatcher struct { - Prefix string - Args []interface{} -} - -func (matcher *HavePrefixMatcher) Match(actual interface{}) (success bool, err error) { - actualString, ok := toString(actual) - if !ok { - return false, fmt.Errorf("HavePrefix matcher requires a string or stringer. Got:\n%s", format.Object(actual, 1)) - } - prefix := matcher.prefix() - return len(actualString) >= len(prefix) && actualString[0:len(prefix)] == prefix, nil -} - -func (matcher *HavePrefixMatcher) prefix() string { - if len(matcher.Args) > 0 { - return fmt.Sprintf(matcher.Prefix, matcher.Args...) - } - return matcher.Prefix -} - -func (matcher *HavePrefixMatcher) FailureMessage(actual interface{}) (message string) { - return format.Message(actual, "to have prefix", matcher.prefix()) -} - -func (matcher *HavePrefixMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, "not to have prefix", matcher.prefix()) -} diff --git a/vendor/github.com/onsi/gomega/matchers/have_suffix_matcher.go b/vendor/github.com/onsi/gomega/matchers/have_suffix_matcher.go deleted file mode 100644 index 40a3526eb..000000000 --- a/vendor/github.com/onsi/gomega/matchers/have_suffix_matcher.go +++ /dev/null @@ -1,36 +0,0 @@ -package matchers - -import ( - "fmt" - - "github.com/onsi/gomega/format" -) - -type HaveSuffixMatcher struct { - Suffix string - Args []interface{} -} - -func (matcher *HaveSuffixMatcher) Match(actual interface{}) (success bool, err error) { - actualString, ok := toString(actual) - if !ok { - return false, fmt.Errorf("HaveSuffix matcher requires a string or stringer. Got:\n%s", format.Object(actual, 1)) - } - suffix := matcher.suffix() - return len(actualString) >= len(suffix) && actualString[len(actualString)-len(suffix):] == suffix, nil -} - -func (matcher *HaveSuffixMatcher) suffix() string { - if len(matcher.Args) > 0 { - return fmt.Sprintf(matcher.Suffix, matcher.Args...) - } - return matcher.Suffix -} - -func (matcher *HaveSuffixMatcher) FailureMessage(actual interface{}) (message string) { - return format.Message(actual, "to have suffix", matcher.suffix()) -} - -func (matcher *HaveSuffixMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, "not to have suffix", matcher.suffix()) -} diff --git a/vendor/github.com/onsi/gomega/matchers/match_error_matcher.go b/vendor/github.com/onsi/gomega/matchers/match_error_matcher.go deleted file mode 100644 index 07499ac95..000000000 --- a/vendor/github.com/onsi/gomega/matchers/match_error_matcher.go +++ /dev/null @@ -1,51 +0,0 @@ -package matchers - -import ( - "fmt" - "reflect" - - "github.com/onsi/gomega/format" -) - -type MatchErrorMatcher struct { - Expected interface{} -} - -func (matcher *MatchErrorMatcher) Match(actual interface{}) (success bool, err error) { - if isNil(actual) { - return false, fmt.Errorf("Expected an error, got nil") - } - - if !isError(actual) { - return false, fmt.Errorf("Expected an error. Got:\n%s", format.Object(actual, 1)) - } - - actualErr := actual.(error) - - if isError(matcher.Expected) { - return reflect.DeepEqual(actualErr, matcher.Expected), nil - } - - if isString(matcher.Expected) { - return actualErr.Error() == matcher.Expected, nil - } - - var subMatcher omegaMatcher - var hasSubMatcher bool - if matcher.Expected != nil { - subMatcher, hasSubMatcher = (matcher.Expected).(omegaMatcher) - if hasSubMatcher { - return subMatcher.Match(actualErr.Error()) - } - } - - return false, fmt.Errorf("MatchError must be passed an error, string, or Matcher that can match on strings. Got:\n%s", format.Object(matcher.Expected, 1)) -} - -func (matcher *MatchErrorMatcher) FailureMessage(actual interface{}) (message string) { - return format.Message(actual, "to match error", matcher.Expected) -} - -func (matcher *MatchErrorMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, "not to match error", matcher.Expected) -} diff --git a/vendor/github.com/onsi/gomega/matchers/match_json_matcher.go b/vendor/github.com/onsi/gomega/matchers/match_json_matcher.go deleted file mode 100644 index f962f139f..000000000 --- a/vendor/github.com/onsi/gomega/matchers/match_json_matcher.go +++ /dev/null @@ -1,65 +0,0 @@ -package matchers - -import ( - "bytes" - "encoding/json" - "fmt" - - "github.com/onsi/gomega/format" -) - -type MatchJSONMatcher struct { - JSONToMatch interface{} - firstFailurePath []interface{} -} - -func (matcher *MatchJSONMatcher) Match(actual interface{}) (success bool, err error) { - actualString, expectedString, err := matcher.prettyPrint(actual) - if err != nil { - return false, err - } - - var aval interface{} - var eval interface{} - - // this is guarded by prettyPrint - json.Unmarshal([]byte(actualString), &aval) - json.Unmarshal([]byte(expectedString), &eval) - var equal bool - equal, matcher.firstFailurePath = deepEqual(aval, eval) - return equal, nil -} - -func (matcher *MatchJSONMatcher) FailureMessage(actual interface{}) (message string) { - actualString, expectedString, _ := matcher.prettyPrint(actual) - return formattedMessage(format.Message(actualString, "to match JSON of", expectedString), matcher.firstFailurePath) -} - -func (matcher *MatchJSONMatcher) NegatedFailureMessage(actual interface{}) (message string) { - actualString, expectedString, _ := matcher.prettyPrint(actual) - return formattedMessage(format.Message(actualString, "not to match JSON of", expectedString), matcher.firstFailurePath) -} - -func (matcher *MatchJSONMatcher) prettyPrint(actual interface{}) (actualFormatted, expectedFormatted string, err error) { - actualString, ok := toString(actual) - if !ok { - return "", "", fmt.Errorf("MatchJSONMatcher matcher requires a string, stringer, or []byte. Got actual:\n%s", format.Object(actual, 1)) - } - expectedString, ok := toString(matcher.JSONToMatch) - if !ok { - return "", "", fmt.Errorf("MatchJSONMatcher matcher requires a string, stringer, or []byte. Got expected:\n%s", format.Object(matcher.JSONToMatch, 1)) - } - - abuf := new(bytes.Buffer) - ebuf := new(bytes.Buffer) - - if err := json.Indent(abuf, []byte(actualString), "", " "); err != nil { - return "", "", fmt.Errorf("Actual '%s' should be valid JSON, but it is not.\nUnderlying error:%s", actualString, err) - } - - if err := json.Indent(ebuf, []byte(expectedString), "", " "); err != nil { - return "", "", fmt.Errorf("Expected '%s' should be valid JSON, but it is not.\nUnderlying error:%s", expectedString, err) - } - - return abuf.String(), ebuf.String(), nil -} diff --git a/vendor/github.com/onsi/gomega/matchers/match_regexp_matcher.go b/vendor/github.com/onsi/gomega/matchers/match_regexp_matcher.go deleted file mode 100644 index adac5db6b..000000000 --- a/vendor/github.com/onsi/gomega/matchers/match_regexp_matcher.go +++ /dev/null @@ -1,43 +0,0 @@ -package matchers - -import ( - "fmt" - "regexp" - - "github.com/onsi/gomega/format" -) - -type MatchRegexpMatcher struct { - Regexp string - Args []interface{} -} - -func (matcher *MatchRegexpMatcher) Match(actual interface{}) (success bool, err error) { - actualString, ok := toString(actual) - if !ok { - return false, fmt.Errorf("RegExp matcher requires a string or stringer.\nGot:%s", format.Object(actual, 1)) - } - - match, err := regexp.Match(matcher.regexp(), []byte(actualString)) - if err != nil { - return false, fmt.Errorf("RegExp match failed to compile with error:\n\t%s", err.Error()) - } - - return match, nil -} - -func (matcher *MatchRegexpMatcher) FailureMessage(actual interface{}) (message string) { - return format.Message(actual, "to match regular expression", matcher.regexp()) -} - -func (matcher *MatchRegexpMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, "not to match regular expression", matcher.regexp()) -} - -func (matcher *MatchRegexpMatcher) regexp() string { - re := matcher.Regexp - if len(matcher.Args) > 0 { - re = fmt.Sprintf(matcher.Regexp, matcher.Args...) - } - return re -} diff --git a/vendor/github.com/onsi/gomega/matchers/match_xml_matcher.go b/vendor/github.com/onsi/gomega/matchers/match_xml_matcher.go deleted file mode 100644 index 5c815f5af..000000000 --- a/vendor/github.com/onsi/gomega/matchers/match_xml_matcher.go +++ /dev/null @@ -1,134 +0,0 @@ -package matchers - -import ( - "bytes" - "encoding/xml" - "errors" - "fmt" - "io" - "reflect" - "sort" - "strings" - - "github.com/onsi/gomega/format" - "golang.org/x/net/html/charset" -) - -type MatchXMLMatcher struct { - XMLToMatch interface{} -} - -func (matcher *MatchXMLMatcher) Match(actual interface{}) (success bool, err error) { - actualString, expectedString, err := matcher.formattedPrint(actual) - if err != nil { - return false, err - } - - aval, err := parseXmlContent(actualString) - if err != nil { - return false, fmt.Errorf("Actual '%s' should be valid XML, but it is not.\nUnderlying error:%s", actualString, err) - } - - eval, err := parseXmlContent(expectedString) - if err != nil { - return false, fmt.Errorf("Expected '%s' should be valid XML, but it is not.\nUnderlying error:%s", expectedString, err) - } - - return reflect.DeepEqual(aval, eval), nil -} - -func (matcher *MatchXMLMatcher) FailureMessage(actual interface{}) (message string) { - actualString, expectedString, _ := matcher.formattedPrint(actual) - return fmt.Sprintf("Expected\n%s\nto match XML of\n%s", actualString, expectedString) -} - -func (matcher *MatchXMLMatcher) NegatedFailureMessage(actual interface{}) (message string) { - actualString, expectedString, _ := matcher.formattedPrint(actual) - return fmt.Sprintf("Expected\n%s\nnot to match XML of\n%s", actualString, expectedString) -} - -func (matcher *MatchXMLMatcher) formattedPrint(actual interface{}) (actualString, expectedString string, err error) { - var ok bool - actualString, ok = toString(actual) - if !ok { - return "", "", fmt.Errorf("MatchXMLMatcher matcher requires a string, stringer, or []byte. Got actual:\n%s", format.Object(actual, 1)) - } - expectedString, ok = toString(matcher.XMLToMatch) - if !ok { - return "", "", fmt.Errorf("MatchXMLMatcher matcher requires a string, stringer, or []byte. Got expected:\n%s", format.Object(matcher.XMLToMatch, 1)) - } - return actualString, expectedString, nil -} - -func parseXmlContent(content string) (*xmlNode, error) { - allNodes := []*xmlNode{} - - dec := newXmlDecoder(strings.NewReader(content)) - for { - tok, err := dec.Token() - if err != nil { - if err == io.EOF { - break - } - return nil, fmt.Errorf("failed to decode next token: %v", err) // untested section - } - - lastNodeIndex := len(allNodes) - 1 - var lastNode *xmlNode - if len(allNodes) > 0 { - lastNode = allNodes[lastNodeIndex] - } else { - lastNode = &xmlNode{} - } - - switch tok := tok.(type) { - case xml.StartElement: - attrs := attributesSlice(tok.Attr) - sort.Sort(attrs) - allNodes = append(allNodes, &xmlNode{XMLName: tok.Name, XMLAttr: tok.Attr}) - case xml.EndElement: - if len(allNodes) > 1 { - allNodes[lastNodeIndex-1].Nodes = append(allNodes[lastNodeIndex-1].Nodes, lastNode) - allNodes = allNodes[:lastNodeIndex] - } - case xml.CharData: - lastNode.Content = append(lastNode.Content, tok.Copy()...) - case xml.Comment: - lastNode.Comments = append(lastNode.Comments, tok.Copy()) // untested section - case xml.ProcInst: - lastNode.ProcInsts = append(lastNode.ProcInsts, tok.Copy()) - } - } - - if len(allNodes) == 0 { - return nil, errors.New("found no nodes") - } - firstNode := allNodes[0] - trimParentNodesContentSpaces(firstNode) - - return firstNode, nil -} - -func newXmlDecoder(reader io.Reader) *xml.Decoder { - dec := xml.NewDecoder(reader) - dec.CharsetReader = charset.NewReaderLabel - return dec -} - -func trimParentNodesContentSpaces(node *xmlNode) { - if len(node.Nodes) > 0 { - node.Content = bytes.TrimSpace(node.Content) - for _, childNode := range node.Nodes { - trimParentNodesContentSpaces(childNode) - } - } -} - -type xmlNode struct { - XMLName xml.Name - Comments []xml.Comment - ProcInsts []xml.ProcInst - XMLAttr []xml.Attr - Content []byte - Nodes []*xmlNode -} diff --git a/vendor/github.com/onsi/gomega/matchers/match_yaml_matcher.go b/vendor/github.com/onsi/gomega/matchers/match_yaml_matcher.go deleted file mode 100644 index 0c83c2b63..000000000 --- a/vendor/github.com/onsi/gomega/matchers/match_yaml_matcher.go +++ /dev/null @@ -1,76 +0,0 @@ -package matchers - -import ( - "fmt" - "strings" - - "github.com/onsi/gomega/format" - "gopkg.in/yaml.v2" -) - -type MatchYAMLMatcher struct { - YAMLToMatch interface{} - firstFailurePath []interface{} -} - -func (matcher *MatchYAMLMatcher) Match(actual interface{}) (success bool, err error) { - actualString, expectedString, err := matcher.toStrings(actual) - if err != nil { - return false, err - } - - var aval interface{} - var eval interface{} - - if err := yaml.Unmarshal([]byte(actualString), &aval); err != nil { - return false, fmt.Errorf("Actual '%s' should be valid YAML, but it is not.\nUnderlying error:%s", actualString, err) - } - if err := yaml.Unmarshal([]byte(expectedString), &eval); err != nil { - return false, fmt.Errorf("Expected '%s' should be valid YAML, but it is not.\nUnderlying error:%s", expectedString, err) - } - - var equal bool - equal, matcher.firstFailurePath = deepEqual(aval, eval) - return equal, nil -} - -func (matcher *MatchYAMLMatcher) FailureMessage(actual interface{}) (message string) { - actualString, expectedString, _ := matcher.toNormalisedStrings(actual) - return formattedMessage(format.Message(actualString, "to match YAML of", expectedString), matcher.firstFailurePath) -} - -func (matcher *MatchYAMLMatcher) NegatedFailureMessage(actual interface{}) (message string) { - actualString, expectedString, _ := matcher.toNormalisedStrings(actual) - return formattedMessage(format.Message(actualString, "not to match YAML of", expectedString), matcher.firstFailurePath) -} - -func (matcher *MatchYAMLMatcher) toNormalisedStrings(actual interface{}) (actualFormatted, expectedFormatted string, err error) { - actualString, expectedString, err := matcher.toStrings(actual) - return normalise(actualString), normalise(expectedString), err -} - -func normalise(input string) string { - var val interface{} - err := yaml.Unmarshal([]byte(input), &val) - if err != nil { - panic(err) // unreachable since Match already calls Unmarshal - } - output, err := yaml.Marshal(val) - if err != nil { - panic(err) // untested section, unreachable since we Unmarshal above - } - return strings.TrimSpace(string(output)) -} - -func (matcher *MatchYAMLMatcher) toStrings(actual interface{}) (actualFormatted, expectedFormatted string, err error) { - actualString, ok := toString(actual) - if !ok { - return "", "", fmt.Errorf("MatchYAMLMatcher matcher requires a string, stringer, or []byte. Got actual:\n%s", format.Object(actual, 1)) - } - expectedString, ok := toString(matcher.YAMLToMatch) - if !ok { - return "", "", fmt.Errorf("MatchYAMLMatcher matcher requires a string, stringer, or []byte. Got expected:\n%s", format.Object(matcher.YAMLToMatch, 1)) - } - - return actualString, expectedString, nil -} diff --git a/vendor/github.com/onsi/gomega/matchers/not.go b/vendor/github.com/onsi/gomega/matchers/not.go deleted file mode 100644 index 2c91670bd..000000000 --- a/vendor/github.com/onsi/gomega/matchers/not.go +++ /dev/null @@ -1,30 +0,0 @@ -package matchers - -import ( - "github.com/onsi/gomega/internal/oraclematcher" - "github.com/onsi/gomega/types" -) - -type NotMatcher struct { - Matcher types.GomegaMatcher -} - -func (m *NotMatcher) Match(actual interface{}) (bool, error) { - success, err := m.Matcher.Match(actual) - if err != nil { - return false, err - } - return !success, nil -} - -func (m *NotMatcher) FailureMessage(actual interface{}) (message string) { - return m.Matcher.NegatedFailureMessage(actual) // works beautifully -} - -func (m *NotMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return m.Matcher.FailureMessage(actual) // works beautifully -} - -func (m *NotMatcher) MatchMayChangeInTheFuture(actual interface{}) bool { - return oraclematcher.MatchMayChangeInTheFuture(m.Matcher, actual) // just return m.Matcher's value -} diff --git a/vendor/github.com/onsi/gomega/matchers/or.go b/vendor/github.com/onsi/gomega/matchers/or.go deleted file mode 100644 index 3bf799800..000000000 --- a/vendor/github.com/onsi/gomega/matchers/or.go +++ /dev/null @@ -1,67 +0,0 @@ -package matchers - -import ( - "fmt" - - "github.com/onsi/gomega/format" - "github.com/onsi/gomega/internal/oraclematcher" - "github.com/onsi/gomega/types" -) - -type OrMatcher struct { - Matchers []types.GomegaMatcher - - // state - firstSuccessfulMatcher types.GomegaMatcher -} - -func (m *OrMatcher) Match(actual interface{}) (success bool, err error) { - m.firstSuccessfulMatcher = nil - for _, matcher := range m.Matchers { - success, err := matcher.Match(actual) - if err != nil { - return false, err - } - if success { - m.firstSuccessfulMatcher = matcher - return true, nil - } - } - return false, nil -} - -func (m *OrMatcher) FailureMessage(actual interface{}) (message string) { - // not the most beautiful list of matchers, but not bad either... - return format.Message(actual, fmt.Sprintf("To satisfy at least one of these matchers: %s", m.Matchers)) -} - -func (m *OrMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return m.firstSuccessfulMatcher.NegatedFailureMessage(actual) -} - -func (m *OrMatcher) MatchMayChangeInTheFuture(actual interface{}) bool { - /* - Example with 3 matchers: A, B, C - - Match evaluates them: F, T, => T - So match is currently T, what should MatchMayChangeInTheFuture() return? - Seems like it only depends on B, since currently B MUST change to allow the result to become F - - Match eval: F, F, F => F - So match is currently F, what should MatchMayChangeInTheFuture() return? - Seems to depend on ANY of them being able to change to T. - */ - - if m.firstSuccessfulMatcher != nil { - // one of the matchers succeeded.. it must be able to change in order to affect the result - return oraclematcher.MatchMayChangeInTheFuture(m.firstSuccessfulMatcher, actual) - } else { - // so all matchers failed.. Any one of them changing would change the result. - for _, matcher := range m.Matchers { - if oraclematcher.MatchMayChangeInTheFuture(matcher, actual) { - return true - } - } - return false // none of were going to change - } -} diff --git a/vendor/github.com/onsi/gomega/matchers/panic_matcher.go b/vendor/github.com/onsi/gomega/matchers/panic_matcher.go deleted file mode 100644 index 640f4db1a..000000000 --- a/vendor/github.com/onsi/gomega/matchers/panic_matcher.go +++ /dev/null @@ -1,46 +0,0 @@ -package matchers - -import ( - "fmt" - "reflect" - - "github.com/onsi/gomega/format" -) - -type PanicMatcher struct { - object interface{} -} - -func (matcher *PanicMatcher) Match(actual interface{}) (success bool, err error) { - if actual == nil { - return false, fmt.Errorf("PanicMatcher expects a non-nil actual.") - } - - actualType := reflect.TypeOf(actual) - if actualType.Kind() != reflect.Func { - return false, fmt.Errorf("PanicMatcher expects a function. Got:\n%s", format.Object(actual, 1)) - } - if !(actualType.NumIn() == 0 && actualType.NumOut() == 0) { - return false, fmt.Errorf("PanicMatcher expects a function with no arguments and no return value. Got:\n%s", format.Object(actual, 1)) - } - - success = false - defer func() { - if e := recover(); e != nil { - matcher.object = e - success = true - } - }() - - reflect.ValueOf(actual).Call([]reflect.Value{}) - - return -} - -func (matcher *PanicMatcher) FailureMessage(actual interface{}) (message string) { - return format.Message(actual, "to panic") -} - -func (matcher *PanicMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, fmt.Sprintf("not to panic, but panicked with\n%s", format.Object(matcher.object, 1))) -} diff --git a/vendor/github.com/onsi/gomega/matchers/receive_matcher.go b/vendor/github.com/onsi/gomega/matchers/receive_matcher.go deleted file mode 100644 index 1936a2ba5..000000000 --- a/vendor/github.com/onsi/gomega/matchers/receive_matcher.go +++ /dev/null @@ -1,130 +0,0 @@ -// untested sections: 3 - -package matchers - -import ( - "fmt" - "reflect" - - "github.com/onsi/gomega/format" -) - -type ReceiveMatcher struct { - Arg interface{} - receivedValue reflect.Value - channelClosed bool -} - -func (matcher *ReceiveMatcher) Match(actual interface{}) (success bool, err error) { - if !isChan(actual) { - return false, fmt.Errorf("ReceiveMatcher expects a channel. Got:\n%s", format.Object(actual, 1)) - } - - channelType := reflect.TypeOf(actual) - channelValue := reflect.ValueOf(actual) - - if channelType.ChanDir() == reflect.SendDir { - return false, fmt.Errorf("ReceiveMatcher matcher cannot be passed a send-only channel. Got:\n%s", format.Object(actual, 1)) - } - - var subMatcher omegaMatcher - var hasSubMatcher bool - - if matcher.Arg != nil { - subMatcher, hasSubMatcher = (matcher.Arg).(omegaMatcher) - if !hasSubMatcher { - argType := reflect.TypeOf(matcher.Arg) - if argType.Kind() != reflect.Ptr { - return false, fmt.Errorf("Cannot assign a value from the channel:\n%s\nTo:\n%s\nYou need to pass a pointer!", format.Object(actual, 1), format.Object(matcher.Arg, 1)) - } - } - } - - winnerIndex, value, open := reflect.Select([]reflect.SelectCase{ - {Dir: reflect.SelectRecv, Chan: channelValue}, - {Dir: reflect.SelectDefault}, - }) - - var closed bool - var didReceive bool - if winnerIndex == 0 { - closed = !open - didReceive = open - } - matcher.channelClosed = closed - - if closed { - return false, nil - } - - if hasSubMatcher { - if didReceive { - matcher.receivedValue = value - return subMatcher.Match(matcher.receivedValue.Interface()) - } - return false, nil - } - - if didReceive { - if matcher.Arg != nil { - outValue := reflect.ValueOf(matcher.Arg) - - if value.Type().AssignableTo(outValue.Elem().Type()) { - outValue.Elem().Set(value) - return true, nil - } - if value.Type().Kind() == reflect.Interface && value.Elem().Type().AssignableTo(outValue.Elem().Type()) { - outValue.Elem().Set(value.Elem()) - return true, nil - } else { - return false, fmt.Errorf("Cannot assign a value from the channel:\n%s\nType:\n%s\nTo:\n%s", format.Object(actual, 1), format.Object(value.Interface(), 1), format.Object(matcher.Arg, 1)) - } - - } - - return true, nil - } - return false, nil -} - -func (matcher *ReceiveMatcher) FailureMessage(actual interface{}) (message string) { - subMatcher, hasSubMatcher := (matcher.Arg).(omegaMatcher) - - closedAddendum := "" - if matcher.channelClosed { - closedAddendum = " The channel is closed." - } - - if hasSubMatcher { - if matcher.receivedValue.IsValid() { - return subMatcher.FailureMessage(matcher.receivedValue.Interface()) - } - return "When passed a matcher, ReceiveMatcher's channel *must* receive something." - } - return format.Message(actual, "to receive something."+closedAddendum) -} - -func (matcher *ReceiveMatcher) NegatedFailureMessage(actual interface{}) (message string) { - subMatcher, hasSubMatcher := (matcher.Arg).(omegaMatcher) - - closedAddendum := "" - if matcher.channelClosed { - closedAddendum = " The channel is closed." - } - - if hasSubMatcher { - if matcher.receivedValue.IsValid() { - return subMatcher.NegatedFailureMessage(matcher.receivedValue.Interface()) - } - return "When passed a matcher, ReceiveMatcher's channel *must* receive something." - } - return format.Message(actual, "not to receive anything."+closedAddendum) -} - -func (matcher *ReceiveMatcher) MatchMayChangeInTheFuture(actual interface{}) bool { - if !isChan(actual) { - return false - } - - return !matcher.channelClosed -} diff --git a/vendor/github.com/onsi/gomega/matchers/semi_structured_data_support.go b/vendor/github.com/onsi/gomega/matchers/semi_structured_data_support.go deleted file mode 100644 index 1369c1e87..000000000 --- a/vendor/github.com/onsi/gomega/matchers/semi_structured_data_support.go +++ /dev/null @@ -1,94 +0,0 @@ -// untested sections: 5 - -package matchers - -import ( - "fmt" - "reflect" - "strings" -) - -func formattedMessage(comparisonMessage string, failurePath []interface{}) string { - var diffMessage string - if len(failurePath) == 0 { - diffMessage = "" - } else { - diffMessage = fmt.Sprintf("\n\nfirst mismatched key: %s", formattedFailurePath(failurePath)) - } - return fmt.Sprintf("%s%s", comparisonMessage, diffMessage) -} - -func formattedFailurePath(failurePath []interface{}) string { - formattedPaths := []string{} - for i := len(failurePath) - 1; i >= 0; i-- { - switch p := failurePath[i].(type) { - case int: - formattedPaths = append(formattedPaths, fmt.Sprintf(`[%d]`, p)) - default: - if i != len(failurePath)-1 { - formattedPaths = append(formattedPaths, ".") - } - formattedPaths = append(formattedPaths, fmt.Sprintf(`"%s"`, p)) - } - } - return strings.Join(formattedPaths, "") -} - -func deepEqual(a interface{}, b interface{}) (bool, []interface{}) { - var errorPath []interface{} - if reflect.TypeOf(a) != reflect.TypeOf(b) { - return false, errorPath - } - - switch a.(type) { - case []interface{}: - if len(a.([]interface{})) != len(b.([]interface{})) { - return false, errorPath - } - - for i, v := range a.([]interface{}) { - elementEqual, keyPath := deepEqual(v, b.([]interface{})[i]) - if !elementEqual { - return false, append(keyPath, i) - } - } - return true, errorPath - - case map[interface{}]interface{}: - if len(a.(map[interface{}]interface{})) != len(b.(map[interface{}]interface{})) { - return false, errorPath - } - - for k, v1 := range a.(map[interface{}]interface{}) { - v2, ok := b.(map[interface{}]interface{})[k] - if !ok { - return false, errorPath - } - elementEqual, keyPath := deepEqual(v1, v2) - if !elementEqual { - return false, append(keyPath, k) - } - } - return true, errorPath - - case map[string]interface{}: - if len(a.(map[string]interface{})) != len(b.(map[string]interface{})) { - return false, errorPath - } - - for k, v1 := range a.(map[string]interface{}) { - v2, ok := b.(map[string]interface{})[k] - if !ok { - return false, errorPath - } - elementEqual, keyPath := deepEqual(v1, v2) - if !elementEqual { - return false, append(keyPath, k) - } - } - return true, errorPath - - default: - return a == b, errorPath - } -} diff --git a/vendor/github.com/onsi/gomega/matchers/succeed_matcher.go b/vendor/github.com/onsi/gomega/matchers/succeed_matcher.go deleted file mode 100644 index 721ed5529..000000000 --- a/vendor/github.com/onsi/gomega/matchers/succeed_matcher.go +++ /dev/null @@ -1,33 +0,0 @@ -package matchers - -import ( - "fmt" - - "github.com/onsi/gomega/format" -) - -type SucceedMatcher struct { -} - -func (matcher *SucceedMatcher) Match(actual interface{}) (success bool, err error) { - // is purely nil? - if actual == nil { - return true, nil - } - - // must be an 'error' type - if !isError(actual) { - return false, fmt.Errorf("Expected an error-type. Got:\n%s", format.Object(actual, 1)) - } - - // must be nil (or a pointer to a nil) - return isNil(actual), nil -} - -func (matcher *SucceedMatcher) FailureMessage(actual interface{}) (message string) { - return fmt.Sprintf("Expected success, but got an error:\n%s\n%s", format.Object(actual, 1), format.IndentString(actual.(error).Error(), 1)) -} - -func (matcher *SucceedMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return "Expected failure, but got no error." -} diff --git a/vendor/github.com/onsi/gomega/matchers/support/goraph/bipartitegraph/bipartitegraph.go b/vendor/github.com/onsi/gomega/matchers/support/goraph/bipartitegraph/bipartitegraph.go deleted file mode 100644 index 108f28586..000000000 --- a/vendor/github.com/onsi/gomega/matchers/support/goraph/bipartitegraph/bipartitegraph.go +++ /dev/null @@ -1,40 +0,0 @@ -package bipartitegraph - -import "fmt" - -import . "github.com/onsi/gomega/matchers/support/goraph/node" -import . "github.com/onsi/gomega/matchers/support/goraph/edge" - -type BipartiteGraph struct { - Left NodeOrderedSet - Right NodeOrderedSet - Edges EdgeSet -} - -func NewBipartiteGraph(leftValues, rightValues []interface{}, neighbours func(interface{}, interface{}) (bool, error)) (*BipartiteGraph, error) { - left := NodeOrderedSet{} - for i := range leftValues { - left = append(left, Node{Id: i}) - } - - right := NodeOrderedSet{} - for j := range rightValues { - right = append(right, Node{Id: j + len(left)}) - } - - edges := EdgeSet{} - for i, leftValue := range leftValues { - for j, rightValue := range rightValues { - neighbours, err := neighbours(leftValue, rightValue) - if err != nil { - return nil, fmt.Errorf("error determining adjacency for %v and %v: %s", leftValue, rightValue, err.Error()) - } - - if neighbours { - edges = append(edges, Edge{Node1: left[i], Node2: right[j]}) - } - } - } - - return &BipartiteGraph{left, right, edges}, nil -} diff --git a/vendor/github.com/onsi/gomega/matchers/support/goraph/bipartitegraph/bipartitegraphmatching.go b/vendor/github.com/onsi/gomega/matchers/support/goraph/bipartitegraph/bipartitegraphmatching.go deleted file mode 100644 index 8181f43a4..000000000 --- a/vendor/github.com/onsi/gomega/matchers/support/goraph/bipartitegraph/bipartitegraphmatching.go +++ /dev/null @@ -1,159 +0,0 @@ -package bipartitegraph - -import . "github.com/onsi/gomega/matchers/support/goraph/node" -import . "github.com/onsi/gomega/matchers/support/goraph/edge" -import "github.com/onsi/gomega/matchers/support/goraph/util" - -func (bg *BipartiteGraph) LargestMatching() (matching EdgeSet) { - paths := bg.maximalDisjointSLAPCollection(matching) - - for len(paths) > 0 { - for _, path := range paths { - matching = matching.SymmetricDifference(path) - } - paths = bg.maximalDisjointSLAPCollection(matching) - } - - return -} - -func (bg *BipartiteGraph) maximalDisjointSLAPCollection(matching EdgeSet) (result []EdgeSet) { - guideLayers := bg.createSLAPGuideLayers(matching) - if len(guideLayers) == 0 { - return - } - - used := make(map[Node]bool) - - for _, u := range guideLayers[len(guideLayers)-1] { - slap, found := bg.findDisjointSLAP(u, matching, guideLayers, used) - if found { - for _, edge := range slap { - used[edge.Node1] = true - used[edge.Node2] = true - } - result = append(result, slap) - } - } - - return -} - -func (bg *BipartiteGraph) findDisjointSLAP( - start Node, - matching EdgeSet, - guideLayers []NodeOrderedSet, - used map[Node]bool, -) ([]Edge, bool) { - return bg.findDisjointSLAPHelper(start, EdgeSet{}, len(guideLayers)-1, matching, guideLayers, used) -} - -func (bg *BipartiteGraph) findDisjointSLAPHelper( - currentNode Node, - currentSLAP EdgeSet, - currentLevel int, - matching EdgeSet, - guideLayers []NodeOrderedSet, - used map[Node]bool, -) (EdgeSet, bool) { - used[currentNode] = true - - if currentLevel == 0 { - return currentSLAP, true - } - - for _, nextNode := range guideLayers[currentLevel-1] { - if used[nextNode] { - continue - } - - edge, found := bg.Edges.FindByNodes(currentNode, nextNode) - if !found { - continue - } - - if matching.Contains(edge) == util.Odd(currentLevel) { - continue - } - - currentSLAP = append(currentSLAP, edge) - slap, found := bg.findDisjointSLAPHelper(nextNode, currentSLAP, currentLevel-1, matching, guideLayers, used) - if found { - return slap, true - } - currentSLAP = currentSLAP[:len(currentSLAP)-1] - } - - used[currentNode] = false - return nil, false -} - -func (bg *BipartiteGraph) createSLAPGuideLayers(matching EdgeSet) (guideLayers []NodeOrderedSet) { - used := make(map[Node]bool) - currentLayer := NodeOrderedSet{} - - for _, node := range bg.Left { - if matching.Free(node) { - used[node] = true - currentLayer = append(currentLayer, node) - } - } - - if len(currentLayer) == 0 { - return []NodeOrderedSet{} - } - guideLayers = append(guideLayers, currentLayer) - - done := false - - for !done { - lastLayer := currentLayer - currentLayer = NodeOrderedSet{} - - if util.Odd(len(guideLayers)) { - for _, leftNode := range lastLayer { - for _, rightNode := range bg.Right { - if used[rightNode] { - continue - } - - edge, found := bg.Edges.FindByNodes(leftNode, rightNode) - if !found || matching.Contains(edge) { - continue - } - - currentLayer = append(currentLayer, rightNode) - used[rightNode] = true - - if matching.Free(rightNode) { - done = true - } - } - } - } else { - for _, rightNode := range lastLayer { - for _, leftNode := range bg.Left { - if used[leftNode] { - continue - } - - edge, found := bg.Edges.FindByNodes(leftNode, rightNode) - if !found || !matching.Contains(edge) { - continue - } - - currentLayer = append(currentLayer, leftNode) - used[leftNode] = true - } - } - - } - - if len(currentLayer) == 0 { - return []NodeOrderedSet{} - } - guideLayers = append(guideLayers, currentLayer) - } - - return -} diff --git a/vendor/github.com/onsi/gomega/matchers/support/goraph/edge/edge.go b/vendor/github.com/onsi/gomega/matchers/support/goraph/edge/edge.go deleted file mode 100644 index 4fd15cc06..000000000 --- a/vendor/github.com/onsi/gomega/matchers/support/goraph/edge/edge.go +++ /dev/null @@ -1,61 +0,0 @@ -package edge - -import . "github.com/onsi/gomega/matchers/support/goraph/node" - -type Edge struct { - Node1 Node - Node2 Node -} - -type EdgeSet []Edge - -func (ec EdgeSet) Free(node Node) bool { - for _, e := range ec { - if e.Node1 == node || e.Node2 == node { - return false - } - } - - return true -} - -func (ec EdgeSet) Contains(edge Edge) bool { - for _, e := range ec { - if e == edge { - return true - } - } - - return false -} - -func (ec EdgeSet) FindByNodes(node1, node2 Node) (Edge, bool) { - for _, e := range ec { - if (e.Node1 == node1 && e.Node2 == node2) || (e.Node1 == node2 && e.Node2 == node1) { - return e, true - } - } - - return Edge{}, false -} - -func (ec EdgeSet) SymmetricDifference(ec2 EdgeSet) EdgeSet { - edgesToInclude := make(map[Edge]bool) - - for _, e := range ec { - edgesToInclude[e] = true - } - - for _, e := range ec2 { - edgesToInclude[e] = !edgesToInclude[e] - } - - result := EdgeSet{} - for e, include := range edgesToInclude { - if include { - result = append(result, e) - } - } - - return result -} diff --git a/vendor/github.com/onsi/gomega/matchers/support/goraph/node/node.go b/vendor/github.com/onsi/gomega/matchers/support/goraph/node/node.go deleted file mode 100644 index 800c2ea8c..000000000 --- a/vendor/github.com/onsi/gomega/matchers/support/goraph/node/node.go +++ /dev/null @@ -1,7 +0,0 @@ -package node - -type Node struct { - Id int -} - -type NodeOrderedSet []Node diff --git a/vendor/github.com/onsi/gomega/matchers/support/goraph/util/util.go b/vendor/github.com/onsi/gomega/matchers/support/goraph/util/util.go deleted file mode 100644 index d76a1ee00..000000000 --- a/vendor/github.com/onsi/gomega/matchers/support/goraph/util/util.go +++ /dev/null @@ -1,7 +0,0 @@ -package util - -import "math" - -func Odd(n int) bool { - return math.Mod(float64(n), 2.0) == 1.0 -} diff --git a/vendor/github.com/onsi/gomega/matchers/type_support.go b/vendor/github.com/onsi/gomega/matchers/type_support.go deleted file mode 100644 index dced2419e..000000000 --- a/vendor/github.com/onsi/gomega/matchers/type_support.go +++ /dev/null @@ -1,182 +0,0 @@ -/* -Gomega matchers - -This package implements the Gomega matchers and does not typically need to be imported. -See the docs for Gomega for documentation on the matchers - -http://onsi.github.io/gomega/ -*/ - -// untested sections: 11 - -package matchers - -import ( - "encoding/json" - "fmt" - "reflect" -) - -type omegaMatcher interface { - Match(actual interface{}) (success bool, err error) - FailureMessage(actual interface{}) (message string) - NegatedFailureMessage(actual interface{}) (message string) -} - -func isBool(a interface{}) bool { - return reflect.TypeOf(a).Kind() == reflect.Bool -} - -func isNumber(a interface{}) bool { - if a == nil { - return false - } - kind := reflect.TypeOf(a).Kind() - return reflect.Int <= kind && kind <= reflect.Float64 -} - -func isInteger(a interface{}) bool { - kind := reflect.TypeOf(a).Kind() - return reflect.Int <= kind && kind <= reflect.Int64 -} - -func isUnsignedInteger(a interface{}) bool { - kind := reflect.TypeOf(a).Kind() - return reflect.Uint <= kind && kind <= reflect.Uint64 -} - -func isFloat(a interface{}) bool { - kind := reflect.TypeOf(a).Kind() - return reflect.Float32 <= kind && kind <= reflect.Float64 -} - -func toInteger(a interface{}) int64 { - if isInteger(a) { - return reflect.ValueOf(a).Int() - } else if isUnsignedInteger(a) { - return int64(reflect.ValueOf(a).Uint()) - } else if isFloat(a) { - return int64(reflect.ValueOf(a).Float()) - } - panic(fmt.Sprintf("Expected a number! Got <%T> %#v", a, a)) -} - -func toUnsignedInteger(a interface{}) uint64 { - if isInteger(a) { - return uint64(reflect.ValueOf(a).Int()) - } else if isUnsignedInteger(a) { - return reflect.ValueOf(a).Uint() - } else if isFloat(a) { - return uint64(reflect.ValueOf(a).Float()) - } - panic(fmt.Sprintf("Expected a number! Got <%T> %#v", a, a)) -} - -func toFloat(a interface{}) float64 { - if isInteger(a) { - return float64(reflect.ValueOf(a).Int()) - } else if isUnsignedInteger(a) { - return float64(reflect.ValueOf(a).Uint()) - } else if isFloat(a) { - return reflect.ValueOf(a).Float() - } - panic(fmt.Sprintf("Expected a number! Got <%T> %#v", a, a)) -} - -func isError(a interface{}) bool { - _, ok := a.(error) - return ok -} - -func isChan(a interface{}) bool { - if isNil(a) { - return false - } - return reflect.TypeOf(a).Kind() == reflect.Chan -} - -func isMap(a interface{}) bool { - if a == nil { - return false - } - return reflect.TypeOf(a).Kind() == reflect.Map -} - -func isArrayOrSlice(a interface{}) bool { - if a == nil { - return false - } - switch reflect.TypeOf(a).Kind() { - case reflect.Array, reflect.Slice: - return true - default: - return false - } -} - -func isString(a interface{}) bool { - if a == nil { - return false - } - return reflect.TypeOf(a).Kind() == reflect.String -} - -func toString(a interface{}) (string, bool) { - aString, isString := a.(string) - if isString { - return aString, true - } - - aBytes, isBytes := a.([]byte) - if isBytes { - return string(aBytes), true - } - - aStringer, isStringer := a.(fmt.Stringer) - if isStringer { - return aStringer.String(), true - } - - aJSONRawMessage, isJSONRawMessage := a.(json.RawMessage) - if isJSONRawMessage { - return string(aJSONRawMessage), true - } - - return "", false -} - -func lengthOf(a interface{}) (int, bool) { - if a == nil { - return 0, false - } - switch reflect.TypeOf(a).Kind() { - case reflect.Map, reflect.Array, reflect.String, reflect.Chan, reflect.Slice: - return reflect.ValueOf(a).Len(), true - default: - return 0, false - } -} -func capOf(a interface{}) (int, bool) { - if a == nil { - return 0, false - } - switch reflect.TypeOf(a).Kind() { - case reflect.Array, reflect.Chan, reflect.Slice: - return reflect.ValueOf(a).Cap(), true - default: - return 0, false - } -} - -func isNil(a interface{}) bool { - if a == nil { - return true - } - - switch reflect.TypeOf(a).Kind() { - case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: - return reflect.ValueOf(a).IsNil() - } - - return false -} diff --git a/vendor/github.com/onsi/gomega/matchers/with_transform.go b/vendor/github.com/onsi/gomega/matchers/with_transform.go deleted file mode 100644 index 8e58d8a0f..000000000 --- a/vendor/github.com/onsi/gomega/matchers/with_transform.go +++ /dev/null @@ -1,72 +0,0 @@ -package matchers - -import ( - "fmt" - "reflect" - - "github.com/onsi/gomega/internal/oraclematcher" - "github.com/onsi/gomega/types" -) - -type WithTransformMatcher struct { - // input - Transform interface{} // must be a function of one parameter that returns one value - Matcher types.GomegaMatcher - - // cached value - transformArgType reflect.Type - - // state - transformedValue interface{} -} - -func NewWithTransformMatcher(transform interface{}, matcher types.GomegaMatcher) *WithTransformMatcher { - if transform == nil { - panic("transform function cannot be nil") - } - txType := reflect.TypeOf(transform) - if txType.NumIn() != 1 { - panic("transform function must have 1 argument") - } - if txType.NumOut() != 1 { - panic("transform function must have 1 return value") - } - - return &WithTransformMatcher{ - Transform: transform, - Matcher: matcher, - transformArgType: reflect.TypeOf(transform).In(0), - } -} - -func (m *WithTransformMatcher) Match(actual interface{}) (bool, error) { - // return error if actual's type is incompatible with Transform function's argument type - actualType := reflect.TypeOf(actual) - if !actualType.AssignableTo(m.transformArgType) { - return false, fmt.Errorf("Transform function expects '%s' but we have '%s'", m.transformArgType, actualType) - } - - // call the Transform function with `actual` - fn := reflect.ValueOf(m.Transform) - result := fn.Call([]reflect.Value{reflect.ValueOf(actual)}) - m.transformedValue = result[0].Interface() // expect exactly one value - - return m.Matcher.Match(m.transformedValue) -} - -func (m *WithTransformMatcher) FailureMessage(_ interface{}) (message string) { - return m.Matcher.FailureMessage(m.transformedValue) -} - -func (m *WithTransformMatcher) NegatedFailureMessage(_ interface{}) (message string) { - return m.Matcher.NegatedFailureMessage(m.transformedValue) -} - -func (m *WithTransformMatcher) MatchMayChangeInTheFuture(_ interface{}) bool { - // TODO: Maybe this should always just return true? (Only an issue for non-deterministic transformers.) - // - // Querying the next matcher is fine if the transformer always will return the same value. - // But if the transformer is non-deterministic and returns a different value each time, then there - // is no point in querying the next matcher, since it can only comment on the last transformed value. - return oraclematcher.MatchMayChangeInTheFuture(m.Matcher, m.transformedValue) -} diff --git a/vendor/github.com/onsi/gomega/types/types.go b/vendor/github.com/onsi/gomega/types/types.go deleted file mode 100644 index ac59a3a5a..000000000 --- a/vendor/github.com/onsi/gomega/types/types.go +++ /dev/null @@ -1,26 +0,0 @@ -package types - -type TWithHelper interface { - Helper() -} - -type GomegaFailHandler func(message string, callerSkip ...int) - -type GomegaFailWrapper struct { - Fail GomegaFailHandler - TWithHelper TWithHelper -} - -//A simple *testing.T interface wrapper -type GomegaTestingT interface { - Fatalf(format string, args ...interface{}) -} - -//All Gomega matchers must implement the GomegaMatcher interface -// -//For details on writing custom matchers, check out: http://onsi.github.io/gomega/#adding-your-own-matchers -type GomegaMatcher interface { - Match(actual interface{}) (success bool, err error) - FailureMessage(actual interface{}) (message string) - NegatedFailureMessage(actual interface{}) (message string) -} diff --git a/vendor/github.com/opencontainers/go-digest/.mailmap b/vendor/github.com/opencontainers/go-digest/.mailmap new file mode 100644 index 000000000..eaf8b2f9e --- /dev/null +++ b/vendor/github.com/opencontainers/go-digest/.mailmap @@ -0,0 +1,4 @@ +Aaron Lehmann +Derek McGowan +Stephen J Day +Haibing Zhou diff --git a/vendor/github.com/opencontainers/go-digest/.pullapprove.yml b/vendor/github.com/opencontainers/go-digest/.pullapprove.yml new file mode 100644 index 000000000..b6165f83c --- /dev/null +++ b/vendor/github.com/opencontainers/go-digest/.pullapprove.yml @@ -0,0 +1,28 @@ +version: 2 + +requirements: + signed_off_by: + required: true + +always_pending: + title_regex: '^WIP' + explanation: 'Work in progress...' + +group_defaults: + required: 2 + approve_by_comment: + enabled: true + approve_regex: '^LGTM' + reject_regex: '^Rejected' + reset_on_push: + enabled: true + author_approval: + ignored: true + conditions: + branches: + - master + +groups: + go-digest: + teams: + - go-digest-maintainers diff --git a/vendor/github.com/opencontainers/go-digest/.travis.yml b/vendor/github.com/opencontainers/go-digest/.travis.yml new file mode 100644 index 000000000..5775f885c --- /dev/null +++ b/vendor/github.com/opencontainers/go-digest/.travis.yml @@ -0,0 +1,5 @@ +language: go +go: + - 1.12.x + - 1.13.x + - master diff --git a/vendor/github.com/opencontainers/go-digest/CONTRIBUTING.md b/vendor/github.com/opencontainers/go-digest/CONTRIBUTING.md new file mode 100644 index 000000000..e4d962ac1 --- /dev/null +++ b/vendor/github.com/opencontainers/go-digest/CONTRIBUTING.md @@ -0,0 +1,72 @@ +# Contributing to Docker open source projects + +Want to hack on this project? Awesome! Here are instructions to get you started. + +This project is a part of the [Docker](https://www.docker.com) project, and follows +the same rules and principles. If you're already familiar with the way +Docker does things, you'll feel right at home. + +Otherwise, go read Docker's +[contributions guidelines](https://github.com/docker/docker/blob/master/CONTRIBUTING.md), +[issue triaging](https://github.com/docker/docker/blob/master/project/ISSUE-TRIAGE.md), +[review process](https://github.com/docker/docker/blob/master/project/REVIEWING.md) and +[branches and tags](https://github.com/docker/docker/blob/master/project/BRANCHES-AND-TAGS.md). + +For an in-depth description of our contribution process, visit the +contributors guide: [Understand how to contribute](https://docs.docker.com/opensource/workflow/make-a-contribution/) + +### Sign your work + +The sign-off is a simple line at the end of the explanation for the patch. Your +signature certifies that you wrote the patch or otherwise have the right to pass +it on as an open-source patch. The rules are pretty simple: if you can certify +the below (from [developercertificate.org](http://developercertificate.org/)): + +``` +Developer Certificate of Origin +Version 1.1 + +Copyright (C) 2004, 2006 The Linux Foundation and its contributors. +1 Letterman Drive +Suite D4700 +San Francisco, CA, 94129 + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + + +Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +(a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +(b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +(c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +(d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. +``` + +Then you just add a line to every git commit message: + + Signed-off-by: Joe Smith + +Use your real name (sorry, no pseudonyms or anonymous contributions.) + +If you set your `user.name` and `user.email` git configs, you can sign your +commit automatically with `git commit -s`. diff --git a/vendor/github.com/opencontainers/go-digest/LICENSE b/vendor/github.com/opencontainers/go-digest/LICENSE new file mode 100644 index 000000000..3ac8ab648 --- /dev/null +++ b/vendor/github.com/opencontainers/go-digest/LICENSE @@ -0,0 +1,192 @@ + + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + Copyright 2019, 2020 OCI Contributors + Copyright 2016 Docker, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/opencontainers/go-digest/LICENSE.docs b/vendor/github.com/opencontainers/go-digest/LICENSE.docs new file mode 100644 index 000000000..e26cd4fc8 --- /dev/null +++ b/vendor/github.com/opencontainers/go-digest/LICENSE.docs @@ -0,0 +1,425 @@ +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More_considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + + including for purposes of Section 3(b); and + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public licenses. +Notwithstanding, Creative Commons may elect to apply one of its public +licenses to material it publishes and in those instances will be +considered the "Licensor." Except for the limited purpose of indicating +that material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the public +licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/vendor/github.com/opencontainers/go-digest/MAINTAINERS b/vendor/github.com/opencontainers/go-digest/MAINTAINERS new file mode 100644 index 000000000..843b1b206 --- /dev/null +++ b/vendor/github.com/opencontainers/go-digest/MAINTAINERS @@ -0,0 +1,5 @@ +Derek McGowan (@dmcgowan) +Stephen Day (@stevvooe) +Vincent Batts (@vbatts) +Akihiro Suda (@AkihiroSuda) +Sebastiaan van Stijn (@thaJeztah) diff --git a/vendor/github.com/opencontainers/go-digest/README.md b/vendor/github.com/opencontainers/go-digest/README.md new file mode 100644 index 000000000..a11287207 --- /dev/null +++ b/vendor/github.com/opencontainers/go-digest/README.md @@ -0,0 +1,96 @@ +# go-digest + +[![GoDoc](https://godoc.org/github.com/opencontainers/go-digest?status.svg)](https://godoc.org/github.com/opencontainers/go-digest) [![Go Report Card](https://goreportcard.com/badge/github.com/opencontainers/go-digest)](https://goreportcard.com/report/github.com/opencontainers/go-digest) [![Build Status](https://travis-ci.org/opencontainers/go-digest.svg?branch=master)](https://travis-ci.org/opencontainers/go-digest) + +Common digest package used across the container ecosystem. + +Please see the [godoc](https://godoc.org/github.com/opencontainers/go-digest) for more information. + +# What is a digest? + +A digest is just a [hash](https://en.wikipedia.org/wiki/Hash_function). + +The most common use case for a digest is to create a content identifier for use in [Content Addressable Storage](https://en.wikipedia.org/wiki/Content-addressable_storage) systems: + +```go +id := digest.FromBytes([]byte("my content")) +``` + +In the example above, the id can be used to uniquely identify the byte slice "my content". +This allows two disparate applications to agree on a verifiable identifier without having to trust one another. + +An identifying digest can be verified, as follows: + +```go +if id != digest.FromBytes([]byte("my content")) { + return errors.New("the content has changed!") +} +``` + +A `Verifier` type can be used to handle cases where an `io.Reader` makes more sense: + +```go +rd := getContent() +verifier := id.Verifier() +io.Copy(verifier, rd) + +if !verifier.Verified() { + return errors.New("the content has changed!") +} +``` + +Using [Merkle DAGs](https://en.wikipedia.org/wiki/Merkle_tree), this can power a rich, safe, content distribution system. + +# Usage + +While the [godoc](https://godoc.org/github.com/opencontainers/go-digest) is considered the best resource, a few important items need to be called out when using this package. + +1. Make sure to import the hash implementations into your application or the package will panic. + You should have something like the following in the main (or other entrypoint) of your application: + + ```go + import ( + _ "crypto/sha256" + _ "crypto/sha512" + ) + ``` + This may seem inconvenient but it allows you replace the hash + implementations with others, such as https://github.com/stevvooe/resumable. + +2. Even though `digest.Digest` may be assemblable as a string, _always_ verify your input with `digest.Parse` or use `Digest.Validate` when accepting untrusted input. + While there are measures to avoid common problems, this will ensure you have valid digests in the rest of your application. + +3. While alternative encodings of hash values (digests) are possible (for example, base64), this package deals exclusively with hex-encoded digests. + +# Stability + +The Go API, at this stage, is considered stable, unless otherwise noted. + +As always, before using a package export, read the [godoc](https://godoc.org/github.com/opencontainers/go-digest). + +# Contributing + +This package is considered fairly complete. +It has been in production in thousands (millions?) of deployments and is fairly battle-hardened. +New additions will be met with skepticism. +If you think there is a missing feature, please file a bug clearly describing the problem and the alternatives you tried before submitting a PR. + +## Code of Conduct + +Participation in the OpenContainers community is governed by [OpenContainer's Code of Conduct][code-of-conduct]. + +## Security + +If you find an issue, please follow the [security][security] protocol to report it. + +# Copyright and license + +Copyright © 2019, 2020 OCI Contributors +Copyright © 2016 Docker, Inc. +All rights reserved, except as follows. +Code is released under the [Apache 2.0 license](LICENSE). +This `README.md` file and the [`CONTRIBUTING.md`](CONTRIBUTING.md) file are licensed under the Creative Commons Attribution 4.0 International License under the terms and conditions set forth in the file [`LICENSE.docs`](LICENSE.docs). +You may obtain a duplicate copy of the same license, titled CC BY-SA 4.0, at http://creativecommons.org/licenses/by-sa/4.0/. + +[security]: https://github.com/opencontainers/org/blob/master/security +[code-of-conduct]: https://github.com/opencontainers/org/blob/master/CODE_OF_CONDUCT.md diff --git a/vendor/github.com/opencontainers/go-digest/algorithm.go b/vendor/github.com/opencontainers/go-digest/algorithm.go new file mode 100644 index 000000000..490951dc3 --- /dev/null +++ b/vendor/github.com/opencontainers/go-digest/algorithm.go @@ -0,0 +1,193 @@ +// Copyright 2019, 2020 OCI Contributors +// Copyright 2017 Docker, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package digest + +import ( + "crypto" + "fmt" + "hash" + "io" + "regexp" +) + +// Algorithm identifies and implementation of a digester by an identifier. +// Note the that this defines both the hash algorithm used and the string +// encoding. +type Algorithm string + +// supported digest types +const ( + SHA256 Algorithm = "sha256" // sha256 with hex encoding (lower case only) + SHA384 Algorithm = "sha384" // sha384 with hex encoding (lower case only) + SHA512 Algorithm = "sha512" // sha512 with hex encoding (lower case only) + + // Canonical is the primary digest algorithm used with the distribution + // project. Other digests may be used but this one is the primary storage + // digest. + Canonical = SHA256 +) + +var ( + // TODO(stevvooe): Follow the pattern of the standard crypto package for + // registration of digests. Effectively, we are a registerable set and + // common symbol access. + + // algorithms maps values to hash.Hash implementations. Other algorithms + // may be available but they cannot be calculated by the digest package. + algorithms = map[Algorithm]crypto.Hash{ + SHA256: crypto.SHA256, + SHA384: crypto.SHA384, + SHA512: crypto.SHA512, + } + + // anchoredEncodedRegexps contains anchored regular expressions for hex-encoded digests. + // Note that /A-F/ disallowed. + anchoredEncodedRegexps = map[Algorithm]*regexp.Regexp{ + SHA256: regexp.MustCompile(`^[a-f0-9]{64}$`), + SHA384: regexp.MustCompile(`^[a-f0-9]{96}$`), + SHA512: regexp.MustCompile(`^[a-f0-9]{128}$`), + } +) + +// Available returns true if the digest type is available for use. If this +// returns false, Digester and Hash will return nil. +func (a Algorithm) Available() bool { + h, ok := algorithms[a] + if !ok { + return false + } + + // check availability of the hash, as well + return h.Available() +} + +func (a Algorithm) String() string { + return string(a) +} + +// Size returns number of bytes returned by the hash. +func (a Algorithm) Size() int { + h, ok := algorithms[a] + if !ok { + return 0 + } + return h.Size() +} + +// Set implemented to allow use of Algorithm as a command line flag. +func (a *Algorithm) Set(value string) error { + if value == "" { + *a = Canonical + } else { + // just do a type conversion, support is queried with Available. + *a = Algorithm(value) + } + + if !a.Available() { + return ErrDigestUnsupported + } + + return nil +} + +// Digester returns a new digester for the specified algorithm. If the algorithm +// does not have a digester implementation, nil will be returned. This can be +// checked by calling Available before calling Digester. +func (a Algorithm) Digester() Digester { + return &digester{ + alg: a, + hash: a.Hash(), + } +} + +// Hash returns a new hash as used by the algorithm. If not available, the +// method will panic. Check Algorithm.Available() before calling. +func (a Algorithm) Hash() hash.Hash { + if !a.Available() { + // Empty algorithm string is invalid + if a == "" { + panic(fmt.Sprintf("empty digest algorithm, validate before calling Algorithm.Hash()")) + } + + // NOTE(stevvooe): A missing hash is usually a programming error that + // must be resolved at compile time. We don't import in the digest + // package to allow users to choose their hash implementation (such as + // when using stevvooe/resumable or a hardware accelerated package). + // + // Applications that may want to resolve the hash at runtime should + // call Algorithm.Available before call Algorithm.Hash(). + panic(fmt.Sprintf("%v not available (make sure it is imported)", a)) + } + + return algorithms[a].New() +} + +// Encode encodes the raw bytes of a digest, typically from a hash.Hash, into +// the encoded portion of the digest. +func (a Algorithm) Encode(d []byte) string { + // TODO(stevvooe): Currently, all algorithms use a hex encoding. When we + // add support for back registration, we can modify this accordingly. + return fmt.Sprintf("%x", d) +} + +// FromReader returns the digest of the reader using the algorithm. +func (a Algorithm) FromReader(rd io.Reader) (Digest, error) { + digester := a.Digester() + + if _, err := io.Copy(digester.Hash(), rd); err != nil { + return "", err + } + + return digester.Digest(), nil +} + +// FromBytes digests the input and returns a Digest. +func (a Algorithm) FromBytes(p []byte) Digest { + digester := a.Digester() + + if _, err := digester.Hash().Write(p); err != nil { + // Writes to a Hash should never fail. None of the existing + // hash implementations in the stdlib or hashes vendored + // here can return errors from Write. Having a panic in this + // condition instead of having FromBytes return an error value + // avoids unnecessary error handling paths in all callers. + panic("write to hash function returned error: " + err.Error()) + } + + return digester.Digest() +} + +// FromString digests the string input and returns a Digest. +func (a Algorithm) FromString(s string) Digest { + return a.FromBytes([]byte(s)) +} + +// Validate validates the encoded portion string +func (a Algorithm) Validate(encoded string) error { + r, ok := anchoredEncodedRegexps[a] + if !ok { + return ErrDigestUnsupported + } + // Digests much always be hex-encoded, ensuring that their hex portion will + // always be size*2 + if a.Size()*2 != len(encoded) { + return ErrDigestInvalidLength + } + if r.MatchString(encoded) { + return nil + } + return ErrDigestInvalidFormat +} diff --git a/vendor/github.com/opencontainers/go-digest/digest.go b/vendor/github.com/opencontainers/go-digest/digest.go new file mode 100644 index 000000000..518b5e715 --- /dev/null +++ b/vendor/github.com/opencontainers/go-digest/digest.go @@ -0,0 +1,157 @@ +// Copyright 2019, 2020 OCI Contributors +// Copyright 2017 Docker, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package digest + +import ( + "fmt" + "hash" + "io" + "regexp" + "strings" +) + +// Digest allows simple protection of hex formatted digest strings, prefixed +// by their algorithm. Strings of type Digest have some guarantee of being in +// the correct format and it provides quick access to the components of a +// digest string. +// +// The following is an example of the contents of Digest types: +// +// sha256:7173b809ca12ec5dee4506cd86be934c4596dd234ee82c0662eac04a8c2c71dc +// +// This allows to abstract the digest behind this type and work only in those +// terms. +type Digest string + +// NewDigest returns a Digest from alg and a hash.Hash object. +func NewDigest(alg Algorithm, h hash.Hash) Digest { + return NewDigestFromBytes(alg, h.Sum(nil)) +} + +// NewDigestFromBytes returns a new digest from the byte contents of p. +// Typically, this can come from hash.Hash.Sum(...) or xxx.SumXXX(...) +// functions. This is also useful for rebuilding digests from binary +// serializations. +func NewDigestFromBytes(alg Algorithm, p []byte) Digest { + return NewDigestFromEncoded(alg, alg.Encode(p)) +} + +// NewDigestFromHex is deprecated. Please use NewDigestFromEncoded. +func NewDigestFromHex(alg, hex string) Digest { + return NewDigestFromEncoded(Algorithm(alg), hex) +} + +// NewDigestFromEncoded returns a Digest from alg and the encoded digest. +func NewDigestFromEncoded(alg Algorithm, encoded string) Digest { + return Digest(fmt.Sprintf("%s:%s", alg, encoded)) +} + +// DigestRegexp matches valid digest types. +var DigestRegexp = regexp.MustCompile(`[a-z0-9]+(?:[.+_-][a-z0-9]+)*:[a-zA-Z0-9=_-]+`) + +// DigestRegexpAnchored matches valid digest types, anchored to the start and end of the match. +var DigestRegexpAnchored = regexp.MustCompile(`^` + DigestRegexp.String() + `$`) + +var ( + // ErrDigestInvalidFormat returned when digest format invalid. + ErrDigestInvalidFormat = fmt.Errorf("invalid checksum digest format") + + // ErrDigestInvalidLength returned when digest has invalid length. + ErrDigestInvalidLength = fmt.Errorf("invalid checksum digest length") + + // ErrDigestUnsupported returned when the digest algorithm is unsupported. + ErrDigestUnsupported = fmt.Errorf("unsupported digest algorithm") +) + +// Parse parses s and returns the validated digest object. An error will +// be returned if the format is invalid. +func Parse(s string) (Digest, error) { + d := Digest(s) + return d, d.Validate() +} + +// FromReader consumes the content of rd until io.EOF, returning canonical digest. +func FromReader(rd io.Reader) (Digest, error) { + return Canonical.FromReader(rd) +} + +// FromBytes digests the input and returns a Digest. +func FromBytes(p []byte) Digest { + return Canonical.FromBytes(p) +} + +// FromString digests the input and returns a Digest. +func FromString(s string) Digest { + return Canonical.FromString(s) +} + +// Validate checks that the contents of d is a valid digest, returning an +// error if not. +func (d Digest) Validate() error { + s := string(d) + i := strings.Index(s, ":") + if i <= 0 || i+1 == len(s) { + return ErrDigestInvalidFormat + } + algorithm, encoded := Algorithm(s[:i]), s[i+1:] + if !algorithm.Available() { + if !DigestRegexpAnchored.MatchString(s) { + return ErrDigestInvalidFormat + } + return ErrDigestUnsupported + } + return algorithm.Validate(encoded) +} + +// Algorithm returns the algorithm portion of the digest. This will panic if +// the underlying digest is not in a valid format. +func (d Digest) Algorithm() Algorithm { + return Algorithm(d[:d.sepIndex()]) +} + +// Verifier returns a writer object that can be used to verify a stream of +// content against the digest. If the digest is invalid, the method will panic. +func (d Digest) Verifier() Verifier { + return hashVerifier{ + hash: d.Algorithm().Hash(), + digest: d, + } +} + +// Encoded returns the encoded portion of the digest. This will panic if the +// underlying digest is not in a valid format. +func (d Digest) Encoded() string { + return string(d[d.sepIndex()+1:]) +} + +// Hex is deprecated. Please use Digest.Encoded. +func (d Digest) Hex() string { + return d.Encoded() +} + +func (d Digest) String() string { + return string(d) +} + +func (d Digest) sepIndex() int { + i := strings.Index(string(d), ":") + + if i < 0 { + panic(fmt.Sprintf("no ':' separator in digest %q", d)) + } + + return i +} diff --git a/vendor/github.com/opencontainers/go-digest/digester.go b/vendor/github.com/opencontainers/go-digest/digester.go new file mode 100644 index 000000000..ede907757 --- /dev/null +++ b/vendor/github.com/opencontainers/go-digest/digester.go @@ -0,0 +1,40 @@ +// Copyright 2019, 2020 OCI Contributors +// Copyright 2017 Docker, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package digest + +import "hash" + +// Digester calculates the digest of written data. Writes should go directly +// to the return value of Hash, while calling Digest will return the current +// value of the digest. +type Digester interface { + Hash() hash.Hash // provides direct access to underlying hash instance. + Digest() Digest +} + +// digester provides a simple digester definition that embeds a hasher. +type digester struct { + alg Algorithm + hash hash.Hash +} + +func (d *digester) Hash() hash.Hash { + return d.hash +} + +func (d *digester) Digest() Digest { + return NewDigest(d.alg, d.hash) +} diff --git a/vendor/github.com/opencontainers/go-digest/doc.go b/vendor/github.com/opencontainers/go-digest/doc.go new file mode 100644 index 000000000..83d3a936c --- /dev/null +++ b/vendor/github.com/opencontainers/go-digest/doc.go @@ -0,0 +1,62 @@ +// Copyright 2019, 2020 OCI Contributors +// Copyright 2017 Docker, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package digest provides a generalized type to opaquely represent message +// digests and their operations within the registry. The Digest type is +// designed to serve as a flexible identifier in a content-addressable system. +// More importantly, it provides tools and wrappers to work with +// hash.Hash-based digests with little effort. +// +// Basics +// +// The format of a digest is simply a string with two parts, dubbed the +// "algorithm" and the "digest", separated by a colon: +// +// : +// +// An example of a sha256 digest representation follows: +// +// sha256:7173b809ca12ec5dee4506cd86be934c4596dd234ee82c0662eac04a8c2c71dc +// +// The "algorithm" portion defines both the hashing algorithm used to calculate +// the digest and the encoding of the resulting digest, which defaults to "hex" +// if not otherwise specified. Currently, all supported algorithms have their +// digests encoded in hex strings. +// +// In the example above, the string "sha256" is the algorithm and the hex bytes +// are the "digest". +// +// Because the Digest type is simply a string, once a valid Digest is +// obtained, comparisons are cheap, quick and simple to express with the +// standard equality operator. +// +// Verification +// +// The main benefit of using the Digest type is simple verification against a +// given digest. The Verifier interface, modeled after the stdlib hash.Hash +// interface, provides a common write sink for digest verification. After +// writing is complete, calling the Verifier.Verified method will indicate +// whether or not the stream of bytes matches the target digest. +// +// Missing Features +// +// In addition to the above, we intend to add the following features to this +// package: +// +// 1. A Digester type that supports write sink digest calculation. +// +// 2. Suspend and resume of ongoing digest calculations to support efficient digest verification in the registry. +// +package digest diff --git a/vendor/github.com/opencontainers/go-digest/go.mod b/vendor/github.com/opencontainers/go-digest/go.mod new file mode 100644 index 000000000..cf5d7b1d2 --- /dev/null +++ b/vendor/github.com/opencontainers/go-digest/go.mod @@ -0,0 +1,3 @@ +module github.com/opencontainers/go-digest + +go 1.13 diff --git a/vendor/github.com/opencontainers/go-digest/verifiers.go b/vendor/github.com/opencontainers/go-digest/verifiers.go new file mode 100644 index 000000000..afef506f4 --- /dev/null +++ b/vendor/github.com/opencontainers/go-digest/verifiers.go @@ -0,0 +1,46 @@ +// Copyright 2019, 2020 OCI Contributors +// Copyright 2017 Docker, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package digest + +import ( + "hash" + "io" +) + +// Verifier presents a general verification interface to be used with message +// digests and other byte stream verifications. Users instantiate a Verifier +// from one of the various methods, write the data under test to it then check +// the result with the Verified method. +type Verifier interface { + io.Writer + + // Verified will return true if the content written to Verifier matches + // the digest. + Verified() bool +} + +type hashVerifier struct { + digest Digest + hash hash.Hash +} + +func (hv hashVerifier) Write(p []byte) (n int, err error) { + return hv.hash.Write(p) +} + +func (hv hashVerifier) Verified() bool { + return hv.digest == NewDigest(hv.digest.Algorithm(), hv.hash) +} diff --git a/vendor/github.com/karlmutch/copy/.gitignore b/vendor/github.com/otiai10/copy/.gitignore similarity index 100% rename from vendor/github.com/karlmutch/copy/.gitignore rename to vendor/github.com/otiai10/copy/.gitignore diff --git a/vendor/github.com/karlmutch/copy/LICENSE b/vendor/github.com/otiai10/copy/LICENSE similarity index 100% rename from vendor/github.com/karlmutch/copy/LICENSE rename to vendor/github.com/otiai10/copy/LICENSE diff --git a/vendor/github.com/karlmutch/copy/README.md b/vendor/github.com/otiai10/copy/README.md similarity index 100% rename from vendor/github.com/karlmutch/copy/README.md rename to vendor/github.com/otiai10/copy/README.md diff --git a/vendor/github.com/karlmutch/copy/copy.go b/vendor/github.com/otiai10/copy/copy.go similarity index 100% rename from vendor/github.com/karlmutch/copy/copy.go rename to vendor/github.com/otiai10/copy/copy.go diff --git a/vendor/github.com/karlmutch/copy/go.mod b/vendor/github.com/otiai10/copy/go.mod similarity index 100% rename from vendor/github.com/karlmutch/copy/go.mod rename to vendor/github.com/otiai10/copy/go.mod diff --git a/vendor/github.com/karlmutch/copy/go.sum b/vendor/github.com/otiai10/copy/go.sum similarity index 100% rename from vendor/github.com/karlmutch/copy/go.sum rename to vendor/github.com/otiai10/copy/go.sum diff --git a/vendor/github.com/karlmutch/copy/options.go b/vendor/github.com/otiai10/copy/options.go similarity index 100% rename from vendor/github.com/karlmutch/copy/options.go rename to vendor/github.com/otiai10/copy/options.go diff --git a/vendor/github.com/pelletier/go-buffruneio/.travis.yml b/vendor/github.com/pelletier/go-buffruneio/.travis.yml deleted file mode 100644 index 9720442cd..000000000 --- a/vendor/github.com/pelletier/go-buffruneio/.travis.yml +++ /dev/null @@ -1,7 +0,0 @@ -language: go -sudo: false -go: - - 1.3.3 - - 1.4.3 - - 1.5.3 - - tip diff --git a/vendor/github.com/pelletier/go-buffruneio/README.md b/vendor/github.com/pelletier/go-buffruneio/README.md deleted file mode 100644 index ff608b3ab..000000000 --- a/vendor/github.com/pelletier/go-buffruneio/README.md +++ /dev/null @@ -1,62 +0,0 @@ -# buffruneio - -[![Tests Status](https://travis-ci.org/pelletier/go-buffruneio.svg?branch=master)](https://travis-ci.org/pelletier/go-buffruneio) -[![GoDoc](https://godoc.org/github.com/pelletier/go-buffruneio?status.svg)](https://godoc.org/github.com/pelletier/go-buffruneio) - -Buffruneio is a wrapper around bufio to provide buffered runes access with -unlimited unreads. - -```go -import "github.com/pelletier/go-buffruneio" -``` - -## Examples - -```go -import ( - "fmt" - "github.com/pelletier/go-buffruneio" - "strings" -) - -reader := buffruneio.NewReader(strings.NewReader("abcd")) -fmt.Println(reader.ReadRune()) // 'a' -fmt.Println(reader.ReadRune()) // 'b' -fmt.Println(reader.ReadRune()) // 'c' -reader.UnreadRune() -reader.UnreadRune() -fmt.Println(reader.ReadRune()) // 'b' -fmt.Println(reader.ReadRune()) // 'c' -``` - -## Documentation - -The documentation and additional examples are available at -[godoc.org](http://godoc.org/github.com/pelletier/go-buffruneio). - -## Contribute - -Feel free to report bugs and patches using GitHub's pull requests system on -[pelletier/go-toml](https://github.com/pelletier/go-buffruneio). Any feedback is -much appreciated! - -## LICENSE - -Copyright (c) 2016 Thomas Pelletier - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/pelletier/go-buffruneio/buffruneio.go b/vendor/github.com/pelletier/go-buffruneio/buffruneio.go deleted file mode 100644 index 4e6d6ea61..000000000 --- a/vendor/github.com/pelletier/go-buffruneio/buffruneio.go +++ /dev/null @@ -1,117 +0,0 @@ -// Package buffruneio is a wrapper around bufio to provide buffered runes access with unlimited unreads. -package buffruneio - -import ( - "bufio" - "container/list" - "errors" - "io" -) - -// Rune to indicate end of file. -const ( - EOF = -(iota + 1) -) - -// ErrNoRuneToUnread is returned by UnreadRune() when the read index is already at the beginning of the buffer. -var ErrNoRuneToUnread = errors.New("no rune to unwind") - -// Reader implements runes buffering for an io.Reader object. -type Reader struct { - buffer *list.List - current *list.Element - input *bufio.Reader -} - -// NewReader returns a new Reader. -func NewReader(rd io.Reader) *Reader { - return &Reader{ - buffer: list.New(), - input: bufio.NewReader(rd), - } -} - -type runeWithSize struct { - r rune - size int -} - -func (rd *Reader) feedBuffer() error { - r, size, err := rd.input.ReadRune() - - if err != nil { - if err != io.EOF { - return err - } - r = EOF - } - - newRuneWithSize := runeWithSize{r, size} - - rd.buffer.PushBack(newRuneWithSize) - if rd.current == nil { - rd.current = rd.buffer.Back() - } - return nil -} - -// ReadRune reads the next rune from buffer, or from the underlying reader if needed. -func (rd *Reader) ReadRune() (rune, int, error) { - if rd.current == rd.buffer.Back() || rd.current == nil { - err := rd.feedBuffer() - if err != nil { - return EOF, 0, err - } - } - - runeWithSize := rd.current.Value.(runeWithSize) - rd.current = rd.current.Next() - return runeWithSize.r, runeWithSize.size, nil -} - -// UnreadRune pushes back the previously read rune in the buffer, extending it if needed. -func (rd *Reader) UnreadRune() error { - if rd.current == rd.buffer.Front() { - return ErrNoRuneToUnread - } - if rd.current == nil { - rd.current = rd.buffer.Back() - } else { - rd.current = rd.current.Prev() - } - return nil -} - -// Forget removes runes stored before the current stream position index. -func (rd *Reader) Forget() { - if rd.current == nil { - rd.current = rd.buffer.Back() - } - for ; rd.current != rd.buffer.Front(); rd.buffer.Remove(rd.current.Prev()) { - } -} - -// PeekRune returns at most the next n runes, reading from the uderlying source if -// needed. Does not move the current index. It includes EOF if reached. -func (rd *Reader) PeekRunes(n int) []rune { - res := make([]rune, 0, n) - cursor := rd.current - for i := 0; i < n; i++ { - if cursor == nil { - err := rd.feedBuffer() - if err != nil { - return res - } - cursor = rd.buffer.Back() - } - if cursor != nil { - r := cursor.Value.(runeWithSize).r - res = append(res, r) - if r == EOF { - return res - } - cursor = cursor.Next() - } - } - return res -} diff --git a/vendor/github.com/pelletier/go-toml/Makefile b/vendor/github.com/pelletier/go-toml/Makefile new file mode 100644 index 000000000..9e4503aea --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/Makefile @@ -0,0 +1,29 @@ +export CGO_ENABLED=0 +go := go +go.goos ?= $(shell echo `go version`|cut -f4 -d ' '|cut -d '/' -f1) +go.goarch ?= $(shell echo `go version`|cut -f4 -d ' '|cut -d '/' -f2) + +out.tools := tomll tomljson jsontoml +out.dist := $(out.tools:=_$(go.goos)_$(go.goarch).tar.xz) +sources := $(wildcard **/*.go) + + +.PHONY: +tools: $(out.tools) + +$(out.tools): $(sources) + GOOS=$(go.goos) GOARCH=$(go.goarch) $(go) build ./cmd/$@ + +.PHONY: +dist: $(out.dist) + +$(out.dist):%_$(go.goos)_$(go.goarch).tar.xz: % + if [ "$(go.goos)" = "windows" ]; then \ + tar -cJf $@ $^.exe; \ + else \ + tar -cJf $@ $^; \ + fi + +.PHONY: +clean: + rm -rf $(out.tools) $(out.dist) diff --git a/vendor/github.com/pelletier/go-toml/README.md b/vendor/github.com/pelletier/go-toml/README.md index 4ef303af0..6831deb5b 100644 --- a/vendor/github.com/pelletier/go-toml/README.md +++ b/vendor/github.com/pelletier/go-toml/README.md @@ -3,7 +3,7 @@ Go library for the [TOML](https://github.com/mojombo/toml) format. This library supports TOML version -[v0.5.0](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.5.0.md) +[v1.0.0-rc.1](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v1.0.0-rc.1.md) [![GoDoc](https://godoc.org/github.com/pelletier/go-toml?status.svg)](http://godoc.org/github.com/pelletier/go-toml) [![license](https://img.shields.io/github/license/pelletier/go-toml.svg)](https://github.com/pelletier/go-toml/blob/master/LICENSE) @@ -18,7 +18,7 @@ Go-toml provides the following features for using data parsed from TOML document * Load TOML documents from files and string data * Easily navigate TOML structure using Tree -* Mashaling and unmarshaling to and from data structures +* Marshaling and unmarshaling to and from data structures * Line & column position data for all parsed elements * [Query support similar to JSON-Path](query/) * Syntax errors contain line and column numbers @@ -74,7 +74,7 @@ Or use a query: q, _ := query.Compile("$..[user,password]") results := q.Execute(config) for ii, item := range results.Values() { - fmt.Println("Query result %d: %v", ii, item) + fmt.Printf("Query result %d: %v\n", ii, item) } ``` @@ -87,7 +87,7 @@ The documentation and additional examples are available at Go-toml provides two handy command line tools: -* `tomll`: Reads TOML files and lint them. +* `tomll`: Reads TOML files and lints them. ``` go install github.com/pelletier/go-toml/cmd/tomll @@ -99,9 +99,9 @@ Go-toml provides two handy command line tools: go install github.com/pelletier/go-toml/cmd/tomljson tomljson --help ``` - + * `jsontoml`: Reads a JSON file and outputs a TOML representation. - + ``` go install github.com/pelletier/go-toml/cmd/jsontoml jsontoml --help diff --git a/vendor/github.com/pelletier/go-toml/azure-pipelines.yml b/vendor/github.com/pelletier/go-toml/azure-pipelines.yml index d8d7944b7..ff5376b09 100644 --- a/vendor/github.com/pelletier/go-toml/azure-pipelines.yml +++ b/vendor/github.com/pelletier/go-toml/azure-pipelines.yml @@ -13,9 +13,9 @@ stages: vmImage: ubuntu-latest steps: - task: GoTool@0 - displayName: "Install Go 1.13" + displayName: "Install Go 1.15" inputs: - version: "1.13" + version: "1.15" - script: echo "##vso[task.setvariable variable=PATH]${PATH}:/home/vsts/go/bin/" - script: mkdir -p ${HOME}/go/src/github.com/pelletier/go-toml - script: cp -R . ${HOME}/go/src/github.com/pelletier/go-toml @@ -36,9 +36,9 @@ stages: vmImage: ubuntu-latest steps: - task: GoTool@0 - displayName: "Install Go 1.13" + displayName: "Install Go 1.15" inputs: - version: "1.13" + version: "1.15" - task: Go@0 displayName: "go fmt ./..." inputs: @@ -51,9 +51,9 @@ stages: vmImage: ubuntu-latest steps: - task: GoTool@0 - displayName: "Install Go 1.13" + displayName: "Install Go 1.15" inputs: - version: "1.13" + version: "1.15" - task: Go@0 displayName: "Generate coverage" inputs: @@ -62,16 +62,18 @@ stages: - task: Bash@3 inputs: targetType: 'inline' - script: 'bash <(curl -s https://codecov.io/bash) -t $(CODECOV_TOKEN)' + script: 'bash <(curl -s https://codecov.io/bash) -t ${CODECOV_TOKEN}' + env: + CODECOV_TOKEN: $(CODECOV_TOKEN) - job: benchmark displayName: "benchmark" pool: vmImage: ubuntu-latest steps: - task: GoTool@0 - displayName: "Install Go 1.13" + displayName: "Install Go 1.15" inputs: - version: "1.13" + version: "1.15" - script: echo "##vso[task.setvariable variable=PATH]${PATH}:/home/vsts/go/bin/" - task: Bash@3 inputs: @@ -84,9 +86,9 @@ stages: vmImage: ubuntu-latest steps: - task: GoTool@0 - displayName: "Install Go 1.13" + displayName: "Install Go 1.15" inputs: - version: "1.13" + version: "1.15" - script: echo "##vso[task.setvariable variable=PATH]${PATH}:/home/vsts/go/bin/" - script: mkdir -p ${HOME}/go/src/github.com/pelletier/go-toml - script: cp -R . ${HOME}/go/src/github.com/pelletier/go-toml @@ -100,24 +102,24 @@ stages: displayName: "unit tests" strategy: matrix: - linux 1.13: - goVersion: '1.13' + linux 1.15: + goVersion: '1.15' imageName: 'ubuntu-latest' - mac 1.13: - goVersion: '1.13' - imageName: 'macos-10.13' - windows 1.13: - goVersion: '1.13' - imageName: 'vs2017-win2016' - linux 1.12: - goVersion: '1.12' + mac 1.15: + goVersion: '1.15' + imageName: 'macOS-latest' + windows 1.15: + goVersion: '1.15' + imageName: 'windows-latest' + linux 1.14: + goVersion: '1.14' imageName: 'ubuntu-latest' - mac 1.12: - goVersion: '1.12' - imageName: 'macos-10.13' - windows 1.12: - goVersion: '1.12' - imageName: 'vs2017-win2016' + mac 1.14: + goVersion: '1.14' + imageName: 'macOS-latest' + windows 1.14: + goVersion: '1.14' + imageName: 'windows-latest' pool: vmImage: $(imageName) steps: @@ -130,6 +132,67 @@ stages: inputs: command: 'test' arguments: './...' +- stage: build_binaries + displayName: "Build binaries" + dependsOn: run_checks + jobs: + - job: build_binary + displayName: "Build binary" + strategy: + matrix: + linux_amd64: + GOOS: linux + GOARCH: amd64 + darwin_amd64: + GOOS: darwin + GOARCH: amd64 + windows_amd64: + GOOS: windows + GOARCH: amd64 + pool: + vmImage: ubuntu-latest + steps: + - task: GoTool@0 + displayName: "Install Go" + inputs: + version: 1.15 + - task: Bash@3 + inputs: + targetType: inline + script: "make dist" + env: + go.goos: $(GOOS) + go.goarch: $(GOARCH) + - task: CopyFiles@2 + inputs: + sourceFolder: '$(Build.SourcesDirectory)' + contents: '*.tar.xz' + TargetFolder: '$(Build.ArtifactStagingDirectory)' + - task: PublishBuildArtifacts@1 + inputs: + pathtoPublish: '$(Build.ArtifactStagingDirectory)' + artifactName: binaries +- stage: build_binaries_manifest + displayName: "Build binaries manifest" + dependsOn: build_binaries + jobs: + - job: build_manifest + displayName: "Build binaries manifest" + steps: + - task: DownloadBuildArtifacts@0 + inputs: + buildType: 'current' + downloadType: 'single' + artifactName: 'binaries' + downloadPath: '$(Build.SourcesDirectory)' + - task: Bash@3 + inputs: + targetType: inline + script: "cd binaries && sha256sum --binary *.tar.xz | tee $(Build.ArtifactStagingDirectory)/sha256sums.txt" + - task: PublishBuildArtifacts@1 + inputs: + pathtoPublish: '$(Build.ArtifactStagingDirectory)' + artifactName: manifest - stage: build_docker_image displayName: "Build Docker image" @@ -164,4 +227,4 @@ stages: command: 'buildAndPush' Dockerfile: 'Dockerfile' buildContext: '.' - tags: 'latest' \ No newline at end of file + tags: 'latest' diff --git a/vendor/github.com/pelletier/go-toml/benchmark.json b/vendor/github.com/pelletier/go-toml/benchmark.json deleted file mode 100644 index 86f99c6a8..000000000 --- a/vendor/github.com/pelletier/go-toml/benchmark.json +++ /dev/null @@ -1,164 +0,0 @@ -{ - "array": { - "key1": [ - 1, - 2, - 3 - ], - "key2": [ - "red", - "yellow", - "green" - ], - "key3": [ - [ - 1, - 2 - ], - [ - 3, - 4, - 5 - ] - ], - "key4": [ - [ - 1, - 2 - ], - [ - "a", - "b", - "c" - ] - ], - "key5": [ - 1, - 2, - 3 - ], - "key6": [ - 1, - 2 - ] - }, - "boolean": { - "False": false, - "True": true - }, - "datetime": { - "key1": "1979-05-27T07:32:00Z", - "key2": "1979-05-27T00:32:00-07:00", - "key3": "1979-05-27T00:32:00.999999-07:00" - }, - "float": { - "both": { - "key": 6.626e-34 - }, - "exponent": { - "key1": 5e+22, - "key2": 1000000, - "key3": -0.02 - }, - "fractional": { - "key1": 1, - "key2": 3.1415, - "key3": -0.01 - }, - "underscores": { - "key1": 9224617.445991227, - "key2": 1e+100 - } - }, - "fruit": [{ - "name": "apple", - "physical": { - "color": "red", - "shape": "round" - }, - "variety": [{ - "name": "red delicious" - }, - { - "name": "granny smith" - } - ] - }, - { - "name": "banana", - "variety": [{ - "name": "plantain" - }] - } - ], - "integer": { - "key1": 99, - "key2": 42, - "key3": 0, - "key4": -17, - "underscores": { - "key1": 1000, - "key2": 5349221, - "key3": 12345 - } - }, - "products": [{ - "name": "Hammer", - "sku": 738594937 - }, - {}, - { - "color": "gray", - "name": "Nail", - "sku": 284758393 - } - ], - "string": { - "basic": { - "basic": "I'm a string. \"You can quote me\". Name\tJosé\nLocation\tSF." - }, - "literal": { - "multiline": { - "lines": "The first newline is\ntrimmed in raw strings.\n All other whitespace\n is preserved.\n", - "regex2": "I [dw]on't need \\d{2} apples" - }, - "quoted": "Tom \"Dubs\" Preston-Werner", - "regex": "\u003c\\i\\c*\\s*\u003e", - "winpath": "C:\\Users\\nodejs\\templates", - "winpath2": "\\\\ServerX\\admin$\\system32\\" - }, - "multiline": { - "continued": { - "key1": "The quick brown fox jumps over the lazy dog.", - "key2": "The quick brown fox jumps over the lazy dog.", - "key3": "The quick brown fox jumps over the lazy dog." - }, - "key1": "One\nTwo", - "key2": "One\nTwo", - "key3": "One\nTwo" - } - }, - "table": { - "inline": { - "name": { - "first": "Tom", - "last": "Preston-Werner" - }, - "point": { - "x": 1, - "y": 2 - } - }, - "key": "value", - "subtable": { - "key": "another value" - } - }, - "x": { - "y": { - "z": { - "w": {} - } - } - } -} diff --git a/vendor/github.com/pelletier/go-toml/benchmark.sh b/vendor/github.com/pelletier/go-toml/benchmark.sh old mode 100755 new mode 100644 index 7914fff49..a69d3040f --- a/vendor/github.com/pelletier/go-toml/benchmark.sh +++ b/vendor/github.com/pelletier/go-toml/benchmark.sh @@ -20,11 +20,15 @@ git clone ${reference_git} ${ref_tempdir} >/dev/null 2>/dev/null pushd ${ref_tempdir} >/dev/null git checkout ${reference_ref} >/dev/null 2>/dev/null go test -bench=. -benchmem | tee ${ref_benchmark} +cd benchmark +go test -bench=. -benchmem | tee -a ${ref_benchmark} popd >/dev/null echo "" echo "=== local" go test -bench=. -benchmem | tee ${local_benchmark} +cd benchmark +go test -bench=. -benchmem | tee -a ${local_benchmark} echo "" echo "=== diff" diff --git a/vendor/github.com/pelletier/go-toml/benchmark.toml b/vendor/github.com/pelletier/go-toml/benchmark.toml deleted file mode 100644 index dfd77e096..000000000 --- a/vendor/github.com/pelletier/go-toml/benchmark.toml +++ /dev/null @@ -1,244 +0,0 @@ -################################################################################ -## Comment - -# Speak your mind with the hash symbol. They go from the symbol to the end of -# the line. - - -################################################################################ -## Table - -# Tables (also known as hash tables or dictionaries) are collections of -# key/value pairs. They appear in square brackets on a line by themselves. - -[table] - -key = "value" # Yeah, you can do this. - -# Nested tables are denoted by table names with dots in them. Name your tables -# whatever crap you please, just don't use #, ., [ or ]. - -[table.subtable] - -key = "another value" - -# You don't need to specify all the super-tables if you don't want to. TOML -# knows how to do it for you. - -# [x] you -# [x.y] don't -# [x.y.z] need these -[x.y.z.w] # for this to work - - -################################################################################ -## Inline Table - -# Inline tables provide a more compact syntax for expressing tables. They are -# especially useful for grouped data that can otherwise quickly become verbose. -# Inline tables are enclosed in curly braces `{` and `}`. No newlines are -# allowed between the curly braces unless they are valid within a value. - -[table.inline] - -name = { first = "Tom", last = "Preston-Werner" } -point = { x = 1, y = 2 } - - -################################################################################ -## String - -# There are four ways to express strings: basic, multi-line basic, literal, and -# multi-line literal. All strings must contain only valid UTF-8 characters. - -[string.basic] - -basic = "I'm a string. \"You can quote me\". Name\tJos\u00E9\nLocation\tSF." - -[string.multiline] - -# The following strings are byte-for-byte equivalent: -key1 = "One\nTwo" -key2 = """One\nTwo""" -key3 = """ -One -Two""" - -[string.multiline.continued] - -# The following strings are byte-for-byte equivalent: -key1 = "The quick brown fox jumps over the lazy dog." - -key2 = """ -The quick brown \ - - - fox jumps over \ - the lazy dog.""" - -key3 = """\ - The quick brown \ - fox jumps over \ - the lazy dog.\ - """ - -[string.literal] - -# What you see is what you get. -winpath = 'C:\Users\nodejs\templates' -winpath2 = '\\ServerX\admin$\system32\' -quoted = 'Tom "Dubs" Preston-Werner' -regex = '<\i\c*\s*>' - - -[string.literal.multiline] - -regex2 = '''I [dw]on't need \d{2} apples''' -lines = ''' -The first newline is -trimmed in raw strings. - All other whitespace - is preserved. -''' - - -################################################################################ -## Integer - -# Integers are whole numbers. Positive numbers may be prefixed with a plus sign. -# Negative numbers are prefixed with a minus sign. - -[integer] - -key1 = +99 -key2 = 42 -key3 = 0 -key4 = -17 - -[integer.underscores] - -# For large numbers, you may use underscores to enhance readability. Each -# underscore must be surrounded by at least one digit. -key1 = 1_000 -key2 = 5_349_221 -key3 = 1_2_3_4_5 # valid but inadvisable - - -################################################################################ -## Float - -# A float consists of an integer part (which may be prefixed with a plus or -# minus sign) followed by a fractional part and/or an exponent part. - -[float.fractional] - -key1 = +1.0 -key2 = 3.1415 -key3 = -0.01 - -[float.exponent] - -key1 = 5e+22 -key2 = 1e6 -key3 = -2E-2 - -[float.both] - -key = 6.626e-34 - -[float.underscores] - -key1 = 9_224_617.445_991_228_313 -key2 = 1e1_00 - - -################################################################################ -## Boolean - -# Booleans are just the tokens you're used to. Always lowercase. - -[boolean] - -True = true -False = false - - -################################################################################ -## Datetime - -# Datetimes are RFC 3339 dates. - -[datetime] - -key1 = 1979-05-27T07:32:00Z -key2 = 1979-05-27T00:32:00-07:00 -key3 = 1979-05-27T00:32:00.999999-07:00 - - -################################################################################ -## Array - -# Arrays are square brackets with other primitives inside. Whitespace is -# ignored. Elements are separated by commas. Data types may not be mixed. - -[array] - -key1 = [ 1, 2, 3 ] -key2 = [ "red", "yellow", "green" ] -key3 = [ [ 1, 2 ], [3, 4, 5] ] -#key4 = [ [ 1, 2 ], ["a", "b", "c"] ] # this is ok - -# Arrays can also be multiline. So in addition to ignoring whitespace, arrays -# also ignore newlines between the brackets. Terminating commas are ok before -# the closing bracket. - -key5 = [ - 1, 2, 3 -] -key6 = [ - 1, - 2, # this is ok -] - - -################################################################################ -## Array of Tables - -# These can be expressed by using a table name in double brackets. Each table -# with the same double bracketed name will be an element in the array. The -# tables are inserted in the order encountered. - -[[products]] - -name = "Hammer" -sku = 738594937 - -[[products]] - -[[products]] - -name = "Nail" -sku = 284758393 -color = "gray" - - -# You can create nested arrays of tables as well. - -[[fruit]] - name = "apple" - - [fruit.physical] - color = "red" - shape = "round" - - [[fruit.variety]] - name = "red delicious" - - [[fruit.variety]] - name = "granny smith" - -[[fruit]] - name = "banana" - - [[fruit.variety]] - name = "plantain" diff --git a/vendor/github.com/pelletier/go-toml/benchmark.yml b/vendor/github.com/pelletier/go-toml/benchmark.yml deleted file mode 100644 index 0bd19f08a..000000000 --- a/vendor/github.com/pelletier/go-toml/benchmark.yml +++ /dev/null @@ -1,121 +0,0 @@ ---- -array: - key1: - - 1 - - 2 - - 3 - key2: - - red - - yellow - - green - key3: - - - 1 - - 2 - - - 3 - - 4 - - 5 - key4: - - - 1 - - 2 - - - a - - b - - c - key5: - - 1 - - 2 - - 3 - key6: - - 1 - - 2 -boolean: - 'False': false - 'True': true -datetime: - key1: '1979-05-27T07:32:00Z' - key2: '1979-05-27T00:32:00-07:00' - key3: '1979-05-27T00:32:00.999999-07:00' -float: - both: - key: 6.626e-34 - exponent: - key1: 5.0e+22 - key2: 1000000 - key3: -0.02 - fractional: - key1: 1 - key2: 3.1415 - key3: -0.01 - underscores: - key1: 9224617.445991227 - key2: 1.0e+100 -fruit: -- name: apple - physical: - color: red - shape: round - variety: - - name: red delicious - - name: granny smith -- name: banana - variety: - - name: plantain -integer: - key1: 99 - key2: 42 - key3: 0 - key4: -17 - underscores: - key1: 1000 - key2: 5349221 - key3: 12345 -products: -- name: Hammer - sku: 738594937 -- {} -- color: gray - name: Nail - sku: 284758393 -string: - basic: - basic: "I'm a string. \"You can quote me\". Name\tJosé\nLocation\tSF." - literal: - multiline: - lines: | - The first newline is - trimmed in raw strings. - All other whitespace - is preserved. - regex2: I [dw]on't need \d{2} apples - quoted: Tom "Dubs" Preston-Werner - regex: "<\\i\\c*\\s*>" - winpath: C:\Users\nodejs\templates - winpath2: "\\\\ServerX\\admin$\\system32\\" - multiline: - continued: - key1: The quick brown fox jumps over the lazy dog. - key2: The quick brown fox jumps over the lazy dog. - key3: The quick brown fox jumps over the lazy dog. - key1: |- - One - Two - key2: |- - One - Two - key3: |- - One - Two -table: - inline: - name: - first: Tom - last: Preston-Werner - point: - x: 1 - y: 2 - key: value - subtable: - key: another value -x: - y: - z: - w: {} diff --git a/vendor/github.com/pelletier/go-toml/example-crlf.toml b/vendor/github.com/pelletier/go-toml/example-crlf.toml index 12950a163..780d9c68f 100644 --- a/vendor/github.com/pelletier/go-toml/example-crlf.toml +++ b/vendor/github.com/pelletier/go-toml/example-crlf.toml @@ -27,3 +27,4 @@ enabled = true [clients] data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it +score = 4e-08 # to make sure leading zeroes in exponent parts of floats are supported \ No newline at end of file diff --git a/vendor/github.com/pelletier/go-toml/example.toml b/vendor/github.com/pelletier/go-toml/example.toml index 3d902f282..f45bf88b8 100644 --- a/vendor/github.com/pelletier/go-toml/example.toml +++ b/vendor/github.com/pelletier/go-toml/example.toml @@ -27,3 +27,4 @@ enabled = true [clients] data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it +score = 4e-08 # to make sure leading zeroes in exponent parts of floats are supported \ No newline at end of file diff --git a/vendor/github.com/pelletier/go-toml/fuzz.sh b/vendor/github.com/pelletier/go-toml/fuzz.sh old mode 100755 new mode 100644 diff --git a/vendor/github.com/pelletier/go-toml/fuzzit.sh b/vendor/github.com/pelletier/go-toml/fuzzit.sh old mode 100755 new mode 100644 diff --git a/vendor/github.com/pelletier/go-toml/go.mod b/vendor/github.com/pelletier/go-toml/go.mod index a17e9331f..e924cb90c 100644 --- a/vendor/github.com/pelletier/go-toml/go.mod +++ b/vendor/github.com/pelletier/go-toml/go.mod @@ -2,8 +2,4 @@ module github.com/pelletier/go-toml go 1.12 -require ( - github.com/BurntSushi/toml v0.3.1 - github.com/davecgh/go-spew v1.1.1 - gopkg.in/yaml.v2 v2.2.4 -) +require github.com/davecgh/go-spew v1.1.1 diff --git a/vendor/github.com/pelletier/go-toml/go.sum b/vendor/github.com/pelletier/go-toml/go.sum index 1cd2613dd..6f356470d 100644 --- a/vendor/github.com/pelletier/go-toml/go.sum +++ b/vendor/github.com/pelletier/go-toml/go.sum @@ -9,3 +9,11 @@ gopkg.in/yaml.v2 v2.2.3 h1:fvjTMHxHEw/mxHbtzPi3JCcKXQRAnQTBRo6YCJSVHKI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5 h1:ymVxjfMaHvXD8RqPRmzHHsB3VvucivSkIAvJFDI5O3c= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/pelletier/go-toml/keysparsing.go b/vendor/github.com/pelletier/go-toml/keysparsing.go index e923bc4f9..e091500b2 100644 --- a/vendor/github.com/pelletier/go-toml/keysparsing.go +++ b/vendor/github.com/pelletier/go-toml/keysparsing.go @@ -5,7 +5,6 @@ package toml import ( "errors" "fmt" - "unicode" ) // Convert the bare key group string to an array. @@ -109,5 +108,5 @@ func parseKey(key string) ([]string, error) { } func isValidBareChar(r rune) bool { - return isAlphanumeric(r) || r == '-' || unicode.IsNumber(r) + return isAlphanumeric(r) || r == '-' || isDigit(r) } diff --git a/vendor/github.com/pelletier/go-toml/lexer.go b/vendor/github.com/pelletier/go-toml/lexer.go index 735673bd7..b18861924 100644 --- a/vendor/github.com/pelletier/go-toml/lexer.go +++ b/vendor/github.com/pelletier/go-toml/lexer.go @@ -26,7 +26,7 @@ type tomlLexer struct { currentTokenStart int currentTokenStop int tokens []token - depth int + brackets []rune line int col int endbufferLine int @@ -123,6 +123,8 @@ func (l *tomlLexer) lexVoid() tomlLexStateFn { for { next := l.peek() switch next { + case '}': // after '{' + return l.lexRightCurlyBrace case '[': return l.lexTableKey case '#': @@ -140,10 +142,6 @@ func (l *tomlLexer) lexVoid() tomlLexStateFn { l.skip() } - if l.depth > 0 { - return l.lexRvalue - } - if isKeyStartChar(next) { return l.lexKey } @@ -167,10 +165,8 @@ func (l *tomlLexer) lexRvalue() tomlLexStateFn { case '=': return l.lexEqual case '[': - l.depth++ return l.lexLeftBracket case ']': - l.depth-- return l.lexRightBracket case '{': return l.lexLeftCurlyBrace @@ -188,12 +184,10 @@ func (l *tomlLexer) lexRvalue() tomlLexStateFn { fallthrough case '\n': l.skip() - if l.depth == 0 { - return l.lexVoid + if len(l.brackets) > 0 && l.brackets[len(l.brackets)-1] == '[' { + return l.lexRvalue } - return l.lexRvalue - case '_': - return l.errorf("cannot start number with underscore") + return l.lexVoid } if l.follow("true") { @@ -236,10 +230,6 @@ func (l *tomlLexer) lexRvalue() tomlLexStateFn { return l.lexNumber } - if isAlphanumeric(next) { - return l.lexKey - } - return l.errorf("no value can start with %c", next) } @@ -250,13 +240,18 @@ func (l *tomlLexer) lexRvalue() tomlLexStateFn { func (l *tomlLexer) lexLeftCurlyBrace() tomlLexStateFn { l.next() l.emit(tokenLeftCurlyBrace) + l.brackets = append(l.brackets, '{') return l.lexVoid } func (l *tomlLexer) lexRightCurlyBrace() tomlLexStateFn { l.next() l.emit(tokenRightCurlyBrace) - return l.lexVoid + if len(l.brackets) == 0 || l.brackets[len(l.brackets)-1] != '{' { + return l.errorf("cannot have '}' here") + } + l.brackets = l.brackets[:len(l.brackets)-1] + return l.lexRvalue } func (l *tomlLexer) lexDate() tomlLexStateFn { @@ -302,13 +297,16 @@ func (l *tomlLexer) lexEqual() tomlLexStateFn { func (l *tomlLexer) lexComma() tomlLexStateFn { l.next() l.emit(tokenComma) + if len(l.brackets) > 0 && l.brackets[len(l.brackets)-1] == '{' { + return l.lexVoid + } return l.lexRvalue } // Parse the key and emits its value without escape sequences. // bare keys, basic string keys and literal string keys are supported. func (l *tomlLexer) lexKey() tomlLexStateFn { - growingString := "" + var sb strings.Builder for r := l.peek(); isKeyChar(r) || r == '\n' || r == '\r'; r = l.peek() { if r == '"' { @@ -317,7 +315,9 @@ func (l *tomlLexer) lexKey() tomlLexStateFn { if err != nil { return l.errorf(err.Error()) } - growingString += "\"" + str + "\"" + sb.WriteString("\"") + sb.WriteString(str) + sb.WriteString("\"") l.next() continue } else if r == '\'' { @@ -326,22 +326,45 @@ func (l *tomlLexer) lexKey() tomlLexStateFn { if err != nil { return l.errorf(err.Error()) } - growingString += "'" + str + "'" + sb.WriteString("'") + sb.WriteString(str) + sb.WriteString("'") l.next() continue } else if r == '\n' { return l.errorf("keys cannot contain new lines") } else if isSpace(r) { - break + var str strings.Builder + str.WriteString(" ") + + // skip trailing whitespace + l.next() + for r = l.peek(); isSpace(r); r = l.peek() { + str.WriteRune(r) + l.next() + } + // break loop if not a dot + if r != '.' { + break + } + str.WriteString(".") + // skip trailing whitespace after dot + l.next() + for r = l.peek(); isSpace(r); r = l.peek() { + str.WriteRune(r) + l.next() + } + sb.WriteString(str.String()) + continue } else if r == '.' { // skip } else if !isValidBareChar(r) { return l.errorf("keys cannot contain %c character", r) } - growingString += string(r) + sb.WriteRune(r) l.next() } - l.emitWithValue(tokenKey, growingString) + l.emitWithValue(tokenKey, sb.String()) return l.lexVoid } @@ -361,11 +384,12 @@ func (l *tomlLexer) lexComment(previousState tomlLexStateFn) tomlLexStateFn { func (l *tomlLexer) lexLeftBracket() tomlLexStateFn { l.next() l.emit(tokenLeftBracket) + l.brackets = append(l.brackets, '[') return l.lexRvalue } func (l *tomlLexer) lexLiteralStringAsString(terminator string, discardLeadingNewLine bool) (string, error) { - growingString := "" + var sb strings.Builder if discardLeadingNewLine { if l.follow("\r\n") { @@ -379,14 +403,14 @@ func (l *tomlLexer) lexLiteralStringAsString(terminator string, discardLeadingNe // find end of string for { if l.follow(terminator) { - return growingString, nil + return sb.String(), nil } next := l.peek() if next == eof { break } - growingString += string(l.next()) + sb.WriteRune(l.next()) } return "", errors.New("unclosed string") @@ -420,7 +444,7 @@ func (l *tomlLexer) lexLiteralString() tomlLexStateFn { // Terminator is the substring indicating the end of the token. // The resulting string does not include the terminator. func (l *tomlLexer) lexStringAsString(terminator string, discardLeadingNewLine, acceptNewLines bool) (string, error) { - growingString := "" + var sb strings.Builder if discardLeadingNewLine { if l.follow("\r\n") { @@ -433,7 +457,7 @@ func (l *tomlLexer) lexStringAsString(terminator string, discardLeadingNewLine, for { if l.follow(terminator) { - return growingString, nil + return sb.String(), nil } if l.follow("\\") { @@ -451,72 +475,72 @@ func (l *tomlLexer) lexStringAsString(terminator string, discardLeadingNewLine, l.next() } case '"': - growingString += "\"" + sb.WriteString("\"") l.next() case 'n': - growingString += "\n" + sb.WriteString("\n") l.next() case 'b': - growingString += "\b" + sb.WriteString("\b") l.next() case 'f': - growingString += "\f" + sb.WriteString("\f") l.next() case '/': - growingString += "/" + sb.WriteString("/") l.next() case 't': - growingString += "\t" + sb.WriteString("\t") l.next() case 'r': - growingString += "\r" + sb.WriteString("\r") l.next() case '\\': - growingString += "\\" + sb.WriteString("\\") l.next() case 'u': l.next() - code := "" + var code strings.Builder for i := 0; i < 4; i++ { c := l.peek() if !isHexDigit(c) { return "", errors.New("unfinished unicode escape") } l.next() - code = code + string(c) + code.WriteRune(c) } - intcode, err := strconv.ParseInt(code, 16, 32) + intcode, err := strconv.ParseInt(code.String(), 16, 32) if err != nil { - return "", errors.New("invalid unicode escape: \\u" + code) + return "", errors.New("invalid unicode escape: \\u" + code.String()) } - growingString += string(rune(intcode)) + sb.WriteRune(rune(intcode)) case 'U': l.next() - code := "" + var code strings.Builder for i := 0; i < 8; i++ { c := l.peek() if !isHexDigit(c) { return "", errors.New("unfinished unicode escape") } l.next() - code = code + string(c) + code.WriteRune(c) } - intcode, err := strconv.ParseInt(code, 16, 64) + intcode, err := strconv.ParseInt(code.String(), 16, 64) if err != nil { - return "", errors.New("invalid unicode escape: \\U" + code) + return "", errors.New("invalid unicode escape: \\U" + code.String()) } - growingString += string(rune(intcode)) + sb.WriteRune(rune(intcode)) default: return "", errors.New("invalid escape sequence: \\" + string(l.peek())) } } else { r := l.peek() - if 0x00 <= r && r <= 0x1F && !(acceptNewLines && (r == '\n' || r == '\r')) { + if 0x00 <= r && r <= 0x1F && r != '\t' && !(acceptNewLines && (r == '\n' || r == '\r')) { return "", fmt.Errorf("unescaped control character %U", r) } l.next() - growingString += string(r) + sb.WriteRune(r) } if l.peek() == eof { @@ -543,7 +567,6 @@ func (l *tomlLexer) lexString() tomlLexStateFn { } str, err := l.lexStringAsString(terminator, discardLeadingNewLine, acceptNewLines) - if err != nil { return l.errorf(err.Error()) } @@ -615,6 +638,10 @@ func (l *tomlLexer) lexInsideTableKey() tomlLexStateFn { func (l *tomlLexer) lexRightBracket() tomlLexStateFn { l.next() l.emit(tokenRightBracket) + if len(l.brackets) == 0 || l.brackets[len(l.brackets)-1] != '[' { + return l.errorf("cannot have ']' here") + } + l.brackets = l.brackets[:len(l.brackets)-1] return l.lexRvalue } @@ -748,19 +775,19 @@ func init() { // /!\ also matches the empty string // // Example matches: - //1979-05-27T07:32:00Z - //1979-05-27T00:32:00-07:00 - //1979-05-27T00:32:00.999999-07:00 - //1979-05-27 07:32:00Z - //1979-05-27 00:32:00-07:00 - //1979-05-27 00:32:00.999999-07:00 - //1979-05-27T07:32:00 - //1979-05-27T00:32:00.999999 - //1979-05-27 07:32:00 - //1979-05-27 00:32:00.999999 - //1979-05-27 - //07:32:00 - //00:32:00.999999 + // 1979-05-27T07:32:00Z + // 1979-05-27T00:32:00-07:00 + // 1979-05-27T00:32:00.999999-07:00 + // 1979-05-27 07:32:00Z + // 1979-05-27 00:32:00-07:00 + // 1979-05-27 00:32:00.999999-07:00 + // 1979-05-27T07:32:00 + // 1979-05-27T00:32:00.999999 + // 1979-05-27 07:32:00 + // 1979-05-27 00:32:00.999999 + // 1979-05-27 + // 07:32:00 + // 00:32:00.999999 dateRegexp = regexp.MustCompile(`^(?:\d{1,4}-\d{2}-\d{2})?(?:[T ]?\d{2}:\d{2}:\d{2}(\.\d{1,9})?(Z|[+-]\d{2}:\d{2})?)?`) } diff --git a/vendor/github.com/pelletier/go-toml/marshal.go b/vendor/github.com/pelletier/go-toml/marshal.go index 2a6cfbae4..032e0ffc5 100644 --- a/vendor/github.com/pelletier/go-toml/marshal.go +++ b/vendor/github.com/pelletier/go-toml/marshal.go @@ -2,6 +2,7 @@ package toml import ( "bytes" + "encoding" "errors" "fmt" "io" @@ -22,6 +23,7 @@ const ( type tomlOpts struct { name string + nameFromTag bool comment string commented bool multiline bool @@ -68,9 +70,13 @@ const ( var timeType = reflect.TypeOf(time.Time{}) var marshalerType = reflect.TypeOf(new(Marshaler)).Elem() +var unmarshalerType = reflect.TypeOf(new(Unmarshaler)).Elem() +var textMarshalerType = reflect.TypeOf(new(encoding.TextMarshaler)).Elem() +var textUnmarshalerType = reflect.TypeOf(new(encoding.TextUnmarshaler)).Elem() var localDateType = reflect.TypeOf(LocalDate{}) var localTimeType = reflect.TypeOf(LocalTime{}) var localDateTimeType = reflect.TypeOf(LocalDateTime{}) +var mapStringInterfaceType = reflect.TypeOf(map[string]interface{}{}) // Check if the given marshal type maps to a Tree primitive func isPrimitive(mtype reflect.Type) bool { @@ -88,12 +94,16 @@ func isPrimitive(mtype reflect.Type) bool { case reflect.String: return true case reflect.Struct: - return mtype == timeType || mtype == localDateType || mtype == localDateTimeType || mtype == localTimeType || isCustomMarshaler(mtype) + return isTimeType(mtype) default: return false } } +func isTimeType(mtype reflect.Type) bool { + return mtype == timeType || mtype == localDateType || mtype == localDateTimeType || mtype == localTimeType +} + // Check if the given marshal type maps to a Tree slice or array func isTreeSequence(mtype reflect.Type) bool { switch mtype.Kind() { @@ -106,6 +116,30 @@ func isTreeSequence(mtype reflect.Type) bool { } } +// Check if the given marshal type maps to a slice or array of a custom marshaler type +func isCustomMarshalerSequence(mtype reflect.Type) bool { + switch mtype.Kind() { + case reflect.Ptr: + return isCustomMarshalerSequence(mtype.Elem()) + case reflect.Slice, reflect.Array: + return isCustomMarshaler(mtype.Elem()) || isCustomMarshaler(reflect.New(mtype.Elem()).Type()) + default: + return false + } +} + +// Check if the given marshal type maps to a slice or array of a text marshaler type +func isTextMarshalerSequence(mtype reflect.Type) bool { + switch mtype.Kind() { + case reflect.Ptr: + return isTextMarshalerSequence(mtype.Elem()) + case reflect.Slice, reflect.Array: + return isTextMarshaler(mtype.Elem()) || isTextMarshaler(reflect.New(mtype.Elem()).Type()) + default: + return false + } +} + // Check if the given marshal type maps to a non-Tree slice or array func isOtherSequence(mtype reflect.Type) bool { switch mtype.Kind() { @@ -140,12 +174,42 @@ func callCustomMarshaler(mval reflect.Value) ([]byte, error) { return mval.Interface().(Marshaler).MarshalTOML() } +func isTextMarshaler(mtype reflect.Type) bool { + return mtype.Implements(textMarshalerType) && !isTimeType(mtype) +} + +func callTextMarshaler(mval reflect.Value) ([]byte, error) { + return mval.Interface().(encoding.TextMarshaler).MarshalText() +} + +func isCustomUnmarshaler(mtype reflect.Type) bool { + return mtype.Implements(unmarshalerType) +} + +func callCustomUnmarshaler(mval reflect.Value, tval interface{}) error { + return mval.Interface().(Unmarshaler).UnmarshalTOML(tval) +} + +func isTextUnmarshaler(mtype reflect.Type) bool { + return mtype.Implements(textUnmarshalerType) +} + +func callTextUnmarshaler(mval reflect.Value, text []byte) error { + return mval.Interface().(encoding.TextUnmarshaler).UnmarshalText(text) +} + // Marshaler is the interface implemented by types that // can marshal themselves into valid TOML. type Marshaler interface { MarshalTOML() ([]byte, error) } +// Unmarshaler is the interface implemented by types that +// can unmarshal a TOML description of themselves. +type Unmarshaler interface { + UnmarshalTOML(interface{}) error +} + /* Marshal returns the TOML encoding of v. Behavior is similar to the Go json encoder, except that there is no concept of a Marshaler interface or MarshalTOML @@ -190,20 +254,23 @@ type Encoder struct { w io.Writer encOpts annotation - line int - col int - order marshalOrder + line int + col int + order marshalOrder + promoteAnon bool + indentation string } // NewEncoder returns a new encoder that writes to w. func NewEncoder(w io.Writer) *Encoder { return &Encoder{ - w: w, - encOpts: encOptsDefaults, - annotation: annotationDefault, - line: 0, - col: 1, - order: OrderAlphabetical, + w: w, + encOpts: encOptsDefaults, + annotation: annotationDefault, + line: 0, + col: 1, + order: OrderAlphabetical, + indentation: " ", } } @@ -255,6 +322,12 @@ func (e *Encoder) Order(ord marshalOrder) *Encoder { return e } +// Indentation allows to change indentation when marshalling. +func (e *Encoder) Indentation(indent string) *Encoder { + e.indentation = indent + return e +} + // SetTagName allows changing default tag "toml" func (e *Encoder) SetTagName(v string) *Encoder { e.tag = v @@ -279,8 +352,31 @@ func (e *Encoder) SetTagMultiline(v string) *Encoder { return e } +// PromoteAnonymous allows to change how anonymous struct fields are marshaled. +// Usually, they are marshaled as if the inner exported fields were fields in +// the outer struct. However, if an anonymous struct field is given a name in +// its TOML tag, it is treated like a regular struct field with that name. +// rather than being anonymous. +// +// In case anonymous promotion is enabled, all anonymous structs are promoted +// and treated like regular struct fields. +func (e *Encoder) PromoteAnonymous(promote bool) *Encoder { + e.promoteAnon = promote + return e +} + func (e *Encoder) marshal(v interface{}) ([]byte, error) { + // Check if indentation is valid + for _, char := range e.indentation { + if !isSpace(char) { + return []byte{}, fmt.Errorf("invalid indentation: must only contains space or tab characters") + } + } + mtype := reflect.TypeOf(v) + if mtype == nil { + return []byte{}, errors.New("nil cannot be marshaled to TOML") + } switch mtype.Kind() { case reflect.Struct, reflect.Map: @@ -288,6 +384,9 @@ func (e *Encoder) marshal(v interface{}) ([]byte, error) { if mtype.Elem().Kind() != reflect.Struct { return []byte{}, errors.New("Only pointer to struct can be marshaled to TOML") } + if reflect.ValueOf(v).IsNil() { + return []byte{}, errors.New("nil pointer cannot be marshaled to TOML") + } default: return []byte{}, errors.New("Only a struct or map can be marshaled to TOML") } @@ -296,13 +395,16 @@ func (e *Encoder) marshal(v interface{}) ([]byte, error) { if isCustomMarshaler(mtype) { return callCustomMarshaler(sval) } + if isTextMarshaler(mtype) { + return callTextMarshaler(sval) + } t, err := e.valueToTree(mtype, sval) if err != nil { return []byte{}, err } var buf bytes.Buffer - _, err = t.writeToOrdered(&buf, "", "", 0, e.arraysOneElementPerLine, e.order) + _, err = t.writeToOrdered(&buf, "", "", 0, e.arraysOneElementPerLine, e.order, e.indentation, false) return buf.Bytes(), err } @@ -320,20 +422,29 @@ func (e *Encoder) valueToTree(mtype reflect.Type, mval reflect.Value) (*Tree, er tval := e.nextTree() switch mtype.Kind() { case reflect.Struct: - for i := 0; i < mtype.NumField(); i++ { - mtypef, mvalf := mtype.Field(i), mval.Field(i) - opts := tomlOptions(mtypef, e.annotation) - if opts.include && (!opts.omitempty || !isZero(mvalf)) { - val, err := e.valueToToml(mtypef.Type, mvalf) - if err != nil { - return nil, err + switch mval.Interface().(type) { + case Tree: + reflect.ValueOf(tval).Elem().Set(mval) + default: + for i := 0; i < mtype.NumField(); i++ { + mtypef, mvalf := mtype.Field(i), mval.Field(i) + opts := tomlOptions(mtypef, e.annotation) + if opts.include && ((mtypef.Type.Kind() != reflect.Interface && !opts.omitempty) || !isZero(mvalf)) { + val, err := e.valueToToml(mtypef.Type, mvalf) + if err != nil { + return nil, err + } + if tree, ok := val.(*Tree); ok && mtypef.Anonymous && !opts.nameFromTag && !e.promoteAnon { + e.appendTree(tval, tree) + } else { + val = e.wrapTomlValue(val, tval) + tval.SetPathWithOptions([]string{opts.name}, SetOptions{ + Comment: opts.comment, + Commented: opts.commented, + Multiline: opts.multiline, + }, val) + } } - - tval.SetWithOptions(opts.name, SetOptions{ - Comment: opts.comment, - Commented: opts.commented, - Multiline: opts.multiline, - }, val) } } case reflect.Map: @@ -358,18 +469,22 @@ func (e *Encoder) valueToTree(mtype reflect.Type, mval reflect.Value) (*Tree, er } for _, key := range keys { mvalf := mval.MapIndex(key) + if (mtype.Elem().Kind() == reflect.Ptr || mtype.Elem().Kind() == reflect.Interface) && mvalf.IsNil() { + continue + } val, err := e.valueToToml(mtype.Elem(), mvalf) if err != nil { return nil, err } + val = e.wrapTomlValue(val, tval) if e.quoteMapKeys { - keyStr, err := tomlValueStringRepresentation(key.String(), "", e.arraysOneElementPerLine) + keyStr, err := tomlValueStringRepresentation(key.String(), "", "", e.order, e.arraysOneElementPerLine) if err != nil { return nil, err } tval.SetPath([]string{keyStr}, val) } else { - tval.Set(key.String(), val) + tval.SetPath([]string{key.String()}, val) } } } @@ -404,19 +519,32 @@ func (e *Encoder) valueToOtherSlice(mtype reflect.Type, mval reflect.Value) (int // Convert given marshal value to toml value func (e *Encoder) valueToToml(mtype reflect.Type, mval reflect.Value) (interface{}, error) { - e.line++ if mtype.Kind() == reflect.Ptr { - return e.valueToToml(mtype.Elem(), mval.Elem()) + switch { + case isCustomMarshaler(mtype): + return callCustomMarshaler(mval) + case isTextMarshaler(mtype): + b, err := callTextMarshaler(mval) + return string(b), err + default: + return e.valueToToml(mtype.Elem(), mval.Elem()) + } + } + if mtype.Kind() == reflect.Interface { + return e.valueToToml(mval.Elem().Type(), mval.Elem()) } switch { case isCustomMarshaler(mtype): return callCustomMarshaler(mval) + case isTextMarshaler(mtype): + b, err := callTextMarshaler(mval) + return string(b), err case isTree(mtype): return e.valueToTree(mtype, mval) + case isOtherSequence(mtype), isCustomMarshalerSequence(mtype), isTextMarshalerSequence(mtype): + return e.valueToOtherSlice(mtype, mval) case isTreeSequence(mtype): return e.valueToTreeSlice(mtype, mval) - case isOtherSequence(mtype): - return e.valueToOtherSlice(mtype, mval) default: switch mtype.Kind() { case reflect.Bool: @@ -440,6 +568,38 @@ func (e *Encoder) valueToToml(mtype reflect.Type, mval reflect.Value) (interface } } +func (e *Encoder) appendTree(t, o *Tree) error { + for key, value := range o.values { + if _, ok := t.values[key]; ok { + continue + } + if tomlValue, ok := value.(*tomlValue); ok { + tomlValue.position.Col = t.position.Col + } + t.values[key] = value + } + return nil +} + +// Create a toml value with the current line number as the position line +func (e *Encoder) wrapTomlValue(val interface{}, parent *Tree) interface{} { + _, isTree := val.(*Tree) + _, isTreeS := val.([]*Tree) + if isTree || isTreeS { + return val + } + + ret := &tomlValue{ + value: val, + position: Position{ + e.line, + parent.position.Col, + }, + } + e.line++ + return ret +} + // Unmarshal attempts to unmarshal the Tree into a Go struct pointed by v. // Neither Unmarshaler interfaces nor UnmarshalTOML functions are supported for // sub-structs, and only definite types can be unmarshaled. @@ -492,6 +652,8 @@ type Decoder struct { tval *Tree encOpts tagName string + strict bool + visitor visitorState } // NewDecoder returns a new decoder that reads from r. @@ -522,8 +684,18 @@ func (d *Decoder) SetTagName(v string) *Decoder { return d } +// Strict allows changing to strict decoding. Any fields that are found in the +// input data and do not have a corresponding struct member cause an error. +func (d *Decoder) Strict(strict bool) *Decoder { + d.strict = strict + return d +} + func (d *Decoder) unmarshal(v interface{}) error { mtype := reflect.TypeOf(v) + if mtype == nil { + return errors.New("nil cannot be unmarshaled from TOML") + } if mtype.Kind() != reflect.Ptr { return errors.New("only a pointer to struct or map can be unmarshaled from TOML") } @@ -532,16 +704,29 @@ func (d *Decoder) unmarshal(v interface{}) error { switch elem.Kind() { case reflect.Struct, reflect.Map: + case reflect.Interface: + elem = mapStringInterfaceType default: return errors.New("only a pointer to struct or map can be unmarshaled from TOML") } + if reflect.ValueOf(v).IsNil() { + return errors.New("nil pointer cannot be unmarshaled from TOML") + } + vv := reflect.ValueOf(v).Elem() + if d.strict { + d.visitor = newVisitorState(d.tval) + } + sval, err := d.valueFromTree(elem, d.tval, &vv) if err != nil { return err } + if err := d.visitor.validate(); err != nil { + return err + } reflect.ValueOf(v).Elem().Set(sval) return nil } @@ -552,6 +737,21 @@ func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree, mval1 *reflect.V if mtype.Kind() == reflect.Ptr { return d.unwrapPointer(mtype, tval, mval1) } + + // Check if pointer to value implements the Unmarshaler interface. + if mvalPtr := reflect.New(mtype); isCustomUnmarshaler(mvalPtr.Type()) { + d.visitor.visitAll() + + if tval == nil { + return mvalPtr.Elem(), nil + } + + if err := callCustomUnmarshaler(mvalPtr, tval.ToMap()); err != nil { + return reflect.ValueOf(nil), fmt.Errorf("unmarshal toml: %v", err) + } + return mvalPtr.Elem(), nil + } + var mval reflect.Value switch mtype.Kind() { case reflect.Struct: @@ -561,11 +761,17 @@ func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree, mval1 *reflect.V mval = reflect.New(mtype).Elem() } - for i := 0; i < mtype.NumField(); i++ { - mtypef := mtype.Field(i) - an := annotation{tag: d.tagName} - opts := tomlOptions(mtypef, an) - if opts.include { + switch mval.Interface().(type) { + case Tree: + mval.Set(reflect.ValueOf(tval).Elem()) + default: + for i := 0; i < mtype.NumField(); i++ { + mtypef := mtype.Field(i) + an := annotation{tag: d.tagName} + opts := tomlOptions(mtypef, an) + if !opts.include { + continue + } baseKey := opts.name keysToTry := []string{ baseKey, @@ -575,20 +781,25 @@ func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree, mval1 *reflect.V } found := false - for _, key := range keysToTry { - exists := tval.Has(key) - if !exists { - continue - } - val := tval.Get(key) - fval := mval.Field(i) - mvalf, err := d.valueFromToml(mtypef.Type, val, &fval) - if err != nil { - return mval, formatError(err, tval.GetPosition(key)) + if tval != nil { + for _, key := range keysToTry { + exists := tval.HasPath([]string{key}) + if !exists { + continue + } + + d.visitor.push(key) + val := tval.GetPath([]string{key}) + fval := mval.Field(i) + mvalf, err := d.valueFromToml(mtypef.Type, val, &fval) + if err != nil { + return mval, formatError(err, tval.GetPositionPath([]string{key})) + } + mval.Field(i).Set(mvalf) + found = true + d.visitor.pop() + break } - mval.Field(i).Set(mvalf) - found = true - break } if !found && opts.defaultValue != "" { @@ -596,37 +807,52 @@ func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree, mval1 *reflect.V var val interface{} var err error switch mvalf.Kind() { + case reflect.String: + val = opts.defaultValue case reflect.Bool: val, err = strconv.ParseBool(opts.defaultValue) - if err != nil { - return mval.Field(i), err - } + case reflect.Uint: + val, err = strconv.ParseUint(opts.defaultValue, 10, 0) + case reflect.Uint8: + val, err = strconv.ParseUint(opts.defaultValue, 10, 8) + case reflect.Uint16: + val, err = strconv.ParseUint(opts.defaultValue, 10, 16) + case reflect.Uint32: + val, err = strconv.ParseUint(opts.defaultValue, 10, 32) + case reflect.Uint64: + val, err = strconv.ParseUint(opts.defaultValue, 10, 64) case reflect.Int: - val, err = strconv.Atoi(opts.defaultValue) - if err != nil { - return mval.Field(i), err - } - case reflect.String: - val = opts.defaultValue + val, err = strconv.ParseInt(opts.defaultValue, 10, 0) + case reflect.Int8: + val, err = strconv.ParseInt(opts.defaultValue, 10, 8) + case reflect.Int16: + val, err = strconv.ParseInt(opts.defaultValue, 10, 16) + case reflect.Int32: + val, err = strconv.ParseInt(opts.defaultValue, 10, 32) case reflect.Int64: val, err = strconv.ParseInt(opts.defaultValue, 10, 64) - if err != nil { - return mval.Field(i), err - } + case reflect.Float32: + val, err = strconv.ParseFloat(opts.defaultValue, 32) case reflect.Float64: val, err = strconv.ParseFloat(opts.defaultValue, 64) - if err != nil { - return mval.Field(i), err - } default: - return mval.Field(i), fmt.Errorf("unsuported field type for default option") + return mvalf, fmt.Errorf("unsupported field type for default option") + } + + if err != nil { + return mvalf, err } - mval.Field(i).Set(reflect.ValueOf(val)) + mvalf.Set(reflect.ValueOf(val).Convert(mvalf.Type())) } - // save the old behavior above and try to check anonymous structs - if !found && opts.defaultValue == "" && mtypef.Anonymous && mtypef.Type.Kind() == reflect.Struct { - v, err := d.valueFromTree(mtypef.Type, tval, nil) + // save the old behavior above and try to check structs + if !found && opts.defaultValue == "" && mtypef.Type.Kind() == reflect.Struct { + tmpTval := tval + if !mtypef.Anonymous { + tmpTval = nil + } + fval := mval.Field(i) + v, err := d.valueFromTree(mtypef.Type, tmpTval, &fval) if err != nil { return v, err } @@ -637,13 +863,15 @@ func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree, mval1 *reflect.V case reflect.Map: mval = reflect.MakeMap(mtype) for _, key := range tval.Keys() { + d.visitor.push(key) // TODO: path splits key val := tval.GetPath([]string{key}) mvalf, err := d.valueFromToml(mtype.Elem(), val, nil) if err != nil { - return mval, formatError(err, tval.GetPosition(key)) + return mval, formatError(err, tval.GetPositionPath([]string{key})) } mval.SetMapIndex(reflect.ValueOf(key).Convert(mtype.Key()), mvalf) + d.visitor.pop() } } return mval, nil @@ -651,20 +879,30 @@ func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree, mval1 *reflect.V // Convert toml value to marshal struct/map slice, using marshal type func (d *Decoder) valueFromTreeSlice(mtype reflect.Type, tval []*Tree) (reflect.Value, error) { - mval := reflect.MakeSlice(mtype, len(tval), len(tval)) + mval, err := makeSliceOrArray(mtype, len(tval)) + if err != nil { + return mval, err + } + for i := 0; i < len(tval); i++ { + d.visitor.push(strconv.Itoa(i)) val, err := d.valueFromTree(mtype.Elem(), tval[i], nil) if err != nil { return mval, err } mval.Index(i).Set(val) + d.visitor.pop() } return mval, nil } // Convert toml value to marshal primitive slice, using marshal type func (d *Decoder) valueFromOtherSlice(mtype reflect.Type, tval []interface{}) (reflect.Value, error) { - mval := reflect.MakeSlice(mtype, len(tval), len(tval)) + mval, err := makeSliceOrArray(mtype, len(tval)) + if err != nil { + return mval, err + } + for i := 0; i < len(tval); i++ { val, err := d.valueFromToml(mtype.Elem(), tval[i], nil) if err != nil { @@ -675,6 +913,41 @@ func (d *Decoder) valueFromOtherSlice(mtype reflect.Type, tval []interface{}) (r return mval, nil } +// Convert toml value to marshal primitive slice, using marshal type +func (d *Decoder) valueFromOtherSliceI(mtype reflect.Type, tval interface{}) (reflect.Value, error) { + val := reflect.ValueOf(tval) + length := val.Len() + + mval, err := makeSliceOrArray(mtype, length) + if err != nil { + return mval, err + } + + for i := 0; i < length; i++ { + val, err := d.valueFromToml(mtype.Elem(), val.Index(i).Interface(), nil) + if err != nil { + return mval, err + } + mval.Index(i).Set(val) + } + return mval, nil +} + +// Create a new slice or a new array with specified length +func makeSliceOrArray(mtype reflect.Type, tLength int) (reflect.Value, error) { + var mval reflect.Value + switch mtype.Kind() { + case reflect.Slice: + mval = reflect.MakeSlice(mtype, tLength, tLength) + case reflect.Array: + mval = reflect.New(reflect.ArrayOf(mtype.Len(), mtype.Elem())).Elem() + if tLength > mtype.Len() { + return mval, fmt.Errorf("unmarshal: TOML array length (%v) exceeds destination array length (%v)", tLength, mtype.Len()) + } + } + return mval, nil +} + // Convert toml value to marshal value, using marshal type. When mval1 is non-nil // and the given type is a struct value, merge fields into it. func (d *Decoder) valueFromToml(mtype reflect.Type, tval interface{}, mval1 *reflect.Value) (reflect.Value, error) { @@ -692,18 +965,53 @@ func (d *Decoder) valueFromToml(mtype reflect.Type, tval interface{}, mval1 *ref if isTree(mtype) { return d.valueFromTree(mtype, t, mval11) } + + if mtype.Kind() == reflect.Interface { + if mval1 == nil || mval1.IsNil() { + return d.valueFromTree(reflect.TypeOf(map[string]interface{}{}), t, nil) + } else { + return d.valueFromToml(mval1.Elem().Type(), t, nil) + } + } + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to a tree", tval, tval) case []*Tree: if isTreeSequence(mtype) { return d.valueFromTreeSlice(mtype, t) } + if mtype.Kind() == reflect.Interface { + if mval1 == nil || mval1.IsNil() { + return d.valueFromTreeSlice(reflect.TypeOf([]map[string]interface{}{}), t) + } else { + ival := mval1.Elem() + return d.valueFromToml(mval1.Elem().Type(), t, &ival) + } + } return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to trees", tval, tval) case []interface{}: + d.visitor.visit() if isOtherSequence(mtype) { return d.valueFromOtherSlice(mtype, t) } + if mtype.Kind() == reflect.Interface { + if mval1 == nil || mval1.IsNil() { + return d.valueFromOtherSlice(reflect.TypeOf([]interface{}{}), t) + } else { + ival := mval1.Elem() + return d.valueFromToml(mval1.Elem().Type(), t, &ival) + } + } return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to a slice", tval, tval) default: + d.visitor.visit() + // Check if pointer to value implements the encoding.TextUnmarshaler. + if mvalPtr := reflect.New(mtype); isTextUnmarshaler(mvalPtr.Type()) && !isTimeType(mtype) { + if err := d.unmarshalText(tval, mvalPtr); err != nil { + return reflect.ValueOf(nil), fmt.Errorf("unmarshal text: %v", err) + } + return mvalPtr.Elem(), nil + } + switch mtype.Kind() { case reflect.Bool, reflect.Struct: val := reflect.ValueOf(tval) @@ -754,38 +1062,50 @@ func (d *Decoder) valueFromToml(mtype reflect.Type, tval interface{}, mval1 *ref } return reflect.ValueOf(d), nil } - if !val.Type().ConvertibleTo(mtype) { + if !val.Type().ConvertibleTo(mtype) || val.Kind() == reflect.Float64 { return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) } - if reflect.Indirect(reflect.New(mtype)).OverflowInt(val.Convert(mtype).Int()) { + if reflect.Indirect(reflect.New(mtype)).OverflowInt(val.Convert(reflect.TypeOf(int64(0))).Int()) { return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String()) } return val.Convert(mtype), nil case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: val := reflect.ValueOf(tval) - if !val.Type().ConvertibleTo(mtype) { + if !val.Type().ConvertibleTo(mtype) || val.Kind() == reflect.Float64 { return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) } if val.Convert(reflect.TypeOf(int(1))).Int() < 0 { return reflect.ValueOf(nil), fmt.Errorf("%v(%T) is negative so does not fit in %v", tval, tval, mtype.String()) } - if reflect.Indirect(reflect.New(mtype)).OverflowUint(uint64(val.Convert(mtype).Uint())) { + if reflect.Indirect(reflect.New(mtype)).OverflowUint(val.Convert(reflect.TypeOf(uint64(0))).Uint()) { return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String()) } return val.Convert(mtype), nil case reflect.Float32, reflect.Float64: val := reflect.ValueOf(tval) - if !val.Type().ConvertibleTo(mtype) { + if !val.Type().ConvertibleTo(mtype) || val.Kind() == reflect.Int64 { return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) } - if reflect.Indirect(reflect.New(mtype)).OverflowFloat(val.Convert(mtype).Float()) { + if reflect.Indirect(reflect.New(mtype)).OverflowFloat(val.Convert(reflect.TypeOf(float64(0))).Float()) { return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String()) } return val.Convert(mtype), nil + case reflect.Interface: + if mval1 == nil || mval1.IsNil() { + return reflect.ValueOf(tval), nil + } else { + ival := mval1.Elem() + return d.valueFromToml(mval1.Elem().Type(), t, &ival) + } + case reflect.Slice, reflect.Array: + if isOtherSequence(mtype) && isOtherSequence(reflect.TypeOf(t)) { + return d.valueFromOtherSliceI(mtype, t) + } + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v(%v)", tval, tval, mtype, mtype.Kind()) default: return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v(%v)", tval, tval, mtype, mtype.Kind()) } @@ -795,7 +1115,7 @@ func (d *Decoder) valueFromToml(mtype reflect.Type, tval interface{}, mval1 *ref func (d *Decoder) unwrapPointer(mtype reflect.Type, tval interface{}, mval1 *reflect.Value) (reflect.Value, error) { var melem *reflect.Value - if mval1 != nil && !mval1.IsNil() && mtype.Elem().Kind() == reflect.Struct { + if mval1 != nil && !mval1.IsNil() && (mtype.Elem().Kind() == reflect.Struct || mtype.Elem().Kind() == reflect.Interface) { elem := mval1.Elem() melem = &elem } @@ -809,6 +1129,12 @@ func (d *Decoder) unwrapPointer(mtype reflect.Type, tval interface{}, mval1 *ref return mval, nil } +func (d *Decoder) unmarshalText(tval interface{}, mval reflect.Value) error { + var buf bytes.Buffer + fmt.Fprint(&buf, tval) + return callTextUnmarshaler(mval, buf.Bytes()) +} + func tomlOptions(vf reflect.StructField, an annotation) tomlOpts { tag := vf.Tag.Get(an.tag) parse := strings.Split(tag, ",") @@ -821,6 +1147,7 @@ func tomlOptions(vf reflect.StructField, an annotation) tomlOpts { defaultValue := vf.Tag.Get(tagDefault) result := tomlOpts{ name: vf.Name, + nameFromTag: false, comment: comment, commented: commented, multiline: multiline, @@ -833,6 +1160,7 @@ func tomlOptions(vf reflect.StructField, an annotation) tomlOpts { result.include = false } else { result.name = strings.Trim(parse[0], " ") + result.nameFromTag = true } } if vf.PkgPath != "" { @@ -849,11 +1177,7 @@ func tomlOptions(vf reflect.StructField, an annotation) tomlOpts { func isZero(val reflect.Value) bool { switch val.Type().Kind() { - case reflect.Map: - fallthrough - case reflect.Array: - fallthrough - case reflect.Slice: + case reflect.Slice, reflect.Array, reflect.Map: return val.Len() == 0 default: return reflect.DeepEqual(val.Interface(), reflect.Zero(val.Type()).Interface()) @@ -866,3 +1190,80 @@ func formatError(err error, pos Position) error { } return fmt.Errorf("%s: %s", pos, err) } + +// visitorState keeps track of which keys were unmarshaled. +type visitorState struct { + tree *Tree + path []string + keys map[string]struct{} + active bool +} + +func newVisitorState(tree *Tree) visitorState { + path, result := []string{}, map[string]struct{}{} + insertKeys(path, result, tree) + return visitorState{ + tree: tree, + path: path[:0], + keys: result, + active: true, + } +} + +func (s *visitorState) push(key string) { + if s.active { + s.path = append(s.path, key) + } +} + +func (s *visitorState) pop() { + if s.active { + s.path = s.path[:len(s.path)-1] + } +} + +func (s *visitorState) visit() { + if s.active { + delete(s.keys, strings.Join(s.path, ".")) + } +} + +func (s *visitorState) visitAll() { + if s.active { + for k := range s.keys { + if strings.HasPrefix(k, strings.Join(s.path, ".")) { + delete(s.keys, k) + } + } + } +} + +func (s *visitorState) validate() error { + if !s.active { + return nil + } + undecoded := make([]string, 0, len(s.keys)) + for key := range s.keys { + undecoded = append(undecoded, key) + } + sort.Strings(undecoded) + if len(undecoded) > 0 { + return fmt.Errorf("undecoded keys: %q", undecoded) + } + return nil +} + +func insertKeys(path []string, m map[string]struct{}, tree *Tree) { + for k, v := range tree.values { + switch node := v.(type) { + case []*Tree: + for i, item := range node { + insertKeys(append(path, k, strconv.Itoa(i)), m, item) + } + case *Tree: + insertKeys(append(path, k), m, node) + case *tomlValue: + m[strings.Join(append(path, k), ".")] = struct{}{} + } + } +} diff --git a/vendor/github.com/pelletier/go-toml/parser.go b/vendor/github.com/pelletier/go-toml/parser.go index 1b344fee6..7bf40bbdc 100644 --- a/vendor/github.com/pelletier/go-toml/parser.go +++ b/vendor/github.com/pelletier/go-toml/parser.go @@ -158,6 +158,11 @@ func (p *tomlParser) parseGroup() tomlParserStateFn { if err := p.tree.createSubTree(keys, startToken.Position); err != nil { p.raiseError(key, "%s", err) } + destTree := p.tree.GetPath(keys) + if target, ok := destTree.(*Tree); ok && target != nil && target.inline { + p.raiseError(key, "could not re-define exist inline table or its sub-table : %s", + strings.Join(keys, ".")) + } p.assume(tokenRightBracket) p.currentTable = keys return p.parseStart @@ -201,6 +206,11 @@ func (p *tomlParser) parseAssign() tomlParserStateFn { strings.Join(tableKey, ".")) } + if targetNode.inline { + p.raiseError(key, "could not add key or sub-table to exist inline table or its sub-table : %s", + strings.Join(tableKey, ".")) + } + // assign value to the found table keyVal := parsedKey[len(parsedKey)-1] localKey := []string{keyVal} @@ -411,12 +421,13 @@ Loop: if tokenIsComma(previous) { p.raiseError(previous, "trailing comma at the end of inline table") } + tree.inline = true return tree } func (p *tomlParser) parseArray() interface{} { var array []interface{} - arrayType := reflect.TypeOf(nil) + arrayType := reflect.TypeOf(newTree()) for { follow := p.peek() if follow == nil || follow.typ == tokenEOF { @@ -427,11 +438,8 @@ func (p *tomlParser) parseArray() interface{} { break } val := p.parseRvalue() - if arrayType == nil { - arrayType = reflect.TypeOf(val) - } if reflect.TypeOf(val) != arrayType { - p.raiseError(follow, "mixed types in array") + arrayType = nil } array = append(array, val) follow = p.peek() @@ -445,6 +453,12 @@ func (p *tomlParser) parseArray() interface{} { p.getToken() } } + + // if the array is a mixed-type array or its length is 0, + // don't convert it to a table array + if len(array) <= 0 { + arrayType = nil + } // An array of Trees is actually an array of inline // tables, which is a shorthand for a table array. If the // array was not converted from []interface{} to []*Tree, diff --git a/vendor/github.com/pelletier/go-toml/token.go b/vendor/github.com/pelletier/go-toml/token.go index 36a3fc88f..6af4ec46b 100644 --- a/vendor/github.com/pelletier/go-toml/token.go +++ b/vendor/github.com/pelletier/go-toml/token.go @@ -1,9 +1,6 @@ package toml -import ( - "fmt" - "unicode" -) +import "fmt" // Define tokens type tokenType int @@ -112,7 +109,7 @@ func isSpace(r rune) bool { } func isAlphanumeric(r rune) bool { - return unicode.IsLetter(r) || r == '_' + return 'a' <= r && r <= 'z' || 'A' <= r && r <= 'Z' || r == '_' } func isKeyChar(r rune) bool { @@ -127,7 +124,7 @@ func isKeyStartChar(r rune) bool { } func isDigit(r rune) bool { - return unicode.IsNumber(r) + return '0' <= r && r <= '9' } func isHexDigit(r rune) bool { diff --git a/vendor/github.com/pelletier/go-toml/toml.go b/vendor/github.com/pelletier/go-toml/toml.go index 358a9be5c..cbb89a9af 100644 --- a/vendor/github.com/pelletier/go-toml/toml.go +++ b/vendor/github.com/pelletier/go-toml/toml.go @@ -23,6 +23,7 @@ type Tree struct { values map[string]interface{} // string -> *tomlValue, *Tree, []*Tree comment string commented bool + inline bool position Position } @@ -121,6 +122,89 @@ func (t *Tree) GetPath(keys []string) interface{} { } } +// GetArray returns the value at key in the Tree. +// It returns []string, []int64, etc type if key has homogeneous lists +// Key is a dot-separated path (e.g. a.b.c) without single/double quoted strings. +// Returns nil if the path does not exist in the tree. +// If keys is of length zero, the current tree is returned. +func (t *Tree) GetArray(key string) interface{} { + if key == "" { + return t + } + return t.GetArrayPath(strings.Split(key, ".")) +} + +// GetArrayPath returns the element in the tree indicated by 'keys'. +// If keys is of length zero, the current tree is returned. +func (t *Tree) GetArrayPath(keys []string) interface{} { + if len(keys) == 0 { + return t + } + subtree := t + for _, intermediateKey := range keys[:len(keys)-1] { + value, exists := subtree.values[intermediateKey] + if !exists { + return nil + } + switch node := value.(type) { + case *Tree: + subtree = node + case []*Tree: + // go to most recent element + if len(node) == 0 { + return nil + } + subtree = node[len(node)-1] + default: + return nil // cannot navigate through other node types + } + } + // branch based on final node type + switch node := subtree.values[keys[len(keys)-1]].(type) { + case *tomlValue: + switch n := node.value.(type) { + case []interface{}: + return getArray(n) + default: + return node.value + } + default: + return node + } +} + +// if homogeneous array, then return slice type object over []interface{} +func getArray(n []interface{}) interface{} { + var s []string + var i64 []int64 + var f64 []float64 + var bl []bool + for _, value := range n { + switch v := value.(type) { + case string: + s = append(s, v) + case int64: + i64 = append(i64, v) + case float64: + f64 = append(f64, v) + case bool: + bl = append(bl, v) + default: + return n + } + } + if len(s) == len(n) { + return s + } else if len(i64) == len(n) { + return i64 + } else if len(f64) == len(n) { + return f64 + } else if len(bl) == len(n) { + return bl + } + return n +} + // GetPosition returns the position of the given key. func (t *Tree) GetPosition(key string) Position { if key == "" { @@ -129,6 +213,50 @@ func (t *Tree) GetPosition(key string) Position { return t.GetPositionPath(strings.Split(key, ".")) } +// SetPositionPath sets the position of element in the tree indicated by 'keys'. +// If keys is of length zero, the current tree position is set. +func (t *Tree) SetPositionPath(keys []string, pos Position) { + if len(keys) == 0 { + t.position = pos + return + } + subtree := t + for _, intermediateKey := range keys[:len(keys)-1] { + value, exists := subtree.values[intermediateKey] + if !exists { + return + } + switch node := value.(type) { + case *Tree: + subtree = node + case []*Tree: + // go to most recent element + if len(node) == 0 { + return + } + subtree = node[len(node)-1] + default: + return + } + } + // branch based on final node type + switch node := subtree.values[keys[len(keys)-1]].(type) { + case *tomlValue: + node.position = pos + return + case *Tree: + node.position = pos + return + case []*Tree: + // go to most recent element + if len(node) == 0 { + return + } + node[len(node)-1].position = pos + return + } +} + // GetPositionPath returns the element in the tree indicated by 'keys'. // If keys is of length zero, the current tree is returned. func (t *Tree) GetPositionPath(keys []string) Position { @@ -211,7 +339,8 @@ func (t *Tree) SetPathWithOptions(keys []string, opts SetOptions, value interfac // go to most recent element if len(node) == 0 { // create element if it does not exist - subtree.values[intermediateKey] = append(node, newTreeWithPosition(Position{Line: t.position.Line + i, Col: t.position.Col})) + node = append(node, newTreeWithPosition(Position{Line: t.position.Line + i, Col: t.position.Col})) + subtree.values[intermediateKey] = node } subtree = node[len(node)-1] } @@ -222,11 +351,17 @@ func (t *Tree) SetPathWithOptions(keys []string, opts SetOptions, value interfac switch v := value.(type) { case *Tree: v.comment = opts.Comment + v.commented = opts.Commented toInsert = value case []*Tree: + for i := range v { + v[i].commented = opts.Commented + } toInsert = value case *tomlValue: v.comment = opts.Comment + v.commented = opts.Commented + v.multiline = opts.Multiline toInsert = v default: toInsert = &tomlValue{value: value, @@ -307,6 +442,7 @@ func (t *Tree) createSubTree(keys []string, pos Position) error { if !exists { tree := newTreeWithPosition(Position{Line: t.position.Line + i, Col: t.position.Col}) tree.position = pos + tree.inline = subtree.inline subtree.values[intermediateKey] = tree nextTree = tree } diff --git a/vendor/github.com/pelletier/go-toml/tomltree_create.go b/vendor/github.com/pelletier/go-toml/tomltree_create.go index 79610e9b3..80353500a 100644 --- a/vendor/github.com/pelletier/go-toml/tomltree_create.go +++ b/vendor/github.com/pelletier/go-toml/tomltree_create.go @@ -57,6 +57,19 @@ func simpleValueCoercion(object interface{}) (interface{}, error) { return float64(original), nil case fmt.Stringer: return original.String(), nil + case []interface{}: + value := reflect.ValueOf(original) + length := value.Len() + arrayValue := reflect.MakeSlice(value.Type(), 0, length) + for i := 0; i < length; i++ { + val := value.Index(i).Interface() + simpleValue, err := simpleValueCoercion(val) + if err != nil { + return nil, err + } + arrayValue = reflect.Append(arrayValue, reflect.ValueOf(simpleValue)) + } + return arrayValue.Interface(), nil default: return nil, fmt.Errorf("cannot convert type %T to Tree", object) } diff --git a/vendor/github.com/pelletier/go-toml/tomltree_write.go b/vendor/github.com/pelletier/go-toml/tomltree_write.go index 43c63030d..ae6dac49d 100644 --- a/vendor/github.com/pelletier/go-toml/tomltree_write.go +++ b/vendor/github.com/pelletier/go-toml/tomltree_write.go @@ -28,23 +28,35 @@ type sortNode struct { // Encodes a string to a TOML-compliant multi-line string value // This function is a clone of the existing encodeTomlString function, except that whitespace characters // are preserved. Quotation marks and backslashes are also not escaped. -func encodeMultilineTomlString(value string) string { +func encodeMultilineTomlString(value string, commented string) string { var b bytes.Buffer - - for _, rr := range value { + adjacentQuoteCount := 0 + + b.WriteString(commented) + for i, rr := range value { + if rr != '"' { + adjacentQuoteCount = 0 + } else { + adjacentQuoteCount++ + } switch rr { case '\b': b.WriteString(`\b`) case '\t': b.WriteString("\t") case '\n': - b.WriteString("\n") + b.WriteString("\n" + commented) case '\f': b.WriteString(`\f`) case '\r': b.WriteString("\r") case '"': - b.WriteString(`"`) + if adjacentQuoteCount >= 3 || i == len(value)-1 { + adjacentQuoteCount = 0 + b.WriteString(`\"`) + } else { + b.WriteString(`"`) + } case '\\': b.WriteString(`\`) default: @@ -91,7 +103,30 @@ func encodeTomlString(value string) string { return b.String() } -func tomlValueStringRepresentation(v interface{}, indent string, arraysOneElementPerLine bool) (string, error) { +func tomlTreeStringRepresentation(t *Tree, ord marshalOrder) (string, error) { + var orderedVals []sortNode + switch ord { + case OrderPreserve: + orderedVals = sortByLines(t) + default: + orderedVals = sortAlphabetical(t) + } + + var values []string + for _, node := range orderedVals { + k := node.key + v := t.values[k] + + repr, err := tomlValueStringRepresentation(v, "", "", ord, false) + if err != nil { + return "", err + } + values = append(values, quoteKeyIfNeeded(k)+" = "+repr) + } + return "{ " + strings.Join(values, ", ") + " }", nil +} + +func tomlValueStringRepresentation(v interface{}, commented string, indent string, ord marshalOrder, arraysOneElementPerLine bool) (string, error) { // this interface check is added to dereference the change made in the writeTo function. // That change was made to allow this function to see formatting options. tv, ok := v.(*tomlValue) @@ -123,12 +158,12 @@ func tomlValueStringRepresentation(v interface{}, indent string, arraysOneElemen return strings.ToLower(strconv.FormatFloat(value, 'f', -1, bits)), nil case string: if tv.multiline { - return "\"\"\"\n" + encodeMultilineTomlString(value) + "\"\"\"", nil + return "\"\"\"\n" + encodeMultilineTomlString(value, commented) + "\"\"\"", nil } return "\"" + encodeTomlString(value) + "\"", nil case []byte: b, _ := v.([]byte) - return tomlValueStringRepresentation(string(b), indent, arraysOneElementPerLine) + return string(b), nil case bool: if value { return "true", nil @@ -142,6 +177,8 @@ func tomlValueStringRepresentation(v interface{}, indent string, arraysOneElemen return value.String(), nil case LocalTime: return value.String(), nil + case *Tree: + return tomlTreeStringRepresentation(value, ord) case nil: return "", nil } @@ -152,7 +189,7 @@ func tomlValueStringRepresentation(v interface{}, indent string, arraysOneElemen var values []string for i := 0; i < rv.Len(); i++ { item := rv.Index(i).Interface() - itemRepr, err := tomlValueStringRepresentation(item, indent, arraysOneElementPerLine) + itemRepr, err := tomlValueStringRepresentation(item, commented, indent, ord, arraysOneElementPerLine) if err != nil { return "", err } @@ -166,16 +203,16 @@ func tomlValueStringRepresentation(v interface{}, indent string, arraysOneElemen for _, value := range values { stringBuffer.WriteString(valueIndent) - stringBuffer.WriteString(value) + stringBuffer.WriteString(commented + value) stringBuffer.WriteString(`,`) stringBuffer.WriteString("\n") } - stringBuffer.WriteString(indent + "]") + stringBuffer.WriteString(indent + commented + "]") return stringBuffer.String(), nil } - return "[" + strings.Join(values, ",") + "]", nil + return "[" + strings.Join(values, ", ") + "]", nil } return "", fmt.Errorf("unsupported value type %T: %v", v, v) } @@ -270,10 +307,10 @@ func sortAlphabetical(t *Tree) (vals []sortNode) { } func (t *Tree) writeTo(w io.Writer, indent, keyspace string, bytesCount int64, arraysOneElementPerLine bool) (int64, error) { - return t.writeToOrdered(w, indent, keyspace, bytesCount, arraysOneElementPerLine, OrderAlphabetical) + return t.writeToOrdered(w, indent, keyspace, bytesCount, arraysOneElementPerLine, OrderAlphabetical, " ", false) } -func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount int64, arraysOneElementPerLine bool, ord marshalOrder) (int64, error) { +func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount int64, arraysOneElementPerLine bool, ord marshalOrder, indentString string, parentCommented bool) (int64, error) { var orderedVals []sortNode switch ord { @@ -289,14 +326,10 @@ func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount i k := node.key v := t.values[k] - combinedKey := k + combinedKey := quoteKeyIfNeeded(k) if keyspace != "" { combinedKey = keyspace + "." + combinedKey } - var commented string - if t.commented { - commented = "# " - } switch node := v.(type) { // node has to be of those two types given how keys are sorted above @@ -317,24 +350,33 @@ func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount i return bytesCount, errc } } + + var commented string + if parentCommented || t.commented || tv.commented { + commented = "# " + } writtenBytesCount, err := writeStrings(w, "\n", indent, commented, "[", combinedKey, "]\n") bytesCount += int64(writtenBytesCount) if err != nil { return bytesCount, err } - bytesCount, err = node.writeToOrdered(w, indent+" ", combinedKey, bytesCount, arraysOneElementPerLine, ord) + bytesCount, err = node.writeToOrdered(w, indent+indentString, combinedKey, bytesCount, arraysOneElementPerLine, ord, indentString, parentCommented || t.commented || tv.commented) if err != nil { return bytesCount, err } case []*Tree: for _, subTree := range node { + var commented string + if parentCommented || t.commented || subTree.commented { + commented = "# " + } writtenBytesCount, err := writeStrings(w, "\n", indent, commented, "[[", combinedKey, "]]\n") bytesCount += int64(writtenBytesCount) if err != nil { return bytesCount, err } - bytesCount, err = subTree.writeToOrdered(w, indent+" ", combinedKey, bytesCount, arraysOneElementPerLine, ord) + bytesCount, err = subTree.writeToOrdered(w, indent+indentString, combinedKey, bytesCount, arraysOneElementPerLine, ord, indentString, parentCommented || t.commented || subTree.commented) if err != nil { return bytesCount, err } @@ -347,7 +389,11 @@ func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount i return bytesCount, fmt.Errorf("invalid value type at %s: %T", k, t.values[k]) } - repr, err := tomlValueStringRepresentation(v, indent, arraysOneElementPerLine) + var commented string + if parentCommented || t.commented || v.commented { + commented = "# " + } + repr, err := tomlValueStringRepresentation(v, commented, indent, ord, arraysOneElementPerLine) if err != nil { return bytesCount, err } @@ -365,10 +411,6 @@ func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount i } } - var commented string - if v.commented { - commented = "# " - } quotedKey := quoteKeyIfNeeded(k) writtenBytesCount, err := writeStrings(w, indent, commented, quotedKey, " = ", repr, "\n") bytesCount += int64(writtenBytesCount) diff --git a/vendor/github.com/pierrec/lz4/.gitignore b/vendor/github.com/pierrec/lz4/.gitignore index e48bab32a..5e9873504 100644 --- a/vendor/github.com/pierrec/lz4/.gitignore +++ b/vendor/github.com/pierrec/lz4/.gitignore @@ -30,4 +30,5 @@ Temporary Items # End of https://www.gitignore.io/api/macos -lz4c/lz4c +cmd/*/*exe +.idea \ No newline at end of file diff --git a/vendor/github.com/pierrec/lz4/.travis.yml b/vendor/github.com/pierrec/lz4/.travis.yml index 204afe1d2..fd6c6db71 100644 --- a/vendor/github.com/pierrec/lz4/.travis.yml +++ b/vendor/github.com/pierrec/lz4/.travis.yml @@ -2,12 +2,12 @@ language: go env: - GO111MODULE=off - - GO111MODULE=on go: - 1.9.x - 1.10.x - 1.11.x + - 1.12.x - master matrix: @@ -20,3 +20,5 @@ sudo: false script: - go test -v -cpu=2 - go test -v -cpu=2 -race + - go test -v -cpu=2 -tags noasm + - go test -v -cpu=2 -race -tags noasm diff --git a/vendor/github.com/pierrec/lz4/README.md b/vendor/github.com/pierrec/lz4/README.md index e71ebd59d..4ee388e81 100644 --- a/vendor/github.com/pierrec/lz4/README.md +++ b/vendor/github.com/pierrec/lz4/README.md @@ -1,24 +1,90 @@ -[![godoc](https://godoc.org/github.com/pierrec/lz4?status.png)](https://godoc.org/github.com/pierrec/lz4) +# lz4 : LZ4 compression in pure Go -# lz4 -LZ4 compression and decompression in pure Go. +[![GoDoc](https://godoc.org/github.com/pierrec/lz4?status.svg)](https://godoc.org/github.com/pierrec/lz4) +[![Build Status](https://travis-ci.org/pierrec/lz4.svg?branch=master)](https://travis-ci.org/pierrec/lz4) +[![Go Report Card](https://goreportcard.com/badge/github.com/pierrec/lz4)](https://goreportcard.com/report/github.com/pierrec/lz4) +[![GitHub tag (latest SemVer)](https://img.shields.io/github/tag/pierrec/lz4.svg?style=social)](https://github.com/pierrec/lz4/tags) -## Usage +## Overview + +This package provides a streaming interface to [LZ4 data streams](http://fastcompression.blogspot.fr/2013/04/lz4-streaming-format-final.html) as well as low level compress and uncompress functions for LZ4 data blocks. +The implementation is based on the reference C [one](https://github.com/lz4/lz4). + +## Install + +Assuming you have the go toolchain installed: + +``` +go get github.com/pierrec/lz4 +``` + +There is a command line interface tool to compress and decompress LZ4 files. + +``` +go install github.com/pierrec/lz4/cmd/lz4c +``` + +Usage + +``` +Usage of lz4c: + -version + print the program version + +Subcommands: +Compress the given files or from stdin to stdout. +compress [arguments] [ ...] + -bc + enable block checksum + -l int + compression level (0=fastest) + -sc + disable stream checksum + -size string + block max size [64K,256K,1M,4M] (default "4M") + +Uncompress the given files or from stdin to stdout. +uncompress [arguments] [ ...] -```go -import "github.com/pierrec/lz4/v2" ``` -## Description -Package lz4 implements reading and writing lz4 compressed data (a frame), -as specified in http://fastcompression.blogspot.fr/2013/04/lz4-streaming-format-final.html. -This package is **compatible with the LZ4 frame format** although the block level compression -and decompression functions are exposed and are fully compatible with the lz4 block format -definition, they are low level and should not be used directly. +## Example + +``` +// Compress and uncompress an input string. +s := "hello world" +r := strings.NewReader(s) + +// The pipe will uncompress the data from the writer. +pr, pw := io.Pipe() +zw := lz4.NewWriter(pw) +zr := lz4.NewReader(pr) + +go func() { + // Compress the input string. + _, _ = io.Copy(zw, r) + _ = zw.Close() // Make sure the writer is closed + _ = pw.Close() // Terminate the pipe +}() + +_, _ = io.Copy(os.Stdout, zr) + +// Output: +// hello world +``` + +## Contributing + +Contributions are very welcome for bug fixing, performance improvements...! + +- Open an issue with a proper description +- Send a pull request with appropriate test case(s) + +## Contributors -For a complete description of an lz4 compressed block, see: -http://fastcompression.blogspot.fr/2011/05/lz4-explained.html +Thanks to all [contributors](https://github.com/pierrec/lz4/graphs/contributors) so far! -See https://github.com/Cyan4973/lz4 for the reference C implementation. +Special thanks to [@Zariel](https://github.com/Zariel) for his asm implementation of the decoder. +Special thanks to [@klauspost](https://github.com/klauspost) for his work on optimizing the code. diff --git a/vendor/github.com/pierrec/lz4/block.go b/vendor/github.com/pierrec/lz4/block.go index ef24f17e5..664d9be58 100644 --- a/vendor/github.com/pierrec/lz4/block.go +++ b/vendor/github.com/pierrec/lz4/block.go @@ -2,21 +2,14 @@ package lz4 import ( "encoding/binary" - "errors" + "math/bits" + "sync" ) -var ( - // ErrInvalidSourceShortBuffer is returned by UncompressBlock or CompressBLock when a compressed - // block is corrupted or the destination buffer is not large enough for the uncompressed data. - ErrInvalidSourceShortBuffer = errors.New("lz4: invalid source or destination buffer too short") - // ErrInvalid is returned when reading an invalid LZ4 archive. - ErrInvalid = errors.New("lz4: bad magic number") -) - -// blockHash hashes 4 bytes into a value < winSize. -func blockHash(x uint32) uint32 { - const hasher uint32 = 2654435761 // Knuth multiplicative hash. - return x * hasher >> hashShift +// blockHash hashes the lower 6 bytes into a value < htSize. +func blockHash(x uint64) uint32 { + const prime6bytes = 227718039650203 + return uint32(((x << (64 - 48)) * prime6bytes) >> (64 - hashLog)) } // CompressBlockBound returns the maximum size of a given buffer of size n, when not compressible. @@ -30,137 +23,127 @@ func CompressBlockBound(n int) int { // The destination buffer must be sized appropriately. // // An error is returned if the source data is invalid or the destination buffer is too small. -func UncompressBlock(src, dst []byte) (si int, err error) { - defer func() { - // It is now faster to let the runtime panic and recover on out of bound slice access - // than checking indices as we go along. - if recover() != nil { - err = ErrInvalidSourceShortBuffer - } - }() - sn := len(src) - if sn == 0 { +func UncompressBlock(src, dst []byte) (int, error) { + if len(src) == 0 { return 0, nil } - var di int - - for { - // Literals and match lengths (token). - b := int(src[si]) - si++ - - // Literals. - if lLen := b >> 4; lLen > 0 { - if lLen == 0xF { - for src[si] == 0xFF { - lLen += 0xFF - si++ - } - lLen += int(src[si]) - si++ - } - i := si - si += lLen - di += copy(dst[di:], src[i:si]) - - if si >= sn { - return di, nil - } - } - - si++ - _ = src[si] // Bound check elimination. - offset := int(src[si-1]) | int(src[si])<<8 - si++ - - // Match. - mLen := b & 0xF - if mLen == 0xF { - for src[si] == 0xFF { - mLen += 0xFF - si++ - } - mLen += int(src[si]) - si++ - } - mLen += minMatch - - // Copy the match. - i := di - offset - if offset > 0 && mLen >= offset { - // Efficiently copy the match dst[di-offset:di] into the dst slice. - bytesToCopy := offset * (mLen / offset) - expanded := dst[i:] - for n := offset; n <= bytesToCopy+offset; n *= 2 { - copy(expanded[n:], expanded[:n]) - } - di += bytesToCopy - mLen -= bytesToCopy - } - di += copy(dst[di:], dst[i:i+mLen]) + if di := decodeBlock(dst, src); di >= 0 { + return di, nil } + return 0, ErrInvalidSourceShortBuffer } // CompressBlock compresses the source buffer into the destination one. // This is the fast version of LZ4 compression and also the default one. -// The size of hashTable must be at least 64Kb. // -// The size of the compressed data is returned. If it is 0 and no error, then the data is incompressible. +// The argument hashTable is scratch space for a hash table used by the +// compressor. If provided, it should have length at least 1<<16. If it is +// shorter (or nil), CompressBlock allocates its own hash table. +// +// The size of the compressed data is returned. +// +// If the destination buffer size is lower than CompressBlockBound and +// the compressed size is 0 and no error, then the data is incompressible. // // An error is returned if the destination buffer is too small. -func CompressBlock(src, dst []byte, hashTable []int) (di int, err error) { - defer func() { - if recover() != nil { - err = ErrInvalidSourceShortBuffer - } - }() - - sn, dn := len(src)-mfLimit, len(dst) - if sn <= 0 || dn == 0 { - return 0, nil +func CompressBlock(src, dst []byte, hashTable []int) (_ int, err error) { + defer recoverBlock(&err) + + // Return 0, nil only if the destination buffer size is < CompressBlockBound. + isNotCompressible := len(dst) < CompressBlockBound(len(src)) + + // adaptSkipLog sets how quickly the compressor begins skipping blocks when data is incompressible. + // This significantly speeds up incompressible data and usually has very small impact on compression. + // bytes to skip = 1 + (bytes since last match >> adaptSkipLog) + const adaptSkipLog = 7 + if len(hashTable) < htSize { + htIface := htPool.Get() + defer htPool.Put(htIface) + hashTable = (*(htIface).(*[htSize]int))[:] + } + // Prove to the compiler the table has at least htSize elements. + // The compiler can see that "uint32() >> hashShift" cannot be out of bounds. + hashTable = hashTable[:htSize] + + // si: Current position of the search. + // anchor: Position of the current literals. + var si, di, anchor int + sn := len(src) - mfLimit + if sn <= 0 { + goto lastLiterals } - var si int // Fast scan strategy: the hash table only stores the last 4 bytes sequences. - // const accInit = 1 << skipStrength - - anchor := si // Position of the current literals. - // acc := accInit // Variable step: improves performance on non-compressible data. - for si < sn { - // Hash the next 4 bytes (sequence)... - match := binary.LittleEndian.Uint32(src[si:]) + // Hash the next 6 bytes (sequence)... + match := binary.LittleEndian.Uint64(src[si:]) h := blockHash(match) + h2 := blockHash(match >> 8) + // We check a match at s, s+1 and s+2 and pick the first one we get. + // Checking 3 only requires us to load the source one. ref := hashTable[h] + ref2 := hashTable[h2] hashTable[h] = si - if ref >= sn { // Invalid reference (dirty hashtable). - si++ - continue - } + hashTable[h2] = si + 1 offset := si - ref + + // If offset <= 0 we got an old entry in the hash table. if offset <= 0 || offset >= winSize || // Out of window. - match != binary.LittleEndian.Uint32(src[ref:]) { // Hash collision on different matches. - // si += acc >> skipStrength - // acc++ - si++ - continue + uint32(match) != binary.LittleEndian.Uint32(src[ref:]) { // Hash collision on different matches. + // No match. Start calculating another hash. + // The processor can usually do this out-of-order. + h = blockHash(match >> 16) + ref = hashTable[h] + + // Check the second match at si+1 + si += 1 + offset = si - ref2 + + if offset <= 0 || offset >= winSize || + uint32(match>>8) != binary.LittleEndian.Uint32(src[ref2:]) { + // No match. Check the third match at si+2 + si += 1 + offset = si - ref + hashTable[h] = si + + if offset <= 0 || offset >= winSize || + uint32(match>>16) != binary.LittleEndian.Uint32(src[ref:]) { + // Skip one extra byte (at si+3) before we check 3 matches again. + si += 2 + (si-anchor)>>adaptSkipLog + continue + } + } } // Match found. - // acc = accInit lLen := si - anchor // Literal length. - - // Encode match length part 1. - si += minMatch - mLen := si // Match length has minMatch already. - // Find the longest match, first looking by batches of 8 bytes. - for si < sn && binary.LittleEndian.Uint64(src[si:]) == binary.LittleEndian.Uint64(src[si-offset:]) { - si += 8 + // We already matched 4 bytes. + mLen := 4 + + // Extend backwards if we can, reducing literals. + tOff := si - offset - 1 + for lLen > 0 && tOff >= 0 && src[si-1] == src[tOff] { + si-- + tOff-- + lLen-- + mLen++ } - // Then byte by byte. - for si < sn && src[si] == src[si-offset] { - si++ + + // Add the match length, so we continue search at the end. + // Use mLen to store the offset base. + si, mLen = si+mLen, si+minMatch + + // Find the longest match by looking by batches of 8 bytes. + for si+8 < sn { + x := binary.LittleEndian.Uint64(src[si:]) ^ binary.LittleEndian.Uint64(src[si-offset:]) + if x == 0 { + si += 8 + } else { + // Stop is first non-zero byte. + si += bits.TrailingZeros64(x) >> 3 + break + } } mLen = si - mLen @@ -186,7 +169,7 @@ func CompressBlock(src, dst []byte, hashTable []int) (di int, err error) { di++ // Literals. - copy(dst[di:], src[anchor:anchor+lLen]) + copy(dst[di:di+lLen], src[anchor:anchor+lLen]) di += lLen + 2 anchor = si @@ -203,9 +186,17 @@ func CompressBlock(src, dst []byte, hashTable []int) (di int, err error) { dst[di] = byte(mLen) di++ } + // Check if we can load next values. + if si >= sn { + break + } + // Hash match end-2 + h = blockHash(binary.LittleEndian.Uint64(src[si-2:])) + hashTable[h] = si - 2 } - if anchor == 0 { +lastLiterals: + if isNotCompressible && anchor == 0 { // Incompressible. return 0, nil } @@ -226,48 +217,68 @@ func CompressBlock(src, dst []byte, hashTable []int) (di int, err error) { di++ // Write the last literals. - if di >= anchor { + if isNotCompressible && di >= anchor { // Incompressible. return 0, nil } - di += copy(dst[di:], src[anchor:]) + di += copy(dst[di:di+len(src)-anchor], src[anchor:]) return di, nil } +// Pool of hash tables for CompressBlock. +var htPool = sync.Pool{ + New: func() interface{} { + return new([htSize]int) + }, +} + +// blockHash hashes 4 bytes into a value < winSize. +func blockHashHC(x uint32) uint32 { + const hasher uint32 = 2654435761 // Knuth multiplicative hash. + return x * hasher >> (32 - winSizeLog) +} + // CompressBlockHC compresses the source buffer src into the destination dst // with max search depth (use 0 or negative value for no max). // // CompressBlockHC compression ratio is better than CompressBlock but it is also slower. // -// The size of the compressed data is returned. If it is 0 and no error, then the data is not compressible. +// The size of the compressed data is returned. +// +// If the destination buffer size is lower than CompressBlockBound and +// the compressed size is 0 and no error, then the data is incompressible. // // An error is returned if the destination buffer is too small. -func CompressBlockHC(src, dst []byte, depth int) (di int, err error) { - defer func() { - if recover() != nil { - err = ErrInvalidSourceShortBuffer - } - }() +func CompressBlockHC(src, dst []byte, depth int) (_ int, err error) { + defer recoverBlock(&err) - sn, dn := len(src)-mfLimit, len(dst) - if sn <= 0 || dn == 0 { - return 0, nil - } - var si int + // Return 0, nil only if the destination buffer size is < CompressBlockBound. + isNotCompressible := len(dst) < CompressBlockBound(len(src)) + + // adaptSkipLog sets how quickly the compressor begins skipping blocks when data is incompressible. + // This significantly speeds up incompressible data and usually has very small impact on compression. + // bytes to skip = 1 + (bytes since last match >> adaptSkipLog) + const adaptSkipLog = 7 + + var si, di, anchor int // hashTable: stores the last position found for a given hash - // chaingTable: stores previous positions for a given hash + // chainTable: stores previous positions for a given hash var hashTable, chainTable [winSize]int if depth <= 0 { depth = winSize } - anchor := si + sn := len(src) - mfLimit + if sn <= 0 { + goto lastLiterals + } + for si < sn { // Hash the next 4 bytes (sequence). match := binary.LittleEndian.Uint32(src[si:]) - h := blockHash(match) + h := blockHashHC(match) // Follow the chain until out of window and give the longest match. mLen := 0 @@ -280,13 +291,17 @@ func CompressBlockHC(src, dst []byte, depth int) (di int, err error) { } ml := 0 // Compare the current position with a previous with the same hash. - for ml < sn-si && binary.LittleEndian.Uint64(src[next+ml:]) == binary.LittleEndian.Uint64(src[si+ml:]) { - ml += 8 - } - for ml < sn-si && src[next+ml] == src[si+ml] { - ml++ + for ml < sn-si { + x := binary.LittleEndian.Uint64(src[next+ml:]) ^ binary.LittleEndian.Uint64(src[si+ml:]) + if x == 0 { + ml += 8 + } else { + // Stop is first non-zero byte. + ml += bits.TrailingZeros64(x) >> 3 + break + } } - if ml+1 < minMatch || ml <= mLen { + if ml < minMatch || ml <= mLen { // Match too small (>adaptSkipLog continue } @@ -315,7 +330,7 @@ func CompressBlockHC(src, dst []byte, depth int) (di int, err error) { for si, ml := winStart, si+mLen; si < ml; { match >>= 8 match |= uint32(src[si+3]) << 24 - h := blockHash(match) + h := blockHashHC(match) chainTable[si&winMask] = hashTable[h] hashTable[h] = si si++ @@ -347,7 +362,7 @@ func CompressBlockHC(src, dst []byte, depth int) (di int, err error) { di++ // Literals. - copy(dst[di:], src[anchor:anchor+lLen]) + copy(dst[di:di+lLen], src[anchor:anchor+lLen]) di += lLen anchor = si @@ -366,12 +381,13 @@ func CompressBlockHC(src, dst []byte, depth int) (di int, err error) { } } - if anchor == 0 { + if isNotCompressible && anchor == 0 { // Incompressible. return 0, nil } // Last literals. +lastLiterals: lLen := len(src) - anchor if lLen < 0xF { dst[di] = byte(lLen << 4) @@ -388,10 +404,10 @@ func CompressBlockHC(src, dst []byte, depth int) (di int, err error) { di++ // Write the last literals. - if di >= anchor { + if isNotCompressible && di >= anchor { // Incompressible. return 0, nil } - di += copy(dst[di:], src[anchor:]) + di += copy(dst[di:di+len(src)-anchor], src[anchor:]) return di, nil } diff --git a/vendor/github.com/pierrec/lz4/decode_amd64.go b/vendor/github.com/pierrec/lz4/decode_amd64.go new file mode 100644 index 000000000..43cc14fbe --- /dev/null +++ b/vendor/github.com/pierrec/lz4/decode_amd64.go @@ -0,0 +1,8 @@ +// +build !appengine +// +build gc +// +build !noasm + +package lz4 + +//go:noescape +func decodeBlock(dst, src []byte) int diff --git a/vendor/github.com/pierrec/lz4/decode_amd64.s b/vendor/github.com/pierrec/lz4/decode_amd64.s new file mode 100644 index 000000000..20fef3975 --- /dev/null +++ b/vendor/github.com/pierrec/lz4/decode_amd64.s @@ -0,0 +1,375 @@ +// +build !appengine +// +build gc +// +build !noasm + +#include "textflag.h" + +// AX scratch +// BX scratch +// CX scratch +// DX token +// +// DI &dst +// SI &src +// R8 &dst + len(dst) +// R9 &src + len(src) +// R11 &dst +// R12 short output end +// R13 short input end +// func decodeBlock(dst, src []byte) int +// using 50 bytes of stack currently +TEXT ·decodeBlock(SB), NOSPLIT, $64-56 + MOVQ dst_base+0(FP), DI + MOVQ DI, R11 + MOVQ dst_len+8(FP), R8 + ADDQ DI, R8 + + MOVQ src_base+24(FP), SI + MOVQ src_len+32(FP), R9 + ADDQ SI, R9 + + // shortcut ends + // short output end + MOVQ R8, R12 + SUBQ $32, R12 + // short input end + MOVQ R9, R13 + SUBQ $16, R13 + +loop: + // for si < len(src) + CMPQ SI, R9 + JGE end + + // token := uint32(src[si]) + MOVBQZX (SI), DX + INCQ SI + + // lit_len = token >> 4 + // if lit_len > 0 + // CX = lit_len + MOVQ DX, CX + SHRQ $4, CX + + // if lit_len != 0xF + CMPQ CX, $0xF + JEQ lit_len_loop_pre + CMPQ DI, R12 + JGE lit_len_loop_pre + CMPQ SI, R13 + JGE lit_len_loop_pre + + // copy shortcut + + // A two-stage shortcut for the most common case: + // 1) If the literal length is 0..14, and there is enough space, + // enter the shortcut and copy 16 bytes on behalf of the literals + // (in the fast mode, only 8 bytes can be safely copied this way). + // 2) Further if the match length is 4..18, copy 18 bytes in a similar + // manner; but we ensure that there's enough space in the output for + // those 18 bytes earlier, upon entering the shortcut (in other words, + // there is a combined check for both stages). + + // copy literal + MOVOU (SI), X0 + MOVOU X0, (DI) + ADDQ CX, DI + ADDQ CX, SI + + MOVQ DX, CX + ANDQ $0xF, CX + + // The second stage: prepare for match copying, decode full info. + // If it doesn't work out, the info won't be wasted. + // offset := uint16(data[:2]) + MOVWQZX (SI), DX + ADDQ $2, SI + + MOVQ DI, AX + SUBQ DX, AX + CMPQ AX, DI + JGT err_short_buf + + // if we can't do the second stage then jump straight to read the + // match length, we already have the offset. + CMPQ CX, $0xF + JEQ match_len_loop_pre + CMPQ DX, $8 + JLT match_len_loop_pre + CMPQ AX, R11 + JLT err_short_buf + + // memcpy(op + 0, match + 0, 8); + MOVQ (AX), BX + MOVQ BX, (DI) + // memcpy(op + 8, match + 8, 8); + MOVQ 8(AX), BX + MOVQ BX, 8(DI) + // memcpy(op +16, match +16, 2); + MOVW 16(AX), BX + MOVW BX, 16(DI) + + ADDQ $4, DI // minmatch + ADDQ CX, DI + + // shortcut complete, load next token + JMP loop + +lit_len_loop_pre: + // if lit_len > 0 + CMPQ CX, $0 + JEQ offset + CMPQ CX, $0xF + JNE copy_literal + +lit_len_loop: + // for src[si] == 0xFF + CMPB (SI), $0xFF + JNE lit_len_finalise + + // bounds check src[si+1] + MOVQ SI, AX + ADDQ $1, AX + CMPQ AX, R9 + JGT err_short_buf + + // lit_len += 0xFF + ADDQ $0xFF, CX + INCQ SI + JMP lit_len_loop + +lit_len_finalise: + // lit_len += int(src[si]) + // si++ + MOVBQZX (SI), AX + ADDQ AX, CX + INCQ SI + +copy_literal: + // bounds check src and dst + MOVQ SI, AX + ADDQ CX, AX + CMPQ AX, R9 + JGT err_short_buf + + MOVQ DI, AX + ADDQ CX, AX + CMPQ AX, R8 + JGT err_short_buf + + // whats a good cut off to call memmove? + CMPQ CX, $16 + JGT memmove_lit + + // if len(dst[di:]) < 16 + MOVQ R8, AX + SUBQ DI, AX + CMPQ AX, $16 + JLT memmove_lit + + // if len(src[si:]) < 16 + MOVQ R9, AX + SUBQ SI, AX + CMPQ AX, $16 + JLT memmove_lit + + MOVOU (SI), X0 + MOVOU X0, (DI) + + JMP finish_lit_copy + +memmove_lit: + // memmove(to, from, len) + MOVQ DI, 0(SP) + MOVQ SI, 8(SP) + MOVQ CX, 16(SP) + // spill + MOVQ DI, 24(SP) + MOVQ SI, 32(SP) + MOVQ CX, 40(SP) // need len to inc SI, DI after + MOVB DX, 48(SP) + CALL runtime·memmove(SB) + + // restore registers + MOVQ 24(SP), DI + MOVQ 32(SP), SI + MOVQ 40(SP), CX + MOVB 48(SP), DX + + // recalc initial values + MOVQ dst_base+0(FP), R8 + MOVQ R8, R11 + ADDQ dst_len+8(FP), R8 + MOVQ src_base+24(FP), R9 + ADDQ src_len+32(FP), R9 + MOVQ R8, R12 + SUBQ $32, R12 + MOVQ R9, R13 + SUBQ $16, R13 + +finish_lit_copy: + ADDQ CX, SI + ADDQ CX, DI + + CMPQ SI, R9 + JGE end + +offset: + // CX := mLen + // free up DX to use for offset + MOVQ DX, CX + + MOVQ SI, AX + ADDQ $2, AX + CMPQ AX, R9 + JGT err_short_buf + + // offset + // DX := int(src[si]) | int(src[si+1])<<8 + MOVWQZX (SI), DX + ADDQ $2, SI + + // 0 offset is invalid + CMPQ DX, $0 + JEQ err_corrupt + + ANDB $0xF, CX + +match_len_loop_pre: + // if mlen != 0xF + CMPB CX, $0xF + JNE copy_match + +match_len_loop: + // for src[si] == 0xFF + // lit_len += 0xFF + CMPB (SI), $0xFF + JNE match_len_finalise + + // bounds check src[si+1] + MOVQ SI, AX + ADDQ $1, AX + CMPQ AX, R9 + JGT err_short_buf + + ADDQ $0xFF, CX + INCQ SI + JMP match_len_loop + +match_len_finalise: + // lit_len += int(src[si]) + // si++ + MOVBQZX (SI), AX + ADDQ AX, CX + INCQ SI + +copy_match: + // mLen += minMatch + ADDQ $4, CX + + // check we have match_len bytes left in dst + // di+match_len < len(dst) + MOVQ DI, AX + ADDQ CX, AX + CMPQ AX, R8 + JGT err_short_buf + + // DX = offset + // CX = match_len + // BX = &dst + (di - offset) + MOVQ DI, BX + SUBQ DX, BX + + // check BX is within dst + // if BX < &dst + CMPQ BX, R11 + JLT err_short_buf + + // if offset + match_len < di + MOVQ BX, AX + ADDQ CX, AX + CMPQ DI, AX + JGT copy_interior_match + + // AX := len(dst[:di]) + // MOVQ DI, AX + // SUBQ R11, AX + + // copy 16 bytes at a time + // if di-offset < 16 copy 16-(di-offset) bytes to di + // then do the remaining + +copy_match_loop: + // for match_len >= 0 + // dst[di] = dst[i] + // di++ + // i++ + MOVB (BX), AX + MOVB AX, (DI) + INCQ DI + INCQ BX + DECQ CX + + CMPQ CX, $0 + JGT copy_match_loop + + JMP loop + +copy_interior_match: + CMPQ CX, $16 + JGT memmove_match + + // if len(dst[di:]) < 16 + MOVQ R8, AX + SUBQ DI, AX + CMPQ AX, $16 + JLT memmove_match + + MOVOU (BX), X0 + MOVOU X0, (DI) + + ADDQ CX, DI + JMP loop + +memmove_match: + // memmove(to, from, len) + MOVQ DI, 0(SP) + MOVQ BX, 8(SP) + MOVQ CX, 16(SP) + // spill + MOVQ DI, 24(SP) + MOVQ SI, 32(SP) + MOVQ CX, 40(SP) // need len to inc SI, DI after + CALL runtime·memmove(SB) + + // restore registers + MOVQ 24(SP), DI + MOVQ 32(SP), SI + MOVQ 40(SP), CX + + // recalc initial values + MOVQ dst_base+0(FP), R8 + MOVQ R8, R11 // TODO: make these sensible numbers + ADDQ dst_len+8(FP), R8 + MOVQ src_base+24(FP), R9 + ADDQ src_len+32(FP), R9 + MOVQ R8, R12 + SUBQ $32, R12 + MOVQ R9, R13 + SUBQ $16, R13 + + ADDQ CX, DI + JMP loop + +err_corrupt: + MOVQ $-1, ret+48(FP) + RET + +err_short_buf: + MOVQ $-2, ret+48(FP) + RET + +end: + SUBQ R11, DI + MOVQ DI, ret+48(FP) + RET diff --git a/vendor/github.com/pierrec/lz4/decode_other.go b/vendor/github.com/pierrec/lz4/decode_other.go new file mode 100644 index 000000000..919888edf --- /dev/null +++ b/vendor/github.com/pierrec/lz4/decode_other.go @@ -0,0 +1,98 @@ +// +build !amd64 appengine !gc noasm + +package lz4 + +func decodeBlock(dst, src []byte) (ret int) { + const hasError = -2 + defer func() { + if recover() != nil { + ret = hasError + } + }() + + var si, di int + for { + // Literals and match lengths (token). + b := int(src[si]) + si++ + + // Literals. + if lLen := b >> 4; lLen > 0 { + switch { + case lLen < 0xF && si+16 < len(src): + // Shortcut 1 + // if we have enough room in src and dst, and the literals length + // is small enough (0..14) then copy all 16 bytes, even if not all + // are part of the literals. + copy(dst[di:], src[si:si+16]) + si += lLen + di += lLen + if mLen := b & 0xF; mLen < 0xF { + // Shortcut 2 + // if the match length (4..18) fits within the literals, then copy + // all 18 bytes, even if not all are part of the literals. + mLen += 4 + if offset := int(src[si]) | int(src[si+1])<<8; mLen <= offset { + i := di - offset + end := i + 18 + if end > len(dst) { + // The remaining buffer may not hold 18 bytes. + // See https://github.com/pierrec/lz4/issues/51. + end = len(dst) + } + copy(dst[di:], dst[i:end]) + si += 2 + di += mLen + continue + } + } + case lLen == 0xF: + for src[si] == 0xFF { + lLen += 0xFF + si++ + } + lLen += int(src[si]) + si++ + fallthrough + default: + copy(dst[di:di+lLen], src[si:si+lLen]) + si += lLen + di += lLen + } + } + if si >= len(src) { + return di + } + + offset := int(src[si]) | int(src[si+1])<<8 + if offset == 0 { + return hasError + } + si += 2 + + // Match. + mLen := b & 0xF + if mLen == 0xF { + for src[si] == 0xFF { + mLen += 0xFF + si++ + } + mLen += int(src[si]) + si++ + } + mLen += minMatch + + // Copy the match. + expanded := dst[di-offset:] + if mLen > offset { + // Efficiently copy the match dst[di-offset:di] into the dst slice. + bytesToCopy := offset * (mLen / offset) + for n := offset; n <= bytesToCopy+offset; n *= 2 { + copy(expanded[n:], expanded[:n]) + } + di += bytesToCopy + mLen -= bytesToCopy + } + di += copy(dst[di:di+mLen], expanded[:mLen]) + } +} diff --git a/vendor/github.com/pierrec/lz4/errors.go b/vendor/github.com/pierrec/lz4/errors.go new file mode 100644 index 000000000..1c45d1813 --- /dev/null +++ b/vendor/github.com/pierrec/lz4/errors.go @@ -0,0 +1,30 @@ +package lz4 + +import ( + "errors" + "fmt" + "os" + rdebug "runtime/debug" +) + +var ( + // ErrInvalidSourceShortBuffer is returned by UncompressBlock or CompressBLock when a compressed + // block is corrupted or the destination buffer is not large enough for the uncompressed data. + ErrInvalidSourceShortBuffer = errors.New("lz4: invalid source or destination buffer too short") + // ErrInvalid is returned when reading an invalid LZ4 archive. + ErrInvalid = errors.New("lz4: bad magic number") + // ErrBlockDependency is returned when attempting to decompress an archive created with block dependency. + ErrBlockDependency = errors.New("lz4: block dependency not supported") + // ErrUnsupportedSeek is returned when attempting to Seek any way but forward from the current position. + ErrUnsupportedSeek = errors.New("lz4: can only seek forward from io.SeekCurrent") +) + +func recoverBlock(e *error) { + if r := recover(); r != nil && *e == nil { + if debugFlag { + fmt.Fprintln(os.Stderr, r) + rdebug.PrintStack() + } + *e = ErrInvalidSourceShortBuffer + } +} diff --git a/vendor/github.com/pierrec/lz4/go.mod b/vendor/github.com/pierrec/lz4/go.mod deleted file mode 100644 index f9f570aa9..000000000 --- a/vendor/github.com/pierrec/lz4/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/pierrec/lz4 - -require github.com/pkg/profile v1.2.1 diff --git a/vendor/github.com/pierrec/lz4/go.sum b/vendor/github.com/pierrec/lz4/go.sum deleted file mode 100644 index 6ca759812..000000000 --- a/vendor/github.com/pierrec/lz4/go.sum +++ /dev/null @@ -1,2 +0,0 @@ -github.com/pkg/profile v1.2.1 h1:F++O52m40owAmADcojzM+9gyjmMOY/T4oYJkgFDH8RE= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= diff --git a/vendor/github.com/pierrec/lz4/internal/xxh32/xxh32zero.go b/vendor/github.com/pierrec/lz4/internal/xxh32/xxh32zero.go index 850a6fdf6..7a76a6bce 100644 --- a/vendor/github.com/pierrec/lz4/internal/xxh32/xxh32zero.go +++ b/vendor/github.com/pierrec/lz4/internal/xxh32/xxh32zero.go @@ -7,14 +7,15 @@ import ( ) const ( - prime32_1 uint32 = 2654435761 - prime32_2 uint32 = 2246822519 - prime32_3 uint32 = 3266489917 - prime32_4 uint32 = 668265263 - prime32_5 uint32 = 374761393 - - prime32_1plus2 uint32 = 606290984 - prime32_minus1 uint32 = 1640531535 + prime1 uint32 = 2654435761 + prime2 uint32 = 2246822519 + prime3 uint32 = 3266489917 + prime4 uint32 = 668265263 + prime5 uint32 = 374761393 + + primeMask = 0xFFFFFFFF + prime1plus2 = uint32((uint64(prime1) + uint64(prime2)) & primeMask) // 606290984 + prime1minus = uint32((-int64(prime1)) & primeMask) // 1640531535 ) // XXHZero represents an xxhash32 object with seed 0. @@ -37,10 +38,10 @@ func (xxh XXHZero) Sum(b []byte) []byte { // Reset resets the Hash to its initial state. func (xxh *XXHZero) Reset() { - xxh.v1 = prime32_1plus2 - xxh.v2 = prime32_2 + xxh.v1 = prime1plus2 + xxh.v2 = prime2 xxh.v3 = 0 - xxh.v4 = prime32_minus1 + xxh.v4 = prime1minus xxh.totalLen = 0 xxh.bufused = 0 } @@ -83,20 +84,20 @@ func (xxh *XXHZero) Write(input []byte) (int, error) { // fast rotl(13) buf := xxh.buf[:16] // BCE hint. - v1 = rol13(v1+binary.LittleEndian.Uint32(buf[:])*prime32_2) * prime32_1 - v2 = rol13(v2+binary.LittleEndian.Uint32(buf[4:])*prime32_2) * prime32_1 - v3 = rol13(v3+binary.LittleEndian.Uint32(buf[8:])*prime32_2) * prime32_1 - v4 = rol13(v4+binary.LittleEndian.Uint32(buf[12:])*prime32_2) * prime32_1 + v1 = rol13(v1+binary.LittleEndian.Uint32(buf[:])*prime2) * prime1 + v2 = rol13(v2+binary.LittleEndian.Uint32(buf[4:])*prime2) * prime1 + v3 = rol13(v3+binary.LittleEndian.Uint32(buf[8:])*prime2) * prime1 + v4 = rol13(v4+binary.LittleEndian.Uint32(buf[12:])*prime2) * prime1 p = r xxh.bufused = 0 } for n := n - 16; p <= n; p += 16 { sub := input[p:][:16] //BCE hint for compiler - v1 = rol13(v1+binary.LittleEndian.Uint32(sub[:])*prime32_2) * prime32_1 - v2 = rol13(v2+binary.LittleEndian.Uint32(sub[4:])*prime32_2) * prime32_1 - v3 = rol13(v3+binary.LittleEndian.Uint32(sub[8:])*prime32_2) * prime32_1 - v4 = rol13(v4+binary.LittleEndian.Uint32(sub[12:])*prime32_2) * prime32_1 + v1 = rol13(v1+binary.LittleEndian.Uint32(sub[:])*prime2) * prime1 + v2 = rol13(v2+binary.LittleEndian.Uint32(sub[4:])*prime2) * prime1 + v3 = rol13(v3+binary.LittleEndian.Uint32(sub[8:])*prime2) * prime1 + v4 = rol13(v4+binary.LittleEndian.Uint32(sub[12:])*prime2) * prime1 } xxh.v1, xxh.v2, xxh.v3, xxh.v4 = v1, v2, v3, v4 @@ -112,25 +113,25 @@ func (xxh *XXHZero) Sum32() uint32 { if h32 >= 16 { h32 += rol1(xxh.v1) + rol7(xxh.v2) + rol12(xxh.v3) + rol18(xxh.v4) } else { - h32 += prime32_5 + h32 += prime5 } p := 0 n := xxh.bufused buf := xxh.buf for n := n - 4; p <= n; p += 4 { - h32 += binary.LittleEndian.Uint32(buf[p:p+4]) * prime32_3 - h32 = rol17(h32) * prime32_4 + h32 += binary.LittleEndian.Uint32(buf[p:p+4]) * prime3 + h32 = rol17(h32) * prime4 } for ; p < n; p++ { - h32 += uint32(buf[p]) * prime32_5 - h32 = rol11(h32) * prime32_1 + h32 += uint32(buf[p]) * prime5 + h32 = rol11(h32) * prime1 } h32 ^= h32 >> 15 - h32 *= prime32_2 + h32 *= prime2 h32 ^= h32 >> 13 - h32 *= prime32_3 + h32 *= prime3 h32 ^= h32 >> 16 return h32 @@ -142,19 +143,19 @@ func ChecksumZero(input []byte) uint32 { h32 := uint32(n) if n < 16 { - h32 += prime32_5 + h32 += prime5 } else { - v1 := prime32_1plus2 - v2 := prime32_2 + v1 := prime1plus2 + v2 := prime2 v3 := uint32(0) - v4 := prime32_minus1 + v4 := prime1minus p := 0 for n := n - 16; p <= n; p += 16 { sub := input[p:][:16] //BCE hint for compiler - v1 = rol13(v1+binary.LittleEndian.Uint32(sub[:])*prime32_2) * prime32_1 - v2 = rol13(v2+binary.LittleEndian.Uint32(sub[4:])*prime32_2) * prime32_1 - v3 = rol13(v3+binary.LittleEndian.Uint32(sub[8:])*prime32_2) * prime32_1 - v4 = rol13(v4+binary.LittleEndian.Uint32(sub[12:])*prime32_2) * prime32_1 + v1 = rol13(v1+binary.LittleEndian.Uint32(sub[:])*prime2) * prime1 + v2 = rol13(v2+binary.LittleEndian.Uint32(sub[4:])*prime2) * prime1 + v3 = rol13(v3+binary.LittleEndian.Uint32(sub[8:])*prime2) * prime1 + v4 = rol13(v4+binary.LittleEndian.Uint32(sub[12:])*prime2) * prime1 } input = input[p:] n -= p @@ -163,19 +164,19 @@ func ChecksumZero(input []byte) uint32 { p := 0 for n := n - 4; p <= n; p += 4 { - h32 += binary.LittleEndian.Uint32(input[p:p+4]) * prime32_3 - h32 = rol17(h32) * prime32_4 + h32 += binary.LittleEndian.Uint32(input[p:p+4]) * prime3 + h32 = rol17(h32) * prime4 } for p < n { - h32 += uint32(input[p]) * prime32_5 - h32 = rol11(h32) * prime32_1 + h32 += uint32(input[p]) * prime5 + h32 = rol11(h32) * prime1 p++ } h32 ^= h32 >> 15 - h32 *= prime32_2 + h32 *= prime2 h32 ^= h32 >> 13 - h32 *= prime32_3 + h32 *= prime3 h32 ^= h32 >> 16 return h32 @@ -183,12 +184,12 @@ func ChecksumZero(input []byte) uint32 { // Uint32Zero hashes x with seed 0. func Uint32Zero(x uint32) uint32 { - h := prime32_5 + 4 + x*prime32_3 - h = rol17(h) * prime32_4 + h := prime5 + 4 + x*prime3 + h = rol17(h) * prime4 h ^= h >> 15 - h *= prime32_2 + h *= prime2 h ^= h >> 13 - h *= prime32_3 + h *= prime3 h ^= h >> 16 return h } diff --git a/vendor/github.com/pierrec/lz4/lz4.go b/vendor/github.com/pierrec/lz4/lz4.go index 35802756c..6c73539a3 100644 --- a/vendor/github.com/pierrec/lz4/lz4.go +++ b/vendor/github.com/pierrec/lz4/lz4.go @@ -10,6 +10,10 @@ // package lz4 +import "math/bits" + +import "sync" + const ( // Extension is the LZ4 frame file name extension Extension = ".lz4" @@ -30,34 +34,71 @@ const ( // hashLog determines the size of the hash table used to quickly find a previous match position. // Its value influences the compression speed and memory usage, the lower the faster, // but at the expense of the compression ratio. - // 16 seems to be the best compromise. - hashLog = 16 - hashTableSize = 1 << hashLog - hashShift = uint((minMatch * 8) - hashLog) + // 16 seems to be the best compromise for fast compression. + hashLog = 16 + htSize = 1 << hashLog - mfLimit = 8 + minMatch // The last match cannot start within the last 12 bytes. - skipStrength = 6 // variable step for fast scan + mfLimit = 10 + minMatch // The last match cannot start within the last 14 bytes. ) // map the block max size id with its value in bytes: 64Kb, 256Kb, 1Mb and 4Mb. +const ( + blockSize64K = 1 << (16 + 2*iota) + blockSize256K + blockSize1M + blockSize4M +) + var ( - bsMapID = map[byte]int{4: 64 << 10, 5: 256 << 10, 6: 1 << 20, 7: 4 << 20} - bsMapValue = make(map[int]byte, len(bsMapID)) + // Keep a pool of buffers for each valid block sizes. + bsMapValue = [...]*sync.Pool{ + newBufferPool(2 * blockSize64K), + newBufferPool(2 * blockSize256K), + newBufferPool(2 * blockSize1M), + newBufferPool(2 * blockSize4M), + } ) -// Reversed. -func init() { - for i, v := range bsMapID { - bsMapValue[v] = i +// newBufferPool returns a pool for buffers of the given size. +func newBufferPool(size int) *sync.Pool { + return &sync.Pool{ + New: func() interface{} { + return make([]byte, size) + }, } } +// getBuffer returns a buffer to its pool. +func getBuffer(size int) []byte { + idx := blockSizeValueToIndex(size) - 4 + return bsMapValue[idx].Get().([]byte) +} + +// putBuffer returns a buffer to its pool. +func putBuffer(size int, buf []byte) { + if cap(buf) > 0 { + idx := blockSizeValueToIndex(size) - 4 + bsMapValue[idx].Put(buf[:cap(buf)]) + } +} +func blockSizeIndexToValue(i byte) int { + return 1 << (16 + 2*uint(i)) +} +func isValidBlockSize(size int) bool { + const blockSizeMask = blockSize64K | blockSize256K | blockSize1M | blockSize4M + + return size&blockSizeMask > 0 && bits.OnesCount(uint(size)) == 1 +} +func blockSizeValueToIndex(size int) byte { + return 4 + byte(bits.TrailingZeros(uint(size)>>16)/2) +} + // Header describes the various flags that can be set on a Writer or obtained from a Reader. // The default values match those of the LZ4 frame format definition // (http://fastcompression.blogspot.com/2013/04/lz4-streaming-format-final.html). // // NB. in a Reader, in case of concatenated frames, the Header values may change between Read() calls. -// It is the caller responsibility to check them if necessary. +// It is the caller's responsibility to check them if necessary. type Header struct { BlockChecksum bool // Compressed blocks checksum flag. NoChecksum bool // Frame checksum flag. @@ -66,3 +107,7 @@ type Header struct { CompressionLevel int // Compression level (higher is better, use 0 for fastest compression). done bool // Header processed flag (Read or Write and checked). } + +func (h *Header) Reset() { + h.done = false +} diff --git a/vendor/github.com/pierrec/lz4/reader.go b/vendor/github.com/pierrec/lz4/reader.go index f08db47df..87dd72bd0 100644 --- a/vendor/github.com/pierrec/lz4/reader.go +++ b/vendor/github.com/pierrec/lz4/reader.go @@ -14,6 +14,9 @@ import ( // The Header may change between Read() calls in case of concatenated frames. type Reader struct { Header + // Handler called when a block has been successfully read. + // It provides the number of bytes read. + OnBlockDone func(size int) buf [8]byte // Scrap buffer. pos int64 // Current position in src. @@ -22,6 +25,8 @@ type Reader struct { data []byte // Uncompressed data. idx int // Index of unread bytes into data. checksum xxh32.XXHZero // Frame hash. + skip int64 // Bytes to skip before next read. + dpos int64 // Position in dest } // NewReader returns a new LZ4 frame decoder. @@ -76,17 +81,17 @@ func (z *Reader) readHeader(first bool) error { return fmt.Errorf("lz4: invalid version: got %d; expected %d", v, Version) } if b>>5&1 == 0 { - return fmt.Errorf("lz4: block dependency not supported") + return ErrBlockDependency } z.BlockChecksum = b>>4&1 > 0 frameSize := b>>3&1 > 0 z.NoChecksum = b>>2&1 == 0 bmsID := buf[1] >> 4 & 0x7 - bSize, ok := bsMapID[bmsID] - if !ok { + if bmsID < 4 || bmsID > 7 { return fmt.Errorf("lz4: invalid block max size ID: %d", bmsID) } + bSize := blockSizeIndexToValue(bmsID - 4) z.BlockMaxSize = bSize // Allocate the compressed/uncompressed buffers. @@ -101,7 +106,7 @@ func (z *Reader) readHeader(first bool) error { z.data = z.zdata[:cap(z.zdata)][bSize:] z.idx = len(z.data) - z.checksum.Write(buf[0:2]) + _, _ = z.checksum.Write(buf[0:2]) if frameSize { buf := buf[:8] @@ -110,7 +115,7 @@ func (z *Reader) readHeader(first bool) error { } z.Size = binary.LittleEndian.Uint64(buf) z.pos += 8 - z.checksum.Write(buf) + _, _ = z.checksum.Write(buf) } // Header checksum. @@ -158,6 +163,9 @@ func (z *Reader) Read(buf []byte) (int, error) { if debugFlag { debug("reading block from writer") } + // Reset uncompressed buffer + z.data = z.zdata[:cap(z.zdata)][len(z.zdata):] + // Block length: 0 = end of frame, highest bit set: uncompressed. bLen, err := z.readUint32() if err != nil { @@ -208,6 +216,9 @@ func (z *Reader) Read(buf []byte) (int, error) { return 0, err } z.pos += int64(bLen) + if z.OnBlockDone != nil { + z.OnBlockDone(int(bLen)) + } if z.BlockChecksum { checksum, err := z.readUint32() @@ -252,10 +263,13 @@ func (z *Reader) Read(buf []byte) (int, error) { return 0, err } z.data = z.data[:n] + if z.OnBlockDone != nil { + z.OnBlockDone(n) + } } if !z.NoChecksum { - z.checksum.Write(z.data) + _, _ = z.checksum.Write(z.data) if debugFlag { debug("current frame checksum %x", z.checksum.Sum32()) } @@ -263,8 +277,20 @@ func (z *Reader) Read(buf []byte) (int, error) { z.idx = 0 } + if z.skip > int64(len(z.data[z.idx:])) { + z.skip -= int64(len(z.data[z.idx:])) + z.dpos += int64(len(z.data[z.idx:])) + z.idx = len(z.data) + return 0, nil + } + + z.idx += int(z.skip) + z.dpos += z.skip + z.skip = 0 + n := copy(buf, z.data[z.idx:]) z.idx += n + z.dpos += int64(n) if debugFlag { debug("copied %d bytes to input", n) } @@ -272,6 +298,20 @@ func (z *Reader) Read(buf []byte) (int, error) { return n, nil } +// Seek implements io.Seeker, but supports seeking forward from the current +// position only. Any other seek will return an error. Allows skipping output +// bytes which aren't needed, which in some scenarios is faster than reading +// and discarding them. +// Note this may cause future calls to Read() to read 0 bytes if all of the +// data they would have returned is skipped. +func (z *Reader) Seek(offset int64, whence int) (int64, error) { + if offset < 0 || whence != io.SeekCurrent { + return z.dpos + z.skip, ErrUnsupportedSeek + } + z.skip += offset + return z.dpos + z.skip, nil +} + // Reset discards the Reader's state and makes it equivalent to the // result of its original state from NewReader, but reading from r instead. // This permits reusing a Reader rather than allocating a new one. diff --git a/vendor/github.com/pierrec/lz4/writer.go b/vendor/github.com/pierrec/lz4/writer.go index 012043802..324f1386b 100644 --- a/vendor/github.com/pierrec/lz4/writer.go +++ b/vendor/github.com/pierrec/lz4/writer.go @@ -3,22 +3,35 @@ package lz4 import ( "encoding/binary" "fmt" - "io" - "github.com/pierrec/lz4/internal/xxh32" + "io" + "runtime" ) +// zResult contains the results of compressing a block. +type zResult struct { + size uint32 // Block header + data []byte // Compressed data + checksum uint32 // Data checksum +} + // Writer implements the LZ4 frame encoder. type Writer struct { Header + // Handler called when a block has been successfully written out. + // It provides the number of bytes written. + OnBlockDone func(size int) buf [19]byte // magic number(4) + header(flags(2)+[Size(8)+DictID(4)]+checksum(1)) does not exceed 19 bytes dst io.Writer // Destination. checksum xxh32.XXHZero // Frame checksum. - zdata []byte // Compressed data. - data []byte // Data to be compressed. + data []byte // Data to be compressed + buffer for compressed data. idx int // Index into data. hashtable [winSize]int // Hash table used in CompressBlock(). + + // For concurrency. + c chan chan zResult // Channel for block compression goroutines and writer goroutine. + err error // Any error encountered while writing to the underlying destination. } // NewWriter returns a new LZ4 frame encoder. @@ -26,28 +39,92 @@ type Writer struct { // The supplied Header is checked at the first Write. // It is ok to change it before the first Write but then not until a Reset() is performed. func NewWriter(dst io.Writer) *Writer { - return &Writer{dst: dst} + z := new(Writer) + z.Reset(dst) + return z +} + +// WithConcurrency sets the number of concurrent go routines used for compression. +// A negative value sets the concurrency to GOMAXPROCS. +func (z *Writer) WithConcurrency(n int) *Writer { + switch { + case n == 0 || n == 1: + z.c = nil + return z + case n < 0: + n = runtime.GOMAXPROCS(0) + } + z.c = make(chan chan zResult, n) + // Writer goroutine managing concurrent block compression goroutines. + go func() { + // Process next block compression item. + for c := range z.c { + // Read the next compressed block result. + // Waiting here ensures that the blocks are output in the order they were sent. + // The incoming channel is always closed as it indicates to the caller that + // the block has been processed. + res := <-c + n := len(res.data) + if n == 0 { + // Notify the block compression routine that we are done with its result. + // This is used when a sentinel block is sent to terminate the compression. + close(c) + return + } + // Write the block. + if err := z.writeUint32(res.size); err != nil && z.err == nil { + z.err = err + } + if _, err := z.dst.Write(res.data); err != nil && z.err == nil { + z.err = err + } + if z.BlockChecksum { + if err := z.writeUint32(res.checksum); err != nil && z.err == nil { + z.err = err + } + } + if isCompressed := res.size&compressedBlockFlag == 0; isCompressed { + // It is now safe to release the buffer as no longer in use by any goroutine. + putBuffer(cap(res.data), res.data) + } + if h := z.OnBlockDone; h != nil { + h(n) + } + close(c) + } + }() + return z +} + +// newBuffers instantiates new buffers which size matches the one in Header. +// The returned buffers are for decompression and compression respectively. +func (z *Writer) newBuffers() { + bSize := z.Header.BlockMaxSize + buf := getBuffer(bSize) + z.data = buf[:bSize] // Uncompressed buffer is the first half. +} + +// freeBuffers puts the writer's buffers back to the pool. +func (z *Writer) freeBuffers() { + // Put the buffer back into the pool, if any. + putBuffer(z.Header.BlockMaxSize, z.data) + z.data = nil } // writeHeader builds and writes the header (magic+header) to the underlying io.Writer. func (z *Writer) writeHeader() error { // Default to 4Mb if BlockMaxSize is not set. if z.Header.BlockMaxSize == 0 { - z.Header.BlockMaxSize = bsMapID[7] + z.Header.BlockMaxSize = blockSize4M } // The only option that needs to be validated. bSize := z.Header.BlockMaxSize - bSizeID, ok := bsMapValue[bSize] - if !ok { + if !isValidBlockSize(z.Header.BlockMaxSize) { return fmt.Errorf("lz4: invalid block max size: %d", bSize) } // Allocate the compressed/uncompressed buffers. // The compressed buffer cannot exceed the uncompressed one. - if n := 2 * bSize; cap(z.zdata) < n { - z.zdata = make([]byte, n, n) - } - z.zdata = z.zdata[:bSize] - z.data = z.zdata[:cap(z.zdata)][bSize:] + z.newBuffers() z.idx = 0 // Size is optional. @@ -67,7 +144,7 @@ func (z *Writer) writeHeader() error { flg |= 1 << 2 } buf[4] = flg - buf[5] = bSizeID << 4 + buf[5] = blockSizeValueToIndex(z.Header.BlockMaxSize) << 4 // Current buffer size: magic(4) + flags(1) + block max size (1). n := 6 @@ -147,28 +224,34 @@ func (z *Writer) Write(buf []byte) (int, error) { // compressBlock compresses a block. func (z *Writer) compressBlock(data []byte) error { if !z.NoChecksum { - z.checksum.Write(data) + _, _ = z.checksum.Write(data) } + if z.c != nil { + c := make(chan zResult) + z.c <- c // Send now to guarantee order + go writerCompressBlock(c, z.Header, data) + return nil + } + + zdata := z.data[z.Header.BlockMaxSize:cap(z.data)] // The compressed block size cannot exceed the input's. var zn int - var err error if level := z.Header.CompressionLevel; level != 0 { - zn, err = CompressBlockHC(data, z.zdata, level) + zn, _ = CompressBlockHC(data, zdata, level) } else { - zn, err = CompressBlock(data, z.zdata, z.hashtable[:]) + zn, _ = CompressBlock(data, zdata, z.hashtable[:]) } - var zdata []byte var bLen uint32 if debugFlag { debug("block compression %d => %d", len(data), zn) } - if err == nil && zn > 0 && zn < len(data) { + if zn > 0 && zn < len(data) { // Compressible and compressed size smaller than uncompressed: ok! bLen = uint32(zn) - zdata = z.zdata[:zn] + zdata = zdata[:zn] } else { // Uncompressed block. bLen = uint32(len(data)) | compressedBlockFlag @@ -182,24 +265,26 @@ func (z *Writer) compressBlock(data []byte) error { if err := z.writeUint32(bLen); err != nil { return err } - if _, err := z.dst.Write(zdata); err != nil { + written, err := z.dst.Write(zdata) + if err != nil { return err } + if h := z.OnBlockDone; h != nil { + h(written) + } - if z.BlockChecksum { - checksum := xxh32.ChecksumZero(zdata) + if !z.BlockChecksum { if debugFlag { - debug("block checksum %x", checksum) - } - if err := z.writeUint32(checksum); err != nil { - return err + debug("current frame checksum %x", z.checksum.Sum32()) } + return nil } + checksum := xxh32.ChecksumZero(zdata) if debugFlag { - debug("current frame checksum %x", z.checksum.Sum32()) + debug("block checksum %x", checksum) + defer func() { debug("current frame checksum %x", z.checksum.Sum32()) }() } - - return nil + return z.writeUint32(checksum) } // Flush flushes any pending compressed data to the underlying writer. @@ -213,7 +298,33 @@ func (z *Writer) Flush() error { return nil } - return z.compressBlock(z.data[:z.idx]) + data := z.data[:z.idx] + z.idx = 0 + if z.c == nil { + return z.compressBlock(data) + } + if !z.NoChecksum { + _, _ = z.checksum.Write(data) + } + c := make(chan zResult) + z.c <- c + writerCompressBlock(c, z.Header, data) + return nil +} + +func (z *Writer) close() error { + if z.c == nil { + return nil + } + // Send a sentinel block (no data to compress) to terminate the writer main goroutine. + c := make(chan zResult) + z.c <- c + c <- zResult{} + // Wait for the main goroutine to complete. + <-c + // At this point the main goroutine has shut down or is about to return. + z.c = nil + return z.err } // Close closes the Writer, flushing any unwritten data to the underlying io.Writer, but does not close the underlying io.Writer. @@ -223,10 +334,13 @@ func (z *Writer) Close() error { return err } } - if err := z.Flush(); err != nil { return err } + if err := z.close(); err != nil { + return err + } + z.freeBuffers() if debugFlag { debug("writing last empty block") @@ -234,28 +348,29 @@ func (z *Writer) Close() error { if err := z.writeUint32(0); err != nil { return err } - if !z.NoChecksum { - checksum := z.checksum.Sum32() - if debugFlag { - debug("stream checksum %x", checksum) - } - if err := z.writeUint32(checksum); err != nil { - return err - } + if z.NoChecksum { + return nil } - return nil + checksum := z.checksum.Sum32() + if debugFlag { + debug("stream checksum %x", checksum) + } + return z.writeUint32(checksum) } // Reset clears the state of the Writer z such that it is equivalent to its // initial state from NewWriter, but instead writing to w. // No access to the underlying io.Writer is performed. func (z *Writer) Reset(w io.Writer) { - z.Header = Header{} + n := cap(z.c) + _ = z.close() + z.freeBuffers() + z.Header.Reset() z.dst = w z.checksum.Reset() - z.zdata = z.zdata[:0] - z.data = z.data[:0] z.idx = 0 + z.err = nil + z.WithConcurrency(n) } // writeUint32 writes a uint32 to the underlying writer. @@ -265,3 +380,29 @@ func (z *Writer) writeUint32(x uint32) error { _, err := z.dst.Write(buf) return err } + +// writerCompressBlock compresses data into a pooled buffer and writes its result +// out to the input channel. +func writerCompressBlock(c chan zResult, header Header, data []byte) { + zdata := getBuffer(header.BlockMaxSize) + // The compressed block size cannot exceed the input's. + var zn int + if level := header.CompressionLevel; level != 0 { + zn, _ = CompressBlockHC(data, zdata, level) + } else { + var hashTable [winSize]int + zn, _ = CompressBlock(data, zdata, hashTable[:]) + } + var res zResult + if zn > 0 && zn < len(data) { + res.size = uint32(zn) + res.data = zdata[:zn] + } else { + res.size = uint32(len(data)) | compressedBlockFlag + res.data = data + } + if header.BlockChecksum { + res.checksum = xxh32.ChecksumZero(res.data) + } + c <- res +} diff --git a/vendor/github.com/pkg/errors/.travis.yml b/vendor/github.com/pkg/errors/.travis.yml index 588ceca18..9159de03e 100644 --- a/vendor/github.com/pkg/errors/.travis.yml +++ b/vendor/github.com/pkg/errors/.travis.yml @@ -1,11 +1,10 @@ language: go go_import_path: github.com/pkg/errors go: - - 1.4.3 - - 1.5.4 - - 1.6.2 - - 1.7.1 + - 1.11.x + - 1.12.x + - 1.13.x - tip script: - - go test -v ./... + - make check diff --git a/vendor/github.com/pkg/errors/Makefile b/vendor/github.com/pkg/errors/Makefile new file mode 100644 index 000000000..ce9d7cded --- /dev/null +++ b/vendor/github.com/pkg/errors/Makefile @@ -0,0 +1,44 @@ +PKGS := github.com/pkg/errors +SRCDIRS := $(shell go list -f '{{.Dir}}' $(PKGS)) +GO := go + +check: test vet gofmt misspell unconvert staticcheck ineffassign unparam + +test: + $(GO) test $(PKGS) + +vet: | test + $(GO) vet $(PKGS) + +staticcheck: + $(GO) get honnef.co/go/tools/cmd/staticcheck + staticcheck -checks all $(PKGS) + +misspell: + $(GO) get github.com/client9/misspell/cmd/misspell + misspell \ + -locale GB \ + -error \ + *.md *.go + +unconvert: + $(GO) get github.com/mdempsky/unconvert + unconvert -v $(PKGS) + +ineffassign: + $(GO) get github.com/gordonklaus/ineffassign + find $(SRCDIRS) -name '*.go' | xargs ineffassign + +pedantic: check errcheck + +unparam: + $(GO) get mvdan.cc/unparam + unparam ./... + +errcheck: + $(GO) get github.com/kisielk/errcheck + errcheck $(PKGS) + +gofmt: + @echo Checking code is gofmted + @test -z "$(shell gofmt -s -l -d -e $(SRCDIRS) | tee /dev/stderr)" diff --git a/vendor/github.com/pkg/errors/README.md b/vendor/github.com/pkg/errors/README.md index 273db3c98..54dfdcb12 100644 --- a/vendor/github.com/pkg/errors/README.md +++ b/vendor/github.com/pkg/errors/README.md @@ -1,4 +1,4 @@ -# errors [![Travis-CI](https://travis-ci.org/pkg/errors.svg)](https://travis-ci.org/pkg/errors) [![AppVeyor](https://ci.appveyor.com/api/projects/status/b98mptawhudj53ep/branch/master?svg=true)](https://ci.appveyor.com/project/davecheney/errors/branch/master) [![GoDoc](https://godoc.org/github.com/pkg/errors?status.svg)](http://godoc.org/github.com/pkg/errors) [![Report card](https://goreportcard.com/badge/github.com/pkg/errors)](https://goreportcard.com/report/github.com/pkg/errors) +# errors [![Travis-CI](https://travis-ci.org/pkg/errors.svg)](https://travis-ci.org/pkg/errors) [![AppVeyor](https://ci.appveyor.com/api/projects/status/b98mptawhudj53ep/branch/master?svg=true)](https://ci.appveyor.com/project/davecheney/errors/branch/master) [![GoDoc](https://godoc.org/github.com/pkg/errors?status.svg)](http://godoc.org/github.com/pkg/errors) [![Report card](https://goreportcard.com/badge/github.com/pkg/errors)](https://goreportcard.com/report/github.com/pkg/errors) [![Sourcegraph](https://sourcegraph.com/github.com/pkg/errors/-/badge.svg)](https://sourcegraph.com/github.com/pkg/errors?badge) Package errors provides simple error handling primitives. @@ -41,12 +41,19 @@ default: [Read the package documentation for more information](https://godoc.org/github.com/pkg/errors). +## Roadmap + +With the upcoming [Go2 error proposals](https://go.googlesource.com/proposal/+/master/design/go2draft.md) this package is moving into maintenance mode. The roadmap for a 1.0 release is as follows: + +- 0.9. Remove pre Go 1.9 and Go 1.10 support, address outstanding pull requests (if possible) +- 1.0. Final release. + ## Contributing -We welcome pull requests, bug fixes and issue reports. With that said, the bar for adding new symbols to this package is intentionally set high. +Because of the Go2 errors changes, this package is not accepting proposals for new functionality. With that said, we welcome pull requests, bug fixes and issue reports. -Before proposing a change, please discuss your change by raising an issue. +Before sending a PR, please discuss your change by raising an issue. -## Licence +## License BSD-2-Clause diff --git a/vendor/github.com/pkg/errors/errors.go b/vendor/github.com/pkg/errors/errors.go index 842ee8045..161aea258 100644 --- a/vendor/github.com/pkg/errors/errors.go +++ b/vendor/github.com/pkg/errors/errors.go @@ -6,7 +6,7 @@ // return err // } // -// which applied recursively up the call stack results in error reports +// which when applied recursively up the call stack results in error reports // without context or debugging information. The errors package allows // programmers to add context to the failure path in their code in a way // that does not destroy the original value of the error. @@ -15,16 +15,17 @@ // // The errors.Wrap function returns a new error that adds context to the // original error by recording a stack trace at the point Wrap is called, -// and the supplied message. For example +// together with the supplied message. For example // // _, err := ioutil.ReadAll(r) // if err != nil { // return errors.Wrap(err, "read failed") // } // -// If additional control is required the errors.WithStack and errors.WithMessage -// functions destructure errors.Wrap into its component operations of annotating -// an error with a stack trace and an a message, respectively. +// If additional control is required, the errors.WithStack and +// errors.WithMessage functions destructure errors.Wrap into its component +// operations: annotating an error with a stack trace and with a message, +// respectively. // // Retrieving the cause of an error // @@ -38,7 +39,7 @@ // } // // can be inspected by errors.Cause. errors.Cause will recursively retrieve -// the topmost error which does not implement causer, which is assumed to be +// the topmost error that does not implement causer, which is assumed to be // the original cause. For example: // // switch err := errors.Cause(err).(type) { @@ -48,16 +49,16 @@ // // unknown error // } // -// causer interface is not exported by this package, but is considered a part -// of stable public API. +// Although the causer interface is not exported by this package, it is +// considered a part of its stable public interface. // // Formatted printing of errors // // All error values returned from this package implement fmt.Formatter and can -// be formatted by the fmt package. The following verbs are supported +// be formatted by the fmt package. The following verbs are supported: // // %s print the error. If the error has a Cause it will be -// printed recursively +// printed recursively. // %v see %s // %+v extended format. Each Frame of the error's StackTrace will // be printed in detail. @@ -65,13 +66,13 @@ // Retrieving the stack trace of an error or wrapper // // New, Errorf, Wrap, and Wrapf record a stack trace at the point they are -// invoked. This information can be retrieved with the following interface. +// invoked. This information can be retrieved with the following interface: // // type stackTracer interface { // StackTrace() errors.StackTrace // } // -// Where errors.StackTrace is defined as +// The returned errors.StackTrace type is defined as // // type StackTrace []Frame // @@ -81,12 +82,12 @@ // // if err, ok := err.(stackTracer); ok { // for _, f := range err.StackTrace() { -// fmt.Printf("%+s:%d", f) +// fmt.Printf("%+s:%d\n", f, f) // } // } // -// stackTracer interface is not exported by this package, but is considered a part -// of stable public API. +// Although the stackTracer interface is not exported by this package, it is +// considered a part of its stable public interface. // // See the documentation for Frame.Format for more details. package errors @@ -158,6 +159,9 @@ type withStack struct { func (w *withStack) Cause() error { return w.error } +// Unwrap provides compatibility for Go 1.13 error chains. +func (w *withStack) Unwrap() error { return w.error } + func (w *withStack) Format(s fmt.State, verb rune) { switch verb { case 'v': @@ -192,7 +196,7 @@ func Wrap(err error, message string) error { } // Wrapf returns an error annotating err with a stack trace -// at the point Wrapf is call, and the format specifier. +// at the point Wrapf is called, and the format specifier. // If err is nil, Wrapf returns nil. func Wrapf(err error, format string, args ...interface{}) error { if err == nil { @@ -220,6 +224,18 @@ func WithMessage(err error, message string) error { } } +// WithMessagef annotates err with the format specifier. +// If err is nil, WithMessagef returns nil. +func WithMessagef(err error, format string, args ...interface{}) error { + if err == nil { + return nil + } + return &withMessage{ + cause: err, + msg: fmt.Sprintf(format, args...), + } +} + type withMessage struct { cause error msg string @@ -228,6 +244,9 @@ type withMessage struct { func (w *withMessage) Error() string { return w.msg + ": " + w.cause.Error() } func (w *withMessage) Cause() error { return w.cause } +// Unwrap provides compatibility for Go 1.13 error chains. +func (w *withMessage) Unwrap() error { return w.cause } + func (w *withMessage) Format(s fmt.State, verb rune) { switch verb { case 'v': diff --git a/vendor/github.com/pkg/errors/go113.go b/vendor/github.com/pkg/errors/go113.go new file mode 100644 index 000000000..be0d10d0c --- /dev/null +++ b/vendor/github.com/pkg/errors/go113.go @@ -0,0 +1,38 @@ +// +build go1.13 + +package errors + +import ( + stderrors "errors" +) + +// Is reports whether any error in err's chain matches target. +// +// The chain consists of err itself followed by the sequence of errors obtained by +// repeatedly calling Unwrap. +// +// An error is considered to match a target if it is equal to that target or if +// it implements a method Is(error) bool such that Is(target) returns true. +func Is(err, target error) bool { return stderrors.Is(err, target) } + +// As finds the first error in err's chain that matches target, and if so, sets +// target to that error value and returns true. +// +// The chain consists of err itself followed by the sequence of errors obtained by +// repeatedly calling Unwrap. +// +// An error matches target if the error's concrete value is assignable to the value +// pointed to by target, or if the error has a method As(interface{}) bool such that +// As(target) returns true. In the latter case, the As method is responsible for +// setting target. +// +// As will panic if target is not a non-nil pointer to either a type that implements +// error, or to any interface type. As returns false if err is nil. +func As(err error, target interface{}) bool { return stderrors.As(err, target) } + +// Unwrap returns the result of calling the Unwrap method on err, if err's +// type contains an Unwrap method returning error. +// Otherwise, Unwrap returns nil. +func Unwrap(err error) error { + return stderrors.Unwrap(err) +} diff --git a/vendor/github.com/pkg/errors/stack.go b/vendor/github.com/pkg/errors/stack.go index 6b1f2891a..779a8348f 100644 --- a/vendor/github.com/pkg/errors/stack.go +++ b/vendor/github.com/pkg/errors/stack.go @@ -5,10 +5,13 @@ import ( "io" "path" "runtime" + "strconv" "strings" ) // Frame represents a program counter inside a stack frame. +// For historical reasons if Frame is interpreted as a uintptr +// its value represents the program counter + 1. type Frame uintptr // pc returns the program counter for this frame; @@ -37,6 +40,15 @@ func (f Frame) line() int { return line } +// name returns the name of this function, if known. +func (f Frame) name() string { + fn := runtime.FuncForPC(f.pc()) + if fn == nil { + return "unknown" + } + return fn.Name() +} + // Format formats the frame according to the fmt.Formatter interface. // // %s source file @@ -46,29 +58,24 @@ func (f Frame) line() int { // // Format accepts flags that alter the printing of some verbs, as follows: // -// %+s path of source file relative to the compile time GOPATH +// %+s function name and path of source file relative to the compile time +// GOPATH separated by \n\t (\n\t) // %+v equivalent to %+s:%d func (f Frame) Format(s fmt.State, verb rune) { switch verb { case 's': switch { case s.Flag('+'): - pc := f.pc() - fn := runtime.FuncForPC(pc) - if fn == nil { - io.WriteString(s, "unknown") - } else { - file, _ := fn.FileLine(pc) - fmt.Fprintf(s, "%s\n\t%s", fn.Name(), file) - } + io.WriteString(s, f.name()) + io.WriteString(s, "\n\t") + io.WriteString(s, f.file()) default: io.WriteString(s, path.Base(f.file())) } case 'd': - fmt.Fprintf(s, "%d", f.line()) + io.WriteString(s, strconv.Itoa(f.line())) case 'n': - name := runtime.FuncForPC(f.pc()).Name() - io.WriteString(s, funcname(name)) + io.WriteString(s, funcname(f.name())) case 'v': f.Format(s, 's') io.WriteString(s, ":") @@ -76,25 +83,57 @@ func (f Frame) Format(s fmt.State, verb rune) { } } +// MarshalText formats a stacktrace Frame as a text string. The output is the +// same as that of fmt.Sprintf("%+v", f), but without newlines or tabs. +func (f Frame) MarshalText() ([]byte, error) { + name := f.name() + if name == "unknown" { + return []byte(name), nil + } + return []byte(fmt.Sprintf("%s %s:%d", name, f.file(), f.line())), nil +} + // StackTrace is stack of Frames from innermost (newest) to outermost (oldest). type StackTrace []Frame +// Format formats the stack of Frames according to the fmt.Formatter interface. +// +// %s lists source files for each Frame in the stack +// %v lists the source file and line number for each Frame in the stack +// +// Format accepts flags that alter the printing of some verbs, as follows: +// +// %+v Prints filename, function, and line number for each Frame in the stack. func (st StackTrace) Format(s fmt.State, verb rune) { switch verb { case 'v': switch { case s.Flag('+'): for _, f := range st { - fmt.Fprintf(s, "\n%+v", f) + io.WriteString(s, "\n") + f.Format(s, verb) } case s.Flag('#'): fmt.Fprintf(s, "%#v", []Frame(st)) default: - fmt.Fprintf(s, "%v", []Frame(st)) + st.formatSlice(s, verb) } case 's': - fmt.Fprintf(s, "%s", []Frame(st)) + st.formatSlice(s, verb) + } +} + +// formatSlice will format this StackTrace into the given buffer as a slice of +// Frame, only valid when called with '%s' or '%v'. +func (st StackTrace) formatSlice(s fmt.State, verb rune) { + io.WriteString(s, "[") + for i, f := range st { + if i > 0 { + io.WriteString(s, " ") + } + f.Format(s, verb) } + io.WriteString(s, "]") } // stack represents a stack of program counters. @@ -136,43 +175,3 @@ func funcname(name string) string { i = strings.Index(name, ".") return name[i+1:] } - -func trimGOPATH(name, file string) string { - // Here we want to get the source file path relative to the compile time - // GOPATH. As of Go 1.6.x there is no direct way to know the compiled - // GOPATH at runtime, but we can infer the number of path segments in the - // GOPATH. We note that fn.Name() returns the function name qualified by - // the import path, which does not include the GOPATH. Thus we can trim - // segments from the beginning of the file path until the number of path - // separators remaining is one more than the number of path separators in - // the function name. For example, given: - // - // GOPATH /home/user - // file /home/user/src/pkg/sub/file.go - // fn.Name() pkg/sub.Type.Method - // - // We want to produce: - // - // pkg/sub/file.go - // - // From this we can easily see that fn.Name() has one less path separator - // than our desired output. We count separators from the end of the file - // path until it finds two more than in the function name and then move - // one character forward to preserve the initial path segment without a - // leading separator. - const sep = "/" - goal := strings.Count(name, sep) + 2 - i := len(file) - for n := 0; n < goal; n++ { - i = strings.LastIndex(file[:i], sep) - if i == -1 { - // not enough separators found, set i so that the slice expression - // below leaves file unmodified - i = -len(sep) - break - } - } - // get back to 0 or trim the leading separator - file = file[i+len(sep):] - return file -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/build_info.go b/vendor/github.com/prometheus/client_golang/prometheus/build_info.go new file mode 100644 index 000000000..288f0e854 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/build_info.go @@ -0,0 +1,29 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build go1.12 + +package prometheus + +import "runtime/debug" + +// readBuildInfo is a wrapper around debug.ReadBuildInfo for Go 1.12+. +func readBuildInfo() (path, version, sum string) { + path, version, sum = "unknown", "unknown", "unknown" + if bi, ok := debug.ReadBuildInfo(); ok { + path = bi.Main.Path + version = bi.Main.Version + sum = bi.Main.Sum + } + return +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/build_info_pre_1.12.go b/vendor/github.com/prometheus/client_golang/prometheus/build_info_pre_1.12.go new file mode 100644 index 000000000..6609e2877 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/build_info_pre_1.12.go @@ -0,0 +1,22 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !go1.12 + +package prometheus + +// readBuildInfo is a wrapper around debug.ReadBuildInfo for Go versions before +// 1.12. Remove this whole file once the minimum supported Go version is 1.12. +func readBuildInfo() (path, version, sum string) { + return "unknown", "unknown", "unknown" +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/collector.go b/vendor/github.com/prometheus/client_golang/prometheus/collector.go index c0d70b2fa..1e839650d 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/collector.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/collector.go @@ -79,7 +79,7 @@ type Collector interface { // of the Describe method. If a Collector sometimes collects no metrics at all // (for example vectors like CounterVec, GaugeVec, etc., which only collect // metrics after a metric with a fully specified label set has been accessed), -// it might even get registered as an unchecked Collecter (cf. the Register +// it might even get registered as an unchecked Collector (cf. the Register // method of the Registerer interface). Hence, only use this shortcut // implementation of Describe if you are certain to fulfill the contract. // diff --git a/vendor/github.com/prometheus/client_golang/prometheus/desc.go b/vendor/github.com/prometheus/client_golang/prometheus/desc.go index 7b8827ffb..1d034f871 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/desc.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/desc.go @@ -93,7 +93,7 @@ func NewDesc(fqName, help string, variableLabels []string, constLabels Labels) * // First add only the const label names and sort them... for labelName := range constLabels { if !checkLabelName(labelName) { - d.err = fmt.Errorf("%q is not a valid label name", labelName) + d.err = fmt.Errorf("%q is not a valid label name for metric %q", labelName, fqName) return d } labelNames = append(labelNames, labelName) @@ -115,7 +115,7 @@ func NewDesc(fqName, help string, variableLabels []string, constLabels Labels) * // dimension with a different mix between preset and variable labels. for _, labelName := range variableLabels { if !checkLabelName(labelName) { - d.err = fmt.Errorf("%q is not a valid label name", labelName) + d.err = fmt.Errorf("%q is not a valid label name for metric %q", labelName, fqName) return d } labelNames = append(labelNames, "$"+labelName) diff --git a/vendor/github.com/prometheus/client_golang/prometheus/doc.go b/vendor/github.com/prometheus/client_golang/prometheus/doc.go index 5d9525def..01977de66 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/doc.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/doc.go @@ -122,13 +122,13 @@ // the Collect method. The Describe method has to return separate Desc // instances, representative of the “throw-away” metrics to be created later. // NewDesc comes in handy to create those Desc instances. Alternatively, you -// could return no Desc at all, which will marke the Collector “unchecked”. No -// checks are porformed at registration time, but metric consistency will still +// could return no Desc at all, which will mark the Collector “unchecked”. No +// checks are performed at registration time, but metric consistency will still // be ensured at scrape time, i.e. any inconsistencies will lead to scrape // errors. Thus, with unchecked Collectors, the responsibility to not collect // metrics that lead to inconsistencies in the total scrape result lies with the // implementer of the Collector. While this is not a desirable state, it is -// sometimes necessary. The typical use case is a situatios where the exact +// sometimes necessary. The typical use case is a situation where the exact // metrics to be returned by a Collector cannot be predicted at registration // time, but the implementer has sufficient knowledge of the whole system to // guarantee metric consistency. @@ -183,7 +183,6 @@ // method can then expose the gathered metrics in some way. Usually, the metrics // are served via HTTP on the /metrics endpoint. That's happening in the example // above. The tools to expose metrics via HTTP are in the promhttp sub-package. -// (The top-level functions in the prometheus package are deprecated.) // // Pushing to the Pushgateway // diff --git a/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go b/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go index ba3b9333e..dc9247fed 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go @@ -14,9 +14,9 @@ package prometheus import ( - "fmt" "runtime" "runtime/debug" + "sync" "time" ) @@ -26,16 +26,41 @@ type goCollector struct { gcDesc *Desc goInfoDesc *Desc - // metrics to describe and collect - metrics memStatsMetrics + // ms... are memstats related. + msLast *runtime.MemStats // Previously collected memstats. + msLastTimestamp time.Time + msMtx sync.Mutex // Protects msLast and msLastTimestamp. + msMetrics memStatsMetrics + msRead func(*runtime.MemStats) // For mocking in tests. + msMaxWait time.Duration // Wait time for fresh memstats. + msMaxAge time.Duration // Maximum allowed age of old memstats. } -// NewGoCollector returns a collector which exports metrics about the current Go +// NewGoCollector returns a collector that exports metrics about the current Go // process. This includes memory stats. To collect those, runtime.ReadMemStats -// is called. This causes a stop-the-world, which is very short with Go1.9+ -// (~25µs). However, with older Go versions, the stop-the-world duration depends -// on the heap size and can be quite significant (~1.7 ms/GiB as per +// is called. This requires to “stop the world”, which usually only happens for +// garbage collection (GC). Take the following implications into account when +// deciding whether to use the Go collector: +// +// 1. The performance impact of stopping the world is the more relevant the more +// frequently metrics are collected. However, with Go1.9 or later the +// stop-the-world time per metrics collection is very short (~25µs) so that the +// performance impact will only matter in rare cases. However, with older Go +// versions, the stop-the-world duration depends on the heap size and can be +// quite significant (~1.7 ms/GiB as per // https://go-review.googlesource.com/c/go/+/34937). +// +// 2. During an ongoing GC, nothing else can stop the world. Therefore, if the +// metrics collection happens to coincide with GC, it will only complete after +// GC has finished. Usually, GC is fast enough to not cause problems. However, +// with a very large heap, GC might take multiple seconds, which is enough to +// cause scrape timeouts in common setups. To avoid this problem, the Go +// collector will use the memstats from a previous collection if +// runtime.ReadMemStats takes more than 1s. However, if there are no previously +// collected memstats, or their collection is more than 5m ago, the collection +// will block until runtime.ReadMemStats succeeds. (The problem might be solved +// in Go1.13, see https://github.com/golang/go/issues/19812 for the related Go +// issue.) func NewGoCollector() Collector { return &goCollector{ goroutinesDesc: NewDesc( @@ -54,7 +79,11 @@ func NewGoCollector() Collector { "go_info", "Information about the Go environment.", nil, Labels{"version": runtime.Version()}), - metrics: memStatsMetrics{ + msLast: &runtime.MemStats{}, + msRead: runtime.ReadMemStats, + msMaxWait: time.Second, + msMaxAge: 5 * time.Minute, + msMetrics: memStatsMetrics{ { desc: NewDesc( memstatNamespace("alloc_bytes"), @@ -253,7 +282,7 @@ func NewGoCollector() Collector { } func memstatNamespace(s string) string { - return fmt.Sprintf("go_memstats_%s", s) + return "go_memstats_" + s } // Describe returns all descriptions of the collector. @@ -262,13 +291,27 @@ func (c *goCollector) Describe(ch chan<- *Desc) { ch <- c.threadsDesc ch <- c.gcDesc ch <- c.goInfoDesc - for _, i := range c.metrics { + for _, i := range c.msMetrics { ch <- i.desc } } // Collect returns the current state of all metrics of the collector. func (c *goCollector) Collect(ch chan<- Metric) { + var ( + ms = &runtime.MemStats{} + done = make(chan struct{}) + ) + // Start reading memstats first as it might take a while. + go func() { + c.msRead(ms) + c.msMtx.Lock() + c.msLast = ms + c.msLastTimestamp = time.Now() + c.msMtx.Unlock() + close(done) + }() + ch <- MustNewConstMetric(c.goroutinesDesc, GaugeValue, float64(runtime.NumGoroutine())) n, _ := runtime.ThreadCreateProfile(nil) ch <- MustNewConstMetric(c.threadsDesc, GaugeValue, float64(n)) @@ -286,9 +329,31 @@ func (c *goCollector) Collect(ch chan<- Metric) { ch <- MustNewConstMetric(c.goInfoDesc, GaugeValue, 1) - ms := &runtime.MemStats{} - runtime.ReadMemStats(ms) - for _, i := range c.metrics { + timer := time.NewTimer(c.msMaxWait) + select { + case <-done: // Our own ReadMemStats succeeded in time. Use it. + timer.Stop() // Important for high collection frequencies to not pile up timers. + c.msCollect(ch, ms) + return + case <-timer.C: // Time out, use last memstats if possible. Continue below. + } + c.msMtx.Lock() + if time.Since(c.msLastTimestamp) < c.msMaxAge { + // Last memstats are recent enough. Collect from them under the lock. + c.msCollect(ch, c.msLast) + c.msMtx.Unlock() + return + } + // If we are here, the last memstats are too old or don't exist. We have + // to wait until our own ReadMemStats finally completes. For that to + // happen, we have to release the lock. + c.msMtx.Unlock() + <-done + c.msCollect(ch, ms) +} + +func (c *goCollector) msCollect(ch chan<- Metric, ms *runtime.MemStats) { + for _, i := range c.msMetrics { ch <- MustNewConstMetric(i.desc, i.valType, i.eval(ms)) } } @@ -299,3 +364,33 @@ type memStatsMetrics []struct { eval func(*runtime.MemStats) float64 valType ValueType } + +// NewBuildInfoCollector returns a collector collecting a single metric +// "go_build_info" with the constant value 1 and three labels "path", "version", +// and "checksum". Their label values contain the main module path, version, and +// checksum, respectively. The labels will only have meaningful values if the +// binary is built with Go module support and from source code retrieved from +// the source repository (rather than the local file system). This is usually +// accomplished by building from outside of GOPATH, specifying the full address +// of the main package, e.g. "GO111MODULE=on go run +// github.com/prometheus/client_golang/examples/random". If built without Go +// module support, all label values will be "unknown". If built with Go module +// support but using the source code from the local file system, the "path" will +// be set appropriately, but "checksum" will be empty and "version" will be +// "(devel)". +// +// This collector uses only the build information for the main module. See +// https://github.com/povilasv/prommod for an example of a collector for the +// module dependencies. +func NewBuildInfoCollector() Collector { + path, version, sum := readBuildInfo() + c := &selfCollector{MustNewConstMetric( + NewDesc( + "go_build_info", + "Build information about the main Go module.", + nil, Labels{"path": path, "version": version, "checksum": sum}, + ), + GaugeValue, 1)} + c.init(c.self) + return c +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/histogram.go b/vendor/github.com/prometheus/client_golang/prometheus/histogram.go index f88da707b..d7ea67bd2 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/histogram.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/histogram.go @@ -204,8 +204,8 @@ func newHistogram(desc *Desc, opts HistogramOpts, labelValues ...string) Histogr } } } - // Finally we know the final length of h.upperBounds and can make counts - // for both states: + // Finally we know the final length of h.upperBounds and can make buckets + // for both counts: h.counts[0].buckets = make([]uint64, len(h.upperBounds)) h.counts[1].buckets = make([]uint64, len(h.upperBounds)) @@ -224,18 +224,21 @@ type histogramCounts struct { } type histogram struct { - // countAndHotIdx is a complicated one. For lock-free yet atomic - // observations, we need to save the total count of observations again, - // combined with the index of the currently-hot counts struct, so that - // we can perform the operation on both values atomically. The least - // significant bit defines the hot counts struct. The remaining 63 bits - // represent the total count of observations. This happens under the - // assumption that the 63bit count will never overflow. Rationale: An - // observations takes about 30ns. Let's assume it could happen in - // 10ns. Overflowing the counter will then take at least (2^63)*10ns, - // which is about 3000 years. + // countAndHotIdx enables lock-free writes with use of atomic updates. + // The most significant bit is the hot index [0 or 1] of the count field + // below. Observe calls update the hot one. All remaining bits count the + // number of Observe calls. Observe starts by incrementing this counter, + // and finish by incrementing the count field in the respective + // histogramCounts, as a marker for completion. // - // This has to be first in the struct for 64bit alignment. See + // Calls of the Write method (which are non-mutating reads from the + // perspective of the histogram) swap the hot–cold under the writeMtx + // lock. A cooldown is awaited (while locked) by comparing the number of + // observations with the initiation count. Once they match, then the + // last observation on the now cool one has completed. All cool fields must + // be merged into the new hot before releasing writeMtx. + // + // Fields with atomic access first! See alignment constraint: // http://golang.org/pkg/sync/atomic/#pkg-note-BUG countAndHotIdx uint64 @@ -243,16 +246,14 @@ type histogram struct { desc *Desc writeMtx sync.Mutex // Only used in the Write method. - upperBounds []float64 - // Two counts, one is "hot" for lock-free observations, the other is // "cold" for writing out a dto.Metric. It has to be an array of // pointers to guarantee 64bit alignment of the histogramCounts, see // http://golang.org/pkg/sync/atomic/#pkg-note-BUG. counts [2]*histogramCounts - hotIdx int // Index of currently-hot counts. Only used within Write. - labelPairs []*dto.LabelPair + upperBounds []float64 + labelPairs []*dto.LabelPair } func (h *histogram) Desc() *Desc { @@ -271,11 +272,11 @@ func (h *histogram) Observe(v float64) { // 300 buckets: 154 ns/op linear - binary 61.6 ns/op i := sort.SearchFloat64s(h.upperBounds, v) - // We increment h.countAndHotIdx by 2 so that the counter in the upper - // 63 bits gets incremented by 1. At the same time, we get the new value + // We increment h.countAndHotIdx so that the counter in the lower + // 63 bits gets incremented. At the same time, we get the new value // back, which we can use to find the currently-hot counts. - n := atomic.AddUint64(&h.countAndHotIdx, 2) - hotCounts := h.counts[n%2] + n := atomic.AddUint64(&h.countAndHotIdx, 1) + hotCounts := h.counts[n>>63] if i < len(h.upperBounds) { atomic.AddUint64(&hotCounts.buckets[i], 1) @@ -293,72 +294,43 @@ func (h *histogram) Observe(v float64) { } func (h *histogram) Write(out *dto.Metric) error { - var ( - his = &dto.Histogram{} - buckets = make([]*dto.Bucket, len(h.upperBounds)) - hotCounts, coldCounts *histogramCounts - count uint64 - ) - - // For simplicity, we mutex the rest of this method. It is not in the - // hot path, i.e. Observe is called much more often than Write. The - // complication of making Write lock-free isn't worth it. + // For simplicity, we protect this whole method by a mutex. It is not in + // the hot path, i.e. Observe is called much more often than Write. The + // complication of making Write lock-free isn't worth it, if possible at + // all. h.writeMtx.Lock() defer h.writeMtx.Unlock() - // This is a bit arcane, which is why the following spells out this if - // clause in English: - // - // If the currently-hot counts struct is #0, we atomically increment - // h.countAndHotIdx by 1 so that from now on Observe will use the counts - // struct #1. Furthermore, the atomic increment gives us the new value, - // which, in its most significant 63 bits, tells us the count of - // observations done so far up to and including currently ongoing - // observations still using the counts struct just changed from hot to - // cold. To have a normal uint64 for the count, we bitshift by 1 and - // save the result in count. We also set h.hotIdx to 1 for the next - // Write call, and we will refer to counts #1 as hotCounts and to counts - // #0 as coldCounts. - // - // If the currently-hot counts struct is #1, we do the corresponding - // things the other way round. We have to _decrement_ h.countAndHotIdx - // (which is a bit arcane in itself, as we have to express -1 with an - // unsigned int...). - if h.hotIdx == 0 { - count = atomic.AddUint64(&h.countAndHotIdx, 1) >> 1 - h.hotIdx = 1 - hotCounts = h.counts[1] - coldCounts = h.counts[0] - } else { - count = atomic.AddUint64(&h.countAndHotIdx, ^uint64(0)) >> 1 // Decrement. - h.hotIdx = 0 - hotCounts = h.counts[0] - coldCounts = h.counts[1] - } - - // Now we have to wait for the now-declared-cold counts to actually cool - // down, i.e. wait for all observations still using it to finish. That's - // the case once the count in the cold counts struct is the same as the - // one atomically retrieved from the upper 63bits of h.countAndHotIdx. - for { - if count == atomic.LoadUint64(&coldCounts.count) { - break - } + // Adding 1<<63 switches the hot index (from 0 to 1 or from 1 to 0) + // without touching the count bits. See the struct comments for a full + // description of the algorithm. + n := atomic.AddUint64(&h.countAndHotIdx, 1<<63) + // count is contained unchanged in the lower 63 bits. + count := n & ((1 << 63) - 1) + // The most significant bit tells us which counts is hot. The complement + // is thus the cold one. + hotCounts := h.counts[n>>63] + coldCounts := h.counts[(^n)>>63] + + // Await cooldown. + for count != atomic.LoadUint64(&coldCounts.count) { runtime.Gosched() // Let observations get work done. } - his.SampleCount = proto.Uint64(count) - his.SampleSum = proto.Float64(math.Float64frombits(atomic.LoadUint64(&coldCounts.sumBits))) + his := &dto.Histogram{ + Bucket: make([]*dto.Bucket, len(h.upperBounds)), + SampleCount: proto.Uint64(count), + SampleSum: proto.Float64(math.Float64frombits(atomic.LoadUint64(&coldCounts.sumBits))), + } var cumCount uint64 for i, upperBound := range h.upperBounds { cumCount += atomic.LoadUint64(&coldCounts.buckets[i]) - buckets[i] = &dto.Bucket{ + his.Bucket[i] = &dto.Bucket{ CumulativeCount: proto.Uint64(cumCount), UpperBound: proto.Float64(upperBound), } } - his.Bucket = buckets out.Histogram = his out.Label = h.labelPairs diff --git a/vendor/github.com/prometheus/client_golang/prometheus/http.go b/vendor/github.com/prometheus/client_golang/prometheus/http.go deleted file mode 100644 index 9f0875bfc..000000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/http.go +++ /dev/null @@ -1,504 +0,0 @@ -// Copyright 2014 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package prometheus - -import ( - "bufio" - "compress/gzip" - "io" - "net" - "net/http" - "strconv" - "strings" - "sync" - "time" - - "github.com/prometheus/common/expfmt" -) - -// TODO(beorn7): Remove this whole file. It is a partial mirror of -// promhttp/http.go (to avoid circular import chains) where everything HTTP -// related should live. The functions here are just for avoiding -// breakage. Everything is deprecated. - -const ( - contentTypeHeader = "Content-Type" - contentLengthHeader = "Content-Length" - contentEncodingHeader = "Content-Encoding" - acceptEncodingHeader = "Accept-Encoding" -) - -var gzipPool = sync.Pool{ - New: func() interface{} { - return gzip.NewWriter(nil) - }, -} - -// Handler returns an HTTP handler for the DefaultGatherer. It is -// already instrumented with InstrumentHandler (using "prometheus" as handler -// name). -// -// Deprecated: Please note the issues described in the doc comment of -// InstrumentHandler. You might want to consider using promhttp.Handler instead. -func Handler() http.Handler { - return InstrumentHandler("prometheus", UninstrumentedHandler()) -} - -// UninstrumentedHandler returns an HTTP handler for the DefaultGatherer. -// -// Deprecated: Use promhttp.HandlerFor(DefaultGatherer, promhttp.HandlerOpts{}) -// instead. See there for further documentation. -func UninstrumentedHandler() http.Handler { - return http.HandlerFunc(func(rsp http.ResponseWriter, req *http.Request) { - mfs, err := DefaultGatherer.Gather() - if err != nil { - httpError(rsp, err) - return - } - - contentType := expfmt.Negotiate(req.Header) - header := rsp.Header() - header.Set(contentTypeHeader, string(contentType)) - - w := io.Writer(rsp) - if gzipAccepted(req.Header) { - header.Set(contentEncodingHeader, "gzip") - gz := gzipPool.Get().(*gzip.Writer) - defer gzipPool.Put(gz) - - gz.Reset(w) - defer gz.Close() - - w = gz - } - - enc := expfmt.NewEncoder(w, contentType) - - for _, mf := range mfs { - if err := enc.Encode(mf); err != nil { - httpError(rsp, err) - return - } - } - }) -} - -var instLabels = []string{"method", "code"} - -type nower interface { - Now() time.Time -} - -type nowFunc func() time.Time - -func (n nowFunc) Now() time.Time { - return n() -} - -var now nower = nowFunc(func() time.Time { - return time.Now() -}) - -// InstrumentHandler wraps the given HTTP handler for instrumentation. It -// registers four metric collectors (if not already done) and reports HTTP -// metrics to the (newly or already) registered collectors: http_requests_total -// (CounterVec), http_request_duration_microseconds (Summary), -// http_request_size_bytes (Summary), http_response_size_bytes (Summary). Each -// has a constant label named "handler" with the provided handlerName as -// value. http_requests_total is a metric vector partitioned by HTTP method -// (label name "method") and HTTP status code (label name "code"). -// -// Deprecated: InstrumentHandler has several issues. Use the tooling provided in -// package promhttp instead. The issues are the following: (1) It uses Summaries -// rather than Histograms. Summaries are not useful if aggregation across -// multiple instances is required. (2) It uses microseconds as unit, which is -// deprecated and should be replaced by seconds. (3) The size of the request is -// calculated in a separate goroutine. Since this calculator requires access to -// the request header, it creates a race with any writes to the header performed -// during request handling. httputil.ReverseProxy is a prominent example for a -// handler performing such writes. (4) It has additional issues with HTTP/2, cf. -// https://github.com/prometheus/client_golang/issues/272. -func InstrumentHandler(handlerName string, handler http.Handler) http.HandlerFunc { - return InstrumentHandlerFunc(handlerName, handler.ServeHTTP) -} - -// InstrumentHandlerFunc wraps the given function for instrumentation. It -// otherwise works in the same way as InstrumentHandler (and shares the same -// issues). -// -// Deprecated: InstrumentHandlerFunc is deprecated for the same reasons as -// InstrumentHandler is. Use the tooling provided in package promhttp instead. -func InstrumentHandlerFunc(handlerName string, handlerFunc func(http.ResponseWriter, *http.Request)) http.HandlerFunc { - return InstrumentHandlerFuncWithOpts( - SummaryOpts{ - Subsystem: "http", - ConstLabels: Labels{"handler": handlerName}, - Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, - }, - handlerFunc, - ) -} - -// InstrumentHandlerWithOpts works like InstrumentHandler (and shares the same -// issues) but provides more flexibility (at the cost of a more complex call -// syntax). As InstrumentHandler, this function registers four metric -// collectors, but it uses the provided SummaryOpts to create them. However, the -// fields "Name" and "Help" in the SummaryOpts are ignored. "Name" is replaced -// by "requests_total", "request_duration_microseconds", "request_size_bytes", -// and "response_size_bytes", respectively. "Help" is replaced by an appropriate -// help string. The names of the variable labels of the http_requests_total -// CounterVec are "method" (get, post, etc.), and "code" (HTTP status code). -// -// If InstrumentHandlerWithOpts is called as follows, it mimics exactly the -// behavior of InstrumentHandler: -// -// prometheus.InstrumentHandlerWithOpts( -// prometheus.SummaryOpts{ -// Subsystem: "http", -// ConstLabels: prometheus.Labels{"handler": handlerName}, -// }, -// handler, -// ) -// -// Technical detail: "requests_total" is a CounterVec, not a SummaryVec, so it -// cannot use SummaryOpts. Instead, a CounterOpts struct is created internally, -// and all its fields are set to the equally named fields in the provided -// SummaryOpts. -// -// Deprecated: InstrumentHandlerWithOpts is deprecated for the same reasons as -// InstrumentHandler is. Use the tooling provided in package promhttp instead. -func InstrumentHandlerWithOpts(opts SummaryOpts, handler http.Handler) http.HandlerFunc { - return InstrumentHandlerFuncWithOpts(opts, handler.ServeHTTP) -} - -// InstrumentHandlerFuncWithOpts works like InstrumentHandlerFunc (and shares -// the same issues) but provides more flexibility (at the cost of a more complex -// call syntax). See InstrumentHandlerWithOpts for details how the provided -// SummaryOpts are used. -// -// Deprecated: InstrumentHandlerFuncWithOpts is deprecated for the same reasons -// as InstrumentHandler is. Use the tooling provided in package promhttp instead. -func InstrumentHandlerFuncWithOpts(opts SummaryOpts, handlerFunc func(http.ResponseWriter, *http.Request)) http.HandlerFunc { - reqCnt := NewCounterVec( - CounterOpts{ - Namespace: opts.Namespace, - Subsystem: opts.Subsystem, - Name: "requests_total", - Help: "Total number of HTTP requests made.", - ConstLabels: opts.ConstLabels, - }, - instLabels, - ) - if err := Register(reqCnt); err != nil { - if are, ok := err.(AlreadyRegisteredError); ok { - reqCnt = are.ExistingCollector.(*CounterVec) - } else { - panic(err) - } - } - - opts.Name = "request_duration_microseconds" - opts.Help = "The HTTP request latencies in microseconds." - reqDur := NewSummary(opts) - if err := Register(reqDur); err != nil { - if are, ok := err.(AlreadyRegisteredError); ok { - reqDur = are.ExistingCollector.(Summary) - } else { - panic(err) - } - } - - opts.Name = "request_size_bytes" - opts.Help = "The HTTP request sizes in bytes." - reqSz := NewSummary(opts) - if err := Register(reqSz); err != nil { - if are, ok := err.(AlreadyRegisteredError); ok { - reqSz = are.ExistingCollector.(Summary) - } else { - panic(err) - } - } - - opts.Name = "response_size_bytes" - opts.Help = "The HTTP response sizes in bytes." - resSz := NewSummary(opts) - if err := Register(resSz); err != nil { - if are, ok := err.(AlreadyRegisteredError); ok { - resSz = are.ExistingCollector.(Summary) - } else { - panic(err) - } - } - - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - now := time.Now() - - delegate := &responseWriterDelegator{ResponseWriter: w} - out := computeApproximateRequestSize(r) - - _, cn := w.(http.CloseNotifier) - _, fl := w.(http.Flusher) - _, hj := w.(http.Hijacker) - _, rf := w.(io.ReaderFrom) - var rw http.ResponseWriter - if cn && fl && hj && rf { - rw = &fancyResponseWriterDelegator{delegate} - } else { - rw = delegate - } - handlerFunc(rw, r) - - elapsed := float64(time.Since(now)) / float64(time.Microsecond) - - method := sanitizeMethod(r.Method) - code := sanitizeCode(delegate.status) - reqCnt.WithLabelValues(method, code).Inc() - reqDur.Observe(elapsed) - resSz.Observe(float64(delegate.written)) - reqSz.Observe(float64(<-out)) - }) -} - -func computeApproximateRequestSize(r *http.Request) <-chan int { - // Get URL length in current goroutine for avoiding a race condition. - // HandlerFunc that runs in parallel may modify the URL. - s := 0 - if r.URL != nil { - s += len(r.URL.String()) - } - - out := make(chan int, 1) - - go func() { - s += len(r.Method) - s += len(r.Proto) - for name, values := range r.Header { - s += len(name) - for _, value := range values { - s += len(value) - } - } - s += len(r.Host) - - // N.B. r.Form and r.MultipartForm are assumed to be included in r.URL. - - if r.ContentLength != -1 { - s += int(r.ContentLength) - } - out <- s - close(out) - }() - - return out -} - -type responseWriterDelegator struct { - http.ResponseWriter - - status int - written int64 - wroteHeader bool -} - -func (r *responseWriterDelegator) WriteHeader(code int) { - r.status = code - r.wroteHeader = true - r.ResponseWriter.WriteHeader(code) -} - -func (r *responseWriterDelegator) Write(b []byte) (int, error) { - if !r.wroteHeader { - r.WriteHeader(http.StatusOK) - } - n, err := r.ResponseWriter.Write(b) - r.written += int64(n) - return n, err -} - -type fancyResponseWriterDelegator struct { - *responseWriterDelegator -} - -func (f *fancyResponseWriterDelegator) CloseNotify() <-chan bool { - return f.ResponseWriter.(http.CloseNotifier).CloseNotify() -} - -func (f *fancyResponseWriterDelegator) Flush() { - f.ResponseWriter.(http.Flusher).Flush() -} - -func (f *fancyResponseWriterDelegator) Hijack() (net.Conn, *bufio.ReadWriter, error) { - return f.ResponseWriter.(http.Hijacker).Hijack() -} - -func (f *fancyResponseWriterDelegator) ReadFrom(r io.Reader) (int64, error) { - if !f.wroteHeader { - f.WriteHeader(http.StatusOK) - } - n, err := f.ResponseWriter.(io.ReaderFrom).ReadFrom(r) - f.written += n - return n, err -} - -func sanitizeMethod(m string) string { - switch m { - case "GET", "get": - return "get" - case "PUT", "put": - return "put" - case "HEAD", "head": - return "head" - case "POST", "post": - return "post" - case "DELETE", "delete": - return "delete" - case "CONNECT", "connect": - return "connect" - case "OPTIONS", "options": - return "options" - case "NOTIFY", "notify": - return "notify" - default: - return strings.ToLower(m) - } -} - -func sanitizeCode(s int) string { - switch s { - case 100: - return "100" - case 101: - return "101" - - case 200: - return "200" - case 201: - return "201" - case 202: - return "202" - case 203: - return "203" - case 204: - return "204" - case 205: - return "205" - case 206: - return "206" - - case 300: - return "300" - case 301: - return "301" - case 302: - return "302" - case 304: - return "304" - case 305: - return "305" - case 307: - return "307" - - case 400: - return "400" - case 401: - return "401" - case 402: - return "402" - case 403: - return "403" - case 404: - return "404" - case 405: - return "405" - case 406: - return "406" - case 407: - return "407" - case 408: - return "408" - case 409: - return "409" - case 410: - return "410" - case 411: - return "411" - case 412: - return "412" - case 413: - return "413" - case 414: - return "414" - case 415: - return "415" - case 416: - return "416" - case 417: - return "417" - case 418: - return "418" - - case 500: - return "500" - case 501: - return "501" - case 502: - return "502" - case 503: - return "503" - case 504: - return "504" - case 505: - return "505" - - case 428: - return "428" - case 429: - return "429" - case 431: - return "431" - case 511: - return "511" - - default: - return strconv.Itoa(s) - } -} - -// gzipAccepted returns whether the client will accept gzip-encoded content. -func gzipAccepted(header http.Header) bool { - a := header.Get(acceptEncodingHeader) - parts := strings.Split(a, ",") - for _, part := range parts { - part = strings.TrimSpace(part) - if part == "gzip" || strings.HasPrefix(part, "gzip;") { - return true - } - } - return false -} - -// httpError removes any content-encoding header and then calls http.Error with -// the provided error and http.StatusInternalServerErrer. Error contents is -// supposed to be uncompressed plain text. However, same as with a plain -// http.Error, any header settings will be void if the header has already been -// sent. The error message will still be written to the writer, but it will -// probably be of limited use. -func httpError(rsp http.ResponseWriter, err error) { - rsp.Header().Del(contentEncodingHeader) - http.Error( - rsp, - "An error has occurred while serving metrics:\n\n"+err.Error(), - http.StatusInternalServerError, - ) -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go b/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go index 55176d58c..9b8097942 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go @@ -16,8 +16,6 @@ package prometheus import ( "errors" "os" - - "github.com/prometheus/procfs" ) type processCollector struct { @@ -59,20 +57,9 @@ type ProcessCollectorOpts struct { // collector for the current process with an empty namespace string and no error // reporting. // -// Currently, the collector depends on a Linux-style proc filesystem and -// therefore only exports metrics for Linux. -// -// Note: An older version of this function had the following signature: -// -// NewProcessCollector(pid int, namespace string) Collector -// -// Most commonly, it was called as -// -// NewProcessCollector(os.Getpid(), "") -// -// The following call of the current version is equivalent to the above: -// -// NewProcessCollector(ProcessCollectorOpts{}) +// The collector only works on operating systems with a Linux-style proc +// filesystem and on Microsoft Windows. On other operating systems, it will not +// collect any metrics. func NewProcessCollector(opts ProcessCollectorOpts) Collector { ns := "" if len(opts.Namespace) > 0 { @@ -126,7 +113,7 @@ func NewProcessCollector(opts ProcessCollectorOpts) Collector { } // Set up process metric collection if supported by the runtime. - if _, err := procfs.NewStat(); err == nil { + if canCollectProcess() { c.collectFn = c.processCollect } else { c.collectFn = func(ch chan<- Metric) { @@ -153,46 +140,6 @@ func (c *processCollector) Collect(ch chan<- Metric) { c.collectFn(ch) } -func (c *processCollector) processCollect(ch chan<- Metric) { - pid, err := c.pidFn() - if err != nil { - c.reportError(ch, nil, err) - return - } - - p, err := procfs.NewProc(pid) - if err != nil { - c.reportError(ch, nil, err) - return - } - - if stat, err := p.NewStat(); err == nil { - ch <- MustNewConstMetric(c.cpuTotal, CounterValue, stat.CPUTime()) - ch <- MustNewConstMetric(c.vsize, GaugeValue, float64(stat.VirtualMemory())) - ch <- MustNewConstMetric(c.rss, GaugeValue, float64(stat.ResidentMemory())) - if startTime, err := stat.StartTime(); err == nil { - ch <- MustNewConstMetric(c.startTime, GaugeValue, startTime) - } else { - c.reportError(ch, c.startTime, err) - } - } else { - c.reportError(ch, nil, err) - } - - if fds, err := p.FileDescriptorsLen(); err == nil { - ch <- MustNewConstMetric(c.openFDs, GaugeValue, float64(fds)) - } else { - c.reportError(ch, c.openFDs, err) - } - - if limits, err := p.NewLimits(); err == nil { - ch <- MustNewConstMetric(c.maxFDs, GaugeValue, float64(limits.OpenFiles)) - ch <- MustNewConstMetric(c.maxVsize, GaugeValue, float64(limits.AddressSpace)) - } else { - c.reportError(ch, nil, err) - } -} - func (c *processCollector) reportError(ch chan<- Metric, desc *Desc, err error) { if !c.reportErrors { return diff --git a/vendor/github.com/prometheus/client_golang/prometheus/process_collector_other.go b/vendor/github.com/prometheus/client_golang/prometheus/process_collector_other.go new file mode 100644 index 000000000..3117461cd --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/process_collector_other.go @@ -0,0 +1,65 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !windows + +package prometheus + +import ( + "github.com/prometheus/procfs" +) + +func canCollectProcess() bool { + _, err := procfs.NewDefaultFS() + return err == nil +} + +func (c *processCollector) processCollect(ch chan<- Metric) { + pid, err := c.pidFn() + if err != nil { + c.reportError(ch, nil, err) + return + } + + p, err := procfs.NewProc(pid) + if err != nil { + c.reportError(ch, nil, err) + return + } + + if stat, err := p.Stat(); err == nil { + ch <- MustNewConstMetric(c.cpuTotal, CounterValue, stat.CPUTime()) + ch <- MustNewConstMetric(c.vsize, GaugeValue, float64(stat.VirtualMemory())) + ch <- MustNewConstMetric(c.rss, GaugeValue, float64(stat.ResidentMemory())) + if startTime, err := stat.StartTime(); err == nil { + ch <- MustNewConstMetric(c.startTime, GaugeValue, startTime) + } else { + c.reportError(ch, c.startTime, err) + } + } else { + c.reportError(ch, nil, err) + } + + if fds, err := p.FileDescriptorsLen(); err == nil { + ch <- MustNewConstMetric(c.openFDs, GaugeValue, float64(fds)) + } else { + c.reportError(ch, c.openFDs, err) + } + + if limits, err := p.Limits(); err == nil { + ch <- MustNewConstMetric(c.maxFDs, GaugeValue, float64(limits.OpenFiles)) + ch <- MustNewConstMetric(c.maxVsize, GaugeValue, float64(limits.AddressSpace)) + } else { + c.reportError(ch, nil, err) + } +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/process_collector_windows.go b/vendor/github.com/prometheus/client_golang/prometheus/process_collector_windows.go new file mode 100644 index 000000000..e0b935d1f --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/process_collector_windows.go @@ -0,0 +1,112 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "syscall" + "unsafe" + + "golang.org/x/sys/windows" +) + +func canCollectProcess() bool { + return true +} + +var ( + modpsapi = syscall.NewLazyDLL("psapi.dll") + modkernel32 = syscall.NewLazyDLL("kernel32.dll") + + procGetProcessMemoryInfo = modpsapi.NewProc("GetProcessMemoryInfo") + procGetProcessHandleCount = modkernel32.NewProc("GetProcessHandleCount") +) + +type processMemoryCounters struct { + // https://docs.microsoft.com/en-us/windows/desktop/api/psapi/ns-psapi-_process_memory_counters_ex + _ uint32 + PageFaultCount uint32 + PeakWorkingSetSize uint64 + WorkingSetSize uint64 + QuotaPeakPagedPoolUsage uint64 + QuotaPagedPoolUsage uint64 + QuotaPeakNonPagedPoolUsage uint64 + QuotaNonPagedPoolUsage uint64 + PagefileUsage uint64 + PeakPagefileUsage uint64 + PrivateUsage uint64 +} + +func getProcessMemoryInfo(handle windows.Handle) (processMemoryCounters, error) { + mem := processMemoryCounters{} + r1, _, err := procGetProcessMemoryInfo.Call( + uintptr(handle), + uintptr(unsafe.Pointer(&mem)), + uintptr(unsafe.Sizeof(mem)), + ) + if r1 != 1 { + return mem, err + } else { + return mem, nil + } +} + +func getProcessHandleCount(handle windows.Handle) (uint32, error) { + var count uint32 + r1, _, err := procGetProcessHandleCount.Call( + uintptr(handle), + uintptr(unsafe.Pointer(&count)), + ) + if r1 != 1 { + return 0, err + } else { + return count, nil + } +} + +func (c *processCollector) processCollect(ch chan<- Metric) { + h, err := windows.GetCurrentProcess() + if err != nil { + c.reportError(ch, nil, err) + return + } + + var startTime, exitTime, kernelTime, userTime windows.Filetime + err = windows.GetProcessTimes(h, &startTime, &exitTime, &kernelTime, &userTime) + if err != nil { + c.reportError(ch, nil, err) + return + } + ch <- MustNewConstMetric(c.startTime, GaugeValue, float64(startTime.Nanoseconds()/1e9)) + ch <- MustNewConstMetric(c.cpuTotal, CounterValue, fileTimeToSeconds(kernelTime)+fileTimeToSeconds(userTime)) + + mem, err := getProcessMemoryInfo(h) + if err != nil { + c.reportError(ch, nil, err) + return + } + ch <- MustNewConstMetric(c.vsize, GaugeValue, float64(mem.PrivateUsage)) + ch <- MustNewConstMetric(c.rss, GaugeValue, float64(mem.WorkingSetSize)) + + handles, err := getProcessHandleCount(h) + if err != nil { + c.reportError(ch, nil, err) + return + } + ch <- MustNewConstMetric(c.openFDs, GaugeValue, float64(handles)) + ch <- MustNewConstMetric(c.maxFDs, GaugeValue, float64(16*1024*1024)) // Windows has a hard-coded max limit, not per-process. +} + +func fileTimeToSeconds(ft windows.Filetime) float64 { + return float64(uint64(ft.HighDateTime)<<32+uint64(ft.LowDateTime)) / 1e7 +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go index 67b56d37c..fa535684f 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go @@ -38,7 +38,6 @@ type delegator interface { type responseWriterDelegator struct { http.ResponseWriter - handler, method string status int written int64 wroteHeader bool @@ -75,8 +74,11 @@ type closeNotifierDelegator struct{ *responseWriterDelegator } type flusherDelegator struct{ *responseWriterDelegator } type hijackerDelegator struct{ *responseWriterDelegator } type readerFromDelegator struct{ *responseWriterDelegator } +type pusherDelegator struct{ *responseWriterDelegator } func (d closeNotifierDelegator) CloseNotify() <-chan bool { + //lint:ignore SA1019 http.CloseNotifier is deprecated but we don't want to + //remove support from client_golang yet. return d.ResponseWriter.(http.CloseNotifier).CloseNotify() } func (d flusherDelegator) Flush() { @@ -93,6 +95,9 @@ func (d readerFromDelegator) ReadFrom(re io.Reader) (int64, error) { d.written += n return n, err } +func (d pusherDelegator) Push(target string, opts *http.PushOptions) error { + return d.ResponseWriter.(http.Pusher).Push(target, opts) +} var pickDelegator = make([]func(*responseWriterDelegator) delegator, 32) @@ -196,4 +201,157 @@ func init() { http.CloseNotifier }{d, readerFromDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} } + pickDelegator[pusher] = func(d *responseWriterDelegator) delegator { // 16 + return pusherDelegator{d} + } + pickDelegator[pusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 17 + return struct { + *responseWriterDelegator + http.Pusher + http.CloseNotifier + }{d, pusherDelegator{d}, closeNotifierDelegator{d}} + } + pickDelegator[pusher+flusher] = func(d *responseWriterDelegator) delegator { // 18 + return struct { + *responseWriterDelegator + http.Pusher + http.Flusher + }{d, pusherDelegator{d}, flusherDelegator{d}} + } + pickDelegator[pusher+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 19 + return struct { + *responseWriterDelegator + http.Pusher + http.Flusher + http.CloseNotifier + }{d, pusherDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} + } + pickDelegator[pusher+hijacker] = func(d *responseWriterDelegator) delegator { // 20 + return struct { + *responseWriterDelegator + http.Pusher + http.Hijacker + }{d, pusherDelegator{d}, hijackerDelegator{d}} + } + pickDelegator[pusher+hijacker+closeNotifier] = func(d *responseWriterDelegator) delegator { // 21 + return struct { + *responseWriterDelegator + http.Pusher + http.Hijacker + http.CloseNotifier + }{d, pusherDelegator{d}, hijackerDelegator{d}, closeNotifierDelegator{d}} + } + pickDelegator[pusher+hijacker+flusher] = func(d *responseWriterDelegator) delegator { // 22 + return struct { + *responseWriterDelegator + http.Pusher + http.Hijacker + http.Flusher + }{d, pusherDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}} + } + pickDelegator[pusher+hijacker+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { //23 + return struct { + *responseWriterDelegator + http.Pusher + http.Hijacker + http.Flusher + http.CloseNotifier + }{d, pusherDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} + } + pickDelegator[pusher+readerFrom] = func(d *responseWriterDelegator) delegator { // 24 + return struct { + *responseWriterDelegator + http.Pusher + io.ReaderFrom + }{d, pusherDelegator{d}, readerFromDelegator{d}} + } + pickDelegator[pusher+readerFrom+closeNotifier] = func(d *responseWriterDelegator) delegator { // 25 + return struct { + *responseWriterDelegator + http.Pusher + io.ReaderFrom + http.CloseNotifier + }{d, pusherDelegator{d}, readerFromDelegator{d}, closeNotifierDelegator{d}} + } + pickDelegator[pusher+readerFrom+flusher] = func(d *responseWriterDelegator) delegator { // 26 + return struct { + *responseWriterDelegator + http.Pusher + io.ReaderFrom + http.Flusher + }{d, pusherDelegator{d}, readerFromDelegator{d}, flusherDelegator{d}} + } + pickDelegator[pusher+readerFrom+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 27 + return struct { + *responseWriterDelegator + http.Pusher + io.ReaderFrom + http.Flusher + http.CloseNotifier + }{d, pusherDelegator{d}, readerFromDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} + } + pickDelegator[pusher+readerFrom+hijacker] = func(d *responseWriterDelegator) delegator { // 28 + return struct { + *responseWriterDelegator + http.Pusher + io.ReaderFrom + http.Hijacker + }{d, pusherDelegator{d}, readerFromDelegator{d}, hijackerDelegator{d}} + } + pickDelegator[pusher+readerFrom+hijacker+closeNotifier] = func(d *responseWriterDelegator) delegator { // 29 + return struct { + *responseWriterDelegator + http.Pusher + io.ReaderFrom + http.Hijacker + http.CloseNotifier + }{d, pusherDelegator{d}, readerFromDelegator{d}, hijackerDelegator{d}, closeNotifierDelegator{d}} + } + pickDelegator[pusher+readerFrom+hijacker+flusher] = func(d *responseWriterDelegator) delegator { // 30 + return struct { + *responseWriterDelegator + http.Pusher + io.ReaderFrom + http.Hijacker + http.Flusher + }{d, pusherDelegator{d}, readerFromDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}} + } + pickDelegator[pusher+readerFrom+hijacker+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 31 + return struct { + *responseWriterDelegator + http.Pusher + io.ReaderFrom + http.Hijacker + http.Flusher + http.CloseNotifier + }{d, pusherDelegator{d}, readerFromDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} + } +} + +func newDelegator(w http.ResponseWriter, observeWriteHeaderFunc func(int)) delegator { + d := &responseWriterDelegator{ + ResponseWriter: w, + observeWriteHeader: observeWriteHeaderFunc, + } + + id := 0 + //lint:ignore SA1019 http.CloseNotifier is deprecated but we don't want to + //remove support from client_golang yet. + if _, ok := w.(http.CloseNotifier); ok { + id += closeNotifier + } + if _, ok := w.(http.Flusher); ok { + id += flusher + } + if _, ok := w.(http.Hijacker); ok { + id += hijacker + } + if _, ok := w.(io.ReaderFrom); ok { + id += readerFrom + } + if _, ok := w.(http.Pusher); ok { + id += pusher + } + + return pickDelegator[id](d) } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator_1_8.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator_1_8.go deleted file mode 100644 index 31a706956..000000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator_1_8.go +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright 2017 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build go1.8 - -package promhttp - -import ( - "io" - "net/http" -) - -type pusherDelegator struct{ *responseWriterDelegator } - -func (d pusherDelegator) Push(target string, opts *http.PushOptions) error { - return d.ResponseWriter.(http.Pusher).Push(target, opts) -} - -func init() { - pickDelegator[pusher] = func(d *responseWriterDelegator) delegator { // 16 - return pusherDelegator{d} - } - pickDelegator[pusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 17 - return struct { - *responseWriterDelegator - http.Pusher - http.CloseNotifier - }{d, pusherDelegator{d}, closeNotifierDelegator{d}} - } - pickDelegator[pusher+flusher] = func(d *responseWriterDelegator) delegator { // 18 - return struct { - *responseWriterDelegator - http.Pusher - http.Flusher - }{d, pusherDelegator{d}, flusherDelegator{d}} - } - pickDelegator[pusher+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 19 - return struct { - *responseWriterDelegator - http.Pusher - http.Flusher - http.CloseNotifier - }{d, pusherDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} - } - pickDelegator[pusher+hijacker] = func(d *responseWriterDelegator) delegator { // 20 - return struct { - *responseWriterDelegator - http.Pusher - http.Hijacker - }{d, pusherDelegator{d}, hijackerDelegator{d}} - } - pickDelegator[pusher+hijacker+closeNotifier] = func(d *responseWriterDelegator) delegator { // 21 - return struct { - *responseWriterDelegator - http.Pusher - http.Hijacker - http.CloseNotifier - }{d, pusherDelegator{d}, hijackerDelegator{d}, closeNotifierDelegator{d}} - } - pickDelegator[pusher+hijacker+flusher] = func(d *responseWriterDelegator) delegator { // 22 - return struct { - *responseWriterDelegator - http.Pusher - http.Hijacker - http.Flusher - }{d, pusherDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}} - } - pickDelegator[pusher+hijacker+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { //23 - return struct { - *responseWriterDelegator - http.Pusher - http.Hijacker - http.Flusher - http.CloseNotifier - }{d, pusherDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} - } - pickDelegator[pusher+readerFrom] = func(d *responseWriterDelegator) delegator { // 24 - return struct { - *responseWriterDelegator - http.Pusher - io.ReaderFrom - }{d, pusherDelegator{d}, readerFromDelegator{d}} - } - pickDelegator[pusher+readerFrom+closeNotifier] = func(d *responseWriterDelegator) delegator { // 25 - return struct { - *responseWriterDelegator - http.Pusher - io.ReaderFrom - http.CloseNotifier - }{d, pusherDelegator{d}, readerFromDelegator{d}, closeNotifierDelegator{d}} - } - pickDelegator[pusher+readerFrom+flusher] = func(d *responseWriterDelegator) delegator { // 26 - return struct { - *responseWriterDelegator - http.Pusher - io.ReaderFrom - http.Flusher - }{d, pusherDelegator{d}, readerFromDelegator{d}, flusherDelegator{d}} - } - pickDelegator[pusher+readerFrom+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 27 - return struct { - *responseWriterDelegator - http.Pusher - io.ReaderFrom - http.Flusher - http.CloseNotifier - }{d, pusherDelegator{d}, readerFromDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} - } - pickDelegator[pusher+readerFrom+hijacker] = func(d *responseWriterDelegator) delegator { // 28 - return struct { - *responseWriterDelegator - http.Pusher - io.ReaderFrom - http.Hijacker - }{d, pusherDelegator{d}, readerFromDelegator{d}, hijackerDelegator{d}} - } - pickDelegator[pusher+readerFrom+hijacker+closeNotifier] = func(d *responseWriterDelegator) delegator { // 29 - return struct { - *responseWriterDelegator - http.Pusher - io.ReaderFrom - http.Hijacker - http.CloseNotifier - }{d, pusherDelegator{d}, readerFromDelegator{d}, hijackerDelegator{d}, closeNotifierDelegator{d}} - } - pickDelegator[pusher+readerFrom+hijacker+flusher] = func(d *responseWriterDelegator) delegator { // 30 - return struct { - *responseWriterDelegator - http.Pusher - io.ReaderFrom - http.Hijacker - http.Flusher - }{d, pusherDelegator{d}, readerFromDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}} - } - pickDelegator[pusher+readerFrom+hijacker+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 31 - return struct { - *responseWriterDelegator - http.Pusher - io.ReaderFrom - http.Hijacker - http.Flusher - http.CloseNotifier - }{d, pusherDelegator{d}, readerFromDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} - } -} - -func newDelegator(w http.ResponseWriter, observeWriteHeaderFunc func(int)) delegator { - d := &responseWriterDelegator{ - ResponseWriter: w, - observeWriteHeader: observeWriteHeaderFunc, - } - - id := 0 - if _, ok := w.(http.CloseNotifier); ok { - id += closeNotifier - } - if _, ok := w.(http.Flusher); ok { - id += flusher - } - if _, ok := w.(http.Hijacker); ok { - id += hijacker - } - if _, ok := w.(io.ReaderFrom); ok { - id += readerFrom - } - if _, ok := w.(http.Pusher); ok { - id += pusher - } - - return pickDelegator[id](d) -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator_pre_1_8.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator_pre_1_8.go deleted file mode 100644 index 8bb9b8b68..000000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator_pre_1_8.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2017 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build !go1.8 - -package promhttp - -import ( - "io" - "net/http" -) - -func newDelegator(w http.ResponseWriter, observeWriteHeaderFunc func(int)) delegator { - d := &responseWriterDelegator{ - ResponseWriter: w, - observeWriteHeader: observeWriteHeaderFunc, - } - - id := 0 - if _, ok := w.(http.CloseNotifier); ok { - id += closeNotifier - } - if _, ok := w.(http.Flusher); ok { - id += flusher - } - if _, ok := w.(http.Hijacker); ok { - id += hijacker - } - if _, ok := w.(io.ReaderFrom); ok { - id += readerFrom - } - - return pickDelegator[id](d) -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go index 668eb6b3c..cea5a90fd 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go @@ -47,7 +47,6 @@ import ( const ( contentTypeHeader = "Content-Type" - contentLengthHeader = "Content-Length" contentEncodingHeader = "Content-Encoding" acceptEncodingHeader = "Accept-Encoding" ) @@ -85,10 +84,32 @@ func Handler() http.Handler { // instrumentation. Use the InstrumentMetricHandler function to apply the same // kind of instrumentation as it is used by the Handler function. func HandlerFor(reg prometheus.Gatherer, opts HandlerOpts) http.Handler { - var inFlightSem chan struct{} + var ( + inFlightSem chan struct{} + errCnt = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "promhttp_metric_handler_errors_total", + Help: "Total number of internal errors encountered by the promhttp metric handler.", + }, + []string{"cause"}, + ) + ) + if opts.MaxRequestsInFlight > 0 { inFlightSem = make(chan struct{}, opts.MaxRequestsInFlight) } + if opts.Registry != nil { + // Initialize all possibilites that can occur below. + errCnt.WithLabelValues("gathering") + errCnt.WithLabelValues("encoding") + if err := opts.Registry.Register(errCnt); err != nil { + if are, ok := err.(prometheus.AlreadyRegisteredError); ok { + errCnt = are.ExistingCollector.(*prometheus.CounterVec) + } else { + panic(err) + } + } + } h := http.HandlerFunc(func(rsp http.ResponseWriter, req *http.Request) { if inFlightSem != nil { @@ -107,6 +128,7 @@ func HandlerFor(reg prometheus.Gatherer, opts HandlerOpts) http.Handler { if opts.ErrorLog != nil { opts.ErrorLog.Println("error gathering metrics:", err) } + errCnt.WithLabelValues("gathering").Inc() switch opts.ErrorHandling { case PanicOnError: panic(err) @@ -147,6 +169,7 @@ func HandlerFor(reg prometheus.Gatherer, opts HandlerOpts) http.Handler { if opts.ErrorLog != nil { opts.ErrorLog.Println("error encoding and sending metric family:", err) } + errCnt.WithLabelValues("encoding").Inc() switch opts.ErrorHandling { case PanicOnError: panic(err) @@ -237,9 +260,12 @@ const ( // Ignore errors and try to serve as many metrics as possible. However, // if no metrics can be served, serve an HTTP status code 500 and the // last error message in the body. Only use this in deliberate "best - // effort" metrics collection scenarios. It is recommended to at least - // log errors (by providing an ErrorLog in HandlerOpts) to not mask - // errors completely. + // effort" metrics collection scenarios. In this case, it is highly + // recommended to provide other means of detecting errors: By setting an + // ErrorLog in HandlerOpts, the errors are logged. By providing a + // Registry in HandlerOpts, the exposed metrics include an error counter + // "promhttp_metric_handler_errors_total", which can be used for + // alerts. ContinueOnError // Panic upon the first error encountered (useful for "crash only" apps). PanicOnError @@ -262,6 +288,18 @@ type HandlerOpts struct { // logged regardless of the configured ErrorHandling provided ErrorLog // is not nil. ErrorHandling HandlerErrorHandling + // If Registry is not nil, it is used to register a metric + // "promhttp_metric_handler_errors_total", partitioned by "cause". A + // failed registration causes a panic. Note that this error counter is + // different from the instrumentation you get from the various + // InstrumentHandler... helpers. It counts errors that don't necessarily + // result in a non-2xx HTTP status code. There are two typical cases: + // (1) Encoding errors that only happen after streaming of the HTTP body + // has already started (and the status code 200 has been sent). This + // should only happen with custom collectors. (2) Collection errors with + // no effect on the HTTP status code because ErrorHandling is set to + // ContinueOnError. + Registry prometheus.Registerer // If DisableCompression is true, the handler will never compress the // response, even if requested by the client. DisableCompression bool diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go index 86fd56447..83c49b66a 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go @@ -14,7 +14,9 @@ package promhttp import ( + "crypto/tls" "net/http" + "net/http/httptrace" "time" "github.com/prometheus/client_golang/prometheus" @@ -95,3 +97,123 @@ func InstrumentRoundTripperDuration(obs prometheus.ObserverVec, next http.RoundT return resp, err }) } + +// InstrumentTrace is used to offer flexibility in instrumenting the available +// httptrace.ClientTrace hook functions. Each function is passed a float64 +// representing the time in seconds since the start of the http request. A user +// may choose to use separately buckets Histograms, or implement custom +// instance labels on a per function basis. +type InstrumentTrace struct { + GotConn func(float64) + PutIdleConn func(float64) + GotFirstResponseByte func(float64) + Got100Continue func(float64) + DNSStart func(float64) + DNSDone func(float64) + ConnectStart func(float64) + ConnectDone func(float64) + TLSHandshakeStart func(float64) + TLSHandshakeDone func(float64) + WroteHeaders func(float64) + Wait100Continue func(float64) + WroteRequest func(float64) +} + +// InstrumentRoundTripperTrace is a middleware that wraps the provided +// RoundTripper and reports times to hook functions provided in the +// InstrumentTrace struct. Hook functions that are not present in the provided +// InstrumentTrace struct are ignored. Times reported to the hook functions are +// time since the start of the request. Only with Go1.9+, those times are +// guaranteed to never be negative. (Earlier Go versions are not using a +// monotonic clock.) Note that partitioning of Histograms is expensive and +// should be used judiciously. +// +// For hook functions that receive an error as an argument, no observations are +// made in the event of a non-nil error value. +// +// See the example for ExampleInstrumentRoundTripperDuration for example usage. +func InstrumentRoundTripperTrace(it *InstrumentTrace, next http.RoundTripper) RoundTripperFunc { + return RoundTripperFunc(func(r *http.Request) (*http.Response, error) { + start := time.Now() + + trace := &httptrace.ClientTrace{ + GotConn: func(_ httptrace.GotConnInfo) { + if it.GotConn != nil { + it.GotConn(time.Since(start).Seconds()) + } + }, + PutIdleConn: func(err error) { + if err != nil { + return + } + if it.PutIdleConn != nil { + it.PutIdleConn(time.Since(start).Seconds()) + } + }, + DNSStart: func(_ httptrace.DNSStartInfo) { + if it.DNSStart != nil { + it.DNSStart(time.Since(start).Seconds()) + } + }, + DNSDone: func(_ httptrace.DNSDoneInfo) { + if it.DNSDone != nil { + it.DNSDone(time.Since(start).Seconds()) + } + }, + ConnectStart: func(_, _ string) { + if it.ConnectStart != nil { + it.ConnectStart(time.Since(start).Seconds()) + } + }, + ConnectDone: func(_, _ string, err error) { + if err != nil { + return + } + if it.ConnectDone != nil { + it.ConnectDone(time.Since(start).Seconds()) + } + }, + GotFirstResponseByte: func() { + if it.GotFirstResponseByte != nil { + it.GotFirstResponseByte(time.Since(start).Seconds()) + } + }, + Got100Continue: func() { + if it.Got100Continue != nil { + it.Got100Continue(time.Since(start).Seconds()) + } + }, + TLSHandshakeStart: func() { + if it.TLSHandshakeStart != nil { + it.TLSHandshakeStart(time.Since(start).Seconds()) + } + }, + TLSHandshakeDone: func(_ tls.ConnectionState, err error) { + if err != nil { + return + } + if it.TLSHandshakeDone != nil { + it.TLSHandshakeDone(time.Since(start).Seconds()) + } + }, + WroteHeaders: func() { + if it.WroteHeaders != nil { + it.WroteHeaders(time.Since(start).Seconds()) + } + }, + Wait100Continue: func() { + if it.Wait100Continue != nil { + it.Wait100Continue(time.Since(start).Seconds()) + } + }, + WroteRequest: func(_ httptrace.WroteRequestInfo) { + if it.WroteRequest != nil { + it.WroteRequest(time.Since(start).Seconds()) + } + }, + } + r = r.WithContext(httptrace.WithClientTrace(r.Context(), trace)) + + return next.RoundTrip(r) + }) +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client_1_8.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client_1_8.go deleted file mode 100644 index a034d1ec0..000000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client_1_8.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright 2017 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build go1.8 - -package promhttp - -import ( - "context" - "crypto/tls" - "net/http" - "net/http/httptrace" - "time" -) - -// InstrumentTrace is used to offer flexibility in instrumenting the available -// httptrace.ClientTrace hook functions. Each function is passed a float64 -// representing the time in seconds since the start of the http request. A user -// may choose to use separately buckets Histograms, or implement custom -// instance labels on a per function basis. -type InstrumentTrace struct { - GotConn func(float64) - PutIdleConn func(float64) - GotFirstResponseByte func(float64) - Got100Continue func(float64) - DNSStart func(float64) - DNSDone func(float64) - ConnectStart func(float64) - ConnectDone func(float64) - TLSHandshakeStart func(float64) - TLSHandshakeDone func(float64) - WroteHeaders func(float64) - Wait100Continue func(float64) - WroteRequest func(float64) -} - -// InstrumentRoundTripperTrace is a middleware that wraps the provided -// RoundTripper and reports times to hook functions provided in the -// InstrumentTrace struct. Hook functions that are not present in the provided -// InstrumentTrace struct are ignored. Times reported to the hook functions are -// time since the start of the request. Only with Go1.9+, those times are -// guaranteed to never be negative. (Earlier Go versions are not using a -// monotonic clock.) Note that partitioning of Histograms is expensive and -// should be used judiciously. -// -// For hook functions that receive an error as an argument, no observations are -// made in the event of a non-nil error value. -// -// See the example for ExampleInstrumentRoundTripperDuration for example usage. -func InstrumentRoundTripperTrace(it *InstrumentTrace, next http.RoundTripper) RoundTripperFunc { - return RoundTripperFunc(func(r *http.Request) (*http.Response, error) { - start := time.Now() - - trace := &httptrace.ClientTrace{ - GotConn: func(_ httptrace.GotConnInfo) { - if it.GotConn != nil { - it.GotConn(time.Since(start).Seconds()) - } - }, - PutIdleConn: func(err error) { - if err != nil { - return - } - if it.PutIdleConn != nil { - it.PutIdleConn(time.Since(start).Seconds()) - } - }, - DNSStart: func(_ httptrace.DNSStartInfo) { - if it.DNSStart != nil { - it.DNSStart(time.Since(start).Seconds()) - } - }, - DNSDone: func(_ httptrace.DNSDoneInfo) { - if it.DNSDone != nil { - it.DNSDone(time.Since(start).Seconds()) - } - }, - ConnectStart: func(_, _ string) { - if it.ConnectStart != nil { - it.ConnectStart(time.Since(start).Seconds()) - } - }, - ConnectDone: func(_, _ string, err error) { - if err != nil { - return - } - if it.ConnectDone != nil { - it.ConnectDone(time.Since(start).Seconds()) - } - }, - GotFirstResponseByte: func() { - if it.GotFirstResponseByte != nil { - it.GotFirstResponseByte(time.Since(start).Seconds()) - } - }, - Got100Continue: func() { - if it.Got100Continue != nil { - it.Got100Continue(time.Since(start).Seconds()) - } - }, - TLSHandshakeStart: func() { - if it.TLSHandshakeStart != nil { - it.TLSHandshakeStart(time.Since(start).Seconds()) - } - }, - TLSHandshakeDone: func(_ tls.ConnectionState, err error) { - if err != nil { - return - } - if it.TLSHandshakeDone != nil { - it.TLSHandshakeDone(time.Since(start).Seconds()) - } - }, - WroteHeaders: func() { - if it.WroteHeaders != nil { - it.WroteHeaders(time.Since(start).Seconds()) - } - }, - Wait100Continue: func() { - if it.Wait100Continue != nil { - it.Wait100Continue(time.Since(start).Seconds()) - } - }, - WroteRequest: func(_ httptrace.WroteRequestInfo) { - if it.WroteRequest != nil { - it.WroteRequest(time.Since(start).Seconds()) - } - }, - } - r = r.WithContext(httptrace.WithClientTrace(context.Background(), trace)) - - return next.RoundTrip(r) - }) -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/registry.go b/vendor/github.com/prometheus/client_golang/prometheus/registry.go index f98c81a86..6c32516aa 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/registry.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/registry.go @@ -325,9 +325,17 @@ func (r *Registry) Register(c Collector) error { return nil } if existing, exists := r.collectorsByID[collectorID]; exists { - return AlreadyRegisteredError{ - ExistingCollector: existing, - NewCollector: c, + switch e := existing.(type) { + case *wrappingCollector: + return AlreadyRegisteredError{ + ExistingCollector: e.unwrapRecursively(), + NewCollector: c, + } + default: + return AlreadyRegisteredError{ + ExistingCollector: e, + NewCollector: c, + } } } // If the collectorID is new, but at least one of the descs existed @@ -680,7 +688,7 @@ func processMetric( // Gatherers is a slice of Gatherer instances that implements the Gatherer // interface itself. Its Gather method calls Gather on all Gatherers in the // slice in order and returns the merged results. Errors returned from the -// Gather calles are all returned in a flattened MultiError. Duplicate and +// Gather calls are all returned in a flattened MultiError. Duplicate and // inconsistent Metrics are skipped (first occurrence in slice order wins) and // reported in the returned error. // @@ -872,7 +880,13 @@ func checkMetricConsistency( h = hashAddByte(h, separatorByte) // Make sure label pairs are sorted. We depend on it for the consistency // check. - sort.Sort(labelPairSorter(dtoMetric.Label)) + if !sort.IsSorted(labelPairSorter(dtoMetric.Label)) { + // We cannot sort dtoMetric.Label in place as it is immutable by contract. + copiedLabels := make([]*dto.LabelPair, len(dtoMetric.Label)) + copy(copiedLabels, dtoMetric.Label) + sort.Sort(labelPairSorter(copiedLabels)) + dtoMetric.Label = copiedLabels + } for _, lp := range dtoMetric.Label { h = hashAdd(h, lp.GetName()) h = hashAddByte(h, separatorByte) @@ -903,8 +917,8 @@ func checkDescConsistency( } // Is the desc consistent with the content of the metric? - lpsFromDesc := make([]*dto.LabelPair, 0, len(dtoMetric.Label)) - lpsFromDesc = append(lpsFromDesc, desc.constLabelPairs...) + lpsFromDesc := make([]*dto.LabelPair, len(desc.constLabelPairs), len(dtoMetric.Label)) + copy(lpsFromDesc, desc.constLabelPairs) for _, l := range desc.variableLabels { lpsFromDesc = append(lpsFromDesc, &dto.LabelPair{ Name: proto.String(l), diff --git a/vendor/github.com/prometheus/client_golang/prometheus/summary.go b/vendor/github.com/prometheus/client_golang/prometheus/summary.go index 2980614df..c970fdee0 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/summary.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/summary.go @@ -16,8 +16,10 @@ package prometheus import ( "fmt" "math" + "runtime" "sort" "sync" + "sync/atomic" "time" "github.com/beorn7/perks/quantile" @@ -37,7 +39,7 @@ const quantileLabel = "quantile" // A typical use-case is the observation of request latencies. By default, a // Summary provides the median, the 90th and the 99th percentile of the latency // as rank estimations. However, the default behavior will change in the -// upcoming v0.10 of the library. There will be no rank estimations at all by +// upcoming v1.0.0 of the library. There will be no rank estimations at all by // default. For a sane transition, it is recommended to set the desired rank // estimations explicitly. // @@ -56,16 +58,8 @@ type Summary interface { Observe(float64) } -// DefObjectives are the default Summary quantile values. -// -// Deprecated: DefObjectives will not be used as the default objectives in -// v0.10 of the library. The default Summary will have no quantiles then. -var ( - DefObjectives = map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001} - - errQuantileLabelNotAllowed = fmt.Errorf( - "%q is not allowed as label name in summaries", quantileLabel, - ) +var errQuantileLabelNotAllowed = fmt.Errorf( + "%q is not allowed as label name in summaries", quantileLabel, ) // Default values for SummaryOpts. @@ -84,7 +78,7 @@ const ( // mandatory to set Name to a non-empty string. While all other fields are // optional and can safely be left at their zero value, it is recommended to set // a help string and to explicitly set the Objectives field to the desired value -// as the default value will change in the upcoming v0.10 of the library. +// as the default value will change in the upcoming v1.0.0 of the library. type SummaryOpts struct { // Namespace, Subsystem, and Name are components of the fully-qualified // name of the Summary (created by joining these components with @@ -121,13 +115,8 @@ type SummaryOpts struct { // Objectives defines the quantile rank estimates with their respective // absolute error. If Objectives[q] = e, then the value reported for q // will be the φ-quantile value for some φ between q-e and q+e. The - // default value is DefObjectives. It is used if Objectives is left at - // its zero value (i.e. nil). To create a Summary without Objectives, - // set it to an empty map (i.e. map[float64]float64{}). - // - // Deprecated: Note that the current value of DefObjectives is - // deprecated. It will be replaced by an empty map in v0.10 of the - // library. Please explicitly set Objectives to the desired value. + // default value is an empty map, resulting in a summary without + // quantiles. Objectives map[float64]float64 // MaxAge defines the duration for which an observation stays relevant @@ -151,7 +140,7 @@ type SummaryOpts struct { BufCap uint32 } -// Great fuck-up with the sliding-window decay algorithm... The Merge method of +// Problem with the sliding-window decay algorithm... The Merge method of // perk/quantile is actually not working as advertised - and it might be // unfixable, as the underlying algorithm is apparently not capable of merging // summaries in the first place. To avoid using Merge, we are currently adding @@ -196,7 +185,7 @@ func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary { } if opts.Objectives == nil { - opts.Objectives = DefObjectives + opts.Objectives = map[float64]float64{} } if opts.MaxAge < 0 { @@ -214,6 +203,17 @@ func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary { opts.BufCap = DefBufCap } + if len(opts.Objectives) == 0 { + // Use the lock-free implementation of a Summary without objectives. + s := &noObjectivesSummary{ + desc: desc, + labelPairs: makeLabelPairs(desc, labelValues), + counts: [2]*summaryCounts{&summaryCounts{}, &summaryCounts{}}, + } + s.init(s) // Init self-collection. + return s + } + s := &summary{ desc: desc, @@ -382,6 +382,116 @@ func (s *summary) swapBufs(now time.Time) { } } +type summaryCounts struct { + // sumBits contains the bits of the float64 representing the sum of all + // observations. sumBits and count have to go first in the struct to + // guarantee alignment for atomic operations. + // http://golang.org/pkg/sync/atomic/#pkg-note-BUG + sumBits uint64 + count uint64 +} + +type noObjectivesSummary struct { + // countAndHotIdx enables lock-free writes with use of atomic updates. + // The most significant bit is the hot index [0 or 1] of the count field + // below. Observe calls update the hot one. All remaining bits count the + // number of Observe calls. Observe starts by incrementing this counter, + // and finish by incrementing the count field in the respective + // summaryCounts, as a marker for completion. + // + // Calls of the Write method (which are non-mutating reads from the + // perspective of the summary) swap the hot–cold under the writeMtx + // lock. A cooldown is awaited (while locked) by comparing the number of + // observations with the initiation count. Once they match, then the + // last observation on the now cool one has completed. All cool fields must + // be merged into the new hot before releasing writeMtx. + + // Fields with atomic access first! See alignment constraint: + // http://golang.org/pkg/sync/atomic/#pkg-note-BUG + countAndHotIdx uint64 + + selfCollector + desc *Desc + writeMtx sync.Mutex // Only used in the Write method. + + // Two counts, one is "hot" for lock-free observations, the other is + // "cold" for writing out a dto.Metric. It has to be an array of + // pointers to guarantee 64bit alignment of the histogramCounts, see + // http://golang.org/pkg/sync/atomic/#pkg-note-BUG. + counts [2]*summaryCounts + + labelPairs []*dto.LabelPair +} + +func (s *noObjectivesSummary) Desc() *Desc { + return s.desc +} + +func (s *noObjectivesSummary) Observe(v float64) { + // We increment h.countAndHotIdx so that the counter in the lower + // 63 bits gets incremented. At the same time, we get the new value + // back, which we can use to find the currently-hot counts. + n := atomic.AddUint64(&s.countAndHotIdx, 1) + hotCounts := s.counts[n>>63] + + for { + oldBits := atomic.LoadUint64(&hotCounts.sumBits) + newBits := math.Float64bits(math.Float64frombits(oldBits) + v) + if atomic.CompareAndSwapUint64(&hotCounts.sumBits, oldBits, newBits) { + break + } + } + // Increment count last as we take it as a signal that the observation + // is complete. + atomic.AddUint64(&hotCounts.count, 1) +} + +func (s *noObjectivesSummary) Write(out *dto.Metric) error { + // For simplicity, we protect this whole method by a mutex. It is not in + // the hot path, i.e. Observe is called much more often than Write. The + // complication of making Write lock-free isn't worth it, if possible at + // all. + s.writeMtx.Lock() + defer s.writeMtx.Unlock() + + // Adding 1<<63 switches the hot index (from 0 to 1 or from 1 to 0) + // without touching the count bits. See the struct comments for a full + // description of the algorithm. + n := atomic.AddUint64(&s.countAndHotIdx, 1<<63) + // count is contained unchanged in the lower 63 bits. + count := n & ((1 << 63) - 1) + // The most significant bit tells us which counts is hot. The complement + // is thus the cold one. + hotCounts := s.counts[n>>63] + coldCounts := s.counts[(^n)>>63] + + // Await cooldown. + for count != atomic.LoadUint64(&coldCounts.count) { + runtime.Gosched() // Let observations get work done. + } + + sum := &dto.Summary{ + SampleCount: proto.Uint64(count), + SampleSum: proto.Float64(math.Float64frombits(atomic.LoadUint64(&coldCounts.sumBits))), + } + + out.Summary = sum + out.Label = s.labelPairs + + // Finally add all the cold counts to the new hot counts and reset the cold counts. + atomic.AddUint64(&hotCounts.count, count) + atomic.StoreUint64(&coldCounts.count, 0) + for { + oldBits := atomic.LoadUint64(&hotCounts.sumBits) + newBits := math.Float64bits(math.Float64frombits(oldBits) + sum.GetSampleSum()) + if atomic.CompareAndSwapUint64(&hotCounts.sumBits, oldBits, newBits) { + atomic.StoreUint64(&coldCounts.sumBits, 0) + break + } + } + return nil +} + type quantSort []*dto.Quantile func (s quantSort) Len() int { diff --git a/vendor/github.com/prometheus/client_golang/prometheus/timer.go b/vendor/github.com/prometheus/client_golang/prometheus/timer.go index b8fc5f18c..8d5f10523 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/timer.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/timer.go @@ -39,13 +39,16 @@ func NewTimer(o Observer) *Timer { // ObserveDuration records the duration passed since the Timer was created with // NewTimer. It calls the Observe method of the Observer provided during -// construction with the duration in seconds as an argument. ObserveDuration is -// usually called with a defer statement. +// construction with the duration in seconds as an argument. The observed +// duration is also returned. ObserveDuration is usually called with a defer +// statement. // // Note that this method is only guaranteed to never observe negative durations // if used with Go1.9+. -func (t *Timer) ObserveDuration() { +func (t *Timer) ObserveDuration() time.Duration { + d := time.Since(t.begin) if t.observer != nil { - t.observer.Observe(time.Since(t.begin).Seconds()) + t.observer.Observe(d.Seconds()) } + return d } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/wrap.go b/vendor/github.com/prometheus/client_golang/prometheus/wrap.go index 49159bf3e..e303eef6d 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/wrap.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/wrap.go @@ -32,6 +32,12 @@ import ( // WrapRegistererWith provides a way to add fixed labels to a subset of // Collectors. It should not be used to add fixed labels to all metrics exposed. // +// Conflicts between Collectors registered through the original Registerer with +// Collectors registered through the wrapping Registerer will still be +// detected. Any AlreadyRegisteredError returned by the Register method of +// either Registerer will contain the ExistingCollector in the form it was +// provided to the respective registry. +// // The Collector example demonstrates a use of WrapRegistererWith. func WrapRegistererWith(labels Labels, reg Registerer) Registerer { return &wrappingRegisterer{ @@ -54,6 +60,12 @@ func WrapRegistererWith(labels Labels, reg Registerer) Registerer { // (see NewGoCollector) and the process collector (see NewProcessCollector). (In // fact, those metrics are already prefixed with “go_” or “process_”, // respectively.) +// +// Conflicts between Collectors registered through the original Registerer with +// Collectors registered through the wrapping Registerer will still be +// detected. Any AlreadyRegisteredError returned by the Register method of +// either Registerer will contain the ExistingCollector in the form it was +// provided to the respective registry. func WrapRegistererWithPrefix(prefix string, reg Registerer) Registerer { return &wrappingRegisterer{ wrappedRegisterer: reg, @@ -123,6 +135,15 @@ func (c *wrappingCollector) Describe(ch chan<- *Desc) { } } +func (c *wrappingCollector) unwrapRecursively() Collector { + switch wc := c.wrappedCollector.(type) { + case *wrappingCollector: + return wc.unwrapRecursively() + default: + return wc + } +} + type wrappingMetric struct { wrappedMetric Metric prefix string diff --git a/vendor/github.com/prometheus/client_model/ruby/LICENSE b/vendor/github.com/prometheus/client_model/ruby/LICENSE deleted file mode 100644 index 11069edd7..000000000 --- a/vendor/github.com/prometheus/client_model/ruby/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go b/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go index 648b38cb6..26e92288c 100644 --- a/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go +++ b/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go @@ -1,12 +1,12 @@ /* +Copyright (c) 2011, Open Knowledge Foundation Ltd. +All rights reserved. + HTTP Content-Type Autonegotiation. The functions in this package implement the behaviour specified in http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html -Copyright (c) 2011, Open Knowledge Foundation Ltd. -All rights reserved. - Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/vendor/github.com/prometheus/common/model/metric.go b/vendor/github.com/prometheus/common/model/metric.go index f7250909b..00804b7fe 100644 --- a/vendor/github.com/prometheus/common/model/metric.go +++ b/vendor/github.com/prometheus/common/model/metric.go @@ -21,7 +21,6 @@ import ( ) var ( - separator = []byte{0} // MetricNameRE is a regular expression matching valid metric // names. Note that the IsValidMetricName function performs the same // check but faster than a match with this regular expression. diff --git a/vendor/github.com/prometheus/common/model/time.go b/vendor/github.com/prometheus/common/model/time.go index 46259b1f1..7b0064fdb 100644 --- a/vendor/github.com/prometheus/common/model/time.go +++ b/vendor/github.com/prometheus/common/model/time.go @@ -150,7 +150,13 @@ func (t *Time) UnmarshalJSON(b []byte) error { return err } - *t = Time(v + va) + // If the value was something like -0.1 the negative is lost in the + // parsing because of the leading zero, this ensures that we capture it. + if len(p[0]) > 0 && p[0][0] == '-' && v+va > 0 { + *t = Time(v+va) * -1 + } else { + *t = Time(v + va) + } default: return fmt.Errorf("invalid time %q", string(b)) diff --git a/vendor/github.com/prometheus/procfs/.golangci.yml b/vendor/github.com/prometheus/procfs/.golangci.yml new file mode 100644 index 000000000..7c4ce1fa8 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/.golangci.yml @@ -0,0 +1,4 @@ +linters: + enable: + - staticcheck + - govet diff --git a/vendor/github.com/prometheus/procfs/CONTRIBUTING.md b/vendor/github.com/prometheus/procfs/CONTRIBUTING.md index 40503edbf..943de7615 100644 --- a/vendor/github.com/prometheus/procfs/CONTRIBUTING.md +++ b/vendor/github.com/prometheus/procfs/CONTRIBUTING.md @@ -2,17 +2,120 @@ Prometheus uses GitHub to manage reviews of pull requests. +* If you are a new contributor see: [Steps to Contribute](#steps-to-contribute) + * If you have a trivial fix or improvement, go ahead and create a pull request, - addressing (with `@...`) the maintainer of this repository (see + addressing (with `@...`) a suitable maintainer of this repository (see [MAINTAINERS.md](MAINTAINERS.md)) in the description of the pull request. * If you plan to do something more involved, first discuss your ideas on our [mailing list](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). This will avoid unnecessary work and surely give you and us a good deal - of inspiration. + of inspiration. Also please see our [non-goals issue](https://github.com/prometheus/docs/issues/149) on areas that the Prometheus community doesn't plan to work on. * Relevant coding style guidelines are the [Go Code Review Comments](https://code.google.com/p/go-wiki/wiki/CodeReviewComments) and the _Formatting and style_ section of Peter Bourgon's [Go: Best Practices for Production - Environments](http://peter.bourgon.org/go-in-production/#formatting-and-style). + Environments](https://peter.bourgon.org/go-in-production/#formatting-and-style). + +* Be sure to sign off on the [DCO](https://github.com/probot/dco#how-it-works) + +## Steps to Contribute + +Should you wish to work on an issue, please claim it first by commenting on the GitHub issue that you want to work on it. This is to prevent duplicated efforts from contributors on the same issue. + +Please check the [`help-wanted`](https://github.com/prometheus/procfs/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) label to find issues that are good for getting started. If you have questions about one of the issues, with or without the tag, please comment on them and one of the maintainers will clarify it. For a quicker response, contact us over [IRC](https://prometheus.io/community). + +For quickly compiling and testing your changes do: +``` +make test # Make sure all the tests pass before you commit and push :) +``` + +We use [`golangci-lint`](https://github.com/golangci/golangci-lint) for linting the code. If it reports an issue and you think that the warning needs to be disregarded or is a false-positive, you can add a special comment `//nolint:linter1[,linter2,...]` before the offending line. Use this sparingly though, fixing the code to comply with the linter's recommendation is in general the preferred course of action. + +## Pull Request Checklist + +* Branch from the master branch and, if needed, rebase to the current master branch before submitting your pull request. If it doesn't merge cleanly with master you may be asked to rebase your changes. + +* Commits should be as small as possible, while ensuring that each commit is correct independently (i.e., each commit should compile and pass tests). + +* If your patch is not getting reviewed or you need a specific person to review it, you can @-reply a reviewer asking for a review in the pull request or a comment, or you can ask for a review on IRC channel [#prometheus](https://webchat.freenode.net/?channels=#prometheus) on irc.freenode.net (for the easiest start, [join via Riot](https://riot.im/app/#/room/#prometheus:matrix.org)). + +* Add tests relevant to the fixed bug or new feature. + +## Dependency management + +The Prometheus project uses [Go modules](https://golang.org/cmd/go/#hdr-Modules__module_versions__and_more) to manage dependencies on external packages. This requires a working Go environment with version 1.12 or greater installed. + +All dependencies are vendored in the `vendor/` directory. + +To add or update a new dependency, use the `go get` command: + +```bash +# Pick the latest tagged release. +go get example.com/some/module/pkg + +# Pick a specific version. +go get example.com/some/module/pkg@vX.Y.Z +``` + +Tidy up the `go.mod` and `go.sum` files and copy the new/updated dependency to the `vendor/` directory: + + +```bash +# The GO111MODULE variable can be omitted when the code isn't located in GOPATH. +GO111MODULE=on go mod tidy + +GO111MODULE=on go mod vendor +``` + +You have to commit the changes to `go.mod`, `go.sum` and the `vendor/` directory before submitting the pull request. + + +## API Implementation Guidelines + +### Naming and Documentation + +Public functions and structs should normally be named according to the file(s) being read and parsed. For example, +the `fs.BuddyInfo()` function reads the file `/proc/buddyinfo`. In addition, the godoc for each public function +should contain the path to the file(s) being read and a URL of the linux kernel documentation describing the file(s). + +### Reading vs. Parsing + +Most functionality in this library consists of reading files and then parsing the text into structured data. In most +cases reading and parsing should be separated into different functions/methods with a public `fs.Thing()` method and +a private `parseThing(r Reader)` function. This provides a logical separation and allows parsing to be tested +directly without the need to read from the filesystem. Using a `Reader` argument is preferred over other data types +such as `string` or `*File` because it provides the most flexibility regarding the data source. When a set of files +in a directory needs to be parsed, then a `path` string parameter to the parse function can be used instead. + +### /proc and /sys filesystem I/O + +The `proc` and `sys` filesystems are pseudo file systems and work a bit differently from standard disk I/O. +Many of the files are changing continuously and the data being read can in some cases change between subsequent +reads in the same file. Also, most of the files are relatively small (less than a few KBs), and system calls +to the `stat` function will often return the wrong size. Therefore, for most files it's recommended to read the +full file in a single operation using an internal utility function called `util.ReadFileNoStat`. +This function is similar to `ioutil.ReadFile`, but it avoids the system call to `stat` to get the current size of +the file. + +Note that parsing the file's contents can still be performed one line at a time. This is done by first reading +the full file, and then using a scanner on the `[]byte` or `string` containing the data. + +``` + data, err := util.ReadFileNoStat("/proc/cpuinfo") + if err != nil { + return err + } + reader := bytes.NewReader(data) + scanner := bufio.NewScanner(reader) +``` + +The `/sys` filesystem contains many very small files which contain only a single numeric or text value. These files +can be read using an internal function called `util.SysReadFile` which is similar to `ioutil.ReadFile` but does +not bother to check the size of the file before reading. +``` + data, err := util.SysReadFile("/sys/class/power_supply/BAT0/capacity") +``` + diff --git a/vendor/github.com/prometheus/procfs/MAINTAINERS.md b/vendor/github.com/prometheus/procfs/MAINTAINERS.md index 35993c41c..56ba67d3e 100644 --- a/vendor/github.com/prometheus/procfs/MAINTAINERS.md +++ b/vendor/github.com/prometheus/procfs/MAINTAINERS.md @@ -1 +1,2 @@ -* Tobias Schmidt +* Johannes 'fish' Ziemke @discordianfish +* Paul Gier @pgier diff --git a/vendor/github.com/prometheus/procfs/Makefile b/vendor/github.com/prometheus/procfs/Makefile index 4d1098394..616a0d25e 100644 --- a/vendor/github.com/prometheus/procfs/Makefile +++ b/vendor/github.com/prometheus/procfs/Makefile @@ -11,67 +11,19 @@ # See the License for the specific language governing permissions and # limitations under the License. -# Ensure GOBIN is not set during build so that promu is installed to the correct path -unexport GOBIN - -GO ?= go -GOFMT ?= $(GO)fmt -FIRST_GOPATH := $(firstword $(subst :, ,$(shell $(GO) env GOPATH))) -STATICCHECK := $(FIRST_GOPATH)/bin/staticcheck -pkgs = $(shell $(GO) list ./... | grep -v /vendor/) - -PREFIX ?= $(shell pwd) -BIN_DIR ?= $(shell pwd) - -ifdef DEBUG - bindata_flags = -debug -endif - -STATICCHECK_IGNORE = - -all: format staticcheck build test - -style: - @echo ">> checking code style" - @! $(GOFMT) -d $(shell find . -path ./vendor -prune -o -name '*.go' -print) | grep '^' - -check_license: - @echo ">> checking license header" - @./scripts/check_license.sh - -test: fixtures/.unpacked sysfs/fixtures/.unpacked - @echo ">> running all tests" - @$(GO) test -race $(shell $(GO) list ./... | grep -v /vendor/ | grep -v examples) - -format: - @echo ">> formatting code" - @$(GO) fmt $(pkgs) - -vet: - @echo ">> vetting code" - @$(GO) vet $(pkgs) - -staticcheck: $(STATICCHECK) - @echo ">> running staticcheck" - @$(STATICCHECK) -ignore "$(STATICCHECK_IGNORE)" $(pkgs) +include Makefile.common %/.unpacked: %.ttar + @echo ">> extracting fixtures" ./ttar -C $(dir $*) -x -f $*.ttar touch $@ -update_fixtures: fixtures.ttar sysfs/fixtures.ttar - -%fixtures.ttar: %/fixtures - rm -v $(dir $*)fixtures/.unpacked - ./ttar -C $(dir $*) -c -f $*fixtures.ttar fixtures/ - -$(FIRST_GOPATH)/bin/staticcheck: - @GOOS= GOARCH= $(GO) get -u honnef.co/go/tools/cmd/staticcheck +update_fixtures: + rm -vf fixtures/.unpacked + ./ttar -c -f fixtures.ttar fixtures/ -.PHONY: all style check_license format test vet staticcheck +.PHONY: build +build: -# Declaring the binaries at their default locations as PHONY targets is a hack -# to ensure the latest version is downloaded on every make execution. -# If this is not desired, copy/symlink these binaries to a different path and -# set the respective environment variables. -.PHONY: $(GOPATH)/bin/staticcheck +.PHONY: test +test: fixtures/.unpacked common-test diff --git a/vendor/github.com/prometheus/procfs/Makefile.common b/vendor/github.com/prometheus/procfs/Makefile.common new file mode 100644 index 000000000..d7aea1b86 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/Makefile.common @@ -0,0 +1,275 @@ +# Copyright 2018 The Prometheus Authors +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +# A common Makefile that includes rules to be reused in different prometheus projects. +# !!! Open PRs only against the prometheus/prometheus/Makefile.common repository! + +# Example usage : +# Create the main Makefile in the root project directory. +# include Makefile.common +# customTarget: +# @echo ">> Running customTarget" +# + +# Ensure GOBIN is not set during build so that promu is installed to the correct path +unexport GOBIN + +GO ?= go +GOFMT ?= $(GO)fmt +FIRST_GOPATH := $(firstword $(subst :, ,$(shell $(GO) env GOPATH))) +GOOPTS ?= +GOHOSTOS ?= $(shell $(GO) env GOHOSTOS) +GOHOSTARCH ?= $(shell $(GO) env GOHOSTARCH) + +GO_VERSION ?= $(shell $(GO) version) +GO_VERSION_NUMBER ?= $(word 3, $(GO_VERSION)) +PRE_GO_111 ?= $(shell echo $(GO_VERSION_NUMBER) | grep -E 'go1\.(10|[0-9])\.') + +GOVENDOR := +GO111MODULE := +ifeq (, $(PRE_GO_111)) + ifneq (,$(wildcard go.mod)) + # Enforce Go modules support just in case the directory is inside GOPATH (and for Travis CI). + GO111MODULE := on + + ifneq (,$(wildcard vendor)) + # Always use the local vendor/ directory to satisfy the dependencies. + GOOPTS := $(GOOPTS) -mod=vendor + endif + endif +else + ifneq (,$(wildcard go.mod)) + ifneq (,$(wildcard vendor)) +$(warning This repository requires Go >= 1.11 because of Go modules) +$(warning Some recipes may not work as expected as the current Go runtime is '$(GO_VERSION_NUMBER)') + endif + else + # This repository isn't using Go modules (yet). + GOVENDOR := $(FIRST_GOPATH)/bin/govendor + endif +endif +PROMU := $(FIRST_GOPATH)/bin/promu +pkgs = ./... + +ifeq (arm, $(GOHOSTARCH)) + GOHOSTARM ?= $(shell GOARM= $(GO) env GOARM) + GO_BUILD_PLATFORM ?= $(GOHOSTOS)-$(GOHOSTARCH)v$(GOHOSTARM) +else + GO_BUILD_PLATFORM ?= $(GOHOSTOS)-$(GOHOSTARCH) +endif + +PROMU_VERSION ?= 0.4.0 +PROMU_URL := https://github.com/prometheus/promu/releases/download/v$(PROMU_VERSION)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM).tar.gz + +GOLANGCI_LINT := +GOLANGCI_LINT_OPTS ?= +GOLANGCI_LINT_VERSION ?= v1.16.0 +# golangci-lint only supports linux, darwin and windows platforms on i386/amd64. +# windows isn't included here because of the path separator being different. +ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux darwin)) + ifeq ($(GOHOSTARCH),$(filter $(GOHOSTARCH),amd64 i386)) + GOLANGCI_LINT := $(FIRST_GOPATH)/bin/golangci-lint + endif +endif + +PREFIX ?= $(shell pwd) +BIN_DIR ?= $(shell pwd) +DOCKER_IMAGE_TAG ?= $(subst /,-,$(shell git rev-parse --abbrev-ref HEAD)) +DOCKERFILE_PATH ?= ./ +DOCKER_REPO ?= prom + +DOCKER_ARCHS ?= amd64 + +BUILD_DOCKER_ARCHS = $(addprefix common-docker-,$(DOCKER_ARCHS)) +PUBLISH_DOCKER_ARCHS = $(addprefix common-docker-publish-,$(DOCKER_ARCHS)) +TAG_DOCKER_ARCHS = $(addprefix common-docker-tag-latest-,$(DOCKER_ARCHS)) + +ifeq ($(GOHOSTARCH),amd64) + ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux freebsd darwin windows)) + # Only supported on amd64 + test-flags := -race + endif +endif + +# This rule is used to forward a target like "build" to "common-build". This +# allows a new "build" target to be defined in a Makefile which includes this +# one and override "common-build" without override warnings. +%: common-% ; + +.PHONY: common-all +common-all: precheck style check_license lint unused build test + +.PHONY: common-style +common-style: + @echo ">> checking code style" + @fmtRes=$$($(GOFMT) -d $$(find . -path ./vendor -prune -o -name '*.go' -print)); \ + if [ -n "$${fmtRes}" ]; then \ + echo "gofmt checking failed!"; echo "$${fmtRes}"; echo; \ + echo "Please ensure you are using $$($(GO) version) for formatting code."; \ + exit 1; \ + fi + +.PHONY: common-check_license +common-check_license: + @echo ">> checking license header" + @licRes=$$(for file in $$(find . -type f -iname '*.go' ! -path './vendor/*') ; do \ + awk 'NR<=3' $$file | grep -Eq "(Copyright|generated|GENERATED)" || echo $$file; \ + done); \ + if [ -n "$${licRes}" ]; then \ + echo "license header checking failed:"; echo "$${licRes}"; \ + exit 1; \ + fi + +.PHONY: common-deps +common-deps: + @echo ">> getting dependencies" +ifdef GO111MODULE + GO111MODULE=$(GO111MODULE) $(GO) mod download +else + $(GO) get $(GOOPTS) -t ./... +endif + +.PHONY: common-test-short +common-test-short: + @echo ">> running short tests" + GO111MODULE=$(GO111MODULE) $(GO) test -short $(GOOPTS) $(pkgs) + +.PHONY: common-test +common-test: + @echo ">> running all tests" + GO111MODULE=$(GO111MODULE) $(GO) test $(test-flags) $(GOOPTS) $(pkgs) + +.PHONY: common-format +common-format: + @echo ">> formatting code" + GO111MODULE=$(GO111MODULE) $(GO) fmt $(pkgs) + +.PHONY: common-vet +common-vet: + @echo ">> vetting code" + GO111MODULE=$(GO111MODULE) $(GO) vet $(GOOPTS) $(pkgs) + +.PHONY: common-lint +common-lint: $(GOLANGCI_LINT) +ifdef GOLANGCI_LINT + @echo ">> running golangci-lint" +ifdef GO111MODULE +# 'go list' needs to be executed before staticcheck to prepopulate the modules cache. +# Otherwise staticcheck might fail randomly for some reason not yet explained. + GO111MODULE=$(GO111MODULE) $(GO) list -e -compiled -test=true -export=false -deps=true -find=false -tags= -- ./... > /dev/null + GO111MODULE=$(GO111MODULE) $(GOLANGCI_LINT) run $(GOLANGCI_LINT_OPTS) $(pkgs) +else + $(GOLANGCI_LINT) run $(pkgs) +endif +endif + +# For backward-compatibility. +.PHONY: common-staticcheck +common-staticcheck: lint + +.PHONY: common-unused +common-unused: $(GOVENDOR) +ifdef GOVENDOR + @echo ">> running check for unused packages" + @$(GOVENDOR) list +unused | grep . && exit 1 || echo 'No unused packages' +else +ifdef GO111MODULE + @echo ">> running check for unused/missing packages in go.mod" + GO111MODULE=$(GO111MODULE) $(GO) mod tidy +ifeq (,$(wildcard vendor)) + @git diff --exit-code -- go.sum go.mod +else + @echo ">> running check for unused packages in vendor/" + GO111MODULE=$(GO111MODULE) $(GO) mod vendor + @git diff --exit-code -- go.sum go.mod vendor/ +endif +endif +endif + +.PHONY: common-build +common-build: promu + @echo ">> building binaries" + GO111MODULE=$(GO111MODULE) $(PROMU) build --prefix $(PREFIX) + +.PHONY: common-tarball +common-tarball: promu + @echo ">> building release tarball" + $(PROMU) tarball --prefix $(PREFIX) $(BIN_DIR) + +.PHONY: common-docker $(BUILD_DOCKER_ARCHS) +common-docker: $(BUILD_DOCKER_ARCHS) +$(BUILD_DOCKER_ARCHS): common-docker-%: + docker build -t "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" \ + --build-arg ARCH="$*" \ + --build-arg OS="linux" \ + $(DOCKERFILE_PATH) + +.PHONY: common-docker-publish $(PUBLISH_DOCKER_ARCHS) +common-docker-publish: $(PUBLISH_DOCKER_ARCHS) +$(PUBLISH_DOCKER_ARCHS): common-docker-publish-%: + docker push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" + +.PHONY: common-docker-tag-latest $(TAG_DOCKER_ARCHS) +common-docker-tag-latest: $(TAG_DOCKER_ARCHS) +$(TAG_DOCKER_ARCHS): common-docker-tag-latest-%: + docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:latest" + +.PHONY: common-docker-manifest +common-docker-manifest: + DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create -a "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)" $(foreach ARCH,$(DOCKER_ARCHS),$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$(ARCH):$(DOCKER_IMAGE_TAG)) + DOCKER_CLI_EXPERIMENTAL=enabled docker manifest push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)" + +.PHONY: promu +promu: $(PROMU) + +$(PROMU): + $(eval PROMU_TMP := $(shell mktemp -d)) + curl -s -L $(PROMU_URL) | tar -xvzf - -C $(PROMU_TMP) + mkdir -p $(FIRST_GOPATH)/bin + cp $(PROMU_TMP)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM)/promu $(FIRST_GOPATH)/bin/promu + rm -r $(PROMU_TMP) + +.PHONY: proto +proto: + @echo ">> generating code from proto files" + @./scripts/genproto.sh + +ifdef GOLANGCI_LINT +$(GOLANGCI_LINT): + mkdir -p $(FIRST_GOPATH)/bin + curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/$(GOLANGCI_LINT_VERSION)/install.sh \ + | sed -e '/install -d/d' \ + | sh -s -- -b $(FIRST_GOPATH)/bin $(GOLANGCI_LINT_VERSION) +endif + +ifdef GOVENDOR +.PHONY: $(GOVENDOR) +$(GOVENDOR): + GOOS= GOARCH= $(GO) get -u github.com/kardianos/govendor +endif + +.PHONY: precheck +precheck:: + +define PRECHECK_COMMAND_template = +precheck:: $(1)_precheck + +PRECHECK_COMMAND_$(1) ?= $(1) $$(strip $$(PRECHECK_OPTIONS_$(1))) +.PHONY: $(1)_precheck +$(1)_precheck: + @if ! $$(PRECHECK_COMMAND_$(1)) 1>/dev/null 2>&1; then \ + echo "Execution of '$$(PRECHECK_COMMAND_$(1))' command failed. Is $(1) installed?"; \ + exit 1; \ + fi +endef diff --git a/vendor/github.com/prometheus/procfs/README.md b/vendor/github.com/prometheus/procfs/README.md index 209549471..55d1e3261 100644 --- a/vendor/github.com/prometheus/procfs/README.md +++ b/vendor/github.com/prometheus/procfs/README.md @@ -1,7 +1,7 @@ # procfs -This procfs package provides functions to retrieve system, kernel and process -metrics from the pseudo-filesystem proc. +This package provides functions to retrieve system, kernel, and process +metrics from the pseudo-filesystems /proc and /sys. *WARNING*: This package is a work in progress. Its API may still break in backwards-incompatible ways without warnings. Use it at your own risk. @@ -9,3 +9,53 @@ backwards-incompatible ways without warnings. Use it at your own risk. [![GoDoc](https://godoc.org/github.com/prometheus/procfs?status.png)](https://godoc.org/github.com/prometheus/procfs) [![Build Status](https://travis-ci.org/prometheus/procfs.svg?branch=master)](https://travis-ci.org/prometheus/procfs) [![Go Report Card](https://goreportcard.com/badge/github.com/prometheus/procfs)](https://goreportcard.com/report/github.com/prometheus/procfs) + +## Usage + +The procfs library is organized by packages based on whether the gathered data is coming from +/proc, /sys, or both. Each package contains an `FS` type which represents the path to either /proc, +/sys, or both. For example, cpu statistics are gathered from +`/proc/stat` and are available via the root procfs package. First, the proc filesystem mount +point is initialized, and then the stat information is read. + +```go +fs, err := procfs.NewFS("/proc") +stats, err := fs.Stat() +``` + +Some sub-packages such as `blockdevice`, require access to both the proc and sys filesystems. + +```go + fs, err := blockdevice.NewFS("/proc", "/sys") + stats, err := fs.ProcDiskstats() +``` + +## Package Organization + +The packages in this project are organized according to (1) whether the data comes from the `/proc` or +`/sys` filesystem and (2) the type of information being retrieved. For example, most process information +can be gathered from the functions in the root `procfs` package. Information about block devices such as disk drives +is available in the `blockdevices` sub-package. + +## Building and Testing + +The procfs library is intended to be built as part of another application, so there are no distributable binaries. +However, most of the API includes unit tests which can be run with `make test`. + +### Updating Test Fixtures + +The procfs library includes a set of test fixtures which include many example files from +the `/proc` and `/sys` filesystems. These fixtures are included as a [ttar](https://github.com/ideaship/ttar) file +which is extracted automatically during testing. To add/update the test fixtures, first +ensure the `fixtures` directory is up to date by removing the existing directory and then +extracting the ttar file using `make fixtures/.unpacked` or just `make test`. + +```bash +rm -rf fixtures +make test +``` + +Next, make the required changes to the extracted files in the `fixtures` directory. When +the changes are complete, run `make update_fixtures` to create a new `fixtures.ttar` file +based on the updated `fixtures` directory. And finally, verify the changes using +`git diff fixtures.ttar`. diff --git a/vendor/github.com/prometheus/procfs/arp.go b/vendor/github.com/prometheus/procfs/arp.go new file mode 100644 index 000000000..916c9182a --- /dev/null +++ b/vendor/github.com/prometheus/procfs/arp.go @@ -0,0 +1,85 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "fmt" + "io/ioutil" + "net" + "strings" +) + +// ARPEntry contains a single row of the columnar data represented in +// /proc/net/arp. +type ARPEntry struct { + // IP address + IPAddr net.IP + // MAC address + HWAddr net.HardwareAddr + // Name of the device + Device string +} + +// GatherARPEntries retrieves all the ARP entries, parse the relevant columns, +// and then return a slice of ARPEntry's. +func (fs FS) GatherARPEntries() ([]ARPEntry, error) { + data, err := ioutil.ReadFile(fs.proc.Path("net/arp")) + if err != nil { + return nil, fmt.Errorf("error reading arp %s: %s", fs.proc.Path("net/arp"), err) + } + + return parseARPEntries(data) +} + +func parseARPEntries(data []byte) ([]ARPEntry, error) { + lines := strings.Split(string(data), "\n") + entries := make([]ARPEntry, 0) + var err error + const ( + expectedDataWidth = 6 + expectedHeaderWidth = 9 + ) + for _, line := range lines { + columns := strings.Fields(line) + width := len(columns) + + if width == expectedHeaderWidth || width == 0 { + continue + } else if width == expectedDataWidth { + entry, err := parseARPEntry(columns) + if err != nil { + return []ARPEntry{}, fmt.Errorf("failed to parse ARP entry: %s", err) + } + entries = append(entries, entry) + } else { + return []ARPEntry{}, fmt.Errorf("%d columns were detected, but %d were expected", width, expectedDataWidth) + } + + } + + return entries, err +} + +func parseARPEntry(columns []string) (ARPEntry, error) { + ip := net.ParseIP(columns[0]) + mac := net.HardwareAddr(columns[3]) + + entry := ARPEntry{ + IPAddr: ip, + HWAddr: mac, + Device: columns[5], + } + + return entry, nil +} diff --git a/vendor/github.com/prometheus/procfs/buddyinfo.go b/vendor/github.com/prometheus/procfs/buddyinfo.go index d3a826807..10bd067a0 100644 --- a/vendor/github.com/prometheus/procfs/buddyinfo.go +++ b/vendor/github.com/prometheus/procfs/buddyinfo.go @@ -31,19 +31,9 @@ type BuddyInfo struct { Sizes []float64 } -// NewBuddyInfo reads the buddyinfo statistics. -func NewBuddyInfo() ([]BuddyInfo, error) { - fs, err := NewFS(DefaultMountPoint) - if err != nil { - return nil, err - } - - return fs.NewBuddyInfo() -} - -// NewBuddyInfo reads the buddyinfo statistics from the specified `proc` filesystem. -func (fs FS) NewBuddyInfo() ([]BuddyInfo, error) { - file, err := os.Open(fs.Path("buddyinfo")) +// BuddyInfo reads the buddyinfo statistics from the specified `proc` filesystem. +func (fs FS) BuddyInfo() ([]BuddyInfo, error) { + file, err := os.Open(fs.proc.Path("buddyinfo")) if err != nil { return nil, err } diff --git a/vendor/github.com/prometheus/procfs/cpuinfo.go b/vendor/github.com/prometheus/procfs/cpuinfo.go new file mode 100644 index 000000000..2e0221552 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/cpuinfo.go @@ -0,0 +1,167 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "bytes" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// CPUInfo contains general information about a system CPU found in /proc/cpuinfo +type CPUInfo struct { + Processor uint + VendorID string + CPUFamily string + Model string + ModelName string + Stepping string + Microcode string + CPUMHz float64 + CacheSize string + PhysicalID string + Siblings uint + CoreID string + CPUCores uint + APICID string + InitialAPICID string + FPU string + FPUException string + CPUIDLevel uint + WP string + Flags []string + Bugs []string + BogoMips float64 + CLFlushSize uint + CacheAlignment uint + AddressSizes string + PowerManagement string +} + +// CPUInfo returns information about current system CPUs. +// See https://www.kernel.org/doc/Documentation/filesystems/proc.txt +func (fs FS) CPUInfo() ([]CPUInfo, error) { + data, err := util.ReadFileNoStat(fs.proc.Path("cpuinfo")) + if err != nil { + return nil, err + } + return parseCPUInfo(data) +} + +// parseCPUInfo parses data from /proc/cpuinfo +func parseCPUInfo(info []byte) ([]CPUInfo, error) { + cpuinfo := []CPUInfo{} + i := -1 + scanner := bufio.NewScanner(bytes.NewReader(info)) + for scanner.Scan() { + line := scanner.Text() + if strings.TrimSpace(line) == "" { + continue + } + field := strings.SplitN(line, ": ", 2) + switch strings.TrimSpace(field[0]) { + case "processor": + cpuinfo = append(cpuinfo, CPUInfo{}) // start of the next processor + i++ + v, err := strconv.ParseUint(field[1], 0, 32) + if err != nil { + return nil, err + } + cpuinfo[i].Processor = uint(v) + case "vendor_id": + cpuinfo[i].VendorID = field[1] + case "cpu family": + cpuinfo[i].CPUFamily = field[1] + case "model": + cpuinfo[i].Model = field[1] + case "model name": + cpuinfo[i].ModelName = field[1] + case "stepping": + cpuinfo[i].Stepping = field[1] + case "microcode": + cpuinfo[i].Microcode = field[1] + case "cpu MHz": + v, err := strconv.ParseFloat(field[1], 64) + if err != nil { + return nil, err + } + cpuinfo[i].CPUMHz = v + case "cache size": + cpuinfo[i].CacheSize = field[1] + case "physical id": + cpuinfo[i].PhysicalID = field[1] + case "siblings": + v, err := strconv.ParseUint(field[1], 0, 32) + if err != nil { + return nil, err + } + cpuinfo[i].Siblings = uint(v) + case "core id": + cpuinfo[i].CoreID = field[1] + case "cpu cores": + v, err := strconv.ParseUint(field[1], 0, 32) + if err != nil { + return nil, err + } + cpuinfo[i].CPUCores = uint(v) + case "apicid": + cpuinfo[i].APICID = field[1] + case "initial apicid": + cpuinfo[i].InitialAPICID = field[1] + case "fpu": + cpuinfo[i].FPU = field[1] + case "fpu_exception": + cpuinfo[i].FPUException = field[1] + case "cpuid level": + v, err := strconv.ParseUint(field[1], 0, 32) + if err != nil { + return nil, err + } + cpuinfo[i].CPUIDLevel = uint(v) + case "wp": + cpuinfo[i].WP = field[1] + case "flags": + cpuinfo[i].Flags = strings.Fields(field[1]) + case "bugs": + cpuinfo[i].Bugs = strings.Fields(field[1]) + case "bogomips": + v, err := strconv.ParseFloat(field[1], 64) + if err != nil { + return nil, err + } + cpuinfo[i].BogoMips = v + case "clflush size": + v, err := strconv.ParseUint(field[1], 0, 32) + if err != nil { + return nil, err + } + cpuinfo[i].CLFlushSize = uint(v) + case "cache_alignment": + v, err := strconv.ParseUint(field[1], 0, 32) + if err != nil { + return nil, err + } + cpuinfo[i].CacheAlignment = uint(v) + case "address sizes": + cpuinfo[i].AddressSizes = field[1] + case "power management": + cpuinfo[i].PowerManagement = field[1] + } + } + return cpuinfo, nil + +} diff --git a/vendor/github.com/prometheus/procfs/crypto.go b/vendor/github.com/prometheus/procfs/crypto.go new file mode 100644 index 000000000..19d4041b2 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/crypto.go @@ -0,0 +1,131 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bytes" + "fmt" + "io/ioutil" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// Crypto holds info parsed from /proc/crypto. +type Crypto struct { + Alignmask *uint64 + Async bool + Blocksize *uint64 + Chunksize *uint64 + Ctxsize *uint64 + Digestsize *uint64 + Driver string + Geniv string + Internal string + Ivsize *uint64 + Maxauthsize *uint64 + MaxKeysize *uint64 + MinKeysize *uint64 + Module string + Name string + Priority *int64 + Refcnt *int64 + Seedsize *uint64 + Selftest string + Type string + Walksize *uint64 +} + +// Crypto parses an crypto-file (/proc/crypto) and returns a slice of +// structs containing the relevant info. More information available here: +// https://kernel.readthedocs.io/en/sphinx-samples/crypto-API.html +func (fs FS) Crypto() ([]Crypto, error) { + data, err := ioutil.ReadFile(fs.proc.Path("crypto")) + if err != nil { + return nil, fmt.Errorf("error parsing crypto %s: %s", fs.proc.Path("crypto"), err) + } + crypto, err := parseCrypto(data) + if err != nil { + return nil, fmt.Errorf("error parsing crypto %s: %s", fs.proc.Path("crypto"), err) + } + return crypto, nil +} + +func parseCrypto(cryptoData []byte) ([]Crypto, error) { + crypto := []Crypto{} + + cryptoBlocks := bytes.Split(cryptoData, []byte("\n\n")) + + for _, block := range cryptoBlocks { + var newCryptoElem Crypto + + lines := strings.Split(string(block), "\n") + for _, line := range lines { + if strings.TrimSpace(line) == "" || line[0] == ' ' { + continue + } + fields := strings.Split(line, ":") + key := strings.TrimSpace(fields[0]) + value := strings.TrimSpace(fields[1]) + vp := util.NewValueParser(value) + + switch strings.TrimSpace(key) { + case "async": + b, err := strconv.ParseBool(value) + if err == nil { + newCryptoElem.Async = b + } + case "blocksize": + newCryptoElem.Blocksize = vp.PUInt64() + case "chunksize": + newCryptoElem.Chunksize = vp.PUInt64() + case "digestsize": + newCryptoElem.Digestsize = vp.PUInt64() + case "driver": + newCryptoElem.Driver = value + case "geniv": + newCryptoElem.Geniv = value + case "internal": + newCryptoElem.Internal = value + case "ivsize": + newCryptoElem.Ivsize = vp.PUInt64() + case "maxauthsize": + newCryptoElem.Maxauthsize = vp.PUInt64() + case "max keysize": + newCryptoElem.MaxKeysize = vp.PUInt64() + case "min keysize": + newCryptoElem.MinKeysize = vp.PUInt64() + case "module": + newCryptoElem.Module = value + case "name": + newCryptoElem.Name = value + case "priority": + newCryptoElem.Priority = vp.PInt64() + case "refcnt": + newCryptoElem.Refcnt = vp.PInt64() + case "seedsize": + newCryptoElem.Seedsize = vp.PUInt64() + case "selftest": + newCryptoElem.Selftest = value + case "type": + newCryptoElem.Type = value + case "walksize": + newCryptoElem.Walksize = vp.PUInt64() + } + } + crypto = append(crypto, newCryptoElem) + } + return crypto, nil +} diff --git a/vendor/github.com/prometheus/procfs/fixtures.ttar b/vendor/github.com/prometheus/procfs/fixtures.ttar index 13c831ef5..c50a18ace 100644 --- a/vendor/github.com/prometheus/procfs/fixtures.ttar +++ b/vendor/github.com/prometheus/procfs/fixtures.ttar @@ -1,45 +1,95 @@ # Archive created by ttar -c -f fixtures.ttar fixtures/ Directory: fixtures -Mode: 755 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc +Mode: 775 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/26231 +Directory: fixtures/proc/26231 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/cmdline +Path: fixtures/proc/26231/cmdline Lines: 1 vimNULLBYTEtest.goNULLBYTE+10NULLBYTEEOF Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/comm +Path: fixtures/proc/26231/comm Lines: 1 vim Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/cwd +Path: fixtures/proc/26231/cwd SymlinkTo: /usr/bin # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/exe +Path: fixtures/proc/26231/environ +Lines: 1 +PATH=/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binNULLBYTEHOSTNAME=cd24e11f73a5NULLBYTETERM=xtermNULLBYTEGOLANG_VERSION=1.12.5NULLBYTEGOPATH=/goNULLBYTEHOME=/rootNULLBYTEEOF +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/exe SymlinkTo: /usr/bin/vim # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/26231/fd +Directory: fixtures/proc/26231/fd Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/fd/0 +Path: fixtures/proc/26231/fd/0 SymlinkTo: ../../symlinktargets/abc # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/fd/1 +Path: fixtures/proc/26231/fd/1 SymlinkTo: ../../symlinktargets/def # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/fd/10 +Path: fixtures/proc/26231/fd/10 SymlinkTo: ../../symlinktargets/xyz # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/fd/2 +Path: fixtures/proc/26231/fd/2 SymlinkTo: ../../symlinktargets/ghi # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/fd/3 +Path: fixtures/proc/26231/fd/3 SymlinkTo: ../../symlinktargets/uvw # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/io +Directory: fixtures/proc/26231/fdinfo +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/fdinfo/0 +Lines: 6 +pos: 0 +flags: 02004000 +mnt_id: 13 +inotify wd:3 ino:1 sdev:34 mask:fce ignored_mask:0 fhandle-bytes:c fhandle-type:81 f_handle:000000000100000000000000 +inotify wd:2 ino:1300016 sdev:fd00002 mask:fce ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:16003001ed3f022a +inotify wd:1 ino:2e0001 sdev:fd00000 mask:fce ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:01002e00138e7c65 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/fdinfo/1 +Lines: 4 +pos: 0 +flags: 02004002 +mnt_id: 13 +eventfd-count: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/fdinfo/10 +Lines: 3 +pos: 0 +flags: 02004002 +mnt_id: 9 +Mode: 400 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/fdinfo/2 +Lines: 3 +pos: 0 +flags: 02004002 +mnt_id: 9 +Mode: 400 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/fdinfo/3 +Lines: 3 +pos: 0 +flags: 02004002 +mnt_id: 9 +Mode: 400 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/io Lines: 7 rchar: 750339 wchar: 818609 @@ -50,7 +100,7 @@ write_bytes: 2048 cancelled_write_bytes: -1024 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/limits +Path: fixtures/proc/26231/limits Lines: 17 Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds @@ -71,14 +121,14 @@ Max realtime priority 0 0 Max realtime timeout unlimited unlimited us Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/mountstats -Lines: 19 +Path: fixtures/proc/26231/mountstats +Lines: 20 device rootfs mounted on / with fstype rootfs device sysfs mounted on /sys with fstype sysfs device proc mounted on /proc with fstype proc device /dev/sda1 mounted on / with fstype ext4 device 192.168.1.1:/srv/test mounted on /mnt/nfs/test with fstype nfs4 statvers=1.1 - opts: rw,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,acregmin=3,acregmax=60,acdirmin=30,acdirmax=60,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.5,local_lock=none + opts: rw,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,acregmin=3,acregmax=60,acdirmin=30,acdirmax=60,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,mountaddr=192.168.1.1,clientaddr=192.168.1.5,local_lock=none age: 13968 caps: caps=0xfff7,wtmult=512,dtsize=32768,bsize=0,namlen=255 nfsv4: bm0=0xfdffafff,bm1=0xf9be3e,bm2=0x0,acl=0x0,pnfs=not configured @@ -91,13 +141,14 @@ device 192.168.1.1:/srv/test mounted on /mnt/nfs/test with fstype nfs4 statvers= NULL: 0 0 0 0 0 0 0 0 READ: 1298 1298 0 207680 1210292152 6 79386 79407 WRITE: 0 0 0 0 0 0 0 0 + ACCESS: 2927395007 2927394995 0 526931094212 362996810236 18446743919241604546 1667369447 1953587717 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/26231/net +Directory: fixtures/proc/26231/net Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/net/dev +Path: fixtures/proc/26231/net/dev Lines: 4 Inter-| Receive | Transmit face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed @@ -105,142 +156,1438 @@ Inter-| Receive | Transmit eth0: 438 5 0 0 0 0 0 0 648 8 0 0 0 0 0 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/26231/ns +Directory: fixtures/proc/26231/ns Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/ns/mnt +Path: fixtures/proc/26231/ns/mnt SymlinkTo: mnt:[4026531840] # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/ns/net +Path: fixtures/proc/26231/ns/net SymlinkTo: net:[4026531993] # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/root +Path: fixtures/proc/26231/root SymlinkTo: / # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/stat +Path: fixtures/proc/26231/schedstat +Lines: 1 +411605849 93680043 79 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/stat Lines: 1 26231 (vim) R 5392 7446 5392 34835 7446 4218880 32533 309516 26 82 1677 44 158 99 20 0 1 0 82375 56274944 1981 18446744073709551615 4194304 6294284 140736914091744 140736914087944 139965136429984 0 0 12288 1870679807 0 0 0 17 0 0 0 31 0 0 8391624 8481048 16420864 140736914093252 140736914093279 140736914093279 140736914096107 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/26232 +Path: fixtures/proc/26231/status +Lines: 53 + +Name: prometheus +Umask: 0022 +State: S (sleeping) +Tgid: 26231 +Ngid: 0 +Pid: 26231 +PPid: 1 +TracerPid: 0 +Uid: 0 0 0 0 +Gid: 0 0 0 0 +FDSize: 128 +Groups: +NStgid: 1 +NSpid: 1 +NSpgid: 1 +NSsid: 1 +VmPeak: 58472 kB +VmSize: 58440 kB +VmLck: 0 kB +VmPin: 0 kB +VmHWM: 8028 kB +VmRSS: 6716 kB +RssAnon: 2092 kB +RssFile: 4624 kB +RssShmem: 0 kB +VmData: 2580 kB +VmStk: 136 kB +VmExe: 948 kB +VmLib: 6816 kB +VmPTE: 128 kB +VmPMD: 12 kB +VmSwap: 660 kB +HugetlbPages: 0 kB +Threads: 1 +SigQ: 8/63965 +SigPnd: 0000000000000000 +ShdPnd: 0000000000000000 +SigBlk: 7be3c0fe28014a03 +SigIgn: 0000000000001000 +SigCgt: 00000001800004ec +CapInh: 0000000000000000 +CapPrm: 0000003fffffffff +CapEff: 0000003fffffffff +CapBnd: 0000003fffffffff +CapAmb: 0000000000000000 +Seccomp: 0 +Cpus_allowed: ff +Cpus_allowed_list: 0-7 +Mems_allowed: 00000000,00000001 +Mems_allowed_list: 0 +voluntary_ctxt_switches: 4742839 +nonvoluntary_ctxt_switches: 1727500 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc/26232 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26232/cmdline +Path: fixtures/proc/26232/cmdline Lines: 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26232/comm +Path: fixtures/proc/26232/comm Lines: 1 ata_sff Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26232/cwd +Path: fixtures/proc/26232/cwd SymlinkTo: /does/not/exist # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/26232/fd +Directory: fixtures/proc/26232/fd Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26232/fd/0 +Path: fixtures/proc/26232/fd/0 SymlinkTo: ../../symlinktargets/abc # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26232/fd/1 +Path: fixtures/proc/26232/fd/1 SymlinkTo: ../../symlinktargets/def # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26232/fd/2 +Path: fixtures/proc/26232/fd/2 SymlinkTo: ../../symlinktargets/ghi # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26232/fd/3 +Path: fixtures/proc/26232/fd/3 SymlinkTo: ../../symlinktargets/uvw # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26232/fd/4 +Path: fixtures/proc/26232/fd/4 SymlinkTo: ../../symlinktargets/xyz # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26232/limits +Path: fixtures/proc/26232/limits Lines: 17 -Limit Soft Limit Hard Limit Units -Max cpu time unlimited unlimited seconds -Max file size unlimited unlimited bytes -Max data size unlimited unlimited bytes -Max stack size 8388608 unlimited bytes -Max core file size 0 unlimited bytes -Max resident set unlimited unlimited bytes -Max processes 29436 29436 processes -Max open files 1024 4096 files -Max locked memory 65536 65536 bytes -Max address space unlimited unlimited bytes -Max file locks unlimited unlimited locks -Max pending signals 29436 29436 signals -Max msgqueue size 819200 819200 bytes -Max nice priority 0 0 -Max realtime priority 0 0 -Max realtime timeout unlimited unlimited us -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26232/root +Limit Soft Limit Hard Limit Units +Max cpu time unlimited unlimited seconds +Max file size unlimited unlimited bytes +Max data size unlimited unlimited bytes +Max stack size 8388608 unlimited bytes +Max core file size 0 unlimited bytes +Max resident set unlimited unlimited bytes +Max processes 29436 29436 processes +Max open files 1024 4096 files +Max locked memory 65536 65536 bytes +Max address space unlimited unlimited bytes +Max file locks unlimited unlimited locks +Max pending signals 29436 29436 signals +Max msgqueue size 819200 819200 bytes +Max nice priority 0 0 +Max realtime priority 0 0 +Max realtime timeout unlimited unlimited us +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26232/root SymlinkTo: /does/not/exist # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26232/stat +Path: fixtures/proc/26232/stat Lines: 1 33 (ata_sff) S 2 0 0 0 -1 69238880 0 0 0 0 0 0 0 0 0 -20 1 0 5 0 0 18446744073709551615 0 0 0 0 0 0 0 2147483647 0 18446744073709551615 0 0 17 1 0 0 0 0 0 0 0 0 0 0 0 0 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/26233 +Directory: fixtures/proc/26233 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26233/cmdline +Path: fixtures/proc/26233/cmdline Lines: 1 com.github.uiautomatorNULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTEEOF Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/584 +Path: fixtures/proc/26233/schedstat +Lines: 8 + ____________________________________ +< this is a malformed schedstat file > + ------------------------------------ + \ ^__^ + \ (oo)\_______ + (__)\ )\/\ + ||----w | + || || +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc/584 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/584/stat +Path: fixtures/proc/584/stat Lines: 2 1020 ((a b ) ( c d) ) R 28378 1020 28378 34842 1020 4218880 286 0 0 0 0 0 0 0 20 0 1 0 10839175 10395648 155 18446744073709551615 4194304 4238788 140736466511168 140736466511168 140609271124624 0 0 0 0 0 0 0 17 5 0 0 0 0 0 6336016 6337300 25579520 140736466515030 140736466515061 140736466515061 140736466518002 0 #!/bin/cat /proc/self/stat Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/buddyinfo -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/buddyinfo/short -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/buddyinfo/short/buddyinfo +Path: fixtures/proc/buddyinfo Lines: 3 -Node 0, zone -Node 0, zone -Node 0, zone +Node 0, zone DMA 1 0 1 0 2 1 1 0 1 1 3 +Node 0, zone DMA32 759 572 791 475 194 45 12 0 0 0 0 +Node 0, zone Normal 4381 1093 185 1530 567 102 4 0 0 0 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/buddyinfo/sizemismatch -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/buddyinfo/sizemismatch/buddyinfo -Lines: 3 -Node 0, zone DMA 1 0 1 0 2 1 1 0 1 1 3 -Node 0, zone DMA32 759 572 791 475 194 45 12 0 0 0 0 0 -Node 0, zone Normal 4381 1093 185 1530 567 102 4 0 0 0 -Mode: 644 +Path: fixtures/proc/cpuinfo +Lines: 216 +processor : 0 +vendor_id : GenuineIntel +cpu family : 6 +model : 142 +model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz +stepping : 10 +microcode : 0xb4 +cpu MHz : 799.998 +cache size : 8192 KB +physical id : 0 +siblings : 8 +core id : 0 +cpu cores : 4 +apicid : 0 +initial apicid : 0 +fpu : yes +fpu_exception : yes +cpuid level : 22 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d +bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs +bogomips : 4224.00 +clflush size : 64 +cache_alignment : 64 +address sizes : 39 bits physical, 48 bits virtual +power management: + +processor : 1 +vendor_id : GenuineIntel +cpu family : 6 +model : 142 +model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz +stepping : 10 +microcode : 0xb4 +cpu MHz : 800.037 +cache size : 8192 KB +physical id : 0 +siblings : 8 +core id : 1 +cpu cores : 4 +apicid : 2 +initial apicid : 2 +fpu : yes +fpu_exception : yes +cpuid level : 22 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d +bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs +bogomips : 4224.00 +clflush size : 64 +cache_alignment : 64 +address sizes : 39 bits physical, 48 bits virtual +power management: + +processor : 2 +vendor_id : GenuineIntel +cpu family : 6 +model : 142 +model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz +stepping : 10 +microcode : 0xb4 +cpu MHz : 800.010 +cache size : 8192 KB +physical id : 0 +siblings : 8 +core id : 2 +cpu cores : 4 +apicid : 4 +initial apicid : 4 +fpu : yes +fpu_exception : yes +cpuid level : 22 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d +bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs +bogomips : 4224.00 +clflush size : 64 +cache_alignment : 64 +address sizes : 39 bits physical, 48 bits virtual +power management: + +processor : 3 +vendor_id : GenuineIntel +cpu family : 6 +model : 142 +model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz +stepping : 10 +microcode : 0xb4 +cpu MHz : 800.028 +cache size : 8192 KB +physical id : 0 +siblings : 8 +core id : 3 +cpu cores : 4 +apicid : 6 +initial apicid : 6 +fpu : yes +fpu_exception : yes +cpuid level : 22 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d +bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs +bogomips : 4224.00 +clflush size : 64 +cache_alignment : 64 +address sizes : 39 bits physical, 48 bits virtual +power management: + +processor : 4 +vendor_id : GenuineIntel +cpu family : 6 +model : 142 +model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz +stepping : 10 +microcode : 0xb4 +cpu MHz : 799.989 +cache size : 8192 KB +physical id : 0 +siblings : 8 +core id : 0 +cpu cores : 4 +apicid : 1 +initial apicid : 1 +fpu : yes +fpu_exception : yes +cpuid level : 22 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d +bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs +bogomips : 4224.00 +clflush size : 64 +cache_alignment : 64 +address sizes : 39 bits physical, 48 bits virtual +power management: + +processor : 5 +vendor_id : GenuineIntel +cpu family : 6 +model : 142 +model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz +stepping : 10 +microcode : 0xb4 +cpu MHz : 800.083 +cache size : 8192 KB +physical id : 0 +siblings : 8 +core id : 1 +cpu cores : 4 +apicid : 3 +initial apicid : 3 +fpu : yes +fpu_exception : yes +cpuid level : 22 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d +bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs +bogomips : 4224.00 +clflush size : 64 +cache_alignment : 64 +address sizes : 39 bits physical, 48 bits virtual +power management: + +processor : 6 +vendor_id : GenuineIntel +cpu family : 6 +model : 142 +model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz +stepping : 10 +microcode : 0xb4 +cpu MHz : 800.017 +cache size : 8192 KB +physical id : 0 +siblings : 8 +core id : 2 +cpu cores : 4 +apicid : 5 +initial apicid : 5 +fpu : yes +fpu_exception : yes +cpuid level : 22 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d +bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs +bogomips : 4224.00 +clflush size : 64 +cache_alignment : 64 +address sizes : 39 bits physical, 48 bits virtual +power management: + +processor : 7 +vendor_id : GenuineIntel +cpu family : 6 +model : 142 +model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz +stepping : 10 +microcode : 0xb4 +cpu MHz : 800.030 +cache size : 8192 KB +physical id : 0 +siblings : 8 +core id : 3 +cpu cores : 4 +apicid : 7 +initial apicid : 7 +fpu : yes +fpu_exception : yes +cpuid level : 22 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d +bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs +bogomips : 4224.00 +clflush size : 64 +cache_alignment : 64 +address sizes : 39 bits physical, 48 bits virtual +power management: + +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/buddyinfo/valid -Mode: 755 +Path: fixtures/proc/crypto +Lines: 971 +name : ccm(aes) +driver : ccm_base(ctr(aes-aesni),cbcmac(aes-aesni)) +module : ccm +priority : 300 +refcnt : 4 +selftest : passed +internal : no +type : aead +async : no +blocksize : 1 +ivsize : 16 +maxauthsize : 16 +geniv : + +name : cbcmac(aes) +driver : cbcmac(aes-aesni) +module : ccm +priority : 300 +refcnt : 7 +selftest : passed +internal : no +type : shash +blocksize : 1 +digestsize : 16 + +name : ecdh +driver : ecdh-generic +module : ecdh_generic +priority : 100 +refcnt : 1 +selftest : passed +internal : no +type : kpp + +name : ecb(arc4) +driver : ecb(arc4)-generic +module : arc4 +priority : 100 +refcnt : 1 +selftest : passed +internal : no +type : skcipher +async : no +blocksize : 1 +min keysize : 1 +max keysize : 256 +ivsize : 0 +chunksize : 1 +walksize : 1 + +name : arc4 +driver : arc4-generic +module : arc4 +priority : 0 +refcnt : 3 +selftest : passed +internal : no +type : cipher +blocksize : 1 +min keysize : 1 +max keysize : 256 + +name : crct10dif +driver : crct10dif-pclmul +module : crct10dif_pclmul +priority : 200 +refcnt : 2 +selftest : passed +internal : no +type : shash +blocksize : 1 +digestsize : 2 + +name : crc32 +driver : crc32-pclmul +module : crc32_pclmul +priority : 200 +refcnt : 1 +selftest : passed +internal : no +type : shash +blocksize : 1 +digestsize : 4 + +name : __ghash +driver : cryptd(__ghash-pclmulqdqni) +module : kernel +priority : 50 +refcnt : 1 +selftest : passed +internal : yes +type : ahash +async : yes +blocksize : 16 +digestsize : 16 + +name : ghash +driver : ghash-clmulni +module : ghash_clmulni_intel +priority : 400 +refcnt : 1 +selftest : passed +internal : no +type : ahash +async : yes +blocksize : 16 +digestsize : 16 + +name : __ghash +driver : __ghash-pclmulqdqni +module : ghash_clmulni_intel +priority : 0 +refcnt : 1 +selftest : passed +internal : yes +type : shash +blocksize : 16 +digestsize : 16 + +name : crc32c +driver : crc32c-intel +module : crc32c_intel +priority : 200 +refcnt : 5 +selftest : passed +internal : no +type : shash +blocksize : 1 +digestsize : 4 + +name : cbc(aes) +driver : cbc(aes-aesni) +module : kernel +priority : 300 +refcnt : 1 +selftest : passed +internal : no +type : skcipher +async : no +blocksize : 16 +min keysize : 16 +max keysize : 32 +ivsize : 16 +chunksize : 16 +walksize : 16 + +name : ctr(aes) +driver : ctr(aes-aesni) +module : kernel +priority : 300 +refcnt : 5 +selftest : passed +internal : no +type : skcipher +async : no +blocksize : 1 +min keysize : 16 +max keysize : 32 +ivsize : 16 +chunksize : 16 +walksize : 16 + +name : pkcs1pad(rsa,sha256) +driver : pkcs1pad(rsa-generic,sha256) +module : kernel +priority : 100 +refcnt : 1 +selftest : passed +internal : no +type : akcipher + +name : __xts(aes) +driver : cryptd(__xts-aes-aesni) +module : kernel +priority : 451 +refcnt : 1 +selftest : passed +internal : yes +type : skcipher +async : yes +blocksize : 16 +min keysize : 32 +max keysize : 64 +ivsize : 16 +chunksize : 16 +walksize : 16 + +name : xts(aes) +driver : xts-aes-aesni +module : kernel +priority : 401 +refcnt : 1 +selftest : passed +internal : no +type : skcipher +async : yes +blocksize : 16 +min keysize : 32 +max keysize : 64 +ivsize : 16 +chunksize : 16 +walksize : 16 + +name : __ctr(aes) +driver : cryptd(__ctr-aes-aesni) +module : kernel +priority : 450 +refcnt : 1 +selftest : passed +internal : yes +type : skcipher +async : yes +blocksize : 1 +min keysize : 16 +max keysize : 32 +ivsize : 16 +chunksize : 16 +walksize : 16 + +name : ctr(aes) +driver : ctr-aes-aesni +module : kernel +priority : 400 +refcnt : 1 +selftest : passed +internal : no +type : skcipher +async : yes +blocksize : 1 +min keysize : 16 +max keysize : 32 +ivsize : 16 +chunksize : 16 +walksize : 16 + +name : __cbc(aes) +driver : cryptd(__cbc-aes-aesni) +module : kernel +priority : 450 +refcnt : 1 +selftest : passed +internal : yes +type : skcipher +async : yes +blocksize : 16 +min keysize : 16 +max keysize : 32 +ivsize : 16 +chunksize : 16 +walksize : 16 + +name : cbc(aes) +driver : cbc-aes-aesni +module : kernel +priority : 400 +refcnt : 1 +selftest : passed +internal : no +type : skcipher +async : yes +blocksize : 16 +min keysize : 16 +max keysize : 32 +ivsize : 16 +chunksize : 16 +walksize : 16 + +name : __ecb(aes) +driver : cryptd(__ecb-aes-aesni) +module : kernel +priority : 450 +refcnt : 1 +selftest : passed +internal : yes +type : skcipher +async : yes +blocksize : 16 +min keysize : 16 +max keysize : 32 +ivsize : 0 +chunksize : 16 +walksize : 16 + +name : ecb(aes) +driver : ecb-aes-aesni +module : kernel +priority : 400 +refcnt : 1 +selftest : passed +internal : no +type : skcipher +async : yes +blocksize : 16 +min keysize : 16 +max keysize : 32 +ivsize : 0 +chunksize : 16 +walksize : 16 + +name : __generic-gcm-aes-aesni +driver : cryptd(__driver-generic-gcm-aes-aesni) +module : kernel +priority : 50 +refcnt : 1 +selftest : passed +internal : yes +type : aead +async : yes +blocksize : 1 +ivsize : 12 +maxauthsize : 16 +geniv : + +name : gcm(aes) +driver : generic-gcm-aesni +module : kernel +priority : 400 +refcnt : 1 +selftest : passed +internal : no +type : aead +async : yes +blocksize : 1 +ivsize : 12 +maxauthsize : 16 +geniv : + +name : __generic-gcm-aes-aesni +driver : __driver-generic-gcm-aes-aesni +module : kernel +priority : 0 +refcnt : 1 +selftest : passed +internal : yes +type : aead +async : no +blocksize : 1 +ivsize : 12 +maxauthsize : 16 +geniv : + +name : __gcm-aes-aesni +driver : cryptd(__driver-gcm-aes-aesni) +module : kernel +priority : 50 +refcnt : 1 +selftest : passed +internal : yes +type : aead +async : yes +blocksize : 1 +ivsize : 8 +maxauthsize : 16 +geniv : + +name : rfc4106(gcm(aes)) +driver : rfc4106-gcm-aesni +module : kernel +priority : 400 +refcnt : 1 +selftest : passed +internal : no +type : aead +async : yes +blocksize : 1 +ivsize : 8 +maxauthsize : 16 +geniv : + +name : __gcm-aes-aesni +driver : __driver-gcm-aes-aesni +module : kernel +priority : 0 +refcnt : 1 +selftest : passed +internal : yes +type : aead +async : no +blocksize : 1 +ivsize : 8 +maxauthsize : 16 +geniv : + +name : __xts(aes) +driver : __xts-aes-aesni +module : kernel +priority : 401 +refcnt : 1 +selftest : passed +internal : yes +type : skcipher +async : no +blocksize : 16 +min keysize : 32 +max keysize : 64 +ivsize : 16 +chunksize : 16 +walksize : 16 + +name : __ctr(aes) +driver : __ctr-aes-aesni +module : kernel +priority : 400 +refcnt : 1 +selftest : passed +internal : yes +type : skcipher +async : no +blocksize : 1 +min keysize : 16 +max keysize : 32 +ivsize : 16 +chunksize : 16 +walksize : 16 + +name : __cbc(aes) +driver : __cbc-aes-aesni +module : kernel +priority : 400 +refcnt : 1 +selftest : passed +internal : yes +type : skcipher +async : no +blocksize : 16 +min keysize : 16 +max keysize : 32 +ivsize : 16 +chunksize : 16 +walksize : 16 + +name : __ecb(aes) +driver : __ecb-aes-aesni +module : kernel +priority : 400 +refcnt : 1 +selftest : passed +internal : yes +type : skcipher +async : no +blocksize : 16 +min keysize : 16 +max keysize : 32 +ivsize : 0 +chunksize : 16 +walksize : 16 + +name : __aes +driver : __aes-aesni +module : kernel +priority : 300 +refcnt : 1 +selftest : passed +internal : yes +type : cipher +blocksize : 16 +min keysize : 16 +max keysize : 32 + +name : aes +driver : aes-aesni +module : kernel +priority : 300 +refcnt : 8 +selftest : passed +internal : no +type : cipher +blocksize : 16 +min keysize : 16 +max keysize : 32 + +name : hmac(sha1) +driver : hmac(sha1-generic) +module : kernel +priority : 100 +refcnt : 9 +selftest : passed +internal : no +type : shash +blocksize : 64 +digestsize : 20 + +name : ghash +driver : ghash-generic +module : kernel +priority : 100 +refcnt : 3 +selftest : passed +internal : no +type : shash +blocksize : 16 +digestsize : 16 + +name : jitterentropy_rng +driver : jitterentropy_rng +module : kernel +priority : 100 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_nopr_hmac_sha256 +module : kernel +priority : 221 +refcnt : 2 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_nopr_hmac_sha512 +module : kernel +priority : 220 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_nopr_hmac_sha384 +module : kernel +priority : 219 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_nopr_hmac_sha1 +module : kernel +priority : 218 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_nopr_sha256 +module : kernel +priority : 217 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_nopr_sha512 +module : kernel +priority : 216 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_nopr_sha384 +module : kernel +priority : 215 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_nopr_sha1 +module : kernel +priority : 214 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_nopr_ctr_aes256 +module : kernel +priority : 213 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_nopr_ctr_aes192 +module : kernel +priority : 212 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_nopr_ctr_aes128 +module : kernel +priority : 211 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : hmac(sha256) +driver : hmac(sha256-generic) +module : kernel +priority : 100 +refcnt : 10 +selftest : passed +internal : no +type : shash +blocksize : 64 +digestsize : 32 + +name : stdrng +driver : drbg_pr_hmac_sha256 +module : kernel +priority : 210 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_pr_hmac_sha512 +module : kernel +priority : 209 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_pr_hmac_sha384 +module : kernel +priority : 208 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_pr_hmac_sha1 +module : kernel +priority : 207 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_pr_sha256 +module : kernel +priority : 206 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_pr_sha512 +module : kernel +priority : 205 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_pr_sha384 +module : kernel +priority : 204 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_pr_sha1 +module : kernel +priority : 203 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_pr_ctr_aes256 +module : kernel +priority : 202 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_pr_ctr_aes192 +module : kernel +priority : 201 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_pr_ctr_aes128 +module : kernel +priority : 200 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : 842 +driver : 842-scomp +module : kernel +priority : 100 +refcnt : 1 +selftest : passed +internal : no +type : scomp + +name : 842 +driver : 842-generic +module : kernel +priority : 100 +refcnt : 1 +selftest : passed +internal : no +type : compression + +name : lzo-rle +driver : lzo-rle-scomp +module : kernel +priority : 0 +refcnt : 1 +selftest : passed +internal : no +type : scomp + +name : lzo-rle +driver : lzo-rle-generic +module : kernel +priority : 0 +refcnt : 1 +selftest : passed +internal : no +type : compression + +name : lzo +driver : lzo-scomp +module : kernel +priority : 0 +refcnt : 1 +selftest : passed +internal : no +type : scomp + +name : lzo +driver : lzo-generic +module : kernel +priority : 0 +refcnt : 9 +selftest : passed +internal : no +type : compression + +name : crct10dif +driver : crct10dif-generic +module : kernel +priority : 100 +refcnt : 1 +selftest : passed +internal : no +type : shash +blocksize : 1 +digestsize : 2 + +name : crc32c +driver : crc32c-generic +module : kernel +priority : 100 +refcnt : 1 +selftest : passed +internal : no +type : shash +blocksize : 1 +digestsize : 4 + +name : zlib-deflate +driver : zlib-deflate-scomp +module : kernel +priority : 0 +refcnt : 1 +selftest : passed +internal : no +type : scomp + +name : deflate +driver : deflate-scomp +module : kernel +priority : 0 +refcnt : 1 +selftest : passed +internal : no +type : scomp + +name : deflate +driver : deflate-generic +module : kernel +priority : 0 +refcnt : 1 +selftest : passed +internal : no +type : compression + +name : aes +driver : aes-generic +module : kernel +priority : 100 +refcnt : 1 +selftest : passed +internal : no +type : cipher +blocksize : 16 +min keysize : 16 +max keysize : 32 + +name : sha224 +driver : sha224-generic +module : kernel +priority : 100 +refcnt : 1 +selftest : passed +internal : no +type : shash +blocksize : 64 +digestsize : 28 + +name : sha256 +driver : sha256-generic +module : kernel +priority : 100 +refcnt : 11 +selftest : passed +internal : no +type : shash +blocksize : 64 +digestsize : 32 + +name : sha1 +driver : sha1-generic +module : kernel +priority : 100 +refcnt : 11 +selftest : passed +internal : no +type : shash +blocksize : 64 +digestsize : 20 + +name : md5 +driver : md5-generic +module : kernel +priority : 0 +refcnt : 1 +selftest : passed +internal : no +type : shash +blocksize : 64 +digestsize : 16 + +name : ecb(cipher_null) +driver : ecb-cipher_null +module : kernel +priority : 100 +refcnt : 1 +selftest : passed +internal : no +type : skcipher +async : no +blocksize : 1 +min keysize : 0 +max keysize : 0 +ivsize : 0 +chunksize : 1 +walksize : 1 + +name : digest_null +driver : digest_null-generic +module : kernel +priority : 0 +refcnt : 1 +selftest : passed +internal : no +type : shash +blocksize : 1 +digestsize : 0 + +name : compress_null +driver : compress_null-generic +module : kernel +priority : 0 +refcnt : 1 +selftest : passed +internal : no +type : compression + +name : cipher_null +driver : cipher_null-generic +module : kernel +priority : 0 +refcnt : 1 +selftest : passed +internal : no +type : cipher +blocksize : 1 +min keysize : 0 +max keysize : 0 + +name : rsa +driver : rsa-generic +module : kernel +priority : 100 +refcnt : 1 +selftest : passed +internal : no +type : akcipher + +name : dh +driver : dh-generic +module : kernel +priority : 100 +refcnt : 1 +selftest : passed +internal : no +type : kpp + +name : aes +driver : aes-asm +module : kernel +priority : 200 +refcnt : 1 +selftest : passed +internal : no +type : cipher +blocksize : 16 +min keysize : 16 +max keysize : 32 + +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/buddyinfo/valid/buddyinfo -Lines: 3 -Node 0, zone DMA 1 0 1 0 2 1 1 0 1 1 3 -Node 0, zone DMA32 759 572 791 475 194 45 12 0 0 0 0 -Node 0, zone Normal 4381 1093 185 1530 567 102 4 0 0 0 0 -Mode: 644 +Path: fixtures/proc/diskstats +Lines: 49 + 1 0 ram0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 ram1 0 0 0 0 0 0 0 0 0 0 0 + 1 2 ram2 0 0 0 0 0 0 0 0 0 0 0 + 1 3 ram3 0 0 0 0 0 0 0 0 0 0 0 + 1 4 ram4 0 0 0 0 0 0 0 0 0 0 0 + 1 5 ram5 0 0 0 0 0 0 0 0 0 0 0 + 1 6 ram6 0 0 0 0 0 0 0 0 0 0 0 + 1 7 ram7 0 0 0 0 0 0 0 0 0 0 0 + 1 8 ram8 0 0 0 0 0 0 0 0 0 0 0 + 1 9 ram9 0 0 0 0 0 0 0 0 0 0 0 + 1 10 ram10 0 0 0 0 0 0 0 0 0 0 0 + 1 11 ram11 0 0 0 0 0 0 0 0 0 0 0 + 1 12 ram12 0 0 0 0 0 0 0 0 0 0 0 + 1 13 ram13 0 0 0 0 0 0 0 0 0 0 0 + 1 14 ram14 0 0 0 0 0 0 0 0 0 0 0 + 1 15 ram15 0 0 0 0 0 0 0 0 0 0 0 + 7 0 loop0 0 0 0 0 0 0 0 0 0 0 0 + 7 1 loop1 0 0 0 0 0 0 0 0 0 0 0 + 7 2 loop2 0 0 0 0 0 0 0 0 0 0 0 + 7 3 loop3 0 0 0 0 0 0 0 0 0 0 0 + 7 4 loop4 0 0 0 0 0 0 0 0 0 0 0 + 7 5 loop5 0 0 0 0 0 0 0 0 0 0 0 + 7 6 loop6 0 0 0 0 0 0 0 0 0 0 0 + 7 7 loop7 0 0 0 0 0 0 0 0 0 0 0 + 8 0 sda 25354637 34367663 1003346126 18492372 28444756 11134226 505697032 63877960 0 9653880 82621804 + 8 1 sda1 250 0 2000 36 0 0 0 0 0 36 36 + 8 2 sda2 246 0 1968 32 0 0 0 0 0 32 32 + 8 3 sda3 340 13 2818 52 11 8 152 8 0 56 60 + 8 4 sda4 25353629 34367650 1003337964 18492232 27448755 11134218 505696880 61593380 0 7576432 80332428 + 252 0 dm-0 59910002 0 1003337218 46229572 39231014 0 505696880 1158557800 0 11325968 1206301256 + 252 1 dm-1 388 0 3104 84 74 0 592 0 0 76 84 + 252 2 dm-2 11571 0 308350 6536 153522 0 5093416 122884 0 65400 129416 + 252 3 dm-3 3870 0 3870 104 0 0 0 0 0 16 104 + 252 4 dm-4 392 0 1034 28 38 0 137 16 0 24 44 + 252 5 dm-5 3729 0 84279 924 98918 0 1151688 104684 0 58848 105632 + 179 0 mmcblk0 192 3 1560 156 0 0 0 0 0 136 156 + 179 1 mmcblk0p1 17 3 160 24 0 0 0 0 0 24 24 + 179 2 mmcblk0p2 95 0 760 68 0 0 0 0 0 68 68 + 2 0 fd0 2 0 16 80 0 0 0 0 0 80 80 + 254 0 vda 1775784 15386 32670882 8655768 6038856 20711856 213637440 2069221364 0 41614592 2077872228 + 254 1 vda1 668 85 5984 956 207 4266 35784 32772 0 8808 33720 + 254 2 vda2 1774936 15266 32663262 8654692 5991028 20707590 213601656 2069152216 0 41607628 2077801992 + 11 0 sr0 0 0 0 0 0 0 0 0 0 0 0 + 259 0 nvme0n1 47114 4 4643973 21650 1078320 43950 39451633 1011053 0 222766 1032546 + 259 1 nvme0n1p1 1140 0 9370 16 1 0 1 0 0 16 16 + 259 2 nvme0n1p2 45914 4 4631243 21626 1036885 43950 39451632 919480 0 131580 940970 + 8 0 sdb 326552 841 9657779 84 41822 2895 1972905 5007 0 60730 67070 68851 0 1925173784 11130 + 8 1 sdb1 231 3 34466 4 24 23 106 0 0 64 64 0 0 0 0 + 8 2 sdb2 326310 838 9622281 67 40726 2872 1972799 4924 0 58250 64567 68851 0 1925173784 11130 +Mode: 664 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/fs +Directory: fixtures/proc/fs Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/fs/xfs +Directory: fixtures/proc/fs/xfs Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/fs/xfs/stat +Path: fixtures/proc/fs/xfs/stat Lines: 23 extent_alloc 92447 97589 92448 93751 abt 0 0 0 0 @@ -267,40 +1614,122 @@ xpc 399724544 92823103 86219234 debug 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/mdstat -Lines: 26 +Path: fixtures/proc/mdstat +Lines: 56 Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] -md3 : active raid6 sda1[8] sdh1[7] sdg1[6] sdf1[5] sde1[11] sdd1[3] sdc1[10] sdb1[9] + +md3 : active raid6 sda1[8] sdh1[7] sdg1[6] sdf1[5] sde1[11] sdd1[3] sdc1[10] sdb1[9] sdd1[10](S) sdd2[11](S) 5853468288 blocks super 1.2 level 6, 64k chunk, algorithm 2 [8/8] [UUUUUUUU] - + md127 : active raid1 sdi2[0] sdj2[1] 312319552 blocks [2/2] [UU] - -md0 : active raid1 sdk[2](S) sdi1[0] sdj1[1] + +md0 : active raid1 sdi1[0] sdj1[1] 248896 blocks [2/2] [UU] - -md4 : inactive raid1 sda3[0] sdb3[1] + +md4 : inactive raid1 sda3[0](F) sdb3[1](S) 4883648 blocks [2/2] [UU] -md6 : active raid1 sdb2[2] sda2[0] +md6 : active raid1 sdb2[2](F) sdc[1](S) sda2[0] 195310144 blocks [2/1] [U_] [=>...................] recovery = 8.5% (16775552/195310144) finish=17.0min speed=259783K/sec -md8 : active raid1 sdb1[1] sda1[0] +md8 : active raid1 sdb1[1] sda1[0] sdc[2](S) sde[3](S) 195310144 blocks [2/2] [UU] [=>...................] resync = 8.5% (16775552/195310144) finish=17.0min speed=259783K/sec -md7 : active raid6 sdb1[0] sde1[3] sdd1[2] sdc1[1] +md7 : active raid6 sdb1[0] sde1[3] sdd1[2] sdc1[1](F) 7813735424 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/3] [U_UU] bitmap: 0/30 pages [0KB], 65536KB chunk +md9 : active raid1 sdc2[2] sdd2[3] sdb2[1] sda2[0] sde[4](F) sdf[5](F) sdg[6](S) + 523968 blocks super 1.2 [4/4] [UUUU] + resync=DELAYED + +md10 : active raid0 sda1[0] sdb1[1] + 314159265 blocks 64k chunks + +md11 : active (auto-read-only) raid1 sdb2[0] sdc2[1] sdc3[2](F) hda[4](S) ssdc2[3](S) + 4190208 blocks super 1.2 [2/2] [UU] + resync=PENDING + +md12 : active raid0 sdc2[0] sdd2[1] + 3886394368 blocks super 1.2 512k chunks + +md126 : active raid0 sdb[1] sdc[0] + 1855870976 blocks super external:/md127/0 128k chunks + +md219 : inactive sdb[2](S) sdc[1](S) sda[0](S) + 7932 blocks super external:imsm + +md00 : active raid0 xvdb[0] + 4186624 blocks super 1.2 256k chunks + +md120 : active linear sda1[1] sdb1[0] + 2095104 blocks super 1.2 0k rounding + +md101 : active (read-only) raid0 sdb[2] sdd[1] sdc[0] + 322560 blocks super 1.2 512k chunks + unused devices: Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/net +Path: fixtures/proc/meminfo +Lines: 42 +MemTotal: 15666184 kB +MemFree: 440324 kB +Buffers: 1020128 kB +Cached: 12007640 kB +SwapCached: 0 kB +Active: 6761276 kB +Inactive: 6532708 kB +Active(anon): 267256 kB +Inactive(anon): 268 kB +Active(file): 6494020 kB +Inactive(file): 6532440 kB +Unevictable: 0 kB +Mlocked: 0 kB +SwapTotal: 0 kB +SwapFree: 0 kB +Dirty: 768 kB +Writeback: 0 kB +AnonPages: 266216 kB +Mapped: 44204 kB +Shmem: 1308 kB +Slab: 1807264 kB +SReclaimable: 1738124 kB +SUnreclaim: 69140 kB +KernelStack: 1616 kB +PageTables: 5288 kB +NFS_Unstable: 0 kB +Bounce: 0 kB +WritebackTmp: 0 kB +CommitLimit: 7833092 kB +Committed_AS: 530844 kB +VmallocTotal: 34359738367 kB +VmallocUsed: 36596 kB +VmallocChunk: 34359637840 kB +HardwareCorrupted: 0 kB +AnonHugePages: 12288 kB +HugePages_Total: 0 +HugePages_Free: 0 +HugePages_Rsvd: 0 +HugePages_Surp: 0 +Hugepagesize: 2048 kB +DirectMap4k: 91136 kB +DirectMap2M: 16039936 kB +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc/net Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/net/dev +Path: fixtures/proc/net/arp +Lines: 2 +IP address HW type Flags HW address Mask Device +192.168.224.1 0x1 0x2 00:50:56:c0:00:08 * ens33 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/net/dev Lines: 6 Inter-| Receive | Transmit face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed @@ -310,7 +1739,7 @@ docker0: 2568 38 0 0 0 0 0 0 438 eth0: 874354587 1036395 0 0 0 0 0 0 563352563 732147 0 0 0 0 0 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/net/ip_vs +Path: fixtures/proc/net/ip_vs Lines: 21 IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags @@ -335,7 +1764,7 @@ FWM 10001000 wlc -> C0A83215:0CEA Route 0 0 2 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/net/ip_vs_stats +Path: fixtures/proc/net/ip_vs_stats Lines: 6 Total Incoming Outgoing Incoming Outgoing Conns Packets Packets Bytes Bytes @@ -345,10 +1774,10 @@ Lines: 6 4 1FB3C 0 1282A8F 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/net/rpc +Directory: fixtures/proc/net/rpc Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/net/rpc/nfs +Path: fixtures/proc/net/rpc/nfs Lines: 5 net 18628 0 18628 6 rpc 4329785 0 4338291 @@ -357,7 +1786,7 @@ proc3 22 1 4084749 29200 94754 32580 186 47747 7981 8639 0 6356 0 6962 0 7958 0 proc4 61 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/net/rpc/nfsd +Path: fixtures/proc/net/rpc/nfsd Lines: 11 rc 0 6 18622 fh 0 0 0 0 0 @@ -372,7 +1801,51 @@ proc4 2 2 10853 proc4ops 72 0 0 0 1098 2 0 0 0 0 8179 5896 0 0 0 0 5900 0 0 2 0 2 0 9609 0 2 150 1272 0 0 0 1236 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/net/xfrm_stat +Path: fixtures/proc/net/sockstat +Lines: 6 +sockets: used 1602 +TCP: inuse 35 orphan 0 tw 4 alloc 59 mem 22 +UDP: inuse 12 mem 62 +UDPLITE: inuse 0 +RAW: inuse 0 +FRAG: inuse 0 memory 0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/net/sockstat6 +Lines: 5 +TCP6: inuse 17 +UDP6: inuse 9 +UDPLITE6: inuse 0 +RAW6: inuse 1 +FRAG6: inuse 0 memory 0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/net/softnet_stat +Lines: 1 +00015c73 00020e76 F0000769 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/net/unix +Lines: 6 +Num RefCount Protocol Flags Type St Inode Path +0000000000000000: 00000002 00000000 00010000 0001 01 3442596 /var/run/postgresql/.s.PGSQL.5432 +0000000000000000: 0000000a 00000000 00010000 0005 01 10061 /run/udev/control +0000000000000000: 00000007 00000000 00000000 0002 01 12392 /dev/log +0000000000000000: 00000003 00000000 00000000 0001 03 4787297 /var/run/postgresql/.s.PGSQL.5432 +0000000000000000: 00000003 00000000 00000000 0001 03 5091797 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/net/unix_without_inode +Lines: 6 +Num RefCount Protocol Flags Type St Path +0000000000000000: 00000002 00000000 00010000 0001 01 /var/run/postgresql/.s.PGSQL.5432 +0000000000000000: 0000000a 00000000 00010000 0005 01 /run/udev/control +0000000000000000: 00000007 00000000 00000000 0002 01 /dev/log +0000000000000000: 00000003 00000000 00000000 0001 03 /var/run/postgresql/.s.PGSQL.5432 +0000000000000000: 00000003 00000000 00000000 0001 03 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/net/xfrm_stat Lines: 28 XfrmInError 1 XfrmInBufferError 2 @@ -404,10 +1877,40 @@ XfrmOutStateInvalid 28765 XfrmAcquireError 24532 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/self +Directory: fixtures/proc/pressure +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/pressure/cpu +Lines: 1 +some avg10=0.10 avg60=2.00 avg300=3.85 total=15 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/pressure/io +Lines: 2 +some avg10=0.10 avg60=2.00 avg300=3.85 total=15 +full avg10=0.20 avg60=3.00 avg300=4.95 total=25 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/pressure/memory +Lines: 2 +some avg10=0.10 avg60=2.00 avg300=3.85 total=15 +full avg10=0.20 avg60=3.00 avg300=4.95 total=25 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/schedstat +Lines: 6 +version 15 +timestamp 15819019232 +cpu0 498494191 0 3533438552 2553969831 3853684107 2465731542 2045936778163039 343796328169361 4767485306 +domain0 00000000,00000003 212499247 210112015 1861015 1860405436 536440 369895 32599 210079416 25368550 24241256 384652 927363878 807233 6366 1647 24239609 2122447165 1886868564 121112060 2848625533 125678146 241025 1032026 1885836538 2545 12 2533 0 0 0 0 0 0 1387952561 21076581 0 +cpu1 518377256 0 4155211005 2778589869 10466382 2867629021 1904686152592476 364107263788241 5145567945 +domain0 00000000,00000003 217653037 215526982 1577949 1580427380 557469 393576 28538 215498444 28721913 27662819 371153 870843407 745912 5523 1639 27661180 2331056874 2107732788 111442342 652402556 123615235 196159 1045245 2106687543 2400 3 2397 0 0 0 0 0 0 1437804657 26220076 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/self SymlinkTo: 26231 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/stat +Path: fixtures/proc/stat Lines: 16 cpu 301854 612 111922 8979004 3552 2 3944 0 0 0 cpu0 44490 19 21045 1087069 220 1 3410 0 0 0 @@ -427,36 +1930,3389 @@ procs_blocked 1 softirq 5057579 250191 1481983 1647 211099 186066 0 1783454 622196 12499 508444 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/symlinktargets +Directory: fixtures/proc/symlinktargets Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/symlinktargets/README +Path: fixtures/proc/symlinktargets/README Lines: 2 This directory contains some empty files that are the symlinks the files in the "fd" directory point to. They are otherwise ignored by the tests Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/symlinktargets/abc +Path: fixtures/proc/symlinktargets/abc Lines: 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/symlinktargets/def +Path: fixtures/proc/symlinktargets/def Lines: 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/symlinktargets/ghi +Path: fixtures/proc/symlinktargets/ghi Lines: 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/symlinktargets/uvw +Path: fixtures/proc/symlinktargets/uvw Lines: 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/symlinktargets/xyz +Path: fixtures/proc/symlinktargets/xyz Lines: 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/.unpacked -Lines: 0 -Mode: 664 +Directory: fixtures/proc/sys +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc/sys/vm +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/admin_reserve_kbytes +Lines: 1 +8192 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/block_dump +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/compact_unevictable_allowed +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/dirty_background_bytes +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/dirty_background_ratio +Lines: 1 +10 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/dirty_bytes +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/dirty_expire_centisecs +Lines: 1 +3000 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/dirty_ratio +Lines: 1 +20 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/dirty_writeback_centisecs +Lines: 1 +500 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/dirtytime_expire_seconds +Lines: 1 +43200 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/drop_caches +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/extfrag_threshold +Lines: 1 +500 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/hugetlb_shm_group +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/laptop_mode +Lines: 1 +5 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/legacy_va_layout +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/lowmem_reserve_ratio +Lines: 1 +256 256 32 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/max_map_count +Lines: 1 +65530 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/memory_failure_early_kill +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/memory_failure_recovery +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/min_free_kbytes +Lines: 1 +67584 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/min_slab_ratio +Lines: 1 +5 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/min_unmapped_ratio +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/mmap_min_addr +Lines: 1 +65536 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/nr_hugepages +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/nr_hugepages_mempolicy +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/nr_overcommit_hugepages +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/numa_stat +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/numa_zonelist_order +Lines: 1 +Node +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/oom_dump_tasks +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/oom_kill_allocating_task +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/overcommit_kbytes +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/overcommit_memory +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/overcommit_ratio +Lines: 1 +50 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/page-cluster +Lines: 1 +3 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/panic_on_oom +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/percpu_pagelist_fraction +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/stat_interval +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/swappiness +Lines: 1 +60 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/user_reserve_kbytes +Lines: 1 +131072 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/vfs_cache_pressure +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/watermark_boost_factor +Lines: 1 +15000 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/watermark_scale_factor +Lines: 1 +10 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/zone_reclaim_mode +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/zoneinfo +Lines: 262 +Node 0, zone DMA + per-node stats + nr_inactive_anon 230981 + nr_active_anon 547580 + nr_inactive_file 316904 + nr_active_file 346282 + nr_unevictable 115467 + nr_slab_reclaimable 131220 + nr_slab_unreclaimable 47320 + nr_isolated_anon 0 + nr_isolated_file 0 + workingset_nodes 11627 + workingset_refault 466886 + workingset_activate 276925 + workingset_restore 84055 + workingset_nodereclaim 487 + nr_anon_pages 795576 + nr_mapped 215483 + nr_file_pages 761874 + nr_dirty 908 + nr_writeback 0 + nr_writeback_temp 0 + nr_shmem 224925 + nr_shmem_hugepages 0 + nr_shmem_pmdmapped 0 + nr_anon_transparent_hugepages 0 + nr_unstable 0 + nr_vmscan_write 12950 + nr_vmscan_immediate_reclaim 3033 + nr_dirtied 8007423 + nr_written 7752121 + nr_kernel_misc_reclaimable 0 + pages free 3952 + min 33 + low 41 + high 49 + spanned 4095 + present 3975 + managed 3956 + protection: (0, 2877, 7826, 7826, 7826) + nr_free_pages 3952 + nr_zone_inactive_anon 0 + nr_zone_active_anon 0 + nr_zone_inactive_file 0 + nr_zone_active_file 0 + nr_zone_unevictable 0 + nr_zone_write_pending 0 + nr_mlock 0 + nr_page_table_pages 0 + nr_kernel_stack 0 + nr_bounce 0 + nr_zspages 0 + nr_free_cma 0 + numa_hit 1 + numa_miss 0 + numa_foreign 0 + numa_interleave 0 + numa_local 1 + numa_other 0 + pagesets + cpu: 0 + count: 0 + high: 0 + batch: 1 + vm stats threshold: 8 + cpu: 1 + count: 0 + high: 0 + batch: 1 + vm stats threshold: 8 + cpu: 2 + count: 0 + high: 0 + batch: 1 + vm stats threshold: 8 + cpu: 3 + count: 0 + high: 0 + batch: 1 + vm stats threshold: 8 + cpu: 4 + count: 0 + high: 0 + batch: 1 + vm stats threshold: 8 + cpu: 5 + count: 0 + high: 0 + batch: 1 + vm stats threshold: 8 + cpu: 6 + count: 0 + high: 0 + batch: 1 + vm stats threshold: 8 + cpu: 7 + count: 0 + high: 0 + batch: 1 + vm stats threshold: 8 + node_unreclaimable: 0 + start_pfn: 1 +Node 0, zone DMA32 + pages free 204252 + min 19510 + low 21059 + high 22608 + spanned 1044480 + present 759231 + managed 742806 + protection: (0, 0, 4949, 4949, 4949) + nr_free_pages 204252 + nr_zone_inactive_anon 118558 + nr_zone_active_anon 106598 + nr_zone_inactive_file 75475 + nr_zone_active_file 70293 + nr_zone_unevictable 66195 + nr_zone_write_pending 64 + nr_mlock 4 + nr_page_table_pages 1756 + nr_kernel_stack 2208 + nr_bounce 0 + nr_zspages 0 + nr_free_cma 0 + numa_hit 113952967 + numa_miss 0 + numa_foreign 0 + numa_interleave 0 + numa_local 113952967 + numa_other 0 + pagesets + cpu: 0 + count: 345 + high: 378 + batch: 63 + vm stats threshold: 48 + cpu: 1 + count: 356 + high: 378 + batch: 63 + vm stats threshold: 48 + cpu: 2 + count: 325 + high: 378 + batch: 63 + vm stats threshold: 48 + cpu: 3 + count: 346 + high: 378 + batch: 63 + vm stats threshold: 48 + cpu: 4 + count: 321 + high: 378 + batch: 63 + vm stats threshold: 48 + cpu: 5 + count: 316 + high: 378 + batch: 63 + vm stats threshold: 48 + cpu: 6 + count: 373 + high: 378 + batch: 63 + vm stats threshold: 48 + cpu: 7 + count: 339 + high: 378 + batch: 63 + vm stats threshold: 48 + node_unreclaimable: 0 + start_pfn: 4096 +Node 0, zone Normal + pages free 18553 + min 11176 + low 13842 + high 16508 + spanned 1308160 + present 1308160 + managed 1268711 + protection: (0, 0, 0, 0, 0) + nr_free_pages 18553 + nr_zone_inactive_anon 112423 + nr_zone_active_anon 440982 + nr_zone_inactive_file 241429 + nr_zone_active_file 275989 + nr_zone_unevictable 49272 + nr_zone_write_pending 844 + nr_mlock 154 + nr_page_table_pages 9750 + nr_kernel_stack 15136 + nr_bounce 0 + nr_zspages 0 + nr_free_cma 0 + numa_hit 162718019 + numa_miss 0 + numa_foreign 0 + numa_interleave 26812 + numa_local 162718019 + numa_other 0 + pagesets + cpu: 0 + count: 316 + high: 378 + batch: 63 + vm stats threshold: 56 + cpu: 1 + count: 366 + high: 378 + batch: 63 + vm stats threshold: 56 + cpu: 2 + count: 60 + high: 378 + batch: 63 + vm stats threshold: 56 + cpu: 3 + count: 256 + high: 378 + batch: 63 + vm stats threshold: 56 + cpu: 4 + count: 253 + high: 378 + batch: 63 + vm stats threshold: 56 + cpu: 5 + count: 159 + high: 378 + batch: 63 + vm stats threshold: 56 + cpu: 6 + count: 311 + high: 378 + batch: 63 + vm stats threshold: 56 + cpu: 7 + count: 264 + high: 378 + batch: 63 + vm stats threshold: 56 + node_unreclaimable: 0 + start_pfn: 1048576 +Node 0, zone Movable + pages free 0 + min 0 + low 0 + high 0 + spanned 0 + present 0 + managed 0 + protection: (0, 0, 0, 0, 0) +Node 0, zone Device + pages free 0 + min 0 + low 0 + high 0 + spanned 0 + present 0 + managed 0 + protection: (0, 0, 0, 0, 0) +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/block +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/block/dm-0 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/block/dm-0/stat +Lines: 1 +6447303 0 710266738 1529043 953216 0 31201176 4557464 0 796160 6088971 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/block/sda +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/block/sda/stat +Lines: 1 +9652963 396792 759304206 412943 8422549 6731723 286915323 13947418 0 5658367 19174573 1 2 3 12 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/infiniband +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/infiniband/mlx4_0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/board_id +Lines: 1 +SM_1141000001000 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/fw_ver +Lines: 1 +2.31.5050 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/hca_type +Lines: 1 +MT4099 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/infiniband/mlx4_0/ports +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/infiniband/mlx4_0/ports/1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/excessive_buffer_overrun_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/link_downed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/link_error_recovery +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/local_link_integrity_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_constraint_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_data +Lines: 1 +2221223609 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_packets +Lines: 1 +87169372 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_remote_physical_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_switch_relay_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_constraint_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_data +Lines: 1 +26509113295 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_discards +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_packets +Lines: 1 +85734114 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_wait +Lines: 1 +3599 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/symbol_error +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/phys_state +Lines: 1 +5: LinkUp +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/rate +Lines: 1 +40 Gb/sec (4X QDR) +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/state +Lines: 1 +4: ACTIVE +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/infiniband/mlx4_0/ports/2 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/excessive_buffer_overrun_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/link_downed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/link_error_recovery +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/local_link_integrity_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_constraint_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_data +Lines: 1 +2460436784 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_packets +Lines: 1 +89332064 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_remote_physical_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_switch_relay_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_xmit_constraint_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_xmit_data +Lines: 1 +26540356890 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_xmit_discards +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_xmit_packets +Lines: 1 +88622850 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_xmit_wait +Lines: 1 +3846 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/symbol_error +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/phys_state +Lines: 1 +5: LinkUp +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/rate +Lines: 1 +40 Gb/sec (4X QDR) +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/state +Lines: 1 +4: ACTIVE +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/net +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/net/eth0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/addr_assign_type +Lines: 1 +3 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/addr_len +Lines: 1 +6 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/address +Lines: 1 +01:01:01:01:01:01 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/broadcast +Lines: 1 +ff:ff:ff:ff:ff:ff +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/carrier +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/carrier_changes +Lines: 1 +2 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/carrier_down_count +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/carrier_up_count +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/dev_id +Lines: 1 +0x20 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/device +SymlinkTo: ../../../devices/pci0000:00/0000:00:1f.6/ +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/dormant +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/duplex +Lines: 1 +full +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/flags +Lines: 1 +0x1303 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ifalias +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ifindex +Lines: 1 +2 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/iflink +Lines: 1 +2 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/link_mode +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/mtu +Lines: 1 +1500 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/name_assign_type +Lines: 1 +2 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/netdev_group +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/operstate +Lines: 1 +up +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/phys_port_id +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/phys_port_name +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/phys_switch_id +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/speed +Lines: 1 +1000 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/tx_queue_len +Lines: 1 +1000 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/type +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/power_supply +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/power_supply/AC +SymlinkTo: ../../devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/power_supply/BAT0 +SymlinkTo: ../../devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/powercap +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/powercap/intel-rapl +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl/enabled +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl/uevent +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/powercap/intel-rapl:0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0/constraint_0_max_power_uw +Lines: 1 +95000000 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0/constraint_0_name +Lines: 1 +long_term +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0/constraint_0_power_limit_uw +Lines: 1 +4090000000 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0/constraint_0_time_window_us +Lines: 1 +999424 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0/constraint_1_max_power_uw +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0/constraint_1_name +Lines: 1 +short_term +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0/constraint_1_power_limit_uw +Lines: 1 +4090000000 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0/constraint_1_time_window_us +Lines: 1 +2440 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0/enabled +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0/energy_uj +Lines: 1 +240422366267 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0/max_energy_range_uj +Lines: 1 +262143328850 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0/name +Lines: 1 +package-0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0/uevent +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/powercap/intel-rapl:0:0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0:0/constraint_0_max_power_uw +Lines: 0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0:0/constraint_0_name +Lines: 1 +long_term +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0:0/constraint_0_power_limit_uw +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0:0/constraint_0_time_window_us +Lines: 1 +976 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0:0/enabled +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0:0/energy_uj +Lines: 1 +118821284256 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0:0/max_energy_range_uj +Lines: 1 +262143328850 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0:0/name +Lines: 1 +core +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0:0/uevent +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/thermal +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/thermal/cooling_device0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/cooling_device0/cur_state +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/cooling_device0/max_state +Lines: 1 +50 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/cooling_device0/type +Lines: 1 +Processor +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/thermal/cooling_device1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/cooling_device1/cur_state +Lines: 1 +-1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/cooling_device1/max_state +Lines: 1 +27 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/cooling_device1/type +Lines: 1 +intel_powerclamp +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/thermal/thermal_zone0 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/thermal_zone0/policy +Lines: 1 +step_wise +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/thermal_zone0/temp +Lines: 1 +49925 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/thermal_zone0/type +Lines: 1 +bcm2835_thermal +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/thermal/thermal_zone1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/thermal_zone1/mode +Lines: 1 +enabled +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/thermal_zone1/passive +Lines: 1 +0 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/thermal_zone1/policy +Lines: 1 +step_wise +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/thermal_zone1/temp +Lines: 1 +44000 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/thermal_zone1/type +Lines: 1 +acpitz +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/LNXSYSTM:00 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/device +SymlinkTo: ../../../ACPI0003:00 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/online +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/async +Lines: 1 +disabled +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/autosuspend_delay_ms +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/control +Lines: 1 +auto +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/runtime_active_kids +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/runtime_active_time +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/runtime_enabled +Lines: 1 +disabled +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/runtime_status +Lines: 1 +unsupported +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/runtime_suspended_time +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/runtime_usage +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup +Lines: 1 +enabled +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_abort_count +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_active +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_active_count +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_count +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_expire_count +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_last_time_ms +Lines: 1 +10598 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_max_time_ms +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_prevent_sleep_time_ms +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_total_time_ms +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/subsystem +SymlinkTo: ../../../../../../../../../class/power_supply +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/type +Lines: 1 +Mains +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/uevent +Lines: 2 +POWER_SUPPLY_NAME=AC +POWER_SUPPLY_ONLINE=0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/alarm +Lines: 1 +2369000 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/capacity +Lines: 1 +98 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/capacity_level +Lines: 1 +Normal +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/charge_start_threshold +Lines: 1 +95 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/charge_stop_threshold +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/cycle_count +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/device +SymlinkTo: ../../../PNP0C0A:00 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/energy_full +Lines: 1 +50060000 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/energy_full_design +Lines: 1 +47520000 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/energy_now +Lines: 1 +49450000 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/manufacturer +Lines: 1 +LGC +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/model_name +Lines: 1 +LNV-45N1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/async +Lines: 1 +disabled +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/autosuspend_delay_ms +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/control +Lines: 1 +auto +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/runtime_active_kids +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/runtime_active_time +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/runtime_enabled +Lines: 1 +disabled +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/runtime_status +Lines: 1 +unsupported +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/runtime_suspended_time +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/runtime_usage +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power_now +Lines: 1 +4830000 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/present +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/serial_number +Lines: 1 +38109 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/status +Lines: 1 +Discharging +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/subsystem +SymlinkTo: ../../../../../../../../../class/power_supply +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/technology +Lines: 1 +Li-ion +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/type +Lines: 1 +Battery +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/uevent +Lines: 16 +POWER_SUPPLY_NAME=BAT0 +POWER_SUPPLY_STATUS=Discharging +POWER_SUPPLY_PRESENT=1 +POWER_SUPPLY_TECHNOLOGY=Li-ion +POWER_SUPPLY_CYCLE_COUNT=0 +POWER_SUPPLY_VOLTAGE_MIN_DESIGN=10800000 +POWER_SUPPLY_VOLTAGE_NOW=11750000 +POWER_SUPPLY_POWER_NOW=5064000 +POWER_SUPPLY_ENERGY_FULL_DESIGN=47520000 +POWER_SUPPLY_ENERGY_FULL=47390000 +POWER_SUPPLY_ENERGY_NOW=40730000 +POWER_SUPPLY_CAPACITY=85 +POWER_SUPPLY_CAPACITY_LEVEL=Normal +POWER_SUPPLY_MODEL_NAME=LNV-45N1 +POWER_SUPPLY_MANUFACTURER=LGC +POWER_SUPPLY_SERIAL_NUMBER=38109 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/voltage_min_design +Lines: 1 +10800000 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/voltage_now +Lines: 1 +12229000 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/dirty_data +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_hit_ratio +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_hits +Lines: 1 +289 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_hit_ratio +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_hit_ratio +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_hit_ratio +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_hits +Lines: 1 +546 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache/io_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache/metadata_written +Lines: 1 +512 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache/priority_stats +Lines: 5 +Unused: 99% +Metadata: 0% +Average: 10473 +Sectors per Q: 64 +Quantiles: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946] +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache/written +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:1f.6 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/ari_enabled +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/broken_parity_status +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/class +Lines: 1 +0x020000 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/consistent_dma_mask_bits +Lines: 1 +64 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/d3cold_allowed +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/device +Lines: 1 +0x15d7 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/dma_mask_bits +Lines: 1 +64 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/driver_override +Lines: 1 +(null) +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/enable +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/irq +Lines: 1 +140 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/local_cpulist +Lines: 1 +0-7 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/local_cpus +Lines: 1 +ff +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/modalias +Lines: 1 +pci:v00008086d000015D7sv000017AAsd0000225Abc02sc00i00 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/msi_bus +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/numa_node +Lines: 1 +-1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/resource +Lines: 13 +0x00000000ec200000 0x00000000ec21ffff 0x0000000000040200 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/revision +Lines: 1 +0x21 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/subsystem_device +Lines: 1 +0x225a +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/subsystem_vendor +Lines: 1 +0x17aa +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/uevent +Lines: 6 +DRIVER=e1000e +PCI_CLASS=20000 +PCI_ID=8086:15D7 +PCI_SUBSYS_ID=17AA:225A +PCI_SLOT_NAME=0000:00:1f.6 +MODALIAS=pci:v00008086d000015D7sv000017AAsd0000225Abc02sc00i00 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/vendor +Lines: 1 +0x8086 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/rbd +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/rbd/0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/rbd/0/name +Lines: 1 +demo +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/rbd/0/pool +Lines: 1 +iscsi-images +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/rbd/1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/rbd/1/name +Lines: 1 +wrong +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/rbd/1/pool +Lines: 1 +wrong-images +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/clocksource +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/clocksource/clocksource0 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/clocksource/clocksource0/available_clocksource +Lines: 1 +tsc hpet acpi_pm +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/clocksource/clocksource0/current_clocksource +Lines: 1 +tsc +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/cpu +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/cpu/cpu0 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu0/cpufreq +SymlinkTo: ../cpufreq/policy0 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/cpu/cpu0/thermal_throttle +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu0/thermal_throttle/core_throttle_count +Lines: 1 +10084 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu0/thermal_throttle/package_throttle_count +Lines: 1 +34818 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/cpu/cpu0/topology +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu0/topology/core_id +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu0/topology/core_siblings +Lines: 1 +ff +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu0/topology/core_siblings_list +Lines: 1 +0-7 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu0/topology/physical_package_id +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu0/topology/thread_siblings +Lines: 1 +11 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu0/topology/thread_siblings_list +Lines: 1 +0,4 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/cpu/cpu1 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/cpu/cpu1/cpufreq +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_cur_freq +Lines: 1 +1200195 +Mode: 400 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_max_freq +Lines: 1 +3300000 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_min_freq +Lines: 1 +1200000 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_transition_latency +Lines: 1 +4294967295 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/related_cpus +Lines: 1 +1 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/scaling_available_governors +Lines: 1 +performance powersave +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/scaling_driver +Lines: 1 +intel_pstate +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/scaling_governor +Lines: 1 +powersave +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/scaling_max_freq +Lines: 1 +3300000 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/scaling_min_freq +Lines: 1 +1200000 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/scaling_setspeed +Lines: 1 + +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/cpu/cpu1/thermal_throttle +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/thermal_throttle/core_throttle_count +Lines: 1 +523 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/thermal_throttle/package_throttle_count +Lines: 1 +34818 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/cpu/cpu1/topology +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/topology/core_id +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/topology/core_siblings +Lines: 1 +ff +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/topology/core_siblings_list +Lines: 1 +0-7 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/topology/physical_package_id +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/topology/thread_siblings +Lines: 1 +22 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/topology/thread_siblings_list +Lines: 1 +1,5 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/cpu/cpufreq +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/cpu/cpufreq/policy0 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/affected_cpus +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_max_freq +Lines: 1 +2400000 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_min_freq +Lines: 1 +800000 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_transition_latency +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/related_cpus +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_available_governors +Lines: 1 +performance powersave +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_cur_freq +Lines: 1 +1219917 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_driver +Lines: 1 +intel_pstate +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_governor +Lines: 1 +powersave +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq +Lines: 1 +2400000 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_min_freq +Lines: 1 +800000 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_setspeed +Lines: 1 + +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/cpu/cpufreq/policy1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/bcache +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/average_key_size +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0 +Mode: 777 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/dirty_data +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_hit_ratio +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_hits +Lines: 1 +289 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_hit_ratio +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_hit_ratio +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_hit_ratio +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_hits +Lines: 1 +546 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/btree_cache_size +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0 +Mode: 777 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0/io_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0/metadata_written +Lines: 1 +512 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0/priority_stats +Lines: 5 +Unused: 99% +Metadata: 0% +Average: 10473 +Sectors per Q: 64 +Quantiles: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946] +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0/written +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache_available_percent +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/congested +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal/active_journal_entries +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal/btree_nodes +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal/btree_read_average_duration_us +Lines: 1 +1305 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal/cache_read_races +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/root_usage_percent +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_hit_ratio +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_hits +Lines: 1 +289 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_hit_ratio +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_hit_ratio +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_hit_ratio +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_hits +Lines: 1 +546 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/tree_depth +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/bytes_may_use +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/bytes_pinned +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/bytes_readonly +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/bytes_reserved +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/bytes_used +Lines: 1 +808189952 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/disk_total +Lines: 1 +2147483648 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/disk_used +Lines: 1 +808189952 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/flags +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/raid0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/raid0/total_bytes +Lines: 1 +2147483648 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/raid0/used_bytes +Lines: 1 +808189952 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/total_bytes +Lines: 1 +2147483648 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/total_bytes_pinned +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/global_rsv_reserved +Lines: 1 +16777216 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/global_rsv_size +Lines: 1 +16777216 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/bytes_may_use +Lines: 1 +16777216 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/bytes_pinned +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/bytes_readonly +Lines: 1 +131072 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/bytes_reserved +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/bytes_used +Lines: 1 +933888 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/disk_total +Lines: 1 +2147483648 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/disk_used +Lines: 1 +1867776 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/flags +Lines: 1 +4 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/raid1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/raid1/total_bytes +Lines: 1 +1073741824 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/raid1/used_bytes +Lines: 1 +933888 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/total_bytes +Lines: 1 +1073741824 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/total_bytes_pinned +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/bytes_may_use +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/bytes_pinned +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/bytes_readonly +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/bytes_reserved +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/bytes_used +Lines: 1 +16384 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/disk_total +Lines: 1 +16777216 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/disk_used +Lines: 1 +32768 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/flags +Lines: 1 +2 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/raid1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/raid1/total_bytes +Lines: 1 +8388608 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/raid1/used_bytes +Lines: 1 +16384 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/total_bytes +Lines: 1 +8388608 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/total_bytes_pinned +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/clone_alignment +Lines: 1 +4096 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/devices +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/devices/loop25 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/devices/loop25/size +Lines: 1 +20971520 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/devices/loop26 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/devices/loop26/size +Lines: 1 +20971520 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/features +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/features/big_metadata +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/features/extended_iref +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/features/mixed_backref +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/features/skinny_metadata +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/label +Lines: 1 +fixture +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/metadata_uuid +Lines: 1 +0abb23a9-579b-43e6-ad30-227ef47fcb9d +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/nodesize +Lines: 1 +16384 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/quota_override +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/sectorsize +Lines: 1 +4096 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/bytes_may_use +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/bytes_pinned +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/bytes_readonly +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/bytes_reserved +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/bytes_used +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/disk_total +Lines: 1 +644087808 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/disk_used +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/flags +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/raid5 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/raid5/total_bytes +Lines: 1 +644087808 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/raid5/used_bytes +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/total_bytes +Lines: 1 +644087808 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/total_bytes_pinned +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/global_rsv_reserved +Lines: 1 +16777216 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/global_rsv_size +Lines: 1 +16777216 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/bytes_may_use +Lines: 1 +16777216 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/bytes_pinned +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/bytes_readonly +Lines: 1 +262144 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/bytes_reserved +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/bytes_used +Lines: 1 +114688 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/disk_total +Lines: 1 +429391872 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/disk_used +Lines: 1 +114688 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/flags +Lines: 1 +4 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/raid6 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/raid6/total_bytes +Lines: 1 +429391872 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/raid6/used_bytes +Lines: 1 +114688 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/total_bytes +Lines: 1 +429391872 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/total_bytes_pinned +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/bytes_may_use +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/bytes_pinned +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/bytes_readonly +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/bytes_reserved +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/bytes_used +Lines: 1 +16384 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/disk_total +Lines: 1 +16777216 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/disk_used +Lines: 1 +16384 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/flags +Lines: 1 +2 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/raid6 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/raid6/total_bytes +Lines: 1 +16777216 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/raid6/used_bytes +Lines: 1 +16384 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/total_bytes +Lines: 1 +16777216 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/total_bytes_pinned +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/clone_alignment +Lines: 1 +4096 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/devices +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/devices/loop22 +SymlinkTo: ../../../../devices/virtual/block/loop22 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/devices/loop23 +SymlinkTo: ../../../../devices/virtual/block/loop23 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/devices/loop24 +SymlinkTo: ../../../../devices/virtual/block/loop24 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/devices/loop25 +SymlinkTo: ../../../../devices/virtual/block/loop25 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/features +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/features/big_metadata +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/features/extended_iref +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/features/mixed_backref +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/features/raid56 +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/features/skinny_metadata +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/label +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/metadata_uuid +Lines: 1 +7f07c59f-6136-449c-ab87-e1cf2328731b +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/nodesize +Lines: 1 +16384 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/quota_override +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/sectorsize +Lines: 1 +4096 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/xfs +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/xfs/sda1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/xfs/sda1/stats +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/xfs/sda1/stats/stats +Lines: 1 +extent_alloc 1 0 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/xfs/sdb1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/xfs/sdb1/stats +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/xfs/sdb1/stats/stats +Lines: 1 +extent_alloc 2 0 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/core +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/core/fileio_0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/core/fileio_1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/core/fileio_1/file_lio_1G +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/core/fileio_1/file_lio_1G/enable +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/core/fileio_1/file_lio_1G/udev_path +Lines: 1 +/home/iscsi/file_back_1G +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/core/iblock_0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/core/iblock_0/block_lio_rbd1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/core/iblock_0/block_lio_rbd1/enable +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/core/iblock_0/block_lio_rbd1/udev_path +Lines: 1 +/dev/rbd1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/core/rbd_0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/core/rbd_0/iscsi-images-demo +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/core/rbd_0/iscsi-images-demo/enable +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/core/rbd_0/iscsi-images-demo/udev_path +Lines: 1 +/dev/rbd/iscsi-images/demo +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/core/rd_mcp_119 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/core/rd_mcp_119/ramdisk_lio_1G +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/core/rd_mcp_119/ramdisk_lio_1G/enable +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/core/rd_mcp_119/ramdisk_lio_1G/udev_path +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/enable +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/7f4a4eb56d +SymlinkTo: ../../../../../../target/core/rd_mcp_119/ramdisk_lio_1G +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/statistics +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/in_cmds +Lines: 1 +204950 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/read_mbytes +Lines: 1 +10325 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/write_mbytes +Lines: 1 +40325 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/enable +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/795b7c7026 +SymlinkTo: ../../../../../../target/core/iblock_0/block_lio_rbd1 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/statistics +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/statistics/scsi_tgt_port +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/in_cmds +Lines: 1 +104950 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/read_mbytes +Lines: 1 +20095 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/write_mbytes +Lines: 1 +71235 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/enable +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/fff5e16686 +SymlinkTo: ../../../../../../target/core/fileio_1/file_lio_1G +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/statistics +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/in_cmds +Lines: 1 +301950 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/read_mbytes +Lines: 1 +10195 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/write_mbytes +Lines: 1 +30195 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/enable +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/eba1edf893 +SymlinkTo: ../../../../../../target/core/rbd_0/iscsi-images-demo +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/statistics +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/statistics/scsi_tgt_port +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/in_cmds +Lines: 1 +1234 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/read_mbytes +Lines: 1 +1504 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/write_mbytes +Lines: 1 +4733 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/github.com/prometheus/procfs/fs.go b/vendor/github.com/prometheus/procfs/fs.go index b6c6b2ce1..0102ab0fd 100644 --- a/vendor/github.com/prometheus/procfs/fs.go +++ b/vendor/github.com/prometheus/procfs/fs.go @@ -14,69 +14,30 @@ package procfs import ( - "fmt" - "os" - "path" - - "github.com/prometheus/procfs/nfs" - "github.com/prometheus/procfs/xfs" + "github.com/prometheus/procfs/internal/fs" ) -// FS represents the pseudo-filesystem proc, which provides an interface to +// FS represents the pseudo-filesystem sys, which provides an interface to // kernel data structures. -type FS string - -// DefaultMountPoint is the common mount point of the proc filesystem. -const DefaultMountPoint = "/proc" - -// NewFS returns a new FS mounted under the given mountPoint. It will error -// if the mount point can't be read. -func NewFS(mountPoint string) (FS, error) { - info, err := os.Stat(mountPoint) - if err != nil { - return "", fmt.Errorf("could not read %s: %s", mountPoint, err) - } - if !info.IsDir() { - return "", fmt.Errorf("mount point %s is not a directory", mountPoint) - } - - return FS(mountPoint), nil -} - -// Path returns the path of the given subsystem relative to the procfs root. -func (fs FS) Path(p ...string) string { - return path.Join(append([]string{string(fs)}, p...)...) +type FS struct { + proc fs.FS } -// XFSStats retrieves XFS filesystem runtime statistics. -func (fs FS) XFSStats() (*xfs.Stats, error) { - f, err := os.Open(fs.Path("fs/xfs/stat")) - if err != nil { - return nil, err - } - defer f.Close() - - return xfs.ParseStats(f) -} - -// NFSClientRPCStats retrieves NFS client RPC statistics. -func (fs FS) NFSClientRPCStats() (*nfs.ClientRPCStats, error) { - f, err := os.Open(fs.Path("net/rpc/nfs")) - if err != nil { - return nil, err - } - defer f.Close() +// DefaultMountPoint is the common mount point of the proc filesystem. +const DefaultMountPoint = fs.DefaultProcMountPoint - return nfs.ParseClientRPCStats(f) +// NewDefaultFS returns a new proc FS mounted under the default proc mountPoint. +// It will error if the mount point directory can't be read or is a file. +func NewDefaultFS() (FS, error) { + return NewFS(DefaultMountPoint) } -// NFSdServerRPCStats retrieves NFS daemon RPC statistics. -func (fs FS) NFSdServerRPCStats() (*nfs.ServerRPCStats, error) { - f, err := os.Open(fs.Path("net/rpc/nfsd")) +// NewFS returns a new proc FS mounted under the given proc mountPoint. It will error +// if the mount point directory can't be read or is a file. +func NewFS(mountPoint string) (FS, error) { + fs, err := fs.NewFS(mountPoint) if err != nil { - return nil, err + return FS{}, err } - defer f.Close() - - return nfs.ParseServerRPCStats(f) + return FS{fs}, nil } diff --git a/vendor/github.com/prometheus/procfs/go.mod b/vendor/github.com/prometheus/procfs/go.mod new file mode 100644 index 000000000..0e04e5d1f --- /dev/null +++ b/vendor/github.com/prometheus/procfs/go.mod @@ -0,0 +1,8 @@ +module github.com/prometheus/procfs + +go 1.12 + +require ( + github.com/google/go-cmp v0.3.1 + golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e +) diff --git a/vendor/github.com/prometheus/procfs/go.sum b/vendor/github.com/prometheus/procfs/go.sum new file mode 100644 index 000000000..33b824b01 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/go.sum @@ -0,0 +1,4 @@ +github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= diff --git a/vendor/github.com/prometheus/procfs/internal/fs/fs.go b/vendor/github.com/prometheus/procfs/internal/fs/fs.go new file mode 100644 index 000000000..565e89e42 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/internal/fs/fs.go @@ -0,0 +1,55 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fs + +import ( + "fmt" + "os" + "path/filepath" +) + +const ( + // DefaultProcMountPoint is the common mount point of the proc filesystem. + DefaultProcMountPoint = "/proc" + + // DefaultSysMountPoint is the common mount point of the sys filesystem. + DefaultSysMountPoint = "/sys" + + // DefaultConfigfsMountPoint is the common mount point of the configfs + DefaultConfigfsMountPoint = "/sys/kernel/config" +) + +// FS represents a pseudo-filesystem, normally /proc or /sys, which provides an +// interface to kernel data structures. +type FS string + +// NewFS returns a new FS mounted under the given mountPoint. It will error +// if the mount point can't be read. +func NewFS(mountPoint string) (FS, error) { + info, err := os.Stat(mountPoint) + if err != nil { + return "", fmt.Errorf("could not read %s: %s", mountPoint, err) + } + if !info.IsDir() { + return "", fmt.Errorf("mount point %s is not a directory", mountPoint) + } + + return FS(mountPoint), nil +} + +// Path appends the given path elements to the filesystem path, adding separators +// as necessary. +func (fs FS) Path(p ...string) string { + return filepath.Join(append([]string{string(fs)}, p...)...) +} diff --git a/vendor/github.com/prometheus/procfs/internal/util/parse.go b/vendor/github.com/prometheus/procfs/internal/util/parse.go index 2ff228e9d..755591d9a 100644 --- a/vendor/github.com/prometheus/procfs/internal/util/parse.go +++ b/vendor/github.com/prometheus/procfs/internal/util/parse.go @@ -49,6 +49,21 @@ func ParseUint64s(ss []string) ([]uint64, error) { return us, nil } +// ParsePInt64s parses a slice of strings into a slice of int64 pointers. +func ParsePInt64s(ss []string) ([]*int64, error) { + us := make([]*int64, 0, len(ss)) + for _, s := range ss { + u, err := strconv.ParseInt(s, 10, 64) + if err != nil { + return nil, err + } + + us = append(us, &u) + } + + return us, nil +} + // ReadUintFromFile reads a file and attempts to parse a uint64 from it. func ReadUintFromFile(path string) (uint64, error) { data, err := ioutil.ReadFile(path) @@ -57,3 +72,17 @@ func ReadUintFromFile(path string) (uint64, error) { } return strconv.ParseUint(strings.TrimSpace(string(data)), 10, 64) } + +// ParseBool parses a string into a boolean pointer. +func ParseBool(b string) *bool { + var truth bool + switch b { + case "enabled": + truth = true + case "disabled": + truth = false + default: + return nil + } + return &truth +} diff --git a/vendor/github.com/prometheus/procfs/internal/util/readfile.go b/vendor/github.com/prometheus/procfs/internal/util/readfile.go new file mode 100644 index 000000000..8051161b2 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/internal/util/readfile.go @@ -0,0 +1,38 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package util + +import ( + "io" + "io/ioutil" + "os" +) + +// ReadFileNoStat uses ioutil.ReadAll to read contents of entire file. +// This is similar to ioutil.ReadFile but without the call to os.Stat, because +// many files in /proc and /sys report incorrect file sizes (either 0 or 4096). +// Reads a max file size of 512kB. For files larger than this, a scanner +// should be used. +func ReadFileNoStat(filename string) ([]byte, error) { + const maxBufferSize = 1024 * 512 + + f, err := os.Open(filename) + if err != nil { + return nil, err + } + defer f.Close() + + reader := io.LimitReader(f, maxBufferSize) + return ioutil.ReadAll(reader) +} diff --git a/vendor/github.com/prometheus/procfs/internal/util/sysreadfile.go b/vendor/github.com/prometheus/procfs/internal/util/sysreadfile.go new file mode 100644 index 000000000..c07de0b6c --- /dev/null +++ b/vendor/github.com/prometheus/procfs/internal/util/sysreadfile.go @@ -0,0 +1,48 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build linux,!appengine + +package util + +import ( + "bytes" + "os" + "syscall" +) + +// SysReadFile is a simplified ioutil.ReadFile that invokes syscall.Read directly. +// https://github.com/prometheus/node_exporter/pull/728/files +// +// Note that this function will not read files larger than 128 bytes. +func SysReadFile(file string) (string, error) { + f, err := os.Open(file) + if err != nil { + return "", err + } + defer f.Close() + + // On some machines, hwmon drivers are broken and return EAGAIN. This causes + // Go's ioutil.ReadFile implementation to poll forever. + // + // Since we either want to read data or bail immediately, do the simplest + // possible read using syscall directly. + const sysFileBufferSize = 128 + b := make([]byte, sysFileBufferSize) + n, err := syscall.Read(int(f.Fd()), b) + if err != nil { + return "", err + } + + return string(bytes.TrimSpace(b[:n])), nil +} diff --git a/vendor/github.com/prometheus/procfs/internal/util/sysreadfile_compat.go b/vendor/github.com/prometheus/procfs/internal/util/sysreadfile_compat.go new file mode 100644 index 000000000..bd55b4537 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/internal/util/sysreadfile_compat.go @@ -0,0 +1,26 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build linux,appengine !linux + +package util + +import ( + "fmt" +) + +// SysReadFile is here implemented as a noop for builds that do not support +// the read syscall. For example Windows, or Linux on Google App Engine. +func SysReadFile(file string) (string, error) { + return "", fmt.Errorf("not supported on this platform") +} diff --git a/vendor/github.com/prometheus/procfs/internal/util/sysreadfile_linux.go b/vendor/github.com/prometheus/procfs/internal/util/sysreadfile_linux.go deleted file mode 100644 index df0d567b7..000000000 --- a/vendor/github.com/prometheus/procfs/internal/util/sysreadfile_linux.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build !windows - -package util - -import ( - "bytes" - "os" - "syscall" -) - -// SysReadFile is a simplified ioutil.ReadFile that invokes syscall.Read directly. -// https://github.com/prometheus/node_exporter/pull/728/files -func SysReadFile(file string) (string, error) { - f, err := os.Open(file) - if err != nil { - return "", err - } - defer f.Close() - - // On some machines, hwmon drivers are broken and return EAGAIN. This causes - // Go's ioutil.ReadFile implementation to poll forever. - // - // Since we either want to read data or bail immediately, do the simplest - // possible read using syscall directly. - b := make([]byte, 128) - n, err := syscall.Read(int(f.Fd()), b) - if err != nil { - return "", err - } - - return string(bytes.TrimSpace(b[:n])), nil -} diff --git a/vendor/github.com/prometheus/procfs/internal/util/valueparser.go b/vendor/github.com/prometheus/procfs/internal/util/valueparser.go new file mode 100644 index 000000000..fe2355d3c --- /dev/null +++ b/vendor/github.com/prometheus/procfs/internal/util/valueparser.go @@ -0,0 +1,91 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package util + +import ( + "strconv" +) + +// TODO(mdlayher): util packages are an anti-pattern and this should be moved +// somewhere else that is more focused in the future. + +// A ValueParser enables parsing a single string into a variety of data types +// in a concise and safe way. The Err method must be invoked after invoking +// any other methods to ensure a value was successfully parsed. +type ValueParser struct { + v string + err error +} + +// NewValueParser creates a ValueParser using the input string. +func NewValueParser(v string) *ValueParser { + return &ValueParser{v: v} +} + +// Int interprets the underlying value as an int and returns that value. +func (vp *ValueParser) Int() int { return int(vp.int64()) } + +// PInt64 interprets the underlying value as an int64 and returns a pointer to +// that value. +func (vp *ValueParser) PInt64() *int64 { + if vp.err != nil { + return nil + } + + v := vp.int64() + return &v +} + +// int64 interprets the underlying value as an int64 and returns that value. +// TODO: export if/when necessary. +func (vp *ValueParser) int64() int64 { + if vp.err != nil { + return 0 + } + + // A base value of zero makes ParseInt infer the correct base using the + // string's prefix, if any. + const base = 0 + v, err := strconv.ParseInt(vp.v, base, 64) + if err != nil { + vp.err = err + return 0 + } + + return v +} + +// PUInt64 interprets the underlying value as an uint64 and returns a pointer to +// that value. +func (vp *ValueParser) PUInt64() *uint64 { + if vp.err != nil { + return nil + } + + // A base value of zero makes ParseInt infer the correct base using the + // string's prefix, if any. + const base = 0 + v, err := strconv.ParseUint(vp.v, base, 64) + if err != nil { + vp.err = err + return nil + } + + return &v +} + +// Err returns the last error, if any, encountered by the ValueParser. +func (vp *ValueParser) Err() error { + return vp.err +} diff --git a/vendor/github.com/prometheus/procfs/ipvs.go b/vendor/github.com/prometheus/procfs/ipvs.go index e36d4a3bd..89e447746 100644 --- a/vendor/github.com/prometheus/procfs/ipvs.go +++ b/vendor/github.com/prometheus/procfs/ipvs.go @@ -15,6 +15,7 @@ package procfs import ( "bufio" + "bytes" "encoding/hex" "errors" "fmt" @@ -24,6 +25,8 @@ import ( "os" "strconv" "strings" + + "github.com/prometheus/procfs/internal/util" ) // IPVSStats holds IPVS statistics, as exposed by the kernel in `/proc/net/ip_vs_stats`. @@ -62,29 +65,18 @@ type IPVSBackendStatus struct { Weight uint64 } -// NewIPVSStats reads the IPVS statistics. -func NewIPVSStats() (IPVSStats, error) { - fs, err := NewFS(DefaultMountPoint) +// IPVSStats reads the IPVS statistics from the specified `proc` filesystem. +func (fs FS) IPVSStats() (IPVSStats, error) { + data, err := util.ReadFileNoStat(fs.proc.Path("net/ip_vs_stats")) if err != nil { return IPVSStats{}, err } - return fs.NewIPVSStats() -} - -// NewIPVSStats reads the IPVS statistics from the specified `proc` filesystem. -func (fs FS) NewIPVSStats() (IPVSStats, error) { - file, err := os.Open(fs.Path("net/ip_vs_stats")) - if err != nil { - return IPVSStats{}, err - } - defer file.Close() - - return parseIPVSStats(file) + return parseIPVSStats(bytes.NewReader(data)) } // parseIPVSStats performs the actual parsing of `ip_vs_stats`. -func parseIPVSStats(file io.Reader) (IPVSStats, error) { +func parseIPVSStats(r io.Reader) (IPVSStats, error) { var ( statContent []byte statLines []string @@ -92,7 +84,7 @@ func parseIPVSStats(file io.Reader) (IPVSStats, error) { stats IPVSStats ) - statContent, err := ioutil.ReadAll(file) + statContent, err := ioutil.ReadAll(r) if err != nil { return IPVSStats{}, err } @@ -131,19 +123,9 @@ func parseIPVSStats(file io.Reader) (IPVSStats, error) { return stats, nil } -// NewIPVSBackendStatus reads and returns the status of all (virtual,real) server pairs. -func NewIPVSBackendStatus() ([]IPVSBackendStatus, error) { - fs, err := NewFS(DefaultMountPoint) - if err != nil { - return []IPVSBackendStatus{}, err - } - - return fs.NewIPVSBackendStatus() -} - -// NewIPVSBackendStatus reads and returns the status of all (virtual,real) server pairs from the specified `proc` filesystem. -func (fs FS) NewIPVSBackendStatus() ([]IPVSBackendStatus, error) { - file, err := os.Open(fs.Path("net/ip_vs")) +// IPVSBackendStatus reads and returns the status of all (virtual,real) server pairs from the specified `proc` filesystem. +func (fs FS) IPVSBackendStatus() ([]IPVSBackendStatus, error) { + file, err := os.Open(fs.proc.Path("net/ip_vs")) if err != nil { return nil, err } diff --git a/vendor/github.com/prometheus/procfs/mdstat.go b/vendor/github.com/prometheus/procfs/mdstat.go index 9dc19583d..2af3ada18 100644 --- a/vendor/github.com/prometheus/procfs/mdstat.go +++ b/vendor/github.com/prometheus/procfs/mdstat.go @@ -22,8 +22,8 @@ import ( ) var ( - statuslineRE = regexp.MustCompile(`(\d+) blocks .*\[(\d+)/(\d+)\] \[[U_]+\]`) - buildlineRE = regexp.MustCompile(`\((\d+)/\d+\)`) + statusLineRE = regexp.MustCompile(`(\d+) blocks .*\[(\d+)/(\d+)\] \[[U_]+\]`) + recoveryLineRE = regexp.MustCompile(`\((\d+)/\d+\)`) ) // MDStat holds info parsed from /proc/mdstat. @@ -34,117 +34,160 @@ type MDStat struct { ActivityState string // Number of active disks. DisksActive int64 - // Total number of disks the device consists of. + // Total number of disks the device requires. DisksTotal int64 + // Number of failed disks. + DisksFailed int64 + // Spare disks in the device. + DisksSpare int64 // Number of blocks the device holds. BlocksTotal int64 // Number of blocks on the device that are in sync. BlocksSynced int64 } -// ParseMDStat parses an mdstat-file and returns a struct with the relevant infos. -func (fs FS) ParseMDStat() (mdstates []MDStat, err error) { - mdStatusFilePath := fs.Path("mdstat") - content, err := ioutil.ReadFile(mdStatusFilePath) +// MDStat parses an mdstat-file (/proc/mdstat) and returns a slice of +// structs containing the relevant info. More information available here: +// https://raid.wiki.kernel.org/index.php/Mdstat +func (fs FS) MDStat() ([]MDStat, error) { + data, err := ioutil.ReadFile(fs.proc.Path("mdstat")) if err != nil { - return []MDStat{}, fmt.Errorf("error parsing %s: %s", mdStatusFilePath, err) + return nil, fmt.Errorf("error parsing mdstat %s: %s", fs.proc.Path("mdstat"), err) } + mdstat, err := parseMDStat(data) + if err != nil { + return nil, fmt.Errorf("error parsing mdstat %s: %s", fs.proc.Path("mdstat"), err) + } + return mdstat, nil +} - mdStates := []MDStat{} - lines := strings.Split(string(content), "\n") - for i, l := range lines { - if l == "" { - continue - } - if l[0] == ' ' { - continue - } - if strings.HasPrefix(l, "Personalities") || strings.HasPrefix(l, "unused") { +// parseMDStat parses data from mdstat file (/proc/mdstat) and returns a slice of +// structs containing the relevant info. +func parseMDStat(mdStatData []byte) ([]MDStat, error) { + mdStats := []MDStat{} + lines := strings.Split(string(mdStatData), "\n") + + for i, line := range lines { + if strings.TrimSpace(line) == "" || line[0] == ' ' || + strings.HasPrefix(line, "Personalities") || + strings.HasPrefix(line, "unused") { continue } - mainLine := strings.Split(l, " ") - if len(mainLine) < 3 { - return mdStates, fmt.Errorf("error parsing mdline: %s", l) + deviceFields := strings.Fields(line) + if len(deviceFields) < 3 { + return nil, fmt.Errorf("not enough fields in mdline (expected at least 3): %s", line) } - mdName := mainLine[0] - activityState := mainLine[2] + mdName := deviceFields[0] // mdx + state := deviceFields[2] // active or inactive if len(lines) <= i+3 { - return mdStates, fmt.Errorf( - "error parsing %s: too few lines for md device %s", - mdStatusFilePath, + return nil, fmt.Errorf( + "error parsing %s: too few lines for md device", mdName, ) } - active, total, size, err := evalStatusline(lines[i+1]) + // Failed disks have the suffix (F) & Spare disks have the suffix (S). + fail := int64(strings.Count(line, "(F)")) + spare := int64(strings.Count(line, "(S)")) + active, total, size, err := evalStatusLine(lines[i], lines[i+1]) + if err != nil { - return mdStates, fmt.Errorf("error parsing %s: %s", mdStatusFilePath, err) + return nil, fmt.Errorf("error parsing md device lines: %s", err) } - // j is the line number of the syncing-line. - j := i + 2 + syncLineIdx := i + 2 if strings.Contains(lines[i+2], "bitmap") { // skip bitmap line - j = i + 3 + syncLineIdx++ } // If device is syncing at the moment, get the number of currently // synced bytes, otherwise that number equals the size of the device. syncedBlocks := size - if strings.Contains(lines[j], "recovery") || strings.Contains(lines[j], "resync") { - syncedBlocks, err = evalBuildline(lines[j]) - if err != nil { - return mdStates, fmt.Errorf("error parsing %s: %s", mdStatusFilePath, err) + recovering := strings.Contains(lines[syncLineIdx], "recovery") + resyncing := strings.Contains(lines[syncLineIdx], "resync") + + // Append recovery and resyncing state info. + if recovering || resyncing { + if recovering { + state = "recovering" + } else { + state = "resyncing" + } + + // Handle case when resync=PENDING or resync=DELAYED. + if strings.Contains(lines[syncLineIdx], "PENDING") || + strings.Contains(lines[syncLineIdx], "DELAYED") { + syncedBlocks = 0 + } else { + syncedBlocks, err = evalRecoveryLine(lines[syncLineIdx]) + if err != nil { + return nil, fmt.Errorf("error parsing sync line in md device %s: %s", mdName, err) + } } } - mdStates = append(mdStates, MDStat{ + mdStats = append(mdStats, MDStat{ Name: mdName, - ActivityState: activityState, + ActivityState: state, DisksActive: active, + DisksFailed: fail, + DisksSpare: spare, DisksTotal: total, BlocksTotal: size, BlocksSynced: syncedBlocks, }) } - return mdStates, nil + return mdStats, nil } -func evalStatusline(statusline string) (active, total, size int64, err error) { - matches := statuslineRE.FindStringSubmatch(statusline) - if len(matches) != 4 { - return 0, 0, 0, fmt.Errorf("unexpected statusline: %s", statusline) - } +func evalStatusLine(deviceLine, statusLine string) (active, total, size int64, err error) { - size, err = strconv.ParseInt(matches[1], 10, 64) + sizeStr := strings.Fields(statusLine)[0] + size, err = strconv.ParseInt(sizeStr, 10, 64) if err != nil { - return 0, 0, 0, fmt.Errorf("unexpected statusline %s: %s", statusline, err) + return 0, 0, 0, fmt.Errorf("unexpected statusLine %s: %s", statusLine, err) + } + + if strings.Contains(deviceLine, "raid0") || strings.Contains(deviceLine, "linear") { + // In the device deviceLine, only disks have a number associated with them in []. + total = int64(strings.Count(deviceLine, "[")) + return total, total, size, nil + } + + if strings.Contains(deviceLine, "inactive") { + return 0, 0, size, nil + } + + matches := statusLineRE.FindStringSubmatch(statusLine) + if len(matches) != 4 { + return 0, 0, 0, fmt.Errorf("couldn't find all the substring matches: %s", statusLine) } total, err = strconv.ParseInt(matches[2], 10, 64) if err != nil { - return 0, 0, 0, fmt.Errorf("unexpected statusline %s: %s", statusline, err) + return 0, 0, 0, fmt.Errorf("unexpected statusLine %s: %s", statusLine, err) } active, err = strconv.ParseInt(matches[3], 10, 64) if err != nil { - return 0, 0, 0, fmt.Errorf("unexpected statusline %s: %s", statusline, err) + return 0, 0, 0, fmt.Errorf("unexpected statusLine %s: %s", statusLine, err) } return active, total, size, nil } -func evalBuildline(buildline string) (syncedBlocks int64, err error) { - matches := buildlineRE.FindStringSubmatch(buildline) +func evalRecoveryLine(recoveryLine string) (syncedBlocks int64, err error) { + matches := recoveryLineRE.FindStringSubmatch(recoveryLine) if len(matches) != 2 { - return 0, fmt.Errorf("unexpected buildline: %s", buildline) + return 0, fmt.Errorf("unexpected recoveryLine: %s", recoveryLine) } syncedBlocks, err = strconv.ParseInt(matches[1], 10, 64) if err != nil { - return 0, fmt.Errorf("%s in buildline: %s", err, buildline) + return 0, fmt.Errorf("%s in recoveryLine: %s", err, recoveryLine) } return syncedBlocks, nil diff --git a/vendor/github.com/prometheus/procfs/meminfo.go b/vendor/github.com/prometheus/procfs/meminfo.go new file mode 100644 index 000000000..50dab4bcd --- /dev/null +++ b/vendor/github.com/prometheus/procfs/meminfo.go @@ -0,0 +1,277 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "bytes" + "fmt" + "io" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// Meminfo represents memory statistics. +type Meminfo struct { + // Total usable ram (i.e. physical ram minus a few reserved + // bits and the kernel binary code) + MemTotal uint64 + // The sum of LowFree+HighFree + MemFree uint64 + // An estimate of how much memory is available for starting + // new applications, without swapping. Calculated from + // MemFree, SReclaimable, the size of the file LRU lists, and + // the low watermarks in each zone. The estimate takes into + // account that the system needs some page cache to function + // well, and that not all reclaimable slab will be + // reclaimable, due to items being in use. The impact of those + // factors will vary from system to system. + MemAvailable uint64 + // Relatively temporary storage for raw disk blocks shouldn't + // get tremendously large (20MB or so) + Buffers uint64 + Cached uint64 + // Memory that once was swapped out, is swapped back in but + // still also is in the swapfile (if memory is needed it + // doesn't need to be swapped out AGAIN because it is already + // in the swapfile. This saves I/O) + SwapCached uint64 + // Memory that has been used more recently and usually not + // reclaimed unless absolutely necessary. + Active uint64 + // Memory which has been less recently used. It is more + // eligible to be reclaimed for other purposes + Inactive uint64 + ActiveAnon uint64 + InactiveAnon uint64 + ActiveFile uint64 + InactiveFile uint64 + Unevictable uint64 + Mlocked uint64 + // total amount of swap space available + SwapTotal uint64 + // Memory which has been evicted from RAM, and is temporarily + // on the disk + SwapFree uint64 + // Memory which is waiting to get written back to the disk + Dirty uint64 + // Memory which is actively being written back to the disk + Writeback uint64 + // Non-file backed pages mapped into userspace page tables + AnonPages uint64 + // files which have been mapped, such as libraries + Mapped uint64 + Shmem uint64 + // in-kernel data structures cache + Slab uint64 + // Part of Slab, that might be reclaimed, such as caches + SReclaimable uint64 + // Part of Slab, that cannot be reclaimed on memory pressure + SUnreclaim uint64 + KernelStack uint64 + // amount of memory dedicated to the lowest level of page + // tables. + PageTables uint64 + // NFS pages sent to the server, but not yet committed to + // stable storage + NFSUnstable uint64 + // Memory used for block device "bounce buffers" + Bounce uint64 + // Memory used by FUSE for temporary writeback buffers + WritebackTmp uint64 + // Based on the overcommit ratio ('vm.overcommit_ratio'), + // this is the total amount of memory currently available to + // be allocated on the system. This limit is only adhered to + // if strict overcommit accounting is enabled (mode 2 in + // 'vm.overcommit_memory'). + // The CommitLimit is calculated with the following formula: + // CommitLimit = ([total RAM pages] - [total huge TLB pages]) * + // overcommit_ratio / 100 + [total swap pages] + // For example, on a system with 1G of physical RAM and 7G + // of swap with a `vm.overcommit_ratio` of 30 it would + // yield a CommitLimit of 7.3G. + // For more details, see the memory overcommit documentation + // in vm/overcommit-accounting. + CommitLimit uint64 + // The amount of memory presently allocated on the system. + // The committed memory is a sum of all of the memory which + // has been allocated by processes, even if it has not been + // "used" by them as of yet. A process which malloc()'s 1G + // of memory, but only touches 300M of it will show up as + // using 1G. This 1G is memory which has been "committed" to + // by the VM and can be used at any time by the allocating + // application. With strict overcommit enabled on the system + // (mode 2 in 'vm.overcommit_memory'),allocations which would + // exceed the CommitLimit (detailed above) will not be permitted. + // This is useful if one needs to guarantee that processes will + // not fail due to lack of memory once that memory has been + // successfully allocated. + CommittedAS uint64 + // total size of vmalloc memory area + VmallocTotal uint64 + // amount of vmalloc area which is used + VmallocUsed uint64 + // largest contiguous block of vmalloc area which is free + VmallocChunk uint64 + HardwareCorrupted uint64 + AnonHugePages uint64 + ShmemHugePages uint64 + ShmemPmdMapped uint64 + CmaTotal uint64 + CmaFree uint64 + HugePagesTotal uint64 + HugePagesFree uint64 + HugePagesRsvd uint64 + HugePagesSurp uint64 + Hugepagesize uint64 + DirectMap4k uint64 + DirectMap2M uint64 + DirectMap1G uint64 +} + +// Meminfo returns an information about current kernel/system memory statistics. +// See https://www.kernel.org/doc/Documentation/filesystems/proc.txt +func (fs FS) Meminfo() (Meminfo, error) { + b, err := util.ReadFileNoStat(fs.proc.Path("meminfo")) + if err != nil { + return Meminfo{}, err + } + + m, err := parseMemInfo(bytes.NewReader(b)) + if err != nil { + return Meminfo{}, fmt.Errorf("failed to parse meminfo: %v", err) + } + + return *m, nil +} + +func parseMemInfo(r io.Reader) (*Meminfo, error) { + var m Meminfo + s := bufio.NewScanner(r) + for s.Scan() { + // Each line has at least a name and value; we ignore the unit. + fields := strings.Fields(s.Text()) + if len(fields) < 2 { + return nil, fmt.Errorf("malformed meminfo line: %q", s.Text()) + } + + v, err := strconv.ParseUint(fields[1], 0, 64) + if err != nil { + return nil, err + } + + switch fields[0] { + case "MemTotal:": + m.MemTotal = v + case "MemFree:": + m.MemFree = v + case "MemAvailable:": + m.MemAvailable = v + case "Buffers:": + m.Buffers = v + case "Cached:": + m.Cached = v + case "SwapCached:": + m.SwapCached = v + case "Active:": + m.Active = v + case "Inactive:": + m.Inactive = v + case "Active(anon):": + m.ActiveAnon = v + case "Inactive(anon):": + m.InactiveAnon = v + case "Active(file):": + m.ActiveFile = v + case "Inactive(file):": + m.InactiveFile = v + case "Unevictable:": + m.Unevictable = v + case "Mlocked:": + m.Mlocked = v + case "SwapTotal:": + m.SwapTotal = v + case "SwapFree:": + m.SwapFree = v + case "Dirty:": + m.Dirty = v + case "Writeback:": + m.Writeback = v + case "AnonPages:": + m.AnonPages = v + case "Mapped:": + m.Mapped = v + case "Shmem:": + m.Shmem = v + case "Slab:": + m.Slab = v + case "SReclaimable:": + m.SReclaimable = v + case "SUnreclaim:": + m.SUnreclaim = v + case "KernelStack:": + m.KernelStack = v + case "PageTables:": + m.PageTables = v + case "NFS_Unstable:": + m.NFSUnstable = v + case "Bounce:": + m.Bounce = v + case "WritebackTmp:": + m.WritebackTmp = v + case "CommitLimit:": + m.CommitLimit = v + case "Committed_AS:": + m.CommittedAS = v + case "VmallocTotal:": + m.VmallocTotal = v + case "VmallocUsed:": + m.VmallocUsed = v + case "VmallocChunk:": + m.VmallocChunk = v + case "HardwareCorrupted:": + m.HardwareCorrupted = v + case "AnonHugePages:": + m.AnonHugePages = v + case "ShmemHugePages:": + m.ShmemHugePages = v + case "ShmemPmdMapped:": + m.ShmemPmdMapped = v + case "CmaTotal:": + m.CmaTotal = v + case "CmaFree:": + m.CmaFree = v + case "HugePages_Total:": + m.HugePagesTotal = v + case "HugePages_Free:": + m.HugePagesFree = v + case "HugePages_Rsvd:": + m.HugePagesRsvd = v + case "HugePages_Surp:": + m.HugePagesSurp = v + case "Hugepagesize:": + m.Hugepagesize = v + case "DirectMap4k:": + m.DirectMap4k = v + case "DirectMap2M:": + m.DirectMap2M = v + case "DirectMap1G:": + m.DirectMap1G = v + } + } + + return &m, nil +} diff --git a/vendor/github.com/prometheus/procfs/mountinfo.go b/vendor/github.com/prometheus/procfs/mountinfo.go new file mode 100644 index 000000000..bb01bb5a2 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/mountinfo.go @@ -0,0 +1,180 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "bytes" + "fmt" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// A MountInfo is a type that describes the details, options +// for each mount, parsed from /proc/self/mountinfo. +// The fields described in each entry of /proc/self/mountinfo +// is described in the following man page. +// http://man7.org/linux/man-pages/man5/proc.5.html +type MountInfo struct { + // Unique Id for the mount + MountId int + // The Id of the parent mount + ParentId int + // The value of `st_dev` for the files on this FS + MajorMinorVer string + // The pathname of the directory in the FS that forms + // the root for this mount + Root string + // The pathname of the mount point relative to the root + MountPoint string + // Mount options + Options map[string]string + // Zero or more optional fields + OptionalFields map[string]string + // The Filesystem type + FSType string + // FS specific information or "none" + Source string + // Superblock options + SuperOptions map[string]string +} + +// Reads each line of the mountinfo file, and returns a list of formatted MountInfo structs. +func parseMountInfo(info []byte) ([]*MountInfo, error) { + mounts := []*MountInfo{} + scanner := bufio.NewScanner(bytes.NewReader(info)) + for scanner.Scan() { + mountString := scanner.Text() + parsedMounts, err := parseMountInfoString(mountString) + if err != nil { + return nil, err + } + mounts = append(mounts, parsedMounts) + } + + err := scanner.Err() + return mounts, err +} + +// Parses a mountinfo file line, and converts it to a MountInfo struct. +// An important check here is to see if the hyphen separator, as if it does not exist, +// it means that the line is malformed. +func parseMountInfoString(mountString string) (*MountInfo, error) { + var err error + + mountInfo := strings.Split(mountString, " ") + mountInfoLength := len(mountInfo) + if mountInfoLength < 11 { + return nil, fmt.Errorf("couldn't find enough fields in mount string: %s", mountString) + } + + if mountInfo[mountInfoLength-4] != "-" { + return nil, fmt.Errorf("couldn't find separator in expected field: %s", mountInfo[mountInfoLength-4]) + } + + mount := &MountInfo{ + MajorMinorVer: mountInfo[2], + Root: mountInfo[3], + MountPoint: mountInfo[4], + Options: mountOptionsParser(mountInfo[5]), + OptionalFields: nil, + FSType: mountInfo[mountInfoLength-3], + Source: mountInfo[mountInfoLength-2], + SuperOptions: mountOptionsParser(mountInfo[mountInfoLength-1]), + } + + mount.MountId, err = strconv.Atoi(mountInfo[0]) + if err != nil { + return nil, fmt.Errorf("failed to parse mount ID") + } + mount.ParentId, err = strconv.Atoi(mountInfo[1]) + if err != nil { + return nil, fmt.Errorf("failed to parse parent ID") + } + // Has optional fields, which is a space separated list of values. + // Example: shared:2 master:7 + if mountInfo[6] != "" { + mount.OptionalFields, err = mountOptionsParseOptionalFields(mountInfo[6 : mountInfoLength-4]) + if err != nil { + return nil, err + } + } + return mount, nil +} + +// mountOptionsIsValidField checks a string against a valid list of optional fields keys. +func mountOptionsIsValidField(s string) bool { + switch s { + case + "shared", + "master", + "propagate_from", + "unbindable": + return true + } + return false +} + +// mountOptionsParseOptionalFields parses a list of optional fields strings into a double map of strings. +func mountOptionsParseOptionalFields(o []string) (map[string]string, error) { + optionalFields := make(map[string]string) + for _, field := range o { + optionSplit := strings.SplitN(field, ":", 2) + value := "" + if len(optionSplit) == 2 { + value = optionSplit[1] + } + if mountOptionsIsValidField(optionSplit[0]) { + optionalFields[optionSplit[0]] = value + } + } + return optionalFields, nil +} + +// Parses the mount options, superblock options. +func mountOptionsParser(mountOptions string) map[string]string { + opts := make(map[string]string) + options := strings.Split(mountOptions, ",") + for _, opt := range options { + splitOption := strings.Split(opt, "=") + if len(splitOption) < 2 { + key := splitOption[0] + opts[key] = "" + } else { + key, value := splitOption[0], splitOption[1] + opts[key] = value + } + } + return opts +} + +// Retrieves mountinfo information from `/proc/self/mountinfo`. +func GetMounts() ([]*MountInfo, error) { + data, err := util.ReadFileNoStat("/proc/self/mountinfo") + if err != nil { + return nil, err + } + return parseMountInfo(data) +} + +// Retrieves mountinfo information from a processes' `/proc//mountinfo`. +func GetProcMounts(pid int) ([]*MountInfo, error) { + data, err := util.ReadFileNoStat(fmt.Sprintf("/proc/%d/mountinfo", pid)) + if err != nil { + return nil, err + } + return parseMountInfo(data) +} diff --git a/vendor/github.com/prometheus/procfs/mountstats.go b/vendor/github.com/prometheus/procfs/mountstats.go index 7a8a1e099..35b2ef351 100644 --- a/vendor/github.com/prometheus/procfs/mountstats.go +++ b/vendor/github.com/prometheus/procfs/mountstats.go @@ -69,6 +69,8 @@ type MountStats interface { type MountStatsNFS struct { // The version of statistics provided. StatVersion string + // The mount options of the NFS mount. + Opts map[string]string // The age of the NFS mount. Age time.Duration // Statistics related to byte counters for various operations. @@ -179,11 +181,11 @@ type NFSOperationStats struct { // Number of bytes received for this operation, including RPC headers and payload. BytesReceived uint64 // Duration all requests spent queued for transmission before they were sent. - CumulativeQueueTime time.Duration + CumulativeQueueMilliseconds uint64 // Duration it took to get a reply back after the request was transmitted. - CumulativeTotalResponseTime time.Duration + CumulativeTotalResponseMilliseconds uint64 // Duration from when a request was enqueued to when it was completely handled. - CumulativeTotalRequestTime time.Duration + CumulativeTotalRequestMilliseconds uint64 } // A NFSTransportStats contains statistics for the NFS mount RPC requests and @@ -202,7 +204,7 @@ type NFSTransportStats struct { // spent waiting for connections to the server to be established. ConnectIdleTime uint64 // Duration since the NFS mount last saw any RPC traffic. - IdleTime time.Duration + IdleTimeSeconds uint64 // Number of RPC requests for this mount sent to the NFS server. Sends uint64 // Number of RPC responses for this mount received from the NFS server. @@ -317,6 +319,7 @@ func parseMount(ss []string) (*Mount, error) { func parseMountStatsNFS(s *bufio.Scanner, statVersion string) (*MountStatsNFS, error) { // Field indicators for parsing specific types of data const ( + fieldOpts = "opts:" fieldAge = "age:" fieldBytes = "bytes:" fieldEvents = "events:" @@ -338,6 +341,18 @@ func parseMountStatsNFS(s *bufio.Scanner, statVersion string) (*MountStatsNFS, e } switch ss[0] { + case fieldOpts: + if stats.Opts == nil { + stats.Opts = map[string]string{} + } + for _, opt := range strings.Split(ss[1], ",") { + split := strings.Split(opt, "=") + if len(split) == 2 { + stats.Opts[split[0]] = split[1] + } else { + stats.Opts[opt] = "" + } + } case fieldAge: // Age integer is in seconds d, err := time.ParseDuration(ss[1] + "s") @@ -509,15 +524,15 @@ func parseNFSOperationStats(s *bufio.Scanner) ([]NFSOperationStats, error) { } ops = append(ops, NFSOperationStats{ - Operation: strings.TrimSuffix(ss[0], ":"), - Requests: ns[0], - Transmissions: ns[1], - MajorTimeouts: ns[2], - BytesSent: ns[3], - BytesReceived: ns[4], - CumulativeQueueTime: time.Duration(ns[5]) * time.Millisecond, - CumulativeTotalResponseTime: time.Duration(ns[6]) * time.Millisecond, - CumulativeTotalRequestTime: time.Duration(ns[7]) * time.Millisecond, + Operation: strings.TrimSuffix(ss[0], ":"), + Requests: ns[0], + Transmissions: ns[1], + MajorTimeouts: ns[2], + BytesSent: ns[3], + BytesReceived: ns[4], + CumulativeQueueMilliseconds: ns[5], + CumulativeTotalResponseMilliseconds: ns[6], + CumulativeTotalRequestMilliseconds: ns[7], }) } @@ -593,7 +608,7 @@ func parseNFSTransportStats(ss []string, statVersion string) (*NFSTransportStats Bind: ns[1], Connect: ns[2], ConnectIdleTime: ns[3], - IdleTime: time.Duration(ns[4]) * time.Second, + IdleTimeSeconds: ns[4], Sends: ns[5], Receives: ns[6], BadTransactionIDs: ns[7], diff --git a/vendor/github.com/prometheus/procfs/net_dev.go b/vendor/github.com/prometheus/procfs/net_dev.go index 3f2523371..47a710bef 100644 --- a/vendor/github.com/prometheus/procfs/net_dev.go +++ b/vendor/github.com/prometheus/procfs/net_dev.go @@ -47,23 +47,13 @@ type NetDevLine struct { // are interface names. type NetDev map[string]NetDevLine -// NewNetDev returns kernel/system statistics read from /proc/net/dev. -func NewNetDev() (NetDev, error) { - fs, err := NewFS(DefaultMountPoint) - if err != nil { - return nil, err - } - - return fs.NewNetDev() +// NetDev returns kernel/system statistics read from /proc/net/dev. +func (fs FS) NetDev() (NetDev, error) { + return newNetDev(fs.proc.Path("net/dev")) } -// NewNetDev returns kernel/system statistics read from /proc/net/dev. -func (fs FS) NewNetDev() (NetDev, error) { - return newNetDev(fs.Path("net/dev")) -} - -// NewNetDev returns kernel/system statistics read from /proc/[pid]/net/dev. -func (p Proc) NewNetDev() (NetDev, error) { +// NetDev returns kernel/system statistics read from /proc/[pid]/net/dev. +func (p Proc) NetDev() (NetDev, error) { return newNetDev(p.path("net/dev")) } @@ -75,7 +65,7 @@ func newNetDev(file string) (NetDev, error) { } defer f.Close() - nd := NetDev{} + netDev := NetDev{} s := bufio.NewScanner(f) for n := 0; s.Scan(); n++ { // Skip the 2 header lines. @@ -83,20 +73,20 @@ func newNetDev(file string) (NetDev, error) { continue } - line, err := nd.parseLine(s.Text()) + line, err := netDev.parseLine(s.Text()) if err != nil { - return nd, err + return netDev, err } - nd[line.Name] = *line + netDev[line.Name] = *line } - return nd, s.Err() + return netDev, s.Err() } // parseLine parses a single line from the /proc/net/dev file. Header lines // must be filtered prior to calling this method. -func (nd NetDev) parseLine(rawLine string) (*NetDevLine, error) { +func (netDev NetDev) parseLine(rawLine string) (*NetDevLine, error) { parts := strings.SplitN(rawLine, ":", 2) if len(parts) != 2 { return nil, errors.New("invalid net/dev line, missing colon") @@ -185,15 +175,14 @@ func (nd NetDev) parseLine(rawLine string) (*NetDevLine, error) { // Total aggregates the values across interfaces and returns a new NetDevLine. // The Name field will be a sorted comma separated list of interface names. -func (nd NetDev) Total() NetDevLine { +func (netDev NetDev) Total() NetDevLine { total := NetDevLine{} - names := make([]string, 0, len(nd)) - for _, ifc := range nd { + names := make([]string, 0, len(netDev)) + for _, ifc := range netDev { names = append(names, ifc.Name) total.RxBytes += ifc.RxBytes total.RxPackets += ifc.RxPackets - total.RxPackets += ifc.RxPackets total.RxErrors += ifc.RxErrors total.RxDropped += ifc.RxDropped total.RxFIFO += ifc.RxFIFO diff --git a/vendor/github.com/prometheus/procfs/net_sockstat.go b/vendor/github.com/prometheus/procfs/net_sockstat.go new file mode 100644 index 000000000..f91ef5523 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/net_sockstat.go @@ -0,0 +1,163 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "io" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// A NetSockstat contains the output of /proc/net/sockstat{,6} for IPv4 or IPv6, +// respectively. +type NetSockstat struct { + // Used is non-nil for IPv4 sockstat results, but nil for IPv6. + Used *int + Protocols []NetSockstatProtocol +} + +// A NetSockstatProtocol contains statistics about a given socket protocol. +// Pointer fields indicate that the value may or may not be present on any +// given protocol. +type NetSockstatProtocol struct { + Protocol string + InUse int + Orphan *int + TW *int + Alloc *int + Mem *int + Memory *int +} + +// NetSockstat retrieves IPv4 socket statistics. +func (fs FS) NetSockstat() (*NetSockstat, error) { + return readSockstat(fs.proc.Path("net", "sockstat")) +} + +// NetSockstat6 retrieves IPv6 socket statistics. +// +// If IPv6 is disabled on this kernel, the returned error can be checked with +// os.IsNotExist. +func (fs FS) NetSockstat6() (*NetSockstat, error) { + return readSockstat(fs.proc.Path("net", "sockstat6")) +} + +// readSockstat opens and parses a NetSockstat from the input file. +func readSockstat(name string) (*NetSockstat, error) { + // This file is small and can be read with one syscall. + b, err := util.ReadFileNoStat(name) + if err != nil { + // Do not wrap this error so the caller can detect os.IsNotExist and + // similar conditions. + return nil, err + } + + stat, err := parseSockstat(bytes.NewReader(b)) + if err != nil { + return nil, fmt.Errorf("failed to read sockstats from %q: %v", name, err) + } + + return stat, nil +} + +// parseSockstat reads the contents of a sockstat file and parses a NetSockstat. +func parseSockstat(r io.Reader) (*NetSockstat, error) { + var stat NetSockstat + s := bufio.NewScanner(r) + for s.Scan() { + // Expect a minimum of a protocol and one key/value pair. + fields := strings.Split(s.Text(), " ") + if len(fields) < 3 { + return nil, fmt.Errorf("malformed sockstat line: %q", s.Text()) + } + + // The remaining fields are key/value pairs. + kvs, err := parseSockstatKVs(fields[1:]) + if err != nil { + return nil, fmt.Errorf("error parsing sockstat key/value pairs from %q: %v", s.Text(), err) + } + + // The first field is the protocol. We must trim its colon suffix. + proto := strings.TrimSuffix(fields[0], ":") + switch proto { + case "sockets": + // Special case: IPv4 has a sockets "used" key/value pair that we + // embed at the top level of the structure. + used := kvs["used"] + stat.Used = &used + default: + // Parse all other lines as individual protocols. + nsp := parseSockstatProtocol(kvs) + nsp.Protocol = proto + stat.Protocols = append(stat.Protocols, nsp) + } + } + + if err := s.Err(); err != nil { + return nil, err + } + + return &stat, nil +} + +// parseSockstatKVs parses a string slice into a map of key/value pairs. +func parseSockstatKVs(kvs []string) (map[string]int, error) { + if len(kvs)%2 != 0 { + return nil, errors.New("odd number of fields in key/value pairs") + } + + // Iterate two values at a time to gather key/value pairs. + out := make(map[string]int, len(kvs)/2) + for i := 0; i < len(kvs); i += 2 { + vp := util.NewValueParser(kvs[i+1]) + out[kvs[i]] = vp.Int() + + if err := vp.Err(); err != nil { + return nil, err + } + } + + return out, nil +} + +// parseSockstatProtocol parses a NetSockstatProtocol from the input kvs map. +func parseSockstatProtocol(kvs map[string]int) NetSockstatProtocol { + var nsp NetSockstatProtocol + for k, v := range kvs { + // Capture the range variable to ensure we get unique pointers for + // each of the optional fields. + v := v + switch k { + case "inuse": + nsp.InUse = v + case "orphan": + nsp.Orphan = &v + case "tw": + nsp.TW = &v + case "alloc": + nsp.Alloc = &v + case "mem": + nsp.Mem = &v + case "memory": + nsp.Memory = &v + } + } + + return nsp +} diff --git a/vendor/github.com/prometheus/procfs/net_softnet.go b/vendor/github.com/prometheus/procfs/net_softnet.go new file mode 100644 index 000000000..6fcad20af --- /dev/null +++ b/vendor/github.com/prometheus/procfs/net_softnet.go @@ -0,0 +1,91 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "fmt" + "io/ioutil" + "strconv" + "strings" +) + +// For the proc file format details, +// see https://elixir.bootlin.com/linux/v4.17/source/net/core/net-procfs.c#L162 +// and https://elixir.bootlin.com/linux/v4.17/source/include/linux/netdevice.h#L2810. + +// SoftnetEntry contains a single row of data from /proc/net/softnet_stat +type SoftnetEntry struct { + // Number of processed packets + Processed uint + // Number of dropped packets + Dropped uint + // Number of times processing packets ran out of quota + TimeSqueezed uint +} + +// GatherSoftnetStats reads /proc/net/softnet_stat, parse the relevant columns, +// and then return a slice of SoftnetEntry's. +func (fs FS) GatherSoftnetStats() ([]SoftnetEntry, error) { + data, err := ioutil.ReadFile(fs.proc.Path("net/softnet_stat")) + if err != nil { + return nil, fmt.Errorf("error reading softnet %s: %s", fs.proc.Path("net/softnet_stat"), err) + } + + return parseSoftnetEntries(data) +} + +func parseSoftnetEntries(data []byte) ([]SoftnetEntry, error) { + lines := strings.Split(string(data), "\n") + entries := make([]SoftnetEntry, 0) + var err error + const ( + expectedColumns = 11 + ) + for _, line := range lines { + columns := strings.Fields(line) + width := len(columns) + if width == 0 { + continue + } + if width != expectedColumns { + return []SoftnetEntry{}, fmt.Errorf("%d columns were detected, but %d were expected", width, expectedColumns) + } + var entry SoftnetEntry + if entry, err = parseSoftnetEntry(columns); err != nil { + return []SoftnetEntry{}, err + } + entries = append(entries, entry) + } + + return entries, nil +} + +func parseSoftnetEntry(columns []string) (SoftnetEntry, error) { + var err error + var processed, dropped, timeSqueezed uint64 + if processed, err = strconv.ParseUint(columns[0], 16, 32); err != nil { + return SoftnetEntry{}, fmt.Errorf("Unable to parse column 0: %s", err) + } + if dropped, err = strconv.ParseUint(columns[1], 16, 32); err != nil { + return SoftnetEntry{}, fmt.Errorf("Unable to parse column 1: %s", err) + } + if timeSqueezed, err = strconv.ParseUint(columns[2], 16, 32); err != nil { + return SoftnetEntry{}, fmt.Errorf("Unable to parse column 2: %s", err) + } + return SoftnetEntry{ + Processed: uint(processed), + Dropped: uint(dropped), + TimeSqueezed: uint(timeSqueezed), + }, nil +} diff --git a/vendor/github.com/prometheus/procfs/net_unix.go b/vendor/github.com/prometheus/procfs/net_unix.go new file mode 100644 index 000000000..93bd58f80 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/net_unix.go @@ -0,0 +1,271 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "errors" + "fmt" + "io" + "os" + "strconv" + "strings" +) + +// For the proc file format details, +// see https://elixir.bootlin.com/linux/v4.17/source/net/unix/af_unix.c#L2815 +// and https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/net.h#L48. + +const ( + netUnixKernelPtrIdx = iota + netUnixRefCountIdx + _ + netUnixFlagsIdx + netUnixTypeIdx + netUnixStateIdx + netUnixInodeIdx + + // Inode and Path are optional. + netUnixStaticFieldsCnt = 6 +) + +const ( + netUnixTypeStream = 1 + netUnixTypeDgram = 2 + netUnixTypeSeqpacket = 5 + + netUnixFlagListen = 1 << 16 + + netUnixStateUnconnected = 1 + netUnixStateConnecting = 2 + netUnixStateConnected = 3 + netUnixStateDisconnected = 4 +) + +var errInvalidKernelPtrFmt = errors.New("Invalid Num(the kernel table slot number) format") + +// NetUnixType is the type of the type field. +type NetUnixType uint64 + +// NetUnixFlags is the type of the flags field. +type NetUnixFlags uint64 + +// NetUnixState is the type of the state field. +type NetUnixState uint64 + +// NetUnixLine represents a line of /proc/net/unix. +type NetUnixLine struct { + KernelPtr string + RefCount uint64 + Protocol uint64 + Flags NetUnixFlags + Type NetUnixType + State NetUnixState + Inode uint64 + Path string +} + +// NetUnix holds the data read from /proc/net/unix. +type NetUnix struct { + Rows []*NetUnixLine +} + +// NewNetUnix returns data read from /proc/net/unix. +func NewNetUnix() (*NetUnix, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return nil, err + } + + return fs.NewNetUnix() +} + +// NewNetUnix returns data read from /proc/net/unix. +func (fs FS) NewNetUnix() (*NetUnix, error) { + return NewNetUnixByPath(fs.proc.Path("net/unix")) +} + +// NewNetUnixByPath returns data read from /proc/net/unix by file path. +// It might returns an error with partial parsed data, if an error occur after some data parsed. +func NewNetUnixByPath(path string) (*NetUnix, error) { + f, err := os.Open(path) + if err != nil { + return nil, err + } + defer f.Close() + return NewNetUnixByReader(f) +} + +// NewNetUnixByReader returns data read from /proc/net/unix by a reader. +// It might returns an error with partial parsed data, if an error occur after some data parsed. +func NewNetUnixByReader(reader io.Reader) (*NetUnix, error) { + nu := &NetUnix{ + Rows: make([]*NetUnixLine, 0, 32), + } + scanner := bufio.NewScanner(reader) + // Omit the header line. + scanner.Scan() + header := scanner.Text() + // From the man page of proc(5), it does not contain an Inode field, + // but in actually it exists. + // This code works for both cases. + hasInode := strings.Contains(header, "Inode") + + minFieldsCnt := netUnixStaticFieldsCnt + if hasInode { + minFieldsCnt++ + } + for scanner.Scan() { + line := scanner.Text() + item, err := nu.parseLine(line, hasInode, minFieldsCnt) + if err != nil { + return nu, err + } + nu.Rows = append(nu.Rows, item) + } + + return nu, scanner.Err() +} + +func (u *NetUnix) parseLine(line string, hasInode bool, minFieldsCnt int) (*NetUnixLine, error) { + fields := strings.Fields(line) + fieldsLen := len(fields) + if fieldsLen < minFieldsCnt { + return nil, fmt.Errorf( + "Parse Unix domain failed: expect at least %d fields but got %d", + minFieldsCnt, fieldsLen) + } + kernelPtr, err := u.parseKernelPtr(fields[netUnixKernelPtrIdx]) + if err != nil { + return nil, fmt.Errorf("Parse Unix domain num(%s) failed: %s", fields[netUnixKernelPtrIdx], err) + } + users, err := u.parseUsers(fields[netUnixRefCountIdx]) + if err != nil { + return nil, fmt.Errorf("Parse Unix domain ref count(%s) failed: %s", fields[netUnixRefCountIdx], err) + } + flags, err := u.parseFlags(fields[netUnixFlagsIdx]) + if err != nil { + return nil, fmt.Errorf("Parse Unix domain flags(%s) failed: %s", fields[netUnixFlagsIdx], err) + } + typ, err := u.parseType(fields[netUnixTypeIdx]) + if err != nil { + return nil, fmt.Errorf("Parse Unix domain type(%s) failed: %s", fields[netUnixTypeIdx], err) + } + state, err := u.parseState(fields[netUnixStateIdx]) + if err != nil { + return nil, fmt.Errorf("Parse Unix domain state(%s) failed: %s", fields[netUnixStateIdx], err) + } + var inode uint64 + if hasInode { + inodeStr := fields[netUnixInodeIdx] + inode, err = u.parseInode(inodeStr) + if err != nil { + return nil, fmt.Errorf("Parse Unix domain inode(%s) failed: %s", inodeStr, err) + } + } + + nuLine := &NetUnixLine{ + KernelPtr: kernelPtr, + RefCount: users, + Type: typ, + Flags: flags, + State: state, + Inode: inode, + } + + // Path field is optional. + if fieldsLen > minFieldsCnt { + pathIdx := netUnixInodeIdx + 1 + if !hasInode { + pathIdx-- + } + nuLine.Path = fields[pathIdx] + } + + return nuLine, nil +} + +func (u NetUnix) parseKernelPtr(str string) (string, error) { + if !strings.HasSuffix(str, ":") { + return "", errInvalidKernelPtrFmt + } + return str[:len(str)-1], nil +} + +func (u NetUnix) parseUsers(hexStr string) (uint64, error) { + return strconv.ParseUint(hexStr, 16, 32) +} + +func (u NetUnix) parseType(hexStr string) (NetUnixType, error) { + typ, err := strconv.ParseUint(hexStr, 16, 16) + if err != nil { + return 0, err + } + return NetUnixType(typ), nil +} + +func (u NetUnix) parseFlags(hexStr string) (NetUnixFlags, error) { + flags, err := strconv.ParseUint(hexStr, 16, 32) + if err != nil { + return 0, err + } + return NetUnixFlags(flags), nil +} + +func (u NetUnix) parseState(hexStr string) (NetUnixState, error) { + st, err := strconv.ParseInt(hexStr, 16, 8) + if err != nil { + return 0, err + } + return NetUnixState(st), nil +} + +func (u NetUnix) parseInode(inodeStr string) (uint64, error) { + return strconv.ParseUint(inodeStr, 10, 64) +} + +func (t NetUnixType) String() string { + switch t { + case netUnixTypeStream: + return "stream" + case netUnixTypeDgram: + return "dgram" + case netUnixTypeSeqpacket: + return "seqpacket" + } + return "unknown" +} + +func (f NetUnixFlags) String() string { + switch f { + case netUnixFlagListen: + return "listen" + default: + return "default" + } +} + +func (s NetUnixState) String() string { + switch s { + case netUnixStateUnconnected: + return "unconnected" + case netUnixStateConnecting: + return "connecting" + case netUnixStateConnected: + return "connected" + case netUnixStateDisconnected: + return "disconnected" + } + return "unknown" +} diff --git a/vendor/github.com/prometheus/procfs/nfs/nfs.go b/vendor/github.com/prometheus/procfs/nfs/nfs.go deleted file mode 100644 index 651bf6819..000000000 --- a/vendor/github.com/prometheus/procfs/nfs/nfs.go +++ /dev/null @@ -1,263 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package nfs implements parsing of /proc/net/rpc/nfsd. -// Fields are documented in https://www.svennd.be/nfsd-stats-explained-procnetrpcnfsd/ -package nfs - -// ReplyCache models the "rc" line. -type ReplyCache struct { - Hits uint64 - Misses uint64 - NoCache uint64 -} - -// FileHandles models the "fh" line. -type FileHandles struct { - Stale uint64 - TotalLookups uint64 - AnonLookups uint64 - DirNoCache uint64 - NoDirNoCache uint64 -} - -// InputOutput models the "io" line. -type InputOutput struct { - Read uint64 - Write uint64 -} - -// Threads models the "th" line. -type Threads struct { - Threads uint64 - FullCnt uint64 -} - -// ReadAheadCache models the "ra" line. -type ReadAheadCache struct { - CacheSize uint64 - CacheHistogram []uint64 - NotFound uint64 -} - -// Network models the "net" line. -type Network struct { - NetCount uint64 - UDPCount uint64 - TCPCount uint64 - TCPConnect uint64 -} - -// ClientRPC models the nfs "rpc" line. -type ClientRPC struct { - RPCCount uint64 - Retransmissions uint64 - AuthRefreshes uint64 -} - -// ServerRPC models the nfsd "rpc" line. -type ServerRPC struct { - RPCCount uint64 - BadCnt uint64 - BadFmt uint64 - BadAuth uint64 - BadcInt uint64 -} - -// V2Stats models the "proc2" line. -type V2Stats struct { - Null uint64 - GetAttr uint64 - SetAttr uint64 - Root uint64 - Lookup uint64 - ReadLink uint64 - Read uint64 - WrCache uint64 - Write uint64 - Create uint64 - Remove uint64 - Rename uint64 - Link uint64 - SymLink uint64 - MkDir uint64 - RmDir uint64 - ReadDir uint64 - FsStat uint64 -} - -// V3Stats models the "proc3" line. -type V3Stats struct { - Null uint64 - GetAttr uint64 - SetAttr uint64 - Lookup uint64 - Access uint64 - ReadLink uint64 - Read uint64 - Write uint64 - Create uint64 - MkDir uint64 - SymLink uint64 - MkNod uint64 - Remove uint64 - RmDir uint64 - Rename uint64 - Link uint64 - ReadDir uint64 - ReadDirPlus uint64 - FsStat uint64 - FsInfo uint64 - PathConf uint64 - Commit uint64 -} - -// ClientV4Stats models the nfs "proc4" line. -type ClientV4Stats struct { - Null uint64 - Read uint64 - Write uint64 - Commit uint64 - Open uint64 - OpenConfirm uint64 - OpenNoattr uint64 - OpenDowngrade uint64 - Close uint64 - Setattr uint64 - FsInfo uint64 - Renew uint64 - SetClientID uint64 - SetClientIDConfirm uint64 - Lock uint64 - Lockt uint64 - Locku uint64 - Access uint64 - Getattr uint64 - Lookup uint64 - LookupRoot uint64 - Remove uint64 - Rename uint64 - Link uint64 - Symlink uint64 - Create uint64 - Pathconf uint64 - StatFs uint64 - ReadLink uint64 - ReadDir uint64 - ServerCaps uint64 - DelegReturn uint64 - GetACL uint64 - SetACL uint64 - FsLocations uint64 - ReleaseLockowner uint64 - Secinfo uint64 - FsidPresent uint64 - ExchangeID uint64 - CreateSession uint64 - DestroySession uint64 - Sequence uint64 - GetLeaseTime uint64 - ReclaimComplete uint64 - LayoutGet uint64 - GetDeviceInfo uint64 - LayoutCommit uint64 - LayoutReturn uint64 - SecinfoNoName uint64 - TestStateID uint64 - FreeStateID uint64 - GetDeviceList uint64 - BindConnToSession uint64 - DestroyClientID uint64 - Seek uint64 - Allocate uint64 - DeAllocate uint64 - LayoutStats uint64 - Clone uint64 -} - -// ServerV4Stats models the nfsd "proc4" line. -type ServerV4Stats struct { - Null uint64 - Compound uint64 -} - -// V4Ops models the "proc4ops" line: NFSv4 operations -// Variable list, see: -// v4.0 https://tools.ietf.org/html/rfc3010 (38 operations) -// v4.1 https://tools.ietf.org/html/rfc5661 (58 operations) -// v4.2 https://tools.ietf.org/html/draft-ietf-nfsv4-minorversion2-41 (71 operations) -type V4Ops struct { - //Values uint64 // Variable depending on v4.x sub-version. TODO: Will this always at least include the fields in this struct? - Op0Unused uint64 - Op1Unused uint64 - Op2Future uint64 - Access uint64 - Close uint64 - Commit uint64 - Create uint64 - DelegPurge uint64 - DelegReturn uint64 - GetAttr uint64 - GetFH uint64 - Link uint64 - Lock uint64 - Lockt uint64 - Locku uint64 - Lookup uint64 - LookupRoot uint64 - Nverify uint64 - Open uint64 - OpenAttr uint64 - OpenConfirm uint64 - OpenDgrd uint64 - PutFH uint64 - PutPubFH uint64 - PutRootFH uint64 - Read uint64 - ReadDir uint64 - ReadLink uint64 - Remove uint64 - Rename uint64 - Renew uint64 - RestoreFH uint64 - SaveFH uint64 - SecInfo uint64 - SetAttr uint64 - Verify uint64 - Write uint64 - RelLockOwner uint64 -} - -// ClientRPCStats models all stats from /proc/net/rpc/nfs. -type ClientRPCStats struct { - Network Network - ClientRPC ClientRPC - V2Stats V2Stats - V3Stats V3Stats - ClientV4Stats ClientV4Stats -} - -// ServerRPCStats models all stats from /proc/net/rpc/nfsd. -type ServerRPCStats struct { - ReplyCache ReplyCache - FileHandles FileHandles - InputOutput InputOutput - Threads Threads - ReadAheadCache ReadAheadCache - Network Network - ServerRPC ServerRPC - V2Stats V2Stats - V3Stats V3Stats - ServerV4Stats ServerV4Stats - V4Ops V4Ops -} diff --git a/vendor/github.com/prometheus/procfs/nfs/parse.go b/vendor/github.com/prometheus/procfs/nfs/parse.go deleted file mode 100644 index 95a83cc5b..000000000 --- a/vendor/github.com/prometheus/procfs/nfs/parse.go +++ /dev/null @@ -1,317 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package nfs - -import ( - "fmt" -) - -func parseReplyCache(v []uint64) (ReplyCache, error) { - if len(v) != 3 { - return ReplyCache{}, fmt.Errorf("invalid ReplyCache line %q", v) - } - - return ReplyCache{ - Hits: v[0], - Misses: v[1], - NoCache: v[2], - }, nil -} - -func parseFileHandles(v []uint64) (FileHandles, error) { - if len(v) != 5 { - return FileHandles{}, fmt.Errorf("invalid FileHandles, line %q", v) - } - - return FileHandles{ - Stale: v[0], - TotalLookups: v[1], - AnonLookups: v[2], - DirNoCache: v[3], - NoDirNoCache: v[4], - }, nil -} - -func parseInputOutput(v []uint64) (InputOutput, error) { - if len(v) != 2 { - return InputOutput{}, fmt.Errorf("invalid InputOutput line %q", v) - } - - return InputOutput{ - Read: v[0], - Write: v[1], - }, nil -} - -func parseThreads(v []uint64) (Threads, error) { - if len(v) != 2 { - return Threads{}, fmt.Errorf("invalid Threads line %q", v) - } - - return Threads{ - Threads: v[0], - FullCnt: v[1], - }, nil -} - -func parseReadAheadCache(v []uint64) (ReadAheadCache, error) { - if len(v) != 12 { - return ReadAheadCache{}, fmt.Errorf("invalid ReadAheadCache line %q", v) - } - - return ReadAheadCache{ - CacheSize: v[0], - CacheHistogram: v[1:11], - NotFound: v[11], - }, nil -} - -func parseNetwork(v []uint64) (Network, error) { - if len(v) != 4 { - return Network{}, fmt.Errorf("invalid Network line %q", v) - } - - return Network{ - NetCount: v[0], - UDPCount: v[1], - TCPCount: v[2], - TCPConnect: v[3], - }, nil -} - -func parseServerRPC(v []uint64) (ServerRPC, error) { - if len(v) != 5 { - return ServerRPC{}, fmt.Errorf("invalid RPC line %q", v) - } - - return ServerRPC{ - RPCCount: v[0], - BadCnt: v[1], - BadFmt: v[2], - BadAuth: v[3], - BadcInt: v[4], - }, nil -} - -func parseClientRPC(v []uint64) (ClientRPC, error) { - if len(v) != 3 { - return ClientRPC{}, fmt.Errorf("invalid RPC line %q", v) - } - - return ClientRPC{ - RPCCount: v[0], - Retransmissions: v[1], - AuthRefreshes: v[2], - }, nil -} - -func parseV2Stats(v []uint64) (V2Stats, error) { - values := int(v[0]) - if len(v[1:]) != values || values != 18 { - return V2Stats{}, fmt.Errorf("invalid V2Stats line %q", v) - } - - return V2Stats{ - Null: v[1], - GetAttr: v[2], - SetAttr: v[3], - Root: v[4], - Lookup: v[5], - ReadLink: v[6], - Read: v[7], - WrCache: v[8], - Write: v[9], - Create: v[10], - Remove: v[11], - Rename: v[12], - Link: v[13], - SymLink: v[14], - MkDir: v[15], - RmDir: v[16], - ReadDir: v[17], - FsStat: v[18], - }, nil -} - -func parseV3Stats(v []uint64) (V3Stats, error) { - values := int(v[0]) - if len(v[1:]) != values || values != 22 { - return V3Stats{}, fmt.Errorf("invalid V3Stats line %q", v) - } - - return V3Stats{ - Null: v[1], - GetAttr: v[2], - SetAttr: v[3], - Lookup: v[4], - Access: v[5], - ReadLink: v[6], - Read: v[7], - Write: v[8], - Create: v[9], - MkDir: v[10], - SymLink: v[11], - MkNod: v[12], - Remove: v[13], - RmDir: v[14], - Rename: v[15], - Link: v[16], - ReadDir: v[17], - ReadDirPlus: v[18], - FsStat: v[19], - FsInfo: v[20], - PathConf: v[21], - Commit: v[22], - }, nil -} - -func parseClientV4Stats(v []uint64) (ClientV4Stats, error) { - values := int(v[0]) - if len(v[1:]) != values { - return ClientV4Stats{}, fmt.Errorf("invalid ClientV4Stats line %q", v) - } - - // This function currently supports mapping 59 NFS v4 client stats. Older - // kernels may emit fewer stats, so we must detect this and pad out the - // values to match the expected slice size. - if values < 59 { - newValues := make([]uint64, 60) - copy(newValues, v) - v = newValues - } - - return ClientV4Stats{ - Null: v[1], - Read: v[2], - Write: v[3], - Commit: v[4], - Open: v[5], - OpenConfirm: v[6], - OpenNoattr: v[7], - OpenDowngrade: v[8], - Close: v[9], - Setattr: v[10], - FsInfo: v[11], - Renew: v[12], - SetClientID: v[13], - SetClientIDConfirm: v[14], - Lock: v[15], - Lockt: v[16], - Locku: v[17], - Access: v[18], - Getattr: v[19], - Lookup: v[20], - LookupRoot: v[21], - Remove: v[22], - Rename: v[23], - Link: v[24], - Symlink: v[25], - Create: v[26], - Pathconf: v[27], - StatFs: v[28], - ReadLink: v[29], - ReadDir: v[30], - ServerCaps: v[31], - DelegReturn: v[32], - GetACL: v[33], - SetACL: v[34], - FsLocations: v[35], - ReleaseLockowner: v[36], - Secinfo: v[37], - FsidPresent: v[38], - ExchangeID: v[39], - CreateSession: v[40], - DestroySession: v[41], - Sequence: v[42], - GetLeaseTime: v[43], - ReclaimComplete: v[44], - LayoutGet: v[45], - GetDeviceInfo: v[46], - LayoutCommit: v[47], - LayoutReturn: v[48], - SecinfoNoName: v[49], - TestStateID: v[50], - FreeStateID: v[51], - GetDeviceList: v[52], - BindConnToSession: v[53], - DestroyClientID: v[54], - Seek: v[55], - Allocate: v[56], - DeAllocate: v[57], - LayoutStats: v[58], - Clone: v[59], - }, nil -} - -func parseServerV4Stats(v []uint64) (ServerV4Stats, error) { - values := int(v[0]) - if len(v[1:]) != values || values != 2 { - return ServerV4Stats{}, fmt.Errorf("invalid V4Stats line %q", v) - } - - return ServerV4Stats{ - Null: v[1], - Compound: v[2], - }, nil -} - -func parseV4Ops(v []uint64) (V4Ops, error) { - values := int(v[0]) - if len(v[1:]) != values || values < 39 { - return V4Ops{}, fmt.Errorf("invalid V4Ops line %q", v) - } - - stats := V4Ops{ - Op0Unused: v[1], - Op1Unused: v[2], - Op2Future: v[3], - Access: v[4], - Close: v[5], - Commit: v[6], - Create: v[7], - DelegPurge: v[8], - DelegReturn: v[9], - GetAttr: v[10], - GetFH: v[11], - Link: v[12], - Lock: v[13], - Lockt: v[14], - Locku: v[15], - Lookup: v[16], - LookupRoot: v[17], - Nverify: v[18], - Open: v[19], - OpenAttr: v[20], - OpenConfirm: v[21], - OpenDgrd: v[22], - PutFH: v[23], - PutPubFH: v[24], - PutRootFH: v[25], - Read: v[26], - ReadDir: v[27], - ReadLink: v[28], - Remove: v[29], - Rename: v[30], - Renew: v[31], - RestoreFH: v[32], - SaveFH: v[33], - SecInfo: v[34], - SetAttr: v[35], - Verify: v[36], - Write: v[37], - RelLockOwner: v[38], - } - - return stats, nil -} diff --git a/vendor/github.com/prometheus/procfs/nfs/parse_nfs.go b/vendor/github.com/prometheus/procfs/nfs/parse_nfs.go deleted file mode 100644 index c0d3a5ad9..000000000 --- a/vendor/github.com/prometheus/procfs/nfs/parse_nfs.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package nfs - -import ( - "bufio" - "fmt" - "io" - "strings" - - "github.com/prometheus/procfs/internal/util" -) - -// ParseClientRPCStats returns stats read from /proc/net/rpc/nfs -func ParseClientRPCStats(r io.Reader) (*ClientRPCStats, error) { - stats := &ClientRPCStats{} - - scanner := bufio.NewScanner(r) - for scanner.Scan() { - line := scanner.Text() - parts := strings.Fields(scanner.Text()) - // require at least - if len(parts) < 2 { - return nil, fmt.Errorf("invalid NFS metric line %q", line) - } - - values, err := util.ParseUint64s(parts[1:]) - if err != nil { - return nil, fmt.Errorf("error parsing NFS metric line: %s", err) - } - - switch metricLine := parts[0]; metricLine { - case "net": - stats.Network, err = parseNetwork(values) - case "rpc": - stats.ClientRPC, err = parseClientRPC(values) - case "proc2": - stats.V2Stats, err = parseV2Stats(values) - case "proc3": - stats.V3Stats, err = parseV3Stats(values) - case "proc4": - stats.ClientV4Stats, err = parseClientV4Stats(values) - default: - return nil, fmt.Errorf("unknown NFS metric line %q", metricLine) - } - if err != nil { - return nil, fmt.Errorf("errors parsing NFS metric line: %s", err) - } - } - - if err := scanner.Err(); err != nil { - return nil, fmt.Errorf("error scanning NFS file: %s", err) - } - - return stats, nil -} diff --git a/vendor/github.com/prometheus/procfs/nfs/parse_nfsd.go b/vendor/github.com/prometheus/procfs/nfs/parse_nfsd.go deleted file mode 100644 index 57bb4a358..000000000 --- a/vendor/github.com/prometheus/procfs/nfs/parse_nfsd.go +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package nfs - -import ( - "bufio" - "fmt" - "io" - "strings" - - "github.com/prometheus/procfs/internal/util" -) - -// ParseServerRPCStats returns stats read from /proc/net/rpc/nfsd -func ParseServerRPCStats(r io.Reader) (*ServerRPCStats, error) { - stats := &ServerRPCStats{} - - scanner := bufio.NewScanner(r) - for scanner.Scan() { - line := scanner.Text() - parts := strings.Fields(scanner.Text()) - // require at least - if len(parts) < 2 { - return nil, fmt.Errorf("invalid NFSd metric line %q", line) - } - label := parts[0] - - var values []uint64 - var err error - if label == "th" { - if len(parts) < 3 { - return nil, fmt.Errorf("invalid NFSd th metric line %q", line) - } - values, err = util.ParseUint64s(parts[1:3]) - } else { - values, err = util.ParseUint64s(parts[1:]) - } - if err != nil { - return nil, fmt.Errorf("error parsing NFSd metric line: %s", err) - } - - switch metricLine := parts[0]; metricLine { - case "rc": - stats.ReplyCache, err = parseReplyCache(values) - case "fh": - stats.FileHandles, err = parseFileHandles(values) - case "io": - stats.InputOutput, err = parseInputOutput(values) - case "th": - stats.Threads, err = parseThreads(values) - case "ra": - stats.ReadAheadCache, err = parseReadAheadCache(values) - case "net": - stats.Network, err = parseNetwork(values) - case "rpc": - stats.ServerRPC, err = parseServerRPC(values) - case "proc2": - stats.V2Stats, err = parseV2Stats(values) - case "proc3": - stats.V3Stats, err = parseV3Stats(values) - case "proc4": - stats.ServerV4Stats, err = parseServerV4Stats(values) - case "proc4ops": - stats.V4Ops, err = parseV4Ops(values) - default: - return nil, fmt.Errorf("unknown NFSd metric line %q", metricLine) - } - if err != nil { - return nil, fmt.Errorf("errors parsing NFSd metric line: %s", err) - } - } - - if err := scanner.Err(); err != nil { - return nil, fmt.Errorf("error scanning NFSd file: %s", err) - } - - return stats, nil -} diff --git a/vendor/github.com/prometheus/procfs/proc.go b/vendor/github.com/prometheus/procfs/proc.go index 06bed0ef4..330e472c7 100644 --- a/vendor/github.com/prometheus/procfs/proc.go +++ b/vendor/github.com/prometheus/procfs/proc.go @@ -20,6 +20,9 @@ import ( "os" "strconv" "strings" + + "github.com/prometheus/procfs/internal/fs" + "github.com/prometheus/procfs/internal/util" ) // Proc provides information about a running process. @@ -27,7 +30,7 @@ type Proc struct { // The process ID. PID int - fs FS + fs fs.FS } // Procs represents a list of Proc structs. @@ -52,7 +55,7 @@ func NewProc(pid int) (Proc, error) { if err != nil { return Proc{}, err } - return fs.NewProc(pid) + return fs.Proc(pid) } // AllProcs returns a list of all currently available processes under /proc. @@ -66,28 +69,35 @@ func AllProcs() (Procs, error) { // Self returns a process for the current process. func (fs FS) Self() (Proc, error) { - p, err := os.Readlink(fs.Path("self")) + p, err := os.Readlink(fs.proc.Path("self")) if err != nil { return Proc{}, err } - pid, err := strconv.Atoi(strings.Replace(p, string(fs), "", -1)) + pid, err := strconv.Atoi(strings.Replace(p, string(fs.proc), "", -1)) if err != nil { return Proc{}, err } - return fs.NewProc(pid) + return fs.Proc(pid) } // NewProc returns a process for the given pid. +// +// Deprecated: use fs.Proc() instead func (fs FS) NewProc(pid int) (Proc, error) { - if _, err := os.Stat(fs.Path(strconv.Itoa(pid))); err != nil { + return fs.Proc(pid) +} + +// Proc returns a process for the given pid. +func (fs FS) Proc(pid int) (Proc, error) { + if _, err := os.Stat(fs.proc.Path(strconv.Itoa(pid))); err != nil { return Proc{}, err } - return Proc{PID: pid, fs: fs}, nil + return Proc{PID: pid, fs: fs.proc}, nil } // AllProcs returns a list of all currently available processes. func (fs FS) AllProcs() (Procs, error) { - d, err := os.Open(fs.Path()) + d, err := os.Open(fs.proc.Path()) if err != nil { return Procs{}, err } @@ -104,7 +114,7 @@ func (fs FS) AllProcs() (Procs, error) { if err != nil { continue } - p = append(p, Proc{PID: int(pid), fs: fs}) + p = append(p, Proc{PID: int(pid), fs: fs.proc}) } return p, nil @@ -112,13 +122,7 @@ func (fs FS) AllProcs() (Procs, error) { // CmdLine returns the command line of a process. func (p Proc) CmdLine() ([]string, error) { - f, err := os.Open(p.path("cmdline")) - if err != nil { - return nil, err - } - defer f.Close() - - data, err := ioutil.ReadAll(f) + data, err := util.ReadFileNoStat(p.path("cmdline")) if err != nil { return nil, err } @@ -132,13 +136,7 @@ func (p Proc) CmdLine() ([]string, error) { // Comm returns the command name of a process. func (p Proc) Comm() (string, error) { - f, err := os.Open(p.path("comm")) - if err != nil { - return "", err - } - defer f.Close() - - data, err := ioutil.ReadAll(f) + data, err := util.ReadFileNoStat(p.path("comm")) if err != nil { return "", err } @@ -238,6 +236,18 @@ func (p Proc) MountStats() ([]*Mount, error) { return parseMountStats(f) } +// MountInfo retrieves mount information for mount points in a +// process's namespace. +// It supplies information missing in `/proc/self/mounts` and +// fixes various other problems with that file too. +func (p Proc) MountInfo() ([]*MountInfo, error) { + data, err := util.ReadFileNoStat(p.path("mountinfo")) + if err != nil { + return nil, err + } + return parseMountInfo(data) +} + func (p Proc) fileDescriptors() ([]string, error) { d, err := os.Open(p.path("fd")) if err != nil { @@ -256,3 +266,33 @@ func (p Proc) fileDescriptors() ([]string, error) { func (p Proc) path(pa ...string) string { return p.fs.Path(append([]string{strconv.Itoa(p.PID)}, pa...)...) } + +// FileDescriptorsInfo retrieves information about all file descriptors of +// the process. +func (p Proc) FileDescriptorsInfo() (ProcFDInfos, error) { + names, err := p.fileDescriptors() + if err != nil { + return nil, err + } + + var fdinfos ProcFDInfos + + for _, n := range names { + fdinfo, err := p.FDInfo(n) + if err != nil { + continue + } + fdinfos = append(fdinfos, *fdinfo) + } + + return fdinfos, nil +} + +// Schedstat returns task scheduling information for the process. +func (p Proc) Schedstat() (ProcSchedstat, error) { + contents, err := ioutil.ReadFile(p.path("schedstat")) + if err != nil { + return ProcSchedstat{}, err + } + return parseProcSchedstat(string(contents)) +} diff --git a/vendor/github.com/prometheus/procfs/proc_environ.go b/vendor/github.com/prometheus/procfs/proc_environ.go new file mode 100644 index 000000000..6134b3580 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/proc_environ.go @@ -0,0 +1,37 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// Environ reads process environments from /proc//environ +func (p Proc) Environ() ([]string, error) { + environments := make([]string, 0) + + data, err := util.ReadFileNoStat(p.path("environ")) + if err != nil { + return environments, err + } + + environments = strings.Split(string(data), "\000") + if len(environments) > 0 { + environments = environments[:len(environments)-1] + } + + return environments, nil +} diff --git a/vendor/github.com/prometheus/procfs/proc_fdinfo.go b/vendor/github.com/prometheus/procfs/proc_fdinfo.go new file mode 100644 index 000000000..4e7597f86 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/proc_fdinfo.go @@ -0,0 +1,125 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "bytes" + "regexp" + + "github.com/prometheus/procfs/internal/util" +) + +// Regexp variables +var ( + rPos = regexp.MustCompile(`^pos:\s+(\d+)$`) + rFlags = regexp.MustCompile(`^flags:\s+(\d+)$`) + rMntID = regexp.MustCompile(`^mnt_id:\s+(\d+)$`) + rInotify = regexp.MustCompile(`^inotify`) +) + +// ProcFDInfo contains represents file descriptor information. +type ProcFDInfo struct { + // File descriptor + FD string + // File offset + Pos string + // File access mode and status flags + Flags string + // Mount point ID + MntID string + // List of inotify lines (structed) in the fdinfo file (kernel 3.8+ only) + InotifyInfos []InotifyInfo +} + +// FDInfo constructor. On kernels older than 3.8, InotifyInfos will always be empty. +func (p Proc) FDInfo(fd string) (*ProcFDInfo, error) { + data, err := util.ReadFileNoStat(p.path("fdinfo", fd)) + if err != nil { + return nil, err + } + + var text, pos, flags, mntid string + var inotify []InotifyInfo + + scanner := bufio.NewScanner(bytes.NewReader(data)) + for scanner.Scan() { + text = scanner.Text() + if rPos.MatchString(text) { + pos = rPos.FindStringSubmatch(text)[1] + } else if rFlags.MatchString(text) { + flags = rFlags.FindStringSubmatch(text)[1] + } else if rMntID.MatchString(text) { + mntid = rMntID.FindStringSubmatch(text)[1] + } else if rInotify.MatchString(text) { + newInotify, err := parseInotifyInfo(text) + if err != nil { + return nil, err + } + inotify = append(inotify, *newInotify) + } + } + + i := &ProcFDInfo{ + FD: fd, + Pos: pos, + Flags: flags, + MntID: mntid, + InotifyInfos: inotify, + } + + return i, nil +} + +// InotifyInfo represents a single inotify line in the fdinfo file. +type InotifyInfo struct { + // Watch descriptor number + WD string + // Inode number + Ino string + // Device ID + Sdev string + // Mask of events being monitored + Mask string +} + +// InotifyInfo constructor. Only available on kernel 3.8+. +func parseInotifyInfo(line string) (*InotifyInfo, error) { + r := regexp.MustCompile(`^inotify\s+wd:([0-9a-f]+)\s+ino:([0-9a-f]+)\s+sdev:([0-9a-f]+)\s+mask:([0-9a-f]+)`) + m := r.FindStringSubmatch(line) + i := &InotifyInfo{ + WD: m[1], + Ino: m[2], + Sdev: m[3], + Mask: m[4], + } + return i, nil +} + +// ProcFDInfos represents a list of ProcFDInfo structs. +type ProcFDInfos []ProcFDInfo + +func (p ProcFDInfos) Len() int { return len(p) } +func (p ProcFDInfos) Swap(i, j int) { p[i], p[j] = p[j], p[i] } +func (p ProcFDInfos) Less(i, j int) bool { return p[i].FD < p[j].FD } + +// InotifyWatchLen returns the total number of inotify watches +func (p ProcFDInfos) InotifyWatchLen() (int, error) { + length := 0 + for _, f := range p { + length += len(f.InotifyInfos) + } + + return length, nil +} diff --git a/vendor/github.com/prometheus/procfs/proc_io.go b/vendor/github.com/prometheus/procfs/proc_io.go index 0251c83bf..776f34971 100644 --- a/vendor/github.com/prometheus/procfs/proc_io.go +++ b/vendor/github.com/prometheus/procfs/proc_io.go @@ -15,8 +15,8 @@ package procfs import ( "fmt" - "io/ioutil" - "os" + + "github.com/prometheus/procfs/internal/util" ) // ProcIO models the content of /proc//io. @@ -39,17 +39,11 @@ type ProcIO struct { CancelledWriteBytes int64 } -// NewIO creates a new ProcIO instance from a given Proc instance. -func (p Proc) NewIO() (ProcIO, error) { +// IO creates a new ProcIO instance from a given Proc instance. +func (p Proc) IO() (ProcIO, error) { pio := ProcIO{} - f, err := os.Open(p.path("io")) - if err != nil { - return pio, err - } - defer f.Close() - - data, err := ioutil.ReadAll(f) + data, err := util.ReadFileNoStat(p.path("io")) if err != nil { return pio, err } diff --git a/vendor/github.com/prometheus/procfs/proc_limits.go b/vendor/github.com/prometheus/procfs/proc_limits.go index f04ba6fda..91ee24df8 100644 --- a/vendor/github.com/prometheus/procfs/proc_limits.go +++ b/vendor/github.com/prometheus/procfs/proc_limits.go @@ -78,7 +78,14 @@ var ( ) // NewLimits returns the current soft limits of the process. +// +// Deprecated: use p.Limits() instead func (p Proc) NewLimits() (ProcLimits, error) { + return p.Limits() +} + +// Limits returns the current soft limits of the process. +func (p Proc) Limits() (ProcLimits, error) { f, err := os.Open(p.path("limits")) if err != nil { return ProcLimits{}, err diff --git a/vendor/github.com/prometheus/procfs/proc_ns.go b/vendor/github.com/prometheus/procfs/proc_ns.go index d06c26eba..c66740ff7 100644 --- a/vendor/github.com/prometheus/procfs/proc_ns.go +++ b/vendor/github.com/prometheus/procfs/proc_ns.go @@ -29,9 +29,9 @@ type Namespace struct { // Namespaces contains all of the namespaces that the process is contained in. type Namespaces map[string]Namespace -// NewNamespaces reads from /proc/[pid/ns/* to get the namespaces of which the +// Namespaces reads from /proc//ns/* to get the namespaces of which the // process is a member. -func (p Proc) NewNamespaces() (Namespaces, error) { +func (p Proc) Namespaces() (Namespaces, error) { d, err := os.Open(p.path("ns")) if err != nil { return nil, err diff --git a/vendor/github.com/prometheus/procfs/proc_psi.go b/vendor/github.com/prometheus/procfs/proc_psi.go new file mode 100644 index 000000000..0d7bee54c --- /dev/null +++ b/vendor/github.com/prometheus/procfs/proc_psi.go @@ -0,0 +1,100 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +// The PSI / pressure interface is described at +// https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/accounting/psi.txt +// Each resource (cpu, io, memory, ...) is exposed as a single file. +// Each file may contain up to two lines, one for "some" pressure and one for "full" pressure. +// Each line contains several averages (over n seconds) and a total in µs. +// +// Example io pressure file: +// > some avg10=0.06 avg60=0.21 avg300=0.99 total=8537362 +// > full avg10=0.00 avg60=0.13 avg300=0.96 total=8183134 + +import ( + "bufio" + "bytes" + "fmt" + "io" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +const lineFormat = "avg10=%f avg60=%f avg300=%f total=%d" + +// PSILine is a single line of values as returned by /proc/pressure/* +// The Avg entries are averages over n seconds, as a percentage +// The Total line is in microseconds +type PSILine struct { + Avg10 float64 + Avg60 float64 + Avg300 float64 + Total uint64 +} + +// PSIStats represent pressure stall information from /proc/pressure/* +// Some indicates the share of time in which at least some tasks are stalled +// Full indicates the share of time in which all non-idle tasks are stalled simultaneously +type PSIStats struct { + Some *PSILine + Full *PSILine +} + +// PSIStatsForResource reads pressure stall information for the specified +// resource from /proc/pressure/. At time of writing this can be +// either "cpu", "memory" or "io". +func (fs FS) PSIStatsForResource(resource string) (PSIStats, error) { + data, err := util.ReadFileNoStat(fs.proc.Path(fmt.Sprintf("%s/%s", "pressure", resource))) + if err != nil { + return PSIStats{}, fmt.Errorf("psi_stats: unavailable for %s", resource) + } + + return parsePSIStats(resource, bytes.NewReader(data)) +} + +// parsePSIStats parses the specified file for pressure stall information +func parsePSIStats(resource string, r io.Reader) (PSIStats, error) { + psiStats := PSIStats{} + + scanner := bufio.NewScanner(r) + for scanner.Scan() { + l := scanner.Text() + prefix := strings.Split(l, " ")[0] + switch prefix { + case "some": + psi := PSILine{} + _, err := fmt.Sscanf(l, fmt.Sprintf("some %s", lineFormat), &psi.Avg10, &psi.Avg60, &psi.Avg300, &psi.Total) + if err != nil { + return PSIStats{}, err + } + psiStats.Some = &psi + case "full": + psi := PSILine{} + _, err := fmt.Sscanf(l, fmt.Sprintf("full %s", lineFormat), &psi.Avg10, &psi.Avg60, &psi.Avg300, &psi.Total) + if err != nil { + return PSIStats{}, err + } + psiStats.Full = &psi + default: + // If we encounter a line with an unknown prefix, ignore it and move on + // Should new measurement types be added in the future we'll simply ignore them instead + // of erroring on retrieval + continue + } + } + + return psiStats, nil +} diff --git a/vendor/github.com/prometheus/procfs/proc_stat.go b/vendor/github.com/prometheus/procfs/proc_stat.go index 3cf2a9f18..4517d2e9d 100644 --- a/vendor/github.com/prometheus/procfs/proc_stat.go +++ b/vendor/github.com/prometheus/procfs/proc_stat.go @@ -16,8 +16,10 @@ package procfs import ( "bytes" "fmt" - "io/ioutil" "os" + + "github.com/prometheus/procfs/internal/fs" + "github.com/prometheus/procfs/internal/util" ) // Originally, this USER_HZ value was dynamically retrieved via a sysconf call @@ -95,22 +97,23 @@ type ProcStat struct { // in clock ticks. Starttime uint64 // Virtual memory size in bytes. - VSize int + VSize uint // Resident set size in pages. RSS int - fs FS + proc fs.FS } // NewStat returns the current status information of the process. +// +// Deprecated: use p.Stat() instead func (p Proc) NewStat() (ProcStat, error) { - f, err := os.Open(p.path("stat")) - if err != nil { - return ProcStat{}, err - } - defer f.Close() + return p.Stat() +} - data, err := ioutil.ReadAll(f) +// Stat returns the current status information of the process. +func (p Proc) Stat() (ProcStat, error) { + data, err := util.ReadFileNoStat(p.path("stat")) if err != nil { return ProcStat{}, err } @@ -118,7 +121,7 @@ func (p Proc) NewStat() (ProcStat, error) { var ( ignore int - s = ProcStat{PID: p.PID, fs: p.fs} + s = ProcStat{PID: p.PID, proc: p.fs} l = bytes.Index(data, []byte("(")) r = bytes.LastIndex(data, []byte(")")) ) @@ -164,7 +167,7 @@ func (p Proc) NewStat() (ProcStat, error) { } // VirtualMemory returns the virtual memory size in bytes. -func (s ProcStat) VirtualMemory() int { +func (s ProcStat) VirtualMemory() uint { return s.VSize } @@ -175,7 +178,8 @@ func (s ProcStat) ResidentMemory() int { // StartTime returns the unix timestamp of the process in seconds. func (s ProcStat) StartTime() (float64, error) { - stat, err := s.fs.NewStat() + fs := FS{proc: s.proc} + stat, err := fs.Stat() if err != nil { return 0, err } diff --git a/vendor/github.com/prometheus/procfs/proc_status.go b/vendor/github.com/prometheus/procfs/proc_status.go new file mode 100644 index 000000000..e30c2b88f --- /dev/null +++ b/vendor/github.com/prometheus/procfs/proc_status.go @@ -0,0 +1,161 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bytes" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// ProcStatus provides status information about the process, +// read from /proc/[pid]/stat. +type ProcStatus struct { + // The process ID. + PID int + // The process name. + Name string + + // Thread group ID. + TGID int + + // Peak virtual memory size. + VmPeak uint64 + // Virtual memory size. + VmSize uint64 + // Locked memory size. + VmLck uint64 + // Pinned memory size. + VmPin uint64 + // Peak resident set size. + VmHWM uint64 + // Resident set size (sum of RssAnnon RssFile and RssShmem). + VmRSS uint64 + // Size of resident anonymous memory. + RssAnon uint64 + // Size of resident file mappings. + RssFile uint64 + // Size of resident shared memory. + RssShmem uint64 + // Size of data segments. + VmData uint64 + // Size of stack segments. + VmStk uint64 + // Size of text segments. + VmExe uint64 + // Shared library code size. + VmLib uint64 + // Page table entries size. + VmPTE uint64 + // Size of second-level page tables. + VmPMD uint64 + // Swapped-out virtual memory size by anonymous private. + VmSwap uint64 + // Size of hugetlb memory portions + HugetlbPages uint64 + + // Number of voluntary context switches. + VoluntaryCtxtSwitches uint64 + // Number of involuntary context switches. + NonVoluntaryCtxtSwitches uint64 +} + +// NewStatus returns the current status information of the process. +func (p Proc) NewStatus() (ProcStatus, error) { + data, err := util.ReadFileNoStat(p.path("status")) + if err != nil { + return ProcStatus{}, err + } + + s := ProcStatus{PID: p.PID} + + lines := strings.Split(string(data), "\n") + for _, line := range lines { + if !bytes.Contains([]byte(line), []byte(":")) { + continue + } + + kv := strings.SplitN(line, ":", 2) + + // removes spaces + k := string(strings.TrimSpace(kv[0])) + v := string(strings.TrimSpace(kv[1])) + // removes "kB" + v = string(bytes.Trim([]byte(v), " kB")) + + // value to int when possible + // we can skip error check here, 'cause vKBytes is not used when value is a string + vKBytes, _ := strconv.ParseUint(v, 10, 64) + // convert kB to B + vBytes := vKBytes * 1024 + + s.fillStatus(k, v, vKBytes, vBytes) + } + + return s, nil +} + +func (s *ProcStatus) fillStatus(k string, vString string, vUint uint64, vUintBytes uint64) { + switch k { + case "Tgid": + s.TGID = int(vUint) + case "Name": + s.Name = vString + case "VmPeak": + s.VmPeak = vUintBytes + case "VmSize": + s.VmSize = vUintBytes + case "VmLck": + s.VmLck = vUintBytes + case "VmPin": + s.VmPin = vUintBytes + case "VmHWM": + s.VmHWM = vUintBytes + case "VmRSS": + s.VmRSS = vUintBytes + case "RssAnon": + s.RssAnon = vUintBytes + case "RssFile": + s.RssFile = vUintBytes + case "RssShmem": + s.RssShmem = vUintBytes + case "VmData": + s.VmData = vUintBytes + case "VmStk": + s.VmStk = vUintBytes + case "VmExe": + s.VmExe = vUintBytes + case "VmLib": + s.VmLib = vUintBytes + case "VmPTE": + s.VmPTE = vUintBytes + case "VmPMD": + s.VmPMD = vUintBytes + case "VmSwap": + s.VmSwap = vUintBytes + case "HugetlbPages": + s.HugetlbPages = vUintBytes + case "voluntary_ctxt_switches": + s.VoluntaryCtxtSwitches = vUint + case "nonvoluntary_ctxt_switches": + s.NonVoluntaryCtxtSwitches = vUint + } +} + +// TotalCtxtSwitches returns the total context switch. +func (s ProcStatus) TotalCtxtSwitches() uint64 { + return s.VoluntaryCtxtSwitches + s.NonVoluntaryCtxtSwitches +} diff --git a/vendor/github.com/prometheus/procfs/schedstat.go b/vendor/github.com/prometheus/procfs/schedstat.go new file mode 100644 index 000000000..a4c4089ac --- /dev/null +++ b/vendor/github.com/prometheus/procfs/schedstat.go @@ -0,0 +1,118 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "errors" + "os" + "regexp" + "strconv" +) + +var ( + cpuLineRE = regexp.MustCompile(`cpu(\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+)`) + procLineRE = regexp.MustCompile(`(\d+) (\d+) (\d+)`) +) + +// Schedstat contains scheduler statistics from /proc/schedstat +// +// See +// https://www.kernel.org/doc/Documentation/scheduler/sched-stats.txt +// for a detailed description of what these numbers mean. +// +// Note the current kernel documentation claims some of the time units are in +// jiffies when they are actually in nanoseconds since 2.6.23 with the +// introduction of CFS. A fix to the documentation is pending. See +// https://lore.kernel.org/patchwork/project/lkml/list/?series=403473 +type Schedstat struct { + CPUs []*SchedstatCPU +} + +// SchedstatCPU contains the values from one "cpu" line +type SchedstatCPU struct { + CPUNum string + + RunningNanoseconds uint64 + WaitingNanoseconds uint64 + RunTimeslices uint64 +} + +// ProcSchedstat contains the values from /proc//schedstat +type ProcSchedstat struct { + RunningNanoseconds uint64 + WaitingNanoseconds uint64 + RunTimeslices uint64 +} + +// Schedstat reads data from /proc/schedstat +func (fs FS) Schedstat() (*Schedstat, error) { + file, err := os.Open(fs.proc.Path("schedstat")) + if err != nil { + return nil, err + } + defer file.Close() + + stats := &Schedstat{} + scanner := bufio.NewScanner(file) + + for scanner.Scan() { + match := cpuLineRE.FindStringSubmatch(scanner.Text()) + if match != nil { + cpu := &SchedstatCPU{} + cpu.CPUNum = match[1] + + cpu.RunningNanoseconds, err = strconv.ParseUint(match[8], 10, 64) + if err != nil { + continue + } + + cpu.WaitingNanoseconds, err = strconv.ParseUint(match[9], 10, 64) + if err != nil { + continue + } + + cpu.RunTimeslices, err = strconv.ParseUint(match[10], 10, 64) + if err != nil { + continue + } + + stats.CPUs = append(stats.CPUs, cpu) + } + } + + return stats, nil +} + +func parseProcSchedstat(contents string) (stats ProcSchedstat, err error) { + match := procLineRE.FindStringSubmatch(contents) + + if match != nil { + stats.RunningNanoseconds, err = strconv.ParseUint(match[1], 10, 64) + if err != nil { + return + } + + stats.WaitingNanoseconds, err = strconv.ParseUint(match[2], 10, 64) + if err != nil { + return + } + + stats.RunTimeslices, err = strconv.ParseUint(match[3], 10, 64) + return + } + + err = errors.New("could not parse schedstat") + return +} diff --git a/vendor/github.com/prometheus/procfs/stat.go b/vendor/github.com/prometheus/procfs/stat.go index 61eb6b0e3..b2a6fc994 100644 --- a/vendor/github.com/prometheus/procfs/stat.go +++ b/vendor/github.com/prometheus/procfs/stat.go @@ -15,11 +15,14 @@ package procfs import ( "bufio" + "bytes" "fmt" "io" - "os" "strconv" "strings" + + "github.com/prometheus/procfs/internal/fs" + "github.com/prometheus/procfs/internal/util" ) // CPUStat shows how much time the cpu spend in various stages. @@ -78,16 +81,6 @@ type Stat struct { SoftIRQ SoftIRQStat } -// NewStat returns kernel/system statistics read from /proc/stat. -func NewStat() (Stat, error) { - fs, err := NewFS(DefaultMountPoint) - if err != nil { - return Stat{}, err - } - - return fs.NewStat() -} - // Parse a cpu statistics line and returns the CPUStat struct plus the cpu id (or -1 for the overall sum). func parseCPUStat(line string) (CPUStat, int64, error) { cpuStat := CPUStat{} @@ -149,19 +142,38 @@ func parseSoftIRQStat(line string) (SoftIRQStat, uint64, error) { return softIRQStat, total, nil } -// NewStat returns an information about current kernel/system statistics. +// NewStat returns information about current cpu/process statistics. +// See https://www.kernel.org/doc/Documentation/filesystems/proc.txt +// +// Deprecated: use fs.Stat() instead +func NewStat() (Stat, error) { + fs, err := NewFS(fs.DefaultProcMountPoint) + if err != nil { + return Stat{}, err + } + return fs.Stat() +} + +// NewStat returns information about current cpu/process statistics. +// See https://www.kernel.org/doc/Documentation/filesystems/proc.txt +// +// Deprecated: use fs.Stat() instead func (fs FS) NewStat() (Stat, error) { - // See https://www.kernel.org/doc/Documentation/filesystems/proc.txt + return fs.Stat() +} - f, err := os.Open(fs.Path("stat")) +// Stat returns information about current cpu/process statistics. +// See https://www.kernel.org/doc/Documentation/filesystems/proc.txt +func (fs FS) Stat() (Stat, error) { + fileName := fs.proc.Path("stat") + data, err := util.ReadFileNoStat(fileName) if err != nil { return Stat{}, err } - defer f.Close() stat := Stat{} - scanner := bufio.NewScanner(f) + scanner := bufio.NewScanner(bytes.NewReader(data)) for scanner.Scan() { line := scanner.Text() parts := strings.Fields(scanner.Text()) @@ -225,7 +237,7 @@ func (fs FS) NewStat() (Stat, error) { } if err := scanner.Err(); err != nil { - return Stat{}, fmt.Errorf("couldn't parse %s: %s", f.Name(), err) + return Stat{}, fmt.Errorf("couldn't parse %s: %s", fileName, err) } return stat, nil diff --git a/vendor/github.com/prometheus/procfs/ttar b/vendor/github.com/prometheus/procfs/ttar old mode 100755 new mode 100644 index b0171a12b..19ef02b8d --- a/vendor/github.com/prometheus/procfs/ttar +++ b/vendor/github.com/prometheus/procfs/ttar @@ -86,8 +86,10 @@ Usage: $bname [-C ] -c -f (create archive) $bname [-C ] -x -f (extract archive) Options: - -C (change directory) - -v (verbose) + -C (change directory) + -v (verbose) + --recursive-unlink (recursively delete existing directory if path + collides with file or directory to extract) Example: Change to sysfs directory, create ttar file from fixtures directory $bname -C sysfs -c -f sysfs/fixtures.ttar fixtures/ @@ -111,8 +113,9 @@ function set_cmd { } unset VERBOSE +unset RECURSIVE_UNLINK -while getopts :cf:htxvC: opt; do +while getopts :cf:-:htxvC: opt; do case $opt in c) set_cmd "create" @@ -136,6 +139,18 @@ while getopts :cf:htxvC: opt; do C) CDIR=$OPTARG ;; + -) + case $OPTARG in + recursive-unlink) + RECURSIVE_UNLINK="yes" + ;; + *) + echo -e "Error: invalid option -$OPTARG" + echo + usage 1 + ;; + esac + ;; *) echo >&2 "ERROR: invalid option -$OPTARG" echo @@ -212,16 +227,16 @@ function extract { local eof_without_newline if [ "$size" -gt 0 ]; then if [[ "$line" =~ [^\\]EOF ]]; then - # An EOF not preceeded by a backslash indicates that the line + # An EOF not preceded by a backslash indicates that the line # does not end with a newline eof_without_newline=1 else eof_without_newline=0 fi # Replace NULLBYTE with null byte if at beginning of line - # Replace NULLBYTE with null byte unless preceeded by backslash + # Replace NULLBYTE with null byte unless preceded by backslash # Remove one backslash in front of NULLBYTE (if any) - # Remove EOF unless preceeded by backslash + # Remove EOF unless preceded by backslash # Remove one backslash in front of EOF if [ $USE_PYTHON -eq 1 ]; then echo -n "$line" | python -c "$PYTHON_EXTRACT_FILTER" >> "$path" @@ -245,7 +260,16 @@ function extract { fi if [[ $line =~ ^Path:\ (.*)$ ]]; then path=${BASH_REMATCH[1]} - if [ -e "$path" ] || [ -L "$path" ]; then + if [ -L "$path" ]; then + rm "$path" + elif [ -d "$path" ]; then + if [ "${RECURSIVE_UNLINK:-}" == "yes" ]; then + rm -r "$path" + else + # Safe because symlinks to directories are dealt with above + rmdir "$path" + fi + elif [ -e "$path" ]; then rm "$path" fi elif [[ $line =~ ^Lines:\ (.*)$ ]]; then @@ -338,8 +362,8 @@ function _create { else < "$file" \ sed 's/EOF/\\EOF/g; - s/NULLBYTE/\\NULLBYTE/g; - s/\x0/NULLBYTE/g; + s/NULLBYTE/\\NULLBYTE/g; + s/\x0/NULLBYTE/g; ' fi if [[ "$eof_without_newline" -eq 1 ]]; then diff --git a/vendor/github.com/prometheus/procfs/vm.go b/vendor/github.com/prometheus/procfs/vm.go new file mode 100644 index 000000000..cb1389141 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/vm.go @@ -0,0 +1,210 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !windows + +package procfs + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// The VM interface is described at +// https://www.kernel.org/doc/Documentation/sysctl/vm.txt +// Each setting is exposed as a single file. +// Each file contains one line with a single numerical value, except lowmem_reserve_ratio which holds an array +// and numa_zonelist_order (deprecated) which is a string +type VM struct { + AdminReserveKbytes *int64 // /proc/sys/vm/admin_reserve_kbytes + BlockDump *int64 // /proc/sys/vm/block_dump + CompactUnevictableAllowed *int64 // /proc/sys/vm/compact_unevictable_allowed + DirtyBackgroundBytes *int64 // /proc/sys/vm/dirty_background_bytes + DirtyBackgroundRatio *int64 // /proc/sys/vm/dirty_background_ratio + DirtyBytes *int64 // /proc/sys/vm/dirty_bytes + DirtyExpireCentisecs *int64 // /proc/sys/vm/dirty_expire_centisecs + DirtyRatio *int64 // /proc/sys/vm/dirty_ratio + DirtytimeExpireSeconds *int64 // /proc/sys/vm/dirtytime_expire_seconds + DirtyWritebackCentisecs *int64 // /proc/sys/vm/dirty_writeback_centisecs + DropCaches *int64 // /proc/sys/vm/drop_caches + ExtfragThreshold *int64 // /proc/sys/vm/extfrag_threshold + HugetlbShmGroup *int64 // /proc/sys/vm/hugetlb_shm_group + LaptopMode *int64 // /proc/sys/vm/laptop_mode + LegacyVaLayout *int64 // /proc/sys/vm/legacy_va_layout + LowmemReserveRatio []*int64 // /proc/sys/vm/lowmem_reserve_ratio + MaxMapCount *int64 // /proc/sys/vm/max_map_count + MemoryFailureEarlyKill *int64 // /proc/sys/vm/memory_failure_early_kill + MemoryFailureRecovery *int64 // /proc/sys/vm/memory_failure_recovery + MinFreeKbytes *int64 // /proc/sys/vm/min_free_kbytes + MinSlabRatio *int64 // /proc/sys/vm/min_slab_ratio + MinUnmappedRatio *int64 // /proc/sys/vm/min_unmapped_ratio + MmapMinAddr *int64 // /proc/sys/vm/mmap_min_addr + NrHugepages *int64 // /proc/sys/vm/nr_hugepages + NrHugepagesMempolicy *int64 // /proc/sys/vm/nr_hugepages_mempolicy + NrOvercommitHugepages *int64 // /proc/sys/vm/nr_overcommit_hugepages + NumaStat *int64 // /proc/sys/vm/numa_stat + NumaZonelistOrder string // /proc/sys/vm/numa_zonelist_order + OomDumpTasks *int64 // /proc/sys/vm/oom_dump_tasks + OomKillAllocatingTask *int64 // /proc/sys/vm/oom_kill_allocating_task + OvercommitKbytes *int64 // /proc/sys/vm/overcommit_kbytes + OvercommitMemory *int64 // /proc/sys/vm/overcommit_memory + OvercommitRatio *int64 // /proc/sys/vm/overcommit_ratio + PageCluster *int64 // /proc/sys/vm/page-cluster + PanicOnOom *int64 // /proc/sys/vm/panic_on_oom + PercpuPagelistFraction *int64 // /proc/sys/vm/percpu_pagelist_fraction + StatInterval *int64 // /proc/sys/vm/stat_interval + Swappiness *int64 // /proc/sys/vm/swappiness + UserReserveKbytes *int64 // /proc/sys/vm/user_reserve_kbytes + VfsCachePressure *int64 // /proc/sys/vm/vfs_cache_pressure + WatermarkBoostFactor *int64 // /proc/sys/vm/watermark_boost_factor + WatermarkScaleFactor *int64 // /proc/sys/vm/watermark_scale_factor + ZoneReclaimMode *int64 // /proc/sys/vm/zone_reclaim_mode +} + +// VM reads the VM statistics from the specified `proc` filesystem. +func (fs FS) VM() (*VM, error) { + path := fs.proc.Path("sys/vm") + file, err := os.Stat(path) + if err != nil { + return nil, err + } + if !file.Mode().IsDir() { + return nil, fmt.Errorf("%s is not a directory", path) + } + + files, err := ioutil.ReadDir(path) + if err != nil { + return nil, err + } + + var vm VM + for _, f := range files { + if f.IsDir() { + continue + } + + name := filepath.Join(path, f.Name()) + // ignore errors on read, as there are some write only + // in /proc/sys/vm + value, err := util.SysReadFile(name) + if err != nil { + continue + } + vp := util.NewValueParser(value) + + switch f.Name() { + case "admin_reserve_kbytes": + vm.AdminReserveKbytes = vp.PInt64() + case "block_dump": + vm.BlockDump = vp.PInt64() + case "compact_unevictable_allowed": + vm.CompactUnevictableAllowed = vp.PInt64() + case "dirty_background_bytes": + vm.DirtyBackgroundBytes = vp.PInt64() + case "dirty_background_ratio": + vm.DirtyBackgroundRatio = vp.PInt64() + case "dirty_bytes": + vm.DirtyBytes = vp.PInt64() + case "dirty_expire_centisecs": + vm.DirtyExpireCentisecs = vp.PInt64() + case "dirty_ratio": + vm.DirtyRatio = vp.PInt64() + case "dirtytime_expire_seconds": + vm.DirtytimeExpireSeconds = vp.PInt64() + case "dirty_writeback_centisecs": + vm.DirtyWritebackCentisecs = vp.PInt64() + case "drop_caches": + vm.DropCaches = vp.PInt64() + case "extfrag_threshold": + vm.ExtfragThreshold = vp.PInt64() + case "hugetlb_shm_group": + vm.HugetlbShmGroup = vp.PInt64() + case "laptop_mode": + vm.LaptopMode = vp.PInt64() + case "legacy_va_layout": + vm.LegacyVaLayout = vp.PInt64() + case "lowmem_reserve_ratio": + stringSlice := strings.Fields(value) + pint64Slice := make([]*int64, 0, len(stringSlice)) + for _, value := range stringSlice { + vp := util.NewValueParser(value) + pint64Slice = append(pint64Slice, vp.PInt64()) + } + vm.LowmemReserveRatio = pint64Slice + case "max_map_count": + vm.MaxMapCount = vp.PInt64() + case "memory_failure_early_kill": + vm.MemoryFailureEarlyKill = vp.PInt64() + case "memory_failure_recovery": + vm.MemoryFailureRecovery = vp.PInt64() + case "min_free_kbytes": + vm.MinFreeKbytes = vp.PInt64() + case "min_slab_ratio": + vm.MinSlabRatio = vp.PInt64() + case "min_unmapped_ratio": + vm.MinUnmappedRatio = vp.PInt64() + case "mmap_min_addr": + vm.MmapMinAddr = vp.PInt64() + case "nr_hugepages": + vm.NrHugepages = vp.PInt64() + case "nr_hugepages_mempolicy": + vm.NrHugepagesMempolicy = vp.PInt64() + case "nr_overcommit_hugepages": + vm.NrOvercommitHugepages = vp.PInt64() + case "numa_stat": + vm.NumaStat = vp.PInt64() + case "numa_zonelist_order": + vm.NumaZonelistOrder = value + case "oom_dump_tasks": + vm.OomDumpTasks = vp.PInt64() + case "oom_kill_allocating_task": + vm.OomKillAllocatingTask = vp.PInt64() + case "overcommit_kbytes": + vm.OvercommitKbytes = vp.PInt64() + case "overcommit_memory": + vm.OvercommitMemory = vp.PInt64() + case "overcommit_ratio": + vm.OvercommitRatio = vp.PInt64() + case "page-cluster": + vm.PageCluster = vp.PInt64() + case "panic_on_oom": + vm.PanicOnOom = vp.PInt64() + case "percpu_pagelist_fraction": + vm.PercpuPagelistFraction = vp.PInt64() + case "stat_interval": + vm.StatInterval = vp.PInt64() + case "swappiness": + vm.Swappiness = vp.PInt64() + case "user_reserve_kbytes": + vm.UserReserveKbytes = vp.PInt64() + case "vfs_cache_pressure": + vm.VfsCachePressure = vp.PInt64() + case "watermark_boost_factor": + vm.WatermarkBoostFactor = vp.PInt64() + case "watermark_scale_factor": + vm.WatermarkScaleFactor = vp.PInt64() + case "zone_reclaim_mode": + vm.ZoneReclaimMode = vp.PInt64() + } + if err := vp.Err(); err != nil { + return nil, err + } + } + + return &vm, nil +} diff --git a/vendor/github.com/prometheus/procfs/xfrm.go b/vendor/github.com/prometheus/procfs/xfrm.go index 8f1508f0f..30aa417d5 100644 --- a/vendor/github.com/prometheus/procfs/xfrm.go +++ b/vendor/github.com/prometheus/procfs/xfrm.go @@ -97,7 +97,7 @@ func NewXfrmStat() (XfrmStat, error) { // NewXfrmStat reads the xfrm_stat statistics from the 'proc' filesystem. func (fs FS) NewXfrmStat() (XfrmStat, error) { - file, err := os.Open(fs.Path("net/xfrm_stat")) + file, err := os.Open(fs.proc.Path("net/xfrm_stat")) if err != nil { return XfrmStat{}, err } diff --git a/vendor/github.com/prometheus/procfs/xfs/parse.go b/vendor/github.com/prometheus/procfs/xfs/parse.go deleted file mode 100644 index 2bc0ef342..000000000 --- a/vendor/github.com/prometheus/procfs/xfs/parse.go +++ /dev/null @@ -1,330 +0,0 @@ -// Copyright 2017 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package xfs - -import ( - "bufio" - "fmt" - "io" - "strings" - - "github.com/prometheus/procfs/internal/util" -) - -// ParseStats parses a Stats from an input io.Reader, using the format -// found in /proc/fs/xfs/stat. -func ParseStats(r io.Reader) (*Stats, error) { - const ( - // Fields parsed into stats structures. - fieldExtentAlloc = "extent_alloc" - fieldAbt = "abt" - fieldBlkMap = "blk_map" - fieldBmbt = "bmbt" - fieldDir = "dir" - fieldTrans = "trans" - fieldIg = "ig" - fieldLog = "log" - fieldRw = "rw" - fieldAttr = "attr" - fieldIcluster = "icluster" - fieldVnodes = "vnodes" - fieldBuf = "buf" - fieldXpc = "xpc" - - // Unimplemented at this time due to lack of documentation. - fieldPushAil = "push_ail" - fieldXstrat = "xstrat" - fieldAbtb2 = "abtb2" - fieldAbtc2 = "abtc2" - fieldBmbt2 = "bmbt2" - fieldIbt2 = "ibt2" - fieldFibt2 = "fibt2" - fieldQm = "qm" - fieldDebug = "debug" - ) - - var xfss Stats - - s := bufio.NewScanner(r) - for s.Scan() { - // Expect at least a string label and a single integer value, ex: - // - abt 0 - // - rw 1 2 - ss := strings.Fields(string(s.Bytes())) - if len(ss) < 2 { - continue - } - label := ss[0] - - // Extended precision counters are uint64 values. - if label == fieldXpc { - us, err := util.ParseUint64s(ss[1:]) - if err != nil { - return nil, err - } - - xfss.ExtendedPrecision, err = extendedPrecisionStats(us) - if err != nil { - return nil, err - } - - continue - } - - // All other counters are uint32 values. - us, err := util.ParseUint32s(ss[1:]) - if err != nil { - return nil, err - } - - switch label { - case fieldExtentAlloc: - xfss.ExtentAllocation, err = extentAllocationStats(us) - case fieldAbt: - xfss.AllocationBTree, err = btreeStats(us) - case fieldBlkMap: - xfss.BlockMapping, err = blockMappingStats(us) - case fieldBmbt: - xfss.BlockMapBTree, err = btreeStats(us) - case fieldDir: - xfss.DirectoryOperation, err = directoryOperationStats(us) - case fieldTrans: - xfss.Transaction, err = transactionStats(us) - case fieldIg: - xfss.InodeOperation, err = inodeOperationStats(us) - case fieldLog: - xfss.LogOperation, err = logOperationStats(us) - case fieldRw: - xfss.ReadWrite, err = readWriteStats(us) - case fieldAttr: - xfss.AttributeOperation, err = attributeOperationStats(us) - case fieldIcluster: - xfss.InodeClustering, err = inodeClusteringStats(us) - case fieldVnodes: - xfss.Vnode, err = vnodeStats(us) - case fieldBuf: - xfss.Buffer, err = bufferStats(us) - } - if err != nil { - return nil, err - } - } - - return &xfss, s.Err() -} - -// extentAllocationStats builds an ExtentAllocationStats from a slice of uint32s. -func extentAllocationStats(us []uint32) (ExtentAllocationStats, error) { - if l := len(us); l != 4 { - return ExtentAllocationStats{}, fmt.Errorf("incorrect number of values for XFS extent allocation stats: %d", l) - } - - return ExtentAllocationStats{ - ExtentsAllocated: us[0], - BlocksAllocated: us[1], - ExtentsFreed: us[2], - BlocksFreed: us[3], - }, nil -} - -// btreeStats builds a BTreeStats from a slice of uint32s. -func btreeStats(us []uint32) (BTreeStats, error) { - if l := len(us); l != 4 { - return BTreeStats{}, fmt.Errorf("incorrect number of values for XFS btree stats: %d", l) - } - - return BTreeStats{ - Lookups: us[0], - Compares: us[1], - RecordsInserted: us[2], - RecordsDeleted: us[3], - }, nil -} - -// BlockMappingStat builds a BlockMappingStats from a slice of uint32s. -func blockMappingStats(us []uint32) (BlockMappingStats, error) { - if l := len(us); l != 7 { - return BlockMappingStats{}, fmt.Errorf("incorrect number of values for XFS block mapping stats: %d", l) - } - - return BlockMappingStats{ - Reads: us[0], - Writes: us[1], - Unmaps: us[2], - ExtentListInsertions: us[3], - ExtentListDeletions: us[4], - ExtentListLookups: us[5], - ExtentListCompares: us[6], - }, nil -} - -// DirectoryOperationStats builds a DirectoryOperationStats from a slice of uint32s. -func directoryOperationStats(us []uint32) (DirectoryOperationStats, error) { - if l := len(us); l != 4 { - return DirectoryOperationStats{}, fmt.Errorf("incorrect number of values for XFS directory operation stats: %d", l) - } - - return DirectoryOperationStats{ - Lookups: us[0], - Creates: us[1], - Removes: us[2], - Getdents: us[3], - }, nil -} - -// TransactionStats builds a TransactionStats from a slice of uint32s. -func transactionStats(us []uint32) (TransactionStats, error) { - if l := len(us); l != 3 { - return TransactionStats{}, fmt.Errorf("incorrect number of values for XFS transaction stats: %d", l) - } - - return TransactionStats{ - Sync: us[0], - Async: us[1], - Empty: us[2], - }, nil -} - -// InodeOperationStats builds an InodeOperationStats from a slice of uint32s. -func inodeOperationStats(us []uint32) (InodeOperationStats, error) { - if l := len(us); l != 7 { - return InodeOperationStats{}, fmt.Errorf("incorrect number of values for XFS inode operation stats: %d", l) - } - - return InodeOperationStats{ - Attempts: us[0], - Found: us[1], - Recycle: us[2], - Missed: us[3], - Duplicate: us[4], - Reclaims: us[5], - AttributeChange: us[6], - }, nil -} - -// LogOperationStats builds a LogOperationStats from a slice of uint32s. -func logOperationStats(us []uint32) (LogOperationStats, error) { - if l := len(us); l != 5 { - return LogOperationStats{}, fmt.Errorf("incorrect number of values for XFS log operation stats: %d", l) - } - - return LogOperationStats{ - Writes: us[0], - Blocks: us[1], - NoInternalBuffers: us[2], - Force: us[3], - ForceSleep: us[4], - }, nil -} - -// ReadWriteStats builds a ReadWriteStats from a slice of uint32s. -func readWriteStats(us []uint32) (ReadWriteStats, error) { - if l := len(us); l != 2 { - return ReadWriteStats{}, fmt.Errorf("incorrect number of values for XFS read write stats: %d", l) - } - - return ReadWriteStats{ - Read: us[0], - Write: us[1], - }, nil -} - -// AttributeOperationStats builds an AttributeOperationStats from a slice of uint32s. -func attributeOperationStats(us []uint32) (AttributeOperationStats, error) { - if l := len(us); l != 4 { - return AttributeOperationStats{}, fmt.Errorf("incorrect number of values for XFS attribute operation stats: %d", l) - } - - return AttributeOperationStats{ - Get: us[0], - Set: us[1], - Remove: us[2], - List: us[3], - }, nil -} - -// InodeClusteringStats builds an InodeClusteringStats from a slice of uint32s. -func inodeClusteringStats(us []uint32) (InodeClusteringStats, error) { - if l := len(us); l != 3 { - return InodeClusteringStats{}, fmt.Errorf("incorrect number of values for XFS inode clustering stats: %d", l) - } - - return InodeClusteringStats{ - Iflush: us[0], - Flush: us[1], - FlushInode: us[2], - }, nil -} - -// VnodeStats builds a VnodeStats from a slice of uint32s. -func vnodeStats(us []uint32) (VnodeStats, error) { - // The attribute "Free" appears to not be available on older XFS - // stats versions. Therefore, 7 or 8 elements may appear in - // this slice. - l := len(us) - if l != 7 && l != 8 { - return VnodeStats{}, fmt.Errorf("incorrect number of values for XFS vnode stats: %d", l) - } - - s := VnodeStats{ - Active: us[0], - Allocate: us[1], - Get: us[2], - Hold: us[3], - Release: us[4], - Reclaim: us[5], - Remove: us[6], - } - - // Skip adding free, unless it is present. The zero value will - // be used in place of an actual count. - if l == 7 { - return s, nil - } - - s.Free = us[7] - return s, nil -} - -// BufferStats builds a BufferStats from a slice of uint32s. -func bufferStats(us []uint32) (BufferStats, error) { - if l := len(us); l != 9 { - return BufferStats{}, fmt.Errorf("incorrect number of values for XFS buffer stats: %d", l) - } - - return BufferStats{ - Get: us[0], - Create: us[1], - GetLocked: us[2], - GetLockedWaited: us[3], - BusyLocked: us[4], - MissLocked: us[5], - PageRetries: us[6], - PageFound: us[7], - GetRead: us[8], - }, nil -} - -// ExtendedPrecisionStats builds an ExtendedPrecisionStats from a slice of uint32s. -func extendedPrecisionStats(us []uint64) (ExtendedPrecisionStats, error) { - if l := len(us); l != 3 { - return ExtendedPrecisionStats{}, fmt.Errorf("incorrect number of values for XFS extended precision stats: %d", l) - } - - return ExtendedPrecisionStats{ - FlushBytes: us[0], - WriteBytes: us[1], - ReadBytes: us[2], - }, nil -} diff --git a/vendor/github.com/prometheus/procfs/xfs/xfs.go b/vendor/github.com/prometheus/procfs/xfs/xfs.go deleted file mode 100644 index d86794b7c..000000000 --- a/vendor/github.com/prometheus/procfs/xfs/xfs.go +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright 2017 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package xfs provides access to statistics exposed by the XFS filesystem. -package xfs - -// Stats contains XFS filesystem runtime statistics, parsed from -// /proc/fs/xfs/stat. -// -// The names and meanings of each statistic were taken from -// http://xfs.org/index.php/Runtime_Stats and xfs_stats.h in the Linux -// kernel source. Most counters are uint32s (same data types used in -// xfs_stats.h), but some of the "extended precision stats" are uint64s. -type Stats struct { - // The name of the filesystem used to source these statistics. - // If empty, this indicates aggregated statistics for all XFS - // filesystems on the host. - Name string - - ExtentAllocation ExtentAllocationStats - AllocationBTree BTreeStats - BlockMapping BlockMappingStats - BlockMapBTree BTreeStats - DirectoryOperation DirectoryOperationStats - Transaction TransactionStats - InodeOperation InodeOperationStats - LogOperation LogOperationStats - ReadWrite ReadWriteStats - AttributeOperation AttributeOperationStats - InodeClustering InodeClusteringStats - Vnode VnodeStats - Buffer BufferStats - ExtendedPrecision ExtendedPrecisionStats -} - -// ExtentAllocationStats contains statistics regarding XFS extent allocations. -type ExtentAllocationStats struct { - ExtentsAllocated uint32 - BlocksAllocated uint32 - ExtentsFreed uint32 - BlocksFreed uint32 -} - -// BTreeStats contains statistics regarding an XFS internal B-tree. -type BTreeStats struct { - Lookups uint32 - Compares uint32 - RecordsInserted uint32 - RecordsDeleted uint32 -} - -// BlockMappingStats contains statistics regarding XFS block maps. -type BlockMappingStats struct { - Reads uint32 - Writes uint32 - Unmaps uint32 - ExtentListInsertions uint32 - ExtentListDeletions uint32 - ExtentListLookups uint32 - ExtentListCompares uint32 -} - -// DirectoryOperationStats contains statistics regarding XFS directory entries. -type DirectoryOperationStats struct { - Lookups uint32 - Creates uint32 - Removes uint32 - Getdents uint32 -} - -// TransactionStats contains statistics regarding XFS metadata transactions. -type TransactionStats struct { - Sync uint32 - Async uint32 - Empty uint32 -} - -// InodeOperationStats contains statistics regarding XFS inode operations. -type InodeOperationStats struct { - Attempts uint32 - Found uint32 - Recycle uint32 - Missed uint32 - Duplicate uint32 - Reclaims uint32 - AttributeChange uint32 -} - -// LogOperationStats contains statistics regarding the XFS log buffer. -type LogOperationStats struct { - Writes uint32 - Blocks uint32 - NoInternalBuffers uint32 - Force uint32 - ForceSleep uint32 -} - -// ReadWriteStats contains statistics regarding the number of read and write -// system calls for XFS filesystems. -type ReadWriteStats struct { - Read uint32 - Write uint32 -} - -// AttributeOperationStats contains statistics regarding manipulation of -// XFS extended file attributes. -type AttributeOperationStats struct { - Get uint32 - Set uint32 - Remove uint32 - List uint32 -} - -// InodeClusteringStats contains statistics regarding XFS inode clustering -// operations. -type InodeClusteringStats struct { - Iflush uint32 - Flush uint32 - FlushInode uint32 -} - -// VnodeStats contains statistics regarding XFS vnode operations. -type VnodeStats struct { - Active uint32 - Allocate uint32 - Get uint32 - Hold uint32 - Release uint32 - Reclaim uint32 - Remove uint32 - Free uint32 -} - -// BufferStats contains statistics regarding XFS read/write I/O buffers. -type BufferStats struct { - Get uint32 - Create uint32 - GetLocked uint32 - GetLockedWaited uint32 - BusyLocked uint32 - MissLocked uint32 - PageRetries uint32 - PageFound uint32 - GetRead uint32 -} - -// ExtendedPrecisionStats contains high precision counters used to track the -// total number of bytes read, written, or flushed, during XFS operations. -type ExtendedPrecisionStats struct { - FlushBytes uint64 - WriteBytes uint64 - ReadBytes uint64 -} diff --git a/vendor/github.com/prometheus/procfs/zoneinfo.go b/vendor/github.com/prometheus/procfs/zoneinfo.go new file mode 100644 index 000000000..e941503d5 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/zoneinfo.go @@ -0,0 +1,196 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !windows + +package procfs + +import ( + "bytes" + "fmt" + "io/ioutil" + "regexp" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// Zoneinfo holds info parsed from /proc/zoneinfo. +type Zoneinfo struct { + Node string + Zone string + NrFreePages *int64 + Min *int64 + Low *int64 + High *int64 + Scanned *int64 + Spanned *int64 + Present *int64 + Managed *int64 + NrActiveAnon *int64 + NrInactiveAnon *int64 + NrIsolatedAnon *int64 + NrAnonPages *int64 + NrAnonTransparentHugepages *int64 + NrActiveFile *int64 + NrInactiveFile *int64 + NrIsolatedFile *int64 + NrFilePages *int64 + NrSlabReclaimable *int64 + NrSlabUnreclaimable *int64 + NrMlockStack *int64 + NrKernelStack *int64 + NrMapped *int64 + NrDirty *int64 + NrWriteback *int64 + NrUnevictable *int64 + NrShmem *int64 + NrDirtied *int64 + NrWritten *int64 + NumaHit *int64 + NumaMiss *int64 + NumaForeign *int64 + NumaInterleave *int64 + NumaLocal *int64 + NumaOther *int64 + Protection []*int64 +} + +var nodeZoneRE = regexp.MustCompile(`(\d+), zone\s+(\w+)`) + +// Zoneinfo parses an zoneinfo-file (/proc/zoneinfo) and returns a slice of +// structs containing the relevant info. More information available here: +// https://www.kernel.org/doc/Documentation/sysctl/vm.txt +func (fs FS) Zoneinfo() ([]Zoneinfo, error) { + data, err := ioutil.ReadFile(fs.proc.Path("zoneinfo")) + if err != nil { + return nil, fmt.Errorf("error reading zoneinfo %s: %s", fs.proc.Path("zoneinfo"), err) + } + zoneinfo, err := parseZoneinfo(data) + if err != nil { + return nil, fmt.Errorf("error parsing zoneinfo %s: %s", fs.proc.Path("zoneinfo"), err) + } + return zoneinfo, nil +} + +func parseZoneinfo(zoneinfoData []byte) ([]Zoneinfo, error) { + + zoneinfo := []Zoneinfo{} + + zoneinfoBlocks := bytes.Split(zoneinfoData, []byte("\nNode")) + for _, block := range zoneinfoBlocks { + var zoneinfoElement Zoneinfo + lines := strings.Split(string(block), "\n") + for _, line := range lines { + + if nodeZone := nodeZoneRE.FindStringSubmatch(line); nodeZone != nil { + zoneinfoElement.Node = nodeZone[1] + zoneinfoElement.Zone = nodeZone[2] + continue + } + if strings.HasPrefix(strings.TrimSpace(line), "per-node stats") { + zoneinfoElement.Zone = "" + continue + } + parts := strings.Fields(strings.TrimSpace(line)) + if len(parts) < 2 { + continue + } + vp := util.NewValueParser(parts[1]) + switch parts[0] { + case "nr_free_pages": + zoneinfoElement.NrFreePages = vp.PInt64() + case "min": + zoneinfoElement.Min = vp.PInt64() + case "low": + zoneinfoElement.Low = vp.PInt64() + case "high": + zoneinfoElement.High = vp.PInt64() + case "scanned": + zoneinfoElement.Scanned = vp.PInt64() + case "spanned": + zoneinfoElement.Spanned = vp.PInt64() + case "present": + zoneinfoElement.Present = vp.PInt64() + case "managed": + zoneinfoElement.Managed = vp.PInt64() + case "nr_active_anon": + zoneinfoElement.NrActiveAnon = vp.PInt64() + case "nr_inactive_anon": + zoneinfoElement.NrInactiveAnon = vp.PInt64() + case "nr_isolated_anon": + zoneinfoElement.NrIsolatedAnon = vp.PInt64() + case "nr_anon_pages": + zoneinfoElement.NrAnonPages = vp.PInt64() + case "nr_anon_transparent_hugepages": + zoneinfoElement.NrAnonTransparentHugepages = vp.PInt64() + case "nr_active_file": + zoneinfoElement.NrActiveFile = vp.PInt64() + case "nr_inactive_file": + zoneinfoElement.NrInactiveFile = vp.PInt64() + case "nr_isolated_file": + zoneinfoElement.NrIsolatedFile = vp.PInt64() + case "nr_file_pages": + zoneinfoElement.NrFilePages = vp.PInt64() + case "nr_slab_reclaimable": + zoneinfoElement.NrSlabReclaimable = vp.PInt64() + case "nr_slab_unreclaimable": + zoneinfoElement.NrSlabUnreclaimable = vp.PInt64() + case "nr_mlock_stack": + zoneinfoElement.NrMlockStack = vp.PInt64() + case "nr_kernel_stack": + zoneinfoElement.NrKernelStack = vp.PInt64() + case "nr_mapped": + zoneinfoElement.NrMapped = vp.PInt64() + case "nr_dirty": + zoneinfoElement.NrDirty = vp.PInt64() + case "nr_writeback": + zoneinfoElement.NrWriteback = vp.PInt64() + case "nr_unevictable": + zoneinfoElement.NrUnevictable = vp.PInt64() + case "nr_shmem": + zoneinfoElement.NrShmem = vp.PInt64() + case "nr_dirtied": + zoneinfoElement.NrDirtied = vp.PInt64() + case "nr_written": + zoneinfoElement.NrWritten = vp.PInt64() + case "numa_hit": + zoneinfoElement.NumaHit = vp.PInt64() + case "numa_miss": + zoneinfoElement.NumaMiss = vp.PInt64() + case "numa_foreign": + zoneinfoElement.NumaForeign = vp.PInt64() + case "numa_interleave": + zoneinfoElement.NumaInterleave = vp.PInt64() + case "numa_local": + zoneinfoElement.NumaLocal = vp.PInt64() + case "numa_other": + zoneinfoElement.NumaOther = vp.PInt64() + case "protection:": + protectionParts := strings.Split(line, ":") + protectionValues := strings.Replace(protectionParts[1], "(", "", 1) + protectionValues = strings.Replace(protectionValues, ")", "", 1) + protectionValues = strings.TrimSpace(protectionValues) + protectionStringMap := strings.Split(protectionValues, ", ") + val, err := util.ParsePInt64s(protectionStringMap) + if err == nil { + zoneinfoElement.Protection = val + } + } + + } + + zoneinfo = append(zoneinfo, zoneinfoElement) + } + return zoneinfo, nil +} diff --git a/vendor/github.com/rs/xid/.travis.yml b/vendor/github.com/rs/xid/.travis.yml index c210a48c8..b37da1594 100644 --- a/vendor/github.com/rs/xid/.travis.yml +++ b/vendor/github.com/rs/xid/.travis.yml @@ -1,6 +1,6 @@ language: go go: -- "1.5" +- "1.9" - "1.10" - "master" matrix: diff --git a/vendor/github.com/rs/xid/hostid_darwin.go b/vendor/github.com/rs/xid/hostid_darwin.go index abd068401..08351ff72 100644 --- a/vendor/github.com/rs/xid/hostid_darwin.go +++ b/vendor/github.com/rs/xid/hostid_darwin.go @@ -2,8 +2,8 @@ package xid -import "golang.org/x/sys/unix" +import "syscall" func readPlatformMachineID() (string, error) { - return unix.Sysctl("kern.uuid") + return syscall.Sysctl("kern.uuid") } diff --git a/vendor/github.com/rs/xid/hostid_freebsd.go b/vendor/github.com/rs/xid/hostid_freebsd.go index df2bd13c5..be25a039e 100644 --- a/vendor/github.com/rs/xid/hostid_freebsd.go +++ b/vendor/github.com/rs/xid/hostid_freebsd.go @@ -2,8 +2,8 @@ package xid -import "golang.org/x/sys/unix" +import "syscall" func readPlatformMachineID() (string, error) { - return unix.Sysctl("kern.hostuuid") + return syscall.Sysctl("kern.hostuuid") } diff --git a/vendor/github.com/rs/xid/hostid_windows.go b/vendor/github.com/rs/xid/hostid_windows.go index b8e1c2cbd..ec2593ee3 100644 --- a/vendor/github.com/rs/xid/hostid_windows.go +++ b/vendor/github.com/rs/xid/hostid_windows.go @@ -4,32 +4,31 @@ package xid import ( "fmt" + "syscall" "unsafe" - - "golang.org/x/sys/windows" ) func readPlatformMachineID() (string, error) { - // source: https://github.com/shirou/gopsutil/blob/master/host/host_windows.go - var h windows.Handle - err := windows.RegOpenKeyEx(windows.HKEY_LOCAL_MACHINE, windows.StringToUTF16Ptr(`SOFTWARE\Microsoft\Cryptography`), 0, windows.KEY_READ|windows.KEY_WOW64_64KEY, &h) + // source: https://github.com/shirou/gopsutil/blob/master/host/host_syscall.go + var h syscall.Handle + err := syscall.RegOpenKeyEx(syscall.HKEY_LOCAL_MACHINE, syscall.StringToUTF16Ptr(`SOFTWARE\Microsoft\Cryptography`), 0, syscall.KEY_READ|syscall.KEY_WOW64_64KEY, &h) if err != nil { return "", err } - defer windows.RegCloseKey(h) + defer syscall.RegCloseKey(h) - const windowsRegBufLen = 74 // len(`{`) + len(`abcdefgh-1234-456789012-123345456671` * 2) + len(`}`) // 2 == bytes/UTF16 + const syscallRegBufLen = 74 // len(`{`) + len(`abcdefgh-1234-456789012-123345456671` * 2) + len(`}`) // 2 == bytes/UTF16 const uuidLen = 36 - var regBuf [windowsRegBufLen]uint16 - bufLen := uint32(windowsRegBufLen) + var regBuf [syscallRegBufLen]uint16 + bufLen := uint32(syscallRegBufLen) var valType uint32 - err = windows.RegQueryValueEx(h, windows.StringToUTF16Ptr(`MachineGuid`), nil, &valType, (*byte)(unsafe.Pointer(®Buf[0])), &bufLen) + err = syscall.RegQueryValueEx(h, syscall.StringToUTF16Ptr(`MachineGuid`), nil, &valType, (*byte)(unsafe.Pointer(®Buf[0])), &bufLen) if err != nil { return "", err } - hostID := windows.UTF16ToString(regBuf[:]) + hostID := syscall.UTF16ToString(regBuf[:]) hostIDLen := len(hostID) if hostIDLen != uuidLen { return "", fmt.Errorf("HostID incorrect: %q\n", hostID) diff --git a/vendor/github.com/rs/xid/id.go b/vendor/github.com/rs/xid/id.go index 51b8d7fae..466faf262 100644 --- a/vendor/github.com/rs/xid/id.go +++ b/vendor/github.com/rs/xid/id.go @@ -42,6 +42,7 @@ package xid import ( + "bytes" "crypto/md5" "crypto/rand" "database/sql/driver" @@ -51,10 +52,9 @@ import ( "hash/crc32" "io/ioutil" "os" + "sort" "sync/atomic" "time" - "bytes" - "sort" ) // Code inspired from mgo/bson ObjectId @@ -143,9 +143,14 @@ func randInt() uint32 { // New generates a globally unique ID func New() ID { + return NewWithTime(time.Now()) +} + +// NewWithTime generates a globally unique ID with the passed in time +func NewWithTime(t time.Time) ID { var id ID // Timestamp, 4 bytes, big endian - binary.BigEndian.PutUint32(id[:], uint32(time.Now().Unix())) + binary.BigEndian.PutUint32(id[:], uint32(t.Unix())) // Machine, first 3 bytes of md5(hostname) id[4] = machineID[0] id[5] = machineID[1] @@ -339,7 +344,6 @@ func (id ID) Compare(other ID) int { return bytes.Compare(id[:], other[:]) } - type sorter []ID func (s sorter) Len() int { diff --git a/vendor/gopkg.in/russross/blackfriday.v2/.gitignore b/vendor/github.com/russross/blackfriday/v2/.gitignore similarity index 100% rename from vendor/gopkg.in/russross/blackfriday.v2/.gitignore rename to vendor/github.com/russross/blackfriday/v2/.gitignore diff --git a/vendor/gopkg.in/russross/blackfriday.v2/.travis.yml b/vendor/github.com/russross/blackfriday/v2/.travis.yml similarity index 100% rename from vendor/gopkg.in/russross/blackfriday.v2/.travis.yml rename to vendor/github.com/russross/blackfriday/v2/.travis.yml diff --git a/vendor/gopkg.in/russross/blackfriday.v2/LICENSE.txt b/vendor/github.com/russross/blackfriday/v2/LICENSE.txt similarity index 100% rename from vendor/gopkg.in/russross/blackfriday.v2/LICENSE.txt rename to vendor/github.com/russross/blackfriday/v2/LICENSE.txt diff --git a/vendor/gopkg.in/russross/blackfriday.v2/README.md b/vendor/github.com/russross/blackfriday/v2/README.md similarity index 100% rename from vendor/gopkg.in/russross/blackfriday.v2/README.md rename to vendor/github.com/russross/blackfriday/v2/README.md diff --git a/vendor/gopkg.in/russross/blackfriday.v2/block.go b/vendor/github.com/russross/blackfriday/v2/block.go similarity index 100% rename from vendor/gopkg.in/russross/blackfriday.v2/block.go rename to vendor/github.com/russross/blackfriday/v2/block.go diff --git a/vendor/gopkg.in/russross/blackfriday.v2/doc.go b/vendor/github.com/russross/blackfriday/v2/doc.go similarity index 100% rename from vendor/gopkg.in/russross/blackfriday.v2/doc.go rename to vendor/github.com/russross/blackfriday/v2/doc.go diff --git a/vendor/gopkg.in/russross/blackfriday.v2/esc.go b/vendor/github.com/russross/blackfriday/v2/esc.go similarity index 100% rename from vendor/gopkg.in/russross/blackfriday.v2/esc.go rename to vendor/github.com/russross/blackfriday/v2/esc.go diff --git a/vendor/gopkg.in/russross/blackfriday.v2/go.mod b/vendor/github.com/russross/blackfriday/v2/go.mod similarity index 100% rename from vendor/gopkg.in/russross/blackfriday.v2/go.mod rename to vendor/github.com/russross/blackfriday/v2/go.mod diff --git a/vendor/gopkg.in/russross/blackfriday.v2/html.go b/vendor/github.com/russross/blackfriday/v2/html.go similarity index 100% rename from vendor/gopkg.in/russross/blackfriday.v2/html.go rename to vendor/github.com/russross/blackfriday/v2/html.go diff --git a/vendor/gopkg.in/russross/blackfriday.v2/inline.go b/vendor/github.com/russross/blackfriday/v2/inline.go similarity index 100% rename from vendor/gopkg.in/russross/blackfriday.v2/inline.go rename to vendor/github.com/russross/blackfriday/v2/inline.go diff --git a/vendor/gopkg.in/russross/blackfriday.v2/markdown.go b/vendor/github.com/russross/blackfriday/v2/markdown.go similarity index 100% rename from vendor/gopkg.in/russross/blackfriday.v2/markdown.go rename to vendor/github.com/russross/blackfriday/v2/markdown.go diff --git a/vendor/gopkg.in/russross/blackfriday.v2/node.go b/vendor/github.com/russross/blackfriday/v2/node.go similarity index 100% rename from vendor/gopkg.in/russross/blackfriday.v2/node.go rename to vendor/github.com/russross/blackfriday/v2/node.go diff --git a/vendor/gopkg.in/russross/blackfriday.v2/smartypants.go b/vendor/github.com/russross/blackfriday/v2/smartypants.go similarity index 100% rename from vendor/gopkg.in/russross/blackfriday.v2/smartypants.go rename to vendor/github.com/russross/blackfriday/v2/smartypants.go diff --git a/vendor/github.com/securego/gosec/.gitignore b/vendor/github.com/securego/gosec/.gitignore deleted file mode 100644 index f282cda24..000000000 --- a/vendor/github.com/securego/gosec/.gitignore +++ /dev/null @@ -1,35 +0,0 @@ -# transient files -/image - -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so -*.swp -/gosec - -# Folders -_obj -_test -vendor -dist - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe -*.test -*.prof - -.DS_Store - -.vscode diff --git a/vendor/github.com/securego/gosec/.goreleaser.yml b/vendor/github.com/securego/gosec/.goreleaser.yml deleted file mode 100644 index 9951a9656..000000000 --- a/vendor/github.com/securego/gosec/.goreleaser.yml +++ /dev/null @@ -1,25 +0,0 @@ ---- -project_name: gosec - -release: - github: - owner: securego - name: gosec - -builds: - - main : ./cmd/gosec/ - binary: gosec - goos: - - darwin - - linux - - windows - goarch: - - amd64 - ldflags: -X main.Version={{.Version}} -X main.GitTag={{.Tag}} -X main.BuildDate={{.Date}} - env: - - CGO_ENABLED=0 - -archive: - files: - - README.md - - LICENSE.txt diff --git a/vendor/github.com/securego/gosec/.travis.yml b/vendor/github.com/securego/gosec/.travis.yml deleted file mode 100644 index 26bb6d307..000000000 --- a/vendor/github.com/securego/gosec/.travis.yml +++ /dev/null @@ -1,19 +0,0 @@ -language: go - -go: - - "1.11.x" - - "1.12.x" - - "1.13.x" - - tip - -install: - - go get -u golang.org/x/crypto/ssh - - go get -u github.com/lib/pq - - export PATH=$PATH:$HOME/gopath/bin - - export GO111MODULE=on - -script: make test - -after_success: - - make test-coverage - - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/securego/gosec/Dockerfile b/vendor/github.com/securego/gosec/Dockerfile deleted file mode 100644 index 595da79a8..000000000 --- a/vendor/github.com/securego/gosec/Dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -ARG GO_VERSION=1.13 -FROM golang:${GO_VERSION}-alpine AS builder -RUN apk add --update --no-cache ca-certificates make git curl -RUN mkdir -p /build -WORKDIR /build -COPY . /build/ -RUN go mod download -RUN make build-linux - -FROM golang:${GO_VERSION}-alpine -RUN apk add --update --no-cache ca-certificates git -ENV GO111MODULE on -COPY --from=builder /build/gosec /bin/gosec -ENTRYPOINT ["/bin/gosec"] diff --git a/vendor/github.com/securego/gosec/LICENSE.txt b/vendor/github.com/securego/gosec/LICENSE.txt deleted file mode 100644 index 1756c7821..000000000 --- a/vendor/github.com/securego/gosec/LICENSE.txt +++ /dev/null @@ -1,154 +0,0 @@ -Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and -distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright -owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities -that control, are controlled by, or are under common control with that entity. -For the purposes of this definition, "control" means (i) the power, direct or -indirect, to cause the direction or management of such entity, whether by -contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the -outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising -permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including -but not limited to software source code, documentation source, and configuration -files. - -"Object" form shall mean any form resulting from mechanical transformation or -translation of a Source form, including but not limited to compiled object code, -generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made -available under the License, as indicated by a copyright notice that is included -in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that -is based on (or derived from) the Work and for which the editorial revisions, -annotations, elaborations, or other modifications represent, as a whole, an -original work of authorship. For the purposes of this License, Derivative Works -shall not include works that remain separable from, or merely link (or bind by -name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version -of the Work and any modifications or additions to that Work or Derivative Works -thereof, that is intentionally submitted to Licensor for inclusion in the Work -by the copyright owner or by an individual or Legal Entity authorized to submit -on behalf of the copyright owner. For the purposes of this definition, -"submitted" means any form of electronic, verbal, or written communication sent -to the Licensor or its representatives, including but not limited to -communication on electronic mailing lists, source code control systems, and -issue tracking systems that are managed by, or on behalf of, the Licensor for -the purpose of discussing and improving the Work, but excluding communication -that is conspicuously marked or otherwise designated in writing by the copyright -owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf -of whom a Contribution has been received by Licensor and subsequently -incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this -License, each Contributor hereby grants to You a perpetual, worldwide, -non-exclusive, no-charge, royalty-free, irrevocable copyright license to -reproduce, prepare Derivative Works of, publicly display, publicly perform, -sublicense, and distribute the Work and such Derivative Works in Source or -Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, -each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, -no-charge, royalty-free, irrevocable (except as stated in this section) patent -license to make, have made, use, offer to sell, sell, import, and otherwise -transfer the Work, where such license applies only to those patent claims -licensable by such Contributor that are necessarily infringed by their -Contribution(s) alone or by combination of their Contribution(s) with the Work -to which such Contribution(s) was submitted. If You institute patent litigation -against any entity (including a cross-claim or counterclaim in a lawsuit) -alleging that the Work or a Contribution incorporated within the Work -constitutes direct or contributory patent infringement, then any patent licenses -granted to You under this License for that Work shall terminate as of the date -such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or -Derivative Works thereof in any medium, with or without modifications, and in -Source or Object form, provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of -this License; and You must cause any modified files to carry prominent notices -stating that You changed the files; and You must retain, in the Source form of -any Derivative Works that You distribute, all copyright, patent, trademark, and -attribution notices from the Source form of the Work, excluding those notices -that do not pertain to any part of the Derivative Works; and If the Work -includes a "NOTICE" text file as part of its distribution, then any Derivative -Works that You distribute must include a readable copy of the attribution -notices contained within such NOTICE file, excluding those notices that do not -pertain to any part of the Derivative Works, in at least one of the following -places: within a NOTICE text file distributed as part of the Derivative Works; -within the Source form or documentation, if provided along with the Derivative -Works; or, within a display generated by the Derivative Works, if and wherever -such third-party notices normally appear. The contents of the NOTICE file are -for informational purposes only and do not modify the License. You may add Your -own attribution notices within Derivative Works that You distribute, alongside -or as an addendum to the NOTICE text from the Work, provided that such -additional attribution notices cannot be construed as modifying the License. - -You may add Your own copyright statement to Your modifications and may provide -additional or different license terms and conditions for use, reproduction, or -distribution of Your modifications, or for any such Derivative Works as a whole, -provided Your use, reproduction, and distribution of the Work otherwise complies -with the conditions stated in this License. 5. Submission of Contributions. -Unless You explicitly state otherwise, any Contribution intentionally submitted -for inclusion in the Work by You to the Licensor shall be under the terms and -conditions of this License, without any additional terms or conditions. -Notwithstanding the above, nothing herein shall supersede or modify the terms of -any separate license agreement you may have executed with Licensor regarding -such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, -trademarks, service marks, or product names of the Licensor, except as required -for reasonable and customary use in describing the origin of the Work and -reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in -writing, Licensor provides the Work (and each Contributor provides its -Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied, including, without limitation, any warranties -or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A -PARTICULAR PURPOSE. You are solely responsible for determining the -appropriateness of using or redistributing the Work and assume any risks -associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in -tort (including negligence), contract, or otherwise, unless required by -applicable law (such as deliberate and grossly negligent acts) or agreed to in -writing, shall any Contributor be liable to You for damages, including any -direct, indirect, special, incidental, or consequential damages of any character -arising as a result of this License or out of the use or inability to use the -Work (including but not limited to damages for loss of goodwill, work stoppage, -computer failure or malfunction, or any and all other commercial damages or -losses), even if such Contributor has been advised of the possibility of such -damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or -Derivative Works thereof, You may choose to offer, and charge a fee for, -acceptance of support, warranty, indemnity, or other liability obligations -and/or rights consistent with this License. However, in accepting such -obligations, You may act only on Your own behalf and on Your sole -responsibility, not on behalf of any other Contributor, and only if You agree to -indemnify, defend, and hold each Contributor harmless for any liability incurred -by, or claims asserted against, such Contributor by reason of your accepting any -such warranty or additional liability. - -END OF TERMS AND CONDITIONS diff --git a/vendor/github.com/securego/gosec/Makefile b/vendor/github.com/securego/gosec/Makefile deleted file mode 100644 index d9886e981..000000000 --- a/vendor/github.com/securego/gosec/Makefile +++ /dev/null @@ -1,62 +0,0 @@ -GIT_TAG?= $(shell git describe --always --tags) -BIN = gosec -FMT_CMD = $(gofmt -s -l -w $(find . -type f -name '*.go' -not -path './vendor/*') | tee /dev/stderr) -IMAGE_REPO = securego -BUILDFLAGS := '-w -s' -CGO_ENABLED = 0 -GO := GO111MODULE=on go -GO_NOMOD :=GO111MODULE=off go - -default: - $(MAKE) build - -test: build fmt lint sec - $(GO_NOMOD) get -u github.com/onsi/ginkgo/ginkgo - ginkgo -r -v - -fmt: - @echo "FORMATTING" - @FORMATTED=`$(GO) fmt ./...` - @([[ ! -z "$(FORMATTED)" ]] && printf "Fixed unformatted files:\n$(FORMATTED)") || true - -lint: - @echo "LINTING" - $(GO_NOMOD) get -u golang.org/x/lint/golint - golint -set_exit_status ./... - @echo "VETTING" - $(GO) vet ./... - -sec: - @echo "SECURITY SCANNING" - ./$(BIN) ./... - -test-coverage: - go test -race -coverprofile=coverage.txt -covermode=atomic - -build: - go build -o $(BIN) ./cmd/gosec/ - -clean: - rm -rf build vendor dist - rm -f release image $(BIN) - -release: - @echo "Releasing the gosec binary..." - goreleaser release - -build-linux: - CGO_ENABLED=$(CGO_ENABLED) GOOS=linux GOARCH=amd64 go build -ldflags $(BUILDFLAGS) -o $(BIN) ./cmd/gosec/ - -image: - @echo "Building the Docker image..." - docker build -t $(IMAGE_REPO)/$(BIN):$(GIT_TAG) . - docker tag $(IMAGE_REPO)/$(BIN):$(GIT_TAG) $(IMAGE_REPO)/$(BIN):latest - touch image - -image-push: image - @echo "Pushing the Docker image..." - docker push $(IMAGE_REPO)/$(BIN):$(GIT_TAG) - docker push $(IMAGE_REPO)/$(BIN):latest - -.PHONY: test build clean release image image-push - diff --git a/vendor/github.com/securego/gosec/README.md b/vendor/github.com/securego/gosec/README.md deleted file mode 100644 index ea39ad37a..000000000 --- a/vendor/github.com/securego/gosec/README.md +++ /dev/null @@ -1,287 +0,0 @@ - -# gosec - Golang Security Checker - -Inspects source code for security problems by scanning the Go AST. - - - -## License - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License [here](http://www.apache.org/licenses/LICENSE-2.0). - -## Project status - -[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/3218/badge)](https://bestpractices.coreinfrastructure.org/projects/3218) -[![Build Status](https://travis-ci.org/securego/gosec.svg?branch=master)](https://travis-ci.org/securego/gosec) -[![Coverage Status](https://codecov.io/gh/securego/gosec/branch/master/graph/badge.svg)](https://codecov.io/gh/securego/gosec) -[![GoReport](https://goreportcard.com/badge/github.com/securego/gosec)](https://goreportcard.com/badge/github.com/securego/gosec) -[![GoDoc](https://godoc.org/github.com/securego/gosec?status.svg)](https://godoc.org/github.com/securego/gosec) -[![Docs](https://readthedocs.org/projects/docs/badge/?version=latest)](https://securego.io/) -[![Downloads](https://img.shields.io/github/downloads/securego/gosec/total.svg)](https://github.com/securego/gosec/releases) -[![Docker Pulls](https://img.shields.io/docker/pulls/securego/gosec.svg)](https://hub.docker.com/r/securego/gosec/tags) -[![Slack](http://securego.herokuapp.com/badge.svg)](http://securego.herokuapp.com) - -## Install - -### CI Installation - -```bash -# binary will be $GOPATH/bin/gosec -curl -sfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | sh -s -- -b $GOPATH/bin vX.Y.Z - -# or install it into ./bin/ -curl -sfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | sh -s vX.Y.Z - -# In alpine linux (as it does not come with curl by default) -wget -O - -q https://raw.githubusercontent.com/securego/gosec/master/install.sh | sh -s vX.Y.Z - -# If you want to use the checksums provided on the "Releases" page -# then you will have to download a tar.gz file for your operating system instead of a binary file -wget https://github.com/securego/gosec/releases/download/vX.Y.Z/gosec_vX.Y.Z_OS.tar.gz - -# The file will be in the current folder where you run the command -# and you can check the checksum like this -echo " gosec_vX.Y.Z_OS.tar.gz" | sha256sum -c - - -gosec --help -``` - -### Local Installation - -```bash -go get github.com/securego/gosec/cmd/gosec -``` - -## Usage - -Gosec can be configured to only run a subset of rules, to exclude certain file -paths, and produce reports in different formats. By default all rules will be -run against the supplied input files. To recursively scan from the current -directory you can supply './...' as the input argument. - - -### Available rules - -- G101: Look for hard coded credentials -- G102: Bind to all interfaces -- G103: Audit the use of unsafe block -- G104: Audit errors not checked -- G106: Audit the use of ssh.InsecureIgnoreHostKey -- G107: Url provided to HTTP request as taint input -- G108: Profiling endpoint automatically exposed on /debug/pprof -- G201: SQL query construction using format string -- G202: SQL query construction using string concatenation -- G203: Use of unescaped data in HTML templates -- G204: Audit use of command execution -- G301: Poor file permissions used when creating a directory -- G302: Poor file permissions used with chmod -- G303: Creating tempfile using a predictable path -- G304: File path provided as taint input -- G305: File traversal when extracting zip archive -- G401: Detect the usage of DES, RC4, MD5 or SHA1 -- G402: Look for bad TLS connection settings -- G403: Ensure minimum RSA key length of 2048 bits -- G404: Insecure random number source (rand) -- G501: Import blacklist: crypto/md5 -- G502: Import blacklist: crypto/des -- G503: Import blacklist: crypto/rc4 -- G504: Import blacklist: net/http/cgi -- G505: Import blacklist: crypto/sha1 - -### Retired rules - -- G105: Audit the use of math/big.Int.Exp - [CVE is fixed](https://github.com/golang/go/issues/15184) - -### Selecting rules - -By default gosec will run all rules against the supplied file paths. It is however possible to select a subset of rules to run via the '-include=' flag, -or to specify a set of rules to explicitly exclude using the '-exclude=' flag. - -```bash -# Run a specific set of rules -$ gosec -include=G101,G203,G401 ./... - -# Run everything except for rule G303 -$ gosec -exclude=G303 ./... -``` - -### Configuration - -A number of global settings can be provided in a configuration file as follows: - -```JSON -{ - "global": { - "nosec": "enabled", - "audit": "enabled" - } -} -``` - -- `nosec`: this setting will overwrite all `#nosec` directives defined throughout the code base -- `audit`: runs in audit mode which enables addition checks that for normal code analysis might be too nosy - -```bash -# Run with a global configuration file -$ gosec -conf config.json . -``` -Also some rules accept configuration. For instance on rule `G104`, it is possible to define packages along with a list -of functions which will be skipped when auditing the not checked errors: - -```JSON -{ - "G104": { - "io/ioutil": ["WriteFile"] - } -} -``` - -### Dependencies - -gosec will fetch automatically the dependencies of the code which is being analyzed when go modules are turned on (e.g.` GO111MODULE=on`). If this is not the case, -the dependencies need to be explicitly downloaded by running the `go get -d` command before the scan. - -### Excluding test files and folders - -gosec will ignore test files across all packages and any dependencies in your vendor directory. - -The scanning of test files can be enabled with the following flag: - -```bash - -gosec -tests ./... -``` - -Also additional folders can be excluded as follows: - -```bash - gosec -exclude-dir=rules -exclude-dir=cmd ./... -``` - -### Annotating code - -As with all automated detection tools there will be cases of false positives. In cases where gosec reports a failure that has been manually verified as being safe it is possible to annotate the code with a '#nosec' comment. - -The annotation causes gosec to stop processing any further nodes within the -AST so can apply to a whole block or more granularly to a single expression. - -```go - -import "md5" // #nosec - - -func main(){ - - /* #nosec */ - if x > y { - h := md5.New() // this will also be ignored - } - -} - -``` - -When a specific false positive has been identified and verified as safe, you may wish to suppress only that single rule (or a specific set of rules) within a section of code, while continuing to scan for other problems. To do this, you can list the rule(s) to be suppressed within the `#nosec` annotation, e.g: `/* #nosec G401 */` or `// #nosec G201 G202 G203 ` - -In some cases you may also want to revisit places where #nosec annotations -have been used. To run the scanner and ignore any #nosec annotations you -can do the following: - -```bash -gosec -nosec=true ./... -``` - -### Build tags - -gosec is able to pass your [Go build tags](https://golang.org/pkg/go/build/) to the analyzer. -They can be provided as a comma separated list as follows: - -```bash -gosec -tag debug,ignore ./... -``` - -### Output formats - -gosec currently supports text, json, yaml, csv, sonarqube and JUnit XML output formats. By default -results will be reported to stdout, but can also be written to an output -file. The output format is controlled by the '-fmt' flag, and the output file is controlled by the '-out' flag as follows: - -```bash -# Write output in json format to results.json -$ gosec -fmt=json -out=results.json *.go -``` - -## Development - -### Build - -```bash -make -``` - -### Tests - -```bash -make test -``` - -### Release Build - -Make sure you have installed the [goreleaser](https://github.com/goreleaser/goreleaser) tool and then you can release gosec as follows: - -```bash -git tag v1.0.0 -export GITHUB_TOKEN= -make release -``` - -The released version of the tool is available in the `dist` folder. The build information should be displayed in the usage text. - -```bash -./dist/darwin_amd64/gosec -h -gosec - Golang security checker - -gosec analyzes Go source code to look for common programming mistakes that -can lead to security problems. - -VERSION: 1.0.0 -GIT TAG: v1.0.0 -BUILD DATE: 2018-04-27T12:41:38Z -``` - -Note that all released archives are also uploaded to GitHub. - -### Docker image - -You can build the docker image as follows: - -```bash -make image -``` - -You can run the `gosec` tool in a container against your local Go project. You just have to mount the project -into a volume as follow: - -```bash -docker run -it -v /:/ securego/gosec //... -``` - -### Generate TLS rule - -The configuration of TLS rule can be generated from [Mozilla's TLS ciphers recommendation](https://statics.tls.security.mozilla.org/server-side-tls-conf.json). - -First you need to install the generator tool: - -```bash -go get github.com/securego/gosec/cmd/tlsconfig/... -``` - -You can invoke now the `go generate` in the root of the project: - -```bash -go generate ./... -``` - -This will generate the `rules/tls_config.go` file with will contain the current ciphers recommendation from Mozilla. diff --git a/vendor/github.com/securego/gosec/analyzer.go b/vendor/github.com/securego/gosec/analyzer.go deleted file mode 100644 index 20f08d5de..000000000 --- a/vendor/github.com/securego/gosec/analyzer.go +++ /dev/null @@ -1,361 +0,0 @@ -// (c) Copyright 2016 Hewlett Packard Enterprise Development LP -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package gosec holds the central scanning logic used by gosec security scanner -package gosec - -import ( - "fmt" - "go/ast" - "go/build" - "go/token" - "go/types" - "log" - "os" - "path" - "reflect" - "regexp" - "strconv" - - "strings" - - "golang.org/x/tools/go/packages" -) - -// LoadMode controls the amount of details to return when loading the packages -const LoadMode = packages.NeedName | - packages.NeedFiles | - packages.NeedCompiledGoFiles | - packages.NeedImports | - packages.NeedTypes | - packages.NeedTypesSizes | - packages.NeedTypesInfo | - packages.NeedSyntax - -// The Context is populated with data parsed from the source code as it is scanned. -// It is passed through to all rule functions as they are called. Rules may use -// this data in conjunction withe the encountered AST node. -type Context struct { - FileSet *token.FileSet - Comments ast.CommentMap - Info *types.Info - Pkg *types.Package - PkgFiles []*ast.File - Root *ast.File - Config Config - Imports *ImportTracker - Ignores []map[string]bool -} - -// Metrics used when reporting information about a scanning run. -type Metrics struct { - NumFiles int `json:"files"` - NumLines int `json:"lines"` - NumNosec int `json:"nosec"` - NumFound int `json:"found"` -} - -// Analyzer object is the main object of gosec. It has methods traverse an AST -// and invoke the correct checking rules as on each node as required. -type Analyzer struct { - ignoreNosec bool - ruleset RuleSet - context *Context - config Config - logger *log.Logger - issues []*Issue - stats *Metrics - errors map[string][]Error // keys are file paths; values are the golang errors in those files - tests bool -} - -// NewAnalyzer builds a new analyzer. -func NewAnalyzer(conf Config, tests bool, logger *log.Logger) *Analyzer { - ignoreNoSec := false - if enabled, err := conf.IsGlobalEnabled(Nosec); err == nil { - ignoreNoSec = enabled - } - if logger == nil { - logger = log.New(os.Stderr, "[gosec]", log.LstdFlags) - } - return &Analyzer{ - ignoreNosec: ignoreNoSec, - ruleset: make(RuleSet), - context: &Context{}, - config: conf, - logger: logger, - issues: make([]*Issue, 0, 16), - stats: &Metrics{}, - errors: make(map[string][]Error), - tests: tests, - } -} - -// SetConfig upates the analyzer configuration -func (gosec *Analyzer) SetConfig(conf Config) { - gosec.config = conf -} - -// Config returns the current configuration -func (gosec *Analyzer) Config() Config { - return gosec.config -} - -// LoadRules instantiates all the rules to be used when analyzing source -// packages -func (gosec *Analyzer) LoadRules(ruleDefinitions map[string]RuleBuilder) { - for id, def := range ruleDefinitions { - r, nodes := def(id, gosec.config) - gosec.ruleset.Register(r, nodes...) - } -} - -// Process kicks off the analysis process for a given package -func (gosec *Analyzer) Process(buildTags []string, packagePaths ...string) error { - config := gosec.pkgConfig(buildTags) - for _, pkgPath := range packagePaths { - pkgs, err := gosec.load(pkgPath, config) - if err != nil { - gosec.AppendError(pkgPath, err) - } - for _, pkg := range pkgs { - if pkg.Name != "" { - err := gosec.ParseErrors(pkg) - if err != nil { - return fmt.Errorf("parsing errors in pkg %q: %v", pkg.Name, err) - } - gosec.Check(pkg) - } - } - } - sortErrors(gosec.errors) - return nil -} - -func (gosec *Analyzer) pkgConfig(buildTags []string) *packages.Config { - flags := []string{} - if len(buildTags) > 0 { - tagsFlag := "-tags=" + strings.Join(buildTags, " ") - flags = append(flags, tagsFlag) - } - return &packages.Config{ - Mode: LoadMode, - BuildFlags: flags, - Tests: gosec.tests, - } -} - -func (gosec *Analyzer) load(pkgPath string, conf *packages.Config) ([]*packages.Package, error) { - abspath, err := GetPkgAbsPath(pkgPath) - if err != nil { - gosec.logger.Printf("Skipping: %s. Path doesn't exist.", abspath) - return []*packages.Package{}, nil - } - - gosec.logger.Println("Import directory:", abspath) - basePackage, err := build.Default.ImportDir(pkgPath, build.ImportComment) - if err != nil { - return []*packages.Package{}, fmt.Errorf("importing dir %q: %v", pkgPath, err) - } - - var packageFiles []string - for _, filename := range basePackage.GoFiles { - packageFiles = append(packageFiles, path.Join(pkgPath, filename)) - } - - if gosec.tests { - testsFiles := []string{} - testsFiles = append(testsFiles, basePackage.TestGoFiles...) - testsFiles = append(testsFiles, basePackage.XTestGoFiles...) - for _, filename := range testsFiles { - packageFiles = append(packageFiles, path.Join(pkgPath, filename)) - } - } - - pkgs, err := packages.Load(conf, packageFiles...) - if err != nil { - return []*packages.Package{}, fmt.Errorf("loading files from package %q: %v", pkgPath, err) - } - return pkgs, nil -} - -// Check runs analysis on the given package -func (gosec *Analyzer) Check(pkg *packages.Package) { - gosec.logger.Println("Checking package:", pkg.Name) - for _, file := range pkg.Syntax { - gosec.logger.Println("Checking file:", pkg.Fset.File(file.Pos()).Name()) - gosec.context.FileSet = pkg.Fset - gosec.context.Config = gosec.config - gosec.context.Comments = ast.NewCommentMap(gosec.context.FileSet, file, file.Comments) - gosec.context.Root = file - gosec.context.Info = pkg.TypesInfo - gosec.context.Pkg = pkg.Types - gosec.context.PkgFiles = pkg.Syntax - gosec.context.Imports = NewImportTracker() - gosec.context.Imports.TrackFile(file) - ast.Walk(gosec, file) - gosec.stats.NumFiles++ - gosec.stats.NumLines += pkg.Fset.File(file.Pos()).LineCount() - } -} - -// ParseErrors parses the errors from given package -func (gosec *Analyzer) ParseErrors(pkg *packages.Package) error { - if len(pkg.Errors) == 0 { - return nil - } - for _, pkgErr := range pkg.Errors { - parts := strings.Split(pkgErr.Pos, ":") - file := parts[0] - var err error - var line int - if len(parts) > 1 { - if line, err = strconv.Atoi(parts[1]); err != nil { - return fmt.Errorf("parsing line: %v", err) - } - } - var column int - if len(parts) > 2 { - if column, err = strconv.Atoi(parts[2]); err != nil { - return fmt.Errorf("parsing column: %v", err) - } - } - msg := strings.TrimSpace(pkgErr.Msg) - newErr := NewError(line, column, msg) - if errSlice, ok := gosec.errors[file]; ok { - gosec.errors[file] = append(errSlice, *newErr) - } else { - errSlice = []Error{} - gosec.errors[file] = append(errSlice, *newErr) - } - } - return nil -} - -// AppendError appends an error to the file errors -func (gosec *Analyzer) AppendError(file string, err error) { - // Do not report the error for empty packages (e.g. files excluded from build with a tag) - r := regexp.MustCompile(`no buildable Go source files in`) - if r.MatchString(err.Error()) { - return - } - errors := []Error{} - if ferrs, ok := gosec.errors[file]; ok { - errors = ferrs - } - ferr := NewError(0, 0, err.Error()) - errors = append(errors, *ferr) - gosec.errors[file] = errors -} - -// ignore a node (and sub-tree) if it is tagged with a "#nosec" comment -func (gosec *Analyzer) ignore(n ast.Node) ([]string, bool) { - if groups, ok := gosec.context.Comments[n]; ok && !gosec.ignoreNosec { - - // Checks if an alternative for #nosec is set and, if not, uses the default. - noSecAlternative, err := gosec.config.GetGlobal(NoSecAlternative) - if err != nil { - noSecAlternative = "#nosec" - } - - for _, group := range groups { - if strings.Contains(group.Text(), noSecAlternative) { - gosec.stats.NumNosec++ - - // Pull out the specific rules that are listed to be ignored. - re := regexp.MustCompile(`(G\d{3})`) - matches := re.FindAllStringSubmatch(group.Text(), -1) - - // If no specific rules were given, ignore everything. - if len(matches) == 0 { - return nil, true - } - - // Find the rule IDs to ignore. - var ignores []string - for _, v := range matches { - ignores = append(ignores, v[1]) - } - return ignores, false - } - } - } - return nil, false -} - -// Visit runs the gosec visitor logic over an AST created by parsing go code. -// Rule methods added with AddRule will be invoked as necessary. -func (gosec *Analyzer) Visit(n ast.Node) ast.Visitor { - // If we've reached the end of this branch, pop off the ignores stack. - if n == nil { - if len(gosec.context.Ignores) > 0 { - gosec.context.Ignores = gosec.context.Ignores[1:] - } - return gosec - } - - // Get any new rule exclusions. - ignoredRules, ignoreAll := gosec.ignore(n) - if ignoreAll { - return nil - } - - // Now create the union of exclusions. - ignores := map[string]bool{} - if len(gosec.context.Ignores) > 0 { - for k, v := range gosec.context.Ignores[0] { - ignores[k] = v - } - } - - for _, v := range ignoredRules { - ignores[v] = true - } - - // Push the new set onto the stack. - gosec.context.Ignores = append([]map[string]bool{ignores}, gosec.context.Ignores...) - - // Track aliased and initialization imports - gosec.context.Imports.TrackImport(n) - - for _, rule := range gosec.ruleset.RegisteredFor(n) { - if _, ok := ignores[rule.ID()]; ok { - continue - } - issue, err := rule.Match(n, gosec.context) - if err != nil { - file, line := GetLocation(n, gosec.context) - file = path.Base(file) - gosec.logger.Printf("Rule error: %v => %s (%s:%d)\n", reflect.TypeOf(rule), err, file, line) - } - if issue != nil { - gosec.issues = append(gosec.issues, issue) - gosec.stats.NumFound++ - } - } - return gosec -} - -// Report returns the current issues discovered and the metrics about the scan -func (gosec *Analyzer) Report() ([]*Issue, *Metrics, map[string][]Error) { - return gosec.issues, gosec.stats, gosec.errors -} - -// Reset clears state such as context, issues and metrics from the configured analyzer -func (gosec *Analyzer) Reset() { - gosec.context = &Context{} - gosec.issues = make([]*Issue, 0, 16) - gosec.stats = &Metrics{} - gosec.ruleset = NewRuleSet() -} diff --git a/vendor/github.com/securego/gosec/call_list.go b/vendor/github.com/securego/gosec/call_list.go deleted file mode 100644 index 556a1e8c9..000000000 --- a/vendor/github.com/securego/gosec/call_list.go +++ /dev/null @@ -1,90 +0,0 @@ -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package gosec - -import ( - "go/ast" - "strings" -) - -const vendorPath = "vendor/" - -type set map[string]bool - -// CallList is used to check for usage of specific packages -// and functions. -type CallList map[string]set - -// NewCallList creates a new empty CallList -func NewCallList() CallList { - return make(CallList) -} - -// AddAll will add several calls to the call list at once -func (c CallList) AddAll(selector string, idents ...string) { - for _, ident := range idents { - c.Add(selector, ident) - } -} - -// Add a selector and call to the call list -func (c CallList) Add(selector, ident string) { - if _, ok := c[selector]; !ok { - c[selector] = make(set) - } - c[selector][ident] = true -} - -// Contains returns true if the package and function are -/// members of this call list. -func (c CallList) Contains(selector, ident string) bool { - if idents, ok := c[selector]; ok { - _, found := idents[ident] - return found - } - return false -} - -// ContainsCallExpr resolves the call expression name and type -/// or package and determines if it exists within the CallList -func (c CallList) ContainsCallExpr(n ast.Node, ctx *Context, stripVendor bool) *ast.CallExpr { - selector, ident, err := GetCallInfo(n, ctx) - if err != nil { - return nil - } - - // Use only explicit path (optionally strip vendor path prefix) to reduce conflicts - path, ok := GetImportPath(selector, ctx) - if !ok { - return nil - } - if stripVendor { - if vendorIdx := strings.Index(path, vendorPath); vendorIdx >= 0 { - path = path[vendorIdx+len(vendorPath):] - } - } - if !c.Contains(path, ident) { - return nil - } - - return n.(*ast.CallExpr) - /* - // Try direct resolution - if c.Contains(selector, ident) { - log.Printf("c.Contains == true, %s, %s.", selector, ident) - return n.(*ast.CallExpr) - } - */ - -} diff --git a/vendor/github.com/securego/gosec/config.go b/vendor/github.com/securego/gosec/config.go deleted file mode 100644 index 5b7f73936..000000000 --- a/vendor/github.com/securego/gosec/config.go +++ /dev/null @@ -1,125 +0,0 @@ -package gosec - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "io/ioutil" -) - -const ( - // Globals are applicable to all rules and used for general - // configuration settings for gosec. - Globals = "global" -) - -// GlobalOption defines the name of the global options -type GlobalOption string - -const ( - // Nosec global option for #nosec directive - Nosec GlobalOption = "nosec" - // Audit global option which indicates that gosec runs in audit mode - Audit GlobalOption = "audit" - // NoSecAlternative global option alternative for #nosec directive - NoSecAlternative GlobalOption = "#nosec" -) - -// Config is used to provide configuration and customization to each of the rules. -type Config map[string]interface{} - -// NewConfig initializes a new configuration instance. The configuration data then -// needs to be loaded via c.ReadFrom(strings.NewReader("config data")) -// or from a *os.File. -func NewConfig() Config { - cfg := make(Config) - cfg[Globals] = make(map[GlobalOption]string) - return cfg -} - -func (c Config) keyToGlobalOptions(key string) GlobalOption { - return GlobalOption(key) -} - -func (c Config) convertGlobals() { - if globals, ok := c[Globals]; ok { - if settings, ok := globals.(map[string]interface{}); ok { - validGlobals := map[GlobalOption]string{} - for k, v := range settings { - validGlobals[c.keyToGlobalOptions(k)] = fmt.Sprintf("%v", v) - } - c[Globals] = validGlobals - } - } -} - -// ReadFrom implements the io.ReaderFrom interface. This -// should be used with io.Reader to load configuration from -//file or from string etc. -func (c Config) ReadFrom(r io.Reader) (int64, error) { - data, err := ioutil.ReadAll(r) - if err != nil { - return int64(len(data)), err - } - if err = json.Unmarshal(data, &c); err != nil { - return int64(len(data)), err - } - c.convertGlobals() - return int64(len(data)), nil -} - -// WriteTo implements the io.WriteTo interface. This should -// be used to save or print out the configuration information. -func (c Config) WriteTo(w io.Writer) (int64, error) { - data, err := json.Marshal(c) - if err != nil { - return int64(len(data)), err - } - return io.Copy(w, bytes.NewReader(data)) -} - -// Get returns the configuration section for the supplied key -func (c Config) Get(section string) (interface{}, error) { - settings, found := c[section] - if !found { - return nil, fmt.Errorf("Section %s not in configuration", section) - } - return settings, nil -} - -// Set section in the configuration to specified value -func (c Config) Set(section string, value interface{}) { - c[section] = value -} - -// GetGlobal returns value associated with global configuration option -func (c Config) GetGlobal(option GlobalOption) (string, error) { - if globals, ok := c[Globals]; ok { - if settings, ok := globals.(map[GlobalOption]string); ok { - if value, ok := settings[option]; ok { - return value, nil - } - return "", fmt.Errorf("global setting for %s not found", option) - } - } - return "", fmt.Errorf("no global config options found") -} - -// SetGlobal associates a value with a global configuration option -func (c Config) SetGlobal(option GlobalOption, value string) { - if globals, ok := c[Globals]; ok { - if settings, ok := globals.(map[GlobalOption]string); ok { - settings[option] = value - } - } -} - -// IsGlobalEnabled checks if a global option is enabled -func (c Config) IsGlobalEnabled(option GlobalOption) (bool, error) { - value, err := c.GetGlobal(option) - if err != nil { - return false, err - } - return (value == "true" || value == "enabled"), nil -} diff --git a/vendor/github.com/securego/gosec/errors.go b/vendor/github.com/securego/gosec/errors.go deleted file mode 100644 index a27aa5821..000000000 --- a/vendor/github.com/securego/gosec/errors.go +++ /dev/null @@ -1,33 +0,0 @@ -package gosec - -import ( - "sort" -) - -// Error is used when there are golang errors while parsing the AST -type Error struct { - Line int `json:"line"` - Column int `json:"column"` - Err string `json:"error"` -} - -// NewError creates Error object -func NewError(line, column int, err string) *Error { - return &Error{ - Line: line, - Column: column, - Err: err, - } -} - -// sortErros sorts the golang erros by line -func sortErrors(allErrors map[string][]Error) { - for _, errors := range allErrors { - sort.Slice(errors, func(i, j int) bool { - if errors[i].Line == errors[j].Line { - return errors[i].Column <= errors[j].Column - } - return errors[i].Line < errors[j].Line - }) - } -} diff --git a/vendor/github.com/securego/gosec/go.mod b/vendor/github.com/securego/gosec/go.mod deleted file mode 100644 index 0927b6ff2..000000000 --- a/vendor/github.com/securego/gosec/go.mod +++ /dev/null @@ -1,22 +0,0 @@ -module github.com/securego/gosec - -require ( - github.com/golang/protobuf v1.3.2 // indirect - github.com/kr/pretty v0.1.0 // indirect - github.com/kr/pty v1.1.8 // indirect - github.com/lib/pq v1.2.0 // indirect - github.com/mozilla/tls-observatory v0.0.0-20190404164649-a3c1b6cfecfd - github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d - github.com/onsi/ginkgo v1.10.1 - github.com/onsi/gomega v1.7.0 - github.com/stretchr/objx v0.2.0 // indirect - github.com/stretchr/testify v1.4.0 // indirect - golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392 // indirect - golang.org/x/net v0.0.0-20190923162816-aa69164e4478 // indirect - golang.org/x/text v0.3.2 // indirect - golang.org/x/tools v0.0.0-20190930201159-7c411dea38b0 - gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect - gopkg.in/yaml.v2 v2.2.2 -) - -go 1.13 diff --git a/vendor/github.com/securego/gosec/go.sum b/vendor/github.com/securego/gosec/go.sum deleted file mode 100644 index 7d3c7c1c0..000000000 --- a/vendor/github.com/securego/gosec/go.sum +++ /dev/null @@ -1,122 +0,0 @@ -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/mozilla/tls-observatory v0.0.0-20190404164649-a3c1b6cfecfd h1:Av0AX0PnAlPZ3AY2rQUobGFaZfE4KHVRdKWIEPvsCWY= -github.com/mozilla/tls-observatory v0.0.0-20190404164649-a3c1b6cfecfd/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= -github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d h1:AREM5mwr4u1ORQBMvzfzBgpsctsbQikCVpvC+tX285E= -github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190907121410-71b5226ff739 h1:Gc7JIyxvWgD6m+QmVryY0MstDORNYididDGxgZ6Tnpk= -golang.org/x/crypto v0.0.0-20190907121410-71b5226ff739/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190909091759-094676da4a83 h1:mgAKeshyNqWKdENOnQsg+8dRTwZFIwFaO3HNl52sweA= -golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392 h1:ACG4HJsFiNMf47Y4PeRoebLNy/2lXT9EtprMuTFWt1M= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190420063019-afa5a82059c6 h1:HdqqaWmYAUI7/dmByKKEw+yxDksGSo+9GjkUc9Zp34E= -golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190909003024-a7b16738d86b h1:XfVGCX+0T4WOStkaOsJRllbsiImhB2jgVBGc9L0lPGc= -golang.org/x/net v0.0.0-20190909003024-a7b16738d86b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190912160710-24e19bdeb0f2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190916140828-c8589233b77d/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190921015927-1a5e07d1ff72/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478 h1:l5EDrHhldLYb3ZRHDUhXF7Om7MvYXnkV9/iQNo1lX6g= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190907184412-d223b2b6db03 h1:b3JiLYVaG9kHjTcOQIoUh978YMCO7oVTQQBLudU47zY= -golang.org/x/sys v0.0.0-20190907184412-d223b2b6db03/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190909082730-f460065e899a h1:mIzbOulag9/gXacgxKlFVwpCOWSfBT3/pDyyCwGA9as= -golang.org/x/sys v0.0.0-20190909082730-f460065e899a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190910064555-bbd175535a8b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190911201528-7ad0cfa0b7b5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190913121621-c3b328c6e5a7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69 h1:rOhMmluY6kLMhdnrivzec6lLgaVbMHMn2ISQXJeJ5EM= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190422233926-fe54fb35175b h1:NVD8gBK33xpdqCaZVVtd6OFJp+3dxkXuz7+U7KaVN6s= -golang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190909030654-5b82db07426d h1:PhtdWYteEBebOX7KXm4qkIAVSUTHQ883/2hRB92r9lk= -golang.org/x/tools v0.0.0-20190909030654-5b82db07426d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190909214602-067311248421 h1:NmmWqJbt02YJHmp4A4gBXvsXXIzzixjzE1y6PKUyIjk= -golang.org/x/tools v0.0.0-20190909214602-067311248421/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578 h1:f0Gfd654rnnfXT1+BK1YHPTS1qQdKrPIaGQwWxNE44k= -golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911022129-16c5e0f7d110 h1:6S6bidS7O4yAwA5ORRbRIjvNQ9tGbLd5e+LRIaTeVDQ= -golang.org/x/tools v0.0.0-20190911022129-16c5e0f7d110/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911230505-6bfd74cf029c h1:ZgedNh8bIOBjyY5XEG0kR/41dSN9H+5jFZWuR/TgA1g= -golang.org/x/tools v0.0.0-20190911230505-6bfd74cf029c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190916034716-92af9d69eff2 h1:cvSBP3q8DeS4up5q8ssbGdEtSGiDgRV7HBvOpr3g5RM= -golang.org/x/tools v0.0.0-20190916034716-92af9d69eff2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190917032747-2dc213d980bc h1:AzQrNvr65FlhSjBpg0eVCY43QLsuOqtzWGtjcBqT6J8= -golang.org/x/tools v0.0.0-20190917032747-2dc213d980bc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72 h1:bw9doJza/SFBEweII/rHQh338oozWyiFsBRHtrflcws= -golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190923230126-0f9bb8f614ff h1:palXc2/lH3aFG86BII2o6pUYgrcAjON5FyYk7zthL3Q= -golang.org/x/tools v0.0.0-20190923230126-0f9bb8f614ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190924052046-3ac2a5bbd98a h1:DJzZ1GRmbjp7ihxzAN6UTVpVMi6k4CXZEr7A3wi2kRA= -golang.org/x/tools v0.0.0-20190924052046-3ac2a5bbd98a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190930201159-7c411dea38b0 h1:7+F62GGWUowoiJOUDivedlBECd/fTeUDJnCu0JetQO0= -golang.org/x/tools v0.0.0-20190930201159-7c411dea38b0/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/securego/gosec/helpers.go b/vendor/github.com/securego/gosec/helpers.go deleted file mode 100644 index d708626af..000000000 --- a/vendor/github.com/securego/gosec/helpers.go +++ /dev/null @@ -1,398 +0,0 @@ -// (c) Copyright 2016 Hewlett Packard Enterprise Development LP -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package gosec - -import ( - "errors" - "fmt" - "go/ast" - "go/token" - "go/types" - "os" - "os/user" - "path/filepath" - "regexp" - "runtime" - "strconv" - "strings" -) - -// MatchCallByPackage ensures that the specified package is imported, -// adjusts the name for any aliases and ignores cases that are -// initialization only imports. -// -// Usage: -// node, matched := MatchCallByPackage(n, ctx, "math/rand", "Read") -// -func MatchCallByPackage(n ast.Node, c *Context, pkg string, names ...string) (*ast.CallExpr, bool) { - - importedName, found := GetImportedName(pkg, c) - if !found { - return nil, false - } - - if callExpr, ok := n.(*ast.CallExpr); ok { - packageName, callName, err := GetCallInfo(callExpr, c) - if err != nil { - return nil, false - } - if packageName == importedName { - for _, name := range names { - if callName == name { - return callExpr, true - } - } - } - } - return nil, false -} - -// MatchCompLit will match an ast.CompositeLit based on the supplied type -func MatchCompLit(n ast.Node, ctx *Context, required string) *ast.CompositeLit { - if complit, ok := n.(*ast.CompositeLit); ok { - typeOf := ctx.Info.TypeOf(complit) - if typeOf.String() == required { - return complit - } - } - return nil -} - -// GetInt will read and return an integer value from an ast.BasicLit -func GetInt(n ast.Node) (int64, error) { - if node, ok := n.(*ast.BasicLit); ok && node.Kind == token.INT { - return strconv.ParseInt(node.Value, 0, 64) - } - return 0, fmt.Errorf("Unexpected AST node type: %T", n) -} - -// GetFloat will read and return a float value from an ast.BasicLit -func GetFloat(n ast.Node) (float64, error) { - if node, ok := n.(*ast.BasicLit); ok && node.Kind == token.FLOAT { - return strconv.ParseFloat(node.Value, 64) - } - return 0.0, fmt.Errorf("Unexpected AST node type: %T", n) -} - -// GetChar will read and return a char value from an ast.BasicLit -func GetChar(n ast.Node) (byte, error) { - if node, ok := n.(*ast.BasicLit); ok && node.Kind == token.CHAR { - return node.Value[0], nil - } - return 0, fmt.Errorf("Unexpected AST node type: %T", n) -} - -// GetString will read and return a string value from an ast.BasicLit -func GetString(n ast.Node) (string, error) { - if node, ok := n.(*ast.BasicLit); ok && node.Kind == token.STRING { - return strconv.Unquote(node.Value) - } - return "", fmt.Errorf("Unexpected AST node type: %T", n) -} - -// GetCallObject returns the object and call expression and associated -// object for a given AST node. nil, nil will be returned if the -// object cannot be resolved. -func GetCallObject(n ast.Node, ctx *Context) (*ast.CallExpr, types.Object) { - switch node := n.(type) { - case *ast.CallExpr: - switch fn := node.Fun.(type) { - case *ast.Ident: - return node, ctx.Info.Uses[fn] - case *ast.SelectorExpr: - return node, ctx.Info.Uses[fn.Sel] - } - } - return nil, nil -} - -// GetCallInfo returns the package or type and name associated with a -// call expression. -func GetCallInfo(n ast.Node, ctx *Context) (string, string, error) { - switch node := n.(type) { - case *ast.CallExpr: - switch fn := node.Fun.(type) { - case *ast.SelectorExpr: - switch expr := fn.X.(type) { - case *ast.Ident: - if expr.Obj != nil && expr.Obj.Kind == ast.Var { - t := ctx.Info.TypeOf(expr) - if t != nil { - return t.String(), fn.Sel.Name, nil - } - return "undefined", fn.Sel.Name, fmt.Errorf("missing type info") - } - return expr.Name, fn.Sel.Name, nil - } - case *ast.Ident: - return ctx.Pkg.Name(), fn.Name, nil - } - } - return "", "", fmt.Errorf("unable to determine call info") -} - -// GetCallStringArgsValues returns the values of strings arguments if they can be resolved -func GetCallStringArgsValues(n ast.Node, ctx *Context) []string { - values := []string{} - switch node := n.(type) { - case *ast.CallExpr: - for _, arg := range node.Args { - switch param := arg.(type) { - case *ast.BasicLit: - value, err := GetString(param) - if err == nil { - values = append(values, value) - } - case *ast.Ident: - values = append(values, GetIdentStringValues(param)...) - } - } - } - return values -} - -// GetIdentStringValues return the string values of an Ident if they can be resolved -func GetIdentStringValues(ident *ast.Ident) []string { - values := []string{} - obj := ident.Obj - if obj != nil { - switch decl := obj.Decl.(type) { - case *ast.ValueSpec: - for _, v := range decl.Values { - value, err := GetString(v) - if err == nil { - values = append(values, value) - } - } - case *ast.AssignStmt: - for _, v := range decl.Rhs { - value, err := GetString(v) - if err == nil { - values = append(values, value) - } - } - } - - } - return values -} - -// GetImportedName returns the name used for the package within the -// code. It will resolve aliases and ignores initialization only imports. -func GetImportedName(path string, ctx *Context) (string, bool) { - importName, imported := ctx.Imports.Imported[path] - if !imported { - return "", false - } - - if _, initonly := ctx.Imports.InitOnly[path]; initonly { - return "", false - } - - if alias, ok := ctx.Imports.Aliased[path]; ok { - importName = alias - } - return importName, true -} - -// GetImportPath resolves the full import path of an identifier based on -// the imports in the current context. -func GetImportPath(name string, ctx *Context) (string, bool) { - for path := range ctx.Imports.Imported { - if imported, ok := GetImportedName(path, ctx); ok && imported == name { - return path, true - } - } - return "", false -} - -// GetLocation returns the filename and line number of an ast.Node -func GetLocation(n ast.Node, ctx *Context) (string, int) { - fobj := ctx.FileSet.File(n.Pos()) - return fobj.Name(), fobj.Line(n.Pos()) -} - -// Gopath returns all GOPATHs -func Gopath() []string { - defaultGoPath := runtime.GOROOT() - if u, err := user.Current(); err == nil { - defaultGoPath = filepath.Join(u.HomeDir, "go") - } - path := Getenv("GOPATH", defaultGoPath) - paths := strings.Split(path, string(os.PathListSeparator)) - for idx, path := range paths { - if abs, err := filepath.Abs(path); err == nil { - paths[idx] = abs - } - } - return paths -} - -// Getenv returns the values of the environment variable, otherwise -//returns the default if variable is not set -func Getenv(key, userDefault string) string { - if val := os.Getenv(key); val != "" { - return val - } - return userDefault -} - -// GetPkgRelativePath returns the Go relative relative path derived -// form the given path -func GetPkgRelativePath(path string) (string, error) { - abspath, err := filepath.Abs(path) - if err != nil { - abspath = path - } - if strings.HasSuffix(abspath, ".go") { - abspath = filepath.Dir(abspath) - } - for _, base := range Gopath() { - projectRoot := filepath.FromSlash(fmt.Sprintf("%s/src/", base)) - if strings.HasPrefix(abspath, projectRoot) { - return strings.TrimPrefix(abspath, projectRoot), nil - } - } - return "", errors.New("no project relative path found") -} - -// GetPkgAbsPath returns the Go package absolute path derived from -// the given path -func GetPkgAbsPath(pkgPath string) (string, error) { - absPath, err := filepath.Abs(pkgPath) - if err != nil { - return "", err - } - if _, err := os.Stat(absPath); os.IsNotExist(err) { - return "", errors.New("no project absolute path found") - } - return absPath, nil -} - -// ConcatString recursively concatenates strings from a binary expression -func ConcatString(n *ast.BinaryExpr) (string, bool) { - var s string - // sub expressions are found in X object, Y object is always last BasicLit - if rightOperand, ok := n.Y.(*ast.BasicLit); ok { - if str, err := GetString(rightOperand); err == nil { - s = str + s - } - } else { - return "", false - } - if leftOperand, ok := n.X.(*ast.BinaryExpr); ok { - if recursion, ok := ConcatString(leftOperand); ok { - s = recursion + s - } - } else if leftOperand, ok := n.X.(*ast.BasicLit); ok { - if str, err := GetString(leftOperand); err == nil { - s = str + s - } - } else { - return "", false - } - return s, true -} - -// FindVarIdentities returns array of all variable identities in a given binary expression -func FindVarIdentities(n *ast.BinaryExpr, c *Context) ([]*ast.Ident, bool) { - identities := []*ast.Ident{} - // sub expressions are found in X object, Y object is always the last term - if rightOperand, ok := n.Y.(*ast.Ident); ok { - obj := c.Info.ObjectOf(rightOperand) - if _, ok := obj.(*types.Var); ok && !TryResolve(rightOperand, c) { - identities = append(identities, rightOperand) - } - } - if leftOperand, ok := n.X.(*ast.BinaryExpr); ok { - if leftIdentities, ok := FindVarIdentities(leftOperand, c); ok { - identities = append(identities, leftIdentities...) - } - } else { - if leftOperand, ok := n.X.(*ast.Ident); ok { - obj := c.Info.ObjectOf(leftOperand) - if _, ok := obj.(*types.Var); ok && !TryResolve(leftOperand, c) { - identities = append(identities, leftOperand) - } - } - } - - if len(identities) > 0 { - return identities, true - } - // if nil or error, return false - return nil, false -} - -// PackagePaths returns a slice with all packages path at given root directory -func PackagePaths(root string, excludes []*regexp.Regexp) ([]string, error) { - if strings.HasSuffix(root, "...") { - root = root[0 : len(root)-3] - } else { - return []string{root}, nil - } - paths := map[string]bool{} - err := filepath.Walk(root, func(path string, f os.FileInfo, err error) error { - if filepath.Ext(path) == ".go" { - path = filepath.Dir(path) - if isExcluded(path, excludes) { - return nil - } - paths[path] = true - } - return nil - }) - if err != nil { - return []string{}, err - } - - result := []string{} - for path := range paths { - result = append(result, path) - } - return result, nil -} - -// isExcluded checks if a string matches any of the exclusion regexps -func isExcluded(str string, excludes []*regexp.Regexp) bool { - if excludes == nil { - return false - } - for _, exclude := range excludes { - if exclude != nil && exclude.MatchString(str) { - return true - } - } - return false -} - -// ExcludedDirsRegExp builds the regexps for a list of excluded dirs provided as strings -func ExcludedDirsRegExp(excludedDirs []string) []*regexp.Regexp { - var exps []*regexp.Regexp - for _, excludedDir := range excludedDirs { - str := fmt.Sprintf(`([\\/])?%s([\\/])?`, excludedDir) - r := regexp.MustCompile(str) - exps = append(exps, r) - } - return exps -} - -// RootPath returns the absolute root path of a scan -func RootPath(root string) (string, error) { - if strings.HasSuffix(root, "...") { - root = root[0 : len(root)-3] - } - return filepath.Abs(root) -} diff --git a/vendor/github.com/securego/gosec/import_tracker.go b/vendor/github.com/securego/gosec/import_tracker.go deleted file mode 100644 index cbb8c5518..000000000 --- a/vendor/github.com/securego/gosec/import_tracker.go +++ /dev/null @@ -1,75 +0,0 @@ -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package gosec - -import ( - "go/ast" - "go/types" - "strings" -) - -// ImportTracker is used to normalize the packages that have been imported -// by a source file. It is able to differentiate between plain imports, aliased -// imports and init only imports. -type ImportTracker struct { - Imported map[string]string - Aliased map[string]string - InitOnly map[string]bool -} - -// NewImportTracker creates an empty Import tracker instance -func NewImportTracker() *ImportTracker { - return &ImportTracker{ - make(map[string]string), - make(map[string]string), - make(map[string]bool), - } -} - -// TrackFile track all the imports used by the supplied file -func (t *ImportTracker) TrackFile(file *ast.File) { - for _, imp := range file.Imports { - path := strings.Trim(imp.Path.Value, `"`) - parts := strings.Split(path, "/") - if len(parts) > 0 { - name := parts[len(parts)-1] - t.Imported[path] = name - } - } -} - -// TrackPackages tracks all the imports used by the supplied packages -func (t *ImportTracker) TrackPackages(pkgs ...*types.Package) { - for _, pkg := range pkgs { - t.Imported[pkg.Path()] = pkg.Name() - } -} - -// TrackImport tracks imports and handles the 'unsafe' import -func (t *ImportTracker) TrackImport(n ast.Node) { - if imported, ok := n.(*ast.ImportSpec); ok { - path := strings.Trim(imported.Path.Value, `"`) - if imported.Name != nil { - if imported.Name.Name == "_" { - // Initialization only import - t.InitOnly[path] = true - } else { - // Aliased import - t.Aliased[path] = imported.Name.Name - } - } - if path == "unsafe" { - t.Imported[path] = path - } - } -} diff --git a/vendor/github.com/securego/gosec/install.sh b/vendor/github.com/securego/gosec/install.sh deleted file mode 100644 index 9ee8143e6..000000000 --- a/vendor/github.com/securego/gosec/install.sh +++ /dev/null @@ -1,381 +0,0 @@ -#!/bin/sh -set -e -# Code generated by godownloader on 2018-10-05T09:52:28Z. DO NOT EDIT. -# - -usage() { - this=$1 - cat </dev/null -} -echoerr() { - echo "$@" 1>&2 -} -log_prefix() { - echo "$0" -} -_logp=6 -log_set_priority() { - _logp="$1" -} -log_priority() { - if test -z "$1"; then - echo "$_logp" - return - fi - [ "$1" -le "$_logp" ] -} -log_tag() { - case $1 in - 0) echo "emerg" ;; - 1) echo "alert" ;; - 2) echo "crit" ;; - 3) echo "err" ;; - 4) echo "warning" ;; - 5) echo "notice" ;; - 6) echo "info" ;; - 7) echo "debug" ;; - *) echo "$1" ;; - esac -} -log_debug() { - log_priority 7 || return 0 - echoerr "$(log_prefix)" "$(log_tag 7)" "$@" -} -log_info() { - log_priority 6 || return 0 - echoerr "$(log_prefix)" "$(log_tag 6)" "$@" -} -log_err() { - log_priority 3 || return 0 - echoerr "$(log_prefix)" "$(log_tag 3)" "$@" -} -log_crit() { - log_priority 2 || return 0 - echoerr "$(log_prefix)" "$(log_tag 2)" "$@" -} -uname_os() { - os=$(uname -s | tr '[:upper:]' '[:lower:]') - case "$os" in - msys_nt) os="windows" ;; - esac - echo "$os" -} -uname_arch() { - arch=$(uname -m) - case $arch in - x86_64) arch="amd64" ;; - x86) arch="386" ;; - i686) arch="386" ;; - i386) arch="386" ;; - aarch64) arch="arm64" ;; - armv5*) arch="armv5" ;; - armv6*) arch="armv6" ;; - armv7*) arch="armv7" ;; - esac - echo ${arch} -} -uname_os_check() { - os=$(uname_os) - case "$os" in - darwin) return 0 ;; - dragonfly) return 0 ;; - freebsd) return 0 ;; - linux) return 0 ;; - android) return 0 ;; - nacl) return 0 ;; - netbsd) return 0 ;; - openbsd) return 0 ;; - plan9) return 0 ;; - solaris) return 0 ;; - windows) return 0 ;; - esac - log_crit "uname_os_check '$(uname -s)' got converted to '$os' which is not a GOOS value. Please file bug at https://github.com/client9/shlib" - return 1 -} -uname_arch_check() { - arch=$(uname_arch) - case "$arch" in - 386) return 0 ;; - amd64) return 0 ;; - arm64) return 0 ;; - armv5) return 0 ;; - armv6) return 0 ;; - armv7) return 0 ;; - ppc64) return 0 ;; - ppc64le) return 0 ;; - mips) return 0 ;; - mipsle) return 0 ;; - mips64) return 0 ;; - mips64le) return 0 ;; - s390x) return 0 ;; - amd64p32) return 0 ;; - esac - log_crit "uname_arch_check '$(uname -m)' got converted to '$arch' which is not a GOARCH value. Please file bug report at https://github.com/client9/shlib" - return 1 -} -untar() { - tarball=$1 - case "${tarball}" in - *.tar.gz | *.tgz) tar -xzf "${tarball}" ;; - *.tar) tar -xf "${tarball}" ;; - *.zip) unzip "${tarball}" ;; - *) - log_err "untar unknown archive format for ${tarball}" - return 1 - ;; - esac -} -mktmpdir() { - test -z "$TMPDIR" && TMPDIR="$(mktemp -d)" - mkdir -p "${TMPDIR}" - echo "${TMPDIR}" -} -http_download_curl() { - local_file=$1 - source_url=$2 - header=$3 - if [ -z "$header" ]; then - code=$(curl -w '%{http_code}' -sL -o "$local_file" "$source_url") - else - code=$(curl -w '%{http_code}' -sL -H "$header" -o "$local_file" "$source_url") - fi - if [ "$code" != "200" ]; then - log_debug "http_download_curl received HTTP status $code" - return 1 - fi - return 0 -} -http_download_wget() { - local_file=$1 - source_url=$2 - header=$3 - if [ -z "$header" ]; then - wget -q -O "$local_file" "$source_url" - else - wget -q --header "$header" -O "$local_file" "$source_url" - fi -} -http_download() { - log_debug "http_download $2" - if is_command curl; then - http_download_curl "$@" - return - elif is_command wget; then - http_download_wget "$@" - return - fi - log_crit "http_download unable to find wget or curl" - return 1 -} -http_copy() { - tmp=$(mktemp) - http_download "${tmp}" "$1" "$2" || return 1 - body=$(cat "$tmp") - rm -f "${tmp}" - echo "$body" -} -github_release() { - owner_repo=$1 - version=$2 - test -z "$version" && version="latest" - giturl="https://github.com/${owner_repo}/releases/${version}" - json=$(http_copy "$giturl" "Accept:application/json") - test -z "$json" && return 1 - version=$(echo "$json" | tr -s '\n' ' ' | sed 's/.*"tag_name":"//' | sed 's/".*//') - test -z "$version" && return 1 - echo "$version" -} -hash_sha256() { - TARGET=${1:-/dev/stdin} - if is_command gsha256sum; then - hash=$(gsha256sum "$TARGET") || return 1 - echo "$hash" | cut -d ' ' -f 1 - elif is_command sha256sum; then - hash=$(sha256sum "$TARGET") || return 1 - echo "$hash" | cut -d ' ' -f 1 - elif is_command shasum; then - hash=$(shasum -a 256 "$TARGET" 2>/dev/null) || return 1 - echo "$hash" | cut -d ' ' -f 1 - elif is_command openssl; then - hash=$(openssl -dst openssl dgst -sha256 "$TARGET") || return 1 - echo "$hash" | cut -d ' ' -f a - else - log_crit "hash_sha256 unable to find command to compute sha-256 hash" - return 1 - fi -} -hash_sha256_verify() { - TARGET=$1 - checksums=$2 - if [ -z "$checksums" ]; then - log_err "hash_sha256_verify checksum file not specified in arg2" - return 1 - fi - BASENAME=${TARGET##*/} - want=$(grep "${BASENAME}" "${checksums}" 2>/dev/null | tr '\t' ' ' | cut -d ' ' -f 1) - if [ -z "$want" ]; then - log_err "hash_sha256_verify unable to find checksum for '${TARGET}' in '${checksums}'" - return 1 - fi - got=$(hash_sha256 "$TARGET") - if [ "$want" != "$got" ]; then - log_err "hash_sha256_verify checksum for '$TARGET' did not verify ${want} vs $got" - return 1 - fi -} -cat /dev/null < [line {{$error.Line}} : column {{$error.Column}}] - {{$error.Err}} -{{end}} -{{end}} -{{ range $index, $issue := .Issues }} -[{{ $issue.File }}:{{ $issue.Line }}] - {{ $issue.RuleID }}: {{ $issue.What }} (Confidence: {{ $issue.Confidence}}, Severity: {{ $issue.Severity }}) - > {{ $issue.Code }} - -{{ end }} -Summary: - Files: {{.Stats.NumFiles}} - Lines: {{.Stats.NumLines}} - Nosec: {{.Stats.NumNosec}} - Issues: {{.Stats.NumFound}} - -` - -type reportInfo struct { - Errors map[string][]gosec.Error `json:"Golang errors"` - Issues []*gosec.Issue - Stats *gosec.Metrics -} - -// CreateReport generates a report based for the supplied issues and metrics given -// the specified format. The formats currently accepted are: json, csv, html and text. -func CreateReport(w io.Writer, format string, rootPaths []string, issues []*gosec.Issue, metrics *gosec.Metrics, errors map[string][]gosec.Error) error { - data := &reportInfo{ - Errors: errors, - Issues: issues, - Stats: metrics, - } - var err error - switch format { - case "json": - err = reportJSON(w, data) - case "yaml": - err = reportYAML(w, data) - case "csv": - err = reportCSV(w, data) - case "junit-xml": - err = reportJUnitXML(w, data) - case "html": - err = reportFromHTMLTemplate(w, html, data) - case "text": - err = reportFromPlaintextTemplate(w, text, data) - case "sonarqube": - err = reportSonarqube(rootPaths, w, data) - default: - err = reportFromPlaintextTemplate(w, text, data) - } - return err -} - -func reportSonarqube(rootPaths []string, w io.Writer, data *reportInfo) error { - si, err := convertToSonarIssues(rootPaths, data) - if err != nil { - return err - } - raw, err := json.MarshalIndent(si, "", "\t") - if err != nil { - return err - } - _, err = w.Write(raw) - return err -} - -func convertToSonarIssues(rootPaths []string, data *reportInfo) (*sonarIssues, error) { - si := &sonarIssues{[]sonarIssue{}} - for _, issue := range data.Issues { - var sonarFilePath string - for _, rootPath := range rootPaths { - if strings.HasPrefix(issue.File, rootPath) { - sonarFilePath = strings.Replace(issue.File, rootPath+"/", "", 1) - } - } - if sonarFilePath == "" { - continue - } - - lines := strings.Split(issue.Line, "-") - startLine, err := strconv.Atoi(lines[0]) - if err != nil { - return si, err - } - endLine := startLine - if len(lines) > 1 { - endLine, err = strconv.Atoi(lines[1]) - if err != nil { - return si, err - } - } - - s := sonarIssue{ - EngineID: "gosec", - RuleID: issue.RuleID, - PrimaryLocation: location{ - Message: issue.What, - FilePath: sonarFilePath, - TextRange: textRange{StartLine: startLine, EndLine: endLine}, - }, - Type: "VULNERABILITY", - Severity: getSonarSeverity(issue.Severity.String()), - EffortMinutes: SonarqubeEffortMinutes, - } - si.SonarIssues = append(si.SonarIssues, s) - } - return si, nil -} - -func reportJSON(w io.Writer, data *reportInfo) error { - raw, err := json.MarshalIndent(data, "", "\t") - if err != nil { - return err - } - - _, err = w.Write(raw) - return err -} - -func reportYAML(w io.Writer, data *reportInfo) error { - raw, err := yaml.Marshal(data) - if err != nil { - return err - } - _, err = w.Write(raw) - return err -} - -func reportCSV(w io.Writer, data *reportInfo) error { - out := csv.NewWriter(w) - defer out.Flush() - for _, issue := range data.Issues { - err := out.Write([]string{ - issue.File, - issue.Line, - issue.What, - issue.Severity.String(), - issue.Confidence.String(), - issue.Code, - }) - if err != nil { - return err - } - } - return nil -} - -func reportJUnitXML(w io.Writer, data *reportInfo) error { - groupedData := groupDataByRules(data) - junitXMLStruct := createJUnitXMLStruct(groupedData) - - raw, err := xml.MarshalIndent(junitXMLStruct, "", "\t") - if err != nil { - return err - } - - xmlHeader := []byte("\n") - raw = append(xmlHeader, raw...) - _, err = w.Write(raw) - if err != nil { - return err - } - - return nil -} - -func reportFromPlaintextTemplate(w io.Writer, reportTemplate string, data *reportInfo) error { - t, e := plainTemplate.New("gosec").Parse(reportTemplate) - if e != nil { - return e - } - - return t.Execute(w, data) -} - -func reportFromHTMLTemplate(w io.Writer, reportTemplate string, data *reportInfo) error { - t, e := htmlTemplate.New("gosec").Parse(reportTemplate) - if e != nil { - return e - } - - return t.Execute(w, data) -} diff --git a/vendor/github.com/securego/gosec/output/junit_xml_format.go b/vendor/github.com/securego/gosec/output/junit_xml_format.go deleted file mode 100644 index 547d5b213..000000000 --- a/vendor/github.com/securego/gosec/output/junit_xml_format.go +++ /dev/null @@ -1,74 +0,0 @@ -package output - -import ( - "encoding/xml" - htmlLib "html" - "strconv" - - "github.com/securego/gosec" -) - -type junitXMLReport struct { - XMLName xml.Name `xml:"testsuites"` - Testsuites []testsuite `xml:"testsuite"` -} - -type testsuite struct { - XMLName xml.Name `xml:"testsuite"` - Name string `xml:"name,attr"` - Tests int `xml:"tests,attr"` - Testcases []testcase `xml:"testcase"` -} - -type testcase struct { - XMLName xml.Name `xml:"testcase"` - Name string `xml:"name,attr"` - Failure failure `xml:"failure"` -} - -type failure struct { - XMLName xml.Name `xml:"failure"` - Message string `xml:"message,attr"` - Text string `xml:",innerxml"` -} - -func generatePlaintext(issue *gosec.Issue) string { - return "Results:\n" + - "[" + issue.File + ":" + issue.Line + "] - " + - issue.What + " (Confidence: " + strconv.Itoa(int(issue.Confidence)) + - ", Severity: " + strconv.Itoa(int(issue.Severity)) + ")\n" + "> " + htmlLib.EscapeString(issue.Code) -} - -func groupDataByRules(data *reportInfo) map[string][]*gosec.Issue { - groupedData := make(map[string][]*gosec.Issue) - for _, issue := range data.Issues { - if _, ok := groupedData[issue.What]; ok { - groupedData[issue.What] = append(groupedData[issue.What], issue) - } else { - groupedData[issue.What] = []*gosec.Issue{issue} - } - } - return groupedData -} - -func createJUnitXMLStruct(groupedData map[string][]*gosec.Issue) junitXMLReport { - var xmlReport junitXMLReport - for what, issues := range groupedData { - testsuite := testsuite{ - Name: what, - Tests: len(issues), - } - for _, issue := range issues { - testcase := testcase{ - Name: issue.File, - Failure: failure{ - Message: "Found 1 vulnerability. See stacktrace for details.", - Text: generatePlaintext(issue), - }, - } - testsuite.Testcases = append(testsuite.Testcases, testcase) - } - xmlReport.Testsuites = append(xmlReport.Testsuites, testsuite) - } - return xmlReport -} diff --git a/vendor/github.com/securego/gosec/output/sonarqube_format.go b/vendor/github.com/securego/gosec/output/sonarqube_format.go deleted file mode 100644 index bede4fb0f..000000000 --- a/vendor/github.com/securego/gosec/output/sonarqube_format.go +++ /dev/null @@ -1,40 +0,0 @@ -package output - -type textRange struct { - StartLine int `json:"startLine"` - EndLine int `json:"endLine"` - StartColumn int `json:"startColumn,omitempty"` - EtartColumn int `json:"endColumn,omitempty"` -} -type location struct { - Message string `json:"message"` - FilePath string `json:"filePath"` - TextRange textRange `json:"textRange,omitempty"` -} - -type sonarIssue struct { - EngineID string `json:"engineId"` - RuleID string `json:"ruleId"` - PrimaryLocation location `json:"primaryLocation"` - Type string `json:"type"` - Severity string `json:"severity"` - EffortMinutes int `json:"effortMinutes"` - SecondaryLocations []location `json:"secondaryLocations,omitempty"` -} - -type sonarIssues struct { - SonarIssues []sonarIssue `json:"issues"` -} - -func getSonarSeverity(s string) string { - switch s { - case "LOW": - return "MINOR" - case "MEDIUM": - return "MAJOR" - case "HIGH": - return "BLOCKER" - default: - return "INFO" - } -} diff --git a/vendor/github.com/securego/gosec/output/template.go b/vendor/github.com/securego/gosec/output/template.go deleted file mode 100644 index c69f58658..000000000 --- a/vendor/github.com/securego/gosec/output/template.go +++ /dev/null @@ -1,396 +0,0 @@ -// (c) Copyright 2016 Hewlett Packard Enterprise Development LP -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package output - -const html = ` - - - - - Go AST Scanner - - - - - - - -
    -
    -
    -
    -
    - - - -` diff --git a/vendor/github.com/securego/gosec/renovate.json b/vendor/github.com/securego/gosec/renovate.json deleted file mode 100644 index 92327e12d..000000000 --- a/vendor/github.com/securego/gosec/renovate.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": [ - "config:semverAllMonthly", - ":enableVulnerabilityAlertsWithLabel(vulnerablity)", - ":docker" - ] -} diff --git a/vendor/github.com/securego/gosec/resolve.go b/vendor/github.com/securego/gosec/resolve.go deleted file mode 100644 index cdc287e8e..000000000 --- a/vendor/github.com/securego/gosec/resolve.go +++ /dev/null @@ -1,95 +0,0 @@ -// (c) Copyright 2016 Hewlett Packard Enterprise Development LP -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package gosec - -import "go/ast" - -func resolveIdent(n *ast.Ident, c *Context) bool { - if n.Obj == nil || n.Obj.Kind != ast.Var { - return true - } - if node, ok := n.Obj.Decl.(ast.Node); ok { - return TryResolve(node, c) - } - return false -} - -func resolveValueSpec(n *ast.ValueSpec, c *Context) bool { - if len(n.Values) == 0 { - return false - } - for _, value := range n.Values { - if !TryResolve(value, c) { - return false - } - } - return true -} - -func resolveAssign(n *ast.AssignStmt, c *Context) bool { - if len(n.Rhs) == 0 { - return false - } - for _, arg := range n.Rhs { - if !TryResolve(arg, c) { - return false - } - } - return true -} - -func resolveCompLit(n *ast.CompositeLit, c *Context) bool { - if len(n.Elts) == 0 { - return false - } - for _, arg := range n.Elts { - if !TryResolve(arg, c) { - return false - } - } - return true -} - -func resolveBinExpr(n *ast.BinaryExpr, c *Context) bool { - return (TryResolve(n.X, c) && TryResolve(n.Y, c)) -} - -func resolveCallExpr(n *ast.CallExpr, c *Context) bool { - // TODO(tkelsey): next step, full function resolution - return false -} - -// TryResolve will attempt, given a subtree starting at some AST node, to resolve -// all values contained within to a known constant. It is used to check for any -// unknown values in compound expressions. -func TryResolve(n ast.Node, c *Context) bool { - switch node := n.(type) { - case *ast.BasicLit: - return true - case *ast.CompositeLit: - return resolveCompLit(node, c) - case *ast.Ident: - return resolveIdent(node, c) - case *ast.ValueSpec: - return resolveValueSpec(node, c) - case *ast.AssignStmt: - return resolveAssign(node, c) - case *ast.CallExpr: - return resolveCallExpr(node, c) - case *ast.BinaryExpr: - return resolveBinExpr(node, c) - } - return false -} diff --git a/vendor/github.com/securego/gosec/rule.go b/vendor/github.com/securego/gosec/rule.go deleted file mode 100644 index fbba089bb..000000000 --- a/vendor/github.com/securego/gosec/rule.go +++ /dev/null @@ -1,59 +0,0 @@ -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package gosec - -import ( - "go/ast" - "reflect" -) - -// The Rule interface used by all rules supported by gosec. -type Rule interface { - ID() string - Match(ast.Node, *Context) (*Issue, error) -} - -// RuleBuilder is used to register a rule definition with the analyzer -type RuleBuilder func(id string, c Config) (Rule, []ast.Node) - -// A RuleSet maps lists of rules to the type of AST node they should be run on. -// The analyzer will only invoke rules contained in the list associated with the -// type of AST node it is currently visiting. -type RuleSet map[reflect.Type][]Rule - -// NewRuleSet constructs a new RuleSet -func NewRuleSet() RuleSet { - return make(RuleSet) -} - -// Register adds a trigger for the supplied rule for the the -// specified ast nodes. -func (r RuleSet) Register(rule Rule, nodes ...ast.Node) { - for _, n := range nodes { - t := reflect.TypeOf(n) - if rules, ok := r[t]; ok { - r[t] = append(rules, rule) - } else { - r[t] = []Rule{rule} - } - } -} - -// RegisteredFor will return all rules that are registered for a -// specified ast node. -func (r RuleSet) RegisteredFor(n ast.Node) []Rule { - if rules, found := r[reflect.TypeOf(n)]; found { - return rules - } - return []Rule{} -} diff --git a/vendor/github.com/securego/gosec/rules/archive.go b/vendor/github.com/securego/gosec/rules/archive.go deleted file mode 100644 index 55f390c55..000000000 --- a/vendor/github.com/securego/gosec/rules/archive.go +++ /dev/null @@ -1,60 +0,0 @@ -package rules - -import ( - "go/ast" - "go/types" - - "github.com/securego/gosec" -) - -type archive struct { - gosec.MetaData - calls gosec.CallList - argType string -} - -func (a *archive) ID() string { - return a.MetaData.ID -} - -// Match inspects AST nodes to determine if the filepath.Joins uses any argument derived from type zip.File -func (a *archive) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) { - if node := a.calls.ContainsCallExpr(n, c, false); node != nil { - for _, arg := range node.Args { - var argType types.Type - if selector, ok := arg.(*ast.SelectorExpr); ok { - argType = c.Info.TypeOf(selector.X) - } else if ident, ok := arg.(*ast.Ident); ok { - if ident.Obj != nil && ident.Obj.Kind == ast.Var { - decl := ident.Obj.Decl - if assign, ok := decl.(*ast.AssignStmt); ok { - if selector, ok := assign.Rhs[0].(*ast.SelectorExpr); ok { - argType = c.Info.TypeOf(selector.X) - } - } - } - } - - if argType != nil && argType.String() == a.argType { - return gosec.NewIssue(c, n, a.ID(), a.What, a.Severity, a.Confidence), nil - } - } - } - return nil, nil -} - -// NewArchive creates a new rule which detects the file traversal when extracting zip archives -func NewArchive(id string, conf gosec.Config) (gosec.Rule, []ast.Node) { - calls := gosec.NewCallList() - calls.Add("path/filepath", "Join") - return &archive{ - calls: calls, - argType: "*archive/zip.File", - MetaData: gosec.MetaData{ - ID: id, - Severity: gosec.Medium, - Confidence: gosec.High, - What: "File traversal when extracting zip archive", - }, - }, []ast.Node{(*ast.CallExpr)(nil)} -} diff --git a/vendor/github.com/securego/gosec/rules/bind.go b/vendor/github.com/securego/gosec/rules/bind.go deleted file mode 100644 index 7273588c7..000000000 --- a/vendor/github.com/securego/gosec/rules/bind.go +++ /dev/null @@ -1,83 +0,0 @@ -// (c) Copyright 2016 Hewlett Packard Enterprise Development LP -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package rules - -import ( - "go/ast" - "regexp" - - "github.com/securego/gosec" -) - -// Looks for net.Listen("0.0.0.0") or net.Listen(":8080") -type bindsToAllNetworkInterfaces struct { - gosec.MetaData - calls gosec.CallList - pattern *regexp.Regexp -} - -func (r *bindsToAllNetworkInterfaces) ID() string { - return r.MetaData.ID -} - -func (r *bindsToAllNetworkInterfaces) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) { - callExpr := r.calls.ContainsCallExpr(n, c, false) - if callExpr == nil { - return nil, nil - } - if len(callExpr.Args) > 1 { - arg := callExpr.Args[1] - if bl, ok := arg.(*ast.BasicLit); ok { - if arg, err := gosec.GetString(bl); err == nil { - if r.pattern.MatchString(arg) { - return gosec.NewIssue(c, n, r.ID(), r.What, r.Severity, r.Confidence), nil - } - } - } else if ident, ok := arg.(*ast.Ident); ok { - values := gosec.GetIdentStringValues(ident) - for _, value := range values { - if r.pattern.MatchString(value) { - return gosec.NewIssue(c, n, r.ID(), r.What, r.Severity, r.Confidence), nil - } - } - } - } else if len(callExpr.Args) > 0 { - values := gosec.GetCallStringArgsValues(callExpr.Args[0], c) - for _, value := range values { - if r.pattern.MatchString(value) { - return gosec.NewIssue(c, n, r.ID(), r.What, r.Severity, r.Confidence), nil - } - } - } - return nil, nil -} - -// NewBindsToAllNetworkInterfaces detects socket connections that are setup to -// listen on all network interfaces. -func NewBindsToAllNetworkInterfaces(id string, conf gosec.Config) (gosec.Rule, []ast.Node) { - calls := gosec.NewCallList() - calls.Add("net", "Listen") - calls.Add("crypto/tls", "Listen") - return &bindsToAllNetworkInterfaces{ - calls: calls, - pattern: regexp.MustCompile(`^(0.0.0.0|:).*$`), - MetaData: gosec.MetaData{ - ID: id, - Severity: gosec.Medium, - Confidence: gosec.High, - What: "Binds to all network interfaces", - }, - }, []ast.Node{(*ast.CallExpr)(nil)} -} diff --git a/vendor/github.com/securego/gosec/rules/blacklist.go b/vendor/github.com/securego/gosec/rules/blacklist.go deleted file mode 100644 index 24fbf1221..000000000 --- a/vendor/github.com/securego/gosec/rules/blacklist.go +++ /dev/null @@ -1,94 +0,0 @@ -// (c) Copyright 2016 Hewlett Packard Enterprise Development LP -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package rules - -import ( - "go/ast" - "strings" - - "github.com/securego/gosec" -) - -type blacklistedImport struct { - gosec.MetaData - Blacklisted map[string]string -} - -func unquote(original string) string { - copy := strings.TrimSpace(original) - copy = strings.TrimLeft(copy, `"`) - return strings.TrimRight(copy, `"`) -} - -func (r *blacklistedImport) ID() string { - return r.MetaData.ID -} - -func (r *blacklistedImport) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) { - if node, ok := n.(*ast.ImportSpec); ok { - if description, ok := r.Blacklisted[unquote(node.Path.Value)]; ok { - return gosec.NewIssue(c, node, r.ID(), description, r.Severity, r.Confidence), nil - } - } - return nil, nil -} - -// NewBlacklistedImports reports when a blacklisted import is being used. -// Typically when a deprecated technology is being used. -func NewBlacklistedImports(id string, conf gosec.Config, blacklist map[string]string) (gosec.Rule, []ast.Node) { - return &blacklistedImport{ - MetaData: gosec.MetaData{ - ID: id, - Severity: gosec.Medium, - Confidence: gosec.High, - }, - Blacklisted: blacklist, - }, []ast.Node{(*ast.ImportSpec)(nil)} -} - -// NewBlacklistedImportMD5 fails if MD5 is imported -func NewBlacklistedImportMD5(id string, conf gosec.Config) (gosec.Rule, []ast.Node) { - return NewBlacklistedImports(id, conf, map[string]string{ - "crypto/md5": "Blacklisted import crypto/md5: weak cryptographic primitive", - }) -} - -// NewBlacklistedImportDES fails if DES is imported -func NewBlacklistedImportDES(id string, conf gosec.Config) (gosec.Rule, []ast.Node) { - return NewBlacklistedImports(id, conf, map[string]string{ - "crypto/des": "Blacklisted import crypto/des: weak cryptographic primitive", - }) -} - -// NewBlacklistedImportRC4 fails if DES is imported -func NewBlacklistedImportRC4(id string, conf gosec.Config) (gosec.Rule, []ast.Node) { - return NewBlacklistedImports(id, conf, map[string]string{ - "crypto/rc4": "Blacklisted import crypto/rc4: weak cryptographic primitive", - }) -} - -// NewBlacklistedImportCGI fails if CGI is imported -func NewBlacklistedImportCGI(id string, conf gosec.Config) (gosec.Rule, []ast.Node) { - return NewBlacklistedImports(id, conf, map[string]string{ - "net/http/cgi": "Blacklisted import net/http/cgi: Go versions < 1.6.3 are vulnerable to Httpoxy attack: (CVE-2016-5386)", - }) -} - -// NewBlacklistedImportSHA1 fails if SHA1 is imported -func NewBlacklistedImportSHA1(id string, conf gosec.Config) (gosec.Rule, []ast.Node) { - return NewBlacklistedImports(id, conf, map[string]string{ - "crypto/sha1": "Blacklisted import crypto/sha1: weak cryptographic primitive", - }) -} diff --git a/vendor/github.com/securego/gosec/rules/errors.go b/vendor/github.com/securego/gosec/rules/errors.go deleted file mode 100644 index d2e98b530..000000000 --- a/vendor/github.com/securego/gosec/rules/errors.go +++ /dev/null @@ -1,119 +0,0 @@ -// (c) Copyright 2016 Hewlett Packard Enterprise Development LP -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package rules - -import ( - "go/ast" - "go/types" - - "github.com/securego/gosec" -) - -type noErrorCheck struct { - gosec.MetaData - whitelist gosec.CallList -} - -func (r *noErrorCheck) ID() string { - return r.MetaData.ID -} - -func returnsError(callExpr *ast.CallExpr, ctx *gosec.Context) int { - if tv := ctx.Info.TypeOf(callExpr); tv != nil { - switch t := tv.(type) { - case *types.Tuple: - for pos := 0; pos < t.Len(); pos++ { - variable := t.At(pos) - if variable != nil && variable.Type().String() == "error" { - return pos - } - } - case *types.Named: - if t.String() == "error" { - return 0 - } - } - } - return -1 -} - -func (r *noErrorCheck) Match(n ast.Node, ctx *gosec.Context) (*gosec.Issue, error) { - switch stmt := n.(type) { - case *ast.AssignStmt: - cfg := ctx.Config - if enabled, err := cfg.IsGlobalEnabled(gosec.Audit); err == nil && enabled { - for _, expr := range stmt.Rhs { - if callExpr, ok := expr.(*ast.CallExpr); ok && r.whitelist.ContainsCallExpr(expr, ctx, false) == nil { - pos := returnsError(callExpr, ctx) - if pos < 0 || pos >= len(stmt.Lhs) { - return nil, nil - } - if id, ok := stmt.Lhs[pos].(*ast.Ident); ok && id.Name == "_" { - return gosec.NewIssue(ctx, n, r.ID(), r.What, r.Severity, r.Confidence), nil - } - } - } - } - case *ast.ExprStmt: - if callExpr, ok := stmt.X.(*ast.CallExpr); ok && r.whitelist.ContainsCallExpr(stmt.X, ctx, false) == nil { - pos := returnsError(callExpr, ctx) - if pos >= 0 { - return gosec.NewIssue(ctx, n, r.ID(), r.What, r.Severity, r.Confidence), nil - } - } - } - return nil, nil -} - -// NewNoErrorCheck detects if the returned error is unchecked -func NewNoErrorCheck(id string, conf gosec.Config) (gosec.Rule, []ast.Node) { - // TODO(gm) Come up with sensible defaults here. Or flip it to use a - // black list instead. - whitelist := gosec.NewCallList() - whitelist.AddAll("bytes.Buffer", "Write", "WriteByte", "WriteRune", "WriteString") - whitelist.AddAll("fmt", "Print", "Printf", "Println", "Fprint", "Fprintf", "Fprintln") - whitelist.AddAll("strings.Builder", "Write", "WriteByte", "WriteRune", "WriteString") - whitelist.Add("io.PipeWriter", "CloseWithError") - - if configured, ok := conf["G104"]; ok { - if whitelisted, ok := configured.(map[string]interface{}); ok { - for pkg, funcs := range whitelisted { - if funcs, ok := funcs.([]interface{}); ok { - whitelist.AddAll(pkg, toStringSlice(funcs)...) - } - } - } - } - - return &noErrorCheck{ - MetaData: gosec.MetaData{ - ID: id, - Severity: gosec.Low, - Confidence: gosec.High, - What: "Errors unhandled.", - }, - whitelist: whitelist, - }, []ast.Node{(*ast.AssignStmt)(nil), (*ast.ExprStmt)(nil)} -} - -func toStringSlice(values []interface{}) []string { - result := []string{} - for _, value := range values { - if value, ok := value.(string); ok { - result = append(result, value) - } - } - return result -} diff --git a/vendor/github.com/securego/gosec/rules/fileperms.go b/vendor/github.com/securego/gosec/rules/fileperms.go deleted file mode 100644 index 2a56f35b2..000000000 --- a/vendor/github.com/securego/gosec/rules/fileperms.go +++ /dev/null @@ -1,95 +0,0 @@ -// (c) Copyright 2016 Hewlett Packard Enterprise Development LP -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package rules - -import ( - "fmt" - "go/ast" - "strconv" - - "github.com/securego/gosec" -) - -type filePermissions struct { - gosec.MetaData - mode int64 - pkg string - calls []string -} - -func (r *filePermissions) ID() string { - return r.MetaData.ID -} - -func getConfiguredMode(conf map[string]interface{}, configKey string, defaultMode int64) int64 { - var mode = defaultMode - if value, ok := conf[configKey]; ok { - switch value := value.(type) { - case int64: - mode = value - case string: - if m, e := strconv.ParseInt(value, 0, 64); e != nil { - mode = defaultMode - } else { - mode = m - } - } - } - return mode -} - -func (r *filePermissions) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) { - if callexpr, matched := gosec.MatchCallByPackage(n, c, r.pkg, r.calls...); matched { - modeArg := callexpr.Args[len(callexpr.Args)-1] - if mode, err := gosec.GetInt(modeArg); err == nil && mode > r.mode { - return gosec.NewIssue(c, n, r.ID(), r.What, r.Severity, r.Confidence), nil - } - } - return nil, nil -} - -// NewFilePerms creates a rule to detect file creation with a more permissive than configured -// permission mask. -func NewFilePerms(id string, conf gosec.Config) (gosec.Rule, []ast.Node) { - mode := getConfiguredMode(conf, "G302", 0600) - return &filePermissions{ - mode: mode, - pkg: "os", - calls: []string{"OpenFile", "Chmod"}, - MetaData: gosec.MetaData{ - ID: id, - Severity: gosec.Medium, - Confidence: gosec.High, - What: fmt.Sprintf("Expect file permissions to be %#o or less", mode), - }, - }, []ast.Node{(*ast.CallExpr)(nil)} -} - -// NewMkdirPerms creates a rule to detect directory creation with more permissive than -// configured permission mask. -func NewMkdirPerms(id string, conf gosec.Config) (gosec.Rule, []ast.Node) { - mode := getConfiguredMode(conf, "G301", 0750) - return &filePermissions{ - mode: mode, - pkg: "os", - calls: []string{"Mkdir", "MkdirAll"}, - MetaData: gosec.MetaData{ - ID: id, - Severity: gosec.Medium, - Confidence: gosec.High, - What: fmt.Sprintf("Expect directory permissions to be %#o or less", mode), - }, - }, []ast.Node{(*ast.CallExpr)(nil)} -} diff --git a/vendor/github.com/securego/gosec/rules/hardcoded_credentials.go b/vendor/github.com/securego/gosec/rules/hardcoded_credentials.go deleted file mode 100644 index 17a5cdfe2..000000000 --- a/vendor/github.com/securego/gosec/rules/hardcoded_credentials.go +++ /dev/null @@ -1,147 +0,0 @@ -// (c) Copyright 2016 Hewlett Packard Enterprise Development LP -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package rules - -import ( - "go/ast" - "regexp" - "strconv" - - zxcvbn "github.com/nbutton23/zxcvbn-go" - "github.com/securego/gosec" -) - -type credentials struct { - gosec.MetaData - pattern *regexp.Regexp - entropyThreshold float64 - perCharThreshold float64 - truncate int - ignoreEntropy bool -} - -func (r *credentials) ID() string { - return r.MetaData.ID -} - -func truncate(s string, n int) string { - if n > len(s) { - return s - } - return s[:n] -} - -func (r *credentials) isHighEntropyString(str string) bool { - s := truncate(str, r.truncate) - info := zxcvbn.PasswordStrength(s, []string{}) - entropyPerChar := info.Entropy / float64(len(s)) - return (info.Entropy >= r.entropyThreshold || - (info.Entropy >= (r.entropyThreshold/2) && - entropyPerChar >= r.perCharThreshold)) -} - -func (r *credentials) Match(n ast.Node, ctx *gosec.Context) (*gosec.Issue, error) { - switch node := n.(type) { - case *ast.AssignStmt: - return r.matchAssign(node, ctx) - case *ast.ValueSpec: - return r.matchValueSpec(node, ctx) - } - return nil, nil -} - -func (r *credentials) matchAssign(assign *ast.AssignStmt, ctx *gosec.Context) (*gosec.Issue, error) { - for _, i := range assign.Lhs { - if ident, ok := i.(*ast.Ident); ok { - if r.pattern.MatchString(ident.Name) { - for _, e := range assign.Rhs { - if val, err := gosec.GetString(e); err == nil { - if r.ignoreEntropy || (!r.ignoreEntropy && r.isHighEntropyString(val)) { - return gosec.NewIssue(ctx, assign, r.ID(), r.What, r.Severity, r.Confidence), nil - } - } - } - } - } - } - return nil, nil -} - -func (r *credentials) matchValueSpec(valueSpec *ast.ValueSpec, ctx *gosec.Context) (*gosec.Issue, error) { - for index, ident := range valueSpec.Names { - if r.pattern.MatchString(ident.Name) && valueSpec.Values != nil { - // const foo, bar = "same value" - if len(valueSpec.Values) <= index { - index = len(valueSpec.Values) - 1 - } - if val, err := gosec.GetString(valueSpec.Values[index]); err == nil { - if r.ignoreEntropy || (!r.ignoreEntropy && r.isHighEntropyString(val)) { - return gosec.NewIssue(ctx, valueSpec, r.ID(), r.What, r.Severity, r.Confidence), nil - } - } - } - } - return nil, nil -} - -// NewHardcodedCredentials attempts to find high entropy string constants being -// assigned to variables that appear to be related to credentials. -func NewHardcodedCredentials(id string, conf gosec.Config) (gosec.Rule, []ast.Node) { - pattern := `(?i)passwd|pass|password|pwd|secret|token` - entropyThreshold := 80.0 - perCharThreshold := 3.0 - ignoreEntropy := false - var truncateString = 16 - if val, ok := conf["G101"]; ok { - conf := val.(map[string]string) - if configPattern, ok := conf["pattern"]; ok { - pattern = configPattern - } - if configIgnoreEntropy, ok := conf["ignore_entropy"]; ok { - if parsedBool, err := strconv.ParseBool(configIgnoreEntropy); err == nil { - ignoreEntropy = parsedBool - } - } - if configEntropyThreshold, ok := conf["entropy_threshold"]; ok { - if parsedNum, err := strconv.ParseFloat(configEntropyThreshold, 64); err == nil { - entropyThreshold = parsedNum - } - } - if configCharThreshold, ok := conf["per_char_threshold"]; ok { - if parsedNum, err := strconv.ParseFloat(configCharThreshold, 64); err == nil { - perCharThreshold = parsedNum - } - } - if configTruncate, ok := conf["truncate"]; ok { - if parsedInt, err := strconv.Atoi(configTruncate); err == nil { - truncateString = parsedInt - } - } - } - - return &credentials{ - pattern: regexp.MustCompile(pattern), - entropyThreshold: entropyThreshold, - perCharThreshold: perCharThreshold, - ignoreEntropy: ignoreEntropy, - truncate: truncateString, - MetaData: gosec.MetaData{ - ID: id, - What: "Potential hardcoded credentials", - Confidence: gosec.Low, - Severity: gosec.High, - }, - }, []ast.Node{(*ast.AssignStmt)(nil), (*ast.ValueSpec)(nil)} -} diff --git a/vendor/github.com/securego/gosec/rules/pprof.go b/vendor/github.com/securego/gosec/rules/pprof.go deleted file mode 100644 index 9f5e8cdb3..000000000 --- a/vendor/github.com/securego/gosec/rules/pprof.go +++ /dev/null @@ -1,42 +0,0 @@ -package rules - -import ( - "go/ast" - - "github.com/securego/gosec" -) - -type pprofCheck struct { - gosec.MetaData - importPath string - importName string -} - -// ID returns the ID of the check -func (p *pprofCheck) ID() string { - return p.MetaData.ID -} - -// Match checks for pprof imports -func (p *pprofCheck) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) { - if node, ok := n.(*ast.ImportSpec); ok { - if p.importPath == unquote(node.Path.Value) && node.Name != nil && p.importName == node.Name.Name { - return gosec.NewIssue(c, node, p.ID(), p.What, p.Severity, p.Confidence), nil - } - } - return nil, nil -} - -// NewPprofCheck detects when the profiling endpoint is automatically exposed -func NewPprofCheck(id string, conf gosec.Config) (gosec.Rule, []ast.Node) { - return &pprofCheck{ - MetaData: gosec.MetaData{ - ID: id, - Severity: gosec.High, - Confidence: gosec.High, - What: "Profiling endpoint is automatically exposed on /debug/pprof", - }, - importPath: "net/http/pprof", - importName: "_", - }, []ast.Node{(*ast.ImportSpec)(nil)} -} diff --git a/vendor/github.com/securego/gosec/rules/rand.go b/vendor/github.com/securego/gosec/rules/rand.go deleted file mode 100644 index a2bdabe16..000000000 --- a/vendor/github.com/securego/gosec/rules/rand.go +++ /dev/null @@ -1,55 +0,0 @@ -// (c) Copyright 2016 Hewlett Packard Enterprise Development LP -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package rules - -import ( - "go/ast" - - "github.com/securego/gosec" -) - -type weakRand struct { - gosec.MetaData - funcNames []string - packagePath string -} - -func (w *weakRand) ID() string { - return w.MetaData.ID -} - -func (w *weakRand) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) { - for _, funcName := range w.funcNames { - if _, matched := gosec.MatchCallByPackage(n, c, w.packagePath, funcName); matched { - return gosec.NewIssue(c, n, w.ID(), w.What, w.Severity, w.Confidence), nil - } - } - - return nil, nil -} - -// NewWeakRandCheck detects the use of random number generator that isn't cryptographically secure -func NewWeakRandCheck(id string, conf gosec.Config) (gosec.Rule, []ast.Node) { - return &weakRand{ - funcNames: []string{"Read", "Int"}, - packagePath: "math/rand", - MetaData: gosec.MetaData{ - ID: id, - Severity: gosec.High, - Confidence: gosec.Medium, - What: "Use of weak random number generator (math/rand instead of crypto/rand)", - }, - }, []ast.Node{(*ast.CallExpr)(nil)} -} diff --git a/vendor/github.com/securego/gosec/rules/readfile.go b/vendor/github.com/securego/gosec/rules/readfile.go deleted file mode 100644 index 87158f03f..000000000 --- a/vendor/github.com/securego/gosec/rules/readfile.go +++ /dev/null @@ -1,106 +0,0 @@ -// (c) Copyright 2016 Hewlett Packard Enterprise Development LP -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package rules - -import ( - "go/ast" - "go/types" - - "github.com/securego/gosec" -) - -type readfile struct { - gosec.MetaData - gosec.CallList - pathJoin gosec.CallList -} - -// ID returns the identifier for this rule -func (r *readfile) ID() string { - return r.MetaData.ID -} - -// isJoinFunc checks if there is a filepath.Join or other join function -func (r *readfile) isJoinFunc(n ast.Node, c *gosec.Context) bool { - if call := r.pathJoin.ContainsCallExpr(n, c, false); call != nil { - for _, arg := range call.Args { - // edge case: check if one of the args is a BinaryExpr - if binExp, ok := arg.(*ast.BinaryExpr); ok { - // iterate and resolve all found identities from the BinaryExpr - if _, ok := gosec.FindVarIdentities(binExp, c); ok { - return true - } - } - - // try and resolve identity - if ident, ok := arg.(*ast.Ident); ok { - obj := c.Info.ObjectOf(ident) - if _, ok := obj.(*types.Var); ok && !gosec.TryResolve(ident, c) { - return true - } - } - } - } - return false -} - -// Match inspects AST nodes to determine if the match the methods `os.Open` or `ioutil.ReadFile` -func (r *readfile) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) { - if node := r.ContainsCallExpr(n, c, false); node != nil { - for _, arg := range node.Args { - // handles path joining functions in Arg - // eg. os.Open(filepath.Join("/tmp/", file)) - if callExpr, ok := arg.(*ast.CallExpr); ok { - if r.isJoinFunc(callExpr, c) { - return gosec.NewIssue(c, n, r.ID(), r.What, r.Severity, r.Confidence), nil - } - } - // handles binary string concatenation eg. ioutil.Readfile("/tmp/" + file + "/blob") - if binExp, ok := arg.(*ast.BinaryExpr); ok { - // resolve all found identities from the BinaryExpr - if _, ok := gosec.FindVarIdentities(binExp, c); ok { - return gosec.NewIssue(c, n, r.ID(), r.What, r.Severity, r.Confidence), nil - } - } - - if ident, ok := arg.(*ast.Ident); ok { - obj := c.Info.ObjectOf(ident) - if _, ok := obj.(*types.Var); ok && !gosec.TryResolve(ident, c) { - return gosec.NewIssue(c, n, r.ID(), r.What, r.Severity, r.Confidence), nil - } - } - } - } - return nil, nil -} - -// NewReadFile detects cases where we read files -func NewReadFile(id string, conf gosec.Config) (gosec.Rule, []ast.Node) { - rule := &readfile{ - pathJoin: gosec.NewCallList(), - CallList: gosec.NewCallList(), - MetaData: gosec.MetaData{ - ID: id, - What: "Potential file inclusion via variable", - Severity: gosec.Medium, - Confidence: gosec.High, - }, - } - rule.pathJoin.Add("path/filepath", "Join") - rule.pathJoin.Add("path", "Join") - rule.Add("io/ioutil", "ReadFile") - rule.Add("os", "Open") - return rule, []ast.Node{(*ast.CallExpr)(nil)} -} diff --git a/vendor/github.com/securego/gosec/rules/rsa.go b/vendor/github.com/securego/gosec/rules/rsa.go deleted file mode 100644 index 8f17afee3..000000000 --- a/vendor/github.com/securego/gosec/rules/rsa.go +++ /dev/null @@ -1,58 +0,0 @@ -// (c) Copyright 2016 Hewlett Packard Enterprise Development LP -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package rules - -import ( - "fmt" - "go/ast" - - "github.com/securego/gosec" -) - -type weakKeyStrength struct { - gosec.MetaData - calls gosec.CallList - bits int -} - -func (w *weakKeyStrength) ID() string { - return w.MetaData.ID -} - -func (w *weakKeyStrength) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) { - if callExpr := w.calls.ContainsCallExpr(n, c, false); callExpr != nil { - if bits, err := gosec.GetInt(callExpr.Args[1]); err == nil && bits < (int64)(w.bits) { - return gosec.NewIssue(c, n, w.ID(), w.What, w.Severity, w.Confidence), nil - } - } - return nil, nil -} - -// NewWeakKeyStrength builds a rule that detects RSA keys < 2048 bits -func NewWeakKeyStrength(id string, conf gosec.Config) (gosec.Rule, []ast.Node) { - calls := gosec.NewCallList() - calls.Add("crypto/rsa", "GenerateKey") - bits := 2048 - return &weakKeyStrength{ - calls: calls, - bits: bits, - MetaData: gosec.MetaData{ - ID: id, - Severity: gosec.Medium, - Confidence: gosec.High, - What: fmt.Sprintf("RSA keys should be at least %d bits", bits), - }, - }, []ast.Node{(*ast.CallExpr)(nil)} -} diff --git a/vendor/github.com/securego/gosec/rules/rulelist.go b/vendor/github.com/securego/gosec/rules/rulelist.go deleted file mode 100644 index 97d262a37..000000000 --- a/vendor/github.com/securego/gosec/rules/rulelist.go +++ /dev/null @@ -1,109 +0,0 @@ -// (c) Copyright 2016 Hewlett Packard Enterprise Development LP -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package rules - -import "github.com/securego/gosec" - -// RuleDefinition contains the description of a rule and a mechanism to -// create it. -type RuleDefinition struct { - ID string - Description string - Create gosec.RuleBuilder -} - -// RuleList is a mapping of rule ID's to rule definitions -type RuleList map[string]RuleDefinition - -// Builders returns all the create methods for a given rule list -func (rl RuleList) Builders() map[string]gosec.RuleBuilder { - builders := make(map[string]gosec.RuleBuilder) - for _, def := range rl { - builders[def.ID] = def.Create - } - return builders -} - -// RuleFilter can be used to include or exclude a rule depending on the return -// value of the function -type RuleFilter func(string) bool - -// NewRuleFilter is a closure that will include/exclude the rule ID's based on -// the supplied boolean value. -func NewRuleFilter(action bool, ruleIDs ...string) RuleFilter { - rulelist := make(map[string]bool) - for _, rule := range ruleIDs { - rulelist[rule] = true - } - return func(rule string) bool { - if _, found := rulelist[rule]; found { - return action - } - return !action - } -} - -// Generate the list of rules to use -func Generate(filters ...RuleFilter) RuleList { - rules := []RuleDefinition{ - // misc - {"G101", "Look for hardcoded credentials", NewHardcodedCredentials}, - {"G102", "Bind to all interfaces", NewBindsToAllNetworkInterfaces}, - {"G103", "Audit the use of unsafe block", NewUsingUnsafe}, - {"G104", "Audit errors not checked", NewNoErrorCheck}, - {"G106", "Audit the use of ssh.InsecureIgnoreHostKey function", NewSSHHostKey}, - {"G107", "Url provided to HTTP request as taint input", NewSSRFCheck}, - {"G108", "Profiling endpoint is automatically exposed", NewPprofCheck}, - - // injection - {"G201", "SQL query construction using format string", NewSQLStrFormat}, - {"G202", "SQL query construction using string concatenation", NewSQLStrConcat}, - {"G203", "Use of unescaped data in HTML templates", NewTemplateCheck}, - {"G204", "Audit use of command execution", NewSubproc}, - - // filesystem - {"G301", "Poor file permissions used when creating a directory", NewMkdirPerms}, - {"G302", "Poor file permissions used when creation file or using chmod", NewFilePerms}, - {"G303", "Creating tempfile using a predictable path", NewBadTempFile}, - {"G304", "File path provided as taint input", NewReadFile}, - {"G305", "File path traversal when extracting zip archive", NewArchive}, - - // crypto - {"G401", "Detect the usage of DES, RC4, MD5 or SHA1", NewUsesWeakCryptography}, - {"G402", "Look for bad TLS connection settings", NewIntermediateTLSCheck}, - {"G403", "Ensure minimum RSA key length of 2048 bits", NewWeakKeyStrength}, - {"G404", "Insecure random number source (rand)", NewWeakRandCheck}, - - // blacklist - {"G501", "Import blacklist: crypto/md5", NewBlacklistedImportMD5}, - {"G502", "Import blacklist: crypto/des", NewBlacklistedImportDES}, - {"G503", "Import blacklist: crypto/rc4", NewBlacklistedImportRC4}, - {"G504", "Import blacklist: net/http/cgi", NewBlacklistedImportCGI}, - {"G505", "Import blacklist: crypto/sha1", NewBlacklistedImportSHA1}, - } - - ruleMap := make(map[string]RuleDefinition) - -RULES: - for _, rule := range rules { - for _, filter := range filters { - if filter(rule.ID) { - continue RULES - } - } - ruleMap[rule.ID] = rule - } - return ruleMap -} diff --git a/vendor/github.com/securego/gosec/rules/sql.go b/vendor/github.com/securego/gosec/rules/sql.go deleted file mode 100644 index ccee0a6bd..000000000 --- a/vendor/github.com/securego/gosec/rules/sql.go +++ /dev/null @@ -1,219 +0,0 @@ -// (c) Copyright 2016 Hewlett Packard Enterprise Development LP -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package rules - -import ( - "go/ast" - "regexp" - - "github.com/securego/gosec" -) - -type sqlStatement struct { - gosec.MetaData - - // Contains a list of patterns which must all match for the rule to match. - patterns []*regexp.Regexp -} - -func (s *sqlStatement) ID() string { - return s.MetaData.ID -} - -// See if the string matches the patterns for the statement. -func (s *sqlStatement) MatchPatterns(str string) bool { - for _, pattern := range s.patterns { - if !pattern.MatchString(str) { - return false - } - } - return true -} - -type sqlStrConcat struct { - sqlStatement -} - -func (s *sqlStrConcat) ID() string { - return s.MetaData.ID -} - -// see if we can figure out what it is -func (s *sqlStrConcat) checkObject(n *ast.Ident, c *gosec.Context) bool { - if n.Obj != nil { - return n.Obj.Kind != ast.Var && n.Obj.Kind != ast.Fun - } - - // Try to resolve unresolved identifiers using other files in same package - for _, file := range c.PkgFiles { - if node, ok := file.Scope.Objects[n.String()]; ok { - return node.Kind != ast.Var && node.Kind != ast.Fun - } - } - return false -} - -// Look for "SELECT * FROM table WHERE " + " ' OR 1=1" -func (s *sqlStrConcat) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) { - if node, ok := n.(*ast.BinaryExpr); ok { - if start, ok := node.X.(*ast.BasicLit); ok { - if str, e := gosec.GetString(start); e == nil { - if !s.MatchPatterns(str) { - return nil, nil - } - if _, ok := node.Y.(*ast.BasicLit); ok { - return nil, nil // string cat OK - } - if second, ok := node.Y.(*ast.Ident); ok && s.checkObject(second, c) { - return nil, nil - } - return gosec.NewIssue(c, n, s.ID(), s.What, s.Severity, s.Confidence), nil - } - } - } - return nil, nil -} - -// NewSQLStrConcat looks for cases where we are building SQL strings via concatenation -func NewSQLStrConcat(id string, conf gosec.Config) (gosec.Rule, []ast.Node) { - return &sqlStrConcat{ - sqlStatement: sqlStatement{ - patterns: []*regexp.Regexp{ - regexp.MustCompile(`(?)(SELECT|DELETE|INSERT|UPDATE|INTO|FROM|WHERE) `), - }, - MetaData: gosec.MetaData{ - ID: id, - Severity: gosec.Medium, - Confidence: gosec.High, - What: "SQL string concatenation", - }, - }, - }, []ast.Node{(*ast.BinaryExpr)(nil)} -} - -type sqlStrFormat struct { - sqlStatement - calls gosec.CallList - noIssue gosec.CallList - noIssueQuoted gosec.CallList -} - -// see if we can figure out what it is -func (s *sqlStrFormat) constObject(e ast.Expr, c *gosec.Context) bool { - n, ok := e.(*ast.Ident) - if !ok { - return false - } - - if n.Obj != nil { - return n.Obj.Kind == ast.Con - } - - // Try to resolve unresolved identifiers using other files in same package - for _, file := range c.PkgFiles { - if node, ok := file.Scope.Objects[n.String()]; ok { - return node.Kind == ast.Con - } - } - return false -} - -// Looks for "fmt.Sprintf("SELECT * FROM foo where '%s', userInput)" -func (s *sqlStrFormat) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) { - - // argIndex changes the function argument which gets matched to the regex - argIndex := 0 - - // TODO(gm) improve confidence if database/sql is being used - if node := s.calls.ContainsCallExpr(n, c, false); node != nil { - // if the function is fmt.Fprintf, search for SQL statement in Args[1] instead - if sel, ok := node.Fun.(*ast.SelectorExpr); ok { - if sel.Sel.Name == "Fprintf" { - // if os.Stderr or os.Stdout is in Arg[0], mark as no issue - if arg, ok := node.Args[0].(*ast.SelectorExpr); ok { - if ident, ok := arg.X.(*ast.Ident); ok { - if s.noIssue.Contains(ident.Name, arg.Sel.Name) { - return nil, nil - } - } - } - // the function is Fprintf so set argIndex = 1 - argIndex = 1 - } - } - - // no formatter - if len(node.Args) == 0 { - return nil, nil - } - - var formatter string - - // concats callexpr arg strings together if needed before regex evaluation - if argExpr, ok := node.Args[argIndex].(*ast.BinaryExpr); ok { - if fullStr, ok := gosec.ConcatString(argExpr); ok { - formatter = fullStr - } - } else if arg, e := gosec.GetString(node.Args[argIndex]); e == nil { - formatter = arg - } - if len(formatter) <= 0 { - return nil, nil - } - - // If all formatter args are quoted or constant, then the SQL construction is safe - if argIndex+1 < len(node.Args) { - allSafe := true - for _, arg := range node.Args[argIndex+1:] { - if n := s.noIssueQuoted.ContainsCallExpr(arg, c, true); n == nil && !s.constObject(arg, c) { - allSafe = false - break - } - } - if allSafe { - return nil, nil - } - } - if s.MatchPatterns(formatter) { - return gosec.NewIssue(c, n, s.ID(), s.What, s.Severity, s.Confidence), nil - } - } - return nil, nil -} - -// NewSQLStrFormat looks for cases where we're building SQL query strings using format strings -func NewSQLStrFormat(id string, conf gosec.Config) (gosec.Rule, []ast.Node) { - rule := &sqlStrFormat{ - calls: gosec.NewCallList(), - noIssue: gosec.NewCallList(), - noIssueQuoted: gosec.NewCallList(), - sqlStatement: sqlStatement{ - patterns: []*regexp.Regexp{ - regexp.MustCompile("(?)(SELECT|DELETE|INSERT|UPDATE|INTO|FROM|WHERE) "), - regexp.MustCompile("%[^bdoxXfFp]"), - }, - MetaData: gosec.MetaData{ - ID: id, - Severity: gosec.Medium, - Confidence: gosec.High, - What: "SQL string formatting", - }, - }, - } - rule.calls.AddAll("fmt", "Sprint", "Sprintf", "Sprintln", "Fprintf") - rule.noIssue.AddAll("os", "Stdout", "Stderr") - rule.noIssueQuoted.Add("github.com/lib/pq", "QuoteIdentifier") - return rule, []ast.Node{(*ast.CallExpr)(nil)} -} diff --git a/vendor/github.com/securego/gosec/rules/ssh.go b/vendor/github.com/securego/gosec/rules/ssh.go deleted file mode 100644 index 7496b5f89..000000000 --- a/vendor/github.com/securego/gosec/rules/ssh.go +++ /dev/null @@ -1,38 +0,0 @@ -package rules - -import ( - "go/ast" - - "github.com/securego/gosec" -) - -type sshHostKey struct { - gosec.MetaData - pkg string - calls []string -} - -func (r *sshHostKey) ID() string { - return r.MetaData.ID -} - -func (r *sshHostKey) Match(n ast.Node, c *gosec.Context) (gi *gosec.Issue, err error) { - if _, matches := gosec.MatchCallByPackage(n, c, r.pkg, r.calls...); matches { - return gosec.NewIssue(c, n, r.ID(), r.What, r.Severity, r.Confidence), nil - } - return nil, nil -} - -// NewSSHHostKey rule detects the use of insecure ssh HostKeyCallback. -func NewSSHHostKey(id string, conf gosec.Config) (gosec.Rule, []ast.Node) { - return &sshHostKey{ - pkg: "golang.org/x/crypto/ssh", - calls: []string{"InsecureIgnoreHostKey"}, - MetaData: gosec.MetaData{ - ID: id, - What: "Use of ssh InsecureIgnoreHostKey should be audited", - Severity: gosec.Medium, - Confidence: gosec.High, - }, - }, []ast.Node{(*ast.CallExpr)(nil)} -} diff --git a/vendor/github.com/securego/gosec/rules/ssrf.go b/vendor/github.com/securego/gosec/rules/ssrf.go deleted file mode 100644 index b1409a5f7..000000000 --- a/vendor/github.com/securego/gosec/rules/ssrf.go +++ /dev/null @@ -1,66 +0,0 @@ -package rules - -import ( - "go/ast" - "go/types" - - "github.com/securego/gosec" -) - -type ssrf struct { - gosec.MetaData - gosec.CallList -} - -// ID returns the identifier for this rule -func (r *ssrf) ID() string { - return r.MetaData.ID -} - -// ResolveVar tries to resolve the first argument of a call expression -// The first argument is the url -func (r *ssrf) ResolveVar(n *ast.CallExpr, c *gosec.Context) bool { - if len(n.Args) > 0 { - arg := n.Args[0] - if ident, ok := arg.(*ast.Ident); ok { - obj := c.Info.ObjectOf(ident) - if _, ok := obj.(*types.Var); ok { - scope := c.Pkg.Scope() - if scope != nil && scope.Lookup(ident.Name) != nil { - // a URL defined in a variable at package scope can be changed at any time - return true - } - if !gosec.TryResolve(ident, c) { - return true - } - } - } - } - return false -} - -// Match inspects AST nodes to determine if certain net/http methods are called with variable input -func (r *ssrf) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) { - // Call expression is using http package directly - if node := r.ContainsCallExpr(n, c, false); node != nil { - if r.ResolveVar(node, c) { - return gosec.NewIssue(c, n, r.ID(), r.What, r.Severity, r.Confidence), nil - } - } - return nil, nil -} - -// NewSSRFCheck detects cases where HTTP requests are sent -func NewSSRFCheck(id string, conf gosec.Config) (gosec.Rule, []ast.Node) { - rule := &ssrf{ - CallList: gosec.NewCallList(), - MetaData: gosec.MetaData{ - ID: id, - What: "Potential HTTP request made with variable url", - Severity: gosec.Medium, - Confidence: gosec.Medium, - }, - } - rule.AddAll("net/http", "Do", "Get", "Head", "Post", "PostForm", "RoundTrip") - return rule, []ast.Node{(*ast.CallExpr)(nil)} -} diff --git a/vendor/github.com/securego/gosec/rules/subproc.go b/vendor/github.com/securego/gosec/rules/subproc.go deleted file mode 100644 index c45289891..000000000 --- a/vendor/github.com/securego/gosec/rules/subproc.go +++ /dev/null @@ -1,66 +0,0 @@ -// (c) Copyright 2016 Hewlett Packard Enterprise Development LP -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package rules - -import ( - "go/ast" - "go/types" - - "github.com/securego/gosec" -) - -type subprocess struct { - gosec.MetaData - gosec.CallList -} - -func (r *subprocess) ID() string { - return r.MetaData.ID -} - -// TODO(gm) The only real potential for command injection with a Go project -// is something like this: -// -// syscall.Exec("/bin/sh", []string{"-c", tainted}) -// -// E.g. Input is correctly escaped but the execution context being used -// is unsafe. For example: -// -// syscall.Exec("echo", "foobar" + tainted) -func (r *subprocess) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) { - if node := r.ContainsCallExpr(n, c, false); node != nil { - for _, arg := range node.Args { - if ident, ok := arg.(*ast.Ident); ok { - obj := c.Info.ObjectOf(ident) - if _, ok := obj.(*types.Var); ok && !gosec.TryResolve(ident, c) { - return gosec.NewIssue(c, n, r.ID(), "Subprocess launched with variable", gosec.Medium, gosec.High), nil - } - } else if !gosec.TryResolve(arg, c) { - // the arg is not a constant or a variable but instead a function call or os.Args[i] - return gosec.NewIssue(c, n, r.ID(), "Subprocess launched with function call as argument or cmd arguments", gosec.Medium, gosec.High), nil - } - } - } - return nil, nil -} - -// NewSubproc detects cases where we are forking out to an external process -func NewSubproc(id string, conf gosec.Config) (gosec.Rule, []ast.Node) { - rule := &subprocess{gosec.MetaData{ID: id}, gosec.NewCallList()} - rule.Add("os/exec", "Command") - rule.Add("os/exec", "CommandContext") - rule.Add("syscall", "Exec") - return rule, []ast.Node{(*ast.CallExpr)(nil)} -} diff --git a/vendor/github.com/securego/gosec/rules/tempfiles.go b/vendor/github.com/securego/gosec/rules/tempfiles.go deleted file mode 100644 index 095544d39..000000000 --- a/vendor/github.com/securego/gosec/rules/tempfiles.go +++ /dev/null @@ -1,58 +0,0 @@ -// (c) Copyright 2016 Hewlett Packard Enterprise Development LP -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package rules - -import ( - "go/ast" - "regexp" - - "github.com/securego/gosec" -) - -type badTempFile struct { - gosec.MetaData - calls gosec.CallList - args *regexp.Regexp -} - -func (t *badTempFile) ID() string { - return t.MetaData.ID -} - -func (t *badTempFile) Match(n ast.Node, c *gosec.Context) (gi *gosec.Issue, err error) { - if node := t.calls.ContainsCallExpr(n, c, false); node != nil { - if arg, e := gosec.GetString(node.Args[0]); t.args.MatchString(arg) && e == nil { - return gosec.NewIssue(c, n, t.ID(), t.What, t.Severity, t.Confidence), nil - } - } - return nil, nil -} - -// NewBadTempFile detects direct writes to predictable path in temporary directory -func NewBadTempFile(id string, conf gosec.Config) (gosec.Rule, []ast.Node) { - calls := gosec.NewCallList() - calls.Add("io/ioutil", "WriteFile") - calls.Add("os", "Create") - return &badTempFile{ - calls: calls, - args: regexp.MustCompile(`^/tmp/.*$|^/var/tmp/.*$`), - MetaData: gosec.MetaData{ - ID: id, - Severity: gosec.Medium, - Confidence: gosec.High, - What: "File creation in shared tmp directory without using ioutil.Tempfile", - }, - }, []ast.Node{(*ast.CallExpr)(nil)} -} diff --git a/vendor/github.com/securego/gosec/rules/templates.go b/vendor/github.com/securego/gosec/rules/templates.go deleted file mode 100644 index 0bff68754..000000000 --- a/vendor/github.com/securego/gosec/rules/templates.go +++ /dev/null @@ -1,61 +0,0 @@ -// (c) Copyright 2016 Hewlett Packard Enterprise Development LP -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package rules - -import ( - "go/ast" - - "github.com/securego/gosec" -) - -type templateCheck struct { - gosec.MetaData - calls gosec.CallList -} - -func (t *templateCheck) ID() string { - return t.MetaData.ID -} - -func (t *templateCheck) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) { - if node := t.calls.ContainsCallExpr(n, c, false); node != nil { - for _, arg := range node.Args { - if _, ok := arg.(*ast.BasicLit); !ok { // basic lits are safe - return gosec.NewIssue(c, n, t.ID(), t.What, t.Severity, t.Confidence), nil - } - } - } - return nil, nil -} - -// NewTemplateCheck constructs the template check rule. This rule is used to -// find use of templates where HTML/JS escaping is not being used -func NewTemplateCheck(id string, conf gosec.Config) (gosec.Rule, []ast.Node) { - - calls := gosec.NewCallList() - calls.Add("html/template", "HTML") - calls.Add("html/template", "HTMLAttr") - calls.Add("html/template", "JS") - calls.Add("html/template", "URL") - return &templateCheck{ - calls: calls, - MetaData: gosec.MetaData{ - ID: id, - Severity: gosec.Medium, - Confidence: gosec.Low, - What: "this method will not auto-escape HTML. Verify data is well formed.", - }, - }, []ast.Node{(*ast.CallExpr)(nil)} -} diff --git a/vendor/github.com/securego/gosec/rules/tls.go b/vendor/github.com/securego/gosec/rules/tls.go deleted file mode 100644 index d4b7fa2be..000000000 --- a/vendor/github.com/securego/gosec/rules/tls.go +++ /dev/null @@ -1,130 +0,0 @@ -// (c) Copyright 2016 Hewlett Packard Enterprise Development LP -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//go:generate tlsconfig - -package rules - -import ( - "fmt" - "go/ast" - - "github.com/securego/gosec" -) - -type insecureConfigTLS struct { - gosec.MetaData - MinVersion int16 - MaxVersion int16 - requiredType string - goodCiphers []string -} - -func (t *insecureConfigTLS) ID() string { - return t.MetaData.ID -} - -func stringInSlice(a string, list []string) bool { - for _, b := range list { - if b == a { - return true - } - } - return false -} - -func (t *insecureConfigTLS) processTLSCipherSuites(n ast.Node, c *gosec.Context) *gosec.Issue { - - if ciphers, ok := n.(*ast.CompositeLit); ok { - for _, cipher := range ciphers.Elts { - if ident, ok := cipher.(*ast.SelectorExpr); ok { - if !stringInSlice(ident.Sel.Name, t.goodCiphers) { - err := fmt.Sprintf("TLS Bad Cipher Suite: %s", ident.Sel.Name) - return gosec.NewIssue(c, ident, t.ID(), err, gosec.High, gosec.High) - } - } - } - } - return nil -} - -func (t *insecureConfigTLS) processTLSConfVal(n *ast.KeyValueExpr, c *gosec.Context) *gosec.Issue { - if ident, ok := n.Key.(*ast.Ident); ok { - switch ident.Name { - - case "InsecureSkipVerify": - if node, ok := n.Value.(*ast.Ident); ok { - if node.Name != "false" { - return gosec.NewIssue(c, n, t.ID(), "TLS InsecureSkipVerify set true.", gosec.High, gosec.High) - } - } else { - // TODO(tk): symbol tab look up to get the actual value - return gosec.NewIssue(c, n, t.ID(), "TLS InsecureSkipVerify may be true.", gosec.High, gosec.Low) - } - - case "PreferServerCipherSuites": - if node, ok := n.Value.(*ast.Ident); ok { - if node.Name == "false" { - return gosec.NewIssue(c, n, t.ID(), "TLS PreferServerCipherSuites set false.", gosec.Medium, gosec.High) - } - } else { - // TODO(tk): symbol tab look up to get the actual value - return gosec.NewIssue(c, n, t.ID(), "TLS PreferServerCipherSuites may be false.", gosec.Medium, gosec.Low) - } - - case "MinVersion": - if ival, ierr := gosec.GetInt(n.Value); ierr == nil { - if (int16)(ival) < t.MinVersion { - return gosec.NewIssue(c, n, t.ID(), "TLS MinVersion too low.", gosec.High, gosec.High) - } - // TODO(tk): symbol tab look up to get the actual value - return gosec.NewIssue(c, n, t.ID(), "TLS MinVersion may be too low.", gosec.High, gosec.Low) - } - - case "MaxVersion": - if ival, ierr := gosec.GetInt(n.Value); ierr == nil { - if (int16)(ival) < t.MaxVersion { - return gosec.NewIssue(c, n, t.ID(), "TLS MaxVersion too low.", gosec.High, gosec.High) - } - // TODO(tk): symbol tab look up to get the actual value - return gosec.NewIssue(c, n, t.ID(), "TLS MaxVersion may be too low.", gosec.High, gosec.Low) - } - - case "CipherSuites": - if ret := t.processTLSCipherSuites(n.Value, c); ret != nil { - return ret - } - - } - - } - return nil -} - -func (t *insecureConfigTLS) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) { - if complit, ok := n.(*ast.CompositeLit); ok && complit.Type != nil { - actualType := c.Info.TypeOf(complit.Type) - if actualType != nil && actualType.String() == t.requiredType { - for _, elt := range complit.Elts { - if kve, ok := elt.(*ast.KeyValueExpr); ok { - issue := t.processTLSConfVal(kve, c) - if issue != nil { - return issue, nil - } - } - } - } - } - return nil, nil -} diff --git a/vendor/github.com/securego/gosec/rules/tls_config.go b/vendor/github.com/securego/gosec/rules/tls_config.go deleted file mode 100644 index 42ec85db4..000000000 --- a/vendor/github.com/securego/gosec/rules/tls_config.go +++ /dev/null @@ -1,88 +0,0 @@ -package rules - -import ( - "go/ast" - - "github.com/securego/gosec" -) - -// NewModernTLSCheck creates a check for Modern TLS ciphers -// DO NOT EDIT - generated by tlsconfig tool -func NewModernTLSCheck(id string, conf gosec.Config) (gosec.Rule, []ast.Node) { - return &insecureConfigTLS{ - MetaData: gosec.MetaData{ID: id}, - requiredType: "crypto/tls.Config", - MinVersion: 0x0304, - MaxVersion: 0x0304, - goodCiphers: []string{ - "TLS_AES_128_GCM_SHA256", - "TLS_AES_256_GCM_SHA384", - "TLS_CHACHA20_POLY1305_SHA256", - }, - }, []ast.Node{(*ast.CompositeLit)(nil)} -} - -// NewIntermediateTLSCheck creates a check for Intermediate TLS ciphers -// DO NOT EDIT - generated by tlsconfig tool -func NewIntermediateTLSCheck(id string, conf gosec.Config) (gosec.Rule, []ast.Node) { - return &insecureConfigTLS{ - MetaData: gosec.MetaData{ID: id}, - requiredType: "crypto/tls.Config", - MinVersion: 0x0303, - MaxVersion: 0x0304, - goodCiphers: []string{ - "TLS_AES_128_GCM_SHA256", - "TLS_AES_256_GCM_SHA384", - "TLS_CHACHA20_POLY1305_SHA256", - "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", - "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", - "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", - "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", - "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305", - "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305", - "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256", - "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384", - }, - }, []ast.Node{(*ast.CompositeLit)(nil)} -} - -// NewOldTLSCheck creates a check for Old TLS ciphers -// DO NOT EDIT - generated by tlsconfig tool -func NewOldTLSCheck(id string, conf gosec.Config) (gosec.Rule, []ast.Node) { - return &insecureConfigTLS{ - MetaData: gosec.MetaData{ID: id}, - requiredType: "crypto/tls.Config", - MinVersion: 0x0301, - MaxVersion: 0x0304, - goodCiphers: []string{ - "TLS_AES_128_GCM_SHA256", - "TLS_AES_256_GCM_SHA384", - "TLS_CHACHA20_POLY1305_SHA256", - "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", - "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", - "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", - "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", - "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305", - "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305", - "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256", - "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384", - "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", - "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", - "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", - "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", - "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384", - "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384", - "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", - "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", - "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256", - "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256", - "TLS_RSA_WITH_AES_128_GCM_SHA256", - "TLS_RSA_WITH_AES_256_GCM_SHA384", - "TLS_RSA_WITH_AES_128_CBC_SHA256", - "TLS_RSA_WITH_AES_256_CBC_SHA256", - "TLS_RSA_WITH_AES_128_CBC_SHA", - "TLS_RSA_WITH_AES_256_CBC_SHA", - "TLS_RSA_WITH_3DES_EDE_CBC_SHA", - }, - }, []ast.Node{(*ast.CompositeLit)(nil)} -} diff --git a/vendor/github.com/securego/gosec/rules/unsafe.go b/vendor/github.com/securego/gosec/rules/unsafe.go deleted file mode 100644 index f4a38be3d..000000000 --- a/vendor/github.com/securego/gosec/rules/unsafe.go +++ /dev/null @@ -1,53 +0,0 @@ -// (c) Copyright 2016 Hewlett Packard Enterprise Development LP -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package rules - -import ( - "go/ast" - - "github.com/securego/gosec" -) - -type usingUnsafe struct { - gosec.MetaData - pkg string - calls []string -} - -func (r *usingUnsafe) ID() string { - return r.MetaData.ID -} - -func (r *usingUnsafe) Match(n ast.Node, c *gosec.Context) (gi *gosec.Issue, err error) { - if _, matches := gosec.MatchCallByPackage(n, c, r.pkg, r.calls...); matches { - return gosec.NewIssue(c, n, r.ID(), r.What, r.Severity, r.Confidence), nil - } - return nil, nil -} - -// NewUsingUnsafe rule detects the use of the unsafe package. This is only -// really useful for auditing purposes. -func NewUsingUnsafe(id string, conf gosec.Config) (gosec.Rule, []ast.Node) { - return &usingUnsafe{ - pkg: "unsafe", - calls: []string{"Alignof", "Offsetof", "Sizeof", "Pointer"}, - MetaData: gosec.MetaData{ - ID: id, - What: "Use of unsafe calls should be audited", - Severity: gosec.Low, - Confidence: gosec.High, - }, - }, []ast.Node{(*ast.CallExpr)(nil)} -} diff --git a/vendor/github.com/securego/gosec/rules/weakcrypto.go b/vendor/github.com/securego/gosec/rules/weakcrypto.go deleted file mode 100644 index 60c63aa84..000000000 --- a/vendor/github.com/securego/gosec/rules/weakcrypto.go +++ /dev/null @@ -1,58 +0,0 @@ -// (c) Copyright 2016 Hewlett Packard Enterprise Development LP -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package rules - -import ( - "go/ast" - - "github.com/securego/gosec" -) - -type usesWeakCryptography struct { - gosec.MetaData - blacklist map[string][]string -} - -func (r *usesWeakCryptography) ID() string { - return r.MetaData.ID -} - -func (r *usesWeakCryptography) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) { - for pkg, funcs := range r.blacklist { - if _, matched := gosec.MatchCallByPackage(n, c, pkg, funcs...); matched { - return gosec.NewIssue(c, n, r.ID(), r.What, r.Severity, r.Confidence), nil - } - } - return nil, nil -} - -// NewUsesWeakCryptography detects uses of des.* md5.* or rc4.* -func NewUsesWeakCryptography(id string, conf gosec.Config) (gosec.Rule, []ast.Node) { - calls := make(map[string][]string) - calls["crypto/des"] = []string{"NewCipher", "NewTripleDESCipher"} - calls["crypto/md5"] = []string{"New", "Sum"} - calls["crypto/sha1"] = []string{"New", "Sum"} - calls["crypto/rc4"] = []string{"NewCipher"} - rule := &usesWeakCryptography{ - blacklist: calls, - MetaData: gosec.MetaData{ - ID: id, - Severity: gosec.Medium, - Confidence: gosec.High, - What: "Use of weak cryptographic primitive", - }, - } - return rule, []ast.Node{(*ast.CallExpr)(nil)} -} diff --git a/vendor/github.com/securego/gosec/testutils/log.go b/vendor/github.com/securego/gosec/testutils/log.go deleted file mode 100644 index 460cb7117..000000000 --- a/vendor/github.com/securego/gosec/testutils/log.go +++ /dev/null @@ -1,12 +0,0 @@ -package testutils - -import ( - "bytes" - "log" -) - -// NewLogger returns a logger and the buffer that it will be written to -func NewLogger() (*log.Logger, *bytes.Buffer) { - var buf bytes.Buffer - return log.New(&buf, "", log.Lshortfile), &buf -} diff --git a/vendor/github.com/securego/gosec/testutils/pkg.go b/vendor/github.com/securego/gosec/testutils/pkg.go deleted file mode 100644 index 65bca9788..000000000 --- a/vendor/github.com/securego/gosec/testutils/pkg.go +++ /dev/null @@ -1,143 +0,0 @@ -package testutils - -import ( - "fmt" - "go/build" - "io/ioutil" - "log" - "os" - "path" - "strings" - - "github.com/securego/gosec" - "golang.org/x/tools/go/packages" -) - -type buildObj struct { - pkg *build.Package - config *packages.Config - pkgs []*packages.Package -} - -// TestPackage is a mock package for testing purposes -type TestPackage struct { - Path string - Files map[string]string - ondisk bool - build *buildObj -} - -// NewTestPackage will create a new and empty package. Must call Close() to cleanup -// auxiliary files -func NewTestPackage() *TestPackage { - workingDir, err := ioutil.TempDir("", "gosecs_test") - if err != nil { - return nil - } - - return &TestPackage{ - Path: workingDir, - Files: make(map[string]string), - ondisk: false, - build: nil, - } -} - -// AddFile inserts the filename and contents into the package contents -func (p *TestPackage) AddFile(filename, content string) { - p.Files[path.Join(p.Path, filename)] = content -} - -func (p *TestPackage) write() error { - if p.ondisk { - return nil - } - for filename, content := range p.Files { - if e := ioutil.WriteFile(filename, []byte(content), 0644); e != nil { - return e - } - } - p.ondisk = true - return nil -} - -// Build ensures all files are persisted to disk and built -func (p *TestPackage) Build() error { - if p.build != nil { - return nil - } - if err := p.write(); err != nil { - return err - } - basePackage, err := build.Default.ImportDir(p.Path, build.ImportComment) - if err != nil { - return err - } - - var packageFiles []string - for _, filename := range basePackage.GoFiles { - packageFiles = append(packageFiles, path.Join(p.Path, filename)) - } - - conf := &packages.Config{ - Mode: gosec.LoadMode, - Tests: false, - } - pkgs, err := packages.Load(conf, packageFiles...) - if err != nil { - return err - } - p.build = &buildObj{ - pkg: basePackage, - config: conf, - pkgs: pkgs, - } - return nil -} - -// CreateContext builds a context out of supplied package context -func (p *TestPackage) CreateContext(filename string) *gosec.Context { - if err := p.Build(); err != nil { - log.Fatal(err) - return nil - } - - for _, pkg := range p.build.pkgs { - for _, file := range pkg.Syntax { - pkgFile := pkg.Fset.File(file.Pos()).Name() - strip := fmt.Sprintf("%s%c", p.Path, os.PathSeparator) - pkgFile = strings.TrimPrefix(pkgFile, strip) - if pkgFile == filename { - ctx := &gosec.Context{ - FileSet: pkg.Fset, - Root: file, - Config: gosec.NewConfig(), - Info: pkg.TypesInfo, - Pkg: pkg.Types, - Imports: gosec.NewImportTracker(), - } - ctx.Imports.TrackPackages(ctx.Pkg.Imports()...) - return ctx - } - } - } - return nil -} - -// Close will delete the package and all files in that directory -func (p *TestPackage) Close() { - if p.ondisk { - err := os.RemoveAll(p.Path) - if err != nil { - log.Fatal(err) - } - } -} - -// Pkgs returns the current built packages -func (p *TestPackage) Pkgs() []*packages.Package { - if p.build != nil { - return p.build.pkgs - } - return []*packages.Package{} -} diff --git a/vendor/github.com/securego/gosec/testutils/source.go b/vendor/github.com/securego/gosec/testutils/source.go deleted file mode 100644 index 8cb16a3df..000000000 --- a/vendor/github.com/securego/gosec/testutils/source.go +++ /dev/null @@ -1,1472 +0,0 @@ -package testutils - -import "github.com/securego/gosec" - -// CodeSample encapsulates a snippet of source code that compiles, and how many errors should be detected -type CodeSample struct { - Code []string - Errors int - Config gosec.Config -} - -var ( - // SampleCodeG101 code snippets for hardcoded credentials - SampleCodeG101 = []CodeSample{{[]string{` -package main -import "fmt" -func main() { - username := "admin" - password := "f62e5bcda4fae4f82370da0c6f20697b8f8447ef" - fmt.Println("Doing something with: ", username, password) -}`}, 1, gosec.NewConfig()}, {[]string{` -// Entropy check should not report this error by default -package main -import "fmt" -func main() { - username := "admin" - password := "secret" - fmt.Println("Doing something with: ", username, password) -}`}, 0, gosec.NewConfig()}, {[]string{` -package main -import "fmt" -var password = "f62e5bcda4fae4f82370da0c6f20697b8f8447ef" -func main() { - username := "admin" - fmt.Println("Doing something with: ", username, password) -}`}, 1, gosec.NewConfig()}, {[]string{` -package main -import "fmt" -const password = "f62e5bcda4fae4f82370da0c6f20697b8f8447ef" -func main() { - username := "admin" - fmt.Println("Doing something with: ", username, password) -}`}, 1, gosec.NewConfig()}, {[]string{` -package main -import "fmt" -const ( - username = "user" - password = "f62e5bcda4fae4f82370da0c6f20697b8f8447ef" -) -func main() { - fmt.Println("Doing something with: ", username, password) -}`}, 1, gosec.NewConfig()}, {[]string{` -package main -var password string -func init() { - password = "f62e5bcda4fae4f82370da0c6f20697b8f8447ef" -}`}, 1, gosec.NewConfig()}, {[]string{` -package main -const ( - ATNStateSomethingElse = 1 - ATNStateTokenStart = 42 -) -func main() { - println(ATNStateTokenStart) -}`}, 0, gosec.NewConfig()}, {[]string{` -package main -const ( - ATNStateTokenStart = "f62e5bcda4fae4f82370da0c6f20697b8f8447ef" -) -func main() { - println(ATNStateTokenStart) -}`}, 1, gosec.NewConfig()}} - - // SampleCodeG102 code snippets for network binding - SampleCodeG102 = []CodeSample{ - // Bind to all networks explicitly - {[]string{` -package main -import ( - "log" - "net" -) -func main() { - l, err := net.Listen("tcp", "0.0.0.0:2000") - if err != nil { - log.Fatal(err) - } - defer l.Close() -}`}, 1, gosec.NewConfig()}, - - // Bind to all networks implicitly (default if host omitted) - {[]string{` -package main -import ( - "log" - "net" -) -func main() { - l, err := net.Listen("tcp", ":2000") - if err != nil { - log.Fatal(err) - } - defer l.Close() -}`}, 1, gosec.NewConfig()}, - // Bind to all networks indirectly through a parsing function - {[]string{` -package main -import ( - "log" - "net" -) -func parseListenAddr(listenAddr string) (network string, addr string) { - return "", "" -} -func main() { - addr := ":2000" - l, err := net.Listen(parseListenAddr(addr)) - if err != nil { - log.Fatal(err) - } - defer l.Close() -}`}, 1, gosec.NewConfig()}, - // Bind to all networks indirectly through a parsing function - {[]string{` -package main -import ( - "log" - "net" -) -const addr = ":2000" -func parseListenAddr(listenAddr string) (network string, addr string) { - return "", "" -} -func main() { - l, err := net.Listen(parseListenAddr(addr)) - if err != nil { - log.Fatal(err) - } - defer l.Close() -}`}, 1, gosec.NewConfig()}, - {[]string{` -package main -import ( - "log" - "net" -) -const addr = "0.0.0.0:2000" - -func main() { - l, err := net.Listen("tcp", addr) - if err != nil { - log.Fatal(err) - } - defer l.Close() -}`}, 1, gosec.NewConfig()}, - } - // SampleCodeG103 find instances of unsafe blocks for auditing purposes - SampleCodeG103 = []CodeSample{ - {[]string{` -package main -import ( - "fmt" - "unsafe" -) -type Fake struct{} -func (Fake) Good() {} -func main() { - unsafeM := Fake{} - unsafeM.Good() - intArray := [...]int{1, 2} - fmt.Printf("\nintArray: %v\n", intArray) - intPtr := &intArray[0] - fmt.Printf("\nintPtr=%p, *intPtr=%d.\n", intPtr, *intPtr) - addressHolder := uintptr(unsafe.Pointer(intPtr)) + unsafe.Sizeof(intArray[0]) - intPtr = (*int)(unsafe.Pointer(addressHolder)) - fmt.Printf("\nintPtr=%p, *intPtr=%d.\n\n", intPtr, *intPtr) -}`}, 3, gosec.NewConfig()}} - - // SampleCodeG104 finds errors that aren't being handled - SampleCodeG104 = []CodeSample{ - {[]string{` -package main -import "fmt" -func test() (int,error) { - return 0, nil -} -func main() { - v, _ := test() - fmt.Println(v) -}`}, 0, gosec.NewConfig()}, {[]string{` -package main -import ( - "io/ioutil" - "os" - "fmt" -) -func a() error { - return fmt.Errorf("This is an error") -} -func b() { - fmt.Println("b") - ioutil.WriteFile("foo.txt", []byte("bar"), os.ModeExclusive) -} -func c() string { - return fmt.Sprintf("This isn't anything") -} -func main() { - _ = a() - a() - b() - c() -}`}, 2, gosec.NewConfig()}, {[]string{` -package main -import "fmt" -func test() error { - return nil -} -func main() { - e := test() - fmt.Println(e) -}`}, 0, gosec.NewConfig()}, {[]string{` -// +build go1.10 - -package main -import "strings" -func main() { - var buf strings.Builder - _, err := buf.WriteString("test string") - if err != nil { - panic(err) - } -}`, ` -package main -func dummy(){} -`}, 0, gosec.NewConfig()}, {[]string{` -package main -import ( - "io/ioutil" - "os" - "fmt" -) -func a() { - fmt.Println("a") - ioutil.WriteFile("foo.txt", []byte("bar"), os.ModeExclusive) -} -func main() { - a() -}`}, 0, gosec.Config{"G104": map[string]interface{}{"io/ioutil": []interface{}{"WriteFile"}}}}} - - // SampleCodeG104Audit finds errors that aren't being handled in audit mode - SampleCodeG104Audit = []CodeSample{ - {[]string{` -package main -import "fmt" -func test() (int,error) { - return 0, nil -} -func main() { - v, _ := test() - fmt.Println(v) -}`}, 1, gosec.Config{gosec.Globals: map[gosec.GlobalOption]string{gosec.Audit: "enabled"}}}, {[]string{` -package main -import ( - "io/ioutil" - "os" - "fmt" -) -func a() error { - return fmt.Errorf("This is an error") -} -func b() { - fmt.Println("b") - ioutil.WriteFile("foo.txt", []byte("bar"), os.ModeExclusive) -} -func c() string { - return fmt.Sprintf("This isn't anything") -} -func main() { - _ = a() - a() - b() - c() -}`}, 3, gosec.Config{gosec.Globals: map[gosec.GlobalOption]string{gosec.Audit: "enabled"}}}, {[]string{` -package main -import "fmt" -func test() error { - return nil -} -func main() { - e := test() - fmt.Println(e) -}`}, 0, gosec.Config{gosec.Globals: map[gosec.GlobalOption]string{gosec.Audit: "enabled"}}}, {[]string{` -// +build go1.10 - -package main -import "strings" -func main() { - var buf strings.Builder - _, err := buf.WriteString("test string") - if err != nil { - panic(err) - } -}`, ` -package main -func dummy(){} -`}, 0, gosec.Config{gosec.Globals: map[gosec.GlobalOption]string{gosec.Audit: "enabled"}}}} - - // SampleCodeG106 - ssh InsecureIgnoreHostKey - SampleCodeG106 = []CodeSample{{[]string{` -package main -import ( - "golang.org/x/crypto/ssh" -) -func main() { - _ = ssh.InsecureIgnoreHostKey() -}`}, 1, gosec.NewConfig()}} - - // SampleCodeG107 - SSRF via http requests with variable url - SampleCodeG107 = []CodeSample{{[]string{` -// Input from the std in is considered insecure -package main -import ( - "net/http" - "io/ioutil" - "fmt" - "os" - "bufio" -) -func main() { - in := bufio.NewReader(os.Stdin) - url, err := in.ReadString('\n') - if err != nil { - panic(err) - } - resp, err := http.Get(url) - if err != nil { - panic(err) - } - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - panic(err) - } - fmt.Printf("%s", body) -}`}, 1, gosec.NewConfig()}, {[]string{` -// Variable defined a package level can be changed at any time -// regardless of the initial value -package main - -import ( - "fmt" - "io/ioutil" - "net/http" -) - -var url string = "https://www.google.com" - -func main() { - resp, err := http.Get(url) - if err != nil { - panic(err) - } - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - panic(err) - } - fmt.Printf("%s", body) -}`}, 1, gosec.NewConfig()}, {[]string{` -// Environmental variables are not considered as secure source -package main -import ( - "net/http" - "io/ioutil" - "fmt" - "os" -) -func main() { - url := os.Getenv("tainted_url") - resp, err := http.Get(url) - if err != nil { - panic(err) - } - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - panic(err) - } - fmt.Printf("%s", body) -}`}, 1, gosec.NewConfig()}, {[]string{` -// Constant variables or hard-coded strings are secure -package main - -import ( - "fmt" - "net/http" -) -const url = "http://127.0.0.1" -func main() { - resp, err := http.Get(url) - if err != nil { - fmt.Println(err) - } - fmt.Println(resp.Status) -}`}, 0, gosec.NewConfig()}, {[]string{` -// A variable at function scope which is initialized to -// a constant string is secure (e.g. cannot be changed concurrently) -package main - -import ( - "fmt" - "net/http" -) -func main() { - var url string = "http://127.0.0.1" - resp, err := http.Get(url) - if err != nil { - fmt.Println(err) - } - fmt.Println(resp.Status) -}`}, 0, gosec.NewConfig()}, {[]string{` -// A variable at function scope which is initialized to -// a constant string is secure (e.g. cannot be changed concurrently) -package main - -import ( - "fmt" - "net/http" -) -func main() { - url := "http://127.0.0.1" - resp, err := http.Get(url) - if err != nil { - fmt.Println(err) - } - fmt.Println(resp.Status) -}`}, 0, gosec.NewConfig()}, {[]string{` -// A variable at function scope which is initialized to -// a constant string is secure (e.g. cannot be changed concurrently) -package main - -import ( - "fmt" - "net/http" -) -func main() { - url1 := "test" - var url2 string = "http://127.0.0.1" - url2 = url1 - resp, err := http.Get(url2) - if err != nil { - fmt.Println(err) - } - fmt.Println(resp.Status) -}`}, 0, gosec.NewConfig()}, {[]string{` -// An exported variable declared a packaged scope is not secure -// because it can changed at any time -package main - -import ( - "fmt" - "net/http" -) - -var Url string - -func main() { - resp, err := http.Get(Url) - if err != nil { - fmt.Println(err) - } - fmt.Println(resp.Status) -}`}, 1, gosec.NewConfig()}, {[]string{` -// An url provided as a function argument is not secure -package main - -import ( - "fmt" - "net/http" -) -func get(url string) { - resp, err := http.Get(url) - if err != nil { - fmt.Println(err) - } - fmt.Println(resp.Status) -} -func main() { - url := "http://127.0.0.1" - get(url) -}`}, 1, gosec.NewConfig()}} - - // SampleCodeG108 - pprof endpoint automatically exposed - SampleCodeG108 = []CodeSample{{[]string{` -package main - -import ( - "fmt" - "log" - "net/http" - _ "net/http/pprof" -) - -func main() { - http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - fmt.Fprintf(w, "Hello World!") - }) - log.Fatal(http.ListenAndServe(":8080", nil)) -}`}, 1, gosec.NewConfig()}, {[]string{` -package main - -import ( - "fmt" - "log" - "net/http" - "net/http/pprof" -) - -func main() { - http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - fmt.Fprintf(w, "Hello World!") - }) - log.Fatal(http.ListenAndServe(":8080", nil)) -}`}, 0, gosec.NewConfig()}} - // SampleCodeG201 - SQL injection via format string - SampleCodeG201 = []CodeSample{ - {[]string{` -// Format string without proper quoting -package main -import ( - "database/sql" - "fmt" - "os" -) - -func main(){ - db, err := sql.Open("sqlite3", ":memory:") - if err != nil { - panic(err) - } - q := fmt.Sprintf("SELECT * FROM foo where name = '%s'", os.Args[1]) - rows, err := db.Query(q) - if err != nil { - panic(err) - } - defer rows.Close() -}`}, 1, gosec.NewConfig()}, {[]string{` -// Format string false positive, safe string spec. -package main -import ( - "database/sql" - "fmt" - "os" -) - -func main(){ - db, err := sql.Open("sqlite3", ":memory:") - if err != nil { - panic(err) - } - q := fmt.Sprintf("SELECT * FROM foo where id = %d", os.Args[1]) - rows, err := db.Query(q) - if err != nil { - panic(err) - } - defer rows.Close() -}`}, 0, gosec.NewConfig()}, {[]string{` -// Format string false positive -package main -import ( - "database/sql" -) -const staticQuery = "SELECT * FROM foo WHERE age < 32" -func main(){ - db, err := sql.Open("sqlite3", ":memory:") - if err != nil { - panic(err) - } - rows, err := db.Query(staticQuery) - if err != nil { - panic(err) - } - defer rows.Close() -}`}, 0, gosec.NewConfig()}, {[]string{` -// Format string false positive, quoted formatter argument. -package main -import ( - "database/sql" - "fmt" - "os" - "github.com/lib/pq" -) - -func main(){ - db, err := sql.Open("postgres", "localhost") - if err != nil { - panic(err) - } - q := fmt.Sprintf("SELECT * FROM %s where id = 1", pq.QuoteIdentifier(os.Args[1])) - rows, err := db.Query(q) - if err != nil { - panic(err) - } - defer rows.Close() -}`}, 0, gosec.NewConfig()}, {[]string{` -// false positive -package main -import ( - "database/sql" - "fmt" -) - -const Table = "foo" -func main(){ - db, err := sql.Open("sqlite3", ":memory:") - if err != nil { - panic(err) - } - q := fmt.Sprintf("SELECT * FROM %s where id = 1", Table) - rows, err := db.Query(q) - if err != nil { - panic(err) - } - defer rows.Close() -}`}, 0, gosec.NewConfig()}, {[]string{` -package main -import ( - "fmt" -) - -func main(){ - fmt.Sprintln() -}`}, 0, gosec.NewConfig()}} - - // SampleCodeG202 - SQL query string building via string concatenation - SampleCodeG202 = []CodeSample{ - {[]string{` -package main -import ( - "database/sql" - "os" -) -func main(){ - db, err := sql.Open("sqlite3", ":memory:") - if err != nil { - panic(err) - } - rows, err := db.Query("SELECT * FROM foo WHERE name = " + os.Args[1]) - if err != nil { - panic(err) - } - defer rows.Close() -}`}, 1, gosec.NewConfig()}, {[]string{` -// false positive -package main -import ( - "database/sql" -) -var staticQuery = "SELECT * FROM foo WHERE age < " -func main(){ - db, err := sql.Open("sqlite3", ":memory:") - if err != nil { - panic(err) - } - rows, err := db.Query(staticQuery + "32") - if err != nil { - panic(err) - } - defer rows.Close() -}`}, 0, gosec.NewConfig()}, {[]string{` -package main -import ( - "database/sql" -) -const age = "32" -var staticQuery = "SELECT * FROM foo WHERE age < " -func main(){ - db, err := sql.Open("sqlite3", ":memory:") - if err != nil { - panic(err) - } - rows, err := db.Query(staticQuery + age) - if err != nil { - panic(err) - } - defer rows.Close() -} -`}, 0, gosec.NewConfig()}, {[]string{` -package main -const gender = "M" -`, ` -package main -import ( - "database/sql" -) -const age = "32" -var staticQuery = "SELECT * FROM foo WHERE age < " -func main(){ - db, err := sql.Open("sqlite3", ":memory:") - if err != nil { - panic(err) - } - rows, err := db.Query("SELECT * FROM foo WHERE gender = " + gender) - if err != nil { - panic(err) - } - defer rows.Close() -} -`}, 0, gosec.NewConfig()}} - - // SampleCodeG203 - Template checks - SampleCodeG203 = []CodeSample{ - {[]string{` -// We assume that hardcoded template strings are safe as the programmer would -// need to be explicitly shooting themselves in the foot (as below) -package main -import ( - "html/template" - "os" -) -const tmpl = "" -func main() { - t := template.Must(template.New("ex").Parse(tmpl)) - v := map[string]interface{}{ - "Title": "Test World", - "Body": template.HTML(""), - } - t.Execute(os.Stdout, v) -}`}, 0, gosec.NewConfig()}, {[]string{ - ` -// Using a variable to initialize could potentially be dangerous. Under the -// current model this will likely produce some false positives. -package main -import ( - "html/template" - "os" -) -const tmpl = "" -func main() { - a := "something from another place" - t := template.Must(template.New("ex").Parse(tmpl)) - v := map[string]interface{}{ - "Title": "Test World", - "Body": template.HTML(a), - } - t.Execute(os.Stdout, v) -}`}, 1, gosec.NewConfig()}, {[]string{ - ` -package main -import ( - "html/template" - "os" -) -const tmpl = "" -func main() { - a := "something from another place" - t := template.Must(template.New("ex").Parse(tmpl)) - v := map[string]interface{}{ - "Title": "Test World", - "Body": template.JS(a), - } - t.Execute(os.Stdout, v) -}`}, 1, gosec.NewConfig()}, {[]string{ - ` -package main -import ( - "html/template" - "os" -) -const tmpl = "" -func main() { - a := "something from another place" - t := template.Must(template.New("ex").Parse(tmpl)) - v := map[string]interface{}{ - "Title": "Test World", - "Body": template.URL(a), - } - t.Execute(os.Stdout, v) -}`}, 1, gosec.NewConfig()}} - - // SampleCodeG204 - Subprocess auditing - SampleCodeG204 = []CodeSample{{[]string{` -// Calling any function which starts a new process -// with a function call as an argument is considered a command injection -package main -import ( - "log" - "os/exec" - "context" -) -func main() { - err := exec.CommandContext(context.Background(), "sleep", "5").Run() - if err != nil { - log.Fatal(err) - } - log.Printf("Command finished with error: %v", err) -}`}, 1, gosec.NewConfig()}, {[]string{` -// Calling any function which starts a new process with using -// command line arguments as it's arguments is considered dangerous -package main -import ( - "log" - "os" - "os/exec" -) -func main() { - err := exec.CommandContext(os.Args[0], "sleep", "5").Run() - if err != nil { - log.Fatal(err) - } - log.Printf("Command finished with error: %v", err) -}`}, 1, gosec.NewConfig()}, {[]string{` -// Initializing a local variable using a environmental -// variable is consider as a dangerous user input -package main -import ( - "log" - "os" - "os/exec" -) -func main() { - run := "sleep" + os.Getenv("SOMETHING") - cmd := exec.Command(run, "5") - err := cmd.Start() - if err != nil { - log.Fatal(err) - } - log.Printf("Waiting for command to finish...") - err = cmd.Wait() - log.Printf("Command finished with error: %v", err) -}`}, 1, gosec.NewConfig()}, {[]string{` -// gosec doesn't have enough context to decide that the -// command argument of the RunCmd function is harcoded string -// and that's why it's better to warn the user so he can audit it -package main - -import ( - "log" - "os/exec" -) - -func RunCmd(command string) { - cmd := exec.Command(command, "5") - err := cmd.Start() - if err != nil { - log.Fatal(err) - } - log.Printf("Waiting for command to finish...") - err = cmd.Wait() -} - -func main() { - RunCmd("sleep") -}`}, 1, gosec.NewConfig()}, {[]string{` -// syscall.Exec function called with harcoded arguments -// shouldn't be consider as a command injection -package main -import ( - "fmt" - "syscall" -) -func main() { - err := syscall.Exec("/bin/cat", []string{"/etc/passwd"}, nil) - if err != nil { - fmt.Printf("Error: %v\n", err) - } -}`}, 0, gosec.NewConfig()}, - {[]string{` -// starting a process with a variable as an argument -// even if not constant is not considered as dangerous -// because it has harcoded value -package main -import ( - "log" - "os/exec" -) -func main() { - run := "sleep" - cmd := exec.Command(run, "5") - err := cmd.Start() - if err != nil { - log.Fatal(err) - } - log.Printf("Waiting for command to finish...") - err = cmd.Wait() - log.Printf("Command finished with error: %v", err) -}`}, 0, gosec.NewConfig()}} - - // SampleCodeG301 - mkdir permission check - SampleCodeG301 = []CodeSample{{[]string{` -package main - -import ( - "fmt" - "os" -) - -func main() { - err := os.Mkdir("/tmp/mydir", 0777) - if err != nil { - fmt.Println("Error when creating a directory!") - return - } -}`}, 1, gosec.NewConfig()}, {[]string{` -package main - -import ( - "fmt" - "os" -) - -func main() { - err := os.MkdirAll("/tmp/mydir", 0777) - if err != nil { - fmt.Println("Error when creating a directory!") - return - } -}`}, 1, gosec.NewConfig()}, {[]string{` -package main - -import ( - "fmt" - "os" -) - -func main() { - err := os.Mkdir("/tmp/mydir", 0600) - if err != nil { - fmt.Println("Error when creating a directory!") - return - } -}`}, 0, gosec.NewConfig()}} - - // SampleCodeG302 - file create / chmod permissions check - SampleCodeG302 = []CodeSample{{[]string{` -package main - -import ( - "fmt" - "os" -) - -func main() { - err := os.Chmod("/tmp/somefile", 0777) - if err != nil { - fmt.Println("Error when changing file permissions!") - return - } -}`}, 1, gosec.NewConfig()}, {[]string{` -package main - -import ( - "fmt" - "os" -) - -func main() { - _, err := os.OpenFile("/tmp/thing", os.O_CREATE|os.O_WRONLY, 0666) - if err != nil { - fmt.Println("Error opening a file!") - return - } -}`}, 1, gosec.NewConfig()}, {[]string{` -package main - -import ( - "fmt" - "os" -) - -func main() { - err := os.Chmod("/tmp/mydir", 0400) - if err != nil { - fmt.Println("Error") - return - } -}`}, 0, gosec.NewConfig()}, {[]string{` -package main - -import ( - "fmt" - "os" -) - -func main() { - _, err := os.OpenFile("/tmp/thing", os.O_CREATE|os.O_WRONLY, 0600) - if err != nil { - fmt.Println("Error opening a file!") - return - } -} -`}, 0, gosec.NewConfig()}} - - // SampleCodeG303 - bad tempfile permissions & hardcoded shared path - SampleCodeG303 = []CodeSample{{[]string{` -package samples - -import ( - "fmt" - "io/ioutil" -) - -func main() { - err := ioutil.WriteFile("/tmp/demo2", []byte("This is some data"), 0644) - if err != nil { - fmt.Println("Error while writing!") - } -}`}, 1, gosec.NewConfig()}} - - // SampleCodeG304 - potential file inclusion vulnerability - SampleCodeG304 = []CodeSample{{[]string{` -package main -import ( -"os" -"io/ioutil" -"log" -) -func main() { - f := os.Getenv("tainted_file") - body, err := ioutil.ReadFile(f) - if err != nil { - log.Printf("Error: %v\n", err) - } - log.Print(body) - -}`}, 1, gosec.NewConfig()}, {[]string{` -package main - -import ( - "fmt" - "log" - "net/http" - "os" -) - -func main() { - http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) { - title := r.URL.Query().Get("title") - f, err := os.Open(title) - if err != nil { - fmt.Printf("Error: %v\n", err) - } - body := make([]byte, 5) - if _, err = f.Read(body); err != nil { - fmt.Printf("Error: %v\n", err) - } - fmt.Fprintf(w, "%s", body) - }) - log.Fatal(http.ListenAndServe(":3000", nil)) -}`}, 1, gosec.NewConfig()}, {[]string{` -package main - -import ( - "log" - "os" - "io/ioutil" -) - - func main() { - f2 := os.Getenv("tainted_file2") - body, err := ioutil.ReadFile("/tmp/" + f2) - if err != nil { - log.Printf("Error: %v\n", err) - } - log.Print(body) - }`}, 1, gosec.NewConfig()}, {[]string{` - package main - - import ( - "bufio" - "fmt" - "os" - "path/filepath" - ) - -func main() { - reader := bufio.NewReader(os.Stdin) - fmt.Print("Please enter file to read: ") - file, _ := reader.ReadString('\n') - file = file[:len(file)-1] - f, err := os.Open(filepath.Join("/tmp/service/", file)) - if err != nil { - fmt.Printf("Error: %v\n", err) - } - contents := make([]byte, 15) - if _, err = f.Read(contents); err != nil { - fmt.Printf("Error: %v\n", err) - } - fmt.Println(string(contents)) -}`}, 1, gosec.NewConfig()}, {[]string{` -package main - -import ( - "log" - "os" - "io/ioutil" - "path/filepath" -) - -func main() { - dir := os.Getenv("server_root") - f3 := os.Getenv("tainted_file3") - // edge case where both a binary expression and file Join are used. - body, err := ioutil.ReadFile(filepath.Join("/var/"+dir, f3)) - if err != nil { - log.Printf("Error: %v\n", err) - } - log.Print(body) -}`}, 1, gosec.NewConfig()}} - - // SampleCodeG305 - File path traversal when extracting zip archives - SampleCodeG305 = []CodeSample{{[]string{` -package unzip - -import ( - "archive/zip" - "io" - "os" - "path/filepath" -) - -func unzip(archive, target string) error { - reader, err := zip.OpenReader(archive) - if err != nil { - return err - } - - if err := os.MkdirAll(target, 0750); err != nil { - return err - } - - for _, file := range reader.File { - path := filepath.Join(target, file.Name) - if file.FileInfo().IsDir() { - os.MkdirAll(path, file.Mode()) // #nosec - continue - } - - fileReader, err := file.Open() - if err != nil { - return err - } - defer fileReader.Close() - - targetFile, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, file.Mode()) - if err != nil { - return err - } - defer targetFile.Close() - - if _, err := io.Copy(targetFile, fileReader); err != nil { - return err - } - } - - return nil -}`}, 1, gosec.NewConfig()}, {[]string{` -package unzip - -import ( - "archive/zip" - "io" - "os" - "path/filepath" -) - -func unzip(archive, target string) error { - reader, err := zip.OpenReader(archive) - if err != nil { - return err - } - - if err := os.MkdirAll(target, 0750); err != nil { - return err - } - - for _, file := range reader.File { - archiveFile := file.Name - path := filepath.Join(target, archiveFile) - if file.FileInfo().IsDir() { - os.MkdirAll(path, file.Mode()) // #nosec - continue - } - - fileReader, err := file.Open() - if err != nil { - return err - } - defer fileReader.Close() - - targetFile, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, file.Mode()) - if err != nil { - return err - } - defer targetFile.Close() - - if _, err := io.Copy(targetFile, fileReader); err != nil { - return err - } - } - - return nil -}`}, 1, gosec.NewConfig()}} - - // SampleCodeG401 - Use of weak crypto MD5 - SampleCodeG401 = []CodeSample{ - {[]string{` -package main -import ( - "crypto/md5" - "fmt" - "io" - "log" - "os" -) -func main() { - f, err := os.Open("file.txt") - if err != nil { - log.Fatal(err) - } - defer f.Close() - - h := md5.New() - if _, err := io.Copy(h, f); err != nil { - log.Fatal(err) - } - fmt.Printf("%x", h.Sum(nil)) -}`}, 1, gosec.NewConfig()}} - - // SampleCodeG401b - Use of weak crypto SHA1 - SampleCodeG401b = []CodeSample{ - {[]string{` -package main -import ( - "crypto/sha1" - "fmt" - "io" - "log" - "os" -) -func main() { - f, err := os.Open("file.txt") - if err != nil { - log.Fatal(err) - } - defer f.Close() - - h := sha1.New() - if _, err := io.Copy(h, f); err != nil { - log.Fatal(err) - } - fmt.Printf("%x", h.Sum(nil)) -}`}, 1, gosec.NewConfig()}} - - // SampleCodeG402 - TLS settings - SampleCodeG402 = []CodeSample{{[]string{` -// InsecureSkipVerify -package main -import ( - "crypto/tls" - "fmt" - "net/http" -) -func main() { - tr := &http.Transport{ - TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, - } - - client := &http.Client{Transport: tr} - _, err := client.Get("https://golang.org/") - if err != nil { - fmt.Println(err) - } -}`}, 1, gosec.NewConfig()}, {[]string{ - ` -// Insecure minimum version -package main -import ( - "crypto/tls" - "fmt" - "net/http" -) -func main() { - tr := &http.Transport{ - TLSClientConfig: &tls.Config{MinVersion: 0}, - } - client := &http.Client{Transport: tr} - _, err := client.Get("https://golang.org/") - if err != nil { - fmt.Println(err) - } -}`}, 1, gosec.NewConfig()}, {[]string{` -// Insecure max version -package main -import ( - "crypto/tls" - "fmt" - "net/http" -) -func main() { - tr := &http.Transport{ - TLSClientConfig: &tls.Config{MaxVersion: 0}, - } - client := &http.Client{Transport: tr} - _, err := client.Get("https://golang.org/") - if err != nil { - fmt.Println(err) - } -} -`}, 1, gosec.NewConfig()}, { - []string{` -// Insecure ciphersuite selection -package main -import ( - "crypto/tls" - "fmt" - "net/http" -) -func main() { - tr := &http.Transport{ - TLSClientConfig: &tls.Config{CipherSuites: []uint16{ - tls.TLS_RSA_WITH_AES_128_GCM_SHA256, - tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, - },}, - } - client := &http.Client{Transport: tr} - _, err := client.Get("https://golang.org/") - if err != nil { - fmt.Println(err) - } -}`}, 1, gosec.NewConfig()}} - - // SampleCodeG403 - weak key strength - SampleCodeG403 = []CodeSample{ - {[]string{` -package main -import ( - "crypto/rand" - "crypto/rsa" - "fmt" -) -func main() { - //Generate Private Key - pvk, err := rsa.GenerateKey(rand.Reader, 1024) - if err != nil { - fmt.Println(err) - } - fmt.Println(pvk) -}`}, 1, gosec.NewConfig()}} - - // SampleCodeG404 - weak random number - SampleCodeG404 = []CodeSample{ - {[]string{` -package main -import "crypto/rand" -func main() { - good, _ := rand.Read(nil) - println(good) -}`}, 0, gosec.NewConfig()}, {[]string{` -package main -import "math/rand" -func main() { - bad := rand.Int() - println(bad) -}`}, 1, gosec.NewConfig()}, {[]string{` -package main -import ( - "crypto/rand" - mrand "math/rand" -) -func main() { - good, _ := rand.Read(nil) - println(good) - i := mrand.Int31() - println(i) -}`}, 0, gosec.NewConfig()}} - - // SampleCodeG501 - Blacklisted import MD5 - SampleCodeG501 = []CodeSample{ - {[]string{` -package main -import ( - "crypto/md5" - "fmt" - "os" -) -func main() { - for _, arg := range os.Args { - fmt.Printf("%x - %s\n", md5.Sum([]byte(arg)), arg) - } -}`}, 1, gosec.NewConfig()}} - - // SampleCodeG502 - Blacklisted import DES - SampleCodeG502 = []CodeSample{ - {[]string{` -package main -import ( - "crypto/cipher" - "crypto/des" - "crypto/rand" - "encoding/hex" - "fmt" - "io" -) -func main() { - block, err := des.NewCipher([]byte("sekritz")) - if err != nil { - panic(err) - } - plaintext := []byte("I CAN HAZ SEKRIT MSG PLZ") - ciphertext := make([]byte, des.BlockSize+len(plaintext)) - iv := ciphertext[:des.BlockSize] - if _, err := io.ReadFull(rand.Reader, iv); err != nil { - panic(err) - } - stream := cipher.NewCFBEncrypter(block, iv) - stream.XORKeyStream(ciphertext[des.BlockSize:], plaintext) - fmt.Println("Secret message is: %s", hex.EncodeToString(ciphertext)) -}`}, 1, gosec.NewConfig()}} - - // SampleCodeG503 - Blacklisted import RC4 - SampleCodeG503 = []CodeSample{{[]string{` -package main -import ( - "crypto/rc4" - "encoding/hex" - "fmt" -) -func main() { - cipher, err := rc4.NewCipher([]byte("sekritz")) - if err != nil { - panic(err) - } - plaintext := []byte("I CAN HAZ SEKRIT MSG PLZ") - ciphertext := make([]byte, len(plaintext)) - cipher.XORKeyStream(ciphertext, plaintext) - fmt.Println("Secret message is: %s", hex.EncodeToString(ciphertext)) -}`}, 1, gosec.NewConfig()}} - - // SampleCodeG504 - Blacklisted import CGI - SampleCodeG504 = []CodeSample{{[]string{` -package main -import ( - "net/http/cgi" - "net/http" - ) -func main() { - cgi.Serve(http.FileServer(http.Dir("/usr/share/doc"))) -}`}, 1, gosec.NewConfig()}} - // SampleCodeG505 - Blacklisted import SHA1 - SampleCodeG505 = []CodeSample{ - {[]string{` -package main -import ( - "crypto/sha1" - "fmt" - "os" -) -func main() { - for _, arg := range os.Args { - fmt.Printf("%x - %s\n", sha1.Sum([]byte(arg)), arg) - } -}`}, 1, gosec.NewConfig()}} - // SampleCode601 - Go build tags - SampleCode601 = []CodeSample{{[]string{` -// +build tag - -package main -func main() { - fmt.Println("no package imported error") -}`}, 1, gosec.NewConfig()}} -) diff --git a/vendor/github.com/securego/gosec/testutils/visitor.go b/vendor/github.com/securego/gosec/testutils/visitor.go deleted file mode 100644 index 775829b31..000000000 --- a/vendor/github.com/securego/gosec/testutils/visitor.go +++ /dev/null @@ -1,28 +0,0 @@ -package testutils - -import ( - "go/ast" - - "github.com/securego/gosec" -) - -// MockVisitor is useful for stubbing out ast.Visitor with callback -// and looking for specific conditions to exist. -type MockVisitor struct { - Context *gosec.Context - Callback func(n ast.Node, ctx *gosec.Context) bool -} - -// NewMockVisitor creates a new empty struct, the Context and -// Callback must be set manually. See call_list_test.go for an example. -func NewMockVisitor() *MockVisitor { - return &MockVisitor{} -} - -// Visit satisfies the ast.Visitor interface -func (v *MockVisitor) Visit(n ast.Node) ast.Visitor { - if v.Callback(n, v.Context) { - return v - } - return nil -} diff --git a/vendor/github.com/sergi/go-diff/diffmatchpatch/diff.go b/vendor/github.com/sergi/go-diff/diffmatchpatch/diff.go index 82ad7bc8f..cb25b4375 100644 --- a/vendor/github.com/sergi/go-diff/diffmatchpatch/diff.go +++ b/vendor/github.com/sergi/go-diff/diffmatchpatch/diff.go @@ -25,6 +25,8 @@ import ( // Operation defines the operation of a diff item. type Operation int8 +//go:generate stringer -type=Operation -trimprefix=Diff + const ( // DiffDelete item represents a delete diff. DiffDelete Operation = -1 @@ -40,8 +42,41 @@ type Diff struct { Text string } +// splice removes amount elements from slice at index index, replacing them with elements. func splice(slice []Diff, index int, amount int, elements ...Diff) []Diff { - return append(slice[:index], append(elements, slice[index+amount:]...)...) + if len(elements) == amount { + // Easy case: overwrite the relevant items. + copy(slice[index:], elements) + return slice + } + if len(elements) < amount { + // Fewer new items than old. + // Copy in the new items. + copy(slice[index:], elements) + // Shift the remaining items left. + copy(slice[index+len(elements):], slice[index+amount:]) + // Calculate the new end of the slice. + end := len(slice) - amount + len(elements) + // Zero stranded elements at end so that they can be garbage collected. + tail := slice[end:] + for i := range tail { + tail[i] = Diff{} + } + return slice[:end] + } + // More new items than old. + // Make room in slice for new elements. + // There's probably an even more efficient way to do this, + // but this is simple and clear. + need := len(slice) - amount + len(elements) + for len(slice) < need { + slice = append(slice, Diff{}) + } + // Shift slice elements right to make room for new elements. + copy(slice[index+len(elements):], slice[index+amount:]) + // Copy in new elements. + copy(slice[index:], elements) + return slice } // DiffMain finds the differences between two texts. @@ -145,7 +180,10 @@ func (dmp *DiffMatchPatch) diffCompute(text1, text2 []rune, checklines bool, dea diffsA := dmp.diffMainRunes(text1A, text2A, checklines, deadline) diffsB := dmp.diffMainRunes(text1B, text2B, checklines, deadline) // Merge the results. - return append(diffsA, append([]Diff{Diff{DiffEqual, string(midCommon)}}, diffsB...)...) + diffs := diffsA + diffs = append(diffs, Diff{DiffEqual, string(midCommon)}) + diffs = append(diffs, diffsB...) + return diffs } else if checklines && len(text1) > 100 && len(text2) > 100 { return dmp.diffLineMode(text1, text2, deadline) } @@ -247,7 +285,7 @@ func (dmp *DiffMatchPatch) diffBisect(runes1, runes2 []rune, deadline time.Time) k2end := 0 for d := 0; d < maxD; d++ { // Bail out if deadline is reached. - if !deadline.IsZero() && time.Now().After(deadline) { + if !deadline.IsZero() && d%16 == 0 && time.Now().After(deadline) { break } @@ -434,48 +472,29 @@ func (dmp *DiffMatchPatch) DiffCommonSuffix(text1, text2 string) int { // commonPrefixLength returns the length of the common prefix of two rune slices. func commonPrefixLength(text1, text2 []rune) int { - short, long := text1, text2 - if len(short) > len(long) { - short, long = long, short - } - for i, r := range short { - if r != long[i] { - return i + // Linear search. See comment in commonSuffixLength. + n := 0 + for ; n < len(text1) && n < len(text2); n++ { + if text1[n] != text2[n] { + return n } } - return len(short) + return n } // commonSuffixLength returns the length of the common suffix of two rune slices. func commonSuffixLength(text1, text2 []rune) int { - n := min(len(text1), len(text2)) - for i := 0; i < n; i++ { - if text1[len(text1)-i-1] != text2[len(text2)-i-1] { - return i + // Use linear search rather than the binary search discussed at https://neil.fraser.name/news/2007/10/09/. + // See discussion at https://github.com/sergi/go-diff/issues/54. + i1 := len(text1) + i2 := len(text2) + for n := 0; ; n++ { + i1-- + i2-- + if i1 < 0 || i2 < 0 || text1[i1] != text2[i2] { + return n } } - return n - - // TODO research and benchmark this, why is it not activated? https://github.com/sergi/go-diff/issues/54 - // Binary search. - // Performance analysis: http://neil.fraser.name/news/2007/10/09/ - /* - pointermin := 0 - pointermax := math.Min(len(text1), len(text2)) - pointermid := pointermax - pointerend := 0 - for pointermin < pointermid { - if text1[len(text1)-pointermid:len(text1)-pointerend] == - text2[len(text2)-pointermid:len(text2)-pointerend] { - pointermin = pointermid - pointerend = pointermin - } else { - pointermax = pointermid - } - pointermid = math.Floor((pointermax-pointermin)/2 + pointermin) - } - return pointermid - */ } // DiffCommonOverlap determines if the suffix of one string is the prefix of another. @@ -628,11 +647,7 @@ func (dmp *DiffMatchPatch) diffHalfMatchI(l, s []rune, i int) [][]rune { func (dmp *DiffMatchPatch) DiffCleanupSemantic(diffs []Diff) []Diff { changes := false // Stack of indices where equalities are found. - type equality struct { - data int - next *equality - } - var equalities *equality + equalities := make([]int, 0, len(diffs)) var lastequality string // Always equal to diffs[equalities[equalitiesLength - 1]][1] @@ -645,11 +660,7 @@ func (dmp *DiffMatchPatch) DiffCleanupSemantic(diffs []Diff) []Diff { for pointer < len(diffs) { if diffs[pointer].Type == DiffEqual { // Equality found. - - equalities = &equality{ - data: pointer, - next: equalities, - } + equalities = append(equalities, pointer) lengthInsertions1 = lengthInsertions2 lengthDeletions1 = lengthDeletions2 lengthInsertions2 = 0 @@ -670,23 +681,20 @@ func (dmp *DiffMatchPatch) DiffCleanupSemantic(diffs []Diff) []Diff { (len(lastequality) <= difference1) && (len(lastequality) <= difference2) { // Duplicate record. - insPoint := equalities.data - diffs = append( - diffs[:insPoint], - append([]Diff{Diff{DiffDelete, lastequality}}, diffs[insPoint:]...)...) + insPoint := equalities[len(equalities)-1] + diffs = splice(diffs, insPoint, 0, Diff{DiffDelete, lastequality}) // Change second copy to insert. diffs[insPoint+1].Type = DiffInsert // Throw away the equality we just deleted. - equalities = equalities.next + equalities = equalities[:len(equalities)-1] - if equalities != nil { - equalities = equalities.next + if len(equalities) > 0 { + equalities = equalities[:len(equalities)-1] } - if equalities != nil { - pointer = equalities.data - } else { - pointer = -1 + pointer = -1 + if len(equalities) > 0 { + pointer = equalities[len(equalities)-1] } lengthInsertions1 = 0 // Reset the counters. @@ -724,10 +732,7 @@ func (dmp *DiffMatchPatch) DiffCleanupSemantic(diffs []Diff) []Diff { float64(overlapLength1) >= float64(len(insertion))/2 { // Overlap found. Insert an equality and trim the surrounding edits. - diffs = append( - diffs[:pointer], - append([]Diff{Diff{DiffEqual, insertion[:overlapLength1]}}, diffs[pointer:]...)...) - + diffs = splice(diffs, pointer, 0, Diff{DiffEqual, insertion[:overlapLength1]}) diffs[pointer-1].Text = deletion[0 : len(deletion)-overlapLength1] diffs[pointer+1].Text = insertion[overlapLength1:] @@ -738,10 +743,7 @@ func (dmp *DiffMatchPatch) DiffCleanupSemantic(diffs []Diff) []Diff { float64(overlapLength2) >= float64(len(insertion))/2 { // Reverse overlap found. Insert an equality and swap and trim the surrounding edits. overlap := Diff{DiffEqual, deletion[:overlapLength2]} - diffs = append( - diffs[:pointer], - append([]Diff{overlap}, diffs[pointer:]...)...) - + diffs = splice(diffs, pointer, 0, overlap) diffs[pointer-1].Type = DiffInsert diffs[pointer-1].Text = insertion[0 : len(insertion)-overlapLength2] diffs[pointer+1].Type = DiffDelete @@ -954,8 +956,7 @@ func (dmp *DiffMatchPatch) DiffCleanupEfficiency(diffs []Diff) []Diff { insPoint := equalities.data // Duplicate record. - diffs = append(diffs[:insPoint], - append([]Diff{Diff{DiffDelete, lastequality}}, diffs[insPoint:]...)...) + diffs = splice(diffs, insPoint, 0, Diff{DiffDelete, lastequality}) // Change second copy to insert. diffs[insPoint+1].Type = DiffInsert @@ -1235,9 +1236,9 @@ func (dmp *DiffMatchPatch) DiffLevenshtein(diffs []Diff) int { for _, aDiff := range diffs { switch aDiff.Type { case DiffInsert: - insertions += len(aDiff.Text) + insertions += utf8.RuneCountInString(aDiff.Text) case DiffDelete: - deletions += len(aDiff.Text) + deletions += utf8.RuneCountInString(aDiff.Text) case DiffEqual: // A deletion and an insertion is one substitution. levenshtein += max(insertions, deletions) diff --git a/vendor/github.com/sergi/go-diff/diffmatchpatch/operation_string.go b/vendor/github.com/sergi/go-diff/diffmatchpatch/operation_string.go new file mode 100644 index 000000000..533ec0da7 --- /dev/null +++ b/vendor/github.com/sergi/go-diff/diffmatchpatch/operation_string.go @@ -0,0 +1,17 @@ +// Code generated by "stringer -type=Operation -trimprefix=Diff"; DO NOT EDIT. + +package diffmatchpatch + +import "fmt" + +const _Operation_name = "DeleteEqualInsert" + +var _Operation_index = [...]uint8{0, 6, 11, 17} + +func (i Operation) String() string { + i -= -1 + if i < 0 || i >= Operation(len(_Operation_index)-1) { + return fmt.Sprintf("Operation(%d)", i+-1) + } + return _Operation_name[_Operation_index[i]:_Operation_index[i+1]] +} diff --git a/vendor/github.com/shirou/gopsutil/cpu/cpu.go b/vendor/github.com/shirou/gopsutil/cpu/cpu.go index ceaf77fee..2372ce33d 100644 --- a/vendor/github.com/shirou/gopsutil/cpu/cpu.go +++ b/vendor/github.com/shirou/gopsutil/cpu/cpu.go @@ -4,7 +4,7 @@ import ( "context" "encoding/json" "fmt" - "runtime" + "math" "strconv" "strings" "sync" @@ -28,7 +28,6 @@ type TimesStat struct { Steal float64 `json:"steal"` Guest float64 `json:"guest"` GuestNice float64 `json:"guestNice"` - Stolen float64 `json:"stolen"` } type InfoStat struct { @@ -63,14 +62,11 @@ func init() { lastCPUPercent.Unlock() } +// Counts returns the number of physical or logical cores in the system func Counts(logical bool) (int, error) { return CountsWithContext(context.Background(), logical) } -func CountsWithContext(ctx context.Context, logical bool) (int, error) { - return runtime.NumCPU(), nil -} - func (c TimesStat) String() string { v := []string{ `"cpu":"` + c.CPU + `"`, @@ -84,7 +80,6 @@ func (c TimesStat) String() string { `"steal":` + strconv.FormatFloat(c.Steal, 'f', 1, 64), `"guest":` + strconv.FormatFloat(c.Guest, 'f', 1, 64), `"guestNice":` + strconv.FormatFloat(c.GuestNice, 'f', 1, 64), - `"stolen":` + strconv.FormatFloat(c.Stolen, 'f', 1, 64), } return `{` + strings.Join(v, ",") + `}` @@ -92,8 +87,8 @@ func (c TimesStat) String() string { // Total returns the total number of seconds in a CPUTimesStat func (c TimesStat) Total() float64 { - total := c.User + c.System + c.Nice + c.Iowait + c.Irq + c.Softirq + c.Steal + - c.Guest + c.GuestNice + c.Idle + c.Stolen + total := c.User + c.System + c.Nice + c.Iowait + c.Irq + c.Softirq + + c.Steal + c.Idle return total } @@ -104,7 +99,7 @@ func (c InfoStat) String() string { func getAllBusy(t TimesStat) (float64, float64) { busy := t.User + t.System + t.Nice + t.Iowait + t.Irq + - t.Softirq + t.Steal + t.Guest + t.GuestNice + t.Stolen + t.Softirq + t.Steal return busy + t.Idle, busy } @@ -116,9 +111,9 @@ func calculateBusy(t1, t2 TimesStat) float64 { return 0 } if t2All <= t1All { - return 1 + return 100 } - return (t2Busy - t1Busy) / (t2All - t1All) * 100 + return math.Min(100, math.Max(0, (t2Busy-t1Busy)/(t2All-t1All)*100)) } func calculateAllBusy(t1, t2 []TimesStat) ([]float64, error) { diff --git a/vendor/github.com/shirou/gopsutil/cpu/cpu_darwin.go b/vendor/github.com/shirou/gopsutil/cpu/cpu_darwin.go index 74d273731..cd0475d3c 100644 --- a/vendor/github.com/shirou/gopsutil/cpu/cpu_darwin.go +++ b/vendor/github.com/shirou/gopsutil/cpu/cpu_darwin.go @@ -4,9 +4,10 @@ package cpu import ( "context" - "os/exec" "strconv" "strings" + + "golang.org/x/sys/unix" ) // sys/resource.h @@ -41,75 +42,62 @@ func Info() ([]InfoStat, error) { func InfoWithContext(ctx context.Context) ([]InfoStat, error) { var ret []InfoStat - sysctl, err := exec.LookPath("/usr/sbin/sysctl") - if err != nil { - return ret, err - } - out, err := invoke.CommandWithContext(ctx, sysctl, "machdep.cpu") - if err != nil { - return ret, err - } c := InfoStat{} - for _, line := range strings.Split(string(out), "\n") { - values := strings.Fields(line) - if len(values) < 1 { - continue + c.ModelName, _ = unix.Sysctl("machdep.cpu.brand_string") + family, _ := unix.SysctlUint32("machdep.cpu.family") + c.Family = strconv.FormatUint(uint64(family), 10) + model, _ := unix.SysctlUint32("machdep.cpu.model") + c.Model = strconv.FormatUint(uint64(model), 10) + stepping, _ := unix.SysctlUint32("machdep.cpu.stepping") + c.Stepping = int32(stepping) + features, err := unix.Sysctl("machdep.cpu.features") + if err == nil { + for _, v := range strings.Fields(features) { + c.Flags = append(c.Flags, strings.ToLower(v)) } - - t, err := strconv.ParseInt(values[1], 10, 64) - // err is not checked here because some value is string. - if strings.HasPrefix(line, "machdep.cpu.brand_string") { - c.ModelName = strings.Join(values[1:], " ") - } else if strings.HasPrefix(line, "machdep.cpu.family") { - c.Family = values[1] - } else if strings.HasPrefix(line, "machdep.cpu.model") { - c.Model = values[1] - } else if strings.HasPrefix(line, "machdep.cpu.stepping") { - if err != nil { - return ret, err - } - c.Stepping = int32(t) - } else if strings.HasPrefix(line, "machdep.cpu.features") { - for _, v := range values[1:] { - c.Flags = append(c.Flags, strings.ToLower(v)) - } - } else if strings.HasPrefix(line, "machdep.cpu.leaf7_features") { - for _, v := range values[1:] { - c.Flags = append(c.Flags, strings.ToLower(v)) - } - } else if strings.HasPrefix(line, "machdep.cpu.extfeatures") { - for _, v := range values[1:] { - c.Flags = append(c.Flags, strings.ToLower(v)) - } - } else if strings.HasPrefix(line, "machdep.cpu.core_count") { - if err != nil { - return ret, err - } - c.Cores = int32(t) - } else if strings.HasPrefix(line, "machdep.cpu.cache.size") { - if err != nil { - return ret, err - } - c.CacheSize = int32(t) - } else if strings.HasPrefix(line, "machdep.cpu.vendor") { - c.VendorID = values[1] + } + leaf7Features, err := unix.Sysctl("machdep.cpu.leaf7_features") + if err == nil { + for _, v := range strings.Fields(leaf7Features) { + c.Flags = append(c.Flags, strings.ToLower(v)) } } + extfeatures, err := unix.Sysctl("machdep.cpu.extfeatures") + if err == nil { + for _, v := range strings.Fields(extfeatures) { + c.Flags = append(c.Flags, strings.ToLower(v)) + } + } + cores, _ := unix.SysctlUint32("machdep.cpu.core_count") + c.Cores = int32(cores) + cacheSize, _ := unix.SysctlUint32("machdep.cpu.cache.size") + c.CacheSize = int32(cacheSize) + c.VendorID, _ = unix.Sysctl("machdep.cpu.vendor") // Use the rated frequency of the CPU. This is a static value and does not // account for low power or Turbo Boost modes. - out, err = invoke.CommandWithContext(ctx, sysctl, "hw.cpufrequency") + cpuFrequency, err := unix.SysctlUint64("hw.cpufrequency") if err != nil { return ret, err } + c.Mhz = float64(cpuFrequency) / 1000000.0 + + return append(ret, c), nil +} - values := strings.Fields(string(out)) - hz, err := strconv.ParseFloat(values[1], 64) +func CountsWithContext(ctx context.Context, logical bool) (int, error) { + var cpuArgument string + if logical { + cpuArgument = "hw.logicalcpu" + } else { + cpuArgument = "hw.physicalcpu" + } + + count, err := unix.SysctlUint32(cpuArgument) if err != nil { - return ret, err + return 0, err } - c.Mhz = hz / 1000000.0 - return append(ret, c), nil + return int(count), nil } diff --git a/vendor/github.com/shirou/gopsutil/cpu/cpu_fallback.go b/vendor/github.com/shirou/gopsutil/cpu/cpu_fallback.go index e9e7ada2c..fbb06083d 100644 --- a/vendor/github.com/shirou/gopsutil/cpu/cpu_fallback.go +++ b/vendor/github.com/shirou/gopsutil/cpu/cpu_fallback.go @@ -4,6 +4,7 @@ package cpu import ( "context" + "runtime" "github.com/shirou/gopsutil/internal/common" ) @@ -23,3 +24,7 @@ func Info() ([]InfoStat, error) { func InfoWithContext(ctx context.Context) ([]InfoStat, error) { return []InfoStat{}, common.ErrNotImplementedError } + +func CountsWithContext(ctx context.Context, logical bool) (int, error) { + return runtime.NumCPU(), nil +} diff --git a/vendor/github.com/shirou/gopsutil/cpu/cpu_freebsd.go b/vendor/github.com/shirou/gopsutil/cpu/cpu_freebsd.go index b6c7186c7..57beffae1 100644 --- a/vendor/github.com/shirou/gopsutil/cpu/cpu_freebsd.go +++ b/vendor/github.com/shirou/gopsutil/cpu/cpu_freebsd.go @@ -6,6 +6,7 @@ import ( "os/exec" "reflect" "regexp" + "runtime" "strconv" "strings" "unsafe" @@ -25,7 +26,7 @@ var cpuTimesSize int var emptyTimes cpuTimes func init() { - getconf, err := exec.LookPath("/usr/bin/getconf") + getconf, err := exec.LookPath("getconf") if err != nil { return } @@ -166,3 +167,7 @@ func parseDmesgBoot(fileName string) (InfoStat, int, error) { return c, cpuNum, nil } + +func CountsWithContext(ctx context.Context, logical bool) (int, error) { + return runtime.NumCPU(), nil +} diff --git a/vendor/github.com/shirou/gopsutil/cpu/cpu_freebsd_arm.go b/vendor/github.com/shirou/gopsutil/cpu/cpu_freebsd_arm.go new file mode 100644 index 000000000..8b7f4c321 --- /dev/null +++ b/vendor/github.com/shirou/gopsutil/cpu/cpu_freebsd_arm.go @@ -0,0 +1,9 @@ +package cpu + +type cpuTimes struct { + User uint32 + Nice uint32 + Sys uint32 + Intr uint32 + Idle uint32 +} diff --git a/vendor/github.com/shirou/gopsutil/cpu/cpu_freebsd_arm64.go b/vendor/github.com/shirou/gopsutil/cpu/cpu_freebsd_arm64.go new file mode 100644 index 000000000..57e14528d --- /dev/null +++ b/vendor/github.com/shirou/gopsutil/cpu/cpu_freebsd_arm64.go @@ -0,0 +1,9 @@ +package cpu + +type cpuTimes struct { + User uint64 + Nice uint64 + Sys uint64 + Intr uint64 + Idle uint64 +} diff --git a/vendor/github.com/shirou/gopsutil/cpu/cpu_linux.go b/vendor/github.com/shirou/gopsutil/cpu/cpu_linux.go index 23b0952c4..0b9e9d2b6 100644 --- a/vendor/github.com/shirou/gopsutil/cpu/cpu_linux.go +++ b/vendor/github.com/shirou/gopsutil/cpu/cpu_linux.go @@ -13,10 +13,10 @@ import ( "github.com/shirou/gopsutil/internal/common" ) -var cpu_tick = float64(100) +var CPUTick = float64(100) func init() { - getconf, err := exec.LookPath("/usr/bin/getconf") + getconf, err := exec.LookPath("getconf") if err != nil { return } @@ -25,7 +25,7 @@ func init() { if err == nil { i, err := strconv.ParseFloat(strings.TrimSpace(string(out)), 64) if err == nil { - cpu_tick = float64(i) + CPUTick = i } } } @@ -87,7 +87,7 @@ func finishCPUInfo(c *InfoStat) error { lines, err = common.ReadLines(sysCPUPath(c.CPU, "cpufreq/cpuinfo_max_freq")) // if we encounter errors below such as there are no cpuinfo_max_freq file, // we just ignore. so let Mhz is 0. - if err != nil { + if err != nil || len(lines) == 0 { return nil } value, err = strconv.ParseFloat(lines[0], 64) @@ -212,7 +212,6 @@ func parseStatLine(line string) (*TimesStat, error) { } if strings.HasPrefix(fields[0], "cpu") == false { - // return CPUTimesStat{}, e return nil, errors.New("not contain cpu") } @@ -251,35 +250,103 @@ func parseStatLine(line string) (*TimesStat, error) { ct := &TimesStat{ CPU: cpu, - User: float64(user) / cpu_tick, - Nice: float64(nice) / cpu_tick, - System: float64(system) / cpu_tick, - Idle: float64(idle) / cpu_tick, - Iowait: float64(iowait) / cpu_tick, - Irq: float64(irq) / cpu_tick, - Softirq: float64(softirq) / cpu_tick, + User: user / CPUTick, + Nice: nice / CPUTick, + System: system / CPUTick, + Idle: idle / CPUTick, + Iowait: iowait / CPUTick, + Irq: irq / CPUTick, + Softirq: softirq / CPUTick, } if len(fields) > 8 { // Linux >= 2.6.11 steal, err := strconv.ParseFloat(fields[8], 64) if err != nil { return nil, err } - ct.Steal = float64(steal) / cpu_tick + ct.Steal = steal / CPUTick } if len(fields) > 9 { // Linux >= 2.6.24 guest, err := strconv.ParseFloat(fields[9], 64) if err != nil { return nil, err } - ct.Guest = float64(guest) / cpu_tick + ct.Guest = guest / CPUTick } if len(fields) > 10 { // Linux >= 3.2.0 guestNice, err := strconv.ParseFloat(fields[10], 64) if err != nil { return nil, err } - ct.GuestNice = float64(guestNice) / cpu_tick + ct.GuestNice = guestNice / CPUTick } return ct, nil } + +func CountsWithContext(ctx context.Context, logical bool) (int, error) { + if logical { + ret := 0 + // https://github.com/giampaolo/psutil/blob/d01a9eaa35a8aadf6c519839e987a49d8be2d891/psutil/_pslinux.py#L599 + procCpuinfo := common.HostProc("cpuinfo") + lines, err := common.ReadLines(procCpuinfo) + if err == nil { + for _, line := range lines { + line = strings.ToLower(line) + if strings.HasPrefix(line, "processor") { + ret++ + } + } + } + if ret == 0 { + procStat := common.HostProc("stat") + lines, err = common.ReadLines(procStat) + if err != nil { + return 0, err + } + for _, line := range lines { + if len(line) >= 4 && strings.HasPrefix(line, "cpu") && '0' <= line[3] && line[3] <= '9' { // `^cpu\d` regexp matching + ret++ + } + } + } + return ret, nil + } + // physical cores https://github.com/giampaolo/psutil/blob/d01a9eaa35a8aadf6c519839e987a49d8be2d891/psutil/_pslinux.py#L628 + filename := common.HostProc("cpuinfo") + lines, err := common.ReadLines(filename) + if err != nil { + return 0, err + } + mapping := make(map[int]int) + currentInfo := make(map[string]int) + for _, line := range lines { + line = strings.ToLower(strings.TrimSpace(line)) + if line == "" { + // new section + id, okID := currentInfo["physical id"] + cores, okCores := currentInfo["cpu cores"] + if okID && okCores { + mapping[id] = cores + } + currentInfo = make(map[string]int) + continue + } + fields := strings.Split(line, ":") + if len(fields) < 2 { + continue + } + fields[0] = strings.TrimSpace(fields[0]) + if fields[0] == "physical id" || fields[0] == "cpu cores" { + val, err := strconv.Atoi(strings.TrimSpace(fields[1])) + if err != nil { + continue + } + currentInfo[fields[0]] = val + } + } + ret := 0 + for _, v := range mapping { + ret += v + } + return ret, nil +} diff --git a/vendor/github.com/shirou/gopsutil/cpu/cpu_openbsd.go b/vendor/github.com/shirou/gopsutil/cpu/cpu_openbsd.go index 82b920f66..92a8bd75c 100644 --- a/vendor/github.com/shirou/gopsutil/cpu/cpu_openbsd.go +++ b/vendor/github.com/shirou/gopsutil/cpu/cpu_openbsd.go @@ -8,15 +8,17 @@ import ( "encoding/binary" "fmt" "os/exec" + "runtime" "strconv" "strings" + "syscall" "github.com/shirou/gopsutil/internal/common" "golang.org/x/sys/unix" ) // sys/sched.h -const ( +var ( CPUser = 0 CPNice = 1 CPSys = 2 @@ -28,6 +30,9 @@ const ( // sys/sysctl.h const ( CTLKern = 1 // "high kernel": proc, limits + CTLHw = 6 // CTL_HW + SMT = 24 // HW_SMT + NCpuOnline = 25 // HW_NCPUONLINE KernCptime = 40 // KERN_CPTIME KernCptime2 = 71 // KERN_CPTIME2 ) @@ -35,18 +40,52 @@ const ( var ClocksPerSec = float64(128) func init() { - getconf, err := exec.LookPath("/usr/bin/getconf") - if err != nil { - return - } - out, err := invoke.Command(getconf, "CLK_TCK") - // ignore errors - if err == nil { - i, err := strconv.ParseFloat(strings.TrimSpace(string(out)), 64) + func() { + getconf, err := exec.LookPath("getconf") + if err != nil { + return + } + out, err := invoke.Command(getconf, "CLK_TCK") + // ignore errors if err == nil { - ClocksPerSec = float64(i) + i, err := strconv.ParseFloat(strings.TrimSpace(string(out)), 64) + if err == nil { + ClocksPerSec = float64(i) + } + } + }() + func() { + v, err := unix.Sysctl("kern.osrelease") // can't reuse host.PlatformInformation because of circular import + if err != nil { + return + } + v = strings.ToLower(v) + version, err := strconv.ParseFloat(v, 64) + if err != nil { + return + } + if version >= 6.4 { + CPIntr = 4 + CPIdle = 5 + CPUStates = 6 } + }() +} + +func smt() (bool, error) { + mib := []int32{CTLHw, SMT} + buf, _, err := common.CallSyscall(mib) + if err != nil { + return false, err + } + + var ret bool + br := bytes.NewReader(buf) + if err := binary.Read(br, binary.LittleEndian, &ret); err != nil { + return false, err } + + return ret, nil } func Times(percpu bool) ([]TimesStat, error) { @@ -63,13 +102,27 @@ func TimesWithContext(ctx context.Context, percpu bool) ([]TimesStat, error) { ncpu = 1 } + smt, err := smt() + if err == syscall.EOPNOTSUPP { + // if hw.smt is not applicable for this platform (e.g. i386), + // pretend it's enabled + smt = true + } else if err != nil { + return nil, err + } + for i := 0; i < ncpu; i++ { - var cpuTimes [CPUStates]int64 + j := i + if !smt { + j *= 2 + } + + var cpuTimes = make([]int32, CPUStates) var mib []int32 if percpu { - mib = []int32{CTLKern, KernCptime} + mib = []int32{CTLKern, KernCptime2, int32(j)} } else { - mib = []int32{CTLKern, KernCptime2, int32(i)} + mib = []int32{CTLKern, KernCptime} } buf, _, err := common.CallSyscall(mib) if err != nil { @@ -88,10 +141,10 @@ func TimesWithContext(ctx context.Context, percpu bool) ([]TimesStat, error) { Idle: float64(cpuTimes[CPIdle]) / ClocksPerSec, Irq: float64(cpuTimes[CPIntr]) / ClocksPerSec, } - if !percpu { - c.CPU = "cpu-total" + if percpu { + c.CPU = fmt.Sprintf("cpu%d", j) } else { - c.CPU = fmt.Sprintf("cpu%d", i) + c.CPU = "cpu-total" } ret = append(ret, c) } @@ -106,14 +159,37 @@ func Info() ([]InfoStat, error) { func InfoWithContext(ctx context.Context) ([]InfoStat, error) { var ret []InfoStat + var err error c := InfoStat{} - v, err := unix.Sysctl("hw.model") + var u32 uint32 + if u32, err = unix.SysctlUint32("hw.cpuspeed"); err != nil { + return nil, err + } + c.Mhz = float64(u32) + + mib := []int32{CTLHw, NCpuOnline} + buf, _, err := common.CallSyscall(mib) if err != nil { return nil, err } - c.ModelName = v + + var ncpu int32 + br := bytes.NewReader(buf) + err = binary.Read(br, binary.LittleEndian, &ncpu) + if err != nil { + return nil, err + } + c.Cores = ncpu + + if c.ModelName, err = unix.Sysctl("hw.model"); err != nil { + return nil, err + } return append(ret, c), nil } + +func CountsWithContext(ctx context.Context, logical bool) (int, error) { + return runtime.NumCPU(), nil +} diff --git a/vendor/github.com/shirou/gopsutil/cpu/cpu_solaris.go b/vendor/github.com/shirou/gopsutil/cpu/cpu_solaris.go index 117fd909d..3de098424 100644 --- a/vendor/github.com/shirou/gopsutil/cpu/cpu_solaris.go +++ b/vendor/github.com/shirou/gopsutil/cpu/cpu_solaris.go @@ -6,17 +6,16 @@ import ( "fmt" "os/exec" "regexp" + "runtime" "sort" "strconv" "strings" - - "github.com/shirou/gopsutil/internal/common" ) var ClocksPerSec = float64(128) func init() { - getconf, err := exec.LookPath("/usr/bin/getconf") + getconf, err := exec.LookPath("getconf") if err != nil { return } @@ -30,12 +29,97 @@ func init() { } } +//sum all values in a float64 map with float64 keys +func msum(x map[float64]float64) float64 { + total := 0.0 + for _, y := range x { + total += y + } + return total +} + func Times(percpu bool) ([]TimesStat, error) { return TimesWithContext(context.Background(), percpu) } func TimesWithContext(ctx context.Context, percpu bool) ([]TimesStat, error) { - return []TimesStat{}, common.ErrNotImplementedError + kstatSys, err := exec.LookPath("kstat") + if err != nil { + return nil, fmt.Errorf("cannot find kstat: %s", err) + } + cpu := make(map[float64]float64) + idle := make(map[float64]float64) + user := make(map[float64]float64) + kern := make(map[float64]float64) + iowt := make(map[float64]float64) + //swap := make(map[float64]float64) + kstatSysOut, err := invoke.CommandWithContext(ctx, kstatSys, "-p", "cpu_stat:*:*:/^idle$|^user$|^kernel$|^iowait$|^swap$/") + if err != nil { + return nil, fmt.Errorf("cannot execute kstat: %s", err) + } + re := regexp.MustCompile(`[:\s]+`) + for _, line := range strings.Split(string(kstatSysOut), "\n") { + fields := re.Split(line, -1) + if fields[0] != "cpu_stat" { + continue + } + cpuNumber, err := strconv.ParseFloat(fields[1], 64) + if err != nil { + return nil, fmt.Errorf("cannot parse cpu number: %s", err) + } + cpu[cpuNumber] = cpuNumber + switch fields[3] { + case "idle": + idle[cpuNumber], err = strconv.ParseFloat(fields[4], 64) + if err != nil { + return nil, fmt.Errorf("cannot parse idle: %s", err) + } + case "user": + user[cpuNumber], err = strconv.ParseFloat(fields[4], 64) + if err != nil { + return nil, fmt.Errorf("cannot parse user: %s", err) + } + case "kernel": + kern[cpuNumber], err = strconv.ParseFloat(fields[4], 64) + if err != nil { + return nil, fmt.Errorf("cannot parse kernel: %s", err) + } + case "iowait": + iowt[cpuNumber], err = strconv.ParseFloat(fields[4], 64) + if err != nil { + return nil, fmt.Errorf("cannot parse iowait: %s", err) + } + //not sure how this translates, don't report, add to kernel, something else? + /*case "swap": + swap[cpuNumber], err = strconv.ParseFloat(fields[4], 64) + if err != nil { + return nil, fmt.Errorf("cannot parse swap: %s", err) + } */ + } + } + ret := make([]TimesStat, 0, len(cpu)) + if percpu { + for _, c := range cpu { + ct := &TimesStat{ + CPU: fmt.Sprintf("cpu%d", int(cpu[c])), + Idle: idle[c] / ClocksPerSec, + User: user[c] / ClocksPerSec, + System: kern[c] / ClocksPerSec, + Iowait: iowt[c] / ClocksPerSec, + } + ret = append(ret, *ct) + } + } else { + ct := &TimesStat{ + CPU: "cpu-total", + Idle: msum(idle) / ClocksPerSec, + User: msum(user) / ClocksPerSec, + System: msum(kern) / ClocksPerSec, + Iowait: msum(iowt) / ClocksPerSec, + } + ret = append(ret, *ct) + } + return ret, nil } func Info() ([]InfoStat, error) { @@ -43,7 +127,7 @@ func Info() ([]InfoStat, error) { } func InfoWithContext(ctx context.Context) ([]InfoStat, error) { - psrInfo, err := exec.LookPath("/usr/sbin/psrinfo") + psrInfo, err := exec.LookPath("psrinfo") if err != nil { return nil, fmt.Errorf("cannot find psrinfo: %s", err) } @@ -52,7 +136,7 @@ func InfoWithContext(ctx context.Context) ([]InfoStat, error) { return nil, fmt.Errorf("cannot execute psrinfo: %s", err) } - isaInfo, err := exec.LookPath("/usr/bin/isainfo") + isaInfo, err := exec.LookPath("isainfo") if err != nil { return nil, fmt.Errorf("cannot find isainfo: %s", err) } @@ -196,3 +280,7 @@ func parseProcessorInfo(cmdOutput string) ([]InfoStat, error) { } return result, nil } + +func CountsWithContext(ctx context.Context, logical bool) (int, error) { + return runtime.NumCPU(), nil +} diff --git a/vendor/github.com/shirou/gopsutil/cpu/cpu_windows.go b/vendor/github.com/shirou/gopsutil/cpu/cpu_windows.go index 8aa691cf0..97c0e342f 100644 --- a/vendor/github.com/shirou/gopsutil/cpu/cpu_windows.go +++ b/vendor/github.com/shirou/gopsutil/cpu/cpu_windows.go @@ -12,30 +12,35 @@ import ( "golang.org/x/sys/windows" ) +var ( + procGetActiveProcessorCount = common.Modkernel32.NewProc("GetActiveProcessorCount") + procGetNativeSystemInfo = common.Modkernel32.NewProc("GetNativeSystemInfo") +) + type Win32_Processor struct { LoadPercentage *uint16 Family uint16 Manufacturer string Name string NumberOfLogicalProcessors uint32 + NumberOfCores uint32 ProcessorID *string Stepping *string MaxClockSpeed uint32 } -// Win32_PerfFormattedData_Counters_ProcessorInformation stores instance value of the perf counters -type Win32_PerfFormattedData_Counters_ProcessorInformation struct { - Name string - PercentDPCTime uint64 - PercentIdleTime uint64 - PercentUserTime uint64 - PercentProcessorTime uint64 - PercentInterruptTime uint64 - PercentPriorityTime uint64 - PercentPrivilegedTime uint64 - InterruptsPerSec uint32 - ProcessorFrequency uint32 - DPCRate uint32 +// SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION +// defined in windows api doc with the following +// https://docs.microsoft.com/en-us/windows/desktop/api/winternl/nf-winternl-ntquerysysteminformation#system_processor_performance_information +// additional fields documented here +// https://www.geoffchappell.com/studies/windows/km/ntoskrnl/api/ex/sysinfo/processor_performance.htm +type win32_SystemProcessorPerformanceInformation struct { + IdleTime int64 // idle time in 100ns (this is not a filetime). + KernelTime int64 // kernel time in 100ns. kernel time includes idle time. (this is not a filetime). + UserTime int64 // usertime in 100ns (this is not a filetime). + DpcTime int64 // dpc time in 100ns (this is not a filetime). + InterruptTime int64 // interrupt time in 100ns + InterruptCount uint32 } // Win32_PerfFormattedData_PerfOS_System struct to have count of processes and processor queue length @@ -44,6 +49,17 @@ type Win32_PerfFormattedData_PerfOS_System struct { ProcessorQueueLength uint32 } +const ( + win32_TicksPerSecond = 10000000.0 + + // systemProcessorPerformanceInformationClass information class to query with NTQuerySystemInformation + // https://processhacker.sourceforge.io/doc/ntexapi_8h.html#ad5d815b48e8f4da1ef2eb7a2f18a54e0 + win32_SystemProcessorPerformanceInformationClass = 8 + + // size of systemProcessorPerformanceInfoSize in memory + win32_SystemProcessorPerformanceInfoSize = uint32(unsafe.Sizeof(win32_SystemProcessorPerformanceInformation{})) +) + // Times returns times stat per cpu and combined for all CPUs func Times(percpu bool) ([]TimesStat, error) { return TimesWithContext(context.Background(), percpu) @@ -117,24 +133,6 @@ func InfoWithContext(ctx context.Context) ([]InfoStat, error) { return ret, nil } -// PerfInfo returns the performance counter's instance value for ProcessorInformation. -// Name property is the key by which overall, per cpu and per core metric is known. -func PerfInfo() ([]Win32_PerfFormattedData_Counters_ProcessorInformation, error) { - return PerfInfoWithContext(context.Background()) -} - -func PerfInfoWithContext(ctx context.Context) ([]Win32_PerfFormattedData_Counters_ProcessorInformation, error) { - var ret []Win32_PerfFormattedData_Counters_ProcessorInformation - - q := wmi.CreateQuery(&ret, "") - err := common.WMIQueryWithContext(ctx, q, &ret) - if err != nil { - return []Win32_PerfFormattedData_Counters_ProcessorInformation{}, err - } - - return ret, err -} - // ProcInfo returns processes count and processor queue length in the system. // There is a single queue for processor even on multiprocessors systems. func ProcInfo() ([]Win32_PerfFormattedData_PerfOS_System, error) { @@ -154,19 +152,104 @@ func ProcInfoWithContext(ctx context.Context) ([]Win32_PerfFormattedData_PerfOS_ // perCPUTimes returns times stat per cpu, per core and overall for all CPUs func perCPUTimes() ([]TimesStat, error) { var ret []TimesStat - stats, err := PerfInfo() + stats, err := perfInfo() if err != nil { return nil, err } - for _, v := range stats { + for core, v := range stats { c := TimesStat{ - CPU: v.Name, - User: float64(v.PercentUserTime), - System: float64(v.PercentPrivilegedTime), - Idle: float64(v.PercentIdleTime), - Irq: float64(v.PercentInterruptTime), + CPU: fmt.Sprintf("cpu%d", core), + User: float64(v.UserTime) / win32_TicksPerSecond, + System: float64(v.KernelTime-v.IdleTime) / win32_TicksPerSecond, + Idle: float64(v.IdleTime) / win32_TicksPerSecond, + Irq: float64(v.InterruptTime) / win32_TicksPerSecond, } ret = append(ret, c) } return ret, nil } + +// makes call to Windows API function to retrieve performance information for each core +func perfInfo() ([]win32_SystemProcessorPerformanceInformation, error) { + // Make maxResults large for safety. + // We can't invoke the api call with a results array that's too small. + // If we have more than 2056 cores on a single host, then it's probably the future. + maxBuffer := 2056 + // buffer for results from the windows proc + resultBuffer := make([]win32_SystemProcessorPerformanceInformation, maxBuffer) + // size of the buffer in memory + bufferSize := uintptr(win32_SystemProcessorPerformanceInfoSize) * uintptr(maxBuffer) + // size of the returned response + var retSize uint32 + + // Invoke windows api proc. + // The returned err from the windows dll proc will always be non-nil even when successful. + // See https://godoc.org/golang.org/x/sys/windows#LazyProc.Call for more information + retCode, _, err := common.ProcNtQuerySystemInformation.Call( + win32_SystemProcessorPerformanceInformationClass, // System Information Class -> SystemProcessorPerformanceInformation + uintptr(unsafe.Pointer(&resultBuffer[0])), // pointer to first element in result buffer + bufferSize, // size of the buffer in memory + uintptr(unsafe.Pointer(&retSize)), // pointer to the size of the returned results the windows proc will set this + ) + + // check return code for errors + if retCode != 0 { + return nil, fmt.Errorf("call to NtQuerySystemInformation returned %d. err: %s", retCode, err.Error()) + } + + // calculate the number of returned elements based on the returned size + numReturnedElements := retSize / win32_SystemProcessorPerformanceInfoSize + + // trim results to the number of returned elements + resultBuffer = resultBuffer[:numReturnedElements] + + return resultBuffer, nil +} + +// SystemInfo is an equivalent representation of SYSTEM_INFO in the Windows API. +// https://msdn.microsoft.com/en-us/library/ms724958%28VS.85%29.aspx?f=255&MSPPError=-2147217396 +// https://github.com/elastic/go-windows/blob/bb1581babc04d5cb29a2bfa7a9ac6781c730c8dd/kernel32.go#L43 +type systemInfo struct { + wProcessorArchitecture uint16 + wReserved uint16 + dwPageSize uint32 + lpMinimumApplicationAddress uintptr + lpMaximumApplicationAddress uintptr + dwActiveProcessorMask uintptr + dwNumberOfProcessors uint32 + dwProcessorType uint32 + dwAllocationGranularity uint32 + wProcessorLevel uint16 + wProcessorRevision uint16 +} + +func CountsWithContext(ctx context.Context, logical bool) (int, error) { + if logical { + // https://github.com/giampaolo/psutil/blob/d01a9eaa35a8aadf6c519839e987a49d8be2d891/psutil/_psutil_windows.c#L97 + err := procGetActiveProcessorCount.Find() + if err == nil { // Win7+ + ret, _, _ := procGetActiveProcessorCount.Call(uintptr(0xffff)) // ALL_PROCESSOR_GROUPS is 0xffff according to Rust's winapi lib https://docs.rs/winapi/*/x86_64-pc-windows-msvc/src/winapi/shared/ntdef.rs.html#120 + if ret != 0 { + return int(ret), nil + } + } + var systemInfo systemInfo + _, _, err = procGetNativeSystemInfo.Call(uintptr(unsafe.Pointer(&systemInfo))) + if systemInfo.dwNumberOfProcessors == 0 { + return 0, err + } + return int(systemInfo.dwNumberOfProcessors), nil + } + // physical cores https://github.com/giampaolo/psutil/blob/d01a9eaa35a8aadf6c519839e987a49d8be2d891/psutil/_psutil_windows.c#L499 + // for the time being, try with unreliable and slow WMI call… + var dst []Win32_Processor + q := wmi.CreateQuery(&dst, "") + if err := common.WMIQueryWithContext(ctx, q, &dst); err != nil { + return 0, err + } + var count uint32 + for _, d := range dst { + count += d.NumberOfCores + } + return int(count), nil +} diff --git a/vendor/github.com/shirou/gopsutil/internal/common/common.go b/vendor/github.com/shirou/gopsutil/internal/common/common.go index f9373ee89..d46aaeba3 100644 --- a/vendor/github.com/shirou/gopsutil/internal/common/common.go +++ b/vendor/github.com/shirou/gopsutil/internal/common/common.go @@ -213,6 +213,12 @@ func ReadInts(filename string) ([]int64, error) { return ret, nil } +// Parse Hex to uint32 without error +func HexToUint32(hex string) uint32 { + vv, _ := strconv.ParseUint(hex, 16, 32) + return uint32(vv) +} + // Parse to int32 without error func mustParseInt32(val string) int32 { vv, _ := strconv.ParseInt(val, 10, 32) @@ -328,47 +334,12 @@ func HostVar(combineWith ...string) string { return GetEnv("HOST_VAR", "/var", combineWith...) } -// https://gist.github.com/kylelemons/1525278 -func Pipeline(cmds ...*exec.Cmd) ([]byte, []byte, error) { - // Require at least one command - if len(cmds) < 1 { - return nil, nil, nil - } - - // Collect the output from the command(s) - var output bytes.Buffer - var stderr bytes.Buffer - - last := len(cmds) - 1 - for i, cmd := range cmds[:last] { - var err error - // Connect each command's stdin to the previous command's stdout - if cmds[i+1].Stdin, err = cmd.StdoutPipe(); err != nil { - return nil, nil, err - } - // Connect each command's stderr to a buffer - cmd.Stderr = &stderr - } - - // Connect the output and error for the last command - cmds[last].Stdout, cmds[last].Stderr = &output, &stderr - - // Start each command - for _, cmd := range cmds { - if err := cmd.Start(); err != nil { - return output.Bytes(), stderr.Bytes(), err - } - } - - // Wait for each command to complete - for _, cmd := range cmds { - if err := cmd.Wait(); err != nil { - return output.Bytes(), stderr.Bytes(), err - } - } +func HostRun(combineWith ...string) string { + return GetEnv("HOST_RUN", "/run", combineWith...) +} - // Return the pipeline output and the collected standard error - return output.Bytes(), stderr.Bytes(), nil +func HostDev(combineWith ...string) string { + return GetEnv("HOST_DEV", "/dev", combineWith...) } // getSysctrlEnv sets LC_ALL=C in a list of env vars for use when running diff --git a/vendor/github.com/shirou/gopsutil/internal/common/common_darwin.go b/vendor/github.com/shirou/gopsutil/internal/common/common_darwin.go index 3e85cc06b..dde5c3903 100644 --- a/vendor/github.com/shirou/gopsutil/internal/common/common_darwin.go +++ b/vendor/github.com/shirou/gopsutil/internal/common/common_darwin.go @@ -13,7 +13,7 @@ import ( ) func DoSysctrlWithContext(ctx context.Context, mib string) ([]string, error) { - sysctl, err := exec.LookPath("/usr/sbin/sysctl") + sysctl, err := exec.LookPath("sysctl") if err != nil { return []string{}, err } diff --git a/vendor/github.com/shirou/gopsutil/internal/common/common_freebsd.go b/vendor/github.com/shirou/gopsutil/internal/common/common_freebsd.go index 107e2c9cf..85bda0e22 100644 --- a/vendor/github.com/shirou/gopsutil/internal/common/common_freebsd.go +++ b/vendor/github.com/shirou/gopsutil/internal/common/common_freebsd.go @@ -3,6 +3,7 @@ package common import ( + "fmt" "os" "os/exec" "strings" @@ -11,8 +12,23 @@ import ( "golang.org/x/sys/unix" ) +func SysctlUint(mib string) (uint64, error) { + buf, err := unix.SysctlRaw(mib) + if err != nil { + return 0, err + } + if len(buf) == 8 { // 64 bit + return *(*uint64)(unsafe.Pointer(&buf[0])), nil + } + if len(buf) == 4 { // 32bit + t := *(*uint32)(unsafe.Pointer(&buf[0])) + return uint64(t), nil + } + return 0, fmt.Errorf("unexpected size: %s, %d", mib, len(buf)) +} + func DoSysctrl(mib string) ([]string, error) { - sysctl, err := exec.LookPath("/sbin/sysctl") + sysctl, err := exec.LookPath("sysctl") if err != nil { return []string{}, err } diff --git a/vendor/github.com/shirou/gopsutil/internal/common/common_linux.go b/vendor/github.com/shirou/gopsutil/internal/common/common_linux.go index 4e829e057..f558b74b3 100644 --- a/vendor/github.com/shirou/gopsutil/internal/common/common_linux.go +++ b/vendor/github.com/shirou/gopsutil/internal/common/common_linux.go @@ -3,13 +3,19 @@ package common import ( + "context" + "fmt" "os" "os/exec" + "path/filepath" + "strconv" "strings" + "sync/atomic" + "time" ) func DoSysctrl(mib string) ([]string, error) { - sysctl, err := exec.LookPath("/sbin/sysctl") + sysctl, err := exec.LookPath("sysctl") if err != nil { return []string{}, err } @@ -37,5 +43,222 @@ func NumProcs() (uint64, error) { if err != nil { return 0, err } - return uint64(len(list)), err + var cnt uint64 + + for _, v := range list { + if _, err = strconv.ParseUint(v, 10, 64); err == nil { + cnt++ + } + } + + return cnt, nil +} + +// cachedBootTime must be accessed via atomic.Load/StoreUint64 +var cachedBootTime uint64 + +func BootTimeWithContext(ctx context.Context) (uint64, error) { + t := atomic.LoadUint64(&cachedBootTime) + if t != 0 { + return t, nil + } + + system, role, err := Virtualization() + if err != nil { + return 0, err + } + + statFile := "stat" + if system == "lxc" && role == "guest" { + // if lxc, /proc/uptime is used. + statFile = "uptime" + } else if system == "docker" && role == "guest" { + // also docker, guest + statFile = "uptime" + } + + filename := HostProc(statFile) + lines, err := ReadLines(filename) + if err != nil { + return 0, err + } + + if statFile == "stat" { + for _, line := range lines { + if strings.HasPrefix(line, "btime") { + f := strings.Fields(line) + if len(f) != 2 { + return 0, fmt.Errorf("wrong btime format") + } + b, err := strconv.ParseInt(f[1], 10, 64) + if err != nil { + return 0, err + } + t = uint64(b) + atomic.StoreUint64(&cachedBootTime, t) + return t, nil + } + } + } else if statFile == "uptime" { + if len(lines) != 1 { + return 0, fmt.Errorf("wrong uptime format") + } + f := strings.Fields(lines[0]) + b, err := strconv.ParseFloat(f[0], 64) + if err != nil { + return 0, err + } + t = uint64(time.Now().Unix()) - uint64(b) + atomic.StoreUint64(&cachedBootTime, t) + return t, nil + } + + return 0, fmt.Errorf("could not find btime") +} + +func Virtualization() (string, string, error) { + return VirtualizationWithContext(context.Background()) +} + +func VirtualizationWithContext(ctx context.Context) (string, string, error) { + var system string + var role string + + filename := HostProc("xen") + if PathExists(filename) { + system = "xen" + role = "guest" // assume guest + + if PathExists(filepath.Join(filename, "capabilities")) { + contents, err := ReadLines(filepath.Join(filename, "capabilities")) + if err == nil { + if StringsContains(contents, "control_d") { + role = "host" + } + } + } + } + + filename = HostProc("modules") + if PathExists(filename) { + contents, err := ReadLines(filename) + if err == nil { + if StringsContains(contents, "kvm") { + system = "kvm" + role = "host" + } else if StringsContains(contents, "vboxdrv") { + system = "vbox" + role = "host" + } else if StringsContains(contents, "vboxguest") { + system = "vbox" + role = "guest" + } else if StringsContains(contents, "vmware") { + system = "vmware" + role = "guest" + } + } + } + + filename = HostProc("cpuinfo") + if PathExists(filename) { + contents, err := ReadLines(filename) + if err == nil { + if StringsContains(contents, "QEMU Virtual CPU") || + StringsContains(contents, "Common KVM processor") || + StringsContains(contents, "Common 32-bit KVM processor") { + system = "kvm" + role = "guest" + } + } + } + + filename = HostProc("bus/pci/devices") + if PathExists(filename) { + contents, err := ReadLines(filename) + if err == nil { + if StringsContains(contents, "virtio-pci") { + role = "guest" + } + } + } + + filename = HostProc() + if PathExists(filepath.Join(filename, "bc", "0")) { + system = "openvz" + role = "host" + } else if PathExists(filepath.Join(filename, "vz")) { + system = "openvz" + role = "guest" + } + + // not use dmidecode because it requires root + if PathExists(filepath.Join(filename, "self", "status")) { + contents, err := ReadLines(filepath.Join(filename, "self", "status")) + if err == nil { + + if StringsContains(contents, "s_context:") || + StringsContains(contents, "VxID:") { + system = "linux-vserver" + } + // TODO: guest or host + } + } + + if PathExists(filepath.Join(filename, "self", "cgroup")) { + contents, err := ReadLines(filepath.Join(filename, "self", "cgroup")) + if err == nil { + if StringsContains(contents, "lxc") { + system = "lxc" + role = "guest" + } else if StringsContains(contents, "docker") { + system = "docker" + role = "guest" + } else if StringsContains(contents, "machine-rkt") { + system = "rkt" + role = "guest" + } else if PathExists("/usr/bin/lxc-version") { + system = "lxc" + role = "host" + } + } + } + + if PathExists(HostEtc("os-release")) { + p, _, err := GetOSRelease() + if err == nil && p == "coreos" { + system = "rkt" // Is it true? + role = "host" + } + } + return system, role, nil +} + +func GetOSRelease() (platform string, version string, err error) { + contents, err := ReadLines(HostEtc("os-release")) + if err != nil { + return "", "", nil // return empty + } + for _, line := range contents { + field := strings.Split(line, "=") + if len(field) < 2 { + continue + } + switch field[0] { + case "ID": // use ID for lowercase + platform = trimQuotes(field[1]) + case "VERSION": + version = trimQuotes(field[1]) + } + } + return platform, version, nil +} + +// Remove quotes of the source string +func trimQuotes(s string) string { + if len(s) >= 2 { + if s[0] == '"' && s[len(s)-1] == '"' { + return s[1 : len(s)-1] + } + } + return s } diff --git a/vendor/github.com/shirou/gopsutil/internal/common/common_openbsd.go b/vendor/github.com/shirou/gopsutil/internal/common/common_openbsd.go index 398f78542..ba73a7eb5 100644 --- a/vendor/github.com/shirou/gopsutil/internal/common/common_openbsd.go +++ b/vendor/github.com/shirou/gopsutil/internal/common/common_openbsd.go @@ -12,7 +12,7 @@ import ( ) func DoSysctrl(mib string) ([]string, error) { - sysctl, err := exec.LookPath("/sbin/sysctl") + sysctl, err := exec.LookPath("sysctl") if err != nil { return []string{}, err } diff --git a/vendor/github.com/shirou/gopsutil/internal/common/common_unix.go b/vendor/github.com/shirou/gopsutil/internal/common/common_unix.go index 750a5926d..9e393bcfa 100644 --- a/vendor/github.com/shirou/gopsutil/internal/common/common_unix.go +++ b/vendor/github.com/shirou/gopsutil/internal/common/common_unix.go @@ -23,7 +23,7 @@ func CallLsofWithContext(ctx context.Context, invoke Invoker, pid int32, args .. } out, err := invoke.CommandWithContext(ctx, lsof, cmd...) if err != nil { - // if no pid found, lsof returnes code 1. + // if no pid found, lsof returns code 1. if err.Error() == "exit status 1" && len(out) == 0 { return []string{}, nil } diff --git a/vendor/github.com/shirou/gopsutil/internal/common/common_windows.go b/vendor/github.com/shirou/gopsutil/internal/common/common_windows.go index b02c5cf24..dbc8b675d 100644 --- a/vendor/github.com/shirou/gopsutil/internal/common/common_windows.go +++ b/vendor/github.com/shirou/gopsutil/internal/common/common_windows.go @@ -4,6 +4,9 @@ package common import ( "context" + "path/filepath" + "strings" + "syscall" "unsafe" "github.com/StackExchange/wmi" @@ -47,10 +50,10 @@ const ( ) var ( - Modkernel32 = windows.NewLazyDLL("kernel32.dll") - ModNt = windows.NewLazyDLL("ntdll.dll") - ModPdh = windows.NewLazyDLL("pdh.dll") - ModPsapi = windows.NewLazyDLL("psapi.dll") + Modkernel32 = windows.NewLazySystemDLL("kernel32.dll") + ModNt = windows.NewLazySystemDLL("ntdll.dll") + ModPdh = windows.NewLazySystemDLL("pdh.dll") + ModPsapi = windows.NewLazySystemDLL("psapi.dll") ProcGetSystemTimes = Modkernel32.NewProc("GetSystemTimes") ProcNtQuerySystemInformation = ModNt.NewProc("NtQuerySystemInformation") @@ -59,6 +62,8 @@ var ( PdhCollectQueryData = ModPdh.NewProc("PdhCollectQueryData") PdhGetFormattedCounterValue = ModPdh.NewProc("PdhGetFormattedCounterValue") PdhCloseQuery = ModPdh.NewProc("PdhCloseQuery") + + procQueryDosDeviceW = Modkernel32.NewProc("QueryDosDeviceW") ) type FILETIME struct { @@ -133,3 +138,23 @@ func WMIQueryWithContext(ctx context.Context, query string, dst interface{}, con return err } } + +// Convert paths using native DOS format like: +// "\Device\HarddiskVolume1\Windows\systemew\file.txt" +// into: +// "C:\Windows\systemew\file.txt" +func ConvertDOSPath(p string) string { + rawDrive := strings.Join(strings.Split(p, `\`)[:3], `\`) + + for d := 'A'; d <= 'Z'; d++ { + szDeviceName := string(d) + ":" + szTarget := make([]uint16, 512) + ret, _, _ := procQueryDosDeviceW.Call(uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(szDeviceName))), + uintptr(unsafe.Pointer(&szTarget[0])), + uintptr(len(szTarget))) + if ret != 0 && windows.UTF16ToString(szTarget[:]) == rawDrive { + return filepath.Join(szDeviceName, p[len(rawDrive):]) + } + } + return p +} diff --git a/vendor/github.com/shirou/gopsutil/mem/mem.go b/vendor/github.com/shirou/gopsutil/mem/mem.go index fd8337af8..8e444ba0a 100644 --- a/vendor/github.com/shirou/gopsutil/mem/mem.go +++ b/vendor/github.com/shirou/gopsutil/mem/mem.go @@ -42,21 +42,40 @@ type VirtualMemoryStat struct { Inactive uint64 `json:"inactive"` Wired uint64 `json:"wired"` + // FreeBSD specific numbers: + // https://reviews.freebsd.org/D8467 + Laundry uint64 `json:"laundry"` + // Linux specific numbers // https://www.centos.org/docs/5/html/5.1/Deployment_Guide/s2-proc-meminfo.html // https://www.kernel.org/doc/Documentation/filesystems/proc.txt // https://www.kernel.org/doc/Documentation/vm/overcommit-accounting - Buffers uint64 `json:"buffers"` - Cached uint64 `json:"cached"` - Writeback uint64 `json:"writeback"` - Dirty uint64 `json:"dirty"` - WritebackTmp uint64 `json:"writebacktmp"` - Shared uint64 `json:"shared"` - Slab uint64 `json:"slab"` - PageTables uint64 `json:"pagetables"` - SwapCached uint64 `json:"swapcached"` - CommitLimit uint64 `json:"commitlimit"` - CommittedAS uint64 `json:"committedas"` + Buffers uint64 `json:"buffers"` + Cached uint64 `json:"cached"` + Writeback uint64 `json:"writeback"` + Dirty uint64 `json:"dirty"` + WritebackTmp uint64 `json:"writebacktmp"` + Shared uint64 `json:"shared"` + Slab uint64 `json:"slab"` + SReclaimable uint64 `json:"sreclaimable"` + SUnreclaim uint64 `json:"sunreclaim"` + PageTables uint64 `json:"pagetables"` + SwapCached uint64 `json:"swapcached"` + CommitLimit uint64 `json:"commitlimit"` + CommittedAS uint64 `json:"committedas"` + HighTotal uint64 `json:"hightotal"` + HighFree uint64 `json:"highfree"` + LowTotal uint64 `json:"lowtotal"` + LowFree uint64 `json:"lowfree"` + SwapTotal uint64 `json:"swaptotal"` + SwapFree uint64 `json:"swapfree"` + Mapped uint64 `json:"mapped"` + VMallocTotal uint64 `json:"vmalloctotal"` + VMallocUsed uint64 `json:"vmallocused"` + VMallocChunk uint64 `json:"vmallocchunk"` + HugePagesTotal uint64 `json:"hugepagestotal"` + HugePagesFree uint64 `json:"hugepagesfree"` + HugePageSize uint64 `json:"hugepagesize"` } type SwapMemoryStat struct { @@ -66,6 +85,9 @@ type SwapMemoryStat struct { UsedPercent float64 `json:"usedPercent"` Sin uint64 `json:"sin"` Sout uint64 `json:"sout"` + PgIn uint64 `json:"pgin"` + PgOut uint64 `json:"pgout"` + PgFault uint64 `json:"pgfault"` } func (m VirtualMemoryStat) String() string { diff --git a/vendor/github.com/shirou/gopsutil/mem/mem_darwin.go b/vendor/github.com/shirou/gopsutil/mem/mem_darwin.go index 4fe7009b3..fac748151 100644 --- a/vendor/github.com/shirou/gopsutil/mem/mem_darwin.go +++ b/vendor/github.com/shirou/gopsutil/mem/mem_darwin.go @@ -5,10 +5,9 @@ package mem import ( "context" "encoding/binary" - "strconv" - "strings" + "fmt" + "unsafe" - "github.com/shirou/gopsutil/internal/common" "golang.org/x/sys/unix" ) @@ -27,46 +26,42 @@ func getHwMemsize() (uint64, error) { return total, nil } +// xsw_usage in sys/sysctl.h +type swapUsage struct { + Total uint64 + Avail uint64 + Used uint64 + Pagesize int32 + Encrypted bool +} + // SwapMemory returns swapinfo. func SwapMemory() (*SwapMemoryStat, error) { return SwapMemoryWithContext(context.Background()) } func SwapMemoryWithContext(ctx context.Context) (*SwapMemoryStat, error) { + // https://github.com/yanllearnn/go-osstat/blob/ae8a279d26f52ec946a03698c7f50a26cfb427e3/memory/memory_darwin.go var ret *SwapMemoryStat - swapUsage, err := common.DoSysctrlWithContext(ctx, "vm.swapusage") + value, err := unix.SysctlRaw("vm.swapusage") if err != nil { return ret, err } - - total := strings.Replace(swapUsage[2], "M", "", 1) - used := strings.Replace(swapUsage[5], "M", "", 1) - free := strings.Replace(swapUsage[8], "M", "", 1) - - total_v, err := strconv.ParseFloat(total, 64) - if err != nil { - return nil, err - } - used_v, err := strconv.ParseFloat(used, 64) - if err != nil { - return nil, err - } - free_v, err := strconv.ParseFloat(free, 64) - if err != nil { - return nil, err + if len(value) != 32 { + return ret, fmt.Errorf("unexpected output of sysctl vm.swapusage: %v (len: %d)", value, len(value)) } + swap := (*swapUsage)(unsafe.Pointer(&value[0])) u := float64(0) - if total_v != 0 { - u = ((total_v - free_v) / total_v) * 100.0 + if swap.Total != 0 { + u = ((float64(swap.Total) - float64(swap.Avail)) / float64(swap.Total)) * 100.0 } - // vm.swapusage shows "M", multiply 1024 * 1024 to convert bytes. ret = &SwapMemoryStat{ - Total: uint64(total_v * 1024 * 1024), - Used: uint64(used_v * 1024 * 1024), - Free: uint64(free_v * 1024 * 1024), + Total: swap.Total, + Used: swap.Used, + Free: swap.Avail, UsedPercent: u, } diff --git a/vendor/github.com/shirou/gopsutil/mem/mem_freebsd.go b/vendor/github.com/shirou/gopsutil/mem/mem_freebsd.go index 1fa880b8d..f91efc9e3 100644 --- a/vendor/github.com/shirou/gopsutil/mem/mem_freebsd.go +++ b/vendor/github.com/shirou/gopsutil/mem/mem_freebsd.go @@ -8,6 +8,8 @@ import ( "unsafe" "golang.org/x/sys/unix" + + "github.com/shirou/gopsutil/internal/common" ) func VirtualMemory() (*VirtualMemoryStat, error) { @@ -15,51 +17,62 @@ func VirtualMemory() (*VirtualMemoryStat, error) { } func VirtualMemoryWithContext(ctx context.Context) (*VirtualMemoryStat, error) { - pageSize, err := unix.SysctlUint32("vm.stats.vm.v_page_size") + pageSize, err := common.SysctlUint("vm.stats.vm.v_page_size") if err != nil { return nil, err } - pageCount, err := unix.SysctlUint32("vm.stats.vm.v_page_count") + physmem, err := common.SysctlUint("hw.physmem") if err != nil { return nil, err } - free, err := unix.SysctlUint32("vm.stats.vm.v_free_count") + + free, err := common.SysctlUint("vm.stats.vm.v_free_count") if err != nil { return nil, err } - active, err := unix.SysctlUint32("vm.stats.vm.v_active_count") + active, err := common.SysctlUint("vm.stats.vm.v_active_count") if err != nil { return nil, err } - inactive, err := unix.SysctlUint32("vm.stats.vm.v_inactive_count") + inactive, err := common.SysctlUint("vm.stats.vm.v_inactive_count") if err != nil { return nil, err } - cached, err := unix.SysctlUint32("vm.stats.vm.v_cache_count") + buffers, err := common.SysctlUint("vfs.bufspace") if err != nil { return nil, err } - buffers, err := unix.SysctlUint32("vfs.bufspace") + wired, err := common.SysctlUint("vm.stats.vm.v_wire_count") if err != nil { return nil, err } - wired, err := unix.SysctlUint32("vm.stats.vm.v_wire_count") - if err != nil { - return nil, err + var cached, laundry uint64 + osreldate, _ := common.SysctlUint("kern.osreldate") + if osreldate < 1102000 { + cached, err = common.SysctlUint("vm.stats.vm.v_cache_count") + if err != nil { + return nil, err + } + } else { + laundry, err = common.SysctlUint("vm.stats.vm.v_laundry_count") + if err != nil { + return nil, err + } } - p := uint64(pageSize) + p := pageSize ret := &VirtualMemoryStat{ - Total: uint64(pageCount) * p, - Free: uint64(free) * p, - Active: uint64(active) * p, - Inactive: uint64(inactive) * p, - Cached: uint64(cached) * p, - Buffers: uint64(buffers), - Wired: uint64(wired) * p, + Total: physmem, + Free: free * p, + Active: active * p, + Inactive: inactive * p, + Cached: cached * p, + Buffers: buffers, + Wired: wired * p, + Laundry: laundry * p, } - ret.Available = ret.Inactive + ret.Cached + ret.Free + ret.Available = ret.Inactive + ret.Cached + ret.Free + ret.Laundry ret.Used = ret.Total - ret.Available ret.UsedPercent = float64(ret.Used) / float64(ret.Total) * 100.0 @@ -74,11 +87,22 @@ func SwapMemory() (*SwapMemoryStat, error) { // Constants from vm/vm_param.h // nolint: golint const ( - XSWDEV_VERSION = 1 + XSWDEV_VERSION11 = 1 + XSWDEV_VERSION = 2 ) // Types from vm/vm_param.h type xswdev struct { + Version uint32 // Version is the version + Dev uint64 // Dev is the device identifier + Flags int32 // Flags is the swap flags applied to the device + NBlks int32 // NBlks is the total number of blocks + Used int32 // Used is the number of blocks used +} + +// xswdev11 is a compatibility for under FreeBSD 11 +// sys/vm/swap_pager.c +type xswdev11 struct { Version uint32 // Version is the version Dev uint32 // Dev is the device identifier Flags int32 // Flags is the swap flags applied to the device @@ -88,7 +112,7 @@ type xswdev struct { func SwapMemoryWithContext(ctx context.Context) (*SwapMemoryStat, error) { // FreeBSD can have multiple swap devices so we total them up - i, err := unix.SysctlUint32("vm.nswapdev") + i, err := common.SysctlUint("vm.nswapdev") if err != nil { return nil, err } @@ -99,11 +123,11 @@ func SwapMemoryWithContext(ctx context.Context) (*SwapMemoryStat, error) { c := int(i) - i, err = unix.SysctlUint32("vm.stats.vm.v_page_size") + i, err = common.SysctlUint("vm.stats.vm.v_page_size") if err != nil { return nil, err } - pageSize := uint64(i) + pageSize := i var buf []byte s := &SwapMemoryStat{} @@ -113,12 +137,23 @@ func SwapMemoryWithContext(ctx context.Context) (*SwapMemoryStat, error) { return nil, err } + // first, try to parse with version 2 xsw := (*xswdev)(unsafe.Pointer(&buf[0])) - if xsw.Version != XSWDEV_VERSION { + if xsw.Version == XSWDEV_VERSION11 { + // this is version 1, so try to parse again + xsw := (*xswdev11)(unsafe.Pointer(&buf[0])) + if xsw.Version != XSWDEV_VERSION11 { + return nil, errors.New("xswdev version mismatch(11)") + } + s.Total += uint64(xsw.NBlks) + s.Used += uint64(xsw.Used) + } else if xsw.Version != XSWDEV_VERSION { return nil, errors.New("xswdev version mismatch") + } else { + s.Total += uint64(xsw.NBlks) + s.Used += uint64(xsw.Used) } - s.Total += uint64(xsw.NBlks) - s.Used += uint64(xsw.Used) + } if s.Total != 0 { diff --git a/vendor/github.com/shirou/gopsutil/mem/mem_linux.go b/vendor/github.com/shirou/gopsutil/mem/mem_linux.go index d326fcc65..66ccca9c9 100644 --- a/vendor/github.com/shirou/gopsutil/mem/mem_linux.go +++ b/vendor/github.com/shirou/gopsutil/mem/mem_linux.go @@ -4,6 +4,9 @@ package mem import ( "context" + "encoding/json" + "math" + "os" "strconv" "strings" @@ -11,17 +14,56 @@ import ( "golang.org/x/sys/unix" ) +type VirtualMemoryExStat struct { + ActiveFile uint64 `json:"activefile"` + InactiveFile uint64 `json:"inactivefile"` + ActiveAnon uint64 `json:"activeanon"` + InactiveAnon uint64 `json:"inactiveanon"` + Unevictable uint64 `json:"unevictable"` +} + +func (v VirtualMemoryExStat) String() string { + s, _ := json.Marshal(v) + return string(s) +} + func VirtualMemory() (*VirtualMemoryStat, error) { return VirtualMemoryWithContext(context.Background()) } func VirtualMemoryWithContext(ctx context.Context) (*VirtualMemoryStat, error) { + vm, _, err := fillFromMeminfoWithContext(ctx) + if err != nil { + return nil, err + } + return vm, nil +} + +func VirtualMemoryEx() (*VirtualMemoryExStat, error) { + return VirtualMemoryExWithContext(context.Background()) +} + +func VirtualMemoryExWithContext(ctx context.Context) (*VirtualMemoryExStat, error) { + _, vmEx, err := fillFromMeminfoWithContext(ctx) + if err != nil { + return nil, err + } + return vmEx, nil +} + +func fillFromMeminfoWithContext(ctx context.Context) (*VirtualMemoryStat, *VirtualMemoryExStat, error) { filename := common.HostProc("meminfo") lines, _ := common.ReadLines(filename) + // flag if MemAvailable is in /proc/meminfo (kernel 3.14+) memavail := false + activeFile := false // "Active(file)" not available: 2.6.28 / Dec 2008 + inactiveFile := false // "Inactive(file)" not available: 2.6.28 / Dec 2008 + sReclaimable := false // "SReclaimable:" not available: 2.6.19 / Nov 2006 ret := &VirtualMemoryStat{} + retEx := &VirtualMemoryExStat{} + for _, line := range lines { fields := strings.Split(line, ":") if len(fields) != 2 { @@ -33,7 +75,7 @@ func VirtualMemoryWithContext(ctx context.Context) (*VirtualMemoryStat, error) { t, err := strconv.ParseUint(value, 10, 64) if err != nil { - return ret, err + return ret, retEx,err } switch key { case "MemTotal": @@ -51,6 +93,18 @@ func VirtualMemoryWithContext(ctx context.Context) (*VirtualMemoryStat, error) { ret.Active = t * 1024 case "Inactive": ret.Inactive = t * 1024 + case "Active(anon)": + retEx.ActiveAnon = t * 1024 + case "Inactive(anon)": + retEx.InactiveAnon = t * 1024 + case "Active(file)": + activeFile = true + retEx.ActiveFile = t * 1024 + case "Inactive(file)": + inactiveFile = true + retEx.InactiveFile = t * 1024 + case "Unevictable": + retEx.Unevictable = t * 1024 case "Writeback": ret.Writeback = t * 1024 case "WritebackTmp": @@ -61,6 +115,11 @@ func VirtualMemoryWithContext(ctx context.Context) (*VirtualMemoryStat, error) { ret.Shared = t * 1024 case "Slab": ret.Slab = t * 1024 + case "SReclaimable": + sReclaimable = true + ret.SReclaimable = t * 1024 + case "SUnreclaim": + ret.SUnreclaim = t * 1024 case "PageTables": ret.PageTables = t * 1024 case "SwapCached": @@ -69,15 +128,49 @@ func VirtualMemoryWithContext(ctx context.Context) (*VirtualMemoryStat, error) { ret.CommitLimit = t * 1024 case "Committed_AS": ret.CommittedAS = t * 1024 + case "HighTotal": + ret.HighTotal = t * 1024 + case "HighFree": + ret.HighFree = t * 1024 + case "LowTotal": + ret.LowTotal = t * 1024 + case "LowFree": + ret.LowFree = t * 1024 + case "SwapTotal": + ret.SwapTotal = t * 1024 + case "SwapFree": + ret.SwapFree = t * 1024 + case "Mapped": + ret.Mapped = t * 1024 + case "VmallocTotal": + ret.VMallocTotal = t * 1024 + case "VmallocUsed": + ret.VMallocUsed = t * 1024 + case "VmallocChunk": + ret.VMallocChunk = t * 1024 + case "HugePages_Total": + ret.HugePagesTotal = t + case "HugePages_Free": + ret.HugePagesFree = t + case "Hugepagesize": + ret.HugePageSize = t * 1024 } } + + ret.Cached += ret.SReclaimable + if !memavail { - ret.Available = ret.Free + ret.Buffers + ret.Cached + if activeFile && inactiveFile && sReclaimable { + ret.Available = calcuateAvailVmem(ret, retEx) + } else { + ret.Available = ret.Cached + ret.Free + } } + ret.Used = ret.Total - ret.Free - ret.Buffers - ret.Cached ret.UsedPercent = float64(ret.Used) / float64(ret.Total) * 100.0 - return ret, nil + return ret, retEx, nil } func SwapMemory() (*SwapMemoryStat, error) { @@ -121,7 +214,69 @@ func SwapMemoryWithContext(ctx context.Context) (*SwapMemoryStat, error) { continue } ret.Sout = value * 4 * 1024 + case "pgpgin": + value, err := strconv.ParseUint(fields[1], 10, 64) + if err != nil { + continue + } + ret.PgIn = value * 4 * 1024 + case "pgpgout": + value, err := strconv.ParseUint(fields[1], 10, 64) + if err != nil { + continue + } + ret.PgOut = value * 4 * 1024 + case "pgfault": + value, err := strconv.ParseUint(fields[1], 10, 64) + if err != nil { + continue + } + ret.PgFault = value * 4 * 1024 } } return ret, nil } + +// calcuateAvailVmem is a fallback under kernel 3.14 where /proc/meminfo does not provide +// "MemAvailable:" column. It reimplements an algorithm from the link below +// https://github.com/giampaolo/psutil/pull/890 +func calcuateAvailVmem(ret *VirtualMemoryStat, retEx *VirtualMemoryExStat) uint64 { + var watermarkLow uint64 + + fn := common.HostProc("zoneinfo") + lines, err := common.ReadLines(fn) + + if err != nil { + return ret.Free + ret.Cached // fallback under kernel 2.6.13 + } + + pagesize := uint64(os.Getpagesize()) + watermarkLow = 0 + + for _, line := range lines { + fields := strings.Fields(line) + + if strings.HasPrefix(fields[0], "low") { + lowValue, err := strconv.ParseUint(fields[1], 10, 64) + + if err != nil { + lowValue = 0 + } + watermarkLow += lowValue + } + } + + watermarkLow *= pagesize + + availMemory := ret.Free - watermarkLow + pageCache := retEx.ActiveFile + retEx.InactiveFile + pageCache -= uint64(math.Min(float64(pageCache/2), float64(watermarkLow))) + availMemory += pageCache + availMemory += ret.SReclaimable - uint64(math.Min(float64(ret.SReclaimable/2.0), float64(watermarkLow))) + + if availMemory < 0 { + availMemory = 0 + } + + return availMemory +} diff --git a/vendor/github.com/shirou/gopsutil/mem/mem_solaris.go b/vendor/github.com/shirou/gopsutil/mem/mem_solaris.go index 0736bc41c..08512733c 100644 --- a/vendor/github.com/shirou/gopsutil/mem/mem_solaris.go +++ b/vendor/github.com/shirou/gopsutil/mem/mem_solaris.go @@ -52,7 +52,7 @@ func SwapMemoryWithContext(ctx context.Context) (*SwapMemoryStat, error) { } func zoneName() (string, error) { - zonename, err := exec.LookPath("/usr/bin/zonename") + zonename, err := exec.LookPath("zonename") if err != nil { return "", err } @@ -69,7 +69,7 @@ func zoneName() (string, error) { var globalZoneMemoryCapacityMatch = regexp.MustCompile(`memory size: ([\d]+) Megabytes`) func globalZoneMemoryCapacity() (uint64, error) { - prtconf, err := exec.LookPath("/usr/sbin/prtconf") + prtconf, err := exec.LookPath("prtconf") if err != nil { return 0, err } @@ -96,7 +96,7 @@ func globalZoneMemoryCapacity() (uint64, error) { var kstatMatch = regexp.MustCompile(`([^\s]+)[\s]+([^\s]*)`) func nonGlobalZoneMemoryCapacity() (uint64, error) { - kstat, err := exec.LookPath("/usr/bin/kstat") + kstat, err := exec.LookPath("kstat") if err != nil { return 0, err } diff --git a/vendor/github.com/shirou/gopsutil/mem/mem_windows.go b/vendor/github.com/shirou/gopsutil/mem/mem_windows.go index cc9ce82e0..cfdf8bd1d 100644 --- a/vendor/github.com/shirou/gopsutil/mem/mem_windows.go +++ b/vendor/github.com/shirou/gopsutil/mem/mem_windows.go @@ -80,11 +80,17 @@ func SwapMemoryWithContext(ctx context.Context) (*SwapMemoryStat, error) { tot := perfInfo.commitLimit * perfInfo.pageSize used := perfInfo.commitTotal * perfInfo.pageSize free := tot - used + var usedPercent float64 + if tot == 0 { + usedPercent = 0 + } else { + usedPercent = float64(used) / float64(tot) + } ret := &SwapMemoryStat{ Total: tot, Used: used, Free: free, - UsedPercent: float64(used) / float64(tot), + UsedPercent: usedPercent, } return ret, nil diff --git a/vendor/github.com/shirou/gopsutil/mem/types_openbsd.go b/vendor/github.com/shirou/gopsutil/mem/types_openbsd.go deleted file mode 100644 index 83cb91a19..000000000 --- a/vendor/github.com/shirou/gopsutil/mem/types_openbsd.go +++ /dev/null @@ -1,34 +0,0 @@ -// +build ignore - -/* -Input to cgo -godefs. -*/ - -package mem - -/* -#include -#include -#include -#include - -*/ -import "C" - -// Machine characteristics; for internal use. - -const ( - CTLVm = 2 - CTLVfs = 10 - VmUvmexp = 4 // get uvmexp - VfsGeneric = 0 - VfsBcacheStat = 3 -) - -const ( - sizeOfUvmexp = C.sizeof_struct_uvmexp - sizeOfBcachestats = C.sizeof_struct_bcachestats -) - -type Uvmexp C.struct_uvmexp -type Bcachestats C.struct_bcachestats diff --git a/vendor/github.com/shogo82148/go-shuffle/.travis.yml b/vendor/github.com/shogo82148/go-shuffle/.travis.yml index d1c302ab8..2dfc58f14 100644 --- a/vendor/github.com/shogo82148/go-shuffle/.travis.yml +++ b/vendor/github.com/shogo82148/go-shuffle/.travis.yml @@ -1,12 +1,10 @@ language: go go: - - '1.3.x' - - '1.4.x' - - '1.5.x' - - '1.6.x' - - '1.7.x' - - '1.8.x' - - '1.9.x' - - '1.10.x' + - '1.3' + - '1.4' + - '1.5' + - '1.6' + - '1.7' + - '1.8' - 'tip' diff --git a/vendor/github.com/shogo82148/go-shuffle/interface.go b/vendor/github.com/shogo82148/go-shuffle/interface.go deleted file mode 100644 index 6d86b8cec..000000000 --- a/vendor/github.com/shogo82148/go-shuffle/interface.go +++ /dev/null @@ -1,34 +0,0 @@ -package shuffle - -import "sort" - -// Interface is a type, typically a collection, that satisfies shuffle.Interface can be -// shuffled by the routines in this package. -type Interface interface { - // Len is the number of elements in the collection. - Len() int - // Swap swaps the elements with indexes i and j. - Swap(i, j int) -} - -// Int64Slice attaches the methods of Interface to []int64, sorting in increasing order. -type Int64Slice []int64 - -func (p Int64Slice) Len() int { return len(p) } -func (p Int64Slice) Less(i, j int) bool { return p[i] < p[j] } -func (p Int64Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - -// SortInt64s sorts a slice of int64s in increasing order. -func SortInt64s(a []int64) { sort.Sort(Int64Slice(a)) } - -// Ints shuffles a slice of ints. -func Ints(a []int) { Shuffle(sort.IntSlice(a)) } - -// Int64s shuffles a slice of int64s. -func Int64s(a []int64) { Shuffle(Int64Slice(a)) } - -// Float64s shuffles a slice of float64s. -func Float64s(a []float64) { Shuffle(sort.Float64Slice(a)) } - -// Strings shuffles a slice of strings. -func Strings(a []string) { Shuffle(sort.StringSlice(a)) } diff --git a/vendor/github.com/shogo82148/go-shuffle/shuffle.go b/vendor/github.com/shogo82148/go-shuffle/shuffle.go index 96ebe469d..73f43d07d 100644 --- a/vendor/github.com/shogo82148/go-shuffle/shuffle.go +++ b/vendor/github.com/shogo82148/go-shuffle/shuffle.go @@ -1,5 +1,3 @@ -//+build go1.10 - // Package shuffle provides primitives for shuffling slices and user-defined // collections. package shuffle @@ -9,11 +7,46 @@ import ( "sort" ) +// Interface is a type, typically a collection, that satisfies shuffle.Interface can be +// shuffled by the routines in this package. +type Interface interface { + // Len is the number of elements in the collection. + Len() int + // Swap swaps the elements with indexes i and j. + Swap(i, j int) +} + +// Int64Slice attaches the methods of Interface to []int64, sorting in increasing order. +type Int64Slice []int64 + +func (p Int64Slice) Len() int { return len(p) } +func (p Int64Slice) Less(i, j int) bool { return p[i] < p[j] } +func (p Int64Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + +// SortInt64s sorts a slice of int64s in increasing order. +func SortInt64s(a []int64) { sort.Sort(Int64Slice(a)) } + // Shuffle shuffles Data. func Shuffle(data Interface) { - rand.Shuffle(data.Len(), data.Swap) + n := data.Len() + for i := n - 1; i >= 0; i-- { + j := rand.Intn(i + 1) + data.Swap(i, j) + } } +// Ints shuffles a slice of ints. +func Ints(a []int) { Shuffle(sort.IntSlice(a)) } + +// Int64s shuffles a slice of int64s. +func Int64s(a []int64) { Shuffle(Int64Slice(a)) } + +// Float64s shuffles a slice of float64s. +func Float64s(a []float64) { Shuffle(sort.Float64Slice(a)) } + +// Strings shuffles a slice of strings. +func Strings(a []string) { Shuffle(sort.StringSlice(a)) } + // A Shuffler provides Shuffle type Shuffler rand.Rand @@ -23,7 +56,11 @@ func New(src rand.Source) *Shuffler { return (*Shuffler)(rand.New(src)) } // Shuffle shuffles Data. func (s *Shuffler) Shuffle(data Interface) { - rand.Shuffle(data.Len(), data.Swap) + n := data.Len() + for i := n - 1; i >= 0; i-- { + j := (*rand.Rand)(s).Intn(i + 1) + data.Swap(i, j) + } } // Ints shuffles a slice of ints. diff --git a/vendor/github.com/shogo82148/go-shuffle/shuffle_go1.9.go b/vendor/github.com/shogo82148/go-shuffle/shuffle_go1.9.go deleted file mode 100644 index 996396752..000000000 --- a/vendor/github.com/shogo82148/go-shuffle/shuffle_go1.9.go +++ /dev/null @@ -1,44 +0,0 @@ -//+build !go1.10 - -// Package shuffle provides primitives for shuffling slices and user-defined -// collections. -package shuffle - -import ( - "math/rand" - "sort" -) - -// Shuffle shuffles Data. -func Shuffle(data Interface) { - n := data.Len() - for i := n - 1; i >= 0; i-- { - j := rand.Intn(i + 1) - data.Swap(i, j) - } -} - -// A Shuffler provides Shuffle -type Shuffler rand.Rand - -// New returns a new Shuffler that uses random values from src -// to shuffle -func New(src rand.Source) *Shuffler { return (*Shuffler)(rand.New(src)) } - -// Shuffle shuffles Data. -func (s *Shuffler) Shuffle(data Interface) { - n := data.Len() - for i := n - 1; i >= 0; i-- { - j := (*rand.Rand)(s).Intn(i + 1) - data.Swap(i, j) - } -} - -// Ints shuffles a slice of ints. -func (s *Shuffler) Ints(a []int) { s.Shuffle(sort.IntSlice(a)) } - -// Float64s shuffles a slice of float64s. -func (s *Shuffler) Float64s(a []float64) { s.Shuffle(sort.Float64Slice(a)) } - -// Strings shuffles a slice of strings. -func (s *Shuffler) Strings(a []string) { s.Shuffle(sort.StringSlice(a)) } diff --git a/vendor/github.com/shogo82148/go-shuffle/shuffle_slice.go b/vendor/github.com/shogo82148/go-shuffle/shuffle_slice.go index 4ac12030a..bf4ddf1e6 100644 --- a/vendor/github.com/shogo82148/go-shuffle/shuffle_slice.go +++ b/vendor/github.com/shogo82148/go-shuffle/shuffle_slice.go @@ -1,4 +1,4 @@ -//+build go1.10 +//+build go1.8 package shuffle @@ -11,12 +11,20 @@ import ( func Slice(slice interface{}) { rv := reflect.ValueOf(slice) swap := reflect.Swapper(slice) - rand.Shuffle(rv.Len(), swap) + n := rv.Len() + for i := n - 1; i >= 0; i-- { + j := rand.Intn(i + 1) + swap(i, j) + } } // Slice shuffles the slice. func (s *Shuffler) Slice(slice Interface) { rv := reflect.ValueOf(slice) swap := reflect.Swapper(slice) - (*rand.Rand)(s).Shuffle(rv.Len(), swap) + n := rv.Len() + for i := n - 1; i >= 0; i-- { + j := (*rand.Rand)(s).Intn(i + 1) + swap(i, j) + } } diff --git a/vendor/github.com/shogo82148/go-shuffle/shuffle_slice_g1.9.go b/vendor/github.com/shogo82148/go-shuffle/shuffle_slice_g1.9.go deleted file mode 100644 index 309917b8a..000000000 --- a/vendor/github.com/shogo82148/go-shuffle/shuffle_slice_g1.9.go +++ /dev/null @@ -1,30 +0,0 @@ -//+build go1.8,!go1.10 - -package shuffle - -import ( - "math/rand" - "reflect" -) - -// Slice shuffles the slice. -func Slice(slice interface{}) { - rv := reflect.ValueOf(slice) - swap := reflect.Swapper(slice) - n := rv.Len() - for i := n - 1; i >= 0; i-- { - j := rand.Intn(i + 1) - swap(i, j) - } -} - -// Slice shuffles the slice. -func (s *Shuffler) Slice(slice Interface) { - rv := reflect.ValueOf(slice) - swap := reflect.Swapper(slice) - n := rv.Len() - for i := n - 1; i >= 0; i-- { - j := (*rand.Rand)(s).Intn(i + 1) - swap(i, j) - } -} diff --git a/vendor/github.com/sirupsen/logrus/.gitignore b/vendor/github.com/sirupsen/logrus/.gitignore deleted file mode 100644 index 66be63a00..000000000 --- a/vendor/github.com/sirupsen/logrus/.gitignore +++ /dev/null @@ -1 +0,0 @@ -logrus diff --git a/vendor/github.com/sirupsen/logrus/.travis.yml b/vendor/github.com/sirupsen/logrus/.travis.yml deleted file mode 100644 index a23296a53..000000000 --- a/vendor/github.com/sirupsen/logrus/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -language: go -go: - - 1.6.x - - 1.7.x - - 1.8.x - - tip -env: - - GOMAXPROCS=4 GORACE=halt_on_error=1 -install: - - go get github.com/stretchr/testify/assert - - go get gopkg.in/gemnasium/logrus-airbrake-hook.v2 - - go get golang.org/x/sys/unix - - go get golang.org/x/sys/windows -script: - - go test -race -v ./... diff --git a/vendor/github.com/sirupsen/logrus/CHANGELOG.md b/vendor/github.com/sirupsen/logrus/CHANGELOG.md deleted file mode 100644 index 1bd1deb29..000000000 --- a/vendor/github.com/sirupsen/logrus/CHANGELOG.md +++ /dev/null @@ -1,123 +0,0 @@ -# 1.0.5 - -* Fix hooks race (#707) -* Fix panic deadlock (#695) - -# 1.0.4 - -* Fix race when adding hooks (#612) -* Fix terminal check in AppEngine (#635) - -# 1.0.3 - -* Replace example files with testable examples - -# 1.0.2 - -* bug: quote non-string values in text formatter (#583) -* Make (*Logger) SetLevel a public method - -# 1.0.1 - -* bug: fix escaping in text formatter (#575) - -# 1.0.0 - -* Officially changed name to lower-case -* bug: colors on Windows 10 (#541) -* bug: fix race in accessing level (#512) - -# 0.11.5 - -* feature: add writer and writerlevel to entry (#372) - -# 0.11.4 - -* bug: fix undefined variable on solaris (#493) - -# 0.11.3 - -* formatter: configure quoting of empty values (#484) -* formatter: configure quoting character (default is `"`) (#484) -* bug: fix not importing io correctly in non-linux environments (#481) - -# 0.11.2 - -* bug: fix windows terminal detection (#476) - -# 0.11.1 - -* bug: fix tty detection with custom out (#471) - -# 0.11.0 - -* performance: Use bufferpool to allocate (#370) -* terminal: terminal detection for app-engine (#343) -* feature: exit handler (#375) - -# 0.10.0 - -* feature: Add a test hook (#180) -* feature: `ParseLevel` is now case-insensitive (#326) -* feature: `FieldLogger` interface that generalizes `Logger` and `Entry` (#308) -* performance: avoid re-allocations on `WithFields` (#335) - -# 0.9.0 - -* logrus/text_formatter: don't emit empty msg -* logrus/hooks/airbrake: move out of main repository -* logrus/hooks/sentry: move out of main repository -* logrus/hooks/papertrail: move out of main repository -* logrus/hooks/bugsnag: move out of main repository -* logrus/core: run tests with `-race` -* logrus/core: detect TTY based on `stderr` -* logrus/core: support `WithError` on logger -* logrus/core: Solaris support - -# 0.8.7 - -* logrus/core: fix possible race (#216) -* logrus/doc: small typo fixes and doc improvements - - -# 0.8.6 - -* hooks/raven: allow passing an initialized client - -# 0.8.5 - -* logrus/core: revert #208 - -# 0.8.4 - -* formatter/text: fix data race (#218) - -# 0.8.3 - -* logrus/core: fix entry log level (#208) -* logrus/core: improve performance of text formatter by 40% -* logrus/core: expose `LevelHooks` type -* logrus/core: add support for DragonflyBSD and NetBSD -* formatter/text: print structs more verbosely - -# 0.8.2 - -* logrus: fix more Fatal family functions - -# 0.8.1 - -* logrus: fix not exiting on `Fatalf` and `Fatalln` - -# 0.8.0 - -* logrus: defaults to stderr instead of stdout -* hooks/sentry: add special field for `*http.Request` -* formatter/text: ignore Windows for colors - -# 0.7.3 - -* formatter/\*: allow configuration of timestamp layout - -# 0.7.2 - -* formatter/text: Add configuration option for time format (#158) diff --git a/vendor/github.com/sirupsen/logrus/LICENSE b/vendor/github.com/sirupsen/logrus/LICENSE deleted file mode 100644 index f090cb42f..000000000 --- a/vendor/github.com/sirupsen/logrus/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Simon Eskildsen - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/github.com/sirupsen/logrus/README.md b/vendor/github.com/sirupsen/logrus/README.md deleted file mode 100644 index f77819b16..000000000 --- a/vendor/github.com/sirupsen/logrus/README.md +++ /dev/null @@ -1,511 +0,0 @@ -# Logrus :walrus: [![Build Status](https://travis-ci.org/sirupsen/logrus.svg?branch=master)](https://travis-ci.org/sirupsen/logrus) [![GoDoc](https://godoc.org/github.com/sirupsen/logrus?status.svg)](https://godoc.org/github.com/sirupsen/logrus) - -Logrus is a structured logger for Go (golang), completely API compatible with -the standard library logger. - -**Seeing weird case-sensitive problems?** It's in the past been possible to -import Logrus as both upper- and lower-case. Due to the Go package environment, -this caused issues in the community and we needed a standard. Some environments -experienced problems with the upper-case variant, so the lower-case was decided. -Everything using `logrus` will need to use the lower-case: -`github.com/sirupsen/logrus`. Any package that isn't, should be changed. - -To fix Glide, see [these -comments](https://github.com/sirupsen/logrus/issues/553#issuecomment-306591437). -For an in-depth explanation of the casing issue, see [this -comment](https://github.com/sirupsen/logrus/issues/570#issuecomment-313933276). - -**Are you interested in assisting in maintaining Logrus?** Currently I have a -lot of obligations, and I am unable to provide Logrus with the maintainership it -needs. If you'd like to help, please reach out to me at `simon at author's -username dot com`. - -Nicely color-coded in development (when a TTY is attached, otherwise just -plain text): - -![Colored](http://i.imgur.com/PY7qMwd.png) - -With `log.SetFormatter(&log.JSONFormatter{})`, for easy parsing by logstash -or Splunk: - -```json -{"animal":"walrus","level":"info","msg":"A group of walrus emerges from the -ocean","size":10,"time":"2014-03-10 19:57:38.562264131 -0400 EDT"} - -{"level":"warning","msg":"The group's number increased tremendously!", -"number":122,"omg":true,"time":"2014-03-10 19:57:38.562471297 -0400 EDT"} - -{"animal":"walrus","level":"info","msg":"A giant walrus appears!", -"size":10,"time":"2014-03-10 19:57:38.562500591 -0400 EDT"} - -{"animal":"walrus","level":"info","msg":"Tremendously sized cow enters the ocean.", -"size":9,"time":"2014-03-10 19:57:38.562527896 -0400 EDT"} - -{"level":"fatal","msg":"The ice breaks!","number":100,"omg":true, -"time":"2014-03-10 19:57:38.562543128 -0400 EDT"} -``` - -With the default `log.SetFormatter(&log.TextFormatter{})` when a TTY is not -attached, the output is compatible with the -[logfmt](http://godoc.org/github.com/kr/logfmt) format: - -```text -time="2015-03-26T01:27:38-04:00" level=debug msg="Started observing beach" animal=walrus number=8 -time="2015-03-26T01:27:38-04:00" level=info msg="A group of walrus emerges from the ocean" animal=walrus size=10 -time="2015-03-26T01:27:38-04:00" level=warning msg="The group's number increased tremendously!" number=122 omg=true -time="2015-03-26T01:27:38-04:00" level=debug msg="Temperature changes" temperature=-4 -time="2015-03-26T01:27:38-04:00" level=panic msg="It's over 9000!" animal=orca size=9009 -time="2015-03-26T01:27:38-04:00" level=fatal msg="The ice breaks!" err=&{0x2082280c0 map[animal:orca size:9009] 2015-03-26 01:27:38.441574009 -0400 EDT panic It's over 9000!} number=100 omg=true -exit status 1 -``` - -#### Case-sensitivity - -The organization's name was changed to lower-case--and this will not be changed -back. If you are getting import conflicts due to case sensitivity, please use -the lower-case import: `github.com/sirupsen/logrus`. - -#### Example - -The simplest way to use Logrus is simply the package-level exported logger: - -```go -package main - -import ( - log "github.com/sirupsen/logrus" -) - -func main() { - log.WithFields(log.Fields{ - "animal": "walrus", - }).Info("A walrus appears") -} -``` - -Note that it's completely api-compatible with the stdlib logger, so you can -replace your `log` imports everywhere with `log "github.com/sirupsen/logrus"` -and you'll now have the flexibility of Logrus. You can customize it all you -want: - -```go -package main - -import ( - "os" - log "github.com/sirupsen/logrus" -) - -func init() { - // Log as JSON instead of the default ASCII formatter. - log.SetFormatter(&log.JSONFormatter{}) - - // Output to stdout instead of the default stderr - // Can be any io.Writer, see below for File example - log.SetOutput(os.Stdout) - - // Only log the warning severity or above. - log.SetLevel(log.WarnLevel) -} - -func main() { - log.WithFields(log.Fields{ - "animal": "walrus", - "size": 10, - }).Info("A group of walrus emerges from the ocean") - - log.WithFields(log.Fields{ - "omg": true, - "number": 122, - }).Warn("The group's number increased tremendously!") - - log.WithFields(log.Fields{ - "omg": true, - "number": 100, - }).Fatal("The ice breaks!") - - // A common pattern is to re-use fields between logging statements by re-using - // the logrus.Entry returned from WithFields() - contextLogger := log.WithFields(log.Fields{ - "common": "this is a common field", - "other": "I also should be logged always", - }) - - contextLogger.Info("I'll be logged with common and other field") - contextLogger.Info("Me too") -} -``` - -For more advanced usage such as logging to multiple locations from the same -application, you can also create an instance of the `logrus` Logger: - -```go -package main - -import ( - "os" - "github.com/sirupsen/logrus" -) - -// Create a new instance of the logger. You can have any number of instances. -var log = logrus.New() - -func main() { - // The API for setting attributes is a little different than the package level - // exported logger. See Godoc. - log.Out = os.Stdout - - // You could set this to any `io.Writer` such as a file - // file, err := os.OpenFile("logrus.log", os.O_CREATE|os.O_WRONLY, 0666) - // if err == nil { - // log.Out = file - // } else { - // log.Info("Failed to log to file, using default stderr") - // } - - log.WithFields(logrus.Fields{ - "animal": "walrus", - "size": 10, - }).Info("A group of walrus emerges from the ocean") -} -``` - -#### Fields - -Logrus encourages careful, structured logging through logging fields instead of -long, unparseable error messages. For example, instead of: `log.Fatalf("Failed -to send event %s to topic %s with key %d")`, you should log the much more -discoverable: - -```go -log.WithFields(log.Fields{ - "event": event, - "topic": topic, - "key": key, -}).Fatal("Failed to send event") -``` - -We've found this API forces you to think about logging in a way that produces -much more useful logging messages. We've been in countless situations where just -a single added field to a log statement that was already there would've saved us -hours. The `WithFields` call is optional. - -In general, with Logrus using any of the `printf`-family functions should be -seen as a hint you should add a field, however, you can still use the -`printf`-family functions with Logrus. - -#### Default Fields - -Often it's helpful to have fields _always_ attached to log statements in an -application or parts of one. For example, you may want to always log the -`request_id` and `user_ip` in the context of a request. Instead of writing -`log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip})` on -every line, you can create a `logrus.Entry` to pass around instead: - -```go -requestLogger := log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip}) -requestLogger.Info("something happened on that request") # will log request_id and user_ip -requestLogger.Warn("something not great happened") -``` - -#### Hooks - -You can add hooks for logging levels. For example to send errors to an exception -tracking service on `Error`, `Fatal` and `Panic`, info to StatsD or log to -multiple places simultaneously, e.g. syslog. - -Logrus comes with [built-in hooks](hooks/). Add those, or your custom hook, in -`init`: - -```go -import ( - log "github.com/sirupsen/logrus" - "gopkg.in/gemnasium/logrus-airbrake-hook.v2" // the package is named "airbrake" - logrus_syslog "github.com/sirupsen/logrus/hooks/syslog" - "log/syslog" -) - -func init() { - - // Use the Airbrake hook to report errors that have Error severity or above to - // an exception tracker. You can create custom hooks, see the Hooks section. - log.AddHook(airbrake.NewHook(123, "xyz", "production")) - - hook, err := logrus_syslog.NewSyslogHook("udp", "localhost:514", syslog.LOG_INFO, "") - if err != nil { - log.Error("Unable to connect to local syslog daemon") - } else { - log.AddHook(hook) - } -} -``` -Note: Syslog hook also support connecting to local syslog (Ex. "/dev/log" or "/var/run/syslog" or "/var/run/log"). For the detail, please check the [syslog hook README](hooks/syslog/README.md). - -| Hook | Description | -| ----- | ----------- | -| [Airbrake "legacy"](https://github.com/gemnasium/logrus-airbrake-legacy-hook) | Send errors to an exception tracking service compatible with the Airbrake API V2. Uses [`airbrake-go`](https://github.com/tobi/airbrake-go) behind the scenes. | -| [Airbrake](https://github.com/gemnasium/logrus-airbrake-hook) | Send errors to the Airbrake API V3. Uses the official [`gobrake`](https://github.com/airbrake/gobrake) behind the scenes. | -| [Amazon Kinesis](https://github.com/evalphobia/logrus_kinesis) | Hook for logging to [Amazon Kinesis](https://aws.amazon.com/kinesis/) | -| [Amqp-Hook](https://github.com/vladoatanasov/logrus_amqp) | Hook for logging to Amqp broker (Like RabbitMQ) | -| [Application Insights](https://github.com/jjcollinge/logrus-appinsights) | Hook for logging to [Application Insights](https://azure.microsoft.com/en-us/services/application-insights/) -| [AzureTableHook](https://github.com/kpfaulkner/azuretablehook/) | Hook for logging to Azure Table Storage| -| [Bugsnag](https://github.com/Shopify/logrus-bugsnag/blob/master/bugsnag.go) | Send errors to the Bugsnag exception tracking service. | -| [DeferPanic](https://github.com/deferpanic/dp-logrus) | Hook for logging to DeferPanic | -| [Discordrus](https://github.com/kz/discordrus) | Hook for logging to [Discord](https://discordapp.com/) | -| [ElasticSearch](https://github.com/sohlich/elogrus) | Hook for logging to ElasticSearch| -| [Firehose](https://github.com/beaubrewer/logrus_firehose) | Hook for logging to [Amazon Firehose](https://aws.amazon.com/kinesis/firehose/) -| [Fluentd](https://github.com/evalphobia/logrus_fluent) | Hook for logging to fluentd | -| [Go-Slack](https://github.com/multiplay/go-slack) | Hook for logging to [Slack](https://slack.com) | -| [Graylog](https://github.com/gemnasium/logrus-graylog-hook) | Hook for logging to [Graylog](http://graylog2.org/) | -| [Hiprus](https://github.com/nubo/hiprus) | Send errors to a channel in hipchat. | -| [Honeybadger](https://github.com/agonzalezro/logrus_honeybadger) | Hook for sending exceptions to Honeybadger | -| [InfluxDB](https://github.com/Abramovic/logrus_influxdb) | Hook for logging to influxdb | -| [Influxus](http://github.com/vlad-doru/influxus) | Hook for concurrently logging to [InfluxDB](http://influxdata.com/) | -| [Journalhook](https://github.com/wercker/journalhook) | Hook for logging to `systemd-journald` | -| [KafkaLogrus](https://github.com/tracer0tong/kafkalogrus) | Hook for logging to Kafka | -| [Kafka REST Proxy](https://github.com/Nordstrom/logrus-kafka-rest-proxy) | Hook for logging to [Kafka REST Proxy](https://docs.confluent.io/current/kafka-rest/docs) | -| [LFShook](https://github.com/rifflock/lfshook) | Hook for logging to the local filesystem | -| [Logbeat](https://github.com/macandmia/logbeat) | Hook for logging to [Opbeat](https://opbeat.com/) | -| [Logentries](https://github.com/jcftang/logentriesrus) | Hook for logging to [Logentries](https://logentries.com/) | -| [Logentrus](https://github.com/puddingfactory/logentrus) | Hook for logging to [Logentries](https://logentries.com/) | -| [Logmatic.io](https://github.com/logmatic/logmatic-go) | Hook for logging to [Logmatic.io](http://logmatic.io/) | -| [Logrusly](https://github.com/sebest/logrusly) | Send logs to [Loggly](https://www.loggly.com/) | -| [Logstash](https://github.com/bshuster-repo/logrus-logstash-hook) | Hook for logging to [Logstash](https://www.elastic.co/products/logstash) | -| [Mail](https://github.com/zbindenren/logrus_mail) | Hook for sending exceptions via mail | -| [Mattermost](https://github.com/shuLhan/mattermost-integration/tree/master/hooks/logrus) | Hook for logging to [Mattermost](https://mattermost.com/) | -| [Mongodb](https://github.com/weekface/mgorus) | Hook for logging to mongodb | -| [NATS-Hook](https://github.com/rybit/nats_logrus_hook) | Hook for logging to [NATS](https://nats.io) | -| [Octokit](https://github.com/dorajistyle/logrus-octokit-hook) | Hook for logging to github via octokit | -| [Papertrail](https://github.com/polds/logrus-papertrail-hook) | Send errors to the [Papertrail](https://papertrailapp.com) hosted logging service via UDP. | -| [PostgreSQL](https://github.com/gemnasium/logrus-postgresql-hook) | Send logs to [PostgreSQL](http://postgresql.org) | -| [Promrus](https://github.com/weaveworks/promrus) | Expose number of log messages as [Prometheus](https://prometheus.io/) metrics | -| [Pushover](https://github.com/toorop/logrus_pushover) | Send error via [Pushover](https://pushover.net) | -| [Raygun](https://github.com/squirkle/logrus-raygun-hook) | Hook for logging to [Raygun.io](http://raygun.io/) | -| [Redis-Hook](https://github.com/rogierlommers/logrus-redis-hook) | Hook for logging to a ELK stack (through Redis) | -| [Rollrus](https://github.com/heroku/rollrus) | Hook for sending errors to rollbar | -| [Scribe](https://github.com/sagar8192/logrus-scribe-hook) | Hook for logging to [Scribe](https://github.com/facebookarchive/scribe)| -| [Sentry](https://github.com/evalphobia/logrus_sentry) | Send errors to the Sentry error logging and aggregation service. | -| [Slackrus](https://github.com/johntdyer/slackrus) | Hook for Slack chat. | -| [Stackdriver](https://github.com/knq/sdhook) | Hook for logging to [Google Stackdriver](https://cloud.google.com/logging/) | -| [Sumorus](https://github.com/doublefree/sumorus) | Hook for logging to [SumoLogic](https://www.sumologic.com/)| -| [Syslog](https://github.com/sirupsen/logrus/blob/master/hooks/syslog/syslog.go) | Send errors to remote syslog server. Uses standard library `log/syslog` behind the scenes. | -| [Syslog TLS](https://github.com/shinji62/logrus-syslog-ng) | Send errors to remote syslog server with TLS support. | -| [Telegram](https://github.com/rossmcdonald/telegram_hook) | Hook for logging errors to [Telegram](https://telegram.org/) | -| [TraceView](https://github.com/evalphobia/logrus_appneta) | Hook for logging to [AppNeta TraceView](https://www.appneta.com/products/traceview/) | -| [Typetalk](https://github.com/dragon3/logrus-typetalk-hook) | Hook for logging to [Typetalk](https://www.typetalk.in/) | -| [logz.io](https://github.com/ripcurld00d/logrus-logzio-hook) | Hook for logging to [logz.io](https://logz.io), a Log as a Service using Logstash | -| [SQS-Hook](https://github.com/tsarpaul/logrus_sqs) | Hook for logging to [Amazon Simple Queue Service (SQS)](https://aws.amazon.com/sqs/) | - -#### Level logging - -Logrus has six logging levels: Debug, Info, Warning, Error, Fatal and Panic. - -```go -log.Debug("Useful debugging information.") -log.Info("Something noteworthy happened!") -log.Warn("You should probably take a look at this.") -log.Error("Something failed but I'm not quitting.") -// Calls os.Exit(1) after logging -log.Fatal("Bye.") -// Calls panic() after logging -log.Panic("I'm bailing.") -``` - -You can set the logging level on a `Logger`, then it will only log entries with -that severity or anything above it: - -```go -// Will log anything that is info or above (warn, error, fatal, panic). Default. -log.SetLevel(log.InfoLevel) -``` - -It may be useful to set `log.Level = logrus.DebugLevel` in a debug or verbose -environment if your application has that. - -#### Entries - -Besides the fields added with `WithField` or `WithFields` some fields are -automatically added to all logging events: - -1. `time`. The timestamp when the entry was created. -2. `msg`. The logging message passed to `{Info,Warn,Error,Fatal,Panic}` after - the `AddFields` call. E.g. `Failed to send event.` -3. `level`. The logging level. E.g. `info`. - -#### Environments - -Logrus has no notion of environment. - -If you wish for hooks and formatters to only be used in specific environments, -you should handle that yourself. For example, if your application has a global -variable `Environment`, which is a string representation of the environment you -could do: - -```go -import ( - log "github.com/sirupsen/logrus" -) - -init() { - // do something here to set environment depending on an environment variable - // or command-line flag - if Environment == "production" { - log.SetFormatter(&log.JSONFormatter{}) - } else { - // The TextFormatter is default, you don't actually have to do this. - log.SetFormatter(&log.TextFormatter{}) - } -} -``` - -This configuration is how `logrus` was intended to be used, but JSON in -production is mostly only useful if you do log aggregation with tools like -Splunk or Logstash. - -#### Formatters - -The built-in logging formatters are: - -* `logrus.TextFormatter`. Logs the event in colors if stdout is a tty, otherwise - without colors. - * *Note:* to force colored output when there is no TTY, set the `ForceColors` - field to `true`. To force no colored output even if there is a TTY set the - `DisableColors` field to `true`. For Windows, see - [github.com/mattn/go-colorable](https://github.com/mattn/go-colorable). - * All options are listed in the [generated docs](https://godoc.org/github.com/sirupsen/logrus#TextFormatter). -* `logrus.JSONFormatter`. Logs fields as JSON. - * All options are listed in the [generated docs](https://godoc.org/github.com/sirupsen/logrus#JSONFormatter). - -Third party logging formatters: - -* [`FluentdFormatter`](https://github.com/joonix/log). Formats entries that can be parsed by Kubernetes and Google Container Engine. -* [`logstash`](https://github.com/bshuster-repo/logrus-logstash-hook). Logs fields as [Logstash](http://logstash.net) Events. -* [`prefixed`](https://github.com/x-cray/logrus-prefixed-formatter). Displays log entry source along with alternative layout. -* [`zalgo`](https://github.com/aybabtme/logzalgo). Invoking the P͉̫o̳̼̊w̖͈̰͎e̬͔̭͂r͚̼̹̲ ̫͓͉̳͈ō̠͕͖̚f̝͍̠ ͕̲̞͖͑Z̖̫̤̫ͪa͉̬͈̗l͖͎g̳̥o̰̥̅!̣͔̲̻͊̄ ̙̘̦̹̦. - -You can define your formatter by implementing the `Formatter` interface, -requiring a `Format` method. `Format` takes an `*Entry`. `entry.Data` is a -`Fields` type (`map[string]interface{}`) with all your fields as well as the -default ones (see Entries section above): - -```go -type MyJSONFormatter struct { -} - -log.SetFormatter(new(MyJSONFormatter)) - -func (f *MyJSONFormatter) Format(entry *Entry) ([]byte, error) { - // Note this doesn't include Time, Level and Message which are available on - // the Entry. Consult `godoc` on information about those fields or read the - // source of the official loggers. - serialized, err := json.Marshal(entry.Data) - if err != nil { - return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err) - } - return append(serialized, '\n'), nil -} -``` - -#### Logger as an `io.Writer` - -Logrus can be transformed into an `io.Writer`. That writer is the end of an `io.Pipe` and it is your responsibility to close it. - -```go -w := logger.Writer() -defer w.Close() - -srv := http.Server{ - // create a stdlib log.Logger that writes to - // logrus.Logger. - ErrorLog: log.New(w, "", 0), -} -``` - -Each line written to that writer will be printed the usual way, using formatters -and hooks. The level for those entries is `info`. - -This means that we can override the standard library logger easily: - -```go -logger := logrus.New() -logger.Formatter = &logrus.JSONFormatter{} - -// Use logrus for standard log output -// Note that `log` here references stdlib's log -// Not logrus imported under the name `log`. -log.SetOutput(logger.Writer()) -``` - -#### Rotation - -Log rotation is not provided with Logrus. Log rotation should be done by an -external program (like `logrotate(8)`) that can compress and delete old log -entries. It should not be a feature of the application-level logger. - -#### Tools - -| Tool | Description | -| ---- | ----------- | -|[Logrus Mate](https://github.com/gogap/logrus_mate)|Logrus mate is a tool for Logrus to manage loggers, you can initial logger's level, hook and formatter by config file, the logger will generated with different config at different environment.| -|[Logrus Viper Helper](https://github.com/heirko/go-contrib/tree/master/logrusHelper)|An Helper around Logrus to wrap with spf13/Viper to load configuration with fangs! And to simplify Logrus configuration use some behavior of [Logrus Mate](https://github.com/gogap/logrus_mate). [sample](https://github.com/heirko/iris-contrib/blob/master/middleware/logrus-logger/example) | - -#### Testing - -Logrus has a built in facility for asserting the presence of log messages. This is implemented through the `test` hook and provides: - -* decorators for existing logger (`test.NewLocal` and `test.NewGlobal`) which basically just add the `test` hook -* a test logger (`test.NewNullLogger`) that just records log messages (and does not output any): - -```go -import( - "github.com/sirupsen/logrus" - "github.com/sirupsen/logrus/hooks/test" - "github.com/stretchr/testify/assert" - "testing" -) - -func TestSomething(t*testing.T){ - logger, hook := test.NewNullLogger() - logger.Error("Helloerror") - - assert.Equal(t, 1, len(hook.Entries)) - assert.Equal(t, logrus.ErrorLevel, hook.LastEntry().Level) - assert.Equal(t, "Helloerror", hook.LastEntry().Message) - - hook.Reset() - assert.Nil(t, hook.LastEntry()) -} -``` - -#### Fatal handlers - -Logrus can register one or more functions that will be called when any `fatal` -level message is logged. The registered handlers will be executed before -logrus performs a `os.Exit(1)`. This behavior may be helpful if callers need -to gracefully shutdown. Unlike a `panic("Something went wrong...")` call which can be intercepted with a deferred `recover` a call to `os.Exit(1)` can not be intercepted. - -``` -... -handler := func() { - // gracefully shutdown something... -} -logrus.RegisterExitHandler(handler) -... -``` - -#### Thread safety - -By default Logger is protected by mutex for concurrent writes, this mutex is invoked when calling hooks and writing logs. -If you are sure such locking is not needed, you can call logger.SetNoLock() to disable the locking. - -Situation when locking is not needed includes: - -* You have no hooks registered, or hooks calling is already thread-safe. - -* Writing to logger.Out is already thread-safe, for example: - - 1) logger.Out is protected by locks. - - 2) logger.Out is a os.File handler opened with `O_APPEND` flag, and every write is smaller than 4k. (This allow multi-thread/multi-process writing) - - (Refer to http://www.notthewizard.com/2014/06/17/are-files-appends-really-atomic/) diff --git a/vendor/github.com/sirupsen/logrus/alt_exit.go b/vendor/github.com/sirupsen/logrus/alt_exit.go deleted file mode 100644 index 8af90637a..000000000 --- a/vendor/github.com/sirupsen/logrus/alt_exit.go +++ /dev/null @@ -1,64 +0,0 @@ -package logrus - -// The following code was sourced and modified from the -// https://github.com/tebeka/atexit package governed by the following license: -// -// Copyright (c) 2012 Miki Tebeka . -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -import ( - "fmt" - "os" -) - -var handlers = []func(){} - -func runHandler(handler func()) { - defer func() { - if err := recover(); err != nil { - fmt.Fprintln(os.Stderr, "Error: Logrus exit handler error:", err) - } - }() - - handler() -} - -func runHandlers() { - for _, handler := range handlers { - runHandler(handler) - } -} - -// Exit runs all the Logrus atexit handlers and then terminates the program using os.Exit(code) -func Exit(code int) { - runHandlers() - os.Exit(code) -} - -// RegisterExitHandler adds a Logrus Exit handler, call logrus.Exit to invoke -// all handlers. The handlers will also be invoked when any Fatal log entry is -// made. -// -// This method is useful when a caller wishes to use logrus to log a fatal -// message but also needs to gracefully shutdown. An example usecase could be -// closing database connections, or sending a alert that the application is -// closing. -func RegisterExitHandler(handler func()) { - handlers = append(handlers, handler) -} diff --git a/vendor/github.com/sirupsen/logrus/appveyor.yml b/vendor/github.com/sirupsen/logrus/appveyor.yml deleted file mode 100644 index 96c2ce15f..000000000 --- a/vendor/github.com/sirupsen/logrus/appveyor.yml +++ /dev/null @@ -1,14 +0,0 @@ -version: "{build}" -platform: x64 -clone_folder: c:\gopath\src\github.com\sirupsen\logrus -environment: - GOPATH: c:\gopath -branches: - only: - - master -install: - - set PATH=%GOPATH%\bin;c:\go\bin;%PATH% - - go version -build_script: - - go get -t - - go test diff --git a/vendor/github.com/sirupsen/logrus/doc.go b/vendor/github.com/sirupsen/logrus/doc.go deleted file mode 100644 index da67aba06..000000000 --- a/vendor/github.com/sirupsen/logrus/doc.go +++ /dev/null @@ -1,26 +0,0 @@ -/* -Package logrus is a structured logger for Go, completely API compatible with the standard library logger. - - -The simplest way to use Logrus is simply the package-level exported logger: - - package main - - import ( - log "github.com/sirupsen/logrus" - ) - - func main() { - log.WithFields(log.Fields{ - "animal": "walrus", - "number": 1, - "size": 10, - }).Info("A walrus appears") - } - -Output: - time="2015-09-07T08:48:33Z" level=info msg="A walrus appears" animal=walrus number=1 size=10 - -For a full guide visit https://github.com/sirupsen/logrus -*/ -package logrus diff --git a/vendor/github.com/sirupsen/logrus/entry.go b/vendor/github.com/sirupsen/logrus/entry.go deleted file mode 100644 index 778f4c9f0..000000000 --- a/vendor/github.com/sirupsen/logrus/entry.go +++ /dev/null @@ -1,288 +0,0 @@ -package logrus - -import ( - "bytes" - "fmt" - "os" - "sync" - "time" -) - -var bufferPool *sync.Pool - -func init() { - bufferPool = &sync.Pool{ - New: func() interface{} { - return new(bytes.Buffer) - }, - } -} - -// Defines the key when adding errors using WithError. -var ErrorKey = "error" - -// An entry is the final or intermediate Logrus logging entry. It contains all -// the fields passed with WithField{,s}. It's finally logged when Debug, Info, -// Warn, Error, Fatal or Panic is called on it. These objects can be reused and -// passed around as much as you wish to avoid field duplication. -type Entry struct { - Logger *Logger - - // Contains all the fields set by the user. - Data Fields - - // Time at which the log entry was created - Time time.Time - - // Level the log entry was logged at: Debug, Info, Warn, Error, Fatal or Panic - // This field will be set on entry firing and the value will be equal to the one in Logger struct field. - Level Level - - // Message passed to Debug, Info, Warn, Error, Fatal or Panic - Message string - - // When formatter is called in entry.log(), an Buffer may be set to entry - Buffer *bytes.Buffer -} - -func NewEntry(logger *Logger) *Entry { - return &Entry{ - Logger: logger, - // Default is three fields, give a little extra room - Data: make(Fields, 5), - } -} - -// Returns the string representation from the reader and ultimately the -// formatter. -func (entry *Entry) String() (string, error) { - serialized, err := entry.Logger.Formatter.Format(entry) - if err != nil { - return "", err - } - str := string(serialized) - return str, nil -} - -// Add an error as single field (using the key defined in ErrorKey) to the Entry. -func (entry *Entry) WithError(err error) *Entry { - return entry.WithField(ErrorKey, err) -} - -// Add a single field to the Entry. -func (entry *Entry) WithField(key string, value interface{}) *Entry { - return entry.WithFields(Fields{key: value}) -} - -// Add a map of fields to the Entry. -func (entry *Entry) WithFields(fields Fields) *Entry { - data := make(Fields, len(entry.Data)+len(fields)) - for k, v := range entry.Data { - data[k] = v - } - for k, v := range fields { - data[k] = v - } - return &Entry{Logger: entry.Logger, Data: data} -} - -// This function is not declared with a pointer value because otherwise -// race conditions will occur when using multiple goroutines -func (entry Entry) log(level Level, msg string) { - var buffer *bytes.Buffer - entry.Time = time.Now() - entry.Level = level - entry.Message = msg - - entry.fireHooks() - - buffer = bufferPool.Get().(*bytes.Buffer) - buffer.Reset() - defer bufferPool.Put(buffer) - entry.Buffer = buffer - - entry.write() - - entry.Buffer = nil - - // To avoid Entry#log() returning a value that only would make sense for - // panic() to use in Entry#Panic(), we avoid the allocation by checking - // directly here. - if level <= PanicLevel { - panic(&entry) - } -} - -// This function is not declared with a pointer value because otherwise -// race conditions will occur when using multiple goroutines -func (entry Entry) fireHooks() { - entry.Logger.mu.Lock() - defer entry.Logger.mu.Unlock() - err := entry.Logger.Hooks.Fire(entry.Level, &entry) - if err != nil { - fmt.Fprintf(os.Stderr, "Failed to fire hook: %v\n", err) - } -} - -func (entry *Entry) write() { - serialized, err := entry.Logger.Formatter.Format(entry) - entry.Logger.mu.Lock() - defer entry.Logger.mu.Unlock() - if err != nil { - fmt.Fprintf(os.Stderr, "Failed to obtain reader, %v\n", err) - } else { - _, err = entry.Logger.Out.Write(serialized) - if err != nil { - fmt.Fprintf(os.Stderr, "Failed to write to log, %v\n", err) - } - } -} - -func (entry *Entry) Debug(args ...interface{}) { - if entry.Logger.level() >= DebugLevel { - entry.log(DebugLevel, fmt.Sprint(args...)) - } -} - -func (entry *Entry) Print(args ...interface{}) { - entry.Info(args...) -} - -func (entry *Entry) Info(args ...interface{}) { - if entry.Logger.level() >= InfoLevel { - entry.log(InfoLevel, fmt.Sprint(args...)) - } -} - -func (entry *Entry) Warn(args ...interface{}) { - if entry.Logger.level() >= WarnLevel { - entry.log(WarnLevel, fmt.Sprint(args...)) - } -} - -func (entry *Entry) Warning(args ...interface{}) { - entry.Warn(args...) -} - -func (entry *Entry) Error(args ...interface{}) { - if entry.Logger.level() >= ErrorLevel { - entry.log(ErrorLevel, fmt.Sprint(args...)) - } -} - -func (entry *Entry) Fatal(args ...interface{}) { - if entry.Logger.level() >= FatalLevel { - entry.log(FatalLevel, fmt.Sprint(args...)) - } - Exit(1) -} - -func (entry *Entry) Panic(args ...interface{}) { - if entry.Logger.level() >= PanicLevel { - entry.log(PanicLevel, fmt.Sprint(args...)) - } - panic(fmt.Sprint(args...)) -} - -// Entry Printf family functions - -func (entry *Entry) Debugf(format string, args ...interface{}) { - if entry.Logger.level() >= DebugLevel { - entry.Debug(fmt.Sprintf(format, args...)) - } -} - -func (entry *Entry) Infof(format string, args ...interface{}) { - if entry.Logger.level() >= InfoLevel { - entry.Info(fmt.Sprintf(format, args...)) - } -} - -func (entry *Entry) Printf(format string, args ...interface{}) { - entry.Infof(format, args...) -} - -func (entry *Entry) Warnf(format string, args ...interface{}) { - if entry.Logger.level() >= WarnLevel { - entry.Warn(fmt.Sprintf(format, args...)) - } -} - -func (entry *Entry) Warningf(format string, args ...interface{}) { - entry.Warnf(format, args...) -} - -func (entry *Entry) Errorf(format string, args ...interface{}) { - if entry.Logger.level() >= ErrorLevel { - entry.Error(fmt.Sprintf(format, args...)) - } -} - -func (entry *Entry) Fatalf(format string, args ...interface{}) { - if entry.Logger.level() >= FatalLevel { - entry.Fatal(fmt.Sprintf(format, args...)) - } - Exit(1) -} - -func (entry *Entry) Panicf(format string, args ...interface{}) { - if entry.Logger.level() >= PanicLevel { - entry.Panic(fmt.Sprintf(format, args...)) - } -} - -// Entry Println family functions - -func (entry *Entry) Debugln(args ...interface{}) { - if entry.Logger.level() >= DebugLevel { - entry.Debug(entry.sprintlnn(args...)) - } -} - -func (entry *Entry) Infoln(args ...interface{}) { - if entry.Logger.level() >= InfoLevel { - entry.Info(entry.sprintlnn(args...)) - } -} - -func (entry *Entry) Println(args ...interface{}) { - entry.Infoln(args...) -} - -func (entry *Entry) Warnln(args ...interface{}) { - if entry.Logger.level() >= WarnLevel { - entry.Warn(entry.sprintlnn(args...)) - } -} - -func (entry *Entry) Warningln(args ...interface{}) { - entry.Warnln(args...) -} - -func (entry *Entry) Errorln(args ...interface{}) { - if entry.Logger.level() >= ErrorLevel { - entry.Error(entry.sprintlnn(args...)) - } -} - -func (entry *Entry) Fatalln(args ...interface{}) { - if entry.Logger.level() >= FatalLevel { - entry.Fatal(entry.sprintlnn(args...)) - } - Exit(1) -} - -func (entry *Entry) Panicln(args ...interface{}) { - if entry.Logger.level() >= PanicLevel { - entry.Panic(entry.sprintlnn(args...)) - } -} - -// Sprintlnn => Sprint no newline. This is to get the behavior of how -// fmt.Sprintln where spaces are always added between operands, regardless of -// their type. Instead of vendoring the Sprintln implementation to spare a -// string allocation, we do the simplest thing. -func (entry *Entry) sprintlnn(args ...interface{}) string { - msg := fmt.Sprintln(args...) - return msg[:len(msg)-1] -} diff --git a/vendor/github.com/sirupsen/logrus/exported.go b/vendor/github.com/sirupsen/logrus/exported.go deleted file mode 100644 index 013183eda..000000000 --- a/vendor/github.com/sirupsen/logrus/exported.go +++ /dev/null @@ -1,193 +0,0 @@ -package logrus - -import ( - "io" -) - -var ( - // std is the name of the standard logger in stdlib `log` - std = New() -) - -func StandardLogger() *Logger { - return std -} - -// SetOutput sets the standard logger output. -func SetOutput(out io.Writer) { - std.mu.Lock() - defer std.mu.Unlock() - std.Out = out -} - -// SetFormatter sets the standard logger formatter. -func SetFormatter(formatter Formatter) { - std.mu.Lock() - defer std.mu.Unlock() - std.Formatter = formatter -} - -// SetLevel sets the standard logger level. -func SetLevel(level Level) { - std.mu.Lock() - defer std.mu.Unlock() - std.SetLevel(level) -} - -// GetLevel returns the standard logger level. -func GetLevel() Level { - std.mu.Lock() - defer std.mu.Unlock() - return std.level() -} - -// AddHook adds a hook to the standard logger hooks. -func AddHook(hook Hook) { - std.mu.Lock() - defer std.mu.Unlock() - std.Hooks.Add(hook) -} - -// WithError creates an entry from the standard logger and adds an error to it, using the value defined in ErrorKey as key. -func WithError(err error) *Entry { - return std.WithField(ErrorKey, err) -} - -// WithField creates an entry from the standard logger and adds a field to -// it. If you want multiple fields, use `WithFields`. -// -// Note that it doesn't log until you call Debug, Print, Info, Warn, Fatal -// or Panic on the Entry it returns. -func WithField(key string, value interface{}) *Entry { - return std.WithField(key, value) -} - -// WithFields creates an entry from the standard logger and adds multiple -// fields to it. This is simply a helper for `WithField`, invoking it -// once for each field. -// -// Note that it doesn't log until you call Debug, Print, Info, Warn, Fatal -// or Panic on the Entry it returns. -func WithFields(fields Fields) *Entry { - return std.WithFields(fields) -} - -// Debug logs a message at level Debug on the standard logger. -func Debug(args ...interface{}) { - std.Debug(args...) -} - -// Print logs a message at level Info on the standard logger. -func Print(args ...interface{}) { - std.Print(args...) -} - -// Info logs a message at level Info on the standard logger. -func Info(args ...interface{}) { - std.Info(args...) -} - -// Warn logs a message at level Warn on the standard logger. -func Warn(args ...interface{}) { - std.Warn(args...) -} - -// Warning logs a message at level Warn on the standard logger. -func Warning(args ...interface{}) { - std.Warning(args...) -} - -// Error logs a message at level Error on the standard logger. -func Error(args ...interface{}) { - std.Error(args...) -} - -// Panic logs a message at level Panic on the standard logger. -func Panic(args ...interface{}) { - std.Panic(args...) -} - -// Fatal logs a message at level Fatal on the standard logger. -func Fatal(args ...interface{}) { - std.Fatal(args...) -} - -// Debugf logs a message at level Debug on the standard logger. -func Debugf(format string, args ...interface{}) { - std.Debugf(format, args...) -} - -// Printf logs a message at level Info on the standard logger. -func Printf(format string, args ...interface{}) { - std.Printf(format, args...) -} - -// Infof logs a message at level Info on the standard logger. -func Infof(format string, args ...interface{}) { - std.Infof(format, args...) -} - -// Warnf logs a message at level Warn on the standard logger. -func Warnf(format string, args ...interface{}) { - std.Warnf(format, args...) -} - -// Warningf logs a message at level Warn on the standard logger. -func Warningf(format string, args ...interface{}) { - std.Warningf(format, args...) -} - -// Errorf logs a message at level Error on the standard logger. -func Errorf(format string, args ...interface{}) { - std.Errorf(format, args...) -} - -// Panicf logs a message at level Panic on the standard logger. -func Panicf(format string, args ...interface{}) { - std.Panicf(format, args...) -} - -// Fatalf logs a message at level Fatal on the standard logger. -func Fatalf(format string, args ...interface{}) { - std.Fatalf(format, args...) -} - -// Debugln logs a message at level Debug on the standard logger. -func Debugln(args ...interface{}) { - std.Debugln(args...) -} - -// Println logs a message at level Info on the standard logger. -func Println(args ...interface{}) { - std.Println(args...) -} - -// Infoln logs a message at level Info on the standard logger. -func Infoln(args ...interface{}) { - std.Infoln(args...) -} - -// Warnln logs a message at level Warn on the standard logger. -func Warnln(args ...interface{}) { - std.Warnln(args...) -} - -// Warningln logs a message at level Warn on the standard logger. -func Warningln(args ...interface{}) { - std.Warningln(args...) -} - -// Errorln logs a message at level Error on the standard logger. -func Errorln(args ...interface{}) { - std.Errorln(args...) -} - -// Panicln logs a message at level Panic on the standard logger. -func Panicln(args ...interface{}) { - std.Panicln(args...) -} - -// Fatalln logs a message at level Fatal on the standard logger. -func Fatalln(args ...interface{}) { - std.Fatalln(args...) -} diff --git a/vendor/github.com/sirupsen/logrus/formatter.go b/vendor/github.com/sirupsen/logrus/formatter.go deleted file mode 100644 index b183ff5b1..000000000 --- a/vendor/github.com/sirupsen/logrus/formatter.go +++ /dev/null @@ -1,45 +0,0 @@ -package logrus - -import "time" - -const defaultTimestampFormat = time.RFC3339 - -// The Formatter interface is used to implement a custom Formatter. It takes an -// `Entry`. It exposes all the fields, including the default ones: -// -// * `entry.Data["msg"]`. The message passed from Info, Warn, Error .. -// * `entry.Data["time"]`. The timestamp. -// * `entry.Data["level"]. The level the entry was logged at. -// -// Any additional fields added with `WithField` or `WithFields` are also in -// `entry.Data`. Format is expected to return an array of bytes which are then -// logged to `logger.Out`. -type Formatter interface { - Format(*Entry) ([]byte, error) -} - -// This is to not silently overwrite `time`, `msg` and `level` fields when -// dumping it. If this code wasn't there doing: -// -// logrus.WithField("level", 1).Info("hello") -// -// Would just silently drop the user provided level. Instead with this code -// it'll logged as: -// -// {"level": "info", "fields.level": 1, "msg": "hello", "time": "..."} -// -// It's not exported because it's still using Data in an opinionated way. It's to -// avoid code duplication between the two default formatters. -func prefixFieldClashes(data Fields) { - if t, ok := data["time"]; ok { - data["fields.time"] = t - } - - if m, ok := data["msg"]; ok { - data["fields.msg"] = m - } - - if l, ok := data["level"]; ok { - data["fields.level"] = l - } -} diff --git a/vendor/github.com/sirupsen/logrus/hooks.go b/vendor/github.com/sirupsen/logrus/hooks.go deleted file mode 100644 index 3f151cdc3..000000000 --- a/vendor/github.com/sirupsen/logrus/hooks.go +++ /dev/null @@ -1,34 +0,0 @@ -package logrus - -// A hook to be fired when logging on the logging levels returned from -// `Levels()` on your implementation of the interface. Note that this is not -// fired in a goroutine or a channel with workers, you should handle such -// functionality yourself if your call is non-blocking and you don't wish for -// the logging calls for levels returned from `Levels()` to block. -type Hook interface { - Levels() []Level - Fire(*Entry) error -} - -// Internal type for storing the hooks on a logger instance. -type LevelHooks map[Level][]Hook - -// Add a hook to an instance of logger. This is called with -// `log.Hooks.Add(new(MyHook))` where `MyHook` implements the `Hook` interface. -func (hooks LevelHooks) Add(hook Hook) { - for _, level := range hook.Levels() { - hooks[level] = append(hooks[level], hook) - } -} - -// Fire all the hooks for the passed level. Used by `entry.log` to fire -// appropriate hooks for a log entry. -func (hooks LevelHooks) Fire(level Level, entry *Entry) error { - for _, hook := range hooks[level] { - if err := hook.Fire(entry); err != nil { - return err - } - } - - return nil -} diff --git a/vendor/github.com/sirupsen/logrus/json_formatter.go b/vendor/github.com/sirupsen/logrus/json_formatter.go deleted file mode 100644 index fb01c1b10..000000000 --- a/vendor/github.com/sirupsen/logrus/json_formatter.go +++ /dev/null @@ -1,79 +0,0 @@ -package logrus - -import ( - "encoding/json" - "fmt" -) - -type fieldKey string - -// FieldMap allows customization of the key names for default fields. -type FieldMap map[fieldKey]string - -// Default key names for the default fields -const ( - FieldKeyMsg = "msg" - FieldKeyLevel = "level" - FieldKeyTime = "time" -) - -func (f FieldMap) resolve(key fieldKey) string { - if k, ok := f[key]; ok { - return k - } - - return string(key) -} - -// JSONFormatter formats logs into parsable json -type JSONFormatter struct { - // TimestampFormat sets the format used for marshaling timestamps. - TimestampFormat string - - // DisableTimestamp allows disabling automatic timestamps in output - DisableTimestamp bool - - // FieldMap allows users to customize the names of keys for default fields. - // As an example: - // formatter := &JSONFormatter{ - // FieldMap: FieldMap{ - // FieldKeyTime: "@timestamp", - // FieldKeyLevel: "@level", - // FieldKeyMsg: "@message", - // }, - // } - FieldMap FieldMap -} - -// Format renders a single log entry -func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) { - data := make(Fields, len(entry.Data)+3) - for k, v := range entry.Data { - switch v := v.(type) { - case error: - // Otherwise errors are ignored by `encoding/json` - // https://github.com/sirupsen/logrus/issues/137 - data[k] = v.Error() - default: - data[k] = v - } - } - prefixFieldClashes(data) - - timestampFormat := f.TimestampFormat - if timestampFormat == "" { - timestampFormat = defaultTimestampFormat - } - - if !f.DisableTimestamp { - data[f.FieldMap.resolve(FieldKeyTime)] = entry.Time.Format(timestampFormat) - } - data[f.FieldMap.resolve(FieldKeyMsg)] = entry.Message - data[f.FieldMap.resolve(FieldKeyLevel)] = entry.Level.String() - - serialized, err := json.Marshal(data) - if err != nil { - return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err) - } - return append(serialized, '\n'), nil -} diff --git a/vendor/github.com/sirupsen/logrus/logger.go b/vendor/github.com/sirupsen/logrus/logger.go deleted file mode 100644 index fdaf8a653..000000000 --- a/vendor/github.com/sirupsen/logrus/logger.go +++ /dev/null @@ -1,323 +0,0 @@ -package logrus - -import ( - "io" - "os" - "sync" - "sync/atomic" -) - -type Logger struct { - // The logs are `io.Copy`'d to this in a mutex. It's common to set this to a - // file, or leave it default which is `os.Stderr`. You can also set this to - // something more adventorous, such as logging to Kafka. - Out io.Writer - // Hooks for the logger instance. These allow firing events based on logging - // levels and log entries. For example, to send errors to an error tracking - // service, log to StatsD or dump the core on fatal errors. - Hooks LevelHooks - // All log entries pass through the formatter before logged to Out. The - // included formatters are `TextFormatter` and `JSONFormatter` for which - // TextFormatter is the default. In development (when a TTY is attached) it - // logs with colors, but to a file it wouldn't. You can easily implement your - // own that implements the `Formatter` interface, see the `README` or included - // formatters for examples. - Formatter Formatter - // The logging level the logger should log at. This is typically (and defaults - // to) `logrus.Info`, which allows Info(), Warn(), Error() and Fatal() to be - // logged. - Level Level - // Used to sync writing to the log. Locking is enabled by Default - mu MutexWrap - // Reusable empty entry - entryPool sync.Pool -} - -type MutexWrap struct { - lock sync.Mutex - disabled bool -} - -func (mw *MutexWrap) Lock() { - if !mw.disabled { - mw.lock.Lock() - } -} - -func (mw *MutexWrap) Unlock() { - if !mw.disabled { - mw.lock.Unlock() - } -} - -func (mw *MutexWrap) Disable() { - mw.disabled = true -} - -// Creates a new logger. Configuration should be set by changing `Formatter`, -// `Out` and `Hooks` directly on the default logger instance. You can also just -// instantiate your own: -// -// var log = &Logger{ -// Out: os.Stderr, -// Formatter: new(JSONFormatter), -// Hooks: make(LevelHooks), -// Level: logrus.DebugLevel, -// } -// -// It's recommended to make this a global instance called `log`. -func New() *Logger { - return &Logger{ - Out: os.Stderr, - Formatter: new(TextFormatter), - Hooks: make(LevelHooks), - Level: InfoLevel, - } -} - -func (logger *Logger) newEntry() *Entry { - entry, ok := logger.entryPool.Get().(*Entry) - if ok { - return entry - } - return NewEntry(logger) -} - -func (logger *Logger) releaseEntry(entry *Entry) { - logger.entryPool.Put(entry) -} - -// Adds a field to the log entry, note that it doesn't log until you call -// Debug, Print, Info, Warn, Fatal or Panic. It only creates a log entry. -// If you want multiple fields, use `WithFields`. -func (logger *Logger) WithField(key string, value interface{}) *Entry { - entry := logger.newEntry() - defer logger.releaseEntry(entry) - return entry.WithField(key, value) -} - -// Adds a struct of fields to the log entry. All it does is call `WithField` for -// each `Field`. -func (logger *Logger) WithFields(fields Fields) *Entry { - entry := logger.newEntry() - defer logger.releaseEntry(entry) - return entry.WithFields(fields) -} - -// Add an error as single field to the log entry. All it does is call -// `WithError` for the given `error`. -func (logger *Logger) WithError(err error) *Entry { - entry := logger.newEntry() - defer logger.releaseEntry(entry) - return entry.WithError(err) -} - -func (logger *Logger) Debugf(format string, args ...interface{}) { - if logger.level() >= DebugLevel { - entry := logger.newEntry() - entry.Debugf(format, args...) - logger.releaseEntry(entry) - } -} - -func (logger *Logger) Infof(format string, args ...interface{}) { - if logger.level() >= InfoLevel { - entry := logger.newEntry() - entry.Infof(format, args...) - logger.releaseEntry(entry) - } -} - -func (logger *Logger) Printf(format string, args ...interface{}) { - entry := logger.newEntry() - entry.Printf(format, args...) - logger.releaseEntry(entry) -} - -func (logger *Logger) Warnf(format string, args ...interface{}) { - if logger.level() >= WarnLevel { - entry := logger.newEntry() - entry.Warnf(format, args...) - logger.releaseEntry(entry) - } -} - -func (logger *Logger) Warningf(format string, args ...interface{}) { - if logger.level() >= WarnLevel { - entry := logger.newEntry() - entry.Warnf(format, args...) - logger.releaseEntry(entry) - } -} - -func (logger *Logger) Errorf(format string, args ...interface{}) { - if logger.level() >= ErrorLevel { - entry := logger.newEntry() - entry.Errorf(format, args...) - logger.releaseEntry(entry) - } -} - -func (logger *Logger) Fatalf(format string, args ...interface{}) { - if logger.level() >= FatalLevel { - entry := logger.newEntry() - entry.Fatalf(format, args...) - logger.releaseEntry(entry) - } - Exit(1) -} - -func (logger *Logger) Panicf(format string, args ...interface{}) { - if logger.level() >= PanicLevel { - entry := logger.newEntry() - entry.Panicf(format, args...) - logger.releaseEntry(entry) - } -} - -func (logger *Logger) Debug(args ...interface{}) { - if logger.level() >= DebugLevel { - entry := logger.newEntry() - entry.Debug(args...) - logger.releaseEntry(entry) - } -} - -func (logger *Logger) Info(args ...interface{}) { - if logger.level() >= InfoLevel { - entry := logger.newEntry() - entry.Info(args...) - logger.releaseEntry(entry) - } -} - -func (logger *Logger) Print(args ...interface{}) { - entry := logger.newEntry() - entry.Info(args...) - logger.releaseEntry(entry) -} - -func (logger *Logger) Warn(args ...interface{}) { - if logger.level() >= WarnLevel { - entry := logger.newEntry() - entry.Warn(args...) - logger.releaseEntry(entry) - } -} - -func (logger *Logger) Warning(args ...interface{}) { - if logger.level() >= WarnLevel { - entry := logger.newEntry() - entry.Warn(args...) - logger.releaseEntry(entry) - } -} - -func (logger *Logger) Error(args ...interface{}) { - if logger.level() >= ErrorLevel { - entry := logger.newEntry() - entry.Error(args...) - logger.releaseEntry(entry) - } -} - -func (logger *Logger) Fatal(args ...interface{}) { - if logger.level() >= FatalLevel { - entry := logger.newEntry() - entry.Fatal(args...) - logger.releaseEntry(entry) - } - Exit(1) -} - -func (logger *Logger) Panic(args ...interface{}) { - if logger.level() >= PanicLevel { - entry := logger.newEntry() - entry.Panic(args...) - logger.releaseEntry(entry) - } -} - -func (logger *Logger) Debugln(args ...interface{}) { - if logger.level() >= DebugLevel { - entry := logger.newEntry() - entry.Debugln(args...) - logger.releaseEntry(entry) - } -} - -func (logger *Logger) Infoln(args ...interface{}) { - if logger.level() >= InfoLevel { - entry := logger.newEntry() - entry.Infoln(args...) - logger.releaseEntry(entry) - } -} - -func (logger *Logger) Println(args ...interface{}) { - entry := logger.newEntry() - entry.Println(args...) - logger.releaseEntry(entry) -} - -func (logger *Logger) Warnln(args ...interface{}) { - if logger.level() >= WarnLevel { - entry := logger.newEntry() - entry.Warnln(args...) - logger.releaseEntry(entry) - } -} - -func (logger *Logger) Warningln(args ...interface{}) { - if logger.level() >= WarnLevel { - entry := logger.newEntry() - entry.Warnln(args...) - logger.releaseEntry(entry) - } -} - -func (logger *Logger) Errorln(args ...interface{}) { - if logger.level() >= ErrorLevel { - entry := logger.newEntry() - entry.Errorln(args...) - logger.releaseEntry(entry) - } -} - -func (logger *Logger) Fatalln(args ...interface{}) { - if logger.level() >= FatalLevel { - entry := logger.newEntry() - entry.Fatalln(args...) - logger.releaseEntry(entry) - } - Exit(1) -} - -func (logger *Logger) Panicln(args ...interface{}) { - if logger.level() >= PanicLevel { - entry := logger.newEntry() - entry.Panicln(args...) - logger.releaseEntry(entry) - } -} - -//When file is opened with appending mode, it's safe to -//write concurrently to a file (within 4k message on Linux). -//In these cases user can choose to disable the lock. -func (logger *Logger) SetNoLock() { - logger.mu.Disable() -} - -func (logger *Logger) level() Level { - return Level(atomic.LoadUint32((*uint32)(&logger.Level))) -} - -func (logger *Logger) SetLevel(level Level) { - atomic.StoreUint32((*uint32)(&logger.Level), uint32(level)) -} - -func (logger *Logger) AddHook(hook Hook) { - logger.mu.Lock() - defer logger.mu.Unlock() - logger.Hooks.Add(hook) -} diff --git a/vendor/github.com/sirupsen/logrus/logrus.go b/vendor/github.com/sirupsen/logrus/logrus.go deleted file mode 100644 index dd3899974..000000000 --- a/vendor/github.com/sirupsen/logrus/logrus.go +++ /dev/null @@ -1,143 +0,0 @@ -package logrus - -import ( - "fmt" - "log" - "strings" -) - -// Fields type, used to pass to `WithFields`. -type Fields map[string]interface{} - -// Level type -type Level uint32 - -// Convert the Level to a string. E.g. PanicLevel becomes "panic". -func (level Level) String() string { - switch level { - case DebugLevel: - return "debug" - case InfoLevel: - return "info" - case WarnLevel: - return "warning" - case ErrorLevel: - return "error" - case FatalLevel: - return "fatal" - case PanicLevel: - return "panic" - } - - return "unknown" -} - -// ParseLevel takes a string level and returns the Logrus log level constant. -func ParseLevel(lvl string) (Level, error) { - switch strings.ToLower(lvl) { - case "panic": - return PanicLevel, nil - case "fatal": - return FatalLevel, nil - case "error": - return ErrorLevel, nil - case "warn", "warning": - return WarnLevel, nil - case "info": - return InfoLevel, nil - case "debug": - return DebugLevel, nil - } - - var l Level - return l, fmt.Errorf("not a valid logrus Level: %q", lvl) -} - -// A constant exposing all logging levels -var AllLevels = []Level{ - PanicLevel, - FatalLevel, - ErrorLevel, - WarnLevel, - InfoLevel, - DebugLevel, -} - -// These are the different logging levels. You can set the logging level to log -// on your instance of logger, obtained with `logrus.New()`. -const ( - // PanicLevel level, highest level of severity. Logs and then calls panic with the - // message passed to Debug, Info, ... - PanicLevel Level = iota - // FatalLevel level. Logs and then calls `os.Exit(1)`. It will exit even if the - // logging level is set to Panic. - FatalLevel - // ErrorLevel level. Logs. Used for errors that should definitely be noted. - // Commonly used for hooks to send errors to an error tracking service. - ErrorLevel - // WarnLevel level. Non-critical entries that deserve eyes. - WarnLevel - // InfoLevel level. General operational entries about what's going on inside the - // application. - InfoLevel - // DebugLevel level. Usually only enabled when debugging. Very verbose logging. - DebugLevel -) - -// Won't compile if StdLogger can't be realized by a log.Logger -var ( - _ StdLogger = &log.Logger{} - _ StdLogger = &Entry{} - _ StdLogger = &Logger{} -) - -// StdLogger is what your logrus-enabled library should take, that way -// it'll accept a stdlib logger and a logrus logger. There's no standard -// interface, this is the closest we get, unfortunately. -type StdLogger interface { - Print(...interface{}) - Printf(string, ...interface{}) - Println(...interface{}) - - Fatal(...interface{}) - Fatalf(string, ...interface{}) - Fatalln(...interface{}) - - Panic(...interface{}) - Panicf(string, ...interface{}) - Panicln(...interface{}) -} - -// The FieldLogger interface generalizes the Entry and Logger types -type FieldLogger interface { - WithField(key string, value interface{}) *Entry - WithFields(fields Fields) *Entry - WithError(err error) *Entry - - Debugf(format string, args ...interface{}) - Infof(format string, args ...interface{}) - Printf(format string, args ...interface{}) - Warnf(format string, args ...interface{}) - Warningf(format string, args ...interface{}) - Errorf(format string, args ...interface{}) - Fatalf(format string, args ...interface{}) - Panicf(format string, args ...interface{}) - - Debug(args ...interface{}) - Info(args ...interface{}) - Print(args ...interface{}) - Warn(args ...interface{}) - Warning(args ...interface{}) - Error(args ...interface{}) - Fatal(args ...interface{}) - Panic(args ...interface{}) - - Debugln(args ...interface{}) - Infoln(args ...interface{}) - Println(args ...interface{}) - Warnln(args ...interface{}) - Warningln(args ...interface{}) - Errorln(args ...interface{}) - Fatalln(args ...interface{}) - Panicln(args ...interface{}) -} diff --git a/vendor/github.com/sirupsen/logrus/terminal_bsd.go b/vendor/github.com/sirupsen/logrus/terminal_bsd.go deleted file mode 100644 index 4880d13d2..000000000 --- a/vendor/github.com/sirupsen/logrus/terminal_bsd.go +++ /dev/null @@ -1,10 +0,0 @@ -// +build darwin freebsd openbsd netbsd dragonfly -// +build !appengine,!gopherjs - -package logrus - -import "golang.org/x/sys/unix" - -const ioctlReadTermios = unix.TIOCGETA - -type Termios unix.Termios diff --git a/vendor/github.com/sirupsen/logrus/terminal_check_appengine.go b/vendor/github.com/sirupsen/logrus/terminal_check_appengine.go deleted file mode 100644 index 3de08e802..000000000 --- a/vendor/github.com/sirupsen/logrus/terminal_check_appengine.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build appengine gopherjs - -package logrus - -import ( - "io" -) - -func checkIfTerminal(w io.Writer) bool { - return true -} diff --git a/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go b/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go deleted file mode 100644 index 067047a12..000000000 --- a/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go +++ /dev/null @@ -1,19 +0,0 @@ -// +build !appengine,!gopherjs - -package logrus - -import ( - "io" - "os" - - "golang.org/x/crypto/ssh/terminal" -) - -func checkIfTerminal(w io.Writer) bool { - switch v := w.(type) { - case *os.File: - return terminal.IsTerminal(int(v.Fd())) - default: - return false - } -} diff --git a/vendor/github.com/sirupsen/logrus/terminal_linux.go b/vendor/github.com/sirupsen/logrus/terminal_linux.go deleted file mode 100644 index f29a0097c..000000000 --- a/vendor/github.com/sirupsen/logrus/terminal_linux.go +++ /dev/null @@ -1,14 +0,0 @@ -// Based on ssh/terminal: -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !appengine,!gopherjs - -package logrus - -import "golang.org/x/sys/unix" - -const ioctlReadTermios = unix.TCGETS - -type Termios unix.Termios diff --git a/vendor/github.com/sirupsen/logrus/text_formatter.go b/vendor/github.com/sirupsen/logrus/text_formatter.go deleted file mode 100644 index 61b21caea..000000000 --- a/vendor/github.com/sirupsen/logrus/text_formatter.go +++ /dev/null @@ -1,178 +0,0 @@ -package logrus - -import ( - "bytes" - "fmt" - "sort" - "strings" - "sync" - "time" -) - -const ( - nocolor = 0 - red = 31 - green = 32 - yellow = 33 - blue = 36 - gray = 37 -) - -var ( - baseTimestamp time.Time -) - -func init() { - baseTimestamp = time.Now() -} - -// TextFormatter formats logs into text -type TextFormatter struct { - // Set to true to bypass checking for a TTY before outputting colors. - ForceColors bool - - // Force disabling colors. - DisableColors bool - - // Disable timestamp logging. useful when output is redirected to logging - // system that already adds timestamps. - DisableTimestamp bool - - // Enable logging the full timestamp when a TTY is attached instead of just - // the time passed since beginning of execution. - FullTimestamp bool - - // TimestampFormat to use for display when a full timestamp is printed - TimestampFormat string - - // The fields are sorted by default for a consistent output. For applications - // that log extremely frequently and don't use the JSON formatter this may not - // be desired. - DisableSorting bool - - // QuoteEmptyFields will wrap empty fields in quotes if true - QuoteEmptyFields bool - - // Whether the logger's out is to a terminal - isTerminal bool - - sync.Once -} - -func (f *TextFormatter) init(entry *Entry) { - if entry.Logger != nil { - f.isTerminal = checkIfTerminal(entry.Logger.Out) - } -} - -// Format renders a single log entry -func (f *TextFormatter) Format(entry *Entry) ([]byte, error) { - var b *bytes.Buffer - keys := make([]string, 0, len(entry.Data)) - for k := range entry.Data { - keys = append(keys, k) - } - - if !f.DisableSorting { - sort.Strings(keys) - } - if entry.Buffer != nil { - b = entry.Buffer - } else { - b = &bytes.Buffer{} - } - - prefixFieldClashes(entry.Data) - - f.Do(func() { f.init(entry) }) - - isColored := (f.ForceColors || f.isTerminal) && !f.DisableColors - - timestampFormat := f.TimestampFormat - if timestampFormat == "" { - timestampFormat = defaultTimestampFormat - } - if isColored { - f.printColored(b, entry, keys, timestampFormat) - } else { - if !f.DisableTimestamp { - f.appendKeyValue(b, "time", entry.Time.Format(timestampFormat)) - } - f.appendKeyValue(b, "level", entry.Level.String()) - if entry.Message != "" { - f.appendKeyValue(b, "msg", entry.Message) - } - for _, key := range keys { - f.appendKeyValue(b, key, entry.Data[key]) - } - } - - b.WriteByte('\n') - return b.Bytes(), nil -} - -func (f *TextFormatter) printColored(b *bytes.Buffer, entry *Entry, keys []string, timestampFormat string) { - var levelColor int - switch entry.Level { - case DebugLevel: - levelColor = gray - case WarnLevel: - levelColor = yellow - case ErrorLevel, FatalLevel, PanicLevel: - levelColor = red - default: - levelColor = blue - } - - levelText := strings.ToUpper(entry.Level.String())[0:4] - - if f.DisableTimestamp { - fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m %-44s ", levelColor, levelText, entry.Message) - } else if !f.FullTimestamp { - fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%04d] %-44s ", levelColor, levelText, int(entry.Time.Sub(baseTimestamp)/time.Second), entry.Message) - } else { - fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%s] %-44s ", levelColor, levelText, entry.Time.Format(timestampFormat), entry.Message) - } - for _, k := range keys { - v := entry.Data[k] - fmt.Fprintf(b, " \x1b[%dm%s\x1b[0m=", levelColor, k) - f.appendValue(b, v) - } -} - -func (f *TextFormatter) needsQuoting(text string) bool { - if f.QuoteEmptyFields && len(text) == 0 { - return true - } - for _, ch := range text { - if !((ch >= 'a' && ch <= 'z') || - (ch >= 'A' && ch <= 'Z') || - (ch >= '0' && ch <= '9') || - ch == '-' || ch == '.' || ch == '_' || ch == '/' || ch == '@' || ch == '^' || ch == '+') { - return true - } - } - return false -} - -func (f *TextFormatter) appendKeyValue(b *bytes.Buffer, key string, value interface{}) { - if b.Len() > 0 { - b.WriteByte(' ') - } - b.WriteString(key) - b.WriteByte('=') - f.appendValue(b, value) -} - -func (f *TextFormatter) appendValue(b *bytes.Buffer, value interface{}) { - stringVal, ok := value.(string) - if !ok { - stringVal = fmt.Sprint(value) - } - - if !f.needsQuoting(stringVal) { - b.WriteString(stringVal) - } else { - b.WriteString(fmt.Sprintf("%q", stringVal)) - } -} diff --git a/vendor/github.com/sirupsen/logrus/writer.go b/vendor/github.com/sirupsen/logrus/writer.go deleted file mode 100644 index 7bdebedc6..000000000 --- a/vendor/github.com/sirupsen/logrus/writer.go +++ /dev/null @@ -1,62 +0,0 @@ -package logrus - -import ( - "bufio" - "io" - "runtime" -) - -func (logger *Logger) Writer() *io.PipeWriter { - return logger.WriterLevel(InfoLevel) -} - -func (logger *Logger) WriterLevel(level Level) *io.PipeWriter { - return NewEntry(logger).WriterLevel(level) -} - -func (entry *Entry) Writer() *io.PipeWriter { - return entry.WriterLevel(InfoLevel) -} - -func (entry *Entry) WriterLevel(level Level) *io.PipeWriter { - reader, writer := io.Pipe() - - var printFunc func(args ...interface{}) - - switch level { - case DebugLevel: - printFunc = entry.Debug - case InfoLevel: - printFunc = entry.Info - case WarnLevel: - printFunc = entry.Warn - case ErrorLevel: - printFunc = entry.Error - case FatalLevel: - printFunc = entry.Fatal - case PanicLevel: - printFunc = entry.Panic - default: - printFunc = entry.Print - } - - go entry.writerScanner(reader, printFunc) - runtime.SetFinalizer(writer, writerFinalizer) - - return writer -} - -func (entry *Entry) writerScanner(reader *io.PipeReader, printFunc func(args ...interface{})) { - scanner := bufio.NewScanner(reader) - for scanner.Scan() { - printFunc(scanner.Text()) - } - if err := scanner.Err(); err != nil { - entry.Errorf("Error while reading from Writer: %s", err) - } - reader.Close() -} - -func writerFinalizer(writer *io.PipeWriter) { - writer.Close() -} diff --git a/vendor/github.com/src-d/gcfg/read.go b/vendor/github.com/src-d/gcfg/read.go index ea014f1b3..fff0448c7 100644 --- a/vendor/github.com/src-d/gcfg/read.go +++ b/vendor/github.com/src-d/gcfg/read.go @@ -12,7 +12,7 @@ import ( "gopkg.in/warnings.v0" ) -var unescape = map[rune]rune{'\\': '\\', '"': '"', 'n': '\n', 't': '\t'} +var unescape = map[rune]rune{'\\': '\\', '"': '"', 'n': '\n', 't': '\t', 'b': '\b'} // no error: invalid literals should be caught by scanner func unquote(s string) string { @@ -48,7 +48,7 @@ func unquote(s string) string { return string(u) } -func read(c *warnings.Collector, callback func(string,string,string,string,bool)error, +func read(c *warnings.Collector, callback func(string, string, string, string, bool) error, fset *token.FileSet, file *token.File, src []byte) error { // var s scanner.Scanner @@ -223,7 +223,7 @@ func readInto(config interface{}, fset *token.FileSet, file *token.File, // (as opposed to set to empty string). // // If callback returns an error, ReadWithCallback terminates with an error too. -func ReadWithCallback(reader io.Reader, callback func(string,string,string,string,bool)error) error { +func ReadWithCallback(reader io.Reader, callback func(string, string, string, string, bool) error) error { src, err := ioutil.ReadAll(reader) if err != nil { return err diff --git a/vendor/github.com/src-d/gcfg/scanner/scanner.go b/vendor/github.com/src-d/gcfg/scanner/scanner.go index f15867648..b1eef06f6 100644 --- a/vendor/github.com/src-d/gcfg/scanner/scanner.go +++ b/vendor/github.com/src-d/gcfg/scanner/scanner.go @@ -170,7 +170,7 @@ func (s *Scanner) scanEscape(val bool) { switch ch { case '\\', '"': // ok - case 'n', 't': + case 'n', 't', 'b': if val { break // ok } @@ -232,10 +232,10 @@ loop: s.next() } if s.ch != '\n' { - s.error(offs, "unquoted '\\' must be followed by new line") - break loop + s.scanEscape(true) + } else { + s.next() } - s.next() case ch == '"': inQuote = !inQuote case ch == '\r': diff --git a/vendor/github.com/streadway/amqp/certs.sh b/vendor/github.com/streadway/amqp/certs.sh old mode 100755 new mode 100644 diff --git a/vendor/github.com/streadway/amqp/gen.sh b/vendor/github.com/streadway/amqp/gen.sh old mode 100755 new mode 100644 diff --git a/vendor/github.com/streadway/amqp/pre-commit b/vendor/github.com/streadway/amqp/pre-commit old mode 100755 new mode 100644 diff --git a/vendor/github.com/stretchr/testify/LICENSE b/vendor/github.com/stretchr/testify/LICENSE index f38ec5956..4b0421cf9 100644 --- a/vendor/github.com/stretchr/testify/LICENSE +++ b/vendor/github.com/stretchr/testify/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2012-2018 Mat Ryer and Tyler Bunnell +Copyright (c) 2012-2020 Mat Ryer, Tyler Bunnell and contributors. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/github.com/stretchr/testify/assert/assertion_compare.go b/vendor/github.com/stretchr/testify/assert/assertion_compare.go new file mode 100644 index 000000000..dc200395c --- /dev/null +++ b/vendor/github.com/stretchr/testify/assert/assertion_compare.go @@ -0,0 +1,274 @@ +package assert + +import ( + "fmt" + "reflect" +) + +type CompareType int + +const ( + compareLess CompareType = iota - 1 + compareEqual + compareGreater +) + +func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) { + switch kind { + case reflect.Int: + { + intobj1 := obj1.(int) + intobj2 := obj2.(int) + if intobj1 > intobj2 { + return compareGreater, true + } + if intobj1 == intobj2 { + return compareEqual, true + } + if intobj1 < intobj2 { + return compareLess, true + } + } + case reflect.Int8: + { + int8obj1 := obj1.(int8) + int8obj2 := obj2.(int8) + if int8obj1 > int8obj2 { + return compareGreater, true + } + if int8obj1 == int8obj2 { + return compareEqual, true + } + if int8obj1 < int8obj2 { + return compareLess, true + } + } + case reflect.Int16: + { + int16obj1 := obj1.(int16) + int16obj2 := obj2.(int16) + if int16obj1 > int16obj2 { + return compareGreater, true + } + if int16obj1 == int16obj2 { + return compareEqual, true + } + if int16obj1 < int16obj2 { + return compareLess, true + } + } + case reflect.Int32: + { + int32obj1 := obj1.(int32) + int32obj2 := obj2.(int32) + if int32obj1 > int32obj2 { + return compareGreater, true + } + if int32obj1 == int32obj2 { + return compareEqual, true + } + if int32obj1 < int32obj2 { + return compareLess, true + } + } + case reflect.Int64: + { + int64obj1 := obj1.(int64) + int64obj2 := obj2.(int64) + if int64obj1 > int64obj2 { + return compareGreater, true + } + if int64obj1 == int64obj2 { + return compareEqual, true + } + if int64obj1 < int64obj2 { + return compareLess, true + } + } + case reflect.Uint: + { + uintobj1 := obj1.(uint) + uintobj2 := obj2.(uint) + if uintobj1 > uintobj2 { + return compareGreater, true + } + if uintobj1 == uintobj2 { + return compareEqual, true + } + if uintobj1 < uintobj2 { + return compareLess, true + } + } + case reflect.Uint8: + { + uint8obj1 := obj1.(uint8) + uint8obj2 := obj2.(uint8) + if uint8obj1 > uint8obj2 { + return compareGreater, true + } + if uint8obj1 == uint8obj2 { + return compareEqual, true + } + if uint8obj1 < uint8obj2 { + return compareLess, true + } + } + case reflect.Uint16: + { + uint16obj1 := obj1.(uint16) + uint16obj2 := obj2.(uint16) + if uint16obj1 > uint16obj2 { + return compareGreater, true + } + if uint16obj1 == uint16obj2 { + return compareEqual, true + } + if uint16obj1 < uint16obj2 { + return compareLess, true + } + } + case reflect.Uint32: + { + uint32obj1 := obj1.(uint32) + uint32obj2 := obj2.(uint32) + if uint32obj1 > uint32obj2 { + return compareGreater, true + } + if uint32obj1 == uint32obj2 { + return compareEqual, true + } + if uint32obj1 < uint32obj2 { + return compareLess, true + } + } + case reflect.Uint64: + { + uint64obj1 := obj1.(uint64) + uint64obj2 := obj2.(uint64) + if uint64obj1 > uint64obj2 { + return compareGreater, true + } + if uint64obj1 == uint64obj2 { + return compareEqual, true + } + if uint64obj1 < uint64obj2 { + return compareLess, true + } + } + case reflect.Float32: + { + float32obj1 := obj1.(float32) + float32obj2 := obj2.(float32) + if float32obj1 > float32obj2 { + return compareGreater, true + } + if float32obj1 == float32obj2 { + return compareEqual, true + } + if float32obj1 < float32obj2 { + return compareLess, true + } + } + case reflect.Float64: + { + float64obj1 := obj1.(float64) + float64obj2 := obj2.(float64) + if float64obj1 > float64obj2 { + return compareGreater, true + } + if float64obj1 == float64obj2 { + return compareEqual, true + } + if float64obj1 < float64obj2 { + return compareLess, true + } + } + case reflect.String: + { + stringobj1 := obj1.(string) + stringobj2 := obj2.(string) + if stringobj1 > stringobj2 { + return compareGreater, true + } + if stringobj1 == stringobj2 { + return compareEqual, true + } + if stringobj1 < stringobj2 { + return compareLess, true + } + } + } + + return compareEqual, false +} + +// Greater asserts that the first element is greater than the second +// +// assert.Greater(t, 2, 1) +// assert.Greater(t, float64(2), float64(1)) +// assert.Greater(t, "b", "a") +func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { + return compareTwoValues(t, e1, e2, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs) +} + +// GreaterOrEqual asserts that the first element is greater than or equal to the second +// +// assert.GreaterOrEqual(t, 2, 1) +// assert.GreaterOrEqual(t, 2, 2) +// assert.GreaterOrEqual(t, "b", "a") +// assert.GreaterOrEqual(t, "b", "b") +func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { + return compareTwoValues(t, e1, e2, []CompareType{compareGreater, compareEqual}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs) +} + +// Less asserts that the first element is less than the second +// +// assert.Less(t, 1, 2) +// assert.Less(t, float64(1), float64(2)) +// assert.Less(t, "a", "b") +func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { + return compareTwoValues(t, e1, e2, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs) +} + +// LessOrEqual asserts that the first element is less than or equal to the second +// +// assert.LessOrEqual(t, 1, 2) +// assert.LessOrEqual(t, 2, 2) +// assert.LessOrEqual(t, "a", "b") +// assert.LessOrEqual(t, "b", "b") +func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { + return compareTwoValues(t, e1, e2, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs) +} + +func compareTwoValues(t TestingT, e1 interface{}, e2 interface{}, allowedComparesResults []CompareType, failMessage string, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + e1Kind := reflect.ValueOf(e1).Kind() + e2Kind := reflect.ValueOf(e2).Kind() + if e1Kind != e2Kind { + return Fail(t, "Elements should be the same type", msgAndArgs...) + } + + compareResult, isComparable := compare(e1, e2, e1Kind) + if !isComparable { + return Fail(t, fmt.Sprintf("Can not compare type \"%s\"", reflect.TypeOf(e1)), msgAndArgs...) + } + + if !containsValue(allowedComparesResults, compareResult) { + return Fail(t, fmt.Sprintf(failMessage, e1, e2), msgAndArgs...) + } + + return true +} + +func containsValue(values []CompareType, value CompareType) bool { + for _, v := range values { + if v == value { + return true + } + } + + return false +} diff --git a/vendor/github.com/stretchr/testify/assert/assertion_format.go b/vendor/github.com/stretchr/testify/assert/assertion_format.go index e0364e9e7..b4c46042b 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_format.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_format.go @@ -6,6 +6,7 @@ package assert import ( + io "io" http "net/http" url "net/url" time "time" @@ -32,7 +33,8 @@ func Containsf(t TestingT, s interface{}, contains interface{}, msg string, args return Contains(t, s, contains, append([]interface{}{msg}, args...)...) } -// DirExistsf checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. +// DirExistsf checks whether a directory exists in the given path. It also fails +// if the path is a file rather a directory or there is an error checking whether it exists. func DirExistsf(t TestingT, path string, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -92,7 +94,7 @@ func EqualErrorf(t TestingT, theError error, errString string, msg string, args // EqualValuesf asserts that two objects are equal or convertable to the same types // and equal. // -// assert.EqualValuesf(t, uint32(123, "error message %s", "formatted"), int32(123)) +// assert.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted") func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -126,7 +128,7 @@ func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick // Exactlyf asserts that two objects are equal in value and type. // -// assert.Exactlyf(t, int32(123, "error message %s", "formatted"), int64(123)) +// assert.Exactlyf(t, int32(123), int64(123), "error message %s", "formatted") func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -160,7 +162,8 @@ func Falsef(t TestingT, value bool, msg string, args ...interface{}) bool { return False(t, value, append([]interface{}{msg}, args...)...) } -// FileExistsf checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. +// FileExistsf checks whether a file exists in the given path. It also fails if +// the path points to a directory or there is an error when trying to check the file. func FileExistsf(t TestingT, path string, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -171,7 +174,7 @@ func FileExistsf(t TestingT, path string, msg string, args ...interface{}) bool // Greaterf asserts that the first element is greater than the second // // assert.Greaterf(t, 2, 1, "error message %s", "formatted") -// assert.Greaterf(t, float64(2, "error message %s", "formatted"), float64(1)) +// assert.Greaterf(t, float64(2), float64(1), "error message %s", "formatted") // assert.Greaterf(t, "b", "a", "error message %s", "formatted") func Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { @@ -199,11 +202,11 @@ func GreaterOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, arg // assert.HTTPBodyContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") // // Returns whether the assertion was successful (true) or not (false). -func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { +func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, body io.Reader, str interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() } - return HTTPBodyContains(t, handler, method, url, values, str, append([]interface{}{msg}, args...)...) + return HTTPBodyContains(t, handler, method, url, values, body, str, append([]interface{}{msg}, args...)...) } // HTTPBodyNotContainsf asserts that a specified handler returns a @@ -212,18 +215,18 @@ func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url // assert.HTTPBodyNotContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") // // Returns whether the assertion was successful (true) or not (false). -func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { +func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, body io.Reader, str interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() } - return HTTPBodyNotContains(t, handler, method, url, values, str, append([]interface{}{msg}, args...)...) + return HTTPBodyNotContains(t, handler, method, url, values, body, str, append([]interface{}{msg}, args...)...) } // HTTPErrorf asserts that a specified handler returns an error status code. // // assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} // -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +// Returns whether the assertion was successful (true) or not (false). func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -235,7 +238,7 @@ func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, // // assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} // -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +// Returns whether the assertion was successful (true) or not (false). func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -243,6 +246,18 @@ func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url stri return HTTPRedirect(t, handler, method, url, values, append([]interface{}{msg}, args...)...) } +// HTTPStatusCodef asserts that a specified handler returns a specified status code. +// +// assert.HTTPStatusCodef(t, myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPStatusCodef(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return HTTPStatusCode(t, handler, method, url, values, statuscode, append([]interface{}{msg}, args...)...) +} + // HTTPSuccessf asserts that a specified handler returns a success status code. // // assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") @@ -257,7 +272,7 @@ func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url strin // Implementsf asserts that an object is implemented by the specified interface. // -// assert.Implementsf(t, (*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +// assert.Implementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted") func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -267,7 +282,7 @@ func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, ms // InDeltaf asserts that the two numerals are within delta of each other. // -// assert.InDeltaf(t, math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01) +// assert.InDeltaf(t, math.Pi, 22/7.0, 0.01, "error message %s", "formatted") func InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -325,14 +340,6 @@ func JSONEqf(t TestingT, expected string, actual string, msg string, args ...int return JSONEq(t, expected, actual, append([]interface{}{msg}, args...)...) } -// YAMLEqf asserts that two YAML strings are equivalent. -func YAMLEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return YAMLEq(t, expected, actual, append([]interface{}{msg}, args...)...) -} - // Lenf asserts that the specified object has specific length. // Lenf also fails if the object has a type that len() not accept. // @@ -347,7 +354,7 @@ func Lenf(t TestingT, object interface{}, length int, msg string, args ...interf // Lessf asserts that the first element is less than the second // // assert.Lessf(t, 1, 2, "error message %s", "formatted") -// assert.Lessf(t, float64(1, "error message %s", "formatted"), float64(2)) +// assert.Lessf(t, float64(1), float64(2), "error message %s", "formatted") // assert.Lessf(t, "a", "b", "error message %s", "formatted") func Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { @@ -369,6 +376,17 @@ func LessOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args . return LessOrEqual(t, e1, e2, append([]interface{}{msg}, args...)...) } +// Neverf asserts that the given condition doesn't satisfy in waitFor time, +// periodically checking the target function each tick. +// +// assert.Neverf(t, func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") +func Neverf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Never(t, condition, waitFor, tick, append([]interface{}{msg}, args...)...) +} + // Nilf asserts that the specified object is nil. // // assert.Nilf(t, err, "error message %s", "formatted") @@ -379,6 +397,15 @@ func Nilf(t TestingT, object interface{}, msg string, args ...interface{}) bool return Nil(t, object, append([]interface{}{msg}, args...)...) } +// NoDirExistsf checks whether a directory does not exist in the given path. +// It fails if the path points to an existing _directory_ only. +func NoDirExistsf(t TestingT, path string, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NoDirExists(t, path, append([]interface{}{msg}, args...)...) +} + // NoErrorf asserts that a function returned no error (i.e. `nil`). // // actualObj, err := SomeFunction() @@ -392,6 +419,15 @@ func NoErrorf(t TestingT, err error, msg string, args ...interface{}) bool { return NoError(t, err, append([]interface{}{msg}, args...)...) } +// NoFileExistsf checks whether a file does not exist in a given path. It fails +// if the path points to an existing _file_ only. +func NoFileExistsf(t TestingT, path string, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NoFileExists(t, path, append([]interface{}{msg}, args...)...) +} + // NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the // specified substring or element. // @@ -431,6 +467,16 @@ func NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string, return NotEqual(t, expected, actual, append([]interface{}{msg}, args...)...) } +// NotEqualValuesf asserts that two objects are not equal even when converted to the same type +// +// assert.NotEqualValuesf(t, obj1, obj2, "error message %s", "formatted") +func NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NotEqualValues(t, expected, actual, append([]interface{}{msg}, args...)...) +} + // NotNilf asserts that the specified object is not nil. // // assert.NotNilf(t, err, "error message %s", "formatted") @@ -453,7 +499,7 @@ func NotPanicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bo // NotRegexpf asserts that a specified regexp does not match a string. // -// assert.NotRegexpf(t, regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// assert.NotRegexpf(t, regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") // assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted") func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { @@ -462,6 +508,19 @@ func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args .. return NotRegexp(t, rx, str, append([]interface{}{msg}, args...)...) } +// NotSamef asserts that two pointers do not reference the same object. +// +// assert.NotSamef(t, ptr1, ptr2, "error message %s", "formatted") +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func NotSamef(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NotSame(t, expected, actual, append([]interface{}{msg}, args...)...) +} + // NotSubsetf asserts that the specified list(array, slice...) contains not all // elements given in the specified subset(array, slice...). // @@ -491,6 +550,18 @@ func Panicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool return Panics(t, f, append([]interface{}{msg}, args...)...) } +// PanicsWithErrorf asserts that the code inside the specified PanicTestFunc +// panics, and that the recovered panic value is an error that satisfies the +// EqualError comparison. +// +// assert.PanicsWithErrorf(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +func PanicsWithErrorf(t TestingT, errString string, f PanicTestFunc, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return PanicsWithError(t, errString, f, append([]interface{}{msg}, args...)...) +} + // PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that // the recovered panic value equals the expected panic value. // @@ -504,7 +575,7 @@ func PanicsWithValuef(t TestingT, expected interface{}, f PanicTestFunc, msg str // Regexpf asserts that a specified regexp matches a string. // -// assert.Regexpf(t, regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// assert.Regexpf(t, regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") // assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted") func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { @@ -557,6 +628,14 @@ func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta tim return WithinDuration(t, expected, actual, delta, append([]interface{}{msg}, args...)...) } +// YAMLEqf asserts that two YAML strings are equivalent. +func YAMLEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return YAMLEq(t, expected, actual, append([]interface{}{msg}, args...)...) +} + // Zerof asserts that i is the zero value for its type. func Zerof(t TestingT, i interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { diff --git a/vendor/github.com/stretchr/testify/assert/assertion_forward.go b/vendor/github.com/stretchr/testify/assert/assertion_forward.go index 26830403a..9bea8d189 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_forward.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_forward.go @@ -6,6 +6,7 @@ package assert import ( + io "io" http "net/http" url "net/url" time "time" @@ -53,7 +54,8 @@ func (a *Assertions) Containsf(s interface{}, contains interface{}, msg string, return Containsf(a.t, s, contains, msg, args...) } -// DirExists checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. +// DirExists checks whether a directory exists in the given path. It also fails +// if the path is a file rather a directory or there is an error checking whether it exists. func (a *Assertions) DirExists(path string, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -61,7 +63,8 @@ func (a *Assertions) DirExists(path string, msgAndArgs ...interface{}) bool { return DirExists(a.t, path, msgAndArgs...) } -// DirExistsf checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. +// DirExistsf checks whether a directory exists in the given path. It also fails +// if the path is a file rather a directory or there is an error checking whether it exists. func (a *Assertions) DirExistsf(path string, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -167,7 +170,7 @@ func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAn // EqualValuesf asserts that two objects are equal or convertable to the same types // and equal. // -// a.EqualValuesf(uint32(123, "error message %s", "formatted"), int32(123)) +// a.EqualValuesf(uint32(123), int32(123), "error message %s", "formatted") func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -249,7 +252,7 @@ func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArg // Exactlyf asserts that two objects are equal in value and type. // -// a.Exactlyf(int32(123, "error message %s", "formatted"), int64(123)) +// a.Exactlyf(int32(123), int64(123), "error message %s", "formatted") func (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -309,7 +312,8 @@ func (a *Assertions) Falsef(value bool, msg string, args ...interface{}) bool { return Falsef(a.t, value, msg, args...) } -// FileExists checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. +// FileExists checks whether a file exists in the given path. It also fails if +// the path points to a directory or there is an error when trying to check the file. func (a *Assertions) FileExists(path string, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -317,7 +321,8 @@ func (a *Assertions) FileExists(path string, msgAndArgs ...interface{}) bool { return FileExists(a.t, path, msgAndArgs...) } -// FileExistsf checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. +// FileExistsf checks whether a file exists in the given path. It also fails if +// the path points to a directory or there is an error when trying to check the file. func (a *Assertions) FileExistsf(path string, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -366,7 +371,7 @@ func (a *Assertions) GreaterOrEqualf(e1 interface{}, e2 interface{}, msg string, // Greaterf asserts that the first element is greater than the second // // a.Greaterf(2, 1, "error message %s", "formatted") -// a.Greaterf(float64(2, "error message %s", "formatted"), float64(1)) +// a.Greaterf(float64(2), float64(1), "error message %s", "formatted") // a.Greaterf("b", "a", "error message %s", "formatted") func (a *Assertions) Greaterf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { @@ -381,11 +386,11 @@ func (a *Assertions) Greaterf(e1 interface{}, e2 interface{}, msg string, args . // a.HTTPBodyContains(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") // // Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { +func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, body io.Reader, str interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() } - return HTTPBodyContains(a.t, handler, method, url, values, str, msgAndArgs...) + return HTTPBodyContains(a.t, handler, method, url, values, body, str, msgAndArgs...) } // HTTPBodyContainsf asserts that a specified handler returns a @@ -394,11 +399,11 @@ func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, u // a.HTTPBodyContainsf(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") // // Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { +func (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, url string, values url.Values, body io.Reader, str interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() } - return HTTPBodyContainsf(a.t, handler, method, url, values, str, msg, args...) + return HTTPBodyContainsf(a.t, handler, method, url, values, body, str, msg, args...) } // HTTPBodyNotContains asserts that a specified handler returns a @@ -407,11 +412,11 @@ func (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, // a.HTTPBodyNotContains(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") // // Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { +func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, body io.Reader, str interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() } - return HTTPBodyNotContains(a.t, handler, method, url, values, str, msgAndArgs...) + return HTTPBodyNotContains(a.t, handler, method, url, values, body, str, msgAndArgs...) } // HTTPBodyNotContainsf asserts that a specified handler returns a @@ -420,11 +425,11 @@ func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string // a.HTTPBodyNotContainsf(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") // // Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { +func (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method string, url string, values url.Values, body io.Reader, str interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() } - return HTTPBodyNotContainsf(a.t, handler, method, url, values, str, msg, args...) + return HTTPBodyNotContainsf(a.t, handler, method, url, values, body, str, msg, args...) } // HTTPError asserts that a specified handler returns an error status code. @@ -443,7 +448,7 @@ func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url stri // // a.HTTPErrorf(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} // -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -467,7 +472,7 @@ func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url s // // a.HTTPRedirectf(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} // -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -475,6 +480,30 @@ func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url return HTTPRedirectf(a.t, handler, method, url, values, msg, args...) } +// HTTPStatusCode asserts that a specified handler returns a specified status code. +// +// a.HTTPStatusCode(myHandler, "GET", "/notImplemented", nil, 501) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPStatusCode(handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return HTTPStatusCode(a.t, handler, method, url, values, statuscode, msgAndArgs...) +} + +// HTTPStatusCodef asserts that a specified handler returns a specified status code. +// +// a.HTTPStatusCodef(myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPStatusCodef(handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return HTTPStatusCodef(a.t, handler, method, url, values, statuscode, msg, args...) +} + // HTTPSuccess asserts that a specified handler returns a success status code. // // a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil) @@ -511,7 +540,7 @@ func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, // Implementsf asserts that an object is implemented by the specified interface. // -// a.Implementsf((*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +// a.Implementsf((*MyInterface)(nil), new(MyObject), "error message %s", "formatted") func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -521,7 +550,7 @@ func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{} // InDelta asserts that the two numerals are within delta of each other. // -// a.InDelta(math.Pi, (22 / 7.0), 0.01) +// a.InDelta(math.Pi, 22/7.0, 0.01) func (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -563,7 +592,7 @@ func (a *Assertions) InDeltaSlicef(expected interface{}, actual interface{}, del // InDeltaf asserts that the two numerals are within delta of each other. // -// a.InDeltaf(math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01) +// a.InDeltaf(math.Pi, 22/7.0, 0.01, "error message %s", "formatted") func (a *Assertions) InDeltaf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -639,22 +668,6 @@ func (a *Assertions) JSONEqf(expected string, actual string, msg string, args .. return JSONEqf(a.t, expected, actual, msg, args...) } -// YAMLEq asserts that two YAML strings are equivalent. -func (a *Assertions) YAMLEq(expected string, actual string, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return YAMLEq(a.t, expected, actual, msgAndArgs...) -} - -// YAMLEqf asserts that two YAML strings are equivalent. -func (a *Assertions) YAMLEqf(expected string, actual string, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return YAMLEqf(a.t, expected, actual, msg, args...) -} - // Len asserts that the specified object has specific length. // Len also fails if the object has a type that len() not accept. // @@ -718,7 +731,7 @@ func (a *Assertions) LessOrEqualf(e1 interface{}, e2 interface{}, msg string, ar // Lessf asserts that the first element is less than the second // // a.Lessf(1, 2, "error message %s", "formatted") -// a.Lessf(float64(1, "error message %s", "formatted"), float64(2)) +// a.Lessf(float64(1), float64(2), "error message %s", "formatted") // a.Lessf("a", "b", "error message %s", "formatted") func (a *Assertions) Lessf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { @@ -727,6 +740,28 @@ func (a *Assertions) Lessf(e1 interface{}, e2 interface{}, msg string, args ...i return Lessf(a.t, e1, e2, msg, args...) } +// Never asserts that the given condition doesn't satisfy in waitFor time, +// periodically checking the target function each tick. +// +// a.Never(func() bool { return false; }, time.Second, 10*time.Millisecond) +func (a *Assertions) Never(condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Never(a.t, condition, waitFor, tick, msgAndArgs...) +} + +// Neverf asserts that the given condition doesn't satisfy in waitFor time, +// periodically checking the target function each tick. +// +// a.Neverf(func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") +func (a *Assertions) Neverf(condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Neverf(a.t, condition, waitFor, tick, msg, args...) +} + // Nil asserts that the specified object is nil. // // a.Nil(err) @@ -747,6 +782,24 @@ func (a *Assertions) Nilf(object interface{}, msg string, args ...interface{}) b return Nilf(a.t, object, msg, args...) } +// NoDirExists checks whether a directory does not exist in the given path. +// It fails if the path points to an existing _directory_ only. +func (a *Assertions) NoDirExists(path string, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NoDirExists(a.t, path, msgAndArgs...) +} + +// NoDirExistsf checks whether a directory does not exist in the given path. +// It fails if the path points to an existing _directory_ only. +func (a *Assertions) NoDirExistsf(path string, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NoDirExistsf(a.t, path, msg, args...) +} + // NoError asserts that a function returned no error (i.e. `nil`). // // actualObj, err := SomeFunction() @@ -773,6 +826,24 @@ func (a *Assertions) NoErrorf(err error, msg string, args ...interface{}) bool { return NoErrorf(a.t, err, msg, args...) } +// NoFileExists checks whether a file does not exist in a given path. It fails +// if the path points to an existing _file_ only. +func (a *Assertions) NoFileExists(path string, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NoFileExists(a.t, path, msgAndArgs...) +} + +// NoFileExistsf checks whether a file does not exist in a given path. It fails +// if the path points to an existing _file_ only. +func (a *Assertions) NoFileExistsf(path string, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NoFileExistsf(a.t, path, msg, args...) +} + // NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the // specified substring or element. // @@ -838,6 +909,26 @@ func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndAr return NotEqual(a.t, expected, actual, msgAndArgs...) } +// NotEqualValues asserts that two objects are not equal even when converted to the same type +// +// a.NotEqualValues(obj1, obj2) +func (a *Assertions) NotEqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotEqualValues(a.t, expected, actual, msgAndArgs...) +} + +// NotEqualValuesf asserts that two objects are not equal even when converted to the same type +// +// a.NotEqualValuesf(obj1, obj2, "error message %s", "formatted") +func (a *Assertions) NotEqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotEqualValuesf(a.t, expected, actual, msg, args...) +} + // NotEqualf asserts that the specified values are NOT equal. // // a.NotEqualf(obj1, obj2, "error message %s", "formatted") @@ -904,7 +995,7 @@ func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...in // NotRegexpf asserts that a specified regexp does not match a string. // -// a.NotRegexpf(regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// a.NotRegexpf(regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") // a.NotRegexpf("^start", "it's not starting", "error message %s", "formatted") func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { @@ -913,6 +1004,32 @@ func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, arg return NotRegexpf(a.t, rx, str, msg, args...) } +// NotSame asserts that two pointers do not reference the same object. +// +// a.NotSame(ptr1, ptr2) +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func (a *Assertions) NotSame(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotSame(a.t, expected, actual, msgAndArgs...) +} + +// NotSamef asserts that two pointers do not reference the same object. +// +// a.NotSamef(ptr1, ptr2, "error message %s", "formatted") +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func (a *Assertions) NotSamef(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotSamef(a.t, expected, actual, msg, args...) +} + // NotSubset asserts that the specified list(array, slice...) contains not all // elements given in the specified subset(array, slice...). // @@ -961,6 +1078,30 @@ func (a *Assertions) Panics(f PanicTestFunc, msgAndArgs ...interface{}) bool { return Panics(a.t, f, msgAndArgs...) } +// PanicsWithError asserts that the code inside the specified PanicTestFunc +// panics, and that the recovered panic value is an error that satisfies the +// EqualError comparison. +// +// a.PanicsWithError("crazy error", func(){ GoCrazy() }) +func (a *Assertions) PanicsWithError(errString string, f PanicTestFunc, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return PanicsWithError(a.t, errString, f, msgAndArgs...) +} + +// PanicsWithErrorf asserts that the code inside the specified PanicTestFunc +// panics, and that the recovered panic value is an error that satisfies the +// EqualError comparison. +// +// a.PanicsWithErrorf("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +func (a *Assertions) PanicsWithErrorf(errString string, f PanicTestFunc, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return PanicsWithErrorf(a.t, errString, f, msg, args...) +} + // PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that // the recovered panic value equals the expected panic value. // @@ -1006,7 +1147,7 @@ func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...inter // Regexpf asserts that a specified regexp matches a string. // -// a.Regexpf(regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// a.Regexpf(regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") // a.Regexpf("start...$", "it's not starting", "error message %s", "formatted") func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { @@ -1103,6 +1244,22 @@ func (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta return WithinDurationf(a.t, expected, actual, delta, msg, args...) } +// YAMLEq asserts that two YAML strings are equivalent. +func (a *Assertions) YAMLEq(expected string, actual string, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return YAMLEq(a.t, expected, actual, msgAndArgs...) +} + +// YAMLEqf asserts that two YAML strings are equivalent. +func (a *Assertions) YAMLEqf(expected string, actual string, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return YAMLEqf(a.t, expected, actual, msg, args...) +} + // Zero asserts that i is the zero value for its type. func (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { diff --git a/vendor/github.com/stretchr/testify/assert/assertion_order.go b/vendor/github.com/stretchr/testify/assert/assertion_order.go deleted file mode 100644 index 15a486ca6..000000000 --- a/vendor/github.com/stretchr/testify/assert/assertion_order.go +++ /dev/null @@ -1,309 +0,0 @@ -package assert - -import ( - "fmt" - "reflect" -) - -func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { - switch kind { - case reflect.Int: - { - intobj1 := obj1.(int) - intobj2 := obj2.(int) - if intobj1 > intobj2 { - return -1, true - } - if intobj1 == intobj2 { - return 0, true - } - if intobj1 < intobj2 { - return 1, true - } - } - case reflect.Int8: - { - int8obj1 := obj1.(int8) - int8obj2 := obj2.(int8) - if int8obj1 > int8obj2 { - return -1, true - } - if int8obj1 == int8obj2 { - return 0, true - } - if int8obj1 < int8obj2 { - return 1, true - } - } - case reflect.Int16: - { - int16obj1 := obj1.(int16) - int16obj2 := obj2.(int16) - if int16obj1 > int16obj2 { - return -1, true - } - if int16obj1 == int16obj2 { - return 0, true - } - if int16obj1 < int16obj2 { - return 1, true - } - } - case reflect.Int32: - { - int32obj1 := obj1.(int32) - int32obj2 := obj2.(int32) - if int32obj1 > int32obj2 { - return -1, true - } - if int32obj1 == int32obj2 { - return 0, true - } - if int32obj1 < int32obj2 { - return 1, true - } - } - case reflect.Int64: - { - int64obj1 := obj1.(int64) - int64obj2 := obj2.(int64) - if int64obj1 > int64obj2 { - return -1, true - } - if int64obj1 == int64obj2 { - return 0, true - } - if int64obj1 < int64obj2 { - return 1, true - } - } - case reflect.Uint: - { - uintobj1 := obj1.(uint) - uintobj2 := obj2.(uint) - if uintobj1 > uintobj2 { - return -1, true - } - if uintobj1 == uintobj2 { - return 0, true - } - if uintobj1 < uintobj2 { - return 1, true - } - } - case reflect.Uint8: - { - uint8obj1 := obj1.(uint8) - uint8obj2 := obj2.(uint8) - if uint8obj1 > uint8obj2 { - return -1, true - } - if uint8obj1 == uint8obj2 { - return 0, true - } - if uint8obj1 < uint8obj2 { - return 1, true - } - } - case reflect.Uint16: - { - uint16obj1 := obj1.(uint16) - uint16obj2 := obj2.(uint16) - if uint16obj1 > uint16obj2 { - return -1, true - } - if uint16obj1 == uint16obj2 { - return 0, true - } - if uint16obj1 < uint16obj2 { - return 1, true - } - } - case reflect.Uint32: - { - uint32obj1 := obj1.(uint32) - uint32obj2 := obj2.(uint32) - if uint32obj1 > uint32obj2 { - return -1, true - } - if uint32obj1 == uint32obj2 { - return 0, true - } - if uint32obj1 < uint32obj2 { - return 1, true - } - } - case reflect.Uint64: - { - uint64obj1 := obj1.(uint64) - uint64obj2 := obj2.(uint64) - if uint64obj1 > uint64obj2 { - return -1, true - } - if uint64obj1 == uint64obj2 { - return 0, true - } - if uint64obj1 < uint64obj2 { - return 1, true - } - } - case reflect.Float32: - { - float32obj1 := obj1.(float32) - float32obj2 := obj2.(float32) - if float32obj1 > float32obj2 { - return -1, true - } - if float32obj1 == float32obj2 { - return 0, true - } - if float32obj1 < float32obj2 { - return 1, true - } - } - case reflect.Float64: - { - float64obj1 := obj1.(float64) - float64obj2 := obj2.(float64) - if float64obj1 > float64obj2 { - return -1, true - } - if float64obj1 == float64obj2 { - return 0, true - } - if float64obj1 < float64obj2 { - return 1, true - } - } - case reflect.String: - { - stringobj1 := obj1.(string) - stringobj2 := obj2.(string) - if stringobj1 > stringobj2 { - return -1, true - } - if stringobj1 == stringobj2 { - return 0, true - } - if stringobj1 < stringobj2 { - return 1, true - } - } - } - - return 0, false -} - -// Greater asserts that the first element is greater than the second -// -// assert.Greater(t, 2, 1) -// assert.Greater(t, float64(2), float64(1)) -// assert.Greater(t, "b", "a") -func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - - e1Kind := reflect.ValueOf(e1).Kind() - e2Kind := reflect.ValueOf(e2).Kind() - if e1Kind != e2Kind { - return Fail(t, "Elements should be the same type", msgAndArgs...) - } - - res, isComparable := compare(e1, e2, e1Kind) - if !isComparable { - return Fail(t, fmt.Sprintf("Can not compare type \"%s\"", reflect.TypeOf(e1)), msgAndArgs...) - } - - if res != -1 { - return Fail(t, fmt.Sprintf("\"%v\" is not greater than \"%v\"", e1, e2), msgAndArgs...) - } - - return true -} - -// GreaterOrEqual asserts that the first element is greater than or equal to the second -// -// assert.GreaterOrEqual(t, 2, 1) -// assert.GreaterOrEqual(t, 2, 2) -// assert.GreaterOrEqual(t, "b", "a") -// assert.GreaterOrEqual(t, "b", "b") -func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - - e1Kind := reflect.ValueOf(e1).Kind() - e2Kind := reflect.ValueOf(e2).Kind() - if e1Kind != e2Kind { - return Fail(t, "Elements should be the same type", msgAndArgs...) - } - - res, isComparable := compare(e1, e2, e1Kind) - if !isComparable { - return Fail(t, fmt.Sprintf("Can not compare type \"%s\"", reflect.TypeOf(e1)), msgAndArgs...) - } - - if res != -1 && res != 0 { - return Fail(t, fmt.Sprintf("\"%v\" is not greater than or equal to \"%v\"", e1, e2), msgAndArgs...) - } - - return true -} - -// Less asserts that the first element is less than the second -// -// assert.Less(t, 1, 2) -// assert.Less(t, float64(1), float64(2)) -// assert.Less(t, "a", "b") -func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - - e1Kind := reflect.ValueOf(e1).Kind() - e2Kind := reflect.ValueOf(e2).Kind() - if e1Kind != e2Kind { - return Fail(t, "Elements should be the same type", msgAndArgs...) - } - - res, isComparable := compare(e1, e2, e1Kind) - if !isComparable { - return Fail(t, fmt.Sprintf("Can not compare type \"%s\"", reflect.TypeOf(e1)), msgAndArgs...) - } - - if res != 1 { - return Fail(t, fmt.Sprintf("\"%v\" is not less than \"%v\"", e1, e2), msgAndArgs...) - } - - return true -} - -// LessOrEqual asserts that the first element is less than or equal to the second -// -// assert.LessOrEqual(t, 1, 2) -// assert.LessOrEqual(t, 2, 2) -// assert.LessOrEqual(t, "a", "b") -// assert.LessOrEqual(t, "b", "b") -func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - - e1Kind := reflect.ValueOf(e1).Kind() - e2Kind := reflect.ValueOf(e2).Kind() - if e1Kind != e2Kind { - return Fail(t, "Elements should be the same type", msgAndArgs...) - } - - res, isComparable := compare(e1, e2, e1Kind) - if !isComparable { - return Fail(t, fmt.Sprintf("Can not compare type \"%s\"", reflect.TypeOf(e1)), msgAndArgs...) - } - - if res != 1 && res != 0 { - return Fail(t, fmt.Sprintf("\"%v\" is not less than or equal to \"%v\"", e1, e2), msgAndArgs...) - } - - return true -} diff --git a/vendor/github.com/stretchr/testify/assert/assertions.go b/vendor/github.com/stretchr/testify/assert/assertions.go index 044da8b01..914a10d83 100644 --- a/vendor/github.com/stretchr/testify/assert/assertions.go +++ b/vendor/github.com/stretchr/testify/assert/assertions.go @@ -11,6 +11,7 @@ import ( "reflect" "regexp" "runtime" + "runtime/debug" "strings" "time" "unicode" @@ -18,10 +19,10 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/pmezard/go-difflib/difflib" - yaml "gopkg.in/yaml.v2" + yaml "gopkg.in/yaml.v3" ) -//go:generate go run ../_codegen/main.go -output-package=assert -template=assertion_format.go.tmpl +//go:generate sh -c "cd ../_codegen && go build && cd - && ../_codegen/_codegen -output-package=assert -template=assertion_format.go.tmpl" // TestingT is an interface wrapper around *testing.T type TestingT interface { @@ -44,7 +45,7 @@ type BoolAssertionFunc func(TestingT, bool, ...interface{}) bool // for table driven tests. type ErrorAssertionFunc func(TestingT, error, ...interface{}) bool -// Comparison a custom function that returns true on success and false on failure +// Comparison is a custom function that returns true on success and false on failure type Comparison func() (success bool) /* @@ -103,11 +104,11 @@ the problem actually occurred in calling code.*/ // failed. func CallerInfo() []string { - pc := uintptr(0) - file := "" - line := 0 - ok := false - name := "" + var pc uintptr + var ok bool + var file string + var line int + var name string callers := []string{} for i := 0; ; i++ { @@ -351,6 +352,19 @@ func Equal(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) } +// validateEqualArgs checks whether provided arguments can be safely used in the +// Equal/NotEqual functions. +func validateEqualArgs(expected, actual interface{}) error { + if expected == nil && actual == nil { + return nil + } + + if isFunction(expected) || isFunction(actual) { + return errors.New("cannot take func type as argument") + } + return nil +} + // Same asserts that two pointers reference the same object. // // assert.Same(t, ptr1, ptr2) @@ -362,18 +376,7 @@ func Same(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) b h.Helper() } - expectedPtr, actualPtr := reflect.ValueOf(expected), reflect.ValueOf(actual) - if expectedPtr.Kind() != reflect.Ptr || actualPtr.Kind() != reflect.Ptr { - return Fail(t, "Invalid operation: both arguments must be pointers", msgAndArgs...) - } - - expectedType, actualType := reflect.TypeOf(expected), reflect.TypeOf(actual) - if expectedType != actualType { - return Fail(t, fmt.Sprintf("Pointer expected to be of type %v, but was %v", - expectedType, actualType), msgAndArgs...) - } - - if expected != actual { + if !samePointers(expected, actual) { return Fail(t, fmt.Sprintf("Not same: \n"+ "expected: %p %#v\n"+ "actual : %p %#v", expected, expected, actual, actual), msgAndArgs...) @@ -382,6 +385,42 @@ func Same(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) b return true } +// NotSame asserts that two pointers do not reference the same object. +// +// assert.NotSame(t, ptr1, ptr2) +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func NotSame(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + if samePointers(expected, actual) { + return Fail(t, fmt.Sprintf( + "Expected and actual point to the same object: %p %#v", + expected, expected), msgAndArgs...) + } + return true +} + +// samePointers compares two generic interface objects and returns whether +// they point to the same object +func samePointers(first, second interface{}) bool { + firstPtr, secondPtr := reflect.ValueOf(first), reflect.ValueOf(second) + if firstPtr.Kind() != reflect.Ptr || secondPtr.Kind() != reflect.Ptr { + return false + } + + firstType, secondType := reflect.TypeOf(first), reflect.TypeOf(second) + if firstType != secondType { + return false + } + + // compare pointer addresses + return first == second +} + // formatUnequalValues takes two values of arbitrary types and returns string // representations appropriate to be presented to the user. // @@ -390,12 +429,27 @@ func Same(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) b // to a type conversion in the Go grammar. func formatUnequalValues(expected, actual interface{}) (e string, a string) { if reflect.TypeOf(expected) != reflect.TypeOf(actual) { - return fmt.Sprintf("%T(%#v)", expected, expected), - fmt.Sprintf("%T(%#v)", actual, actual) + return fmt.Sprintf("%T(%s)", expected, truncatingFormat(expected)), + fmt.Sprintf("%T(%s)", actual, truncatingFormat(actual)) + } + switch expected.(type) { + case time.Duration: + return fmt.Sprintf("%v", expected), fmt.Sprintf("%v", actual) } + return truncatingFormat(expected), truncatingFormat(actual) +} - return fmt.Sprintf("%#v", expected), - fmt.Sprintf("%#v", actual) +// truncatingFormat formats the data and truncates it if it's too long. +// +// This helps keep formatted error messages lines from exceeding the +// bufio.MaxScanTokenSize max line length that the go testing framework imposes. +func truncatingFormat(data interface{}) string { + value := fmt.Sprintf("%#v", data) + max := bufio.MaxScanTokenSize - 100 // Give us some space the type info too if needed. + if len(value) > max { + value = value[0:max] + "<... truncated>" + } + return value } // EqualValues asserts that two objects are equal or convertable to the same types @@ -442,12 +496,12 @@ func Exactly(t TestingT, expected, actual interface{}, msgAndArgs ...interface{} // // assert.NotNil(t, err) func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } if !isNil(object) { return true } + if h, ok := t.(tHelper); ok { + h.Helper() + } return Fail(t, "Expected value not to be nil.", msgAndArgs...) } @@ -488,12 +542,12 @@ func isNil(object interface{}) bool { // // assert.Nil(t, err) func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } if isNil(object) { return true } + if h, ok := t.(tHelper); ok { + h.Helper() + } return Fail(t, fmt.Sprintf("Expected nil, but got: %#v", object), msgAndArgs...) } @@ -530,12 +584,11 @@ func isEmpty(object interface{}) bool { // // assert.Empty(t, obj) func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - pass := isEmpty(object) if !pass { + if h, ok := t.(tHelper); ok { + h.Helper() + } Fail(t, fmt.Sprintf("Should be empty, but was %v", object), msgAndArgs...) } @@ -550,12 +603,11 @@ func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { // assert.Equal(t, "two", obj[1]) // } func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - pass := !isEmpty(object) if !pass { + if h, ok := t.(tHelper); ok { + h.Helper() + } Fail(t, fmt.Sprintf("Should NOT be empty, but was %v", object), msgAndArgs...) } @@ -598,16 +650,10 @@ func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) // // assert.True(t, myBool) func True(t TestingT, value bool, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - if h, ok := t.(interface { - Helper() - }); ok { - h.Helper() - } - - if value != true { + if !value { + if h, ok := t.(tHelper); ok { + h.Helper() + } return Fail(t, "Should be true", msgAndArgs...) } @@ -619,11 +665,10 @@ func True(t TestingT, value bool, msgAndArgs ...interface{}) bool { // // assert.False(t, myBool) func False(t TestingT, value bool, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - - if value != false { + if value { + if h, ok := t.(tHelper); ok { + h.Helper() + } return Fail(t, "Should be false", msgAndArgs...) } @@ -654,6 +699,21 @@ func NotEqual(t TestingT, expected, actual interface{}, msgAndArgs ...interface{ } +// NotEqualValues asserts that two objects are not equal even when converted to the same type +// +// assert.NotEqualValues(t, obj1, obj2) +func NotEqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + if ObjectsAreEqualValues(expected, actual) { + return Fail(t, fmt.Sprintf("Should not be: %#v\n", actual), msgAndArgs...) + } + + return true +} + // containsElement try loop over the list check if the list includes the element. // return (false, false) if impossible. // return (true, false) if element was not found. @@ -706,10 +766,10 @@ func Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bo ok, found := includeElement(s, contains) if !ok { - return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", s), msgAndArgs...) + return Fail(t, fmt.Sprintf("%#v could not be applied builtin len()", s), msgAndArgs...) } if !found { - return Fail(t, fmt.Sprintf("\"%s\" does not contain \"%s\"", s, contains), msgAndArgs...) + return Fail(t, fmt.Sprintf("%#v does not contain %#v", s, contains), msgAndArgs...) } return true @@ -840,27 +900,39 @@ func ElementsMatch(t TestingT, listA, listB interface{}, msgAndArgs ...interface return true } - aKind := reflect.TypeOf(listA).Kind() - bKind := reflect.TypeOf(listB).Kind() + if !isList(t, listA, msgAndArgs...) || !isList(t, listB, msgAndArgs...) { + return false + } + + extraA, extraB := diffLists(listA, listB) - if aKind != reflect.Array && aKind != reflect.Slice { - return Fail(t, fmt.Sprintf("%q has an unsupported type %s", listA, aKind), msgAndArgs...) + if len(extraA) == 0 && len(extraB) == 0 { + return true } - if bKind != reflect.Array && bKind != reflect.Slice { - return Fail(t, fmt.Sprintf("%q has an unsupported type %s", listB, bKind), msgAndArgs...) + return Fail(t, formatListDiff(listA, listB, extraA, extraB), msgAndArgs...) +} + +// isList checks that the provided value is array or slice. +func isList(t TestingT, list interface{}, msgAndArgs ...interface{}) (ok bool) { + kind := reflect.TypeOf(list).Kind() + if kind != reflect.Array && kind != reflect.Slice { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s, expecting array or slice", list, kind), + msgAndArgs...) } + return true +} +// diffLists diffs two arrays/slices and returns slices of elements that are only in A and only in B. +// If some element is present multiple times, each instance is counted separately (e.g. if something is 2x in A and +// 5x in B, it will be 0x in extraA and 3x in extraB). The order of items in both lists is ignored. +func diffLists(listA, listB interface{}) (extraA, extraB []interface{}) { aValue := reflect.ValueOf(listA) bValue := reflect.ValueOf(listB) aLen := aValue.Len() bLen := bValue.Len() - if aLen != bLen { - return Fail(t, fmt.Sprintf("lengths don't match: %d != %d", aLen, bLen), msgAndArgs...) - } - // Mark indexes in bValue that we already used visited := make([]bool, bLen) for i := 0; i < aLen; i++ { @@ -877,11 +949,38 @@ func ElementsMatch(t TestingT, listA, listB interface{}, msgAndArgs ...interface } } if !found { - return Fail(t, fmt.Sprintf("element %s appears more times in %s than in %s", element, aValue, bValue), msgAndArgs...) + extraA = append(extraA, element) } } - return true + for j := 0; j < bLen; j++ { + if visited[j] { + continue + } + extraB = append(extraB, bValue.Index(j).Interface()) + } + + return +} + +func formatListDiff(listA, listB interface{}, extraA, extraB []interface{}) string { + var msg bytes.Buffer + + msg.WriteString("elements differ") + if len(extraA) > 0 { + msg.WriteString("\n\nextra elements in list A:\n") + msg.WriteString(spewConfig.Sdump(extraA)) + } + if len(extraB) > 0 { + msg.WriteString("\n\nextra elements in list B:\n") + msg.WriteString(spewConfig.Sdump(extraB)) + } + msg.WriteString("\n\nlistA:\n") + msg.WriteString(spewConfig.Sdump(listA)) + msg.WriteString("\n\nlistB:\n") + msg.WriteString(spewConfig.Sdump(listB)) + + return msg.String() } // Condition uses a Comparison to assert a complex condition. @@ -901,15 +1000,17 @@ func Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool { type PanicTestFunc func() // didPanic returns true if the function passed to it panics. Otherwise, it returns false. -func didPanic(f PanicTestFunc) (bool, interface{}) { +func didPanic(f PanicTestFunc) (bool, interface{}, string) { didPanic := false var message interface{} + var stack string func() { defer func() { if message = recover(); message != nil { didPanic = true + stack = string(debug.Stack()) } }() @@ -918,7 +1019,7 @@ func didPanic(f PanicTestFunc) (bool, interface{}) { }() - return didPanic, message + return didPanic, message, stack } @@ -930,7 +1031,7 @@ func Panics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { h.Helper() } - if funcDidPanic, panicValue := didPanic(f); !funcDidPanic { + if funcDidPanic, panicValue, _ := didPanic(f); !funcDidPanic { return Fail(t, fmt.Sprintf("func %#v should panic\n\tPanic value:\t%#v", f, panicValue), msgAndArgs...) } @@ -946,12 +1047,34 @@ func PanicsWithValue(t TestingT, expected interface{}, f PanicTestFunc, msgAndAr h.Helper() } - funcDidPanic, panicValue := didPanic(f) + funcDidPanic, panicValue, panickedStack := didPanic(f) if !funcDidPanic { return Fail(t, fmt.Sprintf("func %#v should panic\n\tPanic value:\t%#v", f, panicValue), msgAndArgs...) } if panicValue != expected { - return Fail(t, fmt.Sprintf("func %#v should panic with value:\t%#v\n\tPanic value:\t%#v", f, expected, panicValue), msgAndArgs...) + return Fail(t, fmt.Sprintf("func %#v should panic with value:\t%#v\n\tPanic value:\t%#v\n\tPanic stack:\t%s", f, expected, panicValue, panickedStack), msgAndArgs...) + } + + return true +} + +// PanicsWithError asserts that the code inside the specified PanicTestFunc +// panics, and that the recovered panic value is an error that satisfies the +// EqualError comparison. +// +// assert.PanicsWithError(t, "crazy error", func(){ GoCrazy() }) +func PanicsWithError(t TestingT, errString string, f PanicTestFunc, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + funcDidPanic, panicValue, panickedStack := didPanic(f) + if !funcDidPanic { + return Fail(t, fmt.Sprintf("func %#v should panic\n\tPanic value:\t%#v", f, panicValue), msgAndArgs...) + } + panicErr, ok := panicValue.(error) + if !ok || panicErr.Error() != errString { + return Fail(t, fmt.Sprintf("func %#v should panic with error message:\t%#v\n\tPanic value:\t%#v\n\tPanic stack:\t%s", f, errString, panicValue, panickedStack), msgAndArgs...) } return true @@ -965,8 +1088,8 @@ func NotPanics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { h.Helper() } - if funcDidPanic, panicValue := didPanic(f); funcDidPanic { - return Fail(t, fmt.Sprintf("func %#v should not panic\n\tPanic value:\t%v", f, panicValue), msgAndArgs...) + if funcDidPanic, panicValue, panickedStack := didPanic(f); funcDidPanic { + return Fail(t, fmt.Sprintf("func %#v should not panic\n\tPanic value:\t%v\n\tPanic stack:\t%s", f, panicValue, panickedStack), msgAndArgs...) } return true @@ -993,6 +1116,8 @@ func toFloat(x interface{}) (float64, bool) { xok := true switch xn := x.(type) { + case uint: + xf = float64(xn) case uint8: xf = float64(xn) case uint16: @@ -1014,7 +1139,7 @@ func toFloat(x interface{}) (float64, bool) { case float32: xf = float64(xn) case float64: - xf = float64(xn) + xf = xn case time.Duration: xf = float64(xn) default: @@ -1026,7 +1151,7 @@ func toFloat(x interface{}) (float64, bool) { // InDelta asserts that the two numerals are within delta of each other. // -// assert.InDelta(t, math.Pi, (22 / 7.0), 0.01) +// assert.InDelta(t, math.Pi, 22/7.0, 0.01) func InDelta(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -1128,6 +1253,9 @@ func calcRelativeError(expected, actual interface{}) (float64, error) { if !aok { return 0, fmt.Errorf("expected value %q cannot be converted to float", expected) } + if math.IsNaN(af) { + return 0, errors.New("expected value must not be NaN") + } if af == 0 { return 0, fmt.Errorf("expected value must have a value other than zero to calculate the relative error") } @@ -1135,6 +1263,9 @@ func calcRelativeError(expected, actual interface{}) (float64, error) { if !bok { return 0, fmt.Errorf("actual value %q cannot be converted to float", actual) } + if math.IsNaN(bf) { + return 0, errors.New("actual value must not be NaN") + } return math.Abs(af-bf) / math.Abs(af), nil } @@ -1144,6 +1275,9 @@ func InEpsilon(t TestingT, expected, actual interface{}, epsilon float64, msgAnd if h, ok := t.(tHelper); ok { h.Helper() } + if math.IsNaN(epsilon) { + return Fail(t, "epsilon must not be NaN") + } actualEpsilon, err := calcRelativeError(expected, actual) if err != nil { return Fail(t, err.Error(), msgAndArgs...) @@ -1191,10 +1325,10 @@ func InEpsilonSlice(t TestingT, expected, actual interface{}, epsilon float64, m // assert.Equal(t, expectedObj, actualObj) // } func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } if err != nil { + if h, ok := t.(tHelper); ok { + h.Helper() + } return Fail(t, fmt.Sprintf("Received unexpected error:\n%+v", err), msgAndArgs...) } @@ -1208,11 +1342,10 @@ func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool { // assert.Equal(t, expectedError, err) // } func Error(t TestingT, err error, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - if err == nil { + if h, ok := t.(tHelper); ok { + h.Helper() + } return Fail(t, "An error is expected but got nil.", msgAndArgs...) } @@ -1314,7 +1447,8 @@ func NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool { return true } -// FileExists checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. +// FileExists checks whether a file exists in the given path. It also fails if +// the path points to a directory or there is an error when trying to check the file. func FileExists(t TestingT, path string, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -1332,7 +1466,24 @@ func FileExists(t TestingT, path string, msgAndArgs ...interface{}) bool { return true } -// DirExists checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. +// NoFileExists checks whether a file does not exist in a given path. It fails +// if the path points to an existing _file_ only. +func NoFileExists(t TestingT, path string, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + info, err := os.Lstat(path) + if err != nil { + return true + } + if info.IsDir() { + return true + } + return Fail(t, fmt.Sprintf("file %q exists", path), msgAndArgs...) +} + +// DirExists checks whether a directory exists in the given path. It also fails +// if the path is a file rather a directory or there is an error checking whether it exists. func DirExists(t TestingT, path string, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -1350,6 +1501,25 @@ func DirExists(t TestingT, path string, msgAndArgs ...interface{}) bool { return true } +// NoDirExists checks whether a directory does not exist in the given path. +// It fails if the path points to an existing _directory_ only. +func NoDirExists(t TestingT, path string, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + info, err := os.Lstat(path) + if err != nil { + if os.IsNotExist(err) { + return true + } + return true + } + if !info.IsDir() { + return true + } + return Fail(t, fmt.Sprintf("directory %q exists", path), msgAndArgs...) +} + // JSONEq asserts that two JSON strings are equivalent. // // assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) @@ -1439,15 +1609,6 @@ func diff(expected interface{}, actual interface{}) string { return "\n\nDiff:\n" + diff } -// validateEqualArgs checks whether provided arguments can be safely used in the -// Equal/NotEqual functions. -func validateEqualArgs(expected, actual interface{}) error { - if isFunction(expected) || isFunction(actual) { - return errors.New("cannot take func type as argument") - } - return nil -} - func isFunction(arg interface{}) bool { if arg == nil { return false @@ -1460,6 +1621,7 @@ var spewConfig = spew.ConfigState{ DisablePointerAddresses: true, DisableCapacities: true, SortKeys: true, + DisableMethods: true, } type tHelper interface { @@ -1475,24 +1637,59 @@ func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick t h.Helper() } + ch := make(chan bool, 1) + timer := time.NewTimer(waitFor) - ticker := time.NewTicker(tick) - checkPassed := make(chan bool) defer timer.Stop() + + ticker := time.NewTicker(tick) defer ticker.Stop() - defer close(checkPassed) - for { + + for tick := ticker.C; ; { select { case <-timer.C: return Fail(t, "Condition never satisfied", msgAndArgs...) - case result := <-checkPassed: - if result { + case <-tick: + tick = nil + go func() { ch <- condition() }() + case v := <-ch: + if v { return true } - case <-ticker.C: - go func() { - checkPassed <- condition() - }() + tick = ticker.C + } + } +} + +// Never asserts that the given condition doesn't satisfy in waitFor time, +// periodically checking the target function each tick. +// +// assert.Never(t, func() bool { return false; }, time.Second, 10*time.Millisecond) +func Never(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + ch := make(chan bool, 1) + + timer := time.NewTimer(waitFor) + defer timer.Stop() + + ticker := time.NewTicker(tick) + defer ticker.Stop() + + for tick := ticker.C; ; { + select { + case <-timer.C: + return true + case <-tick: + tick = nil + go func() { ch <- condition() }() + case v := <-ch: + if v { + return Fail(t, "Condition satisfied", msgAndArgs...) + } + tick = ticker.C } } } diff --git a/vendor/github.com/stretchr/testify/assert/forward_assertions.go b/vendor/github.com/stretchr/testify/assert/forward_assertions.go index 9ad56851d..df189d234 100644 --- a/vendor/github.com/stretchr/testify/assert/forward_assertions.go +++ b/vendor/github.com/stretchr/testify/assert/forward_assertions.go @@ -13,4 +13,4 @@ func New(t TestingT) *Assertions { } } -//go:generate go run ../_codegen/main.go -output-package=assert -template=assertion_forward.go.tmpl -include-format-funcs +//go:generate sh -c "cd ../_codegen && go build && cd - && ../_codegen/_codegen -output-package=assert -template=assertion_forward.go.tmpl -include-format-funcs" diff --git a/vendor/github.com/stretchr/testify/assert/http_assertions.go b/vendor/github.com/stretchr/testify/assert/http_assertions.go index df46fa777..30ef7cc06 100644 --- a/vendor/github.com/stretchr/testify/assert/http_assertions.go +++ b/vendor/github.com/stretchr/testify/assert/http_assertions.go @@ -2,6 +2,7 @@ package assert import ( "fmt" + "io" "net/http" "net/http/httptest" "net/url" @@ -33,7 +34,6 @@ func HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, value code, err := httpCode(handler, method, url, values) if err != nil { Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) - return false } isSuccessCode := code >= http.StatusOK && code <= http.StatusPartialContent @@ -56,7 +56,6 @@ func HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, valu code, err := httpCode(handler, method, url, values) if err != nil { Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) - return false } isRedirectCode := code >= http.StatusMultipleChoices && code <= http.StatusTemporaryRedirect @@ -79,7 +78,6 @@ func HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values code, err := httpCode(handler, method, url, values) if err != nil { Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) - return false } isErrorCode := code >= http.StatusBadRequest @@ -90,11 +88,37 @@ func HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values return isErrorCode } +// HTTPStatusCode asserts that a specified handler returns a specified status code. +// +// assert.HTTPStatusCode(t, myHandler, "GET", "/notImplemented", nil, 501) +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPStatusCode(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + code, err := httpCode(handler, method, url, values) + if err != nil { + Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) + } + + successful := code == statuscode + if !successful { + Fail(t, fmt.Sprintf("Expected HTTP status code %d for %q but received %d", statuscode, url+"?"+values.Encode(), code)) + } + + return successful +} + // HTTPBody is a helper that returns HTTP body of the response. It returns // empty string if building a new request fails. -func HTTPBody(handler http.HandlerFunc, method, url string, values url.Values) string { +func HTTPBody(handler http.HandlerFunc, method, url string, values url.Values, body io.Reader) string { w := httptest.NewRecorder() - req, err := http.NewRequest(method, url+"?"+values.Encode(), nil) + + if values != nil { + url = url + "?" + values.Encode() + } + req, err := http.NewRequest(method, url, body) if err != nil { return "" } @@ -108,13 +132,13 @@ func HTTPBody(handler http.HandlerFunc, method, url string, values url.Values) s // assert.HTTPBodyContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") // // Returns whether the assertion was successful (true) or not (false). -func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { +func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, body io.Reader, str interface{}, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() } - body := HTTPBody(handler, method, url, values) + httpBody := HTTPBody(handler, method, url, values, body) - contains := strings.Contains(body, fmt.Sprint(str)) + contains := strings.Contains(httpBody, fmt.Sprint(str)) if !contains { Fail(t, fmt.Sprintf("Expected response body for \"%s\" to contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body)) } @@ -128,13 +152,13 @@ func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method, url string, // assert.HTTPBodyNotContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") // // Returns whether the assertion was successful (true) or not (false). -func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { +func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, body io.Reader, str interface{}, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() } - body := HTTPBody(handler, method, url, values) + httpBody := HTTPBody(handler, method, url, values, body) - contains := strings.Contains(body, fmt.Sprint(str)) + contains := strings.Contains(httpBody, fmt.Sprint(str)) if contains { Fail(t, fmt.Sprintf("Expected response body for \"%s\" to NOT contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body)) } diff --git a/vendor/github.com/ulikunitz/xz/example.go b/vendor/github.com/ulikunitz/xz/example.go deleted file mode 100644 index 855e60aee..000000000 --- a/vendor/github.com/ulikunitz/xz/example.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2014-2017 Ulrich Kunitz. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "bytes" - "io" - "log" - "os" - - "github.com/ulikunitz/xz" -) - -func main() { - const text = "The quick brown fox jumps over the lazy dog.\n" - var buf bytes.Buffer - // compress text - w, err := xz.NewWriter(&buf) - if err != nil { - log.Fatalf("xz.NewWriter error %s", err) - } - if _, err := io.WriteString(w, text); err != nil { - log.Fatalf("WriteString error %s", err) - } - if err := w.Close(); err != nil { - log.Fatalf("w.Close error %s", err) - } - // decompress buffer and write output to stdout - r, err := xz.NewReader(&buf) - if err != nil { - log.Fatalf("NewReader error %s", err) - } - if _, err = io.Copy(os.Stdout, r); err != nil { - log.Fatalf("io.Copy error %s", err) - } -} diff --git a/vendor/github.com/ulikunitz/xz/make-docs b/vendor/github.com/ulikunitz/xz/make-docs old mode 100755 new mode 100644 diff --git a/vendor/github.com/xanzy/ssh-agent/go.mod b/vendor/github.com/xanzy/ssh-agent/go.mod new file mode 100644 index 000000000..6664c4888 --- /dev/null +++ b/vendor/github.com/xanzy/ssh-agent/go.mod @@ -0,0 +1,6 @@ +module github.com/xanzy/ssh-agent + +require ( + golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2 + golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0 // indirect +) diff --git a/vendor/github.com/xanzy/ssh-agent/go.sum b/vendor/github.com/xanzy/ssh-agent/go.sum new file mode 100644 index 000000000..a9a001692 --- /dev/null +++ b/vendor/github.com/xanzy/ssh-agent/go.sum @@ -0,0 +1,4 @@ +golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2 h1:NwxKRvbkH5MsNkvOtPZi3/3kmI8CAzs3mtv+GLQMkNo= +golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0 h1:bzeyCHgoAyjZjAhvTpks+qM7sdlh4cCSitmXeCEO3B4= +golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/vendor/go.opencensus.io/.gitignore b/vendor/go.opencensus.io/.gitignore new file mode 100644 index 000000000..74a6db472 --- /dev/null +++ b/vendor/go.opencensus.io/.gitignore @@ -0,0 +1,9 @@ +/.idea/ + +# go.opencensus.io/exporter/aws +/exporter/aws/ + +# Exclude vendor, use dep ensure after checkout: +/vendor/github.com/ +/vendor/golang.org/ +/vendor/google.golang.org/ diff --git a/vendor/go.opencensus.io/.travis.yml b/vendor/go.opencensus.io/.travis.yml new file mode 100644 index 000000000..bd6b66ee8 --- /dev/null +++ b/vendor/go.opencensus.io/.travis.yml @@ -0,0 +1,17 @@ +language: go + +go_import_path: go.opencensus.io + +go: + - 1.11.x + +env: + global: + GO111MODULE=on + +before_script: + - make install-tools + +script: + - make travis-ci + - go run internal/check/version.go # TODO move this to makefile diff --git a/vendor/go.opencensus.io/CONTRIBUTING.md b/vendor/go.opencensus.io/CONTRIBUTING.md new file mode 100644 index 000000000..1ba3962c8 --- /dev/null +++ b/vendor/go.opencensus.io/CONTRIBUTING.md @@ -0,0 +1,63 @@ +# How to contribute + +We'd love to accept your patches and contributions to this project. There are +just a few small guidelines you need to follow. + +## Contributor License Agreement + +Contributions to this project must be accompanied by a Contributor License +Agreement. You (or your employer) retain the copyright to your contribution, +this simply gives us permission to use and redistribute your contributions as +part of the project. Head over to to see +your current agreements on file or to sign a new one. + +You generally only need to submit a CLA once, so if you've already submitted one +(even if it was for a different project), you probably don't need to do it +again. + +## Code reviews + +All submissions, including submissions by project members, require review. We +use GitHub pull requests for this purpose. Consult [GitHub Help] for more +information on using pull requests. + +[GitHub Help]: https://help.github.com/articles/about-pull-requests/ + +## Instructions + +Fork the repo, checkout the upstream repo to your GOPATH by: + +``` +$ go get -d go.opencensus.io +``` + +Add your fork as an origin: + +``` +cd $(go env GOPATH)/src/go.opencensus.io +git remote add fork git@github.com:YOUR_GITHUB_USERNAME/opencensus-go.git +``` + +Run tests: + +``` +$ make install-tools # Only first time. +$ make +``` + +Checkout a new branch, make modifications and push the branch to your fork: + +``` +$ git checkout -b feature +# edit files +$ git commit +$ git push fork feature +``` + +Open a pull request against the main opencensus-go repo. + +## General Notes +This project uses Appveyor and Travis for CI. + +The dependencies are managed with `go mod` if you work with the sources under your +`$GOPATH` you need to set the environment variable `GO111MODULE=on`. \ No newline at end of file diff --git a/vendor/go.opencensus.io/Makefile b/vendor/go.opencensus.io/Makefile new file mode 100644 index 000000000..457866cb1 --- /dev/null +++ b/vendor/go.opencensus.io/Makefile @@ -0,0 +1,96 @@ +# TODO: Fix this on windows. +ALL_SRC := $(shell find . -name '*.go' \ + -not -path './vendor/*' \ + -not -path '*/gen-go/*' \ + -type f | sort) +ALL_PKGS := $(shell go list $(sort $(dir $(ALL_SRC)))) + +GOTEST_OPT?=-v -race -timeout 30s +GOTEST_OPT_WITH_COVERAGE = $(GOTEST_OPT) -coverprofile=coverage.txt -covermode=atomic +GOTEST=go test +GOFMT=gofmt +GOLINT=golint +GOVET=go vet +EMBEDMD=embedmd +# TODO decide if we need to change these names. +TRACE_ID_LINT_EXCEPTION="type name will be used as trace.TraceID by other packages" +TRACE_OPTION_LINT_EXCEPTION="type name will be used as trace.TraceOptions by other packages" +README_FILES := $(shell find . -name '*README.md' | sort | tr '\n' ' ') + +.DEFAULT_GOAL := fmt-lint-vet-embedmd-test + +.PHONY: fmt-lint-vet-embedmd-test +fmt-lint-vet-embedmd-test: fmt lint vet embedmd test + +# TODO enable test-with-coverage in tavis +.PHONY: travis-ci +travis-ci: fmt lint vet embedmd test test-386 + +all-pkgs: + @echo $(ALL_PKGS) | tr ' ' '\n' | sort + +all-srcs: + @echo $(ALL_SRC) | tr ' ' '\n' | sort + +.PHONY: test +test: + $(GOTEST) $(GOTEST_OPT) $(ALL_PKGS) + +.PHONY: test-386 +test-386: + GOARCH=386 $(GOTEST) -v -timeout 30s $(ALL_PKGS) + +.PHONY: test-with-coverage +test-with-coverage: + $(GOTEST) $(GOTEST_OPT_WITH_COVERAGE) $(ALL_PKGS) + +.PHONY: fmt +fmt: + @FMTOUT=`$(GOFMT) -s -l $(ALL_SRC) 2>&1`; \ + if [ "$$FMTOUT" ]; then \ + echo "$(GOFMT) FAILED => gofmt the following files:\n"; \ + echo "$$FMTOUT\n"; \ + exit 1; \ + else \ + echo "Fmt finished successfully"; \ + fi + +.PHONY: lint +lint: + @LINTOUT=`$(GOLINT) $(ALL_PKGS) | grep -v $(TRACE_ID_LINT_EXCEPTION) | grep -v $(TRACE_OPTION_LINT_EXCEPTION) 2>&1`; \ + if [ "$$LINTOUT" ]; then \ + echo "$(GOLINT) FAILED => clean the following lint errors:\n"; \ + echo "$$LINTOUT\n"; \ + exit 1; \ + else \ + echo "Lint finished successfully"; \ + fi + +.PHONY: vet +vet: + # TODO: Understand why go vet downloads "github.com/google/go-cmp v0.2.0" + @VETOUT=`$(GOVET) ./... | grep -v "go: downloading" 2>&1`; \ + if [ "$$VETOUT" ]; then \ + echo "$(GOVET) FAILED => go vet the following files:\n"; \ + echo "$$VETOUT\n"; \ + exit 1; \ + else \ + echo "Vet finished successfully"; \ + fi + +.PHONY: embedmd +embedmd: + @EMBEDMDOUT=`$(EMBEDMD) -d $(README_FILES) 2>&1`; \ + if [ "$$EMBEDMDOUT" ]; then \ + echo "$(EMBEDMD) FAILED => embedmd the following files:\n"; \ + echo "$$EMBEDMDOUT\n"; \ + exit 1; \ + else \ + echo "Embedmd finished successfully"; \ + fi + +.PHONY: install-tools +install-tools: + go get -u golang.org/x/tools/cmd/cover + go get -u golang.org/x/lint/golint + go get -u github.com/rakyll/embedmd diff --git a/vendor/go.opencensus.io/README.md b/vendor/go.opencensus.io/README.md new file mode 100644 index 000000000..1d7e83711 --- /dev/null +++ b/vendor/go.opencensus.io/README.md @@ -0,0 +1,267 @@ +# OpenCensus Libraries for Go + +[![Build Status][travis-image]][travis-url] +[![Windows Build Status][appveyor-image]][appveyor-url] +[![GoDoc][godoc-image]][godoc-url] +[![Gitter chat][gitter-image]][gitter-url] + +OpenCensus Go is a Go implementation of OpenCensus, a toolkit for +collecting application performance and behavior monitoring data. +Currently it consists of three major components: tags, stats and tracing. + +#### OpenCensus and OpenTracing have merged to form OpenTelemetry, which serves as the next major version of OpenCensus and OpenTracing. OpenTelemetry will offer backwards compatibility with existing OpenCensus integrations, and we will continue to make security patches to existing OpenCensus libraries for two years. Read more about the merger [here](https://medium.com/opentracing/a-roadmap-to-convergence-b074e5815289). + +## Installation + +``` +$ go get -u go.opencensus.io +``` + +The API of this project is still evolving, see: [Deprecation Policy](#deprecation-policy). +The use of vendoring or a dependency management tool is recommended. + +## Prerequisites + +OpenCensus Go libraries require Go 1.8 or later. + +## Getting Started + +The easiest way to get started using OpenCensus in your application is to use an existing +integration with your RPC framework: + +* [net/http](https://godoc.org/go.opencensus.io/plugin/ochttp) +* [gRPC](https://godoc.org/go.opencensus.io/plugin/ocgrpc) +* [database/sql](https://godoc.org/github.com/opencensus-integrations/ocsql) +* [Go kit](https://godoc.org/github.com/go-kit/kit/tracing/opencensus) +* [Groupcache](https://godoc.org/github.com/orijtech/groupcache) +* [Caddy webserver](https://godoc.org/github.com/orijtech/caddy) +* [MongoDB](https://godoc.org/github.com/orijtech/mongo-go-driver) +* [Redis gomodule/redigo](https://godoc.org/github.com/orijtech/redigo) +* [Redis goredis/redis](https://godoc.org/github.com/orijtech/redis) +* [Memcache](https://godoc.org/github.com/orijtech/gomemcache) + +If you're using a framework not listed here, you could either implement your own middleware for your +framework or use [custom stats](#stats) and [spans](#spans) directly in your application. + +## Exporters + +OpenCensus can export instrumentation data to various backends. +OpenCensus has exporter implementations for the following, users +can implement their own exporters by implementing the exporter interfaces +([stats](https://godoc.org/go.opencensus.io/stats/view#Exporter), +[trace](https://godoc.org/go.opencensus.io/trace#Exporter)): + +* [Prometheus][exporter-prom] for stats +* [OpenZipkin][exporter-zipkin] for traces +* [Stackdriver][exporter-stackdriver] Monitoring for stats and Trace for traces +* [Jaeger][exporter-jaeger] for traces +* [AWS X-Ray][exporter-xray] for traces +* [Datadog][exporter-datadog] for stats and traces +* [Graphite][exporter-graphite] for stats +* [Honeycomb][exporter-honeycomb] for traces +* [New Relic][exporter-newrelic] for stats and traces + +## Overview + +![OpenCensus Overview](https://i.imgur.com/cf4ElHE.jpg) + +In a microservices environment, a user request may go through +multiple services until there is a response. OpenCensus allows +you to instrument your services and collect diagnostics data all +through your services end-to-end. + +## Tags + +Tags represent propagated key-value pairs. They are propagated using `context.Context` +in the same process or can be encoded to be transmitted on the wire. Usually, this will +be handled by an integration plugin, e.g. `ocgrpc.ServerHandler` and `ocgrpc.ClientHandler` +for gRPC. + +Package `tag` allows adding or modifying tags in the current context. + +[embedmd]:# (internal/readme/tags.go new) +```go +ctx, err := tag.New(ctx, + tag.Insert(osKey, "macOS-10.12.5"), + tag.Upsert(userIDKey, "cde36753ed"), +) +if err != nil { + log.Fatal(err) +} +``` + +## Stats + +OpenCensus is a low-overhead framework even if instrumentation is always enabled. +In order to be so, it is optimized to make recording of data points fast +and separate from the data aggregation. + +OpenCensus stats collection happens in two stages: + +* Definition of measures and recording of data points +* Definition of views and aggregation of the recorded data + +### Recording + +Measurements are data points associated with a measure. +Recording implicitly tags the set of Measurements with the tags from the +provided context: + +[embedmd]:# (internal/readme/stats.go record) +```go +stats.Record(ctx, videoSize.M(102478)) +``` + +### Views + +Views are how Measures are aggregated. You can think of them as queries over the +set of recorded data points (measurements). + +Views have two parts: the tags to group by and the aggregation type used. + +Currently three types of aggregations are supported: +* CountAggregation is used to count the number of times a sample was recorded. +* DistributionAggregation is used to provide a histogram of the values of the samples. +* SumAggregation is used to sum up all sample values. + +[embedmd]:# (internal/readme/stats.go aggs) +```go +distAgg := view.Distribution(1<<32, 2<<32, 3<<32) +countAgg := view.Count() +sumAgg := view.Sum() +``` + +Here we create a view with the DistributionAggregation over our measure. + +[embedmd]:# (internal/readme/stats.go view) +```go +if err := view.Register(&view.View{ + Name: "example.com/video_size_distribution", + Description: "distribution of processed video size over time", + Measure: videoSize, + Aggregation: view.Distribution(1<<32, 2<<32, 3<<32), +}); err != nil { + log.Fatalf("Failed to register view: %v", err) +} +``` + +Register begins collecting data for the view. Registered views' data will be +exported via the registered exporters. + +## Traces + +A distributed trace tracks the progression of a single user request as +it is handled by the services and processes that make up an application. +Each step is called a span in the trace. Spans include metadata about the step, +including especially the time spent in the step, called the span’s latency. + +Below you see a trace and several spans underneath it. + +![Traces and spans](https://i.imgur.com/7hZwRVj.png) + +### Spans + +Span is the unit step in a trace. Each span has a name, latency, status and +additional metadata. + +Below we are starting a span for a cache read and ending it +when we are done: + +[embedmd]:# (internal/readme/trace.go startend) +```go +ctx, span := trace.StartSpan(ctx, "cache.Get") +defer span.End() + +// Do work to get from cache. +``` + +### Propagation + +Spans can have parents or can be root spans if they don't have any parents. +The current span is propagated in-process and across the network to allow associating +new child spans with the parent. + +In the same process, `context.Context` is used to propagate spans. +`trace.StartSpan` creates a new span as a root if the current context +doesn't contain a span. Or, it creates a child of the span that is +already in current context. The returned context can be used to keep +propagating the newly created span in the current context. + +[embedmd]:# (internal/readme/trace.go startend) +```go +ctx, span := trace.StartSpan(ctx, "cache.Get") +defer span.End() + +// Do work to get from cache. +``` + +Across the network, OpenCensus provides different propagation +methods for different protocols. + +* gRPC integrations use the OpenCensus' [binary propagation format](https://godoc.org/go.opencensus.io/trace/propagation). +* HTTP integrations use Zipkin's [B3](https://github.com/openzipkin/b3-propagation) + by default but can be configured to use a custom propagation method by setting another + [propagation.HTTPFormat](https://godoc.org/go.opencensus.io/trace/propagation#HTTPFormat). + +## Execution Tracer + +With Go 1.11, OpenCensus Go will support integration with the Go execution tracer. +See [Debugging Latency in Go](https://medium.com/observability/debugging-latency-in-go-1-11-9f97a7910d68) +for an example of their mutual use. + +## Profiles + +OpenCensus tags can be applied as profiler labels +for users who are on Go 1.9 and above. + +[embedmd]:# (internal/readme/tags.go profiler) +```go +ctx, err = tag.New(ctx, + tag.Insert(osKey, "macOS-10.12.5"), + tag.Insert(userIDKey, "fff0989878"), +) +if err != nil { + log.Fatal(err) +} +tag.Do(ctx, func(ctx context.Context) { + // Do work. + // When profiling is on, samples will be + // recorded with the key/values from the tag map. +}) +``` + +A screenshot of the CPU profile from the program above: + +![CPU profile](https://i.imgur.com/jBKjlkw.png) + +## Deprecation Policy + +Before version 1.0.0, the following deprecation policy will be observed: + +No backwards-incompatible changes will be made except for the removal of symbols that have +been marked as *Deprecated* for at least one minor release (e.g. 0.9.0 to 0.10.0). A release +removing the *Deprecated* functionality will be made no sooner than 28 days after the first +release in which the functionality was marked *Deprecated*. + +[travis-image]: https://travis-ci.org/census-instrumentation/opencensus-go.svg?branch=master +[travis-url]: https://travis-ci.org/census-instrumentation/opencensus-go +[appveyor-image]: https://ci.appveyor.com/api/projects/status/vgtt29ps1783ig38?svg=true +[appveyor-url]: https://ci.appveyor.com/project/opencensusgoteam/opencensus-go/branch/master +[godoc-image]: https://godoc.org/go.opencensus.io?status.svg +[godoc-url]: https://godoc.org/go.opencensus.io +[gitter-image]: https://badges.gitter.im/census-instrumentation/lobby.svg +[gitter-url]: https://gitter.im/census-instrumentation/lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge + + +[new-ex]: https://godoc.org/go.opencensus.io/tag#example-NewMap +[new-replace-ex]: https://godoc.org/go.opencensus.io/tag#example-NewMap--Replace + +[exporter-prom]: https://godoc.org/contrib.go.opencensus.io/exporter/prometheus +[exporter-stackdriver]: https://godoc.org/contrib.go.opencensus.io/exporter/stackdriver +[exporter-zipkin]: https://godoc.org/contrib.go.opencensus.io/exporter/zipkin +[exporter-jaeger]: https://godoc.org/contrib.go.opencensus.io/exporter/jaeger +[exporter-xray]: https://github.com/census-ecosystem/opencensus-go-exporter-aws +[exporter-datadog]: https://github.com/DataDog/opencensus-go-exporter-datadog +[exporter-graphite]: https://github.com/census-ecosystem/opencensus-go-exporter-graphite +[exporter-honeycomb]: https://github.com/honeycombio/opencensus-exporter +[exporter-newrelic]: https://github.com/newrelic/newrelic-opencensus-exporter-go diff --git a/vendor/go.opencensus.io/appveyor.yml b/vendor/go.opencensus.io/appveyor.yml new file mode 100644 index 000000000..d08f0edaf --- /dev/null +++ b/vendor/go.opencensus.io/appveyor.yml @@ -0,0 +1,24 @@ +version: "{build}" + +platform: x64 + +clone_folder: c:\gopath\src\go.opencensus.io + +environment: + GOPATH: 'c:\gopath' + GO111MODULE: 'on' + CGO_ENABLED: '0' # See: https://github.com/appveyor/ci/issues/2613 + +stack: go 1.11 + +before_test: + - go version + - go env + +build: false +deploy: false + +test_script: + - cd %APPVEYOR_BUILD_FOLDER% + - go build -v .\... + - go test -v .\... # No -race because cgo is disabled diff --git a/vendor/go.opencensus.io/exporter/stackdriver/propagation/http.go b/vendor/go.opencensus.io/exporter/stackdriver/propagation/http.go deleted file mode 100644 index 7cc02a110..000000000 --- a/vendor/go.opencensus.io/exporter/stackdriver/propagation/http.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package propagation implement X-Cloud-Trace-Context header propagation used -// by Google Cloud products. -package propagation // import "go.opencensus.io/exporter/stackdriver/propagation" - -import ( - "encoding/binary" - "encoding/hex" - "fmt" - "net/http" - "strconv" - "strings" - - "go.opencensus.io/trace" - "go.opencensus.io/trace/propagation" -) - -const ( - httpHeaderMaxSize = 200 - httpHeader = `X-Cloud-Trace-Context` -) - -var _ propagation.HTTPFormat = (*HTTPFormat)(nil) - -// HTTPFormat implements propagation.HTTPFormat to propagate -// traces in HTTP headers for Google Cloud Platform and Stackdriver Trace. -type HTTPFormat struct{} - -// SpanContextFromRequest extracts a Stackdriver Trace span context from incoming requests. -func (f *HTTPFormat) SpanContextFromRequest(req *http.Request) (sc trace.SpanContext, ok bool) { - h := req.Header.Get(httpHeader) - // See https://cloud.google.com/trace/docs/faq for the header HTTPFormat. - // Return if the header is empty or missing, or if the header is unreasonably - // large, to avoid making unnecessary copies of a large string. - if h == "" || len(h) > httpHeaderMaxSize { - return trace.SpanContext{}, false - } - - // Parse the trace id field. - slash := strings.Index(h, `/`) - if slash == -1 { - return trace.SpanContext{}, false - } - tid, h := h[:slash], h[slash+1:] - - buf, err := hex.DecodeString(tid) - if err != nil { - return trace.SpanContext{}, false - } - copy(sc.TraceID[:], buf) - - // Parse the span id field. - spanstr := h - semicolon := strings.Index(h, `;`) - if semicolon != -1 { - spanstr, h = h[:semicolon], h[semicolon+1:] - } - sid, err := strconv.ParseUint(spanstr, 10, 64) - if err != nil { - return trace.SpanContext{}, false - } - binary.BigEndian.PutUint64(sc.SpanID[:], sid) - - // Parse the options field, options field is optional. - if !strings.HasPrefix(h, "o=") { - return sc, true - } - o, err := strconv.ParseUint(h[2:], 10, 64) - if err != nil { - return trace.SpanContext{}, false - } - sc.TraceOptions = trace.TraceOptions(o) - return sc, true -} - -// SpanContextToRequest modifies the given request to include a Stackdriver Trace header. -func (f *HTTPFormat) SpanContextToRequest(sc trace.SpanContext, req *http.Request) { - sid := binary.BigEndian.Uint64(sc.SpanID[:]) - header := fmt.Sprintf("%s/%d;o=%d", hex.EncodeToString(sc.TraceID[:]), sid, int64(sc.TraceOptions)) - req.Header.Set(httpHeader, header) -} diff --git a/vendor/go.opencensus.io/go.mod b/vendor/go.opencensus.io/go.mod new file mode 100644 index 000000000..c867df5f5 --- /dev/null +++ b/vendor/go.opencensus.io/go.mod @@ -0,0 +1,15 @@ +module go.opencensus.io + +require ( + github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 + github.com/golang/protobuf v1.3.1 + github.com/google/go-cmp v0.3.0 + github.com/stretchr/testify v1.4.0 + golang.org/x/net v0.0.0-20190620200207-3b0461eec859 + golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd // indirect + golang.org/x/text v0.3.2 // indirect + google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb // indirect + google.golang.org/grpc v1.20.1 +) + +go 1.13 diff --git a/vendor/go.opencensus.io/go.sum b/vendor/go.opencensus.io/go.sum new file mode 100644 index 000000000..01c02972c --- /dev/null +++ b/vendor/go.opencensus.io/go.sum @@ -0,0 +1,74 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3 h1:XQyxROzUlZH+WIQwySDgnISgOivlhjIEwaQaJEJrrN0= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f h1:Bl/8QSvNqXvPGPGXa2z5xUTmV7VDcZyvRZ+QQXkXTZQ= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 h1:bjcUS9ztw9kFmmIxJInhon/0Is3p+EHBKNgquIzo1OI= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd h1:r7DufRZuZbWB7j439YfAzP8RPDa9unLkpwQKUYbIMPI= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd h1:/e+gpKk9r3dJobndpTytxS2gOy6m5uvpg+ISQoEcusQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb h1:i1Ppqkc3WQXikh8bXiwHqAN5Rv3/qDCcRk0/Otx73BY= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/grpc v1.19.0 h1:cfg4PD8YEdSFnm7qLV4++93WcmhH2nIUhMjhdCvl3j8= +google.golang.org/grpc v1.19.0 h1:cfg4PD8YEdSFnm7qLV4++93WcmhH2nIUhMjhdCvl3j8= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1 h1:Hz2g2wirWK7H0qIIhGIqRGTuMwTE8HEKFnDZZ7lm9NU= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/vendor/go.opencensus.io/internal/internal.go b/vendor/go.opencensus.io/internal/internal.go index fce1f02dc..81dc7183e 100644 --- a/vendor/go.opencensus.io/internal/internal.go +++ b/vendor/go.opencensus.io/internal/internal.go @@ -12,13 +12,18 @@ // See the License for the specific language governing permissions and // limitations under the License. -package internal +package internal // import "go.opencensus.io/internal" -import "time" +import ( + "fmt" + "time" + + opencensus "go.opencensus.io" +) // UserAgent is the user agent to be added to the outgoing // requests from the exporters. -const UserAgent = "opencensus-go [0.8.0]" +var UserAgent = fmt.Sprintf("opencensus-go/%s", opencensus.Version()) // MonotonicEndTime returns the end time at present // but offset from start, monotonically. @@ -28,5 +33,5 @@ const UserAgent = "opencensus-go [0.8.0]" // end as a monotonic time. // See https://golang.org/pkg/time/#hdr-Monotonic_Clocks func MonotonicEndTime(start time.Time) time.Time { - return start.Add(time.Now().Sub(start)) + return start.Add(time.Since(start)) } diff --git a/vendor/go.opencensus.io/internal/tagencoding/tagencoding.go b/vendor/go.opencensus.io/internal/tagencoding/tagencoding.go index d9f23abee..41b2c3fc0 100644 --- a/vendor/go.opencensus.io/internal/tagencoding/tagencoding.go +++ b/vendor/go.opencensus.io/internal/tagencoding/tagencoding.go @@ -15,8 +15,9 @@ // Package tagencoding contains the tag encoding // used interally by the stats collector. -package tagencoding +package tagencoding // import "go.opencensus.io/internal/tagencoding" +// Values represent the encoded buffer for the values. type Values struct { Buffer []byte WriteIndex int @@ -31,6 +32,7 @@ func (vb *Values) growIfRequired(expected int) { } } +// WriteValue is the helper method to encode Values from map[Key][]byte. func (vb *Values) WriteValue(v []byte) { length := len(v) & 0xff vb.growIfRequired(1 + length) @@ -49,7 +51,7 @@ func (vb *Values) WriteValue(v []byte) { vb.WriteIndex += length } -// ReadValue is the helper method to read the values when decoding valuesBytes to a map[Key][]byte. +// ReadValue is the helper method to decode Values to a map[Key][]byte. func (vb *Values) ReadValue() []byte { // read length of v length := int(vb.Buffer[vb.ReadIndex]) @@ -67,6 +69,7 @@ func (vb *Values) ReadValue() []byte { return v } +// Bytes returns a reference to already written bytes in the Buffer. func (vb *Values) Bytes() []byte { return vb.Buffer[:vb.WriteIndex] } diff --git a/vendor/go.opencensus.io/internal/traceinternals.go b/vendor/go.opencensus.io/internal/traceinternals.go index 553ca68dc..073af7b47 100644 --- a/vendor/go.opencensus.io/internal/traceinternals.go +++ b/vendor/go.opencensus.io/internal/traceinternals.go @@ -22,6 +22,7 @@ import ( // TODO(#412): remove this var Trace interface{} +// LocalSpanStoreEnabled true if the local span store is enabled. var LocalSpanStoreEnabled bool // BucketConfiguration stores the number of samples to store for span buckets diff --git a/vendor/go.opencensus.io/metric/metricdata/doc.go b/vendor/go.opencensus.io/metric/metricdata/doc.go new file mode 100644 index 000000000..52a7b3bf8 --- /dev/null +++ b/vendor/go.opencensus.io/metric/metricdata/doc.go @@ -0,0 +1,19 @@ +// Copyright 2018, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package metricdata contains the metrics data model. +// +// This is an EXPERIMENTAL package, and may change in arbitrary ways without +// notice. +package metricdata // import "go.opencensus.io/metric/metricdata" diff --git a/vendor/go.opencensus.io/metric/metricdata/exemplar.go b/vendor/go.opencensus.io/metric/metricdata/exemplar.go new file mode 100644 index 000000000..12695ce2d --- /dev/null +++ b/vendor/go.opencensus.io/metric/metricdata/exemplar.go @@ -0,0 +1,38 @@ +// Copyright 2018, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package metricdata + +import ( + "time" +) + +// Exemplars keys. +const ( + AttachmentKeySpanContext = "SpanContext" +) + +// Exemplar is an example data point associated with each bucket of a +// distribution type aggregation. +// +// Their purpose is to provide an example of the kind of thing +// (request, RPC, trace span, etc.) that resulted in that measurement. +type Exemplar struct { + Value float64 // the value that was recorded + Timestamp time.Time // the time the value was recorded + Attachments Attachments // attachments (if any) +} + +// Attachments is a map of extra values associated with a recorded data point. +type Attachments map[string]interface{} diff --git a/vendor/go.opencensus.io/metric/metricdata/label.go b/vendor/go.opencensus.io/metric/metricdata/label.go new file mode 100644 index 000000000..aadae41e6 --- /dev/null +++ b/vendor/go.opencensus.io/metric/metricdata/label.go @@ -0,0 +1,35 @@ +// Copyright 2018, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package metricdata + +// LabelKey represents key of a label. It has optional +// description attribute. +type LabelKey struct { + Key string + Description string +} + +// LabelValue represents the value of a label. +// The zero value represents a missing label value, which may be treated +// differently to an empty string value by some back ends. +type LabelValue struct { + Value string // string value of the label + Present bool // flag that indicated whether a value is present or not +} + +// NewLabelValue creates a new non-nil LabelValue that represents the given string. +func NewLabelValue(val string) LabelValue { + return LabelValue{Value: val, Present: true} +} diff --git a/vendor/go.opencensus.io/metric/metricdata/metric.go b/vendor/go.opencensus.io/metric/metricdata/metric.go new file mode 100644 index 000000000..8293712c7 --- /dev/null +++ b/vendor/go.opencensus.io/metric/metricdata/metric.go @@ -0,0 +1,46 @@ +// Copyright 2018, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package metricdata + +import ( + "time" + + "go.opencensus.io/resource" +) + +// Descriptor holds metadata about a metric. +type Descriptor struct { + Name string // full name of the metric + Description string // human-readable description + Unit Unit // units for the measure + Type Type // type of measure + LabelKeys []LabelKey // label keys +} + +// Metric represents a quantity measured against a resource with different +// label value combinations. +type Metric struct { + Descriptor Descriptor // metric descriptor + Resource *resource.Resource // resource against which this was measured + TimeSeries []*TimeSeries // one time series for each combination of label values +} + +// TimeSeries is a sequence of points associated with a combination of label +// values. +type TimeSeries struct { + LabelValues []LabelValue // label values, same order as keys in the metric descriptor + Points []Point // points sequence + StartTime time.Time // time we started recording this time series +} diff --git a/vendor/go.opencensus.io/metric/metricdata/point.go b/vendor/go.opencensus.io/metric/metricdata/point.go new file mode 100644 index 000000000..7fe057b19 --- /dev/null +++ b/vendor/go.opencensus.io/metric/metricdata/point.go @@ -0,0 +1,193 @@ +// Copyright 2018, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package metricdata + +import ( + "time" +) + +// Point is a single data point of a time series. +type Point struct { + // Time is the point in time that this point represents in a time series. + Time time.Time + // Value is the value of this point. Prefer using ReadValue to switching on + // the value type, since new value types might be added. + Value interface{} +} + +//go:generate stringer -type ValueType + +// NewFloat64Point creates a new Point holding a float64 value. +func NewFloat64Point(t time.Time, val float64) Point { + return Point{ + Value: val, + Time: t, + } +} + +// NewInt64Point creates a new Point holding an int64 value. +func NewInt64Point(t time.Time, val int64) Point { + return Point{ + Value: val, + Time: t, + } +} + +// NewDistributionPoint creates a new Point holding a Distribution value. +func NewDistributionPoint(t time.Time, val *Distribution) Point { + return Point{ + Value: val, + Time: t, + } +} + +// NewSummaryPoint creates a new Point holding a Summary value. +func NewSummaryPoint(t time.Time, val *Summary) Point { + return Point{ + Value: val, + Time: t, + } +} + +// ValueVisitor allows reading the value of a point. +type ValueVisitor interface { + VisitFloat64Value(float64) + VisitInt64Value(int64) + VisitDistributionValue(*Distribution) + VisitSummaryValue(*Summary) +} + +// ReadValue accepts a ValueVisitor and calls the appropriate method with the +// value of this point. +// Consumers of Point should use this in preference to switching on the type +// of the value directly, since new value types may be added. +func (p Point) ReadValue(vv ValueVisitor) { + switch v := p.Value.(type) { + case int64: + vv.VisitInt64Value(v) + case float64: + vv.VisitFloat64Value(v) + case *Distribution: + vv.VisitDistributionValue(v) + case *Summary: + vv.VisitSummaryValue(v) + default: + panic("unexpected value type") + } +} + +// Distribution contains summary statistics for a population of values. It +// optionally contains a histogram representing the distribution of those +// values across a set of buckets. +type Distribution struct { + // Count is the number of values in the population. Must be non-negative. This value + // must equal the sum of the values in bucket_counts if a histogram is + // provided. + Count int64 + // Sum is the sum of the values in the population. If count is zero then this field + // must be zero. + Sum float64 + // SumOfSquaredDeviation is the sum of squared deviations from the mean of the values in the + // population. For values x_i this is: + // + // Sum[i=1..n]((x_i - mean)^2) + // + // Knuth, "The Art of Computer Programming", Vol. 2, page 323, 3rd edition + // describes Welford's method for accumulating this sum in one pass. + // + // If count is zero then this field must be zero. + SumOfSquaredDeviation float64 + // BucketOptions describes the bounds of the histogram buckets in this + // distribution. + // + // A Distribution may optionally contain a histogram of the values in the + // population. + // + // If nil, there is no associated histogram. + BucketOptions *BucketOptions + // Bucket If the distribution does not have a histogram, then omit this field. + // If there is a histogram, then the sum of the values in the Bucket counts + // must equal the value in the count field of the distribution. + Buckets []Bucket +} + +// BucketOptions describes the bounds of the histogram buckets in this +// distribution. +type BucketOptions struct { + // Bounds specifies a set of bucket upper bounds. + // This defines len(bounds) + 1 (= N) buckets. The boundaries for bucket + // index i are: + // + // [0, Bounds[i]) for i == 0 + // [Bounds[i-1], Bounds[i]) for 0 < i < N-1 + // [Bounds[i-1], +infinity) for i == N-1 + Bounds []float64 +} + +// Bucket represents a single bucket (value range) in a distribution. +type Bucket struct { + // Count is the number of values in each bucket of the histogram, as described in + // bucket_bounds. + Count int64 + // Exemplar associated with this bucket (if any). + Exemplar *Exemplar +} + +// Summary is a representation of percentiles. +type Summary struct { + // Count is the cumulative count (if available). + Count int64 + // Sum is the cumulative sum of values (if available). + Sum float64 + // HasCountAndSum is true if Count and Sum are available. + HasCountAndSum bool + // Snapshot represents percentiles calculated over an arbitrary time window. + // The values in this struct can be reset at arbitrary unknown times, with + // the requirement that all of them are reset at the same time. + Snapshot Snapshot +} + +// Snapshot represents percentiles over an arbitrary time. +// The values in this struct can be reset at arbitrary unknown times, with +// the requirement that all of them are reset at the same time. +type Snapshot struct { + // Count is the number of values in the snapshot. Optional since some systems don't + // expose this. Set to 0 if not available. + Count int64 + // Sum is the sum of values in the snapshot. Optional since some systems don't + // expose this. If count is 0 then this field must be zero. + Sum float64 + // Percentiles is a map from percentile (range (0-100.0]) to the value of + // the percentile. + Percentiles map[float64]float64 +} + +//go:generate stringer -type Type + +// Type is the overall type of metric, including its value type and whether it +// represents a cumulative total (since the start time) or if it represents a +// gauge value. +type Type int + +// Metric types. +const ( + TypeGaugeInt64 Type = iota + TypeGaugeFloat64 + TypeGaugeDistribution + TypeCumulativeInt64 + TypeCumulativeFloat64 + TypeCumulativeDistribution + TypeSummary +) diff --git a/vendor/go.opencensus.io/metric/metricdata/type_string.go b/vendor/go.opencensus.io/metric/metricdata/type_string.go new file mode 100644 index 000000000..c3f8ec27b --- /dev/null +++ b/vendor/go.opencensus.io/metric/metricdata/type_string.go @@ -0,0 +1,16 @@ +// Code generated by "stringer -type Type"; DO NOT EDIT. + +package metricdata + +import "strconv" + +const _Type_name = "TypeGaugeInt64TypeGaugeFloat64TypeGaugeDistributionTypeCumulativeInt64TypeCumulativeFloat64TypeCumulativeDistributionTypeSummary" + +var _Type_index = [...]uint8{0, 14, 30, 51, 70, 91, 117, 128} + +func (i Type) String() string { + if i < 0 || i >= Type(len(_Type_index)-1) { + return "Type(" + strconv.FormatInt(int64(i), 10) + ")" + } + return _Type_name[_Type_index[i]:_Type_index[i+1]] +} diff --git a/vendor/go.opencensus.io/metric/metricdata/unit.go b/vendor/go.opencensus.io/metric/metricdata/unit.go new file mode 100644 index 000000000..b483a1371 --- /dev/null +++ b/vendor/go.opencensus.io/metric/metricdata/unit.go @@ -0,0 +1,27 @@ +// Copyright 2018, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package metricdata + +// Unit is a string encoded according to the case-sensitive abbreviations from the +// Unified Code for Units of Measure: http://unitsofmeasure.org/ucum.html +type Unit string + +// Predefined units. To record against a unit not represented here, create your +// own Unit type constant from a string. +const ( + UnitDimensionless Unit = "1" + UnitBytes Unit = "By" + UnitMilliseconds Unit = "ms" +) diff --git a/vendor/go.opencensus.io/metric/metricproducer/manager.go b/vendor/go.opencensus.io/metric/metricproducer/manager.go new file mode 100644 index 000000000..ca1f39049 --- /dev/null +++ b/vendor/go.opencensus.io/metric/metricproducer/manager.go @@ -0,0 +1,78 @@ +// Copyright 2019, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package metricproducer + +import ( + "sync" +) + +// Manager maintains a list of active producers. Producers can register +// with the manager to allow readers to read all metrics provided by them. +// Readers can retrieve all producers registered with the manager, +// read metrics from the producers and export them. +type Manager struct { + mu sync.RWMutex + producers map[Producer]struct{} +} + +var prodMgr *Manager +var once sync.Once + +// GlobalManager is a single instance of producer manager +// that is used by all producers and all readers. +func GlobalManager() *Manager { + once.Do(func() { + prodMgr = &Manager{} + prodMgr.producers = make(map[Producer]struct{}) + }) + return prodMgr +} + +// AddProducer adds the producer to the Manager if it is not already present. +func (pm *Manager) AddProducer(producer Producer) { + if producer == nil { + return + } + pm.mu.Lock() + defer pm.mu.Unlock() + pm.producers[producer] = struct{}{} +} + +// DeleteProducer deletes the producer from the Manager if it is present. +func (pm *Manager) DeleteProducer(producer Producer) { + if producer == nil { + return + } + pm.mu.Lock() + defer pm.mu.Unlock() + delete(pm.producers, producer) +} + +// GetAll returns a slice of all producer currently registered with +// the Manager. For each call it generates a new slice. The slice +// should not be cached as registration may change at any time. It is +// typically called periodically by exporter to read metrics from +// the producers. +func (pm *Manager) GetAll() []Producer { + pm.mu.Lock() + defer pm.mu.Unlock() + producers := make([]Producer, len(pm.producers)) + i := 0 + for producer := range pm.producers { + producers[i] = producer + i++ + } + return producers +} diff --git a/vendor/go.opencensus.io/metric/metricproducer/producer.go b/vendor/go.opencensus.io/metric/metricproducer/producer.go new file mode 100644 index 000000000..6cee9ed17 --- /dev/null +++ b/vendor/go.opencensus.io/metric/metricproducer/producer.go @@ -0,0 +1,28 @@ +// Copyright 2019, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package metricproducer + +import ( + "go.opencensus.io/metric/metricdata" +) + +// Producer is a source of metrics. +type Producer interface { + // Read should return the current values of all metrics supported by this + // metric provider. + // The returned metrics should be unique for each combination of name and + // resource. + Read() []*metricdata.Metric +} diff --git a/vendor/go.opencensus.io/opencensus.go b/vendor/go.opencensus.io/opencensus.go new file mode 100644 index 000000000..e5e4b4368 --- /dev/null +++ b/vendor/go.opencensus.io/opencensus.go @@ -0,0 +1,21 @@ +// Copyright 2017, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package opencensus contains Go support for OpenCensus. +package opencensus // import "go.opencensus.io" + +// Version is the current release version of OpenCensus in use. +func Version() string { + return "0.23.0" +} diff --git a/vendor/go.opencensus.io/plugin/ochttp/client.go b/vendor/go.opencensus.io/plugin/ochttp/client.go index 37f42b3b1..da815b2a7 100644 --- a/vendor/go.opencensus.io/plugin/ochttp/client.go +++ b/vendor/go.opencensus.io/plugin/ochttp/client.go @@ -16,14 +16,18 @@ package ochttp import ( "net/http" + "net/http/httptrace" "go.opencensus.io/trace" "go.opencensus.io/trace/propagation" ) // Transport is an http.RoundTripper that instruments all outgoing requests with -// stats and tracing. The zero value is intended to be a useful default, but for -// now it's recommended that you explicitly set Propagation. +// OpenCensus stats and tracing. +// +// The zero value is intended to be a useful default, but for +// now it's recommended that you explicitly set Propagation, since the default +// for this may change. type Transport struct { // Base may be set to wrap another http.RoundTripper that does the actual // requests. By default http.DefaultTransport is used. @@ -43,24 +47,53 @@ type Transport struct { // for spans started by this transport. StartOptions trace.StartOptions + // GetStartOptions allows to set start options per request. If set, + // StartOptions is going to be ignored. + GetStartOptions func(*http.Request) trace.StartOptions + + // NameFromRequest holds the function to use for generating the span name + // from the information found in the outgoing HTTP Request. By default the + // name equals the URL Path. + FormatSpanName func(*http.Request) string + + // NewClientTrace may be set to a function allowing the current *trace.Span + // to be annotated with HTTP request event information emitted by the + // httptrace package. + NewClientTrace func(*http.Request, *trace.Span) *httptrace.ClientTrace + // TODO: Implement tag propagation for HTTP. } // RoundTrip implements http.RoundTripper, delegating to Base and recording stats and traces for the request. func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) { rt := t.base() + if isHealthEndpoint(req.URL.Path) { + return rt.RoundTrip(req) + } // TODO: remove excessive nesting of http.RoundTrippers here. format := t.Propagation if format == nil { format = defaultFormat } + spanNameFormatter := t.FormatSpanName + if spanNameFormatter == nil { + spanNameFormatter = spanNameFromURL + } + + startOpts := t.StartOptions + if t.GetStartOptions != nil { + startOpts = t.GetStartOptions(req) + } + rt = &traceTransport{ base: rt, format: format, startOptions: trace.StartOptions{ - Sampler: t.StartOptions.Sampler, + Sampler: startOpts.Sampler, SpanKind: trace.SpanKindClient, }, + formatSpanName: spanNameFormatter, + newClientTrace: t.NewClientTrace, } rt = statsTransport{base: rt} return rt.RoundTrip(req) diff --git a/vendor/go.opencensus.io/plugin/ochttp/client_stats.go b/vendor/go.opencensus.io/plugin/ochttp/client_stats.go index 9b286b929..17142aabe 100644 --- a/vendor/go.opencensus.io/plugin/ochttp/client_stats.go +++ b/vendor/go.opencensus.io/plugin/ochttp/client_stats.go @@ -34,8 +34,11 @@ type statsTransport struct { // RoundTrip implements http.RoundTripper, delegating to Base and recording stats for the request. func (t statsTransport) RoundTrip(req *http.Request) (*http.Response, error) { ctx, _ := tag.New(req.Context(), - tag.Upsert(Host, req.URL.Host), + tag.Upsert(KeyClientHost, req.Host), + tag.Upsert(Host, req.Host), + tag.Upsert(KeyClientPath, req.URL.Path), tag.Upsert(Path, req.URL.Path), + tag.Upsert(KeyClientMethod, req.Method), tag.Upsert(Method, req.Method)) req = req.WithContext(ctx) track := &tracker{ @@ -58,11 +61,14 @@ func (t statsTransport) RoundTrip(req *http.Request) (*http.Response, error) { track.end() } else { track.statusCode = resp.StatusCode + if req.Method != "HEAD" { + track.respContentLength = resp.ContentLength + } if resp.Body == nil { track.end() } else { track.body = resp.Body - resp.Body = track + resp.Body = wrappedBody(track, resp.Body) } } return resp, err @@ -79,36 +85,48 @@ func (t statsTransport) CancelRequest(req *http.Request) { } type tracker struct { - ctx context.Context - respSize int64 - reqSize int64 - start time.Time - body io.ReadCloser - statusCode int - endOnce sync.Once + ctx context.Context + respSize int64 + respContentLength int64 + reqSize int64 + start time.Time + body io.ReadCloser + statusCode int + endOnce sync.Once } var _ io.ReadCloser = (*tracker)(nil) func (t *tracker) end() { t.endOnce.Do(func() { + latencyMs := float64(time.Since(t.start)) / float64(time.Millisecond) + respSize := t.respSize + if t.respSize == 0 && t.respContentLength > 0 { + respSize = t.respContentLength + } m := []stats.Measurement{ - ClientLatency.M(float64(time.Since(t.start)) / float64(time.Millisecond)), + ClientSentBytes.M(t.reqSize), + ClientReceivedBytes.M(respSize), + ClientRoundtripLatency.M(latencyMs), + ClientLatency.M(latencyMs), ClientResponseBytes.M(t.respSize), } if t.reqSize >= 0 { m = append(m, ClientRequestBytes.M(t.reqSize)) } - ctx, _ := tag.New(t.ctx, tag.Upsert(StatusCode, strconv.Itoa(t.statusCode))) - stats.Record(ctx, m...) + + stats.RecordWithTags(t.ctx, []tag.Mutator{ + tag.Upsert(StatusCode, strconv.Itoa(t.statusCode)), + tag.Upsert(KeyClientStatus, strconv.Itoa(t.statusCode)), + }, m...) }) } func (t *tracker) Read(b []byte) (int, error) { n, err := t.body.Read(b) + t.respSize += int64(n) switch err { case nil: - t.respSize += int64(n) return n, nil case io.EOF: t.end() diff --git a/vendor/go.opencensus.io/plugin/ochttp/propagation/b3/b3.go b/vendor/go.opencensus.io/plugin/ochttp/propagation/b3/b3.go index ddc99460a..2f1c7f006 100644 --- a/vendor/go.opencensus.io/plugin/ochttp/propagation/b3/b3.go +++ b/vendor/go.opencensus.io/plugin/ochttp/propagation/b3/b3.go @@ -15,7 +15,7 @@ // Package b3 contains a propagation.HTTPFormat implementation // for B3 propagation. See https://github.com/openzipkin/b3-propagation // for more details. -package b3 +package b3 // import "go.opencensus.io/plugin/ochttp/propagation/b3" import ( "encoding/hex" @@ -25,10 +25,11 @@ import ( "go.opencensus.io/trace/propagation" ) +// B3 headers that OpenCensus understands. const ( - traceIDHeader = "X-B3-TraceId" - spanIDHeader = "X-B3-SpanId" - sampledHeader = "X-B3-Sampled" + TraceIDHeader = "X-B3-TraceId" + SpanIDHeader = "X-B3-SpanId" + SampledHeader = "X-B3-Sampled" ) // HTTPFormat implements propagation.HTTPFormat to propagate @@ -37,7 +38,7 @@ const ( // because there are additional fields not represented in the // OpenCensus span context. Spans created from the incoming // header will be the direct children of the client-side span. -// Similarly, reciever of the outgoing spans should use client-side +// Similarly, receiver of the outgoing spans should use client-side // span created by OpenCensus as the parent. type HTTPFormat struct{} @@ -45,15 +46,15 @@ var _ propagation.HTTPFormat = (*HTTPFormat)(nil) // SpanContextFromRequest extracts a B3 span context from incoming requests. func (f *HTTPFormat) SpanContextFromRequest(req *http.Request) (sc trace.SpanContext, ok bool) { - tid, ok := parseTraceID(req.Header.Get(traceIDHeader)) + tid, ok := ParseTraceID(req.Header.Get(TraceIDHeader)) if !ok { return trace.SpanContext{}, false } - sid, ok := parseSpanID(req.Header.Get(spanIDHeader)) + sid, ok := ParseSpanID(req.Header.Get(SpanIDHeader)) if !ok { return trace.SpanContext{}, false } - sampled, _ := parseSampled(req.Header.Get(sampledHeader)) + sampled, _ := ParseSampled(req.Header.Get(SampledHeader)) return trace.SpanContext{ TraceID: tid, SpanID: sid, @@ -61,7 +62,8 @@ func (f *HTTPFormat) SpanContextFromRequest(req *http.Request) (sc trace.SpanCon }, true } -func parseTraceID(tid string) (trace.TraceID, bool) { +// ParseTraceID parses the value of the X-B3-TraceId header. +func ParseTraceID(tid string) (trace.TraceID, bool) { if tid == "" { return trace.TraceID{}, false } @@ -82,7 +84,8 @@ func parseTraceID(tid string) (trace.TraceID, bool) { return traceID, true } -func parseSpanID(sid string) (spanID trace.SpanID, ok bool) { +// ParseSpanID parses the value of the X-B3-SpanId or X-B3-ParentSpanId headers. +func ParseSpanID(sid string) (spanID trace.SpanID, ok bool) { if sid == "" { return trace.SpanID{}, false } @@ -90,12 +93,13 @@ func parseSpanID(sid string) (spanID trace.SpanID, ok bool) { if err != nil { return trace.SpanID{}, false } - start := (8 - len(b)) + start := 8 - len(b) copy(spanID[start:], b) return spanID, true } -func parseSampled(sampled string) (trace.TraceOptions, bool) { +// ParseSampled parses the value of the X-B3-Sampled header. +func ParseSampled(sampled string) (trace.TraceOptions, bool) { switch sampled { case "true", "1": return trace.TraceOptions(1), true @@ -106,8 +110,8 @@ func parseSampled(sampled string) (trace.TraceOptions, bool) { // SpanContextToRequest modifies the given request to include B3 headers. func (f *HTTPFormat) SpanContextToRequest(sc trace.SpanContext, req *http.Request) { - req.Header.Set(traceIDHeader, hex.EncodeToString(sc.TraceID[:])) - req.Header.Set(spanIDHeader, hex.EncodeToString(sc.SpanID[:])) + req.Header.Set(TraceIDHeader, hex.EncodeToString(sc.TraceID[:])) + req.Header.Set(SpanIDHeader, hex.EncodeToString(sc.SpanID[:])) var sampled string if sc.IsSampled() { @@ -115,5 +119,5 @@ func (f *HTTPFormat) SpanContextToRequest(sc trace.SpanContext, req *http.Reques } else { sampled = "0" } - req.Header.Set(sampledHeader, sampled) + req.Header.Set(SampledHeader, sampled) } diff --git a/vendor/go.opencensus.io/plugin/ochttp/route.go b/vendor/go.opencensus.io/plugin/ochttp/route.go new file mode 100644 index 000000000..5e6a34307 --- /dev/null +++ b/vendor/go.opencensus.io/plugin/ochttp/route.go @@ -0,0 +1,61 @@ +// Copyright 2018, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ochttp + +import ( + "context" + "net/http" + + "go.opencensus.io/tag" +) + +// SetRoute sets the http_server_route tag to the given value. +// It's useful when an HTTP framework does not support the http.Handler interface +// and using WithRouteTag is not an option, but provides a way to hook into the request flow. +func SetRoute(ctx context.Context, route string) { + if a, ok := ctx.Value(addedTagsKey{}).(*addedTags); ok { + a.t = append(a.t, tag.Upsert(KeyServerRoute, route)) + } +} + +// WithRouteTag returns an http.Handler that records stats with the +// http_server_route tag set to the given value. +func WithRouteTag(handler http.Handler, route string) http.Handler { + return taggedHandlerFunc(func(w http.ResponseWriter, r *http.Request) []tag.Mutator { + addRoute := []tag.Mutator{tag.Upsert(KeyServerRoute, route)} + ctx, _ := tag.New(r.Context(), addRoute...) + r = r.WithContext(ctx) + handler.ServeHTTP(w, r) + return addRoute + }) +} + +// taggedHandlerFunc is a http.Handler that returns tags describing the +// processing of the request. These tags will be recorded along with the +// measures in this package at the end of the request. +type taggedHandlerFunc func(w http.ResponseWriter, r *http.Request) []tag.Mutator + +func (h taggedHandlerFunc) ServeHTTP(w http.ResponseWriter, r *http.Request) { + tags := h(w, r) + if a, ok := r.Context().Value(addedTagsKey{}).(*addedTags); ok { + a.t = append(a.t, tags...) + } +} + +type addedTagsKey struct{} + +type addedTags struct { + t []tag.Mutator +} diff --git a/vendor/go.opencensus.io/plugin/ochttp/server.go b/vendor/go.opencensus.io/plugin/ochttp/server.go index a92c7c1ed..c7ea64235 100644 --- a/vendor/go.opencensus.io/plugin/ochttp/server.go +++ b/vendor/go.opencensus.io/plugin/ochttp/server.go @@ -15,10 +15,8 @@ package ochttp import ( - "bufio" "context" - "errors" - "net" + "io" "net/http" "strconv" "sync" @@ -30,16 +28,19 @@ import ( "go.opencensus.io/trace/propagation" ) -// Handler is a http.Handler that is aware of the incoming request's span. +// Handler is an http.Handler wrapper to instrument your HTTP server with +// OpenCensus. It supports both stats and tracing. // +// Tracing +// +// This handler is aware of the incoming request's span, reading it from request +// headers as configured using the Propagation field. // The extracted span can be accessed from the incoming request's // context. // // span := trace.FromContext(r.Context()) // // The server span will be automatically ended at the end of ServeHTTP. -// -// Incoming propagation mechanism is determined by the given HTTP propagators. type Handler struct { // Propagation defines how traces are propagated. If unspecified, // B3 propagation will be used. @@ -55,53 +56,87 @@ type Handler struct { // for spans started by this transport. StartOptions trace.StartOptions + // GetStartOptions allows to set start options per request. If set, + // StartOptions is going to be ignored. + GetStartOptions func(*http.Request) trace.StartOptions + // IsPublicEndpoint should be set to true for publicly accessible HTTP(S) // servers. If true, any trace metadata set on the incoming request will // be added as a linked trace instead of being added as a parent of the // current trace. IsPublicEndpoint bool + + // FormatSpanName holds the function to use for generating the span name + // from the information found in the incoming HTTP Request. By default the + // name equals the URL Path. + FormatSpanName func(*http.Request) string + + // IsHealthEndpoint holds the function to use for determining if the + // incoming HTTP request should be considered a health check. This is in + // addition to the private isHealthEndpoint func which may also indicate + // tracing should be skipped. + IsHealthEndpoint func(*http.Request) bool } func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { - var traceEnd, statsEnd func() - r, traceEnd = h.startTrace(w, r) + var tags addedTags + r, traceEnd := h.startTrace(w, r) defer traceEnd() - w, statsEnd = h.startStats(w, r) - defer statsEnd() + w, statsEnd := h.startStats(w, r) + defer statsEnd(&tags) handler := h.Handler if handler == nil { handler = http.DefaultServeMux } + r = r.WithContext(context.WithValue(r.Context(), addedTagsKey{}, &tags)) handler.ServeHTTP(w, r) } func (h *Handler) startTrace(w http.ResponseWriter, r *http.Request) (*http.Request, func()) { - opts := trace.StartOptions{ - Sampler: h.StartOptions.Sampler, - SpanKind: trace.SpanKindServer, + if h.IsHealthEndpoint != nil && h.IsHealthEndpoint(r) || isHealthEndpoint(r.URL.Path) { + return r, func() {} + } + var name string + if h.FormatSpanName == nil { + name = spanNameFromURL(r) + } else { + name = h.FormatSpanName(r) } - - name := spanNameFromURL(r.URL) ctx := r.Context() + + startOpts := h.StartOptions + if h.GetStartOptions != nil { + startOpts = h.GetStartOptions(r) + } + var span *trace.Span sc, ok := h.extractSpanContext(r) if ok && !h.IsPublicEndpoint { - span = trace.NewSpanWithRemoteParent(name, sc, opts) - ctx = trace.WithSpan(ctx, span) + ctx, span = trace.StartSpanWithRemoteParent(ctx, name, sc, + trace.WithSampler(startOpts.Sampler), + trace.WithSpanKind(trace.SpanKindServer)) } else { - span = trace.NewSpan(name, nil, opts) + ctx, span = trace.StartSpan(ctx, name, + trace.WithSampler(startOpts.Sampler), + trace.WithSpanKind(trace.SpanKindServer), + ) if ok { span.AddLink(trace.Link{ TraceID: sc.TraceID, SpanID: sc.SpanID, - Type: trace.LinkTypeChild, + Type: trace.LinkTypeParent, Attributes: nil, }) } } - ctx = trace.WithSpan(ctx, span) span.AddAttributes(requestAttrs(r)...) - return r.WithContext(trace.WithSpan(r.Context(), span)), span.End + if r.Body == nil { + // TODO: Handle cases where ContentLength is not set. + } else if r.ContentLength > 0 { + span.AddMessageReceiveEvent(0, /* TODO: messageID */ + r.ContentLength, -1) + } + return r.WithContext(ctx), span.End } func (h *Handler) extractSpanContext(r *http.Request) (trace.SpanContext, bool) { @@ -111,9 +146,9 @@ func (h *Handler) extractSpanContext(r *http.Request) (trace.SpanContext, bool) return h.Propagation.SpanContextFromRequest(r) } -func (h *Handler) startStats(w http.ResponseWriter, r *http.Request) (http.ResponseWriter, func()) { +func (h *Handler) startStats(w http.ResponseWriter, r *http.Request) (http.ResponseWriter, func(tags *addedTags)) { ctx, _ := tag.New(r.Context(), - tag.Upsert(Host, r.URL.Host), + tag.Upsert(Host, r.Host), tag.Upsert(Path, r.URL.Path), tag.Upsert(Method, r.Method)) track := &trackingResponseWriter{ @@ -128,7 +163,7 @@ func (h *Handler) startStats(w http.ResponseWriter, r *http.Request) (http.Respo track.reqSize = r.ContentLength } stats.Record(ctx, ServerRequestCount.M(1)) - return track, track.end + return track.wrappedResponseWriter(), track.end } type trackingResponseWriter struct { @@ -137,28 +172,24 @@ type trackingResponseWriter struct { respSize int64 start time.Time statusCode int + statusLine string endOnce sync.Once writer http.ResponseWriter } +// Compile time assertion for ResponseWriter interface var _ http.ResponseWriter = (*trackingResponseWriter)(nil) -var _ http.Hijacker = (*trackingResponseWriter)(nil) - -var errHijackerUnimplemented = errors.New("ResponseWriter does not implement http.Hijacker") -func (t *trackingResponseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { - hj, ok := t.writer.(http.Hijacker) - if !ok { - return nil, nil, errHijackerUnimplemented - } - return hj.Hijack() -} - -func (t *trackingResponseWriter) end() { +func (t *trackingResponseWriter) end(tags *addedTags) { t.endOnce.Do(func() { if t.statusCode == 0 { t.statusCode = 200 } + + span := trace.FromContext(t.ctx) + span.SetStatus(TraceStatus(t.statusCode, t.statusLine)) + span.AddAttributes(trace.Int64Attribute(StatusCodeAttribute, int64(t.statusCode))) + m := []stats.Measurement{ ServerLatency.M(float64(time.Since(t.start)) / float64(time.Millisecond)), ServerResponseBytes.M(t.respSize), @@ -166,8 +197,10 @@ func (t *trackingResponseWriter) end() { if t.reqSize >= 0 { m = append(m, ServerRequestBytes.M(t.reqSize)) } - ctx, _ := tag.New(t.ctx, tag.Upsert(StatusCode, strconv.Itoa(t.statusCode))) - stats.Record(ctx, m...) + allTags := make([]tag.Mutator, len(tags.t)+1) + allTags[0] = tag.Upsert(StatusCode, strconv.Itoa(t.statusCode)) + copy(allTags[1:], tags.t) + stats.RecordWithTags(t.ctx, allTags, m...) }) } @@ -178,16 +211,243 @@ func (t *trackingResponseWriter) Header() http.Header { func (t *trackingResponseWriter) Write(data []byte) (int, error) { n, err := t.writer.Write(data) t.respSize += int64(n) + // Add message event for request bytes sent. + span := trace.FromContext(t.ctx) + span.AddMessageSendEvent(0 /* TODO: messageID */, int64(n), -1) return n, err } func (t *trackingResponseWriter) WriteHeader(statusCode int) { t.writer.WriteHeader(statusCode) t.statusCode = statusCode + t.statusLine = http.StatusText(t.statusCode) } -func (t *trackingResponseWriter) Flush() { - if flusher, ok := t.writer.(http.Flusher); ok { - flusher.Flush() +// wrappedResponseWriter returns a wrapped version of the original +// ResponseWriter and only implements the same combination of additional +// interfaces as the original. +// This implementation is based on https://github.com/felixge/httpsnoop. +func (t *trackingResponseWriter) wrappedResponseWriter() http.ResponseWriter { + var ( + hj, i0 = t.writer.(http.Hijacker) + cn, i1 = t.writer.(http.CloseNotifier) + pu, i2 = t.writer.(http.Pusher) + fl, i3 = t.writer.(http.Flusher) + rf, i4 = t.writer.(io.ReaderFrom) + ) + + switch { + case !i0 && !i1 && !i2 && !i3 && !i4: + return struct { + http.ResponseWriter + }{t} + case !i0 && !i1 && !i2 && !i3 && i4: + return struct { + http.ResponseWriter + io.ReaderFrom + }{t, rf} + case !i0 && !i1 && !i2 && i3 && !i4: + return struct { + http.ResponseWriter + http.Flusher + }{t, fl} + case !i0 && !i1 && !i2 && i3 && i4: + return struct { + http.ResponseWriter + http.Flusher + io.ReaderFrom + }{t, fl, rf} + case !i0 && !i1 && i2 && !i3 && !i4: + return struct { + http.ResponseWriter + http.Pusher + }{t, pu} + case !i0 && !i1 && i2 && !i3 && i4: + return struct { + http.ResponseWriter + http.Pusher + io.ReaderFrom + }{t, pu, rf} + case !i0 && !i1 && i2 && i3 && !i4: + return struct { + http.ResponseWriter + http.Pusher + http.Flusher + }{t, pu, fl} + case !i0 && !i1 && i2 && i3 && i4: + return struct { + http.ResponseWriter + http.Pusher + http.Flusher + io.ReaderFrom + }{t, pu, fl, rf} + case !i0 && i1 && !i2 && !i3 && !i4: + return struct { + http.ResponseWriter + http.CloseNotifier + }{t, cn} + case !i0 && i1 && !i2 && !i3 && i4: + return struct { + http.ResponseWriter + http.CloseNotifier + io.ReaderFrom + }{t, cn, rf} + case !i0 && i1 && !i2 && i3 && !i4: + return struct { + http.ResponseWriter + http.CloseNotifier + http.Flusher + }{t, cn, fl} + case !i0 && i1 && !i2 && i3 && i4: + return struct { + http.ResponseWriter + http.CloseNotifier + http.Flusher + io.ReaderFrom + }{t, cn, fl, rf} + case !i0 && i1 && i2 && !i3 && !i4: + return struct { + http.ResponseWriter + http.CloseNotifier + http.Pusher + }{t, cn, pu} + case !i0 && i1 && i2 && !i3 && i4: + return struct { + http.ResponseWriter + http.CloseNotifier + http.Pusher + io.ReaderFrom + }{t, cn, pu, rf} + case !i0 && i1 && i2 && i3 && !i4: + return struct { + http.ResponseWriter + http.CloseNotifier + http.Pusher + http.Flusher + }{t, cn, pu, fl} + case !i0 && i1 && i2 && i3 && i4: + return struct { + http.ResponseWriter + http.CloseNotifier + http.Pusher + http.Flusher + io.ReaderFrom + }{t, cn, pu, fl, rf} + case i0 && !i1 && !i2 && !i3 && !i4: + return struct { + http.ResponseWriter + http.Hijacker + }{t, hj} + case i0 && !i1 && !i2 && !i3 && i4: + return struct { + http.ResponseWriter + http.Hijacker + io.ReaderFrom + }{t, hj, rf} + case i0 && !i1 && !i2 && i3 && !i4: + return struct { + http.ResponseWriter + http.Hijacker + http.Flusher + }{t, hj, fl} + case i0 && !i1 && !i2 && i3 && i4: + return struct { + http.ResponseWriter + http.Hijacker + http.Flusher + io.ReaderFrom + }{t, hj, fl, rf} + case i0 && !i1 && i2 && !i3 && !i4: + return struct { + http.ResponseWriter + http.Hijacker + http.Pusher + }{t, hj, pu} + case i0 && !i1 && i2 && !i3 && i4: + return struct { + http.ResponseWriter + http.Hijacker + http.Pusher + io.ReaderFrom + }{t, hj, pu, rf} + case i0 && !i1 && i2 && i3 && !i4: + return struct { + http.ResponseWriter + http.Hijacker + http.Pusher + http.Flusher + }{t, hj, pu, fl} + case i0 && !i1 && i2 && i3 && i4: + return struct { + http.ResponseWriter + http.Hijacker + http.Pusher + http.Flusher + io.ReaderFrom + }{t, hj, pu, fl, rf} + case i0 && i1 && !i2 && !i3 && !i4: + return struct { + http.ResponseWriter + http.Hijacker + http.CloseNotifier + }{t, hj, cn} + case i0 && i1 && !i2 && !i3 && i4: + return struct { + http.ResponseWriter + http.Hijacker + http.CloseNotifier + io.ReaderFrom + }{t, hj, cn, rf} + case i0 && i1 && !i2 && i3 && !i4: + return struct { + http.ResponseWriter + http.Hijacker + http.CloseNotifier + http.Flusher + }{t, hj, cn, fl} + case i0 && i1 && !i2 && i3 && i4: + return struct { + http.ResponseWriter + http.Hijacker + http.CloseNotifier + http.Flusher + io.ReaderFrom + }{t, hj, cn, fl, rf} + case i0 && i1 && i2 && !i3 && !i4: + return struct { + http.ResponseWriter + http.Hijacker + http.CloseNotifier + http.Pusher + }{t, hj, cn, pu} + case i0 && i1 && i2 && !i3 && i4: + return struct { + http.ResponseWriter + http.Hijacker + http.CloseNotifier + http.Pusher + io.ReaderFrom + }{t, hj, cn, pu, rf} + case i0 && i1 && i2 && i3 && !i4: + return struct { + http.ResponseWriter + http.Hijacker + http.CloseNotifier + http.Pusher + http.Flusher + }{t, hj, cn, pu, fl} + case i0 && i1 && i2 && i3 && i4: + return struct { + http.ResponseWriter + http.Hijacker + http.CloseNotifier + http.Pusher + http.Flusher + io.ReaderFrom + }{t, hj, cn, pu, fl, rf} + default: + return struct { + http.ResponseWriter + }{t} } } diff --git a/vendor/go.opencensus.io/plugin/ochttp/span_annotating_client_trace.go b/vendor/go.opencensus.io/plugin/ochttp/span_annotating_client_trace.go new file mode 100644 index 000000000..05c6c56cc --- /dev/null +++ b/vendor/go.opencensus.io/plugin/ochttp/span_annotating_client_trace.go @@ -0,0 +1,169 @@ +// Copyright 2018, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ochttp + +import ( + "crypto/tls" + "net/http" + "net/http/httptrace" + "strings" + + "go.opencensus.io/trace" +) + +type spanAnnotator struct { + sp *trace.Span +} + +// TODO: Remove NewSpanAnnotator at the next release. + +// NewSpanAnnotator returns a httptrace.ClientTrace which annotates +// all emitted httptrace events on the provided Span. +// Deprecated: Use NewSpanAnnotatingClientTrace instead +func NewSpanAnnotator(r *http.Request, s *trace.Span) *httptrace.ClientTrace { + return NewSpanAnnotatingClientTrace(r, s) +} + +// NewSpanAnnotatingClientTrace returns a httptrace.ClientTrace which annotates +// all emitted httptrace events on the provided Span. +func NewSpanAnnotatingClientTrace(_ *http.Request, s *trace.Span) *httptrace.ClientTrace { + sa := spanAnnotator{sp: s} + + return &httptrace.ClientTrace{ + GetConn: sa.getConn, + GotConn: sa.gotConn, + PutIdleConn: sa.putIdleConn, + GotFirstResponseByte: sa.gotFirstResponseByte, + Got100Continue: sa.got100Continue, + DNSStart: sa.dnsStart, + DNSDone: sa.dnsDone, + ConnectStart: sa.connectStart, + ConnectDone: sa.connectDone, + TLSHandshakeStart: sa.tlsHandshakeStart, + TLSHandshakeDone: sa.tlsHandshakeDone, + WroteHeaders: sa.wroteHeaders, + Wait100Continue: sa.wait100Continue, + WroteRequest: sa.wroteRequest, + } +} + +func (s spanAnnotator) getConn(hostPort string) { + attrs := []trace.Attribute{ + trace.StringAttribute("httptrace.get_connection.host_port", hostPort), + } + s.sp.Annotate(attrs, "GetConn") +} + +func (s spanAnnotator) gotConn(info httptrace.GotConnInfo) { + attrs := []trace.Attribute{ + trace.BoolAttribute("httptrace.got_connection.reused", info.Reused), + trace.BoolAttribute("httptrace.got_connection.was_idle", info.WasIdle), + } + if info.WasIdle { + attrs = append(attrs, + trace.StringAttribute("httptrace.got_connection.idle_time", info.IdleTime.String())) + } + s.sp.Annotate(attrs, "GotConn") +} + +// PutIdleConn implements a httptrace.ClientTrace hook +func (s spanAnnotator) putIdleConn(err error) { + var attrs []trace.Attribute + if err != nil { + attrs = append(attrs, + trace.StringAttribute("httptrace.put_idle_connection.error", err.Error())) + } + s.sp.Annotate(attrs, "PutIdleConn") +} + +func (s spanAnnotator) gotFirstResponseByte() { + s.sp.Annotate(nil, "GotFirstResponseByte") +} + +func (s spanAnnotator) got100Continue() { + s.sp.Annotate(nil, "Got100Continue") +} + +func (s spanAnnotator) dnsStart(info httptrace.DNSStartInfo) { + attrs := []trace.Attribute{ + trace.StringAttribute("httptrace.dns_start.host", info.Host), + } + s.sp.Annotate(attrs, "DNSStart") +} + +func (s spanAnnotator) dnsDone(info httptrace.DNSDoneInfo) { + var addrs []string + for _, addr := range info.Addrs { + addrs = append(addrs, addr.String()) + } + attrs := []trace.Attribute{ + trace.StringAttribute("httptrace.dns_done.addrs", strings.Join(addrs, " , ")), + } + if info.Err != nil { + attrs = append(attrs, + trace.StringAttribute("httptrace.dns_done.error", info.Err.Error())) + } + s.sp.Annotate(attrs, "DNSDone") +} + +func (s spanAnnotator) connectStart(network, addr string) { + attrs := []trace.Attribute{ + trace.StringAttribute("httptrace.connect_start.network", network), + trace.StringAttribute("httptrace.connect_start.addr", addr), + } + s.sp.Annotate(attrs, "ConnectStart") +} + +func (s spanAnnotator) connectDone(network, addr string, err error) { + attrs := []trace.Attribute{ + trace.StringAttribute("httptrace.connect_done.network", network), + trace.StringAttribute("httptrace.connect_done.addr", addr), + } + if err != nil { + attrs = append(attrs, + trace.StringAttribute("httptrace.connect_done.error", err.Error())) + } + s.sp.Annotate(attrs, "ConnectDone") +} + +func (s spanAnnotator) tlsHandshakeStart() { + s.sp.Annotate(nil, "TLSHandshakeStart") +} + +func (s spanAnnotator) tlsHandshakeDone(_ tls.ConnectionState, err error) { + var attrs []trace.Attribute + if err != nil { + attrs = append(attrs, + trace.StringAttribute("httptrace.tls_handshake_done.error", err.Error())) + } + s.sp.Annotate(attrs, "TLSHandshakeDone") +} + +func (s spanAnnotator) wroteHeaders() { + s.sp.Annotate(nil, "WroteHeaders") +} + +func (s spanAnnotator) wait100Continue() { + s.sp.Annotate(nil, "Wait100Continue") +} + +func (s spanAnnotator) wroteRequest(info httptrace.WroteRequestInfo) { + var attrs []trace.Attribute + if info.Err != nil { + attrs = append(attrs, + trace.StringAttribute("httptrace.wrote_request.error", info.Err.Error())) + } + s.sp.Annotate(attrs, "WroteRequest") +} diff --git a/vendor/go.opencensus.io/plugin/ochttp/stats.go b/vendor/go.opencensus.io/plugin/ochttp/stats.go index 803a606f2..ee3729040 100644 --- a/vendor/go.opencensus.io/plugin/ochttp/stats.go +++ b/vendor/go.opencensus.io/plugin/ochttp/stats.go @@ -20,20 +20,67 @@ import ( "go.opencensus.io/tag" ) +// Deprecated: client HTTP measures. +var ( + // Deprecated: Use a Count aggregation over one of the other client measures to achieve the same effect. + ClientRequestCount = stats.Int64( + "opencensus.io/http/client/request_count", + "Number of HTTP requests started", + stats.UnitDimensionless) + // Deprecated: Use ClientSentBytes. + ClientRequestBytes = stats.Int64( + "opencensus.io/http/client/request_bytes", + "HTTP request body size if set as ContentLength (uncompressed)", + stats.UnitBytes) + // Deprecated: Use ClientReceivedBytes. + ClientResponseBytes = stats.Int64( + "opencensus.io/http/client/response_bytes", + "HTTP response body size (uncompressed)", + stats.UnitBytes) + // Deprecated: Use ClientRoundtripLatency. + ClientLatency = stats.Float64( + "opencensus.io/http/client/latency", + "End-to-end latency", + stats.UnitMilliseconds) +) + // The following client HTTP measures are supported for use in custom views. var ( - ClientRequestCount = stats.Int64("opencensus.io/http/client/request_count", "Number of HTTP requests started", stats.UnitNone) - ClientRequestBytes = stats.Int64("opencensus.io/http/client/request_bytes", "HTTP request body size if set as ContentLength (uncompressed)", stats.UnitBytes) - ClientResponseBytes = stats.Int64("opencensus.io/http/client/response_bytes", "HTTP response body size (uncompressed)", stats.UnitBytes) - ClientLatency = stats.Float64("opencensus.io/http/client/latency", "End-to-end latency", stats.UnitMilliseconds) + ClientSentBytes = stats.Int64( + "opencensus.io/http/client/sent_bytes", + "Total bytes sent in request body (not including headers)", + stats.UnitBytes, + ) + ClientReceivedBytes = stats.Int64( + "opencensus.io/http/client/received_bytes", + "Total bytes received in response bodies (not including headers but including error responses with bodies)", + stats.UnitBytes, + ) + ClientRoundtripLatency = stats.Float64( + "opencensus.io/http/client/roundtrip_latency", + "Time between first byte of request headers sent to last byte of response received, or terminal error", + stats.UnitMilliseconds, + ) ) // The following server HTTP measures are supported for use in custom views: var ( - ServerRequestCount = stats.Int64("opencensus.io/http/server/request_count", "Number of HTTP requests started", stats.UnitNone) - ServerRequestBytes = stats.Int64("opencensus.io/http/server/request_bytes", "HTTP request body size if set as ContentLength (uncompressed)", stats.UnitBytes) - ServerResponseBytes = stats.Int64("opencensus.io/http/server/response_bytes", "HTTP response body size (uncompressed)", stats.UnitBytes) - ServerLatency = stats.Float64("opencensus.io/http/server/latency", "End-to-end latency", stats.UnitMilliseconds) + ServerRequestCount = stats.Int64( + "opencensus.io/http/server/request_count", + "Number of HTTP requests started", + stats.UnitDimensionless) + ServerRequestBytes = stats.Int64( + "opencensus.io/http/server/request_bytes", + "HTTP request body size if set as ContentLength (uncompressed)", + stats.UnitBytes) + ServerResponseBytes = stats.Int64( + "opencensus.io/http/server/response_bytes", + "HTTP response body size (uncompressed)", + stats.UnitBytes) + ServerLatency = stats.Float64( + "opencensus.io/http/server/latency", + "End-to-end latency", + stats.UnitMilliseconds) ) // The following tags are applied to stats recorded by this package. Host, Path @@ -41,28 +88,89 @@ var ( // ClientRequestCount or ServerRequestCount, since it is recorded before the status is known. var ( // Host is the value of the HTTP Host header. - Host, _ = tag.NewKey("http.host") + // + // The value of this tag can be controlled by the HTTP client, so you need + // to watch out for potentially generating high-cardinality labels in your + // metrics backend if you use this tag in views. + Host = tag.MustNewKey("http.host") // StatusCode is the numeric HTTP response status code, // or "error" if a transport error occurred and no status code was read. - StatusCode, _ = tag.NewKey("http.status") + StatusCode = tag.MustNewKey("http.status") // Path is the URL path (not including query string) in the request. - Path, _ = tag.NewKey("http.path") + // + // The value of this tag can be controlled by the HTTP client, so you need + // to watch out for potentially generating high-cardinality labels in your + // metrics backend if you use this tag in views. + Path = tag.MustNewKey("http.path") // Method is the HTTP method of the request, capitalized (GET, POST, etc.). - Method, _ = tag.NewKey("http.method") + Method = tag.MustNewKey("http.method") + + // KeyServerRoute is a low cardinality string representing the logical + // handler of the request. This is usually the pattern registered on the a + // ServeMux (or similar string). + KeyServerRoute = tag.MustNewKey("http_server_route") +) + +// Client tag keys. +var ( + // KeyClientMethod is the HTTP method, capitalized (i.e. GET, POST, PUT, DELETE, etc.). + KeyClientMethod = tag.MustNewKey("http_client_method") + // KeyClientPath is the URL path (not including query string). + KeyClientPath = tag.MustNewKey("http_client_path") + // KeyClientStatus is the HTTP status code as an integer (e.g. 200, 404, 500.), or "error" if no response status line was received. + KeyClientStatus = tag.MustNewKey("http_client_status") + // KeyClientHost is the value of the request Host header. + KeyClientHost = tag.MustNewKey("http_client_host") ) // Default distributions used by views in this package. var ( - DefaultSizeDistribution = view.Distribution(0, 1024, 2048, 4096, 16384, 65536, 262144, 1048576, 4194304, 16777216, 67108864, 268435456, 1073741824, 4294967296) - DefaultLatencyDistribution = view.Distribution(0, 1, 2, 3, 4, 5, 6, 8, 10, 13, 16, 20, 25, 30, 40, 50, 65, 80, 100, 130, 160, 200, 250, 300, 400, 500, 650, 800, 1000, 2000, 5000, 10000, 20000, 50000, 100000) + DefaultSizeDistribution = view.Distribution(1024, 2048, 4096, 16384, 65536, 262144, 1048576, 4194304, 16777216, 67108864, 268435456, 1073741824, 4294967296) + DefaultLatencyDistribution = view.Distribution(1, 2, 3, 4, 5, 6, 8, 10, 13, 16, 20, 25, 30, 40, 50, 65, 80, 100, 130, 160, 200, 250, 300, 400, 500, 650, 800, 1000, 2000, 5000, 10000, 20000, 50000, 100000) +) + +// Package ochttp provides some convenience views for client measures. +// You still need to register these views for data to actually be collected. +var ( + ClientSentBytesDistribution = &view.View{ + Name: "opencensus.io/http/client/sent_bytes", + Measure: ClientSentBytes, + Aggregation: DefaultSizeDistribution, + Description: "Total bytes sent in request body (not including headers), by HTTP method and response status", + TagKeys: []tag.Key{KeyClientMethod, KeyClientStatus}, + } + + ClientReceivedBytesDistribution = &view.View{ + Name: "opencensus.io/http/client/received_bytes", + Measure: ClientReceivedBytes, + Aggregation: DefaultSizeDistribution, + Description: "Total bytes received in response bodies (not including headers but including error responses with bodies), by HTTP method and response status", + TagKeys: []tag.Key{KeyClientMethod, KeyClientStatus}, + } + + ClientRoundtripLatencyDistribution = &view.View{ + Name: "opencensus.io/http/client/roundtrip_latency", + Measure: ClientRoundtripLatency, + Aggregation: DefaultLatencyDistribution, + Description: "End-to-end latency, by HTTP method and response status", + TagKeys: []tag.Key{KeyClientMethod, KeyClientStatus}, + } + + ClientCompletedCount = &view.View{ + Name: "opencensus.io/http/client/completed_count", + Measure: ClientRoundtripLatency, + Aggregation: view.Count(), + Description: "Count of completed requests, by HTTP method and response status", + TagKeys: []tag.Key{KeyClientMethod, KeyClientStatus}, + } ) -// Package ochttp provides some convenience views. -// You need to subscribe to the views for data to actually be collected. +// Deprecated: Old client Views. var ( + // Deprecated: No direct replacement, but see ClientCompletedCount. ClientRequestCountView = &view.View{ Name: "opencensus.io/http/client/request_count", Description: "Count of HTTP requests started", @@ -70,43 +178,52 @@ var ( Aggregation: view.Count(), } + // Deprecated: Use ClientSentBytesDistribution. ClientRequestBytesView = &view.View{ Name: "opencensus.io/http/client/request_bytes", Description: "Size distribution of HTTP request body", - Measure: ClientRequestBytes, + Measure: ClientSentBytes, Aggregation: DefaultSizeDistribution, } + // Deprecated: Use ClientReceivedBytesDistribution instead. ClientResponseBytesView = &view.View{ Name: "opencensus.io/http/client/response_bytes", Description: "Size distribution of HTTP response body", - Measure: ClientResponseBytes, + Measure: ClientReceivedBytes, Aggregation: DefaultSizeDistribution, } + // Deprecated: Use ClientRoundtripLatencyDistribution instead. ClientLatencyView = &view.View{ Name: "opencensus.io/http/client/latency", Description: "Latency distribution of HTTP requests", - Measure: ClientLatency, + Measure: ClientRoundtripLatency, Aggregation: DefaultLatencyDistribution, } + // Deprecated: Use ClientCompletedCount instead. ClientRequestCountByMethod = &view.View{ Name: "opencensus.io/http/client/request_count_by_method", Description: "Client request count by HTTP method", TagKeys: []tag.Key{Method}, - Measure: ClientRequestCount, + Measure: ClientSentBytes, Aggregation: view.Count(), } + // Deprecated: Use ClientCompletedCount instead. ClientResponseCountByStatusCode = &view.View{ Name: "opencensus.io/http/client/response_count_by_status_code", Description: "Client response count by status code", TagKeys: []tag.Key{StatusCode}, - Measure: ClientLatency, + Measure: ClientRoundtripLatency, Aggregation: view.Count(), } +) +// Package ochttp provides some convenience views for server measures. +// You still need to register these views for data to actually be collected. +var ( ServerRequestCountView = &view.View{ Name: "opencensus.io/http/server/request_count", Description: "Count of HTTP requests started", @@ -153,6 +270,7 @@ var ( ) // DefaultClientViews are the default client views provided by this package. +// Deprecated: No replacement. Register the views you would like individually. var DefaultClientViews = []*view.View{ ClientRequestCountView, ClientRequestBytesView, @@ -163,6 +281,7 @@ var DefaultClientViews = []*view.View{ } // DefaultServerViews are the default server views provided by this package. +// Deprecated: No replacement. Register the views you would like individually. var DefaultServerViews = []*view.View{ ServerRequestCountView, ServerRequestBytesView, diff --git a/vendor/go.opencensus.io/plugin/ochttp/trace.go b/vendor/go.opencensus.io/plugin/ochttp/trace.go index 10d4a7060..ed3a5db56 100644 --- a/vendor/go.opencensus.io/plugin/ochttp/trace.go +++ b/vendor/go.opencensus.io/plugin/ochttp/trace.go @@ -17,7 +17,7 @@ package ochttp import ( "io" "net/http" - "net/url" + "net/http/httptrace" "go.opencensus.io/plugin/ochttp/propagation/b3" "go.opencensus.io/trace" @@ -34,14 +34,17 @@ const ( HostAttribute = "http.host" MethodAttribute = "http.method" PathAttribute = "http.path" + URLAttribute = "http.url" UserAgentAttribute = "http.user_agent" StatusCodeAttribute = "http.status_code" ) type traceTransport struct { - base http.RoundTripper - startOptions trace.StartOptions - format propagation.HTTPFormat + base http.RoundTripper + startOptions trace.StartOptions + format propagation.HTTPFormat + formatSpanName func(*http.Request) string + newClientTrace func(*http.Request, *trace.Span) *httptrace.ClientTrace } // TODO(jbd): Add message events for request and response size. @@ -50,32 +53,49 @@ type traceTransport struct { // The created span can follow a parent span, if a parent is presented in // the request's context. func (t *traceTransport) RoundTrip(req *http.Request) (*http.Response, error) { - name := spanNameFromURL(req.URL) + name := t.formatSpanName(req) // TODO(jbd): Discuss whether we want to prefix // outgoing requests with Sent. - parent := trace.FromContext(req.Context()) - span := trace.NewSpan(name, parent, t.startOptions) - req = req.WithContext(trace.WithSpan(req.Context(), span)) + ctx, span := trace.StartSpan(req.Context(), name, + trace.WithSampler(t.startOptions.Sampler), + trace.WithSpanKind(trace.SpanKindClient)) + + if t.newClientTrace != nil { + req = req.WithContext(httptrace.WithClientTrace(ctx, t.newClientTrace(req, span))) + } else { + req = req.WithContext(ctx) + } if t.format != nil { + // SpanContextToRequest will modify its Request argument, which is + // contrary to the contract for http.RoundTripper, so we need to + // pass it a copy of the Request. + // However, the Request struct itself was already copied by + // the WithContext calls above and so we just need to copy the header. + header := make(http.Header) + for k, v := range req.Header { + header[k] = v + } + req.Header = header t.format.SpanContextToRequest(span.SpanContext(), req) } span.AddAttributes(requestAttrs(req)...) resp, err := t.base.RoundTrip(req) if err != nil { - span.SetStatus(trace.Status{Code: 2, Message: err.Error()}) + span.SetStatus(trace.Status{Code: trace.StatusCodeUnknown, Message: err.Error()}) span.End() return resp, err } span.AddAttributes(responseAttrs(resp)...) - span.SetStatus(status(resp.StatusCode)) + span.SetStatus(TraceStatus(resp.StatusCode, resp.Status)) // span.End() will be invoked after // a read from resp.Body returns io.EOF or when // resp.Body.Close() is invoked. - resp.Body = &bodyTracker{rc: resp.Body, span: span} + bt := &bodyTracker{rc: resp.Body, span: span} + resp.Body = wrappedBody(bt, resp.Body) return resp, err } @@ -126,17 +146,26 @@ func (t *traceTransport) CancelRequest(req *http.Request) { } } -func spanNameFromURL(u *url.URL) string { - return u.Path +func spanNameFromURL(req *http.Request) string { + return req.URL.Path } func requestAttrs(r *http.Request) []trace.Attribute { - return []trace.Attribute{ + userAgent := r.UserAgent() + + attrs := make([]trace.Attribute, 0, 5) + attrs = append(attrs, trace.StringAttribute(PathAttribute, r.URL.Path), - trace.StringAttribute(HostAttribute, r.URL.Host), + trace.StringAttribute(URLAttribute, r.URL.String()), + trace.StringAttribute(HostAttribute, r.Host), trace.StringAttribute(MethodAttribute, r.Method), - trace.StringAttribute(UserAgentAttribute, r.UserAgent()), + ) + + if userAgent != "" { + attrs = append(attrs, trace.StringAttribute(UserAgentAttribute, userAgent)) } + + return attrs } func responseAttrs(resp *http.Response) []trace.Attribute { @@ -145,71 +174,71 @@ func responseAttrs(resp *http.Response) []trace.Attribute { } } -func status(statusCode int) trace.Status { +// TraceStatus is a utility to convert the HTTP status code to a trace.Status that +// represents the outcome as closely as possible. +func TraceStatus(httpStatusCode int, statusLine string) trace.Status { var code int32 - if statusCode < 200 || statusCode >= 400 { - code = codeUnknown + if httpStatusCode < 200 || httpStatusCode >= 400 { + code = trace.StatusCodeUnknown } - switch statusCode { + switch httpStatusCode { case 499: - code = codeCancelled + code = trace.StatusCodeCancelled case http.StatusBadRequest: - code = codeInvalidArgument + code = trace.StatusCodeInvalidArgument + case http.StatusUnprocessableEntity: + code = trace.StatusCodeInvalidArgument case http.StatusGatewayTimeout: - code = codeDeadlineExceeded + code = trace.StatusCodeDeadlineExceeded case http.StatusNotFound: - code = codeNotFound + code = trace.StatusCodeNotFound case http.StatusForbidden: - code = codePermissionDenied + code = trace.StatusCodePermissionDenied case http.StatusUnauthorized: // 401 is actually unauthenticated. - code = codeUnathenticated + code = trace.StatusCodeUnauthenticated case http.StatusTooManyRequests: - code = codeResourceExhausted + code = trace.StatusCodeResourceExhausted case http.StatusNotImplemented: - code = codeUnimplemented + code = trace.StatusCodeUnimplemented case http.StatusServiceUnavailable: - code = codeUnavailable + code = trace.StatusCodeUnavailable + case http.StatusOK: + code = trace.StatusCodeOK + case http.StatusConflict: + code = trace.StatusCodeAlreadyExists } + return trace.Status{Code: code, Message: codeToStr[code]} } -// TODO(jbd): Provide status codes from trace package. -const ( - codeOK = 0 - codeCancelled = 1 - codeUnknown = 2 - codeInvalidArgument = 3 - codeDeadlineExceeded = 4 - codeNotFound = 5 - codeAlreadyExists = 6 - codePermissionDenied = 7 - codeResourceExhausted = 8 - codeFailedPrecondition = 9 - codeAborted = 10 - codeOutOfRange = 11 - codeUnimplemented = 12 - codeInternal = 13 - codeUnavailable = 14 - codeDataLoss = 15 - codeUnathenticated = 16 -) - var codeToStr = map[int32]string{ - codeOK: `"OK"`, - codeCancelled: `"CANCELLED"`, - codeUnknown: `"UNKNOWN"`, - codeInvalidArgument: `"INVALID_ARGUMENT"`, - codeDeadlineExceeded: `"DEADLINE_EXCEEDED"`, - codeNotFound: `"NOT_FOUND"`, - codeAlreadyExists: `"ALREADY_EXISTS"`, - codePermissionDenied: `"PERMISSION_DENIED"`, - codeResourceExhausted: `"RESOURCE_EXHAUSTED"`, - codeFailedPrecondition: `"FAILED_PRECONDITION"`, - codeAborted: `"ABORTED"`, - codeOutOfRange: `"OUT_OF_RANGE"`, - codeUnimplemented: `"UNIMPLEMENTED"`, - codeInternal: `"INTERNAL"`, - codeUnavailable: `"UNAVAILABLE"`, - codeDataLoss: `"DATA_LOSS"`, - codeUnathenticated: `"UNAUTHENTICATED"`, + trace.StatusCodeOK: `OK`, + trace.StatusCodeCancelled: `CANCELLED`, + trace.StatusCodeUnknown: `UNKNOWN`, + trace.StatusCodeInvalidArgument: `INVALID_ARGUMENT`, + trace.StatusCodeDeadlineExceeded: `DEADLINE_EXCEEDED`, + trace.StatusCodeNotFound: `NOT_FOUND`, + trace.StatusCodeAlreadyExists: `ALREADY_EXISTS`, + trace.StatusCodePermissionDenied: `PERMISSION_DENIED`, + trace.StatusCodeResourceExhausted: `RESOURCE_EXHAUSTED`, + trace.StatusCodeFailedPrecondition: `FAILED_PRECONDITION`, + trace.StatusCodeAborted: `ABORTED`, + trace.StatusCodeOutOfRange: `OUT_OF_RANGE`, + trace.StatusCodeUnimplemented: `UNIMPLEMENTED`, + trace.StatusCodeInternal: `INTERNAL`, + trace.StatusCodeUnavailable: `UNAVAILABLE`, + trace.StatusCodeDataLoss: `DATA_LOSS`, + trace.StatusCodeUnauthenticated: `UNAUTHENTICATED`, +} + +func isHealthEndpoint(path string) bool { + // Health checking is pretty frequent and + // traces collected for health endpoints + // can be extremely noisy and expensive. + // Disable canonical health checking endpoints + // like /healthz and /_ah/health for now. + if path == "/healthz" || path == "/_ah/health" { + return true + } + return false } diff --git a/vendor/go.opencensus.io/plugin/ochttp/wrapped_body.go b/vendor/go.opencensus.io/plugin/ochttp/wrapped_body.go new file mode 100644 index 000000000..7d75cae2b --- /dev/null +++ b/vendor/go.opencensus.io/plugin/ochttp/wrapped_body.go @@ -0,0 +1,44 @@ +// Copyright 2019, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ochttp + +import ( + "io" +) + +// wrappedBody returns a wrapped version of the original +// Body and only implements the same combination of additional +// interfaces as the original. +func wrappedBody(wrapper io.ReadCloser, body io.ReadCloser) io.ReadCloser { + var ( + wr, i0 = body.(io.Writer) + ) + switch { + case !i0: + return struct { + io.ReadCloser + }{wrapper} + + case i0: + return struct { + io.ReadCloser + io.Writer + }{wrapper, wr} + default: + return struct { + io.ReadCloser + }{wrapper} + } +} diff --git a/vendor/go.opencensus.io/resource/resource.go b/vendor/go.opencensus.io/resource/resource.go new file mode 100644 index 000000000..b1764e1d3 --- /dev/null +++ b/vendor/go.opencensus.io/resource/resource.go @@ -0,0 +1,164 @@ +// Copyright 2018, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package resource provides functionality for resource, which capture +// identifying information about the entities for which signals are exported. +package resource + +import ( + "context" + "fmt" + "os" + "regexp" + "sort" + "strconv" + "strings" +) + +// Environment variables used by FromEnv to decode a resource. +const ( + EnvVarType = "OC_RESOURCE_TYPE" + EnvVarLabels = "OC_RESOURCE_LABELS" +) + +// Resource describes an entity about which identifying information and metadata is exposed. +// For example, a type "k8s.io/container" may hold labels describing the pod name and namespace. +type Resource struct { + Type string + Labels map[string]string +} + +// EncodeLabels encodes a labels map to a string as provided via the OC_RESOURCE_LABELS environment variable. +func EncodeLabels(labels map[string]string) string { + sortedKeys := make([]string, 0, len(labels)) + for k := range labels { + sortedKeys = append(sortedKeys, k) + } + sort.Strings(sortedKeys) + + s := "" + for i, k := range sortedKeys { + if i > 0 { + s += "," + } + s += k + "=" + strconv.Quote(labels[k]) + } + return s +} + +var labelRegex = regexp.MustCompile(`^\s*([[:ascii:]]{1,256}?)=("[[:ascii:]]{0,256}?")\s*,`) + +// DecodeLabels decodes a serialized label map as used in the OC_RESOURCE_LABELS variable. +// A list of labels of the form `="",="",...` is accepted. +// Domain names and paths are accepted as label keys. +// Most users will want to use FromEnv instead. +func DecodeLabels(s string) (map[string]string, error) { + m := map[string]string{} + // Ensure a trailing comma, which allows us to keep the regex simpler + s = strings.TrimRight(strings.TrimSpace(s), ",") + "," + + for len(s) > 0 { + match := labelRegex.FindStringSubmatch(s) + if len(match) == 0 { + return nil, fmt.Errorf("invalid label formatting, remainder: %s", s) + } + v := match[2] + if v == "" { + v = match[3] + } else { + var err error + if v, err = strconv.Unquote(v); err != nil { + return nil, fmt.Errorf("invalid label formatting, remainder: %s, err: %s", s, err) + } + } + m[match[1]] = v + + s = s[len(match[0]):] + } + return m, nil +} + +// FromEnv is a detector that loads resource information from the OC_RESOURCE_TYPE +// and OC_RESOURCE_labelS environment variables. +func FromEnv(context.Context) (*Resource, error) { + res := &Resource{ + Type: strings.TrimSpace(os.Getenv(EnvVarType)), + } + labels := strings.TrimSpace(os.Getenv(EnvVarLabels)) + if labels == "" { + return res, nil + } + var err error + if res.Labels, err = DecodeLabels(labels); err != nil { + return nil, err + } + return res, nil +} + +var _ Detector = FromEnv + +// merge resource information from b into a. In case of a collision, a takes precedence. +func merge(a, b *Resource) *Resource { + if a == nil { + return b + } + if b == nil { + return a + } + res := &Resource{ + Type: a.Type, + Labels: map[string]string{}, + } + if res.Type == "" { + res.Type = b.Type + } + for k, v := range b.Labels { + res.Labels[k] = v + } + // Labels from resource a overwrite labels from resource b. + for k, v := range a.Labels { + res.Labels[k] = v + } + return res +} + +// Detector attempts to detect resource information. +// If the detector cannot find resource information, the returned resource is nil but no +// error is returned. +// An error is only returned on unexpected failures. +type Detector func(context.Context) (*Resource, error) + +// MultiDetector returns a Detector that calls all input detectors in order and +// merges each result with the previous one. In case a type of label key is already set, +// the first set value is takes precedence. +// It returns on the first error that a sub-detector encounters. +func MultiDetector(detectors ...Detector) Detector { + return func(ctx context.Context) (*Resource, error) { + return detectAll(ctx, detectors...) + } +} + +// detectall calls all input detectors sequentially an merges each result with the previous one. +// It returns on the first error that a sub-detector encounters. +func detectAll(ctx context.Context, detectors ...Detector) (*Resource, error) { + var res *Resource + for _, d := range detectors { + r, err := d(ctx) + if err != nil { + return nil, err + } + res = merge(res, r) + } + return res, nil +} diff --git a/vendor/go.opencensus.io/stats/doc.go b/vendor/go.opencensus.io/stats/doc.go index 7a8a62c14..00d473ee0 100644 --- a/vendor/go.opencensus.io/stats/doc.go +++ b/vendor/go.opencensus.io/stats/doc.go @@ -21,35 +21,49 @@ aggregate the collected data, and export the aggregated data. Measures -A measure represents a type of metric to be tracked and recorded. +A measure represents a type of data point to be tracked and recorded. For example, latency, request Mb/s, and response Mb/s are measures to collect from a server. -Each measure needs to be registered before being used. Measure -constructors such as Int64 and Float64 automatically +Measure constructors such as Int64 and Float64 automatically register the measure by the given name. Each registered measure needs to be unique by name. Measures also have a description and a unit. -Libraries can define and export measures for their end users to -create views and collect instrumentation data. +Libraries can define and export measures. Application authors can then +create views and collect and break down measures by the tags they are +interested in. Recording measurements Measurement is a data point to be collected for a measure. For example, for a latency (ms) measure, 100 is a measurement that represents a 100ms -latency event. Users collect data points on the existing measures with +latency event. Measurements are created from measures with the current context. Tags from the current context are recorded with the measurements if they are any. -Recorded measurements are dropped immediately if user is not aggregating -them via views. Users don't necessarily need to conditionally enable/disable +Recorded measurements are dropped immediately if no views are registered for them. +There is usually no need to conditionally enable and disable recording to reduce cost. Recording of measurements is cheap. -Libraries can always record measurements, and end-users can later decide +Libraries can always record measurements, and applications can later decide on which measurements they want to collect by registering views. This allows libraries to turn on the instrumentation by default. + +Exemplars + +For a given recorded measurement, the associated exemplar is a diagnostic map +that gives more information about the measurement. + +When aggregated using a Distribution aggregation, an exemplar is kept for each +bucket in the Distribution. This allows you to easily find an example of a +measurement that fell into each bucket. + +For example, if you also use the OpenCensus trace package and you +record a measurement with a context that contains a sampled trace span, +then the trace span will be added to the exemplar associated with the measurement. + +When exported to a supporting back end, you should be able to easily navigate +to example traces that fell into each bucket in the Distribution. + */ package stats // import "go.opencensus.io/stats" - -// TODO(acetechnologist): Add a link to the language independent OpenCensus -// spec when it is available. diff --git a/vendor/go.opencensus.io/stats/internal/record.go b/vendor/go.opencensus.io/stats/internal/record.go index 6341eb2ad..36935e629 100644 --- a/vendor/go.opencensus.io/stats/internal/record.go +++ b/vendor/go.opencensus.io/stats/internal/record.go @@ -19,7 +19,7 @@ import ( ) // DefaultRecorder will be called for each Record call. -var DefaultRecorder func(*tag.Map, interface{}) +var DefaultRecorder func(tags *tag.Map, measurement interface{}, attachments map[string]interface{}) // SubscriptionReporter reports when a view subscribed with a measure. var SubscriptionReporter func(measure string) diff --git a/vendor/go.opencensus.io/stats/internal/validation.go b/vendor/go.opencensus.io/stats/internal/validation.go deleted file mode 100644 index b962d524f..000000000 --- a/vendor/go.opencensus.io/stats/internal/validation.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package internal - -const ( - MaxNameLength = 255 -) - -func IsPrintable(str string) bool { - for _, r := range str { - if !(r >= ' ' && r <= '~') { - return false - } - } - return true -} diff --git a/vendor/go.opencensus.io/stats/measure.go b/vendor/go.opencensus.io/stats/measure.go index aa555c209..1ffd3cefc 100644 --- a/vendor/go.opencensus.io/stats/measure.go +++ b/vendor/go.opencensus.io/stats/measure.go @@ -20,19 +20,31 @@ import ( "sync/atomic" ) -// Measure represents a type of metric to be tracked and recorded. -// For example, latency, request Mb/s, and response Mb/s are measures +// Measure represents a single numeric value to be tracked and recorded. +// For example, latency, request bytes, and response bytes could be measures // to collect from a server. // -// Each measure needs to be registered before being used. -// Measure constructors such as Int64 and -// Float64 automatically registers the measure -// by the given name. -// Each registered measure needs to be unique by name. -// Measures also have a description and a unit. +// Measures by themselves have no outside effects. In order to be exported, +// the measure needs to be used in a View. If no Views are defined over a +// measure, there is very little cost in recording it. type Measure interface { + // Name returns the name of this measure. + // + // Measure names are globally unique (among all libraries linked into your program). + // We recommend prefixing the measure name with a domain name relevant to your + // project or application. + // + // Measure names are never sent over the wire or exported to backends. + // They are only used to create Views. Name() string + + // Description returns the human-readable description of this measure. Description() string + + // Unit returns the units for the values this measure takes on. + // + // Units are encoded according to the case-sensitive abbreviations from the + // Unified Code for Units of Measure: http://unitsofmeasure.org/ucum.html Unit() string } @@ -81,8 +93,9 @@ func registerMeasureHandle(name, desc, unit string) *measureDescriptor { // provides methods to create measurements of their kind. For example, Int64Measure // provides M to convert an int64 into a measurement. type Measurement struct { - v float64 - m Measure + v float64 + m Measure + desc *measureDescriptor } // Value returns the value of the Measurement as a float64. diff --git a/vendor/go.opencensus.io/stats/measure_float64.go b/vendor/go.opencensus.io/stats/measure_float64.go index 8de6b5221..f02c1eda8 100644 --- a/vendor/go.opencensus.io/stats/measure_float64.go +++ b/vendor/go.opencensus.io/stats/measure_float64.go @@ -15,38 +15,41 @@ package stats -// Float64Measure is a measure of type float64. +// Float64Measure is a measure for float64 values. type Float64Measure struct { - md *measureDescriptor + desc *measureDescriptor +} + +// M creates a new float64 measurement. +// Use Record to record measurements. +func (m *Float64Measure) M(v float64) Measurement { + return Measurement{ + m: m, + desc: m.desc, + v: v, + } +} + +// Float64 creates a new measure for float64 values. +// +// See the documentation for interface Measure for more guidance on the +// parameters of this function. +func Float64(name, description, unit string) *Float64Measure { + mi := registerMeasureHandle(name, description, unit) + return &Float64Measure{mi} } // Name returns the name of the measure. func (m *Float64Measure) Name() string { - return m.md.name + return m.desc.name } // Description returns the description of the measure. func (m *Float64Measure) Description() string { - return m.md.description + return m.desc.description } // Unit returns the unit of the measure. func (m *Float64Measure) Unit() string { - return m.md.unit -} - -// M creates a new float64 measurement. -// Use Record to record measurements. -func (m *Float64Measure) M(v float64) Measurement { - if !m.md.subscribed() { - return Measurement{} - } - return Measurement{m: m, v: v} -} - -// Float64 creates a new measure of type Float64Measure. -// It never returns an error. -func Float64(name, description, unit string) *Float64Measure { - mi := registerMeasureHandle(name, description, unit) - return &Float64Measure{mi} + return m.desc.unit } diff --git a/vendor/go.opencensus.io/stats/measure_int64.go b/vendor/go.opencensus.io/stats/measure_int64.go index b6fd25f0d..d101d7973 100644 --- a/vendor/go.opencensus.io/stats/measure_int64.go +++ b/vendor/go.opencensus.io/stats/measure_int64.go @@ -15,38 +15,41 @@ package stats -// Int64Measure is a measure of type int64. +// Int64Measure is a measure for int64 values. type Int64Measure struct { - md *measureDescriptor + desc *measureDescriptor +} + +// M creates a new int64 measurement. +// Use Record to record measurements. +func (m *Int64Measure) M(v int64) Measurement { + return Measurement{ + m: m, + desc: m.desc, + v: float64(v), + } +} + +// Int64 creates a new measure for int64 values. +// +// See the documentation for interface Measure for more guidance on the +// parameters of this function. +func Int64(name, description, unit string) *Int64Measure { + mi := registerMeasureHandle(name, description, unit) + return &Int64Measure{mi} } // Name returns the name of the measure. func (m *Int64Measure) Name() string { - return m.md.name + return m.desc.name } // Description returns the description of the measure. func (m *Int64Measure) Description() string { - return m.md.description + return m.desc.description } // Unit returns the unit of the measure. func (m *Int64Measure) Unit() string { - return m.md.unit -} - -// M creates a new int64 measurement. -// Use Record to record measurements. -func (m *Int64Measure) M(v int64) Measurement { - if !m.md.subscribed() { - return Measurement{} - } - return Measurement{m: m, v: float64(v)} -} - -// Int64 creates a new measure of type Int64Measure. -// It never returns an error. -func Int64(name, description, unit string) *Int64Measure { - mi := registerMeasureHandle(name, description, unit) - return &Int64Measure{mi} + return m.desc.unit } diff --git a/vendor/go.opencensus.io/stats/record.go b/vendor/go.opencensus.io/stats/record.go index 98865ff69..ad4691184 100644 --- a/vendor/go.opencensus.io/stats/record.go +++ b/vendor/go.opencensus.io/stats/record.go @@ -18,6 +18,7 @@ package stats import ( "context" + "go.opencensus.io/metric/metricdata" "go.opencensus.io/stats/internal" "go.opencensus.io/tag" ) @@ -30,23 +31,87 @@ func init() { } } -// Record records one or multiple measurements with the same tags at once. +type recordOptions struct { + attachments metricdata.Attachments + mutators []tag.Mutator + measurements []Measurement +} + +// WithAttachments applies provided exemplar attachments. +func WithAttachments(attachments metricdata.Attachments) Options { + return func(ro *recordOptions) { + ro.attachments = attachments + } +} + +// WithTags applies provided tag mutators. +func WithTags(mutators ...tag.Mutator) Options { + return func(ro *recordOptions) { + ro.mutators = mutators + } +} + +// WithMeasurements applies provided measurements. +func WithMeasurements(measurements ...Measurement) Options { + return func(ro *recordOptions) { + ro.measurements = measurements + } +} + +// Options apply changes to recordOptions. +type Options func(*recordOptions) + +func createRecordOption(ros ...Options) *recordOptions { + o := &recordOptions{} + for _, ro := range ros { + ro(o) + } + return o +} + +// Record records one or multiple measurements with the same context at once. // If there are any tags in the context, measurements will be tagged with them. func Record(ctx context.Context, ms ...Measurement) { - if len(ms) == 0 { - return + RecordWithOptions(ctx, WithMeasurements(ms...)) +} + +// RecordWithTags records one or multiple measurements at once. +// +// Measurements will be tagged with the tags in the context mutated by the mutators. +// RecordWithTags is useful if you want to record with tag mutations but don't want +// to propagate the mutations in the context. +func RecordWithTags(ctx context.Context, mutators []tag.Mutator, ms ...Measurement) error { + return RecordWithOptions(ctx, WithTags(mutators...), WithMeasurements(ms...)) +} + +// RecordWithOptions records measurements from the given options (if any) against context +// and tags and attachments in the options (if any). +// If there are any tags in the context, measurements will be tagged with them. +func RecordWithOptions(ctx context.Context, ros ...Options) error { + o := createRecordOption(ros...) + if len(o.measurements) == 0 { + return nil } - var record bool - for _, m := range ms { - if (m != Measurement{}) { + recorder := internal.DefaultRecorder + if recorder == nil { + return nil + } + record := false + for _, m := range o.measurements { + if m.desc.subscribed() { record = true break } } if !record { - return + return nil } - if internal.DefaultRecorder != nil { - internal.DefaultRecorder(tag.FromContext(ctx), ms) + if len(o.mutators) > 0 { + var err error + if ctx, err = tag.New(ctx, o.mutators...); err != nil { + return err + } } + recorder(tag.FromContext(ctx), o.measurements, o.attachments) + return nil } diff --git a/vendor/go.opencensus.io/stats/units.go b/vendor/go.opencensus.io/stats/units.go index d37e2152f..736399652 100644 --- a/vendor/go.opencensus.io/stats/units.go +++ b/vendor/go.opencensus.io/stats/units.go @@ -18,7 +18,9 @@ package stats // Units are encoded according to the case-sensitive abbreviations from the // Unified Code for Units of Measure: http://unitsofmeasure.org/ucum.html const ( - UnitNone = "1" - UnitBytes = "By" - UnitMilliseconds = "ms" + UnitNone = "1" // Deprecated: Use UnitDimensionless. + UnitDimensionless = "1" + UnitBytes = "By" + UnitMilliseconds = "ms" + UnitSeconds = "s" ) diff --git a/vendor/go.opencensus.io/stats/view/aggregation.go b/vendor/go.opencensus.io/stats/view/aggregation.go index b7f169b4a..9d7093728 100644 --- a/vendor/go.opencensus.io/stats/view/aggregation.go +++ b/vendor/go.opencensus.io/stats/view/aggregation.go @@ -82,7 +82,7 @@ func Sum() *Aggregation { // Distribution indicates that the desired aggregation is // a histogram distribution. // -// An distribution aggregation may contain a histogram of the values in the +// A distribution aggregation may contain a histogram of the values in the // population. The bucket boundaries for that histogram are described // by the bounds. This defines len(bounds)+1 buckets. // @@ -99,13 +99,14 @@ func Sum() *Aggregation { // If len(bounds) is 1 then there is no finite buckets, and that single // element is the common boundary of the overflow and underflow buckets. func Distribution(bounds ...float64) *Aggregation { - return &Aggregation{ + agg := &Aggregation{ Type: AggTypeDistribution, Buckets: bounds, - newData: func() AggregationData { - return newDistributionData(bounds) - }, } + agg.newData = func() AggregationData { + return newDistributionData(agg) + } + return agg } // LastValue only reports the last value recorded using this diff --git a/vendor/go.opencensus.io/stats/view/aggregation_data.go b/vendor/go.opencensus.io/stats/view/aggregation_data.go index 88c500bff..f331d456e 100644 --- a/vendor/go.opencensus.io/stats/view/aggregation_data.go +++ b/vendor/go.opencensus.io/stats/view/aggregation_data.go @@ -17,6 +17,9 @@ package view import ( "math" + "time" + + "go.opencensus.io/metric/metricdata" ) // AggregationData represents an aggregated value from a collection. @@ -24,9 +27,10 @@ import ( // Mosts users won't directly access aggregration data. type AggregationData interface { isAggregationData() bool - addSample(v float64) + addSample(v float64, attachments map[string]interface{}, t time.Time) clone() AggregationData equal(other AggregationData) bool + toPoint(t metricdata.Type, time time.Time) metricdata.Point } const epsilon = 1e-9 @@ -41,7 +45,7 @@ type CountData struct { func (a *CountData) isAggregationData() bool { return true } -func (a *CountData) addSample(v float64) { +func (a *CountData) addSample(_ float64, _ map[string]interface{}, _ time.Time) { a.Value = a.Value + 1 } @@ -58,6 +62,15 @@ func (a *CountData) equal(other AggregationData) bool { return a.Value == a2.Value } +func (a *CountData) toPoint(metricType metricdata.Type, t time.Time) metricdata.Point { + switch metricType { + case metricdata.TypeCumulativeInt64: + return metricdata.NewInt64Point(t, a.Value) + default: + panic("unsupported metricdata.Type") + } +} + // SumData is the aggregated data for the Sum aggregation. // A sum aggregation processes data and sums up the recordings. // @@ -68,8 +81,8 @@ type SumData struct { func (a *SumData) isAggregationData() bool { return true } -func (a *SumData) addSample(f float64) { - a.Value += f +func (a *SumData) addSample(v float64, _ map[string]interface{}, _ time.Time) { + a.Value += v } func (a *SumData) clone() AggregationData { @@ -84,26 +97,45 @@ func (a *SumData) equal(other AggregationData) bool { return math.Pow(a.Value-a2.Value, 2) < epsilon } +func (a *SumData) toPoint(metricType metricdata.Type, t time.Time) metricdata.Point { + switch metricType { + case metricdata.TypeCumulativeInt64: + return metricdata.NewInt64Point(t, int64(a.Value)) + case metricdata.TypeCumulativeFloat64: + return metricdata.NewFloat64Point(t, a.Value) + default: + panic("unsupported metricdata.Type") + } +} + // DistributionData is the aggregated data for the // Distribution aggregation. // // Most users won't directly access distribution data. +// +// For a distribution with N bounds, the associated DistributionData will have +// N+1 buckets. type DistributionData struct { - Count int64 // number of data points aggregated - Min float64 // minimum value in the distribution - Max float64 // max value in the distribution - Mean float64 // mean of the distribution - SumOfSquaredDev float64 // sum of the squared deviation from the mean - CountPerBucket []int64 // number of occurrences per bucket - bounds []float64 // histogram distribution of the values + Count int64 // number of data points aggregated + Min float64 // minimum value in the distribution + Max float64 // max value in the distribution + Mean float64 // mean of the distribution + SumOfSquaredDev float64 // sum of the squared deviation from the mean + CountPerBucket []int64 // number of occurrences per bucket + // ExemplarsPerBucket is slice the same length as CountPerBucket containing + // an exemplar for the associated bucket, or nil. + ExemplarsPerBucket []*metricdata.Exemplar + bounds []float64 // histogram distribution of the values } -func newDistributionData(bounds []float64) *DistributionData { +func newDistributionData(agg *Aggregation) *DistributionData { + bucketCount := len(agg.Buckets) + 1 return &DistributionData{ - CountPerBucket: make([]int64, len(bounds)+1), - bounds: bounds, - Min: math.MaxFloat64, - Max: math.SmallestNonzeroFloat64, + CountPerBucket: make([]int64, bucketCount), + ExemplarsPerBucket: make([]*metricdata.Exemplar, bucketCount), + bounds: agg.Buckets, + Min: math.MaxFloat64, + Max: math.SmallestNonzeroFloat64, } } @@ -119,46 +151,62 @@ func (a *DistributionData) variance() float64 { func (a *DistributionData) isAggregationData() bool { return true } -func (a *DistributionData) addSample(f float64) { - if f < a.Min { - a.Min = f +// TODO(songy23): support exemplar attachments. +func (a *DistributionData) addSample(v float64, attachments map[string]interface{}, t time.Time) { + if v < a.Min { + a.Min = v } - if f > a.Max { - a.Max = f + if v > a.Max { + a.Max = v } a.Count++ - a.incrementBucketCount(f) + a.addToBucket(v, attachments, t) if a.Count == 1 { - a.Mean = f + a.Mean = v return } oldMean := a.Mean - a.Mean = a.Mean + (f-a.Mean)/float64(a.Count) - a.SumOfSquaredDev = a.SumOfSquaredDev + (f-oldMean)*(f-a.Mean) + a.Mean = a.Mean + (v-a.Mean)/float64(a.Count) + a.SumOfSquaredDev = a.SumOfSquaredDev + (v-oldMean)*(v-a.Mean) } -func (a *DistributionData) incrementBucketCount(f float64) { - if len(a.bounds) == 0 { - a.CountPerBucket[0]++ - return +func (a *DistributionData) addToBucket(v float64, attachments map[string]interface{}, t time.Time) { + var count *int64 + var i int + var b float64 + for i, b = range a.bounds { + if v < b { + count = &a.CountPerBucket[i] + break + } + } + if count == nil { // Last bucket. + i = len(a.bounds) + count = &a.CountPerBucket[i] + } + *count++ + if exemplar := getExemplar(v, attachments, t); exemplar != nil { + a.ExemplarsPerBucket[i] = exemplar } +} - for i, b := range a.bounds { - if f < b { - a.CountPerBucket[i]++ - return - } +func getExemplar(v float64, attachments map[string]interface{}, t time.Time) *metricdata.Exemplar { + if len(attachments) == 0 { + return nil + } + return &metricdata.Exemplar{ + Value: v, + Timestamp: t, + Attachments: attachments, } - a.CountPerBucket[len(a.bounds)]++ } func (a *DistributionData) clone() AggregationData { - counts := make([]int64, len(a.CountPerBucket)) - copy(counts, a.CountPerBucket) c := *a - c.CountPerBucket = counts + c.CountPerBucket = append([]int64(nil), a.CountPerBucket...) + c.ExemplarsPerBucket = append([]*metricdata.Exemplar(nil), a.ExemplarsPerBucket...) return &c } @@ -181,6 +229,33 @@ func (a *DistributionData) equal(other AggregationData) bool { return a.Count == a2.Count && a.Min == a2.Min && a.Max == a2.Max && math.Pow(a.Mean-a2.Mean, 2) < epsilon && math.Pow(a.variance()-a2.variance(), 2) < epsilon } +func (a *DistributionData) toPoint(metricType metricdata.Type, t time.Time) metricdata.Point { + switch metricType { + case metricdata.TypeCumulativeDistribution: + buckets := []metricdata.Bucket{} + for i := 0; i < len(a.CountPerBucket); i++ { + buckets = append(buckets, metricdata.Bucket{ + Count: a.CountPerBucket[i], + Exemplar: a.ExemplarsPerBucket[i], + }) + } + bucketOptions := &metricdata.BucketOptions{Bounds: a.bounds} + + val := &metricdata.Distribution{ + Count: a.Count, + Sum: a.Sum(), + SumOfSquaredDeviation: a.SumOfSquaredDev, + BucketOptions: bucketOptions, + Buckets: buckets, + } + return metricdata.NewDistributionPoint(t, val) + + default: + // TODO: [rghetia] when we have a use case for TypeGaugeDistribution. + panic("unsupported metricdata.Type") + } +} + // LastValueData returns the last value recorded for LastValue aggregation. type LastValueData struct { Value float64 @@ -190,7 +265,7 @@ func (l *LastValueData) isAggregationData() bool { return true } -func (l *LastValueData) addSample(v float64) { +func (l *LastValueData) addSample(v float64, _ map[string]interface{}, _ time.Time) { l.Value = v } @@ -205,3 +280,14 @@ func (l *LastValueData) equal(other AggregationData) bool { } return l.Value == a2.Value } + +func (l *LastValueData) toPoint(metricType metricdata.Type, t time.Time) metricdata.Point { + switch metricType { + case metricdata.TypeGaugeInt64: + return metricdata.NewInt64Point(t, int64(l.Value)) + case metricdata.TypeGaugeFloat64: + return metricdata.NewFloat64Point(t, l.Value) + default: + panic("unsupported metricdata.Type") + } +} diff --git a/vendor/go.opencensus.io/stats/view/collector.go b/vendor/go.opencensus.io/stats/view/collector.go index 863a5b62a..8a6a2c0fd 100644 --- a/vendor/go.opencensus.io/stats/view/collector.go +++ b/vendor/go.opencensus.io/stats/view/collector.go @@ -17,6 +17,7 @@ package view import ( "sort" + "time" "go.opencensus.io/internal/tagencoding" "go.opencensus.io/tag" @@ -31,20 +32,21 @@ type collector struct { a *Aggregation } -func (c *collector) addSample(s string, v float64) { +func (c *collector) addSample(s string, v float64, attachments map[string]interface{}, t time.Time) { aggregator, ok := c.signatures[s] if !ok { aggregator = c.a.newData() c.signatures[s] = aggregator } - aggregator.addSample(v) + aggregator.addSample(v, attachments, t) } +// collectRows returns a snapshot of the collected Row values. func (c *collector) collectedRows(keys []tag.Key) []*Row { - var rows []*Row + rows := make([]*Row, 0, len(c.signatures)) for sig, aggregator := range c.signatures { tags := decodeTags([]byte(sig), keys) - row := &Row{tags, aggregator} + row := &Row{Tags: tags, Data: aggregator.clone()} rows = append(rows, row) } return rows diff --git a/vendor/go.opencensus.io/stats/view/doc.go b/vendor/go.opencensus.io/stats/view/doc.go index 856fb4e15..7bbedfe1f 100644 --- a/vendor/go.opencensus.io/stats/view/doc.go +++ b/vendor/go.opencensus.io/stats/view/doc.go @@ -13,33 +13,34 @@ // limitations under the License. // -/* -Package view contains support for collecting and exposing aggregates over stats. - -In order to collect measurements, views need to be defined and registered. -A view allows recorded measurements to be filtered and aggregated over a time window. - -All recorded measurements can be filtered by a list of tags. - -OpenCensus provides several aggregation methods: count, distribution and sum. -Count aggregation only counts the number of measurement points. Distribution -aggregation provides statistical summary of the aggregated data. Sum distribution -sums up the measurement points. Aggregations are cumulative. - -Users can dynamically create and delete views. - -Libraries can export their own views and claim the view names -by registering them themselves. - -Exporting - -Collected and aggregated data can be exported to a metric collection -backend by registering its exporter. - -Multiple exporters can be registered to upload the data to various -different backends. Users need to unregister the exporters once they -no longer are needed. -*/ +// Package view contains support for collecting and exposing aggregates over stats. +// +// In order to collect measurements, views need to be defined and registered. +// A view allows recorded measurements to be filtered and aggregated. +// +// All recorded measurements can be grouped by a list of tags. +// +// OpenCensus provides several aggregation methods: Count, Distribution and Sum. +// +// Count only counts the number of measurement points recorded. +// Distribution provides statistical summary of the aggregated data by counting +// how many recorded measurements fall into each bucket. +// Sum adds up the measurement values. +// LastValue just keeps track of the most recently recorded measurement value. +// All aggregations are cumulative. +// +// Views can be registered and unregistered at any time during program execution. +// +// Libraries can define views but it is recommended that in most cases registering +// views be left up to applications. +// +// Exporting +// +// Collected and aggregated data can be exported to a metric collection +// backend by registering its exporter. +// +// Multiple exporters can be registered to upload the data to various +// different back ends. package view // import "go.opencensus.io/stats/view" // TODO(acetechnologist): Add a link to the language independent OpenCensus diff --git a/vendor/go.opencensus.io/stats/view/export.go b/vendor/go.opencensus.io/stats/view/export.go index fac37871b..7cb59718f 100644 --- a/vendor/go.opencensus.io/stats/view/export.go +++ b/vendor/go.opencensus.io/stats/view/export.go @@ -27,6 +27,9 @@ var ( // Exporter takes a significant amount of time to // process a Data, that work should be done on another goroutine. // +// It is safe to assume that ExportView will not be called concurrently from +// multiple goroutines. +// // The Data should not be modified. type Exporter interface { ExportView(viewData *Data) @@ -37,6 +40,8 @@ type Exporter interface { // registered exporters. Once you no longer // want data to be exported, invoke UnregisterExporter // with the previously registered exporter. +// +// Binaries can register exporters, libraries shouldn't register exporters. func RegisterExporter(e Exporter) { exportersMu.Lock() defer exportersMu.Unlock() diff --git a/vendor/go.opencensus.io/stats/view/view.go b/vendor/go.opencensus.io/stats/view/view.go index d229d3e09..293b54ecb 100644 --- a/vendor/go.opencensus.io/stats/view/view.go +++ b/vendor/go.opencensus.io/stats/view/view.go @@ -17,19 +17,20 @@ package view import ( "bytes" + "errors" "fmt" "reflect" "sort" "sync/atomic" "time" + "go.opencensus.io/metric/metricdata" "go.opencensus.io/stats" - "go.opencensus.io/stats/internal" "go.opencensus.io/tag" ) // View allows users to aggregate the recorded stats.Measurements. -// Views need to be passed to the Subscribe function to be before data will be +// Views need to be passed to the Register function before data will be // collected and sent to Exporters. type View struct { Name string // Name of View. Must be unique. If unset, will default to the name of the Measure. @@ -42,7 +43,7 @@ type View struct { // Measure is a stats.Measure to aggregate in this view. Measure stats.Measure - // Aggregation is the aggregation function tp apply to the set of Measurements. + // Aggregation is the aggregation function to apply to the set of Measurements. Aggregation *Aggregation } @@ -67,14 +68,19 @@ func (v *View) same(other *View) bool { v.Measure.Name() == other.Measure.Name() } -// canonicalized returns a validated View canonicalized by setting explicit +// ErrNegativeBucketBounds error returned if histogram contains negative bounds. +// +// Deprecated: this should not be public. +var ErrNegativeBucketBounds = errors.New("negative bucket bounds not supported") + +// canonicalize canonicalizes v by setting explicit // defaults for Name and Description and sorting the TagKeys func (v *View) canonicalize() error { if v.Measure == nil { - return fmt.Errorf("cannot subscribe view %q: measure not set", v.Name) + return fmt.Errorf("cannot register view %q: measure not set", v.Name) } if v.Aggregation == nil { - return fmt.Errorf("cannot subscribe view %q: aggregation not set", v.Name) + return fmt.Errorf("cannot register view %q: aggregation not set", v.Name) } if v.Name == "" { v.Name = v.Measure.Name() @@ -88,20 +94,40 @@ func (v *View) canonicalize() error { sort.Slice(v.TagKeys, func(i, j int) bool { return v.TagKeys[i].Name() < v.TagKeys[j].Name() }) + sort.Float64s(v.Aggregation.Buckets) + for _, b := range v.Aggregation.Buckets { + if b < 0 { + return ErrNegativeBucketBounds + } + } + // drop 0 bucket silently. + v.Aggregation.Buckets = dropZeroBounds(v.Aggregation.Buckets...) + return nil } +func dropZeroBounds(bounds ...float64) []float64 { + for i, bound := range bounds { + if bound > 0 { + return bounds[i:] + } + } + return []float64{} +} + // viewInternal is the internal representation of a View. type viewInternal struct { - view *View // view is the canonicalized View definition associated with this view. - subscribed uint32 // 1 if someone is subscribed and data need to be exported, use atomic to access - collector *collector + view *View // view is the canonicalized View definition associated with this view. + subscribed uint32 // 1 if someone is subscribed and data need to be exported, use atomic to access + collector *collector + metricDescriptor *metricdata.Descriptor } func newViewInternal(v *View) (*viewInternal, error) { return &viewInternal{ - view: v, - collector: &collector{make(map[string]AggregationData), v.Aggregation}, + view: v, + collector: &collector{make(map[string]AggregationData), v.Aggregation}, + metricDescriptor: viewToMetricDescriptor(v), }, nil } @@ -127,12 +153,12 @@ func (v *viewInternal) collectedRows() []*Row { return v.collector.collectedRows(v.view.TagKeys) } -func (v *viewInternal) addSample(m *tag.Map, val float64) { +func (v *viewInternal) addSample(m *tag.Map, val float64, attachments map[string]interface{}, t time.Time) { if !v.isSubscribed() { return } sig := string(encodeWithKeys(m, v.view.TagKeys)) - v.collector.addSample(sig, val) + v.collector.addSample(sig, val, attachments, t) } // A Data is a set of rows about usage of the single measure associated @@ -163,7 +189,7 @@ func (r *Row) String() string { } // Equal returns true if both rows are equal. Tags are expected to be ordered -// by the key name. Even both rows have the same tags but the tags appear in +// by the key name. Even if both rows have the same tags but the tags appear in // different orders it will return false. func (r *Row) Equal(other *Row) bool { if r == other { @@ -172,11 +198,23 @@ func (r *Row) Equal(other *Row) bool { return reflect.DeepEqual(r.Tags, other.Tags) && r.Data.equal(other.Data) } +const maxNameLength = 255 + +// Returns true if the given string contains only printable characters. +func isPrintable(str string) bool { + for _, r := range str { + if !(r >= ' ' && r <= '~') { + return false + } + } + return true +} + func checkViewName(name string) error { - if len(name) > internal.MaxNameLength { - return fmt.Errorf("view name cannot be larger than %v", internal.MaxNameLength) + if len(name) > maxNameLength { + return fmt.Errorf("view name cannot be larger than %v", maxNameLength) } - if !internal.IsPrintable(name) { + if !isPrintable(name) { return fmt.Errorf("view name needs to be an ASCII string") } return nil diff --git a/vendor/go.opencensus.io/stats/view/view_to_metric.go b/vendor/go.opencensus.io/stats/view/view_to_metric.go new file mode 100644 index 000000000..293c1646d --- /dev/null +++ b/vendor/go.opencensus.io/stats/view/view_to_metric.go @@ -0,0 +1,149 @@ +// Copyright 2019, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +package view + +import ( + "time" + + "go.opencensus.io/metric/metricdata" + "go.opencensus.io/stats" +) + +func getUnit(unit string) metricdata.Unit { + switch unit { + case "1": + return metricdata.UnitDimensionless + case "ms": + return metricdata.UnitMilliseconds + case "By": + return metricdata.UnitBytes + } + return metricdata.UnitDimensionless +} + +func getType(v *View) metricdata.Type { + m := v.Measure + agg := v.Aggregation + + switch agg.Type { + case AggTypeSum: + switch m.(type) { + case *stats.Int64Measure: + return metricdata.TypeCumulativeInt64 + case *stats.Float64Measure: + return metricdata.TypeCumulativeFloat64 + default: + panic("unexpected measure type") + } + case AggTypeDistribution: + return metricdata.TypeCumulativeDistribution + case AggTypeLastValue: + switch m.(type) { + case *stats.Int64Measure: + return metricdata.TypeGaugeInt64 + case *stats.Float64Measure: + return metricdata.TypeGaugeFloat64 + default: + panic("unexpected measure type") + } + case AggTypeCount: + switch m.(type) { + case *stats.Int64Measure: + return metricdata.TypeCumulativeInt64 + case *stats.Float64Measure: + return metricdata.TypeCumulativeInt64 + default: + panic("unexpected measure type") + } + default: + panic("unexpected aggregation type") + } +} + +func getLabelKeys(v *View) []metricdata.LabelKey { + labelKeys := []metricdata.LabelKey{} + for _, k := range v.TagKeys { + labelKeys = append(labelKeys, metricdata.LabelKey{Key: k.Name()}) + } + return labelKeys +} + +func viewToMetricDescriptor(v *View) *metricdata.Descriptor { + return &metricdata.Descriptor{ + Name: v.Name, + Description: v.Description, + Unit: convertUnit(v), + Type: getType(v), + LabelKeys: getLabelKeys(v), + } +} + +func convertUnit(v *View) metricdata.Unit { + switch v.Aggregation.Type { + case AggTypeCount: + return metricdata.UnitDimensionless + default: + return getUnit(v.Measure.Unit()) + } +} + +func toLabelValues(row *Row, expectedKeys []metricdata.LabelKey) []metricdata.LabelValue { + labelValues := []metricdata.LabelValue{} + tagMap := make(map[string]string) + for _, tag := range row.Tags { + tagMap[tag.Key.Name()] = tag.Value + } + + for _, key := range expectedKeys { + if val, ok := tagMap[key.Key]; ok { + labelValues = append(labelValues, metricdata.NewLabelValue(val)) + } else { + labelValues = append(labelValues, metricdata.LabelValue{}) + } + } + return labelValues +} + +func rowToTimeseries(v *viewInternal, row *Row, now time.Time, startTime time.Time) *metricdata.TimeSeries { + return &metricdata.TimeSeries{ + Points: []metricdata.Point{row.Data.toPoint(v.metricDescriptor.Type, now)}, + LabelValues: toLabelValues(row, v.metricDescriptor.LabelKeys), + StartTime: startTime, + } +} + +func viewToMetric(v *viewInternal, now time.Time, startTime time.Time) *metricdata.Metric { + if v.metricDescriptor.Type == metricdata.TypeGaugeInt64 || + v.metricDescriptor.Type == metricdata.TypeGaugeFloat64 { + startTime = time.Time{} + } + + rows := v.collectedRows() + if len(rows) == 0 { + return nil + } + + ts := []*metricdata.TimeSeries{} + for _, row := range rows { + ts = append(ts, rowToTimeseries(v, row, now, startTime)) + } + + m := &metricdata.Metric{ + Descriptor: *v.metricDescriptor, + TimeSeries: ts, + } + return m +} diff --git a/vendor/go.opencensus.io/stats/view/worker.go b/vendor/go.opencensus.io/stats/view/worker.go index 2c9b62126..2f3c018af 100644 --- a/vendor/go.opencensus.io/stats/view/worker.go +++ b/vendor/go.opencensus.io/stats/view/worker.go @@ -17,8 +17,11 @@ package view import ( "fmt" + "sync" "time" + "go.opencensus.io/metric/metricdata" + "go.opencensus.io/metric/metricproducer" "go.opencensus.io/stats" "go.opencensus.io/stats/internal" "go.opencensus.io/tag" @@ -43,14 +46,15 @@ type worker struct { timer *time.Ticker c chan command quit, done chan bool + mu sync.RWMutex } var defaultWorker *worker var defaultReportingDuration = 10 * time.Second -// Find returns a subscribed view associated with this name. -// If no subscribed view is found, nil is returned. +// Find returns a registered view associated with this name. +// If no registered view is found, nil is returned. func Find(name string) (v *View) { req := &getViewByNameReq{ name: name, @@ -62,13 +66,8 @@ func Find(name string) (v *View) { } // Register begins collecting data for the given views. -// Once a view is subscribed, it reports data to the registered exporters. +// Once a view is registered, it reports data to the registered exporters. func Register(views ...*View) error { - for _, v := range views { - if err := v.canonicalize(); err != nil { - return err - } - } req := ®isterViewReq{ views: views, err: make(chan error), @@ -86,7 +85,7 @@ func Unregister(views ...*View) { for i := range views { names[i] = views[i].Name } - req := &unsubscribeFromViewReq{ + req := &unregisterFromViewReq{ views: names, done: make(chan struct{}), } @@ -94,6 +93,8 @@ func Unregister(views ...*View) { <-req.done } +// RetrieveData gets a snapshot of the data collected for the the view registered +// with the given name. It is intended for testing only. func RetrieveData(viewName string) ([]*Row, error) { req := &retrieveDataReq{ now: time.Now(), @@ -105,17 +106,23 @@ func RetrieveData(viewName string) ([]*Row, error) { return resp.rows, resp.err } -func record(tags *tag.Map, ms interface{}) { +func record(tags *tag.Map, ms interface{}, attachments map[string]interface{}) { req := &recordReq{ - tm: tags, - ms: ms.([]stats.Measurement), + tm: tags, + ms: ms.([]stats.Measurement), + attachments: attachments, + t: time.Now(), } defaultWorker.c <- req } // SetReportingPeriod sets the interval between reporting aggregated views in -// the program. If duration is less than or -// equal to zero, it enables the default behavior. +// the program. If duration is less than or equal to zero, it enables the +// default behavior. +// +// Note: each exporter makes different promises about what the lowest supported +// duration is. For example, the Stackdriver exporter recommends a value no +// lower than 1 minute. Consult each exporter per your needs. func SetReportingPeriod(d time.Duration) { // TODO(acetechnologist): ensure that the duration d is more than a certain // value. e.g. 1s @@ -140,12 +147,13 @@ func newWorker() *worker { } func (w *worker) start() { + prodMgr := metricproducer.GlobalManager() + prodMgr.AddProducer(w) + for { select { case cmd := <-w.c: - if cmd != nil { - cmd.handleCommand(w) - } + cmd.handleCommand(w) case <-w.timer.C: w.reportUsage(time.Now()) case <-w.quit: @@ -158,6 +166,9 @@ func (w *worker) start() { } func (w *worker) stop() { + prodMgr := metricproducer.GlobalManager() + prodMgr.DeleteProducer(w) + w.quit <- true <-w.done } @@ -175,13 +186,15 @@ func (w *worker) getMeasureRef(name string) *measureRef { } func (w *worker) tryRegisterView(v *View) (*viewInternal, error) { + w.mu.Lock() + defer w.mu.Unlock() vi, err := newViewInternal(v) if err != nil { return nil, err } if x, ok := w.views[vi.view.Name]; ok { if !x.view.same(vi.view) { - return nil, fmt.Errorf("cannot subscribe view %q; a different view with the same name is already subscribed", v.Name) + return nil, fmt.Errorf("cannot register view %q; a different view with the same name is already registered", v.Name) } // the view is already registered so there is nothing to do and the @@ -194,40 +207,75 @@ func (w *worker) tryRegisterView(v *View) (*viewInternal, error) { return vi, nil } +func (w *worker) unregisterView(viewName string) { + w.mu.Lock() + defer w.mu.Unlock() + delete(w.views, viewName) +} + +func (w *worker) reportView(v *viewInternal, now time.Time) { + if !v.isSubscribed() { + return + } + rows := v.collectedRows() + _, ok := w.startTimes[v] + if !ok { + w.startTimes[v] = now + } + viewData := &Data{ + View: v.view, + Start: w.startTimes[v], + End: time.Now(), + Rows: rows, + } + exportersMu.Lock() + for e := range exporters { + e.ExportView(viewData) + } + exportersMu.Unlock() +} + func (w *worker) reportUsage(now time.Time) { + w.mu.Lock() + defer w.mu.Unlock() for _, v := range w.views { - if !v.isSubscribed() { - continue - } - rows := v.collectedRows() - _, ok := w.startTimes[v] - if !ok { - w.startTimes[v] = now - } - // Make sure collector is never going - // to mutate the exported data. - rows = deepCopyRowData(rows) - viewData := &Data{ - View: v.view, - Start: w.startTimes[v], - End: time.Now(), - Rows: rows, - } - exportersMu.Lock() - for e := range exporters { - e.ExportView(viewData) - } - exportersMu.Unlock() + w.reportView(v, now) } } -func deepCopyRowData(rows []*Row) []*Row { - newRows := make([]*Row, 0, len(rows)) - for _, r := range rows { - newRows = append(newRows, &Row{ - Data: r.Data.clone(), - Tags: r.Tags, - }) +func (w *worker) toMetric(v *viewInternal, now time.Time) *metricdata.Metric { + if !v.isSubscribed() { + return nil + } + + _, ok := w.startTimes[v] + if !ok { + w.startTimes[v] = now + } + + var startTime time.Time + if v.metricDescriptor.Type == metricdata.TypeGaugeInt64 || + v.metricDescriptor.Type == metricdata.TypeGaugeFloat64 { + startTime = time.Time{} + } else { + startTime = w.startTimes[v] + } + + return viewToMetric(v, now, startTime) +} + +// Read reads all view data and returns them as metrics. +// It is typically invoked by metric reader to export stats in metric format. +func (w *worker) Read() []*metricdata.Metric { + w.mu.Lock() + defer w.mu.Unlock() + now := time.Now() + metrics := make([]*metricdata.Metric, 0, len(w.views)) + for _, v := range w.views { + metric := w.toMetric(v, now) + if metric != nil { + metrics = append(metrics, metric) + } } - return newRows + return metrics } diff --git a/vendor/go.opencensus.io/stats/view/worker_commands.go b/vendor/go.opencensus.io/stats/view/worker_commands.go index 0d244ac7e..0267e179a 100644 --- a/vendor/go.opencensus.io/stats/view/worker_commands.go +++ b/vendor/go.opencensus.io/stats/view/worker_commands.go @@ -56,6 +56,12 @@ type registerViewReq struct { } func (cmd *registerViewReq) handleCommand(w *worker) { + for _, v := range cmd.views { + if err := v.canonicalize(); err != nil { + cmd.err <- err + return + } + } var errstr []string for _, view := range cmd.views { vi, err := w.tryRegisterView(view) @@ -73,27 +79,31 @@ func (cmd *registerViewReq) handleCommand(w *worker) { } } -// unsubscribeFromViewReq is the command to unsubscribe to a view. Has no +// unregisterFromViewReq is the command to unregister to a view. Has no // impact on the data collection for client that are pulling data from the // library. -type unsubscribeFromViewReq struct { +type unregisterFromViewReq struct { views []string done chan struct{} } -func (cmd *unsubscribeFromViewReq) handleCommand(w *worker) { +func (cmd *unregisterFromViewReq) handleCommand(w *worker) { for _, name := range cmd.views { vi, ok := w.views[name] if !ok { continue } + // Report pending data for this view before removing it. + w.reportView(vi, time.Now()) + vi.unsubscribe() if !vi.isSubscribed() { // this was the last subscription and view is not collecting anymore. // The collected data can be cleared. vi.clearRows() } + w.unregisterView(name) } cmd.done <- struct{}{} } @@ -111,6 +121,8 @@ type retrieveDataResp struct { } func (cmd *retrieveDataReq) handleCommand(w *worker) { + w.mu.Lock() + defer w.mu.Unlock() vi, ok := w.views[cmd.v] if !ok { cmd.c <- &retrieveDataResp{ @@ -136,24 +148,28 @@ func (cmd *retrieveDataReq) handleCommand(w *worker) { // recordReq is the command to record data related to multiple measures // at once. type recordReq struct { - tm *tag.Map - ms []stats.Measurement + tm *tag.Map + ms []stats.Measurement + attachments map[string]interface{} + t time.Time } func (cmd *recordReq) handleCommand(w *worker) { + w.mu.Lock() + defer w.mu.Unlock() for _, m := range cmd.ms { - if (m == stats.Measurement{}) { // not subscribed + if (m == stats.Measurement{}) { // not registered continue } ref := w.getMeasureRef(m.Measure().Name()) for v := range ref.views { - v.addSample(cmd.tm, m.Value()) + v.addSample(cmd.tm, m.Value(), cmd.attachments, time.Now()) } } } // setReportingPeriodReq is the command to modify the duration between -// reporting the collected data to the subscribed clients. +// reporting the collected data to the registered clients. type setReportingPeriodReq struct { d time.Duration c chan bool diff --git a/vendor/go.opencensus.io/tag/context.go b/vendor/go.opencensus.io/tag/context.go index ed528bcb3..b27d1b26b 100644 --- a/vendor/go.opencensus.io/tag/context.go +++ b/vendor/go.opencensus.io/tag/context.go @@ -15,7 +15,9 @@ package tag -import "context" +import ( + "context" +) // FromContext returns the tag map stored in the context. func FromContext(ctx context.Context) *Map { diff --git a/vendor/go.opencensus.io/tag/key.go b/vendor/go.opencensus.io/tag/key.go index ebbed9500..71ec91365 100644 --- a/vendor/go.opencensus.io/tag/key.go +++ b/vendor/go.opencensus.io/tag/key.go @@ -21,7 +21,7 @@ type Key struct { } // NewKey creates or retrieves a string key identified by name. -// Calling NewKey consequently with the same name returns the same key. +// Calling NewKey more than once with the same name returns the same key. func NewKey(name string) (Key, error) { if !checkKeyName(name) { return Key{}, errInvalidKeyName @@ -29,6 +29,15 @@ func NewKey(name string) (Key, error) { return Key{name: name}, nil } +// MustNewKey returns a key with the given name, and panics if name is an invalid key name. +func MustNewKey(name string) Key { + k, err := NewKey(name) + if err != nil { + panic(err) + } + return k +} + // Name returns the name of the key. func (k Key) Name() string { return k.name diff --git a/vendor/go.opencensus.io/tag/map.go b/vendor/go.opencensus.io/tag/map.go index f6237b313..0272ef85a 100644 --- a/vendor/go.opencensus.io/tag/map.go +++ b/vendor/go.opencensus.io/tag/map.go @@ -28,26 +28,31 @@ type Tag struct { Value string } -// Map is a map of tags. Use NewMap to build tag maps. +type tagContent struct { + value string + m metadatas +} + +// Map is a map of tags. Use New to create a context containing +// a new Map. type Map struct { - m map[Key]string + m map[Key]tagContent } -// Value returns the value for the key if a value -// for the key exists. +// Value returns the value for the key if a value for the key exists. func (m *Map) Value(k Key) (string, bool) { if m == nil { return "", false } v, ok := m.m[k] - return v, ok + return v.value, ok } func (m *Map) String() string { if m == nil { return "nil" } - var keys []Key + keys := make([]Key, 0, len(m.m)) for k := range m.m { keys = append(keys, k) } @@ -62,29 +67,29 @@ func (m *Map) String() string { return buffer.String() } -func (m *Map) insert(k Key, v string) { +func (m *Map) insert(k Key, v string, md metadatas) { if _, ok := m.m[k]; ok { return } - m.m[k] = v + m.m[k] = tagContent{value: v, m: md} } -func (m *Map) update(k Key, v string) { +func (m *Map) update(k Key, v string, md metadatas) { if _, ok := m.m[k]; ok { - m.m[k] = v + m.m[k] = tagContent{value: v, m: md} } } -func (m *Map) upsert(k Key, v string) { - m.m[k] = v +func (m *Map) upsert(k Key, v string, md metadatas) { + m.m[k] = tagContent{value: v, m: md} } func (m *Map) delete(k Key) { delete(m.m, k) } -func newMap(sizeHint int) *Map { - return &Map{m: make(map[Key]string, sizeHint)} +func newMap() *Map { + return &Map{m: make(map[Key]tagContent)} } // Mutator modifies a tag map. @@ -95,13 +100,17 @@ type Mutator interface { // Insert returns a mutator that inserts a // value associated with k. If k already exists in the tag map, // mutator doesn't update the value. -func Insert(k Key, v string) Mutator { +// Metadata applies metadata to the tag. It is optional. +// Metadatas are applied in the order in which it is provided. +// If more than one metadata updates the same attribute then +// the update from the last metadata prevails. +func Insert(k Key, v string, mds ...Metadata) Mutator { return &mutator{ fn: func(m *Map) (*Map, error) { if !checkValue(v) { return nil, errInvalidValue } - m.insert(k, v) + m.insert(k, v, createMetadatas(mds...)) return m, nil }, } @@ -110,13 +119,17 @@ func Insert(k Key, v string) Mutator { // Update returns a mutator that updates the // value of the tag associated with k with v. If k doesn't // exists in the tag map, the mutator doesn't insert the value. -func Update(k Key, v string) Mutator { +// Metadata applies metadata to the tag. It is optional. +// Metadatas are applied in the order in which it is provided. +// If more than one metadata updates the same attribute then +// the update from the last metadata prevails. +func Update(k Key, v string, mds ...Metadata) Mutator { return &mutator{ fn: func(m *Map) (*Map, error) { if !checkValue(v) { return nil, errInvalidValue } - m.update(k, v) + m.update(k, v, createMetadatas(mds...)) return m, nil }, } @@ -126,18 +139,37 @@ func Update(k Key, v string) Mutator { // value of the tag associated with k with v. It inserts the // value if k doesn't exist already. It mutates the value // if k already exists. -func Upsert(k Key, v string) Mutator { +// Metadata applies metadata to the tag. It is optional. +// Metadatas are applied in the order in which it is provided. +// If more than one metadata updates the same attribute then +// the update from the last metadata prevails. +func Upsert(k Key, v string, mds ...Metadata) Mutator { return &mutator{ fn: func(m *Map) (*Map, error) { if !checkValue(v) { return nil, errInvalidValue } - m.upsert(k, v) + m.upsert(k, v, createMetadatas(mds...)) return m, nil }, } } +func createMetadatas(mds ...Metadata) metadatas { + var metas metadatas + if len(mds) > 0 { + for _, md := range mds { + if md != nil { + md(&metas) + } + } + } else { + WithTTL(TTLUnlimitedPropagation)(&metas) + } + return metas + +} + // Delete returns a mutator that deletes // the value associated with k. func Delete(k Key) Mutator { @@ -153,17 +185,17 @@ func Delete(k Key) Mutator { // originated from the incoming context and modified // with the provided mutators. func New(ctx context.Context, mutator ...Mutator) (context.Context, error) { - m := newMap(0) + m := newMap() orig := FromContext(ctx) if orig != nil { for k, v := range orig.m { if !checkKeyName(k.Name()) { return ctx, fmt.Errorf("key:%q: %v", k, errInvalidKeyName) } - if !checkValue(v) { + if !checkValue(v.value) { return ctx, fmt.Errorf("key:%q value:%q: %v", k.Name(), v, errInvalidValue) } - m.insert(k, v) + m.insert(k, v.value, v.m) } } var err error diff --git a/vendor/go.opencensus.io/tag/map_codec.go b/vendor/go.opencensus.io/tag/map_codec.go index 38f545918..c242e695c 100644 --- a/vendor/go.opencensus.io/tag/map_codec.go +++ b/vendor/go.opencensus.io/tag/map_codec.go @@ -162,60 +162,78 @@ func (eg *encoderGRPC) bytes() []byte { // Encode encodes the tag map into a []byte. It is useful to propagate // the tag maps on wire in binary format. func Encode(m *Map) []byte { + if m == nil { + return nil + } eg := &encoderGRPC{ buf: make([]byte, len(m.m)), } - eg.writeByte(byte(tagsVersionID)) + eg.writeByte(tagsVersionID) for k, v := range m.m { - eg.writeByte(byte(keyTypeString)) - eg.writeStringWithVarintLen(k.name) - eg.writeBytesWithVarintLen([]byte(v)) + if v.m.ttl.ttl == valueTTLUnlimitedPropagation { + eg.writeByte(byte(keyTypeString)) + eg.writeStringWithVarintLen(k.name) + eg.writeBytesWithVarintLen([]byte(v.value)) + } } return eg.bytes() } // Decode decodes the given []byte into a tag map. func Decode(bytes []byte) (*Map, error) { - ts := newMap(0) + ts := newMap() + err := DecodeEach(bytes, ts.upsert) + if err != nil { + // no partial failures + return nil, err + } + return ts, nil +} +// DecodeEach decodes the given serialized tag map, calling handler for each +// tag key and value decoded. +func DecodeEach(bytes []byte, fn func(key Key, val string, md metadatas)) error { eg := &encoderGRPC{ buf: bytes, } if len(eg.buf) == 0 { - return ts, nil + return nil } version := eg.readByte() if version > tagsVersionID { - return nil, fmt.Errorf("cannot decode: unsupported version: %q; supports only up to: %q", version, tagsVersionID) + return fmt.Errorf("cannot decode: unsupported version: %q; supports only up to: %q", version, tagsVersionID) } for !eg.readEnded() { typ := keyType(eg.readByte()) if typ != keyTypeString { - return nil, fmt.Errorf("cannot decode: invalid key type: %q", typ) + return fmt.Errorf("cannot decode: invalid key type: %q", typ) } k, err := eg.readBytesWithVarintLen() if err != nil { - return nil, err + return err } v, err := eg.readBytesWithVarintLen() if err != nil { - return nil, err + return err } key, err := NewKey(string(k)) if err != nil { - return nil, err // no partial failures + return err } val := string(v) if !checkValue(val) { - return nil, errInvalidValue // no partial failures + return errInvalidValue + } + fn(key, val, createMetadatas(WithTTL(TTLUnlimitedPropagation))) + if err != nil { + return err } - ts.upsert(key, val) } - return ts, nil + return nil } diff --git a/vendor/go.opencensus.io/tag/metadata.go b/vendor/go.opencensus.io/tag/metadata.go new file mode 100644 index 000000000..6571a583e --- /dev/null +++ b/vendor/go.opencensus.io/tag/metadata.go @@ -0,0 +1,52 @@ +// Copyright 2019, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +package tag + +const ( + // valueTTLNoPropagation prevents tag from propagating. + valueTTLNoPropagation = 0 + + // valueTTLUnlimitedPropagation allows tag to propagate without any limits on number of hops. + valueTTLUnlimitedPropagation = -1 +) + +// TTL is metadata that specifies number of hops a tag can propagate. +// Details about TTL metadata is specified at https://github.com/census-instrumentation/opencensus-specs/blob/master/tags/TagMap.md#tagmetadata +type TTL struct { + ttl int +} + +var ( + // TTLUnlimitedPropagation is TTL metadata that allows tag to propagate without any limits on number of hops. + TTLUnlimitedPropagation = TTL{ttl: valueTTLUnlimitedPropagation} + + // TTLNoPropagation is TTL metadata that prevents tag from propagating. + TTLNoPropagation = TTL{ttl: valueTTLNoPropagation} +) + +type metadatas struct { + ttl TTL +} + +// Metadata applies metadatas specified by the function. +type Metadata func(*metadatas) + +// WithTTL applies metadata with provided ttl. +func WithTTL(ttl TTL) Metadata { + return func(m *metadatas) { + m.ttl = ttl + } +} diff --git a/vendor/go.opencensus.io/tag/profile_19.go b/vendor/go.opencensus.io/tag/profile_19.go index f81cd0b4a..b34d95e34 100644 --- a/vendor/go.opencensus.io/tag/profile_19.go +++ b/vendor/go.opencensus.io/tag/profile_19.go @@ -25,7 +25,7 @@ func do(ctx context.Context, f func(ctx context.Context)) { m := FromContext(ctx) keyvals := make([]string, 0, 2*len(m.m)) for k, v := range m.m { - keyvals = append(keyvals, k.Name(), v) + keyvals = append(keyvals, k.Name(), v.value) } pprof.Do(ctx, pprof.Labels(keyvals...), f) } diff --git a/vendor/go.opencensus.io/trace/basetypes.go b/vendor/go.opencensus.io/trace/basetypes.go index 01f0f9083..0c54492a2 100644 --- a/vendor/go.opencensus.io/trace/basetypes.go +++ b/vendor/go.opencensus.io/trace/basetypes.go @@ -59,6 +59,11 @@ func Int64Attribute(key string, value int64) Attribute { return Attribute{key: key, value: value} } +// Float64Attribute returns a float64-valued attribute. +func Float64Attribute(key string, value float64) Attribute { + return Attribute{key: key, value: value} +} + // StringAttribute returns a string-valued attribute. func StringAttribute(key string, value string) Attribute { return Attribute{key: key, value: value} @@ -71,8 +76,8 @@ type LinkType int32 // LinkType values. const ( LinkTypeUnspecified LinkType = iota // The relationship of the two spans is unknown. - LinkTypeChild // The current span is a child of the linked span. - LinkTypeParent // The current span is the parent of the linked span. + LinkTypeChild // The linked span is a child of the current span. + LinkTypeParent // The linked span is the parent of the current span. ) // Link represents a reference from one span to another span. diff --git a/vendor/go.opencensus.io/trace/config.go b/vendor/go.opencensus.io/trace/config.go index f3df9be45..775f8274f 100644 --- a/vendor/go.opencensus.io/trace/config.go +++ b/vendor/go.opencensus.io/trace/config.go @@ -14,7 +14,11 @@ package trace -import "go.opencensus.io/trace/internal" +import ( + "sync" + + "go.opencensus.io/trace/internal" +) // Config represents the global tracing configuration. type Config struct { @@ -23,18 +27,60 @@ type Config struct { // IDGenerator is for internal use only. IDGenerator internal.IDGenerator + + // MaxAnnotationEventsPerSpan is max number of annotation events per span + MaxAnnotationEventsPerSpan int + + // MaxMessageEventsPerSpan is max number of message events per span + MaxMessageEventsPerSpan int + + // MaxAnnotationEventsPerSpan is max number of attributes per span + MaxAttributesPerSpan int + + // MaxLinksPerSpan is max number of links per span + MaxLinksPerSpan int } +var configWriteMu sync.Mutex + +const ( + // DefaultMaxAnnotationEventsPerSpan is default max number of annotation events per span + DefaultMaxAnnotationEventsPerSpan = 32 + + // DefaultMaxMessageEventsPerSpan is default max number of message events per span + DefaultMaxMessageEventsPerSpan = 128 + + // DefaultMaxAttributesPerSpan is default max number of attributes per span + DefaultMaxAttributesPerSpan = 32 + + // DefaultMaxLinksPerSpan is default max number of links per span + DefaultMaxLinksPerSpan = 32 +) + // ApplyConfig applies changes to the global tracing configuration. // // Fields not provided in the given config are going to be preserved. func ApplyConfig(cfg Config) { - c := config.Load().(*Config) + configWriteMu.Lock() + defer configWriteMu.Unlock() + c := *config.Load().(*Config) if cfg.DefaultSampler != nil { c.DefaultSampler = cfg.DefaultSampler } if cfg.IDGenerator != nil { c.IDGenerator = cfg.IDGenerator } - config.Store(c) + if cfg.MaxAnnotationEventsPerSpan > 0 { + c.MaxAnnotationEventsPerSpan = cfg.MaxAnnotationEventsPerSpan + } + if cfg.MaxMessageEventsPerSpan > 0 { + c.MaxMessageEventsPerSpan = cfg.MaxMessageEventsPerSpan + } + if cfg.MaxAttributesPerSpan > 0 { + c.MaxAttributesPerSpan = cfg.MaxAttributesPerSpan + } + if cfg.MaxLinksPerSpan > 0 { + c.MaxLinksPerSpan = cfg.MaxLinksPerSpan + } + config.Store(&c) } diff --git a/vendor/go.opencensus.io/trace/doc.go b/vendor/go.opencensus.io/trace/doc.go index 2501271ef..04b1ee4f3 100644 --- a/vendor/go.opencensus.io/trace/doc.go +++ b/vendor/go.opencensus.io/trace/doc.go @@ -13,19 +13,18 @@ // limitations under the License. /* -Package trace contains types for representing trace information, and -functions for global configuration of tracing. +Package trace contains support for OpenCensus distributed tracing. The following assumes a basic familiarity with OpenCensus concepts. See http://opencensus.io -Enabling Tracing for a Program +Exporting Traces -To use OpenCensus tracing, register at least one Exporter. You can use +To export collected tracing data, register at least one exporter. You can use one of the provided exporters or write your own. - trace.RegisterExporter(anExporter) + trace.RegisterExporter(exporter) By default, traces will be sampled relatively rarely. To change the sampling frequency for your entire program, call ApplyConfig. Use a ProbabilitySampler @@ -33,6 +32,8 @@ to sample a subset of traces, or use AlwaysSample to collect a trace on every ru trace.ApplyConfig(trace.Config{DefaultSampler: trace.AlwaysSample()}) +Be careful about using trace.AlwaysSample in a production application with +significant traffic: a new trace will be started and exported for every request. Adding Spans to a Trace @@ -43,13 +44,10 @@ It is common to want to capture all the activity of a function call in a span. F this to work, the function must take a context.Context as a parameter. Add these two lines to the top of the function: - ctx, span := trace.StartSpan(ctx, "your choice of name") + ctx, span := trace.StartSpan(ctx, "example.com/Run") defer span.End() StartSpan will create a new top-level span if the context doesn't contain another span, otherwise it will create a child span. - -As a suggestion, use the fully-qualified function name as the span name, e.g. -"github.com/me/mypackage.Run". */ package trace // import "go.opencensus.io/trace" diff --git a/vendor/go.opencensus.io/trace/evictedqueue.go b/vendor/go.opencensus.io/trace/evictedqueue.go new file mode 100644 index 000000000..ffc264f23 --- /dev/null +++ b/vendor/go.opencensus.io/trace/evictedqueue.go @@ -0,0 +1,38 @@ +// Copyright 2019, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package trace + +type evictedQueue struct { + queue []interface{} + capacity int + droppedCount int +} + +func newEvictedQueue(capacity int) *evictedQueue { + eq := &evictedQueue{ + capacity: capacity, + queue: make([]interface{}, 0), + } + + return eq +} + +func (eq *evictedQueue) add(value interface{}) { + if len(eq.queue) == eq.capacity { + eq.queue = eq.queue[1:] + eq.droppedCount++ + } + eq.queue = append(eq.queue, value) +} diff --git a/vendor/go.opencensus.io/trace/export.go b/vendor/go.opencensus.io/trace/export.go index 086612c9a..e0d9a4b99 100644 --- a/vendor/go.opencensus.io/trace/export.go +++ b/vendor/go.opencensus.io/trace/export.go @@ -16,6 +16,7 @@ package trace import ( "sync" + "sync/atomic" "time" ) @@ -30,28 +31,43 @@ type Exporter interface { ExportSpan(s *SpanData) } +type exportersMap map[Exporter]struct{} + var ( - exportersMu sync.Mutex - exporters map[Exporter]struct{} + exporterMu sync.Mutex + exporters atomic.Value ) // RegisterExporter adds to the list of Exporters that will receive sampled // trace spans. +// +// Binaries can register exporters, libraries shouldn't register exporters. func RegisterExporter(e Exporter) { - exportersMu.Lock() - if exporters == nil { - exporters = make(map[Exporter]struct{}) + exporterMu.Lock() + new := make(exportersMap) + if old, ok := exporters.Load().(exportersMap); ok { + for k, v := range old { + new[k] = v + } } - exporters[e] = struct{}{} - exportersMu.Unlock() + new[e] = struct{}{} + exporters.Store(new) + exporterMu.Unlock() } // UnregisterExporter removes from the list of Exporters the Exporter that was // registered with the given name. func UnregisterExporter(e Exporter) { - exportersMu.Lock() - delete(exporters, e) - exportersMu.Unlock() + exporterMu.Lock() + new := make(exportersMap) + if old, ok := exporters.Load().(exportersMap); ok { + for k, v := range old { + new[k] = v + } + } + delete(new, e) + exporters.Store(new) + exporterMu.Unlock() } // SpanData contains all the information collected by a Span. @@ -69,6 +85,13 @@ type SpanData struct { Annotations []Annotation MessageEvents []MessageEvent Status - Links []Link - HasRemoteParent bool + Links []Link + HasRemoteParent bool + DroppedAttributeCount int + DroppedAnnotationCount int + DroppedMessageEventCount int + DroppedLinkCount int + + // ChildSpanCount holds the number of child span created for this span. + ChildSpanCount int } diff --git a/vendor/go.opencensus.io/trace/internal/internal.go b/vendor/go.opencensus.io/trace/internal/internal.go index 1c8b9b34b..7e808d8f3 100644 --- a/vendor/go.opencensus.io/trace/internal/internal.go +++ b/vendor/go.opencensus.io/trace/internal/internal.go @@ -15,6 +15,7 @@ // Package internal provides trace internals. package internal +// IDGenerator allows custom generators for TraceId and SpanId. type IDGenerator interface { NewTraceID() [16]byte NewSpanID() [8]byte diff --git a/vendor/go.opencensus.io/trace/lrumap.go b/vendor/go.opencensus.io/trace/lrumap.go new file mode 100644 index 000000000..dc7a295c7 --- /dev/null +++ b/vendor/go.opencensus.io/trace/lrumap.go @@ -0,0 +1,61 @@ +// Copyright 2019, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package trace + +import ( + "github.com/golang/groupcache/lru" +) + +// A simple lru.Cache wrapper that tracks the keys of the current contents and +// the cumulative number of evicted items. +type lruMap struct { + cacheKeys map[lru.Key]bool + cache *lru.Cache + droppedCount int +} + +func newLruMap(size int) *lruMap { + lm := &lruMap{ + cacheKeys: make(map[lru.Key]bool), + cache: lru.New(size), + droppedCount: 0, + } + lm.cache.OnEvicted = func(key lru.Key, value interface{}) { + delete(lm.cacheKeys, key) + lm.droppedCount++ + } + return lm +} + +func (lm lruMap) len() int { + return lm.cache.Len() +} + +func (lm lruMap) keys() []interface{} { + keys := []interface{}{} + for k := range lm.cacheKeys { + keys = append(keys, k) + } + return keys +} + +func (lm *lruMap) add(key, value interface{}) { + lm.cacheKeys[lru.Key(key)] = true + lm.cache.Add(lru.Key(key), value) +} + +func (lm *lruMap) get(key interface{}) (interface{}, bool) { + return lm.cache.Get(key) +} diff --git a/vendor/go.opencensus.io/trace/propagation/propagation.go b/vendor/go.opencensus.io/trace/propagation/propagation.go index a3b00f474..1eb190a96 100644 --- a/vendor/go.opencensus.io/trace/propagation/propagation.go +++ b/vendor/go.opencensus.io/trace/propagation/propagation.go @@ -13,7 +13,7 @@ // limitations under the License. // Package propagation implements the binary trace context format. -package propagation +package propagation // import "go.opencensus.io/trace/propagation" // TODO: link to external spec document. diff --git a/vendor/go.opencensus.io/trace/sampling.go b/vendor/go.opencensus.io/trace/sampling.go index 313f8b68e..71c10f9e3 100644 --- a/vendor/go.opencensus.io/trace/sampling.go +++ b/vendor/go.opencensus.io/trace/sampling.go @@ -20,10 +20,6 @@ import ( const defaultSamplingProbability = 1e-4 -func newDefaultSampler() Sampler { - return ProbabilitySampler(defaultSamplingProbability) -} - // Sampler decides whether a trace should be sampled and exported. type Sampler func(SamplingParameters) SamplingDecision @@ -62,6 +58,9 @@ func ProbabilitySampler(fraction float64) Sampler { } // AlwaysSample returns a Sampler that samples every trace. +// Be careful about using this sampler in a production application with +// significant traffic: a new trace will be started and exported for every +// request. func AlwaysSample() Sampler { return func(p SamplingParameters) SamplingDecision { return SamplingDecision{Sample: true} diff --git a/vendor/go.opencensus.io/trace/status_codes.go b/vendor/go.opencensus.io/trace/status_codes.go new file mode 100644 index 000000000..ec60effd1 --- /dev/null +++ b/vendor/go.opencensus.io/trace/status_codes.go @@ -0,0 +1,37 @@ +// Copyright 2018, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package trace + +// Status codes for use with Span.SetStatus. These correspond to the status +// codes used by gRPC defined here: https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto +const ( + StatusCodeOK = 0 + StatusCodeCancelled = 1 + StatusCodeUnknown = 2 + StatusCodeInvalidArgument = 3 + StatusCodeDeadlineExceeded = 4 + StatusCodeNotFound = 5 + StatusCodeAlreadyExists = 6 + StatusCodePermissionDenied = 7 + StatusCodeResourceExhausted = 8 + StatusCodeFailedPrecondition = 9 + StatusCodeAborted = 10 + StatusCodeOutOfRange = 11 + StatusCodeUnimplemented = 12 + StatusCodeInternal = 13 + StatusCodeUnavailable = 14 + StatusCodeDataLoss = 15 + StatusCodeUnauthenticated = 16 +) diff --git a/vendor/go.opencensus.io/trace/trace.go b/vendor/go.opencensus.io/trace/trace.go index 49a1c0196..3f8977b41 100644 --- a/vendor/go.opencensus.io/trace/trace.go +++ b/vendor/go.opencensus.io/trace/trace.go @@ -25,6 +25,7 @@ import ( "time" "go.opencensus.io/internal" + "go.opencensus.io/trace/tracestate" ) // Span represents a span of a trace. It has an associated SpanContext, and @@ -41,9 +42,25 @@ type Span struct { data *SpanData mu sync.Mutex // protects the contents of *data (but not the pointer value.) spanContext SpanContext + + // lruAttributes are capped at configured limit. When the capacity is reached an oldest entry + // is removed to create room for a new entry. + lruAttributes *lruMap + + // annotations are stored in FIFO queue capped by configured limit. + annotations *evictedQueue + + // messageEvents are stored in FIFO queue capped by configured limit. + messageEvents *evictedQueue + + // links are stored in FIFO queue capped by configured limit. + links *evictedQueue + // spanStore is the spanStore this span belongs to, if any, otherwise it is nil. *spanStore - exportOnce sync.Once + endOnce sync.Once + + executionTracerTaskEnd func() // ends the execution tracer span } // IsRecordingEvents returns true if events are being recorded for this span. @@ -86,6 +103,7 @@ type SpanContext struct { TraceID TraceID SpanID SpanID TraceOptions TraceOptions + Tracestate *tracestate.Tracestate } type contextKey struct{} @@ -96,8 +114,8 @@ func FromContext(ctx context.Context) *Span { return s } -// WithSpan returns a new context with the given Span attached. -func WithSpan(parent context.Context, s *Span) context.Context { +// NewContext returns a new context with the given Span attached. +func NewContext(parent context.Context, s *Span) context.Context { return context.WithValue(parent, contextKey{}, s) } @@ -125,34 +143,62 @@ type StartOptions struct { SpanKind int } +// StartOption apply changes to StartOptions. +type StartOption func(*StartOptions) + +// WithSpanKind makes new spans to be created with the given kind. +func WithSpanKind(spanKind int) StartOption { + return func(o *StartOptions) { + o.SpanKind = spanKind + } +} + +// WithSampler makes new spans to be be created with a custom sampler. +// Otherwise, the global sampler is used. +func WithSampler(sampler Sampler) StartOption { + return func(o *StartOptions) { + o.Sampler = sampler + } +} + // StartSpan starts a new child span of the current span in the context. If // there is no span in the context, creates a new trace and span. // -// This is provided as a convenience for WithSpan(ctx, NewSpan(...)). Use it -// if you require custom spans in addition to the default spans provided by -// ocgrpc, ochttp or similar framework integration. -func StartSpan(ctx context.Context, name string) (context.Context, *Span) { - parentSpan, _ := ctx.Value(contextKey{}).(*Span) - span := NewSpan(name, parentSpan, StartOptions{}) - return WithSpan(ctx, span), span +// Returned context contains the newly created span. You can use it to +// propagate the returned span in process. +func StartSpan(ctx context.Context, name string, o ...StartOption) (context.Context, *Span) { + var opts StartOptions + var parent SpanContext + if p := FromContext(ctx); p != nil { + p.addChild() + parent = p.spanContext + } + for _, op := range o { + op(&opts) + } + span := startSpanInternal(name, parent != SpanContext{}, parent, false, opts) + + ctx, end := startExecutionTracerTask(ctx, name) + span.executionTracerTaskEnd = end + return NewContext(ctx, span), span } -// NewSpan returns a new span. +// StartSpanWithRemoteParent starts a new child span of the span from the given parent. // -// If parent is not nil, created span will be a child of the parent. -func NewSpan(name string, parent *Span, o StartOptions) *Span { - hasParent := false - var parentSpanContext SpanContext - if parent != nil { - hasParent = true - parentSpanContext = parent.SpanContext() +// If the incoming context contains a parent, it ignores. StartSpanWithRemoteParent is +// preferred for cases where the parent is propagated via an incoming request. +// +// Returned context contains the newly created span. You can use it to +// propagate the returned span in process. +func StartSpanWithRemoteParent(ctx context.Context, name string, parent SpanContext, o ...StartOption) (context.Context, *Span) { + var opts StartOptions + for _, op := range o { + op(&opts) } - return startSpanInternal(name, hasParent, parentSpanContext, false, o) -} - -// NewSpanWithRemoteParent returns a new span with the given parent SpanContext. -func NewSpanWithRemoteParent(name string, parent SpanContext, o StartOptions) *Span { - return startSpanInternal(name, true, parent, true, o) + span := startSpanInternal(name, parent != SpanContext{}, parent, true, opts) + ctx, end := startExecutionTracerTask(ctx, name) + span.executionTracerTaskEnd = end + return NewContext(ctx, span), span } func startSpanInternal(name string, hasParent bool, parent SpanContext, remoteParent bool, o StartOptions) *Span { @@ -195,6 +241,11 @@ func startSpanInternal(name string, hasParent bool, parent SpanContext, remotePa Name: name, HasRemoteParent: remoteParent, } + span.lruAttributes = newLruMap(cfg.MaxAttributesPerSpan) + span.annotations = newEvictedQueue(cfg.MaxAnnotationEventsPerSpan) + span.messageEvents = newEvictedQueue(cfg.MaxMessageEventsPerSpan) + span.links = newEvictedQueue(cfg.MaxLinksPerSpan) + if hasParent { span.data.ParentSpanID = parent.SpanID } @@ -212,23 +263,29 @@ func startSpanInternal(name string, hasParent bool, parent SpanContext, remotePa // End ends the span. func (s *Span) End() { + if s == nil { + return + } + if s.executionTracerTaskEnd != nil { + s.executionTracerTaskEnd() + } if !s.IsRecordingEvents() { return } - s.exportOnce.Do(func() { - // TODO: optimize to avoid this call if sd won't be used. - sd := s.makeSpanData() - sd.EndTime = internal.MonotonicEndTime(sd.StartTime) - if s.spanStore != nil { - s.spanStore.finished(s, sd) - } - if s.spanContext.IsSampled() { - // TODO: consider holding exportersMu for less time. - exportersMu.Lock() - for e := range exporters { - e.ExportSpan(sd) + s.endOnce.Do(func() { + exp, _ := exporters.Load().(exportersMap) + mustExport := s.spanContext.IsSampled() && len(exp) > 0 + if s.spanStore != nil || mustExport { + sd := s.makeSpanData() + sd.EndTime = internal.MonotonicEndTime(sd.StartTime) + if s.spanStore != nil { + s.spanStore.finished(s, sd) + } + if mustExport { + for e := range exp { + e.ExportSpan(sd) + } } - exportersMu.Unlock() } }) } @@ -239,11 +296,21 @@ func (s *Span) makeSpanData() *SpanData { var sd SpanData s.mu.Lock() sd = *s.data - if s.data.Attributes != nil { - sd.Attributes = make(map[string]interface{}) - for k, v := range s.data.Attributes { - sd.Attributes[k] = v - } + if s.lruAttributes.len() > 0 { + sd.Attributes = s.lruAttributesToAttributeMap() + sd.DroppedAttributeCount = s.lruAttributes.droppedCount + } + if len(s.annotations.queue) > 0 { + sd.Annotations = s.interfaceArrayToAnnotationArray() + sd.DroppedAnnotationCount = s.annotations.droppedCount + } + if len(s.messageEvents.queue) > 0 { + sd.MessageEvents = s.interfaceArrayToMessageEventArray() + sd.DroppedMessageEventCount = s.messageEvents.droppedCount + } + if len(s.links.queue) > 0 { + sd.Links = s.interfaceArrayToLinksArray() + sd.DroppedLinkCount = s.links.droppedCount } s.mu.Unlock() return &sd @@ -257,6 +324,16 @@ func (s *Span) SpanContext() SpanContext { return s.spanContext } +// SetName sets the name of the span, if it is recording events. +func (s *Span) SetName(name string) { + if !s.IsRecordingEvents() { + return + } + s.mu.Lock() + s.data.Name = name + s.mu.Unlock() +} + // SetStatus sets the status of the span, if it is recording events. func (s *Span) SetStatus(status Status) { if !s.IsRecordingEvents() { @@ -267,6 +344,57 @@ func (s *Span) SetStatus(status Status) { s.mu.Unlock() } +func (s *Span) interfaceArrayToLinksArray() []Link { + linksArr := make([]Link, 0) + for _, value := range s.links.queue { + linksArr = append(linksArr, value.(Link)) + } + return linksArr +} + +func (s *Span) interfaceArrayToMessageEventArray() []MessageEvent { + messageEventArr := make([]MessageEvent, 0) + for _, value := range s.messageEvents.queue { + messageEventArr = append(messageEventArr, value.(MessageEvent)) + } + return messageEventArr +} + +func (s *Span) interfaceArrayToAnnotationArray() []Annotation { + annotationArr := make([]Annotation, 0) + for _, value := range s.annotations.queue { + annotationArr = append(annotationArr, value.(Annotation)) + } + return annotationArr +} + +func (s *Span) lruAttributesToAttributeMap() map[string]interface{} { + attributes := make(map[string]interface{}) + for _, key := range s.lruAttributes.keys() { + value, ok := s.lruAttributes.get(key) + if ok { + keyStr := key.(string) + attributes[keyStr] = value + } + } + return attributes +} + +func (s *Span) copyToCappedAttributes(attributes []Attribute) { + for _, a := range attributes { + s.lruAttributes.add(a.key, a.value) + } +} + +func (s *Span) addChild() { + if !s.IsRecordingEvents() { + return + } + s.mu.Lock() + s.data.ChildSpanCount++ + s.mu.Unlock() +} + // AddAttributes sets attributes in the span. // // Existing attributes whose keys appear in the attributes parameter are overwritten. @@ -275,10 +403,7 @@ func (s *Span) AddAttributes(attributes ...Attribute) { return } s.mu.Lock() - if s.data.Attributes == nil { - s.data.Attributes = make(map[string]interface{}) - } - copyAttributes(s.data.Attributes, attributes) + s.copyToCappedAttributes(attributes) s.mu.Unlock() } @@ -298,7 +423,7 @@ func (s *Span) lazyPrintfInternal(attributes []Attribute, format string, a ...in m = make(map[string]interface{}) copyAttributes(m, attributes) } - s.data.Annotations = append(s.data.Annotations, Annotation{ + s.annotations.add(Annotation{ Time: now, Message: msg, Attributes: m, @@ -314,7 +439,7 @@ func (s *Span) printStringInternal(attributes []Attribute, str string) { a = make(map[string]interface{}) copyAttributes(a, attributes) } - s.data.Annotations = append(s.data.Annotations, Annotation{ + s.annotations.add(Annotation{ Time: now, Message: str, Attributes: a, @@ -351,7 +476,7 @@ func (s *Span) AddMessageSendEvent(messageID, uncompressedByteSize, compressedBy } now := time.Now() s.mu.Lock() - s.data.MessageEvents = append(s.data.MessageEvents, MessageEvent{ + s.messageEvents.add(MessageEvent{ Time: now, EventType: MessageEventTypeSent, MessageID: messageID, @@ -373,7 +498,7 @@ func (s *Span) AddMessageReceiveEvent(messageID, uncompressedByteSize, compresse } now := time.Now() s.mu.Lock() - s.data.MessageEvents = append(s.data.MessageEvents, MessageEvent{ + s.messageEvents.add(MessageEvent{ Time: now, EventType: MessageEventTypeRecv, MessageID: messageID, @@ -389,7 +514,7 @@ func (s *Span) AddLink(l Link) { return } s.mu.Lock() - s.data.Links = append(s.data.Links, l) + s.links.add(l) s.mu.Unlock() } @@ -421,29 +546,39 @@ func init() { gen.spanIDInc |= 1 config.Store(&Config{ - DefaultSampler: ProbabilitySampler(defaultSamplingProbability), - IDGenerator: gen, + DefaultSampler: ProbabilitySampler(defaultSamplingProbability), + IDGenerator: gen, + MaxAttributesPerSpan: DefaultMaxAttributesPerSpan, + MaxAnnotationEventsPerSpan: DefaultMaxAnnotationEventsPerSpan, + MaxMessageEventsPerSpan: DefaultMaxMessageEventsPerSpan, + MaxLinksPerSpan: DefaultMaxLinksPerSpan, }) } type defaultIDGenerator struct { sync.Mutex - traceIDRand *rand.Rand + + // Please keep these as the first fields + // so that these 8 byte fields will be aligned on addresses + // divisible by 8, on both 32-bit and 64-bit machines when + // performing atomic increments and accesses. + // See: + // * https://github.com/census-instrumentation/opencensus-go/issues/587 + // * https://github.com/census-instrumentation/opencensus-go/issues/865 + // * https://golang.org/pkg/sync/atomic/#pkg-note-BUG + nextSpanID uint64 + spanIDInc uint64 + traceIDAdd [2]uint64 - nextSpanID uint64 - spanIDInc uint64 + traceIDRand *rand.Rand } // NewSpanID returns a non-zero span ID from a randomly-chosen sequence. -// mu should be held while this function is called. func (gen *defaultIDGenerator) NewSpanID() [8]byte { - gen.Lock() - id := gen.nextSpanID - gen.nextSpanID += gen.spanIDInc - if gen.nextSpanID == 0 { - gen.nextSpanID += gen.spanIDInc + var id uint64 + for id == 0 { + id = atomic.AddUint64(&gen.nextSpanID, gen.spanIDInc) } - gen.Unlock() var sid [8]byte binary.LittleEndian.PutUint64(sid[:], id) return sid diff --git a/vendor/go.opencensus.io/trace/trace_go11.go b/vendor/go.opencensus.io/trace/trace_go11.go new file mode 100644 index 000000000..b7d8aaf28 --- /dev/null +++ b/vendor/go.opencensus.io/trace/trace_go11.go @@ -0,0 +1,32 @@ +// Copyright 2018, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build go1.11 + +package trace + +import ( + "context" + t "runtime/trace" +) + +func startExecutionTracerTask(ctx context.Context, name string) (context.Context, func()) { + if !t.IsEnabled() { + // Avoid additional overhead if + // runtime/trace is not enabled. + return ctx, func() {} + } + nctx, task := t.NewTask(ctx, name) + return nctx, task.End +} diff --git a/vendor/go.opencensus.io/trace/trace_nongo11.go b/vendor/go.opencensus.io/trace/trace_nongo11.go new file mode 100644 index 000000000..e25419859 --- /dev/null +++ b/vendor/go.opencensus.io/trace/trace_nongo11.go @@ -0,0 +1,25 @@ +// Copyright 2018, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !go1.11 + +package trace + +import ( + "context" +) + +func startExecutionTracerTask(ctx context.Context, name string) (context.Context, func()) { + return ctx, func() {} +} diff --git a/vendor/go.opencensus.io/trace/tracestate/tracestate.go b/vendor/go.opencensus.io/trace/tracestate/tracestate.go new file mode 100644 index 000000000..2d6c713eb --- /dev/null +++ b/vendor/go.opencensus.io/trace/tracestate/tracestate.go @@ -0,0 +1,147 @@ +// Copyright 2018, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package tracestate implements support for the Tracestate header of the +// W3C TraceContext propagation format. +package tracestate + +import ( + "fmt" + "regexp" +) + +const ( + keyMaxSize = 256 + valueMaxSize = 256 + maxKeyValuePairs = 32 +) + +const ( + keyWithoutVendorFormat = `[a-z][_0-9a-z\-\*\/]{0,255}` + keyWithVendorFormat = `[a-z][_0-9a-z\-\*\/]{0,240}@[a-z][_0-9a-z\-\*\/]{0,13}` + keyFormat = `(` + keyWithoutVendorFormat + `)|(` + keyWithVendorFormat + `)` + valueFormat = `[\x20-\x2b\x2d-\x3c\x3e-\x7e]{0,255}[\x21-\x2b\x2d-\x3c\x3e-\x7e]` +) + +var keyValidationRegExp = regexp.MustCompile(`^(` + keyFormat + `)$`) +var valueValidationRegExp = regexp.MustCompile(`^(` + valueFormat + `)$`) + +// Tracestate represents tracing-system specific context in a list of key-value pairs. Tracestate allows different +// vendors propagate additional information and inter-operate with their legacy Id formats. +type Tracestate struct { + entries []Entry +} + +// Entry represents one key-value pair in a list of key-value pair of Tracestate. +type Entry struct { + // Key is an opaque string up to 256 characters printable. It MUST begin with a lowercase letter, + // and can only contain lowercase letters a-z, digits 0-9, underscores _, dashes -, asterisks *, and + // forward slashes /. + Key string + + // Value is an opaque string up to 256 characters printable ASCII RFC0020 characters (i.e., the + // range 0x20 to 0x7E) except comma , and =. + Value string +} + +// Entries returns a slice of Entry. +func (ts *Tracestate) Entries() []Entry { + if ts == nil { + return nil + } + return ts.entries +} + +func (ts *Tracestate) remove(key string) *Entry { + for index, entry := range ts.entries { + if entry.Key == key { + ts.entries = append(ts.entries[:index], ts.entries[index+1:]...) + return &entry + } + } + return nil +} + +func (ts *Tracestate) add(entries []Entry) error { + for _, entry := range entries { + ts.remove(entry.Key) + } + if len(ts.entries)+len(entries) > maxKeyValuePairs { + return fmt.Errorf("adding %d key-value pairs to current %d pairs exceeds the limit of %d", + len(entries), len(ts.entries), maxKeyValuePairs) + } + ts.entries = append(entries, ts.entries...) + return nil +} + +func isValid(entry Entry) bool { + return keyValidationRegExp.MatchString(entry.Key) && + valueValidationRegExp.MatchString(entry.Value) +} + +func containsDuplicateKey(entries ...Entry) (string, bool) { + keyMap := make(map[string]int) + for _, entry := range entries { + if _, ok := keyMap[entry.Key]; ok { + return entry.Key, true + } + keyMap[entry.Key] = 1 + } + return "", false +} + +func areEntriesValid(entries ...Entry) (*Entry, bool) { + for _, entry := range entries { + if !isValid(entry) { + return &entry, false + } + } + return nil, true +} + +// New creates a Tracestate object from a parent and/or entries (key-value pair). +// Entries from the parent are copied if present. The entries passed to this function +// are inserted in front of those copied from the parent. If an entry copied from the +// parent contains the same key as one of the entry in entries then the entry copied +// from the parent is removed. See add func. +// +// An error is returned with nil Tracestate if +// 1. one or more entry in entries is invalid. +// 2. two or more entries in the input entries have the same key. +// 3. the number of entries combined from the parent and the input entries exceeds maxKeyValuePairs. +// (duplicate entry is counted only once). +func New(parent *Tracestate, entries ...Entry) (*Tracestate, error) { + if parent == nil && len(entries) == 0 { + return nil, nil + } + if entry, ok := areEntriesValid(entries...); !ok { + return nil, fmt.Errorf("key-value pair {%s, %s} is invalid", entry.Key, entry.Value) + } + + if key, duplicate := containsDuplicateKey(entries...); duplicate { + return nil, fmt.Errorf("contains duplicate keys (%s)", key) + } + + tracestate := Tracestate{} + + if parent != nil && len(parent.entries) > 0 { + tracestate.entries = append([]Entry{}, parent.entries...) + } + + err := tracestate.add(entries) + if err != nil { + return nil, err + } + return &tracestate, nil +} diff --git a/vendor/go.uber.org/atomic/.gitignore b/vendor/go.uber.org/atomic/.gitignore index 0a4504f11..c3fa25389 100644 --- a/vendor/go.uber.org/atomic/.gitignore +++ b/vendor/go.uber.org/atomic/.gitignore @@ -1,6 +1,7 @@ +/bin .DS_Store /vendor -/cover +cover.html cover.out lint.log diff --git a/vendor/go.uber.org/atomic/.travis.yml b/vendor/go.uber.org/atomic/.travis.yml index 58957222a..4e73268b6 100644 --- a/vendor/go.uber.org/atomic/.travis.yml +++ b/vendor/go.uber.org/atomic/.travis.yml @@ -2,22 +2,26 @@ sudo: false language: go go_import_path: go.uber.org/atomic -go: - - 1.7 - - 1.8 - - 1.9 +env: + global: + - GO111MODULE=on + +matrix: + include: + - go: 1.12.x + - go: 1.13.x + env: LINT=1 cache: directories: - vendor -install: - - make install_ci +before_install: + - go version script: - - make test_ci - - scripts/test-ubergo.sh - - make lint + - test -z "$LINT" || make lint + - make cover after_success: - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/go.uber.org/atomic/CHANGELOG.md b/vendor/go.uber.org/atomic/CHANGELOG.md new file mode 100644 index 000000000..aef8b6ebc --- /dev/null +++ b/vendor/go.uber.org/atomic/CHANGELOG.md @@ -0,0 +1,64 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [1.6.0] - 2020-02-24 +### Changed +- Drop library dependency on `golang.org/x/{lint, tools}`. + +## [1.5.1] - 2019-11-19 +- Fix bug where `Bool.CAS` and `Bool.Toggle` do work correctly together + causing `CAS` to fail even though the old value matches. + +## [1.5.0] - 2019-10-29 +### Changed +- With Go modules, only the `go.uber.org/atomic` import path is supported now. + If you need to use the old import path, please add a `replace` directive to + your `go.mod`. + +## [1.4.0] - 2019-05-01 +### Added + - Add `atomic.Error` type for atomic operations on `error` values. + +## [1.3.2] - 2018-05-02 +### Added +- Add `atomic.Duration` type for atomic operations on `time.Duration` values. + +## [1.3.1] - 2017-11-14 +### Fixed +- Revert optimization for `atomic.String.Store("")` which caused data races. + +## [1.3.0] - 2017-11-13 +### Added +- Add `atomic.Bool.CAS` for compare-and-swap semantics on bools. + +### Changed +- Optimize `atomic.String.Store("")` by avoiding an allocation. + +## [1.2.0] - 2017-04-12 +### Added +- Shadow `atomic.Value` from `sync/atomic`. + +## [1.1.0] - 2017-03-10 +### Added +- Add atomic `Float64` type. + +### Changed +- Support new `go.uber.org/atomic` import path. + +## [1.0.0] - 2016-07-18 + +- Initial release. + +[1.6.0]: https://github.com/uber-go/atomic/compare/v1.5.1...v1.6.0 +[1.5.1]: https://github.com/uber-go/atomic/compare/v1.5.0...v1.5.1 +[1.5.0]: https://github.com/uber-go/atomic/compare/v1.4.0...v1.5.0 +[1.4.0]: https://github.com/uber-go/atomic/compare/v1.3.2...v1.4.0 +[1.3.2]: https://github.com/uber-go/atomic/compare/v1.3.1...v1.3.2 +[1.3.1]: https://github.com/uber-go/atomic/compare/v1.3.0...v1.3.1 +[1.3.0]: https://github.com/uber-go/atomic/compare/v1.2.0...v1.3.0 +[1.2.0]: https://github.com/uber-go/atomic/compare/v1.1.0...v1.2.0 +[1.1.0]: https://github.com/uber-go/atomic/compare/v1.0.0...v1.1.0 +[1.0.0]: https://github.com/uber-go/atomic/releases/tag/v1.0.0 diff --git a/vendor/go.uber.org/atomic/Makefile b/vendor/go.uber.org/atomic/Makefile index dfc63d9db..39af0fb63 100644 --- a/vendor/go.uber.org/atomic/Makefile +++ b/vendor/go.uber.org/atomic/Makefile @@ -1,64 +1,35 @@ -PACKAGES := $(shell glide nv) -# Many Go tools take file globs or directories as arguments instead of packages. -PACKAGE_FILES ?= *.go +# Directory to place `go install`ed binaries into. +export GOBIN ?= $(shell pwd)/bin +GOLINT = $(GOBIN)/golint -# The linting tools evolve with each Go version, so run them only on the latest -# stable release. -GO_VERSION := $(shell go version | cut -d " " -f 3) -GO_MINOR_VERSION := $(word 2,$(subst ., ,$(GO_VERSION))) -LINTABLE_MINOR_VERSIONS := 7 8 -ifneq ($(filter $(LINTABLE_MINOR_VERSIONS),$(GO_MINOR_VERSION)),) -SHOULD_LINT := true -endif - - -export GO15VENDOREXPERIMENT=1 - +GO_FILES ?= *.go .PHONY: build build: - go build -i $(PACKAGES) - - -.PHONY: install -install: - glide --version || go get github.com/Masterminds/glide - glide install - + go build ./... .PHONY: test test: - go test -cover -race $(PACKAGES) + go test -race ./... +.PHONY: gofmt +gofmt: + $(eval FMT_LOG := $(shell mktemp -t gofmt.XXXXX)) + gofmt -e -s -l $(GO_FILES) > $(FMT_LOG) || true + @[ ! -s "$(FMT_LOG)" ] || (echo "gofmt failed:" && cat $(FMT_LOG) && false) -.PHONY: install_ci -install_ci: install - go get github.com/wadey/gocovmerge - go get github.com/mattn/goveralls - go get golang.org/x/tools/cmd/cover -ifdef SHOULD_LINT - go get github.com/golang/lint/golint -endif +$(GOLINT): + go install golang.org/x/lint/golint -.PHONY: lint -lint: -ifdef SHOULD_LINT - @rm -rf lint.log - @echo "Checking formatting..." - @gofmt -d -s $(PACKAGE_FILES) 2>&1 | tee lint.log - @echo "Checking vet..." - @$(foreach dir,$(PACKAGE_FILES),go tool vet $(dir) 2>&1 | tee -a lint.log;) - @echo "Checking lint..." - @$(foreach dir,$(PKGS),golint $(dir) 2>&1 | tee -a lint.log;) - @echo "Checking for unresolved FIXMEs..." - @git grep -i fixme | grep -v -e vendor -e Makefile | tee -a lint.log - @[ ! -s lint.log ] -else - @echo "Skipping linters on" $(GO_VERSION) -endif +.PHONY: golint +golint: $(GOLINT) + $(GOLINT) ./... +.PHONY: lint +lint: gofmt golint -.PHONY: test_ci -test_ci: install_ci build - ./scripts/cover.sh $(shell go list $(PACKAGES)) +.PHONY: cover +cover: + go test -coverprofile=cover.out -coverpkg ./... -v ./... + go tool cover -html=cover.out -o cover.html diff --git a/vendor/go.uber.org/atomic/README.md b/vendor/go.uber.org/atomic/README.md index 6505abf65..ade0c20f1 100644 --- a/vendor/go.uber.org/atomic/README.md +++ b/vendor/go.uber.org/atomic/README.md @@ -3,9 +3,34 @@ Simple wrappers for primitive types to enforce atomic access. ## Installation -`go get -u go.uber.org/atomic` + +```shell +$ go get -u go.uber.org/atomic@v1 +``` + +### Legacy Import Path + +As of v1.5.0, the import path `go.uber.org/atomic` is the only supported way +of using this package. If you are using Go modules, this package will fail to +compile with the legacy import path path `github.com/uber-go/atomic`. + +We recommend migrating your code to the new import path but if you're unable +to do so, or if your dependencies are still using the old import path, you +will have to add a `replace` directive to your `go.mod` file downgrading the +legacy import path to an older version. + +``` +replace github.com/uber-go/atomic => github.com/uber-go/atomic v1.4.0 +``` + +You can do so automatically by running the following command. + +```shell +$ go mod edit -replace github.com/uber-go/atomic=github.com/uber-go/atomic@v1.4.0 +``` ## Usage + The standard library's `sync/atomic` is powerful, but it's easy to forget which variables must be accessed atomically. `go.uber.org/atomic` preserves all the functionality of the standard library, but wraps the primitive types to @@ -21,15 +46,17 @@ atom.CAS(40, 11) See the [documentation][doc] for a complete API specification. ## Development Status + Stable. -
    +--- + Released under the [MIT License](LICENSE.txt). [doc-img]: https://godoc.org/github.com/uber-go/atomic?status.svg [doc]: https://godoc.org/go.uber.org/atomic -[ci-img]: https://travis-ci.org/uber-go/atomic.svg?branch=master -[ci]: https://travis-ci.org/uber-go/atomic +[ci-img]: https://travis-ci.com/uber-go/atomic.svg?branch=master +[ci]: https://travis-ci.com/uber-go/atomic [cov-img]: https://codecov.io/gh/uber-go/atomic/branch/master/graph/badge.svg [cov]: https://codecov.io/gh/uber-go/atomic [reportcard-img]: https://goreportcard.com/badge/go.uber.org/atomic diff --git a/vendor/go.uber.org/atomic/atomic.go b/vendor/go.uber.org/atomic/atomic.go index 1db6849fc..ad5fa0980 100644 --- a/vendor/go.uber.org/atomic/atomic.go +++ b/vendor/go.uber.org/atomic/atomic.go @@ -250,11 +250,16 @@ func (b *Bool) Swap(new bool) bool { // Toggle atomically negates the Boolean and returns the previous value. func (b *Bool) Toggle() bool { - return truthy(atomic.AddUint32(&b.v, 1) - 1) + for { + old := b.Load() + if b.CAS(old, !old) { + return old + } + } } func truthy(n uint32) bool { - return n&1 == 1 + return n == 1 } func boolToInt(b bool) uint32 { diff --git a/vendor/go.uber.org/atomic/error.go b/vendor/go.uber.org/atomic/error.go new file mode 100644 index 000000000..0489d19ba --- /dev/null +++ b/vendor/go.uber.org/atomic/error.go @@ -0,0 +1,55 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package atomic + +// Error is an atomic type-safe wrapper around Value for errors +type Error struct{ v Value } + +// errorHolder is non-nil holder for error object. +// atomic.Value panics on saving nil object, so err object needs to be +// wrapped with valid object first. +type errorHolder struct{ err error } + +// NewError creates new atomic error object +func NewError(err error) *Error { + e := &Error{} + if err != nil { + e.Store(err) + } + return e +} + +// Load atomically loads the wrapped error +func (e *Error) Load() error { + v := e.v.Load() + if v == nil { + return nil + } + + eh := v.(errorHolder) + return eh.err +} + +// Store atomically stores error. +// NOTE: a holder object is allocated on each Store call. +func (e *Error) Store(err error) { + e.v.Store(errorHolder{err: err}) +} diff --git a/vendor/go.uber.org/atomic/glide.lock b/vendor/go.uber.org/atomic/glide.lock deleted file mode 100644 index 3c72c5997..000000000 --- a/vendor/go.uber.org/atomic/glide.lock +++ /dev/null @@ -1,17 +0,0 @@ -hash: f14d51408e3e0e4f73b34e4039484c78059cd7fc5f4996fdd73db20dc8d24f53 -updated: 2016-10-27T00:10:51.16960137-07:00 -imports: [] -testImports: -- name: github.com/davecgh/go-spew - version: 5215b55f46b2b919f50a1df0eaa5886afe4e3b3d - subpackages: - - spew -- name: github.com/pmezard/go-difflib - version: d8ed2627bdf02c080bf22230dbb337003b7aba2d - subpackages: - - difflib -- name: github.com/stretchr/testify - version: d77da356e56a7428ad25149ca77381849a6a5232 - subpackages: - - assert - - require diff --git a/vendor/go.uber.org/atomic/glide.yaml b/vendor/go.uber.org/atomic/glide.yaml deleted file mode 100644 index 4cf608ec0..000000000 --- a/vendor/go.uber.org/atomic/glide.yaml +++ /dev/null @@ -1,6 +0,0 @@ -package: go.uber.org/atomic -testImport: -- package: github.com/stretchr/testify - subpackages: - - assert - - require diff --git a/vendor/go.uber.org/atomic/go.mod b/vendor/go.uber.org/atomic/go.mod new file mode 100644 index 000000000..a935daebb --- /dev/null +++ b/vendor/go.uber.org/atomic/go.mod @@ -0,0 +1,10 @@ +module go.uber.org/atomic + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/stretchr/testify v1.3.0 + golang.org/x/lint v0.0.0-20190930215403-16217165b5de + golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c // indirect +) + +go 1.13 diff --git a/vendor/go.uber.org/atomic/go.sum b/vendor/go.uber.org/atomic/go.sum new file mode 100644 index 000000000..51b2b62af --- /dev/null +++ b/vendor/go.uber.org/atomic/go.sum @@ -0,0 +1,22 @@ +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd h1:/e+gpKk9r3dJobndpTytxS2gOy6m5uvpg+ISQoEcusQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c h1:IGkKhmfzcztjm6gYkykvu/NiS8kaqbCWAEWWAyf8J5U= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/vendor/golang.org/x/crypto/blake2b/blake2b.go b/vendor/golang.org/x/crypto/blake2b/blake2b.go index 58ea87536..d2e98d429 100644 --- a/vendor/golang.org/x/crypto/blake2b/blake2b.go +++ b/vendor/golang.org/x/crypto/blake2b/blake2b.go @@ -5,6 +5,8 @@ // Package blake2b implements the BLAKE2b hash algorithm defined by RFC 7693 // and the extendable output function (XOF) BLAKE2Xb. // +// BLAKE2b is optimized for 64-bit platforms—including NEON-enabled ARMs—and +// produces digests of any size between 1 and 64 bytes. // For a detailed specification of BLAKE2b see https://blake2.net/blake2.pdf // and for BLAKE2Xb see https://blake2.net/blake2x.pdf // @@ -75,19 +77,19 @@ func Sum256(data []byte) [Size256]byte { } // New512 returns a new hash.Hash computing the BLAKE2b-512 checksum. A non-nil -// key turns the hash into a MAC. The key must between zero and 64 bytes long. +// key turns the hash into a MAC. The key must be between zero and 64 bytes long. func New512(key []byte) (hash.Hash, error) { return newDigest(Size, key) } // New384 returns a new hash.Hash computing the BLAKE2b-384 checksum. A non-nil -// key turns the hash into a MAC. The key must between zero and 64 bytes long. +// key turns the hash into a MAC. The key must be between zero and 64 bytes long. func New384(key []byte) (hash.Hash, error) { return newDigest(Size384, key) } // New256 returns a new hash.Hash computing the BLAKE2b-256 checksum. A non-nil -// key turns the hash into a MAC. The key must between zero and 64 bytes long. +// key turns the hash into a MAC. The key must be between zero and 64 bytes long. func New256(key []byte) (hash.Hash, error) { return newDigest(Size256, key) } // New returns a new hash.Hash computing the BLAKE2b checksum with a custom length. -// A non-nil key turns the hash into a MAC. The key must between zero and 64 bytes long. +// A non-nil key turns the hash into a MAC. The key must be between zero and 64 bytes long. // The hash size can be a value between 1 and 64 but it is highly recommended to use // values equal or greater than: // - 32 if BLAKE2b is used as a hash function (The key is zero bytes long). diff --git a/vendor/golang.org/x/crypto/blake2b/blake2b_generic.go b/vendor/golang.org/x/crypto/blake2b/blake2b_generic.go index 4bd2abc91..3168a8aa3 100644 --- a/vendor/golang.org/x/crypto/blake2b/blake2b_generic.go +++ b/vendor/golang.org/x/crypto/blake2b/blake2b_generic.go @@ -4,7 +4,10 @@ package blake2b -import "encoding/binary" +import ( + "encoding/binary" + "math/bits" +) // the precomputed values for BLAKE2b // there are 12 16-byte arrays - one for each round @@ -51,118 +54,118 @@ func hashBlocksGeneric(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) { v0 += m[s[0]] v0 += v4 v12 ^= v0 - v12 = v12<<(64-32) | v12>>32 + v12 = bits.RotateLeft64(v12, -32) v8 += v12 v4 ^= v8 - v4 = v4<<(64-24) | v4>>24 + v4 = bits.RotateLeft64(v4, -24) v1 += m[s[1]] v1 += v5 v13 ^= v1 - v13 = v13<<(64-32) | v13>>32 + v13 = bits.RotateLeft64(v13, -32) v9 += v13 v5 ^= v9 - v5 = v5<<(64-24) | v5>>24 + v5 = bits.RotateLeft64(v5, -24) v2 += m[s[2]] v2 += v6 v14 ^= v2 - v14 = v14<<(64-32) | v14>>32 + v14 = bits.RotateLeft64(v14, -32) v10 += v14 v6 ^= v10 - v6 = v6<<(64-24) | v6>>24 + v6 = bits.RotateLeft64(v6, -24) v3 += m[s[3]] v3 += v7 v15 ^= v3 - v15 = v15<<(64-32) | v15>>32 + v15 = bits.RotateLeft64(v15, -32) v11 += v15 v7 ^= v11 - v7 = v7<<(64-24) | v7>>24 + v7 = bits.RotateLeft64(v7, -24) v0 += m[s[4]] v0 += v4 v12 ^= v0 - v12 = v12<<(64-16) | v12>>16 + v12 = bits.RotateLeft64(v12, -16) v8 += v12 v4 ^= v8 - v4 = v4<<(64-63) | v4>>63 + v4 = bits.RotateLeft64(v4, -63) v1 += m[s[5]] v1 += v5 v13 ^= v1 - v13 = v13<<(64-16) | v13>>16 + v13 = bits.RotateLeft64(v13, -16) v9 += v13 v5 ^= v9 - v5 = v5<<(64-63) | v5>>63 + v5 = bits.RotateLeft64(v5, -63) v2 += m[s[6]] v2 += v6 v14 ^= v2 - v14 = v14<<(64-16) | v14>>16 + v14 = bits.RotateLeft64(v14, -16) v10 += v14 v6 ^= v10 - v6 = v6<<(64-63) | v6>>63 + v6 = bits.RotateLeft64(v6, -63) v3 += m[s[7]] v3 += v7 v15 ^= v3 - v15 = v15<<(64-16) | v15>>16 + v15 = bits.RotateLeft64(v15, -16) v11 += v15 v7 ^= v11 - v7 = v7<<(64-63) | v7>>63 + v7 = bits.RotateLeft64(v7, -63) v0 += m[s[8]] v0 += v5 v15 ^= v0 - v15 = v15<<(64-32) | v15>>32 + v15 = bits.RotateLeft64(v15, -32) v10 += v15 v5 ^= v10 - v5 = v5<<(64-24) | v5>>24 + v5 = bits.RotateLeft64(v5, -24) v1 += m[s[9]] v1 += v6 v12 ^= v1 - v12 = v12<<(64-32) | v12>>32 + v12 = bits.RotateLeft64(v12, -32) v11 += v12 v6 ^= v11 - v6 = v6<<(64-24) | v6>>24 + v6 = bits.RotateLeft64(v6, -24) v2 += m[s[10]] v2 += v7 v13 ^= v2 - v13 = v13<<(64-32) | v13>>32 + v13 = bits.RotateLeft64(v13, -32) v8 += v13 v7 ^= v8 - v7 = v7<<(64-24) | v7>>24 + v7 = bits.RotateLeft64(v7, -24) v3 += m[s[11]] v3 += v4 v14 ^= v3 - v14 = v14<<(64-32) | v14>>32 + v14 = bits.RotateLeft64(v14, -32) v9 += v14 v4 ^= v9 - v4 = v4<<(64-24) | v4>>24 + v4 = bits.RotateLeft64(v4, -24) v0 += m[s[12]] v0 += v5 v15 ^= v0 - v15 = v15<<(64-16) | v15>>16 + v15 = bits.RotateLeft64(v15, -16) v10 += v15 v5 ^= v10 - v5 = v5<<(64-63) | v5>>63 + v5 = bits.RotateLeft64(v5, -63) v1 += m[s[13]] v1 += v6 v12 ^= v1 - v12 = v12<<(64-16) | v12>>16 + v12 = bits.RotateLeft64(v12, -16) v11 += v12 v6 ^= v11 - v6 = v6<<(64-63) | v6>>63 + v6 = bits.RotateLeft64(v6, -63) v2 += m[s[14]] v2 += v7 v13 ^= v2 - v13 = v13<<(64-16) | v13>>16 + v13 = bits.RotateLeft64(v13, -16) v8 += v13 v7 ^= v8 - v7 = v7<<(64-63) | v7>>63 + v7 = bits.RotateLeft64(v7, -63) v3 += m[s[15]] v3 += v4 v14 ^= v3 - v14 = v14<<(64-16) | v14>>16 + v14 = bits.RotateLeft64(v14, -16) v9 += v14 v4 ^= v9 - v4 = v4<<(64-63) | v4>>63 + v4 = bits.RotateLeft64(v4, -63) } diff --git a/vendor/golang.org/x/crypto/blake2b/blake2x.go b/vendor/golang.org/x/crypto/blake2b/blake2x.go index c814496a7..52c414db0 100644 --- a/vendor/golang.org/x/crypto/blake2b/blake2x.go +++ b/vendor/golang.org/x/crypto/blake2b/blake2x.go @@ -29,7 +29,7 @@ type XOF interface { } // OutputLengthUnknown can be used as the size argument to NewXOF to indicate -// the the length of the output is not known in advance. +// the length of the output is not known in advance. const OutputLengthUnknown = 0 // magicUnknownOutputLength is a magic value for the output size that indicates diff --git a/vendor/golang.org/x/crypto/blowfish/block.go b/vendor/golang.org/x/crypto/blowfish/block.go new file mode 100644 index 000000000..9d80f1952 --- /dev/null +++ b/vendor/golang.org/x/crypto/blowfish/block.go @@ -0,0 +1,159 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package blowfish + +// getNextWord returns the next big-endian uint32 value from the byte slice +// at the given position in a circular manner, updating the position. +func getNextWord(b []byte, pos *int) uint32 { + var w uint32 + j := *pos + for i := 0; i < 4; i++ { + w = w<<8 | uint32(b[j]) + j++ + if j >= len(b) { + j = 0 + } + } + *pos = j + return w +} + +// ExpandKey performs a key expansion on the given *Cipher. Specifically, it +// performs the Blowfish algorithm's key schedule which sets up the *Cipher's +// pi and substitution tables for calls to Encrypt. This is used, primarily, +// by the bcrypt package to reuse the Blowfish key schedule during its +// set up. It's unlikely that you need to use this directly. +func ExpandKey(key []byte, c *Cipher) { + j := 0 + for i := 0; i < 18; i++ { + // Using inlined getNextWord for performance. + var d uint32 + for k := 0; k < 4; k++ { + d = d<<8 | uint32(key[j]) + j++ + if j >= len(key) { + j = 0 + } + } + c.p[i] ^= d + } + + var l, r uint32 + for i := 0; i < 18; i += 2 { + l, r = encryptBlock(l, r, c) + c.p[i], c.p[i+1] = l, r + } + + for i := 0; i < 256; i += 2 { + l, r = encryptBlock(l, r, c) + c.s0[i], c.s0[i+1] = l, r + } + for i := 0; i < 256; i += 2 { + l, r = encryptBlock(l, r, c) + c.s1[i], c.s1[i+1] = l, r + } + for i := 0; i < 256; i += 2 { + l, r = encryptBlock(l, r, c) + c.s2[i], c.s2[i+1] = l, r + } + for i := 0; i < 256; i += 2 { + l, r = encryptBlock(l, r, c) + c.s3[i], c.s3[i+1] = l, r + } +} + +// This is similar to ExpandKey, but folds the salt during the key +// schedule. While ExpandKey is essentially expandKeyWithSalt with an all-zero +// salt passed in, reusing ExpandKey turns out to be a place of inefficiency +// and specializing it here is useful. +func expandKeyWithSalt(key []byte, salt []byte, c *Cipher) { + j := 0 + for i := 0; i < 18; i++ { + c.p[i] ^= getNextWord(key, &j) + } + + j = 0 + var l, r uint32 + for i := 0; i < 18; i += 2 { + l ^= getNextWord(salt, &j) + r ^= getNextWord(salt, &j) + l, r = encryptBlock(l, r, c) + c.p[i], c.p[i+1] = l, r + } + + for i := 0; i < 256; i += 2 { + l ^= getNextWord(salt, &j) + r ^= getNextWord(salt, &j) + l, r = encryptBlock(l, r, c) + c.s0[i], c.s0[i+1] = l, r + } + + for i := 0; i < 256; i += 2 { + l ^= getNextWord(salt, &j) + r ^= getNextWord(salt, &j) + l, r = encryptBlock(l, r, c) + c.s1[i], c.s1[i+1] = l, r + } + + for i := 0; i < 256; i += 2 { + l ^= getNextWord(salt, &j) + r ^= getNextWord(salt, &j) + l, r = encryptBlock(l, r, c) + c.s2[i], c.s2[i+1] = l, r + } + + for i := 0; i < 256; i += 2 { + l ^= getNextWord(salt, &j) + r ^= getNextWord(salt, &j) + l, r = encryptBlock(l, r, c) + c.s3[i], c.s3[i+1] = l, r + } +} + +func encryptBlock(l, r uint32, c *Cipher) (uint32, uint32) { + xl, xr := l, r + xl ^= c.p[0] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[1] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[2] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[3] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[4] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[5] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[6] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[7] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[8] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[9] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[10] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[11] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[12] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[13] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[14] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[15] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[16] + xr ^= c.p[17] + return xr, xl +} + +func decryptBlock(l, r uint32, c *Cipher) (uint32, uint32) { + xl, xr := l, r + xl ^= c.p[17] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[16] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[15] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[14] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[13] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[12] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[11] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[10] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[9] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[8] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[7] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[6] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[5] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[4] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[3] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[2] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[1] + xr ^= c.p[0] + return xr, xl +} diff --git a/vendor/golang.org/x/crypto/blowfish/cipher.go b/vendor/golang.org/x/crypto/blowfish/cipher.go new file mode 100644 index 000000000..213bf204a --- /dev/null +++ b/vendor/golang.org/x/crypto/blowfish/cipher.go @@ -0,0 +1,99 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package blowfish implements Bruce Schneier's Blowfish encryption algorithm. +// +// Blowfish is a legacy cipher and its short block size makes it vulnerable to +// birthday bound attacks (see https://sweet32.info). It should only be used +// where compatibility with legacy systems, not security, is the goal. +// +// Deprecated: any new system should use AES (from crypto/aes, if necessary in +// an AEAD mode like crypto/cipher.NewGCM) or XChaCha20-Poly1305 (from +// golang.org/x/crypto/chacha20poly1305). +package blowfish // import "golang.org/x/crypto/blowfish" + +// The code is a port of Bruce Schneier's C implementation. +// See https://www.schneier.com/blowfish.html. + +import "strconv" + +// The Blowfish block size in bytes. +const BlockSize = 8 + +// A Cipher is an instance of Blowfish encryption using a particular key. +type Cipher struct { + p [18]uint32 + s0, s1, s2, s3 [256]uint32 +} + +type KeySizeError int + +func (k KeySizeError) Error() string { + return "crypto/blowfish: invalid key size " + strconv.Itoa(int(k)) +} + +// NewCipher creates and returns a Cipher. +// The key argument should be the Blowfish key, from 1 to 56 bytes. +func NewCipher(key []byte) (*Cipher, error) { + var result Cipher + if k := len(key); k < 1 || k > 56 { + return nil, KeySizeError(k) + } + initCipher(&result) + ExpandKey(key, &result) + return &result, nil +} + +// NewSaltedCipher creates a returns a Cipher that folds a salt into its key +// schedule. For most purposes, NewCipher, instead of NewSaltedCipher, is +// sufficient and desirable. For bcrypt compatibility, the key can be over 56 +// bytes. +func NewSaltedCipher(key, salt []byte) (*Cipher, error) { + if len(salt) == 0 { + return NewCipher(key) + } + var result Cipher + if k := len(key); k < 1 { + return nil, KeySizeError(k) + } + initCipher(&result) + expandKeyWithSalt(key, salt, &result) + return &result, nil +} + +// BlockSize returns the Blowfish block size, 8 bytes. +// It is necessary to satisfy the Block interface in the +// package "crypto/cipher". +func (c *Cipher) BlockSize() int { return BlockSize } + +// Encrypt encrypts the 8-byte buffer src using the key k +// and stores the result in dst. +// Note that for amounts of data larger than a block, +// it is not safe to just call Encrypt on successive blocks; +// instead, use an encryption mode like CBC (see crypto/cipher/cbc.go). +func (c *Cipher) Encrypt(dst, src []byte) { + l := uint32(src[0])<<24 | uint32(src[1])<<16 | uint32(src[2])<<8 | uint32(src[3]) + r := uint32(src[4])<<24 | uint32(src[5])<<16 | uint32(src[6])<<8 | uint32(src[7]) + l, r = encryptBlock(l, r, c) + dst[0], dst[1], dst[2], dst[3] = byte(l>>24), byte(l>>16), byte(l>>8), byte(l) + dst[4], dst[5], dst[6], dst[7] = byte(r>>24), byte(r>>16), byte(r>>8), byte(r) +} + +// Decrypt decrypts the 8-byte buffer src using the key k +// and stores the result in dst. +func (c *Cipher) Decrypt(dst, src []byte) { + l := uint32(src[0])<<24 | uint32(src[1])<<16 | uint32(src[2])<<8 | uint32(src[3]) + r := uint32(src[4])<<24 | uint32(src[5])<<16 | uint32(src[6])<<8 | uint32(src[7]) + l, r = decryptBlock(l, r, c) + dst[0], dst[1], dst[2], dst[3] = byte(l>>24), byte(l>>16), byte(l>>8), byte(l) + dst[4], dst[5], dst[6], dst[7] = byte(r>>24), byte(r>>16), byte(r>>8), byte(r) +} + +func initCipher(c *Cipher) { + copy(c.p[0:], p[0:]) + copy(c.s0[0:], s0[0:]) + copy(c.s1[0:], s1[0:]) + copy(c.s2[0:], s2[0:]) + copy(c.s3[0:], s3[0:]) +} diff --git a/vendor/golang.org/x/crypto/blowfish/const.go b/vendor/golang.org/x/crypto/blowfish/const.go new file mode 100644 index 000000000..d04077595 --- /dev/null +++ b/vendor/golang.org/x/crypto/blowfish/const.go @@ -0,0 +1,199 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// The startup permutation array and substitution boxes. +// They are the hexadecimal digits of PI; see: +// https://www.schneier.com/code/constants.txt. + +package blowfish + +var s0 = [256]uint32{ + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, + 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, + 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0x0d95748f, 0x728eb658, + 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, + 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, + 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6, + 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, + 0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, 0xe98575b1, + 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, + 0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, + 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176, + 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, + 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, + 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, + 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, + 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, + 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, + 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, + 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, + 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8, + 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, + 0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0, + 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, + 0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, + 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705, + 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, + 0x226800bb, 0x57b8e0af, 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, + 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, + 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, + 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, + 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a, +} + +var s1 = [256]uint32{ + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, + 0x9cee60b8, 0x8fedb266, 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, + 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, + 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, + 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, + 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, + 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, + 0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, + 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908, + 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, + 0x501adde6, 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908, + 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, + 0x3c11183b, 0x5924a509, 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, + 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, + 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, + 0x1939260f, 0x19c27960, 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, + 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, + 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, + 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, + 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, + 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, + 0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, + 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, + 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, + 0xdb6c4f15, 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646, + 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, + 0x1dadf43e, 0x233f7061, 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, + 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, + 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, + 0x675fda79, 0xe3674340, 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, + 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7, +} + +var s2 = [256]uint32{ + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, + 0xbcf46b2e, 0xd4a20068, 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, + 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, + 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, + 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, + 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, + 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, + 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, + 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, 0x55a867bc, 0xa1159a58, + 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, + 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, + 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, 0x257b7834, 0x602a9c60, + 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, + 0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341, 0x992eff74, + 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, + 0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, + 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979, + 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, + 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, + 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, + 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, + 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, + 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, + 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, + 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, + 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, 0xdcb7da83, 0x573906fe, + 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, + 0x006058aa, 0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, + 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409, 0x4b7c0188, + 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, + 0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, + 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0, +} + +var s3 = [256]uint32{ + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, + 0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79, + 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, + 0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, + 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1, + 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, + 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, + 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, + 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, + 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, + 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5, + 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, + 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, + 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 0xb39a460a, 0x6445c0dd, + 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, + 0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc, + 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, + 0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, + 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a, + 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, + 0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, + 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, + 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, + 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, + 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 0xf523f357, 0xa6327623, + 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, + 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, + 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3, + 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, + 0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6, +} + +var p = [18]uint32{ + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, + 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b, +} diff --git a/vendor/golang.org/x/crypto/cast5/cast5.go b/vendor/golang.org/x/crypto/cast5/cast5.go index 0b4af37bd..ddcbeb6f2 100644 --- a/vendor/golang.org/x/crypto/cast5/cast5.go +++ b/vendor/golang.org/x/crypto/cast5/cast5.go @@ -2,8 +2,15 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Package cast5 implements CAST5, as defined in RFC 2144. CAST5 is a common -// OpenPGP cipher. +// Package cast5 implements CAST5, as defined in RFC 2144. +// +// CAST5 is a legacy cipher and its short block size makes it vulnerable to +// birthday bound attacks (see https://sweet32.info). It should only be used +// where compatibility with legacy systems, not security, is the goal. +// +// Deprecated: any new system should use AES (from crypto/aes, if necessary in +// an AEAD mode like crypto/cipher.NewGCM) or XChaCha20-Poly1305 (from +// golang.org/x/crypto/chacha20poly1305). package cast5 // import "golang.org/x/crypto/cast5" import "errors" diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_arm64.go b/vendor/golang.org/x/crypto/chacha20/chacha_arm64.go new file mode 100644 index 000000000..b799e440b --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20/chacha_arm64.go @@ -0,0 +1,16 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.11,!gccgo,!purego + +package chacha20 + +const bufSize = 256 + +//go:noescape +func xorKeyStreamVX(dst, src []byte, key *[8]uint32, nonce *[3]uint32, counter *uint32) + +func (c *Cipher) xorKeyStreamBlocks(dst, src []byte) { + xorKeyStreamVX(dst, src, &c.key, &c.nonce, &c.counter) +} diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_arm64.s b/vendor/golang.org/x/crypto/chacha20/chacha_arm64.s new file mode 100644 index 000000000..891481539 --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20/chacha_arm64.s @@ -0,0 +1,307 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.11,!gccgo,!purego + +#include "textflag.h" + +#define NUM_ROUNDS 10 + +// func xorKeyStreamVX(dst, src []byte, key *[8]uint32, nonce *[3]uint32, counter *uint32) +TEXT ·xorKeyStreamVX(SB), NOSPLIT, $0 + MOVD dst+0(FP), R1 + MOVD src+24(FP), R2 + MOVD src_len+32(FP), R3 + MOVD key+48(FP), R4 + MOVD nonce+56(FP), R6 + MOVD counter+64(FP), R7 + + MOVD $·constants(SB), R10 + MOVD $·incRotMatrix(SB), R11 + + MOVW (R7), R20 + + AND $~255, R3, R13 + ADD R2, R13, R12 // R12 for block end + AND $255, R3, R13 +loop: + MOVD $NUM_ROUNDS, R21 + VLD1 (R11), [V30.S4, V31.S4] + + // load contants + // VLD4R (R10), [V0.S4, V1.S4, V2.S4, V3.S4] + WORD $0x4D60E940 + + // load keys + // VLD4R 16(R4), [V4.S4, V5.S4, V6.S4, V7.S4] + WORD $0x4DFFE884 + // VLD4R 16(R4), [V8.S4, V9.S4, V10.S4, V11.S4] + WORD $0x4DFFE888 + SUB $32, R4 + + // load counter + nonce + // VLD1R (R7), [V12.S4] + WORD $0x4D40C8EC + + // VLD3R (R6), [V13.S4, V14.S4, V15.S4] + WORD $0x4D40E8CD + + // update counter + VADD V30.S4, V12.S4, V12.S4 + +chacha: + // V0..V3 += V4..V7 + // V12..V15 <<<= ((V12..V15 XOR V0..V3), 16) + VADD V0.S4, V4.S4, V0.S4 + VADD V1.S4, V5.S4, V1.S4 + VADD V2.S4, V6.S4, V2.S4 + VADD V3.S4, V7.S4, V3.S4 + VEOR V12.B16, V0.B16, V12.B16 + VEOR V13.B16, V1.B16, V13.B16 + VEOR V14.B16, V2.B16, V14.B16 + VEOR V15.B16, V3.B16, V15.B16 + VREV32 V12.H8, V12.H8 + VREV32 V13.H8, V13.H8 + VREV32 V14.H8, V14.H8 + VREV32 V15.H8, V15.H8 + // V8..V11 += V12..V15 + // V4..V7 <<<= ((V4..V7 XOR V8..V11), 12) + VADD V8.S4, V12.S4, V8.S4 + VADD V9.S4, V13.S4, V9.S4 + VADD V10.S4, V14.S4, V10.S4 + VADD V11.S4, V15.S4, V11.S4 + VEOR V8.B16, V4.B16, V16.B16 + VEOR V9.B16, V5.B16, V17.B16 + VEOR V10.B16, V6.B16, V18.B16 + VEOR V11.B16, V7.B16, V19.B16 + VSHL $12, V16.S4, V4.S4 + VSHL $12, V17.S4, V5.S4 + VSHL $12, V18.S4, V6.S4 + VSHL $12, V19.S4, V7.S4 + VSRI $20, V16.S4, V4.S4 + VSRI $20, V17.S4, V5.S4 + VSRI $20, V18.S4, V6.S4 + VSRI $20, V19.S4, V7.S4 + + // V0..V3 += V4..V7 + // V12..V15 <<<= ((V12..V15 XOR V0..V3), 8) + VADD V0.S4, V4.S4, V0.S4 + VADD V1.S4, V5.S4, V1.S4 + VADD V2.S4, V6.S4, V2.S4 + VADD V3.S4, V7.S4, V3.S4 + VEOR V12.B16, V0.B16, V12.B16 + VEOR V13.B16, V1.B16, V13.B16 + VEOR V14.B16, V2.B16, V14.B16 + VEOR V15.B16, V3.B16, V15.B16 + VTBL V31.B16, [V12.B16], V12.B16 + VTBL V31.B16, [V13.B16], V13.B16 + VTBL V31.B16, [V14.B16], V14.B16 + VTBL V31.B16, [V15.B16], V15.B16 + + // V8..V11 += V12..V15 + // V4..V7 <<<= ((V4..V7 XOR V8..V11), 7) + VADD V12.S4, V8.S4, V8.S4 + VADD V13.S4, V9.S4, V9.S4 + VADD V14.S4, V10.S4, V10.S4 + VADD V15.S4, V11.S4, V11.S4 + VEOR V8.B16, V4.B16, V16.B16 + VEOR V9.B16, V5.B16, V17.B16 + VEOR V10.B16, V6.B16, V18.B16 + VEOR V11.B16, V7.B16, V19.B16 + VSHL $7, V16.S4, V4.S4 + VSHL $7, V17.S4, V5.S4 + VSHL $7, V18.S4, V6.S4 + VSHL $7, V19.S4, V7.S4 + VSRI $25, V16.S4, V4.S4 + VSRI $25, V17.S4, V5.S4 + VSRI $25, V18.S4, V6.S4 + VSRI $25, V19.S4, V7.S4 + + // V0..V3 += V5..V7, V4 + // V15,V12-V14 <<<= ((V15,V12-V14 XOR V0..V3), 16) + VADD V0.S4, V5.S4, V0.S4 + VADD V1.S4, V6.S4, V1.S4 + VADD V2.S4, V7.S4, V2.S4 + VADD V3.S4, V4.S4, V3.S4 + VEOR V15.B16, V0.B16, V15.B16 + VEOR V12.B16, V1.B16, V12.B16 + VEOR V13.B16, V2.B16, V13.B16 + VEOR V14.B16, V3.B16, V14.B16 + VREV32 V12.H8, V12.H8 + VREV32 V13.H8, V13.H8 + VREV32 V14.H8, V14.H8 + VREV32 V15.H8, V15.H8 + + // V10 += V15; V5 <<<= ((V10 XOR V5), 12) + // ... + VADD V15.S4, V10.S4, V10.S4 + VADD V12.S4, V11.S4, V11.S4 + VADD V13.S4, V8.S4, V8.S4 + VADD V14.S4, V9.S4, V9.S4 + VEOR V10.B16, V5.B16, V16.B16 + VEOR V11.B16, V6.B16, V17.B16 + VEOR V8.B16, V7.B16, V18.B16 + VEOR V9.B16, V4.B16, V19.B16 + VSHL $12, V16.S4, V5.S4 + VSHL $12, V17.S4, V6.S4 + VSHL $12, V18.S4, V7.S4 + VSHL $12, V19.S4, V4.S4 + VSRI $20, V16.S4, V5.S4 + VSRI $20, V17.S4, V6.S4 + VSRI $20, V18.S4, V7.S4 + VSRI $20, V19.S4, V4.S4 + + // V0 += V5; V15 <<<= ((V0 XOR V15), 8) + // ... + VADD V5.S4, V0.S4, V0.S4 + VADD V6.S4, V1.S4, V1.S4 + VADD V7.S4, V2.S4, V2.S4 + VADD V4.S4, V3.S4, V3.S4 + VEOR V0.B16, V15.B16, V15.B16 + VEOR V1.B16, V12.B16, V12.B16 + VEOR V2.B16, V13.B16, V13.B16 + VEOR V3.B16, V14.B16, V14.B16 + VTBL V31.B16, [V12.B16], V12.B16 + VTBL V31.B16, [V13.B16], V13.B16 + VTBL V31.B16, [V14.B16], V14.B16 + VTBL V31.B16, [V15.B16], V15.B16 + + // V10 += V15; V5 <<<= ((V10 XOR V5), 7) + // ... + VADD V15.S4, V10.S4, V10.S4 + VADD V12.S4, V11.S4, V11.S4 + VADD V13.S4, V8.S4, V8.S4 + VADD V14.S4, V9.S4, V9.S4 + VEOR V10.B16, V5.B16, V16.B16 + VEOR V11.B16, V6.B16, V17.B16 + VEOR V8.B16, V7.B16, V18.B16 + VEOR V9.B16, V4.B16, V19.B16 + VSHL $7, V16.S4, V5.S4 + VSHL $7, V17.S4, V6.S4 + VSHL $7, V18.S4, V7.S4 + VSHL $7, V19.S4, V4.S4 + VSRI $25, V16.S4, V5.S4 + VSRI $25, V17.S4, V6.S4 + VSRI $25, V18.S4, V7.S4 + VSRI $25, V19.S4, V4.S4 + + SUB $1, R21 + CBNZ R21, chacha + + // VLD4R (R10), [V16.S4, V17.S4, V18.S4, V19.S4] + WORD $0x4D60E950 + + // VLD4R 16(R4), [V20.S4, V21.S4, V22.S4, V23.S4] + WORD $0x4DFFE894 + VADD V30.S4, V12.S4, V12.S4 + VADD V16.S4, V0.S4, V0.S4 + VADD V17.S4, V1.S4, V1.S4 + VADD V18.S4, V2.S4, V2.S4 + VADD V19.S4, V3.S4, V3.S4 + // VLD4R 16(R4), [V24.S4, V25.S4, V26.S4, V27.S4] + WORD $0x4DFFE898 + // restore R4 + SUB $32, R4 + + // load counter + nonce + // VLD1R (R7), [V28.S4] + WORD $0x4D40C8FC + // VLD3R (R6), [V29.S4, V30.S4, V31.S4] + WORD $0x4D40E8DD + + VADD V20.S4, V4.S4, V4.S4 + VADD V21.S4, V5.S4, V5.S4 + VADD V22.S4, V6.S4, V6.S4 + VADD V23.S4, V7.S4, V7.S4 + VADD V24.S4, V8.S4, V8.S4 + VADD V25.S4, V9.S4, V9.S4 + VADD V26.S4, V10.S4, V10.S4 + VADD V27.S4, V11.S4, V11.S4 + VADD V28.S4, V12.S4, V12.S4 + VADD V29.S4, V13.S4, V13.S4 + VADD V30.S4, V14.S4, V14.S4 + VADD V31.S4, V15.S4, V15.S4 + + VZIP1 V1.S4, V0.S4, V16.S4 + VZIP2 V1.S4, V0.S4, V17.S4 + VZIP1 V3.S4, V2.S4, V18.S4 + VZIP2 V3.S4, V2.S4, V19.S4 + VZIP1 V5.S4, V4.S4, V20.S4 + VZIP2 V5.S4, V4.S4, V21.S4 + VZIP1 V7.S4, V6.S4, V22.S4 + VZIP2 V7.S4, V6.S4, V23.S4 + VZIP1 V9.S4, V8.S4, V24.S4 + VZIP2 V9.S4, V8.S4, V25.S4 + VZIP1 V11.S4, V10.S4, V26.S4 + VZIP2 V11.S4, V10.S4, V27.S4 + VZIP1 V13.S4, V12.S4, V28.S4 + VZIP2 V13.S4, V12.S4, V29.S4 + VZIP1 V15.S4, V14.S4, V30.S4 + VZIP2 V15.S4, V14.S4, V31.S4 + VZIP1 V18.D2, V16.D2, V0.D2 + VZIP2 V18.D2, V16.D2, V4.D2 + VZIP1 V19.D2, V17.D2, V8.D2 + VZIP2 V19.D2, V17.D2, V12.D2 + VLD1.P 64(R2), [V16.B16, V17.B16, V18.B16, V19.B16] + + VZIP1 V22.D2, V20.D2, V1.D2 + VZIP2 V22.D2, V20.D2, V5.D2 + VZIP1 V23.D2, V21.D2, V9.D2 + VZIP2 V23.D2, V21.D2, V13.D2 + VLD1.P 64(R2), [V20.B16, V21.B16, V22.B16, V23.B16] + VZIP1 V26.D2, V24.D2, V2.D2 + VZIP2 V26.D2, V24.D2, V6.D2 + VZIP1 V27.D2, V25.D2, V10.D2 + VZIP2 V27.D2, V25.D2, V14.D2 + VLD1.P 64(R2), [V24.B16, V25.B16, V26.B16, V27.B16] + VZIP1 V30.D2, V28.D2, V3.D2 + VZIP2 V30.D2, V28.D2, V7.D2 + VZIP1 V31.D2, V29.D2, V11.D2 + VZIP2 V31.D2, V29.D2, V15.D2 + VLD1.P 64(R2), [V28.B16, V29.B16, V30.B16, V31.B16] + VEOR V0.B16, V16.B16, V16.B16 + VEOR V1.B16, V17.B16, V17.B16 + VEOR V2.B16, V18.B16, V18.B16 + VEOR V3.B16, V19.B16, V19.B16 + VST1.P [V16.B16, V17.B16, V18.B16, V19.B16], 64(R1) + VEOR V4.B16, V20.B16, V20.B16 + VEOR V5.B16, V21.B16, V21.B16 + VEOR V6.B16, V22.B16, V22.B16 + VEOR V7.B16, V23.B16, V23.B16 + VST1.P [V20.B16, V21.B16, V22.B16, V23.B16], 64(R1) + VEOR V8.B16, V24.B16, V24.B16 + VEOR V9.B16, V25.B16, V25.B16 + VEOR V10.B16, V26.B16, V26.B16 + VEOR V11.B16, V27.B16, V27.B16 + VST1.P [V24.B16, V25.B16, V26.B16, V27.B16], 64(R1) + VEOR V12.B16, V28.B16, V28.B16 + VEOR V13.B16, V29.B16, V29.B16 + VEOR V14.B16, V30.B16, V30.B16 + VEOR V15.B16, V31.B16, V31.B16 + VST1.P [V28.B16, V29.B16, V30.B16, V31.B16], 64(R1) + + ADD $4, R20 + MOVW R20, (R7) // update counter + + CMP R2, R12 + BGT loop + + RET + + +DATA ·constants+0x00(SB)/4, $0x61707865 +DATA ·constants+0x04(SB)/4, $0x3320646e +DATA ·constants+0x08(SB)/4, $0x79622d32 +DATA ·constants+0x0c(SB)/4, $0x6b206574 +GLOBL ·constants(SB), NOPTR|RODATA, $32 + +DATA ·incRotMatrix+0x00(SB)/4, $0x00000000 +DATA ·incRotMatrix+0x04(SB)/4, $0x00000001 +DATA ·incRotMatrix+0x08(SB)/4, $0x00000002 +DATA ·incRotMatrix+0x0c(SB)/4, $0x00000003 +DATA ·incRotMatrix+0x10(SB)/4, $0x02010003 +DATA ·incRotMatrix+0x14(SB)/4, $0x06050407 +DATA ·incRotMatrix+0x18(SB)/4, $0x0A09080B +DATA ·incRotMatrix+0x1c(SB)/4, $0x0E0D0C0F +GLOBL ·incRotMatrix(SB), NOPTR|RODATA, $32 diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_generic.go b/vendor/golang.org/x/crypto/chacha20/chacha_generic.go new file mode 100644 index 000000000..a2ecf5c32 --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20/chacha_generic.go @@ -0,0 +1,398 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package chacha20 implements the ChaCha20 and XChaCha20 encryption algorithms +// as specified in RFC 8439 and draft-irtf-cfrg-xchacha-01. +package chacha20 + +import ( + "crypto/cipher" + "encoding/binary" + "errors" + "math/bits" + + "golang.org/x/crypto/internal/subtle" +) + +const ( + // KeySize is the size of the key used by this cipher, in bytes. + KeySize = 32 + + // NonceSize is the size of the nonce used with the standard variant of this + // cipher, in bytes. + // + // Note that this is too short to be safely generated at random if the same + // key is reused more than 2³² times. + NonceSize = 12 + + // NonceSizeX is the size of the nonce used with the XChaCha20 variant of + // this cipher, in bytes. + NonceSizeX = 24 +) + +// Cipher is a stateful instance of ChaCha20 or XChaCha20 using a particular key +// and nonce. A *Cipher implements the cipher.Stream interface. +type Cipher struct { + // The ChaCha20 state is 16 words: 4 constant, 8 of key, 1 of counter + // (incremented after each block), and 3 of nonce. + key [8]uint32 + counter uint32 + nonce [3]uint32 + + // The last len bytes of buf are leftover key stream bytes from the previous + // XORKeyStream invocation. The size of buf depends on how many blocks are + // computed at a time by xorKeyStreamBlocks. + buf [bufSize]byte + len int + + // overflow is set when the counter overflowed, no more blocks can be + // generated, and the next XORKeyStream call should panic. + overflow bool + + // The counter-independent results of the first round are cached after they + // are computed the first time. + precompDone bool + p1, p5, p9, p13 uint32 + p2, p6, p10, p14 uint32 + p3, p7, p11, p15 uint32 +} + +var _ cipher.Stream = (*Cipher)(nil) + +// NewUnauthenticatedCipher creates a new ChaCha20 stream cipher with the given +// 32 bytes key and a 12 or 24 bytes nonce. If a nonce of 24 bytes is provided, +// the XChaCha20 construction will be used. It returns an error if key or nonce +// have any other length. +// +// Note that ChaCha20, like all stream ciphers, is not authenticated and allows +// attackers to silently tamper with the plaintext. For this reason, it is more +// appropriate as a building block than as a standalone encryption mechanism. +// Instead, consider using package golang.org/x/crypto/chacha20poly1305. +func NewUnauthenticatedCipher(key, nonce []byte) (*Cipher, error) { + // This function is split into a wrapper so that the Cipher allocation will + // be inlined, and depending on how the caller uses the return value, won't + // escape to the heap. + c := &Cipher{} + return newUnauthenticatedCipher(c, key, nonce) +} + +func newUnauthenticatedCipher(c *Cipher, key, nonce []byte) (*Cipher, error) { + if len(key) != KeySize { + return nil, errors.New("chacha20: wrong key size") + } + if len(nonce) == NonceSizeX { + // XChaCha20 uses the ChaCha20 core to mix 16 bytes of the nonce into a + // derived key, allowing it to operate on a nonce of 24 bytes. See + // draft-irtf-cfrg-xchacha-01, Section 2.3. + key, _ = HChaCha20(key, nonce[0:16]) + cNonce := make([]byte, NonceSize) + copy(cNonce[4:12], nonce[16:24]) + nonce = cNonce + } else if len(nonce) != NonceSize { + return nil, errors.New("chacha20: wrong nonce size") + } + + key, nonce = key[:KeySize], nonce[:NonceSize] // bounds check elimination hint + c.key = [8]uint32{ + binary.LittleEndian.Uint32(key[0:4]), + binary.LittleEndian.Uint32(key[4:8]), + binary.LittleEndian.Uint32(key[8:12]), + binary.LittleEndian.Uint32(key[12:16]), + binary.LittleEndian.Uint32(key[16:20]), + binary.LittleEndian.Uint32(key[20:24]), + binary.LittleEndian.Uint32(key[24:28]), + binary.LittleEndian.Uint32(key[28:32]), + } + c.nonce = [3]uint32{ + binary.LittleEndian.Uint32(nonce[0:4]), + binary.LittleEndian.Uint32(nonce[4:8]), + binary.LittleEndian.Uint32(nonce[8:12]), + } + return c, nil +} + +// The constant first 4 words of the ChaCha20 state. +const ( + j0 uint32 = 0x61707865 // expa + j1 uint32 = 0x3320646e // nd 3 + j2 uint32 = 0x79622d32 // 2-by + j3 uint32 = 0x6b206574 // te k +) + +const blockSize = 64 + +// quarterRound is the core of ChaCha20. It shuffles the bits of 4 state words. +// It's executed 4 times for each of the 20 ChaCha20 rounds, operating on all 16 +// words each round, in columnar or diagonal groups of 4 at a time. +func quarterRound(a, b, c, d uint32) (uint32, uint32, uint32, uint32) { + a += b + d ^= a + d = bits.RotateLeft32(d, 16) + c += d + b ^= c + b = bits.RotateLeft32(b, 12) + a += b + d ^= a + d = bits.RotateLeft32(d, 8) + c += d + b ^= c + b = bits.RotateLeft32(b, 7) + return a, b, c, d +} + +// SetCounter sets the Cipher counter. The next invocation of XORKeyStream will +// behave as if (64 * counter) bytes had been encrypted so far. +// +// To prevent accidental counter reuse, SetCounter panics if counter is less +// than the current value. +// +// Note that the execution time of XORKeyStream is not independent of the +// counter value. +func (s *Cipher) SetCounter(counter uint32) { + // Internally, s may buffer multiple blocks, which complicates this + // implementation slightly. When checking whether the counter has rolled + // back, we must use both s.counter and s.len to determine how many blocks + // we have already output. + outputCounter := s.counter - uint32(s.len)/blockSize + if s.overflow || counter < outputCounter { + panic("chacha20: SetCounter attempted to rollback counter") + } + + // In the general case, we set the new counter value and reset s.len to 0, + // causing the next call to XORKeyStream to refill the buffer. However, if + // we're advancing within the existing buffer, we can save work by simply + // setting s.len. + if counter < s.counter { + s.len = int(s.counter-counter) * blockSize + } else { + s.counter = counter + s.len = 0 + } +} + +// XORKeyStream XORs each byte in the given slice with a byte from the +// cipher's key stream. Dst and src must overlap entirely or not at all. +// +// If len(dst) < len(src), XORKeyStream will panic. It is acceptable +// to pass a dst bigger than src, and in that case, XORKeyStream will +// only update dst[:len(src)] and will not touch the rest of dst. +// +// Multiple calls to XORKeyStream behave as if the concatenation of +// the src buffers was passed in a single run. That is, Cipher +// maintains state and does not reset at each XORKeyStream call. +func (s *Cipher) XORKeyStream(dst, src []byte) { + if len(src) == 0 { + return + } + if len(dst) < len(src) { + panic("chacha20: output smaller than input") + } + dst = dst[:len(src)] + if subtle.InexactOverlap(dst, src) { + panic("chacha20: invalid buffer overlap") + } + + // First, drain any remaining key stream from a previous XORKeyStream. + if s.len != 0 { + keyStream := s.buf[bufSize-s.len:] + if len(src) < len(keyStream) { + keyStream = keyStream[:len(src)] + } + _ = src[len(keyStream)-1] // bounds check elimination hint + for i, b := range keyStream { + dst[i] = src[i] ^ b + } + s.len -= len(keyStream) + dst, src = dst[len(keyStream):], src[len(keyStream):] + } + if len(src) == 0 { + return + } + + // If we'd need to let the counter overflow and keep generating output, + // panic immediately. If instead we'd only reach the last block, remember + // not to generate any more output after the buffer is drained. + numBlocks := (uint64(len(src)) + blockSize - 1) / blockSize + if s.overflow || uint64(s.counter)+numBlocks > 1<<32 { + panic("chacha20: counter overflow") + } else if uint64(s.counter)+numBlocks == 1<<32 { + s.overflow = true + } + + // xorKeyStreamBlocks implementations expect input lengths that are a + // multiple of bufSize. Platform-specific ones process multiple blocks at a + // time, so have bufSizes that are a multiple of blockSize. + + full := len(src) - len(src)%bufSize + if full > 0 { + s.xorKeyStreamBlocks(dst[:full], src[:full]) + } + dst, src = dst[full:], src[full:] + + // If using a multi-block xorKeyStreamBlocks would overflow, use the generic + // one that does one block at a time. + const blocksPerBuf = bufSize / blockSize + if uint64(s.counter)+blocksPerBuf > 1<<32 { + s.buf = [bufSize]byte{} + numBlocks := (len(src) + blockSize - 1) / blockSize + buf := s.buf[bufSize-numBlocks*blockSize:] + copy(buf, src) + s.xorKeyStreamBlocksGeneric(buf, buf) + s.len = len(buf) - copy(dst, buf) + return + } + + // If we have a partial (multi-)block, pad it for xorKeyStreamBlocks, and + // keep the leftover keystream for the next XORKeyStream invocation. + if len(src) > 0 { + s.buf = [bufSize]byte{} + copy(s.buf[:], src) + s.xorKeyStreamBlocks(s.buf[:], s.buf[:]) + s.len = bufSize - copy(dst, s.buf[:]) + } +} + +func (s *Cipher) xorKeyStreamBlocksGeneric(dst, src []byte) { + if len(dst) != len(src) || len(dst)%blockSize != 0 { + panic("chacha20: internal error: wrong dst and/or src length") + } + + // To generate each block of key stream, the initial cipher state + // (represented below) is passed through 20 rounds of shuffling, + // alternatively applying quarterRounds by columns (like 1, 5, 9, 13) + // or by diagonals (like 1, 6, 11, 12). + // + // 0:cccccccc 1:cccccccc 2:cccccccc 3:cccccccc + // 4:kkkkkkkk 5:kkkkkkkk 6:kkkkkkkk 7:kkkkkkkk + // 8:kkkkkkkk 9:kkkkkkkk 10:kkkkkkkk 11:kkkkkkkk + // 12:bbbbbbbb 13:nnnnnnnn 14:nnnnnnnn 15:nnnnnnnn + // + // c=constant k=key b=blockcount n=nonce + var ( + c0, c1, c2, c3 = j0, j1, j2, j3 + c4, c5, c6, c7 = s.key[0], s.key[1], s.key[2], s.key[3] + c8, c9, c10, c11 = s.key[4], s.key[5], s.key[6], s.key[7] + _, c13, c14, c15 = s.counter, s.nonce[0], s.nonce[1], s.nonce[2] + ) + + // Three quarters of the first round don't depend on the counter, so we can + // calculate them here, and reuse them for multiple blocks in the loop, and + // for future XORKeyStream invocations. + if !s.precompDone { + s.p1, s.p5, s.p9, s.p13 = quarterRound(c1, c5, c9, c13) + s.p2, s.p6, s.p10, s.p14 = quarterRound(c2, c6, c10, c14) + s.p3, s.p7, s.p11, s.p15 = quarterRound(c3, c7, c11, c15) + s.precompDone = true + } + + // A condition of len(src) > 0 would be sufficient, but this also + // acts as a bounds check elimination hint. + for len(src) >= 64 && len(dst) >= 64 { + // The remainder of the first column round. + fcr0, fcr4, fcr8, fcr12 := quarterRound(c0, c4, c8, s.counter) + + // The second diagonal round. + x0, x5, x10, x15 := quarterRound(fcr0, s.p5, s.p10, s.p15) + x1, x6, x11, x12 := quarterRound(s.p1, s.p6, s.p11, fcr12) + x2, x7, x8, x13 := quarterRound(s.p2, s.p7, fcr8, s.p13) + x3, x4, x9, x14 := quarterRound(s.p3, fcr4, s.p9, s.p14) + + // The remaining 18 rounds. + for i := 0; i < 9; i++ { + // Column round. + x0, x4, x8, x12 = quarterRound(x0, x4, x8, x12) + x1, x5, x9, x13 = quarterRound(x1, x5, x9, x13) + x2, x6, x10, x14 = quarterRound(x2, x6, x10, x14) + x3, x7, x11, x15 = quarterRound(x3, x7, x11, x15) + + // Diagonal round. + x0, x5, x10, x15 = quarterRound(x0, x5, x10, x15) + x1, x6, x11, x12 = quarterRound(x1, x6, x11, x12) + x2, x7, x8, x13 = quarterRound(x2, x7, x8, x13) + x3, x4, x9, x14 = quarterRound(x3, x4, x9, x14) + } + + // Add back the initial state to generate the key stream, then + // XOR the key stream with the source and write out the result. + addXor(dst[0:4], src[0:4], x0, c0) + addXor(dst[4:8], src[4:8], x1, c1) + addXor(dst[8:12], src[8:12], x2, c2) + addXor(dst[12:16], src[12:16], x3, c3) + addXor(dst[16:20], src[16:20], x4, c4) + addXor(dst[20:24], src[20:24], x5, c5) + addXor(dst[24:28], src[24:28], x6, c6) + addXor(dst[28:32], src[28:32], x7, c7) + addXor(dst[32:36], src[32:36], x8, c8) + addXor(dst[36:40], src[36:40], x9, c9) + addXor(dst[40:44], src[40:44], x10, c10) + addXor(dst[44:48], src[44:48], x11, c11) + addXor(dst[48:52], src[48:52], x12, s.counter) + addXor(dst[52:56], src[52:56], x13, c13) + addXor(dst[56:60], src[56:60], x14, c14) + addXor(dst[60:64], src[60:64], x15, c15) + + s.counter += 1 + + src, dst = src[blockSize:], dst[blockSize:] + } +} + +// HChaCha20 uses the ChaCha20 core to generate a derived key from a 32 bytes +// key and a 16 bytes nonce. It returns an error if key or nonce have any other +// length. It is used as part of the XChaCha20 construction. +func HChaCha20(key, nonce []byte) ([]byte, error) { + // This function is split into a wrapper so that the slice allocation will + // be inlined, and depending on how the caller uses the return value, won't + // escape to the heap. + out := make([]byte, 32) + return hChaCha20(out, key, nonce) +} + +func hChaCha20(out, key, nonce []byte) ([]byte, error) { + if len(key) != KeySize { + return nil, errors.New("chacha20: wrong HChaCha20 key size") + } + if len(nonce) != 16 { + return nil, errors.New("chacha20: wrong HChaCha20 nonce size") + } + + x0, x1, x2, x3 := j0, j1, j2, j3 + x4 := binary.LittleEndian.Uint32(key[0:4]) + x5 := binary.LittleEndian.Uint32(key[4:8]) + x6 := binary.LittleEndian.Uint32(key[8:12]) + x7 := binary.LittleEndian.Uint32(key[12:16]) + x8 := binary.LittleEndian.Uint32(key[16:20]) + x9 := binary.LittleEndian.Uint32(key[20:24]) + x10 := binary.LittleEndian.Uint32(key[24:28]) + x11 := binary.LittleEndian.Uint32(key[28:32]) + x12 := binary.LittleEndian.Uint32(nonce[0:4]) + x13 := binary.LittleEndian.Uint32(nonce[4:8]) + x14 := binary.LittleEndian.Uint32(nonce[8:12]) + x15 := binary.LittleEndian.Uint32(nonce[12:16]) + + for i := 0; i < 10; i++ { + // Diagonal round. + x0, x4, x8, x12 = quarterRound(x0, x4, x8, x12) + x1, x5, x9, x13 = quarterRound(x1, x5, x9, x13) + x2, x6, x10, x14 = quarterRound(x2, x6, x10, x14) + x3, x7, x11, x15 = quarterRound(x3, x7, x11, x15) + + // Column round. + x0, x5, x10, x15 = quarterRound(x0, x5, x10, x15) + x1, x6, x11, x12 = quarterRound(x1, x6, x11, x12) + x2, x7, x8, x13 = quarterRound(x2, x7, x8, x13) + x3, x4, x9, x14 = quarterRound(x3, x4, x9, x14) + } + + _ = out[31] // bounds check elimination hint + binary.LittleEndian.PutUint32(out[0:4], x0) + binary.LittleEndian.PutUint32(out[4:8], x1) + binary.LittleEndian.PutUint32(out[8:12], x2) + binary.LittleEndian.PutUint32(out[12:16], x3) + binary.LittleEndian.PutUint32(out[16:20], x12) + binary.LittleEndian.PutUint32(out[20:24], x13) + binary.LittleEndian.PutUint32(out[24:28], x14) + binary.LittleEndian.PutUint32(out[28:32], x15) + return out, nil +} diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_noasm.go b/vendor/golang.org/x/crypto/chacha20/chacha_noasm.go new file mode 100644 index 000000000..4635307b8 --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20/chacha_noasm.go @@ -0,0 +1,13 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !arm64,!s390x,!ppc64le arm64,!go1.11 gccgo purego + +package chacha20 + +const bufSize = blockSize + +func (s *Cipher) xorKeyStreamBlocks(dst, src []byte) { + s.xorKeyStreamBlocksGeneric(dst, src) +} diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.go b/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.go new file mode 100644 index 000000000..b79933034 --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.go @@ -0,0 +1,16 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo,!purego + +package chacha20 + +const bufSize = 256 + +//go:noescape +func chaCha20_ctr32_vsx(out, inp *byte, len int, key *[8]uint32, counter *uint32) + +func (c *Cipher) xorKeyStreamBlocks(dst, src []byte) { + chaCha20_ctr32_vsx(&dst[0], &src[0], len(src), &c.key, &c.counter) +} diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.s b/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.s new file mode 100644 index 000000000..23c602164 --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.s @@ -0,0 +1,449 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Based on CRYPTOGAMS code with the following comment: +// # ==================================================================== +// # Written by Andy Polyakov for the OpenSSL +// # project. The module is, however, dual licensed under OpenSSL and +// # CRYPTOGAMS licenses depending on where you obtain it. For further +// # details see http://www.openssl.org/~appro/cryptogams/. +// # ==================================================================== + +// Code for the perl script that generates the ppc64 assembler +// can be found in the cryptogams repository at the link below. It is based on +// the original from openssl. + +// https://github.com/dot-asm/cryptogams/commit/a60f5b50ed908e91 + +// The differences in this and the original implementation are +// due to the calling conventions and initialization of constants. + +// +build !gccgo,!purego + +#include "textflag.h" + +#define OUT R3 +#define INP R4 +#define LEN R5 +#define KEY R6 +#define CNT R7 +#define TMP R15 + +#define CONSTBASE R16 +#define BLOCKS R17 + +DATA consts<>+0x00(SB)/8, $0x3320646e61707865 +DATA consts<>+0x08(SB)/8, $0x6b20657479622d32 +DATA consts<>+0x10(SB)/8, $0x0000000000000001 +DATA consts<>+0x18(SB)/8, $0x0000000000000000 +DATA consts<>+0x20(SB)/8, $0x0000000000000004 +DATA consts<>+0x28(SB)/8, $0x0000000000000000 +DATA consts<>+0x30(SB)/8, $0x0a0b08090e0f0c0d +DATA consts<>+0x38(SB)/8, $0x0203000106070405 +DATA consts<>+0x40(SB)/8, $0x090a0b080d0e0f0c +DATA consts<>+0x48(SB)/8, $0x0102030005060704 +DATA consts<>+0x50(SB)/8, $0x6170786561707865 +DATA consts<>+0x58(SB)/8, $0x6170786561707865 +DATA consts<>+0x60(SB)/8, $0x3320646e3320646e +DATA consts<>+0x68(SB)/8, $0x3320646e3320646e +DATA consts<>+0x70(SB)/8, $0x79622d3279622d32 +DATA consts<>+0x78(SB)/8, $0x79622d3279622d32 +DATA consts<>+0x80(SB)/8, $0x6b2065746b206574 +DATA consts<>+0x88(SB)/8, $0x6b2065746b206574 +DATA consts<>+0x90(SB)/8, $0x0000000100000000 +DATA consts<>+0x98(SB)/8, $0x0000000300000002 +GLOBL consts<>(SB), RODATA, $0xa0 + +//func chaCha20_ctr32_vsx(out, inp *byte, len int, key *[8]uint32, counter *uint32) +TEXT ·chaCha20_ctr32_vsx(SB),NOSPLIT,$64-40 + MOVD out+0(FP), OUT + MOVD inp+8(FP), INP + MOVD len+16(FP), LEN + MOVD key+24(FP), KEY + MOVD counter+32(FP), CNT + + // Addressing for constants + MOVD $consts<>+0x00(SB), CONSTBASE + MOVD $16, R8 + MOVD $32, R9 + MOVD $48, R10 + MOVD $64, R11 + SRD $6, LEN, BLOCKS + // V16 + LXVW4X (CONSTBASE)(R0), VS48 + ADD $80,CONSTBASE + + // Load key into V17,V18 + LXVW4X (KEY)(R0), VS49 + LXVW4X (KEY)(R8), VS50 + + // Load CNT, NONCE into V19 + LXVW4X (CNT)(R0), VS51 + + // Clear V27 + VXOR V27, V27, V27 + + // V28 + LXVW4X (CONSTBASE)(R11), VS60 + + // splat slot from V19 -> V26 + VSPLTW $0, V19, V26 + + VSLDOI $4, V19, V27, V19 + VSLDOI $12, V27, V19, V19 + + VADDUWM V26, V28, V26 + + MOVD $10, R14 + MOVD R14, CTR + +loop_outer_vsx: + // V0, V1, V2, V3 + LXVW4X (R0)(CONSTBASE), VS32 + LXVW4X (R8)(CONSTBASE), VS33 + LXVW4X (R9)(CONSTBASE), VS34 + LXVW4X (R10)(CONSTBASE), VS35 + + // splat values from V17, V18 into V4-V11 + VSPLTW $0, V17, V4 + VSPLTW $1, V17, V5 + VSPLTW $2, V17, V6 + VSPLTW $3, V17, V7 + VSPLTW $0, V18, V8 + VSPLTW $1, V18, V9 + VSPLTW $2, V18, V10 + VSPLTW $3, V18, V11 + + // VOR + VOR V26, V26, V12 + + // splat values from V19 -> V13, V14, V15 + VSPLTW $1, V19, V13 + VSPLTW $2, V19, V14 + VSPLTW $3, V19, V15 + + // splat const values + VSPLTISW $-16, V27 + VSPLTISW $12, V28 + VSPLTISW $8, V29 + VSPLTISW $7, V30 + +loop_vsx: + VADDUWM V0, V4, V0 + VADDUWM V1, V5, V1 + VADDUWM V2, V6, V2 + VADDUWM V3, V7, V3 + + VXOR V12, V0, V12 + VXOR V13, V1, V13 + VXOR V14, V2, V14 + VXOR V15, V3, V15 + + VRLW V12, V27, V12 + VRLW V13, V27, V13 + VRLW V14, V27, V14 + VRLW V15, V27, V15 + + VADDUWM V8, V12, V8 + VADDUWM V9, V13, V9 + VADDUWM V10, V14, V10 + VADDUWM V11, V15, V11 + + VXOR V4, V8, V4 + VXOR V5, V9, V5 + VXOR V6, V10, V6 + VXOR V7, V11, V7 + + VRLW V4, V28, V4 + VRLW V5, V28, V5 + VRLW V6, V28, V6 + VRLW V7, V28, V7 + + VADDUWM V0, V4, V0 + VADDUWM V1, V5, V1 + VADDUWM V2, V6, V2 + VADDUWM V3, V7, V3 + + VXOR V12, V0, V12 + VXOR V13, V1, V13 + VXOR V14, V2, V14 + VXOR V15, V3, V15 + + VRLW V12, V29, V12 + VRLW V13, V29, V13 + VRLW V14, V29, V14 + VRLW V15, V29, V15 + + VADDUWM V8, V12, V8 + VADDUWM V9, V13, V9 + VADDUWM V10, V14, V10 + VADDUWM V11, V15, V11 + + VXOR V4, V8, V4 + VXOR V5, V9, V5 + VXOR V6, V10, V6 + VXOR V7, V11, V7 + + VRLW V4, V30, V4 + VRLW V5, V30, V5 + VRLW V6, V30, V6 + VRLW V7, V30, V7 + + VADDUWM V0, V5, V0 + VADDUWM V1, V6, V1 + VADDUWM V2, V7, V2 + VADDUWM V3, V4, V3 + + VXOR V15, V0, V15 + VXOR V12, V1, V12 + VXOR V13, V2, V13 + VXOR V14, V3, V14 + + VRLW V15, V27, V15 + VRLW V12, V27, V12 + VRLW V13, V27, V13 + VRLW V14, V27, V14 + + VADDUWM V10, V15, V10 + VADDUWM V11, V12, V11 + VADDUWM V8, V13, V8 + VADDUWM V9, V14, V9 + + VXOR V5, V10, V5 + VXOR V6, V11, V6 + VXOR V7, V8, V7 + VXOR V4, V9, V4 + + VRLW V5, V28, V5 + VRLW V6, V28, V6 + VRLW V7, V28, V7 + VRLW V4, V28, V4 + + VADDUWM V0, V5, V0 + VADDUWM V1, V6, V1 + VADDUWM V2, V7, V2 + VADDUWM V3, V4, V3 + + VXOR V15, V0, V15 + VXOR V12, V1, V12 + VXOR V13, V2, V13 + VXOR V14, V3, V14 + + VRLW V15, V29, V15 + VRLW V12, V29, V12 + VRLW V13, V29, V13 + VRLW V14, V29, V14 + + VADDUWM V10, V15, V10 + VADDUWM V11, V12, V11 + VADDUWM V8, V13, V8 + VADDUWM V9, V14, V9 + + VXOR V5, V10, V5 + VXOR V6, V11, V6 + VXOR V7, V8, V7 + VXOR V4, V9, V4 + + VRLW V5, V30, V5 + VRLW V6, V30, V6 + VRLW V7, V30, V7 + VRLW V4, V30, V4 + BC 16, LT, loop_vsx + + VADDUWM V12, V26, V12 + + WORD $0x13600F8C // VMRGEW V0, V1, V27 + WORD $0x13821F8C // VMRGEW V2, V3, V28 + + WORD $0x10000E8C // VMRGOW V0, V1, V0 + WORD $0x10421E8C // VMRGOW V2, V3, V2 + + WORD $0x13A42F8C // VMRGEW V4, V5, V29 + WORD $0x13C63F8C // VMRGEW V6, V7, V30 + + XXPERMDI VS32, VS34, $0, VS33 + XXPERMDI VS32, VS34, $3, VS35 + XXPERMDI VS59, VS60, $0, VS32 + XXPERMDI VS59, VS60, $3, VS34 + + WORD $0x10842E8C // VMRGOW V4, V5, V4 + WORD $0x10C63E8C // VMRGOW V6, V7, V6 + + WORD $0x13684F8C // VMRGEW V8, V9, V27 + WORD $0x138A5F8C // VMRGEW V10, V11, V28 + + XXPERMDI VS36, VS38, $0, VS37 + XXPERMDI VS36, VS38, $3, VS39 + XXPERMDI VS61, VS62, $0, VS36 + XXPERMDI VS61, VS62, $3, VS38 + + WORD $0x11084E8C // VMRGOW V8, V9, V8 + WORD $0x114A5E8C // VMRGOW V10, V11, V10 + + WORD $0x13AC6F8C // VMRGEW V12, V13, V29 + WORD $0x13CE7F8C // VMRGEW V14, V15, V30 + + XXPERMDI VS40, VS42, $0, VS41 + XXPERMDI VS40, VS42, $3, VS43 + XXPERMDI VS59, VS60, $0, VS40 + XXPERMDI VS59, VS60, $3, VS42 + + WORD $0x118C6E8C // VMRGOW V12, V13, V12 + WORD $0x11CE7E8C // VMRGOW V14, V15, V14 + + VSPLTISW $4, V27 + VADDUWM V26, V27, V26 + + XXPERMDI VS44, VS46, $0, VS45 + XXPERMDI VS44, VS46, $3, VS47 + XXPERMDI VS61, VS62, $0, VS44 + XXPERMDI VS61, VS62, $3, VS46 + + VADDUWM V0, V16, V0 + VADDUWM V4, V17, V4 + VADDUWM V8, V18, V8 + VADDUWM V12, V19, V12 + + CMPU LEN, $64 + BLT tail_vsx + + // Bottom of loop + LXVW4X (INP)(R0), VS59 + LXVW4X (INP)(R8), VS60 + LXVW4X (INP)(R9), VS61 + LXVW4X (INP)(R10), VS62 + + VXOR V27, V0, V27 + VXOR V28, V4, V28 + VXOR V29, V8, V29 + VXOR V30, V12, V30 + + STXVW4X VS59, (OUT)(R0) + STXVW4X VS60, (OUT)(R8) + ADD $64, INP + STXVW4X VS61, (OUT)(R9) + ADD $-64, LEN + STXVW4X VS62, (OUT)(R10) + ADD $64, OUT + BEQ done_vsx + + VADDUWM V1, V16, V0 + VADDUWM V5, V17, V4 + VADDUWM V9, V18, V8 + VADDUWM V13, V19, V12 + + CMPU LEN, $64 + BLT tail_vsx + + LXVW4X (INP)(R0), VS59 + LXVW4X (INP)(R8), VS60 + LXVW4X (INP)(R9), VS61 + LXVW4X (INP)(R10), VS62 + VXOR V27, V0, V27 + + VXOR V28, V4, V28 + VXOR V29, V8, V29 + VXOR V30, V12, V30 + + STXVW4X VS59, (OUT)(R0) + STXVW4X VS60, (OUT)(R8) + ADD $64, INP + STXVW4X VS61, (OUT)(R9) + ADD $-64, LEN + STXVW4X VS62, (OUT)(V10) + ADD $64, OUT + BEQ done_vsx + + VADDUWM V2, V16, V0 + VADDUWM V6, V17, V4 + VADDUWM V10, V18, V8 + VADDUWM V14, V19, V12 + + CMPU LEN, $64 + BLT tail_vsx + + LXVW4X (INP)(R0), VS59 + LXVW4X (INP)(R8), VS60 + LXVW4X (INP)(R9), VS61 + LXVW4X (INP)(R10), VS62 + + VXOR V27, V0, V27 + VXOR V28, V4, V28 + VXOR V29, V8, V29 + VXOR V30, V12, V30 + + STXVW4X VS59, (OUT)(R0) + STXVW4X VS60, (OUT)(R8) + ADD $64, INP + STXVW4X VS61, (OUT)(R9) + ADD $-64, LEN + STXVW4X VS62, (OUT)(R10) + ADD $64, OUT + BEQ done_vsx + + VADDUWM V3, V16, V0 + VADDUWM V7, V17, V4 + VADDUWM V11, V18, V8 + VADDUWM V15, V19, V12 + + CMPU LEN, $64 + BLT tail_vsx + + LXVW4X (INP)(R0), VS59 + LXVW4X (INP)(R8), VS60 + LXVW4X (INP)(R9), VS61 + LXVW4X (INP)(R10), VS62 + + VXOR V27, V0, V27 + VXOR V28, V4, V28 + VXOR V29, V8, V29 + VXOR V30, V12, V30 + + STXVW4X VS59, (OUT)(R0) + STXVW4X VS60, (OUT)(R8) + ADD $64, INP + STXVW4X VS61, (OUT)(R9) + ADD $-64, LEN + STXVW4X VS62, (OUT)(R10) + ADD $64, OUT + + MOVD $10, R14 + MOVD R14, CTR + BNE loop_outer_vsx + +done_vsx: + // Increment counter by number of 64 byte blocks + MOVD (CNT), R14 + ADD BLOCKS, R14 + MOVD R14, (CNT) + RET + +tail_vsx: + ADD $32, R1, R11 + MOVD LEN, CTR + + // Save values on stack to copy from + STXVW4X VS32, (R11)(R0) + STXVW4X VS36, (R11)(R8) + STXVW4X VS40, (R11)(R9) + STXVW4X VS44, (R11)(R10) + ADD $-1, R11, R12 + ADD $-1, INP + ADD $-1, OUT + +looptail_vsx: + // Copying the result to OUT + // in bytes. + MOVBZU 1(R12), KEY + MOVBZU 1(INP), TMP + XOR KEY, TMP, KEY + MOVBU KEY, 1(OUT) + BC 16, LT, looptail_vsx + + // Clear the stack values + STXVW4X VS48, (R11)(R0) + STXVW4X VS48, (R11)(R8) + STXVW4X VS48, (R11)(R9) + STXVW4X VS48, (R11)(R10) + BR done_vsx diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_s390x.go b/vendor/golang.org/x/crypto/chacha20/chacha_s390x.go new file mode 100644 index 000000000..a9244bdf4 --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20/chacha_s390x.go @@ -0,0 +1,26 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo,!purego + +package chacha20 + +import "golang.org/x/sys/cpu" + +var haveAsm = cpu.S390X.HasVX + +const bufSize = 256 + +// xorKeyStreamVX is an assembly implementation of XORKeyStream. It must only +// be called when the vector facility is available. Implementation in asm_s390x.s. +//go:noescape +func xorKeyStreamVX(dst, src []byte, key *[8]uint32, nonce *[3]uint32, counter *uint32) + +func (c *Cipher) xorKeyStreamBlocks(dst, src []byte) { + if cpu.S390X.HasVX { + xorKeyStreamVX(dst, src, &c.key, &c.nonce, &c.counter) + } else { + c.xorKeyStreamBlocksGeneric(dst, src) + } +} diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_s390x.s b/vendor/golang.org/x/crypto/chacha20/chacha_s390x.s new file mode 100644 index 000000000..89c658c41 --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20/chacha_s390x.s @@ -0,0 +1,224 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo,!purego + +#include "go_asm.h" +#include "textflag.h" + +// This is an implementation of the ChaCha20 encryption algorithm as +// specified in RFC 7539. It uses vector instructions to compute +// 4 keystream blocks in parallel (256 bytes) which are then XORed +// with the bytes in the input slice. + +GLOBL ·constants<>(SB), RODATA|NOPTR, $32 +// BSWAP: swap bytes in each 4-byte element +DATA ·constants<>+0x00(SB)/4, $0x03020100 +DATA ·constants<>+0x04(SB)/4, $0x07060504 +DATA ·constants<>+0x08(SB)/4, $0x0b0a0908 +DATA ·constants<>+0x0c(SB)/4, $0x0f0e0d0c +// J0: [j0, j1, j2, j3] +DATA ·constants<>+0x10(SB)/4, $0x61707865 +DATA ·constants<>+0x14(SB)/4, $0x3320646e +DATA ·constants<>+0x18(SB)/4, $0x79622d32 +DATA ·constants<>+0x1c(SB)/4, $0x6b206574 + +#define BSWAP V5 +#define J0 V6 +#define KEY0 V7 +#define KEY1 V8 +#define NONCE V9 +#define CTR V10 +#define M0 V11 +#define M1 V12 +#define M2 V13 +#define M3 V14 +#define INC V15 +#define X0 V16 +#define X1 V17 +#define X2 V18 +#define X3 V19 +#define X4 V20 +#define X5 V21 +#define X6 V22 +#define X7 V23 +#define X8 V24 +#define X9 V25 +#define X10 V26 +#define X11 V27 +#define X12 V28 +#define X13 V29 +#define X14 V30 +#define X15 V31 + +#define NUM_ROUNDS 20 + +#define ROUND4(a0, a1, a2, a3, b0, b1, b2, b3, c0, c1, c2, c3, d0, d1, d2, d3) \ + VAF a1, a0, a0 \ + VAF b1, b0, b0 \ + VAF c1, c0, c0 \ + VAF d1, d0, d0 \ + VX a0, a2, a2 \ + VX b0, b2, b2 \ + VX c0, c2, c2 \ + VX d0, d2, d2 \ + VERLLF $16, a2, a2 \ + VERLLF $16, b2, b2 \ + VERLLF $16, c2, c2 \ + VERLLF $16, d2, d2 \ + VAF a2, a3, a3 \ + VAF b2, b3, b3 \ + VAF c2, c3, c3 \ + VAF d2, d3, d3 \ + VX a3, a1, a1 \ + VX b3, b1, b1 \ + VX c3, c1, c1 \ + VX d3, d1, d1 \ + VERLLF $12, a1, a1 \ + VERLLF $12, b1, b1 \ + VERLLF $12, c1, c1 \ + VERLLF $12, d1, d1 \ + VAF a1, a0, a0 \ + VAF b1, b0, b0 \ + VAF c1, c0, c0 \ + VAF d1, d0, d0 \ + VX a0, a2, a2 \ + VX b0, b2, b2 \ + VX c0, c2, c2 \ + VX d0, d2, d2 \ + VERLLF $8, a2, a2 \ + VERLLF $8, b2, b2 \ + VERLLF $8, c2, c2 \ + VERLLF $8, d2, d2 \ + VAF a2, a3, a3 \ + VAF b2, b3, b3 \ + VAF c2, c3, c3 \ + VAF d2, d3, d3 \ + VX a3, a1, a1 \ + VX b3, b1, b1 \ + VX c3, c1, c1 \ + VX d3, d1, d1 \ + VERLLF $7, a1, a1 \ + VERLLF $7, b1, b1 \ + VERLLF $7, c1, c1 \ + VERLLF $7, d1, d1 + +#define PERMUTE(mask, v0, v1, v2, v3) \ + VPERM v0, v0, mask, v0 \ + VPERM v1, v1, mask, v1 \ + VPERM v2, v2, mask, v2 \ + VPERM v3, v3, mask, v3 + +#define ADDV(x, v0, v1, v2, v3) \ + VAF x, v0, v0 \ + VAF x, v1, v1 \ + VAF x, v2, v2 \ + VAF x, v3, v3 + +#define XORV(off, dst, src, v0, v1, v2, v3) \ + VLM off(src), M0, M3 \ + PERMUTE(BSWAP, v0, v1, v2, v3) \ + VX v0, M0, M0 \ + VX v1, M1, M1 \ + VX v2, M2, M2 \ + VX v3, M3, M3 \ + VSTM M0, M3, off(dst) + +#define SHUFFLE(a, b, c, d, t, u, v, w) \ + VMRHF a, c, t \ // t = {a[0], c[0], a[1], c[1]} + VMRHF b, d, u \ // u = {b[0], d[0], b[1], d[1]} + VMRLF a, c, v \ // v = {a[2], c[2], a[3], c[3]} + VMRLF b, d, w \ // w = {b[2], d[2], b[3], d[3]} + VMRHF t, u, a \ // a = {a[0], b[0], c[0], d[0]} + VMRLF t, u, b \ // b = {a[1], b[1], c[1], d[1]} + VMRHF v, w, c \ // c = {a[2], b[2], c[2], d[2]} + VMRLF v, w, d // d = {a[3], b[3], c[3], d[3]} + +// func xorKeyStreamVX(dst, src []byte, key *[8]uint32, nonce *[3]uint32, counter *uint32) +TEXT ·xorKeyStreamVX(SB), NOSPLIT, $0 + MOVD $·constants<>(SB), R1 + MOVD dst+0(FP), R2 // R2=&dst[0] + LMG src+24(FP), R3, R4 // R3=&src[0] R4=len(src) + MOVD key+48(FP), R5 // R5=key + MOVD nonce+56(FP), R6 // R6=nonce + MOVD counter+64(FP), R7 // R7=counter + + // load BSWAP and J0 + VLM (R1), BSWAP, J0 + + // setup + MOVD $95, R0 + VLM (R5), KEY0, KEY1 + VLL R0, (R6), NONCE + VZERO M0 + VLEIB $7, $32, M0 + VSRLB M0, NONCE, NONCE + + // initialize counter values + VLREPF (R7), CTR + VZERO INC + VLEIF $1, $1, INC + VLEIF $2, $2, INC + VLEIF $3, $3, INC + VAF INC, CTR, CTR + VREPIF $4, INC + +chacha: + VREPF $0, J0, X0 + VREPF $1, J0, X1 + VREPF $2, J0, X2 + VREPF $3, J0, X3 + VREPF $0, KEY0, X4 + VREPF $1, KEY0, X5 + VREPF $2, KEY0, X6 + VREPF $3, KEY0, X7 + VREPF $0, KEY1, X8 + VREPF $1, KEY1, X9 + VREPF $2, KEY1, X10 + VREPF $3, KEY1, X11 + VLR CTR, X12 + VREPF $1, NONCE, X13 + VREPF $2, NONCE, X14 + VREPF $3, NONCE, X15 + + MOVD $(NUM_ROUNDS/2), R1 + +loop: + ROUND4(X0, X4, X12, X8, X1, X5, X13, X9, X2, X6, X14, X10, X3, X7, X15, X11) + ROUND4(X0, X5, X15, X10, X1, X6, X12, X11, X2, X7, X13, X8, X3, X4, X14, X9) + + ADD $-1, R1 + BNE loop + + // decrement length + ADD $-256, R4 + + // rearrange vectors + SHUFFLE(X0, X1, X2, X3, M0, M1, M2, M3) + ADDV(J0, X0, X1, X2, X3) + SHUFFLE(X4, X5, X6, X7, M0, M1, M2, M3) + ADDV(KEY0, X4, X5, X6, X7) + SHUFFLE(X8, X9, X10, X11, M0, M1, M2, M3) + ADDV(KEY1, X8, X9, X10, X11) + VAF CTR, X12, X12 + SHUFFLE(X12, X13, X14, X15, M0, M1, M2, M3) + ADDV(NONCE, X12, X13, X14, X15) + + // increment counters + VAF INC, CTR, CTR + + // xor keystream with plaintext + XORV(0*64, R2, R3, X0, X4, X8, X12) + XORV(1*64, R2, R3, X1, X5, X9, X13) + XORV(2*64, R2, R3, X2, X6, X10, X14) + XORV(3*64, R2, R3, X3, X7, X11, X15) + + // increment pointers + MOVD $256(R2), R2 + MOVD $256(R3), R3 + + CMPBNE R4, $0, chacha + + VSTEF $0, CTR, (R7) + RET diff --git a/vendor/golang.org/x/crypto/chacha20/xor.go b/vendor/golang.org/x/crypto/chacha20/xor.go new file mode 100644 index 000000000..c2d04851e --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20/xor.go @@ -0,0 +1,42 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found src the LICENSE file. + +package chacha20 + +import "runtime" + +// Platforms that have fast unaligned 32-bit little endian accesses. +const unaligned = runtime.GOARCH == "386" || + runtime.GOARCH == "amd64" || + runtime.GOARCH == "arm64" || + runtime.GOARCH == "ppc64le" || + runtime.GOARCH == "s390x" + +// addXor reads a little endian uint32 from src, XORs it with (a + b) and +// places the result in little endian byte order in dst. +func addXor(dst, src []byte, a, b uint32) { + _, _ = src[3], dst[3] // bounds check elimination hint + if unaligned { + // The compiler should optimize this code into + // 32-bit unaligned little endian loads and stores. + // TODO: delete once the compiler does a reliably + // good job with the generic code below. + // See issue #25111 for more details. + v := uint32(src[0]) + v |= uint32(src[1]) << 8 + v |= uint32(src[2]) << 16 + v |= uint32(src[3]) << 24 + v ^= a + b + dst[0] = byte(v) + dst[1] = byte(v >> 8) + dst[2] = byte(v >> 16) + dst[3] = byte(v >> 24) + } else { + a += b + dst[0] = src[0] ^ byte(a) + dst[1] = src[1] ^ byte(a>>8) + dst[2] = src[2] ^ byte(a>>16) + dst[3] = src[3] ^ byte(a>>24) + } +} diff --git a/vendor/golang.org/x/crypto/curve25519/const_amd64.h b/vendor/golang.org/x/crypto/curve25519/const_amd64.h deleted file mode 100644 index b3f74162f..000000000 --- a/vendor/golang.org/x/crypto/curve25519/const_amd64.h +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This code was translated into a form compatible with 6a from the public -// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html - -#define REDMASK51 0x0007FFFFFFFFFFFF diff --git a/vendor/golang.org/x/crypto/curve25519/const_amd64.s b/vendor/golang.org/x/crypto/curve25519/const_amd64.s deleted file mode 100644 index ee7b4bd5f..000000000 --- a/vendor/golang.org/x/crypto/curve25519/const_amd64.s +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This code was translated into a form compatible with 6a from the public -// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html - -// +build amd64,!gccgo,!appengine - -// These constants cannot be encoded in non-MOVQ immediates. -// We access them directly from memory instead. - -DATA ·_121666_213(SB)/8, $996687872 -GLOBL ·_121666_213(SB), 8, $8 - -DATA ·_2P0(SB)/8, $0xFFFFFFFFFFFDA -GLOBL ·_2P0(SB), 8, $8 - -DATA ·_2P1234(SB)/8, $0xFFFFFFFFFFFFE -GLOBL ·_2P1234(SB), 8, $8 diff --git a/vendor/golang.org/x/crypto/curve25519/cswap_amd64.s b/vendor/golang.org/x/crypto/curve25519/cswap_amd64.s deleted file mode 100644 index cd793a5b5..000000000 --- a/vendor/golang.org/x/crypto/curve25519/cswap_amd64.s +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build amd64,!gccgo,!appengine - -// func cswap(inout *[4][5]uint64, v uint64) -TEXT ·cswap(SB),7,$0 - MOVQ inout+0(FP),DI - MOVQ v+8(FP),SI - - SUBQ $1, SI - NOTQ SI - MOVQ SI, X15 - PSHUFD $0x44, X15, X15 - - MOVOU 0(DI), X0 - MOVOU 16(DI), X2 - MOVOU 32(DI), X4 - MOVOU 48(DI), X6 - MOVOU 64(DI), X8 - MOVOU 80(DI), X1 - MOVOU 96(DI), X3 - MOVOU 112(DI), X5 - MOVOU 128(DI), X7 - MOVOU 144(DI), X9 - - MOVO X1, X10 - MOVO X3, X11 - MOVO X5, X12 - MOVO X7, X13 - MOVO X9, X14 - - PXOR X0, X10 - PXOR X2, X11 - PXOR X4, X12 - PXOR X6, X13 - PXOR X8, X14 - PAND X15, X10 - PAND X15, X11 - PAND X15, X12 - PAND X15, X13 - PAND X15, X14 - PXOR X10, X0 - PXOR X10, X1 - PXOR X11, X2 - PXOR X11, X3 - PXOR X12, X4 - PXOR X12, X5 - PXOR X13, X6 - PXOR X13, X7 - PXOR X14, X8 - PXOR X14, X9 - - MOVOU X0, 0(DI) - MOVOU X2, 16(DI) - MOVOU X4, 32(DI) - MOVOU X6, 48(DI) - MOVOU X8, 64(DI) - MOVOU X1, 80(DI) - MOVOU X3, 96(DI) - MOVOU X5, 112(DI) - MOVOU X7, 128(DI) - MOVOU X9, 144(DI) - RET diff --git a/vendor/golang.org/x/crypto/curve25519/curve25519.go b/vendor/golang.org/x/crypto/curve25519/curve25519.go index cb8fbc57b..4b9a655d1 100644 --- a/vendor/golang.org/x/crypto/curve25519/curve25519.go +++ b/vendor/golang.org/x/crypto/curve25519/curve25519.go @@ -1,834 +1,95 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2019 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// We have an implementation in amd64 assembly so this code is only run on -// non-amd64 platforms. The amd64 assembly does not support gccgo. -// +build !amd64 gccgo appengine - -package curve25519 +// Package curve25519 provides an implementation of the X25519 function, which +// performs scalar multiplication on the elliptic curve known as Curve25519. +// See RFC 7748. +package curve25519 // import "golang.org/x/crypto/curve25519" import ( - "encoding/binary" + "crypto/subtle" + "fmt" ) -// This code is a port of the public domain, "ref10" implementation of -// curve25519 from SUPERCOP 20130419 by D. J. Bernstein. - -// fieldElement represents an element of the field GF(2^255 - 19). An element -// t, entries t[0]...t[9], represents the integer t[0]+2^26 t[1]+2^51 t[2]+2^77 -// t[3]+2^102 t[4]+...+2^230 t[9]. Bounds on each t[i] vary depending on -// context. -type fieldElement [10]int32 - -func feZero(fe *fieldElement) { - for i := range fe { - fe[i] = 0 - } -} - -func feOne(fe *fieldElement) { - feZero(fe) - fe[0] = 1 -} - -func feAdd(dst, a, b *fieldElement) { - for i := range dst { - dst[i] = a[i] + b[i] - } -} - -func feSub(dst, a, b *fieldElement) { - for i := range dst { - dst[i] = a[i] - b[i] - } -} - -func feCopy(dst, src *fieldElement) { - for i := range dst { - dst[i] = src[i] - } -} - -// feCSwap replaces (f,g) with (g,f) if b == 1; replaces (f,g) with (f,g) if b == 0. -// -// Preconditions: b in {0,1}. -func feCSwap(f, g *fieldElement, b int32) { - b = -b - for i := range f { - t := b & (f[i] ^ g[i]) - f[i] ^= t - g[i] ^= t - } -} - -// load3 reads a 24-bit, little-endian value from in. -func load3(in []byte) int64 { - var r int64 - r = int64(in[0]) - r |= int64(in[1]) << 8 - r |= int64(in[2]) << 16 - return r -} - -// load4 reads a 32-bit, little-endian value from in. -func load4(in []byte) int64 { - return int64(binary.LittleEndian.Uint32(in)) -} - -func feFromBytes(dst *fieldElement, src *[32]byte) { - h0 := load4(src[:]) - h1 := load3(src[4:]) << 6 - h2 := load3(src[7:]) << 5 - h3 := load3(src[10:]) << 3 - h4 := load3(src[13:]) << 2 - h5 := load4(src[16:]) - h6 := load3(src[20:]) << 7 - h7 := load3(src[23:]) << 5 - h8 := load3(src[26:]) << 4 - h9 := load3(src[29:]) << 2 - - var carry [10]int64 - carry[9] = (h9 + 1<<24) >> 25 - h0 += carry[9] * 19 - h9 -= carry[9] << 25 - carry[1] = (h1 + 1<<24) >> 25 - h2 += carry[1] - h1 -= carry[1] << 25 - carry[3] = (h3 + 1<<24) >> 25 - h4 += carry[3] - h3 -= carry[3] << 25 - carry[5] = (h5 + 1<<24) >> 25 - h6 += carry[5] - h5 -= carry[5] << 25 - carry[7] = (h7 + 1<<24) >> 25 - h8 += carry[7] - h7 -= carry[7] << 25 - - carry[0] = (h0 + 1<<25) >> 26 - h1 += carry[0] - h0 -= carry[0] << 26 - carry[2] = (h2 + 1<<25) >> 26 - h3 += carry[2] - h2 -= carry[2] << 26 - carry[4] = (h4 + 1<<25) >> 26 - h5 += carry[4] - h4 -= carry[4] << 26 - carry[6] = (h6 + 1<<25) >> 26 - h7 += carry[6] - h6 -= carry[6] << 26 - carry[8] = (h8 + 1<<25) >> 26 - h9 += carry[8] - h8 -= carry[8] << 26 - - dst[0] = int32(h0) - dst[1] = int32(h1) - dst[2] = int32(h2) - dst[3] = int32(h3) - dst[4] = int32(h4) - dst[5] = int32(h5) - dst[6] = int32(h6) - dst[7] = int32(h7) - dst[8] = int32(h8) - dst[9] = int32(h9) -} - -// feToBytes marshals h to s. -// Preconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -// -// Write p=2^255-19; q=floor(h/p). -// Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))). -// -// Proof: -// Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4. -// Also have |h-2^230 h9|<2^230 so |19 2^(-255)(h-2^230 h9)|<1/4. -// -// Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9). -// Then 0> 25 - q = (h[0] + q) >> 26 - q = (h[1] + q) >> 25 - q = (h[2] + q) >> 26 - q = (h[3] + q) >> 25 - q = (h[4] + q) >> 26 - q = (h[5] + q) >> 25 - q = (h[6] + q) >> 26 - q = (h[7] + q) >> 25 - q = (h[8] + q) >> 26 - q = (h[9] + q) >> 25 - - // Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20. - h[0] += 19 * q - // Goal: Output h-2^255 q, which is between 0 and 2^255-20. - - carry[0] = h[0] >> 26 - h[1] += carry[0] - h[0] -= carry[0] << 26 - carry[1] = h[1] >> 25 - h[2] += carry[1] - h[1] -= carry[1] << 25 - carry[2] = h[2] >> 26 - h[3] += carry[2] - h[2] -= carry[2] << 26 - carry[3] = h[3] >> 25 - h[4] += carry[3] - h[3] -= carry[3] << 25 - carry[4] = h[4] >> 26 - h[5] += carry[4] - h[4] -= carry[4] << 26 - carry[5] = h[5] >> 25 - h[6] += carry[5] - h[5] -= carry[5] << 25 - carry[6] = h[6] >> 26 - h[7] += carry[6] - h[6] -= carry[6] << 26 - carry[7] = h[7] >> 25 - h[8] += carry[7] - h[7] -= carry[7] << 25 - carry[8] = h[8] >> 26 - h[9] += carry[8] - h[8] -= carry[8] << 26 - carry[9] = h[9] >> 25 - h[9] -= carry[9] << 25 - // h10 = carry9 - - // Goal: Output h[0]+...+2^255 h10-2^255 q, which is between 0 and 2^255-20. - // Have h[0]+...+2^230 h[9] between 0 and 2^255-1; - // evidently 2^255 h10-2^255 q = 0. - // Goal: Output h[0]+...+2^230 h[9]. - - s[0] = byte(h[0] >> 0) - s[1] = byte(h[0] >> 8) - s[2] = byte(h[0] >> 16) - s[3] = byte((h[0] >> 24) | (h[1] << 2)) - s[4] = byte(h[1] >> 6) - s[5] = byte(h[1] >> 14) - s[6] = byte((h[1] >> 22) | (h[2] << 3)) - s[7] = byte(h[2] >> 5) - s[8] = byte(h[2] >> 13) - s[9] = byte((h[2] >> 21) | (h[3] << 5)) - s[10] = byte(h[3] >> 3) - s[11] = byte(h[3] >> 11) - s[12] = byte((h[3] >> 19) | (h[4] << 6)) - s[13] = byte(h[4] >> 2) - s[14] = byte(h[4] >> 10) - s[15] = byte(h[4] >> 18) - s[16] = byte(h[5] >> 0) - s[17] = byte(h[5] >> 8) - s[18] = byte(h[5] >> 16) - s[19] = byte((h[5] >> 24) | (h[6] << 1)) - s[20] = byte(h[6] >> 7) - s[21] = byte(h[6] >> 15) - s[22] = byte((h[6] >> 23) | (h[7] << 3)) - s[23] = byte(h[7] >> 5) - s[24] = byte(h[7] >> 13) - s[25] = byte((h[7] >> 21) | (h[8] << 4)) - s[26] = byte(h[8] >> 4) - s[27] = byte(h[8] >> 12) - s[28] = byte((h[8] >> 20) | (h[9] << 6)) - s[29] = byte(h[9] >> 2) - s[30] = byte(h[9] >> 10) - s[31] = byte(h[9] >> 18) +// Deprecated: when provided a low-order point, ScalarMult will set dst to all +// zeroes, irrespective of the scalar. Instead, use the X25519 function, which +// will return an error. +func ScalarMult(dst, scalar, point *[32]byte) { + scalarMult(dst, scalar, point) } -// feMul calculates h = f * g -// Can overlap h with f or g. -// -// Preconditions: -// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -// |g| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -// -// Postconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -// -// Notes on implementation strategy: -// -// Using schoolbook multiplication. -// Karatsuba would save a little in some cost models. +// ScalarBaseMult sets dst to the product scalar * base where base is the +// standard generator. // -// Most multiplications by 2 and 19 are 32-bit precomputations; -// cheaper than 64-bit postcomputations. -// -// There is one remaining multiplication by 19 in the carry chain; -// one *19 precomputation can be merged into this, -// but the resulting data flow is considerably less clean. -// -// There are 12 carries below. -// 10 of them are 2-way parallelizable and vectorizable. -// Can get away with 11 carries, but then data flow is much deeper. -// -// With tighter constraints on inputs can squeeze carries into int32. -func feMul(h, f, g *fieldElement) { - f0 := f[0] - f1 := f[1] - f2 := f[2] - f3 := f[3] - f4 := f[4] - f5 := f[5] - f6 := f[6] - f7 := f[7] - f8 := f[8] - f9 := f[9] - g0 := g[0] - g1 := g[1] - g2 := g[2] - g3 := g[3] - g4 := g[4] - g5 := g[5] - g6 := g[6] - g7 := g[7] - g8 := g[8] - g9 := g[9] - g1_19 := 19 * g1 // 1.4*2^29 - g2_19 := 19 * g2 // 1.4*2^30; still ok - g3_19 := 19 * g3 - g4_19 := 19 * g4 - g5_19 := 19 * g5 - g6_19 := 19 * g6 - g7_19 := 19 * g7 - g8_19 := 19 * g8 - g9_19 := 19 * g9 - f1_2 := 2 * f1 - f3_2 := 2 * f3 - f5_2 := 2 * f5 - f7_2 := 2 * f7 - f9_2 := 2 * f9 - f0g0 := int64(f0) * int64(g0) - f0g1 := int64(f0) * int64(g1) - f0g2 := int64(f0) * int64(g2) - f0g3 := int64(f0) * int64(g3) - f0g4 := int64(f0) * int64(g4) - f0g5 := int64(f0) * int64(g5) - f0g6 := int64(f0) * int64(g6) - f0g7 := int64(f0) * int64(g7) - f0g8 := int64(f0) * int64(g8) - f0g9 := int64(f0) * int64(g9) - f1g0 := int64(f1) * int64(g0) - f1g1_2 := int64(f1_2) * int64(g1) - f1g2 := int64(f1) * int64(g2) - f1g3_2 := int64(f1_2) * int64(g3) - f1g4 := int64(f1) * int64(g4) - f1g5_2 := int64(f1_2) * int64(g5) - f1g6 := int64(f1) * int64(g6) - f1g7_2 := int64(f1_2) * int64(g7) - f1g8 := int64(f1) * int64(g8) - f1g9_38 := int64(f1_2) * int64(g9_19) - f2g0 := int64(f2) * int64(g0) - f2g1 := int64(f2) * int64(g1) - f2g2 := int64(f2) * int64(g2) - f2g3 := int64(f2) * int64(g3) - f2g4 := int64(f2) * int64(g4) - f2g5 := int64(f2) * int64(g5) - f2g6 := int64(f2) * int64(g6) - f2g7 := int64(f2) * int64(g7) - f2g8_19 := int64(f2) * int64(g8_19) - f2g9_19 := int64(f2) * int64(g9_19) - f3g0 := int64(f3) * int64(g0) - f3g1_2 := int64(f3_2) * int64(g1) - f3g2 := int64(f3) * int64(g2) - f3g3_2 := int64(f3_2) * int64(g3) - f3g4 := int64(f3) * int64(g4) - f3g5_2 := int64(f3_2) * int64(g5) - f3g6 := int64(f3) * int64(g6) - f3g7_38 := int64(f3_2) * int64(g7_19) - f3g8_19 := int64(f3) * int64(g8_19) - f3g9_38 := int64(f3_2) * int64(g9_19) - f4g0 := int64(f4) * int64(g0) - f4g1 := int64(f4) * int64(g1) - f4g2 := int64(f4) * int64(g2) - f4g3 := int64(f4) * int64(g3) - f4g4 := int64(f4) * int64(g4) - f4g5 := int64(f4) * int64(g5) - f4g6_19 := int64(f4) * int64(g6_19) - f4g7_19 := int64(f4) * int64(g7_19) - f4g8_19 := int64(f4) * int64(g8_19) - f4g9_19 := int64(f4) * int64(g9_19) - f5g0 := int64(f5) * int64(g0) - f5g1_2 := int64(f5_2) * int64(g1) - f5g2 := int64(f5) * int64(g2) - f5g3_2 := int64(f5_2) * int64(g3) - f5g4 := int64(f5) * int64(g4) - f5g5_38 := int64(f5_2) * int64(g5_19) - f5g6_19 := int64(f5) * int64(g6_19) - f5g7_38 := int64(f5_2) * int64(g7_19) - f5g8_19 := int64(f5) * int64(g8_19) - f5g9_38 := int64(f5_2) * int64(g9_19) - f6g0 := int64(f6) * int64(g0) - f6g1 := int64(f6) * int64(g1) - f6g2 := int64(f6) * int64(g2) - f6g3 := int64(f6) * int64(g3) - f6g4_19 := int64(f6) * int64(g4_19) - f6g5_19 := int64(f6) * int64(g5_19) - f6g6_19 := int64(f6) * int64(g6_19) - f6g7_19 := int64(f6) * int64(g7_19) - f6g8_19 := int64(f6) * int64(g8_19) - f6g9_19 := int64(f6) * int64(g9_19) - f7g0 := int64(f7) * int64(g0) - f7g1_2 := int64(f7_2) * int64(g1) - f7g2 := int64(f7) * int64(g2) - f7g3_38 := int64(f7_2) * int64(g3_19) - f7g4_19 := int64(f7) * int64(g4_19) - f7g5_38 := int64(f7_2) * int64(g5_19) - f7g6_19 := int64(f7) * int64(g6_19) - f7g7_38 := int64(f7_2) * int64(g7_19) - f7g8_19 := int64(f7) * int64(g8_19) - f7g9_38 := int64(f7_2) * int64(g9_19) - f8g0 := int64(f8) * int64(g0) - f8g1 := int64(f8) * int64(g1) - f8g2_19 := int64(f8) * int64(g2_19) - f8g3_19 := int64(f8) * int64(g3_19) - f8g4_19 := int64(f8) * int64(g4_19) - f8g5_19 := int64(f8) * int64(g5_19) - f8g6_19 := int64(f8) * int64(g6_19) - f8g7_19 := int64(f8) * int64(g7_19) - f8g8_19 := int64(f8) * int64(g8_19) - f8g9_19 := int64(f8) * int64(g9_19) - f9g0 := int64(f9) * int64(g0) - f9g1_38 := int64(f9_2) * int64(g1_19) - f9g2_19 := int64(f9) * int64(g2_19) - f9g3_38 := int64(f9_2) * int64(g3_19) - f9g4_19 := int64(f9) * int64(g4_19) - f9g5_38 := int64(f9_2) * int64(g5_19) - f9g6_19 := int64(f9) * int64(g6_19) - f9g7_38 := int64(f9_2) * int64(g7_19) - f9g8_19 := int64(f9) * int64(g8_19) - f9g9_38 := int64(f9_2) * int64(g9_19) - h0 := f0g0 + f1g9_38 + f2g8_19 + f3g7_38 + f4g6_19 + f5g5_38 + f6g4_19 + f7g3_38 + f8g2_19 + f9g1_38 - h1 := f0g1 + f1g0 + f2g9_19 + f3g8_19 + f4g7_19 + f5g6_19 + f6g5_19 + f7g4_19 + f8g3_19 + f9g2_19 - h2 := f0g2 + f1g1_2 + f2g0 + f3g9_38 + f4g8_19 + f5g7_38 + f6g6_19 + f7g5_38 + f8g4_19 + f9g3_38 - h3 := f0g3 + f1g2 + f2g1 + f3g0 + f4g9_19 + f5g8_19 + f6g7_19 + f7g6_19 + f8g5_19 + f9g4_19 - h4 := f0g4 + f1g3_2 + f2g2 + f3g1_2 + f4g0 + f5g9_38 + f6g8_19 + f7g7_38 + f8g6_19 + f9g5_38 - h5 := f0g5 + f1g4 + f2g3 + f3g2 + f4g1 + f5g0 + f6g9_19 + f7g8_19 + f8g7_19 + f9g6_19 - h6 := f0g6 + f1g5_2 + f2g4 + f3g3_2 + f4g2 + f5g1_2 + f6g0 + f7g9_38 + f8g8_19 + f9g7_38 - h7 := f0g7 + f1g6 + f2g5 + f3g4 + f4g3 + f5g2 + f6g1 + f7g0 + f8g9_19 + f9g8_19 - h8 := f0g8 + f1g7_2 + f2g6 + f3g5_2 + f4g4 + f5g3_2 + f6g2 + f7g1_2 + f8g0 + f9g9_38 - h9 := f0g9 + f1g8 + f2g7 + f3g6 + f4g5 + f5g4 + f6g3 + f7g2 + f8g1 + f9g0 - var carry [10]int64 - - // |h0| <= (1.1*1.1*2^52*(1+19+19+19+19)+1.1*1.1*2^50*(38+38+38+38+38)) - // i.e. |h0| <= 1.2*2^59; narrower ranges for h2, h4, h6, h8 - // |h1| <= (1.1*1.1*2^51*(1+1+19+19+19+19+19+19+19+19)) - // i.e. |h1| <= 1.5*2^58; narrower ranges for h3, h5, h7, h9 - - carry[0] = (h0 + (1 << 25)) >> 26 - h1 += carry[0] - h0 -= carry[0] << 26 - carry[4] = (h4 + (1 << 25)) >> 26 - h5 += carry[4] - h4 -= carry[4] << 26 - // |h0| <= 2^25 - // |h4| <= 2^25 - // |h1| <= 1.51*2^58 - // |h5| <= 1.51*2^58 - - carry[1] = (h1 + (1 << 24)) >> 25 - h2 += carry[1] - h1 -= carry[1] << 25 - carry[5] = (h5 + (1 << 24)) >> 25 - h6 += carry[5] - h5 -= carry[5] << 25 - // |h1| <= 2^24; from now on fits into int32 - // |h5| <= 2^24; from now on fits into int32 - // |h2| <= 1.21*2^59 - // |h6| <= 1.21*2^59 - - carry[2] = (h2 + (1 << 25)) >> 26 - h3 += carry[2] - h2 -= carry[2] << 26 - carry[6] = (h6 + (1 << 25)) >> 26 - h7 += carry[6] - h6 -= carry[6] << 26 - // |h2| <= 2^25; from now on fits into int32 unchanged - // |h6| <= 2^25; from now on fits into int32 unchanged - // |h3| <= 1.51*2^58 - // |h7| <= 1.51*2^58 - - carry[3] = (h3 + (1 << 24)) >> 25 - h4 += carry[3] - h3 -= carry[3] << 25 - carry[7] = (h7 + (1 << 24)) >> 25 - h8 += carry[7] - h7 -= carry[7] << 25 - // |h3| <= 2^24; from now on fits into int32 unchanged - // |h7| <= 2^24; from now on fits into int32 unchanged - // |h4| <= 1.52*2^33 - // |h8| <= 1.52*2^33 - - carry[4] = (h4 + (1 << 25)) >> 26 - h5 += carry[4] - h4 -= carry[4] << 26 - carry[8] = (h8 + (1 << 25)) >> 26 - h9 += carry[8] - h8 -= carry[8] << 26 - // |h4| <= 2^25; from now on fits into int32 unchanged - // |h8| <= 2^25; from now on fits into int32 unchanged - // |h5| <= 1.01*2^24 - // |h9| <= 1.51*2^58 - - carry[9] = (h9 + (1 << 24)) >> 25 - h0 += carry[9] * 19 - h9 -= carry[9] << 25 - // |h9| <= 2^24; from now on fits into int32 unchanged - // |h0| <= 1.8*2^37 - - carry[0] = (h0 + (1 << 25)) >> 26 - h1 += carry[0] - h0 -= carry[0] << 26 - // |h0| <= 2^25; from now on fits into int32 unchanged - // |h1| <= 1.01*2^24 - - h[0] = int32(h0) - h[1] = int32(h1) - h[2] = int32(h2) - h[3] = int32(h3) - h[4] = int32(h4) - h[5] = int32(h5) - h[6] = int32(h6) - h[7] = int32(h7) - h[8] = int32(h8) - h[9] = int32(h9) +// It is recommended to use the X25519 function with Basepoint instead, as +// copying into fixed size arrays can lead to unexpected bugs. +func ScalarBaseMult(dst, scalar *[32]byte) { + ScalarMult(dst, scalar, &basePoint) } -// feSquare calculates h = f*f. Can overlap h with f. -// -// Preconditions: -// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -// -// Postconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -func feSquare(h, f *fieldElement) { - f0 := f[0] - f1 := f[1] - f2 := f[2] - f3 := f[3] - f4 := f[4] - f5 := f[5] - f6 := f[6] - f7 := f[7] - f8 := f[8] - f9 := f[9] - f0_2 := 2 * f0 - f1_2 := 2 * f1 - f2_2 := 2 * f2 - f3_2 := 2 * f3 - f4_2 := 2 * f4 - f5_2 := 2 * f5 - f6_2 := 2 * f6 - f7_2 := 2 * f7 - f5_38 := 38 * f5 // 1.31*2^30 - f6_19 := 19 * f6 // 1.31*2^30 - f7_38 := 38 * f7 // 1.31*2^30 - f8_19 := 19 * f8 // 1.31*2^30 - f9_38 := 38 * f9 // 1.31*2^30 - f0f0 := int64(f0) * int64(f0) - f0f1_2 := int64(f0_2) * int64(f1) - f0f2_2 := int64(f0_2) * int64(f2) - f0f3_2 := int64(f0_2) * int64(f3) - f0f4_2 := int64(f0_2) * int64(f4) - f0f5_2 := int64(f0_2) * int64(f5) - f0f6_2 := int64(f0_2) * int64(f6) - f0f7_2 := int64(f0_2) * int64(f7) - f0f8_2 := int64(f0_2) * int64(f8) - f0f9_2 := int64(f0_2) * int64(f9) - f1f1_2 := int64(f1_2) * int64(f1) - f1f2_2 := int64(f1_2) * int64(f2) - f1f3_4 := int64(f1_2) * int64(f3_2) - f1f4_2 := int64(f1_2) * int64(f4) - f1f5_4 := int64(f1_2) * int64(f5_2) - f1f6_2 := int64(f1_2) * int64(f6) - f1f7_4 := int64(f1_2) * int64(f7_2) - f1f8_2 := int64(f1_2) * int64(f8) - f1f9_76 := int64(f1_2) * int64(f9_38) - f2f2 := int64(f2) * int64(f2) - f2f3_2 := int64(f2_2) * int64(f3) - f2f4_2 := int64(f2_2) * int64(f4) - f2f5_2 := int64(f2_2) * int64(f5) - f2f6_2 := int64(f2_2) * int64(f6) - f2f7_2 := int64(f2_2) * int64(f7) - f2f8_38 := int64(f2_2) * int64(f8_19) - f2f9_38 := int64(f2) * int64(f9_38) - f3f3_2 := int64(f3_2) * int64(f3) - f3f4_2 := int64(f3_2) * int64(f4) - f3f5_4 := int64(f3_2) * int64(f5_2) - f3f6_2 := int64(f3_2) * int64(f6) - f3f7_76 := int64(f3_2) * int64(f7_38) - f3f8_38 := int64(f3_2) * int64(f8_19) - f3f9_76 := int64(f3_2) * int64(f9_38) - f4f4 := int64(f4) * int64(f4) - f4f5_2 := int64(f4_2) * int64(f5) - f4f6_38 := int64(f4_2) * int64(f6_19) - f4f7_38 := int64(f4) * int64(f7_38) - f4f8_38 := int64(f4_2) * int64(f8_19) - f4f9_38 := int64(f4) * int64(f9_38) - f5f5_38 := int64(f5) * int64(f5_38) - f5f6_38 := int64(f5_2) * int64(f6_19) - f5f7_76 := int64(f5_2) * int64(f7_38) - f5f8_38 := int64(f5_2) * int64(f8_19) - f5f9_76 := int64(f5_2) * int64(f9_38) - f6f6_19 := int64(f6) * int64(f6_19) - f6f7_38 := int64(f6) * int64(f7_38) - f6f8_38 := int64(f6_2) * int64(f8_19) - f6f9_38 := int64(f6) * int64(f9_38) - f7f7_38 := int64(f7) * int64(f7_38) - f7f8_38 := int64(f7_2) * int64(f8_19) - f7f9_76 := int64(f7_2) * int64(f9_38) - f8f8_19 := int64(f8) * int64(f8_19) - f8f9_38 := int64(f8) * int64(f9_38) - f9f9_38 := int64(f9) * int64(f9_38) - h0 := f0f0 + f1f9_76 + f2f8_38 + f3f7_76 + f4f6_38 + f5f5_38 - h1 := f0f1_2 + f2f9_38 + f3f8_38 + f4f7_38 + f5f6_38 - h2 := f0f2_2 + f1f1_2 + f3f9_76 + f4f8_38 + f5f7_76 + f6f6_19 - h3 := f0f3_2 + f1f2_2 + f4f9_38 + f5f8_38 + f6f7_38 - h4 := f0f4_2 + f1f3_4 + f2f2 + f5f9_76 + f6f8_38 + f7f7_38 - h5 := f0f5_2 + f1f4_2 + f2f3_2 + f6f9_38 + f7f8_38 - h6 := f0f6_2 + f1f5_4 + f2f4_2 + f3f3_2 + f7f9_76 + f8f8_19 - h7 := f0f7_2 + f1f6_2 + f2f5_2 + f3f4_2 + f8f9_38 - h8 := f0f8_2 + f1f7_4 + f2f6_2 + f3f5_4 + f4f4 + f9f9_38 - h9 := f0f9_2 + f1f8_2 + f2f7_2 + f3f6_2 + f4f5_2 - var carry [10]int64 - - carry[0] = (h0 + (1 << 25)) >> 26 - h1 += carry[0] - h0 -= carry[0] << 26 - carry[4] = (h4 + (1 << 25)) >> 26 - h5 += carry[4] - h4 -= carry[4] << 26 - - carry[1] = (h1 + (1 << 24)) >> 25 - h2 += carry[1] - h1 -= carry[1] << 25 - carry[5] = (h5 + (1 << 24)) >> 25 - h6 += carry[5] - h5 -= carry[5] << 25 - - carry[2] = (h2 + (1 << 25)) >> 26 - h3 += carry[2] - h2 -= carry[2] << 26 - carry[6] = (h6 + (1 << 25)) >> 26 - h7 += carry[6] - h6 -= carry[6] << 26 - - carry[3] = (h3 + (1 << 24)) >> 25 - h4 += carry[3] - h3 -= carry[3] << 25 - carry[7] = (h7 + (1 << 24)) >> 25 - h8 += carry[7] - h7 -= carry[7] << 25 +const ( + // ScalarSize is the size of the scalar input to X25519. + ScalarSize = 32 + // PointSize is the size of the point input to X25519. + PointSize = 32 +) - carry[4] = (h4 + (1 << 25)) >> 26 - h5 += carry[4] - h4 -= carry[4] << 26 - carry[8] = (h8 + (1 << 25)) >> 26 - h9 += carry[8] - h8 -= carry[8] << 26 +// Basepoint is the canonical Curve25519 generator. +var Basepoint []byte - carry[9] = (h9 + (1 << 24)) >> 25 - h0 += carry[9] * 19 - h9 -= carry[9] << 25 +var basePoint = [32]byte{9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - carry[0] = (h0 + (1 << 25)) >> 26 - h1 += carry[0] - h0 -= carry[0] << 26 +func init() { Basepoint = basePoint[:] } - h[0] = int32(h0) - h[1] = int32(h1) - h[2] = int32(h2) - h[3] = int32(h3) - h[4] = int32(h4) - h[5] = int32(h5) - h[6] = int32(h6) - h[7] = int32(h7) - h[8] = int32(h8) - h[9] = int32(h9) +func checkBasepoint() { + if subtle.ConstantTimeCompare(Basepoint, []byte{ + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }) != 1 { + panic("curve25519: global Basepoint value was modified") + } } -// feMul121666 calculates h = f * 121666. Can overlap h with f. +// X25519 returns the result of the scalar multiplication (scalar * point), +// according to RFC 7748, Section 5. scalar, point and the return value are +// slices of 32 bytes. // -// Preconditions: -// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +// scalar can be generated at random, for example with crypto/rand. point should +// be either Basepoint or the output of another X25519 call. // -// Postconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -func feMul121666(h, f *fieldElement) { - h0 := int64(f[0]) * 121666 - h1 := int64(f[1]) * 121666 - h2 := int64(f[2]) * 121666 - h3 := int64(f[3]) * 121666 - h4 := int64(f[4]) * 121666 - h5 := int64(f[5]) * 121666 - h6 := int64(f[6]) * 121666 - h7 := int64(f[7]) * 121666 - h8 := int64(f[8]) * 121666 - h9 := int64(f[9]) * 121666 - var carry [10]int64 - - carry[9] = (h9 + (1 << 24)) >> 25 - h0 += carry[9] * 19 - h9 -= carry[9] << 25 - carry[1] = (h1 + (1 << 24)) >> 25 - h2 += carry[1] - h1 -= carry[1] << 25 - carry[3] = (h3 + (1 << 24)) >> 25 - h4 += carry[3] - h3 -= carry[3] << 25 - carry[5] = (h5 + (1 << 24)) >> 25 - h6 += carry[5] - h5 -= carry[5] << 25 - carry[7] = (h7 + (1 << 24)) >> 25 - h8 += carry[7] - h7 -= carry[7] << 25 - - carry[0] = (h0 + (1 << 25)) >> 26 - h1 += carry[0] - h0 -= carry[0] << 26 - carry[2] = (h2 + (1 << 25)) >> 26 - h3 += carry[2] - h2 -= carry[2] << 26 - carry[4] = (h4 + (1 << 25)) >> 26 - h5 += carry[4] - h4 -= carry[4] << 26 - carry[6] = (h6 + (1 << 25)) >> 26 - h7 += carry[6] - h6 -= carry[6] << 26 - carry[8] = (h8 + (1 << 25)) >> 26 - h9 += carry[8] - h8 -= carry[8] << 26 - - h[0] = int32(h0) - h[1] = int32(h1) - h[2] = int32(h2) - h[3] = int32(h3) - h[4] = int32(h4) - h[5] = int32(h5) - h[6] = int32(h6) - h[7] = int32(h7) - h[8] = int32(h8) - h[9] = int32(h9) -} - -// feInvert sets out = z^-1. -func feInvert(out, z *fieldElement) { - var t0, t1, t2, t3 fieldElement - var i int - - feSquare(&t0, z) - for i = 1; i < 1; i++ { - feSquare(&t0, &t0) - } - feSquare(&t1, &t0) - for i = 1; i < 2; i++ { - feSquare(&t1, &t1) - } - feMul(&t1, z, &t1) - feMul(&t0, &t0, &t1) - feSquare(&t2, &t0) - for i = 1; i < 1; i++ { - feSquare(&t2, &t2) - } - feMul(&t1, &t1, &t2) - feSquare(&t2, &t1) - for i = 1; i < 5; i++ { - feSquare(&t2, &t2) - } - feMul(&t1, &t2, &t1) - feSquare(&t2, &t1) - for i = 1; i < 10; i++ { - feSquare(&t2, &t2) - } - feMul(&t2, &t2, &t1) - feSquare(&t3, &t2) - for i = 1; i < 20; i++ { - feSquare(&t3, &t3) - } - feMul(&t2, &t3, &t2) - feSquare(&t2, &t2) - for i = 1; i < 10; i++ { - feSquare(&t2, &t2) - } - feMul(&t1, &t2, &t1) - feSquare(&t2, &t1) - for i = 1; i < 50; i++ { - feSquare(&t2, &t2) - } - feMul(&t2, &t2, &t1) - feSquare(&t3, &t2) - for i = 1; i < 100; i++ { - feSquare(&t3, &t3) - } - feMul(&t2, &t3, &t2) - feSquare(&t2, &t2) - for i = 1; i < 50; i++ { - feSquare(&t2, &t2) - } - feMul(&t1, &t2, &t1) - feSquare(&t1, &t1) - for i = 1; i < 5; i++ { - feSquare(&t1, &t1) - } - feMul(out, &t1, &t0) +// If point is Basepoint (but not if it's a different slice with the same +// contents) a precomputed implementation might be used for performance. +func X25519(scalar, point []byte) ([]byte, error) { + // Outline the body of function, to let the allocation be inlined in the + // caller, and possibly avoid escaping to the heap. + var dst [32]byte + return x25519(&dst, scalar, point) } -func scalarMult(out, in, base *[32]byte) { - var e [32]byte - - copy(e[:], in[:]) - e[0] &= 248 - e[31] &= 127 - e[31] |= 64 - - var x1, x2, z2, x3, z3, tmp0, tmp1 fieldElement - feFromBytes(&x1, base) - feOne(&x2) - feCopy(&x3, &x1) - feOne(&z3) - - swap := int32(0) - for pos := 254; pos >= 0; pos-- { - b := e[pos/8] >> uint(pos&7) - b &= 1 - swap ^= int32(b) - feCSwap(&x2, &x3, swap) - feCSwap(&z2, &z3, swap) - swap = int32(b) - - feSub(&tmp0, &x3, &z3) - feSub(&tmp1, &x2, &z2) - feAdd(&x2, &x2, &z2) - feAdd(&z2, &x3, &z3) - feMul(&z3, &tmp0, &x2) - feMul(&z2, &z2, &tmp1) - feSquare(&tmp0, &tmp1) - feSquare(&tmp1, &x2) - feAdd(&x3, &z3, &z2) - feSub(&z2, &z3, &z2) - feMul(&x2, &tmp1, &tmp0) - feSub(&tmp1, &tmp1, &tmp0) - feSquare(&z2, &z2) - feMul121666(&z3, &tmp1) - feSquare(&x3, &x3) - feAdd(&tmp0, &tmp0, &z3) - feMul(&z3, &x1, &z2) - feMul(&z2, &tmp1, &tmp0) - } - - feCSwap(&x2, &x3, swap) - feCSwap(&z2, &z3, swap) - - feInvert(&z2, &z2) - feMul(&x2, &x2, &z2) - feToBytes(out, &x2) +func x25519(dst *[32]byte, scalar, point []byte) ([]byte, error) { + var in [32]byte + if l := len(scalar); l != 32 { + return nil, fmt.Errorf("bad scalar length: %d, expected %d", l, 32) + } + if l := len(point); l != 32 { + return nil, fmt.Errorf("bad point length: %d, expected %d", l, 32) + } + copy(in[:], scalar) + if &point[0] == &Basepoint[0] { + checkBasepoint() + ScalarBaseMult(dst, &in) + } else { + var base, zero [32]byte + copy(base[:], point) + ScalarMult(dst, &in, &base) + if subtle.ConstantTimeCompare(dst[:], zero[:]) == 1 { + return nil, fmt.Errorf("bad input point: low order point") + } + } + return dst[:], nil } diff --git a/vendor/golang.org/x/crypto/curve25519/curve25519_amd64.go b/vendor/golang.org/x/crypto/curve25519/curve25519_amd64.go new file mode 100644 index 000000000..5120b779b --- /dev/null +++ b/vendor/golang.org/x/crypto/curve25519/curve25519_amd64.go @@ -0,0 +1,240 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,!gccgo,!appengine,!purego + +package curve25519 + +// These functions are implemented in the .s files. The names of the functions +// in the rest of the file are also taken from the SUPERCOP sources to help +// people following along. + +//go:noescape + +func cswap(inout *[5]uint64, v uint64) + +//go:noescape + +func ladderstep(inout *[5][5]uint64) + +//go:noescape + +func freeze(inout *[5]uint64) + +//go:noescape + +func mul(dest, a, b *[5]uint64) + +//go:noescape + +func square(out, in *[5]uint64) + +// mladder uses a Montgomery ladder to calculate (xr/zr) *= s. +func mladder(xr, zr *[5]uint64, s *[32]byte) { + var work [5][5]uint64 + + work[0] = *xr + setint(&work[1], 1) + setint(&work[2], 0) + work[3] = *xr + setint(&work[4], 1) + + j := uint(6) + var prevbit byte + + for i := 31; i >= 0; i-- { + for j < 8 { + bit := ((*s)[i] >> j) & 1 + swap := bit ^ prevbit + prevbit = bit + cswap(&work[1], uint64(swap)) + ladderstep(&work) + j-- + } + j = 7 + } + + *xr = work[1] + *zr = work[2] +} + +func scalarMult(out, in, base *[32]byte) { + var e [32]byte + copy(e[:], (*in)[:]) + e[0] &= 248 + e[31] &= 127 + e[31] |= 64 + + var t, z [5]uint64 + unpack(&t, base) + mladder(&t, &z, &e) + invert(&z, &z) + mul(&t, &t, &z) + pack(out, &t) +} + +func setint(r *[5]uint64, v uint64) { + r[0] = v + r[1] = 0 + r[2] = 0 + r[3] = 0 + r[4] = 0 +} + +// unpack sets r = x where r consists of 5, 51-bit limbs in little-endian +// order. +func unpack(r *[5]uint64, x *[32]byte) { + r[0] = uint64(x[0]) | + uint64(x[1])<<8 | + uint64(x[2])<<16 | + uint64(x[3])<<24 | + uint64(x[4])<<32 | + uint64(x[5])<<40 | + uint64(x[6]&7)<<48 + + r[1] = uint64(x[6])>>3 | + uint64(x[7])<<5 | + uint64(x[8])<<13 | + uint64(x[9])<<21 | + uint64(x[10])<<29 | + uint64(x[11])<<37 | + uint64(x[12]&63)<<45 + + r[2] = uint64(x[12])>>6 | + uint64(x[13])<<2 | + uint64(x[14])<<10 | + uint64(x[15])<<18 | + uint64(x[16])<<26 | + uint64(x[17])<<34 | + uint64(x[18])<<42 | + uint64(x[19]&1)<<50 + + r[3] = uint64(x[19])>>1 | + uint64(x[20])<<7 | + uint64(x[21])<<15 | + uint64(x[22])<<23 | + uint64(x[23])<<31 | + uint64(x[24])<<39 | + uint64(x[25]&15)<<47 + + r[4] = uint64(x[25])>>4 | + uint64(x[26])<<4 | + uint64(x[27])<<12 | + uint64(x[28])<<20 | + uint64(x[29])<<28 | + uint64(x[30])<<36 | + uint64(x[31]&127)<<44 +} + +// pack sets out = x where out is the usual, little-endian form of the 5, +// 51-bit limbs in x. +func pack(out *[32]byte, x *[5]uint64) { + t := *x + freeze(&t) + + out[0] = byte(t[0]) + out[1] = byte(t[0] >> 8) + out[2] = byte(t[0] >> 16) + out[3] = byte(t[0] >> 24) + out[4] = byte(t[0] >> 32) + out[5] = byte(t[0] >> 40) + out[6] = byte(t[0] >> 48) + + out[6] ^= byte(t[1]<<3) & 0xf8 + out[7] = byte(t[1] >> 5) + out[8] = byte(t[1] >> 13) + out[9] = byte(t[1] >> 21) + out[10] = byte(t[1] >> 29) + out[11] = byte(t[1] >> 37) + out[12] = byte(t[1] >> 45) + + out[12] ^= byte(t[2]<<6) & 0xc0 + out[13] = byte(t[2] >> 2) + out[14] = byte(t[2] >> 10) + out[15] = byte(t[2] >> 18) + out[16] = byte(t[2] >> 26) + out[17] = byte(t[2] >> 34) + out[18] = byte(t[2] >> 42) + out[19] = byte(t[2] >> 50) + + out[19] ^= byte(t[3]<<1) & 0xfe + out[20] = byte(t[3] >> 7) + out[21] = byte(t[3] >> 15) + out[22] = byte(t[3] >> 23) + out[23] = byte(t[3] >> 31) + out[24] = byte(t[3] >> 39) + out[25] = byte(t[3] >> 47) + + out[25] ^= byte(t[4]<<4) & 0xf0 + out[26] = byte(t[4] >> 4) + out[27] = byte(t[4] >> 12) + out[28] = byte(t[4] >> 20) + out[29] = byte(t[4] >> 28) + out[30] = byte(t[4] >> 36) + out[31] = byte(t[4] >> 44) +} + +// invert calculates r = x^-1 mod p using Fermat's little theorem. +func invert(r *[5]uint64, x *[5]uint64) { + var z2, z9, z11, z2_5_0, z2_10_0, z2_20_0, z2_50_0, z2_100_0, t [5]uint64 + + square(&z2, x) /* 2 */ + square(&t, &z2) /* 4 */ + square(&t, &t) /* 8 */ + mul(&z9, &t, x) /* 9 */ + mul(&z11, &z9, &z2) /* 11 */ + square(&t, &z11) /* 22 */ + mul(&z2_5_0, &t, &z9) /* 2^5 - 2^0 = 31 */ + + square(&t, &z2_5_0) /* 2^6 - 2^1 */ + for i := 1; i < 5; i++ { /* 2^20 - 2^10 */ + square(&t, &t) + } + mul(&z2_10_0, &t, &z2_5_0) /* 2^10 - 2^0 */ + + square(&t, &z2_10_0) /* 2^11 - 2^1 */ + for i := 1; i < 10; i++ { /* 2^20 - 2^10 */ + square(&t, &t) + } + mul(&z2_20_0, &t, &z2_10_0) /* 2^20 - 2^0 */ + + square(&t, &z2_20_0) /* 2^21 - 2^1 */ + for i := 1; i < 20; i++ { /* 2^40 - 2^20 */ + square(&t, &t) + } + mul(&t, &t, &z2_20_0) /* 2^40 - 2^0 */ + + square(&t, &t) /* 2^41 - 2^1 */ + for i := 1; i < 10; i++ { /* 2^50 - 2^10 */ + square(&t, &t) + } + mul(&z2_50_0, &t, &z2_10_0) /* 2^50 - 2^0 */ + + square(&t, &z2_50_0) /* 2^51 - 2^1 */ + for i := 1; i < 50; i++ { /* 2^100 - 2^50 */ + square(&t, &t) + } + mul(&z2_100_0, &t, &z2_50_0) /* 2^100 - 2^0 */ + + square(&t, &z2_100_0) /* 2^101 - 2^1 */ + for i := 1; i < 100; i++ { /* 2^200 - 2^100 */ + square(&t, &t) + } + mul(&t, &t, &z2_100_0) /* 2^200 - 2^0 */ + + square(&t, &t) /* 2^201 - 2^1 */ + for i := 1; i < 50; i++ { /* 2^250 - 2^50 */ + square(&t, &t) + } + mul(&t, &t, &z2_50_0) /* 2^250 - 2^0 */ + + square(&t, &t) /* 2^251 - 2^1 */ + square(&t, &t) /* 2^252 - 2^2 */ + square(&t, &t) /* 2^253 - 2^3 */ + + square(&t, &t) /* 2^254 - 2^4 */ + + square(&t, &t) /* 2^255 - 2^5 */ + mul(r, &t, &z11) /* 2^255 - 21 */ +} diff --git a/vendor/golang.org/x/crypto/curve25519/curve25519_amd64.s b/vendor/golang.org/x/crypto/curve25519/curve25519_amd64.s new file mode 100644 index 000000000..0250c8885 --- /dev/null +++ b/vendor/golang.org/x/crypto/curve25519/curve25519_amd64.s @@ -0,0 +1,1793 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This code was translated into a form compatible with 6a from the public +// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html + +// +build amd64,!gccgo,!appengine,!purego + +#define REDMASK51 0x0007FFFFFFFFFFFF + +// These constants cannot be encoded in non-MOVQ immediates. +// We access them directly from memory instead. + +DATA ·_121666_213(SB)/8, $996687872 +GLOBL ·_121666_213(SB), 8, $8 + +DATA ·_2P0(SB)/8, $0xFFFFFFFFFFFDA +GLOBL ·_2P0(SB), 8, $8 + +DATA ·_2P1234(SB)/8, $0xFFFFFFFFFFFFE +GLOBL ·_2P1234(SB), 8, $8 + +// func freeze(inout *[5]uint64) +TEXT ·freeze(SB),7,$0-8 + MOVQ inout+0(FP), DI + + MOVQ 0(DI),SI + MOVQ 8(DI),DX + MOVQ 16(DI),CX + MOVQ 24(DI),R8 + MOVQ 32(DI),R9 + MOVQ $REDMASK51,AX + MOVQ AX,R10 + SUBQ $18,R10 + MOVQ $3,R11 +REDUCELOOP: + MOVQ SI,R12 + SHRQ $51,R12 + ANDQ AX,SI + ADDQ R12,DX + MOVQ DX,R12 + SHRQ $51,R12 + ANDQ AX,DX + ADDQ R12,CX + MOVQ CX,R12 + SHRQ $51,R12 + ANDQ AX,CX + ADDQ R12,R8 + MOVQ R8,R12 + SHRQ $51,R12 + ANDQ AX,R8 + ADDQ R12,R9 + MOVQ R9,R12 + SHRQ $51,R12 + ANDQ AX,R9 + IMUL3Q $19,R12,R12 + ADDQ R12,SI + SUBQ $1,R11 + JA REDUCELOOP + MOVQ $1,R12 + CMPQ R10,SI + CMOVQLT R11,R12 + CMPQ AX,DX + CMOVQNE R11,R12 + CMPQ AX,CX + CMOVQNE R11,R12 + CMPQ AX,R8 + CMOVQNE R11,R12 + CMPQ AX,R9 + CMOVQNE R11,R12 + NEGQ R12 + ANDQ R12,AX + ANDQ R12,R10 + SUBQ R10,SI + SUBQ AX,DX + SUBQ AX,CX + SUBQ AX,R8 + SUBQ AX,R9 + MOVQ SI,0(DI) + MOVQ DX,8(DI) + MOVQ CX,16(DI) + MOVQ R8,24(DI) + MOVQ R9,32(DI) + RET + +// func ladderstep(inout *[5][5]uint64) +TEXT ·ladderstep(SB),0,$296-8 + MOVQ inout+0(FP),DI + + MOVQ 40(DI),SI + MOVQ 48(DI),DX + MOVQ 56(DI),CX + MOVQ 64(DI),R8 + MOVQ 72(DI),R9 + MOVQ SI,AX + MOVQ DX,R10 + MOVQ CX,R11 + MOVQ R8,R12 + MOVQ R9,R13 + ADDQ ·_2P0(SB),AX + ADDQ ·_2P1234(SB),R10 + ADDQ ·_2P1234(SB),R11 + ADDQ ·_2P1234(SB),R12 + ADDQ ·_2P1234(SB),R13 + ADDQ 80(DI),SI + ADDQ 88(DI),DX + ADDQ 96(DI),CX + ADDQ 104(DI),R8 + ADDQ 112(DI),R9 + SUBQ 80(DI),AX + SUBQ 88(DI),R10 + SUBQ 96(DI),R11 + SUBQ 104(DI),R12 + SUBQ 112(DI),R13 + MOVQ SI,0(SP) + MOVQ DX,8(SP) + MOVQ CX,16(SP) + MOVQ R8,24(SP) + MOVQ R9,32(SP) + MOVQ AX,40(SP) + MOVQ R10,48(SP) + MOVQ R11,56(SP) + MOVQ R12,64(SP) + MOVQ R13,72(SP) + MOVQ 40(SP),AX + MULQ 40(SP) + MOVQ AX,SI + MOVQ DX,CX + MOVQ 40(SP),AX + SHLQ $1,AX + MULQ 48(SP) + MOVQ AX,R8 + MOVQ DX,R9 + MOVQ 40(SP),AX + SHLQ $1,AX + MULQ 56(SP) + MOVQ AX,R10 + MOVQ DX,R11 + MOVQ 40(SP),AX + SHLQ $1,AX + MULQ 64(SP) + MOVQ AX,R12 + MOVQ DX,R13 + MOVQ 40(SP),AX + SHLQ $1,AX + MULQ 72(SP) + MOVQ AX,R14 + MOVQ DX,R15 + MOVQ 48(SP),AX + MULQ 48(SP) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 48(SP),AX + SHLQ $1,AX + MULQ 56(SP) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ 48(SP),AX + SHLQ $1,AX + MULQ 64(SP) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 48(SP),DX + IMUL3Q $38,DX,AX + MULQ 72(SP) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 56(SP),AX + MULQ 56(SP) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 56(SP),DX + IMUL3Q $38,DX,AX + MULQ 64(SP) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 56(SP),DX + IMUL3Q $38,DX,AX + MULQ 72(SP) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 64(SP),DX + IMUL3Q $19,DX,AX + MULQ 64(SP) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 64(SP),DX + IMUL3Q $38,DX,AX + MULQ 72(SP) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 72(SP),DX + IMUL3Q $19,DX,AX + MULQ 72(SP) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ $REDMASK51,DX + SHLQ $13,SI,CX + ANDQ DX,SI + SHLQ $13,R8,R9 + ANDQ DX,R8 + ADDQ CX,R8 + SHLQ $13,R10,R11 + ANDQ DX,R10 + ADDQ R9,R10 + SHLQ $13,R12,R13 + ANDQ DX,R12 + ADDQ R11,R12 + SHLQ $13,R14,R15 + ANDQ DX,R14 + ADDQ R13,R14 + IMUL3Q $19,R15,CX + ADDQ CX,SI + MOVQ SI,CX + SHRQ $51,CX + ADDQ R8,CX + ANDQ DX,SI + MOVQ CX,R8 + SHRQ $51,CX + ADDQ R10,CX + ANDQ DX,R8 + MOVQ CX,R9 + SHRQ $51,CX + ADDQ R12,CX + ANDQ DX,R9 + MOVQ CX,AX + SHRQ $51,CX + ADDQ R14,CX + ANDQ DX,AX + MOVQ CX,R10 + SHRQ $51,CX + IMUL3Q $19,CX,CX + ADDQ CX,SI + ANDQ DX,R10 + MOVQ SI,80(SP) + MOVQ R8,88(SP) + MOVQ R9,96(SP) + MOVQ AX,104(SP) + MOVQ R10,112(SP) + MOVQ 0(SP),AX + MULQ 0(SP) + MOVQ AX,SI + MOVQ DX,CX + MOVQ 0(SP),AX + SHLQ $1,AX + MULQ 8(SP) + MOVQ AX,R8 + MOVQ DX,R9 + MOVQ 0(SP),AX + SHLQ $1,AX + MULQ 16(SP) + MOVQ AX,R10 + MOVQ DX,R11 + MOVQ 0(SP),AX + SHLQ $1,AX + MULQ 24(SP) + MOVQ AX,R12 + MOVQ DX,R13 + MOVQ 0(SP),AX + SHLQ $1,AX + MULQ 32(SP) + MOVQ AX,R14 + MOVQ DX,R15 + MOVQ 8(SP),AX + MULQ 8(SP) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 8(SP),AX + SHLQ $1,AX + MULQ 16(SP) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ 8(SP),AX + SHLQ $1,AX + MULQ 24(SP) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 8(SP),DX + IMUL3Q $38,DX,AX + MULQ 32(SP) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 16(SP),AX + MULQ 16(SP) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 16(SP),DX + IMUL3Q $38,DX,AX + MULQ 24(SP) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 16(SP),DX + IMUL3Q $38,DX,AX + MULQ 32(SP) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 24(SP),DX + IMUL3Q $19,DX,AX + MULQ 24(SP) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 24(SP),DX + IMUL3Q $38,DX,AX + MULQ 32(SP) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 32(SP),DX + IMUL3Q $19,DX,AX + MULQ 32(SP) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ $REDMASK51,DX + SHLQ $13,SI,CX + ANDQ DX,SI + SHLQ $13,R8,R9 + ANDQ DX,R8 + ADDQ CX,R8 + SHLQ $13,R10,R11 + ANDQ DX,R10 + ADDQ R9,R10 + SHLQ $13,R12,R13 + ANDQ DX,R12 + ADDQ R11,R12 + SHLQ $13,R14,R15 + ANDQ DX,R14 + ADDQ R13,R14 + IMUL3Q $19,R15,CX + ADDQ CX,SI + MOVQ SI,CX + SHRQ $51,CX + ADDQ R8,CX + ANDQ DX,SI + MOVQ CX,R8 + SHRQ $51,CX + ADDQ R10,CX + ANDQ DX,R8 + MOVQ CX,R9 + SHRQ $51,CX + ADDQ R12,CX + ANDQ DX,R9 + MOVQ CX,AX + SHRQ $51,CX + ADDQ R14,CX + ANDQ DX,AX + MOVQ CX,R10 + SHRQ $51,CX + IMUL3Q $19,CX,CX + ADDQ CX,SI + ANDQ DX,R10 + MOVQ SI,120(SP) + MOVQ R8,128(SP) + MOVQ R9,136(SP) + MOVQ AX,144(SP) + MOVQ R10,152(SP) + MOVQ SI,SI + MOVQ R8,DX + MOVQ R9,CX + MOVQ AX,R8 + MOVQ R10,R9 + ADDQ ·_2P0(SB),SI + ADDQ ·_2P1234(SB),DX + ADDQ ·_2P1234(SB),CX + ADDQ ·_2P1234(SB),R8 + ADDQ ·_2P1234(SB),R9 + SUBQ 80(SP),SI + SUBQ 88(SP),DX + SUBQ 96(SP),CX + SUBQ 104(SP),R8 + SUBQ 112(SP),R9 + MOVQ SI,160(SP) + MOVQ DX,168(SP) + MOVQ CX,176(SP) + MOVQ R8,184(SP) + MOVQ R9,192(SP) + MOVQ 120(DI),SI + MOVQ 128(DI),DX + MOVQ 136(DI),CX + MOVQ 144(DI),R8 + MOVQ 152(DI),R9 + MOVQ SI,AX + MOVQ DX,R10 + MOVQ CX,R11 + MOVQ R8,R12 + MOVQ R9,R13 + ADDQ ·_2P0(SB),AX + ADDQ ·_2P1234(SB),R10 + ADDQ ·_2P1234(SB),R11 + ADDQ ·_2P1234(SB),R12 + ADDQ ·_2P1234(SB),R13 + ADDQ 160(DI),SI + ADDQ 168(DI),DX + ADDQ 176(DI),CX + ADDQ 184(DI),R8 + ADDQ 192(DI),R9 + SUBQ 160(DI),AX + SUBQ 168(DI),R10 + SUBQ 176(DI),R11 + SUBQ 184(DI),R12 + SUBQ 192(DI),R13 + MOVQ SI,200(SP) + MOVQ DX,208(SP) + MOVQ CX,216(SP) + MOVQ R8,224(SP) + MOVQ R9,232(SP) + MOVQ AX,240(SP) + MOVQ R10,248(SP) + MOVQ R11,256(SP) + MOVQ R12,264(SP) + MOVQ R13,272(SP) + MOVQ 224(SP),SI + IMUL3Q $19,SI,AX + MOVQ AX,280(SP) + MULQ 56(SP) + MOVQ AX,SI + MOVQ DX,CX + MOVQ 232(SP),DX + IMUL3Q $19,DX,AX + MOVQ AX,288(SP) + MULQ 48(SP) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 200(SP),AX + MULQ 40(SP) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 200(SP),AX + MULQ 48(SP) + MOVQ AX,R8 + MOVQ DX,R9 + MOVQ 200(SP),AX + MULQ 56(SP) + MOVQ AX,R10 + MOVQ DX,R11 + MOVQ 200(SP),AX + MULQ 64(SP) + MOVQ AX,R12 + MOVQ DX,R13 + MOVQ 200(SP),AX + MULQ 72(SP) + MOVQ AX,R14 + MOVQ DX,R15 + MOVQ 208(SP),AX + MULQ 40(SP) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 208(SP),AX + MULQ 48(SP) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 208(SP),AX + MULQ 56(SP) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ 208(SP),AX + MULQ 64(SP) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 208(SP),DX + IMUL3Q $19,DX,AX + MULQ 72(SP) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 216(SP),AX + MULQ 40(SP) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 216(SP),AX + MULQ 48(SP) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ 216(SP),AX + MULQ 56(SP) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 216(SP),DX + IMUL3Q $19,DX,AX + MULQ 64(SP) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 216(SP),DX + IMUL3Q $19,DX,AX + MULQ 72(SP) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 224(SP),AX + MULQ 40(SP) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ 224(SP),AX + MULQ 48(SP) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 280(SP),AX + MULQ 64(SP) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 280(SP),AX + MULQ 72(SP) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 232(SP),AX + MULQ 40(SP) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 288(SP),AX + MULQ 56(SP) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 288(SP),AX + MULQ 64(SP) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 288(SP),AX + MULQ 72(SP) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ $REDMASK51,DX + SHLQ $13,SI,CX + ANDQ DX,SI + SHLQ $13,R8,R9 + ANDQ DX,R8 + ADDQ CX,R8 + SHLQ $13,R10,R11 + ANDQ DX,R10 + ADDQ R9,R10 + SHLQ $13,R12,R13 + ANDQ DX,R12 + ADDQ R11,R12 + SHLQ $13,R14,R15 + ANDQ DX,R14 + ADDQ R13,R14 + IMUL3Q $19,R15,CX + ADDQ CX,SI + MOVQ SI,CX + SHRQ $51,CX + ADDQ R8,CX + MOVQ CX,R8 + SHRQ $51,CX + ANDQ DX,SI + ADDQ R10,CX + MOVQ CX,R9 + SHRQ $51,CX + ANDQ DX,R8 + ADDQ R12,CX + MOVQ CX,AX + SHRQ $51,CX + ANDQ DX,R9 + ADDQ R14,CX + MOVQ CX,R10 + SHRQ $51,CX + ANDQ DX,AX + IMUL3Q $19,CX,CX + ADDQ CX,SI + ANDQ DX,R10 + MOVQ SI,40(SP) + MOVQ R8,48(SP) + MOVQ R9,56(SP) + MOVQ AX,64(SP) + MOVQ R10,72(SP) + MOVQ 264(SP),SI + IMUL3Q $19,SI,AX + MOVQ AX,200(SP) + MULQ 16(SP) + MOVQ AX,SI + MOVQ DX,CX + MOVQ 272(SP),DX + IMUL3Q $19,DX,AX + MOVQ AX,208(SP) + MULQ 8(SP) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 240(SP),AX + MULQ 0(SP) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 240(SP),AX + MULQ 8(SP) + MOVQ AX,R8 + MOVQ DX,R9 + MOVQ 240(SP),AX + MULQ 16(SP) + MOVQ AX,R10 + MOVQ DX,R11 + MOVQ 240(SP),AX + MULQ 24(SP) + MOVQ AX,R12 + MOVQ DX,R13 + MOVQ 240(SP),AX + MULQ 32(SP) + MOVQ AX,R14 + MOVQ DX,R15 + MOVQ 248(SP),AX + MULQ 0(SP) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 248(SP),AX + MULQ 8(SP) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 248(SP),AX + MULQ 16(SP) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ 248(SP),AX + MULQ 24(SP) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 248(SP),DX + IMUL3Q $19,DX,AX + MULQ 32(SP) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 256(SP),AX + MULQ 0(SP) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 256(SP),AX + MULQ 8(SP) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ 256(SP),AX + MULQ 16(SP) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 256(SP),DX + IMUL3Q $19,DX,AX + MULQ 24(SP) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 256(SP),DX + IMUL3Q $19,DX,AX + MULQ 32(SP) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 264(SP),AX + MULQ 0(SP) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ 264(SP),AX + MULQ 8(SP) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 200(SP),AX + MULQ 24(SP) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 200(SP),AX + MULQ 32(SP) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 272(SP),AX + MULQ 0(SP) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 208(SP),AX + MULQ 16(SP) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 208(SP),AX + MULQ 24(SP) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 208(SP),AX + MULQ 32(SP) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ $REDMASK51,DX + SHLQ $13,SI,CX + ANDQ DX,SI + SHLQ $13,R8,R9 + ANDQ DX,R8 + ADDQ CX,R8 + SHLQ $13,R10,R11 + ANDQ DX,R10 + ADDQ R9,R10 + SHLQ $13,R12,R13 + ANDQ DX,R12 + ADDQ R11,R12 + SHLQ $13,R14,R15 + ANDQ DX,R14 + ADDQ R13,R14 + IMUL3Q $19,R15,CX + ADDQ CX,SI + MOVQ SI,CX + SHRQ $51,CX + ADDQ R8,CX + MOVQ CX,R8 + SHRQ $51,CX + ANDQ DX,SI + ADDQ R10,CX + MOVQ CX,R9 + SHRQ $51,CX + ANDQ DX,R8 + ADDQ R12,CX + MOVQ CX,AX + SHRQ $51,CX + ANDQ DX,R9 + ADDQ R14,CX + MOVQ CX,R10 + SHRQ $51,CX + ANDQ DX,AX + IMUL3Q $19,CX,CX + ADDQ CX,SI + ANDQ DX,R10 + MOVQ SI,DX + MOVQ R8,CX + MOVQ R9,R11 + MOVQ AX,R12 + MOVQ R10,R13 + ADDQ ·_2P0(SB),DX + ADDQ ·_2P1234(SB),CX + ADDQ ·_2P1234(SB),R11 + ADDQ ·_2P1234(SB),R12 + ADDQ ·_2P1234(SB),R13 + ADDQ 40(SP),SI + ADDQ 48(SP),R8 + ADDQ 56(SP),R9 + ADDQ 64(SP),AX + ADDQ 72(SP),R10 + SUBQ 40(SP),DX + SUBQ 48(SP),CX + SUBQ 56(SP),R11 + SUBQ 64(SP),R12 + SUBQ 72(SP),R13 + MOVQ SI,120(DI) + MOVQ R8,128(DI) + MOVQ R9,136(DI) + MOVQ AX,144(DI) + MOVQ R10,152(DI) + MOVQ DX,160(DI) + MOVQ CX,168(DI) + MOVQ R11,176(DI) + MOVQ R12,184(DI) + MOVQ R13,192(DI) + MOVQ 120(DI),AX + MULQ 120(DI) + MOVQ AX,SI + MOVQ DX,CX + MOVQ 120(DI),AX + SHLQ $1,AX + MULQ 128(DI) + MOVQ AX,R8 + MOVQ DX,R9 + MOVQ 120(DI),AX + SHLQ $1,AX + MULQ 136(DI) + MOVQ AX,R10 + MOVQ DX,R11 + MOVQ 120(DI),AX + SHLQ $1,AX + MULQ 144(DI) + MOVQ AX,R12 + MOVQ DX,R13 + MOVQ 120(DI),AX + SHLQ $1,AX + MULQ 152(DI) + MOVQ AX,R14 + MOVQ DX,R15 + MOVQ 128(DI),AX + MULQ 128(DI) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 128(DI),AX + SHLQ $1,AX + MULQ 136(DI) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ 128(DI),AX + SHLQ $1,AX + MULQ 144(DI) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 128(DI),DX + IMUL3Q $38,DX,AX + MULQ 152(DI) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 136(DI),AX + MULQ 136(DI) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 136(DI),DX + IMUL3Q $38,DX,AX + MULQ 144(DI) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 136(DI),DX + IMUL3Q $38,DX,AX + MULQ 152(DI) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 144(DI),DX + IMUL3Q $19,DX,AX + MULQ 144(DI) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 144(DI),DX + IMUL3Q $38,DX,AX + MULQ 152(DI) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 152(DI),DX + IMUL3Q $19,DX,AX + MULQ 152(DI) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ $REDMASK51,DX + SHLQ $13,SI,CX + ANDQ DX,SI + SHLQ $13,R8,R9 + ANDQ DX,R8 + ADDQ CX,R8 + SHLQ $13,R10,R11 + ANDQ DX,R10 + ADDQ R9,R10 + SHLQ $13,R12,R13 + ANDQ DX,R12 + ADDQ R11,R12 + SHLQ $13,R14,R15 + ANDQ DX,R14 + ADDQ R13,R14 + IMUL3Q $19,R15,CX + ADDQ CX,SI + MOVQ SI,CX + SHRQ $51,CX + ADDQ R8,CX + ANDQ DX,SI + MOVQ CX,R8 + SHRQ $51,CX + ADDQ R10,CX + ANDQ DX,R8 + MOVQ CX,R9 + SHRQ $51,CX + ADDQ R12,CX + ANDQ DX,R9 + MOVQ CX,AX + SHRQ $51,CX + ADDQ R14,CX + ANDQ DX,AX + MOVQ CX,R10 + SHRQ $51,CX + IMUL3Q $19,CX,CX + ADDQ CX,SI + ANDQ DX,R10 + MOVQ SI,120(DI) + MOVQ R8,128(DI) + MOVQ R9,136(DI) + MOVQ AX,144(DI) + MOVQ R10,152(DI) + MOVQ 160(DI),AX + MULQ 160(DI) + MOVQ AX,SI + MOVQ DX,CX + MOVQ 160(DI),AX + SHLQ $1,AX + MULQ 168(DI) + MOVQ AX,R8 + MOVQ DX,R9 + MOVQ 160(DI),AX + SHLQ $1,AX + MULQ 176(DI) + MOVQ AX,R10 + MOVQ DX,R11 + MOVQ 160(DI),AX + SHLQ $1,AX + MULQ 184(DI) + MOVQ AX,R12 + MOVQ DX,R13 + MOVQ 160(DI),AX + SHLQ $1,AX + MULQ 192(DI) + MOVQ AX,R14 + MOVQ DX,R15 + MOVQ 168(DI),AX + MULQ 168(DI) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 168(DI),AX + SHLQ $1,AX + MULQ 176(DI) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ 168(DI),AX + SHLQ $1,AX + MULQ 184(DI) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 168(DI),DX + IMUL3Q $38,DX,AX + MULQ 192(DI) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 176(DI),AX + MULQ 176(DI) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 176(DI),DX + IMUL3Q $38,DX,AX + MULQ 184(DI) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 176(DI),DX + IMUL3Q $38,DX,AX + MULQ 192(DI) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 184(DI),DX + IMUL3Q $19,DX,AX + MULQ 184(DI) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 184(DI),DX + IMUL3Q $38,DX,AX + MULQ 192(DI) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 192(DI),DX + IMUL3Q $19,DX,AX + MULQ 192(DI) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ $REDMASK51,DX + SHLQ $13,SI,CX + ANDQ DX,SI + SHLQ $13,R8,R9 + ANDQ DX,R8 + ADDQ CX,R8 + SHLQ $13,R10,R11 + ANDQ DX,R10 + ADDQ R9,R10 + SHLQ $13,R12,R13 + ANDQ DX,R12 + ADDQ R11,R12 + SHLQ $13,R14,R15 + ANDQ DX,R14 + ADDQ R13,R14 + IMUL3Q $19,R15,CX + ADDQ CX,SI + MOVQ SI,CX + SHRQ $51,CX + ADDQ R8,CX + ANDQ DX,SI + MOVQ CX,R8 + SHRQ $51,CX + ADDQ R10,CX + ANDQ DX,R8 + MOVQ CX,R9 + SHRQ $51,CX + ADDQ R12,CX + ANDQ DX,R9 + MOVQ CX,AX + SHRQ $51,CX + ADDQ R14,CX + ANDQ DX,AX + MOVQ CX,R10 + SHRQ $51,CX + IMUL3Q $19,CX,CX + ADDQ CX,SI + ANDQ DX,R10 + MOVQ SI,160(DI) + MOVQ R8,168(DI) + MOVQ R9,176(DI) + MOVQ AX,184(DI) + MOVQ R10,192(DI) + MOVQ 184(DI),SI + IMUL3Q $19,SI,AX + MOVQ AX,0(SP) + MULQ 16(DI) + MOVQ AX,SI + MOVQ DX,CX + MOVQ 192(DI),DX + IMUL3Q $19,DX,AX + MOVQ AX,8(SP) + MULQ 8(DI) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 160(DI),AX + MULQ 0(DI) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 160(DI),AX + MULQ 8(DI) + MOVQ AX,R8 + MOVQ DX,R9 + MOVQ 160(DI),AX + MULQ 16(DI) + MOVQ AX,R10 + MOVQ DX,R11 + MOVQ 160(DI),AX + MULQ 24(DI) + MOVQ AX,R12 + MOVQ DX,R13 + MOVQ 160(DI),AX + MULQ 32(DI) + MOVQ AX,R14 + MOVQ DX,R15 + MOVQ 168(DI),AX + MULQ 0(DI) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 168(DI),AX + MULQ 8(DI) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 168(DI),AX + MULQ 16(DI) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ 168(DI),AX + MULQ 24(DI) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 168(DI),DX + IMUL3Q $19,DX,AX + MULQ 32(DI) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 176(DI),AX + MULQ 0(DI) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 176(DI),AX + MULQ 8(DI) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ 176(DI),AX + MULQ 16(DI) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 176(DI),DX + IMUL3Q $19,DX,AX + MULQ 24(DI) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 176(DI),DX + IMUL3Q $19,DX,AX + MULQ 32(DI) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 184(DI),AX + MULQ 0(DI) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ 184(DI),AX + MULQ 8(DI) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 0(SP),AX + MULQ 24(DI) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 0(SP),AX + MULQ 32(DI) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 192(DI),AX + MULQ 0(DI) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 8(SP),AX + MULQ 16(DI) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 8(SP),AX + MULQ 24(DI) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 8(SP),AX + MULQ 32(DI) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ $REDMASK51,DX + SHLQ $13,SI,CX + ANDQ DX,SI + SHLQ $13,R8,R9 + ANDQ DX,R8 + ADDQ CX,R8 + SHLQ $13,R10,R11 + ANDQ DX,R10 + ADDQ R9,R10 + SHLQ $13,R12,R13 + ANDQ DX,R12 + ADDQ R11,R12 + SHLQ $13,R14,R15 + ANDQ DX,R14 + ADDQ R13,R14 + IMUL3Q $19,R15,CX + ADDQ CX,SI + MOVQ SI,CX + SHRQ $51,CX + ADDQ R8,CX + MOVQ CX,R8 + SHRQ $51,CX + ANDQ DX,SI + ADDQ R10,CX + MOVQ CX,R9 + SHRQ $51,CX + ANDQ DX,R8 + ADDQ R12,CX + MOVQ CX,AX + SHRQ $51,CX + ANDQ DX,R9 + ADDQ R14,CX + MOVQ CX,R10 + SHRQ $51,CX + ANDQ DX,AX + IMUL3Q $19,CX,CX + ADDQ CX,SI + ANDQ DX,R10 + MOVQ SI,160(DI) + MOVQ R8,168(DI) + MOVQ R9,176(DI) + MOVQ AX,184(DI) + MOVQ R10,192(DI) + MOVQ 144(SP),SI + IMUL3Q $19,SI,AX + MOVQ AX,0(SP) + MULQ 96(SP) + MOVQ AX,SI + MOVQ DX,CX + MOVQ 152(SP),DX + IMUL3Q $19,DX,AX + MOVQ AX,8(SP) + MULQ 88(SP) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 120(SP),AX + MULQ 80(SP) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 120(SP),AX + MULQ 88(SP) + MOVQ AX,R8 + MOVQ DX,R9 + MOVQ 120(SP),AX + MULQ 96(SP) + MOVQ AX,R10 + MOVQ DX,R11 + MOVQ 120(SP),AX + MULQ 104(SP) + MOVQ AX,R12 + MOVQ DX,R13 + MOVQ 120(SP),AX + MULQ 112(SP) + MOVQ AX,R14 + MOVQ DX,R15 + MOVQ 128(SP),AX + MULQ 80(SP) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 128(SP),AX + MULQ 88(SP) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 128(SP),AX + MULQ 96(SP) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ 128(SP),AX + MULQ 104(SP) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 128(SP),DX + IMUL3Q $19,DX,AX + MULQ 112(SP) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 136(SP),AX + MULQ 80(SP) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 136(SP),AX + MULQ 88(SP) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ 136(SP),AX + MULQ 96(SP) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 136(SP),DX + IMUL3Q $19,DX,AX + MULQ 104(SP) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 136(SP),DX + IMUL3Q $19,DX,AX + MULQ 112(SP) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 144(SP),AX + MULQ 80(SP) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ 144(SP),AX + MULQ 88(SP) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 0(SP),AX + MULQ 104(SP) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 0(SP),AX + MULQ 112(SP) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 152(SP),AX + MULQ 80(SP) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 8(SP),AX + MULQ 96(SP) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 8(SP),AX + MULQ 104(SP) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 8(SP),AX + MULQ 112(SP) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ $REDMASK51,DX + SHLQ $13,SI,CX + ANDQ DX,SI + SHLQ $13,R8,R9 + ANDQ DX,R8 + ADDQ CX,R8 + SHLQ $13,R10,R11 + ANDQ DX,R10 + ADDQ R9,R10 + SHLQ $13,R12,R13 + ANDQ DX,R12 + ADDQ R11,R12 + SHLQ $13,R14,R15 + ANDQ DX,R14 + ADDQ R13,R14 + IMUL3Q $19,R15,CX + ADDQ CX,SI + MOVQ SI,CX + SHRQ $51,CX + ADDQ R8,CX + MOVQ CX,R8 + SHRQ $51,CX + ANDQ DX,SI + ADDQ R10,CX + MOVQ CX,R9 + SHRQ $51,CX + ANDQ DX,R8 + ADDQ R12,CX + MOVQ CX,AX + SHRQ $51,CX + ANDQ DX,R9 + ADDQ R14,CX + MOVQ CX,R10 + SHRQ $51,CX + ANDQ DX,AX + IMUL3Q $19,CX,CX + ADDQ CX,SI + ANDQ DX,R10 + MOVQ SI,40(DI) + MOVQ R8,48(DI) + MOVQ R9,56(DI) + MOVQ AX,64(DI) + MOVQ R10,72(DI) + MOVQ 160(SP),AX + MULQ ·_121666_213(SB) + SHRQ $13,AX + MOVQ AX,SI + MOVQ DX,CX + MOVQ 168(SP),AX + MULQ ·_121666_213(SB) + SHRQ $13,AX + ADDQ AX,CX + MOVQ DX,R8 + MOVQ 176(SP),AX + MULQ ·_121666_213(SB) + SHRQ $13,AX + ADDQ AX,R8 + MOVQ DX,R9 + MOVQ 184(SP),AX + MULQ ·_121666_213(SB) + SHRQ $13,AX + ADDQ AX,R9 + MOVQ DX,R10 + MOVQ 192(SP),AX + MULQ ·_121666_213(SB) + SHRQ $13,AX + ADDQ AX,R10 + IMUL3Q $19,DX,DX + ADDQ DX,SI + ADDQ 80(SP),SI + ADDQ 88(SP),CX + ADDQ 96(SP),R8 + ADDQ 104(SP),R9 + ADDQ 112(SP),R10 + MOVQ SI,80(DI) + MOVQ CX,88(DI) + MOVQ R8,96(DI) + MOVQ R9,104(DI) + MOVQ R10,112(DI) + MOVQ 104(DI),SI + IMUL3Q $19,SI,AX + MOVQ AX,0(SP) + MULQ 176(SP) + MOVQ AX,SI + MOVQ DX,CX + MOVQ 112(DI),DX + IMUL3Q $19,DX,AX + MOVQ AX,8(SP) + MULQ 168(SP) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 80(DI),AX + MULQ 160(SP) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 80(DI),AX + MULQ 168(SP) + MOVQ AX,R8 + MOVQ DX,R9 + MOVQ 80(DI),AX + MULQ 176(SP) + MOVQ AX,R10 + MOVQ DX,R11 + MOVQ 80(DI),AX + MULQ 184(SP) + MOVQ AX,R12 + MOVQ DX,R13 + MOVQ 80(DI),AX + MULQ 192(SP) + MOVQ AX,R14 + MOVQ DX,R15 + MOVQ 88(DI),AX + MULQ 160(SP) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 88(DI),AX + MULQ 168(SP) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 88(DI),AX + MULQ 176(SP) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ 88(DI),AX + MULQ 184(SP) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 88(DI),DX + IMUL3Q $19,DX,AX + MULQ 192(SP) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 96(DI),AX + MULQ 160(SP) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 96(DI),AX + MULQ 168(SP) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ 96(DI),AX + MULQ 176(SP) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 96(DI),DX + IMUL3Q $19,DX,AX + MULQ 184(SP) + ADDQ AX,SI + ADCQ DX,CX + MOVQ 96(DI),DX + IMUL3Q $19,DX,AX + MULQ 192(SP) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 104(DI),AX + MULQ 160(SP) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ 104(DI),AX + MULQ 168(SP) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 0(SP),AX + MULQ 184(SP) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 0(SP),AX + MULQ 192(SP) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 112(DI),AX + MULQ 160(SP) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 8(SP),AX + MULQ 176(SP) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 8(SP),AX + MULQ 184(SP) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 8(SP),AX + MULQ 192(SP) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ $REDMASK51,DX + SHLQ $13,SI,CX + ANDQ DX,SI + SHLQ $13,R8,R9 + ANDQ DX,R8 + ADDQ CX,R8 + SHLQ $13,R10,R11 + ANDQ DX,R10 + ADDQ R9,R10 + SHLQ $13,R12,R13 + ANDQ DX,R12 + ADDQ R11,R12 + SHLQ $13,R14,R15 + ANDQ DX,R14 + ADDQ R13,R14 + IMUL3Q $19,R15,CX + ADDQ CX,SI + MOVQ SI,CX + SHRQ $51,CX + ADDQ R8,CX + MOVQ CX,R8 + SHRQ $51,CX + ANDQ DX,SI + ADDQ R10,CX + MOVQ CX,R9 + SHRQ $51,CX + ANDQ DX,R8 + ADDQ R12,CX + MOVQ CX,AX + SHRQ $51,CX + ANDQ DX,R9 + ADDQ R14,CX + MOVQ CX,R10 + SHRQ $51,CX + ANDQ DX,AX + IMUL3Q $19,CX,CX + ADDQ CX,SI + ANDQ DX,R10 + MOVQ SI,80(DI) + MOVQ R8,88(DI) + MOVQ R9,96(DI) + MOVQ AX,104(DI) + MOVQ R10,112(DI) + RET + +// func cswap(inout *[4][5]uint64, v uint64) +TEXT ·cswap(SB),7,$0 + MOVQ inout+0(FP),DI + MOVQ v+8(FP),SI + + SUBQ $1, SI + NOTQ SI + MOVQ SI, X15 + PSHUFD $0x44, X15, X15 + + MOVOU 0(DI), X0 + MOVOU 16(DI), X2 + MOVOU 32(DI), X4 + MOVOU 48(DI), X6 + MOVOU 64(DI), X8 + MOVOU 80(DI), X1 + MOVOU 96(DI), X3 + MOVOU 112(DI), X5 + MOVOU 128(DI), X7 + MOVOU 144(DI), X9 + + MOVO X1, X10 + MOVO X3, X11 + MOVO X5, X12 + MOVO X7, X13 + MOVO X9, X14 + + PXOR X0, X10 + PXOR X2, X11 + PXOR X4, X12 + PXOR X6, X13 + PXOR X8, X14 + PAND X15, X10 + PAND X15, X11 + PAND X15, X12 + PAND X15, X13 + PAND X15, X14 + PXOR X10, X0 + PXOR X10, X1 + PXOR X11, X2 + PXOR X11, X3 + PXOR X12, X4 + PXOR X12, X5 + PXOR X13, X6 + PXOR X13, X7 + PXOR X14, X8 + PXOR X14, X9 + + MOVOU X0, 0(DI) + MOVOU X2, 16(DI) + MOVOU X4, 32(DI) + MOVOU X6, 48(DI) + MOVOU X8, 64(DI) + MOVOU X1, 80(DI) + MOVOU X3, 96(DI) + MOVOU X5, 112(DI) + MOVOU X7, 128(DI) + MOVOU X9, 144(DI) + RET + +// func mul(dest, a, b *[5]uint64) +TEXT ·mul(SB),0,$16-24 + MOVQ dest+0(FP), DI + MOVQ a+8(FP), SI + MOVQ b+16(FP), DX + + MOVQ DX,CX + MOVQ 24(SI),DX + IMUL3Q $19,DX,AX + MOVQ AX,0(SP) + MULQ 16(CX) + MOVQ AX,R8 + MOVQ DX,R9 + MOVQ 32(SI),DX + IMUL3Q $19,DX,AX + MOVQ AX,8(SP) + MULQ 8(CX) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 0(SI),AX + MULQ 0(CX) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 0(SI),AX + MULQ 8(CX) + MOVQ AX,R10 + MOVQ DX,R11 + MOVQ 0(SI),AX + MULQ 16(CX) + MOVQ AX,R12 + MOVQ DX,R13 + MOVQ 0(SI),AX + MULQ 24(CX) + MOVQ AX,R14 + MOVQ DX,R15 + MOVQ 0(SI),AX + MULQ 32(CX) + MOVQ AX,BX + MOVQ DX,BP + MOVQ 8(SI),AX + MULQ 0(CX) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 8(SI),AX + MULQ 8(CX) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ 8(SI),AX + MULQ 16(CX) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 8(SI),AX + MULQ 24(CX) + ADDQ AX,BX + ADCQ DX,BP + MOVQ 8(SI),DX + IMUL3Q $19,DX,AX + MULQ 32(CX) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 16(SI),AX + MULQ 0(CX) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ 16(SI),AX + MULQ 8(CX) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 16(SI),AX + MULQ 16(CX) + ADDQ AX,BX + ADCQ DX,BP + MOVQ 16(SI),DX + IMUL3Q $19,DX,AX + MULQ 24(CX) + ADDQ AX,R8 + ADCQ DX,R9 + MOVQ 16(SI),DX + IMUL3Q $19,DX,AX + MULQ 32(CX) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 24(SI),AX + MULQ 0(CX) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ 24(SI),AX + MULQ 8(CX) + ADDQ AX,BX + ADCQ DX,BP + MOVQ 0(SP),AX + MULQ 24(CX) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 0(SP),AX + MULQ 32(CX) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ 32(SI),AX + MULQ 0(CX) + ADDQ AX,BX + ADCQ DX,BP + MOVQ 8(SP),AX + MULQ 16(CX) + ADDQ AX,R10 + ADCQ DX,R11 + MOVQ 8(SP),AX + MULQ 24(CX) + ADDQ AX,R12 + ADCQ DX,R13 + MOVQ 8(SP),AX + MULQ 32(CX) + ADDQ AX,R14 + ADCQ DX,R15 + MOVQ $REDMASK51,SI + SHLQ $13,R8,R9 + ANDQ SI,R8 + SHLQ $13,R10,R11 + ANDQ SI,R10 + ADDQ R9,R10 + SHLQ $13,R12,R13 + ANDQ SI,R12 + ADDQ R11,R12 + SHLQ $13,R14,R15 + ANDQ SI,R14 + ADDQ R13,R14 + SHLQ $13,BX,BP + ANDQ SI,BX + ADDQ R15,BX + IMUL3Q $19,BP,DX + ADDQ DX,R8 + MOVQ R8,DX + SHRQ $51,DX + ADDQ R10,DX + MOVQ DX,CX + SHRQ $51,DX + ANDQ SI,R8 + ADDQ R12,DX + MOVQ DX,R9 + SHRQ $51,DX + ANDQ SI,CX + ADDQ R14,DX + MOVQ DX,AX + SHRQ $51,DX + ANDQ SI,R9 + ADDQ BX,DX + MOVQ DX,R10 + SHRQ $51,DX + ANDQ SI,AX + IMUL3Q $19,DX,DX + ADDQ DX,R8 + ANDQ SI,R10 + MOVQ R8,0(DI) + MOVQ CX,8(DI) + MOVQ R9,16(DI) + MOVQ AX,24(DI) + MOVQ R10,32(DI) + RET + +// func square(out, in *[5]uint64) +TEXT ·square(SB),7,$0-16 + MOVQ out+0(FP), DI + MOVQ in+8(FP), SI + + MOVQ 0(SI),AX + MULQ 0(SI) + MOVQ AX,CX + MOVQ DX,R8 + MOVQ 0(SI),AX + SHLQ $1,AX + MULQ 8(SI) + MOVQ AX,R9 + MOVQ DX,R10 + MOVQ 0(SI),AX + SHLQ $1,AX + MULQ 16(SI) + MOVQ AX,R11 + MOVQ DX,R12 + MOVQ 0(SI),AX + SHLQ $1,AX + MULQ 24(SI) + MOVQ AX,R13 + MOVQ DX,R14 + MOVQ 0(SI),AX + SHLQ $1,AX + MULQ 32(SI) + MOVQ AX,R15 + MOVQ DX,BX + MOVQ 8(SI),AX + MULQ 8(SI) + ADDQ AX,R11 + ADCQ DX,R12 + MOVQ 8(SI),AX + SHLQ $1,AX + MULQ 16(SI) + ADDQ AX,R13 + ADCQ DX,R14 + MOVQ 8(SI),AX + SHLQ $1,AX + MULQ 24(SI) + ADDQ AX,R15 + ADCQ DX,BX + MOVQ 8(SI),DX + IMUL3Q $38,DX,AX + MULQ 32(SI) + ADDQ AX,CX + ADCQ DX,R8 + MOVQ 16(SI),AX + MULQ 16(SI) + ADDQ AX,R15 + ADCQ DX,BX + MOVQ 16(SI),DX + IMUL3Q $38,DX,AX + MULQ 24(SI) + ADDQ AX,CX + ADCQ DX,R8 + MOVQ 16(SI),DX + IMUL3Q $38,DX,AX + MULQ 32(SI) + ADDQ AX,R9 + ADCQ DX,R10 + MOVQ 24(SI),DX + IMUL3Q $19,DX,AX + MULQ 24(SI) + ADDQ AX,R9 + ADCQ DX,R10 + MOVQ 24(SI),DX + IMUL3Q $38,DX,AX + MULQ 32(SI) + ADDQ AX,R11 + ADCQ DX,R12 + MOVQ 32(SI),DX + IMUL3Q $19,DX,AX + MULQ 32(SI) + ADDQ AX,R13 + ADCQ DX,R14 + MOVQ $REDMASK51,SI + SHLQ $13,CX,R8 + ANDQ SI,CX + SHLQ $13,R9,R10 + ANDQ SI,R9 + ADDQ R8,R9 + SHLQ $13,R11,R12 + ANDQ SI,R11 + ADDQ R10,R11 + SHLQ $13,R13,R14 + ANDQ SI,R13 + ADDQ R12,R13 + SHLQ $13,R15,BX + ANDQ SI,R15 + ADDQ R14,R15 + IMUL3Q $19,BX,DX + ADDQ DX,CX + MOVQ CX,DX + SHRQ $51,DX + ADDQ R9,DX + ANDQ SI,CX + MOVQ DX,R8 + SHRQ $51,DX + ADDQ R11,DX + ANDQ SI,R8 + MOVQ DX,R9 + SHRQ $51,DX + ADDQ R13,DX + ANDQ SI,R9 + MOVQ DX,AX + SHRQ $51,DX + ADDQ R15,DX + ANDQ SI,AX + MOVQ DX,R10 + SHRQ $51,DX + IMUL3Q $19,DX,DX + ADDQ DX,CX + ANDQ SI,R10 + MOVQ CX,0(DI) + MOVQ R8,8(DI) + MOVQ R9,16(DI) + MOVQ AX,24(DI) + MOVQ R10,32(DI) + RET diff --git a/vendor/golang.org/x/crypto/curve25519/curve25519_generic.go b/vendor/golang.org/x/crypto/curve25519/curve25519_generic.go new file mode 100644 index 000000000..c43b13fc8 --- /dev/null +++ b/vendor/golang.org/x/crypto/curve25519/curve25519_generic.go @@ -0,0 +1,828 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package curve25519 + +import "encoding/binary" + +// This code is a port of the public domain, "ref10" implementation of +// curve25519 from SUPERCOP 20130419 by D. J. Bernstein. + +// fieldElement represents an element of the field GF(2^255 - 19). An element +// t, entries t[0]...t[9], represents the integer t[0]+2^26 t[1]+2^51 t[2]+2^77 +// t[3]+2^102 t[4]+...+2^230 t[9]. Bounds on each t[i] vary depending on +// context. +type fieldElement [10]int32 + +func feZero(fe *fieldElement) { + for i := range fe { + fe[i] = 0 + } +} + +func feOne(fe *fieldElement) { + feZero(fe) + fe[0] = 1 +} + +func feAdd(dst, a, b *fieldElement) { + for i := range dst { + dst[i] = a[i] + b[i] + } +} + +func feSub(dst, a, b *fieldElement) { + for i := range dst { + dst[i] = a[i] - b[i] + } +} + +func feCopy(dst, src *fieldElement) { + for i := range dst { + dst[i] = src[i] + } +} + +// feCSwap replaces (f,g) with (g,f) if b == 1; replaces (f,g) with (f,g) if b == 0. +// +// Preconditions: b in {0,1}. +func feCSwap(f, g *fieldElement, b int32) { + b = -b + for i := range f { + t := b & (f[i] ^ g[i]) + f[i] ^= t + g[i] ^= t + } +} + +// load3 reads a 24-bit, little-endian value from in. +func load3(in []byte) int64 { + var r int64 + r = int64(in[0]) + r |= int64(in[1]) << 8 + r |= int64(in[2]) << 16 + return r +} + +// load4 reads a 32-bit, little-endian value from in. +func load4(in []byte) int64 { + return int64(binary.LittleEndian.Uint32(in)) +} + +func feFromBytes(dst *fieldElement, src *[32]byte) { + h0 := load4(src[:]) + h1 := load3(src[4:]) << 6 + h2 := load3(src[7:]) << 5 + h3 := load3(src[10:]) << 3 + h4 := load3(src[13:]) << 2 + h5 := load4(src[16:]) + h6 := load3(src[20:]) << 7 + h7 := load3(src[23:]) << 5 + h8 := load3(src[26:]) << 4 + h9 := (load3(src[29:]) & 0x7fffff) << 2 + + var carry [10]int64 + carry[9] = (h9 + 1<<24) >> 25 + h0 += carry[9] * 19 + h9 -= carry[9] << 25 + carry[1] = (h1 + 1<<24) >> 25 + h2 += carry[1] + h1 -= carry[1] << 25 + carry[3] = (h3 + 1<<24) >> 25 + h4 += carry[3] + h3 -= carry[3] << 25 + carry[5] = (h5 + 1<<24) >> 25 + h6 += carry[5] + h5 -= carry[5] << 25 + carry[7] = (h7 + 1<<24) >> 25 + h8 += carry[7] + h7 -= carry[7] << 25 + + carry[0] = (h0 + 1<<25) >> 26 + h1 += carry[0] + h0 -= carry[0] << 26 + carry[2] = (h2 + 1<<25) >> 26 + h3 += carry[2] + h2 -= carry[2] << 26 + carry[4] = (h4 + 1<<25) >> 26 + h5 += carry[4] + h4 -= carry[4] << 26 + carry[6] = (h6 + 1<<25) >> 26 + h7 += carry[6] + h6 -= carry[6] << 26 + carry[8] = (h8 + 1<<25) >> 26 + h9 += carry[8] + h8 -= carry[8] << 26 + + dst[0] = int32(h0) + dst[1] = int32(h1) + dst[2] = int32(h2) + dst[3] = int32(h3) + dst[4] = int32(h4) + dst[5] = int32(h5) + dst[6] = int32(h6) + dst[7] = int32(h7) + dst[8] = int32(h8) + dst[9] = int32(h9) +} + +// feToBytes marshals h to s. +// Preconditions: +// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +// +// Write p=2^255-19; q=floor(h/p). +// Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))). +// +// Proof: +// Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4. +// Also have |h-2^230 h9|<2^230 so |19 2^(-255)(h-2^230 h9)|<1/4. +// +// Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9). +// Then 0> 25 + q = (h[0] + q) >> 26 + q = (h[1] + q) >> 25 + q = (h[2] + q) >> 26 + q = (h[3] + q) >> 25 + q = (h[4] + q) >> 26 + q = (h[5] + q) >> 25 + q = (h[6] + q) >> 26 + q = (h[7] + q) >> 25 + q = (h[8] + q) >> 26 + q = (h[9] + q) >> 25 + + // Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20. + h[0] += 19 * q + // Goal: Output h-2^255 q, which is between 0 and 2^255-20. + + carry[0] = h[0] >> 26 + h[1] += carry[0] + h[0] -= carry[0] << 26 + carry[1] = h[1] >> 25 + h[2] += carry[1] + h[1] -= carry[1] << 25 + carry[2] = h[2] >> 26 + h[3] += carry[2] + h[2] -= carry[2] << 26 + carry[3] = h[3] >> 25 + h[4] += carry[3] + h[3] -= carry[3] << 25 + carry[4] = h[4] >> 26 + h[5] += carry[4] + h[4] -= carry[4] << 26 + carry[5] = h[5] >> 25 + h[6] += carry[5] + h[5] -= carry[5] << 25 + carry[6] = h[6] >> 26 + h[7] += carry[6] + h[6] -= carry[6] << 26 + carry[7] = h[7] >> 25 + h[8] += carry[7] + h[7] -= carry[7] << 25 + carry[8] = h[8] >> 26 + h[9] += carry[8] + h[8] -= carry[8] << 26 + carry[9] = h[9] >> 25 + h[9] -= carry[9] << 25 + // h10 = carry9 + + // Goal: Output h[0]+...+2^255 h10-2^255 q, which is between 0 and 2^255-20. + // Have h[0]+...+2^230 h[9] between 0 and 2^255-1; + // evidently 2^255 h10-2^255 q = 0. + // Goal: Output h[0]+...+2^230 h[9]. + + s[0] = byte(h[0] >> 0) + s[1] = byte(h[0] >> 8) + s[2] = byte(h[0] >> 16) + s[3] = byte((h[0] >> 24) | (h[1] << 2)) + s[4] = byte(h[1] >> 6) + s[5] = byte(h[1] >> 14) + s[6] = byte((h[1] >> 22) | (h[2] << 3)) + s[7] = byte(h[2] >> 5) + s[8] = byte(h[2] >> 13) + s[9] = byte((h[2] >> 21) | (h[3] << 5)) + s[10] = byte(h[3] >> 3) + s[11] = byte(h[3] >> 11) + s[12] = byte((h[3] >> 19) | (h[4] << 6)) + s[13] = byte(h[4] >> 2) + s[14] = byte(h[4] >> 10) + s[15] = byte(h[4] >> 18) + s[16] = byte(h[5] >> 0) + s[17] = byte(h[5] >> 8) + s[18] = byte(h[5] >> 16) + s[19] = byte((h[5] >> 24) | (h[6] << 1)) + s[20] = byte(h[6] >> 7) + s[21] = byte(h[6] >> 15) + s[22] = byte((h[6] >> 23) | (h[7] << 3)) + s[23] = byte(h[7] >> 5) + s[24] = byte(h[7] >> 13) + s[25] = byte((h[7] >> 21) | (h[8] << 4)) + s[26] = byte(h[8] >> 4) + s[27] = byte(h[8] >> 12) + s[28] = byte((h[8] >> 20) | (h[9] << 6)) + s[29] = byte(h[9] >> 2) + s[30] = byte(h[9] >> 10) + s[31] = byte(h[9] >> 18) +} + +// feMul calculates h = f * g +// Can overlap h with f or g. +// +// Preconditions: +// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +// |g| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +// +// Postconditions: +// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +// +// Notes on implementation strategy: +// +// Using schoolbook multiplication. +// Karatsuba would save a little in some cost models. +// +// Most multiplications by 2 and 19 are 32-bit precomputations; +// cheaper than 64-bit postcomputations. +// +// There is one remaining multiplication by 19 in the carry chain; +// one *19 precomputation can be merged into this, +// but the resulting data flow is considerably less clean. +// +// There are 12 carries below. +// 10 of them are 2-way parallelizable and vectorizable. +// Can get away with 11 carries, but then data flow is much deeper. +// +// With tighter constraints on inputs can squeeze carries into int32. +func feMul(h, f, g *fieldElement) { + f0 := f[0] + f1 := f[1] + f2 := f[2] + f3 := f[3] + f4 := f[4] + f5 := f[5] + f6 := f[6] + f7 := f[7] + f8 := f[8] + f9 := f[9] + g0 := g[0] + g1 := g[1] + g2 := g[2] + g3 := g[3] + g4 := g[4] + g5 := g[5] + g6 := g[6] + g7 := g[7] + g8 := g[8] + g9 := g[9] + g1_19 := 19 * g1 // 1.4*2^29 + g2_19 := 19 * g2 // 1.4*2^30; still ok + g3_19 := 19 * g3 + g4_19 := 19 * g4 + g5_19 := 19 * g5 + g6_19 := 19 * g6 + g7_19 := 19 * g7 + g8_19 := 19 * g8 + g9_19 := 19 * g9 + f1_2 := 2 * f1 + f3_2 := 2 * f3 + f5_2 := 2 * f5 + f7_2 := 2 * f7 + f9_2 := 2 * f9 + f0g0 := int64(f0) * int64(g0) + f0g1 := int64(f0) * int64(g1) + f0g2 := int64(f0) * int64(g2) + f0g3 := int64(f0) * int64(g3) + f0g4 := int64(f0) * int64(g4) + f0g5 := int64(f0) * int64(g5) + f0g6 := int64(f0) * int64(g6) + f0g7 := int64(f0) * int64(g7) + f0g8 := int64(f0) * int64(g8) + f0g9 := int64(f0) * int64(g9) + f1g0 := int64(f1) * int64(g0) + f1g1_2 := int64(f1_2) * int64(g1) + f1g2 := int64(f1) * int64(g2) + f1g3_2 := int64(f1_2) * int64(g3) + f1g4 := int64(f1) * int64(g4) + f1g5_2 := int64(f1_2) * int64(g5) + f1g6 := int64(f1) * int64(g6) + f1g7_2 := int64(f1_2) * int64(g7) + f1g8 := int64(f1) * int64(g8) + f1g9_38 := int64(f1_2) * int64(g9_19) + f2g0 := int64(f2) * int64(g0) + f2g1 := int64(f2) * int64(g1) + f2g2 := int64(f2) * int64(g2) + f2g3 := int64(f2) * int64(g3) + f2g4 := int64(f2) * int64(g4) + f2g5 := int64(f2) * int64(g5) + f2g6 := int64(f2) * int64(g6) + f2g7 := int64(f2) * int64(g7) + f2g8_19 := int64(f2) * int64(g8_19) + f2g9_19 := int64(f2) * int64(g9_19) + f3g0 := int64(f3) * int64(g0) + f3g1_2 := int64(f3_2) * int64(g1) + f3g2 := int64(f3) * int64(g2) + f3g3_2 := int64(f3_2) * int64(g3) + f3g4 := int64(f3) * int64(g4) + f3g5_2 := int64(f3_2) * int64(g5) + f3g6 := int64(f3) * int64(g6) + f3g7_38 := int64(f3_2) * int64(g7_19) + f3g8_19 := int64(f3) * int64(g8_19) + f3g9_38 := int64(f3_2) * int64(g9_19) + f4g0 := int64(f4) * int64(g0) + f4g1 := int64(f4) * int64(g1) + f4g2 := int64(f4) * int64(g2) + f4g3 := int64(f4) * int64(g3) + f4g4 := int64(f4) * int64(g4) + f4g5 := int64(f4) * int64(g5) + f4g6_19 := int64(f4) * int64(g6_19) + f4g7_19 := int64(f4) * int64(g7_19) + f4g8_19 := int64(f4) * int64(g8_19) + f4g9_19 := int64(f4) * int64(g9_19) + f5g0 := int64(f5) * int64(g0) + f5g1_2 := int64(f5_2) * int64(g1) + f5g2 := int64(f5) * int64(g2) + f5g3_2 := int64(f5_2) * int64(g3) + f5g4 := int64(f5) * int64(g4) + f5g5_38 := int64(f5_2) * int64(g5_19) + f5g6_19 := int64(f5) * int64(g6_19) + f5g7_38 := int64(f5_2) * int64(g7_19) + f5g8_19 := int64(f5) * int64(g8_19) + f5g9_38 := int64(f5_2) * int64(g9_19) + f6g0 := int64(f6) * int64(g0) + f6g1 := int64(f6) * int64(g1) + f6g2 := int64(f6) * int64(g2) + f6g3 := int64(f6) * int64(g3) + f6g4_19 := int64(f6) * int64(g4_19) + f6g5_19 := int64(f6) * int64(g5_19) + f6g6_19 := int64(f6) * int64(g6_19) + f6g7_19 := int64(f6) * int64(g7_19) + f6g8_19 := int64(f6) * int64(g8_19) + f6g9_19 := int64(f6) * int64(g9_19) + f7g0 := int64(f7) * int64(g0) + f7g1_2 := int64(f7_2) * int64(g1) + f7g2 := int64(f7) * int64(g2) + f7g3_38 := int64(f7_2) * int64(g3_19) + f7g4_19 := int64(f7) * int64(g4_19) + f7g5_38 := int64(f7_2) * int64(g5_19) + f7g6_19 := int64(f7) * int64(g6_19) + f7g7_38 := int64(f7_2) * int64(g7_19) + f7g8_19 := int64(f7) * int64(g8_19) + f7g9_38 := int64(f7_2) * int64(g9_19) + f8g0 := int64(f8) * int64(g0) + f8g1 := int64(f8) * int64(g1) + f8g2_19 := int64(f8) * int64(g2_19) + f8g3_19 := int64(f8) * int64(g3_19) + f8g4_19 := int64(f8) * int64(g4_19) + f8g5_19 := int64(f8) * int64(g5_19) + f8g6_19 := int64(f8) * int64(g6_19) + f8g7_19 := int64(f8) * int64(g7_19) + f8g8_19 := int64(f8) * int64(g8_19) + f8g9_19 := int64(f8) * int64(g9_19) + f9g0 := int64(f9) * int64(g0) + f9g1_38 := int64(f9_2) * int64(g1_19) + f9g2_19 := int64(f9) * int64(g2_19) + f9g3_38 := int64(f9_2) * int64(g3_19) + f9g4_19 := int64(f9) * int64(g4_19) + f9g5_38 := int64(f9_2) * int64(g5_19) + f9g6_19 := int64(f9) * int64(g6_19) + f9g7_38 := int64(f9_2) * int64(g7_19) + f9g8_19 := int64(f9) * int64(g8_19) + f9g9_38 := int64(f9_2) * int64(g9_19) + h0 := f0g0 + f1g9_38 + f2g8_19 + f3g7_38 + f4g6_19 + f5g5_38 + f6g4_19 + f7g3_38 + f8g2_19 + f9g1_38 + h1 := f0g1 + f1g0 + f2g9_19 + f3g8_19 + f4g7_19 + f5g6_19 + f6g5_19 + f7g4_19 + f8g3_19 + f9g2_19 + h2 := f0g2 + f1g1_2 + f2g0 + f3g9_38 + f4g8_19 + f5g7_38 + f6g6_19 + f7g5_38 + f8g4_19 + f9g3_38 + h3 := f0g3 + f1g2 + f2g1 + f3g0 + f4g9_19 + f5g8_19 + f6g7_19 + f7g6_19 + f8g5_19 + f9g4_19 + h4 := f0g4 + f1g3_2 + f2g2 + f3g1_2 + f4g0 + f5g9_38 + f6g8_19 + f7g7_38 + f8g6_19 + f9g5_38 + h5 := f0g5 + f1g4 + f2g3 + f3g2 + f4g1 + f5g0 + f6g9_19 + f7g8_19 + f8g7_19 + f9g6_19 + h6 := f0g6 + f1g5_2 + f2g4 + f3g3_2 + f4g2 + f5g1_2 + f6g0 + f7g9_38 + f8g8_19 + f9g7_38 + h7 := f0g7 + f1g6 + f2g5 + f3g4 + f4g3 + f5g2 + f6g1 + f7g0 + f8g9_19 + f9g8_19 + h8 := f0g8 + f1g7_2 + f2g6 + f3g5_2 + f4g4 + f5g3_2 + f6g2 + f7g1_2 + f8g0 + f9g9_38 + h9 := f0g9 + f1g8 + f2g7 + f3g6 + f4g5 + f5g4 + f6g3 + f7g2 + f8g1 + f9g0 + var carry [10]int64 + + // |h0| <= (1.1*1.1*2^52*(1+19+19+19+19)+1.1*1.1*2^50*(38+38+38+38+38)) + // i.e. |h0| <= 1.2*2^59; narrower ranges for h2, h4, h6, h8 + // |h1| <= (1.1*1.1*2^51*(1+1+19+19+19+19+19+19+19+19)) + // i.e. |h1| <= 1.5*2^58; narrower ranges for h3, h5, h7, h9 + + carry[0] = (h0 + (1 << 25)) >> 26 + h1 += carry[0] + h0 -= carry[0] << 26 + carry[4] = (h4 + (1 << 25)) >> 26 + h5 += carry[4] + h4 -= carry[4] << 26 + // |h0| <= 2^25 + // |h4| <= 2^25 + // |h1| <= 1.51*2^58 + // |h5| <= 1.51*2^58 + + carry[1] = (h1 + (1 << 24)) >> 25 + h2 += carry[1] + h1 -= carry[1] << 25 + carry[5] = (h5 + (1 << 24)) >> 25 + h6 += carry[5] + h5 -= carry[5] << 25 + // |h1| <= 2^24; from now on fits into int32 + // |h5| <= 2^24; from now on fits into int32 + // |h2| <= 1.21*2^59 + // |h6| <= 1.21*2^59 + + carry[2] = (h2 + (1 << 25)) >> 26 + h3 += carry[2] + h2 -= carry[2] << 26 + carry[6] = (h6 + (1 << 25)) >> 26 + h7 += carry[6] + h6 -= carry[6] << 26 + // |h2| <= 2^25; from now on fits into int32 unchanged + // |h6| <= 2^25; from now on fits into int32 unchanged + // |h3| <= 1.51*2^58 + // |h7| <= 1.51*2^58 + + carry[3] = (h3 + (1 << 24)) >> 25 + h4 += carry[3] + h3 -= carry[3] << 25 + carry[7] = (h7 + (1 << 24)) >> 25 + h8 += carry[7] + h7 -= carry[7] << 25 + // |h3| <= 2^24; from now on fits into int32 unchanged + // |h7| <= 2^24; from now on fits into int32 unchanged + // |h4| <= 1.52*2^33 + // |h8| <= 1.52*2^33 + + carry[4] = (h4 + (1 << 25)) >> 26 + h5 += carry[4] + h4 -= carry[4] << 26 + carry[8] = (h8 + (1 << 25)) >> 26 + h9 += carry[8] + h8 -= carry[8] << 26 + // |h4| <= 2^25; from now on fits into int32 unchanged + // |h8| <= 2^25; from now on fits into int32 unchanged + // |h5| <= 1.01*2^24 + // |h9| <= 1.51*2^58 + + carry[9] = (h9 + (1 << 24)) >> 25 + h0 += carry[9] * 19 + h9 -= carry[9] << 25 + // |h9| <= 2^24; from now on fits into int32 unchanged + // |h0| <= 1.8*2^37 + + carry[0] = (h0 + (1 << 25)) >> 26 + h1 += carry[0] + h0 -= carry[0] << 26 + // |h0| <= 2^25; from now on fits into int32 unchanged + // |h1| <= 1.01*2^24 + + h[0] = int32(h0) + h[1] = int32(h1) + h[2] = int32(h2) + h[3] = int32(h3) + h[4] = int32(h4) + h[5] = int32(h5) + h[6] = int32(h6) + h[7] = int32(h7) + h[8] = int32(h8) + h[9] = int32(h9) +} + +// feSquare calculates h = f*f. Can overlap h with f. +// +// Preconditions: +// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +// +// Postconditions: +// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +func feSquare(h, f *fieldElement) { + f0 := f[0] + f1 := f[1] + f2 := f[2] + f3 := f[3] + f4 := f[4] + f5 := f[5] + f6 := f[6] + f7 := f[7] + f8 := f[8] + f9 := f[9] + f0_2 := 2 * f0 + f1_2 := 2 * f1 + f2_2 := 2 * f2 + f3_2 := 2 * f3 + f4_2 := 2 * f4 + f5_2 := 2 * f5 + f6_2 := 2 * f6 + f7_2 := 2 * f7 + f5_38 := 38 * f5 // 1.31*2^30 + f6_19 := 19 * f6 // 1.31*2^30 + f7_38 := 38 * f7 // 1.31*2^30 + f8_19 := 19 * f8 // 1.31*2^30 + f9_38 := 38 * f9 // 1.31*2^30 + f0f0 := int64(f0) * int64(f0) + f0f1_2 := int64(f0_2) * int64(f1) + f0f2_2 := int64(f0_2) * int64(f2) + f0f3_2 := int64(f0_2) * int64(f3) + f0f4_2 := int64(f0_2) * int64(f4) + f0f5_2 := int64(f0_2) * int64(f5) + f0f6_2 := int64(f0_2) * int64(f6) + f0f7_2 := int64(f0_2) * int64(f7) + f0f8_2 := int64(f0_2) * int64(f8) + f0f9_2 := int64(f0_2) * int64(f9) + f1f1_2 := int64(f1_2) * int64(f1) + f1f2_2 := int64(f1_2) * int64(f2) + f1f3_4 := int64(f1_2) * int64(f3_2) + f1f4_2 := int64(f1_2) * int64(f4) + f1f5_4 := int64(f1_2) * int64(f5_2) + f1f6_2 := int64(f1_2) * int64(f6) + f1f7_4 := int64(f1_2) * int64(f7_2) + f1f8_2 := int64(f1_2) * int64(f8) + f1f9_76 := int64(f1_2) * int64(f9_38) + f2f2 := int64(f2) * int64(f2) + f2f3_2 := int64(f2_2) * int64(f3) + f2f4_2 := int64(f2_2) * int64(f4) + f2f5_2 := int64(f2_2) * int64(f5) + f2f6_2 := int64(f2_2) * int64(f6) + f2f7_2 := int64(f2_2) * int64(f7) + f2f8_38 := int64(f2_2) * int64(f8_19) + f2f9_38 := int64(f2) * int64(f9_38) + f3f3_2 := int64(f3_2) * int64(f3) + f3f4_2 := int64(f3_2) * int64(f4) + f3f5_4 := int64(f3_2) * int64(f5_2) + f3f6_2 := int64(f3_2) * int64(f6) + f3f7_76 := int64(f3_2) * int64(f7_38) + f3f8_38 := int64(f3_2) * int64(f8_19) + f3f9_76 := int64(f3_2) * int64(f9_38) + f4f4 := int64(f4) * int64(f4) + f4f5_2 := int64(f4_2) * int64(f5) + f4f6_38 := int64(f4_2) * int64(f6_19) + f4f7_38 := int64(f4) * int64(f7_38) + f4f8_38 := int64(f4_2) * int64(f8_19) + f4f9_38 := int64(f4) * int64(f9_38) + f5f5_38 := int64(f5) * int64(f5_38) + f5f6_38 := int64(f5_2) * int64(f6_19) + f5f7_76 := int64(f5_2) * int64(f7_38) + f5f8_38 := int64(f5_2) * int64(f8_19) + f5f9_76 := int64(f5_2) * int64(f9_38) + f6f6_19 := int64(f6) * int64(f6_19) + f6f7_38 := int64(f6) * int64(f7_38) + f6f8_38 := int64(f6_2) * int64(f8_19) + f6f9_38 := int64(f6) * int64(f9_38) + f7f7_38 := int64(f7) * int64(f7_38) + f7f8_38 := int64(f7_2) * int64(f8_19) + f7f9_76 := int64(f7_2) * int64(f9_38) + f8f8_19 := int64(f8) * int64(f8_19) + f8f9_38 := int64(f8) * int64(f9_38) + f9f9_38 := int64(f9) * int64(f9_38) + h0 := f0f0 + f1f9_76 + f2f8_38 + f3f7_76 + f4f6_38 + f5f5_38 + h1 := f0f1_2 + f2f9_38 + f3f8_38 + f4f7_38 + f5f6_38 + h2 := f0f2_2 + f1f1_2 + f3f9_76 + f4f8_38 + f5f7_76 + f6f6_19 + h3 := f0f3_2 + f1f2_2 + f4f9_38 + f5f8_38 + f6f7_38 + h4 := f0f4_2 + f1f3_4 + f2f2 + f5f9_76 + f6f8_38 + f7f7_38 + h5 := f0f5_2 + f1f4_2 + f2f3_2 + f6f9_38 + f7f8_38 + h6 := f0f6_2 + f1f5_4 + f2f4_2 + f3f3_2 + f7f9_76 + f8f8_19 + h7 := f0f7_2 + f1f6_2 + f2f5_2 + f3f4_2 + f8f9_38 + h8 := f0f8_2 + f1f7_4 + f2f6_2 + f3f5_4 + f4f4 + f9f9_38 + h9 := f0f9_2 + f1f8_2 + f2f7_2 + f3f6_2 + f4f5_2 + var carry [10]int64 + + carry[0] = (h0 + (1 << 25)) >> 26 + h1 += carry[0] + h0 -= carry[0] << 26 + carry[4] = (h4 + (1 << 25)) >> 26 + h5 += carry[4] + h4 -= carry[4] << 26 + + carry[1] = (h1 + (1 << 24)) >> 25 + h2 += carry[1] + h1 -= carry[1] << 25 + carry[5] = (h5 + (1 << 24)) >> 25 + h6 += carry[5] + h5 -= carry[5] << 25 + + carry[2] = (h2 + (1 << 25)) >> 26 + h3 += carry[2] + h2 -= carry[2] << 26 + carry[6] = (h6 + (1 << 25)) >> 26 + h7 += carry[6] + h6 -= carry[6] << 26 + + carry[3] = (h3 + (1 << 24)) >> 25 + h4 += carry[3] + h3 -= carry[3] << 25 + carry[7] = (h7 + (1 << 24)) >> 25 + h8 += carry[7] + h7 -= carry[7] << 25 + + carry[4] = (h4 + (1 << 25)) >> 26 + h5 += carry[4] + h4 -= carry[4] << 26 + carry[8] = (h8 + (1 << 25)) >> 26 + h9 += carry[8] + h8 -= carry[8] << 26 + + carry[9] = (h9 + (1 << 24)) >> 25 + h0 += carry[9] * 19 + h9 -= carry[9] << 25 + + carry[0] = (h0 + (1 << 25)) >> 26 + h1 += carry[0] + h0 -= carry[0] << 26 + + h[0] = int32(h0) + h[1] = int32(h1) + h[2] = int32(h2) + h[3] = int32(h3) + h[4] = int32(h4) + h[5] = int32(h5) + h[6] = int32(h6) + h[7] = int32(h7) + h[8] = int32(h8) + h[9] = int32(h9) +} + +// feMul121666 calculates h = f * 121666. Can overlap h with f. +// +// Preconditions: +// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +// +// Postconditions: +// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +func feMul121666(h, f *fieldElement) { + h0 := int64(f[0]) * 121666 + h1 := int64(f[1]) * 121666 + h2 := int64(f[2]) * 121666 + h3 := int64(f[3]) * 121666 + h4 := int64(f[4]) * 121666 + h5 := int64(f[5]) * 121666 + h6 := int64(f[6]) * 121666 + h7 := int64(f[7]) * 121666 + h8 := int64(f[8]) * 121666 + h9 := int64(f[9]) * 121666 + var carry [10]int64 + + carry[9] = (h9 + (1 << 24)) >> 25 + h0 += carry[9] * 19 + h9 -= carry[9] << 25 + carry[1] = (h1 + (1 << 24)) >> 25 + h2 += carry[1] + h1 -= carry[1] << 25 + carry[3] = (h3 + (1 << 24)) >> 25 + h4 += carry[3] + h3 -= carry[3] << 25 + carry[5] = (h5 + (1 << 24)) >> 25 + h6 += carry[5] + h5 -= carry[5] << 25 + carry[7] = (h7 + (1 << 24)) >> 25 + h8 += carry[7] + h7 -= carry[7] << 25 + + carry[0] = (h0 + (1 << 25)) >> 26 + h1 += carry[0] + h0 -= carry[0] << 26 + carry[2] = (h2 + (1 << 25)) >> 26 + h3 += carry[2] + h2 -= carry[2] << 26 + carry[4] = (h4 + (1 << 25)) >> 26 + h5 += carry[4] + h4 -= carry[4] << 26 + carry[6] = (h6 + (1 << 25)) >> 26 + h7 += carry[6] + h6 -= carry[6] << 26 + carry[8] = (h8 + (1 << 25)) >> 26 + h9 += carry[8] + h8 -= carry[8] << 26 + + h[0] = int32(h0) + h[1] = int32(h1) + h[2] = int32(h2) + h[3] = int32(h3) + h[4] = int32(h4) + h[5] = int32(h5) + h[6] = int32(h6) + h[7] = int32(h7) + h[8] = int32(h8) + h[9] = int32(h9) +} + +// feInvert sets out = z^-1. +func feInvert(out, z *fieldElement) { + var t0, t1, t2, t3 fieldElement + var i int + + feSquare(&t0, z) + for i = 1; i < 1; i++ { + feSquare(&t0, &t0) + } + feSquare(&t1, &t0) + for i = 1; i < 2; i++ { + feSquare(&t1, &t1) + } + feMul(&t1, z, &t1) + feMul(&t0, &t0, &t1) + feSquare(&t2, &t0) + for i = 1; i < 1; i++ { + feSquare(&t2, &t2) + } + feMul(&t1, &t1, &t2) + feSquare(&t2, &t1) + for i = 1; i < 5; i++ { + feSquare(&t2, &t2) + } + feMul(&t1, &t2, &t1) + feSquare(&t2, &t1) + for i = 1; i < 10; i++ { + feSquare(&t2, &t2) + } + feMul(&t2, &t2, &t1) + feSquare(&t3, &t2) + for i = 1; i < 20; i++ { + feSquare(&t3, &t3) + } + feMul(&t2, &t3, &t2) + feSquare(&t2, &t2) + for i = 1; i < 10; i++ { + feSquare(&t2, &t2) + } + feMul(&t1, &t2, &t1) + feSquare(&t2, &t1) + for i = 1; i < 50; i++ { + feSquare(&t2, &t2) + } + feMul(&t2, &t2, &t1) + feSquare(&t3, &t2) + for i = 1; i < 100; i++ { + feSquare(&t3, &t3) + } + feMul(&t2, &t3, &t2) + feSquare(&t2, &t2) + for i = 1; i < 50; i++ { + feSquare(&t2, &t2) + } + feMul(&t1, &t2, &t1) + feSquare(&t1, &t1) + for i = 1; i < 5; i++ { + feSquare(&t1, &t1) + } + feMul(out, &t1, &t0) +} + +func scalarMultGeneric(out, in, base *[32]byte) { + var e [32]byte + + copy(e[:], in[:]) + e[0] &= 248 + e[31] &= 127 + e[31] |= 64 + + var x1, x2, z2, x3, z3, tmp0, tmp1 fieldElement + feFromBytes(&x1, base) + feOne(&x2) + feCopy(&x3, &x1) + feOne(&z3) + + swap := int32(0) + for pos := 254; pos >= 0; pos-- { + b := e[pos/8] >> uint(pos&7) + b &= 1 + swap ^= int32(b) + feCSwap(&x2, &x3, swap) + feCSwap(&z2, &z3, swap) + swap = int32(b) + + feSub(&tmp0, &x3, &z3) + feSub(&tmp1, &x2, &z2) + feAdd(&x2, &x2, &z2) + feAdd(&z2, &x3, &z3) + feMul(&z3, &tmp0, &x2) + feMul(&z2, &z2, &tmp1) + feSquare(&tmp0, &tmp1) + feSquare(&tmp1, &x2) + feAdd(&x3, &z3, &z2) + feSub(&z2, &z3, &z2) + feMul(&x2, &tmp1, &tmp0) + feSub(&tmp1, &tmp1, &tmp0) + feSquare(&z2, &z2) + feMul121666(&z3, &tmp1) + feSquare(&x3, &x3) + feAdd(&tmp0, &tmp0, &z3) + feMul(&z3, &x1, &z2) + feMul(&z2, &tmp1, &tmp0) + } + + feCSwap(&x2, &x3, swap) + feCSwap(&z2, &z3, swap) + + feInvert(&z2, &z2) + feMul(&x2, &x2, &z2) + feToBytes(out, &x2) +} diff --git a/vendor/golang.org/x/crypto/curve25519/curve25519_noasm.go b/vendor/golang.org/x/crypto/curve25519/curve25519_noasm.go new file mode 100644 index 000000000..047d49afc --- /dev/null +++ b/vendor/golang.org/x/crypto/curve25519/curve25519_noasm.go @@ -0,0 +1,11 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !amd64 gccgo appengine purego + +package curve25519 + +func scalarMult(out, in, base *[32]byte) { + scalarMultGeneric(out, in, base) +} diff --git a/vendor/golang.org/x/crypto/curve25519/doc.go b/vendor/golang.org/x/crypto/curve25519/doc.go deleted file mode 100644 index da9b10d9c..000000000 --- a/vendor/golang.org/x/crypto/curve25519/doc.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package curve25519 provides an implementation of scalar multiplication on -// the elliptic curve known as curve25519. See https://cr.yp.to/ecdh.html -package curve25519 // import "golang.org/x/crypto/curve25519" - -// basePoint is the x coordinate of the generator of the curve. -var basePoint = [32]byte{9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - -// ScalarMult sets dst to the product in*base where dst and base are the x -// coordinates of group points and all values are in little-endian form. -func ScalarMult(dst, in, base *[32]byte) { - scalarMult(dst, in, base) -} - -// ScalarBaseMult sets dst to the product in*base where dst and base are the x -// coordinates of group points, base is the standard generator and all values -// are in little-endian form. -func ScalarBaseMult(dst, in *[32]byte) { - ScalarMult(dst, in, &basePoint) -} diff --git a/vendor/golang.org/x/crypto/curve25519/freeze_amd64.s b/vendor/golang.org/x/crypto/curve25519/freeze_amd64.s deleted file mode 100644 index 390816106..000000000 --- a/vendor/golang.org/x/crypto/curve25519/freeze_amd64.s +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This code was translated into a form compatible with 6a from the public -// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html - -// +build amd64,!gccgo,!appengine - -#include "const_amd64.h" - -// func freeze(inout *[5]uint64) -TEXT ·freeze(SB),7,$0-8 - MOVQ inout+0(FP), DI - - MOVQ 0(DI),SI - MOVQ 8(DI),DX - MOVQ 16(DI),CX - MOVQ 24(DI),R8 - MOVQ 32(DI),R9 - MOVQ $REDMASK51,AX - MOVQ AX,R10 - SUBQ $18,R10 - MOVQ $3,R11 -REDUCELOOP: - MOVQ SI,R12 - SHRQ $51,R12 - ANDQ AX,SI - ADDQ R12,DX - MOVQ DX,R12 - SHRQ $51,R12 - ANDQ AX,DX - ADDQ R12,CX - MOVQ CX,R12 - SHRQ $51,R12 - ANDQ AX,CX - ADDQ R12,R8 - MOVQ R8,R12 - SHRQ $51,R12 - ANDQ AX,R8 - ADDQ R12,R9 - MOVQ R9,R12 - SHRQ $51,R12 - ANDQ AX,R9 - IMUL3Q $19,R12,R12 - ADDQ R12,SI - SUBQ $1,R11 - JA REDUCELOOP - MOVQ $1,R12 - CMPQ R10,SI - CMOVQLT R11,R12 - CMPQ AX,DX - CMOVQNE R11,R12 - CMPQ AX,CX - CMOVQNE R11,R12 - CMPQ AX,R8 - CMOVQNE R11,R12 - CMPQ AX,R9 - CMOVQNE R11,R12 - NEGQ R12 - ANDQ R12,AX - ANDQ R12,R10 - SUBQ R10,SI - SUBQ AX,DX - SUBQ AX,CX - SUBQ AX,R8 - SUBQ AX,R9 - MOVQ SI,0(DI) - MOVQ DX,8(DI) - MOVQ CX,16(DI) - MOVQ R8,24(DI) - MOVQ R9,32(DI) - RET diff --git a/vendor/golang.org/x/crypto/curve25519/ladderstep_amd64.s b/vendor/golang.org/x/crypto/curve25519/ladderstep_amd64.s deleted file mode 100644 index 9e9040b25..000000000 --- a/vendor/golang.org/x/crypto/curve25519/ladderstep_amd64.s +++ /dev/null @@ -1,1377 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This code was translated into a form compatible with 6a from the public -// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html - -// +build amd64,!gccgo,!appengine - -#include "const_amd64.h" - -// func ladderstep(inout *[5][5]uint64) -TEXT ·ladderstep(SB),0,$296-8 - MOVQ inout+0(FP),DI - - MOVQ 40(DI),SI - MOVQ 48(DI),DX - MOVQ 56(DI),CX - MOVQ 64(DI),R8 - MOVQ 72(DI),R9 - MOVQ SI,AX - MOVQ DX,R10 - MOVQ CX,R11 - MOVQ R8,R12 - MOVQ R9,R13 - ADDQ ·_2P0(SB),AX - ADDQ ·_2P1234(SB),R10 - ADDQ ·_2P1234(SB),R11 - ADDQ ·_2P1234(SB),R12 - ADDQ ·_2P1234(SB),R13 - ADDQ 80(DI),SI - ADDQ 88(DI),DX - ADDQ 96(DI),CX - ADDQ 104(DI),R8 - ADDQ 112(DI),R9 - SUBQ 80(DI),AX - SUBQ 88(DI),R10 - SUBQ 96(DI),R11 - SUBQ 104(DI),R12 - SUBQ 112(DI),R13 - MOVQ SI,0(SP) - MOVQ DX,8(SP) - MOVQ CX,16(SP) - MOVQ R8,24(SP) - MOVQ R9,32(SP) - MOVQ AX,40(SP) - MOVQ R10,48(SP) - MOVQ R11,56(SP) - MOVQ R12,64(SP) - MOVQ R13,72(SP) - MOVQ 40(SP),AX - MULQ 40(SP) - MOVQ AX,SI - MOVQ DX,CX - MOVQ 40(SP),AX - SHLQ $1,AX - MULQ 48(SP) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 40(SP),AX - SHLQ $1,AX - MULQ 56(SP) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 40(SP),AX - SHLQ $1,AX - MULQ 64(SP) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 40(SP),AX - SHLQ $1,AX - MULQ 72(SP) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 48(SP),AX - MULQ 48(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 48(SP),AX - SHLQ $1,AX - MULQ 56(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 48(SP),AX - SHLQ $1,AX - MULQ 64(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 48(SP),DX - IMUL3Q $38,DX,AX - MULQ 72(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 56(SP),AX - MULQ 56(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 56(SP),DX - IMUL3Q $38,DX,AX - MULQ 64(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 56(SP),DX - IMUL3Q $38,DX,AX - MULQ 72(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 64(SP),DX - IMUL3Q $19,DX,AX - MULQ 64(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 64(SP),DX - IMUL3Q $38,DX,AX - MULQ 72(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 72(SP),DX - IMUL3Q $19,DX,AX - MULQ 72(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ $REDMASK51,DX - SHLQ $13,CX:SI - ANDQ DX,SI - SHLQ $13,R9:R8 - ANDQ DX,R8 - ADDQ CX,R8 - SHLQ $13,R11:R10 - ANDQ DX,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ DX,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ DX,R14 - ADDQ R13,R14 - IMUL3Q $19,R15,CX - ADDQ CX,SI - MOVQ SI,CX - SHRQ $51,CX - ADDQ R8,CX - ANDQ DX,SI - MOVQ CX,R8 - SHRQ $51,CX - ADDQ R10,CX - ANDQ DX,R8 - MOVQ CX,R9 - SHRQ $51,CX - ADDQ R12,CX - ANDQ DX,R9 - MOVQ CX,AX - SHRQ $51,CX - ADDQ R14,CX - ANDQ DX,AX - MOVQ CX,R10 - SHRQ $51,CX - IMUL3Q $19,CX,CX - ADDQ CX,SI - ANDQ DX,R10 - MOVQ SI,80(SP) - MOVQ R8,88(SP) - MOVQ R9,96(SP) - MOVQ AX,104(SP) - MOVQ R10,112(SP) - MOVQ 0(SP),AX - MULQ 0(SP) - MOVQ AX,SI - MOVQ DX,CX - MOVQ 0(SP),AX - SHLQ $1,AX - MULQ 8(SP) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 0(SP),AX - SHLQ $1,AX - MULQ 16(SP) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 0(SP),AX - SHLQ $1,AX - MULQ 24(SP) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 0(SP),AX - SHLQ $1,AX - MULQ 32(SP) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 8(SP),AX - MULQ 8(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 8(SP),AX - SHLQ $1,AX - MULQ 16(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 8(SP),AX - SHLQ $1,AX - MULQ 24(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 8(SP),DX - IMUL3Q $38,DX,AX - MULQ 32(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 16(SP),AX - MULQ 16(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 16(SP),DX - IMUL3Q $38,DX,AX - MULQ 24(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 16(SP),DX - IMUL3Q $38,DX,AX - MULQ 32(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 24(SP),DX - IMUL3Q $19,DX,AX - MULQ 24(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 24(SP),DX - IMUL3Q $38,DX,AX - MULQ 32(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 32(SP),DX - IMUL3Q $19,DX,AX - MULQ 32(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ $REDMASK51,DX - SHLQ $13,CX:SI - ANDQ DX,SI - SHLQ $13,R9:R8 - ANDQ DX,R8 - ADDQ CX,R8 - SHLQ $13,R11:R10 - ANDQ DX,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ DX,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ DX,R14 - ADDQ R13,R14 - IMUL3Q $19,R15,CX - ADDQ CX,SI - MOVQ SI,CX - SHRQ $51,CX - ADDQ R8,CX - ANDQ DX,SI - MOVQ CX,R8 - SHRQ $51,CX - ADDQ R10,CX - ANDQ DX,R8 - MOVQ CX,R9 - SHRQ $51,CX - ADDQ R12,CX - ANDQ DX,R9 - MOVQ CX,AX - SHRQ $51,CX - ADDQ R14,CX - ANDQ DX,AX - MOVQ CX,R10 - SHRQ $51,CX - IMUL3Q $19,CX,CX - ADDQ CX,SI - ANDQ DX,R10 - MOVQ SI,120(SP) - MOVQ R8,128(SP) - MOVQ R9,136(SP) - MOVQ AX,144(SP) - MOVQ R10,152(SP) - MOVQ SI,SI - MOVQ R8,DX - MOVQ R9,CX - MOVQ AX,R8 - MOVQ R10,R9 - ADDQ ·_2P0(SB),SI - ADDQ ·_2P1234(SB),DX - ADDQ ·_2P1234(SB),CX - ADDQ ·_2P1234(SB),R8 - ADDQ ·_2P1234(SB),R9 - SUBQ 80(SP),SI - SUBQ 88(SP),DX - SUBQ 96(SP),CX - SUBQ 104(SP),R8 - SUBQ 112(SP),R9 - MOVQ SI,160(SP) - MOVQ DX,168(SP) - MOVQ CX,176(SP) - MOVQ R8,184(SP) - MOVQ R9,192(SP) - MOVQ 120(DI),SI - MOVQ 128(DI),DX - MOVQ 136(DI),CX - MOVQ 144(DI),R8 - MOVQ 152(DI),R9 - MOVQ SI,AX - MOVQ DX,R10 - MOVQ CX,R11 - MOVQ R8,R12 - MOVQ R9,R13 - ADDQ ·_2P0(SB),AX - ADDQ ·_2P1234(SB),R10 - ADDQ ·_2P1234(SB),R11 - ADDQ ·_2P1234(SB),R12 - ADDQ ·_2P1234(SB),R13 - ADDQ 160(DI),SI - ADDQ 168(DI),DX - ADDQ 176(DI),CX - ADDQ 184(DI),R8 - ADDQ 192(DI),R9 - SUBQ 160(DI),AX - SUBQ 168(DI),R10 - SUBQ 176(DI),R11 - SUBQ 184(DI),R12 - SUBQ 192(DI),R13 - MOVQ SI,200(SP) - MOVQ DX,208(SP) - MOVQ CX,216(SP) - MOVQ R8,224(SP) - MOVQ R9,232(SP) - MOVQ AX,240(SP) - MOVQ R10,248(SP) - MOVQ R11,256(SP) - MOVQ R12,264(SP) - MOVQ R13,272(SP) - MOVQ 224(SP),SI - IMUL3Q $19,SI,AX - MOVQ AX,280(SP) - MULQ 56(SP) - MOVQ AX,SI - MOVQ DX,CX - MOVQ 232(SP),DX - IMUL3Q $19,DX,AX - MOVQ AX,288(SP) - MULQ 48(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 200(SP),AX - MULQ 40(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 200(SP),AX - MULQ 48(SP) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 200(SP),AX - MULQ 56(SP) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 200(SP),AX - MULQ 64(SP) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 200(SP),AX - MULQ 72(SP) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 208(SP),AX - MULQ 40(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 208(SP),AX - MULQ 48(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 208(SP),AX - MULQ 56(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 208(SP),AX - MULQ 64(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 208(SP),DX - IMUL3Q $19,DX,AX - MULQ 72(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 216(SP),AX - MULQ 40(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 216(SP),AX - MULQ 48(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 216(SP),AX - MULQ 56(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 216(SP),DX - IMUL3Q $19,DX,AX - MULQ 64(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 216(SP),DX - IMUL3Q $19,DX,AX - MULQ 72(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 224(SP),AX - MULQ 40(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 224(SP),AX - MULQ 48(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 280(SP),AX - MULQ 64(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 280(SP),AX - MULQ 72(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 232(SP),AX - MULQ 40(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 288(SP),AX - MULQ 56(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 288(SP),AX - MULQ 64(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 288(SP),AX - MULQ 72(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ $REDMASK51,DX - SHLQ $13,CX:SI - ANDQ DX,SI - SHLQ $13,R9:R8 - ANDQ DX,R8 - ADDQ CX,R8 - SHLQ $13,R11:R10 - ANDQ DX,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ DX,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ DX,R14 - ADDQ R13,R14 - IMUL3Q $19,R15,CX - ADDQ CX,SI - MOVQ SI,CX - SHRQ $51,CX - ADDQ R8,CX - MOVQ CX,R8 - SHRQ $51,CX - ANDQ DX,SI - ADDQ R10,CX - MOVQ CX,R9 - SHRQ $51,CX - ANDQ DX,R8 - ADDQ R12,CX - MOVQ CX,AX - SHRQ $51,CX - ANDQ DX,R9 - ADDQ R14,CX - MOVQ CX,R10 - SHRQ $51,CX - ANDQ DX,AX - IMUL3Q $19,CX,CX - ADDQ CX,SI - ANDQ DX,R10 - MOVQ SI,40(SP) - MOVQ R8,48(SP) - MOVQ R9,56(SP) - MOVQ AX,64(SP) - MOVQ R10,72(SP) - MOVQ 264(SP),SI - IMUL3Q $19,SI,AX - MOVQ AX,200(SP) - MULQ 16(SP) - MOVQ AX,SI - MOVQ DX,CX - MOVQ 272(SP),DX - IMUL3Q $19,DX,AX - MOVQ AX,208(SP) - MULQ 8(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 240(SP),AX - MULQ 0(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 240(SP),AX - MULQ 8(SP) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 240(SP),AX - MULQ 16(SP) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 240(SP),AX - MULQ 24(SP) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 240(SP),AX - MULQ 32(SP) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 248(SP),AX - MULQ 0(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 248(SP),AX - MULQ 8(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 248(SP),AX - MULQ 16(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 248(SP),AX - MULQ 24(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 248(SP),DX - IMUL3Q $19,DX,AX - MULQ 32(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 256(SP),AX - MULQ 0(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 256(SP),AX - MULQ 8(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 256(SP),AX - MULQ 16(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 256(SP),DX - IMUL3Q $19,DX,AX - MULQ 24(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 256(SP),DX - IMUL3Q $19,DX,AX - MULQ 32(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 264(SP),AX - MULQ 0(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 264(SP),AX - MULQ 8(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 200(SP),AX - MULQ 24(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 200(SP),AX - MULQ 32(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 272(SP),AX - MULQ 0(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 208(SP),AX - MULQ 16(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 208(SP),AX - MULQ 24(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 208(SP),AX - MULQ 32(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ $REDMASK51,DX - SHLQ $13,CX:SI - ANDQ DX,SI - SHLQ $13,R9:R8 - ANDQ DX,R8 - ADDQ CX,R8 - SHLQ $13,R11:R10 - ANDQ DX,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ DX,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ DX,R14 - ADDQ R13,R14 - IMUL3Q $19,R15,CX - ADDQ CX,SI - MOVQ SI,CX - SHRQ $51,CX - ADDQ R8,CX - MOVQ CX,R8 - SHRQ $51,CX - ANDQ DX,SI - ADDQ R10,CX - MOVQ CX,R9 - SHRQ $51,CX - ANDQ DX,R8 - ADDQ R12,CX - MOVQ CX,AX - SHRQ $51,CX - ANDQ DX,R9 - ADDQ R14,CX - MOVQ CX,R10 - SHRQ $51,CX - ANDQ DX,AX - IMUL3Q $19,CX,CX - ADDQ CX,SI - ANDQ DX,R10 - MOVQ SI,DX - MOVQ R8,CX - MOVQ R9,R11 - MOVQ AX,R12 - MOVQ R10,R13 - ADDQ ·_2P0(SB),DX - ADDQ ·_2P1234(SB),CX - ADDQ ·_2P1234(SB),R11 - ADDQ ·_2P1234(SB),R12 - ADDQ ·_2P1234(SB),R13 - ADDQ 40(SP),SI - ADDQ 48(SP),R8 - ADDQ 56(SP),R9 - ADDQ 64(SP),AX - ADDQ 72(SP),R10 - SUBQ 40(SP),DX - SUBQ 48(SP),CX - SUBQ 56(SP),R11 - SUBQ 64(SP),R12 - SUBQ 72(SP),R13 - MOVQ SI,120(DI) - MOVQ R8,128(DI) - MOVQ R9,136(DI) - MOVQ AX,144(DI) - MOVQ R10,152(DI) - MOVQ DX,160(DI) - MOVQ CX,168(DI) - MOVQ R11,176(DI) - MOVQ R12,184(DI) - MOVQ R13,192(DI) - MOVQ 120(DI),AX - MULQ 120(DI) - MOVQ AX,SI - MOVQ DX,CX - MOVQ 120(DI),AX - SHLQ $1,AX - MULQ 128(DI) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 120(DI),AX - SHLQ $1,AX - MULQ 136(DI) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 120(DI),AX - SHLQ $1,AX - MULQ 144(DI) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 120(DI),AX - SHLQ $1,AX - MULQ 152(DI) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 128(DI),AX - MULQ 128(DI) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 128(DI),AX - SHLQ $1,AX - MULQ 136(DI) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 128(DI),AX - SHLQ $1,AX - MULQ 144(DI) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 128(DI),DX - IMUL3Q $38,DX,AX - MULQ 152(DI) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 136(DI),AX - MULQ 136(DI) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 136(DI),DX - IMUL3Q $38,DX,AX - MULQ 144(DI) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 136(DI),DX - IMUL3Q $38,DX,AX - MULQ 152(DI) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 144(DI),DX - IMUL3Q $19,DX,AX - MULQ 144(DI) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 144(DI),DX - IMUL3Q $38,DX,AX - MULQ 152(DI) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 152(DI),DX - IMUL3Q $19,DX,AX - MULQ 152(DI) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ $REDMASK51,DX - SHLQ $13,CX:SI - ANDQ DX,SI - SHLQ $13,R9:R8 - ANDQ DX,R8 - ADDQ CX,R8 - SHLQ $13,R11:R10 - ANDQ DX,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ DX,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ DX,R14 - ADDQ R13,R14 - IMUL3Q $19,R15,CX - ADDQ CX,SI - MOVQ SI,CX - SHRQ $51,CX - ADDQ R8,CX - ANDQ DX,SI - MOVQ CX,R8 - SHRQ $51,CX - ADDQ R10,CX - ANDQ DX,R8 - MOVQ CX,R9 - SHRQ $51,CX - ADDQ R12,CX - ANDQ DX,R9 - MOVQ CX,AX - SHRQ $51,CX - ADDQ R14,CX - ANDQ DX,AX - MOVQ CX,R10 - SHRQ $51,CX - IMUL3Q $19,CX,CX - ADDQ CX,SI - ANDQ DX,R10 - MOVQ SI,120(DI) - MOVQ R8,128(DI) - MOVQ R9,136(DI) - MOVQ AX,144(DI) - MOVQ R10,152(DI) - MOVQ 160(DI),AX - MULQ 160(DI) - MOVQ AX,SI - MOVQ DX,CX - MOVQ 160(DI),AX - SHLQ $1,AX - MULQ 168(DI) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 160(DI),AX - SHLQ $1,AX - MULQ 176(DI) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 160(DI),AX - SHLQ $1,AX - MULQ 184(DI) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 160(DI),AX - SHLQ $1,AX - MULQ 192(DI) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 168(DI),AX - MULQ 168(DI) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 168(DI),AX - SHLQ $1,AX - MULQ 176(DI) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 168(DI),AX - SHLQ $1,AX - MULQ 184(DI) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 168(DI),DX - IMUL3Q $38,DX,AX - MULQ 192(DI) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 176(DI),AX - MULQ 176(DI) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 176(DI),DX - IMUL3Q $38,DX,AX - MULQ 184(DI) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 176(DI),DX - IMUL3Q $38,DX,AX - MULQ 192(DI) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 184(DI),DX - IMUL3Q $19,DX,AX - MULQ 184(DI) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 184(DI),DX - IMUL3Q $38,DX,AX - MULQ 192(DI) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 192(DI),DX - IMUL3Q $19,DX,AX - MULQ 192(DI) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ $REDMASK51,DX - SHLQ $13,CX:SI - ANDQ DX,SI - SHLQ $13,R9:R8 - ANDQ DX,R8 - ADDQ CX,R8 - SHLQ $13,R11:R10 - ANDQ DX,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ DX,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ DX,R14 - ADDQ R13,R14 - IMUL3Q $19,R15,CX - ADDQ CX,SI - MOVQ SI,CX - SHRQ $51,CX - ADDQ R8,CX - ANDQ DX,SI - MOVQ CX,R8 - SHRQ $51,CX - ADDQ R10,CX - ANDQ DX,R8 - MOVQ CX,R9 - SHRQ $51,CX - ADDQ R12,CX - ANDQ DX,R9 - MOVQ CX,AX - SHRQ $51,CX - ADDQ R14,CX - ANDQ DX,AX - MOVQ CX,R10 - SHRQ $51,CX - IMUL3Q $19,CX,CX - ADDQ CX,SI - ANDQ DX,R10 - MOVQ SI,160(DI) - MOVQ R8,168(DI) - MOVQ R9,176(DI) - MOVQ AX,184(DI) - MOVQ R10,192(DI) - MOVQ 184(DI),SI - IMUL3Q $19,SI,AX - MOVQ AX,0(SP) - MULQ 16(DI) - MOVQ AX,SI - MOVQ DX,CX - MOVQ 192(DI),DX - IMUL3Q $19,DX,AX - MOVQ AX,8(SP) - MULQ 8(DI) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 160(DI),AX - MULQ 0(DI) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 160(DI),AX - MULQ 8(DI) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 160(DI),AX - MULQ 16(DI) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 160(DI),AX - MULQ 24(DI) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 160(DI),AX - MULQ 32(DI) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 168(DI),AX - MULQ 0(DI) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 168(DI),AX - MULQ 8(DI) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 168(DI),AX - MULQ 16(DI) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 168(DI),AX - MULQ 24(DI) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 168(DI),DX - IMUL3Q $19,DX,AX - MULQ 32(DI) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 176(DI),AX - MULQ 0(DI) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 176(DI),AX - MULQ 8(DI) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 176(DI),AX - MULQ 16(DI) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 176(DI),DX - IMUL3Q $19,DX,AX - MULQ 24(DI) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 176(DI),DX - IMUL3Q $19,DX,AX - MULQ 32(DI) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 184(DI),AX - MULQ 0(DI) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 184(DI),AX - MULQ 8(DI) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 0(SP),AX - MULQ 24(DI) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 0(SP),AX - MULQ 32(DI) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 192(DI),AX - MULQ 0(DI) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 8(SP),AX - MULQ 16(DI) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 8(SP),AX - MULQ 24(DI) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 8(SP),AX - MULQ 32(DI) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ $REDMASK51,DX - SHLQ $13,CX:SI - ANDQ DX,SI - SHLQ $13,R9:R8 - ANDQ DX,R8 - ADDQ CX,R8 - SHLQ $13,R11:R10 - ANDQ DX,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ DX,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ DX,R14 - ADDQ R13,R14 - IMUL3Q $19,R15,CX - ADDQ CX,SI - MOVQ SI,CX - SHRQ $51,CX - ADDQ R8,CX - MOVQ CX,R8 - SHRQ $51,CX - ANDQ DX,SI - ADDQ R10,CX - MOVQ CX,R9 - SHRQ $51,CX - ANDQ DX,R8 - ADDQ R12,CX - MOVQ CX,AX - SHRQ $51,CX - ANDQ DX,R9 - ADDQ R14,CX - MOVQ CX,R10 - SHRQ $51,CX - ANDQ DX,AX - IMUL3Q $19,CX,CX - ADDQ CX,SI - ANDQ DX,R10 - MOVQ SI,160(DI) - MOVQ R8,168(DI) - MOVQ R9,176(DI) - MOVQ AX,184(DI) - MOVQ R10,192(DI) - MOVQ 144(SP),SI - IMUL3Q $19,SI,AX - MOVQ AX,0(SP) - MULQ 96(SP) - MOVQ AX,SI - MOVQ DX,CX - MOVQ 152(SP),DX - IMUL3Q $19,DX,AX - MOVQ AX,8(SP) - MULQ 88(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 120(SP),AX - MULQ 80(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 120(SP),AX - MULQ 88(SP) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 120(SP),AX - MULQ 96(SP) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 120(SP),AX - MULQ 104(SP) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 120(SP),AX - MULQ 112(SP) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 128(SP),AX - MULQ 80(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 128(SP),AX - MULQ 88(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 128(SP),AX - MULQ 96(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 128(SP),AX - MULQ 104(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 128(SP),DX - IMUL3Q $19,DX,AX - MULQ 112(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 136(SP),AX - MULQ 80(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 136(SP),AX - MULQ 88(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 136(SP),AX - MULQ 96(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 136(SP),DX - IMUL3Q $19,DX,AX - MULQ 104(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 136(SP),DX - IMUL3Q $19,DX,AX - MULQ 112(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 144(SP),AX - MULQ 80(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 144(SP),AX - MULQ 88(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 0(SP),AX - MULQ 104(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 0(SP),AX - MULQ 112(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 152(SP),AX - MULQ 80(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 8(SP),AX - MULQ 96(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 8(SP),AX - MULQ 104(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 8(SP),AX - MULQ 112(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ $REDMASK51,DX - SHLQ $13,CX:SI - ANDQ DX,SI - SHLQ $13,R9:R8 - ANDQ DX,R8 - ADDQ CX,R8 - SHLQ $13,R11:R10 - ANDQ DX,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ DX,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ DX,R14 - ADDQ R13,R14 - IMUL3Q $19,R15,CX - ADDQ CX,SI - MOVQ SI,CX - SHRQ $51,CX - ADDQ R8,CX - MOVQ CX,R8 - SHRQ $51,CX - ANDQ DX,SI - ADDQ R10,CX - MOVQ CX,R9 - SHRQ $51,CX - ANDQ DX,R8 - ADDQ R12,CX - MOVQ CX,AX - SHRQ $51,CX - ANDQ DX,R9 - ADDQ R14,CX - MOVQ CX,R10 - SHRQ $51,CX - ANDQ DX,AX - IMUL3Q $19,CX,CX - ADDQ CX,SI - ANDQ DX,R10 - MOVQ SI,40(DI) - MOVQ R8,48(DI) - MOVQ R9,56(DI) - MOVQ AX,64(DI) - MOVQ R10,72(DI) - MOVQ 160(SP),AX - MULQ ·_121666_213(SB) - SHRQ $13,AX - MOVQ AX,SI - MOVQ DX,CX - MOVQ 168(SP),AX - MULQ ·_121666_213(SB) - SHRQ $13,AX - ADDQ AX,CX - MOVQ DX,R8 - MOVQ 176(SP),AX - MULQ ·_121666_213(SB) - SHRQ $13,AX - ADDQ AX,R8 - MOVQ DX,R9 - MOVQ 184(SP),AX - MULQ ·_121666_213(SB) - SHRQ $13,AX - ADDQ AX,R9 - MOVQ DX,R10 - MOVQ 192(SP),AX - MULQ ·_121666_213(SB) - SHRQ $13,AX - ADDQ AX,R10 - IMUL3Q $19,DX,DX - ADDQ DX,SI - ADDQ 80(SP),SI - ADDQ 88(SP),CX - ADDQ 96(SP),R8 - ADDQ 104(SP),R9 - ADDQ 112(SP),R10 - MOVQ SI,80(DI) - MOVQ CX,88(DI) - MOVQ R8,96(DI) - MOVQ R9,104(DI) - MOVQ R10,112(DI) - MOVQ 104(DI),SI - IMUL3Q $19,SI,AX - MOVQ AX,0(SP) - MULQ 176(SP) - MOVQ AX,SI - MOVQ DX,CX - MOVQ 112(DI),DX - IMUL3Q $19,DX,AX - MOVQ AX,8(SP) - MULQ 168(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 80(DI),AX - MULQ 160(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 80(DI),AX - MULQ 168(SP) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 80(DI),AX - MULQ 176(SP) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 80(DI),AX - MULQ 184(SP) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 80(DI),AX - MULQ 192(SP) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 88(DI),AX - MULQ 160(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 88(DI),AX - MULQ 168(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 88(DI),AX - MULQ 176(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 88(DI),AX - MULQ 184(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 88(DI),DX - IMUL3Q $19,DX,AX - MULQ 192(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 96(DI),AX - MULQ 160(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 96(DI),AX - MULQ 168(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 96(DI),AX - MULQ 176(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 96(DI),DX - IMUL3Q $19,DX,AX - MULQ 184(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 96(DI),DX - IMUL3Q $19,DX,AX - MULQ 192(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 104(DI),AX - MULQ 160(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 104(DI),AX - MULQ 168(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 0(SP),AX - MULQ 184(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 0(SP),AX - MULQ 192(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 112(DI),AX - MULQ 160(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 8(SP),AX - MULQ 176(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 8(SP),AX - MULQ 184(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 8(SP),AX - MULQ 192(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ $REDMASK51,DX - SHLQ $13,CX:SI - ANDQ DX,SI - SHLQ $13,R9:R8 - ANDQ DX,R8 - ADDQ CX,R8 - SHLQ $13,R11:R10 - ANDQ DX,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ DX,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ DX,R14 - ADDQ R13,R14 - IMUL3Q $19,R15,CX - ADDQ CX,SI - MOVQ SI,CX - SHRQ $51,CX - ADDQ R8,CX - MOVQ CX,R8 - SHRQ $51,CX - ANDQ DX,SI - ADDQ R10,CX - MOVQ CX,R9 - SHRQ $51,CX - ANDQ DX,R8 - ADDQ R12,CX - MOVQ CX,AX - SHRQ $51,CX - ANDQ DX,R9 - ADDQ R14,CX - MOVQ CX,R10 - SHRQ $51,CX - ANDQ DX,AX - IMUL3Q $19,CX,CX - ADDQ CX,SI - ANDQ DX,R10 - MOVQ SI,80(DI) - MOVQ R8,88(DI) - MOVQ R9,96(DI) - MOVQ AX,104(DI) - MOVQ R10,112(DI) - RET diff --git a/vendor/golang.org/x/crypto/curve25519/mont25519_amd64.go b/vendor/golang.org/x/crypto/curve25519/mont25519_amd64.go deleted file mode 100644 index 5822bd533..000000000 --- a/vendor/golang.org/x/crypto/curve25519/mont25519_amd64.go +++ /dev/null @@ -1,240 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build amd64,!gccgo,!appengine - -package curve25519 - -// These functions are implemented in the .s files. The names of the functions -// in the rest of the file are also taken from the SUPERCOP sources to help -// people following along. - -//go:noescape - -func cswap(inout *[5]uint64, v uint64) - -//go:noescape - -func ladderstep(inout *[5][5]uint64) - -//go:noescape - -func freeze(inout *[5]uint64) - -//go:noescape - -func mul(dest, a, b *[5]uint64) - -//go:noescape - -func square(out, in *[5]uint64) - -// mladder uses a Montgomery ladder to calculate (xr/zr) *= s. -func mladder(xr, zr *[5]uint64, s *[32]byte) { - var work [5][5]uint64 - - work[0] = *xr - setint(&work[1], 1) - setint(&work[2], 0) - work[3] = *xr - setint(&work[4], 1) - - j := uint(6) - var prevbit byte - - for i := 31; i >= 0; i-- { - for j < 8 { - bit := ((*s)[i] >> j) & 1 - swap := bit ^ prevbit - prevbit = bit - cswap(&work[1], uint64(swap)) - ladderstep(&work) - j-- - } - j = 7 - } - - *xr = work[1] - *zr = work[2] -} - -func scalarMult(out, in, base *[32]byte) { - var e [32]byte - copy(e[:], (*in)[:]) - e[0] &= 248 - e[31] &= 127 - e[31] |= 64 - - var t, z [5]uint64 - unpack(&t, base) - mladder(&t, &z, &e) - invert(&z, &z) - mul(&t, &t, &z) - pack(out, &t) -} - -func setint(r *[5]uint64, v uint64) { - r[0] = v - r[1] = 0 - r[2] = 0 - r[3] = 0 - r[4] = 0 -} - -// unpack sets r = x where r consists of 5, 51-bit limbs in little-endian -// order. -func unpack(r *[5]uint64, x *[32]byte) { - r[0] = uint64(x[0]) | - uint64(x[1])<<8 | - uint64(x[2])<<16 | - uint64(x[3])<<24 | - uint64(x[4])<<32 | - uint64(x[5])<<40 | - uint64(x[6]&7)<<48 - - r[1] = uint64(x[6])>>3 | - uint64(x[7])<<5 | - uint64(x[8])<<13 | - uint64(x[9])<<21 | - uint64(x[10])<<29 | - uint64(x[11])<<37 | - uint64(x[12]&63)<<45 - - r[2] = uint64(x[12])>>6 | - uint64(x[13])<<2 | - uint64(x[14])<<10 | - uint64(x[15])<<18 | - uint64(x[16])<<26 | - uint64(x[17])<<34 | - uint64(x[18])<<42 | - uint64(x[19]&1)<<50 - - r[3] = uint64(x[19])>>1 | - uint64(x[20])<<7 | - uint64(x[21])<<15 | - uint64(x[22])<<23 | - uint64(x[23])<<31 | - uint64(x[24])<<39 | - uint64(x[25]&15)<<47 - - r[4] = uint64(x[25])>>4 | - uint64(x[26])<<4 | - uint64(x[27])<<12 | - uint64(x[28])<<20 | - uint64(x[29])<<28 | - uint64(x[30])<<36 | - uint64(x[31]&127)<<44 -} - -// pack sets out = x where out is the usual, little-endian form of the 5, -// 51-bit limbs in x. -func pack(out *[32]byte, x *[5]uint64) { - t := *x - freeze(&t) - - out[0] = byte(t[0]) - out[1] = byte(t[0] >> 8) - out[2] = byte(t[0] >> 16) - out[3] = byte(t[0] >> 24) - out[4] = byte(t[0] >> 32) - out[5] = byte(t[0] >> 40) - out[6] = byte(t[0] >> 48) - - out[6] ^= byte(t[1]<<3) & 0xf8 - out[7] = byte(t[1] >> 5) - out[8] = byte(t[1] >> 13) - out[9] = byte(t[1] >> 21) - out[10] = byte(t[1] >> 29) - out[11] = byte(t[1] >> 37) - out[12] = byte(t[1] >> 45) - - out[12] ^= byte(t[2]<<6) & 0xc0 - out[13] = byte(t[2] >> 2) - out[14] = byte(t[2] >> 10) - out[15] = byte(t[2] >> 18) - out[16] = byte(t[2] >> 26) - out[17] = byte(t[2] >> 34) - out[18] = byte(t[2] >> 42) - out[19] = byte(t[2] >> 50) - - out[19] ^= byte(t[3]<<1) & 0xfe - out[20] = byte(t[3] >> 7) - out[21] = byte(t[3] >> 15) - out[22] = byte(t[3] >> 23) - out[23] = byte(t[3] >> 31) - out[24] = byte(t[3] >> 39) - out[25] = byte(t[3] >> 47) - - out[25] ^= byte(t[4]<<4) & 0xf0 - out[26] = byte(t[4] >> 4) - out[27] = byte(t[4] >> 12) - out[28] = byte(t[4] >> 20) - out[29] = byte(t[4] >> 28) - out[30] = byte(t[4] >> 36) - out[31] = byte(t[4] >> 44) -} - -// invert calculates r = x^-1 mod p using Fermat's little theorem. -func invert(r *[5]uint64, x *[5]uint64) { - var z2, z9, z11, z2_5_0, z2_10_0, z2_20_0, z2_50_0, z2_100_0, t [5]uint64 - - square(&z2, x) /* 2 */ - square(&t, &z2) /* 4 */ - square(&t, &t) /* 8 */ - mul(&z9, &t, x) /* 9 */ - mul(&z11, &z9, &z2) /* 11 */ - square(&t, &z11) /* 22 */ - mul(&z2_5_0, &t, &z9) /* 2^5 - 2^0 = 31 */ - - square(&t, &z2_5_0) /* 2^6 - 2^1 */ - for i := 1; i < 5; i++ { /* 2^20 - 2^10 */ - square(&t, &t) - } - mul(&z2_10_0, &t, &z2_5_0) /* 2^10 - 2^0 */ - - square(&t, &z2_10_0) /* 2^11 - 2^1 */ - for i := 1; i < 10; i++ { /* 2^20 - 2^10 */ - square(&t, &t) - } - mul(&z2_20_0, &t, &z2_10_0) /* 2^20 - 2^0 */ - - square(&t, &z2_20_0) /* 2^21 - 2^1 */ - for i := 1; i < 20; i++ { /* 2^40 - 2^20 */ - square(&t, &t) - } - mul(&t, &t, &z2_20_0) /* 2^40 - 2^0 */ - - square(&t, &t) /* 2^41 - 2^1 */ - for i := 1; i < 10; i++ { /* 2^50 - 2^10 */ - square(&t, &t) - } - mul(&z2_50_0, &t, &z2_10_0) /* 2^50 - 2^0 */ - - square(&t, &z2_50_0) /* 2^51 - 2^1 */ - for i := 1; i < 50; i++ { /* 2^100 - 2^50 */ - square(&t, &t) - } - mul(&z2_100_0, &t, &z2_50_0) /* 2^100 - 2^0 */ - - square(&t, &z2_100_0) /* 2^101 - 2^1 */ - for i := 1; i < 100; i++ { /* 2^200 - 2^100 */ - square(&t, &t) - } - mul(&t, &t, &z2_100_0) /* 2^200 - 2^0 */ - - square(&t, &t) /* 2^201 - 2^1 */ - for i := 1; i < 50; i++ { /* 2^250 - 2^50 */ - square(&t, &t) - } - mul(&t, &t, &z2_50_0) /* 2^250 - 2^0 */ - - square(&t, &t) /* 2^251 - 2^1 */ - square(&t, &t) /* 2^252 - 2^2 */ - square(&t, &t) /* 2^253 - 2^3 */ - - square(&t, &t) /* 2^254 - 2^4 */ - - square(&t, &t) /* 2^255 - 2^5 */ - mul(r, &t, &z11) /* 2^255 - 21 */ -} diff --git a/vendor/golang.org/x/crypto/curve25519/mul_amd64.s b/vendor/golang.org/x/crypto/curve25519/mul_amd64.s deleted file mode 100644 index 5ce80a2e5..000000000 --- a/vendor/golang.org/x/crypto/curve25519/mul_amd64.s +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This code was translated into a form compatible with 6a from the public -// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html - -// +build amd64,!gccgo,!appengine - -#include "const_amd64.h" - -// func mul(dest, a, b *[5]uint64) -TEXT ·mul(SB),0,$16-24 - MOVQ dest+0(FP), DI - MOVQ a+8(FP), SI - MOVQ b+16(FP), DX - - MOVQ DX,CX - MOVQ 24(SI),DX - IMUL3Q $19,DX,AX - MOVQ AX,0(SP) - MULQ 16(CX) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 32(SI),DX - IMUL3Q $19,DX,AX - MOVQ AX,8(SP) - MULQ 8(CX) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 0(SI),AX - MULQ 0(CX) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 0(SI),AX - MULQ 8(CX) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 0(SI),AX - MULQ 16(CX) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 0(SI),AX - MULQ 24(CX) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 0(SI),AX - MULQ 32(CX) - MOVQ AX,BX - MOVQ DX,BP - MOVQ 8(SI),AX - MULQ 0(CX) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 8(SI),AX - MULQ 8(CX) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 8(SI),AX - MULQ 16(CX) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 8(SI),AX - MULQ 24(CX) - ADDQ AX,BX - ADCQ DX,BP - MOVQ 8(SI),DX - IMUL3Q $19,DX,AX - MULQ 32(CX) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 16(SI),AX - MULQ 0(CX) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 16(SI),AX - MULQ 8(CX) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 16(SI),AX - MULQ 16(CX) - ADDQ AX,BX - ADCQ DX,BP - MOVQ 16(SI),DX - IMUL3Q $19,DX,AX - MULQ 24(CX) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 16(SI),DX - IMUL3Q $19,DX,AX - MULQ 32(CX) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 24(SI),AX - MULQ 0(CX) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 24(SI),AX - MULQ 8(CX) - ADDQ AX,BX - ADCQ DX,BP - MOVQ 0(SP),AX - MULQ 24(CX) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 0(SP),AX - MULQ 32(CX) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 32(SI),AX - MULQ 0(CX) - ADDQ AX,BX - ADCQ DX,BP - MOVQ 8(SP),AX - MULQ 16(CX) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 8(SP),AX - MULQ 24(CX) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 8(SP),AX - MULQ 32(CX) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ $REDMASK51,SI - SHLQ $13,R9:R8 - ANDQ SI,R8 - SHLQ $13,R11:R10 - ANDQ SI,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ SI,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ SI,R14 - ADDQ R13,R14 - SHLQ $13,BP:BX - ANDQ SI,BX - ADDQ R15,BX - IMUL3Q $19,BP,DX - ADDQ DX,R8 - MOVQ R8,DX - SHRQ $51,DX - ADDQ R10,DX - MOVQ DX,CX - SHRQ $51,DX - ANDQ SI,R8 - ADDQ R12,DX - MOVQ DX,R9 - SHRQ $51,DX - ANDQ SI,CX - ADDQ R14,DX - MOVQ DX,AX - SHRQ $51,DX - ANDQ SI,R9 - ADDQ BX,DX - MOVQ DX,R10 - SHRQ $51,DX - ANDQ SI,AX - IMUL3Q $19,DX,DX - ADDQ DX,R8 - ANDQ SI,R10 - MOVQ R8,0(DI) - MOVQ CX,8(DI) - MOVQ R9,16(DI) - MOVQ AX,24(DI) - MOVQ R10,32(DI) - RET diff --git a/vendor/golang.org/x/crypto/curve25519/square_amd64.s b/vendor/golang.org/x/crypto/curve25519/square_amd64.s deleted file mode 100644 index 12f73734f..000000000 --- a/vendor/golang.org/x/crypto/curve25519/square_amd64.s +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This code was translated into a form compatible with 6a from the public -// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html - -// +build amd64,!gccgo,!appengine - -#include "const_amd64.h" - -// func square(out, in *[5]uint64) -TEXT ·square(SB),7,$0-16 - MOVQ out+0(FP), DI - MOVQ in+8(FP), SI - - MOVQ 0(SI),AX - MULQ 0(SI) - MOVQ AX,CX - MOVQ DX,R8 - MOVQ 0(SI),AX - SHLQ $1,AX - MULQ 8(SI) - MOVQ AX,R9 - MOVQ DX,R10 - MOVQ 0(SI),AX - SHLQ $1,AX - MULQ 16(SI) - MOVQ AX,R11 - MOVQ DX,R12 - MOVQ 0(SI),AX - SHLQ $1,AX - MULQ 24(SI) - MOVQ AX,R13 - MOVQ DX,R14 - MOVQ 0(SI),AX - SHLQ $1,AX - MULQ 32(SI) - MOVQ AX,R15 - MOVQ DX,BX - MOVQ 8(SI),AX - MULQ 8(SI) - ADDQ AX,R11 - ADCQ DX,R12 - MOVQ 8(SI),AX - SHLQ $1,AX - MULQ 16(SI) - ADDQ AX,R13 - ADCQ DX,R14 - MOVQ 8(SI),AX - SHLQ $1,AX - MULQ 24(SI) - ADDQ AX,R15 - ADCQ DX,BX - MOVQ 8(SI),DX - IMUL3Q $38,DX,AX - MULQ 32(SI) - ADDQ AX,CX - ADCQ DX,R8 - MOVQ 16(SI),AX - MULQ 16(SI) - ADDQ AX,R15 - ADCQ DX,BX - MOVQ 16(SI),DX - IMUL3Q $38,DX,AX - MULQ 24(SI) - ADDQ AX,CX - ADCQ DX,R8 - MOVQ 16(SI),DX - IMUL3Q $38,DX,AX - MULQ 32(SI) - ADDQ AX,R9 - ADCQ DX,R10 - MOVQ 24(SI),DX - IMUL3Q $19,DX,AX - MULQ 24(SI) - ADDQ AX,R9 - ADCQ DX,R10 - MOVQ 24(SI),DX - IMUL3Q $38,DX,AX - MULQ 32(SI) - ADDQ AX,R11 - ADCQ DX,R12 - MOVQ 32(SI),DX - IMUL3Q $19,DX,AX - MULQ 32(SI) - ADDQ AX,R13 - ADCQ DX,R14 - MOVQ $REDMASK51,SI - SHLQ $13,R8:CX - ANDQ SI,CX - SHLQ $13,R10:R9 - ANDQ SI,R9 - ADDQ R8,R9 - SHLQ $13,R12:R11 - ANDQ SI,R11 - ADDQ R10,R11 - SHLQ $13,R14:R13 - ANDQ SI,R13 - ADDQ R12,R13 - SHLQ $13,BX:R15 - ANDQ SI,R15 - ADDQ R14,R15 - IMUL3Q $19,BX,DX - ADDQ DX,CX - MOVQ CX,DX - SHRQ $51,DX - ADDQ R9,DX - ANDQ SI,CX - MOVQ DX,R8 - SHRQ $51,DX - ADDQ R11,DX - ANDQ SI,R8 - MOVQ DX,R9 - SHRQ $51,DX - ADDQ R13,DX - ANDQ SI,R9 - MOVQ DX,AX - SHRQ $51,DX - ADDQ R15,DX - ANDQ SI,AX - MOVQ DX,R10 - SHRQ $51,DX - IMUL3Q $19,DX,DX - ADDQ DX,CX - ANDQ SI,R10 - MOVQ CX,0(DI) - MOVQ R8,8(DI) - MOVQ R9,16(DI) - MOVQ AX,24(DI) - MOVQ R10,32(DI) - RET diff --git a/vendor/golang.org/x/crypto/ed25519/ed25519.go b/vendor/golang.org/x/crypto/ed25519/ed25519.go index d6f683ba3..c7f8c7e64 100644 --- a/vendor/golang.org/x/crypto/ed25519/ed25519.go +++ b/vendor/golang.org/x/crypto/ed25519/ed25519.go @@ -2,6 +2,11 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +// In Go 1.13, the ed25519 package was promoted to the standard library as +// crypto/ed25519, and this package became a wrapper for the standard library one. +// +// +build !go1.13 + // Package ed25519 implements the Ed25519 signature algorithm. See // https://ed25519.cr.yp.to/. // diff --git a/vendor/golang.org/x/crypto/ed25519/ed25519_go113.go b/vendor/golang.org/x/crypto/ed25519/ed25519_go113.go new file mode 100644 index 000000000..d1448d8d2 --- /dev/null +++ b/vendor/golang.org/x/crypto/ed25519/ed25519_go113.go @@ -0,0 +1,73 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.13 + +// Package ed25519 implements the Ed25519 signature algorithm. See +// https://ed25519.cr.yp.to/. +// +// These functions are also compatible with the “Ed25519” function defined in +// RFC 8032. However, unlike RFC 8032's formulation, this package's private key +// representation includes a public key suffix to make multiple signing +// operations with the same key more efficient. This package refers to the RFC +// 8032 private key as the “seed”. +// +// Beginning with Go 1.13, the functionality of this package was moved to the +// standard library as crypto/ed25519. This package only acts as a compatibility +// wrapper. +package ed25519 + +import ( + "crypto/ed25519" + "io" +) + +const ( + // PublicKeySize is the size, in bytes, of public keys as used in this package. + PublicKeySize = 32 + // PrivateKeySize is the size, in bytes, of private keys as used in this package. + PrivateKeySize = 64 + // SignatureSize is the size, in bytes, of signatures generated and verified by this package. + SignatureSize = 64 + // SeedSize is the size, in bytes, of private key seeds. These are the private key representations used by RFC 8032. + SeedSize = 32 +) + +// PublicKey is the type of Ed25519 public keys. +// +// This type is an alias for crypto/ed25519's PublicKey type. +// See the crypto/ed25519 package for the methods on this type. +type PublicKey = ed25519.PublicKey + +// PrivateKey is the type of Ed25519 private keys. It implements crypto.Signer. +// +// This type is an alias for crypto/ed25519's PrivateKey type. +// See the crypto/ed25519 package for the methods on this type. +type PrivateKey = ed25519.PrivateKey + +// GenerateKey generates a public/private key pair using entropy from rand. +// If rand is nil, crypto/rand.Reader will be used. +func GenerateKey(rand io.Reader) (PublicKey, PrivateKey, error) { + return ed25519.GenerateKey(rand) +} + +// NewKeyFromSeed calculates a private key from a seed. It will panic if +// len(seed) is not SeedSize. This function is provided for interoperability +// with RFC 8032. RFC 8032's private keys correspond to seeds in this +// package. +func NewKeyFromSeed(seed []byte) PrivateKey { + return ed25519.NewKeyFromSeed(seed) +} + +// Sign signs the message with privateKey and returns a signature. It will +// panic if len(privateKey) is not PrivateKeySize. +func Sign(privateKey PrivateKey, message []byte) []byte { + return ed25519.Sign(privateKey, message) +} + +// Verify reports whether sig is a valid signature of message by publicKey. It +// will panic if len(publicKey) is not PublicKeySize. +func Verify(publicKey PublicKey, message, sig []byte) bool { + return ed25519.Verify(publicKey, message, sig) +} diff --git a/vendor/golang.org/x/crypto/internal/chacha20/asm_s390x.s b/vendor/golang.org/x/crypto/internal/chacha20/asm_s390x.s deleted file mode 100644 index 98427c5e2..000000000 --- a/vendor/golang.org/x/crypto/internal/chacha20/asm_s390x.s +++ /dev/null @@ -1,283 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build s390x,!gccgo,!appengine - -#include "go_asm.h" -#include "textflag.h" - -// This is an implementation of the ChaCha20 encryption algorithm as -// specified in RFC 7539. It uses vector instructions to compute -// 4 keystream blocks in parallel (256 bytes) which are then XORed -// with the bytes in the input slice. - -GLOBL ·constants<>(SB), RODATA|NOPTR, $32 -// BSWAP: swap bytes in each 4-byte element -DATA ·constants<>+0x00(SB)/4, $0x03020100 -DATA ·constants<>+0x04(SB)/4, $0x07060504 -DATA ·constants<>+0x08(SB)/4, $0x0b0a0908 -DATA ·constants<>+0x0c(SB)/4, $0x0f0e0d0c -// J0: [j0, j1, j2, j3] -DATA ·constants<>+0x10(SB)/4, $0x61707865 -DATA ·constants<>+0x14(SB)/4, $0x3320646e -DATA ·constants<>+0x18(SB)/4, $0x79622d32 -DATA ·constants<>+0x1c(SB)/4, $0x6b206574 - -// EXRL targets: -TEXT ·mvcSrcToBuf(SB), NOFRAME|NOSPLIT, $0 - MVC $1, (R1), (R8) - RET - -TEXT ·mvcBufToDst(SB), NOFRAME|NOSPLIT, $0 - MVC $1, (R8), (R9) - RET - -#define BSWAP V5 -#define J0 V6 -#define KEY0 V7 -#define KEY1 V8 -#define NONCE V9 -#define CTR V10 -#define M0 V11 -#define M1 V12 -#define M2 V13 -#define M3 V14 -#define INC V15 -#define X0 V16 -#define X1 V17 -#define X2 V18 -#define X3 V19 -#define X4 V20 -#define X5 V21 -#define X6 V22 -#define X7 V23 -#define X8 V24 -#define X9 V25 -#define X10 V26 -#define X11 V27 -#define X12 V28 -#define X13 V29 -#define X14 V30 -#define X15 V31 - -#define NUM_ROUNDS 20 - -#define ROUND4(a0, a1, a2, a3, b0, b1, b2, b3, c0, c1, c2, c3, d0, d1, d2, d3) \ - VAF a1, a0, a0 \ - VAF b1, b0, b0 \ - VAF c1, c0, c0 \ - VAF d1, d0, d0 \ - VX a0, a2, a2 \ - VX b0, b2, b2 \ - VX c0, c2, c2 \ - VX d0, d2, d2 \ - VERLLF $16, a2, a2 \ - VERLLF $16, b2, b2 \ - VERLLF $16, c2, c2 \ - VERLLF $16, d2, d2 \ - VAF a2, a3, a3 \ - VAF b2, b3, b3 \ - VAF c2, c3, c3 \ - VAF d2, d3, d3 \ - VX a3, a1, a1 \ - VX b3, b1, b1 \ - VX c3, c1, c1 \ - VX d3, d1, d1 \ - VERLLF $12, a1, a1 \ - VERLLF $12, b1, b1 \ - VERLLF $12, c1, c1 \ - VERLLF $12, d1, d1 \ - VAF a1, a0, a0 \ - VAF b1, b0, b0 \ - VAF c1, c0, c0 \ - VAF d1, d0, d0 \ - VX a0, a2, a2 \ - VX b0, b2, b2 \ - VX c0, c2, c2 \ - VX d0, d2, d2 \ - VERLLF $8, a2, a2 \ - VERLLF $8, b2, b2 \ - VERLLF $8, c2, c2 \ - VERLLF $8, d2, d2 \ - VAF a2, a3, a3 \ - VAF b2, b3, b3 \ - VAF c2, c3, c3 \ - VAF d2, d3, d3 \ - VX a3, a1, a1 \ - VX b3, b1, b1 \ - VX c3, c1, c1 \ - VX d3, d1, d1 \ - VERLLF $7, a1, a1 \ - VERLLF $7, b1, b1 \ - VERLLF $7, c1, c1 \ - VERLLF $7, d1, d1 - -#define PERMUTE(mask, v0, v1, v2, v3) \ - VPERM v0, v0, mask, v0 \ - VPERM v1, v1, mask, v1 \ - VPERM v2, v2, mask, v2 \ - VPERM v3, v3, mask, v3 - -#define ADDV(x, v0, v1, v2, v3) \ - VAF x, v0, v0 \ - VAF x, v1, v1 \ - VAF x, v2, v2 \ - VAF x, v3, v3 - -#define XORV(off, dst, src, v0, v1, v2, v3) \ - VLM off(src), M0, M3 \ - PERMUTE(BSWAP, v0, v1, v2, v3) \ - VX v0, M0, M0 \ - VX v1, M1, M1 \ - VX v2, M2, M2 \ - VX v3, M3, M3 \ - VSTM M0, M3, off(dst) - -#define SHUFFLE(a, b, c, d, t, u, v, w) \ - VMRHF a, c, t \ // t = {a[0], c[0], a[1], c[1]} - VMRHF b, d, u \ // u = {b[0], d[0], b[1], d[1]} - VMRLF a, c, v \ // v = {a[2], c[2], a[3], c[3]} - VMRLF b, d, w \ // w = {b[2], d[2], b[3], d[3]} - VMRHF t, u, a \ // a = {a[0], b[0], c[0], d[0]} - VMRLF t, u, b \ // b = {a[1], b[1], c[1], d[1]} - VMRHF v, w, c \ // c = {a[2], b[2], c[2], d[2]} - VMRLF v, w, d // d = {a[3], b[3], c[3], d[3]} - -// func xorKeyStreamVX(dst, src []byte, key *[8]uint32, nonce *[3]uint32, counter *uint32, buf *[256]byte, len *int) -TEXT ·xorKeyStreamVX(SB), NOSPLIT, $0 - MOVD $·constants<>(SB), R1 - MOVD dst+0(FP), R2 // R2=&dst[0] - LMG src+24(FP), R3, R4 // R3=&src[0] R4=len(src) - MOVD key+48(FP), R5 // R5=key - MOVD nonce+56(FP), R6 // R6=nonce - MOVD counter+64(FP), R7 // R7=counter - MOVD buf+72(FP), R8 // R8=buf - MOVD len+80(FP), R9 // R9=len - - // load BSWAP and J0 - VLM (R1), BSWAP, J0 - - // set up tail buffer - ADD $-1, R4, R12 - MOVBZ R12, R12 - CMPUBEQ R12, $255, aligned - MOVD R4, R1 - AND $~255, R1 - MOVD $(R3)(R1*1), R1 - EXRL $·mvcSrcToBuf(SB), R12 - MOVD $255, R0 - SUB R12, R0 - MOVD R0, (R9) // update len - -aligned: - // setup - MOVD $95, R0 - VLM (R5), KEY0, KEY1 - VLL R0, (R6), NONCE - VZERO M0 - VLEIB $7, $32, M0 - VSRLB M0, NONCE, NONCE - - // initialize counter values - VLREPF (R7), CTR - VZERO INC - VLEIF $1, $1, INC - VLEIF $2, $2, INC - VLEIF $3, $3, INC - VAF INC, CTR, CTR - VREPIF $4, INC - -chacha: - VREPF $0, J0, X0 - VREPF $1, J0, X1 - VREPF $2, J0, X2 - VREPF $3, J0, X3 - VREPF $0, KEY0, X4 - VREPF $1, KEY0, X5 - VREPF $2, KEY0, X6 - VREPF $3, KEY0, X7 - VREPF $0, KEY1, X8 - VREPF $1, KEY1, X9 - VREPF $2, KEY1, X10 - VREPF $3, KEY1, X11 - VLR CTR, X12 - VREPF $1, NONCE, X13 - VREPF $2, NONCE, X14 - VREPF $3, NONCE, X15 - - MOVD $(NUM_ROUNDS/2), R1 - -loop: - ROUND4(X0, X4, X12, X8, X1, X5, X13, X9, X2, X6, X14, X10, X3, X7, X15, X11) - ROUND4(X0, X5, X15, X10, X1, X6, X12, X11, X2, X7, X13, X8, X3, X4, X14, X9) - - ADD $-1, R1 - BNE loop - - // decrement length - ADD $-256, R4 - BLT tail - -continue: - // rearrange vectors - SHUFFLE(X0, X1, X2, X3, M0, M1, M2, M3) - ADDV(J0, X0, X1, X2, X3) - SHUFFLE(X4, X5, X6, X7, M0, M1, M2, M3) - ADDV(KEY0, X4, X5, X6, X7) - SHUFFLE(X8, X9, X10, X11, M0, M1, M2, M3) - ADDV(KEY1, X8, X9, X10, X11) - VAF CTR, X12, X12 - SHUFFLE(X12, X13, X14, X15, M0, M1, M2, M3) - ADDV(NONCE, X12, X13, X14, X15) - - // increment counters - VAF INC, CTR, CTR - - // xor keystream with plaintext - XORV(0*64, R2, R3, X0, X4, X8, X12) - XORV(1*64, R2, R3, X1, X5, X9, X13) - XORV(2*64, R2, R3, X2, X6, X10, X14) - XORV(3*64, R2, R3, X3, X7, X11, X15) - - // increment pointers - MOVD $256(R2), R2 - MOVD $256(R3), R3 - - CMPBNE R4, $0, chacha - CMPUBEQ R12, $255, return - EXRL $·mvcBufToDst(SB), R12 // len was updated during setup - -return: - VSTEF $0, CTR, (R7) - RET - -tail: - MOVD R2, R9 - MOVD R8, R2 - MOVD R8, R3 - MOVD $0, R4 - JMP continue - -// func hasVectorFacility() bool -TEXT ·hasVectorFacility(SB), NOSPLIT, $24-1 - MOVD $x-24(SP), R1 - XC $24, 0(R1), 0(R1) // clear the storage - MOVD $2, R0 // R0 is the number of double words stored -1 - WORD $0xB2B01000 // STFLE 0(R1) - XOR R0, R0 // reset the value of R0 - MOVBZ z-8(SP), R1 - AND $0x40, R1 - BEQ novector - -vectorinstalled: - // check if the vector instruction has been enabled - VLEIB $0, $0xF, V16 - VLGVB $0, V16, R1 - CMPBNE R1, $0xF, novector - MOVB $1, ret+0(FP) // have vx - RET - -novector: - MOVB $0, ret+0(FP) // no vx - RET diff --git a/vendor/golang.org/x/crypto/internal/chacha20/chacha_generic.go b/vendor/golang.org/x/crypto/internal/chacha20/chacha_generic.go deleted file mode 100644 index 523751f7f..000000000 --- a/vendor/golang.org/x/crypto/internal/chacha20/chacha_generic.go +++ /dev/null @@ -1,236 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package ChaCha20 implements the core ChaCha20 function as specified -// in https://tools.ietf.org/html/rfc7539#section-2.3. -package chacha20 - -import ( - "crypto/cipher" - "encoding/binary" - - "golang.org/x/crypto/internal/subtle" -) - -// assert that *Cipher implements cipher.Stream -var _ cipher.Stream = (*Cipher)(nil) - -// Cipher is a stateful instance of ChaCha20 using a particular key -// and nonce. A *Cipher implements the cipher.Stream interface. -type Cipher struct { - key [8]uint32 - counter uint32 // incremented after each block - nonce [3]uint32 - buf [bufSize]byte // buffer for unused keystream bytes - len int // number of unused keystream bytes at end of buf -} - -// New creates a new ChaCha20 stream cipher with the given key and nonce. -// The initial counter value is set to 0. -func New(key [8]uint32, nonce [3]uint32) *Cipher { - return &Cipher{key: key, nonce: nonce} -} - -// XORKeyStream XORs each byte in the given slice with a byte from the -// cipher's key stream. Dst and src must overlap entirely or not at all. -// -// If len(dst) < len(src), XORKeyStream will panic. It is acceptable -// to pass a dst bigger than src, and in that case, XORKeyStream will -// only update dst[:len(src)] and will not touch the rest of dst. -// -// Multiple calls to XORKeyStream behave as if the concatenation of -// the src buffers was passed in a single run. That is, Cipher -// maintains state and does not reset at each XORKeyStream call. -func (s *Cipher) XORKeyStream(dst, src []byte) { - if len(dst) < len(src) { - panic("chacha20: output smaller than input") - } - if subtle.InexactOverlap(dst[:len(src)], src) { - panic("chacha20: invalid buffer overlap") - } - - // xor src with buffered keystream first - if s.len != 0 { - buf := s.buf[len(s.buf)-s.len:] - if len(src) < len(buf) { - buf = buf[:len(src)] - } - td, ts := dst[:len(buf)], src[:len(buf)] // BCE hint - for i, b := range buf { - td[i] = ts[i] ^ b - } - s.len -= len(buf) - if s.len != 0 { - return - } - s.buf = [len(s.buf)]byte{} // zero the empty buffer - src = src[len(buf):] - dst = dst[len(buf):] - } - - if len(src) == 0 { - return - } - if haveAsm { - s.xorKeyStreamAsm(dst, src) - return - } - - // set up a 64-byte buffer to pad out the final block if needed - // (hoisted out of the main loop to avoid spills) - rem := len(src) % 64 // length of final block - fin := len(src) - rem // index of final block - if rem > 0 { - copy(s.buf[len(s.buf)-64:], src[fin:]) - } - - // qr calculates a quarter round - qr := func(a, b, c, d uint32) (uint32, uint32, uint32, uint32) { - a += b - d ^= a - d = (d << 16) | (d >> 16) - c += d - b ^= c - b = (b << 12) | (b >> 20) - a += b - d ^= a - d = (d << 8) | (d >> 24) - c += d - b ^= c - b = (b << 7) | (b >> 25) - return a, b, c, d - } - - // ChaCha20 constants - const ( - j0 = 0x61707865 - j1 = 0x3320646e - j2 = 0x79622d32 - j3 = 0x6b206574 - ) - - // pre-calculate most of the first round - s1, s5, s9, s13 := qr(j1, s.key[1], s.key[5], s.nonce[0]) - s2, s6, s10, s14 := qr(j2, s.key[2], s.key[6], s.nonce[1]) - s3, s7, s11, s15 := qr(j3, s.key[3], s.key[7], s.nonce[2]) - - n := len(src) - src, dst = src[:n:n], dst[:n:n] // BCE hint - for i := 0; i < n; i += 64 { - // calculate the remainder of the first round - s0, s4, s8, s12 := qr(j0, s.key[0], s.key[4], s.counter) - - // execute the second round - x0, x5, x10, x15 := qr(s0, s5, s10, s15) - x1, x6, x11, x12 := qr(s1, s6, s11, s12) - x2, x7, x8, x13 := qr(s2, s7, s8, s13) - x3, x4, x9, x14 := qr(s3, s4, s9, s14) - - // execute the remaining 18 rounds - for i := 0; i < 9; i++ { - x0, x4, x8, x12 = qr(x0, x4, x8, x12) - x1, x5, x9, x13 = qr(x1, x5, x9, x13) - x2, x6, x10, x14 = qr(x2, x6, x10, x14) - x3, x7, x11, x15 = qr(x3, x7, x11, x15) - - x0, x5, x10, x15 = qr(x0, x5, x10, x15) - x1, x6, x11, x12 = qr(x1, x6, x11, x12) - x2, x7, x8, x13 = qr(x2, x7, x8, x13) - x3, x4, x9, x14 = qr(x3, x4, x9, x14) - } - - x0 += j0 - x1 += j1 - x2 += j2 - x3 += j3 - - x4 += s.key[0] - x5 += s.key[1] - x6 += s.key[2] - x7 += s.key[3] - x8 += s.key[4] - x9 += s.key[5] - x10 += s.key[6] - x11 += s.key[7] - - x12 += s.counter - x13 += s.nonce[0] - x14 += s.nonce[1] - x15 += s.nonce[2] - - // increment the counter - s.counter += 1 - if s.counter == 0 { - panic("chacha20: counter overflow") - } - - // pad to 64 bytes if needed - in, out := src[i:], dst[i:] - if i == fin { - // src[fin:] has already been copied into s.buf before - // the main loop - in, out = s.buf[len(s.buf)-64:], s.buf[len(s.buf)-64:] - } - in, out = in[:64], out[:64] // BCE hint - - // XOR the key stream with the source and write out the result - xor(out[0:], in[0:], x0) - xor(out[4:], in[4:], x1) - xor(out[8:], in[8:], x2) - xor(out[12:], in[12:], x3) - xor(out[16:], in[16:], x4) - xor(out[20:], in[20:], x5) - xor(out[24:], in[24:], x6) - xor(out[28:], in[28:], x7) - xor(out[32:], in[32:], x8) - xor(out[36:], in[36:], x9) - xor(out[40:], in[40:], x10) - xor(out[44:], in[44:], x11) - xor(out[48:], in[48:], x12) - xor(out[52:], in[52:], x13) - xor(out[56:], in[56:], x14) - xor(out[60:], in[60:], x15) - } - // copy any trailing bytes out of the buffer and into dst - if rem != 0 { - s.len = 64 - rem - copy(dst[fin:], s.buf[len(s.buf)-64:]) - } -} - -// Advance discards bytes in the key stream until the next 64 byte block -// boundary is reached and updates the counter accordingly. If the key -// stream is already at a block boundary no bytes will be discarded and -// the counter will be unchanged. -func (s *Cipher) Advance() { - s.len -= s.len % 64 - if s.len == 0 { - s.buf = [len(s.buf)]byte{} - } -} - -// XORKeyStream crypts bytes from in to out using the given key and counters. -// In and out must overlap entirely or not at all. Counter contains the raw -// ChaCha20 counter bytes (i.e. block counter followed by nonce). -func XORKeyStream(out, in []byte, counter *[16]byte, key *[32]byte) { - s := Cipher{ - key: [8]uint32{ - binary.LittleEndian.Uint32(key[0:4]), - binary.LittleEndian.Uint32(key[4:8]), - binary.LittleEndian.Uint32(key[8:12]), - binary.LittleEndian.Uint32(key[12:16]), - binary.LittleEndian.Uint32(key[16:20]), - binary.LittleEndian.Uint32(key[20:24]), - binary.LittleEndian.Uint32(key[24:28]), - binary.LittleEndian.Uint32(key[28:32]), - }, - nonce: [3]uint32{ - binary.LittleEndian.Uint32(counter[4:8]), - binary.LittleEndian.Uint32(counter[8:12]), - binary.LittleEndian.Uint32(counter[12:16]), - }, - counter: binary.LittleEndian.Uint32(counter[0:4]), - } - s.XORKeyStream(out, in) -} diff --git a/vendor/golang.org/x/crypto/internal/chacha20/chacha_noasm.go b/vendor/golang.org/x/crypto/internal/chacha20/chacha_noasm.go deleted file mode 100644 index 91520d1de..000000000 --- a/vendor/golang.org/x/crypto/internal/chacha20/chacha_noasm.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !s390x gccgo appengine - -package chacha20 - -const ( - bufSize = 64 - haveAsm = false -) - -func (*Cipher) xorKeyStreamAsm(dst, src []byte) { - panic("not implemented") -} diff --git a/vendor/golang.org/x/crypto/internal/chacha20/chacha_s390x.go b/vendor/golang.org/x/crypto/internal/chacha20/chacha_s390x.go deleted file mode 100644 index 0c1c671c4..000000000 --- a/vendor/golang.org/x/crypto/internal/chacha20/chacha_s390x.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build s390x,!gccgo,!appengine - -package chacha20 - -var haveAsm = hasVectorFacility() - -const bufSize = 256 - -// hasVectorFacility reports whether the machine supports the vector -// facility (vx). -// Implementation in asm_s390x.s. -func hasVectorFacility() bool - -// xorKeyStreamVX is an assembly implementation of XORKeyStream. It must only -// be called when the vector facility is available. -// Implementation in asm_s390x.s. -//go:noescape -func xorKeyStreamVX(dst, src []byte, key *[8]uint32, nonce *[3]uint32, counter *uint32, buf *[256]byte, len *int) - -func (c *Cipher) xorKeyStreamAsm(dst, src []byte) { - xorKeyStreamVX(dst, src, &c.key, &c.nonce, &c.counter, &c.buf, &c.len) -} - -// EXRL targets, DO NOT CALL! -func mvcSrcToBuf() -func mvcBufToDst() diff --git a/vendor/golang.org/x/crypto/internal/chacha20/xor.go b/vendor/golang.org/x/crypto/internal/chacha20/xor.go deleted file mode 100644 index 9c5ba0b33..000000000 --- a/vendor/golang.org/x/crypto/internal/chacha20/xor.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found src the LICENSE file. - -package chacha20 - -import ( - "runtime" -) - -// Platforms that have fast unaligned 32-bit little endian accesses. -const unaligned = runtime.GOARCH == "386" || - runtime.GOARCH == "amd64" || - runtime.GOARCH == "arm64" || - runtime.GOARCH == "ppc64le" || - runtime.GOARCH == "s390x" - -// xor reads a little endian uint32 from src, XORs it with u and -// places the result in little endian byte order in dst. -func xor(dst, src []byte, u uint32) { - _, _ = src[3], dst[3] // eliminate bounds checks - if unaligned { - // The compiler should optimize this code into - // 32-bit unaligned little endian loads and stores. - // TODO: delete once the compiler does a reliably - // good job with the generic code below. - // See issue #25111 for more details. - v := uint32(src[0]) - v |= uint32(src[1]) << 8 - v |= uint32(src[2]) << 16 - v |= uint32(src[3]) << 24 - v ^= u - dst[0] = byte(v) - dst[1] = byte(v >> 8) - dst[2] = byte(v >> 16) - dst[3] = byte(v >> 24) - } else { - dst[0] = src[0] ^ byte(u) - dst[1] = src[1] ^ byte(u>>8) - dst[2] = src[2] ^ byte(u>>16) - dst[3] = src[3] ^ byte(u>>24) - } -} diff --git a/vendor/golang.org/x/crypto/openpgp/armor/armor.go b/vendor/golang.org/x/crypto/openpgp/armor/armor.go index 592d18643..36a680436 100644 --- a/vendor/golang.org/x/crypto/openpgp/armor/armor.go +++ b/vendor/golang.org/x/crypto/openpgp/armor/armor.go @@ -62,10 +62,11 @@ var armorEndOfLine = []byte("-----") // lineReader wraps a line based reader. It watches for the end of an armor // block and records the expected CRC value. type lineReader struct { - in *bufio.Reader - buf []byte - eof bool - crc uint32 + in *bufio.Reader + buf []byte + eof bool + crc uint32 + crcSet bool } func (l *lineReader) Read(p []byte) (n int, err error) { @@ -87,6 +88,11 @@ func (l *lineReader) Read(p []byte) (n int, err error) { return 0, ArmorCorrupt } + if bytes.HasPrefix(line, armorEnd) { + l.eof = true + return 0, io.EOF + } + if len(line) == 5 && line[0] == '=' { // This is the checksum line var expectedBytes [3]byte @@ -108,6 +114,7 @@ func (l *lineReader) Read(p []byte) (n int, err error) { } l.eof = true + l.crcSet = true return 0, io.EOF } @@ -141,10 +148,8 @@ func (r *openpgpReader) Read(p []byte) (n int, err error) { n, err = r.b64Reader.Read(p) r.currentCRC = crc24(r.currentCRC, p[:n]) - if err == io.EOF { - if r.lReader.crc != uint32(r.currentCRC&crc24Mask) { - return 0, ArmorCorrupt - } + if err == io.EOF && r.lReader.crcSet && r.lReader.crc != uint32(r.currentCRC&crc24Mask) { + return 0, ArmorCorrupt } return diff --git a/vendor/golang.org/x/crypto/openpgp/elgamal/elgamal.go b/vendor/golang.org/x/crypto/openpgp/elgamal/elgamal.go index 73f4fe378..72a6a7394 100644 --- a/vendor/golang.org/x/crypto/openpgp/elgamal/elgamal.go +++ b/vendor/golang.org/x/crypto/openpgp/elgamal/elgamal.go @@ -76,7 +76,9 @@ func Encrypt(random io.Reader, pub *PublicKey, msg []byte) (c1, c2 *big.Int, err // Bleichenbacher, Advances in Cryptology (Crypto '98), func Decrypt(priv *PrivateKey, c1, c2 *big.Int) (msg []byte, err error) { s := new(big.Int).Exp(c1, priv.X, priv.P) - s.ModInverse(s, priv.P) + if s.ModInverse(s, priv.P) == nil { + return nil, errors.New("elgamal: invalid private key") + } s.Mul(s, c2) s.Mod(s, priv.P) em := s.Bytes() diff --git a/vendor/golang.org/x/crypto/openpgp/keys.go b/vendor/golang.org/x/crypto/openpgp/keys.go index a79a8c13a..faa2fb369 100644 --- a/vendor/golang.org/x/crypto/openpgp/keys.go +++ b/vendor/golang.org/x/crypto/openpgp/keys.go @@ -333,7 +333,6 @@ func ReadEntity(packets *packet.Reader) (*Entity, error) { return nil, errors.StructuralError("primary key cannot be used for signatures") } - var current *Identity var revocations []*packet.Signature EachPacket: for { @@ -346,36 +345,8 @@ EachPacket: switch pkt := p.(type) { case *packet.UserId: - // Make a new Identity object, that we might wind up throwing away. - // We'll only add it if we get a valid self-signature over this - // userID. - current = new(Identity) - current.Name = pkt.Id - current.UserId = pkt - - for { - p, err = packets.Next() - if err == io.EOF { - break EachPacket - } else if err != nil { - return nil, err - } - - sig, ok := p.(*packet.Signature) - if !ok { - packets.Unread(p) - continue EachPacket - } - - if (sig.SigType == packet.SigTypePositiveCert || sig.SigType == packet.SigTypeGenericCert) && sig.IssuerKeyId != nil && *sig.IssuerKeyId == e.PrimaryKey.KeyId { - if err = e.PrimaryKey.VerifyUserIdSignature(pkt.Id, e.PrimaryKey, sig); err != nil { - return nil, errors.StructuralError("user ID self-signature invalid: " + err.Error()) - } - current.SelfSignature = sig - e.Identities[pkt.Id] = current - } else { - current.Signatures = append(current.Signatures, sig) - } + if err := addUserID(e, packets, pkt); err != nil { + return nil, err } case *packet.Signature: if pkt.SigType == packet.SigTypeKeyRevocation { @@ -384,11 +355,9 @@ EachPacket: // TODO: RFC4880 5.2.1 permits signatures // directly on keys (eg. to bind additional // revocation keys). - } else if current == nil { - return nil, errors.StructuralError("signature packet found before user id packet") - } else { - current.Signatures = append(current.Signatures, pkt) } + // Else, ignoring the signature as it does not follow anything + // we would know to attach it to. case *packet.PrivateKey: if pkt.IsSubkey == false { packets.Unread(p) @@ -429,33 +398,105 @@ EachPacket: return e, nil } +func addUserID(e *Entity, packets *packet.Reader, pkt *packet.UserId) error { + // Make a new Identity object, that we might wind up throwing away. + // We'll only add it if we get a valid self-signature over this + // userID. + identity := new(Identity) + identity.Name = pkt.Id + identity.UserId = pkt + + for { + p, err := packets.Next() + if err == io.EOF { + break + } else if err != nil { + return err + } + + sig, ok := p.(*packet.Signature) + if !ok { + packets.Unread(p) + break + } + + if (sig.SigType == packet.SigTypePositiveCert || sig.SigType == packet.SigTypeGenericCert) && sig.IssuerKeyId != nil && *sig.IssuerKeyId == e.PrimaryKey.KeyId { + if err = e.PrimaryKey.VerifyUserIdSignature(pkt.Id, e.PrimaryKey, sig); err != nil { + return errors.StructuralError("user ID self-signature invalid: " + err.Error()) + } + identity.SelfSignature = sig + e.Identities[pkt.Id] = identity + } else { + identity.Signatures = append(identity.Signatures, sig) + } + } + + return nil +} + func addSubkey(e *Entity, packets *packet.Reader, pub *packet.PublicKey, priv *packet.PrivateKey) error { var subKey Subkey subKey.PublicKey = pub subKey.PrivateKey = priv - p, err := packets.Next() - if err == io.EOF { - return io.ErrUnexpectedEOF - } - if err != nil { - return errors.StructuralError("subkey signature invalid: " + err.Error()) + + for { + p, err := packets.Next() + if err == io.EOF { + break + } else if err != nil { + return errors.StructuralError("subkey signature invalid: " + err.Error()) + } + + sig, ok := p.(*packet.Signature) + if !ok { + packets.Unread(p) + break + } + + if sig.SigType != packet.SigTypeSubkeyBinding && sig.SigType != packet.SigTypeSubkeyRevocation { + return errors.StructuralError("subkey signature with wrong type") + } + + if err := e.PrimaryKey.VerifyKeySignature(subKey.PublicKey, sig); err != nil { + return errors.StructuralError("subkey signature invalid: " + err.Error()) + } + + switch sig.SigType { + case packet.SigTypeSubkeyRevocation: + subKey.Sig = sig + case packet.SigTypeSubkeyBinding: + + if shouldReplaceSubkeySig(subKey.Sig, sig) { + subKey.Sig = sig + } + } } - var ok bool - subKey.Sig, ok = p.(*packet.Signature) - if !ok { + + if subKey.Sig == nil { return errors.StructuralError("subkey packet not followed by signature") } - if subKey.Sig.SigType != packet.SigTypeSubkeyBinding && subKey.Sig.SigType != packet.SigTypeSubkeyRevocation { - return errors.StructuralError("subkey signature with wrong type") - } - err = e.PrimaryKey.VerifyKeySignature(subKey.PublicKey, subKey.Sig) - if err != nil { - return errors.StructuralError("subkey signature invalid: " + err.Error()) - } + e.Subkeys = append(e.Subkeys, subKey) + return nil } +func shouldReplaceSubkeySig(existingSig, potentialNewSig *packet.Signature) bool { + if potentialNewSig == nil { + return false + } + + if existingSig == nil { + return true + } + + if existingSig.SigType == packet.SigTypeSubkeyRevocation { + return false // never override a revocation signature + } + + return potentialNewSig.CreationTime.After(existingSig.CreationTime) +} + const defaultRSAKeyBits = 2048 // NewEntity returns an Entity that contains a fresh RSA/RSA keypair with a @@ -463,7 +504,7 @@ const defaultRSAKeyBits = 2048 // which may be empty but must not contain any of "()<>\x00". // If config is nil, sensible defaults will be used. func NewEntity(name, comment, email string, config *packet.Config) (*Entity, error) { - currentTime := config.Now() + creationTime := config.Now() bits := defaultRSAKeyBits if config != nil && config.RSABits != 0 { @@ -484,8 +525,8 @@ func NewEntity(name, comment, email string, config *packet.Config) (*Entity, err } e := &Entity{ - PrimaryKey: packet.NewRSAPublicKey(currentTime, &signingPriv.PublicKey), - PrivateKey: packet.NewRSAPrivateKey(currentTime, signingPriv), + PrimaryKey: packet.NewRSAPublicKey(creationTime, &signingPriv.PublicKey), + PrivateKey: packet.NewRSAPrivateKey(creationTime, signingPriv), Identities: make(map[string]*Identity), } isPrimaryId := true @@ -493,7 +534,7 @@ func NewEntity(name, comment, email string, config *packet.Config) (*Entity, err Name: uid.Id, UserId: uid, SelfSignature: &packet.Signature{ - CreationTime: currentTime, + CreationTime: creationTime, SigType: packet.SigTypePositiveCert, PubKeyAlgo: packet.PubKeyAlgoRSA, Hash: config.Hash(), @@ -522,10 +563,10 @@ func NewEntity(name, comment, email string, config *packet.Config) (*Entity, err e.Subkeys = make([]Subkey, 1) e.Subkeys[0] = Subkey{ - PublicKey: packet.NewRSAPublicKey(currentTime, &encryptingPriv.PublicKey), - PrivateKey: packet.NewRSAPrivateKey(currentTime, encryptingPriv), + PublicKey: packet.NewRSAPublicKey(creationTime, &encryptingPriv.PublicKey), + PrivateKey: packet.NewRSAPrivateKey(creationTime, encryptingPriv), Sig: &packet.Signature{ - CreationTime: currentTime, + CreationTime: creationTime, SigType: packet.SigTypeSubkeyBinding, PubKeyAlgo: packet.PubKeyAlgoRSA, Hash: config.Hash(), diff --git a/vendor/golang.org/x/crypto/openpgp/packet/encrypted_key.go b/vendor/golang.org/x/crypto/openpgp/packet/encrypted_key.go index 02b372cf3..6d7639722 100644 --- a/vendor/golang.org/x/crypto/openpgp/packet/encrypted_key.go +++ b/vendor/golang.org/x/crypto/openpgp/packet/encrypted_key.go @@ -5,6 +5,7 @@ package packet import ( + "crypto" "crypto/rsa" "encoding/binary" "io" @@ -78,8 +79,9 @@ func (e *EncryptedKey) Decrypt(priv *PrivateKey, config *Config) error { // padding oracle attacks. switch priv.PubKeyAlgo { case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: - k := priv.PrivateKey.(*rsa.PrivateKey) - b, err = rsa.DecryptPKCS1v15(config.Random(), k, padToKeySize(&k.PublicKey, e.encryptedMPI1.bytes)) + // Supports both *rsa.PrivateKey and crypto.Decrypter + k := priv.PrivateKey.(crypto.Decrypter) + b, err = k.Decrypt(config.Random(), padToKeySize(k.Public().(*rsa.PublicKey), e.encryptedMPI1.bytes), nil) case PubKeyAlgoElGamal: c1 := new(big.Int).SetBytes(e.encryptedMPI1.bytes) c2 := new(big.Int).SetBytes(e.encryptedMPI2.bytes) diff --git a/vendor/golang.org/x/crypto/openpgp/packet/packet.go b/vendor/golang.org/x/crypto/openpgp/packet/packet.go index 625bb5ac8..9728d61d7 100644 --- a/vendor/golang.org/x/crypto/openpgp/packet/packet.go +++ b/vendor/golang.org/x/crypto/openpgp/packet/packet.go @@ -14,6 +14,7 @@ import ( "crypto/rsa" "io" "math/big" + "math/bits" "golang.org/x/crypto/cast5" "golang.org/x/crypto/openpgp/errors" @@ -100,33 +101,65 @@ func (r *partialLengthReader) Read(p []byte) (n int, err error) { type partialLengthWriter struct { w io.WriteCloser lengthByte [1]byte + sentFirst bool + buf []byte } +// RFC 4880 4.2.2.4: the first partial length MUST be at least 512 octets long. +const minFirstPartialWrite = 512 + func (w *partialLengthWriter) Write(p []byte) (n int, err error) { + off := 0 + if !w.sentFirst { + if len(w.buf) > 0 || len(p) < minFirstPartialWrite { + off = len(w.buf) + w.buf = append(w.buf, p...) + if len(w.buf) < minFirstPartialWrite { + return len(p), nil + } + p = w.buf + w.buf = nil + } + w.sentFirst = true + } + + power := uint8(30) for len(p) > 0 { - for power := uint(14); power < 32; power-- { - l := 1 << power - if len(p) >= l { - w.lengthByte[0] = 224 + uint8(power) - _, err = w.w.Write(w.lengthByte[:]) - if err != nil { - return - } - var m int - m, err = w.w.Write(p[:l]) - n += m - if err != nil { - return - } - p = p[l:] - break + l := 1 << power + if len(p) < l { + power = uint8(bits.Len32(uint32(len(p)))) - 1 + l = 1 << power + } + w.lengthByte[0] = 224 + power + _, err = w.w.Write(w.lengthByte[:]) + if err == nil { + var m int + m, err = w.w.Write(p[:l]) + n += m + } + if err != nil { + if n < off { + return 0, err } + return n - off, err } + p = p[l:] } - return + return n - off, nil } func (w *partialLengthWriter) Close() error { + if len(w.buf) > 0 { + // In this case we can't send a 512 byte packet. + // Just send what we have. + p := w.buf + w.sentFirst = true + w.buf = nil + if _, err := w.Write(p); err != nil { + return err + } + } + w.lengthByte[0] = 0 _, err := w.w.Write(w.lengthByte[:]) if err != nil { @@ -404,14 +437,16 @@ const ( type PublicKeyAlgorithm uint8 const ( - PubKeyAlgoRSA PublicKeyAlgorithm = 1 - PubKeyAlgoRSAEncryptOnly PublicKeyAlgorithm = 2 - PubKeyAlgoRSASignOnly PublicKeyAlgorithm = 3 - PubKeyAlgoElGamal PublicKeyAlgorithm = 16 - PubKeyAlgoDSA PublicKeyAlgorithm = 17 + PubKeyAlgoRSA PublicKeyAlgorithm = 1 + PubKeyAlgoElGamal PublicKeyAlgorithm = 16 + PubKeyAlgoDSA PublicKeyAlgorithm = 17 // RFC 6637, Section 5. PubKeyAlgoECDH PublicKeyAlgorithm = 18 PubKeyAlgoECDSA PublicKeyAlgorithm = 19 + + // Deprecated in RFC 4880, Section 13.5. Use key flags instead. + PubKeyAlgoRSAEncryptOnly PublicKeyAlgorithm = 2 + PubKeyAlgoRSASignOnly PublicKeyAlgorithm = 3 ) // CanEncrypt returns true if it's possible to encrypt a message to a public diff --git a/vendor/golang.org/x/crypto/openpgp/packet/private_key.go b/vendor/golang.org/x/crypto/openpgp/packet/private_key.go index 34734cc63..81abb7cef 100644 --- a/vendor/golang.org/x/crypto/openpgp/packet/private_key.go +++ b/vendor/golang.org/x/crypto/openpgp/packet/private_key.go @@ -31,49 +31,54 @@ type PrivateKey struct { encryptedData []byte cipher CipherFunction s2k func(out, in []byte) - PrivateKey interface{} // An *{rsa|dsa|ecdsa}.PrivateKey or a crypto.Signer. + PrivateKey interface{} // An *{rsa|dsa|ecdsa}.PrivateKey or crypto.Signer/crypto.Decrypter (Decryptor RSA only). sha1Checksum bool iv []byte } -func NewRSAPrivateKey(currentTime time.Time, priv *rsa.PrivateKey) *PrivateKey { +func NewRSAPrivateKey(creationTime time.Time, priv *rsa.PrivateKey) *PrivateKey { pk := new(PrivateKey) - pk.PublicKey = *NewRSAPublicKey(currentTime, &priv.PublicKey) + pk.PublicKey = *NewRSAPublicKey(creationTime, &priv.PublicKey) pk.PrivateKey = priv return pk } -func NewDSAPrivateKey(currentTime time.Time, priv *dsa.PrivateKey) *PrivateKey { +func NewDSAPrivateKey(creationTime time.Time, priv *dsa.PrivateKey) *PrivateKey { pk := new(PrivateKey) - pk.PublicKey = *NewDSAPublicKey(currentTime, &priv.PublicKey) + pk.PublicKey = *NewDSAPublicKey(creationTime, &priv.PublicKey) pk.PrivateKey = priv return pk } -func NewElGamalPrivateKey(currentTime time.Time, priv *elgamal.PrivateKey) *PrivateKey { +func NewElGamalPrivateKey(creationTime time.Time, priv *elgamal.PrivateKey) *PrivateKey { pk := new(PrivateKey) - pk.PublicKey = *NewElGamalPublicKey(currentTime, &priv.PublicKey) + pk.PublicKey = *NewElGamalPublicKey(creationTime, &priv.PublicKey) pk.PrivateKey = priv return pk } -func NewECDSAPrivateKey(currentTime time.Time, priv *ecdsa.PrivateKey) *PrivateKey { +func NewECDSAPrivateKey(creationTime time.Time, priv *ecdsa.PrivateKey) *PrivateKey { pk := new(PrivateKey) - pk.PublicKey = *NewECDSAPublicKey(currentTime, &priv.PublicKey) + pk.PublicKey = *NewECDSAPublicKey(creationTime, &priv.PublicKey) pk.PrivateKey = priv return pk } -// NewSignerPrivateKey creates a sign-only PrivateKey from a crypto.Signer that +// NewSignerPrivateKey creates a PrivateKey from a crypto.Signer that // implements RSA or ECDSA. -func NewSignerPrivateKey(currentTime time.Time, signer crypto.Signer) *PrivateKey { +func NewSignerPrivateKey(creationTime time.Time, signer crypto.Signer) *PrivateKey { pk := new(PrivateKey) + // In general, the public Keys should be used as pointers. We still + // type-switch on the values, for backwards-compatibility. switch pubkey := signer.Public().(type) { + case *rsa.PublicKey: + pk.PublicKey = *NewRSAPublicKey(creationTime, pubkey) case rsa.PublicKey: - pk.PublicKey = *NewRSAPublicKey(currentTime, &pubkey) - pk.PubKeyAlgo = PubKeyAlgoRSASignOnly + pk.PublicKey = *NewRSAPublicKey(creationTime, &pubkey) + case *ecdsa.PublicKey: + pk.PublicKey = *NewECDSAPublicKey(creationTime, pubkey) case ecdsa.PublicKey: - pk.PublicKey = *NewECDSAPublicKey(currentTime, &pubkey) + pk.PublicKey = *NewECDSAPublicKey(creationTime, &pubkey) default: panic("openpgp: unknown crypto.Signer type in NewSignerPrivateKey") } diff --git a/vendor/golang.org/x/crypto/openpgp/packet/signature.go b/vendor/golang.org/x/crypto/openpgp/packet/signature.go index 6ce0cbedb..b2a24a532 100644 --- a/vendor/golang.org/x/crypto/openpgp/packet/signature.go +++ b/vendor/golang.org/x/crypto/openpgp/packet/signature.go @@ -542,7 +542,7 @@ func (sig *Signature) Sign(h hash.Hash, priv *PrivateKey, config *Config) (err e r, s, err = ecdsa.Sign(config.Random(), pk, digest) } else { var b []byte - b, err = priv.PrivateKey.(crypto.Signer).Sign(config.Random(), digest, nil) + b, err = priv.PrivateKey.(crypto.Signer).Sign(config.Random(), digest, sig.Hash) if err == nil { r, s, err = unwrapECDSASig(b) } diff --git a/vendor/golang.org/x/crypto/openpgp/packet/userattribute.go b/vendor/golang.org/x/crypto/openpgp/packet/userattribute.go index 96a2b382a..d19ffbc78 100644 --- a/vendor/golang.org/x/crypto/openpgp/packet/userattribute.go +++ b/vendor/golang.org/x/crypto/openpgp/packet/userattribute.go @@ -80,7 +80,7 @@ func (uat *UserAttribute) Serialize(w io.Writer) (err error) { // ImageData returns zero or more byte slices, each containing // JPEG File Interchange Format (JFIF), for each photo in the -// the user attribute packet. +// user attribute packet. func (uat *UserAttribute) ImageData() (imageData [][]byte) { for _, sp := range uat.Contents { if sp.SubType == UserAttrImageSubpacket && len(sp.Contents) > 16 { diff --git a/vendor/golang.org/x/crypto/openpgp/write.go b/vendor/golang.org/x/crypto/openpgp/write.go index 65a304cc8..4ee71784e 100644 --- a/vendor/golang.org/x/crypto/openpgp/write.go +++ b/vendor/golang.org/x/crypto/openpgp/write.go @@ -164,12 +164,12 @@ func hashToHashId(h crypto.Hash) uint8 { return v } -// Encrypt encrypts a message to a number of recipients and, optionally, signs -// it. hints contains optional information, that is also encrypted, that aids -// the recipients in processing the message. The resulting WriteCloser must -// be closed after the contents of the file have been written. -// If config is nil, sensible defaults will be used. -func Encrypt(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) { +// writeAndSign writes the data as a payload package and, optionally, signs +// it. hints contains optional information, that is also encrypted, +// that aids the recipients in processing the message. The resulting +// WriteCloser must be closed after the contents of the file have been +// written. If config is nil, sensible defaults will be used. +func writeAndSign(payload io.WriteCloser, candidateHashes []uint8, signed *Entity, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) { var signer *packet.PrivateKey if signed != nil { signKey, ok := signed.signingKey(config.Now()) @@ -185,6 +185,83 @@ func Encrypt(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHint } } + var hash crypto.Hash + for _, hashId := range candidateHashes { + if h, ok := s2k.HashIdToHash(hashId); ok && h.Available() { + hash = h + break + } + } + + // If the hash specified by config is a candidate, we'll use that. + if configuredHash := config.Hash(); configuredHash.Available() { + for _, hashId := range candidateHashes { + if h, ok := s2k.HashIdToHash(hashId); ok && h == configuredHash { + hash = h + break + } + } + } + + if hash == 0 { + hashId := candidateHashes[0] + name, ok := s2k.HashIdToString(hashId) + if !ok { + name = "#" + strconv.Itoa(int(hashId)) + } + return nil, errors.InvalidArgumentError("cannot encrypt because no candidate hash functions are compiled in. (Wanted " + name + " in this case.)") + } + + if signer != nil { + ops := &packet.OnePassSignature{ + SigType: packet.SigTypeBinary, + Hash: hash, + PubKeyAlgo: signer.PubKeyAlgo, + KeyId: signer.KeyId, + IsLast: true, + } + if err := ops.Serialize(payload); err != nil { + return nil, err + } + } + + if hints == nil { + hints = &FileHints{} + } + + w := payload + if signer != nil { + // If we need to write a signature packet after the literal + // data then we need to stop literalData from closing + // encryptedData. + w = noOpCloser{w} + + } + var epochSeconds uint32 + if !hints.ModTime.IsZero() { + epochSeconds = uint32(hints.ModTime.Unix()) + } + literalData, err := packet.SerializeLiteral(w, hints.IsBinary, hints.FileName, epochSeconds) + if err != nil { + return nil, err + } + + if signer != nil { + return signatureWriter{payload, literalData, hash, hash.New(), signer, config}, nil + } + return literalData, nil +} + +// Encrypt encrypts a message to a number of recipients and, optionally, signs +// it. hints contains optional information, that is also encrypted, that aids +// the recipients in processing the message. The resulting WriteCloser must +// be closed after the contents of the file have been written. +// If config is nil, sensible defaults will be used. +func Encrypt(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) { + if len(to) == 0 { + return nil, errors.InvalidArgumentError("no encryption recipient provided") + } + // These are the possible ciphers that we'll use for the message. candidateCiphers := []uint8{ uint8(packet.CipherAES128), @@ -194,6 +271,7 @@ func Encrypt(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHint // These are the possible hash functions that we'll use for the signature. candidateHashes := []uint8{ hashToHashId(crypto.SHA256), + hashToHashId(crypto.SHA384), hashToHashId(crypto.SHA512), hashToHashId(crypto.SHA1), hashToHashId(crypto.RIPEMD160), @@ -241,33 +319,6 @@ func Encrypt(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHint } } - var hash crypto.Hash - for _, hashId := range candidateHashes { - if h, ok := s2k.HashIdToHash(hashId); ok && h.Available() { - hash = h - break - } - } - - // If the hash specified by config is a candidate, we'll use that. - if configuredHash := config.Hash(); configuredHash.Available() { - for _, hashId := range candidateHashes { - if h, ok := s2k.HashIdToHash(hashId); ok && h == configuredHash { - hash = h - break - } - } - } - - if hash == 0 { - hashId := candidateHashes[0] - name, ok := s2k.HashIdToString(hashId) - if !ok { - name = "#" + strconv.Itoa(int(hashId)) - } - return nil, errors.InvalidArgumentError("cannot encrypt because no candidate hash functions are compiled in. (Wanted " + name + " in this case.)") - } - symKey := make([]byte, cipher.KeySize()) if _, err := io.ReadFull(config.Random(), symKey); err != nil { return nil, err @@ -279,49 +330,38 @@ func Encrypt(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHint } } - encryptedData, err := packet.SerializeSymmetricallyEncrypted(ciphertext, cipher, symKey, config) + payload, err := packet.SerializeSymmetricallyEncrypted(ciphertext, cipher, symKey, config) if err != nil { return } - if signer != nil { - ops := &packet.OnePassSignature{ - SigType: packet.SigTypeBinary, - Hash: hash, - PubKeyAlgo: signer.PubKeyAlgo, - KeyId: signer.KeyId, - IsLast: true, - } - if err := ops.Serialize(encryptedData); err != nil { - return nil, err - } - } + return writeAndSign(payload, candidateHashes, signed, hints, config) +} - if hints == nil { - hints = &FileHints{} +// Sign signs a message. The resulting WriteCloser must be closed after the +// contents of the file have been written. hints contains optional information +// that aids the recipients in processing the message. +// If config is nil, sensible defaults will be used. +func Sign(output io.Writer, signed *Entity, hints *FileHints, config *packet.Config) (input io.WriteCloser, err error) { + if signed == nil { + return nil, errors.InvalidArgumentError("no signer provided") } - w := encryptedData - if signer != nil { - // If we need to write a signature packet after the literal - // data then we need to stop literalData from closing - // encryptedData. - w = noOpCloser{encryptedData} - - } - var epochSeconds uint32 - if !hints.ModTime.IsZero() { - epochSeconds = uint32(hints.ModTime.Unix()) - } - literalData, err := packet.SerializeLiteral(w, hints.IsBinary, hints.FileName, epochSeconds) - if err != nil { - return nil, err + // These are the possible hash functions that we'll use for the signature. + candidateHashes := []uint8{ + hashToHashId(crypto.SHA256), + hashToHashId(crypto.SHA384), + hashToHashId(crypto.SHA512), + hashToHashId(crypto.SHA1), + hashToHashId(crypto.RIPEMD160), } - - if signer != nil { - return signatureWriter{encryptedData, literalData, hash, hash.New(), signer, config}, nil + defaultHashes := candidateHashes[len(candidateHashes)-1:] + preferredHashes := signed.primaryIdentity().SelfSignature.PreferredHash + if len(preferredHashes) == 0 { + preferredHashes = defaultHashes } - return literalData, nil + candidateHashes = intersectPreferences(candidateHashes, preferredHashes) + return writeAndSign(noOpCloser{output}, candidateHashes, signed, hints, config) } // signatureWriter hashes the contents of a message while passing it along to diff --git a/vendor/golang.org/x/crypto/poly1305/bits_compat.go b/vendor/golang.org/x/crypto/poly1305/bits_compat.go new file mode 100644 index 000000000..157a69f61 --- /dev/null +++ b/vendor/golang.org/x/crypto/poly1305/bits_compat.go @@ -0,0 +1,39 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !go1.13 + +package poly1305 + +// Generic fallbacks for the math/bits intrinsics, copied from +// src/math/bits/bits.go. They were added in Go 1.12, but Add64 and Sum64 had +// variable time fallbacks until Go 1.13. + +func bitsAdd64(x, y, carry uint64) (sum, carryOut uint64) { + sum = x + y + carry + carryOut = ((x & y) | ((x | y) &^ sum)) >> 63 + return +} + +func bitsSub64(x, y, borrow uint64) (diff, borrowOut uint64) { + diff = x - y - borrow + borrowOut = ((^x & y) | (^(x ^ y) & diff)) >> 63 + return +} + +func bitsMul64(x, y uint64) (hi, lo uint64) { + const mask32 = 1<<32 - 1 + x0 := x & mask32 + x1 := x >> 32 + y0 := y & mask32 + y1 := y >> 32 + w0 := x0 * y0 + t := x1*y0 + w0>>32 + w1 := t & mask32 + w2 := t >> 32 + w1 += x0 * y1 + hi = x1*y1 + w2 + w1>>32 + lo = x * y + return +} diff --git a/vendor/golang.org/x/crypto/poly1305/bits_go1.13.go b/vendor/golang.org/x/crypto/poly1305/bits_go1.13.go new file mode 100644 index 000000000..a0a185f0f --- /dev/null +++ b/vendor/golang.org/x/crypto/poly1305/bits_go1.13.go @@ -0,0 +1,21 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.13 + +package poly1305 + +import "math/bits" + +func bitsAdd64(x, y, carry uint64) (sum, carryOut uint64) { + return bits.Add64(x, y, carry) +} + +func bitsSub64(x, y, borrow uint64) (diff, borrowOut uint64) { + return bits.Sub64(x, y, borrow) +} + +func bitsMul64(x, y uint64) (hi, lo uint64) { + return bits.Mul64(x, y) +} diff --git a/vendor/golang.org/x/crypto/poly1305/mac_noasm.go b/vendor/golang.org/x/crypto/poly1305/mac_noasm.go new file mode 100644 index 000000000..d118f30ed --- /dev/null +++ b/vendor/golang.org/x/crypto/poly1305/mac_noasm.go @@ -0,0 +1,9 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !amd64,!ppc64le,!s390x gccgo purego + +package poly1305 + +type mac struct{ macGeneric } diff --git a/vendor/golang.org/x/crypto/poly1305/poly1305.go b/vendor/golang.org/x/crypto/poly1305/poly1305.go index f562fa571..9d7a6af09 100644 --- a/vendor/golang.org/x/crypto/poly1305/poly1305.go +++ b/vendor/golang.org/x/crypto/poly1305/poly1305.go @@ -2,21 +2,19 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -/* -Package poly1305 implements Poly1305 one-time message authentication code as -specified in https://cr.yp.to/mac/poly1305-20050329.pdf. - -Poly1305 is a fast, one-time authentication function. It is infeasible for an -attacker to generate an authenticator for a message without the key. However, a -key must only be used for a single message. Authenticating two different -messages with the same key allows an attacker to forge authenticators for other -messages with the same key. - -Poly1305 was originally coupled with AES in order to make Poly1305-AES. AES was -used with a fixed key in order to generate one-time keys from an nonce. -However, in this package AES isn't used and the one-time key is specified -directly. -*/ +// Package poly1305 implements Poly1305 one-time message authentication code as +// specified in https://cr.yp.to/mac/poly1305-20050329.pdf. +// +// Poly1305 is a fast, one-time authentication function. It is infeasible for an +// attacker to generate an authenticator for a message without the key. However, a +// key must only be used for a single message. Authenticating two different +// messages with the same key allows an attacker to forge authenticators for other +// messages with the same key. +// +// Poly1305 was originally coupled with AES in order to make Poly1305-AES. AES was +// used with a fixed key in order to generate one-time keys from an nonce. +// However, in this package AES isn't used and the one-time key is specified +// directly. package poly1305 // import "golang.org/x/crypto/poly1305" import "crypto/subtle" @@ -24,10 +22,78 @@ import "crypto/subtle" // TagSize is the size, in bytes, of a poly1305 authenticator. const TagSize = 16 -// Verify returns true if mac is a valid authenticator for m with the given -// key. +// Sum generates an authenticator for msg using a one-time key and puts the +// 16-byte result into out. Authenticating two different messages with the same +// key allows an attacker to forge messages at will. +func Sum(out *[16]byte, m []byte, key *[32]byte) { + h := New(key) + h.Write(m) + h.Sum(out[:0]) +} + +// Verify returns true if mac is a valid authenticator for m with the given key. func Verify(mac *[16]byte, m []byte, key *[32]byte) bool { var tmp [16]byte Sum(&tmp, m, key) return subtle.ConstantTimeCompare(tmp[:], mac[:]) == 1 } + +// New returns a new MAC computing an authentication +// tag of all data written to it with the given key. +// This allows writing the message progressively instead +// of passing it as a single slice. Common users should use +// the Sum function instead. +// +// The key must be unique for each message, as authenticating +// two different messages with the same key allows an attacker +// to forge messages at will. +func New(key *[32]byte) *MAC { + m := &MAC{} + initialize(key, &m.macState) + return m +} + +// MAC is an io.Writer computing an authentication tag +// of the data written to it. +// +// MAC cannot be used like common hash.Hash implementations, +// because using a poly1305 key twice breaks its security. +// Therefore writing data to a running MAC after calling +// Sum or Verify causes it to panic. +type MAC struct { + mac // platform-dependent implementation + + finalized bool +} + +// Size returns the number of bytes Sum will return. +func (h *MAC) Size() int { return TagSize } + +// Write adds more data to the running message authentication code. +// It never returns an error. +// +// It must not be called after the first call of Sum or Verify. +func (h *MAC) Write(p []byte) (n int, err error) { + if h.finalized { + panic("poly1305: write to MAC after Sum or Verify") + } + return h.mac.Write(p) +} + +// Sum computes the authenticator of all data written to the +// message authentication code. +func (h *MAC) Sum(b []byte) []byte { + var mac [TagSize]byte + h.mac.Sum(&mac) + h.finalized = true + return append(b, mac[:]...) +} + +// Verify returns whether the authenticator of all data written to +// the message authentication code matches the expected value. +func (h *MAC) Verify(expected []byte) bool { + var mac [TagSize]byte + h.mac.Sum(&mac) + h.finalized = true + return subtle.ConstantTimeCompare(expected, mac[:]) == 1 +} diff --git a/vendor/golang.org/x/crypto/poly1305/sum_amd64.go b/vendor/golang.org/x/crypto/poly1305/sum_amd64.go index 4dd72fe79..99e5a1d50 100644 --- a/vendor/golang.org/x/crypto/poly1305/sum_amd64.go +++ b/vendor/golang.org/x/crypto/poly1305/sum_amd64.go @@ -2,21 +2,46 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build amd64,!gccgo,!appengine +// +build !gccgo,!purego package poly1305 -// This function is implemented in sum_amd64.s //go:noescape -func poly1305(out *[16]byte, m *byte, mlen uint64, key *[32]byte) +func update(state *macState, msg []byte) -// Sum generates an authenticator for m using a one-time key and puts the -// 16-byte result into out. Authenticating two different messages with the same -// key allows an attacker to forge messages at will. -func Sum(out *[16]byte, m []byte, key *[32]byte) { - var mPtr *byte - if len(m) > 0 { - mPtr = &m[0] +// mac is a wrapper for macGeneric that redirects calls that would have gone to +// updateGeneric to update. +// +// Its Write and Sum methods are otherwise identical to the macGeneric ones, but +// using function pointers would carry a major performance cost. +type mac struct{ macGeneric } + +func (h *mac) Write(p []byte) (int, error) { + nn := len(p) + if h.offset > 0 { + n := copy(h.buffer[h.offset:], p) + if h.offset+n < TagSize { + h.offset += n + return nn, nil + } + p = p[n:] + h.offset = 0 + update(&h.macState, h.buffer[:]) + } + if n := len(p) - (len(p) % TagSize); n > 0 { + update(&h.macState, p[:n]) + p = p[n:] + } + if len(p) > 0 { + h.offset += copy(h.buffer[h.offset:], p) + } + return nn, nil +} + +func (h *mac) Sum(out *[16]byte) { + state := h.macState + if h.offset > 0 { + update(&state, h.buffer[:h.offset]) } - poly1305(out, mPtr, uint64(len(m)), key) + finalize(out, &state.h, &state.s) } diff --git a/vendor/golang.org/x/crypto/poly1305/sum_amd64.s b/vendor/golang.org/x/crypto/poly1305/sum_amd64.s index 2edae6382..8d394a212 100644 --- a/vendor/golang.org/x/crypto/poly1305/sum_amd64.s +++ b/vendor/golang.org/x/crypto/poly1305/sum_amd64.s @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build amd64,!gccgo,!appengine +// +build !gccgo,!purego #include "textflag.h" @@ -54,24 +54,17 @@ ADCQ t3, h1; \ ADCQ $0, h2 -DATA ·poly1305Mask<>+0x00(SB)/8, $0x0FFFFFFC0FFFFFFF -DATA ·poly1305Mask<>+0x08(SB)/8, $0x0FFFFFFC0FFFFFFC -GLOBL ·poly1305Mask<>(SB), RODATA, $16 +// func update(state *[7]uint64, msg []byte) +TEXT ·update(SB), $0-32 + MOVQ state+0(FP), DI + MOVQ msg_base+8(FP), SI + MOVQ msg_len+16(FP), R15 -// func poly1305(out *[16]byte, m *byte, mlen uint64, key *[32]key) -TEXT ·poly1305(SB), $0-32 - MOVQ out+0(FP), DI - MOVQ m+8(FP), SI - MOVQ mlen+16(FP), R15 - MOVQ key+24(FP), AX - - MOVQ 0(AX), R11 - MOVQ 8(AX), R12 - ANDQ ·poly1305Mask<>(SB), R11 // r0 - ANDQ ·poly1305Mask<>+8(SB), R12 // r1 - XORQ R8, R8 // h0 - XORQ R9, R9 // h1 - XORQ R10, R10 // h2 + MOVQ 0(DI), R8 // h0 + MOVQ 8(DI), R9 // h1 + MOVQ 16(DI), R10 // h2 + MOVQ 24(DI), R11 // r0 + MOVQ 32(DI), R12 // r1 CMPQ R15, $16 JB bytes_between_0_and_15 @@ -109,17 +102,7 @@ flush_buffer: JMP multiply done: - MOVQ R8, AX - MOVQ R9, BX - SUBQ $0xFFFFFFFFFFFFFFFB, AX - SBBQ $0xFFFFFFFFFFFFFFFF, BX - SBBQ $3, R10 - CMOVQCS R8, AX - CMOVQCS R9, BX - MOVQ key+24(FP), R8 - ADDQ 16(R8), AX - ADCQ 24(R8), BX - - MOVQ AX, 0(DI) - MOVQ BX, 8(DI) + MOVQ R8, 0(DI) + MOVQ R9, 8(DI) + MOVQ R10, 16(DI) RET diff --git a/vendor/golang.org/x/crypto/poly1305/sum_arm.go b/vendor/golang.org/x/crypto/poly1305/sum_arm.go deleted file mode 100644 index 5dc321c2f..000000000 --- a/vendor/golang.org/x/crypto/poly1305/sum_arm.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build arm,!gccgo,!appengine,!nacl - -package poly1305 - -// This function is implemented in sum_arm.s -//go:noescape -func poly1305_auth_armv6(out *[16]byte, m *byte, mlen uint32, key *[32]byte) - -// Sum generates an authenticator for m using a one-time key and puts the -// 16-byte result into out. Authenticating two different messages with the same -// key allows an attacker to forge messages at will. -func Sum(out *[16]byte, m []byte, key *[32]byte) { - var mPtr *byte - if len(m) > 0 { - mPtr = &m[0] - } - poly1305_auth_armv6(out, mPtr, uint32(len(m)), key) -} diff --git a/vendor/golang.org/x/crypto/poly1305/sum_arm.s b/vendor/golang.org/x/crypto/poly1305/sum_arm.s deleted file mode 100644 index f70b4ac48..000000000 --- a/vendor/golang.org/x/crypto/poly1305/sum_arm.s +++ /dev/null @@ -1,427 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build arm,!gccgo,!appengine,!nacl - -#include "textflag.h" - -// This code was translated into a form compatible with 5a from the public -// domain source by Andrew Moon: github.com/floodyberry/poly1305-opt/blob/master/app/extensions/poly1305. - -DATA ·poly1305_init_constants_armv6<>+0x00(SB)/4, $0x3ffffff -DATA ·poly1305_init_constants_armv6<>+0x04(SB)/4, $0x3ffff03 -DATA ·poly1305_init_constants_armv6<>+0x08(SB)/4, $0x3ffc0ff -DATA ·poly1305_init_constants_armv6<>+0x0c(SB)/4, $0x3f03fff -DATA ·poly1305_init_constants_armv6<>+0x10(SB)/4, $0x00fffff -GLOBL ·poly1305_init_constants_armv6<>(SB), 8, $20 - -// Warning: the linker may use R11 to synthesize certain instructions. Please -// take care and verify that no synthetic instructions use it. - -TEXT poly1305_init_ext_armv6<>(SB), NOSPLIT, $0 - // Needs 16 bytes of stack and 64 bytes of space pointed to by R0. (It - // might look like it's only 60 bytes of space but the final four bytes - // will be written by another function.) We need to skip over four - // bytes of stack because that's saving the value of 'g'. - ADD $4, R13, R8 - MOVM.IB [R4-R7], (R8) - MOVM.IA.W (R1), [R2-R5] - MOVW $·poly1305_init_constants_armv6<>(SB), R7 - MOVW R2, R8 - MOVW R2>>26, R9 - MOVW R3>>20, g - MOVW R4>>14, R11 - MOVW R5>>8, R12 - ORR R3<<6, R9, R9 - ORR R4<<12, g, g - ORR R5<<18, R11, R11 - MOVM.IA (R7), [R2-R6] - AND R8, R2, R2 - AND R9, R3, R3 - AND g, R4, R4 - AND R11, R5, R5 - AND R12, R6, R6 - MOVM.IA.W [R2-R6], (R0) - EOR R2, R2, R2 - EOR R3, R3, R3 - EOR R4, R4, R4 - EOR R5, R5, R5 - EOR R6, R6, R6 - MOVM.IA.W [R2-R6], (R0) - MOVM.IA.W (R1), [R2-R5] - MOVM.IA [R2-R6], (R0) - ADD $20, R13, R0 - MOVM.DA (R0), [R4-R7] - RET - -#define MOVW_UNALIGNED(Rsrc, Rdst, Rtmp, offset) \ - MOVBU (offset+0)(Rsrc), Rtmp; \ - MOVBU Rtmp, (offset+0)(Rdst); \ - MOVBU (offset+1)(Rsrc), Rtmp; \ - MOVBU Rtmp, (offset+1)(Rdst); \ - MOVBU (offset+2)(Rsrc), Rtmp; \ - MOVBU Rtmp, (offset+2)(Rdst); \ - MOVBU (offset+3)(Rsrc), Rtmp; \ - MOVBU Rtmp, (offset+3)(Rdst) - -TEXT poly1305_blocks_armv6<>(SB), NOSPLIT, $0 - // Needs 24 bytes of stack for saved registers and then 88 bytes of - // scratch space after that. We assume that 24 bytes at (R13) have - // already been used: four bytes for the link register saved in the - // prelude of poly1305_auth_armv6, four bytes for saving the value of g - // in that function and 16 bytes of scratch space used around - // poly1305_finish_ext_armv6_skip1. - ADD $24, R13, R12 - MOVM.IB [R4-R8, R14], (R12) - MOVW R0, 88(R13) - MOVW R1, 92(R13) - MOVW R2, 96(R13) - MOVW R1, R14 - MOVW R2, R12 - MOVW 56(R0), R8 - WORD $0xe1180008 // TST R8, R8 not working see issue 5921 - EOR R6, R6, R6 - MOVW.EQ $(1<<24), R6 - MOVW R6, 84(R13) - ADD $116, R13, g - MOVM.IA (R0), [R0-R9] - MOVM.IA [R0-R4], (g) - CMP $16, R12 - BLO poly1305_blocks_armv6_done - -poly1305_blocks_armv6_mainloop: - WORD $0xe31e0003 // TST R14, #3 not working see issue 5921 - BEQ poly1305_blocks_armv6_mainloop_aligned - ADD $100, R13, g - MOVW_UNALIGNED(R14, g, R0, 0) - MOVW_UNALIGNED(R14, g, R0, 4) - MOVW_UNALIGNED(R14, g, R0, 8) - MOVW_UNALIGNED(R14, g, R0, 12) - MOVM.IA (g), [R0-R3] - ADD $16, R14 - B poly1305_blocks_armv6_mainloop_loaded - -poly1305_blocks_armv6_mainloop_aligned: - MOVM.IA.W (R14), [R0-R3] - -poly1305_blocks_armv6_mainloop_loaded: - MOVW R0>>26, g - MOVW R1>>20, R11 - MOVW R2>>14, R12 - MOVW R14, 92(R13) - MOVW R3>>8, R4 - ORR R1<<6, g, g - ORR R2<<12, R11, R11 - ORR R3<<18, R12, R12 - BIC $0xfc000000, R0, R0 - BIC $0xfc000000, g, g - MOVW 84(R13), R3 - BIC $0xfc000000, R11, R11 - BIC $0xfc000000, R12, R12 - ADD R0, R5, R5 - ADD g, R6, R6 - ORR R3, R4, R4 - ADD R11, R7, R7 - ADD $116, R13, R14 - ADD R12, R8, R8 - ADD R4, R9, R9 - MOVM.IA (R14), [R0-R4] - MULLU R4, R5, (R11, g) - MULLU R3, R5, (R14, R12) - MULALU R3, R6, (R11, g) - MULALU R2, R6, (R14, R12) - MULALU R2, R7, (R11, g) - MULALU R1, R7, (R14, R12) - ADD R4<<2, R4, R4 - ADD R3<<2, R3, R3 - MULALU R1, R8, (R11, g) - MULALU R0, R8, (R14, R12) - MULALU R0, R9, (R11, g) - MULALU R4, R9, (R14, R12) - MOVW g, 76(R13) - MOVW R11, 80(R13) - MOVW R12, 68(R13) - MOVW R14, 72(R13) - MULLU R2, R5, (R11, g) - MULLU R1, R5, (R14, R12) - MULALU R1, R6, (R11, g) - MULALU R0, R6, (R14, R12) - MULALU R0, R7, (R11, g) - MULALU R4, R7, (R14, R12) - ADD R2<<2, R2, R2 - ADD R1<<2, R1, R1 - MULALU R4, R8, (R11, g) - MULALU R3, R8, (R14, R12) - MULALU R3, R9, (R11, g) - MULALU R2, R9, (R14, R12) - MOVW g, 60(R13) - MOVW R11, 64(R13) - MOVW R12, 52(R13) - MOVW R14, 56(R13) - MULLU R0, R5, (R11, g) - MULALU R4, R6, (R11, g) - MULALU R3, R7, (R11, g) - MULALU R2, R8, (R11, g) - MULALU R1, R9, (R11, g) - ADD $52, R13, R0 - MOVM.IA (R0), [R0-R7] - MOVW g>>26, R12 - MOVW R4>>26, R14 - ORR R11<<6, R12, R12 - ORR R5<<6, R14, R14 - BIC $0xfc000000, g, g - BIC $0xfc000000, R4, R4 - ADD.S R12, R0, R0 - ADC $0, R1, R1 - ADD.S R14, R6, R6 - ADC $0, R7, R7 - MOVW R0>>26, R12 - MOVW R6>>26, R14 - ORR R1<<6, R12, R12 - ORR R7<<6, R14, R14 - BIC $0xfc000000, R0, R0 - BIC $0xfc000000, R6, R6 - ADD R14<<2, R14, R14 - ADD.S R12, R2, R2 - ADC $0, R3, R3 - ADD R14, g, g - MOVW R2>>26, R12 - MOVW g>>26, R14 - ORR R3<<6, R12, R12 - BIC $0xfc000000, g, R5 - BIC $0xfc000000, R2, R7 - ADD R12, R4, R4 - ADD R14, R0, R0 - MOVW R4>>26, R12 - BIC $0xfc000000, R4, R8 - ADD R12, R6, R9 - MOVW 96(R13), R12 - MOVW 92(R13), R14 - MOVW R0, R6 - CMP $32, R12 - SUB $16, R12, R12 - MOVW R12, 96(R13) - BHS poly1305_blocks_armv6_mainloop - -poly1305_blocks_armv6_done: - MOVW 88(R13), R12 - MOVW R5, 20(R12) - MOVW R6, 24(R12) - MOVW R7, 28(R12) - MOVW R8, 32(R12) - MOVW R9, 36(R12) - ADD $48, R13, R0 - MOVM.DA (R0), [R4-R8, R14] - RET - -#define MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp) \ - MOVBU.P 1(Rsrc), Rtmp; \ - MOVBU.P Rtmp, 1(Rdst); \ - MOVBU.P 1(Rsrc), Rtmp; \ - MOVBU.P Rtmp, 1(Rdst) - -#define MOVWP_UNALIGNED(Rsrc, Rdst, Rtmp) \ - MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp); \ - MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp) - -// func poly1305_auth_armv6(out *[16]byte, m *byte, mlen uint32, key *[32]key) -TEXT ·poly1305_auth_armv6(SB), $196-16 - // The value 196, just above, is the sum of 64 (the size of the context - // structure) and 132 (the amount of stack needed). - // - // At this point, the stack pointer (R13) has been moved down. It - // points to the saved link register and there's 196 bytes of free - // space above it. - // - // The stack for this function looks like: - // - // +--------------------- - // | - // | 64 bytes of context structure - // | - // +--------------------- - // | - // | 112 bytes for poly1305_blocks_armv6 - // | - // +--------------------- - // | 16 bytes of final block, constructed at - // | poly1305_finish_ext_armv6_skip8 - // +--------------------- - // | four bytes of saved 'g' - // +--------------------- - // | lr, saved by prelude <- R13 points here - // +--------------------- - MOVW g, 4(R13) - - MOVW out+0(FP), R4 - MOVW m+4(FP), R5 - MOVW mlen+8(FP), R6 - MOVW key+12(FP), R7 - - ADD $136, R13, R0 // 136 = 4 + 4 + 16 + 112 - MOVW R7, R1 - - // poly1305_init_ext_armv6 will write to the stack from R13+4, but - // that's ok because none of the other values have been written yet. - BL poly1305_init_ext_armv6<>(SB) - BIC.S $15, R6, R2 - BEQ poly1305_auth_armv6_noblocks - ADD $136, R13, R0 - MOVW R5, R1 - ADD R2, R5, R5 - SUB R2, R6, R6 - BL poly1305_blocks_armv6<>(SB) - -poly1305_auth_armv6_noblocks: - ADD $136, R13, R0 - MOVW R5, R1 - MOVW R6, R2 - MOVW R4, R3 - - MOVW R0, R5 - MOVW R1, R6 - MOVW R2, R7 - MOVW R3, R8 - AND.S R2, R2, R2 - BEQ poly1305_finish_ext_armv6_noremaining - EOR R0, R0 - ADD $8, R13, R9 // 8 = offset to 16 byte scratch space - MOVW R0, (R9) - MOVW R0, 4(R9) - MOVW R0, 8(R9) - MOVW R0, 12(R9) - WORD $0xe3110003 // TST R1, #3 not working see issue 5921 - BEQ poly1305_finish_ext_armv6_aligned - WORD $0xe3120008 // TST R2, #8 not working see issue 5921 - BEQ poly1305_finish_ext_armv6_skip8 - MOVWP_UNALIGNED(R1, R9, g) - MOVWP_UNALIGNED(R1, R9, g) - -poly1305_finish_ext_armv6_skip8: - WORD $0xe3120004 // TST $4, R2 not working see issue 5921 - BEQ poly1305_finish_ext_armv6_skip4 - MOVWP_UNALIGNED(R1, R9, g) - -poly1305_finish_ext_armv6_skip4: - WORD $0xe3120002 // TST $2, R2 not working see issue 5921 - BEQ poly1305_finish_ext_armv6_skip2 - MOVHUP_UNALIGNED(R1, R9, g) - B poly1305_finish_ext_armv6_skip2 - -poly1305_finish_ext_armv6_aligned: - WORD $0xe3120008 // TST R2, #8 not working see issue 5921 - BEQ poly1305_finish_ext_armv6_skip8_aligned - MOVM.IA.W (R1), [g-R11] - MOVM.IA.W [g-R11], (R9) - -poly1305_finish_ext_armv6_skip8_aligned: - WORD $0xe3120004 // TST $4, R2 not working see issue 5921 - BEQ poly1305_finish_ext_armv6_skip4_aligned - MOVW.P 4(R1), g - MOVW.P g, 4(R9) - -poly1305_finish_ext_armv6_skip4_aligned: - WORD $0xe3120002 // TST $2, R2 not working see issue 5921 - BEQ poly1305_finish_ext_armv6_skip2 - MOVHU.P 2(R1), g - MOVH.P g, 2(R9) - -poly1305_finish_ext_armv6_skip2: - WORD $0xe3120001 // TST $1, R2 not working see issue 5921 - BEQ poly1305_finish_ext_armv6_skip1 - MOVBU.P 1(R1), g - MOVBU.P g, 1(R9) - -poly1305_finish_ext_armv6_skip1: - MOVW $1, R11 - MOVBU R11, 0(R9) - MOVW R11, 56(R5) - MOVW R5, R0 - ADD $8, R13, R1 - MOVW $16, R2 - BL poly1305_blocks_armv6<>(SB) - -poly1305_finish_ext_armv6_noremaining: - MOVW 20(R5), R0 - MOVW 24(R5), R1 - MOVW 28(R5), R2 - MOVW 32(R5), R3 - MOVW 36(R5), R4 - MOVW R4>>26, R12 - BIC $0xfc000000, R4, R4 - ADD R12<<2, R12, R12 - ADD R12, R0, R0 - MOVW R0>>26, R12 - BIC $0xfc000000, R0, R0 - ADD R12, R1, R1 - MOVW R1>>26, R12 - BIC $0xfc000000, R1, R1 - ADD R12, R2, R2 - MOVW R2>>26, R12 - BIC $0xfc000000, R2, R2 - ADD R12, R3, R3 - MOVW R3>>26, R12 - BIC $0xfc000000, R3, R3 - ADD R12, R4, R4 - ADD $5, R0, R6 - MOVW R6>>26, R12 - BIC $0xfc000000, R6, R6 - ADD R12, R1, R7 - MOVW R7>>26, R12 - BIC $0xfc000000, R7, R7 - ADD R12, R2, g - MOVW g>>26, R12 - BIC $0xfc000000, g, g - ADD R12, R3, R11 - MOVW $-(1<<26), R12 - ADD R11>>26, R12, R12 - BIC $0xfc000000, R11, R11 - ADD R12, R4, R9 - MOVW R9>>31, R12 - SUB $1, R12 - AND R12, R6, R6 - AND R12, R7, R7 - AND R12, g, g - AND R12, R11, R11 - AND R12, R9, R9 - MVN R12, R12 - AND R12, R0, R0 - AND R12, R1, R1 - AND R12, R2, R2 - AND R12, R3, R3 - AND R12, R4, R4 - ORR R6, R0, R0 - ORR R7, R1, R1 - ORR g, R2, R2 - ORR R11, R3, R3 - ORR R9, R4, R4 - ORR R1<<26, R0, R0 - MOVW R1>>6, R1 - ORR R2<<20, R1, R1 - MOVW R2>>12, R2 - ORR R3<<14, R2, R2 - MOVW R3>>18, R3 - ORR R4<<8, R3, R3 - MOVW 40(R5), R6 - MOVW 44(R5), R7 - MOVW 48(R5), g - MOVW 52(R5), R11 - ADD.S R6, R0, R0 - ADC.S R7, R1, R1 - ADC.S g, R2, R2 - ADC.S R11, R3, R3 - MOVM.IA [R0-R3], (R8) - MOVW R5, R12 - EOR R0, R0, R0 - EOR R1, R1, R1 - EOR R2, R2, R2 - EOR R3, R3, R3 - EOR R4, R4, R4 - EOR R5, R5, R5 - EOR R6, R6, R6 - EOR R7, R7, R7 - MOVM.IA.W [R0-R7], (R12) - MOVM.IA [R0-R7], (R12) - MOVW 4(R13), g - RET diff --git a/vendor/golang.org/x/crypto/poly1305/sum_generic.go b/vendor/golang.org/x/crypto/poly1305/sum_generic.go new file mode 100644 index 000000000..c942a6590 --- /dev/null +++ b/vendor/golang.org/x/crypto/poly1305/sum_generic.go @@ -0,0 +1,310 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file provides the generic implementation of Sum and MAC. Other files +// might provide optimized assembly implementations of some of this code. + +package poly1305 + +import "encoding/binary" + +// Poly1305 [RFC 7539] is a relatively simple algorithm: the authentication tag +// for a 64 bytes message is approximately +// +// s + m[0:16] * r⁴ + m[16:32] * r³ + m[32:48] * r² + m[48:64] * r mod 2¹³⁰ - 5 +// +// for some secret r and s. It can be computed sequentially like +// +// for len(msg) > 0: +// h += read(msg, 16) +// h *= r +// h %= 2¹³⁰ - 5 +// return h + s +// +// All the complexity is about doing performant constant-time math on numbers +// larger than any available numeric type. + +func sumGeneric(out *[TagSize]byte, msg []byte, key *[32]byte) { + h := newMACGeneric(key) + h.Write(msg) + h.Sum(out) +} + +func newMACGeneric(key *[32]byte) macGeneric { + m := macGeneric{} + initialize(key, &m.macState) + return m +} + +// macState holds numbers in saturated 64-bit little-endian limbs. That is, +// the value of [x0, x1, x2] is x[0] + x[1] * 2⁶⁴ + x[2] * 2¹²⁸. +type macState struct { + // h is the main accumulator. It is to be interpreted modulo 2¹³⁰ - 5, but + // can grow larger during and after rounds. It must, however, remain below + // 2 * (2¹³⁰ - 5). + h [3]uint64 + // r and s are the private key components. + r [2]uint64 + s [2]uint64 +} + +type macGeneric struct { + macState + + buffer [TagSize]byte + offset int +} + +// Write splits the incoming message into TagSize chunks, and passes them to +// update. It buffers incomplete chunks. +func (h *macGeneric) Write(p []byte) (int, error) { + nn := len(p) + if h.offset > 0 { + n := copy(h.buffer[h.offset:], p) + if h.offset+n < TagSize { + h.offset += n + return nn, nil + } + p = p[n:] + h.offset = 0 + updateGeneric(&h.macState, h.buffer[:]) + } + if n := len(p) - (len(p) % TagSize); n > 0 { + updateGeneric(&h.macState, p[:n]) + p = p[n:] + } + if len(p) > 0 { + h.offset += copy(h.buffer[h.offset:], p) + } + return nn, nil +} + +// Sum flushes the last incomplete chunk from the buffer, if any, and generates +// the MAC output. It does not modify its state, in order to allow for multiple +// calls to Sum, even if no Write is allowed after Sum. +func (h *macGeneric) Sum(out *[TagSize]byte) { + state := h.macState + if h.offset > 0 { + updateGeneric(&state, h.buffer[:h.offset]) + } + finalize(out, &state.h, &state.s) +} + +// [rMask0, rMask1] is the specified Poly1305 clamping mask in little-endian. It +// clears some bits of the secret coefficient to make it possible to implement +// multiplication more efficiently. +const ( + rMask0 = 0x0FFFFFFC0FFFFFFF + rMask1 = 0x0FFFFFFC0FFFFFFC +) + +// initialize loads the 256-bit key into the two 128-bit secret values r and s. +func initialize(key *[32]byte, m *macState) { + m.r[0] = binary.LittleEndian.Uint64(key[0:8]) & rMask0 + m.r[1] = binary.LittleEndian.Uint64(key[8:16]) & rMask1 + m.s[0] = binary.LittleEndian.Uint64(key[16:24]) + m.s[1] = binary.LittleEndian.Uint64(key[24:32]) +} + +// uint128 holds a 128-bit number as two 64-bit limbs, for use with the +// bits.Mul64 and bits.Add64 intrinsics. +type uint128 struct { + lo, hi uint64 +} + +func mul64(a, b uint64) uint128 { + hi, lo := bitsMul64(a, b) + return uint128{lo, hi} +} + +func add128(a, b uint128) uint128 { + lo, c := bitsAdd64(a.lo, b.lo, 0) + hi, c := bitsAdd64(a.hi, b.hi, c) + if c != 0 { + panic("poly1305: unexpected overflow") + } + return uint128{lo, hi} +} + +func shiftRightBy2(a uint128) uint128 { + a.lo = a.lo>>2 | (a.hi&3)<<62 + a.hi = a.hi >> 2 + return a +} + +// updateGeneric absorbs msg into the state.h accumulator. For each chunk m of +// 128 bits of message, it computes +// +// h₊ = (h + m) * r mod 2¹³⁰ - 5 +// +// If the msg length is not a multiple of TagSize, it assumes the last +// incomplete chunk is the final one. +func updateGeneric(state *macState, msg []byte) { + h0, h1, h2 := state.h[0], state.h[1], state.h[2] + r0, r1 := state.r[0], state.r[1] + + for len(msg) > 0 { + var c uint64 + + // For the first step, h + m, we use a chain of bits.Add64 intrinsics. + // The resulting value of h might exceed 2¹³⁰ - 5, but will be partially + // reduced at the end of the multiplication below. + // + // The spec requires us to set a bit just above the message size, not to + // hide leading zeroes. For full chunks, that's 1 << 128, so we can just + // add 1 to the most significant (2¹²⁸) limb, h2. + if len(msg) >= TagSize { + h0, c = bitsAdd64(h0, binary.LittleEndian.Uint64(msg[0:8]), 0) + h1, c = bitsAdd64(h1, binary.LittleEndian.Uint64(msg[8:16]), c) + h2 += c + 1 + + msg = msg[TagSize:] + } else { + var buf [TagSize]byte + copy(buf[:], msg) + buf[len(msg)] = 1 + + h0, c = bitsAdd64(h0, binary.LittleEndian.Uint64(buf[0:8]), 0) + h1, c = bitsAdd64(h1, binary.LittleEndian.Uint64(buf[8:16]), c) + h2 += c + + msg = nil + } + + // Multiplication of big number limbs is similar to elementary school + // columnar multiplication. Instead of digits, there are 64-bit limbs. + // + // We are multiplying a 3 limbs number, h, by a 2 limbs number, r. + // + // h2 h1 h0 x + // r1 r0 = + // ---------------- + // h2r0 h1r0 h0r0 <-- individual 128-bit products + // + h2r1 h1r1 h0r1 + // ------------------------ + // m3 m2 m1 m0 <-- result in 128-bit overlapping limbs + // ------------------------ + // m3.hi m2.hi m1.hi m0.hi <-- carry propagation + // + m3.lo m2.lo m1.lo m0.lo + // ------------------------------- + // t4 t3 t2 t1 t0 <-- final result in 64-bit limbs + // + // The main difference from pen-and-paper multiplication is that we do + // carry propagation in a separate step, as if we wrote two digit sums + // at first (the 128-bit limbs), and then carried the tens all at once. + + h0r0 := mul64(h0, r0) + h1r0 := mul64(h1, r0) + h2r0 := mul64(h2, r0) + h0r1 := mul64(h0, r1) + h1r1 := mul64(h1, r1) + h2r1 := mul64(h2, r1) + + // Since h2 is known to be at most 7 (5 + 1 + 1), and r0 and r1 have their + // top 4 bits cleared by rMask{0,1}, we know that their product is not going + // to overflow 64 bits, so we can ignore the high part of the products. + // + // This also means that the product doesn't have a fifth limb (t4). + if h2r0.hi != 0 { + panic("poly1305: unexpected overflow") + } + if h2r1.hi != 0 { + panic("poly1305: unexpected overflow") + } + + m0 := h0r0 + m1 := add128(h1r0, h0r1) // These two additions don't overflow thanks again + m2 := add128(h2r0, h1r1) // to the 4 masked bits at the top of r0 and r1. + m3 := h2r1 + + t0 := m0.lo + t1, c := bitsAdd64(m1.lo, m0.hi, 0) + t2, c := bitsAdd64(m2.lo, m1.hi, c) + t3, _ := bitsAdd64(m3.lo, m2.hi, c) + + // Now we have the result as 4 64-bit limbs, and we need to reduce it + // modulo 2¹³⁰ - 5. The special shape of this Crandall prime lets us do + // a cheap partial reduction according to the reduction identity + // + // c * 2¹³⁰ + n = c * 5 + n mod 2¹³⁰ - 5 + // + // because 2¹³⁰ = 5 mod 2¹³⁰ - 5. Partial reduction since the result is + // likely to be larger than 2¹³⁰ - 5, but still small enough to fit the + // assumptions we make about h in the rest of the code. + // + // See also https://speakerdeck.com/gtank/engineering-prime-numbers?slide=23 + + // We split the final result at the 2¹³⁰ mark into h and cc, the carry. + // Note that the carry bits are effectively shifted left by 2, in other + // words, cc = c * 4 for the c in the reduction identity. + h0, h1, h2 = t0, t1, t2&maskLow2Bits + cc := uint128{t2 & maskNotLow2Bits, t3} + + // To add c * 5 to h, we first add cc = c * 4, and then add (cc >> 2) = c. + + h0, c = bitsAdd64(h0, cc.lo, 0) + h1, c = bitsAdd64(h1, cc.hi, c) + h2 += c + + cc = shiftRightBy2(cc) + + h0, c = bitsAdd64(h0, cc.lo, 0) + h1, c = bitsAdd64(h1, cc.hi, c) + h2 += c + + // h2 is at most 3 + 1 + 1 = 5, making the whole of h at most + // + // 5 * 2¹²⁸ + (2¹²⁸ - 1) = 6 * 2¹²⁸ - 1 + } + + state.h[0], state.h[1], state.h[2] = h0, h1, h2 +} + +const ( + maskLow2Bits uint64 = 0x0000000000000003 + maskNotLow2Bits uint64 = ^maskLow2Bits +) + +// select64 returns x if v == 1 and y if v == 0, in constant time. +func select64(v, x, y uint64) uint64 { return ^(v-1)&x | (v-1)&y } + +// [p0, p1, p2] is 2¹³⁰ - 5 in little endian order. +const ( + p0 = 0xFFFFFFFFFFFFFFFB + p1 = 0xFFFFFFFFFFFFFFFF + p2 = 0x0000000000000003 +) + +// finalize completes the modular reduction of h and computes +// +// out = h + s mod 2¹²⁸ +// +func finalize(out *[TagSize]byte, h *[3]uint64, s *[2]uint64) { + h0, h1, h2 := h[0], h[1], h[2] + + // After the partial reduction in updateGeneric, h might be more than + // 2¹³⁰ - 5, but will be less than 2 * (2¹³⁰ - 5). To complete the reduction + // in constant time, we compute t = h - (2¹³⁰ - 5), and select h as the + // result if the subtraction underflows, and t otherwise. + + hMinusP0, b := bitsSub64(h0, p0, 0) + hMinusP1, b := bitsSub64(h1, p1, b) + _, b = bitsSub64(h2, p2, b) + + // h = h if h < p else h - p + h0 = select64(b, h0, hMinusP0) + h1 = select64(b, h1, hMinusP1) + + // Finally, we compute the last Poly1305 step + // + // tag = h + s mod 2¹²⁸ + // + // by just doing a wide addition with the 128 low bits of h and discarding + // the overflow. + h0, c := bitsAdd64(h0, s[0], 0) + h1, _ = bitsAdd64(h1, s[1], c) + + binary.LittleEndian.PutUint64(out[0:8], h0) + binary.LittleEndian.PutUint64(out[8:16], h1) +} diff --git a/vendor/golang.org/x/crypto/poly1305/sum_noasm.go b/vendor/golang.org/x/crypto/poly1305/sum_noasm.go deleted file mode 100644 index 751eec527..000000000 --- a/vendor/golang.org/x/crypto/poly1305/sum_noasm.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build s390x,!go1.11 !arm,!amd64,!s390x gccgo appengine nacl - -package poly1305 - -// Sum generates an authenticator for msg using a one-time key and puts the -// 16-byte result into out. Authenticating two different messages with the same -// key allows an attacker to forge messages at will. -func Sum(out *[TagSize]byte, msg []byte, key *[32]byte) { - sumGeneric(out, msg, key) -} diff --git a/vendor/golang.org/x/crypto/poly1305/sum_ppc64le.go b/vendor/golang.org/x/crypto/poly1305/sum_ppc64le.go new file mode 100644 index 000000000..2e7a120b1 --- /dev/null +++ b/vendor/golang.org/x/crypto/poly1305/sum_ppc64le.go @@ -0,0 +1,47 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo,!purego + +package poly1305 + +//go:noescape +func update(state *macState, msg []byte) + +// mac is a wrapper for macGeneric that redirects calls that would have gone to +// updateGeneric to update. +// +// Its Write and Sum methods are otherwise identical to the macGeneric ones, but +// using function pointers would carry a major performance cost. +type mac struct{ macGeneric } + +func (h *mac) Write(p []byte) (int, error) { + nn := len(p) + if h.offset > 0 { + n := copy(h.buffer[h.offset:], p) + if h.offset+n < TagSize { + h.offset += n + return nn, nil + } + p = p[n:] + h.offset = 0 + update(&h.macState, h.buffer[:]) + } + if n := len(p) - (len(p) % TagSize); n > 0 { + update(&h.macState, p[:n]) + p = p[n:] + } + if len(p) > 0 { + h.offset += copy(h.buffer[h.offset:], p) + } + return nn, nil +} + +func (h *mac) Sum(out *[16]byte) { + state := h.macState + if h.offset > 0 { + update(&state, h.buffer[:h.offset]) + } + finalize(out, &state.h, &state.s) +} diff --git a/vendor/golang.org/x/crypto/poly1305/sum_ppc64le.s b/vendor/golang.org/x/crypto/poly1305/sum_ppc64le.s new file mode 100644 index 000000000..4e0281387 --- /dev/null +++ b/vendor/golang.org/x/crypto/poly1305/sum_ppc64le.s @@ -0,0 +1,181 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo,!purego + +#include "textflag.h" + +// This was ported from the amd64 implementation. + +#define POLY1305_ADD(msg, h0, h1, h2, t0, t1, t2) \ + MOVD (msg), t0; \ + MOVD 8(msg), t1; \ + MOVD $1, t2; \ + ADDC t0, h0, h0; \ + ADDE t1, h1, h1; \ + ADDE t2, h2; \ + ADD $16, msg + +#define POLY1305_MUL(h0, h1, h2, r0, r1, t0, t1, t2, t3, t4, t5) \ + MULLD r0, h0, t0; \ + MULLD r0, h1, t4; \ + MULHDU r0, h0, t1; \ + MULHDU r0, h1, t5; \ + ADDC t4, t1, t1; \ + MULLD r0, h2, t2; \ + ADDZE t5; \ + MULHDU r1, h0, t4; \ + MULLD r1, h0, h0; \ + ADD t5, t2, t2; \ + ADDC h0, t1, t1; \ + MULLD h2, r1, t3; \ + ADDZE t4, h0; \ + MULHDU r1, h1, t5; \ + MULLD r1, h1, t4; \ + ADDC t4, t2, t2; \ + ADDE t5, t3, t3; \ + ADDC h0, t2, t2; \ + MOVD $-4, t4; \ + MOVD t0, h0; \ + MOVD t1, h1; \ + ADDZE t3; \ + ANDCC $3, t2, h2; \ + AND t2, t4, t0; \ + ADDC t0, h0, h0; \ + ADDE t3, h1, h1; \ + SLD $62, t3, t4; \ + SRD $2, t2; \ + ADDZE h2; \ + OR t4, t2, t2; \ + SRD $2, t3; \ + ADDC t2, h0, h0; \ + ADDE t3, h1, h1; \ + ADDZE h2 + +DATA ·poly1305Mask<>+0x00(SB)/8, $0x0FFFFFFC0FFFFFFF +DATA ·poly1305Mask<>+0x08(SB)/8, $0x0FFFFFFC0FFFFFFC +GLOBL ·poly1305Mask<>(SB), RODATA, $16 + +// func update(state *[7]uint64, msg []byte) +TEXT ·update(SB), $0-32 + MOVD state+0(FP), R3 + MOVD msg_base+8(FP), R4 + MOVD msg_len+16(FP), R5 + + MOVD 0(R3), R8 // h0 + MOVD 8(R3), R9 // h1 + MOVD 16(R3), R10 // h2 + MOVD 24(R3), R11 // r0 + MOVD 32(R3), R12 // r1 + + CMP R5, $16 + BLT bytes_between_0_and_15 + +loop: + POLY1305_ADD(R4, R8, R9, R10, R20, R21, R22) + +multiply: + POLY1305_MUL(R8, R9, R10, R11, R12, R16, R17, R18, R14, R20, R21) + ADD $-16, R5 + CMP R5, $16 + BGE loop + +bytes_between_0_and_15: + CMP $0, R5 + BEQ done + MOVD $0, R16 // h0 + MOVD $0, R17 // h1 + +flush_buffer: + CMP R5, $8 + BLE just1 + + MOVD $8, R21 + SUB R21, R5, R21 + + // Greater than 8 -- load the rightmost remaining bytes in msg + // and put into R17 (h1) + MOVD (R4)(R21), R17 + MOVD $16, R22 + + // Find the offset to those bytes + SUB R5, R22, R22 + SLD $3, R22 + + // Shift to get only the bytes in msg + SRD R22, R17, R17 + + // Put 1 at high end + MOVD $1, R23 + SLD $3, R21 + SLD R21, R23, R23 + OR R23, R17, R17 + + // Remainder is 8 + MOVD $8, R5 + +just1: + CMP R5, $8 + BLT less8 + + // Exactly 8 + MOVD (R4), R16 + + CMP $0, R17 + + // Check if we've already set R17; if not + // set 1 to indicate end of msg. + BNE carry + MOVD $1, R17 + BR carry + +less8: + MOVD $0, R16 // h0 + MOVD $0, R22 // shift count + CMP R5, $4 + BLT less4 + MOVWZ (R4), R16 + ADD $4, R4 + ADD $-4, R5 + MOVD $32, R22 + +less4: + CMP R5, $2 + BLT less2 + MOVHZ (R4), R21 + SLD R22, R21, R21 + OR R16, R21, R16 + ADD $16, R22 + ADD $-2, R5 + ADD $2, R4 + +less2: + CMP $0, R5 + BEQ insert1 + MOVBZ (R4), R21 + SLD R22, R21, R21 + OR R16, R21, R16 + ADD $8, R22 + +insert1: + // Insert 1 at end of msg + MOVD $1, R21 + SLD R22, R21, R21 + OR R16, R21, R16 + +carry: + // Add new values to h0, h1, h2 + ADDC R16, R8 + ADDE R17, R9 + ADDE $0, R10 + MOVD $16, R5 + ADD R5, R4 + BR multiply + +done: + // Save h0, h1, h2 in state + MOVD R8, 0(R3) + MOVD R9, 8(R3) + MOVD R10, 16(R3) + RET diff --git a/vendor/golang.org/x/crypto/poly1305/sum_ref.go b/vendor/golang.org/x/crypto/poly1305/sum_ref.go deleted file mode 100644 index c4d59bd09..000000000 --- a/vendor/golang.org/x/crypto/poly1305/sum_ref.go +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package poly1305 - -import "encoding/binary" - -// sumGeneric generates an authenticator for msg using a one-time key and -// puts the 16-byte result into out. This is the generic implementation of -// Sum and should be called if no assembly implementation is available. -func sumGeneric(out *[TagSize]byte, msg []byte, key *[32]byte) { - var ( - h0, h1, h2, h3, h4 uint32 // the hash accumulators - r0, r1, r2, r3, r4 uint64 // the r part of the key - ) - - r0 = uint64(binary.LittleEndian.Uint32(key[0:]) & 0x3ffffff) - r1 = uint64((binary.LittleEndian.Uint32(key[3:]) >> 2) & 0x3ffff03) - r2 = uint64((binary.LittleEndian.Uint32(key[6:]) >> 4) & 0x3ffc0ff) - r3 = uint64((binary.LittleEndian.Uint32(key[9:]) >> 6) & 0x3f03fff) - r4 = uint64((binary.LittleEndian.Uint32(key[12:]) >> 8) & 0x00fffff) - - R1, R2, R3, R4 := r1*5, r2*5, r3*5, r4*5 - - for len(msg) >= TagSize { - // h += msg - h0 += binary.LittleEndian.Uint32(msg[0:]) & 0x3ffffff - h1 += (binary.LittleEndian.Uint32(msg[3:]) >> 2) & 0x3ffffff - h2 += (binary.LittleEndian.Uint32(msg[6:]) >> 4) & 0x3ffffff - h3 += (binary.LittleEndian.Uint32(msg[9:]) >> 6) & 0x3ffffff - h4 += (binary.LittleEndian.Uint32(msg[12:]) >> 8) | (1 << 24) - - // h *= r - d0 := (uint64(h0) * r0) + (uint64(h1) * R4) + (uint64(h2) * R3) + (uint64(h3) * R2) + (uint64(h4) * R1) - d1 := (d0 >> 26) + (uint64(h0) * r1) + (uint64(h1) * r0) + (uint64(h2) * R4) + (uint64(h3) * R3) + (uint64(h4) * R2) - d2 := (d1 >> 26) + (uint64(h0) * r2) + (uint64(h1) * r1) + (uint64(h2) * r0) + (uint64(h3) * R4) + (uint64(h4) * R3) - d3 := (d2 >> 26) + (uint64(h0) * r3) + (uint64(h1) * r2) + (uint64(h2) * r1) + (uint64(h3) * r0) + (uint64(h4) * R4) - d4 := (d3 >> 26) + (uint64(h0) * r4) + (uint64(h1) * r3) + (uint64(h2) * r2) + (uint64(h3) * r1) + (uint64(h4) * r0) - - // h %= p - h0 = uint32(d0) & 0x3ffffff - h1 = uint32(d1) & 0x3ffffff - h2 = uint32(d2) & 0x3ffffff - h3 = uint32(d3) & 0x3ffffff - h4 = uint32(d4) & 0x3ffffff - - h0 += uint32(d4>>26) * 5 - h1 += h0 >> 26 - h0 = h0 & 0x3ffffff - - msg = msg[TagSize:] - } - - if len(msg) > 0 { - var block [TagSize]byte - off := copy(block[:], msg) - block[off] = 0x01 - - // h += msg - h0 += binary.LittleEndian.Uint32(block[0:]) & 0x3ffffff - h1 += (binary.LittleEndian.Uint32(block[3:]) >> 2) & 0x3ffffff - h2 += (binary.LittleEndian.Uint32(block[6:]) >> 4) & 0x3ffffff - h3 += (binary.LittleEndian.Uint32(block[9:]) >> 6) & 0x3ffffff - h4 += (binary.LittleEndian.Uint32(block[12:]) >> 8) - - // h *= r - d0 := (uint64(h0) * r0) + (uint64(h1) * R4) + (uint64(h2) * R3) + (uint64(h3) * R2) + (uint64(h4) * R1) - d1 := (d0 >> 26) + (uint64(h0) * r1) + (uint64(h1) * r0) + (uint64(h2) * R4) + (uint64(h3) * R3) + (uint64(h4) * R2) - d2 := (d1 >> 26) + (uint64(h0) * r2) + (uint64(h1) * r1) + (uint64(h2) * r0) + (uint64(h3) * R4) + (uint64(h4) * R3) - d3 := (d2 >> 26) + (uint64(h0) * r3) + (uint64(h1) * r2) + (uint64(h2) * r1) + (uint64(h3) * r0) + (uint64(h4) * R4) - d4 := (d3 >> 26) + (uint64(h0) * r4) + (uint64(h1) * r3) + (uint64(h2) * r2) + (uint64(h3) * r1) + (uint64(h4) * r0) - - // h %= p - h0 = uint32(d0) & 0x3ffffff - h1 = uint32(d1) & 0x3ffffff - h2 = uint32(d2) & 0x3ffffff - h3 = uint32(d3) & 0x3ffffff - h4 = uint32(d4) & 0x3ffffff - - h0 += uint32(d4>>26) * 5 - h1 += h0 >> 26 - h0 = h0 & 0x3ffffff - } - - // h %= p reduction - h2 += h1 >> 26 - h1 &= 0x3ffffff - h3 += h2 >> 26 - h2 &= 0x3ffffff - h4 += h3 >> 26 - h3 &= 0x3ffffff - h0 += 5 * (h4 >> 26) - h4 &= 0x3ffffff - h1 += h0 >> 26 - h0 &= 0x3ffffff - - // h - p - t0 := h0 + 5 - t1 := h1 + (t0 >> 26) - t2 := h2 + (t1 >> 26) - t3 := h3 + (t2 >> 26) - t4 := h4 + (t3 >> 26) - (1 << 26) - t0 &= 0x3ffffff - t1 &= 0x3ffffff - t2 &= 0x3ffffff - t3 &= 0x3ffffff - - // select h if h < p else h - p - t_mask := (t4 >> 31) - 1 - h_mask := ^t_mask - h0 = (h0 & h_mask) | (t0 & t_mask) - h1 = (h1 & h_mask) | (t1 & t_mask) - h2 = (h2 & h_mask) | (t2 & t_mask) - h3 = (h3 & h_mask) | (t3 & t_mask) - h4 = (h4 & h_mask) | (t4 & t_mask) - - // h %= 2^128 - h0 |= h1 << 26 - h1 = ((h1 >> 6) | (h2 << 20)) - h2 = ((h2 >> 12) | (h3 << 14)) - h3 = ((h3 >> 18) | (h4 << 8)) - - // s: the s part of the key - // tag = (h + s) % (2^128) - t := uint64(h0) + uint64(binary.LittleEndian.Uint32(key[16:])) - h0 = uint32(t) - t = uint64(h1) + uint64(binary.LittleEndian.Uint32(key[20:])) + (t >> 32) - h1 = uint32(t) - t = uint64(h2) + uint64(binary.LittleEndian.Uint32(key[24:])) + (t >> 32) - h2 = uint32(t) - t = uint64(h3) + uint64(binary.LittleEndian.Uint32(key[28:])) + (t >> 32) - h3 = uint32(t) - - binary.LittleEndian.PutUint32(out[0:], h0) - binary.LittleEndian.PutUint32(out[4:], h1) - binary.LittleEndian.PutUint32(out[8:], h2) - binary.LittleEndian.PutUint32(out[12:], h3) -} diff --git a/vendor/golang.org/x/crypto/poly1305/sum_s390x.go b/vendor/golang.org/x/crypto/poly1305/sum_s390x.go index 7a266cece..958fedc07 100644 --- a/vendor/golang.org/x/crypto/poly1305/sum_s390x.go +++ b/vendor/golang.org/x/crypto/poly1305/sum_s390x.go @@ -2,48 +2,74 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build s390x,go1.11,!gccgo,!appengine +// +build !gccgo,!purego package poly1305 -// hasVectorFacility reports whether the machine supports -// the vector facility (vx). -func hasVectorFacility() bool +import ( + "golang.org/x/sys/cpu" +) -// hasVMSLFacility reports whether the machine supports -// Vector Multiply Sum Logical (VMSL). -func hasVMSLFacility() bool - -var hasVX = hasVectorFacility() -var hasVMSL = hasVMSLFacility() - -// poly1305vx is an assembly implementation of Poly1305 that uses vector +// updateVX is an assembly implementation of Poly1305 that uses vector // instructions. It must only be called if the vector facility (vx) is // available. //go:noescape -func poly1305vx(out *[16]byte, m *byte, mlen uint64, key *[32]byte) +func updateVX(state *macState, msg []byte) -// poly1305vmsl is an assembly implementation of Poly1305 that uses vector -// instructions, including VMSL. It must only be called if the vector facility (vx) is -// available and if VMSL is supported. -//go:noescape -func poly1305vmsl(out *[16]byte, m *byte, mlen uint64, key *[32]byte) - -// Sum generates an authenticator for m using a one-time key and puts the -// 16-byte result into out. Authenticating two different messages with the same -// key allows an attacker to forge messages at will. -func Sum(out *[16]byte, m []byte, key *[32]byte) { - if hasVX { - var mPtr *byte - if len(m) > 0 { - mPtr = &m[0] +// mac is a replacement for macGeneric that uses a larger buffer and redirects +// calls that would have gone to updateGeneric to updateVX if the vector +// facility is installed. +// +// A larger buffer is required for good performance because the vector +// implementation has a higher fixed cost per call than the generic +// implementation. +type mac struct { + macState + + buffer [16 * TagSize]byte // size must be a multiple of block size (16) + offset int +} + +func (h *mac) Write(p []byte) (int, error) { + nn := len(p) + if h.offset > 0 { + n := copy(h.buffer[h.offset:], p) + if h.offset+n < len(h.buffer) { + h.offset += n + return nn, nil + } + p = p[n:] + h.offset = 0 + if cpu.S390X.HasVX { + updateVX(&h.macState, h.buffer[:]) + } else { + updateGeneric(&h.macState, h.buffer[:]) } - if hasVMSL && len(m) > 256 { - poly1305vmsl(out, mPtr, uint64(len(m)), key) + } + + tail := len(p) % len(h.buffer) // number of bytes to copy into buffer + body := len(p) - tail // number of bytes to process now + if body > 0 { + if cpu.S390X.HasVX { + updateVX(&h.macState, p[:body]) } else { - poly1305vx(out, mPtr, uint64(len(m)), key) + updateGeneric(&h.macState, p[:body]) } - } else { - sumGeneric(out, m, key) } + h.offset = copy(h.buffer[:], p[body:]) // copy tail bytes - can be 0 + return nn, nil +} + +func (h *mac) Sum(out *[TagSize]byte) { + state := h.macState + remainder := h.buffer[:h.offset] + + // Use the generic implementation if we have 2 or fewer blocks left + // to sum. The vector implementation has a higher startup time. + if cpu.S390X.HasVX && len(remainder) > 2*TagSize { + updateVX(&state, remainder) + } else if len(remainder) > 0 { + updateGeneric(&state, remainder) + } + finalize(out, &state.h, &state.s) } diff --git a/vendor/golang.org/x/crypto/poly1305/sum_s390x.s b/vendor/golang.org/x/crypto/poly1305/sum_s390x.s index 356c07a6c..0fa9ee6e0 100644 --- a/vendor/golang.org/x/crypto/poly1305/sum_s390x.s +++ b/vendor/golang.org/x/crypto/poly1305/sum_s390x.s @@ -2,115 +2,187 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build s390x,go1.11,!gccgo,!appengine +// +build !gccgo,!purego #include "textflag.h" -// Implementation of Poly1305 using the vector facility (vx). - -// constants -#define MOD26 V0 -#define EX0 V1 -#define EX1 V2 -#define EX2 V3 - -// temporaries -#define T_0 V4 -#define T_1 V5 -#define T_2 V6 -#define T_3 V7 -#define T_4 V8 - -// key (r) -#define R_0 V9 -#define R_1 V10 -#define R_2 V11 -#define R_3 V12 -#define R_4 V13 -#define R5_1 V14 -#define R5_2 V15 -#define R5_3 V16 -#define R5_4 V17 -#define RSAVE_0 R5 -#define RSAVE_1 R6 -#define RSAVE_2 R7 -#define RSAVE_3 R8 -#define RSAVE_4 R9 -#define R5SAVE_1 V28 -#define R5SAVE_2 V29 -#define R5SAVE_3 V30 -#define R5SAVE_4 V31 - -// message block -#define F_0 V18 -#define F_1 V19 -#define F_2 V20 -#define F_3 V21 -#define F_4 V22 - -// accumulator -#define H_0 V23 -#define H_1 V24 -#define H_2 V25 -#define H_3 V26 -#define H_4 V27 - -GLOBL ·keyMask<>(SB), RODATA, $16 -DATA ·keyMask<>+0(SB)/8, $0xffffff0ffcffff0f -DATA ·keyMask<>+8(SB)/8, $0xfcffff0ffcffff0f - -GLOBL ·bswapMask<>(SB), RODATA, $16 -DATA ·bswapMask<>+0(SB)/8, $0x0f0e0d0c0b0a0908 -DATA ·bswapMask<>+8(SB)/8, $0x0706050403020100 - -GLOBL ·constants<>(SB), RODATA, $64 -// MOD26 -DATA ·constants<>+0(SB)/8, $0x3ffffff -DATA ·constants<>+8(SB)/8, $0x3ffffff +// This implementation of Poly1305 uses the vector facility (vx) +// to process up to 2 blocks (32 bytes) per iteration using an +// algorithm based on the one described in: +// +// NEON crypto, Daniel J. Bernstein & Peter Schwabe +// https://cryptojedi.org/papers/neoncrypto-20120320.pdf +// +// This algorithm uses 5 26-bit limbs to represent a 130-bit +// value. These limbs are, for the most part, zero extended and +// placed into 64-bit vector register elements. Each vector +// register is 128-bits wide and so holds 2 of these elements. +// Using 26-bit limbs allows us plenty of headroom to accomodate +// accumulations before and after multiplication without +// overflowing either 32-bits (before multiplication) or 64-bits +// (after multiplication). +// +// In order to parallelise the operations required to calculate +// the sum we use two separate accumulators and then sum those +// in an extra final step. For compatibility with the generic +// implementation we perform this summation at the end of every +// updateVX call. +// +// To use two accumulators we must multiply the message blocks +// by r² rather than r. Only the final message block should be +// multiplied by r. +// +// Example: +// +// We want to calculate the sum (h) for a 64 byte message (m): +// +// h = m[0:16]r⁴ + m[16:32]r³ + m[32:48]r² + m[48:64]r +// +// To do this we split the calculation into the even indices +// and odd indices of the message. These form our SIMD 'lanes': +// +// h = m[ 0:16]r⁴ + m[32:48]r² + <- lane 0 +// m[16:32]r³ + m[48:64]r <- lane 1 +// +// To calculate this iteratively we refactor so that both lanes +// are written in terms of r² and r: +// +// h = (m[ 0:16]r² + m[32:48])r² + <- lane 0 +// (m[16:32]r² + m[48:64])r <- lane 1 +// ^ ^ +// | coefficients for second iteration +// coefficients for first iteration +// +// So in this case we would have two iterations. In the first +// both lanes are multiplied by r². In the second only the +// first lane is multiplied by r² and the second lane is +// instead multiplied by r. This gives use the odd and even +// powers of r that we need from the original equation. +// +// Notation: +// +// h - accumulator +// r - key +// m - message +// +// [a, b] - SIMD register holding two 64-bit values +// [a, b, c, d] - SIMD register holding four 32-bit values +// xᵢ[n] - limb n of variable x with bit width i +// +// Limbs are expressed in little endian order, so for 26-bit +// limbs x₂₆[4] will be the most significant limb and x₂₆[0] +// will be the least significant limb. + +// masking constants +#define MOD24 V0 // [0x0000000000ffffff, 0x0000000000ffffff] - mask low 24-bits +#define MOD26 V1 // [0x0000000003ffffff, 0x0000000003ffffff] - mask low 26-bits + +// expansion constants (see EXPAND macro) +#define EX0 V2 +#define EX1 V3 +#define EX2 V4 + +// key (r², r or 1 depending on context) +#define R_0 V5 +#define R_1 V6 +#define R_2 V7 +#define R_3 V8 +#define R_4 V9 + +// precalculated coefficients (5r², 5r or 0 depending on context) +#define R5_1 V10 +#define R5_2 V11 +#define R5_3 V12 +#define R5_4 V13 + +// message block (m) +#define M_0 V14 +#define M_1 V15 +#define M_2 V16 +#define M_3 V17 +#define M_4 V18 + +// accumulator (h) +#define H_0 V19 +#define H_1 V20 +#define H_2 V21 +#define H_3 V22 +#define H_4 V23 + +// temporary registers (for short-lived values) +#define T_0 V24 +#define T_1 V25 +#define T_2 V26 +#define T_3 V27 +#define T_4 V28 + +GLOBL ·constants<>(SB), RODATA, $0x30 // EX0 -DATA ·constants<>+16(SB)/8, $0x0006050403020100 -DATA ·constants<>+24(SB)/8, $0x1016151413121110 +DATA ·constants<>+0x00(SB)/8, $0x0006050403020100 +DATA ·constants<>+0x08(SB)/8, $0x1016151413121110 // EX1 -DATA ·constants<>+32(SB)/8, $0x060c0b0a09080706 -DATA ·constants<>+40(SB)/8, $0x161c1b1a19181716 +DATA ·constants<>+0x10(SB)/8, $0x060c0b0a09080706 +DATA ·constants<>+0x18(SB)/8, $0x161c1b1a19181716 // EX2 -DATA ·constants<>+48(SB)/8, $0x0d0d0d0d0d0f0e0d -DATA ·constants<>+56(SB)/8, $0x1d1d1d1d1d1f1e1d - -// h = (f*g) % (2**130-5) [partial reduction] +DATA ·constants<>+0x20(SB)/8, $0x0d0d0d0d0d0f0e0d +DATA ·constants<>+0x28(SB)/8, $0x1d1d1d1d1d1f1e1d + +// MULTIPLY multiplies each lane of f and g, partially reduced +// modulo 2¹³⁰ - 5. The result, h, consists of partial products +// in each lane that need to be reduced further to produce the +// final result. +// +// h₁₃₀ = (f₁₃₀g₁₃₀) % 2¹³⁰ + (5f₁₃₀g₁₃₀) / 2¹³⁰ +// +// Note that the multiplication by 5 of the high bits is +// achieved by precalculating the multiplication of four of the +// g coefficients by 5. These are g51-g54. #define MULTIPLY(f0, f1, f2, f3, f4, g0, g1, g2, g3, g4, g51, g52, g53, g54, h0, h1, h2, h3, h4) \ VMLOF f0, g0, h0 \ - VMLOF f0, g1, h1 \ - VMLOF f0, g2, h2 \ VMLOF f0, g3, h3 \ + VMLOF f0, g1, h1 \ VMLOF f0, g4, h4 \ + VMLOF f0, g2, h2 \ VMLOF f1, g54, T_0 \ - VMLOF f1, g0, T_1 \ - VMLOF f1, g1, T_2 \ VMLOF f1, g2, T_3 \ + VMLOF f1, g0, T_1 \ VMLOF f1, g3, T_4 \ + VMLOF f1, g1, T_2 \ VMALOF f2, g53, h0, h0 \ - VMALOF f2, g54, h1, h1 \ - VMALOF f2, g0, h2, h2 \ VMALOF f2, g1, h3, h3 \ + VMALOF f2, g54, h1, h1 \ VMALOF f2, g2, h4, h4 \ + VMALOF f2, g0, h2, h2 \ VMALOF f3, g52, T_0, T_0 \ - VMALOF f3, g53, T_1, T_1 \ - VMALOF f3, g54, T_2, T_2 \ VMALOF f3, g0, T_3, T_3 \ + VMALOF f3, g53, T_1, T_1 \ VMALOF f3, g1, T_4, T_4 \ + VMALOF f3, g54, T_2, T_2 \ VMALOF f4, g51, h0, h0 \ - VMALOF f4, g52, h1, h1 \ - VMALOF f4, g53, h2, h2 \ VMALOF f4, g54, h3, h3 \ + VMALOF f4, g52, h1, h1 \ VMALOF f4, g0, h4, h4 \ + VMALOF f4, g53, h2, h2 \ VAG T_0, h0, h0 \ - VAG T_1, h1, h1 \ - VAG T_2, h2, h2 \ VAG T_3, h3, h3 \ - VAG T_4, h4, h4 - -// carry h0->h1 h3->h4, h1->h2 h4->h0, h0->h1 h2->h3, h3->h4 + VAG T_1, h1, h1 \ + VAG T_4, h4, h4 \ + VAG T_2, h2, h2 + +// REDUCE performs the following carry operations in four +// stages, as specified in Bernstein & Schwabe: +// +// 1: h₂₆[0]->h₂₆[1] h₂₆[3]->h₂₆[4] +// 2: h₂₆[1]->h₂₆[2] h₂₆[4]->h₂₆[0] +// 3: h₂₆[0]->h₂₆[1] h₂₆[2]->h₂₆[3] +// 4: h₂₆[3]->h₂₆[4] +// +// The result is that all of the limbs are limited to 26-bits +// except for h₂₆[1] and h₂₆[4] which are limited to 27-bits. +// +// Note that although each limb is aligned at 26-bit intervals +// they may contain values that exceed 2²⁶ - 1, hence the need +// to carry the excess bits in each limb. #define REDUCE(h0, h1, h2, h3, h4) \ VESRLG $26, h0, T_0 \ VESRLG $26, h3, T_1 \ @@ -136,144 +208,155 @@ DATA ·constants<>+56(SB)/8, $0x1d1d1d1d1d1f1e1d VN MOD26, h3, h3 \ VAG T_2, h4, h4 -// expand in0 into d[0] and in1 into d[1] +// EXPAND splits the 128-bit little-endian values in0 and in1 +// into 26-bit big-endian limbs and places the results into +// the first and second lane of d₂₆[0:4] respectively. +// +// The EX0, EX1 and EX2 constants are arrays of byte indices +// for permutation. The permutation both reverses the bytes +// in the input and ensures the bytes are copied into the +// destination limb ready to be shifted into their final +// position. #define EXPAND(in0, in1, d0, d1, d2, d3, d4) \ - VGBM $0x0707, d1 \ // d1=tmp - VPERM in0, in1, EX2, d4 \ VPERM in0, in1, EX0, d0 \ VPERM in0, in1, EX1, d2 \ - VN d1, d4, d4 \ + VPERM in0, in1, EX2, d4 \ VESRLG $26, d0, d1 \ VESRLG $30, d2, d3 \ VESRLG $4, d2, d2 \ - VN MOD26, d0, d0 \ - VN MOD26, d1, d1 \ - VN MOD26, d2, d2 \ - VN MOD26, d3, d3 - -// pack h4:h0 into h1:h0 (no carry) -#define PACK(h0, h1, h2, h3, h4) \ - VESLG $26, h1, h1 \ - VESLG $26, h3, h3 \ - VO h0, h1, h0 \ - VO h2, h3, h2 \ - VESLG $4, h2, h2 \ - VLEIB $7, $48, h1 \ - VSLB h1, h2, h2 \ - VO h0, h2, h0 \ - VLEIB $7, $104, h1 \ - VSLB h1, h4, h3 \ - VO h3, h0, h0 \ - VLEIB $7, $24, h1 \ - VSRLB h1, h4, h1 - -// if h > 2**130-5 then h -= 2**130-5 -#define MOD(h0, h1, t0, t1, t2) \ - VZERO t0 \ - VLEIG $1, $5, t0 \ - VACCQ h0, t0, t1 \ - VAQ h0, t0, t0 \ - VONE t2 \ - VLEIG $1, $-4, t2 \ - VAQ t2, t1, t1 \ - VACCQ h1, t1, t1 \ - VONE t2 \ - VAQ t2, t1, t1 \ - VN h0, t1, t2 \ - VNC t0, t1, t1 \ - VO t1, t2, h0 - -// func poly1305vx(out *[16]byte, m *byte, mlen uint64, key *[32]key) -TEXT ·poly1305vx(SB), $0-32 - // This code processes up to 2 blocks (32 bytes) per iteration - // using the algorithm described in: - // NEON crypto, Daniel J. Bernstein & Peter Schwabe - // https://cryptojedi.org/papers/neoncrypto-20120320.pdf - LMG out+0(FP), R1, R4 // R1=out, R2=m, R3=mlen, R4=key - - // load MOD26, EX0, EX1 and EX2 + VN MOD26, d0, d0 \ // [in0₂₆[0], in1₂₆[0]] + VN MOD26, d3, d3 \ // [in0₂₆[3], in1₂₆[3]] + VN MOD26, d1, d1 \ // [in0₂₆[1], in1₂₆[1]] + VN MOD24, d4, d4 \ // [in0₂₆[4], in1₂₆[4]] + VN MOD26, d2, d2 // [in0₂₆[2], in1₂₆[2]] + +// func updateVX(state *macState, msg []byte) +TEXT ·updateVX(SB), NOSPLIT, $0 + MOVD state+0(FP), R1 + LMG msg+8(FP), R2, R3 // R2=msg_base, R3=msg_len + + // load EX0, EX1 and EX2 MOVD $·constants<>(SB), R5 - VLM (R5), MOD26, EX2 - - // setup r - VL (R4), T_0 - MOVD $·keyMask<>(SB), R6 - VL (R6), T_1 - VN T_0, T_1, T_0 - EXPAND(T_0, T_0, R_0, R_1, R_2, R_3, R_4) - - // setup r*5 - VLEIG $0, $5, T_0 - VLEIG $1, $5, T_0 - - // store r (for final block) - VMLOF T_0, R_1, R5SAVE_1 - VMLOF T_0, R_2, R5SAVE_2 - VMLOF T_0, R_3, R5SAVE_3 - VMLOF T_0, R_4, R5SAVE_4 - VLGVG $0, R_0, RSAVE_0 - VLGVG $0, R_1, RSAVE_1 - VLGVG $0, R_2, RSAVE_2 - VLGVG $0, R_3, RSAVE_3 - VLGVG $0, R_4, RSAVE_4 - - // skip r**2 calculation + VLM (R5), EX0, EX2 + + // generate masks + VGMG $(64-24), $63, MOD24 // [0x00ffffff, 0x00ffffff] + VGMG $(64-26), $63, MOD26 // [0x03ffffff, 0x03ffffff] + + // load h (accumulator) and r (key) from state + VZERO T_1 // [0, 0] + VL 0(R1), T_0 // [h₆₄[0], h₆₄[1]] + VLEG $0, 16(R1), T_1 // [h₆₄[2], 0] + VL 24(R1), T_2 // [r₆₄[0], r₆₄[1]] + VPDI $0, T_0, T_2, T_3 // [h₆₄[0], r₆₄[0]] + VPDI $5, T_0, T_2, T_4 // [h₆₄[1], r₆₄[1]] + + // unpack h and r into 26-bit limbs + // note: h₆₄[2] may have the low 3 bits set, so h₂₆[4] is a 27-bit value + VN MOD26, T_3, H_0 // [h₂₆[0], r₂₆[0]] + VZERO H_1 // [0, 0] + VZERO H_3 // [0, 0] + VGMG $(64-12-14), $(63-12), T_0 // [0x03fff000, 0x03fff000] - 26-bit mask with low 12 bits masked out + VESLG $24, T_1, T_1 // [h₆₄[2]<<24, 0] + VERIMG $-26&63, T_3, MOD26, H_1 // [h₂₆[1], r₂₆[1]] + VESRLG $+52&63, T_3, H_2 // [h₂₆[2], r₂₆[2]] - low 12 bits only + VERIMG $-14&63, T_4, MOD26, H_3 // [h₂₆[1], r₂₆[1]] + VESRLG $40, T_4, H_4 // [h₂₆[4], r₂₆[4]] - low 24 bits only + VERIMG $+12&63, T_4, T_0, H_2 // [h₂₆[2], r₂₆[2]] - complete + VO T_1, H_4, H_4 // [h₂₆[4], r₂₆[4]] - complete + + // replicate r across all 4 vector elements + VREPF $3, H_0, R_0 // [r₂₆[0], r₂₆[0], r₂₆[0], r₂₆[0]] + VREPF $3, H_1, R_1 // [r₂₆[1], r₂₆[1], r₂₆[1], r₂₆[1]] + VREPF $3, H_2, R_2 // [r₂₆[2], r₂₆[2], r₂₆[2], r₂₆[2]] + VREPF $3, H_3, R_3 // [r₂₆[3], r₂₆[3], r₂₆[3], r₂₆[3]] + VREPF $3, H_4, R_4 // [r₂₆[4], r₂₆[4], r₂₆[4], r₂₆[4]] + + // zero out lane 1 of h + VLEIG $1, $0, H_0 // [h₂₆[0], 0] + VLEIG $1, $0, H_1 // [h₂₆[1], 0] + VLEIG $1, $0, H_2 // [h₂₆[2], 0] + VLEIG $1, $0, H_3 // [h₂₆[3], 0] + VLEIG $1, $0, H_4 // [h₂₆[4], 0] + + // calculate 5r (ignore least significant limb) + VREPIF $5, T_0 + VMLF T_0, R_1, R5_1 // [5r₂₆[1], 5r₂₆[1], 5r₂₆[1], 5r₂₆[1]] + VMLF T_0, R_2, R5_2 // [5r₂₆[2], 5r₂₆[2], 5r₂₆[2], 5r₂₆[2]] + VMLF T_0, R_3, R5_3 // [5r₂₆[3], 5r₂₆[3], 5r₂₆[3], 5r₂₆[3]] + VMLF T_0, R_4, R5_4 // [5r₂₆[4], 5r₂₆[4], 5r₂₆[4], 5r₂₆[4]] + + // skip r² calculation if we are only calculating one block CMPBLE R3, $16, skip - // calculate r**2 - MULTIPLY(R_0, R_1, R_2, R_3, R_4, R_0, R_1, R_2, R_3, R_4, R5SAVE_1, R5SAVE_2, R5SAVE_3, R5SAVE_4, H_0, H_1, H_2, H_3, H_4) - REDUCE(H_0, H_1, H_2, H_3, H_4) - VLEIG $0, $5, T_0 - VLEIG $1, $5, T_0 - VMLOF T_0, H_1, R5_1 - VMLOF T_0, H_2, R5_2 - VMLOF T_0, H_3, R5_3 - VMLOF T_0, H_4, R5_4 - VLR H_0, R_0 - VLR H_1, R_1 - VLR H_2, R_2 - VLR H_3, R_3 - VLR H_4, R_4 - - // initialize h - VZERO H_0 - VZERO H_1 - VZERO H_2 - VZERO H_3 - VZERO H_4 + // calculate r² + MULTIPLY(R_0, R_1, R_2, R_3, R_4, R_0, R_1, R_2, R_3, R_4, R5_1, R5_2, R5_3, R5_4, M_0, M_1, M_2, M_3, M_4) + REDUCE(M_0, M_1, M_2, M_3, M_4) + VGBM $0x0f0f, T_0 + VERIMG $0, M_0, T_0, R_0 // [r₂₆[0], r²₂₆[0], r₂₆[0], r²₂₆[0]] + VERIMG $0, M_1, T_0, R_1 // [r₂₆[1], r²₂₆[1], r₂₆[1], r²₂₆[1]] + VERIMG $0, M_2, T_0, R_2 // [r₂₆[2], r²₂₆[2], r₂₆[2], r²₂₆[2]] + VERIMG $0, M_3, T_0, R_3 // [r₂₆[3], r²₂₆[3], r₂₆[3], r²₂₆[3]] + VERIMG $0, M_4, T_0, R_4 // [r₂₆[4], r²₂₆[4], r₂₆[4], r²₂₆[4]] + + // calculate 5r² (ignore least significant limb) + VREPIF $5, T_0 + VMLF T_0, R_1, R5_1 // [5r₂₆[1], 5r²₂₆[1], 5r₂₆[1], 5r²₂₆[1]] + VMLF T_0, R_2, R5_2 // [5r₂₆[2], 5r²₂₆[2], 5r₂₆[2], 5r²₂₆[2]] + VMLF T_0, R_3, R5_3 // [5r₂₆[3], 5r²₂₆[3], 5r₂₆[3], 5r²₂₆[3]] + VMLF T_0, R_4, R5_4 // [5r₂₆[4], 5r²₂₆[4], 5r₂₆[4], 5r²₂₆[4]] loop: - CMPBLE R3, $32, b2 - VLM (R2), T_0, T_1 - SUB $32, R3 - MOVD $32(R2), R2 - EXPAND(T_0, T_1, F_0, F_1, F_2, F_3, F_4) - VLEIB $4, $1, F_4 - VLEIB $12, $1, F_4 + CMPBLE R3, $32, b2 // 2 or fewer blocks remaining, need to change key coefficients + + // load next 2 blocks from message + VLM (R2), T_0, T_1 + + // update message slice + SUB $32, R3 + MOVD $32(R2), R2 + + // unpack message blocks into 26-bit big-endian limbs + EXPAND(T_0, T_1, M_0, M_1, M_2, M_3, M_4) + + // add 2¹²⁸ to each message block value + VLEIB $4, $1, M_4 + VLEIB $12, $1, M_4 multiply: - VAG H_0, F_0, F_0 - VAG H_1, F_1, F_1 - VAG H_2, F_2, F_2 - VAG H_3, F_3, F_3 - VAG H_4, F_4, F_4 - MULTIPLY(F_0, F_1, F_2, F_3, F_4, R_0, R_1, R_2, R_3, R_4, R5_1, R5_2, R5_3, R5_4, H_0, H_1, H_2, H_3, H_4) + // accumulate the incoming message + VAG H_0, M_0, M_0 + VAG H_3, M_3, M_3 + VAG H_1, M_1, M_1 + VAG H_4, M_4, M_4 + VAG H_2, M_2, M_2 + + // multiply the accumulator by the key coefficient + MULTIPLY(M_0, M_1, M_2, M_3, M_4, R_0, R_1, R_2, R_3, R_4, R5_1, R5_2, R5_3, R5_4, H_0, H_1, H_2, H_3, H_4) + + // carry and partially reduce the partial products REDUCE(H_0, H_1, H_2, H_3, H_4) + CMPBNE R3, $0, loop finish: - // sum vectors + // sum lane 0 and lane 1 and put the result in lane 1 VZERO T_0 VSUMQG H_0, T_0, H_0 - VSUMQG H_1, T_0, H_1 - VSUMQG H_2, T_0, H_2 VSUMQG H_3, T_0, H_3 + VSUMQG H_1, T_0, H_1 VSUMQG H_4, T_0, H_4 + VSUMQG H_2, T_0, H_2 - // h may be >= 2*(2**130-5) so we need to reduce it again + // reduce again after summation + // TODO(mundaym): there might be a more efficient way to do this + // now that we only have 1 active lane. For example, we could + // simultaneously pack the values as we reduce them. REDUCE(H_0, H_1, H_2, H_3, H_4) - // carry h1->h4 + // carry h[1] through to h[4] so that only h[4] can exceed 2²⁶ - 1 + // TODO(mundaym): in testing this final carry was unnecessary. + // Needs a proof before it can be removed though. VESRLG $26, H_1, T_1 VN MOD26, H_1, H_1 VAQ T_1, H_2, H_2 @@ -284,117 +367,137 @@ finish: VN MOD26, H_3, H_3 VAQ T_3, H_4, H_4 - // h is now < 2*(2**130-5) - // pack h into h1 (hi) and h0 (lo) - PACK(H_0, H_1, H_2, H_3, H_4) - - // if h > 2**130-5 then h -= 2**130-5 - MOD(H_0, H_1, T_0, T_1, T_2) - - // h += s - MOVD $·bswapMask<>(SB), R5 - VL (R5), T_1 - VL 16(R4), T_0 - VPERM T_0, T_0, T_1, T_0 // reverse bytes (to big) - VAQ T_0, H_0, H_0 - VPERM H_0, H_0, T_1, H_0 // reverse bytes (to little) - VST H_0, (R1) - + // h is now < 2(2¹³⁰ - 5) + // Pack each lane in h₂₆[0:4] into h₁₂₈[0:1]. + VESLG $26, H_1, H_1 + VESLG $26, H_3, H_3 + VO H_0, H_1, H_0 + VO H_2, H_3, H_2 + VESLG $4, H_2, H_2 + VLEIB $7, $48, H_1 + VSLB H_1, H_2, H_2 + VO H_0, H_2, H_0 + VLEIB $7, $104, H_1 + VSLB H_1, H_4, H_3 + VO H_3, H_0, H_0 + VLEIB $7, $24, H_1 + VSRLB H_1, H_4, H_1 + + // update state + VSTEG $1, H_0, 0(R1) + VSTEG $0, H_0, 8(R1) + VSTEG $1, H_1, 16(R1) RET -b2: +b2: // 2 or fewer blocks remaining CMPBLE R3, $16, b1 - // 2 blocks remaining - SUB $17, R3 - VL (R2), T_0 - VLL R3, 16(R2), T_1 - ADD $1, R3 + // Load the 2 remaining blocks (17-32 bytes remaining). + MOVD $-17(R3), R0 // index of final byte to load modulo 16 + VL (R2), T_0 // load full 16 byte block + VLL R0, 16(R2), T_1 // load final (possibly partial) block and pad with zeros to 16 bytes + + // The Poly1305 algorithm requires that a 1 bit be appended to + // each message block. If the final block is less than 16 bytes + // long then it is easiest to insert the 1 before the message + // block is split into 26-bit limbs. If, on the other hand, the + // final message block is 16 bytes long then we append the 1 bit + // after expansion as normal. MOVBZ $1, R0 - CMPBEQ R3, $16, 2(PC) - VLVGB R3, R0, T_1 - EXPAND(T_0, T_1, F_0, F_1, F_2, F_3, F_4) + MOVD $-16(R3), R3 // index of byte in last block to insert 1 at (could be 16) + CMPBEQ R3, $16, 2(PC) // skip the insertion if the final block is 16 bytes long + VLVGB R3, R0, T_1 // insert 1 into the byte at index R3 + + // Split both blocks into 26-bit limbs in the appropriate lanes. + EXPAND(T_0, T_1, M_0, M_1, M_2, M_3, M_4) + + // Append a 1 byte to the end of the second to last block. + VLEIB $4, $1, M_4 + + // Append a 1 byte to the end of the last block only if it is a + // full 16 byte block. CMPBNE R3, $16, 2(PC) - VLEIB $12, $1, F_4 - VLEIB $4, $1, F_4 - - // setup [r²,r] - VLVGG $1, RSAVE_0, R_0 - VLVGG $1, RSAVE_1, R_1 - VLVGG $1, RSAVE_2, R_2 - VLVGG $1, RSAVE_3, R_3 - VLVGG $1, RSAVE_4, R_4 - VPDI $0, R5_1, R5SAVE_1, R5_1 - VPDI $0, R5_2, R5SAVE_2, R5_2 - VPDI $0, R5_3, R5SAVE_3, R5_3 - VPDI $0, R5_4, R5SAVE_4, R5_4 + VLEIB $12, $1, M_4 + + // Finally, set up the coefficients for the final multiplication. + // We have previously saved r and 5r in the 32-bit even indexes + // of the R_[0-4] and R5_[1-4] coefficient registers. + // + // We want lane 0 to be multiplied by r² so that can be kept the + // same. We want lane 1 to be multiplied by r so we need to move + // the saved r value into the 32-bit odd index in lane 1 by + // rotating the 64-bit lane by 32. + VGBM $0x00ff, T_0 // [0, 0xffffffffffffffff] - mask lane 1 only + VERIMG $32, R_0, T_0, R_0 // [_, r²₂₆[0], _, r₂₆[0]] + VERIMG $32, R_1, T_0, R_1 // [_, r²₂₆[1], _, r₂₆[1]] + VERIMG $32, R_2, T_0, R_2 // [_, r²₂₆[2], _, r₂₆[2]] + VERIMG $32, R_3, T_0, R_3 // [_, r²₂₆[3], _, r₂₆[3]] + VERIMG $32, R_4, T_0, R_4 // [_, r²₂₆[4], _, r₂₆[4]] + VERIMG $32, R5_1, T_0, R5_1 // [_, 5r²₂₆[1], _, 5r₂₆[1]] + VERIMG $32, R5_2, T_0, R5_2 // [_, 5r²₂₆[2], _, 5r₂₆[2]] + VERIMG $32, R5_3, T_0, R5_3 // [_, 5r²₂₆[3], _, 5r₂₆[3]] + VERIMG $32, R5_4, T_0, R5_4 // [_, 5r²₂₆[4], _, 5r₂₆[4]] MOVD $0, R3 BR multiply skip: - VZERO H_0 - VZERO H_1 - VZERO H_2 - VZERO H_3 - VZERO H_4 - CMPBEQ R3, $0, finish -b1: - // 1 block remaining - SUB $1, R3 - VLL R3, (R2), T_0 - ADD $1, R3 +b1: // 1 block remaining + + // Load the final block (1-16 bytes). This will be placed into + // lane 0. + MOVD $-1(R3), R0 + VLL R0, (R2), T_0 // pad to 16 bytes with zeros + + // The Poly1305 algorithm requires that a 1 bit be appended to + // each message block. If the final block is less than 16 bytes + // long then it is easiest to insert the 1 before the message + // block is split into 26-bit limbs. If, on the other hand, the + // final message block is 16 bytes long then we append the 1 bit + // after expansion as normal. MOVBZ $1, R0 CMPBEQ R3, $16, 2(PC) VLVGB R3, R0, T_0 - VZERO T_1 - EXPAND(T_0, T_1, F_0, F_1, F_2, F_3, F_4) + + // Set the message block in lane 1 to the value 0 so that it + // can be accumulated without affecting the final result. + VZERO T_1 + + // Split the final message block into 26-bit limbs in lane 0. + // Lane 1 will be contain 0. + EXPAND(T_0, T_1, M_0, M_1, M_2, M_3, M_4) + + // Append a 1 byte to the end of the last block only if it is a + // full 16 byte block. CMPBNE R3, $16, 2(PC) - VLEIB $4, $1, F_4 - VLEIG $1, $1, R_0 - VZERO R_1 - VZERO R_2 - VZERO R_3 - VZERO R_4 - VZERO R5_1 - VZERO R5_2 - VZERO R5_3 - VZERO R5_4 - - // setup [r, 1] - VLVGG $0, RSAVE_0, R_0 - VLVGG $0, RSAVE_1, R_1 - VLVGG $0, RSAVE_2, R_2 - VLVGG $0, RSAVE_3, R_3 - VLVGG $0, RSAVE_4, R_4 - VPDI $0, R5SAVE_1, R5_1, R5_1 - VPDI $0, R5SAVE_2, R5_2, R5_2 - VPDI $0, R5SAVE_3, R5_3, R5_3 - VPDI $0, R5SAVE_4, R5_4, R5_4 + VLEIB $4, $1, M_4 + + // We have previously saved r and 5r in the 32-bit even indexes + // of the R_[0-4] and R5_[1-4] coefficient registers. + // + // We want lane 0 to be multiplied by r so we need to move the + // saved r value into the 32-bit odd index in lane 0. We want + // lane 1 to be set to the value 1. This makes multiplication + // a no-op. We do this by setting lane 1 in every register to 0 + // and then just setting the 32-bit index 3 in R_0 to 1. + VZERO T_0 + MOVD $0, R0 + MOVD $0x10111213, R12 + VLVGP R12, R0, T_1 // [_, 0x10111213, _, 0x00000000] + VPERM T_0, R_0, T_1, R_0 // [_, r₂₆[0], _, 0] + VPERM T_0, R_1, T_1, R_1 // [_, r₂₆[1], _, 0] + VPERM T_0, R_2, T_1, R_2 // [_, r₂₆[2], _, 0] + VPERM T_0, R_3, T_1, R_3 // [_, r₂₆[3], _, 0] + VPERM T_0, R_4, T_1, R_4 // [_, r₂₆[4], _, 0] + VPERM T_0, R5_1, T_1, R5_1 // [_, 5r₂₆[1], _, 0] + VPERM T_0, R5_2, T_1, R5_2 // [_, 5r₂₆[2], _, 0] + VPERM T_0, R5_3, T_1, R5_3 // [_, 5r₂₆[3], _, 0] + VPERM T_0, R5_4, T_1, R5_4 // [_, 5r₂₆[4], _, 0] + + // Set the value of lane 1 to be 1. + VLEIF $3, $1, R_0 // [_, r₂₆[0], _, 1] MOVD $0, R3 BR multiply - -TEXT ·hasVectorFacility(SB), NOSPLIT, $24-1 - MOVD $x-24(SP), R1 - XC $24, 0(R1), 0(R1) // clear the storage - MOVD $2, R0 // R0 is the number of double words stored -1 - WORD $0xB2B01000 // STFLE 0(R1) - XOR R0, R0 // reset the value of R0 - MOVBZ z-8(SP), R1 - AND $0x40, R1 - BEQ novector - -vectorinstalled: - // check if the vector instruction has been enabled - VLEIB $0, $0xF, V16 - VLGVB $0, V16, R1 - CMPBNE R1, $0xF, novector - MOVB $1, ret+0(FP) // have vx - RET - -novector: - MOVB $0, ret+0(FP) // no vx - RET diff --git a/vendor/golang.org/x/crypto/poly1305/sum_vmsl_s390x.s b/vendor/golang.org/x/crypto/poly1305/sum_vmsl_s390x.s deleted file mode 100644 index e548020b1..000000000 --- a/vendor/golang.org/x/crypto/poly1305/sum_vmsl_s390x.s +++ /dev/null @@ -1,931 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build s390x,go1.11,!gccgo,!appengine - -#include "textflag.h" - -// Implementation of Poly1305 using the vector facility (vx) and the VMSL instruction. - -// constants -#define EX0 V1 -#define EX1 V2 -#define EX2 V3 - -// temporaries -#define T_0 V4 -#define T_1 V5 -#define T_2 V6 -#define T_3 V7 -#define T_4 V8 -#define T_5 V9 -#define T_6 V10 -#define T_7 V11 -#define T_8 V12 -#define T_9 V13 -#define T_10 V14 - -// r**2 & r**4 -#define R_0 V15 -#define R_1 V16 -#define R_2 V17 -#define R5_1 V18 -#define R5_2 V19 -// key (r) -#define RSAVE_0 R7 -#define RSAVE_1 R8 -#define RSAVE_2 R9 -#define R5SAVE_1 R10 -#define R5SAVE_2 R11 - -// message block -#define M0 V20 -#define M1 V21 -#define M2 V22 -#define M3 V23 -#define M4 V24 -#define M5 V25 - -// accumulator -#define H0_0 V26 -#define H1_0 V27 -#define H2_0 V28 -#define H0_1 V29 -#define H1_1 V30 -#define H2_1 V31 - -GLOBL ·keyMask<>(SB), RODATA, $16 -DATA ·keyMask<>+0(SB)/8, $0xffffff0ffcffff0f -DATA ·keyMask<>+8(SB)/8, $0xfcffff0ffcffff0f - -GLOBL ·bswapMask<>(SB), RODATA, $16 -DATA ·bswapMask<>+0(SB)/8, $0x0f0e0d0c0b0a0908 -DATA ·bswapMask<>+8(SB)/8, $0x0706050403020100 - -GLOBL ·constants<>(SB), RODATA, $48 -// EX0 -DATA ·constants<>+0(SB)/8, $0x18191a1b1c1d1e1f -DATA ·constants<>+8(SB)/8, $0x0000050403020100 -// EX1 -DATA ·constants<>+16(SB)/8, $0x18191a1b1c1d1e1f -DATA ·constants<>+24(SB)/8, $0x00000a0908070605 -// EX2 -DATA ·constants<>+32(SB)/8, $0x18191a1b1c1d1e1f -DATA ·constants<>+40(SB)/8, $0x0000000f0e0d0c0b - -GLOBL ·c<>(SB), RODATA, $48 -// EX0 -DATA ·c<>+0(SB)/8, $0x0000050403020100 -DATA ·c<>+8(SB)/8, $0x0000151413121110 -// EX1 -DATA ·c<>+16(SB)/8, $0x00000a0908070605 -DATA ·c<>+24(SB)/8, $0x00001a1918171615 -// EX2 -DATA ·c<>+32(SB)/8, $0x0000000f0e0d0c0b -DATA ·c<>+40(SB)/8, $0x0000001f1e1d1c1b - -GLOBL ·reduce<>(SB), RODATA, $32 -// 44 bit -DATA ·reduce<>+0(SB)/8, $0x0 -DATA ·reduce<>+8(SB)/8, $0xfffffffffff -// 42 bit -DATA ·reduce<>+16(SB)/8, $0x0 -DATA ·reduce<>+24(SB)/8, $0x3ffffffffff - -// h = (f*g) % (2**130-5) [partial reduction] -// uses T_0...T_9 temporary registers -// input: m02_0, m02_1, m02_2, m13_0, m13_1, m13_2, r_0, r_1, r_2, r5_1, r5_2, m4_0, m4_1, m4_2, m5_0, m5_1, m5_2 -// temp: t0, t1, t2, t3, t4, t5, t6, t7, t8, t9 -// output: m02_0, m02_1, m02_2, m13_0, m13_1, m13_2 -#define MULTIPLY(m02_0, m02_1, m02_2, m13_0, m13_1, m13_2, r_0, r_1, r_2, r5_1, r5_2, m4_0, m4_1, m4_2, m5_0, m5_1, m5_2, t0, t1, t2, t3, t4, t5, t6, t7, t8, t9) \ - \ // Eliminate the dependency for the last 2 VMSLs - VMSLG m02_0, r_2, m4_2, m4_2 \ - VMSLG m13_0, r_2, m5_2, m5_2 \ // 8 VMSLs pipelined - VMSLG m02_0, r_0, m4_0, m4_0 \ - VMSLG m02_1, r5_2, V0, T_0 \ - VMSLG m02_0, r_1, m4_1, m4_1 \ - VMSLG m02_1, r_0, V0, T_1 \ - VMSLG m02_1, r_1, V0, T_2 \ - VMSLG m02_2, r5_1, V0, T_3 \ - VMSLG m02_2, r5_2, V0, T_4 \ - VMSLG m13_0, r_0, m5_0, m5_0 \ - VMSLG m13_1, r5_2, V0, T_5 \ - VMSLG m13_0, r_1, m5_1, m5_1 \ - VMSLG m13_1, r_0, V0, T_6 \ - VMSLG m13_1, r_1, V0, T_7 \ - VMSLG m13_2, r5_1, V0, T_8 \ - VMSLG m13_2, r5_2, V0, T_9 \ - VMSLG m02_2, r_0, m4_2, m4_2 \ - VMSLG m13_2, r_0, m5_2, m5_2 \ - VAQ m4_0, T_0, m02_0 \ - VAQ m4_1, T_1, m02_1 \ - VAQ m5_0, T_5, m13_0 \ - VAQ m5_1, T_6, m13_1 \ - VAQ m02_0, T_3, m02_0 \ - VAQ m02_1, T_4, m02_1 \ - VAQ m13_0, T_8, m13_0 \ - VAQ m13_1, T_9, m13_1 \ - VAQ m4_2, T_2, m02_2 \ - VAQ m5_2, T_7, m13_2 \ - -// SQUARE uses three limbs of r and r_2*5 to output square of r -// uses T_1, T_5 and T_7 temporary registers -// input: r_0, r_1, r_2, r5_2 -// temp: TEMP0, TEMP1, TEMP2 -// output: p0, p1, p2 -#define SQUARE(r_0, r_1, r_2, r5_2, p0, p1, p2, TEMP0, TEMP1, TEMP2) \ - VMSLG r_0, r_0, p0, p0 \ - VMSLG r_1, r5_2, V0, TEMP0 \ - VMSLG r_2, r5_2, p1, p1 \ - VMSLG r_0, r_1, V0, TEMP1 \ - VMSLG r_1, r_1, p2, p2 \ - VMSLG r_0, r_2, V0, TEMP2 \ - VAQ TEMP0, p0, p0 \ - VAQ TEMP1, p1, p1 \ - VAQ TEMP2, p2, p2 \ - VAQ TEMP0, p0, p0 \ - VAQ TEMP1, p1, p1 \ - VAQ TEMP2, p2, p2 \ - -// carry h0->h1->h2->h0 || h3->h4->h5->h3 -// uses T_2, T_4, T_5, T_7, T_8, T_9 -// t6, t7, t8, t9, t10, t11 -// input: h0, h1, h2, h3, h4, h5 -// temp: t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11 -// output: h0, h1, h2, h3, h4, h5 -#define REDUCE(h0, h1, h2, h3, h4, h5, t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11) \ - VLM (R12), t6, t7 \ // 44 and 42 bit clear mask - VLEIB $7, $0x28, t10 \ // 5 byte shift mask - VREPIB $4, t8 \ // 4 bit shift mask - VREPIB $2, t11 \ // 2 bit shift mask - VSRLB t10, h0, t0 \ // h0 byte shift - VSRLB t10, h1, t1 \ // h1 byte shift - VSRLB t10, h2, t2 \ // h2 byte shift - VSRLB t10, h3, t3 \ // h3 byte shift - VSRLB t10, h4, t4 \ // h4 byte shift - VSRLB t10, h5, t5 \ // h5 byte shift - VSRL t8, t0, t0 \ // h0 bit shift - VSRL t8, t1, t1 \ // h2 bit shift - VSRL t11, t2, t2 \ // h2 bit shift - VSRL t8, t3, t3 \ // h3 bit shift - VSRL t8, t4, t4 \ // h4 bit shift - VESLG $2, t2, t9 \ // h2 carry x5 - VSRL t11, t5, t5 \ // h5 bit shift - VN t6, h0, h0 \ // h0 clear carry - VAQ t2, t9, t2 \ // h2 carry x5 - VESLG $2, t5, t9 \ // h5 carry x5 - VN t6, h1, h1 \ // h1 clear carry - VN t7, h2, h2 \ // h2 clear carry - VAQ t5, t9, t5 \ // h5 carry x5 - VN t6, h3, h3 \ // h3 clear carry - VN t6, h4, h4 \ // h4 clear carry - VN t7, h5, h5 \ // h5 clear carry - VAQ t0, h1, h1 \ // h0->h1 - VAQ t3, h4, h4 \ // h3->h4 - VAQ t1, h2, h2 \ // h1->h2 - VAQ t4, h5, h5 \ // h4->h5 - VAQ t2, h0, h0 \ // h2->h0 - VAQ t5, h3, h3 \ // h5->h3 - VREPG $1, t6, t6 \ // 44 and 42 bit masks across both halves - VREPG $1, t7, t7 \ - VSLDB $8, h0, h0, h0 \ // set up [h0/1/2, h3/4/5] - VSLDB $8, h1, h1, h1 \ - VSLDB $8, h2, h2, h2 \ - VO h0, h3, h3 \ - VO h1, h4, h4 \ - VO h2, h5, h5 \ - VESRLG $44, h3, t0 \ // 44 bit shift right - VESRLG $44, h4, t1 \ - VESRLG $42, h5, t2 \ - VN t6, h3, h3 \ // clear carry bits - VN t6, h4, h4 \ - VN t7, h5, h5 \ - VESLG $2, t2, t9 \ // multiply carry by 5 - VAQ t9, t2, t2 \ - VAQ t0, h4, h4 \ - VAQ t1, h5, h5 \ - VAQ t2, h3, h3 \ - -// carry h0->h1->h2->h0 -// input: h0, h1, h2 -// temp: t0, t1, t2, t3, t4, t5, t6, t7, t8 -// output: h0, h1, h2 -#define REDUCE2(h0, h1, h2, t0, t1, t2, t3, t4, t5, t6, t7, t8) \ - VLEIB $7, $0x28, t3 \ // 5 byte shift mask - VREPIB $4, t4 \ // 4 bit shift mask - VREPIB $2, t7 \ // 2 bit shift mask - VGBM $0x003F, t5 \ // mask to clear carry bits - VSRLB t3, h0, t0 \ - VSRLB t3, h1, t1 \ - VSRLB t3, h2, t2 \ - VESRLG $4, t5, t5 \ // 44 bit clear mask - VSRL t4, t0, t0 \ - VSRL t4, t1, t1 \ - VSRL t7, t2, t2 \ - VESRLG $2, t5, t6 \ // 42 bit clear mask - VESLG $2, t2, t8 \ - VAQ t8, t2, t2 \ - VN t5, h0, h0 \ - VN t5, h1, h1 \ - VN t6, h2, h2 \ - VAQ t0, h1, h1 \ - VAQ t1, h2, h2 \ - VAQ t2, h0, h0 \ - VSRLB t3, h0, t0 \ - VSRLB t3, h1, t1 \ - VSRLB t3, h2, t2 \ - VSRL t4, t0, t0 \ - VSRL t4, t1, t1 \ - VSRL t7, t2, t2 \ - VN t5, h0, h0 \ - VN t5, h1, h1 \ - VESLG $2, t2, t8 \ - VN t6, h2, h2 \ - VAQ t0, h1, h1 \ - VAQ t8, t2, t2 \ - VAQ t1, h2, h2 \ - VAQ t2, h0, h0 \ - -// expands two message blocks into the lower halfs of the d registers -// moves the contents of the d registers into upper halfs -// input: in1, in2, d0, d1, d2, d3, d4, d5 -// temp: TEMP0, TEMP1, TEMP2, TEMP3 -// output: d0, d1, d2, d3, d4, d5 -#define EXPACC(in1, in2, d0, d1, d2, d3, d4, d5, TEMP0, TEMP1, TEMP2, TEMP3) \ - VGBM $0xff3f, TEMP0 \ - VGBM $0xff1f, TEMP1 \ - VESLG $4, d1, TEMP2 \ - VESLG $4, d4, TEMP3 \ - VESRLG $4, TEMP0, TEMP0 \ - VPERM in1, d0, EX0, d0 \ - VPERM in2, d3, EX0, d3 \ - VPERM in1, d2, EX2, d2 \ - VPERM in2, d5, EX2, d5 \ - VPERM in1, TEMP2, EX1, d1 \ - VPERM in2, TEMP3, EX1, d4 \ - VN TEMP0, d0, d0 \ - VN TEMP0, d3, d3 \ - VESRLG $4, d1, d1 \ - VESRLG $4, d4, d4 \ - VN TEMP1, d2, d2 \ - VN TEMP1, d5, d5 \ - VN TEMP0, d1, d1 \ - VN TEMP0, d4, d4 \ - -// expands one message block into the lower halfs of the d registers -// moves the contents of the d registers into upper halfs -// input: in, d0, d1, d2 -// temp: TEMP0, TEMP1, TEMP2 -// output: d0, d1, d2 -#define EXPACC2(in, d0, d1, d2, TEMP0, TEMP1, TEMP2) \ - VGBM $0xff3f, TEMP0 \ - VESLG $4, d1, TEMP2 \ - VGBM $0xff1f, TEMP1 \ - VPERM in, d0, EX0, d0 \ - VESRLG $4, TEMP0, TEMP0 \ - VPERM in, d2, EX2, d2 \ - VPERM in, TEMP2, EX1, d1 \ - VN TEMP0, d0, d0 \ - VN TEMP1, d2, d2 \ - VESRLG $4, d1, d1 \ - VN TEMP0, d1, d1 \ - -// pack h2:h0 into h1:h0 (no carry) -// input: h0, h1, h2 -// output: h0, h1, h2 -#define PACK(h0, h1, h2) \ - VMRLG h1, h2, h2 \ // copy h1 to upper half h2 - VESLG $44, h1, h1 \ // shift limb 1 44 bits, leaving 20 - VO h0, h1, h0 \ // combine h0 with 20 bits from limb 1 - VESRLG $20, h2, h1 \ // put top 24 bits of limb 1 into h1 - VLEIG $1, $0, h1 \ // clear h2 stuff from lower half of h1 - VO h0, h1, h0 \ // h0 now has 88 bits (limb 0 and 1) - VLEIG $0, $0, h2 \ // clear upper half of h2 - VESRLG $40, h2, h1 \ // h1 now has upper two bits of result - VLEIB $7, $88, h1 \ // for byte shift (11 bytes) - VSLB h1, h2, h2 \ // shift h2 11 bytes to the left - VO h0, h2, h0 \ // combine h0 with 20 bits from limb 1 - VLEIG $0, $0, h1 \ // clear upper half of h1 - -// if h > 2**130-5 then h -= 2**130-5 -// input: h0, h1 -// temp: t0, t1, t2 -// output: h0 -#define MOD(h0, h1, t0, t1, t2) \ - VZERO t0 \ - VLEIG $1, $5, t0 \ - VACCQ h0, t0, t1 \ - VAQ h0, t0, t0 \ - VONE t2 \ - VLEIG $1, $-4, t2 \ - VAQ t2, t1, t1 \ - VACCQ h1, t1, t1 \ - VONE t2 \ - VAQ t2, t1, t1 \ - VN h0, t1, t2 \ - VNC t0, t1, t1 \ - VO t1, t2, h0 \ - -// func poly1305vmsl(out *[16]byte, m *byte, mlen uint64, key *[32]key) -TEXT ·poly1305vmsl(SB), $0-32 - // This code processes 6 + up to 4 blocks (32 bytes) per iteration - // using the algorithm described in: - // NEON crypto, Daniel J. Bernstein & Peter Schwabe - // https://cryptojedi.org/papers/neoncrypto-20120320.pdf - // And as moddified for VMSL as described in - // Accelerating Poly1305 Cryptographic Message Authentication on the z14 - // O'Farrell et al, CASCON 2017, p48-55 - // https://ibm.ent.box.com/s/jf9gedj0e9d2vjctfyh186shaztavnht - - LMG out+0(FP), R1, R4 // R1=out, R2=m, R3=mlen, R4=key - VZERO V0 // c - - // load EX0, EX1 and EX2 - MOVD $·constants<>(SB), R5 - VLM (R5), EX0, EX2 // c - - // setup r - VL (R4), T_0 - MOVD $·keyMask<>(SB), R6 - VL (R6), T_1 - VN T_0, T_1, T_0 - VZERO T_2 // limbs for r - VZERO T_3 - VZERO T_4 - EXPACC2(T_0, T_2, T_3, T_4, T_1, T_5, T_7) - - // T_2, T_3, T_4: [0, r] - - // setup r*20 - VLEIG $0, $0, T_0 - VLEIG $1, $20, T_0 // T_0: [0, 20] - VZERO T_5 - VZERO T_6 - VMSLG T_0, T_3, T_5, T_5 - VMSLG T_0, T_4, T_6, T_6 - - // store r for final block in GR - VLGVG $1, T_2, RSAVE_0 // c - VLGVG $1, T_3, RSAVE_1 // c - VLGVG $1, T_4, RSAVE_2 // c - VLGVG $1, T_5, R5SAVE_1 // c - VLGVG $1, T_6, R5SAVE_2 // c - - // initialize h - VZERO H0_0 - VZERO H1_0 - VZERO H2_0 - VZERO H0_1 - VZERO H1_1 - VZERO H2_1 - - // initialize pointer for reduce constants - MOVD $·reduce<>(SB), R12 - - // calculate r**2 and 20*(r**2) - VZERO R_0 - VZERO R_1 - VZERO R_2 - SQUARE(T_2, T_3, T_4, T_6, R_0, R_1, R_2, T_1, T_5, T_7) - REDUCE2(R_0, R_1, R_2, M0, M1, M2, M3, M4, R5_1, R5_2, M5, T_1) - VZERO R5_1 - VZERO R5_2 - VMSLG T_0, R_1, R5_1, R5_1 - VMSLG T_0, R_2, R5_2, R5_2 - - // skip r**4 calculation if 3 blocks or less - CMPBLE R3, $48, b4 - - // calculate r**4 and 20*(r**4) - VZERO T_8 - VZERO T_9 - VZERO T_10 - SQUARE(R_0, R_1, R_2, R5_2, T_8, T_9, T_10, T_1, T_5, T_7) - REDUCE2(T_8, T_9, T_10, M0, M1, M2, M3, M4, T_2, T_3, M5, T_1) - VZERO T_2 - VZERO T_3 - VMSLG T_0, T_9, T_2, T_2 - VMSLG T_0, T_10, T_3, T_3 - - // put r**2 to the right and r**4 to the left of R_0, R_1, R_2 - VSLDB $8, T_8, T_8, T_8 - VSLDB $8, T_9, T_9, T_9 - VSLDB $8, T_10, T_10, T_10 - VSLDB $8, T_2, T_2, T_2 - VSLDB $8, T_3, T_3, T_3 - - VO T_8, R_0, R_0 - VO T_9, R_1, R_1 - VO T_10, R_2, R_2 - VO T_2, R5_1, R5_1 - VO T_3, R5_2, R5_2 - - CMPBLE R3, $80, load // less than or equal to 5 blocks in message - - // 6(or 5+1) blocks - SUB $81, R3 - VLM (R2), M0, M4 - VLL R3, 80(R2), M5 - ADD $1, R3 - MOVBZ $1, R0 - CMPBGE R3, $16, 2(PC) - VLVGB R3, R0, M5 - MOVD $96(R2), R2 - EXPACC(M0, M1, H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_0, T_1, T_2, T_3) - EXPACC(M2, M3, H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_0, T_1, T_2, T_3) - VLEIB $2, $1, H2_0 - VLEIB $2, $1, H2_1 - VLEIB $10, $1, H2_0 - VLEIB $10, $1, H2_1 - - VZERO M0 - VZERO M1 - VZERO M2 - VZERO M3 - VZERO T_4 - VZERO T_10 - EXPACC(M4, M5, M0, M1, M2, M3, T_4, T_10, T_0, T_1, T_2, T_3) - VLR T_4, M4 - VLEIB $10, $1, M2 - CMPBLT R3, $16, 2(PC) - VLEIB $10, $1, T_10 - MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, T_10, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) - REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, M2, M3, M4, T_4, T_5, T_2, T_7, T_8, T_9) - VMRHG V0, H0_1, H0_0 - VMRHG V0, H1_1, H1_0 - VMRHG V0, H2_1, H2_0 - VMRLG V0, H0_1, H0_1 - VMRLG V0, H1_1, H1_1 - VMRLG V0, H2_1, H2_1 - - SUB $16, R3 - CMPBLE R3, $0, square - -load: - // load EX0, EX1 and EX2 - MOVD $·c<>(SB), R5 - VLM (R5), EX0, EX2 - -loop: - CMPBLE R3, $64, add // b4 // last 4 or less blocks left - - // next 4 full blocks - VLM (R2), M2, M5 - SUB $64, R3 - MOVD $64(R2), R2 - REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, T_0, T_1, T_3, T_4, T_5, T_2, T_7, T_8, T_9) - - // expacc in-lined to create [m2, m3] limbs - VGBM $0x3f3f, T_0 // 44 bit clear mask - VGBM $0x1f1f, T_1 // 40 bit clear mask - VPERM M2, M3, EX0, T_3 - VESRLG $4, T_0, T_0 // 44 bit clear mask ready - VPERM M2, M3, EX1, T_4 - VPERM M2, M3, EX2, T_5 - VN T_0, T_3, T_3 - VESRLG $4, T_4, T_4 - VN T_1, T_5, T_5 - VN T_0, T_4, T_4 - VMRHG H0_1, T_3, H0_0 - VMRHG H1_1, T_4, H1_0 - VMRHG H2_1, T_5, H2_0 - VMRLG H0_1, T_3, H0_1 - VMRLG H1_1, T_4, H1_1 - VMRLG H2_1, T_5, H2_1 - VLEIB $10, $1, H2_0 - VLEIB $10, $1, H2_1 - VPERM M4, M5, EX0, T_3 - VPERM M4, M5, EX1, T_4 - VPERM M4, M5, EX2, T_5 - VN T_0, T_3, T_3 - VESRLG $4, T_4, T_4 - VN T_1, T_5, T_5 - VN T_0, T_4, T_4 - VMRHG V0, T_3, M0 - VMRHG V0, T_4, M1 - VMRHG V0, T_5, M2 - VMRLG V0, T_3, M3 - VMRLG V0, T_4, M4 - VMRLG V0, T_5, M5 - VLEIB $10, $1, M2 - VLEIB $10, $1, M5 - - MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) - CMPBNE R3, $0, loop - REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, M3, M4, M5, T_4, T_5, T_2, T_7, T_8, T_9) - VMRHG V0, H0_1, H0_0 - VMRHG V0, H1_1, H1_0 - VMRHG V0, H2_1, H2_0 - VMRLG V0, H0_1, H0_1 - VMRLG V0, H1_1, H1_1 - VMRLG V0, H2_1, H2_1 - - // load EX0, EX1, EX2 - MOVD $·constants<>(SB), R5 - VLM (R5), EX0, EX2 - - // sum vectors - VAQ H0_0, H0_1, H0_0 - VAQ H1_0, H1_1, H1_0 - VAQ H2_0, H2_1, H2_0 - - // h may be >= 2*(2**130-5) so we need to reduce it again - // M0...M4 are used as temps here - REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, T_9, T_10, H0_1, M5) - -next: // carry h1->h2 - VLEIB $7, $0x28, T_1 - VREPIB $4, T_2 - VGBM $0x003F, T_3 - VESRLG $4, T_3 - - // byte shift - VSRLB T_1, H1_0, T_4 - - // bit shift - VSRL T_2, T_4, T_4 - - // clear h1 carry bits - VN T_3, H1_0, H1_0 - - // add carry - VAQ T_4, H2_0, H2_0 - - // h is now < 2*(2**130-5) - // pack h into h1 (hi) and h0 (lo) - PACK(H0_0, H1_0, H2_0) - - // if h > 2**130-5 then h -= 2**130-5 - MOD(H0_0, H1_0, T_0, T_1, T_2) - - // h += s - MOVD $·bswapMask<>(SB), R5 - VL (R5), T_1 - VL 16(R4), T_0 - VPERM T_0, T_0, T_1, T_0 // reverse bytes (to big) - VAQ T_0, H0_0, H0_0 - VPERM H0_0, H0_0, T_1, H0_0 // reverse bytes (to little) - VST H0_0, (R1) - RET - -add: - // load EX0, EX1, EX2 - MOVD $·constants<>(SB), R5 - VLM (R5), EX0, EX2 - - REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, M3, M4, M5, T_4, T_5, T_2, T_7, T_8, T_9) - VMRHG V0, H0_1, H0_0 - VMRHG V0, H1_1, H1_0 - VMRHG V0, H2_1, H2_0 - VMRLG V0, H0_1, H0_1 - VMRLG V0, H1_1, H1_1 - VMRLG V0, H2_1, H2_1 - CMPBLE R3, $64, b4 - -b4: - CMPBLE R3, $48, b3 // 3 blocks or less - - // 4(3+1) blocks remaining - SUB $49, R3 - VLM (R2), M0, M2 - VLL R3, 48(R2), M3 - ADD $1, R3 - MOVBZ $1, R0 - CMPBEQ R3, $16, 2(PC) - VLVGB R3, R0, M3 - MOVD $64(R2), R2 - EXPACC(M0, M1, H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_0, T_1, T_2, T_3) - VLEIB $10, $1, H2_0 - VLEIB $10, $1, H2_1 - VZERO M0 - VZERO M1 - VZERO M4 - VZERO M5 - VZERO T_4 - VZERO T_10 - EXPACC(M2, M3, M0, M1, M4, M5, T_4, T_10, T_0, T_1, T_2, T_3) - VLR T_4, M2 - VLEIB $10, $1, M4 - CMPBNE R3, $16, 2(PC) - VLEIB $10, $1, T_10 - MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M4, M5, M2, T_10, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) - REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, M3, M4, M5, T_4, T_5, T_2, T_7, T_8, T_9) - VMRHG V0, H0_1, H0_0 - VMRHG V0, H1_1, H1_0 - VMRHG V0, H2_1, H2_0 - VMRLG V0, H0_1, H0_1 - VMRLG V0, H1_1, H1_1 - VMRLG V0, H2_1, H2_1 - SUB $16, R3 - CMPBLE R3, $0, square // this condition must always hold true! - -b3: - CMPBLE R3, $32, b2 - - // 3 blocks remaining - - // setup [r²,r] - VSLDB $8, R_0, R_0, R_0 - VSLDB $8, R_1, R_1, R_1 - VSLDB $8, R_2, R_2, R_2 - VSLDB $8, R5_1, R5_1, R5_1 - VSLDB $8, R5_2, R5_2, R5_2 - - VLVGG $1, RSAVE_0, R_0 - VLVGG $1, RSAVE_1, R_1 - VLVGG $1, RSAVE_2, R_2 - VLVGG $1, R5SAVE_1, R5_1 - VLVGG $1, R5SAVE_2, R5_2 - - // setup [h0, h1] - VSLDB $8, H0_0, H0_0, H0_0 - VSLDB $8, H1_0, H1_0, H1_0 - VSLDB $8, H2_0, H2_0, H2_0 - VO H0_1, H0_0, H0_0 - VO H1_1, H1_0, H1_0 - VO H2_1, H2_0, H2_0 - VZERO H0_1 - VZERO H1_1 - VZERO H2_1 - - VZERO M0 - VZERO M1 - VZERO M2 - VZERO M3 - VZERO M4 - VZERO M5 - - // H*[r**2, r] - MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) - REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, H0_1, H1_1, T_10, M5) - - SUB $33, R3 - VLM (R2), M0, M1 - VLL R3, 32(R2), M2 - ADD $1, R3 - MOVBZ $1, R0 - CMPBEQ R3, $16, 2(PC) - VLVGB R3, R0, M2 - - // H += m0 - VZERO T_1 - VZERO T_2 - VZERO T_3 - EXPACC2(M0, T_1, T_2, T_3, T_4, T_5, T_6) - VLEIB $10, $1, T_3 - VAG H0_0, T_1, H0_0 - VAG H1_0, T_2, H1_0 - VAG H2_0, T_3, H2_0 - - VZERO M0 - VZERO M3 - VZERO M4 - VZERO M5 - VZERO T_10 - - // (H+m0)*r - MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M3, M4, M5, V0, T_10, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) - REDUCE2(H0_0, H1_0, H2_0, M0, M3, M4, M5, T_10, H0_1, H1_1, H2_1, T_9) - - // H += m1 - VZERO V0 - VZERO T_1 - VZERO T_2 - VZERO T_3 - EXPACC2(M1, T_1, T_2, T_3, T_4, T_5, T_6) - VLEIB $10, $1, T_3 - VAQ H0_0, T_1, H0_0 - VAQ H1_0, T_2, H1_0 - VAQ H2_0, T_3, H2_0 - REDUCE2(H0_0, H1_0, H2_0, M0, M3, M4, M5, T_9, H0_1, H1_1, H2_1, T_10) - - // [H, m2] * [r**2, r] - EXPACC2(M2, H0_0, H1_0, H2_0, T_1, T_2, T_3) - CMPBNE R3, $16, 2(PC) - VLEIB $10, $1, H2_0 - VZERO M0 - VZERO M1 - VZERO M2 - VZERO M3 - VZERO M4 - VZERO M5 - MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) - REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, H0_1, H1_1, M5, T_10) - SUB $16, R3 - CMPBLE R3, $0, next // this condition must always hold true! - -b2: - CMPBLE R3, $16, b1 - - // 2 blocks remaining - - // setup [r²,r] - VSLDB $8, R_0, R_0, R_0 - VSLDB $8, R_1, R_1, R_1 - VSLDB $8, R_2, R_2, R_2 - VSLDB $8, R5_1, R5_1, R5_1 - VSLDB $8, R5_2, R5_2, R5_2 - - VLVGG $1, RSAVE_0, R_0 - VLVGG $1, RSAVE_1, R_1 - VLVGG $1, RSAVE_2, R_2 - VLVGG $1, R5SAVE_1, R5_1 - VLVGG $1, R5SAVE_2, R5_2 - - // setup [h0, h1] - VSLDB $8, H0_0, H0_0, H0_0 - VSLDB $8, H1_0, H1_0, H1_0 - VSLDB $8, H2_0, H2_0, H2_0 - VO H0_1, H0_0, H0_0 - VO H1_1, H1_0, H1_0 - VO H2_1, H2_0, H2_0 - VZERO H0_1 - VZERO H1_1 - VZERO H2_1 - - VZERO M0 - VZERO M1 - VZERO M2 - VZERO M3 - VZERO M4 - VZERO M5 - - // H*[r**2, r] - MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) - REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, M2, M3, M4, T_4, T_5, T_2, T_7, T_8, T_9) - VMRHG V0, H0_1, H0_0 - VMRHG V0, H1_1, H1_0 - VMRHG V0, H2_1, H2_0 - VMRLG V0, H0_1, H0_1 - VMRLG V0, H1_1, H1_1 - VMRLG V0, H2_1, H2_1 - - // move h to the left and 0s at the right - VSLDB $8, H0_0, H0_0, H0_0 - VSLDB $8, H1_0, H1_0, H1_0 - VSLDB $8, H2_0, H2_0, H2_0 - - // get message blocks and append 1 to start - SUB $17, R3 - VL (R2), M0 - VLL R3, 16(R2), M1 - ADD $1, R3 - MOVBZ $1, R0 - CMPBEQ R3, $16, 2(PC) - VLVGB R3, R0, M1 - VZERO T_6 - VZERO T_7 - VZERO T_8 - EXPACC2(M0, T_6, T_7, T_8, T_1, T_2, T_3) - EXPACC2(M1, T_6, T_7, T_8, T_1, T_2, T_3) - VLEIB $2, $1, T_8 - CMPBNE R3, $16, 2(PC) - VLEIB $10, $1, T_8 - - // add [m0, m1] to h - VAG H0_0, T_6, H0_0 - VAG H1_0, T_7, H1_0 - VAG H2_0, T_8, H2_0 - - VZERO M2 - VZERO M3 - VZERO M4 - VZERO M5 - VZERO T_10 - VZERO M0 - - // at this point R_0 .. R5_2 look like [r**2, r] - MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M2, M3, M4, M5, T_10, M0, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) - REDUCE2(H0_0, H1_0, H2_0, M2, M3, M4, M5, T_9, H0_1, H1_1, H2_1, T_10) - SUB $16, R3, R3 - CMPBLE R3, $0, next - -b1: - CMPBLE R3, $0, next - - // 1 block remaining - - // setup [r²,r] - VSLDB $8, R_0, R_0, R_0 - VSLDB $8, R_1, R_1, R_1 - VSLDB $8, R_2, R_2, R_2 - VSLDB $8, R5_1, R5_1, R5_1 - VSLDB $8, R5_2, R5_2, R5_2 - - VLVGG $1, RSAVE_0, R_0 - VLVGG $1, RSAVE_1, R_1 - VLVGG $1, RSAVE_2, R_2 - VLVGG $1, R5SAVE_1, R5_1 - VLVGG $1, R5SAVE_2, R5_2 - - // setup [h0, h1] - VSLDB $8, H0_0, H0_0, H0_0 - VSLDB $8, H1_0, H1_0, H1_0 - VSLDB $8, H2_0, H2_0, H2_0 - VO H0_1, H0_0, H0_0 - VO H1_1, H1_0, H1_0 - VO H2_1, H2_0, H2_0 - VZERO H0_1 - VZERO H1_1 - VZERO H2_1 - - VZERO M0 - VZERO M1 - VZERO M2 - VZERO M3 - VZERO M4 - VZERO M5 - - // H*[r**2, r] - MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) - REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, T_9, T_10, H0_1, M5) - - // set up [0, m0] limbs - SUB $1, R3 - VLL R3, (R2), M0 - ADD $1, R3 - MOVBZ $1, R0 - CMPBEQ R3, $16, 2(PC) - VLVGB R3, R0, M0 - VZERO T_1 - VZERO T_2 - VZERO T_3 - EXPACC2(M0, T_1, T_2, T_3, T_4, T_5, T_6)// limbs: [0, m] - CMPBNE R3, $16, 2(PC) - VLEIB $10, $1, T_3 - - // h+m0 - VAQ H0_0, T_1, H0_0 - VAQ H1_0, T_2, H1_0 - VAQ H2_0, T_3, H2_0 - - VZERO M0 - VZERO M1 - VZERO M2 - VZERO M3 - VZERO M4 - VZERO M5 - MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) - REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, T_9, T_10, H0_1, M5) - - BR next - -square: - // setup [r²,r] - VSLDB $8, R_0, R_0, R_0 - VSLDB $8, R_1, R_1, R_1 - VSLDB $8, R_2, R_2, R_2 - VSLDB $8, R5_1, R5_1, R5_1 - VSLDB $8, R5_2, R5_2, R5_2 - - VLVGG $1, RSAVE_0, R_0 - VLVGG $1, RSAVE_1, R_1 - VLVGG $1, RSAVE_2, R_2 - VLVGG $1, R5SAVE_1, R5_1 - VLVGG $1, R5SAVE_2, R5_2 - - // setup [h0, h1] - VSLDB $8, H0_0, H0_0, H0_0 - VSLDB $8, H1_0, H1_0, H1_0 - VSLDB $8, H2_0, H2_0, H2_0 - VO H0_1, H0_0, H0_0 - VO H1_1, H1_0, H1_0 - VO H2_1, H2_0, H2_0 - VZERO H0_1 - VZERO H1_1 - VZERO H2_1 - - VZERO M0 - VZERO M1 - VZERO M2 - VZERO M3 - VZERO M4 - VZERO M5 - - // (h0*r**2) + (h1*r) - MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) - REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, T_9, T_10, H0_1, M5) - BR next - -TEXT ·hasVMSLFacility(SB), NOSPLIT, $24-1 - MOVD $x-24(SP), R1 - XC $24, 0(R1), 0(R1) // clear the storage - MOVD $2, R0 // R0 is the number of double words stored -1 - WORD $0xB2B01000 // STFLE 0(R1) - XOR R0, R0 // reset the value of R0 - MOVBZ z-8(SP), R1 - AND $0x01, R1 - BEQ novmsl - -vectorinstalled: - // check if the vector instruction has been enabled - VLEIB $0, $0xF, V16 - VLGVB $0, V16, R1 - CMPBNE R1, $0xF, novmsl - MOVB $1, ret+0(FP) // have vx - RET - -novmsl: - MOVB $0, ret+0(FP) // no vx - RET diff --git a/vendor/golang.org/x/crypto/salsa20/salsa/salsa2020_amd64.s b/vendor/golang.org/x/crypto/salsa20/salsa/salsa2020_amd64.s deleted file mode 100644 index 22afbdcad..000000000 --- a/vendor/golang.org/x/crypto/salsa20/salsa/salsa2020_amd64.s +++ /dev/null @@ -1,889 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build amd64,!appengine,!gccgo - -// This code was translated into a form compatible with 6a from the public -// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html - -// func salsa2020XORKeyStream(out, in *byte, n uint64, nonce, key *byte) -// This needs up to 64 bytes at 360(SP); hence the non-obvious frame size. -TEXT ·salsa2020XORKeyStream(SB),0,$456-40 // frame = 424 + 32 byte alignment - MOVQ out+0(FP),DI - MOVQ in+8(FP),SI - MOVQ n+16(FP),DX - MOVQ nonce+24(FP),CX - MOVQ key+32(FP),R8 - - MOVQ SP,R12 - MOVQ SP,R9 - ADDQ $31, R9 - ANDQ $~31, R9 - MOVQ R9, SP - - MOVQ DX,R9 - MOVQ CX,DX - MOVQ R8,R10 - CMPQ R9,$0 - JBE DONE - START: - MOVL 20(R10),CX - MOVL 0(R10),R8 - MOVL 0(DX),AX - MOVL 16(R10),R11 - MOVL CX,0(SP) - MOVL R8, 4 (SP) - MOVL AX, 8 (SP) - MOVL R11, 12 (SP) - MOVL 8(DX),CX - MOVL 24(R10),R8 - MOVL 4(R10),AX - MOVL 4(DX),R11 - MOVL CX,16(SP) - MOVL R8, 20 (SP) - MOVL AX, 24 (SP) - MOVL R11, 28 (SP) - MOVL 12(DX),CX - MOVL 12(R10),DX - MOVL 28(R10),R8 - MOVL 8(R10),AX - MOVL DX,32(SP) - MOVL CX, 36 (SP) - MOVL R8, 40 (SP) - MOVL AX, 44 (SP) - MOVQ $1634760805,DX - MOVQ $857760878,CX - MOVQ $2036477234,R8 - MOVQ $1797285236,AX - MOVL DX,48(SP) - MOVL CX, 52 (SP) - MOVL R8, 56 (SP) - MOVL AX, 60 (SP) - CMPQ R9,$256 - JB BYTESBETWEEN1AND255 - MOVOA 48(SP),X0 - PSHUFL $0X55,X0,X1 - PSHUFL $0XAA,X0,X2 - PSHUFL $0XFF,X0,X3 - PSHUFL $0X00,X0,X0 - MOVOA X1,64(SP) - MOVOA X2,80(SP) - MOVOA X3,96(SP) - MOVOA X0,112(SP) - MOVOA 0(SP),X0 - PSHUFL $0XAA,X0,X1 - PSHUFL $0XFF,X0,X2 - PSHUFL $0X00,X0,X3 - PSHUFL $0X55,X0,X0 - MOVOA X1,128(SP) - MOVOA X2,144(SP) - MOVOA X3,160(SP) - MOVOA X0,176(SP) - MOVOA 16(SP),X0 - PSHUFL $0XFF,X0,X1 - PSHUFL $0X55,X0,X2 - PSHUFL $0XAA,X0,X0 - MOVOA X1,192(SP) - MOVOA X2,208(SP) - MOVOA X0,224(SP) - MOVOA 32(SP),X0 - PSHUFL $0X00,X0,X1 - PSHUFL $0XAA,X0,X2 - PSHUFL $0XFF,X0,X0 - MOVOA X1,240(SP) - MOVOA X2,256(SP) - MOVOA X0,272(SP) - BYTESATLEAST256: - MOVL 16(SP),DX - MOVL 36 (SP),CX - MOVL DX,288(SP) - MOVL CX,304(SP) - ADDQ $1,DX - SHLQ $32,CX - ADDQ CX,DX - MOVQ DX,CX - SHRQ $32,CX - MOVL DX, 292 (SP) - MOVL CX, 308 (SP) - ADDQ $1,DX - SHLQ $32,CX - ADDQ CX,DX - MOVQ DX,CX - SHRQ $32,CX - MOVL DX, 296 (SP) - MOVL CX, 312 (SP) - ADDQ $1,DX - SHLQ $32,CX - ADDQ CX,DX - MOVQ DX,CX - SHRQ $32,CX - MOVL DX, 300 (SP) - MOVL CX, 316 (SP) - ADDQ $1,DX - SHLQ $32,CX - ADDQ CX,DX - MOVQ DX,CX - SHRQ $32,CX - MOVL DX,16(SP) - MOVL CX, 36 (SP) - MOVQ R9,352(SP) - MOVQ $20,DX - MOVOA 64(SP),X0 - MOVOA 80(SP),X1 - MOVOA 96(SP),X2 - MOVOA 256(SP),X3 - MOVOA 272(SP),X4 - MOVOA 128(SP),X5 - MOVOA 144(SP),X6 - MOVOA 176(SP),X7 - MOVOA 192(SP),X8 - MOVOA 208(SP),X9 - MOVOA 224(SP),X10 - MOVOA 304(SP),X11 - MOVOA 112(SP),X12 - MOVOA 160(SP),X13 - MOVOA 240(SP),X14 - MOVOA 288(SP),X15 - MAINLOOP1: - MOVOA X1,320(SP) - MOVOA X2,336(SP) - MOVOA X13,X1 - PADDL X12,X1 - MOVOA X1,X2 - PSLLL $7,X1 - PXOR X1,X14 - PSRLL $25,X2 - PXOR X2,X14 - MOVOA X7,X1 - PADDL X0,X1 - MOVOA X1,X2 - PSLLL $7,X1 - PXOR X1,X11 - PSRLL $25,X2 - PXOR X2,X11 - MOVOA X12,X1 - PADDL X14,X1 - MOVOA X1,X2 - PSLLL $9,X1 - PXOR X1,X15 - PSRLL $23,X2 - PXOR X2,X15 - MOVOA X0,X1 - PADDL X11,X1 - MOVOA X1,X2 - PSLLL $9,X1 - PXOR X1,X9 - PSRLL $23,X2 - PXOR X2,X9 - MOVOA X14,X1 - PADDL X15,X1 - MOVOA X1,X2 - PSLLL $13,X1 - PXOR X1,X13 - PSRLL $19,X2 - PXOR X2,X13 - MOVOA X11,X1 - PADDL X9,X1 - MOVOA X1,X2 - PSLLL $13,X1 - PXOR X1,X7 - PSRLL $19,X2 - PXOR X2,X7 - MOVOA X15,X1 - PADDL X13,X1 - MOVOA X1,X2 - PSLLL $18,X1 - PXOR X1,X12 - PSRLL $14,X2 - PXOR X2,X12 - MOVOA 320(SP),X1 - MOVOA X12,320(SP) - MOVOA X9,X2 - PADDL X7,X2 - MOVOA X2,X12 - PSLLL $18,X2 - PXOR X2,X0 - PSRLL $14,X12 - PXOR X12,X0 - MOVOA X5,X2 - PADDL X1,X2 - MOVOA X2,X12 - PSLLL $7,X2 - PXOR X2,X3 - PSRLL $25,X12 - PXOR X12,X3 - MOVOA 336(SP),X2 - MOVOA X0,336(SP) - MOVOA X6,X0 - PADDL X2,X0 - MOVOA X0,X12 - PSLLL $7,X0 - PXOR X0,X4 - PSRLL $25,X12 - PXOR X12,X4 - MOVOA X1,X0 - PADDL X3,X0 - MOVOA X0,X12 - PSLLL $9,X0 - PXOR X0,X10 - PSRLL $23,X12 - PXOR X12,X10 - MOVOA X2,X0 - PADDL X4,X0 - MOVOA X0,X12 - PSLLL $9,X0 - PXOR X0,X8 - PSRLL $23,X12 - PXOR X12,X8 - MOVOA X3,X0 - PADDL X10,X0 - MOVOA X0,X12 - PSLLL $13,X0 - PXOR X0,X5 - PSRLL $19,X12 - PXOR X12,X5 - MOVOA X4,X0 - PADDL X8,X0 - MOVOA X0,X12 - PSLLL $13,X0 - PXOR X0,X6 - PSRLL $19,X12 - PXOR X12,X6 - MOVOA X10,X0 - PADDL X5,X0 - MOVOA X0,X12 - PSLLL $18,X0 - PXOR X0,X1 - PSRLL $14,X12 - PXOR X12,X1 - MOVOA 320(SP),X0 - MOVOA X1,320(SP) - MOVOA X4,X1 - PADDL X0,X1 - MOVOA X1,X12 - PSLLL $7,X1 - PXOR X1,X7 - PSRLL $25,X12 - PXOR X12,X7 - MOVOA X8,X1 - PADDL X6,X1 - MOVOA X1,X12 - PSLLL $18,X1 - PXOR X1,X2 - PSRLL $14,X12 - PXOR X12,X2 - MOVOA 336(SP),X12 - MOVOA X2,336(SP) - MOVOA X14,X1 - PADDL X12,X1 - MOVOA X1,X2 - PSLLL $7,X1 - PXOR X1,X5 - PSRLL $25,X2 - PXOR X2,X5 - MOVOA X0,X1 - PADDL X7,X1 - MOVOA X1,X2 - PSLLL $9,X1 - PXOR X1,X10 - PSRLL $23,X2 - PXOR X2,X10 - MOVOA X12,X1 - PADDL X5,X1 - MOVOA X1,X2 - PSLLL $9,X1 - PXOR X1,X8 - PSRLL $23,X2 - PXOR X2,X8 - MOVOA X7,X1 - PADDL X10,X1 - MOVOA X1,X2 - PSLLL $13,X1 - PXOR X1,X4 - PSRLL $19,X2 - PXOR X2,X4 - MOVOA X5,X1 - PADDL X8,X1 - MOVOA X1,X2 - PSLLL $13,X1 - PXOR X1,X14 - PSRLL $19,X2 - PXOR X2,X14 - MOVOA X10,X1 - PADDL X4,X1 - MOVOA X1,X2 - PSLLL $18,X1 - PXOR X1,X0 - PSRLL $14,X2 - PXOR X2,X0 - MOVOA 320(SP),X1 - MOVOA X0,320(SP) - MOVOA X8,X0 - PADDL X14,X0 - MOVOA X0,X2 - PSLLL $18,X0 - PXOR X0,X12 - PSRLL $14,X2 - PXOR X2,X12 - MOVOA X11,X0 - PADDL X1,X0 - MOVOA X0,X2 - PSLLL $7,X0 - PXOR X0,X6 - PSRLL $25,X2 - PXOR X2,X6 - MOVOA 336(SP),X2 - MOVOA X12,336(SP) - MOVOA X3,X0 - PADDL X2,X0 - MOVOA X0,X12 - PSLLL $7,X0 - PXOR X0,X13 - PSRLL $25,X12 - PXOR X12,X13 - MOVOA X1,X0 - PADDL X6,X0 - MOVOA X0,X12 - PSLLL $9,X0 - PXOR X0,X15 - PSRLL $23,X12 - PXOR X12,X15 - MOVOA X2,X0 - PADDL X13,X0 - MOVOA X0,X12 - PSLLL $9,X0 - PXOR X0,X9 - PSRLL $23,X12 - PXOR X12,X9 - MOVOA X6,X0 - PADDL X15,X0 - MOVOA X0,X12 - PSLLL $13,X0 - PXOR X0,X11 - PSRLL $19,X12 - PXOR X12,X11 - MOVOA X13,X0 - PADDL X9,X0 - MOVOA X0,X12 - PSLLL $13,X0 - PXOR X0,X3 - PSRLL $19,X12 - PXOR X12,X3 - MOVOA X15,X0 - PADDL X11,X0 - MOVOA X0,X12 - PSLLL $18,X0 - PXOR X0,X1 - PSRLL $14,X12 - PXOR X12,X1 - MOVOA X9,X0 - PADDL X3,X0 - MOVOA X0,X12 - PSLLL $18,X0 - PXOR X0,X2 - PSRLL $14,X12 - PXOR X12,X2 - MOVOA 320(SP),X12 - MOVOA 336(SP),X0 - SUBQ $2,DX - JA MAINLOOP1 - PADDL 112(SP),X12 - PADDL 176(SP),X7 - PADDL 224(SP),X10 - PADDL 272(SP),X4 - MOVD X12,DX - MOVD X7,CX - MOVD X10,R8 - MOVD X4,R9 - PSHUFL $0X39,X12,X12 - PSHUFL $0X39,X7,X7 - PSHUFL $0X39,X10,X10 - PSHUFL $0X39,X4,X4 - XORL 0(SI),DX - XORL 4(SI),CX - XORL 8(SI),R8 - XORL 12(SI),R9 - MOVL DX,0(DI) - MOVL CX,4(DI) - MOVL R8,8(DI) - MOVL R9,12(DI) - MOVD X12,DX - MOVD X7,CX - MOVD X10,R8 - MOVD X4,R9 - PSHUFL $0X39,X12,X12 - PSHUFL $0X39,X7,X7 - PSHUFL $0X39,X10,X10 - PSHUFL $0X39,X4,X4 - XORL 64(SI),DX - XORL 68(SI),CX - XORL 72(SI),R8 - XORL 76(SI),R9 - MOVL DX,64(DI) - MOVL CX,68(DI) - MOVL R8,72(DI) - MOVL R9,76(DI) - MOVD X12,DX - MOVD X7,CX - MOVD X10,R8 - MOVD X4,R9 - PSHUFL $0X39,X12,X12 - PSHUFL $0X39,X7,X7 - PSHUFL $0X39,X10,X10 - PSHUFL $0X39,X4,X4 - XORL 128(SI),DX - XORL 132(SI),CX - XORL 136(SI),R8 - XORL 140(SI),R9 - MOVL DX,128(DI) - MOVL CX,132(DI) - MOVL R8,136(DI) - MOVL R9,140(DI) - MOVD X12,DX - MOVD X7,CX - MOVD X10,R8 - MOVD X4,R9 - XORL 192(SI),DX - XORL 196(SI),CX - XORL 200(SI),R8 - XORL 204(SI),R9 - MOVL DX,192(DI) - MOVL CX,196(DI) - MOVL R8,200(DI) - MOVL R9,204(DI) - PADDL 240(SP),X14 - PADDL 64(SP),X0 - PADDL 128(SP),X5 - PADDL 192(SP),X8 - MOVD X14,DX - MOVD X0,CX - MOVD X5,R8 - MOVD X8,R9 - PSHUFL $0X39,X14,X14 - PSHUFL $0X39,X0,X0 - PSHUFL $0X39,X5,X5 - PSHUFL $0X39,X8,X8 - XORL 16(SI),DX - XORL 20(SI),CX - XORL 24(SI),R8 - XORL 28(SI),R9 - MOVL DX,16(DI) - MOVL CX,20(DI) - MOVL R8,24(DI) - MOVL R9,28(DI) - MOVD X14,DX - MOVD X0,CX - MOVD X5,R8 - MOVD X8,R9 - PSHUFL $0X39,X14,X14 - PSHUFL $0X39,X0,X0 - PSHUFL $0X39,X5,X5 - PSHUFL $0X39,X8,X8 - XORL 80(SI),DX - XORL 84(SI),CX - XORL 88(SI),R8 - XORL 92(SI),R9 - MOVL DX,80(DI) - MOVL CX,84(DI) - MOVL R8,88(DI) - MOVL R9,92(DI) - MOVD X14,DX - MOVD X0,CX - MOVD X5,R8 - MOVD X8,R9 - PSHUFL $0X39,X14,X14 - PSHUFL $0X39,X0,X0 - PSHUFL $0X39,X5,X5 - PSHUFL $0X39,X8,X8 - XORL 144(SI),DX - XORL 148(SI),CX - XORL 152(SI),R8 - XORL 156(SI),R9 - MOVL DX,144(DI) - MOVL CX,148(DI) - MOVL R8,152(DI) - MOVL R9,156(DI) - MOVD X14,DX - MOVD X0,CX - MOVD X5,R8 - MOVD X8,R9 - XORL 208(SI),DX - XORL 212(SI),CX - XORL 216(SI),R8 - XORL 220(SI),R9 - MOVL DX,208(DI) - MOVL CX,212(DI) - MOVL R8,216(DI) - MOVL R9,220(DI) - PADDL 288(SP),X15 - PADDL 304(SP),X11 - PADDL 80(SP),X1 - PADDL 144(SP),X6 - MOVD X15,DX - MOVD X11,CX - MOVD X1,R8 - MOVD X6,R9 - PSHUFL $0X39,X15,X15 - PSHUFL $0X39,X11,X11 - PSHUFL $0X39,X1,X1 - PSHUFL $0X39,X6,X6 - XORL 32(SI),DX - XORL 36(SI),CX - XORL 40(SI),R8 - XORL 44(SI),R9 - MOVL DX,32(DI) - MOVL CX,36(DI) - MOVL R8,40(DI) - MOVL R9,44(DI) - MOVD X15,DX - MOVD X11,CX - MOVD X1,R8 - MOVD X6,R9 - PSHUFL $0X39,X15,X15 - PSHUFL $0X39,X11,X11 - PSHUFL $0X39,X1,X1 - PSHUFL $0X39,X6,X6 - XORL 96(SI),DX - XORL 100(SI),CX - XORL 104(SI),R8 - XORL 108(SI),R9 - MOVL DX,96(DI) - MOVL CX,100(DI) - MOVL R8,104(DI) - MOVL R9,108(DI) - MOVD X15,DX - MOVD X11,CX - MOVD X1,R8 - MOVD X6,R9 - PSHUFL $0X39,X15,X15 - PSHUFL $0X39,X11,X11 - PSHUFL $0X39,X1,X1 - PSHUFL $0X39,X6,X6 - XORL 160(SI),DX - XORL 164(SI),CX - XORL 168(SI),R8 - XORL 172(SI),R9 - MOVL DX,160(DI) - MOVL CX,164(DI) - MOVL R8,168(DI) - MOVL R9,172(DI) - MOVD X15,DX - MOVD X11,CX - MOVD X1,R8 - MOVD X6,R9 - XORL 224(SI),DX - XORL 228(SI),CX - XORL 232(SI),R8 - XORL 236(SI),R9 - MOVL DX,224(DI) - MOVL CX,228(DI) - MOVL R8,232(DI) - MOVL R9,236(DI) - PADDL 160(SP),X13 - PADDL 208(SP),X9 - PADDL 256(SP),X3 - PADDL 96(SP),X2 - MOVD X13,DX - MOVD X9,CX - MOVD X3,R8 - MOVD X2,R9 - PSHUFL $0X39,X13,X13 - PSHUFL $0X39,X9,X9 - PSHUFL $0X39,X3,X3 - PSHUFL $0X39,X2,X2 - XORL 48(SI),DX - XORL 52(SI),CX - XORL 56(SI),R8 - XORL 60(SI),R9 - MOVL DX,48(DI) - MOVL CX,52(DI) - MOVL R8,56(DI) - MOVL R9,60(DI) - MOVD X13,DX - MOVD X9,CX - MOVD X3,R8 - MOVD X2,R9 - PSHUFL $0X39,X13,X13 - PSHUFL $0X39,X9,X9 - PSHUFL $0X39,X3,X3 - PSHUFL $0X39,X2,X2 - XORL 112(SI),DX - XORL 116(SI),CX - XORL 120(SI),R8 - XORL 124(SI),R9 - MOVL DX,112(DI) - MOVL CX,116(DI) - MOVL R8,120(DI) - MOVL R9,124(DI) - MOVD X13,DX - MOVD X9,CX - MOVD X3,R8 - MOVD X2,R9 - PSHUFL $0X39,X13,X13 - PSHUFL $0X39,X9,X9 - PSHUFL $0X39,X3,X3 - PSHUFL $0X39,X2,X2 - XORL 176(SI),DX - XORL 180(SI),CX - XORL 184(SI),R8 - XORL 188(SI),R9 - MOVL DX,176(DI) - MOVL CX,180(DI) - MOVL R8,184(DI) - MOVL R9,188(DI) - MOVD X13,DX - MOVD X9,CX - MOVD X3,R8 - MOVD X2,R9 - XORL 240(SI),DX - XORL 244(SI),CX - XORL 248(SI),R8 - XORL 252(SI),R9 - MOVL DX,240(DI) - MOVL CX,244(DI) - MOVL R8,248(DI) - MOVL R9,252(DI) - MOVQ 352(SP),R9 - SUBQ $256,R9 - ADDQ $256,SI - ADDQ $256,DI - CMPQ R9,$256 - JAE BYTESATLEAST256 - CMPQ R9,$0 - JBE DONE - BYTESBETWEEN1AND255: - CMPQ R9,$64 - JAE NOCOPY - MOVQ DI,DX - LEAQ 360(SP),DI - MOVQ R9,CX - REP; MOVSB - LEAQ 360(SP),DI - LEAQ 360(SP),SI - NOCOPY: - MOVQ R9,352(SP) - MOVOA 48(SP),X0 - MOVOA 0(SP),X1 - MOVOA 16(SP),X2 - MOVOA 32(SP),X3 - MOVOA X1,X4 - MOVQ $20,CX - MAINLOOP2: - PADDL X0,X4 - MOVOA X0,X5 - MOVOA X4,X6 - PSLLL $7,X4 - PSRLL $25,X6 - PXOR X4,X3 - PXOR X6,X3 - PADDL X3,X5 - MOVOA X3,X4 - MOVOA X5,X6 - PSLLL $9,X5 - PSRLL $23,X6 - PXOR X5,X2 - PSHUFL $0X93,X3,X3 - PXOR X6,X2 - PADDL X2,X4 - MOVOA X2,X5 - MOVOA X4,X6 - PSLLL $13,X4 - PSRLL $19,X6 - PXOR X4,X1 - PSHUFL $0X4E,X2,X2 - PXOR X6,X1 - PADDL X1,X5 - MOVOA X3,X4 - MOVOA X5,X6 - PSLLL $18,X5 - PSRLL $14,X6 - PXOR X5,X0 - PSHUFL $0X39,X1,X1 - PXOR X6,X0 - PADDL X0,X4 - MOVOA X0,X5 - MOVOA X4,X6 - PSLLL $7,X4 - PSRLL $25,X6 - PXOR X4,X1 - PXOR X6,X1 - PADDL X1,X5 - MOVOA X1,X4 - MOVOA X5,X6 - PSLLL $9,X5 - PSRLL $23,X6 - PXOR X5,X2 - PSHUFL $0X93,X1,X1 - PXOR X6,X2 - PADDL X2,X4 - MOVOA X2,X5 - MOVOA X4,X6 - PSLLL $13,X4 - PSRLL $19,X6 - PXOR X4,X3 - PSHUFL $0X4E,X2,X2 - PXOR X6,X3 - PADDL X3,X5 - MOVOA X1,X4 - MOVOA X5,X6 - PSLLL $18,X5 - PSRLL $14,X6 - PXOR X5,X0 - PSHUFL $0X39,X3,X3 - PXOR X6,X0 - PADDL X0,X4 - MOVOA X0,X5 - MOVOA X4,X6 - PSLLL $7,X4 - PSRLL $25,X6 - PXOR X4,X3 - PXOR X6,X3 - PADDL X3,X5 - MOVOA X3,X4 - MOVOA X5,X6 - PSLLL $9,X5 - PSRLL $23,X6 - PXOR X5,X2 - PSHUFL $0X93,X3,X3 - PXOR X6,X2 - PADDL X2,X4 - MOVOA X2,X5 - MOVOA X4,X6 - PSLLL $13,X4 - PSRLL $19,X6 - PXOR X4,X1 - PSHUFL $0X4E,X2,X2 - PXOR X6,X1 - PADDL X1,X5 - MOVOA X3,X4 - MOVOA X5,X6 - PSLLL $18,X5 - PSRLL $14,X6 - PXOR X5,X0 - PSHUFL $0X39,X1,X1 - PXOR X6,X0 - PADDL X0,X4 - MOVOA X0,X5 - MOVOA X4,X6 - PSLLL $7,X4 - PSRLL $25,X6 - PXOR X4,X1 - PXOR X6,X1 - PADDL X1,X5 - MOVOA X1,X4 - MOVOA X5,X6 - PSLLL $9,X5 - PSRLL $23,X6 - PXOR X5,X2 - PSHUFL $0X93,X1,X1 - PXOR X6,X2 - PADDL X2,X4 - MOVOA X2,X5 - MOVOA X4,X6 - PSLLL $13,X4 - PSRLL $19,X6 - PXOR X4,X3 - PSHUFL $0X4E,X2,X2 - PXOR X6,X3 - SUBQ $4,CX - PADDL X3,X5 - MOVOA X1,X4 - MOVOA X5,X6 - PSLLL $18,X5 - PXOR X7,X7 - PSRLL $14,X6 - PXOR X5,X0 - PSHUFL $0X39,X3,X3 - PXOR X6,X0 - JA MAINLOOP2 - PADDL 48(SP),X0 - PADDL 0(SP),X1 - PADDL 16(SP),X2 - PADDL 32(SP),X3 - MOVD X0,CX - MOVD X1,R8 - MOVD X2,R9 - MOVD X3,AX - PSHUFL $0X39,X0,X0 - PSHUFL $0X39,X1,X1 - PSHUFL $0X39,X2,X2 - PSHUFL $0X39,X3,X3 - XORL 0(SI),CX - XORL 48(SI),R8 - XORL 32(SI),R9 - XORL 16(SI),AX - MOVL CX,0(DI) - MOVL R8,48(DI) - MOVL R9,32(DI) - MOVL AX,16(DI) - MOVD X0,CX - MOVD X1,R8 - MOVD X2,R9 - MOVD X3,AX - PSHUFL $0X39,X0,X0 - PSHUFL $0X39,X1,X1 - PSHUFL $0X39,X2,X2 - PSHUFL $0X39,X3,X3 - XORL 20(SI),CX - XORL 4(SI),R8 - XORL 52(SI),R9 - XORL 36(SI),AX - MOVL CX,20(DI) - MOVL R8,4(DI) - MOVL R9,52(DI) - MOVL AX,36(DI) - MOVD X0,CX - MOVD X1,R8 - MOVD X2,R9 - MOVD X3,AX - PSHUFL $0X39,X0,X0 - PSHUFL $0X39,X1,X1 - PSHUFL $0X39,X2,X2 - PSHUFL $0X39,X3,X3 - XORL 40(SI),CX - XORL 24(SI),R8 - XORL 8(SI),R9 - XORL 56(SI),AX - MOVL CX,40(DI) - MOVL R8,24(DI) - MOVL R9,8(DI) - MOVL AX,56(DI) - MOVD X0,CX - MOVD X1,R8 - MOVD X2,R9 - MOVD X3,AX - XORL 60(SI),CX - XORL 44(SI),R8 - XORL 28(SI),R9 - XORL 12(SI),AX - MOVL CX,60(DI) - MOVL R8,44(DI) - MOVL R9,28(DI) - MOVL AX,12(DI) - MOVQ 352(SP),R9 - MOVL 16(SP),CX - MOVL 36 (SP),R8 - ADDQ $1,CX - SHLQ $32,R8 - ADDQ R8,CX - MOVQ CX,R8 - SHRQ $32,R8 - MOVL CX,16(SP) - MOVL R8, 36 (SP) - CMPQ R9,$64 - JA BYTESATLEAST65 - JAE BYTESATLEAST64 - MOVQ DI,SI - MOVQ DX,DI - MOVQ R9,CX - REP; MOVSB - BYTESATLEAST64: - DONE: - MOVQ R12,SP - RET - BYTESATLEAST65: - SUBQ $64,R9 - ADDQ $64,DI - ADDQ $64,SI - JMP BYTESBETWEEN1AND255 diff --git a/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_amd64.go b/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_amd64.go index f9269c384..656e8df94 100644 --- a/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_amd64.go +++ b/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_amd64.go @@ -6,10 +6,9 @@ package salsa -// This function is implemented in salsa2020_amd64.s. - //go:noescape +// salsa2020XORKeyStream is implemented in salsa20_amd64.s. func salsa2020XORKeyStream(out, in *byte, n uint64, nonce, key *byte) // XORKeyStream crypts bytes from in to out using the given key and counters. diff --git a/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_amd64.s b/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_amd64.s new file mode 100644 index 000000000..18085d2e8 --- /dev/null +++ b/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_amd64.s @@ -0,0 +1,883 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,!appengine,!gccgo + +// This code was translated into a form compatible with 6a from the public +// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html + +// func salsa2020XORKeyStream(out, in *byte, n uint64, nonce, key *byte) +// This needs up to 64 bytes at 360(SP); hence the non-obvious frame size. +TEXT ·salsa2020XORKeyStream(SB),0,$456-40 // frame = 424 + 32 byte alignment + MOVQ out+0(FP),DI + MOVQ in+8(FP),SI + MOVQ n+16(FP),DX + MOVQ nonce+24(FP),CX + MOVQ key+32(FP),R8 + + MOVQ SP,R12 + MOVQ SP,R9 + ADDQ $31, R9 + ANDQ $~31, R9 + MOVQ R9, SP + + MOVQ DX,R9 + MOVQ CX,DX + MOVQ R8,R10 + CMPQ R9,$0 + JBE DONE + START: + MOVL 20(R10),CX + MOVL 0(R10),R8 + MOVL 0(DX),AX + MOVL 16(R10),R11 + MOVL CX,0(SP) + MOVL R8, 4 (SP) + MOVL AX, 8 (SP) + MOVL R11, 12 (SP) + MOVL 8(DX),CX + MOVL 24(R10),R8 + MOVL 4(R10),AX + MOVL 4(DX),R11 + MOVL CX,16(SP) + MOVL R8, 20 (SP) + MOVL AX, 24 (SP) + MOVL R11, 28 (SP) + MOVL 12(DX),CX + MOVL 12(R10),DX + MOVL 28(R10),R8 + MOVL 8(R10),AX + MOVL DX,32(SP) + MOVL CX, 36 (SP) + MOVL R8, 40 (SP) + MOVL AX, 44 (SP) + MOVQ $1634760805,DX + MOVQ $857760878,CX + MOVQ $2036477234,R8 + MOVQ $1797285236,AX + MOVL DX,48(SP) + MOVL CX, 52 (SP) + MOVL R8, 56 (SP) + MOVL AX, 60 (SP) + CMPQ R9,$256 + JB BYTESBETWEEN1AND255 + MOVOA 48(SP),X0 + PSHUFL $0X55,X0,X1 + PSHUFL $0XAA,X0,X2 + PSHUFL $0XFF,X0,X3 + PSHUFL $0X00,X0,X0 + MOVOA X1,64(SP) + MOVOA X2,80(SP) + MOVOA X3,96(SP) + MOVOA X0,112(SP) + MOVOA 0(SP),X0 + PSHUFL $0XAA,X0,X1 + PSHUFL $0XFF,X0,X2 + PSHUFL $0X00,X0,X3 + PSHUFL $0X55,X0,X0 + MOVOA X1,128(SP) + MOVOA X2,144(SP) + MOVOA X3,160(SP) + MOVOA X0,176(SP) + MOVOA 16(SP),X0 + PSHUFL $0XFF,X0,X1 + PSHUFL $0X55,X0,X2 + PSHUFL $0XAA,X0,X0 + MOVOA X1,192(SP) + MOVOA X2,208(SP) + MOVOA X0,224(SP) + MOVOA 32(SP),X0 + PSHUFL $0X00,X0,X1 + PSHUFL $0XAA,X0,X2 + PSHUFL $0XFF,X0,X0 + MOVOA X1,240(SP) + MOVOA X2,256(SP) + MOVOA X0,272(SP) + BYTESATLEAST256: + MOVL 16(SP),DX + MOVL 36 (SP),CX + MOVL DX,288(SP) + MOVL CX,304(SP) + SHLQ $32,CX + ADDQ CX,DX + ADDQ $1,DX + MOVQ DX,CX + SHRQ $32,CX + MOVL DX, 292 (SP) + MOVL CX, 308 (SP) + ADDQ $1,DX + MOVQ DX,CX + SHRQ $32,CX + MOVL DX, 296 (SP) + MOVL CX, 312 (SP) + ADDQ $1,DX + MOVQ DX,CX + SHRQ $32,CX + MOVL DX, 300 (SP) + MOVL CX, 316 (SP) + ADDQ $1,DX + MOVQ DX,CX + SHRQ $32,CX + MOVL DX,16(SP) + MOVL CX, 36 (SP) + MOVQ R9,352(SP) + MOVQ $20,DX + MOVOA 64(SP),X0 + MOVOA 80(SP),X1 + MOVOA 96(SP),X2 + MOVOA 256(SP),X3 + MOVOA 272(SP),X4 + MOVOA 128(SP),X5 + MOVOA 144(SP),X6 + MOVOA 176(SP),X7 + MOVOA 192(SP),X8 + MOVOA 208(SP),X9 + MOVOA 224(SP),X10 + MOVOA 304(SP),X11 + MOVOA 112(SP),X12 + MOVOA 160(SP),X13 + MOVOA 240(SP),X14 + MOVOA 288(SP),X15 + MAINLOOP1: + MOVOA X1,320(SP) + MOVOA X2,336(SP) + MOVOA X13,X1 + PADDL X12,X1 + MOVOA X1,X2 + PSLLL $7,X1 + PXOR X1,X14 + PSRLL $25,X2 + PXOR X2,X14 + MOVOA X7,X1 + PADDL X0,X1 + MOVOA X1,X2 + PSLLL $7,X1 + PXOR X1,X11 + PSRLL $25,X2 + PXOR X2,X11 + MOVOA X12,X1 + PADDL X14,X1 + MOVOA X1,X2 + PSLLL $9,X1 + PXOR X1,X15 + PSRLL $23,X2 + PXOR X2,X15 + MOVOA X0,X1 + PADDL X11,X1 + MOVOA X1,X2 + PSLLL $9,X1 + PXOR X1,X9 + PSRLL $23,X2 + PXOR X2,X9 + MOVOA X14,X1 + PADDL X15,X1 + MOVOA X1,X2 + PSLLL $13,X1 + PXOR X1,X13 + PSRLL $19,X2 + PXOR X2,X13 + MOVOA X11,X1 + PADDL X9,X1 + MOVOA X1,X2 + PSLLL $13,X1 + PXOR X1,X7 + PSRLL $19,X2 + PXOR X2,X7 + MOVOA X15,X1 + PADDL X13,X1 + MOVOA X1,X2 + PSLLL $18,X1 + PXOR X1,X12 + PSRLL $14,X2 + PXOR X2,X12 + MOVOA 320(SP),X1 + MOVOA X12,320(SP) + MOVOA X9,X2 + PADDL X7,X2 + MOVOA X2,X12 + PSLLL $18,X2 + PXOR X2,X0 + PSRLL $14,X12 + PXOR X12,X0 + MOVOA X5,X2 + PADDL X1,X2 + MOVOA X2,X12 + PSLLL $7,X2 + PXOR X2,X3 + PSRLL $25,X12 + PXOR X12,X3 + MOVOA 336(SP),X2 + MOVOA X0,336(SP) + MOVOA X6,X0 + PADDL X2,X0 + MOVOA X0,X12 + PSLLL $7,X0 + PXOR X0,X4 + PSRLL $25,X12 + PXOR X12,X4 + MOVOA X1,X0 + PADDL X3,X0 + MOVOA X0,X12 + PSLLL $9,X0 + PXOR X0,X10 + PSRLL $23,X12 + PXOR X12,X10 + MOVOA X2,X0 + PADDL X4,X0 + MOVOA X0,X12 + PSLLL $9,X0 + PXOR X0,X8 + PSRLL $23,X12 + PXOR X12,X8 + MOVOA X3,X0 + PADDL X10,X0 + MOVOA X0,X12 + PSLLL $13,X0 + PXOR X0,X5 + PSRLL $19,X12 + PXOR X12,X5 + MOVOA X4,X0 + PADDL X8,X0 + MOVOA X0,X12 + PSLLL $13,X0 + PXOR X0,X6 + PSRLL $19,X12 + PXOR X12,X6 + MOVOA X10,X0 + PADDL X5,X0 + MOVOA X0,X12 + PSLLL $18,X0 + PXOR X0,X1 + PSRLL $14,X12 + PXOR X12,X1 + MOVOA 320(SP),X0 + MOVOA X1,320(SP) + MOVOA X4,X1 + PADDL X0,X1 + MOVOA X1,X12 + PSLLL $7,X1 + PXOR X1,X7 + PSRLL $25,X12 + PXOR X12,X7 + MOVOA X8,X1 + PADDL X6,X1 + MOVOA X1,X12 + PSLLL $18,X1 + PXOR X1,X2 + PSRLL $14,X12 + PXOR X12,X2 + MOVOA 336(SP),X12 + MOVOA X2,336(SP) + MOVOA X14,X1 + PADDL X12,X1 + MOVOA X1,X2 + PSLLL $7,X1 + PXOR X1,X5 + PSRLL $25,X2 + PXOR X2,X5 + MOVOA X0,X1 + PADDL X7,X1 + MOVOA X1,X2 + PSLLL $9,X1 + PXOR X1,X10 + PSRLL $23,X2 + PXOR X2,X10 + MOVOA X12,X1 + PADDL X5,X1 + MOVOA X1,X2 + PSLLL $9,X1 + PXOR X1,X8 + PSRLL $23,X2 + PXOR X2,X8 + MOVOA X7,X1 + PADDL X10,X1 + MOVOA X1,X2 + PSLLL $13,X1 + PXOR X1,X4 + PSRLL $19,X2 + PXOR X2,X4 + MOVOA X5,X1 + PADDL X8,X1 + MOVOA X1,X2 + PSLLL $13,X1 + PXOR X1,X14 + PSRLL $19,X2 + PXOR X2,X14 + MOVOA X10,X1 + PADDL X4,X1 + MOVOA X1,X2 + PSLLL $18,X1 + PXOR X1,X0 + PSRLL $14,X2 + PXOR X2,X0 + MOVOA 320(SP),X1 + MOVOA X0,320(SP) + MOVOA X8,X0 + PADDL X14,X0 + MOVOA X0,X2 + PSLLL $18,X0 + PXOR X0,X12 + PSRLL $14,X2 + PXOR X2,X12 + MOVOA X11,X0 + PADDL X1,X0 + MOVOA X0,X2 + PSLLL $7,X0 + PXOR X0,X6 + PSRLL $25,X2 + PXOR X2,X6 + MOVOA 336(SP),X2 + MOVOA X12,336(SP) + MOVOA X3,X0 + PADDL X2,X0 + MOVOA X0,X12 + PSLLL $7,X0 + PXOR X0,X13 + PSRLL $25,X12 + PXOR X12,X13 + MOVOA X1,X0 + PADDL X6,X0 + MOVOA X0,X12 + PSLLL $9,X0 + PXOR X0,X15 + PSRLL $23,X12 + PXOR X12,X15 + MOVOA X2,X0 + PADDL X13,X0 + MOVOA X0,X12 + PSLLL $9,X0 + PXOR X0,X9 + PSRLL $23,X12 + PXOR X12,X9 + MOVOA X6,X0 + PADDL X15,X0 + MOVOA X0,X12 + PSLLL $13,X0 + PXOR X0,X11 + PSRLL $19,X12 + PXOR X12,X11 + MOVOA X13,X0 + PADDL X9,X0 + MOVOA X0,X12 + PSLLL $13,X0 + PXOR X0,X3 + PSRLL $19,X12 + PXOR X12,X3 + MOVOA X15,X0 + PADDL X11,X0 + MOVOA X0,X12 + PSLLL $18,X0 + PXOR X0,X1 + PSRLL $14,X12 + PXOR X12,X1 + MOVOA X9,X0 + PADDL X3,X0 + MOVOA X0,X12 + PSLLL $18,X0 + PXOR X0,X2 + PSRLL $14,X12 + PXOR X12,X2 + MOVOA 320(SP),X12 + MOVOA 336(SP),X0 + SUBQ $2,DX + JA MAINLOOP1 + PADDL 112(SP),X12 + PADDL 176(SP),X7 + PADDL 224(SP),X10 + PADDL 272(SP),X4 + MOVD X12,DX + MOVD X7,CX + MOVD X10,R8 + MOVD X4,R9 + PSHUFL $0X39,X12,X12 + PSHUFL $0X39,X7,X7 + PSHUFL $0X39,X10,X10 + PSHUFL $0X39,X4,X4 + XORL 0(SI),DX + XORL 4(SI),CX + XORL 8(SI),R8 + XORL 12(SI),R9 + MOVL DX,0(DI) + MOVL CX,4(DI) + MOVL R8,8(DI) + MOVL R9,12(DI) + MOVD X12,DX + MOVD X7,CX + MOVD X10,R8 + MOVD X4,R9 + PSHUFL $0X39,X12,X12 + PSHUFL $0X39,X7,X7 + PSHUFL $0X39,X10,X10 + PSHUFL $0X39,X4,X4 + XORL 64(SI),DX + XORL 68(SI),CX + XORL 72(SI),R8 + XORL 76(SI),R9 + MOVL DX,64(DI) + MOVL CX,68(DI) + MOVL R8,72(DI) + MOVL R9,76(DI) + MOVD X12,DX + MOVD X7,CX + MOVD X10,R8 + MOVD X4,R9 + PSHUFL $0X39,X12,X12 + PSHUFL $0X39,X7,X7 + PSHUFL $0X39,X10,X10 + PSHUFL $0X39,X4,X4 + XORL 128(SI),DX + XORL 132(SI),CX + XORL 136(SI),R8 + XORL 140(SI),R9 + MOVL DX,128(DI) + MOVL CX,132(DI) + MOVL R8,136(DI) + MOVL R9,140(DI) + MOVD X12,DX + MOVD X7,CX + MOVD X10,R8 + MOVD X4,R9 + XORL 192(SI),DX + XORL 196(SI),CX + XORL 200(SI),R8 + XORL 204(SI),R9 + MOVL DX,192(DI) + MOVL CX,196(DI) + MOVL R8,200(DI) + MOVL R9,204(DI) + PADDL 240(SP),X14 + PADDL 64(SP),X0 + PADDL 128(SP),X5 + PADDL 192(SP),X8 + MOVD X14,DX + MOVD X0,CX + MOVD X5,R8 + MOVD X8,R9 + PSHUFL $0X39,X14,X14 + PSHUFL $0X39,X0,X0 + PSHUFL $0X39,X5,X5 + PSHUFL $0X39,X8,X8 + XORL 16(SI),DX + XORL 20(SI),CX + XORL 24(SI),R8 + XORL 28(SI),R9 + MOVL DX,16(DI) + MOVL CX,20(DI) + MOVL R8,24(DI) + MOVL R9,28(DI) + MOVD X14,DX + MOVD X0,CX + MOVD X5,R8 + MOVD X8,R9 + PSHUFL $0X39,X14,X14 + PSHUFL $0X39,X0,X0 + PSHUFL $0X39,X5,X5 + PSHUFL $0X39,X8,X8 + XORL 80(SI),DX + XORL 84(SI),CX + XORL 88(SI),R8 + XORL 92(SI),R9 + MOVL DX,80(DI) + MOVL CX,84(DI) + MOVL R8,88(DI) + MOVL R9,92(DI) + MOVD X14,DX + MOVD X0,CX + MOVD X5,R8 + MOVD X8,R9 + PSHUFL $0X39,X14,X14 + PSHUFL $0X39,X0,X0 + PSHUFL $0X39,X5,X5 + PSHUFL $0X39,X8,X8 + XORL 144(SI),DX + XORL 148(SI),CX + XORL 152(SI),R8 + XORL 156(SI),R9 + MOVL DX,144(DI) + MOVL CX,148(DI) + MOVL R8,152(DI) + MOVL R9,156(DI) + MOVD X14,DX + MOVD X0,CX + MOVD X5,R8 + MOVD X8,R9 + XORL 208(SI),DX + XORL 212(SI),CX + XORL 216(SI),R8 + XORL 220(SI),R9 + MOVL DX,208(DI) + MOVL CX,212(DI) + MOVL R8,216(DI) + MOVL R9,220(DI) + PADDL 288(SP),X15 + PADDL 304(SP),X11 + PADDL 80(SP),X1 + PADDL 144(SP),X6 + MOVD X15,DX + MOVD X11,CX + MOVD X1,R8 + MOVD X6,R9 + PSHUFL $0X39,X15,X15 + PSHUFL $0X39,X11,X11 + PSHUFL $0X39,X1,X1 + PSHUFL $0X39,X6,X6 + XORL 32(SI),DX + XORL 36(SI),CX + XORL 40(SI),R8 + XORL 44(SI),R9 + MOVL DX,32(DI) + MOVL CX,36(DI) + MOVL R8,40(DI) + MOVL R9,44(DI) + MOVD X15,DX + MOVD X11,CX + MOVD X1,R8 + MOVD X6,R9 + PSHUFL $0X39,X15,X15 + PSHUFL $0X39,X11,X11 + PSHUFL $0X39,X1,X1 + PSHUFL $0X39,X6,X6 + XORL 96(SI),DX + XORL 100(SI),CX + XORL 104(SI),R8 + XORL 108(SI),R9 + MOVL DX,96(DI) + MOVL CX,100(DI) + MOVL R8,104(DI) + MOVL R9,108(DI) + MOVD X15,DX + MOVD X11,CX + MOVD X1,R8 + MOVD X6,R9 + PSHUFL $0X39,X15,X15 + PSHUFL $0X39,X11,X11 + PSHUFL $0X39,X1,X1 + PSHUFL $0X39,X6,X6 + XORL 160(SI),DX + XORL 164(SI),CX + XORL 168(SI),R8 + XORL 172(SI),R9 + MOVL DX,160(DI) + MOVL CX,164(DI) + MOVL R8,168(DI) + MOVL R9,172(DI) + MOVD X15,DX + MOVD X11,CX + MOVD X1,R8 + MOVD X6,R9 + XORL 224(SI),DX + XORL 228(SI),CX + XORL 232(SI),R8 + XORL 236(SI),R9 + MOVL DX,224(DI) + MOVL CX,228(DI) + MOVL R8,232(DI) + MOVL R9,236(DI) + PADDL 160(SP),X13 + PADDL 208(SP),X9 + PADDL 256(SP),X3 + PADDL 96(SP),X2 + MOVD X13,DX + MOVD X9,CX + MOVD X3,R8 + MOVD X2,R9 + PSHUFL $0X39,X13,X13 + PSHUFL $0X39,X9,X9 + PSHUFL $0X39,X3,X3 + PSHUFL $0X39,X2,X2 + XORL 48(SI),DX + XORL 52(SI),CX + XORL 56(SI),R8 + XORL 60(SI),R9 + MOVL DX,48(DI) + MOVL CX,52(DI) + MOVL R8,56(DI) + MOVL R9,60(DI) + MOVD X13,DX + MOVD X9,CX + MOVD X3,R8 + MOVD X2,R9 + PSHUFL $0X39,X13,X13 + PSHUFL $0X39,X9,X9 + PSHUFL $0X39,X3,X3 + PSHUFL $0X39,X2,X2 + XORL 112(SI),DX + XORL 116(SI),CX + XORL 120(SI),R8 + XORL 124(SI),R9 + MOVL DX,112(DI) + MOVL CX,116(DI) + MOVL R8,120(DI) + MOVL R9,124(DI) + MOVD X13,DX + MOVD X9,CX + MOVD X3,R8 + MOVD X2,R9 + PSHUFL $0X39,X13,X13 + PSHUFL $0X39,X9,X9 + PSHUFL $0X39,X3,X3 + PSHUFL $0X39,X2,X2 + XORL 176(SI),DX + XORL 180(SI),CX + XORL 184(SI),R8 + XORL 188(SI),R9 + MOVL DX,176(DI) + MOVL CX,180(DI) + MOVL R8,184(DI) + MOVL R9,188(DI) + MOVD X13,DX + MOVD X9,CX + MOVD X3,R8 + MOVD X2,R9 + XORL 240(SI),DX + XORL 244(SI),CX + XORL 248(SI),R8 + XORL 252(SI),R9 + MOVL DX,240(DI) + MOVL CX,244(DI) + MOVL R8,248(DI) + MOVL R9,252(DI) + MOVQ 352(SP),R9 + SUBQ $256,R9 + ADDQ $256,SI + ADDQ $256,DI + CMPQ R9,$256 + JAE BYTESATLEAST256 + CMPQ R9,$0 + JBE DONE + BYTESBETWEEN1AND255: + CMPQ R9,$64 + JAE NOCOPY + MOVQ DI,DX + LEAQ 360(SP),DI + MOVQ R9,CX + REP; MOVSB + LEAQ 360(SP),DI + LEAQ 360(SP),SI + NOCOPY: + MOVQ R9,352(SP) + MOVOA 48(SP),X0 + MOVOA 0(SP),X1 + MOVOA 16(SP),X2 + MOVOA 32(SP),X3 + MOVOA X1,X4 + MOVQ $20,CX + MAINLOOP2: + PADDL X0,X4 + MOVOA X0,X5 + MOVOA X4,X6 + PSLLL $7,X4 + PSRLL $25,X6 + PXOR X4,X3 + PXOR X6,X3 + PADDL X3,X5 + MOVOA X3,X4 + MOVOA X5,X6 + PSLLL $9,X5 + PSRLL $23,X6 + PXOR X5,X2 + PSHUFL $0X93,X3,X3 + PXOR X6,X2 + PADDL X2,X4 + MOVOA X2,X5 + MOVOA X4,X6 + PSLLL $13,X4 + PSRLL $19,X6 + PXOR X4,X1 + PSHUFL $0X4E,X2,X2 + PXOR X6,X1 + PADDL X1,X5 + MOVOA X3,X4 + MOVOA X5,X6 + PSLLL $18,X5 + PSRLL $14,X6 + PXOR X5,X0 + PSHUFL $0X39,X1,X1 + PXOR X6,X0 + PADDL X0,X4 + MOVOA X0,X5 + MOVOA X4,X6 + PSLLL $7,X4 + PSRLL $25,X6 + PXOR X4,X1 + PXOR X6,X1 + PADDL X1,X5 + MOVOA X1,X4 + MOVOA X5,X6 + PSLLL $9,X5 + PSRLL $23,X6 + PXOR X5,X2 + PSHUFL $0X93,X1,X1 + PXOR X6,X2 + PADDL X2,X4 + MOVOA X2,X5 + MOVOA X4,X6 + PSLLL $13,X4 + PSRLL $19,X6 + PXOR X4,X3 + PSHUFL $0X4E,X2,X2 + PXOR X6,X3 + PADDL X3,X5 + MOVOA X1,X4 + MOVOA X5,X6 + PSLLL $18,X5 + PSRLL $14,X6 + PXOR X5,X0 + PSHUFL $0X39,X3,X3 + PXOR X6,X0 + PADDL X0,X4 + MOVOA X0,X5 + MOVOA X4,X6 + PSLLL $7,X4 + PSRLL $25,X6 + PXOR X4,X3 + PXOR X6,X3 + PADDL X3,X5 + MOVOA X3,X4 + MOVOA X5,X6 + PSLLL $9,X5 + PSRLL $23,X6 + PXOR X5,X2 + PSHUFL $0X93,X3,X3 + PXOR X6,X2 + PADDL X2,X4 + MOVOA X2,X5 + MOVOA X4,X6 + PSLLL $13,X4 + PSRLL $19,X6 + PXOR X4,X1 + PSHUFL $0X4E,X2,X2 + PXOR X6,X1 + PADDL X1,X5 + MOVOA X3,X4 + MOVOA X5,X6 + PSLLL $18,X5 + PSRLL $14,X6 + PXOR X5,X0 + PSHUFL $0X39,X1,X1 + PXOR X6,X0 + PADDL X0,X4 + MOVOA X0,X5 + MOVOA X4,X6 + PSLLL $7,X4 + PSRLL $25,X6 + PXOR X4,X1 + PXOR X6,X1 + PADDL X1,X5 + MOVOA X1,X4 + MOVOA X5,X6 + PSLLL $9,X5 + PSRLL $23,X6 + PXOR X5,X2 + PSHUFL $0X93,X1,X1 + PXOR X6,X2 + PADDL X2,X4 + MOVOA X2,X5 + MOVOA X4,X6 + PSLLL $13,X4 + PSRLL $19,X6 + PXOR X4,X3 + PSHUFL $0X4E,X2,X2 + PXOR X6,X3 + SUBQ $4,CX + PADDL X3,X5 + MOVOA X1,X4 + MOVOA X5,X6 + PSLLL $18,X5 + PXOR X7,X7 + PSRLL $14,X6 + PXOR X5,X0 + PSHUFL $0X39,X3,X3 + PXOR X6,X0 + JA MAINLOOP2 + PADDL 48(SP),X0 + PADDL 0(SP),X1 + PADDL 16(SP),X2 + PADDL 32(SP),X3 + MOVD X0,CX + MOVD X1,R8 + MOVD X2,R9 + MOVD X3,AX + PSHUFL $0X39,X0,X0 + PSHUFL $0X39,X1,X1 + PSHUFL $0X39,X2,X2 + PSHUFL $0X39,X3,X3 + XORL 0(SI),CX + XORL 48(SI),R8 + XORL 32(SI),R9 + XORL 16(SI),AX + MOVL CX,0(DI) + MOVL R8,48(DI) + MOVL R9,32(DI) + MOVL AX,16(DI) + MOVD X0,CX + MOVD X1,R8 + MOVD X2,R9 + MOVD X3,AX + PSHUFL $0X39,X0,X0 + PSHUFL $0X39,X1,X1 + PSHUFL $0X39,X2,X2 + PSHUFL $0X39,X3,X3 + XORL 20(SI),CX + XORL 4(SI),R8 + XORL 52(SI),R9 + XORL 36(SI),AX + MOVL CX,20(DI) + MOVL R8,4(DI) + MOVL R9,52(DI) + MOVL AX,36(DI) + MOVD X0,CX + MOVD X1,R8 + MOVD X2,R9 + MOVD X3,AX + PSHUFL $0X39,X0,X0 + PSHUFL $0X39,X1,X1 + PSHUFL $0X39,X2,X2 + PSHUFL $0X39,X3,X3 + XORL 40(SI),CX + XORL 24(SI),R8 + XORL 8(SI),R9 + XORL 56(SI),AX + MOVL CX,40(DI) + MOVL R8,24(DI) + MOVL R9,8(DI) + MOVL AX,56(DI) + MOVD X0,CX + MOVD X1,R8 + MOVD X2,R9 + MOVD X3,AX + XORL 60(SI),CX + XORL 44(SI),R8 + XORL 28(SI),R9 + XORL 12(SI),AX + MOVL CX,60(DI) + MOVL R8,44(DI) + MOVL R9,28(DI) + MOVL AX,12(DI) + MOVQ 352(SP),R9 + MOVL 16(SP),CX + MOVL 36 (SP),R8 + ADDQ $1,CX + SHLQ $32,R8 + ADDQ R8,CX + MOVQ CX,R8 + SHRQ $32,R8 + MOVL CX,16(SP) + MOVL R8, 36 (SP) + CMPQ R9,$64 + JA BYTESATLEAST65 + JAE BYTESATLEAST64 + MOVQ DI,SI + MOVQ DX,DI + MOVQ R9,CX + REP; MOVSB + BYTESATLEAST64: + DONE: + MOVQ R12,SP + RET + BYTESATLEAST65: + SUBQ $64,R9 + ADDQ $64,DI + ADDQ $64,SI + JMP BYTESBETWEEN1AND255 diff --git a/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_noasm.go b/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_noasm.go new file mode 100644 index 000000000..8a46bd2b3 --- /dev/null +++ b/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_noasm.go @@ -0,0 +1,14 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !amd64 appengine gccgo + +package salsa + +// XORKeyStream crypts bytes from in to out using the given key and counters. +// In and out must overlap entirely or not at all. Counter +// contains the raw salsa20 counter bytes (both nonce and block counter). +func XORKeyStream(out, in []byte, counter *[16]byte, key *[32]byte) { + genericXORKeyStream(out, in, counter, key) +} diff --git a/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_ref.go b/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_ref.go index 22126d17c..68169c6d6 100644 --- a/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_ref.go +++ b/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_ref.go @@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !amd64 appengine gccgo - package salsa const rounds = 20 @@ -202,10 +200,9 @@ func core(out *[64]byte, in *[16]byte, k *[32]byte, c *[16]byte) { out[63] = byte(x15 >> 24) } -// XORKeyStream crypts bytes from in to out using the given key and counters. -// In and out must overlap entirely or not at all. Counter -// contains the raw salsa20 counter bytes (both nonce and block counter). -func XORKeyStream(out, in []byte, counter *[16]byte, key *[32]byte) { +// genericXORKeyStream is the generic implementation of XORKeyStream to be used +// when no assembly implementation is available. +func genericXORKeyStream(out, in []byte, counter *[16]byte, key *[32]byte) { var block [64]byte var counterCopy [16]byte copy(counterCopy[:], counter[:]) diff --git a/vendor/golang.org/x/crypto/scrypt/scrypt.go b/vendor/golang.org/x/crypto/scrypt/scrypt.go index 9b25b5ac2..2f81fe414 100644 --- a/vendor/golang.org/x/crypto/scrypt/scrypt.go +++ b/vendor/golang.org/x/crypto/scrypt/scrypt.go @@ -10,6 +10,7 @@ package scrypt // import "golang.org/x/crypto/scrypt" import ( "crypto/sha256" "errors" + "math/bits" "golang.org/x/crypto/pbkdf2" ) @@ -29,7 +30,7 @@ func blockXOR(dst, src []uint32, n int) { } // salsaXOR applies Salsa20/8 to the XOR of 16 numbers from tmp and in, -// and puts the result into both both tmp and out. +// and puts the result into both tmp and out. func salsaXOR(tmp *[16]uint32, in, out []uint32) { w0 := tmp[0] ^ in[0] w1 := tmp[1] ^ in[1] @@ -52,77 +53,45 @@ func salsaXOR(tmp *[16]uint32, in, out []uint32) { x9, x10, x11, x12, x13, x14, x15 := w9, w10, w11, w12, w13, w14, w15 for i := 0; i < 8; i += 2 { - u := x0 + x12 - x4 ^= u<<7 | u>>(32-7) - u = x4 + x0 - x8 ^= u<<9 | u>>(32-9) - u = x8 + x4 - x12 ^= u<<13 | u>>(32-13) - u = x12 + x8 - x0 ^= u<<18 | u>>(32-18) - - u = x5 + x1 - x9 ^= u<<7 | u>>(32-7) - u = x9 + x5 - x13 ^= u<<9 | u>>(32-9) - u = x13 + x9 - x1 ^= u<<13 | u>>(32-13) - u = x1 + x13 - x5 ^= u<<18 | u>>(32-18) - - u = x10 + x6 - x14 ^= u<<7 | u>>(32-7) - u = x14 + x10 - x2 ^= u<<9 | u>>(32-9) - u = x2 + x14 - x6 ^= u<<13 | u>>(32-13) - u = x6 + x2 - x10 ^= u<<18 | u>>(32-18) - - u = x15 + x11 - x3 ^= u<<7 | u>>(32-7) - u = x3 + x15 - x7 ^= u<<9 | u>>(32-9) - u = x7 + x3 - x11 ^= u<<13 | u>>(32-13) - u = x11 + x7 - x15 ^= u<<18 | u>>(32-18) - - u = x0 + x3 - x1 ^= u<<7 | u>>(32-7) - u = x1 + x0 - x2 ^= u<<9 | u>>(32-9) - u = x2 + x1 - x3 ^= u<<13 | u>>(32-13) - u = x3 + x2 - x0 ^= u<<18 | u>>(32-18) - - u = x5 + x4 - x6 ^= u<<7 | u>>(32-7) - u = x6 + x5 - x7 ^= u<<9 | u>>(32-9) - u = x7 + x6 - x4 ^= u<<13 | u>>(32-13) - u = x4 + x7 - x5 ^= u<<18 | u>>(32-18) - - u = x10 + x9 - x11 ^= u<<7 | u>>(32-7) - u = x11 + x10 - x8 ^= u<<9 | u>>(32-9) - u = x8 + x11 - x9 ^= u<<13 | u>>(32-13) - u = x9 + x8 - x10 ^= u<<18 | u>>(32-18) - - u = x15 + x14 - x12 ^= u<<7 | u>>(32-7) - u = x12 + x15 - x13 ^= u<<9 | u>>(32-9) - u = x13 + x12 - x14 ^= u<<13 | u>>(32-13) - u = x14 + x13 - x15 ^= u<<18 | u>>(32-18) + x4 ^= bits.RotateLeft32(x0+x12, 7) + x8 ^= bits.RotateLeft32(x4+x0, 9) + x12 ^= bits.RotateLeft32(x8+x4, 13) + x0 ^= bits.RotateLeft32(x12+x8, 18) + + x9 ^= bits.RotateLeft32(x5+x1, 7) + x13 ^= bits.RotateLeft32(x9+x5, 9) + x1 ^= bits.RotateLeft32(x13+x9, 13) + x5 ^= bits.RotateLeft32(x1+x13, 18) + + x14 ^= bits.RotateLeft32(x10+x6, 7) + x2 ^= bits.RotateLeft32(x14+x10, 9) + x6 ^= bits.RotateLeft32(x2+x14, 13) + x10 ^= bits.RotateLeft32(x6+x2, 18) + + x3 ^= bits.RotateLeft32(x15+x11, 7) + x7 ^= bits.RotateLeft32(x3+x15, 9) + x11 ^= bits.RotateLeft32(x7+x3, 13) + x15 ^= bits.RotateLeft32(x11+x7, 18) + + x1 ^= bits.RotateLeft32(x0+x3, 7) + x2 ^= bits.RotateLeft32(x1+x0, 9) + x3 ^= bits.RotateLeft32(x2+x1, 13) + x0 ^= bits.RotateLeft32(x3+x2, 18) + + x6 ^= bits.RotateLeft32(x5+x4, 7) + x7 ^= bits.RotateLeft32(x6+x5, 9) + x4 ^= bits.RotateLeft32(x7+x6, 13) + x5 ^= bits.RotateLeft32(x4+x7, 18) + + x11 ^= bits.RotateLeft32(x10+x9, 7) + x8 ^= bits.RotateLeft32(x11+x10, 9) + x9 ^= bits.RotateLeft32(x8+x11, 13) + x10 ^= bits.RotateLeft32(x9+x8, 18) + + x12 ^= bits.RotateLeft32(x15+x14, 7) + x13 ^= bits.RotateLeft32(x12+x15, 9) + x14 ^= bits.RotateLeft32(x13+x12, 13) + x15 ^= bits.RotateLeft32(x14+x13, 18) } x0 += w0 x1 += w1 diff --git a/vendor/golang.org/x/crypto/ssh/agent/client.go b/vendor/golang.org/x/crypto/ssh/agent/client.go index b1808dd26..b909471cc 100644 --- a/vendor/golang.org/x/crypto/ssh/agent/client.go +++ b/vendor/golang.org/x/crypto/ssh/agent/client.go @@ -25,10 +25,22 @@ import ( "math/big" "sync" + "crypto" "golang.org/x/crypto/ed25519" "golang.org/x/crypto/ssh" ) +// SignatureFlags represent additional flags that can be passed to the signature +// requests an defined in [PROTOCOL.agent] section 4.5.1. +type SignatureFlags uint32 + +// SignatureFlag values as defined in [PROTOCOL.agent] section 5.3. +const ( + SignatureFlagReserved SignatureFlags = 1 << iota + SignatureFlagRsaSha256 + SignatureFlagRsaSha512 +) + // Agent represents the capabilities of an ssh-agent. type Agent interface { // List returns the identities known to the agent. @@ -57,6 +69,26 @@ type Agent interface { Signers() ([]ssh.Signer, error) } +type ExtendedAgent interface { + Agent + + // SignWithFlags signs like Sign, but allows for additional flags to be sent/received + SignWithFlags(key ssh.PublicKey, data []byte, flags SignatureFlags) (*ssh.Signature, error) + + // Extension processes a custom extension request. Standard-compliant agents are not + // required to support any extensions, but this method allows agents to implement + // vendor-specific methods or add experimental features. See [PROTOCOL.agent] section 4.7. + // If agent extensions are unsupported entirely this method MUST return an + // ErrExtensionUnsupported error. Similarly, if just the specific extensionType in + // the request is unsupported by the agent then ErrExtensionUnsupported MUST be + // returned. + // + // In the case of success, since [PROTOCOL.agent] section 4.7 specifies that the contents + // of the response are unspecified (including the type of the message), the complete + // response will be returned as a []byte slice, including the "type" byte of the message. + Extension(extensionType string, contents []byte) ([]byte, error) +} + // ConstraintExtension describes an optional constraint defined by users. type ConstraintExtension struct { // ExtensionName consist of a UTF-8 string suffixed by the @@ -70,8 +102,9 @@ type ConstraintExtension struct { // AddedKey describes an SSH key to be added to an Agent. type AddedKey struct { - // PrivateKey must be a *rsa.PrivateKey, *dsa.PrivateKey or - // *ecdsa.PrivateKey, which will be inserted into the agent. + // PrivateKey must be a *rsa.PrivateKey, *dsa.PrivateKey, + // ed25519.PrivateKey or *ecdsa.PrivateKey, which will be inserted into the + // agent. PrivateKey interface{} // Certificate, if not nil, is communicated to the agent and will be // stored with the key. @@ -179,6 +212,23 @@ type constrainExtensionAgentMsg struct { Rest []byte `ssh:"rest"` } +// See [PROTOCOL.agent], section 4.7 +const agentExtension = 27 +const agentExtensionFailure = 28 + +// ErrExtensionUnsupported indicates that an extension defined in +// [PROTOCOL.agent] section 4.7 is unsupported by the agent. Specifically this +// error indicates that the agent returned a standard SSH_AGENT_FAILURE message +// as the result of a SSH_AGENTC_EXTENSION request. Note that the protocol +// specification (and therefore this error) does not distinguish between a +// specific extension being unsupported and extensions being unsupported entirely. +var ErrExtensionUnsupported = errors.New("agent: extension unsupported") + +type extensionAgentMsg struct { + ExtensionType string `sshtype:"27"` + Contents []byte +} + // Key represents a protocol 2 public key as defined in // [PROTOCOL.agent], section 2.5.2. type Key struct { @@ -260,7 +310,7 @@ type client struct { // NewClient returns an Agent that talks to an ssh-agent process over // the given connection. -func NewClient(rw io.ReadWriter) Agent { +func NewClient(rw io.ReadWriter) ExtendedAgent { return &client{conn: rw} } @@ -268,6 +318,21 @@ func NewClient(rw io.ReadWriter) Agent { // unmarshaled into reply and replyType is set to the first byte of // the reply, which contains the type of the message. func (c *client) call(req []byte) (reply interface{}, err error) { + buf, err := c.callRaw(req) + if err != nil { + return nil, err + } + reply, err = unmarshal(buf) + if err != nil { + return nil, clientErr(err) + } + return reply, nil +} + +// callRaw sends an RPC to the agent. On success, the raw +// bytes of the response are returned; no unmarshalling is +// performed on the response. +func (c *client) callRaw(req []byte) (reply []byte, err error) { c.mu.Lock() defer c.mu.Unlock() @@ -284,18 +349,14 @@ func (c *client) call(req []byte) (reply interface{}, err error) { } respSize := binary.BigEndian.Uint32(respSizeBuf[:]) if respSize > maxAgentResponseBytes { - return nil, clientErr(err) + return nil, clientErr(errors.New("response too large")) } buf := make([]byte, respSize) if _, err = io.ReadFull(c.conn, buf); err != nil { return nil, clientErr(err) } - reply, err = unmarshal(buf) - if err != nil { - return nil, clientErr(err) - } - return reply, err + return buf, nil } func (c *client) simpleCall(req []byte) error { @@ -369,9 +430,14 @@ func (c *client) List() ([]*Key, error) { // Sign has the agent sign the data using a protocol 2 key as defined // in [PROTOCOL.agent] section 2.6.2. func (c *client) Sign(key ssh.PublicKey, data []byte) (*ssh.Signature, error) { + return c.SignWithFlags(key, data, 0) +} + +func (c *client) SignWithFlags(key ssh.PublicKey, data []byte, flags SignatureFlags) (*ssh.Signature, error) { req := ssh.Marshal(signRequestAgentMsg{ KeyBlob: key.Marshal(), Data: data, + Flags: uint32(flags), }) msg, err := c.call(req) @@ -501,6 +567,17 @@ func (c *client) insertKey(s interface{}, comment string, constraints []byte) er Comments: comment, Constraints: constraints, }) + case ed25519.PrivateKey: + req = ssh.Marshal(ed25519KeyMsg{ + Type: ssh.KeyAlgoED25519, + Pub: []byte(k)[32:], + Priv: []byte(k), + Comments: comment, + Constraints: constraints, + }) + // This function originally supported only *ed25519.PrivateKey, however the + // general idiom is to pass ed25519.PrivateKey by value, not by pointer. + // We still support the pointer variant for backwards compatibility. case *ed25519.PrivateKey: req = ssh.Marshal(ed25519KeyMsg{ Type: ssh.KeyAlgoED25519, @@ -618,6 +695,18 @@ func (c *client) insertCert(s interface{}, cert *ssh.Certificate, comment string Comments: comment, Constraints: constraints, }) + case ed25519.PrivateKey: + req = ssh.Marshal(ed25519CertMsg{ + Type: cert.Type(), + CertBytes: cert.Marshal(), + Pub: []byte(k)[32:], + Priv: []byte(k), + Comments: comment, + Constraints: constraints, + }) + // This function originally supported only *ed25519.PrivateKey, however the + // general idiom is to pass ed25519.PrivateKey by value, not by pointer. + // We still support the pointer variant for backwards compatibility. case *ed25519.PrivateKey: req = ssh.Marshal(ed25519CertMsg{ Type: cert.Type(), @@ -681,3 +770,44 @@ func (s *agentKeyringSigner) Sign(rand io.Reader, data []byte) (*ssh.Signature, // The agent has its own entropy source, so the rand argument is ignored. return s.agent.Sign(s.pub, data) } + +func (s *agentKeyringSigner) SignWithOpts(rand io.Reader, data []byte, opts crypto.SignerOpts) (*ssh.Signature, error) { + var flags SignatureFlags + if opts != nil { + switch opts.HashFunc() { + case crypto.SHA256: + flags = SignatureFlagRsaSha256 + case crypto.SHA512: + flags = SignatureFlagRsaSha512 + } + } + return s.agent.SignWithFlags(s.pub, data, flags) +} + +// Calls an extension method. It is up to the agent implementation as to whether or not +// any particular extension is supported and may always return an error. Because the +// type of the response is up to the implementation, this returns the bytes of the +// response and does not attempt any type of unmarshalling. +func (c *client) Extension(extensionType string, contents []byte) ([]byte, error) { + req := ssh.Marshal(extensionAgentMsg{ + ExtensionType: extensionType, + Contents: contents, + }) + buf, err := c.callRaw(req) + if err != nil { + return nil, err + } + if len(buf) == 0 { + return nil, errors.New("agent: failure; empty response") + } + // [PROTOCOL.agent] section 4.7 indicates that an SSH_AGENT_FAILURE message + // represents an agent that does not support the extension + if buf[0] == agentFailure { + return nil, ErrExtensionUnsupported + } + if buf[0] == agentExtensionFailure { + return nil, errors.New("agent: generic extension failure") + } + + return buf, nil +} diff --git a/vendor/golang.org/x/crypto/ssh/agent/keyring.go b/vendor/golang.org/x/crypto/ssh/agent/keyring.go index 1a5163270..c9d979430 100644 --- a/vendor/golang.org/x/crypto/ssh/agent/keyring.go +++ b/vendor/golang.org/x/crypto/ssh/agent/keyring.go @@ -182,6 +182,10 @@ func (r *keyring) Add(key AddedKey) error { // Sign returns a signature for the data. func (r *keyring) Sign(key ssh.PublicKey, data []byte) (*ssh.Signature, error) { + return r.SignWithFlags(key, data, 0) +} + +func (r *keyring) SignWithFlags(key ssh.PublicKey, data []byte, flags SignatureFlags) (*ssh.Signature, error) { r.mu.Lock() defer r.mu.Unlock() if r.locked { @@ -192,7 +196,24 @@ func (r *keyring) Sign(key ssh.PublicKey, data []byte) (*ssh.Signature, error) { wanted := key.Marshal() for _, k := range r.keys { if bytes.Equal(k.signer.PublicKey().Marshal(), wanted) { - return k.signer.Sign(rand.Reader, data) + if flags == 0 { + return k.signer.Sign(rand.Reader, data) + } else { + if algorithmSigner, ok := k.signer.(ssh.AlgorithmSigner); !ok { + return nil, fmt.Errorf("agent: signature does not support non-default signature algorithm: %T", k.signer) + } else { + var algorithm string + switch flags { + case SignatureFlagRsaSha256: + algorithm = ssh.SigAlgoRSASHA2256 + case SignatureFlagRsaSha512: + algorithm = ssh.SigAlgoRSASHA2512 + default: + return nil, fmt.Errorf("agent: unsupported signature flags: %d", flags) + } + return algorithmSigner.SignWithAlgorithm(rand.Reader, data, algorithm) + } + } } } return nil, errors.New("not found") @@ -213,3 +234,8 @@ func (r *keyring) Signers() ([]ssh.Signer, error) { } return s, nil } + +// The keyring does not support any extensions +func (r *keyring) Extension(extensionType string, contents []byte) ([]byte, error) { + return nil, ErrExtensionUnsupported +} diff --git a/vendor/golang.org/x/crypto/ssh/agent/server.go b/vendor/golang.org/x/crypto/ssh/agent/server.go index 2e4692cbd..6e7a1e02f 100644 --- a/vendor/golang.org/x/crypto/ssh/agent/server.go +++ b/vendor/golang.org/x/crypto/ssh/agent/server.go @@ -128,7 +128,14 @@ func (s *server) processRequest(data []byte) (interface{}, error) { Blob: req.KeyBlob, } - sig, err := s.agent.Sign(k, req.Data) // TODO(hanwen): flags. + var sig *ssh.Signature + var err error + if extendedAgent, ok := s.agent.(ExtendedAgent); ok { + sig, err = extendedAgent.SignWithFlags(k, req.Data, SignatureFlags(req.Flags)) + } else { + sig, err = s.agent.Sign(k, req.Data) + } + if err != nil { return nil, err } @@ -150,6 +157,43 @@ func (s *server) processRequest(data []byte) (interface{}, error) { case agentAddIDConstrained, agentAddIdentity: return nil, s.insertIdentity(data) + + case agentExtension: + // Return a stub object where the whole contents of the response gets marshaled. + var responseStub struct { + Rest []byte `ssh:"rest"` + } + + if extendedAgent, ok := s.agent.(ExtendedAgent); !ok { + // If this agent doesn't implement extensions, [PROTOCOL.agent] section 4.7 + // requires that we return a standard SSH_AGENT_FAILURE message. + responseStub.Rest = []byte{agentFailure} + } else { + var req extensionAgentMsg + if err := ssh.Unmarshal(data, &req); err != nil { + return nil, err + } + res, err := extendedAgent.Extension(req.ExtensionType, req.Contents) + if err != nil { + // If agent extensions are unsupported, return a standard SSH_AGENT_FAILURE + // message as required by [PROTOCOL.agent] section 4.7. + if err == ErrExtensionUnsupported { + responseStub.Rest = []byte{agentFailure} + } else { + // As the result of any other error processing an extension request, + // [PROTOCOL.agent] section 4.7 requires that we return a + // SSH_AGENT_EXTENSION_FAILURE code. + responseStub.Rest = []byte{agentExtensionFailure} + } + } else { + if len(res) == 0 { + return nil, nil + } + responseStub.Rest = res + } + } + + return responseStub, nil } return nil, fmt.Errorf("unknown opcode %d", data[0]) @@ -497,6 +541,9 @@ func ServeAgent(agent Agent, c io.ReadWriter) error { return err } l := binary.BigEndian.Uint32(length[:]) + if l == 0 { + return fmt.Errorf("agent: request size is 0") + } if l > maxAgentResponseBytes { // We also cap requests. return fmt.Errorf("agent: request too large: %d", l) diff --git a/vendor/golang.org/x/crypto/ssh/certs.go b/vendor/golang.org/x/crypto/ssh/certs.go index 42106f3f2..916c840b6 100644 --- a/vendor/golang.org/x/crypto/ssh/certs.go +++ b/vendor/golang.org/x/crypto/ssh/certs.go @@ -17,12 +17,14 @@ import ( // These constants from [PROTOCOL.certkeys] represent the algorithm names // for certificate types supported by this package. const ( - CertAlgoRSAv01 = "ssh-rsa-cert-v01@openssh.com" - CertAlgoDSAv01 = "ssh-dss-cert-v01@openssh.com" - CertAlgoECDSA256v01 = "ecdsa-sha2-nistp256-cert-v01@openssh.com" - CertAlgoECDSA384v01 = "ecdsa-sha2-nistp384-cert-v01@openssh.com" - CertAlgoECDSA521v01 = "ecdsa-sha2-nistp521-cert-v01@openssh.com" - CertAlgoED25519v01 = "ssh-ed25519-cert-v01@openssh.com" + CertAlgoRSAv01 = "ssh-rsa-cert-v01@openssh.com" + CertAlgoDSAv01 = "ssh-dss-cert-v01@openssh.com" + CertAlgoECDSA256v01 = "ecdsa-sha2-nistp256-cert-v01@openssh.com" + CertAlgoECDSA384v01 = "ecdsa-sha2-nistp384-cert-v01@openssh.com" + CertAlgoECDSA521v01 = "ecdsa-sha2-nistp521-cert-v01@openssh.com" + CertAlgoSKECDSA256v01 = "sk-ecdsa-sha2-nistp256-cert-v01@openssh.com" + CertAlgoED25519v01 = "ssh-ed25519-cert-v01@openssh.com" + CertAlgoSKED25519v01 = "sk-ssh-ed25519-cert-v01@openssh.com" ) // Certificate types distinguish between host and user @@ -37,6 +39,7 @@ const ( type Signature struct { Format string Blob []byte + Rest []byte `ssh:"rest"` } // CertTimeInfinity can be used for OpenSSHCertV01.ValidBefore to indicate that @@ -222,6 +225,11 @@ type openSSHCertSigner struct { signer Signer } +type algorithmOpenSSHCertSigner struct { + *openSSHCertSigner + algorithmSigner AlgorithmSigner +} + // NewCertSigner returns a Signer that signs with the given Certificate, whose // private key is held by signer. It returns an error if the public key in cert // doesn't match the key used by signer. @@ -230,7 +238,12 @@ func NewCertSigner(cert *Certificate, signer Signer) (Signer, error) { return nil, errors.New("ssh: signer and cert have different public key") } - return &openSSHCertSigner{cert, signer}, nil + if algorithmSigner, ok := signer.(AlgorithmSigner); ok { + return &algorithmOpenSSHCertSigner{ + &openSSHCertSigner{cert, signer}, algorithmSigner}, nil + } else { + return &openSSHCertSigner{cert, signer}, nil + } } func (s *openSSHCertSigner) Sign(rand io.Reader, data []byte) (*Signature, error) { @@ -241,6 +254,10 @@ func (s *openSSHCertSigner) PublicKey() PublicKey { return s.pub } +func (s *algorithmOpenSSHCertSigner) SignWithAlgorithm(rand io.Reader, data []byte, algorithm string) (*Signature, error) { + return s.algorithmSigner.SignWithAlgorithm(rand, data, algorithm) +} + const sourceAddressCriticalOption = "source-address" // CertChecker does the work of verifying a certificate. Its methods @@ -397,8 +414,8 @@ func (c *CertChecker) CheckCert(principal string, cert *Certificate) error { return nil } -// SignCert sets c.SignatureKey to the authority's public key and stores a -// Signature, by authority, in the certificate. +// SignCert signs the certificate with an authority, setting the Nonce, +// SignatureKey, and Signature fields. func (c *Certificate) SignCert(rand io.Reader, authority Signer) error { c.Nonce = make([]byte, 32) if _, err := io.ReadFull(rand, c.Nonce); err != nil { @@ -415,12 +432,14 @@ func (c *Certificate) SignCert(rand io.Reader, authority Signer) error { } var certAlgoNames = map[string]string{ - KeyAlgoRSA: CertAlgoRSAv01, - KeyAlgoDSA: CertAlgoDSAv01, - KeyAlgoECDSA256: CertAlgoECDSA256v01, - KeyAlgoECDSA384: CertAlgoECDSA384v01, - KeyAlgoECDSA521: CertAlgoECDSA521v01, - KeyAlgoED25519: CertAlgoED25519v01, + KeyAlgoRSA: CertAlgoRSAv01, + KeyAlgoDSA: CertAlgoDSAv01, + KeyAlgoECDSA256: CertAlgoECDSA256v01, + KeyAlgoECDSA384: CertAlgoECDSA384v01, + KeyAlgoECDSA521: CertAlgoECDSA521v01, + KeyAlgoSKECDSA256: CertAlgoSKECDSA256v01, + KeyAlgoED25519: CertAlgoED25519v01, + KeyAlgoSKED25519: CertAlgoSKED25519v01, } // certToPrivAlgo returns the underlying algorithm for a certificate algorithm. @@ -504,6 +523,12 @@ func parseSignatureBody(in []byte) (out *Signature, rest []byte, ok bool) { return } + switch out.Format { + case KeyAlgoSKECDSA256, CertAlgoSKECDSA256v01, KeyAlgoSKED25519, CertAlgoSKED25519v01: + out.Rest = in + return out, nil, ok + } + return out, in, ok } diff --git a/vendor/golang.org/x/crypto/ssh/cipher.go b/vendor/golang.org/x/crypto/ssh/cipher.go index 67b012610..8bd6b3daf 100644 --- a/vendor/golang.org/x/crypto/ssh/cipher.go +++ b/vendor/golang.org/x/crypto/ssh/cipher.go @@ -16,9 +16,8 @@ import ( "hash" "io" "io/ioutil" - "math/bits" - "golang.org/x/crypto/internal/chacha20" + "golang.org/x/crypto/chacha20" "golang.org/x/crypto/poly1305" ) @@ -120,7 +119,7 @@ var cipherModes = map[string]*cipherMode{ chacha20Poly1305ID: {64, 0, newChaCha20Cipher}, // CBC mode is insecure and so is not included in the default config. - // (See http://www.isg.rhul.ac.uk/~kp/SandPfinal.pdf). If absolutely + // (See https://www.ieee-security.org/TC/SP2013/papers/4977a526.pdf). If absolutely // needed, it's possible to specify a custom Config to enable it. // You should expect that an active attacker can recover plaintext if // you do. @@ -149,8 +148,8 @@ type streamPacketCipher struct { macResult []byte } -// readPacket reads and decrypt a single packet from the reader argument. -func (s *streamPacketCipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) { +// readCipherPacket reads and decrypt a single packet from the reader argument. +func (s *streamPacketCipher) readCipherPacket(seqNum uint32, r io.Reader) ([]byte, error) { if _, err := io.ReadFull(r, s.prefix[:]); err != nil { return nil, err } @@ -221,8 +220,8 @@ func (s *streamPacketCipher) readPacket(seqNum uint32, r io.Reader) ([]byte, err return s.packetData[:length-paddingLength-1], nil } -// writePacket encrypts and sends a packet of data to the writer argument -func (s *streamPacketCipher) writePacket(seqNum uint32, w io.Writer, rand io.Reader, packet []byte) error { +// writeCipherPacket encrypts and sends a packet of data to the writer argument +func (s *streamPacketCipher) writeCipherPacket(seqNum uint32, w io.Writer, rand io.Reader, packet []byte) error { if len(packet) > maxPacket { return errors.New("ssh: packet too large") } @@ -327,7 +326,7 @@ func newGCMCipher(key, iv, unusedMacKey []byte, unusedAlgs directionAlgorithms) const gcmTagSize = 16 -func (c *gcmCipher) writePacket(seqNum uint32, w io.Writer, rand io.Reader, packet []byte) error { +func (c *gcmCipher) writeCipherPacket(seqNum uint32, w io.Writer, rand io.Reader, packet []byte) error { // Pad out to multiple of 16 bytes. This is different from the // stream cipher because that encrypts the length too. padding := byte(packetSizeMultiple - (1+len(packet))%packetSizeMultiple) @@ -370,7 +369,7 @@ func (c *gcmCipher) incIV() { } } -func (c *gcmCipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) { +func (c *gcmCipher) readCipherPacket(seqNum uint32, r io.Reader) ([]byte, error) { if _, err := io.ReadFull(r, c.prefix[:]); err != nil { return nil, err } @@ -486,8 +485,8 @@ type cbcError string func (e cbcError) Error() string { return string(e) } -func (c *cbcCipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) { - p, err := c.readPacketLeaky(seqNum, r) +func (c *cbcCipher) readCipherPacket(seqNum uint32, r io.Reader) ([]byte, error) { + p, err := c.readCipherPacketLeaky(seqNum, r) if err != nil { if _, ok := err.(cbcError); ok { // Verification error: read a fixed amount of @@ -500,7 +499,7 @@ func (c *cbcCipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) { return p, err } -func (c *cbcCipher) readPacketLeaky(seqNum uint32, r io.Reader) ([]byte, error) { +func (c *cbcCipher) readCipherPacketLeaky(seqNum uint32, r io.Reader) ([]byte, error) { blockSize := c.decrypter.BlockSize() // Read the header, which will include some of the subsequent data in the @@ -576,7 +575,7 @@ func (c *cbcCipher) readPacketLeaky(seqNum uint32, r io.Reader) ([]byte, error) return c.packetData[prefixLen:paddingStart], nil } -func (c *cbcCipher) writePacket(seqNum uint32, w io.Writer, rand io.Reader, packet []byte) error { +func (c *cbcCipher) writeCipherPacket(seqNum uint32, w io.Writer, rand io.Reader, packet []byte) error { effectiveBlockSize := maxUInt32(cbcMinPacketSizeMultiple, c.encrypter.BlockSize()) // Length of encrypted portion of the packet (header, payload, padding). @@ -642,8 +641,8 @@ const chacha20Poly1305ID = "chacha20-poly1305@openssh.com" // the methods here also implement padding, which RFC4253 Section 6 // also requires of stream ciphers. type chacha20Poly1305Cipher struct { - lengthKey [8]uint32 - contentKey [8]uint32 + lengthKey [32]byte + contentKey [32]byte buf []byte } @@ -656,21 +655,21 @@ func newChaCha20Cipher(key, unusedIV, unusedMACKey []byte, unusedAlgs directionA buf: make([]byte, 256), } - for i := range c.contentKey { - c.contentKey[i] = binary.LittleEndian.Uint32(key[i*4 : (i+1)*4]) - } - for i := range c.lengthKey { - c.lengthKey[i] = binary.LittleEndian.Uint32(key[(i+8)*4 : (i+9)*4]) - } + copy(c.contentKey[:], key[:32]) + copy(c.lengthKey[:], key[32:]) return c, nil } -func (c *chacha20Poly1305Cipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) { - nonce := [3]uint32{0, 0, bits.ReverseBytes32(seqNum)} - s := chacha20.New(c.contentKey, nonce) - var polyKey [32]byte +func (c *chacha20Poly1305Cipher) readCipherPacket(seqNum uint32, r io.Reader) ([]byte, error) { + nonce := make([]byte, 12) + binary.BigEndian.PutUint32(nonce[8:], seqNum) + s, err := chacha20.NewUnauthenticatedCipher(c.contentKey[:], nonce) + if err != nil { + return nil, err + } + var polyKey, discardBuf [32]byte s.XORKeyStream(polyKey[:], polyKey[:]) - s.Advance() // skip next 32 bytes + s.XORKeyStream(discardBuf[:], discardBuf[:]) // skip the next 32 bytes encryptedLength := c.buf[:4] if _, err := io.ReadFull(r, encryptedLength); err != nil { @@ -678,7 +677,11 @@ func (c *chacha20Poly1305Cipher) readPacket(seqNum uint32, r io.Reader) ([]byte, } var lenBytes [4]byte - chacha20.New(c.lengthKey, nonce).XORKeyStream(lenBytes[:], encryptedLength) + ls, err := chacha20.NewUnauthenticatedCipher(c.lengthKey[:], nonce) + if err != nil { + return nil, err + } + ls.XORKeyStream(lenBytes[:], encryptedLength) length := binary.BigEndian.Uint32(lenBytes[:]) if length > maxPacket { @@ -723,12 +726,16 @@ func (c *chacha20Poly1305Cipher) readPacket(seqNum uint32, r io.Reader) ([]byte, return plain, nil } -func (c *chacha20Poly1305Cipher) writePacket(seqNum uint32, w io.Writer, rand io.Reader, payload []byte) error { - nonce := [3]uint32{0, 0, bits.ReverseBytes32(seqNum)} - s := chacha20.New(c.contentKey, nonce) - var polyKey [32]byte +func (c *chacha20Poly1305Cipher) writeCipherPacket(seqNum uint32, w io.Writer, rand io.Reader, payload []byte) error { + nonce := make([]byte, 12) + binary.BigEndian.PutUint32(nonce[8:], seqNum) + s, err := chacha20.NewUnauthenticatedCipher(c.contentKey[:], nonce) + if err != nil { + return err + } + var polyKey, discardBuf [32]byte s.XORKeyStream(polyKey[:], polyKey[:]) - s.Advance() // skip next 32 bytes + s.XORKeyStream(discardBuf[:], discardBuf[:]) // skip the next 32 bytes // There is no blocksize, so fall back to multiple of 8 byte // padding, as described in RFC 4253, Sec 6. @@ -748,7 +755,11 @@ func (c *chacha20Poly1305Cipher) writePacket(seqNum uint32, w io.Writer, rand io } binary.BigEndian.PutUint32(c.buf, uint32(1+len(payload)+padding)) - chacha20.New(c.lengthKey, nonce).XORKeyStream(c.buf, c.buf[:4]) + ls, err := chacha20.NewUnauthenticatedCipher(c.lengthKey[:], nonce) + if err != nil { + return err + } + ls.XORKeyStream(c.buf, c.buf[:4]) c.buf[4] = byte(padding) copy(c.buf[5:], payload) packetEnd := 5 + len(payload) + padding diff --git a/vendor/golang.org/x/crypto/ssh/client.go b/vendor/golang.org/x/crypto/ssh/client.go index ae6ca775e..7b00bff1c 100644 --- a/vendor/golang.org/x/crypto/ssh/client.go +++ b/vendor/golang.org/x/crypto/ssh/client.go @@ -185,7 +185,7 @@ func Dial(network, addr string, config *ClientConfig) (*Client, error) { // keys. A HostKeyCallback must return nil if the host key is OK, or // an error to reject it. It receives the hostname as passed to Dial // or NewClientConn. The remote address is the RemoteAddr of the -// net.Conn underlying the the SSH connection. +// net.Conn underlying the SSH connection. type HostKeyCallback func(hostname string, remote net.Addr, key PublicKey) error // BannerCallback is the function type used for treat the banner sent by diff --git a/vendor/golang.org/x/crypto/ssh/client_auth.go b/vendor/golang.org/x/crypto/ssh/client_auth.go index 5f44b7740..f3265655e 100644 --- a/vendor/golang.org/x/crypto/ssh/client_auth.go +++ b/vendor/golang.org/x/crypto/ssh/client_auth.go @@ -36,7 +36,7 @@ func (c *connection) clientAuthenticate(config *ClientConfig) error { // during the authentication phase the client first attempts the "none" method // then any untried methods suggested by the server. - tried := make(map[string]bool) + var tried []string var lastMethods []string sessionID := c.transport.getSessionID() @@ -49,7 +49,9 @@ func (c *connection) clientAuthenticate(config *ClientConfig) error { // success return nil } else if ok == authFailure { - tried[auth.method()] = true + if m := auth.method(); !contains(tried, m) { + tried = append(tried, m) + } } if methods == nil { methods = lastMethods @@ -61,7 +63,7 @@ func (c *connection) clientAuthenticate(config *ClientConfig) error { findNext: for _, a := range config.Auth { candidateMethod := a.method() - if tried[candidateMethod] { + if contains(tried, candidateMethod) { continue } for _, meth := range methods { @@ -72,16 +74,16 @@ func (c *connection) clientAuthenticate(config *ClientConfig) error { } } } - return fmt.Errorf("ssh: unable to authenticate, attempted methods %v, no supported methods remain", keys(tried)) + return fmt.Errorf("ssh: unable to authenticate, attempted methods %v, no supported methods remain", tried) } -func keys(m map[string]bool) []string { - s := make([]string, 0, len(m)) - - for key := range m { - s = append(s, key) +func contains(list []string, e string) bool { + for _, s := range list { + if s == e { + return true + } } - return s + return false } // An AuthMethod represents an instance of an RFC 4252 authentication method. @@ -523,3 +525,117 @@ func (r *retryableAuthMethod) method() string { func RetryableAuthMethod(auth AuthMethod, maxTries int) AuthMethod { return &retryableAuthMethod{authMethod: auth, maxTries: maxTries} } + +// GSSAPIWithMICAuthMethod is an AuthMethod with "gssapi-with-mic" authentication. +// See RFC 4462 section 3 +// gssAPIClient is implementation of the GSSAPIClient interface, see the definition of the interface for details. +// target is the server host you want to log in to. +func GSSAPIWithMICAuthMethod(gssAPIClient GSSAPIClient, target string) AuthMethod { + if gssAPIClient == nil { + panic("gss-api client must be not nil with enable gssapi-with-mic") + } + return &gssAPIWithMICCallback{gssAPIClient: gssAPIClient, target: target} +} + +type gssAPIWithMICCallback struct { + gssAPIClient GSSAPIClient + target string +} + +func (g *gssAPIWithMICCallback) auth(session []byte, user string, c packetConn, rand io.Reader) (authResult, []string, error) { + m := &userAuthRequestMsg{ + User: user, + Service: serviceSSH, + Method: g.method(), + } + // The GSS-API authentication method is initiated when the client sends an SSH_MSG_USERAUTH_REQUEST. + // See RFC 4462 section 3.2. + m.Payload = appendU32(m.Payload, 1) + m.Payload = appendString(m.Payload, string(krb5OID)) + if err := c.writePacket(Marshal(m)); err != nil { + return authFailure, nil, err + } + // The server responds to the SSH_MSG_USERAUTH_REQUEST with either an + // SSH_MSG_USERAUTH_FAILURE if none of the mechanisms are supported or + // with an SSH_MSG_USERAUTH_GSSAPI_RESPONSE. + // See RFC 4462 section 3.3. + // OpenSSH supports Kerberos V5 mechanism only for GSS-API authentication,so I don't want to check + // selected mech if it is valid. + packet, err := c.readPacket() + if err != nil { + return authFailure, nil, err + } + userAuthGSSAPIResp := &userAuthGSSAPIResponse{} + if err := Unmarshal(packet, userAuthGSSAPIResp); err != nil { + return authFailure, nil, err + } + // Start the loop into the exchange token. + // See RFC 4462 section 3.4. + var token []byte + defer g.gssAPIClient.DeleteSecContext() + for { + // Initiates the establishment of a security context between the application and a remote peer. + nextToken, needContinue, err := g.gssAPIClient.InitSecContext("host@"+g.target, token, false) + if err != nil { + return authFailure, nil, err + } + if len(nextToken) > 0 { + if err := c.writePacket(Marshal(&userAuthGSSAPIToken{ + Token: nextToken, + })); err != nil { + return authFailure, nil, err + } + } + if !needContinue { + break + } + packet, err = c.readPacket() + if err != nil { + return authFailure, nil, err + } + switch packet[0] { + case msgUserAuthFailure: + var msg userAuthFailureMsg + if err := Unmarshal(packet, &msg); err != nil { + return authFailure, nil, err + } + if msg.PartialSuccess { + return authPartialSuccess, msg.Methods, nil + } + return authFailure, msg.Methods, nil + case msgUserAuthGSSAPIError: + userAuthGSSAPIErrorResp := &userAuthGSSAPIError{} + if err := Unmarshal(packet, userAuthGSSAPIErrorResp); err != nil { + return authFailure, nil, err + } + return authFailure, nil, fmt.Errorf("GSS-API Error:\n"+ + "Major Status: %d\n"+ + "Minor Status: %d\n"+ + "Error Message: %s\n", userAuthGSSAPIErrorResp.MajorStatus, userAuthGSSAPIErrorResp.MinorStatus, + userAuthGSSAPIErrorResp.Message) + case msgUserAuthGSSAPIToken: + userAuthGSSAPITokenReq := &userAuthGSSAPIToken{} + if err := Unmarshal(packet, userAuthGSSAPITokenReq); err != nil { + return authFailure, nil, err + } + token = userAuthGSSAPITokenReq.Token + } + } + // Binding Encryption Keys. + // See RFC 4462 section 3.5. + micField := buildMIC(string(session), user, "ssh-connection", "gssapi-with-mic") + micToken, err := g.gssAPIClient.GetMIC(micField) + if err != nil { + return authFailure, nil, err + } + if err := c.writePacket(Marshal(&userAuthGSSAPIMIC{ + MIC: micToken, + })); err != nil { + return authFailure, nil, err + } + return handleAuthResponse(c) +} + +func (g *gssAPIWithMICCallback) method() string { + return "gssapi-with-mic" +} diff --git a/vendor/golang.org/x/crypto/ssh/common.go b/vendor/golang.org/x/crypto/ssh/common.go index 04f3620b3..290382d05 100644 --- a/vendor/golang.org/x/crypto/ssh/common.go +++ b/vendor/golang.org/x/crypto/ssh/common.go @@ -51,6 +51,21 @@ var supportedKexAlgos = []string{ kexAlgoDH14SHA1, kexAlgoDH1SHA1, } +// serverForbiddenKexAlgos contains key exchange algorithms, that are forbidden +// for the server half. +var serverForbiddenKexAlgos = map[string]struct{}{ + kexAlgoDHGEXSHA1: {}, // server half implementation is only minimal to satisfy the automated tests + kexAlgoDHGEXSHA256: {}, // server half implementation is only minimal to satisfy the automated tests +} + +// preferredKexAlgos specifies the default preference for key-exchange algorithms +// in preference order. +var preferredKexAlgos = []string{ + kexAlgoCurve25519SHA256, + kexAlgoECDH256, kexAlgoECDH384, kexAlgoECDH521, + kexAlgoDH14SHA1, +} + // supportedHostKeyAlgos specifies the supported host-key algorithms (i.e. methods // of authenticating servers) in preference order. var supportedHostKeyAlgos = []string{ @@ -109,6 +124,7 @@ func findCommon(what string, client []string, server []string) (common string, e return "", fmt.Errorf("ssh: no common algorithm for %s; client offered: %v, server offered: %v", what, client, server) } +// directionAlgorithms records algorithm choices in one direction (either read or write) type directionAlgorithms struct { Cipher string MAC string @@ -137,7 +153,7 @@ type algorithms struct { r directionAlgorithms } -func findAgreedAlgorithms(clientKexInit, serverKexInit *kexInitMsg) (algs *algorithms, err error) { +func findAgreedAlgorithms(isClient bool, clientKexInit, serverKexInit *kexInitMsg) (algs *algorithms, err error) { result := &algorithms{} result.kex, err = findCommon("key exchange", clientKexInit.KexAlgos, serverKexInit.KexAlgos) @@ -150,32 +166,37 @@ func findAgreedAlgorithms(clientKexInit, serverKexInit *kexInitMsg) (algs *algor return } - result.w.Cipher, err = findCommon("client to server cipher", clientKexInit.CiphersClientServer, serverKexInit.CiphersClientServer) + stoc, ctos := &result.w, &result.r + if isClient { + ctos, stoc = stoc, ctos + } + + ctos.Cipher, err = findCommon("client to server cipher", clientKexInit.CiphersClientServer, serverKexInit.CiphersClientServer) if err != nil { return } - result.r.Cipher, err = findCommon("server to client cipher", clientKexInit.CiphersServerClient, serverKexInit.CiphersServerClient) + stoc.Cipher, err = findCommon("server to client cipher", clientKexInit.CiphersServerClient, serverKexInit.CiphersServerClient) if err != nil { return } - result.w.MAC, err = findCommon("client to server MAC", clientKexInit.MACsClientServer, serverKexInit.MACsClientServer) + ctos.MAC, err = findCommon("client to server MAC", clientKexInit.MACsClientServer, serverKexInit.MACsClientServer) if err != nil { return } - result.r.MAC, err = findCommon("server to client MAC", clientKexInit.MACsServerClient, serverKexInit.MACsServerClient) + stoc.MAC, err = findCommon("server to client MAC", clientKexInit.MACsServerClient, serverKexInit.MACsServerClient) if err != nil { return } - result.w.Compression, err = findCommon("client to server compression", clientKexInit.CompressionClientServer, serverKexInit.CompressionClientServer) + ctos.Compression, err = findCommon("client to server compression", clientKexInit.CompressionClientServer, serverKexInit.CompressionClientServer) if err != nil { return } - result.r.Compression, err = findCommon("server to client compression", clientKexInit.CompressionServerClient, serverKexInit.CompressionServerClient) + stoc.Compression, err = findCommon("server to client compression", clientKexInit.CompressionServerClient, serverKexInit.CompressionServerClient) if err != nil { return } @@ -233,7 +254,7 @@ func (c *Config) SetDefaults() { c.Ciphers = ciphers if c.KeyExchanges == nil { - c.KeyExchanges = supportedKexAlgos + c.KeyExchanges = preferredKexAlgos } if c.MACs == nil { diff --git a/vendor/golang.org/x/crypto/ssh/handshake.go b/vendor/golang.org/x/crypto/ssh/handshake.go index 4f7912ecd..2b10b05a4 100644 --- a/vendor/golang.org/x/crypto/ssh/handshake.go +++ b/vendor/golang.org/x/crypto/ssh/handshake.go @@ -543,7 +543,8 @@ func (t *handshakeTransport) enterKeyExchange(otherInitPacket []byte) error { clientInit := otherInit serverInit := t.sentInitMsg - if len(t.hostKeys) == 0 { + isClient := len(t.hostKeys) == 0 + if isClient { clientInit, serverInit = serverInit, clientInit magics.clientKexInit = t.sentInitPacket @@ -551,7 +552,7 @@ func (t *handshakeTransport) enterKeyExchange(otherInitPacket []byte) error { } var err error - t.algorithms, err = findAgreedAlgorithms(clientInit, serverInit) + t.algorithms, err = findAgreedAlgorithms(isClient, clientInit, serverInit) if err != nil { return err } diff --git a/vendor/golang.org/x/crypto/ssh/internal/bcrypt_pbkdf/bcrypt_pbkdf.go b/vendor/golang.org/x/crypto/ssh/internal/bcrypt_pbkdf/bcrypt_pbkdf.go new file mode 100644 index 000000000..af81d2665 --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/internal/bcrypt_pbkdf/bcrypt_pbkdf.go @@ -0,0 +1,93 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package bcrypt_pbkdf implements bcrypt_pbkdf(3) from OpenBSD. +// +// See https://flak.tedunangst.com/post/bcrypt-pbkdf and +// https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libutil/bcrypt_pbkdf.c. +package bcrypt_pbkdf + +import ( + "crypto/sha512" + "errors" + "golang.org/x/crypto/blowfish" +) + +const blockSize = 32 + +// Key derives a key from the password, salt and rounds count, returning a +// []byte of length keyLen that can be used as cryptographic key. +func Key(password, salt []byte, rounds, keyLen int) ([]byte, error) { + if rounds < 1 { + return nil, errors.New("bcrypt_pbkdf: number of rounds is too small") + } + if len(password) == 0 { + return nil, errors.New("bcrypt_pbkdf: empty password") + } + if len(salt) == 0 || len(salt) > 1<<20 { + return nil, errors.New("bcrypt_pbkdf: bad salt length") + } + if keyLen > 1024 { + return nil, errors.New("bcrypt_pbkdf: keyLen is too large") + } + + numBlocks := (keyLen + blockSize - 1) / blockSize + key := make([]byte, numBlocks*blockSize) + + h := sha512.New() + h.Write(password) + shapass := h.Sum(nil) + + shasalt := make([]byte, 0, sha512.Size) + cnt, tmp := make([]byte, 4), make([]byte, blockSize) + for block := 1; block <= numBlocks; block++ { + h.Reset() + h.Write(salt) + cnt[0] = byte(block >> 24) + cnt[1] = byte(block >> 16) + cnt[2] = byte(block >> 8) + cnt[3] = byte(block) + h.Write(cnt) + bcryptHash(tmp, shapass, h.Sum(shasalt)) + + out := make([]byte, blockSize) + copy(out, tmp) + for i := 2; i <= rounds; i++ { + h.Reset() + h.Write(tmp) + bcryptHash(tmp, shapass, h.Sum(shasalt)) + for j := 0; j < len(out); j++ { + out[j] ^= tmp[j] + } + } + + for i, v := range out { + key[i*numBlocks+(block-1)] = v + } + } + return key[:keyLen], nil +} + +var magic = []byte("OxychromaticBlowfishSwatDynamite") + +func bcryptHash(out, shapass, shasalt []byte) { + c, err := blowfish.NewSaltedCipher(shapass, shasalt) + if err != nil { + panic(err) + } + for i := 0; i < 64; i++ { + blowfish.ExpandKey(shasalt, c) + blowfish.ExpandKey(shapass, c) + } + copy(out, magic) + for i := 0; i < 32; i += 8 { + for j := 0; j < 64; j++ { + c.Encrypt(out[i:i+8], out[i:i+8]) + } + } + // Swap bytes due to different endianness. + for i := 0; i < 32; i += 4 { + out[i+3], out[i+2], out[i+1], out[i] = out[i], out[i+1], out[i+2], out[i+3] + } +} diff --git a/vendor/golang.org/x/crypto/ssh/kex.go b/vendor/golang.org/x/crypto/ssh/kex.go index f34bcc013..7eedb209f 100644 --- a/vendor/golang.org/x/crypto/ssh/kex.go +++ b/vendor/golang.org/x/crypto/ssh/kex.go @@ -10,7 +10,9 @@ import ( "crypto/elliptic" "crypto/rand" "crypto/subtle" + "encoding/binary" "errors" + "fmt" "io" "math/big" @@ -24,6 +26,12 @@ const ( kexAlgoECDH384 = "ecdh-sha2-nistp384" kexAlgoECDH521 = "ecdh-sha2-nistp521" kexAlgoCurve25519SHA256 = "curve25519-sha256@libssh.org" + + // For the following kex only the client half contains a production + // ready implementation. The server half only consists of a minimal + // implementation to satisfy the automated tests. + kexAlgoDHGEXSHA1 = "diffie-hellman-group-exchange-sha1" + kexAlgoDHGEXSHA256 = "diffie-hellman-group-exchange-sha256" ) // kexResult captures the outcome of a key exchange. @@ -204,7 +212,7 @@ func (group *dhGroup) Server(c packetConn, randSource io.Reader, magics *handsha HostKey: hostKeyBytes, Signature: sig, Hash: crypto.SHA1, - }, nil + }, err } // ecdh performs Elliptic Curve Diffie-Hellman key exchange as @@ -402,6 +410,8 @@ func init() { kexAlgoMap[kexAlgoECDH384] = &ecdh{elliptic.P384()} kexAlgoMap[kexAlgoECDH256] = &ecdh{elliptic.P256()} kexAlgoMap[kexAlgoCurve25519SHA256] = &curve25519sha256{} + kexAlgoMap[kexAlgoDHGEXSHA1] = &dhGEXSHA{hashFunc: crypto.SHA1} + kexAlgoMap[kexAlgoDHGEXSHA256] = &dhGEXSHA{hashFunc: crypto.SHA256} } // curve25519sha256 implements the curve25519-sha256@libssh.org key @@ -538,3 +548,242 @@ func (kex *curve25519sha256) Server(c packetConn, rand io.Reader, magics *handsh Hash: crypto.SHA256, }, nil } + +// dhGEXSHA implements the diffie-hellman-group-exchange-sha1 and +// diffie-hellman-group-exchange-sha256 key agreement protocols, +// as described in RFC 4419 +type dhGEXSHA struct { + g, p *big.Int + hashFunc crypto.Hash +} + +const numMRTests = 64 + +const ( + dhGroupExchangeMinimumBits = 2048 + dhGroupExchangePreferredBits = 2048 + dhGroupExchangeMaximumBits = 8192 +) + +func (gex *dhGEXSHA) diffieHellman(theirPublic, myPrivate *big.Int) (*big.Int, error) { + if theirPublic.Sign() <= 0 || theirPublic.Cmp(gex.p) >= 0 { + return nil, fmt.Errorf("ssh: DH parameter out of bounds") + } + return new(big.Int).Exp(theirPublic, myPrivate, gex.p), nil +} + +func (gex dhGEXSHA) Client(c packetConn, randSource io.Reader, magics *handshakeMagics) (*kexResult, error) { + // Send GexRequest + kexDHGexRequest := kexDHGexRequestMsg{ + MinBits: dhGroupExchangeMinimumBits, + PreferedBits: dhGroupExchangePreferredBits, + MaxBits: dhGroupExchangeMaximumBits, + } + if err := c.writePacket(Marshal(&kexDHGexRequest)); err != nil { + return nil, err + } + + // Receive GexGroup + packet, err := c.readPacket() + if err != nil { + return nil, err + } + + var kexDHGexGroup kexDHGexGroupMsg + if err = Unmarshal(packet, &kexDHGexGroup); err != nil { + return nil, err + } + + // reject if p's bit length < dhGroupExchangeMinimumBits or > dhGroupExchangeMaximumBits + if kexDHGexGroup.P.BitLen() < dhGroupExchangeMinimumBits || kexDHGexGroup.P.BitLen() > dhGroupExchangeMaximumBits { + return nil, fmt.Errorf("ssh: server-generated gex p is out of range (%d bits)", kexDHGexGroup.P.BitLen()) + } + + gex.p = kexDHGexGroup.P + gex.g = kexDHGexGroup.G + + // Check if p is safe by verifing that p and (p-1)/2 are primes + one := big.NewInt(1) + var pHalf = &big.Int{} + pHalf.Rsh(gex.p, 1) + if !gex.p.ProbablyPrime(numMRTests) || !pHalf.ProbablyPrime(numMRTests) { + return nil, fmt.Errorf("ssh: server provided gex p is not safe") + } + + // Check if g is safe by verifing that g > 1 and g < p - 1 + var pMinusOne = &big.Int{} + pMinusOne.Sub(gex.p, one) + if gex.g.Cmp(one) != 1 && gex.g.Cmp(pMinusOne) != -1 { + return nil, fmt.Errorf("ssh: server provided gex g is not safe") + } + + // Send GexInit + x, err := rand.Int(randSource, pHalf) + if err != nil { + return nil, err + } + X := new(big.Int).Exp(gex.g, x, gex.p) + kexDHGexInit := kexDHGexInitMsg{ + X: X, + } + if err := c.writePacket(Marshal(&kexDHGexInit)); err != nil { + return nil, err + } + + // Receive GexReply + packet, err = c.readPacket() + if err != nil { + return nil, err + } + + var kexDHGexReply kexDHGexReplyMsg + if err = Unmarshal(packet, &kexDHGexReply); err != nil { + return nil, err + } + + kInt, err := gex.diffieHellman(kexDHGexReply.Y, x) + if err != nil { + return nil, err + } + + // Check if k is safe by verifing that k > 1 and k < p - 1 + if kInt.Cmp(one) != 1 && kInt.Cmp(pMinusOne) != -1 { + return nil, fmt.Errorf("ssh: derived k is not safe") + } + + h := gex.hashFunc.New() + magics.write(h) + writeString(h, kexDHGexReply.HostKey) + binary.Write(h, binary.BigEndian, uint32(dhGroupExchangeMinimumBits)) + binary.Write(h, binary.BigEndian, uint32(dhGroupExchangePreferredBits)) + binary.Write(h, binary.BigEndian, uint32(dhGroupExchangeMaximumBits)) + writeInt(h, gex.p) + writeInt(h, gex.g) + writeInt(h, X) + writeInt(h, kexDHGexReply.Y) + K := make([]byte, intLength(kInt)) + marshalInt(K, kInt) + h.Write(K) + + return &kexResult{ + H: h.Sum(nil), + K: K, + HostKey: kexDHGexReply.HostKey, + Signature: kexDHGexReply.Signature, + Hash: gex.hashFunc, + }, nil +} + +// Server half implementation of the Diffie Hellman Key Exchange with SHA1 and SHA256. +// +// This is a minimal implementation to satisfy the automated tests. +func (gex dhGEXSHA) Server(c packetConn, randSource io.Reader, magics *handshakeMagics, priv Signer) (result *kexResult, err error) { + // Receive GexRequest + packet, err := c.readPacket() + if err != nil { + return + } + var kexDHGexRequest kexDHGexRequestMsg + if err = Unmarshal(packet, &kexDHGexRequest); err != nil { + return + } + + // smoosh the user's preferred size into our own limits + if kexDHGexRequest.PreferedBits > dhGroupExchangeMaximumBits { + kexDHGexRequest.PreferedBits = dhGroupExchangeMaximumBits + } + if kexDHGexRequest.PreferedBits < dhGroupExchangeMinimumBits { + kexDHGexRequest.PreferedBits = dhGroupExchangeMinimumBits + } + // fix min/max if they're inconsistent. technically, we could just pout + // and hang up, but there's no harm in giving them the benefit of the + // doubt and just picking a bitsize for them. + if kexDHGexRequest.MinBits > kexDHGexRequest.PreferedBits { + kexDHGexRequest.MinBits = kexDHGexRequest.PreferedBits + } + if kexDHGexRequest.MaxBits < kexDHGexRequest.PreferedBits { + kexDHGexRequest.MaxBits = kexDHGexRequest.PreferedBits + } + + // Send GexGroup + // This is the group called diffie-hellman-group14-sha1 in RFC + // 4253 and Oakley Group 14 in RFC 3526. + p, _ := new(big.Int).SetString("FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF", 16) + gex.p = p + gex.g = big.NewInt(2) + + kexDHGexGroup := kexDHGexGroupMsg{ + P: gex.p, + G: gex.g, + } + if err := c.writePacket(Marshal(&kexDHGexGroup)); err != nil { + return nil, err + } + + // Receive GexInit + packet, err = c.readPacket() + if err != nil { + return + } + var kexDHGexInit kexDHGexInitMsg + if err = Unmarshal(packet, &kexDHGexInit); err != nil { + return + } + + var pHalf = &big.Int{} + pHalf.Rsh(gex.p, 1) + + y, err := rand.Int(randSource, pHalf) + if err != nil { + return + } + + Y := new(big.Int).Exp(gex.g, y, gex.p) + kInt, err := gex.diffieHellman(kexDHGexInit.X, y) + if err != nil { + return nil, err + } + + hostKeyBytes := priv.PublicKey().Marshal() + + h := gex.hashFunc.New() + magics.write(h) + writeString(h, hostKeyBytes) + binary.Write(h, binary.BigEndian, uint32(dhGroupExchangeMinimumBits)) + binary.Write(h, binary.BigEndian, uint32(dhGroupExchangePreferredBits)) + binary.Write(h, binary.BigEndian, uint32(dhGroupExchangeMaximumBits)) + writeInt(h, gex.p) + writeInt(h, gex.g) + writeInt(h, kexDHGexInit.X) + writeInt(h, Y) + + K := make([]byte, intLength(kInt)) + marshalInt(K, kInt) + h.Write(K) + + H := h.Sum(nil) + + // H is already a hash, but the hostkey signing will apply its + // own key-specific hash algorithm. + sig, err := signAndMarshal(priv, randSource, H) + if err != nil { + return nil, err + } + + kexDHGexReply := kexDHGexReplyMsg{ + HostKey: hostKeyBytes, + Y: Y, + Signature: sig, + } + packet = Marshal(&kexDHGexReply) + + err = c.writePacket(packet) + + return &kexResult{ + H: H, + K: K, + HostKey: hostKeyBytes, + Signature: sig, + Hash: gex.hashFunc, + }, err +} diff --git a/vendor/golang.org/x/crypto/ssh/keys.go b/vendor/golang.org/x/crypto/ssh/keys.go index 73697deda..31f26349a 100644 --- a/vendor/golang.org/x/crypto/ssh/keys.go +++ b/vendor/golang.org/x/crypto/ssh/keys.go @@ -7,6 +7,8 @@ package ssh import ( "bytes" "crypto" + "crypto/aes" + "crypto/cipher" "crypto/dsa" "crypto/ecdsa" "crypto/elliptic" @@ -25,17 +27,30 @@ import ( "strings" "golang.org/x/crypto/ed25519" + "golang.org/x/crypto/ssh/internal/bcrypt_pbkdf" ) // These constants represent the algorithm names for key types supported by this // package. const ( - KeyAlgoRSA = "ssh-rsa" - KeyAlgoDSA = "ssh-dss" - KeyAlgoECDSA256 = "ecdsa-sha2-nistp256" - KeyAlgoECDSA384 = "ecdsa-sha2-nistp384" - KeyAlgoECDSA521 = "ecdsa-sha2-nistp521" - KeyAlgoED25519 = "ssh-ed25519" + KeyAlgoRSA = "ssh-rsa" + KeyAlgoDSA = "ssh-dss" + KeyAlgoECDSA256 = "ecdsa-sha2-nistp256" + KeyAlgoSKECDSA256 = "sk-ecdsa-sha2-nistp256@openssh.com" + KeyAlgoECDSA384 = "ecdsa-sha2-nistp384" + KeyAlgoECDSA521 = "ecdsa-sha2-nistp521" + KeyAlgoED25519 = "ssh-ed25519" + KeyAlgoSKED25519 = "sk-ssh-ed25519@openssh.com" +) + +// These constants represent non-default signature algorithms that are supported +// as algorithm parameters to AlgorithmSigner.SignWithAlgorithm methods. See +// [PROTOCOL.agent] section 4.5.1 and +// https://tools.ietf.org/html/draft-ietf-curdle-rsa-sha2-10 +const ( + SigAlgoRSA = "ssh-rsa" + SigAlgoRSASHA2256 = "rsa-sha2-256" + SigAlgoRSASHA2512 = "rsa-sha2-512" ) // parsePubKey parses a public key of the given algorithm. @@ -48,9 +63,13 @@ func parsePubKey(in []byte, algo string) (pubKey PublicKey, rest []byte, err err return parseDSA(in) case KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521: return parseECDSA(in) + case KeyAlgoSKECDSA256: + return parseSKECDSA(in) case KeyAlgoED25519: return parseED25519(in) - case CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01, CertAlgoED25519v01: + case KeyAlgoSKED25519: + return parseSKEd25519(in) + case CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01, CertAlgoSKECDSA256v01, CertAlgoED25519v01, CertAlgoSKED25519v01: cert, err := parseCert(in, certToPrivAlgo(algo)) if err != nil { return nil, nil, err @@ -301,6 +320,19 @@ type Signer interface { Sign(rand io.Reader, data []byte) (*Signature, error) } +// A AlgorithmSigner is a Signer that also supports specifying a specific +// algorithm to use for signing. +type AlgorithmSigner interface { + Signer + + // SignWithAlgorithm is like Signer.Sign, but allows specification of a + // non-default signing algorithm. See the SigAlgo* constants in this + // package for signature algorithms supported by this package. Callers may + // pass an empty string for the algorithm in which case the AlgorithmSigner + // will use its default algorithm. + SignWithAlgorithm(rand io.Reader, data []byte, algorithm string) (*Signature, error) +} + type rsaPublicKey rsa.PublicKey func (r *rsaPublicKey) Type() string { @@ -349,13 +381,21 @@ func (r *rsaPublicKey) Marshal() []byte { } func (r *rsaPublicKey) Verify(data []byte, sig *Signature) error { - if sig.Format != r.Type() { + var hash crypto.Hash + switch sig.Format { + case SigAlgoRSA: + hash = crypto.SHA1 + case SigAlgoRSASHA2256: + hash = crypto.SHA256 + case SigAlgoRSASHA2512: + hash = crypto.SHA512 + default: return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, r.Type()) } - h := crypto.SHA1.New() + h := hash.New() h.Write(data) digest := h.Sum(nil) - return rsa.VerifyPKCS1v15((*rsa.PublicKey)(r), crypto.SHA1, digest, sig.Blob) + return rsa.VerifyPKCS1v15((*rsa.PublicKey)(r), hash, digest, sig.Blob) } func (r *rsaPublicKey) CryptoPublicKey() crypto.PublicKey { @@ -459,6 +499,14 @@ func (k *dsaPrivateKey) PublicKey() PublicKey { } func (k *dsaPrivateKey) Sign(rand io.Reader, data []byte) (*Signature, error) { + return k.SignWithAlgorithm(rand, data, "") +} + +func (k *dsaPrivateKey) SignWithAlgorithm(rand io.Reader, data []byte, algorithm string) (*Signature, error) { + if algorithm != "" && algorithm != k.PublicKey().Type() { + return nil, fmt.Errorf("ssh: unsupported signature algorithm %s", algorithm) + } + h := crypto.SHA1.New() h.Write(data) digest := h.Sum(nil) @@ -514,9 +562,11 @@ func parseED25519(in []byte) (out PublicKey, rest []byte, err error) { return nil, nil, err } - key := ed25519.PublicKey(w.KeyBytes) + if l := len(w.KeyBytes); l != ed25519.PublicKeySize { + return nil, nil, fmt.Errorf("invalid size %d for Ed25519 public key", l) + } - return (ed25519PublicKey)(key), w.Rest, nil + return ed25519PublicKey(w.KeyBytes), w.Rest, nil } func (k ed25519PublicKey) Marshal() []byte { @@ -534,9 +584,11 @@ func (k ed25519PublicKey) Verify(b []byte, sig *Signature) error { if sig.Format != k.Type() { return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type()) } + if l := len(k); l != ed25519.PublicKeySize { + return fmt.Errorf("ssh: invalid size %d for Ed25519 public key", l) + } - edKey := (ed25519.PublicKey)(k) - if ok := ed25519.Verify(edKey, b, sig.Blob); !ok { + if ok := ed25519.Verify(ed25519.PublicKey(k), b, sig.Blob); !ok { return errors.New("ssh: signature did not verify") } @@ -646,6 +698,224 @@ func (k *ecdsaPublicKey) CryptoPublicKey() crypto.PublicKey { return (*ecdsa.PublicKey)(k) } +// skFields holds the additional fields present in U2F/FIDO2 signatures. +// See openssh/PROTOCOL.u2f 'SSH U2F Signatures' for details. +type skFields struct { + // Flags contains U2F/FIDO2 flags such as 'user present' + Flags byte + // Counter is a monotonic signature counter which can be + // used to detect concurrent use of a private key, should + // it be extracted from hardware. + Counter uint32 +} + +type skECDSAPublicKey struct { + // application is a URL-like string, typically "ssh:" for SSH. + // see openssh/PROTOCOL.u2f for details. + application string + ecdsa.PublicKey +} + +func (k *skECDSAPublicKey) Type() string { + return KeyAlgoSKECDSA256 +} + +func (k *skECDSAPublicKey) nistID() string { + return "nistp256" +} + +func parseSKECDSA(in []byte) (out PublicKey, rest []byte, err error) { + var w struct { + Curve string + KeyBytes []byte + Application string + Rest []byte `ssh:"rest"` + } + + if err := Unmarshal(in, &w); err != nil { + return nil, nil, err + } + + key := new(skECDSAPublicKey) + key.application = w.Application + + if w.Curve != "nistp256" { + return nil, nil, errors.New("ssh: unsupported curve") + } + key.Curve = elliptic.P256() + + key.X, key.Y = elliptic.Unmarshal(key.Curve, w.KeyBytes) + if key.X == nil || key.Y == nil { + return nil, nil, errors.New("ssh: invalid curve point") + } + + return key, w.Rest, nil +} + +func (k *skECDSAPublicKey) Marshal() []byte { + // See RFC 5656, section 3.1. + keyBytes := elliptic.Marshal(k.Curve, k.X, k.Y) + w := struct { + Name string + ID string + Key []byte + Application string + }{ + k.Type(), + k.nistID(), + keyBytes, + k.application, + } + + return Marshal(&w) +} + +func (k *skECDSAPublicKey) Verify(data []byte, sig *Signature) error { + if sig.Format != k.Type() { + return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type()) + } + + h := ecHash(k.Curve).New() + h.Write([]byte(k.application)) + appDigest := h.Sum(nil) + + h.Reset() + h.Write(data) + dataDigest := h.Sum(nil) + + var ecSig struct { + R *big.Int + S *big.Int + } + if err := Unmarshal(sig.Blob, &ecSig); err != nil { + return err + } + + var skf skFields + if err := Unmarshal(sig.Rest, &skf); err != nil { + return err + } + + blob := struct { + ApplicationDigest []byte `ssh:"rest"` + Flags byte + Counter uint32 + MessageDigest []byte `ssh:"rest"` + }{ + appDigest, + skf.Flags, + skf.Counter, + dataDigest, + } + + original := Marshal(blob) + + h.Reset() + h.Write(original) + digest := h.Sum(nil) + + if ecdsa.Verify((*ecdsa.PublicKey)(&k.PublicKey), digest, ecSig.R, ecSig.S) { + return nil + } + return errors.New("ssh: signature did not verify") +} + +type skEd25519PublicKey struct { + // application is a URL-like string, typically "ssh:" for SSH. + // see openssh/PROTOCOL.u2f for details. + application string + ed25519.PublicKey +} + +func (k *skEd25519PublicKey) Type() string { + return KeyAlgoSKED25519 +} + +func parseSKEd25519(in []byte) (out PublicKey, rest []byte, err error) { + var w struct { + KeyBytes []byte + Application string + Rest []byte `ssh:"rest"` + } + + if err := Unmarshal(in, &w); err != nil { + return nil, nil, err + } + + if l := len(w.KeyBytes); l != ed25519.PublicKeySize { + return nil, nil, fmt.Errorf("invalid size %d for Ed25519 public key", l) + } + + key := new(skEd25519PublicKey) + key.application = w.Application + key.PublicKey = ed25519.PublicKey(w.KeyBytes) + + return key, w.Rest, nil +} + +func (k *skEd25519PublicKey) Marshal() []byte { + w := struct { + Name string + KeyBytes []byte + Application string + }{ + KeyAlgoSKED25519, + []byte(k.PublicKey), + k.application, + } + return Marshal(&w) +} + +func (k *skEd25519PublicKey) Verify(data []byte, sig *Signature) error { + if sig.Format != k.Type() { + return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type()) + } + if l := len(k.PublicKey); l != ed25519.PublicKeySize { + return fmt.Errorf("invalid size %d for Ed25519 public key", l) + } + + h := sha256.New() + h.Write([]byte(k.application)) + appDigest := h.Sum(nil) + + h.Reset() + h.Write(data) + dataDigest := h.Sum(nil) + + var edSig struct { + Signature []byte `ssh:"rest"` + } + + if err := Unmarshal(sig.Blob, &edSig); err != nil { + return err + } + + var skf skFields + if err := Unmarshal(sig.Rest, &skf); err != nil { + return err + } + + blob := struct { + ApplicationDigest []byte `ssh:"rest"` + Flags byte + Counter uint32 + MessageDigest []byte `ssh:"rest"` + }{ + appDigest, + skf.Flags, + skf.Counter, + dataDigest, + } + + original := Marshal(blob) + + if ok := ed25519.Verify(k.PublicKey, original, edSig.Signature); !ok { + return errors.New("ssh: signature did not verify") + } + + return nil +} + // NewSignerFromKey takes an *rsa.PrivateKey, *dsa.PrivateKey, // *ecdsa.PrivateKey or any other crypto.Signer and returns a // corresponding Signer instance. ECDSA keys must use P-256, P-384 or @@ -691,16 +961,42 @@ func (s *wrappedSigner) PublicKey() PublicKey { } func (s *wrappedSigner) Sign(rand io.Reader, data []byte) (*Signature, error) { + return s.SignWithAlgorithm(rand, data, "") +} + +func (s *wrappedSigner) SignWithAlgorithm(rand io.Reader, data []byte, algorithm string) (*Signature, error) { var hashFunc crypto.Hash - switch key := s.pubKey.(type) { - case *rsaPublicKey, *dsaPublicKey: - hashFunc = crypto.SHA1 - case *ecdsaPublicKey: - hashFunc = ecHash(key.Curve) - case ed25519PublicKey: - default: - return nil, fmt.Errorf("ssh: unsupported key type %T", key) + if _, ok := s.pubKey.(*rsaPublicKey); ok { + // RSA keys support a few hash functions determined by the requested signature algorithm + switch algorithm { + case "", SigAlgoRSA: + algorithm = SigAlgoRSA + hashFunc = crypto.SHA1 + case SigAlgoRSASHA2256: + hashFunc = crypto.SHA256 + case SigAlgoRSASHA2512: + hashFunc = crypto.SHA512 + default: + return nil, fmt.Errorf("ssh: unsupported signature algorithm %s", algorithm) + } + } else { + // The only supported algorithm for all other key types is the same as the type of the key + if algorithm == "" { + algorithm = s.pubKey.Type() + } else if algorithm != s.pubKey.Type() { + return nil, fmt.Errorf("ssh: unsupported signature algorithm %s", algorithm) + } + + switch key := s.pubKey.(type) { + case *dsaPublicKey: + hashFunc = crypto.SHA1 + case *ecdsaPublicKey: + hashFunc = ecHash(key.Curve) + case ed25519PublicKey: + default: + return nil, fmt.Errorf("ssh: unsupported key type %T", key) + } } var digest []byte @@ -745,7 +1041,7 @@ func (s *wrappedSigner) Sign(rand io.Reader, data []byte) (*Signature, error) { } return &Signature{ - Format: s.pubKey.Type(), + Format: algorithm, Blob: signature, }, nil } @@ -765,14 +1061,18 @@ func NewPublicKey(key interface{}) (PublicKey, error) { case *dsa.PublicKey: return (*dsaPublicKey)(key), nil case ed25519.PublicKey: - return (ed25519PublicKey)(key), nil + if l := len(key); l != ed25519.PublicKeySize { + return nil, fmt.Errorf("ssh: invalid size %d for Ed25519 public key", l) + } + return ed25519PublicKey(key), nil default: return nil, fmt.Errorf("ssh: unsupported key type %T", key) } } // ParsePrivateKey returns a Signer from a PEM encoded private key. It supports -// the same keys as ParseRawPrivateKey. +// the same keys as ParseRawPrivateKey. If the private key is encrypted, it +// will return a PassphraseMissingError. func ParsePrivateKey(pemBytes []byte) (Signer, error) { key, err := ParseRawPrivateKey(pemBytes) if err != nil { @@ -785,8 +1085,8 @@ func ParsePrivateKey(pemBytes []byte) (Signer, error) { // ParsePrivateKeyWithPassphrase returns a Signer from a PEM encoded private // key and passphrase. It supports the same keys as // ParseRawPrivateKeyWithPassphrase. -func ParsePrivateKeyWithPassphrase(pemBytes, passPhrase []byte) (Signer, error) { - key, err := ParseRawPrivateKeyWithPassphrase(pemBytes, passPhrase) +func ParsePrivateKeyWithPassphrase(pemBytes, passphrase []byte) (Signer, error) { + key, err := ParseRawPrivateKeyWithPassphrase(pemBytes, passphrase) if err != nil { return nil, err } @@ -802,8 +1102,21 @@ func encryptedBlock(block *pem.Block) bool { return strings.Contains(block.Headers["Proc-Type"], "ENCRYPTED") } +// A PassphraseMissingError indicates that parsing this private key requires a +// passphrase. Use ParsePrivateKeyWithPassphrase. +type PassphraseMissingError struct { + // PublicKey will be set if the private key format includes an unencrypted + // public key along with the encrypted private key. + PublicKey PublicKey +} + +func (*PassphraseMissingError) Error() string { + return "ssh: this private key is passphrase protected" +} + // ParseRawPrivateKey returns a private key from a PEM encoded private key. It -// supports RSA (PKCS#1), DSA (OpenSSL), and ECDSA private keys. +// supports RSA (PKCS#1), PKCS#8, DSA (OpenSSL), and ECDSA private keys. If the +// private key is encrypted, it will return a PassphraseMissingError. func ParseRawPrivateKey(pemBytes []byte) (interface{}, error) { block, _ := pem.Decode(pemBytes) if block == nil { @@ -811,44 +1124,49 @@ func ParseRawPrivateKey(pemBytes []byte) (interface{}, error) { } if encryptedBlock(block) { - return nil, errors.New("ssh: cannot decode encrypted private keys") + return nil, &PassphraseMissingError{} } switch block.Type { case "RSA PRIVATE KEY": return x509.ParsePKCS1PrivateKey(block.Bytes) + // RFC5208 - https://tools.ietf.org/html/rfc5208 + case "PRIVATE KEY": + return x509.ParsePKCS8PrivateKey(block.Bytes) case "EC PRIVATE KEY": return x509.ParseECPrivateKey(block.Bytes) case "DSA PRIVATE KEY": return ParseDSAPrivateKey(block.Bytes) case "OPENSSH PRIVATE KEY": - return parseOpenSSHPrivateKey(block.Bytes) + return parseOpenSSHPrivateKey(block.Bytes, unencryptedOpenSSHKey) default: return nil, fmt.Errorf("ssh: unsupported key type %q", block.Type) } } // ParseRawPrivateKeyWithPassphrase returns a private key decrypted with -// passphrase from a PEM encoded private key. If wrong passphrase, return -// x509.IncorrectPasswordError. -func ParseRawPrivateKeyWithPassphrase(pemBytes, passPhrase []byte) (interface{}, error) { +// passphrase from a PEM encoded private key. If the passphrase is wrong, it +// will return x509.IncorrectPasswordError. +func ParseRawPrivateKeyWithPassphrase(pemBytes, passphrase []byte) (interface{}, error) { block, _ := pem.Decode(pemBytes) if block == nil { return nil, errors.New("ssh: no key found") } - buf := block.Bytes - if encryptedBlock(block) { - if x509.IsEncryptedPEMBlock(block) { - var err error - buf, err = x509.DecryptPEMBlock(block, passPhrase) - if err != nil { - if err == x509.IncorrectPasswordError { - return nil, err - } - return nil, fmt.Errorf("ssh: cannot decode encrypted private keys: %v", err) - } + if block.Type == "OPENSSH PRIVATE KEY" { + return parseOpenSSHPrivateKey(block.Bytes, passphraseProtectedOpenSSHKey(passphrase)) + } + + if !encryptedBlock(block) || !x509.IsEncryptedPEMBlock(block) { + return nil, errors.New("ssh: not an encrypted key") + } + + buf, err := x509.DecryptPEMBlock(block, passphrase) + if err != nil { + if err == x509.IncorrectPasswordError { + return nil, err } + return nil, fmt.Errorf("ssh: cannot decode encrypted private keys: %v", err) } switch block.Type { @@ -858,8 +1176,6 @@ func ParseRawPrivateKeyWithPassphrase(pemBytes, passPhrase []byte) (interface{}, return x509.ParseECPrivateKey(buf) case "DSA PRIVATE KEY": return ParseDSAPrivateKey(buf) - case "OPENSSH PRIVATE KEY": - return parseOpenSSHPrivateKey(buf) default: return nil, fmt.Errorf("ssh: unsupported key type %q", block.Type) } @@ -897,11 +1213,70 @@ func ParseDSAPrivateKey(der []byte) (*dsa.PrivateKey, error) { }, nil } -// Implemented based on the documentation at -// https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.key -func parseOpenSSHPrivateKey(key []byte) (crypto.PrivateKey, error) { - magic := append([]byte("openssh-key-v1"), 0) - if !bytes.Equal(magic, key[0:len(magic)]) { +func unencryptedOpenSSHKey(cipherName, kdfName, kdfOpts string, privKeyBlock []byte) ([]byte, error) { + if kdfName != "none" || cipherName != "none" { + return nil, &PassphraseMissingError{} + } + if kdfOpts != "" { + return nil, errors.New("ssh: invalid openssh private key") + } + return privKeyBlock, nil +} + +func passphraseProtectedOpenSSHKey(passphrase []byte) openSSHDecryptFunc { + return func(cipherName, kdfName, kdfOpts string, privKeyBlock []byte) ([]byte, error) { + if kdfName == "none" || cipherName == "none" { + return nil, errors.New("ssh: key is not password protected") + } + if kdfName != "bcrypt" { + return nil, fmt.Errorf("ssh: unknown KDF %q, only supports %q", kdfName, "bcrypt") + } + + var opts struct { + Salt string + Rounds uint32 + } + if err := Unmarshal([]byte(kdfOpts), &opts); err != nil { + return nil, err + } + + k, err := bcrypt_pbkdf.Key(passphrase, []byte(opts.Salt), int(opts.Rounds), 32+16) + if err != nil { + return nil, err + } + key, iv := k[:32], k[32:] + + c, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + switch cipherName { + case "aes256-ctr": + ctr := cipher.NewCTR(c, iv) + ctr.XORKeyStream(privKeyBlock, privKeyBlock) + case "aes256-cbc": + if len(privKeyBlock)%c.BlockSize() != 0 { + return nil, fmt.Errorf("ssh: invalid encrypted private key length, not a multiple of the block size") + } + cbc := cipher.NewCBCDecrypter(c, iv) + cbc.CryptBlocks(privKeyBlock, privKeyBlock) + default: + return nil, fmt.Errorf("ssh: unknown cipher %q, only supports %q or %q", cipherName, "aes256-ctr", "aes256-cbc") + } + + return privKeyBlock, nil + } +} + +type openSSHDecryptFunc func(CipherName, KdfName, KdfOpts string, PrivKeyBlock []byte) ([]byte, error) + +// parseOpenSSHPrivateKey parses an OpenSSH private key, using the decrypt +// function to unwrap the encrypted portion. unencryptedOpenSSHKey can be used +// as the decrypt function to parse an unencrypted private key. See +// https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.key. +func parseOpenSSHPrivateKey(key []byte, decrypt openSSHDecryptFunc) (crypto.PrivateKey, error) { + const magic = "openssh-key-v1\x00" + if len(key) < len(magic) || string(key[:len(magic)]) != magic { return nil, errors.New("ssh: invalid openssh private key format") } remaining := key[len(magic):] @@ -918,9 +1293,22 @@ func parseOpenSSHPrivateKey(key []byte) (crypto.PrivateKey, error) { if err := Unmarshal(remaining, &w); err != nil { return nil, err } + if w.NumKeys != 1 { + // We only support single key files, and so does OpenSSH. + // https://github.com/openssh/openssh-portable/blob/4103a3ec7/sshkey.c#L4171 + return nil, errors.New("ssh: multi-key files are not supported") + } - if w.KdfName != "none" || w.CipherName != "none" { - return nil, errors.New("ssh: cannot decode encrypted private keys") + privKeyBlock, err := decrypt(w.CipherName, w.KdfName, w.KdfOpts, w.PrivKeyBlock) + if err != nil { + if err, ok := err.(*PassphraseMissingError); ok { + pub, errPub := ParsePublicKey(w.PubKey) + if errPub != nil { + return nil, fmt.Errorf("ssh: failed to parse embedded public key: %v", errPub) + } + err.PublicKey = pub + } + return nil, err } pk1 := struct { @@ -930,15 +1318,13 @@ func parseOpenSSHPrivateKey(key []byte) (crypto.PrivateKey, error) { Rest []byte `ssh:"rest"` }{} - if err := Unmarshal(w.PrivKeyBlock, &pk1); err != nil { - return nil, err - } - - if pk1.Check1 != pk1.Check2 { - return nil, errors.New("ssh: checkint mismatch") + if err := Unmarshal(privKeyBlock, &pk1); err != nil || pk1.Check1 != pk1.Check2 { + if w.CipherName != "none" { + return nil, x509.IncorrectPasswordError + } + return nil, errors.New("ssh: malformed OpenSSH key") } - // we only handle ed25519 and rsa keys currently switch pk1.Keytype { case KeyAlgoRSA: // https://github.com/openssh/openssh-portable/blob/master/sshkey.c#L2760-L2773 @@ -957,10 +1343,8 @@ func parseOpenSSHPrivateKey(key []byte) (crypto.PrivateKey, error) { return nil, err } - for i, b := range key.Pad { - if int(b) != i+1 { - return nil, errors.New("ssh: padding not as expected") - } + if err := checkOpenSSHKeyPadding(key.Pad); err != nil { + return nil, err } pk := &rsa.PrivateKey{ @@ -995,20 +1379,78 @@ func parseOpenSSHPrivateKey(key []byte) (crypto.PrivateKey, error) { return nil, errors.New("ssh: private key unexpected length") } - for i, b := range key.Pad { - if int(b) != i+1 { - return nil, errors.New("ssh: padding not as expected") - } + if err := checkOpenSSHKeyPadding(key.Pad); err != nil { + return nil, err } pk := ed25519.PrivateKey(make([]byte, ed25519.PrivateKeySize)) copy(pk, key.Priv) return &pk, nil + case KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521: + key := struct { + Curve string + Pub []byte + D *big.Int + Comment string + Pad []byte `ssh:"rest"` + }{} + + if err := Unmarshal(pk1.Rest, &key); err != nil { + return nil, err + } + + if err := checkOpenSSHKeyPadding(key.Pad); err != nil { + return nil, err + } + + var curve elliptic.Curve + switch key.Curve { + case "nistp256": + curve = elliptic.P256() + case "nistp384": + curve = elliptic.P384() + case "nistp521": + curve = elliptic.P521() + default: + return nil, errors.New("ssh: unhandled elliptic curve: " + key.Curve) + } + + X, Y := elliptic.Unmarshal(curve, key.Pub) + if X == nil || Y == nil { + return nil, errors.New("ssh: failed to unmarshal public key") + } + + if key.D.Cmp(curve.Params().N) >= 0 { + return nil, errors.New("ssh: scalar is out of range") + } + + x, y := curve.ScalarBaseMult(key.D.Bytes()) + if x.Cmp(X) != 0 || y.Cmp(Y) != 0 { + return nil, errors.New("ssh: public key does not match private key") + } + + return &ecdsa.PrivateKey{ + PublicKey: ecdsa.PublicKey{ + Curve: curve, + X: X, + Y: Y, + }, + D: key.D, + }, nil default: return nil, errors.New("ssh: unhandled key type") } } +func checkOpenSSHKeyPadding(pad []byte) error { + for i, b := range pad { + if int(b) != i+1 { + return errors.New("ssh: padding not as expected") + } + } + return nil +} + // FingerprintLegacyMD5 returns the user presentation of the key's // fingerprint as described by RFC 4716 section 4. func FingerprintLegacyMD5(pubKey PublicKey) string { diff --git a/vendor/golang.org/x/crypto/ssh/knownhosts/knownhosts.go b/vendor/golang.org/x/crypto/ssh/knownhosts/knownhosts.go index bc3db737e..260cfe58c 100644 --- a/vendor/golang.org/x/crypto/ssh/knownhosts/knownhosts.go +++ b/vendor/golang.org/x/crypto/ssh/knownhosts/knownhosts.go @@ -350,8 +350,8 @@ func (db *hostKeyDB) check(address string, remote net.Addr, remoteKey ssh.Public return db.checkAddr(hostToCheck, remoteKey) } -// checkAddrs checks if we can find the given public key for any of -// the given addresses. If we only find an entry for the IP address, +// checkAddr checks if we can find the given public key for the +// given address. If we only find an entry for the IP address, // or only the hostname, then this still succeeds. func (db *hostKeyDB) checkAddr(a addr, remoteKey ssh.PublicKey) error { // TODO(hanwen): are these the right semantics? What if there diff --git a/vendor/golang.org/x/crypto/ssh/messages.go b/vendor/golang.org/x/crypto/ssh/messages.go index 08d281173..ac41a4168 100644 --- a/vendor/golang.org/x/crypto/ssh/messages.go +++ b/vendor/golang.org/x/crypto/ssh/messages.go @@ -97,6 +97,36 @@ type kexDHReplyMsg struct { Signature []byte } +// See RFC 4419, section 5. +const msgKexDHGexGroup = 31 + +type kexDHGexGroupMsg struct { + P *big.Int `sshtype:"31"` + G *big.Int +} + +const msgKexDHGexInit = 32 + +type kexDHGexInitMsg struct { + X *big.Int `sshtype:"32"` +} + +const msgKexDHGexReply = 33 + +type kexDHGexReplyMsg struct { + HostKey []byte `sshtype:"33"` + Y *big.Int + Signature []byte +} + +const msgKexDHGexRequest = 34 + +type kexDHGexRequestMsg struct { + MinBits uint32 `sshtype:"34"` + PreferedBits uint32 + MaxBits uint32 +} + // See RFC 4253, section 10. const msgServiceRequest = 5 @@ -275,6 +305,42 @@ type userAuthPubKeyOkMsg struct { PubKey []byte } +// See RFC 4462, section 3 +const msgUserAuthGSSAPIResponse = 60 + +type userAuthGSSAPIResponse struct { + SupportMech []byte `sshtype:"60"` +} + +const msgUserAuthGSSAPIToken = 61 + +type userAuthGSSAPIToken struct { + Token []byte `sshtype:"61"` +} + +const msgUserAuthGSSAPIMIC = 66 + +type userAuthGSSAPIMIC struct { + MIC []byte `sshtype:"66"` +} + +// See RFC 4462, section 3.9 +const msgUserAuthGSSAPIErrTok = 64 + +type userAuthGSSAPIErrTok struct { + ErrorToken []byte `sshtype:"64"` +} + +// See RFC 4462, section 3.8 +const msgUserAuthGSSAPIError = 65 + +type userAuthGSSAPIError struct { + MajorStatus uint32 `sshtype:"65"` + MinorStatus uint32 + Message string + LanguageTag string +} + // typeTags returns the possible type bytes for the given reflect.Type, which // should be a struct. The possible values are separated by a '|' character. func typeTags(structType reflect.Type) (tags []byte) { @@ -756,6 +822,14 @@ func decode(packet []byte) (interface{}, error) { msg = new(channelRequestSuccessMsg) case msgChannelFailure: msg = new(channelRequestFailureMsg) + case msgUserAuthGSSAPIToken: + msg = new(userAuthGSSAPIToken) + case msgUserAuthGSSAPIMIC: + msg = new(userAuthGSSAPIMIC) + case msgUserAuthGSSAPIErrTok: + msg = new(userAuthGSSAPIErrTok) + case msgUserAuthGSSAPIError: + msg = new(userAuthGSSAPIError) default: return nil, unexpectedMessageError(0, packet[0]) } @@ -764,3 +838,29 @@ func decode(packet []byte) (interface{}, error) { } return msg, nil } + +var packetTypeNames = map[byte]string{ + msgDisconnect: "disconnectMsg", + msgServiceRequest: "serviceRequestMsg", + msgServiceAccept: "serviceAcceptMsg", + msgKexInit: "kexInitMsg", + msgKexDHInit: "kexDHInitMsg", + msgKexDHReply: "kexDHReplyMsg", + msgUserAuthRequest: "userAuthRequestMsg", + msgUserAuthSuccess: "userAuthSuccessMsg", + msgUserAuthFailure: "userAuthFailureMsg", + msgUserAuthPubKeyOk: "userAuthPubKeyOkMsg", + msgGlobalRequest: "globalRequestMsg", + msgRequestSuccess: "globalRequestSuccessMsg", + msgRequestFailure: "globalRequestFailureMsg", + msgChannelOpen: "channelOpenMsg", + msgChannelData: "channelDataMsg", + msgChannelOpenConfirm: "channelOpenConfirmMsg", + msgChannelOpenFailure: "channelOpenFailureMsg", + msgChannelWindowAdjust: "windowAdjustMsg", + msgChannelEOF: "channelEOFMsg", + msgChannelClose: "channelCloseMsg", + msgChannelRequest: "channelRequestMsg", + msgChannelSuccess: "channelRequestSuccessMsg", + msgChannelFailure: "channelRequestFailureMsg", +} diff --git a/vendor/golang.org/x/crypto/ssh/mux.go b/vendor/golang.org/x/crypto/ssh/mux.go index f19016270..9654c0186 100644 --- a/vendor/golang.org/x/crypto/ssh/mux.go +++ b/vendor/golang.org/x/crypto/ssh/mux.go @@ -240,7 +240,7 @@ func (m *mux) onePacket() error { id := binary.BigEndian.Uint32(packet[1:]) ch := m.chanList.getChan(id) if ch == nil { - return fmt.Errorf("ssh: invalid channel %d", id) + return m.handleUnknownChannelPacket(id, packet) } return ch.handlePacket(packet) @@ -328,3 +328,24 @@ func (m *mux) openChannel(chanType string, extra []byte) (*channel, error) { return nil, fmt.Errorf("ssh: unexpected packet in response to channel open: %T", msg) } } + +func (m *mux) handleUnknownChannelPacket(id uint32, packet []byte) error { + msg, err := decode(packet) + if err != nil { + return err + } + + switch msg := msg.(type) { + // RFC 4254 section 5.4 says unrecognized channel requests should + // receive a failure response. + case *channelRequestMsg: + if msg.WantReply { + return m.sendMessage(channelRequestFailureMsg{ + PeersID: msg.PeersID, + }) + } + return nil + default: + return fmt.Errorf("ssh: invalid channel %d", id) + } +} diff --git a/vendor/golang.org/x/crypto/ssh/server.go b/vendor/golang.org/x/crypto/ssh/server.go index d0f482531..7d42a8c88 100644 --- a/vendor/golang.org/x/crypto/ssh/server.go +++ b/vendor/golang.org/x/crypto/ssh/server.go @@ -45,6 +45,20 @@ type Permissions struct { Extensions map[string]string } +type GSSAPIWithMICConfig struct { + // AllowLogin, must be set, is called when gssapi-with-mic + // authentication is selected (RFC 4462 section 3). The srcName is from the + // results of the GSS-API authentication. The format is username@DOMAIN. + // GSSAPI just guarantees to the server who the user is, but not if they can log in, and with what permissions. + // This callback is called after the user identity is established with GSSAPI to decide if the user can login with + // which permissions. If the user is allowed to login, it should return a nil error. + AllowLogin func(conn ConnMetadata, srcName string) (*Permissions, error) + + // Server must be set. It's the implementation + // of the GSSAPIServer interface. See GSSAPIServer interface for details. + Server GSSAPIServer +} + // ServerConfig holds server specific configuration data. type ServerConfig struct { // Config contains configuration shared between client and server. @@ -99,6 +113,10 @@ type ServerConfig struct { // BannerCallback, if present, is called and the return string is sent to // the client after key exchange completed but before authentication. BannerCallback func(conn ConnMetadata) string + + // GSSAPIWithMICConfig includes gssapi server and callback, which if both non-nil, is used + // when gssapi-with-mic authentication is selected (RFC 4462 section 3). + GSSAPIWithMICConfig *GSSAPIWithMICConfig } // AddHostKey adds a private key as a host key. If an existing host @@ -175,6 +193,12 @@ func NewServerConn(c net.Conn, config *ServerConfig) (*ServerConn, <-chan NewCha if fullConf.MaxAuthTries == 0 { fullConf.MaxAuthTries = 6 } + // Check if the config contains any unsupported key exchanges + for _, kex := range fullConf.KeyExchanges { + if _, ok := serverForbiddenKexAlgos[kex]; ok { + return nil, nil, nil, fmt.Errorf("ssh: unsupported key exchange %s for server", kex) + } + } s := &connection{ sshConn: sshConn{conn: c}, @@ -204,7 +228,9 @@ func (s *connection) serverHandshake(config *ServerConfig) (*Permissions, error) return nil, errors.New("ssh: server has no host keys") } - if !config.NoClientAuth && config.PasswordCallback == nil && config.PublicKeyCallback == nil && config.KeyboardInteractiveCallback == nil { + if !config.NoClientAuth && config.PasswordCallback == nil && config.PublicKeyCallback == nil && + config.KeyboardInteractiveCallback == nil && (config.GSSAPIWithMICConfig == nil || + config.GSSAPIWithMICConfig.AllowLogin == nil || config.GSSAPIWithMICConfig.Server == nil) { return nil, errors.New("ssh: no authentication methods configured but NoClientAuth is also false") } @@ -258,8 +284,8 @@ func (s *connection) serverHandshake(config *ServerConfig) (*Permissions, error) func isAcceptableAlgo(algo string) bool { switch algo { - case KeyAlgoRSA, KeyAlgoDSA, KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521, KeyAlgoED25519, - CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01, CertAlgoED25519v01: + case KeyAlgoRSA, KeyAlgoDSA, KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521, KeyAlgoSKECDSA256, KeyAlgoED25519, KeyAlgoSKED25519, + CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01, CertAlgoSKECDSA256v01, CertAlgoED25519v01, CertAlgoSKED25519v01: return true } return false @@ -295,6 +321,55 @@ func checkSourceAddress(addr net.Addr, sourceAddrs string) error { return fmt.Errorf("ssh: remote address %v is not allowed because of source-address restriction", addr) } +func gssExchangeToken(gssapiConfig *GSSAPIWithMICConfig, firstToken []byte, s *connection, + sessionID []byte, userAuthReq userAuthRequestMsg) (authErr error, perms *Permissions, err error) { + gssAPIServer := gssapiConfig.Server + defer gssAPIServer.DeleteSecContext() + var srcName string + for { + var ( + outToken []byte + needContinue bool + ) + outToken, srcName, needContinue, err = gssAPIServer.AcceptSecContext(firstToken) + if err != nil { + return err, nil, nil + } + if len(outToken) != 0 { + if err := s.transport.writePacket(Marshal(&userAuthGSSAPIToken{ + Token: outToken, + })); err != nil { + return nil, nil, err + } + } + if !needContinue { + break + } + packet, err := s.transport.readPacket() + if err != nil { + return nil, nil, err + } + userAuthGSSAPITokenReq := &userAuthGSSAPIToken{} + if err := Unmarshal(packet, userAuthGSSAPITokenReq); err != nil { + return nil, nil, err + } + } + packet, err := s.transport.readPacket() + if err != nil { + return nil, nil, err + } + userAuthGSSAPIMICReq := &userAuthGSSAPIMIC{} + if err := Unmarshal(packet, userAuthGSSAPIMICReq); err != nil { + return nil, nil, err + } + mic := buildMIC(string(sessionID), userAuthReq.User, userAuthReq.Service, userAuthReq.Method) + if err := gssAPIServer.VerifyMIC(mic, userAuthGSSAPIMICReq.MIC); err != nil { + return err, nil, nil + } + perms, authErr = gssapiConfig.AllowLogin(s, srcName) + return authErr, perms, nil +} + // ServerAuthError represents server authentication errors and is // sometimes returned by NewServerConn. It appends any authentication // errors that may occur, and is returned if all of the authentication @@ -404,7 +479,7 @@ userAuthLoop: perms, authErr = config.PasswordCallback(s, password) case "keyboard-interactive": if config.KeyboardInteractiveCallback == nil { - authErr = errors.New("ssh: keyboard-interactive auth not configubred") + authErr = errors.New("ssh: keyboard-interactive auth not configured") break } @@ -484,6 +559,7 @@ userAuthLoop: // sig.Format. This is usually the same, but // for certs, the names differ. if !isAcceptableAlgo(sig.Format) { + authErr = fmt.Errorf("ssh: algorithm %q not accepted", sig.Format) break } signedData := buildDataSignedForAuth(sessionID, userAuthReq, algoBytes, pubKeyData) @@ -495,6 +571,49 @@ userAuthLoop: authErr = candidate.result perms = candidate.perms } + case "gssapi-with-mic": + gssapiConfig := config.GSSAPIWithMICConfig + userAuthRequestGSSAPI, err := parseGSSAPIPayload(userAuthReq.Payload) + if err != nil { + return nil, parseError(msgUserAuthRequest) + } + // OpenSSH supports Kerberos V5 mechanism only for GSS-API authentication. + if userAuthRequestGSSAPI.N == 0 { + authErr = fmt.Errorf("ssh: Mechanism negotiation is not supported") + break + } + var i uint32 + present := false + for i = 0; i < userAuthRequestGSSAPI.N; i++ { + if userAuthRequestGSSAPI.OIDS[i].Equal(krb5Mesh) { + present = true + break + } + } + if !present { + authErr = fmt.Errorf("ssh: GSSAPI authentication must use the Kerberos V5 mechanism") + break + } + // Initial server response, see RFC 4462 section 3.3. + if err := s.transport.writePacket(Marshal(&userAuthGSSAPIResponse{ + SupportMech: krb5OID, + })); err != nil { + return nil, err + } + // Exchange token, see RFC 4462 section 3.4. + packet, err := s.transport.readPacket() + if err != nil { + return nil, err + } + userAuthGSSAPITokenReq := &userAuthGSSAPIToken{} + if err := Unmarshal(packet, userAuthGSSAPITokenReq); err != nil { + return nil, err + } + authErr, perms, err = gssExchangeToken(gssapiConfig, userAuthGSSAPITokenReq.Token, s, sessionID, + userAuthReq) + if err != nil { + return nil, err + } default: authErr = fmt.Errorf("ssh: unknown method %q", userAuthReq.Method) } @@ -521,6 +640,10 @@ userAuthLoop: if config.KeyboardInteractiveCallback != nil { failureMsg.Methods = append(failureMsg.Methods, "keyboard-interactive") } + if config.GSSAPIWithMICConfig != nil && config.GSSAPIWithMICConfig.Server != nil && + config.GSSAPIWithMICConfig.AllowLogin != nil { + failureMsg.Methods = append(failureMsg.Methods, "gssapi-with-mic") + } if len(failureMsg.Methods) == 0 { return nil, errors.New("ssh: no authentication methods configured but NoClientAuth is also false") diff --git a/vendor/golang.org/x/crypto/ssh/ssh_gss.go b/vendor/golang.org/x/crypto/ssh/ssh_gss.go new file mode 100644 index 000000000..24bd7c8e8 --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/ssh_gss.go @@ -0,0 +1,139 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "encoding/asn1" + "errors" +) + +var krb5OID []byte + +func init() { + krb5OID, _ = asn1.Marshal(krb5Mesh) +} + +// GSSAPIClient provides the API to plug-in GSSAPI authentication for client logins. +type GSSAPIClient interface { + // InitSecContext initiates the establishment of a security context for GSS-API between the + // ssh client and ssh server. Initially the token parameter should be specified as nil. + // The routine may return a outputToken which should be transferred to + // the ssh server, where the ssh server will present it to + // AcceptSecContext. If no token need be sent, InitSecContext will indicate this by setting + // needContinue to false. To complete the context + // establishment, one or more reply tokens may be required from the ssh + // server;if so, InitSecContext will return a needContinue which is true. + // In this case, InitSecContext should be called again when the + // reply token is received from the ssh server, passing the reply + // token to InitSecContext via the token parameters. + // See RFC 2743 section 2.2.1 and RFC 4462 section 3.4. + InitSecContext(target string, token []byte, isGSSDelegCreds bool) (outputToken []byte, needContinue bool, err error) + // GetMIC generates a cryptographic MIC for the SSH2 message, and places + // the MIC in a token for transfer to the ssh server. + // The contents of the MIC field are obtained by calling GSS_GetMIC() + // over the following, using the GSS-API context that was just + // established: + // string session identifier + // byte SSH_MSG_USERAUTH_REQUEST + // string user name + // string service + // string "gssapi-with-mic" + // See RFC 2743 section 2.3.1 and RFC 4462 3.5. + GetMIC(micFiled []byte) ([]byte, error) + // Whenever possible, it should be possible for + // DeleteSecContext() calls to be successfully processed even + // if other calls cannot succeed, thereby enabling context-related + // resources to be released. + // In addition to deleting established security contexts, + // gss_delete_sec_context must also be able to delete "half-built" + // security contexts resulting from an incomplete sequence of + // InitSecContext()/AcceptSecContext() calls. + // See RFC 2743 section 2.2.3. + DeleteSecContext() error +} + +// GSSAPIServer provides the API to plug in GSSAPI authentication for server logins. +type GSSAPIServer interface { + // AcceptSecContext allows a remotely initiated security context between the application + // and a remote peer to be established by the ssh client. The routine may return a + // outputToken which should be transferred to the ssh client, + // where the ssh client will present it to InitSecContext. + // If no token need be sent, AcceptSecContext will indicate this + // by setting the needContinue to false. To + // complete the context establishment, one or more reply tokens may be + // required from the ssh client. if so, AcceptSecContext + // will return a needContinue which is true, in which case it + // should be called again when the reply token is received from the ssh + // client, passing the token to AcceptSecContext via the + // token parameters. + // The srcName return value is the authenticated username. + // See RFC 2743 section 2.2.2 and RFC 4462 section 3.4. + AcceptSecContext(token []byte) (outputToken []byte, srcName string, needContinue bool, err error) + // VerifyMIC verifies that a cryptographic MIC, contained in the token parameter, + // fits the supplied message is received from the ssh client. + // See RFC 2743 section 2.3.2. + VerifyMIC(micField []byte, micToken []byte) error + // Whenever possible, it should be possible for + // DeleteSecContext() calls to be successfully processed even + // if other calls cannot succeed, thereby enabling context-related + // resources to be released. + // In addition to deleting established security contexts, + // gss_delete_sec_context must also be able to delete "half-built" + // security contexts resulting from an incomplete sequence of + // InitSecContext()/AcceptSecContext() calls. + // See RFC 2743 section 2.2.3. + DeleteSecContext() error +} + +var ( + // OpenSSH supports Kerberos V5 mechanism only for GSS-API authentication, + // so we also support the krb5 mechanism only. + // See RFC 1964 section 1. + krb5Mesh = asn1.ObjectIdentifier{1, 2, 840, 113554, 1, 2, 2} +) + +// The GSS-API authentication method is initiated when the client sends an SSH_MSG_USERAUTH_REQUEST +// See RFC 4462 section 3.2. +type userAuthRequestGSSAPI struct { + N uint32 + OIDS []asn1.ObjectIdentifier +} + +func parseGSSAPIPayload(payload []byte) (*userAuthRequestGSSAPI, error) { + n, rest, ok := parseUint32(payload) + if !ok { + return nil, errors.New("parse uint32 failed") + } + s := &userAuthRequestGSSAPI{ + N: n, + OIDS: make([]asn1.ObjectIdentifier, n), + } + for i := 0; i < int(n); i++ { + var ( + desiredMech []byte + err error + ) + desiredMech, rest, ok = parseString(rest) + if !ok { + return nil, errors.New("parse string failed") + } + if rest, err = asn1.Unmarshal(desiredMech, &s.OIDS[i]); err != nil { + return nil, err + } + + } + return s, nil +} + +// See RFC 4462 section 3.6. +func buildMIC(sessionID string, username string, service string, authMethod string) []byte { + out := make([]byte, 0, 0) + out = appendString(out, sessionID) + out = append(out, msgUserAuthRequest) + out = appendString(out, username) + out = appendString(out, service) + out = appendString(out, authMethod) + return out +} diff --git a/vendor/golang.org/x/crypto/ssh/terminal/terminal.go b/vendor/golang.org/x/crypto/ssh/terminal/terminal.go deleted file mode 100644 index 9a887598f..000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/terminal.go +++ /dev/null @@ -1,951 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package terminal - -import ( - "bytes" - "io" - "sync" - "unicode/utf8" -) - -// EscapeCodes contains escape sequences that can be written to the terminal in -// order to achieve different styles of text. -type EscapeCodes struct { - // Foreground colors - Black, Red, Green, Yellow, Blue, Magenta, Cyan, White []byte - - // Reset all attributes - Reset []byte -} - -var vt100EscapeCodes = EscapeCodes{ - Black: []byte{keyEscape, '[', '3', '0', 'm'}, - Red: []byte{keyEscape, '[', '3', '1', 'm'}, - Green: []byte{keyEscape, '[', '3', '2', 'm'}, - Yellow: []byte{keyEscape, '[', '3', '3', 'm'}, - Blue: []byte{keyEscape, '[', '3', '4', 'm'}, - Magenta: []byte{keyEscape, '[', '3', '5', 'm'}, - Cyan: []byte{keyEscape, '[', '3', '6', 'm'}, - White: []byte{keyEscape, '[', '3', '7', 'm'}, - - Reset: []byte{keyEscape, '[', '0', 'm'}, -} - -// Terminal contains the state for running a VT100 terminal that is capable of -// reading lines of input. -type Terminal struct { - // AutoCompleteCallback, if non-null, is called for each keypress with - // the full input line and the current position of the cursor (in - // bytes, as an index into |line|). If it returns ok=false, the key - // press is processed normally. Otherwise it returns a replacement line - // and the new cursor position. - AutoCompleteCallback func(line string, pos int, key rune) (newLine string, newPos int, ok bool) - - // Escape contains a pointer to the escape codes for this terminal. - // It's always a valid pointer, although the escape codes themselves - // may be empty if the terminal doesn't support them. - Escape *EscapeCodes - - // lock protects the terminal and the state in this object from - // concurrent processing of a key press and a Write() call. - lock sync.Mutex - - c io.ReadWriter - prompt []rune - - // line is the current line being entered. - line []rune - // pos is the logical position of the cursor in line - pos int - // echo is true if local echo is enabled - echo bool - // pasteActive is true iff there is a bracketed paste operation in - // progress. - pasteActive bool - - // cursorX contains the current X value of the cursor where the left - // edge is 0. cursorY contains the row number where the first row of - // the current line is 0. - cursorX, cursorY int - // maxLine is the greatest value of cursorY so far. - maxLine int - - termWidth, termHeight int - - // outBuf contains the terminal data to be sent. - outBuf []byte - // remainder contains the remainder of any partial key sequences after - // a read. It aliases into inBuf. - remainder []byte - inBuf [256]byte - - // history contains previously entered commands so that they can be - // accessed with the up and down keys. - history stRingBuffer - // historyIndex stores the currently accessed history entry, where zero - // means the immediately previous entry. - historyIndex int - // When navigating up and down the history it's possible to return to - // the incomplete, initial line. That value is stored in - // historyPending. - historyPending string -} - -// NewTerminal runs a VT100 terminal on the given ReadWriter. If the ReadWriter is -// a local terminal, that terminal must first have been put into raw mode. -// prompt is a string that is written at the start of each input line (i.e. -// "> "). -func NewTerminal(c io.ReadWriter, prompt string) *Terminal { - return &Terminal{ - Escape: &vt100EscapeCodes, - c: c, - prompt: []rune(prompt), - termWidth: 80, - termHeight: 24, - echo: true, - historyIndex: -1, - } -} - -const ( - keyCtrlD = 4 - keyCtrlU = 21 - keyEnter = '\r' - keyEscape = 27 - keyBackspace = 127 - keyUnknown = 0xd800 /* UTF-16 surrogate area */ + iota - keyUp - keyDown - keyLeft - keyRight - keyAltLeft - keyAltRight - keyHome - keyEnd - keyDeleteWord - keyDeleteLine - keyClearScreen - keyPasteStart - keyPasteEnd -) - -var ( - crlf = []byte{'\r', '\n'} - pasteStart = []byte{keyEscape, '[', '2', '0', '0', '~'} - pasteEnd = []byte{keyEscape, '[', '2', '0', '1', '~'} -) - -// bytesToKey tries to parse a key sequence from b. If successful, it returns -// the key and the remainder of the input. Otherwise it returns utf8.RuneError. -func bytesToKey(b []byte, pasteActive bool) (rune, []byte) { - if len(b) == 0 { - return utf8.RuneError, nil - } - - if !pasteActive { - switch b[0] { - case 1: // ^A - return keyHome, b[1:] - case 5: // ^E - return keyEnd, b[1:] - case 8: // ^H - return keyBackspace, b[1:] - case 11: // ^K - return keyDeleteLine, b[1:] - case 12: // ^L - return keyClearScreen, b[1:] - case 23: // ^W - return keyDeleteWord, b[1:] - } - } - - if b[0] != keyEscape { - if !utf8.FullRune(b) { - return utf8.RuneError, b - } - r, l := utf8.DecodeRune(b) - return r, b[l:] - } - - if !pasteActive && len(b) >= 3 && b[0] == keyEscape && b[1] == '[' { - switch b[2] { - case 'A': - return keyUp, b[3:] - case 'B': - return keyDown, b[3:] - case 'C': - return keyRight, b[3:] - case 'D': - return keyLeft, b[3:] - case 'H': - return keyHome, b[3:] - case 'F': - return keyEnd, b[3:] - } - } - - if !pasteActive && len(b) >= 6 && b[0] == keyEscape && b[1] == '[' && b[2] == '1' && b[3] == ';' && b[4] == '3' { - switch b[5] { - case 'C': - return keyAltRight, b[6:] - case 'D': - return keyAltLeft, b[6:] - } - } - - if !pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteStart) { - return keyPasteStart, b[6:] - } - - if pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteEnd) { - return keyPasteEnd, b[6:] - } - - // If we get here then we have a key that we don't recognise, or a - // partial sequence. It's not clear how one should find the end of a - // sequence without knowing them all, but it seems that [a-zA-Z~] only - // appears at the end of a sequence. - for i, c := range b[0:] { - if c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '~' { - return keyUnknown, b[i+1:] - } - } - - return utf8.RuneError, b -} - -// queue appends data to the end of t.outBuf -func (t *Terminal) queue(data []rune) { - t.outBuf = append(t.outBuf, []byte(string(data))...) -} - -var eraseUnderCursor = []rune{' ', keyEscape, '[', 'D'} -var space = []rune{' '} - -func isPrintable(key rune) bool { - isInSurrogateArea := key >= 0xd800 && key <= 0xdbff - return key >= 32 && !isInSurrogateArea -} - -// moveCursorToPos appends data to t.outBuf which will move the cursor to the -// given, logical position in the text. -func (t *Terminal) moveCursorToPos(pos int) { - if !t.echo { - return - } - - x := visualLength(t.prompt) + pos - y := x / t.termWidth - x = x % t.termWidth - - up := 0 - if y < t.cursorY { - up = t.cursorY - y - } - - down := 0 - if y > t.cursorY { - down = y - t.cursorY - } - - left := 0 - if x < t.cursorX { - left = t.cursorX - x - } - - right := 0 - if x > t.cursorX { - right = x - t.cursorX - } - - t.cursorX = x - t.cursorY = y - t.move(up, down, left, right) -} - -func (t *Terminal) move(up, down, left, right int) { - movement := make([]rune, 3*(up+down+left+right)) - m := movement - for i := 0; i < up; i++ { - m[0] = keyEscape - m[1] = '[' - m[2] = 'A' - m = m[3:] - } - for i := 0; i < down; i++ { - m[0] = keyEscape - m[1] = '[' - m[2] = 'B' - m = m[3:] - } - for i := 0; i < left; i++ { - m[0] = keyEscape - m[1] = '[' - m[2] = 'D' - m = m[3:] - } - for i := 0; i < right; i++ { - m[0] = keyEscape - m[1] = '[' - m[2] = 'C' - m = m[3:] - } - - t.queue(movement) -} - -func (t *Terminal) clearLineToRight() { - op := []rune{keyEscape, '[', 'K'} - t.queue(op) -} - -const maxLineLength = 4096 - -func (t *Terminal) setLine(newLine []rune, newPos int) { - if t.echo { - t.moveCursorToPos(0) - t.writeLine(newLine) - for i := len(newLine); i < len(t.line); i++ { - t.writeLine(space) - } - t.moveCursorToPos(newPos) - } - t.line = newLine - t.pos = newPos -} - -func (t *Terminal) advanceCursor(places int) { - t.cursorX += places - t.cursorY += t.cursorX / t.termWidth - if t.cursorY > t.maxLine { - t.maxLine = t.cursorY - } - t.cursorX = t.cursorX % t.termWidth - - if places > 0 && t.cursorX == 0 { - // Normally terminals will advance the current position - // when writing a character. But that doesn't happen - // for the last character in a line. However, when - // writing a character (except a new line) that causes - // a line wrap, the position will be advanced two - // places. - // - // So, if we are stopping at the end of a line, we - // need to write a newline so that our cursor can be - // advanced to the next line. - t.outBuf = append(t.outBuf, '\r', '\n') - } -} - -func (t *Terminal) eraseNPreviousChars(n int) { - if n == 0 { - return - } - - if t.pos < n { - n = t.pos - } - t.pos -= n - t.moveCursorToPos(t.pos) - - copy(t.line[t.pos:], t.line[n+t.pos:]) - t.line = t.line[:len(t.line)-n] - if t.echo { - t.writeLine(t.line[t.pos:]) - for i := 0; i < n; i++ { - t.queue(space) - } - t.advanceCursor(n) - t.moveCursorToPos(t.pos) - } -} - -// countToLeftWord returns then number of characters from the cursor to the -// start of the previous word. -func (t *Terminal) countToLeftWord() int { - if t.pos == 0 { - return 0 - } - - pos := t.pos - 1 - for pos > 0 { - if t.line[pos] != ' ' { - break - } - pos-- - } - for pos > 0 { - if t.line[pos] == ' ' { - pos++ - break - } - pos-- - } - - return t.pos - pos -} - -// countToRightWord returns then number of characters from the cursor to the -// start of the next word. -func (t *Terminal) countToRightWord() int { - pos := t.pos - for pos < len(t.line) { - if t.line[pos] == ' ' { - break - } - pos++ - } - for pos < len(t.line) { - if t.line[pos] != ' ' { - break - } - pos++ - } - return pos - t.pos -} - -// visualLength returns the number of visible glyphs in s. -func visualLength(runes []rune) int { - inEscapeSeq := false - length := 0 - - for _, r := range runes { - switch { - case inEscapeSeq: - if (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') { - inEscapeSeq = false - } - case r == '\x1b': - inEscapeSeq = true - default: - length++ - } - } - - return length -} - -// handleKey processes the given key and, optionally, returns a line of text -// that the user has entered. -func (t *Terminal) handleKey(key rune) (line string, ok bool) { - if t.pasteActive && key != keyEnter { - t.addKeyToLine(key) - return - } - - switch key { - case keyBackspace: - if t.pos == 0 { - return - } - t.eraseNPreviousChars(1) - case keyAltLeft: - // move left by a word. - t.pos -= t.countToLeftWord() - t.moveCursorToPos(t.pos) - case keyAltRight: - // move right by a word. - t.pos += t.countToRightWord() - t.moveCursorToPos(t.pos) - case keyLeft: - if t.pos == 0 { - return - } - t.pos-- - t.moveCursorToPos(t.pos) - case keyRight: - if t.pos == len(t.line) { - return - } - t.pos++ - t.moveCursorToPos(t.pos) - case keyHome: - if t.pos == 0 { - return - } - t.pos = 0 - t.moveCursorToPos(t.pos) - case keyEnd: - if t.pos == len(t.line) { - return - } - t.pos = len(t.line) - t.moveCursorToPos(t.pos) - case keyUp: - entry, ok := t.history.NthPreviousEntry(t.historyIndex + 1) - if !ok { - return "", false - } - if t.historyIndex == -1 { - t.historyPending = string(t.line) - } - t.historyIndex++ - runes := []rune(entry) - t.setLine(runes, len(runes)) - case keyDown: - switch t.historyIndex { - case -1: - return - case 0: - runes := []rune(t.historyPending) - t.setLine(runes, len(runes)) - t.historyIndex-- - default: - entry, ok := t.history.NthPreviousEntry(t.historyIndex - 1) - if ok { - t.historyIndex-- - runes := []rune(entry) - t.setLine(runes, len(runes)) - } - } - case keyEnter: - t.moveCursorToPos(len(t.line)) - t.queue([]rune("\r\n")) - line = string(t.line) - ok = true - t.line = t.line[:0] - t.pos = 0 - t.cursorX = 0 - t.cursorY = 0 - t.maxLine = 0 - case keyDeleteWord: - // Delete zero or more spaces and then one or more characters. - t.eraseNPreviousChars(t.countToLeftWord()) - case keyDeleteLine: - // Delete everything from the current cursor position to the - // end of line. - for i := t.pos; i < len(t.line); i++ { - t.queue(space) - t.advanceCursor(1) - } - t.line = t.line[:t.pos] - t.moveCursorToPos(t.pos) - case keyCtrlD: - // Erase the character under the current position. - // The EOF case when the line is empty is handled in - // readLine(). - if t.pos < len(t.line) { - t.pos++ - t.eraseNPreviousChars(1) - } - case keyCtrlU: - t.eraseNPreviousChars(t.pos) - case keyClearScreen: - // Erases the screen and moves the cursor to the home position. - t.queue([]rune("\x1b[2J\x1b[H")) - t.queue(t.prompt) - t.cursorX, t.cursorY = 0, 0 - t.advanceCursor(visualLength(t.prompt)) - t.setLine(t.line, t.pos) - default: - if t.AutoCompleteCallback != nil { - prefix := string(t.line[:t.pos]) - suffix := string(t.line[t.pos:]) - - t.lock.Unlock() - newLine, newPos, completeOk := t.AutoCompleteCallback(prefix+suffix, len(prefix), key) - t.lock.Lock() - - if completeOk { - t.setLine([]rune(newLine), utf8.RuneCount([]byte(newLine)[:newPos])) - return - } - } - if !isPrintable(key) { - return - } - if len(t.line) == maxLineLength { - return - } - t.addKeyToLine(key) - } - return -} - -// addKeyToLine inserts the given key at the current position in the current -// line. -func (t *Terminal) addKeyToLine(key rune) { - if len(t.line) == cap(t.line) { - newLine := make([]rune, len(t.line), 2*(1+len(t.line))) - copy(newLine, t.line) - t.line = newLine - } - t.line = t.line[:len(t.line)+1] - copy(t.line[t.pos+1:], t.line[t.pos:]) - t.line[t.pos] = key - if t.echo { - t.writeLine(t.line[t.pos:]) - } - t.pos++ - t.moveCursorToPos(t.pos) -} - -func (t *Terminal) writeLine(line []rune) { - for len(line) != 0 { - remainingOnLine := t.termWidth - t.cursorX - todo := len(line) - if todo > remainingOnLine { - todo = remainingOnLine - } - t.queue(line[:todo]) - t.advanceCursor(visualLength(line[:todo])) - line = line[todo:] - } -} - -// writeWithCRLF writes buf to w but replaces all occurrences of \n with \r\n. -func writeWithCRLF(w io.Writer, buf []byte) (n int, err error) { - for len(buf) > 0 { - i := bytes.IndexByte(buf, '\n') - todo := len(buf) - if i >= 0 { - todo = i - } - - var nn int - nn, err = w.Write(buf[:todo]) - n += nn - if err != nil { - return n, err - } - buf = buf[todo:] - - if i >= 0 { - if _, err = w.Write(crlf); err != nil { - return n, err - } - n++ - buf = buf[1:] - } - } - - return n, nil -} - -func (t *Terminal) Write(buf []byte) (n int, err error) { - t.lock.Lock() - defer t.lock.Unlock() - - if t.cursorX == 0 && t.cursorY == 0 { - // This is the easy case: there's nothing on the screen that we - // have to move out of the way. - return writeWithCRLF(t.c, buf) - } - - // We have a prompt and possibly user input on the screen. We - // have to clear it first. - t.move(0 /* up */, 0 /* down */, t.cursorX /* left */, 0 /* right */) - t.cursorX = 0 - t.clearLineToRight() - - for t.cursorY > 0 { - t.move(1 /* up */, 0, 0, 0) - t.cursorY-- - t.clearLineToRight() - } - - if _, err = t.c.Write(t.outBuf); err != nil { - return - } - t.outBuf = t.outBuf[:0] - - if n, err = writeWithCRLF(t.c, buf); err != nil { - return - } - - t.writeLine(t.prompt) - if t.echo { - t.writeLine(t.line) - } - - t.moveCursorToPos(t.pos) - - if _, err = t.c.Write(t.outBuf); err != nil { - return - } - t.outBuf = t.outBuf[:0] - return -} - -// ReadPassword temporarily changes the prompt and reads a password, without -// echo, from the terminal. -func (t *Terminal) ReadPassword(prompt string) (line string, err error) { - t.lock.Lock() - defer t.lock.Unlock() - - oldPrompt := t.prompt - t.prompt = []rune(prompt) - t.echo = false - - line, err = t.readLine() - - t.prompt = oldPrompt - t.echo = true - - return -} - -// ReadLine returns a line of input from the terminal. -func (t *Terminal) ReadLine() (line string, err error) { - t.lock.Lock() - defer t.lock.Unlock() - - return t.readLine() -} - -func (t *Terminal) readLine() (line string, err error) { - // t.lock must be held at this point - - if t.cursorX == 0 && t.cursorY == 0 { - t.writeLine(t.prompt) - t.c.Write(t.outBuf) - t.outBuf = t.outBuf[:0] - } - - lineIsPasted := t.pasteActive - - for { - rest := t.remainder - lineOk := false - for !lineOk { - var key rune - key, rest = bytesToKey(rest, t.pasteActive) - if key == utf8.RuneError { - break - } - if !t.pasteActive { - if key == keyCtrlD { - if len(t.line) == 0 { - return "", io.EOF - } - } - if key == keyPasteStart { - t.pasteActive = true - if len(t.line) == 0 { - lineIsPasted = true - } - continue - } - } else if key == keyPasteEnd { - t.pasteActive = false - continue - } - if !t.pasteActive { - lineIsPasted = false - } - line, lineOk = t.handleKey(key) - } - if len(rest) > 0 { - n := copy(t.inBuf[:], rest) - t.remainder = t.inBuf[:n] - } else { - t.remainder = nil - } - t.c.Write(t.outBuf) - t.outBuf = t.outBuf[:0] - if lineOk { - if t.echo { - t.historyIndex = -1 - t.history.Add(line) - } - if lineIsPasted { - err = ErrPasteIndicator - } - return - } - - // t.remainder is a slice at the beginning of t.inBuf - // containing a partial key sequence - readBuf := t.inBuf[len(t.remainder):] - var n int - - t.lock.Unlock() - n, err = t.c.Read(readBuf) - t.lock.Lock() - - if err != nil { - return - } - - t.remainder = t.inBuf[:n+len(t.remainder)] - } -} - -// SetPrompt sets the prompt to be used when reading subsequent lines. -func (t *Terminal) SetPrompt(prompt string) { - t.lock.Lock() - defer t.lock.Unlock() - - t.prompt = []rune(prompt) -} - -func (t *Terminal) clearAndRepaintLinePlusNPrevious(numPrevLines int) { - // Move cursor to column zero at the start of the line. - t.move(t.cursorY, 0, t.cursorX, 0) - t.cursorX, t.cursorY = 0, 0 - t.clearLineToRight() - for t.cursorY < numPrevLines { - // Move down a line - t.move(0, 1, 0, 0) - t.cursorY++ - t.clearLineToRight() - } - // Move back to beginning. - t.move(t.cursorY, 0, 0, 0) - t.cursorX, t.cursorY = 0, 0 - - t.queue(t.prompt) - t.advanceCursor(visualLength(t.prompt)) - t.writeLine(t.line) - t.moveCursorToPos(t.pos) -} - -func (t *Terminal) SetSize(width, height int) error { - t.lock.Lock() - defer t.lock.Unlock() - - if width == 0 { - width = 1 - } - - oldWidth := t.termWidth - t.termWidth, t.termHeight = width, height - - switch { - case width == oldWidth: - // If the width didn't change then nothing else needs to be - // done. - return nil - case len(t.line) == 0 && t.cursorX == 0 && t.cursorY == 0: - // If there is nothing on current line and no prompt printed, - // just do nothing - return nil - case width < oldWidth: - // Some terminals (e.g. xterm) will truncate lines that were - // too long when shinking. Others, (e.g. gnome-terminal) will - // attempt to wrap them. For the former, repainting t.maxLine - // works great, but that behaviour goes badly wrong in the case - // of the latter because they have doubled every full line. - - // We assume that we are working on a terminal that wraps lines - // and adjust the cursor position based on every previous line - // wrapping and turning into two. This causes the prompt on - // xterms to move upwards, which isn't great, but it avoids a - // huge mess with gnome-terminal. - if t.cursorX >= t.termWidth { - t.cursorX = t.termWidth - 1 - } - t.cursorY *= 2 - t.clearAndRepaintLinePlusNPrevious(t.maxLine * 2) - case width > oldWidth: - // If the terminal expands then our position calculations will - // be wrong in the future because we think the cursor is - // |t.pos| chars into the string, but there will be a gap at - // the end of any wrapped line. - // - // But the position will actually be correct until we move, so - // we can move back to the beginning and repaint everything. - t.clearAndRepaintLinePlusNPrevious(t.maxLine) - } - - _, err := t.c.Write(t.outBuf) - t.outBuf = t.outBuf[:0] - return err -} - -type pasteIndicatorError struct{} - -func (pasteIndicatorError) Error() string { - return "terminal: ErrPasteIndicator not correctly handled" -} - -// ErrPasteIndicator may be returned from ReadLine as the error, in addition -// to valid line data. It indicates that bracketed paste mode is enabled and -// that the returned line consists only of pasted data. Programs may wish to -// interpret pasted data more literally than typed data. -var ErrPasteIndicator = pasteIndicatorError{} - -// SetBracketedPasteMode requests that the terminal bracket paste operations -// with markers. Not all terminals support this but, if it is supported, then -// enabling this mode will stop any autocomplete callback from running due to -// pastes. Additionally, any lines that are completely pasted will be returned -// from ReadLine with the error set to ErrPasteIndicator. -func (t *Terminal) SetBracketedPasteMode(on bool) { - if on { - io.WriteString(t.c, "\x1b[?2004h") - } else { - io.WriteString(t.c, "\x1b[?2004l") - } -} - -// stRingBuffer is a ring buffer of strings. -type stRingBuffer struct { - // entries contains max elements. - entries []string - max int - // head contains the index of the element most recently added to the ring. - head int - // size contains the number of elements in the ring. - size int -} - -func (s *stRingBuffer) Add(a string) { - if s.entries == nil { - const defaultNumEntries = 100 - s.entries = make([]string, defaultNumEntries) - s.max = defaultNumEntries - } - - s.head = (s.head + 1) % s.max - s.entries[s.head] = a - if s.size < s.max { - s.size++ - } -} - -// NthPreviousEntry returns the value passed to the nth previous call to Add. -// If n is zero then the immediately prior value is returned, if one, then the -// next most recent, and so on. If such an element doesn't exist then ok is -// false. -func (s *stRingBuffer) NthPreviousEntry(n int) (value string, ok bool) { - if n >= s.size { - return "", false - } - index := s.head - n - if index < 0 { - index += s.max - } - return s.entries[index], true -} - -// readPasswordLine reads from reader until it finds \n or io.EOF. -// The slice returned does not include the \n. -// readPasswordLine also ignores any \r it finds. -func readPasswordLine(reader io.Reader) ([]byte, error) { - var buf [1]byte - var ret []byte - - for { - n, err := reader.Read(buf[:]) - if n > 0 { - switch buf[0] { - case '\n': - return ret, nil - case '\r': - // remove \r from passwords on Windows - default: - ret = append(ret, buf[0]) - } - continue - } - if err != nil { - if err == io.EOF && len(ret) > 0 { - return ret, nil - } - return ret, err - } - } -} diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util.go b/vendor/golang.org/x/crypto/ssh/terminal/util.go deleted file mode 100644 index 731c89a28..000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/util.go +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd linux,!appengine netbsd openbsd - -// Package terminal provides support functions for dealing with terminals, as -// commonly found on UNIX systems. -// -// Putting a terminal into raw mode is the most common requirement: -// -// oldState, err := terminal.MakeRaw(0) -// if err != nil { -// panic(err) -// } -// defer terminal.Restore(0, oldState) -package terminal // import "golang.org/x/crypto/ssh/terminal" - -import ( - "golang.org/x/sys/unix" -) - -// State contains the state of a terminal. -type State struct { - termios unix.Termios -} - -// IsTerminal returns true if the given file descriptor is a terminal. -func IsTerminal(fd int) bool { - _, err := unix.IoctlGetTermios(fd, ioctlReadTermios) - return err == nil -} - -// MakeRaw put the terminal connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be -// restored. -func MakeRaw(fd int) (*State, error) { - termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios) - if err != nil { - return nil, err - } - - oldState := State{termios: *termios} - - // This attempts to replicate the behaviour documented for cfmakeraw in - // the termios(3) manpage. - termios.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON - termios.Oflag &^= unix.OPOST - termios.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN - termios.Cflag &^= unix.CSIZE | unix.PARENB - termios.Cflag |= unix.CS8 - termios.Cc[unix.VMIN] = 1 - termios.Cc[unix.VTIME] = 0 - if err := unix.IoctlSetTermios(fd, ioctlWriteTermios, termios); err != nil { - return nil, err - } - - return &oldState, nil -} - -// GetState returns the current state of a terminal which may be useful to -// restore the terminal after a signal. -func GetState(fd int) (*State, error) { - termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios) - if err != nil { - return nil, err - } - - return &State{termios: *termios}, nil -} - -// Restore restores the terminal connected to the given file descriptor to a -// previous state. -func Restore(fd int, state *State) error { - return unix.IoctlSetTermios(fd, ioctlWriteTermios, &state.termios) -} - -// GetSize returns the dimensions of the given terminal. -func GetSize(fd int) (width, height int, err error) { - ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ) - if err != nil { - return -1, -1, err - } - return int(ws.Col), int(ws.Row), nil -} - -// passwordReader is an io.Reader that reads from a specific file descriptor. -type passwordReader int - -func (r passwordReader) Read(buf []byte) (int, error) { - return unix.Read(int(r), buf) -} - -// ReadPassword reads a line of input from a terminal without local echo. This -// is commonly used for inputting passwords and other sensitive data. The slice -// returned does not include the \n. -func ReadPassword(fd int) ([]byte, error) { - termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios) - if err != nil { - return nil, err - } - - newState := *termios - newState.Lflag &^= unix.ECHO - newState.Lflag |= unix.ICANON | unix.ISIG - newState.Iflag |= unix.ICRNL - if err := unix.IoctlSetTermios(fd, ioctlWriteTermios, &newState); err != nil { - return nil, err - } - - defer unix.IoctlSetTermios(fd, ioctlWriteTermios, termios) - - return readPasswordLine(passwordReader(fd)) -} diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go b/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go deleted file mode 100644 index cb23a5904..000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd netbsd openbsd - -package terminal - -import "golang.org/x/sys/unix" - -const ioctlReadTermios = unix.TIOCGETA -const ioctlWriteTermios = unix.TIOCSETA diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go b/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go deleted file mode 100644 index 5fadfe8a1..000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package terminal - -import "golang.org/x/sys/unix" - -const ioctlReadTermios = unix.TCGETS -const ioctlWriteTermios = unix.TCSETS diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go b/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go deleted file mode 100644 index 799f049f0..000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package terminal provides support functions for dealing with terminals, as -// commonly found on UNIX systems. -// -// Putting a terminal into raw mode is the most common requirement: -// -// oldState, err := terminal.MakeRaw(0) -// if err != nil { -// panic(err) -// } -// defer terminal.Restore(0, oldState) -package terminal - -import ( - "fmt" - "runtime" -) - -type State struct{} - -// IsTerminal returns true if the given file descriptor is a terminal. -func IsTerminal(fd int) bool { - return false -} - -// MakeRaw put the terminal connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be -// restored. -func MakeRaw(fd int) (*State, error) { - return nil, fmt.Errorf("terminal: MakeRaw not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) -} - -// GetState returns the current state of a terminal which may be useful to -// restore the terminal after a signal. -func GetState(fd int) (*State, error) { - return nil, fmt.Errorf("terminal: GetState not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) -} - -// Restore restores the terminal connected to the given file descriptor to a -// previous state. -func Restore(fd int, state *State) error { - return fmt.Errorf("terminal: Restore not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) -} - -// GetSize returns the dimensions of the given terminal. -func GetSize(fd int) (width, height int, err error) { - return 0, 0, fmt.Errorf("terminal: GetSize not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) -} - -// ReadPassword reads a line of input from a terminal without local echo. This -// is commonly used for inputting passwords and other sensitive data. The slice -// returned does not include the \n. -func ReadPassword(fd int) ([]byte, error) { - return nil, fmt.Errorf("terminal: ReadPassword not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) -} diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go b/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go deleted file mode 100644 index 9e41b9f43..000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build solaris - -package terminal // import "golang.org/x/crypto/ssh/terminal" - -import ( - "golang.org/x/sys/unix" - "io" - "syscall" -) - -// State contains the state of a terminal. -type State struct { - termios unix.Termios -} - -// IsTerminal returns true if the given file descriptor is a terminal. -func IsTerminal(fd int) bool { - _, err := unix.IoctlGetTermio(fd, unix.TCGETA) - return err == nil -} - -// ReadPassword reads a line of input from a terminal without local echo. This -// is commonly used for inputting passwords and other sensitive data. The slice -// returned does not include the \n. -func ReadPassword(fd int) ([]byte, error) { - // see also: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libast/common/uwin/getpass.c - val, err := unix.IoctlGetTermios(fd, unix.TCGETS) - if err != nil { - return nil, err - } - oldState := *val - - newState := oldState - newState.Lflag &^= syscall.ECHO - newState.Lflag |= syscall.ICANON | syscall.ISIG - newState.Iflag |= syscall.ICRNL - err = unix.IoctlSetTermios(fd, unix.TCSETS, &newState) - if err != nil { - return nil, err - } - - defer unix.IoctlSetTermios(fd, unix.TCSETS, &oldState) - - var buf [16]byte - var ret []byte - for { - n, err := syscall.Read(fd, buf[:]) - if err != nil { - return nil, err - } - if n == 0 { - if len(ret) == 0 { - return nil, io.EOF - } - break - } - if buf[n-1] == '\n' { - n-- - } - ret = append(ret, buf[:n]...) - if n < len(buf) { - break - } - } - - return ret, nil -} - -// MakeRaw puts the terminal connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be -// restored. -// see http://cr.illumos.org/~webrev/andy_js/1060/ -func MakeRaw(fd int) (*State, error) { - termios, err := unix.IoctlGetTermios(fd, unix.TCGETS) - if err != nil { - return nil, err - } - - oldState := State{termios: *termios} - - termios.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON - termios.Oflag &^= unix.OPOST - termios.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN - termios.Cflag &^= unix.CSIZE | unix.PARENB - termios.Cflag |= unix.CS8 - termios.Cc[unix.VMIN] = 1 - termios.Cc[unix.VTIME] = 0 - - if err := unix.IoctlSetTermios(fd, unix.TCSETS, termios); err != nil { - return nil, err - } - - return &oldState, nil -} - -// Restore restores the terminal connected to the given file descriptor to a -// previous state. -func Restore(fd int, oldState *State) error { - return unix.IoctlSetTermios(fd, unix.TCSETS, &oldState.termios) -} - -// GetState returns the current state of a terminal which may be useful to -// restore the terminal after a signal. -func GetState(fd int) (*State, error) { - termios, err := unix.IoctlGetTermios(fd, unix.TCGETS) - if err != nil { - return nil, err - } - - return &State{termios: *termios}, nil -} - -// GetSize returns the dimensions of the given terminal. -func GetSize(fd int) (width, height int, err error) { - ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ) - if err != nil { - return 0, 0, err - } - return int(ws.Col), int(ws.Row), nil -} diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go b/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go deleted file mode 100644 index 8618955df..000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -// Package terminal provides support functions for dealing with terminals, as -// commonly found on UNIX systems. -// -// Putting a terminal into raw mode is the most common requirement: -// -// oldState, err := terminal.MakeRaw(0) -// if err != nil { -// panic(err) -// } -// defer terminal.Restore(0, oldState) -package terminal - -import ( - "os" - - "golang.org/x/sys/windows" -) - -type State struct { - mode uint32 -} - -// IsTerminal returns true if the given file descriptor is a terminal. -func IsTerminal(fd int) bool { - var st uint32 - err := windows.GetConsoleMode(windows.Handle(fd), &st) - return err == nil -} - -// MakeRaw put the terminal connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be -// restored. -func MakeRaw(fd int) (*State, error) { - var st uint32 - if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil { - return nil, err - } - raw := st &^ (windows.ENABLE_ECHO_INPUT | windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT | windows.ENABLE_PROCESSED_OUTPUT) - if err := windows.SetConsoleMode(windows.Handle(fd), raw); err != nil { - return nil, err - } - return &State{st}, nil -} - -// GetState returns the current state of a terminal which may be useful to -// restore the terminal after a signal. -func GetState(fd int) (*State, error) { - var st uint32 - if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil { - return nil, err - } - return &State{st}, nil -} - -// Restore restores the terminal connected to the given file descriptor to a -// previous state. -func Restore(fd int, state *State) error { - return windows.SetConsoleMode(windows.Handle(fd), state.mode) -} - -// GetSize returns the dimensions of the given terminal. -func GetSize(fd int) (width, height int, err error) { - var info windows.ConsoleScreenBufferInfo - if err := windows.GetConsoleScreenBufferInfo(windows.Handle(fd), &info); err != nil { - return 0, 0, err - } - return int(info.Size.X), int(info.Size.Y), nil -} - -// ReadPassword reads a line of input from a terminal without local echo. This -// is commonly used for inputting passwords and other sensitive data. The slice -// returned does not include the \n. -func ReadPassword(fd int) ([]byte, error) { - var st uint32 - if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil { - return nil, err - } - old := st - - st &^= (windows.ENABLE_ECHO_INPUT) - st |= (windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT | windows.ENABLE_PROCESSED_OUTPUT) - if err := windows.SetConsoleMode(windows.Handle(fd), st); err != nil { - return nil, err - } - - defer windows.SetConsoleMode(windows.Handle(fd), old) - - var h windows.Handle - p, _ := windows.GetCurrentProcess() - if err := windows.DuplicateHandle(p, windows.Handle(fd), p, &h, 0, false, windows.DUPLICATE_SAME_ACCESS); err != nil { - return nil, err - } - - f := os.NewFile(uintptr(h), "stdin") - defer f.Close() - return readPasswordLine(f) -} diff --git a/vendor/golang.org/x/crypto/ssh/transport.go b/vendor/golang.org/x/crypto/ssh/transport.go index f6fae1db4..49ddc2e7d 100644 --- a/vendor/golang.org/x/crypto/ssh/transport.go +++ b/vendor/golang.org/x/crypto/ssh/transport.go @@ -53,14 +53,14 @@ type transport struct { // packetCipher represents a combination of SSH encryption/MAC // protocol. A single instance should be used for one direction only. type packetCipher interface { - // writePacket encrypts the packet and writes it to w. The + // writeCipherPacket encrypts the packet and writes it to w. The // contents of the packet are generally scrambled. - writePacket(seqnum uint32, w io.Writer, rand io.Reader, packet []byte) error + writeCipherPacket(seqnum uint32, w io.Writer, rand io.Reader, packet []byte) error - // readPacket reads and decrypts a packet of data. The + // readCipherPacket reads and decrypts a packet of data. The // returned packet may be overwritten by future calls of // readPacket. - readPacket(seqnum uint32, r io.Reader) ([]byte, error) + readCipherPacket(seqnum uint32, r io.Reader) ([]byte, error) } // connectionState represents one side (read or write) of the @@ -127,7 +127,7 @@ func (t *transport) readPacket() (p []byte, err error) { } func (s *connectionState) readPacket(r *bufio.Reader) ([]byte, error) { - packet, err := s.packetCipher.readPacket(s.seqNum, r) + packet, err := s.packetCipher.readCipherPacket(s.seqNum, r) s.seqNum++ if err == nil && len(packet) == 0 { err = errors.New("ssh: zero length packet") @@ -175,7 +175,7 @@ func (t *transport) writePacket(packet []byte) error { func (s *connectionState) writePacket(w *bufio.Writer, rand io.Reader, packet []byte) error { changeKeys := len(packet) > 0 && packet[0] == msgNewKeys - err := s.packetCipher.writePacket(s.seqNum, w, rand, packet) + err := s.packetCipher.writeCipherPacket(s.seqNum, w, rand, packet) if err != nil { return err } diff --git a/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go b/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go index 606cf1f97..37dc0cfdb 100644 --- a/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go +++ b/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go @@ -2,18 +2,15 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build go1.7 - // Package ctxhttp provides helper functions for performing context-aware HTTP requests. package ctxhttp // import "golang.org/x/net/context/ctxhttp" import ( + "context" "io" "net/http" "net/url" "strings" - - "golang.org/x/net/context" ) // Do sends an HTTP request with the provided http.Client and returns diff --git a/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17.go b/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17.go deleted file mode 100644 index 926870cc2..000000000 --- a/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17.go +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !go1.7 - -package ctxhttp // import "golang.org/x/net/context/ctxhttp" - -import ( - "io" - "net/http" - "net/url" - "strings" - - "golang.org/x/net/context" -) - -func nop() {} - -var ( - testHookContextDoneBeforeHeaders = nop - testHookDoReturned = nop - testHookDidBodyClose = nop -) - -// Do sends an HTTP request with the provided http.Client and returns an HTTP response. -// If the client is nil, http.DefaultClient is used. -// If the context is canceled or times out, ctx.Err() will be returned. -func Do(ctx context.Context, client *http.Client, req *http.Request) (*http.Response, error) { - if client == nil { - client = http.DefaultClient - } - - // TODO(djd): Respect any existing value of req.Cancel. - cancel := make(chan struct{}) - req.Cancel = cancel - - type responseAndError struct { - resp *http.Response - err error - } - result := make(chan responseAndError, 1) - - // Make local copies of test hooks closed over by goroutines below. - // Prevents data races in tests. - testHookDoReturned := testHookDoReturned - testHookDidBodyClose := testHookDidBodyClose - - go func() { - resp, err := client.Do(req) - testHookDoReturned() - result <- responseAndError{resp, err} - }() - - var resp *http.Response - - select { - case <-ctx.Done(): - testHookContextDoneBeforeHeaders() - close(cancel) - // Clean up after the goroutine calling client.Do: - go func() { - if r := <-result; r.resp != nil { - testHookDidBodyClose() - r.resp.Body.Close() - } - }() - return nil, ctx.Err() - case r := <-result: - var err error - resp, err = r.resp, r.err - if err != nil { - return resp, err - } - } - - c := make(chan struct{}) - go func() { - select { - case <-ctx.Done(): - close(cancel) - case <-c: - // The response's Body is closed. - } - }() - resp.Body = ¬ifyingReader{resp.Body, c} - - return resp, nil -} - -// Get issues a GET request via the Do function. -func Get(ctx context.Context, client *http.Client, url string) (*http.Response, error) { - req, err := http.NewRequest("GET", url, nil) - if err != nil { - return nil, err - } - return Do(ctx, client, req) -} - -// Head issues a HEAD request via the Do function. -func Head(ctx context.Context, client *http.Client, url string) (*http.Response, error) { - req, err := http.NewRequest("HEAD", url, nil) - if err != nil { - return nil, err - } - return Do(ctx, client, req) -} - -// Post issues a POST request via the Do function. -func Post(ctx context.Context, client *http.Client, url string, bodyType string, body io.Reader) (*http.Response, error) { - req, err := http.NewRequest("POST", url, body) - if err != nil { - return nil, err - } - req.Header.Set("Content-Type", bodyType) - return Do(ctx, client, req) -} - -// PostForm issues a POST request via the Do function. -func PostForm(ctx context.Context, client *http.Client, url string, data url.Values) (*http.Response, error) { - return Post(ctx, client, url, "application/x-www-form-urlencoded", strings.NewReader(data.Encode())) -} - -// notifyingReader is an io.ReadCloser that closes the notify channel after -// Close is called or a Read fails on the underlying ReadCloser. -type notifyingReader struct { - io.ReadCloser - notify chan<- struct{} -} - -func (r *notifyingReader) Read(p []byte) (int, error) { - n, err := r.ReadCloser.Read(p) - if err != nil && r.notify != nil { - close(r.notify) - r.notify = nil - } - return n, err -} - -func (r *notifyingReader) Close() error { - err := r.ReadCloser.Close() - if r.notify != nil { - close(r.notify) - r.notify = nil - } - return err -} diff --git a/vendor/golang.org/x/net/html/atom/gen.go b/vendor/golang.org/x/net/html/atom/gen.go deleted file mode 100644 index 5d052781b..000000000 --- a/vendor/golang.org/x/net/html/atom/gen.go +++ /dev/null @@ -1,712 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -//go:generate go run gen.go -//go:generate go run gen.go -test - -package main - -import ( - "bytes" - "flag" - "fmt" - "go/format" - "io/ioutil" - "math/rand" - "os" - "sort" - "strings" -) - -// identifier converts s to a Go exported identifier. -// It converts "div" to "Div" and "accept-charset" to "AcceptCharset". -func identifier(s string) string { - b := make([]byte, 0, len(s)) - cap := true - for _, c := range s { - if c == '-' { - cap = true - continue - } - if cap && 'a' <= c && c <= 'z' { - c -= 'a' - 'A' - } - cap = false - b = append(b, byte(c)) - } - return string(b) -} - -var test = flag.Bool("test", false, "generate table_test.go") - -func genFile(name string, buf *bytes.Buffer) { - b, err := format.Source(buf.Bytes()) - if err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - if err := ioutil.WriteFile(name, b, 0644); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } -} - -func main() { - flag.Parse() - - var all []string - all = append(all, elements...) - all = append(all, attributes...) - all = append(all, eventHandlers...) - all = append(all, extra...) - sort.Strings(all) - - // uniq - lists have dups - w := 0 - for _, s := range all { - if w == 0 || all[w-1] != s { - all[w] = s - w++ - } - } - all = all[:w] - - if *test { - var buf bytes.Buffer - fmt.Fprintln(&buf, "// Code generated by go generate gen.go; DO NOT EDIT.\n") - fmt.Fprintln(&buf, "//go:generate go run gen.go -test\n") - fmt.Fprintln(&buf, "package atom\n") - fmt.Fprintln(&buf, "var testAtomList = []string{") - for _, s := range all { - fmt.Fprintf(&buf, "\t%q,\n", s) - } - fmt.Fprintln(&buf, "}") - - genFile("table_test.go", &buf) - return - } - - // Find hash that minimizes table size. - var best *table - for i := 0; i < 1000000; i++ { - if best != nil && 1<<(best.k-1) < len(all) { - break - } - h := rand.Uint32() - for k := uint(0); k <= 16; k++ { - if best != nil && k >= best.k { - break - } - var t table - if t.init(h, k, all) { - best = &t - break - } - } - } - if best == nil { - fmt.Fprintf(os.Stderr, "failed to construct string table\n") - os.Exit(1) - } - - // Lay out strings, using overlaps when possible. - layout := append([]string{}, all...) - - // Remove strings that are substrings of other strings - for changed := true; changed; { - changed = false - for i, s := range layout { - if s == "" { - continue - } - for j, t := range layout { - if i != j && t != "" && strings.Contains(s, t) { - changed = true - layout[j] = "" - } - } - } - } - - // Join strings where one suffix matches another prefix. - for { - // Find best i, j, k such that layout[i][len-k:] == layout[j][:k], - // maximizing overlap length k. - besti := -1 - bestj := -1 - bestk := 0 - for i, s := range layout { - if s == "" { - continue - } - for j, t := range layout { - if i == j { - continue - } - for k := bestk + 1; k <= len(s) && k <= len(t); k++ { - if s[len(s)-k:] == t[:k] { - besti = i - bestj = j - bestk = k - } - } - } - } - if bestk > 0 { - layout[besti] += layout[bestj][bestk:] - layout[bestj] = "" - continue - } - break - } - - text := strings.Join(layout, "") - - atom := map[string]uint32{} - for _, s := range all { - off := strings.Index(text, s) - if off < 0 { - panic("lost string " + s) - } - atom[s] = uint32(off<<8 | len(s)) - } - - var buf bytes.Buffer - // Generate the Go code. - fmt.Fprintln(&buf, "// Code generated by go generate gen.go; DO NOT EDIT.\n") - fmt.Fprintln(&buf, "//go:generate go run gen.go\n") - fmt.Fprintln(&buf, "package atom\n\nconst (") - - // compute max len - maxLen := 0 - for _, s := range all { - if maxLen < len(s) { - maxLen = len(s) - } - fmt.Fprintf(&buf, "\t%s Atom = %#x\n", identifier(s), atom[s]) - } - fmt.Fprintln(&buf, ")\n") - - fmt.Fprintf(&buf, "const hash0 = %#x\n\n", best.h0) - fmt.Fprintf(&buf, "const maxAtomLen = %d\n\n", maxLen) - - fmt.Fprintf(&buf, "var table = [1<<%d]Atom{\n", best.k) - for i, s := range best.tab { - if s == "" { - continue - } - fmt.Fprintf(&buf, "\t%#x: %#x, // %s\n", i, atom[s], s) - } - fmt.Fprintf(&buf, "}\n") - datasize := (1 << best.k) * 4 - - fmt.Fprintln(&buf, "const atomText =") - textsize := len(text) - for len(text) > 60 { - fmt.Fprintf(&buf, "\t%q +\n", text[:60]) - text = text[60:] - } - fmt.Fprintf(&buf, "\t%q\n\n", text) - - genFile("table.go", &buf) - - fmt.Fprintf(os.Stdout, "%d atoms; %d string bytes + %d tables = %d total data\n", len(all), textsize, datasize, textsize+datasize) -} - -type byLen []string - -func (x byLen) Less(i, j int) bool { return len(x[i]) > len(x[j]) } -func (x byLen) Swap(i, j int) { x[i], x[j] = x[j], x[i] } -func (x byLen) Len() int { return len(x) } - -// fnv computes the FNV hash with an arbitrary starting value h. -func fnv(h uint32, s string) uint32 { - for i := 0; i < len(s); i++ { - h ^= uint32(s[i]) - h *= 16777619 - } - return h -} - -// A table represents an attempt at constructing the lookup table. -// The lookup table uses cuckoo hashing, meaning that each string -// can be found in one of two positions. -type table struct { - h0 uint32 - k uint - mask uint32 - tab []string -} - -// hash returns the two hashes for s. -func (t *table) hash(s string) (h1, h2 uint32) { - h := fnv(t.h0, s) - h1 = h & t.mask - h2 = (h >> 16) & t.mask - return -} - -// init initializes the table with the given parameters. -// h0 is the initial hash value, -// k is the number of bits of hash value to use, and -// x is the list of strings to store in the table. -// init returns false if the table cannot be constructed. -func (t *table) init(h0 uint32, k uint, x []string) bool { - t.h0 = h0 - t.k = k - t.tab = make([]string, 1< len(t.tab) { - return false - } - s := t.tab[i] - h1, h2 := t.hash(s) - j := h1 + h2 - i - if t.tab[j] != "" && !t.push(j, depth+1) { - return false - } - t.tab[j] = s - return true -} - -// The lists of element names and attribute keys were taken from -// https://html.spec.whatwg.org/multipage/indices.html#index -// as of the "HTML Living Standard - Last Updated 16 April 2018" version. - -// "command", "keygen" and "menuitem" have been removed from the spec, -// but are kept here for backwards compatibility. -var elements = []string{ - "a", - "abbr", - "address", - "area", - "article", - "aside", - "audio", - "b", - "base", - "bdi", - "bdo", - "blockquote", - "body", - "br", - "button", - "canvas", - "caption", - "cite", - "code", - "col", - "colgroup", - "command", - "data", - "datalist", - "dd", - "del", - "details", - "dfn", - "dialog", - "div", - "dl", - "dt", - "em", - "embed", - "fieldset", - "figcaption", - "figure", - "footer", - "form", - "h1", - "h2", - "h3", - "h4", - "h5", - "h6", - "head", - "header", - "hgroup", - "hr", - "html", - "i", - "iframe", - "img", - "input", - "ins", - "kbd", - "keygen", - "label", - "legend", - "li", - "link", - "main", - "map", - "mark", - "menu", - "menuitem", - "meta", - "meter", - "nav", - "noscript", - "object", - "ol", - "optgroup", - "option", - "output", - "p", - "param", - "picture", - "pre", - "progress", - "q", - "rp", - "rt", - "ruby", - "s", - "samp", - "script", - "section", - "select", - "slot", - "small", - "source", - "span", - "strong", - "style", - "sub", - "summary", - "sup", - "table", - "tbody", - "td", - "template", - "textarea", - "tfoot", - "th", - "thead", - "time", - "title", - "tr", - "track", - "u", - "ul", - "var", - "video", - "wbr", -} - -// https://html.spec.whatwg.org/multipage/indices.html#attributes-3 -// -// "challenge", "command", "contextmenu", "dropzone", "icon", "keytype", "mediagroup", -// "radiogroup", "spellcheck", "scoped", "seamless", "sortable" and "sorted" have been removed from the spec, -// but are kept here for backwards compatibility. -var attributes = []string{ - "abbr", - "accept", - "accept-charset", - "accesskey", - "action", - "allowfullscreen", - "allowpaymentrequest", - "allowusermedia", - "alt", - "as", - "async", - "autocomplete", - "autofocus", - "autoplay", - "challenge", - "charset", - "checked", - "cite", - "class", - "color", - "cols", - "colspan", - "command", - "content", - "contenteditable", - "contextmenu", - "controls", - "coords", - "crossorigin", - "data", - "datetime", - "default", - "defer", - "dir", - "dirname", - "disabled", - "download", - "draggable", - "dropzone", - "enctype", - "for", - "form", - "formaction", - "formenctype", - "formmethod", - "formnovalidate", - "formtarget", - "headers", - "height", - "hidden", - "high", - "href", - "hreflang", - "http-equiv", - "icon", - "id", - "inputmode", - "integrity", - "is", - "ismap", - "itemid", - "itemprop", - "itemref", - "itemscope", - "itemtype", - "keytype", - "kind", - "label", - "lang", - "list", - "loop", - "low", - "manifest", - "max", - "maxlength", - "media", - "mediagroup", - "method", - "min", - "minlength", - "multiple", - "muted", - "name", - "nomodule", - "nonce", - "novalidate", - "open", - "optimum", - "pattern", - "ping", - "placeholder", - "playsinline", - "poster", - "preload", - "radiogroup", - "readonly", - "referrerpolicy", - "rel", - "required", - "reversed", - "rows", - "rowspan", - "sandbox", - "spellcheck", - "scope", - "scoped", - "seamless", - "selected", - "shape", - "size", - "sizes", - "sortable", - "sorted", - "slot", - "span", - "spellcheck", - "src", - "srcdoc", - "srclang", - "srcset", - "start", - "step", - "style", - "tabindex", - "target", - "title", - "translate", - "type", - "typemustmatch", - "updateviacache", - "usemap", - "value", - "width", - "workertype", - "wrap", -} - -// "onautocomplete", "onautocompleteerror", "onmousewheel", -// "onshow" and "onsort" have been removed from the spec, -// but are kept here for backwards compatibility. -var eventHandlers = []string{ - "onabort", - "onautocomplete", - "onautocompleteerror", - "onauxclick", - "onafterprint", - "onbeforeprint", - "onbeforeunload", - "onblur", - "oncancel", - "oncanplay", - "oncanplaythrough", - "onchange", - "onclick", - "onclose", - "oncontextmenu", - "oncopy", - "oncuechange", - "oncut", - "ondblclick", - "ondrag", - "ondragend", - "ondragenter", - "ondragexit", - "ondragleave", - "ondragover", - "ondragstart", - "ondrop", - "ondurationchange", - "onemptied", - "onended", - "onerror", - "onfocus", - "onhashchange", - "oninput", - "oninvalid", - "onkeydown", - "onkeypress", - "onkeyup", - "onlanguagechange", - "onload", - "onloadeddata", - "onloadedmetadata", - "onloadend", - "onloadstart", - "onmessage", - "onmessageerror", - "onmousedown", - "onmouseenter", - "onmouseleave", - "onmousemove", - "onmouseout", - "onmouseover", - "onmouseup", - "onmousewheel", - "onwheel", - "onoffline", - "ononline", - "onpagehide", - "onpageshow", - "onpaste", - "onpause", - "onplay", - "onplaying", - "onpopstate", - "onprogress", - "onratechange", - "onreset", - "onresize", - "onrejectionhandled", - "onscroll", - "onsecuritypolicyviolation", - "onseeked", - "onseeking", - "onselect", - "onshow", - "onsort", - "onstalled", - "onstorage", - "onsubmit", - "onsuspend", - "ontimeupdate", - "ontoggle", - "onunhandledrejection", - "onunload", - "onvolumechange", - "onwaiting", -} - -// extra are ad-hoc values not covered by any of the lists above. -var extra = []string{ - "acronym", - "align", - "annotation", - "annotation-xml", - "applet", - "basefont", - "bgsound", - "big", - "blink", - "center", - "color", - "desc", - "face", - "font", - "foreignObject", // HTML is case-insensitive, but SVG-embedded-in-HTML is case-sensitive. - "foreignobject", - "frame", - "frameset", - "image", - "isindex", - "listing", - "malignmark", - "marquee", - "math", - "mglyph", - "mi", - "mn", - "mo", - "ms", - "mtext", - "nobr", - "noembed", - "noframes", - "plaintext", - "prompt", - "public", - "rb", - "rtc", - "spacer", - "strike", - "svg", - "system", - "tt", - "xmp", -} diff --git a/vendor/golang.org/x/net/html/charset/charset.go b/vendor/golang.org/x/net/html/charset/charset.go deleted file mode 100644 index 13bed1599..000000000 --- a/vendor/golang.org/x/net/html/charset/charset.go +++ /dev/null @@ -1,257 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package charset provides common text encodings for HTML documents. -// -// The mapping from encoding labels to encodings is defined at -// https://encoding.spec.whatwg.org/. -package charset // import "golang.org/x/net/html/charset" - -import ( - "bytes" - "fmt" - "io" - "mime" - "strings" - "unicode/utf8" - - "golang.org/x/net/html" - "golang.org/x/text/encoding" - "golang.org/x/text/encoding/charmap" - "golang.org/x/text/encoding/htmlindex" - "golang.org/x/text/transform" -) - -// Lookup returns the encoding with the specified label, and its canonical -// name. It returns nil and the empty string if label is not one of the -// standard encodings for HTML. Matching is case-insensitive and ignores -// leading and trailing whitespace. Encoders will use HTML escape sequences for -// runes that are not supported by the character set. -func Lookup(label string) (e encoding.Encoding, name string) { - e, err := htmlindex.Get(label) - if err != nil { - return nil, "" - } - name, _ = htmlindex.Name(e) - return &htmlEncoding{e}, name -} - -type htmlEncoding struct{ encoding.Encoding } - -func (h *htmlEncoding) NewEncoder() *encoding.Encoder { - // HTML requires a non-terminating legacy encoder. We use HTML escapes to - // substitute unsupported code points. - return encoding.HTMLEscapeUnsupported(h.Encoding.NewEncoder()) -} - -// DetermineEncoding determines the encoding of an HTML document by examining -// up to the first 1024 bytes of content and the declared Content-Type. -// -// See http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#determining-the-character-encoding -func DetermineEncoding(content []byte, contentType string) (e encoding.Encoding, name string, certain bool) { - if len(content) > 1024 { - content = content[:1024] - } - - for _, b := range boms { - if bytes.HasPrefix(content, b.bom) { - e, name = Lookup(b.enc) - return e, name, true - } - } - - if _, params, err := mime.ParseMediaType(contentType); err == nil { - if cs, ok := params["charset"]; ok { - if e, name = Lookup(cs); e != nil { - return e, name, true - } - } - } - - if len(content) > 0 { - e, name = prescan(content) - if e != nil { - return e, name, false - } - } - - // Try to detect UTF-8. - // First eliminate any partial rune at the end. - for i := len(content) - 1; i >= 0 && i > len(content)-4; i-- { - b := content[i] - if b < 0x80 { - break - } - if utf8.RuneStart(b) { - content = content[:i] - break - } - } - hasHighBit := false - for _, c := range content { - if c >= 0x80 { - hasHighBit = true - break - } - } - if hasHighBit && utf8.Valid(content) { - return encoding.Nop, "utf-8", false - } - - // TODO: change default depending on user's locale? - return charmap.Windows1252, "windows-1252", false -} - -// NewReader returns an io.Reader that converts the content of r to UTF-8. -// It calls DetermineEncoding to find out what r's encoding is. -func NewReader(r io.Reader, contentType string) (io.Reader, error) { - preview := make([]byte, 1024) - n, err := io.ReadFull(r, preview) - switch { - case err == io.ErrUnexpectedEOF: - preview = preview[:n] - r = bytes.NewReader(preview) - case err != nil: - return nil, err - default: - r = io.MultiReader(bytes.NewReader(preview), r) - } - - if e, _, _ := DetermineEncoding(preview, contentType); e != encoding.Nop { - r = transform.NewReader(r, e.NewDecoder()) - } - return r, nil -} - -// NewReaderLabel returns a reader that converts from the specified charset to -// UTF-8. It uses Lookup to find the encoding that corresponds to label, and -// returns an error if Lookup returns nil. It is suitable for use as -// encoding/xml.Decoder's CharsetReader function. -func NewReaderLabel(label string, input io.Reader) (io.Reader, error) { - e, _ := Lookup(label) - if e == nil { - return nil, fmt.Errorf("unsupported charset: %q", label) - } - return transform.NewReader(input, e.NewDecoder()), nil -} - -func prescan(content []byte) (e encoding.Encoding, name string) { - z := html.NewTokenizer(bytes.NewReader(content)) - for { - switch z.Next() { - case html.ErrorToken: - return nil, "" - - case html.StartTagToken, html.SelfClosingTagToken: - tagName, hasAttr := z.TagName() - if !bytes.Equal(tagName, []byte("meta")) { - continue - } - attrList := make(map[string]bool) - gotPragma := false - - const ( - dontKnow = iota - doNeedPragma - doNotNeedPragma - ) - needPragma := dontKnow - - name = "" - e = nil - for hasAttr { - var key, val []byte - key, val, hasAttr = z.TagAttr() - ks := string(key) - if attrList[ks] { - continue - } - attrList[ks] = true - for i, c := range val { - if 'A' <= c && c <= 'Z' { - val[i] = c + 0x20 - } - } - - switch ks { - case "http-equiv": - if bytes.Equal(val, []byte("content-type")) { - gotPragma = true - } - - case "content": - if e == nil { - name = fromMetaElement(string(val)) - if name != "" { - e, name = Lookup(name) - if e != nil { - needPragma = doNeedPragma - } - } - } - - case "charset": - e, name = Lookup(string(val)) - needPragma = doNotNeedPragma - } - } - - if needPragma == dontKnow || needPragma == doNeedPragma && !gotPragma { - continue - } - - if strings.HasPrefix(name, "utf-16") { - name = "utf-8" - e = encoding.Nop - } - - if e != nil { - return e, name - } - } - } -} - -func fromMetaElement(s string) string { - for s != "" { - csLoc := strings.Index(s, "charset") - if csLoc == -1 { - return "" - } - s = s[csLoc+len("charset"):] - s = strings.TrimLeft(s, " \t\n\f\r") - if !strings.HasPrefix(s, "=") { - continue - } - s = s[1:] - s = strings.TrimLeft(s, " \t\n\f\r") - if s == "" { - return "" - } - if q := s[0]; q == '"' || q == '\'' { - s = s[1:] - closeQuote := strings.IndexRune(s, rune(q)) - if closeQuote == -1 { - return "" - } - return s[:closeQuote] - } - - end := strings.IndexAny(s, "; \t\n\f\r") - if end == -1 { - end = len(s) - } - return s[:end] - } - return "" -} - -var boms = []struct { - bom []byte - enc string -}{ - {[]byte{0xfe, 0xff}, "utf-16be"}, - {[]byte{0xff, 0xfe}, "utf-16le"}, - {[]byte{0xef, 0xbb, 0xbf}, "utf-8"}, -} diff --git a/vendor/golang.org/x/net/html/const.go b/vendor/golang.org/x/net/html/const.go index 5eb7c5a8f..73804d347 100644 --- a/vendor/golang.org/x/net/html/const.go +++ b/vendor/golang.org/x/net/html/const.go @@ -52,7 +52,6 @@ var isSpecialElementMap = map[string]bool{ "iframe": true, "img": true, "input": true, - "isindex": true, // The 'isindex' element has been removed, but keep it for backwards compatibility. "keygen": true, "li": true, "link": true, @@ -97,8 +96,16 @@ func isSpecialElement(element *Node) bool { switch element.Namespace { case "", "html": return isSpecialElementMap[element.Data] + case "math": + switch element.Data { + case "mi", "mo", "mn", "ms", "mtext", "annotation-xml": + return true + } case "svg": - return element.Data == "foreignObject" + switch element.Data { + case "foreignObject", "desc", "title": + return true + } } return false } diff --git a/vendor/golang.org/x/net/html/foreign.go b/vendor/golang.org/x/net/html/foreign.go index 01477a963..74774c458 100644 --- a/vendor/golang.org/x/net/html/foreign.go +++ b/vendor/golang.org/x/net/html/foreign.go @@ -172,7 +172,6 @@ var svgAttributeAdjustments = map[string]string{ "diffuseconstant": "diffuseConstant", "edgemode": "edgeMode", "externalresourcesrequired": "externalResourcesRequired", - "filterres": "filterRes", "filterunits": "filterUnits", "glyphref": "glyphRef", "gradienttransform": "gradientTransform", diff --git a/vendor/golang.org/x/net/html/node.go b/vendor/golang.org/x/net/html/node.go index 2c1cade60..1350eef22 100644 --- a/vendor/golang.org/x/net/html/node.go +++ b/vendor/golang.org/x/net/html/node.go @@ -18,6 +18,11 @@ const ( ElementNode CommentNode DoctypeNode + // RawNode nodes are not returned by the parser, but can be part of the + // Node tree passed to func Render to insert raw HTML (without escaping). + // If so, this package makes no guarantee that the rendered HTML is secure + // (from e.g. Cross Site Scripting attacks) or well-formed. + RawNode scopeMarkerNode ) @@ -177,7 +182,7 @@ func (s *nodeStack) index(n *Node) int { // contains returns whether a is within s. func (s *nodeStack) contains(a atom.Atom) bool { for _, n := range *s { - if n.DataAtom == a { + if n.DataAtom == a && n.Namespace == "" { return true } } diff --git a/vendor/golang.org/x/net/html/parse.go b/vendor/golang.org/x/net/html/parse.go index d23e05e06..2cd12fc81 100644 --- a/vendor/golang.org/x/net/html/parse.go +++ b/vendor/golang.org/x/net/html/parse.go @@ -184,6 +184,17 @@ func (p *parser) clearStackToContext(s scope) { } } +// parseGenericRawTextElements implements the generic raw text element parsing +// algorithm defined in 12.2.6.2. +// https://html.spec.whatwg.org/multipage/parsing.html#parsing-elements-that-contain-only-text +// TODO: Since both RAWTEXT and RCDATA states are treated as tokenizer's part +// officially, need to make tokenizer consider both states. +func (p *parser) parseGenericRawTextElement() { + p.addElement() + p.originalIM = p.im + p.im = textIM +} + // generateImpliedEndTags pops nodes off the stack of open elements as long as // the top node has a tag name of dd, dt, li, optgroup, option, p, rb, rp, rt or rtc. // If exceptions are specified, nodes with that name will not be popped off. @@ -192,37 +203,17 @@ func (p *parser) generateImpliedEndTags(exceptions ...string) { loop: for i = len(p.oe) - 1; i >= 0; i-- { n := p.oe[i] - if n.Type == ElementNode { - switch n.DataAtom { - case a.Dd, a.Dt, a.Li, a.Optgroup, a.Option, a.P, a.Rb, a.Rp, a.Rt, a.Rtc: - for _, except := range exceptions { - if n.Data == except { - break loop - } - } - continue - } + if n.Type != ElementNode { + break } - break - } - - p.oe = p.oe[:i+1] -} - -// generateAllImpliedEndTags pops nodes off the stack of open elements as long as -// the top node has a tag name of caption, colgroup, dd, div, dt, li, optgroup, option, p, rb, -// rp, rt, rtc, span, tbody, td, tfoot, th, thead or tr. -func (p *parser) generateAllImpliedEndTags() { - var i int - for i = len(p.oe) - 1; i >= 0; i-- { - n := p.oe[i] - if n.Type == ElementNode { - switch n.DataAtom { - // TODO: remove this divergence from the HTML5 spec - case a.Caption, a.Colgroup, a.Dd, a.Div, a.Dt, a.Li, a.Optgroup, a.Option, a.P, a.Rb, - a.Rp, a.Rt, a.Rtc, a.Span, a.Tbody, a.Td, a.Tfoot, a.Th, a.Thead, a.Tr: - continue + switch n.DataAtom { + case a.Dd, a.Dt, a.Li, a.Optgroup, a.Option, a.P, a.Rb, a.Rp, a.Rt, a.Rtc: + for _, except := range exceptions { + if n.Data == except { + break loop + } } + continue } break } @@ -276,7 +267,7 @@ func (p *parser) fosterParent(n *Node) { } } - if template != nil && (table == nil || j < i) { + if template != nil && (table == nil || j > i) { template.AppendChild(n) return } @@ -390,8 +381,7 @@ findIdenticalElements: // Section 12.2.4.3. func (p *parser) clearActiveFormattingElements() { for { - n := p.afe.pop() - if len(p.afe) == 0 || n.Type == scopeMarkerNode { + if n := p.afe.pop(); len(p.afe) == 0 || n.Type == scopeMarkerNode { return } } @@ -460,9 +450,6 @@ func (p *parser) resetInsertionMode() { case a.Select: if !last { for ancestor, first := n, p.oe[0]; ancestor != first; { - if ancestor == first { - break - } ancestor = p.oe[p.oe.index(ancestor)-1] switch ancestor.DataAtom { case a.Template: @@ -491,6 +478,10 @@ func (p *parser) resetInsertionMode() { case a.Table: p.im = inTableIM case a.Template: + // TODO: remove this divergence from the HTML5 spec. + if n.Namespace != "" { + continue + } p.im = p.templateStack.top() case a.Head: // TODO: remove this divergence from the HTML5 spec. @@ -645,16 +636,29 @@ func inHeadIM(p *parser) bool { switch p.tok.DataAtom { case a.Html: return inBodyIM(p) - case a.Base, a.Basefont, a.Bgsound, a.Command, a.Link, a.Meta: + case a.Base, a.Basefont, a.Bgsound, a.Link, a.Meta: p.addElement() p.oe.pop() p.acknowledgeSelfClosingTag() return true - case a.Script, a.Title, a.Noscript, a.Noframes, a.Style: + case a.Noscript: + if p.scripting { + p.parseGenericRawTextElement() + return true + } + p.addElement() + p.im = inHeadNoscriptIM + // Don't let the tokenizer go into raw text mode when scripting is disabled. + p.tokenizer.NextIsNotRawText() + return true + case a.Script, a.Title: p.addElement() p.setOriginalIM() p.im = textIM return true + case a.Noframes, a.Style: + p.parseGenericRawTextElement() + return true case a.Head: // Ignore the token. return true @@ -679,11 +683,16 @@ func inHeadIM(p *parser) bool { if !p.oe.contains(a.Template) { return true } - p.generateAllImpliedEndTags() - if n := p.oe.top(); n.DataAtom != a.Template { - return true + // TODO: remove this divergence from the HTML5 spec. + // + // See https://bugs.chromium.org/p/chromium/issues/detail?id=829668 + p.generateImpliedEndTags() + for i := len(p.oe) - 1; i >= 0; i-- { + if n := p.oe[i]; n.Namespace == "" && n.DataAtom == a.Template { + p.oe = p.oe[:i] + break + } } - p.popUntil(defaultScope, a.Template) p.clearActiveFormattingElements() p.templateStack.pop() p.resetInsertionMode() @@ -707,6 +716,49 @@ func inHeadIM(p *parser) bool { return false } +// 12.2.6.4.5. +func inHeadNoscriptIM(p *parser) bool { + switch p.tok.Type { + case DoctypeToken: + // Ignore the token. + return true + case StartTagToken: + switch p.tok.DataAtom { + case a.Html: + return inBodyIM(p) + case a.Basefont, a.Bgsound, a.Link, a.Meta, a.Noframes, a.Style: + return inHeadIM(p) + case a.Head, a.Noscript: + // Ignore the token. + return true + } + case EndTagToken: + switch p.tok.DataAtom { + case a.Noscript, a.Br: + default: + // Ignore the token. + return true + } + case TextToken: + s := strings.TrimLeft(p.tok.Data, whitespace) + if len(s) == 0 { + // It was all whitespace. + return inHeadIM(p) + } + case CommentToken: + return inHeadIM(p) + } + p.oe.pop() + if p.top().DataAtom != a.Head { + panic("html: the new current node will be a head element.") + } + p.im = inHeadIM + if p.tok.DataAtom == a.Noscript { + return true + } + return false +} + // Section 12.2.6.4.6. func afterHeadIM(p *parser) bool { switch p.tok.Type { @@ -818,7 +870,7 @@ func inBodyIM(p *parser) bool { return true } copyAttributes(p.oe[0], p.tok) - case a.Base, a.Basefont, a.Bgsound, a.Command, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Template, a.Title: + case a.Base, a.Basefont, a.Bgsound, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Template, a.Title: return inHeadIM(p) case a.Body: if p.oe.contains(a.Template) { @@ -844,7 +896,7 @@ func inBodyIM(p *parser) bool { p.addElement() p.im = inFramesetIM return true - case a.Address, a.Article, a.Aside, a.Blockquote, a.Center, a.Details, a.Dir, a.Div, a.Dl, a.Fieldset, a.Figcaption, a.Figure, a.Footer, a.Header, a.Hgroup, a.Menu, a.Nav, a.Ol, a.P, a.Section, a.Summary, a.Ul: + case a.Address, a.Article, a.Aside, a.Blockquote, a.Center, a.Details, a.Dialog, a.Dir, a.Div, a.Dl, a.Fieldset, a.Figcaption, a.Figure, a.Footer, a.Header, a.Hgroup, a.Main, a.Menu, a.Nav, a.Ol, a.P, a.Section, a.Summary, a.Ul: p.popUntil(buttonScope, a.P) p.addElement() case a.H1, a.H2, a.H3, a.H4, a.H5, a.H6: @@ -860,9 +912,13 @@ func inBodyIM(p *parser) bool { // The newline, if any, will be dealt with by the TextToken case. p.framesetOK = false case a.Form: - if p.oe.contains(a.Template) || p.form == nil { - p.popUntil(buttonScope, a.P) - p.addElement() + if p.form != nil && !p.oe.contains(a.Template) { + // Ignore the token + return true + } + p.popUntil(buttonScope, a.P) + p.addElement() + if !p.oe.contains(a.Template) { p.form = p.top() } case a.Li: @@ -912,7 +968,7 @@ func inBodyIM(p *parser) bool { case a.A: for i := len(p.afe) - 1; i >= 0 && p.afe[i].Type != scopeMarkerNode; i-- { if n := p.afe[i]; n.Type == ElementNode && n.DataAtom == a.A { - p.inBodyEndTagFormatting(a.A) + p.inBodyEndTagFormatting(a.A, "a") p.oe.remove(n) p.afe.remove(n) break @@ -926,7 +982,7 @@ func inBodyIM(p *parser) bool { case a.Nobr: p.reconstructActiveFormattingElements() if p.elementInScope(defaultScope, a.Nobr) { - p.inBodyEndTagFormatting(a.Nobr) + p.inBodyEndTagFormatting(a.Nobr, "nobr") p.reconstructActiveFormattingElements() } p.addFormattingElement() @@ -973,45 +1029,6 @@ func inBodyIM(p *parser) bool { p.tok.DataAtom = a.Img p.tok.Data = a.Img.String() return false - case a.Isindex: - if p.form != nil { - // Ignore the token. - return true - } - action := "" - prompt := "This is a searchable index. Enter search keywords: " - attr := []Attribute{{Key: "name", Val: "isindex"}} - for _, t := range p.tok.Attr { - switch t.Key { - case "action": - action = t.Val - case "name": - // Ignore the attribute. - case "prompt": - prompt = t.Val - default: - attr = append(attr, t) - } - } - p.acknowledgeSelfClosingTag() - p.popUntil(buttonScope, a.P) - p.parseImpliedToken(StartTagToken, a.Form, a.Form.String()) - if action != "" { - p.form.Attr = []Attribute{{Key: "action", Val: action}} - } - p.parseImpliedToken(StartTagToken, a.Hr, a.Hr.String()) - p.parseImpliedToken(StartTagToken, a.Label, a.Label.String()) - p.addText(prompt) - p.addChild(&Node{ - Type: ElementNode, - DataAtom: a.Input, - Data: a.Input.String(), - Attr: attr, - }) - p.oe.pop() - p.parseImpliedToken(EndTagToken, a.Label, a.Label.String()) - p.parseImpliedToken(StartTagToken, a.Hr, a.Hr.String()) - p.parseImpliedToken(EndTagToken, a.Form, a.Form.String()) case a.Textarea: p.addElement() p.setOriginalIM() @@ -1021,18 +1038,21 @@ func inBodyIM(p *parser) bool { p.popUntil(buttonScope, a.P) p.reconstructActiveFormattingElements() p.framesetOK = false - p.addElement() - p.setOriginalIM() - p.im = textIM + p.parseGenericRawTextElement() case a.Iframe: p.framesetOK = false + p.parseGenericRawTextElement() + case a.Noembed: + p.parseGenericRawTextElement() + case a.Noscript: + if p.scripting { + p.parseGenericRawTextElement() + return true + } + p.reconstructActiveFormattingElements() p.addElement() - p.setOriginalIM() - p.im = textIM - case a.Noembed, a.Noscript: - p.addElement() - p.setOriginalIM() - p.im = textIM + // Don't let the tokenizer go into raw text mode when scripting is disabled. + p.tokenizer.NextIsNotRawText() case a.Select: p.reconstructActiveFormattingElements() p.addElement() @@ -1070,13 +1090,7 @@ func inBodyIM(p *parser) bool { p.acknowledgeSelfClosingTag() } return true - case a.Frame: - // TODO: remove this divergence from the HTML5 spec. - if p.oe.contains(a.Template) { - p.addElement() - return true - } - case a.Caption, a.Col, a.Colgroup, a.Head, a.Tbody, a.Td, a.Tfoot, a.Th, a.Thead, a.Tr: + case a.Caption, a.Col, a.Colgroup, a.Frame, a.Head, a.Tbody, a.Td, a.Tfoot, a.Th, a.Thead, a.Tr: // Ignore the token. default: p.reconstructActiveFormattingElements() @@ -1094,16 +1108,17 @@ func inBodyIM(p *parser) bool { return false } return true - case a.Address, a.Article, a.Aside, a.Blockquote, a.Button, a.Center, a.Details, a.Dir, a.Div, a.Dl, a.Fieldset, a.Figcaption, a.Figure, a.Footer, a.Header, a.Hgroup, a.Listing, a.Menu, a.Nav, a.Ol, a.Pre, a.Section, a.Summary, a.Ul: + case a.Address, a.Article, a.Aside, a.Blockquote, a.Button, a.Center, a.Details, a.Dialog, a.Dir, a.Div, a.Dl, a.Fieldset, a.Figcaption, a.Figure, a.Footer, a.Header, a.Hgroup, a.Listing, a.Main, a.Menu, a.Nav, a.Ol, a.Pre, a.Section, a.Summary, a.Ul: p.popUntil(defaultScope, p.tok.DataAtom) case a.Form: if p.oe.contains(a.Template) { - if !p.oe.contains(a.Form) { + i := p.indexOfElementInScope(defaultScope, a.Form) + if i == -1 { // Ignore the token. return true } p.generateImpliedEndTags() - if p.tok.DataAtom == a.Form { + if p.oe[i].DataAtom != a.Form { // Ignore the token. return true } @@ -1131,7 +1146,7 @@ func inBodyIM(p *parser) bool { case a.H1, a.H2, a.H3, a.H4, a.H5, a.H6: p.popUntil(defaultScope, a.H1, a.H2, a.H3, a.H4, a.H5, a.H6) case a.A, a.B, a.Big, a.Code, a.Em, a.Font, a.I, a.Nobr, a.S, a.Small, a.Strike, a.Strong, a.Tt, a.U: - p.inBodyEndTagFormatting(p.tok.DataAtom) + p.inBodyEndTagFormatting(p.tok.DataAtom, p.tok.Data) case a.Applet, a.Marquee, a.Object: if p.popUntil(defaultScope, p.tok.DataAtom) { p.clearActiveFormattingElements() @@ -1142,7 +1157,7 @@ func inBodyIM(p *parser) bool { case a.Template: return inHeadIM(p) default: - p.inBodyEndTagOther(p.tok.DataAtom) + p.inBodyEndTagOther(p.tok.DataAtom, p.tok.Data) } case CommentToken: p.addChild(&Node{ @@ -1154,14 +1169,13 @@ func inBodyIM(p *parser) bool { if len(p.templateStack) > 0 { p.im = inTemplateIM return false - } else { - for _, e := range p.oe { - switch e.DataAtom { - case a.Dd, a.Dt, a.Li, a.Optgroup, a.Option, a.P, a.Rb, a.Rp, a.Rt, a.Rtc, a.Tbody, a.Td, a.Tfoot, a.Th, - a.Thead, a.Tr, a.Body, a.Html: - default: - return true - } + } + for _, e := range p.oe { + switch e.DataAtom { + case a.Dd, a.Dt, a.Li, a.Optgroup, a.Option, a.P, a.Rb, a.Rp, a.Rt, a.Rtc, a.Tbody, a.Td, a.Tfoot, a.Th, + a.Thead, a.Tr, a.Body, a.Html: + default: + return true } } } @@ -1169,7 +1183,7 @@ func inBodyIM(p *parser) bool { return true } -func (p *parser) inBodyEndTagFormatting(tagAtom a.Atom) { +func (p *parser) inBodyEndTagFormatting(tagAtom a.Atom, tagName string) { // This is the "adoption agency" algorithm, described at // https://html.spec.whatwg.org/multipage/syntax.html#adoptionAgency @@ -1177,9 +1191,15 @@ func (p *parser) inBodyEndTagFormatting(tagAtom a.Atom) { // Once the code successfully parses the comprehensive test suite, we should // refactor this code to be more idiomatic. - // Steps 1-4. The outer loop. + // Steps 1-2 + if current := p.oe.top(); current.Data == tagName && p.afe.index(current) == -1 { + p.oe.pop() + return + } + + // Steps 3-5. The outer loop. for i := 0; i < 8; i++ { - // Step 5. Find the formatting element. + // Step 6. Find the formatting element. var formattingElement *Node for j := len(p.afe) - 1; j >= 0; j-- { if p.afe[j].Type == scopeMarkerNode { @@ -1191,20 +1211,25 @@ func (p *parser) inBodyEndTagFormatting(tagAtom a.Atom) { } } if formattingElement == nil { - p.inBodyEndTagOther(tagAtom) + p.inBodyEndTagOther(tagAtom, tagName) return } + + // Step 7. Ignore the tag if formatting element is not in the stack of open elements. feIndex := p.oe.index(formattingElement) if feIndex == -1 { p.afe.remove(formattingElement) return } + // Step 8. Ignore the tag if formatting element is not in the scope. if !p.elementInScope(defaultScope, tagAtom) { // Ignore the tag. return } - // Steps 9-10. Find the furthest block. + // Step 9. This step is omitted because it's just a parse error but no need to return. + + // Steps 10-11. Find the furthest block. var furthestBlock *Node for _, e := range p.oe[feIndex:] { if isSpecialElement(e) { @@ -1221,47 +1246,65 @@ func (p *parser) inBodyEndTagFormatting(tagAtom a.Atom) { return } - // Steps 11-12. Find the common ancestor and bookmark node. + // Steps 12-13. Find the common ancestor and bookmark node. commonAncestor := p.oe[feIndex-1] bookmark := p.afe.index(formattingElement) - // Step 13. The inner loop. Find the lastNode to reparent. + // Step 14. The inner loop. Find the lastNode to reparent. lastNode := furthestBlock node := furthestBlock x := p.oe.index(node) - // Steps 13.1-13.2 - for j := 0; j < 3; j++ { - // Step 13.3. + // Step 14.1. + j := 0 + for { + // Step 14.2. + j++ + // Step. 14.3. x-- node = p.oe[x] - // Step 13.4 - 13.5. + // Step 14.4. Go to the next step if node is formatting element. + if node == formattingElement { + break + } + // Step 14.5. Remove node from the list of active formatting elements if + // inner loop counter is greater than three and node is in the list of + // active formatting elements. + if ni := p.afe.index(node); j > 3 && ni > -1 { + p.afe.remove(node) + // If any element of the list of active formatting elements is removed, + // we need to take care whether bookmark should be decremented or not. + // This is because the value of bookmark may exceed the size of the + // list by removing elements from the list. + if ni <= bookmark { + bookmark-- + } + continue + } + // Step 14.6. Continue the next inner loop if node is not in the list of + // active formatting elements. if p.afe.index(node) == -1 { p.oe.remove(node) continue } - // Step 13.6. - if node == formattingElement { - break - } - // Step 13.7. + // Step 14.7. clone := node.clone() p.afe[p.afe.index(node)] = clone p.oe[p.oe.index(node)] = clone node = clone - // Step 13.8. + // Step 14.8. if lastNode == furthestBlock { bookmark = p.afe.index(node) + 1 } - // Step 13.9. + // Step 14.9. if lastNode.Parent != nil { lastNode.Parent.RemoveChild(lastNode) } node.AppendChild(lastNode) - // Step 13.10. + // Step 14.10. lastNode = node } - // Step 14. Reparent lastNode to the common ancestor, + // Step 15. Reparent lastNode to the common ancestor, // or for misnested table nodes, to the foster parent. if lastNode.Parent != nil { lastNode.Parent.RemoveChild(lastNode) @@ -1269,23 +1312,17 @@ func (p *parser) inBodyEndTagFormatting(tagAtom a.Atom) { switch commonAncestor.DataAtom { case a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr: p.fosterParent(lastNode) - case a.Template: - // TODO: remove namespace checking - if commonAncestor.Namespace == "html" { - commonAncestor = commonAncestor.LastChild - } - fallthrough default: commonAncestor.AppendChild(lastNode) } - // Steps 15-17. Reparent nodes from the furthest block's children + // Steps 16-18. Reparent nodes from the furthest block's children // to a clone of the formatting element. clone := formattingElement.clone() reparentChildren(clone, furthestBlock) furthestBlock.AppendChild(clone) - // Step 18. Fix up the list of active formatting elements. + // Step 19. Fix up the list of active formatting elements. if oldLoc := p.afe.index(formattingElement); oldLoc != -1 && oldLoc < bookmark { // Move the bookmark with the rest of the list. bookmark-- @@ -1293,7 +1330,7 @@ func (p *parser) inBodyEndTagFormatting(tagAtom a.Atom) { p.afe.remove(formattingElement) p.afe.insert(bookmark, clone) - // Step 19. Fix up the stack of open elements. + // Step 20. Fix up the stack of open elements. p.oe.remove(formattingElement) p.oe.insert(p.oe.index(furthestBlock)+1, clone) } @@ -1302,9 +1339,17 @@ func (p *parser) inBodyEndTagFormatting(tagAtom a.Atom) { // inBodyEndTagOther performs the "any other end tag" algorithm for inBodyIM. // "Any other end tag" handling from 12.2.6.5 The rules for parsing tokens in foreign content // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inforeign -func (p *parser) inBodyEndTagOther(tagAtom a.Atom) { +func (p *parser) inBodyEndTagOther(tagAtom a.Atom, tagName string) { for i := len(p.oe) - 1; i >= 0; i-- { - if p.oe[i].DataAtom == tagAtom { + // Two element nodes have the same tag if they have the same Data (a + // string-typed field). As an optimization, for common HTML tags, each + // Data string is assigned a unique, non-zero DataAtom (a uint32-typed + // field), since integer comparison is faster than string comparison. + // Uncommon (custom) tags get a zero DataAtom. + // + // The if condition here is equivalent to (p.oe[i].Data == tagName). + if (p.oe[i].DataAtom == tagAtom) && + ((tagAtom != 0) || (p.oe[i].Data == tagName)) { p.oe = p.oe[:i] break } @@ -1346,9 +1391,6 @@ func textIM(p *parser) bool { // Section 12.2.6.4.9. func inTableIM(p *parser) bool { switch p.tok.Type { - case ErrorToken: - // Stop parsing. - return true case TextToken: p.tok.Data = strings.Replace(p.tok.Data, "\x00", "", -1) switch p.oe.top().DataAtom { @@ -1443,6 +1485,8 @@ func inTableIM(p *parser) bool { case DoctypeToken: // Ignore the token. return true + case ErrorToken: + return inBodyIM(p) } p.fosterParenting = true @@ -1457,14 +1501,13 @@ func inCaptionIM(p *parser) bool { case StartTagToken: switch p.tok.DataAtom { case a.Caption, a.Col, a.Colgroup, a.Tbody, a.Td, a.Tfoot, a.Thead, a.Tr: - if p.popUntil(tableScope, a.Caption) { - p.clearActiveFormattingElements() - p.im = inTableIM - return false - } else { + if !p.popUntil(tableScope, a.Caption) { // Ignore the token. return true } + p.clearActiveFormattingElements() + p.im = inTableIM + return false case a.Select: p.reconstructActiveFormattingElements() p.addElement() @@ -1481,14 +1524,13 @@ func inCaptionIM(p *parser) bool { } return true case a.Table: - if p.popUntil(tableScope, a.Caption) { - p.clearActiveFormattingElements() - p.im = inTableIM - return false - } else { + if !p.popUntil(tableScope, a.Caption) { // Ignore the token. return true } + p.clearActiveFormattingElements() + p.im = inTableIM + return false case a.Body, a.Col, a.Colgroup, a.Html, a.Tbody, a.Td, a.Tfoot, a.Th, a.Thead, a.Tr: // Ignore the token. return true @@ -1545,6 +1587,8 @@ func inColumnGroupIM(p *parser) bool { case a.Template: return inHeadIM(p) } + case ErrorToken: + return inBodyIM(p) } if p.oe.top().DataAtom != a.Colgroup { return true @@ -1697,8 +1741,9 @@ func inCellIM(p *parser) bool { return true } // Close the cell and reprocess. - p.popUntil(tableScope, a.Td, a.Th) - p.clearActiveFormattingElements() + if p.popUntil(tableScope, a.Td, a.Th) { + p.clearActiveFormattingElements() + } p.im = inRowIM return false } @@ -1709,9 +1754,6 @@ func inCellIM(p *parser) bool { // Section 12.2.6.4.16. func inSelectIM(p *parser) bool { switch p.tok.Type { - case ErrorToken: - // Stop parsing. - return true case TextToken: p.addText(strings.Replace(p.tok.Data, "\x00", "", -1)) case StartTagToken: @@ -1732,8 +1774,11 @@ func inSelectIM(p *parser) bool { } p.addElement() case a.Select: - p.tok.Type = EndTagToken - return false + if !p.popUntil(selectScope, a.Select) { + // Ignore the token. + return true + } + p.resetInsertionMode() case a.Input, a.Keygen, a.Textarea: if p.elementInScope(selectScope, a.Select) { p.parseImpliedToken(EndTagToken, a.Select, a.Select.String()) @@ -1761,9 +1806,11 @@ func inSelectIM(p *parser) bool { p.oe = p.oe[:i] } case a.Select: - if p.popUntil(selectScope, a.Select) { - p.resetInsertionMode() + if !p.popUntil(selectScope, a.Select) { + // Ignore the token. + return true } + p.resetInsertionMode() case a.Template: return inHeadIM(p) } @@ -1775,6 +1822,8 @@ func inSelectIM(p *parser) bool { case DoctypeToken: // Ignore the token. return true + case ErrorToken: + return inBodyIM(p) } return true @@ -1786,13 +1835,22 @@ func inSelectInTableIM(p *parser) bool { case StartTagToken, EndTagToken: switch p.tok.DataAtom { case a.Caption, a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr, a.Td, a.Th: - if p.tok.Type == StartTagToken || p.elementInScope(tableScope, p.tok.DataAtom) { - p.parseImpliedToken(EndTagToken, a.Select, a.Select.String()) - return false - } else { + if p.tok.Type == EndTagToken && !p.elementInScope(tableScope, p.tok.DataAtom) { // Ignore the token. return true } + // This is like p.popUntil(selectScope, a.Select), but it also + // matches , not just diff --git a/vendor/golang.org/x/tools/godoc/static/codewalk.html b/vendor/golang.org/x/tools/godoc/static/codewalk.html deleted file mode 100644 index 0f3d22a20..000000000 --- a/vendor/golang.org/x/tools/godoc/static/codewalk.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - -
    -
    -
    -
    -
    - - Pop Out Code - - -
    -
    - -
    -
    -
    - code on leftright - code width 70% - filepaths shownhidden -
    -
    -
    -
    - {{range .Step}} -
    - -
    {{html .Title}}
    -
    - {{with .Err}} - ERROR LOADING FILE: {{html .}}

    - {{end}} - {{.XML}} -
    -
    {{html .}}
    -
    - {{end}} -
    -
    - previous step - • - next step -
    -
    -
    diff --git a/vendor/golang.org/x/tools/godoc/static/codewalkdir.html b/vendor/golang.org/x/tools/godoc/static/codewalkdir.html deleted file mode 100644 index b7674c6ce..000000000 --- a/vendor/golang.org/x/tools/godoc/static/codewalkdir.html +++ /dev/null @@ -1,16 +0,0 @@ - - - -{{range .}} - - {{$name_html := html .Name}} - - - - -{{end}} -
    {{$name_html}} {{html .Title}}
    diff --git a/vendor/golang.org/x/tools/godoc/static/dirlist.html b/vendor/golang.org/x/tools/godoc/static/dirlist.html deleted file mode 100644 index a3e1a2fa8..000000000 --- a/vendor/golang.org/x/tools/godoc/static/dirlist.html +++ /dev/null @@ -1,31 +0,0 @@ - - -

    - - - - - - - - - - - -{{range .}} - - {{$name_html := fileInfoName . | html}} - - - - - - -{{end}} - -
    File Bytes Modified
    ..
    {{$name_html}}{{html .Size}}{{fileInfoTime . | html}}
    -

    diff --git a/vendor/golang.org/x/tools/godoc/static/doc.go b/vendor/golang.org/x/tools/godoc/static/doc.go deleted file mode 100644 index b3d8bcf34..000000000 --- a/vendor/golang.org/x/tools/godoc/static/doc.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package static exports a map of static file content that supports the godoc -// user interface. The map should be used with the mapfs package, see -// golang.org/x/tools/godoc/vfs/mapfs. -package static // import "golang.org/x/tools/godoc/static" diff --git a/vendor/golang.org/x/tools/godoc/static/error.html b/vendor/golang.org/x/tools/godoc/static/error.html deleted file mode 100644 index 7573aa236..000000000 --- a/vendor/golang.org/x/tools/godoc/static/error.html +++ /dev/null @@ -1,9 +0,0 @@ - - -

    -{{html .}} -

    diff --git a/vendor/golang.org/x/tools/godoc/static/example.html b/vendor/golang.org/x/tools/godoc/static/example.html deleted file mode 100644 index 1e86b2588..000000000 --- a/vendor/golang.org/x/tools/godoc/static/example.html +++ /dev/null @@ -1,30 +0,0 @@ -
    - -
    -

    Example{{example_suffix .Name}}

    - {{with .Doc}}

    {{html .}}

    {{end}} - {{$output := .Output}} - {{with .Play}} -
    -
    -
    {{html $output}}
    -
    - Run - Format - {{if not $.GoogleCN}} - - {{end}} -
    -
    - {{else}} -

    Code:

    -
    {{.Code}}
    - {{with .Output}} -

    Output:

    -
    {{html .}}
    - {{end}} - {{end}} -
    -
    diff --git a/vendor/golang.org/x/tools/godoc/static/gen.go b/vendor/golang.org/x/tools/godoc/static/gen.go deleted file mode 100644 index 76f7d34b3..000000000 --- a/vendor/golang.org/x/tools/godoc/static/gen.go +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package static - -//go:generate go run makestatic.go - -import ( - "bytes" - "fmt" - "go/format" - "io/ioutil" - "time" - "unicode" -) - -var files = []string{ - "analysis/call3.png", - "analysis/call-eg.png", - "analysis/callers1.png", - "analysis/callers2.png", - "analysis/chan1.png", - "analysis/chan2a.png", - "analysis/chan2b.png", - "analysis/error1.png", - "analysis/help.html", - "analysis/ident-def.png", - "analysis/ident-field.png", - "analysis/ident-func.png", - "analysis/ipcg-func.png", - "analysis/ipcg-pkg.png", - "analysis/typeinfo-pkg.png", - "analysis/typeinfo-src.png", - "callgraph.html", - "codewalk.html", - "codewalkdir.html", - "dirlist.html", - "error.html", - "example.html", - "godoc.html", - "godocs.js", - "images/minus.gif", - "images/plus.gif", - "images/treeview-black-line.gif", - "images/treeview-black.gif", - "images/treeview-default-line.gif", - "images/treeview-default.gif", - "images/treeview-gray-line.gif", - "images/treeview-gray.gif", - "implements.html", - "jquery.js", - "jquery.treeview.css", - "jquery.treeview.edit.js", - "jquery.treeview.js", - "methodset.html", - "opensearch.xml", - "package.html", - "packageroot.html", - "play.js", - "playground.js", - "search.html", - "searchcode.html", - "searchdoc.html", - "searchtxt.html", - "style.css", -} - -// Generate reads a set of files and returns a file buffer that declares -// a map of string constants containing contents of the input files. -func Generate() ([]byte, error) { - buf := new(bytes.Buffer) - fmt.Fprintf(buf, "%v\n\n%v\n\npackage static\n\n", license, warning) - fmt.Fprintf(buf, "var Files = map[string]string{\n") - for _, fn := range files { - b, err := ioutil.ReadFile(fn) - if err != nil { - return b, err - } - fmt.Fprintf(buf, "\t%q: ", fn) - appendQuote(buf, b) - fmt.Fprintf(buf, ",\n\n") - } - fmt.Fprintln(buf, "}") - return format.Source(buf.Bytes()) -} - -// appendQuote is like strconv.AppendQuote, but we avoid the latter -// because it changes when Unicode evolves, breaking gen_test.go. -func appendQuote(out *bytes.Buffer, data []byte) { - out.WriteByte('"') - for _, b := range data { - if b == '\\' || b == '"' { - out.WriteByte('\\') - out.WriteByte(b) - } else if b <= unicode.MaxASCII && unicode.IsPrint(rune(b)) && !unicode.IsSpace(rune(b)) { - out.WriteByte(b) - } else { - fmt.Fprintf(out, "\\x%02x", b) - } - } - out.WriteByte('"') -} - -const warning = `// Code generated by "makestatic"; DO NOT EDIT.` - -var license = fmt.Sprintf(`// Copyright %d The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file.`, time.Now().UTC().Year()) diff --git a/vendor/golang.org/x/tools/godoc/static/godoc.html b/vendor/golang.org/x/tools/godoc/static/godoc.html deleted file mode 100644 index 89e089bad..000000000 --- a/vendor/golang.org/x/tools/godoc/static/godoc.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - -{{with .Tabtitle}} - {{html .}} - The Go Programming Language -{{else}} - The Go Programming Language -{{end}} - -{{if .SearchBox}} - -{{end}} -{{if .TreeView}} - -{{end}} - -{{with .GoogleAnalytics}} - -{{end}} - -{{if .TreeView}} - - -{{end}} - -{{if .Playground}} - -{{end}} -{{with .Version}}{{end}} - - - - -
    -... -
    - -
    - - - -
    - -
    - -
    - -{{if .Playground}} -
    -
    -
    -
    - Run - Format - {{if not $.GoogleCN}} - - {{end}} -
    -
    -{{end}} - -
    -
    - -{{if or .Title .SrcPath}} -

    - {{html .Title}} - {{html .SrcPath | srcBreadcrumb}} -

    -{{end}} - -{{with .Subtitle}} -

    {{html .}}

    -{{end}} - -{{with .SrcPath}} -

    - Documentation: {{html . | srcToPkgLink}} -

    -{{end}} - -{{/* The Table of Contents is automatically inserted in this
    . - Do not delete this
    . */}} - - -{{/* Body is HTML-escaped elsewhere */}} -{{printf "%s" .Body}} - - - -
    -
    -{{if .GoogleAnalytics}} - -{{end}} - - - diff --git a/vendor/golang.org/x/tools/godoc/static/godocs.js b/vendor/golang.org/x/tools/godoc/static/godocs.js deleted file mode 100644 index ca5bbea21..000000000 --- a/vendor/golang.org/x/tools/godoc/static/godocs.js +++ /dev/null @@ -1,640 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* A little code to ease navigation of these documents. - * - * On window load we: - * + Generate a table of contents (generateTOC) - * + Bind foldable sections (bindToggles) - * + Bind links to foldable sections (bindToggleLinks) - */ - -(function() { -'use strict'; - -// Mobile-friendly topbar menu -$(function() { - var menu = $('#menu'); - var menuButton = $('#menu-button'); - var menuButtonArrow = $('#menu-button-arrow'); - menuButton.click(function(event) { - menu.toggleClass('menu-visible'); - menuButtonArrow.toggleClass('vertical-flip'); - event.preventDefault(); - return false; - }); -}); - -/* Generates a table of contents: looks for h2 and h3 elements and generates - * links. "Decorates" the element with id=="nav" with this table of contents. - */ -function generateTOC() { - if ($('#manual-nav').length > 0) { - return; - } - - // For search, we send the toc precomputed from server-side. - // TODO: Ideally, this should always be precomputed for all pages, but then - // we need to do HTML parsing on the server-side. - if (location.pathname === '/search') { - return; - } - - var nav = $('#nav'); - if (nav.length === 0) { - return; - } - - var toc_items = []; - $(nav).nextAll('h2, h3').each(function() { - var node = this; - if (node.id == '') - node.id = 'tmp_' + toc_items.length; - var link = $('').attr('href', '#' + node.id).text($(node).text()); - var item; - if ($(node).is('h2')) { - item = $('
    '); - } else { // h3 - item = $('
    '); - } - item.append(link); - toc_items.push(item); - }); - if (toc_items.length <= 1) { - return; - } - var dl1 = $('
    '); - var dl2 = $('
    '); - - var split_index = (toc_items.length / 2) + 1; - if (split_index < 8) { - split_index = toc_items.length; - } - for (var i = 0; i < split_index; i++) { - dl1.append(toc_items[i]); - } - for (/* keep using i */; i < toc_items.length; i++) { - dl2.append(toc_items[i]); - } - - var tocTable = $('').appendTo(nav); - var tocBody = $('').appendTo(tocTable); - var tocRow = $('').appendTo(tocBody); - - // 1st column - $(']","i"),bv=/^(?:checkbox|radio)$/,bw=/checked\s*(?:[^=]|=\s*.checked.)/i,bx=/\/(java|ecma)script/i,by=/^\s*\s*$/g,bz={option:[1,""],legend:[1,"
    ","
    "],thead:[1,"
    ').appendTo(tocRow).append(dl1); - // 2nd column - $('').appendTo(tocRow).append(dl2); -} - -function bindToggle(el) { - $('.toggleButton', el).click(function() { - if ($(this).closest(".toggle, .toggleVisible")[0] != el) { - // Only trigger the closest toggle header. - return; - } - - if ($(el).is('.toggle')) { - $(el).addClass('toggleVisible').removeClass('toggle'); - } else { - $(el).addClass('toggle').removeClass('toggleVisible'); - } - }); -} - -function bindToggles(selector) { - $(selector).each(function(i, el) { - bindToggle(el); - }); -} - -function bindToggleLink(el, prefix) { - $(el).click(function() { - var href = $(el).attr('href'); - var i = href.indexOf('#'+prefix); - if (i < 0) { - return; - } - var id = '#' + prefix + href.slice(i+1+prefix.length); - if ($(id).is('.toggle')) { - $(id).find('.toggleButton').first().click(); - } - }); -} -function bindToggleLinks(selector, prefix) { - $(selector).each(function(i, el) { - bindToggleLink(el, prefix); - }); -} - -function setupDropdownPlayground() { - if (!$('#page').is('.wide')) { - return; // don't show on front page - } - var button = $('#playgroundButton'); - var div = $('#playground'); - var setup = false; - button.toggle(function() { - button.addClass('active'); - div.show(); - if (setup) { - return; - } - setup = true; - playground({ - 'codeEl': $('.code', div), - 'outputEl': $('.output', div), - 'runEl': $('.run', div), - 'fmtEl': $('.fmt', div), - 'shareEl': $('.share', div), - 'shareRedirect': '//play.golang.org/p/' - }); - }, - function() { - button.removeClass('active'); - div.hide(); - }); - $('#menu').css('min-width', '+=60'); - - // Hide inline playground if we click somewhere on the page. - // This is needed in mobile devices, where the "Play" button - // is not clickable once the playground opens up. - $("#page").click(function() { - if (button.hasClass('active')) { - button.click(); - } - }); -} - -function setupInlinePlayground() { - 'use strict'; - // Set up playground when each element is toggled. - $('div.play').each(function (i, el) { - // Set up playground for this example. - var setup = function() { - var code = $('.code', el); - playground({ - 'codeEl': code, - 'outputEl': $('.output', el), - 'runEl': $('.run', el), - 'fmtEl': $('.fmt', el), - 'shareEl': $('.share', el), - 'shareRedirect': '//play.golang.org/p/' - }); - - // Make the code textarea resize to fit content. - var resize = function() { - code.height(0); - var h = code[0].scrollHeight; - code.height(h+20); // minimize bouncing. - code.closest('.input').height(h); - }; - code.on('keydown', resize); - code.on('keyup', resize); - code.keyup(); // resize now. - }; - - // If example already visible, set up playground now. - if ($(el).is(':visible')) { - setup(); - return; - } - - // Otherwise, set up playground when example is expanded. - var built = false; - $(el).closest('.toggle').click(function() { - // Only set up once. - if (!built) { - setup(); - built = true; - } - }); - }); -} - -// fixFocus tries to put focus to div#page so that keyboard navigation works. -function fixFocus() { - var page = $('div#page'); - var topbar = $('div#topbar'); - page.css('outline', 0); // disable outline when focused - page.attr('tabindex', -1); // and set tabindex so that it is focusable - $(window).resize(function (evt) { - // only focus page when the topbar is at fixed position (that is, it's in - // front of page, and keyboard event will go to the former by default.) - // by focusing page, keyboard event will go to page so that up/down arrow, - // space, etc. will work as expected. - if (topbar.css('position') == "fixed") - page.focus(); - }).resize(); -} - -function toggleHash() { - var id = window.location.hash.substring(1); - // Open all of the toggles for a particular hash. - var els = $( - document.getElementById(id), - $('a[name]').filter(function() { - return $(this).attr('name') == id; - }) - ); - - while (els.length) { - for (var i = 0; i < els.length; i++) { - var el = $(els[i]); - if (el.is('.toggle')) { - el.find('.toggleButton').first().click(); - } - } - els = el.parent(); - } -} - -function personalizeInstallInstructions() { - var prefix = '?download='; - var s = window.location.search; - if (s.indexOf(prefix) != 0) { - // No 'download' query string; detect "test" instructions from User Agent. - if (navigator.platform.indexOf('Win') != -1) { - $('.testUnix').hide(); - $('.testWindows').show(); - } else { - $('.testUnix').show(); - $('.testWindows').hide(); - } - return; - } - - var filename = s.substr(prefix.length); - var filenameRE = /^go1\.\d+(\.\d+)?([a-z0-9]+)?\.([a-z0-9]+)(-[a-z0-9]+)?(-osx10\.[68])?\.([a-z.]+)$/; - var m = filenameRE.exec(filename); - if (!m) { - // Can't interpret file name; bail. - return; - } - $('.downloadFilename').text(filename); - $('.hideFromDownload').hide(); - - var os = m[3]; - var ext = m[6]; - if (ext != 'tar.gz') { - $('#tarballInstructions').hide(); - } - if (os != 'darwin' || ext != 'pkg') { - $('#darwinPackageInstructions').hide(); - } - if (os != 'windows') { - $('#windowsInstructions').hide(); - $('.testUnix').show(); - $('.testWindows').hide(); - } else { - if (ext != 'msi') { - $('#windowsInstallerInstructions').hide(); - } - if (ext != 'zip') { - $('#windowsZipInstructions').hide(); - } - $('.testUnix').hide(); - $('.testWindows').show(); - } - - var download = "https://dl.google.com/go/" + filename; - - var message = $('

    '+ - 'Your download should begin shortly. '+ - 'If it does not, click this link.

    '); - message.find('a').attr('href', download); - message.insertAfter('#nav'); - - window.location = download; -} - -function updateVersionTags() { - var v = window.goVersion; - if (/^go[0-9.]+$/.test(v)) { - $(".versionTag").empty().text(v); - $(".whereTag").hide(); - } -} - -function addPermalinks() { - function addPermalink(source, parent) { - var id = source.attr("id"); - if (id == "" || id.indexOf("tmp_") === 0) { - // Auto-generated permalink. - return; - } - if (parent.find("> .permalink").length) { - // Already attached. - return; - } - parent.append(" ").append($("").attr("href", "#" + id)); - } - - $("#page .container").find("h2[id], h3[id]").each(function() { - var el = $(this); - addPermalink(el, el); - }); - - $("#page .container").find("dl[id]").each(function() { - var el = $(this); - // Add the anchor to the "dt" element. - addPermalink(el, el.find("> dt").first()); - }); -} - -$(".js-expandAll").click(function() { - if ($(this).hasClass("collapsed")) { - toggleExamples('toggle'); - $(this).text("(Collapse All)"); - } else { - toggleExamples('toggleVisible'); - $(this).text("(Expand All)"); - } - $(this).toggleClass("collapsed") -}); - -function toggleExamples(className) { - // We need to explicitly iterate through divs starting with "example_" - // to avoid toggling Overview and Index collapsibles. - $("[id^='example_']").each(function() { - // Check for state and click it only if required. - if ($(this).hasClass(className)) { - $(this).find('.toggleButton').first().click(); - } - }); -} - -$(document).ready(function() { - generateTOC(); - addPermalinks(); - bindToggles(".toggle"); - bindToggles(".toggleVisible"); - bindToggleLinks(".exampleLink", "example_"); - bindToggleLinks(".overviewLink", ""); - bindToggleLinks(".examplesLink", ""); - bindToggleLinks(".indexLink", ""); - setupDropdownPlayground(); - setupInlinePlayground(); - fixFocus(); - setupTypeInfo(); - setupCallgraphs(); - toggleHash(); - personalizeInstallInstructions(); - updateVersionTags(); - - // godoc.html defines window.initFuncs in the tag, and root.html and - // codewalk.js push their on-page-ready functions to the list. - // We execute those functions here, to avoid loading jQuery until the page - // content is loaded. - for (var i = 0; i < window.initFuncs.length; i++) window.initFuncs[i](); -}); - -// -- analysis --------------------------------------------------------- - -// escapeHTML returns HTML for s, with metacharacters quoted. -// It is safe for use in both elements and attributes -// (unlike the "set innerText, read innerHTML" trick). -function escapeHTML(s) { - return s.replace(/&/g, '&'). - replace(/\"/g, '"'). - replace(/\'/g, '''). - replace(//g, '>'); -} - -// makeAnchor returns HTML for an element, given an anchorJSON object. -function makeAnchor(json) { - var html = escapeHTML(json.Text); - if (json.Href != "") { - html = "" + html + ""; - } - return html; -} - -function showLowFrame(html) { - var lowframe = document.getElementById('lowframe'); - lowframe.style.height = "200px"; - lowframe.innerHTML = "

    " + html + "

    \n" + - "
    " -}; - -document.hideLowFrame = function() { - var lowframe = document.getElementById('lowframe'); - lowframe.style.height = "0px"; -} - -// onClickCallers is the onclick action for the 'func' tokens of a -// function declaration. -document.onClickCallers = function(index) { - var data = document.ANALYSIS_DATA[index] - if (data.Callers.length == 1 && data.Callers[0].Sites.length == 1) { - document.location = data.Callers[0].Sites[0].Href; // jump to sole caller - return; - } - - var html = "Callers of " + escapeHTML(data.Callee) + ":
    \n"; - for (var i = 0; i < data.Callers.length; i++) { - var caller = data.Callers[i]; - html += "" + escapeHTML(caller.Func) + ""; - var sites = caller.Sites; - if (sites != null && sites.length > 0) { - html += " at line "; - for (var j = 0; j < sites.length; j++) { - if (j > 0) { - html += ", "; - } - html += "" + makeAnchor(sites[j]) + ""; - } - } - html += "
    \n"; - } - showLowFrame(html); -}; - -// onClickCallees is the onclick action for the '(' token of a function call. -document.onClickCallees = function(index) { - var data = document.ANALYSIS_DATA[index] - if (data.Callees.length == 1) { - document.location = data.Callees[0].Href; // jump to sole callee - return; - } - - var html = "Callees of this " + escapeHTML(data.Descr) + ":
    \n"; - for (var i = 0; i < data.Callees.length; i++) { - html += "" + makeAnchor(data.Callees[i]) + "
    \n"; - } - showLowFrame(html); -}; - -// onClickTypeInfo is the onclick action for identifiers declaring a named type. -document.onClickTypeInfo = function(index) { - var data = document.ANALYSIS_DATA[index]; - var html = "Type " + data.Name + ": " + - "      (size=" + data.Size + ", align=" + data.Align + ")
    \n"; - html += implementsHTML(data); - html += methodsetHTML(data); - showLowFrame(html); -}; - -// implementsHTML returns HTML for the implements relation of the -// specified TypeInfoJSON value. -function implementsHTML(info) { - var html = ""; - if (info.ImplGroups != null) { - for (var i = 0; i < info.ImplGroups.length; i++) { - var group = info.ImplGroups[i]; - var x = "" + escapeHTML(group.Descr) + " "; - for (var j = 0; j < group.Facts.length; j++) { - var fact = group.Facts[j]; - var y = "" + makeAnchor(fact.Other) + ""; - if (fact.ByKind != null) { - html += escapeHTML(fact.ByKind) + " type " + y + " implements " + x; - } else { - html += x + " implements " + y; - } - html += "
    \n"; - } - } - } - return html; -} - - -// methodsetHTML returns HTML for the methodset of the specified -// TypeInfoJSON value. -function methodsetHTML(info) { - var html = ""; - if (info.Methods != null) { - for (var i = 0; i < info.Methods.length; i++) { - html += "" + makeAnchor(info.Methods[i]) + "
    \n"; - } - } - return html; -} - -// onClickComm is the onclick action for channel "make" and "<-" -// send/receive tokens. -document.onClickComm = function(index) { - var ops = document.ANALYSIS_DATA[index].Ops - if (ops.length == 1) { - document.location = ops[0].Op.Href; // jump to sole element - return; - } - - var html = "Operations on this channel:
    \n"; - for (var i = 0; i < ops.length; i++) { - html += makeAnchor(ops[i].Op) + " by " + escapeHTML(ops[i].Fn) + "
    \n"; - } - if (ops.length == 0) { - html += "(none)
    \n"; - } - showLowFrame(html); -}; - -$(window).load(function() { - // Scroll window so that first selection is visible. - // (This means we don't need to emit id='L%d' spans for each line.) - // TODO(adonovan): ideally, scroll it so that it's under the pointer, - // but I don't know how to get the pointer y coordinate. - var elts = document.getElementsByClassName("selection"); - if (elts.length > 0) { - elts[0].scrollIntoView() - } -}); - -// setupTypeInfo populates the "Implements" and "Method set" toggle for -// each type in the package doc. -function setupTypeInfo() { - for (var i in document.ANALYSIS_DATA) { - var data = document.ANALYSIS_DATA[i]; - - var el = document.getElementById("implements-" + i); - if (el != null) { - // el != null => data is TypeInfoJSON. - if (data.ImplGroups != null) { - el.innerHTML = implementsHTML(data); - el.parentNode.parentNode.style.display = "block"; - } - } - - var el = document.getElementById("methodset-" + i); - if (el != null) { - // el != null => data is TypeInfoJSON. - if (data.Methods != null) { - el.innerHTML = methodsetHTML(data); - el.parentNode.parentNode.style.display = "block"; - } - } - } -} - -function setupCallgraphs() { - if (document.CALLGRAPH == null) { - return - } - document.getElementById("pkg-callgraph").style.display = "block"; - - var treeviews = document.getElementsByClassName("treeview"); - for (var i = 0; i < treeviews.length; i++) { - var tree = treeviews[i]; - if (tree.id == null || tree.id.indexOf("callgraph-") != 0) { - continue; - } - var id = tree.id.substring("callgraph-".length); - $(tree).treeview({collapsed: true, animated: "fast"}); - document.cgAddChildren(tree, tree, [id]); - tree.parentNode.parentNode.style.display = "block"; - } -} - -document.cgAddChildren = function(tree, ul, indices) { - if (indices != null) { - for (var i = 0; i < indices.length; i++) { - var li = cgAddChild(tree, ul, document.CALLGRAPH[indices[i]]); - if (i == indices.length - 1) { - $(li).addClass("last"); - } - } - } - $(tree).treeview({animated: "fast", add: ul}); -} - -// cgAddChild adds an
  • element for document.CALLGRAPH node cgn to -// the parent
      element ul. tree is the tree's root
        element. -function cgAddChild(tree, ul, cgn) { - var li = document.createElement("li"); - ul.appendChild(li); - li.className = "closed"; - - var code = document.createElement("code"); - - if (cgn.Callees != null) { - $(li).addClass("expandable"); - - // Event handlers and innerHTML updates don't play nicely together, - // hence all this explicit DOM manipulation. - var hitarea = document.createElement("div"); - hitarea.className = "hitarea expandable-hitarea"; - li.appendChild(hitarea); - - li.appendChild(code); - - var childUL = document.createElement("ul"); - li.appendChild(childUL); - childUL.setAttribute('style', "display: none;"); - - var onClick = function() { - document.cgAddChildren(tree, childUL, cgn.Callees); - hitarea.removeEventListener('click', onClick) - }; - hitarea.addEventListener('click', onClick); - - } else { - li.appendChild(code); - } - code.innerHTML += " " + makeAnchor(cgn.Func); - return li -} - -})(); diff --git a/vendor/golang.org/x/tools/godoc/static/implements.html b/vendor/golang.org/x/tools/godoc/static/implements.html deleted file mode 100644 index 5f65b861a..000000000 --- a/vendor/golang.org/x/tools/godoc/static/implements.html +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/vendor/golang.org/x/tools/godoc/static/jquery.js b/vendor/golang.org/x/tools/godoc/static/jquery.js deleted file mode 100644 index bc3fbc81b..000000000 --- a/vendor/golang.org/x/tools/godoc/static/jquery.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v1.8.2 jquery.com | jquery.org/license */ -(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write(""),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bS[a]=c,c}function ci(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||ce.test(a)?d(a,e):ci(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ci(a+"["+e+"]",b[e],c,d);else d(a,b)}function cz(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEvent("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.2",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,c,d){var e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e in a)if(c.apply(a[e],d)===!1)break}else for(;f0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return p.inArray(a,i)>-1},empty:function(){return i=[],this},disable:function(){return i=j=c=b,this},disabled:function(){return!i},lock:function(){return j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!d}};return l},p.extend({Deferred:function(a){var b=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return p.Deferred(function(c){p.each(b,function(b,d){var f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return a!=null?p.extend(a,d):d}},e={};return d.pipe=d.then,p.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promise)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new Array(d),i=new Array(d),j=new Array(d);for(;b
        a",c=n.getElementsByTagName("*"),d=n.getElementsByTagName("a")[0],d.style.cssText="top:1px;float:left;opacity:.5";if(!c||!c.length)return{};f=e.createElement("select"),g=f.appendChild(e.createElement("option")),h=n.getElementsByTagName("input")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName("tbody").length,htmlSerialize:!!n.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:n.className!=="t",enctype:!!e.createElement("form").enctype,html5Clone:e.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",boxModel:e.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent("onclick",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent("onclick"),n.detachEvent("onclick",m)),h=e.createElement("input"),h.value="t",h.setAttribute("type","radio"),b.radioValue=h.value==="t",h.setAttribute("checked","checked"),h.setAttribute("name","t"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k in{submit:!0,change:!0,focusin:!0})j="on"+k,l=j in n,l||(n.setAttribute(j,"return;"),l=typeof n[j]=="function"),b[k+"Bubbles"]=l;return p(function(){var c,d,f,g,h="padding:0;margin:0;border:0;display:block;overflow:hidden;",i=e.getElementsByTagName("body")[0];if(!i)return;c=e.createElement("div"),c.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",i.insertBefore(c,i.firstChild),d=e.createElement("div"),c.appendChild(d),d.innerHTML="
        t
        ",f=d.getElementsByTagName("td"),f[0].style.cssText="padding:0;margin:0;border:0;display:none",l=f[0].offsetHeight===0,f[0].style.display="",f[1].style.display="none",b.reliableHiddenOffsets=l&&f[0].offsetHeight===0,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!=="1%",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:"4px"}).width==="4px",g=e.createElement("div"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width="0",d.style.width="1px",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof d.style.zoom!="undefined"&&(d.innerHTML="",d.style.cssText=h+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display="block",d.style.overflow="visible",d.innerHTML="
        ",d.firstChild.style.width="5px",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.removeChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(p.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var f,g,h=p.expando,i=typeof c=="string",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||p.guid++:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof c=="object"||typeof c=="function")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]:p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b in d?b=[b]:(b=p.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,f=b.length;e1,null,!1))},removeData:function(a){return this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=p.queue(a,b),d=c.length,e=c.shift(),f=p._queueHooks(a,b),g=function(){p.dequeue(a,b)};e==="inprogress"&&(e=c.shift(),d--),e&&(b==="fx"&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return p._data(a,c)||p._data(a,c,{empty:p.Callbacks("once memory").add(function(){p.removeData(a,b+"queue",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var d=2;return typeof a!="string"&&(c=a,a="fx",d--),arguments.length1)},removeAttr:function(a){return this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g,h;if(p.isFunction(a))return this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(s);for(c=0,d=this.length;c=0)d=d.replace(" "+c[f]+" "," ");e.className=a?p.trim(d):""}}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";return p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c==="string"){var e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||a===!1?"":p._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c=0)return!0;return!1},val:function(a){var c,d,e,f=this[0];if(!arguments.length){if(f)return c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],c&&"get"in c&&(d=c.get(f,"value"))!==b?d:(d=f.value,typeof d=="string"?d.replace(P,""):d==null?"":d);return}return e=p.isFunction(a),this.each(function(d){var f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f="":typeof f=="number"?f+="":p.isArray(f)&&(f=p.map(f,function(a){return a==null?"":a+""})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,f,"value")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type==="select-one";if(f<0)return null;c=i?f:0,d=i?f+1:h.length;for(;c=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return p(a)[c](d);if(typeof a.getAttribute=="undefined")return p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return g&&"set"in g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,d+""),d)}return g&&"get"in g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g=0}})});var V=/^(?:textarea|input|select)$/i,W=/^([^\.]*|)(?:\.(.+)|)$/,X=/(?:^|\s)hover(\.\S+|)\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return p.event.special.hover?a:a.replace(X,"mouseenter$1 mouseleave$1")};p.event={add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c||!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return typeof p!="undefined"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(" ");for(j=0;j=0&&(s=s.slice(0,-1),i=!0),s.indexOf(".")>=0&&(t=s.split("."),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof c=="object"?c[p.expando]?c:new p.Event(s,c):new p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,m=s.indexOf(":")<0?"on"+s:"";if(!f){h=p.cache;for(j in h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;j=0:p.find(m,this,null,[f]).length),h[m]&&j.push(l);j.length&&u.push({elem:f,matches:j})}o.length>q&&u.push({elem:this,matches:o.slice(q)});for(d=0;d0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function bc(a,b,c,d){c=c||[],b=b||r;var e,f,i,j,k=b.nodeType;if(!a||typeof a!="string")return c;if(k!==1&&k!==9)return[];i=g(b);if(!i&&!d)if(e=P.exec(a))if(j=e[1]){if(k===9){f=b.getElementById(j);if(!f||!f.parentNode)return c;if(f.id===j)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(j))&&h(b,f)&&f.id===j)return c.push(f),c}else{if(e[2])return w.apply(c,x.call(b.getElementsByTagName(a),0)),c;if((j=e[3])&&_&&b.getElementsByClassName)return w.apply(c,x.call(b.getElementsByClassName(j),0)),c}return bp(a.replace(L,"$1"),b,c,d,i)}function bd(a){return function(b){var c=b.nodeName.toLowerCase();return c==="input"&&b.type===a}}function be(a){return function(b){var c=b.nodeName.toLowerCase();return(c==="input"||c==="button")&&b.type===a}}function bf(a){return z(function(b){return b=+b,z(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function bg(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}function bh(a,b){var c,d,f,g,h,i,j,k=C[o][a];if(k)return b?0:k.slice(0);h=a,i=[],j=e.preFilter;while(h){if(!c||(d=M.exec(h)))d&&(h=h.slice(d[0].length)),i.push(f=[]);c=!1;if(d=N.exec(h))f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=d[0].replace(L," ");for(g in e.filter)(d=W[g].exec(h))&&(!j[g]||(d=j[g](d,r,!0)))&&(f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=g,c.matches=d);if(!c)break}return b?h.length:h?bc.error(a):C(a,i).slice(0)}function bi(a,b,d){var e=b.dir,f=d&&b.dir==="parentNode",g=u++;return b.first?function(b,c,d){while(b=b[e])if(f||b.nodeType===1)return a(b,c,d)}:function(b,d,h){if(!h){var i,j=t+" "+g+" ",k=j+c;while(b=b[e])if(f||b.nodeType===1){if((i=b[o])===k)return b.sizset;if(typeof i=="string"&&i.indexOf(j)===0){if(b.sizset)return b}else{b[o]=k;if(a(b,d,h))return b.sizset=!0,b;b.sizset=!1}}}else while(b=b[e])if(f||b.nodeType===1)if(a(b,d,h))return b}}function bj(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function bk(a,b,c,d,e){var f,g=[],h=0,i=a.length,j=b!=null;for(;h-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==l)||((b=c).nodeType?j(a,c,d):k(a,c,d))}];for(;i1&&bj(m),i>1&&a.slice(0,i-1).join("").replace(L,"$1"),c,i0,f=a.length>0,g=function(h,i,j,k,m){var n,o,p,q=[],s=0,u="0",x=h&&[],y=m!=null,z=l,A=h||f&&e.find.TAG("*",m&&i.parentNode||i),B=t+=z==null?1:Math.E;y&&(l=i!==r&&i,c=g.el);for(;(n=A[u])!=null;u++){if(f&&n){for(o=0;p=a[o];o++)if(p(n,i,j)){k.push(n);break}y&&(t=B,c=++g.el)}d&&((n=!p&&n)&&s--,h&&x.push(n))}s+=u;if(d&&u!==s){for(o=0;p=b[o];o++)p(x,q,i,j);if(h){if(s>0)while(u--)!x[u]&&!q[u]&&(q[u]=v.call(k));q=bk(q)}w.apply(k,q),y&&!h&&q.length>0&&s+b.length>1&&bc.uniqueSort(k)}return y&&(t=B,l=z),x};return g.el=0,d?z(g):g}function bo(a,b,c,d){var e=0,f=b.length;for(;e2&&(j=h[0]).type==="ID"&&b.nodeType===9&&!f&&e.relative[h[1].type]){b=e.find.ID(j.matches[0].replace(V,""),b,f)[0];if(!b)return c;a=a.slice(h.shift().length)}for(g=W.POS.test(a)?-1:h.length-1;g>=0;g--){j=h[g];if(e.relative[k=j.type])break;if(l=e.find[k])if(d=l(j.matches[0].replace(V,""),R.test(h[0].type)&&b.parentNode||b,f)){h.splice(g,1),a=d.length&&h.join("");if(!a)return w.apply(c,x.call(d,0)),c;break}}}return i(a,m)(d,b,f,c,R.test(a)),c}function bq(){}var c,d,e,f,g,h,i,j,k,l,m=!0,n="undefined",o=("sizcache"+Math.random()).replace(".",""),q=String,r=a.document,s=r.documentElement,t=0,u=0,v=[].pop,w=[].push,x=[].slice,y=[].indexOf||function(a){var b=0,c=this.length;for(;be.cacheLength&&delete a[b.shift()],a[c]=d},a)},B=A(),C=A(),D=A(),E="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",G=F.replace("w","w#"),H="([*^$|!~]?=)",I="\\["+E+"*("+F+")"+E+"*(?:"+H+E+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+G+")|)|)"+E+"*\\]",J=":("+F+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+I+")|[^:]|\\\\.)*|.*))\\)|)",K=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+E+"*((?:-\\d)?\\d*)"+E+"*\\)|)(?=[^-]|$)",L=new RegExp("^"+E+"+|((?:^|[^\\\\])(?:\\\\.)*)"+E+"+$","g"),M=new RegExp("^"+E+"*,"+E+"*"),N=new RegExp("^"+E+"*([\\x20\\t\\r\\n\\f>+~])"+E+"*"),O=new RegExp(J),P=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,Q=/^:not/,R=/[\x20\t\r\n\f]*[+~]/,S=/:not\($/,T=/h\d/i,U=/input|select|textarea|button/i,V=/\\(?!\\)/g,W={ID:new RegExp("^#("+F+")"),CLASS:new RegExp("^\\.("+F+")"),NAME:new RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:new RegExp("^("+F.replace("w","w*")+")"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+J),POS:new RegExp(K,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+E+"*(even|odd|(([+-]|)(\\d*)n|)"+E+"*(?:([+-]|)"+E+"*(\\d+)|))"+E+"*\\)|)","i"),needsContext:new RegExp("^"+E+"*[>+~]|"+K,"i")},X=function(a){var b=r.createElement("div");try{return a(b)}catch(c){return!1}finally{b=null}},Y=X(function(a){return a.appendChild(r.createComment("")),!a.getElementsByTagName("*").length}),Z=X(function(a){return a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!==n&&a.firstChild.getAttribute("href")==="#"}),$=X(function(a){a.innerHTML="";var b=typeof a.lastChild.getAttribute("multiple");return b!=="boolean"&&b!=="string"}),_=X(function(a){return a.innerHTML="",!a.getElementsByClassName||!a.getElementsByClassName("e").length?!1:(a.lastChild.className="e",a.getElementsByClassName("e").length===2)}),ba=X(function(a){a.id=o+0,a.innerHTML="
        ",s.insertBefore(a,s.firstChild);var b=r.getElementsByName&&r.getElementsByName(o).length===2+r.getElementsByName(o+0).length;return d=!r.getElementById(o),s.removeChild(a),b});try{x.call(s.childNodes,0)[0].nodeType}catch(bb){x=function(a){var b,c=[];for(;b=this[a];a++)c.push(b);return c}}bc.matches=function(a,b){return bc(a,null,null,b)},bc.matchesSelector=function(a,b){return bc(b,null,null,[a]).length>0},f=bc.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(e===1||e===9||e===11){if(typeof a.textContent=="string")return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=f(a)}else if(e===3||e===4)return a.nodeValue}else for(;b=a[d];d++)c+=f(b);return c},g=bc.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?b.nodeName!=="HTML":!1},h=bc.contains=s.contains?function(a,b){var c=a.nodeType===9?a.documentElement:a,d=b&&b.parentNode;return a===d||!!(d&&d.nodeType===1&&c.contains&&c.contains(d))}:s.compareDocumentPosition?function(a,b){return b&&!!(a.compareDocumentPosition(b)&16)}:function(a,b){while(b=b.parentNode)if(b===a)return!0;return!1},bc.attr=function(a,b){var c,d=g(a);return d||(b=b.toLowerCase()),(c=e.attrHandle[b])?c(a):d||$?a.getAttribute(b):(c=a.getAttributeNode(b),c?typeof a[b]=="boolean"?a[b]?b:null:c.specified?c.value:null:null)},e=bc.selectors={cacheLength:50,createPseudo:z,match:W,attrHandle:Z?{}:{href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}},find:{ID:d?function(a,b,c){if(typeof b.getElementById!==n&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==n&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==n&&e.getAttributeNode("id").value===a?[e]:b:[]}},TAG:Y?function(a,b){if(typeof b.getElementsByTagName!==n)return b.getElementsByTagName(a)}:function(a,b){var c=b.getElementsByTagName(a);if(a==="*"){var d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return e}return c},NAME:ba&&function(a,b){if(typeof b.getElementsByName!==n)return b.getElementsByName(name)},CLASS:_&&function(a,b,c){if(typeof b.getElementsByClassName!==n&&!c)return b.getElementsByClassName(a)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(V,""),a[3]=(a[4]||a[5]||"").replace(V,""),a[2]==="~="&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),a[1]==="nth"?(a[2]||bc.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]==="even"||a[2]==="odd")),a[4]=+(a[6]+a[7]||a[2]==="odd")):a[2]&&bc.error(a[0]),a},PSEUDO:function(a){var b,c;if(W.CHILD.test(a[0]))return null;if(a[3])a[2]=a[3];else if(b=a[4])O.test(b)&&(c=bh(b,!0))&&(c=b.indexOf(")",b.length-c)-b.length)&&(b=b.slice(0,c),a[0]=a[0].slice(0,c)),a[2]=b;return a.slice(0,3)}},filter:{ID:d?function(a){return a=a.replace(V,""),function(b){return b.getAttribute("id")===a}}:function(a){return a=a.replace(V,""),function(b){var c=typeof b.getAttributeNode!==n&&b.getAttributeNode("id");return c&&c.value===a}},TAG:function(a){return a==="*"?function(){return!0}:(a=a.replace(V,"").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=B[o][a];return b||(b=B(a,new RegExp("(^|"+E+")"+a+"("+E+"|$)"))),function(a){return b.test(a.className||typeof a.getAttribute!==n&&a.getAttribute("class")||"")}},ATTR:function(a,b,c){return function(d,e){var f=bc.attr(d,a);return f==null?b==="!=":b?(f+="",b==="="?f===c:b==="!="?f!==c:b==="^="?c&&f.indexOf(c)===0:b==="*="?c&&f.indexOf(c)>-1:b==="$="?c&&f.substr(f.length-c.length)===c:b==="~="?(" "+f+" ").indexOf(c)>-1:b==="|="?f===c||f.substr(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d){return a==="nth"?function(a){var b,e,f=a.parentNode;if(c===1&&d===0)return!0;if(f){e=0;for(b=f.firstChild;b;b=b.nextSibling)if(b.nodeType===1){e++;if(a===b)break}}return e-=d,e===c||e%c===0&&e/c>=0}:function(b){var c=b;switch(a){case"only":case"first":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a==="first")return!0;c=b;case"last":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b){var c,d=e.pseudos[a]||e.setFilters[a.toLowerCase()]||bc.error("unsupported pseudo: "+a);return d[o]?d(b):d.length>1?(c=[a,a,"",b],e.setFilters.hasOwnProperty(a.toLowerCase())?z(function(a,c){var e,f=d(a,b),g=f.length;while(g--)e=y.call(a,f[g]),a[e]=!(c[e]=f[g])}):function(a){return d(a,0,c)}):d}},pseudos:{not:z(function(a){var b=[],c=[],d=i(a.replace(L,"$1"));return d[o]?z(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)if(f=g[h])a[h]=!(b[h]=f)}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:z(function(a){return function(b){return bc(a,b).length>0}}),contains:z(function(a){return function(b){return(b.textContent||b.innerText||f(b)).indexOf(a)>-1}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&!!a.checked||b==="option"&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!e.pseudos.empty(a)},empty:function(a){var b;a=a.firstChild;while(a){if(a.nodeName>"@"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},header:function(a){return T.test(a.nodeName)},text:function(a){var b,c;return a.nodeName.toLowerCase()==="input"&&(b=a.type)==="text"&&((c=a.getAttribute("type"))==null||c.toLowerCase()===b)},radio:bd("radio"),checkbox:bd("checkbox"),file:bd("file"),password:bd("password"),image:bd("image"),submit:be("submit"),reset:be("reset"),button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&a.type==="button"||b==="button"},input:function(a){return U.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return a===a.ownerDocument.activeElement},first:bf(function(a,b,c){return[0]}),last:bf(function(a,b,c){return[b-1]}),eq:bf(function(a,b,c){return[c<0?c+b:c]}),even:bf(function(a,b,c){for(var d=0;d=0;)a.push(d);return a}),gt:bf(function(a,b,c){for(var d=c<0?c+b:c;++d",a.querySelectorAll("[selected]").length||e.push("\\["+E+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||e.push(":checked")}),X(function(a){a.innerHTML="

        ",a.querySelectorAll("[test^='']").length&&e.push("[*^$]="+E+"*(?:\"\"|'')"),a.innerHTML="",a.querySelectorAll(":enabled").length||e.push(":enabled",":disabled")}),e=new RegExp(e.join("|")),bp=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a))){var i,j,k=!0,l=o,m=d,n=d.nodeType===9&&a;if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){i=bh(a),(k=d.getAttribute("id"))?l=k.replace(c,"\\$&"):d.setAttribute("id",l),l="[id='"+l+"'] ",j=i.length;while(j--)i[j]=l+i[j].join("");m=R.test(a)&&d.parentNode||d,n=i.join(",")}if(n)try{return w.apply(f,x.call(m.querySelectorAll(n),0)),f}catch(p){}finally{k||d.removeAttribute("id")}}return b(a,d,f,g,h)},h&&(X(function(b){a=h.call(b,"div");try{h.call(b,"[test!='']:sizzle"),f.push("!=",J)}catch(c){}}),f=new RegExp(f.join("|")),bc.matchesSelector=function(b,c){c=c.replace(d,"='$1']");if(!g(b)&&!f.test(c)&&(!e||!e.test(c)))try{var i=h.call(b,c);if(i||a||b.document&&b.document.nodeType!==11)return i}catch(j){}return bc(c,null,null,[b]).length>0})}(),e.pseudos.nth=e.pseudos.eq,e.filters=bq.prototype=e.pseudos,e.setFilters=new bq,bc.attr=p.attr,p.find=bc,p.expr=bc.selectors,p.expr[":"]=p.expr.pseudos,p.unique=bc.uniqueSort,p.text=bc.getText,p.isXMLDoc=bc.isXML,p.contains=bc.contains}(a);var bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\[\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend({find:function(a){var b,c,d,e,f,g,h=this;if(typeof a!="string")return p(a).filter(function(){for(b=0,c=h.length;b0)for(e=d;e=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c,d=0,e=this.length,f=[],g=bf.test(a)||typeof a!="string"?p(a,b||this.context):0;for(;d-1:p.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}}return f=f.length>1?p.unique(f):f,this.pushStack(f,"closest",a)},index:function(a){return a?typeof a=="string"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var c=typeof a=="string"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return p.dir(a,"parentNode")},parentsUntil:function(a,b,c){return p.dir(a,"parentNode",c)},next:function(a){return bi(a,"nextSibling")},prev:function(a){return bi(a,"previousSibling")},nextAll:function(a){return p.dir(a,"nextSibling")},prevAll:function(a){return p.dir(a,"previousSibling")},nextUntil:function(a,b,c){return p.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return p.dir(a,"previousSibling",c)},siblings:function(a){return p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return p.sibling(a.firstChild)},contents:function(a){return p.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var e=p.map(this,b,c);return bc.test(a)||(d=c),d&&typeof d=="string"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(","))}}),p.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return e},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var bl="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",bm=/ jQuery\d+="(?:null|\d+)"/g,bn=/^\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bp=/<([\w:]+)/,bq=/
  • ","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]},bA=bk(e),bB=bA.appendChild(e.createElement("div"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.htmlSerialize||(bz._default=[1,"X
    ","
    "]),p.fn.extend({text:function(a){return p.access(this,function(a){return a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=p.isFunction(a);return this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(a,this),"before",this.selector)}},after:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(this,a),"after",this.selector)}},remove:function(a,b){var c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return this},empty:function(){var a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName("*"));while(a.firstChild)a.removeChild(a.firstChild)}return this},clone:function(a,b){return a=a==null?!1:a,b=b==null?a:b,this.map(function(){return p.clone(this,a,b)})},html:function(a){return p.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(bm,""):b;if(typeof a=="string"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(bo,"<$1>");try{for(;d1&&typeof j=="string"&&bw.test(j))return this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return this.each(function(e){var f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,"tr");for(h=e.cacheable||l-1;i0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu.test("<"+a.nodeName+">")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return d=e=null,g},clean:function(a,b,c,d){var f,g,h,i,j,k,l,m,n,o,q,r,s=b===e&&bA,t=[];if(!b||typeof b.createDocumentFragment=="undefined")b=e;for(f=0;(h=a[f])!=null;f++){typeof h=="number"&&(h+="");if(!h)continue;if(typeof h=="string")if(!br.test(h))h=b.createTextNode(h);else{s=s||bk(b),l=b.createElement("div"),s.appendChild(l),h=h.replace(bo,"<$1>"),i=(bp.exec(h)||["",""])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i==="table"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]===""&&!m?l.childNodes:[];for(g=n.length-1;g>=0;--g)p.nodeName(n[g],"tbody")&&!n[g].childNodes.length&&n[g].parentNode.removeChild(n[g])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l.parentNode.removeChild(l)}h.nodeType?t.push(h):p.merge(t,h)}l&&(h=l=s=null);if(!p.support.appendChecked)for(f=0;(h=t[f])!=null;f++)p.nodeName(h,"input")?bG(h):typeof h.getElementsByTagName!="undefined"&&p.grep(h.getElementsByTagName("input"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(f=0;(h=t[f])!=null;f++)if(!p.nodeName(h,"script")||!q(h))c.appendChild(h),typeof h.getElementsByTagName!="undefined"&&(r=p.grep(p.merge([],h.getElementsByTagName("script")),q),t.splice.apply(t,[f+1,0].concat(r)),f+=r.length)}return t},cleanData:function(a,b){var c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(f in c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete i[d],j?delete e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var a,b;p.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.chrome?b.webkit=!0:b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function a(b,c){return new a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function c(c,d){return d&&d instanceof p&&!(d instanceof a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var b=a(e);return a}}();var bH,bI,bJ,bK=/alpha\([^)]*\)/i,bL=/opacity=([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^(none|table(?!-c[ea]).+)/,bO=/^margin/,bP=new RegExp("^("+q+")(.*)$","i"),bQ=new RegExp("^("+q+")(?!px)[a-z%]+$","i"),bR=new RegExp("^([-+])=("+q+")","i"),bS={},bT={position:"absolute",visibility:"hidden",display:"block"},bU={letterSpacing:0,fontWeight:400},bV=["Top","Right","Bottom","Left"],bW=["Webkit","O","Moz","ms"],bX=p.fn.toggle;p.fn.extend({css:function(a,c){return p.access(this,function(a,c,d){return d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return b$(this,!0)},hide:function(){return b$(this)},toggle:function(a,b){var c=typeof a=="boolean";return p.isFunction(a)&&p.isFunction(b)?bX.apply(this,arguments):this.each(function(){(c?a:bZ(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bH(a,"opacity");return c===""?"1":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":p.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bY(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof d,g==="string"&&(f=bR.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g="number");if(d==null||g==="number"&&isNaN(d))return;g==="number"&&!p.cssNumber[i]&&(d+="px");if(!h||!("set"in h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var f,g,h,i=p.camelCase(c);return c=p.cssProps[i]||(p.cssProps[i]=bY(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&"get"in h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f==="normal"&&c in bU&&(f=bU[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d}}),a.getComputedStyle?bH=function(b,c){var d,e,f,g,h=a.getComputedStyle(b,null),i=b.style;return h&&(d=h[c],d===""&&!p.contains(b.ownerDocument,b)&&(d=p.style(b,c)),bQ.test(d)&&bO.test(c)&&(e=i.width,f=i.minWidth,g=i.maxWidth,i.minWidth=i.maxWidth=i.width=d,d=h.width,i.width=e,i.minWidth=f,i.maxWidth=g)),d}:e.documentElement.currentStyle&&(bH=function(a,b){var c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return e==null&&f&&f[b]&&(e=f[b]),bQ.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":e,e=f.pixelLeft+"px",f.left=c,d&&(a.runtimeStyle.left=d)),e===""?"auto":e}),p.each(["height","width"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth===0&&bN.test(bH(a,"display"))?p.swap(a,bT,function(){return cb(a,b,d)}):cb(a,b,d)},set:function(a,c,d){return b_(a,c,d?ca(a,b,d,p.support.boxSizing&&p.css(a,"boxSizing")==="border-box"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return bL.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=p.isNumeric(b)?"alpha(opacity="+b*100+")":"",f=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,""))===""&&c.removeAttribute){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+" "+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return p.swap(a,{display:"inline-block"},function(){if(b)return bH(a,"marginRight")})}}),!p.support.pixelPosition&&p.fn.position&&p.each(["top","left"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var d=bH(a,b);return bQ.test(d)?p(a).position()[b]+"px":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,"display"))==="none"},p.expr.filters.visible=function(a){return!p.expr.filters.hidden(a)}),p.each({margin:"",padding:"",border:"Width"},function(a,b){p.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bV[d]+b]=e[d]||e[d-2]||e[0];return f}},bO.test(a)||(p.cssHooks[a+b].set=b_)});var cd=/%20/g,ce=/\[\]$/,cf=/\r?\n/g,cg=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,ch=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?p.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ch.test(this.nodeName)||cg.test(this.type))}).map(function(a,b){var c=p(this).val();return c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(cf,"\r\n")}}):{name:b.name,value:c.replace(cf,"\r\n")}}).get()}}),p.param=function(a,c){var d,e=[],f=function(a,b){b=p.isFunction(b)?b():b==null?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else for(d in a)ci(d,a[d],c,f);return e.join("&").replace(cd,"+")};var cj,ck,cl=/#.*$/,cm=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,cn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,co=/^(?:GET|HEAD)$/,cp=/^\/\//,cq=/\?/,cr=/)<[^<]*)*<\/script>/gi,cs=/([?&])_=[^&]*/,ct=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,cu=p.fn.load,cv={},cw={},cx=["*/"]+["*"];try{ck=f.href}catch(cy){ck=e.createElement("a"),ck.href="",ck=ck.href}cj=ct.exec(ck.toLowerCase())||[],p.fn.load=function(a,c,d){if(typeof a!="string"&&cu)return cu.apply(this,arguments);if(!this.length)return this;var e,f,g,h=this,i=a.indexOf(" ");return i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),p.isFunction(c)?(d=c,c=b):c&&typeof c=="object"&&(f="POST"),p.ajax({url:a,type:f,dataType:"html",data:c,complete:function(a,b){d&&h.each(d,g||[a.responseText,b,a])}}).done(function(a){g=arguments,h.html(e?p("
    ").append(a.replace(cr,"")).find(e):a)}),this},p.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){p.fn[b]=function(a){return this.on(b,a)}}),p.each(["get","post"],function(a,c){p[c]=function(a,d,e,f){return p.isFunction(d)&&(f=f||e,e=d,d=b),p.ajax({type:c,url:a,data:d,success:e,dataType:f})}}),p.extend({getScript:function(a,c){return p.get(a,b,c,"script")},getJSON:function(a,b,c){return p.get(a,b,c,"json")},ajaxSetup:function(a,b){return b?cB(a,p.ajaxSettings):(b=a,a=p.ajaxSettings),cB(a,b),a},ajaxSettings:{url:ck,isLocal:cn.test(cj[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":cx},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":p.parseJSON,"text xml":p.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:cz(cv),ajaxTransport:cz(cw),ajax:function(a,c){function y(a,c,f,i){var k,s,t,u,w,y=c;if(v===2)return;v=2,h&&clearTimeout(h),g=b,e=i||"",x.readyState=a>0?4:0,f&&(u=cC(l,x,f));if(a>=200&&a<300||a===304)l.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(p.lastModified[d]=w),w=x.getResponseHeader("Etag"),w&&(p.etag[d]=w)),a===304?(y="notmodified",k=!0):(k=cD(l,u),y=k.state,s=k.data,t=k.error,k=!t);else{t=y;if(!y||a)y="error",a<0&&(a=0)}x.status=a,x.statusText=(c||y)+"",k?o.resolveWith(m,[s,y,x]):o.rejectWith(m,[x,y,t]),x.statusCode(r),r=b,j&&n.trigger("ajax"+(k?"Success":"Error"),[x,l,k?s:t]),q.fireWith(m,[x,y]),j&&(n.trigger("ajaxComplete",[x,l]),--p.active||p.event.trigger("ajaxStop"))}typeof a=="object"&&(c=a,a=b),c=c||{};var d,e,f,g,h,i,j,k,l=p.ajaxSetup({},c),m=l.context||l,n=m!==l&&(m.nodeType||m instanceof p)?p(m):p.event,o=p.Deferred(),q=p.Callbacks("once memory"),r=l.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,setRequestHeader:function(a,b){if(!v){var c=a.toLowerCase();a=u[c]=u[c]||a,t[a]=b}return this},getAllResponseHeaders:function(){return v===2?e:null},getResponseHeader:function(a){var c;if(v===2){if(!f){f={};while(c=cm.exec(e))f[c[1].toLowerCase()]=c[2]}c=f[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){return v||(l.mimeType=a),this},abort:function(a){return a=a||w,g&&g.abort(a),y(0,a),this}};o.promise(x),x.success=x.done,x.error=x.fail,x.complete=q.add,x.statusCode=function(a){if(a){var b;if(v<2)for(b in a)r[b]=[r[b],a[b]];else b=a[x.status],x.always(b)}return this},l.url=((a||l.url)+"").replace(cl,"").replace(cp,cj[1]+"//"),l.dataTypes=p.trim(l.dataType||"*").toLowerCase().split(s),l.crossDomain==null&&(i=ct.exec(l.url.toLowerCase())||!1,l.crossDomain=i&&i.join(":")+(i[3]?"":i[1]==="http:"?80:443)!==cj.join(":")+(cj[3]?"":cj[1]==="http:"?80:443)),l.data&&l.processData&&typeof l.data!="string"&&(l.data=p.param(l.data,l.traditional)),cA(cv,l,c,x);if(v===2)return x;j=l.global,l.type=l.type.toUpperCase(),l.hasContent=!co.test(l.type),j&&p.active++===0&&p.event.trigger("ajaxStart");if(!l.hasContent){l.data&&(l.url+=(cq.test(l.url)?"&":"?")+l.data,delete l.data),d=l.url;if(l.cache===!1){var z=p.now(),A=l.url.replace(cs,"$1_="+z);l.url=A+(A===l.url?(cq.test(l.url)?"&":"?")+"_="+z:"")}}(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",l.contentType),l.ifModified&&(d=d||l.url,p.lastModified[d]&&x.setRequestHeader("If-Modified-Since",p.lastModified[d]),p.etag[d]&&x.setRequestHeader("If-None-Match",p.etag[d])),x.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", "+cx+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)x.setRequestHeader(k,l.headers[k]);if(!l.beforeSend||l.beforeSend.call(m,x,l)!==!1&&v!==2){w="abort";for(k in{success:1,error:1,complete:1})x[k](l[k]);g=cA(cw,l,c,x);if(!g)y(-1,"No Transport");else{x.readyState=1,j&&n.trigger("ajaxSend",[x,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){x.abort("timeout")},l.timeout));try{v=1,g.send(t,y)}catch(B){if(v<2)y(-1,B);else throw B}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var cE=[],cF=/\?/,cG=/(=)\?(?=&|$)|\?\?/,cH=p.now();p.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=cE.pop()||p.expando+"_"+cH++;return this[a]=!0,a}}),p.ajaxPrefilter("json jsonp",function(c,d,e){var f,g,h,i=c.data,j=c.url,k=c.jsonp!==!1,l=k&&cG.test(j),m=k&&!l&&typeof i=="string"&&!(c.contentType||"").indexOf("application/x-www-form-urlencoded")&&cG.test(i);if(c.dataTypes[0]==="jsonp"||l||m)return f=c.jsonpCallback=p.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,g=a[f],l?c.url=j.replace(cG,"$1"+f):m?c.data=i.replace(cG,"$1"+f):k&&(c.url+=(cF.test(j)?"&":"?")+c.jsonp+"="+f),c.converters["script json"]=function(){return h||p.error(f+" was not called"),h[0]},c.dataTypes[0]="json",a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,cE.push(f)),h&&p.isFunction(g)&&g(h[0]),h=g=b}),"script"}),p.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){return p.globalEval(a),a}}}),p.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),p.ajaxTransport("script",function(a){if(a.crossDomain){var c,d=e.head||e.getElementsByTagName("head")[0]||e.documentElement;return{send:function(f,g){c=e.createElement("script"),c.async="async",a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,e){if(e||!c.readyState||/loaded|complete/.test(c.readyState))c.onload=c.onreadystatechange=null,d&&c.parentNode&&d.removeChild(c),c=b,e||g(200,"success")},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(0,1)}}}});var cI,cJ=a.ActiveXObject?function(){for(var a in cI)cI[a](0,1)}:!1,cK=0;p.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cL()||cM()}:cL,function(a){p.extend(p.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(p.ajaxSettings.xhr()),p.support.ajax&&p.ajaxTransport(function(c){if(!c.crossDomain||p.support.cors){var d;return{send:function(e,f){var g,h,i=c.xhr();c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async);if(c.xhrFields)for(h in c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(h in e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var h,j,k,l,m;try{if(d&&(e||i.readyState===4)){d=b,g&&(i.onreadystatechange=p.noop,cJ&&delete cI[g]);if(e)i.readyState!==4&&i.abort();else{h=i.status,k=i.getAllResponseHeaders(),l={},m=i.responseXML,m&&m.documentElement&&(l.xml=m);try{l.text=i.responseText}catch(a){}try{j=i.statusText}catch(n){j=""}!h&&c.isLocal&&!c.crossDomain?h=l.text?200:404:h===1223&&(h=204)}}}catch(o){e||f(-1,o)}l&&f(h,j,l,k)},c.async?i.readyState===4?setTimeout(d,0):(g=++cK,cJ&&(cI||(cI={},p(a).unload(cJ)),cI[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(0,1)}}}});var cN,cO,cP=/^(?:toggle|show|hide)$/,cQ=new RegExp("^(?:([-+])=|)("+q+")([a-z%]*)$","i"),cR=/queueHooks$/,cS=[cY],cT={"*":[function(a,b){var c,d,e=this.createTween(a,b),f=cQ.exec(b),g=e.cur(),h=+g||0,i=1,j=20;if(f){c=+f[2],d=f[3]||(p.cssNumber[a]?"":"px");if(d!=="px"&&h){h=p.css(e.elem,a,!0)||c||1;do i=i||".5",h=h/i,p.style(e.elem,a,h+d);while(i!==(i=e.cur()/g)&&i!==1&&--j)}e.unit=d,e.start=h,e.end=f[1]?h+(f[1]+1)*c:c}return e}]};p.Animation=p.extend(cW,{tweener:function(a,b){p.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");var c,d=0,e=a.length;for(;d-1,j={},k={},l,m;i?(k=e.position(),l=k.top,m=k.left):(l=parseFloat(g)||0,m=parseFloat(h)||0),p.isFunction(b)&&(b=b.call(a,c,f)),b.top!=null&&(j.top=b.top-f.top+l),b.left!=null&&(j.left=b.left-f.left+m),"using"in b?b.using.call(a,j):e.css(j)}},p.fn.extend({position:function(){if(!this[0])return;var a=this[0],b=this.offsetParent(),c=this.offset(),d=c_.test(b[0].nodeName)?{top:0,left:0}:b.offset();return c.top-=parseFloat(p.css(a,"marginTop"))||0,c.left-=parseFloat(p.css(a,"marginLeft"))||0,d.top+=parseFloat(p.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(p.css(b[0],"borderLeftWidth"))||0,{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||e.body;while(a&&!c_.test(a.nodeName)&&p.css(a,"position")==="static")a=a.offsetParent;return a||e.body})}}),p.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);p.fn[a]=function(e){return p.access(this,function(a,e,f){var g=da(a);if(f===b)return g?c in g?g[c]:g.document.documentElement[e]:a[e];g?g.scrollTo(d?p(g).scrollLeft():f,d?f:p(g).scrollTop()):a[e]=f},a,e,arguments.length,null)}}),p.each({Height:"height",Width:"width"},function(a,c){p.each({padding:"inner"+a,content:c,"":"outer"+a},function(d,e){p.fn[e]=function(e,f){var g=arguments.length&&(d||typeof e!="boolean"),h=d||(e===!0||f===!0?"margin":"border");return p.access(this,function(c,d,e){var f;return p.isWindow(c)?c.document.documentElement["client"+a]:c.nodeType===9?(f=c.documentElement,Math.max(c.body["scroll"+a],f["scroll"+a],c.body["offset"+a],f["offset"+a],f["client"+a])):e===b?p.css(c,d,e,h):p.style(c,d,e,h)},c,g?e:b,g,null)}})}),a.jQuery=a.$=p,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return p})})(window); \ No newline at end of file diff --git a/vendor/golang.org/x/tools/godoc/static/jquery.treeview.css b/vendor/golang.org/x/tools/godoc/static/jquery.treeview.css deleted file mode 100644 index ac33361a6..000000000 --- a/vendor/golang.org/x/tools/godoc/static/jquery.treeview.css +++ /dev/null @@ -1,76 +0,0 @@ -/* https://github.com/jzaefferer/jquery-treeview/blob/master/jquery.treeview.css */ -/* License: MIT. */ -.treeview, .treeview ul { - padding: 0; - margin: 0; - list-style: none; -} - -.treeview ul { - background-color: white; - margin-top: 4px; -} - -.treeview .hitarea { - background: url(images/treeview-default.gif) -64px -25px no-repeat; - height: 16px; - width: 16px; - margin-left: -16px; - float: left; - cursor: pointer; -} -/* fix for IE6 */ -* html .hitarea { - display: inline; - float:none; -} - -.treeview li { - margin: 0; - padding: 3px 0pt 3px 16px; -} - -.treeview a.selected { - background-color: #eee; -} - -#treecontrol { margin: 1em 0; display: none; } - -.treeview .hover { color: red; cursor: pointer; } - -.treeview li { background: url(images/treeview-default-line.gif) 0 0 no-repeat; } -.treeview li.collapsable, .treeview li.expandable { background-position: 0 -176px; } - -.treeview .expandable-hitarea { background-position: -80px -3px; } - -.treeview li.last { background-position: 0 -1766px } -.treeview li.lastCollapsable, .treeview li.lastExpandable { background-image: url(images/treeview-default.gif); } -.treeview li.lastCollapsable { background-position: 0 -111px } -.treeview li.lastExpandable { background-position: -32px -67px } - -.treeview div.lastCollapsable-hitarea, .treeview div.lastExpandable-hitarea { background-position: 0; } - -.treeview-red li { background-image: url(images/treeview-red-line.gif); } -.treeview-red .hitarea, .treeview-red li.lastCollapsable, .treeview-red li.lastExpandable { background-image: url(images/treeview-red.gif); } - -.treeview-black li { background-image: url(images/treeview-black-line.gif); } -.treeview-black .hitarea, .treeview-black li.lastCollapsable, .treeview-black li.lastExpandable { background-image: url(images/treeview-black.gif); } - -.treeview-gray li { background-image: url(images/treeview-gray-line.gif); } -.treeview-gray .hitarea, .treeview-gray li.lastCollapsable, .treeview-gray li.lastExpandable { background-image: url(images/treeview-gray.gif); } - -.treeview-famfamfam li { background-image: url(images/treeview-famfamfam-line.gif); } -.treeview-famfamfam .hitarea, .treeview-famfamfam li.lastCollapsable, .treeview-famfamfam li.lastExpandable { background-image: url(images/treeview-famfamfam.gif); } - -.treeview .placeholder { - background: url(images/ajax-loader.gif) 0 0 no-repeat; - height: 16px; - width: 16px; - display: block; -} - -.filetree li { padding: 3px 0 2px 16px; } -.filetree span.folder, .filetree span.file { padding: 1px 0 1px 16px; display: block; } -.filetree span.folder { background: url(images/folder.gif) 0 0 no-repeat; } -.filetree li.expandable span.folder { background: url(images/folder-closed.gif) 0 0 no-repeat; } -.filetree span.file { background: url(images/file.gif) 0 0 no-repeat; } diff --git a/vendor/golang.org/x/tools/godoc/static/jquery.treeview.edit.js b/vendor/golang.org/x/tools/godoc/static/jquery.treeview.edit.js deleted file mode 100644 index 9895b0263..000000000 --- a/vendor/golang.org/x/tools/godoc/static/jquery.treeview.edit.js +++ /dev/null @@ -1,39 +0,0 @@ -/* https://github.com/jzaefferer/jquery-treeview/blob/master/jquery.treeview.edit.js */ -/* License: MIT. */ -(function($) { - var CLASSES = $.treeview.classes; - var proxied = $.fn.treeview; - $.fn.treeview = function(settings) { - settings = $.extend({}, settings); - if (settings.add) { - return this.trigger("add", [settings.add]); - } - if (settings.remove) { - return this.trigger("remove", [settings.remove]); - } - return proxied.apply(this, arguments).bind("add", function(event, branches) { - $(branches).prev() - .removeClass(CLASSES.last) - .removeClass(CLASSES.lastCollapsable) - .removeClass(CLASSES.lastExpandable) - .find(">.hitarea") - .removeClass(CLASSES.lastCollapsableHitarea) - .removeClass(CLASSES.lastExpandableHitarea); - $(branches).find("li").andSelf().prepareBranches(settings).applyClasses(settings, $(this).data("toggler")); - }).bind("remove", function(event, branches) { - var prev = $(branches).prev(); - var parent = $(branches).parent(); - $(branches).remove(); - prev.filter(":last-child").addClass(CLASSES.last) - .filter("." + CLASSES.expandable).replaceClass(CLASSES.last, CLASSES.lastExpandable).end() - .find(">.hitarea").replaceClass(CLASSES.expandableHitarea, CLASSES.lastExpandableHitarea).end() - .filter("." + CLASSES.collapsable).replaceClass(CLASSES.last, CLASSES.lastCollapsable).end() - .find(">.hitarea").replaceClass(CLASSES.collapsableHitarea, CLASSES.lastCollapsableHitarea); - if (parent.is(":not(:has(>))") && parent[0] != this) { - parent.parent().removeClass(CLASSES.collapsable).removeClass(CLASSES.expandable) - parent.siblings(".hitarea").andSelf().remove(); - } - }); - }; - -})(jQuery); diff --git a/vendor/golang.org/x/tools/godoc/static/jquery.treeview.js b/vendor/golang.org/x/tools/godoc/static/jquery.treeview.js deleted file mode 100644 index 356af2380..000000000 --- a/vendor/golang.org/x/tools/godoc/static/jquery.treeview.js +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Treeview 1.4.1 - jQuery plugin to hide and show branches of a tree - * - * http://bassistance.de/jquery-plugins/jquery-plugin-treeview/ - * http://docs.jquery.com/Plugins/Treeview - * - * Copyright (c) 2007 Jörn Zaefferer - * - * Dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - * - * Revision: $Id: jquery.treeview.js 5759 2008-07-01 07:50:28Z joern.zaefferer $ - * - */ - -;(function($) { - - // TODO rewrite as a widget, removing all the extra plugins - $.extend($.fn, { - swapClass: function(c1, c2) { - var c1Elements = this.filter('.' + c1); - this.filter('.' + c2).removeClass(c2).addClass(c1); - c1Elements.removeClass(c1).addClass(c2); - return this; - }, - replaceClass: function(c1, c2) { - return this.filter('.' + c1).removeClass(c1).addClass(c2).end(); - }, - hoverClass: function(className) { - className = className || "hover"; - return this.hover(function() { - $(this).addClass(className); - }, function() { - $(this).removeClass(className); - }); - }, - heightToggle: function(animated, callback) { - animated ? - this.animate({ height: "toggle" }, animated, callback) : - this.each(function(){ - jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ](); - if(callback) - callback.apply(this, arguments); - }); - }, - heightHide: function(animated, callback) { - if (animated) { - this.animate({ height: "hide" }, animated, callback); - } else { - this.hide(); - if (callback) - this.each(callback); - } - }, - prepareBranches: function(settings) { - if (!settings.prerendered) { - // mark last tree items - this.filter(":last-child:not(ul)").addClass(CLASSES.last); - // collapse whole tree, or only those marked as closed, anyway except those marked as open - this.filter((settings.collapsed ? "" : "." + CLASSES.closed) + ":not(." + CLASSES.open + ")").find(">ul").hide(); - } - // return all items with sublists - return this.filter(":has(>ul)"); - }, - applyClasses: function(settings, toggler) { - // TODO use event delegation - this.filter(":has(>ul):not(:has(>a))").find(">span").unbind("click.treeview").bind("click.treeview", function(event) { - // don't handle click events on children, eg. checkboxes - if ( this == event.target ) - toggler.apply($(this).next()); - }).add( $("a", this) ).hoverClass(); - - if (!settings.prerendered) { - // handle closed ones first - this.filter(":has(>ul:hidden)") - .addClass(CLASSES.expandable) - .replaceClass(CLASSES.last, CLASSES.lastExpandable); - - // handle open ones - this.not(":has(>ul:hidden)") - .addClass(CLASSES.collapsable) - .replaceClass(CLASSES.last, CLASSES.lastCollapsable); - - // create hitarea if not present - var hitarea = this.find("div." + CLASSES.hitarea); - if (!hitarea.length) - hitarea = this.prepend("
    ").find("div." + CLASSES.hitarea); - hitarea.removeClass().addClass(CLASSES.hitarea).each(function() { - var classes = ""; - $.each($(this).parent().attr("class").split(" "), function() { - classes += this + "-hitarea "; - }); - $(this).addClass( classes ); - }) - } - - // apply event to hitarea - this.find("div." + CLASSES.hitarea).click( toggler ); - }, - treeview: function(settings) { - - settings = $.extend({ - cookieId: "treeview" - }, settings); - - if ( settings.toggle ) { - var callback = settings.toggle; - settings.toggle = function() { - return callback.apply($(this).parent()[0], arguments); - }; - } - - // factory for treecontroller - function treeController(tree, control) { - // factory for click handlers - function handler(filter) { - return function() { - // reuse toggle event handler, applying the elements to toggle - // start searching for all hitareas - toggler.apply( $("div." + CLASSES.hitarea, tree).filter(function() { - // for plain toggle, no filter is provided, otherwise we need to check the parent element - return filter ? $(this).parent("." + filter).length : true; - }) ); - return false; - }; - } - // click on first element to collapse tree - $("a:eq(0)", control).click( handler(CLASSES.collapsable) ); - // click on second to expand tree - $("a:eq(1)", control).click( handler(CLASSES.expandable) ); - // click on third to toggle tree - $("a:eq(2)", control).click( handler() ); - } - - // handle toggle event - function toggler() { - $(this) - .parent() - // swap classes for hitarea - .find(">.hitarea") - .swapClass( CLASSES.collapsableHitarea, CLASSES.expandableHitarea ) - .swapClass( CLASSES.lastCollapsableHitarea, CLASSES.lastExpandableHitarea ) - .end() - // swap classes for parent li - .swapClass( CLASSES.collapsable, CLASSES.expandable ) - .swapClass( CLASSES.lastCollapsable, CLASSES.lastExpandable ) - // find child lists - .find( ">ul" ) - // toggle them - .heightToggle( settings.animated, settings.toggle ); - if ( settings.unique ) { - $(this).parent() - .siblings() - // swap classes for hitarea - .find(">.hitarea") - .replaceClass( CLASSES.collapsableHitarea, CLASSES.expandableHitarea ) - .replaceClass( CLASSES.lastCollapsableHitarea, CLASSES.lastExpandableHitarea ) - .end() - .replaceClass( CLASSES.collapsable, CLASSES.expandable ) - .replaceClass( CLASSES.lastCollapsable, CLASSES.lastExpandable ) - .find( ">ul" ) - .heightHide( settings.animated, settings.toggle ); - } - } - this.data("toggler", toggler); - - function serialize() { - function binary(arg) { - return arg ? 1 : 0; - } - var data = []; - branches.each(function(i, e) { - data[i] = $(e).is(":has(>ul:visible)") ? 1 : 0; - }); - $.cookie(settings.cookieId, data.join(""), settings.cookieOptions ); - } - - function deserialize() { - var stored = $.cookie(settings.cookieId); - if ( stored ) { - var data = stored.split(""); - branches.each(function(i, e) { - $(e).find(">ul")[ parseInt(data[i]) ? "show" : "hide" ](); - }); - } - } - - // add treeview class to activate styles - this.addClass("treeview"); - - // prepare branches and find all tree items with child lists - var branches = this.find("li").prepareBranches(settings); - - switch(settings.persist) { - case "cookie": - var toggleCallback = settings.toggle; - settings.toggle = function() { - serialize(); - if (toggleCallback) { - toggleCallback.apply(this, arguments); - } - }; - deserialize(); - break; - case "location": - var current = this.find("a").filter(function() { - return this.href.toLowerCase() == location.href.toLowerCase(); - }); - if ( current.length ) { - // TODO update the open/closed classes - var items = current.addClass("selected").parents("ul, li").add( current.next() ).show(); - if (settings.prerendered) { - // if prerendered is on, replicate the basic class swapping - items.filter("li") - .swapClass( CLASSES.collapsable, CLASSES.expandable ) - .swapClass( CLASSES.lastCollapsable, CLASSES.lastExpandable ) - .find(">.hitarea") - .swapClass( CLASSES.collapsableHitarea, CLASSES.expandableHitarea ) - .swapClass( CLASSES.lastCollapsableHitarea, CLASSES.lastExpandableHitarea ); - } - } - break; - } - - branches.applyClasses(settings, toggler); - - // if control option is set, create the treecontroller and show it - if ( settings.control ) { - treeController(this, settings.control); - $(settings.control).show(); - } - - return this; - } - }); - - // classes used by the plugin - // need to be styled via external stylesheet, see first example - $.treeview = {}; - var CLASSES = ($.treeview.classes = { - open: "open", - closed: "closed", - expandable: "expandable", - expandableHitarea: "expandable-hitarea", - lastExpandableHitarea: "lastExpandable-hitarea", - collapsable: "collapsable", - collapsableHitarea: "collapsable-hitarea", - lastCollapsableHitarea: "lastCollapsable-hitarea", - lastCollapsable: "lastCollapsable", - lastExpandable: "lastExpandable", - last: "last", - hitarea: "hitarea" - }); - -})(jQuery); diff --git a/vendor/golang.org/x/tools/godoc/static/makestatic.go b/vendor/golang.org/x/tools/godoc/static/makestatic.go deleted file mode 100644 index 0f910f0c4..000000000 --- a/vendor/golang.org/x/tools/godoc/static/makestatic.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// Command makestatic writes the generated file buffer to "static.go". -// It is intended to be invoked via "go generate" (directive in "gen.go"). -package main - -import ( - "fmt" - "io/ioutil" - "os" - - "golang.org/x/tools/godoc/static" -) - -func main() { - if err := makestatic(); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } -} - -func makestatic() error { - buf, err := static.Generate() - if err != nil { - return fmt.Errorf("error while generating static.go: %v\n", err) - } - err = ioutil.WriteFile("static.go", buf, 0666) - if err != nil { - return fmt.Errorf("error while writing static.go: %v\n", err) - } - return nil -} diff --git a/vendor/golang.org/x/tools/godoc/static/methodset.html b/vendor/golang.org/x/tools/godoc/static/methodset.html deleted file mode 100644 index 1b339e3c3..000000000 --- a/vendor/golang.org/x/tools/godoc/static/methodset.html +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/vendor/golang.org/x/tools/godoc/static/opensearch.xml b/vendor/golang.org/x/tools/godoc/static/opensearch.xml deleted file mode 100644 index 1b652db37..000000000 --- a/vendor/golang.org/x/tools/godoc/static/opensearch.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - godoc - The Go Programming Language - go golang - - - /favicon.ico - UTF-8 - UTF-8 - diff --git a/vendor/golang.org/x/tools/godoc/static/package.html b/vendor/golang.org/x/tools/godoc/static/package.html deleted file mode 100644 index c1ea0c6e3..000000000 --- a/vendor/golang.org/x/tools/godoc/static/package.html +++ /dev/null @@ -1,292 +0,0 @@ - - -{{with .PDoc}} - - - {{if $.IsMain}} - {{/* command documentation */}} - {{comment_html .Doc}} - {{else}} - {{/* package documentation */}} -
    -
    -
    import "{{html .ImportPath}}"
    -
    -
    -
    Overview
    -
    Index
    - {{if $.Examples}} -
    Examples
    - {{end}} - {{if $.Dirs}} -
    Subdirectories
    - {{end}} -
    -
    - -
    - -
    -

    Overview ▾

    - {{comment_html .Doc}} - {{example_html $ ""}} -
    -
    - -
    - -
    -

    Index ▾

    - - -
    -
    - {{if .Consts}} -
    Constants
    - {{end}} - {{if .Vars}} -
    Variables
    - {{end}} - {{range .Funcs}} - {{$name_html := html .Name}} -
    {{node_html $ .Decl false | sanitize}}
    - {{end}} - {{range .Types}} - {{$tname_html := html .Name}} -
    type {{$tname_html}}
    - {{range .Funcs}} - {{$name_html := html .Name}} -
        {{node_html $ .Decl false | sanitize}}
    - {{end}} - {{range .Methods}} - {{$name_html := html .Name}} -
        {{node_html $ .Decl false | sanitize}}
    - {{end}} - {{end}} - {{if $.Notes}} - {{range $marker, $item := $.Notes}} -
    {{noteTitle $marker | html}}s
    - {{end}} - {{end}} -
    -
    - - {{if $.Examples}} -
    -

    Examples

    - -
    - {{range $.Examples}} -
    {{example_name .Name}}
    - {{end}} -
    -
    - {{end}} - - {{with .Filenames}} -

    Package files

    -

    - - {{range .}} - {{.|filename|html}} - {{end}} - -

    - {{end}} -
    -
    - - {{if ne $.CallGraph "null"}} - - {{end}} - - {{with .Consts}} -

    Constants

    - {{range .}} - {{comment_html .Doc}} -
    {{node_html $ .Decl true}}
    - {{end}} - {{end}} - {{with .Vars}} -

    Variables

    - {{range .}} - {{comment_html .Doc}} -
    {{node_html $ .Decl true}}
    - {{end}} - {{end}} - {{range .Funcs}} - {{/* Name is a string - no need for FSet */}} - {{$name_html := html .Name}} -

    func {{$name_html}} - - {{$since := since "func" "" .Name $.PDoc.ImportPath}} - {{if $since}}{{$since}}{{end}} -

    -
    {{node_html $ .Decl true}}
    - {{comment_html .Doc}} - {{example_html $ .Name}} - {{callgraph_html $ "" .Name}} - - {{end}} - {{range .Types}} - {{$tname := .Name}} - {{$tname_html := html .Name}} -

    type {{$tname_html}} - - {{$since := since "type" "" .Name $.PDoc.ImportPath}} - {{if $since}}{{$since}}{{end}} -

    - {{comment_html .Doc}} -
    {{node_html $ .Decl true}}
    - - {{range .Consts}} - {{comment_html .Doc}} -
    {{node_html $ .Decl true}}
    - {{end}} - - {{range .Vars}} - {{comment_html .Doc}} -
    {{node_html $ .Decl true}}
    - {{end}} - - {{example_html $ $tname}} - {{implements_html $ $tname}} - {{methodset_html $ $tname}} - - {{range .Funcs}} - {{$name_html := html .Name}} -

    func {{$name_html}} - - {{$since := since "func" "" .Name $.PDoc.ImportPath}} - {{if $since}}{{$since}}{{end}} -

    -
    {{node_html $ .Decl true}}
    - {{comment_html .Doc}} - {{example_html $ .Name}} - {{callgraph_html $ "" .Name}} - {{end}} - - {{range .Methods}} - {{$name_html := html .Name}} -

    func ({{html .Recv}}) {{$name_html}} - - {{$since := since "method" .Recv .Name $.PDoc.ImportPath}} - {{if $since}}{{$since}}{{end}} -

    -
    {{node_html $ .Decl true}}
    - {{comment_html .Doc}} - {{$name := printf "%s_%s" $tname .Name}} - {{example_html $ $name}} - {{callgraph_html $ .Recv .Name}} - {{end}} - {{end}} - {{end}} - - {{with $.Notes}} - {{range $marker, $content := .}} -

    {{noteTitle $marker | html}}s

    -
      - {{range .}} -
    • {{comment_html .Body}}
    • - {{end}} -
    - {{end}} - {{end}} -{{end}} - -{{with .PAst}} - {{range $filename, $ast := .}} - {{$filename|filename|html}}:
    {{node_html $ $ast false}}
    - {{end}} -{{end}} - -{{with .Dirs}} - {{/* DirList entries are numbers and strings - no need for FSet */}} - {{if $.PDoc}} -

    Subdirectories

    - {{end}} -
    -
    - - - - - - {{if not ((eq $.Dirname "/src/cmd") $.DirFlat)}} - - - - {{end}} - - {{range .List}} - - {{if $.DirFlat}} - {{if .HasPkg}} - - {{end}} - {{else}} - - {{end}} - - - {{end}} -
    NameSynopsis
    ..
    - {{html .Path}} - - {{html .Name}} - - {{html .Synopsis}} -
    -
    -{{end}} diff --git a/vendor/golang.org/x/tools/godoc/static/packageroot.html b/vendor/golang.org/x/tools/godoc/static/packageroot.html deleted file mode 100644 index e8b2feee7..000000000 --- a/vendor/golang.org/x/tools/godoc/static/packageroot.html +++ /dev/null @@ -1,150 +0,0 @@ - - -{{with .PAst}} - {{range $filename, $ast := .}} - {{$filename|filename|html}}:
    {{node_html $ $ast false}}
    - {{end}} -{{end}} - -{{with .Dirs}} - {{/* DirList entries are numbers and strings - no need for FSet */}} - {{if $.PDoc}} -

    Subdirectories

    - {{end}} -
    -
    -
    Standard library
    - {{if hasThirdParty .List }} -
    Third party
    - {{end}} -
    Other packages
    -
    Sub-repositories
    -
    Community
    -
    -
    - -
    - -
    -

    Standard library ▾

    - -
    - - - - - - - {{range .List}} - - {{if eq .RootType "GOROOT"}} - {{if $.DirFlat}} - {{if .HasPkg}} - - {{end}} - {{else}} - - {{end}} - - {{end}} - - {{end}} -
    NameSynopsis
    - {{html .Path}} - - {{html .Name}} - - {{html .Synopsis}} -
    -
    -
    -
    - - {{if hasThirdParty .List }} -
    - -
    -

    Third party ▾

    -
    - - - - - - - {{range .List}} - - {{if eq .RootType "GOPATH"}} - {{if $.DirFlat}} - {{if .HasPkg}} - - {{end}} - {{else}} - - {{end}} - - {{end}} - - {{end}} -
    NameSynopsis
    - {{html .Path}} - - {{html .Name}} - - {{html .Synopsis}} -
    -
    -
    -
    - {{end}} - -

    Other packages

    -

    Sub-repositories

    -

    - These packages are part of the Go Project but outside the main Go tree. - They are developed under looser compatibility requirements than the Go core. - Install them with "go get". -

    -
      -
    • benchmarks — benchmarks to measure Go as it is developed.
    • -
    • blogblog.golang.org's implementation.
    • -
    • buildbuild.golang.org's implementation.
    • -
    • crypto — additional cryptography packages.
    • -
    • debug — an experimental debugger for Go.
    • -
    • image — additional imaging packages.
    • -
    • mobile — experimental support for Go on mobile platforms.
    • -
    • net — additional networking packages.
    • -
    • perf — packages and tools for performance measurement, storage, and analysis.
    • -
    • review — a tool for working with Gerrit code reviews.
    • -
    • sync — additional concurrency primitives.
    • -
    • sys — packages for making system calls.
    • -
    • text — packages for working with text.
    • -
    • time — additional time packages.
    • -
    • tools — godoc, goimports, gorename, and other tools.
    • -
    • tourtour.golang.org's implementation.
    • -
    • exp — experimental and deprecated packages (handle with care; may change without warning).
    • -
    - -

    Community

    -

    - These services can help you find Open Source packages provided by the community. -

    - -{{end}} diff --git a/vendor/golang.org/x/tools/godoc/static/play.js b/vendor/golang.org/x/tools/godoc/static/play.js deleted file mode 100644 index 6adbd6cdf..000000000 --- a/vendor/golang.org/x/tools/godoc/static/play.js +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -function initPlayground(transport) { - 'use strict'; - - function text(node) { - var s = ''; - for (var i = 0; i < node.childNodes.length; i++) { - var n = node.childNodes[i]; - if (n.nodeType === 1) { - if (n.tagName === 'BUTTON') continue - if (n.tagName === 'SPAN' && n.className === 'number') continue; - if (n.tagName === 'DIV' || n.tagName == 'BR') { - s += "\n"; - } - s += text(n); - continue; - } - if (n.nodeType === 3) { - s += n.nodeValue; - } - } - return s.replace('\xA0', ' '); // replace non-breaking spaces - } - - // When presenter notes are enabled, the index passed - // here will identify the playground to be synced - function init(code, index) { - var output = document.createElement('div'); - var outpre = document.createElement('pre'); - var running; - - if ($ && $(output).resizable) { - $(output).resizable({ - handles: 'n,w,nw', - minHeight: 27, - minWidth: 135, - maxHeight: 608, - maxWidth: 990 - }); - } - - function onKill() { - if (running) running.Kill(); - if (window.notesEnabled) updatePlayStorage('onKill', index); - } - - function onRun(e) { - var sk = e.shiftKey || localStorage.getItem('play-shiftKey') === 'true'; - if (running) running.Kill(); - output.style.display = 'block'; - outpre.innerHTML = ''; - run1.style.display = 'none'; - var options = {Race: sk}; - running = transport.Run(text(code), PlaygroundOutput(outpre), options); - if (window.notesEnabled) updatePlayStorage('onRun', index, e); - } - - function onClose() { - if (running) running.Kill(); - output.style.display = 'none'; - run1.style.display = 'inline-block'; - if (window.notesEnabled) updatePlayStorage('onClose', index); - } - - if (window.notesEnabled) { - playgroundHandlers.onRun.push(onRun); - playgroundHandlers.onClose.push(onClose); - playgroundHandlers.onKill.push(onKill); - } - - var run1 = document.createElement('button'); - run1.innerHTML = 'Run'; - run1.className = 'run'; - run1.addEventListener("click", onRun, false); - var run2 = document.createElement('button'); - run2.className = 'run'; - run2.innerHTML = 'Run'; - run2.addEventListener("click", onRun, false); - var kill = document.createElement('button'); - kill.className = 'kill'; - kill.innerHTML = 'Kill'; - kill.addEventListener("click", onKill, false); - var close = document.createElement('button'); - close.className = 'close'; - close.innerHTML = 'Close'; - close.addEventListener("click", onClose, false); - - var button = document.createElement('div'); - button.classList.add('buttons'); - button.appendChild(run1); - // Hack to simulate insertAfter - code.parentNode.insertBefore(button, code.nextSibling); - - var buttons = document.createElement('div'); - buttons.classList.add('buttons'); - buttons.appendChild(run2); - buttons.appendChild(kill); - buttons.appendChild(close); - - output.classList.add('output'); - output.appendChild(buttons); - output.appendChild(outpre); - output.style.display = 'none'; - code.parentNode.insertBefore(output, button.nextSibling); - } - - var play = document.querySelectorAll('div.playground'); - for (var i = 0; i < play.length; i++) { - init(play[i], i); - } -} diff --git a/vendor/golang.org/x/tools/godoc/static/playground.js b/vendor/golang.org/x/tools/godoc/static/playground.js deleted file mode 100644 index 0ab0b2f6f..000000000 --- a/vendor/golang.org/x/tools/godoc/static/playground.js +++ /dev/null @@ -1,544 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* -In the absence of any formal way to specify interfaces in JavaScript, -here's a skeleton implementation of a playground transport. - - function Transport() { - // Set up any transport state (eg, make a websocket connection). - return { - Run: function(body, output, options) { - // Compile and run the program 'body' with 'options'. - // Call the 'output' callback to display program output. - return { - Kill: function() { - // Kill the running program. - } - }; - } - }; - } - - // The output callback is called multiple times, and each time it is - // passed an object of this form. - var write = { - Kind: 'string', // 'start', 'stdout', 'stderr', 'end' - Body: 'string' // content of write or end status message - } - - // The first call must be of Kind 'start' with no body. - // Subsequent calls may be of Kind 'stdout' or 'stderr' - // and must have a non-null Body string. - // The final call should be of Kind 'end' with an optional - // Body string, signifying a failure ("killed", for example). - - // The output callback must be of this form. - // See PlaygroundOutput (below) for an implementation. - function outputCallback(write) { - } -*/ - -// HTTPTransport is the default transport. -// enableVet enables running vet if a program was compiled and ran successfully. -// If vet returned any errors, display them before the output of a program. -function HTTPTransport(enableVet) { - 'use strict'; - - function playback(output, data) { - // Backwards compatibility: default values do not affect the output. - var events = data.Events || []; - var errors = data.Errors || ""; - var status = data.Status || 0; - var isTest = data.IsTest || false; - var testsFailed = data.TestsFailed || 0; - - var timeout; - output({Kind: 'start'}); - function next() { - if (!events || events.length === 0) { - if (isTest) { - if (testsFailed > 0) { - output({Kind: 'system', Body: '\n'+testsFailed+' test'+(testsFailed>1?'s':'')+' failed.'}); - } else { - output({Kind: 'system', Body: '\nAll tests passed.'}); - } - } else { - if (status > 0) { - output({Kind: 'end', Body: 'status ' + status + '.'}); - } else { - if (errors !== "") { - // errors are displayed only in the case of timeout. - output({Kind: 'end', Body: errors + '.'}); - } else { - output({Kind: 'end'}); - } - } - } - return; - } - var e = events.shift(); - if (e.Delay === 0) { - output({Kind: e.Kind, Body: e.Message}); - next(); - return; - } - timeout = setTimeout(function() { - output({Kind: e.Kind, Body: e.Message}); - next(); - }, e.Delay / 1000000); - } - next(); - return { - Stop: function() { - clearTimeout(timeout); - } - }; - } - - function error(output, msg) { - output({Kind: 'start'}); - output({Kind: 'stderr', Body: msg}); - output({Kind: 'end'}); - } - - function buildFailed(output, msg) { - output({Kind: 'start'}); - output({Kind: 'stderr', Body: msg}); - output({Kind: 'system', Body: '\nGo build failed.'}); - } - - var seq = 0; - return { - Run: function(body, output, options) { - seq++; - var cur = seq; - var playing; - $.ajax('/compile', { - type: 'POST', - data: {'version': 2, 'body': body, 'withVet': enableVet}, - dataType: 'json', - success: function(data) { - if (seq != cur) return; - if (!data) return; - if (playing != null) playing.Stop(); - if (data.Errors) { - if (data.Errors === 'process took too long') { - // Playback the output that was captured before the timeout. - playing = playback(output, data); - } else { - buildFailed(output, data.Errors); - } - return; - } - if (!data.Events) { - data.Events = []; - } - if (data.VetErrors) { - // Inject errors from the vet as the first events in the output. - data.Events.unshift({Message: 'Go vet exited.\n\n', Kind: 'system', Delay: 0}); - data.Events.unshift({Message: data.VetErrors, Kind: 'stderr', Delay: 0}); - } - - if (!enableVet || data.VetOK || data.VetErrors) { - playing = playback(output, data); - return; - } - - // In case the server support doesn't support - // compile+vet in same request signaled by the - // 'withVet' parameter above, also try the old way. - // TODO: remove this when it falls out of use. - // It is 2019-05-13 now. - $.ajax("/vet", { - data: {"body": body}, - type: "POST", - dataType: "json", - success: function(dataVet) { - if (dataVet.Errors) { - // inject errors from the vet as the first events in the output - data.Events.unshift({Message: 'Go vet exited.\n\n', Kind: 'system', Delay: 0}); - data.Events.unshift({Message: dataVet.Errors, Kind: 'stderr', Delay: 0}); - } - playing = playback(output, data); - }, - error: function() { - playing = playback(output, data); - } - }); - }, - error: function() { - error(output, 'Error communicating with remote server.'); - } - }); - return { - Kill: function() { - if (playing != null) playing.Stop(); - output({Kind: 'end', Body: 'killed'}); - } - }; - } - }; -} - -function SocketTransport() { - 'use strict'; - - var id = 0; - var outputs = {}; - var started = {}; - var websocket; - if (window.location.protocol == "http:") { - websocket = new WebSocket('ws://' + window.location.host + '/socket'); - } else if (window.location.protocol == "https:") { - websocket = new WebSocket('wss://' + window.location.host + '/socket'); - } - - websocket.onclose = function() { - console.log('websocket connection closed'); - }; - - websocket.onmessage = function(e) { - var m = JSON.parse(e.data); - var output = outputs[m.Id]; - if (output === null) - return; - if (!started[m.Id]) { - output({Kind: 'start'}); - started[m.Id] = true; - } - output({Kind: m.Kind, Body: m.Body}); - }; - - function send(m) { - websocket.send(JSON.stringify(m)); - } - - return { - Run: function(body, output, options) { - var thisID = id+''; - id++; - outputs[thisID] = output; - send({Id: thisID, Kind: 'run', Body: body, Options: options}); - return { - Kill: function() { - send({Id: thisID, Kind: 'kill'}); - } - }; - } - }; -} - -function PlaygroundOutput(el) { - 'use strict'; - - return function(write) { - if (write.Kind == 'start') { - el.innerHTML = ''; - return; - } - - var cl = 'system'; - if (write.Kind == 'stdout' || write.Kind == 'stderr') - cl = write.Kind; - - var m = write.Body; - if (write.Kind == 'end') { - m = '\nProgram exited' + (m?(': '+m):'.'); - } - - if (m.indexOf('IMAGE:') === 0) { - // TODO(adg): buffer all writes before creating image - var url = 'data:image/png;base64,' + m.substr(6); - var img = document.createElement('img'); - img.src = url; - el.appendChild(img); - return; - } - - // ^L clears the screen. - var s = m.split('\x0c'); - if (s.length > 1) { - el.innerHTML = ''; - m = s.pop(); - } - - m = m.replace(/&/g, '&'); - m = m.replace(//g, '>'); - - var needScroll = (el.scrollTop + el.offsetHeight) == el.scrollHeight; - - var span = document.createElement('span'); - span.className = cl; - span.innerHTML = m; - el.appendChild(span); - - if (needScroll) - el.scrollTop = el.scrollHeight - el.offsetHeight; - }; -} - -(function() { - function lineHighlight(error) { - var regex = /prog.go:([0-9]+)/g; - var r = regex.exec(error); - while (r) { - $(".lines div").eq(r[1]-1).addClass("lineerror"); - r = regex.exec(error); - } - } - function highlightOutput(wrappedOutput) { - return function(write) { - if (write.Body) lineHighlight(write.Body); - wrappedOutput(write); - }; - } - function lineClear() { - $(".lineerror").removeClass("lineerror"); - } - - // opts is an object with these keys - // codeEl - code editor element - // outputEl - program output element - // runEl - run button element - // fmtEl - fmt button element (optional) - // fmtImportEl - fmt "imports" checkbox element (optional) - // shareEl - share button element (optional) - // shareURLEl - share URL text input element (optional) - // shareRedirect - base URL to redirect to on share (optional) - // toysEl - toys select element (optional) - // enableHistory - enable using HTML5 history API (optional) - // transport - playground transport to use (default is HTTPTransport) - // enableShortcuts - whether to enable shortcuts (Ctrl+S/Cmd+S to save) (default is false) - // enableVet - enable running vet and displaying its errors - function playground(opts) { - var code = $(opts.codeEl); - var transport = opts['transport'] || new HTTPTransport(opts['enableVet']); - var running; - - // autoindent helpers. - function insertTabs(n) { - // find the selection start and end - var start = code[0].selectionStart; - var end = code[0].selectionEnd; - // split the textarea content into two, and insert n tabs - var v = code[0].value; - var u = v.substr(0, start); - for (var i=0; i 0) { - curpos--; - if (el.value[curpos] == "\t") { - tabs++; - } else if (tabs > 0 || el.value[curpos] == "\n") { - break; - } - } - setTimeout(function() { - insertTabs(tabs); - }, 1); - } - - // NOTE(cbro): e is a jQuery event, not a DOM event. - function handleSaveShortcut(e) { - if (e.isDefaultPrevented()) return false; - if (!e.metaKey && !e.ctrlKey) return false; - if (e.key != "S" && e.key != "s") return false; - - e.preventDefault(); - - // Share and save - share(function(url) { - window.location.href = url + ".go?download=true"; - }); - - return true; - } - - function keyHandler(e) { - if (opts.enableShortcuts && handleSaveShortcut(e)) return; - - if (e.keyCode == 9 && !e.ctrlKey) { // tab (but not ctrl-tab) - insertTabs(1); - e.preventDefault(); - return false; - } - if (e.keyCode == 13) { // enter - if (e.shiftKey) { // +shift - run(); - e.preventDefault(); - return false; - } if (e.ctrlKey) { // +control - fmt(); - e.preventDefault(); - } else { - autoindent(e.target); - } - } - return true; - } - code.unbind('keydown').bind('keydown', keyHandler); - var outdiv = $(opts.outputEl).empty(); - var output = $('
    ').appendTo(outdiv);
    -
    -    function body() {
    -      return $(opts.codeEl).val();
    -    }
    -    function setBody(text) {
    -      $(opts.codeEl).val(text);
    -    }
    -    function origin(href) {
    -      return (""+href).split("/").slice(0, 3).join("/");
    -    }
    -
    -    var pushedEmpty = (window.location.pathname == "/");
    -    function inputChanged() {
    -      if (pushedEmpty) {
    -        return;
    -      }
    -      pushedEmpty = true;
    -      $(opts.shareURLEl).hide();
    -      window.history.pushState(null, "", "/");
    -    }
    -    function popState(e) {
    -      if (e === null) {
    -        return;
    -      }
    -      if (e && e.state && e.state.code) {
    -        setBody(e.state.code);
    -      }
    -    }
    -    var rewriteHistory = false;
    -    if (window.history && window.history.pushState && window.addEventListener && opts.enableHistory) {
    -      rewriteHistory = true;
    -      code[0].addEventListener('input', inputChanged);
    -      window.addEventListener('popstate', popState);
    -    }
    -
    -    function setError(error) {
    -      if (running) running.Kill();
    -      lineClear();
    -      lineHighlight(error);
    -      output.empty().addClass("error").text(error);
    -    }
    -    function loading() {
    -      lineClear();
    -      if (running) running.Kill();
    -      output.removeClass("error").text('Waiting for remote server...');
    -    }
    -    function run() {
    -      loading();
    -      running = transport.Run(body(), highlightOutput(PlaygroundOutput(output[0])));
    -    }
    -
    -    function fmt() {
    -      loading();
    -      var data = {"body": body()};
    -      if ($(opts.fmtImportEl).is(":checked")) {
    -        data["imports"] = "true";
    -      }
    -      $.ajax("/fmt", {
    -        data: data,
    -        type: "POST",
    -        dataType: "json",
    -        success: function(data) {
    -          if (data.Error) {
    -            setError(data.Error);
    -          } else {
    -            setBody(data.Body);
    -            setError("");
    -          }
    -        }
    -      });
    -    }
    -
    -    var shareURL; // jQuery element to show the shared URL.
    -    var sharing = false; // true if there is a pending request.
    -    var shareCallbacks = [];
    -    function share(opt_callback) {
    -      if (opt_callback) shareCallbacks.push(opt_callback);
    -
    -      if (sharing) return;
    -      sharing = true;
    -
    -      var sharingData = body();
    -      $.ajax("/share", {
    -        processData: false,
    -        data: sharingData,
    -        type: "POST",
    -        contentType: "text/plain; charset=utf-8",
    -        complete: function(xhr) {
    -          sharing = false;
    -          if (xhr.status != 200) {
    -            alert("Server error; try again.");
    -            return;
    -          }
    -          if (opts.shareRedirect) {
    -            window.location = opts.shareRedirect + xhr.responseText;
    -          }
    -          var path = "/p/" + xhr.responseText;
    -          var url = origin(window.location) + path;
    -
    -          for (var i = 0; i < shareCallbacks.length; i++) {
    -            shareCallbacks[i](url);
    -          }
    -          shareCallbacks = [];
    -
    -          if (shareURL) {
    -            shareURL.show().val(url).focus().select();
    -
    -            if (rewriteHistory) {
    -              var historyData = {"code": sharingData};
    -              window.history.pushState(historyData, "", path);
    -              pushedEmpty = false;
    -            }
    -          }
    -        }
    -      });
    -    }
    -
    -    $(opts.runEl).click(run);
    -    $(opts.fmtEl).click(fmt);
    -
    -    if (opts.shareEl !== null && (opts.shareURLEl !== null || opts.shareRedirect !== null)) {
    -      if (opts.shareURLEl) {
    -        shareURL = $(opts.shareURLEl).hide();
    -      }
    -      $(opts.shareEl).click(function() {
    -        share();
    -      });
    -    }
    -
    -    if (opts.toysEl !== null) {
    -      $(opts.toysEl).bind('change', function() {
    -        var toy = $(this).val();
    -        $.ajax("/doc/play/"+toy, {
    -          processData: false,
    -          type: "GET",
    -          complete: function(xhr) {
    -            if (xhr.status != 200) {
    -              alert("Server error; try again.");
    -              return;
    -            }
    -            setBody(xhr.responseText);
    -          }
    -        });
    -      });
    -    }
    -  }
    -
    -  window.playground = playground;
    -})();
    diff --git a/vendor/golang.org/x/tools/godoc/static/search.html b/vendor/golang.org/x/tools/godoc/static/search.html
    deleted file mode 100644
    index 3714e1d5e..000000000
    --- a/vendor/golang.org/x/tools/godoc/static/search.html
    +++ /dev/null
    @@ -1,66 +0,0 @@
    -
    -
    -{{ $colCount := tocColCount .}}
    -{{/* Generate the TOC */}}
    -
    -
    -{{with .Alert}}
    -	

    - {{html .}} -

    -{{end}} -{{with .Alt}} -

    - Did you mean: - {{range .Alts}} - {{html .}} - {{end}} -

    -{{end}} diff --git a/vendor/golang.org/x/tools/godoc/static/searchcode.html b/vendor/golang.org/x/tools/godoc/static/searchcode.html deleted file mode 100644 index a032e642c..000000000 --- a/vendor/golang.org/x/tools/godoc/static/searchcode.html +++ /dev/null @@ -1,64 +0,0 @@ - -{{$query_url := urlquery .Query}} -{{if not .Idents}} - {{with .Pak}} -

    Package {{html $.Query}}

    -

    - - {{range .}} - {{$pkg_html := pkgLink .Pak.Path | html}} - - {{end}} -
    {{$pkg_html}}
    -

    - {{end}} -{{end}} -{{with .Hit}} - {{with .Decls}} -

    Package-level declarations

    - {{range .}} - {{$pkg_html := pkgLink .Pak.Path | html}} -

    package {{html .Pak.Name}}

    - {{range .Files}} - {{$file := .File.Path}} - {{range .Groups}} - {{range .}} - {{$line := infoLine .}} - {{$file}}:{{$line}} - {{infoSnippet_html .}} - {{end}} - {{end}} - {{end}} - {{end}} - {{end}} - {{with .Others}} -

    Local declarations and uses

    - {{range .}} - {{$pkg_html := pkgLink .Pak.Path | html}} -

    package {{html .Pak.Name}}

    - {{range .Files}} - {{$file := .File.Path}} - {{$file}} - - {{range .Groups}} - - - - - - - {{end}} -
    {{index . 0 | infoKind_html}} - {{range .}} - {{$line := infoLine .}} - {{$line}} - {{end}} -
    - {{end}} - {{end}} - {{end}} -{{end}} diff --git a/vendor/golang.org/x/tools/godoc/static/searchdoc.html b/vendor/golang.org/x/tools/godoc/static/searchdoc.html deleted file mode 100644 index 679c02cf3..000000000 --- a/vendor/golang.org/x/tools/godoc/static/searchdoc.html +++ /dev/null @@ -1,24 +0,0 @@ - -{{range $key, $val := .Idents}} - {{if $val}} -

    {{$key.Name}}

    - {{range $val}} - {{$pkg_html := pkgLink .Path | html}} - {{if eq "Packages" $key.Name}} - {{html .Path}} - {{else}} - {{$doc_html := docLink .Path .Name| html}} - {{html .Package}}.{{.Name}} - {{end}} - {{if .Doc}} -

    {{comment_html .Doc}}

    - {{else}} -

    No documentation available

    - {{end}} - {{end}} - {{end}} -{{end}} diff --git a/vendor/golang.org/x/tools/godoc/static/searchtxt.html b/vendor/golang.org/x/tools/godoc/static/searchtxt.html deleted file mode 100644 index 7e4a978c4..000000000 --- a/vendor/golang.org/x/tools/godoc/static/searchtxt.html +++ /dev/null @@ -1,42 +0,0 @@ - -{{$query_url := urlquery .Query}} -{{with .Textual}} - {{if $.Complete}} -

    {{html $.Found}} textual occurrences

    - {{else}} -

    More than {{html $.Found}} textual occurrences

    -

    - Not all files or lines containing "{{html $.Query}}" are shown. -

    - {{end}} -

    - - {{range .}} - {{$file := .Filename}} - - - - - - - - {{end}} - {{if not $.Complete}} - - {{end}} -
    - {{$file}}: - {{len .Lines}} - {{range .Lines}} - {{html .}} - {{end}} - {{if not $.Complete}} - ... - {{end}} -
    ...
    -

    -{{end}} diff --git a/vendor/golang.org/x/tools/godoc/static/static.go b/vendor/golang.org/x/tools/godoc/static/static.go deleted file mode 100644 index 46c1d2397..000000000 --- a/vendor/golang.org/x/tools/godoc/static/static.go +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Code generated by "makestatic"; DO NOT EDIT. - -package static - -var Files = map[string]string{ - "analysis/call3.png": "\x89PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\x00\x03N\x00\x00\x01\xea\x08\x03\x00\x00\x00\x04l\xeeb\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x02\xfdPLTE\x00\x01\x00\x04\x06\x03\x06\x09\x05\x0e\x10\x0d\x16\x17\x15$\x18\x0f\x1e\x1d\x17!#\x20#$\"$%#&(%)(\"()'-+\x1f*+),-+-/,41&J-\x1202/241S/\x0e564,7M796<:.:<9!?p=?\xb3Z2\xf5Sw\x99U\x89+\xdaI\xb3Y\x15`7N\xea\xd4U\xd5M\x1f\x07\xaa\xe8A\xe9x5\xdb\x89\xbb\xaa\xfbU\xa5N\xd3G\xd6\x89\xe2\x98\x1c\x16\x1d\xa0\x8d\xb4\x99U\x01v\xe3\xa4N\xa2t\x00\xeae\xfa\xd4\xcb'\"\xb5\xed\xaaR\xa7\xe9\"\xe3\xeb\xfc\xcd\x12\xd0i\x0cpT'\xca@w\x1d\xdb\x85w\xc9'\"{\xeaU\xa5\x8e2\x98J$\x96J\xcf6d$el\xa0\xff\x9f\x98B\xc8\xaa\xae\xdc\xe9I\xf3\x06\xf9\xca}I\x84L\xae\xd5\xeb&H\xd7\xc2TW\xda\xbc\xb07\x85\x9a\xb4*\xf6_w\xb2<7\x92\xcc\xd7\xe0\xe7\xd6\xbf(\xdd5m\xc1\x09ZZL\\UKg$=$\xd5\xec\xcdMM_\xba4uj\x1d\x9d\xae\x9d3u\xc6R\xed\xd1\xb4\xf3\x89|\xf7\xe2\xa7\xf2\x874\xc5b\x13tr\x1egu\xea\xad\xaa\xaa\xaaa\xfb\xc3\xa1Z\xb6\xb7\x0e\xd4\xecR\x95:\xcb\xf1\xe6\xed\xa4\xac\xb9Y\xdai\x0b\\\xab\xeaW\xb9r\xe9\"\xd5\xd5N\x9b\x91\xf6\xb7H\x87\xf7\x88\xf1\x1fe\x9b\xfeA\xf8{\xcd\xd1\xa9b\xb2\xfa\xbb\x87\xc0f\x9c\xd4I?T\x99\xd2W}(r\x86\x1d\x08\xe3\x88\xa7\xc5\xf8\x8f\xb2M\xee\x7f\x0c;\xd9\xab\x9f\xb2N\xbf\x05\xb0\x05'u\xd2\x0fU\xa6\xd47vC'\xab\x84e\xadp0\x9b\xfe\xaf\xfb\xeft\xae\x9dV\xb9\xf0\x9d\x8dQ\xc4I\x9d\x0cB\x95\xc5S5\x03\xd0\xc9V\x98G\xff\xeb\xbf~\xffG?\xfc\xd1\x8fn\x0c\xaa\xbe\x91\xdb\xaf\xc9\x15\x03\xb6\xe2\xa8N\xa2n\xa8r\x7fu\x97\x98@:\x19\xc42\x8b\x91\xf3\x95\xdf\xcdso\xf5z;6\xe6\xac\xbc&\x8a\xd7\xca\xbd\xee\xfc\xa7.\xd2\xe2\x7f\x16\xdc\xfb\xd6{s\x9e\xfa\x8djR\xbc\xe6\x11\x04A:\xd9\xa3\xa5\x076\x16y\x9ex\x9d=\xb9\xb6v\xb1\xf7_\xfee\xb1\xa7\x85\xda\xf4\xc3\xbf\xf9\x9f\x7f\xf9\x17\x7f\xf1\xd7\x7f9s\xe6\xd2\xdf\xac^\xec\xf6>\xf5\xba<\xa3UIN}Wk\"\xe2\xacN\xba\xa1\xca\xf5\x8db\"\xe9d\x14\xcbl\x92\xaf\xdc\x91-l,\x11\x16\xef\xcc\xdbG\xaf\x8b\x84\xf5\x1d-O\x09\xe7D\xf1b\x8b[\xc8\xdf\xb93\xdfs\x91\x9f\x14\xc5s\x9d\x9d\xf3w\xb2f\xac\xd4\xbbso\xf6j:=T\xe4\xdd\xf7\x83\xf9\x9e\x03O\xec\xa3:\xfd\x93\xfb?L\xce\xcc\x9c\x94\x949{\xd2_}}o\xc7Na\x9f<\x9fC\x088\x1aE\x9c\xd5I/T\xf9\x0c\xf3+\x81t\x12\x0dc\x99#\xe7+{\xd7\x8a\x1d\xc2\x11\xf1\x99\xf5\xa2x\xbd\x85\x1e\xa2\x86\x960E\xc4\xacBv\xb8\xca_\xae\x9e\xa4\xc8:\xd1\xd2\x1cz\xdcY\xeb\xa5S-\x025m\x1f{`\x83\xe4\xee\xfb\xd6\xf8\xfdg>\xf4\xdf\xbb\xef?\xd2\x19\x0d\xb1.\x19\xddd|\xfdL\xd5\xf8\xc2a\x9d\xc4\xb0P\xe5\xfe\xea37n\xdcx\xa96\x912w\x8cb\x99e\x0c\xf2\x95\xbd-\xe29\xe1\x9a\xb8u\xad\xc8\x92]\x9f(\xcc\x16\x96\xb0\xe2\xac\xad\xecq\x1f\xfd\x0b?)r:=C\x1fvf\xd1\x87\xad9\xf4\xe1e\xaa\xa4\xac\xd3_L\x9a4I\\4i\xd2g\xfe7\x9fb\xd6\xad\xc98\x07v\xe2\xa4N\xba\xa1\xca\x17\xaa\x02$\xce\x90\x93Q,\xb3\x82~\xbe\xb2\xb7C<\xe7\x16%\x9d\xcey\xf3\xb7\x1e\xe9,\x91u\x92\xac\xe9dg~\xdc\xa4\xc8\xe9\xc4\xfe\x97t\xda7\x97\x8a\xd6\xa1\x1c\x9d\xfeI\xf8?\x7f\xfd\x97T\xa7\xcf\xfd\xa7\xbf:\xc5\x9fT\xb6!~o\x14qR'\xfdP\xe5^\xc6\xa9\x9a^\xedOK\x8cc\x8cb\x99#\xc2t\xca\x92u*Z~\x9d\x16\x94\xcb:md\x8f\x07\xa4\xa3ShR\xd4\xd3\xe95\xe1\x89\xd7.\x16-\x1f\x92t\xfa\xbe\xfb\xef\xbf\xff?\xa8NS\xfe\x9f\xfb\x1c?\x9b2\x97\xf5\x881\x10-\x8e\xea\xa4\x1b\xaa,\x91`\xd7N\xfa\xb1\xcc\x91\xf3\x959\x9d\xf2\xcb\xe9\xf3\xa1Ge\x9d\xf2\xd8\x05S\xe1J\xf5\xa4\xa8\xa7\xd39!O\x10J\xd8\x08\x9e*,\xde\xdbIm\x11\xbe\xder\xa0(\xe7e\x91\x9f\x1c\xea\xec\xec\x9c\xfflg\xe75\xf1\xb5N\xf7\xb3\x9dC\xbf|\xd6\xdd\xf9\x9axn~GG\xe7\xeb\xcc\x1d\xf9c\xdc\x7f\x90t\xea\xea\x98_t\xa0c\xa3\x20\xff&@\x05i7^\x060R\x9c\xd4\xc9\x20T\x99\x96\xb3K\xa7D9>\x19\xc42\x8b\x91\xf3\x95\x87\xe8\x81\xa5%[\xf0\xb4\x08\xc2jqh_Q\x96w\xed\x81\"\xf7Jv\x86\xf7L\xb6w\xedk\xacNh\xf2\x97\x82\xcc\x01\xf1;\xf4\xd1\xfd+\xf61\xd4w\xc4N7+s/\xbf(\xdfd\xf4\xf7\x7f\xf3\xdf$\x9d\x06_.\xf7f/\x97\xef\xf0kN\x0a\xfbM\x02`#\x8e\xea\x04\xac\x93\xb5SoR\x8f?x\x9e\xfd\xc3\xbb\xef^\xfb\xe5\xea\x9ck\xf2-\xb0\x7f\xf7W\xb2N\xa1*\xdb]\x05\xda\xcf\x96\x81\x9d@\xa78'z\x9d\x8e(?\xe89\xb4\xb8C\xd6\xe9G\xffE\xa3S_:n(\x1f]\xa0S\x9c\x13\xbdN\xe7\xd8\x109\xe5\xa2\xf0+\xe5\\0\xec\xe8\x04F\x19\xe8\x14\xd7\xbc.\x8d4h'\xf5\x19z\xc6\xf3lKG\xcb\xb3\x9e\xf5C\xd0i\x8c\x80Nq\x8d4\xd2\xf0\x9av\xd2\x80\xa1#Ox\xdd\xde'\x8e\x0c\x05\xbe\x8d\xfb\xb7\xd0\xc9a\xa0S\"\x02\x9d\xc6\x08\xe8\x94\x88@\xa71\x02:%0u\xd0\xc9a\xa0S\xc22\xb8a!\xbb\x05v\xc5!\xf8\xe4\x18\xd0)a\x99\xa3|A\xe3\xb3\xbb\xe0\x93S@\xa7De\x80}}\xf0C\xbf\xff\xde}\x0b\x13\xe5v\xc8\xf8\x07:%*\x03\x84df\xde\x97\x969{\xd2\xc3\xd0\xc9)\xa0S\xa22\xb8\xe7s\x9f\x9dt\x7fJJJf;\xc2V\x9c\x02:%,3\xa6\x97U\x1f\xba\xd0\xd5\xf5\x12\xbe/\xe8\x18\x8e\xea\xa4\x1b\xaa?\xe9\xfe\xaf\xbd\xcdM<\xff\xe5\xcfMz\xf0\xbb\xd0\xc9\x00\xe8\x94\xc0\xf4\x9e\xd0~\x80\x1c\xae\xd3\xfd\x8aM\x9f\xfb\xde\xab\xcfS\xb5\x1e|\xee\xd5_\x7f\xe5+\x01\x9d\xfe\xf5\xc1\x7f\xa5\x07\xb0\xafq\x13\x0f~\xf3\xd7\xaf\xfe\xec\xcb\xd0\xc9\x00\xe84\xa1\xe0u\x92O\xf6\x94S\xba/|\xf7\xed\x20\xbf\xbe?\xa0\xd3\x17\x7f\xa6\x18\x17\x9c\xf8\xec\xcf\xe5:\xd0I\x17\xe84\xa1\xe0ubC\x11\xf7\x7fK\xd1i\xd2\xaf\xe5\xff\x7fNO\xe6&M\x0a\xe8t\x9f|C\x117\xf1\xd5\xfb\xbe\xf2\xad\x9fC'#\xa0\xd3\x84\x82\xd7I\xe2\xb9\xcf\xcb\xff\xdf\xa7\xe8\xf4\xc5\xaf\xfe\xfc\xedW\x83:MR\x8eE\xa1\x89\xb7\x7f\xf6\xb5/\xdf\xf7M\xe8d\x00t\x9aP\x84\xe9\xf4\xe5\xaf)\x1a)'{\x9f}\x95^(\x05u\xfa\xc27\x95j\xc1\x09\xc6\xf3\xf7A'\x03\xa0\xd3\x84\x82\xd7\xe9K?{\xf5\xf9\xaf|\xe1UY\x91\xe7\xeeW\x86\"\xbe\xf9\xea\xcf>\x1f\xd4\xe9\xb9\xfb\xbe\xf5\xebW\x9f\xfb\x127\xf1\xa5\xef\xbd\xfa\xea7\x1f\x84N\x06@\xa7\x09\x05\x13I\xb9\x0az\xfb\xbb\x9f\xff\xcc\xfd_}5p\xc8\xf9\xee\xe7\xa5\x81\xf2\x9f=8\xe9\xfeo\x06uz\xfb\xb9/~v\xd2\x17\x9f\xe3&\xbe\xf7\xc5I\xf7}\xf9y\xe8d\x00t\x9aPp\xa7y#\x03:\xe9\x02\x9d&\x14\xd0it\x81N\x13\x0a\xe84\xba@\xa7\x09\x05t\x1a]\xa0\xd3\x84\x02:\x8d.\xd0iB\xa1\x1f\xa3\x12\x0bfs\x9a\x988\xaa\x93n\xa82\xe5\xcc\xfe\x9a\xba\xf6\x08\xed\x80B\xc4\xb0f\xdb9A\xf6\x9bU\x01j\x9c\xd4I?TY\x1cl\xacj\xbb\xd0^\xa5\x97\xb3\x0d\xd4D\x0ck\xb6\x1d\xc42[\xc6I\x9d\xf4C\x95\xc5\xc6\xean\xa6\x9a\xf6;v\x20\x12\xbaa\xcd6\x83\x1cY\xcb8\xa9\x93~\xa8rw\x95\xf4\xad\xdcQ\xde5\x12\x0d\xdd\x0c\x0a\x9b\x81N\x96qT'Q/T\xb9\xad:\x91~\x8af\x141\x0bk\xbe\xe8\x16\x84\xad\xbfY[8\xff\x89w\xb9R\xd3\xb0f\xcao\xca\x17\xbb\xbdO\xbd.j@,\xb3e\x9c\xd5I/TyO\xfd\x99]U\xb5\x87\x12*\x04vt0\x09k\xbe\xde\xd2\x92_\x94\xed\xdd\xb8v.\x9fBa\x1a\xd6,\x8a\x1d\x9e\xaf\xef\xed\xd8)\xecS\x15\x1a\xc52\x83H8\xab\x93^\xa8r\x9d\x14\xaa\\[\x87cT\x14D\x0e\x1c\x13\x1f\x15J\xae\x89C\xea\xf8>\xd3\xb0\xe6\xeb\xf9O\xb0\x9c\xb2\x16u3\xa3Xf\x10\x09\x87u\x12\xc3C\x95\xeb\xa5\xf1\x88\xfe\xc4\x0aU\x1e-\xcct\xca\x0a\x8bG2\x0fk\xee\x10~\xa5m$\x1a\xc72\x83H8\xa9\x93~\xa8r\x93<\xf6\xdb\xb4\xc7\xa8\x19\x08a\xa6\xd3\xd7\xc3\xcbL\xc3\x9a\xf7\x09\xd7\xc3[I-q\xedd\x15'u\xd2\x0fUn\xaf\x91>\x8cl\xc4\x99E\x14\x98\xe9T\xaeShF\x87:+=\x04F\xf6,\xe3\xa8N\xba\xa1\xca}\xd2@y\x7f5n\x8b\x88\x82\xd1\xd0\xe9\x9aw\xe5\x10\xfdo\xe3F\xed\x1f\xa0\x93e\x9c\xd4I?TYl\xafn\xef>U\xbb\x0bC\x11&\x98\x855\xbf\xfb\x8b\xce\xa2\x95\x9d\x9d\x16\xc3e)\x1d\xf3\x8b\x0etl\x14\x0eh\xcbuc\x99A$\x9c\xd4\xc9\x20TY\xec\xdaS\xb3\xab\x1d6\x99a\x16\xd6|Q\x90x\xca\xa0y\x04^.\xf7f/?\x12V\xac\x1b\xcb\x0c\"\xe1\xa8N`|\xa1\x17\xcb\x0c\"\x01\x9d@\x04\xc2c\x99A$\xa0\x13\x00\xb6\x01\x9d\x00\xb0\x0d\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\x09\x00\xdb\x80N\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\x0d\xe8\x04\x80m@'\x00l\xc3Q\x9d\xf4B\x95\x07k\xabdjM\x1a\x83\xf8\x80\x0bv\x06Z\x9c\xd4I7Ty\xa0\xaa\xbd\x9b\xd2^u\xc2\xac9\x183\x9a\xb8\xafJs\xc1\xce@\x8b\x93:\xe9\x87*\x9fbv\x0d\xd4\xe2\x8b\x9fq\xcc\xecEf5\x80\x84\x93:\xe9\x87*K\xd4\xe3\xbb\xed\xf1L\x06t\x8a\x0eGu\x12\xf5B\x95\x19R\x12\x0b\x18+\xba\x16\xa6\xba\xd2\xe6I_\x14\xdc\x90\x91\x94\xb1\x81\xfe_L\\UKg$=\xc4\xde\xfa\x94p\xbe\x0c\x91\x0fv\xe6*\x14\xb3\xa2\x0b.2S\xea\xacv\xce\xd4\x19K'j@\x9f\xb3:\xe9\x85*3\xa4$K0F4M\xcd\xa8h,#\x15t\xb2\xc0\xb5\xaa~\x95+\x97\xbe\xc1\xd5N!\xa9e\x15\xc9\x0bE\xb1\xffP\xf3\x8c\xcc\xe6\xe6f)\x99\"\x18\xec\xccU\xe8\x96\x8a\xda\x0a\\\xac\xbc`rq\xfd\xba\xd4\x8c\x09\x1a1\xe1\xacNz\xa1\xca\x94\x0bU\xf8\x0a\xf5\xd810m\xde\x00\xcbk\xa3W\xb3\xfb\xa5\x1fH\x93\x1f])\xf4E\xc9M\x95\xaa\xa8N\xf6\x02\xe1d\\\x05\xc9\xb02\xa6S=\xa9\x11Y\xa4\xd8vqB\xe2\xb0Nbx\xa82\xa5\xb1.r\x130\x9a\xd4\x93@\xa4\x94X0K\xfaof\x01}p\xb1\x07I\x11#\x9dB\x15B:-\x9a>\xc8H/\x10'$N\xea\xa4\x1f\xaaL\xa9Ad\xe5\x18\xb2\x8e\x04\x7f\xbdd\xce\x02\xe9\xbfy\xb3E^\x11#\x9dB\x15B\x93\x19\xca\x85\xd6\x04\x0d@rR'\xfdPe\x96\x03\xab\x8a\xa0\x07\xce\xd2\xc8\x1d\x9d\xa6K\xffM\x97\x8eNZ\x9d\xaa_\x92+\x19\xe9\xb4\x8aM\xe6No\x97\x98\xa0CK\x8e\xea\xa4\x1b\xaa\xcc.\x9dF\xf77^AD\xfa\xd33\xd9\x9b[\xf1Rv\xde\xc7\xaey\xb6K\x81\xcd\xbcN\x99\x99\xf4\xb2\x97(\xa7\xe4::%\xad\x10\xc5\x1b\xb3\xd9\xe4~\xb9\xd6\xe3k\xc4\x09\x89\x93:\x19\x84*S\xb7\xf0[icI\xd3\x0337\xd4\x17\x13v\xd2\x90;yE\xfd\x8a\xc9\xb9\xd2h]A\x9b\xd8^\xe0\x92~\x93\xad\xccU\xb1'sj7\x1f\xec\xac\xaa0'u\xcd\x9a9dJ\xcd\x19Q\\A\x16\xd5\xed)\x20\x13\xf4\x961'u2\x0aU\xbe\x80\xbbV\xc6\x96\xaeE\xe9\xc9\xb3\xe5\x17a\xdd\xac\xa4Y\xf2\xe7N\x84\xb8NM\xa5\x8f\xc5\xf4\xd9@qJR&\x8bD\x0f\x05;\xab*te&%?\xf4\xb8\\w\x7ffj\xca\x9c\xfdF\xb3Jp\x1c\xd5\x09\x80\xc4\x06:\x01`\x1b\xd0\x09\x00\xdb\x80N\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\x0d\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\x09\x00\xdb\x80N\x00\xd8\x06t\x1a7,\"\xa9\xb9g\xcc*\x811\x05:\x8d\x1b\xba\x9bjf\xa6N\xd4\x88\xa0q\x82\xa3:\xe9\x85*\xb3\xa4\x9c]\xd5\xbb\x0ea?\x89\x82&\x82\xac\xdc\xb8\xc6I\x9dtC\x95\xc5\xbe\xda]R)\xbe\x91kN\x1bi3\xab\x02\xc6\x12'u\xd2\x0fUn\xaec_\xad\x1e\xack6i\x0d\xa0S\xdc\xe3\xa4N\xfa\xa1\xca\x8dr8\xd8\x1e$W\x9a\x03\x9d\xe2\x1cGu\x12\xf5B\x95\xfbj\x9b\xfa\x06\xfb\x9aq\xb2\x17\x05'H\x93Y\x150\x968\xab\x93n\xa8\xf2@#-\xdd\x8f\xf4\x95(\x18L\x9d}\xa8{\x82\xe6\x15\x8f\x0b\x9c\xd5I/Ty\xb0\xb1\x8e\xe5\x1b5\xe2'4\xa2`?!d\x81Y%0f8\xac\x93\x18\x1e\xaa\xdc\\7\x20\x95\xe2\x07\x9e\xcc\xe9O\x9d\xbe\xae\x09\x19\x9f\xf1\x8b\x93:\xe9\x87*W\xcb\xf9`R6,\x88L\x1b\xc1\x80M\\\xe3\xa4N\xfa\xa1\xca\xd0)z0\xb2\x17\xe78\xaa\x93n\xa8r\x93t\xb27P\x871+s\xa0S\x9c\xe3\xa4N\xfa\xa1\xca\x03\xdb\xebNu\x9f\xaa\xdb\x8e\xa1=s\xa0S\x9c\xe3\xa4N\x06\xa1\xca\x83m\xbbjv\xb5a`\xcf\x8c\xc1\xee\xf6E.\xfc\xae\\\\\xe3\xa8N`$,$d\xda\x1e\xb3J`L\x81N\xe3\x86\xee\xe384\xc5;\xd0\x09\x00\xdb\x80N\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\x0d\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\x09\x00\xdb\x80N@\xcd\xe0\xc0\xc0\xc0`\xf0?`\x09\xe8\x04T\x1c\x9aL\x08I\xea\xefO\xa2\xffMFX\x9bE\xa0\x13\x90\xd83\xa7W\xfa\xbf\x8e\xd4\xb7\xb5\x9d\x12\xc5Smm\xf5\xa4\xce\xa4\xd1X\xd37'\xce\xee\x09vT'\xfdPen\x12\x18\xf3\x1dAh1\xab\x13\x99\x0dd\xf2v\xa3\xbfU\x902y\xa2\x8e\x04o\xb4\xed\x96u*&\x93G[\xab\x98\xd7\xadb\xf2\x1a\xb3*\x8e\xe2\xa4N\xfa\xa1\xca\xfc$0\xe6\xf5N\xf7N\xb3:\x91\xe9k\x9e]f\xf0\xa7u\x93k\x94\xa9p\x9d\xba\x9b]\xfa\xcd\x9al{\xcd\x0c\xd7\xad\xe3\x9cnq\x88\xfa)\xebLj8\x8a\x93:\xe9\x87*s\x93\x20\"Y#\xd4I\x14\x17\x18\xe8t\xc1\xb5\"0\x19\xae\x93(\x1a\xe84{\x91nqL\x18\xac\xdb\xf2r\xddb\x8eUq\xf5\x8dJ'u\xd2\x0fU\xe6&ADFO\xa7\x82\xf4\xe0\x9b\x99\x05\x9d2F_\xa7GMu\xeaO/0\xab\xe2\x20\x8e\xea$\xea\x85*s\x93\x20\"Y\x1b\x9f\xf1\xe6<\xf5\x1bUYw2\x91I\xe6\xde\xa4\x07\xd3\\\x8f\xa7\xa77\x15\xa7d\xb2\x84\xd0E\xe9\xaei\x0b\xe4\x1f\xb2\xa1:\x15\xd3\xba\x0f\xb0Q\x87\xda9Sg,\x95-\x1aL\x0e\x1e\x9c\xf4u*~8=eA\x17}\xeb\xa3\x8d\x1f\x17\xcb\xe8c]\xbd2\xdf\x0c\xa9\x06\xd7Y8\xef\xe6\xb9\xb7z\xbd\x1d\x1bsV^\x13\xc5k\xe5^w\xfeS\x17i\xf1E\xb7\x20<5\xe4\x15\x84\x9c\xeb\xdc\xba\x1d\x11\x04a\xab\xb8\x93>\xb6\xb0I\xc6\xd7Y'C?]\xee)\xdax\x9dMv>\x91\xef^\xfcT\xfe\x90\xdc\xfb\xaa\xa48J\x19qV'\xbdPe>_\x19D\"K\xf8zK\xcb\x12\xcfE\xbel\xb0f\x9dL\x0d\xff!QS2Y\x9aIR\xd7\xa4U0\x05\x1en\xaa[0Y\xcal\xa1:u\xe7N^\xc7\xa6\x0b&\x17\xd7\xafK\xcd\x90\x12\x9a\xdb\xb9\xe8s]\x9dH\xc6\xf6\xed\x19I\xa7\xc4\xfeC\xd3\x8a{\xc5\xde\xb2\xe4\xe6\xfe\xfeC\xcd32\x9b\x9b\x9b\xa51$\xbe3\x1d:\xb2\x85\x8d%\xc2\xe2\x9dy\xfb\x98.\xeb;Z\x9e\x12\xe85\xd1\xd0/v\x0a\xbf\x10\x7f:\xf7\xa7\xbf\x12\xb9u\xbb\xde\x99\xff\xec\x1f\xc4?\xfc\x20\xbb\xf3\xda\xb5\xce\xce\xa2\x95\x9d\x9d\x9d/\xb3>\x9e\x116v\xec\xf3>J\x1d\xfa\xe5\xdcgZ:\x0e,\x16\xde\x95;?\x14Oq4\xce\xea\xa4\x17\xaa\xccM\x82\x88d\x15\xd17\xe7\xebE\xcbU\x85\xbd\x17dzU\xa5\xe9\xb9T\xa3z\xb1\xe0a\x16\xb9\xc6\xde\xbff-d\xc5T\xa7\x0a\x97t\x1aPO\xd8\xd8C\x1b\xd9.?\x09%\xcb\xea\xea4\x93\x1e\x00\x06f\xcc\xa1\x93e\xechT\x20\x9f_\x05O\xf6T\x9d\xe9\xe1]+v\x08G\xc4g\xd6\xd3\xe5o\xa1\x87\xa8\xa1%\xabY\xf1\xd03\xcb\xafy\xe5\xb3\xa9^4}\x90!_x\xec1\xd3\xe9q\xf6\xb8\x81\xf4\xb1\xb2S\xe2@\xb2\x9cE\x1b\xd4I\xd5\x99\x1e\xde\x16j\xc25q\xebZ:}\xed\xc0\x13\x85\xd9\xc2\x12\xa9\xfc\xfa\xa3yO\xc9Vp\xeb\xf6\xfa\xdc_\x89\xd7\xb3;\xa4\xe2\xa0Nk\x0b\x87\xde\xa5x\xa9e\xafy\x0b7\x1e\xf8\xd5\x90b\x13]\"C\x8b\x9d\xc7I\x9d\xf4C\x95\xd5\x93\xc0\x18\xf9r\xbdSP\x0d\x1e7\xd7\xcb\xa8o`H\xdf/\xb6\xb9DI\xa7\xb6\xb4i+v5g\xca:\xa5%\xcf\x94\x0eSb\x86\"\xa1\xf4\x8c\x8f\xef3\x1e\x8ah&l\xb4h\xdeRq\x7f\x8a|b\x19\xd4I\xd5\x99\x1e\xde\x0e\xf1\x9c[\x94t:\xe7\xcd\xdfz\xa4\xb3D\xd6Il\x11:\xe5\x09~\xdd\x9e\xf8\x17\xb1C9\xf6\x04uZ\xa2\\G=%2!\xcb\x8b\x84\xbc\xbd\x8aOm$\x8e\xf6\x1c'u\xd2\x0fU\xe6'A$\xb26\xb2G\xf5\xd1\xc9\x00N\xa7\x99s\xd8\xdb\xd8BY\xa7\xd4S\x17\x92+\xd8T\xee\xf4v\x09\xe9\x1c\xb1\x9f\x1b\xba\xd3\xd5i){\xac&\xec\xac\xb1>uP9\xd7\x93u\xaa~I\xd3\x99\x1eL\xa7,Y\xa7\xa2\xe5l8\xa1\\\xd6\xe9u\xef\xd6|\xf9\x12\x88_\xb7#9C\xca\xb9\x9e\xac\xd3\x81\xd7\xd8\xd1\xe9\x9c\x04\xfd\xfb\xb9\xadT\xa4k-\xf3\x0f\xc8U\xca\\q\xf4\x11\x8b\xa3:\xe9\x86*s\x93\x20\"Y^\xba'\x0e\x15\xad4\xab'\xaat\x9a\xc6\x8e\x1972\x94\x93=Q\xdc\xefb\x87\xa2\xfd\xb2*\x8f\xcb7\x15,\x9a\x1e\x1cE\xd0\xd5)\x9d\x1a983\x93M\x0f\xa6\xd6\xa7(\xafU&-\xe8eu\xd4\x9d](;.j\xe0t\xcag\x82\x0c=*\xe94\xb4\xfc\x07\xe2\xb3%\xd2Q\x86_\xb7\xa1\xc5Gr\xe4s=q%-\xf8\x03\xbb`\xea\x90o\x9b\xd8J\x0fb;\x05\xe9\x8f+\x9f\x95j\xdc\x989O;\xb71\xc4I\x9d\xf4C\x95\xb9I\x10\x91,\xe1\x89_t,\xcfy\xd9\xac\x1e}\x8bJ\xa9\xe8\xdf\xee:\xd1\x9f\x9b\xd9-\x96\x91E\x1b\xd6d\x90\xd4\x8a\xb6\xfe\xe6\xd9\x05m\x83\xfd\xf3\xd2\x9b\xe8\x1b\xd8\x0a\xb2\xa8nO\x01\xa9\x95\xeawM\xae\x084\xd5\x1f\xd9\x9b\xd7\xd64'E\xbe\xc0Z1]9\xd7\xa3\xc7\x85\x8a=\x99SYuUg\x0b\xc8T\xcd/I^\xcc\xd9w\xbd\xc5}\xf1\xfa\xda\x92\xd7\xa9\x0c\xe5\x07v>*,\xde\xdby\xbd\xf3;\xde\xd7\xc5\xdfdo\xec\xbc\xaeY\xb7\xad\x859\xca\xb0\xdd\xce\xac}GJ<\xaf\xb1\xb2\xb9k[\x8e<\xc3\xa4\xda)x~p\x84N\xca\xc6U\x90x\xfa\xc0\xd2I\x9d\x0cB\x95\xb9I\x10\x89\xa2\x9d\xe5\xd9\xde\xb5\xaf\x99U\xa3\xef\xd8i\x84\xd4&\x93\xa9u\xecr\xe6F\xc5\x0cW\xea\xa2\x9a\xe9\xae\xcc\x0d\xec&\xf1\xf6Z\xfa\xb8\x8aV\xda\x9f\x99\x9a2g\xbf\xd2b\xd5\x03\x81\x0b\x90:\xd2\x15\xf8\x82FW@\xa7\x99e\x8b\x92\xd3s\x15\xcd\xba\xc8\xc3J\xd5\x81\xe2\x94\xa4L\xf9\xaa\x8b\xef\xacz\xaaf\xe8z(O\x10Z\xb2\x05O\x8b\x20\xac\x16\x87\xf6\x15ey\xd7\x1e(r\xaf\xec\xa0\x97B\x1b\xc5\x8d\x820\xb7C\xb3n/\x0b\xeb\x95\xa6\xd77\xe6\xcc_)_+v\x94,\xceY\xce\x14\xfa\xe9\xf2\x9d\xf9n\xefJ\xd9\xa6\xe6\xa4\xa5b\x1c\xe1\xa8N\x20nY\xeaR\xd4\x91>\x9eU\xbe\xa0A\xf4>Z\xefw\x99\x9d\x97\xef!#\xbc\x9a\xb9\x96\xd5aVEa\xbb\xab\x20\xae\xbe\x94\x05\x9d\x80DE\xba<\x900x\xa2-\xf0\x05\x8d\xb6\x13z\xbbj]\xaa\xc9\x0e\\\x93\xf2\xb082Z\x16\xbfkVE\xa6/=\xben(\x87N\xc0\x0aeMb\xa6\xd1]\xe9\x0a\xdd\xa9KGt\x1d\xbc\xb3c\xa8\xe4\x07f\x95\xe2\x15\xe8\x04\xa2g\x80d\x14\xa7k\xc6\x19l\xe6\xba\xf0\xf5\x7f\xf6F\xf1Q@|\x02\x9d\x80\x05\xca\xa6f\x8e\xf6\x17=\x7f\xe0)y\xd9\xacN\xdc\x02\x9d\x00\xb0\x0d\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\x09\x00\xdb\x80N\x00\xd8\x06t\x02\x8e\x131\xb0y\\\xa79C'\xe04Jn\xb3\xfe\x1f\xc7w\x9a3t\x02#!\x90\xc5l\x85@n\xb3>\\\x9as\xdce&\x9b\xe2\xb4N\xa7\xaa\x94\xbb\x94\xbb\xf7\xd4\xec\xef\x0e\x9b\x04\xd1\x10s\x06\xb1\xedHY\xccV\x17\x87\xfbJ\x15G\x87\xf7H`2\xf8E\xabx\xcbL6\xc5a\x9d\xfa\xaa\x0f\xc9\xdf1\xeb\xaen\xeej\xae\xee\xd6L\x82\xa8\x88=\x83\xd8f\xe4,f\xabq\xcf\xfa:\x1d\xf1\x04\x9d\x0c\xea\x14o\x99\xc9\xa68\xacS}c\xb7\xa4\xd3\x0d)i\xe5P\xed\x0d\xd5$\x88\x96\x983\x88m%\x98\xc5l-\x9fV_'q(8\x15\xd2)\xce2\x93MqV\xa7S5\x03\xb2Ng\xaa\xd9M\xfc\x03\xd5gT\x93\x20Zb\xce\x20\xb6\x95`\x16\xb3-:\x85\xe0t\x8a\xaf\xccdS\x1c\xd5\xa9\xbf\xbaK\x94uj\x94\xbf\x08]\xdf\xa4\x9a\x04\x11\xf8g\xc1}`c\x91\xe7\x89\xd7\xd9\x93\xd83\x88et\xb3\x98\x19]\x0bS]i\xf3\xa4\xc2\x0d\x19I\x19\x1bD\xf6\x834S\xd6\x85\x87*\x8b|\x16\xb3^\xdc\xb3\x0a\xd52p:\xd5\xa4\xc9)q\xd7<\x02w\x01\xc6\xe9\x14_\x99\xc9\xa68\xaaS}\xa3\xa8\xe8\xb4K\x8e&8\xb4G5\x09\"p\xb1\xc5-xw\xee\xcd\x96\xf2Sc\xcf\x20\x96\xd1\xcfb\x16\xc5\xa6\xa9\x19\x15\x8de\xa4\x82N\x16\xb8V\xd5\xafr\xe5\xd2\xd3\x87\xda)d\xda\x9a\xb2i\xeaPe\x91\xcfb\xd6\x8b{\xe6Q/\x03\xa7\xd3B\xa2\xe4\x10\x9d\xeb\xec\x9c\x1f<\xc4\xf1:\xc5Uf\xb2)\x9fy\x1c\x00`\x13#8:\x01\x00\xd4@'\x00l\x03:\x01`\x1b\xd0\x09\x00\xdb\x80N\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\x0d\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\x09\x00\xdb\x80N\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\x0d\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\x09\x00\xdb\x80N\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\x0d\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\x09\x00\xdb\x80N\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\x0d\xe8\x04\x80m\x98\xeb4\xb0f\xf6TW\xfa\xc2C\xe1\x7f\xd9@\x1eV\x1eF\xc0\xbd\x8ai\xae\xf4\xc6\xe0\xd3\x81{\xf4\xa1\x96,\x0aU\xa8#\x0b\xc3\x1a\xf1\xac#\xc5\x11\xffn\x82a\xf7\x9a\x053AZn\xb3E5\xc1\x96\xed\x09\xc6\x12S\x9dj\\\xca\x8f\x12\xcf\xfbP\xfb'[^\xfe\x0a\xd6w{\xe0\xd9\x86$6\x97\xb8\xd0I\xbd`&\xc8\xcbm\xb6\xa8&\xd8\xb2=\xc1Xb\xa6\xd3RB\x16\x9e\x10?\xe9]\xe5\"\x99\xf74\x7f\xb3\xe5\xe5\x9fE\x96~r/\xd0\xf3=B\xc2t\xea\xde\xd0\xac\xd7.\xc8\x08u2\xec^\xb5`&(\xcbm\xb6\xa8&\xd8\xb2=\xc1Xb\xa2S\x13!\xdb\xe5\xa9\xe3\x84\xd4h\xfeh\xcb\xcb\x9fN\xbaBO\xf4t2c\x84:\x19\xa2Z0\x13\x94\xe5\x1e!\xb6lO0\x96D\xd6\xe9^Zh_-&\xd35\x7f\xb5\xe5\xe5O#\xdd\xa1'\xf1\xa4\x93j\xc1L\x80N@\"\xb2Nm\x84\x0c\x04\xa6\xfb6tIE\x8b\xd2]I3W\x89~\xf5\xcb?\xb0t\xba+e\xe1q\xb9*\xff\xa4\xbfx\x9a+yN\x8d\xea\xac\xa9\x97\x96\xa5,d\xd7%s\xa4\xcb\xb2\x80\x0f+\xa4g\xddL'qi\xbakzY\xe8\x82D\xaf\x9bS\x0bR\xa7\xce\xbb\xc0t\xaa%\xb3\xe4\xa2\x0a\xe9\xc9\xba\x0fX\xebU\x1fHE\xdc\x02\xd7\x92\x0d\x83\xc5i\x0fd4\xd2\xc9Y\xae\xb4\x9b\xacD(\x00\x00\x1e\xe5IDAT\xa5\xdc\xf5N\xff\x0a\xb6\xc8g\x82}\x07\x16,\xb0wK\xd2jz\x0e\xb6\x09,\xb7\xd2Wh\xf5\xb4-\x14\xf8\x99\xe9o\xcfYd\x85\x1f\x8c?\"\xeb\xb4\x8a\xcc\xd0\x94\x14\x13\x92\x9e\x91F\x1f>P\xbd\xfc\xc7\xa7\x12\xd7\xac\xe9\x84\xac\xf1k\x9e\xf4&\x93\x94\xd93\x08y\x88\xeb\xa3\xdeE\xa6\xb2>\xe8\x1e\xb3&\xd7E\xe6\xe5\xd6)\x7f\xd8\xb3\x88^\xa9\xe5\x0e0;\xd2HZ\x0a!\xb3\xee)\xfb\xbb^7U\x84\xa4\xcdrM\xc9\xa4;\xfa\x07.\xd2+\x95\xcd\x20gh\xeb\xa5\xe9$\x99\xb6\x9e\xf9\x89f\x81kIq*Is\x11\xd2XL\x1e\xa0e\x99\xfe\x80N\x87\x92\xc8\xd4\xd9\xb4$x\xed\x13X0\x8dN|\xcf\xa16\x81\xe5\x96\xfb\xe2VO\xd3B\x81\x9f\x99\xc1\xf6\x84N\xe3\x93\xc8:-\x20\x05\xea\x826\x92\xc4\x0e:\xa7\xa6\x92\x0d\xfc\xcb?\x90LV\xd0\xfd\xe5T\x0ai\xd4Le\x95\x9a\xe5\x0b\xbb\xc7\x99U\xb4u_\xb0\xb5j\x81\x95~{\x09\xa9`e\xb3\xd9>.u_F\xe6I\xb52I\xe0@i\xa4S\xa8g\xbe\x0d\xaf\x93j\xf5T-\x14\xf8\x86\x06\xdb\x13\x8cS\"\xeb\xf4\x10Y\xaa)Q\x86\x8e+\xd8a+\xf4\xf2O#MR\xf1'\x93I\xbf\xfa\xc9Cd\xce\x19\xf5h\xf3\xbd$e\xc8\xec\xdeTzff\xa0\x93|)T\xcd\x86$\xa4}4\xbc\x1b\x7f2;\xb6\xf8\x95=\xf1^\x0a\xeb\xf4^\x1a\xdbyk\xc9\xccPk\xd5\x02\xd7\xca\xe7\xae\x9f\x10y\x9e\xb9\xa4Z\xe9~\xa6\xb2\xc8\x83\x83\xa1\xfeuu\xe2z\xe6\xdbp:\xa9WO\xbd,2\xaa\x99\xe9oO0N\x89\xac\xd3\xc3$W[t\xef\xcc\xae\xb2E\xd3\x88\xea\xe5\xff\x90^\xe5\xcc\x91p\x91v\xd5\x13\xff\x19z\xa5\x92\x9c\xbb\x87\xbb\x12\x1f\x20D\xb9\x8e\x98\xc3\xce\xe5\xf4u\x92\x8fo{\xd8\xff\xd2\xfe\x1e\xde\xcd\x07\x81n\xf6Ho\xfcK\xd9\xb1\xaa\x9d\xcc\xe6Z+\x03\x03\xdc\x02\xd7\xca\xc7\x05:\x17v\xe5\xef/\x20UJ\xad\xc0\xa5\x17\x8f\xaeN\\\xcf|\x1bN'\xf5\xeai\x96EB=3\xbd\xed\x09\xc6+\x91u\xaa\xe0\x87\"\x8e\xb3=\xa6:\x8d\x0dbe\xccQ\xbd\xfc\"\x09\xd1\xa8zB\xcf\xac\x0a\x92\xe8\xc4\x94\xe2\xe0\xa5x7\x99\xa2L-`\x9fdE\x1a(\x0f\xe9\x14\xdeM?!\xf2D\xb3\xa4S\x17I\xbbG\xed\xaf\xe5Z\xcb\x0d\xf9\x05V\xfe\x12\xa6\x13=\\q\x87%\x05]\x9dB=\xab\xdap:\xa9WO\xbd,\x12\xea\x99\xe9nO0^\x89\xacS7\xf7\xd2\xf7\x93\xc9]\xec\xce\x9b\xe2\xfa\x0b\x1fjNN>T\xae\x10$TO\x18\xf7N\xad\x99EB;I\x7f4G\xa70\x9d\xc2\xba\xf9\x20\xf0Q\xcf~\xf9\xb2d\x069q/i\xca\x07~\x8dN\xaa\x056\xd2\xc9\xaf]d\x86Z\xa75Z\x9dTm8\x9d\xfa5G\xa70\x9dT\x0d\xf5\xb7'\x18\xaf\x98\xdc\x151-t\xf1\xb4\x82^Z\xd3\xeb\x01\xf9Z}\xa9\xfa\xe5Oe\xc7!\xc6\xa9\xfe{\xea'\x03\xf2\xa7+\xb5dJ\xf0F\xa2\x07\xa2\xb8v\xd2\xea\x14\xde\x8d?E\xe9f\x8d\xacS\x05Y\xd1.\xef\xb3\xfc.\xac^`C\x9df(#\xe4M\x0fU\x07\xbaW\x16\xacJ\xe9\xec\xe10\x9d\xf86\xfc\xb5\x93j\xf5\xf4t\xe2\x1a\x1amO0N1\xd1i\x17!\xf5\xf2\xd4!B6\xb0\xb3:\xe9\xbc\xff\xc3tvQ\x15z\xf9\x8b\xc9li7o#\xae\x0fTODe\xcf\xed#\x93\x83\x1e\x04\x86\xbev\x91\xe4O\xa2\xd4I\xaf\x9bb\xb9\x9b{\xd3e\x9d\x06\xc8\xb4\x15\xf25>\xbf\x0b\xab\x17\xd8P\xa7\x15\xca\xde\xbe@\x1e\xf2\x93\x90\x17\xac^>\xdd\xfd0-L'\xbe\x8d\xde\xc8\x9e\xb4zz:q\x0d\x8d\xb6'\x18\xa7\x98\xdd\x02\xbb\x90^$\x9f\xf9\xf0^\xef\xe3\x84\xcc\xb9\xe7\xbf\x97,\x8dN\xdf\x98G\xd8\x8e\x1ez\xf9\xfb\\\xa4\x98\xeeO])\xec`\xa6z\xf2\x10y\x88\xee\xba\x1f.R\x06\x87\x19\x17\xa6\x90\x0a*ES\x12\x1bX\xd3\xdc\xcb\xe3\"\x8d\x9f\xdc\xd39:\xe9t\xd3\xef\"\x1b\xee\xf9?\xcc\x0d\xdcT\x91I\x92\x92\xa5\xd3,\xd5\xd1I\xb5\xc0\x86:\xf5'\xb1E\xba\xb7\x8eL\x15\x83\xfd\xcb\x0bF\xcf\xdd\xe8_\xfa3I\x98N\xaa6\xf2rK\xe5\xaa\xd5\xd3\xd3\x89kh\xb4=\xf1\xb9\xd38\xc5L\xa7O\x0a\x02\xc3\x0a\x0b\xa4\x91\x08B\xa6-\x98=9\xa5\x8c\x0des/\x7f\x93\x8b<0{:\x91\xef:\xe7\x9f\x0c\xa4\x10\xd7\xccYI$\xad?\xd4g\xfd\x14\x92<;\x9d\xc8\xe7\x91j\x9df\x13\xf6\xa5\x08\x9d\x93=\x9dn\x1a]$mv\x12Y\xa8\xe8\xb4'\xe0\x95j\x17V-\xb0\xa1N\xecs\xd6\x94\xd9t\x1e\xdc\x1d\xe1\xca\x82\x15\x13\x92\x9cN\x92*\xc2tR\xb5\x91\x97[.\xe7WOO'\xbe\xa1\xd1\xf6\xc4]\x11\xe3\x133\x9d\xfc\xfe3\xc53\x1ep\xa5/R>?m\xcbLu\xcd,\xfb\xe0C\x17\x19T\x9d\x9c\xf4/\x9d\xeeJ\x9a]-\x9f\x8a\xf1O\x06\x96\xcep=@[\xf0]v?\x9c\xeeJ\x97oj\xd3\xe8\xd4\x97\xf9@\xf2~\xbd\xa1\x08\xddnr\xd3\x92\xe6\xb45*\x16\xd1E\x0a\\`\xf1\xbb0\xbf\xc0\xc6:\xf9\xfb\x8a\xd3\xa7\xa4\xe6\xf2\x8b\xa2,\xd8\xbd\xdaY\xae\x94\xdc\xbe\x13\xe1:\xf1m\xe4\xe5V\xca\xb9\xd5\xd3\xd5\x89oh\xb0=\xa1\xd3\xf8\xc4\\\xa7\xf1\xc2\x00\xbb\xc1\x08\x80\xb1$qt\xaa\xe0\x86\x11\x00\x18\x13\x12D\xa7\xbe\xc1\xc6\x07\\\xa1a\x04\x00\xc6\x84\x04\xd1)\x97\x10\x1c\x9c\xc0\x98\x93\x20:U'\xa5\xc1&0\xe6$\x88N\x00\xc4\x03\xd0\x09\x00\xdb\x80N\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\x0d\xe8\x04\x80m@'\x00l\x03:\x01`\x1bv\xebt\xb6\xe4\xb6Y\x95h\xb8Sr\xd6\xac\x0a\x00q\x87\xa9N\x1fm\xc9\xf3\x94\xfb\xccj\x058(4D]7\x12\xbe\x83\xc2A\xb3:V\xb8\xec=oV\xc5\x84\x91\xf7\x10-\x97\xe6\x0a2^k\x9br3m\xe2yOS\xd8\x20\xb8\xd9\x1b\xd3\x8b\x1e\xa1A\xaf\x0d\xb0\x17S\x9dJ\xbdG7y>6\xab\xa5\xd0*\xbc`V%Z^t\xb7\x9aU\xb1\xc0\xf9\xec\xa8\x8fvW~\xaf[l\xa1\x07\x0e\x83\xce\"V\x18~\xc5\xbd\xb9\x87\xb2[\xb0v\xa0\xbf\xd9\xd3sX\xf8\x9d\xa6\xf0N\xa5\xa7\x94\xfeW\xea\xa9\xbc\xa3\xd7\x06\xd8\x8b\x99Nw\x84V\xbf\xef\xaeI\xa5\x00\xef\xbbw\x9bU\x89\x9e\xbdY7\xcd\xaaX\x20\xfa7\xfa\x95\xeb\xf5\xcb\xa3\xef\x81\xc3\xa8\xb3\xc8\x15\xb2\xa4#\xc9\x0b\x82e\x03\xae\x86\xe9\xe4\xdf]N\xdf\x0c\xefx\xcam|e\x80!f:\xbd'X8\xc7\xd9\xec\x1d6\xab\x12=\xc3\xde\xcdfUF\x85\xc7\xcc\x0c\xb0\x82ig\xba\x15d\x9d\xde\xdba\xd9`=\x9d*KO\xfb_X]\x09\x9d\x9c\x20\xa2N\xbe\xc5\xf2I\xfc\x0e\xbf\x7f\xab@\xcf\xe3\xdew\x0bK\xd8\xa4\xfb\xd8\x8e%\x9e\xd5\xf2\xc1\xe3\xbdo\xe7\xb9\xbd\xe5\xd2\xb4/[~\xcd\xder\x0b\xc2\xde\xf7*\x0b=\xab?\xe5:\xe3J\x8d:\xf3\xbdP\x92\xbddG@\xc9\xbd\x1e\x8d\x9c\x96{P\xf8\xd8C\xd7\xe1$\x9bR/z\x88\x9e\xd5\x85\xee\xbc\xf2B\x9f\xff\xbcr\xd9\xb2\\\xbd\x16\x06=\xdc\xa9\\\\\xb8c\xc7\xe2\xec\xd3\\\x0f\x1c\\g\xaa%\xd3\x9b\x9b\x8a\xac\xc0u\xce\x1f\xe92\x94\xfb\x0a\x05!\xc7\xe7\xbf\xbb>\xdf]X\xfe\x96\xdf\xffi\x9e\xfb\xc7\x85\xf9W\xb6\xe5\x94\xdee\x8b\xd3\xba%?\xa7\\\xb9d\x0a\xea\x14\x9a\xdb\xee\xca\xc3O\xfb\xcb\x8f2\x9d\x82=h\x9b\x01\xbb\x88|tz\xb3\xe7\xa4\xd0\xd0\xd3s\x8b\x9d\x98\xbb\x1b\xfc\xbe\xab\x9b\xb3\xe8k|\xd2-x\x1b\x0e\xe6<\xcdj\\\xc9^~\xf0r\x83\x20]\xe7\xbc)\xf4H\xad\x86O\x9f,,\xca.\xdcQ9\xf7\xcf\\_\\\xa9Qg\x9b\x85m/\xb6z\x1fS\xf6\xc9W\x84\xdf\xfaUX\xee!\xc0\xd5\x9e\x9e\xf9\xd2\x1e\xaa\xaa\x1b\xe2\x8d\xb9\x9b\xce^>\x96'|J\xaf[z\x8a\x9e\xa4\xd7-\xff\xaeY\x0b\xdd\x1e|\x8fz\x0f7\xcc\xf7\x1c[\xdd\xca\xf5\xc0\xc1u\xc6/\x99\xee\xdcTd\xed\x1d\x1e^\xbf\x83\xcd\xe1\xb7\x0dt#\xbc0\xf7\x857\x99\x9c[\xae\x9c.\x17\xae\xd2m\x9e#\xec(\x15\x16\x1f\xcck\x95\x16\xa7\xb0\xa1\xa1\xd0\xf3\x8e\xd40\xa8Shn\xbb+of\x7f4\xff\x16\xd3)\xd4\x83\xa6\x19\xb0\x8b\xe8O\xf6\xa4\xb7\xcc\x86,i2\x87\xbe9Wz\xe9\xd4p\xe1j\xfa\x92\xf9NKg\xf9/\x0a\x7f\x0a4{L\xa0o\x9da\xd7\\\xa1R\xdd\xce\xceK\x03\x19W\xe5\xc3\x005X\x08\xbf\xf8\xb7\xd6\x03\x87Gy\xc3\x0f\xd5\xe58\xece\x1a\x1c\xce\x91,\xe4N\xbfTk\x11\xde\xc3i\x81\xbe\xd3\x1f\x16\xde\xd1\xf6\xc0\x11\xec\x8c[2\xa3\xb9\x85\xc8b\x87\xacri\xd2\xb7\xa9\xe4N\xa14\xc89|\x92.\x88o\x19\xf3\xd8[I\xb7\xf5y\xff\xa6-\xacn!-\xfe\xb8\xb0D\xaa\x1d\xd0\x89\x9b\xdb\xeeJ\xff\xb2-+\xfdL'\xae\x07u3`\x17\xb1\xe9\xb4)0yIx3T\xf7\xac\xf0~`\xf2\xb1,\xfe\xc0\x14^\xaa\xdb\xd9\xfaG|\x9fR\x0a7\xcbun\x0a\xa7G\xd8\x03GP\x86`]\x8e?\xe7\x17n;\xf6\xa6Ov\x81\xd7\x89_\x8b\xf0\x1ev\xe7\xd0\x87?I\xd2\xabz\xe0\x08v\xc6-\x99\xd1\xdcBdm\xb9zu\x99\xac\x93\x7f\xf8\x1by\xca\xe7\x14w\x0e\xaf~$GXF\xa7\xbc'\xa9*\xc3\xcc\x14ZW:\xc1>,\x0f[\x04t\xe2\xe6F+\xb1\x0f\x1d\xa4k\xa7P\x0f\xeaf\xc0.b\xd3)8\xd9*p\xd7)\xdc\x85\xf0c\xda\xcb\x01M\xa9ng\xcb\x94K\x09\xe5T\xec\xaa\xf0\xca\x08{\xe0\x08\xca\x10j\xc6\xf1\xf1\xd1\xf5K\x84\xbc\x83aG'~-\xc2{h\x9d{\x87\xbd\xa1\xbc\xa3\xed\x81#\xd8\x19\xbfd\x06s\x0b\xc1fq\xe9\xb2\xf2\xe4\xac\xb2\x19\xaez\x0bw\x9f\xed)\x95t\xba\xe4\xbf\xea\xf6+:I\x8b\xd5#H\x03\xee\x81W\x80\x9b\x1b\xadtg\xc7mI'\xae\x07u3`\x17\x16u\xda\xab\xd9\x7f/\xf3\xaf\xc7p\xf0\x12\xda\xff\xd8\xb7\xfd:\x84Ju;\xab|\xe4\xf7\x12\xca;f\x83;|\x80\xdeZ\x0f\x1c\x11u\xba\xba\x9b\xee\xda\x1f\x9f\xf4\x1cfO\xa4\x1d\xfc\x98tXR\xadEx\x0f\x7f\x16\xca\xff\xfcVQ\x89O\xdb\x03G\xb03n\xc9\x8c\xe6\x16B\xd9\x8eo\xb1\xd5\xb8\xe9\xdd[\xf8\x11{\xb6\xa4\x84\xbds};\xa0SV@\xa7m\xec\x8f\xc7\x04i[\x05t\xe2\xe6&U\xf2K:q=\xa8\x9b\x01\xbb\x88^'\x0f}A|+5\xfb\xef]o)\xdb\x9b\xb6I/\x8e\xff\xdbE\x81wg\xfd\x01\xe2P\xa9ng\x97\xe4k\x9e\xbd\xf2\xfd\x10\xbe%\xe5#\xec\x81'\xa2N\x0d\xc2%\xf6_\xe9\x16\xe9\xb1\xd4\xef\xbf-\xf7\xa3Z\x8b\xf0\x1e~/\xe4\x09B\xe9\xcd\xb0\x1e8\x82\x9dqKf47\xff\xfb\x07\xdf\xe7fA\xada\xabX\xb2\xd7\xbfE\xda\xc6\x85\xccm\xdf7\xc2t\xca\xa3F\x0c?R*\xb5\x08\xe8\xc4\xcd\x8d\xd3\x89\xebA\xdd\x0c\xd8E4#{W%IJ\xbc\x07\x1bJ\x04\xf7\x0b\x7f\xbc\xd5\xe3\xde|\xd5\xf7\xe6f7\x1b\xf1\xbb2\xff\xd1\xa3\x97\xb6\x09\xc7\xa4\xea\xef\xc9w\x06}\xfa[i\xc0*x!%\xa3*\xd5\xefl\xf7\xdc\xca\xb3g7+wV\xb4\x86\x9d\x88X\xed!\x80\xefw==\xf37\xf7\xf4\xdc\xf5\xab\xea\x86h\x10\xb2\x7fr\x9e6\xbb\"=\xc9j=[\x9a\xfdg\xd5\xdc\xf4{\xf8\xfd\xfc\xcb/\xf6\xdc\xf4\x85\xf5\xc0\xf7\xact\xc6/\x99\xee\xdc\x18O\xcb\xc3\x0f\x81\xbb\"zrv\x0c\xbf\xb2\xd5{\xd3\xff~\xce\xb6W|\xb4\xd9\xfa\xc3\x0d\x8f\xd1\x93\xc4\xab\x7f\xcci\x1d>\xe9~k\xb8\x92\xa9\x9c%,?y\xac(\xe7O\xf4`\xc9\xee\x8ah\xed\xe9Q\xcd\xed\xa3\xcaR\xb6\xaa\xb7J+?\xe2z\xe0\x9b\x01\x1b\x89\xfc\xb9S\x8et\x06\xee\x96\x06r\xdf+\xf5d\xaf\xfe\xb1\x20l\xdd\xca\x8a\xfe-\x9b>n\xa5\xc5\x7fZ_\x98\x1d\xbc_u\xef|v\x9e\xff\x96|\xe2\xae9\xb8\xa8J\x0d:\xbbT\xba8\xe7I\xe9\xbd\xdb\xdf\xe3\xd9\xe1\xd7`\xb1\x87\x20o(W\x12G\xfd\xea\xbaA^x\xb2\xa1\xd0\xed-\x95]\xf0m\xcb\xf1?\x86\xfb\xa542\xa2\x19B\x8d\x82\x18\x9b\x013\xa0\x13\x00\xb6\x01\x9d\x00\xb0\x0d\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\x09\x00\xdb\x80N\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6a\xb7N\xc8(\x07\x13\x18S\x9d\x90Q.3\xf2\x1e\xa2\xe5\xa4t\x07\xed\xe2\xa7\xa3\xb9\x09h\xab\xa0\x93\xdad\xc0\xd1P]+\xb3\xb0Rw\xc2'\xa2\x9b\xea\x84\x8cr\x19\x0b=p\xc4\x92Q~\xf7\xbc\xf0\xe3\x9e\x9e\x17\x96\xe5}\xa4S_\x83\x947\x18%\x1f\xf7\x94\x04\xea\x1a\xce\xc2\xca\xe2\xe8\xd4\x9d\xf0\x89\xe8f:!\xa3<@\xf4=p\xc4\x94Q~K:\x8a\xdc\xf1D%\x8a\x95oZ\x94\x07\xeb\x1a\xcd\xc2\xca\xe2\xe8\xd5\x9d\xe8\x89\xe8f:!\xa3|D\x98v\xa6WA\xde\x7f\xfd\xcb\xcc\xdaJ\x8cD\xa7\xf0YXY\x1c\xbd\xba\x13=\x11=rV\x042\xca\xc7\"\xa3\\\xde\x7foK)\xce\xc1fF[=k\x87\\\xca'\x97si\xe4\xaa\xd7\x82\xea\xb4\x8d\xcen\xfe\x1dn\x16l\x19~\xcc\"%\x84\xd3\x06\xcbk\xa5\xeeDOD\x8f&\xc9\x08\x19\xe5\xcef\x94\xdf\x12\x8e\x0d\xdf\xfd\xdd\xb2%w\xf9fF[=KXr\xf2l\xde\xd3\xaa\xe4r.\x8d\\\xb5\x16T\xa7\x9b\x95B\xebU~\x16\xc3\xaf\x14n\xb9\xed\xbf\xfd\x93\x9c\x9e\xbb\x06\xcbk\xa5\xeeDOD\x8f\xfed\x8f\x8f]EF\xf9hf\x94\xdf\x92\xde\xf7\x8bn\xaa\x9b\x19l\xf5,\xefG\xec,\xdb\xafJ.\xe7\xd3\xc8\xb9\xb5\xa0:\xb5f\x9d\xd7\xcc\xc2\xdf\xc0\x8e0\x9b6\xcbuu\x96\xd7J\xdd\x89\x9e\x88\x1e\x9bN\x9b\x02\x93\xc8(\x1f\x85\x8c\xf2[\xc2O\xae^\xbd\xb4i\xf1\x1b\xea\x15\xd2\xdf\xeaY[\x02\xa5|r9\x97F\xce\xadEy\xc3^\xe5\xe5\xe4f\xe1\xbf9\xf7\xdf\xfc\xbe\x1c9\xc3Yoy\xad\xd4\x9d\xe8\x89\xe8\xb1\xe9\x14\x9cDF\xf9(d\x94+\xd7\xfe\xeb\x8b|\xaaf\xfa[=T\xca%\x97\xf3i\xe4\xdcZ\x94{s\x96<\xed\xd3\xcc\x82\x16\xef\xf0_\xca\xd1\xd8\xcd\xcd\xd8J\xdd\x89\x9e\x88nQ'd\x94s=\x8cVF\xb9\xb2\xff\x1e\xa3o\xe6\xfc\x0a\xe9ou\xb5NY\xb2N|\x1a9\xb7\x16\xe5\xdew\xde\xcfi\xd5\xcc\x82\x9e\xac\xe5\xf9\x94\xf37\xdd\xe5\xb5Rw\xa2'\xa2G\xaf\x132\xca\xb5=\x8cVF\xb9\xb2\xffn\xca\xf6\xa9VH\x7f\xab\xeb\xea\xc4\xa7\x91sk\xc1\x06\xca/\xb9\xaf\xaag\xc1\x82\x02\xcf+\xe7o\xba\xcbk\xa5\xeeDOD\x8ffd\x0f\x19\xe5\x8ef\x94\xcb\xb7!\x9c\xad\x946f\xb0\x99\xfeV\xe7J\xf9\xe4\xf2P\x1a9\xb7\x16\x1f\xf7\x94l\xfe\x9d\xefn\xb9\xf7\xcam\xd5,\xe8L\x1e\xc9\xf9\xd4py\xad\xd4\x9d\xf0\x89\xe8\x91?wBF\xf9\x18d\x94\xcb7\xc9\xb9\x97\x1d\xf3\xf1\xcd\xf4\xb7z\xa8t\x0b\x9f\\\x1eJ#\xe7\xd6\xe2(\x9bx\x83\xf5\xbeW=\x0b\xff\x9f\x84\xc0QUgy\xad\xd4\x9d\xf0\x89\xe8f'{\xd6@F\xf9\xb8\xe4nV\xd8\xfb\x80!V\xea\x06\x09]T'8\xf6\xea\x84\x8cr\xc73\xca\xed\xe0\xf4\xe2\xe8\xdf\xba\xac\xd4\x0d\x02\x9d\x80\x19\xf1\x91Q>b\x1a\xae\xf8J\x7fbVI\xc1J]\x1e\xe8\x04\xcc\x88\x87\x8c\xf2\x913,,\xdf\xea\x8d\xf2l\xd5J]\x8e\x09\x94\x88\x0e\x9db'\x0e2\xcam\xa0!\xbbTs\xcf\xa01V\xea\x86\x98@\x89\xe8\xd0\x09\x00\xdb\x80N\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\x0d\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\x09\x00\xdb\x80N\x00\xd8\xc6\xc8ur.\xbc;:\xd6\x1f\x95\xff\xbf\xb2:\xcf]\xb8yb\xdc\xdb\x02\xe2\x04\x0b:\x8dyx\xb7!|\xdd7\x84\xdd\xd2\xffW\xe7\x96\x1c\xbb|\xb4(o\x02|g\x0d\xc4\x0d\x16t\x1a\xfb\xf0n#Bu}=\xf9\x8aNg\x05\x16ipS\xf9\xda=\x00N`A'\xd3\xbcm+\x98vfZ\x81#Tw\xbd\xb0\xde#\xeb\xe4\x93\x0eKz\xe1b\x00\x8c\x16&:\xc5Ux\xb7*o\xdbwt\xb9\xe7\x1b\x87}\x9a\xcen\xdf\xf2\xe7\xec\x0e\xd4\xf7\xdd\xb9T\xf8\x8d\x98\x8e\x9d\x00\xc4Dd\x9d\xe2+\xbc[5\xe3MY{_\xdc\x9b\xb5\xd9\x1fV7\xa8\xd3\x9b\xd4\xb1l\x0cE\x00\x07\x89\xacS\x9c\x85ws3\xbe$\x85\xd5\xc9\x8f\xea\xbaA\x9d|W\xaf\xb4\x16z\xe1\x13p\x8e\xc8:\xc5Yx77\xe3\xcdr$\xe3\xa3\x9b\xc3\xea\x86N\xf6(\x1f\xe7\xebd_\x020J\x98\\;\xc5Wx77\xe3\x12Y\x93\xf2\x92\xb0\xba\x8aNw\xe496\xb8q\xf1\x04\x1c#\xb2Nq\x16\xde\xcd\xcdx\xf3#\xacw_\xe1\xa6\xb0\xba\xb2N\xbe\x1c\xb9f\x83'\x86\x1c+\x00b#\xb2Nq\x16\xde\xcd\xcd\xf8E\xe9O'\x85\x17\xb5u\x03:\xe5\xb1\x9f@\xf2\x7f\\\x18\xfec\x1a\x00\x8c\x16f:\xc5Sx\xb7*\xa3\xbcR\xd8}~\xb7P\xa9\xe9\xecNOO\xf6z)T\xfd\x05\xa1\xfc\xe8\xe5\xd6\xc2<;\x7f\xaf\x1a\x80\xc8D\xd6)\xbe\xc2\xbbU\x19\xe5\xbe\xd6e\x9ee\x87}\x9a\xba{\xa5\x1an\xf6+\xac\xbf}\xbap\xfe\x92m\xb6d\xd2\x02\x10\x1d\x16\xee\x8a\x88\x9a\xc4\x09\xef\x06\xc0\x12\xa3\xa1S\xe2\x84w\x03`\x89\xd1\xd0)A\xc2\xbb\x01\xb0\xcah\xe8\x94\x18\xe1\xdd\x00Xf4tJ\x90\xf0n\x00\xac2*:\x0101\x81N\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\x0d\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\x09\x00\xdb\xb0[\xa7\xb3%\xb7\xcd\xaa\xa8\xb9S\x12K\x88,\x00\xf1\x88\xa9N\x1fm\xc9\xf3\x94G}\xb7\xd0A\xa1!\xea\xba2\xbe\x83\xc2A\xb3:V\x18yd\xfa\xc8{\x88\x96\xb3n\xe5\xae`\xb7\xf9[J\x83\\\xe9E\x8f\xd0`V\x15\x8c\x19\xa6:\x95z\x8fn\xf2D\xfb\xbd\xa5V)\xe5\xcb\"/\xba[\xcd\xaaX\xc0Bd\xfa\x98\x87\xae\x1f\x14zz\x0e\x0b\xad==s\x8d\xdfQ\x02\xcd\xeeTzJ\xe9\x7f\xa5\x9eJ|#2~1\xd3\xe9\x8e\xd0\x1a\x0c\xd43\xe5}7\x1f\xca\x155{\xb3\xec\xfc\x06z\xf4G\xc71\x0f]ou\xb3\x84\xc1\xdf\xf9\xfd\x1e\xe37\x94`\xb3\xdd\xe5\xf4]\xed\x8e\xa7<\xa6M\x0c\x9c\xc1L\xa7\xf7\x04\x0bg>\x9b\xbd1}5p\xd8\xbb\xd9\xac\xca\xa8`%\x06\xdd\x14\xd3\xcet*\xf8\xdeStz\xcf\xd8\xe0`\xb3\xdd\x95\xa5\xa7\xfd/\xac\xae\x84NqLD\x9d|\x8b\xe5S\xfb\x1d,\x82\x9c\x9e\xc7\xbd\xef\x16\x96h\xd2\xc8\xfd\xef};\xcf\xed-\x97\xa6}\xd9\xf2K\xcde\x89\x1b5\xe3\x82\xc9){=\x1a\x0d-\xf7\xa0`\x10\x99\xce\x11W\xa1\xeb\x0cI\xa7h\x9a\xed\xae<\xfc\xb4\xbf\xfc(\xd3\xe9\xee\xfa|wa\xf9[~i![\xb7\xe4\xe7\x94\xbf\x17\xd6/\x18\x0b\"\x1f\x9d\xde\xec9)4\xf4\xf4\xdc\xf2\xfbo\xf6\xb8\x1b\xfc\xbe\xab\x9b\xb3\xd4i\xe4\xfe+\xd9\xcb\x0f^n\x10\xa4\x93\x957\x85\x1e\xa9\x15\x97%n\xd4,\x14L\xcexE\xf8\xadz\xbe\x96{\x08\xa0\x1b\x99\xce\x11_\xa1\xeb\x8c\xa0Nf\xcdvW\xde\xcc\xfeh\xfe-\xa6\xd3ya\xcb\x95\xd3\xe5\xc2Uy!\x0b\x1b\x1a\x0a=\xef\x84u\x0c\xc6\x80\xe8O\xf6B1z\\\x1a\xf9p!\x8b\xb3\xf3\x9d\x96.\x8f_\x14\x82_\xb4\x0d\x85\x98\xeb6\xe3\x82\xc9\x197\x85\xf0\x8b\x7fk=p\x84G\xa6s\xc4]\xe8zP'\xd3f\xbb+\xfd\xcb\xb6\xac\xf43\x9d\x86O\xd2%\xf5-\x93\xde*\xb2\x0a\xef\xb28\xc1\x12\xbd\xbe\x81\xd3\xc4\xa6\xd3\xa6\xc0\xe4%>\x0e\xe2\xac\x10\xcc\xd7\x0f\x85\x98\xeb6\xe3\x82\xc9\x197\x85\xd3~-\xd6z\xe0\x08\x8fL\xe7\x88\xbb\xd0\xf5\xa0N\xa6\xcd\xa8N\xec3\x05\xe9\xda\xe9\xce\xe1\xd5\x8f\xe4\x08RL{\x96t\x82}X\xc0x_<\x10\x9bN\xc1\xc9V\x81\xbbz\x09\x9e\xb7\xf0!\xe6\xba\xcd\xf8`r\xbf\xfe\x8f\x9aY\xeb\x81#<\x94\x96'\xdeB\xd7\x83\x1b\xcd\xb4\x19\xd5\xe9\xce\x8e\xdb\x92NW\xbd\x85\xbb\xcf\xf6\x94\xca:I\x0b\xdb#\x98\x8d\xd3\x03'\xb0\xa8\xd3^\xcd^}\x99\x7f\x19\x87\xb3\x1a\x02\x93\xa1\x10s\xddf\\09\xa3\xc1\x1d>\x14o\xad\x07\x8e\x88:\xc5]\xe8zP'\xd3f\xbb\xe5\xc4[\xa6\xd3\x92\x12\xf6&\xf6mY\xa7m\xec\xf1\x98\x10\xed\x87\x19`4\x89^'\xf6#\x99\xbe\x95\x9a\xbd\xfa\xae\xb7\x94\xedc\xdb\xa4\xd7\xd4\xff\xed\xa2\xc0{v\xe8\xadX\xb7\x19\x17LN\xf1-\xd1\xf9\xd5\x18K=\xf0D\xd4)\xeeB\xd7\x83:\x996\xe3t*d\xf2\xfb\xbe!\xeb\x94GE\x1a~\xa4\xd4\x0f\xe2\x80hF\xf6\xaeJ\x92\x94x\x0f6\x94\x08\xee\x17\xfe\xc8\xa7\x91\xfb\xaf\xcc\x7f\xf4\xe8\xa5m\xca\x0f:\xbf'\xdf/\xa4\xca\x12\xd7o\x16\x0a&\xf7\xb33F\xed\x99\x8a\xd5\x1e\x02\xe8G\xa6s\xc4W\xe8:\xe5\xcd\xc3B\xab\x1c\x1dm\xd2\xec\xa3\xcaR\xb6&\xb7J+?\xa2\x15\xd6\x1fnx\x8c\x9e\x0e\xd2\x96Y\xc2\xf2\x93\xc7\x8ar\x90\xb6\x16\x17D\xfe\xdc)G:\x9dwK\xc3\xbb\xef\x95z\xb2W\xffX\x10\xb6\xf2i\xe4\xf4\x02}}av\xf0.\xd6\xbd\xf3\xd9E\x90*K\xdc\xa0Y0\x98\x9c\x9e\xf7{vhgl\xb1\x87\x20\xfa\x91\xe9\x1c\xf1\x15\xbaN\x0f+\xac\x7f\xcf\xdd(\x9a5\x08\xc2&\xfat\x8b\x204\xf8}\xadEY\xde\xf5\xc7\x8a\xdc\xf4\x98\x94\xb5csN~\xa5\xea=\x03\x8c\x19f'{\xd6\xf0ms\x87\x8f\\\x9bp\xda\xbd9\xde\x7f\x82)\x9eC\xd7C\xd7\xab`\xec\xb1W'\xfa\xbeYhq\xc4\xf6\x8e7l\x90,\xee\x88\xe7\xd0u\xe8\x14O\xd8\xacSb\x12\xcf\xa1\xeb\xd0)\x9e\x80NQ\x10\xbf\xa1\xeb7\xa5\xf1\x12\xb3Z\xc0)\xa0S4\xc4m\xe8\xba4^\xf2\xbe\x1f\xc4\x09\xd0\x09\x00\xdb\x80N\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\x0d\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\x09\x00\xdb\xb0['d\x94\x83\x09\x8c\xa9N\xc8(\x1f=\x90Q\x9eh\x98\xea\x84\x8c\xf2\xe8@F90\xd7\x09\x19\xe5Q\x82\x8cr`\xae\x132\xca\xa3\xc4\xb43d\x94O\x00\"gE\x20\xa3\x1c\x19\xe5\xc0\x02\xd1$\x19!\xa3\x1c\x19\xe5\x20*\xa2?\xd9CF92\xca\x81\x09\xb1\xe9\xb4)0\x89\x8c\xf2`\x0f\x81\xceL\xc3\xc6\xd5\x20\xa3<\x91\x88M\xa7\xe0$2\xca\x83=\x04:3\x0d\x1bW\x83\x8c\xf2D\xc2\xa2N\xc8(GF90&z\x9d\x90Q\x8e\x8cr`B4#{\xc8(GF9\x88\x8a\xc8\x9f;!\xa3\x1c\x19\xe5\xc0\x02f'{\xd6@F\xb9\xe3\x20\x056\x9e\xb0W'd\x94;\x0et\x8a'l\xd6)1AF9\x88\x0e\xe8\x14\x05\xc8(\x07\xd1\x01\x9d\xa2\x01\x19\xe5\x20*\xa0\x13\x00\xb6\x01\x9d\x00\xb0\x0d\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\x09\x00\xdb\x80N\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6a\xb7N\x963\xca\xf5Ar9\x18\x8f\x98\xea4\xda\x19\xe5\xfa\x20\xb9\\@r\xf98\xc4T\xa7\xd1\xcf(\xd7\x07\xc9\xe5H.\x1f\x7f\x98\xe9\xe4DF\xb9>H.Gr\xf9\xb8\xc3L''2\xca\xf5Ar9\x92\xcb\xc7\x1d\x91\xb3\"F\x9cQ\xceuf9w\x1c\xc9\xe5Q4Cry\\\x11M\x92\xd1\x082\xca\xb9\xbe,\xe7\x8e#\xb9<\x8afH.\x8f+\xa2?\xd9\x8b1\xa3\x9c\xc7Z\xee8\x92\xcb\xa3h\x86\xe4\xf2\xb8\"6\x9d6\x05&\xcd3\xcay\xac\xe5\x8e#\xb9<\x8afH.\x8f+b\xd3)8i\x9eQ\xcec-w\x1c\xc9\xe5Q4Cry\\aQ'\xeb\x19\xe5<\xd6r\xc7\x91\\\x1eE3$\x97\xc7\x15\xd1\xeb\x14cF9\x8f\xa5\xdcq$\x97\xfb\xa3h\x86\xe4\xf2\xb8\"\x9a\x91\xbd\x11e\x94\x07\xb1\x9a;\x8e\xe4r\xbfy3$\x97\xc7\x17\x91?w\xb2!\xa3<\x88\xc5\xdcq$\x97#\xb9|\xfcav\xb2g\x8dX2\xca\xf5Ar\xf9\x88@6\xec\xd8`\xafN1d\x94\xeb\x83\xe4\xf2\x91\x01\x9d\xc6\x06\x9bu\x9aH\x20\xb9\x1ch\x81N1\x83\xe4r\xa0\x05:\xc5\x0e\x92\xcb\x81\x06\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\x09\x00\xdb\x80N\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\x0d\xe8\x04\x80m\xd8\xad\x132\xca\xc1\x04\xc6T'd\x94\xcb\x8c\xbc\x87hAF\xf9\xf8\xc5T'd\x94\xcbX\xe8\x81\x03\x19\xe5\x13\x0b3\x9d\x90Q\x1e\x20\xfa\x1e8\x90Q>\xb10\xd3\x09\x19\xe5#\xc2\xb43d\x94'\x14\x91\xb3\"\x90Q\x8e\x8cr`\x81h\x92\x8c\x90Q\x8e\x8cr\x10\x15\xd1\x9f\xec!\xa3\\\xdb\x032\xca\x81\x86\xd8t\xda\x14\x98DF92\xcaA\x88\xd8t\x0aN\"\xa3\x1c\x19\xe5\x20\x84E\x9d\x90Q\x8e\x8cr`L\xf4:!\xa3\\\xdb\x032\xca\x81\x86hF\xf6\x90Q\x8e\x8cr\x10\x15\x91?wBF92\xca\x81\x05\xccN\xf6\xac\x81\x8c\xf28\x01)\xb0c\x83\xbd:!\xa3\x1c\x19\xe5\x13\x1a\x9bu\x9aH\x20\xa3\x1ch\x81N1\x83\x8cr\xa0\x05:\xc5\x0e2\xca\x81\x06\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\x09\x00\xdb\x80N\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\x0d\xe8\x04\x80m\xd8\xad\x132\xca\xc1\x04\xc6T'd\x94\xcb\x8c\xbc\x87h9)\xddA\xbb\xf8\xe9h\xee\x12\xda*\xe8\xa46\x19p4T\xd74\xda\xbcg\xaeP\xe2\xf3\x9f\x15\x84\xb9\x97\xd5\x7fxgu\xb6\xb7\xf2\x8a\xf7\xb6\x95\x19O\x20LuBF\xb9\x8c\x85\x1e8b\xc9(\xbf{^\xf8qO\xcf\x0b\xcb\xf2>\xd2\xa9\xafA\xca\x1b\x8c\x92\x8f{J\x02uM\xa3\xcd\x87/\x0b\x9e\x1e\xff\xdd\xb3\xc2e\xf5\xf7L.e\xafv\x15\x19\xe5\xa3\x99Q~K:d\x15\xddT73\xd8\xeaY\xde\x8f\xd8Y6\x9d\xf2V\xd2W\xe0\xbc\x7f\xd3\x16u\\9\xb7\x16T\xa7\xd6,\xe9\xf54\x8d6\xa7:\xdd\x99\x7fG\xd2\xe9\x92\x14\xf0\xc7\x1e\xdf\xe7_\x91\xd0\x8cU=\xe8m\x1d\xa3\x95O\xf1\x88M\xa7\xe0$2\xcaG!\xa3\\\x19\x8aX_\xe4S5\xd3\xdf\xea\xa1R\xef%\xffU\xb7\x9c\x0b\xcb\xc7\x95skQ\xee\xcdY\xf2\xb44[\xd3hs\xa6\xd3\xd9oH:\x95\xc8\xc1\x86\xe5%\xc1k'\xdf%\xd5\x8c\xc3z\xd0n\x1d\xa3\x95O<,\xea\x84\x8cr\xae\x87\xd1\xca(Wt:F\x0f\x12\xfc\x0a\xe9ou\xb5NY\xb2N|\\9\xb7\x16\xe5\xdew\xde\xcf\x91\x0e0\xa6\xd1\xe6L\xa7\xe1\xec\xcb\xd2\xd1\xe9\x11\xb6\x86\xbe\xc2MldO\xda\xb2'\x85\xdb\xfc\x8cU=\xe8m\x1d\xa3\x95O<\xa2\xd7\x09\x19\xe5\xda\x1eF+\xa3\\\xd1iS\xb6O\xb5B\xfa[]W'>\xae\x9c[\x0b6P~\xc9\xcd2gM\xa3\xcd\x99N\xfeM\x95L\xa7\x17\xa5e8)\xbc\x18\xf8\xdc\xc9WZ\xa8\x9a\xb1\xaa\x07\xbd\xadc\xb4\xf2\x89G4#{\xc8(w4\xa3\\\xbe+\xe2l\xa5\xb41\x83\xcd\xf4\xb7:W\xfa\xc7\x9c\xd6\xe1\x93\xee\xb7\x86+\xe9.\x1c\x8a+\xe7\xd6\xe2\xe3\x9e\x92\xcd\xbf\xf3\xdd-\xf7^\xb9m\x1am>|Y8{\xd7\xdf\xe3\x91F\xf6*\x85\xdd\xe7w\x0b\x92\x80\x97<%/\x9c]\xed~E\xb58\xa1\x1e\x0c\xb6\x8e\xd1\xca'\x1e\x91?wBF\xf9\x18d\x94\xcb\xf7\xec\xb9\x97\x1d\xf3\xf1\xcd\xf4\xb7z\xa8t\x0b=\x16\x9c\xcc\x16\xb2O\xb2K\x94P\\9\xb7\x16G\xd9\xc4\x1b\xac\xf7\xbd\xa6\xd1\xe6W\xe6\x0a\xc2i\xbf\xaf\xc4+\x9d\xe7\xb5.\xf3,;,\x8b\xf1\xcejO\xde\xd3\xff\xa6^\x9cP\x0f\x06[\xc7h\xe5\x13\x0f\xb3\x93=k\x20\xa3||\x13\xba\xf8\x1d1\x09\xb8u\xa2\xc0^\x9d\x90Q\x1e'\x19\xe51b\xa3N\x06['\xc1\xb1Y\xa7\x89D;C@4#Cx@B?AFHDFDKHZx\xb8vxu]{\xbb_}\xbez|y\x84|dX\x80\xbfL\x91K`\x81\xbbb\x80\xc0}\x7f|\x7f\x81~c\x83\xbdN\x95Ue\x85\xbf\x7f\x83\x92W\x95V\x82\x84\x81\x8d\x84fg\x88\xc2m\x87\xbci\x89\xc3j\x8a\xc4[\x9aZ\x87\x89\x86q\x8c\xc1\x8a\x8b\x88\\\x9dc\x96\x8cnt\x8e\xc4v\x90\xc6g\xa0g}\x91\xc2\x8f\x91\x8ey\x93\xc9\x92\x94\x91\x80\x95\xc6z\x97\xc6\x82\x96\xc7s\xa4l\xa1\x96x\x95\x97\x94\x83\x98\xc9\x82\x9a\xc4\x97\x99\x96\x7f\x9d\xcct\xa9v\x86\x9b\xcc\x81\x9e\xce\x9a\x9c\x99\x82\xa0\xcf\xa8\x9d\x7f\x9c\x9e\x9b\x88\xa0\xca\x7f\xabz\x8a\xa2\xcc\x9f\xa1\x9e\x9e\xa3\xa5\xa1\xa3\xa0\x8d\xa6\xd0\x82\xb1\x85\xa3\xa5\xa2\xb3\xa7\x83\x91\xa9\xd4\xa7\xa9\xa6\x8d\xb5\x8a\x94\xac\xd6\x99\xac\xd1\xaa\xac\xa9\xa4\xac\xc0\x9e\xad\xcd\x8d\xb8\x93\x9b\xaf\xd4\xbb\xae\x89\x9d\xb1\xd6\xaf\xb1\xae\x97\xbb\x97\x9f\xb3\xd8\xa1\xb5\xda\xc2\xb5\x90\xb4\xb6\xb3\xa3\xbf\x9d\xac\xb7\xd2\xa2\xc0\xa4\xa9\xb9\xd9\xb7\xb9\xb6\xac\xbc\xdc\xba\xbc\xb9\xa6\xc5\xa8\xb1\xbd\xd7\xaf\xbe\xdf\xbd\xbf\xbc\xcc\xbf\x9a\xb1\xc0\xe1\xb8\xc0\xd5\xb1\xc8\xad\xc0\xc2\xbf\xb7\xc2\xdd\xb9\xc5\xe0\xbd\xc5\xda\xb2\xcd\xb7\xc2\xc6\xd6\xbb\xc7\xe2\xd6\xc7\x9d\xc6\xc8\xc5\xbc\xc8\xe3\xbf\xca\xe5\xbd\xd0\xbc\xc6\xcb\xdb\xca\xcc\xc8\xc1\xcc\xe7\xc2\xcd\xe9\xbf\xcf\xe2\xc7\xce\xe4\xca\xcf\xdf\xce\xd0\xcd\xc8\xd3\xc1\xc8\xd0\xe6\xdf\xd1\xa5\xca\xd1\xe7\xcb\xd3\xe9\xca\xd8\xcc\xd3\xd5\xd1\xce\xd6\xeb\xd3\xd7\xe0\xd6\xd8\xd4\xd0\xd8\xed\xe7\xd8\xac\xd5\xdb\xd0\xcb\xdb\xee\xd5\xd9\xe9\xd9\xdb\xd8\xd7\xdb\xeb\xd8\xdc\xec\xd2\xde\xec\xd5\xdf\xda\xd9\xdd\xed\xdc\xdd\xe7\xdd\xdf\xdc\xd7\xe1\xdb\xdb\xdf\xef\xd5\xe1\xef\xf0\xe0\xb3\xdd\xe1\xf1\xe0\xe2\xdf\xde\xe3\xe6\xd9\xe5\xf4\xe0\xe4\xf4\xe3\xe5\xe2\xde\xe6\xef\xe8\xe5\xea\xe5\xe7\xe4\xe6\xe7\xf1\xe0\xe9\xf1\xe3\xe9\xeb\xe7\xe9\xe6\xe3\xec\xf4\xeb\xed\xea\xe6\xee\xf7\xec\xed\xf7\xe8\xf0\xf9\xef\xf0\xfb\xf0\xf3\xef\xf4\xf2\xf6\xef\xf4\xf7\xf4\xf7\xf3\xf2\xf7\xfa\xf5\xfa\xfd\xf8\xfa\xf7\xfd\xfb\xff\xf7\xfd\xff\xf9\xfe\xff\xfe\xff\xfcA\x10\x8d\xd1\x00\x00\x20\x00IDATx^\xed\x9d\x0ft\x14U\xbe\xe7\x07wqv+\xfd^\xcc&O\x98\xe51\xd3@va\xc8\x86\x82\x89M\"\x98`^\xc0\x13a}\x20\x08\x0e\x88\x99l\x1c=A\x98\xe1\xafg2\xcf3YI\x8eA\xf2@$\x98\xacsL\x00\xb3J\x88\x12\x91\x80\xae\xe6\x80\xe1\xa8\xbc#\x90LD\x87\x93\x991\x83\xd0\xbe\xc9L\xc4RQD\x12\xfb\xd4\xd9{oUu\xdd[\xa9\xbe71\xe9\xaa\xea\xee\xdf\xe7p\x92\xdb\x95[\xb7nU}\xba\xeaVu\x7f\xa9\xef\xa9#@\x01\xe2\x9c\xef\x89\x14\xe0!j\x1c\x88u@\x0f\x80\x03\xe8\x01p\x00=\x00\x0e\xa0\x07\xc0\x01\xf4\x008\xb8\xa7G_kMeM\x9b\xfe\xa2\xad\xaejG\x0b\xaf6\xe0\x0a\xee\xe9QW\xd5z\xaa\xa5\xb2\x05\x17{\x1b\xca\x9bO\xb5\x94\xb7\x0b\xe6\x00\x1c\xc75=Z+\xbb\xd0\xcf\xf6\xca\x1e\xf4\xb3\xa1\xb2CQ\xba\xca\x8dC\x09\xe0\x19\\\xd3\xa3\xae\x81\xfc\xaanQ\x94\x8e\xf2V\\\xec\xe1U\x07\\\xc15=j\x1a\xb5_u\x8a\xd2\\\xd9+\xa8\x0c\xb8\x84kz4Uc'\x82U\xbb\xb0\"m5\xe5\xd5MA\xd1,\x80\xe3\xb8\xa6GOU]W\xb0\xa3\xa6|\x87\xa2\xec(\xafn\xedh\xab\xde\x01\xc7\x10\xcf\xe1\x9a\x1e\xca\xf9\xba\xf2\xf2\xf2\xe6\xba\x1a4\x0c!\xe3\xd3\x9e\xaaf\xd1,\x80\xd3\xb8\xa7\x07:\xb3\x9c\xefS\xaa\x9b\x14\xa5\xb1\x86\xbc\xd4\x7f\x01\x1e\xc2==\xc8\xa9\xa4\xbd\x1c]\xd2\xb6T\xf5\xe1rC\x1d\x7f\x06\xc0y\\\xd3\xa3\xad\xbc\x0b\x9dP\xaa\xf1\xf5\xcbyra\xdb\xa3\xdd\"\x03\xbc\x84kz\xb4\x97\xb7t\xb4V\xd7\x91\xcb\x95\x96\xca\x1644\xad\x81\xa1\xa9\xe7pM\x0f\xa5uWU]\xab^n\xaf\xa9\xda\xd5\x02vx\x0f\xf7\xf4\x00b\x00\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\x03\xe8\x01p\x00=\x00\x0e\xa0\x07\xc0\x01\xf4\x008\x80\x1e\x00\x07\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\x03\xe8\x01p\x00=\x14e\xcd\x1a\xbb\"\xa0\xb8\xa9G8D\xd9[]\xaeQ-\x9a%:\xfc\x9b\x7f\xa3M\x11\xb3\xc7\x8f\xc8\xbc\xfb\xc4\xe0yF\x8f\x12\xb4\x88\xa9gE\xb5\xdc\xc2==\xc2!\xca`yK\x07\xa2\xa5\xbcUq\x85\x92)\xef\xdb\x141=\xbf\xf5?qd\xcf\"\xff\x8b\x83g\x1a5\xce\x1e9\xb2\xc7\x7fDT\xcb-\\\xd3\x83\x0aQ\xb6\xe1\xaf\x8c\x05\xf1\x97\x92\xdd\xe0\xacy\xc48\xcb\x1e<\x14\xe5\x041c\xd1\xadJTy\x0d\xf4\x18\x04\x15\xa2\xd4^\xefr\xe9\xdbb\x91\x0f\x1e\x86\x1eO\xfa\xa3\x9b\xd0\x02=\x06C\x85(1\xe4\x9b\xc9npv\xf2F\x9b\xa2\x8e\xa6G\xc9LE\xf9\x85\xdf\xbf\x17U\xf0\xdf\x8e\x8b\x93\xf7l\xbcu\xea\xdd\x83\x06\x0c{\x17M\xbdu#2\xe9\xc4d\xbf\x7f\xa52\xd3\xef\x9f\xde\xab\xf4\xac\x9c9y\xe6J4z\xe9\xcb\x9c\xfc\xeb\x993_\xdc8}Q\x10\xb7\xf0\xe4\x9a\x99\xd3W\xea-\x98z\x18-x\x06\xd7\xf4\xa0B\x94\x98]\x0d\xdc\xda\xd1c\xcd\xe4\xb36E\x9d\x13\xfe\x17\x82g7\xfa\x9fP\x94\xf7\x8fL~\x0c\xed\xc8\x92)h\xfc\xbaw\xb2?\xf3\xb1'\xa7\xae\xb4T.\xf1o|\xe1\xc9\xcc\xdb\xfb\x94\xbe\xd7\x1e\xf3\xbf\xa6\xfc\xd6\xbf\x17Y\xf1\x82\x7f\xcd\x8b{W\xa2\x97\xca\x8b\xd3\xfd\x1b\xef\xf6g>\x91\xf9$ia\xe6\x13\x8f\xcd\x9c\xaa\x0dz\xc3z\x84[\xf0\x0c\xae\xe9A\x85(\x11\xa7p\xde\xc5\x0d\xceN^cS48\x81/]\xfc%\xa4<\x05\xe9\xa1<6\x85\x14\xa7#\x8fJ2\xd9\xba/\xf8\x7f\xab\xe0]\xbd\x17\xbf(\xb9\xe3\x8f3\x9f\xc0\x85\xe0^|0\xb8\x1d\xab\x94Y\x82\xea\xfc_\xa5\x04/e\xca-h\xcc\xf5\xe7\x99w\x909\x0d=\x98\x16\xbc\x81kzP!JD\xc3.A\xedh\xf1\x0b\xf3\x88\xf1\x8bA\x07\x0f\xa4\xc7\x93\xaf\xbd\xb0h\x0a\x99N\xebQ\x12.\x9a\xac\xbc\xa5\xb7\x0f1\x93\xc8\x14\xbc=S?\xb8\xfcq\xcf\xdd\xb7L\xc7\xe7$%s/\xda\xf5Ae\xe3\xcfp\x0b\xe44\xb6\xc7\xffg\xfc\xcb\xd0\x83i\xc1\x1b\xb8\xa7\x87\x19\xa2DT\xb5\xf0\xabF\x8b\xf7\xa7\xac\xb1)\x86!c\x8f?\xfb\xf7\xe02\xad\x87Y4\xb9\xdd\xaf\xa1i\xb1W\xdf\xe5\xafe\xce\xdc\xb8\xf7\xc8\xddD\x8f\x17\x95\xd7&+\xba\x1e\xb8\x05\xe5\x88\x9f\x9c]\x0c=\xd8\x16<\x81{z\x98!J\xfc?\x03\x9d\xe2W\x8e\x16\x1b\xfdgm\x8aa\xb4\xa1\xe9t\xb2/Ez\x94\xdcr\x82\xf0G\xfc\xe2\xfd\xcc\xc7f\x92\xc2\xedw\xe0\x93\xcbJC\x8f)\x0a{\xf4\x20\xff\xe5\x8d\xa1\x07\xd3\x827pM\x0f*D\x89\x87\x1e\xe7\x05\xd5\xa3\xc3\xfbSJl\x8a&\x9a\x1e\x99\x1bO\xa0q\xc4T\xb4G\xfb\xee\x88\xac\xc7\x8b\xda\x98\xe11<\xe4\xe8\xbd\xe31e\xcd\xddx\x889\x13\x1f\x0a\xfan\x1f\xa4G&\xb2&x\xcb\"2\xa7\xa1\x07\xdd\x02\x1a\x0a=\xe1\x81{\xa9\xae\xe9A\x87(\x91+\xee\\\xcd\x09\x0e\x1e\xf8\xca\x05\xfd\xbc{e\x09\xda\xbd\x8b2\x9fx\xe2\x0e\xff\xe4\xdf\x9e@\x171%\xaf)'J&\x1fa\xef\x92l\xf4\xffl\xef\xde\x12\xb4\x8b\x83G\xd6d\x9eU\xceN\xdfx\xa4Wy\xcc\xbfr\xcf\x13\xb7\xa3\x0b\x96\xd7NL\x7f2\xb8w\xf2\x89\xe0\xcf\xf0\x15\xf1\x14\xff\xed{\xf7\xdc\x8aG\xb8\xe4\xae\xe9\x93G\x8e\x9c\xa5[\xc0\xac\xf4\xc2I\xc65=\x98\x10\xe5)wF\xa6\xefO-\xb1)\x9a\xecE\x03\x01\xf4V>qk&\xb2\xe4\xec\xa2)S\xef\xfe\xb5\xdf\xbff\x0d\x9a:\xf9\xc4T\xf4\xd32Xy\xf1\xee\xcc\xe9\x8b^\xc0G\x01\xbf\x7f#\xda\xd7~t\xec\xe9{\xf2\xd6)\x99+\xf7\xdc:yQ\xa6\xdf\xbfw\xaa\x7f\xea^2\xb6\x98\xb2\xb1d\xfa\xcc\x12\xacW\x09=\xe00Z\xc0\xec\xc9\xdc\xa3\xb8\x8e{zx\x80_\xfb\xff\xcd\xa6\xe8\x04\xda\xd0\xd4\xfb$\xb4\x1e\xee}\x92\x0fz\x00\x1c@\x0f\x20\"\xda\xe06\x16\x00=\\\x80\x0cn=p\xd9*\x06\xf4\x008\x80\x1e\x00\x07\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\x03\xe8\x01p\x00=\x00\x0e\xa0\x07\xc0\x01\xf4\x18\x16/\xad\xfaPQ\xceOK\x98\x87\x03\xb8\xa7\x07\xf5$\xca\x9e\xa6]\x95\xbb\x9a\xbc\xf7\xb0\xb0Wg\xc8\x1a\x81w\xb4\x09\xb5r\xed\xa7\xe8\xd7\xe6\xa4u\xdc\xf9\xe2\x07\xf7\xf40\x9fDy\xbe\xba\xa6\xad\xa3mW\xb5;\xdf\x18\xe3\xf0\xf1\xab\xf9\x0f\xbd\x8a8\x20\xbfB^?#\x1f\xd0\xfeP\x97\xf4\x08g\xb68\xc25=\xa8\x10e#y\x0eT\xef\x0e\x97R\x94<\x0a\x7f\x85\x7f\xfeN\xd3\xe3wY\xbf\xe9\xeb\xeb\xeb\xc5\xdf\x11|\xc0\xe7R\xf0\xc2a\\\xd3\x83\x0aQ6h\xa7\xf2\x1a\xb7\x92P\x1c4=>}\xe6c\xf4\xb3\xfd\x1f\xfe\xd3?\xce\x9a4q\xe2\x0adt\xcf\xb8;\x05s\xc6\x07\xae\xe9A\x85(\xcfW7v\xf5v5V;\x1f\xa3\xfc\xf4\xc0\xaa\xec\xc5\xbf\xc1\xfb^\xf9x\xd3\xbc\xf9\xbf\xf9\xcd\xbc\xec\xe7\x99\x0a\x9a\x1e\x84^\xdf\x7f\xce\xc8\x18\x93\x9c\x91>\xe6\x81\x20:|$\xbb\xf3\xedX\x87qM\x0f:D\x19l(//opa{o\x92\x7f\xf3\xca3\xf9\xf7\xa0\xe1\xe6\xa7\x8b\xf3\x9f\xa9\x0dd?\xf3\xd03L\x85\xc2M\x1f\x7f\xfc\xcc*R\x0c\xfe\x87u\xaa\xdavU\x1d\xb8a6\xf2\xb8IJ\x88'\xdf\xb9\xa6\x07\x15\xa2\xecm\xd8\x81\x86\xa6;\x1a\x1c\x8f\xe8\xbfD\x86\x9ao\xca\xe8\x88\xf1\xbc\xfc\x0e\x1ez\xbec\xa9Q\x88\xaf[\xf2I1\xf8\x0fc\xc6\x8cQ\xf2\xc6\x8c\xb9a\x1d\x1aCwH\xee|{\xdaa\\\xd3\x83\x0aQ6\xed\xc0\x07\x0e\x17\x86\xa6\x9b\x0a?\xfd\x1bb\xfe&E\xd96W\xc1C\xd0\x97,5\x0a\x1fz\xf3\xcdM\x9a\x1e\xca\xff\xf9/\xff\x88\xf4\x18;g]{/\xd6c\x87\xb5\xb5x\xc4==\xcc\x10e\xa5\x96gh\xad\x14\xd4\x1fu\x96\xea\xb75\x1eB\x07\x8e\x19h\x04\xf2\xca\xe0\xa3\x07\x1a{\xbc\xa3\x9fo\xfe\xdf\xff\xf8_H\x8f\xa4\xd6.|\x94k\x96\x1c\x97\xd9\x0d\xdc\xd3\xc3\x0cQ\xba\xa6\xc7\xa6\xc27\x09\x1f\xe3\x03\xc7C\xbf{g\xf1\xaaO-5\xa8\xa1\xa9\xf2q\xe0\x7fb=\xdaI\xc7\xd7\xf9\xbcw\x17/\x0a\xb8\xa6\x07\x15\xa2l\x20'\x97\xe0\x0e\xc7/l_\x91\xc9u\xca\xb6Z<\x00)\x90\xe5\xa2\x0f\xf5?\x9cZ\xd7\xae\x15h=\x94\xf5\xff-\xacG\xdf\xc4YJ\"\xe0\x9a\x1eT\x882\xb8\x83\x0cMw8\x7f\xe9\xb2m\xc6\xa6\xe7_\xda\x84%y3\xf0\xca+\xaf~h\x1c\x94\xd2Q\xd2\xa5\x0c\x9c\xb7\xc7\xc7\x8c*\x05\x87\x9bH\x1f\xcc\x93\x8b\x0f\xe9\xa1<\xecc\xeb*\xbeTt\xe4X\x90\x06z\xf0\x115\xce\x85z\x12%\xf3PJGI\xf7\xe9\x0f\xb1\xcb\x1b\xdf\x8b\xd1\xfe_\x86\x08z\x18u\x15\xdf\x02}\xea\xf0\xf5\x18C\xfeq\xfe\xaex\x0a\xf7\xf4`\x9eDI\x15\x1d%=]/L\xd2G\x1cs\xc8T{=\x8c\xba\xe6T\xbc\xa7\x9f\xbaI\xdb\xdf\xda\x85\xc7X\xaa`\xbb\xfbA\x8f\xa1A=\x89\x92~(\xa5\xb3\x84E\xc8\x1b\xdfB\xe8\x0aO\xad\xc4\xc7\x0a\"\xc2\x03>\xb6.\xab\xc7\xcdOQ\xfb\xfb'\xf7Z\x0b\x16@\x8f\xa1A\x85(\x99\x87R:Kx\x977h\xa3\x8e\xfbID!#CQ\xba\xc8\x84\xe4\xd5\x8a\xd2\x97\xce\xd5\x83\xde\xdf/\xdfx\xceR\xb8\xf8\xf8Mcn\xfc%\x9a\xf0\xa3\xb17\xfc\xe8\xdd\xb0\x1e\x8f\xff\xfd\x98\xef\xff\xf3E\xaa\x80\xfe>\xe6\xa6\x7f\x01=\x0c\xa8\x10%\xf3PJ\x07\xe9m&\xd7(\xda\x88b\xb5\x94\xb7\xab\xe6N\xa9\x1a\x97\x1f\xf6m\xae\xc9H\xc6\x07\xb3ii\xeb\xd6M\x93\x92\xaa\xda\xa8\xba\xe8zfA\xb3\xd2\xb2\x20\xa9\xb1\xc3\xaa\xc7\x8f\xef\xb5\x16\x1e\x1f\xfb\xf8\xb9\x97\x7f|\xf1\xe2\xdf=u\xee\xdd\x9f\xfc\xd8\xd0\xe3\xd9\xbf{\xf6\xdc\xcb?\xf8g\xaap\xd3\xbd\xef\x9e{\xf6\x87\xa0G\x18*DI?\x94\xd2A\xf0\xbd\x0c\x84\x1e\xa6n\xc8HM\xcd\xd0n\xbd\x04\x97\xa5&g\x90\xff\xfd\xa7=#9e\xd6\xfd\x92\xb4\x84\xaa\xbb\x04\xfdNjKF?\x97X\xf4\xb09x\xe0#\x82\xc1\xbb7\x1az\xdc\xfc\x1cz\xf9\xc6\xf7\xa9\xc2\x0dohu@\x8f8\xc2\xa2\xc7\x8f~n-\\\x1c\xf3\xae\xf6\xfb\x8d\x1f\x8eE\xe3UC\x8f\xb1\xda\xf0\x95*\xfc\xd3\xd8\x9f\xfc\xf2\x0d\xd0#\xbe`\xf5x\xce8f\x84\x0bh\xff\xebz\xdc\xfcOo\\<\x17\xd6c\xcc\x1b\x86=F\xe1\xe2s\xf7\xfe\xe8\x86{A\x8f\xb8\x82\xd5\xe3\x07\xbf\xb4\x16\x90\x16\xfa\xc9\xe5\x06$\xcc\xb3a=n6\x8e.\xe1\x02\xe6\xe5\x1b@\x8f\xb8\x82\xd1\xe3\xd9\xef_\xb4\x14\x10O\xdd\xa8\x0dMo\xba\xf7\xdcs\xdf\x0f\xeb\xf1\xd4\xd8_\xbe{\xee\xa9\x1fP\x85\x1f<~\xee\xdc\xcfo\x02=\xe2\x0a,\x86>x@G\x02\xe3\x98q\xb3y\xf0\xb8x\xf1_\xfe\x9e\\\xd8>\x87\xaeo\x7f\x1e\xd6\xe3\xe2S7\xdf0\xe6\xe6\xa7\xa8\xc2\xe37\x8f\x19\xfb\xc3\x97A\x8f\xb8\"<(\x1d5@\x8f8\x02\xf4\xe0!j<\xee\x01=x\x88\x1a\x8f{@\x0f\x1e\xa2\xc6\xe3\x1e\xd0\x83\x87\xa8\xf1\xb8g\xcc\xe8#Z\xa4\xb3\x80\x1e\x00\x87\x98\xd0#OJ]\x00))7\x88\x09=:\x1a\xab&\xa6z&\x05\x93H8\xafG\xa3q\x1c\xe8\xa8\xa9j\xe8\x18T\x8c@\xa3\xe4\xc2'\xfe\x80\xe3zt\x95\xb7h\x85\x8e\xca\xc6\xf6\xc6\xca\x0eK1\x12\xcd\x89\xf1\xf4%\xaf\xe1\xb4\x1e\x1d;t=\xfa\xc87\x8f\x9b\xaa\xfb\x98bD@\x0fWpX\x8f\xc6\xf2F=j\xddVI\x1e\xc6P\xd9\xc6\x14#\x02z\xb8\x82\xc3z\x04\x83F\x94\xb6A\xfb\xde^]#S\x8cH\xab\xe4\xc67\x95\x13\x1e\x87\xf5P\xc2I\xeb\x1a-\xd5\xd2T\xc3\x14#\xd2\x9b:\xad\xa9#\x91\xfe\xe3\x15o\xe0\x9a\x1e\xfa\xaf\x96j\xa6\x18\x19\x9c\x8c\x9e\xcd\xab\x00D\x01\xd7\xf4\xd0c\xf9\x8d5L1\"=i\xe3\x1fi8\xa5\x00\xce\xe2\x9a\x1e\xfa\x80\x03?\x19\x9d*F\xa4Yr\xfcIs\x80\x8bz\xb4\x95\xe3\xdb\xa0=\xe5mL1\"p\xe5\xe2\x0a\xae\xe9\xd1GB\x93\x8d\xda}\x8fp1\"\xa0\x87+8\xacG\xb0\xa3\xa3\xaa\xb1\x83\xe4\x9c\xe1\xaei\x0c\xe0\xb0\x1e-\xe5\x04\xf2\xf1ZGCe\x8d\xf1\x99\x8bY\xb4\xa3\xb7\xa3%\xcf\xe7B~\x1fpX\x8f\xef\xc6\x1cI\x1a\xef\xc2\xff\x0d\x03\xc4\x86\x1e\x1d\xadp\xe8p\x87\x98\xd0\x03p\x0b\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\x03\xe8\x01p\x00=\x00\x0e\xa0\x07\xc0\x01\xf4\x008\x80\x1e\x00\x07\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\x83\xf3z\xd8\x85(\xa9\xa9\x80\x97p\\\x0f\xbb\x10%5\x15\xf0\x14N\xeba\x17\xa2\xa4\xa6\x02\xde\xc2a=lC\x94\xd4T\xc0[8\xac\x87m\x88\x92\x9a\x0ax\x0b\x87\xf5P\xecB\x94\xd4T\xc0[\xb8\xa6\x87%9\x09zx\x12\xd7\xf4\xb0$'A\x0fO\xe2\x9a\x1e\x96\xe4$\xe8\xe1I\\\xd3\xc3\x92\x9c\x04=<\x89kzX\x92\x93\xa0\x87'qX\x0f\xfb\x10%5\x15\xf0\x14\x0e\xeba\x1f\xa2\xa4\xa7\x02^\xc2a=\x80\xd8\x02\xf4\x008\x80\x1e\x00\x07\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\x03\xe8\x01p\x00=\x00\x0e\xa0\x07\xc0\x01\xf4\x008\x80\x1e\x00\x07\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\xc3\xf7\xee\x07\x80\x88\x8c\xe8\xe8\x01\xc4;\xa0\x07\xc0\x01\xf4\x008\x80\x1e\x00\x07\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\x03\xe8\x01p\x00=\x00\x0e\xa0\x07\xc0\x01\xf4\x008\x80\x1e\x00\x07\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\x03\xe8\x01p\x00=\x00\x0e\xa0\x07\xc0\x01\xf4\x008\x80\x1e\x00\x07\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\x03\xe8\x01p\x00=\x00\x0e\xa0\x07\xc0\x01\xf4\x008\x80\x1e\x00\x07\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\x03\xe8\x01p\x00=\x00\x0eC\xd1#\xb8.=%)\xed\xb6\xa6\xc1\x7fyT\xbaS\xff1\x02\x066\x8f\xf7\x8dk\x08\xbf\x0c\x0e\xa0\x1f\xd5\xd2mf\x85]\xd2\x9c\xc1sQ<\"-\xe3\xfe]@\xc4\xe6-\x1d\x13@\xfa-\xea\xaa\x80Q\xd9\x9e\xa3\xc9\x10\xf4\xa8J\x924f]\xb5\xfeiTVg3n\xbb\xc5x\xf5h2^\x8a'\xf4`;&@\xeb\xb7\xa8\xab\x02Fe{\x8e&b=VH\xd2\x9cV\xe5\x9b\xae\x07|R\xc6\x80\xe5o\xa3\xb2:\x93\xa4\x15\xdf\x0c\x18-\x0fH\xd2\x20=:\x1em\xb4\x9b/\xcc\x08\xf5\x88\xd8<\xd31\x01z\xbfE]\x150*\xdbs4\x11\xea\xd1(I;\xb4R\xab$UY\xfe8*\xab3Nj7_\xd8\xe9!b\x84zD\x84\xe9\x98\x00\xbd\xdf#dT\xb6\xe7h\"\xd2c\x20\xcd\xdc\xf6\xcb\xa4\xf1\x96\xbf\x8e\xca\xea\xa4I\x1d\xe6\x0b/\xe9\xc1tL@\x82\xea\xd1,IA\xa3|\xfeQ\xf2nj\xce\x1b\xe7K\x9e\xf8\x80\xa2\xb2\xab\x13\\1\xde\x97:\xa7U\xabJ\xbf\xe8Y2>)eZ\x15s\x94\xeeZ2.)u\x0e>\xafO#\xc3\x1ac\xff\xae&\xaf:\xb0\x1e\xca\x8aq\xbe\xf1\x0f\x98't\xbbf\xdaf\xa7\xa6\xccj\xc7zTK\x13\xb5I\x9b\xc9\x8bG>'s\x7fN&Q\x1d\xae\x96\x1e\xed]\x92\xe6\x9b\x84\x06\x9c\xd5\x13}i+\xa8\xf1B\xcfj\xdc\xe5\xb6p\xdbF\xc7\x8c\xbd\xf5\x88\xb4D\xb5\xb6\x1c\x9e\xc7\xe8\xb7\xde\x96\xb9z\xd69t\xe8\x85\xd9o\xcf\x89\xd2j\xd5}Dz<\x20M\xb0LY&I\xe3&\xa5\xa1\x1f\x9f3\xab\xd3\x9a,\xf9&\x8d\x97\xa4u\xaa\xe5EW\x8a\x94\x9a>\x01\x0dl\xa96\xea\x92\xa4\x94t\xd4\x06\xda\x02\xeb\xf2|\xd2\xac\xbc]\xfa\x1fj\xf2$\xe9\xb6\xbc\x20\xda\xa8h\x11i\xa9\x924q@\xdf\x7fv\xcd\x94KR\xda$_R\x06\xda\x89\x9f'I]d\xda\x04\xa9\x0d\xcd\xbdb\x9c\x94\x82\xe7\xfe\xc6\xd2\xe1jiY\xaa\x94\xe6\x93\xa4\x86%\x92\x0fM\xcbP\x0d=\x9a\x92\xb5.\x85\xaf\xcf\x8c\x8eY\xf4\xa0[6\xe71\xfa\xad\xb5E\xad\x9ee\x0e\x1dza\x11\xb6gl\xe81[Z\xc0Nh\x96\x92\xf1A\xa1-Ez\x94^\x9d`\x8a\xb4\x1a\xad\x7f[\xaa\xd4`y1Gz\x00\xed\xe2S)\xe6\x86WO%I\xeb\xd0\xb4\x06\x9fT\xadF:\xb9H\xe3\xd1\xa1\xaa9I\xaa\xd1\xf7\x9f]3\x92\x84\xb4\xfa|\x169\xf8\xdc\xa6\x89y\x0a\x9f\x00\xd1\xdc\x13\xd0;\xb3\xc9\x87\xff\xcet\x18\xfdeb\x97:\x90'\xf9|u\x03j\x83$\x9d\xd2\x9b\xefM\xc1\xed\x0fl\x96|\xe6\xbb\\\xeb\x98E\x0f\xaaez\x1e\xbd\xdf\xa4-f\xf5\x989t\xe8\x19#lO\xb5\xae\xdc<\x90\xb9\x87H\x8fiV\x89WK\x0f\xeb\xbf\x97\xd1\xab\xb3Z\x9aM&\xd7\xe1\xa3\x0d\xf3b\xbc\xb6\xf7+\xf3\x9a\xc3m\xdc\xa6o\xf1]R\xea@D=\xc8\xc1`\x09^\x0a\xd9\xe66\xcd,\xd0\xfav\x95\x0c\x8f\x9a\xb4\x81\xd1\xfd\xd8\x124\xf7ym\xee%\x96\x0e\xeb\xedvI\xd2fw\xd8\xeb\xa1\x1d\x7fj\xf0o\xb2\xff\x067\xf3\xb9\xd1L\x0d\x19\xd9\xae\xc0\xc7\x92\x16)\x9d\x9a[\x1f(R\x1d\xae\xd6\xde\xb7h)x$\x88\x8e?\xe5z-\x9f>t\xa1\xb1\xd5\x83j\x99\x9e\x87\xd2\x83]=K_\x08\xec\xc2\xec\xb6\xa7W\x10\xe9\xb1\x99\x1e\x9a\xb6\xe2-P\x99\x86\x07\xe9\x93\xa61\xab\xa3H&\x0d\xcc\x0bt$_\x90\x8c\x0aI\xcb\xc2C\xb3\x0e)I/\xcd\xc6wRx\x17\xb6\xa6\x1e\x83\x9b\xe9\x91$\xad\xd0H\xf4h\x97\xd2\x06\x90\xcd\xd5\xd4\xdc\xda\x8ct\x87\xf5\xbf\x0c\xd2\x03\x1dN\xa8\xc3\x86\x8e\xad\x1ef\xcb\xcc<\x94\x1e\xec\xea\xb1}!\xb0\x0b\xb3\xdd\x9e^A\xa4G\x07\xb5*=RR;\xbe\xd3\xbc\xa4\xee\xd4U\xf4\xdbr\xf48\x1f\x9e\x87y\x81\x19h[7I2W\xba'\xfc\xf6\x9a\x16\xf9\xe81H\x8fA\xcd|n\xdcj\xa8\xd3\xae\x8b'H\xad\x03\xc9I\x9f\xab\x16=\x98\x0eG\xd2C\x95\x84G\x8fuV=\x98y(=\xd8\xd5\xb3\xd1\x83\x99\xd1~{z\x05\x91\x1ehH\x18\xbe\xe7\xb4\x1a\x0d\xb5\xd0\xf9T\x1b\xbb\xad`W'M?\x9d\xaam=\x03\xec\x8b\xa06\x02\xaf\x96\x92\x8c\xa1\xc3\x80o\x08c\x0f\xab\x1e\x83\x9bQS\xf5f\xd6i]\xdc,\xadn\xd1\xf6\x01\xbdK\xd8\x0eG\xd4c\x82>\\j\x98Ui4\xafw\xac\\?\xbd.\x19\xa4\x07=\x0f\xa5\x07\xbbzvzP3F\xda\x9e\x1eA\xa8G\x8d$\xd5i\xa5&\x09]{)\xba\xf9W\xc7\xe1\xadf\xae\xce\x12)\x9d\xec\xb6f|\xb1F\xbfP\xf4=\xd1E\xedWch_#\xa5|3D=\xec\x9a\xd1/\x06\x06t\x83\x83\xd2\xf8\xd5\x9a\x97\xf4.a;\x1cQ\x8f\xd5\xfa\xde\x9b\xad]\xd2\x10\xb4\x8e\xd5i\xa7Wt}d\xd5\x83\x9e\x87\xd2\x83]=;=\xa8\x19#mO\x8f\x20\xd4C\x9d\x83\x06MmW\x07\xba\xee\x97\xf0Gr\xc8v|5\xd97K\xc2;\xce\\\x9d.\x9f\xb4\x0cm\x9f\xf6T|\xa5\xc3\xbc\x98%\xcdB\xbb\xe2j\x1euC\xebT\x92\xb4\x19\xed\xe4\xc6d|\xe1`\xb9w\x9d$5|3`s\xf4\xb0i\xa6\xc7'=:\x80'\xe9\x07\xb8\x0c)9\x85\x1c\xd6-G\x0f\xaa\xc3\x11\xf5\xe8I\xc6]\x1axDJV\xc2\xedk\x1dC\xe7\x0a\xf4\x97\x9e\x0ci\x90\x1e\xcc'I[@wE\xef\xd8@\xf5$_j\xde\xf9\xd6\xc1z\xd0\xf3h\xfd\xd6\xa7S\xabg\xab\x07=c\x84\xed\x19;z\xc4\x0a\xc1A\x9f(\x03#$\x9e\xf4\xd8L\x0d+\x81Q!n\xf48\xdf\xdb\xe0\xf3\x99\xc3J`T\x88\x1b=\xf0\x00\x1a\x0e\x1e\xa3M\xdc\xe8Q\x99\x9c\x06v\x8c:q\xa3\x07\x10\x0d@\x0f\x80\x03\xe8\x01p\x00=\x00\x0e\xa0\x07\xc0\x01\xf4\x008\x80\x1e\x00\x07\xd0\x03\xe0\x00z\x00\x1c\xdc\xd0\xa3\xa2BT\x03\xf0\x08#\xd5c\x9b,\x1f\xa3^\x9e\xce?\x19\xb1\xaa\xc1_\xe5\xdd\xa2*\xa3\xc1\xdb3d\x8d\xfc\x90\xa8*C\x05\x9a%\xfb\xb2\xa8V\x820R=\xaetf\xd5S/O\xe6\x1c\x8fX\xd5\xa0,p\x05\xff:\xf3'QE\x13a]\x9b\x0a\xfd\xefeUt\"v\xcb_\xd9\xcc\x10\x99+\x9d\x9d\x07\xe5\xdf\x8bj%\x08#\xd5CU\x03\xb4\x1e\xaa\xf8\x9dzy\xc6N\xf2\xbb\xa8LP\x91BX\xd7\xb6\x82\xd6\xb3\xa3\xf25\x9b\xbfq\xe9\x06=tF[\x0f1[\x03_\x92\xdf\xf7\x89v9\x85\xb0\xaem\x05\xadg\x97w\x8a\x95\xb5\x00z\x18\x88\xf4\xb8^V\x98U\xb8\xe1\x02*]\xc8\x92\xe5\xda\xcbe\x0b\xb3\xd7~\x8b^]\xdeR\x90\x95\xbf\x1e\x9f%\x02\xbbw.\xcd^\x8bK\xd7\xb2e}$\xf2:*\xd4\xab\xf5\xe8\xe7\xeb\xe8\x80r\xb48g\xe9\xce~\xbd\xc1\xcf\xb2\xb6\xa3\x9f'\xf5q\xc1*\xce\"\x0c\xe8\xbatc\x9dk\x0b\xb3\x0a\xd6/\x0c\xb1\x15(\xc2\xe2\xfe\x05\xb5\xbb!T(\xcb\xb9!si\xdf\x16d=]Xxf{n\xe9u4\x82\xca:XQ\x98\xbbA\x1fr\x84\xf5`\xbb\x9e\x80\x88\xf48)W\x9cy}\x83\xdc\x8d\xce\xe5\xaf\x1f[\xb88\xa7pg\xd9\x8c/\xd0\xb9>g\xd5\xfe\xd3\xf5\xf2\x01T#\x20/=v\xbc`\x0b\xae\xdc\xdd\xd9\xa9\xed\x92\xeb\x9dsk\xbfR\xbf\xaa\xcd\xed\xbc\x8e\xc7z\xdb\xdf:\x98\x7f\x9f\xfe\x1e\xae\xc8\xc2&\xf5\xbf\xd7\xb9\xf8A40\xf8k\xe4E\x84\xa1\xebR\x8d\xfda\xc6\xd6\xe3\xa7\x0f\x15\xc8\xdf\xb2\x15(\x02\xb5\xfd\xfde\xf8L\x16\xfa\xa0^\xfe@=:\xe3\xe8G\xf4\xd2\xce\xcc\x95w\x96\xca\xf3\xf6\x15\x1cP\xffr,K^\xb8\xaf~a\xf6%2cX\x0f\xb6\xeb\x09\x88H\x8f\xfech\x07\x87\x96o\x20/\xee\x93\xd1;-\x84&\xf4\x17\xaeE\x9b,\xf4:>\xab\x07\xf2\xbfF\xdb1_\xaf\x9f\xad\xbfc+\xf0\xd1\xbel\xab\x8a\xf7\xc7Q\x15oq\xed\x02\xe7\xb3\xacmz\xcd\xf0\xf9\xc0~\x11\x0c\xe1\xbaTc\x07\xf3\xf1!\xe6`n\x88\xa9@\x13\xc0\x87\x94\xf5\xa4\x18\xdaZt\xadp\x1f.QK\x9b_\xa6\xbe%\x9fT\xb7\xe2\xeb\xec\xc0B4\xf9Za\x11\xa9m\xe8\xc1v=\x11\x11\xe9\xa1^;\xb8\xf6\xae\xb9\xf2rR\xbe/\xa0\xbf\xab\xdf\x96?\x0aW\x08\xe0\xad[\x1f\xd0_\x19z\x9c\xc9\xeeW\xfb\xb3;Q\xa9\xec\xae\xd0\xb7\x88B\xedf\xc7\xb6\xac\xcf\xf4\x9a\xe6\x1e\xb5]\x04C\xb8.\xd5\xd8\x17\x85\x0b\xb7\x1f\xfa(\x14b+\xd0\x04*\xba\xbbu\xeb\xd4\xfe\x9f\x16\xac\xd7\xaa\x9aK\x9b\x7f\x0c\xed\xfa~u7\x9e7@.\xb6\x0fj\xc3XC\x0f\xb6\xeb\x89\x88H\x8f\xee\xfc\xc2\xdd\xc7;K\xf5}W\xa4O=\x20\x9b\xe7cr:\x19\xa4\xc7\xb7\x05\xc7\xd5\xe3\x05x\x87,\xd7G\x06d?]\x09l5\xe6\x0b\xefQ\xfbE0\x84\xeb\xd2\x8d];T\xb6T.\xd8\xcf9z\xa0\xbe\xbc}Z\x7fq\\~\x8f\xfc\xa6\x966\xff\xb4\xda\x9d\xa5\xeaz\x90~w\xca\xe4\x02\xd9\xd0\x83\xe9zB\"\xd2ci\x11\x16a\x8b\xbe\xef\xb6\xe8SO\xcb\xe6}\x06{=\xd4\xed\x1b\xd4-x\x10\x8a\xde\x82\x7f\"\x90\xf7\xe5N\xd98xh{\xf4\xf0\x17\x91\x16\xc1\x10\xaeK5\xd6\xbd\x1b\x89q\xedX\xf6A\xa6\x02\x8d>4\xbd\x80\x97|e~\xed\xc2\xaf\xf1+jiX\x8f\x80\xa1\x07\xb9\xda>$\x93\xd3\x9ay\xf4\xa0\xba\x9e\x90\x88\xf4(\xc4\xbb+\xf4S}\xdf\x19\xef\xd1\xeb\xf3K\xf1\x9bv;\xde\xa6\x11\xf4\xf8\x20\xf0e\xe0\x03\\8\xad\x9d\xbak\xf1\x99\xffK\xf3\xe0\xa1\x96\x96\xa2\x9d\x86\xfff\xbf\x08\x86p]\xaa\xb1z\x99\x1c\x18J+\x98\x0a\x88\xcf\xf6\xe9\x0a\xeaz\xccG\xe7\x8dPQ\xadZA\xfaL-\x8d\xd1\xa3\x00\x0f\xa9\xee*%s\x18z\xd0]OLDz\xd4\xcbe\x07\xf7\xdd\x87\x8e\xe1\xdd\xdf~@\xae\x0f\xb4M\x7f&p\xcf\xa1\xb7\xb7\xcb\x87\xd5/;\xb3*\xbaC\x1fUdu~\xa9\x86~\x8f\xae\\*:;\xc9;0T\xb8\xb6P;\xd9\xef\x9eQv\xfcx\x05\x19\xe5\xed\x9ca\xde\xad\xae\x0f\x1c8^\x9a\xf3E\xc4E0\xbd0\xeaR\x8d\xd5\xcb9\xb5'Q\xf1\x0c[AU7h\xc3Q\xe3\xaei\xe7\xdc\x9d\xfd\xefm\xcb\xbf\xa2~6w\xfb{!ji\x7f\xc9=\xd0\x7f,\xebB\x7fY\xe9\x15<\x8c]u\xec\xf0\xe2\xdcO\xd0\x98\x06\xdf5=\xd0\xd9\xc9.-A\x11\xe9\x11:\xb08\x90_vxqV\xe9\x05\xed<\xac]\x09\xa8\x9f\x94\x15\xe6\x14\x1d'\x9f\xb9\xc8Y\xff\x9e\x83~nS\xff\xa0\x9f\xaa\x0f\x91\x1a\x07\x02\x07\xf46N\x97\xce\xcb-~[\xc57F\xa8cCh{n\xf6\x83\xdd\x9cEP\x84\xebR\x8d\x1d}\xb0\xbe0k~\xe9\x19k\x05\xf5p>\xe9\xc0\xdb\xb2\xc1\x81\xd3\xe8\xc7Nu\xbb,\xcf8c.\xad\xb8@\x96\x8f\xe5\xc89\xc7\xc8\xd8\"\xb0\xb3bna\x19\xbea\xb7U\x9f\xab\x8cYZ\x82\"\xd2cTyZ\xb6\xde\x9a\xf0\x0c\xc3\xbd\xf7\x9b\x208\xaa\xc7\xd6a\\!\xf6\x7f\xa6\xe1\xd0-K\xd0\xc3\x16G\xf5\x18\x0e\x0f\xea\xc7\xf8\x07E\x15G\x07\xd0\xc3\x16\xcf\xea\xf1\xc9I\x8dOD\x15G\x83+d\x80-\xaa\x95\x80xV\x0fG!\x03\xec\xc1\x17L\x00\xe8\x01p\x00=\x00\x0e\xa0\x07\xc0\x01\xf4\x008\x80\x1e\x00\x07\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\x03\xe8\x01ppC\x0f\xc8\xd8\xc6\x0c#\xd5ct2\xb6C\x99m\xb8\x8cj\xc6\x16M\xc4\xdf^9\x20\xcbV\xb5\xa3\xd1u\xef0R=\xbe{\xc6\x96F4\x9b\xeb\x19\xdb/r\xf6\xe3/\x9c^\xdb\x9fc\xfd\"\xbd\xd9ua'c\x90\x91\xea\xf1\xdd3\xb6\x0c\x82\xd9\xdc\xcf\xd8.?L~\x1d^>\xa8r\xb8\xeb\xc2N\xc6\x20\xa3\xad\x87\x18#c;\x1c\xdc\xcf\xd8n\xa9%\xbfjm\xbfH\xaf!\xecd\x0c\"\xd2#J\x19[u\xa9>0(\xa6g\xb3D]u<\x91\xb1\xdd\xad\xed\xfb\xb2\xdd\xccv0\xbbn\xdfI\xfb\xd0p\x0c!\xd2#J\x19[5@\xc6\x05E\xf2~z6K\xd4U\xc7\x13\x19\xdb\xc3Ejw\xe1\xef\xd5\xfb\x0e\xb1\xdb!\xdcu\xfbN\xda\x87\x86c\x08\x91\x1e\xd1\xca\xd8\xd6\xa3q\\\xa8B>h\x99\x8d\x89\xba\x9a\xb8\x9f\xb1\xed,Pwg\xedV\x0bp,\x94\x0d\x02\x87\x93=v\x9d\x8c\x14\x1a\x8e\x15DzD/c\xab\x86\xcaf\x84\x03$a=\xe8\xa8\xab\x89\xfb\x19\xdb/\xe4\xfe\x07\xb7\x16_\xd7B~L\x10x\xb0\x1e\xcc\x1a\xdb\x87\x86c\x05\x91\x1e\xd1\xcb\xd8\xf6\xaf\xcf2\xaff\xc3z\x90\xdf\x9d\xb2\xe5\x1a\xd1\xfd\x8cm(p)\xe7O9\x97\xb2\xb4\xa5\x15QK\x19\xac\x07\xb3\xc6L\xdd\x98C\xa4G\xd42\xb6\xd7\x1f\x0cP\xf1\xa2\xb0\x1et\xd4\xd5\xc4\x03\x19\xdb\xc5\xfb\x0b\xd5\xc2\x03\x8b\xc9t&\x08\xcc\xeaa\xe9d\xa4\xd0p\xac\x20\xd2#Z\x19\xdbkE\xe4\xccs\xb2\x94\x9d\x8d\x89\xba\x9ax\x20c\xbb\xbex\x8b\xba\xa5x-\x99\xce\x1c\xab\xc2kl\xd7\xc9X\xbf\xdc\x15\xe9\x11\xa5\x8c\xed\xb5\xe5\xf2>|\xe9\xb2\x15\xed\x1ez63\xea\xca\xf6\xc2\xfd\x8c\xed\xce\x19\xfb\xd5\xfd3\xd0\xf1\x90\xde\x0e\xcc\x1a\xdbt2bh8V\x10\xe9\x11\xa5\x8c\xedGYz\xdd\x85*3\x9b\x19ue\xf0@\xc6\xf6\xad\xec\x0b\xea%|\x03\x9d\xde\x0e\xcc\x1a\xdbt2bh8V\x10\xe91\xaa\x883\xb6\xc3\xbd\x05;j\xb8\xb6`o\xe3\xa8\x1e\xe2\x8c\xad\xb9\x97\x20c\xeb\x05\x1c\xd5C\x8c\xb9\x97\x20c\xeb\x05<\xa5\x07\x1du\x85\x8c\xad\x17\xf0\x94\x1e\xaeE]][\xb0\xd7\xf1\x94\x1e\x80\xd7\x00=\x00\x0e\xa0\x07\xc0\x01\xf4\x008\x80\x1e\x00\x07\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\x03\xe8\x01ppC\x0f\xc8\xd8\xc6\x0c#\xd5#A2\xb6\x87qC\x05k\xcd/`\xdb\xf2Y\x96\xbc\x94_#\xd6\x18\xa9\x1e\x09\x92\xb1\xbd~T\xde\xd7y\xb8x\xc6\x19\xdbY\x0cB\xdd\x15\x015\xae\x18\xa9\x1e\xd6\x8f\xc2\xc5\xef\xd4\xd8\xcc\xd8^\xc2\xdfl\x0d\x15/\xb6\xabNQ\x0fzX\x18\xee7%b3cK\xf4P\x0f\xca\x82o'%\x9a\x1e\x90\xb1\xd5\x96\xa6\xe9QV\xc8N5\xb7\x0e:)\x95\x15\xe6n\xd1N.\x90\xb1M\xb4\x8c\xed%\xf9\xad\xfe\xbf\xee\x96\xf7\xb1S\xcd\xc6\xd4\xcbs\x97\x1e>\xbeV\x0e0\x15\x20c\x9b\x20\x19\xdbK\xe4\xf8T\x16b\xa7R\x8d\x15/\xee\xc7\xc5\x80jYc\xc8\xd8\xaa\x09\x90\xb1\xbd$\xef\xef>Y\x9c\xfd\x19;\xd5l\xec\x9a\x16f\xa8\x0dX*@\xc6\x16\xef\xd9\xb8\xcf\xd8\x92\xb1\x87\xe6\x005\xd5l\xac[&\xd9}\xb2\x1d\x20c\x9bp\x19[mh:\xb7\x96\x9dj6\xf6\xb5v\x9e\xdc\x1aP-k\x0c\x19[5\x012\xb6\x9a\x1e\xf9;/\xec\xa3\xa7R\x8d\x15\x15\"\x1b>\x09\x04\xd8\xd9\x86pM\xeeiDz@\xc6V[\xda\x05\x19\x1f\xebJ\xd7W,g\xfb`4\xa6^\xca.\xac\xaf\xcd\x95\xb3\x8e\xfe\x052\xb6\x09\x97\xb1E\x95\xf05\xf8\x85\xc5\x05'\xe9>\x98[\x07]\xd9n\xc8]\xb8\xfbh\x96\xbc\x8d\xaa\x00\x19\xdb\xe1\x00\x19\xdbX\xc3Q=\x20c\x1bk8\xaa>o5\x06\x00\x00\x09\x1cIDAT\x87\x18\xc8\xd8z\x0bO\xe9\x01\x19[\xaf\xe1)=\\\x8b\xba\xba\xb6`\xaf\xe3)=\x00\xaf\x01z\x00\x1c@\x0f\x80\x03\xe8\x01p\x00=\x00\x0e\xa0\x07\xc0\x01\xf4\x008\x80\x1e\x00\x07\xd0\x03\xe0\x00z\x00\x1c\x04zX\"\xb4\x14_W\x14d\xeb_\xee\xf5|B6Q\x9fB;r\x04zX\"\xb4\x14\xa5\xf9\x87\xb6fk_(\xf7|B6Q\x9fB;r\x84'\x97\x08\x9ft_\x93\x0f\x9a\xe9\x0d\xc1\x1b\xdc\xfd\x84l\x82>\x85v\xe4|W=.\xcbC?*\x0b\xbf\x8d\x1b\xf5\x84l\x82>\x85v\xe4\x88\xf5\xd8\xbeU\x0b\x9f\xa2a\xc8Q\xfd\x7f\xb0\x08\xcd\xd3\xc6\x05\xf8\x8b\xeafB\x16M?\xb4*\xfb\xa7\x07\xd9\xfd\xe9\x89\x84l\x82>\x85v\xe4\x88\xf5\x90W\xbd~ly\xf6%m\x18\xa2\xff\x0f\x16\x1fu\x1e\x93\xeb;;\xc9W\x86\xc3\x09Y\x9c\xf2\xa8}\xab6\xf0\xbf\x99\xf9=\x91\x90M\xd0\xa7\xd0\x8e\x1c\xb1\x1eK\xd1\xfb\xa8\x7fq\x91\xca&Z\x98\x93\x8b\x9eR9M\xb2\x20\xa7e*\xdeDp?!\x9b\xa0O\xa1\x1d9b=\x9e\xc6?\x0f\xe1\x11\xa2H\x8f\x0am\xe4w\x8f\xf5\xea\xd1\xfd\x84l\x82>\x85v\xe4\x88\xf5\x20\xdb\x8f\x84OEz\x14k\xef\xf5\xf5E*\x8b\xfb\x09\xd9\x04}\x0a\xed\xc8\x11\xebA\xc2\xa7\x87q\xf8\x94\xec\x84Z\xce\xd1\xe3.\xbc\xf9C\x0b\xc3)k\x1d\xf7\x13\xb2\x09\xfa\x14\xda\x91#\xd6\x03G!C\xf7\xe0\xf0i6\x09\xabF\xd6\xe3-r\xbe>&\xbfei\xc2\xfd\x84l\x82>\x85v\xe4\x88\xf5\x90\xd7~p\xba\x98\xa4^\x8b\xf3\xf7\xef+\")R\xed\xca\x85|\xf5\x9fN\xc8\x96\xc9\xbbO\xee\x96\x07mQ\xf7\x13\xb2\x09\xfa\x14\xda\x91#\xd4\xe3\x9e\xfa\xb2\x1c=\xf5z\xb94;g\xed\xd3\xb2\xbc-\x94K\xce\xceY\xf8:\x90N\xc8\x86\x0e.\xcf^n\xb9\xef\xa1z\x20!\x9b\xa8O\xa1\x1d9B=b\x02\xc8\xb8E\x89(\xe9\x01\x09\xd9\xf8\x20Jz@B6>\x88\x92\x1e\x90\x90\x8d\x0f\xa2\xa4\x87\xa3@B6j\xc4\x83\x1e@\xd4\x00=\x00\x0e\xa0\x07\xc0\x01\xf4\x008\x80\x1e\x00\x07\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\x03\xe8\x01p\x00=\x00\x0e\x02=\xe2#c\xab\xaa\x17\xd6\x17\xcc}\xf0\xcc\xf2\xf7l\xe6\x18\x09\xec\xd2\xa2\xb1\x1d\\F\xa0G|dl\xd5?e\xad?~t\x0by\xf0\xe1\xa8\xc2.M\xb4\x1db\x10\xe1\xc9%.2\xb6k\xf1\x17UC\x15\xa3\xae\x87\xca.mx\x07\xbaX\xe0\xbb\xea\x11[\x19\xdb\x85$c{A\x8e\xc2\xbb\xdbfiq\x84X\x8fx\xc8\xd8\x96\xcd\xc7\xf9\xca\xd0[\xe4p\x17~\x04\xaf\xf9\x14Z\xd4\xc2!\xfdi\xbcTqHq[ci\xcc\xd3xmZ\xa0\xd68\x86\x10\xeb\x11\x0f\x19\xdb\xcf\x0a\xe5\xb5\xf5\x1fh;\xc6|\x04\xaf\xd9\x18n!\xbf~\xff\xdc-LqHq\xdb\xf0\xd2\x98\xa7\xf1\x0en\x81Z\xe3\x18B\xacGy\xa2\xaeZ\xbb\x98y\x04/\xfd\x8c^[=\x86\x12\xb7\xe5\xeb\x11i\x8dc\x05\xb1\x1e\xf1\x90\xb1-\xc0\x0f\x99UCx\x0fS\x8f\xe0\xa5\x9f\xd1k\xab\xc7P\xe2\xb6|=\"\xadq\xac\x20\xd6#\x1e2\xb6\x05\xf2\xfc\xfa\xd3\xc7K\xb3\xf1Z\x84\x1f\xc1K5F=\x8d\x97~0\xaf0nK-\xcd\xdc\x0e\xf6-\xb0k\x1c+\x08\xf5\x88\x8b\x8cm\xd1\xe1\xda\xa59\xf9\x1b\xb4\xd4\x8d\xf1\x08^\xea)\xb4\xd4\xd3x\xe9\x07\xf3\x0a\xe3\xb6\xd4\xd2\xcc\xed`\xdf\x02\xbb\xc6\xb1\x82P\x8f\x98\x00RrQ\"Jz\xc4s\xc6\xd6\xe1us\x95(\xe9\x11\xcf\x19[\x87\xd7\xcdU\xa2\xa4Gu4\x87\xeap\xc66\x91\x18\xba\x1ej}N\xa9\xf5s\x11o\x00\x19\xdb\xa81\x0c=\x80\xc4\x03\xf4\x008\x80\x1e\x00\x07\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\xc3\xff\x07'\xa7c\x12\x8d\x96\x0dF\x00\x00\x00\x00IEND\xaeB`\x82", - - "analysis/callers1.png": "\x89PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\x00\x03\xa2\x00\x00\x01.\x08\x03\x00\x00\x00\xa3\xcb_?\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x02\xfdPLTE\x00\x01\x00\x04\x07\x03\x06\x0c\x0f\x0a\x0d\x09\x10\x12\x0f\x17\x17\x13\x1a\x1a\x14\x20\x1f\x19!#\x20#$\"%$\x1d$%#&'%'(&+)\x1e()'++$*+)+-*/-!,-+-.,02/52'241574796<9-9;8:;C;=:=?#CxAB@CDBDFCKHe\xafac`*{!Ag\xb2ceb)|*dfcfgeghfLi\xafDl\xb0hjgqjR\\k\x88/\x82/jkiHo\xb3/\x858Jq\xb5mol;\x86:pqoUt\xb4>\x89=|t]tvs@\x8b?swzB\x8c@vxu@\x8dG\\{\xbbxzw]~\xb7K\x8fJ{}z\x85}d}\x7f|O\x93N\x7f\x81~c\x83\xbdN\x95Uu\x84\x96\x81\x83\x80W\x95V\x8e\x85gm\x87\xbcZ\x98Y\x87\x89\x86]\x9c\\\x89\x8b\x88\x95\x8bm\\\x9dcs\x8d\xc3d\x9dd\x8c\x8e\x8bf\x9fg{\x90\xc0\x8e\x90\x8d\x90\x92\x8f\x7f\x93\xc4j\xa3jz\x97\xc6\x93\x95\x92s\xa4l\xa1\x96xq\xa5s\x81\x9a\xc3\x97\x99\x96\x84\x9c\xc6\x99\x9b\x98u\xaaw\x9b\x9d\x99~\xaay\x9c\x9e\x9b\xa8\x9e\x7f\x88\xa0\xcb\x9e\xa0\x9d\x80\xad|\xa0\xa2\x9f\xa1\xa3\xa0\xa2\xa4\xa1\x92\xa5\xca\xae\xa4\x85\x82\xb1\x86\xa4\xa6\xa3\xa5\xa7\xa4\xb4\xa7\x82\xa6\xa8\xa5\x8b\xb3\x88\x95\xa9\xce\xa8\xaa\xa7\x8d\xb5\x8a\x98\xab\xd1\xa9\xab\xa8\x8e\xb6\x8c\x8d\xb8\x93\xab\xad\xaa\xb9\xad\x88\x9f\xae\xce\xad\xaf\xac\x96\xba\x96\xaf\xb1\xae\xa3\xb2\xd2\x98\xbc\x98\xb1\xb3\xaf\xb2\xb4\xb1\x9b\xbe\x9b\xc2\xb5\x90\xb4\xb6\xb3\xb5\xb7\xb4\xa3\xbf\x9d\xac\xb7\xd2\xa2\xc0\xa4\xb7\xb9\xb6\xb8\xba\xb7\xb9\xbb\xb8\xa5\xc4\xa7\xb1\xbc\xd7\xbb\xbd\xba\xbc\xbe\xbb\xbd\xbf\xbc\xaf\xc6\xab\xa9\xc8\xab\xb8\xc0\xd5\xbf\xc1\xbe\xce\xc1\x9b\xc1\xc3\xbf\xb2\xca\xae\xc2\xc4\xc1\xbc\xc4\xd9\xb2\xcc\xb7\xc4\xc6\xc3\xba\xcd\xb9\xd7\xc8\x9c\xc1\xc8\xde\xbb\xca\xde\xc7\xc9\xc6\xbc\xcf\xbb\xc9\xcb\xc8\xc0\xcc\xda\xc7\xcb\xdb\xca\xcc\xc9\xbf\xd2\xbe\xcc\xce\xcb\xc4\xcf\xdd\xca\xce\xde\xce\xd0\xcc\xc8\xd3\xc1\xe0\xd0\xa4\xcf\xd2\xce\xc8\xd6\xc9\xd1\xd3\xd0\xd1\xd2\xdc\xd2\xd4\xd1\xde\xd5\xa7\xca\xd8\xcc\xd3\xd5\xd2\xcd\xd6\xde\xcc\xda\xce\xd5\xd7\xd4\xe7\xd7\xab\xd6\xd8\xd5\xd1\xd9\xe1\xd5\xdb\xd1\xd8\xda\xd6\xd8\xd9\xe3\xd3\xdc\xe4\xda\xdc\xd9\xe6\xdd\xaf\xd5\xdf\xda\xdc\xdf\xdb\xd7\xe1\xdc\xde\xe0\xdd\xf0\xe0\xb3\xdc\xe1\xe4\xdf\xe1\xde\xe1\xe3\xe0\xe3\xe5\xe1\xe1\xe6\xe8\xe4\xe6\xe3\xe8\xe5\xea\xe5\xe7\xe4\xe6\xe8\xe5\xe4\xe9\xec\xe7\xe9\xe6\xef\xf2\xee\xf7\xf9\xf6\xfe\xff\xfc\xbd\x08i5\x00\x00\x20\x00IDATx^\xed\x9d\x0fp\x13\xd7\xbd\xef\xe1%\xb7\xf7\xf8Y\xba\xbdvjW&\xbevs=n\xb1\xc7\xf6\x98\xa8@\x84\xc3s\x80\x90\xe0\x10\xee\x03'J\xe19\xaf\xb9\x81\xa4\x80\xfb\x9cb\x87\xdb\x84\xbf\xc1m\xd0\x00Uq\xc1\xc4\x7f\x08\x80\xb7D\x87\xdc\x01\x1f\x95\xe8\xf0\x1e\xf2_\x1b\xd8C:\xb8]\xae\xae}\x86\x12m\x8c\xb4\x9c\x8d\xeaFt\xd2%z\xa5$\xb1~\xd8\x04$\x9a\xe8!\xccI\"g\xa1\x92(\x90\x00|%\x1a\xd87\x82%\x89\x9e>F\x13\x8eu\x8a/B\x00\xb7\x18I\xf4\xc3\xd2g\x19\xa1\x8cR\xa2\xe7\x1e]P:\xf7\x9f\x17\xd0\xf4\x13\x8f\x94\xdf\xbbU\xdc\xf4viI\xc9\xf3W\x9e\xba\xbb\xfc\xfb\xea\xcb\xf7\xd5\xa7\xe6\xcf\xd9\x20wSCy\x85\xb9%\x14\xd2P\x7f^^RRz\x82l\xfdqI\xe9K[\xef-\x7f\xf4cU^u\x09\x11Xu\x20\xc8\x12U\x1eB\x01\xf3hd\x84\xbd\x17\xef\xa5\xa3m\x9d\x13\xd2;\x9aDpn\xe9O\x16\xcc\x7f\xf3\xd99k\x02\xe2\xdf\x7f\xc3\xfc\xd2\x05O\xbc-\x1d\xe2p\xe3\x82;\x9f\xb8\xa2\x0a\xf5\xce\xf8\xafO\xcd]\xb0u\xeb\xdc9'\x14\x05+\xce\xe2\xc7d\x1fiL\xae\xfeC]\xd90W\xac\xdaU\xfc\x8a\x94\xb5d\xa5\xea\x10\"GW\x96\xaf<\x1a}4@\x05_\x89zNbY\xa2m\xaf\xd2\x84\xee6i\x83\xa1D\x1bK?f\x842\x0a\x89^,}\xea\xe5\xd7^\x9a[\x12\xa4\x19\x9f={x\xee\xca\x20\x16N\x9cXp\xef\x9c\x05[\x9f*\xfd\x10\x0b\x1fJ\x88{\\\x99s\xefK\xaf|Z\xba;\xda\xde)m2\x90\xe8\xd5\xf2FF\x18F\xfar\x09%G\xc5\xd7\xcf_\xdap\x7f\xc9\xdc_`\xd2\xceH\xd06c\xe5J\xcd^\x17K\xc8\xf7^\xfaZ\xa8\xf2\xb2%\x1a\xfe\x12F\xf2*KP\xa2S\x878\xa6\x8b\xb4G\x13\x07\x93/\xe3\x97iK\xa9sBzG\x0b1\xff5\xfcV)\xa6\x12}k\xee\x82\xe7^>\xb7fe\xe4P\xe7J.\xaaB\xcc\xaa\xc3\xe1\xd2\xbf\x92\xc6.\xceV4\xb2[\x89bT\xcc\x92\xe8#RE\x9fxH]\x02\xa0\x82\xa7D\x83~\xc2\x90\xdb\xef\x0f\xe2a\x97\xd8\xb7\xc2\x01\x97\xfc\xc8\x82\x81D\x9f-\xbd\xc2\x08\xc3H_.*\x98\x8b\xa4A\xf8\xfcD\xf9Q\xb1\xd7t\xf7E\xca_I\x16\xc6\x84\xe2_\xa9\xa41\x9d\xecQ\xe55\x90h$\xaf\xb2\x04\x05zu\x98\x98D\xf1\xb3O\xe0'\xe8\x04\x19\xfb\x84t\x8f\x16\x82H\xb4\\\x92\xe8\xfd\x0f\xd1\xc6V\x92(-\xf3%\xb1}U\x86\x98U\x87\x0fK\xbf\xff\xe1\xdb\xf7>\xa2\xb9U\x12%\xd1\xe7\xa3$\xfa\x9a\xa6\x15}\xe9CEv\xf1\x0fw7}\xbb\xbb\x11\xab\xcf\x18P\xc2S\xa2\x12>\xf9\xbeh\x97\xf8\xday@\xfeo\x8f-Q\x83F\x14\x07\xee$\x89\x8dw\x8a_\xb1\xbdtx\x83\xd7W\x94k\xe0\xee5\xea\x10\xb3\xeap\xb1dnI\xc9\x9a\xa8;]X%Q\xf1:\x11|(J\xa2\xc2\xfc5\xe4\x8a\xf0,\xbd\x00\xac\x11K\xbf\x1a\x1a%\xcb\x878+MSKcQ\x90\xa8\x0e\xbc%\x1a\xf4\x0d\xb9}~1\x18\xdb\xd3y\xa9Kz\xbaH\xf0\xf9\xdc\x9d\xbeq\xfd\x9d\xb6FZ\xce\xad\x8cF\x94\xfc/?}\xf6i\xfa\xff\xbd\xb7d\xce\xf3g_n,yS\x8c\x9f+\xfd\xe1\xcb\xff\xda(&\x07\xdf\xa2\x13\x8a\xd1c\xd8\xf7\xca\x17\xec}\xfe\xce\xd2\xd2_\xbd\xa7\xc8+OT\xbeE\xae\x1d\xc2\xef\xce\x9d+o\xa4\x82D\x81\xa9\x20~\x89^,\x95z\xb8\xef\x95*fh\x01^\x80D\xa7'\xd2\xfcLt\xc8&\xd8X\xdex\xe2\xcd\x13\x8d\xac\xc9t`\xca\x01\x89NO\xe8\xfc\xcc\x87\xd1\xa1\x1e\xaf<:\xbft\xfe\xf7\xa1\x9b\x9b\x14@\xa2\x00`j@\xa2\x00`j@\xa2\x00`j@\xa2\x00`j@\xa2\x00`j@\xa2\x00`j@\xa2)\x87\xe67a@Z\x03\x12M-|\xce<\xb4\xc4(\x13\x90N\x80D\xd9\xb4W\xfa\x8d\xb2\xc4\x83\xbf\xb2\xdd(KB\x04\x8b\x8b]\xa7\xc7\x8cr\x01\xe9\x04w\x892\x0c#\x02\xde\xd6}\xed\x031\x97L\xfer\xd7\xf2E\x9bn\xc4\xca1A\x965K\xef\x9dUy\x96\x02\xe7h(y\x0bj\xd2\xdb#1\xb6dl1\xca\x92\x08\x03\xa8\xc3(\x0b\x90f\xf0\x96(\xc30\"\xe0n\x1f\x1a\xeds\xb7\xc5\xd2h\xfd\x83\xc7w.\xba\x16#\x83H0H\x16\xd7\x12\x0c\x87j\x9d\xfd\x91\xf8\x0d\xb4\x9e\xbe\xf7\xa2J\xf7IWQ\x9el2\xd3\x9c\xe1f\xec8!<\x99\xcdFY\x12\xe0\x0d\xe45\xca\x02\xa4\x19\xbc%\xca0\x8c\xe8l%\xaa\xf2\xef\xeb\xd3\xdf\xeb\x9a\xe38\xbea\xa0\xd0w*\x8a\x8b\x17\xce..^\xab\xfb\xd3p\x99\x8a\x9ap\xe8\xcd\x97%\xfa\x02:)\xbe\xfa\x90\x8b~\xbadY\xcf\xdaqb4X'\xb1c\xda\x8bz\x8c\xb2\x00i\x06g\x89\xb2\x0c#\xdaZ\xe9\xa6N\x8f\xfen\x1f9^\xd7\xdf(!X\x90\xdd>3\xdb^1\xa3\xc1\xc0e\xa4lY(Z\x86\x1e\xc8\x96\xc5H\x97e\xe9C\xdd\xf4\x83s\x96\x91\xcc\x13\x200\xcbi\x94%~@\xa2\xd3\x0f\xbe\x12e\x1aF\xf8\xa4V\xa6\xfb\x05\x9d\x9d\xae/wPvc\xbc\xcb\xe18\x83?\xadv\xac&a\xf5\xa9\xdd\xab\x17m\xfa\x8c\xe6\xf9\xf4\x99\xe5\xffm\xf3W_\x0d\xff\xe7W\xffu\xcb=\xd2D\xcf@&B\x0d#\xab\x0a\xb2\xaa\x88d\x9b\xcb\xb2\xcbH\x8f\xd3\x83$\xcaH\x96q\x1f\xce\x0d\xb7\x97A\x7fGA\x19U\xb7\x90\xf3$\xa3\x84\x10\x8a\xd4:\x94\xd1\x82G-\xa8\x18\xe3:dq\xad-\xca\xae\x92\xce\xa5\xa52\xbb(\xdc\x9a7dE]3\x12.!B\x17Ht\xda\xc1W\xa2\xba\x86\x11\xa4\xe7\xab;\xcaz\x7f\xf0\x8c\xe3\xd0\xe0\xe0_0\xfel\xb0\xfa\x10\xbe\xf1\x87]\xd5\x18_>S\xedx\xf0\xd0\xff[\xfa\x0c\xc91\xb8x\xdd\xa1\x7f\x981cF\xb0f\xc6\x8c[\x9a\xa4o\xb6\xd0z\xa0\xa0('\x7f\xed\x0a$~\xe9\x9d\xd6\x06O\x83u\x95x\x91\xe8\xf6\x16\xd9\xbd^o\xc8\xcf4,\xd1\x0b\xa2n\xbfq\x89\x86\xfd\xa8K[B\x18E\xaa\xcfki\xc2\xb8\xc7i\x15{\x05\x072\x91\xadi{\xce}$\x8b3\xa3\xce\xd3l+\x93G\xc5\xdd\xd1\xb2J\xb8\x84\xd0~\xe3]\x15\xb9\x93\xd8\xbe\x03)\x01W\x89\xea\x1bF\x88_dw\x8c\xbb\x1c\x91\x8e\xae(Q\x8c\x0fU\xd3p\xa9\xd8\x82n{P\x8c\xae\xd7n\xba\x1e\xf4\xfd\xef\x7f\x10%\xfa7K\xb6\xbc\x13n\xb4\xca\xd0\xbc\x005U\xe8\xa0\x13\xa1\x1d\x886\xdd\x91\x8e.VH4\xd8\xdb\xb5=?\x8fj\xd4\x83.iJP\x11I\xb5\x92\x89\xdf&+I\xb4\xe6\x8aB^e\xa3\xfb\x93\xc9\xa6^tP\xca=\x86\xb4\xfd\x83\xc4J\x90Y\"^Eb\x8c\x06\x80\xf4\x84\xa7Dc\x18F\xe0\x1eW\xf8\x86\x07\x03\xb6Dw\x86\xc2\xf3\x8e\xf7E\x8d\x05\\\xa2D3\xfb\xfd\x91neYh\xa6\xc6YL\xdf\x8a\xe9\xa8\x90-QB\x20\xbf\x8a\xbc\xb5\xa1p]\xca\x98s=\x91T\xa5\xc0\x9c\xa1\xf0\x81B\x81\x90/\x8fA\xc7\xa2\x94\x96x\x092c\x1d\xaebhE\xa7\x1d<%\xaao\x18!t\x86\x96\xa5g\xc3\x96h8<\xee\xb8N\x12Z\x89DG\x14\x03\xbf\xb2\x0a9\xa8\xbc\x87\xbe-\xac\xa4\xa9\x0c\x89\xca\xban\xca$\xef=\x91\x9ei\xb8\x04\x15\x91T\xa5\xc0\xc2a\x99<\xde\x95\x9f\x02\xea\x95'\xa1&^B\x04/\xea\x8dN\x02\xd2\x1c\x9e\x12\xd55\x8c\x08xZ|1\xf7\x8c\x92\xe8\xfe(\x89\x9ew\xbcK\x12\xb4\x12\x0d\x89\xd1YH\xdf\x0a#\xad\xe8>\xb9\x15\x93$*\xe4J9\x9b\xe8\xccN\xc0\x1a~nA%\xe70\x91T\x9a\xb3!J`+\x0a\xfb)r\xcf\xbd\xc9\xa2m\xf9\x12+!\x02\xcc\xe8N?xJTBk\x18\xe1?xD\xfc\x12\xc7rd\x8fHt\xd1~\x8co\xd4GI\xf4\xda\x83\xf5\xa4\x19\xfd\x9f\xba\x12\xf5\xd0\xbe\xe6Ai$g\xb7c<\x8e\xa4;=\xa1V4\xaf\x8a\xbc\x06\xf2\xa5f\xab\xe6\x8e\xd0<\x8d\x91D\xb3\x9f\x14+^\x11%\xb0\x0e\xa9\xf0\x8d\x9bi\x96`\xf1\xc2\x9b,A\x01Ht\xfa\xc1[\xa2\x0c\xc3\x88\xb1}\x07G}>_w\xab\xde>\xd2\x8c\xee\x1f\xe8\xf3\x7f\xf5\x0f\xfe\xf2\xd0:G\xf5\xa9\xcb\x7f\x19\xac\xde\xf5\x87\x1b\xef\xef\xaa&3\xbd\x83\x8bV\x1f?\xbf\xfb\x1fU\x12\x15z\xe8\xdc\xad4\xac\\\x91\xb1\xde\xb3>c\x05\x8d\x9b\xac\xdb\xdb\xe6e\x93#\x8f{\xbd\xdf\xa8\xf1\xf6\x88zlAU\xae\x93\xcd\xf9\xf2\xd3E\xefdl\xd7\x94\x10F\x95Zi\xdb\xb2\xb9\x12e\xba\x87}^\x8b\xb3\x07\xf7;-^\xb1\x88\xf5\xe8\x81\xd6v'\x92\xa6\xc2v\x20\xc5\xd3L\x13*AA\x1f\xa3\xd3\x0c\xa47\xbc%\xca0\x8c8&\x0fP\xf5&+\xaf/\xa5\xb7E\xab?\x20\x1f>\xaa_\xb4x\xd3~\x87c\xd7.\x92\xf4\xfeb\xf1u\x97\x98\xfc\xc13\xb5\x8b\xd7\xfd\x1f\x95D\x072\xe8pNj\xc2\x82\xcd\xb3\xb3g7Km\xa3P\x97\x9be\xa7C\xba\x06\x9a#sD\x0c{\x96\xe4[\x8b\x1f\x0bu,\x1b\xbe\xde\x1d]B\x18U\xea\x88=+\xa7j#Buub\x92e([|\xad\x13\x93;\xec\xb6\\\xbbt\xe7\xd7\x9b\xf5$\x8e\"\xc1\x12\x94\x8cg.\x1b\x187|\xc4\x11H'xKt*\xd1\x8cE'\xcec\x16\xdd6=1\x0eZ\x9c\x93R\xa1\x10m\xc5\x8cI$\x20\x9d\x01\x89\xb2\xd9\x91\x1f\xc3\xa9-~\xfc\xb3&\xf5\x87.\x84\xf1\x81\xd8Sk@\x9a\x91\x02\x12u\xc4\xcb?N\xa2D\x01\xc0$\x80D\x01\xc0\xd4\xa4\x80D\xe3f2;\xba\x00`\x12@\xa2\x00`j\xd2G\xa2B\xf32\xf2\x18\xfd\xfan\xd0(\x90N\xa4\x8dD\x83\x95\xa1\x1f\xa3\x1d\x01\x8d\x02iD\xdaHT\xb8u\xf3W_\xfd\xe7W_\xfd\xd7\xadK\xe0\xc7\x20@\x1a\x916\x12\x0d\x20d\xb7\xdf\x9ag\xaf\x98\xe1\x9c\x94\xe55\x01\xc0\x1c\xa4\x8dD\x05o~n\xee\x1d\xb9\xb9\xb9\xf3\xde\x80\x8e.\x90F\xa4\x8dD\xb1\xe0\xbbt\xe9\xd2\xe8\xa5Kc\xd0\xcf\x05\xd2\x89\xf4\x91h\xdc\xeb\xe8\x02@*\x91F\x12Mab\xd8SL\xb6\xe5\x04\x90jp\x97(\xc30\xc2\xd7q`Ok\xf74\xee\x9fF\xec)\x18\xfe\x15\x93l9\x01\xa4\x1a\xbc%\xca0\x8c\x18wy\x86\xc7\x86\x8f\x1c\x98|\x8d\xce\xb8\x19\x8c\x0a\x9f<\"\xf6\x14L\xff\x8a\xc9\xb5\x9c\x00R\x0d\xde\x12e\x18F\\rQg\x97\xd8\x0b\x8cM\x88\x19_L\x1c~\x12\x8d\xd8S\xe8\xf8WL\xaa\xe5\x04\x90jp\x96(\xcb0BZ\xa6\xd6\xef\x9a\xfc\x9fA\xa6\x86D\xc3\xf6\x14z\xfe\x15\x93j9\x01\xa4\x1a|%\xca4\x8c\x20\x08c\xad\x9e\xc9\x9f\x8a\xbdI\x89\xd6\xa1\xcc\xe6\xef\xe5\xe7\xde3\xa2)\xd8\x9dG\xdb\xb7\xb1\x1cy1\xcd\x1ce3\x97\xa0\x1fD\xc8\x9eB\xd7\xbf\x82a9\x01L#\xf8JT\xc70\xc2\xefr\xb9\xdc\x93?\x14\xbd9\x89\x06\xa9\x85C\xc1\xe6\xa6\x82\xec\xa1\xe8\x82\x97\xa0*\xf2&\xb8\x9b%\xdcJ\x09%\xe8\x07\x11\xb2\xa7\xa0\xb0\xfc+\x18\x96\x13\xc04\x82\xabDu\x0d#\xfc\xbe\xa1\xd6\xa9\x98.2\x92!\xfd\xa7\xb3\x8d,\xebi-\x08\x90\xa5;+\xa3\x0b\x1e\xdd,\xa9g|T\"z\x11\x95D\xfc\x20\x14\xf6\x14l\xff\x0a\xb6\xe5\x040]\xe0)\xd1X\x86\x11b\xdbsRw\xc7\x89B\xf4\xf7\xe27\xf5\x85\x1aS\xa2d\xfcg\xddH\x8aiF:w-GQ\x88\xa8\x85<\x13\xf1\x83hS\xee\xcc\xf2\xaf`[N\x00\xd3\x05\x9e\x12\xd51\x8c\x90\x9f\x07\x1apM\xfa`\x94\xe8\xef\xf6\x17'(Q\xb2\xce\x9e\xb4,}\x97f%\xdc\x10^\x8fD\xb4\xa9[\"~\x10=\xca^,\xcb\xbf\x82m9\x01L\x17xJ\x94m\x18\x11l\x91\xa6\x8c.\xec\x9b\x12\x89\xaaT\xf8\xf3\xdbf~\xed_\xbe\xf8\xe2\xb7\xdf\xb9\xf5\x96\xef\xfc9,\xd1\x9f\xff\xfd\xcc\xbf\xfd_$\xe3\x0f\xbe6\x93l\x9by\xdbO\xc5\x0f\xa4\xe5\xb4>F\x8aq\xa1D\xfb\xe0\x89\xf8A(\xec)\xd8\xfe\x15l\xcb\x09`\xba\xc0S\xa2\x12\x1a\xc3\x88\x03\xc4XP\xec\xe8\x9e\x8e\xb9\xdbD\x88\x96\xe8\xcf\xff\xe6\xe7\x9f\xfc\xf6\xbb_|\xf1w/~\xf2\xef\xff\xe3\xbb!\x89\xfe\xfa\xef~\xfd\xc9o\xbf%jt\xc6\xed\xbf\xff\xe2\x8b\xdb~\xf0\xe7\xff\xf8\xf5\xb7\xc5\x0f\xc4\xac\xc1\x9aG\x86\x94\x85\xf6\xe8\x82G\xb7(\xc6\x8f\x0c\x12\xf2\x83\x88\xd8S\xe8\xf8W0-'\x80\xe9\x02o\x892\x0c#\xdeq\x9d\x1c\x1e\x1b\x9e\xba\xe9\xa2\x88D\xbf\xf9\xd3H\x83\xfa\xef_\x0bI\xf4\xf6\xdf\x88\x1f\x7f\xff\xb7bL\x82[~/m\x9fA\xae$VT\xd6\xba\xe7\x8e\\\x8d\x1e\xe5\x19]6\x89\xfaA\xc8\xf6\x14\xfa\xfe\x15Z\xcb\x09`\x1a\xc1[\xa2\x0c\xc3\x08\xec\xebl\xdd\xd7\xd63\x05\xb7\xfe\xa2%:\xf3\xcf\xd2\xfb\xef\xbf}\xeb\x8c\x193C\x12\xbdu\xa6\x08\xfd\xf8\x1f\xe2\xb6\x7f\xba\xf5\xbb\xffBTJ\x1f]\xb0\xaeu\xe6\xccZ\xa5}\xa6\xc2msi\xd2\xc2$\xec\x07!\xd9S\xe8\xfaW0,'\x80i\x04o\x89r%Z\xa2\xb7\xca\x12\xbd\xfd\x9f~\xff\xc5'3B\x12\x9d)\xb7\x9br\xc6\xdf\xfc\xe0;\xb7\xfc\x20$Q\xc50q\x0a\x89iO1\xd9\x96\x13@\x8a1\xad$z\xbb\xdc\xd1\xbd\xe5\x93/\xbex1,\xd1o\xfeH%Q\x91\xdf\xde\xc2W\xa2\xb1\xec)\xa6\xc0r\x02H)\xa6\x95D_\xfc\x9a4]t\xdb\x0f>\xf9\xcd\x7f\x0fK\xf4\xc5[\xff\xe5\xcf\x9f\xbc\xf8-9\xe3\xb7\xfe\xef'\x9f\xfc\xe86\xce\x12\x05\x00]\xd2^\xa2\xf4\x87e!\x8d\xfe\xf4\xef\xe9M\x97\xdf\xdc6\xf3k?\x0aK\xf4\x8b\x17o\xbfe\xe6\xed/\xca\x12\xfd\xf9\xed3o\xfd\xf6o\xa9D\xa5\x19\x1e\x00H*i/\xd1\x89B\x1f\xa3G\xc8\x12\xf5\xdc\x10\x00p\x06$\xaa\x03\xbf\x1f\xa3\x01@,@\xa2:\x80D\x01s\x00\x12\xd5\x01$\x0a\x98\x03\x90\xa8\x0e\x20Q\xc0\x1c\xa4\xb7Do\x06\xa3\xc2\x01\x80\x0bi-Q\x00H}@\xa2\x80\xcc\xa4\xff\x16\x10\x98\x14@\xa2\x00\xc1\xe7\xcc\x93~a\x0e\x98\x0d\x90(\x80\xc9OR\x8b]\xa7a\xb5^S\xc2]\xa2\x0c\xc3\x08e*gN\xda\xc2\xc7\xf5\xd7\xe5eUMVg\xefU[_\x9c\xa9\xfey\xb9[\xb4\xe1d\x10\x7f\x1d0\x1e@\x1d\x8cT\xc0\x0c\xf0\x96(\xc30B\x99\xca\x1bOvxm\xbdyy.gVY\xb8%\xc3\xaf\x09\xe3$\x10ky\xf0\xf8\xeb@\x9c*\xa2\x97_\x02\xcc\x02o\x892\x0c#\x14\xa9\xfc\x097\x9b~\xd4\x8c\x83q\x88O\xd4r\xae\xf1Bh/0\x97\xd5d\xa5Vl\xc6\xd9^M\x18\x17AW\xee\xbc\x18\x9b\xe3\xaf\x03Y\xc0\x0c~/`V8K\x94i\x18\x11IM\"#(\xde\xae\xf6\xd8\x12T1`\x90\xa7\x13u\xc6\x99:\xdb=\x86F4a<\x0cT\xa0{b\x0d\x1f\xe3\xaf\x03H\xd4\xcc\xf0\x95(\xdb0\"\x92\xca\x97@\x16B\x19t\x91\x16\xc1&\xad\x9a\xb9V\xb5\xfdr\xb5\xc3\xb1\xff\xa3m\x0f/\xda\xf4\xa5z\xc7c\xf9\x19\xd4\xed\x81m\x18A\xe8C}\xf4=\xb0l\x96%\xff\x9e\x90\xa0C\xa9J\xaa\x1a\x96\xcc\x1e\xc8D\x99\xc3\xaa0\x8cn\x1d\x02k3\xf2\xc9E\xc5\xb8\x0e\xc5r\x06\xbb*UM\x17H\xd4\xb4\xf0\x95(\xdb0\"\x92\xca\x99>\xafW\xfe\xd1\xf6\x05\xefA\xd4\xe4\xf5\xaa\x87v\xd7\xcf\x9c\xa9]\xbd\xb8v\xf7\xb6\xbb>\x8d\xda1\xb0>3\xef\x88\x9ea\x04\xc1g\x93\x8a\xf2\xa0\xefu\xb5\xde\x93\xd1\xabNU\xb29\xc7\xda'T\xd9\xc9\xa2b\x8a0\x8c^\x1d\xda\xf22\xd7\xd3n\xb9q\x1d\xacN\xaf\xd7\xdbU\x89\xb6\xa8R\x15\x08\xe3]\x15\xb9q\xf5\xf1\x81$\xc0U\xa2l\xc3\x08E*\x7f\xb2B\xeb*\xb0;\xba\x8f;\xea\xaf\xe1\x1b\xd7\xb4\x1b\x86\xca\xd0c\xfa\x86\x11a\x02\xad\xe4\xab?;\xc6\x1d\xc7-\xc8\x85\x03\xd9\xc7\xa2B%\xac:\xd4\xa1\xb2\x90\xd1\x8ca\x1d\x9a\xfa\xc5a\xab\x13\xe9\x9b\x94.\x11\x9b\xd8x{\xf9\x00wxJ\x94m\x18\xa1L\xe5\x8f\x91D\xab\xa3\x1bP\x19wn\x96K\xdf0\"\x82\xbf\xb9\xaa0\x07\xcd\xd6\xdb\x8c[Q\xeeZ\xbcc\x96\xa0\x0eU\xb0\xea\xe0\xb6\xe6\xca\xb6\xc1q\xd4Al'\x97!7\xd6e\xac\xc3U\x0c\xad\xa8i\xe1)Q\xb6a\x842\x95?F\x12]\xc7H\x14\xdb\xd0J\xb4\x90(B\xcf0\"Lo^\xfe\x93m^\xbb\xaeD\xc7\xb3\xd7v~}\xb4\xb0I\x1d\xaaa\xd6\xe1R\x15\xaa\x94\xdaQ\xc3:\x88\x0a\xad\xb2\x1c\xd1\xdfJ\xf0\xa2\xde\xd8\x19\x80\xa4\xc1S\xa2:\x86\x11\x8aT\xfe\x18I\xf4\x19F\xa28\x12\xcd\x8f\xb3cX\\INs\x99\xaeD\xdb\xc5\xb6\xef\xbe\x82\x9c\x80:T\xc3\xac\x03\x1d\x8d>\x19_\xd3\x17\xb0[5\xbd\xe7(`F\xd7\xbc\xf0\x94\xa8\x84\xc60B\x91\xca\x9f\x09H\xb43?^m`\x9cO\x9c#\x82e\xba\x12mC#\xf8\x02Z\x81\x83\x05\x97\x14\xa1:\x8f\x8eD\xc9\x9c\xee\xacx\xdc\xe4\xfc\x15\xf4n\xabGc{\xa1\x00$j^xK\x94a\x18\xa1L\xe5\x8a\xd0\xe3\xf5\x92\xe9\xce@hF\xb7G\xdd\x8e\x7f\xf9\xc7\xc1\xd5\xf5\x83\x83\xd1#\xc1ev\x8d%\xb0.MhY\xf3\xe62d\xdb\xa2\xa3\x80\xf1\xec\x9a\xb6\x82\"K\xddf\x8b_\x11*2\xe8\xd4Ab\xc8\xbe\x0c\x1b\x12(F[\xbc\"Nk\x8cL}\xe0\xbdfZxK\x94e\x18\xa1L\xe5\xc9\x1b\x92\xb3\x03ra!\x97\x06\xaa;\x92\x18_vP6\xe9\xec\x1e\x0f\xc1\x1dEV\xdb\x03\xee;,zM\xd8\xe9;lu\x81\x93E\xb9\xcd\xaa0\xc2\xcd\xd7\xe1B\xa6<\x9dT\x10#\xd3x\xe6\xb2\x81\xf1d\x0c4\x00CxK\x140'm\xc5\x08~\x8cfN@\xa2\x80\xc4\xf8@2f\xd4\x01C@\xa2\x00`j@\xa2\x00`j@\xa2\x00`j@\xa2\x00`j@\xa2\x00`j@\xa2\x00`j@\xa2\x00`j@\xa2\x00`j@\xa2\x00`j@\xa2\x00`j@\xa2\x00\x07\\\xd9\x0d\xe2kO.\xf7_3\xa5\x01\x20\xd1\x94\xa0\xbd\xd2\xcf\x08\xcd\x88\xbf\xb2]\x9b\x18\xc8^\x8b\xc60\xbe\xcf\xa6Y\xf5\x85\x01\xb3\x84i\x0cw\x89j\x0d#\x047]\x16E\xb3\x82\x1d\x10f\x0bjb\x84\xf1\x93\x88w\xc4\xcd\xb2%C\xebz\xd1\x9f)\xccj\xc7\xe3\x96\x8dQ\xe9\xa3+\xf2\xb3go\x96\x7f\x1f\xef\xb2\xe7\xe4o$?\x88c\x95\xa0\x0f\xcfsK\x0a\xbc%\xca0\x8c\x08\xb8.\xf8DL\xdd6L\x0a\x9d\xfdF9th\xcep3\xc2\x04H\xc4;\x02\x1b\xac\xb6=\xf8n\xec\xed\xd8\x93\xa9Yl\xb0\xd7\x1a,h\x15\xaf.Q\xebI\x8c|c\xf6v\xcf\xc6\x9c\xd9t\x8d\x9c\x85\x19u\xed\x0d\xa8U\xa7\x04)?+1\xa1sKExK\x94a\x18\x11pM\x13K\xae\x8a\x1a\xa3\x1cl.Y\xd63\xc2DH\xc4;b\x08\xc5^Tb\x9d\xce:-\x11\x1a\xac\xd1\xff\xa1\xfe\xcc=h(X\x18mo\xb1\xa4\x80\xf4\x9c\x86\xb3I\xe3\xba\xc4\xdaM\xd6gi\xd6)\x81\xc0\xaeY\"\xe7\x96\x92p\x96(\xcb0b\xdaH\xb4,\x8eeLX8g\x05\x18a\"$\xe2\x1d\xd1c\xb0\x8c\x91\xdeRJ\x11\x02\xb3\x9c\xd1I\x8f\xa1\x85\xe2\xe1\xa2\xc7\x98\xc5\xd2B\x10\xf7U\x90\xa3\xd2\xfe\xfb\x88\xb4\xf2\x03\xa3\x04\xacW\xb3D\xce-%\xe1+Q\xa6aD\xbaIt\x20\x13\xa1\x86\x91U\x05YU\xe4*\xd4R\x99]D\xdc%<\xf2\xf2$ed\x9d\xea\x8c\x16\xf5\xfe\x8d\xeb\xf4CX\xa2\xdb\x1e\xbe\xfe\xa5H\xedN1\xae\xdeOR\x8e;\xa4K\xc6\x98tIRS\xa8s\xe1\xa8\xa3\x0b\x18\x97Y\x89\x80\xc7\xb2\xe5>\xbd\xa6\x04\x9d\x9a)1\xf2\xe6HUxJ\x94m\x18\x11\xc2\xdb\xa6\xb7_\xeaQV\x11\x0a\xe4K?\xbd\xb6\xebH4\x94W\x95\xaa@1\x04S\x84:V\x16\xb11\xf2\xaf\x20\xb0F|\xd7N=\xb3\xda\xb1\xfc\x97\xeaV\xf4qGd\x01\xd1\xeaC$e\xd0!\xdd\x90\xe9e\xac\xca\xebEm\x0a\xc3\xe50\x81\x9aLz\x17\xa9\xa6\x98~\\V&%\xb3J0\x98\xc8\x8a\xe7\xdcR\x12\x9e\x12e\x1bF\x84\xd4\xda\x19\xa7\x07C*\x10\x16\xe3\x8a\xc2~\x8a?\x9cJo\x05S16X\xd5y\xf5$\x1a\xb061B\xe3\x89U\x06F\xfe\x15\x04\x86\x10\xde\xdd/\x8a\xf3\xda\x99E\xc7\xc9\x07z\xe0S\x9f\x92V\xf4]\x0ai9\xabw\x93M\xa7\xe4V\xb4\xc9\xa2\x9dw\xae\xb1\x09\xd8\x19\xa9\xbe\x8c\xaf,W\xeaN5\xe4\xd0q\xce\x12\xf9z\xc5*\xc1@\xa2\xf1\x9c[J\xc2S\xa2\x12\x1a\xc3\x08\x0f\xb5\x04\xf2\xbb/\xc4\xdc-\xa5\x08\xcb\xaeC\xba\x17\xbfq3y\xb5\x8b]\xbdq\x9a@\xfas\xc1\x8a8%\x8ak\xee\x08j\xc3\x09I\xd4\xc8\xbf\x82p)G3f<\xe48O\xde\xeaw\xd1\xd7z\x8c?#\x03\xd0\xf3t\x14\x8a\xf7\xffR|\xa9^N\xc6\xa2\x0f\xd7\xd3\xec\xc1\xe2\x85\xd1%`\xbfe=\xeeGM\x19j\x8b\xc5\x81YE\x97\x88\xbf)\xb9\xe7IN\xfe\x12}\x94\x97]\x02\xb3f\x0a\xe29\xb7\x94\x84\xb7D\x19\x86\x11c\xae\x8e\x91\xb1\xbe}\x9etY\x0c]\xe8\xa1s\xb7\xd2\xa8q=z\xa0\xb5\xdd\x89\xe8e\xa9\xc9\xba\xbdm^69\xe5J\xdb\x96\xcd\x95(\xd3=\xac\xc8\xeb\xf3Z\x9c=\xb8\xdfi\xf1F\xcfE\xbe\x93\xb1=*\x8ci#\x11\x03#\xff\x0a\x1d\x0e9\x16\x1fz\xfd\xf5\x9d\x8eA\xfa\xa1\xfa\xf8\xeb\xf5\x8b\xc9\xa1\xf7\xdf\xb5\xed\x8c\x98J\xa7\x8b\x1c\xeb\xce\x9cZ\xbd\xf4\x03\x9a}\x07\xd2>F\xb5\x1d\x8d\xe0\x03\x85A\xab\xea\xc0\xc7\xb2fy\x88\x95E\xbe\x18o\xb44tl\xb7\x15\x07tK0b\x82\xe7f~xK\x94e\x181~\xf2\x80\xdb3\x94.\x0a\xc5\x03\x92\x0f\x85\xdc\x0et\xd8m\xb9v\xe9&\xb0P\x97\x9be\xa77\x05F\xecY9U\x1b\x11\xaaS\xe4\xad\x13\xdf-C\xd9\xe2k]t\x89\x0d_\xefV\x87\x13\xb5\x910\xf4\xaf`s\xaa\xfePm\xf5\x83\xf5T\xa1\xf8\xfa\xee\xa5\x8b\xea\xa51\xe7\xf9\xfa\xe5K\xebi\x03[\xbd{\xe7\xd2\xdam\x7f\xa1\xa9\xde\xac\xf0}\xdc\x08w\x88G\xf4Z<\xea\xf9\xd8\xd0\x0c4\xed\xdd\xb6\xce\xce*j\x08\xe8\x97`\xc4\x04\xcf\xcd\xfc\xf0\x96(0\x11\x1e\xb3\xb42B\x13!M\x17Q\x0eZ\x9c\xda\xdbg\xe3H\x1c\xcd\x04+\xd1\x0a\xcd\x16\x06\xcc\x12\xa6/\x20\xd1\x94`G\xfe8#4\x0f\x11\x89\xfag1\x7f\xa6Bo,\x09\xef\xc4\xd3U\xd2)a\xda\x02\x12\x05&\x01E+\x0aL2\x20Q\xe0\xa6\xf9l\xb0z\xd7\x1fn\x18\xe5\x02&\x06H\x14\xb8iv9\x1c\x0e\xc6\xc3N\xc0\xa4\x00\x12\x05\x00S\x03\x12\x05\x00S\x03\x12\x05\x00S\x03\x12\x05\x00S\x03\x12\x05\x00S\x03\x12\x05\x00S\x03\x12\x05\x00S3\x9d%Z\x83l\xab\x86\x8d2\x01@r\x99\xce\x12\xf5u\xba\x8bm\x13Z\xf4\x12\x00\xb8\xc1]\xa2Z\xc3\x08\x91\xe1c\xee\xd6>\xbd=\xa6\x92.4\x80\x01\xc0\xcc\xf0\x96(\xc30\x02\x0b']=\xa3\xfd\xaeX?\xa9\x9f*z\x0d\xd6u\x06\x80d\xc3[\xa2\x0c\xc3\x08|z\x8f\xd8\x9a\xfa]\xc9\x18\x16\x82D\x01\xb3\xc3Y\xa2,\xc3\x08\x9f\x8b\xaeZ\x94\x94A!H\x140;|%\xca4\x8c\xe8\x11\xd5\x1a\xcfO}\xa7\x82\x81\xc8J\xef\x00`J\xf8J\x94i\x18\xd1\xee\x19ns\x1d\xe8N\xcaZ\x18\x82\xad\xb2{,Y\xd7\x07\x00\x88\x03\xae\x12e\x1bF\xb4R\xc3\x88\x03\xadI\xd1\xe81\x84\xd0=F\x99\x00\x20y\xf0\x94\xa8\x8ea\x84g\x0f]\xf5\xda\xdd\x1b{\xef)!`+\xdc\xd1\xa9\xe7\x12\x02\x00&\x80\xa7Du\x0c#\xba$\xa7\x88\xaeh\xf7I\x1e\xf4\xa2\x93FY\x00\x20\xa9\xf0\x94\xa8\x8eaD\xbf\x9b\x0e\x06O'\xc30\x02ft\x01\xb3\xc3S\xa2\x12\x1a\xc3\x08?\xbd\xe9\x12\xd8\xd7\x17s\xb7\xa9\x01$\x0a\x98\x1d\xde\x12e\x18F\xe0\xbe=}cC-m\xc9\x98.2r\x8d\x07\x80d\xc3[\xa2,\xc3\x08|\xa9\xdd}\xa4\x8f\xbfB\x05_\x7f\x8d5m\xcc\x9c\x814\x85\xb7D\xcd\xc4\x12\x84\x0a\x921G\x05\x00\x090\x9d%\xea\xeb\x1f\xc3\x00`r\xa6\xb3D\x01\x20\x05\x00\x89\x02\x80\xa9\x01\x89\x02\x80\xa9\x01\x89\x02\x80\xa9\x01\x89\x02\x80\xa9\x01\x89\x02\x80\xa9\x01\x89\x02\x80\xa9\x01\x89\x02\x80\xa9\x01\x89\x02\x80\xa9\x01\x89\x022\xb0>\x8c9\x01\x89\x02\x04\x9f3\x0f-1\xca\x04$\x03\x90(\x20\x12,.v\x9d\x86'\x96M\x09w\x89j\x0c#\x84\x16y\xb5\x94\x031\xf7\x9b\x1aN\xda\xc2k=\xf8\xeb\xf2\xb2\xaa&\xab\xb3\xf7\xaa\xad/\x14n\xb7ng\xa4\x86\xf1\xcf\xcb\xdd\xa2\x0d'\x83\xd0\xd1\xbe\x87$\x0aU\xa9j\x06P\x07#\x150\x03\xbc%\xaa5\x8c\x10\\\xfd>\x91>W2\xdcU<\xd9/\x84\xc2yy.gV<\xebm\xfb\xe2\xc8\xe4B\xaePXf\x99\xcdH\x0d\xf3d\xe1\x96\x0c\xbf&\x8c\x93@\xac_\xbb\x86\x8ef\xaf\xf0\x8a\x1c\x94\x17:d\xd5\x01\xe37\x90\x97\x91\x0a\x98\x01\xde\x12e\x18F\xd0\xe3\xf1\xd4\x00\x00\x0f\xb1IDAT\x0c\xd1U\x8cZ\xbac\xef8E\x84\x9bM?j\xc6\xc18\xc4'j9\xd7e\xd8\xd8\xbe\x80B\xd2\x0fd\xac\xc8\x08\x15\x1bI\x8dP\xb1\x19g{5a\\\x04]\xb9\xf3bl\x0e\x1d\xad\x8a\x8e1\xabr\xc6T\xa9j`\x81\x18\xf3\xc2Y\xa2,\xc3\x08\xca\xb1\x17\xf8\xaf\xba\xa0b\x04\xc5\xbb\xbc\xd9\xd8\x12Ta\xd4\xe2w\xa2\xcep\xd4\x1f^\xf1>\x92\x1aa\xb6{\x0c\x8dh\xc2x\x18\xa8@\xf7\xc4\x1a>\x86\x8e6NZf7r\xabS\xd5\x80D\xcd\x0b_\x892\x0d#\x08\xc3\xaeq\xdd\x9d\xa6\x8c@\x16B\x19t\x04,\xd8\xa4\xe1\xdaZ\xd5\xf6\xcb\xd5\x0e\xc7\xfe\x8f\xb6=\xbch\xd3\x97\xea\x1d\x8f\xe5g\xac%-\xe3X\x8e<\xcc\xcb\x89\x96J\x1f\xea\x93\xa3\xa6|\x9c\xdf\xa4I\x8dP\xd5\xb0d\xf6@&\xca\x1cV\x85at\xeb\x10X\x9b\x91O.*\xf1\xd4\x81\xe4\xaab\xa4F\xe8\x02\x89\x9a\x16\xbe\x12e\x1aF\x10ZO\xeb\xee3\x85\xf4y\xbdVI>\x17\xc4\xb1Z\x93\xd7\xab\x1e\xda]?s\xa6v\xf5\xe2\xda\xdd\xdb\xee\xfa4j\xc7\xc0\xfa\xcc\xbc#\xa2\xb2\xdd\xcd\x12\xee\xe8.\x80\xcf\x16*j^\x0d^f\xd7\xa4F\xd8\x9cc\xed\x13\xaa\xec=AU\x18F\xaf\x0emy\x99\xebi\xff9\x9e:D\xba\xb9\xcc:\x08\xe3]\x15\xb9q\xf5\xf1\x81$\xc0U\xa2l\xc3\x08L\x16\xc1N\xd6\x84\x7fV\xa8\x85cwt\x1fw\xd4_\xc37\xaei7\x0c\x95\xa1\xc7\xc4>\xe4\xa8\x84~\x17\x20\x98\xbd\x1d\xef\xc8\x8e1v\xdd\x82\\8\x90},*T\xc2\xaaC\x1d*\x1b\x92C\xe3:(\xba\xb9L\x96\x88mp\xbc\xbd|\x80;<%\xaac\x18!r\xb25\xd6~S\x89\x91D\xab\xa3\x1bP\x19wn\x96\x0b\x8f\xa2\x10\xba\x9e\x13\x03\xa8[\xe8\x8ea\x05\xde\x8ar\xd7\xe2\x1d\xb3\x04u\xa8\x82U\x07\xb75W\x16]\x1cuPts\xd9\x9b;\\\xc5\xd0\x8a\x9a\x16\x9e\x12\xd51\x8c\x10q\xf7\xc5\xd8mJ1\x92\xe8:F\xa2\xd8\x86V\xa2\x85D\x11^\x8f\x84\xfe\xc3H\x14G\xa2\xf9\xf1v\x0ck\xcaz{{\xcbj\xf46\xb7\x8bm\xdf}\x059\x01u\xa8\x86Y\x07:\x1a}2\xbe\xa6O\xea\xe6\x8e\xae\x8d1g\x0e3\xba\xe6\x85\xa7D%4\x86\x11\xa4y\x8d\xef\xbb6\x05L@\xa2\x9d\xf9\xf1jCd\x16\x99$^;Kos\x1b\x1a\xc1\x17\xd0\x0a\x1c,\xb8\xa4\x08\xd5yt$J\xe6tg\xc5c\x1a%ws[Q\x8c\xe7\x1c@\xa2\xe6\x85\xb7DY\x86\x11b\x93\x9a\x94\x9b\xa2B\x8f\xd7kuz\xbd\x81\xd0\x8cn\x8fzZ\xe7\xcb?\x0e\xae\xae\x1f\x1c\x8c\x1e\x09.\xb3\x0f\xe18\x11\x8e\xa1\x8d\x01\x1c\xd8\x88\x8e\xe9\x9c\xe0xvM[A\x91\xa5n\xb3\xc5\xaf\x08\x15\x19t\xea\x201d_\xc6LWs\x0f:H\x1e/j\x88%\xd1>\x94\x9c'G\x00cxK\x94i\x181\xcaz\xe0e\xeay#C\x9agqa!\x97\x06\xaa;\x92\x18_vP6\xe9\xec\x1e\x07'\xc5B[\xf1\x11\xf1U\xef\xa6\xd2\xe9;lu\x81\x93E\xb9\xcd\xaa0\xc2\xcd\xd7\x01\x17\xc9\xd3I\xb1f\x84\xc63\x97\x0d\x8c\x1b>3\x05$\x03\xde\x12\x05\xccI[1\x82\x1f\xa3\x99\x13\x90(\x201>\x00\x0eT\xa6\x04$\x0a\x00\xa6\x06$\x0a\x00\xa6\x06$\x0a\x00\xa6\x06$\x0a\x00\xa6\x06$\x0a\x00\xa6\x06$\x0a\x00\xa6\x06$\x0a\x00\xa6\x06$\x0a\x00\xa6\x06$\x0a\x00\xa6\x06$\x0a\x00\xa6\x06$\x0ap\xc0\x95\xdd\x20\xbe\xf6\xe4&\xb6L0@\x00\x89\xa6\x04\xed\x95~FhF\xfc\x95\xed\xda\xc4@\xf6Z4\x86\xf1}\xb6x~t\xc8,a\x1a\xc3]\xa2\x1a\xc3\x08\xf1?\xf0\xd5\x17\xf6\xbd\xf0j\xdc\xbf\x92\x9e\x86lAM\x8c0~\xe2\xf7\xaf\xb8y\xb6dh]/\xfa3\x85Y\xedx\xdc\xb21*}tE~\xf6\xec\xcd\xf2\xff\xbc\xcb\x9e\x93\xbf\x91\xfc\x20\x8eU\x82><\xcf-)\xf0\x96\xa8\xd60\x02\x07Z\xda\x86\xc7\x86\x8f\xb4\xa4\xbdF;\xfb\x8dr\xe8\xd0\x9c\xe1f\x84\x09\x10\xbf\x7f\x85\x88\xc1j\xdb\x83\xef\xc6\xde\x8e=\x99\x9a\xa5\x9az\xad\xc1\x82V\xf1\xea\x12\xb5\x9e\xc4\xc87fo\xf7l\xcc\x99M\xd7\xc8Y\x98Q\xd7\xde\x80ZuJ\x90\xf2\xb3\x12\x13:\xb7T\x84\xb7D\x19\x86\x11\xdeV\xd2\xfd\x11Z\x13\xf1JHI*t\x970\x8a\xcd%\xcbzF\x98\x08\xf1\xfbW\x88\xdd\x1c\x14{Q\x89u:\xeb\xb4Dh\xb0F\xaff\xe6\xcf\xdc\x83\x86\x82\x85\xd1\xf6\x16K\x0a\xc8\xff\xfcp6i\\\x97X\xbb\xc9\xfa,\xcd:%\x10\xd85K\xe4\xdcR\x12\xce\x12e\x19F\x9c\x96\x16\xealO\xcaj\xd7<)\x8bg\x19\x13\x06\xceY\x01F\x98\x08\xf1\xfbW`\xdcc\xb0\x8c\x91\xdeRJ\x11\x02\xb3\x9c\xd1I\x8f\xa1\x85\xe2\xe1\xa2\xc7\x98\xc5\x05\xf4\xed\xbe\x0arT\xda\x7f\x1f\x91V~`\x94\x80\xf5j\x96\xc8\xb9\xa5$|%\xca4\x8c\xf0\xb7t\xf9\x05\xbf\xb7\xc5\xd4\xb3\x20\x090\x90\x89P\xc3\xc8\xaa\x82\xac*r\x15j\xa9\xcc.\"\xee\x12\x1eyy\x922\xb2NuF\x0b\x1e\xb5\xa0bU\xde:dq\xad-\xca\xae\xd2\xb4\x1fB\xce\x93\xd1\xa1\xae\x8d\x84\x0e\xf1\xfbW\xb0\x850\xb8\xa9\xb6z\xf9\xa6\xda\x1b\xf8ui\x9d\x16\x07]7\xf4\xc6\xa9u\x8bW\xef\xbe\x8e\xf1.G\xf5\xf1\x9d\xb5K7}$go\xc8\x8a\x9e\x16\x0a\x0e\x0bx\x99f\xb2\xa8[\x92\x91\xb3P\xfc\x9bX\x02X\xb1Y[\x02\xd6\x93h\"\xe7\x96\x92\xf0\x95(\xdb0B8\xe9r\xb9:\xe2\x99\xecK\x09\x84\xd6\x03\x05E9\xf9kW\x90ILgF\x9d\xa7\xd9V\x16\xc4\x81no\x91\xdd\xeb\xf5\x8a\xdd\x06\x9f\xd7\"~\x93z\x9cVU\xde\xe1\x03\x99\xc8\xd6\xb4=\xe7\xbe\xe8\xf2\"MC8\xd4\xb1\x91\x10\xe4\x85\xe95\x7f\xca\xb8\xfd+\xfc\xa3\xa3G\xd0\x91\xd1Q\xf5\xe5\xf2\xdf\xee\xday\xe6\xfc\xa9\xe5\x8e/\xf1\xb5A\xba\xda\xd9\xe0\x07$y\xa7c\xf7\xf9\xe3\x0f>~\x03_>S\xed\xa8=t\xa8v\xd1e)\x7f7KK\xda\xc9\"\x19!o\x95\xd8\xc3\xa8\xd8S\x9c\x91\xe7\x0c-\xa9\xaf-\x81]3\x9c\xc0\xb9\xa5*\\%\xca6\x8c\x10N\xb6\x0e\xfb\x86[O\xa6\x8dF\xc5/\x1c\x9a'\x9e)m;\xc9\xecN/:HS\xc3\x1d]\xea$\xd3dU\xe7\xc5\xd6\\Q\xd3\xabl\xd1\x85y\"\xb3,\x8a\x90e#a\x97[j;\xd6\xc3\xc0\xbfBgi\xfb\xe3\x0f\x92\xc6\xfa\xf8\xd2\x1b\xe4C\xb8\xa3\xfb\xba\xe3\x94\xf8\xfa\xae\xe3\x8c\xf8Z\xfd\xb0X\x93k\xb5\xf2\xa2\xdcc\xac\x81\xa0f\xb2H&\xe8\xcc\x12/[\xf9\x19\xb6-\x1d\xcdy\xf9r?^SB\x1c\x8b\xee\x1bzs\xa4(<%\xaac\x18\x11\x9a.J\xa3e\"\xcbB\xd3\x1d\x0f\x14\x0a\x84|:\xb4\xd2\x91hxj\xc4\xea\x8c\xa4*h\x8b|+\x15!\xcbFbD^\x98^\x7fN\xd6\xc0\xbf\"\xd8\xe9\xf14\xa1&\x8fG=\x90\xfb\xb4\xf6\xe1\xdd\xa7\xde\xbfq\x9d~\x08Kt\xdb\xc3\xd7\xbf\x14\xa9\xdd)\xc6\xd5\xfbI\xcaq\x87t\xc9\x18\x93.Ij\x0au.\x1cut\x01\xe32+\x11\xf0X\xb6\xdc\xa7\xd7\x94\xa0S3%F\xde\x1c\xa9\x0aO\x89\xb2\x0d#\x82{.\xd0\xf0\xc2\xbe\xf4\xb9\x00\x96U\x84\x02\xf9\xd2O\x17\xd7\xd3\x91h(\xaf*U\x81b\x08\xa6\x08u\xac,\x0c0\xf0\xaf\x20\xb0F|\xd7N=\xb3\xda\xb1\xfc\x97\xeaV\xf4qGd\x01\xd1\xeaC$e\xd0!\xdd\x90\xe9e\xac\xca\xebEm\x0a\xc3\xe50\x81\x9aLz\x17\xa9\xa6\x98~\\V&%\xb3J0\x9a\xc8\x8a\xe3\xdcR\x12\x9e\x12e\x1bF\x04\xf7I\x12\xedO'\x89\x86\xc4\xb8\xa2\xb0\x9f\xe2\x0f\xa7\xd2[\xc1T\x8c\x0dVu^=\x89\x06\xacM\x8c\xd0xb\x95\x85\x81\x7f\x05\x81!\x84w\xf7\x8b\xe2\xbcvf\xd1q\xf2\x81\x1e\xf8\xd4\xa7\xa4\x15}\x97BZ\xce\xea\xddd\xd3)\xb9\x15m\xb2h\xe7\x9dkl\x02vF\xaa/\xe3+\xcb\x95\xbaS\x0d9t\x9c\xb3D\xbe^\xb1J0\x92h\x1c\xe7\x96\x92\xf0\x94\xa8\x84\xc60\xa2S\xee\xe8\xa6\xcd,\xb9Bv\x1d\xd2\xbd\xf8\x8d\x9b\xc9\xab]\xec\xea\x8d\xd3\x04\xd2\x9f\x0bV\xc4)Q\\sGP\x1bNL\xa2\x06\xfe\x15\x84K9\x9a1\xe3!\xc7y\xf2V\xbf\x8b\xbe\xd6c\xfc\x19\x19\x80\x9e\xa7\xa3P\xbc\xff\x97\xe2K\xf5r2\x16}\xb8\x9ef\x0f\x16/\x8c.\x01\xfb-\xebq?j\xcaP[,\x0e\xcc*\xbaD\xfcM\xc9=Or\xf2\x97\xe8\xa3\xbc\xec\x12\x985S\x12\xc7\xb9\xa5$\xbc%\xca0\x8c\x10\x0e\xb6\x0e\x8d\x0d\xb5\x1eL\x97\xe9\"\xa1\x87\xce\xddJ\xa3\xc6\xf5\xe8\x81\xd6v'\xa2\x97\xa5&\xeb\xf6\xb6y\xd9\xe4\x94+m[6W\xa2L\xf7\xb0\"\xaf\xcfkq\xf6\xe0~\xa7\xc5\x1b=\x17\xf9N\xc6\xf6\xa80\xa6\x8d\x84>\x86\xfe\x15:\x1cr,>\xf4\xfa\xeb;\x1d\x83\xf4C\xf5\xf1\xd7\xeb\x17\x93C\xef\xbfk\xdb\x191\x95N\x179\xd6\x9d9\xb5z\xe9\x074\xfb\x0e\xa4}\x8cj;\x1a\xc1\x07\x0a\x83VU;x,k\x96\xc7\xeb\xf5:\xf3\xc5x\xa3\xa5\xa1c\xbb\xad8\xa0[\x82\x01\x13=7\xf3\xc3[\xa2,\xc3\x08\xa1\xf7\x88\xbb\xad7m\xfe\xb2\x03\x92\x0f\x85\xdc\x0et\xd8m\xb9v\xe9&\xb0P\x97\x9be\xa7&\x81#\xf6\xac\x9c\xaa\x8d\x08\xd5)\xf2\xd6\x89\xef\x96\xa1l\xf1\xb5.\xba\xc4\x86\xafw\xab\xc3\x09\xdaH\x9cDF\xfe\x15lN\xd5\x1f\xaa\xad~\xb0\x9e*\x14_\xdf\xbdtQ\xbd4\xe6<_\xbf|i=m`\xabw\xef\\Z\xbb\xed/4\xd5\x9b\x15\xbe\x8f\x1b\xe1\x0e\xb1\x07\xe1\xb5x\xd4\xf3\xb1\xa1\x19h\xda\xbbm\x9d\x9dU\xd4\x10\xd0/\xc1\x80\x89\x9e\x9b\xf9\xe1-Q`\"]\xa1Z\\Y\x16w\x1d\\^[\x19y\x1e:b\xac_a^Ya\x8bac`\x9aZ\x1d*{!@f\xb1Ke\x9e(|*dfclfP+\x7f,fheMj\xaf.\x81.Fm\xb1ikh0\x8301\x841/\x859Jq\xb5mol\x89j_oqn;\x86:>\x88<\xb3h\"{s[Vu\xb5sur?\x8a>@\x8b?uwtB\x8c@@\x8dG\\z\xba\xadq?y{xJ\x8fI^~\xb8L\x90K\x94wq\x85}d~\x80}O\x93Nb\x83\xbdN\x95U\x81\x83\x80W\x95V\xa7|e\x8e\x85gm\x87\xbcZ\x98Y[\x9aZ\x87\x89\x86]\x9b\\^\x9d]\xba\x82Z\\\x9ddr\x8d\xc2\x8a\x8c\x89\x96\x8cnd\x9ddf\x9ff{\x90\xc0\x8f\x91\x8eh\xa1h\xe3\x83+\xd0\x87K\x7f\x93\xc4j\xa3jz\x97\xc6\x93\x95\x92s\xa4l\xa0\x96wq\xa5s\x81\x9a\xc4\x97\x99\x96\xe4\x8b@u\xa9w\x9a\x9c\x99\x86\x9e\xc8\x9c\x9e\x9b\xef\x904~\xaby\xa8\x9e\x7f\x9e\xa0\x9d\x80\xad|\xa0\xa2\x9f\xf9\x94.\xa1\xa3\xa0\xa2\xa4\xa1\x81\xb1\x85\xff\x952\x92\xa6\xcb\xa4\xa6\xa3\xb3\xa6\x82\xa5\xa7\xa4\x8b\xb2\x88\xa7\xa9\xa6\x8d\xb5\x8a\x8e\xb6\x8c\xaa\xac\xa8\xb9\xac\x88\x8d\xb8\x93\x9e\xae\xce\x95\xb8\x95\xad\xaf\xac\x97\xba\x96\xaf\xb1\xae\x98\xbb\x98\xa3\xb2\xd2\x9b\xbe\x9a\xb3\xb5\xb2\xc2\xb5\x90\xb5\xb7\xb4\xa3\xbf\x9d\xac\xb7\xd2\xa2\xc0\xa4\xb7\xb9\xb6\xb9\xbb\xb8\xa5\xc4\xa7\xb1\xbc\xd7\xbb\xbd\xba\xa7\xc6\xa9\xcb\xbe\x98\xbd\xbf\xbc\xa9\xc8\xab\xb8\xc0\xd5\xaf\xc7\xab\xbf\xc1\xbe\xc1\xc3\xbf\xb2\xca\xae\xc2\xc4\xc1\xbd\xc5\xda\xc4\xc6\xc3\xb2\xcd\xb7\xb9\xcc\xb8\xd6\xc7\x9d\xc7\xc9\xc6\xbb\xce\xba\xbc\xcf\xbb\xc4\xca\xd9\xc9\xcc\xc8\xbe\xd1\xbd\xc0\xd3\xbf\xca\xce\xde\xcd\xcf\xcc\xc4\xd0\xde\xc8\xd3\xc1\xcf\xd1\xce\xdf\xd1\xa5\xc7\xd6\xc9\xd1\xd4\xd0\xd2\xd3\xdd\xca\xd8\xcb\xd3\xd5\xd2\xce\xd6\xdf\xcc\xda\xce\xe7\xd7\xab\xd6\xd8\xd4\xd4\xdb\xd0\xd8\xd8\xe3\xd8\xda\xd6\xd3\xdb\xe4\xda\xdc\xd9\xe6\xdd\xaf\xd7\xde\xd3\xd5\xdf\xda\xdd\xdd\xe5\xdc\xdf\xdb\xd7\xe1\xdc\xde\xe0\xdd\xf0\xe0\xb3\xdc\xe1\xe4\xdf\xe1\xde\xe1\xe3\xe0\xe3\xe5\xe1\xe1\xe6\xe9\xe4\xe6\xe3\xe8\xe5\xea\xe5\xe7\xe4\xe6\xe8\xe5\xe4\xe9\xeb\xe7\xe9\xe6\xef\xf2\xee\xfe\xff\xfc(t:\\\x00\x00\x20\x00IDATx^\xed\xbd\x0fp\x14G\x9e\xe7\xbb\xcc{\xbe}\xcf\xaf\x84zf$\xf5\xae4b\xef8M\xb4BB\xc7\x19\x9e%`\xd7z\x08\x8b\xf3\xc2C\x1b\x02\xc1\x03\x9d\xe1\x16\xc6\xd8\xf3\x08\xb3+0\xecB\x888\x9be,\xeel\xe4\x85~\x92\xb5\x1e\x99\x91X\xd9\x20\xa2\xcf\x8c\xa4\xc0\x9a6\x20,\x06#\xd9H0\xd8\xc6\x0b\xde\x18\xf5\x10\xb6\xc5\xc8\xb1\xf66a\"\xda1\xd1\xe4M\xbc\xca\xaa\xee\xaa\xcc\xea\xcc\xca\xeeVw\xb6\xd4\xf5\xfb\x04!\x15\xa9\xac\xac\xac\xac\xfev\xfd\xe9\xea\xfa\xfc\xc1\xef\x93\x07\x01\x000{\xf9\x03Q\xc2m\x10\xb5\x0d\x00\xc0\x0c\x06\xc2\x0f\x00\x0e\x05\xc2\x0f\x00\x0e\x05\xc2\x0fd+aQ\x05\xa7\x03\xe1\x07\xb2\x92@c\xa1\xf2\x84\xa8\x92\xc3\x81\xf0\xf7.\x9e\x14U\x91I\xc2\xdd\x99Z\xdc+\xaa2\xa3\x90\xd3\xdfpI\x89w\x20\x20\xaa\xe5p\xe4\x86?\xd0w\xbc\xbd\xfbB\x10O\x06/\xbc\xd1\xfe\x86>I\x94\xf2\xf8\xd7#kk\xf7=\xb0\xab\x11C\xb3\x92\x8b_e\xbe<\xa5\xd9\xaeZ\x8b\xfd\x9f\xd9\x0c\x14\xfaDU\x0c\xa6\xb6\x15\xe6\xad\x88\xfb\x084\x89\xee\xb4\xe4\x1c\x14U\x91\x8b`t\x92\xeeo\"\xa3~U\xe9\x13U\x01\xa4\x86\x7f\xd2\xeb\xbb\x11\xb8q\xf2\xb8\x9a\xf3`\xe7I<\xd9\x19\xa4J\xb9\xecn8\xfbR\xed}\x9b\x0a\xb1L\xd5\xe7-U\x7f-\xcd\xab\x9f\xb2\xa9\xd5\x9a\xd3a\xf3W\x1e\xbe\xfc7DU\x0c\x96\x16z\x1b\xf3l\xdf\xd9\x08\x92\xea\x8eon\xab\xa8Jz\x18\x1ce\x16\x8bFG\xd8\xdf$\xdb%\x19V\xfc\xa2*\x80\xd4\xf0\xdf\xf6\xe2\x03\xb1\xa0\xf7\x06B\xfe\xee\x90:\x19\xea\xf6S\xa5<\xeeW\x9fA\x0f\x12\xcb>BM+\xd4\xccM\xe5\xadh\xb2\xa9s\xdbe\xf7W>q\xef\xc9\xd1\x94\xd2\x8a\xc2\xf1f?\xc9\xee\xecqe\xe6\x00wa=\xbb\\4:\xa2\xfe&\xdb.\xc1\xb02$\xaa\x02H\x0d?\xd2B0\x89\xc3>\xa0\x9f\xf8\xf5\x0eP\xa5<>\xab~\x97\xffG\x1eM\xf5K\xbbP\xe7\xf2z\xbb<5\x16\xc5\x9b\xcbd\xb9\xa9\xc4\x7f\xac\x9alw\x82E\x8d\xa2*i\xa1\xacNT\x83\x8d\xa8\xbf\xc9\xb6K\x00\xe1\x8f\x03\xb9\xe1W\x09\x05\xba}\xea;\xf8T\xe7\xe0Th\xca\xdf9E\x952\xf9vm\xb5\xc61\x84\x8eTW\x9fC\x9f\xd5Vo\xc5\x93\xb5g\x8fm\xad\xdd\xf7[\xad\xceg/\xac\xadm\x88LGi\xaao\xadC+\xbc8\xfc\xc1\xba\"W\xf1\xca\xabj\xe16en\xeb\x93\xc5\xee\x957\xb5*\xa1\x02\xed\x9d!T\x98\xdbT\\4\xb8\xdd]\x15\xe4\xd4%g\x0b\xe6)J\xceq\xa4U\xc8\xf5\xee\x98\x9f\xb7\\{\xdb\x9aZ\xef.\xde\xb1\xc3\x9d\xdfMt!\xe4V4v\xe0\xba9\x9d\xea\x9e])\xb1\xcc\x86n\xd7\xb9s\x0bW\x04\x88\xee\xa0\xabs\x15e\xcf\xcd\xf5\xf3\xf2\x96\x87\xb8\xb3u.\xce\x9f\xbf#\xfaV\xb1'/\x84(\x12n\x81\x81\x7fyq\xae{E1\xaf\xd4\xa7\xaf\x9aRF--\xbe\xd1\x89\xe9o\x8a\xda5\x19\x84\xf0\x8b\x91\x1c\xfe)\xaf\xd7\xdb\xa1\xbd\xe0B\x03\xead_\xc8R\xca\xe4\xd3\xb1s\xd5=cc_\"\xf4\xdb\xb1\xda\x1e\xf4`\xecH-B\xb7\xce\xd5V7\xf4\xf4\xac~\x01\xd7\x18\xab}\xb6\xe7J\x8fzn@\xd2T\x1f\xc8\x9f\xfa^\x00\x87\xdf\xa7<9\xd8\xbd2g\x18\xa1\x1b\xc7\xe7*\xc5\x07\x9b\x8b\xf3\xc6q\x95QeP\xab:X\xa0\xecX\xaa\xb8\x0f\x16\xb6p\xeaR\xb3]\xf6\xfb]\xdae9\\Z\xd8\xdcR\x80wT\xa1\x92\xa2\xd6fW^\xfb\xf2\x16\xb2\x0f\xef\xfb\xbb\x94f\xbf_}\x9d\x06\xfc\xb9\xea\xe5\xb6^\xb7h\xbd:\xedC\x8dOr\xeb\x92\xb3!\x94\x17\xb9&\xefr\xab/\xcb\xf5\x85\xeaT\x97\xa2\x1e,\xb4*\xe3\xc8\x82y\xd8\xaf\xbdt\x9b]\xf4l\xa1bu\xaf\xa6\xbe\xca\xb5#\x20\xa3;\xea\xf2\x95\xa5A\xfd\x84\x889\x9bO\xc1\x17\x06\x87\x95.\xbdv@\x89\xbd\x14\x96X\x0b\xb1\xb4\x16\xe2m\xd3\xea\xa6\xdf\x1d\xa8R\xe2\xf0\xdc\\\x1a\x8actb\xfb\x9b\x9av#<\xa1\x1e8$p\xb2\xe5Xd\x87\x1f\xe1W\xfa\x80y\xc1\xef\x02U\xca\x83\x1d\xfe\x97\xa2\x93W\xaa?e\xcc\xa4\x86\xbfE9\xa8\x85\x1fM\xb5.\x9fW\x80\x8f$\xd5W\x8evh\xdd\xaa\xe0\xb8\xf5\x1a\xe1\xefBCJ\x10\xcf\xc2\xabK\xceF\xbc\x0c\xf1\xc9\xab\x96\xab&7\xc2I\x8f\xf9\x0c\x9b\x1d~c6\x9f\xf2\xbeY\xb7\x97\x08\xbfqM\x8c9[\xfd\xbc\x10\xa68r\xee\x1c`d8\xb1\x16b\x09\x14\xcd\xdb\xe6}?l9>\xa7J\xc9\x90\x92\xd7\xf0\x84\xa3\x13\xdb\xdf\xd4\xb4\x1b!\xd0\xe7-\x81=\xbf\x18\xa9\xe1\x0f\xe9{\x91\xab\xdep\xb8]\x7f\xcd\xbf\xdf\x1e&J\xb93\xb2\xc3oL\x9e\xa9\xfe\x961\x93\x9a\xe4\xa9\x1d\x93Z\xf8\x87\x0b\x8b\x9bN\xfa\xab\xf4@k\xaf\xa0A\x05\x7f\x9c4\x14=\xfc,\xeaC\xc3.m\x16^]r6\xe2eh\xe4\xaa\x05\xbf-\xf4\xc5\xbb\xe7'f#\xd2etG}\xd1\x97E\xa7\x98\xb3\x95EN\x8c#\xf7\xb0\x0d+\xc6\x9b\xa8Ab-0\x08z\xebJ\x94B\xeax\xdaRJ\x86\xd4X\x1a\x8act\x18\xfdMI\xbb&~e8\xa6\x0c\xb0\x203\xfc\xe1N\xfd\x94VM|4\xfc\xa3\xea\xa4Y\xca\x9d\xd3\x12\xfeW-\xe1\xbfR}\x8b1S\x93\xfe\x81\x11\x0e\x7f\xc9b\xbc\x1f\xa8\xd3\x03\xbd\x1d\xff\xf4*\xb8$\xe8\x8a\xbc\x9c\x88\xf0s\xea\x92\xb3\xb1^\x86\x81\x9c\x15\x81\xab\xf3\x17\xc7\xac\x83%\xfc{,\x19\x1cP\x88\xcf\xb4\x8d\xee\x90\xaf\x7f\xe6l\xeb\xe7\x8djD\xae\x976\xbbb\xf7s\x89\xb5\x10\xcbe|\xa8\x13\xec\xca\xa3?\x93\xa7J\xb5E\xb4\x07\x8c\xc9(\xc2\xd1\x89\xedoj\xda5\x81\xab\xfdq\x203\xfc\xe8\xb8v\xd7\x95v\x80?\x189\xec\x1f\xa4Jy\x10\xe1\x7f\x15\xa1\x07\xcfZ\xc2\x7f\xbfa7\xde\xf5\x1f;F\xcdD\x84\xbf\x18\xbf\x84\xc2\xfa^\xc4U\x88O\"\xe7U\xe9\x7f\x9c\xa7\xbfn\x88\xf0s\xeaR\xb31^\x86\xa3J\xa1\xa2T\xc5~\\i\x86?O\xedHx\xa1%\x83\xc1\xa2*<\x10\xdb\xb5\xb7\x16\xa3;\xe4\x8b\x9e9[\x9f\xa2]\xde\xde\xa3\xdf+\x17.Y\x81bH\xa8\x85\xdb\xcd1\xf7\xd54\xeb\xf7\xc8Um\xe3\x97V\xa9\xa31\xa9\xb7#\x08)=:\x8c\xfe\xa6\xa4]\x02\x08\x7f\x1cH\x0d\xffM\xef\x00\xbe\xca\xa7]\xf0\xeb\xea\x1e\x0f\x8cww\x85\xa8R6\x91\xab\xfd\xda\xdd\xbd\xbb\x1bzz\x9e\xad\xae={\xeb\xcb\xb1\xda#c\x0f>=R\x8b?\x05\x18\xab\xddz\xf6\xca\xb1\xea\xb3\xe4\\S\xf5\xda\x8b\"PU?\xa5\xbe\xb4\xeaZ\x0f\x96)\xee\x96!\xf5\x95\xa3\x94u\xb7\xcfw\xebg\xd77s\xb4\x03\xcd\x1b\xee\x96`W\xee\xd5\x20\x9e\x85S\xd7\x9c\x0c\x0d\xf9\xfd\xaeF\xbf?\x88\xaf\xe07\x0e\xa1\xd1\xc6\\\x7f\x00\x8d\xba\x06|\xfe\x80u\x17\xa4_\xed\x1f\xd2\x8a\x17\x17\x1e<\xb8X\x99\xdbq\x83\x9c\x0d\x0d~\xaf\xc4\xeb\xdb\xae\xb4\x93\xddQ\x97\x80/x\xeb]d\xcf\xd6\xa4\xd4w\xf76*\x9dZ\x95\x16\xc5\x1a\xddD[X\xa9\xe4[\x87\xbfY\xc9o\xf6\x9dl\x8c|\x00\xc1,mv\xb5\xf4.\xcd\x0fPK\x8bgtb\xfb\x9b\x9av\x09.3N\x84\x00\x0bR\xc3\x8f\x02\x83\xdd\xed'\x87\xb4\xb3\xdc\xd0\xf0\xc9\x8e\x93\xc3!K)\x8boWk\x1f\xf3\xd7\xfe\x06\xff\xe7\xb3\xdd\xb5\xab\xf7\xbdZ]}\xe4\x08.\xfa\xb4V\xfdyD-\xfe\xcd\x0b\x0d\xab\x9f\xa5o\x04jV\x14|]h\x9b\xa24\xa3p\xcb|Wa}\xc7<\x97\xbaKq\xedh,(Z\x1f\xddY\xec\xf9\x9e\xfa\"\x09\xab\xbb\x8f\xe3\x05J~7>\x05\xe6\xd45'\x87s\xf4\xb3e/n[\xc9\x1d\xcfW\x7fnC\x17\\\xb8,\xb7\x8a:\xfd\x8c|\xce?W\xbby\xf1fU^\xc1\xf2&\xb5.9\x9bZ\\W\\\xb0\xf0$\xd9\x1dtU_\x82\xbe{\xe4\xcc\xd6W\xe5v/\xd6\xf6\x96\xc8\x9f\xb7\x03YH\xb0\x05\xd4\x9e\x1fs\x8e\xdcY\xd5\\\x9c[TEg\x9f.\x0dmw\xe7U\x0d\xd3K\x8bct\x18\xfdMI\xbb$\x93s\xeb\xaeN2\xde\x14\x00\x02\xb9\xe1\x9f\x09\x98\xe7\xd5\x1a\xdb]\xd6\xfbC\x08\x88\xba\x96\xd9\xacL\xe6o\x9b\x0c\x85\x82\xc3u\xd3\xbc\xcal\xdb\x1d6]\xaeF\xee\x1bg\xdc\xf4*\xd3\xeb\xb7=\xd4\xe8\xa4\xa4\xbf:6\xa3\xde[bw1\x13\xc08>\xfc\xa8\xa5\x98\xff\x1d\xda\xf8\xc3\xdf\x1b\xf9<<\xec\x9e\xe6\x07\xccv\xdda2U\x94\xe4\x97\xe4\x08\xc2\x1d\xee'Eu\xa6\x039:\xa9\xe8o\x14\xdbQ\x9f\xbc\xca\xb8\x16\x00\x10@\xf8\xed\x88?\xfc\xa39\xfa\x91\xe7x\x0e\xf1\xb9\xfd\xac!\xe0\xde\x91\xaa\x9d1\x93t\x8dN\xba\xdau\x08N\x0b\xbf~\xb5(>\x88\xba\xc2\xd9\xc2\x8dyOv\x0dv=\x99\x97\xd6=\xe8l%]\xa3\x93\xaev\x1d\x82\xd3\xc2\xaf]-\xba\x8d\xe2\x82\xa8\x1b\xc7l\xbe\xe5E\xae\xa2\xe5\xd3<\xe8\xcfZ\xd25:\xe9j\xd7\x118-\xfc\x00\x00D\x80\xf0\x03\x80C\x81\xf0\x03\x80C\x81\xf0\x03\x80C\x81\xf0\x03\x80C\x81\xf0\x03\x80C\x81\xf0\x03\x80C\x81\xf0\x03\x80C\x81\xf0\xa3\x03\x07X\x93\x00\x90\xed\xc8\x0d?[\xd7\xa52\xee\xcd\xd8MZ\xff\xecy\x991\xa9\xf1\x91G\xe7z\xccL1\x1c\xf0x\xfaEuf\x12\xa9\xe9\xef\xc5\xcawDU2@j\xd6M\xcc\x9dR\xcf\x1aQ\x1d\x9aSt\xcf2=|R\xc3\xcf\xd6u\xa9\x04\xdb/t\x0a\xe6M\x1b{\x17\xdceLj\x84?\x189\xe591\xf2\x81\xcd\x97^.}\xa8\xff\xbe;R\xda\xc6\xaf\x958\xd1vSM\x92\xfd\xe5t\xe7|\x85\x94\x94%H\x82\xeb\x96<\xd7\xf6\x97\x8b\xaa\xd0\xdc\x1b\xd9H\xf6,\xd3\xc3'5\xfcl]\x97\x8ao\x20\x90\xa9\xf0Ox~\xc2\x984\xb8\xe6\xf9\x20\xa6\x8c\xe4\xff\xd9\x15\x9d*O\xe9\x0b\xcel7\xb5$\xd9_^wf\xe8\xe32\x12Z\xb7i\xd0\x96`\xf8\x11\xdaI\xf5,\xc3\xc3'5\xfc\x1c]\x17\x1a\xef\x08f,\xfc\xfb\xcb\xef2&\x0dD\xe1\xdf\x90\\\x98\x84lHS\xf8\x93\xeco\xba\xba\x93&\x12Z\xb7i0\xdd\xf0g\x18\xb9\xe1Wa\xe8\xba\x82\xed7Q\xa6\xc2\x7f\xa7\xf4\x10c\xd2$\x12\xfe\xe7=\xa5\xa7\x7f\xb2\xaa\xe2\xa9\xcf\xa9?\xbe\x13\xb9&\xb0\x01\xff\xa7\xfc\xb0Y\xe1\xe7\x9b+V\xfd\x84>Yh\xf3\xe0\xf3\xbd~\xf5\xe7Q\xf5\x7f\xa76T\xac;\xa5\xfe\xfe\xa8T\xfd\xff\xc4\xde\x9a\x05O\xabc2\xf2TMi\xe535\x96vI&vU\x96.yF}\x8b\x0a\xeeZVZ\xb3\xf3#\xad\xd0\x98\x0d1\x17L\x90H\x7f\xd9\xdd!\xfb{\xaf\xc2\x139\x85\xa5F\xe7\xeb\xbd\x95\x8f\x1d>\\i=\xa2et\x9d=\xa8D\x0b\xd4\xe8\x18cF\x8fd\x14\xaa\x94\xb5n\xcc\xa5\x85\x97\x94\xbe\xf2\xd8\xb2K\x87\x16m\x09Zzv\xe2\xc0c\x8f\xee\x9c\xa0&\x119Pw\xf7.[\xb4\x8b{\xd8\xcfiW\x0b\xff!\xb5\x8f\x0b\xbeNp\xf8\xd2\x82\xe4\xf03u]>u\xf7\x9f\xa9\xf0\x1f(\xfd\x9c1i\x12\x09\xff?\xf7\x97z*\xdbN!'\xc9\x81\x9aX\xb4\xea\xf4;Oy\xb8{~v\xbbZ\xf8\xef\xee\xf5\x9c\xd06\\\x02\xc3\x97\x1e$\x87\x9f\xa5\xeb\xba\x81\xdf\x0d2\x14\xfe;\xa5\x07\x18\x93\x04\xc6a\x7f\xf9\"\xf5\xadao\xa5\xf5\xef\xc4a\xf4\x92\xaf\xd5W\x07\xaep\xde\xf3\x966'\xfd\xe6\xfd\x96~ex\xdd\xcf\x11\xba\xe8\xb9\x88\xf0\xcf\xf3Z\x0b\x9e\x1f\x05\xb5\x13\xa2S\x95\xda\xfemQ\x98n\xd7$T\xf3t\x08\xe7\xef\x1e\xfe\x81\xdf6\xd7\xedD\xd4l\xec\x05S\xc4\xdf_^w\x8c\xfeb\x16D\x8eb\xcd\xd1\xe9\xf7|\x84\xafj\x7fB\xb5\xc5\xe9:{P\xa9\x16\x8c\xa5\x11cF\x8c$\x01Y\xca^7\xe6\xd2\x96\xedU\xeb\xbc\x83\xf6\x1f\xb0\xf4\xacF]\xe6\xbd\x9a\x8d\xd4$\xd1\xd8\xe6Uj\xdd\xf0:\xfea?\xa7]5\xfc'\xca\xcfG+\xc5;|iBv\xf8\x11\xb2\xea\xba\x82\xed7\xc2\xe1p\xa03\x9c\x89\xab\x1f\xcf\x97\xdeaL\x12\x98\xe1\xdf\x8fX\xe7xD\x98\x0eD+\xecz<\xa4\xaeQ\xf8\xb1\xfdT\xcd\x8f<\xa1\xd0[\xf7\xc2\xe5\xea\xc6\xdd\xbfN+Y\xa3U\xd8P\x1eY\xee\xe7\xcbj\x9e?\xfdQ\xc4X\xc5\x0a\xffy\xcfG\xc6\xf4\xd7\xa7\x9e~|\x91g\x1d=\x1b{\xc1\x14\xf1\xf7\x97\xd7\x1d\xa3\xbf\x18\xe3\xd5k\x8c\xce\xcb\x8b\x10\xbet\xfa6\xa2`w\x9d=\xa8T\x0b\xc6\xd2\x881#F\x92\x80,e\xaf\x1bsi\xcb\xfa\xd5m\x1cD\x87\x9fCt\xcf\xb4\x0f}Oy\xee\x91\x93fc\xf7<\xa7q\xe1Q\x9b\xf0\xb3\xdb\xdd\xd9v\xd4c~\xbe\x17\xef\xf0\xa5\x09\xa9\xe1g\xea\xban{\xa3\xc8\x7f\xde\xe2\xdd\xf2\x03\x8cI\x123\xfcx;\xd9\x86\xdf\xa8\xb0.r\x8e\xbc\x93\xaa\x19*\xfd\xe4\x84z\x06\xebQ\xd3\xb4Y\xff\xcb\xce\x8dZ\x0b\xc6\x99\xfd\xbd\xd3\xbb\xd6x\x96\xbc\xaeM\xb3\xc2\x7f\xc2c\x9c\x96_[Rs\xf8\xed\x91-\xeb\xe8\xd9\xd8\x0b\xa6\x88\xbf\xbf\xbc\xee\x98\xfdE\xc4\xab\xd7h\xec\x84\xe7k\xbc\x83\xb6\xec\xba8]g\x0e*\xd5\x82\xb14b\xcc\x88\x91$\x20K\xd9\xeb\xc6\\\xda\xb2\x8b\xe8Z\xa9\x1a\xba\xe7\x18=C#\x9e\x0f\xc9I\xb3\xb1\xeb\x9e\x11\xc4hL\xdc\xee\xce%\x8f\xac1\xc72\xde\xe1K\x132\xc3\xcf\xd1uMM\xaa\x8cwLf\xe01\xeb\x87<\x13\x8cI\x92\xb8\xc2\x7f\xfa\x0eUa\xef\xe3\x1fj|MW]\xd3\xbfe\xf3\x9a\xb7\xf1\xc1\xe9\xfe\xc7\xb5\x82\x9a\xfdF\x0b\x98\xebx\x0fs\xaf\x7f\xc1)\xba]\x93K\xe6\xees\xcdFmO\xbf\x8e\x9e\x8d\xb3`\x92\xf8\xfb\xcb\xeb\x0e\xf5\xb6\x14\xfb\xea\xbd\xe3y\xfa\xceG\xab6[\xb6%\xbb\xeb\xecA\xa5Z0\x96F\x8e\x999\x92$D){\xdd\xb8\xe1/\xd7CJ\xf5L\xbb\xf8{Z\xddw\x13\x93fc_{\xb4a\xb1\xf9\x9c\x9f\xd3\xee\xce\xcaO\xee,2\xce\xe7\xe3\x1d\xbe4!3\xfc\x1c]\x97FF\xce\xf9\xef\x96\xefgLR\x88\xc2\xbfe\x8b:\xaf~FiT\xb8\xa8\x9f=\x1f}\x8d\xae\xfa\xdc\xf3\xa5\x17=\x07\xf0\x8b\xf9\xbcV\xa1?r\xce\x1f}y\xb7ig\xb5h\xcb\x01\xba]\x93\xd0\xb2-x\xd0\x0e\xa9/\xc6\x1a\xdc_:b\xd9.m\xe5'\xde\xfeQ\xc5\xe7t\x85\x97=\xcf\xf5\xbf\xbd\xdfC_\x90B\xafU,\x0a\xafZ\xa0%l\xaf\xe7\xe5\xf3/{\xf6\xaaK\xb8\xa6]H\xd7v\xa9m\x9e\x8a\xb6\xf3\xeal\xef\x91\xedR\\Z\xb0\xe6\xd4\xf9C\xf8t\xb3\xcd\xb3\xeb\xd4k\x1b<\x95\xaf_\xa3f\xa3\x16\xbc\xd3Sq\x0fY\x89\xbf\xbf\xcc\xee\x90\xfd\x0d}02R\xbe\x7fd$H5\xf6Q\xf9\xa5\xf3#wc\xf6\\\xac\xaes\x06\xd5l\x81\\\x9a9f\xd4H\x12\x18\xa5\xecuc/\xed\x9f\x1e=\x11\xea/\xfd$\xf4\xdc\x96\xcf\xc9AE\xe5\x9e\x0d\xfd\xa7W-\x9a@\xd4\xa49P\x9fT<\xd6v\xf4QO\xe9[\xff\x84[\x89\x1djv\xbb\xf7F6\xee\xff\x20\x14\xda\xb9\xec\xd2W\x89\x0d_z\x90\x1a~\x8e\xaeK-\xc7\xa7\xfc\xc7mfL\x0b_U\xeceL\x12\x98\xf7\xf6\x1fP\x7f\x96~\x82?\x99\xb5\\\x19\x08\x1dzt\xc1\x96k\xc8R\xe1\xe2\x96\xcaE\x9b\x8dk\xba\x11\xae/:\x8a^\xaf\xd0\xde\xf4\xc3'\xd6U\xac;\x156\x96\xa0\x9d\xcf\xfe|s[M\xe9\xb2-\xefQ\xed\xd2L\xecz\xec\x91\x8dok\x0d\xac*\xaf\xdcuzU\xe9\x16z6r\xc1\xa7+<1\x0d$\xd0_fw\xc8\xfe^\x8f\x8c\xcei\xaa\xb1\x0fJqY\xe9f\xebY+\xa3\xeb\x9cA5[\x20\x97f\x8e\x195\x92\x04F){\xdd\x98K\x0b\xab\xfb\xd9\xfeG<\x15\xfdx)\xc4\xa0\xa2\xf2\x9f\xec_\xb4l\xaf\xf66AL\x12\x035\xb1\xf3\xd1\x9a\xc3o\x95\xea\x8d\xc5\x0c5\xa7\xddSxu\xae\xeb7#$6|iAn\xf8g\x16\xafx\xfe\x991\x99=\xbc\xed\x89\xdd\xf3\xa7\x9b\xaf*\x0e|\x15\x0e\xdf\xbb\xbe\xeb\xd1d\x97=\xfd\x16R\x01q\x8f`<\xb7\x0b\xa6j\xa8\xe5\xae\xbc\x93\xc3\x9f\xdd\xdf\xe5\x0d\xbf\xb5(\x03+\xf5\xb6~_\x00\x0aWZ\x0f|\xe2e\xfa-\xa4\x82\x84\xc2\x9f\xba\xa1\x96\xbb\xf2N\x0e\x7fvs\xb7\x92\x7f\x9fo\xfa\xf80\xf2)\xd5'\x1e\xc6\xd5\xc6\xb8\x98~\x0b\xa9\x20\xa1\xf0\xa7n\xa8\xe5\xae<\x84\x1fH%\xe1\xfd\x15\x07\xfa\xdf\xeb?P\x91\xf4\xaep\xfa-L\x1f\xfd\x12\x9cuR\x02rW\x1e\xc2\x0f\xa4\x96w\x9eZV\xba\xec\xe9\xe9\x1c\xb5N\xbf\x85\xe9\xa2]\x82\xbbc\x9d\x94\x82\xcc\x95\x87\xf0\x03\x80C\x81\xf0\x03\x80C\x81\xf0\x03\x80C\x81\xf0\x03\x80C\x81\xf0\x03\x80C\x81\xf0\x03\x80C\x81\xf0\x03\x80C\x81\xf0\x03\x80C\x81\xf0g\xf9-\xfe\x00\xc0Cn\xf8\x99\xba\xaeP\x87\xf6\x10\xaf\x8e\x14\xdd\x1e\x9d(6\xba.\x93\x03\x122rJ\xa0\x08\x11\x12\xb7\xe5+\xf8\x8e\xe7\x95\x91\x91\x9f\xaf\xab\xb4>\xf2K(\xe6\"+\x9c\xd6\x9fc9\xc3H\x8d\xae+-\xdb\x18%\xd6n\x9aG]j\xf8\xd9\xba\xae`\x06\x9e\xdcib\xaf\xeb\xe2\xd9\xad\xd2\xf4\xa8\x15\x91\x1fHH\xfc\x96/\xfd\xa1\\_WXc\"\x14s\x91\x15\xfaS\xb1\x8bM\x03\xe2/\xe2\xc5A\x9a\xb6qB\xed\xa6w\xd4\xa5\x86\x9f\xad\xeb\xcal\xf8\xedu]I\xda\xad\x92e\xda\xe1\x8f_\xab\x15y\"\xdf:\xeb\x0c\xc2\x16\xc8\x0a\x97<\x97\xf8\x153\x88\x94\x8d%\x95\xb4\x8c\xba\xdc\xf0\xab\xc4\xea\xba2\x1a~;]\x17\xc7n%\xf6,\x91\x02\xad(\xcf{\xe3\x08\xca\xca_\xc1?\xb5Ae\xb6Kl,\xbe\xe2,v\x1b\x9307\x0b9\x0eD\xf8\x09s\x17\xb3]\xbe\xa3+\x89QO\x00\xa9\xe1g\xea\xba\xa2\x7f\xf4\x9fd\xcf\x94N\x84\xba.\x96\xdd\x0ac\xefY\"EW&d\xf8-\x93\xba\x17\xca\x0c?!\x99b\x8b\xb9x\xce\xabD\xc2\xaf\xed\xebv\xadB\xf1\xb5`\xfb2\xe4\xac\xb1YJ\x09\xca\x08\x0c\x1b\x17\xb9Bf\xa9P|\xc61\x8d\x99\x83\xcan\x97\xd8X|\xc5Y\xec6&`o\x16r\x92\x08\xbfi\xeeb\xb7\xcbwt%3\xea\xf1#3\xfcl]\x17\x1a\xf0i\x93\x83>\xee\x8ciC\xa8\xebb\xd9\xad0\xb6\x9e%Jte\xa2\xd5=\x1a\x13~\xd3\x0be\x86\x9f\x90L\xb1\xc5\\<\xe7\x15\xcb\xf2\xc5&\x12\xfe\xd3\xf8uG\xf4\x8c\xdb\x02\xfd2\xb4T`\xaf1QJ\x09\xca\x08\x8c\xd74\xb9Bf\xa9P|\xc6\xa9P\xae}f\x8b\x07\x95\xdd.\xb1\xb1\xf8\x8a3\xdb\xf0\xb37\x0b9\x0e\xe6\xa0\x12\xf2\x1ev\xbb|GW\x12\xa3\x9e\x002\xc3\xcf\xd1u\xf9\xb4]\xfeT\xc7\xfb\xb6\xf3\xa6\x03\xb1\xae\x8be\xb7\xc2\xd8z\x96(\xd1\x95I\xc5a\xf5\xfdocL\xf8M/\x94\x19~\xc2\x0b\xc5\x16s\xf1\x9cW\xa4\xe5\xeb\xcek\x13\x88O\xa4\xd6\xdeG\xc2T\xcf\x98\x9e0\x8c\xf12dU`\xaf1QJ\x09\xca\x08\x8c8\x92+d\x96\x0a\xc5g\x9c\x0a\xe5\x8f\xe1s\xfe5[x\xed\x12\x1b\x8b\xd3\x02\x12\x84\x9f\xbdY\xc8q0\x07U\x18~\xbe\xa3+\x89QO\x00\xa9\xe1g\xeb\xba\x02\xde\xbe\x9b\x81\xcb\xed\xbe\xa4\xaf[$\x8dH\xd7\x85\xb7M\xac\xddJ\xe8Y\xa2DW&\x9b+_\x7fm#\x16\xd0\x1ea\x10\xb7V\x8b\xc4\xea\xf3\xd2\x1e\x0c\x1dg\xdd\xf8\xe0\x8b\xaebW\xfe\xde\xc8FF]n\x0b\xec5\xe6\xe8\xd0b+X\x206K\x14b\x8d\x93[y\x94\xd8f\x89\xbfn*z\x96\x16\xa4\x86\x9f\xad\xebB\x03\xed\x01\xfc\xc6pC0wz\xb0\xd7u\xdd\xf3\x9c@\xc6\xe3Q\xa7\xfd\xb8\x11\xd3\xc9\x11\xbfV\x8b\x86V\xfa\xc4\x7f\xd4Te\xc5\xa1\x01c\xe9\xd0\xa8\xb5`\xcffl\x16\xf6\x1a#\xe6\xca\x13\xf0\xc6\x97\xb94a\xcf\xc8\x16\x8c1\x13\xf6\x0c\x7fl\xf1\xce\xa3\xd1\xa3~\xe1k'\x1dH\x0d?[\xd7\x85.\xb7_\x0e\x8cw\x9e\x94\x7f\x00$\xd2u\xe9\x97\x95\xaf\xe1\x03\x13\x8e\xbf\x89r=\xd9\xfa\xb1\xa2w\xf8]\xd3V\x93e_B\x97\x16\xac9u\xfe\x90v:O\xd8\xadL\x97\x16\xe1\xf3\xfa\xa4\xe2\xb1\xb6\xa3\x8fF\x0c[\x06\x84C\x8a\xa8+\xb2f\x11\x15\x88u#\xedV\xcc\x95\xbf7\xb2q\xff\x07\xa1\xd0\xcee\x97\xbe\xa2Z3UYB\x0d\x98YJ\x0e*\xb1\x16\xec\xd9\x88\xcd\xc2^c\xce\xca\x130\xc7\x97\xb9\xb48zf\xb4\xc0\xf6\x8fqz\xa6\xf2\xf2\xe3\xc6\x85H\xfb\xd7N\x9a\x90\x1a~\x8e\xae\x0b\xdd\xee\xed8yY~\xf6E\xba\xae\xd0\"\xed\x84\xbet\x02\xf1\xfdM\xa4\xeb\xc9\xd6\x8fE\xdf\xdb\xcf\xb2/\xe1\xcf\xf9\x1f{d\xa3fi'\xecV\xa6K\x8b\xf4yM\xec|\xb4\xe6\xf0[\xa5\\\x87\x14QWd\xcd\"*\x10\xebF\xda\xad\x98+\x7fJ[\x19\xac\xfd:J\xb5f\xaa\xb2\x84\x1a0\xc4\xd4\xa1\x11k\xc1\x9c\x8d\xdc,\xec5\xe6\xac<\x01s|\x99K\x8b\xa3gF\x0bl\xff\x18\xa7gxFs\xf3\xd9\xbfv\xd2\x84\xdc\xf0\xcf,R\xa9\xeb\x02\x80\x84\x09\x95'\xef\xd9K\x05N\x0e?|\x97\x17\xc8(\xfd\x95q\xde\x1d\x96&\x9c\x1c~\x00\xc8\x1cm\xef\xa1\x1f\xb5\x89*\xa5\x17\x08?\x00d\x80\x90g\xc3\xf3\xcb$[y\xad@\xf8\x01\x20\x13\xb4Ul\x99\x10\xd5I3\x10~\x00p(\x10~\x00p(\x10~\x00p(\x10~\x00p(\x10~\x00p(\x10~\x00p(\x10~\x00p(\x10~\x00p(\x10\xfeYA\xef\xe2I\xea\xffS\x8bm\x9e{\x04\xdfY\x00\xe2Bn\xf8Y\xba\xaeP\xa7W\xe7\xb8`f\xe9lSr\xbaEu\xa6K\xa3\xa2(y7E\xb5Z\x94fkI\xceAfMd\xeb\x1fK\xce\x16\x15\x97K+V\xa0\x15\xd7l@\x06\x91\x1a~\xa6\xae+\xe4\x1d\x0d\xa8\\\xf6^\x15\xcd.\x9b\x80?\xd7\x9a9\x9d\xc1Qfq2\x04\xfc\xfeVeHP\xa95\xa7#\xa6\xcc7\xb7\x95Q\x13c\xe3\x1fK\xcc\x16%ti\x91\xc4\x0a\xb4\xe2\x9a\x0d\xc8\x20R\xc3\xcf\xd6u\x8dk\x0f\xef\xed\xbc\x20\x989\x13\xb8\xd8\xe1_X\xcf,N\x92aQ\xf8o\xbb\x9a\x18\xa5{\\\x01F\xa9\xc8?F>PJ\x84\xd0\xa5E\xc0\x14h\x89g\x032\x89\xd4\xf0\xb3u]\x1a\xbe7\xe4?\xc9G\x0c'\xfceu\xcc\xe2$\x11\x86\xbf\xb1\x88\xa52\x0b\x1652JE\xfe\xb1D\xc2/ti\x110\x05Z\xe2\xd9\x80L\"7\xfc*\xb1\xba.\xcc\x0d/}AK\x02\xa1\xc2\xdc\xa6\xe2\xa2\xc1\xed\xee*|\x16RW\xe4*^\x89O\xaf\x20r(\x1f*+\\\xa9\xd7\xd0\xaf\xb4y\x95)\x1c\xb5q\xf5\x00\\?@1\xc2_?/\x84)V\xdf\x13\x02E\xf3\xb6y\xdfgH\xe3#\xdcV\xa2\xdc\xb6\xfc%\x1a~\xa21\xe4\xc2?\x9a]Zyot\x8e/\x1b6\x1d;\xfb\xe9\x83o#\xf3\x05\xb4\xb7\x09\x0b\"\xff\x98\x11~\xd24f\x0a\xa9^^\x84p\x90\xb5'\x08\xb3]Z&\x94\xfb\x8b\x1d~\xd3\xdc\x05\xcc@\xa4\x86\x9f\xad\xebR\xe9\x90/\xecP)\xeaC\xc3j\xbep\xf8\x87\x0b\x8b\x9bN\xfa\xab\xf4\xf0\xa37\x94\xc8G\x0f\xfa\x05?\xbf\x82?\xda[\xb1\x03\xf5\xb9\xf5l\x1b\xe1/\x8b\xe4\x19\x1f1\x04\xbdu%\x0a>\x85\xe0\xe0\xf7\xe9\xf8\xad\x7f\x88\x86\x9flL[p$\xfcC\xc6\xe1\xfd\xfd\xb3/l\xad^\xdb\xf3\x20:_\xec\x07$B\xff\x98\x11~\xd24fj)Nx\xbe\xc6;\xf3\x98=?\xa1\xf20\xa0\xdc_6\x17\xfc4s\x170\x03\x91\x19~\x8e\xae\x0b_\x09\xb0\xee\x0d\xa5@\x84\xbfd1>\xec\xaf\xd3\xc3\x1f(\xdaS\xac_\x88t\xed\xc0?\xdb\x15\xfcG\x9f;\xd4\x18\xb9\xbe\xae\x85\xbf\x1d\x1f\x98\xcf\x1b\xd5Pk_\xc6\x07\x09\xc1\xae<\xde\xa7\xef|\xa2\xe1'\x1a\xa3\xc2\x1f\x8c~\xe6p\xebU5\xf6\xf7\xcf\xd5\x9e\xd1\xff\xdb\xec\x8a\xfd\x10@\xe8\x1f3\xc2O\x9a\xc6\xccl\xdf\xf1<}\xe7\xa3U\x9b\xf57i\x96K\x8b\x80r\x7f\xb1\xc3o\x9a\xbb\x80\x19\x88\xcc\xf0st]\xf8\x94?#/\x0f\"\xfc\xc58\xce\xe12-\xfc\xa1\xc5{\xd0\x93K\xb5\xd7\xbf\xab\x18\x9f\xb4\x96Ti\xc5n\x9f;r\xe5\xadJ-\x98T\xd4S\x95>E;_\xd9sP\x8d\xa2\xa2\xad\\\xd56\xebR\xa2\xe7\xfc\\\xa2\xe1'\x1a\xa3\xc2\xaf\x9e\x0f\xe8a\xec\xa9\xbe\x82\x7f\xed>\xa2\xfd/\\\xb2\x02Y\x11\xfb\xc7\x8c\xf0\x93\xa613\xdb\x1fz\x96x<[\"\x17\xeeX.-\x02\xca\xfd\xc5\x0e\xbfi\xee\x02f\x20R\xc3\xcf\xd1u\xa1\x1b\xdeL|\xc8\x7f\xc3\xdd\x12\xec\xca\xbd\x1a\xac\xaf\x0a\xa8\xd1\xadk=X\xa6\xb8[\x86B\x17\xb6\x15\x06\xd0\xed\x82\xed\x17\xf0G}\xca\xf2\xa1\xc1\xc5n=\xbdM\xf3\"G\xfdj*[z\x97\xe6\xe3k\x94MJ}wo\xa3\xd2\x89\xc3\x9f\xdf\xec;\xd9\x18\xbd2o\xb2R\x89\x0d\xa9\x89v\x87_\x8b\xdfO5\x16\xf0\xe76\x0e\xa1\xd1\xc6\\\xad\x18\xdd\xcc\xd1O&z\xaak{\xde}\xf7\xa5\xea1\xed\x7f-J\xec}\x86\"\xff\x18i\x8b2Lc\xa4\x90\xea\xa3\xf2K\xe7G\xeeF.Z\xb2\\Z$\xa6\xf3\x8a\x10h\x91\x10\xe6.`\x06\"5\xfc\\]\x17\xe3\xb2u\xda\x09\x17*\xca\xf1\x02%\xbf\x1b\x9fe\x87[\xe6\xbb\x0a\xeb;\xe6\xb9\xaa\xfa\xd4\xb3\xee\x1dh\xbb\xfaS\x8dqIs]A\xd1\xfa\xc8'\x117\x95'#\xb3\x86\xb6\xbb\xf3\xaa\x86\xb5\xc9\xbe*\xb7{1\xde\xe7wV5\x17\xe7\x16U\xc5d?\xfa9?\x87\xc6\xc8\x89\xbev\xcf`\xb4\xb1mjA\xeex\xbe\xfaS?\x8e\xd8\xf3=\xed\xec\xfe\xec\xee\x9eM\xb5\x0d\xbb\xf5\xec\xfb\xf3v\xc44&\xf2\x8f\xd1\xb6\xa8\xa8i\x8c\x14R}P\x8a\xff\\\xbaY;\xe9g\xb9\xb4H\x0c\xe7\x15)\xd0\"!\xcc]\xc0\x0cDn\xf8g5AWl\xb2%\xb1\xdde\xfd8\xa4\xcb\xd5\x18{\xb44m\xff\xd8W\x15\x07\xbe\x0a\x87\xef]\xdf\xf5(\\\xa0w\x00\x10\xfe\xb8\xe9v\xc7\xc6M\x16-\xc5\x96\xaf\xf4\x16\xb1\xbe\xd47\xed\xef\xf2\xbe\x1d\xb1\xc6\x86+\xcf\x0bj\x02Y\x00\x84?>\x9a\x07\xd1R\xf6\x8d\xfe\xd9\xc4\x87\x91\x0f\xf9>\xc1\xf7\xfa\x00\xd9\x0e\x84?.\x82J\xd96\xe6\xd7k\xb2\x8b\xf0\xfe\x8a\x03\xfd\xef\xf5\x1f\xa8H\xea\xb8\x01\x98e@\xf8\xe3\xa39\xbf\xea\x86\xa8N6\xf0\xceS\xcbJ\x97=\x0d\x07\xfd\x8e\x00\xc2\x0f\x00\x0e\x05\xc2\x0f\x00\x0e\x05\xc2\x0f\x00\x0e\x05\xc2\x0f\x00\x0e\x05\xc2\x0f\x00\x0e\x05\xc2\x0f\x00\x0e\x05\xc2\x0f\x00\x0e\x05\xc2\x0f\x00\x0e\x05\xc2\x9f}L\xfb\x16\x7f\xc0\x19\xc8\x0d?K\xd7EMf\x08\x19b.\x84.\x94\xe5/\x1f\x12U\x9a>6\xba.\x11\xd30l\xcd\x08]\xd7\x9dR\xcf\x9a8K/V2\x9e>\x12%\x03]\xcf\x04R\xc3\xcf\xd4u\x91\x93\x99B\x86\x98\x0b\x0d\xb8\xd6\xbfQ\xefJ\xff3\xcamt]\"\xa6a\xd8J@\xd7\x15\xd5\x80\xa5\x81k\xfb-\x8f\x1b\xe2\x96\x9e\xaf\xb0\x89\xf74\xc6a6!5\xfcl]\x171\x999\xd2/\xe6\x0a\x15\xe2's2\xa2\xef\xdb\xa9v\x09\x1ca\x1a\x93\x1c~\x96\xae\x8b6w\xc9\x84\x90b\xa5_\xcc\xe5\xd6u\x9bMn\xebl)E\xa0\xeb2\xc5\\\xc4\xe3\xb8\x97\xedUw\xcd\xef\xa0\xfd\xb8\xbai\xd8\"}^h\x83\xe7G\xc1\xc8Y\x9bAB\xba\xae6\xbc\xa7\xdf\xab?M\xdc8\xec'\x16q\xaa\x12\x0f\xe7\xa9E\xf4\xa0\xb2\x9db\xa1\x9a\xa7q\xbb\xfd\xf7\xa8>l^\xa5\x16\x86\xd7\x95\xd3\xb3\x11\xa5\x16\x16D\x0e\xec\x89!!p\x84iLv\xf8Q\xac\xae\x8b6w\xc9\x84\x90b\xa5_\xccU\xb2^\xfbU\x9f\xde=\xbf@\xd7e\x8a\xb9\xc8\xf0\xf7\xabA\x09\xa2\xc3\xcf!\xd2\xb0E\xfa\xbc\xd0\x86\xf2\xd8\xb6\x12\xd2u}\xeeQ\xf7\xff\x8f\\\xd2\x8a\x8d\xf0\x13\x8b\xf8|Y\xcd\xf3\xa7?\xb2\x0e*\xdb)v\xde|\xc8\x98\xd9\x87{\x9e\xd3x\xeah95\x1bYj\xc1\x08\xbf9$\x04\x8e0\x8dI\x0d?S\xd7e1w\xc9\x84Pc\xa4_\xcc\xf5\x84~\xe9\x20\"\x03M\x13\"]\x17a\xdf\x20\xc2\x7f\x11]+E\xe8\xe5\xe7\xa2\xa5\x9aa\x8b\xf4y\xa1\x0d\x1bb\xdbJL\xd7\xf5\xf4atq\x91>\xa8F\xf8\xc9E\xdc;\xbdk\x8dg\xc9\xebt\x03<\xa7\x98\xf1\x1ea\xf6\xe1\xbag\x04E+\x98\xb3\x91\xa5\x16\x8c\xf0\xb3\x84$\xce0\x8d\xc9\x0c?[\xd7E\x9b\xbb\xa4B\x86?\xedb.\xafv\x20pSI\xeb\xd5~\x91\xae\xcb\x1a\xfe\xa3\xd1\xf0\x97G\xc3o\x18\xb6H\x9f\x17\xf3\x02}b\xba\xaew*C\xfb#\x0e!C\x03F,\xe2:\xbe\x1b\xe9^\xff\x82ST\x03l\xa7\xd8%b\xcfo\xf4\xe1k\x8f6\xabvi\xcf\x9c\x8d,\xb5\x20\x08\xbf\x13Lc2\xc3\xcf\xd1uQ\xe6.\xa9\x90\xe1O\xbb\x98+T\x88\xdfH\xea\x0a\xd3yiC\xa8\xeb\"^\xe9\x15\x87\xd5\xb7\xe3\x8d1\xe17\x0c[\xa4\xcf\x8b\x19\xfe\xc4t]\xa1\xcaw\x1e\xd5\x8f\xfaM\x0d\x18\xb1\x886\xed\xe4\x1dm\xa1\x8fV\xd8N\xb1\xd0\xb2-x\x10\x0f\x1d\xa2\xfa\xb0\xb1F=D\x9fXPN\xcfF\x94Z\x10\x84\xdf\x09\xa61\xa9\xe1g\xeb\xba(s\x97D()V\xfa\xc5\\\xa8\xcfU\x7f\xb2\xde\xd5gWe\xba\x08t]\x94wks\xe5\xeb\xafm\xf4\x94\xbe\xf5O\xff\xf4\xe8\x89P\x7f\xe9'\xa1\xe7\xb6|\x8eH\xc3\x96\xe1\xf3\x0a_\xd3.\xd0\xc7\x9c\xf5'\xa6\xebz\xf9\xf1\xe8\xd5\xbc\xa8\x06\x8cX\x84\x1a\xfe\x8a\xb6\xf3\xea\xe4{t\x0bL\xa7\x18\xba\xb4`\xcd\xa9\xf3\x87\xb4\xd3y\xb3\x0f\x9fT<\xd6v\xf4Q\xbcBd\xbbd\xa9I\xe8\x83\x91\x91\xf2\xfd##A\xae\x8a\xcc\x11\xa61\xa9\xe1\xe7\xe8\xbaHs\x97D()V\xfa\xc5\\\x08]X\x9aW\x96\xd6\xdb\x18E\xba.\xca\xbb5\xb1e\xc1#O\xbd\xa2N.\xf1x\xfa\x1f\xf1T\xf4k\xa7\xd6\xa4a+\xea\xf3\xfa\x888\xf9'IL\xd75a\xc8\xbe\xa2\x1a0d.\x02\xfd|s[M\xe9\xb2-\x96\xec\xb3\x9db\xf8s\xfe\xc7\x1e\xd9\xf86\xfe\xbb\xd1\x07\xb5p\xe7\xa35\x87\xdf*\xd5*\x18\xedR\xa5\x06\xd7#\x17\x05NsUd\x8e0\x8d\xc9\x0d\xff,!\x83b\xaei1m]W:\x09\x95\xc7$\x1b\xc8,\x10~\x06\x99\x14sM\x87\x19\xfd]\xde\xfeJ\xe9\x17t\x01{\x20\xfcV\x9c!\xe6\x92L\xdb{\xe8GN\xb8[~v\x01\xe1\xb7\xe0\x101\x97\\B\x9e\x0d\xcf/\xcb\xea\xfbef%\x10~+N\x11sI\xa5\xadb\xcb\x84\xa8\x0e\x20\x1b\x08?\x008\x14\x08?\x008\x14\x08?\x008\x14\x08?\x008\x14\x08?\x008\x14\x08?\x008\x14\x08?\x008\x14\x08?\x008\x14\x08\xff\xcc\xbe#\x1e\x00\xd2\x86\xdc\xf0\xb3u]\xe1\xab\xbd\xed'3vW\x1d\xdfn\xf5vi\xe4\x9b\x9f\xa5o\xcb\xf57\xf1\x97FH\xb1b\xfdXl\xf8\x8d\xd9\x1a\xab\xf8\x15\xe2.\xdd\xaf\x0e]\xc5\x84M\x05\x0bl\xd9\x96\x90\xf4\xce\x16\xd7\x96'\xb6\x85x5g\x0eR\xc3\xcf\xd6u\x85}\x1d\xa3\xb7/\xb7_\x16\xcd\x9d&\xf8v\xab\xd7=##\xa7<'FF<\xaf'\xefo\x12\xba\xa9\x18\x15\xf8K#\xa4X\xb1~,6\xfc\xc6l\x8dU\xfc\x0af)\xd9uF\xdd\xcf\xf1\xf0}`S\xc1\x0a[\xb6%$-\xb3E\xd7-\xae-Ol\x0b\xd1j\x0a_\x0f\x12\x91\x1a~\xb6\xae\xeb\xfdv\xac\xeb\xb8\xd9\x9e\x99o\xd3\xd8\xd8\xadN\x94\xe2\xe7?\xab\xaf\xde\x8a\x13\xd1':&\x8e\xd0M\xc5\xac\xc0Y\x1a!\xc5b\xfa\xb1\xd8p\xbb.4\x8fM\xb2]\x17\"\\7*\xfcq\x90\x8e\x14\xf3\xb1\x9dmC\x02\xe1O`[\xc41f\xf2\x90\x1b~\x95X]\xd7I\xfd\xd1V\xbd>\xc1\x9ci\xc1\xcen\x851^\xbd\xe5\x87M\xab\x93)\x83\"\x89\x8a\xa3L\x13\x16\"\xdcT\xcf{JO\x1cxL3@\xb1+P\x18\xb6(\xa2.!\xc5\xa2\xfdX\"\xad\x16S=e\x1a\xab8\xaa,\xb6\xd2\xca,%\xbbN4\x16\xdc\xb5\xac\xb4fg\xf4\xf1\xba\xd1\xe1#*\xac\x89\xcc\xb7\x19\xffG\xa0\xd5\"\x07\x95\xad\xd5b8\xba(\xff\x98\xd9\x1d\xaa\x05\xce\xd2\xa2P\x9bE\xb0\xe5\xc9ma\xae&\xb5-\x8c\xf1\xe5m\xee\x0c!9\xfc,]\xd7\x85N\xed\x0c\xa0\xe3\xa4\xfd\xac\xe9\xc1\xcen\x851\xc3\xefY\xd3\xff\xce\x12\xedm\xdb\x94A\x91\x18\xe2(\xc2\x84E\xb8\xa9\xb0\x17\xaa\xe6\xb5\xb6\x9a\x8aO8\x15(\x0c[\x14Q\x97\x94b\x91~,\xa1V\x8b\xad\x9e2\x8cUs\xf8\xcc\x0a\xf8\xc1\x99##\x1b=\xf8\x11\xfdB\xad\x961\xa8\x1c\xad\x16\xd3\xd1E\xfa\xc7\xcc\xee\x90-p\x96f@\xad\x9bh\xcb\x93\xdb\xc2XMr[\x98\xe3\xcb\xdb\xdc\x19Br\xf8Y\xba\xae`\x87o2\x14\xe8\xf5v\x8b\xe6M\x03\x02\xbb\x15\x19\xfe%_\xab\x1b\x1f[\x9d(\x8f\x95\x01)\xaf\"\x9f\x06M\x1c>\xd6\xa8\xeb}\xaff#\xb7\x02\x01a\x8b\"\xeb\xb2\x0e\xfb\x85Z-\xbez*\xf2\xf4j\xb6*\x8b\xa8`QZEK\xe9\xaeGJC\xfd\xf8\xad|]\xe4i\x9f\xe4a\x7f\xa4B\x9b\xba\x1b\x0e\xef\xd7D{B\xad\x165\xa8,\xad\x16\xdb\xd1E\xf8\xc7\xc8\xee\x98-\xf0%^\x06\xc4v\x13ly\xcba\xbf9:\xd1mA\x8d\xaf\xa3\x0f\xfbQ\x8c\xae\x0bM\xf9\xd4\x83\x80!_\xafh\xc64\x20\xb0[\x91\xe1\xc7o\x0dZ\x06)\x8f\x95\x01)\xaf\xe2\x84_\xfb\x1cQ3@\x89\xc3o\xda\xa2D\xe1\x17j\xb5\xf8\xea\xa9\xc8\xeb\x94\xad\xca\"*X\x94V\xb6\xe1G_\x9fz\xfa\xf1E\x1e}4X\xe1W\x09\xed\xd2R$\xd6jQ\x83\xca\xd0j\xb1\x1d]\x94\x7f\x8c\xe8\x8e\xd1\x82\x8d\xc4\xcb\x80\xd8n\x82-\xcf\x0d\x7ft[P\xe3\xeb\xd8\xf03u]\xda\x1f\xa6\xc2\xa8S\xbe\xabOh\xb7\"\xc3od\x90\xf2X\x19\x90\xf2*N\xf8\xb5W\x85f\x80\x12\x87\x9f]\x97\x15~\xa1V\x8b\xaf\x9e\x8a\xbeN\x99\xaa,\xb2\x02-\xb6\xb0\x0d\xff\xb5%5\x87\xdf\x1e\xd9b\x17\xfe\xd03\xa5\xdac\xb7\xc5Z-\xde\xa0Fa;\xbaH\xff\x18\xd9\x1d\xa3\x05\x1b\x89\x97\x81e\xbb\xd9lyn\xf8\x8dmA\x8e\xafS\xc3\xcf\xd6u\xa9/\x06%\xd4j\xc5\x0c\xaa%\xaflG\x17\xa9\x20\"\xbbc\xb4`#\xf12\x20\xb6\x9b`\xcbs\xc3\x1f\xdd\x16\xd4\xf827w\x86\x90\x19~\x8e\xae\xeb\x86wR=5:>(\x989\x0d\x08\xedV\xcc\xf0S\x1e+\x03R^e\x9a\xb0\x087\x95z\xee\x88/p<\xbe\x85[\x81\x80\xb0E\x91uY\xe1\x17j\xb5\xf8\xea\xa9\xe8Y8S\x95ET\xe0\x85\x9f\xeaz\xa4\xb4\x06\xf7\x20\xbc\x8e\x1f\xfe{\x1b*\xf0~\xf7\x8a~aB\xbb\xad@\xa0\xd52\x07\x95\xa7\xd5b8\xba\xc2\xa4\x7f\xcc\xec\x0e\xed*#\x97v\xba\xc2c\x1d\x7fs\xdd\x84[\x9e\xdc\x16\xc4j\xea\x13\xda\xb6\xa0\xc6\x97\xb9\xb93\x84\xdc\xf0\xcf,$\xdb\xad\xca\xdb\x100#y;\xf6\x83\x10G\xe0\xe4\xf0K\xfe./\x84\x7ff\x12~k\x91\x84\xad?\x13qr\xf8%\x03\xe1\x9f\x99\xdc\xad\x8c\xbdU\xdb\x19@\xf8%\xa1_8\x02\x80\x99\x03\x84_\x12\xda\x85\xa3\x99\xf1\xf1.\x00h@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8e\xdf\xe2\x0f\x003\x04\xb9\xe1't]\xa4\xa3+\xd0\xdb\xd1\x97\x81\xe7\xf8\xe8\xf0u]\x16R&b\x8a\xcb\x00\x95\x02L!\x15\xd1\xf5$\x84_@\x96\"5\xfc\x84\xae\x8btt\x05\xda\xfd\xb7\xfd\xed\x99J?_\xd7\x85\x84B\xaa\xe4\x88\xcb\x00\xc5$A\xd7\x93!\xa4\"\xba\x9e\x84\xf0\x0b\xc8R\xa4\x86\x9f\xd0u\x11\x8e\xae\xf0q\xfc\xe8\xce\x0b\xc73\xb3\x0f\xb2\xd1u\xa1x\x84TI\x91\xec\x17\xfc\x12u=\x19O\xbd2\xba\x9e\x9c\xf0\x0b\xc8J\xa4\x86\x9f\xd0u\x11\x8e\xae\x1b\xed\xf8\x15\x18l\xcf\x8c\xa7\xd7F\xd7\x85\xd2\xf6\xac\xd5d\xc3\x9fhwb\x9fO\x9b\x9c\xf0\x0b\xc8J\xe4\x86_%\xa2\xeb\"\x1c]\x03\xfa\xfb\x80/\x03O\xf0\xb4\xd7u1\x85T\x94\x0c\x8am\xee\xa2\x8dU&\x13\xbb*K\x97<\x83\xdf`L\x03\x94Y\x97\x14<\xecS\xbaE\xb5\x01`\xe6\x207\xfc\x1c]\x17B\x83\x19x\x8cO\"lSr8\xc1\xeeV\x8c/#\x07\xf4\xf0\xf3\xeb\x02\xc0LBj\xf89\xba.\xfc\x87a\xfb93M\xc0\x9f\xdb\xcc\xfeKl\xf8\xb9u\x07G\x99\xc5\x00\x90\x19\xa4\x86\x9f\xad\xebR\xe3\xd2=\xd3\xc3\x8f\x90+\xee\xf0s\xeb.\xacg\x16\x03@f\x90\x1a~\xb6\xae\x0b\x0dz\x07\xdb\x9d\x10\xfe\xb2:f1\x00d\x06\xb9\xe1G,]\x17\x0a\x05\xa3\xe2\x0e\xa9t+\x8a\xd2\x8c\x9a\xd5\x9f\xdd(XW\xe4*^yU-\xbd:WQ\xf6\xdc\\?/o9\xfd\xc1\x9dk{c\x91{\xe5MF+\x8c\xf0G\xeb\xfa\xd4\xc6\x9b\xf4E\xe0IL\x99V\xa3sq\xfe\xfc\x1d\xb4f\x03\x00$#9\xfc,]\x17&\x13\xe1\x0f\xfa\x0b\xf6L\xa2\xc9=n\x7fPM\xe9\x93\x83\xdd+s\x86\xf1\xb3\x85\x8f\x17\xcf/(\xde\xb1\xde\x0c\xb5\x86K)\xeb\xea*\xcb\x1b\xb7\xb6\xc2\x0c\x7f\xb4n\xf0B\xf16u\x11\xcd\x05\xfe`\xf0\x82\x7f~\x95\xdf\xef\xd7\xael6\xe6l\xf7\xb5\x16\x96\xc9\x7f^1\x00\x98H\x0e?K\xd7\x85\xc9D\xf8\xd5\x0c\xe2\x93\xf0\xfaF\xf5G\xb0\x1b\xbf#\x95=\xa1\x15\x97)Kc\xf4W\xc8U\x82\xef\xe4\x99\xbf\xd8\xda\x063\xfcf\xddf\xbc\xa7_\xdf\xa8\x15\x1b\x87\xfd>\xa5C\xfd9\xact!\x00\xc8\x1c\xb2\xc3\x8fbu]\x98\xcc\x84\x7f0/\x88\x82y\x9aId\xaau\xf9\xbc\x82\xc81y\x99\x8b\xf1(aW\x13\xfe\xe9U\xa6,\xe5\xcc\xf0\x9bu\x03\xca8\x0a\x15\x0ch\xc5F\xf8\xeb\xe7i\xf7\x03\x167\"\x00\xc8\x1cR\xc3\xcf\xd6ua2\x13\xfe\x90\xfb$\xeau\xe3\xce\x0c\x17\x167\x9d\xf4WE\xc2_\xc6\xa8\xab_\xc4\xf3+\xd6\x8f\xeb\xf8\x17\xfc\xf4\xba+v\xa0>\xb7~\xf9\xc0\x08\x7fY\xe4\xfc\xff\x09\x04\x00\x99Cf\xf89\xba.Lf\xc2\x8f\xb6?\x81\x9e\xd8\x8e'J\x16\xe3\xa3\xfc\xbaH\xf8YW\xe5];\xf0\xcfv\xc5z\x95\x8e\x19~\xa2\xae\xcf\x1dj\x8c\xec\xe1\xb5v\xb1\x9cd\xfd\xbcQ\x0d\xebQ\x04\x00\xc8Df\xf89\xba.L\x86\xc2?\xe4\x0a\xb8\x86\xf0D1\xcee\xb8\xcc.\xfc\xc5\xf8<\xbe\xa4\xcaZ\xce\x0c?Q7\xe4\xf6\xb9#kY\xa5\x16L\xe2:}z\xc5=\x07\xad\x8d\x01\x80D\xa4\x86\x9f\xa3\xeb\x0a\x05\x02\x1d\x83\x81I\xd1\xdci\x20\\\xb4\xbcH;\x05iV\xeaZ\x0f\x96)\xee\x96\xa1\xd0\x90vU\xfe\xb6\xb5\xaaKY>4\xb8\xd8\x1dS\xce\xbe\xdaO\xd4m\x9a\x179\xeaG\xcd\xae\x96\xde\xa5\xf9\xb8z\x93R\xdf\xdd\xdb\xa8tZ\x1b\x03\x00\x89H\x0d?G\xd7u\xd9\xab\x91\x89\x8f\xbd[\\-\xda\xefp\xcb|Wa}\xc7Q\x15\xc0\xd1H\x0d?[\xd7E\x94Jgi\xa1\xb71/\xce\x05\xfb\xf2g\x97Y`X\x81\x87\xa1\x03vH\x0d?[\xd7E\x94\xcafJiE\xe18\xb3?\xeb\xae\x9e\x0d+C\xa2*\x80\xa3\x91\x1a~\xb6\xae\x8b(\x95\xcdMev\x1d\xc9'\x04\x84\x1f\xb0Gn\xf8\x11K\xd7E\x94J%\xe4V4vh\xffk-\xcb+kU\x7f_\x9d\xab({n\xae\x9f\x97\xb7\x9cz\xa0h0OQr\x8e3Z1\xb9]\xe7\xce-\\\x11\xf3\x16\xd6Q\xe8\xc5\xbf\x02\x05\xfa\xd2\x94\x02\xb2\x06\xb9\xb4`]\x91\xabx\xe5U\xb5t\x9b\x92\xeb\xdd1?o\xb9Vsj\xbd\xbbx\xc7\x0ew>~\xc4a\xe7\xe2\xfc\xf9;\xacG*c\xfb6\xd5\xae\xdd\xb7\xe9\x81\xa5\x18\x0dB\xf8\x01[$\x87\x9f\xad\xeb2J\xe5\xf2\xbe\xbfKi\xf6\xfb\xb5\x885\xba\xf6\xf8\xf6\xb8\xd6\xe3g\x0b\x1f/\x9e_P\xbcc\xbdB\xc7\xf8\xb2\xdf\xefjf6\x13a0\xbf\xace\xa0Yi\xb1\x96?\xa1,\xc7\xbfB\x1d\xad:\x1d\xe4\x9b\x0a\xb94\x9f\xf2\xe4`\xf7\xca\x9ca\x84n\x1c\x9f\xab\x146\xb7\x14\xd4\xe1\x1a%E\xad\xcd\xae\xbc\xf6\xe5j\xc3\x8d9\xdb}\xad\x85e\xf4\xbb\xe4\xc7\x7f\xf6\xd2\xb9+g\xd7V\xff\x8e*\x0dM\x0e.t\xcb\x1fR`6!9\xfc\x1c]W\xb4T6\xc6a\x7f\x9fve\\\xff\x89\xca\x94\xa5\xc1\xc8\xc9\x08E\x9e]\xf8C\xc5\xf8P!\xd4\x1d#\x1d\xbb}Pw\x11M\xde\xd6\x99\xb4\xfc\xddXZ\xb0\x1b/\xb2L\xfbd\xde\xe5V\xdfz\xd6\x17\xaaS]\x8az,\xd0\xaa\x8c\xab\x93>\xa5\x03\xe1\xa3\xf9.j\xfe3\x0d8\xf6gV\xd3{\xfe'\xd4c\x8c,>\xa5\x01R\x81\xec\xf0#\x8e\xae+R*\x19#\xfc\x8d%\xda\xaf\x92F\xfc\xb3\xcc\xc5\xbe\xfc`\x1b~\x9f\xf2\xbe\xcd_\xd5\xf7\x00%\x8a\xc5Kf.m\xaau\xf9\xbc\x02\xa5\x0cO\xbapG\x9a]\xea\x8f&7\xc2\xfd\xc4\xe3T?/\x84)n\xa4\xe6\xff\xb2a\xd3\xb1\xb3\x9f>\xf8\x96*D\x81>o\x09\xec\xf9\x01[\xa4\x86\x9f\xad\xeb\xa2K\xa5b\x84\x7f\xf1J\xed\xd7\x8a\x85\xf8gY\x19\xbb\xb6m\xf8[\x14\x81t\xc4\xef\xd3\xb1~\xfef,m\xb8\xb0\xb8\xe9\xa4\xbfJ\x0f?^\x94\x16\xfe\x16e\x0a\x1f\x92\xe0=\x7fY\xe4\xdd\xc3r\xd7\xde\xfd\xb3/l\xad^\xdb\x13s\xce\xefW\x86\xadE\x00@\x203\xfcl]\x17U*\x19s\xcf?O\xfb5O\xdf\xf3\xd7\xb1k\xdb\x86\x7f@\x19\xb5\xf9\xab\x0d\xc6\xd2J\x16\xe3=u\x9d%\xfc\x81\x9c\x15\x81\xab\xf3\x17\xe3\xb1Y?oT\x83>\xb3\xb8\xf5\xaa\x1a\xfb\xfb\xe7j\xcf\x20\x0bp\xb5\x1f\xb0Gf\xf89\xba.\xa2T6F\xf8}\xda\x89t\x97\xfe_q\xf8o7\xc7$=XT\x85\xdf\xcf\xb6o\xb7\xfe!z\xce\xcf\xc3XZ1\x9e\x08\x97Y\xc2?\xaa\x14*J\x95vf\xd0\xa7hWH\xf6\x1c\xa4\xe6\xef\xa9\xbe\x82\x7f\xed>\x82,@\xf8\x01{\xa4\x86\x9f\xad\xeb\"J\xe5\xa2_\xed\x1f\xd2\x0e8\xd6\xe74\xf9\x9ar\xf0\xd5\xfe!\xff\xfc*\xbf\xdf\x1aX\xb5\xd8\xefj\xf4\xfb\xf5N\xaeT\xf2cz;\xf8\xbd\x12\xafo\xbb\xd2n-_\xa9\xac\xb0\x16\x99\x90KkV\xeaZ\x0f\x96)\xee\x96\xa1\x80?\xb7q\x08\x8d6\xe6\xfa\x03h\xd45\xe0\xf3\x07\xf4\x83\xa2&\xa5\xbe\xbb\xb7Q\xe9\xa4\x9a\xe8\xa9\xae\xedy\xf7\xdd\x97\xaa\xc7\xacm_V.X\x8b\x00\x80@j\xf8\xd9\xba.\xb2T&\x91\xcf\xf9\xe7jw\x16\x86\xb5\xcf\xf9\xd5\xfe\\\xcd\xd1J\xad\x81\x1d\xd6\x8b\x15\xed3{\xd4\x9e\xcf8\x9f\xbeYW\\\xb0\xf0dLq\xe4s~6\xe4\xd2\xc2-\xf3]\x85\xf5\x1d\xf3\\U\xdb\xd4\xa2\xdc\xf1|\xf5\xe76t\xc1\x85+\xe4V\xe1\x93~\xd4W\xe5v/\xb6\xdc\xb1\x7fvw\xcf\xa6\xda\x86\xdd1\xd9G\x93s\xeb\xaeN\xca?\x95\x02f\x0dr\xc3\x9f5\xf4*\x92\x8eS&\xf3\xb7M\x86B\xc1\xe1\xba$.\xdd\xf7\x96\xc4\\\x1c\x04\x00\x13\x08\x7f\x12\x84;\xdcO\x8a\xea\xa4\x88^\xb7\xbe\xef\x0e\xbb\x93\xf9\xd4~\xf2j\x06\xee\x99\x06f\x0b\x10\xfe$\x08\xb8w\xc8:I\x19\xcd\xd1\x8e\xf7\xd1x\x8e\xfdm\x04\x00\x900\x10\xfe\x99M\xb81\xef\xc9\xae\xc1\xae'\xf3d\x1dj\x00\xce\x01\xc2?\xd3\xf1-/r\x15-O\xe6\xa0\x1f\x00l\x81\xf0\x03\x80C\x81\xf0g%\xffh\"\xaa\x0a8\x16\x08\x7fV\x02\xe1\x07\xc4@\xf8\xb3\x12\x08?\x20\x06\xc2\x9f\x95@\xf8\x011\x10\xfe\xac\x04\xc2\x0f\x88\x81\xf0g%\x10~@\x0c\x84?+\x81\xf0\x03b\x20\xfcYI$\xf8\xff\xf5?\xfd\x03\x15\xfe\xa9\xc5\xbd\x08\x00\"\xc8\x0d?[\xd7\xa52\xee\x85[\xd8\x12\xe4J\xc3\xbb\xfc?\xea\xd9\xff\x9b\xea\xbf\xb2\xec\xf9[r\xe8'\x81\x00NFj\xf8\xd9\xba.\x95`\xfb\x05\xfa\x09\x15\x80\x90wk\xcf\xf1\xff\xa8g\xbf\xf6\xbf\xc6\x1c\xf6\xfb\xe6\xb6\xb2\xe7\x00\x9c\x87\xd4\xf0\xb3u]*\xbe\x81\x00\x84?Qb\x9e\xd8i\x12\xfe\xc7\x9f\xfd\xe3?\xfe\x7f\xb5\x7f\xc58\xe7\xdf\xc3y41\xe0<\xa4\x86\x9f\xa3\xebB\xe3\x1dA\x08\x7f\x0a\xb9Y\xf6\xc7\x7f\xfc\xef\xff8\xe7\xff\xf8?\x7f\x16\x1b\xfe`\x11\xfd\xe4o\xc0\xb9\xc8\x0d?b\xea\xba\x82\xed7Q\x16\x85\x9f#\xfcB\xf6\xe6\xae\xdf\xad\xad}\xb5\xa1a\xec\xd8\xea\xdd\xf7\x11\xba\xffBC\xed\xa6}\xb7\xd4\xe2#\xd5\xb5g^jX\xbd\xef3j\x12\xdd\xaf\xad\xae\xae\xd6\x0e\xfb\xd5\xd2\xb3\xc7\xb6\xd6\xee\xfb-\xfe\xcf\xfd\x17\xd76\xbc\xfa\xea\xda\x7f\xa3TU\xcd\xc9\xabZ8\xe7\xcf\x7f\xa6\x85\xff\xb3\x17\xd6\xd66\xe85\xd4]\x7f\x9e\xacg\x11\x003\x1c\xc9\xe1g\xea\xba|\x03(\x9b\xc2\xcf\x13~\x09\xcc]c\xab\xab\x8f\xed\xae^\xdb\xb3\xf6\x8cz>_\xfd\xd2\xd8\xb9}\xd5\x1f#t\xeb\\m\xf5\xa6\x9e\x9eM\xb5\xb7\xc8I\xb5|l\xac\xb6\x07\xcf\x86K\x1bzzV\xbf\xa0N\x7f\xbb\xb5\xe1LOm\xed\x99\xff\xf5\xe0\xef\x7f\x7f\xe3\x7f\xfe\xfe\xf7\x0f\xfd\xfb\x7f\xc0\xe1\x1f\xab}\xb6\xe7JOu\xe4\xd9\xde\x17\xe0\xa1\xbe\x80\x8e\xe4\xf0\xb3t]7\xf0\xbbA\x16\x85\x1fq\x85_\xf6\xe6\xae\x86\x17\xd1\x95\xeaw\xd1K/\xe1\xc7\xf0\xab\xbb\xff\x07?\xc6\x81F\xb5\x9b\xf0\xa1\xc0\xa6g\xe9I\xfc\xbf\x9e\xc8\xef\xd5\xea>\xfd\xc5\x06u\xea\\\xb5\xfa\xbep\xa6\xfa\xe3\x929s\xe6\x84\xeb\xe7\xcc\xf9\xce\x9f\xe3\xf0\x7f\xbbi\xdf\xb7\xea\x1b\x03n\x12\x13P\xde@\x00\x80\xe4\x87\x1f\xc5\xe8\xba\x82\xed7\xc2\xe1\xf5\xe6\xae\x9b\x00\x00\x0d\xefIDATp\xa03\x9cE\x0f\x9a\xe5\x09\xbft8\xe6\xae\x86s\xe8\xe3\xea\xfb\xe8\xd5\x17\xd5\xe9\xfbg\xf6mZ]\xfdc\\\\\xfb*\xfeyF\xfd\x0b9\x89\x88\xf0\xab\xef\x16\xa8\xa7V\xfd\xf1\xeaj\xf5\xc7o\xaa\xdf\x0dl\xffc5\xfc\xff\xcb\xbf\xfb\xf3\xff\x86\x0f\xfb\xafT\x7fJ.&`q\xfd\x01\x8eEj\xf8\x99\xba\xae\xdb\xde(\xd9s\x19\x9a'\xfc\x8a\xc06w5\\A\x1f\xab\x11\xc6\xe1\xff\xb8a\xd3\xab\xef\x8e\xed\xd6\xc3\xafe|\x0c\xef\xd4\x89ID\x84\x1f\xff\xd6\xc2\x7f\xe6\xcf\xd4\xb7\x85+\xd5\xb7\xc2\xc1?W\xc3\xffo\xfe\xdf\x7f\xd0.\xf8\x9d\xa9\xa6<~\xc3\xf08\x7f@Gf\xf89\xba\xae\xa9I\x95\xf1\x8e\xc9,z\xc6<\xcf\xf9c\x0b\x11\xfe\xad\xcf\xe2\x9d\xfb\x0bz\xf8\x8f\xe1\x9fg\xb5=\xbf9\x89X\xe1\xff\xb2z\xdf\x97\xb7\xb6\xee~\x80\xd0\x7f\xc1\xe1\xff\xcf?\xd3>\xea\xbb\x12y\xb3\x88\xd0\xecJ\xfc!\xe0@V\"3\xfc\x1c]\x97F\x96\x9d\xf3\xb3\xc3oo\xee\"\xc2\xbf\x09\x9f\xed?\xf8\xb1\x1e\xfe\xb5\xda\x89\xfenz\x12\xb1\xc2\x7f\xabzmu\xf5n|U\x1f\x87\xff\x0f\xff\x93\x1e\xfe\xfb\x0d\xbb\xf1\xae\xff\x98\xf6\xce\x81\xc2%6\x02!\xc0QH\x0d?[\xd7\xa5\x12\x0e\x8cw\x04b\xcc\xf6\xb3\x14\x8e\xf0\x0b\x09\xcc]\xb7V\x9f\xb9\x7f\xae\xf6\xd6\xfd\x17\xd5\xf4\xf6T\xbfp\xa6\xe7\xc7\xd5k{\xc6\xd4lW?{\xee\xec\xd6\xd5\xbfA\xe4\xe4\xb7ccc\xb5G\xc6\xc6\xee\xa3/\xf1\xef\x07\x9f\x1e\xa9\x1d\xfb\x12\xdd\xaa\xbdre\xec\xb7\xf8\xe6\x1f\x1c\xfe\xff\xed?\xfc\x8d~\x93\xcfX\xed\xd6\xb3W\x8eU\x9f\xd5\x16\xd3\x92\xacP\x14\xc8:\xa4\x86\x9f\xa3\xebR\xcb\xf1)\xffq\xfe|\xb3\x0a\x8e\xf0\x0b\xd9\x9b\xbb\x1e\xa8;\xeds\xab\xabk\xcfUW\xbf\x80\x1e\x9c\xd9Z\xdb\xf0\xe2\xd9\xad\xb5\xbb\xf1\xb1\xfeK\xab\x1b^\xfc\x12\xd71'?\xae\xd69\x8b\x8e\xa8?k?\xc5\x1f\xfb\x1fQS\x8e\xcbjw\xdf\xd2\xc2\xff\xbf\xff\xe7\xff\xeb\xbf\xeb7\xf9\xfc\xe6\x85\x86\xd5\xcf\xea\xdf\x04\xf0\xe7\xed\xe0v\x01p\x18r\xc3\x0f$N\xf4\xe8\x9e\x9ed\xf1\xaf\xb5G\xfe\xf5w\xbf\xbb\xff\xf1\x0b\xab\xefk\xe1\xffo\x7f\x85o\xee\xa7\xaat\xb9\x1a\xe1\x16\x1f\x20\x02\x84\x7f\xa6\x13\x7f\xf8\xdf]\xad\xdf\xee\xff`\xed\x15=\xfc?\xfb\x9b\xff\xdb\xf2\x95\xde\"\xf8R\x1f`\x00\xe1\x9f\xe9\xc4\x1f\xfe[\x91\xcb\xfa\xb7\xaa?\xfd\xb7\xf8j\xff\x7f\xd0\xce\x02lg\x01\x9c\x0c\x84\x7ff\xf3[\xedz\x9eu\x92\xcd\x83\x97j\x8f\x9c\x1b;w\xa4\xf6\xa5\x07\x10~@\x0c\x84\x7ff\xa3]\xcf\xfb\xcc:\xc9\xe1\xc1\xbb\xfb\x1aj\x1b\xf6\xbd\xfb\x00E\x0e\xfb\xe11^\x80\x0d\x10\xfe\xac\x04\xc2\x0f\x88\x81\xf0g%\x10~@\x0c\x84?\x0b\x09\xb5\xd6\xe1;\xfc\x9a.\xc0\xc7z\x80\x0d\x10\xfe\xec#\xbc8\xfa\x95\xde\x93\x90~\x80\x0f\x84?\xfb\x08=t\xf0\xf7\xbf\xff\x9f\xea\x06z\xe8\x09\xf8\x0e\x0f\xc0\x07\xc2\x9f}\x04\x15\xa5\xaa\xea\xa1\xc2\xaa\x85s\x1a\xb3\xe5\xfb\x12@:\x80\xf0g\x1f!\x7f\xb1\xdb=\xdf\xedv/\x1d\x86=?\xc0\x07\xc2\x9f\x85\x84\x02\xdaS\xc2\x86\xea\x0a\x95'Du\x01\xe7\x02\xe1\xcfF\xc2\xe1\x90\xfao\xfe|\xef@\xf6<\x1d\x09H9r\xc3\xcf\xd4u\x85:\xb4\x87xud\xd3\x95\xe9\x81BC?6\xb5\xad0o\x05\xf5\x90\xa2#\x91\xa7nO\x8f\xe8\"\x1a\x15E\xc9\xbb\xc9\xa8pU\xe9c\x94\x02@\x14\xa9\xe1g\xeb\xba\x82\xde\xf7\x03*\xf4\xa3lg9\xbe|\xe3\x11\xb9K\x0b\xbd\x8dy\xd4\xb9\xf7o\xc7\x04\xdf\xd0\x89\x8b\xe8\"\x02~\x7f+\xf3i\xdc\xc3\x0a\xfd\x8c@\x00\xa0\x91\x1a~\xb6\xae+\x98EO\xee40v\xf5SJ+\x0a[\xaf\xbb\xa5\"\xfc\xe6\"\xd4\x98\x0f1\xfe\xce,\x9d\x932b\xdb\x06f\x19R\xc3\xcf\xd6uee\xf8\x0dn*\x0c\xffpJ\xc2o\x92H\xf8\xbfI\x11\x10\xfe\xd9\x8f\xdc\xf0#\x96\xae+\xeb\xc2\x1f\xccS\x94\x9c\xe3x*\xe4\xd6\x9f\xcfo}tV\xed\xb1\xa8w\xcb\x84\x90x1}^h\x9b\x92\xeb\xdd1?o\xb9v\xf4d,\x02\xc3\x0e\xff\x20\x84\x1f\xb0Er\xf8Y\xba\xae\xa0w\xe0\x0d\xefq\x7f\x16]\xef\xbb\xec\xf7\xbb\x9a\xb5\xa9\xf7\xfd]J\xb3\xdfo}w\xc3O\xe2<\xf7\xe3Z\xea\x91\xda\x84\xc4\x8b\xed\xf3\xbaq|\xaeR\xd8\xdcR\xa0=\x19\xd8\\\x04b\x86?49\xb8\xd0\xcd\xf8\x94\x1f\xc2\x0f\x18H\x0e?K\xd7\x15\xf4v^\x0d\xdc\xe8\xee\xca\xa2\xf4#\x94\x17M&\xfb\xb0\x7f+\x16hm}\x96*$$^l\x9f\x17r\xb9\xd5w\x91\xf5\x85\x91\xff\xe5\xd9\x85\xff\x09\xf5\xb8\x81\xb1`\x08?`\";\xfc(F\xd7\x85\xc2\xe3\xfaA\xc0\x90`\xbeY\x85\x20\xfc\x9aw+j\xdf\xd0!$^\x1c\x9f\x17ra\xbbv\xb3+\xf2?\xdb\xf0\x07\xfa\xbc%\xd3\xda\xf3\xcf\xd1\xfe\xd9\xfc=\xb6m`\x96!5\xfcL]W\x14\xffI\xf6L\xb3\x13A\xf8)\xefV\x04B\xe2\xc5\xf6y!\xed@?\xbe\xf0\xab\xf8\x95\xe1\xd8B\x1c\xe87\xffH\x8f\xf5\xbf\xfc\xe5\xc3s\xbe\xffS^\xb8!\xfcY\x8f\xcc\xf0\xb3u]h@O\xc7\x20\xeb(u\xd6\"\x08?\xe5\xdd\x8a\x9b\xc4\xc2\xcf\xbd\xda\xff\x837\xf5X\xff\xc5\x0f~\xf9\xc5/\xff\xe4\x17\x9cpC\xf8\xb3\x1e\x99\xe1\xe7\xe8\xba|\xda.\x7f\xaa\xe3}\xdbyg\x19\x82\xf07h\xe7\xfc\xbbc\xffbK\x8a\xc2\x1f\x8d\xf5\x1f\xfeJ\xfd\xf1\xab\xff\x18I\xf3O\xbf?\xe7\xe1\xbf\xfb\xe6\x9b_\xfe\xf0\xa1\xef\xfc\xf0\xd7F\xf8\x7f\xfa\xdd9\x0f\xff\xe57\xc4\x84\xfa\xf79\xdf\xff{\x08\x7f6\x205\xfcl]W\xc0\xdbw3p\xb9\xdd\x975\x9e\xce\xd0\x90\xdf\xefj\xf4\xfb\x83\xd1\xab\xfdC\xd6U\xab\xad\xde76\xf6\xac\xa6\xe0\x8a\x9f\x80?\xb7q\x08\x8d6\xe6\xfa\x03\xe4\"\xb4;\xfcZb?Q@\x97Y:\xde\xd8\xf0?\x1c\xc9\xfe\x1f\xfe\xf4\x8b_\xaao\x04\xdf\x7f\xf3\x8b_\xff\xe9\x9fF\xc3\xff?\xbe\xff?\xd4\x83\x83\xbf$&\xbe\xff\xd7\xbf\xfe\x97_\xfc\x10\xc2\x9f\x0dH\x0d?G\xd759p\xbc\xc37\x9e5\xd9G\xc3\xba\xafK\xf1F?\xe7\x9f{\xc3Rck\xcf\x0bQ\x05W\xfclS[\xca\x1d\xcfW\x7fn#\x16\xa1\xdd\xdb\x8f\xa9\xb7\xd6\x9f\x9c[w5\xc6|L\x86_?\xec\x8f\x1c\xdc\xff\xd1\xdf\x7fc\xf0\xeb\x87\xa3\xe1\xff\xc1/\"\xef\x0f\xc6\xc4w~\xa5\xd7\x81\xf0\xcf~\xe4\x86\x1f\x90Io\x89\x12\xf3\x95^2\xfc\xf8\x82\xdf\xc3\x7f\x17\x09\xff\x9c_\xeb\xbf\x7f\xa5\x1e\xd6\xcf\x99\x13\x0d\xffC\xfa\xad\xbc\xc4\xc4_<\xf4\xa7\x7f\xf7+\x08\x7fV\x00\xe1\xcff&\xafZO\x06\xc8\xf0k\xbc\xf9]\xfd\xf7C\x91\xf0\xff\xe0/~\xf5\xcd\x17F\xf8\xe7D\xf6\xf3\xe6\xc47\xbf\xf8\xeb\x1f>\xf4\xd7\x10\xfel\x00\xc2\xef,b\xc2\xff\xc3\xbf\x8c\x84>r\xd8\xff\x9d/\xd4\x13|#\xfc\x7f\xf4\xb7\x91j\xc6\x04\xe6\x97\xdf\x81\xf0g\x03\x10~gA\x86\xffO~\xf1/\xbf\xfc\xd3?\xfa\x17=\xd0o>\x1c\xb9\xe0\xf7\xd7_\xfc\xe2\xbbF\xf8\xdf|\xe8\xef~\xfd\xc5\x9b\x7fBL\xfc\xc9O\xbf\xf8\xe2o\xbf\x0f\xe1\xcf\x06\x20\xfc\xce\x02\xc7>r\xf6\xfe\xcd\xdf\x7f\xf7\x0f\x1e\xfe\x8b/\xa2\xbb\xf3\xbf\xff\xae\xf6Q\xdf/\xbe?\xe7\xe1\xbf5\xc2\xff\xcd\x9b?\xf8\xce\x9c\x1f\xbcIL\xfc\xf4\x07s\x1e\xfa\xe1/!\xfc\xd9\x00\x84\xdfY\x10\x07\xfc\xd3\x03\xc2?\xfb\x81\xf0;\x0b\x08?`\x00\xe1w\x16\x10~\xc0\x00\xc2\xef,\x20\xfc\x80\x01\x84\xdfY@\xf8\x01\x03\x08\xbf\xb3`?\x8c3\x19DK\x02f<\x10~\xc0\x96\xec\xf9\xca\x05`\x05\xc2\x0f\xf0\x094\x82\xf0+\x8b\x81\xf0\x03\\\xc2%%\x20\xfc\xcab\xe4\x86\x9f\xa9\xebR\xb9\xd1\xd7\xd1}\xd9f>\x20\x82\xad\x06,\xe5\x80\xf0+\xbb\x91\x1a~\xb6\xae\x0b\x85\x06\xbcC\xb7G\xbd\xf4\xc3*\x01\x16\xb6\x1a\xb0\x94\x03\xc2\xaf\xecFj\xf8\xd9\xba.4\xd0\x1e\xc0o\x0c\xd6'^\x00\x0c\xec5`)\x86\xfdx0\x20[\x90\x1a~\xb6\xae+\xe0}\xdf\xf8\x1b\x10/\xccg\x03\xa6\x18\x08\x7fv#7\xfc\x88\xa5\xeb\x1aj\x0f\xc1\x07J\xf1\x20\xd2\x80\xdd\xaa\xad\xae~\xf5\xb3\x177\xd5\xee\xfb\x1dQ*\xd4\x80\xa9|\xf6\xc2\xda\xda\x86}\xbfE\x16\x98\xc2/\x20k\x90\x1c~\x96\xae\xab\xd7w\xe3\xa4\xf7\xf8\x85\xac\x12\xf6\xa4\x07\x81\x06\xec\xdbs\xe76m]\xddp\xec\xc5?#\x9f\x0e(\xd4\x80!4V\xfbl\xcf\x95\x9e\xea3T!O\xf8\x05d\x0d\x92\xc3\xcf\xd2uuk\xba\xae\xe3\xdd\x90\xfe8\xb0\x7f$8\xfaq\xf5\xee\xfb\xe8\x01\xad\x03\x10j\xc0\xbe\xdd\xb4\x0f?I\xfc\x1c=\x1bO\xf8\x05d\x0d\xb2\xc3\x8fbu]>\xed\xaa_\xb0\x83\xe1\x97\x01\xac\x88\xc2_\x1b\xf3H`\xb1\x06\xecJ\xf5\xa7\xd6\x99\x10_\xf8\x05d\x0dR\xc3\xcf\xd6u\x0d\xea\x9e\xae\xc1^\xfe\x8c@\x14Q\xf8i\xf7\xa7\x86P\x03v\xa6\xfa\xdb\xd8\xb9\xb49Y\xc2/\x20k\x90\x19~\x8e\xaek\xb4C{/\x18\x80c\xcc8\x10\x85\xff\x05F\xa1\x88+\xb43\xd0\x04\xae\xf6g72\xc3\xcf\xd1uMi\x1f\xf5\x05\xdb\xe1\x16\xbf8HG\xf8\xef7\xec\xc6\xbb\xfec\xc7\xac\x7f\x80\xf0g7R\xc3\xcf\xd6u\xa1\xcb\xed\x97\x03\xe3\x9d'\xe1\x82\x9f\x00\x91\x06\xecwcc[w\x8f\x8d}\xc6\x99\x9d\xcfX\xed\xd6\xb3W\x8eU\x9f\xb5\x963\x85_@\xd6\x205\xfc\x1c]\x17\xba\xdd\xdbq\xf22d_\x84H\x03v\xabZc\x1fgv\x1b~\xf3B\xc3\xeag\xdf\x8d)f\x0a\xbf\x80\xacAn\xf8\x81\xd9\x05K\xf8\x05d\x0d\x10~\xc0\x8eX\xe1\x17\x905@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1\xc8\x0d?K\xd7\x15\xea\xf4\xea\x1c\xb7\x9f\x17\x98!\x10\xca0`V#5\xfcL]W\xc8;\x1aP\xb9\xec\xbd*\x9a\x1d\xc8\x18\x83\xa3\xe64\xa1\x0c\x03f5R\xc3\xcf\xd6u\x8dk\x0f\xef\xed\x84\x87\xc6\xcc`\x16\xd6\x13\xff\x81\xc7{d\x09R\xc3\xcf\xd6ui\xf8\xde\x80'\xf9\xcc`\xca\xeaD5\x80\xd9\x87\xdc\xf0#\x96\xae\x0b\xa3=\xcf\x13\xc8\x14\xb7\xeb\xdc\xb9\x85+\xb4\xc7v\xb4\x96\xe5\x95\xb5\xaa\xbf\xb7)\xb9\xde\x1d\xf3\xf3\x96\xe37\xea\xc8\xc3\xfe\xcb\x10\xa9\x0c#*lSr:\xd1m\x97R\xa25\xd6\xb98\x7f\xfe\x0ex\xe0\xff,@r\xf8Y\xba.\x8c\xe6\xf1\x002\xc4`~Y\xcb@\xb3\xd2\xa2N6\xba\xf6\xf8\xf6\xb8\xd6\xabo\xc7\xc7\xe7*\x85\xcd-\x05\xea.?x\xc1?\xbf\xca\xef\xf7kO\x0c4\x94aD\x85\x80?W-\x1ajt\xe1\xf2\xc6\x9c\xed\xbe\xd6\xc2287\x98\xf9H\x0e?K\xd7\x85\xa2\x17\x03\x80\xcc\x10*^\x1e\xc2OT\x9fB\xa8O\xc1\xa7c\xfaO\x97[\xdd(\xeb\x0b\xb5*\xd4a\x7f\xf4\xf1\xe1D\x05\xed\xfd\xa0\x19\x87\xdf\xa7t\x20\xfc\xd0\xef.\x04\xcctd\x87\x1f\xc5\xea\xbaT\x06\xba\xedg\x01\xd2\x89Oy?:\xd9\xa8\x1f\xb9\x974\xaa?\\\xf8\x87\x16h^\xf8\xcd\x0af\xf8\xeb\xe7\x850\xc5\x8d\x08\x98\xe9H\x0d?[\xd7\xa5\xd2\x01\xc2\x8e\x0c\xd2\xa2\x18\x17[\x17\xaf\xd4~\xadX\x88\xc8@\xf3\xc2oV0'\xcb\"\x17\x08\xe0\xa1\xbf3\x1f\x99\xe1\xe7\xe8\xba\xf0\x95\x00J\x1c\x09\xc8e@1>\xc5o\x9c\xa7\xfd\x9a\xa7\xed\xf9\xad\xe1o\x8f\x9c\x9b\xf1\xc2\xbf\x07O\xae\x9f7\xaa1\x85\x80\x99\x8e\xcc\xf0st]\xf8\x94\x1f.\x0eg\x90`Q\x15~+\xde\xbe\x1d\x9f\x01\xe0s\xf5.M\x05F\x86\xbf\xaa\x0a\xa1I%rr\xc6\x08\x7f^\x93\xfa\xde\xbe\x10O\xf6\xe9\xb5\xf6\x1cD\xc0LGj\xf89\xba.\xf5\x9d\x00>\xe4\xcf$\x83\xdf+\xf1\xfa\xb6+\xed\xea\xe4\xfa\x9c&_S\xcez\xed\x0a~\xe3\x10\x1am\xcc\xf5\xe3\xfd}\xb3\xab\xa5wi~\x80T\x86Q\x15\x16\x17\x1e<\xb8X\x99\xdbq\x03\xa1&\xa5\xbe\xbb\xb7Q\xe9\x14-\x14\xc88R\xc3\xcf\xd5u\xc1\xfd\xa2\x99\xe5f]q\xc1B\xedS\xd7\xb0\xf69\x7f\x18\x7fv\xaf(\xb9\xe3\xf9\xea\xcfmjqh\xbb;\xaf\x0a\xfb\xbaMe\x18U\xe1fU^\xc1\xf2&\xbdn_\x95\xdb\xbd\xb8\xcfvy\xc0\x8c@n\xf8\x01\x00\x981@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8g\x0f\xf5\x8a{\xfd\x0dQ%\x00\x88\x17\x08\xff\xec!0\xd8Q\xe2\x86'\x1f\x00\xa9Bn\xf8Y\xba.\xfct\xd87\xda\xdf\xb8\x00\xaf\xea8\x18T\xc0k\x04\xa4\x0a\xa9\xe1g\xea\xbaP\xb0\xf3$.\xed\x84\xf4\x8b\x19V\x86DU\x00\x20N\xa4\x86\x9f\xad\xeb\xf2wk\x8f\xf0\xef\xf6\x0b\xe6\x06\x20\xfc@*\x91\x1a~\xb6\xaek@\x7f|w/x;\xc4@\xf8\x81\xd4!7\xfc\x88\xa5\xeb\x9a\xea\x1c\x9c\x0aM\xf9;\xe1y\xafb\xae*\x83\xa2*\x00\x10'\x92\xc3\xcf\xd4u\x85\x06\xd4\xd2>x\x86g\x1c\x84\xdc\x0b/\x04\xc0\x84\x05\xa4\x04\xc9\xe1g\xe9\xbaB\x03\xdd\xf8\x99\xbe\x03\x90\xfe8\xe8S\x14e\xa5\xa8\x12\x00\xc4\x83\xec\xf0\xa3X]W\xf4\x82\xdf\x05\xd1\x8c\x00\x0a\x16\xcek\x19\x04\xc3\x09\x90\x12\xa4\x86\x9f\xa9\xeb\x0a\xb7\xeb\xa68\xcd\xe3\x03\xd83\xac\xc0eQ\x20U\xc8\x0c?[\xd7\x15\x0d\xff(\x84_\x0c\\\xed\x07R\x87\xcc\xf0st]\x83\x91\xc3~\xb8\x8e-\x06\xc2\x0f\xa4\x0e\xa9\xe1g\xeb\xbaB]\xdd\xe3\x81\xf1\xee.\xb8\xe0'f\x08\xc2\x0f\xa4\x0c\xa9\xe1\xe7\xe8\xbaB\xc3';N\x0eC\xf6E\x84\x02\xa3\xf5\xae\x80\xa8\x16\x00\xc4\x89\xdc\xf0\x03\xd3\xe1\x09E)\xee\x15U\x02\x80x\x81\xf0\xcf\x1e\x02\xa3\xb0\xdb\x07R\x08\x84\x1f\x00\x1c\x0a\x84\x1f\x00\x1c\x0a\x84\x1f\x00\x1c\x0a\x84\x1f\x00\x1c\x0a\x84\x1f\x00\x1c\xca\xff\x0fL\x0c\x1em+\xfdz{\x00\x00\x00\x00IEND\xaeB`\x82", - - "analysis/chan1.png": "\x89PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\x00\x04\xc0\x00\x00\x02n\x08\x03\x00\x00\x00aR\x8e\x00\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x02\xfdPLTE\x00\x01\x00\x07\x0a\x07\x0f\x11\x0e\x1a\x1a\x14\x1f\x1f\x18!#\x20#$\"\x15%D$%#%'%'(&+)\x1e()'*+)/,!+-*,-+-/,02/63(241564796<9.9;8#?r@=2<>;>@=C@4DA5AB@DFCFHELH:IKHKLJNOMUP?PRORTQTVSVWU]XGWYV_ZI,`\xaeZ[Y7]\xad[]Z\\^[9a\xab;b\xace\xafac`hcQcdbAg\xb2efdCi\xb4fheDl\xb0Mj\xafqjRikhGn\xb2Ip\xb4lmkKr\xb7npmUt\xb4{s\\rtqWv\xb6tvsuwt[y\xb9\\{\xbbxzw]~\xb8e|\xb8\x84|dX\x80\xbf{}za\x7f\xbf|~{~\x80}b\x82\xbc\x7f\x81~d\x84\xbf\x81\x83\x80|\x83\x97\x83\x85\x82l\x86\xbch\x88\xc3\x90\x86hn\x88\xbej\x8a\xc4\x87\x88\x86q\x8b\xc1\x89\x8a\x87t\x8e\xc3\x97\x8doz\x8e\xbf\x8c\x8e\x8b|\x90\xc1\x8e\x90\x8dx\x92\xc8\x90\x92\x8f~\x93\xc4\x9d\x93ux\x96\xc5\x92\x94\x90\x81\x95\xc6\x93\x95\x92{\x98\xc8\x94\x96\x94\xa2\x97y\x96\x98\x95\x81\x9a\xc4\x97\x99\x96\x84\x9c\xc6\x87\x9b\xcc\x99\x9b\x98\x80\x9e\xcd\xa6\x9c}\x87\x9f\xc9\x9c\x9e\x9b\x89\xa1\xcb\x9e\xa0\x9d\xa0\xa2\x9f\xa1\xa3\xa0\xa2\xa4\xa1\x91\xa5\xca\x8f\xa7\xd1\xa4\xa6\xa3\x94\xa7\xcc\xa5\xa7\xa4\xb3\xa7\x83\x92\xaa\xd4\xa7\xa9\xa6\x97\xaa\xcf\xa9\xab\xa8\x9d\xac\xcc\xab\xad\xaa\x9b\xae\xd3\x9f\xaf\xce\xbb\xae\x89\xad\xaf\xac\x9e\xb1\xd7\xa2\xb1\xd1\xaf\xb1\xae\xb1\xb3\xaf\xa5\xb4\xd4\xa2\xb5\xdb\xb3\xb5\xb2\xc3\xb6\x91\xab\xb7\xd1\xb5\xb7\xb4\xa8\xb8\xd8\xad\xb9\xd3\xb7\xb9\xb6\xb9\xbb\xb8\xb0\xbc\xd7\xad\xbd\xdd\xbb\xbd\xba\xb3\xbe\xd9\xbd\xbf\xbc\xb7\xbf\xd4\xcd\xc0\x9a\xbf\xc1\xbe\xb6\xc1\xdc\xb9\xc1\xd6\xc1\xc3\xbf\xbb\xc3\xd8\xc2\xc4\xc1\xbd\xc4\xda\xba\xc5\xe0\xc4\xc6\xc3\xc6\xc8\xc5\xc0\xc8\xdd\xd7\xc8\x9d\xbb\xca\xde\xbd\xc9\xe4\xc5\xc9\xd9\xc0\xcb\xe6\xca\xcc\xc8\xc7\xcb\xdb\xc2\xce\xdc\xbf\xcf\xe2\xc9\xcd\xdd\xcd\xcf\xcc\xc9\xd0\xe6\xcc\xd0\xe0\xc6\xd2\xe0\xdf\xd1\xa4\xcf\xd2\xce\xd1\xd3\xd0\xd2\xd3\xdd\xd3\xd5\xd2\xcd\xd5\xea\xce\xd7\xdf\xd5\xd7\xd4\xe6\xd7\xaa\xd6\xd8\xd5\xd1\xda\xe2\xd8\xda\xd6\xd9\xd9\xe4\xd3\xdc\xe4\xd5\xdb\xea\xda\xdc\xd9\xd8\xdd\xe0\xdc\xdd\xe7\xdc\xdf\xdb\xda\xdf\xe2\xe0\xde\xe2\xde\xe0\xdd\xf0\xe0\xb3\xd6\xe2\xf0\xdc\xe2\xe4\xe0\xe2\xdf\xde\xe3\xe6\xde\xe2\xf2\xe2\xe4\xe1\xe1\xe6\xe9\xe4\xe6\xe3\xde\xe7\xef\xe8\xe5\xea\xe5\xe7\xe4\xe6\xe8\xe5\xe4\xe9\xeb\xe7\xe9\xe6\xe8\xe8\xf3\xe8\xea\xe7\xe2\xeb\xf3\xe9\xeb\xe8\xec\xee\xeb\xe6\xef\xf7\xe8\xf1\xf9\xef\xf1\xee\xf0\xf0\xfb\xf1\xf3\xf0\xf1\xf6\xf9\xf4\xf6\xf3\xf7\xfa\xf6\xf5\xfa\xfd\xf9\xfb\xf8\xfa\xfc\xf9\xfd\xfb\xff\xf9\xfe\xff\xfc\xfe\xfb\xfe\xff\xfc\xc5\xe5[\xa2\x00\x00\x20\x00IDATx^\xec\xbdqLS[\xda\xef\xef93\x8b\xab}\x87Ax+\xc3}\xf5^8#\xbe\x1c\xbc^gk\xa9\x17\x7f\xe2A.U\xe1u^\x05\xde\x899\xf6\xe8}\xc9\x18\xc5\x174z\x8fg\x09\xddk\xaf\xfd\xac\xb5\xf7j\xd9\xdf\xae\xf5\xec\xd5\xf5l\xf8\xdb{\x80\x01\x00\x00V\x8e\xbfmH&R\x89HV;\x00\x00\xc02\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\xac\x0b\x02\xc9\x0c\x80\x94\x04\x04\x0cX\xfbx*\xb6\xa0\xfd\xc9\x8c\x80T\x04\x04\x0cxO\xda\x0b\xbc\xc9L\xd4\xc1[\xd0\xae|\x20\x90\x97\xc7\xf7\xb8\x95\x8f\x01\xa9\x8d\xda\x02\xe6\xe9j6Y\x06|\xb2\xe4|\x13/\xd0\x9c\xa0\xe0_\xaf\x95\xe9k\x83\x09\x0cbi\xdb\x88\x046\xb6%3]\x94\xed\x12\xa9C\x9b\xe8\x0df\xcd@u\xca\x06w\xd9\x05d\xeds)\x1f\xc6\xd8L\x0e\xd7\x91z\x102\xc53\x890\x9a\xc6\xaaK{\x20\xecNnByds\x84de(\x9c\xc0\xb1'#\xbb\xb47{:\xf6H2\x1a\xd0\xb9d&K`\xec\xd0p2\x13F\xbf\x8e\x13\xd0\xf5\x93KIkP4\x1aG]\x8a\xf9@\xea\xa3\xb2\x80M\xf3V\xa7\xdb\xd9\xd6\xec\x93&g\xf8Q\x0f\xe1\x01?\x9e\xa0\xe4\xe9C\x9d\x17\xf5o\x13\x18\xc4\xd2\x80l\xb6\xaf\xd1e\x9b\x0d)\xff_SzG\x17n\xbbDB\xa7\xf0\x96f\xec\"\x9b]\xe9\xa5qz,\xbe\x81MGl\xbd\xbf\xd9\x96\xeeT>\x8e}f\xd4\xe0\xc5\xde\x06d\xf6\xc5\xb1\x88\x9c\x0d\xcf\x0f\xb2\x06\x0d\xfa\xc5\xfd\xc1#\x1a\xf2\xea\xa6\xcd\x1c\x8c)\xd5\x95\xb1\x83o\xd9\x8eP\xbc3\xc7\xe77if!\x11>q<\x1e=Y\x84\xc1pq\x7f|C\x09w8\xbb\xbd\x93\xeb\xb0\xdbw\xdf!{\xd6\x8dW\x95\x8c\x86\x90M)\x1bX\x03\xa8,`.\x9e\xf6\xe4}\xbcS\x96t\xd0\xfb\xd1\xd74\x90\xa0\xe0\x0f\\'\x0e\xce&0P\xe0\xb2\x86\xfe\xef\x92\xbb5\xfdr\\\x9b\x1d\xa5\x0b\xb7]\"\xa1S\xe0S{3|\xd8\x9b\xbe\xf7T\\S\x0d\xed\x9b\xf9r\xf6\xc4;\xee`]\x89^\xe4\x88g\x209\x1b\x16\x1b\x14\xa6N\xa3\x94\xcb\xf0f\xee':\xe7\xdb\xb6x\x01\x9b\xd4\x84Z#=\xb1\x04oaH\xaek.(\x1aD\x90\x19,\xb0\xb3\xdd\xa1\xc3\xf817\x81\xb1\xbe\x83\xee\x9e\xd1(\x8d\x14\x15Z\x0c\xac\x11T\x160\xcc\xba\x0e^\xde#OR\xee\xde\x9aW.\xc2x\xc1-lH!\xc5\xef\x12\xffw]~\x1c\x8f\xfc\x83\x0b\xb7]\"\xa1S\xe0S\xa5\xbbZp\xd3/J\x93\x08\x18>\x97\x1e\xef\x91\xd9\x02\x04,|6\xbc\x08\x01;\x95\xce\xc6\x8e\x97P\xdc\xd1k<*\xb2C\x9dA\xe9\x89%8\xc2\x17[\x95L\xc0\x92\x1a(0\xf7B\x14\xb0\x17st\xd7\x97]\xa1`\x04\x02\xb6vQ[\xc0\x083n\x8b5\x10\x93t\xf2\xf1\xfd/se\x82\x9f\xe3&\xc6\xd78\xae\x0f\xbf\xd0q\xbf\xa4I\xdd\xbd\x9b\x95\xfa\xda\xef\x99\xcd\x8b\x0be\xbaCbZB\xe4\x7f\xb7\xa9\x20#\xb7\x9a\xddm\xb6=9\x9b\xb4{\xb7\x92\x11\x87\xe8\xf7\xca\x97\xd9\x8eoD\xe8\x8c\xab|k\xfa\x9ey\xec;\x98\xad\xc9\xd9G\x87\xb6\xc7\xd0&\xbe:7c\x8f[V\xc31\xb4\xf1jEN\xc8mu=?c\xfbuy\x0d\xd2S\x9c*\xbd~\x00\xef\xbdN\x05,R\xaf\x93\xd8\xee\xc39\x08e\xf9C\x02\xd6\xb0\xd1/\xb9^\xe9\xe5\xc8\x04,t\xb6\xa4\x0d\xc2\xd8S\x9e\x9du\x80\x0d!\xb1\xe2[\xb2M\xb8\xed\xbd\x97\xfc\x92z%-Vn<\xc1\x9f\xf99\xdbF\x9d8\xc4\xd5\\\xab\x139\xad\xb9\xd7\xf1\xb0\xe8\xaa\xaa\xa1\xd9\xc1\xfb5\xc5\x957Y\x7f\xda^{XWV{8(3x\xab\xe7\xe8\xc7\x8c\xa3>\xe3W\x17\xcb\x0c7o\x96\x15\xf7\xc9O\"\x08\x98\xc8\x99\xf4\x19\x1cC/\x08\xd8\x9aEu\x01\xf3\xf2\xae\xd5n\xff\x0b\xc6\xdf\xdbu\xad88\xf1e\x11\xc6S}:\xeeP\xeb\x9d\x92\xf3\xd4\xe2Qq\xcd\x9d\xb1V\xae#\xbad\xf8n\xadH;n\xbd\xaa\xcd\x0f\xd0\xac#\xb7\xbay-\"\xf24`\xcb-\xb4\xd9lN\x99\xed\x8c\xa5yknfNu9r\x93\x1b\xb3\xa2\xd7\xb2/m\x88\x08M\xf3F\xa4\xad\xbb\x94y\x00Kk\xa0\xb9[\xeb\xea\xb6fPI9\xa29c=\xa3)\x97\xd5\x20=\xc5\xa9Rw\x86\xf7'\x1e*`\x91z\x03\x83ui\x83\xd8\x8c\x9a\x1ebQ\xc0\x02\xf9\xdb\xa5\xd7+\xbd\x1c\x07\xb2\xce\xcc\xcc\xdcE\xb2\xb3%m\x10ve\xe6\x9a\xdb\x7f\x814\xf1\xde\x12\x7f\x9ad\xdc\x1c\xaeW\xd2b\xe5\xc6\x13FQ/+\x14u\xe2\x10\x9er\x94\x87>A\xa5n<;a\xaf4\xda\xed\xf6\xe74\xfb\x0awc\xa4\xf3P\x15\x19%>\xdd}\xb1\x7f\xec^\x19\xf7Nn\xf0\xd8n\xd7\xb7\xd2\x84\xf43\x9e;a\xe8l\xd5\xeb\xef\xd5F\x7f\xc8R\x01\x1b\x88\xd1\xaa\xf9\xe9\xde\x1dY\xf1}\x86@j\xa3\xba\x80a\xaf\xc7ai\xf6E'\xdd|\xe2\xc7\xdc\x91!d\x11\xfd\xcfn-b\xc9\x12\xf2\xcd|\xf1\x10I\xcd\x1d\xae%C\x88\xb9\xbe\x1f\xa2\xcb\x85\xeeV+2\xb3\xbd\x16\xd2\xc3\xd0\xd2{\xef\xeb,\xd6\xf5S\x1eq\xe5\xa3]>6\xc6\xf5Y\xe8\xe5}\xc2\xe6\x10i\xb2\xc8%\x96k\xb1\xbc\x06\xcdVj\x96S\x80q\x17\xeb\x1eu\xa1\xbb\xb2\x1adCH\xfc\xc9\xb1\x1d\x98\xf5\xc0$\xf5\xe2#\x05\xde\x1c\xe1\xd1\x81\xe6_g|\xe3\x07P\x8f\xecz%\x959\xc4\x8e\x8eCv\xb6\xa4\x0d\xfat\x1b)\x1b\xd8\xae\x91\xe7FN\xe1F\x91\xf9\x07\xd2VDZ\x1c\xa7\xf1\xa4\x8e\xc9PA\xe5!d\xd7&\xb4\xe9\xae\x90\x0c\x8f\x10\x87\xb9\xfb\x98\xca\x0e\xe9Iu\x1ezG\x92\x9d%A\x99\x01E\x100\xe9g\xdc\xc7=#\xa6\xdc\x14\x8eF*`nt+\xea\xe8~\xf2~Y1\xb0FQ_\xc0\x08~Kwt\xb2\xdb\x12\xd7\x9a\xa1,`\x17C\xc9\x11\xee\xa9r\xb9\xd0\xddZ\xba\xcd?O\xc8!c%w\xf6\xd6\x7f\xe6\x1f\x06\x04_W\x1c\x01\x0b\xfb\x82\xbd\xd7\xf7l\xcbD\xb4K\x845G\xc8\xcb9\x0d\x96\xd7\xa0\xf9\x82\xbe~\x8d\xbc\xb8\xe2\x13V\"\xef\x88\xbc\x06\x99\x805\xa0\x06&`\xd2z\xf1\xcc\xf6-\xfb\x04\x0b\x0dU'-U\x13\xc9\xf5J*s\xa0KCCC\x97\xa9\x80I\xce\x96\xacA>\xc4\xd3\xcd\x19\x8d,Wr\x0a\xff\xc6H\x0fL\xda\x8aH\x8b\xe34\x1e\xb7'\x160o\xb5&\x07ekN2?~X\x9f\xea\x8f\xce\xbd#\x18\xae`\xfc\xd2p\xf4\xc6\xbd\xa7A\xe6\xbf\x8a#`\xe1\xcf\xb8\xb1\x84\xbc<\xe7\xbe\xc5\xd1\xc8\x05\xac%\xea\xa8\xbb\x8b\xcf\x83\x1e\xd8\x9aEe\x01\xf3\x0b\x1e\xafq>\x20M\x12\xcc\x0f\xe2\x96a(\x0bX8\xd9\xc1\xcd)\x97\x0b\xdd\xad\xdb\xc5\xbe\x0b\xed\xf3\xf8\xf8\x83yh\x8b\xd0\xe7\x89#`;BY[r>o\xb3\xed\x14\x04\xec\x1c\x0ey\xc2%5\x08n\xab^4\x8a?\x15Tho\x81\xac\x06\xb9\x80y\xc9\xbdL\x05LZ/\xc6\xb7\x90\xf8\x00VS14$\xb8\xd3\xa4\xd7\x1b\xa9L\xe2\x03\x93\x9e-I\x83\x1e\x08\xb3\x08\x04%R|KD\x1f\x98\xbfK^\xaf\xa4\xc5\xca\x8d\xc7\x83\x91\x11\x9b\x92\x805hy'r\xfeF\xcb\xde\xa3\xb0>\x9d\x10\xdd]gI\xfa\xed\xbd\x0b\x95\\\xd9\x9d\x04=\xb0\xc8g\xbc\xfb\x15\xfd\xa6J\xdc\x03\x1b\x0a\xbd\x95Rlh(6\x13X\x13\xa8+`\x81&\xc1e\xf2\xd0\x14\x90$1u\x87%\x99(\x1d%`\xdfD\x09\xd8\x18\x1d^(\x11\xba[\xcb\xb7\x8d2H_\xe0\x01\xed\x01\xf9Z\xd2\x99\x03\x9c\xddv&\xb7\xcc\x96\xe4\x1e\x10\x13y\x05\xf4\xbb\xfb\x80\x20`\xf46d\xf7\xb0\xb4\x06M5=\xc6#\x1f\xae\xd8\xc6\x8al=\"\xabAr\x8aS\xc2D\x03*`\xd2z\xb1'\xfb\x8b\xad\xc2\\\x03Mx\x8a\xab\xe4z%\x95I\x04Lr\xb6d\x0d\xf2\"v$\xda\x89/9\x85\xf8\x14\xd2B\xfb\x91\x92VDZ\x1c\xa7\xf1\xd8\xc7\x84\x8d!=q\x18?{\x0a)\xf4\xd6\x98>\xdd{I{`O\x18D\x8f\x1e7\x12\xe9z\xdb\xa7\xef\x94\x19Pb\x05\xec%W\xfb\xf2Y\xa51v~\x85T\xc0\xea4\x0a\x9d-x\x0a\xb9vQW\xc0p3\x9b\x12\xed\xa7\x1e{I\x12\xe3I>I'?\"`\xfaF\x8c\x83\xff\x12%`\xb3\x06#\xed\x82\xdd\xb8\x11].\xf4\xbf\xdb\x85\xd8\x18\xf5\x8b::#\x9e\x9d\xb9\xf0\x18{-\xc4xZ8&\x15\xb0Po\"\x87JG`{\x94\x80Ik\xd0l\xa1\xee\xa9m\x85\xd4\x1fDG/-\x82\xc3E\xd2\x1f\x09\x9fB\"`\xd2z\xfd\x05g\xf0\xb1]\x81\xf0)\x18\x92\xeb\x95T&\x110\xc9\xd9\x926\xa8\x20\x87\x88\x94\xeb'\x1a,\xcb\x95\x9c\xc2\x9by\x80\x88L\xa0p\xab\xbc\x15\x8a\x02&;\x1b\x19\x87\x0a\x1di\xf9\x89%\xb8\xb3B\x9af4b\xfc\x9a:\xbe\xc6\x84'\x8c\x8d\xb7\xc9\x87\xc7\x8d\xb0C\xd7d\x06\x94X\x01{\xc2\x95q\xdc\xe9\xd0sfwCx\xf0*\x11\xb0@\xde^\x1c\x0b\x08\xd8\xdaEe\x01s\xf1\xddN\xb7\x93y\xee%I:\x89\"\xe1\xf4+\xe1)\xe4\x04\xfb\xf25\x1e\xbas\xbb\x86\xd3\xdd\x9f\xfa\x8b]\xf7\xe5D\xf0\xe9\x97:\xfat\xf2\x91\xfeD\xe7\xc8\x0d\xee^T\xc1\xd1\xaf\xd1\xe5\x07,u\x0a\x95Z\xda+P\x13\xbd\x037\x9f\xb3\xb6U\x08\xcf\xcf\xcei.\xb5\xef\xcapKm\xe7\x07\xd9\x135v\x7f\xd4\xa1\x83\xd7\xeb\xf2\x91\xb6a\xd0c\xdbtd\x10\x8f\x1e\xd9d\xf3\xc8j\xd0\xa0|\x8b)7\x8bZ\x97\xa7\x9d\xb2\x9eJ+\x97\xd7\x109\x85\xb7t\xa7\x87\xeczv\x96z%\xf5\xce\x0c\x1c\xd3\xba\xf1df\xf5\x80\x9f\xce\xc4\x0f?\xc6\x0b_\xaf\xa42\xd9L\xfc\xf0\xd9\xe24H2\x13\xdf\x91\x91Sw&+m\xa3\xd9)\xcc\xc4\xbfl\xb3\xb9eo\x09\xee\xca(0\xb7\xffb\xe3\x80\xb4\x15\x92\x16\xc7k<\xf9\x14\xd3.ay3\xe3\xd2Z\xd4\xd1\x7f\xba\x98v\xb0\x1aw\xd7\xf7\x7f{\x85JU+W\xdc:\xdc\x7f\x85{$3\x98\x9b\xb0\xdb\xf5_\xda\xedo\xb1\xf43~\xa6\x1f\x1b\xb1\x7f\x1f\xea\x80\xedC!\xa9z\xda\xc9u<\x16\xd3\x97\x91\xd2\xef\x01\x1e(\x8d+\x815\x81\xca\x02\x86==\x16S\x9b\xf0\xf3\x16I\x12\xbbo%*4W\"\xfc\xdc\x8d=b\x7fa\xd4\x17\xd7~\xc3q\xd7\xae\xd1\xac\xff(&\xaf\xf4\xfb\xfb\xf9\x05CqM\xf4\xcfO|\x9b\x11B\xe9B\xe7\xaek\xa76\xebS\xfa@\xac\xa9\xb0.gSv\xa1p\x03\xfa\x8fg\xa5\x17\x0e\xc9l\xc7\x85\x1f\x11\xb2\xfb#p9W\xa3-5o\xd3\x14\x1e#Y\x9b\x1c\x19\xe4\xf5\x98\xac\x06MuEfv\xb9\x87\x19\xfff{\xc6\xf6\xaf\x03\xf2\x1a\"\xa7\xa8C\x88\xba\x9a\x8e\xd1\xdf3F\xea\xed\"\x86\xd5\xf88y\xed\xa5\xbf\x85\xcc\x0b_{\xe8z%\x95E~\x0b\xc9K\xce\x16\xa7A\x0f%\xbf\x85t\xed\xcb\xdaz\xd2\xbc\x91\\\xfa\x11\xd1\xf1U*=\x05\xc1\xf1\x8b\x8c-\xfb\x1c\xb2VHZ\x1c\xaf\xf1\x843?\x19\x9073.s7>\xd3\x1b\x05\xa5\x19;]Vb\xa4}\xaf\xfb\xc6\xdb\x87u\x06\xe3#\xb9\xc1S\xd1Iv\x0fK?\xe3\x09\xf6\xb3G\x9dQp\x82\x99\xb5\xbcP\xed,=*\xfe\xc8\xcc\x96~2\xfa\xac\x94\xe9\x8d\x07\xc7\xa7\x03\x18X\x83\xa8-`k\x8e\xc8\xa8o\x9dR\xad\x89\x196.\x0b\xaf\x8b\xaf\xbd~\xf7\xee\xed\xd3\xf3\x9f\xc5\xfdEl\x8b\xa6B\xf9\xd7\x1c\xedy\x08\x96\xd3Y\x9b\x80\x80\xbd'\xeb^\xc0\xf0\xe5\x9c%\xaca\xb1x\xfa\x85\xc9b8X6\x12\xc7\xc2\x9b\x1d\xff\x87\xf8\xd3\xe3\x9e\xb8\xc7\x80\x14\x06\x04\xec=\x01\x01S\x89'\xe2\x04\x8a\xa9xS\xfe\x80\xf5\x08\x08\xd8{!x\xb7\x01\x15\x08^\xd1_\xeb{\xd4wM\xff\xd5\x02\x17\xaa\x00\xd6\x03\x20`\xef\x05\xf3nOb@\x05\x82\xc3\xb5\x06\x9d\xa1v\x18\xf4\x0b\x88\x00\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x96\"\x0c\xd7\xbc\x96\xed{\x0b\"\xeb\xd8\x03\xc0zEm\x01\xf3t5\x9b,\x03\xbe\xa8\xa4o\xe0\x96\xe9\xd6\xc0\xca,\\>\xb9I\xb2\x86M\x08\xef\xb1-\xe9{\x17\xbf\x00\xcb_\xaf\x95\xe9k\x170S\xbc_'.\x18\xa3[X\xfci\x1a\x81\xba5\xaa\xde\x86\xb4\x0f\x1eC\x1c\x00R\x0d\x95\x05l\x9a\xb7:\xdd\xce6\xba\x8a\xa1$\xe9kj\xa3\xc9\xa6\x95Q\xb0\xc1\xd0Z\xcb\x12vm\xb9~$}\xf1\x97s\xfaP\xe7Eai\xaaGO\x12\xd9\xdd\xe1\xec\xf6N\xae\xc3n\xdf}'\xae\x8d\xac\x86N\x16\xc8G\x9ek\xddx\x15\x03\xc0\xfaFe\x01s\xb1\xb5\xef}\xbcS\x96\xb4Y\xe82N\xf3\x16[\x92\xd2\xcbD(du\x04/\xba\x8a\x03\x8b\xd7\xaf\x1f\xb8N\x1cd\xf1Zq\x8d4@E\x0c\x1d:q!d}L\x20\xcb0\xd2\x1a^\xe8\x1a\x15r\xcfh\x12\xac\x7f\x0a\x00\xeb\x01\x95\x05L\x88\x94\xe8\xe5=\xb2d\x8f\xe0\xceiO\x14\xdbv\x19\x89\x150\xd7\xd2\"\x09F\x16\xee\x97G\xd8\x89a\xee\x85(`/\xe2\x04S\xc2\xf2\x1a\xae\x18f\x15r}\xd9\x15\x18\x00\xd65j\x0b\x18a\xc6m\xb1\x06dIoS\xaf\xd7\xef\xb55y\x13\x17\\\x06<\xe5\xd9Y\x07\xc4!dSAFn5QU\xbfVXu\xb9Z\x96;\xbe\x11\xa13\xae\xf2\xad\xe9{d\x8b~\xbe\xbd`\xd0\x1d>KC\"\xcd\x95\x09n\xad\x9b4r\xab@\x0d\xb5\x08\xde\xaf)\xae\xbcI\x04\xe8\x99\x8e\xe3\xbeyq\xf1\xa8\xbe\x96\x06s\x8d\x84\xa2\x08\x1b`l\xaf=\xac+\xab=\x1c\x94\xd7\x80\xe7\x8a\x85\x0e\x98<\x97t\xc1\xd2g0\x00\xacgT\x170/\xcf\xf3f_Tr\xa6\x9b$\xbb\xd4\xbf\x1b]\x99\xb9\xe6\xf6_\x20\x0dMW\xa4\x1d\xb7^\xd5\xe6\x13=}hkAu6\x9bG\x96;ci\xde\x9a\x9b\x99S]\x8ed\xe3\xb6a\xee\xabG}g9\xb6\x92;\x8b\x1a\xddL\x83i813\xa6\x01\xb8X`\xe7\xf0\x10R\x96\x9b\x8fv\xf9\xc4\x91o\x98\xd9>\xd2u\x0a\x9e8\xcfv\x94\x86\x90\xc3\xcc\xfd\xfeX\x88\x16V\xc5\x9d~\x8b\x83\xc2\x9a\xee!\x01\x93\x18t\x1e\xa2}\xb3\xce\x92\xe80\xaf#\\H\xb2\xe4CS7\xba\x85\x01`=\xa3\xbe\x80a\x1a\x0c\xb2[\x96\xb4Y\xfc,\xa9v\xf0+\x1fb\x91m\xceh0\x0dp\xe8\x9f'\xe40\xb7RX\xc0d\xb9\xf9JN\xf3W\x9d\xb5GK\xb8\x13,\xad$`\xf5G\xe7\xde\x11\x0cWXn\xd1\xcbp\xc1\x90\x80I\x0c^\x1a\x8e\xde\xb8\xf748'\xaf\x01\xe3~\xeeE(\x19%`-\x18\x00\xd63*\x0b\x98_p~\x8d\xf3\x01I2`z\xc8\x92B\x90n\x15y\x80\xd8s\xcfs\x1a\xf2\xb2]\x8c7\xc6\x82\xd7\x84\x05L\x96\x9b\xbf#\xb6\x8a\xc7\x87\x0e7\xf6\xdbO\xc7\x17\xb0\x13\xa2\xdf\xea,\xcb\x0dy\xafpD\xc0\xa4\x06o\xef]\xa8\xe4\xca\xeeD\xf7\xc0&\"\x91[e\x026\x04\xf1\x0e\x81u\x8e\xba\x02\x16h\x12\xc2\x09\x12\xa9\x92&E\x01\x1bU[\xc0\xbc\xe8:\xdd0'~\xf9\xb6Q\x06{\x90\x10\x160Yn\xfe\x81\xd8**k\xa8\xf7\xfd\x82\xb2\x80\xdd{I;XO\x18\xaf\xc2\xb9\"\x91\x1eX\xd8\xe0q#\x91\xae\xb7}\xfaNY\x0dd\x9c\xca\xc2S\xcb\xeb\xa5\xd4i\x16?\xd5\x03\x00\xd6\x12\xea\x0a\x18nfa\xe9\xfd\x96\x1eY\xb2G\x1cB\xaa>\x8d\xa2\x20\x87(\x93\xeb'\x1a\x92\xecB,\xbc\xe1\x17,\xc8PX\xc0d\xb9\xf9\x07ck8L\x05%X\x15#`F#\xc6\xaf\xa9_kL\xf0~5\xde\xa6\xafJ\x02&1h\xe5X\xc40\xe35Y\x0d\x84\x0b\x95\xa1i\xf8\xd2\xdc@^(85\x00\xacST\x160\x17\xdf\xedt;\x99\xe7^\x92\x9ci\xb18\xdc\x0eK\x8b\xea\x8f!\x1d\x199ug\xb2\xd26\x9a\x9d\x18\x9fB\xa5\x96\xf6\x0a\xd4\x14z\x0a9\xc8\xba\x83\xe1\xdc\xf9A[n\xa1\xcd\x16\x1d\xc0\xa3\x95\xbb\xd0y\xbb\x8a\x0c\xfb&\xc4\xa7\x90\x13\x82\xd4\xb4\x16u\xf4\x9f.\xa6=\xa5\xc6\xdd\xf5\xfd\xdf^!\x9a\xf3\xeeO\xec\x19\xa2\xe8\xcez\xda\xc9u\x08a\xaa\xc3\x06\xa4\xb2\xe2\xd6\xe1\xfe+\xdc#y\x0d\x18?\xe7B3\xf6\xa5\xb9\x97\xd1(\x06\x80u\x8d\xca\x02\x86==\x16S\xdb\xa0?*\xe9\x1fj3\xb7\x0d\xf9\x13\x17]\x0e\\\xfb\xb2\xb6\x9e4oD\xc7H\xbak\xa76\xeb\xd3\xbb\xe4b\xb2\x98\xdbk\xa3\x93Y\x84r\xc7\xd3Xnt\x9f'\xd8QYt\xa8\xfe~\xa5\xce8W\"\xfc\xbaQx`8w\xe33\xbdQ\x10\xa8\xb1\xd3e%F\xd2\xb5z&\xf8\xbajY\xe6l1I\x0a\xbf:\x0a\x1b\xe0\xfb\xc6\xdb\x87u\x06\xe3\xa3\xe8\x1a\x88n\xe9E/\x98$\xd7\x96~\x12\x03\xc0\xfaFm\x01\x03\x96D\xf0\x86\xae/*\xabES\xa1\xfa\xb4\x13\x00Xe\x80\x80\xa5\x06\xc1\x0e\xc3+Y\x867\x1b\x16\xa3\x00\x00\x100\x00\x00R\x16\x100\x00\x00R\x16\x100\x00\x00R\x16\x100\x00\x00R\x16\x100\x00\x00R\x16\x100\x00\x00R\x16\x100\x00\x00R\x16\x100\x00\x00R\x16\x100\x00\x00R\x16\x100\x00\x00R\x16\x100\x00\x00R\x16\x10\xb0UG{\x81\xfa\xd1\x99\"x\x0b\xda\x93\x99\x00\xc0\xaaAm\x01\xf3t5\x9b,\x03\xbe\xa8d`\xbc\xdd\xd4\xe6L\\r\x859\x86\xd2,\xc9l\x16L'\xc7E/.\x11\xa6\x01\x9d\x93\xed\x7f\xd0\x13S\xba\xb5\x09\x83^6\xa4\xc1\xaf\xc4\x81\x94Ae\x01\x9b\xe6\xadN\xb7\xb3\x8d\xaeb(I\x06\xac\xe6Q\xf7\x03\xd3\x83d\xa5W\x12\x8fmS]2\x9b\x05\xf3\xd6^\xd3\x8a\x95\xf9M\x9aY\x9e\xb1\xf4\x13\xf7*\xafwh\xcd\xb8\xa5\x98\x1f>\xbe\xf1j\xc2\xe3\x00\xb0zPY\xc0\\<\x0d\xec\xe3\xe3\x9d\xb2\xe4C\x13\x1d4\xb9L\xab{\x85w\xcd\x12uD\x91\xb3q\x04lRs*&o\xa9'\xdeQ\xaa\x9c\x9f,\xf2\xc0\x19\xa5\xe8K\x00\xb0\x1aQY\xc0\x84\xa8\x8a^\xde#KZ\xd9\xf2\xf8\xb8\xe9A\x9cB\xab\x83\xa5\xea\x88\"\xf1\x04\xac\";V\xc5\x97zb\xa55\xfc\x17\x82/\xbb\"\x99\x09\x00\xac\x0e\xd4\x160\xc2\x8c\xdbb\x0d\xc8\x92m,\xba\x19n\xbf\x9b\xa0\xd4r0\xbe\x11\xa13\xae\xf2\xad\xe9{\xe8\xda\xa6M\x05\x19\xb9\xd5L>l{r6i\xf7ne6\xae\x03\xdaM[\xf6zHJs\xb2:7cOl\xe7\xc4\xbc\x85E\x97tg\x8a!\xd82%&\xef\xcat\x8d\x06\xc3\xa3\x1b%\xc6Y2p\xbc`\xd0\x1d>\xfb\x8c\x1d\x20\x02v\x83.*\xfd\x0a\xe3\xe0\xfd\x9a\xe2\xca\x9b\xb3,\xdb\x9f\xf9y\xa8\xa8\xd2\x89}\x07\xb359\xfb\xc61\xf5\x8cm\xe2\x95.'|\xe9V\xf1j\xf2\xe5\xcd\xf4\xa5#\x94\xd6\x8c\xa3k\xf0\x96ksN\x9e\xd4n\x16\xbcmg\xd2U\x8fN\x00\x00KBu\x01\xf3\xf2\xa6A\xd6\xd8cI+\x12\xc3\x1e)\x9f\xd8g\xa1o\xdc',\xcc\xae&\x8b\xc8Qy\xd4\xe5H.]6\x84\x0c7\x93\x92.\x0eI#5\xb4\x20\xd2\xab\xfb\x1a9Dk7\xba\x85\x01\x20\x15P_\xc00\xbd/\xbb\xe5I\xaf\x95t\xc6\x06\xad+0\x03)?\xe4\xb0.\xdd\xe6\x9f'\xe4T\x90\xfb7{\xeb?\xf3\x0f\x03\xb4#u\x17=\x0c\x9bj\xa8g\x88E\xf1Vd\x12\x85\x90\x0d\xeb\x0c}D\x9cfqc=I\xbf\xea\xac=Z\xc2\xb1\x18\x92g[[\xc5\x20\x92\xf5G\xe7\xde\x11\x0cW\xe8N{H\xc0\xe2\x9c\xd8{}\xcf\xb6L\xb4\x9d\xe5\x1e\xc1\xb1\x97#\xb9t\xb9\x80I\xfd\xf2a\x01\x0b\xd7p*\x0b\xd3`\x98\xa1\xf7\xdfMe\x1c\x00R\x00\x95\x05\xcc/8\xbf\xc6\xf9\x804I\x98\xf1\x06p\xd3@\xfc\x82\xcbE\xfe\x0e1\xb1]T\x1f\xda\xbb\xf1\xf1\x07\xf3\xd0\x16:\x1d\xea2\x8ax\x834t~V\x9d&\xb6\x0e\x11\x9bU\xc0&\xcb5\x8c\xe0\xc7:\xcc\x04\xec\xf1\xa1\xc3\x8d\xfd\xf6\xd3\x82\x80\x1d*\xa9<\xcfF\x8d'\x84hk\xdcY\xba3\x18\x1a\xbc)\x9fxhK\xce\xe7m\xb6\x9d\xdb\xe5\xb9R\"\x97.\x17\xb0\x1d8BX\xc0\xc25\\F^\x1a\xc47\xd4\x03\x1bB+\xf0I\x00\xc0\x12PW\xc0\x02M\x82\x8b\xe7\xa1)\x20Ib\xcc\xe2\x83\xb9\xd8\xb3I\x95\xc9\x0f9\x91\xca\xb7\x8d2\xc8\x9d\xfc\x80\xced\xf0\xb5\xa4_\xc7\xb8G\x12;\x96\xb9\x8e\x12\x08\x982\x861\xfc\xb8H\x10\xb0\xca\x1a\xea\xa9\xbf\x20\x0a\xd8\xd4\x8b\x92\x0e\x9a\xaa?\xfa\x84\xc1\x82\x0e\xf94\xe2,V\xe5\x13\xe7\x15\xd0Q\xe0\x81\xed\xf2\\\x09\x92K\x17\x05\xcc\xc4\xba^\xf9R_YX\xc0\xc25\xb8\xd3\xf6\xba\xc7s\x0bB\xf3+\xea4\xab{B\x0b\x00\x84PW\xc0p3\x9b0\xe1\xb7\xf4\xc8\x92N\x9e\xc8\x86\xaf9\xe4\xbfV\x93p/\xa5\x0b1\x0f\xdc\x17\xe4\xa6\xaeC\xec\xd2\x0a\x8f\xd1\x19\x05\x85t8v\xbc\x1a\xc7\x170wCt\xb8n)\x12\x01;|\x81\xec\x07\xab\xc4!$\xc6#:\xea\xc3\x1f\x13\xbc_\x8d\xb7\x99y\xe96AE\x94O\x9cCu(\xb0=\xbe\x80I.\x9d\xbc\x16b<-4K6\xa3\"V\xc0F\xd1\x16\x84vz\xc4\xe3\x81\xbc\xe8\xf0\xbd\x00\xb0JQY\xc0\\|\xb7\xd3\xedd\x9e{Yr\xc8\xfd\xb0\xc9\xaa\xfa\xd7\xfe\xfc\x20{R'\xe8\xcf)Tji\xaf@MT\x056\x9f\xb3\xb6U\xb0\x07\x82\xbd?\xc9\xbb~\xf782\xd1\x09\xf1G\x06\xf1\xe8\x91M6OT-\xfbb\xc2uK\x98\xfa\xacc\xb6O75[\x7f\xfa{\xdc\xca]\xe8\xbc]\xc5\x95\xdd\x99xk\xaf\xf9rbn\xb6\xd6\xf0\xe85\x91\xae\xdd\xf5\xfd\xdf^\x11\x7f[\xe4J\xbb$\x14T\xde\xc9\xf6\xac=n&`\x81f\xba\x88\xdf@\xb3\xfaK\x1a\xc6aG\xa9\x98p\xd0%\x9a\x03\x9f\xe6&\xb4~O\xe2\x05\xe9\x9e\xd4\x9c\x8a\xc9[L\x90\xee\x05\xd8\x0eE\x02@\x9e\xd1\xac\x9e\xef\x0f\x00X(*\x0b\x98\x10\x9a\xd0+\x84\xefp\x98}\x1e&`N\x13\x0d\xc1\xe339\xe3\x97S\x97\xf0\x12\xf2L\xc0\xf0o\xd0r\xaev\x1dO\xc0*\xb2c\xcf\xba\x00Q\x0a\xb3\x00[\x89\x80\xf9\xb2a)\x0a\x20\xf5P[\xc0\x083n\x8b\x95\xf6\xb5|&\x17\x16\x04\xac\xe7.;pw\x19Gjq\xf0\x96ksN\x9e\xd4n\xa6\xee\xa2\xeb\xf9\x19\xdbi4\x1f\xab\x18`-\x1f\x87\x04\xac<\x87\x197\x15d\xe4V3Q\xf1}\x9e\xb7\xb9p0\xe7ntu\xe6-luiw\xa6XE\xa6\xa4W\xf3\xaeL\xd7h0<\xbaQb\x9c%\x03\xc7\x0b\x06\xdd\xe1\xb3\xcf\xd8\x01\"`78\x8e\xd3\xbf\xc28x\xbf\xa6\xb8\xf2\xe6,\xcb\xf6g~\x1e*\xea:\xa0\xdd\xb4e\xaf\x87\xa44'\xabs3\xf6\xb0^\xec\xc1lM\xce\xbeqL\xbd]\x9b\xf8P\xae\x14\xcd\xf1\x8a\xec\xac}\x82\x93+\xd46yR*`\xf8Lz$\x90\x1b\x00\xa4\x08\xaa\x0b\x98\x97\xe7y3S\x01k7\x16\x05\xacMX\x06~@\xf5Ga\xfe\xbc\xec\xaf\xcfi\xd2M\xbf\xb8\x8c\xf1\x11\xcd\x19\xeb\x19M9\x91\x86\x01\x16\x03\xc3F\xfb\x83\x0ed\xf59?G\xac/S\x91v\xdczU\x9bO\xb4\xd7\xb7M{\xe9\xee1\x84B:\x10f?\xda\xc3\xaa5_\x150\xfb%\x07\x1f\x95p7Ose\xb7\xcb:h8\xee\xaf\x1e\xf5\x9d\xe5hT\"*`\xdf\xd7s\x1d4}\x85\xbb1\xd2y\xa8\x8a\xc5\x8b\x1c\x0d{\xdez7\xe77t\x9fC\xe4\x1a\xb1\x06\xe55\xb7o\xa1\xb1\x89\xac\xa8\xa2\xd7\xb2/m\x88\xf4_\x9b7\"m\xdd\xa5Li\xe44\xccl\xf3[Z\xb6g\xd0\xb5\x0a\xc3m\x93%\xe5\x026\x20I\x03@\x8a\xa0\xba\x80a\xaf\xc7\xc1B\x119\xa9\x8c\x09\x02\xd64\xc4\x8e\x0c5%,\xb8\x0c\xb4\x20\xd2\x85\xf9\x9a\x05t\xedb}\xad.\xc4zU\x92!$\x85\xdd\xeeVD]\xeaC4huy\x96\x87$\xabc\x05l\xb2N\x88p4=)\x20_\x1b\xdap\x11\x8fp\xc3\xf8\xe2W\x18\xcf\xf6\x91nV\xf0\xc4y\x9aM\x04\xac\xa3\x88E\xe9\x1e\xe6\xee\x93\xd7\xc7\xc2cIk(H\xf7L\xce\x1e?\x8d?GgTh\xb6\x90\xd7\x0a-I\xf9,\xf4[\xe0\x13\x1a\x87\x17k\xb2H\xef\xab\\\x8b\xe5h\xf2H\x97j&\xb7@\xd66Y3e\x02\xe6F\xb70\x00\xa4\x18\xea\x0b\x18\xa67c7\xf5x\x05\x02\x01wS\x80\xf4h\xda\x84`\xd6\xbdmI\xca}pNe\x91\x17\x17\xa2=\xbf\x8aOXN\xde\x11\xfa*\x11\xb0K\x83\xd6\x82t*%\xa5\xdb\xfc\xf3\x84\x9c\x0a\x1c\xc8`\xb3\x1b\x9c\xb1\x02&2\x89B\xc8\x86u\x86>\"N\xb3,D$~\xd5Y{\xb4\x84\x13CD\xb6rL\xbfp\xfd\xd1\xb9w\x04\xc3\x15\xba\xd3\x1e\x12\xb0\xbb(\xb2\xd0\xb3\x86:\xaa\xceih\xd2{}\xcf\xb6L$\x84\x88<\x12\xce\x95\xa0\xf9\x82\xbe^G^i\xdbd\xcd\x8c\x12\xb0\x16\x0c\x00)\x86\xca\x02\xe6\x17\x1e4\x8e\xf3\x81I>\x84\x07\xf7\x08\xb3\xc1\xda{\x12\x15]\x0e.\x93\xbb\x9btGh\x0f\xec\xd3},go\x01}\x95;\xf1}i\xd4\xb3\xb5]\xd4\xa4\xfd\xe4VgJ\xeb\x8b+`\xd8f\x15\xb0\xc9r\x0d#\xf8\xb1N\x88q\xfb\xf8\xd0\xe1\xc6~\xfbi1HwI\xe5y6j<\xc1\x09\x9c\xa5;\x83!q\xb9\x8c\"\xce)\x16\xb8\x9b\xc5\xa2\x1d\xda\x92\xf3y\x9bm\xe7vy\xae\x14\xc1\x89oC\xa3\xd2\xb6\xc9\x9a)\x13\xb0!4\x80\x01\x20\xc5PW\xc0\x02M\x82_\xe7\xa1)\x10\xf0R\x1cf\xaf7\x80\x9d<\x1d\x0e\x85&W\xa8\x88;m\xaf{<\xb7\x80\xaaj\xc56\x96\xb35\xd2\x03\xa3\xf3\xd2\x04'~&\x15\x88\xf2m\xa3\x0c/\x0e\x08\xa1\xad\x1d\xf1\x05L\x19I\x90\xee\xca\x1a\xea\xa9\xbf\x20\x0a\xd8\xd4\x8b\x92\x0e\x9a\xaa?\xfa\x84\xf1\x8a\xee\xf84\xe2,\xd6\x1eI\x9c\xd9H0\xed\xbc\x02\xfa\x9e\x1d\x88\x1f\xa4\x1bkhTolB>i\xdbd\xcd\x94\x09X\x9df9\x1f\xb5\x02\xc0\xb2\xa0\xae\x80\xe1f\xaa\x07d\x08\x19\xeaky\xc4y`T\xd7z\xd5\x9f\x076\x8a\xb6\x20\xb4\xd3C\x93V6\x82jA\xac3XX\x88\xf14\xb2\x84\x04lK\xf5x\x1d\xe9\xa8\xb1\x99\xed_\x10\xb1(\xd5R\x7fTy\xac\x80\xb9\x1b&\xa3\xb3$H\x04\xec\xf0\x05\xb2\x1f\xac\x12\x87\x90\x18\x8f\xe8\xa8\x0f\x7fL\xf0~5\xdef\xe6\xa5\xdb\x84\xf7\xc3\x97]H\x9f\x05\x1c\xa7z\x14\x91\xaa\x1c\xea\xb3\x0flO$`9\xd4u\x96W(k\x9b\xac\x99R\x01\x0b\xe4%\x88/\x0e\x00\xab\x14\x95\x05\xcc\xc5w;\xddN\x8b8\x13?\xe0q\x98=T\x0b\xdc\xa6\xde\xc9\xde\x15\x98\x89?\xaa\xe9\xb1\xda<\x82N\x94\xa7\x9d\xb2\x9eJ\x13\x1e\xcf\x9d\xd3\\j\xdf\x95A\xaeg\x9cy\xbbw\xee=\xf2\x09\xc6\xa7P\xa9\xa5\xbd\x02\x11\xc9\xf5d\xe7\\o\xdb\xaf\x89\x15\xb0}(\x81\x0aL}\xd61\xdb\xa7\x9b\x9a\xad?\xfd=n\xe5.t\xde\xae\xe2\xca\xeeL\xbc\xb5\xd7|917[kx\xf4\x9aH\xd7\xee\xfa\xfeo\xaf\x88\xbf-r\xa5]\x12\x0a\xf6\xfe$\xef\xfa\xdd\xe3\xc8Dg\xd7\x1f\x19\xc4\xa3G6\xd9<\xb8\x0e\x1d\xbc^\x97\x8f\xb4\x0d\x83\xd2\\)\x1a\xb4g\xb0\xa7\x20\x8bJ\xaa\xa4m\x91$\x9b\x89\x7f\xd9f\x13\xde\xf6\xcbh9\x7f0\x05\x00\xcb\x83\xca\x02\x86==\x16S\xdb\xa08\xbb\xc0C]`\xcd,\xd5ej\xf7$(\xb6L\x0ch\xa8WkS!u\x82\x05~\xb3=c\xfb\xd7\x82\x98\xf9\x8fg\xa5\x17\x0eal!G\x1b\x88\x8c\xe5ji\x8f\xa5k\xa76\xebS\xf6\xf8\xce[\x91\x93\xbe\xebA\xac\x80\x99\xb5|tV\x98`\x19\xc7\xf5\x15s\xc5}\x1cw\x1e\x07;*\x8b\x0e\xd5\xdf\xaf\xd4\x19;\xa9\xd3\xeb)\xc9\xe4\xe8|\xd6\xb1\xd3e%\xc6\x11\xb1\xc4\x99\x9f\x88^)\xd7\xc1\x9c\xcc\x826:\xe3\x8b\\\xac#\x83\xbc\x1e\xc3\x81\xcb\xb9\x1am\xa9y\x9b\xa6P\x9a+%\xaf\xee`fv\xb9\x87&%m\x8b$\x8f\x88N=\xf6\xab\x03[\xfaI\x0c\x00)\x87\xda\x02\xb6\xaa\xf0n>\xe6\x9d\x9f\xf7\x0d\x1d\xc8Z\x8a\xfb'\x81\x13\xff\x03Q\xad\xb1$3\xf9@\xb4h*\xe6\x93\xd9\x00\xc0\xeac]\x0bX{\x96\xd0\xe1\x0ahc\xe6\xd4/\x80\xe5\x170|9G>\x93l\xb9\xf0f\xc3b\x14@J\xb2\xae\x05l4\xcd\xc1\xb6\x8e\xb4\xc8L\xab\x85\xa3\x82\x80\x01\x00\x90q~\xef\xa6\x00\x00\x20\x00IDAT\x90u-`\x81\x8a\xf4c-\xbd-\xc7\xd2\x97\xf2;fW\x17\xaa\x1eT\xfd\xb9)\x00\x00\x12\xd6\xb5\x80al\xdd\x93\xad\xc9\xdecMf\xa6\xc4\xa7\x08\xa1\x8d\xaedV\x00\x00,#\xeb\\\xc0\x00\x00He@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00P$\x15f9\x82\x80\x01\x00\x10\x8b\xa7b\x0b\xda\x9f\xcch\xe5\x01\x01\x03B\x0c\xd7\xbcNf\xb2\xec\xb4\x17x\x93\x99(\xb1\xc4b\x80\xb7\x20N$\x9d@^\x1e\xdf\xa3\xfe\x02W\x8bFm\x01\xf3t5\x9b,\x03\xa1\xc5\x1f\x1c|x\x12|\xaf\xea\xcb\xb1~\x08\xaeq\xe2\xe2]\xcb\xc7\xa3\xdd\x9c1\x88\xfb9n\xf7\xa3x&S\xb5\x9f\x95\x18\x1f\x9d\x98\x88w|a\xdc\xe1Z\x83\xf8>\xc7q\xb7\xf1m\xf2z/\x81\xe9\x0b\x1d\xf7K\xb2\xf9\x92F\x83{\x11\xdf\xcc\xbe[\\#[\xff,\xbe\x91\x8c\x06$.C\xfb\xd7ke\xfa\xda`b\xe3\x08\xe1b\xb1\xd0\x06q\x9f\xd5>\x8dw|\xa9|\xc5qt\x15\xdd\x0e\x8e\xfb*\xea\xc8\xd8\xa1a\xa5\x02\x1f\x8a\x0f\xdc\xa0\x864\xe5\xdf\xf1\x8f\xb3\xa5\xd3@S\xf8\xc0P\xfcR\xcbH\xef\xfb-\xe3\xf7\xbd]'\x09K\xfb\xe8\x89RR\x82rnb\x83\xb91No\xc7\xb3\xfd\xdc\xd8\x9cB\x01\xca\x13\xdd\xd9\xfe\xbe\xf3\xef+\xa5\x9d,$\xd2\xdb\xfb\xdc\xed\xd7\xf8\xf5\x1d\xee\xfe\xdb\x04\xb6\xc1\x89/\x8b0m\xbd\xbd\x93K\x20\x9bs\x13\x87j\xed\x84\xfb\xdc\x08^\x10\xbfI3\x8b\xa9\xd3\x87:/\xea\x13]\x82\x94H\xb1Xh\x83\x1e\xdd\xaf\x89\xaf\xfeK\xe4e\xf1\x9d\x1f\xc8\xe6\x87;\xc5/\xa3\x8e\x0c\x17\xf7\x8b\xa9\xa4\x1f\xf7R\xf8\x20\x0d\x92\\\x99u\xe3U%\x8b!$\x0f\xe8\xb0ZQY\xc0\\<\x0b\xca*\xae~o\xedq\x8b\x02\xe6\xb1\xac\x90\x80\xed(Mf\x91\x84\"\x89\x80\xd5\\PJJP\xceMb0\xcb]\xfc\x92tz\xb8\xd9\xd8C\x02\xb5\xa7IW%\xf8\xe5\xfb\x09\xd8\x0b]#\xdbNqc\xe4\xf5\x117\x95\xd8\xbc\xb5H\xd8>N$`\x18\x1f\xbdF_\x9f/P\xc0&5\xa7\xc4\xd4\x0f\\'\x0e\xc6mp\x14\x91bJ\xb0\x06\x05\x8d\x95\x09L\x96\xc4\x09\xa1\x8bz\xefD\xcc\x91p\xc71\xe9\xc7\xbd(\xbc\x85\xc20\xf9C4Hzeg4J#\xc5\xa1\x14\x09\x13\xaa\xb2\x80a\xd6\xf5\xf2\xf2\x1e\xbaq\x98}\xc2\x9a\xf8\xb8\x97\xef5\xad\x8c\x80\x85\xe3\x0f-\x15\xa9\x80U]PJJP\xceMb0\xcb=*\x9eM$`G\x99\xf4Lq\xa1/\xfe%q\xc5\x20\xd4\xbf\x1c\x026\xd7\xb9\xb0\xbeTEv\xc8\xb7\xf0\x82[\xc40,RL\x09\xa1A\x9d\xf1\xdf\xbe%r\xfe\x1b\xb6i<\x1f\xdf$\xe9\xc7\xbd(\x1cHX\xfc\xe9C4Hze\xbel\xa5\xc5X@\xc0\xe22\xe3\xb6X\xe9\x03Z\x9f\xc9%\x06\xf5\xc03\xbePp[U\xb1\x8a\x8b*\xe7\xd3\x1d\xdb\x9e\x9cM\xda\xbd[c\x8c\xcc[\xd82\xd1\xeeL\xd18S\xfe}U\xd4x\xb3R_\xfb=\x8dJ+P#K^\xe3t\x9d_\x19>;\xfbB\x96K\xbeA\xef\xd7\x14W\xded\xff\x83\xf6\xda\xc3\xba\xb2\xda\xc3A\xb9A\x84Y\xeeEU\xbf(`\xe1b\xad\x1c\x1d2\x0a+Q\xd7\x1b\xa8\xda\x04Gd\x06\xcft\x1c\xf7\xcd\x8b\x8bG\xf5\xb5\xef\xa8\x95\xe0\xd7\xeaS6\x20\xe5\xe6\x8a\x85\x0e\x98T\xc0\xde^0\xe8\x0e\x9f\xa5\xee+\xd2\x8a{b3\xc9\xc0\xb1\xdePr\xe1\xcbh\x01S\xaeW\x100,:\x0b\x05\xd7\x99\xac2\xfc\xe2B\x99\xee\x90\x90\xf6g~\xce\xb2\xe6\xca\x84\xf7\xe1\xe6\xe2\x8a\x9d#\x1fN3n&\xafg\xb0\x04\xa1A\xf5\x06\x9aVz\xd7%\x9f\x101\xe8\xac\xd1Wu\x06\xa3\xce\x16\xb6\x95\xd6\xc0\xc2{b|\xa1Q\xd6\xe2\xb7zN\x1c\xcb+\x7f\xdc\xf2w]\x81\xf1\x8d\xe4\xfa]\xe5[\xd3\xf7\xc8\x96\xc8\xbd\x9aku\"\xa75\xf7z\xdc\x06\xcd6\xfe\xb2\xd88a\x18\x91\xbeg\x0b\xfb?;\x93\x1e\x89\xdb\x17\xa6\x17\x04L\x19/\xcf\xf3f\xf6\x8di\xed\x0eE%\xa2\xac\x84\x80\xf9\x06l\xb9\x856\x9b\x8d\x0eh\x87\xd0\x91[\xdd\xbc\x16\xc5\xac\xac\xbc\x1f\xed\xa1\x1b\xbf\xf9\xaa\x80\xd9/;\\\xc4U\xf6\x0d\x97\x91\xaf\xe1\xd9\x09{\xa5\xd1n\xb7?\x97%\xa7\xfat\xdc\xe1\xdb\xb7\x0f\xeb\xa7\xa4\xb9\xa4\xc3\xc3\xdd\x18\xe9\xae\xd5n\xff\xcb\xe2\x8ayK\x0bl>\xf2\x99~Z*[\xc6\x964h\xf6y#w[v\x91\x92w]\xf2\x09a|\xb1\xe8\x9b\x91o\x8a.\xca\xcf\x16\xb1\x95\xd6p\xaf\x06O\x18&p\xd5=y\x8b\x1f\xdb\xedz\xd6)W\xfe\xb8\xe5\xef\xba\x023\x96\xe6\xad\xb9\x999\xd5\xe5\xf2\xa0\xc8\x9er\x94\x87>A\xa5\xeex\x0dz{\xf4\xb3\x8e\x11\xa2]\x9d\xd2\xf7la\xffg\x031Z5?\xdd\xbbcI\xcb\xac\xab\x8f\xea\x02\x86\xbd\x1e\x07\x8bJ\xe4\xa42\xb6\xb2\x02\x86%C\xc8\xebZ*]_g\xc5L\xde\x9b\xac\x13B\xa5MO\x0aD-\xf2\\t\xe8\xaf\xe4\xdf\xe4\x10K+\x0e!\x8b\x8e\x92\xf1\xd3\xdb\xc35\xb2\xdca\xe61\x7fL\xbf\xab;\x0f\xd1\x1b\xa3\xb3$\x18UC\x18\"`\xaf\xf4\xaf\x98\x80I\x8a\xddg_\xb0\xf8\x04\xcd\xf8\xe1\xf6\xbf\xe8\xb8\x92>y\xbd\xa42\xee\xf4[\x1c\xa4\xa3\xb7+\xf5\xe4\xa5\xfeJ|\x03<\xc2\x89\xff\xceS\xe2\xd73\xb9\x9dg\xfb\xc8)\x83'\x98b\x14\x95\x90\xbe\xc8E\xdaLc%\xcb\x8d\x12\xb08\xf5\x1e\xa5U\xb1\xbe\x820\xd6\x16F\x9e\x91\xca\xe6\x0e\xd7\x12\xe1\x9d\xeb\xa3\xfep\xd2!\x0e\x07\xa5\x8b\x0c!\x17Q\xcc\x9c\xc76\x9f\x84\xff\xa7\x18B\x83.\xd2\xb77\xce\xbb\x1e\xf9\x84FX\xe7f\x8c\xb9\xec\"g\x93\xd8Jj\xb0\x97\xe1F]#\xfe\x8c\x09\xbf\xe4\x9d\xc4X\x1f\xf2*(}\xdcQ\xb6J\xe4\xa3]>\xd1\xd9\"\xa1k\x13\xda\xc4V>Wn\xd0Ez\xb9\xf8\x06\x110\xe9{\xb6\xa0\xff37\xba\x85\xe5\xec'\xdd\xd8%-\x92\xa7>\xea\x0b\x18\xa6q!\xbb\xc9\x00\xd2\x19\x08\x04\xdcM\x01Q1VZ\xc0\xdc\xd9[\xff\x99\x7f\x18\x90w\xaf$L\xa2\x10QCH\xfa\x14]\xf4\x08)\x0b\x18\x1b\x9bur?Hs\xeb\x8f\xce\xbd#\x18\x88\xa6\xbc4\x1c\xbdq\xefip.\xba\x860D\xc0pm\x07\x130I\xb1g\xdc\xdc\xec\xfd\xb7\xef\x8a\xc4\x09\x0asc\xb5\xf4\xb6\x93\x18\x90\xca\x8aB\xdf\xf2\x8f\xf4\xa4\xb7\xa6\x7f\x84\xe3\x1a\xe0~N\x9c\x0e1\xc5\xddy\xfc\xf8q\x07\xf3\x81\xbd\xea\xac=Z\xc21/5\xed\x95\xb0f\xbe\x15\xe6W|\x13%`q\xea=z\xf6\xf1\xe3\x8b\xb1\x02\x16\xaa\x8c(\x86d:@{2\x01KRl<\xcd\xef3\xfb\xe65\xe3X\x0am\xd0p\x0d\x9b\xed\x11\xe7]\x8f|BW\x04\x8f\xfc\x89/\xb1\xf4l\x12[i\x0d\xdc\xac\xf1\xa2q\x96cM\x95\xbc\x93J\x02\x16\xef]W&_\xc1\xab\xee\xad\xd6\xe4\xa0l\xcdIo\x9c\x06\x05\x85\x93NE\x09\xd8\x82\xfe\xcf\xdc,V\xa8\x14w\x17\x9f\x07=0%\xfc\x82\\\x8d\xf3\x81I>\x84\x87e\xad\xb4\x80a\x1f\x7f0\x0fm\x89\x1f\xdc\xc2f\x15\x88z\xba,\xb9\xc1\xe2\x08\x18\xfb\xcf\xb2sO\xa4\xb9'\xc4~\xceY\x92~{\xefB%Wv'Q\x0f\x0c\xf7W1\x01\x93\x14\x9b\xd3Mup\xad\xcf9\xf2\x0f\xf9\x989j\x82\xc6\xb3\xf2zqU\xd8\x99\xf6\xee\xb3~\xdc_\x16\xc4q\x0d\xf0Dh((\xf1\x81=>t\xb8\xb1\xdf~Z\x10\xb0P3\x1f\x0bc\xcdh'~\x9cz\xa9\x0flJx\\'U\xa2p\xb2\x83\x93\xcc\x0d\x19\x8c\x0ce\x94\x05,I1\xff\xc6\xf1\xcb\xe8_\x9di\xf2/!\xd6\x20Av\xe3\xbc\xeb\x91O\xc8\xc8.\x1f\xd7\xd6`\xd9\x89#\xb6\x92\x1a\x82ES\xc5\xcf\x8a\xa7t\xc2\xe7&\xf5[\xc6\x0aX\xbcw]\x99\xfc\x1d\xb1y\x0dZ\xde\x89\x9c\xbf\xd1\xd6\xc5i\xd0\xf7\xc2#\x9c\xd9(\x01[\xd0\xff\xd9\x10\x1a\x88>\x1d\xf9wG+sC.\x16u\x05,\xd0$\xb8+\x1e\x9a\x02\x01/\xc5a\xf6z\x05M[I\x01\xa3!u\x1f\xd0G\xf1\xbe\x96\xf4\xc5\x06\xea\x88\x11\xb0{/\xe5\xc9\xa2\x1bt\xff\x1e\xf7V\x9a[\x7f\xf4\x09\xe3\x15\x91\x80F\xea\xc1\xe8\xd3wF\xd5\x10\x86\x0a\xd8l\xf1\x98\xd0\x03\x0b\x17\xc3\x95}\xa7\x8d\x95\xfdt\x20i`g\xc0\x8d\x95r\x03\xe9\x7f\xe9\x8d\xf3\xf8<\xb3\x8ag0\x1bz\x9a*\x11\xb0\xca\x1a\xeav\xbb\x20\x17\xb0\xbf\xb2[\x04_\x8c\xe9\x81)\xd6\x1bv\xe2\x8b5|\x13\xa5Dc\x9cd\x8a\xabO\x13\x9e\x8e\x1a%`\x0b,\x96\xd7\xbc\xf3\xd3\xbc\xf6<,ChP\x09-\x1b\xe7]\x8f|BW\x8e2G\xfdQ\xda\xf9\x8a\x9cMb+\xfb\x00\xee\x18\xb0\xa1\xa3\x92\x9dD&\x08r\x01\x8b\xfa\xb8\x95\xbf\xa4d\xe4\x1fP\xc8\xf4\xb3\xa7\x90T\x9b\x15\x1b\x14\xd43\x9f\xd8\x7fD\x04\xec\x9b\"\x1c\xb7\xc5\xf2\xff\xb3:\x8dBg\x0b\x9eB*\xd2\xcc\xa6\xf7\xfa-=\xe2\xfe\x8a\xfb\xc0\x0a\x0b1\x9eF\x16\xf2)\x0a3\x8f\x0b\xe5\xc1a\x09\xee\x86I\x9c\x00\xa9\x80\x19\x8d\x18\xbf\x16\x1c\x1d\x91dQ\x19\x91\x81\xd9\xa3FY\xee\x98`\xd5x\x9b>Od\x93\xa4\x8c\xd7\xa2j\x08\x9f\x98\x0a\x18\xbeXO\x05LR\x0c\xd7\xdf\xd0\x8dp\xd7\xe8?b\x99\x81\x0eO\x83\xf4\x9fRj\x20\xbdS\xfe\xa4\xff\x8b\xfeO4\x11\xcf\x00_\xa8d_\xcdR\x01;|\x81U+\x170\\s\x98\x9c\xed\xb9>J\xc0\xe2\xd4+\x110=\x19\xa8\x05\xff%J\x89f\x0dF\xda\x97\xba!Hp\xe9\xb6\x80h\x1c\x11\xb0\xc5\x14+\xfdgM\x17:\x165\xb3Oh\xd0\xa1\x1bS\xb7\xe3\xbd\xeb\x91Oh\x84\x19\xf4\x09>\xb0\xf0\xd9$\xb6\xd2f\xd6\xd6\x90o\x05c-;\x89\xb2\x80)}\xdcr\xdb\xc9:\x85\x89\xd4q\xa6\xf6\xb8\xb3\x84\x91\xa5r\x83.\x94\x11\x91\x0a^d\x02\x16y\xcf\x16\xf2\x7f\x16\xc8\xdb\x1bs.\x10\xb08\xb8\xf8n\xa7\xdbi\x11g\xe2\x07<\x0e\xb3\x87\xce\xce\x9b\xf1x\xcc\xbd\x1eub\x20\xca9\xa7\xb9\xd4\xbe+\xc3M\x05l\xf39k[E\xe8AX\x84}H\xe9\xf3\x15\xf9\x8b]\xf7\xe5D\xf0\xe9\x97:\xfa\xc8\x8c\xfc\xbbw\xf4\x9f\x16ffG\x92E\\M\xdf\xbd\xca\x92\xe7\xf2\xdc\xc6\xdd\xf5\xfd\xdf^\xa1\xffB\xad\\q\xebp\xff\x15\xee\x91\xdc\x20|\xe2\xb91\xae\x7f\x16?\xd2\xb3\xa7\x90\x91b\xf8\xb6\xbe$X\xc9\xbew\xcb8C\xebH\xffi\xfds\xa9\xc1\xbb?\xb1GM\xa2g+h\xa85\x08\x02\x15\xc7\x00?\xe7\xee\xd0\x8dt&~+w\xa1\xf3v\x15\x19uLH\x9b9\xa57\xdc\xfe\xe63Nw\x7f\x0a\xbf\xa43\xf1;\xec\xf6\x97q\xea\xa53\xf1'f\xc5\x13\x18\x0f\xdd\xb9]C\x8b\xc9\xde\xb3G\xfa\x13\x9d#7\xc4\xdf-\xb9\xd2.\xb1\xad\xf0\x14r\"\xb8\xc8b\xb8!#3\x90\x9b^\x87eL\xb1\x1b\xf7t\xed\x97'\xe2\xbd\xeb\x92O\xa8\x9ek\x1cn\xe4\xea\xe5\x1f\xac\xd4V\xf2\x01\xdc\xd8}\x07\xdf\xd9M4T\xfaN\xceM\xd8\xed\xfa/\xedv\xe6\xa3W\xf8\xb8\xa3\xde\xf5}hsT\xefg~\x90=\x19O\xf0\xa5\xa9\xdc\xa0\xbf\x18\x0ew\xf6\x9f\xd73\x01\x0b\xbfg\x0b\xfa?\xbb\x8c\x94~\x8d\xf2@i\\\xb9\x0aQY\xc0\xb0\xa7\xc7bj\x1b\x14\xbd\x14\x1e\xea\x02k&\x89\x07\x827l\x05\xdc\x86\xfe\xe3Y\xe9\x85\xb4\xf3\xd7TX\x97\xb3)\xbb0F\xbf\xb0Y\xcb\xc7\x16\x0bq\x8d\xe38\xdd\x7f\x14\x93W\xfa\xc56w\xe33\xbd\xf11;\x10I\x16\xdd\xbcRb\xb8\xf8\x97\xa8\\\xa1`\xe7\x09\"\x8dA\xf9\x07+\xfb\x84\"\x1f\xc0\x88\xfe\x19\x9e*\x1e\x96\xbf\x93O\xc5\xb7\x84I\xab\xc2\xc7\x1d\xf5\xae\x9b6G\xbb\x9a\xc6\xd3\xd8\x93\xa2\xf8_\x9aq\x1a\x84_]9\xac?\xfd\x98\x09X\xf8=\xc3qZ,\xbd2[\xfaI\xa5\xd3Lo<8>\x1d\xc0\xab\x1e\xb5\x05l\xfd!\x9d\xaa\xbf\x9a\x09\xde\xd0\xf5\xe1\x95\xa6ZcIf\xa2\xc4\x12\x8b\x89\xac\xe4'\xd4\x8e>\xe8\xb7\xb6\xe0\xc4_\x0c-\x9a\x8a\x98\xa9\x8f\x8c\xf6<\x04\xcb\xe9\x00+{{,\x8a`\x87\xe1U2\x9be\xe7r\xce\x92\x1c\x09K,&\xb0r\x9fP\xc0\x9c\x15\xe3s}/\x16-`\xde\xec\xf8\xcf\xdd\xa7\xc7=q\x8f\xad\x1a@\xc0\x96\x9b\x95\xbb=\x80\x85\xb1r\x9f\x90G[\x1dw\xe2\xe1\x92X\xb4\x80\xa5<\x20`\xcb\xcb\xf7\xcc\x19\x9c\xcc\x0aX9\xd6\xd2'\xf4b\x84\xbb\xf9\xa75\xd2\x96\x05\x02\x02\xb6\xbc0gp\x825\xff\x80\x95f-}B\xc65\xd4\x96\x05\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x96j\x04\x02\xf3\x01\xfa\x97\xcc\x0e\x00\xd6\x01\x20`)\x86kG^\xde\xdeO\xf2\xf2\xaa?\xe8o\xe8\x00\x205\x01\x01K-\xe65hg\xe1G\x19;wl\xf8W\x85P2\x00\xb0\xceP[\xc0<]\xcd&\xcb@\xa8\xf7\xe0\xe0\x85\xd0\x01>\x9b\xc5\xd4>\xae\xfc\xab\xf8\xb5\xc8\xd2\xc3\xc3\xfb>\xae\xfb\xdb\xdf\x9c\xff\xdf\xdf\xfe\xef\xc7\xfb\xbc\xc9l\x01`\xcd\xa3\xb2\x80M\xf3V\xa7\xdb\xd9&.h\xe83\x0d\xb0\x15Y}\xe6v\x87\xfb\x81\xb9}\xcd+X(\xa2\xfbR\xc2\xc3\xbfe\x0bV\xcd|\xb2a\xc3\x86@\xe9\x86\x0d\x1f\xd5I\xc6\x90\xbdJK\xd2\x01\xc0\xdaGe\x01s\xf1tY\\\x1f\xefd{\xd6\x1e7\x13\xb0\x1e\x0buI{M\x0f\xe2\x17\\\x1b\x84#\xba/:<|\xf0^\xc9i\xba\x0dx\xaa\xf3\x89\x80\xfdh\x7f\x83K\xb2\x8e\xc1\x8e\xa8e\x94\x01`\x9d\xa0\xb2\x80\x09\xd1\xee\xbcB$\"\x87\xd9'\xac\x89\xdf&,G\xd7\x9b\"\xa1\xe8\x96N\x95L\xc0\x16\x11\x1e~\xaa\x86;+\x84\xa4\x0e\xf8x\"`\x1bG\xbd\xd2uX\xe2\xac\xa2\x0e\x00k\x1d\xb5\x05\x8c0\xe3\xb6Xi\x8f\xcbgr\x89A=\xc25\xaejJL\xd2\xf5\x9e\xb8\xff\x1c%`X6\x84\x8c\xc4\xa5\xd7\xd0\xf0L\xf8_\x89\x05,\x1c\x97>\"`\xa5\xdb\xfc\xf3\x84\x9c\x0a\x0c\x00k\x0b\x95\x05\xcc/\xc8\xd58\x1f\x98\xe4Cxh\xce|\xaf\xf8drM\xd0\xb1\xfb\x15\xed{\xd1\x8e\x934Z}\x94\x13?axx\x09/j\xb9\x9a\xa9\xc8n\xb4\x0f\x0c\xcb\x05,\x1c\x97>\"`\xdbE/Y\x0a\x04\x99\x01\x80E\xa1\xae\x80\x05\x9a\x84\xb8\x8b\x0fM\x81\x80\x97\xe20{\xbd\xcc\xa1om\xf2$,\x99Z\xbc\xe4j_>\xab4\xd2~\x934Z}$\xa2{\xf2\xf0\xf0R$^0\x1c_\xc0L\xac\xeb\x15\x89K\xcf\x04\xec\x8c\x86\xbc\x94o\x1be\xac\x99!:\x00\x88\xa8+`\xb8\xb9\x8b\xbe\xfa-=\xe2\xbe\xe8\x03\xf3\xb6\xb4\xf9\x88\xbc\xad\x99\x1f\xc7<\xe1\xca8\xee4\x9b\xf7\x20\x8dV\x1f\x89\xe8\x9e<<\xbc\x1c\xfa\x1crLL+\x08Xa!\xc6\xd3\x88MF\x89t\xc62>'o\xe9\x0e\x0dIu\x09\x87\xbe\x88\x8aY\x0d\x00)\x8f\xca\x02\xe6\xe2\xbb\x9dn\xa7E\x9c\x89\x1f\xf08\xcc\x1e\xd2-p\x9bZ\xdc\x1e\x8fg\xe0}\xa2\x93\xae*\x9e\xe9\xc7F\xec\xdf\x0b\x8e\xabp\xb4z,\x89\xe8\x9e<<|4S\xc6\xd0\xf0SA\xc0\xcei.\xb5\xef\xcap\xcb\xe3\xd2\x7f\xaam\xa8+@\x1b\xcddh~\x0a\x95Z\xda+\x90\xe4\x89\x09\x00\xac\x09T\x160\xec\xe9\xb1\x98\xda\x06\xc5I\x98\x1e\xea\x02k\xc6\xf8\xae\xe8\x0d[3\x13Y't\xd4\xab\xa53R\xcfU8Z=\x8eDt_@x\xf8\xf8(\x08\x98\xffxVz\xe1PT\\zWaz\xe6\x9e/\x10\xa2\xa1S\xbbvj\xb3>\xbd\xabT\x1b\x00\xa42j\x0b\xd8\xba\xe0u\xf1\xb5\xd7\xef\xde\xbd}z\xfe\xb3\xb7\xc9L\x15H\x16\x9cTA\xc0\x00`\x9d\x02\x02\xb6\x0c\xf4\x97\x08\x1d\xae`Y\xf4\x9c\xfa\x85\x00\x02\x06\x00\x0b\x05\x04l\x19x\xc2\x09\xb3\x1e\xa6\xb8%,\x98\x13-`\\\x14\xff\xf9?\xd1\xd5(>\x1f\xf8\xb01\xe9\x01\x20%\x01\x01[\x06\x82W\xf4\xd7\xfa\x1e\xf5]\xd3\x7f\xb5\x840\xef\xd1\xe1\xe1\xa3\xf4\xeb?\x85\x96\xd3i\x03\x05\x03\x00\x10\xb0\xe5\x208\\k\xd0\x19j\x87\x97\xa0_I\xc2\xc3\xcf\xd0\x05\x0d\xff\xdf\xbf\xfd\xed\xff~\xbc\x1f~\x9b\x0d\x00\x20`\xa9\x85\x0f\xa1\x9d;?\xde\xb2s\xc7\x86\x0a\x98\x96\x0a\x00\x20`\xa9\xc5\xbc-'++7++k\xd7\xd0\x9a\x99\xf6\x0b\x00K\x06\x04,\xc5\xf0{&]\x93\x93.\x97\x1bF\x90\x00\x00\x02\x96r@\\H\x00\x08\x03\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x96\xfalXq\x92]!\x00,\x13\x20`\xa9\xcf\x867+\x0c\x08\x18\xb0R\x80\x80\xa5>\x20`\xc0\xbaEm\x01\xf3t5\x9b,\x03\xa1)\x00\x0eq\x05\x1dy.\xb08@\xc0\x80u\x8b\xca\x026\xcd[\x9dng\x9b\xb8\xa0\xa1\xcf4\xd0\x14\x9b\x0b(\xf2\xf6/\xf1\x8e\x80\x80\x01\xeb\x16\x95\x05\xcc\xc5B\x0f\xf9\xc4\x00\x1e\xd6\x1ewSl.\xa0@\xf0^\xc9\xe9x\xc7$\x02\xb6`-[\xb0\xe1\x9b\x05\xd8\x82\x80\x01+\x85\xca\x02\xc6\x02\x16b\xaf\x10\x89\xc8a\xf6\x89k\xe2Ks\x01\x05\xa6j\xb8\xb3\xdf\xc7;\x08\x02\x06\xac[\xd4\x160\xc2\x8c\xdbbe\x91\x88L.I`\xdbP\xee\x1a`~\xcb\xa6/r\xb2{\x8fg\x15Ra\xb6\xed\xc9\xd9\xa4\xdd\xbb\x95\x1e\xf0\x96ksN\x9e\xd4n\x8e^\xfb\xdf\xbc\x85\xa7\x1bw\xa6\x18\xfe,3*B&\x0d\xe91,\xcfz\xa6\xe3\xb8o^\\<\xaa\xaf}\x07\x02\x06\xac_T\x170/\xcf\xf3f\xd6\xe3\xb2vG\"sGr\xd7\x02\xbd\x99\xa8z\x17\xd26l\xb9L\xe3a\x1f\xb9\xd5\xcdk\xd1<\xc6\xfe\xbc\xec\xaf\xcfi\xd2M\xbf\xb8\x1ce\xbf\x1f\xed\xa1\x1b\xbf\xf9\xaa\x80Y\xb6\xd4\x97$\xa8\xda\xdc\x0b\x819<\xd7\xd7w\xb8\xb2\xd8p\xb3~\xf7K*`\x7f\xf8\xf9\xc7\x1f\xfd\xf4\x7f\x13)\xf9\xdf?\xfd\xe8\xe3\x7f\xfc3\x11\x95_\xffx\xc3\x8f\x7fM\x0e|L\xd2\xffH\xfe>\xfe\xa3\x206\xbf\xfd\xe9G?\xfa7\x89!)\xf9\xf1\xcf\xff,\xc9\x88T\xf1\xdb\xbf\xfb\xe8\xc7\xff\xf4&\"`b\x95o6\xd0\x04\xa9#rV\x0c\x00+\x83\xea\x02\x86\xbd\x1e\x07\x8bJ\xe4\xa4\x82\x15\xee\x81\x85r\xd7\x06\xd9\xe5\xd8\x8a\xac\xf8H\x05\xc6\xd7\xb5t\xf1\xe7\xaf\xb3H\xef\xb2\x05\x8d\x93\x14r\xc4\x98O\xd6\x09q\x84\xa6'\x05\xa6eG\xafqU\xa1\xb0\xb6FqUC#\xdd\xa9\xe2N\xbf\xc5\xc1\xb7l\x08\xf9\xd3_\xfd\xf9\xbb\x7f\xff9\x91\x92\xbf\xfb\xddw\x7f\xfcG\"X\xff\xe7G\xbf\xfb\xf3\xef~\xf4\xdb7o~\xfc\xfb7\x7f\xd8\xf0\xc77\xff\xfecQ\xbf>\xfe\xedw\x7f\xf8G\x89!\xd9\xfe\xf9\x7f\xfc7IF8\xf1\xef\x7f\xf7\xef\xdf\xfd\xe1\xbf\xfcSX\xc0\xc2Un\xf8\xd1\xef\xbec\x89\xf0Y1\x00\xac\x0c\xea\x0b\x18\xa6q!\xbb\xc9\x00\xd2\x19\x08\x04\xdcM\x81\x804w\x8d\x90\xdd\x82\x07\x91\x0f\x7f^J\xc6\x85\xd9[\xff\x99\x7f\x18\xa0}\xaaSY\xe4\xc5\x85\xda\xe3\x95\x9aD!dC\xc8\xfbE\x9f\xdd\x17WF|>,\xf0\x9c\xeeT\x15\xbd\x14r\x89\xc0|$\xf6\xaf6\xfc\x9e\xbc\xfc\x99\xf4\xba\xfe\xfe\xffP\xc9\xf9\xfb7o\xfe\xc7\xaf\xde\xfcj\xc3\xbf\xbd\xf9\xa7\xffG0`\xf9RC\xca\x9f\x7f$\xc9\x08'\xfe\x81&\xfe\xf8\xe3\xb0\x80\x85\xab\xdc\xf0[\x9a\xf8\x99\xe4\xac\x18\x00V\x06\x95\x05\xcc/\xc8\xd58\x1f\x98\xe4Cx$\xb9\x89\xca\xa6\x10\xd9]xHC\x14\x8b\x08\x18\xf6\xf1\x07\xf3\xd0\x96\x06\x92\xba\x8c\xbc4\xc8ll\x0f,\x84\xcd*`\x93g\xbf\xa8\xe5j\xa6p\x0cU5b\x82\x08\xcc\xff\xfc\xf8\xbf\xff\x1bU\x13Ak\xc8\xeb\xc7\x7f\x16e\xe8\xb7\xff\xf5\xcd\xcf\xfe\xdb\xcf\xdf\xfc\xfdo\x05\xad\xf9\xe8\xcfoB&\xc2\xeb\x1f\x7f\xfe\xf1\x86\x0d\x1fI2\"U|\xf4\x11\xfd\x99PX\xc0\xc2Un\x08%\xc2g\x8d\xbd8\x00P\x05u\x05,\xd0\xd4\xcb\xb6\x0fM\x81\x80\x97\xe20{\xbd\x01In\xa2\xc2)\x84D\xc0\x1e\x9c\"\xfb\xbe\x96\xf4\xeb\xa43\x96\xb6\xd7=\x9e[\xb0\xf8FJ\xbc`\x12\xaaB\x91n\xa9\xc0\xfc\xfeW?\xff\xf8WJ\x02\xf6\xdd\xc7\x7f\xfc\xe8\x8f\xe4\xef;\x89\x0aI\x05\xecg\xff\xf3\x8fo\xbe\x93\xeaV8\x11\xea_\xc5\x17\xb0\xf0Y\xa3/\x0d\x00TB]\x01\xc3\xcd]\xf4\xd5o\xe9\x11\xf7\x05\x1fXtn\xca#\x11\xb0:\xc4\x1aWx\x0c\xe3Q\xb4\x05\xa1\x9d\x9eXsw\xc3dl\xa6\x0c\xfa\x1cr,*O&`o\x04\x7f}X}X\x8f\x8b\x8e\xf7\xde\xfc\xc3\x7f\xff\x07\xf6'\xf0\xb3\xd0\x102\xf4J\x95\xed\xdf\x15\x05\xec\xef\x7f\xfdFj\x1b\xa92<\x84\xa4\xb0\xb3F_.\x00\xa8\x84\xca\x02\xe6\xe2\xbb\x9dng\xc8]\x1f\xf08\xcc\x1eotn\xea\xe3\xcc\xba\xeck\xd94\xee+\xdd\xe9&\x02\xb6\xf9\x9c\xb5\xad\x02\x91N\xe6\xa8\xa6\xc7j\xf3(t\xc0\xf6\x89\xb1\xb4\x131e\xbc\x80%\xbc\xfb\x93\xbd\xd2h\xb7\xb3\xe0\x1fD`\xfe\xcb\xef\xbe\xfb\xee\xd7?\x95\xa8\xcf\xff\x099\xda\xdf\xfcj\xc3\xaf\xd8\x9f\x00\xc9\x13\x9c\xf8!\xc3\x9f\xfe\xea\xbb\xdf\xffXQ\xc0~\xf7\xf1\xbf\xfd\xf9\xbb\xdf\xfd\xd7\xb0\x80\x85\xab\x0c;\xf1\xc3gU\xbed\x00XvT\x160\xec\xe9\xb1\x98\xda\x06\xc5i\x02\x1e\xea\x02k\x8e\xceMy\x02\xa4\xa3\xd5\x9c\x892,\x08\xed\xc7M\x85u9\x9b\xb2\x0b\xe9\x20y@C\x1d\xf4\x9b\x0ac\x9c`f-\xafPMB\x9e\x09\x8f#ki\x9a\x08\xcco\x7f\xf6\xd1\xc7?\xff\x83D}\xde\xfc\xfa\xc7\x1f\xb19\x0fo~\xbf\xe1\x0fo\xfe\xc0<\xf3\x82\x0c\xfd\xddGt\x0aD\xd8\xf0\xf7?\xfd\xe8G\xbfV\x14\xb07\xbf\xfb\xd9G\x1f\xfd\xecwa\x01\x0bW\xb9\x81&\xe84\x8a\xf0Y\x93]-\x00,\x13j\x0b\xd8:\xc6\xbb\xf9\x98w~\xde7t\x20\xeb\x03\xf74C\x02\xa3\x161\xe7\x03\x01\x03V\x0a\x100\xd5h\xcf\x12F\x8f\x01\xed\xdd$\x96\x8b\x04\x04\x0cX\xb7\x80\x80\xa9\xc6h\x9a0vt\xa4=Lb\xb9H@\xc0\x80u\x0b\x08\x98j\x04*\xd2\x8f\xb5\xf4\xb6\x1cK\xafHf\xb9H\xd4\x16\xb0\x18@\xc0\x80\x95\x02\x04LE\xac{\xb25\xd9{\xac\xc9\xcc\x16\x0b\x08\x18\xb0n\x01\x01K}\x92\x85\xdcX~\x92]!\x00,\x13\x20`\x00\x00\xa4,\x20`\x00\x00\xa4,\x20`\x00\x00\xa4,\x20`\x00\x00\xa4,\x20`\x00\x00\xa4,\x20`@\"\xfc333\xf3\x18\xcf\x93\xcdZ\xf9\xa9*\xb0\x96\x00\x01\x03\x120\x90\x86\x10J\xf7\xf9\xd2\xc9&-j\x9dE\x00Xy@\xc0\x00\x05\x86k^\xb3\xad\x05Y\x87\x86\x1c\x18;\x86\x86\xac(:\x98\xd2Bi/\xf0&3!x\x0b\xda\x15\x92\x00\x90\x10\xb5\x05\xcc\xd3\xd5l\xb2\x0c\x84\x96cp\xf0\xe1i\xe9\x92$\xf0\x01\xf8\x8a\xe3:\xc8\xa6\x83\xe3\xbe\x8a:2v(*D[,w\xb8Va\x15~Kdy~\xb7\x20`\xc7P\xda\"\x85\xac\x01\x9dKf\xc2hHkPH\x02@\"T\x16\xb0i\xde\xeat;\xdb\xc4\xa5\x0b}\xa6\x81PT\"I\x12\xf8\x10\xbc,\xbe\xf3\x03\xd9\xfcp\xa7\xf8e\xd4\x91\xe1\xe2~1\xf5\xe8\x09V\xa4\x93\xbb/\xa6b\x05\xccc\xdbT\xa7X\xa8wT1\x1b\xff&\xcd\xac|\x20\x06\xeb\xc6\xab\x0aI\x00H\x80\xca\x02\xe6\xe2\xe9\x0d\xe1\xe3\x9dl\xcf\xda\xe3\x0e\xa9\x96$\x09|\x10N\xdcc\x9b{'b\x8e\x04C\x89\x1a\xd9\"\xafa^\xe8\x1aC\xc9X\x01\xc3X\xa3,`;J\x15\xb3'5\xa7\x14\xf3\x958\xa3q+$\x01\x20>*\x0b\x18f]//\xef\xa1\x1b\x87\xd9\x17\x8a\x0b)I\x02\x1f\x86\xf3\xdf\xb0M\xe3\xf9\xf8&U\xca\x02v\xc5\x10\x0e\x20\xb2\x08\x01\xcb?\xa8\x98]\x91\xbd\xf0\xe5\x1b}\xd9\x15\x0aI\x00\x88\x8f\xda\x02F\x98q[\xacti?\x9f\xc9\x15\x0al+I\xae\x17\x9a\x0a2r\xab\xc9\xbd=\xbe\x11\xa13\xae\xf2\xad\xe9{\xe6%\xc9(c\xf3\x16\xb6\xe6\xb4;S\x8c\x1b\x99)\xed\x9e\xb4r\x1c\xd7\x87\xfb\xc8k\xab\xb4Lc=\xdb\\h\xc4\xcft\x1c\xf7\xcd\x8b\x8bG\xf5\xb5\xef\xf0[=\xb3&\x0c\x8bArYp\xb6\xe0\xfd\x9a\xe2\xca\x9bb\xf8\xef\xe2p\x07LY\xc0\x8eWdg\xeds\x91^3\xb9\x92/p\x1dy\xb5X\xc5\x0b\xcbg\x16\xa1\xb6\x11\xfc\x99\x9f\xd3\xcd\xbb2]\xa3\xc1\xf0\xe8F\x89\x91\x9e\xc3^{XWV{\x98\xf6\x04_],3\xdc\xbcYV\xcc.\x09\x9fI\x9f\x09\x9dN\x92\x04\x80\xb8\xa8.`^\x9e\xe7\xcd\xec\x9f\xdb\xda\x1d\x8e\xcc-I\xae\x13*\xd2\x8e[\xafj\xf3\x03x\xc6\xd2\xbc573\xa7\xba\x1c\xb9%\xc9(\xeb\xfdh\x0f\xdd\xf8\xcdW\x05\xcc\xd29Y\xaf\xebk\xec\xb3xv\xc2X\xffJZ\xe6^\x0d\x9e0L\xe0\xaa{x\xae\xaf\xefpe\xb1\xe1f\xfd\xee\x97\x18?\xb6\xdb\xf5L\xe8f'XX\x10;\x0b\x92{\x85\xbb1\xd2y\xa8\x8a\x0d.\x9fr\xf6p%\x8a\x02\x86\xf2[Z\xb6g8\xb0o\x20\xe7\xd84\xf6\x9e\xcb\xb4\xf9|\x03\xb6\xdcB\x9b\xcd\xc6\\\x03\xe1\xb6a\x1a\x89I\x08\x99\xf7\xa8\x84\xbby\x9a+\xbb]\xd6AN\xb0\xfbb\xff\xd8\xbd2\xee\x1d\x11\xcb\x13\x86\xceV\xbd\xfe^m\x07\xb3\x1a@\x83\xa1\xd3I\x92\x00\x10\x17\xd5\x05\x0c{=\x0e\x16\x7f\xc8IeLP-Ir\x9d`E\xd4\xb3=\x84Z\xe8N>\xda\xe5\x13\x07\xd7\x92\xa4\x94\xc9:!\xee\xda\xf4\xa4\xc0\xb4\xec\xe8\xfd_\xb2\xcd\x89\x90\xe7]\xc0^\x86\x1bu\x8d\xf83\xa6FU\xdc\xe9\xb78\xf8V8\xa2\x0f\xf5\xd4\xc2C\xc8a\xe6\xb5\x7f,t\xcdF\xb8\xe7\xe1J\x14\x05,\x8f\xf4\x8dfr\x0bH\xb2\x8e\xf6\xb8\x8e\x08\x83\xbd\xf0\x10R\xd66+\x12#\xc6\x19.\x92\x8a\x87\xf1\xc5\xaf0\xee\x8d8\x8b\xd50\x86\x1f\x17\x09\x02\xf6\xb8\x91H\xd7\xdb>}'\xed&\xd6\xbe|Vi\x0cM\xec\xa8\xd3\x84G\xcf\x92$\x00\xc4E]\x01\xc3\xcd]\xf4\xd5o\xe9\x11\xf7%\x8e\xaf\xb5\xeb\x03\x9b\xac\x8b\x99\xe3\xd9%\xa8\xc1\x17\xac3#\x99\x80\x10g.\x82\xbbaR1_\xa4\xfe\x86n\x84\xbbv!\xca\xb6\xb6\xe6<>od\xa1o\xe3\x08\x98\xd1\x88\xf1k\xea\xf8\x1a\x13\xbc_\x8d\xb7Y\xf6\x85\xca\xf0L1E\x01\xcb!].\x7f^!M\xfb\xb5\xd6,\xf1\xb3,$\x19\xd3\xd4F\xd662\xa0\x14\xbe\x95$\x02\xd6\xca\x8d\xd0\x1c\xe35\x8c\x9fpe\x1cw\xfa{\xf1\x14\x81\xbcp\x84rI\x12\x00\xe2\xa3\xb2\x80\xb9\xf8n\xa7\xdbi\x11g\xe2\x07<\x0e\xb3\xc7\x1b\x9d\\s\xecC\x9bcz\x13\xa7P\xa9\xa5\xbd\x025\xe1\xf9A\xf6\xfc\x8e\x8a\x8e$\x19SC\xc2\xdb\xf9\xb6\xbe$X\xa9\xbf\x1de{c\xf7\x1d|g\xf7\x0d\x8c\xdf\xfd\x89=od\x9e\xad\xb9\x09\xbb]\xff\xa5\xdd\xce\xfc\xf9\xadE\x1d\xfd\xa7\xd9L\xfd\xc6\xdd\xf5\xfd\xdf^\x11d\x0c?\xe7\xee\x84jV~\x0a\xb9g\xb0\xa7\x20K\xb8\xccS\xdb\xb2\xc49\x1f\xe74\x97\xdaweP\xf3p\xdb(\xae\xb4Kt3\xf5Y\xc7l\x9fnj\xb6\x9e\xa8U+W\xdc:\xdc\x7f\x85{\x84\xf13\xfd\xd8\x88\xfd\xfb\x90^^Fa\xa5\x97$\x01\x20>*\x0b\x18\xf6\xf4XLm\x83\xe2,\x00\x0f\xf5{5G'\xd7\x1c\xa6\xcdh(&\xb3k\xa76\xeb\xd3\xbb\x18\x8f\xa71\x87\x11\x15\x1dI2\x0a\xb3\x96\x8f\xcd\x8c\xf0\xb8\xa4\x15\xdf)~\x1ce;\xa2\x7f\x86\xa7\x8a\x87\xa9\x93\x9f\xc1\xfabOEo\x17\x9b\xa6?w\xe33\xbdQ(6v\xba\xac\xc48\"\xd6\xd7\xaa\x0fy\xc1,\xc8\x15ZN\xc7\x15\x12\xb0\xbc\xba\x83\x99\xd9\xe5\x1ea\xc7\x85B\x13N\xfd\xc7\xb3\xd2\x0b\x85v\x86\xda\xc68\xf3\x93\x01\x8c\x83\xa4\xa3\xd5W\xcc\x15\xf7q\xdcy|\xdfx\xfb\xb0\xce`$\xfa\x85't\xf4btF\xe6\x04\xb3\xa5\x9f\x14\xcbH\x93\x00\x90\x00\xb5\x05l]\xd2\x8eR\xcb\x9f\x13\xbc\xa1\x13\xfabl\xaejh9\x1d\xa4\x14P\xdc\xa7\xe9U\xc8\x95Q\xad\xb1\xc4;\xf4\xba\xf8\xda\xebw\xef\xde>=\xff\x19\xe9\x11\xb6h*B\x13x%I\x00H\x04\x08\xd8r0#\xce\xd7b\x93\xc9\x03\xe6\xacc\xc9\x0a\xac2\x82\x1d\x06aR\xec\xfc\xf8Ph9\x9d\xa1q%M\xb1h\x93+\xcd\xe5\x1c\xf9\xbc\xb5\x08\xfd%\xc2\xe81X6\x82\xbd\xd9\xe1\x15($I\x00H\x08\x08\xd8rP(\xce$`\x8en\x8f\xb6z\x8d.fZ\xd7\x8bw-l\xa9\x9c\x89'\xb4\x8b\x00\x00\x20\x00IDAT8<\x11'PLqO\x93X\x02\x80\"\x20`\xcb\x81K\x9c\xaf\xe5Jf\x98\xd2\xf8P\xfe\xb1E\xfcT[\x81\xe0\x15\xfd\xb5\xbeG}\xd7\xf4_\x051\x00,\x01\x100`\xc9\x9c\xdb\xbc\xd3\x99\xcc&1\xc1\xe1Z\x83\xceP;\x0c\xfa\x05,\x0d\x100\x00\x00R\x16\x100\x00\x00R\x16\x100\x00\x00R\x16\x100\x00\x00R\x16\x100\x00\x00R\x16\x100\x00\x00R\x16\x10\xb0u\xc9\xbaY\xb7\x08X\xe3\x80\x80\xad?<\x15[\x84\xd5\x06\x01\x20\xd5\x01\x01[w\x04\xf2\xf2\xf8\x9eD+W\x03@\xca\xa0\xb6\x80y\xba\x9aM\x96\x81\xd0\xefO\x1c\xbc\x95nf\xcclAi\xf3Z\xfa\xc9`\xb7\xd6\x1aJz\x8fmI\xdf\xfb^\x836k\x96\x15/\x94\xd0\x89\x8f\x20\x842\x94~\xcb4\x8e\xba\x14r\x01\x20\x15QY\xc0\xa6y\xab\xd3\xedl\x13\x174\xf4\x99\x06\xd8\xaaw>\xfe\xa1\x87\xb0\xa6\xd63\xb4f\xdc\x0a%wm\xb9~$\xfd\xbd~3\xf89\xfa<\x99I\x98\xd0\x89\xdd6\xdb\xd7\x8a\xa1\xc9\x86\x90|I}\x00H]T\x160\x17O\xc7.>^\xf8\x09\x9d\xb5\xc7-\x0a\xd8\x1a\x1c\xd1\x84\xbb\\^t\x15\x07\xdeK\xbf\xf0\x19t&\x99I\x84H_o(\x8e\x80A\xc4E`\xad\xa0\xb2\x80\x09!\x0f\xbdB\xf8!\x87\xd9\xe7Y\xbb\x02\x16\xc6\x85\x16>\xfe\x8bC\x1d\xaaKf\xa2\x04\x08\x18\xb0\xd6Q[\xc0\x083n\x8b\x95\xf6\x12|&\x17^\xa3\x02FW0Mc\x0bd\xfb\xb5\xc2\xca`\xd5Q\x16\xc1\xfb5\xc5\x957g1~\xa6\xe3\xb8o^\\<\xaa\xaf}'IFY7\x20\xb6\xc2\x9f;S\\g,S\xfa~\x1dC\x9b\xf8\xea\xdc\x8c=\xaco\x1b>1EY\xaazA\xc0\x805\x83\xea\x02\xe6\xa5\xdez\xd6\x0f\xb3v\xe3\xb0\x80u\xdf\xe2\x9bm3\x89K\xa6\x12\x0fl6!|\"~hkAu6\x9b'\xca\xe0\x0awc\xa4\xf3PU\x10\xcf\xf5\xf5\x1d\xae,6\xdc\xac\xdf\xfdR\x92\x8c\xb2\xbe\x8a.\xd3\x8d\xdf|U@\xf6\xb8\xc3\xd9\xbc\x11i\xeb.e\xb2\x88l\x91\x13cE\x01\x9b\x9f\xee\xdd\x91\xf5~\xe3Y\x00X=\xa8.`\xd8\xebq\xb0\xa8DN*c!\x01k\x1aw;--k\xe9)$N\x0f\xe9\x88\xd2\x10r\x98\xbbO^\x1f\x0ba\x80\xaa\xb8\xd3oq\xf0mTR\x0a\x8f\x84@\x1d\xd3\xe2R\xd5QK4k\xb2h8F\xad\xb8\x97\x9eH\xc0\xf6\x93\xfe\xdb{\x8fh\x01`\xb5\xa0\xbe\x80a\x1a\x17\xb2\x9b\x0c\x20\x9d\x81@\xc0\xdd\x14\x20\xa3\xc9\x80\x83v\xbef\xcckjh\x93P\xc0\xea\x8f\xce\xbd#\x18\xae\xd0\x9d\xaa\xa2p\x8fK\x92\x94bFf\xba\x99D!\xe4Cn\xcd\x11L\xc3\x9a\x89{\x09\x05\xcc\xdd\xc5\xe7A\x0f\x0cX3\xa8,`~\xe1\x11\xd98\x1f\x98\xe4CxB\x07mm\xf1\x8a\xa5\"\x09\x05\xec\x84\x18\xdd\xec,\xdd\xa9\xaa\x09\xe7K\x92R\x06\xb2\x04%\xb2\x89KUG\xcd\x83`\xd1\xaf\xeb4\xe2^B\x01#\xd8\x14\x82\xbc\x01@j\xa2\xae\x80\x05\x9a\x84\x20\\\x0fM\x81\x80\x97\xe20{\xbd\x01\xdc#\xdc\xe1\xbdkjl\x93\xa4\x07\xf6\x84\xc1b\xffH\xc2f\xcb\"h/\x18\xe6\xf5Z\xb0\x80\xc1SH`\xed\xa0\xae\x80\xe1f6\x09\xdco\x11\xc3\xd1\x8b>0+\xebzy\xcd\x0f\xe3\x94JI\x12\x0a\xd8\x98\xe0\xfdjd\xd1\xb4\x17\x20`\x89\xe7\xf1\x83\x80\x01\xeb\x15\x95\x05\xcc\xc5w;\xddN\x8b8\x13?\xe0q\x98\xe9\xfc{7\xdf\xe5r?0Y\xdf\xeb\xe76\xab\x09\xff\xa0\xcd\xa69b\xb3\xf9BO!\x07\xa3\x9b\xd6\xb8\xbb\xbe\xff\xdb+D\xc6\xde\xfd\xc9^i\xb4\xdb_\x90\xb5\xfeY2S\x8c\xbf\xa4v\xe1\x15\xc7\xfez\xadL_\x1b\x14w\xeep\xad4\xe9\xd4\x9a\xb1I\xeb\xc2\xb8\x02\xa1Kd\xff\x12B\x15Q\x95tk\x17\xbdv\xee\xe8F\x7fv;\x9e\xde\xf4ET~\xf8lK\xa6!\xad!\x99\x09\xb0vQY\xc0\xa6y\xab\xd3\xedl\x13\x174\xf4\x99\x06\xd8\x8a\xac\xd8\xdf\xcd\x0fN\x8e\xf2\xef\xf3\x7f\xbcNx\xf4$&kn\xe2P\xad\x9dp\x9f\x1bIj\x8b\xbf\xb7\xdb;\xb9\x89\xd0\xde\xe9C\x9d\x17\xf5b\x0c\xa4N\x16(\x09\xe3\x1eT\x8d\xabQ\x0f\xc6\xee\xcd\x0dt\xbc\xe7m\xc8\x8c^\x13\xd1\x9aqKL\xf5\x8e\xe2\x851\xa4\x09l\xb5\xe0\x064\x19\x95\x1f>\xdb\xd2\xb1n\xbc\x9a\xcc\x04X\xb3\xa8,`.\x16\xc2\xd6\xc7\x0b\xeb\xfbY{\xdc\x82\x80\xf5\x98<4bd\xcc\xaa\x7f@45JkN\x1f\xbdF_\x9fG\x0b\x98\xa2-\x0d\xe6\x16\x12\xb0\x1f\xb8N\x1c\x9c\x15\xd2/t\x8dB\xe2\x01:\x87\xcf!*L\x9f\x98X\x86i{L\x15\xe1\xe5\x10w\xc4,\x97\x18\x07\xefF\x13r\x04\xb6\xee\x8a\xce\x8f\x9cm\xe9\x9c\xd1\xac\xb1\xb8\xc8\xc0\xc2QY\xc00\xebzy\x85HD\x0e\xb3OX\x13\xdf\xc3?\x0c\x1f\x03\x12\xa2\xb8h\xbe\x20`s\x9dQ\xf1$\xe3,\xb0\x1f\x11\xb0\x17\xdcp8\xf7\x8aAT2\x17\xba\x8c\xaf\"\xda\x19>p\x86e|q\x00\xc7%\xff`\xfccr\x8e\xa3\xbd\xb8\x17\xc5\xf8\xab\"g[:\xbe\xec\xe81.\xb0nP[\xc0\x083n\x0b[\xfd\xdegr\x89A=\x06M\xf3I\xc2V\x00\x94a\xd1\xd9\x15\x1d{M\x100\xca\xdb\x0b\x06\xdd\xe1\xb3\xcf\xa2l#\xb9\x14Q\xc0\xe6\xca\x04\x83\x9b,s\xaeX\xec\x80a/j\xc2\x16D\x07\x8f_\x08\xdd\xab\xd2/\xf0\xf8F\x84\xce\xb8\xca\xb7\xa6\xef\x99\xc7\xbet\x84\xd2\xe8:\xe0\xd8*.Z\x9d\xcf\xcc\x9a\x0a2r\xab\xc5\xef\x20\xf3\x16\x1eG\x11p\xce\xe3\x83Z\xba\x96\xb8\x85\x14\xa9\xc3u\xe4\xd5\"=[\x1c\x82\xf7k\x8a+o\x12q}\xa6\xe3\xb8o^\\<\xaa\xaf}'I2\x9b3\xe9k(\xa8;\xb0(T\x170/\xcf\xf3f\xf6\x7fn\xed\x0eE%j\xb7:\xdb\xf8\xe6\x01\xf8/L\xc2\xec\x04\x8b\xfaa\x7f\x1e\x95\x7f\xf4\xca\xdc\\\x87\x91\xa6\x86\xb9\xaf\x1e\xf5\x9d\xe5\x1e\xcbm#\xb9\x94P\x0f\xec\xa9\xbd\x8fk\xb5\xdb\xff\"\xecpv\xb1\xb2@\xce\x20\x1e\xca\xa1\xdf'\xa6\x1dx\x90\xec\xe4\xf3x\xc6\xd2\xbc573\xa7\xba\x9c>I|`\xb3\xb10H\xd87`\xcb-\xb4\xd9ll\xe4_\x91v\xdczU\x9b/|\x0f\xedG{p,\xa2\x0b\xdfg\xcb<\xe3\xc5\xde\x7f\xcd\xa2\xa1G\"g\x8b\xc3\x15\xee\xc6H\xe7\xa1\xaa\x20\x9e\xeb\xeb;\\Yl\xb8Y\xbf\xfb\xa5$\xc9l\x06\x20\xce\xd2\xbaEu\x01\xc3^\x8f\x83E%rR\x19\x13\x04\xcc\xc27\x8d\xbb\x9d\xcd\x16\x7f\xb2\xb2\x80\xf2\x10\x92\xf6\xa4\x0c45\xdbG\xfa*\xc1\x13\xe7\xe5\xb6\xb2\\\xe5!\xe4\x08\x17\xad\x8a\x18\xdb\xb4\xf8s\xcdI\xace\xb1<\xf3\xd1._x\x94\x1f\x8e\xdc\x16\x1eBZY\xec\xf0!\xd4\xc2\xf6&\xeb\xa2\x9d\xf5\x94\xb0\x0b\xbf\x82v\xedJ\x174\xee\x1bf\x8f\x16\x1e\x0bQ\xe8\xaa\xb8\xd3oq\xf0mT\x12c7\xba\x15\xaf<\xb0\xc6Q_\xc00\x8d\x0b\xd9M\x06\x90\xce@\x20\xe0n\x0a\x90o_\xab\x89\xde\x18>3D\x8cN\x8a\xb2\x80\x9d}\xfc\xf8\"\x130\xfc\xaa\xb3\xf6h\x09w\"\xcaV\x9a\xab,`\xfd\\l477\xf2\x15\x1e\xf9\xd4\x87\x98\x8b<_\xea)\x8f\x15\xb0\xd2m\xfeyBN\"U\xda\xb6SL\xf4\xa6\xfb\xb0/\xa37\x81i\x98\xfa\xa3s\xef\x08\x86+t\xa7\xaa\xe8e(_\x92\xa4\x17\xda\x12[\x12X\x17\xa8,`~a\xb00\xce\x07&\xf9\x10\x1e\xdc\xcb\x02\xdb\xe2^\x98\x92\x98\x94\xb8N\xfc\xa9{4\xf5\xf8\xd0\xe1\xc6~\xfb\xe9(\x01\x93\xe5*\x0b\xd8DdnE\x98\x80\xc6\xb1yt\xb3c\x13\xfb\xcc\xf2wH\x8e\xc4\x0a\xd8v\xd1\x1f\x96\x20\xda\x91\x0d\xb5\x89\xcf/\xe7\xb5m\xb8]\xbb\x20\xaf\xe7\x09\xd1\x95w\x96\xeeTE\x9c\x7fUR?\xe0\x10D\xba\\\xb7\xa8+`\x81&\xe1k\xf7\xa1)\x10\xf0R\x1cf\xaf7\x80G\xcd\xec\x9f\xb9g\xd1\xd3#\xd7\x1fL\x94\xeeIz\x1f\x94\x88\x13\xbf\xb2\x86>K\xbc\x20\x110j+\xcbU\x16\xb0\xd9\xa2V\x1cCnC6\xce\xb9\xb4\x8d\xa5\xf3\xa5\xcf\"\xe5\x02f\"}\xb3\xf2m\xa3\x8c\x04\xee\xf8R\xad\x1fW\x08\xde\xb3\xe3\xfb\xf1\xfe\xe3\xf1-%\xd4\x1f}\xc2xEw\xe2\x850\xaf\xd3\xc0\x03\xec\xf5\x8a\xba\x02\x86\x9b\xbb\xe8\xab\xdf\x12\x9a\xb9(\xf8\xc0\xbcl\x1a\x85\xcf\xf4\x20N)\x20\x8c\xd1\x88\xf1k\xc1#\x84\xdd\x0d\xa2O)\"`\x87\xe9}\x1d\xac:!\xb7\x95\xe5\xc6\x99Fq\xa12\x88\xa3\xd9[\xb0\x1f\x1f(\x10\xfc\xf1\xb2\x09\x13a\x01+,\xc4x\x9a>M\xec\xa2/\x18\x7f!\x1c\x08_\x99\x04\xaf\xe6s<\x8a\xce\xa5M\x93\xf4\xa0\xc6\xa3Q\xf0\xbbO\xd6\xc5L\x08\x1b\x13\xda\xdax\x9b\xbe\xc6\x11\xb0@\xde^\x0c\xacST\x160\x17\xdf\xedt;-\xe2L\xfc\x80\xc7a\xf6\xd0\xef\xec\x07\xa6\x07nGS\xdb\x87\xfe\x9d\xdc\x1a\xa4\xb5\xa8\xa3\xfft\xb1\xd0\x03\xdb\x87\xd8\x8dKg\xe2O\x88\x93\xb8Z\xb9\x0b\x9d\xb7\xab\xb8\xb2;\x13R[I\xeeK:\x13\xbf\xc3n\x7f\x19z\x0a9!\xea\xd6s\xeeN\xcc\xc9\xaaQ\x03n@\xa4\xab4?\xc8\x9e72U\xf2\x0f\xdal\x9a#6\x1b\xfb\x08\xcfi.\xb5\xef\xca\xa0\xde\xb1S\xa8\xd4\xd2^\x81\x84\x89\xc9\xe2\x95\xc9\xb8\x84\\\xb8yk\x80\x09W\x20{O\xb6\xc2\x08r\x1f\xda\x1c\xd3\x95j\xdc]\xdf\xff\xed\x15\"c\xef\xfe\xc4\x1e\xabRW\x9d$I\xb9\xfc\x9e\x13a\x81\x14Fe\x01\xc3\x9e\x1e\x8b\xa9mP|\xdc\xe8\xa1.06\xa5\xc8\xd5nn{\x00\xfa\x95\x9c\xb9\x1b\x9f\xe9\x8d\xe2|\x08\xb3\x96\xcd\xb6b\xbf\x85\x14\xfad8\xd8QYt\xa8\xfe~\xa5\xce(\xb5\x95\xe4^\x14}J\x17\xf0\\\x09K\xe8BO\x1f[\xf51^0k\xc68vd\xb4c<\x9e\xc6\x1c\\L\x95\x86\x844b\xe7\xf6\x1f\xcfJ/\x14\x9e\xbdt\xed\xd4f}zW((^\x99\x8cm\xa4\xb3f\xd3X\x85G\x02\x975\x97c\x0c\xc8Xt3\x8a}\x8e3v\xba\xac\xc48\x82\xf13\xe1\xc2k\xb1,I\xb0\xa5\x9f\x8c)\x04\xac\x17\xd4\x160`\xb5\x12\xbc\xa1\xebKf\xf3\x1eL3\x17~\x01J\xf8\xdb\xa3v\xb4xgV\x8b\xa6\x02\xbe\xf9\xd6/\x20`\x80H\xb0\xc3\xf0*\x99\xcd{\xc0z^~W\x82g\x8f\x01s\xd6\xb1\xf8G\xe3\xe0\xcd\x86\xc5(\xd63\x20`\xc0j\xc1\xa3\xad\x86\xa9\xcc\xc0\xe2\x00\x01\x03\x00\x20e\x01\x01\x03\x00\x20e\x01\x01\x03\x00\x20e\x01\x01\x03\x00\x20e\x01\x01\x03\x00\x20e\x01\x01\x03\x00\x20e\x01\x01\x03\x00\x20e\x01\x01\x03\x00\x20e\x01\x01\x03\x00\x20e\x01\x01[\x0eJ\x91\xb6\x1cb\xc4\x01\xc0\xb2\x03\x02\xb6\x1cxz\xcdy\xda\xc5\xff.\x19\x00\x80\xc5\xa1\xb6\x80y\xba\x9aM\x96\x81\xd0\xbd\xed\xe0\xe9\"\xac\xf3M\xe2\xe2\xd2\xcd\x89J\xa6\x18\xbdh<\x99\x09\x00\x00\xef\x89\xca\x026\xcd[\x9dng\x9b\xb8\xa0\xa1\xcf4@\x17\xc0\x9b\xe1G=\x84\x07\xfcZ\xba\xe5\x87\x20\xd4\x17\x00,;*\x0b\x98\x8b\xa7\xab\xaa\xf8x\xc1Ad\xedq\xb3\x15<\x1d,(Q\xd3\x9a\x8a\xcc\x00\x02\x06\x00\xcb\x8f\xca\x02&\x04\x16\xf4\xf2\x1e\xbaq\x98}\xc2\x9a\xf8\x8c\xbb\xb7\xd6\xd4\xbat\x20`\x00\xb0\xfc\xa8-`\x84\x19\xb7\xc5J\x97\xb5\xf3\x99\\8\"`N~:A\x99\xd4c\x1c-(\xee!\x00\x00\xef\x81\xea\x02\xe6\xe5y\xde\xcc\xfaa\xd6n,\x11\xb0p\xa0\xa25\x82_[0\xe0^P\xe8C\x00\x00\x96\x8a\xea\x02\x86\xbd\x1e\x07\x8bJ\xe4\xa42\x16\x1607/\x09\xfc\xbc&\xb8\x8b\x10\xda\x97\xcc\x08\x00\x80\xf7A}\x01\xc34.d7\x19@:\x03\x81\x80\xbb)\x20\xf4R\xba-I\xca\xa4\x1a>\xed\xd6\xcb=kM\x94\x01`\x95\xa1\xb2\x80\xf9\x05\xb9\x1a\xe7\x03\x93|\x08\x0f\xcd1?HP*\x15\x19B\xdd\xc9L\x00\x00xO\xd4\x15\xb0@\x93\xe0\xd9~h\x0a\x04\xbc\x14\x87\xd9\xeb\xa5\x9a\xe6]s#Hx\x0a\x09\x00\xcb\x8f\xba\x02\x86\x9b\xbb\xe8\xab?\xec\xb1\x0f\xf9\xc0&\xf9\xb5\xf6\xc3\x1b\x100\x00X~T\x160\x17\xdf\xedt;-\xe2L\xfc\x80\xc7a\xf6xi\xca\xc9\xaf\xb5\x80Z\x83\x20`\x00\xb0\xec\xa8,`\xd8\xd3c1\xb5\x0d\x8aj\xe5\x09\xff\x00\xd2}+A\x99\xd4\xc3\xef\x19-\xd5x\x92Y\x01\x00\xf0\x9e\xa8-`\xeb\x83\xfd\x08mmOf\x04\x00\xc0\xfb\x02\x02\xb6\x1cxF\xd7\xda3\x09\x00X\x95\x80\x80\x01\x00\x90\xb2\x80\x80\x01\x00\x90\xb2\x80\x80\x01\x00\x90\xb2\x80\x80\x01\x00\x90\xb2\x80\x80\x01\x00\x90\xb2\x80\x80\x01\x00\x90\xb2\x80\x80\x01\x00\x90\xb2\x80\x80\x01\x00\x90\xb2\x80\x80\x01\x00\x90\xb2\x80\x80\x01\x00\x90\xb2\xaco\x01+E\xdarg2#\x00\x00V+\xeb[\xc0<\xbd\xe6<\xad\xb0\xb4\x8f\xb7\x20\xfc\xebkI\x12\x00\x80\xd5\x8c\xda\x02\xe6\xe9j6Y\x06B\xab\x17:x+\xdb\xfa\x06n\x99n\x0d\xac\xc8\x9a\x86\xbdH\x8c\x07\xde\x90\xd6\x10\xca\x93$\x01\x00X\xc5\xa8,`\xd3\xbc\xd5\xe9v\xb6\x89\x0b\x1a\xfaL\x03lEV_S\x1b\xcdmZ\x09\x05\x8b\xac\x9cj\xddx\x15\xc7&\x01\x00X\xbd\xa8,`.\xb6\xf6\xbd\x8f\x17\x1cO\xd6\x1e7\x130\x9b\x85\x06\xe5\x9e\xb7\xd8\x12\x94\\.$K?\x9f\xd1\xb8\x15\x92\x00\x00\xacZT\x160\xcc:Y^!\x12\x91\xc3\xec\x13\xd6\xc4\xef\x11|N\xed+\x11\xdbV\"`\xbe\xec\x0a\x85$\x00\x00\xab\x16\xb5\x05\x8c0\xe3\xb6Xi$\"\x9f\xc9%\x06\xf5\xf06\xf5z\xfd^[\x937I\xc9\xe5`\x1c\xf5\x86\xd3g\xd2g\x14\x92\x00\x00\xacVT\x170/\xcf\xf3f\xd6\x0f\xb3v\x87\xa3\x12\xcdt\x93\xdc\xae\x15\x91\x0c\xbf\xb6`\xc0-D\xab\xc4\x03\x91\xde\xd8\x00\xc4\xe4\x00\x80\xd5\x8f\xea\x02\x86\xbd\x1e\x07\x8bJ\xe4\xa42&\x08\x98\xbf\xdb\xe2\xf48-\xdd\xf3\xc9\xca.\x07w\x11B\xfb\x84\xa4\x1b\xdd\x0a\xe5J\x92\x00\x00\xacV\xd4\x170L\xe3Bv\x93\x01\xa43\x10\x08\xb8\x9b\x02\x01\xea\xc4\xf7\xb3\xdc\x81d\x05\x97\x01\x9fv\xeb\xe5\x1e\xd1c\xefF-\xa1lI\x12\x00\x80\xd5\x8a\xca\x02\xe6\x17\x06k\xe3|`\x92\x0f\xe1\x09\x98\x1e\xb2\xdc\x87\xa6@\xa2\xb2\xcb\xc3\x10\xea\x96\xa4\x07\x14\x92\x00\x00\xacV\xd4\x15\xb0@\x93\xe01'R\x15\xf0R\x1cf\xaf7\x10\x12\xb0\xd1\x95\x11\xb0\x88\xb3\xabN\xe3SH\x02\x00\xb0ZQW\xc0ps\x17}\xf5[B\x13&\xc4i\x14\xe2\x10r\x85\xa7Q\x04\xf2\xf6*$\x01\x00X\xb5\xa8,`.\xbe\xdb\xe9vZ\xc4\x99\xf8\x01\x8f\xc3\xec\xf1b<\xd3bq\xb8\x1d\x96\x96\x95x\x0c9\x18\x11\xb0\xcbhT!\x09\x00\xc0\xaaEe\x01\xc3\x9e\x1e\x8b\xa9m\xd0/\xeeP\x17X3I\xf8\x87\xda\xccmC\xfe\x84%\x97\x03\xbfg\xb4T\xe3\x11wl\xe9'ql\x12\x00\x80\xd5\x8b\xda\x02\xb6\xba\xd8\x8f\xd0\xd6\xd0\xca\x13-\x9a\x8a\xf9\xd8$\x00\x00\xab\x98\xf5-`\x9e\xd1\xf0O\x1e\xbd\xd9\x0d\x0aI\x00\x00V3\xeb[\xc0\x00\x00Hi@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0V3\xc35\xaf1\xf6\x16\xb4c\x00\x00\x94P[\xc0<]\xcd&\xcb@h\xb5S\x07oe\xdb\xc0x\xbb\xa9\xcd\x19\xbf\xd4r2\xb9\x09\xe5\xc5dz\x8fmI\xdf\xfb\x81\xd6\x87\x9d\xaa-6\xd4?2\xbc\xc6_r\x1c\xa7\x7f\x91\xcc\\\xc2\x1d\xae5H6\x0di\xf0\xe3r\x00PDe\x01\x9b\xe6\xadN\xb7\xb3M\\\xd0\xd0g\x1a`+\xb2\x06\xac\xe6Q\xf7\x03\xd3\x83D%\x97\x8f\xc1#\x9a\x98\xbc][\xae\x1fI_\xd8\xa2\xd2\x8f\x9e$>>V\xfc/\xf7\xfaNp\xdc\x7f\xe0\xef\xed\xf6Nn\"\xb1\xb5\x94N\xee\xbe\x90\xb0n\xbc\x9a\xd8\x12\x00\xd6)*\x0b\x98\x8b\xa7\xeb\xd7\xf8x\xa1\xb7e\xedq3\x01{h\xa2!m]\xa6\x85)\xc6\x07\xa7N\x13\x9d\xe3EWq`\x81WSs!\xe1\xe1\x1fJ\xce\xcea<[I\x04\x8c\xf0x\x11\x02\xf6B\xd7\x18J\x9e\xd1\x84\x97\xfd\x01\x00\x20\x82\xca\x02\x86\x99*xy\x0f\xdd8\xcc>aM|+[)\x1f7=\x88Sh\x99\x89\x150\x17\xb2*\xd8)S\x95X\xc0\x1a\xf5\x7f\xa1\x9b\x0e\xee9\xdd,F\xc0\xae\x18fCI_vE\"K\x00X\xaf\xa8-`\x84\x19\xb7\xc5J\xddK>\x93K\x0c\xea\xd1fc\x07\xda\xef&*\xb6,x\xca\xb3\xb3\x0e\x88C\xc8\xa6\x82\x8c\xdcj\x1f\x8d\xd5\x8d\x18\xd5\xb2\xdc\xf1\x8d\x08\x9dq\x95oM\xdf#]\xacu\x98\x13\xa8\xa1;\xf6\xda\xc3\xba\xb2\xda\xc3A\xd9\x19*\xaf\xb0\xcd\xab\x8e9\xba\x09\x0bX\xb0\xb3F_\xd5\x19\x8c*\x16\xbc_S\\yS\xd0\xad\xb9\xe2p\x07\x8ct\xc1\xd2W\"^\x00\x00\xacvT\x170/\xcf\xf3f\xd6\x0f\xb3v\x87\xa2\x12\x0d4\xb1\xa8D\xe6\xb6\x84%\x97\x01Wf\xae\xb9\xfd\x17HC\xd3\x15i\xc7\xadW\xb5\xf9DZ\x1f\xdaZP\x9d\xcd\xe6\x91\xe5\xceX\x9a\xb7\xe6f\xe6T\x97#\xe9hnv\xc2^i\xb4\xdb\xed\xb4{\xf5t\xf7\xc5\xfe\xb1{e\xdc;\xe9\x19\xe6\xb8\x0e\xe9nX\xc0.\x16}3\xf2M\xd1\xc5\xa8bW\xb8\x1b#\x9d\x87\xaa\x98\xae=\xe5\xec\x91r\x03\x92\xe0o\x00\x00\x84P]\xc0\xb0\xd7\xe3`Q\x89\x9cT\xc6\x04\x01\xf3\x99\xad\xde\x19O;oIV\xf6C\xf3\xe96r\x0d\x81\xed\x1a\x92\xb4\"3\xa6A\xd6X@\xee\xf0\x10R\x96\x9b\x8fv\xf9\xc4A\xb0\x84\xf0\x10\xb2\xf3\x10\xd5\xa0\xce\x12Y\x0f\xec\x05\xf7\xadt7$`#\xdc\x18y\x1d\xe3Fd\xc5\x86\x99\xd7\xfe1\xd7'\x98<\x8f\x94s\xa3[\x18\x00\x80h\xd4\x170L#@v\x93\x01\xa43\x10\x08\xb8\x9b\x02t4\xe9\xb5\x92~\xd9\xa0U\xed\xf9N>\xc4\xd3\xcd\x19\x0dy)\xdd\xe6\x9f'\xe40gSX\xc0d\xb9\xf9\x8a\xae\xf4\xb0\x80\xbd4\x1c\xbdq\xefipNvtN\xa7\xd8\x03\xbbr\x82mN|)+V\x7ft\xee\x1d\xc1\xc0F\x9d\xfd\x9cd\xc6\x85[\x90P\x00\x00d\xa8,`~an\xd58\x1f\x98\xe4Cxh\xce\x8c7\x80\x9b\x06\x12\x15]\x06\x1e\x20\xe6|;\xa7!/\xdb\x05\xc7\x17\xdaOs\xc2\x02&\xcb\xcd\xdf\xa1TI\xc4\x89\xff\xf6\xde\x85J\xae\xec\x8e\xa2\x0fln\x8cmB\x02f<\xcb6\xb55\xb2b'D\x8f\x1a;8!\xf5\xf7\x0f!\xb5\xdf\x1b\x00H\x05\xd4\x15\xb0@S/\xdb>4\x05\x02^\x8a\xc3\xec%\xca\x85\x99_\xdc%H\x99\x8ax\xd1u\xbaaN\xfc\xf2m\xa3\x0c:\xa1#\"`\xb2\xdc\xfc\x03J\x950\x01\xbb\xf7\x92\x88S#\xd1\xa0\xb7}\xfaN\xd9\xe1F\xfd+\xba\xe9\xe3^\xd3M\xb8\x07v\x94\xf9\xec\x8f^\x94\x15\xab?\xfa\x84\xc1J\xcc\x16\xb5Fj\xa9\xd3,pR\x07\x00\xac+\xd4\x150\xdc\xcc&L\xf8-=\xe2\xbe\xe0\x03s\xf2D\x20|\xcd\xbdq\x8b-\x17\x059\xe4\xc4\xae\x9fhH\xb2\x0b1\x0f\xdc\x17u\xf45,`\xb2\xdc\xfc\x83Ju\x18\x8d\x18\xbf\xa6n\xabV\xea\xd1\"\xfb\xd7X\xb6\xbba\x92m\x7f(9OF\x87A\xe3Q\xb6\x17\xf1\x81Q?W\x1f-!)6&x\xbf\x1ao3\x9b\x0b\x95\xe1\xbe\\\x20o/\x06\x00\x20\x06\x95\x05\xcc\xc5w;\xddN\x8b8\x13?\xe0q\x98=TB\xf8!\xf7\xc3&\xab\xfa\x9d\x0cGFN\xdd\x99\xac\xb4\x8df'\xc6\xa7P\xa9\xa5\xbd\x025\x85\x9eB\x0e\xb2\xd1n8w~\xd0\x96[h\xb3M\xc6\xd4\xd1Z\xd4\xd1\x7f\xba\xf8%U\xa2\xe2\xd6\xe1\xfe+\xdc#\x96\xbd\x0f\x89\x9a3\xa27\xde\x1f\xae\xd5\x11\xe1zIg\xe2w\xd8\xed\xc4\x16\xd7s\x8d\xc3\x8d\\=\x96\x17k\xdc]\xdf\xff\xed\x15A\xc6\xf0s\xeeN\xe8\x1c\x97\xd1(\x06\x00\x20\x06\x95\x05\x0c{z,\xa6\xb6A\xbf\xb8C]`\xcd$1j1[G?\xd0O\x0f\x17\x85k_\xd6\xd6\x93\xe6\x8d\xe8\x18Iw\xed\xd4f}z\x97\xf4\x0f\xb3\x98\xdbk\xa3\xf0k\x81P\xeex\x1a\xcb\x8d\xed\x09\xcd\xdd\xf8Lo|L\x12\xf7\x8d\xb7\x0f\xeb\x0cFA\xbf\xb0Y\xcb\x8b\x06S\xb5\xfa\xb2\xb3t\x1e\xfeE\xd1\xc5E\xc7\x9c\xc1\xce\x13\xfa\x13l\x1e\x98\xac\xd8\xd8\xe9\xb2\x12\xe3\x88X\xb0U/z\xc1l\xe9'1\x00\x00\xb1\xa8-`\xc0\xc2\x09\xde\xd0\xb1\xbeX\x8b\xa6B:y\x16\x00\x80\x10\x20`\xab\x98`\x87\xe1\x15\xc6\xdelX\x8c\x02\x00\x94\x01\x01\x03\x00\x20e\x01\x01\x03\x00\x20e\x01\x01\x03\x00\x20e\x01\x01\x03\x00\x20e\x01\x01\x03\x00\x20e\x01\x01\x03\x00\x20e\x01\x01\x03\x00\x20e\x01\x01\x03\x00\x20e\x01\x01\x03\x00\x20e\x01\x01\x03\x00\x20e\x01\x01\x03\x00\x20e\x01\x01\x03\x00\x20eQ[\xc0<]\xcd&\xcb\x00]\xf9k\xc6\xcc\x16\x946\xb3\xa5u<\xed\xe6.O\xe2\x92+\xc2\xa8\xb0\x88N\xda\x03awr\x13\xca#\x9b#$+\xc3\x15k\xed\xd8\x93\x91]\xda\x9b=\x1d{\xe4C\xe1.\xcf\xc9\xf8\xa4N\xfd\x85\xd3\x00`u\xa2\xb2\x80M\xf3V\xa7\xdb\xd9F\x174\xf4\xf1\x0f=\x04\xb6X\xb3\xdbds\xd9L\xab0\xfa\xf4\xfc\xa0\xedkt\xd9\x16Z\xc0\x0c\x0f\xb2\xe5\xa7\xdd6\x92\x1b\x1b\xe7\xac+c\x07\xdf\xb2\x1d!g\xcc\x91\x0f\x85k\xf3'\x97\xac_d~\x02\x0a\x06\x00\x0c\x95\x05\xcc\xc5S\x95\xf2\xf1N\xfa\x12\x16\xac@3\x0dY1\xd0\xbc\x12K\x1a&eH&U\xa1(\xdeC\xb1\x02\xe6\xcd\xdcOt\xce\xb7m\x19\x05l\xffV\x1a\xdf\xd6\x99\xf1E2C\x00X\x1f\xa8,`BTE/\x0d\xdf!\x110\xa7\x89\xde\x97>\xd3\xf2\xdd\xf9\xef\xc1\x82\x05\xecT:\x1b;^B\x0a\x83\xcb\x0fD\xdeV\xb69\xa0\x18\x1e\x09\x00\xd6\x1fj\x0b\x18a\xc6m\xb1\x06d\x02\xd6s\x97m\xee\xaa\x1c\xd5c~\xcb\xa6/r\xb2{\x8fg\x15\xd2\x11\xed\xc1lM\xce\xbeq\x92\xed\xdc\x88\xd0>\x9c\x83P\x16\x1b8\x86\xa5\xcaS\x9e\x9du\x80\x0d!\xa5\xb9\xb8\xa9\x20#\xf7\xffo\xef\xfcc\xe28\xee\xfe\xff\xfdg\x10\xac\x8c\x0eN\x1cB:\xa4\x039\x08\x13Y\xc9`|',\x1cS\x041\x17\xd1`\x93\xafj\xe3\x1f(\xa9\x12\xfb,\x13\x9b\xa8NS94D\xc6`\xf2\x03\xc5%ND\x83c\x14\x1axL\x1d\x91\x1fv\xb8\xa8\x8ay\xda\xe2|\x85\x1e\x92H\xcf\xb5V{\xcf#5\x8e\xb1]\xe1m\x1cR\x82}\x86Z\xa3\xef\xce\xec\xaf\x99\xe5\x8e=(\x06\xce\xf9\xbc\x12\xf9\xf6n?\xf3\x99\x99\xdd\x9d73\xb3\xb3\xfb\xa9\xa1\xba\x9c\xcd\x82G\xca\xa1\x034\xd9\xe1\xfb\x1c\xabi\xc8\xa3*\x94\xd2X\xe3q\x14\x8e\x08\x9b\xb2\xdcS\x98\x95\x92\xb1\xce-[iv\xb17Q\x8f\xa4k\xf1\xdc\xd2\x85qu\xaf\x1a\x0ces\xf6\xact\x00\xf0\x83d\xc9\x05,D'\xeei{\x0f7v\xbd\xd2\xd8\xdaC\xfb^\xedj\xd0\xc3\xde\xa5\x0el\xdb\x9d\x8ej\xd6\xa2\x8czW\x03\x8d\xc1\xed\xefn\xf3%\xf5+\x03\xda\xbe@R\x9f\xdc\x8cZ>dF\xbaT\x0d\xa5{\x9a\x8f?\x88$Y\xf8U\xf6'Uw\x1c\xca\xb8o\\\x1eKj0=o\x96\xea:\xea\xa4rE\x0d[\x93QF\xe0@z\x89\xb0\xa9$\xdf\xfcJWc\x06\x9a\xf5\xaa\xe8\x0d\xa8\x90~\x8c5\x1fRi\xd6g\xdf8.\xb9\xcag\xff\x08\x00?D\x96\\\xc0\xe4\xd0\xe8`\x9b:\x89\xdfrv$\xd8vLi\xa1-\xfdlO\x7f\x8bM\xd2E'\xb3\\\x11\xae\x0ey\xb3\xd2w\x0a\xb7QU\xcde\x11l\xe5\xcd\xf9\xa1,\xfd=\xce\xbaT\xad\xc9V\x0c\xc6WK\xe2\xaf\x1d\xa8\x99};&\x8f\x20S\x7f;Q'\xfb\x97\xf6,%\xa7\xd2\x89*\xcf\x90\x85\xcd\xc3\x19T\xba~\xe1\x9c5\xeb7\x1cP\xe3\x1e}9\xac\x12\xe5\x8e\xe6\xf8\xe6\xd4\x159\xd6\x06\x80\xa5g\xe9\x05L\xa6q!\xbb\x94v8H;_\x97\x9a\x15!hg\x01\xb2\xe5\xee\xf6\xb9\x93->\x99\xc7\xe4>\x14\x96kK\x95\xed\xd0\xe1\xc2\xect\xb4\x9a\xfd~i\xb5\xcb\xa7\xdbhR\x15FllW'\x09\xbf\xca\xa5\xd9cW\x15\xb2\xfc\xf2X\xb2\xd9\x03\xf3\xe7\xb2\x8f\x9c\xcd\xca?\x12\xfd\x87\x05\xff\xe66G2\xdd\x8f6~8\x1e\xa5{\xa52\x8ctf\xdf\x9a}T\x0fZ\x09\x00?x\x96X\xc0\xc6\xd4.\xc7\xd9F\xa3\xeb\xd1\xa3\xa8\xd6I\xb5E\x1e\xd7\xc3\xdd.\x19\x99\x9dr\xbf$\xcb;\x14\x01\xebwe\xd5\xb6\xf7\xdc\xaf\x0a\x98\xfc\x0a\xea\xd5m4\xa9:\x83\x98\xca\xaaJd\x0a\xd8jMg6\x18s`cJ\xe7k\x8d*\x7f\xeb\xf2\x95\x7f\xa4=\xb2>\xf7\xcfm\x86\x1b\x1f\xcaA\xae\xd8\xd1:z:Tz\xac;\xc2\xa5\xc9\xcd\xd1\x12\x00\xc0\x0f\x91\xa5\x15\xb0\xf1\x16u\x9e\xfe\xc3\xa6q]\xb5\xba;hdnuRl\xc9GF\x9c\x80\xe5\xe4\xd32\x94\xa8\x026\x9a\xb9\xcb\x1d\xd2l4\xa9\x0a!:'/['\xf1\xcb\xb3\x07\x18!\xe3.d\x1b\x0a\xc9~u\x96\xdd\xcdz`4\xaa\xb7&`\xc6\xe6\x99\x1d\xca?\xe1c\xa9\x87\xe5y2z\x9fs\x96\xa6\x01\xc0\x0f\x96\xa5\x150\xb9\x95\xce\x0d)CH\xa5\xaf\xd5\xc1\x06\x8c\xa1\xe6\x0f\xe9:0\xaak\xddK\xbf\x0e\x8c\x13\xb0,:\xb7>\xbe\x9a\x09\xd8X~\x9d\\\xb5V+\x8d.U\xf9Y4\x86\xf8*I\xfc\xb5\x13\xb5\xd1\x8f]\x01\xba\x0e\xacD\x19\x12\x8e\x17\xb8\xe9\xcc\xd81\xe5\xc7cl\xac\x17U\xc0\x02l\x92L.\xa8\x92-\x8c\xd4\xcf\x8e\xfd\xcdq6\xd33\xa4\x94\xef.\xae\xf5\x07\x80Db\x89\x05l\xa8\xb1+8\x12d\x93\xf8#\x8d\x9dC#g\x9a\xe8\x8a\x0ay\xa4\xa9{\xb8{\xe9W\xe2\x07\x9d\x0d\xe1c)g\xc3\xa5\xf7\x8f(\x92\xf2\xd0\xe1\xc0}(\xa3\xbe\xefRoU\xc6\x88<\x9c^\xd3;\xc6\xaf\xc4\x1ftd\x05\xea\x9cI\xc9\xcdAu%~CO\x0f-\xf0\x0eT\xdav\xdc\x8f\xe8\xfd\x87NG~\xf3\xf1\x07\x93\xe9\xe0\xb3w\xeeM\xfc\xfa\xb9s\x0f\xfc\xca.\xcd|\xf9\xe8?\xcd\xed~\xf5\xdd\xfc\xff\xf3+\xfc\xf6\xb9\xf7\xf6\xe3\x97\xd4_\x7f[<\x87j\xfe\xe9\\\xd1K\xe6\xb6R\xc8O,\x06_\xbf\x8b?\xba\"_y\xe4\xb1?\xcaq\xb1\xa5h\x0b\xfb\x14\x9d\xcdY\x86\xb8X\xeb:\xbc9U\xfcc\xce\xde\x1d9+\x86\xb0\x1d\x7f\xd9\xef\xdd\xad|\xec\xf6\xee\xffK\x0c\x8b\xbf\x7f\xc2N\xd6'W\xd4\xaf\xd7?\xf9\xd9z9\xc6\xd1Q\xa4\xb9\xf8\xff\xbe\xf5\xce\x16\x8c\xff\xdf\xac=s\xf0\xf5'E?;\xf7\xd1\x9b\x8fx?\x8ba\xf0\xd5\xdb\xf8\xd5\xbf\xca\x7fUNd\xec?\x1b\xfc\x99_\x08w\xbf\x9a\x94(Q\x9e\x97\x8c%\x16\xb0!\x16\xcd\x96\xbd\xfd\x9e\x0bl\xabt\xcc\xda\x96I\xc0\xf2J\xed,l\xc8\x0b\xc8\x0e&)\xaf\x17\xc9\xf2\xa7\xf4\xb2\xf0\xben\x97f\xbe<\xb6\xcf\xdc\xd6/\x96\x0f\xb0\xd20\xae?\x87\xb5?\xf0\xd7\xa3$3Y\xff\x92\xb9\xad\x16R\xe4\x0b\xfc\xb5,\xbfT\xf6\xdf\xd6\xdf\xa3\xf35\xdeO\xed\x19\xbc\xb3\xb9\xcb`O\x08\x1d\x92\xc7g\x0fF\x16\xd2<\x8e<\xa1t&\xff\xc7\xfb\xc4\x919l\xc4\xe3\xf0\xd2\xfah\xbf2\xfeg\xe3\x93\x8a\x00|\xfd\xc8|[6;\xea_W<\x11k\xffg\xf8\x03\xe5\xdf\x8fp,\x85\x93\xc53\xbf@\xeez5\x17v\x86\x16\x8b%\x160\x99]\x9f\xa1\xc6QQ\xc0\xba\x1b\xbb\x9b\x96G\xc0\xee{\xc8\xce\xc2\x86\xdc\xe6\x11\xc4\x868W\xbe\xd0.\x8b/\xae\xd8\xa5\x99/[c\x09\x98|e\xe3s\xd1\x93\x88\xc4#`\x1f\x14}d\xfd9\x06\x1f\xe1?b\xdd6\x8a\xb3\x053\x14=^\xdcB\x9a\xc7\x91\xfd\xbb\xdf\x91\xdf~b\xff\xa2\x08\xd8\x11\xef\x9f\xe9\xc7\xeb8\xe6h0:\xeaQ\x7f\xc9\x1bK\xd8\xe3\x10\xb0\xadK(`\x0b\xad\xe6\xc2\xce\xd0b\xb1\xd4\x02\xa6pi\xa4\x8d\xbe\x08\x9f\x17\xb0Ka=\xb8\xed\x92\xd2\xa1\xbd\xa1\xf9>Y>\x9b\x8cP\xddP\xb9;\xb5\xd0\x1a,\xbb\xd9\xc5^\xf2<\x92\xae\x19\xa7\x8b3\xe8\xeb\xea6\xe4*\x89\x93\xd9\x14\x9evY\xfc\xb1\x08\xe3\xa3_<]\xe9}\xe2\xef\xf2W\xfb*\x8a\x1e~\x92\x8e\xcd\x9e\xc3Eo\xfd\xf2\x11\xef\x13\x7f\xa2&\xe7\x9ex\xb8\xa8\xec\x89\x87\xaf\xd3_\xdf|\xb6b\xd3\x93lJ\xe2\xfa\x9b\x8fy\xb7\xbey]\xf0\xf0[m\x1a\xe315\xbfnA\xc0\xe4\xe7\xca\x94\xb1\x88\x17\x1b\xb3\\\x86_.c\xa5)=\xff\x8c\x9e\x05w\xed^\x7f\xfb\xb1\xe2G~I\xfbR\x8a\x80}\xb1\xf1U\xeb\xaf\xe6\xa6PH\xf9\xa5\x0a\xb9BWD\xdd\x99Y\x86w\x8c\xa9\x9dw\x04gf\xc9d\xe3\xa0r\x8ce\xa8\x87\xb7F\xd9\x0e?\x94)e\xf9\xf4y\x15\xa3y\xf4\x14f\xa5d\xacs\xb3\xed\x96|\x87\xa7&\xf6\xd4\xf1\x91\xfdo\xee\x95\x9fx\x93\x0a\x98y\x1c>S\x0e\xea\x93\xd7+0\xde\xc8\xfe\xc4\x18\xc7\xe1O\xfb+6\xee\xfb\x99\xb5e\x9bE\x7f\xe4\x19\xf6\xc3_^\xbf\xc2\x9d!\xeelF?\xb1\xba\x80\xfd\xaa\xe8\x0a\xe7\x8c\xbf4x\x013\xfcr\x1e\xaa6\xf9\x0b\x00\x00\x20\x00IDAT,g~\xd61\xfb{Y\xd1\x91\x8a\x8a\x8f\x9e\xdf\xb8\xf3\xeb\xe5\xac&\x9d\x97\x9d\xfdn\xf4\xa5b\xc9\x05,D'\xee\xd5(j]\xaf4\xb6\xf6\\\xd2~_\x0e\x01\x0b\xf7\xf6x\x0azzz\x14\xf1\xb9\xd4\xd6\xea\xf6\xa4g\xd5\x94\xcf\x8a$\xbb\x01\x15\xd2\x8f\xb1\xe6C*\xcdb4\xda@\xbat\xe6\xea\xba\x82>6\xf7\xac]\x16W\xdey\xe7\xe1G\x8a+~\xb9\xff\x81\xffV\xae\xc2g?z\xe7I:\x8b\xfa\xd9;E\xf8G/\xfdj\xe3^\xc5\xe2\xf7\x0f<\xfd\xee\x07o\x95\xe1\xbf\xb3_\x1f~\xf5\xd5\x87\xd9T\xc9\xd3\xeb\x8f\xbewt\xfd\xd3\x82\x87\xaf?9\xf7\xc8\xces\xe7\xce\xd1\xbf\x8bW\xbf\xec\xces\xaa\xcdV\x13\xb0\xb7\xe8`\xee\xd3s\xe7\xbc\xaa\xa2\x98~\xb9\x8c\x95\xa6\x84\x1f{\xe7\x9d-\xdal\x8cq\xed>\x83\x9f\x7f\xef\xcd\x1fm\xbdN\x05\xec\xaf[\x8a\xafX\x7f57\x85B\xca\xbb\xf7\xc9\xfbv\xab\xc6\xa63\xa3\x0c_\x9f\xdb\xf8\xd2_\xe5\xbf\xbe\xb4\xf1\xdc\xd7\xbc3\xaed\xb2qPy>\xec9\x86\x02==\xa32\xfd\xc3\xe2\xefn\xf3%iW\x84.`\xfdh\xf3+]\x8d\x19\x88\xfe\x85\xf1'Uw\x1c\xca\xb8/\xe6\x82\xb8#\xfb\xffT\xfc\xbf\xde?S\x013\x8f\xc3\xf5\xdf\xbd\x84\x7f'\xbf\xfd\xc0\xdb\xbfg6z\xd1\xbf\xd8\xf8\xc8\xdb\xbf}\x02[[\xb6Q\xf4+\x98\x9b\x130\xce\x10w6\xa3\x9fXM\xc0\xae?\xb6Ep\xc6]\x1a\x9f\xe1\xf7\xae\\\xb9\xf2\x1e\x16\xce<\xe7\x81?\xf3r\xb4c\xf6\xd1F\xfc\xcb\xdd\xb8\xec\xd5\xb2\xd7\x97\xb3\x9a\xf4\x8fO~\xef\xc82-N\\r\x01\x93C\xa3\x83m\xea$~\xcb\xd9\x91`\xdb1M\x0f\x96C\xc0da\x08y\x1fZ\x1b\xd6\xc6\xb8<\xc3\x015\xd0\xd9\x97\xc3*\x96\x90f\xf5\xa8Q\x0e;\xd4\xa0\x1e\\\xc7|+\xde\xfd\x95|\xfd+\xa5=\xbf\xa3\xb4\xe3\xeb[\xe8Y\x97\xd7oT\xfez=\xfd#e\xeb\xcd\x1f\xd1S\xff\xe6F\xf6\x87\xbaR1\xfb\xeaa\xe5\xef\xec{\xecO\xf2\x07\xf8=\xc1\x037\x90\xd8\xa0tQ\xb4a\x96&`\xefi\x1d~M\xc08\xbfB\xc6?V\xd4\xe9\xca#\xea\x9fr\xbd\x90\xbf\xc5o\xb3o\xefP\x01\xdb\xff\xc8\x8f\xde\xb4\xfe\xcamr\x85\x94\xaf\x17\xbf.\xbf^\xac\x8d\x8b\xf8\xa1\x88V\x06\xf9\x99\xfd\xca?\xfb\x9f\x11\x9d\xf156\x0f\xaa\x801\x84\x0c\xb7\xd1\xb3\x90\xab\xadv\xd3\x05\xecp\x06\x95\xae_8\xc7\xa9\xc25\xb3\x1d\xc7f;Q9\xb2_\xde\xf2\xdcc2\x150\xfe8\\\x7f\xfa\xb1\xbfT\xe87&\xf5\xa2\xef|\x84\x19XZ\xb6Y\xf4/\xf0\x7f\x18~\xf93d\x9e\xcdX'\xf6\xa5+_\xffq/M\xc1\x1fI\xf3\xc4~\xa6\xf5\xb0>\x13\xfc\x0a\x07\x8a\x1fBF9f\x15O+)\x7f+?\xfd\xecrVS\xe1\x84r]\x1a\xa1\xec\x97\x96\xa5\x170\x99\xc6\x85\xec\x92\xe5\xf1A\xda\xf9\xba\xd4\xac\x8d\x0fV\x80\x80Is-\xaf\x1aF:\x82U\x1br\xd6\xc8\x0d\x99\xda\xb8\x93\x13\xb0\xf5\xfa\x8c\xf8_\xde|\xa2r#f\xb7\xed\xd8_X6\x0b\xf1\xdf\x15\x95\xcf\xbf\xf5\xfb\xeb\xac\xd3\xb3\x9eM\xd4\xbc\x89\xffG~F\xbd\xb9\xb7\xe5g\xa2\x07\xf32\x1e\xe9l\xcc\x11{`o+\xc9(\x9ax\xf0~\xf9\x8c\x8f\xd2\x7f\xdfTm\xf5B\xee\xaf\xbc\xf2w\x85\x8ag\xa8\x80y?{\xab\xec+\xcb\xaf\xdc&WH\xf9\x8f\xf8\x93+\x9f`\xed\x86e4\x01\xfb\xc8\xfb\xb5\xfc\xb5\xf7#\xd1\x19_\xb2\x18\x98s`\xa1\xc3\x85\xd9\xe9H\x8b\x92\xae\x0b\xd8H\xa6\xfb\xd1\xc6\x0f\xc7\xe9\x1f\xbc\xd2\xec\xb1\xab\x0aY\xfe\xa8~d&`\xbf\xc2\xbfb\x02\xc6\x1f\x07\xf9\xca\xd6\xb2'\xf5))\xad\xe8_\xa9\xab\x18\x8eZZ\xb6Y\xf4+Ef\xd7\x84?C\xe6\xd9\x8cub\xd9:\x8a\xff\x90\xc5#i\x9e\xd8\xcf\xf0\xaf>\xfd\xf4\xd3\xd7\xe9\x89\xe4\xfc\x0a\x07\xcaf\x0e\xac\xe2\x1d\xa5\xbc_\xd3\xda.c5\x95?8\x19\xee\x86\xe5Z\x9b\xb8\xc4\x026\xa6v4\xcf6\x1a\x1d\xce\x9ev\xf5s\x05\x08\xd8\xdc\xc1\xcaz:T\x84\xc0\xd8_:j\xbaW\x0dg\x07\xb4\xaf\x9c\x80=\xa6\xff\xf4\xa3\x87\x8f\xbc{n\xb7\xaa#\xb4\x85\xab\xd7\xc2Wo\xed{\x04\x97\xfd\xca\x9c*9\x87\xffS\xde\xf9$K\xf2\xc4c\x82\x07\xf12\xeeA\xea\x81\xd2\x04\xec\xc8F\xf5g]\xfbC9\xc8EW\xdd\xad\xd6\xfe\x96\xc4|\"Ai\xd2\x7f9\xf2W&`\xfcq\x90\xe5w\xcd\xf2jE\xff\x14\x9f\xa3\x1f\xd6\xd9m\xae\xe8\xda\xe4\xd0\x15\xa5W\xc2\x9f!\xeel\xc68\xb1\xcf~\xfa\xe9\x17\xd7-\xce\xb8\x13\xcb\xcd\x81\xf1~\xf9\x03e'`\xef\xc9\x9f\x16\xb1\xda.c5\xe9\x19\xea\x92\x97\x8b\xa5\x15\xb0\xf1\x16u\xb6\xef\xc3\xa6q\xf9\xa4z\xb5vk\x17\xedr\x0a\x98\x1aR\xf7\xbe\x12\x1b\xdb(\x1cG\xc3r\x89;]\x1fwr\x02\xa6_y\x8f\x0a\x15\x1f\xc8\x9f\xaeWk\xbb|\xd5\xfcA\xdd\x85l\xed\xa4\xff\x8e\xb5\x9d\x94\xe5\x0e\xd6\xf5\x0a5\x7f\xa8\xeeY&\x01+(P\xbaQ\xa8\x8dn\xc6XQ1R\x1fe\xbaF\xa7\x1d\x0d\xc9\x1f\xa2Ry\xdc\xcd\x8c\xa2\x08\xd8\xc3t\xe3\xfaV\x8b\x80\xbd\xa4\xces\xed\xa4\x8b\x20\xd6\x97)\x97\xde\xd7\x95;\xe9\xd4\x03\x9d$yG\x9b\x033\x05l\xa7\xb2\xef\xaf\xda}FQ\xc0\x8e\xe8C9M<8\xbfB\xc6\x15t\x0el\xcbNf\xa3\x17\xf2\x03\xd5\xe3\x91W5\x01\xbb\xbe\xf3g\xe2\xaf\xdc&WH\xb9\xe2\x97\xca?\xbf\xac\x90\x05g\x14C\xc0~\xe7\xfd\xb3\xf7w\x96,\xf8\x1a\xc78\xa8\x86\x80e\xd1?%\xe3\xab-\x02\x16P\x9fA(\xa8\x92\xe5N\xf5\x8c\xedR{\xbe\xc3\x81Y\xab\x919\x01\xe3\x8f\xc3\x95\xc7^\x92\x9f\xdbm\x99\xbe{\xecae\\\xfc_^K\xcb\xe6\x8a\xfe?\x1b\xf7\xd2\x1bs;+\xc53\x14\xb5e\x0b'\xd6\x100\xfeHF\x150\xce\xafp\xa0\xf83\x1f\xe5\x98q\x02\xb6|\xd5\xfcA\x09\xd8PcWp$\xc8&\xf1G\x1a;\x87F\xce4\xd1\x15\x15\xf2\xa5\xd1\xd1\xe6\xeeQ\xcb\xf4\xf8\x92\xb0G:p|\xadcD\xbe\xda\xc7nHFiV>\xb4n\xf6\x8f:_:J\xdb\xdd\x1e\xa9:\x90B;\x03\xbf\x7f\x13\xbfN\xef\xfa\xfd\xfdw\xec\xf6\x11[t\xf0\x12\xde\xf7\xe6\xab[\x95\xde\xf6'\x7f>W\xf4\xb3O\xae\xff\xfegE\xe7\xfe\xac\xfcZ\xfc\xd2o\xdf}\x86-\xa7\xa2\xb7\x08\xdfzd#\x9d\x8c\xdf\x8f\x8f\xfc\xf6\x08\xde/z\xa0\xd7\xcc\xeb\xef\xee.V\xff\x0e\x9fA\xbd\xf4C]\x89\xff4[\x89\x7f\xe5\x93s\xe7\xbc?;w\xee+\x99\xf7kfL\xb3x\xe2w\x1f=F\xb3\xf8o\xedq\x01\xea\xec\xc8\x03\xfb\xdf\xfd\x8fg\x94kU]\x89/\xbf\xfb\xc0{W\xb8_\x85M\xa3\x90W\xde\xc3G\xbe\x96\xbf>\x82\x15[\xce\x19W\x06\xa5\x11Tu%~CO\xcf\x08\xfd5mOG\xbb\x9f\xdd\xb2\xdf\x81J\xdb\x8e\xfbQ\x8b\xe6,\xcdr\xeb\xe5\x7f\xf7\xef\xa6k\x9a\xfe\xbc{\xff\xffr\xc7\xe1\xca'\xcf\xfd\xe8O\xf2\x17\x1b\x9f\xff\xe4\x8a\xbeD\xfdwJ\x85?\xf3V\xbczt\x13.z\xfb\xb3\xe8G\x87\xf6Mw\xbe\xfd\xdb'\x8ah\x937\xce\x10w6\xa3\x9fX\xba\x12\xff\xbf\xf4\x02\x19\xce\xb8\x13+\xac\xc47\xfc\x8a\x07\x8a?\xf3\xb3\x8f\xd9g\x9b^\xff\xfa\x9d\xa2\xcf\xbe\xde\xbf\xfbO\xcbVMJ\xdf\x0fG\xc0\xe4\xd1\x93mM\xed}\xec\xce\xe3\x97]\xad\xcd\x1d\x83\xf4\x82\x95\xcf\xb0\xc7\"\x1b\x97\xe1\x91\xd0\xb1jgj\x81\xd2\xf9;\x9b\xc4&U\xa2hUs\x86u\xc9\x12\xcf\xc9\xec\x8c\xaap\x97\xc7\xa9\x8ck\xe4\xaf\x8b\xb1\xfa8\xa1\xf6\x04\xda\x13\xd4\xe0\xfa\xeb\x8f\xac\xff\xd1\xfe\xb7\x1f)\xda\xf9\x9c\xf2S\xd1\xff\xa36\xcf\xc9o\xef|\xf5\xe1\xa2\x8a\x9d\xec\xfc\xaf\xff\xe53\x1b+\x9ef\x8b\x08\xaf\xbf\xb9\xc5\xbb\x85\xad\x03\xe3<(\xea\xf0\xfc&\xefN\xedq\xb6/\x93\x1f:\xfb\xe5\xb8\xfa,$\xaed\x13\xb3\xbf\xd7\xe61\x94/\x9c_3cY\xde\xf2\xea\xbeb5\x8b\xa75[\xd6\x0b\xf8`w\xd9\xc6\x9d\xef\xd1?\xb8\xeci\xb9\x9d\xf8\x81O\xb8_\x85M\xa3\x90\x1f<@\x17x\xbd\x8b\xf1\x03\x1f\xf0\xce\xb82(\xbc\xbe^\x9f\x106<\xf05\x8evP\xc7\x9c\xec\x04\xb0\xf5t\xe3\x0d\x1e)\xa3\xb49[*`\xcfBRJ\x95>zA\x20+%\xb3@\x9d\x84\xe8\xbc?\xc3\xb9F\xbb\xf7\xdb\x94\x86,\xdd\xf7\x970\xa6\x13:\xcf\xd1\x15i\xe6q\xf8@)\xdf\xf3\xf2\xf3J\xd1?2\xcaK\x8f\xea\x17On\xaa<\xf2v\x91rZ\xa2\x1e\x1d\x99>$\xe8-{\x92-P7\xce\x10w6\xa3\x9fXzP\xb7\x18%\xd2\x9dq'V}\x16\xf2%\xf5\xa0\x19~\xc5\x03\xc5\x9f\xf9Y\xc7\xecz\x99r*\x8aq\xf1;\x18\xef]\xb6j\xcac\xa3\x03\xa5\xd2\xa8\xbc\\,\xb5\x80\x01\xb3\x10\x96\xc9\xdbsE\xf49\xb0h\xce\xc2\xb5\xd9J9\x83\xcc\x17\x97\x80/\xab\x98\x8b%K\xae\x9e\xaa\x80\xe5\xa2Z\x02\x00\xc0rb'`{\xd0}\xe6\x97q\x84\xfai\xc3.M\x93\x0a\x0b\x92P\x15\xfdm\xc0\x81\xa4\xd5n\x84\x02\x84\x0a\xd8\xb6U\x089\"\xa4\x1a\xa1\xcc\xd5.\xe5\x9f\x09r\xbc\x14\xa1\x92\xd21MY:RP\xda}\xca\x0e\xda\xf4[QM&Jw\"\x94\xa3\x08\xcd\x97\xe9\xc8\x99\xe7A\xe8A.\xef\x98\xc6*\xba\xe7V\x94\xebB.eWnD\x13\xb0h\xcezSQZ\x9e\xe2\xac\x87\x88\x09\xf8\xb2\x8a\xb9\x88Y\xf2\xf5\x04\x01\x03\x80\x95\x81\x9d\x80\xad\x13F\x8dY\xa8\x996l\xe4Q:Y#Nt\\\xe9\x97\xa4\xa3\xda[\x84\x0c:Q\x17\x15\xb0$Ow\xff+\xa4\x1f\xa5~\xa8X\x0f\xa6\xa1\xc3\xc6@\x8f)\xcbH\x12\x0a(j\xd0)\xa1\x16\xd5\x8f\xd2!\xea\x91P;!\x1bP\xdd\xb4\xb2?\x1d\xf5\x1a\x99\xc56\xd60\x86\x90({H\xe9H\xa5\xd0\xf2\xb0l\xa28\xbb\x9a\x86\xea\"d\xe6\x00Z5!&\x10\xca*\xe4\"|\x11\xea\xa9\x0aXG\xe3\x20\x01\x00`9\xb1\x13\xb0<\xb4\xc7\xfa\xad\x95\x8e\xdb\x14N\x207\x1d\xc7\xf9\x88\xfa\xc5C\x05\x0c\x85\xe8\x97\x1dZ\xa2\x1dT\xfdx\x01+\xd1&\x8f\xdaPF\x84\xfaa\xd6U\xb4+\xe7V}6\x95\xf7\x19\x99\xc56\xd60\x05L\xdbU\xade\x13\xc5\xd9\x1e\xb4\x8e}\x16\xa061\x81PV!\x17\xe1\x8bPO\x98\x03\x03\x80\x95\x81\x9d\x80\xadF\xf5\xdc\xb7|\xb4\x8b6\xec5\xecKDR\x1ax\x16\xeaV\xbf$\xa1\xb0\"`n\xd5.\xa2\x8e\xf3\xeaiC\xe7\x04,\x92\x8a\x86\xd4\xfdi(\xa8\xf8\xc9a_\x9aP)!\x85(?8Mx\xe60\xd6-t\x01\xcb\xd5v=\xa4\x09\xd8lg$\x07\x9dd\x9fcW-\x09\x84\xb2\x0a\xb9\x08_\x84z\x82\x80\x01\xc0\xca\xc0N\xc06\x08\x13=\xd9\xa8\x816\xec]\xea\xb7\\\xd47\x85Pn>#\x05\xf5+\x02\xb6N3\x8c\x04\xdb\x03\xa5n\x846\x0b\x02\x16FH\x9b\xc1Z\xa3\x8c\xdeZ\xb5N\x0d\xd3\x9c\xa0\x84Pz\xe9qn\x99\xc6\x1c\xc6z&\xba\x80\xa9\xbb\x8e\xd3\xcf\x18\xce\x88\xa4\xf6\xa6\x18B\x02\xa1\xacB.\xfc\x17\xb1\x9e\x20`\x00\xb02\xb0\x13\xb0:\x94o~\x99DtV\xa9U\xef\x94\xe5\xa3\x13\xe3\xc8\xa4K\x110\xad{\xd4\xe4\xa2?\xac^c\x11\xb0Q\x94\xacy\xf2\xa1f\xa2\xaffP5)\xb4\xd9\xa1$I\xae\xbe\xa5g6\x97\xb1\x8ae\x19\x85)`\xb3\x9d\xddBh\xccH'$\x10\xca*\xe4\xc2\x7f\x11\xeb\x09\x02\x06\x00+\x03;\x01\x1bBIf\xcb?\x8eR&i\xc3\xaeS\xbf\xe6\xa03\x8a\xa4\x85Mc]\xc0\x0e\x20\xf4h\xc7\xf0\x14i\x88\xd9\x03\xcbg\x9d*Q\x93\"\x83\x81\\dJ\xc3\xdc\xc6,AL\x01\x9b\xe5\x8c\x20\xa1\x07\xc6%\x10\xca\x1aS\xc0\xc4z\x82\x80\x01\xc0\xca\xc0N\xc0\x88\xc7l\xacS\xd9l\xbbU\x1b(\xdeJQz5\x19\xf4\xae\x1ce0<\xad\x0b\xd8t\x1ajc\xbfm\xb3\x08\xd8\xf4*qZ\x8bS\x8bp\x90m\xb7\xa0d}\xf2j\x0ec\x8d\x98\x026\xdb\x99R\x0d\xf5\x11\xa3\x93\x85MB\x02\xb1\xac1\x05L\xac'\x08\x18\x00\xac\x0cl\x05l\x10\xa1\x03\xea\xd6-\x1fJ\xbdDh\xc3Na\x9d\xb2ct\x89X\x15\xca\x9b\xa1_\xfa\x904\xa1\x0b\x98\xacuw\xa62\xe9\xf7hw!\xdbQzD\x10\x08%\x89L\xb7C(\xc9X\xe7\x15\xd3X'\x96\x80EsV\x8bJ\xd8\xa7O\xa9\x0d\x9f@,kl\x01\x13\xea\x09\x02\x06\x00+\x03[\x01\xa3c\xac\x07\xfb'\xc9\xf8\xf1l\x94\xd4M\x7fhE\xe8>E\xc1\xfaR\xe9\xaa\xd6\x90\x84\xaa\xa7\x94\x91\xa6\x13m3\x86\x90\xd3\xe9l\xe6\x7f\xbc\x10\xb1I\xa6\x14\xd4ukZ\x95\x81\x91dT\xafhJw*j\xb2\x08\xc4\x83\xa8P\x11\x9d\xa9R\xe36\xc0\\\xc6:\xaa\xe7\xd9=\xb0(\xce\xc2\xa9\xa8~\x9a\xcc\x1cB\x8eq\xb1\x07&\x945\xb6\x80\x09\xf5\x84u`\x00\xb02\xb0\x170\xd2\xa1\xbfN'\x93=G\xa34\xec\xecU\xc9\xf7ek=\xb3n\x09\xad\xcaS\xbe\xdc\x1f1\xe7\xc0\x9a\x10r\xfb\xf2\x92\x9c\x01\xb6^!OI:\xa0)OG2J\xcf\xcbDT\x05D\x81\xb8\xe4DR\xce\xeaT\xe4\xe2\xa6\x9ab\x1a\xeb\xa8\x9eg\x0bX4g=\x12r\xe69QJ\x8f\xa5\xcb&\x945\xb6\x80\x09\xf5\x84\x95\xf8\x00\xb02\x88C\xc0\x88|\x20?=)c]\x9bvOOi\xd8\xa3\xbe4\xa7\xef\xac\xfa5\\\xe3\x96R\xf3\x9a\xe8`\xcd\xb8\x0b\xd9\x7f\x7f\x86\x94\xb3\xe7\xdb)\x89\xde\xfb\x0b\x15\xacJ?\xa1+\xcf\xa8?S\xca,\x19\xd0\xfc0cu\xcf\xd86\x8f\xb4JI\xc3g\x1c\xd3XC\xf5\x1ce\x12?\x9a\xb3PUfrF\xf9(\xb1\x08\x98P\xd69\x04\x8c\xaf'\x08\x18\x00\xac\x0c\xe2\x110\x0bz\xc3\x06\x00\x00X^@\xc0\x00\x00HX@\xc0\x00\x00HX@\xc0\x00\x00HX@\xc0\x00\x00HX\x16\x20`\x00\x00\x00+\x03\x100\x00\x00\x12\x16\x100\x00\x00\x12\x16\x100\x00\x00\x12\x16\x100\x00\x00\x12\x96E\x13\xb07\xf0\x8b\xd1w\xc0MK\x00\x00\xee\x12\x20`\x00\x00$,\x20`\x00\x00$,\x20`\x00\x00$,\x20`\x00\x00$,v\x02v\x1a\xff\xfa\xbb\xe7\xca\xbc[?&wNoY_\xf1\xe2M\xf6\xeb\x1f\x0eV\x14y\xb7\xbc\xfcO\xf6\xe5\xf3\xbd\x9b\x8a\x9f\xba\xa8\x09\xd8\x8d\x17+\x8b6\xed\xbd\xc0yP\x04,\\\xeet\xe4w\x10\xfa\x96z5\"#9`\x04\xfc\xeeI\xd6^\x97\x98\xdcM\xec\x98\x8f\xed\x029\x84Rh8\xef>\x07:\x14\xdd\xa0\x9f\x15\x20\xe3!\xee]\x89\"\x1d\xca\xeeC\x8a\x1fD\xe3~\xdb1\x92\xc4\xdc%\x8d\xa8_\xc7R\xd8\x01\xaaV~rD\xc9\x20\xe4K\xcb\xf4\x0ff\x0a\xaf9\x03\x80\x1f2\xf6\x02\xf6\xe2&\\\xb6\x1e\xe3\x8f\x9f\xc5\xde2\x8cw\xd3\x1f_\xc4\xb8bk\x85\xf2\x0f\x95\xb3S\xf4KQ\xd1n&`\x17\x8a\xb1wk%\xc6\xaf\x99\x1eZQ\xae\x13\xe5z\x10*'d\"E\x0b\x0e\xe4AAmw#\x0a\x06\xdbPK0\x88\x1aI,\xce\x8e\xc4o\xbb@\xf4,&\xfc\x0e\xfa\x96C\x9f\xc3?\x11\xdd0\x12L\xa9\x0e\x0e\x1e\xf38\xcc(G\"S\x1d\xe8\xf0\x04\x99hB\x1dS1,\xcc\xdc\xc8\xf4\x10\xab\xd0\x90\x1e|d\xa8ZR\xfe\x1d\xa7\xd5\x1c\x9a\x95j\x20m\xcd\xf1\xce\x12\x00\xfc\xb0\xb1\x170\xbc\xe52\xb9}\x10{\xbd\xa7\xef\x90\x8f1\xbe\xa8\xa8\x14\xf6~\xae\xec\xfa\xbc\x18\x9f\"\xe4\"~@\xd9\xf1\xfdS\x98\x0a\xd8\x8db|\xf4\xb6\xb2g\x13\xfe\xd8\xf0\xd0\x8aP\xb6\xd2\xd8\x07\x1c4\xfcO\x09\x0a\xd0\xdfF\xf4\x10\xdeJ\xa7Li\xb1\xc3\xb4\xb5\xa6\xb6\xcc\xce]c\x8d?~\xdb\x05\xa2gA\x02%\x8e)2\xe9(\x09\xc44\x95\x1a\x94\x7f\xa6\xdc\xdc\x9baEB\x88\xbeC\xf6,\x8a\xa5p\x84\xcb\x8dh\x152h\x90\xa2\xfd\xca\x98L/\x8d\x10r\xcb\x03\x02\x06\x00:q\x08\xd8e\xe5\xe32\xc6o\xd0\xaf;\xf1iB\x8e>\xf02\xdbw\x14\xbf@\xc8A|\x94n\xdf,\xa3\x02v\x14\xefe{\xde\xc7?6<\xb4jq\x7f\x8e\xa1le\x10\xa8*\xd7.d\xe8C$\xac\xb5\xd6\xb0\x11Ah\x16\xf9\x9b\xe3\xb7]\x20z\x16$\xe0\xf7u\x91\x13>\xbf\x8d\x80\x91\x86\xd4\x99\x18\xfb\xe3\x100#72\x0f\x01\x0b\xa4\xb2\xb1c3\x08\x18\x00\xe8\xd8\x0bX%\xfd\xb8\x8d\xf1\xdf\xe8\xe7A\xda\xe9\"\xb7o\xb3}o\xe0g\xc9\x9d\x8d\xb4OF\xa8v)\x02\xf6\xb0\xd6\xf3R\xcc\xaf\xe9\x1eZ\xd1Z\xf69\x95\xa4\xb4\xbc\x88\x936\xcc\x19\x97\xd8\x08\xcd\xd6z\xa2\x20-\xe7q\xf6\xee\xfd\xa0\xcf\x9d\xe2*Q4\xafW\x9b\xf7\xca\x17lG\x93\x11\xaa\x0fWe;6L\x93\xa9\xcdY\x92\xbb\x94\xbe\xed\xbe\x16\xa5\xb4\xd7\xe58|\xe3\x82\x87Z\x94\xdcZ\xe3\xce(U\xf3l\xcbw\xe4\xb5\x89\x1e\xf8,\x02\xfe\xb6rR\xf2\x0a\x150\xd3oH\xb1-%n\x84\x9c\x11]\xc0\x1a\x93#\\y\xf9\xe2\x08\x02\xa6\xe7f[!B\xe4\xaa,gy\xf5,\x013\x0e\x89\xa7\x86}\x9fh\x8ep~\xb9\x1aG\xaf<\x00\xdc\xcb\xd8\x0b\xd8S\xf4\xe3_\x18\x7fO?\x9fe\x02Fn\x7f~\xfa\xb5\x83\x95X\x11\xb0\xef1\xbe\xad\x19\xbeHn*\xe3\xcd\xed\x8c\"l\xcc\xe3\x1b\x81\xbc\xb3i\x18\xb6mh\x872\x9cDyB&Fk\xadI\xda\xd1\xd7\xea\xca\x9f\xa1\x83\xccG\xbb\x07\xda]h\x9a\xdc\x0a\x06s\x1e\x0c\x06\x83a\xc16r\xb23;'\xdd]W\x85\xae\x92>T3x\xb24iX\x11\x9a\xced\xe4jhN/'\xbc\x07\xfak\xf6\xe1\x9fg\xb3i\xabj\xa9\xbe\xaf^\xaa\x12<\xf0Y\x04\xfc\xe3i\x93\xabd*`\xa6\xdf\x99\xa1\x86\xa4!\xd2\x81NP5S\x05,?\x8f//_\x9c\x10\xea\x8bD\"\xfdH\xc8\xcd\xb6B$\xec\xcc\xe9\xe8\xf5!\xab\x80\x99Y$q\xe3f\xc3/W\xe3\xe8\x95\x07\x80{\x19{\x01\xdbG?\x14\x01c\xb7\x1c\x99\x80\xdd9U\x861~`\xebNE\xc0\xaea\xac\x1a\x9eW\x04\xec;lbL\x82\xb5\xa2zuc5\xea&d\x08\xb9f\x88\x1f\x89sXzk\xedC\x1d\xec[\xa7\xd2\xc3p\xd1\xb6\xd7\xe6d\xbfG\x1fq\xe5#\xdf\x94\xd2MR\xa4\xa8\x8bN\x97\xe7\xb1\x88H\x92S\xe9\x80T\xb9\x88\xe8A\xcaV,&\xdd\x05\x84\x9ca\xdd\xa3\x01\xaa\xa5\x9c\x07a\x08I\xf2\xb6\xad!T\xc0x\xbf\xa4\xba`\xc2}\x98mI\xf5\x91[\xa3\xe5\xe8C\xa1\xbc\x9c\xb3\x90\xd6\xc3\x0a\x09\xb9\xd9Vh\xadG\xe9f\xcd\xe4Y\x04\xcc\xccb\x0c\xf5\x1ai\xf8Z\x985\x8eQy\x00\xb8wY\x88\x80\xbd\x81\x1fx\xe1\xf4\xc5\x9bl\x08\xa9t\xba\xd4\x95\x15\xef\xab=0c\xe4h\xd0\x8a\x1eW7\xdc\xb4\xcd\x13\x0f:\x1bq$\x8b+\x01\xf4\xd6\xea\xf7LS\xdc\xd5\x84\x8cgyj\x8f\x8f\x12\xb5\x07\x11C\xc0\xa4\xab\xda\xd6D\xdb\x06\x8fS\xed\xd5Ity\x06\x9bH\xe2=HlF\xab\x0dM\x92\x9a\xd5,\xc5\xeaj\xd1\x83\x20`M\xa8\x91\x09\x18\xef\x97D\xf22\x1fR-$\xaaN.\xaa&\\y9g!\xd4<<<\xdcB\x05\x8c\xcb\xcd\xaeB\x93\xea\xaa\x8bz\x8b\x80\x99YL'\x9b\xaa\xcf\xd7\xc2\xacq\x8c\xca\x03\xc0\xbd\xcb\x02\x04\xecv1\x9d\xc9't5\xc5\xb3\xe4\xce&\xfc9\xfb\xf2\x1a\x9d\x03+\xd3;^\x9f\xff\xe3_\xba\x87V-\x92\xe3$Btv\xa6\x01\xd5\xf6\xf3\xb1\x1d)zk\xcd\xd3\xfa.\xb4\xcf3\xd9\xbe9\x17e\xaa\xcb%b\x08X\xbe\xfeS\xa6{OOp\x9d*`t|\xa76g\xce\x83:\xea\x1bD#d\xad\xaaB%\x05\x82\x07Q\xc0&\xf6L0\x01\xe3\xfd\x12\xd2\xad\xaf\xfc\x90j\x86\x87\xd5\xe1\x1f_^\xd3\x197\x07\xc6\xe7fS\xa1\x11\xd5\xbdu\x12\x9f\xcbB\x9b\x03\x9b\x1e\x10\xfdr5\x8e^y\x00\xb8wY\x80\x80\xfdS\xbd1InV\xe0\x83\x84\xbc\xa0\xa8\x98\xc2\xedJ*`\xcf\xe1\xedw\xe8\xb7?`\xef\xf7\xba\x87V\xb4\x8aM+\xff\x02\xb1n\xc3\x18r\xd7\xa2\x93b&zk\xad\xf2\x8c0&\x94\xf6L{@S\x9d\x0e6\x01\xce\xda{\xc7U\xc1V\xf9\xb5\\\xdb\xc8-\xa0\xd3\xda\xe5\x16\x01\xe3=Hl\x1a\xae\x1dM\x91j\x0fK\xe2\xa9\x16\x97E\xc0\xc1\xfa\xad]hB\xa8ET\x01\x13r\x03\x80{\x96\x05\x08\xd8\xbf6\xe2\xa3\x8aL\xd1\xa5_{\x09\xb9\xb6\x1e\xff\xfa\x0e\xb9y\x90\xad\x03\xbb\xec\xc5/(#\xca\x8b\x9b\xb8\xe7\x8aZ\x11\xcaS\x14\xec\xa4\xa4\xcd\xe1\xdc\x8f\x1c\xe9\x96U\x10zk\x1d@]\xf4\xa3\xfe0\xed\xa8\x9d\xa1\x9b\x85\xdb\xd8\xbf\x85\x84|\xab\xee\xe3\x05L\xef\xc6\xb8\xa9t\xcc\xe4Y\x04\x8c\xf7\x20eN\xd1\x15T\x85tN\x89NXu\xa2>\xc1\x03\x97\x05'`\xbc\xdf\xe9\x82z\xb2\xcd7cd\xc1\xe0\xca\xcb9\xe3\x04\x8c\xcb\xcd\xb6B\x05nE\x1f\xc3\xab,\x02\xc6e1\x99^\xae\x0c\x09g\x0a=b-\xa2\x0a\x98\x90\x1b\x00\xdc\xb3,@\xc0\xc8\xdb\x18W>\xf5\x13\xbc\xf1e\xbcU\xf9\xe9\xe3\"\\\xf6\x13/\xde\xc74\xeb\xfcz\xec\xdd^\x89\xf1\xee\xdb\x86\x87V\xe4KM\xb9\xcf\x8d\xf4\xb9\xfc\xe3\xc8x\x8cHc\xa4\x0d\xb5\x8c\xb0\xad\x00\xf2\x9f\xec\xadF'h\x0bL?\xd0\xd7S\x8d\x06\xe9\xcf\x0dRs\x8f/m\x9c\xb7\x9d\x1eb\xb7\xf2\xc6\xd8n\xb4\xb9\xedp>r5\x0d\xc9\xc1\x94\xea!2R\x9d\x12\x94\x05\x0f\x12\xca\xef:\x9e\xe3\xa4\x03\xbf\xaa\xa4@_\x20\xa9J\xf4`f1\xe9_\xf7\x8d\xf2\xf5\x9bu\xfeI\xceo$X\xeb\x1a'\x97\x9c\xbb\x82\x11\xba\x12\xdfX\x03b\x94\x97s&\xac\xc47r\x8bQ!n%~\xc8\xe1>T\x9f\x91\x94\xdc\x11RW\xe2\xb7\x04\x83W\x85CB\xce8\xee\xef\xe8\xf5%\x07\xf9Zp5\x8eUy\x00\xb8wY\x88\x80\x91\x0b\xbb\xcb\xbc[^\xfe\xfef\xd1\x037\x94o\x7f;X\xe6\xdd~\xe1c\xb5\xd3u\xed\x85\xca\"\xef\xf6S\xa6~)\x02\x16\x18\xf5\xa59\xd6\xf6k\xdf\xa7$\xe31\"\x95[\xe9\x08\xa1T\xf5\xb9\x9b\x81u\x19Nfy\xa2\xf0\x90;%\xb3Pm\x80\x91\x1d\x19\x8e\x07\x87\x05\xdbQ\xf5!\xc2\x12\xfa\xe3LK\x8e\xe4\xf2wx\xa4\xc2Z\xe5\xa7\x94P\x9a\xf2o\xad\xe0Az\xbc\xda\x99U%3g\xc7\xf2\xb4u`\x9c\x073\x8b\x06\x84\xe8T\xd36\xfa<\xa3\xe9w@1\xac#;\x94\x7f\xcf\xd2g!W\x1be\xd7\xcb\xcb9S\x9f\x85T\xfc\xb0Yy=\xb7\x18\x15\x1a\xe5\x9e\x85\x0c\x97fd\xef\xe9HV\x8a^\xadM|\xf9\xf9,\x08}\x16\xd2\x91Y\x1a\x12j\xc1\xd58V\xe5\x01\xe0\xde\xc5N\xc0\x16\x9fK\xe6cDK\x869\xea\x03\x00\xe0\x1eb\xe9\x05\xac\x1e\x1d\xb03Yt@\xc0\x00\xe0\x9ed\x89\x05,4\xd6\xb5J\x92\xed\xac\x16\x1d\x100\x00\xb8'Yb\x01+G\x08-\xb9\x98\xa8\xb3\xdb\x00\x00\xdcs,\xb1\x805\xa5\xba\x96~\x00\xc9f\xb7\xc7\xec\xac\x00\x00H8\x96X\xc0\x00\x00\x00\x16\x0f\x100\x00\x00\x12\x16\x100\x00\x00\x12\x16\x100\x00\x00\x12\x16\x100\x00\x00\x12\x96\xc5\x12\xb0\x1b\xc2\xc3C\x0f\xc56\x04\x00\x00X,\x16G\xc0\xee\x9c\xf2\xde4\xbf\x81\x80\x01\x00\xb0$,\x8e\x80\xdd\xd6\xdf\xcb\xca\x00\x01\x03\x00`I\x00\x01\x03\x00\x20aI\x0c\x01\xeb-\x88\x11';~\xb6\xd5\xd8Y\x00VV\xca1\x9b\xbc\xdf\x8cgr\x17X)\xd5\x04\x16\x80\xad\x80]{\xe1\xe1\xa2\x8d;\x7f\xa3\xce\xd1\xdfx\xb1\xb2h\xd3^\x161\xed4~\xe3\xfb\x17+\x8a*_\xfe\x9e\xc6\x84\xa4\\\xd6\x93(\x02\x16.w:\xf2i<\x9d\x16\x94\xab\xfex@x\x8d\xe1\xe4\xb6LGI\xac\xc8\xb0\xb3h\xfc\xf7\x9f\x9f\x0c\xa3\x00\xa9EI]vvQ\xa0/\xf8B\xae\x0d#vv\xf3\xa5\x06\xa1fB\x03\xd5\"k\x03\x1ap\xdd\xd5\x06\x1b/+\xe7\x985%\x1d\x8e\xfa\xfb\xa2\x1c\xa8\x7f\xa3\x9a\x0b\xa4'Y{\xe1[r\xb7\x9d\xe9\xbcl\x17\xc8!\x94B\x0fc\x9f\x03\x1d\x8an\xd0\xcf\x0a\x90\xf1P\xcc\x88\xca\xea;\xf0\x0e!\xf5\x1dx6\x8cp\xef\xc0S\x18Ka\x12A\xdf\x81\xe7\x88\x92A\xc8\x97\x96\xe9\x1f\xcc\x14\xa3\x00q\xd8\x09\xd8\xe5b\xbci\xfb\x8f1\xfe)}\xd7\xfd\x85b\xec\xddZ\x89\xf1k\x84\xc5\x81\xac\xc0\xc5\x9b0\xder\x9b\x9c>\x88\xf1\xbe\x837\xf44\xad(\xd7\x89r=\x08\x95\x132\x91\xa2E\xa8\xf6\x08\xaf1\xf4e\xbeR\x9d:I\xe2\xe3XR\x87\x9d\xc9l\xce\x8a\x8d\xa7j\xd5\xb7\xf4\xa1nN\x089\x83\xb3s64\xfa\x8a\xd5\xc1\x8e\x82E\x7f\xbb\xe9xz\x13=\x02\x93M\xe9\xe3\x96=}i\xdd\xda\xd6\xdc%[lV\xd81\xe3\xb2\xe8Kn\x8dfa\x1e\xa8\xf9\xb0x\xd5\\\xa0A#\xd2^\xb9\x8bbG]\xd1\x93\xc5c\xbb@\xf4,&\xfc\x0e\x9f\xf2\xe1s\xf8c\x8cs\xe8[\x88\x83\x83\xc7<\x8eP\xf4\xfd\xe2[\x88c`\x1c\x07\xee-\xc4\x8c!\x16\x07\x82\xbd\x85x\xf6+\x17\x06\xd2\xd6\x1c\xef\xccC\xb1\xa3\xd1\xdb\x09\xd8>\xfc\xb2\xd2\xf9\xba\xb8\x11\x9fW\xfa_\xc5\xf8\xa8\xf2\xe5\xf3M4\xf6\xd0i\x8c\x7f\xfc9!\xe7\x8bh\x88\"\xeb\x10\x12e+U\x1dp\xd08\x15%\x88\xc6\x97\x20#\xc2k\x0c'Q\xab\x16\x8f1\x0e.\xa9A\xd1\xe6\xc9\x1a?\xff-\xacF\xd7\xe5_\xab\xc3\x19\x88\xb6\xb3P_r\xbf6gN\xa3\x05\x90\xa7\xea\xf2q1\xca\xaf\x80M\xc9\xe6\xc9D\xe1\xdc#\xf1\x15v\xcc\xf8,\xea%\xab\xca/\x9cE\xac\xe6\xc2\x0cZ$-\xe8A\xaa\x18\x1f\x95GO\x16\x8f\xed\x021J\x16(qL\x91IGI\xecv\xc6\x8e\xce\x94\xdb\x12M\xccD\x88F\x1f\x1d\xfe8\x0c\x0bRe\x8d\xc4\xc51\x99^\x1a\xa1\xd1,\x16.`\x95\xea\xc8\xf0\xed\x83\x7f\xa0#\xc5\xbd\xec\xb7\xf7\xf1\x8f\x99\x80\xb1=\xcf\xe1\xe7\xa2\x08\x18\xab\xc81\x94\xadt\x81U\xe5\xda\x85\xf8\xa3\x13F\xf3\xe8\xfaWg\xdd\xb23\x89\x02\x1f\xb9\x8c\x06\xfba/!\xe3\xafR\xce@\xb4\x9d\x85zv\x8e\xa1\x85\x14c.\xca\xd5(\x01\xf5fl\xa4Y\xd8\x94l\x9e|9\xd7\x05FV\xdc1\xe3\xb3\xb8\x95e\x09\xa4\xf0o\xb0\x88\xd5\\\x98A$\xac\xb5\xd6\xb0%\xba\x0d\x87\x9e,\x1e\xdb\x05\xc2\x85\x12\xf4u\x91\x13>\xbf\x8d\x80\x91\x86\xd4X\xb3>q\x08X\xf4\xd8\x88\x949\x04,\x90\xca\xc6\x8e\xcd\x0b\x17\xb0\x9f\xe2\x9d\x9f\xeb!\x1e\x1f\xd6\xa2>\xde\xa6\xf1kO\xe3-\xec\xcb)\xfa\xd2|\xab\x80\xade\x9fSIJ\xbe\x11'-\xd6\x8c\xcb,\xc2t\x86:\xa8\xaf\xa3/\xbaI:A\xc6$:\x08\xaeE)\xedu9\x0e\x9f\xfa\x876\\\xeeJ\xc9\xdc\xc0\xae\xac\xe9\xf4=\xec\xa7\x03J\x92N\xd2\x89\x8c\xe8\x20\x0c1\xd9\x89\x82\xb4\x9c\xc7\x956\xd3\xab\xcd\x1b\xe4kVc\xc9\xbb\xd8\xa7\xb4G\xb3\xe5\x0c\xb8\xcdZ\x94\xdcZ\xe3\xce(\xb5\x1c-\xf5\xecT\xb9\x85,\x08\x09\xfa\xdc)\xae\x92lk\xb2\xb6|\xfdm\xf5\\\xc9\x0c[\xde\x83\x19\x00i4Y\xa9U\xb8*\xdb\xb1a\x9aL\xa6\"\x94\xc4b}\x8b\xb5\xd0\x93\xf1\xb6Q\x89a\xd0\x9a\xd3\x17F\xe1\xbe\x9c\xb6\xe5\x8b\x80\x7fd\x1503\x8b$n\xdc\x1c\xade\x85:\xed\x04\x8c\\>\xe8\xc5\x18\x17\xbdx\x9b|\x87M>\xd6\xc3\x15E\x170\xad\x8f\xb4\x1au+\x17)r\xcd\x10?\x12F\xf0\xe6\x10\x92\x8fj\xe8T.\xa5*\x97\xb2\x15qoP\x14w\xfa$\x9b\xe5\xef\xd3\xfbn\x1d\xea_\xeb\xd5'\x88\x80\x99\xac\x0f\xd1I\xa5a\x163Q\xe8\xb1^M\xa9\xd5l3\x15\x975.b107\xa5\xec)\xa5\x99\xb9\x0b\x08O\x88\xfd\xf1\xa0g\x84\xcf\xa2\xcdE\xe5\xa8\xcd)&;\xc3\xfe\x14\x0dP\xe5\xe6J\xc6\xd9r\x1e\x82.\xb2G\xdaC\\L\xa0\xf3\x91o\xca\x98\x17t\xe8\xe3\x19\xa3db\xddx\xdbhD78\x93\x82R\xfa\xd9\xd6r\x1d\xb3*'\xedT\xd7\xb1\x18\xbe\xe6\x99\x8fqP\xc5\xc1\xd78\xbd\x96f\xa1\x1f(\xb3Brk\xb4\x1c}\x18\xebB\x0ci=\xac\x90\x90\x9bm\x85\xd6zn\xd1\xc8\xab\x16\x013\xb3\x18\xe3\xa6\x9a\xa2\xb7,\xdb!\xa4\xc2\xed\xcf_\xdb\x8a\xf1\xb3\xb4\x07v\xcd\xfcuN\x01{\\\xddp\xd3\x1a\x13\x0f:\x1bq$\x0b\xf7A\xa3\x0bX\xb5\xbe\xd9\x8fFM\xdb\x1e\xa4\xbdLu4)r\xabcrZ\xe2\xf6\x89\xc9\xfc\x9ei\x8a[\x8d\xba\xcd\x1d\xafZ\xfd}\xacR\x0d1\x86\xdc\xd1\xafR6\x0d\xd0\x86\x84\x1b\xa4!\xd4<\xd4W\xe0\xa0>\xb8,\xc6\xb3<\xb5\xc7G\xc9\xb4\x98\xacF\x0d\xb9\xb6\x9a\xc5\xcc6J\xc6\xd9r\x1e\xae\xa2[\x0f>\xbavJ\xed(\xe5K\\\x7fi\xb6\x80\x89u\x93\x84\xbe\xd5l\xa2\x19L\xd6In\x94%\xed\xa1U[\xaec\xe68\xa0\xee\x13\x05,\xc6A\xb5\x0aX\xb4u\x0e\x86\x80\x19\x15\xe2\xb9\xfb\xd5\x8c~\x86b\xd7\xc2Do\xad\xf1$\xe3\x04\xcc8\xb1\x13m\x1b?M2[\xc0\xc4\xba\xcd\x9eR\x11\x89f\xd0\xe8j\x0f\xa1\xd01\x17\xfd\x93\xbaL\xc7l\x1c\xf5\xd0}S\x16\x01\x8bqP\xc5\xa6?l\x89&\xaab\x08\x18WH\x93\xbb_\xcd\x18g(f-L\xf4\xd6\x1aO2N\xc0\xf4\x13;\x9c\xe9\xde\xd3\x13\\g\x89Fo\x7fM\xf2\x97\x06/`\x13{&\x98\x80\xf1~\x09\xe9\xd6\x0f\xbaT3<\xac\x0e\x84\xc4#\xa9;\xe3\xe6\xc0\xf8\xdcl*4\xa2\xba\xb7N\xe2sYhs`\xd3\x03$V\xcb\xb2\x11\xb0\xef\xf1\x03\xff\xa4\x9f\x971\xbeM\x9e\xc3\xdb\xe9j0\xf2\x07\xec\xfd~n\x01[\xc5\xe6\x15~\xa1F\x80\x1dC\xeeZtRpk\x11\xb0z\x8b\x80}\xc8_%\xb7\x8c\xfbC\xb9\x9d\xeb\xd6\xe6\xf6\xe4\x12\x113Y\x95g\x841A\x7ff\xc7\xab\x83\xfd\x81\xa8K\xba4\xcbV007%6{\xd7\x8e\x84\xd1\x97zv\x9c\xb4\xf7\xc0e1B\xff^Mu:\xda\x84d\xd5\x1e\x96\xc4S-\xe4\xc6\xd9\xf2\x85\xcci\xca\"\xeef5E>?\x81#\x0a\x18-\x99X\xb79\xee[\x92\x98\x06t\xaa5\xa4\xfdu^\x9ec6\x93\xfasu\x9f!`\xf5\x962\xf0\x07\x95\xcf\x8d\x90CR\xb4!s\xbc\x02v\xb7\xaa\x19\xfd\x0c\xc5\xae\x85\x89\xdeZ\xe3I\xc6\x09\x98~bs\x0b\xe8\xdf\xf1r\x8b\x80\xd9_\x93\xfc\xa5ada\xdeM\x12\xfc\x129\xb3>[\xedp\x1am0\xc6\x85\xc8\x09\x18\x97\x9b]\x85&\xd9\x85@\xac\x93\xf8\\\x16\x01\x07\x1b\xb9u\xa1\x89\x18-\xcbN\xc0\xc8O\xf1O\x15\x05\xbby\x10?\xa5\xa8\x98\x17\xbf\xa0\xe8\xd4\xc5M4\x08\xb7\x20`\xa4\x08\x7f|[\xbfYI\x97Q\xe4)\x0avR\xd2d\xea~\xe4H\x17\xbbM\xa6\x809\xf6(\x83\xe05\x16\x01\x9b\xca,\xa4\xedl\x17;\x05d\xb3G\xbby\xeb\xaf\x95\xce\xa0Z?\x111\x93\x0d\xa8\xa3\x8cz6l/,$\xe4[\xf6\xc37\x92q\x07\x9e\xbfJM\x03nS\xca\x9c\xa2\xcbN\x0a\x99\xc5\xd8a\xf5\xeaV\xcfNf\xdd\xe8/\xf8,\x1a\xd0\x19\x96v\x9b\x90\xac\x8fM\x0et\xa2>!7\xce\x96/\xe4\x86\x82rR~\xbf\x8fe\"\xfc\xa16\x04\xcc(\x99P7\xdev\xac\xc1\xd2%\xb0\x1ap\x8c;\xd5\x09\xebe;f\x9b]\xf4\xba\xafb\xd7\xady\xe6c\x1cT>72\x93\xab\x85P\x17\x89W\xc0\x16\xbb\x9a&\xd1\xceP\xccZ\xe8G\x87\x98\xad5\x9ed\x9c\x80\xe9'\xd6M\xa5c&\xcf\"`\xf6\xd7$\x7fi\x18Yp\x02\xc6\xfb\x9d.\xa8'\xdb|3F\x16\x8c\xe8\x17\"'`\\n\xb6\x15*p+\xfa\x18^e\x110.\x8b\xc9\xf4rE\x09f\x0a=\xb1Z\x96\xad\x80\xdd\xd8\x84\x8b\xb6l\xf5\xe22:\xfdu~=\xf6n\xaf\xc4x\xf7m\xab\x80m\xc7\x18_\xd0\xd3\xb4\"_j\xca}nc\xbd\xc3q$\x0b\xa5)\xff\xd2\xdbB\xe1\xcd\xee\xf4\x82\x1e-A\xfd*5\xf9\x882\"iL\x1f&\x0b\xa9\xf8a}\x0e=\xb7\x18\x15\x1a\xe5\x9e\x85\x0c\x97fd\xef\xe9HV\x8a^\xad\x9eL\xe4\xe7\xb3P\x08\xf9\x1c\x99\xa5!\xa1\x16\\\x8d\xed\xd7\x81-\x06\x97\x84\xc7\x88\x16\xc0.)\xda\x1d\xa88\x09\xc4^\xc5;\x1b\xb3\xab-\x89\xc9]\x17\xb0\xd0X\xd7*iV\xc7{\xa5\xb2\xc0\xb3\xbe\xc0d\x8b\x80\xec\xaa[\xeev4\xef\xca\xcf[\xc0V\x04f5\x1f\xd4F;\xd6\xf9\xfc\x95\xc5\xbcOKbr\xd7\x05\xac\\9\xd3\x89r(\xd5\xd9\xc1y\xb3\xc0d\xf7\x06\xf3\xaf|\xf8\x0c\xaa\x9b_\x8a\x15\x00_\xcdp\xaf\xca<\xc6\x9fK\xce\xfcOK\x82r\xd7\x05\xac)\xd5\xf5\xef\x0e\x20\x97\x0c6;\x18\xfb\xee],\x16\x98\xec\xde`\xfe\x95_\x8b\xf4;8\x09\xc4\xfc\xab\xb9\xbc$Zy\x17\xcc]\x170\x00\x00\x80\xbb\x05\x08\x18\x00\x00\x09\x0b\x08\x18\x00\x00\x09\x0b\x08\x18\x00\x00\x09\x0b\x08\x18\x00\x00\x09\xcb\xe2\x0a\x98\xfe|\xd1\xdc\xbcA\x1f\x06\xd7X\xfc\x18\x92\x00\x00\xfc`\x00\x01\x03\x00\x20aY\\\x01\xbb\xfc\xeb\xf3v&\x04\x04\x0c\x00\x80Ebq\x05,>@\xc0\x00\x00X\x14\xee\x15\x01\xdb6\x9f\xe7r\x01\x00\xb87\xb0\x13\xb0\xdf\xe0S\x17*\xbd?\xb9\xa6\xbe\x18l\xd3^\xed\xad\x85\xd7\x8eT\xae\xdf\xb4O}_>\xb7\x83\xce\x81\xbd\xa1\xcf\x83=\x8b_&\x96d\x9f\xef\xddT\xfc\xd4E\x8b\x80\x85\xcb\x9d\x8e\xfc\x0eB_Z\xa7\xbd.\xfa\x80\xf8\x02\xc48\x08\xa3\x00\x0d5\xf8o\xbcug\xbe\xf4$k\x8f\xf4&w\xdb\x99\xce\xcbv\x81\x1cB)\xf4%\xb7}\x0et(\xbaA?+@\xc6C1\x9f\xe1Q\xdf\xe9t\x08!\xed=\x92s2\xc2\xbd\xd3Ia,\x85\x9d:\xfaN'G\x94\x0cB\xbe\xb4L\xff`\xe6\xc2\xdf(\x02\x001\xb0\x17\xb0\x17\xbd\x18\x17\xdf&\x17\x8a\xb1wk%\xc6\xaf\xd1_\xcf{q\xf1\xf62\x8c\xe9\x8c\x17\xbf\x83\x0a\xd8?p\x11{\xfb\xe1\xedb\x1a\xba[Hv\x0a\xe3\x8a\xadEE\xbb\x05\x01\xcbu\xa2\\\x0fB\xe5\x84L\xa4h\x91}=Q\x038\x08\x9c\x15_\xd0Y\xb5\xea[-\xd4`\x14\x03\x8b\xedl\x16b\xd0\x88\xb4WH\xa2\xc6(\x09T\xf4d\xf1\xd8.\x10=\x8b\x09\xbf\x83\xbe\x9a\xda\xe7\xf0OD7\xa4o\xd5\x0c\x0e\x1e\xf3X\xe27\x9a\x08o\xd5\x8c\x81q\x1c\xb8\xb7j2\xd4\x00\x8f\xec\xad\x9a\xb3\x1f!\x1eH[s\xbc3\x0f\xcd\xe7\xe5[\x00\x10\x1f\xf6\x02\x86+\xcf_8Mn\x14\xe3\xa3\xb7\x95.\xd4&\x1a\x99\xe8\xbbb\xfc\xf2mr\xe7\x0d\x1a\xdcC\xd8\xc1\xeeB\xee\xc4\xa7i\xca\xf3x+\x11\xf7^\xc4\x0f\x9c\xbeC\xbe\x7f\x0a\x0b\x02\x86\xb2\x95&5\xe0\xa0\xafX)A4\x0a\x00\x19\x89\xe3\x05\x88k\xfc\xfc\xb7\xb0\x1aJ\x97\x7f\x83\x08g\x20\xdaFa!\x06-\x92\xf6\x12\xefT3\xf2\x93\x15=Y<\xb6\x0b\xc4(Y\xa0\xc41E&\x1d%\x81\x98\xa6\xec\xe8L\xb9\xc5\xf8P\x1cq\x84\x87\xe7\x8fC\xdc\xe1\xe1'\xd3K#\xf4\xed\xec\x20`\xc0\xe2\x13\x87\x80]\xa6\x9fG\xb5@\xdc\xef\xe3\x1f\x13\xf22\x0d\xf1\xa1\xb0[\x91*a\x07\x13\xb0\xd3\xea\xde\x83\xf8\x94%\xd9A|\x94n\xdf,\x13\x05\x8c5\x98c(\x9b\xbe\\\x94)\xd7.\x14\xbb\x15\xea\x88a+\xaa\xd57\x8e\xf1\x02\x1654V\x0c\x16b\x10\x09k\xad5\x1c\xfb}\\z\xb2xl\x17\x08\x17\x1a\xcb\xd7EN\xf8\xfc6\x02F\x1aRgb\xec\x8fC\xc0\xa2\xc7\xfa\xa2\xcc!`\x81T6vl\x06\x01\x03\x16\x1f{\x01\xabd\x9f\x0fk1!o\xd3\xe8\xb6[\xb4/7n\xdc\x11w0\x01\xbbY\x84\xff\xa9\xfc\xeb\xa5\xff\xf2{\xefl\xc4\x17\xd9\x97\xa3\x82\x80\xade\x9fSI\xca\xf5\x1dq\xd2\xcb\x7f\xc6e^\xea\xb5(\xa5\xbd.\xc7\xe1c\xc1\x0d\xc8\x89\x82\xb4\x9c\xc7o\x11\xd2\xabM)\xe5kVc\xc9\xbb\xd8\xa7\xb4G\xb3\xe5\x0c\xb8\xcdZ\x94\xdcZ\xe3\xce(\x15\x1b\x92\xe8L\xcf\x82\x90\xa0\xcf\x9d\xe2*\xc9\x9e\x9d\x9b\x89\xd9Z\xed\x93i\xb6\xa3\xc9\x08\xd5\x87\xab\xb2\x1d\x1b\xa6\xc9\xd4\xe6,\xc9]:J,\xd54<\x88\xe5m\xcb\xd7\xdeknz\xe0\xb3\x08\xf8\xdb\xcaI\xc9+T\xc0L\xbf\xa1d\x1a]\xcf\x8d\x903\xa2\x0bXcr\x84+/_\x1cA\xc0\xf4\xdcl+D\x88\\\x95\xe5,\xb7\x86\xc6\xe2\x0e\x89\x16\xdbo\xa29\xc2\xf9\xe5j\x1c\xbd\xf2\x00\x10\x0f\xf6\x02\xc6\xbaS71\xde\xb2\x9dQ\x84/\x90\xf5\xf8o\xfa~q\x87\xba\x90u\x1f\x1dC\xbeO\x13\x0a{\xbf\xa7\xb1%)\xa7\x05\x01\xabS7\xb2i\x18\x9bm4D\xcf\x80\x16\x17\x98\x12\xeaLF\xae\x86\xe6t\x16\x7f\xae&iG_\xab+\x7f\x86\xdc\x0a\xb2x(A]\x89j$U\xe0$\x94\xdb\xd9\x9b\xa9\xd8r\x06\xdc&u\x96}\xf8\xe7\xd9\xe24\x90\xe0\xcc\xc8B\x19\xc7>\xda=\xd0\xeeB\xd3\xb3r31Zk\x1c\xc94\xdb\xc8\xc9\xce\xec\x9ctw]\x15\xbaJ\xfaP\xcd\xe0\xc9\xd2\xa4a\xb1\x9a\xa6\x07\xa1\xbc\xd5R}_\xbdT%x\xe0\xb3\x08\xf8\xc7\xd3&W\xc9T\xc0L\xbf3C\x0dIC\xa4\x03\x9d\xa0j\xa6\x0aX~\x1e_^\xbe8!\xd4\x17\x89D\xfa\x91\x90\x9bm\x85H\xd8\x99\xd3\xd1\xebCV\x013\xb3H\xe2\xc6\xcd\x86_\xae\xc6\xd1+\x0f\x00\xf1`/`\x07\xe9\xc7w\xd8\xe4c\xa5;uC\xdf/\xec\xd0\x04\xec<\xdeM\xc8S\xf8}\xcb\xdek\x18\xabi\xce\x0b\x02\xa6\xc5^[\x8d\xbai\x14n\xd7\x0c\xf1#~\xa6H\xa2\xb1\x0c\xab\\\x84\xb6Kz\xabr\x98\x85\x87\x13\x063WS\xb4`4R\xe6\xa4\xd2r\\\xc4b`nJ\xd9S\x84L\xba\x0b\x88\x88a\xc0e\xd1\xe6\xa2\x8d\xa8\xcdi\xf1\x20\xa0\xb7\xd6x\x92q\xb1\xfd\x90O)\x85\xf2\x7f\xa4\x8bN\x97\xe7\xb1\x18\xc7f5y\x0ffy\xcf\xb0\xee\xd1\x00\x0bVfz\x10\x86\x90$o\xdb\x1a\x16\xdb\x8f\xf7K\xaa\x0b&\xdc\xea\x1b\xe5\xa5\xfa\xc8\xad\xd1r\xf4\xa1\xf5H\xea\xceBZ\x0f+$\xe4f[\xa1\xb5\x9e[4\x92\xa0E\xc0\xcc,\xc6\x8c\x18\xa0b-\xcc\x1a\xc7\xa8<\x00\xd8\x13\xa7\x80\xdd\xa4\x03D\x9d;\xda\xbc\xd8\xac\x1d\x9a\x80\xdd\xde\x88\xbf\xff'\xf6\xde\xb4\xec\xbd\xa9\x87\xef~_\x10\xb0\xc7\xd5\x0d7mY\xc4\x83\xceF\x1c\xc9\xfc\xfdv\x16z\x94\xcd\xb0\xf8=\xd3\x14\xb7\x1a`\x98kJ\xb5\xfa\xab'Y\x9c\xf89\xc3\xc3\xb3\x19\xa26d\x89\xa4h\x18pY\x8cgyj\x8f\x8f\xaa\x81\xac\xed\x04,\x9ed\x9c\x80Iz\x98\xe6\x89\xb6\x0d\x1e\xa7\xda\xdf4\xab\xc9{0\xcb[\xa3\x86\xb5Z]-z\x10\x04\xac\x0952\x01\xe3\xfd\x92H^\xa6\xb6\xd2N\xa2\xea\xe4\xa2j\"\x1eI\xddY\x085\x0f\x0f\x0f\xb7P\x01\xe3r\xb3\xab\xd0\xa4\xba\xea\xa2\xde\"`f\x16\xd3\xc9\xe6\xdf#\xbe\x16f\x8dcT\x1e\x00\xec\x89S\xc0H\x996\x99E>\xff\xc7\xbfH%V\x9f\x18\xfa\xf8\xa7\xa7\xc4\x1d\xda\xb3\x90/\xe2\xd3\xa7\xf1\xb3\xd6dw6au\xe1\xd8k\x82\x80\xa9w\xc5&\x11\xa2\xc3\xc0\x06T\xdbo\x04\xffd\x98Ax\xf3\xb4\x1e\x02\xebYpMI\x96\xf4E\xac|t\xe5\xe8\x02\xc6FQ\x83\xd6\x20\xa9\x86\x01\x9f\xc5d\xfb\xe6\\\x94\xd9h\xf1\x20\xa0\xb7\xd6x\x92q\x02\xa6O\xa6\x0dg\xba\xf7\xf4\x04\xd7Y\xa2+\xf3\x1e\xcc\xf2\xaeUU\xa8\xa4@\xf0\x20\x0a\xd8\xc4\x9e\x09&`\xbc_B\xba\xf55)R\xcd\xf0\xb0:\xfc\x13\x8f\xa4\xee\x8c\x9b\x03\xe3s\xb3\xa9\xd0\x88\xea\xde:\x89\xcfe\xa1\xcd\x81M\x0f\x88~\xb9\x1aG\xaf<\x00\xd8\x13\xaf\x80=\x87\xb7\xdf\xa1\x9f\x7f\xa0K'\x8ejkU\xf7\xe27\xc4\x1d\x9a\x80]\xc4O=\xa5\x06\xea\x16\xf6\xbe\xa0\x8a\xda\xedJA\xc0V\xb1\xf9\xab_\xa8\x913\xc7\x90\xbb\x16\x9d$\x1c\xe6\xc5]\xe5\x19a\xb0\x85N\xac)u\xb0\xbeC]\x92\x1e\xaf}\x96\x80\xa9\x06\xe6\xa6\xc4&\xdc\xda\xad\x91\x14\x0d\x03.\x8b\x11\xda\x95\x99\xeat\xb4Y\x9c\xf1\xe8\xad5\x9ed\x9c\x80\x95k\x1b\xb9\x05tZ\xbb\xdc\"`\xbc\x07\xb3\xbc\xd5\x1e\x96\xc4S-x\xe0\xb2\xe0\xc2\xc3\xf3~\x89\x9cY\x9f\xadv8\xcd{\xb4\xe2\x91\xd4\x9dq\x02\xc6\xe5fW\xa1I5\xc4\x90u\x12\x9f\xcb\"\xe0`=\xea.4!\xd4\"\xaa\x80\x09\xb9\x01\x80-\xf1\x0a\xd8e/~A\x19\x00^\xdcD\xc5\xe7\x86\x17\xbf\xc1\xd6\x81\x15\x7f'\xee\xd0\xdfFQYTTqgV\xb2k\xeb\xf1\xaf\xef\x90\x9b\x07-\xeb\xc0\xf2\x14\x05;)i3%\xf7#G\xba\xb0\xd6\xc0\xbc\xb8\x07\x10[h_\xcfft\x0a\x0b\x09\xf9\x96\xfd\xf0\x8dd,\xdb\xe7\x05\xcc4\xe06\xa5\xcc)\xba\"\xc9\x1a\x0f\xcb0\xe0\xb2h@g\xd8\xaem\x16gd\xec\xb0\xae\x97Fk\x8d'\x19'`z7\xc6M\xa5c&\xcf\"`\xbc\x07\xb3\xbc}l\xc2\xaa\x13\xf5\x09\x1e\xb8,8\x01\xe3\xfdN\x17\xd4\x93m\xbe\x19#\x0b\x86p$\x0dg\x9c\x80q\xb9\xd9V\xa8\xc0\xad\xe8cx\x95E\xc0\xb8,&\xd3\xcb\x95!\xe1L\xa1G\xacET\x01\x13r\x03\x00[\xe2\x150r~=\xf6n\xaf\xc4x7\xbd\x93x\xbe\x08o\xdc\xbe\x09\x17\x9d\xb7\xec\xd0\x05\xec\x0d\xcc\x1e#\xb2&\xfb\xb8\x08\x97\xfd\xc4\x8b\xf7\x09\x02\xe6KM\xb9\xcf\x8d\xf4\xb9\xfc\xe3Hx\x8cH\x8d\x0e5R\x9d\x12\x94i\x20e\xff\xc9\xdejt\x82\xeeh\x90\x9a{|i\xb4\xf3\xf6\xb8\xbe\xe8B\xb0\xe5\x0c\xb8M\x09\xe5w\x1d\xcfqZ\xef'\x9a\x06f\x16\x0d(\xfd@_O5\x1a\x14\x0d\x08)5\x86\xb8#m\xa8E\x1d\x8c\xda'\xd3m\xa7\x87\xd8\xad<6i\xd7\x806\xb7\x1d\xceG\xae\xa6!\xbe\xe8\xbc\x07\xae\xbcUI\x81\xbe@R\x95\xe8\xc1\xccb\xd2\xbf\xee\x1b\xe5\xeb7\xeb\xfc\x93\x9c\xdfH\xb0\xd65N.9w\x05#t%\xbeQo\xa3\xbc\x9c3a%\xbe\x91[\x8c\x0aq+\xf1C\x0e\xf7\xa1\xfa\x8c\xa4\xe4\x8e\x90\xba\x12\xbf%\x18\xbc*\x1c\x12r\xc6q\x7fG\xaf/9\xc8\xd7\x82\xabq\xac\xca\x03\x80=q\x0b\x18\xb9\xf6Be\x91w\xfb)u%\xc4\xe5g+\x8a\xca\x0e^\xb6\xee\xd0\x05\xec\x869\xcd/$\xfb\xdb\xc12\xef\xf6\x0b\x1f\x0b\x02\x16\x18\xf5\xa59\xd6\xf6k\xdf\xa7$\xe11\"\x16\x1d*\x94\xa6\xfcKo4\x0e\xac\xcbpj\x96\x91\x1d\x19\x8e\x07\x87\x95\x8doS\xab\xa2\xda\x1a\x06\xfc\xa6\xf4x\xb53\xabJ&\x168[#\x8b\x13\x85\x87\xdc)\x99\x85\x83V\x03\xd2\xe1jW7n\xa5+Y\xa5N\xc5\x95\xcc\xb0\x1dU\x1f\",\xa1?\xce\xb4\xe4H.\x7f\x87G*\xe4\x8b\xce{\xe0\xcb{,O[\x07\xc6y0\xb3h@\x88N5m\xa3\xcf3\x9a~\x07\x14\xc3:\xb2C\xf9\xf7,}\x16R\x9dB\xe7\xcb\xcb9S\x9f\x85T\xfc\xb0Yy=\xb7\x18\x15\x1a\xe5\x9e\x85\x0c\x97fd\xef\xe9HV\x8a^\xadM|\xf9\xf9,\x08}\x16\xd2\x91Y\x1a\x12j\xc1\xd58V\xe5\x01\xc0\x1e;\x01[j.\xc5\xf1\x18\x91@`>\x0b\xbc\x13-Zq\xa2\x95\x17\x00\x96\x98\x95&`\xf5h\x9eapkjH\xfc\x98\x82\x10\x19SY\xf4g{\x16\x15\x100\x00\x98\x93\x15%`\xa1\xb1\xaeU\xd2\xac\x01\xde\"b\x0a\xc2\x83\xdah\xc7:\x9f\xbf\xb2\x00\x01\x03\x809YQ\x02V\xae(\xca]l\xb2\xeal\xb1J\xb8We\x1e\xe3\xcf%\x87//\x00\x00QXQ\x02\xd6\x94\xea\x9a\xe7\x00r^\xb0\xd9\xe21;\xab\x95C\xa2\x95\x17\x00\x96\x9c\x15%`\x00\x00\x00\xf3\x01\x04\x0c\x00\x80\x84\x05\x04\x0c\x00\x80\x84\x05\x04\x0c\x00\x80\x84\x05\x04\x0c\x00\x80\x84eq\x05L\x7f\x94hn\xeeF\\H\x00\x00~\x80\x80\x80\x01\x00\x90\xb0,\xae\x80]\xfe\xf5y;\x13\x02\x02\x06\x00\xc0\"\xb1\xb8\x02\x16\x1f\x20`\x00\x00,\x0a\xf7\x8a\x80m\x9b\xcf3\xdd\x00\x00\xdc\x1b\xd8\x09\xd8o\xf0\xa9\x0b\x95\xde\x9f\\#\xe4\xc6\x8b\x95E\x9b\xf6^P\x7f\xbev\xa4r\xfd\xa6}\xea+\xee\xb9\x1dt\x0e\xec\x0d}\x1e\xecY\xf6RC!\xd9\xe7{7\x15?u\xd1\"`\xe1r\xa7#\x9f\xc6\xb0iA\xb9\xea\x8f\x07\x84\x97\x1a\xc6C\x18\x05H-J\xea\xb2\xb3[\x07:\x14\xdd\xa0\x9f\x15\x20\xe3\xa1\x98\x0f\x7f\xaa\xef\x03;\x84\xd4\xf7\x81\xd90\xc2\xbd\x0fLa,\x85\x9d:\xfa>0G\x94\x0cB\xbe\xb4L\xff`&\x1f\xab\x05\x00\x16\x05{\x01{\xd1\x8bq\xf1mr\xa1\x18{\xb7Vb\xfc\x1a\xfd\xf5\xbc\x17\x17o/\xc3,\xb6\x07\xbf\x83\x0a\xd8?p\x11\x0b>t\xbb\x98\xbe\xd4PHv\x0a\xe3\x8a\xadEE\xbb\x05\x01\xcbu\xa2\\\x0fB\xe5\x84L\xa4hQ\xa1=\xc2K\x0d\xa3rV\x8c\xcbQ\xb5\xea[\xfa\xec3\xf7$8g`\xb1\x9d\xcdB\x0c\x1a\x91\xf6\xfaQ\x14;\x02\x85\x9e,\x1e\xdb\x05\xa2g1\xe1w\xf8\x94\x0f\x9f\xc3?\x11\xdd\x90\xbe\x9158x\xcc#\x06\xc5\xe4\x10\xde\xc8\x1a\x03\xe38pode\x0c\xb1w\xe2\xb37\xb2\xce~\xfc|\x20m\xcd\xf1\xce<4\x9f\x17\xb7\x01@|\xd8\x0b\x18\xae<\x7f\xe14\xb9Q\x8c\x8f\xdeV\xbaP\x9bh\x98\xa1\xef\x8a\xf1\xcb\xec\x9d\xf8\xde\xef\xc5\x1d\xec.\xe4N\x1a\xd7\x96F\x7f\xdcJ\xc4\xbd\x17\xf1\x03\xa7\xef\x90\xef\x9f\xb2\xbc\x13?[iR\x03\x0e\x1a\x1b\xa2\x04\xd1\x98\x0ed$\x8e\x97\x1a\xae\xf1\xf3\xdf\xc2jx\\\xfe\xed3\x9c\x81h\x1b\x85\x85\x18\xb4H\xda\x0b\xe0S\xf9(\x96\"z\xb2xl\x17\x88Q\xb2@\x89c\x8aL:J\x021M\xd9\xd1\x99r\x0b1\x9fx\x84\xc8\xdc\xd1\xe1\x8f\xc3\xb0\x20U\xd6\xa8D\x1c\x93\xe9\xa5\x11\xfaf\x7f\x100`\xf1\x89C\xc0\xd8\xcb\xa1\x8f\xe2\xbd\xec\xfb\xfb\xf8\xc7\x84\xbc\xac\x86\xeb&\xbb\x15\xa9\x12v0\x01;\xad\xee=\x88OY\x92\x1d\xc4G\xe9\xf6\xcd2Q\xc0X\x839\x86\xb2\x95\xa1\x96\xaa\\\xbbP\xecV\xa8#\x06:\xabV\xdf\"\xc6\x0bX\xd4\xb0j1X\x88A$\xac\xb5\xd6p\xecw\"\xea\xc9\xe2\xb1]\x20\\X5_\x179\xe1\xf3\xdb\x08\x18iH\x9d\x89\xb1?\x0e\x01\x8b\x1e'\x8e2\x87\x80\x05R\xd9\xd8\xb1\x19\x04\x0cX|\xec\x05\xac\x92}>\xac\x05x\xbcMC\xd5n\xd1\xbe\xdc\xb8qG\xdc\xc1\x04\xecf\x11\xfe\xa7\xf2\xaf\x97\xfe\xcb\xef\xbd\xb3\x11_d_\x8e\x0a\x02\xb6\x96}N%)\xd7w\xc4I/\xff\x19\x97y\xa9\xd7\xa2\x94\xf6\xba\x1c\x87O\x8d\xa7q\xa2\x20-\xe7\xf1[\x84\xf4jSJ\xf9\x9a\xd5X\xf2.\xf6)\xed\xd1l9\x03n\xb3\x16%\xb7\xd6\xb83J\xc5\x86$:\xd3\xb3\x20$\xe8s\xa7\xb8J\xb2g\xe7fb\xb6V\xfbd\x9a\xedh2B\xf5\xe1\xaal\xc7\x86i2\xb59Kr\x97\x8e\x12K5\x0d\x0fby\xdb\xf2\xb5w\xe2\x9b\x1e\xf8,\x02\xfe\xb6rR\xf2\x0a\x150\xd3o(\x99Fft#\xe4\x8c\xe8\x02\xd6\x98\x1c\xe1\xca\xcb\x17G\x100=7\xdb\x0a\x11\"We9\xcb\xada\xd5\xb8C\xa2\xc5\x85\x9ch\x8ep~\xb9\x1aG\xaf<\x00\xc4\x83\xbd\x80\xb1\xee\xd4M\x8c\xb7lg\x14\xe1\x0bd=\xfe\x9b\xbe_\xdc\xa1.d\xddG\xc7\x90\xef\xd3\x84\xc2\xde\xef1VC{\x9c\x16\x04\xacN\xdd\xc8\xa6\xf1\xe6\xb7\xa1\x1d4\"W\x9e\xb1;\xd4\x99\x8c\\\x0d\xcd\xe9,vaM\xd2\x8e\xbeVW\xfe\x0c\xb9\x15d\xb1t\x82\xba\x12\xd5H\xaa\xc0I(\xb7\xb37S\xb1\xe5\x0c\xb8M\xea,\xfb\xf0\xcf\xb3\xc5i\x20\xc1\x99\x91\x852\x8e}\xb4{\xa0\xdd\x85\xa6g\xe5fb\xb4\xd68\x92i\xb6\x91\x93\x9d\xd99\xe9\xee\xba*t\x95\xf4\xa1\x9a\xc1\x93\xa5I\xc3b5M\x0fBy\xab\xa5\xfa\xbez\xa9J\xf0\xc0g\x11\xf0\x8f\xa7M\xae\x92\xa9\x80\x99~g\x86\x1a\x92\x86H\x07:A\xd5L\x15\xb0\xfc<\xbe\xbc|qB\xa8/\x12\x89\xf4#!7\xdb\x0a\x91\xb03\xa7\xa3\xd7\x87\xac\x02ff\x91\xc4\x8d\x9b\x0d\xbf\\\x8d\xa3W\x1e\x00\xe2\xc1^\xc0XT\xa2\xef\xb0\xc9\xc7Jw\xea\x86\xbe_\xd8\xa1\x09\xd8y\xbc\x9b\x90\xa7\xf0\xfb\x96\xbd\xd70V\xd3\x9c\x17\x04L\x8b\xa7\xb6\x1au\x132\x84\\3\xc4\x8f\xf8\x99\"\xc9\xa9\x88S\x95\x8b\xd0vIoU\x0e\xb3\xd0\x82\xc2`\xe6jJ\xadf\x9b9\xa9\xb4\x1c\x17\xb1\x18p\x91\xb9\xb3\xa7\x08\x99t\x17\x10\x11\xc3\x80\xcb\xa2\xcdE\x1bQ\x9b\xd3\xe2A@o\xad\xf1$\xe3\xe2B\"\x9fR\x0a\xe5\xffH\x17\x9d.\xcfc\xf1\xb1\xcdj\xf2\x1e\xcc\xf2\x9ea\xdd\xa3\x01\xd4/x\x10\x86\x90$o\xdb\x1a\x16\x17\x92\xf7K\xaa\x0b&\xdc,\xfe#\x91\xea#\xb7F\xcb\xd1\x87\xd6#\xa9;\x0bi=\xac\x90\x90\x9bm\x85\xd6zn\xd1(\x94\x16\x013\xb3\x18\xd3\"~R\xf8Z\x985\x8eQy\x00\xb0'N\x01\xbbI\x07\x88:w\xcc\xa0i\xe2\x0eM\xc0no\xc4\xdf\xff\x13{oZ\xf6*_\xd8\xedI\xa5s\xc6\x0b\xd8\xe3\xea\x86\x9b\xb6,\xe2Ag#\x8ed\xfe~;\x0b[\xcbfX\xfc\x9ei\x8a[\x0dN\xcd5\xa5Z\xfd\xb5\xa5R\x0d1fc\xa2\x0b\x18\x9b!jC\x93D\xc00\xe0\xb2\x18\xcf\xf2\xd4\x1e\x1f%\xd3\x16\x0f\x02zk\x8d'\x19'`\x92\x1e\xe2{\xa2m\x83\xc7\xa9\xf67\xcdj\xf2\x1e\xcc\xf2\xd6\xa8!\xd1VW\x8b\x1e\x04\x01kB\x8dL\xc0x\xbf$\x92\x97\xa9\xad\xb4\x93\xa8:\xb9\xa8\x9a\x88GRw\x16B\xcd\xc3\xc3\xc3-T\xc0\xb8\xdc\xec*4\xa9\xae\xba\xa8\xb7\x08\x98\x99\xc5t\xb2\xf9\xf7\x88\xaf\x85Y\xe3\x18\x95\x07\x00{\xe2\x140R\xa6Mf\x91\xcf\xff\xf1/R\x89\xd5'\x86>\xfe\xe9)q\x87\xf6,\xe4\x8b\xf8\xf4i\xfc\xac5\xd9\x9dMX]8\xf6\x9a\x20`\xea]\xb1I\x84\xe80\xb0\x01\xd5\xf6\x1b\x81c\x19f\xd4\xe6<\xad\x87\xc0z\x16\\S\x92%}\x11+\x1f\x99;\xba\x80\xb1Q\xd4\x20\xb2\xac\x8a0\x0c\xf8,&\xdb7\xe7\xa2\xccF\x8b\x07\x01\xbd\xb5\xc6\x93\x8c\x130}2m8\xd3\xbd\xa7'\xb8\xce\x12\x99\x9b\xf7`\x96w\xad\xaaB%\x05\x82\x07Q\xc0&\xf6L0\x01\xe3\xfd\x12\xd2\xad\xafI\x91j\x86\x87\xd5\xe1\x9fx$ug\xdc\x1c\x18\x9f\x9bM\x85FT\xf7\xd6I|.\x0bm\x0elz@\xf4\x1b52\xb7\x90\x1b\x00\xd8\x12\xaf\x80=\x87\xb7\xdf\xa1\x9f\x7f\xa0K'\x8ejkU\xf7\xe27\xc4\x1d\x9a\x80]\xc4O=\x85/\xccJ\xf6\x82*j\xb7+\x05\x01[\xc5\xe6\xaf~\xa1F]\x1dC\xeeZt\x92p\x98\x17w\x95g\x84\xc1\x16:\xb1\xa6\xd4\xc1\xfa\x0euI\x97f\xd9\x0a\x06\xe6\xa6\xc4&\xdc\xda\x91e\xa5\x93a\xc0e1B\xbb2S\x9d\x8e6\x8b3\x1e\xbd\xb5\xc6\x93\x8c\x13\xb0rm#\xb7\x80Nk\x97[\x04\x8c\xf7`\x96\xb7\xda\xc3\x92x\xaa\x05\x0f\\\x16\x01u\x85\x03\x150\xde/\x913\xeb\xb3\xd5\x0e\xa7y\x8fV<\x92\xba3N\xc0\xb8\xdc\xec*4\x89\xd8\x1e\xeb$>\x97E\xc0\xc1z\xd4]hB\xa8ET\x01\x13r\x03\x00[\xe2\x15\xb0\xcb^\xfc\x822\x00\xbc\xb8\x89\x8a\xcf\x0d/~\x83\xad\x03+\xfeN\xdc\xa1\xbf\x8d\xa2\xb2\xa8\xa8\xe2\xce\xacd\xd7\xd6\xe3_\xdf!7\x0fZ\xd6\x81\xe5)\x0avR\xd2fJ\xeeG\x8eta\xad\x81yq\x0f\x20\xb6\xd0\xbe\x9e\xcd\xe8\x14\x16\x12\xf2-\xfb\xe1\x1b\xc9X\xb6\xcf\x0b\x98i\xc0mJ\x99StE\x925\x96\x9aa\xc0e\xd1\x80\xce\xb0]\xdb,\xce\xc8\xd8a]/\x8d\xd6\x1aO2N\xc0\xf4n\x8c\x9bJ\xc7L\x9eE\xc0x\x0ffy\xfb\xd8\x84U'\xea\x13\x16\x04,0\xeaKs\xac\xed\xd7\xbeOI\xc2cD,\xb2X(M\xf9\x97\xdeh\x1cX\x97\xe1\xd4,#;2\x1c\x0f\x0e+\x1b\xdf\xa6VE\xb55\x0c\xf8M\xe9\xf1jgV\x95L,p\xb6F\x16'\x0a\x0f\xb9S2\x0b\x07\xad\x06\xa4\xc3\xd5\xaen\xdcJW\xb2J\x9d\x8a+\x99a;\xaa>DXB\x7f\x9ci\xc9\x91\\\xfe\x0e\x8fT\xc8\x17\x9d\xf7\xc0\x97\xf7X\x9e\xb6\x0e\x8c\xf3`f\xd1\x80\x10\x9dj\xdaF\x9fg4\xfd\x0e(\x86ud\x87\xf2\xefY\xfa,\xa4:\x85\xce\x97\x97s\xa6>\x0b\xa9\xf8a\xb3\xf2zn1*4\xca=\x0b\x19.\xcd\xc8\xde\xd3\x91\xac\x14\xbdZ\x9b\xf8\xf2\xf3Y\x10\xfa,\xa4#\xb34$\xd4\x82\xabq\xac\xca\x03\x80=v\x02\xb6\xd4\\\x8a\xe31\"\x81\xc0|\x16x'Z\xa4\xebD+/\x00,1+M\xc0\xea\xd1\x7fe\x01\x02\x06\x00s\xb2\xa2\x04\xac\\Q\x94\xbb\xd8d\xd5\xd9b\x95p\xaf\xca<\xc6\x9fK\x0e_^\x00\x00\xa2\xb0\xa2\x04\xac)\xd55\xcf\x01\xe4\xbc`\xb3\xc5cvV+\x87D+/\x00,9+J\xc0\x00\x00\x00\xe6\x03\x08\x18\x00\x00\x09\x0b\x08\x18\x00\x00\x09\x0b\x08\x18\x00\x00\x09\x0b\x08\x18\x00\x00\x09\xcb\xe2\x0a\x98\xfe(\xd1\xdc\xdc\x8d\xb8\x90\x00\x00\xfc\x00\x01\x01\x03\x00\x20aY\\\x01\xbb\xfc\xeb\xf3v&\x04\x04\x0c\x00\x80Ebq\x05,>@\xc0\x00\x00X\x14\xee\x15\x01\xdb6\x9fg\xba\x01\x00\xb87\xb0\x13\xb0\xdf\xe0S\x17*\xbd?\xb9F\xc8\x8d\x17+\x8b6\xed\xbd\xa0\xfe|\xedH\xe5\xfaM\xfb\xd4W\xdcs;\xe8\x1c\xd8\x1b\xfa<\xd8\xb3\xec\xa5\x86B\xb2\xcf\xf7n*~\xea\xa2E\xc0\xc2\xe5NG>\x8da\xd3\x82r\xd5\x1f\x0f\x08/5\x8c\x870\x0a\x90Z\x94\xd4eg\xb7x\xf4$k\x8f\x83'w\xdb\x99\xce\xcbv\x81\x1cB)\xf4\x95\xb6}\x0et(\xbaA?+@\xc6C1\x1f\xfeT\xdf\x07v\x08\xa9\xef\x03\xb3a\x84{\x1f\x98\xc2X\x0a;u\xf4}`\x8e(\x19\x84|i\x99\xfe\xc1L>V\x0b\x00,\x0a\xf6\x02\xf6\xa2\x17\xe3\xe2\xdb\xe4B1\xf6n\xad\xc4\xf85\xfa\xeby/.\xde^\x86Yl\x0f~\x07\x15\xb0\x7f\xe0\"\x16|\xe8v1}\xa9\xa1\x90\xec\x14\xc6\x15[\x8b\x8av\x0b\x02\x96\xebD\xb9\x1e\x84\xca\x09\x99H\xd1\xa2B{\x84\x97\x1aF\xe5\xac\x18\x97\xa3j\xd5\xb7\xf4\xd9g\xeeIp\xce\xc0b;\x9b\x85\x184\"\xed\xf5\xa3(v\x04\x0a=Y<\xb6\x0bD\xcfb\xc2\xef\xf0)\x1f>\x88\x9f\x8f(\x00\x00\x09tIDAT\x87\x7f\"\xba!}#kp\xf0\x98G\x0c\x8a\xc9!\xbc\x915\x06\xc6q\xe0\xde\xc8\xca\x18b\xef\xc4god\x9d\xfd\xf8\xf9@\xda\x9a\xe3\x9dyh>/n\x03\x80\xf8\xb0\x170\\y\xfe\xc2ir\xa3\x18\x1f\xbd\xadt\xa16\xd10C\xdf\x15\xe3\x97\xd9;\xf1\xbd\xdf\x8b;\xd8]\xc8\x9d4\xae-\x8d\xfe\xb8\x95\x88{/\xe2\x07N\xdf!\xdf?ey'~\xb6\xd2\xa4\x06\x1c46D\x09\xa21\x1d\xc8H\x1c/5\\\xe3\xe7\xbf\x85\xd5\xf0\xb8\xfc\xdbg8\x03\xd16\x0a\x0b1h\x91\xb4\x17\xc0\xa7\xf2Q,E\xf4d\xf1\xd8.\x10\xa3d\x81\x12\xc7\x14\x99t\x94\x04b\x9a\xb2\xa33\xe5\x16b>\xf1\x08\x91\xb9\xa3\xc3\x1f\x87aA\xaa\xacQ\x898&\xd3K#\xf4\xcd\xfe\x20`\xc0\xe2\x13\x87\x80\xb1\x97C\x1f\xc5{\xd9\xf7\xf7\xf1\x8f\x09yY\x0d\xd7Mv+R%\xec`\x02vZ\xdd{\x10\x9f\xb2$;\x88\x8f\xd2\xed\x9be\xa2\x80\xb1\x06s\x0ce+C-U\xb9v\xa1\xd8\xadPG\x0ctV\xad\xbeE\x8c\x17\xb0\xa8a\xd5b\xb0\x10\x83HXk\xad\xe1\xd8\xefD\xd4\x93\xc5c\xbb@\xb8\xb0j\xbe.r\xc2\xe7\xb7\x110\xd2\x90:\x13c\x7f\x1c\x02\x16=N\x1ce\x0e\x01\x0b\xa4\xb2\xb1c3\x08\x18\xb0\xf8\xd8\x0bX%\xfb|X\x0b\xf0x\x9b\x86\xaa\xdd\xa2}\xb9q\xe3\x8e\xb8\x83\x09\xd8\xcd\"\xfcO\xe5_/\xfd\x97\xdf{g#\xbe\xc8\xbe\x1c\x15\x04l-\xfb\x9cJR\xae\xef\x88\x93^\xfe3.\xf3R\xafE)\xedu9\x0e\x9f\x1aO\xe3DAZ\xce\xe3\xb7\x08\xe9\xd5\xa6\x94\xf25\xab\xb1\xe4]\xecS\xda\xa3\xd9r\x06\xdcf-Jn\xadqg\x94\x8a\x0dIt\xa6gAH\xd0\xe7Nq\x95d\xcf\xce\xcd\xc4l\xad\xf6\xc94\xdb\xd1d\x84\xea\xc3U\xd9\x8e\x0d\xd3djs\x96\xe4.\x1d%\x96j\x1a\x1e\xc4\xf2\xb6\xe5k\xef\xc47=\xf0Y\x04\xfcm\xe5\xa4\xe4\x15*`\xa6\xdfP2\x8d\xcc\xe8F\xc8\x19\xd1\x05\xac19\xc2\x95\x97/\x8e\x20`zn\xb6\x15\"D\xae\xcar\x96[\xc3\xaaq\x87D\x8b\x0b9\xd1\x1c\xe1\xfcr5\x8e^y\x00\x88\x07{\x01c\xdd\xa9\x9b\x18o\xd9\xce(\xc2\x17\xc8z\xfc7}\xbf\xb8C]\xc8\xba\x8f\x8e!\xdf\xa7\x09\x85\xbd\xdfc\xac\x86\xf68-\x08X\x9d\xba\x91M\xe3\xcdoC;hD\xae\xa5\x14\xca\xff\x91.:]\x9e\xc7\xe2c\x9b\xd5\xe4=\x98\xe5=\xc3\xbaG\x03\xa8_\xf0\x20\x0c!I\xde\xb65,.$\xef\x97T\x17L\xb8Y\xfcG\"\xd5Gn\x8d\x96\xa3\x0f\xadGRw\x16\xd2zX!!7\xdb\x0a\xad\xf5\xdc\xa2Q(-\x02ff1\xa6E\xfc\xa4\xf0\xb50k\x1c\xa3\xf2\x00`O\x9c\x02v\x93\x0e\x10u\xee\x98A\xd3\xc4\x1d\x9a\x80\xdd\xde\x88\xbf\xff'\xf6\xde\xb4\xecU\xbe\xb0\xdb\x93J\xe7\x8c\x17\xb0\xc7\xd5\x0d7mY\xc4\x83\xceF\x1c\xc9\xfc\xfdv\x16\xb6\x96\xcd\xb0\xf8=\xd3\x14\xb7\x1a\x9c\x9akJ\xb5\xfakK\xa5\x1ab\xcc\xc6D\x1706C\xd4\x86&\x89\x80a\xc0e1\x9e\xe5\xa9=>J\xa6-\x1e\x04\xf4\xd6\x1aO2N\xc0$=\xc4\xf7D\xdb\x06\x8fS\xedo\x9a\xd5\xe4=\x98\xe5\xadQC\xa2\xad\xae\x16=\x08\x02\xd6\x84\x1a\x99\x80\xf1~I$/S[i'QurQ5\x11\x8f\xa4\xee,\x84\x9a\x87\x87\x87[\xa8\x80q\xb9\xd9UhR]uQo\x1103\x8b\xe9d\xf3\xef\x11_\x0b\xb3\xc61*\x0f\x00\xf6\xc4)`\xa4L\x9b\xcc\"\x9f\xff\xe3_\xa4\x12\xabO\x0c}\xfc\xd3S\xe2\x0e\xedY\xc8\x17\xf1\xe9\xd3\xf8Yk\xb2;\x9b\xb0\xbap\xec5A\xc0\xd4\xbbb\x93\x08\xd1a`\x03\xaa\xed7\x02\xc72\xcc\xa8\xcdyZ\x0f\x81\xf5,\xb8\xa6$K\xfa\"V>2wt\x01c\xa3\xa8AdY\x15a\x18\xf0YL\xb6o\xceE\x99\x8d\x16\x0f\x02zk\x8d'\x19'`\xfad\xdap\xa6{OOp\x9d%27\xef\xc1,\xefZU\x85J\x0a\x04\x0f\xa2\x80M\xec\x99`\x02\xc6\xfb%\xa4[_\x93\"\xd5\x0c\x0f\xab\xc3?\xf1H\xea\xce\xb890>7\x9b\x0a\x8d\xa8\xee\xad\x93\xf8\\\x16\xda\x1c\xd8\xf4\x80\xe87jdn!7\x00\xb0%^\x01{\x0eo\xbfC?\xff@\x97N\x1c\xd5\xd6\xaa\xee\xc5o\x88;4\x01\xbb\x88\x9fz\x0a_\x98\x95\xec\x05U\xd4nW\x0a\x02\xb6\x8a\xcd_\xfdB\x8d\xba:\x86\xdc\xb5\xe8$\xe10/\xee*\xcf\x08\x83-tbM\xa9\x83\xf5\x1d\xea\x92.\xcd\xb2\x15\x0c\xccM\x89M\xb8\xb5#\xcbJ'\xc3\x80\xcbb\x84ve\xa6:\x1dm\x16g7\xd2\xe7\xf2\x8f#\xe11\"5\xb2\xd8HuJP\xa6A\xb8\xfd'{\xab\xd1\x09\xba\xa3Aj\xee\xf1\xa5\xd1\xce\xdb\xe3\xfa\xa2\x0b\xc1\x963\xe06%\x94\xdfu<\xc7i\xbd\x9fh\x1a\x98Y4\xa0\xf4\x03}=\xd5hP4\x20\xa4\xd4\x18\xe2\x8e\xb4\xa1\x16u0j\x9fL\xb7\x9d\x1eb\xb7\xf2\xd8\xa4]\x03\xda\xdcv8\x1f\xb9\x9a\x86\xf8\xa2\xf3\x1e\xb8\xf2V%\x05\xfa\x02IU\xa2\x073\x8bI\xff\xbao\x94\xaf\xdf\xac\xf3Or~#\xc1Z\xd78\xb9\xe4\xdc\x15\x8c\xd0\x95\xf8F\xbd\x8d\xf2r\xce\x84\x95\xf8Fn1*\xc4\xad\xc4\x0f9\xdc\x87\xea3\x92\x92;B\xeaJ\xfc\x96`\xf0\xaapH\xc8\x19\xc7\xfd\x1d\xbd\xbe\xe4\x20_\x0b\xae\xc6\xb1*\x0f\x00\xf6\xc4-`\xe4\xda\x0b\x95E\xde\xed\xa7\xd4\x95\x10\x97\x9f\xad(*;x\xd9\xbaC\x17\xb0\x1b\xe64\xbf\x90\xeco\x07\xcb\xbc\xdb/|,\x08X`\xd4\x97\xe6X\xdb\xaf}\x9f\x92\x84\xc7\x88Xd\xb1P\x9a\xf2/\xbd\xd18\xb0.\xc3\xa9YFvd8\x1e\x1cV6\xbeM\xad\x8ajk\x18\xf0\x9b\xd2\xe3\xd5\xce\xac*\x99X\xe0l\x8d,N\x14\x1er\xa7d\x16\x0eZ\x0dH\x87\xab]\xdd\xb8\x95\xaed\x95:\x15W2\xc3vT}\x88\xb0\x84\xfe8\xd3\x92#\xb9\xfc\x1d\x1e\xa9\x90/:\xef\x81/\xef\xb1\xcfh\xfa\x1dP\x0c\xeb\xc8\x0e\xe5\xdf\xb3\xf4YHu\x0a\x9d//\xe7L}\x16R\xf1\xc3f\xe5\xf5\xdcbTh\x94{\x162\\\x9a\x91\xbd\xa7#Y)z\xb56\xf1\xe5\xe7\xb3\x20\xf4YHGfiH\xa8\x05W\xe3X\x95\x07\x00{\xec\x04l\xa9\xb9\x14\xc7cD\x02\x81\xf9,\xf0N\xb4H\xd7\x89V^\x00XbV\x9a\x80\xd5\xa3y\x86\xb6\xad\xa9!\xf1c\x0aBdLe\xd1\x9f\xedYT@\xc0\x00`NV\x94\x80\x85\xc6\xbaVI\xb3\x06x\x8b\x88)\x08\x0fj\xa3\x1d\xeb|\xfe\xca\x02\x04\x0c\x00\xe6dE\x09X\xb9\xa2(w\xb1\xc9\xaa\xb3\xc5*\xe1^\x95y\x8c?\x97\x1c\xbe\xbc\x00\x00DaE\x09XS\xaak\x9e\x03\xc8y\xc1f\x8b\xc7\xec\xacV\x0e\x89V^\x00XrV\x94\x80\x01\x00\x00\xcc\x07\x100\x00\x00\x12\x16\x100\x00\x00\x12\x16\x100\x00\x00\x12\x16\x100\x00\x00\x12\x16\x100\x00\x00\x12\x16\x100\x00\x00\x12\x16\x100\x00\x00\x12\x16\x100\x00\x00\x12\x16\x100\x00\x00\x12\x96\xff\x0f}\xc6-\xc8\xe3>\xf6\xcf\x00\x00\x00\x00IEND\xaeB`\x82", - - "analysis/chan2a.png": "\x89PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\x00\x04\x89\x00\x00\x01\x95\x08\x03\x00\x00\x00M@Q-\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x02\xfdPLTE\x00\x01\x00\x0a\x03\x01\x04\x06\x02\x07\x0a\x06\x0e\x10\x0d\x0d\x12\x14\x0e\x12\x1d\x11\x13\x10\x16\x18\x15\x1b\x1a\x13\x13\x1e7\x1f\x1f\x18!#\x20#$\"%$\x1d%%\x1e$%#%'%'(&+)\x1e()'*+)/,!+-*,-+-/,02/63(241564796<9.9;8<=;=>FA?3>@=#CxDA5AB@DFCFHEKHe\xafac`hcQbdaAg\xb2efdCi\xb3ghfMj\xafEm\xb1qjRikhIp\xb4lmkLr\xb7npm{s\\rtqWv\xb6tvsuwt\\z\xbaxzw]~\xb8e|\xb8\x84|dX\x80\xbf{}za\x7f\xbf|~{~\x80}b\x82\xbc\x7f\x81~d\x85\xbf\x82\x83\x80\x83\x85\x82m\x87\xbdh\x88\xc3\x90\x86hj\x8a\xc4\x87\x88\x86r\x8c\xc1\x89\x8b\x88t\x8e\xc4\x97\x8do\x8c\x8e\x8bz\x8f\xc0\x8e\x90\x8dx\x92\xc8\x90\x92\x8f~\x93\xc3x\x95\xc4\x92\x93\x90\x81\x95\xc6{\x98\xc8\x94\x96\x93\xa0\x96w\x96\x98\x95\x82\x9a\xc4\x97\x99\x96\x83\x9c\xc5\x86\x9b\xcc\x80\x9d\xcc\x9a\x9b\x98\xa5\x9b|\x87\x9f\xc9\x83\xa0\xcf\x9c\x9e\x9b\x89\xa1\xcc\x9e\xa0\x9d\xaa\xa0\x81\xa0\xa2\x9f\xa1\xa3\xa0\xa2\xa4\xa1\x91\xa5\xca\xae\xa4\x85\x8f\xa7\xd1\xa4\xa6\xa3\x94\xa7\xcc\xa5\xa7\xa4\xb4\xa7\x83\x92\xaa\xd4\xa7\xa9\xa6\x97\xab\xd0\xa9\xab\xa8\x9d\xad\xcc\xab\xad\xaa\xa5\xad\xc1\x9f\xae\xce\xbb\xae\x89\xad\xaf\xac\x9e\xb1\xd7\xa2\xb1\xd1\xaf\xb1\xae\xa5\xb4\xd4\xa2\xb5\xdb\xb3\xb5\xb2\xc3\xb6\x91\xb5\xb7\xb4\xac\xb7\xd2\xa9\xb8\xd8\xb7\xb9\xb6\xb9\xbb\xb8\xad\xbc\xdc\xb1\xbc\xd7\xbb\xbd\xba\xb3\xbe\xd9\xbd\xbf\xbc\xb7\xbf\xd4\xb1\xc0\xe1\xbf\xc1\xbe\xb6\xc1\xdc\xb9\xc1\xd6\xce\xc1\x9b\xc1\xc3\xbf\xbb\xc3\xd8\xc2\xc4\xc1\xbd\xc4\xda\xba\xc5\xe0\xc4\xc6\xc3\xc6\xc8\xc5\xc0\xc8\xdd\xbd\xc9\xe4\xd8\xc9\x9e\xc6\xca\xda\xc0\xcb\xe6\xca\xcc\xc9\xc3\xce\xdc\xbf\xcf\xe2\xc8\xcd\xdc\xcd\xcf\xcc\xc8\xd0\xe6\xcc\xd0\xe0\xcf\xd1\xce\xc6\xd2\xe0\xdb\xd2\xa5\xe1\xd1\xa5\xd1\xd3\xd0\xd2\xd3\xdd\xd3\xd5\xd2\xcd\xd5\xeb\xce\xd7\xdf\xe6\xd7\xab\xd6\xd8\xd4\xd1\xda\xe2\xd8\xda\xd6\xd8\xd9\xe3\xd6\xda\xea\xd3\xdc\xe4\xda\xdc\xd9\xd8\xdd\xe0\xd2\xde\xec\xdc\xde\xdb\xdc\xdd\xe7\xe0\xde\xe2\xdb\xe0\xe2\xde\xe0\xdd\xf0\xe0\xb3\xd5\xe2\xf0\xe0\xe2\xdf\xde\xe3\xe5\xde\xe2\xf2\xe2\xe4\xe1\xe1\xe6\xe9\xe4\xe6\xe3\xde\xe7\xef\xe8\xe5\xea\xe5\xe7\xe4\xe4\xe9\xec\xe7\xe9\xe6\xe8\xe9\xf3\xe2\xeb\xf3\xe9\xeb\xe8\xec\xee\xea\xe6\xef\xf7\xe8\xf1\xf9\xef\xf1\xee\xf0\xf0\xfb\xf2\xf4\xf1\xf1\xf6\xf9\xf4\xf6\xf3\xf7\xf9\xf6\xf5\xfa\xfd\xf9\xfb\xf8\xfa\xfc\xf9\xfd\xfb\xff\xf9\xfe\xff\xfc\xfe\xfb\xfe\xff\xfc\xfa<^\xc5\x00\x00\x20\x00IDATx^\xed\xbd\x0fX\x15\xd7\xbd\xef}^\xdb\xf7\xcd\xed\xdb\xc5y`\x1f\xe9\x16\x0aD\xde\xcb{\xc0s\x94\x83x\xdf\x9b\x8cA\xbc\xafy\xfd\xcbE\xe5`Qo\x8f1\xb4\xc46\x86T\xebc8\xf14\x98\xee\xa6H\x11o\x12RJ\xbc\x1e\"\x09\xdd\x16\"\xd1Rk$\xec\xf3\xbc\xb3\xe6\xefZ\xb3g\xefa#\xcc\xf0\xe7\xfb\xc9\x93\xbd\xd7\x9e\xf9\xad5k\x96{\xbe\xac\xb5f\xf6\xfa\xfe\x854vD\x00\x00\x18\x17\xfe\xc2In\xa2\xe0T6\x00\x00\x8c\x0e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\x07J\x04\x00\xf0\x1e(\x11\xd0\xb8\xec\x14\x00\xc0\xc4\x01%\x02\x94\xbe\xa2T\xb2\xdc)\x08\x80\x09c\xda+Q}N\x9fSH\x8c\xf4\xe7\xd4;\x85LB\x94v\x88\\\xf5\xac\xac@\xd3\xe9\x08\xfb\x00\x98x\\W\xa2\xe6\x10}\xbdT]\xa9R\xa3n\xed\x0c4D\xcb$\xfe\xcfG\xd7\xe4o\xbb\x125\xc4\x9e\x1dd\xbbSH\xcc\xec\x88\xdb\xe1\x14\xe2D\xe7b\x7f\xda\xea\xe6\xb4>q\x1d!\xc4\xdf\xa5onJ\x89\xde\x0c\x0c\xf5Y\xb3\xe7\xd5.\x18u\xb8\xd6\x0e\x91\xaa~\x8a4\xdan\x07\xc0%\xdcV\xa2\xbe\xca6\xfav\xbe\xb2\xbdW\xe6X\xe5)e\xeb\x99@Ku\xb4\\\xe2W\x0b\x0e\xef\xce\xff\x20j\x88-\x15qUN!c\xa0!\xbe\xc2)\xc4\xa0\xb9\xddfc\xa3?;\xb0\x7f>!!\xb1'\x18\xdcCZ\xf5\xed\x0d\xfe\xa7l\xa2M\xcc\xc2*Ha\xfd\x16BF[\x0f\xa3\x1d\"T\xbd\x8d\x04\xed6\x03\xe0\x16.+Qo\xad\xaaDb\xe7\x80\xfc2P\xdd\xa2nnh\xea\x89\xaaD\x1f\x08\x87\xc4+\x17\xa2E\xd8\xd3\xed\xbb?z@\x7fn\x7f\xf4\x00{\xca|=N!:\xd9+\xc3\xb7\xf5'\xdd;(\x9f}\x06Q\xfa\x87m\xa6\x129a\x14\xd6E\xca\xe4\xd7M\xa3U\"\xa6\x1d\xec\xab\x1eC\x1d\x00\x98\x08\xdcU\xa2\xe6\xca\xe6@\x9b\xf9\xf1\xe0S\x97\x94\xf7\xce\xaa\x81\xde\xa8J\xf4\xaep4\xda\xee\x88\x14\xa5\x0dD\x0f\xe8$\x9d\xd1\x03\xec\x19H+r\x0a\xd1Y`\xa3D\xf7'*sW\x15D\x19\x96\xc5\xa0\x02Fa\x85)\xb2\x94\x89!\xb2'Z\xb4\x09\xd3\x0e\xf6U\x8f\xa1\x0e\x00L\x04\xee*\xd1\xf9\x01\xb1\xba\xcd\xf8\x14\xaaT'\x93\xcf\x06\xba\xc4(Jtq\x8d\xa0\xb0W\x14\x1f\x15\x84#\xe2\xbby\xc2\x06\x9a\xcc;\xbcwC\xfe\xb6\xdf(1\xef>\xb4&\xaf@K\x9b\x0c&m\xd5\x93]+S\x12R\xef\xe9\xe5vWd6\x84H\xa8!s\x0f_\xc2\x95\xc3\x9b\xf37\x1e\xba\xc2\x1d\x82?\x9a\xdc\xb3H<\xcf\x15%\x16\x93\x84\xc0\xa6L\xff\xe2\x1e\xe5\xd3\x9e\x05\xfe\xf9\xb4\xd4\x06\xa2\xb2@\xd9Z\x9d\xe3\xcf\xdcD%!C\x15\x83\xfe\x0a*'\x86\x0a\x9cI$$N\x9b73b\x99r\xd9\xc2\x92\xd5\x13\xab8\xcd\x1e\x8d\xaf\x83q4\xae\x1dl\xaaNi\x86\x12\x01oqW\x89d\x18%\xaamR\xdf\x1b\xe4\xf7h}\xa27:\x8e\x08\x07::\xde\x17\xc5\xdft\xe4\x1d\x10\xaf\xbc\xfa\xc8\x12Q|\xebH\x9ePp\xe0\x07+\x1e\xa2\x11//\xdb\xfc\x83\x13\x07\x84g-\x19\xdbI\xb3\x96j\x9e\xb3`G\xd3v\xcb`\xa6\xb7\x90d\x91yde\x0f_\xc2\xee%\xfb\x8e\xef[\xb2\x9b;\x04w4\x99\x16\xeb\x95\x1b\xaa\x89')\xdb+\x92\x94;\xe1\xeb|e\x0de\xbeB\xb9\x03\xd2\x12\xcc\\\x18\x0c\x06\x95QXQ\\ICE\xca\x82\xcb\xe2`\x1cW\x0f\xa3?r,\x18\xf4i\xf3\xebF,S.S\xd8\x19\xc2L\x7f\x19G\xe3\xea`\x94\x20\xb2\xed\x20\xdaT]\xbc\xd4\xd7\x9c\x9d\xec\xd0y\x04`b\xf1P\x89\xba+{\x94\xf7P\xd5@t%bGgK\x0e\xc8/\x07\x96(\xc9\x15r\x0feg\x81\x9c\xba\xb8v\xdbE\xf9\xf5\x88uJ\xbb\x81t\xab\x89\xf3s\x17\xcb\xdd\x8f\xc1Z\xeb\xa4Pc\x02I8(\xf2%\x1c\x17N\xc8\x1bN\x08\xc7E\xf6\x10lR\xa6\x87\x84M-\xfb\x92{\xe8\xa8\x89\x96\xaa\xdc\x88j$J\xc9\xc6\x80\xaaAQ\x8f6\xb2_\xec&\xdc\xbdtvd\x94\xb8\xdd\x12\xcb\x96k\x16\xd6\xa9\xde\xea:\x7f~\x90?\x9a\x19\xcb\x96`\xb6\x03%\xbc\xea\xf7\xca\x1d\xadQ\xdf\x84\x03`B\xf0P\x89\x9aj\x95\xb7\x81@\xe8\xf2\xe5\xcb\xa7\xab\xa3=\xe2k\xafD\xbb\xf5\xe4q\xe1\x0d\xdbl\xf5\xfa\x15x\x90\x9c\xb4\xd9\xdd\xbf\xc97\x97\xa4\xf9\xb6\xf4s%\xec\xde\xa0\xbcmxDd\x0f\xc1&Ez9\xef\xb7\x14&\xfa\xd6\xc9/\xdb}\xf2K\xd1\x91h(\x91\x19\xcb\x96k\x16vV\xd1\x99\xd5\xb2\x824qG3c\xd9\x12\xccv\xa0\x84W\xfdtce\x16\xfaD\xc0[c\xa8\xde;{\x95vU\xc4\xd2\x82\xa7\x9f\xde,\xe4=\xff\xd6\xfb\x1dy\x8f\xbcz\xe5\x8dG\xf2\xe8=\xb5\x97\xf37\x1c>\xfe\x98p\xd8\x9a\xb3K\xbfK\xd5<;\xeb[\x07KH\xc0\x1a`\xc0\x94\xb0Sx\xe2\xa5'\x84\x9d\xa2\xc8\x1c\x82;\x1a\x1d\xedY\xfbX\xbd\xc1\x84u\xadb\xfb\xba\x84\xa0<\xc6,\x8c\xbb\xbf\xe1\xfe\xb8Be\xc7v_E\xfd\"\x7f\x8f\x9c\xba\x9f\xac\xae\xad/\"Tr\x1b\xfd9U\xf5w\xc5\xcb\xc3$\xe5\x19\xeb\x8a`P\xee\xe7\x0c\xb6\x06\x83\xbeu\xc1\xe0Y6\x96+\x97)\xac\x82\x145\x14\xa9\xcfX\x1bG\xe3b\x99\xa31\xed`Wu\xca1\xbb!\x1b\x00\xee\xe1\xae\x12\x1dS\xe6\x83\x02\xca\xf0\xa0\x9b\xb9\x85\xd3\xcb\xfc\x04-\x8c\x8b+\x94\xc7\x89\xf2\xde\xa6\x1f\xde-\xcd_\xb6m\x9f\x20<\xfa(\xdd\xf4\xcbe\xf2\xeb\xa3\xf2\xe6\xb7\x1f^\xbbl\xb3\xdeob(\x9b\xad]a]+\xe7&\xe5\xd4\x85\x07\x18\x98%\\9\xb4Q\x7f\x9e\xc88\x04\x7f\xb4`\xe2\x16k\xf6bBHB\xa7_~-\x96?U\xccW\x9f\xf0\x91\x19,IN\\\xd8\xa6$\x1bsS\x92\x17*7\xd4\xc4\xce\xbb\xfc\xa9K\xe9C\x95\xeb\xb4\xf9\x1cy\xd8\xd5\x16\xa7&+\xd9X\xbe\\\xa6\xb0\xfa\xac\xc4\x9c\x83s\x95\xd2\xf4\xa3\xf1\xb1\xcc\xd1\x98v\xb0\xa9:\xa5/~\xe5\xa9>,\x0b\x02\xbc\xc3]%r\x9fM\xbeZ\xa7\x90\x98\xd9\xef+\xba\xe4\x143\xd9\xd0\xda!b\xd5\xeb\xb3\xb4\xd9m\x00Sy\x92\xa6\xa7\xca/\xc1\xff\xf0\xea\xc6\x8d\x1d\xbf\x8e\x12\xf0A\xc7\xe6\x03\xec\xe7C\xc2\xf3j\"\x16\x13k\x00f\x16.+\x91\x9d\x1b\xf5\x99\xca\xd3\xd1\xb2L>\xbeZ\xea\x10\xb0\x8dU\xa2w\xf3\x9e\xd0\x931\x98X\x030\xb3pW\x89l\xdd\xa8\xa7\xb9\x12\xed.\xb8\xa0'c0\xb1\x06`f\xe1\xae\x12\xd9\xbaQ{\xa8D\xe1&\xd6\x7fX\x93\xb7om\xc1\xcb\x8f\xad(\xbd\xc0z_s0Jd8Ws\x85\xc9J\xf4\x98\x20\x08\xf9\xbf\x93\xd3\x17\x971\xeb\xfc\xdb:A\x03\x00\\V\"\xd1\xce\x8d\xfaLe\xd3S\x955A\x0f\xaeQ;\x13\xeb\x97W\x08{K\x855O\xafy\x96\xf5\xbe\xe6`\x94\xc8p\xae\xe6\x0a\x93\x95\xe87;\x85g_\xa3\x9b\xdf\x10:\xcc\x9c\xe1N\xd0\x00\x00\x8a\x87J\xa4\xbbQ\x9f\xad\xac>\xd5\x13\xaa\xdd\xef\xfa\xbd3{\x13\xeb\x82\x9d\xe2q\xe1\xa8\xb8\xdb\xe2w\xc6`*\x11\xe3\\\xcd\x16&+\xd1\xb3K^\xd2C\xde6s\xda\x98X\x03\x00DO\x95Hs\xa3\x16\xc5N\xda\x1d:_\xe5zw\xc1\xde\xc4\xba\xe0\x88\xf8\x9apA|b\xa7\xe8\xacD\x8cs5[\xd8\xb6\x03\x07\x0c\x83\xb6\xa3\xc2\xbbfN\x1b\x13k\x00\x80\xe8\xa9\x12in\xd4:\xc1h\x1e@\x13\x82\xbd\x89u\xc1q\xf1\xb5\xf1\xado=\x15\xa7l\x0d\xefz\x8c\xc5\xcfZ\xe6\xf8\xe6e\x9b\xe5\x0e\x0f}\xe0H\xc8\xfb\xe52\x81\x06\xec\xd6\\\xae\x1f\x16\xe1r\x0df\x1c\xee*\x11\x18G\xe0r\x0d\xa6\x11P\xa2\xa9\x0b\\\xae\xc1\xf4\x01J\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\x07J\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\x07J\x04\x00\xf0\x1e(\x11\x98VL\x9cM\x1d\x98P\xa0D`\xfa\xd0W\x94J\x96;\x05\x81I\x09\x94\x08L\x1f\xb2\xb2\x02M\xe1k\xfc\x82\xa9\x80\xebJ\x14\xe6Fm1\xa6v\x97\xa6\x14c\xa5\xc8\xb1XP;\x19H3\xbc|\xb7Pz\x85ZP\xdf\xfdr\xe4\xa0\x13\x05\xfa2\xd5\xe2\xff|tM\xfe6c-\xb4\xe84$\x8f~\xbdK\xfd\x8c\xd7\x11B\xfc\xe1\xb6\xbb\xfd\x8b\x92w\x84'9F}4\xbeu\x98ss\xe2\xe8\x86\xfc\x8dG6\xbe\xe4\x14\x16\xc6)\xd2\xe8\x14\x02&+n+Q\xb8\x1b5gL\xed6\x0d~c\x95\xa4\xb1XP;\x19H3\\\x18\x9d\xa0\x0f\xe4\x0b\xf1\x8a54\x12e\xa4\xcc)\xc4\x8e6\x1b%\xca.\x17\xfd\xc1\xb0$G,Gc[\xc7\xa1\x83g\xb4\xc3\xdbw\xef\x93_\xf7\x8eI\x89`\xfb6eqW\x89l\xdd\xa8\xadIo\x18\xab\x05u\x0cJ\xf4\xf2\xb2\x0b6J\xb4\x91U\"\x83w\x85Q\x8feD\xb1\x9c\x94;\x85\xd8aw\xe1\xce\xab\xea!]aI\x8eX\x8e6\xea\xd6a\xdaaw\x01\xed5\xfe\x12J4\xb3pW\x89l\xdd\xa8-I\xf78\x93HH\x9c2;\xc5[P3\x84\x9bM[\xb7\xda\x19Hwl[\x9b\xb7f\xdbZ\xc5\x9f\xe3\xf9\xcd\xcb6\xec\xa5\xeasAxw\xe3\x11M\x89\x8c\xd8\xa3\xda\x8a\xb1\x9b\xe5\x8d\x1f\xe4\x0b\x82\xb2\x92\xbexq\x8d\xbau\xaf<\xa6\x91\xdf\xf6\x89Ok{\xec\xab#\xee\x20\xca\x84NO\x92\xe6\x8a\x94\xd4\xc3\xec,&\x09\x81M\x99\xfe\xc5t\x9by\xc6\x14\xbb\x0b\xf7\x9e\xb2{\xe7\x9d\x8aW\x16\xcfe\x92\x1c\xda\xd1\xc4XZ\xc7<7\xa6I\x18+n\xb6\x1dV=\xa1\x84\x1d\xa2\xeby\x1b\x0d\xc5\xd9v\x9b\x8d\xca\xd3\x0c%\x9a\xba\xb8\xabD\xa2\x9d\x1b\xb5%\xe9\"\xc7\x82A\xdfv%\xc5ZP3\xd8\x99M[\xb6\xda\x18H\xbfq\xf7\xee#'\x0e\xaf\x11\xfe@\xb7\x0a\x8f\x1d?T\xb0\xf1\x8a\xa2D\x87\xb6iJd\xc4^x\xb5cCiGG\x87\xe2\xe7\xfaZGG\xbe\xbaD\xf5\x1b\x1dG\x84\x03\x1d\x1d\xef\xd3\x80\xb5\x8f\xfe^\xfc\xfd\x81\x15\x1d\x17\"U\x87\xae\xa8_A\xdf\x06\xab*T\xaaX;\xddPM\xbd6\xaf\xa0T\xfd}\xd9\x89\xd25+J\x8f+\xbf;\x93/\x9d+\x9b\x0b\xaep\xb1\xf2E\xfa\xd8\xaa\xfc\xd2\xd7\xe4\xc4\x1bZa\x87\xc5\x8b+\x94D\xde\xdb\xda\xe1\x04}n\x96\xad\x0e\xc3\xc1\x94\xf0;\\\x06\xc5\xf2\x89%t\xfa\xe5\xd7b\xe6\x8c\x95\xdf\x9dQVr\xc1M\x19)\xc5\x03M\x99\xc9{\xb8$\x8fy\xb4\xd1\xb7\x8eyn\xa2\xd9$\xac\x157\xd3\x0e\xca\xef\xce6\x1f_K;BFC\xf1\xb1z\x09\x16\xfa\xe2W\x9e\xea\x8b\xf1\xa7\x83`\x92\xe0\xae\x12\x81\xb1paI\x94\x1f\xcd\x02\x86\xfa,B\xeeu\x0a\x02\x93\x12(\xd1\xe4\xe7\xc8\x9a?8\x85\x00\x8d\xbeS\x1e<\xac\x0f\xc6\x01(\xd1$\xe7\xe9\x97\xaf|\xf5\x80\x08\xc04\x07J4\xb9\xb9\x20l~\xb4`\x94\x8b\x83\x000u\x81\x12Mr\x0e,+}\xdb)\x06\x80)\x0f\x94\x08\x00\xe0=P\"\x00\x80\xf7@\x89\x00\x00\xde\x03%\x02\x00x\x0f\x94\x08\x00\xe0=P\"\x00\x80\xf7@\x89\x00\x00\xde\x03%\x02\x00x\x0f\x94\x08\x00\xe0=\xae+Q\x98\x1b\xb5(\x0e\xb4<\x15x\xaae\xc0!\xe34b\x92\x98X\x030yp[\x89\xc2\xdd\xa8\xc53\xd5u\xa1\x9eP]\xb5g\xeb6\xba\xce$1\xb1\xa6|\xf0~\xe4}\xcd\xed\x91\xf7\x010\xbe\xb8\xacDvn\xd4\xc1Z\xea\x1fq\xa9vFy\x9a\x8f\xda\x1cu\x02M\xac\xa9\xb1\xe1\x8aR-y\xf9\xd2\xe5\xcb\xf2\xff\xec\xdel~\x155\x00&\x10w\x95\xc8\xd6\x8d\xba\xa9^\xf9P\xef\x89\xf9\xa2W\xc4\xa0D\x13fb-\xbe\xb5Y\xd0\xbcZ\xbb\xb2\xb3\xb2\xee\x99\x97\x95\xb5\x89\x1d#/\x80\x12\x01\xd7pW\x89l\xdd\xa8\xfb\xab\x9b\xfb\x07\xfb\x83\xd5\xfd\x91rM=Fo\xd3\xec\xa1\x89\xf5\x85\xbd\xc2\xda\x97\xd4\xe4%\x1f\xc9\xcd\x9d\xe5\xcf\xcd\x9e\xf5\xc0ymo\x83\xb6\xba\xec\x02Q<\x15OHYWaz\xe2\xe2K\xc5$\xaeZ\xec\xf6\x91,%\xa6:\xc7\x9f\xb9i\x06\xcd\xef\x81\x09\xc4]%\x12m\xdd\xa8\xcf7UVV6\xea\x97\xc04\x20\x16\x9bf\xafL\xac\xaf\x1c-\xc8{B\xedh]|\xf7\xed\xff\xbd\\\x92B\xc3\xd2\xc8g\x97\xea\x7f\x0f\x06Z\x82\x99\x0b\x83\xc1`H\xfe\xf7\xa9\xadI\xcfL\x9a\xbb\xa9\x90\x9c\xee\x0d&l\x17\xc5\xd6u\x8aQHQ\\ICE\xca\x02,\x1c\x0d\xc6\x01\x0f\x95H\xb7\xa0\x1el\xaa\x0d\xf5\x86j\x9b\xc2\xddF\xa7(\xb1\xd84{fb\xfd\xa8\xb0\xf1--Y*\xfc?\xff\xe7\xacY\xb3\xc4\x95\xb3f}\xa6\x9c\xb9o\xc0\x8c\xce\x16\x90EgE\x91:!\x98\x96E\x0d\x8a\x17l\x1b\xd9/\x02p\xdbx\xa8D\xba\x05u\xb0\x96z\x0c\x0d\xd6N\x1b\x87\x98Xl\x9a=3\xb1~~\xc9\xaa\xe7\xb5\x89\xee\xb7\x8f\x1e\xfd\x1f\xff\xef\xff%+\xd1\x7f\xb8wG\x17\xe3\xf7\xc4*\x91Ow#2\x95hu\xc6\xe0%\x99\xb9E\"\x00\xb7\x8d\x87J\xa4[P\x07N*o'\x03v\xe1S\x91Xl\x9a\xbd3\xb1~w\x9b\xb0Y\xef\x15\x89\x97\xcf\x06d%\x8ao\xefg\x8d\xe7X%\xca\xd6S\xa6\x12\xcd\xd7f\x92`\xa6\x01\xc6\x01\xef\x94\xc8\xb0\xa0\xd6\x94\xa8}\xda(Q,6\xcd\x1e\x9aX\xd3\x99\xa2\xbd\xc6-\xb9Z\xaaD]\xdc\x08YQ\xa2\xc0i#\xa9\xa0(Q\x19U\xa2\xc2\x8cv\x85it\xa7\x01x\x87wJdXP7k\xa3\xb3\xe6\x089\xa6\x1c\xb1\xd84{jb}a\xafPpBK\xdb(Qn\xae(\xf6\x91Z\x9a4\x95\xc8\xbfU\xeeAeS%jTw\x95\x95\x8b\x00\xdc6\xee*\x91\xad\x1b\xf5\xf9\xfd\xb5\x9d=\x9d\xb5\xfb\xa7\xcf\xcd\xb3\x18l\x9a\xbd4\xb1\x96y\xabT\x1f\xe4\xd9(\xd1v_E\xfd\"\x7f\x8fx\xa9U\xb9\x8d\xa6\x0a\xea\xc2\x94\x1d\xe59$\xbe*$\x8a\xf7\x93\xd5\xb5\xf5E\xa4\xdaZ(\x00\xb1\xe3\xae\x12\xd9\xbbQ\x0f\xb6\xd5U\xd5\xb5\xb13\x14S\x9d\xd1\xdb4{ib\xcda\xa3D\x83%\xc9\x89\x0b\xdbD\xf1\x94\xeaa\xad\x0ajWnb\xd2\xe2\xafPkk\xb9W\x94\x9b\x92\xbc0\x8a\x116\x00\xa3\xc6]%\x02.\x12\x9b\x89\xb5\x8d\x12\x01\xe0\x1eP\xa2iKl&\xd6P\"\xe0)P\xa2\xe9\x89\x93\x89\xb5`\xe5\xff\x96\x95\xe8\xff\x80\x12\x01\xaf\x80\x12MK\x1cM\xac\xa1D`r\x01%\x9a\x9e\xc4lb\x8d\xd1\x19\xf0\x14(\x11P\x80\x12\x01O\x81\x12\x01\x05(\x11\xf0\x14(\x11\x90\x19\xdc\xb3\x92\xfe\x02vk\xcbtz\xaa\x0bL%\xa0D@&G_\x15\xa4\x0eR\x04<\x01J\x04D\xf1\xfc\x1d\xe5\x924$I#w,\x9f9\xbe\x06`R\x01%\x02\xa28@Hn\xee\x1d\xa9\xb9\xd9\xb3\x8a\xf0\xcbz\xe0\x09P\"\x20\x8a\x97\x82s\x93\x933\x93\x93\x93\x17\xb5M\x9f\xdf!\x83)\xc5LV\xa2\x95$\xa50\xe4\x1443\x18\xec\xeb\xee\xea\xee\xee\xea:\x8d\xf5\xf1\x817\xccd%\xeam\xae\xcaJ\xc1\xa5\xa7B\xbd\xce,~g\x00\xb8\x87\xebJd\xe3F}\xf9T}\xa0\xce\x9b\xceI39\xe5\x14\x02\x00\x98x\xdcV\"\x1b7j\xb1\xa1\xaa\xbd\xfbX\xe0X\xf4\x8c\x13C\x1biu\x0a\x01\x00L<.+\x91\x9d\x1b\xf5\xc9\x00\xbd_\xd3\x15\xf0b\x9c\x04%\x8a\xc8,\xcfq\xaa!\x98N\xb8\xabD\xb6n\xd4\x0d\x8d\xca\x87j/:EP\xa2\x88\xcc:\xe71P\xa2\x19\x85\xbbJd\xebF]\x17T>\xd5{\xb1\x0c\xe9)2m\xd6\xf1\x1fo\xa0D\xc0M\xdcU\"\xd1\xce\x8d\xba\xa5Z\xf1\xf6\xa8\xaa\xb3\xcf0\xa1\x0c\xa6\xe4\xb4\xf4\xe0\x86\x91\x1dP\"\xe0&\x1e*\x91\xeeF=P\xd5\xd0w\xbe\xb7\xbe\xb2\xd6>\xc3\xc4r\x90\x10\xb2\xd4)hF\x02%\x02n\xe2\xa1\x12\xe9n\xd4b\x7fCee\xa0\xb5\xa1\xde6~b\x19H\xc9\xa8h\xeev\x8a\x9a\x910J4jQ\x1au\xe0\xb9Q\xc4B\x89f\x14\x1e*Q\x959E}\xbe\xff\xb2\xa8\xdcGs\x9b6\xd2\xe4\x142S\x81\x12\x017\xf1N\x89\x0c7jQY\x9e\xabK\x9d\xbev\x19\xdc;\x8b\x08\x94\x08\xb8\x89wJd\xb8Q+\xb7\xd0\xce\xd6xr\x13\x0bJ\x14\x11Y)~\xfa\xb7w\xcc\xfa\xc2?\xc9\x9a\xf0\x8d/\xcc\xba\xe3\xef~%\xab\xc3\xd7?\xff\xbf}\xfe\xeb\xf2\x8e;\xe4\xf4\xdf\xc9\xff\xdf\xf13U5\xbe\xf3\x85Y\x9f\xfb\x06\x13(\xe7\xfc\xec\xdf\xfe\x8a\xd9`\x16\xf1\x9d\xbf\x9a\xf5\xf9\xbf?g*\x91V\xe4\xb9Y4!\x97a\x1e\xd5\xa9\x86`:\xe1\xae\x12\xd9\xbaQwU\xb6\xf5\x9c\xacn\xf0\xe2\xc1F\xb1\x15J\x14\x09Y)\xbe\xf0\xe5_\xbd\xf7\xcf\x7f#k\xc2_>\xf3\xde\xcf\xfeNV\x9e\xef|\xee\x99\x7fy\xe6s\xdf9w\xee/\x7fx\xee\xa7\xb3~v\xee\x9f\xffRU\x93\xef\xfd\x87\xef\xbd\xf7\xd3\xbfc\x02\xff\xea\x99\xf7\xfe\xe5\xbf\xfc'f\x83\x91\xf8\xe7\xbf\xfa\xe7\xf7~\xfa\x1f\xff\xdeP\"\xa3\xc8Y\x9f{\xe6\xbdg>\xf7\xdf\x99\xa3:\xd5\x10L'\xdcU\"{7\xea\xf6\xda\xaa\x86\xf6\xc8\x99&\x8c\xc1\xde\xf6\x95\xbe^\xa7\xa8\x99\x8a\xac\x14\x9f\xd1z<\xb3~(\xbf\xfc\x8b\xdc\x0f\xfa\xe2w\xa8v|\xf1\xdc\xb9\xff\xf2\xe5s_\x9e\xf5\x8ds\x7f\xff\xff\xa9\x01_\xfc'K\x20\xe5_>\xc7l0\x12w\xd2\xc4\xcf>o(\x91Q\xe4,%q'sT\xa7\x1a\x82\xe9\x84\xbbJ4\xb9\xb8\x97\x90t/n\xd8M\x0dd\xa5\xf8\xafw\xfc\xe7oPYPEC~\xfd,\x1d^\xfd\xea\xb3r'\xe8\xaf\xcf\xdd\xf9\x9f\xfe\xe6\xdc\x17\xbf\xa7\x89\xc6\xaf\xce\xe9!\xea\xeb\xcf\xfe\xe6\x8eY\xb3f1\x1b\x8c\xc4\x1d\xea/9\x0c%2\x8aT\xca\xf8\xd5\x1d\xccQ\x9dj\x08\xa6\x133Y\x89\xfa\xda{\x9cBf0T)~\xf8\xe5\xbf\xfd\xec\x97\xed\x94\xe8\xbd;~\xf6\x99\x9f\xdd\xf1\xb3Y\xef\xa9rr\x87U\x89\xee\xfc\xaf?;\xf7\x9e\xad\x12\xcd\xd2z<\x91\x95\xc88\xaaS\x0d\xc1tb&+\x11\x88\x86\xa6\x14?\xfd,##\xc6P\xea\xdc\x9d\xff\xf9?\xca\xff\xdf\xa9\xa9\xca\x9d\xfa\xe8L\x7f\xfd\x8c,Q\xcf\xd8*\xd1\x17\xbf~\x8e\x8d\xb5\x19\x9dQ\x94\xa3:\xd5\x10L'\xa0D\xc0\x1eY)\xfe\xfa\xbf\xbf\xf7\xde\xd7\xbf\xc0\xc8\xc8w\x94Ye*\x19_\x9e\xf5e\xe5\x7f\x95g>\xa7\xcdX\xeb\x81_\xf8\xf2{?\xfcK[%z\xe6\x8eo\xfc\xea\xbdg\xfe\xdaP\"\xa3Hu\xc6\xfa{\xccQ\x9dj\x08\xa6\x13P\"`\x8f\xac\x14\xdf\xbbs\xd6\x1d\x7f\xf3SFF\xce}\xfd\xf3\xb3\x94[\xee\xe7~8\xeb\xa7\xe7~\xaaLC+\xfc\xd3_\xa9w\xf1\xf5\xc0\x1f~a\xd6\xe7\xben\xabD\xe7\x9e\xb9\xf33\xb3\xee|\xc6P\"\xa3\xc8Y4A\xef\xe2\x1bGu\xaa!\x98N@\x89\x80=\xbaR\xb8E\xd8\xf1\xa0D3\x0a(\x11\xb0\x07J\x04\xdc\x04J\x04\xec\x81\x12\x017\x81\x12\x01{\xdcV\xa20\xa0D3\x0a(\x11\xb0\x07J\x04\xdc\x04J\x04\xec\x89\xba\xd8\xbd+8\xd5\x10L'\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\x07J\x04\x00\xf0\x1e\xd7\x95\xa8Y\xb3\x9d\x1ehy*\xf0T\x8b\xba(Q_}U\xa3\x17+6:\xf1\x88\x20\x08\xf9\xef\xea\x9fN\x14\x1c\x8d\x16\xccrtC\xfe\xc6#\x1b_r\x0a\x03\x00h\xb8\xadD\x9a\x1b\xb5x\xa6\xba.\xd4\x13\xaa\xab\xa6\xeb6\xf6\x04\x82]\xc1@O\xb4l\xde\xf0\x9b\x8e\x8eC\xc2\xab\xfa\xa7\x97\x96\x1d\x89\x16,\xbe\xfc\x0b=uH\xd8yt\xaf\x20\x1c\x8a\x16=z\x9a\xbdX\xbb\x09\x00wqY\x89\x0c7\xea`-]\xbd\xfaRmP\x14/\xd7\xd0\xb5\xf4[j&\xa5\xed\xd8k\xa6\x12\x89W\xa2\xc4\xc9l~XK\xbc}\xf7>\xf9u\xefx)Q\xf6J\xa7\x08\x00\xa6<\xee*\x91\xe9F\xdd\xa4.QV\xdf$\x8a\xa1\xc0y95\x10\x08E\xce\xe7\x1d\xac\x129\xb0QW\xa2\xdd\x05\x17\xe5\xd7_\x8e\x97\x12-\x80\x12\x81\xe9\x8f\xbbJd\xbaQ\xf7W7\xf7\x0f\xf6\x07\xab\xfbeQRm\xa8\x0fz\xb0\xa4\xfe\xbb\x0f\xad\xc9+\xd8\xf6\x9b([u%\xfa\x20_\x10\x04mtv\xe5\xf9\xcd\xcb6\xec\xbd\x20\x8a\x8f\x0ay\x87\xf7n\xc8\xa7\xa1G\x05\x95\xcd\xf2\xfeUO(a\x87~Mc\x0fo\xce\xdfx\xe8\x0a\x17\xcb\x94\xc0\xd0\x93DT\x92z\x98\xad\x0d\xda\xc6\x05\xa2x*\x9e\x90\xb2\xae\xc2\xf4\xc4\xc5\x97\x8aI\\\xb5\xd8\xed#YJLu\x8e?s\x93'\xcb\x80\x030^\xb8\xabD\xa2\xe9\xedq\xbe\xa9\xb2\xb2\xb2\x91\xf6\x86\xeaT\xa3\xb3\x16\xf7\x17r}y\xd9\xe6\x1f\x9c8\x20<\x1be\xab\xd1'z\xad\xa3#\xff\x80\x9a\xdc-\xd1/\x14~'\xda(\xd1\xe1_\x8b\xe2\xee5T\xcb\x8e\xd2{g\xbb\xd7\xd3\xb9\xa0+\xebws\xb1l\x09\xce(J\x148m$\x15\x14%*\xa3JT\x98\xd1\xae\xd0\x1f!;\x00S\x01\xaf\x94\xa8Y\x1b\x9d5\xd3\xe7\x89ho\xa8\xd9\xfd\xe7\x89.\x14\x94R\xc9xl\xaf\xf2\xa9{G\xb7\xcdV\x1b%:\xa1\xce\xef\xec{Z\xe4\x95\xa8\xb4T\x14\x7fO\xf7\xbd}\xb7\xbc\xf5J)U\xa2\xe3J\xec\x11u\x9e\xc8\x88eKp&7W\x14\xfbH-M\x9aJ\xe4\xdf*7\\6U\xa2FuWY\xb9mf\x00\xa6\x06\xee*\x91\xe9F}~\x7fmgOg\xed~z\xf3\xac'\xd0\xdc\xdd\xec\xc53\xd6/\xe7o8|\xfc1\xe1\xb0\xf2a)\xb9\xc7\xba\xf5\xd7\xf4\x19\xebg;:\xe4~\xce\xc5W;:\xf2\x1f\xe9\xe8\xa0\xf3\xd8O\xdc\xbd\xf3\xc8\xd1\xdd\xb2\x9a\xbc\xdf\x91\xf7\xc8\xabW\xdex$\xaf\xe3}\x91\x8a\xcc\xb3G\xbf\xba\x8c\xde\xba\x7fV\xd8\xfd\xd2n\xf5\x19\xeb\x9d\xc2\x13/=!\xec\x14\xf9X\xa3\x84\xd1\xb0\xddWQ\xbf\xc8\xdf#^jUn\xa3\xa9z\xb90eGy\x0e\x89\xaf\x92;\x92\xf7\x93\xd5\xb5\xf5E\xc4\xf5\x09\x7f\x00\xc6\x11w\x95\x88q\xa3\x1el\xab\xab\xaakSoX\xf76\x06\xea=q\x85~\xfb\xe1\xb5\xcb6k\xbf&\xabJ\xa9\xb4n\xdd\xad\xcd\xe7\xc8\xc3\xae7\xb4\xa4\xa2Z'J\xd7\xac(=N\x9f\x11\x12\x84\xbc_.\x93_\x1f\x95\xb7^|lU~\xe9kJ\x09G7\xe4o>\xbe\x96v\x84\xae\x1c\xda\xa8?O\xc4\xc6\xea%\x8c\x86\xc1\x92\xe4\xc4\x85m\xa2x*N\x99\x0fR\xf5\xb2+71i\xf1W\x08)\x96\xd3\x8d\xb9)\xc9\x0b\x0fF-\x03\x80I\x8e\xbbJ\x04\x00\x00v@\x89\x00\x00\xde\x03%\x02\x00x\x0f\x94\x08\x00\xe0=P\"\x00\x80\xf7@\x89\x00\x00\xde\x03%\x02\x00x\x0f\x94\x08\x00\xe0=P\"\x00\x80\xf7@\x89\x00\x00\xde\x03%\x02\x00x\x0f\x94\x08\x00\xe0=SA\x89V\x92\x94B\xd7\x17/\x02\x00\xb8\xc8TP\xa2\xde\xe6\xaa\xac\x14xW\x000\x8dq]\x89\xec\xdc\xa8\xcd\xad\x91h&\xa7\xa2\x07\x00\x00\xa62n+\x91\x9d\x1b\xb5\xb95\"m\xa45z\x00\x00`*\xe3\xb2\x12\xd9\xb9Q3[#\x02%\x02`Z\xe3\xae\x12\xd9\xbaQ3[#\x02%\x02`Z\xe3\xae\x12\xd9\xbaQ3[#r\x8a\xb8\xeeA\x04\x00p\x0fw\x95H\xb4s\xa3f\xb7Fb0%\xa7\xa5\xc7u\xf3\x0f\x00\x80Kx\xa5D\x8c\x1b5\xb352\x07\x09!K\x1db\x00\x00S\x15\xaf\x94\x88q\xa3f\xb6Fd\x20%\xa3\xa2\xd9\xe2\xd2\x0c\x00\x986x\xa5D\x8c\x1b5\xb35\"m\xa4)z\x00\x00`*\xe3\xb1\x12\xb5\x8fZ\x89p\xef\x0c\x80i\x8cWJ\xc4\xb8Q3[#\x02%\x02`Z\xe3\xae\x12\xd9\xbbQ\x9b[#\xd2\x0a%\x02`:\xe3\xae\x12\xd9\xbbQ3[m\x19\xecm_\xe9\xf3\xc4\xad\x1a\x00\xe0\x0e\xee*\xd1\xd8\xb8\x97\x90\xf4z\xa7\x20\x00\xc0\x14f*(Q_{\x8fS\x08\x00`J3\x15\x94\x08\x000\xdd\x81\x12\x01\x00\xbc\x07J\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\x07J\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\x07J\x04\x00\xf0\x1e(\x11\x00\xc0{\\W\"\x1b7\xea\x81`m\xa0\xfe\xd4\xa5h\xb9\x00\x00\xd3\x1a\xb7\x95\xc8\xc6\x8d\xfalU}g\xf7\xb1\xaazH\x11\x003\x16\x97\x95\xc8\xce\x8d\xba\xb9\x96\x1a\x99\xf5\x07\x8eE\xcb\x08\x00\x98\xce\xb8\xabD\xb6n\xd4u\xb5\xea\xbe\x86\x08\x99\x00\x00\xd3\x1ew\x95\xc8\xd6\x8d\xba\xb7G\xd9\xd2\xf2T\xe4|\x00\x80\xe9\x8d\xbbJ$Fr\xa3\x16\xc5\xcb5A\xfb\x0c\x00\x80\xe9\x8fWJdq\xa3\x96\xbbDU\xfd\x91\xb2\x00\x00\xa6;^)\x91\xc5\x8dZl\xad\x84\xd74\x003\x17\xaf\x94\x88w\xa3\xbe\xd4\x1c\x08E\xca\x00\x00\x98\xfex\xacD\xaa\x1b\xf5@C5\xec\xcc\x00\x98\xc9x\xa5D\xac\x1bu\xff\xfe:\xea\xbah\xce^\x03\x00f\x18\xee*\x91\xad\x1b\xf5\xe9\xc0\xfe\xee\xde\xde\xde\x96Z\xa7\xdc\x00\x80\xe9\x8a\xbbJd\xebF}\xb0R\x05O6\x020cqW\x89\x00\x00\xc0\x0e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\x07J\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\x07J\x04\x00\xf0\x1e(\x11\x00\xc0{\xfe\xe2+\x00\x00\xe05\xb7\xd3'\x02\x00\x80\xf1\x01J\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\x07J\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\x07J\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\x07J\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\x07J\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\x07J\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\x07J\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\x07J\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbcg\x14J$\xee\xc8IIH\xbd\xe7\xa9\x11\xa7\xc0\x08\x0c\xd2\x8c\xb5d\xb9S\\\xec(%\xd7\x90\x95\xe6\x96\xd1\x1c\x86\xcb0\x16\xf6\x90\"\xa7\x10\x00@L8+QU\"QI\xefq\x0a\xb5eO\xe2\x904:\x89\x88\x15\xb5d(\x11\x00S\x1fG%\xdaNHn\xcb\xd5\x91\xb3Us\x89\xaf\xcd)\xd8\x86\x11B\xa8^\xf4\xee\x09:E\xc6\x8aV2',\xa39\x0c\x94\x08\x80I\x87\x93\x12\x05\x09\xd9\xa3\xa6\x86rI\xf2\x9f\xa2\x07\xdb\xa1\xe9\xc5\x04`\xa7D\xa3!\xe6\x0cV\xa0D\x00\x8c7NJ\x94A6\xe9\xc9\xa1TR\x12-\xd4\x1e(\x11\x00\xc0\x11\x07%:F\xe2.\x19\x1f\xaa\xc9\x9c\x11z!\x7f\xb3\x7ferR\xceAu\xe3\xe0\x96t_\xf2\xbd\xed4YE\x02\xed\x19\x89\xd9\x03\x92\xd4\xba:\xcd\xe7\xcf*\x13%i\xab2\xc5\xd4\xabO\xe0\xf4\x15\xcfMH\xbeW\x19\xe5\xd5\x90\x8a?m\x99\xebK/\xbbJ?\x9d\xfdRzB\xd2\xc2*nVOdW\xd8\xd9\xad\x19\xbe\xe4\xe5!\xa5,&\x03[W\xfe(\x96C2\xe7\xa9*\xd1<\xb2U\x02\x00\x8c\x0f\x0eJ\xb4\x9d,0?\x88\x84\xb4)\x17\xf2\x1c\xdf\xe2\xdc8RL\xb7\xb5\xfb\x89o~\x06!\xe5\x12U\xa2-\xb3\x09\xf1\x8fH%\x84\xa4\xcdO\x95_\xaeJ\xf5\xab\x09Y\xb9zP\x93\x88\x86\x042g\x81\xbc\x83^\xc35dS\x1aIJ&$KV\x8c\xbe$\x92\x9c\x9dI\xc8]\xcc\xb1#\x06\xab\xe8%\xd7\x90y\xa9$U\xde5oDS\"\xbb\xc2Z\x12\xc9\x9cl\xb9\xb0\xa0\xc4g`\xeb\xca\x1f\x85?${\x9eP\"\x00\xc6\x1b\x07%\xba\x87\x1b\x90\xcd%U\xf4\x0a%\x99\x03\x92\xd4\x9dL\xea\xe5\x9eB\x12\xd9zM\x92:\x93I\x13U\xa2\xb8\xcc\xe6\xb6\xa7\xa46\x92xR\x8e\xee\x9cC\xbee\x8c\xa1\x14\x898\x1dG\xca\xe5\xcb\xba\xd1G\xaa\xd5r\xe4.J\xd0G\xea$i9)\xbb!\xefO\"-\xc6\xc1\"\x07k\x18\xa33\x92\xd1%wm\x12h}\x94\xc3\xd8\x14vi\x0e)\x1b\x91n~\x93\xcc\xbe\xcag\xe0\xea\xca\x1d\x85\xfb\xc0\x9d\xa7\xaaD\x0d\x81N\x09\x000>8(Q6\xd9n\xfd$_\xa1}\xf4\xc3A\x92A\x87HK%\xf5C&U\"u\xcf\xfdZ\xa6\xfb\xa9\x8c\xb1J\xb4R\x9b`\xa9%)#\xb4\x9c~\xfa\xa1\x98v\xae\xd2\xe5a\x96L\xa0\xb0\xd58X\xe4`\x0dS\x89\xb4]%\xdaal\x0a\xdbN\xeeQ\xde\x17\x92Z>\x03WW\xee(\xdc\x07\xee<1O\x04\xc0x\xe3\xa0D\xf3\xc9\x0e\xe6S\x0e)\xa3W\xe8B\xe5\xc3\x88O\xbeR\xe7\x92f\xf5C\x1c\x19\x90\x95(C\x8d\x1bQ\x87P;\xe8\x15\xcb(\xd1H\"\xe9R\xf7\xcf!!\xb9\x9c,\xe5C\x80N\x20/&9\xa1\x1b\x12K\x94`=BW\xa2y\xe6.E\x89\xc2\x0b\x93\xb2\xb4z\x0e^\xb2d\xe0\xea\xca\x1d\x85\xfb\xc0\x9d'\x94\x08\x80\xf1\xc6A\x89\x96s\x93!\x19\xa4\x82^\xa1_Q?\xcd#\xad\xc3\x84\xcc\xcbQH\x20m\xb2\x12\xdd\xa3\x05\x8e\x84\xea\xcaW\xa7\x13\xb2\x8eS\xa2\x01B\xb4Y\x9e\x85\xf2\xc0\xa8F\xebf(\xe2\x11\xf2\x11\x92\xb4\xba\xde\x9c\x8f\x8e\x16\xac\x1fDW\"uW=}\x8fP\x98\xe4S\xfb7\x0a\\\x06\xae\xae\xdcQ\xd8\x0f\xfcyB\x89\x00\x18o\x1c\x94\xa8\x8c\xe4\x98\x1f\x86\x08\x9dy\xa9\xd1\xbbI9\xe4\xa0HL\x9ad%Z\xad\xee\x09\xa4\xd2\x0d\xf3\x17Z\x94\xa8\x8f\xc4k%-%U\x92~3]\x15\x97\xbeu~9K|\xc95\xfd`\xd1\x82U,w\xf1M%\x0a/\xec\x1a!\x83F>.\x03WW\xee(\xec\x07\xfe<\xa1D\x00\x8c7\x0eJ\xd4E\xe2\xccK\xb8\x9e$\x0c\xd1+\xb4L\xfd\x98E\x8e\xc9\xdat\xc6\x0c\xd6\x95\xe8\x9b\x84|\xa9\xa1{X\xaa\x88\xd8'\xcaQ\xba9\xbc\xb8\x8ct\x96\xcf#\xe65\x1e=X\xc9\x10Q\x89\xc2\x0a\x93\x08\xd7'b2pu\x8d\xa8D\xfcyB\x89\x00\x18o\x9c\x9el\xcc4\xaf\xba\xe1\x0c%]\xa3\x8d\xc1\xae%\xc8\xfd\x8c\x14z/\x89\xd29pCW\xa2\x1bsH\xad\xb2m\x8bE\x89n\xcc\xe6\xa7~\x98\xcb~\x20\xa4\xa4\xabI\xbc>\xc1\x13%X#\xa2\x12\x85\x17&\x9f\x86\xfa+\x90\xe6\xc5\x01.\x03_\xd7\x88J\xc4\x9f'\x94\x08\x80\xf1\xc6I\x89:\x09\x9d\x1b\xa2\\[J\x12\xcfK\xf4\x0aMP\xbaI\xfb\xe9\xa3F\xc5$\xfb&\xfd\xd0J|Wu%\x12\xb5[h\xc3i\xf4\xb3\xdd\xbd\xb3:\x924b\x1d\xfd\xd0'\x0b\xa5~\x12g\x99\xf8\xb2\xe6'\x92\xd4\x01\xe6\xc0\x91\x82u\xd4\x92\xc3\x95\xc8\xae\xb0\xa0\x8f$g'\x93\x84\xa0\xa5\x13\xc5\xd55\xb2\x12q\xe7\x89g\xac\x01\x18o\x9c\x95H\x12+r\x92\xe2R\xee\xa9\xd5\xeeD\xc9Wh\xef\xd29\xc9KO\xa9\x1f\xcfnJ\xf7%f\x07\xe88\xc8\xb8w\xd6\x96\x9b\xe2\xcb\xda\xfe\xa7a\x1f\xbdc\xd5\x9f;;\xe9\xa0.!}Ei\xbe\xb4\x95\xedZ9J\xb0\xbagpK\xa6ov\xd6v\xf6\xce{\xe4`\x0d\xb5d\x9b\x19k\xbb\xc2\xfa\x8b\xd3\xe2S\x0a{%\x8b\x12qu\x8d\xa2D\xecyB\x89\x00\x18oF\xa1D\x16\xf4+\x14\x00\x00\xc6\x0b(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\x07J\x04\x00\xf0\x9e\xd8\x95\x08\x00\x00\xc6\x1b(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\x07J\x04\x00\xf0\x9e\xf1R\xa2\xe7\x84o\xdb\xef\xc0\xad6\x00\x80#P\"\x00\x80\xf7@\x89\x00\x00\xde\x03%\x02\x00x\xcf$Q\xa2\x96\\n\x09\x8f\x98\x18\xcamq\x0a\x01\x00Ln\x1c\x94\xe8E\xe1\xb9?\x7f{M\xfe\xc6W\xa4[/n\\R\xf0\xddO\x95\xad?\xdf\xb56/\x7f\xc3\x93\xff\xa6|x\xe7\xa1U\xcb\x1e\xfc\xad\xa6D\x1f\x7fw}\xde\xaa\x87\xdedJ\x90\x95h\xa00\xd9\x9f\xd3\x20\xd1\x95\xa5U\xa71\xa9\x82\xb3\x96\xa5\xeb\x95UHc'\x10\xf7\xad\xa8\xfbK\x08!\xfe\x81\xa8!:\x9d\x84\xe4JR\xb3\x9c\xe1T\xe4\xa0\xf6TC\xfa\x86\xb6\xa4\xf9\x97\xdf\x8c\x1c\x0a\x00\x18\x15\x8eJ\xf4\xedU\xc2\x9a%\x82\xf0\xca\xe3B\xfe\x1aA(\xa5\x1b\xbf-\x08\x05\x1b\x0b\x04a-\xd5\xa5\x17\xe8\x87\xbc\xbc\xaf*J\xf4\xe62!\x7f\xe3zA\xf8\xbeYB\x0d\x99\x97L\xe6e\x12R(IW\x13\xd4U\xa3\xa5L\x12b\x8f\xb2?\xaeA\xba\x1dZ\xe3k\xa2\xed\xbe\x1c\x0a\xd5j\xcb\xf3;1r\x92\xf8C\xd2p399\"q\x9c\xea1\xd3\xads\x9a\xf5\xe4\xd2\xb4\xa7J\x12\x87$\x00\xc0\xed\xe1\xa8D\xc2\x86\x0f\xa5\xeb\xbb\x84\xfc\xfc\x1f\xdf\x92^\x11\x84\x7f\x95\xe5F\xc8\xa7\x9d\x9ew\x96\x09/H\xd2o\x85\xbb_\xbc%}\xf2\xa0@\x95\xe8\xe3e\xc2\xbe\xeb\xf2\x9eU\xc2+F\x09\xd4\x85\xbe_\xeeG\xf8\xa9\x89\xc6JRN\xb7\x9d&\xe9\xecA\xce\xfb\xca\xf5\xe4\xd5\xc5c\x1a\xa5\xed\xf0]\x8e\x1e\xd0=J%\x92\x86I\xb1\xdc]\x1b$\xc3\x96\xed\x0bm\x17\xd1\x1f\"\xb2\x04ZC\x01\x001\xe3\xacD\x1f\xcao\x1f\x0a\xc2s\xf4c\xa9\xf0\xa2$\xed\xbb\xfbIe\xdf>\xe1qI\xda%\xec\xa3\xe9O\xd7P%\xda'<\xa4\xec\xf9\x89\xb0\xc1(\xa1Fs\xcf\xd8O\xad\xaa\x83\xaa\x04\x95\x11Cz(%s\x19\xbf\xc5>i\x0c\\\x9b\xcb\x8f\xf6\xc2\x88A\x89N%\x8d\xd8(Q\xce:\xbb\xe8\x01\x82)*\x00\xc6\x03G%ZO\xdf\xae\x0b\xc2\xff\xa2\xef\xbbh7H\xba~]\xd9\xf7\x03\xe1\x1f\xa5[+h/I\xa2\"$+\xd1Z\xad/$\x87\x7f\xa4\x97PC\x16)\xef\xc3\xd4Q~$\x99*\xc2\xcdT\xd6\xc7P\xba\x91\xb4]\x0b\xcdj=C\xce\xb6f)\x0ed\x03\x85\xa9\x09i\xcb\x15\xbb\xa0\xda\x1c\x7f6\xdd\xb6\x95$\xd4\x95e\xf9\x97^\xe6\x92\x0a;\x12-\xa3)\xbe\x04F\x89\xf4\xc2$)\xb44=!uy\x86\x92>\x98;'\xeb\x01\xaa\x87\xc3d0\xa7YW\"=\xb6E\xf3\x14\xa0~\xb8C\x89\x84\xc45\xd2\xbd7R\xd4\xade\xd4|\x88\xc8\xe2Z\xa18\xc4\x02\x00b\xc7Q\x89\x1e\xa4o\xff.\x08\x9f\xd0\xf7\xdd\x8a\x12I\xd7\xdfy\xf1\xfb\xbb\xd6\x0b\xc2n\xe9\x13APe\xe9\xc7\xb2\x12}*\x08\x1b\xefS\xc8\x13\x8cIk\xc326\x83\xba\x12m!\xf7\xcb#5\x92\xcd\x1e\xa3\x87hv=b1\x99/\xff\xb7\x8e\x8aGgRN\xa0\xbd\x82T\xcb\xc9\x12\xdf\x8e\xd6\x1d\xbebI\xeao\x8c'\xa9\x15UI\x85\\R!\x14\xde\xe7aJ`\x94\xc8(L\xde\xf4\xa5\xe6\xf6\xbaTB\xdd\x197\xc5\xdd\xdfZ\x93\x9asSQ\xa2\x9a\xe5\x9a\x12\x19\xb1\xd7B\xa1\xac\xbbB\xa1\xd0YZ\xc2\xe9P\xc8\xa7\xce\xaf\xf7\x86\x1aIE($\xd2\x80\xf4-\x7f\x92\xaeV$\x870T\x03`,8*\xd1\xc3\xf4MV\"\xe5F\x99\xa2D\xb7^X#\x08\xc2\xdd\x1bKe%\xfaH\x10\xd4\xc0\xd7e%\xfa\xb3`bL\x14\xd5\x90\x1djb>i\xa6\xee\xd6\xa97\xa5\"M\x1e4Z\xe5\xce\x92\xc6\xb1\x04\x92\xd0F\x13#\xe9\xf7\xca\x9d\x9c\x1bMC\xf26B\xdd=\xda\xa9\x8eI\xbed\xb9\x13T\x9c*\xf1I\x99\xcb\xc4\x98D\xd6`J\x90L%b\x0a\xabM\xa5\x1aT\x9b,\xd1\x1a4(1\x8d\x8a\x12]\x9d}UQ\"\xf6\xc0\xfc\xe8\xcc\xaf\xdf\xe93Gg\x15\xb4\xbf\xf4%\x871\"\x00\x20\x02cP\xa2\xe7\x84\xbb\x1f\xff\xf1o?\x95\xdfw\xd3n\x90zc\xff'j\x9f\xc8\x18\x94\x19\xd4\x90\x07\xd4D\x069)\xd1\xbbf\xa7F\xfc\xf1\xdc\xb4t\x90\x0c\xaa\x89\xa12_:\x99\xeb\xdb.\x8bG\x1b\xe9\xd5wo\x9a\xaf\xbc\xcd\xa7W\xb9\x8f\xbeT\xf8$>)Q%\xb2\x0e\x8b\x98\x12$S\x89\x98\xc2\xc4\xb9\x99[\xeb{%*GE\x997(\xe9%\x8a\x12I\xcb\xab\x15%b\x0f\xec\xa8D\x97I\xbf4\x92tR\x02\x00\x8c\x85\xd8\x95\xe8\xfa2:m-\xf3]Y\x89n\xad\x12\xdeQ>|\x9f\xce\x13\xad\xd1\xbbB\xef\xfc\xf1\xdf\xf5\x12j4\x87\xb2!\xd5#\xba\x82lmc=\xcb$\xdaO\xd2FN\x81\xd4\xba~\xd2\xbf?u\x0f}\xf2\xc8\x98\xf7Y\xa4>\x19\xb9r\xa1\xfc\xa2\x0c\x8b4%2\x93\x12U\x1a\xee\xb1\x00\x89+A2\x95\x88-l\xa8n\xdd<\x92\x16\x90T\x0bG\xcajU\x89\x9a\xb3\x15%bc\x1d\x95HZ\xfe\x80t,\xf9\x86\x04\x00\x18\x0b\xb1+\xd1\xbf\xa9\xb7\xd3\xa4O\xd7\x0a\xbb$\xe9q\xe1\x1f\xe9\x87\xeb\xeb\xa9\x12}[\xb8\xef\x16\xfd\xf4s!\xff\x13\xbd\x84\x1a2[\x994\xdeC\x94.\xc6\x20I\xdfj\x19I]\xf3\xe9\x17\xf6\x0d\xe5\xde\x19\xbd\x9cO\x12\xe3\xf9\x9d\x92L\xe5-S\xe9\x13ER\xa2\x0a\x9fu\x82\x86)A2\x95\x88)\xec4\xbd\x7f7\xdc\xe8\xaf\x95\x07y\x99=\x0aWU%\xba6\xa7\x9d*\x11{`U\x89\x1a.\xa9\xa5\xd9)QK\xea\x8d\x92M\x12\x00`L\xc4\xaeD\xff\xbeB\xd8'\xeb\xcd\x1f\x1f\x14\xe8=\xfb\x8f\x96\x08\xcf\xdd\x92>\xdd\xa5\xd7\xbaL\xe3)e1Y\xbd\xd75\x9c\xb6\x98\x0a\xd2W\x94\xfbR\xf4NU#i\x95\"+\xd1\xcdy\xc6OJ\x06\xbfu\xdeZ\x82d*\x11SX\x059F\xb7,\xdeB\xe7\x82\x94\xb1\xdd\x8e=\xaa\x12I%ET\x89\xd8\x03K\x8b\x17K\xd2\x9f\xf4!\xa0\x9d\x12\xddHmI\x89\xf2\\6\x00\x20\x1a\xb1+\x91\xf4#AX\xff\xe0?\x08+\x9e\x146\xca\x9b^\xc9\x13\xd6\xfcC\xbe\xf0\xb0\xf2\x8c\xf5\xebK\x84\xfc\xfb\xd6\x0b\xc2\xd7\xae\x1b%\xd4\x90\xa5\x89\x09\x0b\xd2\x89>q]O,\xbf\xf4\x90\xa4\xb3qU\x92\x95S\xb3\xe7?\xd5v?\xa9\x97\x93\xc5q\xe5\xad\xe5q\xc5\xb2L\x85\x12J\xba\xa4\x9e\x92\x84\x90\xc8$it\xb5\xd9\x01Z\xad\x8f\xfd\xcc\x12D\xfa\x8cuu(t\x89-LV\xa2\xa4\x8a\xd6`\x89r\xe3\xae\x9c\x145\xb7\x94\x90\x83\xf4\x19\xeb\xe6a\xa93Q\xb9wf\xc6R\xcd\xab\x0a.\x9d#\x1f\xecFW(\xe4+\x09\xd1\x9bd\xea\xbd3\xfd\xa6]y&\x06g\x00\x8c\x951(\x91\xf4\xe6\xd7\xd6\xe4ox\xf2\x93O\xf3\xee\xfeX\xfe\xf4\xaf\xbb\xd6\xe4\xdf\xf7\xe6+\xea\xef\xce>z|}^\xfe}/\x98B$+Qy\xdf\xd29\xfeEm\xda\xe7a_\xd8\x94\x8e\xb4cv\xd8&i`]z\xd2\xc2\xa0\x92\xdc\x9f\xad?ODHB\xff\x1c\xf9u+\x93\x94w\x84\xfc\xdb\x8d|\x0d\xa9u\xd6\x12J\xb4i\xa0\"\xb60\xe9\xe0\xe2\x8a\xf4\x84\xb4\xc5\xea\x13\x04\xed\xf7\xa4$\xd3*v*\x8f\x04\xdd\xccM\xbb\xc9\xc5J\xd2\xc8\xfd)\xfe\xbb\xba\xe5Dw\x9cZX\x1d}8\x8a\x12\x7fV;\x1c\xc1\xe0\x0c\x80\xb1\xe2\xa0D\xe3\xcfy\xfe\x97\x1e*e\xbe\xdby\"\xb0\xc9W2\x09z#\xc3\xbeN\xa7\x10\x00@\x04\\W\xa2\x1d\xe4\x9b6[\xab\xd3\xc7\xf4{3\x85\xa1\xb9\xd1\x7f\x8a\xef\x12M)\x93@\x0e\x01\x98\xa2\xb8\xabD\xfd\x83M\xb3}\xa2S\xd4\x14\xa4\xa2SZZ!\x01\x00\xc6\x88\xbbJTH\xc8m\xadD4Y\x19!9[\xd3\xb08\x08\x00c\xc6]%\x0a$\xa6NG!\x92\xfbDI\xf7\x9cu\x8a\x01\x00D\xc4]%\x02\x00\x00;\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\x07J\x04\x00\xf0\x1e(\x11\x00\xc0{\xc6I\x89>\xe6~\xdf1\x1a\x873\x00\x000\x18\x17%\xba\xf5B\xfe\xa7\xe6'(\x11\x00\x20F\xc6E\x89\xae\xeb+7*@\x89\x00\x001\x02%\x02\x00x\x8fgJ\xd4\x92;\xb6\xdf\xbcnqg\xed\x8d\xa1\\8\x99\x01\xe0\x1eNJ\xf4\xd1\xe3k\xf3V\x94\xfeH\x9d\x90f\\\xef_\x14\x9e\xfb\xe4\xbbk\xf3\xd6?\xf9\x09\xf5:\xa3|\xa8g\x91\x95h\xa00\xd9\x9fC\xfd2\xaa\xc9\\&\xac\xbao\x83\x20|\x8d\xaeO\xcd\xba\xde\xbf(|\xb7@X\xb6J\x106\\\x97~\xbcK\x10\x1e\xde\xf5\xb1\x9e\xa7\x86\xccK&\xf32\x09)\x94\xa4\xab\x09\x9a\xa9k&\xbf>\xda\xfe\xb8\x06it\xb0\x86\xf42\xc5\xb3\xffD\xd7ndd\x8c\x09\xb0\xc4\xde\x1e\xad\xf15N!\x06\xb6\x07n\x9f\xb3\xb0\xbe1\x9b\x903\xd2e\xbah\xa4\xbe\xb6\xa3\xd4:\xc7\xea\x88\xc4c\x16\xb6\x9f\x14\xb7l'd\xf4\xf5\x00`\xaa\xe2\xa0D\x0f\x0bO\xca\xdd\xa1\xdf\xae\x10^\xb7\xb8\xde\xbf(k\xd0;\x92\xf4z\x1e5\xfa\xb0\x8e\xceHF\xbf|!\xfaI\xad$\xadT\x8d\xa7O\xf3\xeb\xa3\x9d\xf7\x19v\xd4W\x17G\x1f\xa5\xf1\x86\xf4\x03\xaa\x8f\xa3\x8fQ\"&\xc0\xde\xbc~\xac\xec\xf0]\x96F\x89\xdd\x81\x87\x92V\x8fH\xd2\xb5L\xd5\xefv\xd4v\xd8La\x03\xca\x8a\xbbeP\"0\x03pP\xa2\xf5\xea\xa0\xebG\xbb~nq\xbd\x7fQ\x1b\x8e}\x9b\xae\x1a\x1b\xa6DJ?h?\xc9\xa0ff\x8a\x04\x95\x11Cz(%s\xaf\xe9\xc9>\xad\xd3\x14\x09\xde\x90\xbeD]\xdd\x88U\"&\xc0\xde\xbc~\xac\\\x9bk]p;\"v\x07.OT$\xb6\x8a(?\xd2\x8fA\x89\x8c\xc2\x8aS\xa9\xf5\xc0\x19R\x1b-\x1a\x80i\x81\x83\x12}M(}G\xb7.\xe3\\\xef_\xa4r$\xf3\x02]\xe8\xda\xaaD\x8b\x94\xf7\xe182@\x17{\x96/\xc1\x9b\xa9j\xcf@\xe3F\x92\xb6\xeetMV\xeb\x19r\xb65\xab\xd6bt\xaf\xdb\xd4\xb3\x86\xf4\x94\xc1\xf8\xaf(\xef\xbe\xedZ,\x13\xc0$\xb7\x92\xf8\x9aM\xe9)+\x07$\x0b\x03\x85\xa9\x09i\xcb\x151\xd3=\xef\x99\x03\xf3u\x90;E\x89\x16\x13\x12>@/\x81\xaf\xa4^u)S\x9dZ\xbfZ\xa5\x14\xa2+\xd1P\"!q\x8dZyz,S.[X\x8a\xdaJ\xfb/\xb1G\xb3o(\x00\xa68\x0eJ\xf4N\x9e\x20\xac\xd8\xf5c\xaa3\xbc\xeb\xfd\x8bZ\x07\xe9E;%R\x9d}\xa4\x0cj\xe4\xbc\x85\xdcOm|\xb2\xd9R{\x88\xb6\xe4\xb3XL\xe6\xcb\xff\xad\x13y\xa3{\xc3\xa6\x9e3\xa4\xa7;\xb4\x01\x93\x8f\xccklI+\xe4\x1c\xeb\x99$-,cOE\x86\xdf\xd2\xdd\xeaL\xca\x09\xb4W(^\xd8\x86\xe7=s`\xae\x0e2!k?\x86\x0b0J\xe0*iT}$\x8e\xb3\xdc6\xfaD\xa7C!\xbdGg\xc42\xe52\x85\x0d\x11f.\xcd\xae\xbeL\x09\x00Lq\x9c\xee\x9d}\xb8+_\x10\x84\xbco_\xb7\xb8\xdek\xa6\x1f\xaa\"Y\x95H3\x14\x9aO-\x16\xbbH\xeaM\xa9\x88p\x97e\xab\xdcY\xd28\x96@\x12T\xdb\x0f\xd3\xe8\x9e\xb1\xa9\xe7\x07>\x97\x12\xb6\xaa\x09\x1f]\x20qS\xaad\x090\x93\xbe\x8ca\xf9RN\xcf\x95XF\xd2\xef\x95\xfb'7\x9a\x86x\xcf{\xf3\xc0lR\xa2\x0e\xd3aS\xcbf\x00[\x82y`\xb3\xea\x83\x84\xbbC\xc6\x8e\xce4\xbb4\xf64\xd9\x03\xeb\x85\xf5+G\x90FFF\"\xd5\x97k(\x00\xa62NJ$\xcb\xcc;\xdf\xdf(\x08\xffhq\xbd\x8f\xaaD\x0f\xa8\x89\x0cB}\xe23\xc9\xa9\x11\x7f<7-\x1d\xa4\xf6\x86\x94\xa12_:\x99\xeb\xdbN\x17^5\x8d\xee\x19\x9bz^\x89\xb6&h\xf9|\x9b$\xc3v\xd1^\x89\x94i\xa9Z\xc2\xad\xe8\xdaFz\xf5$\xebyo\x1e\x98MJT\x89\xc2\x1e\x160\x03\xd8\x12\xcc\x03\x9bU\xbf\x11o\xdf'\x92\x0c%bO\x93=\xb0^\xd8\xb0\xa23E\xf2P\xedd\x84\xfar\x0d\x05\xc0T&\xba\x12\xdd\xfa\xa3\xeaz\xff#!\xef\xdfy\xd7\xfb\xa8J\xa4z\x1f\x0e\x11Bgd*\xc8\xd66\xdd\x0dQ\xa3K\xbf,\x03\xa9u\xfd\xa4\x7f\x7f\xea\x1e\x895uel\xea9\xa1\x11}\xfaS\x8d\xac\x01\xac\xbd\x12)\x17{'\xe7H-U\x13c\xde\x87\xf5\xbc\x8fhq\xdd\x1d\xee\xccf\x06\xb0%\x98\x07f\xaa\xae\xcd\x13\xddh\xd7\xca\x0aS\"\xf64mOH\x99'\x12\x9bI\xf9H\x84\xfar\x0d\x05\xc0T&\xba\x12}\"\xdc\xad8.~(\x08\xd7y\xd7\xfb\xa8J4[\x99\x13\xdeC\x94?\xe4\x83$}\xabe\x98s\xcd\xb8\xf7uC\xb9w\xa6\xd8\xf3\x98\x17\x18cS\xcf\x19\xd2\x97\xc5\x9d\xd7\xb2\x85]\xb8j\x80\x99\xf4)SUu\x8a\x95\xab\xc1IS\x98X\xcf\xfb\x88JT\xe1\xe3\xb2\xf3\x01l\x09\xe6\x81\x99\xaa\x97\xfb\x95\xfa7\x11\xe5\xcdF\x89\xd8\xd3\xb4=\xa1\xe24\xaa\x9cAz\x17\xdf\xbe\xbe\\C\x010\x95q\xbcw\xf65Y\x8a>\xdd%A\x10\xde\xd4\xf3\xd4\x90\xa5\x89\x09\x0b\xd2\x89>q]O,\xbf\xf4\x90\xa4\xb3qU\x96-\x9c\xd1\xbdaS/I\xa6!\xbd\xf4\x80>\xcf\xcd\xc52\x01L\xd2Gr\x9a\xea\xb3\x92\xd5\x0c\xab\xf5\xc1\xe1\xa9\xd9\xf3\x9fj\xbb\x9f\xd4K\x8c\xe7=S\x18_\xae<\x983\xbaPZ\x09\\\x80Q\x02w`\xa6\xea\xc7\xfc\xb9\x0d-K\xe3C4_\xa8\x96T\x87Br?\xe7FW(\xe4+\x09\x85\x86\xd9\xd8H'TM6\xb5\x96\xa8\xcfX\xdb\xd5\x97o(\x00\xa62N3\xd6\xf4\xa7f\xf9\x1b\x9eT\x07_\x8c\xeb=\xafD\x1f\x96\xe6\xaf\xf8\x89\x9e\xa5\x86\x94\xf7-\x9d\xe3_\xd4\xa6}\x1e\xf6\x85\xcf\xb7\xec\x98m\xd9\xc4\x1b\xdd\xeb6\xf5\x12cH\x7f5\xb1\xd86\xd6\x08`\x93\xbe\x07J\x92\xe7\x16k\xbd\xad\x86\xd4:-\xe7\xc0\xba\xf4\xa4\x85A%\xa9{\xde3\x85\xf1\xe5\x86\xfc\xdaCOf\x09|\x80^\x02w`\xb6\xea}K\xfdi\xab\xfb\xe5D\x896\x9fS$\xf7\x8d\xe2\xd4d\x1d\x1b\x1b\xf1\x84\x82\xf3\x12s\xdb\xd2\xdb\"\xd4\x97?\x1a\x00S\x19'%\x1a\x07\xce\xf3\xbf\xf4P)\xf3\xc5\xfa#\xd6r\xee\xe1H\x07\xd8\x87\xb0\xc7F\x93\xaf\x04\xee\xd2\x00\xb8\x85\x0bJ\xb4\x83|\xd3fkuz\x8c\xf3\xac\x9bbY\x0e\xe4\xb6\x95hh\xeem\xff\x14\x1f\x000j&Z\x89\xfa\x07\x9bf\xfbD\xa7\xa8q\xe7\xb6\x95\x08\x00\xe0&\x13\xadD\x85\x84\x8cq%\xa2\xdb@\x9d\xd5\x05\x00L\x19&Z\x89\x02\x89\xa9\xae\x0b\x91:\xab;\xe8\x14\x05\x00\x984L\xb4\x12\x01\x00\x803P\"\x00\x80\xf7@\x89\x00\x00\xde\x03%\x02\x00x\x0f\x94\x08\x00\xe0=\xe3\xaaD\xfaB\x8e\xd1y\x8e.}\xad1:o4\x00\xc04\x07J\x04\x00\xf0\x9eqU\xa2\x0f\x9f{\xdd)D\x82\x12\x01\x00\xc2\x18W%\x1a\x1dP\"\x00\x80\x85i\xa7D-\xb91\xfe\xb26*[b\xf9\xd9-\x88\xc2di\xc9\xa1\xdcQ{\x81\x8f\x85\xc9r\x9aS\x0f\x07%\xfa\x91\xf0\xc2\x9b\xeb\xf3\xff\xe1#u\xa1\xa2U\x0fi\xcb\xa1}\xb4o\xfd\x92U\x0f\xabk\\3;\xe8<\xd1\x0f\xb4\x85\x8b\xa4\xc7\x85'%K\xb6w\x1eZ\xb5\xec\xc1\xdfZ\x94h\xa00\xd9\x9f\xd3\x20\xd1u\xc1\xe6\xa9\x1b+\xb8\x95\xd5\x86\xb6\xa4\xf9\x97\x8f\xdaG'0\xae\xbfr;C\xca\xa5\xad$.\xd6\x05L(\x0dt\x15\xa2\xd4{{\xa4qf\x13!t\x95\xb9*B\xac\xdf\xf9\xf6\xd4\x09\xbd\xc6n\x8f\xc9\xd3\x92\x818\xfbU\x16\xc6\xa5\xf9n\xe34\xc7H0^[\xfc*>\xba\xc7\xb9F\xdf\xd29iE\x9di\x7fR\xd6\xcc\xf2\x0f8\x85+t\x12\x92+I\xcdr\x86S\x91\x83\x98\xe6c\xae\xd8\x18\x1a\xd5Q\x89\xbe\x9b/\x08\xcb\xaeKo.\x13\xf27\xae\x17\x84\xef\xd3\xad\xaf\xe7\x0b\xcb\xee[#P\x8bjn\x07U\xa2?\x0ay\xca\xb2j\xd7\x97Q\x93X.\xdb\x0b\x82P\xb01/\xef\xab\x9c\x12\xcdK&\xf32\x09)\x94\xa4\xab\x09\x9a\x1dl&\xb7\xb2\xda\xd2\xb4\xa7J\x129\x8f\x8e(\xec\x8fkp\x0a\x89\x8a\xc5\xe0\xbex\xf6\x9f\xe8\xcfi\x19qc\x02NE\xbd6\x86\x1b\xc8\xb7:\x1brug\xb7qCL\x0a\xd0\xc6\x18\x0a$YW8h\x9d\xa3\x7f\x17\xa3\xd7\xcc\x1d&YK2\x87h\x8d\xb7\xb5\xf76\x9b/\x16\xc6\xef4\xc7\x18\x10\x20\xda\x82\xa0$`\x93A\xc5\xcc\xd6>ga}c6!g\xa4\xcb4\xdb\xe8~&>r\x92\xf8C\xd2p39iY\x04\x9a\xad\x0e\xd3|\xcc\x15\x1bC\xa3:*\x91\xb0\xfe\xf57_\x94>^&\xec\xbb.wjVQ\x7f\x8f?/\x13\x9e\xbc.\xddz\x8e\xae\xac\xcf\xedP\xee\x9d\x95\x0a?\xa69_\x176J\xfc\xde\xdf\x0aw\xbfxK\xfa\xe4A\x81S\"\x92\xd1/7\x90\x9fZ.\xafT-\xabOs+\xab\x0d\xd1\xc5S\xc3V\xb6\x8f\xc0y\x1fgz\x1d;\xbc\xc1\xfd\x80\xea!\xc9.1\xc2\x04\xf0\xb1a\xf4)\x16e\x8b\xb2\xa2\x06\x8d\x81lUk\xeb9/K\x1e\x87\x9a\x8d\x0bW\x17G\x1f\x05O\xb2\x96d\x0f\xb1\xc3wY\x1a/\xc6\xf14\xc7\x16P\xed\xd3\x16IO\xe4\\\xad8\x8clCI\xabG\xe8\xfa\xee\xea\xa2\x83\xa3vH\x1f&\xc5%\xd4\x1a\xc3z\x19\xda\xd77\xa6+\xd6\xc4Y\x89>\xa4\xef\xfb\xb4\xfb\xf3?\xa1&\xd4O\xd2\xf5\xf5%\xaa9/\xf2;\x14%zQ\xdd\xbbKx\xc1\x92m\x97\xb0\x8f\xa6?]\xc3+\x91\xd2\x0f\xdaO2\xa8\x8b\x85\"Ae\x84\x95\x93\x012\xea\xfe\x9d$\x95\xcc\xbd\xe6\x14\x12\x1d\xde\xe0\xbeD]Y\x89\xfdb\xd9z\x1a\xd9\xa2^?\xfb\xc9m\xd6(\x8cBuy\xf0\x1d\xbaS\xad\x0d\x0e5\x1b\x17\xfa\x88\xc5`\xd7\xc2$kI\xf6\x10\xd7\xe6Z\xd7U\x1f;\xe3x\x9ac\x0b\x18\x19\xd0$e\xc0\xd2aa0\xb2\x95'*\x7f>\xaa\x88\xe2W\x1c\x83\x12\x9dJ\x1a\xb1Q\"\xfb\xfa\xc6t\xc5\x9a8*\xd1z\xe5}\xad\xe6uv\x9d\xda/n\xd0>|\xfc\xf1-~\x87\xa2D\x9f\xe6\x09\xd4\x0e$\x9f\xbe\xb2{o\xad\x10\xfeU\xf9\xb0\x8fS\xa2E\xca\xfbp\x1c\x19\x90F\x92i\xd3\xdcL5\x97\x89\xbd\x91\xa2\x8e\x81\xcb\xe8J\x1fq\x07\xa5A\x1f\x9dK\xe2\xad\xe1\x19\xaf\xfb\x1bI\xea\xd2\xd3\xbd\xf2\xd8y\xc7@q\x86\xff\xde\x1b\x15r\xeeF\xa9\x91\x18\xeb\xfb+\xd8\x9b\xcb\xf3\x06\xf7\xf2\x1f\x81\xf8\xaf(\xef\xbe\xed\xe1\xa6\xf5Lr+\x89\xaf\xd9\x94\x9e\xb2r@\xe2P\xaf\x9f\xe2t\xee\x10\x92\x14Z\x9a\x9e\x90\xba<\xc3\x9a\xcd\xd6\xf6\xde\x88eK(W\xff\x10\x15\x95\xb3\xa7)\x0d%\x12\x12\xa7x\xc1\xf2g\xa1gccm\xe1\x03\xcc\xfa\x0eo\x9f\x97tW\x97\xba\x96\xb6AMV\xeb\x19r\xb65\xab\xd6\xcb\x964j\xc6|5$\xdb\xa6\xb6VgG\xa2\xf5\xaa5\x9b\x8f?!\x1d\x17N\xd3\xfe\xdf-\xcaY\x98\x98\x92\xe2\x90M\xf3\xe0\xbbZ5\xc2g\xd3\xbf}\x11\xber\xc3d0\xa7YW\"=\x96-\xd7l>\xe6\x8ae\xb62\x85E\xfc\":*\x91\xd2\xc1\xf9T\x106\xde\xa7\x90'\xbc)-\x11\xfe\x97\xbe\x9f\xdf\xa1>\xd9\xf8\xb0\xdcU\x92{A\x0fZ\xf6~B=\xd3(?\xe6\x94\xa8LMdP\xa3\xe5-\xe4~j\x9d\xc3\x8c;zC\x8d\xa4\"Dm,\xd4\xd1wW\x89\xcfb\x0d\xcfx\xd5\x848\xd0\x00\x00\x09)IDAT\xddK=\xda\\\xc2HScFVRFY1\xb9t\xb5(74,\x0d\x87\x16\x15\xb1\x83\x09{sy\xce\xe0\x9e\xee\xd0z\xf1\xf2w\xbc\xb1%\x8d7\xadg\x92\xb4\xb0\x8c=\x15\x19~\xbe\x93\xd0GZG\xcen'{\xb8C\xc8\xff\xfa_jn\xafK%7\xf8l\xb6\xb6\xf7f,[B\xfdB\xa9+\xa3K\xca\xa9gOS\x1e\xd3\x86B\xea\x9fb\xee,\x8cl\\\xac\x1d\\\x80y\xb4\xa1\xcc\xd4@\xdbVBj\xb9`\xb1\x98\xcc\x97\xff['z\xd8\x92f\xcd\x98\xaf\x86}S[\xab\x13\x0a\xef\x0c\x18\xcd\xc7\x9d\x90\x81\x0b\xa7i\xff\xef\x16\xe5,L\x0cIq\xc86\x12g\xefKl|\xfb\"|\xe5d%\xaaY\xae)\x91\x11\xcbU\xc7h>\xe6\x8ae\xb7\x8e\xe2\x8b\xe8\xa8D\xbb\xe8\xdb\x9f\x05\x93W\xe4\x0e\xce\xc7\xfa~n\x87\xa6D\xaf\x0b\xa5\x92\xf4\xa0\xf0\x13\xcb\xde\x8f\x04A\xcd\xf3:\xa7DZWe>5g\xec\"\xa97\xa5\"\xc25\x97\xd9\xd7c}\xc9\x0ckx\xc6\xeb\x9e\xba\x82\x0d\xe8\xd9r\xc8\xd2ae\xb4\xda\xa0\xfe\xa5\x9coq\xe2\x89`.\xcf\xf67/%l\xd5b\xd3\xe4\xd27\xf1\xa6\xf5\\\xd2\x97!\x1fh(=Wb\xe9S\xfe6(~$\xcc!jS\xe9?rm2\x9f\xcd\xde\xf6\x9e\x89eJ\x08\xa5J\xdb}\xdb\xa5TEt\x8d\xd3\xa4\xf8\xf5A\x81Q3\xfe\xdc\xd8X;\x8c\x00&[\xb1bGWfQ\"\xb9\xc6\x09$A\xed'y\xd5\x92l\xcdX\x1b:\xdb\xa6\xe6\x07\x12\x97\x89\xdd<\xaa\xde|\xe6\x09\xb1L\xfci\xda\xff\xbbE>\x0b\x13]R\x9c\xb2\x0d\xf2\xe3&=\x1b\xf3\xed\xb3\xff\xca\xc9Jtu\xf6UE\x89\xd8o*_\x1d\xe3\xdb\xc7\x8d\xce\xb4\xad\xa3\xf8\"\x8eN\x89>\xa5c/\x9d[\xda\xdcQ\xd8\x0eM\x89\xae\xaf\x10\xfe\xf8oB\xfe\xa7\x96\xbd\x9f\xeaF\xb1?\xe1\x94\xe8\x015\x91ANJ\xf4\xae\xd9\xa9\x11\x7f<\xdb{\x89\xa0D%z\x92\xf1\xba\xa7\x13M\xc6B\x8d9>Mr{\xe3F\xae5\x0c\xdd\xf01a|\x09\x9c\xb9<\xdb\xb6[\xf5e\x1f\x15\x13\xec\xa8\xde\xd7\xca\xc4V-\xe1\xee\xf0\xf5\x91\xaa\xae\xd6\\?-\x839\x8487sk}\xaf\xe6zkd\xb3\xb7\xbdgb\x99\x12.\x91kw}i\xd1\xb0\xfa'\xc58MJ\xb8\x12\xf1\xe7\xe6\x8b\xd0\x1d\xd21\x02\x98lj\x99\xfd\x16%\x1a*\xf3\xa5\x93\xb9\xbe\xed\xf4\x84\xbdjI\xb6f\xe6W#BS[\x95\xc8\xee6\xbb\xa1D\xc6\x09\xb1L\xfci\xda\xff\xbbE>\x0b\x13]R\x9c\xb2\xdd\x88\xb7\xed\x131\xdf>\xfb\xaf\x9c\xacD\xd2\xf2jE\x89\xd8oj\x0cJ4\x8a/\xe2\xe8\x94HZ\xa3M\xf8H\xef\xfc\xf1\xdf\xa5\xf5\x82\xfa\xa3\x8eW\xbe\xf6\x02\xbfC\xfb\xdd\xd9w\x85\x17_\x14\xfe\xd1\x9a\xed\xd6*A}\x00\xe9\xfb\x9c\x12\xa9\xa6\x88C\x84\xd0\xbfp\x15dk\x9bn\x93\xa8a\xafDF\x92\xf1\xba\xa7}*\xa3\xd7\x9d\xa3\x8f\xa6G\xe2\xfb\xaa\xc8\x8e\xb3q\x96\x99\x01\xb3\x04\xce\\\x9ei[\xd1\xa7?\xb0\x13f\x15-Y\x92j\x17\xb4\xd3tj\xa4(\xb3\x1bCq\xd4\xd8\x8c=\xc4P\xdd\xbay$-\xc0g\xb3\xb7\xbdgb\xd9\x12|}I=I}\x09\xca\x03\x1b9\xec\xa4A\xb8\x12\xf1\xe7\x16>\xc1\xc0c\x04\x98\xd9.\x13\xc5\x1dn\xd8\xa2D\x81\xd4\xba~\xd2\xbf?\x95\xb7\xafu\xb5%\xb9\x9a\xd9\xd7\x81ij\xfe\xa2\xe9\x0e7\xe0\x93\x18%b*i2\xf1\xa7\x19\xe1\xdf-\xe2Y\x98\xe8\x92\xe2\x98M\x9b'\xba\xd1\xceec\xbf}\xb6_9\xaaD\xcd\xd9\x8a\x12\xb1\xb11(\xd1(\xbe\x88\xa3T\xa2o\x0b\xf7\xdd\xa2\xef?\xa7w\xee\xf7i\x0f/>$<\xc7\xef\xd0\x94\xe8\xb7\xc2\x83\x0f\xaa\x96\xb0\xdc\xde\xc7Uu\xba\xbe\x9eS\xa2\xd9\xca\x88r\x0fQ\xb4v\x90\xa4o\xb5\xf4\x9c-J\xb4\xc3\xa2D'\xd9\x7f\xcdk\xe6M\x8b\x1cc\x9c?\xaf\xf1\x9eE\xf3\x82\xf3$\x1e\xb3\x04\xce\\^i\xdb\x06E\xb2\xcb\xe2\xce\x87\xc5r\x01f\xd2\xa7Lv\xd5\xf1\xf7\x16\xd4y\xd6d\x9a\x979\xc4i\xfa\xd7p\xb8\xd1_\xcbe\xb3\xb7\xbdgb\xd9Jf\x05\xe6J\xe9Uj\x0e\xf34%\xab\x12\xd1\x9a\xf1\xe7\x16\xe5n\x9b\xc4\x05\x98\xd9n&*eZ\xfbD\xf2\x1fMz\xefL\xed\xd9y\xd3\x92\\\xcd\xcc\xafF\x84\xa6f\x8fFk`7F\x1d\xad\x12M\xd4i\xda\xff\xbbE>\x0b\x13]R\x1c\xb3\x95\xfb\x95J7\x91\xabl6\xe6\xdbg\xff\x95\xa3JtmN;\xad.\xfbM\xe5\xab\x13U\x89F\xf1E\x1c\xa5\x12}\x98/<.\x8f\xad~\xbbJ\xf8\xae$}\x9c/\xfc@y\x9eh\xd9\x9f\xf9\x1d\xfao\xf1\xd7\xe7\xe5\x15\xdc\x0a\xcb\xf6\xd1\x12\xe1\xb9[\xd2\xa7\xbb,\xcf\x13e_\xa66\x87Z\xeds\x89?\x89\xef\xbd\x98\xe7E=Yo.\xb4(\x11\xe3u/\xb3.\xf3\xa6\x16l\xcau\xd1V\xdf1\xb2\xd5\xfa\xe4\x83Y\x02g.ox\xd2\xcb\x7f\xe1J\xc2c\xd9\x00&\xe9K\x1b\xa6Oi,V\"\x06\xbf\xa5~!\xd5\xeb'\xad\xaco\x0f{\x88\x0arL\xc9\xbb\x85\xcbfo{\xcf\xc4\xb2\x95\\\x9e[(\x15\xe6.U\x0eb\xffW\xc9\xa8\x19wnl\xec`\x85\xe5\xcf1\x17\xc0d[\x97J\xbf<\xc5a\xf3D\x92\xa8L\xd3H\xde\xb5$[3\xf3\xab\x11\xa1\xa9\xd9\xa3I7\xe7\xa9\x7f\xd8-\x8cV\x89\xc6\xfb4M\xec\xfe\xdd\"\x9e\x85\xde:\x92))\x8e\xd9\x86\x92\x0a\xe5\xab\xe5\xe6\xe2L.\x1b\xf3\xed\xb3\xff\xcaQ%\x92J\x8a\xc80\xffM\xe5\xaa\x13]\x89\"~\x11MF\xa9D\xd2\xebK\x84\xfc\xfb\xd6\x0b\xc2\xd7\xe8\xfd\xaf\xd7\xf3\x84\x15\xf7\xad\x12\xf2^\xb7\xec\xd0\x95\xe89A\xf9\xa5\x875\xdb+y\xc2\x9a\x7f\xc8\x17\x1e\xe6\x94hib\xc2\x82t\xe3\x1e{=\xe1~\xe9\xa1\xcd\xc4k\x9d\xc8\xd4\xca=\xb9$\xbe\xa1\x9f\xb3\x86g\xbc\xee%\xe9l\x1c\xfd%\x045\x9f\xa7\xd3\xfa\xea\xa8\xfd[\xfe\xe4\x9bY\xfe=l\xa9\x91\xcd\xe5MO\xfa\x07\xf4\xd9\xefH\xa6\xf5L\xd2Gr\x9a\xea\xb3\x92\xd5\x0c\xab\xb5\xe1e\x9f2\xabw\xcf\xf2\x92\x05\xec!*HREk\xb0D\xb9\xc9\xc7d\xb3\xb5\xbdgc\x99J\x96\x91\x80\x14\xa0w\x19\xd9\xd3\x94\xd3!_I(4\xcc\xd7\xcc\xc8\xc65\x09}\x884iH\xe2\xe0\x02\xcc\xa3\x89i\xe9\xb5\xcd\xab}\xe1J\xa4\xe1]K\xb253\xbe\x1a\x91\x9a\x9a=\x9a<\xa2\x0f\x93a\xb3\xf9\xf8J\xeaL\xe4i\x9a\xd8\xfc\xbbE>\x8b\xd5\xc64FO-\xa9>\xad\xa4\x1c\xb3\x1d\xf3\xe76\xb4,\x8d\x0f\xd1Z\xaa\x8ff\xd3\x1e\x8d\xf1\xed\xb3\xff\xca\x8d\x9c$\xcd\xc3Rg\xa2\xd2\x853c\x99r\x99o\x1fs\xc5\xb2\xdf\xc9H_D\x93\xd1*\x91\xf4\xd1\xe3\xeb\xf3\xf2\xef{A\xbd\x11\xff\xe1\xe3\x05ykv}h\xdd\xa1+\xd1\xc7\xe6\x9c6\x97\xed_w\xad\xc9\xbf\xef\xcdW8%*\xef[:\xc7oX\xbb\x0f\xfb\xb8!\xfcH\xb22\xba\x8cW\xee\x14\x0e,\xf6'--\x0f\xf3\xafg\xbc\xeee\xd1\x9dM\xb3\xf7\xaa\xe6\xf3\xea_\xbe\xd3\xc9\xdf\x94\x02I\xdd\x12KDsy\xc3\x93\xfejb\xb1m,cZo&}\x0f\x94$\xcf-\xd6\xbe\xb9\x0d\xa9tBC\xee\x01\x13\xfa\xfc}_Vj+{\x88\x83\x8b+\xd2\x13\xd2\x16wZ\xb3\xd9\xd9\xde\xb3\xb1L%[\xfd\xbdR\xdf\x9c\x16\xfe4\xbb\xd54\xa9\xe3kfd\xe3\x9aD\xaed\x12\xe1[\xc4\x12`\x1e\xedjI\xba\x7f\xe9\xe9\x88J\xe4]K\xb253\xbe\x1aR\x84\xa6f\x8f\x16\xf2o\x97\xac\x98\xcd\xc7WRg\"O\xd3\xc4\xe6\xdf-\xe2Y\xe8\xad#\xf7\xad\x92\xe4C%\x0e\x8f.[\xdfR\x7f\xdajY\xb0\x95\xdf\x9dQ\x94\xc1\x82\xfe\xed\xb3\xff\xcau\xcaaM\xd2\xcd\xdc\xb4\x9b\\,S\xae\xd9|\xec\x15\xcb}'#|\x11M\x1c\x94\xc8m\xces\xbf\xf4\x18\x03e\xbe&\xa7\x90QQn>^\xe9\x8c9=\x15\x13c\xcc6.\x04\xc3\x1e\x98\x8d\x86u\xc6:\x16&\xb6%c\xafY\x93\xaf\xe4\x86S\xcc\x18\x98\xd8\xd3\x9c\x01L2%\xdaA\xbe\xe9\x14\xe2@u\xfaU\xa7\x90\xd1\xb0i\x934z\xc6\xf8\xc5\x1ac\xb6\xf1\xa0!y\x8bS\x08K\xec\xd7\xbb\xc9\xc4\xb6d\xcc5\x1b\x9ak\xffS\xfc\xdbe\x8c\xa792\xa8\x12\xf9\xa7\x1a3\x85\xc9\xa4D\xfd\x83M\xb3}a]\xd6)@\xcc\xd7\x8f\xca\x18\xb3\x8d\x03bjYL_\xfd\x98\xaf\xf7\xb1\x12s\x93\xb8V\xb3q\xc5<\xcd\xbb\xb4A\x92u\xf2z\xe61\x99\x94\xa8P\xfe\x17\x89\xf5\x9b8\x09Pg(cf\x8c\xd9\xbc`\xe0\x18)s\xa3\xaa\xb17\x89[5\x1bW\xd8\xd3\x1chQ\x19\x88\x96aF0\x99\x94(\x90\x98:\x05\x85H\x9d\xa1\x0c\xbf\x17\xe0\xc4\x18\xb3y\xc1\":\x079\xe0\x14u\xfb\xc4\xde$n\xd5l\\\x89\xfd4g\x02\x93I\x89\x00\x003\x15(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\x07J\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\x07J\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\x07J\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\xe7\xff\x07\xfd\xa4@\x82&\x8eJ\xdf\x00\x00\x00\x00IEND\xaeB`\x82", - - "analysis/chan2b.png": "\x89PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\x00\x04Q\x00\x00\x011\x08\x03\x00\x00\x00\x83\x0b\xcdh\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x02\xfdPLTE\x00\x01\x00\x03\x06\x02\x08\x0a\x06\x0e\x10\x0d\x19\x1a\x18!#\x20#$\"$%#%'$&(%'(&()'*+)+-*,-+-.,01/2313425747968:7:;9<>;>@=AB@CEBEGDFHEIKHKLJMOMPROSURUVTVXV,`\xae7]\xad[\\Z8^\xae8`\xaa]^\\:b\xab;b\xacIH=\x88k\x89Z\xcfsS\xdb\xe7\xf4L\xf7\xe9\x99\xd3\xd3\x836\x0d\xcc\xfc>\x7f\xcc\x9c9\xfd;\xa7\xcf\xe9\x9e\xfe\xce\xe9\xd3=\xfd\x1d\xf3\xeb+\x80\x00\x00\x00h\xc6h\xa9\x867\xb4*\x07\x00\x20\xc0\x00E\x01\x00@?@Q\x00\x00\xd0\x0fP\x14\x00\x00\xf4\x03\x14\x05\x00\x00\xfd\x00E\x01\x00@?@Q\x00\x00\xd0\x0fP\x14\x00\x00\xf4\x03\x14\x05xE\xfa\xb5\x02\x80@\x02\x14\x05x\x15Z\xe2\xa7poi\x05\x01\x01\x04(\xca\x08\xe6PD\xabV\x881\xb4E\x1cb/\xe8\x9f=\xdb^\xde\xc4^\x06\x04$\x06)\xca\xb1zW\xaa\xfe\xf0\xee\xfc\xf38\xd1Q\x95o?t\xa9\xc7-\xa9\xc6\xdfv,\x89I\xee\xf3\x16\xe1A\xe1XNd\xec\x01\xadPL\xdd\xfc\xd0)\x8b\x8fM\xb9\x87\xe2\x85\"\xa1\xd7\xb5\xc2\x09G9.\xa2\x1f\x1d\x10\x0a|\xa3\x1eT>\xb9\xc8\x95l]1%dA\xbf{\xae\x1a\x9b\xb9\x8dZ!/AM\xdc\x19\xad\x10\xc2i\x13/b:!4%\xe8\x0bf\xd0%\xee03\x1f\x08X\x8cQ\x94{\xd9\xdf\x89\x89\x9er\xfb\xa9\xa6\x8b\xd97\x10j\xcf=T\xd7t~wa\x8f\"\xa9\xca'q_\xa7\x9b\x9fx\x09\xf0d3WU\x95\xc9m\xad\xaa\xe26\xab\xc6\x1c\xbd\xe8J\x1d\x09\x8d\xb0\xef\x9f\xc3q\xf5\xe8\x16.vJ\xb5\x08MW9\x17R\x85:\x0ep\xe5]\xca\x05r\xbd\x08\x95\x84J\x8a\xf6\xe6\x94\xcc\xf8\x906\xf7\\\x152\x83v\x8b\x09\xba2&\xb5\xd7\x06\x11p\xd6|B=\x90\xe2\x20\xefp\x94\xf2\xc5\x0e\xc7\xbc\x83\xc2\xa7\x92\xb1\xdbYA\xdfq\xc7Y\xd9@\xe0b\x88\xa2\xb4\xe4\xbb\x14\xa5\xdc\xde\"\xfcRg\x0b#\x96o\xf2\xf1ou\x9b\xfd\xbc\"\xa9\xc6c\xbe\x14\xf5u\xaa/g\xb1u*\x0a\xea\xe0\x96\xc6#\xd4\xc4u\xb8\xe5K\xf5b\xa4\xa9\xcb6n;\xeaw\x85jMh\xde\x18\xbf\xd6\x99RT&\xd3\x1a\xe9:'Z\x9d\xca\x0c\x90Q\x04\xf88\xd2+6!\xd4\xc0_E\xc8\\\x8c?\xae\x0f\xbe\xc5\x08\xf2yC\x01\x81\x82\x11\x8ar,\xfb\x98]T\x94\x96\xec\xef\xf1\x1b\xfe\x95.\xcc'9G\x8b\x14I5\xee\xf2\xbe\x0d\xd5i\xban8\xbf\xf17\xdc\x06\x10\x14\xe1\xef8\x13kC\xee\xe1\xb7-\xdc\x8f\xf8\xcd\xe7\x03\xa5\x83\xfbf\xc2S\x86\xa2H\xf5*\xb8\xcei\x9e\xe9\xc8\xc4OuU\xca\xae\x0c\xd5qu\xce\xd4J-E\xd1\x0c`\xd0}\xd7\xa9(w\xbb\xf1\xc7\x8e\xa9\xf1\x8c\x20\x9f7\x14\x10(\x18\xa1(]OQ\x9e\xa8(\xa7\xec=\xae\xdf\xe6\x96;\xe4\xed\xe4\x01E\x92Io\xacxB\xbf\x0b\xa1\x9d|T%\xbao\xe2\x97\xe3\xa4\xa9lW\x82y\xc3\x03\x12s75\xd6\x14\x97\xfc\xc0\xbd\xa8\xfc\x8d\xcf\x8b\x08\x9d\xb5\x8a\x1c\xa3\xc7\xe7O\x1f\x17\xb6`\x06BE\xcey\x96p!s\xa6x\xbc\xb4n\xe9R\x16\xcb\x0c\x0f\x9d\x93\x89\x14\xc5\xe8\xca:\xb8\xa6\xf0|\x97\xa2\xb8b\xe9z\xdbB8.h/^\xda\x13&\xe6\xaeR\xe4R\x95]\x1a\xcbq\xeb\xaf/\x9d\x112\x1f\x9f\xfe\xf5L\xfc\x98,\xa5+\xa3\xd8>\xab\xa8\x9e\xab/\x99\x95\x89\xce8\xa7;V\xe3\xec\x81\x8aDs\xc2\xae\xe78yy\x83\xcd\x14\x9bl\x1bP\x04<1\xf3x\x0b\"\xb7\xcd\xf78=\xd6\x96\x93\x13k\xaeV\xaeDT\x14'\xebC\x18\xc2|\x0c\x14\x05Pb\x84\xa2\x088\x15\xe5PQ}\xa1}\xefI\xf9\xab\xd9\xbf\xb7\x8a\x91t\xe7\xa6\xa3\x92/p8~F\xe8\x81\xc3T\x80\x06\xaen\x8bF\xa8\xb9\xd2\xc4\xc7\x15\xfc\xd9\xf2\x19\x8e\xa85\xaf\xfe\xaa\xa6\x80/v/)IC|\xd0\x07%\xdb'\x87\xf7\xe3S\xff\xf8\x03\xe5\xf60\xae\x07u\x9c\xac\x9a5\xb7\xaa\xaaJ8\xd1\xe9\x0aR\x9c\x19\xc9\xc5\x82\xd7\x97\xac\x0f\xfe=\xa2\x8b\xd1\x95\x09\x8a\xb2}\x81SQ\xa4X\xaa^\x84\xceWU\x05o\"u}_\xb5\x9f\xdbTU\xd5\xa2\xcc\x95+\xeb\xca\xdf;c\xd6\xc4\xe9\xab\x96r\xf8\xe2\xc9E\xee\x18Y\xac\xa8L\xa6e)\xf7\x06\xf7[n\xf1\x1d\xd4y\xc5\x91\x90\xe4p8n\xe3\xec\x8c\xa8\xacs\xa5q+\x85\x13\x9b\x9f\xe6\xa5\x9f\xa8)\x8b\xe5_(\x03\x1a\x1c\x8e\x98\x02\x9c\xa07_\xefrk\xe9\xbe\x18s\xd9\x06\xf7\xedG+\xcaI\x0f\xf1\xe8\xb9w\xecw\x93\xdcGg@\x80c\xac\xa2\xe4\xdb\xf3.\xdd\xaa\xdf\x9b/\xcd\xc1\x9e\xccmc$=\x91\xcfz\xa2\xf1\xf1P\x10M\x92\x16\xe1\x076=NHu\xdb\x92\x85\xa1yo\xf5c\xf7r.i(\xe2r\xc9\xa7\xfd\xc2Hb2^{\xe6$2Vr\x9dP4q\x87X\xc5\x0esG\x84\xd7#\xf8\x82\x06U\x8c\xaaLP\x94{\xaf\xdf#\x8aB\xc5\xba\x9d\xa8\x848\xb5Cy\xd6\xe3\xcc\xa5*\x13\x8aqo\xb6\x89'\x85\xa8\x84\xbb\xe1\x8ad\x9f\xf5\x1c\x1e\xc7\x8ds^h\x91Nj\xce\xf2\x15\x08\xeb\x800\x0a)\x8d{!$K-}\x8a\x00\x8c\xa8(\xf4\xe6\xab\xe6\x1b\x85P\xbe\x19\xb9C+\xca-\xce}\x0c\xf9\x960t\x1a\xc4i\x1c\x10\x10\x18\xab(E\xf6v\xe1\xb5#\xf7[g\xf6\xa9l\xe9^\x06*\xc9\x80\xad(\xe9\xae\xe4\x05\xfe&\xbb\x9cK\x1a\x16\xcf\xec\xc1L\x13\xcem\xeeL\x9d\xb1\xc2\xfe}\xbf(j\xae\x83\xb5g,s\x8c\x12\xff[\xf2\xf6\x86\xb2\x18U\x99\xa0(h\xc1V\xa2(T\xec`\x14\x85\xaaL(\x16,m\x84BNJ\xb2\x14\xa5m\xd5\xf8i\xdc\xd4\xe0\x8f\xc8\xe4\xac$\x18i\xef\xf6\xbe\x10\xb0e\x20\xf4\xd0\xba,\xab\xecf_/R\x04`$E\x916_\x8eEx\xb9\xcd\x9fF\xee(\x15e\xbf\xdb\xd2\xa6\xc3\xd9\xb3\xc3`\x8c\x02(0VQ\x8e\x15\x8ao\x87\xc8[\xcfQ\xbbk,O%\x99\xb0\x15EJ\x16\xf3\xdd\xecr.i\x98\xe3\x9c\x8d\xc0\xb7w\xb6e\xbf3\x9b\x9b\"^Q\x96\x0eV\xe7F\xf9\x96;\xe9\xb1\x1cUq\xdf\"\x00\xa00VQ.\xee&\xe7\x1a\xe5\xe4\xc0zZ\x94\xd7\xe2\\L%\xd9\xb8)\xca\x1e7E\xa9\xe1U\xee\xc8pI\xc3\xd2\x99\x17\x09\xc2O\xfay|Q\xb6m\x7f\x08\x99o%\x07\xab\xbdI\xba\xd6\x93\xcf\xb5\xd2\xc5\xe2g\x92\xb7\x19\xf1\x8abTeXQ:B\xcb\xc9\x18E\x8e\xa5\xea\xc5xU\x14\xaa2\xa1\xd8\xdb\xd2\xe2\x8e`\xe9\xf66Ee.z\xc8\xb5\x1eq\xa4E\x04\xa3\xe2!\x1e\xa3\\#\x08\x02\xd1\x90#h\xc9\x93\xca\x98RE\x00\xc6SQ\x1eF%?lLH\xf4\xbc\xacL+\xca\xa7\xe3\xdb=\x96\xc3\xb5\x1e\xc0\x1dc\x15\xa5\x8d\\=n'w\x9e\xb4\xee?\x20|E\xfb\xbb\x94I\x15dE1\xe7\x20\xd4\xf7\x077E\xe9\xb4&\xe1\xe1}V\x96{9\xd77\xfe\x08G\xaeP\xffQ\xf8I\xdf$\xcetD\xae\x20\xaf\x91\x08\xdd\xc3\xcb\xda&\xbe-\x1c\x9d\xfd\x913\x14\xc5J\xc8H\x7f?W\xa2(FU\x86\x15\x05\xc5/\xc6\x8aB\xc5R\xf5b\xbc*\x0aU\x99r4\xb2x\xa6\xeb\x8e\x15Ee2w&\xddq\xa6\x92\x92\x10z\xc4Wce%Wkr\x0e\x0a\xdb\x85\xbf@\x16\xedP\x04`<\x15\xe5\x1a\xbf\x84\xe7\xd7\xb9.\x945}!\xcd\xe0P\x8a\xd2?{\x01\xf2\x04\x14\x05p\xc3\x08E\xe9ji\xc9=\xdaB\xc6\x00\xe7\xed\xe7o\xd5\xe5\xe1\xbbc\x9b\xec\xfb\x9bZZZN\xe6+\x92l\xc4k=W\xc9ohb\xdc\xc1\x82D\xdeT\xd1\xfc\xb3\xc3\xb4\xed\xea\xc0\xcdm&|\x0d\xa86f\xf9\xd7\x17\xb2\xf82\xb7\x82\x173\xb9\xad\xe2}sk\xb9\xc5\xf9\x87\xe2\xb9<,\x0d\x136\x96\x14\xc6\x8b\x97R6\x06o)|3\x14\x1f\x99\x87C#r\x0f\xcd\x1f+\x8c\xec\xef8o\xb5\xc5\x83\x82\xa5Ak\x8b\xd6\x06-E\xcabRe]\xe5\xdc\x81\x0et4\x84\\\xeb\x91c\xa9z{NUU\x05\xc7W\x1dos]\xeb9\x85u\x82\xca\x95+\x132\xf1U\x1d\xd7X\xe4\xc7\xa0-\xce\x94\xdcH\x15\x0a\xa2\x8bO\x7fb\xc6C\x90\x9cyi'Ng\xe0\x99\xd9\x02\xde\xbc\xef\xac\x90\xacU\x04\xf4^u8b\xb69.?C\xf4\xe6\xbb\x16Ss\xce\xf1\xc05DY\xc8\xb9\xb4\xe3f)_\xdc\xe0Lo\xe5Xw\xee\x9eg\x9d\x0a\x01\x81\x8c\x11\x8ar>\x1bC&e\xd1\x8dC\xb9\x07\xce\xe3\xb1\xfa\xe1l\x91\"E\x92I\xb7E\xfc\x7f\x09\xb9\xfcy7)\xc6\xb2a\x0f\xcf\xef\xdc\x89\xb3\xfeb\x16^w\x0a\xd9\xb7Sm\x96D\xf7\xa9\xc5\x8e\x09\x1c\xc79\xefz?\x12\x196i.\x1ef\xe4\xcd\xfdt\xfa\xb8)\x91\xe2\xb5\xd9\xae\x0f\xc2B\xe6\x8aS\x01\xf8\x7f=\x0b\xf1=c\xf1\xce\x99\x0d|\xa7j\x7f\xe6\x9c\xd09\x99\xfd\xee\xc5\\\x95\x1d\x13\xc2\xf2Q\x7f\xc4\x94~E,U\xefwAbe\xd9\xa8k\x12I\x8c\xadW\xe4R\x95]\x123\xa5\xa1\xc0\xfa\xd7\x9dG+\xd5H6\xddY\x8bb\x92\xc4C\xbff]\xace\x0d\x1e\x9dT\xac)\xb0\x99\xacI\xb5\xca\x80\x9f\xa2\xc4\x89\x962Do\xbe+\xe4/<\xa65\xe2DJ\xee\xe4l\xb1\xda\xe7x\xa9\xf9\x19I\x1f\x0f\xf9\xc8}\xad\x98{c\xdf\xb9tO\xeb\xee_\x20\x900BQ\x80\x97c\xd5x\xd5Q\x9b\xae<2\xefx\xf4\xe2\xc5\x93\x9f>[\xa4\xfa\xc7\xa9\xfd\xe3\xe3{\x10\x8b\xc2\xd9\x1c<\xcd\x00\xa0\x00E\x19\xc1l\x9dvO+D\x0fN\x8b7\xad\xa0\xbe\xd8\x0b*\x11mS\xd9\x7f=\xc6\xdc\xbb\xe4}R\x1d\x08,@Q\x80kQ\xe2\xe9Ns\x94\xca]=\x00\xe03\xa0(@_\x86yGum\xf5\x0es\xc6\x80V(\x00h\x00\x8a\x02\xa0\x813\x1b\xac&k\xf2Y\x10\x14\xe0\x95\x01E\x01\x00@?@Q\x00\x00\xd0\x0fP\x14\x00\x00\xf4\x03\x14\x05\x00\x00\xfd\x00E\x01\x00@?@Q\x00\x00\xd0\x0fP\x14\x00\x00\xf4\x03\x14\x05\x00\x00\xfd\x00E\x19\x1d\x9cI|\xa4\xf8\xac\xea\x1b\x0a\x00\xc3\x8aA\x8a\xe2\xdd\xa5\xb4\xe5\xc8^{\xfeI\xc6#\xc2\x0c\xa0i\x1c7\xdb#\x93r\x13\x1d\x0c\xbeZ\xa9*\x0c@}\xe2\x20_\xe0vC\xab\x9ao(\x00\x0c+\xc6(\x8aw\x97\xd2{\xd9%\xf5w\xea\x0f\xec}\xea\xbd\x92!\xe2T|\xb0G\x1e\xe5&:\x18d+U\xef\xbe\xa1J\x03P6\x8a\x1aJ\xa3*\xb0\xcez(\xdfP!\x97\xff\xe4\x19\x1a\x10\x1f\x05\xedR\x14\x1f\x8cE\xcf\xf1\x7f\xf5\xa8\x17\xe3\xe9\x1b\x0a\x00\xc3\x8d\xb1\x8a\xe2\xc5\xa5\x14\xf5\xe4\x97{\x96\x1bR\xda8;~[\x8f\x15Ea\x16*)\x8a\x9a\x85\xa8\xcc\xe3\xd2\xe4w-\xfc\x87$\xcdR\x14\xca7T\xc8\x8d~(\x15t)\x8a\x0f\xc6\xa2\xa7\xf9\xfb\xae\xa4\x9b\xa2\xb8\xfb\x86\x02\xc0pc\xac\xa2\xb0]J\xbb\xc4\x09\x94Kv\x83'R\xces\xe4\x94k#V\x14\x85Y\xa8\xa4(j\x16\xa2\x12\x0dq\xb6\x9c\xd3\x8eu\xea\x8aB\xfb\x86\xa2\x95\xae\x19\x10$+\x8a\x0f\xc6\xa2We\x1f.\x85\xa20}C\x01`X1VQ\x98.\xa5\xfdyG\xc9\xc2\xef\x8dV\x94V\x8e8\x95\x92\x99Y\x85Y\xa8\xa4(j\x16\xa2\x12\x09\x89xJ5\x95\xad(n\xbe\xa1J=\x90\xc7(\x9a\xc6\xa2\xcf\xa3\x0b<\xea\xc50}C\x01`X1VQ\xd8.\xa5{\x89}\xb9\xf1g=(bz\x9b\x20\x1f\xafcEQ\x98\x85J\x8a\xa2j!\xea\xc2\x86\x8f\xf0\xbe\x95\x1e\x8a\xc2\xf2\x0de+\x8a/\xc6\xa2\xa9\xef\xb9n\xc4\xa5s\xd9\xbe\xa1\x000\xac\x18\xa1(Z.\xa5?f\x97\xd7\xdf\xa9\xcf7\xfe\x9e\xd9\xba\xd0\xe9\x9f\xae\x0f\x0b\x1a\x9b[O\xdb\x98Rn\xa2\xaa\x16\xa2.\x0a\xf8\xd4\xd2\x82\x95|\xecWW\x15V\xaa,\xdf\xd0\x17?\x90+5\xf7\xc5\x82\xb2\x01\xa8\x96\xb1\xa8\xc0\xed\xa8?\xbb\xd6G\xe5\xb2}C\x01`X1BQ\xb4\\JQ\xcb7\xf9\xf6\xc2S\xc3ps\xc5\xf5\x85a3>\xca\x1d\xcb\xad@\xb2Y(\xed&\xaan!\xea\xa4\xaf8!:.\xad\xe2=S\x92\xc2J\x95\xe5\x1b\xda(\x1a\x84&\x93L\xda\x00T\xc3X\x14\xb3/\xe6\x0ar\xcfU\xf1\x0d\x05\x80a\xc5\x08E\x01^\x95\x81,S\xb5[\x96\xaao(\x00\x0c'\xa0(\xa3\x82\x81b\xdb/\x8a\x0co\xbe\xa1\x000|\x80\xa2\x00\x00\xa0\x1f\xa0(\x00\x00\xe8\x07(\x0a\x00\x00\xfa\x01\x8a\x02\x00\x80~\x80\xa2\x00\x00\xa0\x1f\xa0(\x00\x00\xe8\x07(\x0a\x00\x00\xfa\x01\x8a\x02\x00\x80~\x80\xa2\x00\x00\xa0\x1f\xa0(\x00\x00\xe8\x07(\x0a\x00\x00\xfa\x01\x8a2\x829\x14\xd1\xaa\x15b\x0c\xe0\x89\x0a\xf8\x8aA\x8a\xe2\xdd\xa5T\xa0\xce\xfeR\x169CK.~\x80A\xd8\xfc\xa1|\x0c\xc9\xd7|T\xa5\xda\xb2\xcd\xdcF\xc5\xe7\x15\\P\xbeJ\xa8\x07\xda\xb1\xf1B\xdfB\xaf{\x8fA\xefd\x8a\xef\xe0\x89\x0a\xf8\x881\x8a\xe2\xdd\xa5\x14ao\xc1\x93y^\xca\x1b\xccQ\xa7\x86\xb4\xe5r_\x1c\xcd\x8d\xe0\x8ey\x0f\x7f\x15\x9e\\N,@l2\x83v+3Z\xaa\xc6mb\x87z\xa2\x1d{\xab\xaa*S\xcb\x9e\xe3;n\xad3\x05\x9e\xa8\x80o\x18\xa2(\x1a.\xa5\x02E\xe5wF\x90\xa2\xfcn\xb13Q\xc7\x1dA\xa8\x7f\xee,\xaf\xd1\xafH\x8a\x8a\xa2\xdc\x18\xbf\x16\xb9\x13\xec\xb3\xa2\xf8\x14\xfb\xad\x86\xa2\x1c\x9f&)\x0ax\xa2\x02\xbea\x84\xa2h\xba\x94\xa2\xba\xddO[F\x90\xa2HO\x94%\x8a\x822\xb9\xc1{\x20\xfb\x8e\x9a\xa2\xc4O\xf5\\\xab\x0f*!\xe1C\xac\x86\xa2\xbc\xc3-\x0e\x95\x14\x05\x8bS\x0aG\xd3\x12N\xac\x0buM\x9f\xdf\x85\xbdG\xf0\xa9b\xf0\x94VA\x14&\x0b\xa9\xa7\xf9x\xb4\xf4[bM\x16I\x0c\xc6Z\xb6\x09k\xc7\xb7S\xa6\x7f\\X\x159G\x99K#\xce\xccVq\x17\xe9\xbe)\xba98E\x01OT\xc0\x17\x8cU\x14\xb6Ki+\xa6.\xb7\xb5\xd5\xe8AJS\xd0\x82\xa6K\xb3\"\xf0j\xe3g\x92\x9c\x19\xf2\x18\xc5\xde\xe4\x9a\x99\x9d\x88\x8fX\xd9\xb0\xb4?\xe4S\x1cT\xa7\xae(l\xac5\xa8!ZT\x14\xda\xdc4%\xae\xf9\xbe\xa5\x18\xa7\x14\x8e\xa6\x1d\xc1\xce\xdb\xdb\xca)\xa3/\xa2\x12D;fG`\xbf\xb4\xb7\xe7(si\x82W\xe1W;\x1e\xa3\xcc$\x19\xb8o\x8an\x0eNQ\xc0\x13\x15\xf0\x05c\x15\x85\xedRJ\x18\x8ey\x94\x8b\xdc\x14\x8e\x8b$\xb2VB\xc6\xf4\xfb\xb9\x12\xfc!2\x12\xa1{\xd8\xa0TT\x94)\xab.}J\x1b\x96.\x0e\xc37\xc7/e\xcc\xa3|q\xc3=\x8b\x82R\x14\xda\xdc\x14_=\xbe`\xc2\x13\xb3\x0aGS\xe14K\x14\xd8\x8e)\x91x\xda\xe9\x03,\x10\xb2vL\xc7\x13\xb1\xfds\xbc)\xca4<\xfd2;R\xd17E7iEi\xda\xc4\xbc3XV\x14\xf0D\x05|\xc2\x08E\xd1r)\x15\xe8o\xa9\xcbmi\xf3Z\xcb\x10p1\xb8\xbc\xa4\xaaEO[\xf7\x8027}r9q\xdb\xd5\xde\xcedk\xed#\xda\xb0T\xe0\xc7\xa0-b\xc1\xa3\xaf\xbf\x91Y\xf2\x01g\xc7\xf7\xc1\xc6\x9fB\x17\xe3\xc7U\xb5\xa0M\xdc;\x99\x9f\x87sa\x9bO\xd1\xb94\xc1\xdc\xfcS\xdfDL\xc2\x1aG\xf5MN\xde\xc1\xf7\xccnu\x19\xaf.\xe4&xl\xfe{UU\x13\x16;\xedZ\xc1\x13\x15\xf0\x0d#\x14E\xd3\xa5\x14\xdf\xfa&\xb0\xd7[%C\xc1\xc9\xf1xfd\xdc\\<\x91\xd2\x9f9'tN\xa6x\xf4t}\x10\x162\xf7[\x84\xf2\x85\xa5\x9b\x05]\x99\x15\x86\x7f\xd3]\x86\xa5\xc2\xf0*~z\xc8\x9b\xe7=\x15%wr\xb6{\x96D\xdf\x12\x9e\xaf\xb4\xf0\xe6jD\x19\x96b\xd6\xbf\xee\x9c\xb8\xb8\xfe\xce\xb4\x89\x11\x85\xf8\xce\x13\xa1\xb1u\xa1\xc2\xeb\x0a\xd4\xbfuV\xf0\xe4\xc5\xb93\xc7G\xd2\xb94\xb3?}g\xe2\xd4\xa5\xe2y\xa5\xdc79\x19\xef\x9c\x18\x12\xef\x0f\xb6O\xe0\\\xd3\xe5\x12\xeb\xc9\xf2\xb1\xe4\x96\x16\xf0D\x05|\xc3\x08E\x19\xa9\xb4NX\xd1\xda\xd3\xd3\xf6\xdd\xdba/3:\xea\x18\xec<\xca\xa0Y5\xde\xe7?\x06\xbe:\x85\x9c\xb7\x8d\x00\x9e\xa8\x80\x8f\x04\xb2\xa2\x14N\x12\x87$\xfda%\x1a\x91,\x86^Q\xd0\xd6i\xca;Z\x86\x8e\xfe\xdcI\xca\x11\x8e\x12\xf0D\x05|%\x90\x15\xe5bP\x1dy\xaf\x0b\x92\xef\xf8\xf0\x1d\x03\x14\xc58Z\xc2V\xc1=\xf6\x80\x1e\x04\xb2\xa2\xf4\xc7\x87\xac\xd8\x7fl\xff\x8a\x90\x97\xf9\x0f\xdc\xf5\xc3\xdc\xaaSF_\xee\x06\x80\x91N\x20+\x0aBE\xf3\xa7\x8e\x9f:\xff\xa5\x9e\xf54W\x9a\xb4\x04\x00@\"\xb0\x15\x05\x00\x00}\x01E\x01\x00@?@Q\x00\x00\xd0\x0fP\x14\x00\x00\xf4\x03\x14\x05\x00\x00\xfd\x00E\x01\x00@?@Q\x00\x00\xd0\x0fP\x14\x00\x00\xf4\x03\x14e\xd4\x01\xde\xa5\xc0\x08\xc6\x20E\xf1\xeaR\xda\xb5\x9b<\xd7\x20w$\xfe\xbb\xb5n~\xe8\x94\xc5\xc7\xa6\xdc\xf3\xcd\xd4S/\xc0\xbb\x14\x18\xad\x18\xa3(\xde]J\xdb\xb2\xbfo\x11\x18!\xbf\xbc\x0a\x8e\x84F\xd8\xf7\xcf\xe1\xb8z\x9fL=u\x03\xbcK\x81\xd1\x8a!\x8a\xa2\xe1R\xda\x96\xadxf\xfc\x08\xa2m\xe2[]\xc2hj&G\x86X\xda\x8fe\xd5\x0f\xf0.\x05F'F(\x8a\x96K\xe9\xc8U\x94\xb5!\xe4\x01%[\xb8\x1f\xf1\x9b\xd6\xa1\xa6'\xe0]\x0a\x8cN\x8cP\x14-\x97\xd2\xe1S\x94\xe3\xf3\xa7\x8f\x0b[0\x03\xd1\xae\x9f\x1b9\x8e\xdb\x8b\xf6\x0a\xaf\xeb\xd1L\xf1xi\xddB\x1e\x1e\"\x1fj\xb2\xd5\xa7\\\x03mc\xaa\x00\xbcK\x81\x00\xc2\x08EA\x1a.\xa5m\xd9\xe5\x07\xb2\xf7\x1e7\xfe\xab\xf9\x1d\x17\x7f\xa0\xdc\x1e\xc6\xf5\xd0\xae\x9f\xad\x8b#\x8e\xb7\xa3\xf6\x93s\x17\xdf\xeb\x0a\xdaJ\x87K\x87\x9al\xf5I\xd5@\xd9\x98*\x01\xefR\x20\x800VQ\xd8.\xa5m\xd987\x7f\xbf\xe1\x92\x929\x197$\x13?\x1c\x92r\xfd\xdc=\x9b,\xfcm\x1ej\"v\x83\x12\xaeC\x8d\xb2\xfa\xa4j\xa0lL\x95\x80w)\x10@\x18\xab(L\x97R\xd4_\x87\xb5\xa4k\xb7\xd6\x17Yw\xeeL\x9d\xb1\xc2\xfe}?\xd17\xd9\xf5\xf3RPW\xc7\xee\xb6\x9e\xe0K\xa8g,s\x8cBY}R5\xc86\xa6l\xc0\xbb\x14\x08\x04\x8cU\x14\xa6K\xa9\x8b\xe3\x85\xc8h\xda\xb2\xdf\x99\xcdM\xd9\x8c\x14\xae\x9f]c/m\xe5\xfe\xa9>H\x909\xe7\xe1Li\xeey\xfd\xd0\xa5\x9bT{U\x9ch\xbf\xe3\x8e\xb3\xb2\x0dR\x14\x0d\x97R*\xd7h~\xb7X+B\x83hJQV\xa7\xb2\x92\x14\xec\\\x8d\x80N>}\x9b0,\xe0;=\x17\x89lX7\x20\x1c\xe4\xdb^MQ\xee\x9ar\xc8{3_#\xbc\xd6\xf2\xcd^\xa3QA\xb4\xf8\xde\xe0MQ\x10Z\xb6\x03\xbf\xde\xf6QQd\x07\xd6\xc7|)\xeaS\xed\xb0\x1b,\xe3V&\xa4o}k\x12\xb4\xe2\x06\xcb\xfb\x15\xe4\xad\xecC\x8f%\xd2(Ks\xcf\xeb@k\xa4x\xea\xa7G7\xe9\xf6\xb2\x9dhU\x9fFl\x84\xa2h\xb9\x94R\xb9F\x13\xfe\x8eV\x84\x06\xb4\xa2\xacLe%)\xd8\xb9\x1a\x01\x9d|\xad\xf9\xb97EYF\xb4\xa0\x91?\xad\x16\xe0\x0b\x19V\xd1\xb4p(\x14\xa5\xb7\xd4\xdb\x80GFv`\xbd\xcb\x0f\xe2t\x81e\xdc\xcaD\xec[)\xff\\+p\x90|\xb6\x87\xbc\xe5|\xa6\x1e\xa2\xb9\xe7u\xa0\x8e\xab#\xefzt\x93n/\xdb\x89vX\x15E\xcb\xa5\x94\xca5\x94\"\xe7\x13\x10\xc3\xf1\x07\xdan\x94\xc6\x9b\xc7\xa8@t\xce\xae\x04\xf3\x86\x07\x08\x9dq\xce\x19\xacV$w\xf2\xa6\xd2\x0c\xeb\xa2\x94\xbb\x8a\\\x85\xf3\xe8\xe5\x0d6Sl\xb2m@\x19\x20\xd3\xc9\xdf_y\xc2\xa9(R\xb1}B\\%\x12\x1f\x1b\x99f\xc5\x87\xff\xc09E@\xa3\x89\xe7\xf7\xdcM_\x16\x93\xfc\xa2\x9aw\xcd\x8dT\xb3\x03\x84r\xbd\x16q\x88B+\x8al\x9a*\xf4\xa2\xcc\xd9M\xe1\\'\xcdjI\xdd\xe6\xae(\xeczEE!5DU:\xa7_\x14\x95\xa1\xbb\xa9\xb1\xa6\xb8d\x92v9\xb0\xf6\xc6\x8a\xdba\xd7\xe0\x8a]\x1a\xcbq\xeb\xaf/\x9d\x112\xbf\x876\x9a\xa5\x10\xfb\x96f\xc5i\xd6\x0e\xa0v\x96\x10\xf0\xf5j\xf3\xca\xd2\x01\xb7\x15K\xb1t\x0d\xc4k\x09\xa1\xd4\x1cE\xe7\x9f\x98y\xdcz\xa4\xb6\xe7\x95;\x80\x01\xd5!D[\xe0v|<{\xc2\xdcS\xd3\x94\xd3\x18\xdbg\x15\xd5s\xf5%\xb32U\xbb\xd9\x99\xb3\xdc\x9ct\xd5v\x81\xde\xa8\xbe}\x11\x99N\xb4\xc7\x86SQ\x90\x86K\xa9G\xaeAt\x9c\xac\x9a5\xb7\xaa\xaa\x0a\x9fm\xd1v\xa3\x0a\xbcz\x8c\x0a\x8a\xc2'T\x9eY\"\xfc:u^q$$9\x1c\x8e\xdb\x8ads\xa5\x89\xb7\x15\x14\xd8\xcc\xcdt.\xed<\xfa\xd3\xbc\xf4\x135e\xb1\xfc\x0be\x80\x8c\xa0(\xa5\xc9NE\x91\x8a=JK\xbc\xdc)\x94X\x93\xf6\x0bzh\x8bJ.\xf8\xa1\x17)\xea\xed\xae\xae\xb4%Xl\xbb\xd2\xe6=\xec\xbcl\xd9\xf7\x08=\xdag\x11J0\x03\x84r7y\x87\xb8\xb6f\xfe\\ww\xf7\x05\xac(\xb2i*\xeeE\\\xc1\x9f-\xf8G\xf8\xae%\xa1\xe2\xcc\x06\xde]Q\xd8\xf5.\xcb\xe8\xee.ND\xce\x09'q\xfa\x85\xae\x0c\xd5\x9aW\x7fUS@f6e\x07\xd6\x9b\x8eJ\xbe\xc0\xe1\xf8yp\xc5\xba\xf2\xf7\xce\x985q\xfa\xaa\xa5\\\x13e4\x8b(\x84\xbe=\xbf\x9d\xc3\x17(\xdaK\xed\x00jg!\x94\x1e\xbd\xe7\xdc\x9e\xe8t\xe5\x8a\xe5X\xba\x86\xb2\xd5\xe8\xaa\xed*ZY\xa6\xec|\x83\xc3\x11C\xd6\xc5\xde\xf3\xca\x1d\xc0\x80\xea\x10m\x81\xdb63ls\xc9\x0a\x8e\xcbD4-K\xb97\xb8\xdfr\x8b\xef\xa8u\xf3\xc9\xbb\x8b\x8a/\xec\xe4\xf9\xaf\xe9\x8d\xea\xdb\x17\xd1\xd3\x89\xb6\xe7\xde\xb1\xdfMR\x19\x19\x1a\xab(l\x97R\x8f\\\xe3\x90\xcez(\xbbQ%\xde=FQt\xdc\xdf\x84\xdd\x12G\xd2\xcc\xb3\x9e\xe8e\xc2\x90\xff\x89-Q\x91K9\x8f\x96\xc6\xe1\xafg\xa9\xa5\xcf\xad\x06\x09AQ~\x89\xf9\x85(\x0aU\xac\x82\xfc\xc2\x88\xa7\xf0\x8f\x0b\xfe`\xe2-\xd5\xc8\xcd\xd1t%\xff\xc934\x80O82\xf0\x8fhZ\x86z\x00:\xc7\xffU\\[\xb3\xf3\xf7\xa9Yi\x9a\x1am\x11~\xa2\xd3q7\xd7\xbc'\xfc\xa0\xf5}\xe8\xa6(*\xf5.\xc3U\x91\x1fK\xf1\xf4P}\x11\x99N\xb4U\x9e\xbe+\"\xc6*\x0a\xdb\xa5T\x91k,DQ\xecM\x0a\xbb\xd1A\xe1\xa1(\x15\x0f\x95\xc9\xe8,\xfc\xb9\x8c\x7fF\xe7R\xce\xa3\x0d9\xc2.|R\x19S\xeaV\x83\x04V\x94\xe7\xe6\x1aq\x8c\"\x1b\x96&T\xae[\x93p\x1a\x9f\xfbX\xc9\x1aP\xce{n\x8e\xa6\xd4\xb7\"+\x05}F\xa2\xd4\x02\x9e\xbb\xaeYQ\x8aB\x9b\xa6J\xdd\xfc\x1bO\x1a\x9a\xee\xa6(*\xf5J3\xb3\xce\x1a\xf6\xb8IC\x0dO\xdd\xa7!9\xb0z(\x8a\xaf\xc5\xc2\xdfv\xa5d\xa3Y\x0a\xb1o\x16\xfcc\xad\xb2\x03\xe4\x9d\x95\xf1.\x99}]\xee\x03\xcf]\x00\x00\x20\x00IDAT\x86\x87'\xf2\x8a\xa9X\xc5\xbe\xf8\xca\x8a\xac\xc5\xef\x91\x95(\x8eE\xa5\xa2\xb8\xedy\xf6\x0f\x88\x02\xa9C\xb2\x05n\x7f\xc8\xa78\xa3\xce\xfd\xac\xa7\x87\\\xeb\xc1clf7\xfb\xcc\xa4)\x7f\x91\x15\x85lT\x9f\xbe\x88L'\xdaa\xbd\xd6\x834\\J\xe9\\\x83\x89\x8cD\xe8\x1e\xb6\x17\xa5\xecF\x95x\xf7\x18U(JR\x12B\x8f\xc4\xdbB\xe4d\xf4\x12A\x0a:\xdfMR\xe4R\xce\xa3\x05\xe2\xcd\x1aI;\xdcj\x90V\x8c\x15\x05\xa5\xa7aE\xa1\x0dK\xd3\xb2L\x17\xf8\x9dx\xc7\xc7Z\xf1\xd7\xb3\x0f\x7f\x09\x14\x8e\xa6\xd4\xf7\xf5\x87\x98\x9fc~\xc0\x09\xb5\x00\x94\xfa\x9ex\xef\x04\xa5(\xb4i\xaa\xdc\xcdD\x9b\xb0\xb6\xdb1n\x8a\xa2R/\xa5(f\xe1\x84\xa2\xef\x0fn\xd2\xd0iM\xc2\xa3\xec,Q\x13]\x0e\xac\xb4\xa2\x0c\xaa\x98<\xe2\x94\x8df)\xc4\xbe\xc5e5\x16\xa8\xed\x00yg\x9d#3\x1d\x95\xf8T\x92Z1\x15K\xf789\xf13\xf4Y\xe2\x06\xb2\x12\xb6\xa2\xb0\xf6\xbc2\x96i\x08+u\x88\xb2\xc0]\x1c\x86o;Y\xea1\x8f\x82\xeeL\x12/C\xb2\xbb\x99\x1a+\xec\xb7\x81t\xa2(\xf2F\xf5\xe5\x8b\xc8v\xa2\x1dVE\xd1r)\xa5r\x8dfc\xf0\x96\xc27C\xef(\xedF\x15x\xf5\x18\xfd\xd9a\xdavu\xe0\xe66\x13\xbe0!|\xe9\x8aO\x7fb&\xc2.'\xa3\xf9\xd5\xd5e\x09\x96\xbf*se\xe7\xd1\x02\xde\xbc\xef\xac\x90\xacU\x06H+\xee\xae\xe1Ot\xa2Z3\xb9\xd6C\x19\x96\x1e4[\xfa\x12\xc876\x96\xb7\xee\xbb\x20\x14\xbbM\x07\xbc\xf8\x81\xcc\xd7\xdf\x17\xdb\xd9g\xdd`\x15\x15C%\x00\xdd\x8e\xfa3~\xa3\xef\x99\x95MS\xe9n6\x9bm\x05{\x16E\x99*\x9a\xd1C|\xcfl\xb1\xc3\xa1\xe8\x10Uo\xf7\xd5\xb8\xe4+\xae\xdbh\x12\xe3\x0e\x16$\xf2B1\xc56\xab\x8dY\xfe\xf5\x85,\xe7-\xff.\x07V\xf1Z\xcf\xd5\xbe\xc1\x15\xeb9E\xae\xdc5\x91<\xcahV\xa6\x91\x1c3\xeb\x92\xb7\xbd\xaf\xb6\x03\xa8\x9d\x95\x16\x95s6'*M\xb9\x8f\xe9Xj_d\xcd;\x88\xbe\x9a'\xe8\x1b\xbdQ{\xaf:\x1c1\xdb\x1c\x97\xc9\xc4+c\xcf\xbb\xed\x00OCXE\x87d\x0b\xdc\x96)\xd33\x0f\xbc\x15\xec\xa9(.\xd8\xdd\xfc\xd9j+=\x91\x12C\x14E\xda\xa8>}\x11\xd9N\xb4\xe7Y\xa7B\x18#\x14E\xd3\xa5T\xce5\x9a\xae\x0f\xc2B\xe6\xe2\x13B\x85\xdd(\x8d7\x8fQ\xb4S8\x055\xfd\xc5,\xbc\xee\x14>ug-\x8aIj\x20\x0b\xe4d\xf4\xae\x0c\x8b5\xfdg\xb7\\\xd9y\xb4bM\x81\xcddM\xaau\x0fp\xad\xb8v\x1e\xbe\x8f\xa4/QT\x04\xd9\xb0\xb4A\x18\xd6\x1e4\xe3\xd8?\x94\xe5,7\xc7\xa5\xdcV\xd4\xdb\x18E\xce\x8f\x93\xc5\xbaPqt\xb13\xa5\x12\x80\xf6\xc5\xe0\xff\x05\xd1\xff\xeb\x91MS\x15\xdd\xbc\x9b\xb2hYN\x85IH\xa6;O\xc2SU\xea%\xff\xeb\xa9t\xd6\x7f7)\xc6\xb2a\x8fP\x83r\x9b\xddN\xb5Y\x12]\xf7\xe6\x89\x0e\xac\xdd\x16R\x83\xe9\xf6\xe0\x8a]\x0a\"3\x0d\xa2\xfe\xd3F\xb3.\xf0}9_\x09\x0dL\x88=\x8bTv\x00\xb5\xb3\xfaJ?4\x7fX\xda\xa7\xdc\xc7\x8a\x9d%\xef\x8bs\xe6FAi\xcf(7\xeaObZ\x94=\xc6\x9ew\xdb\x01\x9e\x86\xb0\x8a\x0eQ\x16\xb8\xad\xf1\xd3C\xde<\xaf\xaa(*\xddD\x8f3l1\x9f4\x10E\x916*R\xd9\x0et{U\x9ch\xef\x8d}\xe7\xd2\xbd~\xe4\x89\x11\x8a\x12\xd0\xd07\xd5\x8ed\x06\xb2L\xd5Z1C\xceK:\xb0\xbed1O\x86sgy7\x84u\xa7C}\x8c\xe2\x0dqfv0\xa8:\xd1\x16\xce\xe6\xe0i\x06\xc3\xc1p~I\x07\xc5@\xb1\xed\x17\xad\x98!\xe7%\x1dX_\xb2\x98\x07\xc3\xb7\xb34\x0ca=0JQ\xbc9\xd1\xde\xbb\xd4\xc2\xc8\x05E\x19b\x86\xefK\x0a\x0c\x9a\xe1\xdbY\x835\x845JQ\x06\x0f(\xca\x90\xf2\x80L\xebiE\x01#\x82Q\xb4\xb3\xae\x1f\xe6V\x9db\xcdbx\xe7\xee\x05~\xd7\x0f}hH\x01E\x19R\xc8\xb4\xde}\xad(`D0\x8av\xd6\\\x8e\xe3\xc6^\xd7\x8a\xf2`\x0d\xee\xe1]\xad\xa8W\x03\x14\x05\x00\x00\xfd\x00E\x01\x00@?@Q\x00\x00\xd0\x0fP\x14\x00\x00\xf4\x03\x14\x05\x00\x00\xfd\x00E\x01\x00@?@Q\x00\x00\xd0\x0fP\x14\x00\x00\xf4\x03\x14\x05\x00\x00\xfd0HQ\xbc\xb9\x94\xf6\xe49\x1fl\xb0W\xbd\xbc\x7f\xa1\xb3\x91$\x00\x8c\x1c\x8cQ\x14\xaf.\xa5]\xd9\x17[\x04\xceg+\x9f3\xec\x87\xb8\xbc\x1f_\xc6H\xf2\xd9\xcf\xea\xcb^\xd1k\x15\x00\xf4\xc3\x10E\xd1p)\xad{*\xa4\x9e\xe6\xa9<\x13\xca\x8f\x90\xbc\x1f\x07m$\xd9WfY\xa7\xbe\xf4\x95\xbdV\x01@/\x8cP\x14-\x97RB\xc9\x81\xe1x\x86\x9b\xb1\xacT(\xca\x20\x8c$\x1bW\xf3)\x0f\xd4\x17\xbf\xb2\xd7*\x00\xe8\x85\x11\x8a\xa2\xe5R\x8a\xa9\xcf\xd6\xe7\x999#\x83\xc7\xe9\xb1\xb6\x9c\x9cXs5\xe5vI{?j\x19I*\xe9\xdc\x15e;\x8b\xd4\xa0\xbcV)_\xcb\x15\\P\x1ej\x1a\xcf\x89\x8f\x83\x97-.\x01`h1BQ\x90\x86K)&\xbf\x9cUl\x94\xd2\xbb\xdcZ\xba/\xc6\\\xb6\xa1\x98r\xbb\xa4\xbd\x1f\xb5\x8c$i\x06N[M9\xe2\xf3\x9f\xbb\xef\x8bPn5\x0a\xafU\xca\xd7\xb2\xa5j\xdc&A\xc1\xe3\x83q\x88lq\x09\x00C\x8c\xb1\x8a\xc2v)\x15h\xcaV\x1a\x94\x8fn\xaa\xf9F|N\x83}\xf9h\xb7K\xfa\xac\x07\xe3\xcdHRf'\xbf\xb2\xd9\x99Lr\x0es\xd6\x20%\xd4Y\x8f\xe4k\x89\x82\x05EA\x9b\xb0\xa2P\x16\x97\x000\xc4\x18\xab(l\x97R\x81r\x9d\x1e=<2\xc8\xb1\x08/\xb7\x89\x8b\x1b\xedvI+\x8a\x96\x91\xa4LE\xf4\xa2\x0a\xe7\x83\xc5n\x9f\x11q\xf3ZW(\x8a\xcb\xd7\x92R\x14\xd9\xe2\x12\x00\x86\x1ac\x15\x85\xedR*\xb0{\x18\xdc\xbf\x86\x8e\xe2y\x8f\xf1\xe8\x04\x0f-h\xb7K\xb7\x99Y\xafF\x92\x14w7\xf0\x89\xcd\xc8\x1b\xb4\xa2\x84\xbbR\xb2\xa2\xc8\x16\x97\x000\xd4\x18\xab(l\x97R|=\xd9\xf5\xcb\xea\x17<\x8cJ~\xd8\x98\x90\x88\x1f\xe8I\xbb]\xca\xde\x8f\xdaF\x924\xd4L\x0a\x1b\xc9k\x956\xea$\x8a\xb2\x1e+\x8alq\x09\x00C\x8d\xb1\x8a\xc2v)\xc5\xd3(\x83\xf1*\x19\xf1\\\xe3\x97\xf0\xfc:r\xb9\x97v\xbb\x94\xbd\x1f\xb5\x8d$\x95t\xee\x8a\xb2\xd6x\xe4JH^\xab\xf4p%\xf4ca\xebF`E\xa1,.\x01`\x881BQ4]JQ}\xf6\xa0\xac\x05F:\xd7bj\xce9\x1e\x88\xcf\x1c\x97\xdc.\x11\xe5\xfd\xa8m$\xe9N\xf3\x1a\xdaO\xd7\x0d\x97\xd7\xaa\xc2\xd7r\xee\xe4/>\x8f\xe0\xc6\xe6\xd6\xd3\x16\x97\x000\xc4\x18\xa1(\xda.\xa5M\x07\xbcV0\xda\xb8b\xc23#\xa65x\xf6Cr\xbbD\xb2\xf7\xa3\x0fF\x92\x83\xc2\xe5\xb5\xaa\xf0\xb5\xbc\x1e\x192q\xfe\x1f9\x0e\x1bK\xc9\x16\x97\x000\xb4\x18\xa1(\x81\xc6#\xf3\x8eG/^<\xf9\xe9\xb3EO\xb4B\x19\x18`\xd2\x04\x00C\x06(\x8a\xfe\x9c\xb6\x88C\x92\xbeX\xf7\xbb_}\x01\x14\x05\x18\xcd\x80\xa2\xe8\xcf\xb5(\xf1bos\xd4\xcb<\xaf\x00\x14\x05\x18\xcd\x80\xa2\xe8O_\x86yGum\xf5\x0es\xc6KX^\x1aa$\x09\x00C\x06(\xca\x100pf\x83\xd5dM>\xfb\x12\x82b\x88\x91$\x00\x0c\x19\xa0(\x00\x00\xe8\x07(\x0a\x00\x00\xfa\x01\x8a\x02\x00\x80~\x80\xa2\x00\x00\xa0\x1f\xa0(\x00\x00\xe8\x07(\x0a\x00\x00\xfa\x01\x8a\x02\x00\x80~\x80\xa2\x00\x00\xa0\x1f\xa0(\xa3\x99C\x11#\xef)Jm\x11\x87\xb4B\x8c\xe7L\xe2\xa3\x11\xda2\xbf\xc3\x20E\xf1\xe6R\x8a\x1f\xe7~\xc0~\xe0$\xb8?\x0c\x96\xcd\xdcF\xf2\xde\xbc\xc1lM\xab\xb5>B\xdbx\x9e7\xfbv\xc3m\xed<>\xb1\x0f\x9d\xe0yo\xce\x865qg\\\xc9\xbf\xedX\x12\x93\xdc\xe7\x9e\xcbbs\xd0\x17\xacl\x83\x1b\xa9\xe0\x20_\x80\xef_Vi\x19\xa0'\xc6(\x8aW\x97R\xd4\x96WX\x7f\xab\xfe@\x9e_=\xc7\xcd\x002\x83v\x93\xf7\x1a\xf3\x1f\xca*?\xe4\xf9\xff\x8b\x1e8\x1c\xa5\xfcU\x8db\"\xdd5|\x8c\x03u\x9e\xe0k\x14^\x1d\xb2\x95*\xe6\xac\xf9\x84+\xf9I\xdc\xd7\xe9\xe6'\xee\xb9LJ\xc6n\xf7\xcc4\xba\x914\xa5Q\x15b\x82\xd92@W\x0cQ\x14\x0d\x97\xd2*\xe2\xb6\xd1\x93\x7f\xdc[\x1d\x80;7\xc6\xaf%\xef\x8f-)\xc2\xf1\xd6\xf9\x9ep\xb0\"\xec\xd3\xe1\xdb\xc1\x8a:\xf9\xf4m\x08\xdd\xe7\xdd\x1f`\xbb\x9a~X\x9c\xf4{\xff\x98/E}\xaeP\xad?2\xae\x0f\xbe\xe5\x9ee|#e\xee\x9ar\\IF\xcb\x00}1BQ\xb4\\J\xcb\xc5'\xe4\x1f\xf2'\x130\x03\x88\x9f*\x9e'\xe6\x98\x89\xc9z1OL7\x06q\xb0\xd6\x9a\x9f3\x0e\xd6\x95\xcc\xc7O\xde\xe5\xbd\x9e\xe9(\xe9\x98\xeaa\xe41\x9c\x8d\xcc\xb0Jn\xb0\x8c\x96\x01\xfab\x84\xa2h\xb9\x94\xb6\xe5\x1dk\xedi\xad\xca\x1by\xb3\x8c/\xcd\x8d\xb7\xc3\xc6MY\xd0\xe2\x96\xa4\xc9\x9db\xc7o\xb7&:\xad/&\xd2\x16h\x8d&\x9e\xdfs7}YL\xf2\x8b}<\xcfW\xa2J\xe1u\x9f\xb2\x82\x9e\x89\x1f\x8b\x89\xf72\xc8\xdb\xe3brf\x20\x1d\xac\x92=*B\x977\xd8L\xb1\xc96\xf2T~\xc9\x13\xb5\x93\xbf\xbf\xf2\x84\xf3`eZ\xa9>1\xf3|\x14~\xee6\xea\x8d\x15sw)r\xa9\xca\xa8\xf6\x92\x05\xebC\xdc\x9f\x1blh#\xcf\x0ao{P\x81\xf0\x8a\x9f\x0a\xdek\x91\x86(\xac\x96\x01\xfab\x84\xa2\x20-\x97\xd2\xae\xf2\xec\xec\xec#~\xb4\xab\x8fM\x08\xdf\\\xbe\x91\xdb\xaaL*x\x8b\x9b\x8f\xdfzvo\x17\xc9\xa5\x8d\xe4\xbb\xab+m\x09\x16\xdb\xae\xb4y\x0f\x1f\xa5%^\xeeD\x9dW\xd6\xa4\xfd\xa2\xac\xe0\"wL\x8c\x8d*\xa6\xb3\xa5\x83U\xb2GE?\xcdK?QS\x16\xcb\xe3\xa3]\xf6D\x15\x0e\xd6\xd2d\xe7\xc1\xca\xb4RE\x0d\x0eG\x0c1\xfc@7\x1d\x95|\x81\xc3\xf1\xb32W\xae\x8cj/Yp\x92;\x85\x14\x18\xdb\xc8\xe7Wl;\x1e\xa1G\xfb,\x97q\xb9\x9b\xbcC^\xb3G\xcb\x00\x9d1VQ\xd8.\xa5=\xe5\xf9\xf5-\xf5\xf9\xe5\xf415\xaa\xe9\x9a>\xbf\x0bO\x0c\xb5)\x92J\x9a>\xbfA\xde\xef5\x89\xb8\x1b\xc9\xaf\xe4?y\x86\x06\x9e!T\xb1\x9c|~\xbf\xc2-\xa0\x84\x13+\xb8/\x1a\x87\xb9p\x1d\xac\x94=ji\x1c>LK\xf1\xb3*)OT\xe1`\xfd%\xe6\x17r\xb0\xb2\xadT1.\xedP\x9eP8s\xa9\xca\xa8\xf6bnqn\x8f\"7\xba\x91\x05x\xfc\x92.\x8e\x8b\xce\xf1\x7f\x95c=Z\x06\xe8\x8c\xb1\x8a\xc2v)=\x9e\x8f\x87'=\xf9'U\x0a\x8f:J\xb8\xef\x19I&M\x9c\x0b7\x0f\xb4\x95\xd1\xe2\xcf=j\x8c\xea~^\xf1\xe4Et\xa3[\xc9Bg\x89^\x13\xf3\xe7\x9f\xb2G}h]\x96Uv\xb3\xaf\x17\xd1\x9e\xa8\xf8`E\xc9\xc5\xe4`e[\xa9b\xbc*\x0aU\x19\xd5^\xcc-w\x8fe\xa3\x1b\xf9`\xde_P\xb7\xa5\x86\xa4O\x0buHx\xb4\x0c\xd0\x19c\x15\x85\xe9R\xdao\x17\x0f\xba\xef\xed\xfd\xac\xa2\xa3\x90\xad\\\x17#\xc9\xa6\xaaH\xa4\xca-\x7f\xe5jg\xa2\xdb\xd4X\xcc\xef\xbb\x1d\xe5v\xfd\x14\x9dr\x8d\xdf\x9dS\x14\xbd5\xe4\xcdu\xb0\xd2\xf6\xa8O\xcaR\x13\xf8%\x07\x07hOTr\xb0\x9eXI\x0eV\xb6\x95*\xc6\xab\xa2P\x95Q\xed\xc5|\xcb\xb9\xff:\x18\xdd\xc8\xe4\x1ct\xc1\xd2K\x92W\xe9i`\xcf\x96\x01\xfab\xac\xa20]J]\x8ar\xd1o\x14\xa5\x9c\xbb\xc8H\x0e\x0e\xf9\x98I\xa8\\\xb7&\xe1\xf4r\xf7\x80\x8e`\xf1\xf66\x94\x13CfX\xaa\xf9G\xf8M\xfa\xf9\x97\xedQ\x1br\x84\xe4\x93\xca\x98R\xda\x13\x95\x1c\xac\xcf\xcd5\xe4\xe7\x9fi\xa5\x8a\xd1\x18\xa3H\x95\xb9\x1d\xe3\x9f\x8eoGJ\x8cn\xe4\x99E\xbd\xce\x93\x1e\xf4<\xda\xb5\x1c\xb1Z\x06\xe8\x8b\xb1\x8a\xc2v)\xfd\x86\x9c\xf5t\xe5\x7f\xe3\xad\x86\xd1D\xc7\x94H<'\xf4\xc1*ERI\xd3\x177<\x0bR\xc8GhZ\x96\xe9\x02\xbf\xd3\xf9\x91*\xb6x\xa6\xa8\xc0\x8f-\x9f\x09?\xc6}I\xcb\xc8'\xd7\xc1J\xd9\xa3\x16\x88s\x0fI;\x10\xed\x89\x8a\x0fV\x94\x9e\x86\x0fV\xb6\x95*\xc6\xab\xa2P\x95)\x15\xa5\x7f\xf6\x02W\xd2\xd5^\xa3\x1b\xd9\x1b{f\x91\xeb>\xdb\xd4\xf7\xa4;V\xa8\x96\x01C\x83\x11\x8a\xa2\xe5R\xda\xb5?\xbf\xeeN]\xfe~\xff\xb9\xd8s\xf4\xf572K>\xe0\xec\xca\xa4\x82\x85\x9c\x97\xef\xf6\x8b\x1f\xc8\xd5\x8c\xfb\xe4\xc3A\xb3\xa5/\xc1u\xd4P\xc5~\x0c\xda\"&.\x98\x13+\xcel0]A\xe8!\xbe\x1d\xb5\xd8\xe1\xc0?\xde\xb2=j\x01o\xdew\xf6t\x06\x8f\x8f0\xc9\x13\xb5\xbb\x86?\xd1\x89j\xcd\xe42\x0a\xd3J\xb5\xf7\xaa\xc3\x11\xb3\xcdq\xf9\x99\xeb2\xcaU|`R\xb9re\x8a\xf6\xe2S=i`&\xb5\xd7\xd0F\xe2:\xde\xb5\xbcp\xb6\xe1v\xd4\x9f]\xcd\xd9\xfa\xb2CF\xc0W\x8cP\x14M\x97\xd2\x9eo\x0f\xe4\x16~\xeb7\x97z\x04\xae\xbf3mbD\xa1{\x92&wr\xb6G\x9eDc\x14\x99HH&\x1f\x1a,\xfb\x04Ui\xf0,\xb6\xfeu\xe7\x9c@\xf3\x06\xf3\x92\x94\xbf\x08\x89t\xe7\x0c\x04\x1e/\xc8\xf6\xa8\x15k\x0al&k\x92\xf8\x93\xed\xf2D\xad\x9d\x87\xef\xd6\xe8K\xb4\xf6)be+U\xf4\x93\xd8\x08\xbe\x0cu[H\xc2t[\x91KU\xa6h/:\x1e\xf2\x91\xd4F\xb9\xbdF6R\xe06\x9f!5b_\xcc\x151A\xb7\x0c\x18\x1a\x8cP\x14`\x88X5>_+d\x18\xd8?>~\x04\xfc8tF\xcb\x7f.\x1c\xc82\x91\x13\xa4\x91\xd12?\x07\x14e4\xb3u\x9a\xfbm,\xc3O\xdb\xd4\x11\xf1\x07\xdf\xea\xd8\x17\xf2\x87\x81b\xdb/#\xa6e~\x0e(\x0a\xe0\x7f\x14\xd4\x0e|\xe2\xf6\xa7\x05\xc0\x20@Q\x00\xbf\xe39\xbfz\xa7\xd5\xf3\xa1\x06\x80\x11\x80\xa2\x00\xfe\xc7>\xf3\xba\xdbZ1\xc0\xd0\x00\x8a\x02\x00\x80~\x80\xa2\xe8\xcf\x97L\xb4J\x01\x80?\x00\x8a\xa2?\xa0(@\xe0\x02\x8a\xa2?\xa0(@\xe0\x02\x8a\xa2?\xa0(@\xe0\x02\x8a\xa2?\xa0(@\xe0\x02\x8a\xa2?\xa0(@\xe0\x02\x8a\xa2?\xa0(@\xe0\x02\x8a\xa2?\xa0(@\xe0b\x90\xa2xw)\xed\xbfTh/\x94\"F=\xa0(@\xe0b\x8c\xa2xw)\xed/\xca\xbd\xd8t\x9e<\xd8\xcd/pi\xc8\x9f\xfe\x0f(\x0a\x10h\x18\xa2(\x1a.\xa5\xdf\xdb\xb1\xf7\xd7\x8fv\x7f\xb1RwJ\xc8?\xff\xe7\xff\x06\x8a\x02\x04\x1aF(\x8a\x96Ki\xc9\x11\x92\xcc\xf3\x97A\x0a\x11\x90\x7f\xfd\xaf\xfc\x7f\x871\x0a\x10p\x18\xa1(Z.\xa5\x85\xa2\xb3\xc4\xa1\x12f\xe9\xd1\x87\x20\x1f\x7f\xfa\x1f\xa6\xff\xf2/_*\x10\x16\xdcM\x8d5\xc5%?@\xca$\x00\xf8\x11F(\x0a\xd2p)=\x99\x87\xe7g\xbbr\xfd\xc5\xed\xed\xcb/\xff\xe5\xbf\x98\xfe\xe7\x9f\x88\x8e\xfc\xe9\xff\x88\xfcIP\x94Z\xf3\xea\xafj\x0ax\xec\x85E%\x01\xc0\x9f0VQ\xd8.\xa5\x1d\xbb\x8bZ\xbbZ\x0ee\x8f\xc4\x87\xa6\xbe\x0c_\xfe\x0f\xfe\xbf\xfe\xabsd\xf2\x8f\xce\xc74\xff\xe3\x97\xa8\xdb\x96\xdc\x8dPo\xf5cD'\x01\xc0\xaf0VQ\xd8.\xa5\xa8\xad(;\xdb~\xaa\xe8\x10\xbb\xec\xa8\xe3\xcb\x7f6\xfd\xe7\x7fv*\xca\xff\xfe\x17\x91\xff\xfd%\xba\xc0\xdftEPI\x00\xf0+\x8cU\x14\xa6K)\xa6\xab\xad\x1f\xe5\xf9\x8b\x7f\xa4\xa0#\xffM\x1e\xa5H\xf3(\xc5\xbcd4J%\x01\xc0\xaf0VQ\x98.\xa5\x82\xb4\xe0\x97\xeb\xd9-\xcc\xa2\xa3\x0f\xac\x1f\xf2L\x8a\xa4(5\xfc5W\x04\x95\x04\x00\xbf\xc2XEa\xbb\x94\xd6g\xb7\x0a\x8b\xf6\x1e\xf3Z\xc3(\x82\x08\x08\xbe\xda\xf3\xbf\x14\x8a\xd2iM\xc2\xd6\xdeYY\x88N\x02\x80_a\x84\xa2h\xb9\x94\xfe\x98\xfd\xdd\x9d\xef\xf3\x8a\x9ej\xd53ZpJ\xc8\xbf\xfe\xe3\x7fW(\x0a\xaa\x8dY\xfe\xf5\x85,\xe2\xc6G%\x01\xc0\x9f0BQ4]J/\xe6\xe7\x16]\xec\xf7^\xc9(\xe2K&\xc2\x82\xdb\xa96K\xe2i\x12C%\x01\xc0\x8f0BQ\x02\x0dUE\x01\x00\xbf\x07\x14E\x7f@Q\x80\xc0\x05\x14E\x7f@Q\x80\xc0\x05\x14E\x7f@Q\x80\xc0\x05\x14E\x7f@Q\x80\xc0\x05\x14E\x7f@Q\x80\xc0\x05\x14E\x7f@Q\x80\xc0\x05\x14\x05\x00\x00\xfd\x00E\x01\x00@?@Q\x00\x00\xd0\x0fP\x14\x00\x00\xf4\x03\x14\x05\x00\x00\xfd\x00E\x01\x00#h\xf5\x9f\xbf\xc2z\x05\x14\x05\x00\x0c\xa0g\xd2\x8d\xa7\x01\xa1)\x06)\x0a\xc3\xa5\xb4\xe5\xc8^{\xfeI\xf2\x88\x03\xd4r(\xf7\x88\xbf<\xc1\xcd7\x9a7\x98\xadi\xb5\xd6Gh\x1b\xcf\xf3\xe6\xbbZ\xe1\xc0h\xe7\xe9\x98\x09\xdfw\x04\x82\xa4\x18\xa3(\x0c\x97\xd2{\xd9%\xf5w\xea\x0f\xec\xc5\xcfY\xbac\xaf\xbaQe\xbf\xe3\xb5\x0a\xff\xa2\xc6\xfc\x87\xb2\xca\x0fy\xfe\xff\xa2\x07\x0eG)\x7fU+^\x8dg?\xab/;zQ}\x19`4\xedc\xc6L\xbc\xe47\x0f\x15\xf3\x82!\x8a\xc2r)\xbd\x91\x8d\x15\xe4)N\xf6\xef\xc5\xcf\xac>\xb97\x10\x14\\\xe4\xb1%\xa5\x1b\xa1\xce\xf7\x04E\x11hxYE\xe9+\xb3\xacS_\xfa\xbb\xc5\xea\xcb\x00\xa3i\x1f\x13\xff\x9b\xb0\xfa\x00\x90\x14#\x14\x85\xe9R\x8a\xc8\xc6m\xc5\x8f\xab\xae\xb7cK\xb0\xa7\xd2\x83\xf1\xfd\x9f\x1c3\x19[\x14\xf3\xb7\xf1\xdb\xcb*J\xe3j>\xc5\x8b+a\xf8;\xea\xcb\x00\xa3i\x1fSx\xfe7S\xebe\xf3;\x7f\xc5\x08Ea\xba\x94\x92\x05\xb7\xf2\x8b\x84\x8f\xe5\x87\xc9\xa7\x92\xa3\xac\xc2\xa3\x92\xcb\x1bl\xa6\xd8d\xdb\x80pZ\x92j5\xd9R\x1a\x85\xbc}<\xcfW\xa2J\xe1u\x1fz/\x83\x84=.&&\x1b\x92\xa2\x0c|\xbd\xda\xbc\xb2t@Y\x03\x1a\xa8H4'\xecz\xee\xbe\x8e\xce]Q\xb6\xb3\xee\x99\x12E\x9cH8B\x97\xc6r\xdc\xfa\xebKg\x84\xcc\xefY\xc1\x05\xe5\xa1\xa6\xf1\xdcl\x12\x93\x17\x11:k\x95\xbf\xd8\xd7\x8ft\xda\xc7\x1c\xf8\xf5\xe4k3\x7f\xf4{I1BQ\x10\xdb\xa5\xb45;;;\x17\xcf\xcc\x16\x8aF='\x0b\xd5J\x8f6~\x9a\x97~\xa2\xa6,\x96\x7f\x81\xd0Y>\xa3\xb6:%\xaa\x01\xa1Gi\x89\x97;Q\xe7\x955i\xbftG)\xecI%EI\x8f\xdesnOt\xba\xb2\x06\x94\x11\x95u\xae4ne\x9fb\x15\x03\xa7\xad\xa6\x9cN\x92\xec\xbe/\xa2\xb0\x00\xea8Y5knUU\x950\xee\xeb\xca\xdf;c\xd6\xc4\xe9\xab\x96rM-U\xe36\x09\xba\x1e\x1f\x8cC\xe2\x83>(\xd9>9l\xc9\x83\x1e\x97&\xbfk\xe1?\x14R\x8dQ\xdd\xcf+\x9e\xbc\x88nD\xbd&\xe6\x18%\xe3}\xf2\xb6|\x9b\xa2\x86\xb4w{_\x08\xd82\x14\xab\xa8\x88^T1\x20&o\x9f\x11\xb9\x8d\x94\xd0\x8a\x12\xdc\xe4L\xc9\x8a\xb2xf\x0ffZ<\x02\x0c\xa0}L\x9e\xa0(\xbf\xe6\xbd6\xb7\xa9\x07\xf93\xc6*\x0a\xe5R\xda%\x8e\xb6/\xd9\xfb\x9d\x16\x83\xe8\xd07\xcc\xa2\xa3\x91'e\xa9\x09\xfc\x92\x83\xc2!\xdf\x10g\xcb9\xedX\x87\x15\xa5\xdb\xd4X\xcc\xef\xbb\x1d%\x9c\x9d8\xe7Qzk\xc8\x9bKQ\x12S\xc8[r\xa2\xa2\x86\x0f\x9dC\x90\x14\xe5*\xeen\xe0\x13\x9b\x917hE\x09w\xa5dE\x99\xe3\x9ciy\x8bQ\x14\xd0\x9d\xf61\xbb\xff\x03KJ\xe6\x98\xf9\xfe-)\xc6*\x8a\xecR\xda\x9f'\xce\xc3~/(J}6\x1e\xb9\xb4e\xfb\xcd\xb5\x9e\x86\x1cA\x09\x9eT\xc6\x94\"\x94\x90\x88\xa7TS\xb1\xa2\xa0\x84\xcauk\x12N\xe3s\x9f\x9c\x98_pF5\xff\x88\x84\xbb\xc6(\xef\x92\x89\xd8e\xe9\x8a\x1a\xd2\xde\xbdFx\xec\xb6\x12j&\x85\x0dQ\x14;\x19\x9c\x84\xbf\xed\xca$\x8a\xb2\x1e+\xca\xd2\x99\x17\x09\xad*\xc5\x01]i\x1f\x93K\x14\xe5\xd7/\xc6\xbcu\xcb\x9f%\xc5XE\xa1\\J\xf7\x1e\xc1\x19\xe4\xac\xa7\x9f\x18\x94\x1e\xf5\x9f\xfbQ\x0a\xf0T\x08BI;\x10\xb2\xa5\x0a\x89\xbe\x95DQ\xd2\xb2L\x17\xf8\x9d8\xe3\xb1\xe53\xe1\x84\xa6/i\x19\x09w)\xca92WR\xc9\x9fS\xd4P\xc3W\xe3d\xceA\x8f\xd5t\xee\x8a\xb2\xd6x\xe4JDF\"t\x8f\xcb\xc7Iy\xb8\x12\xfa\xb1\xb0\xbd#\xb0\xa2\x1c\x11\x17\xfd\xf1svi@_\xda\xc7\xd8\xff]\x94\x94\xf5c\x96\xde\xf1cI1BQ\x98.\xa5?f\x97\xd7\xdf\xa9\xcf'\xf7\xcc\xde\xb2\x1f\xbdq\xcc~K\xa3\x9a\xd1C\x01o\xdew\xf6t\x06_\x8b\x93\xa9\xa5\x05+\xf9\xd8\xaf\x04\xd18h\xb6\xf4%\xc4\x14\xe0\x88\x0b\xe6\xc4\x8a3\x1bLW\x10z\x88\xef\x99-v8\x1e\x0a\xb9iQ9gs\xa2\xd2\x945\xa0\x9cyi'\x84\xa4rfV\xa4yM*#\xd7\xc9\xc6\xe0-\x85o\x86\xdeA=\xa7\xc8e\x1fq&e\xee\xe4/>\x8f\xe0\xc6\xe6\x0a\xe3\xc1\xb5\xdc\xe2\xfcC\xf1\x9c\xdf\xcc\x87\x8fl\xda\xc7d;\x15\xe5\xd7U\xaf\xadh\xf1_I1BQ\x98.\xa5\xa8\xe5\x9b|{\xe1)q\xe2\xbb\xe5\xb0\xfd\x90\x1f\xfd\xaf\xa7bM\x81\xcddM\xc2r\xd0W\x9c\x10\x1d\x97V\xf1\x9e)I\x18\x8bX\xf6\x09\xaa\xd2@B\x9a7\x98\x97\xa4\xfcEH\xa4;\xa7I\xc8X\xa6\xf4C\xf3\x87\xa5}\xca\x1a\x84Q\xca\xbaX\xcb\x9a\x0bj+S\xa5\xeb\x83\xb0\x90\xb9\xdf\"t)\x88\xcc\x97,\x20\x99\xd7#C&\xce\xff#\xc7\xad\x10\xd2G\"\xc3&\xcd=\xec\xbd\x12@'\xda\xc7d\xfe\xdb\xbf\xff\x87x\xdc\xc4\xbf\xb6\xca\x7f%\xc5\x08E\x01\x80\x80GP\x94\xff\xe7\x1a\xa4\xfc\xfa\xf6kk\xef\xf9\xab\xa4\x80\xa2\x00\x80\x01\xb4\x8f\xd9\xde\x8f\x07)\x7f?y\xfc\xf8\xf1c\xaf\xbf\xb6\xb1\xd5O%\x05\x14\x05\x00\x0c\xa0}\xcc\xd6\x1e2H\x996\x86\xf0\x9b\xedm~s%B\x01(\x0a\x00\x18@\xfb\x98-]\xe8\xdf\xec\xff\xfek\xf9\x98\x05\xff\xb4y\xf3\x16\xfb7~\xfaP7P\x14\x000\x80\xf61\x9b;z6\xbe\xb6\xf9\xef\xbf\x8e\x9ft\xb8\xbe\xa9\xa9\xa9\xd5O\xef\xc6\x07E\x01\x00\x03\x10\x14\xa5m\xd5\x98\xff\xf4\x0f\xff\xfe\xeb\xde\xd72[z\xfa\xfb\xfds\x84\x02\x8a\x02\x00\x86\x20(J\xfc\x987>~-\xf3\xef\x7f\xff\x87Yu~:>\xc1\x80\xa2\x00\x80\x01\xb4\x8f\x09\x1d3g\xf7\xa9\xd9\xdc\x7f\xfc\xba\xf97\xf9~:\x87\x82\x01E\x01\x00\x03h\x1f\xf3ZD^]k\xf9k\xb9\x7f\xff\x8f\xdf\xbc\xe5\xc7\x7f\x16\x04E\x01\x00\x03h\x7fma~}G\x7f\xdbl\xee\xdf\xda~\x13Y\x0f\x8a\xc2D\xabr\x00\x00D\x9e\xfe\xd3qAPP\xcf\xe1\xdf\xfc\xa7\xdf\xfc\xc3\xa7?\x82\xa20\xd1\xaa\x1c\x00\x00\x91\x9e\xb6V\xf2H\xa0\xf6\xa2\x88\xf9[N\xc2<\x0a\x1b\xad\xcaG:\x8b\xb9\xb0\xdf\xfb\xcdCY\x80\x91\x8d\xf3rq\x7f\xdb\x8d\xba\xeb\xfez\x07>&\xa0\x15\xa5\xe5h\xee\xec0\xf1a\xf0m\x11\x87\\\xb9T\x12\x00\xf4\xa6\xbf\xa7\xa7\xc7\x7fG(\x86)\x8a\x86K)\x1d`,\xc7\xb8Kbbs\xd0\x17\xae<*\x09\x00\xc0\xa00FQ4\\J\xa9\x00\xa3\xf9\x96;\xe5L\x95\x8c\xdd\x8e<\x93\x00\x00\x0c\x06C\x14E\xc3\xa5\x94\x0e0\x1aYQ\xd0\xfa\xe0[\x8c$\x00\x00\x83\xc0\x08E\xd1r)\xa5\x02\x0c\x87R\x94\x8e\xa9\xf1\x8c$\x00\x00\x83\xc0\x08E\xd1r)\xa5\x02\x0c\xe7\x12wLJ\xaf\x0f\xe9b$\x01\x00\xf0\x1d#\x14\x05i\xb8\x94R\x01\x86\xd3\x13\x16q\xf2\x8eS\xe4N\xca\xe3\x15*\x09\x00\x80\xef\x18\xab(l\x97R*\xc0x\x0es\x1c\xb7PL\xde\xe2\x0e\xb8r\xa9$\x00\x00\xbec\xac\xa2\xb0]J\xa9\x00\xc3\xe9\x98\x1d\xdf\xceH\x02\x00\xe0;\xc6*\x0a\xdb\xa5\x94\x0a0\x1cJQ\xfag/`$\x01\x00\x18\x04F(\x8a\xa6K)\x15`4\xa7dE\xd9\xca]d$\x01\x00\x18\x04F(\x8a\xa6K)\x1d`$=-\x17\x17\x07\xbb\xdcQ\x8f\x87|\x84<\x93\x00\x00\x0c\x06#\x14e\xc4\xf2\x16\xc7\xcd8\xe4L\xef\x1f\x1f\xdf\xe3\x99\x04\x00`P\x04\xb4\xa2\xb4\\\xbc\xe3J\xb6M\xfd\x82\x91\x04\x00`p\x04\xb4\xa2\x00\x00\xa03\xa0(\x00\x00\xe8\x07(\x0a\x00\x00\xfa\x01\x8a\x02\x00\x80~\x80\xa2\x00\x00\xa0\x1f\xa0(\x00\x00\xe8\x07(\x0a\x00\x00\xfa\x01\x8a\x02\x00\x80~\x80\xa2\x00\x00\xa0\x1f\xa0(\x00\x00\xe8\x07(\x0a\x00\x00\xfa\x01\x8a\x12(\x9cI|\xa4\x15\x12\x10\x90\xed0\xb4N\xb4\xee\xab\x18\xda\xb5\x8d0\x0cR\x14\xef.\xa5\x1dU\xf9\xf6C\x97\xe0\xff\xbe\xbeS\xcc\x0b\xccK(\x1b\x10?\xd6\xc4\x9dq\x8f\xd8&\x04\x98\xef\xca\x9f\x0f\xf2\x058\xb8>,\x17\xd9\xc3\xae\xbbG3\x19L,\x8b\xc6(\xa1\x0d\x19\xd2GF#u\xa18\xe6\xcfR\xfa\xbe\x89_\xee\x99\xa4qn\x07\xb6\x13mc\xf2\"\xcb\x9a\xda\xf7\xaf0\x16\xb9\xf0\xa1\x17\x9e\xab\x08$\xdf[c\x14\xc5\xbbKi{\xee\xa1\xba\xa6\xf3\xbb\x0bAR\xd8\xd4^\xf3\xc8z|\x90\xafp\x9cK\xe3\xf7\x89\x1f\xcf\x9aO\xb8G\xb8\x94\"\xd4\xbf\xb7\x8aYt(96!|s\xf9F\xe1\xa7\x18\xa1\xf8\xe0\xf5%\xeb\x83\x7f\x8fP\xfd\xde\xb1\xdc\xe4M[&\xbe\xadH\xaa\x11\x1f\xf4A\xc9\xf6\xc9\xe1\xfd\xa8+\x7f\xef\x8cY\x13\xa7\xafZ\xca5QI\xb7\xe8\xb7\xb8\xf9\xf8\xadg\xf7v\x91\\Zr\x9a+M|\\\xc1\x9f-\x9f\xe1\x0f\x19QY\xe7J\xe3V\xf6\xa1\xce+\x8e\x84$\x87\xc3q[Y\x93SQ\xcaxa\xc0\xdf\xe0p\xc4\x14\x90\xdc\xb3|FmuJT\x83\x18#+\xcaM\xde\xe1L\xf5O;\x85\xbe\x9b&\xc8x\xc7\xc9\xaaYs\xab\xaa\xaa\xc8\x94\xb9\xb4\x1dp\x8fg|\xfe\xe9\x8c\xd0::\x96\x0d\xdd\xb2\x9f\xe6\xa5\x9f\xa8)\x8b\xe5\xdd\x8evj\x8c\"7R\x8eU\xf4M\xea1{;tWW\xda\x12,\xb6]i\xf3\xe4\x99\x19\xc2\xbaT\x94\xba\x0e'\xeeZ\x12*\xcel\xe0\xa3\x15Ie1y;\x20\x96\x13\xedC[Tr\xc1\x0f\xbdH\xd17E\x0dR/\xe8F\xf6.\xb7\x96\xee\x8b1\x97m(\xf6\xb2\x8a\x80\xf1\xbd5VQ\xd4]J\x85M\x9e\xdb\xc6.;ttM\x9f\xdf\x85\x1d>\xda\xb0Y)v\xfb8\xc2\x1d\x16^\x83'\x09\x83\x92\xa5\x93\x912\xc9\xa4\x88\xcbE\xd8\xa2\x838\x10\x86so\xb69O\xe9\xa8$M\xd3\xe7\xe29\xc4\xbd&\x11\xb7\xc7\xffG[\x84\x9f\xbc\xf48\x84\xa5\x01\xcf\xee5\xf0\xe4\xf7P\xfd\xac\x07]pN\xa48\x0f\xd6\xe7\xd5\x82\xc0\x0c\xbc\x9f\"\xc6\xc8\x8ar\x8e\xff\xabG\x0d\xd4Y\x0f\xb5\x1dP\xf0\x0c\xdc\xf0\xe9\x11\x8cxO\xa4\x96\x95\xc6a-)\xb5\xb8M2(\xcfz\x9c\x8dT\xc4J5\xd0=V\xdb\x0e\xfc'\xcf\xd0\xc03\xa4\xa0\xcf\\\x8c\x8a\xcd\xb8\xae5\xef\x09C\x99\xbe\x0f\xa3\x95IE1\xc5v`8\xd1>.\xf8\x83\x89\xb7T\x8b\xc5\xe4\xad\xaeX\xb1\xb3\x17T#\xabyaTX*\xee\x10\xd5U\x04\x8c\xef\xad\xb1\x8a\xa2\xeeR\x8aNe\xbb\xff\xa0\x0f=%\xdc\xf7\xaed\xfco\xc9\xdb\x1b\xf8l7\x18\xbfl\x0cF\xca$\x93\xc53{0\xd3\xc8Irx\xb0\xd4\x05*\xc9\xa0\x89s\xa1\x8c\x8aNG\xce\xb3\xff\xb4w{_\x08\xd8\xc8\xb5W/\x8aR\xc1?&\x1f]_\xf3\xc7\xa5\xc9\xefZ\xf8\x0f\xc5\x0f\xb2\xa2\x9c\xe6\xef#O$E\xa1\xb6\x03\x0a\xfe#~\xcd\xe4|\x92w\xa9e\x0f\xad\xcb\xb2\xcan\xf6\xf5\xba-g*\x8a\"V\xaa\x81\xee\xb1\xdav\x88v\x1b\x9e`\x1a\xf9+\xddW\xf0!\xfd\x84/\xc3\x9f\xf7D+\x92\xcab\x8a\xed\xc0v\xa2\xed\xaeI\xe6\xcf\xe1\x04\xad(\xf4\x8a%E\x91\x1a\x99c\x11^n\x8b\xb3/\xaa\xab\x08\x18\xdf[c\x15E\xd5\xa5\xb4\xe7\xa8]\xbac\xc58\xb6r\xd2\xb9\xed\\\xd1M}\x01\xfem\x0e\xde(\xbcl\x12\x15EN2\x99\xe3T\x86\xb7\xf0\x87\xf0p)\x9fJ\xb2\xa8*\x12q;\xcf\x8b\xc6_V\xf2%\xfd\xd0y\x1eOF\x1b^\x14\x85|\x99\x91\xf45o\x88\xb3\xe5\x9cv\xac\xf3P\x94\xab\xd4ud\x19IQ\xa8\xed\x80\x827\xe1\xd7c\xbe\x19\x16\xc9-{R\x96\x9a\xc0/9\xa8:\x8f\x82q\x1d\x8bt\xacT\x03\xddc\xb5\xed\xe06\x97D(%\xcbKqo\xc9\xe9\x06.F%\x95\xc5\x14\xdb\xc1\xd3\x89\xb6\x81\xcc\x8a\xf4%\xbaou\xc5\x8a%E\x91\x1aY<\xef1\x1e-\x8ac\x14\xb5U\x04\x8c\xef\xad\xb1\x8a\xa2\xe6R\xfa\xb4(\xcfe\x9bc$\xe5\xf2q\x13?\x93\xbc\xcd\x20c\x14|P9\x15EN2Y:\xf3\"\x81L_\x86\xcb\xf3-\xe1^\xa6^\xd4\x91\xbf\xa4i\xef^#\x90\x11\x08\xf9nW(\x7f\x9fEE\xe9\x8ds~\xed\x9d_\xf3\x84D|\x9d!\xd5CQ\x9eG\x17\x20O\x88\xa2\xd8\x9b\x14\xdb\x01\x05\xaf\xc2\xaf\xf6A\x8cQp\xcb\x1ar\x04}xR\x19S\xaa\\.*J\xe7>\xc5@J\x11+\xd5@\xf7\xd8\xdbvp'uuCC\x03\xbe\xd2\xfb7\x9eT\x98\x1e\xadH*\x8b)\xb6\x83\xa7\x13\xad5\x8b\xbc\xe5\xbc\x87_\xa9\xad\xaeX\xb1\xa7\xa2<\x8cJ~\xd8\x98\x90(\x9e\xf1\xa9\xad\"`|o\x8dU\x14\x15\x97\xd2\xd6\xfd\x07\x84\xcd\xddo\xf8dx\xc7\x94Hf\x08$f\x00\x00\x03\xb5IDAT<\xa3\xf3\xc1*<\xf0\xc7\x83\xd2\xfd\\\x09RW\x94\xa6M\x1e?\xdcG8r\xe5\xfb\x8f\x9f\xe3W\xeaj\xac\xca\x85\xd9\xa6/\xbc]\x8b\xa5\xbe\xa45\xe2=\x119\x07\xf1k\x92p\\>\x123\xa4\x1aDE\xc9\xe1\x9d\xb7a9\xbf\xe66\xfc\xd5\xef[\xe9\xa1((\xf5=\xc6m\x14\x91\x91\x08\xdd\xc3\x1d\xa0\xb6\x03\x0a\x9e\xd2!d\xcc\x8ct\x0fft\x9ejY\x01\x7f\x81|\xde!\xc6\xba\xba)*\xcaM\xfe2\xf9\xe4l\xa4\"V\xaa\x81\xee\xb1\xcav\xa0\x0fli\x15\xd6]\xc2\xcb.\xab\xf0\x92h\x13t\xe7vL\xb42\xa9,Fm\x07\xca\x89\xd6UY\xac\x15+W\x9fX\x80\xda\xea\x1a\x8ar\x8d_\xc2\xf3\xeb\x1e8\x97\xb3W\x118\xbe\xb7F(\x8a\x96Ki\x93}\x7fSKK\xcb\xc9|\xad\x8at\xe7\xe8\xebod\x96|\xc0\xe1K\xbaK\x83\xd6\x16\xad\x0dZ\x8aPK\xd5\xb8\xf8S\xe8b\xfc\xb8\xaa\x16*\x89\xa3\x17r\x13<~\xb9\xd7r\x8b\xf3\x0f\xc5sy\xa8\xe7\x14\xb9v\"\xfc\xe2\xd3I7\x16r^\xbeW?;L\xdb\xae\x0e\xdc\xdcfr\xfc,\x1cC\xf3\xd2N\x9c\xce\x10g$\x0b\xa2\x8bO\x7fb~H\xd7@\xee\x99\xbd\x90N\xee\x99\xed\xbd\xeap\xc4ls\\~\x86\x0f\xd6\xd4\xd2\x82\x95|\xecWW\xd1C|\xcfl\xb1\xc3y\xcf\xea\xed(\xf9Nu\x89\x8d\xc1[\x0a\xdf\x0c\xc5\x17\xb0\xa9\xed\x10\xcc\x85\xe7\xdbgM\xf2P>V\xe7\xe5\x96\x15\xf0\xe6}g\x85\xf6\xd6:cI#_\xfc\xb0\xf2}\x87\xc0\xd7\xc2I\x88\xa2\x91T\xac\xdc7\xa9\xc7\xec\xed\xf0\xe2\x07r\xf5\xe5\xbe\xd4\x1c\xb2\x8a\xee\x0b|N'\xea\xcc\xe1/t\xa3f\xb3\xad`\xcf\xa2(SE3\x95t+Fm\x07\xca\x89\xd6\xb5[by\xeb\xbe\x0bBsn\xd3-\xa3k\x90{A7\xf2ZL\xcd9\xc7\x03\x97\x8e\xb0W\x118\xbe\xb7F(\x8a\x96K\xe9\xe1l\x91a\xb8\xc3\xed\xfa;\xd3&F\x90\xc9\x9d\xfe\xcc9\xa1s2\xfb\xf1M(\x1c7\xae.Tx]A%q\x88}\x02'M)K\x1c\x89\x0c\x9b4\xf70B\x97\x82\xc8\x84\x0a\xfejRI7r'g{f\xba\xd8\xc9\xf3\xbc\xe9/f\xe1\x15\xdf\xb6V\xb3.\xd6\xb2\x86\xfc\x98\xa3\xee\xacE1I\x0d\x8a\x1a\xc8\xffz\xf8ed\x02\xf2\xa7(q\xaeA\xf8\xd0W\x9c\x10\x1d\x97V\xf1\x9e)\x09\xa5;g\x20\x9c?\xaf\xfbb<\xff\xac\xd2\xf5AX\xc8\\\xb1G\xf2v\x08^\x15?q\xeaR\xcfsPf\xe7\xa5\x96U\xac)\xb0\x99\xacI\xce;\xcd\x9c\x8dlt6\x8c\x17\x0eQ\xaa\x91\x8aX\xaao\xae\x1e\xb3\xb7\x83\xb3\xb2d\xa4XE\xcd<|\xcf\xfc\x09\x9e\x9fW\x83\xd0\xdd\x94E\xcbr*L\xb8\x98\x94t+&o\x07\xda\x89\xd6\xb5[\xfeP\x96\xb3\xdc\x1c\x97\"^>s\xb5\x8c\xaeA\xee\x05\xdd\xc8+&\x9cgZ\xd3\xac\xbe\x8a\x00\xf2\xbd5BQ\xfc\x86B\xdff\x17F\"\x03Y\xa6j\xad\x18\x8283\xcb`\x14w\x9e\xc2\xb5\x1dtt\xa2}d\xde\xf1\xe8\xc5\x8b'?}\xb6\xe8\x09\xf9\xccX\x85\x8ek\x1b\xf1\x80\xa2\xf8L\x7f\xee\xa4\x15Z1#\x97\x81b\xdb/Z1\x18\x15E\x19\xdd\x9d\xa7\x10\xb7\x83\x9eN\xb4\xa7\x9dw\xe1\xf4\xc5\x8aCJ\xcfU\xe8\xb9\xb6\x11\x0f(\x8a\xcf\xb4\x84\xad2|\xee\xd8xT\x14%0:\xffR\\\x8b\x12Ow\x9a\xa3njD\x06\x04\xa0(\x00\x858\x17\x0d\x0c\x86\xbe\x0c\xf3\x8e\xea\xda\xea\x1d\xe6\x0c\xb7\xbbq\x02\x13P\x14\x80\x82\xccE3.R\x01^\x188\xb3\xc1j\xb2&\x9f\x05A\xc1\x80\xa2\x00\x00\xa0\x1f\xa0(\x00\x00\xe8\x07(\x0a\x00\x00\xfa\x01\x8a\x02\x00\x80~\x80\xa2\x00\x00\xa0\x1f\xff\x1f\xec\x88D\xdc\xfa\xfa\x88\xfa\x00\x00\x00\x00IEND\xaeB`\x82", - - "analysis/error1.png": "\x89PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\x00\x04\xc1\x00\x00\x00\xbd\x08\x03\x00\x00\x00\x8d\xa5\x9a\x96\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x02\xfdPLTE\x00\x01\x00\x02\x05\x01\x0a\x03\x01\x05\x07\x03\x1e\x01\x00\x0b\x0d\x0a\x10\x12\x0f\x16\x17\x13y\x00\x01\x19\x1b\x18\x1b\x1b\x14\x83\x01\x00\x8c\x00\x00\x8c\x00\x04\x20\x1f\x19!#\x20#$\"%%\x1e$%#&'%'(&+)\x1e()'++$*,)/,!-/,02/63(241\x98\x1b\x1b786;8,\x82%#:;9><0>?=C@4@B@\xa0*,CEB\x9c.-KH\x09n\x07PRP\xa9:e\xaf*{!bda)}*Bh\xb2egdLj\xafpiR.\x81.Em\xb1ikh\xb3XX0\x8301\x841/\x858Jq\xb5mol;\x86:Vu\xb4>\x89={t\\tvs@\x8b?B\x8c@@\x8dG\\z\xbay{xJ\x8eI^~\xb8\x84|d\xbbkkL\x90K~\x7f}O\x93Mb\x83\xbdN\x95UW\x95V\x82\x84\x81\x8f\x85hm\x87\xbdZ\x98Y[\x9aZ\x87\x89\x86\xc0{|]\x9c\\\\\x9dcr\x8d\xc2\x96\x8cnd\x9dd\x8c\x8e\x8b{\x8f\xc0f\x9fg\x90\x92\x8f~\x93\xc4j\xa3jy\x96\xc5\x94\x96\x93s\xa4l\xa1\x96xq\xa5s\x81\x99\xc3\x97\x99\x96\x83\x9b\xc5\xa5\x9b}u\xaaw\x9a\x9c\x98\xc7\x91\x92\x9c\x9e\x9b~\xaby\x88\xa0\xca\x9e\xa0\x9d\x81\xad|\xab\xa0\x82\x8e\xa2\xc7\xa1\xa3\xa0\xa2\xa4\xa1\x81\xb1\x85\x92\xa5\xca\x8b\xb2\x88\xb4\xa7\x83\xa6\xa8\xa5\x8d\xb5\x8a\x97\xab\xd0\xa9\xab\xa8\x8e\xb6\x8c\x8d\xb8\x93\xab\xad\xaa\xb9\xad\x88\x9f\xae\xce\xae\xb0\xad\x96\xba\x96\x98\xbb\x98\xa3\xb2\xd2\xb0\xb2\xaf\xd9\xa8\xa6\x9b\xbe\x9a\xc2\xb5\x90\xb4\xb6\xb3\xa3\xbf\x9d\xac\xb7\xd2\xb6\xb8\xb5\xa2\xc0\xa4\xb7\xb9\xb6\xdb\xb0\xb3\xa5\xc4\xa7\xba\xbc\xb9\xb1\xbd\xd7\xa7\xc6\xa9\xbd\xbf\xbc\xa8\xc7\xab\xcc\xbf\x99\xaf\xc6\xab\xb8\xc0\xd5\xbf\xc1\xbe\xb2\xc9\xae\xd0\xc3\x9e\xc2\xc4\xc1\xbc\xc4\xd9\xe2\xbd\xbe\xc4\xc6\xc3\xb2\xcd\xb7\xbb\xcd\xb9\xc0\xc8\xdd\xbb\xca\xde\xc7\xc9\xc5\xd8\xc9\x9d\xbd\xcf\xbb\xc6\xca\xda\xc0\xcc\xda\xca\xcc\xc9\xbf\xd2\xbe\xd7\xcf\xa1\xcd\xcf\xcc\xc4\xd0\xde\xcb\xcf\xdf\xc8\xd3\xc1\xe0\xd1\xa5\xd0\xd2\xce\xc8\xd6\xc9\xea\xcc\xcb\xd1\xd3\xd0\xd2\xd3\xdd\xca\xd8\xcb\xd3\xd5\xd2\xdf\xd6\xa8\xcd\xd6\xde\xcc\xda\xce\xe6\xd6\xaa\xd6\xd8\xd5\xd4\xdb\xd0\xeb\xd4\xd2\xd2\xda\xe3\xd8\xd9\xe3\xea\xdb\xaf\xda\xdc\xd9\xd7\xde\xd3\xe1\xdb\xda\xd5\xdf\xda\xdc\xdd\xe7\xdc\xdf\xdb\xd7\xe1\xdc\xde\xe0\xdd\xdc\xe1\xe3\xf0\xe0\xb3\xe0\xe2\xdf\xe2\xe4\xe1\xee\xe1\xe2\xdf\xe5\xe7\xe4\xe6\xe3\xe8\xe5\xea\xe5\xe7\xe4\xf2\xe4\xe5\xe6\xe8\xe5\xe3\xe9\xeb\xe7\xe9\xe6\xe8\xea\xe7\xeb\xed\xea\xf6\xf0\xef\xf2\xf4\xf1\xfe\xf8\xf7\xf9\xfb\xf8\xfe\xff\xfc!l\x99S\x00\x00\x20\x00IDATx^\xed\x9d\x0fXT\xd7\x9d\xf7\xf7\xd9\xd9\xd8w\xd3$C\x03\x9b\x12-K^\xd6fm\xfb\xdc\xe1\x19\xa9\xbe+\x0c\x8d\x1d\x14\xd7?1+\xbeVQ\x8aV1\x1b1\x18\xe7a\x13\xa3\x82\xc6\x84L\x0a\x19%)\x20B\xe6\x89E\x1eY3*\xbe\">\x19Me\xc1\x96hqm\x12\xe8S\xa6\xd1\xb1\xb6\xda\xe4\xf2(\xac\xe4y\xaf\xe7\xed\xa6\xe5y\xcf9\xf7\xdf\xb9\xc3\xbd3(\x03\x97\xd1\xdf\xe7\xd1;\x87;\xbf\xf3\xbb\xe7\x9c\xb9\xf7;\xe7\xfc\xee\x99{\xfejh\x14\x20\x00\x00\x00\xf3\x18\x1a\xfa\xabH*\x15\x8eH\xee\x01\x00\x00\xc6\x10P0\x00\x00b\x17P0\x00\x00b\x17P0\x00\x00b\x17P0\x00\x00b\x17P0\x00\x00b\x173\x15,p\xa0\xaa\xa2\xfa\x18O\x92\xc2\x99\xba\x8a\xba\xceH\x19\x00\x00\x004\x98\xa8`A\xb7\xb7\xb3\xbb\xb3\xae\x0aK\x98\xe0\xf5\x9c\xee>Yq2R\x16\x00\x00\x00\x16\x13\x15\xac\xcb\xdd\x8d\xb7\xbc\x1bw\xbd\xceT\\#;*\xf8Hy\x00\x00\x00\x18LT0D\xf5*\xe8\x0e\x20\xe4=@wTB'\x0c\x00\x80;\xc1L\x05\xc3\xf4wW{\x05\x84\xea|\xf4/\xef\xfe\x08\xe6\x00\x00\x00,\xa6*X\xd0\xedv{HO\xecX\xe5\x00\xde\x0ex\xea\"\xe5\x00\x00\x00`0U\xc1P0\xd0^M\"\xf9\xbc\xc7\x1b\xec\x0fx\xdd\xd5\x912\x00\x00\x000\x98\xab`\x98\x81\xea&\xbc\xbd\xe6\xc5\xdd\xb1\x16\xaf7\x925\x00\x00\x00\x83\x89\x0a6\x20\xd0\x973n\xfa\xda\x7fM@\x95\xc7\xc2f\x00\x00\x00\xd0b\x9e\x82\x09\x95b\xf8\xfeL\x05V\xb0A\x92\xea\"\xb7%\x01\x00\x00F\x8cy\x0a\x86\xaa\xe8\x14\x0a:\x8a\xect\x07\x11\xe2\xab|\x91\xb2\x00\x00\x00\xb0\x98\xa8`]\xee\xa6\xce\xeeN\x1a\xc9\xefr\x9f\xec>S\xe9\x85\x09\xad\x00\x00\xdc\x11&*\x18\x0a4UW\xd4\xb5\x90y\x14\xe8t\xb5\xc7{Z\x88\x94\x01\x00\x00@\x83\x99\x0a\x06\x00\x000:@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]bK\xc1\\.\xbd$\x00\x00\xf7+&+X\xbb[z4~\xc0\xeb9\x10\xf1\x09\xad\x1fs;u\x92\x84z\x8e\xe3\xcaQ9\xde\xd6\x0f\xcf\xa6\xd0k\xe3\x16\xe1\x17\x176K\xeb\x09c\xa7\xe5\xb8\xe3p\x98w\xef\xd0\xd9\xe8\xc0\x07\xab\xc1/5\x1c\xc7\xea\xf7\x8b\x1c\xd7\xa8\xfcq\xeeG\x8eY+[\x97|0,\xafH-k\x1b\x81\x17Gd{w\x8d\xfa\xd9\x8b\x0e\xfb\x8f\xa2\xf28%\xed\x81\xc3\x7fX\xe3\xc3D(\xc3\xfd\x83\xb9\x0a\xc6W\x1c\xab\xa4\x89\xee\x0a_\x97\xaf\xa2;\x82y\x91\xfd\x8aN\x92\xc0\xbf\xcb\xed\xbe\x8e\xae\xbf\xc5\xbd\x1b\xf6)\x89\x1d.;\xde^\xf2\xfbk9\xa3K|8\xcdi\xe1\xae\xe3;t\xa6\xd2z6\x92\xc5p.\xa5\xbd\xd5\x87_\xfa\xde\x9aq\x89\xd9{\xc5o+\x97\xd3gm\x05\x87\x1a\x9f3\x96\x9e>\xff\xf2r\xa4\x87NqX\xbfa\xb8\xabF\xcds\xd4\xba\xd2\xfa\"Y\x8d\x04\xed\x81\xc3\x7fXw\xd7\xea#\x81\xf5\x1b\xa9\x0c@41W\xc1\xbcM\xddT\xc1\x84*\xb2\xc6\xc7\xb1\xaa\xf0_\xca=\\\x89NR\xe4\x02w\x1co[\xb9\x0b(,\xe5v\xf1\xb5\xe3\x0e.6\x14\xa9\xabpG\xce\x14~P\x18\xc9B\x87%b\x17\xb3~\x89v\xb7]Q\x9a\xd5yd\xeb\x0a\xd3y*\xd0W%\xdd\xe2\xd8G\xa2`w\xd3\xa8}\xb8/)\xf4G\xb2\x1a)\xec\x81#|Xw\xd5\xea#@\xe37\xd2\x09\x03D\x11S\x15\xac\xdd\xc3\x07\xa8\x82uV\x90\xb3\x99\xaf\xe8\x0ck\xeeR\xfb].m\x17ll\x15,\x12w\xe7l\xd9\xdd\\K\x85e\xf4\xa5,$\xaf\xaa4s\xa9\xc19\xee\x102\xc2@\xc1t\x8b3f\x0a\xd6\xc3Es\xa0u\x07\x07\xbe\xabV\x1f\x01c\xe5\x17\x88\x84\x99\x0a\xc6Wt!Q\xc1\x9a\xf6\xd3\x1d\xfb\xc3.\xf5\xd1k\xdb\xaa\x93\x94`\x14\x8c/\xcc\xb4e\x15\x9c\xc3\x7f\xbe\xc4\xd9\xeaK\x16\xa4\xad\xa6C\xae+E\x99\xe9\x85\xaea\x17[\xe3\xca\xb4\x05%X?\xcf\xd98\xae\xac\xa7h\xae}\x8d\xe6\x1b\xb4/\x8d\x13\x87d\x82\xc3\xf6jVf\xeb\xd6Yy<\xf1[\xe3\xcaJ/\xe81p\xc6\xda2\x87`\x8as\x98\x13YF\xde\xf7\xaf\xce\xb29~\x94\x854\xa8\xb5`\xd9)^(\x85;Y\xbfXi\xb6\xba2\xc5\xe2\x14fR\x0do\xa6\xbbk\x97\xa5-\xa9\x153\xf6\x14:\xf01\x88\xecc\x05\xdb\x8a\x8fl\xff\x8c\xf1\xa0)\x0e\x83\xbdDn\xbeh6\xea\xa0C<\x9a\xd8\x8d\x96\x0bi\xf0\x01\xe8\xb7\x03[!\xf5\xc0\xca\x87E\x88\xd4\xea\x06\xce\xe4\xe20\xd945fZ]\xc9\xc6\xfa\xd5\x94A\xc7\x19\x10e\xccT0o\x13\x92\x14\xacN\\(\xf2X]8s\x97\xed\x92NR\xe2\x02\xd7<00\xd0L\x14\xac\x99s\xb56\x16p\x1d\x08}\xdch\xe3\x1c\xe553\xc8e\xdf3kA\xfd\xe1\xd5\\\xe8\xc5\xe6\xe2\xb66\xd78\x96\x09h\xa0\xb11k\xc1\x8c\xac\x92\"\xaeW\xe3\xf8\xac\xdf/\xf6DZgq%y\x9cc\xb7\xa3\x86\xfa\xcd\xda]\x9e\x95v\xc1\xc0\x19c\xcb\xece\x8a\xc3\x7f\xe0_\x90\xe7\xf7\xfb\x89\xe8\x9c\xe5\x8a\x1a\x8f\xd7;8\xed\xd8C\xad\x05K\xfd\x0fPG\xd6\x07hY=\xeb\x17+\x0d\xb7\xac\xb1q\x09)No\x16\xb7\xa6\xbccP,\x8e\xbd\xac\xb9\xcc^D\x92\xadi\xcb\xde:^No\x03`\x05\xbbR\xc4\xd5t\xb0\x1e\xd8\xe2\xb0\xd8\xb9E\x8d\x87\x1d\xa4\xf9\xa2\xda\xa8\xe7\xfc\x8d\\\xb9\xdfO\x15C)\xa4\x81\xad~;\xb0\x15b\x0e\xac|X\x91[\xdd\xc0\x99R\x1c&\x1b[c\xb6\xd5\x95l\x1a\xbfl\x19t\x9c\x01Q\xc6D\x05\xeb\xf4\xf0\xb2\x82U\x9e\xa4{NV\x861\xef\xb5\xbd\xa8\x93\x94\xb9\x20}\x0d\xe2\x8b\xb8\xbf\x91|C.y\x8e\xec\xb6\xa7c\xa9+r\xe0\xd4\xca\x05x\xaf\xb0$\xe4bk\xe6\xde\xa5\x7f\xd1/\xcde\x1c\xe93\x0d\xbf\x15\x20\x9d\x90\x99E\xd8\xfc\xb08\x8d\xc3>\x17\x9b\xf5e-7r\xc6\xd8\xb2\x87P\x8b\xc3\x8c;j\x1d\xe4r\xa8\x9d\xa5U0\xb6\x16*~\x07\xdai+A\x0e\x7f\x88\xdfE\x03X\x02\x16,\xc7\xc9\xbe\xdd\xcbm\\:\xd9y\x9cvK\x8fs\xcd\xf8\xad\xac5\xd8`\xb0\x91\x84\xce\xb1\x82\xd5\xd8\x9b\x893m\xe5uG\x91\x0e\xdcSs\x91\xf2F\xb9Q\x95Q$SH}[\xfdv`+\xa4\x1dEJ\x1fV\xc4Vg`\x9c\xb1\xc5a\xb2\xa9I\xc6\xaf\xa6\x0c\x1a\xbfR\x19\x0c\x9c\x01Q\xc5<\x05\xe3+:\x05A\xe8\xae\x14\xf0\x95['\x0e\x1f}\xe1\xfa`/\xd9zu\x922\x17p\xaf\xa2\xa3\xa3\x86\xc6\xc1>\xab]3w\x16G\x83\xddv\"7$N\xd3'N\xb3(\x0b\xb9\xd8\x0a\xe7\x0e\xe2B\x08Ytr\xc22\xfb0\xb7\x14Y\xc1\x1aq6\x1e\xed|\x9e\xec\xa2\xc3\xb8Z\x8e\x9e\xbd:\xce\x18[\xf6\x10Jq\x10s\xce_\xca\x9c\xfbR\xfd9a\x10iaj\xa1\xd2\xcb\xf5\xe7\x15\xad\xec'\xdd\x14\x8d\xdfW\xc9\x9bRq\xd0@\xeb\x1ar\xd5\xb8\x16\xd1\xbf\x16Q\x15U\x87a\x05\xe5e\x92|h+\xaf\xab`jy\xa3\xdb\xa8\x8a\x821\x854\xb0\xd5m\x07\xb6B\xba\x0a\x16\xb1\xd5\x19\x18glq\x98lj\x92\xf1\xab)\x83\x9e\x82\x198\x03\xa2\x8ay\x0av\xd1-\x13@M\xe2\xac02\xac4\xe2\x0a=\x07B\x93\x0aL\x1c\xac\xc3\x91\xb5\xf3\x90?O\xbc\xd8\xc8\xb9DN\x9c\xb3\x9c\x1f\xa1\xe1A\xe7%R\xd7\x8d~\xc5/\x1b\x16\x1f\x11\x91\x15\xec8\xea\xb0!I\xc1\xe8.?G\xef\xa1\xeb8cl\xd9C(\xc5A\xec9\xdfW_\xb8\x08\x0f9\x91\x06\xb6\x16*\x82\xfdB\xda\xb9\xb4\x0b6A\xc7/-N\x07\x1d\x9a\x09+\x0bp\x07\xa9\x80f)XN&\x90\x0d(.\x0a\x1c3\x16\x89\x87\xd6V\xde0\x92O\xcb\x1b\xe5FU\x14\x8c)\xa4\xbe\xad~;\xb0\x15\xd2U\xb0\xc8\xad\xae\xc28c\x8b\xc3dS\x93\x8c_M\x19\xf4\x14\xcc\xc0\x19\x10U\xccS0!Hh\xf7\x04\x83\x02\xeat\x93\xa1\x03\xef\x0es/r+\xd7\xa3\x93T`\x14l\xd1r2\xee(\xd4^l\x9fq\xb5\xe4\xef\xd0\xa0s\xd1\xdc\xb3\x14\x12\xd66\xbc\x9f\xc4(\x98]V0z'\xa1\x9e\xa3#\x1e\x1dg\x8c-{\x88a\xd7R}/\xd6\x01\xd2\x9f\xebk\xb4\xd7j\x0e\xca\xd6\x82a\xc1[\x99(\xabf\x01\x0a\xf1K\x83\xe2\xa48\x99/Q\xb32l\xe1\x9aK\x93s]\xa4]\x98>\x98\xe3B\xef,\x1a?\x1a^yR\x1c\x16\xb5\xbcQnT\xb5\x0f\xa6\x16R\xdfV\xbf\x1dZ#\xf5\xc1\"\xb6:\x03\xe3\x8c-\x8e\xae\x821~[\x87\xf5\xc1d\xbfr\x1fL\xdf\x19\x10U\xccS0\x91\x804\x1f\x8c\x0c#}a\xe6\x83E\xe8\x82\xb1\x0a\x96EN&a\x89\xf6bC\xcb\xb3\xf0\x10\xab\xc7\x1er\xb1\x1d\x17\x835e\xb4\x03t'\x0a\xe6\xc0\xd7\x15?\x97N\xbe\xd2s\xc6\xd8\xb2\x87`\xcf\xe3<\x9c\xf9\x0ay\xaf\x9c\x16\x1d\xe5ic{l-\x18\xd6\xac|\x0e\x15\xae\\\x8dB\xfcf\x91\x88\xcc\"\xec\xd1A\xaa\x89\x04R\x95fj\xd0H\x06\x94\xfd\x99y\x838\xbd\x95\xe8.\x99M\xd1l\xeb\x08\xf1\xa0\x16\x87E-o\x94\x1bUQ0\xa6\x90\xfa\xb6\xfa\xed\xc0VHW\xc1\"\xb6\xba\xbe3\xb68\xba\x0a\xc6\xf8\xd5\x94A\xe3W*\x83\x813\x84zw\x8f\xfc\xc7\x0b@\x04\xccU0!\xd0\xee\x09\\CtN\xfe\xc5\xb0s\xf2K\xd4~W\x89N\x17\x8c\x9d\x93_\xce\x15\xd6\xee^\xc69\xde\xea\xb8\xe2\xb7\xb9:\xd0Y\x97\xcd\x7f\x05]H\xcb*/K\xe7l\xef^\x10gq\xd7\xf8\xfd\xbd8\xe3N\xee\xf9\xc6Cd\x02\xa8\xd0A\xef'\xf5\x868\x1e\xfc\xc0\xef\xb7\xbb\xfc~\x1e]H\xaf\xe9o\xb4\x9d\xeb\x7f>\xef\x12\xa27\xff\xea\x17\xa4\xf7\x20}g\x1a[e/[\x1cr:\xd7\x1c\xcaK\xbbD\x14,\xad\xac\x19\x1b\xb4j\x0e\xac\xd6B\xb3{+\xb7\x1b\xbd\xc5\xd1\x8bF\xf1K\x8a\xb3\xa6\xa3u%)\x8e\x83\xcb,;\x8e\xfd\x92&*\xe2v6\xef\xe4\xc4{\x91\xf6E\xb5\xcd[\xb9z2'\xdf\xf5\xc1`\x7fAf\xebu\x8d\x07\xb58*ly\xa3\xda\xa8\xe2\xbd\xc8\x0e\xfa}\xa5\x14\xd2\xc0\xd6\xa0\x1d\x94\x0a\xb1\x07V?\xac\xc8\xad\xae\xefL-\x0e\x93M\xe3\x81i3&\x9b\xea\x97-\x83\x9e3b\\\xc0\xfd\x08\x01Q\xc2\\\x05\x0b\x900X\x15M\x1d\xa8\xf0\x86\xf9]\xe4\xf5\xb4\"\x9d\xa4\x0a\xfb\xbbH\xa1f\x81\xddQX\xbf\xc0\x96\xf7\"\xfe\xdbv\x81L\xd0\xc1\xfd\x9b\x9e\x82\xf4\xb9%\xef\xdap\xd2%\xc52\xe87\xfe\xf1\x00\x83vP*\xc4\x1eX\xf9\xb0\x88A\x84V\xd7w\xa6\x16\x87\xc9\xa6\xf5\xc0\xb4\x99\x9aM\xf5\xcb\x96A\xcf\x191\xaew\x84\xfb\xf5.pG\x98\xab`#\xe6U\xeec\x9d\xa4yH\xe3\x04\x00\x00\xcc%F\x14l\xa2=V\x07\x14\x0c\x00&\x041\xa2`\x13\x0dP0\x00\x98\x10\x80\x82\xdd\x05b`V\xe6\xcdo=\xc4\xf2\xad7\xc3\xe4\x04\x00\x20\xaa\x80\x82\xdd\x0540\xdb+\xa6\xff\xa8\xd5/\xaaa\x7f\x0c\x9b\x1b\x00\x80\xa8\x01\x0a6J\x86\x0b\x18\x96\xb0H\x99\x00\x00\x88\x0e\xa0`\xa3\xe3M\x1d\x01{\xe8!\x18H\x02\xc0\xf8\x00\x0a6:\xf4\xba`\xd0\x09\x03\x80\xf1\x02\x14lt\xe8\x0a\xd8C\x0fE\xca\x06\x00@T\x00\x05\x1b\x1d\xa0`\x00`&\xa0`\xa3\x03\x14\x0c\x00\xcc\x04\x14lt\x80\x82\x01\x80\x99\x80\x82\x8d\x0eP0\x000\x13P\xb0\xd1qo)\x98wf0\x92\xc9\xb8sm\xa67\x92\x09p\x1fc\xb2\x82\xb5\xbb\x95\xd3\xd3\x17~\xb1\xc8\x11\xe3\xb1Z\xad\xc5\xa8\x18o+\xc2X]\x8c\xb7N\xc3/\xb9\xd8,\xb1+\x8c]$\"+X\xbe5\xae\xda0{\x08\xbb\xacqU\x91ld\xc6\xa0\x9e\xdb\xb0\xc3\xc848\x9dG\xc2\x1a\x1ct:\x9d{\xd1^\xbc=\x18\xc6\xea\xd3l\xe7*\xfc\xf2\x0a6\x9b\xffi\x18;\xb4-n[\xb8\xb7\x81\xfb\x1bs\x15\x8c\xaf8&/O\x14t\x9f\x0ck:bx\x8fu[\x10\x05\xb7Y=\xc3W\x1dbh\xc9M\xc0\xdbn\x9fo\x97\xb5%\x9c]\x04\"+X\xc0\x17?\x12]\xa0\xf0G\xa7\xeb\xdb\xfaN\x0f\xdb\x15\xfdz\xee\x8a\xf3D\xb0\xa0\xdch[\xbfW\xf7\x8d\xb6\xf3\x92\xc1A\xe7\xde\xcf\xd1\xe7\xef8\x0f\xde\xd0\xb5\x13\xb9\xfd\xf3W\xb2\xf1\xcb\xef\xdb\xda\x1a\x9c?\x0fc\x87{\x86\x8f\x96\x86}\x1f\xb8\x9f1W\xc1\xbcM\xdd\x92\x82\x05\xaa\xa3\xa5`\xa8\xddz\x00o}\xd6\xf6\xf0f\xc5\x09\xe2kK\xc4+;\x1c\x91\x15\x0c\xa1\x84\x11+\x18B\xf3\xf4m\xa7/\x1e\xbe/\xda\xf5\xbc\x18\xbf!\xbc\x81\xc2f}\x05[\xbfEJ|\xe4<\x85\xb7m\xce\x8ft\xcd\x14\xf6f\x8b\xaf\xe7#(\x18\xda\x94\x10\xe6\xe9\xbd\xc0\xfd\x8d\xa9\x0a\xd6\xee\xe1\xc5\xe7\xe4#\x9f\xdbW\x11\xc3\x0a\xf6\xbf\x7f\xf7_\xff\xf5\xeb\x7f\xfc_x\xfb\xbb\xa7\xc6D\xc1R\xc7A\xc1r\x93\xc3v\xe6\x18\x0c\x14l\xed\x16)\x11m\x05\xe3\x93s\xc3\x1b\x00\xf7/f*\x18_\xd1%\xad\xf4\x81\xfayy\xd5[]\xaa\x95\x98O5\xe2\x17'\xc7\xa7\xcc;\x83\xf7\x9ey\xd4j\xdd\xd4\xb5tj\xe2\x9cA\xd6\x98\xb9\xb2U\xdb|k\xbc{\xdd\xb4\xc4\xd9\xf4\xcb<\xb04y\xca\xc2\xdcaWv\xe5\xcc\xc4i\xebx#\xbf\xdd\x93\xad\"\x93\xd9\x0e\x81\xa8`o\x92\xb6x\xea_\xc9\xf6_e\x05\x93\xbda\x05\xcb\xcfM\x9e2\x8fF\xa1\x8e\xceN\x89O\x9a\x93B\xb3\xeeJML\xdd%z\xe9Z\x98\x14\x9f<\x87>\xc6cA\xc6\x83W:p*\xd2\x10\xe5z\x0eL\x96\xbb`m\x9bWd?\xb3y\xc5m\x9c\xbc\xdd\xb0~\xfe\xda\x86\xdbt\xf7\xa7[\x9e\xc9\xce\xd9\xfc{D\x15\xecu\xa7\xd3\x99\x8d\x07\x89\xb7\x0f\xae\x9f\xbf\xea\x8d[\x08\x9dp\x8a\xacG\x1a\x05\xbb\xb1%'{\xc5f\"e\xaf8\xb3\x0f\xbe\xb1j>u\x80~\xbf=\xe7\xe9-\xaf\x84*\x98\xe2\xec\xa3l\xa7s\xcf\xa7\xdbWdo\xfe\x82\xbe\xb1)\xb1\x1f\x01\x80\x1ef*\x18Y\x1e2\xa0,\xd3\x1dN\xc1\xf8\xa3\x937\x05Qp\xd3\x94\xa3<\xbe\x9es}\xd5\xf3\xe2\xf0\xe5\xd8_]\x95\xf2\xe4\xe4\x94uK\xad\x9aAF\xbb\xd5\xdb\xdf\xdf\xbf\x9f\\\xd9\xaamg\xd5\xa3\xd6\xa4\xe2\xd2\xc9\x0b\xb1A\xd7\xe4i\x1e\xeflk\xe8\x95\x9d\x1b\x97\xef-MJ\x15\x0c\xfc\x0exJE<\xecR\x85\xa2\x82=\xfc\xe6\xd0\x7f\xfc\xe3C\x0f\x7f\xeb\xd7C\xff\xf6\xb0\xa4`\x8a7\xac`\xd6\xd4\xaa\xaa\xd4D\\\x9e\x93\xd6\xa5\xd5M\xee$+Q\x8c\xdc\x84M\xdeM\x09K\x89\x13_b\xea\xb6\xa6b+\x89\xf6`\x05\x0b,\x8d+ma\xcb\xc3\x1f\xf3=\x99\xe1\xf3\x85\xde\xea\x88r=O[}\xe2\xfb\xbf\xfc\xfe\xf6#\xa7\x0e>\xe3$\xe2\xb1#{\xcf\xa9=\xd9\xdb\xc9\xee\xb6\xf9\xeb\xdf9\xb5\xd7\xd9\x80\xa8\x82\xfd~\xbb\xb3\x81\x84\xbdv8_?\xd5\x90\xb3\xf66\xba\xd1\xd6\xb6jc[[\xdbo\x10U\xb0[\xb7n\x9d\"\x0av\xc2\xb9\xa3\xed\xc8f'6\xfd\xe8H\xb63g\xef;\xf3\xb7`\x83O\xe7\xaf:xb\xb33T\xc1\x14g\xb7\x8e\x1cY\xb1j~\xce\x1b\xdb\xbf\x7f\x95\xbeq,R\xff\x11\xb8o1Q\xc1:I\x08zd\x0a\x86/;2\x8cZL\x06\x13|5\xe9\xd8\xa4.\xa4\xbbS\xad\xb3\xf9\xd0u\xea\xdb\xa5.K\xbb\xd66a\x0a\xbeN\x97&\xe1T\xc6T\xbcWH\x0d\xb9\xb2\xbdV\x0f\xfd\xab\xca\xc8o\xf0\xa2\x88f\xc2\x81\x14\xf7zj\xe8\xd7\x0f}\xeb[\x0f\xfd\xdf\xa1\x7f\x94\xe2`\xac\xb7\x84i\xb8\x07\xd1?u&\xeev%\x11\xed\xda5\x05\xeb\xda\x01\xda\x83:`\xdd\x8f\xdfJ\x99\x83Eq\xa0\x9a,\xda\x84\x15l[\x82wxytG\x91Q\xad\xa7\xd7zQ4l\xc8!\xda\xd5\xf04\xeey\x9d\xa2\x9d)\xba\xbd\xb5b3\xee\x1c\xdd>B\x82\xf3X\xc1\x1a\xb2O\x10\xdb\x13\xf4v\xe3y\xf1\xe6$3\x8a\x14\xc1\x0av\x8bd\xb8-\xbe\x93\xfd4\xee\x7fm\xcf\xc1\xa9\x8d\xab\x88\xaf\xb5!\x0a\xa6u\xe6\xdcx\x03\xdd\x96n\x05t[G|;\x17\xb8\xcf0O\xc1\xf8\x8aNA\x10\xba+\x05i\x91\xc8\xf0\x0a\xe6K\xe4\x11\x9fH{\x09\xc1]s\xa6N\x96\x86T\xa9:1\xdevkiKKK)\x8d\x0f1\xb6\x09D\xfeHP\x88\xb7\xba\xc9\xdf\x9bB\xae\xec\xc5S\x07\x061)\xb9\x06~/Ze\x86\x8f\"\x1f\xfa\xfb\xa1??\xf5\xe7\xa1\xa7\x86\xfe\xfc\xb0\xa4`\xac\xb7\x04:\xc3<\x05\xbb\xe8\x96\x11WY\x0b\xaf`\x83Iu\xa8.\x89\x88]Kr\xca\x86:_\x86\xa4`\xd3\x87\x9b2\xf1!\xd6\x96\xc6\xd3\xc9\x95}R\x1c.\x85F\xb8S%}Zh\xe4\xd7\xe7\x15\xf1\xb1;%\x05{\xe8\xbf\x87\xfech\xe8\xd7C\xbf\x93\xfe\xd4x\x13#\xf9>\xebi\xb2,\xf9\xe2i\xd6$2\xbfi\xe6<\x9a\x7f\x0e>P\xa9U\x8d\xf2\xccK\x9e\x20\xc6Z6\xd1\x09\xe0z~u\x91\x15\xec\xcd\xa1\xa1?\xffyh\xe8\xdfd\x05c\xbd%\xa4\x900\xd7\xb4\x0c|xZ4\x94\x91O\xc2Nd`TE\x86\x8c|r\x06\x19W\xe6\x13\xa1#\xb3)\xf6\xc7\x93\x12i\xca\x93\x813\x07\xa5`P\xf76q\xb8\x17\xedz.\x9e*~\x95\xec\xa5\xfa\x836\xd2\xa1#\x89I\x1d!;n\xe4l$j\xf6\xfa\x1bH\x9cMq*\x9b(\x9ah\x80\xf6\xd0\xe9\x15\x1b7\"\xf49\xd9\xc1(\xd8\x8a-\x88D\xbc\xb4\x0a\x86\xd6\xaf\xc0*\xf5\x9b\xec\x10\x05\xd38c\x15L\x986\x07\x01\x80.\xe6*\x98\x10h\xf7\x04H\x00\xbb?\x10\xf0\xf8\x02\xe1~\x94'$\xcfN\xa6WX\xb1u\xf1\xaem\xa9x(\xd62\xd8B\xef\xd1]\xd4\x1a\xb2s\xd5U\xdb\x80/>\xb7\x05\x9d\xce\x8d\xf7\x05P{bJ\xf1\xa6)q\x8fz:\xc5\xb9\xea\xa5>\x1f\xe9\xddl\xb0.\xae\xf6\xe6Z+\x91\xbe_}d\x05\xfb\xd7\xa1\xa1\xff\xf3\xefCCO\xc9\x0a\xa6z#\xf7\"\xe7\xb44\xcd\x9cr\x91\x94=\xb1\xd8[\x97K\x87wK\xe36x7\xc4\x89\xf7\"\x1f\x9b\xe6\xde\x9fo\xad\x20s\xf2s[\x06\xf89\xc9\xbe\xa0\xc6\x03V\xa4\xd2\xba\xd9\x89b\x1fl\x9e\x95^\xcfQ\xafgW\x9c8\xf5}\xafs\xfe\xde\x13'v\xd0\x91\xdev\xe7\x9e\x13{\x9c\xe2\xbd\xc8\xecU\x0d\xa7^w\x1e$s\xf2_\xf9\xf9\xed\x1b\x9bs\xda>\xc7r\xf3\xfd\xedG\xb0-\x95\x9e\xbd\xd9\x0d'6\xce\xbf\xaa\x99\x93\xbf\xd7\xb9\xa5a\xefZ<&\xfd\xf9\xd5\xb6l\x9c\xed\x97\xafd\xb7]E\x1f\xcd\xcf\xd9\xbb\xe7ig\xf6\xc1\x8f\xd0U2'\xbf\xa1\xad\x8dD\xbd\x14g_\xfc\x82\xde\xd8\x94\x7flT\xcatR\x01@\x83\xb9\x0a\x16\x20a0\xd2\x179)F\xc4\xc2\x8d\x15J\x13\xc4\x0bL(}2!i\xb1gj|\xc6\x998\x1a\xd0\x09\xf9~V\x7f/\xe8fl\xc9$\xab\xf8\xf6D\xbc\xc5\xfd\x9f\xaeyS\xa6\xae\xf3<\x8a\x93\xb9RP\x88vE\x0ed$M\xc9\xd8\x8f\x90\xbe_}d\x05\xfb\xfb\xff\xfa\xef\xa7\x9e\xfa\xef\xdf=\xac(\x98\xe2\x0d\x8f\xf1\x8a\x17ON^J\xa2}\x95\x19\xc5)\xf1\xc9\x194>%\xd0\xf9`b\xb7\xa7kq\xca\xe4\xe9u\xe4w\x91Vk\xdc\xc9*\xbc\xdd\xa4\xf1\x80\x06\xf2\xa7$fHq*O\x12\x8d\xd0G\xbf\x9e\x9b\x1e\xa3\xd1\xa6\x83\x1b\xf7\xae\xc8\xce\xd9HCU\xb7\x1b\xd6*\xf3\xc1~\xb3%g\xfe\xfa\x13\xf4w\x91N\xe7/\x8f\xe0\xcdO\xf0\xdeS\x1b\x9fyz#\xed\xb4\xa1[\xaf?\x9d\xbd\xf1\xbc\xf6w\x91\xb7\x1bVe\xe7l?\xb8*{#\xf9\x01d\xf6\xaf\xe6\xe3-\xee\xdc}\xba\xf9\xe9\x15{\x0ef\xe3\xe4\x0e)\xf8\xb5\x051\xce>b\x02b\x08\x1dM\\\x87\x00@\x1fs\x15,\xf6yH\x9fH\xd9&&\xeb\xe2'\xe2\xa4\x85\xaa\xf8\\\xcd\x8ce\x00`\x00\x05\x1b\x1d\xf7\x94\x82\xa1\xd2\x94\x09\xf8t\x9ddx4\x05`\x0c(\xd8\xe8\x10\x05\x8bi\x91\x98V0\x00\x885@\xc1F\x07(\x18\x00\x98\x09(\xd8\xe8\x18>\x80\xfc\xea\xc3\xa0`\x000^\x80\x82\x8d\x8ea+\xde>\xfc7\xff\xe3aX\xf1\x16\x00\xc6\x09P\xb0\xd1\xf1o\x0f\x85\xf0\xb0\x05K\xd8\x9b\x91\xb2\x01\x00\x10\x15@\xc1FIh'\xec\xab\x16\xcb\xdf\xfcO\xf8\x0d\x0c\x00\x8c\x0f\xa0`\xa3\xe4\x8f!\x12\xf6UK\xee_O\xe9\x04\x09\x03\x80q\x01\x14l\xd4\xbc\xa9\xd1\xb0\xafZ\xeaNZ\x92;\xe1\x99\xa2\x000\x1e\x80\x82E\x19\xdeR=t\xcc2\xb5\x0b$\x0c\x00\xc6\x01P\xb0(C\x14l\xe8\x80e\xdaE\xf6Y\xd4\x00\x00\x8c\x0d\xa0`Q\x86\xb7T\xfdeh\xa8\xce2\x1d$\x0c\x00\xc6\x1eP\xb0(\xc3[*\xb1\x82\x0dUZ2\xbaA\xc2\x00`\xac1Y\xc1\xda\xdd\xe2C\xe1y_u\x85\xf7\xcc\xbd\xf0\x08\x02\xde\xe2\xf9\x92H\xd8.\xcbl\x900\x00\x18k\xccU0\xbe\xe2\x18}\x80\x1f\xef\xf1\xb6w\x9f\xf4\xd4\xdd\x03\x12&+\xd8\xd06\xcbB\x900\x00\x18c\xccU0oS7U\xb0\xa6j\xf2\xa4\xbfkQ[\xb6\xdbDxK\xc5\x97\xa2\x84m\xb2,\x05\x09\x03\x80\xb1\xc5T\x05k\xf7\xf0\xe2s\xf2\xeb\xc4'\xeb\xf9\xbca\xcdc\x02\xde\xe2\xfe\x93\xa8`C\xeb,\xf9\x01\x900\x00\x18K\xccT0\xbe\xa2KZ\xe9#\x20>\x01\xfe\xd8D|D\xe8\x1d\xc2[v\xfd\xe9\xcb/\xc5\xd6\xc9\xb5\xac\x03\x09\x03\x80\xb1\xc4L\x05\xf36\xb1k\x15!$Ti\x96b\x8cM\xb0\x82\xfd?\xb9\x136\xb4\xd0\xb2!x\x0f\xc4\xf6\x00`\xc2b\xa2\x82uzx\xad\x82\x1d\xf3\\3\xb6\x8e\x15xK\xa9@:a\x7f9v\xf4\xe8Q\xdfc\x96b\x900\x00\x18;\xccS0\xbe\xa2S\x10\x84\xeeJA\x90v\xb4\xb8\xb5+\xba\xc6&X\xc1\x06i',\xc5\"R\xca\x0b\x08\x00\x80\xb1\xc1<\x05\xbb\xe8\x96!\xeb\x90\xa1A\x9f\xbb3R\x96X\x00+X?\xfaS\xc5\x97CM\x969\x9b\xb6m+u7\x05A\xc1\x00`\xac0O\xc1\x84\x20\xa1\xdd\x13\xa4W8\xef\xad\x0cD\xca\x11\x13\xf0\x96m\xfc`\xb1e\xdb_\x86\xe2\xa7\xec\xef\xbcx\xb1;8`\xb9\xe7\x88\xd4\x08\x000^\x98\xa7`\"R\x1c\xecZU\x1d\x8fE\xed\x1ex\xa0\x03Q\xb0u\x96I\x7f\xfb\xe5P\x95eW`\x00\x0f\x94\x91\xe5\xe6=\x06(\x180a0W\xc1\x84@\xbb'p\x0d\xa1\xee\x8a\xaa\xee@\x20po\xcc\xa6\xd8\x96k\x99\xb6\xc1\xb2\xeb/\x7f\xf9\xdb'\xdb\xe9\\\x0aP0\x00\x18+\xccU\xb0\x00\x09\x83U!\xb4_\x8a\x88\xdd\x133Z\x13-\xa9\x9e\x96i\xd6/\x87\xb6Y\xaa\xe9\x08\x19\x14\x0c\x00\xc6\x0as\x15\xec\x1e\x84\xb7X\xa6W\xb6_k\xb2x\xfe\xf2\xa5e\xe1E2\x95\x02\x14\x0c\x00\xc6\x0aP\xb0(\xc3[\xe6Uw\xf2\x02?\xcd\xfa'\xde\x92\xd1I\x86\x91a\x14L\xef\xad\x08\x82\x17E=\x8c\xecJ\xdf\x02\x14\x0c\x980\x80\x82E\x19~\xd3Q,`h\xe0\xc0\x03\x93,_)\xee\xba\xd7\x14\x8c\xee\x00\x05\x03&\x0c\xa0`Qf\xe0Z\xb0_\x9c\x1e2}v\xe9\xb1k\x11\xe2`\xa0`\x000*@\xc1\xa2\x8d\xf4\x1b\x03\x81\xbf\xd8\xdeu\x8d\xfe\xa2\xc8\"+\x01I\xbc\xf6\xb8e\xd2w?\xc1\x7f\xbc\xfc\xc8_?\xf2\x02\xd9\xff\xe3\xaf[\x1e\xf9\xe1\x1fH\xe2q\xcb\x83/S\xab\xf7\xbf3\xe9\x81\xef`#\xcb\xb3\x0fZ\x18\x03%\xcbM\xc6\x91b\xfb\xc2#\x96\xaf\xff\xf4\xe5G,O\xfc\x8cu*\xf1\xb3Ix\xf3]\xfc\x7f\xd2\x87\xea\x9b8\xcb_?\x82\x8fH|X\x1e\x7f\x0d'\xc8\x8e\x17nj\xcar\xf3\xa7_yA\xc9Bg\x83\x81\x82\x01\x13\x07P\xb0\xb1B\x18\x18\x18\x10\xc5L\xa3`_\xdbw\xf9\xc3\xefb)y\xfb\xc1}\x97\xf7\x11}\xfa\xe9\xdf\xfd\xf4\xf2\xfb\xdf\xfc!\xde\xf3\x95\xb7/\xbf\xffO\xd4\xea\xef\xf6]\xfe\xed?\x7f\x0f'\x9f\xf8\x905\x90\xb3P_\xb2#\xd5\xf6\xfd\xcb\xff\xf2\x00\xd9|\x93\xc9\xa3\xf4\xa2\xbe\xf6\xde\xcd\x9fY>\xbc\xf9\xde\xd7\x987-\xd4\xe1\xdb7o>\xfe\xec'\x7f\xf8\xe9\xb7\xb1N=\xb8\xef\xb7\xfb\x1e\xfc\xb1\xa6,x\x1f\x9b\x85\x1e;B\xd5\x01`\xdc\x00\x05\x1b{4\x0a\xf6\x1e~\xfdO\xdc!z\xe2\xc7\xa4\xa7\x83\xf7\xfc\x03\xd9\xf3\xe1#7o~\xe3\xb5\x9b\xb2\x15\xe1\xb7\x0fJ\xd6\x8a\x81\x92\x85Z\xc9\x8e\x14\xdb\xf7o\xde\xfc\x84n\x1e`\xf2(\x0a\xf6\xcf\xcf\xde|\xd6\xf2\xf2\xcd\x1f\xfe3\xf3\xa6\x85:|\xe2\xe6\xcd\x07>\x14\x8d\xbeAw|\x83-\xcb\x0b_\x7f\x9f-\x03(\x180\xb1\x00\x05\x1b{4\x0a&'&\x91\x91\xe4'$!\xfeP\x07\xef\xfcDV\x8d\x9b\x1f~{\x92\xb8\x8b\x8c\x03\x15\x03%\x8bd\x15b\xab\xece\x9d*\xbc\xfd\xcd\x9bO|\xef\xdb7\xbf\xf1v\xe8\x11?\xc1*\xf8/\x93\xbe\xf72\x11\xb1I\xf2\x0e\xa5,?\xfc\xc6oo\xb2e\x00\x05\x03&\x16\xa0`cOx\x05\xb3H\xfd\x1fq\x8f\xf8\xe6\x13\xff\xf2\xe1\x1f\xfe\xa0\xe8\x85\xc6`\x98\x82im\xe5\xc3\xc8y\x14.O\xfa\xf0\x81\x0f'}h\xb9\xcc\xbc\xa9(\xd8\xcd\xf7\x9e\xfd\xce\xa4g\x19\x05S\xca\xb2o\xd2\xdb\xf4U\xc9B7\x91j\x0c\x00\xe3\x05(\xd8\xd8C\xf4\xea?\x89L\xb0\x0a\xa6\x0c\x09\xbf\xf1\x82$\x0eO\xbc\xa6\x88\xc4\x03Xg\xf6\xc9\xd6\xaa\x81f\x14\xa9k+o\x94<*\xff\xf0\xbd\x7f\xa0\xff\x997\x95Q$\xe1g\x0f0\xa3H\xb5,\xef}\xe55M\x16\xba\x89Tc\x00\x18/@\xc1\xc6\x1e|\xd5\x7f\xf7\xbb\x1f^\xde\xf75V\xc1\x94\xb0\xfc\xbeI/\x7fry\xdf7q\xe2A%z\xfe\xf8\xb3\x97\xdfS\xac\x15\x03m$_\xdejl\xe5\x8d\x92G\xb2\xc3!M\x93\xe8U^\xc3gE\x8e\xac\x92\x12\x07\x1d\xe6\xc9\x1f\x80\x913\xd6\x80\xb5\x0d\xaf`\xecy\xa6{F\xddW\x98\xa9`\xde&u\xcd\xee\xa0\xdb\xed\xf6\x84\x0f\x83\xb9l\x97t\x922\xf6\xb2\x81\x81B\xd2\x03\xfb\xb8\xd1\xc69\xcakf\xe0/\xba~\xff\xac\xb2\xeb\xe8z\xd9,?>\xcd\xce\xfa\xfd\xa2\xca\x0d46f-\x98\x91UR\xc4\xf5\x92\xce\\Ys\x99\xbdH\x93\x8d\x81\xec\xcd\xda]\x9e\x95v\xc1\x20\x9b\xfe!P\xcf\xac\x05\xf5\x87WsT\xc1\\\xdc\xd6\xe6\x1a\xc72,)g\xb9\xa2\xc6\xe3\xf5\x0eN+\xd4\xcd\x9c\xab\xb5\xb1\x80\xeb0*\x03\xe3a\xf4uk\x9d\xc5\x95\xe4q\x8e\xdd\x8e\x1a\x03\xbf\xfc\x07\xfe\x05y~\xbf_\x1bJ\xbe\xfe\xfcJ?\x8f\xdf[\xf9\xfcu\xdc\xd4\xdc\xa2\xc6\xc3\x8eB\xa3\x92\xb1\xa8u\xd3`\xe7\x9656.\xc1\x8d\xca\x14\x9d\xf5\xa0fc*\xd4\xffA\xd6\x8bW\xe4\x1a\xeb\xa2\xb6\xaf\x18\xaf\x92\x02\x91\xadi\xcb\xde:^\xce\xd5\x20M\xd1U\x98B\xea~B\x9a&\xd1\xab<\xcb\xe0\xa2\xcc\xda2{Z\xfd\xea\x1a\xe6\x030r\xc6\x18hl#\xf4\xc1\xd4\xf3L\xff\x8c\xba\xaf0Q\xc1:\x89b)}\xb0`\xa0\xbd:l$\xbf\xd7\xf6\xa2NR\xc1N\xbe\xd8\x0a\xc4d:\xd6\xb7\"\x07I\xba\xc8\xa9\xf6\xbc<\xf1B\xe9\xa7-\xe3H\x1f\x04\xff;\xce\x1dGd\xdb\xac\xcd\xc6\xfa\x9d\x8b\xcd\xfa\xb2\x96\x1bf\xd3=\xc4\xca\x05\xf8*\x13\x96\x90\x0b\xa8\x99{\x17\x91s\x12\x7fi\xd6:h\xcfh\x96\xf6|\xebo$W\xe4\x92]M\xa7\x00\x00\x00\x11\xe6IDAT\xe7hv\xbd20\x1eF_\xb7\xcc\"\xec\xef0\x9d\x8cb\xe0Ww\x94\xf3\xae\xd8\x9bYDm\x1d\x9f\xe1\xa3\x13[#\x0f\x0al\xdd\x18\xec\x8b\x06\xb08-X.\xfd%\x15]\xf5\xa0\xc9\xa6T\x08\x95\x93\x8eK\x91\xf14\x1a\xb6}\xa9S:\x8c\x1f\xc8Z\x83\x8f6\xd8\xd8\x87\xd8\xa230G\xd3\xff\x844\xa3H\xdd\xca\xab4r\xb83W\xcb\x11qf?\x00\x16\xc5\x19c\xa0\xb5\x8d<\x8a\x94\xda\xcc\xa8\xbc\xf7\x11\xe6)\x18_\xd1)\x08Bw\xa5\xa0\xb4\xfe@uS\x18\xfb\x97l\xbd:I\x05\xbb\xab\xa3c\x89\xa4`\xe4\x1c\x17cP\xad\xf6~\xd4\x9f\xe6\x97m\x94\xab\xdc.9pI\x17\xa6K\x9b\x8d\xc1Ngm\xd4r}F\xd9\xf4\x0e\xd1\xc7\xd5\x93\x972\xe2\xacp\xee\x20\xae\xa7\x90\x85m/e\xce}\xa9\xfe\x9c\x10:\xe1\xe3\xb3\xda5sgqKhv\xbd20\x1eF_\xb7\xccF|}\xf0h\xe7\xf3\x86~u\x15\xec\x1c7\xd0\xffn\x9f`?\xa7\xb15\xf2\xa0\xc2\xd4\x8d\xc1\xfe*\xd9\x8a\x8d\xca(\x98\xea\x81\xcd\xa6T\x08]\xc2\xc200\xa3\x15\x19\xc1\xb6\xaf\xaa`\xcd\x9c:\x8a\x8dTH\x83O\x88U0\xdd\xca\xab\xecLG\xe4F\xd3!\xa4\xfd\x00X\x14g\x8c\x81\xd6v\xc4\x0afT\xde\xfb\x08\xf3\x14\xec\xa2[&\x80\xa4G\x01\x9eq\x1b\x7f\x97\\\xb1\xbbt\x92*\xe4#mnU\x92\xd2i*8\x0e\xa1C\x0e\xd9\xabz\x95\xcbQ\x9e\x95\xa2\xe6\x15,\xd7fc\x10\xf3\xf8\xb9\xb3F\xd9\xf4\x0eq\x96\xa3\xc2B\x9d-\x91\x02\x1f\xe4+\xbe\xaf\xbep\x11\x1e\xc2!\x0d\x1d\x8e\xac\x9d\x87\xfcyK\x94\xec\xa1e`=\x8c\xban\x99\xc7Q\x87\x0dQ\x053\xf0\xab\xab`\x03\xb6s5\\Y\x0f7\xa0\xb15\xf2\xa0\xc0\xd6\x8d\x81mTF\xc1\x14\x0f\x9alJ\x85\x10ZS\x82\x8e\xa7\x87\xb9\\\x99\xf6U\x9d\xd5\xd0B\x8bD,\xa4\xee'4,\x92?\xac\xf2*5\xe4n\xf8q\xda\x07c?\x00\x16\xc5\x19c\xa0\xb5\x1d\xb1\x82\x19\x95\xf7>\xc2<\x05\x13\x82\x84vO0(\x08\x95>\xba\xebL\x85\xb1\x82m\xe5zt\x92*\xd2Gz\xee3\xedi\xba\xf59\xf4\x9c\x12\xf5W\xafr\xe5[p.}\x99\xebB\x06g7\xb2\xd3\xdc\xf5\x1co\x94M\xef\x10\x9fq\xb5\xd4\x8c8+\x9a{\x96\x82\x0bv\x96\xf4\xe7\xfa\x1a\xed\xb5\x88e\xd1r2\x88)4V0\xc6\xc3\xe8\xebF\x14\xcc.*\x98\x91_\xea\xa1\xbe\x17iX\xd4\x98\xb7r\xd1!\xdaSPm\x8d<\xa8\xb9\x98\xba1\xd8\xe9-c\xb1Q\xf5\x14L\x93\x8d\x11\xd4\xc3\x8e\xc1p\xbf\xc5`\xdb\x97:\xa3\x9d\xe0V\xb6\x0f\x16\xa1\x90\xfa\x9f\x10\xdb$\xfa\x95W\xe9\xe5\xd6\xf4\x9e[\xb0\x92\x9c\xc8\x9a\xb3\x84Aq\xc6\x18hmG\xac`F\xe5\xbd\x8f0O\xc1D\xc48X\xd5\x01\xb2\x0d7\x8a\x8c\xd4\x05\x93?\xd2\xcc\x9d\xda\xd3\xb4\xc3~\xc5\xae\xc4\x91\x87_\xe5\xcd4\x8a\xd1(\xc6\x8a\xf4\x15\xcc\x81Oo~n\x9ea6\xddC,\xcf\xea\xc3c\x09;qv\\\x0c\x94\x94\xe1\xef\xc9r\xee8I\xe6i\xa3xY\xc4\xab\xb0\xc4X\xc1\x18\x0f\xa3\xaf\x1b\xa3`F~\xf3pe\xaf\x84\xde\xf0{\xfe%\xdbq\xeeE\xea[\xb55\xf2\xa0\xc0\xd6\x8d\xc1\x9eE\"S\x8b\xf2\xa4\xbf\x86)\x98&\x1b\xa3`\x83\x8e\xc3\xe9\xf2\x20\xb2\xb7|\xd8-N\xb6}\xd3\xf0\x89\x20,'\xce\xfa3\xf3\x06\xf1\xcbV\"\xf6\x91\x0a\xa9\xff\x09\xb1M\xa2_y\x95\xb3\x9c\x83\xe3\xf2\xe8\\\x1f\xcdY\xa2\xe7\x8c1\xd0\xda2\x0a\xa6SM\x82\xd4fF\xe5\xbd\x8f0W\xc1\x84@\xbb'p\x8d\xcchm\xea\xec\xee\x0c\x17\xc9/Q\xfb]%:]0yN\xbe\x7fV\xc9\x15\xbf\xcd\xd5\x81\xce\xbal~r\x1a\x09\x99\xab3i\xc7n\xf0\x03\xbf\xdf\x8emx$t\xd0\xbbA\xbd4c\x11\xb7\xb3y'WDg[3\xd9T\xc8m\xb3\xfa\x05\xe9=\x06\xd9\xf4\x0f\x81.\xa4e\x95\x97\xa5s\xb6w\xf1hb'\xf7|\xe3!\x179C\xcb\xb9\xb4\xb2f\x9c\xd4Fr\xca\xb9\xc2\xda\xdd\xcb8\xc7[\x1dFeP<\x8c\xben\x17\xd2k\xfa\x1bm\xe7\xfa\x9f\xcf\xbbd\xe8\xb7\xdc^s(/-\xe4n\xef\xee\xb4Y\xc2\x02\xfb\xee\x90\x862\xf0\xa0\xa0\xd6M\xe3\xcc\xce\xad\xe9h]\x89\x1b\x95):\xebA\xcd\xa6\xa9\x10>\xde\xdct\xb9\x9b^\xc0\xa5\xf5!-l\xfb\xaet\xec\xde\xbd\\\xfc\x00Z\xed\x8bj\x9b\xb7r\xf5#(\xa4\xfe'\xa46\x89~\xe5Y\xce\xd9[\x9b\xfdW\xc4B\xb2g\x89\x8e3\x8d\x81\x9a\xa4s\xf2k\xe4:\xebT\x939\xcf\x8c\xca{\x1fa\xae\x82\x05H\x18\xac\x8a$\x9a\xaa+\xeaZ\xd4xE(\xd7\xd3\x8at\x92*\xca\xef\"\xb9\x9a\x17\xf1\xc6v\x81L\x99\xa1_L5\xf6\x1ajqVz\xbf\x1e\x9d\x13\x13b\xe0A\xa8Y\x92\xb6\xa4V\xa0\xbfxc\xb3)\xd8K\\\xb32\x8b\xae\x20\x83l\xfa\x87\xc0\xfd\xaf\x82\xf4\xb9%\xef\xda\xa8\xb3\xe3y\x8e\xf4\x95\xe4\xcb\xb5qey\x96-3/\xe4t\x13j\x16\xd8\x1d\x85\xf5\x0blyFeP<\x8c\xben\xb8\x83\xd08\x83Kk\x14\xc37\xfa~\x07\xb6\xa6\xdb\xf3B'@\x9c\x9dU\x86U\xac#\xd4\xd6\xa0d2j\xdd4\xce\x16\x95\x17\xce\xa0\x8d\xca\x14\x9d\xf5\xa0f\xd3T\x88\x84\xc8\x95\xfew}\xda\xb0I\x1al\xfb\xf6\xe4\xd9g\xac~U,NOa\xd6\x8c\xe5\x87FRH\xfdOHm\x12\xfd\xca\xb3|`#\xe5\xb5\xad<\x87B\xce\x92\xe1\xce4\x06j\xd2%5\x89\xd8\xf5\xd4\xa9&s\x9e\x19\x95\xf7>\xc2\\\x05\x1b1\xafr\x1f\xeb$\xc7\x03et\x06L\x00\xfa\xed\xea\xc5z\x88\x0b\xed\x9cL\x00\xae\xa7\xbdx]\x10\xfa\xce\x16\xa6G\xabp\x13\xb2\x9a\x13\x88\x18Q0\xf3\x1e\xab\x03\x0a6\x91hT\xee\xbd\x0a\xef\xce\x1a\xdf\x13ad\x1c\x92F\xb9\x82#4\xfauwL\xd0jN\x20bD\xc1\xcc\x03\x14l\xc2P\xde\x8a\xf2\xca\xe4?\xae8J\x8c\x83\x0e\xe6qV\xba\xf1y\x8e\xd3\x0d\xc0\xdf1\x13\xb4\x9a\x13\x08P\xb0\xb0\x88\x91[`\"\xd0\xcf-{)s\xa2\x8f\xa8\x04W\x9a\xab\xb1\xb5\x11o#Y\x02\xd1\x01\x14,,4r\xdb\x1b\xc9\x0a\x18\x17\xca\xd2\xf2\"<\xf8o\"pxu\xa6-sMt\xc6\x90@d@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]bK\xc1\xcc\xfby$\x00\x00\x13\x11\x93\x15\xac\xdd\xed\xd5I\x1a\xf11\xb7S')3\xd2\x95\xd8k\x8d\x97\xebR\xd6\xe7\x02\x00\x20&0W\xc1\xf8\x8ac\x95\xc3\x93\x86\x14\xa9\xeb\xdc\x16\x0d[\xf2v\xc4+\xb1\xf7\xf9\x97\x1b\xfeZ[Z\x9f\x0b\x00\x80\xd8\xc0\\\x05\xf36uW\x0eO\x1a\xd1\xc3\x95\xe8$U\x86=J\xce\x88\x02\xe3\xe7M\x0c{\xca4\x00\x00\x13\x18S\x15\xac\xdd\xc3\xcb\xebE2IC\\j\xbf\xcb5\xbc\x0bv\x07\x80\x82\x01\xc0=\x82\x99\x0a\xc6Wt\xc9+\xde2ICzm[u\x92\x12\xba\xab\xd77\xe2}\xe5\xca:\xf5\xea\xb2\xeeX\xc1\xb6\xe2\x9dv\xb2\xca\x8c\xbar\xfc\x95\xa2\xcc\xf4B\x18E\x02@,a\xa6\x82y\x9b\x945\xbb\x99\xa4!.\xdb%\x9d\xa4\x8c\xde\xea\xf5\xfd\xfeYe\xd7\xe5u\xea\x99e\xdd\xb1\x82])\xe2j\xc8\x83\xbf\xd4\x95\xe3{f-\xa8?\xbc\x9a\x03\x05\x03\x80\x18\xc2D\x05\xeb\xf4\xf0\xb2l1ICzm/\xea$Y\x94U\xbb\x94\xd5\xeb\x91\x8b,\x97\xf0<\x99x\xc1.\xeb\x8e\x15\xac\xc6N\x9f\xe0\xc4\xac\x1c\xbfrA?Ys\x0b\x14\x0c\x00b\x08\xf3\x14\x8c\xaf\xe8\x14\x04\xa1\xbbR\x10\xd8\xa41/\xa9O\x1ad\x92,\x8a\x82\x11\xc5\x12\x03Z\xad\xf6~\xd4\x9fF\x16\xd0f\x97u/(/\xe3\xc4\x99\x17\xea\xca\xf1}t\x89!q\x8dT\x00\x00b\x04\xf3\x14\xec\xa2[&\xc0$\x0d\xcd#.y\xab\xb7r*\x12\x1c\x87\xd0!\xba:\x04\xbb\xac{\x81c\xc6\"q-+u\xe5\xf8\xb3\x1c\xd19\x88\xe4\x03@La\x9e\x82\x09AB\xbb'\x18\x14\x98\xa4\xa1\xf9Vu\x9d\xdb\xad:K\xde\x12t\x14\x0cm}\x0e=G\xa3\xfe\xec\xb2\xee\x05\x8e\x0b\xbd\xb3\xe8R\x8b\xea\xca\xf1\x9fq\xb5\xd4\x0c\x14\x0c\x00b\x08\xf3\x14L\x84\x09~\x85\x8d\x83\x8d\xa0\x0b\xa6\xab`\x1d\xf6+v\xbaT\x07\xbb\xac;\x99M\xd1l#\xbb\x99\x95\xe3\x97g\xf5!\xd4c\x97\x14\xacww\x0c<\x92\x1d\x00\xee{\xccU0!\xd0\xee\x09\\\x0bM\xeaQ\xa2\xf6\xbbJ\xf4\xba`\xfa\xab\xd7c\xb7\x99\xab3C\x96\x80\xef\xf3/w}0\xd8_\x90\xd9z\x9d]9\xfeBZVyY\xba\xb8N=Y\xec\xfdG\xc3\x0f\x02\x00\xc0\x04\xc3\\\x05\x0b\x90\xd8WUhR\x87\xebiE:I\x06\xfd\xd5\xeb15\xf6\x1a\xd1BY\xd6\xbd\x96\xd8\x9d%s\xc5\xc8\xe2\x83\xea\xca\xf1=\x05\xe9sK\xde\xb5\x89\xd9\xea\x1d\xf5:G\x01\x00`ba\xae\x82\x8d\x98W\xb9\x8fu\x92\x00\x00\xdc\xe7\xc4\x88\x82\xc1cu\x00\x00\xd0!F\x14\x0c\x00\x00@\x07P0\x00\x00b\x17P0\x00\x00b\x17P0\x00\x00b\x17P0\x00\x00b\x17P0\x00\x00b\x17P0\x00\x00b\x17P0\x00\x00b\x17P0\x00\x00b\x17P0\xf3\x18\xe8\xef\xef\x1fDh\x10\xbf\x0cD\xb2\x05\x00@\x0fP0\xd38\x16g\xb5Z\x13y>\x11\xbf\xc4\x1d\x8dd\x0d\x00\x80\x0e\xa0`c\x88wf\x10\xa1k3\x0d\xd6\"\xaf\xb6z[Z\xda\x11joi\xf1Z\xab\xf5m\x00\x00\x08\x8b\xc9\x0a\xd6\xee\xa6\x97w\xbf\x87>c\xda\x13\x8d\xc1\xd4~\xabDR\x18oMI\x06\xb2\x12\x9ek\xf9I\x89sF\xbc\xb0\xee6k1}\x89\xdb\xa6\xfbv\xb5\xb5[Nv\xdf\x81\x82\xdde\xd1G\xca\xa9\xef;Ern\x871\xca9a\xfc&\x00\x8c#\xe6*\x18_q\x8c>\x98\x95w\x9f\x09`\x82\x91\xecG\x02\x7f,>\xd7\x87\xd9`\x0d\xe3\xce\x9b8r\xc9`\x98\x9d\xec\xceM\xe4#YI\xec\x8a\xf3\x88\x09\xef\xa3\xa5z\xefGR0\xdf\xe9\xe1\xfb\xd0]\x17}\xa4\xdcj\xcb~\xa5\x0d\xb3\xc7\xf9\xb9\xb1\xd1\x89\xf9G\x8c\xdf\x04\x80q\xc4\\\x05\xf36uK\x0a\xa6\\\xccQ\x20\x81v}*\xc3)\x18\x1aqG\x8a\xe5\x9a\xb5\x14\x09#\x15\xb0\x8b\xf1\x1b\xe4\xe4\xa6\x04\xbd\xeaER\xb0\xe9\x8b\x87\xef#\xdcU\xd1\xef\x80\xec\xbdd{\xd0y#\x8cM\x98\xfe\x19\x00\x8c'\xa6*X\xbb\x87\x0f\x8c\x99\x82u\xad\x8bdw\xc7tY\xef`\x00\x97\x9b\xach\x1d\x9f\x9c\xabc\x10I\xc1R\x0d\x14l\xac\x11\x15\xec7o\x80J\x011\x80\x99\x0a\xc6Wt\xa1\x91)X\xb5\xd5j-F\xc5x[\x8d\xf8\xc5\xc9\xf1)\xf3\xce\xe0\xbdg\x1e\xb5Z7u-\x9d\x9a8gPc-*\x18&\xdf\x1a\xef^7-qvw\x88\x87D\xab5\x8e>\xd0Z\xebaWjb\xea.m6\x86\x81$1\xbc\xb6\x8e\x18\xc4U\xe2>\x96uZ\xa8m\xd7\xc2\xa4\xf8\xe49t\xc9\xb8\x81\xc9J\x17\x0cw\xc2\x12\xfb\xd10\xf4\x14\xec\xe8\xec\x94\xf8\xa49)\xb8w*\x05\xf3R\xb5\x85T\x8b\xae9ppiR\xca\xbauI\x9a\xf1e\xf7d\xc9\xc5dm=n7\xac\x9f\xbf\xb6\x81\xcaS\xdb\xe6\x15\xd9\xcfl^\x11\"U\xa2\x82a^qf\x1f|c\xd5\xfc\xcd\xbfG\xe8\x88\xd3\xe9\xdc\x8b\xf6\xe2\xed\x11tc>}\xc1|\x94\xedt\xee\xf9t\xfb\x8a\xec\xcd_0~\x99l\x000\xd6\x98\xa9`\xde&\xa4(XS\xb5\xbb\xea\xa8\xcee.\xc2\x1f\x9d\xbc)\x88\x82\x9b\xa6\x1c\xe5\xf1\xb5\x9d\xeb\xab\x9e\x17\xd7\x82P\x7fuU\xca\x93\x93S\xd6-\xb5j\xaf\xd1\x84M\xfd\xfd\x8bI\x0f\xac\xb3\xeaQkRq\xe9\xe4\x85Z\x0f\xe8\xa4\xcf'\xaa\x9c\xc6Cn\xc2&\xef\xa6\x84\xa5\x9al,g|U\xd6b\x9f\x0f\xebS\xc0\x17\x8f\xb3\xb7\xe4&\x84\xd8\xfa\x12S\xb75\x15[i\xd4\xeb\xb4\xd5\xa7f=fmA\xc3\xd0Q\xb0\x93\xd6\xa5\xd5M\xee$+\x96\xaac\xbe'3|>_gH!\x95\xa2\xb3\x07\x1e\x98\x96\xbc\xab8!\xb1b6\x1bo\x1b\xf0\x94\x8a\x84\xdc\x1f\xd9\x91\xbd\xe7\xd4\x9e\xec\xed8\xf5\xcb\xefo?r\xea\xe03\xce/4\xef\xa3\xec\x9f\xdc\xba\xb5\xe5\x0d\x9c\xf8\xe8H\xb63g\xef;\xf3\xb7\x20t\xa3m\xfeO>G\x9f\xef}\xba\x0d\x8f-\xcf\xb7\xb5\x89*w\xeb\xc8\x91\x15\xab\xe6\xe7\xbc\xb1\xfd\xfbW\x19\xbfL6\x00\x18kLT\xb0N\x0f\xaf*X\xe5\x99\xee\xce\xea*\xe3\xbb\x87\xb9dH\xb5\x98\x0c\xc6\xf8j2:K\x15\xe5%\xd5:\x1b\xff\x15\x12\x9aJ\x20=\x8fybr\x0a\xbe\xea\x97&i=\x10\x12\xe5~\x9a\xe2\xe1\x80\xf5\x00\"\xdb\xfd\xdal,\xea(\x92\xaaHq\x02\xd2\xd8\xf6\xa7\xcc\xc1\x15\x18\xa8\xa6+.y\xad\x17\xd5\x8c\xba\xa3D\x1d\x05\xdb\x95D\xfb\x82Sh\xa8\x8b\x19Ej\xaa)\x17]=p\x95\x15wIwY\xdb\x91\x86\xe0E\x11m8\xf0\x94\xf3\x94\xbcm\xc8!\xda\xd5\xf0th\x1f\x8c\xdc\x89\xdc,&\x9f\xc6\x1d\xa9\xed9$\xb9\x83h\xde\xf6\x1d\xb2\x8d\xdcO[\xeb\xdcx\x03\xdd\xbe\xa1\xf1\xcbf\x03\x80\xb1\xc5<\x05\xe3+:\x05A\xe8\xae\x14\xf0\xe5*\xb4\x93\xeeW\xbfG\xa7\xa7\"\xe1K\xe4\xf1\x10\x8avk\x82\xbb\xe6L\x9dL\x86W\x98T\xbd\x18yBnKK\xaa\xa4`D\xb1D\xa5a<\x20V\xc1d\x0f\xb9\xd3\xe8\xcb\xb4\\m6\x16}\x05Sl\xf7\x13!\x91\xa9\xd3*\x98\xce*L:\x0a\xd6\x9d<5\xdf}F\x10\x85\x9cU0\xb6\x9a\x8a\x82)\x07\xde0\x05\x0d\x0f\xd2]\x94g\x95h{\xa8;\xd6\xd2\x97U\xaf\x20t5g\xc5\xeb\x07\x7fu;4\xde\x95\xbd\xe3\xfc\xf9\xb5\x92\x82\x11\xc5\xda\x9bM\x92m\xd9\xb7\xd0\xad\xf9m\xb2\x8d\xa2`\xd9W\xc5\x04\xe3\x97\xcd\x06\x00c\x8by\x0av\xd1-\x13\x90w\x1d\xad3\xb4\x1eL\xaaCuI\xa4o\xd2\x92\x9c\xb2\xa1\xce\x97!)\xd8t\x1d[\"/\xfb\x9b\x94\xa4\xa44\xaa\x07\x82\xaa`\xb2\x87\x99\xa2\xe6\xcd\x99\xae\xcd\xc6\xa2\xaf`J\xb2\xd4\xca\x0c\x83[\xd8\x81c\x8b\xf5\x18\x1a\x86^\x1c\x8cw/\x9efM\x12\xe7\x8f\xb1\x0a\xc6VSQ0\xe6\xc0A\xd2{\x0c\xe9\x83\xf9\xbc\"\xcch\x16\xb3Q\xd4\xa6\xcd\xeb\xf1\xe6\xc6\xc1-\xab\x9c\xcf\xbc\xa3\x13\x07;\xd5\xa6$%)\xfa\xe2\xe9\x13\xe8\xc43\xb2\xa9\xaa`\xeb\xa5\x04\xeb\x97\xc9\x06\x00c\x8by\x0a&\x04\x09\xed\x9e`P@M\xa22\xf8\xc2\xdc\xea\xcb_\x88\x16\xe6\x93\xc4\xb4\x99d4\xb5PR\xb0\x90X\x15E\x8a\xe4\x9f\x09j\xa5H\xf1@P\x15L\xf6\x90;\x95\xbeL\xcdE#U\xb0M!\x0a\xd6defp\xf1\xca\xfd\x04\xf2v\xbc\xce\x1c\x0c\xbd8\x18\x89\xfe\xf3U\x89\xe4~\x82\xa8`\x15\xd4FS\xcd\xe1\x0a\xd6\x1d7\xa7\xfb\xcc\xd4\x99#\x9af\xb1\x83\x06\xeeo\xaf\xc0\xdd\xa4\xf3{p\xf2\xc6\x91\xec\x06\xad\x85\xa4N\x1f\xdd\xd0J\xd1\xeb[\xd0\x96\xd7Cl\xb0\x82m\x91\x12\x8c_P0`\xfc0O\xc1D\xc48\x98\x97v\xbe\xaey\x98QX(-\x09\x81\x04\xda\xabI!W\xb3\x90*)\x98\xde\x8c\x03I;\x927h\xa5H\xf1@P\x15L\xf6\xe0\xa5#\xbd**R\x11\x15,\x11\xfb\x16\xa6\x87(\x18\x9f\x9cA\xc6\x7f\xf9\xe24\x8e\xc5S\x15E\x11\xa6\xcdA\xc3\xd1Q\xb0b\x1a\x8bC\x19Th32\xf0\x88Y|CS\xcd\xe1\x0av\xda\x9ad\xb5f(]\xd9\xb0\x9c\xa2\xb7\x11\x8f\x90x\xd5^\x1a\xb4B\x1b_\xa1oto\x93\x86\xbd\x92:\xe5\xec\xd1J\xd1/\xb2\xaff\xffB\xf62\\\xc1\x18\xbf\xa0`\xc0\xf8a\xae\x82\x09\x81vO\xe0\x1a\xbez\xdc\x07\xba\xbaOVx\xc3\xf4\"\x84\xe4\xd9\xc9\xf4\xedb\xeb\xe2]\xdbR\xf1P\xabe\xb0\x85\xde\xafc\xe2M\x04yN\xbeo\xf2\xba\x80/>\xb7\x05\x9d\xce\x8d'7\x10U\x0f\x03->_B\xae\xef(\x8f4\x1e\x96\xc6m\xf0n\x88[Jo52\xd9\x14\xc4{\x91-\xd4\xc5\xcc\xa4m\xdbfZ\x1f\xf5tjl}\x8fMs\xef\xcf\xb7VP\xf3\xae8\xe5\xce`\xa9Uoz\xbd\xae\x82%\x16{\xebr\xc5\xdb\x98\xc5\x09\xa5u\xb3\x13\xbb5\x85T\x8b\xce\x1e\xf8tB\x93\xd7\x17\x18Q\x17\x0c\xa1\xed\xce='\xf68I\\~\xafs\xfe\xde\x13'v8\xc5\x11\xe3<+\x95YyN~\xdb\xfc7\xae\xe2\xe4\xcfo\xff\xf2\x95\xec6\x12\xeb\xba\x9d\xb3Y\xfc\xa1\xd1\xed\x9f\xb7Q\x9b\x1b\xe8\x8b_\xb4\xad\xda\xd8\xd6\xf6\xa9\xd6\xaf6\x1b\x00\x8c)\xe6*X\x80\x84\xc1H\xd7'\xd8T\xe5\xf1\xb6\x87\xbd\x06K\x13DE\x10J\x9fLHZ\xec\x99\x1a\x9fq&\x8e\x06\xaaC\xfa7\xca\xef\"\xad\xa5\xf9x\x13\xdfN\x9e\xfd\x90\xcfz8)\xe6\xb3\xba\x91\xc6\x83@\xe7\x83\x09d\xaa\x95&\x9b\xc4\xc0\x14j\xfbh'\xf9\xa3+#q\xf2\xec\x0d\xd8@k\xdb\xb58e\xf2t9\x98\xb7\xe91)\xf8u4Qwrm\xb5\xb5K~\xbaN\x97\xa4`\x95\x19\xc5)\xf1\xc9\x19b\xe4j\x20\x7fJb\x06\xee4\xb2\x85T\x8b\xce\x1e\xf8X<\xd9\x17\x9f\x11\x12\x08\xd3\xe7v\xc3Zi>\xd8\xc1\x8d{Wd\xe7l\x94\xa2\xf3\x9e$7y9\xe5\x94ix\x05o\xb2\x7fEf\x7f\xd1^Z\x834\xdc\xfc\xa5\xf4\xfeA\xf4\x91\x98\xd8\xac\xf5\x1b\x92\x0d\x00\xc6\x12s\x15\xec\xdef]<\xd5\xa5\xaa\xf8\\\xed\x8c[\x09:iUz\xba\x0e\x9d\xc3q\xb7\x04\x13\xf3\x83\x83\x83\xfc\xc9\x85SF\xfa\x8b'\x00\xb8W\x00\x05\x1bCJS\xc8\xd3u\x92\xf5\x1fM\x81\x06\xcf\xb4\xc8O\xd7i9\xa3\xabq#\xa4N\x9c?\x86\x84\xa4\xd1\xe8\x20\x00\xc4\"\xa0`\xb1\xcf\xe98q\xf8\xd8\x1e\x17\xe6N\x08\x00\xdc\x93\x80\x82\xc5>Bnb~\x95\xaf*?Q\xef\xf7\xe3\x00pO\x03\x0av/\xe0\x9d\x9d\x1c\x9f<\xe7\x0e\x1e\x9c\x01\x00\xf7\x08\xa0`\x00\x00\xc4.\xa0`\x00\x00\xc4.CC\xff\x1f\xf8\xaa\xf0z\xf7O\xc9\x8f\x00\x00\x00\x00IEND\xaeB`\x82", - - "analysis/help.html": "\x0a\x0a\x0a\x0a\x0a\x0a

    \x0a\x20\x20When\x20invoked\x20with\x20the\x20-analysis\x20flag,\x20godoc\x20performs\x0a\x20\x20static\x20analysis\x20on\x20the\x20Go\x20packages\x20it\x20indexes\x20and\x20displays\x20the\x0a\x20\x20results\x20in\x20the\x20source\x20and\x20package\x20views.\x20\x20This\x20document\x20provides\x20a\x0a\x20\x20brief\x20tour\x20of\x20these\x20features.\x0a

    \x0a\x0a

    Type\x20analysis\x20features

    \x0a

    \x0a\x20\x20godoc\x20-analysis=type\x20performs\x20static\x20checking\x20similar\x0a\x20\x20to\x20that\x20done\x20by\x20a\x20compiler:\x20it\x20detects\x20ill-formed\x20programs,\x20resolves\x0a\x20\x20each\x20identifier\x20to\x20the\x20entity\x20it\x20denotes,\x20computes\x20the\x20type\x20of\x20each\x0a\x20\x20expression\x20and\x20the\x20method\x20set\x20of\x20each\x20type,\x20and\x20determines\x20which\x0a\x20\x20types\x20are\x20assignable\x20to\x20each\x20interface\x20type.\x0a\x0a\x20\x20Type\x20analysis\x20is\x20relatively\x20quick,\x20requiring\x20about\x2010\x20seconds\x20for\x0a\x20\x20the\x20>200\x20packages\x20of\x20the\x20standard\x20library,\x20for\x20example.\x0a

    \x0a\x0a

    Compiler\x20errors

    \x0a

    \x0a\x20\x20If\x20any\x20source\x20file\x20contains\x20a\x20compilation\x20error,\x20the\x20source\x20view\x0a\x20\x20will\x20highlight\x20the\x20errant\x20location\x20in\x20red.\x20\x20Hovering\x20over\x20it\x0a\x20\x20displays\x20the\x20error\x20message.\x0a

    \x0a
    \x0a\x0a

    Identifier\x20resolution

    \x0a

    \x0a\x20\x20In\x20the\x20source\x20view,\x20every\x20referring\x20identifier\x20is\x20annotated\x20with\x0a\x20\x20information\x20about\x20the\x20language\x20entity\x20it\x20refers\x20to:\x20a\x20package,\x0a\x20\x20constant,\x20variable,\x20type,\x20function\x20or\x20statement\x20label.\x0a\x0a\x20\x20Hovering\x20over\x20the\x20identifier\x20reveals\x20the\x20entity's\x20kind\x20and\x20type\x0a\x20\x20(e.g.\x20var\x20x\x20int\x20or\x20func\x20f\x0a\x20\x20func(int)\x20string).\x0a

    \x0a
    \x0a
    \x0a\x0a

    \x0a\x20\x20Clicking\x20the\x20link\x20takes\x20you\x20to\x20the\x20entity's\x20definition.\x0a

    \x0a
    \x0a\x0a

    Type\x20information:\x20size/alignment,\x20method\x20set,\x20interfaces

    \x0a

    \x0a\x20\x20Clicking\x20on\x20the\x20identifier\x20that\x20defines\x20a\x20named\x20type\x20causes\x20a\x20panel\x0a\x20\x20to\x20appear,\x20displaying\x20information\x20about\x20the\x20named\x20type,\x20including\x0a\x20\x20its\x20size\x20and\x20alignment\x20in\x20bytes,\x20its\x0a\x20\x20method\x20set,\x20and\x20its\x0a\x20\x20implements\x20relation:\x20the\x20set\x20of\x20types\x20T\x20that\x20are\x20assignable\x20to\x0a\x20\x20or\x20from\x20this\x20type\x20U\x20where\x20at\x20least\x20one\x20of\x20T\x20or\x20U\x20is\x20an\x20interface.\x0a\x0a\x20\x20This\x20example\x20shows\x20information\x20about\x20net/rpc.methodType.\x0a

    \x0a\x0a

    \x0a\x20\x20The\x20method\x20set\x20includes\x20not\x20only\x20the\x20declared\x20methods\x20of\x20the\x20type,\x0a\x20\x20but\x20also\x20any\x20methods\x20\"promoted\"\x20from\x20anonymous\x20fields\x20of\x20structs,\x0a\x20\x20such\x20as\x20sync.Mutex\x20in\x20this\x20example.\x0a\x0a\x20\x20In\x20addition,\x20the\x20receiver\x20type\x20is\x20displayed\x20as\x20*T\x20or\x0a\x20\x20T\x20depending\x20on\x20whether\x20it\x20requires\x20the\x20address\x20or\x20just\x0a\x20\x20a\x20copy\x20of\x20the\x20receiver\x20value.\x0a

    \x0a

    \x0a\x20\x20The\x20method\x20set\x20and\x20implements\x20relation\x20are\x20also\x20available\x0a\x20\x20via\x20the\x20package\x20view.\x0a

    \x0a\x0a\x0a

    Pointer\x20analysis\x20features

    \x0a

    \x0a\x20\x20godoc\x20-analysis=pointer\x20additionally\x20performs\x20a\x20precise\x0a\x20\x20whole-program\x20pointer\x20analysis.\x20\x20In\x20other\x20words,\x20it\x0a\x20\x20approximates\x20the\x20set\x20of\x20memory\x20locations\x20to\x20which\x20each\x0a\x20\x20reference—not\x20just\x20vars\x20of\x20kind\x20*T,\x20but\x20also\x0a\x20\x20[]T,\x20func,\x20map,\x0a\x20\x20chan,\x20and\x20interface—may\x20refer.\x20\x20This\x0a\x20\x20information\x20reveals\x20the\x20possible\x20destinations\x20of\x20each\x20dynamic\x20call\x0a\x20\x20(via\x20a\x20func\x20variable\x20or\x20interface\x20method),\x20and\x20the\x0a\x20\x20relationship\x20between\x20send\x20and\x20receive\x20operations\x20on\x20the\x20same\x0a\x20\x20channel.\x0a

    \x0a

    \x0a\x20\x20Compared\x20to\x20type\x20analysis,\x20pointer\x20analysis\x20requires\x20more\x20time\x20and\x0a\x20\x20memory,\x20and\x20is\x20impractical\x20for\x20code\x20bases\x20exceeding\x20a\x20million\x20lines.\x0a

    \x0a\x0a

    Call\x20graph\x20navigation

    \x0a

    \x0a\x20\x20When\x20pointer\x20analysis\x20is\x20complete,\x20the\x20source\x20view\x20annotates\x20the\x0a\x20\x20code\x20with\x20callers\x20and\x20callees\x20information:\x20callers\x0a\x20\x20information\x20is\x20associated\x20with\x20the\x20func\x20keyword\x20that\x0a\x20\x20declares\x20a\x20function,\x20and\x20callees\x20information\x20is\x20associated\x20with\x20the\x0a\x20\x20open\x20paren\x20'('\x20of\x0a\x20\x20a\x20function\x20call.\x0a

    \x0a

    \x0a\x20\x20In\x20this\x20example,\x20hovering\x20over\x20the\x20declaration\x20of\x20the\x0a\x20\x20rot13\x20function\x20(defined\x20in\x20strings/strings_test.go)\x0a\x20\x20reveals\x20that\x20it\x20is\x20called\x20in\x20exactly\x20one\x20place.\x0a

    \x0a\x0a

    \x0a\x20\x20Clicking\x20the\x20link\x20navigates\x20to\x20the\x20sole\x20caller.\x20\x20(If\x20there\x20were\x0a\x20\x20multiple\x20callers,\x20a\x20list\x20of\x20choices\x20would\x20be\x20displayed\x20first.)\x0a

    \x0a\x0a

    \x0a\x20\x20Notice\x20that\x20hovering\x20over\x20this\x20call\x20reveals\x20that\x20there\x20are\x2019\x0a\x20\x20possible\x20callees\x20at\x20this\x20site,\x20of\x20which\x20our\x20rot13\x0a\x20\x20function\x20was\x20just\x20one:\x20this\x20is\x20a\x20dynamic\x20call\x20through\x20a\x20variable\x20of\x0a\x20\x20type\x20func(rune)\x20rune.\x0a\x0a\x20\x20Clicking\x20on\x20the\x20call\x20brings\x20up\x20the\x20list\x20of\x20all\x2019\x20potential\x20callees,\x0a\x20\x20shown\x20truncated.\x20\x20Many\x20of\x20them\x20are\x20anonymous\x20functions.\x0a

    \x0a\x0a

    \x0a\x20\x20Pointer\x20analysis\x20gives\x20a\x20very\x20precise\x20approximation\x20of\x20the\x20call\x0a\x20\x20graph\x20compared\x20to\x20type-based\x20techniques.\x0a\x0a\x20\x20As\x20a\x20case\x20in\x20point,\x20the\x20next\x20example\x20shows\x20the\x20dynamic\x20call\x20inside\x0a\x20\x20the\x20testing\x20package\x20responsible\x20for\x20calling\x20all\x0a\x20\x20user-defined\x20functions\x20named\x20ExampleXYZ.\x0a

    \x0a\x0a

    \x0a\x20\x20Recall\x20that\x20all\x20such\x20functions\x20have\x20type\x20func(),\x0a\x20\x20i.e.\x20no\x20arguments\x20and\x20no\x20results.\x20\x20A\x20type-based\x20approximation\x20could\x0a\x20\x20only\x20conclude\x20that\x20this\x20call\x20might\x20dispatch\x20to\x20any\x20function\x20matching\x0a\x20\x20that\x20type—and\x20these\x20are\x20very\x20numerous\x20in\x20most\x0a\x20\x20programs—but\x20pointer\x20analysis\x20can\x20track\x20the\x20flow\x20of\x20specific\x0a\x20\x20func\x20values\x20through\x20the\x20testing\x20package.\x0a\x0a\x20\x20As\x20an\x20indication\x20of\x20its\x20precision,\x20the\x20result\x20contains\x20only\x0a\x20\x20functions\x20whose\x20name\x20starts\x20with\x20Example.\x0a

    \x0a\x0a

    Intra-package\x20call\x20graph

    \x0a

    \x0a\x20\x20The\x20same\x20call\x20graph\x20information\x20is\x20presented\x20in\x20a\x20very\x20different\x20way\x0a\x20\x20in\x20the\x20package\x20view.\x20\x20For\x20each\x20package,\x20an\x20interactive\x20tree\x20view\x0a\x20\x20allows\x20exploration\x20of\x20the\x20call\x20graph\x20as\x20it\x20relates\x20to\x20just\x20that\x0a\x20\x20package;\x20all\x20functions\x20from\x20other\x20packages\x20are\x20elided.\x0a\x0a\x20\x20The\x20roots\x20of\x20the\x20tree\x20are\x20the\x20external\x20entry\x20points\x20of\x20the\x20package:\x0a\x20\x20not\x20only\x20its\x20exported\x20functions,\x20but\x20also\x20any\x20unexported\x20or\x0a\x20\x20anonymous\x20functions\x20that\x20are\x20called\x20(dynamically)\x20from\x20outside\x20the\x0a\x20\x20package.\x0a

    \x0a

    \x0a\x20\x20This\x20example\x20shows\x20the\x20entry\x20points\x20of\x20the\x0a\x20\x20path/filepath\x20package,\x20with\x20the\x20call\x20graph\x20for\x0a\x20\x20Glob\x20expanded\x20several\x20levels\x0a

    \x0a\x0a

    \x0a\x20\x20Notice\x20that\x20the\x20nodes\x20for\x20Glob\x20and\x20Join\x20appear\x20multiple\x20times:\x20the\x0a\x20\x20tree\x20is\x20a\x20partial\x20unrolling\x20of\x20a\x20cyclic\x20graph;\x20the\x20full\x20unrolling\x0a\x20\x20is\x20in\x20general\x20infinite.\x0a

    \x0a

    \x0a\x20\x20For\x20each\x20function\x20documented\x20in\x20the\x20package\x20view,\x20another\x0a\x20\x20interactive\x20tree\x20view\x20allows\x20exploration\x20of\x20the\x20same\x20graph\x20starting\x0a\x20\x20at\x20that\x20function.\x0a\x0a\x20\x20This\x20is\x20a\x20portion\x20of\x20the\x20internal\x20graph\x20of\x0a\x20\x20net/http.ListenAndServe.\x0a

    \x0a\x0a\x0a

    Channel\x20peers\x20(send\x20\xe2\x86\x94\x20receive)

    \x0a

    \x0a\x20\x20Because\x20concurrent\x20Go\x20programs\x20use\x20channels\x20to\x20pass\x20not\x20just\x20values\x0a\x20\x20but\x20also\x20control\x20between\x20different\x20goroutines,\x20it\x20is\x20natural\x20when\x0a\x20\x20reading\x20Go\x20code\x20to\x20want\x20to\x20navigate\x20from\x20a\x20channel\x20send\x20to\x20the\x0a\x20\x20corresponding\x20receive\x20so\x20as\x20to\x20understand\x20the\x20sequence\x20of\x20events.\x0a

    \x0a

    \x0a\x20\x20Godoc\x20annotates\x20every\x20channel\x20operation—make,\x20send,\x20range,\x0a\x20\x20receive,\x20close—with\x20a\x20link\x20to\x20a\x20panel\x20displaying\x20information\x0a\x20\x20about\x20other\x20operations\x20that\x20might\x20alias\x20the\x20same\x20channel.\x0a

    \x0a

    \x0a\x20\x20This\x20example,\x20from\x20the\x20tests\x20of\x20net/http,\x20shows\x20a\x20send\x0a\x20\x20operation\x20on\x20a\x20chan\x20bool.\x0a

    \x0a\x0a

    \x0a\x20\x20Clicking\x20on\x20the\x20<-\x20send\x20operator\x20reveals\x20that\x20this\x0a\x20\x20channel\x20is\x20made\x20at\x20a\x20unique\x20location\x20(line\x20332)\x20and\x20that\x20there\x20are\x0a\x20\x20three\x20receive\x20operations\x20that\x20might\x20read\x20this\x20value.\x0a\x0a\x20\x20It\x20hardly\x20needs\x20pointing\x20out\x20that\x20some\x20channel\x20element\x20types\x20are\x0a\x20\x20very\x20widely\x20used\x20(e.g.\x20struct{},\x20bool,\x20int,\x20interface{})\x20and\x20that\x20a\x0a\x20\x20typical\x20Go\x20program\x20might\x20contain\x20dozens\x20of\x20receive\x20operations\x20on\x20a\x0a\x20\x20value\x20of\x20type\x20chan\x20bool;\x20yet\x20the\x20pointer\x20analysis\x20is\x0a\x20\x20able\x20to\x20distinguish\x20operations\x20on\x20channels\x20at\x20a\x20much\x20finer\x20precision\x0a\x20\x20than\x20based\x20on\x20their\x20type\x20alone.\x0a

    \x0a

    \x0a\x20\x20Notice\x20also\x20that\x20the\x20send\x20occurs\x20in\x20a\x20different\x20(anonymous)\x20function\x0a\x20\x20from\x20the\x20outer\x20one\x20containing\x20the\x20make\x20and\x20the\x20receive\x0a\x20\x20operations.\x0a

    \x0a

    \x0a\x20\x20Here's\x20another\x20example\x20of\x20send\x20on\x20a\x20different\x20chan\x0a\x20\x20bool,\x20also\x20in\x20package\x20net/http:\x0a

    \x0a\x0a

    \x0a\x20\x20The\x20analysis\x20finds\x20just\x20one\x20receive\x20operation\x20that\x20might\x20receive\x0a\x20\x20from\x20this\x20channel,\x20in\x20the\x20test\x20for\x20this\x20feature.\x0a

    \x0a\x0a\x0a

    Known\x20issues

    \x0a

    \x0a\x20\x20All\x20analysis\x20results\x20pertain\x20to\x20exactly\x0a\x20\x20one\x20configuration\x20(e.g.\x20amd64\x20linux).\x20\x20Files\x20that\x20are\x20conditionally\x0a\x20\x20compiled\x20based\x20on\x20different\x20platforms\x20or\x20build\x20tags\x20are\x20not\x20visible\x0a\x20\x20to\x20the\x20analysis.\x0a

    \x0a

    \x0a\x20\x20Files\x20that\x20import\x20\"C\"\x20require\x0a\x20\x20preprocessing\x20by\x20the\x20cgo\x20tool.\x20\x20The\x20file\x20offsets\x20after\x20preprocessing\x0a\x20\x20do\x20not\x20align\x20with\x20the\x20unpreprocessed\x20file,\x20so\x20markup\x20is\x20misaligned.\x0a

    \x0a

    \x0a\x20\x20Files\x20are\x20not\x20periodically\x20re-analyzed.\x0a\x20\x20If\x20the\x20files\x20change\x20underneath\x20the\x20running\x20server,\x20the\x20displayed\x0a\x20\x20markup\x20is\x20misaligned.\x0a

    \x0a

    \x0a\x20\x20Additional\x20issues\x20are\x20listed\x20at\x0a\x20\x20tools/godoc/analysis/README.\x0a

    \x0a", - - "analysis/ident-def.png": "\x89PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\x00\x03\xd2\x00\x00\x00\xf5\x08\x03\x00\x00\x00\x8b\x0c=\xff\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x02\xfdPLTE!#\x20#$\"$%#($#&'%'(&-'\")+(4,\",.+01/>/\"241A2%685G6$8:7;<:Q9$>@=W>#AB@CEB\\B'cC$GIF\x00f\x00\x00g\x00\x00h\x00gF'\x00i\x01KLJ\x00j\x02\x02k\x03\x04l\x05mJ&\x06m\x06sJ(OQN\x0bo\x08\x0ep\x0awN&\x0aq\x16TUS\x10q\x0c\x0cr\x17\x0fs\x18~R%WYV\x12u\x1a,`\xae7]\xad\x15v\x1c\x86T)\x16w\x1d[]Z9a\xab\x19y\x1e^_];b\xace\xaf)z\x20ac`+{\"(|*\x92]%cebAh\xb2egd+\x7f,\x9a_)Li\xafDl\xb0.\x81.ikh0\x830Ho\xb31\x841/\x858Jq\xb6mol\xa3f);\x86:Us\xb3\xabg->\x88B\x8c@\xb3m,vxu@\x8dGC\x8dA\\z\xbbxzwI\x8dH]}\xb7K\x8fJ\xb9r*_\x80\xbaM\x91L}\x7f|\xc1s-O\x93MP\x94Oc\x84\xbeN\x95U\x81\x83\x80\xc7x+W\x95VX\x97Xm\x87\xbcY\x98Y\xd1z(Z\x99Z[\x9aZ\x87\x89\x86\\\x9b[r\x8c\xc2\xd6~-^\x9d]\\\x9dc\x8a\x8c\x89d\x9ddz\x8f\xbff\x9ff\x8f\x91\x8eh\xa1h\xde\x85+~\x93\xc4j\xa3j\x92\x94\x91k\xa4ky\x97\xc6s\xa4lq\xa5s\x95\x97\x94\xec\x8a,\x83\x9b\xc5\x98\x9a\x96\x9a\x9b\x98u\xaaw\x86\x9e\xc8\xf1\x8e/\x9b\x9d\x9a~\xaay\x88\xa0\xcb\x9e\xa0\x9d\x80\xad|\xf7\x93-\xa0\xa2\x9f\xfd\x92/\x81\xb0\x85\xa2\xa4\xa1\x92\xa5\xca\xff\x952\x82\xb2\x86\xa4\xa6\xa3\x83\xb3\x87\x8b\xb2\x88\xa6\xa8\xa5\x96\xa9\xce\x8d\xb5\x8a\xa9\xab\xa8\x8e\xb6\x8c\x9e\xad\xcd\x8d\xb8\x93\xac\xae\xab\x95\xb8\x95\xa1\xb1\xd1\x97\xba\x96\xaf\xb1\xae\x98\xbb\x98\xa4\xb3\xd4\xb2\xb4\xb0\xa5\xb5\xd5\x9b\xbe\x9a\xb5\xb7\xb4\xac\xb7\xd1\xa3\xbf\x9d\xa2\xc0\xa4\xb7\xb9\xb6\xa4\xc2\xa6\xb9\xbb\xb8\xa5\xc4\xa8\xb1\xbd\xd7\xbb\xbd\xba\xa8\xc7\xaa\xb7\xbf\xd4\xaf\xc6\xab\xbe\xc0\xbd\xb9\xc1\xd6\xc0\xc2\xbe\xb2\xc9\xae\xc1\xc3\xc0\xbb\xc3\xd8\xbc\xc4\xd9\xb1\xcc\xb6\xc4\xc6\xc3\xb3\xcd\xb8\xb9\xcc\xb8\xc1\xc8\xde\xbb\xca\xde\xc7\xc9\xc6\xbb\xce\xba\xbd\xcf\xbb\xca\xcc\xc8\xc7\xcb\xdb\xbf\xd2\xbe\xc4\xcf\xdd\xcd\xcf\xcc\xcb\xcf\xdf\xc8\xd3\xc1\xc6\xd4\xc7\xcd\xd1\xe1\xd0\xd2\xcf\xc8\xd6\xca\xd2\xd2\xdd\xd2\xd4\xd1\xca\xd8\xcc\xd3\xd5\xd2\xce\xd6\xdf\xcc\xda\xcd\xd5\xd7\xd4\xd6\xd8\xd5\xcd\xdc\xcf\xd4\xdb\xd0\xd8\xd9\xe3\xd2\xdb\xe3\xd5\xdc\xd1\xd9\xdb\xd8\xd7\xde\xd3\xd5\xdf\xda\xdc\xde\xdb\xda\xdf\xe2\xd7\xe1\xdc\xe0\xde\xe2\xde\xe0\xdd\xd8\xe2\xdd\xdd\xe2\xe5\xe0\xe2\xdf\xe2\xe4\xe1\xdf\xe5\xe7\xe4\xe6\xe3\xe8\xe5\xea\xe2\xe7\xea\xe5\xe7\xe4\xe6\xe8\xe5\xe4\xe9\xec\xe7\xe9\xe6\xfe\xff\xfc\x93\x8dkM\x00\x00\x20\x00IDATx^\xed\x9d\x7ft\x14\xd5\xdd\xff\x07%\x064*\x15\xe1y<\xb3=lbJ0@\x94\x86F\xac(\x98o\xe5\xb4\x86\xf4\x89i\xfa\x8d\xf6\xa4R\x7f`A\x10\x1a\xcd\x93\xc3\xb1\"\x02\x15\x1e\x8c\xf5l\xea\x81\xd8\xb4\x91`h\xf6(\xb89r\xb2\x12\xe4\xc8\xba(<\x12\xda''\x94\xd2\xf6!\xc5\x08\xc8S(\xc8\x93v\xd7\xd4\xb3\xde\xef\xf9\xde{\xe7\xd7\xbd\xb3wfv\x03a\xc8\xec\xe7\xf5\xc7\xee\xec\xe43\xf7\xde\xf9\xcc\xbc\xf7\xde;;\x99\xb7\xf4\xff.\x00\x04\x00\xc0e\x86\xe4$[;\x9c\x0a\x07\x00\xe0R\x03\x92\x06\x00O\x01\x92\x06\x00O\x01\x92\x06\x00O\x01\x92\x06\x00O1\x92$]_/Z\x04\x00\x80\xc1=I\xf7w4\x07Zv\x9dS?u\x07\x82\xb6\xd1\x98?\xc9\xeb\x04\x8b\x84_\xcb\x849\xed\xc9\xdbX\xf0\xb1O.u\x8a\xb1'\xc5\x12\x9e\x95\xe5\x90S\xccP\xe9$;]\x82\x17z\x17\x14\x16TE\xca\xf6!\x94h\x983\xcd7\xed\x9eF\x84\xa2\xb2\\\x95@!\x1c\x11q*\xc7\x0e\xf1n\xa6\xb8\xf3\xa8\x0eW\x9f\xd7\xe7\x14\xa5s\xb6\xbe(wA\xc2)*\x89\xc8\xf4\x9dN!\x19\x85k\x92>\x11\x08\xf6\x1c\xeb\xd9\xd2<@?\x9d\x0b\xecjr\xd8\x00\xd5\xe6\x9e\x16,\x12\xce\xbf*\xb7G\xbb\x96\xca\x0d\xc9\x1bYp\xa0\xce\xef\x14\xe2\x80}\x09\x91^\xe5\xfdT\xd4\xd7h\x13\x96\x1aZa&\x06\xf6E\x0b\x16\x1d\xc6\x8a\xf6=\xda\xb9}\x11\xfd\xee\x88\xc8\x0b\xda\xba\xda\x17\xcaQ\x14\x8f\xc8\xb9Q\x14\x0b\xc9\x91\xb8p\xe3T\x11\xeff\x8a\xe9;\x1e\x8d\xb6\xc9\xfb\x9c\xa2t\xaa\x8b\xda\xea\xf2\xce;E%\xd1\x95\xa7}kZ$*\xc3pM\xd2\x87\x02\xc7\xf0\xeb@\xa0\x87~\x0av\x1cs\x92t\x9f\xbcZ\xb0\xa8\x10\x91\xf1\xa9\x8d\xbb\xc4?\xa3TiL\xe9\x9c\xb4\xc3\xb6\x84\x7f[\xa2-\xf9/\\\xd2Faf\x0a\xd7\xe2\x97\x9aj\xb2XG$\xbd\xba\x80\x088>\x05\xa7'&\xd7\xd6\xe1\xfeT\x8eYm\x9b\"\xe2\xddL9}\x07S\x97\xf4y\xb9\x15%\x86\xd2\\\xbdc\xb7NT&\xe1\x9a\xa4\x11\xed\x9eO\x06\xfa\xc9[w\xd3@\xbf\x93\xa4\xeb\xfc\xa7\x04\x8b\x0a\x8a\xa4\xe3\x05+Q\xaa\xa4|NZb[B\xf9\xc5\x94t\xb9\xbd\xa4K\xe8\xe0\xa4W\xee\xc4\xfd\\\x05]]QC$\x1d\xc9\x8f\x8d(I\xf7\xc9\x17:\x80\xb6NT&\xe1\x9e\xa41\xb1\xa3-A\xf2\x15{.p\x089I\xfac\xdf*\xc1\xa2\x8a\"i\xb4\xb2\x90\xbcn\xaf\xca\xbbg\xb5r&\xf7-*\xf4\x15-\xa0\xfao+\xcf+k\xa3+O\xd5\xce\x98\xb2H\x1d92\xb1\x1a\xbd>Yn\xe8\xab-\xc9\xadI\xb0\x01\x03Kf\xf8J\x16\xf6\x9aK\x88\xd6\x94\xf8\x0a\x17\x94p%\xec\x94\x15\xca\xc9\x07\xff\xda\xd5\xf7\xe4\xd5\x1c\xa7\x7f\x10\xd4\xb6R\xf6\xb5'\x07\x1c\xc6mX\x88f\xcarA\x9c+\xcc\x0c\x95\xf4\xd2\"\xba\xf3]x\xbb\xaaEt\xf5\xa2*\"\xe9\x8f\xcbC\x02IkU\xf0\x15\xa7\x91(v\xad\x06\x99\xb37\xa2F\x99\x8c\xfe\xd9D\xe9\x92^)\xcb\xdb\x8d)\xb8\x20\x0f\x83\x85\xcan\xae6\x1f\x00\xb59\x89\"\xdf\x8b3gDV\x15T\x0fp\xdb\x9d\xcf\x93\xd5\xcb\x15\\\xa2D\x87%SpQ\xd2'\x03\x18zy,\xd8\x81\x1c%]\xef;.XTQ%\xdd.\xe3\xe3]/\xaf\xeaj\x9d^NN\x87H~\xf9\xab\x91F<\x9e#\x1d{CW\x83\xff)\xbc\xd4WpO\xfb\xce\x1a\x99\x9e\x93L\xacN<\x14*\x99\x93?su\xad|\x9c\x0d\xe8\x92\xeb#\xa1\x85\xf2A\xbe\x84\xdf\xcaO\x85\"\xed\x852W\x02\x9e\xe4\xce\xa9\x8eF\xa3t\x1a\xe0\x97KC;\x8b\x16Y\xd5\xf6\xa7\x90O\x9e\xde\xf8\xeb|>\x20q\xa0Q>\x80\xde\x94\xb7\xf7\xf2\x85\x99\xa1\x92>^\"\xd74\x1e\x18$\x9f\xcb\x96\xd1\xd5\xcb\xca\xa8\xa4[\x17(\x92\x8e\x7f\xac\x10g\xab\xe0*N#Q\xecZ\x9dX\xb4\xa0\xe1o\xe8o\x0d\x05\xd1\x18\x9b(\xa4KZ\xb9\xa6\xa0N\xc1Ey@\xbd\xd1\x90\xdc\x18\x8d\x9e6\x1d\x00\xbd9\x91\x02yu\xb5\\\xb8\xb1\xa8\x95\xdb\x0co\x17U\x06Bl\xa2\x84\x87%SpQ\xd2\xe8d\x7fwK3\xd6tO`\xc0Q\xd2\xc7}\xcf\x0a\x165TIw\xe1\xc9t\x97\xfc&\"g\x12\xfe\xe6\x8e\x97\xd4\xe0\xb3x0t\x1e\xa1w\xe9\x85\xdf\x88\xdc\x85{\xb29\xf8,O\x94\xf9i\xbc\x1e\xcbQ.\x93\xbe`\x80\x0b\x88\x85H\xb7R\xb6\x10q%\xb4M\xa7=I\x81\xf9\xdca\x06\xdeEg\xf1I<\x1dY\xd6\xe6\x9f\x82\xcf\xdc\xda\xa4\x80\xba\x8a\xb337\x9a\x0b3C%\x8d\xceo\xac\xf0\xc9S\xc8V\xa5\xb5tum)\x95\xf4\xe9\xdc\xd3T\xd2\xd5j\xffU\xc5WaT\x9cN\xa2\x98\xb5,\xf5K\xf1\xcb2\xf2\xd3\"\x93(\xc4\x0c\xbc\xa9\xee\x1a\xed\xb2\xce\x0c\xbc\xf5\x03\xc04\xa7\xa8\x16o\xb9\x13\xd5%\xff|\x99\xab\xcdm\xf4DY\x1d\x96\x8c\xc0MIc\xe2-\x1d\xe4\x12Y\"\x918\xda\x94\xb0;\x00+}\x1f\x0b\x165\xf4^\xfaM\x07\x89\xe6E\x03E\xd2\xeb\xc8\x99\x19Q\xe6h\x0dx\x1e\x1a+\xaa&C\xafU\xab\xc8\xd0\x92\xac\x0d\x91\xc1iE\x09\x9e2\xf6\xe5*\xa7\xb2\x1e\xcb\xa1\x7f\xdb3\x01%\xe4,K\x94\x913\x95)\xa1Q~\x97\x04T\x9b\x07\x0e\xd5\xd5\xb8\xa5\xca\x8c\x95\x11\x8e\xb06q\xc0`E\x03\xaa\xafN\x98\x0a3h#\xbd\xe5Y\xf9u\xbcX8\x93\xdc\x9e\x91\x202X\x9dO\x7f\x97\xce\xabW$\x8d\xea\x96\x99$\xcdVaT\x9cN\xa2\x98\xb5\x1c\x07\xfc\xa7\xfc\x07\xc8\x02\x93(\xc4H:\x0f\x7f\xfb$*\xec\xb2\xceJZ;\x00LsR\x90\xb4\x9e(\xab\xc3\x92\x11\xb8&\xe9C\x81\x8e\x9ec=-\xea\xddc\x89\xfe\xee@\xff\x19\xcb\xe0\xb5F\xcf\xbcV\xd0I+w\x8f=\xa5\xdc=\xb6N^\x16\xea\xac\x97\xb7#2\xc1+m\xebZEg\x7f\xb5\xf2\xba\xaeu2\xb9zt8ofc\xc34\xd9\xf7\xe6a.V'q\x80^9U\xe6\xebF@\xa3\xbc\xa4mc\xb9\\\xf8\xea\x01\xb6\x84F9\xbf\xa1\x0b\x07\x98\xef\xbal\xf4\xff\xba\xb3:\xefSr\xa5\xb7\xee\x00\xea\xad\xf3EO\x89k\x13\x07\xc4\xf7=;\xfd8\xea+X\xbd/\xce\x14\xc6\x12\x91\x17\x84\xde\xac($+\x0b\xe5\xa2\x86wq@\x1fY[\xd3\x19\xed\xac\x91;\xc9\xddc\xa1\x18\x8a\xe6\x99\x7f\xc4\xd2\xab\xe0*N#Q\xecZ\x96\xc4\x8c\x9a\x19\xf4\x1b\x88I\xd4\xa7\xe4\xee\xb1\xd6h\x94\x0c0\xaa\xa6\xbf\xba\xb1\xc2:\xeb\xea\x15\xef\x03\x09\xd3\x01\xd0\x9bsxZk,\xe4\xeb\x8d-\xab\xe6\x86+\x83\xfb\xa2Q\x7f]4JO#=QV\x87%#pM\xd2\xa8\x7fGK`\xebnu\x12\xd7O\xa6\xd2\xcdV\xa1\xa7\xf3j\x05\x8b\x06\xca=\xde%\xea=\xde\x91\xea\xc2)U]t\xb1o\xc9\xcc\xfc\x8aN\xb2\x94x\xbd,\xaf\xac\x8d\x9es}\x0b\xa7\x95\xac}\xd3'?\xcb\xc7j\xf4*3\xbdGM\x85%Z\xe7\xf8\xa7/m\x9f\xe3\xabfK\xd8^\xd5X\xe2+\xaaN:u\xe2\xab\xa6\xe5V\x1f\xa4\xf7x\xcb\xbe\xc3\xe4\xb7S\x8b\xda\xc4\x01\x11\x99\xfcB\xbbJV\xee\xd0\xd6\x0a\xe3\xe8,\xcf+x\x94\xca\xaa\xa2\xbd\xa14o\xfaB\xf2M\x97h\x98S\x20\x17\xcciL\xd0\x12B\xb8[,2Of\xb4*\xf8\x8a\xd3H\x14\xbb\x96\xa5\xd5\xdfJ\xdf\x99D\xd5\xa9\xb3f\xd2\xe7\xf6U\xe7\xe6\xd7\xbch\x99\x87x\x01\x8d\xf4\xfd\xd9t\x00\xb4\xe6$\x8a\xf0\xfe\xe4\xcby!\xd3\x1c\xfc\xb7j\x15\xf4\xd8\xeb\x89\xb2:,\x19\x81{\x92N\x83\x17\xe5?\x09\x16\x01\x00HfDH\x1a\xfe\xab\x12\x00ReDH\x1a\x00\x80T\x01I\x03\x80\xa7\x00I\x03\x80\xa7\x00I\x03\x80\xa7\x00I\x03\x80\xa7\x00I\x03\x80\xa7\x00I\x03\x80\xa7\x00I\x03\x80\xa7\x00I\x03\x80\xa7\x00I\x03\x80\xa7\x00I\x03\x80\xa7\x18I\x92\x86[\xbd\x01\xc0\x11\xf7$m\x18\xe8\xc4\x9a\x94\xe7\x149\xf8BX\x1b\xe8\x10\x86\xcdF%U\xb7\x98\xa1\xe3\xd8t\xc7\x00\x95\xa1\xda\xf5\xa4it#&\xd5FR\xd2O\xeaP\xf7-\xf3pM\xd2\x8c\x81\xce\xb9\xc0\xfe~\xccI\x87-\xac\x0dt\x08\x86\x8d\x8a#i\xfa\xac\xa4f\x95s\x018:\xc08\xed\xdb\x85\xda\xf5\xa4it#F\xd8H\xcb\xec\x08\x92j\x9f\xc9\xa1\xee[\xe6\xe1\x9a\xa4\x19\x03\x9ds\x81\xa3N\xd1\xc8\xde@\x87\x90\xfa\x03^\xd3\xf5YI\xd1*g\xe88:\xc08\xec\xdbE\xb0\xebI\xc3\x15\xc3\x0aQ#\xad\xb3\x93\x9cT\xa7L\x0ey\xdf2\x0c\xd7$\xcd\x18\xe8\xa4&i;\x03\x9d\xf4H\xd7g%E\xab\x9c\x8b\xc0\x10\x0b\xbb\x08v=\x17A\xd2\"\xacw(9\xa9N;?\xe4}\xcb0\xdc\x934\xd2\x0dtR\x92\xb4\xad\x81\x8ea\xa3\xc2\xf8\xc2\xe0\xc5\xd6\xfa\x99\xd3\xc8\x13|\x18\xff\x16\x0bC\x1a\xc3\xf6\x85s\x96\x11\xb9\xc50\xf6,|a\x9a\xf5\x8c\x85\x05\x8f\xd8\xd5\xc5\xc2\x01F\x14\xc0{\xdeh\xa4c\xd7s\xe1F7LR\x11c\xb6#l$\xbfC\xf6\x16<\xe2Lr\xf8W\xd5\xcf\xa0\x15w\xe1\xb8\x17\xd5\xbd0`\xf7-\xa3qQ\xd2\xba\x81\xce\xb9@\xc7\x96@s\xd8\xf4\xe0;\x13\xb6\x06:\x86\x8d\x0a\xe3\x0bC\x16K66\x96\xe4\x1df\xfd[,\x0ci\x0c\xdb\x17\xd6YF\xe8\x16\xc3\xd8\xb3p\x85\xe9^/\x16\x16<\x16\xae.B\x07\x18a\x00\xe7y\xa3\x93\x8e]\xcf\x85\x1b\xdd0Ie\xcdv\x84\x8d\xe4Z\xe6`\xc1#\xce$\x87_.\x0f\x85\xcap\xc5\xb1}%\xf5\xa7\xd5\xbd0`\xf7-\xa3qQ\xd2\xba\x81\xce\xb9@S\xf7\xd1\x9e\x96f\xbb+\xde\xf6\x06:\x04\xed\xd1\xaf\x86/\x0c\xf2\x97\xe0\xd1\xfd\xf9\x12b\xe7h<\xe1V<\xc2cm_\x8c\x12\xc4n1\x9c=\x8b^\x18\xe3\xf5\"\xb6\xe0\xb1vu\x11<[^\x1c\xc0\xec\x1bK\x1av=\x17ntc$\x95\xdbcq#\x99\xa7\xf7:Y\xf0Xd\xd2\xc0_\x8aO\x90\xf8\x1cr4\x1bIg\xfe\x94\xf9\x87Lc\xdf2\x1a7%\x8d\xd4\xe7x'\xba\xc9\xc9\x15k\xdam\x13ho\xa0C\xd0\xcf(\xf2\x9coE\xbc\xfe\xff\x20\xafm\xf2ygI\xb3\xb6/z\x09\x16n1\x9c=\x8b^\x18\xe3\xf5\x82\x84\x16<\xd6\xae.\xa9K\xda\xd87\x964\xecz.\xdc\xe8\xc6H*\xb7\xc7\xe2F\xea-s\xb6\xe0\xb1\xc8\xa4\x81\xffE\xf2J\x8f\xe6q\xf90\x8a\xe7\x9b\x1f\x00\xca\xec[&\xe3\x9a\xa4\x0d\x03\x1dmMx\xabe\xb0\x93\x81\x0eA?\xa3\x0c\xf1*C\xc1(yb\xbf\x93\xa4Y\xdb\x17=\xd6\xca-\x86\xb5g\xd1\x0bc\xbc^\x90\xd0\x82\xc7\xda\xd5%uI3{\xc1\x90\x86]\xcf\x85\x1b\xdd\x18I\xe5\xf6X\xdcH\xbde\xce\x16<\x16\x994`\x8e&\xfa\xd1Z\xf4\xee\x14\xf3\x97\xa3\xb1o\x19\x8d[\x92f\x0ctPG\x90.\xee\x08Z\x87;\x18\xe8\x10D\x92\xa6\x97\xd1\xa8E\xad\xe1\xdf\xc2\xf8\xac0\xb0\xb6/z\x09\x16n1\x9c=\x8b^\x18\xe3\xf5\x82\x84\x16<\xd6\xae.\xc9\x0e0\x16\x01v\x92N\xcd\xae\xe7\xc2\x8dn\x8c\xa4r{l#i\xd2\xb2\x14,x\xc4\x994\xf0\xd3_.\xe9\xd1D;\x0b\x07\x05\x16\x96\xfa\xbee4nI\x9a5\xd0\x09n!\x8bg\x02\xfb-\x83\x9d\x0ct\x08\"I\x17\xe1\xb3v\xe0\x8ej\xc4\xfa\xb7\x88\x0diX\xdb\x17\xa3\x04\xb1[\x0cg\xcf\xa2\x17\xc6x\xbd0=\x0e\xe3\x16c\xed\xea\x92\xec\x00c\x11`!\xe94\xecz.\xdc\xe8\xc6H*\xb7\xc7\xe2F\xea-K\xc1\x82G\x9cI\x03\xffL\xe2\x98[J\x8e&\x1a,\xdc9-\xf9\xc1\xfb\xfa\xbea>\xdex\xa1\xb7\xc3\x8dT\\\x934c\xa0s4\xb0\xed\xd0\xd1\xbd\x81\xa0\xf5\x90\xc9\xc1@\x87\xb1Q\xe1|a\xc85\xd2\xf69S\xc8\x06\x8c\x7f\x0b\x12\x19\xd2\x18\xb6/l\x09b\xb7\x18\xce\x9e\xc5(L\xf7z\xb1\xb4\xe0\x11\xb9\xba\x88\x1d`\x84\x01\xdc\xbe\xb1\xa4l\xd7\x83.\xdc\xe8\x86M\xaaa\xb6c\xd5Hc\x87\x9c-x\x04\x994U\\s\x20R5E9\xfc\xeb\xee\x98\x92|\xba\xe8\xfb\x86Y(/H\xfa{f\xe0\x9a\xa4Y\x03\x9d\x13\x1d\xcd\x81`\xb7\xb5\xa2\x9d\x0ct\x18\x1b\x15\xce\x17\xc6\xbf\xba\xbe`F-=\xffY\xff\x16\x91!\x8da\xfb\xc2\x95\x20t\x8b\xe1\xecY\x8c\xc2t\xeb\x19\x0b\x0b\x1e\xb1\xab\x8b\xd8\x01F\x18\xc0{\xde0\xa4l\xd7C\xb80\xa3\x1b.\xa9\x86\xd9\x8eU#\x99\x1dr\xb4\xe0\x11d\x92\xa3\xb4qI\xbeZ1\xb9\x81PtEE\xdb7L\xfb\xf4vA@&\xe0\x9e\xa4\xd3`\xa8\x06:p\xbf\xd10py$5\xe6\xcfL\xc3\xab\x14\x18\x11\x92\x1e\xea\x7fU^\x1eg\x9f\xc7\xb8<\x92\x1a\x82+\xdbV\x8c\x08I\x0f\x95\xcb\xe3\xec\xf3\x18\x97AR\x1b#\xa8\xba\xc1)(c\xf1\xb0\xa4\x95\x0b5\xc0E\xe5rHjL._Yt\xde)*c\xf1\xb0\xa4\xe9\x85\x1a\xe1\x8df\xc0\x90\xb9,\x92\xda\x90_m\xbe\x11\x1e\xd0\xf1\xb0\xa4\x01\x20\x13\x01I\x03\x80\xa7\x00I\x03\x80\xa7\x00I\x03\x80\xa7\x00I\x03\x80\xa7\x00I\x03\x80\xa7\x00I\x03\x80\xa7\x00I\x03\x80\xa7\x18I\x92\x1e\xea\xad\xde\x00\x90A\xb8'i\xc3@\x07\xd3\xb3\xad\xa9e\xaf}\xbc\x83\x81\x0e\x00\x00\x04\xd7$\xcd\x18\xe8\xa0xG`\xf7\x91\xbd\x81C\xf6[\xd8\x1b\xe8\x00\x00@pM\xd2\x8c\x81\x0e\xea\x20\x9e\x1b'\xe9\xa25N\x06:\x00\x00\x20\x17%\xcd\x18\xe8\xf4+O\x1d;g\x1f\x7f\xf1\x0ct\x00\xc0\xc3\xb8'i\xa4\x1b\xe8\xec\x0e\x0c:\x19\xb99\x18\xe8\x00\x00\xa0\xe2\xa2\xa4u\x03\x9d`\xb0gk\xa0y\xd7\x85\x18\xe8\x00\x00\xa0\xe0\xa2\xa4u\x03\x9d\x16j\xa0\xd3\xdcra\x06:\x00\x00\x20w%\x8d\xb4\xe7x\xd3\xbez\x20\xb0\xc7&\xd0\xd9@\x07\x00\x00\xe4\xa2\xa4\x19\x03\x1d\xd59'l\xe3\xb6\x91\x82\x81\x0e\x00\x00\xc8=I\xb3\x06:{\x9b\xa8\xbc;.\xcc@\x07\x00\x00\xe4\x9e\xa4Y\x03\x1d\xc5:\xe7\\\xc0\xfa\xf6\xb1T\x0ct\x00\x00@.J\x9a1\xd0A{\x03{\x8fv7m\x15\xd8\xb4\xaa8\x19\xe8\x00\x00\xa0\xe2\x9a\xa4Y\x03\x1dt(\x18\xd8\xb2\xd7Z\xd1\x8e\x06:\x00\x00\xa8\xb8'\xe94\x18\xaa\x81\x0e\x00d\x1e#B\xd2\xf0_\x95\x00\x90*#B\xd2\x00\x00\xa4\x0aH\x1a\x00<\x05H\x1a\x00<\x05H\x1a\x00<\x05H\x1a\x00<\x05H\x1a\x00<\x05H\x1a\x00<\x05H\x1a\x00<\x05H\x1a\x00<\x05H\x1a\x00<\x05H\x1a\x00<\xc5H\x924\xdc\xea\x0d\x00\x8e\xb8'i\xdd@g\xb0)\xa0\xd0l\xbf\x81\x9d\x81N\xef\x82\xc2\x82\xaaH\xd9>\xf36\xb6<+\xcb!\xa7\x18\xf2\x88a\xb9\xd4)\xe6\xa2\x11\x99\xbe\xd3)D\xe7l}Q\xee\x02\xc7\x87%#T%\x93\xfd\x0c\xe1\xd7*\xa7P\x0b,\x12U\x87\x8b\xcc\x13\xfd\xf7z\xaa-\xa3\xa4\x91_-;\x96\x15'\x93\xda1\xf6\x14\xaeI\xda0\xd0\x89\x05\xf6\xf6c\xf6*\x0f\xe8\xb7\xc6\xc6@\xa7\xd7\xf7h\xe7\xf6E\xa9\x1e\xbdH\xaf\xf2~*\xeak\xb4\x8f\xa4\x1c\xa8\xf3;\x85\xa4\x88V\xb1\xf5\xda\xae\xbc\xd4v\x81P]\xd4V\x97w\xde)\x0a\xa1\xbe\xd5r$\x86bQyuj*H\xc6\"Q\xc7\xa3\xd16Y\xf4-\x9aj\xcb\x14\x04\xf9\x15'J\xcf\x8ee\xc5\xc9\xa4r\x8c-j\x1b\xa9\xb8&i\xc6@\xa7\x9b<\xd9d\xa0i\x97\xfd\x06v\x06:5\xd5\xe4\xb5.EI\xff\xdb\x12m\xc9\xefx\xb8\x09\x8d\x17K\xd2F\xc5\x96kS\xed\xdb\x10:/\xb7\xa2\x84\xfd\xb3\xcfUZe\xf2\xa0\x89\x04\x8e\x1f2V\x89:(RV\xea-SH\xce\xaf8Qlv\x84\x15\x0bq>\xc6V\xb5\x8dP\\\x934c\xa0C\xd9\xb6\xc5\xfa\xa9&\x14;\x03\x9d\x92\x06\xf2\xda+w\xa2T(wK\xd2\xe5\xc2sG\xbc\xd6\x91>9\xd51\xfa\xa5\x96t\xea-SH\xce\xafsJ.\xa6\xa4\x9dk\x1bQ\xb8'i\xa4\x1b\xe8\x10z\x02'\xeccm\x0dt\x96\x16\x1d&o]\xb4k\xd8^\x95w\xcfj\xa5\x93`\x165v\xca\x0a\xe5\xe4\x83\x7f\xed\xea{\xf2j\x8e[\xc5\xe2q[\xed\x8c)\x8b\xd4\x81a[y^Y\x9b\xb2\xbaoQ\xa1\xafh\xc1)\xb4R\x96\xb7+\x93\xc1D\x91\xef\xc5\x993\"\xab\x0a\xaa\x07\xd8\xc2V\xca\xbev\xb5\x0a\xb6\xe2\x81%3|%\x0b{M\xcd9\x9f'\x1bs\x07\xad6\xa6\x04\x86\xc1Be\xb3\xd5\\l\xafO\x96\x1b\xfajKrk\xb8\xce\xde\x90\xb4Q\x18\xd7^\xa39\\\x09\xd1\x9a\x12_\xe1\x82\x12R\x84\x91(#\x96\x90\xac\xac\xb4Z\xc6\xe5W\xcb\x998Q|v\x8c\x8a\x99F\x1a\xb0\x8d\xf4\xaf\xaa\x9f1m\xa12\xe70\x92\xaa\x1d7\xfe|\xf0\x04.JZ7\xd0!\xb4t\xd8\xc6:\x18\xe8\x1c/\x91k\x1a\x0f(\xdd|\xbd\xbc\xaa\xabuzy\x82_\xd4\x19\xd8\x17\x9dS\x1d\x8dF\xffL>\xf8\xe5\xd2\xd0\xce\xa2E\xa6\xcd\x0c\xfa\x0a\xeei\xdfY#\xd3S\xae\xce\xdf\xd0\xd5\xe0\x7f\x8a,F\xf2\xcb_\x8d4b\x89(35:\x19\x8c\x14\xc8\xab\xab\xe5\xc2\x8dE\xadla\x7f\x0a\xf9\xe4\xe9\x8d\xbf\xce_\xc4W\xdc%\xd7GB\x0b\xe5\x83\xa6\xe6\xf4F\xa3Z\x9f\xa2\xd7\xc6\x94\xc0\xd2\x1b\x0d\xc9\x8d\xd1\xe8i.6\x1e\x0a\x95\xcc\xc9\x9f\xb9\xbaV\xe6\x12dH\x9a)\x8cm\xaf\xd1\x1c\xb6\x84\xdf\xcaO\x85\"\xed\x852I\x89\x91(#\x96\x20\xe8,\xd3i\x19\x9b_=g\xe2Dq\xd91*f\x1bi\xc0n\xe6\x97\xcbC\xa1\xb2<\xf2\x9d\xaf7\x879n\xdc\x01\xf0\x04.JZ7\xd0\xc1\x1c\xa13k\x1b\x1c\x0ct\xceo\xac\xf0\xc9S\xc8wx\x97\xfc&\"G<\xc4-r0\x03\xef\xa2\xb3\xf8\\\x9a\x8e\xacb\xab\xe6\xe0^#QFN\xb9w\xe5\x08~\x8d\xc8]\xf8\xfc,\xa9\xc1\x1a\x19\x0c\x91\x0b@\xf4$\xa3#\xc7\xa2Z\\\xc8NTW\xcf\x17\xe6\x9f\x82O\xe2\xda\xe9|\xc5\xb1\x10\x19\x0e\x94-\xe4\xd7\x12r\x95\x93\x96\xa9\x8d+\x81A\x1f\xde\xb2\xb1\xa8\\\xa6\xdd.\x17\xc9\x0e\xbc\x8d\xc2\x98\xf6\xf2\xcd\xd1Jh\x9bNt\xd2V@%\xad'\x8a\x8bu\x18x;\xb6\x8c\xc9/w\x00\xc4\x89\xd2\xb3\x83\x8c\x8a\xd9F\x1a\xb0\x9b\xf9K\xf1\xde\xc7\xe7T\x98\x92\xaa\x1f7\x18x\xb38\x15\xeeL\\\xed\x9d;Z\xec\xe3R0\xd0\x89G~D\x0e\xd6\xd2;\x06\x13\x98\x99\xf5\xdc\"\x07#i\xf2'z`\x85\xb1\xe7\xe5v\xf2\xd6@\x02\xea\xcb\xe8\xaa\xd2:r\xf6\x19\x97H\x19I\x87\xf0y6\x80\xd6.\xe3\x0b\xa3\x8f\x1dO:w\xce\xb6\xd5\xdcQ\x20\x97\x99\xd6\"\xfd\xa4ej\xe3J`\xd0\x85\xc3\xc6\xa2r\x7f\xb2\x05\x20'i\xbd0\xa6\xbd|s\xb4\x12>\x9dQ\xb2\xb2\xbd7A\xc7>F\xa2\xb8X\x07I;\xb5\x8c\xcd/w\x00\xc4\x89\x12I\x9am$\x03\xb3\x99\xffE\xf2\xda&\x9f\xe7\x93\x0a\x92\x16\xe2T\xb8\x1d\x8c\x81\x0e\xa6\xc9\xfa\xb1\xfc\x14\x07\x03\x9d\x83\xf4rY\xa2\x0a\x7f-\x97\xa9s#~\x91\xc3ty\x8c\x1eXal\xaf\x1cEZ@\xd5\xa3t\xd5\xa3\x15\x9aD\xcc%\x14\xbd\x8b\x0e\xfa\x10Z\xb7\x8c/Lx\xee\x1c,*Y\xdb\x19\xad\xb6\x964S\x1bW\x02\x83.\x1c6\x16\x95\x0b\xe6\x84m\xf2\xdf\xf1kL&\xb3Ha{\xf9\xe6\xe8%\x9co_R*\x17\xbd\x8a\xb8\xcd\xb8X\x07I;\xb5\x8c\xcd/w\x00\xc4\x89\x12I\x9am\xa4\x01\xbb\x992X\x8f\xe2\xafa\xab\xa4\x82\xa4\x0d\x9c\x0a\xb7\x815\xd0!~\x1bG\xec\xc3\x1d\x0ct\x8aV\xd2\xb7\x869xPyG/\xe5,\xb7\xc8A\x0fa;\xe93\x8c\x03+\x8c=KU\x80\xe8\xe5\x9b\xfa;\xe8\xaa\x92:2t3\xf5\xd2\xb4\x9b)\x8a\xa0\x83~E\"laI\xe7\x0e\xa9\xb8\xb4\x82\x0c\x0c\x17\x95\xf1k\x09Z/m\xd4\xe6(i6\x16\x95\x9b\xe6\xdc\x84(m\xaf\xa2\x1fF\xd2F{\xf9\xe6h%\xf4\x92\xdby\xfe\x1e\xca\xe5\xbf\x09\xb8X\xa7^\xda\xa1el~\xb9\x03\x20N\x94H\xd2l#\x0d\xd8\xcd\xfc\xf4B];\x1e\x90$%\xb5\xc1tX\xbc\x81[\x92f\x0dt\xc8TZ\xbbL&\xc6\xc9@\xa7p&\x99\xd7&\xc8Y\x13Qfc\x0d\x1b\xb9E\x8e\xeaj\\\x8c2\xd1\xd5\xcfTqlE\x09.\xb7/\x97\x04t\xd1\x80\x10\x19\xdb\xc7\x8a\xaa\xc9@o\x15\xb9\xee\x9e\xb7\x16\xd7[a\x92\x08[\x18+H\xbd\xe2\x12rz'\xca\xcaL\xcdA\xfaI\xcb\xd4\xe6(i6V\xd8\xe3\x0cL#\xe3\x9a\xfai\x03\xc8B\xd2\\s\xf4\x12\x1a\xe5w\xc9[u=\xb7\x19\x17\xeb\x20i\xc7\x961\xf9\xe5\x0e\x808Q\"I\xb3\x8d4`7\xf3\xcf$\x17>J\xab\xf9\xe6\x18\xc7\xcdt\x00F>\xaeI\x9a5\xd0A=\x01;oig\x03\x9dB\xb9\xa8\xe1\xdd\xcejz\x93\xe0:yY\xa8\xb3^\xde\xce/\xb24\xfa\x7f\x8dc?%\xd7=\xeb\x0e\xa0\xde:_\xf4\x94E\xec\xe1\xbc\x99\x8d\x0d\xd3d\xdf\x9b\x87q7\"\xaf\xebZ'\xd7\x92\xd5\x91\xdc\xd2\xb6\xaeUt\"X5\xfd\xd5\x8d\x15$\xe0\xf0\xb4\xd6X\xc8\xd7\x1b[V}\x9c)\x8c\xabB\xaf\x18\x9f\x88K\xda6\x96\xcb\x85\xaf\x1e`\xd7\x0e\xee\x8bF\xfdu\xd1(I\x89^\x1b_\x82\x8er]\xf9\x00\x9d\xb5\xe8\xb1\x89\x03\xf4\xeam\xd2\xa5\x86\x90\xfclW=9g\x99\xc2\xd8\xf6\x1a\xcdaKh\x94\xf3\x1b\xba\xf0^D\xb860M\xff\x94\xdc\xc4\xd5\x1a\x8d\xf2\xfd[:-c\xf3\xcb\x1e\x00Q\xa2\x98\xec0\x15\x1b\x8dda\xf3\xeb\x97k\x0eD\xaa\xa6\xf4!\xee\x10\xea\xc7\x8d\xad\xcd\x1b\xb8&i\xce@\xe7\xc8\x16\xdbPG\x03\x9d\x8a\xf6\x86\xd2\xbc\xe9\xea\x8f\x8f\x91\xea\xc2)U]\xe6E\x86\xf8\xaai\xb9\xd5\x07\xe9\xfd\xbf\xb2\xef0\xf9\xb9\xf3Y\xab\xd8\xbe\x85\xd3J\xd6\xbe\xe9#\x01\x89\xd7\xcb\xf2\xca\xda\x94+\x00}Kf\xe6Wt\xd2\xa5\xea\xdc\xfc\x9a\x17e\xb9\xbeH\x96C\xf9r^H\x99\x0dj\x85\xf1Uh\x15\xa3D\xeb\x1c\xff\xf4\xa5\xeds|\xd5\xec\xda\xdf\xaa\xd3I\xf2U\xa1\xd7\xc6\x97\xa0\x11/\xa0\x91>\xfa\xd3\x8b\x1e\xdb\xabl\xff(2\xd3U\x9eWNv\xcd(\x8ck\xaf\xd1\x1c\xb6\x84\xedU\x8d%\xbe\xa2\xea\x08\xdf\x06\xa6\xe9uj{\xb9\xee7\xbd\x961\xf9e\x0f\x80(QLv\x98\x8a\x8dF\xb2\xb0\xf9-m\\\x92?\xa3V\xb9\xd8b\x1cB\xed\xb8q\x87\xc5\x1b\xb8'\xe94\x00\x03\x1d\x00H\x95\x11!i\xf8\xafJ\x00H\x95\x11!i\x00\x00R\x05$\x0d\x00\x9e\x02$\x0d\x00\x9e\x02$\x0d\x00\x9e\x02$\x0d\x00\x9e\x02$\x0d\x00\x9e\x02$\x0d\x00\x9e\x02$\x0d\x00\x9e\x02$\x0d\x00\x9e\x02$\x0d\x00\x9e\x02$\x0d\x00\x9eb$I\x1an\xf5\x06\x00G\xdc\x93\xb4n\xa0\x83\xd0\xc0\xae-\x81-\xbb\x06\x1c6\xb03\xd0\xd1\xb9\xf4\x86)\xe9x\xde0\x88Mf:\xc9\xff\x0c\x92'\xd8\x1a\x8e@\x89\x869\xd3|\xd3\xeei$O'\x91\xab\x12\xd4\x09\xc7\xf4\xbf\x84Cm\x83\x90\xce\xd2\xdc\xb2Py\xd2\x7f\xa4\xda\x93\x86\xa5\x0d0\xcc\xb8&i\xc3@\x07\x9dk\xda\xdas\xb4gK\x93\xfd\x93M\xec\x0ct\xd26\xc5\xb9\x88\xa4\xe3y\xc3\x206\x99\x19\xd8\x17-Xt\x98s\x04\x8a\xc8\x0b\xda\xba\xda\x17\xcaQ\x14\x8f\xc8\xb9Q\x14\x0b\xc9\x11\xf3\x03#\x84m\x18\x9a/\xcc\xebrm\xe7Z9\xdd\xc7\xf8\xa7ai\x03\x0c3\xaeI\x9a1\xd0\x09\xb7\x90\xe7\xfe\x0c\xb6\x84m7\xb03\xd0I\xdf\x14\xe7\"\x92\xba\xe7\x0d\x83\xb5\xc9L\xe1Z\xc49\x02\xad.\x20\x02\x8eOYM\x9e\x08X[\x87\xd0\xc7r\xf2v\xa26\x0c\xc9\x17\xa6On\xc0\xaf\xab\xd3\x954J\xc7\xff\x02\x18V\\\x934c\xa0\xd3\xb1\x95\xae\x08\xda?\x9d\xdf\xce@'\xe9\xa9\x9f\x97=\xd6&3T\xd2\x8c#P5}\xbe&\xaa\xa8!\x92\x8e\xe4\xc7\x84\x92\x161\xa4\x07_>5\x9d|\x81\xfcI\xe6\x1f\xcf\x97\x0a\x20\xe9\xcb\x04\xf7$\x8dt\x03\x9d3M\xe13\xf13\xe1\xa63v\xb1v\x06:\xe9\x99\xe2\xe8\xf67HhSC\xe6\xaa\x8d\xa8QV&\xe5Z\x09\x16\xce2ix\xde0\x01\xbc\xc9\x8c\x09*i\xc6\x11\xa8Jy\xb2\xe6\xa2*\"\xe9\x8f\xcbCI\x926\xda`a\xd7\xc3y\xff\xe8\xf0N8\x1a\xd3\xd6\xd2\xb7\xd7\x8f[l\xc6fG\xe8\xa5\xc3x\xd3\x20\xab\x03\x00\x0c'.J\xda0\xd0\x89u\xe0\xa5\x0e\xfb#og\xa0\x93\x96)\x8ea\x7f#\xb6\xa9\x89E\x0b\x1a\xfe\x86\xfe\xd6P\x10\x8d1%X9\xcb\xa4\xe1y\xc3X\xf0\xb0&3f\xa8\xa4\x19G\xa0\xb2et\xf5\xb22*\xe9\xd6\x05\xc9\xbd\xb4\xde\x06\x0b\xbb\x1e\xd6\xfb\xc7\x80w\xc2QQ\x1f\x96\xaf\x20\xda\x8c\xcd\x8e\xd0K\x87\xf1\xa6\xb1:\x00\xc0\xb0\xe2\xa2\xa4u\x03\x9dxGKO\x7fOK\x87\x9du\xa5\x83\x81N\x1a\xa68\x8c\xfd\x8d\x85MM\xfdR\xfc\xb2\xac\xde\\\x82\xd0Y\x06\xa5\xeey\xc3\xd9\xc98\x0c\xbc\x19G\xa0R\xe5\xf9\x89\xb5\xa5T\xd2\xa7sO\x8b\x06\xde\xda\xd3p\x85v=\\\xc5:&o\x1a\x85\xc3\xca\xc5\xf4x$\xa51\\\x17K:y\x8f/\x0e\x20iK\xdc\x934\xd2\x0dt\xb6*c\xa8\xa0\xd5\xec\xe8\x8b\xef\x14S^FhCq\xf1;\xea\x8cuC\xf1\xac\xb7^~`\xf6\xd3\xffCc>y\xe6;\xb3\xeeS\x97\x0d\xe2c\xb5\xde\xab\x7f\xfe\xb8\xab\xbf\xa5\x0e\xbc\x9b&gOxD\xd1\xc0\xa1o\xe5\x8c\xbe\xee\xf6~n\xa3\xf5\x13\x82=ROp\xc2K\x9a\xa4\xd1\x86\xef\xe0\x97/\xdf\xfe\xf1\xdd\x0f\xbc\xfc\x99\xd61\x82\x00\x00\x0f\xfaIDAT9\x0d1j\xfb\xf2\xad\xc7f?\xfc\x06\x9dl\xff\xcf\xf3\xdf\xbd\xf7\x19e\xe0\xad\xc7\xfeqVq\xf1\xa6O\x9e\xbf\x7f\xf6\xd3\xff\xa4\x1b.\xcf6=`M\x95\xf4\xe6[\xc7\x90\xd7\x07o\xbc\xea\xfao\xfc\x92*\xf5g7\x8f\xb9r\xccW\x7fN\x16\xbfw\xc3U7|\x8f\xae\xfc\xf9\xd7\xae\x19s\xb3:\xf0\xd6b\x91\xb1\x9b-xZ\xbe\x02\xad\xc0\xaf-l\x1d\xe7\xb2%iT3Y\xfa\x814:\xf0\xc8\x84\xec\xdbq\xcf\x19\x94\x14&\xd1\x10-%\xfb\xaf\x90\xa4\xe5\x87\xe6\x8f\xcf\xbe}0\x9e\xa3\x04\xfe\xbd17\xfc\x0a\x7f\xfe\xc9U7|\xfb\x89\xbb$\xa2\xe4[\xae\xbc\xeb\xf1\xbb\xae\xbc\x85\xc8\xfc\xaa\xeb\x1f|\xfc_%*i=\x16\x19\xbb9\x10\x1e\xbb\xfc$:\xb9\xfc\xea0\xdfi\xef\x0d\x87\xb3\xe8\xd5\xb3\x9e\xe6+\xa4\x9c\x15k\xc6~\x8bxz\x87'L\x0d\x87\xc3\xf4\xaa\xa4\x9e\x92XK\xf3W&\x8c\x1d\xf7\xc8|\xe9(\xda\x1fn\x96V\x84\xc3D\xbbA\xa92\xdc2w\xd4\x1e\x12\xcb\xe4\xcc\xc8\xe4\xe0\x89\xf0\xe4\xab\xf5J\xe39\x93w\x1dS\x87\xfaI{,\xae\x8d\xad\x18Uf-\x0f.\xcf\x9a\x8f\xb8\xe60\xf0\xb5\x01<.JZ7\xd0\x19h\x0a\x9e\x8c\xf5\x07\x03-\xd6\xa1\xc6\xc0\xfbNr\xadJ\x19\xde\xdey/\xee'\x9f\xbf\x0f/}~\xff\xd3\xb8K\xfc\xe2\x1d\xf3\xf5\xb3\xa0tDY\x98:\x9e\\\x86\x9b\x94E\xd7\x05\x10\x19\xb8\xe1n+6\xee\xf68y\xda\xb0\xd9_o\xdbhi4\x1d2\xa8\x92~\x1fO\xa6\xdf+~\x1b/\xfd\x1e\x0f\x12\xd8\xda\xde/\xfe\x80\x86\xbd\x8f\xd0\x8f\xbfOV>LZ\xc6\xc4\"\xf4p\xf1\x93\xff@_\xaa\xd7\x01\x8eJ\xa6\xef-M\xd2O\xe0\xc9\xf4\xe3\xd2\x83x\xe9\xdf\xa5\x1f\xe2\x81\xf85\xff\x8a\x85\xfd\xcb\x1f\xbeB\xfe\xf2\xc4f\xf5\xf5\xc6k\xb1\xee\x7fu\x03\x91\xb4\x11\x8b\x98\xddD\x95d,=O0\xd6\xcdV/\x88g]\x8d\xc51?\x87.\xeb\x03o&%x\xadt\x1b>&\xf4\x9a\x98>\xf0\x1eh!\x02\xba\x89\xfc\x0e\xcc\xe4\x8c\xd9l.\xee\xce\x99A\xfa6\xfc\xf1\x9b\xcab\xd2\x1e[\xd6\xa6/n\x93\xc8L\xacC\xb9\xa6\xcd\x04\xe8\x98j\x038\xdc\x944R\x9f\xe3\x8d\xce\x04q\x7f\xbd;hs\x94\xc4\x92~A[|\xbf\xf8\x0f\xc2\xcd\xb6\xaa\xe7\xfa9z\x16\xa1\xe5D\xd2\xf3\xc6\xc7\x071\xe3*\xc9\xb9\xb3_\xb0\xd1\x99GF\x8f\x93\xc6e->\xa3K\xfa\xed\xe2\xcf\xd0\xf3\xf7\x7f\xf1O\xccw_\xe0j{A\xf9\xcd\xea\x81\x0d\xe8\xb3\xe2\xb7\xc8\xd2&\xd2\x1c&\x16K\xfa\xce\xbf\x1ae\x1fUNd\x03M\xd2\x0fJ\xafl\xbe\xf9\xda_\xfe\x0as\xcd-\x9b\xb5\xb5\xb4;V~\xb3\xba\xfe\x96\xcd\xaf\xd0N{\xf3]D\xd2F,2v\x13w\xa1\xd9\x03h\x20[\xf0@t]\xd2D\xee\xea5\x05]\xd2LJ\xf0Z\xe3\x82\x961\x97>\xf9\xd2\xed\xe3\xc7J7!.g\xccfG\xb7\xe9?Fc\x06r\xc6\xaf\xdf\xa16)i\x8f-k\xd3\x17+o\xa2o\x13\xcd\x01:|m\x00\x8fk\x926\x0ct\xc8[\xecL\x025\xd9xb\x89%\xad/\xbeQ\xfc\xb9p\xb3\xdd\xea\xa8O\x1d\x99\xd2Sy\x92:\x89\xc4]\xcezI\xf4\xe8\xf059\x01<\x97^\x9f\xf3\x9c.\xe9_\xdcM:[\x85\xa7\xb9\xda~\xfc4}{\xfa1\xdc'\x7fD\x96hs\x98X\xfc\xe11\xa6\xec=\x92i'5\xf1~\xe3\xaa\xcd\x9boP[\xf6Uu\x1c\xaep\xe3W\xe9\xdbWo\xdc\xfcS\xe9'\xba\xa4\x8dXd\xec&\x1e\x92\xe6lE[s\x12(\x09]\xd2\xe4\xdd,i&%\xf8\xc3$}#]\xd2{\xae\x1b\xb7xk\xf86\"5&g\xdcfxv\xbbG\xfb\xc3\x1e\xc9\xb0\x0aO\xdac\xcb\xda\xf4\xc5\xa9J\x07\xff\xcd\xc9\xa6\x00\x16\xa66\x80\xc7-I3\x06:\xf8D$K\x87\x02\xfcU*\x0e\x93\xa47\x99$\xfdA\xf1\xef\x85\x9b\x0d(SHtF\"\x17[\x10\xbd<6\x7f\xfc^\xcaI2\xb6\xfbP\xb4U\x9c^\xf1&\xf3{E\xd2_\xdc\xf7\x0c\xe9y\x7fO\xf9\x8c\xab\xed\x85\xfb\xc9\x95\xb1/\xef\x7f\x01\xfd\xaf2\x91\x7fA\xe9\xa5\xf5X,\xe9g\x98\xa2W\x8c6\xfd\xca\xab]\xf1\x1es\xf3\xe6\xcd_\xbb\xf6\xa7\x94\x9f\xf3\xbd\xf4\xb5\xf4\xedZ\xbd\x97\xa6\x97\xc7\x8cXd\xec&\xe6\xa1\xb9h\xeeC(\x19KI\x07\x8er)\xc1k\xbf\xa5o\xa4Kz\xe2d\xd2'~\x8bH\x9a\xc9\x19\xb7\x99\xc5\x15\xef\xe4=\xb6\xacM_\xac\x1cO\xdf\xc6W\x9a\x02X\xe0\x8a\xb7%nI\x9a5\xd0\xe9\x09\xe0\xa3{\xae\xd9\xee\xde\x01C\xd2\xb3\x7f\x815\xf6\x98I\xd2\xff\xb8\xefIr\xd9\xea\xe5\x97\xcd\xdb\xcd\x1b\xaf\xf4X\x93\xc7\xe1a\xf4\xa1,r*w(\x97\x83\x97?G~a\x99J\x84\xfbP\x92\x06\x8e]}\x8c\xbe+\x92\xdeD$\xfc\x8123\xde\xf4\x1b\xae\xb6\xf7\xe9\xdaw\xc8\\\xfa\xb1\xfb\xb1\x82\xff2[\xf9\x86\xd1cyI'&~\x13\xf1\xa8\xe2\xbd\x8b\xbc>Af\xd1x\xf9\xdb\x9b7\xbf2\xe6_H7}\xeb7\xc8\xac\x99\xac\xfd\xa1\xf48\xee\xb0\xafy\x85\\##\x926bI)\xdan\xe2\x0e;\xab?Kt\xb2\x8b$=u*B'H6\x98\x94p?m\xe9\x92\x1eGt\x95\x98D$\xcd\xe4\x8c\xdb\xccB\xd2\xc9{lY\x1b3\xb5'c\xf5f\xa5r\x8b_\xda@\xd2\x96\xb8&i\xc6@\xe7P`\xcf\xb1\xfdMA\xeb\xc9\x91r\xc5\xfbw\xf4~\xd0\x1f\xdf\xf7\x9b\xd7\x1e+\x9e\xf5\xf6\x7f\xff\xf5\xa3Y\x1b~\xf7\xe5\x1f6\xcc\"W\xc2\xffs\xf6\x03o\xbd\xff\xb22\x9de94J\xb9\x9a\xdd\x9d=n\xc5\xf2\x9cQW\x90;[\x16K\xf3Z\x82\x95\x12\xb9\xddjG\xd6\xc4\x97\xb6=\xa4L\xb4\x05pw\x8fm\xfa\xfa\xf3\xef\xbc\xf7\x02\x15+S\xdb\xf3\xc5\x9b\xde\xdbTL\xaex\xffq\xf6w_\xdbt/i\x19\x13\xfb\xcf\xff\xfa\xe8\xfbO~\xf4\xd1'j\x81k$\xf3o\xef\xf4\xee\xb1'nQ\xee\x1e\xbbK\xfa\xda\x0f\x1f\xbf\x85^\xf8\xfa\xc9U\xd7\x7f\xef\x89[%r\xa3\xe8\xd7\xa4\xbb\x1e\xc7\x7f\xc1K?\xbd\xea\x9ao\xdf5F\xba\xf2\xc1\x9f1\xb1\xa4\x14m7\xb1\x84\xc6\xdd>\xce<\xee\x8e\xef\x0e\x87\xb3*\xc3\xe1s\xa8?<\xbar7\xda[9\x9a^\xc7^\x91\xb5f\xebm\xd9\xe4\xcbKO\xc9\xe0nz\x1d\x9c\xce\x83\x95+\xde\xbbIi+\xa4y/=7I\xcaY\xb3\x9b\xcb\x19\x93I2\xb9\xd1G\xd8\xc6D@\xb0\xc7\xe2\xda\xd8\x8a\xd1\xfcQ\x8b\x83\x8bG\xcd7\xad\xe5\xd8\x9b4\x9e\x07T\\\x934k\xa0\xf3aK\x20\xf8\xa1`\x02\xa8\xf2\xf9\xbdtf:\xeb/\xe4\xc3'O\xce\xbe\xfb\xe9M\xc5\xc5\x1b6\x90U\x7f\xb8\x1b\xbf\x92\x1bA\xfe\xf2\xccw\xef~\xec\xbd\xe4m\x97g)\x87\xfe\xd0\xdc\x9c\xf1\x8b\x03WH?\xc0\xcb\x1d\xb7\xe5\\=U\xf9\x11\xfc\xd0\xbcqc'oM\xdeL\x81\xde\xe3]|\xbf\xfaE\xf1\xc1\x93\xdf\xb9\xf7\xc7\xef\xd3E\xa3\xb6/\xdexx\xf6\xc3o\xd0/\x9bO\x9e\xbe\xf7\xfe_\xbc=\x8b6G\x8b\xfd#3\xa9&\x17\xaf\x92n\xf2R\xee\xf1\xbeV\xf9\xd9y\xf3\x13\xff2f\xcc\x8dO\xd0\xc5\x9f\xdd|\xcdU7>N\x96~E\x7f\x97\xfe\x15]\xf9\xd51\xd7~\xe3\xc1+\xa5[\x99XZ\x8c\xb6\x9bx\xae\x9b\xc5\xff$\x87\xd93J\x99\xbc\x06\xd0\x0f\xf0\xeb\xe8\xeel\xfcJ\xf2\x10\x7f('{\xaa2%\xd5R\xb2_\x09%=k\xfcj\xbax\x05\xf9\x95+\xb1fBV\xce\xbc\xc0\xf8\xd1\xb8_gs\xc6d\x12\x9d\xb8b\xde\xfe\x13\xf8\x20\xc6\xfb\xf7\xce\xcb\xd2\xe6P\x82=\x16\xd7\xc6,\xe2\xea\xd6\xdf\x94}\xd3K\x09\xd3Z\x0e\xad6\x20\x09\xf7$}\x89xht\x8bS\xc8\xa5\xa2yt\xa5\xf9\x8e\x89\x8b\xf6\x9fX\x97\xc1nn\x9dH/y\xcd\x95\xa4\xafh\x17\xcaE{|\x91Pk\x03\x92\xf0\xbc\xa4\xd1\x9aq'\x9cB.\x0dg\xae{.y\xa5\x93`\x9dQ\x0b\xba\x1cv\xf3\xc4~\xdc;\xf7\x7fxL\xfb,\xdc\xe3\x8b\x06\xad\x0dH\xc2\xfb\x92\xbe\xbcq\x12\xac3N5\x00\x19\x06H\xda]\x9c\x04\xeb\x8cS\x0d@\x86\x01\x92v\x17'\xc1:\xe3T\x03\x90a\x80\xa4\xdd\xc5I\xb0\xce8\xd5\x00d\x18\x20iwq\x12\xac3N5\x00\x19\x06H\x1a\x00<\x05H\x1a\x00<\x05H\x1a\x00<\x05H\x1a\x00<\x05H\xda+\xc0\x0d\xcf\x00\x05$\xed\x09\xc0N\x06\xd0\x00I{\x01\xb0\x93\x01t\\\x95tw@\xfd\x97\x9d\xfe`\xa0\xc3\x9d{\xf0\x19g\x19\x0b\xb7\x18{S\x9c!\x13\xbc:\xf5\x07\xe2i\x8d\xac\x94$)\xfb\x90\x20\x00\xecd\x00\x1d7%}.\xb0K\xf9\xef\xf9c\x81\xf0\xa1p@\xff\x07\x9eK\x09\xe3,c\xe1\x16\xe3`\x8a3T\x16KN\x06\x19\x06Z#\x8f\x86\xc3/\x09\x9f\xe6\x01v2\x80\x8e\x9b\x92\x0ev\x1c\xa3\x92N4\x93\xff\xdf\xdf\xd5\xec\xca\x05\x1e\xbdRk\xb7\x18{\x07\x8d!\xb2\\Z\xee\x14b`dF\xfc\x80\x1exl\x0f\xa0\xe3\xa2\xa4\xbb\x9b\x06\xfa\xa9\xa4{\x02\xe4\xa1\x93\xd4\x1e\xcbE\xac\xddb\x86E\xd2+\xec\xad&\xad\x00I\x03\x0e\xb8'\xe9s\x81CH\x91t\x872\x11\xdc&x\xfc\xf4\xf0b8\xcb\xb0n1,\"S\x1cda\xd7#r\xcd1\x1b\xe8\x18\xacQ<>\x8e\x8eU*\x96\xc6\xb2\xf3\x0e\xc6\xe8\x86i$A,^\xb0\x93\x01t\xdc\x9341\xb7S$\xbdUyn\xd6.\xcbg\x80\x0d\x1b\xba\xb3\x0c\xeb\x16\xc3\x204\xc5\xb1\xb2\xeb\x11\xb9\xe6\x98\x0dt\x0c\xd6K\xd4\xa65\xde\xb4^!\x10g\xfe\xc8\x18\xdd\xb0\x8dDBI\x83\x9d\x0c\xc0\xe2\x9a\xa4{\x88\xf7\xac\"\xe9&\xe5\x91v{\xec-\x92\x87\x09\xedi\xb8\xc2\x81\xb7\xd8\x14Gl\xd7c\xe5\x9a\xc3\x19\xe8\x18\x04\xd4\xe7\x92\x9e8\xa2`z\xcc\x10kt\xc34R$\xe9\xb9\x12\xd8\xc9\x00\x06nI\x1a\xcf\x9c\x13\x89\xc4\xd1\xa6DBw\xae\x0c_\xfa^\x1a\xd9K\xda\xc2\x14Gl\xd7c\xe5\x9a\xc3\x19\xe8\x184)\xcf\xca=\"i\xf0O\xb6e\x8dn\x1c$\x0dv2\x00\x8b[\x92>\x12\xd0\xe8G\x1d\x8a\x96\x82\x97|.M\xb0\x93\xb4\x85)\x8e\xd8\xae\xc7\xca5\x873\xd01\xd8u\xb5\xa2\xcdpP\xc1\xf4+\x14\xfb\x08}\x07I#\xb0\x93\x01\x18\xdc\x92t\xe2$\xa1;p\xf2d\x02\x8f\xc1\xc9\xaf\xc1\xe7\xdc\xb9\xe2m'i\x0bS\x1c\xb1]\x8f\x95k\x0eg\xa0\x932\xe9I\x1a\xaex\x03:nIZ\xa1_\xfd]\x9atQ;\xdc\xf9]\xdav.-6\xc5\xe1\xedz\x8e<\xa7\x0c\x99\xad\\s\xac$m\xbf\xb7\x20i`\x88\xb8)\xe9D\x7fw\xa0\x9fx;\x1f\x0d\xec8\x12&~k\x97\x18\xc3Y\x86u\x8ba\x10\x9a\xe2\x98\xecz\xe6J\xb7+\xc1\"\xd7\x1c\x93\x81\x0eCp\xac\xcd%-\xd6\xe8\x86i\xe41r\xf7\xd8\xfap8)S`'\x03\xe8\xb8)\xe9~2\x95\xa6\xbf\xb8\xf6o\x0b\x04]\xb8\xc7\xdbp\x96a\xddbXD\xa68\x88\xb7\xeb\x09\xe4h\x96Z\x02\xd7\x1c\xde@\x87e[\x8e\xcdm\xd9\xac\xd1\x8d\xd1Hz\x8f7!\xc9\xf9\x0d\xecd\x00\x1d7%\x0d\\4\xc0N\x06\xd0\x00I{\x04\xb0\x93\x01\x14@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)\\\x95\xb4n\xa0\x83P\xd8\x95G\x9a\x8c\x14\x86\xc9\xc4\x07\xf0\"nJZ7\xd0A\xe8D\x20\x13\x1e\x9e\xb5c\xafS\x84\x05\xc3d\xe2\x03x\x117%\xad\x19\xe8\x20\xd4\xdf\x92\x11\x92\x9e\x9c\xf4\xec\x82\x94\x19\x16\xc7\x0f\xc0\x8b\xb8(i\xdd@\x07\x85\x03\xe1\x8c\x90\xf4$\x9040\xec\xb8'i\xc3@\x07\xc5\x06\xb4\xc7\xf3{\x82\xfdWH\xd2\xf2C\xf3\xc7g\xdf>\x88?5M\xce\x9e\xf0\xc8\x00\x1e\x93\xa8O\x19\x9aD\x9eC4\xaa\x09\x1d\x19-M\xe4bY\xd7\x1c\x96\xe13\xf1\x01\xbc\x88{\x926\x0ct\x08^\x92t\xac\xa5\xf9+\x13\xc6\x8e{d\xbe\x84\xd5Y9\xea\xa1\xe0\xfa\x9cI\x094\xb0+\xc0\x88\xc4-I+xw.\xad\xf5\xc7\x1dR\x0by[\xfe\x1cy\x9d:\x15\xa1\x13tE\xf6b\xfc\xad69\x8b\x8f\x15JzXM|\x00\x0f\xe2\xa6\xa4u\x03\x9dX\x7f\x7f`G\xbf\xc9ay\xe42\xb8\x9b^\xdbVT\xb6X\x9a\xd7\x12\xacT\x9cgWd\xad\xd9z[\xf61\xbc45\xe7\xb9\xe7&KW\x04z\x98X\xd65\x87a\x18M|\x00/\xe2\xa6\xa4u\x03\x9d\xbd\xca\xac\xfa\x9c\xd3\x06#\x84\xfd\x8a\xe5\xcd7\x95O\x1d\xb7\xe5\\=U1\xcb\x89?\x94\x93=\x95\x0eG\x0eM\xcd\x1e{\xfbbI\xfa\x01\x13\xcb\xba\xe6\xb0\x0c\x9f\x89\x0f\xe0E\xdc\x944\x00\x00\x17\x1d\x904\x00x\x0a\x904\x00x\x0a\x904\x00x\x0a\x904\x00x\x0a\x904\x00x\x0a\x904\x00x\x0a\x904\x00x\x0a\x904\x00x\x0a\x904\x00x\x0a\x904\x00x\x0a\x904\x00x\x8a\x8c\x96\xf4<)g>X\x02\x00\xde\"\xa3%\xdd\xbf#01g\xc0)\x0a\x00F\x12\xaeJZ3\xd0\x19\x08\xb7\x04\x82\xfb\x07\x1d\xa2\x87\x85\xb0\xb4\xdf)\x04\x00F\x12nJZ3\xd09\x17\x08v\x1f\xd9\xdb\xb4\xd5\x0dM\xef\x91v;\x85\x00\xc0H\xc2MIk\x06:;Z\xc8\xf3\xc7\xce\x04\x86\xea\x18u!\x80\xa4\x01\x8f\xe1\xa2\xa4u\x03\x9d\xad-\xf4\xf3\x0e\xdd\xc6\xf2\x12\x02\x92\x06<\x86{\x926\x0ct\xfa\x8f\xd1\x15\xbb\xb6\xd8\xc6\x0f\x0f\xddR\xd8)\x04\x00F\x12\xeeI\x9a7\xd0A(\xd1\xec\x86\xb8\xe29\x93w\x1dK8E\x01\xc0\x88\xc15I\x9b\x0ctp'\x1d8c\x1d=|l3\x1e\xfc\x07\x00\x1e\xc0-I\x9b\x0dt\xd0\xee\xc0\x11\xdb\x0d\x86\x89\x81\x9c\xf1\xebw\xb8R3\x00\x0c\x0bnI\xdad\xa03\xb8#\xe0\xcem\\{\xa4\x0e\xa7\x10\x00\x18I\xb8%i\xde@g\x20\xd8\xc4=\x8e\xfe\xd2\x01W\xbc\x01\x8f\xe1\x96\xa4\x15\xd4\xb9\xf4\x99\xe6-\xe7\xb0\xcac\x0e\xd1\xc3\x01H\x1a\xf0\x18nJZ3\xd09\x1ah>\xd2\xdf\xdf\xbf\xab\xc5i\x83a`7H\x1a\xf0\x16nJZ3\xd0\xd9\xa6\xce\xaa/\xf9\xad&\xf1\xfe\xbd\xf3\xb2\\\x1a\xf1\x03\xc0\xf0\xe0\xa6\xa4]g\xae$}\xe5\x92\x7f\x8f\x00\xc0\xb0\x92\xd1\x92\xee\xff\xf0\x98S\x08\x00\x8c02Z\xd2\x00\xe0=@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)\xfe??\xe8B\x81\x97E\xcd\x14\x00\x00\x00\x00IEND\xaeB`\x82", - - "analysis/ident-field.png": "\x89PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\x00\x03\xd2\x00\x00\x00\xde\x08\x03\x00\x00\x00\xe6g\xc8\x0a\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x02\xfdPLTE\x00\x01\x00\x02\x05\x01\x0a\x03\x01\x05\x08\x03\x0c\x0e\x0b\x0c\x10\x1c\x0e\x11\x14\x10\x12\x0f\x0d\x15$\x16\x17\x14\x1c\x1b\x15\x1b\x1d\x1a\x1f\x1f\x19\x13#A!#\x20$$\x1d#$\"$%#&'%\x19(G((!'(&+)\x1e\x14+N()'++$*,)/-\"*.0-.,02/63(241685<9-5:=:;9=?=CA5AB@CEBKH|u]tvsB\x8c@@\x8dG\\z\xbby{x]~\xb7e|\xb8K\x90J\x85}e_\x80\xba}\x7f|O\x93Nb\x83\xbdN\x95Ud\x85\xbf\x81\x83\x80W\x95Vl\x87\xbc\x90\x86hZ\x98Yo\x89\xbf\x87\x89\x86]\x9c\\\\\x9dds\x8d\xc3\x95\x8cn\x8b\x8d\x8az\x8e\xbfe\x9ef\x8d\x8f\x8c|\x90\xc1\x9b\x91s\x90\x92\x8fi\xa2i~\x93\xc4x\x95\xc4\x80\x94\xc5\x93\x94\x91\x9f\x95w{\x98\xc7s\xa4lq\xa5s\x95\x97\x94\x82\x9a\xc4\x97\x99\x96\x83\x9c\xc6\x99\x9b\x98u\xaaw\xa6\x9b}\x87\x9f\xc9~\xaay\x9c\x9e\x9b\x89\xa1\xcb\x80\xad|\x9f\xa1\x9e\x8f\xa2\xc7\xab\xa1\x82\xa1\xa3\xa0\xa2\xa4\xa1\x92\xa5\xca\x82\xb1\x85\xa5\xa7\xa4\x8a\xb2\x87\xb4\xa7\x83\x8b\xb3\x89\x96\xa9\xce\xa7\xa9\xa6\x98\xab\xd1\x8e\xb6\x8c\xaa\xac\xa9\x9e\xad\xcd\x8d\xb8\x93\xba\xad\x88\xad\xaf\xac\x95\xb9\x95\xa1\xb0\xd0\xaf\xb1\xae\xa3\xb2\xd3\x98\xbc\x98\xa5\xb5\xd5\xb3\xb5\xb2\x9b\xbf\x9b\xc2\xb5\x90\xab\xb7\xd1\xb5\xb7\xb4\xa3\xbf\x9d\xa2\xc0\xa4\xad\xb9\xd3\xb7\xb9\xb6\xb9\xbb\xb8\xb0\xbc\xd6\xa6\xc5\xa8\xbb\xbd\xba\xb3\xbe\xd9\xbd\xbf\xbc\xa8\xc7\xab\xb7\xbf\xd4\xaf\xc6\xab\xbf\xc1\xbd\xce\xc0\x9b\xb9\xc1\xd6\xb2\xc9\xae\xc1\xc3\xbf\xbb\xc3\xd8\xc2\xc4\xc1\xbd\xc4\xda\xb2\xcc\xb7\xc4\xc6\xc3\xc0\xc8\xdd\xbb\xca\xde\xc7\xc9\xc6\xbb\xce\xba\xd9\xc9\x9d\xc6\xca\xd9\xc0\xcc\xda\xc7\xcb\xdb\xca\xcc\xc9\xbf\xd2\xbe\xc9\xcd\xdd\xd7\xcf\xa1\xcd\xcf\xcc\xc4\xd0\xde\xc8\xd3\xc1\xcc\xd0\xe0\xcf\xd1\xce\xe1\xd1\xa5\xd2\xd2\xdd\xc9\xd7\xcb\xd2\xd4\xd1\xcd\xd6\xde\xcc\xda\xce\xe6\xd6\xaa\xcf\xd8\xe0\xd5\xd8\xd4\xd2\xda\xe2\xd8\xda\xd6\xd8\xd9\xe3\xd5\xdc\xd1\xd3\xdc\xe4\xda\xdc\xd9\xe6\xdd\xaf\xd8\xdd\xe0\xd5\xdf\xda\xdc\xde\xdb\xdc\xdd\xe7\xda\xdf\xe2\xd7\xe1\xdc\xe0\xde\xe2\xde\xe0\xdd\xf0\xe0\xb3\xdf\xe1\xde\xdc\xe2\xe4\xde\xe3\xe6\xe1\xe3\xdf\xe3\xe5\xe2\xe1\xe6\xe9\xe8\xe5\xea\xe5\xe7\xe4\xe4\xe9\xeb\xe7\xe9\xe6\xf1\xf3\xf0\xfa\xfc\xf9\xfe\xff\xfc\xc5\x83\x89%\x00\x00\x20\x00IDATx^\xed\x9d\x0fX\x14\xd7\xbd\xf7/\xd7\xbc\xf5m\xea\x9d(o\xb9o/)\x04S\xac\xb6Y\xd9\xe6\x91\x96p\xcd$\x8c^I\x1f.\xe8\x96\xd2W\x0a\x9a\x91\x17I\xf7\xcc\xe5)O#\xb4\x85\xe7\xab\xc5\xb9\xe9\x16\xdeV\xf1tF\xd2\xaa\x8b4\xe6\xfc\xda\xb9\xb6\x94\xdc\x8b\xaa=]\x11Rw\xd1<'*t\xe2\x0c\xe5\x9a\xcd\xe6\xc9\x8e&\xae\xc91\xf9)\x9cn\\\x95f\x9b\x9b\x9bF\xa6\xeb}\x7f\xcaN\xcax\x1a7\x9d\xf7m<\xbf\xe3|~Z\xe2\xaao\xab\xf1\xf1KQ)O\x8e\xaf\x19\x8026\xd1<\xbf(\xc7}u_EvRV\x05\x9d\xfa_\xccKM^+\x0c\xbc\xa5\xdd\x90\xaa\xbc+\xc2]H\x89\xa0\xacy\xd1\xf4E\xf1\xb4\xf0\xc9K\x88H\xae\xcc\x99\x18\x1a}w\x03\xdd\xe8\x9c71rN\xba,iu,\xea\\6%\"\xeep\xf4>\x94\xc9\x8d/\x96\xa7\xbfr@\xcd\x8c\xe8\xd0\xa8\x19x7\x07'\x10\x83T\x9268\xb0\x1c\xd00\x81\xe3V4\xcf\x9b\x14>\x83|\xa9\xeeZWn\x95\x90k\x9d\xa9>\xfcm\x96oJM\xce=OC\xb4\xbeMA\xd2y\xa9$\xcd\xd4dW\xe1\xa2\xa4\x9c3\xa9ul\xd3P\x04H_\xec\x11\xa1\x15\xf1\xd9b\x86\x9e\xb5\xae\xf9\x81\x94\x9f\xe2\xa9\x98\xf0\x18\xd2\\t>\x1b\"u7Z%]\xe6h\xdae/>Dk\xd5Q\x89\xbcI\x1a}\xd0X\xcd\x9766\xe2^\xf0b\xa3\xadT\x9c\x9b\xb6V\xdb\xf8\x94\xd2?$\xe7\x92\x88\x93I\xd9{O\x94\xe2\xd1\xb9\x92\xe3\xd2\x0c\xb3*\"\xe6\xb1\xca5\xdc\x06\xc5\xdb\xcey\xdc\x14\xee6n\x0e\x1e\x81\xbdsg\xfe+'*\xe6\xf2\xdf\xe2\xcd\x9b\xf8mu\xe5)Y}\xa8\xa7\xba:-\xe3\x9e\xd4\xa7\xf3\xee\xfc\xb4\xab1\xf9\xb9/\xd1\x97\xcf%7vi\x07\xf4\xb0\x07\xcf\xb7\xed\xa8\xdba\xcb\xc7\xa9\xf3\xc9\x19\xfb\x8f\xac\xe2\xa9\xa4\xa5\xdd\xd4\xe5=\xe4\xd1\x0aNs\x0eW\xd32\x8e.\xe1\xa4\x8f\xcftl\x8e\x8a\xe9%\xdaK\xaf*\xb9{|-\xde\xd8\x1c1\xb9\xa8l:\x17\xa6\x1b{yR\xd4c\x8eL\x8e{\x0a9kB\xd7H\xd3_9\xa0\x96\x9b\xb7\xab\xd2\x1e\xc5u\xa3\xceC5\x93\xe3jjj\x9a\xc4\xcc\\\xae}T\xd2F\x07\x96\x03\\%\xc5\xd1\x93#\xa2\x97\xcc\xe3\xc8R\xaf\xbb\xd6\x95[%\xe4Zg\xaa\x8f|\x9bi\xa5\xa5iI\xadH\xe7\xdbl\xe5\xeb\xba>*\xc4\xbf\xab\x88\xad\xc9ki\xc9\xe5uX\xcd\x15l\xd3`\x03\xe4/\xb6\xebLcFNcc\xa3{\x14\xe5Y\xeb\x9a\x1fH\xf1)\xd2\xc3V8V\x84\xcd\xd3\xfdl\xdd\xce\xaa\xdb#\xafg\xb84$\x98$\xe9\x12{qC{Sq\x09\xd6tSQ\xa7wI\xb3\x03o\x1b\xf9N\x85\x81\xac-\x19\xff\x8e\xe7\xa7\xe0TO\xda*\xdc7\xf6T\x7f\xa5\xda\xcd\xc1\xb5\x08\x09W\xf4\x0c\x17\xf9\x1e\xd4S\xb8}\xa1\\(]\xa0\xacH!b.O\xc6\x8d\xe0U~?N\x9e#\xdd1\x1e\xaa\xf1\x0f]C}d]nS\x1e~\xc8#]\xb1f\xc0'\xcc\xd4\xa0\x8ev('\xf8:\x84r2\xf0O@_\x96M\xb9\x9b\xaa\xbc\xed\xdc.\xa4\xe44\xed6\xe7\x91\xa4\x83#KM\xb5\xdc\xf3\xa4\xfc\xa4\xb5\xdcFNz\xc6M\xc2\xc9\xde\x980\xdd\xd8y\x91dD\xb2\x84#]J\x18Y~\xa6ce&\xe0\xa9(\xd2\xbfl\x8e\xa4\xc7c\x06\xde\x02\xa7}80\x13\x80s\xe0\xa6_\x11\xe7QR\xad+\xb62H\xb5\xce\xd6\xaf-\xed\x1aQh\xb6\xde\xb7\xd9J\xbb\xd8|\xf2\x83\xc8\xd4d>i\x03h\x1b\x964\xdb4\x98\x00\xe6\x8bU\x0e\xbc5j]\xef\x03I\xc9}t\x0c#TH\xda\xf0\xc0L\x00\xf3\xa3\xc0\xd4\xbab\xab\x8c\\\xebl\xfd\xdah\xddV\xf0\xd7t\xbeMay,\x99|\xe7rM\x8a\xbd\xf4\x07\xb2\xa4w\xa8\xaa\x9a\xf9b\xc5\xa3\xed\x17\xc7\x05\x9e\xb5\xae\xf7\x81\xa4d\xfa$\xfa4)]\x15\xc02zW\xbc;\xe8I\xac+\x05\xee\xcb\xc7|\x9dK'\xe1\xf1Y\xdf\xafT\x92\xeeJ\xc9!?\xec\xdb\xb6\xa9\xf7\x9b3Y\x18\xcewN\x8c#M(s\x89:\xa0=R8;YJ&\xbex\xea\xbb\x91\xe8\x8dN\x92\x0b\xf7\x92GF\xd2o%~\x96\xf8\x16Ih\x07\x08\xe7\xa5\xfbr\xd2\xc8\xb8\x9a\x04T\x93,\xb3\xd3\xf0\x8c\xf0\xa3D\x9br7ey{\xa7\xcc@*\x04eM\\\xd2\xb0\x06\xcf\xdcJ\xc8\x96\x15\xb8S\x8b&\x8d\xa87\x86\x8c\xfe\xa6E\xe3v\xd7\xfc\x830\xdd\xd89Q\xa4a\xce\xa3\x0a\x0c\xc7\xea\xed\xbd\x9d\xc42\x01k\x84\x19a\\&}\x8c\xc3\xdf\x00y\x8f\x91\xb4\xe1\x81\x99\x00e\x03w\xd7\xban\xb3w\xd7\xbaB\xd2s\xbbp\xc5\xa4\xe5\xa8k\xa7e\x9d0\x8c\x17$\x9d\xb2\xad\xb5\x94\xad\xc9\xb5s\xb1l\xfb\xf2\xa9\xa4\xe5\xa6\xc1\x040_,~\xc4\xb9\x7f)\xbc\xa7U\xebz\x1fHJ:\xe8X\xfdya\xba\x0c\x92Vs\xac\xe0X\xfb\xe9\xe2]\xdd\xf4E/\xe9\xa5u/?\x10V\xbc\xcf\xd0\xb1\xd3\x83){K\xb3y\xdb\xfe\xd6\xcf\x1am\x1b\xcf\xf4\xbd\xb3\xd1FV\xc2O&.\xaa\xa8\x13\x16I\x144\x8f\x17\xd7\xb8\xab~0\xe5)G\xa6\xfee\x8e\xa5|R\xe9\xabG6\xf1d\xae\\xg\xde+8Y\x8d\xbe}\x8b\xae\x91~\"\x84\xf4\xa5\xaeJ\x15.I\xd5\x0e\xa8Kzp\xff\x91U\xb638\x99\xc7\x17\xbeZ\xc8\x93\xf5\xb4\xd6\xa4\xd4\xd2\x1d\xc9\xa4\xbc\xccn\xaa\xf2n\xf0\x1cB\x08W\x15N\x9fA&o\xcb\xb8{K\xca\xd2\xb9b\xa2\xc29O\xad\x8b\xc1\x83\xe5\xc3\xe8tx\xf4\x9a\x15\x91\xe3'\x145\xe9\xc4:'F?\xb5kV\x18\x95\xf4\xb4\xa8u\xeb\xa6q$V\x91Y\xc4\x1a\xc7\xaetauzM\xd8\x86\xb2\xe9\xe1\xed\xca\xab\xc7\x8c\x0e,\x07t\x1f\xa6k\xe6\xee)\xb4X\xeb\xaa\xad\x9e(\xaa\xcf\xc6gWWd$\x93\xf5hE\xed\xcc\xe2\x04\xe9\xb5Rm\xe6\xe4n\xccbk\xf2\xb3\x94\xb4\x8aWr\x13i\xac\xd44\xd8\x00\xf6\x8b\xc5\xbf\xff\xe5G\x1eJ\x12zi\x8dZ\xd7\xfc@\x8aO1o\xfc2\xc7\xb2\xf1\xf3\xbc}\xb6c\x1e\xe3y\xbfc\x96\xa4QsY\xd1\xaec\x82\xa2\x91\x93L\xa5\xf5\xfa\xe9\x9ed:1\xb2\xd1\xb3\x0f\xe7s\x12\xefY\xb5\x83\xe7\xb7l!\x9b>H\xc2\x8f[\xf0\xe6\x8f\xd6\xa6\xde\x93-\xaf9K\xac\xf8\x81X\xc1\xcds\xa2#\xa6\xa9\x978e\xfe\x94S\x9afK\xc9\x11.7<\x91379\x077\xa0\xf7\x9993\xa6\\Z\x01\xd3\x0eh]\x9547\x97\xae\xec\xf4\x95g%e\x95S\xfd\x9f\xcfMN+\xdco\xa3\x85t\xef\x86\x14\xe5\xad\x09\xf7\x18;\x94\xe0\x09\x1d\x9e\xe46L\x8e\"\xfd\xc1\xbe\xe9Q\x91qD\xb6\xbd\x1b&\x87E\xdd[49\x14\xf7\xa9\xcdwGNZR4\x81\xcb\xd4\x89E\x1d\xe9\xd1\xe1\xd3\x8fQI7\xc7\x85G\xccX\xc6q\x99l@q\xdc\x9a\xe8\xd0\x89q\xe2\xf9\xa6\xcc\xc8\xf0\xb8Z\xf6\x1ao\xbb\xe1\x81\x99\x80\x86\xf1t\x0e*u{B\xad\xab\xb7z\xa0\xa8>\xdb\xd3\x9b\x92S\xf3\xe9\xe5:\x8ao\xb3(\x8a.\xc8\x91\x0b\x03p\xa7\xdb\x9a1\xf7U\xc4\xd6\xe4\x17\x9b\xd2\x12\x1f:G%-5\x0d6@\xf1\xc5\xf6lKN\xcc9G\x93\x1a\xb5\x8e4?\x90\xf2Sl\xbe-\xfc\xb6\xcd\x1e[Y\x9c\x13\xe648\xcd\xfd\xefJ\xd3$\xed\x1f\x96\x84\x96\x18\x85\x98\xcb\xf3\xa1\xe9\xddF1\x83\xa6S\x98\xfa\xfa\x9dA\xd4\xba\xb0<68\xba<\xc7g\x06\x0cc\xad\x97M\xe1\xe0\x9f+\x87\x95\x0d\xd1^\x96\xdd\xcc\xa7c\xe2:\xa3\x90\xeb\xc0,I\x0f\xa2\xd6\xfd*\xe9\xe1\xadug\xc3@?\xfc\xd0\x12\xec\x92\x1e\xd5\x98&\xe9\x81\xe3WI\x077\x20\xe9\xe0\xa5y\x1f\xb7\xc4\xf4\xf5W\x9f\xb8H\x17;\x8d\xa2t8_\xc7?\xfd\xd6`w\x0eB@\xd2\xc1K\x1c\xc7q\x13\x9a\x8d\xa2F\x02t\xb1\xf3\x13\xa3(\x1dr\xc8\xce\xe7\x8d\xa2F\x0f\x20i\x00\x08*@\xd2\x00\x10T\x80\xa4\x01\x20\xa8\x00I\x03@P\x01\x92\x06\x80\xa0\x02$\x0d\x00A\x05H\x1a\x00\x82\x0a\x904\x00\x04\x15\x20i\xb38\x92\xfd\xe5\xf0Z\xb9\x00\xa3\x13\xf3$\xed6\xd0q\x15\xd1\xdb\x14\x15i\xddK(\x88\xd9\xcb\x97\x92\x8b\x18\x87\xcf\xca\x05\x18\xa5\x98%i\xd9@\xe7\xb2\xfdMr\xab\"s\xff{\xc5\x1f0\xfe-\xe4\xfec\x7f\x12\x12\xc3f\xe5\x02\x8cR\xcc\x92\xb4l\xa0s\xd9n\xae\xd1\x9f\xdf`\xfd[\xce\x0bw\xc4$\x0c\x97\x95\x0b0J1I\xd2\x8c\x81\xce\xa8\x914{\x83\xcaM)]\xee\xe4pY\xb9\x00\xa3\x14\x93$\xcd\x18\xe8\x98(i\x0d\xa7\x16\xd6\x14G\xd3\xa9\xc5\x87X-7\x1e\xa5\x7fK\xcf=R'\xadm\xe5\x02\x00\x83\xc5$I3\x06:\x97\xed\x958YcB\xb3\xd6rja\\]\xb4\x9dZ\x8cc5\xddx\x94\xfe-\xef\x087\xf8\x16\xd0\xb0r\x01\x80Ac\x92\xa4\x19\x03\x9d+4Y\xf2\xbc\xdf5\xad\xe7\xbb#\xb9\xba\xe88\xb5\x18\xc5\xea\xba\xf1\xc8\x03\xef:\xd6\xe0\xd2\xd3\xca\x05\x00\x06\x8fI\x92\x96\x0dt\x10:M\xc4\xec*\xf2{W\xa5\xe7\xbb#\xb9\xba\xe88\xb5\x18\xc4\xea\xbb\xf1\xc8\x92>\xc23\xff\xef\xefi\xe5\x02\x00\x83\xc7$I\xcb\x06:nj\xfc\xdeU\xe9\xf9\xeeH\xae.:N-\x06\xb1\xfan<\xb2\xa4\xcf\xf0g\xe4<<\xad\\\x00`\xf0\x98$i\xc6@\xa7\x92\x9a\x17\xa0*\x87\xd7\x1d\x86\x01=\xdf\x1dIz:N-\x06\xb1\xde\xddx\x04\xff\x96.\xf6\xeey\x9eV.\x000xL\x924c\xa0\xe3\xa0\xddsG\x91\x96\xb9\xe4\xb0\xa2\xed\xd4\xc2\xc8T\xc7\xa9\xc5(V\xcf\x8d\x87\xf5oY\x9b!\xdd\xffN\xc3\xca\x05\x00\x06\x8fI\x92f\x0ct\xda\xed\xfb\x9a?\xb1\xf1\x8b\x8cb\x10\xb9\xaf\x12\xe6\xce\x8c\x0a\x9f\xafH\xd5\xc9Wt\xee\xe9\x98\x1e\xf9\x98\xc6\xbb\x03`\x88\xbd\x7f\x1c\x91\xbe\xff\xcb\xbc\xfb{K\xe78.\xbcY#\xa0\x81\xdb\xa7\xb1ut`\x96\xa4e\x03\x1d6\xe9o\x1c\xe1\xd2\x1d\xcf\xa6O|*=\xfc\xb2\xb7\xe0\xe1\xa2\xef\xccF\x9bQ\x0c\xe6\xab\xbd\xfc\xfe\xc6\xba<\xfe9\xa3@7\xda\xf9\xba\x9d{\x96Lzl\xfcu\x9a\x16\x0d\xad\xf7\xcf2n\x99Q\x88\x84\xfb{k\xaf\xa9\xd9\xacy\xcb\xe4Z\xaeFc\xeb\xe8\xc0,I\xcb\x06:l\xd2<:8\xdc<;\x8d\xa2\x86\x89R_$\x8dN\xf0\xadX\xa7[\xd8\xfb\x05\x1b\xa0\x91\xaf\xe4\xdcs\xfb:\x14~\xbd\xcd~H\xbd\x7fVp+\x8cB\xb4\xa8\xd5\x91\xb4\xdfo8;b0I\xd2\x8c\x81\x0e\x934\x91f\xce\xf7a\xdf\x903\x00I\xa3\x9e\xe4-F\x81\x12\x1a\xf9J\xce=\xb7\x15\xb5s\xd7;0\x1aR\xef\x9f5\xdc\x1a\xa3\x10-@\xd2jL\x924c\xa0\xc3$\xfd\xcb\xe5p\x8e\x1b_LR\xae(\x8e\xe2q\xcb\xa0\xe2i\xe1\x93\x97\xe0\xbe\xbba\x02\xc7\xadh\x9e7)|F7\x93T\x05\x8b\xb7/j\x8f\x102\xe3\"T]\x98\x86]\x0fB\x17\xf3R\x93\xd7\x0a\x03d\xc6\x82G3V\x904\xda2W7\xb6\xaf\";)K\x98l\xeb\xe4+;\xf7\xccX1\xeb6\xfcY&4i\x1f\xcd7#!\xd9\xfbG\xfc\xf0\x0a\xa4\xdd\x98\xcc\x14\xf9*x\x8c\xa3s{\xed\xea\xcb\xe4B\xedK&\x87\xcf\x20\xdb\xe4\xef\x8d\xa0-\xde*\x90\xf4`0\xca\xda\x1b\x8c\x81\x0e\x93\xf43\xc7jj\xc2\x84\x9e\xe1\xcd\x9a\xe7\xb9555\xea\xb9e\xfa\xf8L\xc7\xe6\xa8\x98^\xe4*)\x8e\x9e\x1c\x11\xbdd\x1e\xf7!\x93TE\x8b7\x19t\x15m\x16P9fk\xd9\xf5\xa0\xf3\xc9\x19\xfb\x8f\xac\xe2\xa9\xf4d\x0b\x1e\xedXQ\xd2\x15|\x97^l\xbemG\xdd\x0e[\xbe~\xbe\x8cs\xcf\x9a\x88\xb0c\xdd3\xe2\x0e\xeb\x1c\xcd7#!\xd9\xfbG\xfc\xf0\x0a\xa4\xdd\x98\xcc\x14\xf9*\xd8\xcc\xd1\x99\xb9v\xf55\x15O\xe0\xa2\xd6l\x88\xa0\xe7\xa5\xe4\xef\x0diJ\xba\xdbYu{\xa4Y\x93(\xf31I\xd2\x8c\x81\x0e\x93\xf4?\xe1\xee\xa6\xa15\xf0vpE\x88\xb4\x19j\x86\x11\xc3M\xbf\"N\x0f\x98$\x8b\xfbV\xc0\xce\x16\x01\xe5\x0f\x84\xb6]ON\x06\xd6g_\x16\x91\x1ec\xb6\xa3\x1d+J\x9a\x98\xefh\xc7\xd6\xf1'hX\x9d^\xbe\xacs\xcf:\xce\x8e\xae\x84\x93\x0f}\x1dFB\xb2\xf7\x8f|\x1fd\x09\xa5{\x90;3E\x92\xc5\xce\x09\xfd\xbcv\xf5\xa1\xb0H\xdcC\xcf\x8b\x12_\x85{\x93\xf4,\xdc\xc7\x9b8\x8d2\x1b\x93$\xcd\x18\xe8\xb0^:~\xc7\xab\xa4\xef\x9d\xe4\xea\xc6D\xd3\x09cL\x98\xd4+3I\x0dZ87\x8aF\xaei\xd7sM\xd0\xc6\x0e\"=\xc6lG\xdb\xdaG\x94\xf4~\xfe+\x9d\xd8M\xc29\xabE\x1b\xf5\xf2e\x9c{J\xb8\xc8%h\xc3D2y\xb8\x0e#!\xaf\xde?J\xf7\x20\x9b\xd4+3I\x96\"\xfa\x03\xaaW}(\x8c|\x0bk\xc2\xc4W^%\xfd\xe1>\xfb\x14\xe8\xa5\x07\x83Q\xd6\xde`\x0ct<\xbdt\xfc\x88WI\xc7\x88m\x8b\x8e\xf6bn\x97\xb7\xcbI-j\x1c\x02\xca\xf5dM\xbb\x9es\xc28\x98.c1f;\xda\xd6>\xa2\xa4\x0b\x93\xf5b\x1f\x14n?\x9c\x9b\xad\x97\xaf\xec\xdc\xe3\x0c_R\xf5\x83\x96I\xf4\xd3_\x87\x91\x90W\xef\x1f\xa5{\x90;3E\x92\xe5P\xa4\xa0M\xed\xeaCt\xa8\xed\x9b\xa415\x9c)=\xc4\x88\xc0$I3\x06:L\xd2\xffx\x95\xf4\xbcI\xc7)\x1d\xe4E\xcc\x1ci;\x93\xf4\x1dM\xbb\x9eo\x04m\xe4\x0b\xbd\xa9d\xb6\xa3m\xed#\xaex\xa7\xac\xd5\x8b\xdd$XZ\xa7\xe5\xeb\xe5+;\xf7\x94\xe1>p\xd6\xa4\x88\xcbB\xbe\x836\x12\xf2\xea\xfd\xe3\xe9\x1e$\xc0$\x07\xc0\xc0$\x0d+\xde\x83\xc2(ko0\x06:L\xd2\xffx\x95\xf4>\xae\x84<\xad\xa0\x17I\x19KZc:\xc9\xa0m\xd7\x93\x9d\x86g\xb0\x1f%\x12\xe91f;\xda\xb1\x82\xa4\x0b\x89\x00\xb5c\xeb\xe8\xd6j2\x97\xd6\xce\x17I\xce=\xbb\xb8f\xf4&w/\xea\x8dn\xb9\x0e#!\xc6\xfb\xa7e\x8d\xc7\x191\xc5\x81A\xd2~\xc3$I3\x06:l\xd2\xaf\xb8\x0e\xd7\xd4\x84\xa5\xd7\xd4\\q\xafx{\xb4\x82e\xdc\xbd%e\xe9\\1\xea>\\39\xae\xa6\x864v&\xa9Bk\xd1\x97A\xcb\xae\x07\xb5&\xa5\x96\xeeH\xe6m\xfb[\x15f;Z\xb1\xc2\xd5c\xf9<\xed'\xb5c\xf3\xf8\xc2W\x0b\xf9<\xfd|%\xe7\x1eg\xf8\x9c]\xd1\x93C3\xd7\x85:\xaf\xc3H\x88\xf1\xfe\x99\xc5\xc5!5\xd2nLf\x8a|\x158\"\xbc\x8c\xd3\x9c5\xa1\xe9\x87\xd1\xf1\xf4\xd0\x1a'\xfb\xbd\xd1\xab\xc76\xd7\xd4x\xacm\x1c\x1b\xc5n\xa0fI\x9a1\xd0a\x93\xfe\xa4v\xbc0U\xb6#W$ML\xf0\xb8\x80m\xdf\xf4\xa8\xc8\xb8}\x085\x08\xa1\xa4\xb13I\x15Z\xa7fY4\xecz\x10:\x9f\x9b\x9cV\xb8\xdf\xc6\x93\xebG\x18\xb3\x1d\x8dXz\x8d7\x9f&\x0ey5c\xfb\xca\xb3\x92\xb2\xca\xfb\xbc\xe4+9\xf7TN\x8e\xca\xec\xac\x9c\x1c\xf9\x94\xce\xd1|1\x12b\xbd\x7f6\x87E!\x0f\xdc\xbb1\x99)\xf3e\xd9\x17\xe5\xe5\xb2\xecL\\\xe5\xa1\xa7\xc3\xf1c&\xf3\xbd\xd1k\xbc\x09\x1e\xc3&\xe7\x849\x0dNS\xae\xd87\x1f\xd3$\x0d\x98\x83\xdb\xb9\xe7z\x10\x96\xc7\x94\xde?\xb3\xa6\xebE\x9bB\xd9\x14\x0e\xfe\xb9r\xc0\x18e\x0d\x8cH\x04\xe7\x9e\xeb\x82JZ\xe9\xfd\xb3n\xc4\x9d\x09v6\xa8\xaf\x1c\x1a%\x80\xa4\x81\x01\xe3i$\xd4\x1e\xb5Y3\x12\xf0?\x20i`\xa0\x80\x91\xd0\x88\x06$\x0d\x0c\x140\x12\x1a\xd1\x80\xa4\x01\x20\xa8\x00I\x03@P\x01\x92\x06\x80\xa0\x02$\x0d\x00A\x05H\x1a\x00\x82\x0a\x904\x00\x04\x15\x20i\x00\x08*@\xd2\x00\x10T\x80\xa4\x01\x20\xa80O\xd2\xa2kNw\xb1]\xa0\x18\x01\x00p\xdd\x98%i\xc95\xc7e?\xee\xc4\x1c\xb37\x18\xed\x12\xe8T\x1dG\x000\xec\x98%i\xd95\xe74\xb9\xdb\xaf\xab8\xf8\xefBq\xfb`nY\x06\x00\x03\xc4$I\xab]s\x1c\xfe\xbfO\x91\xdf\x19\xd4]\x08\x01`\x80\x98$i\x95kN\x93=x\xfe]]\xe9\xb0\xe3\xb6\xe0q\x88\xb7\xd4\x89!7\xdd\x19_\x8cZB\xb9)\x8aX\xd6\"\x86e`.4\x00`\x92\xa4U\xae9%\x95^\xa3\x03\x0a\x85\xc3\x8ed\xc1\xd3y\x88\xde\x85\xb0\xa6\x89\xde\x1ao\x0d\xfeQK\x0fS\xc4*,b\x18\x06\xe6B\x03\x00&IZ\xe9\x9a\xd3b\x1fBS\xd3\x11\x80\xe4\xb0\xa3\xb4\xe0\x91\x06\xde\xec\x0dle7\x1e\xa5E\x8c\xc8\x00]h\x00\xc0$I+]s*K\xbcG\x07\x1a\x92\xc3\x8e\xd2\x82G[\xd2\x92\x1b\x8f\xd2\"Fd\x80.4\x00`\x92\xa4\x95\xae9E\xa6\xdc\x96\x7f\xf8\x90\x1cvb\xc4\x19\xb4`\xc1\xa3-i\xc9\x8dGy\xf3y\x91\x01\xba\xd0\x00\x80I\x92V\xb8\xe6t\xd8\xbd\xd9T\x04\x20\x92x=-x\x0aH\x9fL\xc5\xbb\"L\x19\xab-\xe9\xa1u\xa1\x01F\x01&IZ\xe1\x9a\xd3b\xbfl\x10\x1e`H2UX\xf0\xc4\xc5!\xe4\xa4\x1b\xc2\x97!\xd4{\xbbO\x92\x1eZ\x17\x1a`\x14`\x92\xa4\x15\xae9Mv\xf7\xcaw0\xa0p\xd8\x91,x\x10Q\xeb\x86\xb2\xe9\xe1d!pZ\xd4\xbau\xd3\xb8\x09EML,k\x11\xc320\x17\x1a\x000K\xd2\xackN\x8b\xdbw<(P:\xec\xb8-x0\xae\xcc\xc8\xf08\xba\x1e\xd8\x1c\x17\x1e1c\x19\xc7e2\xb1\xacE\x8c\x82\x01\xb9\xd0\x00\x80i\x92\x06\x00`8\x00I\x03@P\x01\x92\x06\x80\xa0\x02$\x0d\x00A\x05H\x1a\x00\x82\x0a\x904\x00\x04\x15\x20i\x00\x08*@\xd2\x00\x10T\x80\xa4\x01\x20\xa8\x00I\x03@P\x01\x92\x06\x80\xa0\x02$\x0d\x00A\xc5(\x96\xf4\x1c.j^\x93Q\x10\x00\x04\x18\xa3X\xd2\xce\xaa\xa2)Q\x9dFQ\x00\x10X\x98'i\xd1@\x07\xa1\xceC\xbb\x0av\x1d2E[U\\\xd0{|\x00\xa3\x0d\xb3$-\x19\xe8\xa0\xcb\xc5\xbb\x9a\xda\x9bv\x15\x9bqg\x93Z\xee\xb0Q\x08\x00\x04\x16fIZ6\xd0\xa9)!7B\xe8.\xa91\xdae\x18\x00I\x03A\x87I\x92f\x0ct*\x85\xbb\x84\x96\x99qw~\x904\x10t\x98$i\xc6@\xa7\xa3\xb8\xaa\xc3\xd5QS\xdc\xe1-~\x98h\xe0\xaa\x8cB\x00\x20\xb00I\xd2\xac\x81\x0e\x9eV\xdb\xed\xfbL\xb9\xa3\xa0+j\xda\xa1\xf6^\xa3(\x00\x08\x20L\x924c\xa0\xe3\xaa,ir6\x95T\x9ab]\xb9\x8f\xe3\xb8\xbb\x8d\x82\x00\x20\x800I\xd2\x8c\x81N\x0d5\xc6r\x95\x98a0\xdd\x195isU\x90\xf9\x02\x00\xa3\x1c\x93$\xcd\x18\xe8\x14\xd0\x852\xf4f\x81\xb7\xf8a\xa2\x963cQ\x0e\x00\x86\x11\x93$\xcd\x18\xe8\x88\x92>n\x8e\xa4a\xc5\x1b\x082L\x924c\xa0S%\x0e\xbc\xcdX{\x06I\x03A\x87I\x92f\x0ct\\\xcf\x97\x9cn?]\xf2\xbc\x19K\xde\x87A\xd2@\xb0a\x96\xa4\x19\x03\x1dW\xed\xae\xa2]\xb5\xfeW\xb4\xcby|N\x98\xd2\x80\x0a\x00\x02\x1e\xd3$m>\xb38.\xba\xcc(\x08\x00\x02\x8cQ,i\xe7\xf1v\xa3\x10\x00\x088F\xb1\xa4\x01\x20\x18\x01I\x03@P\x01\x92\x06\x80\xa0\x02$\x0d\x00A\x05H\x1a\x00\x82\x0a\x904\x00\x04\x15\x20i\x00\x08*@\xd2\x00\x10T\x80\xa4\x01\x20\xa8\x00I\x03@P\x01\x92\x06\x80\xa0\x02$\x0d\x00A\x85y\x92\x96\x0ctz\x1b\xca\x0av\x8d\x1c\xbf\xb9\xd6\xdc\xe4\xe4\x9c\x93Yg\x8c\xe2\x04N\xa4\x1c\xd1\x7f\xb3\x94\xb7\x91w\xeb\x92\xf8R\xed\x80-<_\xad\xfd\x0e\xfa\xc4\xc6/\xd2ykh\x09\x88B\x02\xbec\x96\xa4e\x03\x1d\xe4(:\xder\xac\xe0\x98\xd1\x1e~\xe2][\xee+\xd5\xb9\xfa\xadX\xc5\xabI\xaf\xe8\xbf\xf9E^\xd2C\xf8\xe9\xa1\xc4\xbc/\x94o\x9c|Wx\xbe\xd8h\xd3\xd1\x11\xea;\xb3\xd1\xa6\xf3\xd6\xd0\x12\x10\x85\x04|\xc7,I\xcb\x06:o\x16\x90\x9b\xf27\x17\x98\xe2s\xe7\xc9\xaa\x9c>\xdcT7\xfa*i\xd4\xe7\xed\xcd\xc2\xdc\xa4k\xe8\xab\xc4\xdcB\xd5\xf6\xec\xb5\xee\x94\xaeZp\xf7\xe9'\xb5\x04D!\x01\x9f1I\xd2\x8c\x81\x8ec\x1f\xddR27\x97$\xf3m;\xeav\xd8\xf2q\xea|r\xc6\xfe#\xabx\xa5Z\\E\x9b\x05\x8a\x94\xb7ic\x0e,\xa1\xf8lrq\xae\xa5%\x97\xd7m\xe1\xf9\x0aE\x06CYH\xc0|L\x924c\xa0\xd3Y\xe4p\xba\x9ce\xf6\x12\xa3}\x86\x9e,\xfe\xa1k\xa8\xef\x9ar\xe3W\xa5\xbf\xb2\xf1\xc9\xa4\xef}\x95\xdf\x8f\x1f\xcf\x09\xfd\xb0\x1c\xbb)\x0f?\xe4m\x12\xc3EI\xf7\xa4\xad\xea!R\xfaJ\xb1[a\x1e\xca\xda\x98\x8d\x88Z\x94\x99\xc9c\xda\x94op\x8e)8U\xc7\x9f\xc0\x8f'x\xdc\x85\xe6d\xe0\x9f\x8b\xbe,\x95Z\x9c-\x02\xca;\x202\x07V\x20\x95\x979p~2\xe9i\xb7yHz\x08\x0b\x09\x98\x8eI\x92f\x0ctP\x87\xc3n\xb7\x1fv\x98pg\xbf,\x9b\xa2\x83\x96\xe89\xb1\x8a4\xda\xbc\xb4\x9eo1\xa9\x9b\x94\xb1'\x13\xbbPW\xd2I\xf1\x95(\xe9:\xfe\x03\xf7\xde\xccnX-{\xf9\xbdT-\xca\xccd\xb5\x90\xd7tB\xbaI8\x1d\xb4h#\xba&hn\x87R--\x9c\x1b\x85\xe3\x0fs`\x05Ry\xe5\x03\xf7%\xd1\xb2\xb6zJz\xc8\x0a\x09\x98\x8fI\x92f\x0ct0\xae\x8e^Tl\x82'VV\xb6\xe7\xb6s\xc2\x94\xf1\xc1\\\xd2\xd1\x09\xe4*c\xbfM>\x82\x8e\xccu\xaft\x8b\x92.\xe7{\xdc\xef3\xbba\xb5|Q\xf8%U\x8b23\xe5\xca\x13U\xcb\x83\xf4\x1d\x94\x9b\x8d{\xc9F\x84\xa9\x859\xb0\x02\xa9\xbc\xf2\x81\xc5^\xfa\x03OI\xd3\xb8\x81\x16\x92\xe6\xe2[!\x01?b\x92\xa4\x19\x03\x9d&\"\xe6+\xc5f\xf8\xe7\xb0\x92nY'\x8cg\xe7\xa6\x92Yi\x1fy\xeb\x840\xa7,\xdc\xab\x8a}+\xf1\xb3\xc4\xb7\xdc/DIw\xa5\xe4\x90\xder\xdb6\xc5n\x8cZ\x14\x99\xe5\xe4\x20\xf4%\xdd\x20\xab\xa5\x8e\xbe\xae&#\xfe\xec\xff\xfa\xd1\x981?\xfa\xb9Oja\x0e\x8c\xe4O\xc1\x94\x979\xf0\xda\xb9X\xab}\xf9\xa2\xa4\xdd\xb1\x83-d\x1a\xae\xa8\x8f\x12}*$\xe0GL\x924c\xa0\xd3l\xafm\x7f\xb3\xd8\xe1w\xb7\x8do\xdf\xa2k\xba\x9f\x88/gq3\xe8\xf3\\>\xa5\xb4\xee\xc8CId\xa9\xb7\xf0\xce\xbcW\x8el\xc2\xadX\x19\xdb\x97\xba*\x95\x8e\xbb{\xce46&nll$\x8bf'\x13\x17U\xd4\x09+O\xd2n\xdf\xe4\xe5|\x86_\x7f\x96\x93\xf7\x0d\xb3\x15\x11y\x94\xe3C|\x8a>k\xb4m<\xd3\xf7\xceF[#\x8e\xcb\xe3\x0b_-\xe4\x89\xbe\xde\xff?\xdf).\x18\xf3\x7f\xff\xb3\xa2\x15\x19\xc3\x1cX\xfa\x14\x8a\xf2\xca\x07\xfe,%\xad\xe2\x95\xdcDe\xec`\x0b\xd9\x9a\x94Z\xba#\x99\xb7\xed\xf7\xa5\x90\x80\xff0K\xd2\x8c\x81\xce\xf1\x92\"\xc7q\xa3\xf0\xa1\xe7}f\xda\x88)\x8a\xb2\xd3\xe7_U\x14.JJ\xc9\xa5'o\xd0\x89\x9c\xb9\xc99u\x1e\xb1\xe56\xe1\x94\xd1;\xe2\xd4\x93J\xe4\xa3\xb5\xa9\xf7d\x1fQ\xecV\xca\xf3dai#O/\x9fvo\xc5\xf4lKN\xcc9G/\x9f\xe6m\x1f\x90\xb3\xdb[\xf0/EyVRV9\xf9\xadp\xfdpV\x7f\x7f\xe4\x8f~N\xb6\x1a\xc3\x1c\xd8\xfd)\x94\xe5\x95\x0f\xfc\xc5\xa6\xb4\xc4\x87\xce\x89\x92\x16c\x07[Ht>79\xadp\xbf\xcd\xb7B\x02~\xc34I\x03\xfatF\xce\xc1\x92\xbe\xadyxF.\xea\xe51\x20\xb8\x00I\x8f@\xa8\xa4#nk\x02I\x03\x03\x07$\xad\x84\x1f\x09\xfc\xe7\xff\xc6\x92\xfe\xe1\xff\xfa\xb7\x7f\xfb\xf9p\x88\x1a$\x1d\xdc\x80\xa4\x95\x18\xa9\xcd/PIG|\xe7\x87\xdf\xfdN\xc3.\xc7\xe5n4\xa4\x9c\xaf\xe3\x9f~\xcb\xeb\xff\x8f\x01\x01\x0dHz\x04B\x07\xde\x13;\xfa\xbbC0\xa1\x87\xdb;\x87R\xd59\xf87\xc3v\xde(\x0a\x08X@\xd2#\x8f\xde+D\xd2w\xe3*\xfe\xde,W\xf3\xd8\x90\x90\xef\xd9;{\x8dv\x02\x00\x01\x90\xf4\x88\xa3%.f,\x96\xf4f\\\xc5\xd3\x9b\xfa\xfb\xd3\x97\x1c\x8a\x0b\x99\xde\x01\x9a\x06|\x03$=\xd2pE|\xef\xf6\x1b\xb0\xa4kq\x15/\xfb\x07\x96\xb6\xb3\xbf\x7fF\xf80\x9d\xd0\x02\x82\x0f\x90\xf4H\xa3!\xe4p\x7f8\x964\xc2U|\x0c\xff\x1d\xc6\x7fs\xc2\x1aF\xc8}\x9c\x80\x11\x0fHz\x84\xd1\xbb!\xe4\x1f\xfdd.M\xf8\xa7\xf8\x07\x92\x06|\x06$=\xc2\xe8\xce\xfc^\x7f\xff\xc49\xfd\xbd\xae\x7f\xf6w\xe3?\x17\xfe\x03I\x03\xbe\x03\x92\x1ea\xb8\xe6\x85\xf5\xf7\xc7d\xfe\xf3\x1f\xfd\xc7\xff\xf1\xcf\xfe\x86\xde\xfe\xfe&\x9040\x00@\xd2#\x0c\xd7\xacHZ\xbb\x9b\x1fs\xf6oXw\xa5\x7f\xdd:\x04\x92\x06\x06\x00Hz\x84\xe1\x9a\x1e\xfdO\x0f@\xd2\x80\xcf\x98#\xe9\xeeb\xbb@1y\xe5,+\xdag\xc2=MF&\xaei\x93\xff\xe1\xc1,\x904\xe0+\xe6H\x94>:\xac\x00\x00\x0c\x08IDAT\xdae?\xee\xc4\x1c\xb37\xe0\x17\xed\x055\xcd5\x05\xaa\x9bS\x8fZ\\\xd3&zn\x8c\x8e\x02I\x03>b\x8e\xa4\xd1iz\xefnz\x0b\xc1^\xfax\xa8\x18.\x8f\xa2\xb8\x96\x8d\xa9\xb9\xa2bW\xc8\xbd\xa7A\xd2\x80o\x98$i\x8a\x83\xdc\xa7\x085\x15Py\x17\x8c\x1c\xefJS\xe9m\x0a\x0d\xb9\xe1\xbb\x94\xb1\x84\x1b0!?(iq\xa1\x90\x00\xc5\xe8\x13\x03C\x8b\x89\x92n\x12n\x0aZ)xb9\xcc\xb8\x9f\xe0H\xc4uz\xc5\xac\xe9230\x99\x8e\x86\xcb\xbd(\xe4j@\x02\x92\xf63&J\xba\xa4\x92>\xed\x12n\xe0}\xc8\x84[\xf3\x8fL\\\xce\x96&\x05\xcd-N\xf2\x9fX\x20i\xc0\x17\xcc\x93t\x8b]X\x11+\xae\xa5O\xb5\xc5\xde\x82G\x17\xdd.%\xddt\x9d\x01$\x0d\xf8\x82y\x92\xae\x14M\xb0D\xe7\xca*\x7f\xdb\xdc\x05\x1c\x20i\xc0\x17\xcc\x93t\x91h(M\x1d7\x10*\x83\xb9\xb4\x01D\xd2O\x8e\xc5\x8f\xac\xb6C<\x12\xde\xf0)HB/Z7\x17\xcd7@\xd2~\xc64Iw\xd8E_\x88&;q\xbc\xbbb\x87\x15o\x03\x88`\xc6\xfd\xf9\xaawI\x7f~\xdfMcn\xf8\xe9\xee\xab\xdahi.\xe4\x16\xe1\xf9\x16\x8fl}\x94t\x88F\x8a}\xdb\xe8s\x01C\x8bi\x92n\xb1_\x16\x12\xbd\xd4;\xa7\x0a\xceK\x1b\x11\xa2%\x1a\xb5\xa4\x7f\xf1\xb3\xd7?\x7f\xfb\xc9[\xd5a^\x08\xb9\x89\xfe\x00\xec\xbe\xe9\xfa%\xad\x09H\xda\xcf\x98&\xe9&\xbb\xfb>\x1d\xed\x05U-Up\xf5\x98!d\xc8-\x80\x85\xf2\xcc\x7f\x8c\x19w\x9f\xa8\xa7G\xc7\xfd\xeb\xb8\xdf\x88\xc2\x1a\xf37\xb7\x94\xa4\x88\x07n\x0c\x19{\x01'.\x8c}\x9b\xeey\xf3\x98\x1b\x1fe\xdf\x7f\xfc\xc7$\xfc\xc7\x8f3\xd9\x0aG\x09y\xfc\xe61c\x7fA2\xfc\x0d9\xc2U\xd5\xa1^\xff\xe9\xd817?\xee\x8e\xc5G!\x85a\xf6\xb9Q\x08\x05I\xfb\x19\xd3$\xdd\"/\x879\xf7\x15\x94\xc15\xde\x86H\xbd4~x\xf1\xdf_\xbc\xf0\xfa\x8f\xef\xa3\xe9\xdf\xdf\xb8\xfb\xc2\xee\x1bE\x9d\x8d{QT\xb4\x1cq\xeb\xdbW\x7f\xf28\xde\xf2\xf8Oh\xf4w\x9f\xb9\xf0\xfa/\x149\xdc\x84G\xf3\x7f\xfe\xbe:[\xda\x7f_x\xfbg?\xc3B\xbfq\xf7\xe7\xbbo|Fu\xa8\x9b\x1f\xf8\xdb\xe7/\xfe\xc4\x1d\x8b\x8fB%\xcd\xec#\x84\x82\xa4\xfd\x8ci\x92\x06\x06\x0a+\xe9[\xc9\x9c\xfa\xedqB\x1ak\xed\xea3\xa2\xce\x9e\x19\xfb\xd3\x07\xa8\xaa\xe5\x08\x9c\xa0#\xf1[\x9f$\xd1\xb7<)\x0429<\x8e\x15\xf8\xb3'\xd5\xd9\x0a{^\xfd\x7fc\xf1>\xf4\x08\xb7\xa8\x0eu\xc3\xdb\xc2\xb3\x1c\x1b\xc2\xec#\x85\x82\xa4\xfd\x0cH:``%=\xd6=\x02'i2\xcc\xfd\x9b\xa8\xb3\xab\x7f{\xf4\xae\x9bIW-G|~\xf5\xea\xe7c\xdf\xbe\xfa\xf6\xd8\xcfI\xb4{d\xce\xe6\xf0\xfd\xd7_\xff\xbeG\xb6\xe2\x03y\xbc\x81\x1e\xe1\x06\xd5\xa1\xfe{\xec]\x8f\xbe-\x95\xe9sQ\xd2\xca}@\xd2\xfe\x07$\x1d0\xb0\x92\x1e#\xf6\x90\x0a\xf1H<\xfe}e\xc4\xd5\xabw\xddw\xf5\xbe\xbb\xe4\x1f\x80\xab\xca\xf7\x9f\xbc\xeb\xae'=\xb2\xd5\x92\xb4\xf2P\x7f~\xe0\xa77<\xc0\xc6\x82\xa4G\x02\x20\xe9\x80\x81\x95\xf4-\xbf\x91\xb5\xa7\x18\x0dS\x88\xfa\xd8\x08\xfa\xb7\x0b\xbb\x7fL\xd3\x8a5\xab[\x9f|\xfb\xf3\xd7\x7f\xf6\x0be\x04\xe6\xa6\x07n\x12\xf7\xbc\xf1\xf7tyL\xf5\xbe*\xdbq\xbfw\x1f\x8c<\x0aK]\xea\xe5\xb1\x1f\xff\xfe\xc2\x85\xdf\xdc\xcc\xc6\xb2\x92~f\x1c\x0e\x1d\x07\x92\xf6?\x20\xe9\x80\x81\x95\xf4\xd5\xdd\xb7\x8e\x19s\xebn!\xfd\xe8\x8d\xf2\x99\xa5\xdd?\xbda\xcc\xb8\xff\xbe\xa0\x8a\xb8z\xf5\xbe\x7fu\x9f\xf2z\xe6?\x84\x93X\xca\xf7U\xd9>3.$D\x96\xe7\xd5\xdf\x8c\x0b\x11Ob1\x87\xfa\xfd\xadc\xc6\xfe\xe4u6\x96\x954=\x89\xf5\xc0\x18\x90\xb4\xdf\x01I\x07\x0c\x92\xf6\x02\x07<\xde\x07I\xfb\x1b\x90t\xc0\x10`\x92\xfe\xc5\x9f/\xbc\xf8\xef\x0f\x80\xa4\xfd\x0eH:`\x080I?\xfa\xfd17aE\x83\xa4\xfd\x0dH:`\x080I\xbb\x01I\xfb\x19\x90t\xc0\x00\x92\x06|\x01$\x1d0\x84\x04(F\x9f\x0b\x18Z@\xd2\x00\x10T\x80\xa4W\xaf\xd6J\x02@\x80b\x8e\xa4\x95\x06:\x08U\x99wK\x93\xbfZ\x9e\xd0H\xbay\xd9\x82I\xc0\x89\xf7~\x19\x1f\xbb\xf0\xe8\xfc7pr\xeb\xcc;\xa6\xde1s;B\xf5\x16\xcbB\x84\x0e\xe0\x88\xa3\xea\xfd\x86\x89\xa3\xf1\x7f\x91\xd2mS-\xb3\xbd\x84z\xe7a\x8b\xe5\x80Q\xcc\x80\x18\xba\x8aZ\x8d\xc3\xacmFQ\x80.\xe6HZa\xa0\x83\x90\xd3^k\xb0\xc3\xf0\xb1\xd2zI#\xe9\xc6\xf5F}\xec\xf2\xf7\x10:;u\xe9\x81\x97\x96S\x1d\x1c\xb5\xfcr\xcf\xc1\x17\x96Z\xea\x91\xeb\xa8\xc5\x8a\x1f\x0fX\x8e\xba\xd0\x10s\xf4\xac\xe6\xe6\x83VF\x88\xa7V[5\x83|\xe1R\xfd\xd4\xedF1\x03b\xe8*\xea\xe3\xfa\xfa\xff\xb1\xbca\x14\x05\xe8b\x8e\xa4Y\x03\x1d\xac\xe8\x12\xf3$\xddfY\xaf\x91d\x89']\xf7\xe2\xc5$\xb9\x9a\xb4\xd4\xf5\xb1\xb4\xec\xb18\xd8eY\xb9\x9a\xec\xe7CC\x1d\x20\xf3\x97\x1bE`\xb6\x0f^\xd2\x08Y\x87V\xd2h(+\xea\x14H\xfa:0I\xd2\x14\xc1@\x07U\xd9\xab\x0aL\x93\xf4j\xb9g^\xed\xd9I\x13hKM\xd8J\x92\xef\x91\x96\xbax\x01\xdd\xbc`1i\xa9Gq\xb3\xf5\xb9\xa5\x0e\x80\x80\x95\xf4\x90T\x14H\xfaz0Q\xd2\xa2\x81\x0er\xb9\xdc\xb7\xe7\xf7?mS\xd7k$\x15\xd0\x96\xba<\xfe=\x92>\x88\xdb\xe4BAm\xcb\x17\x92\x96\xda6\xff\x80\xba\xa5\x9e\x9dj\xb1lm[\x99`\xbd\x9f\xdc\x20\xf1\xa5\x85\xd6\x99\xeb\xe9\xfb\xae'f\xc7.|#\xe1\x20z\xc4byI\x9e\x09\xcb\x01\xf5\x8b\x13\xa6\xc6\xff\x12\xcfG\xffb\x11\x98\x8f\x14|m\xb5\x90=)\x97V\xc6\xc7.\xf7\x1cx\xb7-\x8f\xc7Y\xe0_\xa6N\x9cHXJF\xef\x8fX\xa6\xeeY?\xd3\xba\xf8cU\xa8u\xfd\xea\xf8;\x96\xb6\xd1\xb4\\\x06\x19\xcd\x1c\x0e\xe2\x12\xfc\x16m\xb7h\xce\xc4\x07ZQdn\xbd]\xccL>\x1aA\x94\xb4^E!\xf4B\xfc\x1e\x04\xe8`\xa2\xa4E\x03\x1d\x82i\x92^=\xf5c\x8d\xa4\x02\xdaR?N\xb0\xdc\xbf\xfd\x14\x1dT\xcc\xff5\xdd\xfc\xeb\xf9\xb4\xa5\xee\xfc\xa5\xba\xa5\xba\x0e\xbc\x94036a\xfdJ\xcb\xc7d\x04\xba\xfe\xe0\xce\xf8\xf9X\xdc_'\xc4\xef<\xf8\xb0\xc5\xb2G\x9c\xc7\x8a3a9\xe0\xace\xe5\x81\xa3{\xe2-\xbdd^:sa}}}\x9b\xaa$g\xeb\xeb\xc5\xbe\xb5-v\xe6\x0b\x7fYlQK\xfa\xb5\xd8\xf9\xbf;\xba\xdd\xb2\x93ho\xf5k\x07\x96ZN!\xf4\xd7\x97\xa6Z\xe2\xb7\xef\x8cUw\xfbV\xcb\xfc\x97^\x9ao%\x02\x94\xcb\xc0\xa0\x99\x83\xeb\x8d\x84\x87/\xa1K[c\xeb5\xfa\xdb\x01WT}\xecVwf\xf2\xd1\x08\xa2\xa4u*\x0a\xb3\xdcr?\x02t0O\xd2n\x03\x1d\x82Y\x92\xfex\xea\xc3\x1aI%\xb4\xa5\xa2\xaf\x9f]0\xd5\x12K\xfa\xa6\xd9+\xe9\xe6\x95\xb3iK\xbdd\xbd\xe49\x9e\x9coY\xdc\x89\xfb9\xa2\x8b?\"\xd2Bq\xdf\xba2\x96\x0c\xeb\xd7[H\xf7B\x85I\x87\xcdL\xc0\x9ex\xd2\\\xff'V\xc8Ag\xe0-Jz\xe1L|\xc8\xde\xf9*I\xbb\x12\xee\xc7\x9b\xbb\x0f|M~WH\x99\x84\\\xac\xb1\xf8\xb7ee\xbc:\xa7\xd98\xc25s\x81\xa2\x0clf\xda9l'C\x87\x95\x9a'\xfb\x06^Q\xabI\xee\xbf&\x99\xb1Gc\x06\xde\x9a\x15\x85i{\xb6\x0d\x01:\x98'i\xb7\x81\x0e\xc1,I?2\xb5M#\xa9$\xde}f\xcbu\xf4~\xcbA\xa9\xf3Y.t>\xe8\x97;5$m\x15;\xfc\xe5\x09\xdd\xbd\x98\x04\xdcj\xadt\x92\xf9W\x95\xa4\x99\x80\x8f\xe3\x13\x1e\xd9s\x16u\x0b9x\x95\xf4\xd74\x17\xb4U%\xe9\x83\x16y\x9d\xfc\xef{\xeeO\x88\x15\x86\xeeV\xa2\x19\x8fy\xb7\xf5\xb7\xe4q\x8f\xe5k\xb6\x0c,\xda9|ly\x0f\xb9b5\xcfE\x0d\xbc\xa2^\xb3\xba\x90\xcbZO\x92\xcc\xd14%\xadSH\xc0\x13\xf3$\xed6\xd0!\x98$\xe9K\xd6\xd5\x1aI\x15\xb4\xa5\x9e\x12V\xce\x16.\x15\xfe0K\x85)\":0_C\xd2\xeeY\xf0|qV\xbc\x1cK\x81\xce>]*I\xcb\x01X\xa8{\x96\xcf\xb6\xc4\xffN\xd8\xd1\xab\xa4\xcfZ\xa8\x0c\xd42\xdd)\x17\xe4T|\xc2\x13\x07\xea\x17\xcf\x97\xf6\xf1\x944\xcd\xa9\x1e\xff\x0a\xb0e\x90\xd1\xcb\xe1\xfe'\xd0\xd1\xd8n\xa4\xc1\xc0+\xaa7\xfe\x00z\x99\x0eN\xd8\xa3iJZ\xbb\x90\x80\x06\xa6IZ2\xd0!\x98$\xe9\xf5\xb8\xa5y&%z\xe9&\xdaR\xe3\x1f\xa1[\xb6\xceDHlw\xf3\x17\x0b-\xd5e=\xea)iw\xc3[\x99p\x96\xf2w\xd4+H\xe8=Y\xd2\xb4\x8f\x95\x03\xd0Yr\x9c\xaf_\xb2\xee\x91rx\xc1sr/\xe4\xf2w\xa1\x97V/\x8f\x1d\x95{\xe9\xd9\x0bH\x99\x96{\x934]\x0c|\xc1\xd2\xc9\x96\x81A/\x87\xbf\xc4w{\\d7\xe8\x8aZ\xbf\x1c-\xa7\xe5`\x8f\xa6\x96\xb4\xba\xa2\x00\xef\x98&i\xc9@\x87`\x8e\xa4\x8d:\xe9=\xa43\xfc;YmB\xf1\x09_\x93-Di\xe2\xe9V\xb2\x03i\xa9h\xf5\xaf\xf5%}T\xe8\x9b\xb7>K\x96\x82Ik\\)H\x1a7\xfe\xde\x05Ve\xc0v\xe1\xd2\xaa\x85tJ\xbf\x10wm\x974\x96\x95\xc5\xb9\xf4\x02R\x9c6\xabJ\xa6\xae\xf8\x85\xa4\xfb\\\x8fE\x92@J\xd0;\xdf\x9b\xa4\x13\xc8\xbc{\xf6BE\x19\x18\xf4r\xe8\x8e\xff\xcb\x1d\xeaq\xf7\xa0+\xea\x94\xf5\x92\x95.\x89\xb1Gc%\xadUQ\x98\xb6\xedm\x08\xd0\xc14I\xcb\x06:.\xa7\xb3\xa8\xcai\x82\xdd\xc6\x13r\xcf\xfc\x84F'M.\x7f:\xf0\xc7\x05\xf1\xa4\xaf\x8c\xb7\xc4o=z`1\xb9P\xf1\xa8\xe5\xfe\x97\xeb_^ly\x99\\\x14u\xc0\x85\xea\xad\xca\x96\xda{\x8a\xaeW\x0b\xf9=a\xf9\xf5\x81\x97W\x93E\x9dK\xf1\x09{\x0e,\xb7RI/\x8c\xff\xdd\xb3\x0b,S\xff\xf8\x1e\x1b\xb0\xdd\x12\xbb\xf5\xe0\x81\xd5\x96\xd7\xc8~\xdb\xad;_^lU\xf6\xd2\xddo\xd4\xd7[W\xd7\xd7w\xe2\xce\xde\x9a\xb0}\xeb\x1dB\x0e\x0cG\xad\xb3\xf7\x1c\\oy\x81d\xb6|\xcf\xb3\xf3\xf10\xfe\xd4\xa5\xfa\xa9\xabO\xa1\xb3\xab\xa7\xd6+\xcf\xba[-\xf7\x9f:\xba0\xb6\x0d\xb1e`\xd0\xcd\xe1\x89\x84X\xb5}\xd9\xe0*\x8a\x10\xbfXX\xb6\x93\x8f&\\=\xb6\xb3\xbe\x9e\xe4\xa6YQ\x98\xa5\xe4\x02S@\x1b\xd3$-\x1b\xe8\x1c\x13.\xf7\xbe\xe2-z8\xb8d]\xa9\x91d90\xdf\x1a\xbb\x94\xaaf\xc1\x0b[g[\xe3\x85\xd3\xb8[g\xc6Zb\xc9\xa5\xcb\xaf\xd1S\xaa\xbd\x0b\xe2\x15M\xfc\xac0\xe9\x13&\x92\xe8\xe8\xe2\xf8\xd8\x85\x07I\xea\xef\xab\x13\xac\x8b\xcfRI\xb7-\xb4\xc6.\xfe\xad\xc5\xf20\x1b\xf0\xd2\xc2\xed\x09S\xe3\x17\xbeFws\xad\xbf\xc3\xba\xf0\x14R\x20f,\xe4\xb0\xf4\x8e\x84'\xfe8\xd5\xa2Z\xa5o[\x9e\x10\xbb\x80tg\xbd;gZ\xe3\x97\xbf0s\xea\xc2\x87\xf1\x1eS\xdf#\xa7\xb4\x95\xb1\xb3\xb7/\x8f\x8d_)\xc8\\.\xa4\x8cn\x0em\x16\xcf\x01\xcd\xa0*\x8a\xb0\xd3\xba\x93>\xcbG\xa3\xd7x\xbbg\xcd\x9a\x15EwS/\xe0\x03\x12\xa6I\xda|~k\xf9\xabFrx\x11\x96\xc7\x02\x1a\x97\xf55\xa3\x90\xe1g\xe9b\xa3\x88\xd1\xcb(\x96\xb4\x19\xffU\x19\x04\x92>\xe0\xd9\xd7\xfa\x9dg-\xaa1\x05\x203\x8a%m\x06\x81.\xe9\xed\xaf\xa1\xc5[\x8d\x82\x86\x9d\x8f\xe3w\x1a\x85\x8cb@\xd2\xfe\xa4\xed\xa8e\xbdj\x86\x1cP\xb8,\xf3\x1f\x89\xff\xda(\x0a0\x15\x90\xb4?YHV\x9a\xda\x8c\xa2F0[c\x17\xb7\x19\xc5\x00\xe6\x02\x92\x06\x80\xa0\x02$\x0d\x00A\x05H\x1a\x00\x82\x0a\x904\x00\x04\x15\x20i\x00\x08*\xfe?\xb6^u\x0b\xa5[\x1f\x81\x00\x00\x00\x00IEND\xaeB`\x82", - - "analysis/ident-func.png": "\x89PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\x00\x03\xd2\x00\x00\x00\xda\x08\x03\x00\x00\x00}\xf6\x8a\x1c\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x02\xfdPLTE\x00\x01\x00\x01\x04\x00\x02\x05\x01\x0a\x03\x01\x05\x08\x03\x09\x0c\x08\x09\x0f\x11\x0e\x10\x0c\x10\x12\x0f\x13\x15\x12\x15\x16\x14\x0f\x17&\x19\x18\x11\x1a\x1a\x13\x1a\x1c\x19\x1c\x1c\x16\x13\x1e7\x20\x1f\x19!#\x20$$\x1d#$\"$%#'(&)(\"+)\x1e\x14+N++$*,)/-\"-.,.2402/63(241:7+685;9-:;9?<0=?=C@4AB@CEBGE8KH|u]tvsB\x8c@@\x8dG\\z\xbby{x]~\xb7e|\xb8\x84|dK\x90J_\x80\xba}\x7f|O\x93Nb\x83\xbd\x8b\x81cN\x95Ud\x85\xbf\x81\x83\x80W\x95Vl\x87\xbc\x8f\x86hZ\x98Yo\x89\xbe\\\x9a[\x87\x89\x86\x93\x89k^\x9d]\\\x9dds\x8d\xc3\x8b\x8d\x8a\x96\x8doz\x8e\xbfe\x9ef\x8d\x8f\x8c|\x90\xc1\x9b\x91s\x90\x92\x8fi\xa2i~\x93\xc4x\x95\xc4\x80\x94\xc5\x93\x94\x91{\x98\xc7s\xa4l\xa0\x96xq\xa5s\x97\x99\x96\x83\x9b\xc5\xa3\x99{\x99\x9b\x98u\xaaw\xa7\x9d~\x87\x9f\xc9\x9c\x9e\x9b\x7f\xabz\x89\xa1\xcb\xab\xa0\x82\x9f\xa1\x9e\x8f\xa2\xc7\xa1\xa3\xa0\xa2\xa4\xa1\x92\xa5\xca\x82\xb1\x85\xa5\xa7\xa4\x94\xa8\xcd\xb3\xa7\x82\x8b\xb3\x89\xa7\xa9\xa6\x96\xaa\xcf\xb6\xa9\x84\x8e\xb6\x8c\x9d\xac\xcc\xaa\xac\xa9\x8d\xb8\x93\xba\xad\x88\x9f\xaf\xce\xad\xaf\xac\xa1\xb1\xd1\xaf\xb1\xae\x97\xbb\x97\xc0\xb3\x8e\xa5\xb4\xd4\x9a\xbe\x9a\xb3\xb5\xb2\xab\xb7\xd1\xb5\xb7\xb4\xa3\xbf\x9d\xa2\xc0\xa4\xc5\xb8\x93\xb7\xb9\xb6\xae\xba\xd4\xb9\xbb\xb8\xb0\xbc\xd6\xa6\xc5\xa8\xbb\xbd\xba\xb2\xbd\xd8\xb6\xbe\xd3\xbd\xbf\xbc\xa8\xc7\xab\xaf\xc6\xab\xcd\xc0\x9a\xb9\xc0\xd5\xbf\xc1\xbe\xba\xc2\xd7\xb2\xc9\xae\xc2\xc4\xc1\xbc\xc4\xd9\xb2\xcc\xb7\xd2\xc5\xa0\xc4\xc6\xc3\xd5\xc6\x9a\xc0\xc8\xdd\xbb\xca\xde\xc7\xc9\xc6\xbb\xce\xba\xd8\xc9\x9d\xc0\xcc\xda\xc7\xcb\xdb\xca\xcc\xc9\xbf\xd2\xbe\xc9\xcd\xdd\xd7\xcf\xa1\xcd\xcf\xcc\xc4\xd0\xde\xdf\xcf\xa3\xc8\xd3\xc1\xcc\xd0\xe0\xcf\xd1\xce\xe1\xd2\xa6\xc9\xd7\xcb\xd2\xd4\xd1\xd2\xd3\xdd\xdf\xd6\xa8\xcd\xd6\xde\xcc\xda\xce\xe6\xd6\xaa\xd6\xd8\xd5\xd0\xd9\xe1\xd8\xd9\xe3\xd5\xdc\xd1\xd3\xdc\xe4\xda\xdc\xd9\xe6\xdd\xaf\xec\xdc\xb0\xd5\xdf\xda\xdc\xdc\xe7\xdc\xde\xdb\xda\xdf\xe2\xd7\xe1\xdc\xe0\xde\xe2\xde\xe0\xdd\xf0\xe0\xb3\xdf\xe1\xde\xdd\xe3\xe5\xe1\xe3\xdf\xe3\xe5\xe2\xe1\xe6\xe9\xe8\xe5\xea\xe5\xe7\xe4\xe4\xe9\xeb\xe7\xe9\xe6\xf1\xf3\xf0\xfa\xfc\xf9\xfe\xff\xfcd\x82\x05\xe8\x00\x00\x20\x00IDATx^\xed\x9d\x0fT\x14\xd7\xdd\xf7\x1fZ\xf3\xc6\xe6M\xda\xd7Q\xf6\xe9S\xe2K\xa9%F\xdbd\x95x\xdeJ\xa0fN\\@\x13\x90*\x82\xc4\x98*M\xa2\xb4Q\xe2\x9f\x9ch0\xc4\x1c\xff\xb4.\xc1@\x0c\x09h\"I\xa4\xc1\x83A\xa4V\xadx\x0cA\x03\x96'\xc1D\x92\x87\xa4\xa6nj$QL#\x09\x1c\x16\x02\xb7\xf5\xbc\xf7\xde\x99\x9d\xb93;\xb3\xb3\xc0\xee\x0e\x0c\xbf\xcf\xd1\xdd\xbbw\x7f\xf7\xcf\xdc\xb9\xdf\xbd\x7ff\x98\xdf\x7f\\\x1b<\x08\x00\x80\xe1\xc6\x7f\x18\xe9\xd6\x07Fy\x03\x00\x10r@\xd2\x00`)@\xd2\x00`)@\xd2\x00`)@\xd2\x00\x10`\xfa\x8c\x0c\x82\x0aH\x1a\x00\x02\x89+c\x127\xc7\xc8(\x98X^\xd2e3\xdb\x8cL\xcc\xa4}f\x99\x91\xc9Hd\x14\xb7\xfa\xd4\xa9\xce\xcaO\x8c\x8c\x82\x89\x89\x92n\xdeWTrB\x0c79\xcb}\xda~\xb3y^bN\xbfO\x13m\x9e\xe4\xd6\x19\x99\x04\x8as9I\xa9\xb9\xa7R\xbfR\xc7\x7f\xee\xe0\xef\xd3\xb2\x17xr\xc2\x06\xaf\xb8\"\x0e\x135\xfb\xa4\x869Ck87\xd5_[?!\x99\xadC\xeb\xf0k\x81\x0f+\xa1`_\x04\xbe\xd5\xabxLr\xce\xfbFv~\xa2\xd5\xea\x81\xa1\x81\xdbgd\x12dL\x93\xb4\xbb\xd2y\xb4\xf5\xa4\xb3\x85~h/8\\\xec\xd3\xfa\x91\xd4\x8a\xbc\xa4\x0e\x9f&\x9al\x9dPdd\x12(\xea\x93~Sqp)\xcf\x7f\xa4\xfe\xa2\xff\x9d\xcd\x0e\xad\x04\"\xe5\xe1[\xd5QW\x8b\xb8\x0d\xd5E3\xb9j-{\x99\xa3\x196\xbfm}S-\xfe\"\x90\xcc\xdaP\xdb\x93\\\xd1U_\xe6\xb4`\x1f\x04\xa1\xd5\xbb\xab\xf8\x97NUe\xddu\xca\xc8\xd0\x17\xa7\xceJA\x8dV\x0f\x0c\xb5\\\x8d\x91I\x901M\xd2\x95\x05.\x84\xda\x9c\xcd\xf4Cy\xa5\xcb\xa7\xa4;\xf8\x0a\xd4\xdf\xed\xcbB\x9bV\xdbr\xdf\x06mq\x81\x9a\x20v$\xaf\xe9\xc5=/\xd3[\xd2\x08\x95\xfa\x924Zis\xa9\xa3\x9a\xe8O\xfd\xcc)\x1a\xd6,\xebl\xfe\xdb\xfadF\x8a\x18\x102\xab\xe6\x9a|Y\x8b\x05\xeb\x12\x94V?\xc7\xd7\xe3_\xc7\xecL#;_d\xad\x97\xc3\x1a\xad\x1e\x10j\xb9\xa3F&A\xc6,I\xbb\x9c\x0d\xe4M\x18\x0c\x9a\x8a\xdc\xbe%}\x81?\xee\xebk]2&u\xfa6h2\xea\xbc~S\x98t\x99\xbc\xed\xe5?\xf5\xfe\xce\xb7\xa4;'e\xa8\xa3\x04em\xe5\x0cj\xcfH\xda\xd0\xd6'\xd3\x03*\xe9\xa0\xb4:\x954\xaa\xe0\x07\xf1\xc3.\xb1\x94\x91\xb4F\xab\x07\x84\xd1+\xe9\xa3\x05=R\xf8jA\x0b\xf2!\xe9\xdey<%\x1f\xa1m<\x7fP\\\x9bn\xe3\x1d\x15\xf9\x99I9_P\x9b\x0b\xeb\xe79R\xc5\xb0\x8c{\xa24\\\xb4\xa4D\x85O\x9a\xad\xfca\xde:\xa5\xbc\x99k.\x9f\xe2\xc4\xe1\xc6\x9ct\xc7\xbc\x9ct\xb2\\\xef\xaf\xcaJ\xca\xcc\xc7]\xe7C\x07\xcf\xef\xbc\x90\x97\x9e\x98\xf3\xedA\\~)*\xe5I\xf9\x9a\x06(s\x0b\xcd\xb3c/\x1e\xab\xfb+\xb2\x92\x96V\xd0\xa5\xff\x17\xb9i\xc9\xeb\x85\x89\xb7\x94\x0c\xa9\xea\xbb2\xc2\x8d\x94\x08\xca\x9a\x1fM?\x14\xcf\x8c\x98\xb2\x8c\x88\xe4j\xca$[\xf4\x1c\xfaS\x88\\\xf3'E\xa6d\xc8\x92V\xdb\xa2\xce\xe5S'\xc6\x1d\x8d\xde\x87\x96p\x13\x8a\xf1\xc0).\x7fe\x83\x9aY\xd1\xe1Q\xb3q\xb2rN`:RI\xda\xa0`\xd9\xa0!\x9c\xe3V\xb6\xcc\x9f\x1c1\x9b\x9cTO\xab+c%\xe4Vg\x9a\x8f\x9c\xcd-i\xc9k.P\x13\xad\xb3)H:7\x8d\x84\x99\x96\xec.\xbc/)\xfb\x9d\xb4z\xb6k(\x0c\xa4\x13{\\\xe8E|\x96\x98\xa1w\xabk\x1e\x90\xf2(\x9c\xd3#\xa6\x93\xee\xa2sl\x88\xb4\xddh\x95tYy\xf3ng\xf1a\xda\xaa\xe5\x95\xc8\x97\xa4\xd1G\x8d\x07\xf9\xd2\xc6F<\x0a~\xd1\xe8(\x15\xd7\xa6\xe7\x0e:\xf8\xd4\xd2W\x92\xe9\x0f\xef\xa9\xa4\xacW\xeaK\xf9\xbd\xaa\x84'\xa5\x15f\xf5\xc4\xe9OV\xae\xe36)\xbev\xcd\xe7\xa6r\xb7s)X\xe8\xef\xdf\x95w\xa4\xbeb\x1e\xff-\x8e\xde\xc2\xe7\xd7W\xa4.\xedG\xbd\x07\x0f\xa6g\xde\x93\x96\x9f{\xd7\xe7\xdd\x8d\xc9/|\x85\xbez!\xb9\xb1[\xdb\xa0\x97-<\xcf\xb1\xb3~\xa7#\x0f\x87.$gV\x1d\xcf\xe1\xa9\xa4\xa5d\xea\xfa\x1e\xf6\xea\x05M\\\xb9\xbby9G\xb7p2&,)\xdf\x1a5\xbd\x8fh/\xa3\xbad\xce\x84Z\x1c\xd92qJQ\xd9,\xce\xa6k\xdb>9\xea\xc9\xf2%\x1c\xe7D\xae\x9a\xf0u\xd2\xf2W6\xa8\xe5\xe6\xef\xaetFq=\xa8\xf3p\xcd\x94\xb8\x9a\x9a\x9af13\xb7{\x1f\x95\xb4Q\xc1\xb2\x81\xbb\xa48z\xca\xc4\xe8e\xf39\xb2\xd5\xebiue\xac\x84\xdc\xeaL\xf3\x91\xb3\x99^Z\x9a\x9et\x0e\xe9\x9cM,\xe9\xeeO\x0b\xf1\xef*b[\xb2#=yo=Vs\x05\xdb5X\x03\xf9\xc4v76ff766zfQ\xde\xad\xaey@\x8a\xa3\xc8\xb0\xad,_i\x9b\xaf{l=m\xd53\"\x872]\x0a\x04fI\xba\xc4Y\xdc\xe0j..\xc1\x9an.\xea\xf4-iv\xe2\xed\x20\xe7T\x98\xc8:\x92\xf1\xefx^*\x0e\xf5\xa6\xe7\xe0\xb1\xb1\xf7\xa0z\xff\xac\x9ck\x15\x02\xee\xe8\xd9nr\x1e\xdaU\x06\xfb\xc2\xb9p\xbaAY\x91J\xc4\\\x91\x8c;\xc1q\xbe\x0a\x07\xcf\x92\xe1\x18O\xd5\xf8G\xba\x85U\xfc\x96\\\xfc\x92K\x86bM\x83\xcf\xf9\xbfH\xb9\xd6\xd3\x01\x85\xbefg\xe2\xb4\xfdK\x1d\xcad\xaa\xfa\xba\xb8\xddHI\x13\x1d6\xe7\x93`9G\xb6\x9aj\xb9\x17I\xfdIo\xb9\x9d\\\xf4\x9c9\x19\x07\xfb\xa6\xdbtm\xe7G\x92\x19\xc92\x8e\x0c)6\xb2\xfdL\xe7\xca\x8c\x813\x8a\x8c/[#iy\xcc\xc4[\xa0\xc9\x8f\x82\x19\x03\x9c\x037\xeb\xaa\xb8\x8e\x92Z]\x11\xcb\x20\xb5:\xdb\xbe\x8e\xf4n\xa2\xd0,\xbd\xb3y\x8e\x0e\xb1y\xe4\x07\x91i\xc9<\xd2\x07P>\x964\xdb5\x18\x03\xe6\xc4*'\xde\x1a\xad\xaew@Rp\x1f\x9d\xc3\x08\xaf\x9a\xc76\x077\x9d\xefK7!\xc0,I\x97\x17\x90\xc6\xe8,\xaaE\x9d\x05\xcd}}}\x9f\x14\xfb\xba\xe5F[\xd2y\x9e`\xbd\xd6\x9e\x14\xa6\xcc\xd3\xb9\xca\xb9\x06\x8d\xaf\xdb\x97\xd9\xa2\xb9I\xb6eX\xe8\x97\xd3\xd2\xf3+>\xea\xc7]\x09\xe5\xa6\xf7~\x8bI\xa3\x13\xe9\xa5\x8e\xcfE\xe3S\x89\xdd\xa8;\xe9\x94\x9eA\xafC\x1eT\xb6\x08\xd7\xac\xee\xdbL\xb7\xf50;\x1d\xcad\xaa\xfa\xba\x84N\xc4\xd0\xc4m:Z>3\x82\xd4>e\xb2\xbb\x07\x13MV~m\xce\xd9\x93'r\xb7\xe3\x9aS\xa9\xa2\x956]\xdb\x08z\x15\xa9Y%i\xc6\xc05i\xf2\x12g\x03\x12&\x9f\x8c\xa47\xd5\xd6\xd6n\"\x926,\x985@\xd3m\xd2pU\xc6HZ\x8e\x95`Z\x9dm_G!y\xad\xe0;t\xce\xe69\xfe\x95\xb3\xc7\xb3\x12\x89\xb9\xdc\x92\xfdI\xa5\xc2wJI3M\xcd\x9cX/I\xab[]\xef\x80\xa4`\xc6\xed\xf4m\xaa\xda@\xe2\x93}\xce\xa9\xa3v\x94\xae\x16~\"\xab\xcbP\xab\xd3\x83\xfe\x16\xa4\xb6\xa4\xa5\xe0^\xbeW3\xd9Q\xcf\xdcj+\xe7\xbdnB\xe8\xc9('^\xd5m\x8d\"s\xd6\x8e\x8a\xf5\x99\xfc\xbc\x97\xfa\xc9\xc0!\xb0\x86\x98,\xf5\xac\xbc\xd0\xb7\xc9G\xd0\x91y\xe4\xc7^\xdb@\\K\xf7\xe2\xa1\xf9a\xfa\x0d\xca\xc9\xc2\x03E#\x09\xd1J2\xc9T\xf5\xad\xe5\x0e#%tI\xdb>\x81\xc8g\xba8n\xe2!\xb2vR\xf4\xf2\xdd5q\xb8_\x9d\x10\xae\x94\xc8\xdbcj[q\x08\xba\xaa\x924\x93\x19jw\xa6L\xe5\xa2\x9e\xa4\xe5im\x8f\x19\x16\xccf\x86\xa6\xcf\x90*\x7fT\x9e\xd12\xb1\x12l\xab3\xedK\xcf&j\xe4\xcf\xea\x9cM\xba\x96\x16~\"\xe5\x96\xfc\x82?B\xbe\xebVI\x9a=C\xf2\x89UI\xda\xbb\xd5\xf5\x0eH\x0a\xce\x9cM\xdff\xcfP\x19\xb0\xd4p\xb5\x9a\xf1\xa1\xc3,I\x9f,\xa2\xa3r%\x9e\xa6\xb4\x11\x9a\x8a\xda|\\\xd8PIz\xa7J\xd2\xa7\xf8\x0f5\x93u\xda\xc4;\x1e*9\xcd[1\xdct\xef\x95\xa8\xfdl!Y\x98\x1dL\xac\x20?\xf1g)t\xde\xc7t\x82\xfc5h}>\x09h\x1b\x14&\xd2\xcf\x07\xf9\xaf\xd0\x16a\x97-=\x0f}#\x8c\xd2y\x0ee2U}\xd7\xd9\xd4SSAY\x13I\xed\xe7O>I\xc1\xad3u&\xa9j\x8aa\x94n\x92%M\x07V&\xb3\x13d\x0f\xeb\xea\x8b\x114#*\xe9\x82O\x14\x926,\x981`~\x14\x98VW\xc4\xca\xc8\xad\xce\xb6\xaf\x83\xb6-\xd9\xd1\xd6>\x9b\xc2\xf6X29\xe7rK\x8a\xa3\xf4G\xb2\xa4w\xaa\x9a\x9a9\xb1biU\xe2\xbc\xc0\xbb\xd5\xf5\x0eH\x0afL\xa6o\x933T\x06,\xa3w\xc7\xbb\x9d^\xc4\xbaZ\xe0\xb9}\xcc\xdf\xb5t\x12\x9e\x9f\xf5\xffF%\xe9\xee\xd4l\xf2\xc3\x9e\x9f\xafN\x972E\x98\xcewN\x8a#]h\xc92\xb5\x81+R\x98\x1a\x94\xd2\x0e\x83\xb27\x93Y1]$\x17\xbeD^\x19I\xbf\x9bx9\xf1]\x12\xd06\xe8H^O\xf6\xba\xb3\xd3=\x06\x07I\x96Y\xe9\xb8[}\x9a\xe8P&S\xd6\xb7o\xeal\xa4BP\xd6\xa4e\x0d\xeb\xf0\xca\xad\x84\xc4\xac\xc4\x83Z4\xe9D}\xd3\xc9\xecoF4\x9e\xb7\xb6\xd8l\xba\xb6)Q\xa4c\xce\xa7\x0a\x8c\xc0\xea\xed\x9bAl\x19\x83u\xc2\x8a0n\x09}\x8d\xc3\xbf\xac\xe4;F\xd2\x86\x053\x06\xca\x0e\xeeiu\xddn\xefiu\x85\xa4\xe7\xe1\xb5twz\xb6\xbauZ7\x08\xd3xA\xd2\xa9\xf9\xe7J\xd9\x96\\?\x0f\xb7o\x7f\x1e\x95\xb4\xdc5\x18\x03\xe6\xc4\xe2W\x9c\xfbW\xc2wZ\xad\xaew@R\xb0\x9c\xce\xd5_\x14\x96\xcb\x20i5'\x0aN\xb8\x9a\x8aw\xf7\xd0\x0f}\xae\xa6\"\x97z\xefJB\xd8\xf1~\x87\xce\x9d\x1eN}\xa94\x8bwT\x9d\xbb\xdc\xe8\xd8\xfcN\xff\xfb\x9b\x1dd'\xfcT\xe2}\x15\xf5\xc2&\x89\x82\x96\x09\xe2\x1ew\xb5m\xaa\xb3|\x89\xfem\x8e\xa5|R\xe9\xf1#[x\xb2V.\xbc+\xf7\xc8_\xb6\xe03\xff\xed\xbbt\x8fT\xfcU\xefO\xcbI\xa3U\xd01\xa8Oz\xb8\xeax\x8e\x83\xcc\xb4s\xf9\xc2\xe3\x85<\xd9O;\x97\x94V\xba3\x99\xd4\x97I\xa6\xaa\xef&\xef)\x84pWa\xdcl\xb2x[\xce\xa5\x94\x94ep\xc5D\x85)\xce\x0d\xd3\xf1d\xf9(j\x8a\x88^\xb72rBxQ\xb3\x8e\xadkR\xb4s\xf7\x1c\x1b\x95\xf4\xcc\xa8\x0d\x1bfr\xc4V\x91\xd9\xc4u\xe5\xbb3\x84\xdd\xe9u\xb6Me\xb3\"\\\xca\xbb\xc7\x8c\x0a\x96\x0dz\x8e\xd2=s\xcf\x12ZluU\xac7\x8a\xe6s\xf0Y\x07+2\x93\xc9~\xb4\xa2u\xe6p\x82\xf4\x04Ig\xe7l^\xca\xb6\xe4\xe5\xd4\xf4\x8a#k\x12\xa9\xad\xd45X\x03\xf6\xc4\xe2\xdf\xff\xbdG\x1e\x11\xee\x1f\xd0ju\xcd\x03R\x1c\xc5\xfc\x09\xcb\xcb\x97O\x98\xef\xeb\xd8Nx\xcd\xe7C\x8di\x92F-eE\xbbO\x08\x8aF.\xb2\x94\xd6\x1b\xa7{\x93\xe9\xc2\xc8A\xaf>\\\xc8N\xbc'g'\xcfo\xdbF\xa2>J\xc2\xaf\xdbp\xf4\xa7\xeb\xd3\xee\xc9:\xe2\x9dv\xa5Ml\xe0\x96\x94\xe8\x893\xd4[\x9c2U\xd9\xa5\xe9\x8e\xd4l\xe1v\xc3\xfa\xecy\xc9\xd9\xb8\x03}(\xac\xc8rD\x9b\xbd\xd2\x0e\x98\xb6\xc1\xb9\x9c\xa4yk\xe8\xceN\x7f\xc5R\xcfu\xe9\x0bk\x92\xd3\x0b\xab\x1c\xb4\x92\x9edHQ\xdf\x9a\x08\xaf\xb9C\x09^\xd0\xe1En\xc3\x94(2\x1e\xec\x8b\x8b\x8a\x9cId\xdb\xb7i\x8a-*\xa5h\x8a-\x0e\x1f\xcf\x9c\xc8\xc9\xcb\x8a\xc2\xb9%:\xb6\xa8-#:b\xd6\x09*\xe9\x96\xb8\x88\x89\xb3\x96s\xdc\x12\xd6\xa08n]t\xf8\xa48\xf1z\xd3\x92\xc8\x88\xb8Z\xf6\x1eo\xa7a\xc1\x8cA\xc3\x04\xba\x06\x95\x86=\xa1\xd5\xd5\xb1^(\x9a\xcf\x91\xbf%9-O\x90\x1b{6\x8b\xa2\xe8T\x9f\xdc\x18\xf0\x0an\xe3\xccyd\xbe&\xb7d\xc7\x96\xf4\xc4G\xceRIK]\x835P\x9c\xd8\xde\xfc\xe4\xc4l\xe1\xa6P\x8dVG\x9a\x07\xa4<\x8a\xad\xb7G\xdc\xbe\xd5+\x96\xa5-<\xa5\xa1\xcd\xd4\xbf\xae4O\xd2\xa1a\x99\xad\xc4\xc8\xc4\\^\xb4e\xf4\x18\xd9\x0c\x9aNa\xe9\x1br\x06\xd1\xea\xc2\xf6\xd8\xe0\xe8\xf6\x9e\x9f\x19\x10\xc4V/\x9b\xca\xc1\x1fW\x06\x95M\xd1\x03\xbf\x9f8\x84\xb4O\x0a\xd6\x9f\x04\x11\xcc\x92\xf4\x20Z=\xa4\x92\x0en\xab\xb75\x04\xe7\xf6q?\xb1\xbc\xa4G5\xa6Iz\xe0\x84T\xd2\x96\x06$maZ\xf6q\xcb\xcc\xde\x7f\xf5\x8f/\xe8f\xa7\x91\x95\x0e\x17\xea\xf9\xfcw\x07\x9b\xd8z\x80\xa4-\xccL\x8e\xe3\xc2[\x8c\xac\x86\x03t\xb3\xf3s48\xb2I\xe2\x0bFV\xa3\x06\x904\x00X\x0a\x904\x00X\x0a\x904\x00X\x0a\x904\x00X\x0a\x904\x00X\x0a\x904\x00X\x0a\x904\x00X\x0a\x904\x00X\x0a\x90\xb4i\x1c\xcf\xfa*\xb8\xae\\\x80Q\x89\x89\x92\xf68\xd0q\x17\xd1\xc7\x14\x15i=K\xc8\xc2\xbc\xc4\x97\x92\x9b\x18\x83\xe7\xca\x05\x18\x9d\x98&i\xd9\x81N\xbb\xb3\xc1\x85\x19\xe8\x9f\xee\x8c<\x18\xff-\xe4\x91#\x03k\x02\x92\x06,\x89+c\x127\xc7\xc8\xc8\x92\x80\xa4G\x1f\xd4s\xcf\xd0\x19\xde\xbe\x7f\xa6NuV\x9a\xf6\xe4YS1Q\xd2\x1e\x07:\xca`h\xa9\x8c\x92\xfeL\xbb}IT\xc4lS\xe6j\x9f;\xf8\xfb\x8cl\x10y\xae\x12\xe6\xae\xcc\x0a\xbf\xefH\xd5\xc9W\xf4\xdc\xd3>+\xf2I\x8do\x07@\x80}\xff\x94G\xfa\xff'\xf3\x9e\xf3\x96\xc1q\\D\x8b\x86A\x03\xb7O#vT`\x9a\xa4e\x07:l0\xd4\x94GHO<\x9b5\xc9\x99\x11\xd1\xee\xcb8X\xf4\xbf\xb3\xd9ad\x83\xe9x\x89\xafj\xac\xcf\xe5_02\xf4\xa0\x9d\xaf\xc7s\xcf\xb2\xc9ON\x18\xa2\xd3\xa2\xc0\xfa\xfeY\xce-72\x91\xf0\x9c7WM\xcdV\xcdG&\xd7r5\x1a\xb1\xa3\x02\xd3$-;\xd0a\x83\xe6\xd1\xce\xe1\xee\xd9id\x15$J\xfd\x914\xaa\xe7\xcfa\x9dnc\x9f\x17l\x80F\xbe\x92\xe7\x9e\x19\x1bP\xc4P\xbb}@}\xff\xac\xe4V\x1a\x99hQ\xab#\xe9\x90?pv\xb8`\x96\xa4\x19\x07:L\xd0DZ8\xff\xa7}\x01g\x00\x92F\xbd\xc9\xdb\x8c\x0c%4\xf2\x95<\xf7\xdc^\xe4\xe2\x86:1\x0a\xa8\xef\x9fu\xdc:#\x13-@\xd2*\xcc\x924\xe3@\x87\x09\x86\x96\xf6\x08\x8e\x9bPLB\xee(\x8e\xe2\xf5\xc8\xa0\xe2\x99\x11S\x96\xe1\xb1\xbb!\x9c\xe3V\xb6\xcc\x9f\x1c1\xbb\x87\x09\xaa\x8c\xc5\xc7\x17\xb9&\x0a\x99q\x13UC\x98\x86\xbb\x1e\x84\xbe\xc8MK^/L\x90\x19\x17<\x9a\xb6\x82\xa4\xd1\xb6y\xba\xb6\xfd\x15YIK\x85\xc5\xb6N\xbe\xb2\xe7\x9e\xd9+\xe7\xdc\x8e\x8f%\xbcY\xbb4\xff\x1c\x09\xc9\xbe\x7f\xc4\x83W\x20%c2S\xe4\xab\xe0I\x8e\xae\xed\xb5\x9bo\x09\x17\xee\\6%b\x16\x89\x93\xcf\x1bA[\xbc\xd5\x20\xe9\xc1`\x94\xb7/\x18\x07:L0\xc4\x9c\xa8\xa9\xb1\x09#CC\xcd\x8b\xdc\xba\x9a\x1a\xf542c\xc2\x92\xf2\xadQ\xd3\xfb\x90\xbb\xa48z\xca\xc4\xe8e\xf3\xb9O\x98\xa0\xcaZ|\xc8\xa0\xbbh\xab\x80\xcac\xb6\x96\xbb\x1et!9\xb3\xeax\x0eO\xa5'\xbb\xe0\xd1\xb6\x15%]\xc1w\xeb\xd9\xe69v\xd6\xeft\xe4\xe9\xe7\xcbx\xeeY7\xd1v\xa2gv\xdcQ\x9d\xd2\xfcs$$\xfb\xfe\x11\x0f^\x81\x94\x8c\xc9L\x91\xaf\x82\xad\x1c]\x99k7_sq8\x17\xb5n\xd3Dz]J>oHS\xd2=m\xd53\"\xcdZD\x99\x8eY\x92f\x1c\xe80\xc1\xd0\x13\xe1\xe9\x1aZ\x13\xefr\xae\x08\x91>C\x9daL\xe7f]\x15\x97\x07L\x90\xc5\xf3(\xe0\xb6V\x01\xe5\xe6\x93\xb6\xbb\x9e\xecL\xac\xcf\xfe\xa5Dz\x8c\xb3\x1dm[Q\xd2\xc4\xf9\x8e\xb6m=}\xda0}\xd5\xce\x97\xf5\xdc\xb3\x81s\xa2\xab\x11\xe4\xa0\x87\xe0HH\xf6\xfd#?\x07YB\xe9=\xc8\x93\x99\"\xc8\xe2\xe4\x84q^\xbb\xf9\x90-\x12\xff\xe0\xce\x8f\x12?E\xf8\x92\xf4\x1c<\xc6\x9b\xb8\x8c2\x19\xb3$\xcd8\xd0a}\xe9\x84\x1c\x9f\x92N\x99\xec\xee\xc1D\xd3\x05\xe3t\x9b4*3A\x0dZ9\x0f\x8aN\xae\xe9\xae\xa7C\xd0\xc6N\"=\xc6\xd9\x8e\xb6k\x1fQ\xd2U|\x87\x8e\xed\x16\xe1\x9a\xd5}\x9b\xf5\xf2e<\xf7\x94p\x91\xcb\xd0\xa6I=hH\x8e\x84|\xfa\xfeQz\x0frH\xa32\x13d)\xa2?\xa0z\xcd\x87l\xe4,\xac\xb3\x89\x9f|J\xfa\x93}\xce\xa90J\x0f\x06\xa3\xbc}\xc18\xd0\xf1\xf6\xa5\x13B|Jz\xba\xd8\xb7\xe8lo\xfa\x0c9^\x0ejQS.\xa0\xdcO\xd6t\xd7sV\x98\x07\xd3m,\xc6\xd9\x8e\xb6k\x1fQ\xd2\x85\xc9z\xb6\x0fS?=('K/_\xd9sO[\xc4\xb2j[\xebdz\xf4Cp$\xe4\xd3\xf7\x8f\xd2{\x90'3E\x90\xe5p\xa4\xa0M\xed\xe6Ct\xaa\xed\x9f\xa415\x9c)#\xc4p\xc0,I3\x0et\x98`\xe8\xf1)\xe9\xf9\x93OR\xe8\x14pz\x8a\x14\xcf\x04\xfdG\xd3]\xcf7\x826\xf2\x84\xd1Tr\xb6\xa3\xed\xdaG\xdc\xf1N]\xafg\xbbEpi\x9d\x9e\xa7\x97\xaf\xec\xb9\xa7\x0c\x8f\x81s&O\xa4\xd7\xe1\x87\xe0H\xc8\xa7\xef\x1fo\xefA\x02Lp\x00\x0cL\xd2\xb0\xe3=(\x8c\xf2\xf6\x05\xe3@\x87\x09\x86\x1e\x9f\x92\xde\xc7\x95\x90\xb7\x95\xf4&)cIk,'\x19\xb4\xdd\xf5d\xa5\xe3\x0e\xffi\"\x91\x1e\xe3lG\xdbV\x90t!\x11\xa0\xb6\xad\x10{\x90\xac\xa5\xb5\xf3E\x92\xe7\x9e\xdd\\\x0bj\xe0RP_t\xeb\x10\x1c\x091\xbe\x7fZ\xd7y]\x11S\x14\x0c\x92\x0e\x15fI\x9aq\xa0\xc3\x06C\x8a\xfbhM\x8d-\xa3\xa6\xe6\xaag\xc7\xdb\xab\x17,\xe7RJ\xca2\xb8b\xd4s\xb4fJ\\M\x0d\xe9\xecLP\x85\xd6\xa6/\x83\x96\xbb\x1et.)\xadtg2\xef\xa8:\xa7p\xb6\xa3e+\xdc=\x96\xc7\xd3qR\xdb6\x97/<^\xc8\xe7\xea\xe7+y\xeei\x8bH\xd9\x1d=\xc5\xb6dCx\xdb\x10\x1c\x091\xbe\x7f\xe6p3\x91\x1a)\x19\x93\x99\"_\x05\xe5\x13}\xcc\xd3\\5\xe1\x19G\xd1\xc9\x8c\xf0\x1a\x17{\xde\xe8\xddc[kj\xbc\xf66N\x8c^o\xa0\xa6I\x9aq\xa0\xc3\x06CI\xed\x04a\xa9\xecD\xeeH\x1a\x08\xf7\xba\x81m_\\T\xe4\xcc}X\xf2\x82)\xe9\xecLP\x85\xd6\xa5Y\x16\x0dw=\x08]X\x93\x9c^X\xe5\xe0\xc9\xfd#\x8c\xb3\x1d\x0d[z\x8f7\x9f.Ny5m\xfb+\x96z\xaeK\xeb\xe4+y\xee\xa9\x9c\x12\xb5\xa4\xb3rJ\xa4S\xa74\x7f\x1c\x09\xb1\xbe\x7f\xb6\xda\xa2\x90\x17\x9edLf\xca|Y\xf6E\xf9\xb8-{\x099=M\x11\xf8u\x09s\xde\xe8=\xde\x04\xafiS[xJC\x9b)w\xec\x9b\x8ey\x92\x06\x82B_\xfbU\xdfW\x03=\x9e{\x86\x82\xb0=\xa6\xf4\xfd3'N\xcf\xda\x14\xca\xa6r\xf0\xc7\x95\x03\xc6(o\x20\xf4\xb8&\x8d\x193\xc5\xe5S\xd4\x82\xe7\x9e!A%\xad\xf4\xfd\xb3a\xd8]\x09nk\x08\xe0\x0d\xe8#\x08\x90\xf4\x88\x81\xf7\x83_\xfe\xd7\xff*.\x18\xf3_\xbf\xd4\xfe\xd6\xa8\x04\xbf\xf1v$\xe4\x8a\xda\xaai\x09\x84\x1c\x90\xf4\x88A[\xa6J~\xf9\xbf\xe7\\\xbb\xf6\x7f\xff\xcf\xff\xd3\xfe\xd6\xa8\x04\x7f\x01GB\xc3\x19\x90\xb4\xa5\xe8\x8cL\xb9v-\xf2\xf6\x96\xe0\xde\\\x0b\x8e\x84\x863\x20iKA%=\xf1\xf6\xe6\xe0J\x1a\x18\xce\x80\xa4-\x85\x20i[\xdc\xac&\x10\xf5h\x05$m)\x04I\x8f\x8d\xfc\xfe\x0d\x0d\xbb\xcb\xdbC\x7f\xa9\x1f0\x1f\x90\xb4\xa5\xa0\x92\x9e\xd4~\xad\xe7;aaa\xb6\xa3\xaeNP\xf5\xa8\x03$m%\xfa\xae\x12I\xcf\xc6\xe7\xe6\xfbs\xdc-c\xc3\xc2\xbe\xef\xec\x1c\x9d\xb7P\x8db@\xd2\x16\xa2u\xe6\xf4\xeb\xb1\xa4\xb7\xe2s3\xab\xf9\xda\xb5\x8ce\x87g\x86\xc5\xb5\x83\xa6G\x17\x20i\xeb\xe0\x9e\xf8\xfd\x19\xd7aI\xd7\xe2s\xb3\xfc_X\xdamx\xc4\x8e\x08\xf2\x05-`\xb8\x01\x92\xb6\x0e\x0daG\xafE`I#|nN\xe0\xffG\xf1\xff\x14[\xc3\xa8}\xbc\xc7(\x05$m\x19\xfa6\x85\xfd\xeb\x1aYK\x13\xfe-\xfe\x07I\x8f:L\x94\xb4\xe85\xa7\xa7\xd8)P\x8c\x80\xa1\xd0\xb3\xe4\xfb\xd7\xaeMJ\xb9\xd6\xe7\xfe\xf7\xb5\x1e\xfc\xdf\x8d\xff\x13I\x87\x01\xc3\x17\xa3\x93:\x08L\x93\xb4\xe45\xc7\xed<\xe9\xc2\x9c\x10\x1e\xd0oe\xaaO\xa2`\xe2\x9eo\xbbvm\xfa\x92\x7f\xff\xeb\xda\xc9\x7f\xfd\xfbZC\xdf\xb5k\xcd\x82\xa4\xbb\x80\xe1\x8a\xa5$-{\xcd\xa17:\xb9\x8b\xad\xff\x14\x8a\x19\x83yd\x99\xff\xb8\xe7D\xd2\xd3\xb2\xf5I\xd7\xb5M\x1b\xae^\xdb\xb0\x01\x81\xa4\x879V\x92\xb4\xdakNy\xe8\x9fS\x14r\x06\xf5\x14B\xffq\xcf\x8a\xfe\xb7\x17\x20\xe9a\x8d\x95$\xad\xf2\x9a\xd3\xec\x1c\xa2\x13\xc5a\x84\xd2\xc3\x8e\xc7\x05O\xb9\xf8H\x9d\xe9\xe4\xa1;\x13\x8aQ\xab\x8d\x9b\xaa\xb0e]\xc4\xb0\xf8\xed\x85\xc6=s\xca\xbf\xbc\x98\x03\x92\x1e\xceXI\xd2*\xaf9%\x95>\xadG\x14\x0a\x0f;\x92\x0b\x9e\xce\xc3\xf4)\x845\xcd\xf4\xd1x\xeb\xf0\x8fZ\x86Ma\xabp\x11\xc3\xe0\xb7\x17\x1a\xf7\xccI\xc8\x8b\xe8(\"\xe9gn4\xd4\xf5\xfd\xb7\x1aYx\x13F\xff\xe9\x7f\x190\xbc\xf2\xba\xf5~-3\xdf(2Q\x1d\xaeAe\x8d\xda\xef\x89\x1f|\x87\xbe\x87\xdd\xf8\x18y\xf3\xbfvV\x92\xb4\xd2kN\xab\xd3Z\xcf\x94\x91<\xec(]\xf0H\x13o\xf6\x01\xb6\xb27\x1e\xa5\x8b\x18\x11\xff\xbd\xd0\xb8\x97\x8f\xa9\xb9\xaabwXJ\x13\xee\x8d\xe3^7\xea[\x17\xc7\xbeE\xbb\x98\x91\x9d\x02}I\xbf>\xde8\xab\xb0\xb0\xb017\xdd\xf6\x94\x91\x19\xc1+\xaf\xb7\xc6^\x14\xbf\x19\\&\xe2\xe1j~\xa7Qq\xa3\xf6\xbb\xe1\xf9/\xe9\xfb\x97\xcf\xdfH\xde\xa4\xda\x19b%I+\xbd\xe6T\x96\xf8\xb6\x1eiH\x1ev\x94.x\xb4%-y\xe3Q\xba\x88\x11\xf1\xdf\x0bM_\xb3-\xec\xfa\x1bn\xb8\xe1{\xdf\xfb\xde\xd8\xb1c\xaf\xc7\\w]\x98\xad\xa4\xd5\xe7X\xea\xe1\x89\x9fuu\xdd\xf1\xdb+aW~{\x87\x91\xa9\x8c~\xb6\xbf\xfa\x95\xeeW\x128\xf5\x95\xbf\xfe\xe1\xc7\xb7^12\xd4*\xe8\xd6\xa7\xa4o\x06\x93\x099\\=4\x8e\xca\xa8\xfd\xc2\xbe\x14\x03_\x0a\x96\xb7\xfa\xf5\x1b\xd3e-I+\xbd\xe6\x14\x99\xf2X\xfe\xe0!y\xd8Q\xba\xe0\xd1\x96\xb4\xe4\x8dG\xf9\xf0y\x91\x01x\xa1q7\xad\x9c3+n\x96\xcc\xec\xd9K\xca\x1b\xda\xc3\xc8P\x16&vK\xa2\xef\xa7n\x1e3\xf6\x17\x1f\xe3\x0f\xcf\xde<\xe6\xa6\xc7\x84\xbeu\xdb\x13X\x1b\x8f\xde\x12v\xcb\xa3X\x1c\xcf\xfeh\xcc\xb8\xfb\xbf\xd4\xb2|t\xdcw\xc7\xd1\x14\x8f\xe1\xc0\xa3a\xaa\xfc\x1e\xfd\x81\x10\x89\x87\xb5?\x93o\xde\xbam\xec\x98\x9b\x9fb\x92\xc9\xa6]\x1e\x9d|y\x0b\x99\xa5zJ\xd4/H\xae\xd4\x83d\x16\xfc\xc4\x1dC\xca\x04\x1f\xee\xc7t(\xbd8\xf6c1\x1bO\xdd\xe8\xe5beq4\xe6\xad\xdb\xae\xbf\xee6\xb6-\xa4\xe2X\xc9\x0b!O\xed\x94\x95\x16j.\xb5\x05\x8d\xf2:\x89C\xc7,I+\xbc\xe6\xb4;}\xb9\xa9\x18\x81H\xe2\xf5v\xc1S@\xc6d*\xde\x956\xa5\xad\xb6\xa4\x07\xe2\x85\xc6\xdd\xd6\xda\xac\xa0\xa5\xd5\xd5\xd9'\x8e\xd2\xb2\xa4\xc7\xbf|\xf1\xbd;p\xa7{\xfe\x86g/\xbe\xf5\x0b\xa1\xef\x8d{K\x96\xf4\xeb?|\xfd\xe2[d=\xe8e\xf9\xcc\x8d/\xff\xe3\xe5\x1b\x9f\xc5\x11?x\xf5\xe2\xab7\x85)\xf3{\xd6\x13\xd9\xf5\xc6x\xfa\xcd\xcd\x0f\xfe\xfd\xca\xeb?g\x92I\xa6\x8c\x0e^\xff\xcf.\xb9D\xfd\x82\xe4J\xfd\xf4\xbfq\xaa\xb7\xc6\x0d)\x13r\xb8?#?6O\xfd\xcc\xabYh\x96\xca\xe2H\xd4\x0f_\xbe\xf8\x8f\xbb\xef\x96s\x97,\xf0\xef\x82\xb0\x92&|\x87N\xb9=\xb5S\xe5B^\xe4\xb6\xa0Q\xde'q\xc8\x98%i\x85\xd7\x9cVg\xbb\x81\xf9\x08C\x92\xa9\xc2\x05O\\\x1cBm4\"b9\x9e'\xcf\xf0K\xd2\x03\xf3B\xd3\xe3V\xd2\x83\x7f8\xbd$\xfd\x06~\xff\x9f\xb1]]?\xfe\x83\xd4\x13\xbb\xc6\\\x94'\xde\xb7\x10\x83\xf7\xc6iX\xfe\xf8\x19\xfc\xf2\xcc\x8f\xbb\xba~\xf2,\x09\x84)\xf3\xa3\x91\xcf\x92r\xc8\xbc\x1b\xbf_\xf7\x9e*\x99d*V\x85pqL\x97\\\xa2~Ar\xa5\xfe\xecI5\x84L\xc8\xe1\xfe\xe1\x16\xfc\xe1\x96?x\xb2\x91\xeaF\xb3T\x16\xe7\x19\x85\xffq\xa3\x9c\xbbd\xd1u\xe5\xb1\xf1]\x1e\xc6?F\x96\x00\x9e\xda\xa9r!/r[\xd0(\xad\x938D\xcc\x92\xb4\xc2kN\xb3\xd3J\x7f-\xa4\xf0\xb0#\xb9\xe0AD\xad\x9b\xcafE\x90\x8d\xc0\x99Q\x1b6\xcc\xe4\xc2\x8b\x9a\x19[\xd6E\x0c\xcb\xc0\xbc\xd0h\xe0%iO`\xcc\xc7RO\xa4}\xdcc46L\x9c|zY^\xffw\xfc\xf2\xf7\xeb=\x810e~R$\x99w\x93\x88_\x8d\xbd\xfb\x89\xf7\xd8d\x92)\xf3F\xba\xbfT\xa2~Ar\xa5\xaexR\x0d!\x13r\xb8W\xc6\xbe\xd7\xf5\xde\xd8+\x9el\x94\xed\xa3,\x8eD\xfd\xf7\xcf\xc7*r\x97,\xf0T]\xfem\xfc\x03\x8d\xf1\xd4N\x95\xcb\x15\xb6RB\x94\xd1\xc9\x1b\x04\xa6I\x9a\xf5\x9a\xd3\xea\xf1;n\x09\x94\x1ev<.x0\xee%\x91\x11qt?\xb0%.b\xe2\xac\xe5\x1c\xb7\x84\xb1e]\xc4(\x18\x90\x17\x1a\x0d\xc2\xf4$}=#\xe9q\xcc\x0e\xf0\x18qp\xf5\xb6\xf4S\xd2\x7f\x1e'&\xfe\xf3\x83\xb7]\xff\xa0\x81\xa4\xc9\x9cY*Q\xbf\x20U\xa54&\xde\x03\xc9\x84\x1e\xee\xdd\xf7w\xdd\x7f\xb7\x94\x8d\xb2}\x94\xc5\x91\x97\x9f\xfc\xea\xbd//2m!Yt]\xf9-3J\xff\x96(\xd5S;\xef\\Tma-I\x03!B\xec\xa5c\xff\x07\xbf\xbc\xc1\xf6\xdd\x9f0\x13o\xb2=\xe6\xe1\xc7\x8f\x8a\x01/K\xed\x89\xb7d\xe5\x99x\xd3\xfdnQl\x7f\xbd\x8e\x9dl2\xd9\x8ao_\x92\xa5\xa6T\xa2~A\xaaJ\xa9\xb6\xc7\x06\x9a\x09=\xdc\xd7\xc7w\x8d\x7f]\xcaF\xaa\xdbw\xc8\x96\x97\xb28\xf2r\x1d\x1e\xd8_e\xdb\xc2c\xa1\xb1\x96\xf6\xd4\xce;\x17U[\x80\xa4\x81A\x20v\xd7;\xeex\xef\xe2\xcb\xe3\xd9\xbe\xfb\xea\x8d\xcfK\xdbc\xecU\x9d\x97\xaf\x7f\xe2\xe3\x8b/\xdf\xaaa\xf9\xccMd\x9fI\xbd=\xe6\xb1zv\x1c\x8e\x1c\x87\x03\xe3\xdf\x10\"n}\xfe\xe2\xc5Gof\x92\xc9\x92\x16\xd2]yO\xb8\xfe$\x95\xa8_\x90\xaaR\xf42\xd1\xe03\x11\x0ew\xfc\x83\x9e\xe1\x95=\x8cq\xcf{\xb5\x01y\xb9\xf9\xc1\x8bo\x8cg\xdaB\xb2\xe8\xf2\xa4\x95C\x9e\x8bX\xde\xb9\xa8\xda\x02$\x0d\x0c\x02\xb1\xbb~\xfc\x8b\xb1c~\xf4\x14\xdbw\xbb\x9e\xf9\xd1\x98\x1f\x88\x17\xb1\x14\xf7^\xbc\xfa\xd3\xeb\xc6\xfc\xf4e-\xcbG\xc7}G\xbc,\xf4\x03\xf9\"\x96d\xf5\xe8M\xdf\x1d\xf7\xe0\x18a\xdeM\"\x9e\xff\xc9\x98\xb1?\xff+\x93L)ir\x97\xc8\xcf\x9eR\x94\xa8_\x90\xb2R\xc2\xcd\x1c\x83\xcfD8\xdc\xfb\xbf\xeb\xb9\xcd\x8b=\x8cg\xc6\x91\xd5\xaf\xa28\xf2\xf2\xc6\xcdcn\xfa-\xdb\x16Rq]\xea\xeb\xd2\xf2\xad&^\xb9\xa8\xda\x02$\x0d\x0c\x82\xb0.\x7f\x18\xcc\x0d\xa1Z\xe0\xd9,\x9dw\x7f9\xc6\xc8r(\xf8\x7f\xcb\xa5\x0e\x81:\\\x81\x9b\xa4\xbb\xc7n\"o\xfe\xd7\x0e$\x0d\x0c\x02\xff$\x1d\x08~\xf1\xe7\x8b\xaf\xff\xf0Aa\x81\xfa\xfa\xcdF\xd6\x16\xe2\x89\x9b\xc4{\xbcox\xcc\xc0R\x05H\x1a\x18\x04\xa1\x93\xf4\x13\xff9f\xfc\x83B0l\xfc\xab\xbem\x01\x02H\x1a\x18\x04\xa1\x9340P@\xd2\xc0\x20\x00I\x0f_@\xd2\xc0\x20\x08\x03\x86/F'o\x10\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x8cfI\xa7pQ\xf3\x9b\x8d\x8c\x00`d1\x9a%\xed\xaa.\x9a\x1a\x05\xeee\x00ka\xa2\xa4E\x07:\x08u\x1e\xde]\xb0\xfb\xb0)\xda\xaa\xe6,\xef\xe3\x03\x18e\x98&i\xc9\x81\x0ej/\xde\xdd\xecj\xde]l\xc6\x93Mj\xb9\xa3F&\x000\xa20M\xd2\xb2\x03\x9d\x9a\x12\xf2\x20\x84\x9e\x92\x1a\xa3$A\x00$\x0dX\x0d\xb3$\xcd8\xd0\xa9\x14\x9e\x12Zf\xc6\xd3\xf9A\xd2\x80\xd50K\xd2\x8c\x03\x9d\xf6\xe2\xeavw{\x8d)\x13\xef\x06\xae\xda\xc8\x04\x00F\x14fI\x9au\xa0\x83\x97\xd5N\xe7>S\x9e(\xe8\x8e\x9aq\xd8\xd5gd\x05\x00#\x07\xb3$\xcd8\xd0qW\x964\xbb\x9aK*Mq]\xb9O~\xf0\x1f\x00X\x01\xb3$\xcd8\xd0\xa9\xa1\x8e\xb1\xdc%f8\x98\xee\x8c\x9a\xbc\xb5\xdab~\x01\x80\xd1\x8dY\x92f\x1c\xe8\x14\x08\x97\x86\x1b\x0a|\xd9\x07\x89Z\xce\x8cM9\x00\x08\x1efI\x9aq\xa0#J\xfa\xa49\x92\x86\x1do\xc0Z\x98%i\xc6\x81N\xb58\xf16c\xef\x19$\x0dX\x0d\xb3$\xcd8\xd0q\xbfX\xd2\xe4j*y\xd1\x8c-\xef\xa3\x20i\xc0b\x98&i\xc6\x81\x8e\xbbvw\xd1\xee\xda\xd0+\xda\xed:\x99b\xb3\x96\xafz\x000O\xd2\xe63\x87\xe3\xa2\xcb\x8c\x8c\x00`d1\x9a%\xed:\x09C4`9F\xb3\xa4\x01\xc0\x82\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x98(i\xc9\x81N_CY\xc1\xee\xe1\xe3o\xee\\Nrr\xf6\xa9\xa5\x8dFv\x02\xf5\xa9\xc7\xf5\xbf,\xe5\x1d\xe4\xdb\xfa$\xbeT\xdb`\x1b\xcf\x1f\xd4\xfe\x06}\xee\xe0\xef\xd3\xf9*\xb0\x8c\x88J\x02~c\x9a\xa4e\x07:\xa8\xbc\xe8d\xeb\x89\x82\x13F)B\xc4Y\xc7\x9a#\x07\xd7\xeb\xf7b\x15\xc7\x93\x8e\xe8\x7f\xd9\x91\x9b\xf4\x08~{$1\xb7C\xf9\xc5\xa9\xb3\xc2\xfb\x17\x8d\x0e\x1d\x1d\xa1\xfew6;t\xbe\x0a,#\xa2\x92\x80\xdf\x98&i\xd9\x81NC\x01y(\x7fK\x81)~\xee\xbc\xc9\xc9\xee\xc7]u\xb3\xbf\x92F\xfd\xbe\xbe,\xccI\xea@\x1d\x899\x85\xaa\xf8\xac\xf5\x9e\x90\xaeZ\xf0\xf0\x19\"\xb5\x8c\x88J\x02\xfeb\x96\xa4\x19\x07:\xe5\xfbhL\xf10\x19\xa6\xd3i\xcf>\xc7\xfb\x18|\"\x05\xd7\xcf\x00\x00\x0d\xafIDAT\xfd\xa70\xf7\x91\x83\xa8*'W\xad\x96\xa5\xc3I-#\xa2\x92\x80\xbf\x98%i\xc6\x81\xcen\xc1\xbf]Y\xb9\xaeqp\xf8\xd0\xc1\xf3;/\xe4\xa5'\xe6|\xcbF\xe7\xa6\x9e\xc3\xaf\xfd\xf5\xdd\xe4\xb5*+)3\xbf[a{\x90\xe7\xf1\xa2\xb3\x94'S\xf3\x8e$^\x9e\xa1_X?\xcf\x91\x9a\xf3\x05\x9b\x0c\xab\xa5b=\xca\xa9\xa0j\x91b\x8f\xf3\x02Y$\x95\xa30?3\x89\xa6B\xfd\x15YIK+\xe8\xa8\xffEnZ\xf2z\xd5\x9c\xd65\x91\x13\x98\xa8zr\x83\\\xb0\x84\xe2\xd8\xe4\xea\xa0\xee\xc2\xfb\x92\xb2\xdfI\xabW\xa4\x0fd%\x01\xd31K\xd2\x8c\x03\x9d\xc3\xc5\xf4\x09\xa1E\xbb\x8d\xd2\x04\x98\xde\x83\x07\xd33\xefI\xcb\xcf\xbd\xebs6\xfa\xf3t>\xa7\xf4\xdd^\x1a\xde\xc2\xe7\xd7W\xa4.\xedgm\xbb\x1b\x93_\xf8\x0a}\xf5Br#\xee\xf8g\x1b\x1b\x13\xc5\x11\xecTR\xd6+\xf5\xa5\xfc^6\x19V\xcb\x17I\xdf$^\xa6j\x91b\xbb\x1b\x1b3\xb3\x1b\x1b\x1b?%\xc9\x1c|\xe6\xc1\xe3\xf3\xe8x\x98\xe7\xd8Y\xbf\xd3\x91\x87C\x17\x923\xab\x8e\xe7\xf0J\xb5\xb8\x8b\xb6\x0a\x14)\x1f\xd3\xc6\x14,\xa186\xb9:\x1d\xe9\xc9{\xeb\xb7\xf1|\x85\"\x83@V\x120\x1d\xb3$\xcd8\xd0\xe9,*os\xbb\xca\x9c%Fi\x02\xcfR\xfe\x91n\xd4\xdf\xad\x8c\xec(\xfd\x8d\x83O&c\xefq\xbe\x0a\xbf\x9e\x15\xc6a\xd9vK.~\xc9\xdd\"\x9a\x8b\x92\xeeM\xcf\xe9%R\xeaP$+\xccEK7g!\xa2\x16ef\xf2\x9c6\xf5\x1b\x9cc*\x0e\xd5\xf3\xf5\x9e\xd7\xecL\\N\xffR\x95Z\xdaZ\x05\xda\x14\xb1L\xc1\x0a\xa4\xfa2\x05\xe7%\x93\x916\xdfK\xd2\x01\xac$`6fI\x9aq\xa0\x83\xda\xcb\x9dN\xe7\xd1r\x13\x9e\xec\xb7\xd4\xa1\x18\xa0%zO\xe5\x90N\x9b\x9b\xde\xfb-&m\x8b\xd2\xf6Tb7\xeaN:%~\x12%]\xcf\x7f\xe4I\xcd$\xc3jy\x85\x7f\x89\xaaE\x99\x99\xac\x16\xf2\x99.H\xb7\x08\x97\x83\xee\xdb\x8c:\x04\xcd\xedT\xaa\xa5\x95\xf3\xa0\xf0\xf8\xc3\x14\xac@\xaa\xaf\\p\x7f\x12\xad\xeb9oI\x07\xac\x92\x80\xe9\x98%i\xc6\x81\x0e\xc6\xdd\xde\x87\x8aM\xf0\x89\xb54\xcb;\xee\xac\xb0d|x\x0d\x19\xe8\x04\xd6(m\xbfM>\x82\x8e\xcc\xf3\xect\x8b\x92\xde\xcb\xf7z\xbeg\x92a\xb5t\x14~E\xd5\xa2\xccL\xb9\xf3D\xd5\xf20\xfd\x06\xe5d\xe1Q\x92^\x14W\xef<\xd5\x94\x0b\xd4(b\x99\x82\x15H\xf5\x95\x0b\xfeB\xd8\xf3\xeb\xf6\x96t\xe0*\x09\x98\x8dY\x92f\x1c\xe8\x20\xbaQ\xd6\xe24\xe1q\x9dr\xa7\x95I\xcd\xa7o\x85\x99d\xcc:K\xe9P\xd9\xe6\xafA\xeb\xf3=\x1fDI\x9f\xe2?\xf4\xc40\xc9\x0as\x85\x98B\xad\xcc\xaa\xc80*\xabeK:\xf9\x95\xe8O\xcfC\xdf\x08\x9a\xcb\xf3K-L\xc1\x0a\xa4\xfa\xca\x05\x8b\xa3\xf4G\xde\x92\xa6vA\xac$\x10:\xcc\x924\xe3@\xa7\xd9\x89\x17\x87W\x8b\xcd\xf0\x9f\xc3J\xbau\x830\x9f\x9d\x97F\xfas?\xf9\xaa^XS\x16\xbe\xa4\xb2}7\xf1r\xe2\xbb\x9e\x0f\xa2\xa4\xbbS\xb3\xc9h\x99\x9f\xafH\xc6\xa8E\x91Yv6B_\xd1\x08Y-\x82\xc1A2\xe3\xcfJ\xc7u\xf84\xd1/\xb50\x05#\xf9(\x98\xfa2\x05\xaf\x9f\x87\xf3\xed\xcf\x13%\xed\xb1\x0dA%\x81\xd0a\x96\xa4\x19\x07:-\xceZWCqy\xc8\xbdm|\xfb.\xdd\xd3\xf5\xac\x90\xe7\x88~\xa6\xe7\xf1\xa9\xa5\xf5G\x1eI\"[\xbd\x85w\xe5\x1e\xf9\xcb\x16\xdc\x8b\x95\xb6\xfdi9it\xde\xdd\xfbNcc\xe2\xe6F\xb2\xf7\x8dW\xd8\xf7U\xd4\x0b;OR\xb2or\xb3/\xe3\xcf\x97\xb3s\xbfab\x11\x91\xc7^\\\xc4et\xb9\xd1\xb1\xf9\x9d\xfe\xf77;\x1a\xb1]._x\xbc\x90'\xfa:\x97\x94V\xba3\x99wT\x9dC\xc60\x05KG\xa1\xa8\xaf\\\xf0\xe5\xd4\xf4\x8a#k\x12\x95\xb6!\xa9$\x102L\x934\xe3@\xe7dIQ\xf9I#\xf3\xc0\xf3\xa1\xb0l\xcc\x11?\x16E9\xe9\xfbo*\x0a\xefKJ]C/\xde\xa0\xfa\xecy\xc9\xd9\xf5^\xb6{\x1d\xc2%\xa3\xf7\xc5\xa5'\x95\xc8\xa7\xeb\xd3\xee\xc9:\xa2HV\xca\xf3dci3Oo\x9f\xf6\xc4bz\xf3\x93\x13\xb3\xcf\xd2\xdb\xa7y\xc7G\xe4\xea\xf66r\xc9w\xa9\xe7\x92\xef\x855\xc9\xe9\x85U\x0e\x12k\x0cS\xb0\xe7(\x94\xf5\x95\x0b\xee\xd8\x92\x9e\xf8\xc8YQ\xd2\xa2mh*\x09\x84\x0a\xf3$\x0d\x98\x85z{\x0c\xb0\x14\x20\xe9\xd1\x07H\xda\xd2\x80\xa4G\x1f\x20iK\x03\x92\x1eu\\\xa8\xe7\xf3\xdf\xf5\xf9\xf7c\xc0H\x06$=\xea\xc8&\xbb]\x17\x8c\xac\x80\x91\x0aH\x1a\x00,\x05H\x1a\x00,\x05H\x1a\x00,\x05H\x1a\x00,\x05H\x1a\x00,\x05H\x1a\x00,\x05H\x1a\x00,\x05H\x1a\x00,\x05H\x1a\x00,\x85I\x92\xee)v\x0a\x14\x93O\xae\xb2\xa2}&<\xd3\x04\x00,\x88I\x92v;O\xba0'\xe8\xb3M\\\x055-5\x05\xa0i\x00\x08\x00&I\x1a5\xd1gw\xd3G\x08\xf6\xd1\xd7\xc3\xc5}\x06I\x00\x000\xc6,IS\xca\xc9s\x8aPs\x01\x95w\xc1\xf0\xf1]\x09\x00#\x173%M\x9f#\x88P\xa5\xe0\x13\xab\xdc\x8c\xe7\x09\x02\x80\xd50S\xd2%\x95\xf4m\xb7\xf0\x00\xef\xc3&<\x9a\x1f\x00,\x87\x89\x92n\x15\x9f\xdc]\\K\xdfj\x8b}\x19\x03\x00\xe0\x17&J\xbaRt\x82%z\xae\xac\x0e\xb5\x9b;\x00\xb0\"&J\xbaHt(])x\xa1-\x83\xb54\x00\x0c\x1d\xf3$\xdd\xee\x14\xfdB4;\x89\xc7\xbb\xabN\xd8\xf1\x06\x80\xa1c\x9e\xa4[\x9d\xedB\xa0\x8f\xfa\xce\xa9\x86\xeb\xd2\x00\x10\x00\xcc\x93t\xb3\xd3\xe32\xc7UP\xddZ\x0dw\x8f\x01@\x200O\xd2\xad\xf2v\x98k_A\x19(\x1a\x00\x02\x81y\x92\x06\x00\x20\x08\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\xd1\xda\xb5ZA\x00\x18\x99\x98$i\xa5\x03\x1d\x84\xaa\xcd{\xa4\xc9\xdf\xecOk\x04=\x1c\xb0c\x12p\xe0\x83_\xc7\xc7.:\xb6\xe0m\x1c\xdc>\xf7\xceiw\xce\xdd\x81P\x9d\xdd\xbe\x08\xa1\xfd\xd8\xe2\x98:]\x908\x16\xff')|~\x9a\xfd^\x1f\xa6\xbeYk\xb7\xef7\xb2\x19\x10\x81k\xa8\xd5\xd8,\xe6\xbc\x91\x15\xa0\x87I\x92V8\xd0A\xa8\xcdYk\x90\x20x\xac\x8a\xb9\xa4\x11\xf4\xe0~\xbb.v\xc5\x07\x08\x9d\x99\xf6\xd0\x81\xfd+\xa8\x0e\x8e\xd9\x7f\xbd\xe7\xd0k\x0f\xd9\xeb\x90\xfb\x98=\x06\xbf\xee\xb7\x1fs\xa3\x00s\xec\x8cf\xf4\xa1\x18F\x88\xa7W\xc7h\x1a\xf9\xc3\xa5\xbai;\x8cl\x06D\xe0\x1a\xea\xb3\xba\xba=\xf6\xb7\x8d\xac\x00=L\x924\xeb@\x07!W\x89y\x92>o\xdf\xa8\x11d\x89'C\xf7\xe2\xc5$\xb8\x9a\xf4\xd4\x8d\xb1\xb4\xee\xb1\xd8\xd8m_\xb5\x9a\xa4\xf3\xa3\xa3\x0e\x90\x05+\x8c,0;\x06/i\x84b\x02+i\x14\xc8\x86:\x0d\x92\x1e$\xacY\xe5:\xc8h\xe6p\x08\xd7\xe0\xf7h\x87]s%>\xd0\x86\"k\xeb\x1dbfri\x04Q\xd2z\x0d\x85\xd0k\xf1{\x10\xa0\x8d\x99\x92\x16\x1d\xe8\x10L\x93\xf4\xdai\x9fi\x04\x15\xd0\x9e\xfaY\x82\xfd\x81\x1d\xa7\xe9\xa4b\xc1\xefh\xf4\xef\x16\xd0\x9e\xba\xeb\xd7\xea\x9e\xea\xde\xbf?anl\xc2\xc6U\xf6\xcf\xc8\x0ct\xe3\xa1]\xf1\x0b\xb0\xb8\xbfN\x88\xdfuh\xad\xdd\xbeG\\\xc7\x8a+a\xd9\xe0\x8c}\xd5\xfec{\xe2\xed}d]:wQ]]\x9dz\x8f\xe8L]\x9d8\xb6\x9e\x8f\x9d\xfb\xda\x9f\x16\xdb\xd5\x92~3v\xc1s\xc7v\xd8w\x11\xed\xad}s\xffC\xf6\xd3\x08\xfdm\xff4{\xfc\x8e]\xb1\xeaa?\xc6\xbe`\xff\xfe\x051D\x80r\x1d\x184sp\xbf\x9d\xb0\xf6\x12\xba\xb4=\xb6Nc\xbc\x1dpC\xd5\xc5n\xf7d&\x97F\x10%\xad\xd3P\x98\x15\xf6\x07\x10\xa0\x8d\x89\x92\xf68\xd0!\x98%\xe9\xcf\xa6\xad\xd5\x08*\xa1=\x15}\xfd\xdc\xc2i\xf6X26\xdd\xbb\x8aF\xaf\xba\x97\xf6\xd4K1\x97\xbc\xe7\x93\x0b\xec\x8b;\xf18Gt\xf1GDz(N\xb7*\x96L\xeb7\xda\xc9\xf0B\x85I\xa7\xcd\x8c\xc1\x9ex\xd2]\xf7\xc4\x0a9\xe8L\xbcEI/\x9a\x8b\x8b\xec[\xa0\x92\xb4;\xe1\x01\x1c\xdd\xb3\xffk\xf2\xbbB\xea$\xe4\x12\x13\x8b\x7f[V\xc5\xabs\xba\x17[\xb8\xe7.T\xd4\x81\xcdL;\x87\x1dd\xea@\x16\xc6\xde\x0c\xbc\xa1V\x93\xdc\x7fG\xda\x9d-\x8d\x99xk6\x14\xe6\xfcs\xb0%\xae\x87\x89\x92\xf68\xd0!\x98%\xe9\xc7\xa7\x9d\xd7\x08*\x89\xf7\\\xd9r\x1f{\xc0~H\x1a|V\x08\x83\x0f\xfa\xf5.\x0dI\xc7\x88\x03\xfe\x8a\x84\x9e>L\x02\x96@\x0c]d\xfeM%i\xc6\xe0\xb3\xf8\x84\xc7\xf7\x9cA=B\x0e>%\xfd5\xcd\x05mWI\xfa\x90]\xde'\xff\xe7\x9e\x07\x12b\x85\xa9{\x0c\x11\xa0\xd7\xba;\xe6\xf7\xe4u\x8f\xfdk\xb6\x0e,\xda9|f\xff\x00\xb9c5\xafE\x0d\xbc\xa1\xde\x8cq#wL\x1d\x092\xa5iJZ\xa7\x92\x80\x17&J\xda\xe3@\x87`\x92\xa4/\xc5\xac\xd5\x08\xaa\xa0=\xf5\xb4\xb0s\xb6\xe8!\xe1?\xe6!a\x89\x88\xf6/\xd0\x90\xb4g\x15\xbc@\\\x15\xaf\xc0R8@\"\xdc*I\xcb\x06X\xa8{V\xdck\x8f\x7fNH\xe8S\xd2g\xecT\x06j\x99\xee\x92+r:>\xe1\xe9\x03u\x8b\x17Hi\xbc%Ms\xaa\xc3\xbf\x02l\x1dd\xf4rx\xe0it,\xb6\x07i0\xf0\x86\xea\x8b?\x80\x0e\xd0\xc9\x09[\x9a\xa6\xa4\xb5+\x09xc\x9e\xa4%\x07:\x04\x93$\xbd\xd1~^#(\xd1G\xa3hO\x8d\x7f\x9c\xc6l\x9f\x8b\x90\xd8\xef\x16,\x16z\xaa;\xe6\x98\xb7\xa4=\x1doU\xc2\x19\xca?Q\x9f\x20\xa1\x0fdI\xd31V6@gH9_\xef\x8f\xd9#\xe5\xf0\x9a\xf7\xe2^\xc8\xe5\x9f\xc2(\xad\xde\x1e;&\x8f\xd2\xf7.$uZ\xe1K\xd2\x1b\xc9\xebk\xf6N\xb6\x0e\x0cz9\xfc)\xbeg\xb5z\xa8\x1ctCm\\\x81Vl$\x01\xb64\xb5\xa4\xd5\x0d\x05\xf8\xc47nD(\x81\xd4\xa0o\x81/I'\x90u\xf7\xbd\x8b\x14u`\xd0\xcb\xa1'\xfeOw\xaa\xe7\xdd\x83n\xa8\xd31\x97b\xe8\x96\x18[\x1a+i\xad\x86\xc2\x9c\xdf\x01ki=\xcc\x93\xb4\xec@\xc7\xedr\x15U\xbb\xda|Z\x07\x85\xa7\xe5\x91\xf9i\x8dA\x9a\xdc\xfe\xb4\xff\x8f\x0b\xe3\xc9X\x19o\x8f\xdf~\xec\xc0br\xa3\xe21\xfb\x03\x07\xea\x0e,\xc6\x13i7\xeegnT\x17\xa3\xec\xa9}\xa7\xe9~\xf5y1\xdf\xdf\xed?@o\xbc\xb8\x14\x9f\xb0\xe7\xc0\x8a\x18*\xe9E\xf1\xcf=\xb7\xd0>\xed\x8f\x1f\xb0\x06;\xec\xb1\xdb\x0f\xe1\xe0\x9b$\xdd\x8e\x98]\xb84\xe5(\xdd\xf3v]]\xcc\xea\xba\xbaN<\xd8\xc7$\xec\xd8~\xa7\x90\x03\xc3\xb1\x98{\xf7\x1c\xdah\x7f\x8dd\xb6b\xcfs\x0b\xf04\xfe\xf4\xa5\xbai\xabO\xa33\xab\xa7\xd5)\xaf\xba\xc7\xd8\x1f8}lQ,\xa9\xa6\\\x07\x06\xdd\x1c\x9eN\x88U\xbb/\x1b\\C\x11\xe2\x17\x0b\xdbvri\xc2\xddc\xbb\xea\xeaHn\x9a\x0d\x85y\x88\xdc`\x0ahb\x9e\xa4e\x07:'\x84\xdb\xbd\xaf\xfa\xb2\x0e\x06\x97bVi\x04Y\x0e,\x88\x89}\x88\xaaf\xe1k\xdb\xef\x8d\x89\x17.\xe3n\x9f\x1bk\x8f%\xb7.\xbfI/\xa9\xf6-\x8cWt\xf13\xc2\xa2OXH\xa2c\x8b\xe3c\x17\x1d\"\xa1\x7f\xaeN\x88Y|\x86J\xfa\xfc\xa2\x98\xd8\xc5\xbf\xb7\xdb\xd7\xb2\x06\xfb\x17\xedH\x98\x16\xbf\x88*\x1a\xb97\xde\x19\xb3\xe84R\x20f,\xe4\xf0\xd0\x9d\x09O\xffq\x1a\xcd\x81\xe1\xfc\x8a\x84\xd8\x85d\xd1\xde\xb7knL\xfc\x8a\xd7\xe6N[\xb4\x16\xa7\x98\xf6\x01\xb9\xa4\xad\xb4\xbdw\xc7\x8a\xd8\xf8U\x82\xcc\xe5J\xca\xe8\xe6p^](\x1adC\x11v\xc5\xec\xa2\xefri\xf4\x1eo\xcf\xaaY\xb3\xa1h2\xf5\x06>\xe0\xc1QSPVXU,`\xae7]\xadZ\\Z8^\xae8a\xaa:b\xab;b\xac^`]%\xf6p\xc8\xe7Vu\x82\xb0\xaa\x9f\x16\x13\x85eV\xab!\xfdE\xc2\xaana\xbf\xc7\x8c\x15\x7f\\\xbf+~_\x89\x10\xab\xea\xb4\x91#G\xfe\xd1\xact\x06IR\xd5\xd6AR\xb7\x97\xad\x0a\x05aU\xe7\xf3U|\x13\xca\xa7\xe4\xf1\x05-\xc1\xe9\x03b;\x09\xab\xfa2\xfb=\x16\xc7\xef'QbU\x8dK\xd2\xaa\xbe\x1c\x1a\x19'Y\x15\x0a\xc2\xaa\x0ef?\xff\xd7\x9f\xd8\xc2\xe7\x0b\xf9\xcas-VC\xfa\x8b\x84U\xfd\x0d\xfb5\x8e\x8d\xdfO\xa2\xf4\xa5\xaa\x13\xf9.\xf2\xc1\x7f\x8fU%'\xa4\xea\x01\xee\xe7\x9fdSIz\xfe\x1c\x91>!AU\xcbC\x03\x16\x19\xd9\xd6\x96\xcd~\xc8#\xf3!l\x89\xbfw\x17\xb0w\xd0\xb6\xd6ec\x06\xf9\x8a\x17|\x1aZ\xe3\xf3U~vT]\xf4\xc4\x9b\xc6\xed\xf50W\xdd3\x7fL\x8e\xa6\x0d\x9e\xb0H\x8837\xbc\xc5M\xfc\xd1\x81g\x8b\xb3\xbc\x85\xe5\xe19\xad\xd9\x06\xdbv\xf1\xd9\xf4G|\x90\\\x10n2\xab\xdbU5\xd4\x9b3\xe5U\x83\xaa\xaf\xc8\xa7^\xad\xaa\xaa\x9a/\x17\x8d\x1b\xfc\\8\xbcl\xa8\x967\x83\xff\x97(\x93\xad{\xf8\x06w\xc5V#}B\xdaT\xdd5R\x16\x14\xca\xc9\xecG#\xc3k<\xf5\xa5\xba\xbd\xf8\xaan\xca\x0a\xaf\x91\xc7\xe7\x8b\x06U\xd7\x87\x9f\xf3K\xe1L6\xd8\xd6\xb6\x80=\x18#\xd6+<\x1dj2\xa9{\xd9+\x1fV\x86T=\xcd\xa7\xa8\xde\xaa\xa8\xb3bQ\x1b\x14\xaa\xf2\xfe\xc9\xa3|\xce\xee\x95{\xb1\x88-N4\xa9F\xfa\x84t\xa9\xaa\x0d\x0dW\x88\xb3Y{\x06\x13\x9dy\xea\xf6\xe2\xaa\xbaK($O3\xe4\xb7\x1aU\xdd\x94\xa1w6AX\x18\xbbA\xe6\\!\xe1\xee\xbd\xcf\x9b^\x0d\xf5\x1d[\xb7E\xef*\x93\xc8\xb9\xeas\xf2a^\xc5\xca\xc8\x11c\xf4\x06\xb9\xaa\x83D\xdb\x8a\xd3\xbc?yN\x8b\xff\x0d\xd4\x9bT#}B\x82\xaa~\xb8\x85\x9fV-\xde\xb2\xe5\x9d8\xaa\x12R\xb0\xe2\x9dz\xbe\x90\xc9G\x16n\xa4\xb7zS\xfd\x04\xf6\xd3\xf3\xa1\xb2\xbd\xb8\xaaV\xb3\x1fU\xbbN\xb7n\xe2\x9d.c[\xdc4\x9e-<\xb1i\xd3\x81\xb6Os\xd9\xd2\x98\x86?\xfe\x8a\x1f\xe1\xd7\xb6\x99nP\x9e\xa2\xc8<\x20\x05\xfaq\xa8\xef\x98:!\x9a6\xff\x9d-O\x08\xb3xg\xadcI\x98\xe2\xa5\xb2\xab\x98\x0d~.\x9e\xce\x1c3\xccs@\x8c\xa5\x13x\x15\xff\xa3\x18\xd4jR\x8d\xf4\x09\x09\xaa\xaa\x1eV\x99\xab\x9a\xc3\x8fe\xc49xf\xf3\x87\xfc'\x7fW\xffr\x0c1\x9e\x93\x8f\xab*\x7f?\x16\xf3\xdaM?\x9e\xbf^\x1c\x17\xe9\x87U\xcb\xb8E\xfcd\xe9\x1f\xd9\xf05\xbc\xcdl\x83\x8c\x0a\"\x8f\xfd\xb9J\xda\x01\xd9wL\x1d\xf7\x99\xac\xe7OU\x91\xb0X\x9f\xf25C\x14l1\xdd\xa0P\xd5\xc7\xd6\xdf\xce\xe6\xa5\x99\xa1\x037>\xeeW\x99\xee\x1e\xd2\x17\xa4M\xd5gE\x0b\x1fX\xd8o{1\xe1\xd3F\xce\x96\xe7^1\x9c\x89\x8d\xab*\xf7\xc5W\xf1\xf2\x81\xc8\x13\xba\xaa\xfc\xc8~\x85h\xe2\xe2\xf3\x89l\xcc\x06\x99p>\xb6\xf4\x1b\xb6\xb0\x87k\xb5Dv\x11S\xf7\xac\xbec\x875\xa2\x8f\x81\xef?\x95\x13vU{\xd3l\x83B\xd5\xa7d\xb1\xf8\xa3Z\xcc\xfe\x0a\x07\x87\xfe;\xc4\xee\x1e\xd2\x17\xa4MUy\xde\xbd\x88\x88\xc9%\x9f\xdaVEoJ\x10W\xd5M!W\x86=\xb5\xa9U>\xa1\xab\xca=*\x9b\xcb\x19\x1e\xdaP\xcc\x06\xdb\xda\xfe\x0f[\xf0\x89\xf7o\xfe\x86>Bv\x11S\xf7c\xa2\x0f\xf2\xfcC\xaa\xda\xf0N\x9c~g\xd1\xa3>\xb1\xfd\xa1\xa7M6(T\x0d\x7f\xb2\xc0\xf7\xb4\xb8\xad\xedU\x12:\xb3\x15\xbb{H_\xd0+U\xf9$-\xac\xaa\xb0.3\xd9\xa0PU\x7fk\xe7\x1f\xc5\xceoe\xb5\xde?\x99\xef\x1e\xd2\x17\xa4\xa0*\x9f\xf6\x89\xdf\xff\x97\xfc$\x8d\xa9\xaa|\xc4yB4\xb4~d8\xad\xda\xf3\xe5*\x07^~B\x0cl\xc4\xcb\xe7\x00\xfa\x04\xc0\x17\xa9\x08\x11\xabj\xb5Q\x98\xd0\\\x20\xa6\x8e\xf7\x19\x9as\x8e&B\xd5\x12u\x87\xf8\xd8\xfb\xac\xc9\x06\x85\xaa\xfag`\xfc\xb3\x86\x91\xaf\xe8\xeb\xc5\xee\x1e\xd2\x17\xa4\xa0\xea\xe0\x90\x1dr$3U\x95\x1fV\x15\x88S\x8c\xbf&\xdeb\xf5c\xf5\xf8\xaa\xb6n\x97\x9fK\xf1u\xc5\xa8\xcd\xb5\x12\xc3+\x7fo\x97\xc7I[B\xba\xc4l\xf0\xcb|\x12\xc5\x0a\xd3:~\x12u\xa4h\xd8\xc3\x87\xf0Z\xe9\xb8\x16:\x9d\xb6\x8b\x1fj-3\xd9\xa0Q\xd5\xb6G\x89\xfc\x04W\x0a\x1a\xbb{H_\x90\x82\xaa|\xe8\x11\xf6\x89\x93<\xa6\xaa\x0a\x89\x7f\xc5\x1e\x7f\xce\x1b\xc2\x87\xce\x9cx\xaa\xee\xe2}D\xa6\x15\x1f\x86\xba\x17\xb3\x88\x85la0\x1f%\xdf!${\xec\x01\xb3\x0d\x8a\x832\xfd\x13'~\xf2\xf4\xe16\xb3:q\xd2\x8a[|\xba\x8c/\xd5\x86v\xb5@|\xb2\xfa\xfe\x08\"7\x1d\xb3A\xa1j\xe4\xe4D\xe8\xba\x98\xd0\x87b\xb1\xbb\x87\xf4\x05)\xa8\xca\x15\xf2,|\x7f\x8b_\xfc\xbeLUm\x9b\xc6\x9f\xf2\xd7.*\x0e\xfd\xf2u\xb8\xaa\x85\xe5:[\xf4Q\xb5X\x18s\xb8\xf5C~r>\x8fK\xc0\xaf>\xcd\x99\xff\xd4\x7f\xca)d\xf1\xab\xbb^\xe1\xdb\x11g\xdfc6\xc8\xc5\x8b\x9c\xd2\xe4\xf2\x90\xed\xa6;\xc6\x87@\xf2D\xc3o\xe4y\xff\xda\xb6\xf0\x07q\xf9c'\xc9\xb9\x07?5\x1b\xb3\xc1(U?\xcf\x15\xa5\xa1Kwcw\x0f\xe9\x0bRP\xf5U\x12\"\x93\x8fB\xe6\xaa\xaa\x1f\xac\x1a\xae\xca\x9fB\x0c\xd4\xea\xaa\xbe\xefS\x9a\xf9\xc7\x95m\xb5z\xc9\xca\xc83Y\xc2\xfb\xe8\x0d\x8a\x93\xa4\x91\x8b\xbe\xc5\x85+\x95\xa6;\xf6\xa1\xbe\x99a\xb2\xef\xb6\xc3\xfa\xd5\x0a\x9c\"!d\xf4\x06\xa3Tm\x9b\xc7\x1f\xeb\x17p\xc5\xec\x1e\xd2\x17\xa4\xa0j\xf8\xe3\xf9\xac\xfaY$\x9e\xaam\x1f\x8d\x08\xff\xf6\xaa\x0c\x1f\x8b\xc7U\xb5\xed\xcd\xbcp\xa3W\x9e\xac:,\xcf\xcbs\xd3\xeb\xc2\x82\xe5\xc9\x8b\xb0\xa37\xc8?0\"\xcaG\x0d\xfc\x9cTN\xab\xe9\x8e\xbd\x19\xba\xfezn\x1d\x09\xff\x83\x952\xa23)\xd4I\xd4\x06\xa3U\x15\xb3\x86\xc8e\xb1\xd1\xbb\x87\xf4\x05\xa9\xa8\xda\xf6\xca\xa3\xb9\xdea\xf3\xf6\xb4\xf5\xa0j\xdb\xe7+\xa7\x0c\xd6|\xc3\x9f\x0a\x9f\x8d\x0c\x11_\xd5\xb6\xd6\x15S\xf2\xbcZ\xee\x98g\xc3\xce}T>X\x1b\x92]\x92OH\x93Y\x91\xa1\xb2\x81\x90\xfc\x12\x8dTHU\xe5F\x0c\xab0;\xb35\xff\xa3\x1eR\x19\xe4\x0f\x1e\xce#\xf9l\xf3\xc5\x1d\x14q6\xbdQ\xf5\xcc?\xe8\xaa\x1e\xd4\x1b\xc3\xaa\x92Ql\x08l\xd2\xc8\x06}\x02\xd0\x9eMj\xeeP\xda\x92K\x1a\xb9E\x9e\xe1M\xcd\x1b\x8c\x85\xcd\xc4\xc7\x87\xdc@6Yi\x14\xf0\xebl\xb2\xa0\x83\x06k\x89\xf7\x92I\x91Zy\xd4C\xea\x83\xf4\xf2\x0c\"U\x95\x1b1\xac\xc2\xb68\xfc$\xa5\x07r\xc9F\xf1`\xd8>J?\xd0\xc8f\x8a8\x9b\xde\xa8\x1a\x19V#\x83jD\xd5\xbf\xf0GU\xa4JW\xb5\x86\x94\x89\x8a7\xc8(n\x119F\xa3\x0bk2\x16\x89\x8a\x1a2\xc7(\xe0\"\xe2\x0fu\xbe\xde\xa4H\xad\x9cEj\xf8\x8f\x8eaRU\xb9\x11\xc3*l\x8bG\xf9\x837H\x91x\xd0\xca\x1f\x88\xcd#\x8e\xa6W\xaa\xea\xc3jdP\xd5U-\x16\x8fV\xf1\xc3\x96\x90\xaa\x85\xe4m\xd1\xd6\xe1!\xa7\x98EE\xe2\x81\xa1\x90\xde\x93o\xc3\xcb\xc8\x93F\x01\x8bC\xab\xb6\xb7\x07M\x8a\x94\xca\xael)'k\x13\xaa\xca\x8d\x18Vi\x20\x13d\x9b\x97\x1c\xd77_\x8f\x87W\x8e\xa7W\xaa\xd2\x7f\x8f\x19TuU\xe5\x08\xba\x9e\xcc\x08\xabz\x8bM\x08\xc7\x0b4\xd2\xcc\xdc\x90\xe3\xa4\xa1\x90\x95\xee\xde\xb0\xb8b(!\xb3\x8d\xaajr\xec\x0b\x11]\xa4T\xb6\x93\xcc\xa0Xh\x96\xaa\xfacWi\x90\xe3.\xf7\x7f;{\x20+6\xea\x95\x88S\xe9\x9d\xaa_\xfcC\xf4\xa0\xaa\xab*G\xa9\xf5\xdcD\xa9\xeay%\x05\xb8\x91YT!\x0a\x0c\x85\xc1U\xec\xc8\x89d\x94L\x88R\xf5\x0e!\xed\xfa\x06b\x8b\x94\xcaC$K.|\"U\xad\x88]\xa5\x81,\x95%\xe3\xc8\x1b\xfa\xe6QU\xe7\xd3;U\xe5\xb0\xfa#\xb5%\xae\xaa\xd7\x099\x11)3U\xb5\x96dTn\xde\x7f\x8b\xd6E\xa9\x1a$\xec\xbd:Ll\x91Ry\x82d\x18F\xd5\x8a\xd8U\x1a\xc8\x02Y;\x9a\x0d\xee\xa8*\x1cz\xa9\xaa\x18V\xd5A5\xbe\xaat\x08?\xf2\xe7\xb4\x9c\xec2U\xf5A6;j\xe2TGO\x00\x86\x8b\xb3T\x94\xbe=m\x95I\x91R\xf9\xc0\x1b\x9a\xab\xaeTT5\xae\x12~\xcf\xbf\xa3\xb1\xa1\x1aU\x85C/U\xe5\xc3\xaaaP5S\xf5\x1e!\x7f\xa3\xfc(\xbbD\x8cx\xdb\xf9)'3U/\x84\x06\xcf[\x05\xfcIU\xd5\x1a9\x93\xa5e\xa4\xd6\xa4H\xad\xac\x90cfW\xb1\xa2\xaaq\x95\x06\xa2\xb5\xcb-\x97PT\x15\x10\xbdU\x95\x0d\xab\x86A\xd5LUvT\xd4x\xa7\x8b\x1e\xf7\x9297\xd9,2\x97T\x9bO\x00\xba\x06\x91\x1a&\xf3Y?\xe1k\xa9\x02\x9e\xf6\x91e\x0fh\xb0\x8ed\x9d7)R+\x0fgx\xd6\x07\xe9\xcd'\x89\xa2\xaaq\x95\x06BJ\x98\xab\xdb}\xec\xfd\x1fU\x05DoU\xa5\xffn\x1cTMU-a\x075\xcd\xe2<\xbf\xb7d8\x93\xa8#\xce\\\xb5\x9e\x90\xa1\xfe\xb1\x9e\x9cE\xe4\xe1\xe8O\xab4\x92S\x92K\xb4&\xb3\"Ce=\xff\xb4\xcaG\xc6q\xf7\xc2\x1b1\xac\xd2@\x86y3K\x86\x11RKQUH\xf4Z\xd5/\x8c\x83\xaa\xa9\xaa\xc7'zs\xde`?O\xfc\xacH\xf3\x95\xac\xe2\xd7Y\x9b\xaaJ\x9b'\x0d\xf1\x8e^t\xe9\xa6\x96\xd1n\x14\x90\x1e\xaf,\xc8\x1cR\xc1/$\x88-2V6\xfb\x07y'47\xf0)Cx#\x86U\xd8\x16\x8f\x94e\xe7\x96\xb5\xa8\x9bGU\x9dO\xafUu(+\xc8\xbc8\xcf\xe0\xc5T@\x19h\xaa\x96\x95\x04\xc4\xcf\x89d]\x9c\x0aT\x15(\x03M\xd5\xf9\xe2\x98\xa9c1\xc9\xbd\x1c\xa7\x02U\x05\xca@S\xf5B\x11\xc9\x1cU\xec#Y\xcd\xf1*PU\xa0\x0c4U\xe9\xcd\x95%\xb9\xbe\x115'\xe3\x16\xa0\xaa@\x19p\xaa\"\x03\x15T\x15\x01\x02\xaa\x8a\x00\x01UE\x80\x80\xaa\"@@U\x11\x20\xa0\xaa\x08\x10PU\x04\x08\xa8*\x02\x04T\x15\x01\x02\xaa\x8a\x00\x01UE\x80\x80\xaa\"@@U\x11\x20\xa0\xaa\x08\x10PU\x04\x08\xa8*\x02\x04T\x15\x01\x02\xaa\x8a\x00\x01UE\x80\x80\xaa\"@@U\x11\x20\xd8\xa4\xea\xc5o/^\xb9ml\xba}\xe5\xe2\xb5k\xdd\xe6\xe5\x08\x12\x83M\xaaF\xf8x\xed\x15\x8a\x82\"\xc9c\xaf\xaa\xf7)]\xfd\xd8_\xf9\x0f\x04I\x12{U\xa5\xfc}\x1f\xc7T$\x15\xecT\xf5\xfe\xfd\xce\xfb\xf7\x0fn\xbb\xc6~t\xa3\xafH\x92\xd8\xa9\xaa`u\xe99\xab\x12\x041\xc1vU\xbb\xafXU\x20\x88\x19v\xa9\xca\xde\xf0\xbf\xd8\xf6\xdb\xb5k\xd6\xbc\xbe\x8d}[\xfb\xd6{\xdfY\xad\x81\x20\x06\xecR\x95\x1d\xf4\xaf}\xbct\xfa\xe4\xc9\x93\x1fa\xff\x9f\xfe8\x9b\x06\xe0y\x00$\x19lT\xf5\x85\xc9\x1f\x7f\xf6\xe7\xcf\xfe\xcc\xf8\xec\xb3_N>\x83\xaa\"Ia\xa3\xaa/\x96\xde\xd5\x1f\xae)=C;)\xda\x8a$\x8e\x9d\xaaN\xffB\x7f\xf4\xc2\xf43=U#H\x0cv\xaa:UW\x95.GU\x91$\xb1Q\xd5\xe5\x8f\xdd\xd8\xf6\xa3\x1f\xfd\x1b\xfb_\xe9\xfd\xdfN\xbf\xb8wm\xe7\xc15\xca\xf5\x00G<\x84\x90\xb9\xfa\x0a;\xf2\x9aL;\xb2\xa0\xde\xfbk\xb3\xe6v\x8d\x14\xf3\x9fGg\xe4\xe7Lk)\xd9mV\x838\x1b\x1bU}~&\xfd\xe5\xf7\xfe\xee\xfb\x7f\xf7\xfd\xef\xfd\xf7\xcemSo\xbf\xfe\xd8\xed?\x94*\x07W]\x9f\x8c-\x09\x9c\xd7W\xf8\x20\xfb\xed\xd8^Z\x0e\xc5\xb6\x19)\xd1J\xcc\x9a\x83\xfb\xaa4\xf6\xe3\x90V\xde\xf4F\x05\x09Gh#\x90\xb0Q\xd5\x17J\xbf=\xb7m\xdb{\xec\x7f\x1f\xd3\x97\xa6\x9e\xbb\xf2Y\xf7\x95/:\xd5\x1a\xbf!<2Hc\x99\xf0\xa4I\xa3\xca\x1dO\xa5\xe7\x96\xe93u\\\xd52?\xeb5X\x85\xaaB\xc4FU\x95\xb9j\xb7\xe9\\\xd5o\x99s:~\xb6EA\x0b9DZL\x9f\x11\xaa\x0e\xe7\xf9\xaf\xf4(Iin\x81\xf4/v\xaaZzN\xceL\xd9\xb7\xff\x98z\x86\xde\x8d>Y\x15Q\xf5\xba\x8f\x10\xcfV\xb9\xbc\xb3\xacH\xcb\x9f1,H\x9b\x88d\x1co\x0d\xbe\xf6hv\xf1\xc2\x0eJ\x9f!\xda\xc6\x05\xc5YegEq\xddPZ\xc8\x13\xa9\x0d\xad\xdfT\x16\xe6\xce\x12\x13\x80'\x0b\x8e\xf1u\xb7\xdfR{8\x92I\xc8\xd2S\x95\xc3}e]\x8d\xac\xfb:ZG\xc4\x14A/@\x1c\x81\xad\xaa\xde\xd0\x1f\xae)5\xf9\x08@\x19U\x0f\x05\x02\xde:\xb1t\x20\xa3\xf2\xed\x1d\x1b\xf3I\x17\xbd\xb3;0zZ\x20\x108\xc1\x9b\xe7yj\xb67\xe4\x8d\x0f\xd2\xbfl\xcd$yu\xbf\xce\x91\x19\xd5\xfeYt6\xefEm=\x95S\xbc\xb9\xa9\x8cpU\xdb\x8b[\x94FZ\xa7\x8cb#c\xb0\x84\xabJ\xaf\xae\x98\xa0\x91\xdc\xc6\xa8\x1e\xe8x\xe2\xbfI\x837\xd9\xd2<>\x1b\xae\xfcYt\x01\xd2\xff\xd8\xa8\xea[?}\xact\xaa\xa4\xf4\xa7?\xbf\x98\xa0\xaa\xe7\x0b\x87\xd7l<\x1c\x94#\xa1\xae\xea\x93#\x1et1\x86\xf2\x93[\xda\x1c\x1a\x9a\x8a\xd2#dw\xc7nr\x84\xaa\xad\xd7\xc9F\xfex\xa9\x16Z\xf5\xde\x8e2\xb2\xdd\xd8\x03\x1d\xaf}\x1dz\xb6\xc5\xd7A;\xb2Z\xa26\x818\x00\xbbTe\xdc8w\xe6\x8b0\xe7\xbe5\xb9\xb6\xdaTUz}\xc3\xecb\x92\xbf\xca8\xaa\x96\x84\xe6\xad\xfc\x0d^\xe3\x85R\xd5\x06\xd1\xd8@\xd5\xd6CD\xc4\xae\x8b\x82\xfd\xdf\xf0\xc5\xe0\xa4rc\x0ft\xfc\xb8\xf0V\xbb\xf2\x9bhS~0j\x13\x88\x03\xb0QUK\xa4\xaa\xb7\x96]\x15\x8fB\xaa\x1eZ\xcc\xbc\xb9\xbe\xd5\xb7\x8e?\x10\xaanf#`\xe5\x88C\x02\x9e\xa4\xae\xa8:k\xdc\xfe\xfd\xfb\xc7\xcd\xa2j\xeb\xdf\x88Xu\x0e/(\xa8\x11}.\x19e\xec\x81\x8e\x9f\x15\xde\x07ZSA+D\x95\xa1\x00\xe9\x7f\xecT\xb5\xbb\xfb~\x98n\xb3\x0bU\xa4\xaa\x87\xc9N\xf1(\xa4j\x1d\x11q\xe9\xfe\xeap\xc5%~t\xde,O\x8d.YI\x0d\xaa\x16.d\xdf\x16\x14RC\xeb\xc4\"\xe6\xfeI/_\xcc/\xe4\x7f\x06An\xa6\xda\x83z\x12l\x8f\xf7\x82w\x0f_0\x14\x20\xfd\x8f\x9d\xaa\xf6L\xd7\x9e\xb1%\xec\xf8>\xb0\x81\xbda?\xf8$\x10\xf0V\x05v\xde\xe4\xaaf\xd7~\xd04W\x9e-\xad\xd3\xea\x9b\xfc\xd9\xfc#\xad\xc5\x19O\xbf\xcdZ\xdf\xa0\x17\x02Z\xd5\xbe\xe0\xe1*-p\xa1\xa3\x99,\xb9C\xef\xfc\x8a4\xdfSZ\xe9\xb1\xac\xa2\xba\xa5\x83=\x99\xbf;N\xf3IAms\x93\xdfwR\xed\xa1k\x8f8\xb3\xd0.w#XXV(\x0f\xfa\xf5\x02\xc4\x118G\xd5\xa3\x9e\xd0\xe4\xd0w\x82\x1e\x08-o\xa0\xf4\xb5iuEZ\x81_\x9e\xd7\xbfW3\xd87m\xbfXl\xf6\x0f\xc9\x9d\xd2\xcc\xcf\xa0\x12\xa2\xb5f\xb3\xef\xcf\xec\xc8\xe0\xe7C\x9b\x08\xc9\xd8\xa1\xb4Rz\xaa|\xf0\xf0\xe7~\x97\xc9\x16'l^R\x9c\x9dWq\xd2\xd0\xc3\x11\xb9\xb1\xf2\xd0~\xd4k\xf5\xa1\xa5p\x01\xe2\x08\x9c\xa3*\x82\xf4\x08\xaa\x8a\x00\x01UE\x80\x80\xaa\"@@U\x11\x20\xa0\xaa\x08\x10PU\x04\x08\xa8*\x02\x04T\x15\x01\x02\xaa\x8a\x00\x01UE\x80\x80\xaa\"@@U\x11\x20\xf4\xb3\xaa\x18\x12\x84$J?\xab\x1a\x01C\x82\x90\x9eq\x86\xaa\x18\x12\x84X\xe2\x0cU)\x86\x04!V8AU\x0c\x09B\x12\xc0\x09\xaa\x0a0$\x08\xe9\x19\xc7\xa8\x8a!AH\xcf\xf4\xb7\xaa\x18\x12\x84$H\x7f\xab\x8a!AH\x828@U\x0c\x09B\x12\xc1\x01\xaabH\x10\x92\x08NP5\xa1\x90\xa0\xa6G/\xc5y&U\xaeN\xc2\x9bWC\xc2\x09\xaa&\x12\x12\xb4\x8a\xd4E\xdd\x93\xb7\xd7a)\xc1U\x9e\xd8\xfbQa\xce\x8bcq\x80\xaa\x16!A\x82\x06\xcfkQ+\xa6#,e{fCt\x13\xe6\xbc8\x16\x07\xa8j\x11\x12\xc4i\xd3\x16\x87\x17/\xfb\xe5]$\xd3\x12\x96\xb2L;\x1b\xd3\x869/\x0e\xc5\x01\xaaZ\x86\x04Q:\xb7@O\x8f8F\x8e\x89\x9fi\x09K\xb9S\x10{Oj\xccyq(\x0eP\xd52$\x88>\x18\xb4H.4\x8c~\xf7\x049\xb1}\xf4\xfaT\xc3R\x94\x02\xd1\xe12_L\x82\x0a\xe6\xbc8\x14'\xa8j\x15\x12D\x0f\xcb{\xa4\xf3_7y\x98\x94\x90Y\xe7S\x0dKQ\x0a\xc4\x9a\xbb\xc9\x1e\x1a\x05\xe6\xbc8\x14G\xa8j\x11\x12D\xb7\x93\x93\xe1\xc5f\x8dh\xf2\x96\xa7\xa9\x86\xa5D\x0a\x18gI\xcca\x13\xe6\xbc8\x14'\xa8j\x15\x12\xc4\xdetC\xb7\x94\xbe\xba@+$\x85\xde\xe7\xfe&\x1f\xa6\x14\x96\x12)\xa0\\\xd5F\x1a\x05\xe6\xbc8\x14\x07\xa8j\x19\x12D\xf7\x91O\xe4\xc2\xaa\xfc\x0d\xc7\xc9_\x1a\xf2W\xf6\",%R@\xf9p\x15sr\x13s^\x1cJ\x7f\xabJ\x13\x08\x09\xa2\x1dZH\x18\xfa\x80\x1e#\xc7\xe9\x83`/\xc2R\x94\x02\xaeN\xccI%\xccyq(\x0eP5\x01f\x8d\xd2\x0f+\xce\xe7\xca\x13\xf4)\x87\xa5\xa8\xa7\x9a\x82\xc5\xe1\x04\x00\xda\xbe\xb2M.`\xce\x8bCq\x82\xaaV!A\x94\x9e\xf0\xc4|P\x99ZX\x8a\xb1\x80\xd6\x13\xfd\x83\xa7\x0a2\x83\xff\xc0\x9c\x17\xc7\xe2\x04U\x13`\x997zN\x99ZX\x8a\xb1`\xa7\xef9\xbd\xbf\xcdy\x1b\xf8\x0f\xccyq,@T\x0d\xce\xd7\x1a\xadj\x92\xa6Q\x9b\xdbeU\x838\x06\x20\xaa\xd2`\xfd\xd0t\x1fY\\-X\x89'\xd6\x01\x01EU\xc4\xf5\xa0\xaa\x08\x10PU\x04\x08\xa8*\x02\x04T\x15\x01\x02\xaa\x8a\x00\x01UE\x80\x80\xaa\"@@U\x11\x20\xa0\xaa\x08\x10PU\x04\x08\x0eU\x15\x93W\x90h\x1c\xaaj\x04L^A$\xceV\x15\x93W\x10\x1dg\xabJ1y\x05\x09\xe3dU1y\x05Qp\xb2\xaa\x02L^A$\x8eW\x15\x93W\x10\x89SU\xc5\xe4\x15$\x0a\xa7\xaa\x8a\xc9+H\x14\x0eV\x15\x93W\x10\x15\x07\xab\x8a\xc9+\x88\x8a\x93UM(y\x05q\x0bNV5\x91\xe4\x15\x0c\x09r\x0d\x0eV5\x91\xe4\x15\xdbB\x82\xd2\xd0/\xd2;\x1c\xacj\x02\xc9+\xf6\x85\x04\xa5\xa5_\xa478X\xd5\x04\x92Wl\x0c\x09JK\xbfH/p\xb0\xaa\xd6\xc9+v\x86\x04\xa5\xa5_\xa4\x178YU\xcb\xe4\x15;C\x82R\xeb\x17I\x1f\x8eV\xd5*y\xc5\xce\x90\xa0\xd4\xfaE\xd2\x87\x93U\xb5L^\xb15$(\xd5~\x914\xe1`U\xad\x93Wl\x0d\x09\xa2)\xf6\x8b\xa4\x09\xa7\xaaJ\x13I^\xb13$(\xe5~\x914\xe1`U\xad\xb13$(\xe5~\x914\xe1dU\xad\x93Wl\x0c\x09J\xb9_$M8YUk\xec\x0b\x09J\xb1_$}\xc0V\xd5\xbe\x90\xa0\x14\xfbE\xd2\x07pU1$\xc8=\x00W\x15C\x82\xdc\x03tU\x11\xd7\x80\xaa\"@@U\x11\x20\xa0\xaa\x08\x10PU\x04\x08\xa8*\x02\x04T\x15\x01\x02\xaa\x8a\x00\x01UE\x80\x80\xaa\"@@U\x11\x20\xa0\xaa\x08\x10`\xaa\xda\x8d!A\xee\x03\xa6\xaa\xf7)}i&\x86\x04\xb9\x0b\x98\xaa2:\xa3\xc2\x02\x91\x81\x0eLU\xd9;\xff\xde\xd7\xaf\xe1\x04\xc0U\xc0T\x15'\x00.\x04\xa6\xaa\x14'\x00\xee\x03\xa6\xaa8\x01p!0U\xc5\x09\x80\x0b\x81\xa9*\xc5\x09\x80\xfb\x80\xa9\xaa\x9c\x00tw\xd2\xee\xfb\xfc\x0b\x87W7\x00S\xd5\xd0\x04\x00q\x130Uet\xde\xe8y(\xc5\x90\xa0\x81\x06LU\xf95\x00o\xdd\xdf\xfbR\xe7\xde\xd5\xec\xeb\xee\xc1\xb51\x15\xb6\x85\x04U\x11B\xb2N\xc5\xb6\xab\xfc\xad:\xdf7\x03o\x83\xd1K`\xaa\xca\xefi\xfd\x93\xef^\x9fy[|\xdd\xd8\xf6\x93\xe8\x02\xfbB\x82\xce\x06\x02\xeb\xc2\xb7y\x8d\x87\xbf`\xc3\x1c\xdf\xf5\x9ek\x10+`\xaa\xca\xb8\xfb\x1d\xbd\xf6\xd7\xd0\xd7\x8dsQO\xda\x18\x12D\xf9}\x83{V\xf5*i\xa0\xc1\xe8\xfb\xb5\"\xc9\x02SUq\x06\xe0J\xfc\xe7m\x0c\x09\xa2\xd6\xaa\x9e\xea\xddF\x11\x09LU\xc5\x19\x80\xaf\xba\xef\xc69YegH\x10UT\x0d\xae\x1f\x975v\x9d\x98\x94^\xae\x1c2t\xe1\xc2!\xd9\x8d\x0f\x86\xc8\x9b\xad/\x88]\x0fI\x0a\x98\xaa\xd2\x9e?\x02\xb03$\x88*\xaa\xce\xd1\x96n_\xaaU\xb1\xa5\x07\x0f\x17\xac\xab\xf5\xfa6\x97\xd5\xd3\xc3\x81\xad\xa4.\x10\xb8\x10\xbb\x1e\x92\x140U\xb5\xb8\x06\xc0\xd6\x90\xa0\x88\xaa\xcd\xa49\xfc\xbd\x91\x1c\xa1t\x1d9.\xdaq\x02\x90\x16`\xaajq\x0d\x80\xcd!AaU\xe7\x95\x88\x1f\x0f\xb3auq.[8\x19R\x14UM\x0b0U\xa5=O\x00\xec\x0c\x09\xa2\x11U'\xc9\x1b\xad\x97O\xa4\xb4>\xe32\x1f_\xe5\x11\x1d\xaa\x9a\x16`\xaaj1\x01\xb03$\x88FT\x9d;\x82{\x1e\x1c>\x87\xd2\xaf=e_\x1f\x19=I\x9e\xf6GU\xd3\x02LU\xad.\x02\xb41$\x88FT\xdd.&\xb7[\xf9\x1c\xe3\x10\xc9'\xc4\xff\x8d|\x1eUM\x0b0U\xa5\x16\x17\x01\xda\x18\x12t\x9e\x7fZU\x1f\x08\xf0\x09m\xa5g\xf1\xbb\x8b=\x95l\xe9\x90w\xc7\xf6\xc07\xa23y\x06`\x1f~\xae\xda[`\xaaj\xf9\xaf\x00\xec\x0b\x09\x9a\x13\x9a\xd7\xf2\xd3\x07\xc1\x86\x92\xac\x12q^u\xb7\xc6\xdb\xb4i\xc7\xe8\xbd\\\xf1t\xe6\x09\x8a\xf4\x0e\x98\xaaZM\x00\xfa;$\xe8Rv\xf5\xa5\xae\xae\xeb\x07*\x06\xe3'\xffi\x03\xa6\xaa\xd4\xf2_\x01\xf4oHPS\xae\xac\x0c\xe6c\xccZ\xda\x80\xa9\xaa\xe5\x04\xa0\x9f9\xe4\x91\xa7\xa9\x8ey\x0e[T\"\x09\x03SU\xcb\x09@?\x13\x9c\xeb\xabnli\xac\xf6U':\x0e#\x96\xc0T\x95ZN\x00\xfa\x99`SY\xa1VX\xf6.\x9a\x9a>`\xaa\xea\xf4\x09\x00\xd2\x07\xc0T\xd5\xe9\x13\x00\xa4\x0f\x80\xa9*u\xfa\x04\x00I?0U\xc5\x09\x80\x0b\x81\xa9*N\x00\\\x08LU)N\x00\xdc\x07\xaa\x8a\x00\x01\xa6\xaa8Wu!0U\xc5\xb9\xaa\x0b\x81\xa9*\xc5\x09\x80\xfb\x00\xa6\xea\xb6\xce+w;\xef\xdfg_{_\xbf\xc2\x7f\xdc\xa7\xf7\xef\xde\xed\xbck\xb5\x1e\x02\x1f`\xaa\xee\xa5\x9d\xfc\x07{\xe7\xff\x8f\xd238\x01p\x15\xc0T\xed\xd4\x97\xae\x9c\x89,#n\x00\x98\xaa\xfc\xa0\xff\xe0\x1fV\xbf\xb0|\xf9\xf3\xbf\\\xbe|\xf9\x0b\xbf\x7f\xeb6\x9e\x07p\x09\xd0Te\xef\xf9k\x1e/e\xcc\x94\xdf\xa7\x9e\xc3i\x80K\x00\xa8\xea\x0b\x93\xf7~u\xe6\xab\xef\xe8\xc53_}\xf5\xfcd\x9c\xb1\xba\x05\x80\xaa\xbeX\xfa\x1d[x\xef\x17\xfc\xe1\x9a\xd23\xddw1\xb6\xc2\x15@Tu\xfa\x17l\xe1_\x1e\xda\xcb\x1e-\x9f~\xc6j\x0dd\x80\x00RU\xae\xe7\xffx\x88\x0b\x1b_U\x8c\xad\x18h\x00Tu\xf9\xcc\xdb\x7f\xf8\xd7\x1f\xfe\xb7\xef\xfd\xf3\xbf\xfe\xcf\xfb\xafO\xbd\xf2\xf1\x8b\x9d\x07_\x8a\xa9\xb3-\xb6\"\x01\x8e\x97e\x17T\xb6\x14\xa4\xfbO\xc7m\x00T\xf5\xf9\x99\xdd\xbf\xfc\xc1\xf7\xbf\xf7\xd0\x0f~\xf0\x8f\x9doM\xbd\xf1\x87\x99\xb7\xfb3\xb6\xc2\x9a\xe6\xec\x09\x1b\xb7\x96\x10\x82\xf7W\xe9\x1d\x00U}\xb1\xf4\xdc\x95\x83\x07\x7f\xf8\xfd\xb5\x07\xffLWO\xff\xea\xc6W\xf4\xf6\xb7QU\xf6\xc6V\xf4\xcc\xd5\x9c\x8a{\x94\xde\x19\x85\xaa\xf6\x12\x88\xaaN\xfd\x8c-\xfc\xf0!6K\xed^^j:W\xb57\xb6\xa2g\x16\xfb\xfe\x1f\xffQ\x8f\xaa\xf6\x12\x88\xaa\x96^d\x0b\xa5\xff\xc4\x85]=\xdd\xecd\x95\x8d\xb1\x15\xcf\x10m\xe3\x82\xe2\xac\xb2\xb3T\xed\xb7\x96u\xb3\x95ne\xdf\x97\xd1Q?\x13\x85\x97\xeb\xef)\xb9\x16\xcaj\x86\x1e\x90\xf8\x80T\xf5\x9a\xfe\xf0%\xd3\x8bVl\x8c\xad\xf8\xcb\xd6L\x92W\xf7\xeb\x9c\x0aC\xbf\x97\x9e~\x94usk\xf7\x94\xca\xcb\xf7<\xe1\xbb\x0bR%\xd7BY\xcd\xd0\x03\x12\x1f\x88\xaa>\xfe\x8b\xe5\xcf?\xbf\xe6\xf7\xec\xdb\xf2\xc7\x1f1\xbb\xc0\xda\xd6\xd8\x0a-\xf7,[-\xcf\xb8\xdak\xc5\xe2\xb9\x92\xd7h\xbb2\xe5Pr-\x94\xd5\xd4E$>\x00U\xdd\xf6\xf3\x99\x8f\x95J\x1e\xfb\xf9/\xae\x98\xa8jkl\x856\x87\xf2\x1b\xaf\x1bW;\xe2\xb9\xd7\xf1\xda\xf5.\xed\x08}\x90\x19\x19U\x95\\\x0be5u\x11\x89\x0f4U\x19w\xaf\\\xbc\xf8\xed\xb7\xd7\xee\xb2o\xdf^\x89\xcc\x05\x14l\x8d\xad\x10\xb9\x03B4e\xb5{\x99G\xeb\xc9\xb2\x13\x1e6?\x0d\xcdU\x1f4\x1br-\x94\xd5\xd4E$>\x00U\xa5\xe2R\xc05?\xbd\xe2\x8c\xd8\x8a\x88h\xeaj\xc5[\xfdS\x8a\x9b\xf84`\xb1Ot\xd3H.\xa9\xb9\x16\xa8j\xd2\x00T\xb5\xbb\xb3\xf3Fg\xe7O'\xef\xed\xbcq\xbf\xd3\xfcB\x15;c+\"\xa2\xa9\xab=]\xa35\x93g\xf8\xec\xf7jN\x05;\x98\x0b\xfa\x87\x1br-P\xd5\xa4\x01\xa8\xaa\xe4\xf6\x95\x1e.\xa9\xb6/\xb6\xe2B@\xab\xda\x17<\\\xa5\xf1dJ}5JWf\xe5\x04G\xfbV\xf0\x92\xe6\xacI\xbfk*\xcb\xe43\x07=\xd7BY\xcd\xd0\x03\x12\x1f\x98\xaavR\xba\xf6\x7f\x9f\xa1\xf1\xff\xc9\x8am\xb1\x15\xcf\xf0t\x8a\xd6l\xf6\xfd\x19e5J\x0f\xe5\xd6\xd2U\xd9\xfbE\xe9\xf1\xb2\xac\xfc\x8aV\xbe\xa4\xe7Z(\xab\x19{@\xe2\x02S\xd5\xbb\x94\xb2\x09\x00\x8d\xff\x0fU\xfb9\xb6\x02\xe9\x03`\xaaJ-&\x00\xfd\x1d[\x81\xf4\x010U\xc5\x1b\x01\xb9\x10\x98\xaa\xe2\x8d\x80\\\x08LU)\xde\x08\xc8}\xc0T\x15'\x00.\x04\xa6\xaa8\x01p!0U\xa58\x01p\x1f0U\xc5\x09\x80\x0b\x81\xa9*N\x00\\\x08LU)N\x00\xdc\x07\xaa\x8a\x00\x01\xa6\xaa8Wu!0U\xc5\xb9\xaa\x0b\x81\xa9*\xc5\x09\x80\xfb\x00\xa6*\xc6V\xb8\x17`\xaabl\x85{\x01\xa6*\xc6V\xb8\x17`\xaabl\x85{\x81\xa6*\xc6V\xb8\x16\x80\xaabl\x85;\x01\xa8*\xc6V\xb8\x13\x88\xaabl\x85+\x01\xa9j_\xc7V`@\x85\x13\x01\xa8j\x8a\xb1\x15I\x90r@\x05\xd2\x87\x00T5\xb5\xd8\x8a\xe4H-\xa0\x02\xe9K\x00\xaa\x9aZlE\x92\xa4\x12P\x81\xf4)\x10UM)\xb6\"IR\x09\xa8@\xfa\x14\x88\xaa\xa6\x14[A\xe9\xe9Y\xf9Z\xc1\x8cohb\xe9\x111\x01\x15\x94\xee,+\xd2\xf2g\x0c\x13\xf7HM8\xf8\x02I\x17\x20UM%\xb6\x82\xb6d\x8f[\xb5\xa3\x8e\xf0{\xfd%\x92\x1e\x11\x13PA\x0fdT\xbe\xbdcc>\xe1\xb7XK<\xf8\x02I\x17\x10UM)\xb6\xa2\xa3\xa8\xec\x1e\x1bo\x1b\xaf&\x98\x1e\x11\x1bP\xb1.\x8fK\xba.7\x98l\xf0\x05\x92\x16\x00\xaa\x9aZlE39\x1c~:\xa1\xf4\x88\xd8\x80\x8a\xf3\x85\xc3k6\x1e\x0e\xf2<\xa1\xe4\x82/\x90\xb4\x00MU\x9ajlE=\xd1'\x8e\x09\xa5G\x98\x04T\\\xdf0\xbb\x98\xe4\xaf\x0a&\x1b|\x81\xa4\x05\x80\xaa\xd2\x94b+vD\xee\x8d\x9ePzDl@\xc5\xa1\xc5l\xb5\xeb[}\xeb\x92\x0d\xbe@\xd2\x02@US\x8b\xad\xb8U\xe0\xe7o\xdd5\xf3\x13K\x8f0\x09\xa8\xa8\x13\x93[\xea\xafN6\xf8\x02I\x0b\x00U\x95$\x1b[A[\xbc\x0foh\xae!\x9biB\xe9\x11\xb1\x01\x15L\xd5\xec\xda\x0f\x9a\xe6\x12>\x17M<\xf8\x02I\x170UM!\xb6\x82\xd2\x93\xb3\x87\x0e\x9a(\xaeC\xb1N\x8f0\x09\xa8\xa0\xafM\xab+\xd2\x0a\xfc-\xe2A\xc2\xc1\x17H\xba\x80\xa9j_\xc7V`@\x85\x03\x81\xa9*\xed\xdb\xd8\x0a\x0c\xa8p\"0U\xc5\x1b\x01\xb9\x10\x98\xaa\xe2\x8d\x80\\\x08LU)\xde\x08\xc8}\xc0T\x15'\x00.\x04\xa6\xaa8\x01p!0U\xa58\x01p\x1f0U\xc5\x09\x80\x0b\x81\xa9*N\x00\\\x08LU)N\x00\xdc\x07XU\x11\xb7\x01SU6I\xfdxm\xfc\xebU\x91\x81\x08LUq\xae\xeaB`\xaaJq\xae\xea>`\xaa\x8a'\xab\\\x08LUq\x02\xe0B`\xaaJq\x02\xe0>`\xaa\x8a\x13\x00\x17\x02SU\x9c\x00\xb8\x10\x98\xaaR\x9c\x00\xb8\x0f\x98\xaa\xca\x09@w'\xed\xbe\xcf\xbfpxu\x030U\x0dM\x00\x107\x01SUF\xe7\x8d\x9e\x87R\x8c\xad\x18h\xc0T\x95_\x03\xf0\xd6\xfd\xbd/u\xee]\xcd\xbe\xee\x1e\\\x1bS\xd1/\xb1\x15Gg\xe4\xe7Lk)\x89\xbd[\x06\x92\x06`\xaa\xca\xef\xb2\xfa\x93\xef^\x9fy[|\xdd\xe8\xdf\xd8\x8a\x96\xf0-\x83\x0ei\xe5MoT\x10y\xbb*\xbd\xd5\xbc\x16I\x1a\x98\xaa2\xee~G\xaf\xfd5\xf4u\xe3\\\xd4\x93\xb6\xc6VLx2\xb4P\xe6g\x03\xe6\xac\xd6\x8d\x00\x00\x07LIDATy\xb0J\xaa\xaa\xb7\x9a\xd7\"I\x03SUq\x06\xe0J\xfc\xe7m\x8d\xad\xd0\xef\x048|\x09\xff~\x944\x19Z\xcdk\x91\xa4\x81\xa9\xaa8\x03\xf0U\xf7\xdd8'\xabl\x8c\xadh\x0a\xdd\xf3\x97\xdf\x0e\xf8\xc9\x02\xfeW\x11\xdc~\xcb\xd0zsv\xa1VT~\x84\x1ak1\xd7\"i`\xaaJ{\xfe\x08\xc0\xc6\xd8\x8a;\xbb\xc5M+\x03'Xc{\x91\xa7\xacn\x0f\xbf\x8b\xab\xda\xfa.\xa9ni,\xf7\xec7\xb6b\xaeE\xd2\xc0T\xd5\xe2\x1a\x00\x9bc+\xf47\xf5\xab+&h$\xb7\x91\x1aZ;\x1ao\xb11\xb4\xa4\xc2\xd8\x8a\xb9\x16I\x03SU\x8bk\x00l\x8e\xadP\xe7\x9f\xf7v\x94\x89\xbba+\xad\x97\xd7\x95\x8d\xc8!r\x9bz+\xe6Z$\x0dLUi\xcf\x13\x00\x9bc+\xc2\xfa\xed\xe7\xf3`\x1a\x94\xddGZ\x0b\x8a\x165\x05\xfcQ\xaab\xaeE\xd2\xc0T\xd5b\x02`sl\x05\xd7o\xf3\xd7\x94\x16\x88\xc4\x0a\xbad\x94\xa1\xb5x\"\xff\x1b\x99\xa5\xa8\xca[1\xd7\"i`\xaaju\x11\xa0\xad\xb1\x15~?\xa5\x97xC~\xe1U\xbe\xa6L\\\xd1[\x8b\xf8\xc3\xe0X\xa9\xaa\xde\x8a\xb9\x16I\x03SUjq\x11\xa0}\xb1\x15\xbc]\xabo\xf2g\xb3?\x88|RP\xdb\xdc\xe4\xf7\x9d4\xb4\xd6\x91\xd9\xebV\x8cg\x13\x87}j+\xe6Z$\x0dLU-\xff\x15\x80m\xb1\x15\x8c{5\x83}\xd3\xf6\xb3\x85\x09\x9b\x97\x14g\xe7U\x9c4\xb6\x06\xebGkyOn\x1e\xa5\xf9\xd5V\xcc\xb5H\x1a\x98\xaaZM\x000\xb6b\x00\x02SUj\xf9\xaf\x000\xb6b\xc0\x01SU\xcb\x09\x002\xf0\x80\xa9\xaa\xe5\x04\x00\x19x\xc0T\x95ZN\x00\x90\x01\x07LUq\x02\xe0B`\xaa\x8a\x13\x00\x17\x02SU\x8a\x13\x00\xf7\x01SU\x9c\x00\xb8\x10\x98\xaa\xe2\x04\xc0\x85\xc0T\x95\xe2\x04\xc0}\xa0\xaa\x08\x10`\xaa\x8asU\x17\x02SU\x9c\xab\xba\x10\x98\xaaR\x9c\x00\xb8\x0f\x98\xaa\xe2\x04\xc0\x85\xc0T\x15'\x00.\x04\xa6\xaa\x14'\x00\xee\x03\xa6\xaa8\x01p!0U\xc5\x09\x80\x0b\x81\xa9*\xc5\x09\x80\xfb\x80\xa9*\xc6V\xb8\x10\x98\xaabl\x85\x0b\x81\xa9*\xed\xdb\xd8\x0a\x10\xb8.[\x03\xac\xaa\x07\xdf\xeb>\xf8\xdbN\xf9\xf5_\xbf\x8fy:\xb1\xd8\x8a\xe6\x0c\xe2\xd9G?\xf1\x10\xdfu\xabRA\xbdW\xde\xb5\xa5\x8a\x10\x92u*\xdc\xba#\xaf\x07i\x8exXm\xe4~\x7f=\xd6&E\xdcl\x8d\xf0N\x0e4`\xaa\xca\x06\xd4_L\xbe\xb1\x96}=\xc2\xbe\xae\xbd\xfe\xf3\xe8\x02=\xb6\xa2\xe7\x9c\x88\x8e\xb7\xc9\x8e\x07\xb4c\xd4\x84\x04\xd3$J4y\xeb\xa9\xb3\x81\xc0\xba\xf0\xdd\x06)\xfd\x20;\xfaV\xac\x0a]\x9f\x8c-\x09\x9c\xd7\x1f\x9a\xd6\xa6\x18f\x11'[#\xbc\x93\xc9\x91\xe2>\xd8\x08LU\xad\x88\xc4VX\xe4D\xb4\x93[\x94\xd6\x0e\x89\xa8\xd4#w<\x95\x9e\xf0\xfd\x01\xf7GT\xa5=\x8f\xdf\xfc\x96j\x11\xccjS\x0d\xb30\xcd\xd6Pw2\x09R\xdd\x07\xfb\x18\x98\xaaFb+,r\"\xb8\xaa\xcd\x99-=\xd6Dh!\x87H\xb8VU\xb5g\x8c\xaa\x9a\x91j\x98\x85i\xb6\x86\xba\x93I\x90\xea>\xd8\xc7\x80T5\x1c[a\xc8\x89\xd0c+\x9e!\x99\x0d\xd5\x85\x83\xcb\xf9\\\x93\xa9\xda\x9e\xbbB\xae\xa5\x04I\xe8\x8bj-\xa5uCiamh\x1baU\xaf\xfb\x08\xf1\x88\xdb\xa47\xb2-\xd5\xd1:\"\x82\xab\x94\xce\"\xaaFj\x95\x0c\x0c\xf30\x0bC\x8a\x86\xdez$\x93\x90\xa5\xa7*\x87\xfb\xca\xe4-\xb5L\xb25\xd4\x9d\x8c\x04u\xa8\x99\x1d&\xaf\xcd\xf8\x1f\xca\xa1\x0cHU\xc3\xb1\x15\x86\x9c\x08=\xb6\x82\x07T\x0c[\xb1bX\xd61\xae\xea\xa5\x92A\xf7\xe4ZJ\x90\x84\xbe\xa8\xd62\xe9f\xd1\xd9a\xef\xf4Q\xf5P\x20\xe0\x15w\x1e\xbe\xb53g\xd9%z\xa96w\xe7-Cg\xca\xa8\xaa\xd7*\x19\x18\xe6a\x16\x86\x14\x0d\xbd\xb5\xa3q\xeb\xb0\xd1\x83\x8a\x16Tf|-z\x89\xcd\xd6PwR\x09\xeaP\x16\xcd^\x9ba\x1f\x9c\xca\x80TU\x89\xad\x88\xa4GDb+\xa86\xfc&\x1b\xe2\x8a&rU\x9f\x1eU\xb0N\x14(A\x12j\xa6D\xa4\x96\x06\xb3\xebi}vh\xb2\xa9N\x00|\xa1\x9bd\xcf\xe3\xf3\xbd\xca\x9f\x19;\x8b\x9a\x00\x84j\x95\x0c\x8c8a\x16\x91\x14\x0dcH\x06\xf1\xdf\xa4\xc1\x9b\xb2>6[C\xd9I\xe5\x15+\x8bq^\x1bN\x00\xfa\x07=\xb6B\xf9\x0d(\xb1\x15T\x1et\xad#W\x99\xaa\xbe\xe3\x9b\x87\x88_\xbc\x12$\xa1fJDj\xe9\x11\xb2\xbbc79\"\xfb0S\xb5\x85\xbd\x1fwd\xb5\x18;3WU\xc9\xc0\x88\x13f\x11I\xd10\x86dh_G:\x8b\xcd\xd6PvRy\xc5\xcab\x9c\xd7\x86\xaa\xf6\x0f\xfb\"\x1a\xe9\xbf\x01%\xb6B\xdeJ\x9d\x06\xc8!\xa6\xeaV\xdaU,R\xfc\x94\x20\x095S\"RK\x1bDc\xe8\x04\x91\x99\xaa]\xf9M\xb4)?h\xec\xcc\\U%\x03#N\x98E\xe4~\xef\xc6\x90\x0cu>i\x92\xad\x11\xd9I\xe5\x15+\x8bq^\x1b\xaa\xda?Db+\"9\x11Jl\x05\xd5\xe6\xf3\xef\x1b\xc9My\xb2\xaa\xd9\xcbOV)A\x12j\xa6D\xa4\x96\xce\x1a\xb7\x7f\xff\xfeq\xb3d\x1ff\xaa\xd2\x9a\x0aZ!\xb2+\xd4\x1e\xa4\xaa\xb7\x96]Uk\x95\x0c\x8c8a\x16\x11U\x8d!\x19\xb3h\x84\xd8l\x0de'\x95W\xac,\xc6ym\x91}p,\x03RU%\xb6B\xcf\x89Pb+\xa8\x96\xcf~\xc3wF\xf8C\xe7U\x83\x93x\x82\x95\x12$\xa1fJDji\xe1B\xf6mA\xa1\xec\xd8T\xd5=\xde\x0b^q\xa0\xa3\xf6\x20U=Lv\xaa\xb5J\x06F\x9c0\x8b\x88\xaa\x86\x88\x0bu\xf43\xc9\xd6PvRy\xc5\xcab\x9c\xd7\x16\xd9\x07\xc720U\x8d\xc4VDr\"\x94\xd8\x0a\x8d\x8ck\xdc<:\xf7$\xedh\xe2\x9fV\xd1\xb73\xb6\xdf3\x04I(\x8b\x91\xdaf\xb2\xe4\x0e\xbd\xf3+\xd2|\x8f\x9e\xe7\x9fV\xd5\x07\x02l\x10z\xf0\x09;\xaa\xaf\x0a\xec\x14\xf3\xdd`aY\xa1\xfc#\xd1{\xe8\xda3\xb6\x84\x1d[\x076\x90\x80Z\xabf`\x98\x85Y\x18R4\x94\xce\xc4\x91zx&\x1e\x9b\xad\xa1\xee\xa4\xfa\x8a\x95E\xb3\xd7f\xd8\x07\xa720U\x8d\xc4V(9\x11\x91\xd8\x0am\xe1\xdc\x9c\xc2\xca\x0b|\x88\xe1\xd7\x00\xd0i$\x83\x0f\x91J\x90DdQ\xaf\xdd\x91\xc1O\x986\x11\x92\xb1\x83\xce\x09M\xf8\xd8\x11\xff\x01\x8f\\\x94\xd1\x16\xf5Z}h\x0f\xc2=\x1c\x0d=O|'\xd4ZC\x06\x86I\x98\x851E#\xdczDv\x10\x1aKM\xb25\xd4\x9dT_\xb1\xbah\xf2\xda\x8c\xfb\xe0P\x06\xa8\xaa=\xc7VD\xa6\xb2\xd6$Sk/\xbd\xcf\xd6p\xeek3c\x80\xaa\xdaslE2\xbf\xa2djm%\x0d\xd9\x1a\x8e}m\xa6\x0cTU{$\x99_Q2\xb5\xd0\x80\xf5\xda\\\xa8\xea7\xe2\x88\xc5\xaaJ\x92L-4\xa0\xbd6\x17\xaa*\x8eX\xdaiB$S\x0b\x0dh\xaf\xcd\x85\xaa\"0AU\x11\x20\xa0\xaa\x08\x10PU\x04\x08\xa8*\x02\x04T\x15\x01\x02\xaa\x8a\x00\x01UE\x80\x80\xaa\"@@U\x11\x20\xa0\xaa\x08\x10PU\x04\x08\xa8*\x02\x04T\x15\x01\x02\xaa\x8a\x00\x01UE\x80\x80\xaa\"@@U\x11\x20\xa0\xaa\x08\x10PU\x04\x08\xa8*\x02\x04T\x15\x01\xc2\xff\x07mu\xa3\x1c\xa2\xebff\x00\x00\x00\x00IEND\xaeB`\x82", - - "analysis/ipcg-pkg.png": "\x89PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\x00\x02\xf0\x00\x00\x03\xc6\x08\x03\x00\x00\x00\xb2,^L\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x02\xfdPLTE\x02\x04\x00\x09\x0b\x07\x0d\x0f\x0c\x10\x12\x0f\x13\x15\x12\x1b\x1d\x1a\x20!\x1f!#!$%#&(&+-*/1.2416859:8<=;>@=AB@DFCFHEJKIOQNQSPTVSWYV,`\xae7]\xad8^\xae[]Z8a\xaa:b\xab;b\xac_`^\xc75\xf1\x17\x7f4\x1f\xc7j\xfb\xd7\x17\xdd\x05Zn\xc9/\xfe\xa7#\xf1\x1a\xb1k\x1e\xae-\x19\x9f_\xfej\xc73\xfa3\x9e\xa8_%f3\x9a\x10\x85\x1dG\x97M\xd4\xd7\xf8}x\xc3\xff\xfd7\xcfC\xae\xdc\xc9O\xbfo\xd9\xec\x83\"\x02\xedp\x07\x18i\xa4/\xfc\xe1\x7f5\xff\xef.>\x1c%\xfc+\xae\xc0\x03\xb7\xa1\xb4a\xd9*\xf9\xb8\xf8\xab\xc4lF\x0a\xff?\xf9\xe6\x92\xaa\xbf\x067\xbc\xad\xcc\\2\xe9\x84e\xbb\"\x82E\x1d`\xc4\x91\xb6\xf0Zq\xf0\xffow\xa4\xf0\xaf\x8e\x0d\x99\xf0\xa8\xbe\x1f5,\xcb3\x96=\x1f\xbbbGG\x95\x08\xf3\x9frA\xb4\xb6\x87\xf3\xc3\x13j\x13\xae\x11\xbd\xe6\x1f\xb5\xe0\xb4\x09\"$|\xe8W\x89\xd9\x8c>;//\xb8dAp\xc3\xc1W\xaf\x98g\xd9\xf2\xcf,\xebb\x07?\"I[x}w\xe8\xf9\xe3\x169\x18\xf7\xe7\x8e\xb7^\x9d\xaa\x0f~\xf1\xea\xab':\xfe,\xfd|h\xdb\x1f\x7f#\xdd\xd1%3,\xd3'=T\x92s\"v\xc5\x8e\xff\x95\xf7\xab\xff\xf8\xa7\x8dr\xb5_\xc9\x9f\x11\xad\xedt\xfd\xf1\xf8e\xafnyT\xbf\xcfy+\xd1\x1a\xd1k>\x20\xd7\\\xf5\xc7\xff2\xd5\xf6D\xfe*\xb1\x9b1^\x1e\xf9O\xbf\xea1^\x91\xc1\x0d\x8a\xe2\x8d\x7f\xfa\xddD\xb9%K\xa8\x89\xd8\xc5\xff\xa2\x03\x8c<\xd2\x17>O\xee\xd8\xfe(\xff\x1f\x97\xef\xb0\x86\x0eZ\xeb\xf5\xc1\x032\x10\xfcQ\xdf\x95N\xec\x08X\x96\xab\xcf\xd9k\xb7\xe2\x9f~55\xcfH\x14\x1ea\x04\x8d\x18m\xdf\x0a\xda\xf7\xb7\x87\xf4\xc1\xb2DkD\xad\xf9?rM#\x8d\xd7\xc8\x91'\xf2W\x89\xdd\x8c\x16\xfc\xddNH\xe3\xdd\x81\x0d\xe6\x1d\x0d\xfe\x12\xd67\x92-\xbbx\xec\xe0G$\xe9\x0b\xff\xef\xc6\x92\xbc\x80d!\xe1\xcb\x85\x11\x18t\xa4\xa0o\x05,\xfbU`\x03\xb1+\xea\xc8\xe0\xd3\xf1\xbc\xfe\xb8L\x0e\xa2\xb4\x95\xc7\x9b\x0f\x19\xa3\xffz\xea\xf7A\xb7\xec\xd7\x88Zs\xb5\xfep\xb21\xfa\xf3x\x11\x16>\xf8\xab\xc4lF\x0a\xff\x94\xb1|\xa3>r\x9d17h\xa4\xa8\x8e\x09\x91\x9b\xee\xf8\xbd\x08\x81\x04?\"I_\xf8\xff0\x96H'\xe4\x91jHx)re\xadD\xe6\x80\xdf\x05,\xfb]`\x03\xb1+\xea\xbc\xff\xdf\xf5s\xfeI\xcez(\xf8\x84\xc5\xad\xaa\x90t\x16\xec\xd7\x88Z\xb32\xbc\xa6<>\xf5D\xfd*1\x9b\x91\xc2\x9b'l\x0e\xcbe\x87\xcd\x0d\x9a\xbf\xed\xc4\xf0ok2Y\x04\x18\x87\x1d\xfc\x88$}\xe1M\xb5\xfeUD\x0a\xff7\x11A}\xc0\xb2\xc0\x99?\x9b\x15;~W\x1e:\xb6|X>\x8e\xd2V\xfe\xc5X\xd5\x11A\xbc5l\xd6\x0c\xbc5\xe0\x16a\xe1\x83\xbfJ\xccf\xe4#\xd3^\xe3\x7f\xc4\x9f\xac/\xca\x07D\x94\xf0\xbf\x0f\xae\xfa\x8b\x0e0\x12I_x\xf3\xdd\x96\xa0\x09A\xe1\xff*\"x:\xb0\xe4\xad\xc0\x06bV\xf8\x7f\xe4\x13Q\xda\xce\x13\xc1\xbd\xe8\xfbo\x19\xa7\xe1\xe3\xafa\x13i\x02\x81]\x1ecz\"\x7f\x95\xd8\xcdH\xe1\x8d\xf3\x93\x11\x91&\x9e\xf0\xbf\x17\x06\x0b:\xc0\x88d8\x847\x8e\xf8\xe4\xa1j\xbd\xf1\xd4\x7f\x9bj%\x16^\xaah\xc4\xe4\xff\xd0\x07\x8f\xca\x81\xcdAk\xa1qt\xf9[1\xfe\x81\xdaDkD\xad\xb9J\x7fXl\xacyX\x9e{\x8f\x12>v3Rx\xf3\x05\xf2\xa2>\xca\xefH,\xbc\xb9\x8b\xc7\x0e~\xa42T\xe1\xe7\x89@\xf2\x90\xe7F\xfeI\xbe\xc5\xfaG!\\\x0f\x1f\x0dXv4\xb0\x81\x98\x15\xf3\x83&UF\xeb\x1b\xe0-\xb9\xfao\xf4\xc1_'\x9bB\xc6_#jM\xe3\xcc\xe73\xfa\xe0}\x19\x8bB\xc2\x07~\x95\xd8\xcdH\xe15\x99\xf0\xff,7T\xd5\x91D\xf8W\xe4\xc6~\xd1\x01F&C\x15\xfeW\xfa}\xde\xaa_\xfdw\xc7Q9g\xf2\x7f\x1e\xfe}a@\xa4\xc4\xc2\xcb\xbb\x7f}\xab\xe3\xf0/\xe4,\xbb\xb34\xc6\x1bO\xc2\xedyZ\xce\x14\xff\x9bh\x8d\xe85\x8d\x8f\xbc\xcc\xd9Xo~4!J\xf8\xd8\xcd\x18\x87\xb0\xe3\x97m\xab\x97\xdb1\x8em\x13\x0a\x7f\xe6\x01\xf3\x8d00\"\x19\xaa\xf0\x1e\x11\xb4j\xa3\x08\xe1\x92>$\x16\xfe\x19c\xe2xs~\xb1|\"Z[\xebG\x0b\x96u$Z#z\xcd?\x05&\x89q\x05\"F\xf8\xd8\xcdH\xe1s\x83?\xe9W\xc1\x0d\xc7\x15^\xa6\xf8_t\x80\x11\xcaP\x85?a~\x0aE\x1a\xe9\x09ZS`\x9c\x01L,\xfc_\xa7\x9bssV\xffk`Z\xb4\xb6\x1doM\x0alO\xd4\x1a\x9f\xcd\x89\xbbF\xcc\x9a\xaf\x98\xbf\x89\xf6[\xb9\xca\xf3\x91\xbfJ\xecf\xa4\xf0\xaf\x96\x98K\x17\x19\xc7\xc7\x89\x85?\xf3\x00v\xf0#\x97\xa1\x0a\xdf\xf1VU\xbe\xf6O\xe5\xc6\xf0\xf0\x8a\x9f\xe5\x8f\xcb{\xe8i\xf3\xf3\xbf\x89\x85\xef8\xe3y\xc8\xa5\x15\xff\xea-\xe3\x03hu\x1d6\xdav\xfcu\xe3\xf4\x7f\xd2r'\xfe*\xf0\xde~\xdc5b\xd7|\xebW\xc5\xda?\xcd\xfb_#\x16\xfd\x7fQ\xbfJ\xccf\x8c\xd3\x92\x7f\xfe\xf7\x12-\x7fz\xc0\xed\xc4\xc2w\xfc\xce\xfay20\xb2HM\xf8\x11\xc5\xdf\xfe\x16\x1a\xcawZ\xff3\xc1T\x83\xf0y\xf8\x149s\xb4\x03\x8cTF\xa1\xf0\x7f\xcc)x\xa8r\x9b\x1c\xfdY\xe6\xad\xa4\x1f\x01H[x0\x82\x19\x85\xc2\x9f\xc8\x11\xf2\xbd\xa5?\xfd\xe9?\xe4{\x03\x0f$\x9b\x0e\xe1\xb3\x8aQ(\xbc\xf1\xde@\x88\xdf'\x9b\x0d\xe1\xb3\x8a\xd1(\xfc\x9f\xcbC\xba\x8f\xfbM\xb2\xc9\x10>\xbb\x18\x8d\xc2wt\xbc\xfa\x8b\x07\xf24-\xff\xa1e\xa9\x88\x0c\xe1\xb3\x89\xd1)<\x00q\x80\xf0\x20\xab\x80\xf0\x20\xab\x80\xf0\x20\xab\x80\xf0\x20\xabH$<\x00\xa3\x0e\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a\x08\x0f\xb2\x0a5\xc2_\xbe\xfcygw\xe4\xa2\xee\xce\xcb_}9`?\x1d\x80L\xa1F\xf80\x07\xb7w\x124\x07\x8e\xa1T\xf8>\xa2Ms?\x96w\x008\x83R\xe1I&\x19\xec\xdf\x81\x83(\x14\xbe\xaf\xcf\xd7\xd7w|\xcf\x97\xfa\xdd\x00\xac\x07\xce\xa0Px\x83\x97\x1e\xbb\x98l\x0a\x00\x99C\xb5\xf0\x03\x9d\xc9f\x00\x90A\x14\x09\xafG\x98\xd3{\xfe\xb0}\xeb\xe67\x9b\xb7o\xdd\xba\xbdy\xdf\xcddk\x00\x90\x09\x14\x09\xdfG\xb4}\xfe\xac\x99\xd3fL\x93\xcc\x9c_q\x11\xe7j\x80\x13\xa8\x13~\xc3\xb4\x83\xa7\xdf;\xfd\x9e\xce\xe9\xd3k\xa6\x9d\x83\xf0\xc0\x09\x14\x0a?\xbb7\xf4pk\xc59\xf2\x11\x9c\x07\xcaQ(\xfc\xcc\xb3\xa1G\x1bf\x9eK4\x1b\x80L\xa1P\xf8\x19!\xe1i}X~\x00T\xa2N\xf8\xf5s\xbb\xf7\xfc\xf8\xc7?\xd1\xff\xab\xe8{}\xe6\xe7G\xb6\xfb\x8eoU\xf1\xb9\x9a\x9f\x8e\x193\xe6\xee\xe3\xc9f\x81,A\x9d\xf0\xeb\xaai\xcd\xd7\xbe\xf6w\xfa\x7f\xdf\xf25\xcf\xe8~cn\xf7\xeeY6\x87\xae\x9d\x09\xc2\xce\xee\xb7\xe3?\x17\x97\x0f\x9b\x9bW\x8e\xd9c\x0c\xcf\xe1M\x80\xacG\x9d\xf0\x1bf_\xbe\xd8\xbcg\xdf\x9e}\xcd\x07i\xf3\x8c\x8b\x9d\xa7\x07:?\xf4E\xcf\x1bX\xfb\xcd\xfb\xec\xd67\xf9\xc1\x8f\xe3?\x97\x88}\x01\xe1\xef\xfb\xe6\xda\xcc\xffE\x01\xacQ'\xfc\x0b3N\x07\x1f\x0d\xc4\xcb\xf0\x07\x7f0\xe6\xfe\x0fm\x9f1\xb8\xe7_\xe2?\x97\x88\xa0\xf0g\xef\x1f\xf3\x83\x83\x89\xa7\x82Q\x8e:\xe17\xcc\xbah&v\xfdf\xd3\x8cs\xd4\x1bsZ\xb2s\xc6\x9d\xdf\xddn\x0e\xd7\xfd\xf0\xee\x7f\x98\xd1Mt\xe4\xce1c\xee\xa7\xef\x8d\x19\xf3\xcd\xde\xadcL\xee\x89\x98pP\x9f0\xf7\xf8O\xbew\xf7}\xbeG\xc6\xdc\xb9v\xda?\xdc}\x9f|\xc5t\xfe\xcbw\xee\xfa\xee\xfd\x07\x03\x1b\x0e\x0aO\xb4\xfd\xbbwNC\xae\xc9f\x14\x0a?;\xfc\x9d\xa7\xcd\x156\xe9}\xf3w\xee\x9c\xfd\x959\xfc\xf9\x9d\x8fl_\xf9\xed{\xfa\xa8o\xcf\xc2;\xf7\xd0\xba;\xd7\x1d\xa4\xaf\x9a\x9b\xff\xe1G\xcd\xcd\xcd\xc7#&\xdc\xdc\xb0\xfe{\xff\xf0\xcd\xefM\xfb\xc9\x9d\xa7\x8f\xac\xbfs\xcc\xb7\x17>\xf9\xcd\x7f\xd6\x9f\xdf>\xe6\xe7\xbb7\xdc\x7f\xe7>ssa\xe1\xe9\xab\xd9w~{S\xf4O\x06\xd9\x83B\xe1\xab\xd7m~a\x93\xce\x0b\x9b6\xff\xf2\x91\xd8\xaf\x81<2\xe6\x9e\x83\x81\xe1\xf61\xcf\x92\xd4\xf49\xf9\xe0\xa7?\xbc\xf8\xbd\xc7\xcd\xe5\xa1H\x131\xe1\x9e1\xf7\xe9;m\xb9\xdf\xbe\xeb\x9b\xfa\xde\xfd'\xdf\xd6G\xdd\x1b\xbe\x94\xcf\xfc\xb39\xdd\"\xbc\xfe7\xe1\x9e1\xd3\x08d+\xea\x84o~\xfc\xb1\x8a\x19&\x15\x8f?\xf9y\x8c\xf0\xcf\xde\xf5\xadu\x81\xe1\x8f\xbf\xef\x93|\xf7\xa7\xf2\xc1\xcd{\xbe}\x7f`yH\xf8\x88\x09\xf7\xdc\x15<8\xb8K>\x9e\x7f\x97\x1c^\\s\xdf\xf7\xbf\x19\x88?\x91\xc2\xaf\xfb\xd6\xddk\x09d+\x8a\x84\xd7\xe9\xbex6\xc4\xc5\xcb6gK\x8e\xdf7\xe6\x87\x07\x8d\xd1=\x81\xb8n\xee\xa07\x8di\x0e\xcc\x08\x09\x1f1\xe1\x9e\x1f\x04\xb7p\xd7|\xfdf\xa1\x14~\xdf\xb7\xbf;\xeb\xa5\xe6{c\x85?\xf2\xc31\xf7\x87\x0e\x9eA\xf6\xa1N\xf8\x14x\xe9;w\xce\x92Q\xe4'\xdf\x7f\xdb\xc0\xf8\xae\xc8\xd9\xef\xcc\xfd\xdee\xf3yC\xf8gOGM\x08\x9f\xbb\xb9k!\x05\x84\xff\xbf?\x94\x07\x0c\xff\x12-\xbc\x9e\xe0\x83\x87\xc5\x20;Q(\xfc\xc0@_\x90\x818\x1f\x1b\xeb\x9cq\xe7w^'z}\xcc\x06\xf9h\xae\x8c\xee\xbe\x1fV\xd3\xcf\xef3\xe7\xdf{/\xd1\xc7\xf29\xeb\x04[\xe1\xbf+\x97\xf5\xdd\x13%\xfc\x9b\xdf\xbds\xd6W\x04\xb2\x19\x85\xc2\xa7\xc4\xc1\x1fIUg\xdf\xf9\xe3\x176\xfft\xccz\xba\xd9\xfc\xc8\xb7?\xa4\xf7\xbe9\xadY~\xd4r\xfe]On\xbe\xef\xee\xb3\xd6\x09\xbe=\xc6\xb9\x9b\xf7\xf4eg\x9b\xef\xfc\xe9\x1ez\xfb\xa7w6\x9f\xa5\x85c\xfee\xcd\xe3\xf7\x8c\xf9\xd6\xbf\xed\xd1\x177\xaf\x1c\xf3\xeb\xe6f\xfd\x0f\xc3\xbf\xfc\xe8`\xc2\x1f\x0eF?\xdc\x84\x0f\xf0\xfa\xbd\xdf\xfa\xe6\x8f\xfe\x20w\xe5c\xc6L\xa3G\xc6\x8c\xb9s\xb7\xbe\xb4\xf7\x91o\xdd\xfd\xa3}\x11\x13\xe4y\xf81\xf2\\\xbd<\xcd\xa3O;r\xb7~\xfb\x08\xf5\xfd\xfa\x1f\xee\xfa\xf6\x8f\x9f\xfd\xfe]\xf7\x1a\x9f\xa5\x91\x0c\xf2]Z0\xba`*<\x00\x99\x01\xc2\x83\xac\x02\xc2\x83\xac\x02\xc2\x83\xac\x02\xc2\x83\xac\x02\xc2\x83\xac\x02\xc2\x83\xac\x02\xc2\x83\xac\x02\xc2\x83\xac\x02\xc2\x83\xac\x02\xc2\x83\xac\x02\xc2\x83\xac\x02\xc2\x83\xac\x82\x8b\xf0\xbe\xa8VK\x002\x02\x0b\xe1\x07\x88\x8e\xbc\xf1\xa5\x82\xcb\xee\x81\xac\x87\x85\xf0}D\x9b\xabQg\x09\x14\xc0BxB\xa4\x01\x8apV\xf8=\xbe\xce^\x9fQgy\xf0\xcdNy\xd7G}\xbd\xbd\xbeps\x02\x00\xc3\x8b\xb3\xc2\x1f!\xe3r\xaa\xb2\xa1{6Jp\x80\x02\x9c\x15>|\xf5\xe0\xces1W\x12\x06`\xf8qVxyb\xe6\xf8\xeeM\x1b\x9e[\xff\xec\xda\xf5\xcf\xad\xdf\xf0zs7\xce\xd5\x80L\xe2\xb0\xf0z\x8a\xd9\xbap\xf6c\xb3fU\xcf\x9f=k\xd6c\xd53Pg\x092\x8a\xf3\xc2o\x98v\xe4\xfc\xd9\xf37\xe9\xf2\xd9\xf3\xe7\x9fE\x9d%\xc8,\x0c\x84\xaf\x90\xad\xdc\xfbV\xca\x87[+\xce\x0d\xc4^7\x1e\x80a\xc3y\xe1_\x98)\x1b\x0c~t\xc7A\xfd\xd1s\xa8\xb3\x04\x99\xc5y\xe1\xcd\xfe\xd6\xfb\xef\x90\xb7\xa8\xb3\x04\x19\xc6y\xe1\xd7\xcf\xed\xde}\xdf\xbdw\x7f\xed\x07\xf7\xfd\xbc\xef\x8d\x19\x9d\x077\xf8\x8eo\x8e\x9a\xb5e\xfco\xe5\xddr\x91\xd3d\xb3\x0d\x00R\xc7y\xe1\xd7U\x0f\xac\xfd\xc6\xd7\xff\xee\x8eo|\xe3;\xb2\xcerwu\xf7\x9e_F\xcd*\xd3\xca\xe4\xdd\x05\xaf\xe6\xb1\xd9\x06\x00\xa9\xe3\xbc\xf0\x1b*.v\x1e?~\xef\xd7\xb7\x1f\x7f\x8f^\x9ay\xbe\xfbY\xa9\x99)\xfc\x95\xf1\xcf\x13\xddX\\\xac\x95T\x19]\x20\xd6R3\xff\xaer\xd7\x03\xab{b6\x0e@\x0c\x0c\x84ORjvI\xec\xec\xb9\xf1N\xd9\xcfn\x10\xb5\x8ae\x07\x9a\xaar\xda)\xb2\xd4\xac6g\xc5\xdem\x05SQ\x06\x02\x92\xc3@\xf8$\xa5f\x97\x8c\xd34\xa5\x17\xf4aOS\x97\xbe?/\x9bG\x11\xa5f\xadb\x97>l7\x93\x0f\x00\x09q^\xf8d\xa5f\x97D}{{\xdb\x13\x13\x8e\xea\xe3\xab\x0d\x95\x93\xf2\x84\xec\xa1\xb7\x94\x9a-\x99\xd4\x7f[\xa7\xb86v\xf3\x00D\xe1\xb0\xf0\x94\xbc\xd4,p\xd0\xba\xa4\xd4O\xed\x85%O\xb7x\xddRxK\xa9Y\x990\x99\x17\xbb.\x00Q8/<%)5\x0b\x08\xff\x9a\xb8J\x93\xcb\xe5\x91\xe9\")\xbc\xa5\xd4\xacf\xd21\x83\xab\xb6\xab\x03`\xc5y\xe1\x93\x95\x9a\x05\x84_\x9a\xe7\xa7\x12Y\xe5\xe7\x7fX\x0ao)5k\x13MrX\xbf1v]\x00\xa2p^x\x93\xb8\x0d\x20\xe6;\xad-5\xe2Ei\xf9\xe2\x86\xe7\xa7\x8a\xa2\x17\xdf\x8d(5\xab\x1b[\xd3\xa2\x0fw\xd9o\x00\x00\x0b,\x84OTjf~\x96F+\xdb\xa9G\x18\xff\x96R\xad`\xc9k\xa5\x9a;\xb2\xd4\xac\xcd=!\x7fz\x9b\xdd\xda\x00D\xc2Bx\x94\x9a\x01U\xb0\x10\x9ePj\x06\x14\xc1Bx\\j\x0f\xa8\x82\x85\xf0\xb8\xd4\x1eP\x05\x0b\xe1\x09\x97\xda\x03\x8a`!<\"\x0dP\x05\x0b\xe1\x11i\x80*X\x08O\x884@\x11,\x84G\xa4\x01\xaa`!<\"\x0dP\x05\x0b\xe1\x09\x91\x06(\x02\xc2\x83\xac\x82\x85\xf0\xc8\xf0@\x15,\x84G\x86\x07\xaa`!a\xdc]\xddrK\xde\x85\x84\x0f7\x99\x85\xab\xce\x96\x0bm\xe7\xaa\x07\\\x95\x17\x08\x00{\x18\x08\x9f\xb8\xd4\xecV\xce\x16\xeb\xc3\x90\xf0\xe1&\xb3p\xd5\xd9_\x1a\xc7\x89\x02\xcfo\xf3\x16\x10\x00\xf60\x10>q\xa9\xd9'\xa2\xc5\xfa0(\xbc\xa5\xc9\xccRuFZ\xbe\xbew\xaf)\x20\x00\xecq^\xf8$\xa5f\xfd\xe3l\xf7\xf0\xd6&\xb3p\xd5\x19iK\xf5\x1b\x8fF\x00\xd8\xe3\xb0\xf0\x94\xbc\xd4,\x90\xe1\xfb\xcd\xc2\x83\xa0\xf0\x96&3k\xd5\x99&\x0b\xea!<\x88\x8b\xf3\xc2S\x92R\xb3\xba\\\xa3\xad\xacI\\\x91wA\xe1-Mf\x96\xaa3\x08\x0f\x92\xe0\xbc\xf0\xc9J\xcd\xae\xe5-\xe8\xd73\xba{\xa2\xf1((\xbc\xa5\xc9\xccRu\x06\xe1A\x12\x9c\x17\xde$A\x03H\x9b\xab|WK\xe5\xb8CD\x9f\xc9wZ\xb7x\xbd\x9f\x92\xb5\xc9,\\uv\xc9\xab\xd5\xbe\xeb?Q\xaby/\xc5\xdb\x18\xc8rX\x08\x9f\xa8\xd4\x8c\x8c\xcf\xd2\x14\xcd{_\x1f,\x0d\x04\xf7%ri\xa8\xc9,\\u\xb6\\\xd6\x9f\xbd\xef\xd2o\x97\xc7\xd9\x14\xc8vX\x08\x8fR3\xa0\x0a\x16\xc2\x13J\xcd\x80\"X\x08\x8fK\xed\x01U\xb0\x10\x1e\x97\xda\x03\xaa`!<\xe1R{@\x11,\x84G\xa4\x01\xaa`!<\"\x0dP\x05\x0b\xe1\x09\x91\x06(\x82\x85\xf0\x884@\x15,\x84G\xa4\x01\xaa`!\xdc_\xd0j\xbb!\x00R\xc2y\xe1\x93\x94\x9a]\xdb(^\xf3\xee]\"\xea\xcd\x87\xad\xae\x88\xcb\xc5\x03\x90\x1e\xce\x0b\x9f\xac\xd4\xacM\x9c\"\xf2/7;\xcd\xf4\x91\xddf\x00H\x11\xe7\x85OVjf\x08O=y\xb8\\$\x18\x06\x9c\x17>Y\xa9\x99)<-/\"\xba\x9e+DN\xa3|tr\x9c\x10\xf5gj&\xe6V\xde\x8e\xdd(\x00qa\x20|\xe2R\xb3\xa0\xf0;D\x17Q\xbb\xd7;^^\x01\x9ez\x9a\x1aKJ\xf3JV\xd5\x8c\xfd\x94\x00H\x1d\x06\xc2'.5\x0b\x0a\xdf\x16\x08\xf1\xb9\x9e\xc0\xf2\xa9\xc2}\x83\xfc7\x08\x804p^\xf8$\xa5fA\xe1_\x13\xd7\x8c\x87a\xe15\xec\xdcA\xda8,<%/5\x0b\x08\xffT\x9e\xf90,\xfc\x94\xd8\xb9\x00$\xc1y\xe1)I\xa9\x99)|\x7f\xc1\x12\xf3aX\xf8E\xb6\xd3\x01H\x84\xf3\xc2'+53\x85\xaf\x13\xc7\xcc\x87a\xe1\x17\xc7\xce\x05\x20\x09\xce\x0bo\x12\xb7\x01\xc4x\xa7\xb5m\xa9\x90\x9e\xf7\xbf\xe3\xf5\x8e\xaf\xf5zo\xd0\xed\xc3\xde\xd2\xe9^\xef'\xf6\xeb\x00\x10\x0f\x16\xc2'*53>K#&\xee\x90\xe3\xa39f\xa9\xd9\x0e:i\x8e\xaa\xec\xd6\x00\x20>,\x84G\xa9\x19P\x05\x0b\xe1\x09\xa5f@\x11,\x84\xc7\xa5\xf6\x80*X\x08\x8fK\xed\x01U\xb0\x10\x9ep\xa9=\xa0\x08\x16\xc2#\xd2\x00U\xb0\x10\x1e\x91\x06\xa8\x82\x85\xf0\x84H\x03\x14\xc1BxD\x1a\xa0\x0a\x16\xc2#\xd2\x00U\xb0\x10\x9e\x10i\x80\"\x20<\xc8*X\x08\x8f\x0c\x0fT\xc1Bxdx\xa0\x0a\x16\xc2\x13\"\x0dP\x84\xb3\xc2\xa3\xd4\x0c(\xc6Y\xe1Qj\x06\x14\xe3\xac\xf0(5\x03\x8aqVx\x94\x9a\x01\xc58,\x9a\\\xde\xa3\xdf.\x8a\x12\xbe\xd0x\x8e\xeaK\xe5m\xeb\x84~#\xd1\xa4)|\xc1\xa9O\xf2\xb6\x18\x13\xebt\xd5\xaf7\xe66\x10\x18=8/|\xb2R\xb3\xa0\xf0\x85u\xfa\xcd\xe1\xf1\x97\xc6\x1f\x96\x8fJd\x87\x9f\xff\xe1(\xe1\x8b\x8ae\x99\xab\xdf,\xf8\xeb/j\xcd7\xfe0\xa4'\xbc\xfc{\xa2\xc9\x83a\x8fh\x93\x0b\xdc\xcb\x08\x8c\x1e\x9c\x17\xde$n\x03H\xf0\x9dVo\x9e\xf9\x0f\xbbz\x901X\x08\x1f\x884\x00d\x1c\x16\xc2\x93\x8c4\xd8\xad\x03\x05\xb0\x10^\x8f4\x07w\xf7\x1d\xd9\xec;\xf2\x92\xfe\xaf\xf7\xf8v\xcbs\xc9K\xcd\x00H\x1d\x16\xc2\xcb\xe2\x9b\x857\xdf\xac\xee6\xff\xa5Vjv\xe0\x18\x01\x90.,\x84\xd7\xe9\xbdI_~\x1c\xf8\xd7}1\xe2\xa98\xa5f\x8f.!\x00\xd2\x85\x85\xf0\xc6\x1bO\x9d\xf1\x9e\x8dSj6u\xb1\xddd\x00\x12\xc2Bx\xe3,\xcd\xf9\x81^\xfb\xd3\x92\xa1R\xb3S\xe3\x84\xa8\xf2\x97\x08\x91\x7f\xab5\x10\xec\xa7\xc4n\x0c\x80\x04\xb0\x10\x9e\x12\xbe\xf1\x14*5\xf3\x1f\xf6\xe4\x1c\xa6]cw\x9d\xa0\xaeC\xde\xd2\xe9z\xb2\xc7\xb5\x96@z\xb0\x10>\xf1gi,\xa5f\xfe\xa5\xe5WK6\x9a\x8b\x11i\xc0\x20`!|\xe2\xcf\xd2XJ\xcd\xa8\xe7\xe1\xa2\xaa@\x96\x87\xf0`\x10\xb0\x10\x9e\x12G\x9ap\xa9\x19Q\x8b8\x14\x18Ax0\x08X\x08\x9f$\xd2XJ\xcd.\x14\xd6\x97|a.6\x84\xdf\xf9\xa9\xfd:\x00\xd8\xc3B\xf8$\x91&\\j\xd6_^O\xcb\xdcf\xa6q\xbb\x89\xae\x88&\xfbu\x00\xb0\x87\x85\xf0\x94\x20\xd2XJ\xcdz\x0e-/\xb8@\x1dy+\x0e\xdd\"Y\xba\xb7\xa5\xc5\xed\xfa,\xcej\x00\xd8\xc2B\xf8D\x91\xc6Rj&\x87\xabh\x85\x10cew\xd3\xad\x15\xf9\xb9\xd3\xdb\xedV\x01\x20.,\x84\xc77\x9e\x80*X\x08O\xf8\xc6\x13P\x04\x0b\xe1\xf1%n\xa0\x0a\x16\xc2#\xd2\x00U\xb0\x10\x9e\x10i\x80\"X\x08\x8fH\x03T\xc1BxD\x1a\xa0\x0a\x16\xc2\x13\"\x0dP\x04\x0b\xe1\x11i\x80*X\x08\x8fH\x03T\xc1BxB\xa4\x01\x8a\xe0\"<\x00J`!)\xc9\xa9\xf4\x1c\x0eVv\x07\x85o\x15\xcb\x0e4U\xe5\xc8+\x0d\x1f\x1d\xbb\xb4e\xff\xce\"\xa1\xbfbH\x13\x93\x1b[\x8a\x16\xc4\xf9\xa9`t\xc2B\xf8\xc4\x9f\xa5\x99(\xcf\xd1\x14\x9a\xe3\xa9\xc2}\x83\xfc7\xe4U\xb4e\xa47n\x0bkh\xafh\xa5\xa5\xf2\x0f\xc1\xb5\xe7\x1f\xd5D~\xe0\xf4KP\xf8\x9e&}\x8f\xef/\x9b\xa7\x0f\x1b\x0a\xa4\xea\x0d\xf9\xc6\x1e\xbe\xf0\x0b\xa2\xda\x82\xd8\x1f\x08F1,\x84O\xfcY\x9a\x89U\xed\xedK\x83\xc2k\x9f\x9a\x83\xda2\xe3\xeeA}\x17_\xd8H\xef\x8a.z\xba\xc6|\xe6\xd6\xfeJ\xb1\xd7\x18\x852\xfc\xd5\x86\xcaIyB\xae\xf1Y\xf1\xc4\x15;O\xf8\x8d\xbf\x01\x9a|\x85x4\x02\xd9\x04\x0b\xe1)q\xa4\xd1\xc5<\xb5\xd3\x1cO\x0d6\x11\x97\x9b\xb5~Uz\xd4)l\xa3v]\xdb:]\xf8v#\x91\xfb\x03O\x06\x85o/,y\xba\xc5\xeb6^\"\xd7w,\x9e,\x8a6\x1a{xy\xd0\x0a\xe1\xb3\x0c\x16\xc2'\x894\xcb\xc2\xe3\xa9\x8b\x02\x83\xdaI\xd2Y\xff\xc4\xa5\x11\xc2\x17\xae0\x9e\xac/5\xee\x82\xc2O.\xef\xd1o\x17I\xe1\xdb\xeb\xf4\xd5\xae7\xe66\x10\x84\xcfNX\x08\x9f$\xd2X\x85_\x1c\x18\xec\x15\x8d\xfam\xa3\x0c/\x16\xe1\x8b\x8a\xaf\xe9K\xfd\x81\x97EP\xf8\x12\xf9\xd0\xff\xb0\x14\xdec\x9e\xcdw\xcbMB\xf8l\x84\x85\xf0\x94\x20\xd2\xdcz\xa7p\xce!\xf34\xe3\xed\xc3F\xdf\xfc'\xc6\x83\x9a\x9c\xba\xd6\xba\x1c]\xf2S\xf9/\xf74j'{j\xdc\x17\xa8H\x14z\xdaZ\xdc\xb9\x1f\xe9i]\xbe\xd3\xba\xc5\xeb\xfdTZ\xbe\xb8\xe1\xf9\xa9\xa2\xe8\xc5w\xf5\xa1\xab\xbe\xb5\xa5V\x1c\xa0K^\xad\xf6]\xff\x89Z\xcd{)\xceO\x06\xa3\x11\x16\xc2'\x8a4\xc6giv\x19\xc3\x939\xc2\xd2B\xbf\xad\xccU\xd6\xe0'\x7f\x91\x10\x8dy\xc2\xd5$\xc4\x80\xae\xf9\xa6\xd9\xe7\x10i@\xe6a!\xbcN\xe79_\xb2)\x00\x0c\x1d\x87\x85\xd7\xe3\xcb\xf1\xed\xeb\xd6\xae]\xa3\xb3v\xcd\xda\xad\xafw#\xd1\x80L\xe2\xb0\xf0\xf2\xfc\xcc\xc2\xb9\xd5sM\xaa\xab\xa7\x9dG\xb0\x01\x99\xc4y\xe17\xcc8\xfe\xe5\xe7_\xea\xe87\xebf\x20\xc9\x83\x8c\xc2@\xf8\x8a\xf0\x19\xc9\xcd\xb3\xce\xc9k\x08#\xce\x83L\xe1\xbc\xf0/\xcc\xf80\xf4h\xfd\xac\xb3\x89f\x030T\x9c\x17~\xc3\xcc\xb0\xe4\xcf\xcd\xb4\x13\xbe\xe5\xc1\xf1e-S[\xe3\xf46\xa1\xac\x09\xa4\x81\xf3\xc2\xaf\xaf\xee\xfd\xc3?\xfe\xe3=\xfa\x7f\xff\xec\xdb=\xa3\xf3\xed\xb5\xbdo\xaf\x8d\x98\xb3M\xd4\xb4<%\xc4\xb68\xbdM(k\x02i\xe0\xbc\xf0\xeb\xaa\xfb\xd6\xfd\xfd\xdf\xff\x1f\xfd\xbf\xef\xfb\x9agt7/\xbc\xd9\\m\x9d\xf2\xd1\xd8z\xfdv\x95\x14\x9e\xeckl\x201\xeeB\xc2\x07;\x9et\xb4\x15O\x14\xe7W%\xe8d\x05\x20\x88\xf3\xc2o\x98\x19\xee\xef{if\xcci\xc9\xeb\xe25\xeb\x0a!\xe1C\x1dO\xb2\xaciJSc\x99\xeb\x14\x01\x90\x0c\x06\xc2W|\x1ez\xf8\xd2\xac\x987\x9e\xde7\xae\xe8\xee\xef\xe9\xb9e<\x0c\x0ao\xe9x\"mr\x0fQOi9\x01\x90\x0c\xe7\x85\xdf\xb4\xf0\xc95+W\xfe\xfa\xd7+W\xae\\S\xfdH\xcc\xd7@\xcc=|\x8d\x10b\xbf|\x18\x14\xde\xd2\xf1D\xda3r\xb8C\\#\x00\x92\xe0\xb0\xf0\x03D\xfbV\xfer~u\xf5\xc2\xc7\xab\xab\xab\xe7\xaf\\\xdb\x19\xf3\xe1\xb1\x092\xc3_j\x11u\xc6.>(\xbc\xa5\xe3)p\xd0\xea\x15\xc7\x08\x80$8,\xbcN_o\xb7\x8eo@\xde\xf6\xf6\xc6>_[$Mo\x89:-i\xe9x\"m\x95\\\xb2S\xa4P\xd5\x0d\xb2\x1d\xe7\x85'c?\xff\xc2\xc2\xcf\xe3|0\xd88\x0f\xefwG\x09o\xe9x\"\xadX\x7fI\xf4?\xe8\xb6]\x1d\x00+\xce\x0b?\xd0\xd7\xd7\xed\xf3\xfd\xdb\xb4#\xben_\x9f\xddG%\xb7\x88'Zk\x8dwZ-\xbdM\xe1\x8e'y\x96\xa6\xf2\xf0\xfe\xf2\xfc\x8fl\xd6\x05\x20\x12\xe7\x857\xe9M\xf0%\xee\x96\xc9\xb9\xe5m%m\x11\xbdM\xa1\x8e'\x9d\x07=\x8b\xf3\x8ak\xd0M\x06R\x80\x85\xf0>\xa2M\x8f\x9f%|*\x18d\x1c\x16\xc2\xeb\x87\xaaz\xa4!\x9b#V\x00\x86\x17\x16\xc2S\xe2H\x03\xc0\xb0\xc1Bx\\j\x0f\xa8\x82\x85\xf0\xb8\xd4\x1eP\x05\x0b\xe1\x09\x97\xda\x03\x8a`!<\"\x0dP\x05\x0b\xe1\x11i\x80*X\x08O\x884@\x11,\x84G\xa4\x01\xaa`!<\"\x0dP\x05\x0b\xe1\x09\x91\x06(\x82\x85\xf0\x884@\x15,\x84O\x10i\xb0\xe7\x07\xc3\x0a\x0b\xe1)\x8e\xd8\xd8\xf3\x83\xe1\x86\x85\xf0\xf1\xc4\xc6\xc1,\x18nX\x08\x8fH\x03T\xc1Bx\x8a/\xf6\x91\xdd\x11\xd7\xdd\x03`h\xb0\x10>&\xd2\xec\xf1u\xf6\xfa\xfa\xfaz\xfb\xfa6T\x9c\x95w}\xd4\xd7\xdb\xeb\xc37D\xc0Pa!|L\xa49\x12\xfa\xba\x1f\xda\xfd\xc0\xb0\xc2Bx\x8a\x8e4\x90\x1cd\x08\x16\xc2\xc7\x9e\xa5\x91u\x96\xbb7mxn\xfd\xb3k\xd7?\xb7~\xc3\xeb\xcd\xa8\xb3\x04\xc3\x02\x0b\xe1c\xcf\xd2\xe8\xc3\xad\x0bg?6kV\xf5\xfc\xd9\xb3f=V=\xe3\"NN\x82\xe1\x80\x85\xf0\x14s\x96F^Ux\xda\x91\xf3g\xcf\xdf\xa4\xcbg\xcf\x9f\x7fv\x1a\xea,\xc1\xb0\xc0B\xf8\xd8Hc\\F\xfb&\xc9K\xad\xca\x87[+\xe4u\xe3\xe1<\x182,\x84\xb7\x8d4/\xcc\x94u\x96?\xba\xe3\xa0\xfe\xe8\xb9\x99\xe7\xe2\xad\x0b@:\xb0\x10\x9el#\x8dQay\xff\x1d\xf2v=\xea,\xc1\xf0\xc0Bx\xdbH\xb3~n\xf7\xee\xfb\xee\xbd\xfbk?\xb8\xef\xe7}o\xcc\xe8<\xb8\xc1w|s\xc4Z\xa8\xb3\x04\xe9\xc3Bx\xdbH\xb3\xaez`\xed7\xbe\xfeww|\xe3\x1b\xdf\x91u\x96\xbb\xab\xbb\xf7\xfc\xd2\xba\x12\xea,\xc1\x20`!<\xd9F\x9a\x8a\x8b\x9d\xc7\x8f\xdf\xfb\xf5\xed\xc7\xdf\xa3\x97f\x9e\xef>O\xdd\x97\xadSPg\x09\x06\x01\x0b\xe1m#\x8dYgy\xaf\xcc\xf0\x03\xa8\xb3\x04\xc3\x04\x0b\xe1m#\xcd\x86Yr\x87>\xeb{R\xfbM3cNK\xa2\xce\x12\x0c\x06\x16\xc2\x93}\xa4\xf9R\x1f\x98\x9d\xad\x9b+Pg\x09\x86\x05\x16\xc2\xdb\xbf\xf14\x7f\xcd\xfag\xd7m\x7f\xe3\xb9g\xd7\xad\x9f\x8f:K0<\xb0\x10\xde6\xd2\xecy\xb2z\xee\xec\xd9\x15\x15\x15\xb3g\xcf}reg\xcc\xdb\xac\xa8\xb3\x04\x83\x80\x85\xf0d\xf7\x8d\xa7\xde\xce\xcb\x17/_n^\x7fZ\xbf\xeb\xb4\xf9\xda\x13\xea,\xc1\x20`!|\x82/q\xaf\x9du>\xceGhPg\x09\x06\x01\x0b\xe1c#\x0d\xc9\xc3U_\xaf\xcf\xf7\xd2\xfc\xb3\xbe\xde>\x9f\x9d\xf3\xa8\xb3\x04\xe9\xc3Bx\x8a\x7f]\x9a\x83\x7f\x88-\xa3\x0f\x82:K\x906,\x84\x8f\x17i|Dkf\x1e\xc7\x17\xfe\xc0\xf0\xc1Bx\xdbH\x13X>\x1f\x17b\x02\xc3\x08\x0b\xe1ip\x91\x06\x80\xb4a!<.\xb5\x07T\xc1B\xf8\x04b\xe3R{`Xa!<\xe1\xea\xc1@\x11,\x84G\xa4\x01\xaa`!<\"\x0dP\x05\x0b\xe1\x09\x91\x06(\x82\x85\xf0\x884@\x15,\x84G\xa4\x01\xaa`!<\xc5\x17\x1b\xc2\x83a\x85\x85\xf0\xf1\"\x0d2<\x18nX\x08\x9f\xe8\xb34\xc8\xf0`8a!AtA\xa9\x19\x18VX\x08\x1f\x13]Pj\x062\x04\x0b\xe1):\xba\xa0\xd4\x0cd\x08\x16\xc2\xc7D\x1aH\x0e2\x04\x0b\xe1c\xcf\xc6\x0c\xa0\xd4\x0cd\x04\x16\xc2\x93\xdd\xa5\xf6Pj\x062\x00\x0b\xe1\xed/\xb5\x87R30\xfc\xb0\x10>6\xd2\xf4\xa1\xd4\x0cd\x04\x16\xc2\x93]\xa4A\xa9\x19\xc8\x00,\x84\xb7\x8f4\xc9J\xcdN\xce\x99\x907\xfd@\xd9\xa1\x88\x85\x91\xfdf\xfb\x0bZcV\x03Y\x0d\x0b\xe1m#M\xb2R\xb3cZU\xcb\xae\x05BDV\xf5E\xf6\x9b\xb5\xbaZ\x02\xa3\x03\xb8\x840\x90\xb0\x10\x9e\xec\"M\xb2R\xb3J\xb7\x9f\xc8_+b\xba)\xaduO\xfe\xe0\xe0\xd1%\xd1\xd3@V\xc2Bx\xfbH\x93\xa4\xd4lb\xbd\xbc=)\x82\xfb\xf0\x10v\xfdf4uq\xec2\x90\x85\xb0\x10\xde6\xd2$+5[R(\xcb\x9b\xfc{\xbbh\xb9\x18\xb7mY\xb8\xbe,(\xfc\xf5\\!r\xe4\xc5\xb3\xa95p\xb1\xd5)1\x1b\x01\xd9\x06\x0b\xe1\xc9\xb6\xe3)q\xa9\x19}R\x92S\xe99\xdc\xaf\x8f\xfe\xd28N\x94<\xef)\x09\xd4\x97\x85\xf6\xf0\xed^\xefx\xa3\x04\xa4\xeb\x90\xb7t\xba\xd7\xeb\xfd\x80@\xb6\xc3B\xf88\x91&a\xa9\x19\xd1\xb5\xe7\x1f\xd5D\xbe\x11\xe1\xb5\x897\xf4=z\x89Y_f\x8d4\xb9\xc1\xaaVD\x1a`\xc0Bx\xfb7\x9e\x12\x97\x9a\x19\xdc\xda_iv}\xd4\xc9G\x0df}\x19\x84\x07\xf1a!<\xd9E\x9ad\xa5f\xed\x17\xe4\xad\xdfh1\x8b\xa8/\x83\xf0\x20>,\x84\xb7\xfd\xc6S\xb2R\xb3\xc2\x15\xc6]})E\xd5\x97\xc5\x17~\xe7\xa7\x04\xb2\x1c\x16\xc2\xc7F\x9a\xd0\xf2\xf8\xa5fE\xc52\xc0\xf8\xa7.\xd2o\xb5\xa2.\xfd\xd0t\x92Y_f+\xbc[\x7f\xeeJ\xec9{\x90m\xb0\x10\x9e\xec\xbe\xac\x9d\xac\xd4\xacH\x14z\xdaZ\xdc\xb9\xb2\xb3L\x96\xcc\xef,\x95\xf5e\x96~\xb3\xfew\xbc\xde\xf1\xb5^\xaf\xb1\xdb\xf7h[Z\xdc\xae\xcfb7\x03\xb2\x0b\x16\xc2'\xb8.M\xfc\x06\x90Gw\xd6\xff\xccU0\xcf\xe8\xe8\xd3V\xd7\x06\xea\xcb,\xfdfGs\xcc\xe1\x0e9\xe3\xd6\x8a\xfc\xdc\xe9\xed\xb6\x1b\x02\xd9\x04\x0b\xe1\xe3E\x9a\x94K\xcd4\x0f\x01\x90\x0a,\x84\xa78\xd7\x9f\xe9K\xb5\xd4\x0c\xc2\x83\x14a!\xfc\xa0\"\x8d\x15\x08\x0fR\x84\x85\xf0\x09\xce\xd2\xa4r\xa9\xbd\x0b^\xad\xf6]?\x01\x90\x1c\x16\xc2\xd3\xd0.\xb5\xb7\\?2\xd5>I6\x0b\x00b\"|\x82H\x83\xab\x07\x83a\x85\x85\xf0C\x8c4\x00\xa4\x0c\x0b\xe1ih\x91\x06\x80\x94a!<\"\x0dP\x05\x0b\xe1\x11i\x80*X\x08O\x884@\x11,\x84O\x10]\x20<\x18VX\x08\x1f/\xba\x20\xc3\x83\xe1\x86\x85\xf0\x94\xe0\xb34\xc8\xf0`8a!<\"\x0dP\x05\x0b\xe1\x13\xec\xc9Qj\x06\x86\x15\x16\xc2S\xf4\x9e\xbcW\xdf\xdb\x9b\xdfx\xdaP\xf1\xa1\xef\xa6,5#Dy0\x0c\xb0\x10>A\xa4A\xa9\x19\x18VX\x08\x8f\x83S\xa0\x0a\x16\xc2S\xcc\xc1\xa9\xbe\xb3?\xbe}\xdd\xda\xb5kt\xd6\xaeY\xbb\xf5u\x94\x9a\x81a\x81\x85\xf0\xb6\x97\xda\xdb\xbcpn\xf5\\\x93\xea\xeai\xf1.\xd6\x01@Z\xb0\x10>6\xd2\xe8\xc3\x0d3\x8e\x7f\xf9\xf9\x97:\xfa\xcd\xba\x19(5\x03\xc3\x02\x0b\xe1\xc9\xf6\xea\xc1\x15\xe1E\x9bg\xc9\xab\x07\x0f\xe0\xf8\x15\x0c\x15\x16\xc2\xdbF\x9a\x17f|\x18zdw}x\x00\x06\x01\x0b\xe1\xed#\x8d\xa5\xc8\xec9\xbbR\xb30\x91Mf\x01\x96\x8b\x1c\\Y\x0fD\xc3Bx\xb2\x8b4\xeb\xab{\xff\xf0\x8f\xffx\x8f\xfe\xdf?\xfbv\xcf\xe8|{m\xef\xdbk\xe3\xac\x1c\xd9d\x16Z\x88\x8bw\x80\x18X\x08o\x1bi\xd6U\xf7\xad\xfb\xfb\xbf\xff?\xfa\x7f\xdf\x97\xa5f\xcd\x0bo6W\xc7\xdf\x84]\xb1\x13\x84\x071\xb0\x10\xde>\xd2\xcc:\x7f\xf3\xec\xc7\xe7?>\x7f\xf62m\x9a\xf9\xb1\xaf\x93|\x09>V\x03\xe1AJ\xb0\x10\x9el\x9b\xb8\x8dR3\xf3\x91\xedA\xeb\xd5\x9a\x09\xc5\xabWOp\x19I=$\xbc\xff\x95)\xae\x87\x1b\x8c\xcb2i+\x9e\x08W\x9d\x01\x20a!\xbcm\xa4\xd90\xb33\xf4\xf0\xa5\x99\xb1\xa7%\xfb\x1f,l\xf0\x8c\xcf\xddY\xf9\xb2|\x14\x12~\xa9V\xbf\xb7^\xab\x95Cy\x11\xed\xc6\xb2@\xd5\x19\x00\x12\x16\xc2\xdbG\x9a\x8a\xcf\xf5\xc1\x80\xb1\xf0\xa5Y\xb1o<5\x89\x93\xb2\xd6)\xa0sP\xf86\xd1\x16\xba\xd5&\xf7\x10\xf5\x94\x96\x13\x00AX\x08Ov\x91f\xd3\xc2'\xd7\xac\\\xf9\xeb_\xaf\\\xb9rM\xb5M\xa9Y]\xbe~\xf3Q\xb0\x978(|m\x99q\xf7\xa0\xdc\xc5k\xcf\xc8\xe1\x0e\xb3\xea\x0c\x00\x09\x0b\xe1c#\x8d>\xdc\xb7\xf2\x97\xf3\xab\xab\x17>^]]=\x7f\xe5\xda\xd8k\x08\xbf<\xf6\xaa\xdc\x95G\xed\xe1\x8d\x8e3\xa2*\xb9[\x8f\xa8:\x03@\xc2Bx\xdb\x8f\x07\xf7\xf5v\x7f\xd5\xdd\xbdg\xc3\xb9\xee/\xbb{{cW\xfa4\xa7\xf2\xd3\x93\xa5\xe5\x81\xab\x06\x87\xf6\xf0\x93\xe4\x02\xff\xc4\xa5\x14Uu\x06\x80\x84\x85\xf0\x14\xffK\xdckf\xc6\xfb\x9c\xfc1Q$\x84\xfbB\xe0QP\xf8\xbdB\x96\xcd7\x9a\xed\xad\xc5\xb7\xe4\xb1\xad\xdbvu\x90\x9d\xb0\x10\xde\xf6\x1bO\x03}}\xbd>\xdf\xf6\xc7\xcf\xfaz}}6\xce\x1f\x1b\xbf\x7f\xaf\xf7\x82\xb1\x83\xb74\x99QMN]k]N\x8d\\\xac\x89\xca\xc3\xfb\xcb\xf3?\x8a]\x17d-,\x84\x8f\xf7\x8d'\xfd\x15p\xf0\xf5x\xd7\xa59\xa4\xc9\xc62m\xfa\xa9\x88&3\xf2o+s\x95\x99\xe7\xe1\x1f\xf4,\x0eT\x9d\x01\x10\x80\x85\xf0\x14'\xd2\xf8\x88~=#N\xa9\xd9\x15\xd7\xb2+\xb7o_?\xba\x20\xff\xba\xdd\xd3\x00\xd8\xc2B\xf8x_\xe2\xd6w\xf9\xdb\x1f\x8f\xf3]\xa7\x96|\xf3p\xd5_\xd4f\xf74\x00\xb6\xb0\x10~0\x91\xe6X\x8eyB\xf2T\xce\x09\xbb\xa7\x01\xb0\x85\x85\xf04\x88K\xed\xf9ks\x975\x1dhZ\x96\xbb\x0cuf\x20uX\x08?\xa8K\xed\xf9[+\x8b\xb5\xe2\xcaV\xf8\x0e\xd2\x80\x85\xf0\x09\"\x0d\xae\x1e\x0c\x86\x15\x16\xc2\xd3\x20\"\x0d\x00\x83\x81\x85\xf0\x83\x8a4\x00\x0c\x02\x16\xc2#\xd2\x00U\xb0\x10\x9e\x10i\x80\"X\x08\x8fH\x03T\xc1BxD\x1a\xa0\x0a\x16\xc2\x13\"\x0dP\x04\x0b\xe1\x07\x11i\x10u\xc0\xa0`!|\xba\x91\x06Q\x07\x0c\x16\x16\xc2S\x9a\x91\x06Q\x07\x0c\x16\x16\xc2#\xd2\x00U\xb0\x10>\xe5H\x13h\xf7\xd39\xf8\xc6\xe7>\x1f\xda\xfd@\xba\xb0\x10\x9e\xd2\x8f4\x9bf\xa3\x13\x04\x0c\x02\x16\xc2\x0f\"\xd2\xa0\xce\x12\x0c\x0a\x16\xc2\xa7\x1ci\xe4\x10\xed~`\x08\xb0\x10\x9eR\x8e4}h\xf7\x03C\x82\x85\xf0\xa9G\x9a>\xb4\xfb\x81!\xc1B\xf8\xd4#M\x1f\xda\xfd\xc0\x90`!<\xa5\x13i\xd0\xee\x07\x86\x00\x0b\xe1\xd3\x8b4\xc9\xdb\xfdZ\xe4e\xc8&F\x7f\xbb{\x7fA\xab\xddd\x90U\xb0\x10>\xadH\x93B\xbb_\xd7!o\xde\xa2\x98\xe2\x8fVWK\xf4\"\x90u\xb0\x10\x9e\xd2\x894\xa9\xb5\xfb\x15\xad\x8e]\x86\x0bz\x00\x1e\xc2\xa7\x17iRj\xf7\xb3\x13\x1e\x00\x1e\xc2\xa7\x15i\x92\xb6\xfb\x19\x98\xc2\x87+\xfd\xae\xe7\x0a\x91#/\x1dO\xcb\x85\xb6s\xd5\x03\xae\xca\xe0\x95\xe5AV\xc1BxJ'\xd2$k\xf731\x85\xb7T\xfa\xb5{\xbd\xe3\x8d\x0a\x9c\xbf4\x8e\x13\x05\x9e\xdf\xe6-\x88]\x09\x8c~X\x08\x9f^\xa41\xda\xfdL\xec\xda\xfdL\x0c\xe1\xad\x95~:\xb9\x81\xa2b-_\xdf\xbb\xd7\x14\xd8\xae\x07F9,\x84O+\xd2$k\xf731\x84\xb7V\xfa\x91ExY\x00\xe5\xd1l\xd7\x03\xa3\x1c\x16\xc2S\xca\x91f\x20y\xbb\x9f\x89!\xbc\xb5\xd2\x8f,\xc2\xcb{\x08\x9f\x9d\xb0\x10>\xf5H\xa3\xd3\xd7\xdb\xad\xe3\x1b\x90\xb7v\xed~\xb7?\x90\x07\xa9\x13\x8c=\xbc\xa5\xd2\x8f\x20<\x20&\xc2\xa7\x1eiB\xcb_X\xf8y\x9c}\xfb+\xc2KtUl\xa3\xc8J?\x82\xf0\x80\x98\x08O)G\x1a2\xda\xfd\xba}\xbe\x7f\x9bv\xc4\xd7m\xdb\xeew@\xcci\xd9U>\xe139\x0eW\xfa\xf5\xbf\xe3\xf5\x8e\xaf\xf5zo\xd0%\xafV\xfb\xae\xffD\xad\xe6E\xddY\x16\xc2B\xf8\xb4\"\x8dIo\xfc/q\xb7Lu\xe5W\xbdo\x0c\xc3\x95~Gs\xcc\xa2\xbf\x1d\xb4\\v\xff\xbd\xef\xd2o\x97\xc7\xdd\x04\x18\xb5\xb0\x10>\xddH\xe3#\xda\xf4\xf8Y\xfbv?\x00\x12\xc1BxJ'\xd2\x90\xbcx\x01\xe9\x91\x86l\x8eX\x01H\x0c\x0b\xe1\x877\xd2\x00\x10\x1f\x16\xc2\xa7\x1bi\x12\xbc@\x00H\x08\x0b\xe1)\xcdH\x13o9\x00\xc9`!\xfc\x20\"\x0d.\xb5\x07\x06\x05\x0b\xe1\x11i\x80*X\x08O\x884@\x11,\x84G\xa4\x01\xaa`!<\"\x0dP\x05\x0b\xe1\x09\x91\x06(\x82\x85\xf0\x884@\x15,\x84G\xa4\x01\xaa`!<\x0d5\xd2\\\xbe\xfcyg\xd4\x06\xba;/\x7f\xf5%^\x12\x20\x0a\x16\xc2\x0fc\xa49\xb8=\xde\x97\xfe\x00\x20&\xc2\x0fW\xa4\xd17\xb0i.\x0efA\x02X\x08OC\x8d4a\xba;\xb1\x7f\x07\x09`!\xfc\xf0D\x9a\xbe>__\xdf\xf1=_\xeaw\x03\xb0\x1e\xd8\xc3B\xf8\xe1\x8a4:/=v\xd1f)\x00\x01X\x08O\xc3\x17i\x06\xc2\xd7\xe1\x03\x20\x16\x16\xc2\x0f=\xd2\xe8\xab\x9e\xde\xf3\x87\xed[7\xbf\xd9\xbc}\xeb\xd6\xed\xcd\xfbn\xda\xaf\x06\xb2\x1d\x16\xc2\x0f=\xd2\xe8\xabn\x9f?k\xe6\xb4\x19\xd3$3\xe7W\\\xc4\xb9\x1a`\x07\x0b\xe1i\xc8\x91F\x1fn\x98v\xf0\xf4{\xa7\xdf\xd39}z\xcd4\xb4\xfb\x01[X\x08?\xf4H#\x85\x9f\x1d\xbe\x8a\xc1\xd6\x8as\xf2\"\x1ep\x1eD\xc3B\xf8a\x894\x96\xb2\xb3\xbe\x0d3\xcfE\xaf\x03\x80\x84\x85\xf04,\x91fFHxZo\xdf\xee\x07\x00\x0b\xe1\x87%\xd2\xac\x9f\xdb\xbd\xe7\xc7?\xfe\x89\xfe_E\xdf\xeb3??\xb2\xddw|k\xe4\xe7jNU\xba\x0ak\x0e\x14^\xa1Z!\x84\xeb\x0c\x81,\x84\x85\xf0\xc3\x12i\xd6U\xd3\x9a\xaf}\xed\xef\xf4\xff\xbe%\xdb\xfd\xde\x98\xdb\xbd;\xb2\x1f\xa4\xcd\xf5\xe8\xce\xc62!>\xa0\x0b^o\x83x'z\xab\x20\x1b`!<\x0dK\xa4\x99}\xf9b\xf3\x9e}{\xf65\x1f\xa4\xcd3.v\x9e\x1e\xe8\xfc\xd0z\xf5\xc9ky\xf3n\x11u\x95\xea\xc2\xeb\xb4C\xf8\xec\x84\x85\xf0\xc3\x12i,\xed~\x03v\x19\xbe.\xd7\xb8<\xf6\x16ad\x19\x08\x9f\xa5\xb0\x10~X\"\xcd\x86Y\x17\xcd%\xfa\xcd\xa6\x19\xe7\xe4\xa5V#6X\xfa\x84qwu\xcb-y\x17\x12\xde\xbf\xab\xdc\xf5\xc0\xea\x1e}tcq\xb1VRu\x92\xd0l9\x9aa!<\x0dO\xa4\x09obsE\xcc\x1bO\xb7r\xb6X\x1f\x86\x84\xaf\xcdY\xb1w[\xc1T?Q\xabXv\xa0\xa9*\xa7\x1d\xcd\x96\xa3\x19\x16\xc2\x0fK\xa4\xd9P\xbdn\xf3\x0b\x9bt^\xd8\xb4\xf9\x97\xb1\xed~\x9f\x88\x16\xeb\xc3\xa0\xf0\xadb\x97\xf1\xa8\x91\xa8\xa7\xa9K\xdf\xe1\x97\xcd\x93\x8b\xd1l9Za!\xfc\xb0D\x9a\xe6\xc7\x1f\xab\x98aR\xf1\xf8\x93\x9fGo\xad\x7f\x9c\xed\x1e~\xc9\xa4\xfe\xdb:\xc5\xb2\xd9\xf2jC\xe5\xa4X\x1a\x08\xeeK\xe4\xd26\xf7\x84\xfc\xe92\xd8\xfb\xb7\x94j\x05K^+\xd5\xdch\xb6\x1c\xbd\xb0\x10~x\"\x0d\x00\xc9a!<)\x894\x000\x11^Q\xa4\x01\x80\x87\xf0\x884@\x15,\x84'D\x1a\xa0\x08\x16\xc2#\xd2\x00U\xb0\x10\x1e\x91\x06\xa8\x82\x85\xf0\x84H\x03\x14\xc1BxD\x1a\xa0\x0a\x16\xc2#\xd2\x00U\xb0\x10\x9e\x10i\x80\"X\x08\x8fH\x03T\xc1BxD\x1a\xa0\x0a\x16\xc2\x13\"\x0dP\x04\x0b\xe13\x1di\xf4\x0d\xbf\x8d:K\x20a!|\xa6#\x0d\xfe\"\x80\x20,\x84\xa7\xccG\x9a\xb4\xfe\"\x80\xd1\x0b\x0b\xe1\x15D\x9a\xb4\xfe\"\x80\xd1\x0b\x0b\xe1\x11i\x80*X\x08O\x884@\x11,\x84G\xa4\x01\xaa`!<\"\x0dP\x05\x0b\xe1\x09\x91\x06(\x82\x85\xf0*\"\xcd\x9b_\x0d\xf8h\xa0O\xfeK\xeb\x95\x02F\x17,\x84W\x14i\x00\xe0!<\xa9\x884\x89g\xb7\x94_I\xf8\xfc\x90\xb8V\x1eqmz\xe0\x20,\x84W\x10i\x0e\xee\xee;\xb2\xd9w\xe4%\xfd_\xef\xf1\xed136\x0a\x8f?bA\x1a\xcd\x96\xcbEN\x93\xfd3_,+\xca\x9d\xa3o\xd7\xffb\xceF\xfb\x19\x83\xe4\x13MLN6\x07\xd8\xc2Bx\x05\x91\xe6\x85\x857\xdf\xac\xee6\xff\xed\xf9e\xf4\x84m9\xbb\xa2\x96\xa4\xd1ly\xc1k\\k\xd8\x06w\xe1\x8e\xa5\xb9\xd7\xe5h\xef\xb8m\xf6S\x06\x87\xff\xddZ\\\xd9xp\xb0\x10\x9e2\x1fizo\xd2\x97\x1f\x07\xfeu_\x8cz\xb2C\xab\x0b\x0e\xaf\xba\xaf\x06\x87\xa9\x17\xfd\xc5\x11\xfe\x9a\xd8F\xfe.s\\\xaf\x0doC\x1a.\xe5=HX\x08\xaf\x20\xd2\x1cy\xa33\xfe\xf3\xb5\x85=\xc1\xe1)q*8\x1c\xb2\xf0gDkh\xdcUXk;g\xb0@\xf8A\xc2Bx\x05\x91fs\xf5\xf9\x81\xde8\xa7%\xfb\xf3\x9e6\x07\xdbJ[?\x10\x1f\xec-}\xc5x\x14\x14>\\gI\x93\x03\xd7\xd9\x9eN\xad\xfa\xed3\xe4\xd1o\xf5\xfc\xae\xadx\xa28\xbf\xea\x8c\x11\xe7w\x05\x02v\xff\x04s\xea\xaa\xc0\x0f\xa9\xcf\x0d\xbd\xa8\x02Xk2\xc7m[\x16\xdcBhh\xa9\xd4\x8c\xe8\xd1\xbcPS\x9c\xbf\x08\x91f\x90\xb0\x10\x9e2\x1fi\x12\xfdE8!\xbc\xe6\xe0B\x8dxP\x94\x89E\x9f\x19\x8f\xc2E\x7f\xc1:K\xd2j\xbd:\xe5b#\xf5\x1c*Yv\x85\xae\xd4\xe7y\xf5\xcc\xa2\x89)M\x8de\xaeSf\x9c\x0f\x04\xec\x13\xdeF\xe1\xf1\x86*\x15\x0e\x89\xc3Q?6\xb2&\xb3\xe4yO\x89\xbe\x05\xcb\xd0R\xa9i\xed\xd1<\x93\xf7\xc0k-\x95\x02\xc2\x0f\x0e\x16\xc2+\x894\xf1\xff\"\xec\x15\x1f\x05\x87m\x9a\xd0\xda\x02\xe3\xa0\xf0\x96:K\xcf1}T+\x8c\x03P\xcf\x14\xfdf\xa9\x11T\xb4\xc9\xfa^\xb8\xa7\xb4\x9c\"\xbbr\xac\x91\x86.\x88\xe8S\x93\x115\x99\x13o\x10]/)\x8f\x18Z*5-=\x9a\xd3K{\xe4j\x10~p\xb0\x10^I\xa4\x89\xff\x17\xa1E|b\x0e\xae\xad\xd2\x8aE\xf1\xf8\xa7\xbe0\x1e\x852\xbc\xa5\xceR\x8f*\x8b\xc7\x9agt.\x8c}\x9fn\xe5\xed\x97C\xed\x19y\xbbC\\K(|\xcc\xb9KkM\xa6q\xd4\xdc`l!4\xb4Vj\x86z4\xaf\x8b\x9d\xf2\xf9z\x08?8X\x08O\xceF\x9aw\x83fo\x9c\xb0\xe3\x94\xf8\xcb\xb6\"\xf3\xa4yPxk\x9d%\xf5\xcc\xd1\x82{\xea\xca\xd5\xd4\x96\xdf/G\xe6A\xabW\x1cK\x20|\xbb8D\x91\xc4\xd4dZ\xb6`\x0c-\x95\x9a\xe1\xed\xb6\x9b\xf9\x0b\x07\xad\x83\x84\x85\xf0\x0eG\x9a\x9e\xd0Y\x96~\xe3,M\xbf\xf9\x1eTPxk\x9de\xd7\xf4\xf1\xc1\xc4C\xad\x13\xfa\xcdDC\x9aqd\xbaS\xdc\x08\x88Yo#\xbcG\xeb\xa2H\"j2-[\x08\x0d-\x95\x9aa\xe1\xbf\x10\x0d\xf2\xf9\xa5\x10~p\xb0\x10\xde\xe1HC\x8bJCo\xb3~\x96\xffYp\x18\x14\xdeRgym\x8aK\xee_[\xddry\x7fQk\xbe\x91hH+\xbe\xa5?|P.u=\xad\xcf}4Vx\xff\xe4\xaa\xe0\xf0\x93\x8d\x1d\xd1\xdb%\xadH\x7f9tMrG\x0c-\x95\x9a\x96\xbf\x1c\xe5%z\xee\xf9h<\x84\x1f\x1c,\x84'g#\x0d\x9d\xc9\xf9m\xf4\"K\xb3e\xb8\xce\xf2z\x99\xd8(O\xd3\xc3Zj\x06\xd4\xc1Bx\xe7#M\xfa\x0cg\xa9\x19P\x07\x0b\xe1Gb\xa4\x01#\x13\x16\xc2\xd3\xc8\x8b4`\x84\xc2B\xf8\x91\x18i\xc0\xc8\x84\x85\xf0\x884@\x15,\x84'D\x1a\xa0\x08\x16\xc2#\xd2\x00U\xb0\x10>\xd3\x91\x06\x80\x20,\x84\xa7\x0cG\x9a\x01\x94\x9a\x81\x00,\x84\xcft\xa4I\xf7\x05\x02F/,\x84W\x10i\xd2z\x81\x80\xd1\x0b\x0b\xe1)\xf3\x91&\xdd\x17\x08\x18\xa5\xb0\x10\x1e\x91\x06\xa8\x82\x85\xf0\x884@\x15,\x84'D\x1a\xa0\x08\x16\xc2#\xd2\x00U\xb0\x10\x1e\x91\x06\xa8\x82\x85\xf0\xa4\x20\xd2\xa0\xd4\x0cHX\x08\xaf(\xd2\x00\xc0Cx%\x91&\xf1n\x1d\xa5fY\x02\x0b\xe1)\xf3\x91\x86g\xa9YR\xe2\xb4\x9e\x81A\xc3Bx\x05\x91\x86g\xa9Y\x98\x03\xc7\xc8\x8e8\xadg`\xd0\xb0\x10^A\xa4aZj\x16\xe2\xd1%\xf6\xcbq\x01\xa7a\x86\x85\xf0\x94\xf9H\xc3\xbd\xd4l\xea\xe2\x84O\x83\xe1\x82\x85\xf0\x0a\"\x0d\xc3R3\xf2V\x96hEsJ\xfc\xc6\xc6$S\x88N\x8e\x13\xa2\xfeL\xcd\xc4\xdc\xca\xdb\xf1Z\xcf\xae\xd6L(^\xbdz\x82k\x10W\xc3\x04<\x84W\x10i\x12\xbd@\x1c*5;:vi\xcb\xfe\x9dE\xe26u\x1d\xf2\x96N\xd77\xfc\x81,\x94j,)\xcd+YU3\xf6\xd38\xadg\xfd\x0f\x166x\xc6\xe7\xee\xac|\x99@\xfa\xb0\x10\x9eTD\x9a\xf8/\x10\x87J\xcd\x1a\x0a\xe4\xb5X\x1b\xf2\x8d\x98n\x894S\x85\xfb\x06\xf9o\x98\x0fb[\xcf\x9a\x84\xfe\xc7\xa6!\x9c\xbc@Z\xb0\x10^I\xa4\x89\xff\x02q\xa8\xd4\xec\xb3\xe2\x89+v\x9e\xf0\x1b-Q\x11\xc2k\x9f\x86'\xc5\xb4\x9eQ]>\xc9K\xd3\xe3\xec\xcd\xe0`!\xbc\xc3\x91\xc6\xa9R\xb3\xeb;\x16O\x16E\x1bc\xf6\xf0S,sb;q^\x1e{U6$`\x0f?8X\x08O\xceF\x1a\x87J\xcd\xda\xeb\xf4\x9fs\xbd1\xb7A>0\x84\xdfi\xec\xda\xa7.\xb2L\x8a\x15\xfe\xd3\x9c\xcaOO\x96\x96\xe3|\xe5\xe0`!\xbc\xc3\x91\xc6\xa1R3\x8f0^;n\xa37\xc7\xad\xaf|\xc5L=\x11g(c\x85?&\x8a\x84p'>\xab\x0f\xe2\xc2Bx\x87#\x8dC\xa5f\x1e\xe1\xaaom\xa9\x15Fo\x8eG\xdb\xd2\xe2v}F\xb7\x0f\x1b'l>\x91\xcb\xec[\xcf\x8e\x8d\xdf\xbf\xd7{\x01;\xf8A\xc2Bxr6\xd28Tj\xb6k\xba\xa7D+t\x9b=Q\xb7V\xe4\xe7No':i6\x9d\x19\x7f\x0e\xec[\xcf\x0eir\x996\x1d!~P\xb0\x10\xde\xe9H3\x92J\xcd\xae\xb8\x96]\xb9}\xfb\xfa\xd1\x05\xf9\xe8\x1f\x19\x0c,\x84w:\xd2\x8c\xa4R\xb3\x16\xf3\xbc=\xf9\x8bBG\xcf\x20\x0dX\x08ONG\x9aA\xe0T\xa9\xd9\xb1\x1c3\xcb\x9c\xca9\x91d&\xb0\x83\x85\xf0\x8eG\x9a\xf4q\xac\xd4\xcc_\x9b\xbb\xac\xe9@\xd3\xb2\xdce\xc3\xf6G#\xab`!\xbc\xf3\x91&}\x1c+5\xf3\xb7V\x16k\xc5\x95\xad\xf0}P\xb0\x10\x9eF`\xa4\x01#\x13\x16\xc2\x8f\xc0H\x03F(,\x84\x1f\x89\x91\x06\x8cLX\x08O\x884@\x11,\x84G\xa4\x01\xaa`!<\"\x0dP\x05\x0b\xe1)\xc3\x91\x06\x80\x20,\x84\xcft\xa4\x19@\xa9\x19\x08\xc0B\xf8LG\x1a\xfcE\x00AX\x08O\x99\x8f4i\xfdE\x00\xa3\x17\x16\xc2+\x884i\xfdE\x00\xa3\x17\x16\xc2#\xd2\x00U\xb0\x10\x9e\x10i\x80\"X\x08\x8fH\x03T\xc1BxD\x1a\xa0\x0a\x16\xc2\x13\"\x0dP\x04\x0b\xe1UD\x1a\x94\x9a\x01\x09\x0b\xe1\x15E\x1a\x00x\x08O*\"M:\xb3\xc1\xa8\x85\x85\xf0\x0a\"M\xdcR3\xef\xd8\xc0\xc5\x95\xc6\x9f\x8c\xbb~\x98\x93s&\xe4M?Pv(y\xebY\xfc\xaa3\xe0$,\x84W\x10i\xe2\x96\x9a\xdd:T8G^>o\x97H\xe1:/\xc7\xb4\xaa\x96]\x0b\x8c\xd6\x8fd\xadg\xf1\xab\xce\x80\x93\xb0\x10\x9e2\x1fi\x12\x94\x9aM4.\x98\xf7Q*\xc2W\xba\xfdF#\x82\xb9\xefNR\x02\x05\xe19\xc2Bx\x05\x91&A\xa9\x99)|\xff\xb6\x1b\xf1&\x84\x99h\\z\xe9d\xa0\x8d\x00\xc2\x8f@X\x08\xaf\x20\xd2$(5\x9b\x18\xb8$jD\xa1\x18\xf9_\x99\xe2z\xb8\xc1O\xb7\x8b\xb4\xdf\x14\x17\x1fX\x91\xef\xee\"ZR(/\xfb\xe5\xdfk^\xea\xdd\xa6\xf5,\\T\xa6\x0b\xffT\xa8\x87\x0c\xb0\x81\x85\xf0\x94\xf9H\x93\xe0/\xc2\xc4\xda\x9e\x9e\x97e?SD\xa1\xd8R\xad~o\xbdVKt\x20O\xacr\x8b\x09\x1b\x8b^&\xfa\xa4$\xa7\xd2s\xb8?\xb0\xa2M\xebY\xb8\xa8L^D{rcK\xd1\x828?\x158\x03\x0b\xe1\x95D\x9a\xb8\x7f\x11&\xcas4\x85\xe68T(\xd6fDz\xe3\xb6\xb0\x86\xf6\x8aVZ*\xff\x10\\{\xfeQM\xe4\x07N\xbf\xd8\xb4\x9eY\x8b\xca\xb4\xc2/\x88j\x0bb\x7f\x20p\x10\x16\xc2+\x894q\xff\"L\xacjo_\x1a\x14>X(VkV:=\xa8\xef\xe2\x0b\x1b\xe9]\xd1EO\xd7\x98\xcf\xdc\xda_)\xf6\x1a#\x9b\xd63kQ\x99&_!\x81\xba'\xc0\x05\x16\xc2\x93\xb3\x91F\x17\xf3\xd4Ns\x1c*\x14+7\x1bj\xaa\xf4\xa8S\xd8F\xed\xba\xb6u\xba\xf0\xedF\"\xf7\x07\x9e\xb4k=\xb3\x14\x95Y\xfb\xcd\x00\x17X\x08\xefp\xa4Y\x16\x1e\x87\x0a\xc5j'Ig\xfd\x13\x97F\x08_\xb8\xc2x\xb2\xbe\xd4\xb8\xb3i=\xb3\x16\x95Ax\x8e\xb0\x10\xde\xe1Hc\x15~q`\xb0W\xc8\xce\xf7F\x19^,\xc2\x17\x15_\xd3\x97\xfa\x03/\x0b\x9b\xd63kQ\x19\x84\xe7\x08\x0b\xe1\xc9\xc1Hs\xeb\x9d\xc29\x87\xcc\xd3\x8c\xd6B1\xaa\xc9\xa9k\xad\xcb\xd1%?\x95\xffrO\xa3v\xb2\xa7\xc6}\x81\x8aD\xa1\xa7\xad\xc5\x9d\xfbQ\x9c\xd63KQ\x99\xb5\x87\x0c\xf0\x81\x85\xf0NF\x1a\xe3\xb34f\xb7\xb6\xb5P\x8c\xfc\xdb\xca\\e\x0d~\xf2\x17\x09\xd1\x98'\\MB\xcc\xa3Gw\xd6\xff\xccU0O\xd6\xf5\xd9\xb6\x9eY\x8a\xca\xac=d\x80\x0f,\x84w6\xd2\x80l\x82\x85\xf0\xe4`\xa4\x01\xd9\x05\x0b\xe1\x9d\x8c4\x20\xbb`!<\"\x0dP\x05\x0b\xe1\x09\x91\x06(\x82\x85\xf0\x884@\x15,\x84G\xa4\x01\xaa`!\xd3\x91F\xe7\xf8\xbe\x81\xe3\x7f\xf0\x05\xfe\xbd\x9elv\xf2\xce2\x0b\xde\xb1\xa2\xdcO-B\x8c\xdd\x9fl\xaay\xad\xa7\xdad\xb3@\xe6`!\xd2\xac\x99\xd6\xbd=\xf0\xef\xab7\x9eL\xb6B\xf2\xce2\x0b=\xfbE\xae\x97\xbaZ\xc4\xfe\x9edS\xe9\xf6;\x0f\x97y?K6\x0bd\x0e\x16\xc2+\x88\xc7O\xf3\xe3\x00\x00\x0e\xfdIDAT4\x83\x20I\x85S\x98.Q\xa3\xef\xb4?\x11]\xc9&J\xdc\xeed3@&a!\xbc\x82H3\x08\xd2\x10~\xbf\xab\x07\xc2\x8f\x0cX\x08O\x19\x8e4\x89h\xd2C\xb5\x87<\xc2(_\x0d6\x99\x19\x04\x84_.rv\xd1'\x9a\x98\x1c\xd9oF\xfe]\xe5\xae\x07V\xcb\x14\xd3%>\x99\xdab\x0a\x1f\xea7\x8b7\xd7*|h\xe9r\xa1\xedD\x01\x9a\x1aX\x08\xefd\xa4\xe9\xf2\xe6\xd5_\xa1+\xf5\xf9\xde.K\x93\x99$\x20\xbc\xd10\xec\x7f\xb7V\x8b\xec7\xa3\xda\x9c\x15{\xb7\x15L\xf5\x1b\xc2o\x9bc\x0a\x1f\xee7\x8b3\xd7*|h\xe9_\x1a\xc7\x89\x02\xcfo\xf3P\x80\x96yX\x08\xefl\xa4\xa9]\xa2\xdf\xd4\xdcof?\xd7\"\xbcu\xa9\xb6\x94\xd0\x16\xa2\x04\x16\xc2;\x19i\xf4\xb8=\xa1\x85Z\x8ad\xdc\xb04\x99\x91\xbd\xf0\xe1\xf6\x9b\xb2@!\xc2\xfcp\x99Wg\x87.|x)\x0a\xd0\xd4\xc1Bx\x87#\x0dm\xd1\xb6\x98\x83`\x93YDg\x19\x9dq\xe7\xe6U>#\xc42k\xbf\x99\xbe\xdfvO\xc8\x9f\xde\xa6\x1f\xf4\x8e\x95\xe7\xf0\xfd\xe5\x85~K\xbf\xd9t\xfb\xb9\x81\xde4!r?\xb0,E\x01\x9a:X\x08O\xceF\x1a\x90E\xb0\x10\xde\xe1H\x03\xb2\x08\x16\xc2;\x1di@\xf6\xc0BxB\xa4\x01\x8a`!<\"\x0dP\x05\x0b\xe1\x11i\x80*X\x08O\x884@\x11,\x84G\xa4\x01\xaa`!<\"\x0dP\x05\x0b\xe1\x09\x91\x06(\x82\x85\xf0\x884@\x15,\x84G\xa4\x01\xaa`!\xe5H\x13\x8e1_\x9e\x8e\x9e\x0c@\x0a\xb0\x10\x9eR\x8d4\x92\x8bG\xf6\xed\xdb\xb7\xe7\xa0\xbc\xddw\xf08\x92\xed\xf1\xb5\x03\xdbg\\>\xbd\xa7\xef\xf4\x1e\xcb\xca\x1e\xa1\xb5\xe8w{]\xc2\x13\xb3\xbdh\x96\x8b\x9c\xa6ds\xc0\xe8\x82\x85\xf0iE\x9au\xd5\xb4\xe6\x8e;\xbe\xa6\xffw\xb7\xafyF\xf7\xeb\x15\xddoL;\x1b~Q\\\xadq\xc9\xda0wn\xcd\xd5\xc8-\x1d8F\xd1\x18%\xdb\x20\xab`!|Z\x91\xe6\xb9\xc7>?\xfe\xec\xda\xff\xfb\xf5\xeag7\x0fl\x9fy\xf1\xdc\xc1\xbes\x07oZV\xaa\x9b\xe3\xbaN\xd7r\xe7\xd4Em\xec\xd1%\x14\x0b\x84\xcf6X\x08O\xe9D\x9a\x17f\xc87Y\xef\x8b\x9b\xe1\xebj\xdcM\xb4\xab\xb2&Z\xf8\xa9\x8bc\xa6B\xf8\xec\x83\x85\xf0iE\x9a\x0d3?\xd6\x07\xff\xfc\x8d\x83d\x9e\xa5\x89~\xaf\xb5\xae\xa6a\x01\xcd\xd9!\x85\xbf\xb1\xb8X+\xa9:\xa9/l\x0d\x94\xe7M1\xa6\x9cYT\xa4\x15\xce\xb9\xa0\x8f\xb4\xa7V=\xe0\xaa\xbc@\x20[`!|Z\x91f\xc3\xec^}\xe03>K\x138\x0f\x1fA]\xcd\x05\xd7\x17\xe3/I\xe1[\xc5\xb2\x03MU9\xedD]\x87\xbc\xa5\xd3\xbd^\xaf,\x8b\xa4\x03\xae)/\xee\xf7\x08YU\xa9\x89\xc9\x8d-E\x0b\x08d\x0b,\x84\xa7t\"\xcd\x86\xc7\xb67\xefn>rz\xdf\xee\xe6\xe6'm\xdei\xad\xab\xa1\xb2e\x8f\x92\x14\xbe\xa7\xa9\x8b\xc8_6\xcfX\x1e\x8a4=%\x95\xb7\x88\xfa\x9b\xae\xe9c\xad\xf0\x0b\xa2\xda\x02\x02\xd9\x02\x0b\xe1\xd3\x8a4o\xcc\x9d9\xed\x11\x93i\xd5\x0bc?K\xa3\x0b\xff\xa2\xd8h\x08OW\x1b*'\xe5\x892cyH\xf86q\"4Y[F\xa8|\xcf*X\x08\x9fz\xa4\xd1\xb9|\xfc\xa0\xce\xdbo\xcb\xdb\xe36\xdf{\xd2\x85\xbf\xfa\xd4\x15C\xf8\xf6\xc2\x92\xa7[\xbc\xee(\xe1\xb7\x88\x9e\xd0d\xe3\xa0\x15\xc2g\x11,\x84\xa7\x94#M\x0a\xe8\xc2K\xa4\xf0\x93\xcb\xa5\xda\x8b,\xc2\xef\xfc\x94h\xbf\x08\x9f\x91\x87\xf0\xd9\x06\x0b\xe1S\x8f4)`\x11\xbed\x91>\xf0?l\x0a\xefv\x13]\x11M\xfa\x01l\xa1\xbb_\x7f\xbcb\x15A\xf8\xec\x83\x85\xf0iE\x9a$|Q\xe3\xbe\xa4\xdf]r\xd7|A\x1e\xb1\xb8\xe1\xf9\xa9\xa2\xe8\xc5wIj\xbd\xa5\xc5\xed\xfaL\x1f\x1d\x18\xff\xe0\x8e\xb6\x15b']\xf2j\xb5\xef\xfaO\xd4j\xdeKI\xb6\x0aF\x0b,\x84\xa7a\x8c4\x1e!\x9e\xd0\xef\x96\x09\xe1!\xff\x96R\xad`\xc9k\xa5\x9a\xfc\xb0\xc1\xad\x15\xf9\xb9\xd3\xdb\x8d9\x1f-.\xce+o\x91\x9f\xa5\x11B{\xdf\xa5\xdf.O\xb8M0z`!\xfc\xb0F\x1a\x00\x12\xc0B\xf8\x94#\x0d\xec\x07C\x84\x85\xf0\x94j\xa4\xe9L/\xcf\x03\x10\x0d\x0b\xe1S\x8e4i\x1e\xc0\x02\x10\x0d\x0b\xe1S\x8e4\x10\x1e\x0c\x11\x16\xc2S\xaa\x91\x06\xc2\x83!\xc2B\xf8\x94#M7\x84\x07C\x83\x85\xf0)G\x1a\x00\x86\x08\x0b\xe1)\xd5H\x03\xc0\x10a!|\xca\x91\x06\x80!\xc2BxD\x1a\xa0\x0a\x16\xc2\x13\"\x0dP\x04\x0b\xe1\x11i\x80*X\x08\x8fH\x03T\xc1BxB\xa4\x01\x8a`!<\"\x0dP\x05\x0b\xe1\x11i\x80*X\x08O\x884@\x11,\x84G\xa4\x01\xaa`!<\"\x0dP\x05\x0b\xe1\x09\x91\x06(\x82\x85\xf0\x884@\x15,\x84G\xa4\x01\xaa`!\xa2\xb7\x18d\x07,\x84\x1fd\xa4\x09\x09o)\x20n\xaf\xd3U\xbf\xde\x98\xdb\x10Q\xd8Z3\xe9\x98\x81qF>\xd4P\x1c\xd1[\x0c\xb2\x03\x16\xc2\xd3\xe0\"MHxK\x01\xb1G\xb4\xc9\xe7\xdc\xcb\"\x84o\x13\xc6\xbb\xb2\xf5\x1b\x8d\xe7\x82\x0d\xc5\x11\xbd\xc5\x20;`!\xfc`\"\x8d\xb5T\xd8R@\xec\x11\xae\xfa\xd6\x96Zq\x20\xa2\xa1\x98\xea\xc6\xd6\xb4\xe8K\xe5\xa1k\xb8\xa18\xa2\xb7\x18d\x07,\x84\x1fL\xa4\xb1\x96\x0a[\x0a\x88wM\xf7\x94h\x85\xee\x03\x91\x0d\xc5\xfa>\xde=!\x7f\xba\xb1\xf3\x0f7\x14G\xf4\x16\x83\xec\x80\x85\xf04\xa8H\x03@\xfa\xb0\x10~0\x91\x06\x80\xc1\xc0B\xf8\xc1D\x1a\x00\x06\x03\x0b\xe1\x09\x91\x06(\x82\x85\xf0\x884@\x15,\x84G\xa4\x01\xaa`!\x10i\x00\xc88,\x84'4n\x03E\xb0\x10^\x8f4\x07w\xf7\x1d\xd9\xec;\xf2\x92\xfe\xaf\xf7\xf8v\xeb\x93\xc7r\x8c\xf2\x8e\xd8\xee\xb1-\xe3\x7f+\xef\x92Vr\x03\x10\x86\x85\xf0\xfa\xce\xfd\x85\x857\xdf\xac\xee6\xff\xed\xf9\xa5\xf5\xc9\xdb\xefx\x1b\xc4\x16\xef;\xfd\xd1k\x95iF\x95A\xd2Jn\x00\xc2\xb0\x10^\xa7\xf7&}\xf9q\xe0_\xf7\xc5\xa8'\xdb\xc5;\xb1kt\xe5\xd4\xe4t\x19#\x08\x0fR\x86\x85\xf0\xc6\x1bO\x9d\xf1\x9f\xb7\x15\xde+\x8e\x89\x03\xc6\x08\xc2\x83\x94a!\xbcq\x96\xe6\xfc@o\xbc\xd3\x92!\xe1\xc35\xdbD\x9eb*6M\xd7V\xd6\x8ao\x11\xf5?\xe8\x8e\x9c\x00\x80\x0d,\x84\xa7D\x91&\xf0N\xeb\xe1~\xb2\xd4l\xf7\xb4\x89\xfa.\xea\xfa\x8dh\xbb%\xcf\xd2T\x1e\xde_\x9e\xff\x91u\x02\x00\xb6\xb0\x10>a\xa49\x11\xfe,M\xb8f{\xffX!\x9a\xa8E\x88\xb1\xfb\x89\x1e\xf4,\xce+\xae\x91=\xf3\xe1\x09\x00\xd8\xc2B\xf8d\x91\x06\x80\xe1\x82\x85\xf0\x84o<\x01E\xb0\x10>\xd9Y\x1a\x00\x86\x0b\x16\xc2#\xd2\x00U\xb0\x10\x9e\x10i\x80\"X\x08\x8fH\x03T\xc1BxD\x1a\xa0\x0a\x16\xc2\x13\"\x0dP\x04\x0b\xe1\x11i\x80*X\x08\x8fH\x03T\xc1BxB\xa4\x01\x8a\x80\xf0\x20\xab`!<2y\xa7g\x99M\xb3\xcf!\xd2\x80\xcc\xe3\xac\xf0\xbe\xd0\xa8\xf3\\x\x0c@\xc6pVxyb\xe6\xf8\xeeM\x1b\x9e[\xff\xec\xda\xf5\xcf\xad\xdf\xf0zs7\xce\xd5\x80L\xe2\xb0\xf0z\x8a\xd9\xbap\xf6c\xb3fU\xcf\x9f=k\xd6c\xd53.\"\xd8\x80L\xe2\xbc\xf0\x1b\xa6\x1d9\x7f\xf6\xfcM\xba|\xf6\xfc\xf9g\xa7!\xc9\x83\x8c\xc2@\xf8\x8a\x9b\xfa`\xdfJ\xf9pk\xc5\xb9\x81^\x94\x9a\x81\xcc\xe1\xbc\xf0/\xcc\xfcP\x1f\xfc\xe8\x8e\x83\xfa\xa3\xe7f\x9eK\xb6\x06\x00C\xc1y\xe17\xcc<\xab\x0f\xee\xbfC\xde\xae7\xc6\x00d\x0c\xe7\x85_?\xb7{\xf7}\xf7\xde\xfd\xb5\x1f\xdc\xf7\xf3\xbe7ft\x1e\xdc\xe0;\xbe9jV\x8b\xbc\x12\xd3\xc4\xe8+\xa4\xee/h%\x00\xd2\xc3y\xe1\xd7U\x0f\xac\xfd\xc6\xd7\xff\xee\x8eo|\xe3;\xbe\xe6\x19\xdd\xbb\xa3K\xcdt\xba\x0ey\xf3\x16\x9d\x8a^\xb7\xd5\xd5\x12\xbd\x08\x80$8/\xfc\x86\x8a\x8b\x9d\xc7\x8f\xdf\xfb\xf5\xed\xc7\xdf\xa3\x97f\x9e\xef>O\xdd\x97c'\x16\xad\x8e]\x86\x8bb\x83\xb4q^\xf8\x17f\x9c\xd6\x07\xf7\xca\x0c?\xb0~V\xbc\x0co'<\x00i\xe3\xbc\xf0\x1bf\xc9\x1d\xfa\xac\xefI\xed7\xcd\x8cwZ\xd2\x14\xde\xff\xca\x14\xd7\xc3\x0dr\xcf~=W\x88\x9cF\xb9l\xb9\xd0v\xaez\xc0Uy!v%\x00\xa2a\x20|\xc5\x97\xa1\x87\x9b+\xe2\xbd\xf1d\x0a\xbfT\xab\xdf[\xaf\xd5\xcaa\xbb\xd7;\xdeh\xfe\xf8K\xe38Q\xe0\xf9m\xde\x02\xdb\xf5\x00\x88\x80\x81\xf0\xf3\xd7\xac\x7fv\xdd\xd6\xd7\x9f{v\xdd\xfa\xf9\x8f\xc4\xfb\x1a\x88!|\x9b\xd1w`\xde\xea\xe4\x06\xfaY\xb5|}\xef^S`\xbb\x1e\x00\x118/\xfc\x9e'\xab\xe7\xce\x9e]QQ1{\xf6\xdc'Wv&\x12\xbe\xd6\xe8\x9a\xa7\x07k\xcde!\xe1\x97\xea7\x1e\xcdv=\x00\"pXx\x9d\xde\xce\xcb:_\xf5~\xae\xdfv~\x15o\x96!|y\x951\xae*7\x97\x85\x84\x97\xf7\x10\x1e\xa4\x82\xf3\xc2\x93\xf1!\xe1\xcd\x8fw\xc6\xf9`\xf0\xed\x0f\xe4A\xea\x04c\x0f?\xc9hh\x9d\xb8\xd4|\x06\xc2\x83\xb4q^\xf8\x01\x9f\xaf\xdb\xe7{|\xda\x11_w\x9f\xcf&\xcf\xbc\"\xbcDW\x8d\x82\xca\xbdB\x9e\x97i\x14{\xcdg\x20\xea\x7f\xc7\xeb\x1d_\xeb\xf5\xde\xa0K^\xad\xf6]\xff\x89Z\xcd{)\xce\x16\x00\x08\xc1Bx\x1f\xd1\xf6'\xcfR\x9c/\xf9\xb5Lu\xe5W\xbdo\x0c\xfd\xdb\xca\\e\xc6y\xf8\xa3f\xd5\x99\xd8A\xcb\xf5[\xed}\x97~\xbb\xdc~}\x00\xc2\xb0\x10\xbe\x97H\x8f4\x84\x8b\x15\x80\x8c\xc3BxJ\x14i\x00\x18FX\x08\x8fK\xed\x01U\xb0\x10\x1e\x97\xda\x03\xaa`!<\xe1R{@\x11,\x84G\xa4\x01\xaa`!<\"\x0dP\x05\x0b\xe1\x09\x91\x06(\x82\x85\xf0\x884@\x15,\x84G\xa4\x01\xaa`!@=BDAGHF\x00f\x00JLI\x00j\x02\x03l\x04OQN\x0dp\x0aSUR\x0cr\x17VXU,`\xae7]\xad8^\xae\x16w\x1d[]Z8a\xaa:b\xab;b\xact(\x14\x0a\xa2\xd6\x87\xa1\x8c\xed<\x86\xe1\xa9y\x06\xa4)jU\x08J\xad\x04\x19\x89\xd0\x82R\xadB\x88$s~\xf7\xdc\xbf\xe7\xde=w\xef\x9e\xdd\xbb\xd9\xbd\xbb\xef\x97#\xb9{\xf7s\xce\xf9\x9c\xb3{\xde{\xef\xb9w\xf7\xadP\x00\x00H\x18\xc5/\x00\x00\x00l\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09|$\xe3\x18\x00\x00p@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12\xc8H\xc6\x07\xbf\xf7\xa8D\x8a\xdf6\xce\xf8?\xd1\x92\x8a;\x9ey\xdf/\x12\x00\x90u$.\x19\x9f\xb4\\\xb5\xd4\xb3\x9a\x84\xd9\x7f\x071\x19\xd7\xe2\x17\x0c\x00\xc86\x12\x96\x8c\xdf\xcf$$u\xc9\xf8`\x06\xe1X\xe1\x17\x0e\x00\xc82\x12\x96\x8cz\x12\x84d,aJQRS?\xb7\x82mD\xff\xe0\x17\x0f\x00\xc8.\xfaY2&\xab\xb5,\xf8@\xdd8\xfc8\xd3\x8cF\xbfx\x00@v\xd1\xbf\x92\xb1\x9f\xe9\xc4\x07\xfa\xf6lusF\xfcp\x00@\xb6\x91\xa0d4\x9a\xcb\x0f\xcf/P\xff\xb9Y\xdf\xf9[u\xb3X\x15\x80(!\x15\xc7\xf67M+.\x9b\xfb\xbcY`\x7f\xd3\x8d\xe3\x8a+\xeb\xff\xcb\xd9\x9a&\x19F\xcc\xf3\x8d\x8d\x8dKD\xc1\x875-Yqm\xb4\xa2\x9e\xe9T\x9d\xbe\xf7\xad\xd1\xea\xf6[q\xa3?9\x06\x00H3\xd2\x92\xc1tb\xf4~kg\xfd1]2~;Y\x7f\xbe\xfe\xb0\xf6\xd4\x86qF|\xeda\xbe\xb5O\xd8\x12Fq\xa3\xebb\xad+X\x13\x81\xc7\xd8\xe3\x9a\xff\"\xba(\xa9,e\x8f\xe3G\x1f\x03\x00\xa4\x1bi\xc98VE\xccK\x1d\x15D?dP%c\xc2D3\xe0^\xf6\xcc\xf3\xa3\xcd\x87\xa4\xc6\xf1\xd9\xbfT\xdfY1\xff\xb9\xb7\xac}\xee`&\x02\x13\xb4}\xab>\xb9V\xfdW\xbf\x16{\x83\xba\xb5&~\xf41\x00@\xbaIP2\xfe\xf0\xfc\xad\xea\xa4\xbc\xf7\xf9\xe7\xf7k\xb3^;3\xf9ou\xe3*\xf6I\x1fe\x13\xb6l\xe9\xf3\xcd\x95lC=a\xf8\xa0L\xfd\xfb\x9du\xbf}z\x82\xfa\xb7\x99o\xee\xf0\xcd\xd6\x84\xbf\xf1\x19\xfd\xf0!&\xf8\xb0\xf6t\xd1w\xa6\x16\xee\xb7\x8f-~\xcf\x94\xe1\xb0O4\x00\x20\xdd$(\x19\xdc\xf2'[T\x18\xcd\x8e\x11\x9a\x88q\xc9\x83I\xc6D\xb6g?\xd3\x8c\xdac\xc7V0E`b\xf2[5v\x9a\xa3\xbd\x0f\xe6[\x9aA*\xb4\xe5\x88\x98`M\x04J\xd4\x93\x97\x9dj\x8dEFc\xec0\xe7\xff\xf9E\x03\x00\xd2\x8d\xbcd\x1c\xab!\xfa\x99\x09;i\xd0V%\xa2\xd6S-\xeaV\xe9'Z\x84~\x9a\xf0\x1du\xeb\x0f\x8e\x06\x8f\xfd\xfe_\xad\x93\x98\xe8o\x8d\xea\x1c\xc1\x9a\x08\xfc\xab\x11]\xabn?\xad\xee\x9bl4\x16?\x1a\x00\x90f\x92\x90\x8c_\xa8[\xb3\xf5S\x85\x1b\xb4\x1dL2\xfe[\xdbz\x8b\xcd\xdf\xb7\x8e1M\xa8kdLS\xb7~\xe1n\xf3\x93\xff^ZS\xa2i\xc6\xb5\x9f\x1c\x8b\x0d\xd6D\xc0,\xf4<\xd1.\xc5\x1a\x7f\xfc\xa2\x01\x00i&\x09\xc98\xd1\x00\x804\x93\x84d\x1c\xfbWm\xb2N3V\x19t\xc9\xf8\x83\xb6\xa5\xcd\xdf\x9d\xaey\xcd\xdd\x00\xf6\x8b\xa5\x8d\xf5\xe6\xad\x1b\xfbK\xb4jb\x83\xb5=\x7f0\x8b\xb0[\xcc\x97\x1c.1.\xb6\xfaE\x03\x00\xd2K2\x92\xc1.\x95\xdc\xfc\x07b\xdd\x09\xc1$C\x17\x02\xe3\xc4\x84\x89\x81\xeb&.\x1dv\xc7g\xbd\xf9\x80]6m:\x16\x1b|X\xaf\xc4\x80\xad\xb6\xde\xf0\xbcU\xce'\x1a\x00\x90^\x92\x91\x0cv\x80A\xd8\xa1\x86\xf1\xedu&\x19\xffO\xdbb\xcb\x9fe\xfa\xca\xe4O\xb5\x1d\xff\xe5\x9c\xcc\xecd\xc6\xfc.\xda[\xac\xd8\x0aA\xb0K\x04\xd8\x82\xe7\xcd\x96P\xf8E\x03\x00\xd2J\xc2\x921_?&\xd00n\xc8*1\xee\xecds?\xca\x96\x13>\x98\xaa\x1f\x0d\xb0\xaf\x9cMf\xe7\x11\xea\xf1H\xe9\xcd\xdc\xfd\x12\xec\xd0\x84ThG$\xbfg\x07\x19d\xa7\x20X\x13\x01\xbb\xd0/\xf4\xc6*\xf5[\xc2\xfc\xa2\x01\x00i%a\xc9`G\x15\x13\x97\xfc+\xbb,z\xec\xadBm\x16\xcf7\x9e\xd2n\xe5*nZ\xb7\x82\xdd\x18J~k,S\xccx\xfe\xad\xe7\xd9\xda\xa5\xe3>\xeez\xad`\xf9\xcds\xa7j\x1bs\x8f\x09\x82]\"p\xb8L\x0b}\\\x7f\xe4\x17\x0d\x00H+\x09KF\xb36q\x8d{9\xe7j\xdb\xe6\x9a\x02\x93\x0c\xfd\xa2)1\xceP\x9e#\x16\xe3\xfe\xc07\xf7\xfe\x0d\x84\xa3j\xbf(\xd8-\x02?d\x8fG\x9b\xe7\x1e~\xd1\x00\x80t\x92\xb0d\xbc\xaf\xdf\x80\xa5\x9f\x9bh'\x0b\xe5\xe6\xb7G\xb4\xe5\xcf*}\x1a/\xd0OV\x9aM\x09\xf9?\xbfu\xb6\xb7\xbf\xce\x9e\xf2s\x0d\x19p\x05\xbbE@;\x9b\x99k=\xf4\x89\x06\x00\xa4\x93\x84%\xe3\xd8\x1f\xea'G'\x1b\xdfng\x17=\xc9\x0f\xcdg\xb4\x8b\xac\x1f4M\x8dr_~\x7fk\xc9\x8c\xb2\xa2\x097/\xfd\xe0\x98\x9b\xdf7~gr\xb4\xb8\xe2;?\xb4\xc5\xc4\x19\x1c#\x02\xec\xeb-\xeb\xec\x87>\xd1\x00\x804\x92\xb8d\xf0\xecd\xf3\xd4\xfa\x0a\xbb}_\x06\x00\x20\xc7IJ2>ak\x19\xf6\xd7\xcd\x20\x19\x00\xe4\x0d\xf2\x92\xf1\x8b_<\xc7n\x95\xe0\xee\x03\x87d\x00\x907\xc8KF\xad\xbe\xf8Xa\xff\xdc\x16$\x03\x80\xbcA^2\xfeUS\x8cq\xdc7\xc1\x20\x19\x00\xe4\x0d\xf2\x92\xd129Z<\xad\x81\xbfE\x1b\x92\x01@\xde\x20/\x19\x00\x80<\x06\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\xc0G2\x00\x00\x80\x07\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x20e\xc9\xf8\xfcD\x17\x00\x20oHQ2\xbe\xf4\xab\x1f\x00\x90S\xa4&\x19P\x0c\x00\xf2\x8c\xd4$\xc3\xafv\x00@\x8e\x91\x92d|\xeeW;\x00\x20\xc7HI2\xb0\xf2\x09@\xbe\x91\x92d\xf8U\x0e\x00\xc85\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x09\xd0\xe9\x17\x00@\xde\x00\xc9\xf0c\xef\x94A\xcax\xbf\x20\x00\xf2\x05H\x86\x1fC\x87>\xbcr\xb7_\x10\x00\xf9BVH\xc6\xf6\xb1\x03\x07\x8cZ}\xf1Z\xbf\xb8L\xb0]Y\xe9\x17\x02@\x1e\x11\xb0d\xac\xde\x14\xbb\xcf\x97M\x91+\x9e\\<^Q\x9e\xf0\x0b\x94F&\x1d\x8f\xd8MJV*\x19\x00\x19\"`\xc9\x189)v\x9f/c/g\xffNI\x83d\xc8\xa4\xe3\x11\x0b\xc9\x00\x80'`\xc9\x18.1G-\x86\xdc\xc6\xfe\xdd\xae<\xe9\x17(\x8dL:\x1e\xb1\x90\x0c\x00x\x82\x94\x8c\xe5\x8a\xcep}\xf3\xb6\xaey\xea\xbfOLW\xce\xbf\xff\xba\xc1\x03\xafxU\x8bytd\xc1\xd0Y\x1d\xcer\x93.\xda\xae\x15\xef\xe0\x03^:_\xad\xe1\xd5+\x87\x14\x8c\xed|B\xadf\x9e^\x998\xc0Q\xdb\xda\xb1\x83#\x03\xc7\x0ev\xa4\xc3\xc5NW\xce[\xdc\xf5ZD\x19\xaa\x05\xbf6~`d\xd0\xd8\xdd|\xac\x8b\xd5\x90\x0c\x008\x82\x94\x8c\x8e\xb5\xab\x87\x8eZ\xbdz\xf5\xabls\xf0u{\xbb\xf6\xde5`m\xc7\xf6\xc5\xe7+\x83\xe7\xcd\x1b\\\xc0ta\xcay\xd3\x97\xdf?p\xb8s\x92\xef\x1e|\xde\xd8yk\xf5}V\xc0_\x9eX\xb0\xa7La\x9b\x91!\xea\xac\xeb\x18<\x92}\xf0?\xda\xc5f\xf5bg\xa9\x8ey##\xca\x00v\x08\xe1\x08\x18\xae\\\xce\x0a\xb2zX\xb5WN\xf1\x0e\xb0yp\x20\xd3\x9e\xfb\x07h\x0f\xb8\x93\x0d;\x96IF\xd7]L2\xfe2\x98\x1d\xa1t>\xd1\xe1\x8a\xb5\x18\xaf\x1ex,\x8f\xdd\x0d@\xfe\x926\xc9\xd8\xadl\xef\xea\xbcP\xbb@\x19\xd1\xd6*\xeeW:\xba&\x0d\xe9d\x0c\x9e\x12S\xb0s\xe5X69\x1d\x01\xc3#\xe6\xf1\xc3\xea\x82\x8e\xae?\x17\xac\xee\xf2\x0c\xb0\xd9}\xd1\x90\xe9\x0f\xbfd\xdc\xb0\xc9K\x86\x15kK\xc6r\xe5%\xbb\xa0H2v\xaf|p\xe8@\x1ce\x00`\x936\xc9\xe8\x1a;\xabk\xe5\x00m\xe6js\xb4k\xb5\xb2I\xfd\xa8\xd7q\xdeM\xb9I\x9f\xcc#\xaf\xe8r\x06\x0c\xb7V\x16:\x07>\xd9\xb5\\;|\xf0\x08\xe0\xe8xp\xd2Pe\xd0=\xda6/\x19V\xac-\x19\xf7+\x7f\xb1\xcby,\x7f\xb2\xb4\x01\x00&\xe9\x90\x8c\x875\x09P\xa7\xb8~^\xd2\x15\x99\xc5\xfe}X=\xca\xb8r\xc8&\x8dw\x1d\x85.\x9a\xae\xfd\xb9mH\x973`\xb8\xad,\xd3\xc7w\x8d\xd7\xa2\xbc\x02,6\xcdQ\xff\xe9X\\\xf0\xa0\x16`\xa7c\xc7j\x92q\x1b\x93\x8c\x951G\x19\x0f\xc7\x1c\xb6\xe0\x8a\x09\x00<\x01K\xc6\xa8Q]]{\xf5\x1b,:\x07.\x1f\xb8Z\xdb\x19\x19\xc4V\x11\x86\x8cbsT{\xea\xb6y\x8eB\x03\x07\xeb\x8b\x09\xe3]\x01\xdc\xe7\xfe\xda\xc8\xee\x886u\xbd\x02,\xee\xd2\xef\xd6\x1cu\x9d\xf6\xaf\x9d\x8e\x1d[\xa0\x8aJ\xe7H&\x19\x1d\x17\x8dbG.\xd3g\xb9by\x20\x19\x00\xf0\x04,\x19wE\xeeY~y\x81\xfeQ=g\x88~^\xd2\x15Q\x86?\xf1\xf0\x90\x01\xaf\xb1}\xca\xa4'\x96Oq-\x7f\x0eT.\xbak\xe5\x93\x97\x17\xbc\xca\x07t\xea\xd70^3b.\x1a{\x91\xbe\xe1\x15`r\x97Rp\xd7\xf2'\xa7(\x9aZ\x99\xe98bG\x0d\x9c7o\xa4r\xfe\xa3\xdb\xd5\xb3\x8e\x0b.~p\xf9t\xe5a>\xd6\x05$\x03\x00\x9e\x80%\xa3s\xfa\xc0\x82Q\xc6\xc9\xff\xab\xcau\xfaFd\xd6\x94\x01\x17]\xa9O\xc6\x95\x97\x0f\x1c0\xca\xf5\xad\x8d\x91\x0f\xdf6\xb4\xc0\xbcq\xc3\x0cx\xe9Lx\x0e\x93\x1f\x92\xe1\xd1y\x0eH\x06\x88!\xa3\x92\xf1\xfa\x88\xbb\x05\x9b\xf6\xd3\xdf\xbdl\xc4e\xffWS\x92\xa7\xae\xbe\xe4\xea\xa7\xd4\xbf\xff2l\xc4Sw\x7f\xe3\x92o\xfd\xb1\xab\xeb?\x87\xe9\\\xad\xee\xee\xf8\xee\x98\x11c\xbe\xad\x1d\x93\xbfw\x89\xbaO;\xc8\xe6b\xbb\xba\xb6|k\x8cZ\xd7\x18G\xfd\x9d\x97\xe95\xdc\xed(\xc60\xa6\x0a\xdfDW\xd7\xb3\xd7_\xf2\x8d\xef\xa9\x1f\xca\xbf\x1b1l\xd8\x0f^\xbf}\xcc\x88our{\xbb\xba\xfet\xfb\x98K\xbf\x1b{\xf0n\xa6\xee,f\xf2/\xacU}\x99\xc0\x91\xafU\xef\xff\xa8\xc5\xbe\xdd5f\xd8\xb0K;\xd5\x80\x7f\xbbs\xcc\xa5\xdf~\xdd\xab^q\xbe\xe2\xcc<;o\x17\xe3$\x83\xabA4\x92\x20\x8f\xc8\xa8d\xdc9\xe2\x8f\x82M\x93_]r\xf5\x8f\x7f\xf9\xc8\xb0\x9fh\xcf\xfe\xe0\xe7?\x18q{W\xd7\xff>;b\xd8e\x8f\xfc\xe4\x12\xf5\xb3\xf4\xcf[\xb6|\xe3\xfa-[\xb6\xbc\xae>\xff\xf3aw\xfe\xea\xd9o\x0f\xfb\x0d+\xf6\xbb-[F<\xc26\xb8\xd8\xae\xdf\x0d\xbb\xfd\xd9_>u\xd90\xe7\x8fx\xfen\xcb\xb3\xc3\x1e\xd9\xb2\xe5O\x8eb\x0cc\xaa\xf0Mt\xdd9\xec\xee\x9f\xff\xdbeWwvu>\xfb\xec\x98o\\2\xe6\xee\xdb\x87\xfd\x91\xdb\xdb\xf5\xfa\xa5\xdfx\xea?\xbf5\xcc-\x19V\xea\x8eb\x16\x7f\xd2Z\xd5\x96\x09\xf8|\xb9\xd6~\xf3\x88\xda\xaf\x7f\x1f\xf6\xec\xef\xb4\x801?~d\xcc%\xff\xe3Q\xaf8_\x8f\xcc<:o\x17\xeb\xb2%\x83\xabA<\x92\x20\x7f\xc8\xa4d\xfcq\xc4?\x0b6M:\xc7\xb0\x8f\xe3\xceg\xdf\xeb\xea\xfa\xe5\xb0_v\xb1\x7f\x7f\xae\xfe;\xe2Ru\xc6\xdd~\x99\x16b\x1d\x85\xff\xe5\xd9\xbf\xf0\x0f\xcd\xb7\xbf\x1d\xfb\xd4e\xec-\xfe\xd4\xa5].\x1c\xc7\xe61\x92\xd1\xc5\xd5\xf9\xf3a\xff\xae=\xa1}\x18_=\xec[\xba[#\xb7\xf7\xfao\xa89t^\xed\x9a\x98|\xeav1\x1e\xadU\xfd\x98\xdf\xce\xd7\xd1\xda\x9d\xdf|o\xcc\x8f\xf5\xd81j\xe1\xf7\xc6|\xd3\xbb^Q\xbe\xe2\xcc\xc4\x9dw4l\x8d\x03W\x83\xd7H\x82|!\x93\x92\xf1/#^\x17l\x9a\xfc|\x98\xb5\xf8\x7f\xa7~u\xef\x9f\xd8\x8d\x1b#\xd8?\xc6Y\xb5}\xe2\xfe\xdeS\xdf\x1as\xa9q@\xceI\x86\x15\xfb\xc71c\xfe\xe5\xa9\xdfu\xc5|4&.\x19\xdf\x1d\xa39;\x8e\xd1n\x1e\xb9\xda<&\xb2\xf7\xbe7\x8c\x9d%t\xfd\xc051\xf9\xd4\xedb<\xbcdX\xf9:Z\xeb\xbc\xfa\xb2o\x1b\xb1\xdau\xe8\xa7\x86\xbd\xe7Y\xaf\x20_\x8f\xcc\xc4\x9dw4l\x8e\x03_\x83\xd7H\x82|!\x83\x92\xf1\xa7\x11w\x0a6-~b\x1f\xfb^\xaf\xcf\x98o\xab\x9f\xae\xfc\x0c\xb3\xe7\xc7o.\x1b\xf3\xbd\xff\xd8r}\x8cd\xd8\xb1\xef=\xf5\xdd\x7f\x1av\xd9\x8f\xbb\\$.\x19W\x1b\xeb\x04\xda\xe3\xab\xaf\x8e\xd9\xfb;\xbd\x88{\x89\x90O\xdd.\xc6\xc3K\x86\xb5\xe9h\xad\xebY3\x1d=\xc3-\xaa\x98z\xd5+\xc8\xd7#3q\xe7\x9d\x0d\x1b\xe3\xe0\xa8\xc1c$A\xbe\x90A\xc9\xb8{\xd8\xeb\x82M\x8b_qG\x19\xfab\x9b\xf6\xd1\x17#\x19O\xa9\x9f\xb0\xff\xf4Mvb\xf2]o\xc9\xf8\x1d\xfbx~\xef\xd9\x11Ou9IL2X\x13\xb7\x8f\xf9\x9d\xc6{\xd6^\x86\xbd\xd7\xf8$v/\x7f\xf2\xa9\x8b/gh\xad\xfe\xc0%\x19\x8e\xd6\xfet\xd9\x0f\xc6\xe8wO\xe8k\xc4O\x0d\xeb\xf0\xacW\x90\xafGf\xe2\xce;\x1av\x1de\xdc\x19o$A\xbe\x909\xc9\xf09\xc8\xe8\xfa\xcbe\xd7\xb3\xc3\x8c\xbb\xeff\xe7(\xec\xd4\xfaY}-\x83\x93\x8c\xeb\xafW\xcb\xb2\xe7\xc6\xb0\x89\xd2y\xb5\xb7d<\xa2\x9d\xfaw]\xef^1\xf1\x95\x0c\xab\x89_\xea\xa7\xf7?\xd0>^\xad9\xca\xed\xfd&\x9b\xd6\xaf\x8fpML>u\xb1d\\\xa2\xce\xc1\xceo\xba$\x83o\xad\xf3\x9b?\xe8\xbaS\xbf\xcc2\xe22U\x1a\xff<\xe6z\xefzE\xf9\x8a3\x13w\xde\xd1Mk\x1c\xb8\x1a\xbcF\x12\xe4\x0b\x99\x93\x8c\xef\xd9G\x16\xdc&\xc7\xafF\xfc\xd3S?\xbf[\xfb\x80\xbb}\xd8\xf7~\xfe\xbda\xb7k\x17\x18\xee\xfcM\xd7\xef\xee\x1c\xa1\xad\xf4?2\xe2'\xff\xf1\xadK\xfe\xc8\xde\xc7\xdf}\xea\xc7W\xab\x87\xcb\xbf\xe9\xea\xdc\xb2E\x8d\xd9\xb2\xa5\xc3\x11\xfb\xc8\xb0K\x1e\xf9\xf9\x7f\xdc9\xecW\x8e\x16\xf4\x8b\x06\xdau\x16\xbb\x98~\xd7\xe3O\xb6l\xd1\xd6\x07\xac&\xd4$\xff\xbfg\xd5\x1a\x9e\xed\xea\xfc\x8dv]\xe2u\xad\x0ako\xd7\xff\\2\xe6\x91\x1f\\:l\xc4\xbf\xff\x8f\xa3\x0d+uG1\x8e\xeb/\xfb\xf1\x8f\xbf\xc9\x8a9\xfaf\xb7\xb6\xe5\x9f/\xfbc\xd7\xeb\x97\xde\xbdE\x15\x8d\x11\xc3\xae~\xf6\xa9o\\\xfa\xbaw\xbd\x82|=2\x13w\x9e+\xc6\x8d\x03W\x83x$A\xfe\x901\xc9\xf8\xd3%\xb7\x0b6\x1d\xbc\xfe\xdd1\x97|\xf3?\xb4\xcd\x7f3nB\xf8g\xf54{\xc4\xff\xb0\xdb\x08\xd8\xa7\\\xe7\xdd\x97\x8e\xb8\x9e\xbd\xe9;\x7f\xf2\x8d\x11\x97}\xf7\xa9o\x8c\xb8^=\xef\xd6y\xca\x11\xfb\xec\xf5\x8f\x8c\x19q\xd9\xf5\xce\xf7y\xe7\xa5Z\xa4\xb6\xf2j\x17\xd3\xbe[a\x9d\xce[M\xa8\x1f\xc0\xd7_v\xe9\xf5?\xb7B\x8d\x15Is\xaf\x9a\xee\xb7/\x1d\xf3\xbd\x7f\x1f1\xcc\xf5\xf9k\xa6\xee,f\xf3\xfa\xf5#.\xf9\xd6\x0f\xd4$\x9d}3\xeb\xfd\xe50v\xef\xc4\xdd\xea\xbf\xbfb\xcb\x9fw^:\xe6\xf6?\xc5\xa9W\x90\xaf83\x8f\xces\xc5\xf8q\xb0k\x10\x8e$\xc8#2&\x19?\x18\xf6\xbf\x82M\x10\x17\xfb\xd4\x09\x80\x0c\x911\xc9\xc0\xb7\xde\x93\x00\x92\x012N\xc6$\x03$\x01$\x03d\x1cHFx\xd0\xd7G\x01\xc8(\x90\x8c\xf0\xf0\xcf\xe6r%\x00\x99\x03\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x20P\xc9\x98\xa4\x0c\x9c\xb2]\xd4\x0a\x00\x20G\x08T2v\xaf~t\xe8\xc0\x0eQ3\x00\x80\xdc\x20P\xc9PY\xad\xbc$\xd8\x0b\x00\xc8\x11\x82\x96\x8cM\xcaZ\xc1^\x00@\x8e\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x10\xb4dlWV\x0b\xf6\x02\x00r\x84\xa0%\xa3s\xe0\xc8\xb5\xbb\xe1\x8b\x03@\xae\x12\xb4dt\xadT\x14\xe5\x0a\xd1\x13\x00\x80\x1c\x20h\xc9\xe8\x188\xe4\xfe\xd5\xaf\x09\x9e\x00\x00\xe4\x02AK\xc6&e\xa5`/\x00\x20G\x08^2p\xc5\x04\x80\x1c\x06\x92\x01\x00\x90\x20h\xc9X\x0b\xc9\x00\x20\x97\x09T2:wo\x9a\x14\xd9-j\x06\x00\x90\x1b\x04*\x19\xe3\x15e\xf0rQ+\x00\x80\x1c!P\xc9\xd8\xfb\x12\x0e1\x00\xc8m\x02\x95\x0c\x00@\xae\x03\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x90\x92d\x9c\xf0\xab\x1d\x00\x90c\xa4$\x19\x9f\xfb\xd5\x0e\x00\xc81R\x92\x0c\x9c\x99\x00\x90o\xa4&\x19_\xfaU\x0f\x00\xc8-R\x93\x0ch\x06\x00yF\x8a\x92A\xe9\xe7X\x03\x05\x20\x8fHY2\x00\x00\xf9\x04$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20A\xca\x92\xb1\xf6\xca\xc1\x91\x01\x17\xdf\xb6\xd7/.\xe3t\x9e\xf5\x8b\xf0\xa0S1\xb8`\xc8\x94\xddlG\x87\xf182\xf8\xcaMV\xd0\xbc\xe1\x05\x91\x8b\xc6\xafu\x95\x0d\xcd\xe8\x00\x90\x20)J\xc6\xd9\xf1\xc6\xf49\xff~\xbf\xd0\x0c\xf3`\xc1\xe7~!\x1e\xa8\x92Q0@\xe5B\xd6\xcf\xd5\xd4\x96\x0c\xc6<=\xe6\xd1\x88\xf1x,\xdfJxF\x07\x80DIQ2\xe6(\x05\x0f\xbe\xfby\xe7K\xea\xdcX\xe9\x17\x9bQ\xce*J\x0a\x92\xd1\xa1m|\xbd}\xa8\xc2\x84G\x95\x8c\xbd\x9f\xabt\xbd:VQ^e\xcf\xccR\x94\xf1/u}\xb9\xf7\xae\x882\xeak\xbbdhF\x07\x80\x84IM2>\x8f(\xc6\xa1\xf8\x14eH\xfc\xd0\x0c\x13\x84d\xa8b\x11Q\x9e\xd0$\xa3S\x7f|v\x882E\xfd\xb3ZQ\x16\xeb;^R\x94G\xad\x82\xe1\x19\x1d\x00\x12&5\xc9xM\x89\x18\x1f\xaa{\xadi\x94\x9d\x04#\x19t\xa4r\x1b/\x19\xf4\x1ee\xb0Z\xf7\x20e\xba\x190\x9d\x13\x87\xf0\x8c\x0e\x00\x09\x93\x9ad\xec\xb5g\xd3\xea\xed_\xb2?\x9d\xb3\x86D\x06\x8e\x7f\x89m>\xaa<\xfc\xd2\x90\x82\x91s\x94\xf1z\xc4u\xca]\xc2\x00\xb3\x06\xfb!\x17\xb3X\xb9\xe7\xdd\xf1\x03.\x1c\xb9\xdc3\x82vL\x1f\x1c\x190\xeaQ}u\xd3Q\xf4\xfe\x13\xb3\x06G\x86\xdcv\x82\x9d\"0v\xbb\x82\x0d\xd6N\xba(R0\xf4\xb6.W\x19\x13^2\x86+s\x1c\x92\xf1\x84r\xa1Z^Q\xfeb\x06t\xdc\xff\xaaU0\xd0\xd1\x01\x20;HM2\xe8\x10e\xe8Z\xee\xe4\x9d\xbeT\xa0D\x86\x0f\xd1W\x05\x1fU\xe6\\\xa0(\x05\xef*\x11\xed\xf3\xfd\xec\x85\xca^a\x809}\xad\x87|\xccbeRAd\xec\xa8\xf3\x94\xeb\xbc\"\xf6^\xa8\x0c\x18>TQ\xc6\xba\xdb_\xac\xcc\xbaH\xb9p\xa0\xa2\x0c=K\x97OR\x94\xf1Wv:\x83\x0d\xa6+\xcaE\xc3\x07\xa9\xff\x9cp\x961\xe1$c\xb7\xa2,wH\xc6]\xcaPJoc\xff\x88\x08rt\x00\xc8\x0eR\x94\x8c\xed\x11E\x190\xfe\xd1\xdd\xc6\xc3\xce\x0b\x959\xea\xc7\xe9\xf6\x01l\xb9\xefQ\xe5\xbc!\xab7=\xa9\x1e\xcck\x87\x08\xab\x95\xe1\x1e\x01\x06\xe6CG\xccbE\x19\xf2g\xf5\x18\x7f\x00\xabD\x181^\xb9M\x9d\x96\xbb\x07\xb0u\x03w\xd1\xa1\xdb\xd5c\x80\x88\xf2\xa4ub\xc2\x07\x1blR\x0a\xd8\xa7\xfa\xf6\x02\xe5AW\x19\xb3S\x86d\x9c\xed\\>H\x19r\x96\x97\x8c\x13\x83\x94Y\x94^\xa1-h\x08\x08rt\x00\xc8\x0eR\x94\x0c\xda1V;\xe4\x1f4\x87\x1d\xd6\xab\xc7\xffWh{W\xb2\xcf\xddG\x15E\xbb\x1f\xe1\x09\xfd3\xfdJ\xe5a\x8f\x00\x03\xf3\xa1#f\xb1\xb1s%[#\x10F\x0cV\xb4)\xf9\xf0\x95kc\x8bjS}:[i0$\x83\x0f6\x98\xa3\x9d\x11\xb0\xbf\xd3]e\x0c\xac\xfb2T\x86\xb0gU\xc9\xd8}B\xa5c\xe5\xc5J\xe4]\xb6\xc01\x87\x8a\x09pt\x00\xc8\x0eR\x95\x0cuF=q\xa5z\x20\xaf\\\xc8\xeej\x1a\xac\xdd\xb7\xa0N\xd0\xf3\xd4\x99\xf7\xa8\xb1\x12x\"r\xde\x09v\xf9\xe0\xbc.\x8f\x00\x03\xf3\xa1#f\xb12J\x7f\x10Q\xde\x15G\x8cUFn7\x8f\xfe]E/\xd6\x1e<\xacL\xb2$\x83\x0f69\xab\x1f\xfb\xdf\xc3\x8e\x15\x1ce\x0c,\xc98\x7f\xd2r-\x94\xbb/\xe3\xbc\xe5Z\xa5^\x92\x11\xe0\xe8\x00\x90\x1d\xa4.\x19\x8c\xbd\xf3\x06(\x05\x9d\xf4sE\xb9x\xa4FD\xd9\xa4\xbe\xe7\x8d\x15\x83I\xec\x12\xe4r\xf6\xc8#@\xc7x\xe8\x8cY\xcc.Q0.V\xcf%\x84\x11\xaf\xb2\xa3\xff+\x97\x9f\x10\x14\xd5?\xb3\x9f`+\x8c\x86dp\xc16g\xb7?9o\xd2`E\x97\x0c\xae\x8c\x81*\x19\xef~\xfd\xf5\x97\x9b\x86*c\xf5r\xa6d\\x\xf1,\xed8`\x8ar%\x8dG\x20\xa3\x03@v\x90\xa2d|m~dw^\xa4\xcc\xa3]\xf6\xc7\xafz6\xfe\xa89\x93\xd6\xb2#\x85\xb1\xec\xfc\xdc#@\xc7x\xe8\x8cYl\xde_9\xd2.\xe0\x8c\xa0{\xa7\x14\xa8\x1b\xe7O\xff2\xa6\xa8~\xa4\xc0K\x06\x17l\xf1\xf0\x20\x16?|\x94.\x19\\\x19\x03s-\xe3\xc4`e\xb8V\xac\xc3u\xc9\xf4\x1e~\xf9\xf3%\xeeZn\x90\xa3\x03@v\x90\x9ad\x8c4\x8e\xa4U\xe6\xa9\x93\xecs\xeer$\xb5\xdf\xf3g\x07(\x9d'\xce+\xf8\x92z\x058\x1e:c\xac\xa3\x8c\xa1\xda\x07\xaf\x20\x82\xb2\xc3\x84y\x17+\xcau1E\x05\x92a\x07\x9b\xdc\xa3(\xd3\x97\xbf\xf6\xa5yb\xe2-\x19t\xbb\xa2\xafp\xb8%c7\xf7\xb8C9\xcf\xba\xca\x1a\xe8\xe8\x00\x90\x1d\xa4&\x19\xe3\xedk\x05\xf3\xd8\xe6@\xf3\xc6\xe8\xed\x1d_s\xef\xf9Y\xca\xe2'\xf4H\x8f\x00\x0d\xf3\xa1#f\xb1qx\xfeeD\x9d\x96\xc2\x88?o7J\x9f\xff\xb5\xbbh\xacd\xf0\xc1:_\x17\xb0\x1b:)[{\xf4\x93\x0cvw\x07\xbb\xb8\xe2\x96\x0c:\x98]71C\x06Z\x97E\x03\x1d\x1d\x00\xb2\x83\xd4$c\xb5\xf5\xe5\x89\xceA\xecb\xe1te\xb86\x15\xd7*\x91\x13\xdc{\xfeUe\xecXm\xb2y\x05h\x98\x0f\x1d1\x8b\x95\x886=\x17\xb3\x8b\x90\xa2\x08\xf5h^\xbb\x1c\xf1\xaer\xdeYwQ\xa7d\x9c\xd0\x0e\xfd\xed`\x9d.\xe3\xc2\xc4\xe7\x17\xb1\xca\xe3K\xc6\xe7\xee\x8b\xac\x06O*\xfa\x95R\xed\xae\xae\x07\xad\xdd\x81\x8e\x0e\x00\xd9Aj\x92\xa1\x9e\x83+\xe3Wwt\xed~p\x90r\xb1:\x99\xde\x8d(\xd3\xd5\x0f\xf3W\x07\xb2k\x08\xdc{~H$2H\x9b\x0c^\x01\x0c\xf3\xa1#f\xb1\xa2\x0cW\xe7\xe7\xda\x02\xf5\xbcD\x1c1V\x19\xab\xca\xc0\xe7\x93\xd8\xe1\x88\xab(?\xfd#\xca\xca/\xbfv\x04\xeb|=@\xbb\xde\xd1\xa9\xf6\xe4\x0a?\xc9\xa0+\x15\xe5\x1e\x81d\xa8\xc7\x13\xca\x94\xed\x9f\x7f\xbd\xf76\xc5\xf1\xb5\xb4`Fg\xf9\xc3\xdb)\x00\xd9B\x8a\x92\xf1\xb9\xf9\xf5nmb\xab\x1f\xac\x11\xe5\x82\x91C\x14\xe5\xf2\xb3\x8eIq\x8fb.Ix\x040\xac\x87|\xccbe\xc8\x05\xe7\xb3\x1b\"\xef\xf1\x8a\xf8\xcb@%r\xf1\xf0\x02ePGLQ~\xfa\x8fTs\xdc\xe4\x0c\xd6yXQ\x06_1\xf2\xbc\x01w\xb1\xeb\xab>\x92\xa1\x8a@\xa4C\x20\x19g\xa7\x98\xc3p\x05\xffM\x96`Fgx\x9ck\xb8\x00\xf47)J\x06\xa5/\xcd\x1a:\x20r\xd1\x15\xcb\x8d\x0f\xd7\x8eYC\"\x05#\x1ff\x87\xfd\xdc\xa4\xe8P\x14\xf3\x16Hq\x00u<\xe4b\xd49\xbc\xfb\x8a\x82\x81Wl\xf7\x8c\xa0\x9ds\x86D.\x18z\xd7\x09AQm\x97>\xfd\xdf\x1du\xc1\x80\x95\xae`\x9dM\x97\x0f\x8c\xa8{>g\xab%~\x92\xd1\x11Q\x8fOb%\x83\xd2\xed\xd3\x87^\x10\xb9h\x92\xfb'v\x82\x18\x1dH\x06\xc8&R\x96\x8c4c\xcea\x00@V\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x90\xed\x92\x01\x00\xc8*\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x20\x19\x00\x00\x09\x82\x97\x8c\x1a\xf2S\xbf\x10\xc6*\xf2}\xbf\x10\x1f\x8e\xf7\xfaE\x00\x00\x82&\xb4\x92\xd1\xf7\\\xc9i\xbf\x18\x00@\xd0\x84V2z\x08\x81d\x00\xd0\xef@2\x00\x00\x12@2\x00\x00\x12\xa4$\x19\xbb_\xb3\xd8m\xed\xd4%c\x1dY\xf5\xd7\xc6\xf2\xe2\x99\xdbh\xdf\xba\x19\xd1\x8a\xa6\xd3\xda\xbe\x15\x87\xea'\x96\xde\xfa\xeb>jI\xc6\xf1\xa6\xaahY\xdd.\xeaQ\xc4\x15\xd0|\xaa\xa9\"Z\xb5\xe4\x14\xa5\x8b\x08\xe3\x20\xa5G\x1a*\xa3\x13k\xd6`)\x14\x80~!%\xc9\xb8M\xb1\x98n\xed4%\xa3q2)\x8f\x12\xb2\xad\x81\x14\x97\x13R\xa3\xed\xab/\x8d\xd6\xd6\x14\x92\x86>S2v\x8d#\xc53\xab\x08Y\xe6Q\xc4\x15\xd0TAJ\xcb\x08\xa9\xee\xa1\x9b\xe7\x13R?\xff8\xfd\xb0\x94\x94\xddTM\xc8\x1d}\x82\xfc\x00\x00A\x93\x92dtEL\xc58\xaf\xc3\xdaiJ\x06\xa9\xfe\x90\xf6\xce'\xc5\xc5/\xf4\xd1W\x08\xd9\xaf\xed\x9b\xf61\xa5\xfb\xcb\xc8FC2\x8e\x97\x92E\xdd\x94\xee)#\xdb\xc4Eb\x02\xde\xa4\xb45J6X'&\xf5d\x89z\x80q`\x02i\xf5J\x12\x00\x10\x20)I\x86}\x98q\x9d\xbd\xcf\x92\x8cC\xea\x9f\x0f\x09if;oa\xb3|\x9dv&A\xe9\xcb\xa4\xca\x90\x8cE\xa4\x8e\xea{\xaa\xc5E\xdc\x01\x1f\xb1\x07\x8d\xa4\xd1\x92\x8ck\xf5*\xd7\xdc\xbb\x93\x02\x00\xd2Oj\x92a\x1efp\x07\x19\x96dLc\x0f\xba\x09\xf9\x80\xfd\x9dOZ\xd8>\xed\\\x83\xf6\x16\xab\xda\xa0IF%yE\xdb\xd3SH\x8e\x0a\x8b\xb8\x02n\xd4\x1e\xb4\x90zK2\xee\x205o\x9e\xa3\x00\x80~\"5\xc9\xa0sb\x0e2,\xc9\xa8e\x0f\xce\x11r\x92\xfd\xbdO\x97\x8cEz\xc8\x0c\xb2S\x93\x0cU\x1df\xdc\xaa\x11%m\xa2\"\xee\x00\xfd\x90c\x03'\x19oF\x09\x990\x7f\xf3\xdf)\x00\xa0?HQ2\xf4\xc3\x0c\xfe\x20\xc3\x92\x8cz\xf6@\x9d\xff\x9f\xb1\xbf\x86d\xfdf\x9d7g\xed\xe2A#\xbf\xa6gW\xae\x1c2t\xc0\x90\xdb\xaeS:\xbf\xdc>\xe0\x9e\x13\xf4\xc4=\x03\xb6\x7f)\x0e0\xeb4$C;\xcf\xf9ZQ\xba\xd8\xdf)\xbad\xdc\xa6G\\\xac\x9eF0\xc9\xf8\\Q.\x1e\xa9\x11Q6\x89\x8a\xb8\x03\xae\xb0\x1b0$\xe3\xd5\x88\xa2\x0c\xb8r\xf9\x09\xabG\xf4\xa3\xadE\xa4\xa2\xf9g\x13\xefe\x0f~X\xb8h\xe7\xba\x8a[\xfbh\xf7\x9b\xed\xd5w\xb4\xb7\xb7\x1f1\xa2\x9a\xa2\xda\xcc\xa6Q2ck\xeb5j,\x17\xc0m\xb2\xca\xa6\xaej\x9e:\xeeC\xcas\x88\xec\xec\xe9\xe9ic\x92\xb1\x834\xed\xd9V_\xb8\xcf\xd9\xf0\xd1\x897\xbe\xd0ZG\xa2z\xb8%\x19V:=\xdb\xb6N\xad\x9eP\xf5X\xc3\xe8\xbfR\x90\xd7\x84M2(\xdd\x14Q\"\x9b\xb4\xad\xcf\xef\x1f\x15Q\x06\xb2C\x88\xb5l\xb1\x81\xbe\xa6/k\x8cT\xaeP\xe7&\x9b\x9e\xb3\xd8\x82\xe5u\xb3\xbc\x03t\x0c\xc9\x98\xc4\xb6]\x921O\x8f\x18\xa9\x16d\x92\xd1\xa5\xd8\xac\x14\x15\x11\x068$\x83\xee\x9dR\xa0>y\xfe\xf4/\xad\xf6i\xb4L\x95\x83\x86\x0a\xca\xe6\xf3\x8b\x94\xcd\xd8\xadl7\x7f\xb2q<\xba\xd0\x88\xad\xf8\x87:\x93+\xa8+\xc0\xde\x8cN;C\xe9\xe9\xaa\x1a\xcas\xc88\x0eQ%\xa3g[\xb7z\xf4p\xd3|-\xd6jxn\xb5z(\xd17;\xaa\x87\x9b\x92\xe1L\x87\xd4\x9e\xa1}\xf1\xd6OA>\x106\xc9\xf8\xfc\xb6\xc8`ep\xe4.\xe3S\xfa\xecK\xe3\xd9:\xe2\x94\xa1_3\x06Og\xfbFF\xcc\xe3\x87\xed\x05_\xd2\xb3\x05\xec\"\xacG\x80N\x1c\xc90\x8e2\x86\xaa\x87\x0c\xc6QF\x87]NPD\x18\xe0\x94\x0cuk\xfb\xbc\x8b\x15\xed*\x8cA\xf4!j\xac#\xc9Pg\xdd@\xfd\xf0b\xd0`\xed@\x9f\x09\xc0&\xfd\xb3}\xde\x83\xe6\x0e\x83W#]\x91W\xd9\x86W\x80F\x1c\xc9P\x86\xab\x9a\xb1\xb6@=/\xd1%\xe3\xdd\x882]m\xf5\xd5\x81\xca\x1cq\x11Q\x80\xf1U\xd9\x88\xb2\xf2\xcb\xaf\xe9Xe\xac\x1a\xfd\xf9$\xfe^.[\x06\xda\x88vs\xe7O\x9fc\xff\xd6\xd6RzJ\xdb\xf1Y\xf1C\xb1\xb1|\x00\xb7\x19\xbd\xa6\x9b\xd2\xee\x1bj\xb5\x88\xe3\xcf\xe9R\xc3IF\x15\x9b\xf9}7;%\x83\xd6T\xa9'2\x1f\x17\xeb\xf5Z\x92\xe1H\xc7\xe7:.\xc8\x13B(\x19&\x83\x94\x8b\xee\xd9\xb4\xfa\x8a\x02\xb6x0O\x99\xb2z-\xbb\xab\xeb\xebW\xb7\x0f\x1d\xbb}\xbb\xb9X1\xf8\x8a\xc1\xfa\x86W\x00#\x8ed\x0c\xb9\xe0|v+'\xbb\xefB\xbf\xfbsuD\xb9`\xa4\xba\xe7\xf2\xb3\xe2\"\xa2\x00C2\xd8\xc9\xd1&\xfa\x97\x81J\xe4\xe2\xe1\x05\xca\x20k\xcd\xe3\xb3\xf6h\xe3;}\xef7F\xdb?\xa3t\xd9\xe8\xef\xbf\xd2\xdaH^fO4G\xd7\xb4\xd6\x96~\xaan=>\xfa\xa8\x20\x96\x0b\xe06\xa3\xe4\x96m\x9b\xab\xcb>\xd6\xe2\xe7\x93z\xf6\x87\xbf\xfb\xb3\x99\xdc\xb7~\xd5\xad\xa4\xbc\xe5\x1d\xbe\xb2\x0f\xc7U5?3\xb9\xb0\xe8\xc5C\xf4Sv\xf7\xe7\xba\xf6vv\xc8b\xa5s\xee-\xed\xa2\xccq\x0a\xf2\x9d\x10K\xc6\xa8\xe5\xf3..\x184I\x9fz\x9b\xc6\x0e\x1cx\xb9z,\xb0\xfb\xd3U2\x8e\x93\x89\xfa\x92d=9bH\xc6\xf1\xa6\xaahY\xdd.uk\x11a\x1cd\x92\xf1YSE\xb4\xeaq}\xc6\x7f\xd8X\xa9\x06\xb4\xe9u\xec\xa9\x9b\\Z\xbb\xcf!\x19G\x1a*\xa3\x13k\xd6\xe8\xf5\xc6\xd6\x06\x00\xe8\x1fR\x92\x8c\xdb\x14\x8b\xe9\xe6>U2\xe8\xcd\x84Mg\xda]|\xd39]2v\x8d#\xc53\xab\x08YF\xe9\xe6\xf9\x84\xd4\xcf?\xaeJ\xc6\xcc\x0aR^F\xc8\x0c\xb6\xf0\xf1b\x94\x94\xdeTN\xc8BV\xae\x85\x90\x8a\x99\xd1\xa2\x1aN2>,%e7U\x13rG\x9f\xb86\x00@\xff\x90\x92dtEL\xc58\xaf\xc3\xdc\xc7$\xe39\xd2\xc46\xb7\x91U\xbad\x1c/%\x8b\xba\xd5\x83\x872\xb2\x8d;1!S\xdf\xa1tG\x94l\xa6\xf4@!y\xba\x87\xf6m-&k\xd4\x07d\xf4\xfa>z\xaa\x96p\x92QO\x96\xa8\x07\x18\x07&\xb0U\x12Qm\x00\x80\xfe!%\xc9\xb0\x0f3\xae\xb3v1\xc98J*\xd8\xd1\xc0|rT\x97\x8cE\xa4N{\xeeeR\xcdK\xc6a\xb6\xaf\x91\x09C=y@\x0bXO&\xf7\xd2{\xc9\"\xb6}\xfa*N2\xae\xd5O>\xd6\xdc\xbbS\\\x1b\x00\xa0\x7fHM2\xcc\xc3\x0c\xfb\x20C\x93\x0c:\x93\xa8\x07\x10\xdd%3\xa9.\x19\x95\xe4\x15\xed\xb9\x9eBr\xd4\x96\x8c\x19\xda\xbe5\xa4\x9e\xf6\x96\xb0x\x95\xdeR\xf2f\xdf\x04\xb2_{\xb0\x88\x93\x8c;H\xcd\x9b\xe7\x8cmQm\x00\x80\xfe!5\xc9\xa0s\xdc\x07\x19\xbad4\x93\xc7)m%\xcd\xbadt\x132\xe3V\x8d(i\xb3%\xa3V\x8b\xdf\xa8\xfe\xfd\x98\x10\xe3N\x8e\x1a\xb2\xf1\x14!\xdd\xc63\xb6d\xbc\x19%d\xc2\xfc\xcd\x7fW7\x85\xb5\x01\x00\xfa\x87\x14%C?\xcc\xe0\x0e2t\xc98L\xa6R\xba\x80\x1c\xd1%\xe3Sb\xb3\xcd}\x91\x95I\xc6ARd\x94\xae%k\x8e\x10\xa2o\xb7\xf2WL>\\P\xa2\x96.j\xec\x16\xd7\x06\x00\xe8\x1fR\x94\x0c\xfd0\x83;\xc8\xd0%\x83V\x93\x83=\xeay\x89.\x19\xa7\x89*\x1e\x16\x02\xc9\xf8\x84?\xca\xf8\xbby\x94\xf1\xb2\xf3\xbe\x8c\xde\xf6\xa7g\x12\xd2\x20\xae\x0d\x00\xd0?\xa4*\x19\xec0\x83?\xc80$\xe3i\xb2b\x87z^b\xace\\\xc5\xaem0\xf6||N$\x19\xbd\xc5\xf6ZF{_\x19yK{\xb0\xcc\x96\x8c\xbe\x8f\xdf\xd0\xfe\xae!E\xe7\x84\xb5\x01\x00\xfa\x87T%\x83\x1dfL\xe1\x1f\xeb\x92q\x80\xccld\x07\x03\xbad4\x92\x9b\xd8\x15\x14\xba\x93\x14\x9f\xa2\xbd\x84\xfc\x83:%\x83\xd6\x1b\xf7\x8bn$\x13zh\x83\xfe\xa0\xa7\xca\x96\x8c\x93d\xf4g\xec\xef!R\xd8+\xac\x0d\x00\xd0?\xa4,\x19\x9d\x11\x85?\xc80$\x83V\x91q\xec\x8a\x88.\x19\x87\x8a\xc9Cg(}\xbbL\xbb_#J\xb6u\x9fsJ\xc6\xfe\"\xb2\xa2\x97\xd2\xd6\x12\xd2B\xe9\x91(Y\xd5G\xcf\xcc'\x8e+&w\xa8\x9aqz>\x0b\x16\xd5\x06\x00\xe8\x1fR\x96\x0c:\xc7q\x90aJ\xc6\xe3\x84\x9d\x97\x18\x92A[\xa3\xa4x\xf64B\xe6\xb2%\x8b\xd9\x84\x906\xa7d\xd0\xcdEd\xe2\xcd\x15\x844\xb1\xe3\x87mQR~s\x09\xa9\xe7$\xe3X\x19\x89\xde8\xb3\x84\x94\x1f\x15\xd7\x06\x00\xe8\x1fR\x97\x8cN\xc7A\x86)\x19\xef\xe8ZaH\x06=\xf2\xa3\xaah\xc9\xec\x16\xed+\"\x87j\x8a'\xbe\xec\x92\x0cz\xb0\xa1\"zM}\x9b^\xc7\xfb\xf3\xcbKnm\xdb\xc6/\x7f\x1eo\x9a\x16-\xae^\xfaw*\xae\x0d\x00\xd0?\xa4.\x19\x00\x80<\x02\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92A[kN\xf9\x85H\xf2\xd5\xdcV\xbf\x90\x14\x08>\xdf~\x20\xbdC\x02\xfa\x91\\\x93\x8c\x85\xa4p\x9b\xc7S\xc7\xa3d\x86`w\x0bi\xees\xee9X_>\xf1\x8e=7\xbd)\x08N\x8c\xbe\x96\xc2\xe7\x84O\xac)\xfe\x99p\xbf\x0cz\xbe\x8d\x84\x90qG\xcd}\xbb*v\xc4+\x928\x07\x0b\xd5z\x1b\xad\x87\x81\xd5\xeb=$\x20l\xe4\x8ad\xec9\xa0\xff=\xd9\x1em\xf6\x08\xe9{\xa71\x1a\xbbw]\xe1\xaf]{\x0eD\xeb[_\xbe\x97\x10/\xe9I\x84\x9dE\xebD\xbbgGo\x12\xed\xf6\xc1\xec\x9b\x86\x91\xef\xdf\xda\xdb\xd7\x93\xb7\xcd\x9d;J_\x89)\xe5\x8f\xa3^\x9dso\xdf|S\xfb\xa7\xd6Ca\xbd\x82b\x89\xe01$\x20l\xe4\x8ad\xd4<`nyJ\x06\xa5\xcd\xd1\x98]\xc7\xa2\xcb\xcc\xcd/j\xbf\xd0\xfe\xd6\xd5\xaa\x9f\xe2}\x8d)I\x06]\x11\xfd[\xec\xce\xee\xc2\x86\xc2\xee\xd8\xdd~\xd8}s\xe4\xbb\xcf\x96\x0c\xea:NJ\x0c\xbe^\x8b\xdaZ\xfe\x91\xa8^a\xb1\x04\x10\x0e\x09\x08\x1d\xb9\"\x19\xb7\xdegn\xc9IFcE\x8f\xb9\xf9!\xf9P\xfb;\xed\xa7\xec\xdf\x83$\xa5\x93\xef\xee\x0a\xfb\xf0\xde\xa2\x9d\x1c\x20{bw\xfba\xf7\xcd\x91//\x19I\xc1\xd7k\xe1\x94\x0c\x11\xc2b\x09\x20\x1c\x12\x10:\xc2%\x19\xe7\xae\x89>}m\xe5\x9eEe\xb5\xec\xc3\xba\xef\xd75\xa57>\xaeN\xa1\x1dD\xe7\x16\x16\x13]\xfa\xd8\x8d\xe3\xea\xb4\x0f\xb4\xbe\x0d\xb7\x8c\xbby\xbd\xf6Iy\xb2\xa1\xb2lA\xec\x89I\xef\x84\xa5\xfa\xc6\xba\xea\x1dG\xc8\x91\x9d\xd5\x1b(}\xa0\x82IG\xdfNG\x13\x07\x8b\x08y\xe6h\xc3\xb4\x92\xbas\xdb\xd4\x96\x9ai3\xd1N]D\x01Z\x85+J\xac\xb9m\xd1|-\xad4\x04\xed\x93\x05\xe5\xd1\x8a\xfa\x93\xceM\xab\xb2\x85\xa4h]S\xe5\xe4\xfa\xa3\xae\xbe\xd9\xf9R[2N\x97\x10R\xb8U\xdf\xf7F]U\xb4\xbc~\xaa\xe3\xe0`!\x89n\xb4\x87D8f\x1c\xb6d\x08\xebu\x14\xe3\xf2\x155\x91\xc8\x90\x80\xd0\x11.\xc9\xa0{&\x92\xc7j\xc9U\xcf]\xb3F}\xf0\xc3\xc2E;\xd7U\xdc\xdaG\xbb\xdfl\xaf\xbe\xa3\xbd\xbd\xfd\x08\x0b\x89\x92\x19[[\xaf\xb9\x97m>\x14}f\xe73Q\xf6\xd9vt\xe2\x8d/\xb4\xd6\x91\xa8\xbb\xbe\xf7I\xbb\xbeq\xb2\x81\xccT\xff[\xa0\x9e\xc7\x1f\xaf*\xack~\xabW\xdbm5\xd1\xb3m\xeb\xd4\xea\x09U\x8f5\x8c\xfek\xf7\x1b\x13W\x9c\xa2\xa7V\x94\xbd\xd1-\x0e\xd0J\xbeI\xder7Fk\x17\xd0\xfb\xf4\x19\xb9\xa7\xf4\x96\x96]\xcdd\x8ds\xd3\xaa\xec\xa3\xadEd\xea\xaa\xe6\xa9\xe3>t\xf6\xcd\xce\x97rG\x19\x07\xda\xdb\x8bu%\xda?\xba\xe1\x95]\x1b\xcb\xc99\xbeUVYE\xf3\xcf&jC\"\x1e3\x0e\xee(CT\xaf\xa3\x98#\xdf\xd8&\x12\x19\x12\x10:B&\x19\xb4\xa2\x81\xee$;\xe8CM\xecs\xf2E\xca&\x8e\xf6A\xc8\x9d\x98T\xfcC}\xdbV\xa8[m\xa4\xcd\xfcwn\xb5\xfa\x01\xd77;\xea\xaen'\xf9\xd8\xdcl\x8b\x92h\x9b\xb6\xf5\xd5\xaa\x9a()cK\x19\xce&H\xed\x19\xdawF\xdd\xfa!;\x9bo\xf8\x91w\x80\xca\xdfH\xcc\xcaa_\xe9\x1a\xba\xa6\x94\x1d\x01\xf4T\xd5\xa9\x92\xd4\xbb\xed+\xc7&_Yt\x9aZ\xcf\xe9\xaa\x1a\xad^\xfbL\x80\xcb\xd7qbR\xa2O\xed\xf5\x15L,\xd6\x97\xb9\x96\x20\xa2e\xea\xc7\x7f\x03\x1b\x12\x8f1\xe3p\x9e\x98\x88\xea\xb5\x8a9\xf2\xf5h\xc2gH@\xf8\x08\x9ddl\xa5\xef\x90n\xba\xf4\xfb\xea\x09\xc4\x0d\xbd\xe7T\xae\xd5\xce\x909\xc9P\xd5D_\xb5\xf8\xe1Lm\xc7\xccFz\x9ald[\xcfD\xdd\xd5\xb5\x92\xe3\xfa\xc6W\x8fE+Ie\xf1\xd2\x7f\xe8\x0f{w\xd5\x91\x9d\xee&\xa2\x7f5J\xedQ\x8f\xb0{\xc6\xb1\xcf{\x8f\x00\xca\xe6G\xcc\xf2\xe9A\xf2f\xcf\x9b\xe4\x20e2\xf6\x81\xb9\x93\xdb\xe4+\xd3W9\xd7\x13UI\xf8\xa9m\xe5K\x85\x92\xf1i\xe5\xb4E\x1b?\xe8\xeb\xa5N\xa2\x0fQcH<\xc6\x8cC(\x19\x8ez\xadb\x8e|=\x9a\xf0\x19\x12\x10>B'\x19mt_\x94\xd2e\xaad\xcc6N\xab\xe7\xb3\xfd\xae\xe5O\xed\xcd;\xb7^\xdbQ_C\x0f\xe8\xc7\xf3\xb1\xcb\x9f\xef\x98\xd3\xae\xa5|\xc3!\xf2\xd1\xba\xf2\xe7\xd4\xa9\xa8\xad0\xf4\xb1\xd2\xce&j\xccR\xe7\xca[ik9\xfb\xc8\xf5\x08\xa0lB\xc7\xdc\xd7\xb1N\x0b]\xa7m\xf5\xd8;\xadM\xbe2}\x11\xb7\x9d\xb0\x0b\x9a\xdc\xd4~\x87\x93\x09\x81d\xd0\xd3\x1b\xee\x9bA\xaeiq\x1feXC\xe21f\x1cB\xc9p\xd4k\x15\x8b\xc9W\xd0\x84\xcf\x90\x80\xf0\x11b\xc9h\xb8\xe1\x80\x86viT{\x1fof\x1fi\xf6\x9b\xb7\xf1\x06\xf6\x16\xef\x9b\xf6\x10\xfd\x07Y\xcf\x82\x1e\x8a\xba\xab\xeb\xb1\xae\xaf\xf4\xd2\x0f\xc9!\xda\xab\x96\xa8X\xa4\xed\xf8i\xb5\xbb\x89\x05V\xb1E\xf3\xe9\xbdZ\x94W\x00\xcb\x20\xe6r\xea\x82[\xf6\xed\xdbw\x0b\x0b\xdaE\xac{\x1b\xb8M\xbe\xb2\xe8\x12\xb6g#a\xc7\xf4v\xdf\xb8|\x85\x92q`\x99\x9a\xff\xe9\xad%\xeb\xa9\x03{H<\xc6\x8cC\x97\x8c\xee\x15_i\x8fD\xf5Z\xc5\x1c\xf9z4\xe13$\x20|\x84X2\xda\xf4\xe3\xdc\x9fjw\x15\xb2w\xfa)m\x87\xfd\xe6\xdd\xa9\x9dOoeg\x185U\xea\x14\xf8\xb88\x1aS\xdf\x82j\xeb\x13\xf9\xd32\xfd\x1e\xa6\xf2J6]\xfa\xd8\xbb\xdd\xd1\x04\xf7\xa1\xfcV\xf1g\xc5\xdaR\x9eW\x00\xed\x9bQO\xddT>\xae\xfe\xf3X%e\xd7\x1bk\xd9A\xfe\xa2%\x8eM\xbe\xb2\xe85\xea\xf4\xea\xbeA\x9b\xbfv\xdf\x1c\xf9\x0a$\xa3Y[\xbd\xa1\xb5M\xd4\x81=$\x1ecF\xe9\xf1\xe7\x8e\xe9\xb1\xbad\xbcO\xde\xd0\x1e\x89\xea\xb5\x8a9\xf2\x157\xe17$\x20|\x84L2\x0eM^\xd3\xb35z\xb0\xa7\xa1\xf6o\xaan\x8c\xfe\xfe+\xad\x8d\xe4e\xf6DstMkm\xe9\xa7\xf4\xb3\xf6h\xe3;}\xef7F\xdb?S?\xf0\x0a\x97\xedXV\xd8\xa0>\xfd\xe1\xb8\xaa\xe6g&\x17\x16\xbdx\xc8U\xe1\x91\xc2\x98[\xb8\xcbIEs[km\x09[h\xb4\x9a8\xf7\x96v\xa5\xc0XI\xe8\xab\xac\xab\xd4\xa7\xaeG\x00]c\x1f<\x18\xf4\xb4\x91\x9fv\xd3\xee\xa7I\x9b*\x11{\x8agnh[D6S\xc7&\xd7\xa1(\xb9e\xdb\xe6\xea2m\xb1\xd3\xec\x1b\xc3\xcc\xf7Sv\xf7\xe7\xba\xf6v\xf5\xc3\xbe\xf7\xed\xf6\xf6\xe2\xc6\xf67\xce\xb0\xa9]\xbab\x87Z\x83\xe3\xe6\x0f\xc7\x90\x88\xc6\x8c1\x9fh\xf3\xf9\xdc[7\xdf\xd4\xae\xb2A=\x93\xf3\xaa\xd7.fU&n\xc2wH@\x18\x09\x97d\xf4]C\xc8\xd6\x09\xa4t\x9b~\xaa\xdcV{U\xd9\xdc6\xed\x99\xdeE\x93K\xee\xd8\xc7\xee\x10\x20$z\xb8T\xfdw\xa1\x1a\xben\xf6\xb8\xd9\xfa}\x19G\xeb'O[\xfab\x11\xdb\xebdE\xb1\xfb\x04\xbbf\xf3Og\x94V\xcc\xd7/M\x98Mh_\xbe\x20\xc4\xfc\x9c\\\x17]cl\x89\x03\xde(\xb1\xef\x9f0\xd85\x9a\xdd\xc8\xd1J\xc8\xe8]\xea\xa3\x8f\xef\xbbvB\x8d~\xb3\x18\xb7iw(\xfax\xe3\xc4\xca\x86\xcf\xb4\xbdf\xdf4\x8c|\x1f2V\x0c\x1e\xa0t\xbf\xde2\xd9@\xe9\xaf\xefh\xae\x8aV\xd4:o\x17s\x0c\x89h\xcc\x18/Tl`\x7f\x8c^\x10Rr\xc4\xb3^\xae\x98Y\x99\xb8\x09\xdf!\x01a$\\\x92\x91\x06\xfa\x96D\xb7\xf9\xc5H\xb3-\xda\xe8\xb85B\x1e\xefo\xca\xa4#\xdf~\x20\xf5!\x01\xd9A\xdeK\x06\xed[s\xed\xdf\xfdb$\xf9\xaa\xe2\xb9\xa4\xbe\xf4\xc1\xe1}\xdb{\x1a\xf2\xed\x07\x02\x18\x12\x90\x1d@2\xb2\x938\xdf\x94\x01\x20\x93@2\xb2\x91\x93\xdar\xa2_\x14\x00\x19\x00\x92\x91\x8dh\xcb\x89\xf6}\x9e\x00d\x0f\x90\x0c\x00\x80\x04\x90\x0c\x00\x80\x04\x90\x0c\x00\x80\x04\x90\x0c\x00\x80\x04\x90\x0c\x00\x80\x04\x90\x0c\x00\x80\x04\x90\x0c\x00\x80\x04\x90\x0c\x00\x80\x04\x90\x0c\x00\x80\x04\x90\x8c4x\x9cf\x8f\x01i\xf0}\x031d\xcf\xcb\xdd/\xe4\x9add\xaf'\xeb\x0b\xc4\xb4?\xd9,(bb$\xe9\xb4\\5\xe0jh-2~\xd7\xa2\xa8\x95\xdbl\x1b\xcd\xfeN\xae?b\x96\x88\xed\x9b\x88\x98bn\xe2\x0c\xaa\x1f\xc9\xba\xba\xc6\xbcX\xbe9d\xae\x17y\xe67\x9b+\x92\x91\xfd\x9e\xacg^$\xcf\x9d\xa2\xa7Z\xc8\x8bgD%\x0c\x8c$\x9d\x96\xab\x06\\\x0d-\xc4\xf8U\xae\xd1-\xdcf\xcf\x9b\xd1\xc6\xf6=\xeb\xaaK>\xd2\x0b\xc4\xf6M\x88\xbb\x98E\x02\x83j\xe1\xe1\xd4\x9a\x9c[\xac\xe0\xc5\xf2\xcd!\x93\xbd\xc8+\xbf\xd9\\\x91\x8c\x10x\xb2\x1e\xd2~@s\x0fq\xff\x96\xa0\x0b3I\x81\x7f\xa2]\xc3\xba\xa8\x11P\xb2\x8e\xdb4:\xdf]Y\xa7\x85s}\xf3\xc1Q\xcc&\xa1A5\xf0rjM\xe0(GL\xcc\x8b\xe5\x9bC\x06{\x91O~\xb3\xb9\"\x19!\xf0d\x0dR2z?1\x02>\xe9\xe56\xcd\xce7\x97hoq\xaeo>8\x8a\xd9$4\xa8\x06\xc9:\xb5z\x92\xa4dd\xa6\x17\xf9\xe47\x1b.\xc9\x08\xb5'+'\x19g\xee\xab\x8cV\xd53\x13$\x87\x9b\xa9#IK2\xac&\\\xa2\xc3i\x8a\xb5\xa9O\x8a\x96\"\xf6\xa3\xe5f\xdf\xb8\xcc8\xafW\xca\x9b\xc1\xda\xc5\xec\xcc\xbc\x06\x95C\xe4\xd4\xca\x8f\x83\xed\xea\xea\xe8\xe6\x17\x0dW]\xfb\xf8\xe3W\x95z\x1e\xc6q\xe3`w\x9eF\x17\xfdHO}!)|\xd9Z\xec\xe0*\xcbd/\xf2\xc8o6\\\x92\x11jO\xd6CdgOOO\x1b\x9b\xf0;H\xd3\x9em\xf5\x85\xfb\x9c\x86\xa9\xce$-\x19\xb0\x9a\xe0k\xa0q$\xa3\xef\x96\xd9l\xdb\xec\x1b\x97\x19\xe7\xf5\xea0\x83\xb5\x8b\xd9\x99y\x0d\xaa\x8d\xd0\xa9\xd51\x0e\x96\xab+\xdf\xcd\xde\x99\x15\xeb\x9b\x8bK6\xd7\x99\xbf\xb8\xec\x86\x1f\x07\xbb\xf3\xda\x8f\xaeo\x9d\xad\xa6\xae-J\x18\x8b\x1d|e\x99\xecE\x1e\xf9\xcd\x86L2\xc2\xec\xc9z\xc8\xf8\x10;\xc4\xde\x91\xaa\xda\xf4\xdd\xa4\x19\x8a\xd9n\xa6\xce$M\x19\xe0\x9a\xe0j\xa0\x1e\x92\xb1\xa2\xa7\xe7\xe0\xbd\x84\xfd\x869\xdf7;3\xdb\xeb\x953\x83\xe5\x8a\xf1\x99\x09\x07\x95C\xec\xd4\xea\x1a\x07\xd3o\xcd\xee\xe66\xe61\xb9>\xce\xf9\x197\x0e\x0e\xdb\xd7\x19\xea\xee\x9ej\xe6\xbff\xbb\xa6\xf0\x95e\xb2\x17y\xe47\x1b:\xc9\x08\xaf'\xeb!\xf2\xb3}\xfb\xf6\xad\xd1\xdee_\xac\xaf\xbba\"\xd1\x0e\x06,7SW\x92\xa6\x0cpM\xf05xH\x06S\x94r}\x15\x86\xf3o\xb53\xb3\xbd^93X\xbe\x18\x97\x99pP9\xc4N\xad\xaeq\xb0&\x9be\xda\xba\xacL\xfd\xe7c\xef\xa5\"~\x1c\x1c\xb6\xafO\xb3\xdd\x1b\x98M\xad-\x19|e\x99\xecE\x1e\xf9\xcd\x86N2\xc2\xeb\xc9\xca\xadD\xec\xab\xa8Z\xda\xda^\xabK\x86\x99\xaf+IS\x06\xb8&\x12X\xcbh\xda\xb7\xef\x13c\xf9\x8f\xf3o\xb53\xd3\xcf\xf7\x99\xd7+g\x06\xcb\x15\xe33\x13\x0e*\x8f\xd0\xa9\xd55\x0e\xd6d\xb3jX3\xfa\x0bv\xec\xf7!\xf5\x80\x1f\x07\x0f\x9bZqe\x99\xecE\x1e\xf9\xcd\x86X2\xc2\xe6\xc9\xcaM\xf8\x195l\xba.pJ\x86+IS\x06\xb8&\x12\x90\x0c\xb3;\xd4\xe1\xdfjgf{\xbdrf\xb0\\1>3\xe1\xa0r\x88\x9dZ]\xe3\x10;\xd9\xfeZX\xf7\xd7\x83\xd5s=\xaf[\xf2\xe3\x10kS\xbb\x99\xd9\xd4j\x95=\xe3\xae,\x93\xbd\xc8#\xbf\xd9\x10KF\xd8@\xca\x1b\xbd\x7f\xf8\x13d;\x90\x8c4\xf8\x96f\xc2\xa43\xf8^\x04M\xdf\x8c\x19\x1bw\x1dW\x95\xa3\xfd\x85\x19W\xe9?\"\x98\x89\x81\x02)\x92k\x92\x91\xdd\x9e\xac\xa4\xbc\xee}A\xbcM\xb2\x16\xa6\x09\xba\xafz\x93d\xc3\xffh\xba\xa6\xa4>\xc1\x86\x0f\xea?\x7f\xc5\xd8\xc3~\x9e\x9bz\x0c\x14\xc8nrE2\x120\xde\xcc\x02O\xd6\xf6\x17jF\xef\x11\xc5\x9b\x08\xcd?=\x8cBy\x12t_\xf5&\xc9\x86k+6g1\x97\xb7\xa7a\x98!6\x0a\xf5jM\xe4\xbe\xca[\xae\xda\xf9\xba\x92\xe4\x88u\x1dM\xa0a\xeb\xc4\x843A\xe5\x1a\xe6\x8a\xcdW\xbb\xce\x9d\xc4\xb0\x9f\x037~\x8c=v\xa0\xbcZ\xb36\xb9\x17\xd6\xbbC\x20M\x84N2B\xed\xc9\xfa\xce\x8e\x9a\x92\xe3\xceb.oOc\xe6\x8a\x8dB\xbdZ\x13\xb9\xaf\xf2\x96\xabv\xbe\xae$9b]G\x13h\xd8^\xcb\xb0MP\xb9\x86\xb9b\x7fm\xdb0c\xb2\xb5P\xda]1m\xdd.#\xe7\xd8\x81\xf2j\xcd\xda\xb4_X\xea\xdd!\x90&B'\x19!\xf7d=]\xb8\xc1Y\xcc\xe5\xedi\xce\\\xa1Q\xa8Wk\"\xf7U~\x99\xd5\xce\xd7\x95$G\xac\x1fX\x02\x0d[\x92\xc1\x99\xa0r\x0d;\x8a\xd1v\xdb\xb0d\x9f\xeeMol\xbb\x07\xca\xab5k\xd3~a\xa9w\x87@\x9a\x08\xb1d\x84\xd3\x93u\xe2\x0ag1\x97\xb7\xa71s\xc5F\xa1^\xad\x89\xdcWy\xcbU;_W\x92\x1c\x9e\x92\x11\xafaK28\x13T\xaeaG1\x8f+&\x82\x81\xf2j\xcd\xda\xb4_X\xea\xdd!\x90&B,\x19\xe1\xf4d\xadXrp\x15_\xcc\xe9\xedi\xce\\\xb1Q\xa8gk\x02\xf7U\xder\xd5\xce\xd7Y\x8cG$\x19\xbe\x0d[\x92\xc1\x99\xa0r\x0d;\x8ayH\x86`\xa0\xbcZ\xb36\xb9\x17\xd6\xbbC\x20M\x84L2B\xec\xc9j\xdc0][\xdfx\x13\x9f:\xe7\xedi\x9b\x7f\x8a\x8dB\xbd[\x13\xb9\xafZ\x96\xab\xd4\xce\xd7U\xccD\xec:\xea\xdb\xb0~\xc5D39\xe0MP\xb9\x86\xf9WH\x15G\xeb\x0c\xe4\x1d\xfbz\xab\xc8\xcdT\xd4\x9a#u\xeb\x85\xf5\xe8\x10H#\xe1\x92\x8c0{\xb2\xb2\xdb#Z\xd4\xb8\xea\xf2\x1d\\1\xde\xdb\xd36\xff\x14\x1b\x85z\xb6&t_\xb5,W\x19F\xbe\xeeb\x06b\xd7Q\xbf\x86{\xcb\xb4\xcd\"v\x15\xd6a\x82\xca5\xcc\xbdB\xf4\xefE\xf7\x1d\xfc\x8c]V\xfe\xec\xfd\x05Q\xd3IY\xecf*h\xcd\x91\xba\xf5\xc2zt\x08\xa4\x91pIF\x1a\xc8\xb0'k@\xa6\xa2i\xe9E\xd0\xb4\xce\xd4\x94~>!S\xcd\x0bD\x89\x0f\x14\xc8\x16\xf2^22\xec\xc9\x1a\x94\xa9h\x1az\x91\x06N\x1dT\x8f.>;\xf0\xa9\xf9Xb\xa0@\xb6\x00\xc9\xc8,y\xec\xed\x09\xc2\x09$#\xb3\xe4\xb1\xb7'\x08'\x90\x8c\x0c\x93\xbf\xde\x9e\x20\x9c@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00H\x04\xd8\xc9\x1a@2\x00\xf0\x05v\xb26\x90\x8c4\xb8\x99f\xbb\xd5h\xf0=\xceq`'\xcb\x91k\x92\x91\x7f\x9e\xac\xed\xa3\xc9\xdc>\xfa\x0a!\xa3\xed\xdf\xd3\x8cO\xaa\xfe\xad\xbe$\xd1\x8b\x14H\xb25\xd8\xc9&I\xaeHF\xfez\xb2\xf6\xec\"%\xed\xb4\xfb\x15\xb2+\xc6BHL\xca\xfe\xad6\x1e\x99\x09{\x916\x92\x183\x06\xecd\x93$W$#\x8f=Y\xbbIC\xa3z\x0cE\x12\xf4F\x0d\xc0\xbf\xd5\xc2+\xb3\x04?\xbc\x03\"\x891\x83\x9dl\xf2\xe4\x8ad\xe4\xb1'k7\xd9\xf7\xbad\xee\x00\x00\x20\x00IDATU\xda\x93\xb8d\x04\xe9\xdf\x9a\xbd?\xd5\xeb\x9b\x19\xecd\x93%\\\x92\x01OVAk\xdd\xe4\xf8\xad\xaf\xe8\x92aY\xa3z\x0c\x14\xb5{\xcc\xb9\xaf&R\xccF\x94\x19\x9f\x8e\xd0\xe0\x95\xef\xa6\x10\xd8\xc9\x86\x86pI\x06z\xb2\x8a\xf15b\xf5cGi\x1c\x13\x803/\x92\xe7\xda_\xa8\x19\xbd\xc7;\x84\x9aC\xfdii\x0b\xfb\xfd\xbf\xafZ&|\xeaz\xdenb\x8f\xe8'\xb7\xec\x1e\xff\xad\xbd}\xbd\xf9\xab\xc7R\xc0\xca5m\xe4\x8ad\xe4\xa7'\xab\x80D\x8cX}\x88{\x8cr\x88\xf9\x8f\xf4\xcd\xad\x8e\x17C\x8d\xa1\xbeI\xff)\xbe\xcd\xb3c\x9e\xb6\x9a\xb0_7\x1bg\x8f\xf7%%\x19\xb0rM\x1b\xb9\"\x19\xf9\xe9\xc9*\x20\x11#\xd6T\xd0$\xc3\xc3\xbb\x80C\x1b\xea{\x9f\xd1\xb6\x7fz\xafw\x1c\xff\x13\xcb&\xce\x1e')\x19\xb0rM\x17\xe1\x92\x0cx\xb2\x1a\x1dZH\xa2\x1b\x8dnr\x9b|\x87\x84F\xac\x9e\xc5,N\x97\x10R\xb8U\xdf\xe6\x86\xcfF\x97\x8c\x86J-\xc0J\xf2\xcc}\x95\xd1\xaa\xfa\x83Z\x84=\xd4\xcb\xf4C\x88\x07\x969F\xc7n\xc2\xf1\xba\x89{\xccI\x06\x97\xce\x1buU\xd1\xf2\xfa\xa9}T<\x92Z8\xac\\\xd3D\xb8$\x03\x9e\xacF\x87>\xdaZD*\x9a\x7f6\xf1^\xc7&\xf53b\xf5,fs\xa0\xbd\xbd\xb8\xd9\xd5\x1a\xcf!\xb2\xb3\xe7\xc8R\xb2\x8am\xdb6\xaa;H\xd3\x9em\xf5\x85\xfb\xa8c\xa87\xd7\xd0w\xaa\xde\xa6\xb7nt\x8e\x8e\xd5\x84\xe3u\x13\xf7\x98\x93\x0c;\x9d\xfd\xa3\x1b^\xd9\xb5\xb1\x9c\x9c\xa3R/\x00\x08\x84\x90I\x06\xc9\x17\x00\x04A\xe8$\x03\x9e\xac\xacCj7\x1f\xa2\xe6\xe2\x0c\xb7\xe9c\xc4\xeaY\xcc\x811\x9f\xf9b6\x87\xc8\xcf\xde\xd9QS\xc2Z\xe1{\xf1\xc5\xfa\xba\x1b&\x92\xd9\xd41\xd4\x7f%=w4\xcc\xed\xd6Sr\x8cN\xacd\x88{Lm\xc9\xe0\xd2\xf9\xb4r\xda\xa2\x8d\x1f\xf4\xf5R\xf9\x17\x00\xa4L\xe8$\x03\x9e\xac\xacC|7\xf9M\x1f#V\xcfb\x0e\x8c\xf9\xcc\x17\xb3\xd1\xd62N\x17n\xa0\x8e$\xf7UT-mm\xafU%\x83\x1f\xea\xbe\xe8\x87\xa5\x07J?\x8cj\xeb\x0f\x8e\xd1\x89\x95\x0cq\x8f\xa9-\x19|:\xa77\xdc7\x83\\\xd3\xd2'\xf7\x02\x80@\x08\xb1d\xe4\xb3'\xab\xe7\xdc\x8fo\xc4*%\x19|1\x1b}\xf9s\xe2\x0a\xeaHrF\x0d\x13\xa8\x05\xaad8\x86\xba\xba\xa5\x92V\xae\xd1/\xc8:F\xc7)\x19\xecu\x13\xf7\x98\xda\x92\xc1\xa5s`\x99\xbayzk\xc9z\xb9\x17\x00\x04B\x88%#\xaf=Y=\xe7~|#V\x19\xc9\xe0\x8bQz\xfc\xb9c\xda_]2*\x96\x1c\\\xc5'Y\xc5&k\xdf\xcd\xaad8\x86\xba\xae\xe6^z\xef\xdc:\xad\xa0\xe3r\xaa%\x19\xd6\xeb&\xee1\xb5%\x83K\xa7Y__\xa9m\x92{\x01@\x20\x84L2\xe0\xc9\xaaw\x88\xeb\xa6\xa3\xc7>F\xac\xde\xc5Lz\xdfno/nl\x7f\xe3\x0c_\x8c1\xdf0J<\xa8M\xd7\xda\xfa\xc6\x9b\xf8$\x9b\xc9}\xebW\xddJ\xca[\xdeq\x0c\xf5\x92\xd1-\xb4e\xb4z\xdc\xc4w\x93o\xc2z\xdd\x95\xe3E\xba}\x825\x92\\\x00\xb7\xb9\x90\x14\xadk\xaa\x9c\\\x7f\x94:\x10\x9b\xb6\xda6\xaa\x8eb\"\xb7X\xb1\xe5j\x92\x06\xaf\xee\x97%\x06G\x00\x97o\xf7\xd2\x19\xa5w\xbc}m\x9b#\xd8~\x97dp$\xad\xcc\x16\x92\xc2\x97\xad\x15:\xd1P\xbb\xd3\x09\xc6\xa66\\\x92\x91\x87\x9e\xac\x9a\x09jOO\x9b\x9fd\xf4\xdd\xa2\x1d\xb1\x9b\x1d:\xf5\xfd\x1a\xb5\x9a\xee7\xe76\xf0?\xea\xe70b\x15\x0f\x9fJ\x93q\x00k\x8d$\x17\xc0m\xb2\xca\xa6\xaej\x9e:\xce\xf9\xb1+6m\xb5mT\x1d\xc5Dn\xb1b\xcb\xd5$\x0d^\xdd/K\x0c\x8e\x00\xbb\xb5\xd37\x94\xafi[h\xfc\xa6\xb1\x85\xfd.\xc9\xdcH\xda\x99ik$\xe6\x0a\x9dh\xa8\xdd\xe9\x04cS\x1b2\xc9\xc8?OV\xc3\x04\x95\xc4\x93\x8c\x15==\x07\xef%\xbb\xd8\xb6\xd5\xa1_\xebW\x87f\xba\xd6Bm#V\x8f\xe1cW\x96\x8c\xdf\x1c\xb7G\xd2\xe3p::M\xcd\xfat\x95\xdbN\x8d\xe16m\xe5lT\xb9bb\xb7X\xb1\xe5jr\x06\xaf\xeeX\x11V\x00W\xac\xb1\x8cy\xdb-qI\x06\xff.\xc9\xd4H\xf2\x99\xd9V4\x1eC\xed<\xf7\x09\xc6\xa66t\x92\x91o\x9e\xac\xcc\x04u\xdf\xbe}k\xe2I\x06{g\x95\xebK$V\x87\x0e\x16\xf6\xf6\xfc\xfa\xf4\xb9\xe8A\xea\xc06b\xf5\x18>\xf509jTa\x8f\xa4\xd7\x1b][i]O\xbe\xa2\x1cb\xd3V\xceF\x95+&v\x8b\x15[\xae&g\xf0\xea\x8e\x15a\x05\xd8\xc5\xfa\xc6iu~\xe4\x92\x0c\xfe]\x92\xa1\x91tdfK\x86\xc7P\xbb%C\xf4\x9e\x94%t\x92\xd1\x96o\x9e\xac\x09\xace4\xed\xdb\xf7\x89q\xd9\xc0\xeaPo\xd1\xc15d\xc5\x91\xc2^\xea\xc0\x1e\x1d\x8f\xe1\xa3'\xa3?\x8a\x89\xf5z\xa3k\xef\xdev\xa7\xc9\x90\xd8\xb4\x95\xb3Q\xe5\x8ay\xb8\xc5\x0a-W\x934xu\xc5\x8a\xb0\x02\xecb\x7f\xd3\x17\xa9\xbb]\x92\xc1\xbdK25\x92\x8e\xcc\xc49pC\xed\x94\x8c`ljC,\x19y\xe2\xc9\x9a\x80d\x98}\xa0|\x87fl\xad\x9d;\xa3\xd5}\xf3\x9a=:\x1e\xc3G\x97\x14\x1e\x8b\x89u\x04pC\xbd\x84=\xdeH\x1c\x07\xfdb\xd3V\xceF\x95+&v\x8b\xf5\xb0\\M\xce\xe0\xd5\x15+\xc2\x0a\xb0\x8b\xf5\xe9u\x1ev\x9f\x98\xd8\xef\x92L\x8d\xa4#3\xad\xdeg\xa2\xd4s\xa8\xf9\xd6D\xef\xc9d\x08\xb1d\xe4\x89'\xab\x9cd\xd8\x1d\xfa\xfe\xa2h\x1bY\xf8\x00ub\x8f\x8e\xc7\xf0}Vl\xd96\xf3ot;\x80\x1f\xeak\xd4\xb7`\xf7\x0d\xb5ZD|\xd3V\xceF\x95+&v\x8b\xf5\xb0\\M\xce\xe0\xd5\x19{\xbcYp\xf7\x94\x15\xc0\x15[P\xaeN\xbe\xbe\x86\x98\xb5\x0c\xeb]\x92\xb1\x91\xe43\x1b\xb7T\xdd\xaca\xf5z\x0c5\xdfZP6\xb5!\x93\x8c\xfc\xf3d\xe5\xee\xfeTw\xbf\xbf\x9e\xac3*67\xd9\xdd\x9f\xd6\xcd\xe2\\\x87\x9e\x1b7\xb1\xaf\xbad\x15\xe5q\x8c\x8eh\xf8(}|\xf4QA,\x17\xc0mF\xc9-\xdb6W\x97\xe9\x0b\xae~\xa6\xad\xb6\x8d*WL\xe4\x16+\xb6\\M\xd2\xe0\xd5\xf5\xb2\xd4\x93\xd2\xd3\xd4\x81#\xc0n\xed\xb3\x8a\xaa\xf5\xad\xf3\x8bc%\xc3\x20s#\xc9g6\xb7\xa2eU\x0d\xd1\xde\xd5\xe2\xa1\xe6[\x0b\xca\xa66\\\x92\x91\x87\x9e\xac\xf6wL6\xaa\xf2\xc0:V\xa2M\x0fk\xb3M\xfd;\x93k\xc6\xec\xd0\x81\xb2\x15\xb4\xa5t\x1f\xe5q\x1a\xb1\x0a\x86\x8f\xfe\xbd\xa4A\x18\xcby\xa7\xda\x9b\xd1\xc7\x1b'V6\x186\xd0\xf1M[y\x1bU\xae\x98\xc8-Vl\xb9\x9a\xa4\xc1\xabk|7\x97\x12\xe7\x88\xb8\x02\xec\xd6\xbeh\xac*\xa9=\xe0)\x19\x99\x1bI>\xb3\xa3\xb5%\x13\xea\x9ev\xe5\xe0\x18>\xae\xb5\xa0lj\xc3%\x19i\x20-\x16\xa6\x99\xb4\x04M\xadCO\x13\xee\x88\xc5\x0f\xc7\x19Q\xe2$Y,\x10Z\x89\xeb(#.\xee\xe5O\x19\xd2;\x92\xf2\x99\x05\xf6\x9e\xcc{\xc9H\x87\x85if-AS\xea\xd0\x8f\x9a\xfc\"8\xa4\xdf\xe8:I\x16\x0b\x80\xbe\x17\xcbd\xfa\x97\xc4\xc4\xb4I\xefHJg\x16\xdc{\x12\x92\x01\x92F\xfa\x8d\xae\x93d\xb1\x008Y\xbe\xc4u\xd19>\xd2\x133Y\xa4\x87\xa4\xdf2\x8b\x05\x92\x01\x92\xe4\xa4\xb6\xaa\xe7\x17\x15C\x92\xc52\xc1\xd16\xf2\xd8[\xfd\x90\xaa\xfc\x90\xf4Wf\"\x20\x19\x20I\xb4U\xbd\xe3T\x96$\x8be\x82\xb9j\xaaE\xae\xef\x8a\xa5\x03\xf9!\xe9\xaf\xccD@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x82\xb00u\x11\x9c\xffez\x08\xbe\xc7\xfdK\xb6\x8fon\x93k\x92\x91\x93\x9e\xac\xc19sj\xf8\x99\xb6z\x0cT,Iu\xc8\xc9\xa1\xba\xd2\x8a\x86=\x151\x12\x167\x87\xe0\xfcE\x81<\xb9\"\x199\xed\xc9\x1a\xa43g\x02\xa6\xad\xe2\x81\x8a%\xb9\x0e9h+\xad\xd9\xb8u6\x89\xfdi\x09\x9f\x1c\x82\xf2\x17\x05\xf2\xe4\x8ad\xe4\xb8'k\x80\xce\x9c\x89\x98\xb6\x0a\x06J@\x92\x1d\xe2\xf8j\xe2\xfc^J\xbb\xabE\xbfF\x13?\x87\x80\xfcE\x81<\xb9\"\x19\xee\xdfw\x17\"x\x17\x86\xc5\x9358g\xceDL[\x13\x93\x8c$;\xc4\xb1\xacD\xfb\xed\xba5\xf2\x92\x11\x90\xbf(\x90'\\\x92\x91\xbf\x9e\xac\x819sZ=\xa6\xf4\x93\x05\xe5\xd1\x8az\xe6\xae\"\x1e(\xae2.\xd6&\xb9\x0e\xf1\x03U\xad\x1b}|\xb1\xa6W:\x07\x81\xbf\xa8\xa8\x09\xa7\xe5\xaa\xd9\x84\xafS+\xf0&\\\x92\x91\xaf\x9e\xac\x01:sZ=\xa6{Joi\xd9\xd5L\xd8H\x8a\x07\xca\xae\x8c\x8f\xb5I\xaeC\\@o!\xb7\"!\x99\x83\xc0_T\xd4\x84\xe3e\xb1\x9a\xf0uj\x05\xde\x84L2\xf2\xd6\x9350gN\xab\xc7=Uu\xeal\xef\xdd\xf6\x95\xd7@q\x95q\xb1<\xc9u\xc8\x0e8\xce\x9d\xd3\xc8\xe6\x10;\xbe^\xaf\x85\xb5\xc9;\xc0\xfa;\xb5\x02\x0fB'\x19\xf9\xe8\xc9\x1a\xa43\xa7\xd5\xe36\xf2\x81\xb9O$%\x19\xe9\xe8q\xff\xd2o\xe3\x0b\x04@2\xc2Lr\x92\x01@\x0a@2BL&\x9d9A\xbe\x02\xc9\x081\x99t\xe6\x04\xf9\x0a$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$#\x0d\x0e\xa5Y\xe9\x19\x1a|7\x93$+G\x07$L\xaeIF6{\xb2R\xfa\x8f\xa6kJ\xea\x13\xf8RH\x06\x8cX\xe3\x11l:pT\x0d7\xb9\"\x19!\xf0dU\xa9\xad\xd8\xf0P\xc9i\xd13N2`\xc4\x1a\x8f\xa0\xd3\x81\xa3j\x98\xc9\x15\xc9\x08\x81'\xabzHN\xd6\xd1>\xf7\xaf\xdc\x0a\xc9\x84\x11\xab\x00sH\x82N\x07\x8e\xaa!&W$#\x04\x9e\xac\x94\x1e%;bw\x0a\xc9\x84\x11\xab\x00sH\x82N\x07\x8e\xaa!&\\\x92\x11fO\xd6\xde\xab\xf4$\x1fs\xc5r\xae\xa3i7b\xf5j\xd8\xaa\x97\x87\x1b\x92\x80\xd3\x11:\xaa\x82\x90\x10.\xc9\x08\xb5'\xeb\x07\xed[Is;\xfb\xe5sG,\xe7:\x9av#V\x8f\x86\xedzy\xb8!\x098\x1d\xa1\xa3*\x08\x09!\x93\x8cP{\xb2\xf2'&V,WC?\x18\xb1\x8a\x1b\xe6\xeb\xe5\xb1\x86$\xe0t\xc4\xa3\x03\xc2A\xe8$#\xcc\x9e\xac\xbcd\x98\xb1\\\x0d\xfd`\xc4*l\xd8Q\xaf\x0d7$\x01\xa7\xe3\xe5X\x0b\xc2@\xe8$#\xbc\x9e\xacN\xc90c\xb9\x1a\xfa\xc1\x88U\xd8\xb0\xa3^\x1bnH\x02NG<:\x20\x1c\x84X2\xc2\xe6\xc9\xea\x94\x0c3\x96\xab\xa1\x1f\x8cX\x85\x0d;\xea\xe5\xb0\x87$\xe0t\xc4\xa3\x03\xc2A\x88%#l\x9e\xacN\xc90c\xb9\x1a\xfa\xc1\x88U\xdc0_\xaf\x03sH\x82NG8:\x20\x1c\x84L2\xc2\xec\xc9\xaa_1y\xa7\xcfe\x09\xca\xf5\"\xedF\xac\x1e\x0d\xf3\xf5\x0a\x09:\x1d\x91\xa3*\x08\x09\xe1\x92\x8c0{\xb2\xf6\x96i\x01EG\xdc\xb1\\/\xd2m\xc4\xea\xd50W\xaf\x88\xa0\xd3\x11;\xaa\x82p\x10.\xc9H\x03iq(M\xabghR\x16i\x09t3\xa9z\x93)\x96\xd6\xd1\x01\xe9&\xef%#\x1d\x0e\xa5\xe9\xf5\x0c\x95\x9f\xa3\x0c\xffn&W\xaf|\xb1\xf4\x8e\x0eH7\x90\x8c\xd0!=G\x13$\xc9z\x93,\x06\xc2\x0a$#l\xa4\xcb\x885\xc9z\x93,\x06B\x0b$#l\xa4\xcb\x885\xc9z\x93,\x06B\x0b$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$\x03\x00\x20\x01$#\x0df\xa5\xd9\xee:\x1a|\x8f\x03%\xdb\x87/\xcf\xc95\xc9\x80'\xab?\xa9\xd8\xb3r\xa4-I\x98\xb6f5\xb9\"\x19\xf0dM\x98\x94\xecY9\xd2\x98$L[\xb3\x98\\\x91\x0cx\xb2&J\x92\xf6\xac\x1cA:\xb5z\x00\xd3\xd6\xec%W$\x03\x9e\xac\x89\x92\xa4=+G\x90N\xad\x1e\xc0\xb45{\x09\x97d\xe4\xbb'\xab\xe5q\xba\x90\x14\xadk\xaa\x9c\\\xaf}\xeb\xdc\xea\xe6B\x12\xddhu\xde\x8au\xd4\xe0k\xcf*n\xc2\xc6\xdf\xa95\x80$a\xda\x9a\xc5\x84K2\xf2\xdc\x93\xd5\xf68\xfdhk\x11\x99\xba\xaay\xea8\xa6nV7\xd9\xde\x8a\xe6\x9fMd\x9d\xb7c\x1dM\xf8\xd9\xb3z4a\xe3\xeb\xd4\x1aD\x920m\xcdbB&\x19\xf9\xed\xc9\xca{\x9cF\xa7\xa9\x85OW\xd58\xbaI\xa3e\xea\x87w\x03\xeb<\x17\xebH\xd2\xc7\x9eU\xdc\x84\x03\x1f\xa7\xd6\x20\x92\x84ik\x16\x13:\xc9\xc8cOV\x87\xc7\xa9\xbe\x88\xb9\x9e|\xc5uS\xdd\xfb\x105:\xcf\xc5:\x92\x8co\xcf\xea\xd1\x04\x87\x9fSk\x20I\xc2\xb45\x8b\x09\x9dd\xe4\xb1'\xab\xc3\xe3T_\xe5m'\x07\xb8n\xf2\x9d\xe7b\x1dI\xc6\xb7g\xf5h\x82\xc3\xcf\xa95\x90$a\xda\x9a\xc5\x84X2\xf2\xce\x93\xd5\xe1q\x1a]\xc2Jo$g\xb8n\xf2\x9d\xe7b\x1dI\xc6\xb7g\xf5h\x82\xc7\xc7\xa95\x90$a\xda\x9a\xc5\x84X2\xf2\xcf\x93\x95\xf78\x8d^\xa3\xce\xa9\xee\x1bj\x1d\xdd\xe4:\xcf\xc5:\x92\xf4\xb1g\x157\xe1$\xbeSk\x20I\xc2\xb45{\x09\x99d\xe4\xb7'+\xefq\x1a%\xb7l\xdb\\]\xc6\x92\xb4\xba\xc9w\x9e\x8f\xe5\x07\xca\xc7\x9e\xd5\xa3\x09!iL\x12\xa6\xad\xd9K\xb8$#\xcf=Yy\x8f\xd3\xe8\xe3\x8d\x13+\x1b>c\x9bV7\xf9\xce;\xfcP\xb9&|\xecY=\x9a\x10\x91\xc6$a\xda\x9a\xc5\x84K2\xd2@\x02f\xa5\xf2\xf4\x83\xebh\x9c\x9b\\}H\xb8\xc7\xc97a\x92d\x0d\xfd0|\x20i\xf2^2\x120+\x95\xa6?\\G\x93\x9c\x8d\x8cD{\x9cB\x13\x06\xc9\xd5\xd0\x1f\xc3\x07\x92\x06\x92\x11R\x92\x9b\x8dR\xa4\xdeD\xea5\x80\xac\x03\x92\x11JNjk\x88~Q)\x91z\x13\xa9\xd7\x00\xb2\x10HF(\xd1\xd6\x10\x8f\xd3t\x92z\x13\xa9\xd7\x00\xb2\x10H\x06\x00@\x02H\x06\x00@\x02H\x06\x00@\x02H\x06\x00@\x02H\x06\x00@\x02H\x06\x00@\x02H\x06\x00@\x02H\x06\x00@\x02H\x06\x00@\x02HF\x1a\x1cJ\xb3\xc7TT\xeb[\xf6\xa4\x03r\x80\\\x93\x8c\xec\xf6d\x8dK\x1a\xe6\xaa\xc97\x0cr\x9a\x10KF\xd8,\xfc\xc0'RD\xc6fn\xc6\x1a\x06Y\x0a$\xa3\xbf\xe8k,i\xda\xb6g[SIS\x12\x1f\xf9G\xdb\xc8co%Q.e2\xd60\xc8V\x20\x19\xfdF\xdf\x8e\xba\xcahe\xdd\x8ed&\xe0\\BH\xd1Q\xbf\xa84\x90\xb1\x86A\xb6\x02\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\xc8iOV\x0e\xd8\xb3\x82@\xc85\xc9\x80'\xab\x07\xb0g\x05\xc1\x90+\x92\x01O\xd6\xf8\xf4\xa7=+\xc8irE2\xe0\xc9\x1a\x97~\xb5g\x059M\xaeH\x06z\xb2\xf2\xce\xa7\xd1\xc7\x1b'V6|\xc66\xad\xbe\xf1=v\xb8\xa4rM\xa4j\xcf\x1aL\x0e\x20'\x08\x97d\xa4\x81\x90x\xb2\xea\xc4\xb9\xb3\xd5\x87\x20\xecYu\x92\xcf\x01\xe4\x04y/\x19!\xf1d\xd5Ia\xba\x06`\xcf\xaa\x93B\x0e\x20\x17\x80d\xf4\x17\xa9y\xb2\xead\xc3t\xcd\x86\x1c@\x06\x81d\xf4\x17)y\xb2j\x9c\xd4\x16\x19\xfd\xa2\xd2K6\xe4\x002\x0a$\xa3\xdfH\xc5\x93UC[d\xe4n\xe3\xcc\x04\xd9\x90\x03\xc8(\x90\x0c\x00\x80\x04\x90\x0c\x00\x80\x04\x90\x0c\x00\x80\x04\x90\x0c\x00\x80\x04\x90\x0c\x00\x80\x04\x90\x0c\x00\x80\x04\x90\x0c\x00\x80\x04\x90\x0c\x00\x80\x04\x90\x0c\x00\x80\x04\x90\x8c\xbc\xf2d\x0d1\xf1\x065\xec}\x0b\x15\xb9&\x19!\xf6d\xd5\xd0\x93L\x835jl7\x9dx\x8cN,)\x8f\x0e\xa5\x87\xeaJ+\x1a\xf6T\xc4L\xf3\xb89\xc4\x19T\xbf\xbe\x09\xd9U\xb1\xc3/$U\xfa\xa1\x89\xd4\xf0\x9d-\xadE\xc6\xcf\xb7\x16\xd9z\x9d+\x92\x11bOV\x07z\x92\x81X\xa3\xee\xe1\x7f}+\xb6\x9b.\xc4\xa3\x13K\x00\xa3\xd3VZ\xb3q\xeblB\x8e\xb8\x9f\xf0\xc9\xc1kP}\xfb&dGi\xac7C\xc0\xa4\xdc\xc4\x9ex?\xa0\x96\x02\x09\xcf\x96\x16\xd2\xde\xbe\x9e\xacko\x1f\xddb=\x93+\x92\x11bOV\x17Z\x92AX\xa3\xdaC\xe2\xe8\xa6'\x82\xd1\x11\x90\xfa\xe8|5q~/\xa5\xdd\xd5\xb1\x92\xe1\x97\x83xP\x13\xe9\x9b\x08\x89\x03\x13\xf3\xad!\x8bD\x13B\xf8\x97P\x06\xbf|\x13\x9e-\xeb\xa2\xec\x17\xe9\xdf\xa6\xb4\xc4V\xeb\\\x91\x8c\x10{\xb2\xba\xb0%#EkT\xfe\xd7\x8b\xb9nz\x92\x98d\xa4>:\xcbJ\xb4_\x01\\#/\x19\xe2AM\xa4o)b\xbe5\xfa\x1b\xfe%\x94\xc1/\xdf\x84gK\xef'\x86d|\xd2k\xed\x0f\x97d\x84\xd9\x93\xd5\x11`\x9b\x95\x9e\xb9\xaf2ZU\x7fP\x0b\xb1\x93\xf4\xb0F\xed^:\xa3\xf4\x8e\xb7\xafmc'\xa1/[\xa7\xfe\"\xefT\xc7\x90\xf0\x9e\xac\x9f,(\x8fV\xd4\xb3\xdf9\x17\x8f\x0eo\xa3j\xc7\xda\xa4>:\xd5?\xd2*\xfabM\xaft\x0e\x02\xa3[\xaeo\"3X\x8f\xccN\x97\x10Rh\x9a\xb8qC\"\xf2\x90\xe5\xde\x1a\xe9j\xc2\x82\x7f\x83s/!\xdb|Z\xaf\xd7i\x8a\x1b7\xdf\x80f\xcb>\xdd\x04\xc7\xca!\\\x92\x11fOVG\x80mV\xba\x834\xed\xd9V_\xb8\x8f:\x92\x14[\xa3\x9e\xbe\xa1|M\xdbBB6\xe8'\xa1\xe6\xa9\xbf\xc8;\xd51$\x9c'\xeb\x9e\xd2[Zv5\x136|\xe2\xd1\xe1lT\xb9X\x9b\x94G\xa7\xb7\x90[\x91\x90\xcc!\xd6N\x96\xeb\x9b\xd0\x0c\xd6+\xb3\x03\xed\xed\xc5\xc6\x07,\xd7\x84\xd0C\x96{k\xa4\xab\x09\x1b\xee\x0d\xce\xbd\x84=oV5\xb1z'\xbe\xd1\xed0\xc5\xf5\xc97\x98\xd9bH\x86\x95C\xc8$#\xcc\x9e\xac\\\x00W\xacg\x9b\xfa\xee\xea\xbb\x89\xfd`:\x97\xa4\xd8\x1a\xb5\xb1\x8c}N-Q%\x837\x0e\xf1\xf0N\xe5\x8fj\xadn\xf6T\xd5\xa9\xb3\xbdw\xdbW^\xa3\xc3gf\xc7\xf2\xa4::\xc7\xb9s\x1a\xd9\x1cD\x83j\xf5\xcd\xcb\x0cV\x94\x19\xa3D\x9f\xcf\\\x13^\x1e\xb2\xd6[#}MXpop\xfe%lf\xc7\x04\x0d\xday\x99m\x8a\xeb\x9bo\x20\xb3e\x9fi\xb5g\xe4\x10:\xc9\x08\xaf'+\x17\xc0\x17\xfbb}\xdd\x0d\x13\xc9l\xeaHRh\x8d\xda7N{\x07~\xe4\x92\x0c\x0f\xefT^2\xacn\xb6\x11\xeb\x87G\xc5\xa3\xc3U\xc6\xc5\xbaHitz\x8b\xec\xc3\x16\xd9\x1cD\x83j\xf5\xcd\xcb\x0cV\x94\x19\xc3\x98\xcf\\\x13b\x0fY\xee\xad\x91\xae&8\xb878\xff\x12\xfem\xf4a\xda;q\x17\xdb\xb4Mq}\xf3\x0dd\xb6X\x92a\xe4\x10:\xc9\x08\xaf'+\x17\xc0\x15\xdbWQ\xb5\xb4\xb5\xbdv6u$)\xb4F\xfd\x9b\xfe\xf9\xdc\xed\x92\x0c\x0f\xefT^2\xacnr\x0b\xaa\xe2\xd1\xe1*\x13/\xbe\xa6>:\xc6ZFo\x9b|\x0e\xa2A\xb5\xfdf=\xcc`E\x991\x8c\xf9\xcc5!\xf6\x90\xe5\xde\x1a\xe9j\x82\x83{\x83;^\xc2\xba\xc7i[\x99\xee\xa3\xadU\xcaLq}\xf3\x0dd\xb6X\x92a\xe4\x10b\xc9\x08\x9b'+\x17\xc0\x15\x9bQ\xc3\xdeN\x0bT\xc9\xe0\x93\x14Z\xa3\xf6\xe9\xef\xc0\xc3\xb6dh\x1f\x04\x1e\xde\xa9\xdc\x90\xd8\xdd\xdce[\xa5\x89G\x87\xabl\x97\xd0V-\xf5\xd1YV\xa2\x99@l#\xa7\xa4s\x10\x0d\xaa\xd57/3XQf\x0cc>sMxx\xc8\xdao\x8d\xb45a\x13+\x19\xfaK\xb8\xa3\xbc\xf7\xa1\x1fj\x11\xb6)\xaeo\xbe\x81\xcc\x16[2\xf4\x1cB,\x19a\xf3d\xe5\x02\xb8bU\xec\xdd\xd6w\xb3*\x19|\x92bk\xd4\x05\xe5\xea\x0b\xde\xd7\xa0I\xc6\xb8\x85CSm\x00\x00\x11\xbeIDAT\xa5\xeafM\xd4Y\x19\xef\x9d\xca\x0d\x89\xdd\xcd\xee\x8aZ\xf6I\xb5h\x89\xd7\xe8p\x95q\xb1\x1c\xa9\x8f\xceW\x13\xefe\xd7Jj\xa7I\xe7\x20\xb6\x935\xfb\xe6e\x06+\xca\x8ca\xccg\xae\x09O\x0fY\xf3\xad\x11t\x13\xc7\x9bcT\xd9!\x19\xdcK\xd8[\xbec\xb2v^\xc2\x99\xe2\xfa\xe6\x1b\xc8l\xb1%C\xcf!d\x92\x11bOVG\x00owz\xdf\xfaU\xb7\x92\xf2\x96w\xf8$\xc5\xd6\xa8\x9fUT\xado\x9d_\xacI\xc6\xdc\x8a\x96U5D\xeb\x90\xd8;\xd5\xf6z\xa5\\7\xf7\x14\xcf\xdc\xd0\xb6\x88l\xa6^\xa3\xc3\x0d*\x17k\x13\xc0\xe8\xb4\x8d\x9b\xfbbk]\xd1\x9b\xd29\x88\xedd\xcd\xbe\x09\xcd`=2\xeb}\xbb\xbd\xbd\xb8\xb1\xfd\x8d3\xce&\xfc\x0cYC\xf0\xc5\xc6\x86\x80C\x20\xe8\xe0\x93M\x0e\x02\x81\x18\x88\xcd\x06\x07\x13\xb3X\x84\xb0\x868\xc6\x91\x8dM\x1c!\xa2\xa1v\xfac\xba\xde\xeayk\xaa\xab\xa7{F\xd5\xf3{\x20\xc90\xe9\xa9z\xab\xde\xd6o4\x1f\xea'\x1a1\xac\xc1\xaf\xc8(\x81\xa19Y\x0b#z\xfb\xd3\x91R\x969\\\x8c\x9b\xea\xf1\xdan\x89\xcc\x82\xde\x9dZ\xfc\x17G#\xd4\xd5\x855\x8c}d\x0c\xcd\xc9Z\x18\xb9\"\xa3\x8ce\x0e\x97>\x9b\xea\xeb\xda\xda_M\xaf\xd8\x8eIX\x9b\x89\x03s\x84\x91\x11\xd6\x80\xc8\xf0\x8e|\x91\x01\xf6\x1fOg\xcf\xef\xd9\x8e\x89hn\xb6\x1b\x17\xe3\xdb\xa3\x8a\x8cn\x0d\x88\x0c\xdfx\xb4.>\xb9[\xe2/1`\xff\xb1+\xde=W\x8f^\xc2\x8cL\x8a\x9b\xd4\x80\xc8\xf0\x8d\xd3B\x88\x83\x8flG\x81J\xd1\x9cj\xfc\x1c\xdd\x1a\x9d\x14\xb7[\x03\"\x03\x00\xe0\x00\"\x03\x00\xe0\x00\"\x03\x00\xe0\x00\"\x03\x00\xe0\x00\"\x03\x00\xe0\x00\"\x03\x00\xe0\x00\"\x03\x00\xe0\x00\"\x03\x00\xe0\x00\"\x03\x00\xe0\x00\"\xa3\x04\xa1\xe7\xbet\xb2\x0eN\xf1\x1b5\\`u-\x84\xaaE\x86\xd52\xd9C\xe5\x9d\xac\xc1`\x91\\C\xbfX\x8e\x8e\xdd\xc9j3\x9f\xdaG\x88\x19x\x7fau\x1d%U\x89\x8c\xcc\x96\xc94\xd5w\xb2\x06\x83=\x93\xcf.\x89\xaf\xfe\xe8s\xb4\xd5\xc9j5\x9fZG\x88)`\x7fau\xcdJ\x09V\xd7\xaaDFf\xcbd\x8aqp\xb2F\x17\x12\xdd\x14\xe9\x8b\x18\xa6`v\x87\x90\xc5|\xda\x7f\x84.\x83\xef/\xac\xae\x99)\xc1\xeaZ\x95\xc8\xc8l\x99L1\x0eN\xd6B\"#\x8b\xf94[d\x0c\xbe\xbf\xb0\xbaf\xa6\x04\xab\xab_\x91Q\x90eR1\x16NV\x1a\x19\xb6\x89M\x0b\x82\xd5u\x00\xe5j\xb5\xac\xae~EFA\x96I\xc5X8Y\x83\xc1vw\xd7\xc3\xc8\xb0MlZ\x10\xac\xae\x03(W\xabeu\xf5,2\x8a\xb1L*\xc6\xc2\xc9\xba\x15?\xd9le\x98\xd8\xb4\x20X]\x07R\xaeV\xc9\xea\xea]d\x14a\x99T\x8c\x85\x93\xb53\xd8\xbd{\xf7.\x07\x91a\x9d\xd8\xb4\x20X]C\xf2)W\xabeu\xf5.2\x8a\xb0L*\xc6\xc2\xc9J\xde\xcb\xb0NlZ\x10\xac\xae!\xf9\x94\xab\xd5\xb2\xbaz\x1c\x19\xf9-\x93\x8a\xb1p\xb2\x92\xc8\xb0NlZ\x10\xac\xae\x11\xf9\x94\xab\x95\xb2\xbaz\x1c\x19\xf9-\x93\x84qp\xb2\x92\xc8\xb0Nl\\\x10\xac\xae!N\xcaUB\x85\xac\xae\x9eEF!\x96I\xca\x188Y\xb5o\x7f\xda&6.\x08V\xd7\x10'\xe5*C\xd1S\x8c\xc0\xea\xeaWd\x14b\x99\xd4\xa9\xbe\x93U\xfd\x8d\xc9u\xeb\xc4\xd2\xb8bX]#\\\x94\xab\x0cEO1\x02\xab\xab_\x91Q\x02\xa5\x08=\xf7\x9f\x93upJ\xd9\xa8\xe1\x02\xabktc0\xdf\xda\xd8GF\x19B\xcf\xfd\xe8d\x1d\x9c\x126j\xb8\xc0\xea\x1a\x07&\"c\xcc\x18Ud\x80\xfd\xc7(\xac\xae\x88\x0c\xdf\x80\x93\x15\xb8S\xa0\xd5\x15\x91\xe1\x1bp\xb2\x82\x1c\x14guEd\x00\x00\x1c@d\x00\x00\x1c@d\x00\x00\x1c@d\x00\x00\x1c@d\x00\x00\x1c@d\x00\x00\x1c@d\x00\x00\x1c@d\x80!\xd2nG\xff\x00\x7fAd\x80a\xb1\xbd\\\x17\xefK\xf9\x91\x98]N_\x83\x00\xf8\x03\"\xa3\x04\x1d\xe7(\x9c\xac\xc5\xaf\xa2h\xda'O^\xdfx\xdcI\x8e\xd6\x8d\x933\xa6k\xea\x03\x96Q\x9cQ&\xaa\x16\x19\x9e;Ys;8sIE\x099'~\xb9rtr!\xe3\xc4\xd1e\x83B6\xc5\x83>\x07\x96H\xcee\xf6\xa55!N\xb7\xe5M!&6l\x87R\xfa\x9c\xa91\xcbB\x88\xc3\xd1\x9f\x06\xe4?\xa3\x8a\xa7*\x91Q\x11'+\xeb\xe0\xcc\xe0\xd5\xcc'\x15%\xe4\x9c\xb8Q\xbfvv2\xe3\x05\x1b~\x10\xdfuo\xdeK.\xd0[\x16\x86\xd2\x07v\x9c2\xecn\x88\xc9\x96\xdc\xb9)6\x9c~u\xeas\xa6\xc6tS|\xdf\x9d\xf0\x81\xd8\x94FH\x0dj\\C\xe75\xb8=\xa3+f\x97I\x1b\xc0\xa2\xe9o9\xa3j'2\x1e\xff\xedf\x14\x19N\xf5\xd6>\xfeG\xa2FUg*\xb9\xa9g+\xa3\x93\xe5\xda\xa2\x9fg\xdd\xc1\x0c\x9d\xcf\x83_\x91QA'\xeb\xde\xa9\xfa\xd5\xe6\xa1\xc9/\xe7/S\x07'/W\xb5\x09S\xb5{\x13\x8b'\xa97]d\x97d\xe2\xc0\xd7Yo~q\xa4\xb3}\xf6\x89\xff\xdb\xfaF4[\xc1\xa5\xdc%\x11\xbc\xf2\xfa\xd0?\x9fo\xceM'\xa7\xfc\xde\xcc\xdc\x9d\xdfL\xaf\x11H\x0dd\\\xbe\xf3\x14v\xcf\xb4\x15s\xcb\xd4\x1a\xc0A\xf5\xb7\xacQ5\x88\x8c+\x0bQd\xb8\xd4\x1b^\xe8\xfb\x9b\xbf\x86jTu\xa6\xd2\x9bzd0:Y\xae-\xda\x8a\x93\xc1L\x9d\xcf\x81g\x91Q='\xebZ\xf0\xe1\xc1U\xd1\xfd\xa2B\xec\xad\xe0\xe5\xaaVa*\xb9\x97\xbaH\xa9\xe6S+\x92\x10O,k\xd3\x9d\xa7\xde\xa5zt\xacm\xe2\xe4\x85\x09\x11\xbc\xf2\xfa\xd03\x9d'}\xf2\"f]\x90k\x97\xf7\xa0j\x20\xe3\x9a:\x9f\xc0\xefYj\xc5\xbd\xcbL5\x80A\x99qx\xa3j'2\x9e\x1fz\x1eF\x86K\xbd\xb2v\xb2sR\xee\x9e\x98\xd3\xceTrS\xea\x91\xd1{F\x99\xda\x92\xdc\xd4\x063u\xde\x15\xef\"\xa3jN\xd6\xd5i\x19\\.\xbe\xfb\xc6I|J\xf3rU\xab0\x95\xdcK]\xa4T\xf3\xa9\x15IH~\x96\xce\xca\xe4M\x1f\xeb\xc4\xea\xbd\x8cD\xf0j\xd0\x87\xfe\xba~\xed\xe4k\xc9\x8b\xfd\x9d\xfa\x9bW6\xcc\x17\x86\"5\xa8qM\x9dO\xe0\xf7,\xb5\xe2\xdee\xa6\x1a\xc0\xa0\"\x837\xaav\"C.\\\x89\xde\xcbp\xa8W\xd6>\x0b\xfe}M\xfcN\xceTzS\xa6##}F\x99\xda\x92\xdc\xd4\x063u\xde\x15\xef\"\xa3\xd7\x11\x199-}u\xb2^\x9ex\x11\xfc\x98=\x8c\xffO\xf7\x94f\xe5\xaaVa*\xb9\x97\xbaH\xa9\xe6S+\x92\x90\xfc,%\xdb\x97a\xe2$2\x94\xe0\xd5\xac\x0fm)\xe3\xc6=\xd1\xf7+\x0c\xaa\x062\xae\xa9\xf3\x0av\xcfR+\xee]f\xaa\x01\x0cdKX\xa3j\x10\x197\xdf\x09#\xc3\xa9^\xa5FUg*\xbd)\xf5\xc8\xe8=\xa3LmInj\x83\x99:\xef\x8a\xc7\x91Q\x0d'\xeb\xaf\x07\xe6\x7f}p\xe2t\xf7en|J\xf3rU\xab0\x95\xdc\xab\xb9H\x89\xe6S+\x92`\x8c\x8c~\x13'\x91\xa1\x04\xaff}h\xf6OLT\x0dd\\S\xe7\x13\xf8=K\xad\xb8w\x99\xa9\x060(\xfd-oT\x0d\"cwj#\x88\x0c\x97zc5\xea\x97\xe2\x0fr\xa6\xd2\x9bR\xdf\xa8\xde3\xca\xd4\x96\xe4\xa66\x98\xa9\xf3\xaex\x1c\x19\xd5p\xb2\xde\x17G\x85h<\xed\x1e\x12\x9f\xd2\xbc\\\xd5*L%\xf7j.R\xa2\xf94}\xfa\xc8E\x86u\xe2$2\x88\xe0\xd5\xa8\x0f\xe5#\x83\x91\x8a\x92\x1a\xc8\xb8\xa6\xce'\xf0{\x96Zq\xef2\xf5\x06p\xe5(\xfd-oT\x0d\"C\x9e]\x0a\"\xc3\xa5^Y{#x\xd3\xe7TC;S\xc9M\xa9m\x14sF\x99\xda\x92\xdc\xd4\x06+\xeasg\xcf\"\xa3zN\xd6\xfb\x876\xbem=\x0d\x07#\x0eNV\xaej\x15\xa6j\xf7R\x17i\xb7\xde\xd4\xc3\xba\xa8\x89\xb5\xed\xb3M\x1c}b\x12^\xdf\x9e\x08^\x8d\xfa\xd0\xfb\xea\x17\xeb\xef\xd5\xe7\xad\xbdRQZ\x83\x1a\xd7\xd8\xf9\x04v\xcfh\xbd\xfc2I\x03\xd8r\xa8\xfe\x965\xaa\xeen\x88\x9b;\xb25\x19D\x86K\xbd\xb2&\xe6\xefn\xcc\x85jTu\xa6\x92\x9b\xbf\x05\xdf\xfe\xbc\xd2jEoAp:Y\xae-Z\x8f\x93\xc1\x0c\x9d\xcf\x83_\x91QA'\xeb\x9dZpo\xed\xbd\x87\x9a\x83\x93\x95\xab\x1ag\xeb\xaeB\xbf\x97\xfaP\xe3z\xd3\x0f\x8bQ\x13k\xdbg\x99xo:\xbcy0\xf8\x14\x96\x0a^M\xfa\xd0\xe7\x07?|\xb0\xddi\xc6\xde\xf6\x8f\x1f\xd4\xb6\xbbs\xf7HE\xb5\x1a\x92qO\x1b;\x9f\xc0\xee\x19]1\xbfL\xd2\x00\xc9\x95C\xf5\xb7\xacQus\"\xf8\x86N{\xae\xde\x96N\xf5\xcaS\xcd\x0f\xff\x12\xabQ\xc9\x99\xaan\x9e\x8d\xca\x15\x1f\x05w\xf3:Y\xa6-Z\x8f\x93\xc1\x0c\x9d\xcf\x83_\x91Q\x02\xa5\xe88\xb3;Y\x9fM\xad<\xfb\xf3\xcfW?\xbc\xffZ\xc6\xbf\xd4\xe0)e\x15Es\xebT\xf8\xf3sF\x88\xe3\xe4\xf3\x09\x07\xa9h\x19\xa4\x1b0\xe2rLd?\xa3Jg\xec#\xa3\x0c\x1d\xa7\x83\x93\xf5V\xf45\x02\xd9\x9e]\xef\x7f\xa0\x85\x12VQ\x02\xcf\x1et\x9eS\xb7\xef\xff\xa6\xeeq\x92\x8a\x96\x81\xde\x80\x91\x97c\xc0\xe1\x8c*\x1dD\xc6h\xb9\x7f\x20\xfa\x85\xf8\xe1\x01\xf55\x8aq\"\xbbT\xb4$\xf4\x06\x8c\xbc\x1c\x0f@d\x8c\x96\xf6\xf2\xe4\xca\xda\xe6\xda\xca\xe4\xca\xbey\x16\x19/\xd0\x00W\x10\x19#\xa6}{\xfe\xf5\xda\xeb\xf3\xb7q\xc2\x8e\x084\xc0\x11D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x02u\xe9\"2\x00\x00\xfdH\xb9t\x11\x19%\xd8L\xf7\x93A\x93\xa3\xf8\x15\x83\xea\x92v\xe9V-2\x94\xac\xd8\xa5\x1c\x17\x9b)\xd9I\xdd\x92\xfaY\xb4g\xda\x08\xc4\xdf\xaaX]\xbc\xfa\xbe\\\xb8\xd6\x89\x0c\xe2C\xd5z\x9c\xd4\xbb\xd5\xd9\xf5\x85\xf61!\xa6\x0dW\xc61\x99pw>=9\xf5\xde\x7f\xdeX\xd7\x0e&\xa5\x1b\x1a\x90\xc5\x99p\x97\xa7\x83'\xd3\xf3\xa9\xc8\x20\xa5\xf3\x0d\xa0\x0fS\x95\x19:d\x7f}\xc0UF\x1a+\xc9\x8b\x02\xb2}:\xc3w\xe9z\x17\x19\xfe:Yy\xa1\xa7\xb2\x83\xd2\"\xb7\xc4\x17\xdf\xdf\x9e\x9b|\xac\x1fK\xad\xa3\xd1\x9b\x98Wu\xa1'Q\x8d\x1afS+v)'\x20\xab\xcd\x94\xec$\xad\xf7\xc9\xc4Or\xef\xc8\x86>\x02\x15\xc7*:\x91qI\\\xea\x13\x19\xda\x82v\xdf9\xda\xff\xe3B\xc6\x84\xdb>\x1c=7\xa7\"\x83\x94\xce6@{\x98\xaa\xcc\xd0\xa1\x0c\x91\xc18zIc%\x89\x0c\xb2}:\xc3w\xe9z\x17\x19\xeb\xbc\xe9\xd2\x07'++\xf4T\xf5\xd2\"\xc3\x97\xd2\xaf\x0e\\\x93\xfa\xb1\xc4:\xca\x0a=\xad\xfaP\xeaou('\x20\xab\xcd\x94\xec\xa4fI\x9d\xbf\x20\xd7\xa3w\x1c\xd4\x08\xfc\xdb\x8b\x9d\xe6\xbe\xf8\xf4Y\x9f\xc8\xd0\x1d\xa77\x19\xfb-\x851\xe1>\x89rn'\x15\x19\xa4t\xb6\x01\xda\xc3Te\x86\x0ee\x88\x0c\xc6\xd1K\x1a+\xe9[\x8fj\xfbt\x86\xef\xd2\xf582|s\xb2\xf2BOU/-2z\xf7\xed\xc8E\xa9\x1dK\xad\xa3\x91\xd0\xf3\xba.\xf4\xa4\xde@~6\xb5b\x97r\x022\xdbL\xd5Nj\x96\xd4\xdb\xb3{g\xff\x9e\x1aa\x831\x80E\xcd\xed\xa0\"\xe3_\xb5\xf0\x0e^\x11\xfb\xb4\xfe\xcf\xe3/\x99Q\x12\x18\x13n;Z\xccO\xe9\x17&\xaat\xb6\x01\xda\xc3Te\x86\x0eQ/,\x0f\xe7\xe8%\x8d\x9542\xd4\xf6\xe9\x0c\xdf\xa5\xebqd\xf8\xe6d\xe5\x85\x9e\xa4^Rdt\xc6\xd6\xcf?\xf8\x9c\x1eK\xad\xa3\xb5\xa3\x9dH\xday\xab\xa1\x8b7\xd5`\x86\xd9\xd4\x8a]\xca\x09\xb0\xd9L\x09\xdd\x9d\xd4,\xa9{\xb3\xb7_\xdbH\x8d\xa0\x89c\xe5\xe3\x7f\xff\x12\xfe\x97F\x86\xf2\xa1\x1a\x14\xb1{s\x17\xe5J#n\"gTeM\xb8\x1f\xccv~\x1c\xdaK=\xefe$\xa5\xf3\x0d\xa0\x0fS\x95\x19:D\xbd\xb0\xd9+#\x8d\x95\xf4\xc7Um\x9f\xce\xf0]\xba\x9eE\x86\xc7NV^\xe8I\xeb%EF_\xd2m,,\xbfM\x97IG\xa8\x89w\xd7\xbe<\xa1\x0b=u\x9b)3[@w\xc5.\xe5d\xb1\x992h\x96T\xb9\xfa\xd6t\xf0\xde\xa0\xd6!*\x8e\x95g\"\xff\xdf\xcb\xa5F\xf0f\xfevc\xe9%\xf5\xa1\xaa\x1eS\x1f\xea\x9ds\xf5'\xf2\x97#\xe7\xef\x84\xbf\xb3\xf7\x1aU\x0d&\xdc\xed\xfa\xb1\xab\xb7\xce\x1c\xea\x8d\x8c.|\x03\xe8\xc3He|\x87H\xbd\x0e\x95\x91\xc6\xeaN\xd6x\xfb(\xa3q\xe9\xfa\x15\x19>;Yy\xa1\xa7VoRd\xf0\xd5\x8fK\x9d1O\xcc\xde&\xc7j#\xd4.,\x1fI\x0b=\xe9`\xecl!\xf1\x8a\x1d\xca\xc9d3e\xd0\xa6\x90\xff\x13\xe1s\xaf\xae}\xa5\xe2\xd8\x1b\xf5k\xc1\x7f\x9aB\x04\x1fF\xad\x04\xdf~!>TV\x11\x1b\xbc\x83\x7f^~,D\xf4\xd5\xee^\xa3\xaa\xc1\x84+_,\x1f\x9bl\xdc7F\x86\xa1\x01\xf4a\xb42\xb6C\xb4^\x87\xcaTc5'kw\xfb(\xa3q\xe9\xfa\x15\x19%P\x8a\xcdt\x08\x06\xcd\xe4M\x18g\x8aZ\xb1\xabNv\xa76\xd0_ld\xc2\xcd\xa8\x9a~\xfb3#\xb9\x1e\x96\xb92Sc\x87\xb1}<)\x97\xee\xd8GF\x196\xd3a\x184\xf3GFQ+v\xd5\xc9\xae\xcd\x94\x1d\xa3\xaeF\xd5\\?\xfb\xb9\x1e\xe6P\x99\xa9\xb1\xe5o\x9f\x19\xcd\xa5\x8b\xc8\xf0\x94\x01\"\xa3\x20\x9ct\xb2\xcd\xcdv\xe3\xa2\xed\xa0Aq5\xaa\xe6\xf8\xd9\x0f\xc8\xf10\x87\xca\xd8\xc6\x0ee\xfb2\x82\xc8\xf0\x92\xa7\xe1\xdb]\xb6\xa3\xca\xc5\xc5f\xba+\xde=W\xcf\xf8\x9b\xf9\xd0x\xb4.>\xb9k\xaf=M\xce\x87e\x83o\xec\xbe\xda>D\x86\x97\x84ow=\x96\xa3\xc5\xc5f\xda\x9cj\x18\xff\xdabT\x9c\x0e\xde\x04\xb4\\\xc2\x86!\xe7\xc3\xb2ah\xec~\xda>D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x81\xff\x03&\xf2B\xcdI\x1b+\x96\x00\x00\x00\x00IEND\xaeB`\x82", - - "analysis/typeinfo-src.png": "\x89PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\x00\x02\xc1\x00\x00\x01\xb3\x08\x03\x00\x00\x00\xf9m:\x11\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x02\xfdPLTE\x00\x01\x00\x0a\x03\x01\x05\x07\x03\x02\x0d\x14\x0a\x0c\x08\x10\x12\x0e\x0f\x13\x1e\x1b\x1a\x14\x20\x1f\x19\x1c\x20\"\x17!;!#\x20#$\"$%#&'%'(&+)\x1e()'\x18-T*,)/,!-/,12053'35386*6758:7<:.<>;>@=CA5&CxAB@EFDIJH\x00g\x00KLJ\x00j\x026NzNOM0R\x95\x06m\x06UP?PRO>V\x82\x0fq\x0bTVS\x0dr\x17\\WEVXU,`\xae7]\xad\x15w\x1c[]Z8`\xaa\x19y\x1e;b\xac_a^=d\xae?f\xb0*{!bdaSe\x84)}+Bh\xb3efdDi\xb4ghfLj\xafpiQEm\xb1ikh0\x820Ol\xb2Ip\xb4lnkTp\xa3Kr\xb7npm6\x869Nt\xb9zs[Wu\xb5>\x89=strZx\xb9vwt]{\xbbG\x8eHy{xX\x80\xbf^\x7f\xb9\x85}ea\x7f\xbf}\x7f|O\x93N\x7f\x81~c\x84\xbeW\x95V\x82\x84\x81m\x87\xbch\x88\xc3\x90\x86h[\x99Zj\x8a\xc4\x87\x88\x85q\x8b\xc1\x8a\x8c\x89`\x9dd\x96\x8cnt\x8e\xc4z\x8f\xbf\x8f\x91\x8eg\xa1hy\x93\xc9~\x93\xc4x\x95\xc4\x92\x94\x91\x81\x95\xc6\x9f\x95w{\x98\xc7\x83\x98\xc9\x82\x9a\xc4\x97\x99\x96u\xa8v\x86\x9b\xcc\x80\x9d\xcc\x99\x9b\x98\xa5\x9b|\x85\x9e\xc8\x82\xa0\xcf\x99\x9e\xa0\x9c\x9e\x9b\x89\xa1\xcb\x9e\xa0\x9d\xab\xa1\x82\xa0\xa2\x9f\xa1\xa3\xa0\x81\xb0\x83\x91\xa5\xca\x95\xa5\xc4\x8e\xa6\xd1\xa3\xa5\xa2\x91\xa9\xd4\xb4\xa7\x83\x95\xa9\xce\xa7\xa9\xa6\x8c\xb4\x8a\x94\xac\xd6\xaa\xac\xa9\x99\xad\xd2\x9f\xae\xce\xbb\xae\x89\xad\xaf\xac\x9d\xb1\xd6\xaf\xb1\xae\x98\xbb\x97\xa3\xb3\xd3\xa1\xb5\xda\xa7\xb6\xd6\xb1\xb5\xc4\xb4\xb6\xb3\xa3\xbf\x9d\xac\xb7\xd2\xc4\xb7\x92\xaa\xb9\xda\xa2\xc1\xa4\xb7\xb9\xb6\xb3\xbc\xc4\xad\xbc\xdc\xba\xbc\xb9\xa6\xc5\xa8\xb1\xbd\xd7\xbd\xbf\xbb\xb1\xc0\xe1\xb8\xc0\xd5\xaf\xc7\xab\xcd\xc0\x9a\xc0\xc2\xbe\xb7\xc2\xdd\xbb\xc3\xd8\xbd\xc4\xda\xb2\xcc\xb7\xc4\xc6\xc3\xba\xc6\xe1\xc0\xc8\xdd\xc7\xc9\xc5\xbc\xce\xba\xd8\xc9\x9d\xc6\xca\xda\xc0\xcb\xe6\xc9\xcc\xc8\xc2\xcd\xe8\xbf\xcf\xe2\xcd\xcf\xcc\xc4\xd0\xde\xcb\xcf\xdf\xc8\xd3\xc1\xc8\xd0\xe5\xe1\xd1\xa5\xd0\xd2\xce\xc8\xd7\xca\xcb\xd3\xe9\xd2\xd4\xd1\xd2\xd3\xdd\xce\xd6\xdf\xdf\xd7\xa9\xce\xd6\xec\xcc\xda\xce\xe6\xd6\xaa\xd6\xd8\xd5\xcb\xdb\xee\xd5\xdc\xd1\xd3\xdb\xe4\xd6\xda\xea\xd9\xda\xe4\xda\xdc\xd9\xd2\xde\xec\xd9\xdd\xed\xdc\xdd\xe7\xd7\xe1\xdc\xe0\xde\xe2\xdd\xe0\xdc\xdb\xe0\xe2\xf0\xe0\xb3\xd6\xe2\xf0\xdd\xe1\xf1\xe0\xe2\xdf\xde\xe3\xe6\xe0\xe4\xf4\xe3\xe5\xe2\xe1\xe6\xe9\xde\xe7\xef\xe8\xe5\xea\xe5\xe7\xe4\xe6\xe7\xf2\xe4\xe9\xeb\xe7\xe9\xe6\xe2\xea\xf3\xeb\xee\xea\xec\xed\xf7\xe6\xef\xf7\xe8\xf0\xf9\xf0\xf0\xfb\xf0\xf2\xef\xf4\xf2\xf6\xef\xf4\xf7\xf4\xf6\xf3\xf2\xf8\xfa\xf8\xfb\xf7\xf6\xfb\xfe\xfd\xfb\xff\xf9\xff\xff\xfe\xff\xfc\x11\x0a\xd6\x8d\x00\x00\x20\x00IDATx^\xed\x9d\x0d\\T\xe7\xbd\xe7\xef\xb2\xcd&\xbb\x0f\xcc4w.s?e\x8a\xbd\xbc\xe8z-[\xb2z>\x8c#\xd6-h\x16#,6\xd7\x17\xbc\x94+\x95h\xae\xa2\xb7Jb\xc8\x8d\x8e\x91\xd8\x05\x0aac\x12r'\x161vg\xbd)+\x91\x98b,\x09i41\xb9\x96H,-\x9b\x17\x92\xb6c\x1a-&\xd4\x13\x93[\xaf\x0a\xfd\x9c\xcf>/g\xe6\xbf\xc1\xc3\xed\xcd\xbd\xfd\xbd\xcd\xed\xc3\xe1\x16\x03\x00\x1d\x12c\xb0\xaf\xaewdd\xa4\xafq\x04Ow4_\x14aO\x0e\x18/\x891\xf8\x8c\xdbO\xbfX\xd7M_\xe8\xae\x0b\xb7\x18\x00\xe8\x90\x18\x83\xc5ABO\xfd\xe0\xa0\x08\x06\x03\x13\"A\x06S\xe4\xa3i\xb4\x8a\xb8\xd8\x0cG\xd3\x80\xf1`\xa8\xc1\xbe\xfe\xfezo\xff\x20{2\xd2\xdfS\xdf?\x84g67\xf7\xf4\xf547\xc3\xc1\x08`<\x18jp\x17\xab}\x99\xab\xfdd\xb2\x09O\x0cw\xee\xafo\xed\x84C\x11\xc0\xb80\xd4`\x00\x88;`0`n\xc0`\xc0\xdc\x80\xc1\x80\xb9\x01\x83\x01s\x03\x06\x03\xe6\x06\x0c\x06\xcc\x0d\x18\x0c\x98\x1b0\x1807`0`n\xc0`\xc0\xdc\x80\xc1\xa6`$R\x83\x99\x0b\x18<\x0eF\x86GF\xf0\xff#5\x8b\x17\xfd%ihI\xa4F3\x1608fzggf\xe6eef\x96\x1bu=hf\xa6\xbb\xbd/R\xa3\x19\x8b\xd1\x06k\xa4N\x8dt\xb7\xd6\xb5*\xb3\x8d\xe2!A8\xa2\xf3\xd2y\xa7\xb0J\x14\x8f9\x05\x86S\xd5n\xd8\x82rs\x93l\xb9s\x936\x1a\xa3p\x0fj\x8b\xd4d&c\xb0\xc1\x1a\xa9S\xa2\xa7\xbe\xbb\xaf+\x90\x84\xa2\x857\xdc\x8b\xb1\xf2\xe2\xab\xec\xdf\xf7O:[t\x9a\\y\xf9\x01\x97(>)\x9c5\xf8\x99wE\xde\xe0\x9d\xa5\xa4\x94\xbdR\xbaS\xfc\xad@\x0f\x9d\xed\x0c1\xf8\xd8\xd2\xcb;\xd9X\xeb\xda\xad\x8c\xc1\\\xbf\x01\xba*ER\xf7\xda\xdc\xe4\x09\xb7\xe9\x8a\xa0\xd4\xe0\x8d\xc4\xe0\xf6\x901\xb8.\xe4\xec\x1b\x1c\x8b\x08K\x82\x0c\xa6\xb0:\xb8\xd7\x8d\xcd\xf35yu\x16\x20\xe4\xe6b\xe7Y\x99;l\xf7\xd8Y>\x955\x8dT\x95\xb3\xf0Km\xec\xa5\x0d\xdbT\x0bq\x06\x1fg\x95j\x03=3QU%\x8a\xbf\xa63\x14\x83Y\x83#\xa4\x0e\xae(\xc6>\xbe\xed\x0a1\xf8\xf2\x9d\xc7\x96\xd2\"Bt\xad\xf0\xd7\xc1\xaa~\x03T\xb3sh\xb9k\xe8\xa3\xb2\xe9\x8a\xc16\xec\xf8\xc8\\Z\x07\xa7\xe5\x92\x0fpYYP[\x1e08,\x86\x1a\xac\x99:u\xda\xdd\xd5\xd7\xdd\xe8\x09W\xebU[kZ\xe7\xdb\xd8\xe0T9\x8b\x15\x11\xa2\x15\xcdn\xae\xcb\xb0\x9f!\xf3\xd0\xb2\xfd\xad%\xa8\x91_\xe6\xcd\xa5\x07.\x1dq\xbeyiG\xd5\xfbX\xe3\x05;\x8e\x1c\xdb\xc9|kq\x1d8V\x95\xff\xae\xf8\xeeI\xe7\x03/_y\xe3\x01\xe7I<\x1e\xef\x10\xf6\x1d\xdb'\x90c\x11o\xe6\x17\xb74,\x15\x9c\xcf\xbc\x89\x9f\xbcq@8\x20\x9f\xc2\x13\xf7\x95\x16|J'\\\xc2\x7f!\x06\xff\xdfau\xbf\x01\xaa\x91\xad\xda\x837\x87~&\xfd\x9b>\xdcI\x0f5\x9c\xa1-r\xec\xdb\xb6\xe5\xa0\x94\xfa^\\\"\xdc\x9e\xe9\xf6\x94\xa1:\xbem\x10pN.,\x86\x1a\xac\x9d:\xd5\xbd\xbf\xde\xc3}\x97jp\xb1\xccn\xcb\x95\x07\xa2\xd3h%\x9b\xb0\x96\x97\xa4:\x96\xb3\xda\xa3-\xd7n\xcfU]=pe\x85\x20\x1cY,\xe4\x1f\x11\x04r\xb8\xecx\xd5\x9d\x05U\xc7\xe9+\x97w/uU\xbdJ\xaf\x8b\x10\x9co\xe4\xe3\xc7\x87\xc8\xf1\xe0\xb5\xf9k\xd9\xf1\xe0\xf3\x9b\x96\x96\xee{\xc6I\xe6^\"\xaf\xe6\xcb5\xc2\xdb\xc2\x83l\xc2\xb5\x9b\x1e\x0f>=\xac\xee7@cn\xb5\xc3\x92\x96\xcb\xbeT\xfc\x9b\xde\x9dLK\xf5<:\xf3t\xae-5o\x03Bd\xe4=]\xe8H\xcdiU\xb5\x0db0\xa5\xb0{\xd0\xb0\x0b\xe1L\x87\xa1\x06\xc7\x03\x9fU\xae7\xd8\x9e\x9cq\\r\xb1\"B\xde\x93K9\x1d\xc5\x19\xb9\xf8\xd0\x9a\x19\xbc\x97\x0a(\x98\xce\xe0f\xb9\x880\xdc\xe0#w\xb2\"\xc2x\x83\xf10\xdc\x1df?w\x86c.\x83\xab\xbd\xe2|\xbf\xb8\x11\x0c\x16&\x91\xbf\"u\xf0_\xf3s\xc2n\x0a0\x99\x98\xca`\x1f\x9a]\x96\xc6.\x08\xeb\xf7ZJ\xc2\xee\xa2\xeb\xd97q\x9c\x7f\xf5\xe7\xd8\xe0\x7f\xff\xe7\x7f\xedT\xe6\x85\xdb\x12`R1\x95\xc1b\xb5-W\xben\xa0\x0c\xef\x16Y\xce\x84o\x1dGZ\xf2\xab\xdefS\x0f\x09\xff\xc9\x7fu\xe5~\x03\xeb\x08@\x0fs\x19<\x15\xa0W\xb8_\x95\xa4\xd1[\x96Dq}00\xd9\x80\xc1\xb1\xe2C(7\xf7\x96\xb4\xdc\xb9I+\xc1\xe0)\x00\x18\x1c+\xc3^\x87\xdd>\xcbn\xb7\xcf\xef\x82+n\xa6\x00`p\xcc\\\xec?s\xfa\xcc\x99\xd3\xa7\xfb@\xe0\xa9\x00\x18<\x0eHV\x84\x81y\x11@8\xc0`\xc0\xdc\x80\xc1\x80\xb9\x01\x83\x01s\x03\x06'\x8c\xcd\x9b\xb5&\x81\x181\xda`\xf9^\\_=\xbd\xce\xb2\x9e\x9e\xd5\xeao\xado3\xcd\x95+-\x82\xf3\x18\xfe\xe7x\xbe\xa0\x9f6\x11\x15\xff\x92}\x9f\xc6$\x10+\x06\x1b\xecO\x9d\x1arw\xf7c\xe8\xc5\xee}u\xde3\xde\xd0\x9bk\xa6(\x17v\xe4W\xe1\x7f\xaa\\;\xd4\xf7\x16\x05\xd2\xac\xa2\xe5\x9e9\xefhLF\xcbs\xafL\xb4A,\xc4\xb5\xb38c\xac\xc1\x81\xd4\xa9!w\xc0\xd8\x91&r\x0bBG\x93Y\x0eN\xed\xdb\x94\x7fA\xbc\xe0\xda\xb4/h\xbe\x92f\x15\x15o)\xe3\xee[\xe3\x18\x82\xef\xfa\xeeD\x1b\xc4B\\;\x8b3\x86\x1a\xac\xa4Nq\x06\xf7\xd2\xc44_\x9d\xf1\xe9\x95\xe3c\xdf\x8e\xaa#\xe2\x8f6\xed\x086x]l\x06oV\xc6\xdd\xcd\xb1\x0f\xc1\x91\x9d\x8a\xd8\x20\x16\xe2\xdaY\x9c1\xd4`%u\x8a3\xb8\x9d\xdd\x1d\xe4\x09w\xab\xe7\xe4prS\xb1\xf3\xceM\xc5W\x82B\xa5\x9e\x09dQ\x89\xe7\xb7\xde\xe9,\x92\xa7\xfd\xec\xdbq`\xab\xb8\xe9\x006\x98\xe6\xb7\xcaI\xad\xf2U\x964\xcd*\x90E\xf5\xa6S\x106])\x16\x84\x02u\xf2\x9a\x18~\x08\xfe\x87\xec\xecG7/\xfc\xc6w\xdf\x12\xc5W\xb2\xb3\xb3\xf7\xbcu\xcf\xc29\xab\xc9W\xd4Sw\xcd\xbb\xeb)\xfc\xef\xff\xc9f\xdcE\x9b\x1fZ=\xef\x9b\xf7\xb1\xf3\x83o}\xf7\x8e\xec;\xfe\xf6\x1du\x83\x17V/\xc43\x17\x8aA\xf8\xdbr\xfd\xe2\x15\x1f\xc2\x9b\x93\xfd-:\xf9\xd4}\xdf\x9c\xb7\xfa\x97zkSm\x99\xce*\x0c\xc1P\x83EQ1\xb8}\xbf\xbb\xa9\x83\xfc\xdc[\xd9}\x8c\x1da\x12O&\x877\x16\xec8r\xfc\x99;\x85O\x83C\xa5\x8aZ\x9e,\xa0YT/\xe6WP!\xd2*B\xb9_\x9f\xab\"\xf8,\xaa+;+.\x14\xabo\xc6\xa7\xfc2{\xb3\xc6d\x809\x0b\xf1g\xfb7\x0b\xbfM\xa6\xef\xca^\xcd\xc2\xaa\x9e\xcb~N$\x8f?\xa6s\xfd\xdf\xeb?\xc6\xc3&\xb6\x8e<^\\\xb8zX\x14\x87\x0f\xfdF\xd5\xe0\xa9;\xe8\xf0=O\xbd\x06\xae-\xdf\xef\x1cl\xb0\xb8g\x0ei1\xe7\x1b\xf8Cs\xcf\x1d\xa2\xaa3nm\xdc\x96i\xaf\xc2\x20\x12d\xb0\xd8C\x8b\xdf\xfa\xce@v\xa5\xd7\xf01\xf8\xdd\xa2\xd2\xdd\xcf\xbcq\x85~\xc1\xf3\xa1R\xc4c9E\"t\xec\xa4\x06?)<\x19\xc6`U\x16\xd5\xe5u+6\xa9\x83\x01)\xff\x90\xfd\x96\xc6d\x809\xb4\xaex*\x9b\xb8x\xd7\x1cy\x88\xde\xfc-\xfa\xcf\xb7\xa8\xf0\x01\xa7\xbe\xbb\x90\xfcQ\x8f\x91\x85\x9b\x89^\xdc!\x83@\x83_\xde\xb1\xf0\x1f\x9ezE\x0c\xba\x1a\x9fk\xcb\xf7\xcb\x1b\xbc90\xa9\xb96n\xcb\xb4Wa\x10\x892\x98AJ\x87v\x16l\xd7\xda\xae\xd5|R\xb9\xf0\xcc\xf6U\xc2\x8a'\xa9`|\xa8\x94([y@\x08)_Ej\xf0\x85}\xbf\x0ec\xb0:\x8b\xeaH\x203\x85\xe3\x9d9\x9b5&\x15\xa8H\xe2\x0b\xd4\xb2\xbb\xee\x92g\xaef\x1a\xfd-\x1b\x99\xfdN\xdd%W\xa9\xf8\xf9\xa3\xd9\x17\x95.\x94\x9d\xaf\xdf<\xf5\xddoe\xdf\xf1\xa8\xa8\x82k\xcb\xf7\xcb\x1b\xacLj\xae\x8d\xdb2\xedU\x18D\x82\x0c\x96\xb5\xf5zHf\x0f\x1d\x8e\xdd\x86\x1f\x8bxu\x1fv\xf7\xc2\x11\x17-s\xb9P\xa9\x80\x95/\x0aZ\x87xI\x08\x10F1\xb8\x813\x98\xa4Y\xa9\xb2\xa8\xde/j(\xfemH\x1f\xf7)\xe3\xee}\x1aCp`\x0c&?\x99\x80=\x9b\xd9\x9e\xd2Be\x0c~\x8a|\xcf/|\x85B\xcb\x81\xe01\x984x\x85\xf4\xf5\x9bCs\x9e\x12y\xb8\xb6|\xbf\xe1\x0c\x0eZ\x1b\xb7e\xda\xab0\x88\x04\x19\xec\xa1i\xc1C\xf5\xdd\xe4x0)#\xbc\xc6\x1f\x0fn\xa1\x91\xabb\xd5\x03\xe4\x91\x0b\x95\x0a\x18|\xa9\xa8\x8a\x0c\xc2\xbbw\xd3\xf9}\xdb\xd8my\xbc\xc1\xf9\xf8\xe1J\x0538\x90f\xc5gQ]\xaeh\x11\x1f\xa8\x0a.#\"\x0d\xc1\xe2\x9c;H\x81\xb9p5\x99\x0e\xaaA\x0f\xb1:x5~\xed\x1d2\xe39V\x93\xee\xc1\xbe\xf9\xee\x20\xb5\xadx\xdf}\xaa\x06{h\x99+\xaeV\xaf\x87k\xcb\xf7;\x0f?\x1f\xf9v\x88\xc1Zk\xe3\xb6L{\x15\x06a\xa8\xc1J\xeaT\x9f\xbb\xedt_W\x1d\x1d\x89\x13uN\xaeE\xc8o9vl\xa7\xc0\xc4\x95C\xa5TYT/\xbaV\x1d8\xbe\x9b\xe5\xb1\x8a\x8bX\xe0\xceowT\x91\xd4\xc0w\xabv\xe0\xa1\xb5\xa2\xe8\xc9\x96\x0a9\xa1\xca\x9ff\xc5eQ]~\xf9\xa1\xa2\xf7\xc5\xf3\x05\xbb_V\x97#\x91\x86`qN\xf6]\x87\x9e\xfa\xe67\xde\x12G~J\x8f\x03\xb06\xf7d\xdf\xf7\xe3\xfb\xb2\xef\xa1\xd3{\xe6\x91/\xab\x04\x83\xa3\x07\x0c&\xb4\xbcx\xa5j\x82\x17K\xc6\x1508z\xc0`\xcc%\xa1\xe2\xa1\"\xf5\x99\xb7D\xc2\xf6\xa2\x80\xe8\x00\x83\x09J\xa8\xd4T\x80\xeeEi\x1d\xa2\x004\x00\x83\x01s\x03\x06\x03\xe6\x06\x0c\x8e+I\xe6\"\xd2\xdb1\x03`p\\I\xfa\xc8L\x80\xc1@0`\xb0\xe1\x80\xc1q\x05\x0c6\x1c08\xae\x80\xc1\x86\x03\x06\xc7\x95\xa8\x0c\xe6\x1b=rk\xd0\"!3\"\xa1\xd7<\x8an\xc0`\x20\x98\xa4h\xcc\xe1[\xdc\xf6\xc3\xa0\x17Cf\x84!)\xf0\xa0\xf9b\xe0\x90\x83N\x0b0x\xfa\xc9W\xf04\xf9r\xff9\xb6\xeb\x16~\x97*P,\xcb\x13\xb7\xf8[\xc9\xf3\x94\x19I\xbf\xf8H\x99\x1bx\x08t\xa6\xcc\xa5\xb3\x03+\xa3\x13\x81\xf9\xfa\x1b\x93t\x80\xde\x83\xfa\xfe\x8e\xa2\x82\xadPEDIh\xea\x147\xd7P\xbc\xa9\xa8|>\xb2oK\xab\xc1OJ\x92\xcb<\xb5\xf6\xd9#\xa2\xaf\xc3\x9b\x91\xeb\xf5\xb2]K+\xcaljM[B&K\xac\x1b=\x1b\xad\xcb\xf1\xd4\xe9\xd4\x8c\xfa\xd6<\x14\xde\xe0\x7f\xfc\xcaG\x7f\xf3\x8f\x9c4Ir5\xe0\xb7*Z\x83\xb9E\x94\x87@gQ\x1a\xac\xbb1I.r\xdf\xf5\xf9\x82U\xcf\x1c\xdb$\x80\xc1\xd1\x11\x9a:\xc5\xcd5\x96\xb4\xe5x\xc4\xf5\x88%+\xc9\xc8[\x8fgt\"z\xec\x81\xab\"\xc8\x1fq.\xb1\xe3\xa96\xd4\xe6\x7f\xcc\x9d\x85?w#Y\xe1\x0d\xfe\xe8\xd6\x1f\x92\xaa\x20\xe9\x11\xfc\xf0\x08\x1e\xff\xfeR\xdeQ\xf3[\xa528L\x15\xc1-\xa2<\x04:S\x1b\xacWE\xe8oL\xd2q\x128P\xb5\xea\x12\xde\x95[\x0b\x06GGh\xea\x14?\xd7P\xd2\x9a\xb1\xb3>\xb1r\x99(.\x9b5Lp\x94\x90\xf9\x9c\xc1XnV\xf1\x96\xb0\x83g\x99%\xe2\x10\xa2\xb5\xc4F]\x83o\xfb\x01\x91\xe3\xef\xd8\xce\xbe\x7f\xe7\xe9\x89[\xbe\xf7\xf3_=\xf1\xb5\x80x*\x83\x1f\xa1\xad\x1e\x09\xbc\xa8\xcc\xd068\xd0\x19]U\xa0\xab\xc0RA{r\xfa\x1b\x93$\xaez@\xbc\xc0\xd2\x04\x1a\xc0\xe0\xe8\x08M\x9d\x0a\x9dk\x10imb\xa7E\xa4\x06g\xc9\xd5/-\x18\x82\xf6\xe4\xa8\xc19\x8b\xe8\x8c\xbc\x1c\xb1\x0b\xd1\x9c7\xfd=\xb9Gn#%\xe6/\xbeD\xbe\xaa\xc9A0v\x00\xeb\x89\xaf~)\xe9\xabO\x04tT\x19\xfc\x11i\xa5\x1aW\xfd3\xb4\x0d\x0etFW\xa5\x98\x1a\xe8\xe6{\xb7rG\xd3>\xd2\xdf\x98$qS\x85\xf8\xaap\x92l9\xec\xc9EIh\xea\x147\xd7X\x88\xc1Vf\xf0\xf2Y]\x14z|\x9a\x1aL\x13X\x14\x83Kf\xd1E\xd2\x03c\xb0\xfe\x9e\x1c\xe3\x91\xaf\x07\xfcIo\xc6e\xb3\x98\xe3\xc0\xc5\xf1\xe9\xdb\xc3\x1b\xfc\xb3/\xffL[\x9aD\xa0\xbb1IGH\x1d\\Q|A\x14\xdfv\x81\xc1Q\xa0\x9d:\xa5\xcc5\x94^{\x8d\xaf\xd9\xd2\xe3[\x96\x8b\x87\xdbJ\xb4l\x7fk\x09\xa2\x19\xc6\xd5\xd6\x9a\xd6\xf9\xb6>rN\xae\xa4S\xec*\xb1x\xfb\xf1(\x9d\\\xe9\xa9L&\xc7\"zl\x8e\xea\x8d\xf6\xe4\x94z\xad3\xe1\xb2%I_\xfa\xc1G\xda\xd2$\x00\xfd\x8dI\x12\xc8\xb1\x887\xf3\x8b[\x1a\x96\xca\xd9Y\xe6\xc3P\x83\xb5S\xa7\xb8\xb9\x062\x92\x86PS*\xb25\xb3\xea\xb7-\xd7n\xcfe\x7f\x0f\xe1b\x99\xdd\x96\xdbI\xae\x8b@\xc8\xd2c\xc3\x8fexnm\x96-\xab\x96\xbe~z\x91=\xbd\xbc>\x85\xce\x0dfJ(\x1b5\xf2\xf1\xe0\xf3\x9b\x96\x96\xee{\xc6I\xb3\xb3\xcc\x87\xa1\x06O\x7fLfp\xa4\xb7c\x06\xc0\xe0\xb8\x92d.\"\xbd\x1d3\x00\x06\x03\xe6\x06\x0c\x06\xcc\x0d\x18\x0c\x98\x1b0\x1807`0`n\xc0`\xc0\xdc\x80\xc1\x80\xb9\x01\x83\x01s\x03\x06\x03\xe6\x06\x0c\x06\xcc\x0d\x18\x0c\x98\x1b0\x1807F\x1b\xac\x91:\xe5\xf36\xd7\xb5v\x0f\x87_nr\xa8\xb1\xd6\xe8\xbf\xd8\x9a\"\xdf{\x94\xb2_\xbfQ\\\xf9\xed\x03+\\\x9b\xae\xd0?\x18*\xe4\x9f\x8f\xd4:\x98cN\x81\xe1<\x12\xa9\xe9t\xc2`\x835R\xa7|\xf5\xad=}]\xf5\xad\x89P8\xcb\x92\xa5\xffb\x0d\xf2zkQ\xad\xd7\x8b\xc2h\x1eW\xaa\x8a\x0e\xec\xcc\xbf\x20\x8a\xef\x9f\xb8\xb3\xe9\x82\xa1\x06\x8bz\xa9S\xa28\xd2\xa4?\x18N\x1a\xf3\x0b\xc5\xc2\\\xfc\xaf\xaf\xb9)=#\xd5Q\xbe\x1c\xf5\x89\xc3\x99i\xb5\xd5V[]\x1e-~e\x83}\x1d\x8e5\x83\xe2`uj\x87\xaf\xb7)\x05\xa5o\xabN\xb7\x91\x9b\xfc\x02aU\xb1p\xf9\xc8\x91\xe2U\x8b\x8bw\xefX\xf0\xae(\xee\x14v\x1f?P\xb4\x0e\xef\xbe\xbdq\xf2\x88\xd0r\xf2\xe4\xbb\xacQ\xc0`\xa5\x81\xf8b~\xc5\x93\xc7[p\xa9q\xe9\xe5\x93\xab\xaaN\x9e<\x19\xfawH\xe5\xc5.\xbd\\\xfc\xc0\xaf\xc5_\xb7\x14\x9c\xbc\xf4\xe6\x11\xa7P\xdc\xd2R\x9c\xff\xa6\xba\xb3iC\x82\x0c\x0eJ\x9d\xc2Cp\xfd\x90\xde\"\x93\xc6\x88\xadF\xac\xb11\xfdf\xa3\xf9\xf8\xe3\xe4#w\xd4w\xe3\x12\x18\xb1\x9bP\xfd\x06\xe3\xe1\x9aD\x01\x96\xd0L\x1fk:n6\xe4\xc8\x09\x0a\xab\x8a\x85uB\xd5\x05\xf1\xca\x052X>#\x12\xef\xe8\xd1\x03\xad*\x82kp\xb9x\xd3e\xe2?\xfd\x03\xd0\x1aU\x04\xbf\x98\xd8B\xc6\xe7\x1d;\xc9\xa4\xab\x14/q\xa1\xb8\"hm\xd3\x85\x04\x19\x1c\x94:%v\xf2y\xc2F\xd1\x8d:|\x1d\x88EV\xcc\xb6\xca\x1bPIb\xd2N#9L(`p\x1fv\xfabj;\x99\xb4n\x20\x8f\xb5hH\x1dV\x15\x0b\xeb\\\xf2P\xbb\xa3\xf4\xf2\xa7\x98b\xaa\x9a\x96\xc1\\\x83\xe3\xc2\x1b\\\x0f\x11\x0c~\x7f\xc1\x1b\xe2\xe5\x82\x17\xc9\xa4\xab\x81<\x1e\x10.\xa8\xd76]H\x94\xc1\x0c9uj\xd8\xebN\xc4\x9f!\xa8\xa5G{\xd9\x81\x86\xd9s\xe5\x995h\x90$\xa0\x04\x8f\xc1b^\xb9\xd8f\xa7G\xfcX\xaa\xb0\x17u\xa9\xc3\xaaba\x9d\xbf\x82]+W\xb4\x9b\xc8\x13-\x83\xb9\x06\x07\x04n\x0f-\x92\xc1\xe2\xa6}\xe2\xf1\x02\xba\x80\xab\x85<\x9e\x14^U\xafm\xba\x90\x20\x83U\xa9S>Oc\xbf\xee\x02\x93H\xe1\xec\xce\xceN9%-\x10\x96\xd6\x97\x9c\xd7\xd7\x9d\x91#?S\x0c\xf6\xd8\x87Y\x11!ZiP\x84\x1b\xf9\xd4aU\xb1\xb0n\xab<\xb1\xa3\xf4U\x0a\xad\x0c\xb4\xc7\xe0@\x83\x17\x05\xee\x1805\xf8\x99w\xc5\x20\x14\x83\x8f-\xbd\xbc\x93\x8d\xb5.\xbas\xf8\x0c\x1d\x83\xb9\xb5M\x17\x12d0\x9f:5\xd4\xbc\x9f\x96\x14\xfa\x0bM\x12\x8er\xfcP\xee\xa0\xd3\x01\x83\xbbP\x1aB\xb9\xfeO\x94b\xf0\xb0\xddc\xa7E\x84hM#\x15\xf3\xac\xdc\xa0\xb0\xaaX\x08\x8c\xa0\xc7YM\xda@\xcfAh\x19\xcc5\xb8TTE\xc6\xd4\xddT\xc8\xaa*Q\xfc\xb5\\\xd0\xf6m;\x13\xbc\x189\xb6ql)-\"D\xd7\x8aKx\xe1\xd2\xaa\xa0\xb5M\x17\x0c5X3u\xaa\xaf\xae\xb9\xaf\xbf\xbf\xbf#\xe6\xdd\xa1\x09\xe2\xf3\xa0\x0d>\xd1\xb7\x01\xb5]\x1c\xee\xa4\xb1\xd7\xd4\x83nk\xbb\xc7\xeb\x17\xb8\xab\x16\xd5v\xc9\xd3\x95\xb3X\x11!Z\xd1\xec\xe6\xba\x0c;i\xcd\x87UE\xcd\xa7\xaf\xd3#\x09\xe7\xe9\x93}\x0bv\x1c9\xb6\x93\x98\xc5\x8eE\xbcL\x8e\x13\xbc+\x9f\\{W\xd5@|\xd1\xb5\xea\xc0\xf1\xdd,,\xb5\xc5u\xe0XU>\x1b\x83\x17\xa1<\xb9\xeb7\xf0b\xfe\x81z_i\xc1\xa7t\xc2%T\x1cyfU\xc1\xdb\xea\xce\xa6\x0d\x86\x1a\xac\x99:\xd5\xc6f\xba\x8d>\xa3\xd1N\x8e\xee\x8a\xfb\xf1c{w2-g\xa9\x07\x1d\x162i\xc9%\xdb\xe6#\x91S6\xf9\xcb\xe14Z\xc9&\xac\xe5%\xa9\x8e\xe5Lr.\xac*j\xdeT\x15\xa3\xc7\xab\xee,\xa8:\x8e\xc7\xcc\x02:\xd7ID\xdb)\xd7\xab\xdb\xf9\x06\x98\xb7\xb7\x17/\xae`\xe3\xf4\xe5\xddK]U\xb2\xac\xf5v\xf6\xe7\x11\xc4K\xf9x\xa1|\xb9Fx[x\x90M\xb8v\xef,(\xda\xf1\xaejm\xd3\x08C\x0d6\x01\x83\xb65\x83\xc3\xc3C]K\xec\xc1U\x8d\xcf*\x1f\xb1\x0e\xf3\xf7a\xa6\x12\x97\\\xac\x88\x90\xf7\xe4\xa6-`\xb0\x9aV\xbb>J\x09\x95\x12\xb5S\xa7\xe2\x90E\x05\xa9S\xf1#A\x06\x07\xa7N\x89\xc3\xcd\xed\xda\x0bL\x1e=\xa8\xa6\xd3\x93c#W\xab\xf3\xf1QJ\xa8\x94\xa8\x9d:\x15\x87,*H\x9d\x8a\x1f\x892\x98AR\xa7\xe4\x1d\xa2n\xb7F\xebI\x85\xd6\xc1C\xc9d\xbd||\x94\x12*%j\xa7N\xc5!\x8b\x0aR\xa7\xe2G\x82\x0c\xe6R\xa7\x1a\xd9\x01\xd9\xee:\xbdE&\x0b\xb6'\x97J\xcc\xe3\xe3\xa3\x94P)Q;u*\x0eYT\x90:\x15?\x12d0\x97:\xd5D\x03C\x12RE\x905\xa7\x95\xf7lS\xc5G)\xa1R\xa2v\xeaT\x1c\xb2\xa8\x20u*~\x18j\xb0f\xea\xd4iw{o_oB\xf6\xe4\xe8\x19\x8d\xbc\x92,U|\x94\x12*\xd5'\x9f}c\x07\xfe\x02\xa9S\x13\xcd\xa2\x82\xd4\xa9\xb8b\xa8\xc1\x9a\xa9Sb\x7f{s]kg\xdc\xcf\x0fD\xa2\x19\x97\xaa5\xd8\xe3\x0c\x9am\xa2\xc4G)\xa1R%rA\xcbB\x01\x03\xa9S\x13\xcd\xa2\x82\xd4\xa9\xb8b\xa8\xc1\xa6@/\xd0$\x90:\xa5=w\xca\xe5\xa0@\xeaTD\"umR\xf4T\x0c\xa4Ni\xcf\x9dr\x06C\xeaTD\"umR4U\xe4S\xa7\xb4\xe7N-\x83!u*\x1a\"umJ\xb4C\xa5\xb8\xd4)\xed\xb9S,\x8b\x0aR\xa7\xa2\"R\xd7\xa6D'TJI\x9d\xd2\x9e;\xd5\xb2\xa8\x20u*\x1a\"u\x0d\x00\x06\x00\x06\x03\xe6\x06\x0c\x06\xcc\x0d\x18\x0c\x98\x1b0\x1807`0`n\xc0`\xc0\xdc\x80\xc1\x80\xb9\x01\x83\x01sc\xb4\xc1\x1a\xa9S\x98\x1e\xc3\xff\xa2gt\xf4\xe4\xd9\xd2\x96y\xd3Tw[pYT\x9a\xb1T\xb1\xd2\x1e\xf2\x97\xeb\x80X0\xd8`\x8d\xd4)\xf2\xac\xae#\xb6?Ml\x10m\xb6\xb9\xee\xe6,\x84T'\x94\xb9,*\xcdX\xaaX\xf1\xd84\x02\xd8\xbc]\xa1\xf3\x00M\x8c5X+u\x0a\xe3i\xef\x9b\x8a\x06\x0f\xa5.\xb9H\xee\x1cB\xc1\x97DpI>\xa1\xa1>qana\xa4\x16\x80\x8c\xa1\x06k\xa7N\x89=\xf5\xbe\xfe\xa9hp\xa5\x8d~G\xd4\xa0\xe0Ba\xf2\x0d\x9e\x0d\x06G\x8b\xa1\x06k\xa7N\xf9\xeaN\x8b\x090\xb8\x0cY\xdc\xe5\x19\xb6\xbc>2\x99\xdc(\x9e\xb1\xa0Lq8\xcd\xb2\xc1\xe1\xf0\x96\xa5\xe6\xfaDq\x16\xbb\x81h\xb0\xe6\xa2\xe8+tX\x1c\x8b\xfc\x7f\xa8V\xcb\xe0\x8e<\x87\xc5\x9e\x97\x1e\xbc\x16\x0d\x94\xb5\xe1\x9f\x83\x0d\xa1\xe4&67\xb09\x1e\xf9\xee\xa6\xd9\x11:\x02\x08\x86\x1a,j\xa6Ny\xda\xc5D\x18L\x82\xa2\xec\xd55\xa9K\xe8\xd5\xbd\xd5X\xc6\x12+\xfe\x9aHE\xe5\xf3\x91}[Z\x8dx1YI\xa7\xf4\xa0\x95\xde\xe6E\xc9\xb2\xad\x1a\x06w\xa1\x92\xfd\xedn;\xd2\xba\x8f#\x08nmx9\xaf\x97]\x1b\xcfm\x8e\xaf\xc3\x9b\x91\xeb\xf5z\x0dO\xf34%\x092\x98K\x9d\xea%\x91i\x090X\x14\xadv<\xe0-\xa7\x7f\xcc\x9eZTM\x9cJ[\x8eu\xf5\x88%+\xc5>\xd4\x1ah\xeak&\x1f\xb6\xac%\xec\x99\x86\xc1nz\xb7Qm\xaa\x18\x0d\xca\xda\x086\xf9\xee\x0ens\xa0\x8a\x88\x9e\x04\x19\xac\xa4N\xf9\xeazGFF\xfa\x1a\xf5r\xf2&\x11+\xc9*a\"q\x067c+}b\xe52q8\x85\xcb\xb8\x1et\xe7\xcdJEY\xec\x89\x86\xc1}\x8e\xf42w\xb7\x18\xc5\x10,\xea\x1a\xacl\x0e\x18\x1c=\x892\x98\xd1\xd1*\x9eq\xfb1<@\x98\x13\x893\xb8M\xec\xb4\x88\xc4`\x7f\x1d<\xdc\x86EMsT\xb6zs\xf5\x0d\xc6uQa&J\x8b.\xd7]\xc7`n.\x18\x1c5\x092\x98K\x9d\x1a$\xf4\xd4\x0f\x86\x09i\x9a$\x82\x0d\xde\xe87\xd8\xca\x0c\x96\x8fE4\xa3A13\x87|g\x14\xea\x1b\xdcU2\x10U\xbe\x00\x00\x1e\xa0IDAT)\x92Z\xc3\x16U\xfa\x9b\xb26\x82\xae\xc1u\xaa\x8ce@\x9b\x04\x19\xcc\xa5NQ\x12S\x07+\xca\xd8\xb0\x80#s\x83\x0c\x1eJ]\x82\xab\x82\x91\xdctQt\x10\xa3F\xb2\xf4\x0d\xae\xa6\x01@b\xee\x1a1\x0a\x94\xb5\xd1g\x1a\x06\xe7\xe6\xe2\x8fv\xb8\xfcV\xc0\x8f\xa1\x06k\xa6NaF\xfa{\xea\xfbCn\x05\x9ed\xd8\xed\xc5]%\x16/._r\xec\xdb\xb6\xe5\xa0\x94\xfa\xde^{\x8d\xaf\xd9\xd2\xe3[\x96\xdbG\xce\xc9\xe5\xd4\xb7\xe6\xa5t\x10A\x0b\xdd\xdbf#{M'\x9fE\xc5MV#[\xb5\xa7\xb5$\xcc\xdf\x95\xe1\x08\xacM\x1c\xee\xf4z\xad%\xde\x0e\x9fzs\xb0\xc85\xad\xf3m0\x06G\x81\xa1\x06k\xa7Na\x99\xc8\xdc\xa6pKN\x02\xf4\xf6\xe2\x1e\x92\x20U&\x8a\xa7sm\xa9y\x1b\x10Z\x93\x86PS*\xb25\xb3\xf0Tr]\xc4\"\xb2\x95#5\x19V\xfb\xb2\xfaY\x96\\>\x8b\x8a\x9bl\xcc\xadvX\xd2r\xa3\x128\xb0\xb62\xb1+\x99\xf5\xe0Vo\x8ex\xb1\xccn\xcb\x9d\x94s%\xd3\x0eC\x0d\x06\x80\xb8\x03\x06\x03\xe6\x06\x0c\x06\xcc\x0d\x18\x0c\x98\x1b0\x1807`0`n\xc0`\xc0\xdc\x80\xc1\x80\xb9\x01\x83\x01s\x03\x06\x03\xe6\x06\x0c\x06\xcc\x0d\x18\x0c\x98\x1b\x13\x18\\\x88\xec\xcb\xe1\x961@\x07\x13\x18\xdc\xef\xad\xcf\xb4\x1b\xfe\x17?\x01\x93`\xb4\xc1\xa1\xa9SA\x01T\xdaK\xa1n\x11\x00\xb40\xd8`\x8d\xd4)u\x00\x956\x93\x94+\x02L\x03\x8c5X+uJ\x1d@\xa5\x0d\x18\x0c\xe8a\xa8\xc1\x9a\xa9S`00\x11\x0c5X3u*\x1a\x83{\xa2\xbb\xff\x0c\x98\x81\x18j\xb0\xa8\x95:\xc5\x07P\xe91l\xcf\xe9\xe8K@&\x0a0\xf5I\x90\xc1\\\xea\x147\xa9O\x1bBhQ\xb8\x06\xc0L%A\x06+\xa9S\xaaI=|\xf6\xf4\xda\xf6\xc8\xc5\x060\x03I\x94\xc1\x8c\x8eV\xad\xc9P:Q{\x98W\x81\x99L\x82\x0c\xe6R\xa7\xb8I]\xe0X\x04\xa0G\x82\x0c\xe6R\xa7\x82\x03\xa8\xb4\x00\x83\x01=\x0c5X3uJ\x1d@\xa5\x0d\x18\x0c\xe8a\xa8\xc1\xda\xa9S\xaa\x00*\x0d\x86\xfb\xbb\x0a\xad\x86G\xb3\x02&\xc1P\x83\xc7\xc7\x12\x84\xd2\xc3\xed\xe6\x013\x1a\x13\x18\xdc\xdf\x0d\xc7\xd1\x00]L`0\x00\x84\x01\x0c\x06\xcc\x0d\x18\x0c\x98\x1b0\x1807`0`n\xc0`\xc0\xdc\x80\xc1\x80\xb9\x01\x83\x01s\x03\x06\x03\xe6\x06\x0c\x06\xcc\x0d\x18\x0c\x98\x1b0\x1807F\x1b\x1c\x9a:\x85\xe9m\xabo\xee\x0a\xb3\x10\x00\xe8b\xb0\xc1\x1a\xa9S\xe2p\xbb\xbb\xf3L\x97\xfbL\xb8\xe5\x00@\x07c\x0d\xd6J\x9d\x12\xdb\xeb\xfa\x89\xda\x10\xb0\x0a\x8c\x07C\x0d\xd6L\x9d\xeaw\xd3;\xe4\x20^\x15\x18\x17\x86\x1a\xac\x99:\xd5Y\x17.w\x15\x00\xc2c\xa8\xc1\xa2V\xeaT\xab\xa7\xb75R\xea\x14\x00\xe8\x91\x20\x83\xb9\xa8\xa9f:\xd9\xd4\x0c#10\x1e\x12d0\x175\xe5\xa9\x8b\x9c:\x05\x00z$\xca`\x06\x89\x9a\xf2\xb2\xfb\x90\xbdp;20\x1e\x12d0\x175\xd5U?\xc2\xcd\x01\x80\xd8H\x90\xc1\\\xd4\xd4\x10=\x9a\xe6\x93\x0f\xb3\x01@l\x18j\xb0f\xea\x94\xd8U\xd7\xd5\xd7\xd3\xd8\x0a{r\xc0x0\xd4`\xed\xd4)\xf1Lk\xfd\xfe.\x10\x18\x18\x17\x86\x1a\x0c\x00q\x07\x0c\x06\xcc\x0d\x18\x0c\x98\x1b0\x1807`0`n\xc0`\xc0\xdc\x80\xc1\x80\xb9\x01\x83\x01s\x03\x06\x03\xe6\x06\x0c\x06\xcc\x0d\x18\x0c\x98\x1b0x*0\x12\xa9\x01\xa0\x0b\x18\x9cp\xfaK\xd2\xd0\x92H\x8d\x00=\xc0\xe0\x84\x93\x99\xe9n\x87\xbf76n\x8c68$uj\xb8\x91]r\xe9n\x8a\xb0\xe4$s\xbc\xe8X\xa4&\x93C\x0fj\x8b\xd4\x04\x08\x83\xc1\x06\x87\xa6N\xf9\xdc]d\xaa\xcb\x1d\xe6/\x83{\xbb\xf4_\x8b\x17\xc7\xf2\x8fDj\xa2A,[\xa6\xd3\xb6\x0buh\xce\x07\xa2\xc3X\x83\xb5R\xa7\xd8]\xcb\x8d\xe1~\x8ds\x0b\xc3\xbc\x18/\xaeDj\xa0E,[\xa6\xd3\x16\xfe\xea\xf9\xc40\xd4`\xcd\xd4)\x8ag\x7f\xb8{4f\xc7\xe0\x89\xb1\xc4\xb2e:m\xc1\xe0\x89\xf1g\x1b\x00\xc0\xccL`\x0c\x06\x80)\x00\x18\x0c\x98\x1b0\x1807`0`n\xc0`\xc0\xdc\x80\xc1\x80\xb9\x01\x83\x01s\x03\x06\x03\xe6\x06\x0c\x06\xcc\x0d\x18\x0c\x98\x1b0\x1807`0`n\xc0`\xc0\xdc\x80\xc1\x80\xb9\x01\x83\x01s\x03\x06\x03\xe6\x06\x0c\x06\xcc\x0d\x18\x0c\x98\x1b0\x1807`0`n\xc0`\xc0\xdc\x80\xc1\x80\xb9\x01\x83\x01s\x03\x06\x03\xe6\x06\x0c\x06\xcc\x0d\x18\x0c\x98\x1b0\x1807`0`n\xc0`\xc0\xdc\x80\xc1\x80\xb9\x01\x83\x01s\x03\x06\x03\xe6\x06\x0c\x06\xccMX\x83\xeb\x11O\x7f\xb8\xa6\x00\x90\x18\xc0`\xc0\xdc\x845x\xf4\x1aa.\xaa\xa6\xff\x8e\x86k\x0a\x00\x89!\x8a:8\x07\xd5DjbjJJ\xf8g\xcb\x90\xa8\xd7P\xcdU\xbb\x9b\xfd[\x9e~{\xa6\x9b}\xbc\xdbsli\x85C\xfa\xcb,B\xa3\xd1\xae\xe0Z\xa5\xc3\xe2\xa8\xbc\x86\xa7jr\"\xb5\x9d\xd1\x80\xc1]\xd6a\xfei\x94\x82I\xa3\xf3\x115\xf8j:*\xac\x9e\x8b\x0a\xc9\xf46\x94Q]\x92\x92\xea\xd3](z\x83G\xb3Pn\xf5|\x94uC\x92n\xa4\xd5Gj=\x93\x89\xc5\xe0F\x94\xc9&jP\x99\xd4\x84j\x86\x0aSSs\x18\xf4\x07^\x92zC\xbbg\x20F\x83;\x88\xba\xe4\xbbm\x1b5\x98\x1e^k#\xf3*\xd1\"\x89=\xc9\xd0\xee\x83#j\x83G}\xb2\xc1\xbeh\x07\xaeq0\xc8\x1c\xd9\x88\xe6W\x97\xa7\xa2.j\xb0XO\xd8\x80\xec\xa2t-\x13\x97\xa3\xcb\x93\xd3\xb1\xc2e\x852\xa4j\xe8\x1e\x95\x14\x83\xaf\xf5W\xa3\x9cQ\xe9**'u\xd5\xb2\xe02\xf8\xcc\xed\xb65\xd5\xcbRH\x9d\xe17\xd8\x97\x86\x96T\xceJ\xb5\x13\x83mi\x8bZ\xdd\xf6\xe4~\xf5\x1a\xae\xa6\xa7\xb6\x0ez\xec\x0eZ?xP\x87\x04\xe8\x10\x93\xc1\xa3\xa9D\xa8\xd14\xf2\xc5\xdb\x84r\xd9<+~\xe6@\xacT\xbd\x91\x8c\xe4\xdf\xdfh\x9ae[\xba\xa3g\x83=\x8f\xecNK\x9e\\[\xe6\xc6\x1b\xe43\xc0\xa0\xbb\xd7\xd6\xea\x8d\x99\xb6E#\xb4\xfd\xfe\x1c\xdb\xdc\xfdtJ\\\xe3\xb0/'U\x04\x81\x1aLjKR\xa0\xd4\xe2\xc7\xf6J\x94\xd2T\x9en/d\xeb\xf1\xf7;n\x9a\xa9\x1c7R\xf2$b\xf3\"eO\xeeFV\x0a\xfe\x1e/\xa7\xef]\xb3\xb4U\x0c\xaeD\xc8\x81\x7f\"\xfdhIj\xfa\xf2,d\x0fR8\x0f\x91\xba\xc9K\x0a\x02\xbf\xc1\x85\xa8\x0d\xaf!\x97\xfc\x18\x0ai\xa1\xd0\x15R\x03\x0d\xcf\xc2\xef\xd6\xc1\xba\x1aD\x1b$@\x87\x98\x0c\xc6\xbf\xd0J\xf2\xd3&\xdf\x96M\xfe\x9fj\x16\xea\xbc\x86PV\x0e\xc5B\x861JO*\xda\x98\x87\xecn\xba#]\x96\\\xd9\xd9\x94\x86\xc7\xa9\x1b\xbd\xbd\x99y\xbd\xbd\xbd\xf47cEYm\x1di\xcb\xc9d\x99u[\xe76+\xf9]\xfaR3=\x1d\x8b\x90\xda\xe0\x1b\xbd\xe9\xe5W\xa5\xab5\xa9\xbd7\x86\xdaR\xd0,w\xed,\xdb\x20\xdf\xef\xb8)\xa3\x1f\xb9\x1b\xc9\xb3\x88\xb7d\xb0\xf7\x1b\xbc\x8c\xecD\x8d\xdeN\xbft\xa4\x9c\x94\xd0O\x89bpWG\x8d\xcd\xd6+\x9dFh\xd9(\xd9\xcd]\xa2n\xd8Iwv\xaf\x92\xd9\xb2\xc1\xd7\x92\xe9'\xb8\x8f\x19L\xde\xe15\x94\xa7^h(\xcd\xba\xd1\xb3\xd1\xca\x14\x1eM\xce\x95\x00\x1db3\xf8\x0cJ\x1b\x95V\xd2\x1d\xe4&\xff^[\x0ej\x13\x91B\xa0\x10v\xac\xc1cW\x87TVN\xc60\x0f]\xb8\x8d\xb6W\xaa\x08\x07\xf9rN\x93\xc8\x87\xa2\xcb\xff8?\x03\xcb2:Wm0.+\xc8\xef\xbc\xac\x8c.6\x0b\x0f\xeb\xd7\xd2s\x83\xfa\x1d\x1fK\x10\xa9q\xb1\xc8\x96\xf9n\xba\x9b*\x1b\\C\xf7P\xfbQF\x0da6:#\x95-\x91ieK\xaa\xea\xe0^\\>\x9dA\x16\xd2\xd7\xe8\xac\xe4k\xeauHW{=\xd59d\x80\x97\x0d\xee\xa1\xb5\xb4$Y\xa8\xc1d}\xa3h\xbe\xa4ZC.):p\xb7\xecXpj\xe4\xe2l\xc6\x12\x9b\xc1R\x06\xea\x19\xb5\xa5\x90_T\x93\xfc[\x902Q\x17\x1e\x83Cw\xe8\x1dm\xf8wzC\xaa^)I+3F\x09\xe9T@\xce`r\xc0\xa8\x86\xb8ZFw\xe8\xa5\xac2<\x18QA\xb6\x05\x1b<\x82\x06q\x11C\x8f\xd6Y\xe9G\xa7\x19]S\xf7;>r\xd9\xd1\x81\xd1\xc6,\xfc\xe9\xcb\xea\xf3\x1b\xdc\x81\xe6\x92\xf9\xbd\x81\x0ff\x97zON\x0a2X\x9a\x8b\x86\x87\xe4\x83\x8d\xcb\xe5#6~\x86\x97\x93z\xa0\x843\xb8]^4\x9d\x1aL\xb5'\x06sk\xb8*\xab\xbb\x08\xd1\x83\xd5\x0e\xbb\x04\xe8\x10\xa3\xc15\xa8\xb2\x8b}K6\xc9\xdf{7,\xf8\x87\x1c8\x06\xd1\xa3\xecu9\xba\xa43\x16\x89\x1a\x9b4\x9f\x9e\x10\x90\x0as\xf17k/]O\xb0\xc1\xd2\x92j\xa9\xcbN;g;\x80=\xb8\xbaT\xf5;>\x98@\x04\xd1\xb3\x04\xd9o0\x83\x07mvjN\x1fZ\xa9\xbb$3\xf8\x86\x87\xed\x01,A\xfd\xa3\xc9l\xa4\\\x8eT\x85\xf0h&\xaa\xec\xc5%\x10gp\x97\xfc\xfd\x95\xaa6\x98cH\xae\xbc\xcb\xf1\xe0\x8f\xb19$@\x87\x18\x0d\xbe\x88\xd2+\x99\xadM\xc8r\x91\xfc\xdb\x8cf\x93/a:d\xe1\xafu\xab_\x08j\xb0\x95\x19\xbc&\xa3\x8fB_\xa3\x06{\x88\x20TEjp\x19\xfb\xddg\x94\xe1_4\xdd\x9f+\x0b1\xb8#m\x94\x15\x11\x92\x95\x0e\x82\xadx\x0cV\xf5;>\xca\xe9\x80\xe9\xab\xa6\xe5{!\xfeT\x10\x83\xaf\xa6\xa7\xb0Cs7,\xe9\xf4}5\xd6\x06\x17\x06\x01\x83-T\xaeQ\x87\xe5\x1a\xfeA\xd1\x02$#UU\x97\x9fa\xe7\xebz\xc9'^6Xd\xbe\xfa\x90\xae\xc1\xd7\x10\xfbV\x9a\x8fF\xe8\xabP\x07\xeb\x12\xa3\xc1\xf8[\xd7\xc6\x0eN6!4\x1bk\xd8i#\xc5\xeb\x90\x15\x95\xe1\xdf\xf1i;=\x93\xc4\xe0\x0c\xeeb\xd2o\xa3\xdf\x9dyyd\xb7\x86\xccP\x0c\xee\xa4\xa5l\x1b\xea\xc4+H\xc7\x1d\xf9n\x0f1x4\xad\xc3\xceN\xf9Y\xd3\xc8\xa9\xd6\x8c\x17?\xc9\x0d\x0c?C\xf6\xfa\x1bm\x96\xfe\x1b+\xf3F\xe8/\xb8\xbd\xa3\x8c\xedq\xd5X\xeb;\x16\xd9DrN\xae\xec\xb4\xd4Wf\xe9\xc5#\xd7\x9a\xe4\xea\xce\xead\xb2\xf34hK\xaf\xddfON\xf1\x90\xca\xba\xaf\x195\xca\xa7\xf0\xa4\xea\x0cVDHV\x94\xd3\xde\x9aI\x8fYq\xfd\x8e\xf3\x9c\xdcEvHe#\x9a\xb5ac\x16)q\xb1`5\xc8QS\xbd\x11\xd3A\xaez\xc8\xd9\xb8\xd2z\xbb\xffs\xc4!\x1b<\xec@y\x1bsP&\xf1p\x19\xca\xaa^\x82f]%\x9f\xbc\x1c\x7f\xbb\xd1\xd9h\x91\xbb\xda\x91\x99\x96\xc5\x1d\x0fNEK*3\xec\xc4O\x1d\x83\x87\xd3\xd0\"\xdc\x17;2\xd7\x08\xc7\x83\xf5\x89\xd5\xe0kVV\xa8\x92\xb3\xca\xfd\x8bl\xf6E\xf2\xc8\xe7+O\xb7\xd8\xe6\xd6\x05\x04\x1eMC\xa8-\x15\xd9\xdaY\x95\xda\x95g\xb7\xcfg\x07\xdaF+\xed\xb6\xbc3\xf4(*\xb2\x0c\xda\xf0#Q\xafy\xaemn3\xeb\xa9\xd0>\xab\xda\x93B\xe6\xdeH\xc5\xaf\xda\xe4\xd1\xcc\xe7\x1f\xdf\xad\x1b\xcbR\x1dk\xd81/\xa5\xdfq\x1a,e\xd1\xe1ut\xff\xdcT\xdb\\v\x85\x83X\xe6\xdf\xa3\xc2=^\xdd\x98nq,W\xef\x9a1\xfc{rbY\x9a%\xbd\x9an\xe4h}\xa6\xd5QN\x8c\xe4\x0c&\x07\xb8\xad\x99\xb57\x96\xe1\x82\x20pNn\xa80\xd5\xb6d\x88\x0c\xcb:\x06Kb\xb9\xc3\x92V\xc6.:Z\xa2\xaeK\x00\x9e(\x0cV\xe1c\xa7\xe5\xa8\xc1\xe1[\xc6\x9b\x1bV\xf9\xc3\x12\xe6T\xde8\xf0\xb0}\xa5x\xd3\x1dt|W\x0d\xdb\xdf\x15Qt\x07Q\xc4\x94m\x91\x9a\xcc`b5\xb8\xc6?\x20\x1bnp\xbb\\D\xc4\xd9\xe0\x09\x1d\x8b\xd3\xa7,\xec\x15\xa9v\xba\x83\xb81\xca\x03\xd9\xb5\xb6\x09\xec\xaaN{b2xh\xb8\xfdv\xab|\xa5\x9f\xb1\x06\xd7\xf6H\x8b\xfcN\xc4\xd7`\xc9\x9b\xa2\x7f=\xef\xb8\xb9X\x18\xf6Tw5\xca\xd8X\x9d\x1b|\x1eN\x87k\xf6h\xae\xcd\x9b\xb1\xc4d094\xef\xf7\xc8P\x83o\xa0\x9cJ\x07\xab\x87\xd9\x0e`\x86\x1b|\xe8\x14\x84\xa7?\xd9uw\xfe\xd6?I@\xd4\x847X\\\x83\xb2\xf0\x7f%b\x82b\xd0d\x83ie\x8a=\xa3\xb7\x87\x94\x90:\x9aOm\xa3\x06\xab\xa3\xdb4\x16\x09n\xb0HY\x81lp\xaf\x05\xa1\xd4e\xad|\xd1\xf4\xc1\x82\x87O\x9d}~\x85\xf0'il\xa0\xf4\xfb\x7f\x94\xfex\xb0`\xe0\xe6\xefO8\x85\xa2\x83\x87\x0b\xee'-\xce-\xae8|\xf6\xa0\xf0\xac\xa4\x823\xf8a\xd7\xd3\xaf?\xed\xda\x1b\xd4\x16\x1b\xfc\xf9.\xe1\xd9\x0f\xf1\xe4^\xa1\xe1\xf5\xa3E\xeb\xc7\xa4\xb1\x97N\x94\xae*(}l\xd7\x82p54\x10D\xa4*\xa2\xcb\x82,\xf4^\xe0\x84\xc4\xa0\xc9\x06\xd3k\xe9\x83\x0cVR\xdb\xa8\xc1\xea\xe86\x8dE4\x1b\xa8\x0c\x96\x06K\xc8\x9d\xd3)e\xca\x97\xc0\xd1\"2\x1c\x1e]J\x86\xd0\x83\x15\xf8\xe1a\xaa\xa2k)\x1eGw\x15\xe1\xa9\xb1\xd2\xad\xf8\xb5\xb1\x97\xaeK*\x14\x83\xcf\x0ag\xfd\x8f|[l\xf0\xb3\xae\xd7H\x83\xd7\xe8a\x89\x0f\xd9\xc1\x89\xf5\xc2\x96\x9b\xd2\xd8M\x09\x88\x9e\xf0\x06_\xdbhIG\x0ek\xf5\xd5\x04\xc5\xa0\x851XIm\xf3\x8f\xc1\\t\x9b\xc6\"\x9a\x0d\xd4\x06\xe3\xa9\x9emY\x88;\xba\xfcE\xf1\xdd\x0d\xcf\xffn\x8c\xd6\x00\x9f/\xf8\x9d4V@|\x94\\\x0f\xe3\x87\x83.\x89\xa8\xf9;I\x03\xc5\xe0\xbd\xeb\xe8?\xeb\xf6\xaa\xdbn?\xf8\xb4p\x8aN=x\xf7\xd8\x9f0\xa5\xf4\xa3\xb1\xde\x05\xc3o\xac\x847\xd8\x9d\xb6\x7f\x08\x0d5\xa7\xb9\x13\x14\x83\x16\xc6`.\xb5\x8d\xd6\xc1\xaa\xe86\xadE\xb4\x1a\xa8\x0c\xf6\xb1\x20\x8cF\x94\xa2\x941\xd7\x8f>\xb8VXq\x98*\xbc\xf51\xe9,\x1d\x8d%\x17\xd9\x0f\xa3\x06?+\x8cI\x1a(\x06\xdf\xbb\x9d\xfe\xb3\xbdJ\xddv{Q\xc1\xda\xfb\xe9\xd3\xf5\x02\x83\xd6$\xeb\xab$\x20F\"T\x11\xa3\xf4X\x04\xf9\x8d&$\x06-\x8c\xc1\\j\x1b5X\x15\xdd\xa6\xb5\x88V\x83\x80\xc1WIz\x03k<\x84\x92\x03\x06\x7f\xf88\xb6\xec\xfa\x89\xfc\xa3\xe4\xc9\xa9\x15c\xac\x88\xe0\x0c>+|(i\xc0\x0c\xbe\xf9\xf4ui\xef\xdd\xc4\xd3\xb1\xbb\x1fV\xb7\xdd^\xf4\xf1g\x05\xb4x\xdeu\xf7\x87\x14Z\x87\xac\xbf_\xa33\x20,\x91\xea`I\xb4\xb3\xdb\xeb\x0d\x8eAc\x841\x98Km\xa3\x06\xab\xa2\xdb\xb4\x16\xd1j\x20_\xfcfA\xed7F\xa5<\x94\x87[_[\xc6\x9d\xd28H\xabXi\xcb\xf7\xc9\xe3\xd8\x8aSK\xe9S\xce\xe0\x9b\xc5[\x88\xa1\x0d\x8f\xd1\xf9\x9f\x1d\xfe\x8c-\xc7\x0c\xfe@\x18\x90^\xa7\x05\xee\x09\xe1uu[r4\xed\xac\x93\x18}Vx\x89\xb4}\xf20y\\\xff\xa0\x04\xc4HD\x83e\x8c\x8eAc\x841\x98Kmc\xe7\xe4\xf8\xe86\xadE\xb4\x1a\xc8\x06\x93\xf2\xa5K\xf2\xd9\x91%3\xcb\x86\xd2\x94\xfc\x88\x83\xc2\xe2\x83\xaf\x9d\xda+\x9c\xa3\xcf\x1e\xbf{)\xd9\xb1\xfb\xd7\x01\xe7\xde\xf7\xc6>\xd8\xeb\x1c\xf8WI:\xe7Zw\xf4l\x83\xf0\x96K[!\xff\x13r\x04@\xd4Dip\xfc\x99X\x0c\x9a\xb1i\x1527]\xe7\"5\x01\x0c'a\x06O,\x06-!\x06\xbft'\x9c,\x9bz$\xc6\xe0\x09\xc7\xa0\x19o\xf0\xc1sc[\xe0b\x86)HB\x0c\x9ex\x0c\x9a\xe1\x06\x8f\x09\x15\x0d\xc5Ag\xde\x80\xa9@B\x0c\x9ex\x0c\x9a\xe1\x06K\x07\x17o\xf9$R\x1b\x20\x01$\xc6`\x00\x88\x17`0`n\xc0`\xc0\xdc\x80\xc1\x80\xb9\x01\x83\x01s\x03\x06\x03\xe6\x06\x0c\x06\xcc\x0d\x18\x0c\x98\x1b0\x1807\x86\x1b|\xaa\xea\x8f\x91\x9aL\"\xd7\xef=\x15\xa9IT\xd0w\x11\xaf\xce\x80\x8901\x83\x1b\x04v\x87\x81\x06\x9f9\x85\xb5\x1a\xb3\x0f\x0b\x075\xef,\xd3%\xe2*N9\xe5\xabq\x9dQ\xf84vX8\x1c23\xf6\x9c3\xf6.4;\x03\x0cf|\x06\x9f\x93\xef\xf8\xfa|\xc0\xa9w\xbd\xd6\xd8{{]\xa1s\x8fF\x1dy\x17\xf5*\x0e\x0b\xe4n\x88g\x07\x06\x16D\xa5\xd3\xeb\xce\xa3\xc1\xb3b\xce9\x0b\xbc\x0b\x8d\xce\x00\x83\x19\x9f\xc1U\x81\xfb\xb9\\\xfaW\x1c\x1e\x0c5\xf83\xe7\xe3\xfe\xc9\xeb[\xc2_\xe9\x15\xf5*\x9eu\x92Q\xf4=I\xca\x0f\x8a\x1d\xd1\xe1iWP\xc0\x8e\x14kJ\x14\xf7.\xb4:\x03\x0ce|\x06\xaf\x8fV\xaf\x20\xf6\x16\x07J\x88\x8f\x85\x8fC^\xe6\x89z\x15c\x9f\xc9\x06\x7f\x16]yr\xb38\xb4`\x88\xcd`\xee]hu\x06\x18J8\x83\xff\xb4\xc2\xf9O\xa5\xc5\xe7\x1a\x96n!)2\x81|\xafSr\xddI2l$\xd7c\x81\x081.!\xec\xf3]\xc5K\xef\x0f\xad\"\xc6\x0a\xe4\xc1\xeb\xe8\xaa\xd7>\x11>y}\xd5\xd18\xad\x82\x1a,\x05\x85\x9b\x1d\xdd[\xbct;\xbd\"2\xd0/\xe5\xe9\xfc\x10\xd5c\xc99S\xde\x05A\xa33\xc0P\xc2\x8e\xc1\xe7\x0a\x84\xc7\xb6\x08w\x1e^A\xbe\x9f\x03\xf9^7\x07\xe8=\xb5\x03T\x0e\x97\xb0\xf6\xc4\xa9\x154\xe6@I\x08\xfb\xa4`\xed\xf3\xa7\xb6\x0a!\x06\x93\xdb\xcf)\x9f\xef\x12\xd6\xe1\xff\xee\xff\"N\xab\x90\x0d\x0e\x0a7+=x\xb04\xffc\xbe_\xca\x80\xf0\xff\xa4\x20b\xc99S\xde\x05A\xa33\xc0P\xc2W\x11\xc5\xbb\xa4\xd7\x85S4-L\x9d\xef\xa5|\xc5\x17\xfd\x1b6\x84D\x88q\x09a\xf7\xae\"{\xea\xebC\x0c~]\xf8\x83\x7f\xf2\xacSp\xd2\xf0\x85\xb8\xacB6X\x1dnv7\x1e\xd6\xaf\x97V\x05\xf5\x8b?>B\xc8A\x8b\x18r\xceT\xefB\xb33\xc0P\"\x18|BzO\xb8)=\xfe`p\xbe\x97\xa2\x17yN+^%!\xec:\x8bOx:\xc4\xe0S\x82\x1c\x86p\xfd1g\xb1P\xecz\xec\xdf\xe2\xb4\x8a\x80\xc1|\xb8\x19\xfd\xae?*\\W\xf7K\xa4\x0b9<\x17C\xce\x19\xf7.\x08\x1a\x9d\x01\x86\x12\xc1\xe0\xb3\xd2\x87xW\x9f\xe8\xa5\xce\xf7R\xeffQ\xbd\x94\x84\xb0\x0f\xd9\xd7l\xe8\x9e\xdc{~\xd1\x0e\xaf8\xfa{\xe1\xf7GW\x1c\x8e\xd3*\x02\x06\x07\x87\x9b\xe1o\xf9\x0f\xd5\xfdJ\xfeeyb\xc89\xe3\xde\x05A\xa33\xc0P\"\x1b\xecbz\xa9\xf3\xbd\x88^\xcf\x93C\xa8\x8a^JB\xd8\xbf\x09\xf4(\xe9\xc3\xa1{r\x81\xc3\x0ac\xf4X\x04\x09\x85\x8c\xcb*\x14\x83\xb9p3\x9a\x04\xf5<\x1e\xdfU\xfd\xe2\xae\x9c7\xa5\x20b\xc89\xe3\xdf\x85\xa4\xd9\x19`(Q\x1b\xac\xca\xf7\"\xbf\xf1?\xd2\x19\x8a^\\BXU)\x96\xe5\x0f\xae\x10\x83\xa5\xfbW\x05\x86\xb5/\x96~\x11\xbfU(\x06s\xe1f+\xb0[7\xef\xde\x12\xd4\xaf4\xb664\x15'\x86\x9c3I\xf5.\xb4:\x03\x0c%\xac\xc1\xbf_\xfa\xec\xd8\x09\xe7\xc7c\xbb\xb6|\xce\xe5{I\xc4\xa7gOmY\xfc\x85:BLI\x08\xfb8\xbf\xf4\xe0\xd3K\x05\xe7\x89\xdf\x07u\xf8I\xc8i\xd8\xb8\xac\xe2\x83\xa3\xf2a\x02)\x10nF\x0eaT\xbc\xf4\xfc\xaa\xa5d\xaf\x8b\xef\x17\x17\x07\xca\xd0\xca\x88-\xe7L\xf5.B;\x03\x0c&\x9c\xc1c+\x04\xe1D\x81\xb0\xf8%VB\xfa\xf3\xbd\xc8+\x0dK\xf3\xef\xfd0(B\x8cK\x08\xfbd\xfb\xd2\xbb\x1f;\xe1\xa4\xc1b*\x9ev\xa9\xcb\xc6\xb8\xacb\x8c\xbc\x9a/\x7f\x9b\xff\xc1\x7f\x85\x83\xeb\xb1\xbd\x05\xc5\xbb\xfe\x95Ns\xfd\x0e\xe4?&\x05\x11c\xce\x19\xf7.4:\x03\x0cf|\xe7\xe4\xc6\xcdX\x83s\x92\xf7\xdd\x03\xe1f\xda\xa7\xf2^r\xee\x9dxt\x94\xff]\xc4\xa53`b\x18l\xb04\xf6l\xe9\xf5Hm&D\x20\xdcL\xd3\xe0\xeb\xc5\x87\x95\x03\x0c\xe3\x87\xbd\x8b8u\x06L\x08\xa3\x0d\x9e\\\xf8p\xb30\x97S\x00\xd3\x88ie0\x17n\xf69\xdd\x01\x8c\xd0\x1e\x98\x06L+\x83\xb9p3\xba\x03\x08q\xe83\x80\xe9e00\xf3\x00\x83\x01s\x03\x06\x03\xe6\x06\x0c\x06\xcc\x0d\x18\x0c\x98\x1b0\x1807`0`n\xc0`\xc0\xdc\x80\xc1\x80\xb91\xdc\xe0\xe9\x91\x9b\x16\x0b\x113\xd6\xe2\xf4#I\xc4{\x9b\x02L\xcc\xe0\x88\xa1f!L\xc5\xdc\xb4s\x0b\x84{\xc7HF\xc5\x82\xb3\x1a\x8b0>\xde\xba\xb8x\xd7\xb9b\x95j{\xe5K\x8a\xd5\x93\xc1D\xccX\x8b\xfeGr\xb6(\xdc[\x9c\xa11n\xe338\xeaP\xb3`\xa6dn\xda\xd8Y!\x7f@\xbayJ8\xabk\xd2\xd9\xc5U\xcf\x9fX/\x08*I?'+~/x2\x88\x88\x19k\xd1\xffH\xa4\xd7\x16k\x18\xec\xffAI34\xc6m|\x06G\x1dj\x16\xc4\x14\xcdM\xbb)\xec\xda\x8b7N\xd0\xbdi\xf3z\x01\xb9Q\xf9\xe6*!x\x98Un\xd0\xe3'9\"f\xacq\x0d\"\xa3\xf5\x09S~P33\xc6m|\x06G\x1dj\x16\xc4\x14\xcdM\xbb)\x9c]<\x16\xce\xe0\xc7\xf3\xe9\xddJ\xcf\xc6np\xc4\x8c5\xae\xc1\xf8X\xcf\x19<\x13c\xdc\x207M\"\x06\x7f\xb6\xfe\x145\xb8\x81$\x05\xd3\xfaZ\xb5e\xab\x1e\xa6\xed\xae?;&\xdd|\xb0\xd8Y\xba\xdd\xff\xcd\xade\xf0\xc0\xd6R\xe7\x8a\xed\xa5t%\x113\xd6\xfc\x0d\xf0\xf6>\x1fx\x9b\x01\x94\xcd\xc1+\xcf\x17\xe4\x18c\xae\xad\xea\x07%\xcd\xc8\x187\xc8M\x93\xa8\xc1G\xb7S\x83i\xd5\xcd\xeakn\xcb\xc6\x04\xa5@yM\xd8{\xee\xa5\xed\xfe[\x945\x0c\xfe`\xc1\xc3\xa7\xce>\xbfB\xa07;E\xccX\xf37\x20\xdb[t\xf0p\xc1\xfd\xaaW\xb9\xcd\xc1+\x18\x18`_G\\[\xd5\x0fJ\x9a\x911n\x90\x9b&Q\x83\xaf\xbb\xae\xb3*BI\xa7P\xb6\xec3n\x89\xb1\x97n\x92\x15\x07\xf2\x7fB\x0c>ZD\xdc=\xca\x82\x83\"f\xac)\x0d\\K\xf1\x98\xba\xab(\xe8ues\x08\xf9\x07C\xdb\xf2U\xc4L\x8cq\x83\xdc4\x89\x1a,m\x7f6\xc4\xe0\xc0\x96\x8d9\xb9\x9d\xc4\xebG\xb7\xde]\x20\xacgO4\x0c\xfe\xa2\xf8\xee\x86\xe7\x7f7\xc6\x06\xfc\x88\x19kJ\x03\xd7\xc3\x92\xc6\xbe\x83\x8e\xc1\\\xdb\x20\x83CW1\xcd\x89\x9c\xd9\xe3\x9ch\xa8\x99\xc2T\xcdM#\x06\x9f\xfaN\x88\xc1\xca\x96\xc9u\xf0\x18\xfeh|XT\xfa\xf8\xa9\x81-\xeb\xfd}\x85\xd6\xc1\xd7\x8f>\xb8VX\xc1nc\x8e\x98\xb1\xa64P\xbb\xeaG\xc7`n\xae\xca\xe0\x19\x18\xe3\x16\xd9`\xd7DC\xcd\x14\xa6jn\x1a1xl\xf1Y\xc5\xe0\xa7\xfd\x06\xcb[\xf6x>]\xf6%\xe1\x8f\xd2\xda*\xb2\x0d\xf7\xafgKj\x18\xfc\xe1\xe3\xb8\xc1\xf5\x13\xf9t\x03#f\xac)\x0d\xc2\x18\x1c\xf86\xd35\xf8y\xf9\xcf\x80\xcc\xc0\x18\xb7\xa8\x0d\x1e\x7f\xa8\x19\xc7\x14\xcdM#\x06K\x0f\xef\xa2\x06\xe7\xe3\xe2c\xac*\xc8`v\xd30X\xf9A\xe9\xadbz\x03\xb9i\xf4\x9c\xdc\xa9\x9b\xd2\xb9|j\xf0\xbdE\x87\x0fV\x91~U[v6\xff\xde\x13\xa7\xb6:\x07\x88\xa0\x0f\x1e=\xb8\x1eW\x09\xefI_\xc8'\x03\xf1G\x91\x9b<(,>\xf8\x1a^\x1b\x8b\x0e\x8a\x98\xb1&7P\xbdM\x8e\xc0\xe6Hc\xef\x0d\x0c\xb8\xf6\x0e\x0c\xdc\x0cj\xeb\xffA\x11fb\x8c\x1b\xe4\xa6\xd1\xeb\"\xf0\x186VE\xcf-|\xb2%\xbf`\xeb?\x09\xc2^\xf5\x96}\xbc5\x7f\xc5\xfd$\x11{\xec\xd9U\xae\xa2\x07\x9f_\xe5\xdc\"=,\xd7\xd7x\x90\xe6&O\xdc{\xb0\xd4Y\xbcE\xce\xbe\x8a\x9c\xb1\xc6\x1a\xa8\xde&\x87\x7fs\x1a\xa4\x0f\xe4U\x1c\x0dj\xeb\xffAI34\xc6m|\xe7\xe4\xc6\xcd\xf4\xc8M\x8b\x85\x88\x19k\xf1\xfb\x91\x18\xfe\xde\xa6\x04\x06\x1b\x83\xa3\x0e5\x0bb\x8a\xe6\xa6\xc5\xc5\xe0\x88\x09i\xc0\xa4\x00\xb9i\x12opP|Y\xc0`n\xc5\xd2g\xf7\xafp\x16m'-\xb0\xc1\xe4*N\x17\xf96\x89\x98\x90\x06L\x0e\x90\x9b&\xf1\x06\x07\xc5\x97\x05\x0cVV,\x9d[\\q\xf8\xecA\x9a\xa4\x86\x0d\xc6\xef\x84\xdd&\x1d1!\x0d\x98\x1c\x207MRW\x11\xaa\xf82\x7f\xbf\xdc\x8a\xc7J\xb7\x925\xbfD\xc6]l\xf0\xb3\xae\xd7X\xd3\x88\x09i\xc0\xe4\x00\xb9iR\x90\xc1\x0fK\xa1iV\xca\x8a\xb1\xc6\xbf\x0b,\xb7\xfd\xe0\xd3\x01U#&\xa4\x01\x93C\xe4\xcc\x1e\xe7DC\xcd\x14\xa6jn\x1a\xd1\x9c$\xf7\x1c\x95\xf8\xb5IJ\xbf\xca\x8a\xa5g\x05\xa5\xc4\xdd^T\xb0\xf6~\xf9i\xc4\x844`r\x88l\xb0k\xa2\xa1f\x0aS57m\x80F\xdd\xb0JV\xd3`e\xc5x\x0c\xfe0\xb0\xdc\xf6\xa2\x8f?+\x90\x8f\xe1ELH\x03&\x87\xa8\x0d\x1e\x7f\xa8\x19\xc7T\xcdM[J\xa4\xdf\xbb\x94h\xa7i0\xb7\xe2\x9b\xc5[\xc8{h\x20\x9f\x0fr4\xed\xacS6:bB\x1a0)@n\x1a\xe1\x84\xd0p\xf6\xfb\xe4u~m\\\x16\x1a\xb7b\xe9\x9ck\xdd\xd1\xb3\x0d\xb8\x0e\xbf>P\x85\xdb\xde\xdc^|\x8e^\xe9\x111!\x0d\x98\x14\x207\x8d5\xa8Z\\E^\xe7\xd7\xc6e\xa1\xf1+\x96\xfe\xf0`iA\xd5)z]\x84\x20|p\x02?\x0a\x09\x0a\x09\x09\xe2\x96\xb9\x20Internal\x20call\x20graph

    \x0a\x09
    \x0a\x09\x0a\x09\x09\xe2\x96\xbe\x20Internal\x20call\x20graph

    \x0a\x09\x09

    \x0a\x09\x09\x20\x20This\x20viewer\x20shows\x20the\x20portion\x20of\x20the\x20internal\x20call\x0a\x09\x09\x20\x20graph\x20of\x20this\x20package\x20that\x20is\x20reachable\x20from\x20this\x20function.\x0a\x09\x09\x20\x20See\x20the\x20package's\x20call\x0a\x09\x09\x20\x20graph\x20for\x20more\x20information.\x0a\x09\x09

    \x0a\x09\x09
\x0a\x09\x0a\x0a", - - "codewalk.html": "\x0a\x0a@import\x20\"/doc/codewalk/codewalk.css\";\x0a\x0a\x0a\x0a\x20\x20\x0a\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{range\x20.File}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{html\x20.}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{end}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20code\x20on\x20left\x20•\x20right\x0a\x20\x20\x20\x20\x20\x20code\x20width\x2070%\x0a\x20\x20\x20\x20\x20\x20filepaths\x20shown\x20•\x20hidden\x0a\x20\x20\x20\x20\x0a\x20\x20\x0a\x20\x20\x0a\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20{{range\x20.Step}}\x0a\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20{{html\x20.Title}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x09{{with\x20.Err}}\x0a\x09ERROR\x20LOADING\x20FILE:\x20{{html\x20.}}

\x0a\x09{{end}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20{{.XML}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20{{html\x20.}}\x0a\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20{{end}}\x0a\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20previous\x20step\x0a\x20\x20\x20\x20\x20\x20•\x0a\x20\x20\x20\x20\x20\x20next\x20step\x0a\x20\x20\x20\x20\x0a\x20\x20\x0a\x0a", - - "codewalkdir.html": "\x0a\x0a\x0a{{range\x20.}}\x0a\x0a\x09{{$name_html\x20:=\x20html\x20.Name}}\x0a\x09{{$name_html}}\x0a\x09 \x0a\x09{{html\x20.Title}}\x0a\x0a{{end}}\x0a\x0a", - - "dirlist.html": "\x0a\x0a

\x0a\x0a\x0a\x09File\x0a\x09 \x0a\x09Bytes\x0a\x09 \x0a\x09Modified\x0a\x0a\x0a\x09..\x0a\x0a{{range\x20.}}\x0a\x0a\x09{{$name_html\x20:=\x20fileInfoName\x20.\x20|\x20html}}\x0a\x09{{$name_html}}\x0a\x09\x0a\x09{{html\x20.Size}}\x0a\x09\x0a\x09{{fileInfoTime\x20.\x20|\x20html}}\x0a\x0a{{end}}\x0a\x0a\x0a

\x0a", - - "error.html": "\x0a\x0a

\x0a{{html\x20.}}\x0a

\x0a", - - "example.html": "\x0a\x09\x0a\x09\x09\xe2\x96\xb9\x20Example{{example_suffix\x20.Name}}

\x0a\x09\x0a\x09\x0a\x09\x09\xe2\x96\xbe\x20Example{{example_suffix\x20.Name}}

\x0a\x09\x09{{with\x20.Doc}}

{{html\x20.}}

{{end}}\x0a\x09\x09{{$output\x20:=\x20.Output}}\x0a\x09\x09{{with\x20.Play}}\x0a\x09\x09\x09\x0a\x09\x09\x09\x09{{html\x20.}}\x0a\x09\x09\x09\x09
{{html\x20$output}}
\x0a\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09Run\x0a\x09\x09\x09\x09\x09Format\x0a\x09\x09\x09\x09\x09{{if\x20not\x20$.GoogleCN}}\x0a\x09\x09\x09\x09\x09Share\x0a\x09\x09\x09\x09\x09{{end}}\x0a\x09\x09\x09\x09\x0a\x09\x09\x09\x0a\x09\x09{{else}}\x0a\x09\x09\x09

Code:

\x0a\x09\x09\x09{{.Code}}\x0a\x09\x09\x09{{with\x20.Output}}\x0a\x09\x09\x09

Output:

\x0a\x09\x09\x09{{html\x20.}}\x0a\x09\x09\x09{{end}}\x0a\x09\x09{{end}}\x0a\x09\x0a\x0a", - - "godoc.html": "\x0a\x0a\x0a\x0a\x0a\x0a{{with\x20.Tabtitle}}\x0a\x20\x20{{html\x20.}}\x20-\x20The\x20Go\x20Programming\x20Language\x0a{{else}}\x0a\x20\x20The\x20Go\x20Programming\x20Language\x0a{{end}}\x0a\x0a{{if\x20.SearchBox}}\x0a\x0a{{end}}\x0a{{if\x20.TreeView}}\x0a\x0a{{end}}\x0a\x0a{{with\x20.GoogleAnalytics}}\x0a\x0avar\x20_gaq\x20=\x20_gaq\x20||\x20[];\x0a_gaq.push([\"_setAccount\",\x20\"{{.}}\"]);\x0awindow.trackPageview\x20=\x20function()\x20{\x0a\x20\x20_gaq.push([\"_trackPageview\",\x20location.pathname+location.hash]);\x0a};\x0awindow.trackPageview();\x0awindow.trackEvent\x20=\x20function(category,\x20action,\x20opt_label,\x20opt_value,\x20opt_noninteraction)\x20{\x0a\x20\x20_gaq.push([\"_trackEvent\",\x20category,\x20action,\x20opt_label,\x20opt_value,\x20opt_noninteraction]);\x0a};\x0a\x0a{{end}}\x0a\x0a{{if\x20.TreeView}}\x0a\x0a\x0a{{end}}\x0a\x0a{{if\x20.Playground}}\x0a\x0a{{end}}\x0a{{with\x20.Version}}{{end}}\x0a\x0a\x0a\x0a\x0a\x0a...\x0a\x0a\x0a\x0aThe\x20Go\x20Programming\x20Language\x0aGo\x0a▽\x0a\x0a\x0aDocuments\x0aPackages\x0aThe\x20Project\x0aHelp\x0a{{if\x20not\x20.GoogleCN}}\x0aBlog\x0a{{end}}\x0a{{if\x20(and\x20.Playground\x20.Title)}}\x0aPlay\x0a{{end}}\x0asubmit\x20search\x0a\x0a\x0a\x0a\x0a\x0a{{if\x20.Playground}}\x0a\x0a\x09package\x20main\x0a\x0aimport\x20\"fmt\"\x0a\x0afunc\x20main()\x20{\x0a\x09fmt.Println(\"Hello,\x20\xe4\xb8\x96\xe7\x95\x8c\")\x0a}\x0a\x09\x0a\x09\x0a\x09\x09Run\x0a\x09\x09Format\x0a\x09\x09{{if\x20not\x20$.GoogleCN}}\x0a\x09\x09Share\x0a\x09\x09{{end}}\x0a\x09\x0a\x0a{{end}}\x0a\x0a\x0a\x0a\x0a{{if\x20or\x20.Title\x20.SrcPath}}\x0a\x20\x20

\x0a\x20\x20\x20\x20{{html\x20.Title}}\x0a\x20\x20\x20\x20{{html\x20.SrcPath\x20|\x20srcBreadcrumb}}\x0a\x20\x20

\x0a{{end}}\x0a\x0a{{with\x20.Subtitle}}\x0a\x20\x20

{{html\x20.}}

\x0a{{end}}\x0a\x0a{{with\x20.SrcPath}}\x0a\x20\x20

\x0a\x20\x20\x20\x20Documentation:\x20{{html\x20.\x20|\x20srcToPkgLink}}\x0a\x20\x20

\x0a{{end}}\x0a\x0a{{/*\x20The\x20Table\x20of\x20Contents\x20is\x20automatically\x20inserted\x20in\x20this\x20
.\x0a\x20\x20\x20\x20\x20Do\x20not\x20delete\x20this\x20
.\x20*/}}\x0a
\x0a\x0a{{/*\x20Body\x20is\x20HTML-escaped\x20elsewhere\x20*/}}\x0a{{printf\x20\"%s\"\x20.Body}}\x0a\x0a\x0aBuild\x20version\x20{{html\x20.Version}}.
\x0aExcept\x20as\x20noted,\x0athe\x20content\x20of\x20this\x20page\x20is\x20licensed\x20under\x20the\x0aCreative\x20Commons\x20Attribution\x203.0\x20License,\x0aand\x20code\x20is\x20licensed\x20under\x20a\x20BSD\x20license.
\x0aTerms\x20of\x20Service\x20|\x0aPrivacy\x20Policy\x0a
\x0a\x0a\x0a\x0a{{if\x20.GoogleAnalytics}}\x0a\x0a(function()\x20{\x0a\x20\x20var\x20ga\x20=\x20document.createElement(\"script\");\x20ga.type\x20=\x20\"text/javascript\";\x20ga.async\x20=\x20true;\x0a\x20\x20ga.src\x20=\x20(\"https:\"\x20==\x20document.location.protocol\x20?\x20\"https://ssl\"\x20:\x20\"http://www\")\x20+\x20\".google-analytics.com/ga.js\";\x0a\x20\x20var\x20s\x20=\x20document.getElementsByTagName(\"script\")[0];\x20s.parentNode.insertBefore(ga,\x20s);\x0a})();\x0a\x0a{{end}}\x0a\x0a\x0a\x0a", - - "godocs.js": "//\x20Copyright\x202012\x20The\x20Go\x20Authors.\x20All\x20rights\x20reserved.\x0a//\x20Use\x20of\x20this\x20source\x20code\x20is\x20governed\x20by\x20a\x20BSD-style\x0a//\x20license\x20that\x20can\x20be\x20found\x20in\x20the\x20LICENSE\x20file.\x0a\x0a/*\x20A\x20little\x20code\x20to\x20ease\x20navigation\x20of\x20these\x20documents.\x0a\x20*\x0a\x20*\x20On\x20window\x20load\x20we:\x0a\x20*\x20\x20+\x20Generate\x20a\x20table\x20of\x20contents\x20(generateTOC)\x0a\x20*\x20\x20+\x20Bind\x20foldable\x20sections\x20(bindToggles)\x0a\x20*\x20\x20+\x20Bind\x20links\x20to\x20foldable\x20sections\x20(bindToggleLinks)\x0a\x20*/\x0a\x0a(function()\x20{\x0a'use\x20strict';\x0a\x0a//\x20Mobile-friendly\x20topbar\x20menu\x0a$(function()\x20{\x0a\x20\x20var\x20menu\x20=\x20$('#menu');\x0a\x20\x20var\x20menuButton\x20=\x20$('#menu-button');\x0a\x20\x20var\x20menuButtonArrow\x20=\x20$('#menu-button-arrow');\x0a\x20\x20menuButton.click(function(event)\x20{\x0a\x20\x20\x20\x20menu.toggleClass('menu-visible');\x0a\x20\x20\x20\x20menuButtonArrow.toggleClass('vertical-flip');\x0a\x20\x20\x20\x20event.preventDefault();\x0a\x20\x20\x20\x20return\x20false;\x0a\x20\x20});\x0a});\x0a\x0a/*\x20Generates\x20a\x20table\x20of\x20contents:\x20looks\x20for\x20h2\x20and\x20h3\x20elements\x20and\x20generates\x0a\x20*\x20links.\x20\"Decorates\"\x20the\x20element\x20with\x20id==\"nav\"\x20with\x20this\x20table\x20of\x20contents.\x0a\x20*/\x0afunction\x20generateTOC()\x20{\x0a\x20\x20if\x20($('#manual-nav').length\x20>\x200)\x20{\x0a\x20\x20\x20\x20return;\x0a\x20\x20}\x0a\x0a\x20\x20//\x20For\x20search,\x20we\x20send\x20the\x20toc\x20precomputed\x20from\x20server-side.\x0a\x20\x20//\x20TODO:\x20Ideally,\x20this\x20should\x20always\x20be\x20precomputed\x20for\x20all\x20pages,\x20but\x20then\x0a\x20\x20//\x20we\x20need\x20to\x20do\x20HTML\x20parsing\x20on\x20the\x20server-side.\x0a\x20\x20if\x20(location.pathname\x20===\x20'/search')\x20{\x0a\x20\x20\x20\x20return;\x0a\x20\x20}\x0a\x0a\x20\x20var\x20nav\x20=\x20$('#nav');\x0a\x20\x20if\x20(nav.length\x20===\x200)\x20{\x0a\x20\x20\x20\x20return;\x0a\x20\x20}\x0a\x0a\x20\x20var\x20toc_items\x20=\x20[];\x0a\x20\x20$(nav).nextAll('h2,\x20h3').each(function()\x20{\x0a\x20\x20\x20\x20var\x20node\x20=\x20this;\x0a\x20\x20\x20\x20if\x20(node.id\x20==\x20'')\x0a\x20\x20\x20\x20\x20\x20node.id\x20=\x20'tmp_'\x20+\x20toc_items.length;\x0a\x20\x20\x20\x20var\x20link\x20=\x20$('').attr('href',\x20'#'\x20+\x20node.id).text($(node).text());\x0a\x20\x20\x20\x20var\x20item;\x0a\x20\x20\x20\x20if\x20($(node).is('h2'))\x20{\x0a\x20\x20\x20\x20\x20\x20item\x20=\x20$('
');\x0a\x20\x20\x20\x20}\x20else\x20{\x20//\x20h3\x0a\x20\x20\x20\x20\x20\x20item\x20=\x20$('');\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20item.append(link);\x0a\x20\x20\x20\x20toc_items.push(item);\x0a\x20\x20});\x0a\x20\x20if\x20(toc_items.length\x20<=\x201)\x20{\x0a\x20\x20\x20\x20return;\x0a\x20\x20}\x0a\x20\x20var\x20dl1\x20=\x20$('
');\x0a\x20\x20var\x20dl2\x20=\x20$('
');\x0a\x0a\x20\x20var\x20split_index\x20=\x20(toc_items.length\x20/\x202)\x20+\x201;\x0a\x20\x20if\x20(split_index\x20<\x208)\x20{\x0a\x20\x20\x20\x20split_index\x20=\x20toc_items.length;\x0a\x20\x20}\x0a\x20\x20for\x20(var\x20i\x20=\x200;\x20i\x20<\x20split_index;\x20i++)\x20{\x0a\x20\x20\x20\x20dl1.append(toc_items[i]);\x0a\x20\x20}\x0a\x20\x20for\x20(/*\x20keep\x20using\x20i\x20*/;\x20i\x20<\x20toc_items.length;\x20i++)\x20{\x0a\x20\x20\x20\x20dl2.append(toc_items[i]);\x0a\x20\x20}\x0a\x0a\x20\x20var\x20tocTable\x20=\x20$('').appendTo(nav);\x0a\x20\x20var\x20tocBody\x20=\x20$('').appendTo(tocTable);\x0a\x20\x20var\x20tocRow\x20=\x20$('').appendTo(tocBody);\x0a\x0a\x20\x20//\x201st\x20column\x0a\x20\x20$('').appendTo(tocRow).append(dl1);\x0a\x20\x20//\x202nd\x20column\x0a\x20\x20$('').appendTo(tocRow).append(dl2);\x0a}\x0a\x0afunction\x20bindToggle(el)\x20{\x0a\x20\x20$('.toggleButton',\x20el).click(function()\x20{\x0a\x20\x20\x20\x20if\x20($(this).closest(\".toggle,\x20.toggleVisible\")[0]\x20!=\x20el)\x20{\x0a\x20\x20\x20\x20\x20\x20//\x20Only\x20trigger\x20the\x20closest\x20toggle\x20header.\x0a\x20\x20\x20\x20\x20\x20return;\x0a\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20if\x20($(el).is('.toggle'))\x20{\x0a\x20\x20\x20\x20\x20\x20$(el).addClass('toggleVisible').removeClass('toggle');\x0a\x20\x20\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20\x20\x20$(el).addClass('toggle').removeClass('toggleVisible');\x0a\x20\x20\x20\x20}\x0a\x20\x20});\x0a}\x0a\x0afunction\x20bindToggles(selector)\x20{\x0a\x20\x20$(selector).each(function(i,\x20el)\x20{\x0a\x20\x20\x20\x20bindToggle(el);\x0a\x20\x20});\x0a}\x0a\x0afunction\x20bindToggleLink(el,\x20prefix)\x20{\x0a\x20\x20$(el).click(function()\x20{\x0a\x20\x20\x20\x20var\x20href\x20=\x20$(el).attr('href');\x0a\x20\x20\x20\x20var\x20i\x20=\x20href.indexOf('#'+prefix);\x0a\x20\x20\x20\x20if\x20(i\x20<\x200)\x20{\x0a\x20\x20\x20\x20\x20\x20return;\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20var\x20id\x20=\x20'#'\x20+\x20prefix\x20+\x20href.slice(i+1+prefix.length);\x0a\x20\x20\x20\x20if\x20($(id).is('.toggle'))\x20{\x0a\x20\x20\x20\x20\x20\x20$(id).find('.toggleButton').first().click();\x0a\x20\x20\x20\x20}\x0a\x20\x20});\x0a}\x0afunction\x20bindToggleLinks(selector,\x20prefix)\x20{\x0a\x20\x20$(selector).each(function(i,\x20el)\x20{\x0a\x20\x20\x20\x20bindToggleLink(el,\x20prefix);\x0a\x20\x20});\x0a}\x0a\x0afunction\x20setupDropdownPlayground()\x20{\x0a\x20\x20if\x20(!$('#page').is('.wide'))\x20{\x0a\x20\x20\x20\x20return;\x20//\x20don't\x20show\x20on\x20front\x20page\x0a\x20\x20}\x0a\x20\x20var\x20button\x20=\x20$('#playgroundButton');\x0a\x20\x20var\x20div\x20=\x20$('#playground');\x0a\x20\x20var\x20setup\x20=\x20false;\x0a\x20\x20button.toggle(function()\x20{\x0a\x20\x20\x20\x20button.addClass('active');\x0a\x20\x20\x20\x20div.show();\x0a\x20\x20\x20\x20if\x20(setup)\x20{\x0a\x20\x20\x20\x20\x20\x20return;\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20setup\x20=\x20true;\x0a\x20\x20\x20\x20playground({\x0a\x20\x20\x20\x20\x20\x20'codeEl':\x20$('.code',\x20div),\x0a\x20\x20\x20\x20\x20\x20'outputEl':\x20$('.output',\x20div),\x0a\x20\x20\x20\x20\x20\x20'runEl':\x20$('.run',\x20div),\x0a\x20\x20\x20\x20\x20\x20'fmtEl':\x20$('.fmt',\x20div),\x0a\x20\x20\x20\x20\x20\x20'shareEl':\x20$('.share',\x20div),\x0a\x20\x20\x20\x20\x20\x20'shareRedirect':\x20'//play.golang.org/p/'\x0a\x20\x20\x20\x20});\x0a\x20\x20},\x0a\x20\x20function()\x20{\x0a\x20\x20\x20\x20button.removeClass('active');\x0a\x20\x20\x20\x20div.hide();\x0a\x20\x20});\x0a\x20\x20$('#menu').css('min-width',\x20'+=60');\x0a\x0a\x20\x20//\x20Hide\x20inline\x20playground\x20if\x20we\x20click\x20somewhere\x20on\x20the\x20page.\x0a\x20\x20//\x20This\x20is\x20needed\x20in\x20mobile\x20devices,\x20where\x20the\x20\"Play\"\x20button\x0a\x20\x20//\x20is\x20not\x20clickable\x20once\x20the\x20playground\x20opens\x20up.\x0a\x20\x20$(\"#page\").click(function()\x20{\x0a\x20\x20\x20\x20if\x20(button.hasClass('active'))\x20{\x0a\x20\x20\x20\x20\x20\x20button.click();\x0a\x20\x20\x20\x20}\x0a\x20\x20});\x0a}\x0a\x0afunction\x20setupInlinePlayground()\x20{\x0a\x09'use\x20strict';\x0a\x09//\x20Set\x20up\x20playground\x20when\x20each\x20element\x20is\x20toggled.\x0a\x09$('div.play').each(function\x20(i,\x20el)\x20{\x0a\x09\x09//\x20Set\x20up\x20playground\x20for\x20this\x20example.\x0a\x09\x09var\x20setup\x20=\x20function()\x20{\x0a\x09\x09\x09var\x20code\x20=\x20$('.code',\x20el);\x0a\x09\x09\x09playground({\x0a\x09\x09\x09\x09'codeEl':\x20\x20\x20code,\x0a\x09\x09\x09\x09'outputEl':\x20$('.output',\x20el),\x0a\x09\x09\x09\x09'runEl':\x20\x20\x20\x20$('.run',\x20el),\x0a\x09\x09\x09\x09'fmtEl':\x20\x20\x20\x20$('.fmt',\x20el),\x0a\x09\x09\x09\x09'shareEl':\x20\x20$('.share',\x20el),\x0a\x09\x09\x09\x09'shareRedirect':\x20'//play.golang.org/p/'\x0a\x09\x09\x09});\x0a\x0a\x09\x09\x09//\x20Make\x20the\x20code\x20textarea\x20resize\x20to\x20fit\x20content.\x0a\x09\x09\x09var\x20resize\x20=\x20function()\x20{\x0a\x09\x09\x09\x09code.height(0);\x0a\x09\x09\x09\x09var\x20h\x20=\x20code[0].scrollHeight;\x0a\x09\x09\x09\x09code.height(h+20);\x20//\x20minimize\x20bouncing.\x0a\x09\x09\x09\x09code.closest('.input').height(h);\x0a\x09\x09\x09};\x0a\x09\x09\x09code.on('keydown',\x20resize);\x0a\x09\x09\x09code.on('keyup',\x20resize);\x0a\x09\x09\x09code.keyup();\x20//\x20resize\x20now.\x0a\x09\x09};\x0a\x0a\x09\x09//\x20If\x20example\x20already\x20visible,\x20set\x20up\x20playground\x20now.\x0a\x09\x09if\x20($(el).is(':visible'))\x20{\x0a\x09\x09\x09setup();\x0a\x09\x09\x09return;\x0a\x09\x09}\x0a\x0a\x09\x09//\x20Otherwise,\x20set\x20up\x20playground\x20when\x20example\x20is\x20expanded.\x0a\x09\x09var\x20built\x20=\x20false;\x0a\x09\x09$(el).closest('.toggle').click(function()\x20{\x0a\x09\x09\x09//\x20Only\x20set\x20up\x20once.\x0a\x09\x09\x09if\x20(!built)\x20{\x0a\x09\x09\x09\x09setup();\x0a\x09\x09\x09\x09built\x20=\x20true;\x0a\x09\x09\x09}\x0a\x09\x09});\x0a\x09});\x0a}\x0a\x0a//\x20fixFocus\x20tries\x20to\x20put\x20focus\x20to\x20div#page\x20so\x20that\x20keyboard\x20navigation\x20works.\x0afunction\x20fixFocus()\x20{\x0a\x20\x20var\x20page\x20=\x20$('div#page');\x0a\x20\x20var\x20topbar\x20=\x20$('div#topbar');\x0a\x20\x20page.css('outline',\x200);\x20//\x20disable\x20outline\x20when\x20focused\x0a\x20\x20page.attr('tabindex',\x20-1);\x20//\x20and\x20set\x20tabindex\x20so\x20that\x20it\x20is\x20focusable\x0a\x20\x20$(window).resize(function\x20(evt)\x20{\x0a\x20\x20\x20\x20//\x20only\x20focus\x20page\x20when\x20the\x20topbar\x20is\x20at\x20fixed\x20position\x20(that\x20is,\x20it's\x20in\x0a\x20\x20\x20\x20//\x20front\x20of\x20page,\x20and\x20keyboard\x20event\x20will\x20go\x20to\x20the\x20former\x20by\x20default.)\x0a\x20\x20\x20\x20//\x20by\x20focusing\x20page,\x20keyboard\x20event\x20will\x20go\x20to\x20page\x20so\x20that\x20up/down\x20arrow,\x0a\x20\x20\x20\x20//\x20space,\x20etc.\x20will\x20work\x20as\x20expected.\x0a\x20\x20\x20\x20if\x20(topbar.css('position')\x20==\x20\"fixed\")\x0a\x20\x20\x20\x20\x20\x20page.focus();\x0a\x20\x20}).resize();\x0a}\x0a\x0afunction\x20toggleHash()\x20{\x0a\x20\x20var\x20id\x20=\x20window.location.hash.substring(1);\x0a\x20\x20//\x20Open\x20all\x20of\x20the\x20toggles\x20for\x20a\x20particular\x20hash.\x0a\x20\x20var\x20els\x20=\x20$(\x0a\x20\x20\x20\x20document.getElementById(id),\x0a\x20\x20\x20\x20$('a[name]').filter(function()\x20{\x0a\x20\x20\x20\x20\x20\x20return\x20$(this).attr('name')\x20==\x20id;\x0a\x20\x20\x20\x20})\x0a\x20\x20);\x0a\x0a\x20\x20while\x20(els.length)\x20{\x0a\x20\x20\x20\x20for\x20(var\x20i\x20=\x200;\x20i\x20<\x20els.length;\x20i++)\x20{\x0a\x20\x20\x20\x20\x20\x20var\x20el\x20=\x20$(els[i]);\x0a\x20\x20\x20\x20\x20\x20if\x20(el.is('.toggle'))\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20el.find('.toggleButton').first().click();\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20els\x20=\x20el.parent();\x0a\x20\x20}\x0a}\x0a\x0afunction\x20personalizeInstallInstructions()\x20{\x0a\x20\x20var\x20prefix\x20=\x20'?download=';\x0a\x20\x20var\x20s\x20=\x20window.location.search;\x0a\x20\x20if\x20(s.indexOf(prefix)\x20!=\x200)\x20{\x0a\x20\x20\x20\x20//\x20No\x20'download'\x20query\x20string;\x20detect\x20\"test\"\x20instructions\x20from\x20User\x20Agent.\x0a\x20\x20\x20\x20if\x20(navigator.platform.indexOf('Win')\x20!=\x20-1)\x20{\x0a\x20\x20\x20\x20\x20\x20$('.testUnix').hide();\x0a\x20\x20\x20\x20\x20\x20$('.testWindows').show();\x0a\x20\x20\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20\x20\x20$('.testUnix').show();\x0a\x20\x20\x20\x20\x20\x20$('.testWindows').hide();\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20return;\x0a\x20\x20}\x0a\x0a\x20\x20var\x20filename\x20=\x20s.substr(prefix.length);\x0a\x20\x20var\x20filenameRE\x20=\x20/^go1\\.\\d+(\\.\\d+)?([a-z0-9]+)?\\.([a-z0-9]+)(-[a-z0-9]+)?(-osx10\\.[68])?\\.([a-z.]+)$/;\x0a\x20\x20var\x20m\x20=\x20filenameRE.exec(filename);\x0a\x20\x20if\x20(!m)\x20{\x0a\x20\x20\x20\x20//\x20Can't\x20interpret\x20file\x20name;\x20bail.\x0a\x20\x20\x20\x20return;\x0a\x20\x20}\x0a\x20\x20$('.downloadFilename').text(filename);\x0a\x20\x20$('.hideFromDownload').hide();\x0a\x0a\x20\x20var\x20os\x20=\x20m[3];\x0a\x20\x20var\x20ext\x20=\x20m[6];\x0a\x20\x20if\x20(ext\x20!=\x20'tar.gz')\x20{\x0a\x20\x20\x20\x20$('#tarballInstructions').hide();\x0a\x20\x20}\x0a\x20\x20if\x20(os\x20!=\x20'darwin'\x20||\x20ext\x20!=\x20'pkg')\x20{\x0a\x20\x20\x20\x20$('#darwinPackageInstructions').hide();\x0a\x20\x20}\x0a\x20\x20if\x20(os\x20!=\x20'windows')\x20{\x0a\x20\x20\x20\x20$('#windowsInstructions').hide();\x0a\x20\x20\x20\x20$('.testUnix').show();\x0a\x20\x20\x20\x20$('.testWindows').hide();\x0a\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20if\x20(ext\x20!=\x20'msi')\x20{\x0a\x20\x20\x20\x20\x20\x20$('#windowsInstallerInstructions').hide();\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20if\x20(ext\x20!=\x20'zip')\x20{\x0a\x20\x20\x20\x20\x20\x20$('#windowsZipInstructions').hide();\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20$('.testUnix').hide();\x0a\x20\x20\x20\x20$('.testWindows').show();\x0a\x20\x20}\x0a\x0a\x20\x20var\x20download\x20=\x20\"https://dl.google.com/go/\"\x20+\x20filename;\x0a\x0a\x20\x20var\x20message\x20=\x20$(''+\x0a\x20\x20\x20\x20'Your\x20download\x20should\x20begin\x20shortly.\x20'+\x0a\x20\x20\x20\x20'If\x20it\x20does\x20not,\x20click\x20this\x20link.

');\x0a\x20\x20message.find('a').attr('href',\x20download);\x0a\x20\x20message.insertAfter('#nav');\x0a\x0a\x20\x20window.location\x20=\x20download;\x0a}\x0a\x0afunction\x20updateVersionTags()\x20{\x0a\x20\x20var\x20v\x20=\x20window.goVersion;\x0a\x20\x20if\x20(/^go[0-9.]+$/.test(v))\x20{\x0a\x20\x20\x20\x20$(\".versionTag\").empty().text(v);\x0a\x20\x20\x20\x20$(\".whereTag\").hide();\x0a\x20\x20}\x0a}\x0a\x0afunction\x20addPermalinks()\x20{\x0a\x20\x20function\x20addPermalink(source,\x20parent)\x20{\x0a\x20\x20\x20\x20var\x20id\x20=\x20source.attr(\"id\");\x0a\x20\x20\x20\x20if\x20(id\x20==\x20\"\"\x20||\x20id.indexOf(\"tmp_\")\x20===\x200)\x20{\x0a\x20\x20\x20\x20\x20\x20//\x20Auto-generated\x20permalink.\x0a\x20\x20\x20\x20\x20\x20return;\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20if\x20(parent.find(\">\x20.permalink\").length)\x20{\x0a\x20\x20\x20\x20\x20\x20//\x20Already\x20attached.\x0a\x20\x20\x20\x20\x20\x20return;\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20parent.append(\"\x20\").append($(\"¶\").attr(\"href\",\x20\"#\"\x20+\x20id));\x0a\x20\x20}\x0a\x0a\x20\x20$(\"#page\x20.container\").find(\"h2[id],\x20h3[id]\").each(function()\x20{\x0a\x20\x20\x20\x20var\x20el\x20=\x20$(this);\x0a\x20\x20\x20\x20addPermalink(el,\x20el);\x0a\x20\x20});\x0a\x0a\x20\x20$(\"#page\x20.container\").find(\"dl[id]\").each(function()\x20{\x0a\x20\x20\x20\x20var\x20el\x20=\x20$(this);\x0a\x20\x20\x20\x20//\x20Add\x20the\x20anchor\x20to\x20the\x20\"dt\"\x20element.\x0a\x20\x20\x20\x20addPermalink(el,\x20el.find(\">\x20dt\").first());\x0a\x20\x20});\x0a}\x0a\x0a$(\".js-expandAll\").click(function()\x20{\x0a\x20\x20if\x20($(this).hasClass(\"collapsed\"))\x20{\x0a\x20\x20\x20\x20toggleExamples('toggle');\x0a\x20\x20\x20\x20$(this).text(\"(Collapse\x20All)\");\x0a\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20toggleExamples('toggleVisible');\x0a\x20\x20\x20\x20$(this).text(\"(Expand\x20All)\");\x0a\x20\x20}\x0a\x20\x20$(this).toggleClass(\"collapsed\")\x0a});\x0a\x0afunction\x20toggleExamples(className)\x20{\x0a\x20\x20//\x20We\x20need\x20to\x20explicitly\x20iterate\x20through\x20divs\x20starting\x20with\x20\"example_\"\x0a\x20\x20//\x20to\x20avoid\x20toggling\x20Overview\x20and\x20Index\x20collapsibles.\x0a\x20\x20$(\"[id^='example_']\").each(function()\x20{\x0a\x20\x20\x20\x20//\x20Check\x20for\x20state\x20and\x20click\x20it\x20only\x20if\x20required.\x0a\x20\x20\x20\x20if\x20($(this).hasClass(className))\x20{\x0a\x20\x20\x20\x20\x20\x20$(this).find('.toggleButton').first().click();\x0a\x20\x20\x20\x20}\x0a\x20\x20});\x0a}\x0a\x0a$(document).ready(function()\x20{\x0a\x20\x20generateTOC();\x0a\x20\x20addPermalinks();\x0a\x20\x20bindToggles(\".toggle\");\x0a\x20\x20bindToggles(\".toggleVisible\");\x0a\x20\x20bindToggleLinks(\".exampleLink\",\x20\"example_\");\x0a\x20\x20bindToggleLinks(\".overviewLink\",\x20\"\");\x0a\x20\x20bindToggleLinks(\".examplesLink\",\x20\"\");\x0a\x20\x20bindToggleLinks(\".indexLink\",\x20\"\");\x0a\x20\x20setupDropdownPlayground();\x0a\x20\x20setupInlinePlayground();\x0a\x20\x20fixFocus();\x0a\x20\x20setupTypeInfo();\x0a\x20\x20setupCallgraphs();\x0a\x20\x20toggleHash();\x0a\x20\x20personalizeInstallInstructions();\x0a\x20\x20updateVersionTags();\x0a\x0a\x20\x20//\x20godoc.html\x20defines\x20window.initFuncs\x20in\x20the\x20\x20tag,\x20and\x20root.html\x20and\x0a\x20\x20//\x20codewalk.js\x20push\x20their\x20on-page-ready\x20functions\x20to\x20the\x20list.\x0a\x20\x20//\x20We\x20execute\x20those\x20functions\x20here,\x20to\x20avoid\x20loading\x20jQuery\x20until\x20the\x20page\x0a\x20\x20//\x20content\x20is\x20loaded.\x0a\x20\x20for\x20(var\x20i\x20=\x200;\x20i\x20<\x20window.initFuncs.length;\x20i++)\x20window.initFuncs[i]();\x0a});\x0a\x0a//\x20--\x20analysis\x20---------------------------------------------------------\x0a\x0a//\x20escapeHTML\x20returns\x20HTML\x20for\x20s,\x20with\x20metacharacters\x20quoted.\x0a//\x20It\x20is\x20safe\x20for\x20use\x20in\x20both\x20elements\x20and\x20attributes\x0a//\x20(unlike\x20the\x20\"set\x20innerText,\x20read\x20innerHTML\"\x20trick).\x0afunction\x20escapeHTML(s)\x20{\x0a\x20\x20\x20\x20return\x20s.replace(/&/g,\x20'&').\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20replace(/\\\"/g,\x20'"').\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20replace(/\\'/g,\x20''').\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20replace(//g,\x20'>');\x0a}\x0a\x0a//\x20makeAnchor\x20returns\x20HTML\x20for\x20an\x20\x20element,\x20given\x20an\x20anchorJSON\x20object.\x0afunction\x20makeAnchor(json)\x20{\x0a\x20\x20var\x20html\x20=\x20escapeHTML(json.Text);\x0a\x20\x20if\x20(json.Href\x20!=\x20\"\")\x20{\x0a\x20\x20\x20\x20\x20\x20html\x20=\x20\"\"\x20+\x20html\x20+\x20\"\";\x0a\x20\x20}\x0a\x20\x20return\x20html;\x0a}\x0a\x0afunction\x20showLowFrame(html)\x20{\x0a\x20\x20var\x20lowframe\x20=\x20document.getElementById('lowframe');\x0a\x20\x20lowframe.style.height\x20=\x20\"200px\";\x0a\x20\x20lowframe.innerHTML\x20=\x20\"\"\x20+\x20html\x20+\x20\"

\\n\"\x20+\x0a\x20\x20\x20\x20\x20\x20\"\xe2\x9c\x98\"\x0a};\x0a\x0adocument.hideLowFrame\x20=\x20function()\x20{\x0a\x20\x20var\x20lowframe\x20=\x20document.getElementById('lowframe');\x0a\x20\x20lowframe.style.height\x20=\x20\"0px\";\x0a}\x0a\x0a//\x20onClickCallers\x20is\x20the\x20onclick\x20action\x20for\x20the\x20'func'\x20tokens\x20of\x20a\x0a//\x20function\x20declaration.\x0adocument.onClickCallers\x20=\x20function(index)\x20{\x0a\x20\x20var\x20data\x20=\x20document.ANALYSIS_DATA[index]\x0a\x20\x20if\x20(data.Callers.length\x20==\x201\x20&&\x20data.Callers[0].Sites.length\x20==\x201)\x20{\x0a\x20\x20\x20\x20document.location\x20=\x20data.Callers[0].Sites[0].Href;\x20//\x20jump\x20to\x20sole\x20caller\x0a\x20\x20\x20\x20return;\x0a\x20\x20}\x0a\x0a\x20\x20var\x20html\x20=\x20\"Callers\x20of\x20\"\x20+\x20escapeHTML(data.Callee)\x20+\x20\":
\\n\";\x0a\x20\x20for\x20(var\x20i\x20=\x200;\x20i\x20<\x20data.Callers.length;\x20i++)\x20{\x0a\x20\x20\x20\x20var\x20caller\x20=\x20data.Callers[i];\x0a\x20\x20\x20\x20html\x20+=\x20\"\"\x20+\x20escapeHTML(caller.Func)\x20+\x20\"\";\x0a\x20\x20\x20\x20var\x20sites\x20=\x20caller.Sites;\x0a\x20\x20\x20\x20if\x20(sites\x20!=\x20null\x20&&\x20sites.length\x20>\x200)\x20{\x0a\x20\x20\x20\x20\x20\x20html\x20+=\x20\"\x20at\x20line\x20\";\x0a\x20\x20\x20\x20\x20\x20for\x20(var\x20j\x20=\x200;\x20j\x20<\x20sites.length;\x20j++)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20if\x20(j\x20>\x200)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20html\x20+=\x20\",\x20\";\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20html\x20+=\x20\"\"\x20+\x20makeAnchor(sites[j])\x20+\x20\"\";\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20html\x20+=\x20\"
\\n\";\x0a\x20\x20}\x0a\x20\x20showLowFrame(html);\x0a};\x0a\x0a//\x20onClickCallees\x20is\x20the\x20onclick\x20action\x20for\x20the\x20'('\x20token\x20of\x20a\x20function\x20call.\x0adocument.onClickCallees\x20=\x20function(index)\x20{\x0a\x20\x20var\x20data\x20=\x20document.ANALYSIS_DATA[index]\x0a\x20\x20if\x20(data.Callees.length\x20==\x201)\x20{\x0a\x20\x20\x20\x20document.location\x20=\x20data.Callees[0].Href;\x20//\x20jump\x20to\x20sole\x20callee\x0a\x20\x20\x20\x20return;\x0a\x20\x20}\x0a\x0a\x20\x20var\x20html\x20=\x20\"Callees\x20of\x20this\x20\"\x20+\x20escapeHTML(data.Descr)\x20+\x20\":
\\n\";\x0a\x20\x20for\x20(var\x20i\x20=\x200;\x20i\x20<\x20data.Callees.length;\x20i++)\x20{\x0a\x20\x20\x20\x20html\x20+=\x20\"\"\x20+\x20makeAnchor(data.Callees[i])\x20+\x20\"
\\n\";\x0a\x20\x20}\x0a\x20\x20showLowFrame(html);\x0a};\x0a\x0a//\x20onClickTypeInfo\x20is\x20the\x20onclick\x20action\x20for\x20identifiers\x20declaring\x20a\x20named\x20type.\x0adocument.onClickTypeInfo\x20=\x20function(index)\x20{\x0a\x20\x20var\x20data\x20=\x20document.ANALYSIS_DATA[index];\x0a\x20\x20var\x20html\x20=\x20\"Type\x20\"\x20+\x20data.Name\x20+\x20\":\x20\"\x20+\x0a\x20\x20\"      (size=\"\x20+\x20data.Size\x20+\x20\",\x20align=\"\x20+\x20data.Align\x20+\x20\")
\\n\";\x0a\x20\x20html\x20+=\x20implementsHTML(data);\x0a\x20\x20html\x20+=\x20methodsetHTML(data);\x0a\x20\x20showLowFrame(html);\x0a};\x0a\x0a//\x20implementsHTML\x20returns\x20HTML\x20for\x20the\x20implements\x20relation\x20of\x20the\x0a//\x20specified\x20TypeInfoJSON\x20value.\x0afunction\x20implementsHTML(info)\x20{\x0a\x20\x20var\x20html\x20=\x20\"\";\x0a\x20\x20if\x20(info.ImplGroups\x20!=\x20null)\x20{\x0a\x20\x20\x20\x20for\x20(var\x20i\x20=\x200;\x20i\x20<\x20info.ImplGroups.length;\x20i++)\x20{\x0a\x20\x20\x20\x20\x20\x20var\x20group\x20=\x20info.ImplGroups[i];\x0a\x20\x20\x20\x20\x20\x20var\x20x\x20=\x20\"\"\x20+\x20escapeHTML(group.Descr)\x20+\x20\"\x20\";\x0a\x20\x20\x20\x20\x20\x20for\x20(var\x20j\x20=\x200;\x20j\x20<\x20group.Facts.length;\x20j++)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20var\x20fact\x20=\x20group.Facts[j];\x0a\x20\x20\x20\x20\x20\x20\x20\x20var\x20y\x20=\x20\"\"\x20+\x20makeAnchor(fact.Other)\x20+\x20\"\";\x0a\x20\x20\x20\x20\x20\x20\x20\x20if\x20(fact.ByKind\x20!=\x20null)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20html\x20+=\x20escapeHTML(fact.ByKind)\x20+\x20\"\x20type\x20\"\x20+\x20y\x20+\x20\"\x20implements\x20\"\x20+\x20x;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20html\x20+=\x20x\x20+\x20\"\x20implements\x20\"\x20+\x20y;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20html\x20+=\x20\"
\\n\";\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20}\x0a\x20\x20}\x0a\x20\x20return\x20html;\x0a}\x0a\x0a\x0a//\x20methodsetHTML\x20returns\x20HTML\x20for\x20the\x20methodset\x20of\x20the\x20specified\x0a//\x20TypeInfoJSON\x20value.\x0afunction\x20methodsetHTML(info)\x20{\x0a\x20\x20var\x20html\x20=\x20\"\";\x0a\x20\x20if\x20(info.Methods\x20!=\x20null)\x20{\x0a\x20\x20\x20\x20for\x20(var\x20i\x20=\x200;\x20i\x20<\x20info.Methods.length;\x20i++)\x20{\x0a\x20\x20\x20\x20\x20\x20html\x20+=\x20\"\"\x20+\x20makeAnchor(info.Methods[i])\x20+\x20\"
\\n\";\x0a\x20\x20\x20\x20}\x0a\x20\x20}\x0a\x20\x20return\x20html;\x0a}\x0a\x0a//\x20onClickComm\x20is\x20the\x20onclick\x20action\x20for\x20channel\x20\"make\"\x20and\x20\"<-\"\x0a//\x20send/receive\x20tokens.\x0adocument.onClickComm\x20=\x20function(index)\x20{\x0a\x20\x20var\x20ops\x20=\x20document.ANALYSIS_DATA[index].Ops\x0a\x20\x20if\x20(ops.length\x20==\x201)\x20{\x0a\x20\x20\x20\x20document.location\x20=\x20ops[0].Op.Href;\x20//\x20jump\x20to\x20sole\x20element\x0a\x20\x20\x20\x20return;\x0a\x20\x20}\x0a\x0a\x20\x20var\x20html\x20=\x20\"Operations\x20on\x20this\x20channel:
\\n\";\x0a\x20\x20for\x20(var\x20i\x20=\x200;\x20i\x20<\x20ops.length;\x20i++)\x20{\x0a\x20\x20\x20\x20html\x20+=\x20makeAnchor(ops[i].Op)\x20+\x20\"\x20by\x20\"\x20+\x20escapeHTML(ops[i].Fn)\x20+\x20\"
\\n\";\x0a\x20\x20}\x0a\x20\x20if\x20(ops.length\x20==\x200)\x20{\x0a\x20\x20\x20\x20html\x20+=\x20\"(none)
\\n\";\x0a\x20\x20}\x0a\x20\x20showLowFrame(html);\x0a};\x0a\x0a$(window).load(function()\x20{\x0a\x20\x20\x20\x20//\x20Scroll\x20window\x20so\x20that\x20first\x20selection\x20is\x20visible.\x0a\x20\x20\x20\x20//\x20(This\x20means\x20we\x20don't\x20need\x20to\x20emit\x20id='L%d'\x20spans\x20for\x20each\x20line.)\x0a\x20\x20\x20\x20//\x20TODO(adonovan):\x20ideally,\x20scroll\x20it\x20so\x20that\x20it's\x20under\x20the\x20pointer,\x0a\x20\x20\x20\x20//\x20but\x20I\x20don't\x20know\x20how\x20to\x20get\x20the\x20pointer\x20y\x20coordinate.\x0a\x20\x20\x20\x20var\x20elts\x20=\x20document.getElementsByClassName(\"selection\");\x0a\x20\x20\x20\x20if\x20(elts.length\x20>\x200)\x20{\x0a\x09elts[0].scrollIntoView()\x0a\x20\x20\x20\x20}\x0a});\x0a\x0a//\x20setupTypeInfo\x20populates\x20the\x20\"Implements\"\x20and\x20\"Method\x20set\"\x20toggle\x20for\x0a//\x20each\x20type\x20in\x20the\x20package\x20doc.\x0afunction\x20setupTypeInfo()\x20{\x0a\x20\x20for\x20(var\x20i\x20in\x20document.ANALYSIS_DATA)\x20{\x0a\x20\x20\x20\x20var\x20data\x20=\x20document.ANALYSIS_DATA[i];\x0a\x0a\x20\x20\x20\x20var\x20el\x20=\x20document.getElementById(\"implements-\"\x20+\x20i);\x0a\x20\x20\x20\x20if\x20(el\x20!=\x20null)\x20{\x0a\x20\x20\x20\x20\x20\x20//\x20el\x20!=\x20null\x20=>\x20data\x20is\x20TypeInfoJSON.\x0a\x20\x20\x20\x20\x20\x20if\x20(data.ImplGroups\x20!=\x20null)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20el.innerHTML\x20=\x20implementsHTML(data);\x0a\x20\x20\x20\x20\x20\x20\x20\x20el.parentNode.parentNode.style.display\x20=\x20\"block\";\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20var\x20el\x20=\x20document.getElementById(\"methodset-\"\x20+\x20i);\x0a\x20\x20\x20\x20if\x20(el\x20!=\x20null)\x20{\x0a\x20\x20\x20\x20\x20\x20//\x20el\x20!=\x20null\x20=>\x20data\x20is\x20TypeInfoJSON.\x0a\x20\x20\x20\x20\x20\x20if\x20(data.Methods\x20!=\x20null)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20el.innerHTML\x20=\x20methodsetHTML(data);\x0a\x20\x20\x20\x20\x20\x20\x20\x20el.parentNode.parentNode.style.display\x20=\x20\"block\";\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20}\x0a\x20\x20}\x0a}\x0a\x0afunction\x20setupCallgraphs()\x20{\x0a\x20\x20if\x20(document.CALLGRAPH\x20==\x20null)\x20{\x0a\x20\x20\x20\x20return\x0a\x20\x20}\x0a\x20\x20document.getElementById(\"pkg-callgraph\").style.display\x20=\x20\"block\";\x0a\x0a\x20\x20var\x20treeviews\x20=\x20document.getElementsByClassName(\"treeview\");\x0a\x20\x20for\x20(var\x20i\x20=\x200;\x20i\x20<\x20treeviews.length;\x20i++)\x20{\x0a\x20\x20\x20\x20var\x20tree\x20=\x20treeviews[i];\x0a\x20\x20\x20\x20if\x20(tree.id\x20==\x20null\x20||\x20tree.id.indexOf(\"callgraph-\")\x20!=\x200)\x20{\x0a\x20\x20\x20\x20\x20\x20continue;\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20var\x20id\x20=\x20tree.id.substring(\"callgraph-\".length);\x0a\x20\x20\x20\x20$(tree).treeview({collapsed:\x20true,\x20animated:\x20\"fast\"});\x0a\x20\x20\x20\x20document.cgAddChildren(tree,\x20tree,\x20[id]);\x0a\x20\x20\x20\x20tree.parentNode.parentNode.style.display\x20=\x20\"block\";\x0a\x20\x20}\x0a}\x0a\x0adocument.cgAddChildren\x20=\x20function(tree,\x20ul,\x20indices)\x20{\x0a\x20\x20if\x20(indices\x20!=\x20null)\x20{\x0a\x20\x20\x20\x20for\x20(var\x20i\x20=\x200;\x20i\x20<\x20indices.length;\x20i++)\x20{\x0a\x20\x20\x20\x20\x20\x20var\x20li\x20=\x20cgAddChild(tree,\x20ul,\x20document.CALLGRAPH[indices[i]]);\x0a\x20\x20\x20\x20\x20\x20if\x20(i\x20==\x20indices.length\x20-\x201)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20$(li).addClass(\"last\");\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20}\x0a\x20\x20}\x0a\x20\x20$(tree).treeview({animated:\x20\"fast\",\x20add:\x20ul});\x0a}\x0a\x0a//\x20cgAddChild\x20adds\x20an\x20
  • \x20element\x20for\x20document.CALLGRAPH\x20node\x20cgn\x20to\x0a//\x20the\x20parent\x20
      \x20element\x20ul.\x20tree\x20is\x20the\x20tree's\x20root\x20
        \x20element.\x0afunction\x20cgAddChild(tree,\x20ul,\x20cgn)\x20{\x0a\x20\x20\x20var\x20li\x20=\x20document.createElement(\"li\");\x0a\x20\x20\x20ul.appendChild(li);\x0a\x20\x20\x20li.className\x20=\x20\"closed\";\x0a\x0a\x20\x20\x20var\x20code\x20=\x20document.createElement(\"code\");\x0a\x0a\x20\x20\x20if\x20(cgn.Callees\x20!=\x20null)\x20{\x0a\x20\x20\x20\x20\x20$(li).addClass(\"expandable\");\x0a\x0a\x20\x20\x20\x20\x20//\x20Event\x20handlers\x20and\x20innerHTML\x20updates\x20don't\x20play\x20nicely\x20together,\x0a\x20\x20\x20\x20\x20//\x20hence\x20all\x20this\x20explicit\x20DOM\x20manipulation.\x0a\x20\x20\x20\x20\x20var\x20hitarea\x20=\x20document.createElement(\"div\");\x0a\x20\x20\x20\x20\x20hitarea.className\x20=\x20\"hitarea\x20expandable-hitarea\";\x0a\x20\x20\x20\x20\x20li.appendChild(hitarea);\x0a\x0a\x20\x20\x20\x20\x20li.appendChild(code);\x0a\x0a\x20\x20\x20\x20\x20var\x20childUL\x20=\x20document.createElement(\"ul\");\x0a\x20\x20\x20\x20\x20li.appendChild(childUL);\x0a\x20\x20\x20\x20\x20childUL.setAttribute('style',\x20\"display:\x20none;\");\x0a\x0a\x20\x20\x20\x20\x20var\x20onClick\x20=\x20function()\x20{\x0a\x20\x20\x20\x20\x20\x20\x20document.cgAddChildren(tree,\x20childUL,\x20cgn.Callees);\x0a\x20\x20\x20\x20\x20\x20\x20hitarea.removeEventListener('click',\x20onClick)\x0a\x20\x20\x20\x20\x20};\x0a\x20\x20\x20\x20\x20hitarea.addEventListener('click',\x20onClick);\x0a\x0a\x20\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20\x20li.appendChild(code);\x0a\x20\x20\x20}\x0a\x20\x20\x20code.innerHTML\x20+=\x20\" \"\x20+\x20makeAnchor(cgn.Func);\x0a\x20\x20\x20return\x20li\x0a}\x0a\x0a})();\x0a", - - "images/minus.gif": "GIF89a\x09\x00\x09\x00\xf7\x00\x00\x00\x00\x00\x80\x80\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!\xf9\x04\x01\x00\x00\xff\x00,\x00\x00\x00\x00\x09\x00\x09\x00\x00\x08\"\x00\x03\x08\x1cH\xf0\x9f\xc1\x83\xff\x04\"<\xa8pa\xc2\x00\xff\x00H\x94\xf8\xd0aE\x87\x0d\x17\x12\xdc\x18\x20\x20\x00;", - - "images/plus.gif": "GIF89a\x09\x00\x09\x00\xf7\x00\x00\x00\x00\x00\x80\x80\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!\xf9\x04\x01\x00\x00\xff\x00,\x00\x00\x00\x00\x09\x00\x09\x00\x00\x08&\x00\x03\x08\x1cH\xf0\x9f\xc1\x83\xff\x04\x1e\x04pP\xa1A\x86\x06\x15\x02\x9881a\x80\x85\x0d/>\xcc\x880#A\x82\x01\x01\x00;", - - "images/treeview-black-line.gif": "GIF89a\x10\x00\xf0\x06\xf7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!\xf9\x04\x01\x00\x00\xff\x00,\x00\x00\x00\x00\x10\x00\xf0\x06\x00\x08\xff\x00\xff\x09\x1c\xf8\x0f\x00\xc1\x83\x08\x0d\"\\X\x90\xe1B\x85\x0e\x09B\x8c(p\"E\x8b\x111:\xd4\xc8\x10\x80\xc7\x8f\x1f\x1fR\x948r\x20G\x91%\x1b\xa6<\x990\xa5\xca\x92,\x0f\xc6$\xb9\xd2\xe5L\x936s\xd6\xdc\x09SgO\x9e#oV\xf4\x19\x94\xe8E\xa3\x19\x91nT\xda\x91)\xca\x9fP\x8b\x02=:5i\xd5\xa5W\x9bf}*5*U\xafV\xc1b\x15\xab\x95,\xd7\xaf]\xd3\xa2]\x1bVm[\xb6c\xdd\xc6\x85[Vn]\xbag\xdf\xea\x9d\xbb\xf7n\xdf\xbc|\x03\xfb\x15\x0cx\xb0\xe1\xc2\x88[nUl\x96\xb1\xdd\xc42\x9d:\xc6;\xf9oe\xc2\x97\x0fg\x86L\xb3q\xe4\xc5\x9f=w~\xbc\xb9th\xd2\xa7)\xa7\xb6\xbc\x1ask\xcd\xaf9\xe3\x04=Zum\xd6\xb7]\xe7\x86\xbd[\xf6P\xda\xb3E\x07G\xdd\xdbt\xf1\xd8\xc6\x87\xdbV\x8e\x9b\xb9n\xe7\xbc\xa1\xfb~I\xdc\xa5\xf5\xeb\xd8\xb3k\xdf\xce\xbd{\xf4\xdf\xc2\xc1W\xff\x17\xbf\x9c|s\xf3\xcf\xd1\x7f\xa7^\x9e\xfdy\xf7\xe9\xe1\xaf\x17*\x7f:\xfd\xfb\x92\x91\xeb?\xce_zr\xf5\xf6\xe5\xd7\x1f\x80\xff\xd5W\x20~\xc0\x11\xb8\x9f\x7f\x0b*8\xa0\x81\x0dB\xf8\x20\x82\xe1I\xc8\xe0\x84\x02^\xa8\xa1\x83\x1bZ\xc8\xe1\x87\x1e\x86H\xe1x\"f\x08\xe2\x88\xed\xa1\xf8\x9e\x8a\xf1\xb18\x9f\x89%&\x18c\x85.\x06(c\x8d\x07\xc2\x88c\x84;bx\xa3\x8e@\xfe($\x8dA\x129$\x89=v\x98\xe4\x89E\"\xd9d\x8aO\xae\x18e\x8bS\xbex$\x94WJ\x99%\x95[Zi\xe4\x97Nvi#\x98X\x92\xa9\xa5\x99\\\xa2\xe9e\x98j\x8e\xc9\xe6\x9be\xc2y\xa6\x9ci\xd2\xb9f\x9cx\xce\x99g\x9d{\xde\xa9\xe7\x9f|\x02\xeag\xa0\x84\x0ej\xa8\x9b}\"*\xa8\xa2\x852zh\x8ebB\xda\xa6\xa4v:j)\xa5\x89b\xba\xa8\xa6\x8dr\xfa(\x8fU^\x0aj\xa4\xa3NZj\xa5\x9e\x8a\xea\xa3\xa9\xab\xa2zj\xa6\xafn\xff\x1ak\xa7\xb3~\xda*\xac\xb7\xca\x9a+\xad\xbb\xda\xaad\xa8\xa9\x06[\xab\xaa\xbf\x92\xda+\xb1L\x1a[,\xab\xcb\xbaz\xac\xb0\xcf\x0e\x0bm\xb3\xb8R\xab\xab\xb5\xbcb\xebk\xb2\xccr\xeb\xac\xb6\xc8\xce\xf8\xad\xb7\xd5\x92{\xad\xb9\xd9\xa2\xbb\xad\xb8\xe5\xb2{\xae\xbb\xe9\xc2\xbb\xee\x92\xf2\x86K\xef\xbd\xc0J\xabo\xb4\xfc\x82;\xad\xba\xf6\xe6\xdb/\xc0\xff\xd6[0\xbe\xca\x12\xbc\xaf\xbf\x0b+<\xb0\xc1\x0dC\xfc0\xc2\xddJ\xcc\xf0\xc4\x02_\xac\xb1\xc3\x1b[\xcc\xf1\xc7\x1e\x87L\xf1\xb8\"g\x0c\xf2\xc8\xed\xa2\xfc\xae\xca\xf1\xb2<\xaf\xc9%'\x1cs\xc5.\x07,s\xcd\x07\xc3\x8cs\xc4;c|\xb3\xce@\xff,4\xcdA\x13=4\xc9=w\x9c\xf4\xc9E#\xddt\xcaO\xaf\x1cu\xcbS\xbf|4\xd4WK\x9d5\xd5[[m\xf4\xd7Nwm3\xd8X\x93\xad\xb5\xd9\\\xa3\xedu\xd8j\x8f\xcd\xf6\xdbe\xc3}\xb6\xdci\xd3\xbdv\xdcx\xcf\x9dw\xdd{\xdf\xff\xad\xf7\xdf|\x03\xeew\xe0\x84\x0fn\xb8\xdb}#.\xb8\xe2\x853~x\xcebC\xde\xb6\xe4v;n9\xe5\x89c\xbe\xb8\xe6\x8ds\xfe8\xcfU_\x0ez\xe4\xa3O^z\xe5\x9e\x8b\xee\xb3\xe9\xab\xa3~z\xe6\xafo\x1e{\xe7\xb3\x7f\xde:\xec\xb7\xcb\x9e;\xed\xbb\xdb\xaet\xe8\xa9\x07_\xbb\xea\xbf\x93\xde;\xf1L\x1b_<\xeb\xcb\xbb~\xbc\xf0\xcf\x0f\x0f}\xf3\xb8S\xaf\xbb\xf5\xbcc\xef{\xf2\xccs\xef\xbc\xf6\xc8\xcf\xfc\xbd\xf7\xd5\x93\x7f\xbd\xf9\xd9\xa3\xbf\xbd\xf8\xe5\xb3\x7f\xbe\xfb\xe9\xc3\xbf\xfe\xd2\xf2\x87O\xff\xfd\xc0K\xaf\x7f\xf4\xfc\x83?\xbd\xfa\xf6\xcb_\xff\x00\xf8\xbf\xfa\x15\x10\x7f\xca#\xe0\xfe\xfc\xb7@\x05\x0e\xd0\x80\x0d\x84\xe0\x03\x11\xd8=\x092p\x82\x02\xbc\xa0\x06\x1d\xb8A\x0br\xf0\x83\x1e\x0c!\x05\xc7'\xc2\x0c\x82p\x84\xedC\xe1\xfbT\x18?\x16\xce\xcf\x84%L`\x0c+\xe8\xc2\x00\xca\xb0\x86\x07\x84!\x0e#\xb8C\x0c\xdeP\x87@\xfc\xa1\x102i\x18D\"\x0e\x91\x84=\xec`\x12OXD$61\x85O\\a\x14[8\xc5\x17\x1e\x11\x8aW\x94b\x16\xa9\xb8E+\x1a\xf1\x8bN\xec\xa2\x0di\x08\x12\x90\x04\x04\x00;", - - "images/treeview-black.gif": "GIF89a`\x00\x85\x00\xa1\x01\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff!\xf9\x04\x01\x00\x00\x02\x00,\x00\x00\x00\x00`\x00\x85\x00\x00\x02\xfe\x94\x8f\xa9\xcb\xed\x0fE\x98\xc1\xd1\x88\xb3\xde\xa8\xf2\x0f\x86\x9a'\x96\xa6I\x9e\xea\xca\xb6\xee\x0a\xc4\xb2\xfc\xd6&\xb0\xe0\xf6\xfe\xe9\x82\xef\xe3\x09#\xc0Cp\x88d\xe0f\xcbY\xf2\x89(\x1a\x8eP\xa8\xf4W\xcdNs\xda,\xd3\xd9\xedR\xc3^\xb2yl~\xa2\xd3\xc85[\xe8~\xabRF9\x8f\xbe\xb5o.\x96\x09W?R\x12\x07\x98\x80Gx\x88\x98\x08\xf8E\xa3\xa826\xe8\x88\x01)yBY)\xf8\xe3\xc4\x84\xd9\xf3\xd7\x09r\x09\xea\xa9\x109\x9a\xc3hz\xda\xa0\xba\xfa\xd0\xea\xca\x1a{3\x9bY\x1b\x02\xebj\x98\xbb\xba\x1b\xcb\xd7\x00\x1c\xf5k\xdb{{\x8c\x9c\xac\x8c\xca\xb8\xac\xf4\xe9<\x9c\x87\x15\x9dp\xc5{\xdaD\xc3Y}]m]7\xfdM\x0d>>\x95j\x9e\xae\xbe\xce\xde\x8ed\xb8\x0e\xff+\xac@\x7f\xeb\x9b\x8eo\xae?\xce\xef\x8e\x1d+\x15@P\xa2\xc6yKw\xd0\x9c\xb6\x18\x9a\x1aEKh0\x1c\xb9\x88\xa5\xd4\x09t\x871\xa3\xc6d\x8d\x06\xe4\xe5\xdb\xe8\xb1\x97\x9f>!O\x95\xfcv\xb2ZJ\x8e,\x0d\xa2C\x08\xed[A\x991\xbb5d\xc8\xedaM\x9d\x15a\xf6T\xf8\xb2\xa5\xd0\xa1DG\xadtvtY\xd2J\xf6:\x8cT\xb8q`-\xa9\xb3\xa8\x06\xfc\x17\x94b9\xa8?\xb5J\x83\xca)\xa7\xb3\x996\xbb\xd24\xdb-k\xd1\xb5l\xdb\xba}\x0b7.\x82\x02\x00;", - - "images/treeview-default-line.gif": "GIF89a\x10\x00\xf0\x06\xf7\x00\x00\x00\x00\x00\x80\x80\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!\xf9\x04\x01\x00\x00\xff\x00,\x00\x00\x00\x00\x10\x00\xf0\x06\x00\x08\xff\x00\xff\x09\x1cH\xb0\xa0A\x81\x01\x0e*\\x0!\xc3\x87\x0b\x1dB\x9cHP\"E\x8a\x093\xfe\xd3x\xb1a\xc7\x8b\x16?2\x0c)R!\xc9\x92\x06O\xa2\xac\xb8rd\xcb\x88/M\xc6\xf48\xb3\xa0\xca\x977[\xe6\\\xb9\x13e\xcf\x92?E\x06\xfd8\xb4cQ\x905m&e\xb9\x14aS\xa7O\x8fb|\xba\x91\xaa\xd4\x89W!f}\xb8\xd5eT\xab`\xbf\x8am\xda\x15\xe6\xd8\xa5ee\x9eM\x9a\x96&\xd9\xb0o\xd7\xd6l\x9b\x12.Z\xbbl\xf1\xce\xd5;\x93\xaeR\xb9}\xf9\xc6\xf4\xcb4\xae\xe1\xbb\x80\x07\x0b\xc6\xb9Xgc\x9e\x8f}F\x06:Yhe\xa2\x97\xa9j\xde\xcc\xb93\xd7\xccH\x133\x16\xed\x984d\xd3\x92QSVm\x995f\xd7FAO\x85\x1d\xfap^\xda\xb3m\xef\xc5\x8dUvo\xdeZ}\x07\x07\xfe\x99\xb8W\xdd\x81\x8d\x9bE\xaeX\xb9Z\xe6\xa3\xa1\x97\x96~\x9azj\xeb\xab\xb1\xb7\xd6\xfe\x9a{l\xe7n\x11{\xff\xaf-\xbe\xfc\xed\xf1\xb9\xcd\xefF\xff\x9b\xfdp\xf7\xc5\xe1\x1fW\x9f\\\xfer\xfa\xcd\xed?\xc7\x1f\x9d\xfft\xff\xd5\x01x\x9d\x80\xd9\x11\xb8\x9d\x81\xdd!\xf8\x9d~\xe1\x9d\xa7\x20y\x0eF\xb8\xde\x83\xe9IX\x1f\x85\xeda\xf8\x9e\x86\xf1q8\x9f\x85\xf9yx\x1f\x88\xfd\x91\xf8\x9f\x89\x01\xa28\xa0\x8a\x05\xb2x\xa0\x8b\x09\xc2\xb8\xa0\x88\xfb\xc9\x08\xe1\x846V\x88\xe3\x8e\x17\xe6\x98\xa1\x8f\x1b\x02\xd9\xa1\x90\x1f\xf2\x18\"\x91#\x1aY\xa2\x92'2\x99\xa2\x93+B\xd9\xa2\x94/R\x19\xa3\x953\"Y#\x967\xf6\xc8\xa5\x8e^\x86y\xe4\x97?\x92\x19\xa4\x99C\xa2Y\xa4\x98K\xb2\xd9\xa4\x9bO\xc2\x19\xa5\x9cS\xd2Y\xa5\x9dW\xe2\x99\xa5\x9aI\xea\xd9\xe5\x98~\x82\x09\xe8\xa0m\x12\xfa\xa6\xa1q\":\xa7\xa2u2z\xa7\xa3yB\xbag\xa0eRz\xa6\xa5ib\xba\xa6\xa4\x7f\x16\xea\xe9\xa1\x9f&\x1a\xea\xa2\xa36Z\xea\xa3\xa7F\x9a\xea\xa4\x9c\x0a\xbaj\xa7\xa0\xc6\xff*\xaa\xac\xa4\xd2j\xaa\xad\xa8\xe2\xaa\xaa\xae\xac\xbe\xea*\xaf\xb0\xce*l\xad\xc3\xdeZl\xae\xc7\xee\x9al\xaf\xc0\xfe\xbal\xb0\xc4Fk\xac\xb4\xc8R\xab\xac\xb5\xcc>\xeb,\xb6\xd0N\xebm\xb5\xdf^\x1bn\xb6\xdcn;n\xb7\xe0\xa6+\xae\xba\xe4\x9ek.\xbb\xe8\xae+o\xbb\xf0\xbe;o\xbc\xf4\xdeko\xbe\xfc\xe2\xeb\xef\xbe\xffV\xda\xaa\xc0\xbe\x12\xdc\xac\xc1\xda\"\\\xae\xc2\xee2\\\xaf\xc3\xfaB\xdc/\xc0\x14K\x1c\xf0\xa5\x03c\\\xb0\xc6\x07s\x9c\xb0\xc7\x0b\x83\xdc\xb0\xc8\x0f\x93\x1c\xb1\xc9\x13[\\1\xca\x17g\x9a\xb1\xcb\x1b\xc3\xdc\xb1\xcc\x1f\xd3\x1c\xb2\xcd#\xe3\\\xb2\xce'\xf3\x9c2\xcb+\xfb\xdc\xf2\xa61\x13=\xb3\xd15#}\xb3\xd293\xbd\xb3\xd3=C\xfd\xb3\xd0AK=t\x9f/[]5\xd6Es}\xb4\xd7I\x83\xbd\xb4\xd8M\x93\xfd\xb4\xd9Q\xa3=\xb5\xd6*\xb7\x0d\xb4\xdbT\xc3\xcd\xf6\xdbt\xc7]\xf7\xdcv\xe7\x8d\xf7\xdej_\xff\xbd\xa5\xa6}o\xfdw\xd6\x81\xcb]\xf8\xdd\x87\xeb\x9d8\xdf\x83w\xdd\xf8\xd7\x8f\x87\x1d\xf9\xd8\x93\x97]\xf9\xd9\x97\xa7\x9d\xf9\xda\x8bw\xbe\xb9\xdf\x0d\xf2\xf9\xb9\xe0\xa1\x03>\xba\xe1\xa7#\x9e\xba\xe2\xab3^:\xe1\xad{\xfe\xba\xe3\xb3C^\xbb\xe4\xb7S\x9e\xbb\xe5\xbbc\xde\xbb\xe6\xbfs\x1e\xfb\xf0\xc1\x83^\x17x\xc73\x98<\x8d\xc5\x93\xbe\xbc\x96\xcd\xa3\x1e\xbd\xea\xd3\xb3^\xbd\xeb\xcf\x8b~\xbd\xec\xd9\x9b\xbe=\xf1\xdd\xc3\xfe\xfd\xf8\xe1\xd3^\xbe\xed\xe7\xe3\x9e\xbe\xee\xeb\xf3\xde\xbe\xef\xef\x03\x1f\xbf\xf0\xe4\xff\xa5\xbc\xfd\xcc\xcfo<\xfe\xd0\xeb\xef<\xff\xda\xf3\x9f\xf4\x04H=\x02Z\xcf\x80\xd8\x03\xa0\xf7\x10\xc8=\x05\x8a\x8f\x81\xe0s\xa0\xf9$\x88>\x0a\xaa\xcf\x82\xec\xc3\xa0\xfb4\x08?\x0e\xca\xcf\x83\xf4\x83`\xfd\x0a\x93?\x10\xee\x8f\x84\xfd3\xe1\xffP\x18@\x15\x0e\xd0\x85\x05\x84\xe1\x01e\x98@\x16.\x90\x86\x0d\xb4\xe1\x03q\x18A\x1dN\xd0\x87\x15\x04\xe2\x05\xa6\x85\x98A\"n\xd0\x88\x1dD\xe2\x07\x95\x18B\x1e\x8ep\x20\x84\x81\xa2pf\xc8\xc4\x13J\x11yN\x14\xa1\x16\xb3\xc8\xc5*\xae\xf0\x8a\xf7\xf3\xe2\x0b\xc5\x18C2R\x11\x8c%4c\x0d\xd1\x98B5\xe6\x90\x8d-tc\x0f\xe1xC9>\x11*a\xa4\xe3\x0e\xed\xb8E>vQ\x8f?\x04d\x10\x059DB\x16\xd1\x90GDd\x12\x15\xb9DF6\xd1\x8f\x90t\xa4\x15\xf1\x98FI~\x91\x92m\xb4\xe4\x185YFN\x9e\x11\x93q\xf4\xe4\x1aAYGQ\xbe\x91\x94{4\xe5\x1cQ\x19HV\x0e\xd2\x95\x85\x84\xe5!e\x99HZ.\xd2)\x1a\xc9H@\x00\x00;", - - "images/treeview-default.gif": "GIF89a`\x00\x85\x00\xa1\x03\x00\x00\x00\x00\x80\x80\x80\xbc\xbc\xbc\xff\xff\xff!\xf9\x04\x01\x00\x00\x03\x00,\x00\x00\x00\x00`\x00\x85\x00\x00\x02\xfe\x9c\x8f\xa9\xcb\xed\x0f\x07\x98\xc0\xd1\x88\xb3\xde\xa8\xf2\x0f\x86\x9a'\x96\xa6I\x9e\xea\xca\xb6\xee\x1a\xc4\xb2\xfc\xd6f\xb0\xe0\xf6\xfe\xe9\xd2\xe1\xe3\x09#>Rp\x88d\xe0(\x93\x01\xee\x99\x8c\"\x8a@\xa9uz0^\xb7GCw;\x9c\x89\xc1\xe4\xb2\xd9yN\xab\xa5\xdf\xb5\xfb}j\xc3M\x82y\xb2\xae\x90\xdb\x13\x82\xfe\xa3\x8f\xb7\xf7\x11\x08\xa2'h@x\xa8\xb8\xc8\xc8&F\xd3(\xf2e\x18\xf90Y\x19r\x89\xd9#\xc1\x84\x06\xb5\x89\xa1\x19\xaa1J*\x9asZ\xfa\x18\xa3\xeajE\xf9*\xeb\x12;k\x1bw\xdb\x90\x98\xfb\x97J\x0a\xf8\xe7w\xbb\xbbQkG\xcc\x9b\xac\xbc\xfc\xc6\xda\xca\xec\xe5\x0bM\x15\x0d\x8df\xa0e\xbd\xe4\x09e\xbcI}=\x9dU\xa5-\xcd\xec\xecm\xad\xbe\xce\xde\xee\xae\x81\xac\x1e\xff\x0b\xac+l;\x0fM\x9c\xfe\xfb~\xb0\xef/\x20:u\xa6\x96\x81\xe3\x17\xea\x20\xc1N\x17\xba\x19\x1cWM\x1c6r\x12\x13\x20\xfc\xe6,\xa0\xc6b\x8d\x1c\xf5i\xcc\xc7\x0c$\xa6z\xf6DV2\x99\x0c%/\x95\x1d[\xde\x1aX.\xcfB\x991-.dR\xc1\xa1\xb2\x82;\xcd=\xa49-\xa3\xcb\xa1D\x8b\x1eb9\xec\xe3\xca{\x0bH\x1a\x9du\xf1i\xa5\xa8R\x0f\xc1\xac\x88\xa5fV\xac\x14\xcf1l\xa23\x19O\xb1>{\x02='\xb4\xaa\xda\xb5l\xdb\xba}\xcb\xab\x00\x00;", - - "images/treeview-gray-line.gif": "GIF89a\x10\x00\xf0\x06\xf7\x00\x00\x00\x00\x00\x80\x80\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!\xf9\x04\x01\x00\x00\xff\x00,\x00\x00\x00\x00\x10\x00\xf0\x06\x00\x08\xff\x00\xff\x09\x1c\xf8/\x00\xc1\x83\x08\x0d\"\\X\x90\xe1B\x85\x0e\x09B\x8c(p\"E\x8b\x111:\xd4\xc80\x80\xc7\x8f\x1f\x1fR\x948r\x20G\x91%\x1b\xa6<\x990\xa5\xca\x92,\x0f\xc6$\xb9\xd2\xe5L\x936s\xd6\xdc\x09SgO\x9e#oV\xf4\x19\x94\xe8E\xa3\x19\x91nT\xda\x91)\xca\x9fP\x8b\x02=:5i\xd5\xa5W\x9bf}*5*U\xafV\xc1b\x15\xab\x95,\xd7\xaf]\xd3\xa2]\x1bVm[\xb6c\xdd\xc6\x85[Vn]\xbag\xdf\xea\x9d\xbb\xf7n\xdf\xbc|\x03\xfb\x15\x0cx\xb0\xe1\xc2\x88[nUl\x96\xb1\xdd\xc42\x9d:\xc6;\xf9oe\xc2\x97\x0fg\x86L\xb3q\xe4\xc5\x9f=w~\xbc\xb9th\xd2\xa7)\xa7\xb6\xbc\x1ask\xcd\xaf9\xe3\x04=Zum\xd6\xb7]\xe7\x86\xbd[\xf6P\xda\xb3E\x07G\xdd\xdbt\xf1\xd8\xc6\x87\xdbV\x8e\x9b\xb9n\xe7\xbc\xa1\xfb~I\xdc\xa5\xf5\xeb\xd8\xb3k\xdf\xce\xbd{\xf4\xdf\xc2\xc1W\xff\x17\xbf\x9c|s\xf3\xcf\xd1\x7f\xa7^\x9e\xfdy\xf7\xe9\xe1\xaf\x17*\x7f:\xfd\xfb\x92\x91\xeb?\xce_zr\xf5\xf6\xe5\xd7\x1f\x80\xff\xd5W\x20~\xc0\x11\xb8\x9f\x7f\x0b*8\xa0\x81\x0dB\xf8\x20\x82\xe1I\xc8\xe0\x84\x02^\xa8\xa1\x83\x1bZ\xc8\xe1\x87\x1e\x86H\xe1x\"f\x08\xe2\x88\xed\xa1\xf8\x9e\x8a\xf1\xb18\x9f\x89%&\x18c\x85.\x06(c\x8d\x07\xc2\x88c\x84;bx\xa3\x8e@\xfe($\x8dA\x129$\x89=v\x98\xe4\x89E\"\xd9d\x8aO\xae\x18e\x8bS\xbex$\x94WJ\x99%\x95[Zi\xe4\x97Nvi#\x98X\x92\xa9\xa5\x99\\\xa2\xe9e\x98j\x8e\xc9\xe6\x9be\xc2y\xa6\x9ci\xd2\xb9f\x9cx\xce\x99g\x9d{\xde\xa9\xe7\x9f|\x02\xeag\xa0\x84\x0ej\xa8\x9b}\"*\xa8\xa2\x852zh\x8ebB\xda\xa6\xa4v:j)\xa5\x89b\xba\xa8\xa6\x8dr\xfa(\x8fU^\x0aj\xa4\xa3NZj\xa5\x9e\x8a\xea\xa3\xa9\xab\xa2zj\xa6\xafn\xff\x1ak\xa7\xb3~\xda*\xac\xb7\xca\x9a+\xad\xbb\xda\xaad\xa8\xa9\x06[\xab\xaa\xbf\x92\xda+\xb1L\x1a[,\xab\xcb\xbaz\xac\xb0\xcf\x0e\x0bm\xb3\xb8R\xab\xab\xb5\xbcb\xebk\xb2\xccr\xeb\xac\xb6\xc8\xce\xf8\xad\xb7\xd5\x92{\xad\xb9\xd9\xa2\xbb\xad\xb8\xe5\xb2{\xae\xbb\xe9\xc2\xbb\xee\x92\xf2\x86K\xef\xbd\xc0J\xabo\xb4\xfc\x82;\xad\xba\xf6\xe6\xdb/\xc0\xff\xd6[0\xbe\xca\x12\xbc\xaf\xbf\x0b+<\xb0\xc1\x0dC\xfc0\xc2\xddJ\xcc\xf0\xc4\x02_\xac\xb1\xc3\x1b[\xcc\xf1\xc7\x1e\x87L\xf1\xb8\"g\x0c\xf2\xc8\xed\xa2\xfc\xae\xca\xf1\xb2<\xaf\xc9%'\x1cs\xc5.\x07,s\xcd\x07\xc3\x8cs\xc4;c|\xb3\xce@\xff,4\xcdA\x13=4\xc9=w\x9c\xf4\xc9E#\xddt\xcaO\xaf\x1cu\xcbS\xbf|4\xd4WK\x9d5\xd5[[m\xf4\xd7Nwm3\xd8X\x93\xad\xb5\xd9\\\xa3\xedu\xd8j\x8f\xcd\xf6\xdbe\xc3}\xb6\xdci\xd3\xbdv\xdcx\xcf\x9dw\xdd{\xdf\xff\xad\xf7\xdf|\x03\xeew\xe0\x84\x0fn\xb8\xdb}#.\xb8\xe2\x853~x\xcebC\xde\xb6\xe4v;n9\xe5\x89c\xbe\xb8\xe6\x8ds\xfe8\xcfU_\x0ez\xe4\xa3O^z\xe5\x9e\x8b\xee\xb3\xe9\xab\xa3~z\xe6\xafo\x1e{\xe7\xb3\x7f\xde:\xec\xb7\xcb\x9e;\xed\xbb\xdb\xaet\xe8\xa9\x07_\xbb\xea\xbf\x93\xde;\xf1L\x1b_<\xeb\xcb\xbb~\xbc\xf0\xcf\x0f\x0f}\xf3\xb8S\xaf\xbb\xf5\xbcc\xef{\xf2\xccs\xef\xbc\xf6\xc8\xcf\xfc\xbd\xf7\xd5\x93\x7f\xbd\xf9\xd9\xa3\xbf\xbd\xf8\xe5\xb3\x7f\xbe\xfb\xe9\xc3\xbf\xfe\xd2\xf2\x87O\xff\xfd\xc0K\xaf\x7f\xf4\xfc\x83?\xbd\xfa\xf6\xcb_\xff\x00\xf8\xbf\xfa\x15\x10\x7f\xca#\xe0\xfe\xfc\xb7@\x05\x0e\xd0\x80\x0d\x84\xe0\x03\x11\xd8=\x092p\x82\x02\xbc\xa0\x06\x1d\xb8A\x0br\xf0\x83\x1e\x0c!\x05\xc7'\xc2\x0c\x82p\x84\xedC\xe1\xfbT\x18?\x16\xce\xcf\x84%L`\x0c+\xe8\xc2\x00\xca\xb0\x86\x07\x84!\x0e#\xb8C\x0c\xdeP\x87@\xfc\xa1\x102i\x18D\"\x0e\x91\x84=\xec`\x12OXD$61\x85O\\a\x14[8\xc5\x17\x1e\x11\x8aW\x94b\x16\xa9\xb8E+\x1a\xf1\x8bN\xec\xa2\x0di\x08\x12\x90\x04\x04\x00;", - - "images/treeview-gray.gif": "GIF89a`\x00\x85\x00\xa1\x03\x00\x00\x00\x00\x80\x80\x80\xbc\xbc\xbc\xff\xff\xff!\xf9\x04\x01\x00\x00\x03\x00,\x00\x00\x00\x00`\x00\x85\x00\x00\x02\xfe\x9c\x8f\xa9\xcb\xed\x0f\x87\x98\xc2\xd1\x88\xb3\xde\xa8\xf2\x0f\x86\x9a'\x96\xa6I\x9e\xea\xca\xb6\xee\x1a\xc4\xb2\xfc\xd6f\xb0\xe0\xf6\xfe\xe9\x03p\xf0\xf1\x86\x11\x1f\xd0\x20$*\x198\x80\xd39\x98%\x97Kc\x90\x8aUX\x91\xd9.W\xeb\xedJg\xe1\xf2\xb4,F\xab\xcfj*\xbb\xad|\xc3\x87\xf2\xb9*u\xb5\xef\xf0_\xfdh\xf2p\x01\xe67RRG\x98\xc0\x87\xb8\xc8\xd8H8F\xe3\xa8rv(\x89Aiy\x82\x99i\xf8\xf3\x04$\xc5\xd9\x93#*\xb2Y::\x88\xca\x01\x19\xb3\xda\xf9\xaa\x19+;\x0b[\x1bRy\xdb\x90{\xab\xc8[\xeb;+\xd80\x8c\xf0K\xa8\xa8q\xec\x97\xac\xeb\xfc\x0c\x0d\xdd\xba\xfcz\x1a\xadz\x14u\xcdt\x90M\xbd\xda\xf4\x19E\xb6\xdd\xe7]\x8e\x9d\x87\xaen\xbcn\xdc\xea\x1e/?O_\xef\xd5,\x8f\xffJ\x81_\xec\x1c\x9c\x8fT@U\xee\x00\xdac7oZB\x81\xf1\xb6h\x93\xe7\xf0\x1b\xaapO\xc6E*\x17q\xa1\x81ms\x10\x19\xbaSx0\xa4\xc8\x91$%\x90\xd4W\xf0\x9a?\x05+{\x9d|Y2fL\x90\x0d=\xae\xb3v\xd3&:\x8aPB\xed\xd4\x89\x11\xe86\x9c;\xe1\xc9<\x8a4\xe9*\x94\xeb\x98\xa2sZ\xaa\xe5\x01\xa9\xd7$\xea\xb2z\x0bk-\xad\xb3\xb8\x96\xa2\xf9QhU\xb1\xd1\x88\x06\xfd\x04\x8a\\P\x829\xd9\xfet\x8b\xd1\xa8\xd2\xb9t\xeb\xda\xbd\x8b7\xaf\x82\x02\x00;", - - "implements.html": "\x0a\x09\x0a\x09\x09\xe2\x96\xb9\x20Implements

        \x0a\x09\x0a\x09\x0a\x09\x09\xe2\x96\xbe\x20Implements

        \x0a\x09\x09...\x0a\x09\x0a\x0a", - - "jquery.js": "/*!\x20jQuery\x20v1.8.2\x20jquery.com\x20|\x20jquery.org/license\x20*/\x0a(function(a,b){function\x20G(a){var\x20b=F[a]={};return\x20p.each(a.split(s),function(a,c){b[c]=!0}),b}function\x20J(a,c,d){if(d===b&&a.nodeType===1){var\x20e=\"data-\"+c.replace(I,\"-$1\").toLowerCase();d=a.getAttribute(e);if(typeof\x20d==\"string\"){try{d=d===\"true\"?!0:d===\"false\"?!1:d===\"null\"?null:+d+\"\"===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else\x20d=b}return\x20d}function\x20K(a){var\x20b;for(b\x20in\x20a){if(b===\"data\"&&p.isEmptyObject(a[b]))continue;if(b!==\"toJSON\")return!1}return!0}function\x20ba(){return!1}function\x20bb(){return!0}function\x20bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function\x20bi(a,b){do\x20a=a[b];while(a&&a.nodeType!==1);return\x20a}function\x20bj(a,b,c){b=b||0;if(p.isFunction(b))return\x20p.grep(a,function(a,d){var\x20e=!!b.call(a,d,a);return\x20e===c});if(b.nodeType)return\x20p.grep(a,function(a,d){return\x20a===b===c});if(typeof\x20b==\"string\"){var\x20d=p.grep(a,function(a){return\x20a.nodeType===1});if(be.test(b))return\x20p.filter(b,d,!c);b=p.filter(b,d)}return\x20p.grep(a,function(a,d){return\x20p.inArray(a,b)>=0===c})}function\x20bk(a){var\x20b=bl.split(\"|\"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return\x20c}function\x20bC(a,b){return\x20a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function\x20bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var\x20c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete\x20g.handle,g.events={};for(c\x20in\x20h)for(d=0,e=h[c].length;d\").appendTo(e.body),c=b.css(\"display\");b.remove();if(c===\"none\"||c===\"\"){bI=e.body.appendChild(bI||p.extend(e.createElement(\"iframe\"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write(\"\"),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,\"display\"),e.body.removeChild(bI)}return\x20bS[a]=c,c}function\x20ci(a,b,c,d){var\x20e;if(p.isArray(b))p.each(b,function(b,e){c||ce.test(a)?d(a,e):ci(a+\"[\"+(typeof\x20e==\"object\"?b:\"\")+\"]\",e,c,d)});else\x20if(!c&&p.type(b)===\"object\")for(e\x20in\x20b)ci(a+\"[\"+e+\"]\",b[e],c,d);else\x20d(a,b)}function\x20cz(a){return\x20function(b,c){typeof\x20b!=\"string\"&&(c=b,b=\"*\");var\x20d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h)[^>]*$|#([\\w\\-]*)$)/,v=/^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,w=/^[\\],:{}\\s]*$/,x=/(?:^|:|,)(?:\\s*\\[)+/g,y=/\\\\(?:[\"\\\\\\/bfnrt]|u[\\da-fA-F]{4})/g,z=/\"[^\"\\\\\\r\\n]*\"|true|false|null|-?(?:\\d\\d*\\.|)\\d+(?:[eE][\\-+]?\\d+|)/g,A=/^-ms-/,B=/-([\\da-z])/gi,C=function(a,b){return(b+\"\").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener(\"DOMContentLoaded\",D,!1),p.ready()):e.readyState===\"complete\"&&(e.detachEvent(\"onreadystatechange\",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var\x20f,g,h,i;if(!a)return\x20this;if(a.nodeType)return\x20this.context=this[0]=a,this.length=1,this;if(typeof\x20a==\"string\"){a.charAt(0)===\"<\"&&a.charAt(a.length-1)===\">\"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return\x20c=c\x20instanceof\x20p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return\x20d.find(a);this.length=1,this[0]=g}return\x20this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return\x20p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:\"\",jquery:\"1.8.2\",length:0,size:function(){return\x20this.length},toArray:function(){return\x20k.call(this)},get:function(a){return\x20a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var\x20d=p.merge(this.constructor(),a);return\x20d.prevObject=this,d.context=this.context,b===\"find\"?d.selector=this.selector+(this.selector?\"\x20\":\"\")+c:b&&(d.selector=this.selector+\".\"+b+\"(\"+c+\")\"),d},each:function(a,b){return\x20p.each(this,a,b)},ready:function(a){return\x20p.ready.promise().done(a),this},eq:function(a){return\x20a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return\x20this.eq(0)},last:function(){return\x20this.eq(-1)},slice:function(){return\x20this.pushStack(k.apply(this,arguments),\"slice\",k.call(arguments).join(\",\"))},map:function(a){return\x20this.pushStack(p.map(this,function(b,c){return\x20a.call(b,c,b)}))},end:function(){return\x20this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var\x20a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof\x20h==\"boolean\"&&(k=h,h=arguments[1]||{},i=2),typeof\x20h!=\"object\"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger(\"ready\").off(\"ready\")},isFunction:function(a){return\x20p.type(a)===\"function\"},isArray:Array.isArray||function(a){return\x20p.type(a)===\"array\"},isWindow:function(a){return\x20a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return\x20a==null?String(a):E[m.call(a)]||\"object\"},isPlainObject:function(a){if(!a||p.type(a)!==\"object\"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,\"constructor\")&&!n.call(a.constructor.prototype,\"isPrototypeOf\"))return!1}catch(c){return!1}var\x20d;for(d\x20in\x20a);return\x20d===b||n.call(a,d)},isEmptyObject:function(a){var\x20b;for(b\x20in\x20a)return!1;return!0},error:function(a){throw\x20new\x20Error(a)},parseHTML:function(a,b,c){var\x20d;return!a||typeof\x20a!=\"string\"?null:(typeof\x20b==\"boolean\"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof\x20b!=\"string\")return\x20null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return\x20a.JSON.parse(b);if(w.test(b.replace(y,\"@\").replace(z,\"]\").replace(x,\"\")))return(new\x20Function(\"return\x20\"+b))();p.error(\"Invalid\x20JSON:\x20\"+b)},parseXML:function(c){var\x20d,e;if(!c||typeof\x20c!=\"string\")return\x20null;try{a.DOMParser?(e=new\x20DOMParser,d=e.parseFromString(c,\"text/xml\")):(d=new\x20ActiveXObject(\"Microsoft.XMLDOM\"),d.async=\"false\",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName(\"parsererror\").length)&&p.error(\"Invalid\x20XML:\x20\"+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return\x20a.replace(A,\"ms-\").replace(B,C)},nodeName:function(a,b){return\x20a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,c,d){var\x20e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e\x20in\x20a)if(c.apply(a[e],d)===!1)break}else\x20for(;f0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return\x20p.inArray(a,i)>-1},empty:function(){return\x20i=[],this},disable:function(){return\x20i=j=c=b,this},disabled:function(){return!i},lock:function(){return\x20j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return\x20b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return\x20l.fireWith(this,arguments),this},fired:function(){return!!d}};return\x20l},p.extend({Deferred:function(a){var\x20b=[[\"resolve\",\"done\",p.Callbacks(\"once\x20memory\"),\"resolved\"],[\"reject\",\"fail\",p.Callbacks(\"once\x20memory\"),\"rejected\"],[\"notify\",\"progress\",p.Callbacks(\"memory\")]],c=\"pending\",d={state:function(){return\x20c},always:function(){return\x20e.done(arguments).fail(arguments),this},then:function(){var\x20a=arguments;return\x20p.Deferred(function(c){p.each(b,function(b,d){var\x20f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var\x20a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+\"With\"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return\x20a!=null?p.extend(a,d):d}},e={};return\x20d.pipe=d.then,p.each(b,function(a,f){var\x20g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+\"With\"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var\x20b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promise)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return\x20function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new\x20Array(d),i=new\x20Array(d),j=new\x20Array(d);for(;b
        a\",c=n.getElementsByTagName(\"*\"),d=n.getElementsByTagName(\"a\")[0],d.style.cssText=\"top:1px;float:left;opacity:.5\";if(!c||!c.length)return{};f=e.createElement(\"select\"),g=f.appendChild(e.createElement(\"option\")),h=n.getElementsByTagName(\"input\")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName(\"tbody\").length,htmlSerialize:!!n.getElementsByTagName(\"link\").length,style:/top/.test(d.getAttribute(\"style\")),hrefNormalized:d.getAttribute(\"href\")===\"/a\",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value===\"on\",optSelected:g.selected,getSetAttribute:n.className!==\"t\",enctype:!!e.createElement(\"form\").enctype,html5Clone:e.createElement(\"nav\").cloneNode(!0).outerHTML!==\"<:nav>\",boxModel:e.compatMode===\"CSS1Compat\",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete\x20n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent(\"onclick\",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent(\"onclick\"),n.detachEvent(\"onclick\",m)),h=e.createElement(\"input\"),h.value=\"t\",h.setAttribute(\"type\",\"radio\"),b.radioValue=h.value===\"t\",h.setAttribute(\"checked\",\"checked\"),h.setAttribute(\"name\",\"t\"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k\x20in{submit:!0,change:!0,focusin:!0})j=\"on\"+k,l=j\x20in\x20n,l||(n.setAttribute(j,\"return;\"),l=typeof\x20n[j]==\"function\"),b[k+\"Bubbles\"]=l;return\x20p(function(){var\x20c,d,f,g,h=\"padding:0;margin:0;border:0;display:block;overflow:hidden;\",i=e.getElementsByTagName(\"body\")[0];if(!i)return;c=e.createElement(\"div\"),c.style.cssText=\"visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px\",i.insertBefore(c,i.firstChild),d=e.createElement(\"div\"),c.appendChild(d),d.innerHTML=\"
        t
        \",f=d.getElementsByTagName(\"td\"),f[0].style.cssText=\"padding:0;margin:0;border:0;display:none\",l=f[0].offsetHeight===0,f[0].style.display=\"\",f[1].style.display=\"none\",b.reliableHiddenOffsets=l&&f[0].offsetHeight===0,d.innerHTML=\"\",d.style.cssText=\"box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;\",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!==\"1%\",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:\"4px\"}).width===\"4px\",g=e.createElement(\"div\"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width=\"0\",d.style.width=\"1px\",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof\x20d.style.zoom!=\"undefined\"&&(d.innerHTML=\"\",d.style.cssText=h+\"width:1px;padding:1px;display:inline;zoom:1\",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display=\"block\",d.style.overflow=\"visible\",d.innerHTML=\"
        \",d.firstChild.style.width=\"5px\",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.removeChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var\x20H=/(?:\\{[\\s\\S]*\\}|\\[[\\s\\S]*\\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:\"jQuery\"+(p.fn.jquery+Math.random()).replace(/\\D/g,\"\"),noData:{embed:!0,object:\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",applet:!0},hasData:function(a){return\x20a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var\x20f,g,h=p.expando,i=typeof\x20c==\"string\",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||p.guid++:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof\x20c==\"object\"||typeof\x20c==\"function\")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return\x20f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var\x20d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]:p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b\x20in\x20d?b=[b]:(b=p.camelCase(b),b\x20in\x20d?b=[b]:b=b.split(\"\x20\")));for(e=0,f=b.length;e1,null,!1))},removeData:function(a){return\x20this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var\x20d;if(a)return\x20b=(b||\"fx\")+\"queue\",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||\"fx\";var\x20c=p.queue(a,b),d=c.length,e=c.shift(),f=p._queueHooks(a,b),g=function(){p.dequeue(a,b)};e===\"inprogress\"&&(e=c.shift(),d--),e&&(b===\"fx\"&&c.unshift(\"inprogress\"),delete\x20f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var\x20c=b+\"queueHooks\";return\x20p._data(a,c)||p._data(a,c,{empty:p.Callbacks(\"once\x20memory\").add(function(){p.removeData(a,b+\"queue\",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var\x20d=2;return\x20typeof\x20a!=\"string\"&&(c=a,a=\"fx\",d--),arguments.length1)},removeAttr:function(a){return\x20this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return\x20p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return\x20a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete\x20this[a]}catch(c){}})},addClass:function(a){var\x20b,c,d,e,f,g,h;if(p.isFunction(a))return\x20this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof\x20a==\"string\"){b=a.split(s);for(c=0,d=this.length;c=0)d=d.replace(\"\x20\"+c[f]+\"\x20\",\"\x20\");e.className=a?p.trim(d):\"\"}}}return\x20this},toggleClass:function(a,b){var\x20c=typeof\x20a,d=typeof\x20b==\"boolean\";return\x20p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c===\"string\"){var\x20e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?\"addClass\":\"removeClass\"](e)}else\x20if(c===\"undefined\"||c===\"boolean\")this.className&&p._data(this,\"__className__\",this.className),this.className=this.className||a===!1?\"\":p._data(this,\"__className__\")||\"\"})},hasClass:function(a){var\x20b=\"\x20\"+a+\"\x20\",c=0,d=this.length;for(;c=0)return!0;return!1},val:function(a){var\x20c,d,e,f=this[0];if(!arguments.length){if(f)return\x20c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],c&&\"get\"in\x20c&&(d=c.get(f,\"value\"))!==b?d:(d=f.value,typeof\x20d==\"string\"?d.replace(P,\"\"):d==null?\"\":d);return}return\x20e=p.isFunction(a),this.each(function(d){var\x20f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f=\"\":typeof\x20f==\"number\"?f+=\"\":p.isArray(f)&&(f=p.map(f,function(a){return\x20a==null?\"\":a+\"\"})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!(\"set\"in\x20c)||c.set(this,f,\"value\")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var\x20b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var\x20b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type===\"select-one\";if(f<0)return\x20null;c=i?f:0,d=i?f+1:h.length;for(;c=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var\x20f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return\x20p(a)[c](d);if(typeof\x20a.getAttribute==\"undefined\")return\x20p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return\x20g&&\"set\"in\x20g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,d+\"\"),d)}return\x20g&&\"get\"in\x20g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var\x20c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g=0}})});var\x20V=/^(?:textarea|input|select)$/i,W=/^([^\\.]*|)(?:\\.(.+)|)$/,X=/(?:^|\\s)hover(\\.\\S+|)\\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return\x20p.event.special.hover?a:a.replace(X,\"mouseenter$1\x20mouseleave$1\")};p.event={add:function(a,c,d,e,f){var\x20g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c||!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return\x20typeof\x20p!=\"undefined\"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(\"\x20\");for(j=0;j=0&&(s=s.slice(0,-1),i=!0),s.indexOf(\".\")>=0&&(t=s.split(\".\"),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof\x20c==\"object\"?c[p.expando]?c:new\x20p.Event(s,c):new\x20p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join(\".\"),c.namespace_re=c.namespace?new\x20RegExp(\"(^|\\\\.)\"+t.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,m=s.indexOf(\":\")<0?\"on\"+s:\"\";if(!f){h=p.cache;for(j\x20in\x20h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;j=0:p.find(m,this,null,[f]).length),h[m]&&j.push(l);j.length&&u.push({elem:f,matches:j})}o.length>q&&u.push({elem:this,matches:o.slice(q)});for(d=0;d0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function\x20bc(a,b,c,d){c=c||[],b=b||r;var\x20e,f,i,j,k=b.nodeType;if(!a||typeof\x20a!=\"string\")return\x20c;if(k!==1&&k!==9)return[];i=g(b);if(!i&&!d)if(e=P.exec(a))if(j=e[1]){if(k===9){f=b.getElementById(j);if(!f||!f.parentNode)return\x20c;if(f.id===j)return\x20c.push(f),c}else\x20if(b.ownerDocument&&(f=b.ownerDocument.getElementById(j))&&h(b,f)&&f.id===j)return\x20c.push(f),c}else{if(e[2])return\x20w.apply(c,x.call(b.getElementsByTagName(a),0)),c;if((j=e[3])&&_&&b.getElementsByClassName)return\x20w.apply(c,x.call(b.getElementsByClassName(j),0)),c}return\x20bp(a.replace(L,\"$1\"),b,c,d,i)}function\x20bd(a){return\x20function(b){var\x20c=b.nodeName.toLowerCase();return\x20c===\"input\"&&b.type===a}}function\x20be(a){return\x20function(b){var\x20c=b.nodeName.toLowerCase();return(c===\"input\"||c===\"button\")&&b.type===a}}function\x20bf(a){return\x20z(function(b){return\x20b=+b,z(function(c,d){var\x20e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function\x20bg(a,b,c){if(a===b)return\x20c;var\x20d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return\x201}function\x20bh(a,b){var\x20c,d,f,g,h,i,j,k=C[o][a];if(k)return\x20b?0:k.slice(0);h=a,i=[],j=e.preFilter;while(h){if(!c||(d=M.exec(h)))d&&(h=h.slice(d[0].length)),i.push(f=[]);c=!1;if(d=N.exec(h))f.push(c=new\x20q(d.shift())),h=h.slice(c.length),c.type=d[0].replace(L,\"\x20\");for(g\x20in\x20e.filter)(d=W[g].exec(h))&&(!j[g]||(d=j[g](d,r,!0)))&&(f.push(c=new\x20q(d.shift())),h=h.slice(c.length),c.type=g,c.matches=d);if(!c)break}return\x20b?h.length:h?bc.error(a):C(a,i).slice(0)}function\x20bi(a,b,d){var\x20e=b.dir,f=d&&b.dir===\"parentNode\",g=u++;return\x20b.first?function(b,c,d){while(b=b[e])if(f||b.nodeType===1)return\x20a(b,c,d)}:function(b,d,h){if(!h){var\x20i,j=t+\"\x20\"+g+\"\x20\",k=j+c;while(b=b[e])if(f||b.nodeType===1){if((i=b[o])===k)return\x20b.sizset;if(typeof\x20i==\"string\"&&i.indexOf(j)===0){if(b.sizset)return\x20b}else{b[o]=k;if(a(b,d,h))return\x20b.sizset=!0,b;b.sizset=!1}}}else\x20while(b=b[e])if(f||b.nodeType===1)if(a(b,d,h))return\x20b}}function\x20bj(a){return\x20a.length>1?function(b,c,d){var\x20e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function\x20bk(a,b,c,d,e){var\x20f,g=[],h=0,i=a.length,j=b!=null;for(;h-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==l)||((b=c).nodeType?j(a,c,d):k(a,c,d))}];for(;i1&&bj(m),i>1&&a.slice(0,i-1).join(\"\").replace(L,\"$1\"),c,i0,f=a.length>0,g=function(h,i,j,k,m){var\x20n,o,p,q=[],s=0,u=\"0\",x=h&&[],y=m!=null,z=l,A=h||f&&e.find.TAG(\"*\",m&&i.parentNode||i),B=t+=z==null?1:Math.E;y&&(l=i!==r&&i,c=g.el);for(;(n=A[u])!=null;u++){if(f&&n){for(o=0;p=a[o];o++)if(p(n,i,j)){k.push(n);break}y&&(t=B,c=++g.el)}d&&((n=!p&&n)&&s--,h&&x.push(n))}s+=u;if(d&&u!==s){for(o=0;p=b[o];o++)p(x,q,i,j);if(h){if(s>0)while(u--)!x[u]&&!q[u]&&(q[u]=v.call(k));q=bk(q)}w.apply(k,q),y&&!h&&q.length>0&&s+b.length>1&&bc.uniqueSort(k)}return\x20y&&(t=B,l=z),x};return\x20g.el=0,d?z(g):g}function\x20bo(a,b,c,d){var\x20e=0,f=b.length;for(;e2&&(j=h[0]).type===\"ID\"&&b.nodeType===9&&!f&&e.relative[h[1].type]){b=e.find.ID(j.matches[0].replace(V,\"\"),b,f)[0];if(!b)return\x20c;a=a.slice(h.shift().length)}for(g=W.POS.test(a)?-1:h.length-1;g>=0;g--){j=h[g];if(e.relative[k=j.type])break;if(l=e.find[k])if(d=l(j.matches[0].replace(V,\"\"),R.test(h[0].type)&&b.parentNode||b,f)){h.splice(g,1),a=d.length&&h.join(\"\");if(!a)return\x20w.apply(c,x.call(d,0)),c;break}}}return\x20i(a,m)(d,b,f,c,R.test(a)),c}function\x20bq(){}var\x20c,d,e,f,g,h,i,j,k,l,m=!0,n=\"undefined\",o=(\"sizcache\"+Math.random()).replace(\".\",\"\"),q=String,r=a.document,s=r.documentElement,t=0,u=0,v=[].pop,w=[].push,x=[].slice,y=[].indexOf||function(a){var\x20b=0,c=this.length;for(;be.cacheLength&&delete\x20a[b.shift()],a[c]=d},a)},B=A(),C=A(),D=A(),E=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",F=\"(?:\\\\\\\\.|[-\\\\w]|[^\\\\x00-\\\\xa0])+\",G=F.replace(\"w\",\"w#\"),H=\"([*^$|!~]?=)\",I=\"\\\\[\"+E+\"*(\"+F+\")\"+E+\"*(?:\"+H+E+\"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\"+G+\")|)|)\"+E+\"*\\\\]\",J=\":(\"+F+\")(?:\\\\((?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\2|([^()[\\\\]]*|(?:(?:\"+I+\")|[^:]|\\\\\\\\.)*|.*))\\\\)|)\",K=\":(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+E+\"*((?:-\\\\d)?\\\\d*)\"+E+\"*\\\\)|)(?=[^-]|$)\",L=new\x20RegExp(\"^\"+E+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+E+\"+$\",\"g\"),M=new\x20RegExp(\"^\"+E+\"*,\"+E+\"*\"),N=new\x20RegExp(\"^\"+E+\"*([\\\\x20\\\\t\\\\r\\\\n\\\\f>+~])\"+E+\"*\"),O=new\x20RegExp(J),P=/^(?:#([\\w\\-]+)|(\\w+)|\\.([\\w\\-]+))$/,Q=/^:not/,R=/[\\x20\\t\\r\\n\\f]*[+~]/,S=/:not\\($/,T=/h\\d/i,U=/input|select|textarea|button/i,V=/\\\\(?!\\\\)/g,W={ID:new\x20RegExp(\"^#(\"+F+\")\"),CLASS:new\x20RegExp(\"^\\\\.(\"+F+\")\"),NAME:new\x20RegExp(\"^\\\\[name=['\\\"]?(\"+F+\")['\\\"]?\\\\]\"),TAG:new\x20RegExp(\"^(\"+F.replace(\"w\",\"w*\")+\")\"),ATTR:new\x20RegExp(\"^\"+I),PSEUDO:new\x20RegExp(\"^\"+J),POS:new\x20RegExp(K,\"i\"),CHILD:new\x20RegExp(\"^:(only|nth|first|last)-child(?:\\\\(\"+E+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+E+\"*(?:([+-]|)\"+E+\"*(\\\\d+)|))\"+E+\"*\\\\)|)\",\"i\"),needsContext:new\x20RegExp(\"^\"+E+\"*[>+~]|\"+K,\"i\")},X=function(a){var\x20b=r.createElement(\"div\");try{return\x20a(b)}catch(c){return!1}finally{b=null}},Y=X(function(a){return\x20a.appendChild(r.createComment(\"\")),!a.getElementsByTagName(\"*\").length}),Z=X(function(a){return\x20a.innerHTML=\"\",a.firstChild&&typeof\x20a.firstChild.getAttribute!==n&&a.firstChild.getAttribute(\"href\")===\"#\"}),$=X(function(a){a.innerHTML=\"\";var\x20b=typeof\x20a.lastChild.getAttribute(\"multiple\");return\x20b!==\"boolean\"&&b!==\"string\"}),_=X(function(a){return\x20a.innerHTML=\"\",!a.getElementsByClassName||!a.getElementsByClassName(\"e\").length?!1:(a.lastChild.className=\"e\",a.getElementsByClassName(\"e\").length===2)}),ba=X(function(a){a.id=o+0,a.innerHTML=\"\",s.insertBefore(a,s.firstChild);var\x20b=r.getElementsByName&&r.getElementsByName(o).length===2+r.getElementsByName(o+0).length;return\x20d=!r.getElementById(o),s.removeChild(a),b});try{x.call(s.childNodes,0)[0].nodeType}catch(bb){x=function(a){var\x20b,c=[];for(;b=this[a];a++)c.push(b);return\x20c}}bc.matches=function(a,b){return\x20bc(a,null,null,b)},bc.matchesSelector=function(a,b){return\x20bc(b,null,null,[a]).length>0},f=bc.getText=function(a){var\x20b,c=\"\",d=0,e=a.nodeType;if(e){if(e===1||e===9||e===11){if(typeof\x20a.textContent==\"string\")return\x20a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=f(a)}else\x20if(e===3||e===4)return\x20a.nodeValue}else\x20for(;b=a[d];d++)c+=f(b);return\x20c},g=bc.isXML=function(a){var\x20b=a&&(a.ownerDocument||a).documentElement;return\x20b?b.nodeName!==\"HTML\":!1},h=bc.contains=s.contains?function(a,b){var\x20c=a.nodeType===9?a.documentElement:a,d=b&&b.parentNode;return\x20a===d||!!(d&&d.nodeType===1&&c.contains&&c.contains(d))}:s.compareDocumentPosition?function(a,b){return\x20b&&!!(a.compareDocumentPosition(b)&16)}:function(a,b){while(b=b.parentNode)if(b===a)return!0;return!1},bc.attr=function(a,b){var\x20c,d=g(a);return\x20d||(b=b.toLowerCase()),(c=e.attrHandle[b])?c(a):d||$?a.getAttribute(b):(c=a.getAttributeNode(b),c?typeof\x20a[b]==\"boolean\"?a[b]?b:null:c.specified?c.value:null:null)},e=bc.selectors={cacheLength:50,createPseudo:z,match:W,attrHandle:Z?{}:{href:function(a){return\x20a.getAttribute(\"href\",2)},type:function(a){return\x20a.getAttribute(\"type\")}},find:{ID:d?function(a,b,c){if(typeof\x20b.getElementById!==n&&!c){var\x20d=b.getElementById(a);return\x20d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof\x20c.getElementById!==n&&!d){var\x20e=c.getElementById(a);return\x20e?e.id===a||typeof\x20e.getAttributeNode!==n&&e.getAttributeNode(\"id\").value===a?[e]:b:[]}},TAG:Y?function(a,b){if(typeof\x20b.getElementsByTagName!==n)return\x20b.getElementsByTagName(a)}:function(a,b){var\x20c=b.getElementsByTagName(a);if(a===\"*\"){var\x20d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return\x20e}return\x20c},NAME:ba&&function(a,b){if(typeof\x20b.getElementsByName!==n)return\x20b.getElementsByName(name)},CLASS:_&&function(a,b,c){if(typeof\x20b.getElementsByClassName!==n&&!c)return\x20b.getElementsByClassName(a)}},relative:{\">\":{dir:\"parentNode\",first:!0},\"\x20\":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(a){return\x20a[1]=a[1].replace(V,\"\"),a[3]=(a[4]||a[5]||\"\").replace(V,\"\"),a[2]===\"~=\"&&(a[3]=\"\x20\"+a[3]+\"\x20\"),a.slice(0,4)},CHILD:function(a){return\x20a[1]=a[1].toLowerCase(),a[1]===\"nth\"?(a[2]||bc.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]===\"even\"||a[2]===\"odd\")),a[4]=+(a[6]+a[7]||a[2]===\"odd\")):a[2]&&bc.error(a[0]),a},PSEUDO:function(a){var\x20b,c;if(W.CHILD.test(a[0]))return\x20null;if(a[3])a[2]=a[3];else\x20if(b=a[4])O.test(b)&&(c=bh(b,!0))&&(c=b.indexOf(\")\",b.length-c)-b.length)&&(b=b.slice(0,c),a[0]=a[0].slice(0,c)),a[2]=b;return\x20a.slice(0,3)}},filter:{ID:d?function(a){return\x20a=a.replace(V,\"\"),function(b){return\x20b.getAttribute(\"id\")===a}}:function(a){return\x20a=a.replace(V,\"\"),function(b){var\x20c=typeof\x20b.getAttributeNode!==n&&b.getAttributeNode(\"id\");return\x20c&&c.value===a}},TAG:function(a){return\x20a===\"*\"?function(){return!0}:(a=a.replace(V,\"\").toLowerCase(),function(b){return\x20b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var\x20b=B[o][a];return\x20b||(b=B(a,new\x20RegExp(\"(^|\"+E+\")\"+a+\"(\"+E+\"|$)\"))),function(a){return\x20b.test(a.className||typeof\x20a.getAttribute!==n&&a.getAttribute(\"class\")||\"\")}},ATTR:function(a,b,c){return\x20function(d,e){var\x20f=bc.attr(d,a);return\x20f==null?b===\"!=\":b?(f+=\"\",b===\"=\"?f===c:b===\"!=\"?f!==c:b===\"^=\"?c&&f.indexOf(c)===0:b===\"*=\"?c&&f.indexOf(c)>-1:b===\"$=\"?c&&f.substr(f.length-c.length)===c:b===\"~=\"?(\"\x20\"+f+\"\x20\").indexOf(c)>-1:b===\"|=\"?f===c||f.substr(0,c.length+1)===c+\"-\":!1):!0}},CHILD:function(a,b,c,d){return\x20a===\"nth\"?function(a){var\x20b,e,f=a.parentNode;if(c===1&&d===0)return!0;if(f){e=0;for(b=f.firstChild;b;b=b.nextSibling)if(b.nodeType===1){e++;if(a===b)break}}return\x20e-=d,e===c||e%c===0&&e/c>=0}:function(b){var\x20c=b;switch(a){case\"only\":case\"first\":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a===\"first\")return!0;c=b;case\"last\":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b){var\x20c,d=e.pseudos[a]||e.setFilters[a.toLowerCase()]||bc.error(\"unsupported\x20pseudo:\x20\"+a);return\x20d[o]?d(b):d.length>1?(c=[a,a,\"\",b],e.setFilters.hasOwnProperty(a.toLowerCase())?z(function(a,c){var\x20e,f=d(a,b),g=f.length;while(g--)e=y.call(a,f[g]),a[e]=!(c[e]=f[g])}):function(a){return\x20d(a,0,c)}):d}},pseudos:{not:z(function(a){var\x20b=[],c=[],d=i(a.replace(L,\"$1\"));return\x20d[o]?z(function(a,b,c,e){var\x20f,g=d(a,null,e,[]),h=a.length;while(h--)if(f=g[h])a[h]=!(b[h]=f)}):function(a,e,f){return\x20b[0]=a,d(b,null,f,c),!c.pop()}}),has:z(function(a){return\x20function(b){return\x20bc(a,b).length>0}}),contains:z(function(a){return\x20function(b){return(b.textContent||b.innerText||f(b)).indexOf(a)>-1}}),enabled:function(a){return\x20a.disabled===!1},disabled:function(a){return\x20a.disabled===!0},checked:function(a){var\x20b=a.nodeName.toLowerCase();return\x20b===\"input\"&&!!a.checked||b===\"option\"&&!!a.selected},selected:function(a){return\x20a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!e.pseudos.empty(a)},empty:function(a){var\x20b;a=a.firstChild;while(a){if(a.nodeName>\"@\"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},header:function(a){return\x20T.test(a.nodeName)},text:function(a){var\x20b,c;return\x20a.nodeName.toLowerCase()===\"input\"&&(b=a.type)===\"text\"&&((c=a.getAttribute(\"type\"))==null||c.toLowerCase()===b)},radio:bd(\"radio\"),checkbox:bd(\"checkbox\"),file:bd(\"file\"),password:bd(\"password\"),image:bd(\"image\"),submit:be(\"submit\"),reset:be(\"reset\"),button:function(a){var\x20b=a.nodeName.toLowerCase();return\x20b===\"input\"&&a.type===\"button\"||b===\"button\"},input:function(a){return\x20U.test(a.nodeName)},focus:function(a){var\x20b=a.ownerDocument;return\x20a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return\x20a===a.ownerDocument.activeElement},first:bf(function(a,b,c){return[0]}),last:bf(function(a,b,c){return[b-1]}),eq:bf(function(a,b,c){return[c<0?c+b:c]}),even:bf(function(a,b,c){for(var\x20d=0;d=0;)a.push(d);return\x20a}),gt:bf(function(a,b,c){for(var\x20d=c<0?c+b:c;++d\",a.querySelectorAll(\"[selected]\").length||e.push(\"\\\\[\"+E+\"*(?:checked|disabled|ismap|multiple|readonly|selected|value)\"),a.querySelectorAll(\":checked\").length||e.push(\":checked\")}),X(function(a){a.innerHTML=\"

        \",a.querySelectorAll(\"[test^='']\").length&&e.push(\"[*^$]=\"+E+\"*(?:\\\"\\\"|'')\"),a.innerHTML=\"\",a.querySelectorAll(\":enabled\").length||e.push(\":enabled\",\":disabled\")}),e=new\x20RegExp(e.join(\"|\")),bp=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a))){var\x20i,j,k=!0,l=o,m=d,n=d.nodeType===9&&a;if(d.nodeType===1&&d.nodeName.toLowerCase()!==\"object\"){i=bh(a),(k=d.getAttribute(\"id\"))?l=k.replace(c,\"\\\\$&\"):d.setAttribute(\"id\",l),l=\"[id='\"+l+\"']\x20\",j=i.length;while(j--)i[j]=l+i[j].join(\"\");m=R.test(a)&&d.parentNode||d,n=i.join(\",\")}if(n)try{return\x20w.apply(f,x.call(m.querySelectorAll(n),0)),f}catch(p){}finally{k||d.removeAttribute(\"id\")}}return\x20b(a,d,f,g,h)},h&&(X(function(b){a=h.call(b,\"div\");try{h.call(b,\"[test!='']:sizzle\"),f.push(\"!=\",J)}catch(c){}}),f=new\x20RegExp(f.join(\"|\")),bc.matchesSelector=function(b,c){c=c.replace(d,\"='$1']\");if(!g(b)&&!f.test(c)&&(!e||!e.test(c)))try{var\x20i=h.call(b,c);if(i||a||b.document&&b.document.nodeType!==11)return\x20i}catch(j){}return\x20bc(c,null,null,[b]).length>0})}(),e.pseudos.nth=e.pseudos.eq,e.filters=bq.prototype=e.pseudos,e.setFilters=new\x20bq,bc.attr=p.attr,p.find=bc,p.expr=bc.selectors,p.expr[\":\"]=p.expr.pseudos,p.unique=bc.uniqueSort,p.text=bc.getText,p.isXMLDoc=bc.isXML,p.contains=bc.contains}(a);var\x20bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\\[\\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend({find:function(a){var\x20b,c,d,e,f,g,h=this;if(typeof\x20a!=\"string\")return\x20p(a).filter(function(){for(b=0,c=h.length;b0)for(e=d;e=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var\x20c,d=0,e=this.length,f=[],g=bf.test(a)||typeof\x20a!=\"string\"?p(a,b||this.context):0;for(;d-1:p.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}}return\x20f=f.length>1?p.unique(f):f,this.pushStack(f,\"closest\",a)},index:function(a){return\x20a?typeof\x20a==\"string\"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var\x20c=typeof\x20a==\"string\"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return\x20this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return\x20this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var\x20b=a.parentNode;return\x20b&&b.nodeType!==11?b:null},parents:function(a){return\x20p.dir(a,\"parentNode\")},parentsUntil:function(a,b,c){return\x20p.dir(a,\"parentNode\",c)},next:function(a){return\x20bi(a,\"nextSibling\")},prev:function(a){return\x20bi(a,\"previousSibling\")},nextAll:function(a){return\x20p.dir(a,\"nextSibling\")},prevAll:function(a){return\x20p.dir(a,\"previousSibling\")},nextUntil:function(a,b,c){return\x20p.dir(a,\"nextSibling\",c)},prevUntil:function(a,b,c){return\x20p.dir(a,\"previousSibling\",c)},siblings:function(a){return\x20p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return\x20p.sibling(a.firstChild)},contents:function(a){return\x20p.nodeName(a,\"iframe\")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var\x20e=p.map(this,b,c);return\x20bc.test(a)||(d=c),d&&typeof\x20d==\"string\"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(\",\"))}}),p.extend({filter:function(a,b,c){return\x20c&&(a=\":not(\"+a+\")\"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var\x20e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return\x20e},sibling:function(a,b){var\x20c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return\x20c}});var\x20bl=\"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",bm=/\x20jQuery\\d+=\"(?:null|\\d+)\"/g,bn=/^\\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,bp=/<([\\w:]+)/,bq=/]\",\"i\"),bv=/^(?:checkbox|radio)$/,bw=/checked\\s*(?:[^=]|=\\s*.checked.)/i,bx=/\\/(java|ecma)script/i,by=/^\\s*\\s*$/g,bz={option:[1,\"\",\"\"],legend:[1,\"
        \",\"
        \"],thead:[1,\"\",\"
        \"],tr:[2,\"\",\"
        \"],td:[3,\"\",\"
        \"],col:[2,\"\",\"
        \"],area:[1,\"\",\"\"],_default:[0,\"\",\"\"]},bA=bk(e),bB=bA.appendChild(e.createElement(\"div\"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.htmlSerialize||(bz._default=[1,\"X
        \",\"
        \"]),p.fn.extend({text:function(a){return\x20p.access(this,function(a){return\x20a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return\x20this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var\x20b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var\x20a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return\x20a}).append(this)}return\x20this},wrapInner:function(a){return\x20p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var\x20b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var\x20b=p.isFunction(a);return\x20this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return\x20this.parent().each(function(){p.nodeName(this,\"body\")||p(this).replaceWith(this.childNodes)}).end()},append:function(){return\x20this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return\x20this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return\x20this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var\x20a=p.clean(arguments);return\x20this.pushStack(p.merge(a,this),\"before\",this.selector)}},after:function(){if(!bh(this[0]))return\x20this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var\x20a=p.clean(arguments);return\x20this.pushStack(p.merge(this,a),\"after\",this.selector)}},remove:function(a,b){var\x20c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName(\"*\")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return\x20this},empty:function(){var\x20a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName(\"*\"));while(a.firstChild)a.removeChild(a.firstChild)}return\x20this},clone:function(a,b){return\x20a=a==null?!1:a,b=b==null?a:b,this.map(function(){return\x20p.clone(this,a,b)})},html:function(a){return\x20p.access(this,function(a){var\x20c=this[0]||{},d=0,e=this.length;if(a===b)return\x20c.nodeType===1?c.innerHTML.replace(bm,\"\"):b;if(typeof\x20a==\"string\"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||[\"\",\"\"])[1].toLowerCase()]){a=a.replace(bo,\"<$1>\");try{for(;d1&&typeof\x20j==\"string\"&&bw.test(j))return\x20this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return\x20this.each(function(e){var\x20f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,\"tr\");for(h=e.cacheable||l-1;i0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return\x20this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var\x20d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu.test(\"<\"+a.nodeName+\">\")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return\x20d=e=null,g},clean:function(a,b,c,d){var\x20f,g,h,i,j,k,l,m,n,o,q,r,s=b===e&&bA,t=[];if(!b||typeof\x20b.createDocumentFragment==\"undefined\")b=e;for(f=0;(h=a[f])!=null;f++){typeof\x20h==\"number\"&&(h+=\"\");if(!h)continue;if(typeof\x20h==\"string\")if(!br.test(h))h=b.createTextNode(h);else{s=s||bk(b),l=b.createElement(\"div\"),s.appendChild(l),h=h.replace(bo,\"<$1>\"),i=(bp.exec(h)||[\"\",\"\"])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i===\"table\"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]===\"\"&&!m?l.childNodes:[];for(g=n.length-1;g>=0;--g)p.nodeName(n[g],\"tbody\")&&!n[g].childNodes.length&&n[g].parentNode.removeChild(n[g])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l.parentNode.removeChild(l)}h.nodeType?t.push(h):p.merge(t,h)}l&&(h=l=s=null);if(!p.support.appendChecked)for(f=0;(h=t[f])!=null;f++)p.nodeName(h,\"input\")?bG(h):typeof\x20h.getElementsByTagName!=\"undefined\"&&p.grep(h.getElementsByTagName(\"input\"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return\x20d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(f=0;(h=t[f])!=null;f++)if(!p.nodeName(h,\"script\")||!q(h))c.appendChild(h),typeof\x20h.getElementsByTagName!=\"undefined\"&&(r=p.grep(p.merge([],h.getElementsByTagName(\"script\")),q),t.splice.apply(t,[f+1,0].concat(r)),f+=r.length)}return\x20t},cleanData:function(a,b){var\x20c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(f\x20in\x20c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete\x20i[d],j?delete\x20e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var\x20a,b;p.uaMatch=function(a){a=a.toLowerCase();var\x20b=/(chrome)[\x20\\/]([\\w.]+)/.exec(a)||/(webkit)[\x20\\/]([\\w.]+)/.exec(a)||/(opera)(?:.*version|)[\x20\\/]([\\w.]+)/.exec(a)||/(msie)\x20([\\w.]+)/.exec(a)||a.indexOf(\"compatible\")<0&&/(mozilla)(?:.*?\x20rv:([\\w.]+)|)/.exec(a)||[];return{browser:b[1]||\"\",version:b[2]||\"0\"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.chrome?b.webkit=!0:b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function\x20a(b,c){return\x20new\x20a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function\x20c(c,d){return\x20d&&d\x20instanceof\x20p&&!(d\x20instanceof\x20a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var\x20b=a(e);return\x20a}}();var\x20bH,bI,bJ,bK=/alpha\\([^)]*\\)/i,bL=/opacity=([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^(none|table(?!-c[ea]).+)/,bO=/^margin/,bP=new\x20RegExp(\"^(\"+q+\")(.*)$\",\"i\"),bQ=new\x20RegExp(\"^(\"+q+\")(?!px)[a-z%]+$\",\"i\"),bR=new\x20RegExp(\"^([-+])=(\"+q+\")\",\"i\"),bS={},bT={position:\"absolute\",visibility:\"hidden\",display:\"block\"},bU={letterSpacing:0,fontWeight:400},bV=[\"Top\",\"Right\",\"Bottom\",\"Left\"],bW=[\"Webkit\",\"O\",\"Moz\",\"ms\"],bX=p.fn.toggle;p.fn.extend({css:function(a,c){return\x20p.access(this,function(a,c,d){return\x20d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return\x20b$(this,!0)},hide:function(){return\x20b$(this)},toggle:function(a,b){var\x20c=typeof\x20a==\"boolean\";return\x20p.isFunction(a)&&p.isFunction(b)?bX.apply(this,arguments):this.each(function(){(c?a:bZ(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var\x20c=bH(a,\"opacity\");return\x20c===\"\"?\"1\":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{\"float\":p.support.cssFloat?\"cssFloat\":\"styleFloat\"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var\x20f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bY(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return\x20h&&\"get\"in\x20h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof\x20d,g===\"string\"&&(f=bR.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g=\"number\");if(d==null||g===\"number\"&&isNaN(d))return;g===\"number\"&&!p.cssNumber[i]&&(d+=\"px\");if(!h||!(\"set\"in\x20h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var\x20f,g,h,i=p.camelCase(c);return\x20c=p.cssProps[i]||(p.cssProps[i]=bY(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&\"get\"in\x20h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f===\"normal\"&&c\x20in\x20bU&&(f=bU[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var\x20d,e,f={};for(e\x20in\x20b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e\x20in\x20b)a.style[e]=f[e];return\x20d}}),a.getComputedStyle?bH=function(b,c){var\x20d,e,f,g,h=a.getComputedStyle(b,null),i=b.style;return\x20h&&(d=h[c],d===\"\"&&!p.contains(b.ownerDocument,b)&&(d=p.style(b,c)),bQ.test(d)&&bO.test(c)&&(e=i.width,f=i.minWidth,g=i.maxWidth,i.minWidth=i.maxWidth=i.width=d,d=h.width,i.width=e,i.minWidth=f,i.maxWidth=g)),d}:e.documentElement.currentStyle&&(bH=function(a,b){var\x20c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return\x20e==null&&f&&f[b]&&(e=f[b]),bQ.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b===\"fontSize\"?\"1em\":e,e=f.pixelLeft+\"px\",f.left=c,d&&(a.runtimeStyle.left=d)),e===\"\"?\"auto\":e}),p.each([\"height\",\"width\"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return\x20a.offsetWidth===0&&bN.test(bH(a,\"display\"))?p.swap(a,bT,function(){return\x20cb(a,b,d)}):cb(a,b,d)},set:function(a,c,d){return\x20b_(a,c,d?ca(a,b,d,p.support.boxSizing&&p.css(a,\"boxSizing\")===\"border-box\"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return\x20bL.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||\"\")?.01*parseFloat(RegExp.$1)+\"\":b?\"1\":\"\"},set:function(a,b){var\x20c=a.style,d=a.currentStyle,e=p.isNumeric(b)?\"alpha(opacity=\"+b*100+\")\":\"\",f=d&&d.filter||c.filter||\"\";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,\"\"))===\"\"&&c.removeAttribute){c.removeAttribute(\"filter\");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+\"\x20\"+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return\x20p.swap(a,{display:\"inline-block\"},function(){if(b)return\x20bH(a,\"marginRight\")})}}),!p.support.pixelPosition&&p.fn.position&&p.each([\"top\",\"left\"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var\x20d=bH(a,b);return\x20bQ.test(d)?p(a).position()[b]+\"px\":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return\x20a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,\"display\"))===\"none\"},p.expr.filters.visible=function(a){return!p.expr.filters.hidden(a)}),p.each({margin:\"\",padding:\"\",border:\"Width\"},function(a,b){p.cssHooks[a+b]={expand:function(c){var\x20d,e=typeof\x20c==\"string\"?c.split(\"\x20\"):[c],f={};for(d=0;d<4;d++)f[a+bV[d]+b]=e[d]||e[d-2]||e[0];return\x20f}},bO.test(a)||(p.cssHooks[a+b].set=b_)});var\x20cd=/%20/g,ce=/\\[\\]$/,cf=/\\r?\\n/g,cg=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,ch=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return\x20p.param(this.serializeArray())},serializeArray:function(){return\x20this.map(function(){return\x20this.elements?p.makeArray(this.elements):this}).filter(function(){return\x20this.name&&!this.disabled&&(this.checked||ch.test(this.nodeName)||cg.test(this.type))}).map(function(a,b){var\x20c=p(this).val();return\x20c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(cf,\"\\r\\n\")}}):{name:b.name,value:c.replace(cf,\"\\r\\n\")}}).get()}}),p.param=function(a,c){var\x20d,e=[],f=function(a,b){b=p.isFunction(b)?b():b==null?\"\":b,e[e.length]=encodeURIComponent(a)+\"=\"+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else\x20for(d\x20in\x20a)ci(d,a[d],c,f);return\x20e.join(\"&\").replace(cd,\"+\")};var\x20cj,ck,cl=/#.*$/,cm=/^(.*?):[\x20\\t]*([^\\r\\n]*)\\r?$/mg,cn=/^(?:about|app|app\\-storage|.+\\-extension|file|res|widget):$/,co=/^(?:GET|HEAD)$/,cp=/^\\/\\//,cq=/\\?/,cr=/)<[^<]*)*<\\/script>/gi,cs=/([?&])_=[^&]*/,ct=/^([\\w\\+\\.\\-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+)|)|)/,cu=p.fn.load,cv={},cw={},cx=[\"*/\"]+[\"*\"];try{ck=f.href}catch(cy){ck=e.createElement(\"a\"),ck.href=\"\",ck=ck.href}cj=ct.exec(ck.toLowerCase())||[],p.fn.load=function(a,c,d){if(typeof\x20a!=\"string\"&&cu)return\x20cu.apply(this,arguments);if(!this.length)return\x20this;var\x20e,f,g,h=this,i=a.indexOf(\"\x20\");return\x20i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),p.isFunction(c)?(d=c,c=b):c&&typeof\x20c==\"object\"&&(f=\"POST\"),p.ajax({url:a,type:f,dataType:\"html\",data:c,complete:function(a,b){d&&h.each(d,g||[a.responseText,b,a])}}).done(function(a){g=arguments,h.html(e?p(\"
        \").append(a.replace(cr,\"\")).find(e):a)}),this},p.each(\"ajaxStart\x20ajaxStop\x20ajaxComplete\x20ajaxError\x20ajaxSuccess\x20ajaxSend\".split(\"\x20\"),function(a,b){p.fn[b]=function(a){return\x20this.on(b,a)}}),p.each([\"get\",\"post\"],function(a,c){p[c]=function(a,d,e,f){return\x20p.isFunction(d)&&(f=f||e,e=d,d=b),p.ajax({type:c,url:a,data:d,success:e,dataType:f})}}),p.extend({getScript:function(a,c){return\x20p.get(a,b,c,\"script\")},getJSON:function(a,b,c){return\x20p.get(a,b,c,\"json\")},ajaxSetup:function(a,b){return\x20b?cB(a,p.ajaxSettings):(b=a,a=p.ajaxSettings),cB(a,b),a},ajaxSettings:{url:ck,isLocal:cn.test(cj[1]),global:!0,type:\"GET\",contentType:\"application/x-www-form-urlencoded;\x20charset=UTF-8\",processData:!0,async:!0,accepts:{xml:\"application/xml,\x20text/xml\",html:\"text/html\",text:\"text/plain\",json:\"application/json,\x20text/javascript\",\"*\":cx},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:\"responseXML\",text:\"responseText\"},converters:{\"*\x20text\":a.String,\"text\x20html\":!0,\"text\x20json\":p.parseJSON,\"text\x20xml\":p.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:cz(cv),ajaxTransport:cz(cw),ajax:function(a,c){function\x20y(a,c,f,i){var\x20k,s,t,u,w,y=c;if(v===2)return;v=2,h&&clearTimeout(h),g=b,e=i||\"\",x.readyState=a>0?4:0,f&&(u=cC(l,x,f));if(a>=200&&a<300||a===304)l.ifModified&&(w=x.getResponseHeader(\"Last-Modified\"),w&&(p.lastModified[d]=w),w=x.getResponseHeader(\"Etag\"),w&&(p.etag[d]=w)),a===304?(y=\"notmodified\",k=!0):(k=cD(l,u),y=k.state,s=k.data,t=k.error,k=!t);else{t=y;if(!y||a)y=\"error\",a<0&&(a=0)}x.status=a,x.statusText=(c||y)+\"\",k?o.resolveWith(m,[s,y,x]):o.rejectWith(m,[x,y,t]),x.statusCode(r),r=b,j&&n.trigger(\"ajax\"+(k?\"Success\":\"Error\"),[x,l,k?s:t]),q.fireWith(m,[x,y]),j&&(n.trigger(\"ajaxComplete\",[x,l]),--p.active||p.event.trigger(\"ajaxStop\"))}typeof\x20a==\"object\"&&(c=a,a=b),c=c||{};var\x20d,e,f,g,h,i,j,k,l=p.ajaxSetup({},c),m=l.context||l,n=m!==l&&(m.nodeType||m\x20instanceof\x20p)?p(m):p.event,o=p.Deferred(),q=p.Callbacks(\"once\x20memory\"),r=l.statusCode||{},t={},u={},v=0,w=\"canceled\",x={readyState:0,setRequestHeader:function(a,b){if(!v){var\x20c=a.toLowerCase();a=u[c]=u[c]||a,t[a]=b}return\x20this},getAllResponseHeaders:function(){return\x20v===2?e:null},getResponseHeader:function(a){var\x20c;if(v===2){if(!f){f={};while(c=cm.exec(e))f[c[1].toLowerCase()]=c[2]}c=f[a.toLowerCase()]}return\x20c===b?null:c},overrideMimeType:function(a){return\x20v||(l.mimeType=a),this},abort:function(a){return\x20a=a||w,g&&g.abort(a),y(0,a),this}};o.promise(x),x.success=x.done,x.error=x.fail,x.complete=q.add,x.statusCode=function(a){if(a){var\x20b;if(v<2)for(b\x20in\x20a)r[b]=[r[b],a[b]];else\x20b=a[x.status],x.always(b)}return\x20this},l.url=((a||l.url)+\"\").replace(cl,\"\").replace(cp,cj[1]+\"//\"),l.dataTypes=p.trim(l.dataType||\"*\").toLowerCase().split(s),l.crossDomain==null&&(i=ct.exec(l.url.toLowerCase())||!1,l.crossDomain=i&&i.join(\":\")+(i[3]?\"\":i[1]===\"http:\"?80:443)!==cj.join(\":\")+(cj[3]?\"\":cj[1]===\"http:\"?80:443)),l.data&&l.processData&&typeof\x20l.data!=\"string\"&&(l.data=p.param(l.data,l.traditional)),cA(cv,l,c,x);if(v===2)return\x20x;j=l.global,l.type=l.type.toUpperCase(),l.hasContent=!co.test(l.type),j&&p.active++===0&&p.event.trigger(\"ajaxStart\");if(!l.hasContent){l.data&&(l.url+=(cq.test(l.url)?\"&\":\"?\")+l.data,delete\x20l.data),d=l.url;if(l.cache===!1){var\x20z=p.now(),A=l.url.replace(cs,\"$1_=\"+z);l.url=A+(A===l.url?(cq.test(l.url)?\"&\":\"?\")+\"_=\"+z:\"\")}}(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&x.setRequestHeader(\"Content-Type\",l.contentType),l.ifModified&&(d=d||l.url,p.lastModified[d]&&x.setRequestHeader(\"If-Modified-Since\",p.lastModified[d]),p.etag[d]&&x.setRequestHeader(\"If-None-Match\",p.etag[d])),x.setRequestHeader(\"Accept\",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!==\"*\"?\",\x20\"+cx+\";\x20q=0.01\":\"\"):l.accepts[\"*\"]);for(k\x20in\x20l.headers)x.setRequestHeader(k,l.headers[k]);if(!l.beforeSend||l.beforeSend.call(m,x,l)!==!1&&v!==2){w=\"abort\";for(k\x20in{success:1,error:1,complete:1})x[k](l[k]);g=cA(cw,l,c,x);if(!g)y(-1,\"No\x20Transport\");else{x.readyState=1,j&&n.trigger(\"ajaxSend\",[x,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){x.abort(\"timeout\")},l.timeout));try{v=1,g.send(t,y)}catch(B){if(v<2)y(-1,B);else\x20throw\x20B}}return\x20x}return\x20x.abort()},active:0,lastModified:{},etag:{}});var\x20cE=[],cF=/\\?/,cG=/(=)\\?(?=&|$)|\\?\\?/,cH=p.now();p.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var\x20a=cE.pop()||p.expando+\"_\"+cH++;return\x20this[a]=!0,a}}),p.ajaxPrefilter(\"json\x20jsonp\",function(c,d,e){var\x20f,g,h,i=c.data,j=c.url,k=c.jsonp!==!1,l=k&&cG.test(j),m=k&&!l&&typeof\x20i==\"string\"&&!(c.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&cG.test(i);if(c.dataTypes[0]===\"jsonp\"||l||m)return\x20f=c.jsonpCallback=p.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,g=a[f],l?c.url=j.replace(cG,\"$1\"+f):m?c.data=i.replace(cG,\"$1\"+f):k&&(c.url+=(cF.test(j)?\"&\":\"?\")+c.jsonp+\"=\"+f),c.converters[\"script\x20json\"]=function(){return\x20h||p.error(f+\"\x20was\x20not\x20called\"),h[0]},c.dataTypes[0]=\"json\",a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,cE.push(f)),h&&p.isFunction(g)&&g(h[0]),h=g=b}),\"script\"}),p.ajaxSetup({accepts:{script:\"text/javascript,\x20application/javascript,\x20application/ecmascript,\x20application/x-ecmascript\"},contents:{script:/javascript|ecmascript/},converters:{\"text\x20script\":function(a){return\x20p.globalEval(a),a}}}),p.ajaxPrefilter(\"script\",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type=\"GET\",a.global=!1)}),p.ajaxTransport(\"script\",function(a){if(a.crossDomain){var\x20c,d=e.head||e.getElementsByTagName(\"head\")[0]||e.documentElement;return{send:function(f,g){c=e.createElement(\"script\"),c.async=\"async\",a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,e){if(e||!c.readyState||/loaded|complete/.test(c.readyState))c.onload=c.onreadystatechange=null,d&&c.parentNode&&d.removeChild(c),c=b,e||g(200,\"success\")},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(0,1)}}}});var\x20cI,cJ=a.ActiveXObject?function(){for(var\x20a\x20in\x20cI)cI[a](0,1)}:!1,cK=0;p.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cL()||cM()}:cL,function(a){p.extend(p.support,{ajax:!!a,cors:!!a&&\"withCredentials\"in\x20a})}(p.ajaxSettings.xhr()),p.support.ajax&&p.ajaxTransport(function(c){if(!c.crossDomain||p.support.cors){var\x20d;return{send:function(e,f){var\x20g,h,i=c.xhr();c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async);if(c.xhrFields)for(h\x20in\x20c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),!c.crossDomain&&!e[\"X-Requested-With\"]&&(e[\"X-Requested-With\"]=\"XMLHttpRequest\");try{for(h\x20in\x20e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var\x20h,j,k,l,m;try{if(d&&(e||i.readyState===4)){d=b,g&&(i.onreadystatechange=p.noop,cJ&&delete\x20cI[g]);if(e)i.readyState!==4&&i.abort();else{h=i.status,k=i.getAllResponseHeaders(),l={},m=i.responseXML,m&&m.documentElement&&(l.xml=m);try{l.text=i.responseText}catch(a){}try{j=i.statusText}catch(n){j=\"\"}!h&&c.isLocal&&!c.crossDomain?h=l.text?200:404:h===1223&&(h=204)}}}catch(o){e||f(-1,o)}l&&f(h,j,l,k)},c.async?i.readyState===4?setTimeout(d,0):(g=++cK,cJ&&(cI||(cI={},p(a).unload(cJ)),cI[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(0,1)}}}});var\x20cN,cO,cP=/^(?:toggle|show|hide)$/,cQ=new\x20RegExp(\"^(?:([-+])=|)(\"+q+\")([a-z%]*)$\",\"i\"),cR=/queueHooks$/,cS=[cY],cT={\"*\":[function(a,b){var\x20c,d,e=this.createTween(a,b),f=cQ.exec(b),g=e.cur(),h=+g||0,i=1,j=20;if(f){c=+f[2],d=f[3]||(p.cssNumber[a]?\"\":\"px\");if(d!==\"px\"&&h){h=p.css(e.elem,a,!0)||c||1;do\x20i=i||\".5\",h=h/i,p.style(e.elem,a,h+d);while(i!==(i=e.cur()/g)&&i!==1&&--j)}e.unit=d,e.start=h,e.end=f[1]?h+(f[1]+1)*c:c}return\x20e}]};p.Animation=p.extend(cW,{tweener:function(a,b){p.isFunction(a)?(b=a,a=[\"*\"]):a=a.split(\"\x20\");var\x20c,d=0,e=a.length;for(;d-1,j={},k={},l,m;i?(k=e.position(),l=k.top,m=k.left):(l=parseFloat(g)||0,m=parseFloat(h)||0),p.isFunction(b)&&(b=b.call(a,c,f)),b.top!=null&&(j.top=b.top-f.top+l),b.left!=null&&(j.left=b.left-f.left+m),\"using\"in\x20b?b.using.call(a,j):e.css(j)}},p.fn.extend({position:function(){if(!this[0])return;var\x20a=this[0],b=this.offsetParent(),c=this.offset(),d=c_.test(b[0].nodeName)?{top:0,left:0}:b.offset();return\x20c.top-=parseFloat(p.css(a,\"marginTop\"))||0,c.left-=parseFloat(p.css(a,\"marginLeft\"))||0,d.top+=parseFloat(p.css(b[0],\"borderTopWidth\"))||0,d.left+=parseFloat(p.css(b[0],\"borderLeftWidth\"))||0,{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return\x20this.map(function(){var\x20a=this.offsetParent||e.body;while(a&&!c_.test(a.nodeName)&&p.css(a,\"position\")===\"static\")a=a.offsetParent;return\x20a||e.body})}}),p.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(a,c){var\x20d=/Y/.test(c);p.fn[a]=function(e){return\x20p.access(this,function(a,e,f){var\x20g=da(a);if(f===b)return\x20g?c\x20in\x20g?g[c]:g.document.documentElement[e]:a[e];g?g.scrollTo(d?p(g).scrollLeft():f,d?f:p(g).scrollTop()):a[e]=f},a,e,arguments.length,null)}}),p.each({Height:\"height\",Width:\"width\"},function(a,c){p.each({padding:\"inner\"+a,content:c,\"\":\"outer\"+a},function(d,e){p.fn[e]=function(e,f){var\x20g=arguments.length&&(d||typeof\x20e!=\"boolean\"),h=d||(e===!0||f===!0?\"margin\":\"border\");return\x20p.access(this,function(c,d,e){var\x20f;return\x20p.isWindow(c)?c.document.documentElement[\"client\"+a]:c.nodeType===9?(f=c.documentElement,Math.max(c.body[\"scroll\"+a],f[\"scroll\"+a],c.body[\"offset\"+a],f[\"offset\"+a],f[\"client\"+a])):e===b?p.css(c,d,e,h):p.style(c,d,e,h)},c,g?e:b,g,null)}})}),a.jQuery=a.$=p,typeof\x20define==\"function\"&&define.amd&&define.amd.jQuery&&define(\"jquery\",[],function(){return\x20p})})(window);", - - "jquery.treeview.css": "/*\x20https://github.com/jzaefferer/jquery-treeview/blob/master/jquery.treeview.css\x20*/\x0a/*\x20License:\x20MIT.\x20*/\x0a.treeview,\x20.treeview\x20ul\x20{\x0a\x09padding:\x200;\x0a\x09margin:\x200;\x0a\x09list-style:\x20none;\x0a}\x0a\x0a.treeview\x20ul\x20{\x0a\x09background-color:\x20white;\x0a\x09margin-top:\x204px;\x0a}\x0a\x0a.treeview\x20.hitarea\x20{\x0a\x09background:\x20url(images/treeview-default.gif)\x20-64px\x20-25px\x20no-repeat;\x0a\x09height:\x2016px;\x0a\x09width:\x2016px;\x0a\x09margin-left:\x20-16px;\x0a\x09float:\x20left;\x0a\x09cursor:\x20pointer;\x0a}\x0a/*\x20fix\x20for\x20IE6\x20*/\x0a*\x20html\x20.hitarea\x20{\x0a\x09display:\x20inline;\x0a\x09float:none;\x0a}\x0a\x0a.treeview\x20li\x20{\x0a\x09margin:\x200;\x0a\x09padding:\x203px\x200pt\x203px\x2016px;\x0a}\x0a\x0a.treeview\x20a.selected\x20{\x0a\x09background-color:\x20#eee;\x0a}\x0a\x0a#treecontrol\x20{\x20margin:\x201em\x200;\x20display:\x20none;\x20}\x0a\x0a.treeview\x20.hover\x20{\x20color:\x20red;\x20cursor:\x20pointer;\x20}\x0a\x0a.treeview\x20li\x20{\x20background:\x20url(images/treeview-default-line.gif)\x200\x200\x20no-repeat;\x20}\x0a.treeview\x20li.collapsable,\x20.treeview\x20li.expandable\x20{\x20background-position:\x200\x20-176px;\x20}\x0a\x0a.treeview\x20.expandable-hitarea\x20{\x20background-position:\x20-80px\x20-3px;\x20}\x0a\x0a.treeview\x20li.last\x20{\x20background-position:\x200\x20-1766px\x20}\x0a.treeview\x20li.lastCollapsable,\x20.treeview\x20li.lastExpandable\x20{\x20background-image:\x20url(images/treeview-default.gif);\x20}\x0a.treeview\x20li.lastCollapsable\x20{\x20background-position:\x200\x20-111px\x20}\x0a.treeview\x20li.lastExpandable\x20{\x20background-position:\x20-32px\x20-67px\x20}\x0a\x0a.treeview\x20div.lastCollapsable-hitarea,\x20.treeview\x20div.lastExpandable-hitarea\x20{\x20background-position:\x200;\x20}\x0a\x0a.treeview-red\x20li\x20{\x20background-image:\x20url(images/treeview-red-line.gif);\x20}\x0a.treeview-red\x20.hitarea,\x20.treeview-red\x20li.lastCollapsable,\x20.treeview-red\x20li.lastExpandable\x20{\x20background-image:\x20url(images/treeview-red.gif);\x20}\x0a\x0a.treeview-black\x20li\x20{\x20background-image:\x20url(images/treeview-black-line.gif);\x20}\x0a.treeview-black\x20.hitarea,\x20.treeview-black\x20li.lastCollapsable,\x20.treeview-black\x20li.lastExpandable\x20{\x20background-image:\x20url(images/treeview-black.gif);\x20}\x0a\x0a.treeview-gray\x20li\x20{\x20background-image:\x20url(images/treeview-gray-line.gif);\x20}\x0a.treeview-gray\x20.hitarea,\x20.treeview-gray\x20li.lastCollapsable,\x20.treeview-gray\x20li.lastExpandable\x20{\x20background-image:\x20url(images/treeview-gray.gif);\x20}\x0a\x0a.treeview-famfamfam\x20li\x20{\x20background-image:\x20url(images/treeview-famfamfam-line.gif);\x20}\x0a.treeview-famfamfam\x20.hitarea,\x20.treeview-famfamfam\x20li.lastCollapsable,\x20.treeview-famfamfam\x20li.lastExpandable\x20{\x20background-image:\x20url(images/treeview-famfamfam.gif);\x20}\x0a\x0a.treeview\x20.placeholder\x20{\x0a\x09background:\x20url(images/ajax-loader.gif)\x200\x200\x20no-repeat;\x0a\x09height:\x2016px;\x0a\x09width:\x2016px;\x0a\x09display:\x20block;\x0a}\x0a\x0a.filetree\x20li\x20{\x20padding:\x203px\x200\x202px\x2016px;\x20}\x0a.filetree\x20span.folder,\x20.filetree\x20span.file\x20{\x20padding:\x201px\x200\x201px\x2016px;\x20display:\x20block;\x20}\x0a.filetree\x20span.folder\x20{\x20background:\x20url(images/folder.gif)\x200\x200\x20no-repeat;\x20}\x0a.filetree\x20li.expandable\x20span.folder\x20{\x20background:\x20url(images/folder-closed.gif)\x200\x200\x20no-repeat;\x20}\x0a.filetree\x20span.file\x20{\x20background:\x20url(images/file.gif)\x200\x200\x20no-repeat;\x20}\x0a", - - "jquery.treeview.edit.js": "/*\x20https://github.com/jzaefferer/jquery-treeview/blob/master/jquery.treeview.edit.js\x20*/\x0a/*\x20License:\x20MIT.\x20*/\x0a(function($)\x20{\x0a\x09var\x20CLASSES\x20=\x20$.treeview.classes;\x0a\x09var\x20proxied\x20=\x20$.fn.treeview;\x0a\x09$.fn.treeview\x20=\x20function(settings)\x20{\x0a\x09\x09settings\x20=\x20$.extend({},\x20settings);\x0a\x09\x09if\x20(settings.add)\x20{\x0a\x09\x09\x09return\x20this.trigger(\"add\",\x20[settings.add]);\x0a\x09\x09}\x0a\x09\x09if\x20(settings.remove)\x20{\x0a\x09\x09\x09return\x20this.trigger(\"remove\",\x20[settings.remove]);\x0a\x09\x09}\x0a\x09\x09return\x20proxied.apply(this,\x20arguments).bind(\"add\",\x20function(event,\x20branches)\x20{\x0a\x09\x09\x09$(branches).prev()\x0a\x09\x09\x09\x09.removeClass(CLASSES.last)\x0a\x09\x09\x09\x09.removeClass(CLASSES.lastCollapsable)\x0a\x09\x09\x09\x09.removeClass(CLASSES.lastExpandable)\x0a\x09\x09\x09.find(\">.hitarea\")\x0a\x09\x09\x09\x09.removeClass(CLASSES.lastCollapsableHitarea)\x0a\x09\x09\x09\x09.removeClass(CLASSES.lastExpandableHitarea);\x0a\x09\x09\x09$(branches).find(\"li\").andSelf().prepareBranches(settings).applyClasses(settings,\x20$(this).data(\"toggler\"));\x0a\x09\x09}).bind(\"remove\",\x20function(event,\x20branches)\x20{\x0a\x09\x09\x09var\x20prev\x20=\x20$(branches).prev();\x0a\x09\x09\x09var\x20parent\x20=\x20$(branches).parent();\x0a\x09\x09\x09$(branches).remove();\x0a\x09\x09\x09prev.filter(\":last-child\").addClass(CLASSES.last)\x0a\x09\x09\x09\x09.filter(\".\"\x20+\x20CLASSES.expandable).replaceClass(CLASSES.last,\x20CLASSES.lastExpandable).end()\x0a\x09\x09\x09\x09.find(\">.hitarea\").replaceClass(CLASSES.expandableHitarea,\x20CLASSES.lastExpandableHitarea).end()\x0a\x09\x09\x09\x09.filter(\".\"\x20+\x20CLASSES.collapsable).replaceClass(CLASSES.last,\x20CLASSES.lastCollapsable).end()\x0a\x09\x09\x09\x09.find(\">.hitarea\").replaceClass(CLASSES.collapsableHitarea,\x20CLASSES.lastCollapsableHitarea);\x0a\x09\x09\x09if\x20(parent.is(\":not(:has(>))\")\x20&&\x20parent[0]\x20!=\x20this)\x20{\x0a\x09\x09\x09\x09parent.parent().removeClass(CLASSES.collapsable).removeClass(CLASSES.expandable)\x0a\x09\x09\x09\x09parent.siblings(\".hitarea\").andSelf().remove();\x0a\x09\x09\x09}\x0a\x09\x09});\x0a\x09};\x0a\x09\x0a})(jQuery);\x0a", - - "jquery.treeview.js": "/*\x0a\x20*\x20Treeview\x201.4.1\x20-\x20jQuery\x20plugin\x20to\x20hide\x20and\x20show\x20branches\x20of\x20a\x20tree\x0a\x20*\x20\x0a\x20*\x20http://bassistance.de/jquery-plugins/jquery-plugin-treeview/\x0a\x20*\x20http://docs.jquery.com/Plugins/Treeview\x0a\x20*\x0a\x20*\x20Copyright\x20(c)\x202007\x20J\xc3\xb6rn\x20Zaefferer\x0a\x20*\x0a\x20*\x20Dual\x20licensed\x20under\x20the\x20MIT\x20and\x20GPL\x20licenses:\x0a\x20*\x20\x20\x20http://www.opensource.org/licenses/mit-license.php\x0a\x20*\x20\x20\x20http://www.gnu.org/licenses/gpl.html\x0a\x20*\x0a\x20*\x20Revision:\x20$Id:\x20jquery.treeview.js\x205759\x202008-07-01\x2007:50:28Z\x20joern.zaefferer\x20$\x0a\x20*\x0a\x20*/\x0a\x0a;(function($)\x20{\x0a\x0a\x09//\x20TODO\x20rewrite\x20as\x20a\x20widget,\x20removing\x20all\x20the\x20extra\x20plugins\x0a\x09$.extend($.fn,\x20{\x0a\x09\x09swapClass:\x20function(c1,\x20c2)\x20{\x0a\x09\x09\x09var\x20c1Elements\x20=\x20this.filter('.'\x20+\x20c1);\x0a\x09\x09\x09this.filter('.'\x20+\x20c2).removeClass(c2).addClass(c1);\x0a\x09\x09\x09c1Elements.removeClass(c1).addClass(c2);\x0a\x09\x09\x09return\x20this;\x0a\x09\x09},\x0a\x09\x09replaceClass:\x20function(c1,\x20c2)\x20{\x0a\x09\x09\x09return\x20this.filter('.'\x20+\x20c1).removeClass(c1).addClass(c2).end();\x0a\x09\x09},\x0a\x09\x09hoverClass:\x20function(className)\x20{\x0a\x09\x09\x09className\x20=\x20className\x20||\x20\"hover\";\x0a\x09\x09\x09return\x20this.hover(function()\x20{\x0a\x09\x09\x09\x09$(this).addClass(className);\x0a\x09\x09\x09},\x20function()\x20{\x0a\x09\x09\x09\x09$(this).removeClass(className);\x0a\x09\x09\x09});\x0a\x09\x09},\x0a\x09\x09heightToggle:\x20function(animated,\x20callback)\x20{\x0a\x09\x09\x09animated\x20?\x0a\x09\x09\x09\x09this.animate({\x20height:\x20\"toggle\"\x20},\x20animated,\x20callback)\x20:\x0a\x09\x09\x09\x09this.each(function(){\x0a\x09\x09\x09\x09\x09jQuery(this)[\x20jQuery(this).is(\":hidden\")\x20?\x20\"show\"\x20:\x20\"hide\"\x20]();\x0a\x09\x09\x09\x09\x09if(callback)\x0a\x09\x09\x09\x09\x09\x09callback.apply(this,\x20arguments);\x0a\x09\x09\x09\x09});\x0a\x09\x09},\x0a\x09\x09heightHide:\x20function(animated,\x20callback)\x20{\x0a\x09\x09\x09if\x20(animated)\x20{\x0a\x09\x09\x09\x09this.animate({\x20height:\x20\"hide\"\x20},\x20animated,\x20callback);\x0a\x09\x09\x09}\x20else\x20{\x0a\x09\x09\x09\x09this.hide();\x0a\x09\x09\x09\x09if\x20(callback)\x0a\x09\x09\x09\x09\x09this.each(callback);\x09\x09\x09\x09\x0a\x09\x09\x09}\x0a\x09\x09},\x0a\x09\x09prepareBranches:\x20function(settings)\x20{\x0a\x09\x09\x09if\x20(!settings.prerendered)\x20{\x0a\x09\x09\x09\x09//\x20mark\x20last\x20tree\x20items\x0a\x09\x09\x09\x09this.filter(\":last-child:not(ul)\").addClass(CLASSES.last);\x0a\x09\x09\x09\x09//\x20collapse\x20whole\x20tree,\x20or\x20only\x20those\x20marked\x20as\x20closed,\x20anyway\x20except\x20those\x20marked\x20as\x20open\x0a\x09\x09\x09\x09this.filter((settings.collapsed\x20?\x20\"\"\x20:\x20\".\"\x20+\x20CLASSES.closed)\x20+\x20\":not(.\"\x20+\x20CLASSES.open\x20+\x20\")\").find(\">ul\").hide();\x0a\x09\x09\x09}\x0a\x09\x09\x09//\x20return\x20all\x20items\x20with\x20sublists\x0a\x09\x09\x09return\x20this.filter(\":has(>ul)\");\x0a\x09\x09},\x0a\x09\x09applyClasses:\x20function(settings,\x20toggler)\x20{\x0a\x09\x09\x09//\x20TODO\x20use\x20event\x20delegation\x0a\x09\x09\x09this.filter(\":has(>ul):not(:has(>a))\").find(\">span\").unbind(\"click.treeview\").bind(\"click.treeview\",\x20function(event)\x20{\x0a\x09\x09\x09\x09//\x20don't\x20handle\x20click\x20events\x20on\x20children,\x20eg.\x20checkboxes\x0a\x09\x09\x09\x09if\x20(\x20this\x20==\x20event.target\x20)\x0a\x09\x09\x09\x09\x09toggler.apply($(this).next());\x0a\x09\x09\x09}).add(\x20$(\"a\",\x20this)\x20).hoverClass();\x0a\x09\x09\x09\x0a\x09\x09\x09if\x20(!settings.prerendered)\x20{\x0a\x09\x09\x09\x09//\x20handle\x20closed\x20ones\x20first\x0a\x09\x09\x09\x09this.filter(\":has(>ul:hidden)\")\x0a\x09\x09\x09\x09\x09\x09.addClass(CLASSES.expandable)\x0a\x09\x09\x09\x09\x09\x09.replaceClass(CLASSES.last,\x20CLASSES.lastExpandable);\x0a\x09\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09//\x20handle\x20open\x20ones\x0a\x09\x09\x09\x09this.not(\":has(>ul:hidden)\")\x0a\x09\x09\x09\x09\x09\x09.addClass(CLASSES.collapsable)\x0a\x09\x09\x09\x09\x09\x09.replaceClass(CLASSES.last,\x20CLASSES.lastCollapsable);\x0a\x09\x09\x09\x09\x09\x09\x0a\x09\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20create\x20hitarea\x20if\x20not\x20present\x0a\x09\x09\x09\x09var\x20hitarea\x20=\x20this.find(\"div.\"\x20+\x20CLASSES.hitarea);\x0a\x09\x09\x09\x09if\x20(!hitarea.length)\x0a\x09\x09\x09\x09\x09hitarea\x20=\x20this.prepend(\"\").find(\"div.\"\x20+\x20CLASSES.hitarea);\x0a\x09\x09\x09\x09hitarea.removeClass().addClass(CLASSES.hitarea).each(function()\x20{\x0a\x09\x09\x09\x09\x09var\x20classes\x20=\x20\"\";\x0a\x09\x09\x09\x09\x09$.each($(this).parent().attr(\"class\").split(\"\x20\"),\x20function()\x20{\x0a\x09\x09\x09\x09\x09\x09classes\x20+=\x20this\x20+\x20\"-hitarea\x20\";\x0a\x09\x09\x09\x09\x09});\x0a\x09\x09\x09\x09\x09$(this).addClass(\x20classes\x20);\x0a\x09\x09\x09\x09})\x0a\x09\x09\x09}\x0a\x09\x09\x09\x0a\x09\x09\x09//\x20apply\x20event\x20to\x20hitarea\x0a\x09\x09\x09this.find(\"div.\"\x20+\x20CLASSES.hitarea).click(\x20toggler\x20);\x0a\x09\x09},\x0a\x09\x09treeview:\x20function(settings)\x20{\x0a\x09\x09\x09\x0a\x09\x09\x09settings\x20=\x20$.extend({\x0a\x09\x09\x09\x09cookieId:\x20\"treeview\"\x0a\x09\x09\x09},\x20settings);\x0a\x09\x09\x09\x0a\x09\x09\x09if\x20(\x20settings.toggle\x20)\x20{\x0a\x09\x09\x09\x09var\x20callback\x20=\x20settings.toggle;\x0a\x09\x09\x09\x09settings.toggle\x20=\x20function()\x20{\x0a\x09\x09\x09\x09\x09return\x20callback.apply($(this).parent()[0],\x20arguments);\x0a\x09\x09\x09\x09};\x0a\x09\x09\x09}\x0a\x09\x09\x0a\x09\x09\x09//\x20factory\x20for\x20treecontroller\x0a\x09\x09\x09function\x20treeController(tree,\x20control)\x20{\x0a\x09\x09\x09\x09//\x20factory\x20for\x20click\x20handlers\x0a\x09\x09\x09\x09function\x20handler(filter)\x20{\x0a\x09\x09\x09\x09\x09return\x20function()\x20{\x0a\x09\x09\x09\x09\x09\x09//\x20reuse\x20toggle\x20event\x20handler,\x20applying\x20the\x20elements\x20to\x20toggle\x0a\x09\x09\x09\x09\x09\x09//\x20start\x20searching\x20for\x20all\x20hitareas\x0a\x09\x09\x09\x09\x09\x09toggler.apply(\x20$(\"div.\"\x20+\x20CLASSES.hitarea,\x20tree).filter(function()\x20{\x0a\x09\x09\x09\x09\x09\x09\x09//\x20for\x20plain\x20toggle,\x20no\x20filter\x20is\x20provided,\x20otherwise\x20we\x20need\x20to\x20check\x20the\x20parent\x20element\x0a\x09\x09\x09\x09\x09\x09\x09return\x20filter\x20?\x20$(this).parent(\".\"\x20+\x20filter).length\x20:\x20true;\x0a\x09\x09\x09\x09\x09\x09})\x20);\x0a\x09\x09\x09\x09\x09\x09return\x20false;\x0a\x09\x09\x09\x09\x09};\x0a\x09\x09\x09\x09}\x0a\x09\x09\x09\x09//\x20click\x20on\x20first\x20element\x20to\x20collapse\x20tree\x0a\x09\x09\x09\x09$(\"a:eq(0)\",\x20control).click(\x20handler(CLASSES.collapsable)\x20);\x0a\x09\x09\x09\x09//\x20click\x20on\x20second\x20to\x20expand\x20tree\x0a\x09\x09\x09\x09$(\"a:eq(1)\",\x20control).click(\x20handler(CLASSES.expandable)\x20);\x0a\x09\x09\x09\x09//\x20click\x20on\x20third\x20to\x20toggle\x20tree\x0a\x09\x09\x09\x09$(\"a:eq(2)\",\x20control).click(\x20handler()\x20);\x20\x0a\x09\x09\x09}\x0a\x09\x09\x0a\x09\x09\x09//\x20handle\x20toggle\x20event\x0a\x09\x09\x09function\x20toggler()\x20{\x0a\x09\x09\x09\x09$(this)\x0a\x09\x09\x09\x09\x09.parent()\x0a\x09\x09\x09\x09\x09//\x20swap\x20classes\x20for\x20hitarea\x0a\x09\x09\x09\x09\x09.find(\">.hitarea\")\x0a\x09\x09\x09\x09\x09\x09.swapClass(\x20CLASSES.collapsableHitarea,\x20CLASSES.expandableHitarea\x20)\x0a\x09\x09\x09\x09\x09\x09.swapClass(\x20CLASSES.lastCollapsableHitarea,\x20CLASSES.lastExpandableHitarea\x20)\x0a\x09\x09\x09\x09\x09.end()\x0a\x09\x09\x09\x09\x09//\x20swap\x20classes\x20for\x20parent\x20li\x0a\x09\x09\x09\x09\x09.swapClass(\x20CLASSES.collapsable,\x20CLASSES.expandable\x20)\x0a\x09\x09\x09\x09\x09.swapClass(\x20CLASSES.lastCollapsable,\x20CLASSES.lastExpandable\x20)\x0a\x09\x09\x09\x09\x09//\x20find\x20child\x20lists\x0a\x09\x09\x09\x09\x09.find(\x20\">ul\"\x20)\x0a\x09\x09\x09\x09\x09//\x20toggle\x20them\x0a\x09\x09\x09\x09\x09.heightToggle(\x20settings.animated,\x20settings.toggle\x20);\x0a\x09\x09\x09\x09if\x20(\x20settings.unique\x20)\x20{\x0a\x09\x09\x09\x09\x09$(this).parent()\x0a\x09\x09\x09\x09\x09\x09.siblings()\x0a\x09\x09\x09\x09\x09\x09//\x20swap\x20classes\x20for\x20hitarea\x0a\x09\x09\x09\x09\x09\x09.find(\">.hitarea\")\x0a\x09\x09\x09\x09\x09\x09\x09.replaceClass(\x20CLASSES.collapsableHitarea,\x20CLASSES.expandableHitarea\x20)\x0a\x09\x09\x09\x09\x09\x09\x09.replaceClass(\x20CLASSES.lastCollapsableHitarea,\x20CLASSES.lastExpandableHitarea\x20)\x0a\x09\x09\x09\x09\x09\x09.end()\x0a\x09\x09\x09\x09\x09\x09.replaceClass(\x20CLASSES.collapsable,\x20CLASSES.expandable\x20)\x0a\x09\x09\x09\x09\x09\x09.replaceClass(\x20CLASSES.lastCollapsable,\x20CLASSES.lastExpandable\x20)\x0a\x09\x09\x09\x09\x09\x09.find(\x20\">ul\"\x20)\x0a\x09\x09\x09\x09\x09\x09.heightHide(\x20settings.animated,\x20settings.toggle\x20);\x0a\x09\x09\x09\x09}\x0a\x09\x09\x09}\x0a\x09\x09\x09this.data(\"toggler\",\x20toggler);\x0a\x09\x09\x09\x0a\x09\x09\x09function\x20serialize()\x20{\x0a\x09\x09\x09\x09function\x20binary(arg)\x20{\x0a\x09\x09\x09\x09\x09return\x20arg\x20?\x201\x20:\x200;\x0a\x09\x09\x09\x09}\x0a\x09\x09\x09\x09var\x20data\x20=\x20[];\x0a\x09\x09\x09\x09branches.each(function(i,\x20e)\x20{\x0a\x09\x09\x09\x09\x09data[i]\x20=\x20$(e).is(\":has(>ul:visible)\")\x20?\x201\x20:\x200;\x0a\x09\x09\x09\x09});\x0a\x09\x09\x09\x09$.cookie(settings.cookieId,\x20data.join(\"\"),\x20settings.cookieOptions\x20);\x0a\x09\x09\x09}\x0a\x09\x09\x09\x0a\x09\x09\x09function\x20deserialize()\x20{\x0a\x09\x09\x09\x09var\x20stored\x20=\x20$.cookie(settings.cookieId);\x0a\x09\x09\x09\x09if\x20(\x20stored\x20)\x20{\x0a\x09\x09\x09\x09\x09var\x20data\x20=\x20stored.split(\"\");\x0a\x09\x09\x09\x09\x09branches.each(function(i,\x20e)\x20{\x0a\x09\x09\x09\x09\x09\x09$(e).find(\">ul\")[\x20parseInt(data[i])\x20?\x20\"show\"\x20:\x20\"hide\"\x20]();\x0a\x09\x09\x09\x09\x09});\x0a\x09\x09\x09\x09}\x0a\x09\x09\x09}\x0a\x09\x09\x09\x0a\x09\x09\x09//\x20add\x20treeview\x20class\x20to\x20activate\x20styles\x0a\x09\x09\x09this.addClass(\"treeview\");\x0a\x09\x09\x09\x0a\x09\x09\x09//\x20prepare\x20branches\x20and\x20find\x20all\x20tree\x20items\x20with\x20child\x20lists\x0a\x09\x09\x09var\x20branches\x20=\x20this.find(\"li\").prepareBranches(settings);\x0a\x09\x09\x09\x0a\x09\x09\x09switch(settings.persist)\x20{\x0a\x09\x09\x09case\x20\"cookie\":\x0a\x09\x09\x09\x09var\x20toggleCallback\x20=\x20settings.toggle;\x0a\x09\x09\x09\x09settings.toggle\x20=\x20function()\x20{\x0a\x09\x09\x09\x09\x09serialize();\x0a\x09\x09\x09\x09\x09if\x20(toggleCallback)\x20{\x0a\x09\x09\x09\x09\x09\x09toggleCallback.apply(this,\x20arguments);\x0a\x09\x09\x09\x09\x09}\x0a\x09\x09\x09\x09};\x0a\x09\x09\x09\x09deserialize();\x0a\x09\x09\x09\x09break;\x0a\x09\x09\x09case\x20\"location\":\x0a\x09\x09\x09\x09var\x20current\x20=\x20this.find(\"a\").filter(function()\x20{\x0a\x09\x09\x09\x09\x09return\x20this.href.toLowerCase()\x20==\x20location.href.toLowerCase();\x0a\x09\x09\x09\x09});\x0a\x09\x09\x09\x09if\x20(\x20current.length\x20)\x20{\x0a\x09\x09\x09\x09\x09//\x20TODO\x20update\x20the\x20open/closed\x20classes\x0a\x09\x09\x09\x09\x09var\x20items\x20=\x20current.addClass(\"selected\").parents(\"ul,\x20li\").add(\x20current.next()\x20).show();\x0a\x09\x09\x09\x09\x09if\x20(settings.prerendered)\x20{\x0a\x09\x09\x09\x09\x09\x09//\x20if\x20prerendered\x20is\x20on,\x20replicate\x20the\x20basic\x20class\x20swapping\x0a\x09\x09\x09\x09\x09\x09items.filter(\"li\")\x0a\x09\x09\x09\x09\x09\x09\x09.swapClass(\x20CLASSES.collapsable,\x20CLASSES.expandable\x20)\x0a\x09\x09\x09\x09\x09\x09\x09.swapClass(\x20CLASSES.lastCollapsable,\x20CLASSES.lastExpandable\x20)\x0a\x09\x09\x09\x09\x09\x09\x09.find(\">.hitarea\")\x0a\x09\x09\x09\x09\x09\x09\x09\x09.swapClass(\x20CLASSES.collapsableHitarea,\x20CLASSES.expandableHitarea\x20)\x0a\x09\x09\x09\x09\x09\x09\x09\x09.swapClass(\x20CLASSES.lastCollapsableHitarea,\x20CLASSES.lastExpandableHitarea\x20);\x0a\x09\x09\x09\x09\x09}\x0a\x09\x09\x09\x09}\x0a\x09\x09\x09\x09break;\x0a\x09\x09\x09}\x0a\x09\x09\x09\x0a\x09\x09\x09branches.applyClasses(settings,\x20toggler);\x0a\x09\x09\x09\x09\x0a\x09\x09\x09//\x20if\x20control\x20option\x20is\x20set,\x20create\x20the\x20treecontroller\x20and\x20show\x20it\x0a\x09\x09\x09if\x20(\x20settings.control\x20)\x20{\x0a\x09\x09\x09\x09treeController(this,\x20settings.control);\x0a\x09\x09\x09\x09$(settings.control).show();\x0a\x09\x09\x09}\x0a\x09\x09\x09\x0a\x09\x09\x09return\x20this;\x0a\x09\x09}\x0a\x09});\x0a\x09\x0a\x09//\x20classes\x20used\x20by\x20the\x20plugin\x0a\x09//\x20need\x20to\x20be\x20styled\x20via\x20external\x20stylesheet,\x20see\x20first\x20example\x0a\x09$.treeview\x20=\x20{};\x0a\x09var\x20CLASSES\x20=\x20($.treeview.classes\x20=\x20{\x0a\x09\x09open:\x20\"open\",\x0a\x09\x09closed:\x20\"closed\",\x0a\x09\x09expandable:\x20\"expandable\",\x0a\x09\x09expandableHitarea:\x20\"expandable-hitarea\",\x0a\x09\x09lastExpandableHitarea:\x20\"lastExpandable-hitarea\",\x0a\x09\x09collapsable:\x20\"collapsable\",\x0a\x09\x09collapsableHitarea:\x20\"collapsable-hitarea\",\x0a\x09\x09lastCollapsableHitarea:\x20\"lastCollapsable-hitarea\",\x0a\x09\x09lastCollapsable:\x20\"lastCollapsable\",\x0a\x09\x09lastExpandable:\x20\"lastExpandable\",\x0a\x09\x09last:\x20\"last\",\x0a\x09\x09hitarea:\x20\"hitarea\"\x0a\x09});\x0a\x09\x0a})(jQuery);\x0a", - - "methodset.html": "\x0a\x09\x0a\x09\x09\xe2\x96\xb9\x20Method\x20set

        \x0a\x09
        \x0a\x09\x0a\x09\x09\xe2\x96\xbe\x20Method\x20set

        \x0a\x09\x09...\x0a\x09\x0a\x0a", - - "opensearch.xml": "\x0a\x0a\x20\x20godoc\x0a\x20\x20The\x20Go\x20Programming\x20Language\x0a\x20\x20go\x20golang\x0a\x20\x20\x0a\x20\x20\x0a\x20\x20/favicon.ico\x0a\x20\x20UTF-8\x0a\x20\x20UTF-8\x0a\x0a", - - "package.html": "\x0a\x0a{{with\x20.PDoc}}\x0a\x09\x0a\x0a\x09{{if\x20$.IsMain}}\x0a\x09\x09{{/*\x20command\x20documentation\x20*/}}\x0a\x09\x09{{comment_html\x20.Doc}}\x0a\x09{{else}}\x0a\x09\x09{{/*\x20package\x20documentation\x20*/}}\x0a\x09\x09\x0a\x09\x09\x09
        \x0a\x09\x09\x09
        import\x20\"{{html\x20.ImportPath}}\"
        \x0a\x09\x09\x09
        \x0a\x09\x09\x09
        \x0a\x09\x09\x09
        Overview
        \x0a\x09\x09\x09
        Index
        \x0a\x09\x09\x09{{if\x20$.Examples}}\x0a\x09\x09\x09\x09
        Examples
        \x0a\x09\x09\x09{{end}}\x0a\x09\x09\x09{{if\x20$.Dirs}}\x0a\x09\x09\x09\x09
        Subdirectories
        \x0a\x09\x09\x09{{end}}\x0a\x09\x09\x09
        \x0a\x09\x09\x0a\x09\x09\x0a\x09\x09\x0a\x09\x09\x09\x0a\x09\x09\x09\x09Overview\x20\xe2\x96\xb9\x0a\x09\x09\x09\x0a\x09\x09\x09\x0a\x09\x09\x09\x09Overview\x20\xe2\x96\xbe\x0a\x09\x09\x09\x09{{comment_html\x20.Doc}}\x0a\x09\x09\x09\x09{{example_html\x20$\x20\"\"}}\x0a\x09\x09\x09\x0a\x09\x09\x0a\x0a\x09\x09\x0a\x09\x09\x0a\x09\x09\x09Index\x20\xe2\x96\xb9\x0a\x09\x09\x0a\x09\x09\x0a\x09\x09\x09Index\x20\xe2\x96\xbe\x0a\x0a\x09\x09\x0a\x09\x09\x09\x0a\x09\x09\x09
        \x0a\x09\x09\x09{{if\x20.Consts}}\x0a\x09\x09\x09\x09
        Constants
        \x0a\x09\x09\x09{{end}}\x0a\x09\x09\x09{{if\x20.Vars}}\x0a\x09\x09\x09\x09
        Variables
        \x0a\x09\x09\x09{{end}}\x0a\x09\x09\x09{{range\x20.Funcs}}\x0a\x09\x09\x09\x09{{$name_html\x20:=\x20html\x20.Name}}\x0a\x09\x09\x09\x09
        {{node_html\x20$\x20.Decl\x20false\x20|\x20sanitize}}
        \x0a\x09\x09\x09{{end}}\x0a\x09\x09\x09{{range\x20.Types}}\x0a\x09\x09\x09\x09{{$tname_html\x20:=\x20html\x20.Name}}\x0a\x09\x09\x09\x09
        type\x20{{$tname_html}}
        \x0a\x09\x09\x09\x09{{range\x20.Funcs}}\x0a\x09\x09\x09\x09\x09{{$name_html\x20:=\x20html\x20.Name}}\x0a\x09\x09\x09\x09\x09
         \x20 \x20{{node_html\x20$\x20.Decl\x20false\x20|\x20sanitize}}
        \x0a\x09\x09\x09\x09{{end}}\x0a\x09\x09\x09\x09{{range\x20.Methods}}\x0a\x09\x09\x09\x09\x09{{$name_html\x20:=\x20html\x20.Name}}\x0a\x09\x09\x09\x09\x09
         \x20 \x20{{node_html\x20$\x20.Decl\x20false\x20|\x20sanitize}}
        \x0a\x09\x09\x09\x09{{end}}\x0a\x09\x09\x09{{end}}\x0a\x09\x09\x09{{if\x20$.Notes}}\x0a\x09\x09\x09\x09{{range\x20$marker,\x20$item\x20:=\x20$.Notes}}\x0a\x09\x09\x09\x09
        {{noteTitle\x20$marker\x20|\x20html}}s
        \x0a\x09\x09\x09\x09{{end}}\x0a\x09\x09\x09{{end}}\x0a\x09\x09\x09
        \x0a\x09\x09\x09\x0a\x0a\x09\x09{{if\x20$.Examples}}\x0a\x09\x09\x0a\x09\x09\x09

        Examples

        \x0a\x09\x09\x09(Expand\x20All)\x0a\x09\x09\x09
        \x0a\x09\x09\x09{{range\x20$.Examples}}\x0a\x09\x09\x09
        {{example_name\x20.Name}}
        \x0a\x09\x09\x09{{end}}\x0a\x09\x09\x09
        \x0a\x09\x09\x0a\x09\x09{{end}}\x0a\x0a\x09\x09{{with\x20.Filenames}}\x0a\x09\x09\x09

        Package\x20files

        \x0a\x09\x09\x09

        \x0a\x09\x09\x09\x0a\x09\x09\x09{{range\x20.}}\x0a\x09\x09\x09\x09{{.|filename|html}}\x0a\x09\x09\x09{{end}}\x0a\x09\x09\x09\x0a\x09\x09\x09

        \x0a\x09\x09{{end}}\x0a\x09\x09\x0a\x09\x09\x0a\x0a\x09\x09{{if\x20ne\x20$.CallGraph\x20\"null\"}}\x0a\x09\x09\x0a\x09\x09\x0a\x09\x09\x09Internal\x20call\x20graph\x20\xe2\x96\xb9\x0a\x09\x09\x20\x0a\x09\x09\x0a\x09\x09\x09Internal\x20call\x20graph\x20\xe2\x96\xbe\x0a\x09\x09\x09

        \x0a\x09\x09\x09\x20\x20In\x20the\x20call\x20graph\x20viewer\x20below,\x20each\x20node\x0a\x09\x09\x09\x20\x20is\x20a\x20function\x20belonging\x20to\x20this\x20package\x0a\x09\x09\x09\x20\x20and\x20its\x20children\x20are\x20the\x20functions\x20it\x0a\x09\x09\x09\x20\x20calls—perhaps\x20dynamically.\x0a\x09\x09\x09

        \x0a\x09\x09\x09

        \x0a\x09\x09\x09\x20\x20The\x20root\x20nodes\x20are\x20the\x20entry\x20points\x20of\x20the\x0a\x09\x09\x09\x20\x20package:\x20functions\x20that\x20may\x20be\x20called\x20from\x0a\x09\x09\x09\x20\x20outside\x20the\x20package.\x0a\x09\x09\x09\x20\x20There\x20may\x20be\x20non-exported\x20or\x20anonymous\x0a\x09\x09\x09\x20\x20functions\x20among\x20them\x20if\x20they\x20are\x20called\x0a\x09\x09\x09\x20\x20dynamically\x20from\x20another\x20package.\x0a\x09\x09\x09

        \x0a\x09\x09\x09

        \x0a\x09\x09\x09\x20\x20Click\x20a\x20node\x20to\x20visit\x20that\x20function's\x20source\x20code.\x0a\x09\x09\x09\x20\x20From\x20there\x20you\x20can\x20visit\x20its\x20callers\x20by\x0a\x09\x09\x09\x20\x20clicking\x20its\x20declaring\x20func\x0a\x09\x09\x09\x20\x20token.\x0a\x09\x09\x09

        \x0a\x09\x09\x09

        \x0a\x09\x09\x09\x20\x20Functions\x20may\x20be\x20omitted\x20if\x20they\x20were\x0a\x09\x09\x09\x20\x20determined\x20to\x20be\x20unreachable\x20in\x20the\x0a\x09\x09\x09\x20\x20particular\x20programs\x20or\x20tests\x20that\x20were\x0a\x09\x09\x09\x20\x20analyzed.\x0a\x09\x09\x09

        \x0a\x09\x09\x09\x0a\x09\x09\x09\x0a\x09\x09\x0a\x09\x09\x20\x0a\x09\x09{{end}}\x0a\x0a\x09\x09{{with\x20.Consts}}\x0a\x09\x09\x09Constants\x0a\x09\x09\x09{{range\x20.}}\x0a\x09\x09\x09\x09{{comment_html\x20.Doc}}\x0a\x09\x09\x09\x09
        {{node_html\x20$\x20.Decl\x20true}}
        \x0a\x09\x09\x09{{end}}\x0a\x09\x09{{end}}\x0a\x09\x09{{with\x20.Vars}}\x0a\x09\x09\x09Variables\x0a\x09\x09\x09{{range\x20.}}\x0a\x09\x09\x09\x09{{comment_html\x20.Doc}}\x0a\x09\x09\x09\x09
        {{node_html\x20$\x20.Decl\x20true}}
        \x0a\x09\x09\x09{{end}}\x0a\x09\x09{{end}}\x0a\x09\x09{{range\x20.Funcs}}\x0a\x09\x09\x09{{/*\x20Name\x20is\x20a\x20string\x20-\x20no\x20need\x20for\x20FSet\x20*/}}\x0a\x09\x09\x09{{$name_html\x20:=\x20html\x20.Name}}\x0a\x09\x09\x09func\x20{{$name_html}}\x0a\x09\x09\x09\x09¶\x0a\x09\x09\x09\x09{{$since\x20:=\x20since\x20\"func\"\x20\"\"\x20.Name\x20$.PDoc.ImportPath}}\x0a\x09\x09\x09\x09{{if\x20$since}}{{$since}}{{end}}\x0a\x09\x09\x09\x0a\x09\x09\x09
        {{node_html\x20$\x20.Decl\x20true}}
        \x0a\x09\x09\x09{{comment_html\x20.Doc}}\x0a\x09\x09\x09{{example_html\x20$\x20.Name}}\x0a\x09\x09\x09{{callgraph_html\x20$\x20\"\"\x20.Name}}\x0a\x0a\x09\x09{{end}}\x0a\x09\x09{{range\x20.Types}}\x0a\x09\x09\x09{{$tname\x20:=\x20.Name}}\x0a\x09\x09\x09{{$tname_html\x20:=\x20html\x20.Name}}\x0a\x09\x09\x09type\x20{{$tname_html}}\x0a\x09\x09\x09\x09¶\x0a\x09\x09\x09\x09{{$since\x20:=\x20since\x20\"type\"\x20\"\"\x20.Name\x20$.PDoc.ImportPath}}\x0a\x09\x09\x09\x09{{if\x20$since}}{{$since}}{{end}}\x0a\x09\x09\x09\x0a\x09\x09\x09{{comment_html\x20.Doc}}\x0a\x09\x09\x09
        {{node_html\x20$\x20.Decl\x20true}}
        \x0a\x0a\x09\x09\x09{{range\x20.Consts}}\x0a\x09\x09\x09\x09{{comment_html\x20.Doc}}\x0a\x09\x09\x09\x09
        {{node_html\x20$\x20.Decl\x20true}}
        \x0a\x09\x09\x09{{end}}\x0a\x0a\x09\x09\x09{{range\x20.Vars}}\x0a\x09\x09\x09\x09{{comment_html\x20.Doc}}\x0a\x09\x09\x09\x09
        {{node_html\x20$\x20.Decl\x20true}}
        \x0a\x09\x09\x09{{end}}\x0a\x0a\x09\x09\x09{{example_html\x20$\x20$tname}}\x0a\x09\x09\x09{{implements_html\x20$\x20$tname}}\x0a\x09\x09\x09{{methodset_html\x20$\x20$tname}}\x0a\x0a\x09\x09\x09{{range\x20.Funcs}}\x0a\x09\x09\x09\x09{{$name_html\x20:=\x20html\x20.Name}}\x0a\x09\x09\x09\x09func\x20{{$name_html}}\x0a\x09\x09\x09\x09\x09¶\x0a\x09\x09\x09\x09\x09{{$since\x20:=\x20since\x20\"func\"\x20\"\"\x20.Name\x20$.PDoc.ImportPath}}\x0a\x09\x09\x09\x09\x09{{if\x20$since}}{{$since}}{{end}}\x0a\x09\x09\x09\x09\x0a\x09\x09\x09\x09
        {{node_html\x20$\x20.Decl\x20true}}
        \x0a\x09\x09\x09\x09{{comment_html\x20.Doc}}\x0a\x09\x09\x09\x09{{example_html\x20$\x20.Name}}\x0a\x09\x09\x09\x09{{callgraph_html\x20$\x20\"\"\x20.Name}}\x0a\x09\x09\x09{{end}}\x0a\x0a\x09\x09\x09{{range\x20.Methods}}\x0a\x09\x09\x09\x09{{$name_html\x20:=\x20html\x20.Name}}\x0a\x09\x09\x09\x09func\x20({{html\x20.Recv}})\x20{{$name_html}}\x0a\x09\x09\x09\x09\x09¶\x0a\x09\x09\x09\x09\x09{{$since\x20:=\x20since\x20\"method\"\x20.Recv\x20.Name\x20$.PDoc.ImportPath}}\x0a\x09\x09\x09\x09\x09{{if\x20$since}}{{$since}}{{end}}\x0a\x09\x09\x09\x09\x0a\x09\x09\x09\x09
        {{node_html\x20$\x20.Decl\x20true}}
        \x0a\x09\x09\x09\x09{{comment_html\x20.Doc}}\x0a\x09\x09\x09\x09{{$name\x20:=\x20printf\x20\"%s_%s\"\x20$tname\x20.Name}}\x0a\x09\x09\x09\x09{{example_html\x20$\x20$name}}\x0a\x09\x09\x09\x09{{callgraph_html\x20$\x20.Recv\x20.Name}}\x0a\x09\x09\x09{{end}}\x0a\x09\x09{{end}}\x0a\x09{{end}}\x0a\x0a\x09{{with\x20$.Notes}}\x0a\x09\x09{{range\x20$marker,\x20$content\x20:=\x20.}}\x0a\x09\x09\x09{{noteTitle\x20$marker\x20|\x20html}}s\x0a\x09\x09\x09\x0a\x09\x09\x09{{range\x20.}}\x0a\x09\x09\x09
      • ☞\x20{{comment_html\x20.Body}}
      • \x0a\x09\x09\x09{{end}}\x0a\x09\x09\x09\x0a\x09\x09{{end}}\x0a\x09{{end}}\x0a{{end}}\x0a\x0a{{with\x20.PAst}}\x0a\x09{{range\x20$filename,\x20$ast\x20:=\x20.}}\x0a\x09\x09{{$filename|filename|html}}:
        {{node_html\x20$\x20$ast\x20false}}
        \x0a\x09{{end}}\x0a{{end}}\x0a\x0a{{with\x20.Dirs}}\x0a\x09{{/*\x20DirList\x20entries\x20are\x20numbers\x20and\x20strings\x20-\x20no\x20need\x20for\x20FSet\x20*/}}\x0a\x09{{if\x20$.PDoc}}\x0a\x09\x09Subdirectories\x0a\x09{{end}}\x0a\x09\x0a\x09\x09
        \x0a\x09\x09\x09\x0a\x09\x09\x09\x09Name\x0a\x09\x09\x09\x09Synopsis\x0a\x09\x09\x09\x0a\x0a\x09\x09\x09{{if\x20not\x20((eq\x20$.Dirname\x20\"/src/cmd\")\x20$.DirFlat)}}\x0a\x09\x09\x09\x0a\x09\x09\x09\x09..\x0a\x09\x09\x09\x0a\x09\x09\x09{{end}}\x0a\x0a\x09\x09\x09{{range\x20.List}}\x0a\x09\x09\x09\x09\x0a\x09\x09\x09\x09{{if\x20$.DirFlat}}\x0a\x09\x09\x09\x09\x09{{if\x20.HasPkg}}\x0a\x09\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x09\x09{{html\x20.Path}}\x0a\x09\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09{{end}}\x0a\x09\x09\x09\x09{{else}}\x0a\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x09{{html\x20.Name}}\x0a\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09{{end}}\x0a\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x09{{html\x20.Synopsis}}\x0a\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x0a\x09\x09\x09{{end}}\x0a\x09\x09
        \x0a\x09\x0a{{end}}\x0a", - - "packageroot.html": "\x0a\x0a{{with\x20.PAst}}\x0a\x09{{range\x20$filename,\x20$ast\x20:=\x20.}}\x0a\x09\x09{{$filename|filename|html}}:
        {{node_html\x20$\x20$ast\x20false}}
        \x0a\x09{{end}}\x0a{{end}}\x0a\x0a{{with\x20.Dirs}}\x0a\x09{{/*\x20DirList\x20entries\x20are\x20numbers\x20and\x20strings\x20-\x20no\x20need\x20for\x20FSet\x20*/}}\x0a\x09{{if\x20$.PDoc}}\x0a\x09\x09Subdirectories\x0a\x09{{end}}\x0a\x09\x09\x0a\x09\x09\x09
        \x0a\x09\x09\x09\x09
        Standard\x20library
        \x0a\x09\x09\x09\x09{{if\x20hasThirdParty\x20.List\x20}}\x0a\x09\x09\x09\x09\x09
        Third\x20party
        \x0a\x09\x09\x09\x09{{end}}\x0a\x09\x09\x09\x09
        Other\x20packages
        \x0a\x09\x09\x09\x09
        Sub-repositories
        \x0a\x09\x09\x09\x09
        Community
        \x0a\x09\x09\x09
        \x0a\x09\x09\x0a\x0a\x09\x09\x0a\x09\x09\x09\x0a\x09\x09\x09\x09Standard\x20library\x20\xe2\x96\xb9\x0a\x09\x09\x09\x0a\x09\x09\x09\x0a\x09\x09\x09\x09Standard\x20library\x20\xe2\x96\xbe\x0a\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x09\x09Name\x0a\x09\x09\x09\x09\x09\x09\x09Synopsis\x0a\x09\x09\x09\x09\x09\x09\x0a\x0a\x09\x09\x09\x09\x09\x09{{range\x20.List}}\x0a\x09\x09\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x09\x09{{if\x20eq\x20.RootType\x20\"GOROOT\"}}\x0a\x09\x09\x09\x09\x09\x09\x09{{if\x20$.DirFlat}}\x0a\x09\x09\x09\x09\x09\x09\x09\x09{{if\x20.HasPkg}}\x0a\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09{{html\x20.Path}}\x0a\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x09\x09\x09{{end}}\x0a\x09\x09\x09\x09\x09\x09\x09{{else}}\x0a\x09\x09\x09\x09\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09{{html\x20.Name}}\x0a\x09\x09\x09\x09\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x09\x09{{end}}\x0a\x09\x09\x09\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x09\x09\x09\x09{{html\x20.Synopsis}}\x0a\x09\x09\x09\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x09\x09{{end}}\x0a\x09\x09\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x09{{end}}\x0a\x09\x09\x09\x09\x09
        \x0a\x09\x09\x09\x09\x20\x0a\x09\x09\x09\x20\x0a\x09\x09\x20\x0a\x0a\x09{{if\x20hasThirdParty\x20.List\x20}}\x0a\x09\x09\x0a\x09\x09\x09\x0a\x09\x09\x09\x09Third\x20party\x20\xe2\x96\xb9\x0a\x09\x09\x09\x0a\x09\x09\x09\x0a\x09\x09\x09\x09Third\x20party\x20\xe2\x96\xbe\x0a\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x09\x09Name\x0a\x09\x09\x09\x09\x09\x09\x09Synopsis\x0a\x09\x09\x09\x09\x09\x09\x0a\x0a\x09\x09\x09\x09\x09\x09{{range\x20.List}}\x0a\x09\x09\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x09\x09\x09{{if\x20eq\x20.RootType\x20\"GOPATH\"}}\x0a\x09\x09\x09\x09\x09\x09\x09\x09{{if\x20$.DirFlat}}\x0a\x09\x09\x09\x09\x09\x09\x09\x09\x09{{if\x20.HasPkg}}\x0a\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09{{html\x20.Path}}\x0a\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x09\x09\x09\x09{{end}}\x0a\x09\x09\x09\x09\x09\x09\x09\x09{{else}}\x0a\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09{{html\x20.Name}}\x0a\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x09\x09\x09{{end}}\x0a\x09\x09\x09\x09\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09{{html\x20.Synopsis}}\x0a\x09\x09\x09\x09\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x09\x09\x09{{end}}\x0a\x09\x09\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x09{{end}}\x0a\x09\x09\x09\x09\x09
        \x0a\x09\x09\x09\x09\x20\x0a\x09\x09\x09\x20\x0a\x09\x09\x20\x0a\x09{{end}}\x0a\x0a\x09Other\x20packages\x0a\x09Sub-repositories\x0a\x09

        \x0a\x09These\x20packages\x20are\x20part\x20of\x20the\x20Go\x20Project\x20but\x20outside\x20the\x20main\x20Go\x20tree.\x0a\x09They\x20are\x20developed\x20under\x20looser\x20compatibility\x20requirements\x20than\x20the\x20Go\x20core.\x0a\x09Install\x20them\x20with\x20\"go\x20get\".\x0a\x09

        \x0a\x09
          \x0a\x09\x09
        • benchmarks\x20\xe2\x80\x94\x20benchmarks\x20to\x20measure\x20Go\x20as\x20it\x20is\x20developed.
        • \x0a\x09\x09
        • blog\x20\xe2\x80\x94\x20blog.golang.org's\x20implementation.
        • \x0a\x09\x09
        • build\x20\xe2\x80\x94\x20build.golang.org's\x20implementation.
        • \x0a\x09\x09
        • crypto\x20\xe2\x80\x94\x20additional\x20cryptography\x20packages.
        • \x0a\x09\x09
        • debug\x20\xe2\x80\x94\x20an\x20experimental\x20debugger\x20for\x20Go.
        • \x0a\x09\x09
        • image\x20\xe2\x80\x94\x20additional\x20imaging\x20packages.
        • \x0a\x09\x09
        • mobile\x20\xe2\x80\x94\x20experimental\x20support\x20for\x20Go\x20on\x20mobile\x20platforms.
        • \x0a\x09\x09
        • net\x20\xe2\x80\x94\x20additional\x20networking\x20packages.
        • \x0a\x09\x09
        • perf\x20\xe2\x80\x94\x20packages\x20and\x20tools\x20for\x20performance\x20measurement,\x20storage,\x20and\x20analysis.
        • \x0a\x09\x09
        • review\x20\xe2\x80\x94\x20a\x20tool\x20for\x20working\x20with\x20Gerrit\x20code\x20reviews.
        • \x0a\x09\x09
        • sync\x20\xe2\x80\x94\x20additional\x20concurrency\x20primitives.
        • \x0a\x09\x09
        • sys\x20\xe2\x80\x94\x20packages\x20for\x20making\x20system\x20calls.
        • \x0a\x09\x09
        • text\x20\xe2\x80\x94\x20packages\x20for\x20working\x20with\x20text.
        • \x0a\x09\x09
        • time\x20\xe2\x80\x94\x20additional\x20time\x20packages.
        • \x0a\x09\x09
        • tools\x20\xe2\x80\x94\x20godoc,\x20goimports,\x20gorename,\x20and\x20other\x20tools.
        • \x0a\x09\x09
        • tour\x20\xe2\x80\x94\x20tour.golang.org's\x20implementation.
        • \x0a\x09\x09
        • exp\x20\xe2\x80\x94\x20experimental\x20and\x20deprecated\x20packages\x20(handle\x20with\x20care;\x20may\x20change\x20without\x20warning).
        • \x0a\x09
        \x0a\x0a\x09Community\x0a\x09

        \x0a\x09These\x20services\x20can\x20help\x20you\x20find\x20Open\x20Source\x20packages\x20provided\x20by\x20the\x20community.\x0a\x09

        \x0a\x09
          \x0a\x09\x09
        • GoDoc\x20-\x20a\x20package\x20index\x20and\x20search\x20engine.
        • \x0a\x09\x09
        • Go\x20Search\x20-\x20a\x20code\x20search\x20engine.
        • \x0a\x09\x09
        • Projects\x20at\x20the\x20Go\x20Wiki\x20-\x20a\x20curated\x20list\x20of\x20Go\x20projects.
        • \x0a\x09
        \x0a{{end}}\x0a", - - "play.js": "//\x20Copyright\x202012\x20The\x20Go\x20Authors.\x20All\x20rights\x20reserved.\x0a//\x20Use\x20of\x20this\x20source\x20code\x20is\x20governed\x20by\x20a\x20BSD-style\x0a//\x20license\x20that\x20can\x20be\x20found\x20in\x20the\x20LICENSE\x20file.\x0a\x0afunction\x20initPlayground(transport)\x20{\x0a\x09'use\x20strict';\x0a\x0a\x09function\x20text(node)\x20{\x0a\x09\x09var\x20s\x20=\x20'';\x0a\x09\x09for\x20(var\x20i\x20=\x200;\x20i\x20<\x20node.childNodes.length;\x20i++)\x20{\x0a\x09\x09\x09var\x20n\x20=\x20node.childNodes[i];\x0a\x09\x09\x09if\x20(n.nodeType\x20===\x201)\x20{\x0a\x09\x09\x09\x09if\x20(n.tagName\x20===\x20'BUTTON')\x20continue\x0a\x09\x09\x09\x09if\x20(n.tagName\x20===\x20'SPAN'\x20&&\x20n.className\x20===\x20'number')\x20continue;\x0a\x09\x09\x09\x09if\x20(n.tagName\x20===\x20'DIV'\x20||\x20n.tagName\x20==\x20'BR')\x20{\x0a\x09\x09\x09\x09\x09s\x20+=\x20\"\\n\";\x0a\x09\x09\x09\x09}\x0a\x09\x09\x09\x09s\x20+=\x20text(n);\x0a\x09\x09\x09\x09continue;\x0a\x09\x09\x09}\x0a\x09\x09\x09if\x20(n.nodeType\x20===\x203)\x20{\x0a\x09\x09\x09\x09s\x20+=\x20n.nodeValue;\x0a\x09\x09\x09}\x0a\x09\x09}\x0a\x09\x09return\x20s.replace('\\xA0',\x20'\x20');\x20//\x20replace\x20non-breaking\x20spaces\x0a\x09}\x0a\x0a\x09//\x20When\x20presenter\x20notes\x20are\x20enabled,\x20the\x20index\x20passed\x0a\x09//\x20here\x20will\x20identify\x20the\x20playground\x20to\x20be\x20synced\x0a\x09function\x20init(code,\x20index)\x20{\x0a\x09\x09var\x20output\x20=\x20document.createElement('div');\x0a\x09\x09var\x20outpre\x20=\x20document.createElement('pre');\x0a\x09\x09var\x20running;\x0a\x0a\x09\x09if\x20($\x20&&\x20$(output).resizable)\x20{\x0a\x09\x09\x09$(output).resizable({\x0a\x09\x09\x09\x09handles:\x20\x09'n,w,nw',\x0a\x09\x09\x09\x09minHeight:\x0927,\x0a\x09\x09\x09\x09minWidth:\x09135,\x0a\x09\x09\x09\x09maxHeight:\x09608,\x0a\x09\x09\x09\x09maxWidth:\x09990\x0a\x09\x09\x09});\x0a\x09\x09}\x0a\x0a\x09\x09function\x20onKill()\x20{\x0a\x09\x09\x09if\x20(running)\x20running.Kill();\x0a\x09\x09\x09if\x20(window.notesEnabled)\x20updatePlayStorage('onKill',\x20index);\x0a\x09\x09}\x0a\x0a\x09\x09function\x20onRun(e)\x20{\x0a\x09\x09\x09var\x20sk\x20=\x20e.shiftKey\x20||\x20localStorage.getItem('play-shiftKey')\x20===\x20'true';\x0a\x09\x09\x09if\x20(running)\x20running.Kill();\x0a\x09\x09\x09output.style.display\x20=\x20'block';\x0a\x09\x09\x09outpre.innerHTML\x20=\x20'';\x0a\x09\x09\x09run1.style.display\x20=\x20'none';\x0a\x09\x09\x09var\x20options\x20=\x20{Race:\x20sk};\x0a\x09\x09\x09running\x20=\x20transport.Run(text(code),\x20PlaygroundOutput(outpre),\x20options);\x0a\x09\x09\x09if\x20(window.notesEnabled)\x20updatePlayStorage('onRun',\x20index,\x20e);\x0a\x09\x09}\x0a\x0a\x09\x09function\x20onClose()\x20{\x0a\x09\x09\x09if\x20(running)\x20running.Kill();\x0a\x09\x09\x09output.style.display\x20=\x20'none';\x0a\x09\x09\x09run1.style.display\x20=\x20'inline-block';\x0a\x09\x09\x09if\x20(window.notesEnabled)\x20updatePlayStorage('onClose',\x20index);\x0a\x09\x09}\x0a\x0a\x09\x09if\x20(window.notesEnabled)\x20{\x0a\x09\x09\x09playgroundHandlers.onRun.push(onRun);\x0a\x09\x09\x09playgroundHandlers.onClose.push(onClose);\x0a\x09\x09\x09playgroundHandlers.onKill.push(onKill);\x0a\x09\x09}\x0a\x0a\x09\x09var\x20run1\x20=\x20document.createElement('button');\x0a\x09\x09run1.innerHTML\x20=\x20'Run';\x0a\x09\x09run1.className\x20=\x20'run';\x0a\x09\x09run1.addEventListener(\"click\",\x20onRun,\x20false);\x0a\x09\x09var\x20run2\x20=\x20document.createElement('button');\x0a\x09\x09run2.className\x20=\x20'run';\x0a\x09\x09run2.innerHTML\x20=\x20'Run';\x0a\x09\x09run2.addEventListener(\"click\",\x20onRun,\x20false);\x0a\x09\x09var\x20kill\x20=\x20document.createElement('button');\x0a\x09\x09kill.className\x20=\x20'kill';\x0a\x09\x09kill.innerHTML\x20=\x20'Kill';\x0a\x09\x09kill.addEventListener(\"click\",\x20onKill,\x20false);\x0a\x09\x09var\x20close\x20=\x20document.createElement('button');\x0a\x09\x09close.className\x20=\x20'close';\x0a\x09\x09close.innerHTML\x20=\x20'Close';\x0a\x09\x09close.addEventListener(\"click\",\x20onClose,\x20false);\x0a\x0a\x09\x09var\x20button\x20=\x20document.createElement('div');\x0a\x09\x09button.classList.add('buttons');\x0a\x09\x09button.appendChild(run1);\x0a\x09\x09//\x20Hack\x20to\x20simulate\x20insertAfter\x0a\x09\x09code.parentNode.insertBefore(button,\x20code.nextSibling);\x0a\x0a\x09\x09var\x20buttons\x20=\x20document.createElement('div');\x0a\x09\x09buttons.classList.add('buttons');\x0a\x09\x09buttons.appendChild(run2);\x0a\x09\x09buttons.appendChild(kill);\x0a\x09\x09buttons.appendChild(close);\x0a\x0a\x09\x09output.classList.add('output');\x0a\x09\x09output.appendChild(buttons);\x0a\x09\x09output.appendChild(outpre);\x0a\x09\x09output.style.display\x20=\x20'none';\x0a\x09\x09code.parentNode.insertBefore(output,\x20button.nextSibling);\x0a\x09}\x0a\x0a\x09var\x20play\x20=\x20document.querySelectorAll('div.playground');\x0a\x09for\x20(var\x20i\x20=\x200;\x20i\x20<\x20play.length;\x20i++)\x20{\x0a\x09\x09init(play[i],\x20i);\x0a\x09}\x0a}\x0a", - - "playground.js": "//\x20Copyright\x202012\x20The\x20Go\x20Authors.\x20All\x20rights\x20reserved.\x0a//\x20Use\x20of\x20this\x20source\x20code\x20is\x20governed\x20by\x20a\x20BSD-style\x0a//\x20license\x20that\x20can\x20be\x20found\x20in\x20the\x20LICENSE\x20file.\x0a\x0a/*\x0aIn\x20the\x20absence\x20of\x20any\x20formal\x20way\x20to\x20specify\x20interfaces\x20in\x20JavaScript,\x0ahere's\x20a\x20skeleton\x20implementation\x20of\x20a\x20playground\x20transport.\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20function\x20Transport()\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20Set\x20up\x20any\x20transport\x20state\x20(eg,\x20make\x20a\x20websocket\x20connection).\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Run:\x20function(body,\x20output,\x20options)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20Compile\x20and\x20run\x20the\x20program\x20'body'\x20with\x20'options'.\x0a\x09\x09\x09\x09//\x20Call\x20the\x20'output'\x20callback\x20to\x20display\x20program\x20output.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Kill:\x20function()\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20Kill\x20the\x20running\x20program.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20};\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20};\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x09//\x20The\x20output\x20callback\x20is\x20called\x20multiple\x20times,\x20and\x20each\x20time\x20it\x20is\x0a\x09//\x20passed\x20an\x20object\x20of\x20this\x20form.\x0a\x20\x20\x20\x20\x20\x20\x20\x20var\x20write\x20=\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Kind:\x20'string',\x20//\x20'start',\x20'stdout',\x20'stderr',\x20'end'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Body:\x20'string'\x20\x20//\x20content\x20of\x20write\x20or\x20end\x20status\x20message\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x09//\x20The\x20first\x20call\x20must\x20be\x20of\x20Kind\x20'start'\x20with\x20no\x20body.\x0a\x09//\x20Subsequent\x20calls\x20may\x20be\x20of\x20Kind\x20'stdout'\x20or\x20'stderr'\x0a\x09//\x20and\x20must\x20have\x20a\x20non-null\x20Body\x20string.\x0a\x09//\x20The\x20final\x20call\x20should\x20be\x20of\x20Kind\x20'end'\x20with\x20an\x20optional\x0a\x09//\x20Body\x20string,\x20signifying\x20a\x20failure\x20(\"killed\",\x20for\x20example).\x0a\x0a\x09//\x20The\x20output\x20callback\x20must\x20be\x20of\x20this\x20form.\x0a\x09//\x20See\x20PlaygroundOutput\x20(below)\x20for\x20an\x20implementation.\x0a\x20\x20\x20\x20\x20\x20\x20\x20function\x20outputCallback(write)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a*/\x0a\x0a//\x20HTTPTransport\x20is\x20the\x20default\x20transport.\x0a//\x20enableVet\x20enables\x20running\x20vet\x20if\x20a\x20program\x20was\x20compiled\x20and\x20ran\x20successfully.\x0a//\x20If\x20vet\x20returned\x20any\x20errors,\x20display\x20them\x20before\x20the\x20output\x20of\x20a\x20program.\x0afunction\x20HTTPTransport(enableVet)\x20{\x0a\x09'use\x20strict';\x0a\x0a\x09function\x20playback(output,\x20data)\x20{\x0a\x09\x09//\x20Backwards\x20compatibility:\x20default\x20values\x20do\x20not\x20affect\x20the\x20output.\x0a\x09\x09var\x20events\x20=\x20data.Events\x20||\x20[];\x0a\x09\x09var\x20errors\x20=\x20data.Errors\x20||\x20\"\";\x0a\x09\x09var\x20status\x20=\x20data.Status\x20||\x200;\x0a\x09\x09var\x20isTest\x20=\x20data.IsTest\x20||\x20false;\x0a\x09\x09var\x20testsFailed\x20=\x20data.TestsFailed\x20||\x200;\x0a\x0a\x09\x09var\x20timeout;\x0a\x09\x09output({Kind:\x20'start'});\x0a\x09\x09function\x20next()\x20{\x0a\x09\x09\x09if\x20(!events\x20||\x20events.length\x20===\x200)\x20{\x0a\x09\x09\x09\x09if\x20(isTest)\x20{\x0a\x09\x09\x09\x09\x09if\x20(testsFailed\x20>\x200)\x20{\x0a\x09\x09\x09\x09\x09\x09output({Kind:\x20'system',\x20Body:\x20'\\n'+testsFailed+'\x20test'+(testsFailed>1?'s':'')+'\x20failed.'});\x0a\x09\x09\x09\x09\x09}\x20else\x20{\x0a\x09\x09\x09\x09\x09\x09output({Kind:\x20'system',\x20Body:\x20'\\nAll\x20tests\x20passed.'});\x0a\x09\x09\x09\x09\x09}\x0a\x09\x09\x09\x09}\x20else\x20{\x0a\x09\x09\x09\x09\x09if\x20(status\x20>\x200)\x20{\x0a\x09\x09\x09\x09\x09\x09output({Kind:\x20'end',\x20Body:\x20'status\x20'\x20+\x20status\x20+\x20'.'});\x0a\x09\x09\x09\x09\x09}\x20else\x20{\x0a\x09\x09\x09\x09\x09\x09if\x20(errors\x20!==\x20\"\")\x20{\x0a\x09\x09\x09\x09\x09\x09\x09//\x20errors\x20are\x20displayed\x20only\x20in\x20the\x20case\x20of\x20timeout.\x0a\x09\x09\x09\x09\x09\x09\x09output({Kind:\x20'end',\x20Body:\x20errors\x20+\x20'.'});\x0a\x09\x09\x09\x09\x09\x09}\x20else\x20{\x0a\x09\x09\x09\x09\x09\x09\x09output({Kind:\x20'end'});\x0a\x09\x09\x09\x09\x09\x09}\x0a\x09\x09\x09\x09\x09}\x0a\x09\x09\x09\x09}\x0a\x09\x09\x09\x09return;\x0a\x09\x09\x09}\x0a\x09\x09\x09var\x20e\x20=\x20events.shift();\x0a\x09\x09\x09if\x20(e.Delay\x20===\x200)\x20{\x0a\x09\x09\x09\x09output({Kind:\x20e.Kind,\x20Body:\x20e.Message});\x0a\x09\x09\x09\x09next();\x0a\x09\x09\x09\x09return;\x0a\x09\x09\x09}\x0a\x09\x09\x09timeout\x20=\x20setTimeout(function()\x20{\x0a\x09\x09\x09\x09output({Kind:\x20e.Kind,\x20Body:\x20e.Message});\x0a\x09\x09\x09\x09next();\x0a\x09\x09\x09},\x20e.Delay\x20/\x201000000);\x0a\x09\x09}\x0a\x09\x09next();\x0a\x09\x09return\x20{\x0a\x09\x09\x09Stop:\x20function()\x20{\x0a\x09\x09\x09\x09clearTimeout(timeout);\x0a\x09\x09\x09}\x0a\x09\x09};\x0a\x09}\x0a\x0a\x09function\x20error(output,\x20msg)\x20{\x0a\x09\x09output({Kind:\x20'start'});\x0a\x09\x09output({Kind:\x20'stderr',\x20Body:\x20msg});\x0a\x09\x09output({Kind:\x20'end'});\x0a\x09}\x0a\x0a\x09function\x20buildFailed(output,\x20msg)\x20{\x0a\x09\x09output({Kind:\x20'start'});\x0a\x09\x09output({Kind:\x20'stderr',\x20Body:\x20msg});\x0a\x09\x09output({Kind:\x20'system',\x20Body:\x20'\\nGo\x20build\x20failed.'});\x0a\x09}\x0a\x0a\x09var\x20seq\x20=\x200;\x0a\x09return\x20{\x0a\x09\x09Run:\x20function(body,\x20output,\x20options)\x20{\x0a\x09\x09\x09seq++;\x0a\x09\x09\x09var\x20cur\x20=\x20seq;\x0a\x09\x09\x09var\x20playing;\x0a\x09\x09\x09$.ajax('/compile',\x20{\x0a\x09\x09\x09\x09type:\x20'POST',\x0a\x09\x09\x09\x09data:\x20{'version':\x202,\x20'body':\x20body,\x20'withVet':\x20enableVet},\x0a\x09\x09\x09\x09dataType:\x20'json',\x0a\x09\x09\x09\x09success:\x20function(data)\x20{\x0a\x09\x09\x09\x09\x09if\x20(seq\x20!=\x20cur)\x20return;\x0a\x09\x09\x09\x09\x09if\x20(!data)\x20return;\x0a\x09\x09\x09\x09\x09if\x20(playing\x20!=\x20null)\x20playing.Stop();\x0a\x09\x09\x09\x09\x09if\x20(data.Errors)\x20{\x0a\x09\x09\x09\x09\x09\x09if\x20(data.Errors\x20===\x20'process\x20took\x20too\x20long')\x20{\x0a\x09\x09\x09\x09\x09\x09\x09//\x20Playback\x20the\x20output\x20that\x20was\x20captured\x20before\x20the\x20timeout.\x0a\x09\x09\x09\x09\x09\x09\x09playing\x20=\x20playback(output,\x20data);\x0a\x09\x09\x09\x09\x09\x09}\x20else\x20{\x0a\x09\x09\x09\x09\x09\x09\x09buildFailed(output,\x20data.Errors);\x0a\x09\x09\x09\x09\x09\x09}\x0a\x09\x09\x09\x09\x09\x09return;\x0a\x09\x09\x09\x09\x09}\x0a\x09\x09\x09\x09\x09if\x20(!data.Events)\x20{\x0a\x09\x09\x09\x09\x09\x09data.Events\x20=\x20[];\x0a\x09\x09\x09\x09\x09}\x0a\x09\x09\x09\x09\x09if\x20(data.VetErrors)\x20{\x0a\x09\x09\x09\x09\x09\x09//\x20Inject\x20errors\x20from\x20the\x20vet\x20as\x20the\x20first\x20events\x20in\x20the\x20output.\x0a\x09\x09\x09\x09\x09\x09data.Events.unshift({Message:\x20'Go\x20vet\x20exited.\\n\\n',\x20Kind:\x20'system',\x20Delay:\x200});\x0a\x09\x09\x09\x09\x09\x09data.Events.unshift({Message:\x20data.VetErrors,\x20Kind:\x20'stderr',\x20Delay:\x200});\x0a\x09\x09\x09\x09\x09}\x0a\x0a\x09\x09\x09\x09\x09if\x20(!enableVet\x20||\x20data.VetOK\x20||\x20data.VetErrors)\x20{\x0a\x09\x09\x09\x09\x09\x09playing\x20=\x20playback(output,\x20data);\x0a\x09\x09\x09\x09\x09\x09return;\x0a\x09\x09\x09\x09\x09}\x0a\x0a\x09\x09\x09\x09\x09//\x20In\x20case\x20the\x20server\x20support\x20doesn't\x20support\x0a\x09\x09\x09\x09\x09//\x20compile+vet\x20in\x20same\x20request\x20signaled\x20by\x20the\x0a\x09\x09\x09\x09\x09//\x20'withVet'\x20parameter\x20above,\x20also\x20try\x20the\x20old\x20way.\x0a\x09\x09\x09\x09\x09//\x20TODO:\x20remove\x20this\x20when\x20it\x20falls\x20out\x20of\x20use.\x0a\x09\x09\x09\x09\x09//\x20It\x20is\x202019-05-13\x20now.\x0a\x09\x09\x09\x09\x09$.ajax(\"/vet\",\x20{\x0a\x09\x09\x09\x09\x09\x09data:\x20{\"body\":\x20body},\x0a\x09\x09\x09\x09\x09\x09type:\x20\"POST\",\x0a\x09\x09\x09\x09\x09\x09dataType:\x20\"json\",\x0a\x09\x09\x09\x09\x09\x09success:\x20function(dataVet)\x20{\x0a\x09\x09\x09\x09\x09\x09\x09if\x20(dataVet.Errors)\x20{\x0a\x09\x09\x09\x09\x09\x09\x09\x09//\x20inject\x20errors\x20from\x20the\x20vet\x20as\x20the\x20first\x20events\x20in\x20the\x20output\x0a\x09\x09\x09\x09\x09\x09\x09\x09data.Events.unshift({Message:\x20'Go\x20vet\x20exited.\\n\\n',\x20Kind:\x20'system',\x20Delay:\x200});\x0a\x09\x09\x09\x09\x09\x09\x09\x09data.Events.unshift({Message:\x20dataVet.Errors,\x20Kind:\x20'stderr',\x20Delay:\x200});\x0a\x09\x09\x09\x09\x09\x09\x09}\x0a\x09\x09\x09\x09\x09\x09\x09playing\x20=\x20playback(output,\x20data);\x0a\x09\x09\x09\x09\x09\x09},\x0a\x09\x09\x09\x09\x09\x09error:\x20function()\x20{\x0a\x09\x09\x09\x09\x09\x09\x09playing\x20=\x20playback(output,\x20data);\x0a\x09\x09\x09\x09\x09\x09}\x0a\x09\x09\x09\x09\x09});\x0a\x09\x09\x09\x09},\x0a\x09\x09\x09\x09error:\x20function()\x20{\x0a\x09\x09\x09\x09\x09error(output,\x20'Error\x20communicating\x20with\x20remote\x20server.');\x0a\x09\x09\x09\x09}\x0a\x09\x09\x09});\x0a\x09\x09\x09return\x20{\x0a\x09\x09\x09\x09Kill:\x20function()\x20{\x0a\x09\x09\x09\x09\x09if\x20(playing\x20!=\x20null)\x20playing.Stop();\x0a\x09\x09\x09\x09\x09output({Kind:\x20'end',\x20Body:\x20'killed'});\x0a\x09\x09\x09\x09}\x0a\x09\x09\x09};\x0a\x09\x09}\x0a\x09};\x0a}\x0a\x0afunction\x20SocketTransport()\x20{\x0a\x09'use\x20strict';\x0a\x0a\x09var\x20id\x20=\x200;\x0a\x09var\x20outputs\x20=\x20{};\x0a\x09var\x20started\x20=\x20{};\x0a\x09var\x20websocket;\x0a\x09if\x20(window.location.protocol\x20==\x20\"http:\")\x20{\x0a\x09\x09websocket\x20=\x20new\x20WebSocket('ws://'\x20+\x20window.location.host\x20+\x20'/socket');\x0a\x09}\x20else\x20if\x20(window.location.protocol\x20==\x20\"https:\")\x20{\x0a\x09\x09websocket\x20=\x20new\x20WebSocket('wss://'\x20+\x20window.location.host\x20+\x20'/socket');\x0a\x09}\x0a\x0a\x09websocket.onclose\x20=\x20function()\x20{\x0a\x09\x09console.log('websocket\x20connection\x20closed');\x0a\x09};\x0a\x0a\x09websocket.onmessage\x20=\x20function(e)\x20{\x0a\x09\x09var\x20m\x20=\x20JSON.parse(e.data);\x0a\x09\x09var\x20output\x20=\x20outputs[m.Id];\x0a\x09\x09if\x20(output\x20===\x20null)\x0a\x09\x09\x09return;\x0a\x09\x09if\x20(!started[m.Id])\x20{\x0a\x09\x09\x09output({Kind:\x20'start'});\x0a\x09\x09\x09started[m.Id]\x20=\x20true;\x0a\x09\x09}\x0a\x09\x09output({Kind:\x20m.Kind,\x20Body:\x20m.Body});\x0a\x09};\x0a\x0a\x09function\x20send(m)\x20{\x0a\x09\x09websocket.send(JSON.stringify(m));\x0a\x09}\x0a\x0a\x09return\x20{\x0a\x09\x09Run:\x20function(body,\x20output,\x20options)\x20{\x0a\x09\x09\x09var\x20thisID\x20=\x20id+'';\x0a\x09\x09\x09id++;\x0a\x09\x09\x09outputs[thisID]\x20=\x20output;\x0a\x09\x09\x09send({Id:\x20thisID,\x20Kind:\x20'run',\x20Body:\x20body,\x20Options:\x20options});\x0a\x09\x09\x09return\x20{\x0a\x09\x09\x09\x09Kill:\x20function()\x20{\x0a\x09\x09\x09\x09\x09send({Id:\x20thisID,\x20Kind:\x20'kill'});\x0a\x09\x09\x09\x09}\x0a\x09\x09\x09};\x0a\x09\x09}\x0a\x09};\x0a}\x0a\x0afunction\x20PlaygroundOutput(el)\x20{\x0a\x09'use\x20strict';\x0a\x0a\x09return\x20function(write)\x20{\x0a\x09\x09if\x20(write.Kind\x20==\x20'start')\x20{\x0a\x09\x09\x09el.innerHTML\x20=\x20'';\x0a\x09\x09\x09return;\x0a\x09\x09}\x0a\x0a\x09\x09var\x20cl\x20=\x20'system';\x0a\x09\x09if\x20(write.Kind\x20==\x20'stdout'\x20||\x20write.Kind\x20==\x20'stderr')\x0a\x09\x09\x09cl\x20=\x20write.Kind;\x0a\x0a\x09\x09var\x20m\x20=\x20write.Body;\x0a\x09\x09if\x20(write.Kind\x20==\x20'end')\x20{\x0a\x09\x09\x09m\x20=\x20'\\nProgram\x20exited'\x20+\x20(m?(':\x20'+m):'.');\x0a\x09\x09}\x0a\x0a\x09\x09if\x20(m.indexOf('IMAGE:')\x20===\x200)\x20{\x0a\x09\x09\x09//\x20TODO(adg):\x20buffer\x20all\x20writes\x20before\x20creating\x20image\x0a\x09\x09\x09var\x20url\x20=\x20'data:image/png;base64,'\x20+\x20m.substr(6);\x0a\x09\x09\x09var\x20img\x20=\x20document.createElement('img');\x0a\x09\x09\x09img.src\x20=\x20url;\x0a\x09\x09\x09el.appendChild(img);\x0a\x09\x09\x09return;\x0a\x09\x09}\x0a\x0a\x09\x09//\x20^L\x20clears\x20the\x20screen.\x0a\x09\x09var\x20s\x20=\x20m.split('\\x0c');\x0a\x09\x09if\x20(s.length\x20>\x201)\x20{\x0a\x09\x09\x09el.innerHTML\x20=\x20'';\x0a\x09\x09\x09m\x20=\x20s.pop();\x0a\x09\x09}\x0a\x0a\x09\x09m\x20=\x20m.replace(/&/g,\x20'&');\x0a\x09\x09m\x20=\x20m.replace(//g,\x20'>');\x0a\x0a\x09\x09var\x20needScroll\x20=\x20(el.scrollTop\x20+\x20el.offsetHeight)\x20==\x20el.scrollHeight;\x0a\x0a\x09\x09var\x20span\x20=\x20document.createElement('span');\x0a\x09\x09span.className\x20=\x20cl;\x0a\x09\x09span.innerHTML\x20=\x20m;\x0a\x09\x09el.appendChild(span);\x0a\x0a\x09\x09if\x20(needScroll)\x0a\x09\x09\x09el.scrollTop\x20=\x20el.scrollHeight\x20-\x20el.offsetHeight;\x0a\x09};\x0a}\x0a\x0a(function()\x20{\x0a\x20\x20function\x20lineHighlight(error)\x20{\x0a\x20\x20\x20\x20var\x20regex\x20=\x20/prog.go:([0-9]+)/g;\x0a\x20\x20\x20\x20var\x20r\x20=\x20regex.exec(error);\x0a\x20\x20\x20\x20while\x20(r)\x20{\x0a\x20\x20\x20\x20\x20\x20$(\".lines\x20div\").eq(r[1]-1).addClass(\"lineerror\");\x0a\x20\x20\x20\x20\x20\x20r\x20=\x20regex.exec(error);\x0a\x20\x20\x20\x20}\x0a\x20\x20}\x0a\x20\x20function\x20highlightOutput(wrappedOutput)\x20{\x0a\x20\x20\x20\x20return\x20function(write)\x20{\x0a\x20\x20\x20\x20\x20\x20if\x20(write.Body)\x20lineHighlight(write.Body);\x0a\x20\x20\x20\x20\x20\x20wrappedOutput(write);\x0a\x20\x20\x20\x20};\x0a\x20\x20}\x0a\x20\x20function\x20lineClear()\x20{\x0a\x20\x20\x20\x20$(\".lineerror\").removeClass(\"lineerror\");\x0a\x20\x20}\x0a\x0a\x20\x20//\x20opts\x20is\x20an\x20object\x20with\x20these\x20keys\x0a\x20\x20//\x20\x20codeEl\x20-\x20code\x20editor\x20element\x0a\x20\x20//\x20\x20outputEl\x20-\x20program\x20output\x20element\x0a\x20\x20//\x20\x20runEl\x20-\x20run\x20button\x20element\x0a\x20\x20//\x20\x20fmtEl\x20-\x20fmt\x20button\x20element\x20(optional)\x0a\x20\x20//\x20\x20fmtImportEl\x20-\x20fmt\x20\"imports\"\x20checkbox\x20element\x20(optional)\x0a\x20\x20//\x20\x20shareEl\x20-\x20share\x20button\x20element\x20(optional)\x0a\x20\x20//\x20\x20shareURLEl\x20-\x20share\x20URL\x20text\x20input\x20element\x20(optional)\x0a\x20\x20//\x20\x20shareRedirect\x20-\x20base\x20URL\x20to\x20redirect\x20to\x20on\x20share\x20(optional)\x0a\x20\x20//\x20\x20toysEl\x20-\x20toys\x20select\x20element\x20(optional)\x0a\x20\x20//\x20\x20enableHistory\x20-\x20enable\x20using\x20HTML5\x20history\x20API\x20(optional)\x0a\x20\x20//\x20\x20transport\x20-\x20playground\x20transport\x20to\x20use\x20(default\x20is\x20HTTPTransport)\x0a\x20\x20//\x20\x20enableShortcuts\x20-\x20whether\x20to\x20enable\x20shortcuts\x20(Ctrl+S/Cmd+S\x20to\x20save)\x20(default\x20is\x20false)\x0a\x20\x20//\x20\x20enableVet\x20-\x20enable\x20running\x20vet\x20and\x20displaying\x20its\x20errors\x0a\x20\x20function\x20playground(opts)\x20{\x0a\x20\x20\x20\x20var\x20code\x20=\x20$(opts.codeEl);\x0a\x20\x20\x20\x20var\x20transport\x20=\x20opts['transport']\x20||\x20new\x20HTTPTransport(opts['enableVet']);\x0a\x20\x20\x20\x20var\x20running;\x0a\x0a\x20\x20\x20\x20//\x20autoindent\x20helpers.\x0a\x20\x20\x20\x20function\x20insertTabs(n)\x20{\x0a\x20\x20\x20\x20\x20\x20//\x20find\x20the\x20selection\x20start\x20and\x20end\x0a\x20\x20\x20\x20\x20\x20var\x20start\x20=\x20code[0].selectionStart;\x0a\x20\x20\x20\x20\x20\x20var\x20end\x20\x20\x20=\x20code[0].selectionEnd;\x0a\x20\x20\x20\x20\x20\x20//\x20split\x20the\x20textarea\x20content\x20into\x20two,\x20and\x20insert\x20n\x20tabs\x0a\x20\x20\x20\x20\x20\x20var\x20v\x20=\x20code[0].value;\x0a\x20\x20\x20\x20\x20\x20var\x20u\x20=\x20v.substr(0,\x20start);\x0a\x20\x20\x20\x20\x20\x20for\x20(var\x20i=0;\x20i\x200)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20curpos--;\x0a\x20\x20\x20\x20\x20\x20\x20\x20if\x20(el.value[curpos]\x20==\x20\"\\t\")\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20tabs++;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x20else\x20if\x20(tabs\x20>\x200\x20||\x20el.value[curpos]\x20==\x20\"\\n\")\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20break;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20setTimeout(function()\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20insertTabs(tabs);\x0a\x20\x20\x20\x20\x20\x20},\x201);\x0a\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20//\x20NOTE(cbro):\x20e\x20is\x20a\x20jQuery\x20event,\x20not\x20a\x20DOM\x20event.\x0a\x20\x20\x20\x20function\x20handleSaveShortcut(e)\x20{\x0a\x20\x20\x20\x20\x20\x20if\x20(e.isDefaultPrevented())\x20return\x20false;\x0a\x20\x20\x20\x20\x20\x20if\x20(!e.metaKey\x20&&\x20!e.ctrlKey)\x20return\x20false;\x0a\x20\x20\x20\x20\x20\x20if\x20(e.key\x20!=\x20\"S\"\x20&&\x20e.key\x20!=\x20\"s\")\x20return\x20false;\x0a\x0a\x20\x20\x20\x20\x20\x20e.preventDefault();\x0a\x0a\x20\x20\x20\x20\x20\x20//\x20Share\x20and\x20save\x0a\x20\x20\x20\x20\x20\x20share(function(url)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20window.location.href\x20=\x20url\x20+\x20\".go?download=true\";\x0a\x20\x20\x20\x20\x20\x20});\x0a\x0a\x20\x20\x20\x20\x20\x20return\x20true;\x0a\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20function\x20keyHandler(e)\x20{\x0a\x20\x20\x20\x20\x20\x20if\x20(opts.enableShortcuts\x20&&\x20handleSaveShortcut(e))\x20return;\x0a\x0a\x20\x20\x20\x20\x20\x20if\x20(e.keyCode\x20==\x209\x20&&\x20!e.ctrlKey)\x20{\x20//\x20tab\x20(but\x20not\x20ctrl-tab)\x0a\x20\x20\x20\x20\x20\x20\x20\x20insertTabs(1);\x0a\x20\x20\x20\x20\x20\x20\x20\x20e.preventDefault();\x0a\x20\x20\x20\x20\x20\x20\x20\x20return\x20false;\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20if\x20(e.keyCode\x20==\x2013)\x20{\x20//\x20enter\x0a\x20\x20\x20\x20\x20\x20\x20\x20if\x20(e.shiftKey)\x20{\x20//\x20+shift\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20run();\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20e.preventDefault();\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x20false;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x20if\x20(e.ctrlKey)\x20{\x20//\x20+control\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20fmt();\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20e.preventDefault();\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20autoindent(e.target);\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20return\x20true;\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20code.unbind('keydown').bind('keydown',\x20keyHandler);\x0a\x20\x20\x20\x20var\x20outdiv\x20=\x20$(opts.outputEl).empty();\x0a\x20\x20\x20\x20var\x20output\x20=\x20$('
        ').appendTo(outdiv);\x0a\x0a\x20\x20\x20\x20function\x20body()\x20{\x0a\x20\x20\x20\x20\x20\x20return\x20$(opts.codeEl).val();\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20function\x20setBody(text)\x20{\x0a\x20\x20\x20\x20\x20\x20$(opts.codeEl).val(text);\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20function\x20origin(href)\x20{\x0a\x20\x20\x20\x20\x20\x20return\x20(\"\"+href).split(\"/\").slice(0,\x203).join(\"/\");\x0a\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20var\x20pushedEmpty\x20=\x20(window.location.pathname\x20==\x20\"/\");\x0a\x20\x20\x20\x20function\x20inputChanged()\x20{\x0a\x20\x20\x20\x20\x20\x20if\x20(pushedEmpty)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20return;\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20pushedEmpty\x20=\x20true;\x0a\x20\x20\x20\x20\x20\x20$(opts.shareURLEl).hide();\x0a\x20\x20\x20\x20\x20\x20window.history.pushState(null,\x20\"\",\x20\"/\");\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20function\x20popState(e)\x20{\x0a\x20\x20\x20\x20\x20\x20if\x20(e\x20===\x20null)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20return;\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20if\x20(e\x20&&\x20e.state\x20&&\x20e.state.code)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20setBody(e.state.code);\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20var\x20rewriteHistory\x20=\x20false;\x0a\x20\x20\x20\x20if\x20(window.history\x20&&\x20window.history.pushState\x20&&\x20window.addEventListener\x20&&\x20opts.enableHistory)\x20{\x0a\x20\x20\x20\x20\x20\x20rewriteHistory\x20=\x20true;\x0a\x20\x20\x20\x20\x20\x20code[0].addEventListener('input',\x20inputChanged);\x0a\x20\x20\x20\x20\x20\x20window.addEventListener('popstate',\x20popState);\x0a\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20function\x20setError(error)\x20{\x0a\x20\x20\x20\x20\x20\x20if\x20(running)\x20running.Kill();\x0a\x20\x20\x20\x20\x20\x20lineClear();\x0a\x20\x20\x20\x20\x20\x20lineHighlight(error);\x0a\x20\x20\x20\x20\x20\x20output.empty().addClass(\"error\").text(error);\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20function\x20loading()\x20{\x0a\x20\x20\x20\x20\x20\x20lineClear();\x0a\x20\x20\x20\x20\x20\x20if\x20(running)\x20running.Kill();\x0a\x20\x20\x20\x20\x20\x20output.removeClass(\"error\").text('Waiting\x20for\x20remote\x20server...');\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20function\x20run()\x20{\x0a\x20\x20\x20\x20\x20\x20loading();\x0a\x20\x20\x20\x20\x20\x20running\x20=\x20transport.Run(body(),\x20highlightOutput(PlaygroundOutput(output[0])));\x0a\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20function\x20fmt()\x20{\x0a\x20\x20\x20\x20\x20\x20loading();\x0a\x20\x20\x20\x20\x20\x20var\x20data\x20=\x20{\"body\":\x20body()};\x0a\x20\x20\x20\x20\x20\x20if\x20($(opts.fmtImportEl).is(\":checked\"))\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20data[\"imports\"]\x20=\x20\"true\";\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20$.ajax(\"/fmt\",\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20data:\x20data,\x0a\x20\x20\x20\x20\x20\x20\x20\x20type:\x20\"POST\",\x0a\x20\x20\x20\x20\x20\x20\x20\x20dataType:\x20\"json\",\x0a\x20\x20\x20\x20\x20\x20\x20\x20success:\x20function(data)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(data.Error)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20setError(data.Error);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20setBody(data.Body);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20setError(\"\");\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20});\x0a\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20var\x20shareURL;\x20//\x20jQuery\x20element\x20to\x20show\x20the\x20shared\x20URL.\x0a\x20\x20\x20\x20var\x20sharing\x20=\x20false;\x20//\x20true\x20if\x20there\x20is\x20a\x20pending\x20request.\x0a\x20\x20\x20\x20var\x20shareCallbacks\x20=\x20[];\x0a\x20\x20\x20\x20function\x20share(opt_callback)\x20{\x0a\x20\x20\x20\x20\x20\x20if\x20(opt_callback)\x20shareCallbacks.push(opt_callback);\x0a\x0a\x20\x20\x20\x20\x20\x20if\x20(sharing)\x20return;\x0a\x20\x20\x20\x20\x20\x20sharing\x20=\x20true;\x0a\x0a\x20\x20\x20\x20\x20\x20var\x20sharingData\x20=\x20body();\x0a\x20\x20\x20\x20\x20\x20$.ajax(\"/share\",\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20processData:\x20false,\x0a\x20\x20\x20\x20\x20\x20\x20\x20data:\x20sharingData,\x0a\x20\x20\x20\x20\x20\x20\x20\x20type:\x20\"POST\",\x0a\x20\x20\x20\x20\x20\x20\x20\x20contentType:\x20\"text/plain;\x20charset=utf-8\",\x0a\x20\x20\x20\x20\x20\x20\x20\x20complete:\x20function(xhr)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20sharing\x20=\x20false;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(xhr.status\x20!=\x20200)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20alert(\"Server\x20error;\x20try\x20again.\");\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(opts.shareRedirect)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20window.location\x20=\x20opts.shareRedirect\x20+\x20xhr.responseText;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20var\x20path\x20=\x20\"/p/\"\x20+\x20xhr.responseText;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20var\x20url\x20=\x20origin(window.location)\x20+\x20path;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20for\x20(var\x20i\x20=\x200;\x20i\x20<\x20shareCallbacks.length;\x20i++)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20shareCallbacks[i](url);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20shareCallbacks\x20=\x20[];\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(shareURL)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20shareURL.show().val(url).focus().select();\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(rewriteHistory)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20var\x20historyData\x20=\x20{\"code\":\x20sharingData};\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20window.history.pushState(historyData,\x20\"\",\x20path);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20pushedEmpty\x20=\x20false;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20});\x0a\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20$(opts.runEl).click(run);\x0a\x20\x20\x20\x20$(opts.fmtEl).click(fmt);\x0a\x0a\x20\x20\x20\x20if\x20(opts.shareEl\x20!==\x20null\x20&&\x20(opts.shareURLEl\x20!==\x20null\x20||\x20opts.shareRedirect\x20!==\x20null))\x20{\x0a\x20\x20\x20\x20\x20\x20if\x20(opts.shareURLEl)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20shareURL\x20=\x20$(opts.shareURLEl).hide();\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20$(opts.shareEl).click(function()\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20share();\x0a\x20\x20\x20\x20\x20\x20});\x0a\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20if\x20(opts.toysEl\x20!==\x20null)\x20{\x0a\x20\x20\x20\x20\x20\x20$(opts.toysEl).bind('change',\x20function()\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20var\x20toy\x20=\x20$(this).val();\x0a\x20\x20\x20\x20\x20\x20\x20\x20$.ajax(\"/doc/play/\"+toy,\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20processData:\x20false,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20type:\x20\"GET\",\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20complete:\x20function(xhr)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(xhr.status\x20!=\x20200)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20alert(\"Server\x20error;\x20try\x20again.\");\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20setBody(xhr.responseText);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20});\x0a\x20\x20\x20\x20\x20\x20});\x0a\x20\x20\x20\x20}\x0a\x20\x20}\x0a\x0a\x20\x20window.playground\x20=\x20playground;\x0a})();\x0a",
        -
        -	"search.html": "\x0a\x0a{{\x20$colCount\x20:=\x20tocColCount\x20.}}\x0a{{/*\x20Generate\x20the\x20TOC\x20*/}}\x0a\x0a{{range\x20$key,\x20$val\x20:=\x20.Idents}}\x0a\x09{{if\x20$val}}\x0a\x09\x09{{$key.Name}}\x0a\x09\x09\x0a\x09{{end}}\x0a{{end}}\x0a\x0a{{if\x20not\x20.Idents}}\x0a\x09{{with\x20.Pak}}\x0a\x09\x09Package\x20{{html\x20$.Query}}\x0a\x09\x09\x0a\x09{{end}}\x0a{{end}}\x0a\x0a{{with\x20.Hit}}\x0a\x09{{with\x20.Decls}}\x0a\x09\x09Package-level\x20declarations\x0a\x09\x09\x0a\x09\x09{{range\x20.}}\x0a\x09\x09\x09{{$pkg_html\x20:=\x20pkgLink\x20.Pak.Path\x20|\x20html}}\x0a\x09\x09\x09package\x20{{html\x20.Pak.Name}}\x0a\x09\x09\x09\x0a\x09\x09{{end}}\x0a\x09{{end}}\x0a\x09{{with\x20.Others}}\x0a\x09\x09Local\x20declarations\x20and\x20uses\x0a\x09\x09\x0a\x09\x09{{range\x20.}}\x0a\x09\x09\x09{{$pkg_html\x20:=\x20pkgLink\x20.Pak.Path\x20|\x20html}}\x0a\x09\x09\x09package\x20{{html\x20.Pak.Name}}\x0a\x09\x09\x09\x0a\x09\x09{{end}}\x0a\x09{{end}}\x0a{{end}}\x0a\x0a{{with\x20.Textual}}\x0a\x09{{if\x20$.Complete}}\x0a\x09\x09{{html\x20$.Found}}\x20textual\x20occurrences\x0a\x09{{else}}\x0a\x09\x09More\x20than\x20{{html\x20$.Found}}\x20textual\x20occurrences\x0a\x09{{end}}\x0a{{end}}\x0a\x0a\x0a{{with\x20.Alert}}\x0a\x09

        \x0a\x09{{html\x20.}}\x0a\x09

        \x0a{{end}}\x0a{{with\x20.Alt}}\x0a\x09

        \x0a\x09Did\x20you\x20mean:\x20\x0a\x09{{range\x20.Alts}}\x0a\x09\x09{{html\x20.}}\x0a\x09{{end}}\x0a\x09

        \x0a{{end}}\x0a", - - "searchcode.html": "\x0a{{$query_url\x20:=\x20urlquery\x20.Query}}\x0a{{if\x20not\x20.Idents}}\x0a\x09{{with\x20.Pak}}\x0a\x09\x09Package\x20{{html\x20$.Query}}\x0a\x09\x09

        \x0a\x09\x09\x0a\x09\x09{{range\x20.}}\x0a\x09\x09\x09{{$pkg_html\x20:=\x20pkgLink\x20.Pak.Path\x20|\x20html}}\x0a\x09\x09\x09{{$pkg_html}}\x0a\x09\x09{{end}}\x0a\x09\x09\x0a\x09\x09

        \x0a\x09{{end}}\x0a{{end}}\x0a{{with\x20.Hit}}\x0a\x09{{with\x20.Decls}}\x0a\x09\x09Package-level\x20declarations\x0a\x09\x09{{range\x20.}}\x0a\x09\x09\x09{{$pkg_html\x20:=\x20pkgLink\x20.Pak.Path\x20|\x20html}}\x0a\x09\x09\x09package\x20{{html\x20.Pak.Name}}\x0a\x09\x09\x09{{range\x20.Files}}\x0a\x09\x09\x09\x09{{$file\x20:=\x20.File.Path}}\x0a\x09\x09\x09\x09{{range\x20.Groups}}\x0a\x09\x09\x09\x09\x09{{range\x20.}}\x0a\x09\x09\x09\x09\x09\x09{{$line\x20:=\x20infoLine\x20.}}\x0a\x09\x09\x09\x09\x09\x09{{$file}}:{{$line}}\x0a\x09\x09\x09\x09\x09\x09{{infoSnippet_html\x20.}}\x0a\x09\x09\x09\x09\x09{{end}}\x0a\x09\x09\x09\x09{{end}}\x0a\x09\x09\x09{{end}}\x0a\x09\x09{{end}}\x0a\x09{{end}}\x0a\x09{{with\x20.Others}}\x0a\x09\x09Local\x20declarations\x20and\x20uses\x0a\x09\x09{{range\x20.}}\x0a\x09\x09\x09{{$pkg_html\x20:=\x20pkgLink\x20.Pak.Path\x20|\x20html}}\x0a\x09\x09\x09package\x20{{html\x20.Pak.Name}}\x0a\x09\x09\x09{{range\x20.Files}}\x0a\x09\x09\x09\x09{{$file\x20:=\x20.File.Path}}\x0a\x09\x09\x09\x09{{$file}}\x0a\x09\x09\x09\x09\x0a\x09\x09\x09\x09{{range\x20.Groups}}\x0a\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09{{index\x20.\x200\x20|\x20infoKind_html}}\x0a\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09{{range\x20.}}\x0a\x09\x09\x09\x09\x09\x09{{$line\x20:=\x20infoLine\x20.}}\x0a\x09\x09\x09\x09\x09\x09{{$line}}\x0a\x09\x09\x09\x09\x09{{end}}\x0a\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09{{end}}\x0a\x09\x09\x09\x09\x0a\x09\x09\x09{{end}}\x0a\x09\x09{{end}}\x0a\x09{{end}}\x0a{{end}}\x0a", - - "searchdoc.html": "\x0a{{range\x20$key,\x20$val\x20:=\x20.Idents}}\x0a\x09{{if\x20$val}}\x0a\x09\x09{{$key.Name}}\x0a\x09\x09{{range\x20$val}}\x0a\x09\x09\x09{{$pkg_html\x20:=\x20pkgLink\x20.Path\x20|\x20html}}\x0a\x09\x09\x09{{if\x20eq\x20\"Packages\"\x20$key.Name}}\x0a\x09\x09\x09\x09{{html\x20.Path}}\x0a\x09\x09\x09{{else}}\x0a\x09\x09\x09\x09{{$doc_html\x20:=\x20docLink\x20.Path\x20.Name|\x20html}}\x0a\x09\x09\x09\x09{{html\x20.Package}}.{{.Name}}\x0a\x09\x09\x09{{end}}\x0a\x09\x09\x09{{if\x20.Doc}}\x0a\x09\x09\x09\x09

        {{comment_html\x20.Doc}}

        \x0a\x09\x09\x09{{else}}\x0a\x09\x09\x09\x09

        No\x20documentation\x20available

        \x0a\x09\x09\x09{{end}}\x0a\x09\x09{{end}}\x0a\x09{{end}}\x0a{{end}}\x0a", - - "searchtxt.html": "\x0a{{$query_url\x20:=\x20urlquery\x20.Query}}\x0a{{with\x20.Textual}}\x0a\x09{{if\x20$.Complete}}\x0a\x09\x09{{html\x20$.Found}}\x20textual\x20occurrences\x0a\x09{{else}}\x0a\x09\x09More\x20than\x20{{html\x20$.Found}}\x20textual\x20occurrences\x0a\x09\x09

        \x0a\x09\x09Not\x20all\x20files\x20or\x20lines\x20containing\x20\"{{html\x20$.Query}}\"\x20are\x20shown.\x0a\x09\x09

        \x0a\x09{{end}}\x0a\x09

        \x0a\x09\x0a\x09{{range\x20.}}\x0a\x09\x09{{$file\x20:=\x20.Filename}}\x0a\x09\x09\x0a\x09\x09\x0a\x09\x09{{$file}}:\x0a\x09\x09\x0a\x09\x09\x0a\x09\x09{{len\x20.Lines}}\x0a\x09\x09\x0a\x09\x09\x0a\x09\x09{{range\x20.Lines}}\x0a\x09\x09\x09{{html\x20.}}\x0a\x09\x09{{end}}\x0a\x09\x09{{if\x20not\x20$.Complete}}\x0a\x09\x09\x09...\x0a\x09\x09{{end}}\x0a\x09\x09\x0a\x09\x09\x0a\x09{{end}}\x0a\x09{{if\x20not\x20$.Complete}}\x0a\x09\x09...\x0a\x09{{end}}\x0a\x09\x0a\x09

        \x0a{{end}}\x0a", - - "style.css": "body\x20{\x0a\x09margin:\x200;\x0a\x09font-family:\x20Arial,\x20sans-serif;\x0a\x09background-color:\x20#fff;\x0a\x09line-height:\x201.3;\x0a\x09text-align:\x20center;\x0a\x09color:\x20#222;\x0a}\x0atextarea\x20{\x0a\x09/*\x20Inherit\x20text\x20color\x20from\x20body\x20avoiding\x20illegible\x20text\x20in\x20the\x20case\x20where\x20the\x0a\x20\x09*\x20user\x20has\x20inverted\x20the\x20browsers\x20custom\x20text\x20and\x20background\x20colors.\x20*/\x0a\x09color:\x20inherit;\x0a}\x0apre,\x0acode\x20{\x0a\x09font-family:\x20Menlo,\x20monospace;\x0a\x09font-size:\x200.875rem;\x0a}\x0apre\x20{\x0a\x09line-height:\x201.4;\x0a\x09overflow-x:\x20auto;\x0a}\x0apre\x20.comment\x20{\x0a\x09color:\x20#006600;\x0a}\x0apre\x20.highlight,\x0apre\x20.highlight-comment,\x0apre\x20.selection-highlight,\x0apre\x20.selection-highlight-comment\x20{\x0a\x09background:\x20#FFFF00;\x0a}\x0apre\x20.selection,\x0apre\x20.selection-comment\x20{\x0a\x09background:\x20#FF9632;\x0a}\x0apre\x20.ln\x20{\x0a\x09color:\x20#999;\x0a\x09background:\x20#efefef;\x0a}\x0a.ln\x20{\x0a\x09-webkit-user-select:\x20none;\x0a\x09-moz-user-select:\x20none;\x0a\x09-ms-user-select:\x20none;\x0a\x09user-select:\x20none;\x0a\x0a\x09/*\x20Ensure\x208\x20characters\x20in\x20the\x20document\x20-\x20which\x20due\x20to\x20floating\x0a\x20\x20\x20*\x20point\x20rendering\x20issues,\x20might\x20have\x20a\x20width\x20of\x20less\x20than\x201\x20each\x20-\x20are\x208\x0a\x20\x20\x20*\x20characters\x20wide,\x20so\x20a\x20tab\x20in\x20the\x209th\x20position\x20indents\x20properly.\x20See\x0a\x20\x20\x20*\x20https://github.com/webcompat/web-bugs/issues/17530#issuecomment-402675091\x0a\x20\x20\x20*\x20for\x20more\x20information.\x20*/\x0a\x09display:\x20inline-block;\x0a\x09width:\x208ch;\x0a}\x0a\x0a.search-nav{\x0a\x09margin-left:\x201.25rem;\x0a\x09font-size:\x200.875rem;\x0a\x09column-gap:\x201.25rem;\x0a\x09column-fill:\x20auto;\x0a\x09column-width:\x2014rem;\x0a}\x0a\x0a.search-nav\x20.indent\x20{\x0a\x09margin-left:\x201.25rem;\x0a}\x0a\x0aa,\x0a.exampleHeading\x20.text,\x0a.expandAll\x20{\x0a\x09color:\x20#375EAB;\x0a\x09text-decoration:\x20none;\x0a}\x0aa:hover,\x0a.exampleHeading\x20.text:hover,\x0a.expandAll:hover\x20{\x0a\x09text-decoration:\x20underline;\x0a}\x0a.article\x20a\x20{\x0a\x09text-decoration:\x20underline;\x0a}\x0a.article\x20.title\x20a\x20{\x0a\x09text-decoration:\x20none;\x0a}\x0a\x0a.permalink\x20{\x0a\x09display:\x20none;\x0a}\x0a:hover\x20>\x20.permalink\x20{\x0a\x09display:\x20inline;\x0a}\x0a\x0ap,\x20li\x20{\x0a\x09max-width:\x2050rem;\x0a\x09word-wrap:\x20break-word;\x0a}\x0ap,\x0apre,\x0aul,\x0aol\x20{\x0a\x09margin:\x201.25rem;\x0a}\x0apre\x20{\x0a\x09background:\x20#EFEFEF;\x0a\x09padding:\x200.625rem;\x0a\x09border-radius:\x200.3125rem;\x0a}\x0a\x0ah1,\x0ah2,\x0ah3,\x0ah4,\x0a.rootHeading\x20{\x0a\x09margin:\x201.25rem\x200\x201.25rem;\x0a\x09padding:\x200;\x0a\x09color:\x20#375EAB;\x0a\x09font-weight:\x20bold;\x0a}\x0ah1\x20{\x0a\x09font-size:\x201.75rem;\x0a\x09line-height:\x201;\x0a}\x0ah1\x20.text-muted\x20{\x0a\x09color:#777;\x0a}\x0ah2\x20{\x0a\x09font-size:\x201.25rem;\x0a\x09background:\x20#E0EBF5;\x0a\x09padding:\x200.5rem;\x0a\x09line-height:\x201.25;\x0a\x09font-weight:\x20normal;\x0a\x09overflow:\x20auto;\x0a\x09overflow-wrap:\x20break-word;\x0a}\x0ah2\x20a\x20{\x0a\x09font-weight:\x20bold;\x0a}\x0ah3\x20{\x0a\x09font-size:\x201.25rem;\x0a\x09line-height:\x201.25;\x0a\x09overflow:\x20auto;\x0a\x09overflow-wrap:\x20break-word;\x0a}\x0ah3,\x0ah4\x20{\x0a\x09margin:\x201.25rem\x200.3125rem;\x0a}\x0ah4\x20{\x0a\x09font-size:\x201rem;\x0a}\x0a.rootHeading\x20{\x0a\x09font-size:\x201.25rem;\x0a\x09margin:\x200;\x0a}\x0a\x0ah2\x20>\x20span,\x0ah3\x20>\x20span\x20{\x0a\x09float:\x20right;\x0a\x09margin:\x200\x2025px\x200\x200;\x0a\x09font-weight:\x20normal;\x0a\x09color:\x20#5279C7;\x0a}\x0a\x0adl\x20{\x0a\x09margin:\x201.25rem;\x0a}\x0add\x20{\x0a\x09margin:\x200\x200\x200\x201.25rem;\x0a}\x0adl,\x0add\x20{\x0a\x09font-size:\x200.875rem;\x0a}\x0adiv#nav\x20table\x20td\x20{\x0a\x09vertical-align:\x20top;\x0a}\x0a\x0a#pkg-index\x20h3\x20{\x0a\x09font-size:\x201rem;\x0a}\x0a.pkg-dir\x20{\x0a\x09padding:\x200\x200.625rem;\x0a}\x0a.pkg-dir\x20table\x20{\x0a\x09border-collapse:\x20collapse;\x0a\x09border-spacing:\x200;\x0a}\x0a.pkg-name\x20{\x0a\x09padding-right:\x200.625rem;\x0a}\x0a.alert\x20{\x0a\x09color:\x20#AA0000;\x0a}\x0a\x0a.top-heading\x20{\x0a\x09float:\x20left;\x0a\x09padding:\x201.313rem\x200;\x0a\x09font-size:\x201.25rem;\x0a\x09font-weight:\x20normal;\x0a}\x0a.top-heading\x20a\x20{\x0a\x09color:\x20#222;\x0a\x09text-decoration:\x20none;\x0a}\x0a\x0a#pkg-examples\x20h3\x20{\x0a\x09float:\x20left;\x0a}\x0a\x0a#pkg-examples\x20dl\x20{\x0a\x09clear:\x20both;\x0a}\x0a\x0a.expandAll\x20{\x0a\x09cursor:\x20pointer;\x0a\x09float:\x20left;\x0a\x09margin:\x201.25rem\x200;\x0a}\x0a\x0adiv#topbar\x20{\x0a\x09background:\x20#E0EBF5;\x0a\x09height:\x204rem;\x0a\x09overflow:\x20hidden;\x0a}\x0a\x0adiv#page\x20{\x0a\x09width:\x20100%;\x0a}\x0adiv#page\x20>\x20.container,\x0adiv#topbar\x20>\x20.container\x20{\x0a\x09text-align:\x20left;\x0a\x09margin-left:\x20auto;\x0a\x09margin-right:\x20auto;\x0a\x09padding:\x200\x201.25rem;\x0a}\x0adiv#topbar\x20>\x20.container,\x0adiv#page\x20>\x20.container\x20{\x0a\x09max-width:\x2059.38rem;\x0a}\x0adiv#page.wide\x20>\x20.container,\x0adiv#topbar.wide\x20>\x20.container\x20{\x0a\x09max-width:\x20none;\x0a}\x0adiv#plusone\x20{\x0a\x09float:\x20right;\x0a\x09clear:\x20right;\x0a\x09margin-top:\x200.3125rem;\x0a}\x0a\x0adiv#footer\x20{\x0a\x09text-align:\x20center;\x0a\x09color:\x20#666;\x0a\x09font-size:\x200.875rem;\x0a\x09margin:\x202.5rem\x200;\x0a}\x0a\x0adiv#menu\x20>\x20a,\x0ainput#search,\x0adiv#learn\x20.buttons\x20a,\x0adiv.play\x20.buttons\x20a,\x0adiv#blog\x20.read\x20a,\x0a#menu-button\x20{\x0a\x09padding:\x200.625rem;\x0a\x0a\x09text-decoration:\x20none;\x0a\x09font-size:\x201rem;\x0a\x09border-radius:\x200.3125rem;\x0a}\x0adiv#playground\x20.buttons\x20a,\x0adiv#menu\x20>\x20a,\x0ainput#search,\x0a#menu-button\x20{\x0a\x09border:\x200.0625rem\x20solid\x20#375EAB;\x0a}\x0adiv#playground\x20.buttons\x20a,\x0adiv#menu\x20>\x20a,\x0a#menu-button\x20{\x0a\x09color:\x20white;\x0a\x09background:\x20#375EAB;\x0a}\x0a#playgroundButton.active\x20{\x0a\x09background:\x20white;\x0a\x09color:\x20#375EAB;\x0a}\x0aa#start,\x0adiv#learn\x20.buttons\x20a,\x0adiv.play\x20.buttons\x20a,\x0adiv#blog\x20.read\x20a\x20{\x0a\x09color:\x20#222;\x0a\x09border:\x200.0625rem\x20solid\x20#375EAB;\x0a\x09background:\x20#E0EBF5;\x0a}\x0a.download\x20{\x0a\x09width:\x209.375rem;\x0a}\x0a\x0adiv#menu\x20{\x0a\x09text-align:\x20right;\x0a\x09padding:\x200.625rem;\x0a\x09white-space:\x20nowrap;\x0a\x09max-height:\x200;\x0a\x09-moz-transition:\x20max-height\x20.25s\x20linear;\x0a\x09transition:\x20max-height\x20.25s\x20linear;\x0a\x09width:\x20100%;\x0a}\x0adiv#menu.menu-visible\x20{\x0a\x09max-height:\x2031.25rem;\x0a}\x0adiv#menu\x20>\x20a,\x0a#menu-button\x20{\x0a\x09margin:\x200.625rem\x200.125rem;\x0a\x09padding:\x200.625rem;\x0a}\x0a::-webkit-input-placeholder\x20{\x0a\x09color:\x20#7f7f7f;\x0a\x09opacity:\x201;\x0a}\x0a::placeholder\x20{\x0a\x09color:\x20#7f7f7f;\x0a\x09opacity:\x201;\x0a}\x0a#menu\x20.search-box\x20{\x0a\x09display:\x20inline-flex;\x0a\x09width:\x208.75rem;\x0a}\x0ainput#search\x20{\x0a\x09background:\x20white;\x0a\x09color:\x20#222;\x0a\x09box-sizing:\x20border-box;\x0a\x09-webkit-appearance:\x20none;\x0a\x09border-top-right-radius:\x200;\x0a\x09border-bottom-right-radius:\x200;\x0a\x09border-right:\x200;\x0a\x09margin-right:\x200;\x0a\x09flex-grow:\x201;\x0a\x09max-width:\x20100%;\x0a\x09min-width:\x205.625rem;\x0a}\x0ainput#search:-webkit-search-decoration\x20{\x0a\x09-webkit-appearance:\x20none;\x0a}\x0ainput#search:-moz-ui-invalid\x20{\x0a\x09box-shadow:\x20unset;\x0a}\x0ainput#search\x20+\x20button\x20{\x0a\x09display:\x20inline;\x0a\x09font-size:\x201em;\x0a\x09background-color:\x20#375EAB;\x0a\x09color:\x20white;\x0a\x09border:\x200.0625rem\x20solid\x20#375EAB;\x0a\x09border-top-left-radius:\x200;\x0a\x09border-top-right-radius:\x200.3125rem;\x0a\x09border-bottom-left-radius:\x200;\x0a\x09border-bottom-right-radius:\x200.3125rem;\x0a\x09margin-left:\x200;\x0a\x09cursor:\x20pointer;\x0a}\x0ainput#search\x20+\x20button\x20span\x20{\x0a\x09display:\x20flex;\x0a}\x0ainput#search\x20+\x20button\x20svg\x20{\x0a\x09fill:\x20white\x0a}\x0a\x0a#menu-button\x20{\x0a\x09display:\x20none;\x0a\x09position:\x20absolute;\x0a\x09right:\x200.3125rem;\x0a\x09top:\x200;\x0a\x09margin-right:\x200.3125rem;\x0a}\x0a#menu-button-arrow\x20{\x0a\x09display:\x20inline-block;\x0a}\x0a.vertical-flip\x20{\x0a\x09transform:\x20rotate(-180deg);\x0a}\x0a\x0adiv.left\x20{\x0a\x09float:\x20left;\x0a\x09clear:\x20left;\x0a\x09margin-right:\x202.5%;\x0a}\x0adiv.right\x20{\x0a\x09float:\x20right;\x0a\x09clear:\x20right;\x0a\x09margin-left:\x202.5%;\x0a}\x0adiv.left,\x0adiv.right\x20{\x0a\x09width:\x2045%;\x0a}\x0a\x0adiv#learn,\x0adiv#about\x20{\x0a\x09padding-top:\x201.25rem;\x0a}\x0adiv#learn\x20h2,\x0adiv#about\x20{\x0a\x09margin:\x200;\x0a}\x0adiv#about\x20{\x0a\x09font-size:\x201.25rem;\x0a\x09margin:\x200\x20auto\x201.875rem;\x0a}\x0adiv#gopher\x20{\x0a\x09background:\x20url(/doc/gopher/frontpage.png)\x20no-repeat;\x0a\x09background-position:\x20center\x20top;\x0a\x09height:\x209.688rem;\x0a\x09max-height:\x20200px;\x20/*\x20Setting\x20in\x20px\x20to\x20prevent\x20the\x20gopher\x20from\x20blowing\x20up\x20in\x20very\x20high\x20default\x20font-sizes\x20*/\x0a}\x0aa#start\x20{\x0a\x09display:\x20block;\x0a\x09padding:\x200.625rem;\x0a\x0a\x09text-align:\x20center;\x0a\x09text-decoration:\x20none;\x0a\x09border-radius:\x200.3125rem;\x0a}\x0aa#start\x20.big\x20{\x0a\x09display:\x20block;\x0a\x09font-weight:\x20bold;\x0a\x09font-size:\x201.25rem;\x0a}\x0aa#start\x20.desc\x20{\x0a\x09display:\x20block;\x0a\x09font-size:\x200.875rem;\x0a\x09font-weight:\x20normal;\x0a\x09margin-top:\x200.3125rem;\x0a}\x0a\x0adiv#learn\x20.popout\x20{\x0a\x09float:\x20right;\x0a\x09display:\x20block;\x0a\x09cursor:\x20pointer;\x0a\x09font-size:\x200.75rem;\x0a\x09background:\x20url(/doc/share.png)\x20no-repeat;\x0a\x09background-position:\x20right\x20center;\x0a\x09padding:\x200.375rem\x201.688rem;\x0a}\x0adiv#learn\x20pre,\x0adiv#learn\x20textarea\x20{\x0a\x09padding:\x200;\x0a\x09margin:\x200;\x0a\x09font-family:\x20Menlo,\x20monospace;\x0a\x09font-size:\x200.875rem;\x0a}\x0adiv#learn\x20.input\x20{\x0a\x09padding:\x200.625rem;\x0a\x09margin-top:\x200.625rem;\x0a\x09height:\x209.375rem;\x0a\x0a\x09border-top-left-radius:\x200.3125rem;\x0a\x09border-top-right-radius:\x200.3125rem;\x0a}\x0adiv#learn\x20.input\x20textarea\x20{\x0a\x09width:\x20100%;\x0a\x09height:\x20100%;\x0a\x09border:\x20none;\x0a\x09outline:\x20none;\x0a\x09resize:\x20none;\x0a}\x0adiv#learn\x20.output\x20{\x0a\x09border-top:\x20none\x20!important;\x0a\x0a\x09padding:\x200.625rem;\x0a\x09height:\x203.688rem;\x0a\x09overflow:\x20auto;\x0a\x0a\x09border-bottom-right-radius:\x200.3125rem;\x0a\x09border-bottom-left-radius:\x200.3125rem;\x0a}\x0adiv#learn\x20.output\x20pre\x20{\x0a\x09padding:\x200;\x0a\x09border-radius:\x200;\x0a}\x0adiv#learn\x20.input,\x0adiv#learn\x20.input\x20textarea,\x0adiv#learn\x20.output,\x0adiv#learn\x20.output\x20pre\x20{\x0a\x09background:\x20#FFFFD8;\x0a}\x0adiv#learn\x20.input,\x0adiv#learn\x20.output\x20{\x0a\x09border:\x200.0625rem\x20solid\x20#375EAB;\x0a}\x0adiv#learn\x20.buttons\x20{\x0a\x09float:\x20right;\x0a\x09padding:\x201.25rem\x200\x200.625rem\x200;\x0a\x09text-align:\x20right;\x0a}\x0adiv#learn\x20.buttons\x20a\x20{\x0a\x09height:\x201rem;\x0a\x09margin-left:\x200.3125rem;\x0a\x09padding:\x200.625rem;\x0a}\x0adiv#learn\x20.toys\x20{\x0a\x09margin-top:\x200.5rem;\x0a}\x0adiv#learn\x20.toys\x20select\x20{\x0a\x09font-size:\x200.875rem;\x0a\x09border:\x200.0625rem\x20solid\x20#375EAB;\x0a\x09margin:\x200;\x0a}\x0adiv#learn\x20.output\x20.exit\x20{\x0a\x09display:\x20none;\x0a}\x0a\x0adiv#video\x20{\x0a\x09max-width:\x20100%;\x0a}\x0adiv#blog,\x0adiv#video\x20{\x0a\x09margin-top:\x202.5rem;\x0a}\x0adiv#blog\x20>\x20a,\x0adiv#blog\x20>\x20div,\x0adiv#blog\x20>\x20h2,\x0adiv#video\x20>\x20a,\x0adiv#video\x20>\x20div,\x0adiv#video\x20>\x20h2\x20{\x0a\x09margin-bottom:\x200.625rem;\x0a}\x0adiv#blog\x20.title,\x0adiv#video\x20.title\x20{\x0a\x09display:\x20block;\x0a\x09font-size:\x201.25rem;\x0a}\x0adiv#blog\x20.when\x20{\x0a\x09color:\x20#666;\x0a\x09font-size:\x200.875rem;\x0a}\x0adiv#blog\x20.read\x20{\x0a\x09text-align:\x20right;\x0a}\x0a\x0a@supports\x20(--c:\x200)\x20{\x0a\x09[style*=\"--aspect-ratio-padding:\"]\x20{\x0a\x09\x09position:\x20relative;\x0a\x09\x09overflow:\x20hidden;\x0a\x09\x09padding-top:\x20var(--aspect-ratio-padding);\x0a\x09}\x0a\x0a\x09[style*=\"--aspect-ratio-padding:\"]>*\x20{\x0a\x09\x09position:\x20absolute;\x0a\x09\x09top:\x200;\x0a\x09\x09left:\x200;\x0a\x09\x09width:\x20100%;\x0a\x09\x09height:\x20100%;\x0a\x09}\x0a}\x0a\x0a.toggleButton\x20{\x20cursor:\x20pointer;\x20}\x0a.toggle\x20>\x20.collapsed\x20{\x20display:\x20block;\x20}\x0a.toggle\x20>\x20.expanded\x20{\x20display:\x20none;\x20}\x0a.toggleVisible\x20>\x20.collapsed\x20{\x20display:\x20none;\x20}\x0a.toggleVisible\x20>\x20.expanded\x20{\x20display:\x20block;\x20}\x0a\x0atable.codetable\x20{\x20margin-left:\x20auto;\x20margin-right:\x20auto;\x20border-style:\x20none;\x20}\x0atable.codetable\x20td\x20{\x20padding-right:\x200.625rem;\x20}\x0ahr\x20{\x20border-style:\x20none;\x20border-top:\x200.0625rem\x20solid\x20black;\x20}\x0a\x0aimg.gopher\x20{\x0a\x09float:\x20right;\x0a\x09margin-left:\x200.625rem;\x0a\x09margin-bottom:\x200.625rem;\x0a\x09z-index:\x20-1;\x0a}\x0ah2\x20{\x20clear:\x20right;\x20}\x0a\x0a/*\x20example\x20and\x20drop-down\x20playground\x20*/\x0adiv.play\x20{\x0a\x09padding:\x200\x201.25rem\x202.5rem\x201.25rem;\x0a}\x0adiv.play\x20pre,\x0adiv.play\x20textarea,\x0adiv.play\x20.lines\x20{\x0a\x09padding:\x200;\x0a\x09margin:\x200;\x0a\x09font-family:\x20Menlo,\x20monospace;\x0a\x09font-size:\x200.875rem;\x0a}\x0adiv.play\x20.input\x20{\x0a\x09padding:\x200.625rem;\x0a\x09margin-top:\x200.625rem;\x0a\x0a\x09border-top-left-radius:\x200.3125rem;\x0a\x09border-top-right-radius:\x200.3125rem;\x0a\x0a\x09overflow:\x20hidden;\x0a}\x0adiv.play\x20.input\x20textarea\x20{\x0a\x09width:\x20100%;\x0a\x09height:\x20100%;\x0a\x09border:\x20none;\x0a\x09outline:\x20none;\x0a\x09resize:\x20none;\x0a\x0a\x09overflow:\x20hidden;\x0a}\x0adiv#playground\x20.input\x20textarea\x20{\x0a\x09overflow:\x20auto;\x0a\x09resize:\x20auto;\x0a}\x0adiv.play\x20.output\x20{\x0a\x09border-top:\x20none\x20!important;\x0a\x0a\x09padding:\x200.625rem;\x0a\x09max-height:\x2012.5rem;\x0a\x09overflow:\x20auto;\x0a\x0a\x09border-bottom-right-radius:\x200.3125rem;\x0a\x09border-bottom-left-radius:\x200.3125rem;\x0a}\x0adiv.play\x20.output\x20pre\x20{\x0a\x09padding:\x200;\x0a\x09border-radius:\x200;\x0a}\x0adiv.play\x20.input,\x0adiv.play\x20.input\x20textarea,\x0adiv.play\x20.output,\x0adiv.play\x20.output\x20pre\x20{\x0a\x09background:\x20#FFFFD8;\x0a}\x0adiv.play\x20.input,\x0adiv.play\x20.output\x20{\x0a\x09border:\x200.0625rem\x20solid\x20#375EAB;\x0a}\x0adiv.play\x20.buttons\x20{\x0a\x09float:\x20right;\x0a\x09padding:\x201.25rem\x200\x200.625rem\x200;\x0a\x09text-align:\x20right;\x0a}\x0adiv.play\x20.buttons\x20a\x20{\x0a\x09height:\x201rem;\x0a\x09margin-left:\x200.3125rem;\x0a\x09padding:\x200.625rem;\x0a\x09cursor:\x20pointer;\x0a}\x0a.output\x20.stderr\x20{\x0a\x09color:\x20#933;\x0a}\x0a.output\x20.system\x20{\x0a\x09color:\x20#999;\x0a}\x0a\x0a/*\x20drop-down\x20playground\x20*/\x0adiv#playground\x20{\x0a\x09/*\x20start\x20hidden;\x20revealed\x20by\x20javascript\x20*/\x0a\x09display:\x20none;\x0a}\x0adiv#playground\x20{\x0a\x09position:\x20absolute;\x0a\x09top:\x203.938rem;\x0a\x09right:\x201.25rem;\x0a\x09padding:\x200\x200.625rem\x200.625rem\x200.625rem;\x0a\x09z-index:\x201;\x0a\x09text-align:\x20left;\x0a\x09background:\x20#E0EBF5;\x0a\x0a\x09border:\x200.0625rem\x20solid\x20#B0BBC5;\x0a\x09border-top:\x20none;\x0a\x0a\x09border-bottom-left-radius:\x200.3125rem;\x0a\x09border-bottom-right-radius:\x200.3125rem;\x0a}\x0adiv#playground\x20.code\x20{\x0a\x09width:\x2032.5rem;\x0a\x09height:\x2012.5rem;\x0a}\x0adiv#playground\x20.output\x20{\x0a\x09height:\x206.25rem;\x0a}\x0a\x0a/*\x20Inline\x20runnable\x20snippets\x20(play.js/initPlayground)\x20*/\x0a#content\x20.code\x20pre,\x20#content\x20.playground\x20pre,\x20#content\x20.output\x20pre\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20margin:\x200;\x0a\x20\x20\x20\x20\x20\x20\x20\x20padding:\x200;\x0a\x20\x20\x20\x20\x20\x20\x20\x20background:\x20none;\x0a\x20\x20\x20\x20\x20\x20\x20\x20border:\x20none;\x0a\x09outline:\x200\x20solid\x20transparent;\x0a\x20\x20\x20\x20\x20\x20\x20\x20overflow:\x20auto;\x0a}\x0a#content\x20.playground\x20.number,\x20#content\x20.code\x20.number\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20color:\x20#999;\x0a}\x0a#content\x20.code,\x20#content\x20.playground,\x20#content\x20.output\x20{\x0a\x09width:\x20auto;\x0a\x20\x20\x20\x20\x20\x20\x20\x20margin:\x201.25rem;\x0a\x20\x20\x20\x20\x20\x20\x20\x20padding:\x200.625rem;\x0a\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x200.3125rem;\x0a}\x0a#content\x20.code,\x20#content\x20.playground\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20background:\x20#e9e9e9;\x0a}\x0a#content\x20.output\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20background:\x20#202020;\x0a}\x0a#content\x20.output\x20.stdout,\x20#content\x20.output\x20pre\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20color:\x20#e6e6e6;\x0a}\x0a#content\x20.output\x20.stderr,\x20#content\x20.output\x20.error\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20color:\x20rgb(244,\x2074,\x2063);\x0a}\x0a#content\x20.output\x20.system,\x20#content\x20.output\x20.exit\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20color:\x20rgb(255,\x20209,\x2077)\x0a}\x0a#content\x20.buttons\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20position:\x20relative;\x0a\x20\x20\x20\x20\x20\x20\x20\x20float:\x20right;\x0a\x20\x20\x20\x20\x20\x20\x20\x20top:\x20-3.125rem;\x0a\x20\x20\x20\x20\x20\x20\x20\x20right:\x201.875rem;\x0a}\x0a#content\x20.output\x20.buttons\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20top:\x20-3.75rem;\x0a\x20\x20\x20\x20\x20\x20\x20\x20right:\x200;\x0a\x20\x20\x20\x20\x20\x20\x20\x20height:\x200;\x0a}\x0a#content\x20.buttons\x20.kill\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20display:\x20none;\x0a\x20\x20\x20\x20\x20\x20\x20\x20visibility:\x20hidden;\x0a}\x0aa.error\x20{\x0a\x09font-weight:\x20bold;\x0a\x20\x20\x20\x20\x20\x20\x20\x20color:\x20white;\x0a\x09background-color:\x20darkred;\x0a\x20\x20\x20\x20\x20\x20\x20\x20border-bottom-left-radius:\x200.25rem;\x0a\x20\x20\x20\x20\x20\x20\x20\x20border-bottom-right-radius:\x200.25rem;\x0a\x20\x20\x20\x20\x20\x20\x20\x20border-top-left-radius:\x200.25rem;\x0a\x20\x20\x20\x20\x20\x20\x20\x20border-top-right-radius:\x200.25rem;\x0a\x20\x20\x20\x20\x20\x20\x20\x20padding:\x200.125rem\x200.25rem\x200.125rem\x200.25rem;\x20/*\x20TRBL\x20*/\x0a}\x0a\x0a\x0a#heading-narrow\x20{\x0a\x09display:\x20none;\x0a}\x0a\x0a.downloading\x20{\x0a\x09background:\x20#F9F9BE;\x0a\x09padding:\x200.625rem;\x0a\x09text-align:\x20center;\x0a\x09border-radius:\x200.3125rem;\x0a}\x0a\x0a@media\x20(max-width:\x2058.125em)\x20{\x0a\x09#heading-wide\x20{\x0a\x09\x09display:\x20none;\x0a\x09}\x0a\x09#heading-narrow\x20{\x0a\x09\x09display:\x20block;\x0a\x09}\x0a}\x0a\x0a@media\x20(max-width:\x2047.5em)\x20{\x0a\x09.container\x20.left,\x0a\x09.container\x20.right\x20{\x0a\x09\x09width:\x20auto;\x0a\x09\x09float:\x20none;\x0a\x09}\x0a\x0a\x09div#about\x20{\x0a\x09\x09max-width:\x2031.25rem;\x0a\x09\x09text-align:\x20center;\x0a\x09}\x0a}\x0a\x0a@media\x20(min-width:\x2043.75em)\x20and\x20(max-width:\x2062.5em)\x20{\x0a\x09div#menu\x20>\x20a\x20{\x0a\x09\x09margin:\x200.3125rem\x200;\x0a\x09\x09font-size:\x200.875rem;\x0a\x09}\x0a\x0a\x09input#search\x20{\x0a\x09\x09font-size:\x200.875rem;\x0a\x09}\x0a}\x0a\x0a@media\x20(max-width:\x2043.75em)\x20{\x0a\x09body\x20{\x0a\x09\x09font-size:\x200.9375rem;\x0a\x09}\x0a\x0a\x09div#playground\x20{\x0a\x09\x09left:\x200;\x0a\x09\x09right:\x200;\x0a\x09}\x0a\x0a\x09pre,\x0a\x09code\x20{\x0a\x09\x09font-size:\x200.866rem;\x0a\x09}\x0a\x0a\x09div#page\x20>\x20.container\x20{\x0a\x09\x09padding:\x200\x200.625rem;\x0a\x09}\x0a\x0a\x09div#topbar\x20{\x0a\x09\x09height:\x20auto;\x0a\x09\x09padding:\x200.625rem;\x0a\x09}\x0a\x0a\x09div#topbar\x20>\x20.container\x20{\x0a\x09\x09padding:\x200;\x0a\x09}\x0a\x0a\x09#heading-wide\x20{\x0a\x09\x09display:\x20block;\x0a\x09}\x0a\x09#heading-narrow\x20{\x0a\x09\x09display:\x20none;\x0a\x09}\x0a\x0a\x09.top-heading\x20{\x0a\x09\x09float:\x20none;\x0a\x09\x09display:\x20inline-block;\x0a\x09\x09padding:\x200.75rem;\x0a\x09}\x0a\x0a\x09div#menu\x20{\x0a\x09\x09padding:\x200;\x0a\x09\x09min-width:\x200;\x0a\x09\x09text-align:\x20left;\x0a\x09\x09float:\x20left;\x0a\x09}\x0a\x0a\x09div#menu\x20>\x20a\x20{\x0a\x09\x09display:\x20block;\x0a\x09\x09margin-left:\x200;\x0a\x09\x09margin-right:\x200;\x0a\x09}\x0a\x0a\x09#menu\x20.search-box\x20{\x0a\x09\x09display:\x20flex;\x0a\x09\x09width:\x20100%;\x0a\x09}\x0a\x0a\x09#menu-button\x20{\x0a\x09\x09display:\x20inline-block;\x0a\x09}\x0a\x0a\x09p,\x0a\x09pre,\x0a\x09ul,\x0a\x09ol\x20{\x0a\x09\x09margin:\x200.625rem;\x0a\x09}\x0a\x0a\x09.pkg-synopsis\x20{\x0a\x09\x09display:\x20none;\x0a\x09}\x0a\x0a\x09img.gopher\x20{\x0a\x09\x09display:\x20none;\x0a\x09}\x0a}\x0a\x0a@media\x20(max-width:\x2030em)\x20{\x0a\x09#heading-wide\x20{\x0a\x09\x09display:\x20none;\x0a\x09}\x0a\x09#heading-narrow\x20{\x0a\x09\x09display:\x20block;\x0a\x09}\x0a}\x0a\x0a@media\x20print\x20{\x0a\x09pre\x20{\x0a\x09\x09background:\x20#FFF;\x0a\x09\x09border:\x200.0625rem\x20solid\x20#BBB;\x0a\x09\x09white-space:\x20pre-wrap;\x0a\x09}\x0a}\x0a", -} diff --git a/vendor/golang.org/x/tools/godoc/static/style.css b/vendor/golang.org/x/tools/godoc/static/style.css deleted file mode 100644 index b77d61ebf..000000000 --- a/vendor/golang.org/x/tools/godoc/static/style.css +++ /dev/null @@ -1,872 +0,0 @@ -body { - margin: 0; - font-family: Arial, sans-serif; - background-color: #fff; - line-height: 1.3; - text-align: center; - color: #222; -} -textarea { - /* Inherit text color from body avoiding illegible text in the case where the - * user has inverted the browsers custom text and background colors. */ - color: inherit; -} -pre, -code { - font-family: Menlo, monospace; - font-size: 0.875rem; -} -pre { - line-height: 1.4; - overflow-x: auto; -} -pre .comment { - color: #006600; -} -pre .highlight, -pre .highlight-comment, -pre .selection-highlight, -pre .selection-highlight-comment { - background: #FFFF00; -} -pre .selection, -pre .selection-comment { - background: #FF9632; -} -pre .ln { - color: #999; - background: #efefef; -} -.ln { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - - /* Ensure 8 characters in the document - which due to floating - * point rendering issues, might have a width of less than 1 each - are 8 - * characters wide, so a tab in the 9th position indents properly. See - * https://github.com/webcompat/web-bugs/issues/17530#issuecomment-402675091 - * for more information. */ - display: inline-block; - width: 8ch; -} - -.search-nav{ - margin-left: 1.25rem; - font-size: 0.875rem; - column-gap: 1.25rem; - column-fill: auto; - column-width: 14rem; -} - -.search-nav .indent { - margin-left: 1.25rem; -} - -a, -.exampleHeading .text, -.expandAll { - color: #375EAB; - text-decoration: none; -} -a:hover, -.exampleHeading .text:hover, -.expandAll:hover { - text-decoration: underline; -} -.article a { - text-decoration: underline; -} -.article .title a { - text-decoration: none; -} - -.permalink { - display: none; -} -:hover > .permalink { - display: inline; -} - -p, li { - max-width: 50rem; - word-wrap: break-word; -} -p, -pre, -ul, -ol { - margin: 1.25rem; -} -pre { - background: #EFEFEF; - padding: 0.625rem; - border-radius: 0.3125rem; -} - -h1, -h2, -h3, -h4, -.rootHeading { - margin: 1.25rem 0 1.25rem; - padding: 0; - color: #375EAB; - font-weight: bold; -} -h1 { - font-size: 1.75rem; - line-height: 1; -} -h1 .text-muted { - color:#777; -} -h2 { - font-size: 1.25rem; - background: #E0EBF5; - padding: 0.5rem; - line-height: 1.25; - font-weight: normal; - overflow: auto; - overflow-wrap: break-word; -} -h2 a { - font-weight: bold; -} -h3 { - font-size: 1.25rem; - line-height: 1.25; - overflow: auto; - overflow-wrap: break-word; -} -h3, -h4 { - margin: 1.25rem 0.3125rem; -} -h4 { - font-size: 1rem; -} -.rootHeading { - font-size: 1.25rem; - margin: 0; -} - -h2 > span, -h3 > span { - float: right; - margin: 0 25px 0 0; - font-weight: normal; - color: #5279C7; -} - -dl { - margin: 1.25rem; -} -dd { - margin: 0 0 0 1.25rem; -} -dl, -dd { - font-size: 0.875rem; -} -div#nav table td { - vertical-align: top; -} - -#pkg-index h3 { - font-size: 1rem; -} -.pkg-dir { - padding: 0 0.625rem; -} -.pkg-dir table { - border-collapse: collapse; - border-spacing: 0; -} -.pkg-name { - padding-right: 0.625rem; -} -.alert { - color: #AA0000; -} - -.top-heading { - float: left; - padding: 1.313rem 0; - font-size: 1.25rem; - font-weight: normal; -} -.top-heading a { - color: #222; - text-decoration: none; -} - -#pkg-examples h3 { - float: left; -} - -#pkg-examples dl { - clear: both; -} - -.expandAll { - cursor: pointer; - float: left; - margin: 1.25rem 0; -} - -div#topbar { - background: #E0EBF5; - height: 4rem; - overflow: hidden; -} - -div#page { - width: 100%; -} -div#page > .container, -div#topbar > .container { - text-align: left; - margin-left: auto; - margin-right: auto; - padding: 0 1.25rem; -} -div#topbar > .container, -div#page > .container { - max-width: 59.38rem; -} -div#page.wide > .container, -div#topbar.wide > .container { - max-width: none; -} -div#plusone { - float: right; - clear: right; - margin-top: 0.3125rem; -} - -div#footer { - text-align: center; - color: #666; - font-size: 0.875rem; - margin: 2.5rem 0; -} - -div#menu > a, -input#search, -div#learn .buttons a, -div.play .buttons a, -div#blog .read a, -#menu-button { - padding: 0.625rem; - - text-decoration: none; - font-size: 1rem; - border-radius: 0.3125rem; -} -div#playground .buttons a, -div#menu > a, -input#search, -#menu-button { - border: 0.0625rem solid #375EAB; -} -div#playground .buttons a, -div#menu > a, -#menu-button { - color: white; - background: #375EAB; -} -#playgroundButton.active { - background: white; - color: #375EAB; -} -a#start, -div#learn .buttons a, -div.play .buttons a, -div#blog .read a { - color: #222; - border: 0.0625rem solid #375EAB; - background: #E0EBF5; -} -.download { - width: 9.375rem; -} - -div#menu { - text-align: right; - padding: 0.625rem; - white-space: nowrap; - max-height: 0; - -moz-transition: max-height .25s linear; - transition: max-height .25s linear; - width: 100%; -} -div#menu.menu-visible { - max-height: 31.25rem; -} -div#menu > a, -#menu-button { - margin: 0.625rem 0.125rem; - padding: 0.625rem; -} -::-webkit-input-placeholder { - color: #7f7f7f; - opacity: 1; -} -::placeholder { - color: #7f7f7f; - opacity: 1; -} -#menu .search-box { - display: inline-flex; - width: 8.75rem; -} -input#search { - background: white; - color: #222; - box-sizing: border-box; - -webkit-appearance: none; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - border-right: 0; - margin-right: 0; - flex-grow: 1; - max-width: 100%; - min-width: 5.625rem; -} -input#search:-webkit-search-decoration { - -webkit-appearance: none; -} -input#search:-moz-ui-invalid { - box-shadow: unset; -} -input#search + button { - display: inline; - font-size: 1em; - background-color: #375EAB; - color: white; - border: 0.0625rem solid #375EAB; - border-top-left-radius: 0; - border-top-right-radius: 0.3125rem; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0.3125rem; - margin-left: 0; - cursor: pointer; -} -input#search + button span { - display: flex; -} -input#search + button svg { - fill: white -} - -#menu-button { - display: none; - position: absolute; - right: 0.3125rem; - top: 0; - margin-right: 0.3125rem; -} -#menu-button-arrow { - display: inline-block; -} -.vertical-flip { - transform: rotate(-180deg); -} - -div.left { - float: left; - clear: left; - margin-right: 2.5%; -} -div.right { - float: right; - clear: right; - margin-left: 2.5%; -} -div.left, -div.right { - width: 45%; -} - -div#learn, -div#about { - padding-top: 1.25rem; -} -div#learn h2, -div#about { - margin: 0; -} -div#about { - font-size: 1.25rem; - margin: 0 auto 1.875rem; -} -div#gopher { - background: url(/doc/gopher/frontpage.png) no-repeat; - background-position: center top; - height: 9.688rem; - max-height: 200px; /* Setting in px to prevent the gopher from blowing up in very high default font-sizes */ -} -a#start { - display: block; - padding: 0.625rem; - - text-align: center; - text-decoration: none; - border-radius: 0.3125rem; -} -a#start .big { - display: block; - font-weight: bold; - font-size: 1.25rem; -} -a#start .desc { - display: block; - font-size: 0.875rem; - font-weight: normal; - margin-top: 0.3125rem; -} - -div#learn .popout { - float: right; - display: block; - cursor: pointer; - font-size: 0.75rem; - background: url(/doc/share.png) no-repeat; - background-position: right center; - padding: 0.375rem 1.688rem; -} -div#learn pre, -div#learn textarea { - padding: 0; - margin: 0; - font-family: Menlo, monospace; - font-size: 0.875rem; -} -div#learn .input { - padding: 0.625rem; - margin-top: 0.625rem; - height: 9.375rem; - - border-top-left-radius: 0.3125rem; - border-top-right-radius: 0.3125rem; -} -div#learn .input textarea { - width: 100%; - height: 100%; - border: none; - outline: none; - resize: none; -} -div#learn .output { - border-top: none !important; - - padding: 0.625rem; - height: 3.688rem; - overflow: auto; - - border-bottom-right-radius: 0.3125rem; - border-bottom-left-radius: 0.3125rem; -} -div#learn .output pre { - padding: 0; - border-radius: 0; -} -div#learn .input, -div#learn .input textarea, -div#learn .output, -div#learn .output pre { - background: #FFFFD8; -} -div#learn .input, -div#learn .output { - border: 0.0625rem solid #375EAB; -} -div#learn .buttons { - float: right; - padding: 1.25rem 0 0.625rem 0; - text-align: right; -} -div#learn .buttons a { - height: 1rem; - margin-left: 0.3125rem; - padding: 0.625rem; -} -div#learn .toys { - margin-top: 0.5rem; -} -div#learn .toys select { - font-size: 0.875rem; - border: 0.0625rem solid #375EAB; - margin: 0; -} -div#learn .output .exit { - display: none; -} - -div#video { - max-width: 100%; -} -div#blog, -div#video { - margin-top: 2.5rem; -} -div#blog > a, -div#blog > div, -div#blog > h2, -div#video > a, -div#video > div, -div#video > h2 { - margin-bottom: 0.625rem; -} -div#blog .title, -div#video .title { - display: block; - font-size: 1.25rem; -} -div#blog .when { - color: #666; - font-size: 0.875rem; -} -div#blog .read { - text-align: right; -} - -@supports (--c: 0) { - [style*="--aspect-ratio-padding:"] { - position: relative; - overflow: hidden; - padding-top: var(--aspect-ratio-padding); - } - - [style*="--aspect-ratio-padding:"]>* { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - } -} - -.toggleButton { cursor: pointer; } -.toggle > .collapsed { display: block; } -.toggle > .expanded { display: none; } -.toggleVisible > .collapsed { display: none; } -.toggleVisible > .expanded { display: block; } - -table.codetable { margin-left: auto; margin-right: auto; border-style: none; } -table.codetable td { padding-right: 0.625rem; } -hr { border-style: none; border-top: 0.0625rem solid black; } - -img.gopher { - float: right; - margin-left: 0.625rem; - margin-bottom: 0.625rem; - z-index: -1; -} -h2 { clear: right; } - -/* example and drop-down playground */ -div.play { - padding: 0 1.25rem 2.5rem 1.25rem; -} -div.play pre, -div.play textarea, -div.play .lines { - padding: 0; - margin: 0; - font-family: Menlo, monospace; - font-size: 0.875rem; -} -div.play .input { - padding: 0.625rem; - margin-top: 0.625rem; - - border-top-left-radius: 0.3125rem; - border-top-right-radius: 0.3125rem; - - overflow: hidden; -} -div.play .input textarea { - width: 100%; - height: 100%; - border: none; - outline: none; - resize: none; - - overflow: hidden; -} -div#playground .input textarea { - overflow: auto; - resize: auto; -} -div.play .output { - border-top: none !important; - - padding: 0.625rem; - max-height: 12.5rem; - overflow: auto; - - border-bottom-right-radius: 0.3125rem; - border-bottom-left-radius: 0.3125rem; -} -div.play .output pre { - padding: 0; - border-radius: 0; -} -div.play .input, -div.play .input textarea, -div.play .output, -div.play .output pre { - background: #FFFFD8; -} -div.play .input, -div.play .output { - border: 0.0625rem solid #375EAB; -} -div.play .buttons { - float: right; - padding: 1.25rem 0 0.625rem 0; - text-align: right; -} -div.play .buttons a { - height: 1rem; - margin-left: 0.3125rem; - padding: 0.625rem; - cursor: pointer; -} -.output .stderr { - color: #933; -} -.output .system { - color: #999; -} - -/* drop-down playground */ -div#playground { - /* start hidden; revealed by javascript */ - display: none; -} -div#playground { - position: absolute; - top: 3.938rem; - right: 1.25rem; - padding: 0 0.625rem 0.625rem 0.625rem; - z-index: 1; - text-align: left; - background: #E0EBF5; - - border: 0.0625rem solid #B0BBC5; - border-top: none; - - border-bottom-left-radius: 0.3125rem; - border-bottom-right-radius: 0.3125rem; -} -div#playground .code { - width: 32.5rem; - height: 12.5rem; -} -div#playground .output { - height: 6.25rem; -} - -/* Inline runnable snippets (play.js/initPlayground) */ -#content .code pre, #content .playground pre, #content .output pre { - margin: 0; - padding: 0; - background: none; - border: none; - outline: 0 solid transparent; - overflow: auto; -} -#content .playground .number, #content .code .number { - color: #999; -} -#content .code, #content .playground, #content .output { - width: auto; - margin: 1.25rem; - padding: 0.625rem; - border-radius: 0.3125rem; -} -#content .code, #content .playground { - background: #e9e9e9; -} -#content .output { - background: #202020; -} -#content .output .stdout, #content .output pre { - color: #e6e6e6; -} -#content .output .stderr, #content .output .error { - color: rgb(244, 74, 63); -} -#content .output .system, #content .output .exit { - color: rgb(255, 209, 77) -} -#content .buttons { - position: relative; - float: right; - top: -3.125rem; - right: 1.875rem; -} -#content .output .buttons { - top: -3.75rem; - right: 0; - height: 0; -} -#content .buttons .kill { - display: none; - visibility: hidden; -} -a.error { - font-weight: bold; - color: white; - background-color: darkred; - border-bottom-left-radius: 0.25rem; - border-bottom-right-radius: 0.25rem; - border-top-left-radius: 0.25rem; - border-top-right-radius: 0.25rem; - padding: 0.125rem 0.25rem 0.125rem 0.25rem; /* TRBL */ -} - - -#heading-narrow { - display: none; -} - -.downloading { - background: #F9F9BE; - padding: 0.625rem; - text-align: center; - border-radius: 0.3125rem; -} - -@media (max-width: 58.125em) { - #heading-wide { - display: none; - } - #heading-narrow { - display: block; - } -} - -@media (max-width: 47.5em) { - .container .left, - .container .right { - width: auto; - float: none; - } - - div#about { - max-width: 31.25rem; - text-align: center; - } -} - -@media (min-width: 43.75em) and (max-width: 62.5em) { - div#menu > a { - margin: 0.3125rem 0; - font-size: 0.875rem; - } - - input#search { - font-size: 0.875rem; - } -} - -@media (max-width: 43.75em) { - body { - font-size: 0.9375rem; - } - - div#playground { - left: 0; - right: 0; - } - - pre, - code { - font-size: 0.866rem; - } - - div#page > .container { - padding: 0 0.625rem; - } - - div#topbar { - height: auto; - padding: 0.625rem; - } - - div#topbar > .container { - padding: 0; - } - - #heading-wide { - display: block; - } - #heading-narrow { - display: none; - } - - .top-heading { - float: none; - display: inline-block; - padding: 0.75rem; - } - - div#menu { - padding: 0; - min-width: 0; - text-align: left; - float: left; - } - - div#menu > a { - display: block; - margin-left: 0; - margin-right: 0; - } - - #menu .search-box { - display: flex; - width: 100%; - } - - #menu-button { - display: inline-block; - } - - p, - pre, - ul, - ol { - margin: 0.625rem; - } - - .pkg-synopsis { - display: none; - } - - img.gopher { - display: none; - } -} - -@media (max-width: 30em) { - #heading-wide { - display: none; - } - #heading-narrow { - display: block; - } -} - -@media print { - pre { - background: #FFF; - border: 0.0625rem solid #BBB; - white-space: pre-wrap; - } -} diff --git a/vendor/golang.org/x/tools/gopls/internal/hooks/analysis.go b/vendor/golang.org/x/tools/gopls/internal/hooks/analysis.go deleted file mode 100644 index ca437adf6..000000000 --- a/vendor/golang.org/x/tools/gopls/internal/hooks/analysis.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package hooks - -import ( - "golang.org/x/tools/internal/lsp/source" - "honnef.co/go/tools/simple" - "honnef.co/go/tools/staticcheck" - "honnef.co/go/tools/stylecheck" -) - -func updateAnalyzers(options *source.Options) { - if options.StaticCheck { - for _, a := range simple.Analyzers { - options.Analyzers = append(options.Analyzers, a) - } - for _, a := range staticcheck.Analyzers { - options.Analyzers = append(options.Analyzers, a) - } - for _, a := range stylecheck.Analyzers { - options.Analyzers = append(options.Analyzers, a) - } - } -} diff --git a/vendor/golang.org/x/tools/gopls/internal/hooks/diff.go b/vendor/golang.org/x/tools/gopls/internal/hooks/diff.go deleted file mode 100644 index e2a5af5ad..000000000 --- a/vendor/golang.org/x/tools/gopls/internal/hooks/diff.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package hooks - -import ( - "github.com/sergi/go-diff/diffmatchpatch" - "golang.org/x/tools/internal/lsp/diff" - "golang.org/x/tools/internal/span" -) - -func ComputeEdits(uri span.URI, before, after string) []diff.TextEdit { - diffs := diffmatchpatch.New().DiffMain(before, after, true) - edits := make([]diff.TextEdit, 0, len(diffs)) - offset := 0 - for _, d := range diffs { - start := span.NewPoint(0, 0, offset) - switch d.Type { - case diffmatchpatch.DiffDelete: - offset += len(d.Text) - edits = append(edits, diff.TextEdit{Span: span.New(uri, start, span.NewPoint(0, 0, offset))}) - case diffmatchpatch.DiffEqual: - offset += len(d.Text) - case diffmatchpatch.DiffInsert: - edits = append(edits, diff.TextEdit{Span: span.New(uri, start, span.Point{}), NewText: d.Text}) - } - } - return edits -} diff --git a/vendor/golang.org/x/tools/gopls/internal/hooks/hooks.go b/vendor/golang.org/x/tools/gopls/internal/hooks/hooks.go deleted file mode 100644 index 9037c3b34..000000000 --- a/vendor/golang.org/x/tools/gopls/internal/hooks/hooks.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package hooks adds all the standard gopls implementations. -// This can be used in tests without needing to use the gopls main, and is -// also the place to edit for custom builds of gopls. -package hooks // import "golang.org/x/tools/gopls/internal/hooks" - -import ( - "golang.org/x/tools/internal/lsp/source" -) - -func Options(options *source.Options) { - if options.GoDiff { - options.ComputeEdits = ComputeEdits - } - updateAnalyzers(options) -} diff --git a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk.go b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk.go deleted file mode 100644 index 7219c8e9f..000000000 --- a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk.go +++ /dev/null @@ -1,196 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package fastwalk provides a faster version of filepath.Walk for file system -// scanning tools. -package fastwalk - -import ( - "errors" - "os" - "path/filepath" - "runtime" - "sync" -) - -// TraverseLink is used as a return value from WalkFuncs to indicate that the -// symlink named in the call may be traversed. -var TraverseLink = errors.New("fastwalk: traverse symlink, assuming target is a directory") - -// SkipFiles is a used as a return value from WalkFuncs to indicate that the -// callback should not be called for any other files in the current directory. -// Child directories will still be traversed. -var SkipFiles = errors.New("fastwalk: skip remaining files in directory") - -// Walk is a faster implementation of filepath.Walk. -// -// filepath.Walk's design necessarily calls os.Lstat on each file, -// even if the caller needs less info. -// Many tools need only the type of each file. -// On some platforms, this information is provided directly by the readdir -// system call, avoiding the need to stat each file individually. -// fastwalk_unix.go contains a fork of the syscall routines. -// -// See golang.org/issue/16399 -// -// Walk walks the file tree rooted at root, calling walkFn for -// each file or directory in the tree, including root. -// -// If fastWalk returns filepath.SkipDir, the directory is skipped. -// -// Unlike filepath.Walk: -// * file stat calls must be done by the user. -// The only provided metadata is the file type, which does not include -// any permission bits. -// * multiple goroutines stat the filesystem concurrently. The provided -// walkFn must be safe for concurrent use. -// * fastWalk can follow symlinks if walkFn returns the TraverseLink -// sentinel error. It is the walkFn's responsibility to prevent -// fastWalk from going into symlink cycles. -func Walk(root string, walkFn func(path string, typ os.FileMode) error) error { - // TODO(bradfitz): make numWorkers configurable? We used a - // minimum of 4 to give the kernel more info about multiple - // things we want, in hopes its I/O scheduling can take - // advantage of that. Hopefully most are in cache. Maybe 4 is - // even too low of a minimum. Profile more. - numWorkers := 4 - if n := runtime.NumCPU(); n > numWorkers { - numWorkers = n - } - - // Make sure to wait for all workers to finish, otherwise - // walkFn could still be called after returning. This Wait call - // runs after close(e.donec) below. - var wg sync.WaitGroup - defer wg.Wait() - - w := &walker{ - fn: walkFn, - enqueuec: make(chan walkItem, numWorkers), // buffered for performance - workc: make(chan walkItem, numWorkers), // buffered for performance - donec: make(chan struct{}), - - // buffered for correctness & not leaking goroutines: - resc: make(chan error, numWorkers), - } - defer close(w.donec) - - for i := 0; i < numWorkers; i++ { - wg.Add(1) - go w.doWork(&wg) - } - todo := []walkItem{{dir: root}} - out := 0 - for { - workc := w.workc - var workItem walkItem - if len(todo) == 0 { - workc = nil - } else { - workItem = todo[len(todo)-1] - } - select { - case workc <- workItem: - todo = todo[:len(todo)-1] - out++ - case it := <-w.enqueuec: - todo = append(todo, it) - case err := <-w.resc: - out-- - if err != nil { - return err - } - if out == 0 && len(todo) == 0 { - // It's safe to quit here, as long as the buffered - // enqueue channel isn't also readable, which might - // happen if the worker sends both another unit of - // work and its result before the other select was - // scheduled and both w.resc and w.enqueuec were - // readable. - select { - case it := <-w.enqueuec: - todo = append(todo, it) - default: - return nil - } - } - } - } -} - -// doWork reads directories as instructed (via workc) and runs the -// user's callback function. -func (w *walker) doWork(wg *sync.WaitGroup) { - defer wg.Done() - for { - select { - case <-w.donec: - return - case it := <-w.workc: - select { - case <-w.donec: - return - case w.resc <- w.walk(it.dir, !it.callbackDone): - } - } - } -} - -type walker struct { - fn func(path string, typ os.FileMode) error - - donec chan struct{} // closed on fastWalk's return - workc chan walkItem // to workers - enqueuec chan walkItem // from workers - resc chan error // from workers -} - -type walkItem struct { - dir string - callbackDone bool // callback already called; don't do it again -} - -func (w *walker) enqueue(it walkItem) { - select { - case w.enqueuec <- it: - case <-w.donec: - } -} - -func (w *walker) onDirEnt(dirName, baseName string, typ os.FileMode) error { - joined := dirName + string(os.PathSeparator) + baseName - if typ == os.ModeDir { - w.enqueue(walkItem{dir: joined}) - return nil - } - - err := w.fn(joined, typ) - if typ == os.ModeSymlink { - if err == TraverseLink { - // Set callbackDone so we don't call it twice for both the - // symlink-as-symlink and the symlink-as-directory later: - w.enqueue(walkItem{dir: joined, callbackDone: true}) - return nil - } - if err == filepath.SkipDir { - // Permit SkipDir on symlinks too. - return nil - } - } - return err -} - -func (w *walker) walk(root string, runUserCallback bool) error { - if runUserCallback { - err := w.fn(root, os.ModeDir) - if err == filepath.SkipDir { - return nil - } - if err != nil { - return err - } - } - - return readDir(root, w.onDirEnt) -} diff --git a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_fileno.go b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_fileno.go deleted file mode 100644 index ccffec5ad..000000000 --- a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_fileno.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build freebsd openbsd netbsd - -package fastwalk - -import "syscall" - -func direntInode(dirent *syscall.Dirent) uint64 { - return uint64(dirent.Fileno) -} diff --git a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_ino.go b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_ino.go deleted file mode 100644 index ab7fbc0a9..000000000 --- a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_ino.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build linux darwin -// +build !appengine - -package fastwalk - -import "syscall" - -func direntInode(dirent *syscall.Dirent) uint64 { - return uint64(dirent.Ino) -} diff --git a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_namlen_bsd.go b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_namlen_bsd.go deleted file mode 100644 index a3b26a7ba..000000000 --- a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_namlen_bsd.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin freebsd openbsd netbsd - -package fastwalk - -import "syscall" - -func direntNamlen(dirent *syscall.Dirent) uint64 { - return uint64(dirent.Namlen) -} diff --git a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_namlen_linux.go b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_namlen_linux.go deleted file mode 100644 index e880d358b..000000000 --- a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_namlen_linux.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build linux -// +build !appengine - -package fastwalk - -import ( - "bytes" - "syscall" - "unsafe" -) - -func direntNamlen(dirent *syscall.Dirent) uint64 { - const fixedHdr = uint16(unsafe.Offsetof(syscall.Dirent{}.Name)) - nameBuf := (*[unsafe.Sizeof(dirent.Name)]byte)(unsafe.Pointer(&dirent.Name[0])) - const nameBufLen = uint16(len(nameBuf)) - limit := dirent.Reclen - fixedHdr - if limit > nameBufLen { - limit = nameBufLen - } - nameLen := bytes.IndexByte(nameBuf[:limit], 0) - if nameLen < 0 { - panic("failed to find terminating 0 byte in dirent") - } - return uint64(nameLen) -} diff --git a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_portable.go b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_portable.go deleted file mode 100644 index a906b8759..000000000 --- a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_portable.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build appengine !linux,!darwin,!freebsd,!openbsd,!netbsd - -package fastwalk - -import ( - "io/ioutil" - "os" -) - -// readDir calls fn for each directory entry in dirName. -// It does not descend into directories or follow symlinks. -// If fn returns a non-nil error, readDir returns with that error -// immediately. -func readDir(dirName string, fn func(dirName, entName string, typ os.FileMode) error) error { - fis, err := ioutil.ReadDir(dirName) - if err != nil { - return err - } - skipFiles := false - for _, fi := range fis { - if fi.Mode().IsRegular() && skipFiles { - continue - } - if err := fn(dirName, fi.Name(), fi.Mode()&os.ModeType); err != nil { - if err == SkipFiles { - skipFiles = true - continue - } - return err - } - } - return nil -} diff --git a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_unix.go b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_unix.go deleted file mode 100644 index 3369b1a0b..000000000 --- a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_unix.go +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build linux darwin freebsd openbsd netbsd -// +build !appengine - -package fastwalk - -import ( - "fmt" - "os" - "syscall" - "unsafe" -) - -const blockSize = 8 << 10 - -// unknownFileMode is a sentinel (and bogus) os.FileMode -// value used to represent a syscall.DT_UNKNOWN Dirent.Type. -const unknownFileMode os.FileMode = os.ModeNamedPipe | os.ModeSocket | os.ModeDevice - -func readDir(dirName string, fn func(dirName, entName string, typ os.FileMode) error) error { - fd, err := syscall.Open(dirName, 0, 0) - if err != nil { - return &os.PathError{Op: "open", Path: dirName, Err: err} - } - defer syscall.Close(fd) - - // The buffer must be at least a block long. - buf := make([]byte, blockSize) // stack-allocated; doesn't escape - bufp := 0 // starting read position in buf - nbuf := 0 // end valid data in buf - skipFiles := false - for { - if bufp >= nbuf { - bufp = 0 - nbuf, err = syscall.ReadDirent(fd, buf) - if err != nil { - return os.NewSyscallError("readdirent", err) - } - if nbuf <= 0 { - return nil - } - } - consumed, name, typ := parseDirEnt(buf[bufp:nbuf]) - bufp += consumed - if name == "" || name == "." || name == ".." { - continue - } - // Fallback for filesystems (like old XFS) that don't - // support Dirent.Type and have DT_UNKNOWN (0) there - // instead. - if typ == unknownFileMode { - fi, err := os.Lstat(dirName + "/" + name) - if err != nil { - // It got deleted in the meantime. - if os.IsNotExist(err) { - continue - } - return err - } - typ = fi.Mode() & os.ModeType - } - if skipFiles && typ.IsRegular() { - continue - } - if err := fn(dirName, name, typ); err != nil { - if err == SkipFiles { - skipFiles = true - continue - } - return err - } - } -} - -func parseDirEnt(buf []byte) (consumed int, name string, typ os.FileMode) { - // golang.org/issue/15653 - dirent := (*syscall.Dirent)(unsafe.Pointer(&buf[0])) - if v := unsafe.Offsetof(dirent.Reclen) + unsafe.Sizeof(dirent.Reclen); uintptr(len(buf)) < v { - panic(fmt.Sprintf("buf size of %d smaller than dirent header size %d", len(buf), v)) - } - if len(buf) < int(dirent.Reclen) { - panic(fmt.Sprintf("buf size %d < record length %d", len(buf), dirent.Reclen)) - } - consumed = int(dirent.Reclen) - if direntInode(dirent) == 0 { // File absent in directory. - return - } - switch dirent.Type { - case syscall.DT_REG: - typ = 0 - case syscall.DT_DIR: - typ = os.ModeDir - case syscall.DT_LNK: - typ = os.ModeSymlink - case syscall.DT_BLK: - typ = os.ModeDevice - case syscall.DT_FIFO: - typ = os.ModeNamedPipe - case syscall.DT_SOCK: - typ = os.ModeSocket - case syscall.DT_UNKNOWN: - typ = unknownFileMode - default: - // Skip weird things. - // It's probably a DT_WHT (http://lwn.net/Articles/325369/) - // or something. Revisit if/when this package is moved outside - // of goimports. goimports only cares about regular files, - // symlinks, and directories. - return - } - - nameBuf := (*[unsafe.Sizeof(dirent.Name)]byte)(unsafe.Pointer(&dirent.Name[0])) - nameLen := direntNamlen(dirent) - - // Special cases for common things: - if nameLen == 1 && nameBuf[0] == '.' { - name = "." - } else if nameLen == 2 && nameBuf[0] == '.' && nameBuf[1] == '.' { - name = ".." - } else { - name = string(nameBuf[:nameLen]) - } - return -} diff --git a/vendor/golang.org/x/tools/internal/gopathwalk/walk.go b/vendor/golang.org/x/tools/internal/gopathwalk/walk.go deleted file mode 100644 index 9a61bdbf5..000000000 --- a/vendor/golang.org/x/tools/internal/gopathwalk/walk.go +++ /dev/null @@ -1,270 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package gopathwalk is like filepath.Walk but specialized for finding Go -// packages, particularly in $GOPATH and $GOROOT. -package gopathwalk - -import ( - "bufio" - "bytes" - "fmt" - "go/build" - "io/ioutil" - "log" - "os" - "path/filepath" - "strings" - "time" - - "golang.org/x/tools/internal/fastwalk" -) - -// Options controls the behavior of a Walk call. -type Options struct { - Debug bool // Enable debug logging - ModulesEnabled bool // Search module caches. Also disables legacy goimports ignore rules. -} - -// RootType indicates the type of a Root. -type RootType int - -const ( - RootUnknown RootType = iota - RootGOROOT - RootGOPATH - RootCurrentModule - RootModuleCache - RootOther -) - -// A Root is a starting point for a Walk. -type Root struct { - Path string - Type RootType -} - -// SrcDirsRoots returns the roots from build.Default.SrcDirs(). Not modules-compatible. -func SrcDirsRoots(ctx *build.Context) []Root { - var roots []Root - roots = append(roots, Root{filepath.Join(ctx.GOROOT, "src"), RootGOROOT}) - for _, p := range filepath.SplitList(ctx.GOPATH) { - roots = append(roots, Root{filepath.Join(p, "src"), RootGOPATH}) - } - return roots -} - -// Walk walks Go source directories ($GOROOT, $GOPATH, etc) to find packages. -// For each package found, add will be called (concurrently) with the absolute -// paths of the containing source directory and the package directory. -// add will be called concurrently. -func Walk(roots []Root, add func(root Root, dir string), opts Options) { - WalkSkip(roots, add, func(Root, string) bool { return false }, opts) -} - -// WalkSkip walks Go source directories ($GOROOT, $GOPATH, etc) to find packages. -// For each package found, add will be called (concurrently) with the absolute -// paths of the containing source directory and the package directory. -// For each directory that will be scanned, skip will be called (concurrently) -// with the absolute paths of the containing source directory and the directory. -// If skip returns false on a directory it will be processed. -// add will be called concurrently. -// skip will be called concurrently. -func WalkSkip(roots []Root, add func(root Root, dir string), skip func(root Root, dir string) bool, opts Options) { - for _, root := range roots { - walkDir(root, add, skip, opts) - } -} - -func walkDir(root Root, add func(Root, string), skip func(root Root, dir string) bool, opts Options) { - if _, err := os.Stat(root.Path); os.IsNotExist(err) { - if opts.Debug { - log.Printf("skipping nonexistent directory: %v", root.Path) - } - return - } - start := time.Now() - if opts.Debug { - log.Printf("gopathwalk: scanning %s", root.Path) - } - w := &walker{ - root: root, - add: add, - skip: skip, - opts: opts, - } - w.init() - if err := fastwalk.Walk(root.Path, w.walk); err != nil { - log.Printf("gopathwalk: scanning directory %v: %v", root.Path, err) - } - - if opts.Debug { - log.Printf("gopathwalk: scanned %s in %v", root.Path, time.Since(start)) - } -} - -// walker is the callback for fastwalk.Walk. -type walker struct { - root Root // The source directory to scan. - add func(Root, string) // The callback that will be invoked for every possible Go package dir. - skip func(Root, string) bool // The callback that will be invoked for every dir. dir is skipped if it returns true. - opts Options // Options passed to Walk by the user. - - ignoredDirs []os.FileInfo // The ignored directories, loaded from .goimportsignore files. -} - -// init initializes the walker based on its Options. -func (w *walker) init() { - var ignoredPaths []string - if w.root.Type == RootModuleCache { - ignoredPaths = []string{"cache"} - } - if !w.opts.ModulesEnabled && w.root.Type == RootGOPATH { - ignoredPaths = w.getIgnoredDirs(w.root.Path) - ignoredPaths = append(ignoredPaths, "v", "mod") - } - - for _, p := range ignoredPaths { - full := filepath.Join(w.root.Path, p) - if fi, err := os.Stat(full); err == nil { - w.ignoredDirs = append(w.ignoredDirs, fi) - if w.opts.Debug { - log.Printf("Directory added to ignore list: %s", full) - } - } else if w.opts.Debug { - log.Printf("Error statting ignored directory: %v", err) - } - } -} - -// getIgnoredDirs reads an optional config file at /.goimportsignore -// of relative directories to ignore when scanning for go files. -// The provided path is one of the $GOPATH entries with "src" appended. -func (w *walker) getIgnoredDirs(path string) []string { - file := filepath.Join(path, ".goimportsignore") - slurp, err := ioutil.ReadFile(file) - if w.opts.Debug { - if err != nil { - log.Print(err) - } else { - log.Printf("Read %s", file) - } - } - if err != nil { - return nil - } - - var ignoredDirs []string - bs := bufio.NewScanner(bytes.NewReader(slurp)) - for bs.Scan() { - line := strings.TrimSpace(bs.Text()) - if line == "" || strings.HasPrefix(line, "#") { - continue - } - ignoredDirs = append(ignoredDirs, line) - } - return ignoredDirs -} - -func (w *walker) shouldSkipDir(fi os.FileInfo, dir string) bool { - for _, ignoredDir := range w.ignoredDirs { - if os.SameFile(fi, ignoredDir) { - return true - } - } - if w.skip != nil { - // Check with the user specified callback. - return w.skip(w.root, dir) - } - return false -} - -func (w *walker) walk(path string, typ os.FileMode) error { - dir := filepath.Dir(path) - if typ.IsRegular() { - if dir == w.root.Path && (w.root.Type == RootGOROOT || w.root.Type == RootGOPATH) { - // Doesn't make sense to have regular files - // directly in your $GOPATH/src or $GOROOT/src. - return fastwalk.SkipFiles - } - if !strings.HasSuffix(path, ".go") { - return nil - } - - w.add(w.root, dir) - return fastwalk.SkipFiles - } - if typ == os.ModeDir { - base := filepath.Base(path) - if base == "" || base[0] == '.' || base[0] == '_' || - base == "testdata" || - (w.root.Type == RootGOROOT && w.opts.ModulesEnabled && base == "vendor") || - (!w.opts.ModulesEnabled && base == "node_modules") { - return filepath.SkipDir - } - fi, err := os.Lstat(path) - if err == nil && w.shouldSkipDir(fi, path) { - return filepath.SkipDir - } - return nil - } - if typ == os.ModeSymlink { - base := filepath.Base(path) - if strings.HasPrefix(base, ".#") { - // Emacs noise. - return nil - } - fi, err := os.Lstat(path) - if err != nil { - // Just ignore it. - return nil - } - if w.shouldTraverse(dir, fi) { - return fastwalk.TraverseLink - } - } - return nil -} - -// shouldTraverse reports whether the symlink fi, found in dir, -// should be followed. It makes sure symlinks were never visited -// before to avoid symlink loops. -func (w *walker) shouldTraverse(dir string, fi os.FileInfo) bool { - path := filepath.Join(dir, fi.Name()) - target, err := filepath.EvalSymlinks(path) - if err != nil { - return false - } - ts, err := os.Stat(target) - if err != nil { - fmt.Fprintln(os.Stderr, err) - return false - } - if !ts.IsDir() { - return false - } - if w.shouldSkipDir(ts, dir) { - return false - } - // Check for symlink loops by statting each directory component - // and seeing if any are the same file as ts. - for { - parent := filepath.Dir(path) - if parent == path { - // Made it to the root without seeing a cycle. - // Use this symlink. - return true - } - parentInfo, err := os.Stat(parent) - if err != nil { - return false - } - if os.SameFile(ts, parentInfo) { - // Cycle. Don't traverse. - return false - } - path = parent - } - -} diff --git a/vendor/golang.org/x/tools/internal/imports/fix.go b/vendor/golang.org/x/tools/internal/imports/fix.go deleted file mode 100644 index 916ddf3ac..000000000 --- a/vendor/golang.org/x/tools/internal/imports/fix.go +++ /dev/null @@ -1,1572 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package imports - -import ( - "bytes" - "context" - "fmt" - "go/ast" - "go/build" - "go/parser" - "go/token" - "io/ioutil" - "os" - "os/exec" - "path" - "path/filepath" - "reflect" - "sort" - "strconv" - "strings" - "sync" - "time" - "unicode" - "unicode/utf8" - - "golang.org/x/tools/go/ast/astutil" - "golang.org/x/tools/go/packages" - "golang.org/x/tools/internal/gopathwalk" -) - -// importToGroup is a list of functions which map from an import path to -// a group number. -var importToGroup = []func(env *ProcessEnv, importPath string) (num int, ok bool){ - func(env *ProcessEnv, importPath string) (num int, ok bool) { - if env.LocalPrefix == "" { - return - } - for _, p := range strings.Split(env.LocalPrefix, ",") { - if strings.HasPrefix(importPath, p) || strings.TrimSuffix(p, "/") == importPath { - return 3, true - } - } - return - }, - func(_ *ProcessEnv, importPath string) (num int, ok bool) { - if strings.HasPrefix(importPath, "appengine") { - return 2, true - } - return - }, - func(_ *ProcessEnv, importPath string) (num int, ok bool) { - if strings.Contains(importPath, ".") { - return 1, true - } - return - }, -} - -func importGroup(env *ProcessEnv, importPath string) int { - for _, fn := range importToGroup { - if n, ok := fn(env, importPath); ok { - return n - } - } - return 0 -} - -type ImportFixType int - -const ( - AddImport ImportFixType = iota - DeleteImport - SetImportName -) - -type ImportFix struct { - // StmtInfo represents the import statement this fix will add, remove, or change. - StmtInfo ImportInfo - // IdentName is the identifier that this fix will add or remove. - IdentName string - // FixType is the type of fix this is (AddImport, DeleteImport, SetImportName). - FixType ImportFixType -} - -// An ImportInfo represents a single import statement. -type ImportInfo struct { - ImportPath string // import path, e.g. "crypto/rand". - Name string // import name, e.g. "crand", or "" if none. -} - -// A packageInfo represents what's known about a package. -type packageInfo struct { - name string // real package name, if known. - exports map[string]bool // known exports. -} - -// parseOtherFiles parses all the Go files in srcDir except filename, including -// test files if filename looks like a test. -func parseOtherFiles(fset *token.FileSet, srcDir, filename string) []*ast.File { - // This could use go/packages but it doesn't buy much, and it fails - // with https://golang.org/issue/26296 in LoadFiles mode in some cases. - considerTests := strings.HasSuffix(filename, "_test.go") - - fileBase := filepath.Base(filename) - packageFileInfos, err := ioutil.ReadDir(srcDir) - if err != nil { - return nil - } - - var files []*ast.File - for _, fi := range packageFileInfos { - if fi.Name() == fileBase || !strings.HasSuffix(fi.Name(), ".go") { - continue - } - if !considerTests && strings.HasSuffix(fi.Name(), "_test.go") { - continue - } - - f, err := parser.ParseFile(fset, filepath.Join(srcDir, fi.Name()), nil, 0) - if err != nil { - continue - } - - files = append(files, f) - } - - return files -} - -// addGlobals puts the names of package vars into the provided map. -func addGlobals(f *ast.File, globals map[string]bool) { - for _, decl := range f.Decls { - genDecl, ok := decl.(*ast.GenDecl) - if !ok { - continue - } - - for _, spec := range genDecl.Specs { - valueSpec, ok := spec.(*ast.ValueSpec) - if !ok { - continue - } - globals[valueSpec.Names[0].Name] = true - } - } -} - -// collectReferences builds a map of selector expressions, from -// left hand side (X) to a set of right hand sides (Sel). -func collectReferences(f *ast.File) references { - refs := references{} - - var visitor visitFn - visitor = func(node ast.Node) ast.Visitor { - if node == nil { - return visitor - } - switch v := node.(type) { - case *ast.SelectorExpr: - xident, ok := v.X.(*ast.Ident) - if !ok { - break - } - if xident.Obj != nil { - // If the parser can resolve it, it's not a package ref. - break - } - if !ast.IsExported(v.Sel.Name) { - // Whatever this is, it's not exported from a package. - break - } - pkgName := xident.Name - r := refs[pkgName] - if r == nil { - r = make(map[string]bool) - refs[pkgName] = r - } - r[v.Sel.Name] = true - } - return visitor - } - ast.Walk(visitor, f) - return refs -} - -// collectImports returns all the imports in f. -// Unnamed imports (., _) and "C" are ignored. -func collectImports(f *ast.File) []*ImportInfo { - var imports []*ImportInfo - for _, imp := range f.Imports { - var name string - if imp.Name != nil { - name = imp.Name.Name - } - if imp.Path.Value == `"C"` || name == "_" || name == "." { - continue - } - path := strings.Trim(imp.Path.Value, `"`) - imports = append(imports, &ImportInfo{ - Name: name, - ImportPath: path, - }) - } - return imports -} - -// findMissingImport searches pass's candidates for an import that provides -// pkg, containing all of syms. -func (p *pass) findMissingImport(pkg string, syms map[string]bool) *ImportInfo { - for _, candidate := range p.candidates { - pkgInfo, ok := p.knownPackages[candidate.ImportPath] - if !ok { - continue - } - if p.importIdentifier(candidate) != pkg { - continue - } - - allFound := true - for right := range syms { - if !pkgInfo.exports[right] { - allFound = false - break - } - } - - if allFound { - return candidate - } - } - return nil -} - -// references is set of references found in a Go file. The first map key is the -// left hand side of a selector expression, the second key is the right hand -// side, and the value should always be true. -type references map[string]map[string]bool - -// A pass contains all the inputs and state necessary to fix a file's imports. -// It can be modified in some ways during use; see comments below. -type pass struct { - // Inputs. These must be set before a call to load, and not modified after. - fset *token.FileSet // fset used to parse f and its siblings. - f *ast.File // the file being fixed. - srcDir string // the directory containing f. - env *ProcessEnv // the environment to use for go commands, etc. - loadRealPackageNames bool // if true, load package names from disk rather than guessing them. - otherFiles []*ast.File // sibling files. - - // Intermediate state, generated by load. - existingImports map[string]*ImportInfo - allRefs references - missingRefs references - - // Inputs to fix. These can be augmented between successive fix calls. - lastTry bool // indicates that this is the last call and fix should clean up as best it can. - candidates []*ImportInfo // candidate imports in priority order. - knownPackages map[string]*packageInfo // information about all known packages. -} - -// loadPackageNames saves the package names for everything referenced by imports. -func (p *pass) loadPackageNames(imports []*ImportInfo) error { - if p.env.Debug { - p.env.Logf("loading package names for %v packages", len(imports)) - defer func() { - p.env.Logf("done loading package names for %v packages", len(imports)) - }() - } - var unknown []string - for _, imp := range imports { - if _, ok := p.knownPackages[imp.ImportPath]; ok { - continue - } - unknown = append(unknown, imp.ImportPath) - } - - names, err := p.env.GetResolver().loadPackageNames(unknown, p.srcDir) - if err != nil { - return err - } - - for path, name := range names { - p.knownPackages[path] = &packageInfo{ - name: name, - exports: map[string]bool{}, - } - } - return nil -} - -// importIdentifier returns the identifier that imp will introduce. It will -// guess if the package name has not been loaded, e.g. because the source -// is not available. -func (p *pass) importIdentifier(imp *ImportInfo) string { - if imp.Name != "" { - return imp.Name - } - known := p.knownPackages[imp.ImportPath] - if known != nil && known.name != "" { - return known.name - } - return importPathToAssumedName(imp.ImportPath) -} - -// load reads in everything necessary to run a pass, and reports whether the -// file already has all the imports it needs. It fills in p.missingRefs with the -// file's missing symbols, if any, or removes unused imports if not. -func (p *pass) load() ([]*ImportFix, bool) { - p.knownPackages = map[string]*packageInfo{} - p.missingRefs = references{} - p.existingImports = map[string]*ImportInfo{} - - // Load basic information about the file in question. - p.allRefs = collectReferences(p.f) - - // Load stuff from other files in the same package: - // global variables so we know they don't need resolving, and imports - // that we might want to mimic. - globals := map[string]bool{} - for _, otherFile := range p.otherFiles { - // Don't load globals from files that are in the same directory - // but a different package. Using them to suggest imports is OK. - if p.f.Name.Name == otherFile.Name.Name { - addGlobals(otherFile, globals) - } - p.candidates = append(p.candidates, collectImports(otherFile)...) - } - - // Resolve all the import paths we've seen to package names, and store - // f's imports by the identifier they introduce. - imports := collectImports(p.f) - if p.loadRealPackageNames { - err := p.loadPackageNames(append(imports, p.candidates...)) - if err != nil { - if p.env.Debug { - p.env.Logf("loading package names: %v", err) - } - return nil, false - } - } - for _, imp := range imports { - p.existingImports[p.importIdentifier(imp)] = imp - } - - // Find missing references. - for left, rights := range p.allRefs { - if globals[left] { - continue - } - _, ok := p.existingImports[left] - if !ok { - p.missingRefs[left] = rights - continue - } - } - if len(p.missingRefs) != 0 { - return nil, false - } - - return p.fix() -} - -// fix attempts to satisfy missing imports using p.candidates. If it finds -// everything, or if p.lastTry is true, it updates fixes to add the imports it found, -// delete anything unused, and update import names, and returns true. -func (p *pass) fix() ([]*ImportFix, bool) { - // Find missing imports. - var selected []*ImportInfo - for left, rights := range p.missingRefs { - if imp := p.findMissingImport(left, rights); imp != nil { - selected = append(selected, imp) - } - } - - if !p.lastTry && len(selected) != len(p.missingRefs) { - return nil, false - } - - // Found everything, or giving up. Add the new imports and remove any unused. - var fixes []*ImportFix - for _, imp := range p.existingImports { - // We deliberately ignore globals here, because we can't be sure - // they're in the same package. People do things like put multiple - // main packages in the same directory, and we don't want to - // remove imports if they happen to have the same name as a var in - // a different package. - if _, ok := p.allRefs[p.importIdentifier(imp)]; !ok { - fixes = append(fixes, &ImportFix{ - StmtInfo: *imp, - IdentName: p.importIdentifier(imp), - FixType: DeleteImport, - }) - continue - } - - // An existing import may need to update its import name to be correct. - if name := p.importSpecName(imp); name != imp.Name { - fixes = append(fixes, &ImportFix{ - StmtInfo: ImportInfo{ - Name: name, - ImportPath: imp.ImportPath, - }, - IdentName: p.importIdentifier(imp), - FixType: SetImportName, - }) - } - } - - for _, imp := range selected { - fixes = append(fixes, &ImportFix{ - StmtInfo: ImportInfo{ - Name: p.importSpecName(imp), - ImportPath: imp.ImportPath, - }, - IdentName: p.importIdentifier(imp), - FixType: AddImport, - }) - } - - return fixes, true -} - -// importSpecName gets the import name of imp in the import spec. -// -// When the import identifier matches the assumed import name, the import name does -// not appear in the import spec. -func (p *pass) importSpecName(imp *ImportInfo) string { - // If we did not load the real package names, or the name is already set, - // we just return the existing name. - if !p.loadRealPackageNames || imp.Name != "" { - return imp.Name - } - - ident := p.importIdentifier(imp) - if ident == importPathToAssumedName(imp.ImportPath) { - return "" // ident not needed since the assumed and real names are the same. - } - return ident -} - -// apply will perform the fixes on f in order. -func apply(fset *token.FileSet, f *ast.File, fixes []*ImportFix) { - for _, fix := range fixes { - switch fix.FixType { - case DeleteImport: - astutil.DeleteNamedImport(fset, f, fix.StmtInfo.Name, fix.StmtInfo.ImportPath) - case AddImport: - astutil.AddNamedImport(fset, f, fix.StmtInfo.Name, fix.StmtInfo.ImportPath) - case SetImportName: - // Find the matching import path and change the name. - for _, spec := range f.Imports { - path := strings.Trim(spec.Path.Value, `"`) - if path == fix.StmtInfo.ImportPath { - spec.Name = &ast.Ident{ - Name: fix.StmtInfo.Name, - NamePos: spec.Pos(), - } - } - } - } - } -} - -// assumeSiblingImportsValid assumes that siblings' use of packages is valid, -// adding the exports they use. -func (p *pass) assumeSiblingImportsValid() { - for _, f := range p.otherFiles { - refs := collectReferences(f) - imports := collectImports(f) - importsByName := map[string]*ImportInfo{} - for _, imp := range imports { - importsByName[p.importIdentifier(imp)] = imp - } - for left, rights := range refs { - if imp, ok := importsByName[left]; ok { - if m, ok := stdlib[imp.ImportPath]; ok { - // We have the stdlib in memory; no need to guess. - rights = copyExports(m) - } - p.addCandidate(imp, &packageInfo{ - // no name; we already know it. - exports: rights, - }) - } - } - } -} - -// addCandidate adds a candidate import to p, and merges in the information -// in pkg. -func (p *pass) addCandidate(imp *ImportInfo, pkg *packageInfo) { - p.candidates = append(p.candidates, imp) - if existing, ok := p.knownPackages[imp.ImportPath]; ok { - if existing.name == "" { - existing.name = pkg.name - } - for export := range pkg.exports { - existing.exports[export] = true - } - } else { - p.knownPackages[imp.ImportPath] = pkg - } -} - -// fixImports adds and removes imports from f so that all its references are -// satisfied and there are no unused imports. -// -// This is declared as a variable rather than a function so goimports can -// easily be extended by adding a file with an init function. -var fixImports = fixImportsDefault - -func fixImportsDefault(fset *token.FileSet, f *ast.File, filename string, env *ProcessEnv) error { - fixes, err := getFixes(fset, f, filename, env) - if err != nil { - return err - } - apply(fset, f, fixes) - return err -} - -// getFixes gets the import fixes that need to be made to f in order to fix the imports. -// It does not modify the ast. -func getFixes(fset *token.FileSet, f *ast.File, filename string, env *ProcessEnv) ([]*ImportFix, error) { - abs, err := filepath.Abs(filename) - if err != nil { - return nil, err - } - srcDir := filepath.Dir(abs) - if env.Debug { - env.Logf("fixImports(filename=%q), abs=%q, srcDir=%q ...", filename, abs, srcDir) - } - - // First pass: looking only at f, and using the naive algorithm to - // derive package names from import paths, see if the file is already - // complete. We can't add any imports yet, because we don't know - // if missing references are actually package vars. - p := &pass{fset: fset, f: f, srcDir: srcDir} - if fixes, done := p.load(); done { - return fixes, nil - } - - otherFiles := parseOtherFiles(fset, srcDir, filename) - - // Second pass: add information from other files in the same package, - // like their package vars and imports. - p.otherFiles = otherFiles - if fixes, done := p.load(); done { - return fixes, nil - } - - // Now we can try adding imports from the stdlib. - p.assumeSiblingImportsValid() - addStdlibCandidates(p, p.missingRefs) - if fixes, done := p.fix(); done { - return fixes, nil - } - - // Third pass: get real package names where we had previously used - // the naive algorithm. This is the first step that will use the - // environment, so we provide it here for the first time. - p = &pass{fset: fset, f: f, srcDir: srcDir, env: env} - p.loadRealPackageNames = true - p.otherFiles = otherFiles - if fixes, done := p.load(); done { - return fixes, nil - } - - addStdlibCandidates(p, p.missingRefs) - p.assumeSiblingImportsValid() - if fixes, done := p.fix(); done { - return fixes, nil - } - - // Go look for candidates in $GOPATH, etc. We don't necessarily load - // the real exports of sibling imports, so keep assuming their contents. - if err := addExternalCandidates(p, p.missingRefs, filename); err != nil { - return nil, err - } - - p.lastTry = true - fixes, _ := p.fix() - return fixes, nil -} - -// getCandidatePkgs returns the list of pkgs that are accessible from filename, -// optionall filtered to only packages named pkgName. -func getCandidatePkgs(pkgName, filename string, env *ProcessEnv) ([]*pkg, error) { - // TODO(heschi): filter out current package. (Don't forget x_test can import x.) - - var result []*pkg - // Start off with the standard library. - for importPath := range stdlib { - if pkgName != "" && path.Base(importPath) != pkgName { - continue - } - result = append(result, &pkg{ - dir: filepath.Join(env.GOROOT, "src", importPath), - importPathShort: importPath, - packageName: path.Base(importPath), - relevance: 0, - }) - } - - // Exclude goroot results -- getting them is relatively expensive, not cached, - // and generally redundant with the in-memory version. - exclude := []gopathwalk.RootType{gopathwalk.RootGOROOT} - // Only the go/packages resolver uses the first argument, and nobody uses that resolver. - scannedPkgs, err := env.GetResolver().scan(nil, true, exclude) - if err != nil { - return nil, err - } - - dupCheck := map[string]struct{}{} - for _, pkg := range scannedPkgs { - if pkgName != "" && pkg.packageName != pkgName { - continue - } - if !canUse(filename, pkg.dir) { - continue - } - if _, ok := dupCheck[pkg.importPathShort]; ok { - continue - } - dupCheck[pkg.importPathShort] = struct{}{} - result = append(result, pkg) - } - - // Sort first by relevance, then by package name, with import path as a tiebreaker. - sort.Slice(result, func(i, j int) bool { - pi, pj := result[i], result[j] - if pi.relevance != pj.relevance { - return pi.relevance < pj.relevance - } - if pi.packageName != pj.packageName { - return pi.packageName < pj.packageName - } - return pi.importPathShort < pj.importPathShort - }) - - return result, nil -} - -// getAllCandidates gets all of the candidates to be imported, regardless of if they are needed. -func getAllCandidates(filename string, env *ProcessEnv) ([]ImportFix, error) { - pkgs, err := getCandidatePkgs("", filename, env) - if err != nil { - return nil, err - } - result := make([]ImportFix, 0, len(pkgs)) - for _, pkg := range pkgs { - result = append(result, ImportFix{ - StmtInfo: ImportInfo{ - ImportPath: pkg.importPathShort, - }, - IdentName: pkg.packageName, - FixType: AddImport, - }) - } - return result, nil -} - -// A PackageExport is a package and its exports. -type PackageExport struct { - Fix *ImportFix - Exports []string -} - -func getPackageExports(completePackage, filename string, env *ProcessEnv) ([]PackageExport, error) { - pkgs, err := getCandidatePkgs(completePackage, filename, env) - if err != nil { - return nil, err - } - - results := make([]PackageExport, 0, len(pkgs)) - for _, pkg := range pkgs { - fix := &ImportFix{ - StmtInfo: ImportInfo{ - ImportPath: pkg.importPathShort, - }, - IdentName: pkg.packageName, - FixType: AddImport, - } - var exports []string - if e, ok := stdlib[pkg.importPathShort]; ok { - exports = e - } else { - exports, err = loadExportsForPackage(context.Background(), env, completePackage, pkg) - if err != nil { - if env.Debug { - env.Logf("while completing %q, error loading exports from %q: %v", completePackage, pkg.importPathShort, err) - } - continue - } - } - sort.Strings(exports) - results = append(results, PackageExport{ - Fix: fix, - Exports: exports, - }) - } - - return results, nil -} - -// ProcessEnv contains environment variables and settings that affect the use of -// the go command, the go/build package, etc. -type ProcessEnv struct { - LocalPrefix string - Debug bool - - // If non-empty, these will be used instead of the - // process-wide values. - GOPATH, GOROOT, GO111MODULE, GOPROXY, GOFLAGS, GOSUMDB string - WorkingDir string - - // If true, use go/packages regardless of the environment. - ForceGoPackages bool - - // Logf is the default logger for the ProcessEnv. - Logf func(format string, args ...interface{}) - - resolver Resolver -} - -func (e *ProcessEnv) env() []string { - env := os.Environ() - add := func(k, v string) { - if v != "" { - env = append(env, k+"="+v) - } - } - add("GOPATH", e.GOPATH) - add("GOROOT", e.GOROOT) - add("GO111MODULE", e.GO111MODULE) - add("GOPROXY", e.GOPROXY) - add("GOFLAGS", e.GOFLAGS) - add("GOSUMDB", e.GOSUMDB) - if e.WorkingDir != "" { - add("PWD", e.WorkingDir) - } - return env -} - -func (e *ProcessEnv) GetResolver() Resolver { - if e.resolver != nil { - return e.resolver - } - if e.ForceGoPackages { - e.resolver = &goPackagesResolver{env: e} - return e.resolver - } - - out, err := e.invokeGo("env", "GOMOD") - if err != nil || len(bytes.TrimSpace(out.Bytes())) == 0 { - e.resolver = &gopathResolver{env: e} - return e.resolver - } - e.resolver = &ModuleResolver{env: e} - return e.resolver -} - -func (e *ProcessEnv) newPackagesConfig(mode packages.LoadMode) *packages.Config { - return &packages.Config{ - Mode: mode, - Dir: e.WorkingDir, - Env: e.env(), - } -} - -func (e *ProcessEnv) buildContext() *build.Context { - ctx := build.Default - ctx.GOROOT = e.GOROOT - ctx.GOPATH = e.GOPATH - - // As of Go 1.14, build.Context has a WorkingDir field - // (see golang.org/issue/34860). - // Populate it only if present. - if wd := reflect.ValueOf(&ctx).Elem().FieldByName("WorkingDir"); wd.IsValid() && wd.Kind() == reflect.String { - wd.SetString(e.WorkingDir) - } - return &ctx -} - -func (e *ProcessEnv) invokeGo(args ...string) (*bytes.Buffer, error) { - cmd := exec.Command("go", args...) - stdout := &bytes.Buffer{} - stderr := &bytes.Buffer{} - cmd.Stdout = stdout - cmd.Stderr = stderr - cmd.Env = e.env() - cmd.Dir = e.WorkingDir - - if e.Debug { - defer func(start time.Time) { e.Logf("%s for %v", time.Since(start), cmdDebugStr(cmd)) }(time.Now()) - } - if err := cmd.Run(); err != nil { - return nil, fmt.Errorf("running go: %v (stderr:\n%s)", err, stderr) - } - return stdout, nil -} - -func cmdDebugStr(cmd *exec.Cmd) string { - env := make(map[string]string) - for _, kv := range cmd.Env { - split := strings.Split(kv, "=") - k, v := split[0], split[1] - env[k] = v - } - - return fmt.Sprintf("GOROOT=%v GOPATH=%v GO111MODULE=%v GOPROXY=%v PWD=%v go %v", env["GOROOT"], env["GOPATH"], env["GO111MODULE"], env["GOPROXY"], env["PWD"], cmd.Args) -} - -func addStdlibCandidates(pass *pass, refs references) { - add := func(pkg string) { - exports := copyExports(stdlib[pkg]) - pass.addCandidate( - &ImportInfo{ImportPath: pkg}, - &packageInfo{name: path.Base(pkg), exports: exports}) - } - for left := range refs { - if left == "rand" { - // Make sure we try crypto/rand before math/rand. - add("crypto/rand") - add("math/rand") - continue - } - for importPath := range stdlib { - if path.Base(importPath) == left { - add(importPath) - } - } - } -} - -// A Resolver does the build-system-specific parts of goimports. -type Resolver interface { - // loadPackageNames loads the package names in importPaths. - loadPackageNames(importPaths []string, srcDir string) (map[string]string, error) - // scan finds (at least) the packages satisfying refs. If loadNames is true, - // package names will be set on the results, and dirs whose package name - // could not be determined will be excluded. - scan(refs references, loadNames bool, exclude []gopathwalk.RootType) ([]*pkg, error) - // loadExports returns the set of exported symbols in the package at dir. - // loadExports may be called concurrently. - loadExports(ctx context.Context, pkg *pkg) (string, []string, error) - - ClearForNewScan() -} - -// gopackagesResolver implements resolver for GOPATH and module workspaces using go/packages. -type goPackagesResolver struct { - env *ProcessEnv -} - -func (r *goPackagesResolver) ClearForNewScan() {} - -func (r *goPackagesResolver) loadPackageNames(importPaths []string, srcDir string) (map[string]string, error) { - if len(importPaths) == 0 { - return nil, nil - } - cfg := r.env.newPackagesConfig(packages.LoadFiles) - pkgs, err := packages.Load(cfg, importPaths...) - if err != nil { - return nil, err - } - names := map[string]string{} - for _, pkg := range pkgs { - names[VendorlessPath(pkg.PkgPath)] = pkg.Name - } - // We may not have found all the packages. Guess the rest. - for _, path := range importPaths { - if _, ok := names[path]; ok { - continue - } - names[path] = importPathToAssumedName(path) - } - return names, nil - -} - -func (r *goPackagesResolver) scan(refs references, _ bool, _ []gopathwalk.RootType) ([]*pkg, error) { - var loadQueries []string - for pkgName := range refs { - loadQueries = append(loadQueries, "iamashamedtousethedisabledqueryname="+pkgName) - } - sort.Strings(loadQueries) - cfg := r.env.newPackagesConfig(packages.LoadFiles) - goPackages, err := packages.Load(cfg, loadQueries...) - if err != nil { - return nil, err - } - - var scan []*pkg - for _, goPackage := range goPackages { - scan = append(scan, &pkg{ - dir: filepath.Dir(goPackage.CompiledGoFiles[0]), - importPathShort: VendorlessPath(goPackage.PkgPath), - goPackage: goPackage, - packageName: goPackage.Name, - }) - } - return scan, nil -} - -func (r *goPackagesResolver) loadExports(ctx context.Context, pkg *pkg) (string, []string, error) { - if pkg.goPackage == nil { - return "", nil, fmt.Errorf("goPackage not set") - } - var exports []string - fset := token.NewFileSet() - for _, fname := range pkg.goPackage.CompiledGoFiles { - f, err := parser.ParseFile(fset, fname, nil, 0) - if err != nil { - return "", nil, fmt.Errorf("parsing %s: %v", fname, err) - } - for name := range f.Scope.Objects { - if ast.IsExported(name) { - exports = append(exports, name) - } - } - } - return pkg.goPackage.Name, exports, nil -} - -func addExternalCandidates(pass *pass, refs references, filename string) error { - dirScan, err := pass.env.GetResolver().scan(refs, false, nil) - if err != nil { - return err - } - - // Search for imports matching potential package references. - type result struct { - imp *ImportInfo - pkg *packageInfo - } - results := make(chan result, len(refs)) - - ctx, cancel := context.WithCancel(context.TODO()) - var wg sync.WaitGroup - defer func() { - cancel() - wg.Wait() - }() - var ( - firstErr error - firstErrOnce sync.Once - ) - for pkgName, symbols := range refs { - wg.Add(1) - go func(pkgName string, symbols map[string]bool) { - defer wg.Done() - - found, err := findImport(ctx, pass, dirScan, pkgName, symbols, filename) - - if err != nil { - firstErrOnce.Do(func() { - firstErr = err - cancel() - }) - return - } - - if found == nil { - return // No matching package. - } - - imp := &ImportInfo{ - ImportPath: found.importPathShort, - } - - pkg := &packageInfo{ - name: pkgName, - exports: symbols, - } - results <- result{imp, pkg} - }(pkgName, symbols) - } - go func() { - wg.Wait() - close(results) - }() - - for result := range results { - pass.addCandidate(result.imp, result.pkg) - } - return firstErr -} - -// notIdentifier reports whether ch is an invalid identifier character. -func notIdentifier(ch rune) bool { - return !('a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || - '0' <= ch && ch <= '9' || - ch == '_' || - ch >= utf8.RuneSelf && (unicode.IsLetter(ch) || unicode.IsDigit(ch))) -} - -// importPathToAssumedName returns the assumed package name of an import path. -// It does this using only string parsing of the import path. -// It picks the last element of the path that does not look like a major -// version, and then picks the valid identifier off the start of that element. -// It is used to determine if a local rename should be added to an import for -// clarity. -// This function could be moved to a standard package and exported if we want -// for use in other tools. -func importPathToAssumedName(importPath string) string { - base := path.Base(importPath) - if strings.HasPrefix(base, "v") { - if _, err := strconv.Atoi(base[1:]); err == nil { - dir := path.Dir(importPath) - if dir != "." { - base = path.Base(dir) - } - } - } - base = strings.TrimPrefix(base, "go-") - if i := strings.IndexFunc(base, notIdentifier); i >= 0 { - base = base[:i] - } - return base -} - -// gopathResolver implements resolver for GOPATH workspaces. -type gopathResolver struct { - env *ProcessEnv - cache *dirInfoCache -} - -func (r *gopathResolver) init() { - if r.cache == nil { - r.cache = &dirInfoCache{ - dirs: map[string]*directoryPackageInfo{}, - } - } -} - -func (r *gopathResolver) ClearForNewScan() { - r.cache = nil -} - -func (r *gopathResolver) loadPackageNames(importPaths []string, srcDir string) (map[string]string, error) { - r.init() - names := map[string]string{} - for _, path := range importPaths { - names[path] = importPathToName(r.env, path, srcDir) - } - return names, nil -} - -// importPathToName finds out the actual package name, as declared in its .go files. -// If there's a problem, it returns "". -func importPathToName(env *ProcessEnv, importPath, srcDir string) (packageName string) { - // Fast path for standard library without going to disk. - if _, ok := stdlib[importPath]; ok { - return path.Base(importPath) // stdlib packages always match their paths. - } - - buildPkg, err := env.buildContext().Import(importPath, srcDir, build.FindOnly) - if err != nil { - return "" - } - pkgName, err := packageDirToName(buildPkg.Dir) - if err != nil { - return "" - } - return pkgName -} - -// packageDirToName is a faster version of build.Import if -// the only thing desired is the package name. Given a directory, -// packageDirToName then only parses one file in the package, -// trusting that the files in the directory are consistent. -func packageDirToName(dir string) (packageName string, err error) { - d, err := os.Open(dir) - if err != nil { - return "", err - } - names, err := d.Readdirnames(-1) - d.Close() - if err != nil { - return "", err - } - sort.Strings(names) // to have predictable behavior - var lastErr error - var nfile int - for _, name := range names { - if !strings.HasSuffix(name, ".go") { - continue - } - if strings.HasSuffix(name, "_test.go") { - continue - } - nfile++ - fullFile := filepath.Join(dir, name) - - fset := token.NewFileSet() - f, err := parser.ParseFile(fset, fullFile, nil, parser.PackageClauseOnly) - if err != nil { - lastErr = err - continue - } - pkgName := f.Name.Name - if pkgName == "documentation" { - // Special case from go/build.ImportDir, not - // handled by ctx.MatchFile. - continue - } - if pkgName == "main" { - // Also skip package main, assuming it's a +build ignore generator or example. - // Since you can't import a package main anyway, there's no harm here. - continue - } - return pkgName, nil - } - if lastErr != nil { - return "", lastErr - } - return "", fmt.Errorf("no importable package found in %d Go files", nfile) -} - -type pkg struct { - goPackage *packages.Package - dir string // absolute file path to pkg directory ("/usr/lib/go/src/net/http") - importPathShort string // vendorless import path ("net/http", "a/b") - packageName string // package name loaded from source if requested - relevance int // a weakly-defined score of how relevant a package is. 0 is most relevant. -} - -type pkgDistance struct { - pkg *pkg - distance int // relative distance to target -} - -// byDistanceOrImportPathShortLength sorts by relative distance breaking ties -// on the short import path length and then the import string itself. -type byDistanceOrImportPathShortLength []pkgDistance - -func (s byDistanceOrImportPathShortLength) Len() int { return len(s) } -func (s byDistanceOrImportPathShortLength) Less(i, j int) bool { - di, dj := s[i].distance, s[j].distance - if di == -1 { - return false - } - if dj == -1 { - return true - } - if di != dj { - return di < dj - } - - vi, vj := s[i].pkg.importPathShort, s[j].pkg.importPathShort - if len(vi) != len(vj) { - return len(vi) < len(vj) - } - return vi < vj -} -func (s byDistanceOrImportPathShortLength) Swap(i, j int) { s[i], s[j] = s[j], s[i] } - -func distance(basepath, targetpath string) int { - p, err := filepath.Rel(basepath, targetpath) - if err != nil { - return -1 - } - if p == "." { - return 0 - } - return strings.Count(p, string(filepath.Separator)) + 1 -} - -func (r *gopathResolver) scan(_ references, loadNames bool, exclude []gopathwalk.RootType) ([]*pkg, error) { - r.init() - add := func(root gopathwalk.Root, dir string) { - // We assume cached directories have not changed. We can skip them and their - // children. - if _, ok := r.cache.Load(dir); ok { - return - } - - importpath := filepath.ToSlash(dir[len(root.Path)+len("/"):]) - info := directoryPackageInfo{ - status: directoryScanned, - dir: dir, - rootType: root.Type, - nonCanonicalImportPath: VendorlessPath(importpath), - } - r.cache.Store(dir, info) - } - roots := filterRoots(gopathwalk.SrcDirsRoots(r.env.buildContext()), exclude) - gopathwalk.Walk(roots, add, gopathwalk.Options{Debug: r.env.Debug, ModulesEnabled: false}) - var result []*pkg - for _, dir := range r.cache.Keys() { - info, ok := r.cache.Load(dir) - if !ok { - continue - } - if loadNames { - var err error - info, err = r.cache.CachePackageName(info) - if err != nil { - continue - } - } - - p := &pkg{ - importPathShort: info.nonCanonicalImportPath, - dir: dir, - relevance: 1, - packageName: info.packageName, - } - if info.rootType == gopathwalk.RootGOROOT { - p.relevance = 0 - } - result = append(result, p) - } - return result, nil -} - -func filterRoots(roots []gopathwalk.Root, exclude []gopathwalk.RootType) []gopathwalk.Root { - var result []gopathwalk.Root -outer: - for _, root := range roots { - for _, i := range exclude { - if i == root.Type { - continue outer - } - } - result = append(result, root) - } - return result -} - -func (r *gopathResolver) loadExports(ctx context.Context, pkg *pkg) (string, []string, error) { - r.init() - if info, ok := r.cache.Load(pkg.dir); ok { - return r.cache.CacheExports(ctx, r.env, info) - } - return loadExportsFromFiles(ctx, r.env, pkg.dir) -} - -// VendorlessPath returns the devendorized version of the import path ipath. -// For example, VendorlessPath("foo/bar/vendor/a/b") returns "a/b". -func VendorlessPath(ipath string) string { - // Devendorize for use in import statement. - if i := strings.LastIndex(ipath, "/vendor/"); i >= 0 { - return ipath[i+len("/vendor/"):] - } - if strings.HasPrefix(ipath, "vendor/") { - return ipath[len("vendor/"):] - } - return ipath -} - -func loadExportsFromFiles(ctx context.Context, env *ProcessEnv, dir string) (string, []string, error) { - var exports []string - - // Look for non-test, buildable .go files which could provide exports. - all, err := ioutil.ReadDir(dir) - if err != nil { - return "", nil, err - } - var files []os.FileInfo - for _, fi := range all { - name := fi.Name() - if !strings.HasSuffix(name, ".go") || strings.HasSuffix(name, "_test.go") { - continue - } - match, err := env.buildContext().MatchFile(dir, fi.Name()) - if err != nil || !match { - continue - } - files = append(files, fi) - } - - if len(files) == 0 { - return "", nil, fmt.Errorf("dir %v contains no buildable, non-test .go files", dir) - } - - var pkgName string - fset := token.NewFileSet() - for _, fi := range files { - select { - case <-ctx.Done(): - return "", nil, ctx.Err() - default: - } - - fullFile := filepath.Join(dir, fi.Name()) - f, err := parser.ParseFile(fset, fullFile, nil, 0) - if err != nil { - return "", nil, fmt.Errorf("parsing %s: %v", fullFile, err) - } - if f.Name.Name == "documentation" { - // Special case from go/build.ImportDir, not - // handled by MatchFile above. - continue - } - pkgName = f.Name.Name - for name := range f.Scope.Objects { - if ast.IsExported(name) { - exports = append(exports, name) - } - } - } - - if env.Debug { - sortedExports := append([]string(nil), exports...) - sort.Strings(sortedExports) - env.Logf("loaded exports in dir %v (package %v): %v", dir, pkgName, strings.Join(sortedExports, ", ")) - } - return pkgName, exports, nil -} - -// findImport searches for a package with the given symbols. -// If no package is found, findImport returns ("", false, nil) -func findImport(ctx context.Context, pass *pass, dirScan []*pkg, pkgName string, symbols map[string]bool, filename string) (*pkg, error) { - pkgDir, err := filepath.Abs(filename) - if err != nil { - return nil, err - } - pkgDir = filepath.Dir(pkgDir) - - // Find candidate packages, looking only at their directory names first. - var candidates []pkgDistance - for _, pkg := range dirScan { - if pkg.dir == pkgDir && pass.f.Name.Name == pkgName { - // The candidate is in the same directory and has the - // same package name. Don't try to import ourselves. - continue - } - if pkgIsCandidate(filename, pkgName, pkg) { - candidates = append(candidates, pkgDistance{ - pkg: pkg, - distance: distance(pkgDir, pkg.dir), - }) - } - } - - // Sort the candidates by their import package length, - // assuming that shorter package names are better than long - // ones. Note that this sorts by the de-vendored name, so - // there's no "penalty" for vendoring. - sort.Sort(byDistanceOrImportPathShortLength(candidates)) - if pass.env.Debug { - for i, c := range candidates { - pass.env.Logf("%s candidate %d/%d: %v in %v", pkgName, i+1, len(candidates), c.pkg.importPathShort, c.pkg.dir) - } - } - - // Collect exports for packages with matching names. - - rescv := make([]chan *pkg, len(candidates)) - for i := range candidates { - rescv[i] = make(chan *pkg, 1) - } - const maxConcurrentPackageImport = 4 - loadExportsSem := make(chan struct{}, maxConcurrentPackageImport) - - ctx, cancel := context.WithCancel(ctx) - var wg sync.WaitGroup - defer func() { - cancel() - wg.Wait() - }() - - wg.Add(1) - go func() { - defer wg.Done() - for i, c := range candidates { - select { - case loadExportsSem <- struct{}{}: - case <-ctx.Done(): - return - } - - wg.Add(1) - go func(c pkgDistance, resc chan<- *pkg) { - defer func() { - <-loadExportsSem - wg.Done() - }() - - if pass.env.Debug { - pass.env.Logf("loading exports in dir %s (seeking package %s)", c.pkg.dir, pkgName) - } - exports, err := loadExportsForPackage(ctx, pass.env, pkgName, c.pkg) - if err != nil { - if pass.env.Debug { - pass.env.Logf("loading exports in dir %s (seeking package %s): %v", c.pkg.dir, pkgName, err) - } - resc <- nil - return - } - - exportsMap := make(map[string]bool, len(exports)) - for _, sym := range exports { - exportsMap[sym] = true - } - - // If it doesn't have the right - // symbols, send nil to mean no match. - for symbol := range symbols { - if !exportsMap[symbol] { - resc <- nil - return - } - } - resc <- c.pkg - }(c, rescv[i]) - } - }() - - for _, resc := range rescv { - pkg := <-resc - if pkg == nil { - continue - } - return pkg, nil - } - return nil, nil -} - -func loadExportsForPackage(ctx context.Context, env *ProcessEnv, expectPkg string, pkg *pkg) ([]string, error) { - pkgName, exports, err := env.GetResolver().loadExports(ctx, pkg) - if err != nil { - return nil, err - } - if expectPkg != pkgName { - return nil, fmt.Errorf("dir %v is package %v, wanted %v", pkg.dir, pkgName, expectPkg) - } - return exports, err -} - -// pkgIsCandidate reports whether pkg is a candidate for satisfying the -// finding which package pkgIdent in the file named by filename is trying -// to refer to. -// -// This check is purely lexical and is meant to be as fast as possible -// because it's run over all $GOPATH directories to filter out poor -// candidates in order to limit the CPU and I/O later parsing the -// exports in candidate packages. -// -// filename is the file being formatted. -// pkgIdent is the package being searched for, like "client" (if -// searching for "client.New") -func pkgIsCandidate(filename, pkgIdent string, pkg *pkg) bool { - // Check "internal" and "vendor" visibility: - if !canUse(filename, pkg.dir) { - return false - } - - // Speed optimization to minimize disk I/O: - // the last two components on disk must contain the - // package name somewhere. - // - // This permits mismatch naming like directory - // "go-foo" being package "foo", or "pkg.v3" being "pkg", - // or directory "google.golang.org/api/cloudbilling/v1" - // being package "cloudbilling", but doesn't - // permit a directory "foo" to be package - // "bar", which is strongly discouraged - // anyway. There's no reason goimports needs - // to be slow just to accommodate that. - lastTwo := lastTwoComponents(pkg.importPathShort) - if strings.Contains(lastTwo, pkgIdent) { - return true - } - if hasHyphenOrUpperASCII(lastTwo) && !hasHyphenOrUpperASCII(pkgIdent) { - lastTwo = lowerASCIIAndRemoveHyphen(lastTwo) - if strings.Contains(lastTwo, pkgIdent) { - return true - } - } - - return false -} - -func hasHyphenOrUpperASCII(s string) bool { - for i := 0; i < len(s); i++ { - b := s[i] - if b == '-' || ('A' <= b && b <= 'Z') { - return true - } - } - return false -} - -func lowerASCIIAndRemoveHyphen(s string) (ret string) { - buf := make([]byte, 0, len(s)) - for i := 0; i < len(s); i++ { - b := s[i] - switch { - case b == '-': - continue - case 'A' <= b && b <= 'Z': - buf = append(buf, b+('a'-'A')) - default: - buf = append(buf, b) - } - } - return string(buf) -} - -// canUse reports whether the package in dir is usable from filename, -// respecting the Go "internal" and "vendor" visibility rules. -func canUse(filename, dir string) bool { - // Fast path check, before any allocations. If it doesn't contain vendor - // or internal, it's not tricky: - // Note that this can false-negative on directories like "notinternal", - // but we check it correctly below. This is just a fast path. - if !strings.Contains(dir, "vendor") && !strings.Contains(dir, "internal") { - return true - } - - dirSlash := filepath.ToSlash(dir) - if !strings.Contains(dirSlash, "/vendor/") && !strings.Contains(dirSlash, "/internal/") && !strings.HasSuffix(dirSlash, "/internal") { - return true - } - // Vendor or internal directory only visible from children of parent. - // That means the path from the current directory to the target directory - // can contain ../vendor or ../internal but not ../foo/vendor or ../foo/internal - // or bar/vendor or bar/internal. - // After stripping all the leading ../, the only okay place to see vendor or internal - // is at the very beginning of the path. - absfile, err := filepath.Abs(filename) - if err != nil { - return false - } - absdir, err := filepath.Abs(dir) - if err != nil { - return false - } - rel, err := filepath.Rel(absfile, absdir) - if err != nil { - return false - } - relSlash := filepath.ToSlash(rel) - if i := strings.LastIndex(relSlash, "../"); i >= 0 { - relSlash = relSlash[i+len("../"):] - } - return !strings.Contains(relSlash, "/vendor/") && !strings.Contains(relSlash, "/internal/") && !strings.HasSuffix(relSlash, "/internal") -} - -// lastTwoComponents returns at most the last two path components -// of v, using either / or \ as the path separator. -func lastTwoComponents(v string) string { - nslash := 0 - for i := len(v) - 1; i >= 0; i-- { - if v[i] == '/' || v[i] == '\\' { - nslash++ - if nslash == 2 { - return v[i:] - } - } - } - return v -} - -type visitFn func(node ast.Node) ast.Visitor - -func (fn visitFn) Visit(node ast.Node) ast.Visitor { - return fn(node) -} - -func copyExports(pkg []string) map[string]bool { - m := make(map[string]bool, len(pkg)) - for _, v := range pkg { - m[v] = true - } - return m -} diff --git a/vendor/golang.org/x/tools/internal/imports/imports.go b/vendor/golang.org/x/tools/internal/imports/imports.go deleted file mode 100644 index ed3867bb5..000000000 --- a/vendor/golang.org/x/tools/internal/imports/imports.go +++ /dev/null @@ -1,397 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:generate go run mkstdlib.go - -// Package imports implements a Go pretty-printer (like package "go/format") -// that also adds or removes import statements as necessary. -package imports - -import ( - "bufio" - "bytes" - "fmt" - "go/ast" - "go/build" - "go/format" - "go/parser" - "go/printer" - "go/token" - "io" - "io/ioutil" - "log" - "regexp" - "strconv" - "strings" - - "golang.org/x/tools/go/ast/astutil" -) - -// Options is golang.org/x/tools/imports.Options with extra internal-only options. -type Options struct { - Env *ProcessEnv // The environment to use. Note: this contains the cached module and filesystem state. - - Fragment bool // Accept fragment of a source file (no package statement) - AllErrors bool // Report all errors (not just the first 10 on different lines) - - Comments bool // Print comments (true if nil *Options provided) - TabIndent bool // Use tabs for indent (true if nil *Options provided) - TabWidth int // Tab width (8 if nil *Options provided) - - FormatOnly bool // Disable the insertion and deletion of imports -} - -// Process implements golang.org/x/tools/imports.Process with explicit context in env. -func Process(filename string, src []byte, opt *Options) (formatted []byte, err error) { - src, opt, err = initialize(filename, src, opt) - if err != nil { - return nil, err - } - - fileSet := token.NewFileSet() - file, adjust, err := parse(fileSet, filename, src, opt) - if err != nil { - return nil, err - } - - if !opt.FormatOnly { - if err := fixImports(fileSet, file, filename, opt.Env); err != nil { - return nil, err - } - } - return formatFile(fileSet, file, src, adjust, opt) -} - -// FixImports returns a list of fixes to the imports that, when applied, -// will leave the imports in the same state as Process. -// -// Note that filename's directory influences which imports can be chosen, -// so it is important that filename be accurate. -func FixImports(filename string, src []byte, opt *Options) (fixes []*ImportFix, err error) { - src, opt, err = initialize(filename, src, opt) - if err != nil { - return nil, err - } - - fileSet := token.NewFileSet() - file, _, err := parse(fileSet, filename, src, opt) - if err != nil { - return nil, err - } - - return getFixes(fileSet, file, filename, opt.Env) -} - -// ApplyFix will apply all of the fixes to the file and format it. -func ApplyFixes(fixes []*ImportFix, filename string, src []byte, opt *Options) (formatted []byte, err error) { - src, opt, err = initialize(filename, src, opt) - if err != nil { - return nil, err - } - - fileSet := token.NewFileSet() - file, adjust, err := parse(fileSet, filename, src, opt) - if err != nil { - return nil, err - } - - // Apply the fixes to the file. - apply(fileSet, file, fixes) - - return formatFile(fileSet, file, src, adjust, opt) -} - -// GetAllCandidates gets all of the standard library candidate packages to import in -// sorted order on import path. -func GetAllCandidates(filename string, opt *Options) (pkgs []ImportFix, err error) { - _, opt, err = initialize(filename, nil, opt) - if err != nil { - return nil, err - } - return getAllCandidates(filename, opt.Env) -} - -// GetPackageExports returns all known packages with name pkg and their exports. -func GetPackageExports(pkg, filename string, opt *Options) (exports []PackageExport, err error) { - _, opt, err = initialize(filename, nil, opt) - if err != nil { - return nil, err - } - return getPackageExports(pkg, filename, opt.Env) -} - -// initialize sets the values for opt and src. -// If they are provided, they are not changed. Otherwise opt is set to the -// default values and src is read from the file system. -func initialize(filename string, src []byte, opt *Options) ([]byte, *Options, error) { - // Use defaults if opt is nil. - if opt == nil { - opt = &Options{Comments: true, TabIndent: true, TabWidth: 8} - } - - // Set the env if the user has not provided it. - if opt.Env == nil { - opt.Env = &ProcessEnv{ - GOPATH: build.Default.GOPATH, - GOROOT: build.Default.GOROOT, - } - } - - // Set the logger if the user has not provided it. - if opt.Env.Logf == nil { - opt.Env.Logf = log.Printf - } - - if src == nil { - b, err := ioutil.ReadFile(filename) - if err != nil { - return nil, nil, err - } - src = b - } - - return src, opt, nil -} - -func formatFile(fileSet *token.FileSet, file *ast.File, src []byte, adjust func(orig []byte, src []byte) []byte, opt *Options) ([]byte, error) { - mergeImports(opt.Env, fileSet, file) - sortImports(opt.Env, fileSet, file) - imps := astutil.Imports(fileSet, file) - var spacesBefore []string // import paths we need spaces before - for _, impSection := range imps { - // Within each block of contiguous imports, see if any - // import lines are in different group numbers. If so, - // we'll need to put a space between them so it's - // compatible with gofmt. - lastGroup := -1 - for _, importSpec := range impSection { - importPath, _ := strconv.Unquote(importSpec.Path.Value) - groupNum := importGroup(opt.Env, importPath) - if groupNum != lastGroup && lastGroup != -1 { - spacesBefore = append(spacesBefore, importPath) - } - lastGroup = groupNum - } - - } - - printerMode := printer.UseSpaces - if opt.TabIndent { - printerMode |= printer.TabIndent - } - printConfig := &printer.Config{Mode: printerMode, Tabwidth: opt.TabWidth} - - var buf bytes.Buffer - err := printConfig.Fprint(&buf, fileSet, file) - if err != nil { - return nil, err - } - out := buf.Bytes() - if adjust != nil { - out = adjust(src, out) - } - if len(spacesBefore) > 0 { - out, err = addImportSpaces(bytes.NewReader(out), spacesBefore) - if err != nil { - return nil, err - } - } - - out, err = format.Source(out) - if err != nil { - return nil, err - } - return out, nil -} - -// parse parses src, which was read from filename, -// as a Go source file or statement list. -func parse(fset *token.FileSet, filename string, src []byte, opt *Options) (*ast.File, func(orig, src []byte) []byte, error) { - parserMode := parser.Mode(0) - if opt.Comments { - parserMode |= parser.ParseComments - } - if opt.AllErrors { - parserMode |= parser.AllErrors - } - - // Try as whole source file. - file, err := parser.ParseFile(fset, filename, src, parserMode) - if err == nil { - return file, nil, nil - } - // If the error is that the source file didn't begin with a - // package line and we accept fragmented input, fall through to - // try as a source fragment. Stop and return on any other error. - if !opt.Fragment || !strings.Contains(err.Error(), "expected 'package'") { - return nil, nil, err - } - - // If this is a declaration list, make it a source file - // by inserting a package clause. - // Insert using a ;, not a newline, so that parse errors are on - // the correct line. - const prefix = "package main;" - psrc := append([]byte(prefix), src...) - file, err = parser.ParseFile(fset, filename, psrc, parserMode) - if err == nil { - // Gofmt will turn the ; into a \n. - // Do that ourselves now and update the file contents, - // so that positions and line numbers are correct going forward. - psrc[len(prefix)-1] = '\n' - fset.File(file.Package).SetLinesForContent(psrc) - - // If a main function exists, we will assume this is a main - // package and leave the file. - if containsMainFunc(file) { - return file, nil, nil - } - - adjust := func(orig, src []byte) []byte { - // Remove the package clause. - src = src[len(prefix):] - return matchSpace(orig, src) - } - return file, adjust, nil - } - // If the error is that the source file didn't begin with a - // declaration, fall through to try as a statement list. - // Stop and return on any other error. - if !strings.Contains(err.Error(), "expected declaration") { - return nil, nil, err - } - - // If this is a statement list, make it a source file - // by inserting a package clause and turning the list - // into a function body. This handles expressions too. - // Insert using a ;, not a newline, so that the line numbers - // in fsrc match the ones in src. - fsrc := append(append([]byte("package p; func _() {"), src...), '}') - file, err = parser.ParseFile(fset, filename, fsrc, parserMode) - if err == nil { - adjust := func(orig, src []byte) []byte { - // Remove the wrapping. - // Gofmt has turned the ; into a \n\n. - src = src[len("package p\n\nfunc _() {"):] - src = src[:len(src)-len("}\n")] - // Gofmt has also indented the function body one level. - // Remove that indent. - src = bytes.Replace(src, []byte("\n\t"), []byte("\n"), -1) - return matchSpace(orig, src) - } - return file, adjust, nil - } - - // Failed, and out of options. - return nil, nil, err -} - -// containsMainFunc checks if a file contains a function declaration with the -// function signature 'func main()' -func containsMainFunc(file *ast.File) bool { - for _, decl := range file.Decls { - if f, ok := decl.(*ast.FuncDecl); ok { - if f.Name.Name != "main" { - continue - } - - if len(f.Type.Params.List) != 0 { - continue - } - - if f.Type.Results != nil && len(f.Type.Results.List) != 0 { - continue - } - - return true - } - } - - return false -} - -func cutSpace(b []byte) (before, middle, after []byte) { - i := 0 - for i < len(b) && (b[i] == ' ' || b[i] == '\t' || b[i] == '\n') { - i++ - } - j := len(b) - for j > 0 && (b[j-1] == ' ' || b[j-1] == '\t' || b[j-1] == '\n') { - j-- - } - if i <= j { - return b[:i], b[i:j], b[j:] - } - return nil, nil, b[j:] -} - -// matchSpace reformats src to use the same space context as orig. -// 1) If orig begins with blank lines, matchSpace inserts them at the beginning of src. -// 2) matchSpace copies the indentation of the first non-blank line in orig -// to every non-blank line in src. -// 3) matchSpace copies the trailing space from orig and uses it in place -// of src's trailing space. -func matchSpace(orig []byte, src []byte) []byte { - before, _, after := cutSpace(orig) - i := bytes.LastIndex(before, []byte{'\n'}) - before, indent := before[:i+1], before[i+1:] - - _, src, _ = cutSpace(src) - - var b bytes.Buffer - b.Write(before) - for len(src) > 0 { - line := src - if i := bytes.IndexByte(line, '\n'); i >= 0 { - line, src = line[:i+1], line[i+1:] - } else { - src = nil - } - if len(line) > 0 && line[0] != '\n' { // not blank - b.Write(indent) - } - b.Write(line) - } - b.Write(after) - return b.Bytes() -} - -var impLine = regexp.MustCompile(`^\s+(?:[\w\.]+\s+)?"(.+)"`) - -func addImportSpaces(r io.Reader, breaks []string) ([]byte, error) { - var out bytes.Buffer - in := bufio.NewReader(r) - inImports := false - done := false - for { - s, err := in.ReadString('\n') - if err == io.EOF { - break - } else if err != nil { - return nil, err - } - - if !inImports && !done && strings.HasPrefix(s, "import") { - inImports = true - } - if inImports && (strings.HasPrefix(s, "var") || - strings.HasPrefix(s, "func") || - strings.HasPrefix(s, "const") || - strings.HasPrefix(s, "type")) { - done = true - inImports = false - } - if inImports && len(breaks) > 0 { - if m := impLine.FindStringSubmatch(s); m != nil { - if m[1] == breaks[0] { - out.WriteByte('\n') - breaks = breaks[1:] - } - } - } - - fmt.Fprint(&out, s) - } - return out.Bytes(), nil -} diff --git a/vendor/golang.org/x/tools/internal/imports/mkindex.go b/vendor/golang.org/x/tools/internal/imports/mkindex.go deleted file mode 100644 index ef8c0d287..000000000 --- a/vendor/golang.org/x/tools/internal/imports/mkindex.go +++ /dev/null @@ -1,173 +0,0 @@ -// +build ignore - -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Command mkindex creates the file "pkgindex.go" containing an index of the Go -// standard library. The file is intended to be built as part of the imports -// package, so that the package may be used in environments where a GOROOT is -// not available (such as App Engine). -package imports - -import ( - "bytes" - "fmt" - "go/ast" - "go/build" - "go/format" - "go/parser" - "go/token" - "io/ioutil" - "log" - "os" - "path" - "path/filepath" - "strings" -) - -var ( - pkgIndex = make(map[string][]pkg) - exports = make(map[string]map[string]bool) -) - -func main() { - // Don't use GOPATH. - ctx := build.Default - ctx.GOPATH = "" - - // Populate pkgIndex global from GOROOT. - for _, path := range ctx.SrcDirs() { - f, err := os.Open(path) - if err != nil { - log.Print(err) - continue - } - children, err := f.Readdir(-1) - f.Close() - if err != nil { - log.Print(err) - continue - } - for _, child := range children { - if child.IsDir() { - loadPkg(path, child.Name()) - } - } - } - // Populate exports global. - for _, ps := range pkgIndex { - for _, p := range ps { - e := loadExports(p.dir) - if e != nil { - exports[p.dir] = e - } - } - } - - // Construct source file. - var buf bytes.Buffer - fmt.Fprint(&buf, pkgIndexHead) - fmt.Fprintf(&buf, "var pkgIndexMaster = %#v\n", pkgIndex) - fmt.Fprintf(&buf, "var exportsMaster = %#v\n", exports) - src := buf.Bytes() - - // Replace main.pkg type name with pkg. - src = bytes.Replace(src, []byte("main.pkg"), []byte("pkg"), -1) - // Replace actual GOROOT with "/go". - src = bytes.Replace(src, []byte(ctx.GOROOT), []byte("/go"), -1) - // Add some line wrapping. - src = bytes.Replace(src, []byte("}, "), []byte("},\n"), -1) - src = bytes.Replace(src, []byte("true, "), []byte("true,\n"), -1) - - var err error - src, err = format.Source(src) - if err != nil { - log.Fatal(err) - } - - // Write out source file. - err = ioutil.WriteFile("pkgindex.go", src, 0644) - if err != nil { - log.Fatal(err) - } -} - -const pkgIndexHead = `package imports - -func init() { - pkgIndexOnce.Do(func() { - pkgIndex.m = pkgIndexMaster - }) - loadExports = func(dir string) map[string]bool { - return exportsMaster[dir] - } -} -` - -type pkg struct { - importpath string // full pkg import path, e.g. "net/http" - dir string // absolute file path to pkg directory e.g. "/usr/lib/go/src/fmt" -} - -var fset = token.NewFileSet() - -func loadPkg(root, importpath string) { - shortName := path.Base(importpath) - if shortName == "testdata" { - return - } - - dir := filepath.Join(root, importpath) - pkgIndex[shortName] = append(pkgIndex[shortName], pkg{ - importpath: importpath, - dir: dir, - }) - - pkgDir, err := os.Open(dir) - if err != nil { - return - } - children, err := pkgDir.Readdir(-1) - pkgDir.Close() - if err != nil { - return - } - for _, child := range children { - name := child.Name() - if name == "" { - continue - } - if c := name[0]; c == '.' || ('0' <= c && c <= '9') { - continue - } - if child.IsDir() { - loadPkg(root, filepath.Join(importpath, name)) - } - } -} - -func loadExports(dir string) map[string]bool { - exports := make(map[string]bool) - buildPkg, err := build.ImportDir(dir, 0) - if err != nil { - if strings.Contains(err.Error(), "no buildable Go source files in") { - return nil - } - log.Printf("could not import %q: %v", dir, err) - return nil - } - for _, file := range buildPkg.GoFiles { - f, err := parser.ParseFile(fset, filepath.Join(dir, file), nil, 0) - if err != nil { - log.Printf("could not parse %q: %v", file, err) - continue - } - for name := range f.Scope.Objects { - if ast.IsExported(name) { - exports[name] = true - } - } - } - return exports -} diff --git a/vendor/golang.org/x/tools/internal/imports/mkstdlib.go b/vendor/golang.org/x/tools/internal/imports/mkstdlib.go deleted file mode 100644 index 39b86ccd9..000000000 --- a/vendor/golang.org/x/tools/internal/imports/mkstdlib.go +++ /dev/null @@ -1,128 +0,0 @@ -// +build ignore - -// mkstdlib generates the zstdlib.go file, containing the Go standard -// library API symbols. It's baked into the binary to avoid scanning -// GOPATH in the common case. -package main - -import ( - "bufio" - "bytes" - "fmt" - "go/format" - "io" - "io/ioutil" - "log" - "os" - "os/exec" - "path/filepath" - "regexp" - "runtime" - "sort" -) - -func mustOpen(name string) io.Reader { - f, err := os.Open(name) - if err != nil { - log.Fatal(err) - } - return f -} - -func api(base string) string { - return filepath.Join(runtime.GOROOT(), "api", base) -} - -var sym = regexp.MustCompile(`^pkg (\S+).*?, (?:var|func|type|const) ([A-Z]\w*)`) - -var unsafeSyms = map[string]bool{"Alignof": true, "ArbitraryType": true, "Offsetof": true, "Pointer": true, "Sizeof": true} - -func main() { - var buf bytes.Buffer - outf := func(format string, args ...interface{}) { - fmt.Fprintf(&buf, format, args...) - } - outf("// Code generated by mkstdlib.go. DO NOT EDIT.\n\n") - outf("package imports\n") - outf("var stdlib = map[string][]string{\n") - f := io.MultiReader( - mustOpen(api("go1.txt")), - mustOpen(api("go1.1.txt")), - mustOpen(api("go1.2.txt")), - mustOpen(api("go1.3.txt")), - mustOpen(api("go1.4.txt")), - mustOpen(api("go1.5.txt")), - mustOpen(api("go1.6.txt")), - mustOpen(api("go1.7.txt")), - mustOpen(api("go1.8.txt")), - mustOpen(api("go1.9.txt")), - mustOpen(api("go1.10.txt")), - mustOpen(api("go1.11.txt")), - mustOpen(api("go1.12.txt")), - mustOpen(api("go1.13.txt")), - - // The API of the syscall/js package needs to be computed explicitly, - // because it's not included in the GOROOT/api/go1.*.txt files at this time. - syscallJSAPI(), - ) - sc := bufio.NewScanner(f) - - pkgs := map[string]map[string]bool{ - "unsafe": unsafeSyms, - } - paths := []string{"unsafe"} - - for sc.Scan() { - l := sc.Text() - if m := sym.FindStringSubmatch(l); m != nil { - path, sym := m[1], m[2] - - if _, ok := pkgs[path]; !ok { - pkgs[path] = map[string]bool{} - paths = append(paths, path) - } - pkgs[path][sym] = true - } - } - if err := sc.Err(); err != nil { - log.Fatal(err) - } - sort.Strings(paths) - for _, path := range paths { - outf("\t%q: []string{\n", path) - pkg := pkgs[path] - var syms []string - for sym := range pkg { - syms = append(syms, sym) - } - sort.Strings(syms) - for _, sym := range syms { - outf("\t\t%q,\n", sym) - } - outf("},\n") - } - outf("}\n") - fmtbuf, err := format.Source(buf.Bytes()) - if err != nil { - log.Fatal(err) - } - err = ioutil.WriteFile("zstdlib.go", fmtbuf, 0666) - if err != nil { - log.Fatal(err) - } -} - -// syscallJSAPI returns the API of the syscall/js package. -// It's computed from the contents of $(go env GOROOT)/src/syscall/js. -func syscallJSAPI() io.Reader { - var exeSuffix string - if runtime.GOOS == "windows" { - exeSuffix = ".exe" - } - cmd := exec.Command("go"+exeSuffix, "run", "cmd/api", "-contexts", "js-wasm", "syscall/js") - out, err := cmd.Output() - if err != nil { - log.Fatalln(err) - } - return bytes.NewReader(out) -} diff --git a/vendor/golang.org/x/tools/internal/imports/mod.go b/vendor/golang.org/x/tools/internal/imports/mod.go deleted file mode 100644 index 0f9b87eb7..000000000 --- a/vendor/golang.org/x/tools/internal/imports/mod.go +++ /dev/null @@ -1,643 +0,0 @@ -package imports - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "io/ioutil" - "os" - "path" - "path/filepath" - "regexp" - "sort" - "strconv" - "strings" - "sync" - - "golang.org/x/tools/internal/gopathwalk" - "golang.org/x/tools/internal/module" - "golang.org/x/tools/internal/semver" -) - -// ModuleResolver implements resolver for modules using the go command as little -// as feasible. -type ModuleResolver struct { - env *ProcessEnv - moduleCacheDir string - dummyVendorMod *ModuleJSON // If vendoring is enabled, the pseudo-module that represents the /vendor directory. - - Initialized bool - Main *ModuleJSON - ModsByModPath []*ModuleJSON // All modules, ordered by # of path components in module Path... - ModsByDir []*ModuleJSON // ...or Dir. - - // moduleCacheCache stores information about the module cache. - moduleCacheCache *dirInfoCache - otherCache *dirInfoCache -} - -type ModuleJSON struct { - Path string // module path - Replace *ModuleJSON // replaced by this module - Main bool // is this the main module? - Dir string // directory holding files for this module, if any - GoMod string // path to go.mod file for this module, if any - GoVersion string // go version used in module -} - -func (r *ModuleResolver) init() error { - if r.Initialized { - return nil - } - mainMod, vendorEnabled, err := vendorEnabled(r.env) - if err != nil { - return err - } - - if mainMod != nil && vendorEnabled { - // Vendor mode is on, so all the non-Main modules are irrelevant, - // and we need to search /vendor for everything. - r.Main = mainMod - r.dummyVendorMod = &ModuleJSON{ - Path: "", - Dir: filepath.Join(mainMod.Dir, "vendor"), - } - r.ModsByModPath = []*ModuleJSON{mainMod, r.dummyVendorMod} - r.ModsByDir = []*ModuleJSON{mainMod, r.dummyVendorMod} - } else { - // Vendor mode is off, so run go list -m ... to find everything. - r.initAllMods() - } - - r.moduleCacheDir = filepath.Join(filepath.SplitList(r.env.GOPATH)[0], "/pkg/mod") - - sort.Slice(r.ModsByModPath, func(i, j int) bool { - count := func(x int) int { - return strings.Count(r.ModsByModPath[x].Path, "/") - } - return count(j) < count(i) // descending order - }) - sort.Slice(r.ModsByDir, func(i, j int) bool { - count := func(x int) int { - return strings.Count(r.ModsByDir[x].Dir, "/") - } - return count(j) < count(i) // descending order - }) - - if r.moduleCacheCache == nil { - r.moduleCacheCache = &dirInfoCache{ - dirs: map[string]*directoryPackageInfo{}, - } - } - if r.otherCache == nil { - r.otherCache = &dirInfoCache{ - dirs: map[string]*directoryPackageInfo{}, - } - } - r.Initialized = true - return nil -} - -func (r *ModuleResolver) initAllMods() error { - stdout, err := r.env.invokeGo("list", "-m", "-json", "...") - if err != nil { - return err - } - for dec := json.NewDecoder(stdout); dec.More(); { - mod := &ModuleJSON{} - if err := dec.Decode(mod); err != nil { - return err - } - if mod.Dir == "" { - if r.env.Debug { - r.env.Logf("module %v has not been downloaded and will be ignored", mod.Path) - } - // Can't do anything with a module that's not downloaded. - continue - } - r.ModsByModPath = append(r.ModsByModPath, mod) - r.ModsByDir = append(r.ModsByDir, mod) - if mod.Main { - r.Main = mod - } - } - return nil -} - -func (r *ModuleResolver) ClearForNewScan() { - r.otherCache = &dirInfoCache{ - dirs: map[string]*directoryPackageInfo{}, - } -} - -func (r *ModuleResolver) ClearForNewMod() { - env := r.env - *r = ModuleResolver{ - env: env, - } - r.init() -} - -// findPackage returns the module and directory that contains the package at -// the given import path, or returns nil, "" if no module is in scope. -func (r *ModuleResolver) findPackage(importPath string) (*ModuleJSON, string) { - // This can't find packages in the stdlib, but that's harmless for all - // the existing code paths. - for _, m := range r.ModsByModPath { - if !strings.HasPrefix(importPath, m.Path) { - continue - } - pathInModule := importPath[len(m.Path):] - pkgDir := filepath.Join(m.Dir, pathInModule) - if r.dirIsNestedModule(pkgDir, m) { - continue - } - - if info, ok := r.cacheLoad(pkgDir); ok { - if loaded, err := info.reachedStatus(nameLoaded); loaded { - if err != nil { - continue // No package in this dir. - } - return m, pkgDir - } - if scanned, err := info.reachedStatus(directoryScanned); scanned && err != nil { - continue // Dir is unreadable, etc. - } - // This is slightly wrong: a directory doesn't have to have an - // importable package to count as a package for package-to-module - // resolution. package main or _test files should count but - // don't. - // TODO(heschi): fix this. - if _, err := r.cachePackageName(info); err == nil { - return m, pkgDir - } - } - - // Not cached. Read the filesystem. - pkgFiles, err := ioutil.ReadDir(pkgDir) - if err != nil { - continue - } - // A module only contains a package if it has buildable go - // files in that directory. If not, it could be provided by an - // outer module. See #29736. - for _, fi := range pkgFiles { - if ok, _ := r.env.buildContext().MatchFile(pkgDir, fi.Name()); ok { - return m, pkgDir - } - } - } - return nil, "" -} - -func (r *ModuleResolver) cacheLoad(dir string) (directoryPackageInfo, bool) { - if info, ok := r.moduleCacheCache.Load(dir); ok { - return info, ok - } - return r.otherCache.Load(dir) -} - -func (r *ModuleResolver) cacheStore(info directoryPackageInfo) { - if info.rootType == gopathwalk.RootModuleCache { - r.moduleCacheCache.Store(info.dir, info) - } else { - r.otherCache.Store(info.dir, info) - } -} - -func (r *ModuleResolver) cacheKeys() []string { - return append(r.moduleCacheCache.Keys(), r.otherCache.Keys()...) -} - -// cachePackageName caches the package name for a dir already in the cache. -func (r *ModuleResolver) cachePackageName(info directoryPackageInfo) (directoryPackageInfo, error) { - if info.rootType == gopathwalk.RootModuleCache { - return r.moduleCacheCache.CachePackageName(info) - } - return r.otherCache.CachePackageName(info) -} - -func (r *ModuleResolver) cacheExports(ctx context.Context, env *ProcessEnv, info directoryPackageInfo) (string, []string, error) { - if info.rootType == gopathwalk.RootModuleCache { - return r.moduleCacheCache.CacheExports(ctx, env, info) - } - return r.otherCache.CacheExports(ctx, env, info) -} - -// findModuleByDir returns the module that contains dir, or nil if no such -// module is in scope. -func (r *ModuleResolver) findModuleByDir(dir string) *ModuleJSON { - // This is quite tricky and may not be correct. dir could be: - // - a package in the main module. - // - a replace target underneath the main module's directory. - // - a nested module in the above. - // - a replace target somewhere totally random. - // - a nested module in the above. - // - in the mod cache. - // - in /vendor/ in -mod=vendor mode. - // - nested module? Dunno. - // Rumor has it that replace targets cannot contain other replace targets. - for _, m := range r.ModsByDir { - if !strings.HasPrefix(dir, m.Dir) { - continue - } - - if r.dirIsNestedModule(dir, m) { - continue - } - - return m - } - return nil -} - -// dirIsNestedModule reports if dir is contained in a nested module underneath -// mod, not actually in mod. -func (r *ModuleResolver) dirIsNestedModule(dir string, mod *ModuleJSON) bool { - if !strings.HasPrefix(dir, mod.Dir) { - return false - } - if r.dirInModuleCache(dir) { - // Nested modules in the module cache are pruned, - // so it cannot be a nested module. - return false - } - if mod != nil && mod == r.dummyVendorMod { - // The /vendor pseudomodule is flattened and doesn't actually count. - return false - } - modDir, _ := r.modInfo(dir) - if modDir == "" { - return false - } - return modDir != mod.Dir -} - -func (r *ModuleResolver) modInfo(dir string) (modDir string, modName string) { - readModName := func(modFile string) string { - modBytes, err := ioutil.ReadFile(modFile) - if err != nil { - return "" - } - return modulePath(modBytes) - } - - if r.dirInModuleCache(dir) { - matches := modCacheRegexp.FindStringSubmatch(dir) - index := strings.Index(dir, matches[1]+"@"+matches[2]) - modDir := filepath.Join(dir[:index], matches[1]+"@"+matches[2]) - return modDir, readModName(filepath.Join(modDir, "go.mod")) - } - for { - if info, ok := r.cacheLoad(dir); ok { - return info.moduleDir, info.moduleName - } - f := filepath.Join(dir, "go.mod") - info, err := os.Stat(f) - if err == nil && !info.IsDir() { - return dir, readModName(f) - } - - d := filepath.Dir(dir) - if len(d) >= len(dir) { - return "", "" // reached top of file system, no go.mod - } - dir = d - } -} - -func (r *ModuleResolver) dirInModuleCache(dir string) bool { - if r.moduleCacheDir == "" { - return false - } - return strings.HasPrefix(dir, r.moduleCacheDir) -} - -func (r *ModuleResolver) loadPackageNames(importPaths []string, srcDir string) (map[string]string, error) { - if err := r.init(); err != nil { - return nil, err - } - names := map[string]string{} - for _, path := range importPaths { - _, packageDir := r.findPackage(path) - if packageDir == "" { - continue - } - name, err := packageDirToName(packageDir) - if err != nil { - continue - } - names[path] = name - } - return names, nil -} - -func (r *ModuleResolver) scan(_ references, loadNames bool, exclude []gopathwalk.RootType) ([]*pkg, error) { - if err := r.init(); err != nil { - return nil, err - } - - // Walk GOROOT, GOPATH/pkg/mod, and the main module. - roots := []gopathwalk.Root{ - {filepath.Join(r.env.GOROOT, "/src"), gopathwalk.RootGOROOT}, - } - if r.Main != nil { - roots = append(roots, gopathwalk.Root{r.Main.Dir, gopathwalk.RootCurrentModule}) - } - if r.dummyVendorMod != nil { - roots = append(roots, gopathwalk.Root{r.dummyVendorMod.Dir, gopathwalk.RootOther}) - } else { - roots = append(roots, gopathwalk.Root{r.moduleCacheDir, gopathwalk.RootModuleCache}) - // Walk replace targets, just in case they're not in any of the above. - for _, mod := range r.ModsByModPath { - if mod.Replace != nil { - roots = append(roots, gopathwalk.Root{mod.Dir, gopathwalk.RootOther}) - } - } - } - - roots = filterRoots(roots, exclude) - - var result []*pkg - var mu sync.Mutex - - // We assume cached directories have not changed. We can skip them and their - // children. - skip := func(root gopathwalk.Root, dir string) bool { - mu.Lock() - defer mu.Unlock() - - info, ok := r.cacheLoad(dir) - if !ok { - return false - } - // This directory can be skipped as long as we have already scanned it. - // Packages with errors will continue to have errors, so there is no need - // to rescan them. - packageScanned, _ := info.reachedStatus(directoryScanned) - return packageScanned - } - - // Add anything new to the cache. We'll process everything in it below. - add := func(root gopathwalk.Root, dir string) { - mu.Lock() - defer mu.Unlock() - - r.cacheStore(r.scanDirForPackage(root, dir)) - } - - gopathwalk.WalkSkip(roots, add, skip, gopathwalk.Options{Debug: r.env.Debug, ModulesEnabled: true}) - - // Everything we already had, and everything new, is now in the cache. - for _, dir := range r.cacheKeys() { - info, ok := r.cacheLoad(dir) - if !ok { - continue - } - - // Skip this directory if we were not able to get the package information successfully. - if scanned, err := info.reachedStatus(directoryScanned); !scanned || err != nil { - continue - } - - // If we want package names, make sure the cache has them. - if loadNames { - var err error - if info, err = r.cachePackageName(info); err != nil { - continue - } - } - - res, err := r.canonicalize(info) - if err != nil { - continue - } - result = append(result, res) - } - - return result, nil -} - -// canonicalize gets the result of canonicalizing the packages using the results -// of initializing the resolver from 'go list -m'. -func (r *ModuleResolver) canonicalize(info directoryPackageInfo) (*pkg, error) { - // Packages in GOROOT are already canonical, regardless of the std/cmd modules. - if info.rootType == gopathwalk.RootGOROOT { - return &pkg{ - importPathShort: info.nonCanonicalImportPath, - dir: info.dir, - packageName: path.Base(info.nonCanonicalImportPath), - relevance: 0, - }, nil - } - - importPath := info.nonCanonicalImportPath - relevance := 2 - // Check if the directory is underneath a module that's in scope. - if mod := r.findModuleByDir(info.dir); mod != nil { - relevance = 1 - // It is. If dir is the target of a replace directive, - // our guessed import path is wrong. Use the real one. - if mod.Dir == info.dir { - importPath = mod.Path - } else { - dirInMod := info.dir[len(mod.Dir)+len("/"):] - importPath = path.Join(mod.Path, filepath.ToSlash(dirInMod)) - } - } else if info.needsReplace { - return nil, fmt.Errorf("package in %q is not valid without a replace statement", info.dir) - } - - res := &pkg{ - importPathShort: importPath, - dir: info.dir, - packageName: info.packageName, // may not be populated if the caller didn't ask for it - relevance: relevance, - } - // We may have discovered a package that has a different version - // in scope already. Canonicalize to that one if possible. - if _, canonicalDir := r.findPackage(importPath); canonicalDir != "" { - res.dir = canonicalDir - } - return res, nil -} - -func (r *ModuleResolver) loadExports(ctx context.Context, pkg *pkg) (string, []string, error) { - if err := r.init(); err != nil { - return "", nil, err - } - if info, ok := r.cacheLoad(pkg.dir); ok { - return r.cacheExports(ctx, r.env, info) - } - return loadExportsFromFiles(ctx, r.env, pkg.dir) -} - -func (r *ModuleResolver) scanDirForPackage(root gopathwalk.Root, dir string) directoryPackageInfo { - subdir := "" - if dir != root.Path { - subdir = dir[len(root.Path)+len("/"):] - } - importPath := filepath.ToSlash(subdir) - if strings.HasPrefix(importPath, "vendor/") { - // Only enter vendor directories if they're explicitly requested as a root. - return directoryPackageInfo{ - status: directoryScanned, - err: fmt.Errorf("unwanted vendor directory"), - } - } - switch root.Type { - case gopathwalk.RootCurrentModule: - importPath = path.Join(r.Main.Path, filepath.ToSlash(subdir)) - case gopathwalk.RootModuleCache: - matches := modCacheRegexp.FindStringSubmatch(subdir) - if len(matches) == 0 { - return directoryPackageInfo{ - status: directoryScanned, - err: fmt.Errorf("invalid module cache path: %v", subdir), - } - } - modPath, err := module.DecodePath(filepath.ToSlash(matches[1])) - if err != nil { - if r.env.Debug { - r.env.Logf("decoding module cache path %q: %v", subdir, err) - } - return directoryPackageInfo{ - status: directoryScanned, - err: fmt.Errorf("decoding module cache path %q: %v", subdir, err), - } - } - importPath = path.Join(modPath, filepath.ToSlash(matches[3])) - } - - modDir, modName := r.modInfo(dir) - result := directoryPackageInfo{ - status: directoryScanned, - dir: dir, - rootType: root.Type, - nonCanonicalImportPath: importPath, - needsReplace: false, - moduleDir: modDir, - moduleName: modName, - } - if root.Type == gopathwalk.RootGOROOT { - // stdlib packages are always in scope, despite the confusing go.mod - return result - } - // Check that this package is not obviously impossible to import. - if !strings.HasPrefix(importPath, modName) { - // The module's declared path does not match - // its expected path. It probably needs a - // replace directive we don't have. - result.needsReplace = true - } - - return result -} - -// modCacheRegexp splits a path in a module cache into module, module version, and package. -var modCacheRegexp = regexp.MustCompile(`(.*)@([^/\\]*)(.*)`) - -var ( - slashSlash = []byte("//") - moduleStr = []byte("module") -) - -// modulePath returns the module path from the gomod file text. -// If it cannot find a module path, it returns an empty string. -// It is tolerant of unrelated problems in the go.mod file. -// -// Copied from cmd/go/internal/modfile. -func modulePath(mod []byte) string { - for len(mod) > 0 { - line := mod - mod = nil - if i := bytes.IndexByte(line, '\n'); i >= 0 { - line, mod = line[:i], line[i+1:] - } - if i := bytes.Index(line, slashSlash); i >= 0 { - line = line[:i] - } - line = bytes.TrimSpace(line) - if !bytes.HasPrefix(line, moduleStr) { - continue - } - line = line[len(moduleStr):] - n := len(line) - line = bytes.TrimSpace(line) - if len(line) == n || len(line) == 0 { - continue - } - - if line[0] == '"' || line[0] == '`' { - p, err := strconv.Unquote(string(line)) - if err != nil { - return "" // malformed quoted string or multiline module path - } - return p - } - - return string(line) - } - return "" // missing module path -} - -var modFlagRegexp = regexp.MustCompile(`-mod[ =](\w+)`) - -// vendorEnabled indicates if vendoring is enabled. -// Inspired by setDefaultBuildMod in modload/init.go -func vendorEnabled(env *ProcessEnv) (*ModuleJSON, bool, error) { - mainMod, go114, err := getMainModuleAnd114(env) - if err != nil { - return nil, false, err - } - matches := modFlagRegexp.FindStringSubmatch(env.GOFLAGS) - var modFlag string - if len(matches) != 0 { - modFlag = matches[1] - } - if modFlag != "" { - // Don't override an explicit '-mod=' argument. - return mainMod, modFlag == "vendor", nil - } - if mainMod == nil || !go114 { - return mainMod, false, nil - } - // Check 1.14's automatic vendor mode. - if fi, err := os.Stat(filepath.Join(mainMod.Dir, "vendor")); err == nil && fi.IsDir() { - if mainMod.GoVersion != "" && semver.Compare("v"+mainMod.GoVersion, "v1.14") >= 0 { - // The Go version is at least 1.14, and a vendor directory exists. - // Set -mod=vendor by default. - return mainMod, true, nil - } - } - return mainMod, false, nil -} - -// getMainModuleAnd114 gets the main module's information and whether the -// go command in use is 1.14+. This is the information needed to figure out -// if vendoring should be enabled. -func getMainModuleAnd114(env *ProcessEnv) (*ModuleJSON, bool, error) { - const format = `{{.Path}} -{{.Dir}} -{{.GoMod}} -{{.GoVersion}} -{{range context.ReleaseTags}}{{if eq . "go1.14"}}{{.}}{{end}}{{end}} -` - stdout, err := env.invokeGo("list", "-m", "-f", format) - if err != nil { - return nil, false, nil - } - lines := strings.Split(stdout.String(), "\n") - if len(lines) < 5 { - return nil, false, fmt.Errorf("unexpected stdout: %q", stdout) - } - mod := &ModuleJSON{ - Path: lines[0], - Dir: lines[1], - GoMod: lines[2], - GoVersion: lines[3], - Main: true, - } - return mod, lines[4] == "go1.14", nil -} diff --git a/vendor/golang.org/x/tools/internal/imports/mod_cache.go b/vendor/golang.org/x/tools/internal/imports/mod_cache.go deleted file mode 100644 index f6b070a3f..000000000 --- a/vendor/golang.org/x/tools/internal/imports/mod_cache.go +++ /dev/null @@ -1,165 +0,0 @@ -package imports - -import ( - "context" - "fmt" - "sync" - - "golang.org/x/tools/internal/gopathwalk" -) - -// To find packages to import, the resolver needs to know about all of the -// the packages that could be imported. This includes packages that are -// already in modules that are in (1) the current module, (2) replace targets, -// and (3) packages in the module cache. Packages in (1) and (2) may change over -// time, as the client may edit the current module and locally replaced modules. -// The module cache (which includes all of the packages in (3)) can only -// ever be added to. -// -// The resolver can thus save state about packages in the module cache -// and guarantee that this will not change over time. To obtain information -// about new modules added to the module cache, the module cache should be -// rescanned. -// -// It is OK to serve information about modules that have been deleted, -// as they do still exist. -// TODO(suzmue): can we share information with the caller about -// what module needs to be downloaded to import this package? - -type directoryPackageStatus int - -const ( - _ directoryPackageStatus = iota - directoryScanned - nameLoaded - exportsLoaded -) - -type directoryPackageInfo struct { - // status indicates the extent to which this struct has been filled in. - status directoryPackageStatus - // err is non-nil when there was an error trying to reach status. - err error - - // Set when status >= directoryScanned. - - // dir is the absolute directory of this package. - dir string - rootType gopathwalk.RootType - // nonCanonicalImportPath is the package's expected import path. It may - // not actually be importable at that path. - nonCanonicalImportPath string - // needsReplace is true if the nonCanonicalImportPath does not match the - // module's declared path, making it impossible to import without a - // replace directive. - needsReplace bool - - // Module-related information. - moduleDir string // The directory that is the module root of this dir. - moduleName string // The module name that contains this dir. - - // Set when status >= nameLoaded. - - packageName string // the package name, as declared in the source. - - // Set when status >= exportsLoaded. - - exports []string -} - -// reachedStatus returns true when info has a status at least target and any error associated with -// an attempt to reach target. -func (info *directoryPackageInfo) reachedStatus(target directoryPackageStatus) (bool, error) { - if info.err == nil { - return info.status >= target, nil - } - if info.status == target { - return true, info.err - } - return true, nil -} - -// dirInfoCache is a concurrency safe map for storing information about -// directories that may contain packages. -// -// The information in this cache is built incrementally. Entries are initialized in scan. -// No new keys should be added in any other functions, as all directories containing -// packages are identified in scan. -// -// Other functions, including loadExports and findPackage, may update entries in this cache -// as they discover new things about the directory. -// -// The information in the cache is not expected to change for the cache's -// lifetime, so there is no protection against competing writes. Users should -// take care not to hold the cache across changes to the underlying files. -// -// TODO(suzmue): consider other concurrency strategies and data structures (RWLocks, sync.Map, etc) -type dirInfoCache struct { - mu sync.Mutex - // dirs stores information about packages in directories, keyed by absolute path. - dirs map[string]*directoryPackageInfo -} - -// Store stores the package info for dir. -func (d *dirInfoCache) Store(dir string, info directoryPackageInfo) { - d.mu.Lock() - defer d.mu.Unlock() - stored := info // defensive copy - d.dirs[dir] = &stored -} - -// Load returns a copy of the directoryPackageInfo for absolute directory dir. -func (d *dirInfoCache) Load(dir string) (directoryPackageInfo, bool) { - d.mu.Lock() - defer d.mu.Unlock() - info, ok := d.dirs[dir] - if !ok { - return directoryPackageInfo{}, false - } - return *info, true -} - -// Keys returns the keys currently present in d. -func (d *dirInfoCache) Keys() (keys []string) { - d.mu.Lock() - defer d.mu.Unlock() - for key := range d.dirs { - keys = append(keys, key) - } - return keys -} - -func (d *dirInfoCache) CachePackageName(info directoryPackageInfo) (directoryPackageInfo, error) { - if loaded, err := info.reachedStatus(nameLoaded); loaded { - return info, err - } - if scanned, err := info.reachedStatus(directoryScanned); !scanned || err != nil { - return info, fmt.Errorf("cannot read package name, scan error: %v", err) - } - info.packageName, info.err = packageDirToName(info.dir) - info.status = nameLoaded - d.Store(info.dir, info) - return info, info.err -} - -func (d *dirInfoCache) CacheExports(ctx context.Context, env *ProcessEnv, info directoryPackageInfo) (string, []string, error) { - if reached, _ := info.reachedStatus(exportsLoaded); reached { - return info.packageName, info.exports, info.err - } - if reached, err := info.reachedStatus(nameLoaded); reached && err != nil { - return "", nil, err - } - info.packageName, info.exports, info.err = loadExportsFromFiles(ctx, env, info.dir) - if info.err == context.Canceled { - return info.packageName, info.exports, info.err - } - // The cache structure wants things to proceed linearly. We can skip a - // step here, but only if we succeed. - if info.status == nameLoaded || info.err == nil { - info.status = exportsLoaded - } else { - info.status = nameLoaded - } - d.Store(info.dir, info) - return info.packageName, info.exports, info.err -} diff --git a/vendor/golang.org/x/tools/internal/imports/sortimports.go b/vendor/golang.org/x/tools/internal/imports/sortimports.go deleted file mode 100644 index 226279471..000000000 --- a/vendor/golang.org/x/tools/internal/imports/sortimports.go +++ /dev/null @@ -1,280 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Hacked up copy of go/ast/import.go - -package imports - -import ( - "go/ast" - "go/token" - "sort" - "strconv" -) - -// sortImports sorts runs of consecutive import lines in import blocks in f. -// It also removes duplicate imports when it is possible to do so without data loss. -func sortImports(env *ProcessEnv, fset *token.FileSet, f *ast.File) { - for i, d := range f.Decls { - d, ok := d.(*ast.GenDecl) - if !ok || d.Tok != token.IMPORT { - // Not an import declaration, so we're done. - // Imports are always first. - break - } - - if len(d.Specs) == 0 { - // Empty import block, remove it. - f.Decls = append(f.Decls[:i], f.Decls[i+1:]...) - } - - if !d.Lparen.IsValid() { - // Not a block: sorted by default. - continue - } - - // Identify and sort runs of specs on successive lines. - i := 0 - specs := d.Specs[:0] - for j, s := range d.Specs { - if j > i && fset.Position(s.Pos()).Line > 1+fset.Position(d.Specs[j-1].End()).Line { - // j begins a new run. End this one. - specs = append(specs, sortSpecs(env, fset, f, d.Specs[i:j])...) - i = j - } - } - specs = append(specs, sortSpecs(env, fset, f, d.Specs[i:])...) - d.Specs = specs - - // Deduping can leave a blank line before the rparen; clean that up. - if len(d.Specs) > 0 { - lastSpec := d.Specs[len(d.Specs)-1] - lastLine := fset.Position(lastSpec.Pos()).Line - if rParenLine := fset.Position(d.Rparen).Line; rParenLine > lastLine+1 { - fset.File(d.Rparen).MergeLine(rParenLine - 1) - } - } - } -} - -// mergeImports merges all the import declarations into the first one. -// Taken from golang.org/x/tools/ast/astutil. -func mergeImports(env *ProcessEnv, fset *token.FileSet, f *ast.File) { - if len(f.Decls) <= 1 { - return - } - - // Merge all the import declarations into the first one. - var first *ast.GenDecl - for i := 0; i < len(f.Decls); i++ { - decl := f.Decls[i] - gen, ok := decl.(*ast.GenDecl) - if !ok || gen.Tok != token.IMPORT || declImports(gen, "C") { - continue - } - if first == nil { - first = gen - continue // Don't touch the first one. - } - // We now know there is more than one package in this import - // declaration. Ensure that it ends up parenthesized. - first.Lparen = first.Pos() - // Move the imports of the other import declaration to the first one. - for _, spec := range gen.Specs { - spec.(*ast.ImportSpec).Path.ValuePos = first.Pos() - first.Specs = append(first.Specs, spec) - } - f.Decls = append(f.Decls[:i], f.Decls[i+1:]...) - i-- - } -} - -// declImports reports whether gen contains an import of path. -// Taken from golang.org/x/tools/ast/astutil. -func declImports(gen *ast.GenDecl, path string) bool { - if gen.Tok != token.IMPORT { - return false - } - for _, spec := range gen.Specs { - impspec := spec.(*ast.ImportSpec) - if importPath(impspec) == path { - return true - } - } - return false -} - -func importPath(s ast.Spec) string { - t, err := strconv.Unquote(s.(*ast.ImportSpec).Path.Value) - if err == nil { - return t - } - return "" -} - -func importName(s ast.Spec) string { - n := s.(*ast.ImportSpec).Name - if n == nil { - return "" - } - return n.Name -} - -func importComment(s ast.Spec) string { - c := s.(*ast.ImportSpec).Comment - if c == nil { - return "" - } - return c.Text() -} - -// collapse indicates whether prev may be removed, leaving only next. -func collapse(prev, next ast.Spec) bool { - if importPath(next) != importPath(prev) || importName(next) != importName(prev) { - return false - } - return prev.(*ast.ImportSpec).Comment == nil -} - -type posSpan struct { - Start token.Pos - End token.Pos -} - -func sortSpecs(env *ProcessEnv, fset *token.FileSet, f *ast.File, specs []ast.Spec) []ast.Spec { - // Can't short-circuit here even if specs are already sorted, - // since they might yet need deduplication. - // A lone import, however, may be safely ignored. - if len(specs) <= 1 { - return specs - } - - // Record positions for specs. - pos := make([]posSpan, len(specs)) - for i, s := range specs { - pos[i] = posSpan{s.Pos(), s.End()} - } - - // Identify comments in this range. - // Any comment from pos[0].Start to the final line counts. - lastLine := fset.Position(pos[len(pos)-1].End).Line - cstart := len(f.Comments) - cend := len(f.Comments) - for i, g := range f.Comments { - if g.Pos() < pos[0].Start { - continue - } - if i < cstart { - cstart = i - } - if fset.Position(g.End()).Line > lastLine { - cend = i - break - } - } - comments := f.Comments[cstart:cend] - - // Assign each comment to the import spec preceding it. - importComment := map[*ast.ImportSpec][]*ast.CommentGroup{} - specIndex := 0 - for _, g := range comments { - for specIndex+1 < len(specs) && pos[specIndex+1].Start <= g.Pos() { - specIndex++ - } - s := specs[specIndex].(*ast.ImportSpec) - importComment[s] = append(importComment[s], g) - } - - // Sort the import specs by import path. - // Remove duplicates, when possible without data loss. - // Reassign the import paths to have the same position sequence. - // Reassign each comment to abut the end of its spec. - // Sort the comments by new position. - sort.Sort(byImportSpec{env, specs}) - - // Dedup. Thanks to our sorting, we can just consider - // adjacent pairs of imports. - deduped := specs[:0] - for i, s := range specs { - if i == len(specs)-1 || !collapse(s, specs[i+1]) { - deduped = append(deduped, s) - } else { - p := s.Pos() - fset.File(p).MergeLine(fset.Position(p).Line) - } - } - specs = deduped - - // Fix up comment positions - for i, s := range specs { - s := s.(*ast.ImportSpec) - if s.Name != nil { - s.Name.NamePos = pos[i].Start - } - s.Path.ValuePos = pos[i].Start - s.EndPos = pos[i].End - nextSpecPos := pos[i].End - - for _, g := range importComment[s] { - for _, c := range g.List { - c.Slash = pos[i].End - nextSpecPos = c.End() - } - } - if i < len(specs)-1 { - pos[i+1].Start = nextSpecPos - pos[i+1].End = nextSpecPos - } - } - - sort.Sort(byCommentPos(comments)) - - // Fixup comments can insert blank lines, because import specs are on different lines. - // We remove those blank lines here by merging import spec to the first import spec line. - firstSpecLine := fset.Position(specs[0].Pos()).Line - for _, s := range specs[1:] { - p := s.Pos() - line := fset.File(p).Line(p) - for previousLine := line - 1; previousLine >= firstSpecLine; { - fset.File(p).MergeLine(previousLine) - previousLine-- - } - } - return specs -} - -type byImportSpec struct { - env *ProcessEnv - specs []ast.Spec // slice of *ast.ImportSpec -} - -func (x byImportSpec) Len() int { return len(x.specs) } -func (x byImportSpec) Swap(i, j int) { x.specs[i], x.specs[j] = x.specs[j], x.specs[i] } -func (x byImportSpec) Less(i, j int) bool { - ipath := importPath(x.specs[i]) - jpath := importPath(x.specs[j]) - - igroup := importGroup(x.env, ipath) - jgroup := importGroup(x.env, jpath) - if igroup != jgroup { - return igroup < jgroup - } - - if ipath != jpath { - return ipath < jpath - } - iname := importName(x.specs[i]) - jname := importName(x.specs[j]) - - if iname != jname { - return iname < jname - } - return importComment(x.specs[i]) < importComment(x.specs[j]) -} - -type byCommentPos []*ast.CommentGroup - -func (x byCommentPos) Len() int { return len(x) } -func (x byCommentPos) Swap(i, j int) { x[i], x[j] = x[j], x[i] } -func (x byCommentPos) Less(i, j int) bool { return x[i].Pos() < x[j].Pos() } diff --git a/vendor/golang.org/x/tools/internal/imports/zstdlib.go b/vendor/golang.org/x/tools/internal/imports/zstdlib.go deleted file mode 100644 index 7e60eb04e..000000000 --- a/vendor/golang.org/x/tools/internal/imports/zstdlib.go +++ /dev/null @@ -1,10377 +0,0 @@ -// Code generated by mkstdlib.go. DO NOT EDIT. - -package imports - -var stdlib = map[string][]string{ - "archive/tar": []string{ - "ErrFieldTooLong", - "ErrHeader", - "ErrWriteAfterClose", - "ErrWriteTooLong", - "FileInfoHeader", - "Format", - "FormatGNU", - "FormatPAX", - "FormatUSTAR", - "FormatUnknown", - "Header", - "NewReader", - "NewWriter", - "Reader", - "TypeBlock", - "TypeChar", - "TypeCont", - "TypeDir", - "TypeFifo", - "TypeGNULongLink", - "TypeGNULongName", - "TypeGNUSparse", - "TypeLink", - "TypeReg", - "TypeRegA", - "TypeSymlink", - "TypeXGlobalHeader", - "TypeXHeader", - "Writer", - }, - "archive/zip": []string{ - "Compressor", - "Decompressor", - "Deflate", - "ErrAlgorithm", - "ErrChecksum", - "ErrFormat", - "File", - "FileHeader", - "FileInfoHeader", - "NewReader", - "NewWriter", - "OpenReader", - "ReadCloser", - "Reader", - "RegisterCompressor", - "RegisterDecompressor", - "Store", - "Writer", - }, - "bufio": []string{ - "ErrAdvanceTooFar", - "ErrBufferFull", - "ErrFinalToken", - "ErrInvalidUnreadByte", - "ErrInvalidUnreadRune", - "ErrNegativeAdvance", - "ErrNegativeCount", - "ErrTooLong", - "MaxScanTokenSize", - "NewReadWriter", - "NewReader", - "NewReaderSize", - "NewScanner", - "NewWriter", - "NewWriterSize", - "ReadWriter", - "Reader", - "ScanBytes", - "ScanLines", - "ScanRunes", - "ScanWords", - "Scanner", - "SplitFunc", - "Writer", - }, - "bytes": []string{ - "Buffer", - "Compare", - "Contains", - "ContainsAny", - "ContainsRune", - "Count", - "Equal", - "EqualFold", - "ErrTooLarge", - "Fields", - "FieldsFunc", - "HasPrefix", - "HasSuffix", - "Index", - "IndexAny", - "IndexByte", - "IndexFunc", - "IndexRune", - "Join", - "LastIndex", - "LastIndexAny", - "LastIndexByte", - "LastIndexFunc", - "Map", - "MinRead", - "NewBuffer", - "NewBufferString", - "NewReader", - "Reader", - "Repeat", - "Replace", - "ReplaceAll", - "Runes", - "Split", - "SplitAfter", - "SplitAfterN", - "SplitN", - "Title", - "ToLower", - "ToLowerSpecial", - "ToTitle", - "ToTitleSpecial", - "ToUpper", - "ToUpperSpecial", - "ToValidUTF8", - "Trim", - "TrimFunc", - "TrimLeft", - "TrimLeftFunc", - "TrimPrefix", - "TrimRight", - "TrimRightFunc", - "TrimSpace", - "TrimSuffix", - }, - "compress/bzip2": []string{ - "NewReader", - "StructuralError", - }, - "compress/flate": []string{ - "BestCompression", - "BestSpeed", - "CorruptInputError", - "DefaultCompression", - "HuffmanOnly", - "InternalError", - "NewReader", - "NewReaderDict", - "NewWriter", - "NewWriterDict", - "NoCompression", - "ReadError", - "Reader", - "Resetter", - "WriteError", - "Writer", - }, - "compress/gzip": []string{ - "BestCompression", - "BestSpeed", - "DefaultCompression", - "ErrChecksum", - "ErrHeader", - "Header", - "HuffmanOnly", - "NewReader", - "NewWriter", - "NewWriterLevel", - "NoCompression", - "Reader", - "Writer", - }, - "compress/lzw": []string{ - "LSB", - "MSB", - "NewReader", - "NewWriter", - "Order", - }, - "compress/zlib": []string{ - "BestCompression", - "BestSpeed", - "DefaultCompression", - "ErrChecksum", - "ErrDictionary", - "ErrHeader", - "HuffmanOnly", - "NewReader", - "NewReaderDict", - "NewWriter", - "NewWriterLevel", - "NewWriterLevelDict", - "NoCompression", - "Resetter", - "Writer", - }, - "container/heap": []string{ - "Fix", - "Init", - "Interface", - "Pop", - "Push", - "Remove", - }, - "container/list": []string{ - "Element", - "List", - "New", - }, - "container/ring": []string{ - "New", - "Ring", - }, - "context": []string{ - "Background", - "CancelFunc", - "Canceled", - "Context", - "DeadlineExceeded", - "TODO", - "WithCancel", - "WithDeadline", - "WithTimeout", - "WithValue", - }, - "crypto": []string{ - "BLAKE2b_256", - "BLAKE2b_384", - "BLAKE2b_512", - "BLAKE2s_256", - "Decrypter", - "DecrypterOpts", - "Hash", - "MD4", - "MD5", - "MD5SHA1", - "PrivateKey", - "PublicKey", - "RIPEMD160", - "RegisterHash", - "SHA1", - "SHA224", - "SHA256", - "SHA384", - "SHA3_224", - "SHA3_256", - "SHA3_384", - "SHA3_512", - "SHA512", - "SHA512_224", - "SHA512_256", - "Signer", - "SignerOpts", - }, - "crypto/aes": []string{ - "BlockSize", - "KeySizeError", - "NewCipher", - }, - "crypto/cipher": []string{ - "AEAD", - "Block", - "BlockMode", - "NewCBCDecrypter", - "NewCBCEncrypter", - "NewCFBDecrypter", - "NewCFBEncrypter", - "NewCTR", - "NewGCM", - "NewGCMWithNonceSize", - "NewGCMWithTagSize", - "NewOFB", - "Stream", - "StreamReader", - "StreamWriter", - }, - "crypto/des": []string{ - "BlockSize", - "KeySizeError", - "NewCipher", - "NewTripleDESCipher", - }, - "crypto/dsa": []string{ - "ErrInvalidPublicKey", - "GenerateKey", - "GenerateParameters", - "L1024N160", - "L2048N224", - "L2048N256", - "L3072N256", - "ParameterSizes", - "Parameters", - "PrivateKey", - "PublicKey", - "Sign", - "Verify", - }, - "crypto/ecdsa": []string{ - "GenerateKey", - "PrivateKey", - "PublicKey", - "Sign", - "Verify", - }, - "crypto/ed25519": []string{ - "GenerateKey", - "NewKeyFromSeed", - "PrivateKey", - "PrivateKeySize", - "PublicKey", - "PublicKeySize", - "SeedSize", - "Sign", - "SignatureSize", - "Verify", - }, - "crypto/elliptic": []string{ - "Curve", - "CurveParams", - "GenerateKey", - "Marshal", - "P224", - "P256", - "P384", - "P521", - "Unmarshal", - }, - "crypto/hmac": []string{ - "Equal", - "New", - }, - "crypto/md5": []string{ - "BlockSize", - "New", - "Size", - "Sum", - }, - "crypto/rand": []string{ - "Int", - "Prime", - "Read", - "Reader", - }, - "crypto/rc4": []string{ - "Cipher", - "KeySizeError", - "NewCipher", - }, - "crypto/rsa": []string{ - "CRTValue", - "DecryptOAEP", - "DecryptPKCS1v15", - "DecryptPKCS1v15SessionKey", - "EncryptOAEP", - "EncryptPKCS1v15", - "ErrDecryption", - "ErrMessageTooLong", - "ErrVerification", - "GenerateKey", - "GenerateMultiPrimeKey", - "OAEPOptions", - "PKCS1v15DecryptOptions", - "PSSOptions", - "PSSSaltLengthAuto", - "PSSSaltLengthEqualsHash", - "PrecomputedValues", - "PrivateKey", - "PublicKey", - "SignPKCS1v15", - "SignPSS", - "VerifyPKCS1v15", - "VerifyPSS", - }, - "crypto/sha1": []string{ - "BlockSize", - "New", - "Size", - "Sum", - }, - "crypto/sha256": []string{ - "BlockSize", - "New", - "New224", - "Size", - "Size224", - "Sum224", - "Sum256", - }, - "crypto/sha512": []string{ - "BlockSize", - "New", - "New384", - "New512_224", - "New512_256", - "Size", - "Size224", - "Size256", - "Size384", - "Sum384", - "Sum512", - "Sum512_224", - "Sum512_256", - }, - "crypto/subtle": []string{ - "ConstantTimeByteEq", - "ConstantTimeCompare", - "ConstantTimeCopy", - "ConstantTimeEq", - "ConstantTimeLessOrEq", - "ConstantTimeSelect", - }, - "crypto/tls": []string{ - "Certificate", - "CertificateRequestInfo", - "Client", - "ClientAuthType", - "ClientHelloInfo", - "ClientSessionCache", - "ClientSessionState", - "Config", - "Conn", - "ConnectionState", - "CurveID", - "CurveP256", - "CurveP384", - "CurveP521", - "Dial", - "DialWithDialer", - "ECDSAWithP256AndSHA256", - "ECDSAWithP384AndSHA384", - "ECDSAWithP521AndSHA512", - "ECDSAWithSHA1", - "Ed25519", - "Listen", - "LoadX509KeyPair", - "NewLRUClientSessionCache", - "NewListener", - "NoClientCert", - "PKCS1WithSHA1", - "PKCS1WithSHA256", - "PKCS1WithSHA384", - "PKCS1WithSHA512", - "PSSWithSHA256", - "PSSWithSHA384", - "PSSWithSHA512", - "RecordHeaderError", - "RenegotiateFreelyAsClient", - "RenegotiateNever", - "RenegotiateOnceAsClient", - "RenegotiationSupport", - "RequestClientCert", - "RequireAndVerifyClientCert", - "RequireAnyClientCert", - "Server", - "SignatureScheme", - "TLS_AES_128_GCM_SHA256", - "TLS_AES_256_GCM_SHA384", - "TLS_CHACHA20_POLY1305_SHA256", - "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", - "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", - "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", - "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", - "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", - "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305", - "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", - "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA", - "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", - "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", - "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", - "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", - "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", - "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305", - "TLS_ECDHE_RSA_WITH_RC4_128_SHA", - "TLS_FALLBACK_SCSV", - "TLS_RSA_WITH_3DES_EDE_CBC_SHA", - "TLS_RSA_WITH_AES_128_CBC_SHA", - "TLS_RSA_WITH_AES_128_CBC_SHA256", - "TLS_RSA_WITH_AES_128_GCM_SHA256", - "TLS_RSA_WITH_AES_256_CBC_SHA", - "TLS_RSA_WITH_AES_256_GCM_SHA384", - "TLS_RSA_WITH_RC4_128_SHA", - "VerifyClientCertIfGiven", - "VersionSSL30", - "VersionTLS10", - "VersionTLS11", - "VersionTLS12", - "VersionTLS13", - "X25519", - "X509KeyPair", - }, - "crypto/x509": []string{ - "CANotAuthorizedForExtKeyUsage", - "CANotAuthorizedForThisName", - "CertPool", - "Certificate", - "CertificateInvalidError", - "CertificateRequest", - "ConstraintViolationError", - "CreateCertificate", - "CreateCertificateRequest", - "DSA", - "DSAWithSHA1", - "DSAWithSHA256", - "DecryptPEMBlock", - "ECDSA", - "ECDSAWithSHA1", - "ECDSAWithSHA256", - "ECDSAWithSHA384", - "ECDSAWithSHA512", - "Ed25519", - "EncryptPEMBlock", - "ErrUnsupportedAlgorithm", - "Expired", - "ExtKeyUsage", - "ExtKeyUsageAny", - "ExtKeyUsageClientAuth", - "ExtKeyUsageCodeSigning", - "ExtKeyUsageEmailProtection", - "ExtKeyUsageIPSECEndSystem", - "ExtKeyUsageIPSECTunnel", - "ExtKeyUsageIPSECUser", - "ExtKeyUsageMicrosoftCommercialCodeSigning", - "ExtKeyUsageMicrosoftKernelCodeSigning", - "ExtKeyUsageMicrosoftServerGatedCrypto", - "ExtKeyUsageNetscapeServerGatedCrypto", - "ExtKeyUsageOCSPSigning", - "ExtKeyUsageServerAuth", - "ExtKeyUsageTimeStamping", - "HostnameError", - "IncompatibleUsage", - "IncorrectPasswordError", - "InsecureAlgorithmError", - "InvalidReason", - "IsEncryptedPEMBlock", - "KeyUsage", - "KeyUsageCRLSign", - "KeyUsageCertSign", - "KeyUsageContentCommitment", - "KeyUsageDataEncipherment", - "KeyUsageDecipherOnly", - "KeyUsageDigitalSignature", - "KeyUsageEncipherOnly", - "KeyUsageKeyAgreement", - "KeyUsageKeyEncipherment", - "MD2WithRSA", - "MD5WithRSA", - "MarshalECPrivateKey", - "MarshalPKCS1PrivateKey", - "MarshalPKCS1PublicKey", - "MarshalPKCS8PrivateKey", - "MarshalPKIXPublicKey", - "NameConstraintsWithoutSANs", - "NameMismatch", - "NewCertPool", - "NotAuthorizedToSign", - "PEMCipher", - "PEMCipher3DES", - "PEMCipherAES128", - "PEMCipherAES192", - "PEMCipherAES256", - "PEMCipherDES", - "ParseCRL", - "ParseCertificate", - "ParseCertificateRequest", - "ParseCertificates", - "ParseDERCRL", - "ParseECPrivateKey", - "ParsePKCS1PrivateKey", - "ParsePKCS1PublicKey", - "ParsePKCS8PrivateKey", - "ParsePKIXPublicKey", - "PublicKeyAlgorithm", - "PureEd25519", - "RSA", - "SHA1WithRSA", - "SHA256WithRSA", - "SHA256WithRSAPSS", - "SHA384WithRSA", - "SHA384WithRSAPSS", - "SHA512WithRSA", - "SHA512WithRSAPSS", - "SignatureAlgorithm", - "SystemCertPool", - "SystemRootsError", - "TooManyConstraints", - "TooManyIntermediates", - "UnconstrainedName", - "UnhandledCriticalExtension", - "UnknownAuthorityError", - "UnknownPublicKeyAlgorithm", - "UnknownSignatureAlgorithm", - "VerifyOptions", - }, - "crypto/x509/pkix": []string{ - "AlgorithmIdentifier", - "AttributeTypeAndValue", - "AttributeTypeAndValueSET", - "CertificateList", - "Extension", - "Name", - "RDNSequence", - "RelativeDistinguishedNameSET", - "RevokedCertificate", - "TBSCertificateList", - }, - "database/sql": []string{ - "ColumnType", - "Conn", - "DB", - "DBStats", - "Drivers", - "ErrConnDone", - "ErrNoRows", - "ErrTxDone", - "IsolationLevel", - "LevelDefault", - "LevelLinearizable", - "LevelReadCommitted", - "LevelReadUncommitted", - "LevelRepeatableRead", - "LevelSerializable", - "LevelSnapshot", - "LevelWriteCommitted", - "Named", - "NamedArg", - "NullBool", - "NullFloat64", - "NullInt32", - "NullInt64", - "NullString", - "NullTime", - "Open", - "OpenDB", - "Out", - "RawBytes", - "Register", - "Result", - "Row", - "Rows", - "Scanner", - "Stmt", - "Tx", - "TxOptions", - }, - "database/sql/driver": []string{ - "Bool", - "ColumnConverter", - "Conn", - "ConnBeginTx", - "ConnPrepareContext", - "Connector", - "DefaultParameterConverter", - "Driver", - "DriverContext", - "ErrBadConn", - "ErrRemoveArgument", - "ErrSkip", - "Execer", - "ExecerContext", - "Int32", - "IsScanValue", - "IsValue", - "IsolationLevel", - "NamedValue", - "NamedValueChecker", - "NotNull", - "Null", - "Pinger", - "Queryer", - "QueryerContext", - "Result", - "ResultNoRows", - "Rows", - "RowsAffected", - "RowsColumnTypeDatabaseTypeName", - "RowsColumnTypeLength", - "RowsColumnTypeNullable", - "RowsColumnTypePrecisionScale", - "RowsColumnTypeScanType", - "RowsNextResultSet", - "SessionResetter", - "Stmt", - "StmtExecContext", - "StmtQueryContext", - "String", - "Tx", - "TxOptions", - "Value", - "ValueConverter", - "Valuer", - }, - "debug/dwarf": []string{ - "AddrType", - "ArrayType", - "Attr", - "AttrAbstractOrigin", - "AttrAccessibility", - "AttrAddrClass", - "AttrAllocated", - "AttrArtificial", - "AttrAssociated", - "AttrBaseTypes", - "AttrBitOffset", - "AttrBitSize", - "AttrByteSize", - "AttrCallColumn", - "AttrCallFile", - "AttrCallLine", - "AttrCalling", - "AttrCommonRef", - "AttrCompDir", - "AttrConstValue", - "AttrContainingType", - "AttrCount", - "AttrDataLocation", - "AttrDataMemberLoc", - "AttrDeclColumn", - "AttrDeclFile", - "AttrDeclLine", - "AttrDeclaration", - "AttrDefaultValue", - "AttrDescription", - "AttrDiscr", - "AttrDiscrList", - "AttrDiscrValue", - "AttrEncoding", - "AttrEntrypc", - "AttrExtension", - "AttrExternal", - "AttrFrameBase", - "AttrFriend", - "AttrHighpc", - "AttrIdentifierCase", - "AttrImport", - "AttrInline", - "AttrIsOptional", - "AttrLanguage", - "AttrLocation", - "AttrLowerBound", - "AttrLowpc", - "AttrMacroInfo", - "AttrName", - "AttrNamelistItem", - "AttrOrdering", - "AttrPriority", - "AttrProducer", - "AttrPrototyped", - "AttrRanges", - "AttrReturnAddr", - "AttrSegment", - "AttrSibling", - "AttrSpecification", - "AttrStartScope", - "AttrStaticLink", - "AttrStmtList", - "AttrStride", - "AttrStrideSize", - "AttrStringLength", - "AttrTrampoline", - "AttrType", - "AttrUpperBound", - "AttrUseLocation", - "AttrUseUTF8", - "AttrVarParam", - "AttrVirtuality", - "AttrVisibility", - "AttrVtableElemLoc", - "BasicType", - "BoolType", - "CharType", - "Class", - "ClassAddress", - "ClassBlock", - "ClassConstant", - "ClassExprLoc", - "ClassFlag", - "ClassLinePtr", - "ClassLocListPtr", - "ClassMacPtr", - "ClassRangeListPtr", - "ClassReference", - "ClassReferenceAlt", - "ClassReferenceSig", - "ClassString", - "ClassStringAlt", - "ClassUnknown", - "CommonType", - "ComplexType", - "Data", - "DecodeError", - "DotDotDotType", - "Entry", - "EnumType", - "EnumValue", - "ErrUnknownPC", - "Field", - "FloatType", - "FuncType", - "IntType", - "LineEntry", - "LineFile", - "LineReader", - "LineReaderPos", - "New", - "Offset", - "PtrType", - "QualType", - "Reader", - "StructField", - "StructType", - "Tag", - "TagAccessDeclaration", - "TagArrayType", - "TagBaseType", - "TagCatchDwarfBlock", - "TagClassType", - "TagCommonDwarfBlock", - "TagCommonInclusion", - "TagCompileUnit", - "TagCondition", - "TagConstType", - "TagConstant", - "TagDwarfProcedure", - "TagEntryPoint", - "TagEnumerationType", - "TagEnumerator", - "TagFileType", - "TagFormalParameter", - "TagFriend", - "TagImportedDeclaration", - "TagImportedModule", - "TagImportedUnit", - "TagInheritance", - "TagInlinedSubroutine", - "TagInterfaceType", - "TagLabel", - "TagLexDwarfBlock", - "TagMember", - "TagModule", - "TagMutableType", - "TagNamelist", - "TagNamelistItem", - "TagNamespace", - "TagPackedType", - "TagPartialUnit", - "TagPointerType", - "TagPtrToMemberType", - "TagReferenceType", - "TagRestrictType", - "TagRvalueReferenceType", - "TagSetType", - "TagSharedType", - "TagStringType", - "TagStructType", - "TagSubprogram", - "TagSubrangeType", - "TagSubroutineType", - "TagTemplateAlias", - "TagTemplateTypeParameter", - "TagTemplateValueParameter", - "TagThrownType", - "TagTryDwarfBlock", - "TagTypeUnit", - "TagTypedef", - "TagUnionType", - "TagUnspecifiedParameters", - "TagUnspecifiedType", - "TagVariable", - "TagVariant", - "TagVariantPart", - "TagVolatileType", - "TagWithStmt", - "Type", - "TypedefType", - "UcharType", - "UintType", - "UnspecifiedType", - "UnsupportedType", - "VoidType", - }, - "debug/elf": []string{ - "ARM_MAGIC_TRAMP_NUMBER", - "COMPRESS_HIOS", - "COMPRESS_HIPROC", - "COMPRESS_LOOS", - "COMPRESS_LOPROC", - "COMPRESS_ZLIB", - "Chdr32", - "Chdr64", - "Class", - "CompressionType", - "DF_BIND_NOW", - "DF_ORIGIN", - "DF_STATIC_TLS", - "DF_SYMBOLIC", - "DF_TEXTREL", - "DT_BIND_NOW", - "DT_DEBUG", - "DT_ENCODING", - "DT_FINI", - "DT_FINI_ARRAY", - "DT_FINI_ARRAYSZ", - "DT_FLAGS", - "DT_HASH", - "DT_HIOS", - "DT_HIPROC", - "DT_INIT", - "DT_INIT_ARRAY", - "DT_INIT_ARRAYSZ", - "DT_JMPREL", - "DT_LOOS", - "DT_LOPROC", - "DT_NEEDED", - "DT_NULL", - "DT_PLTGOT", - "DT_PLTREL", - "DT_PLTRELSZ", - "DT_PREINIT_ARRAY", - "DT_PREINIT_ARRAYSZ", - "DT_REL", - "DT_RELA", - "DT_RELAENT", - "DT_RELASZ", - "DT_RELENT", - "DT_RELSZ", - "DT_RPATH", - "DT_RUNPATH", - "DT_SONAME", - "DT_STRSZ", - "DT_STRTAB", - "DT_SYMBOLIC", - "DT_SYMENT", - "DT_SYMTAB", - "DT_TEXTREL", - "DT_VERNEED", - "DT_VERNEEDNUM", - "DT_VERSYM", - "Data", - "Dyn32", - "Dyn64", - "DynFlag", - "DynTag", - "EI_ABIVERSION", - "EI_CLASS", - "EI_DATA", - "EI_NIDENT", - "EI_OSABI", - "EI_PAD", - "EI_VERSION", - "ELFCLASS32", - "ELFCLASS64", - "ELFCLASSNONE", - "ELFDATA2LSB", - "ELFDATA2MSB", - "ELFDATANONE", - "ELFMAG", - "ELFOSABI_86OPEN", - "ELFOSABI_AIX", - "ELFOSABI_ARM", - "ELFOSABI_AROS", - "ELFOSABI_CLOUDABI", - "ELFOSABI_FENIXOS", - "ELFOSABI_FREEBSD", - "ELFOSABI_HPUX", - "ELFOSABI_HURD", - "ELFOSABI_IRIX", - "ELFOSABI_LINUX", - "ELFOSABI_MODESTO", - "ELFOSABI_NETBSD", - "ELFOSABI_NONE", - "ELFOSABI_NSK", - "ELFOSABI_OPENBSD", - "ELFOSABI_OPENVMS", - "ELFOSABI_SOLARIS", - "ELFOSABI_STANDALONE", - "ELFOSABI_TRU64", - "EM_386", - "EM_486", - "EM_56800EX", - "EM_68HC05", - "EM_68HC08", - "EM_68HC11", - "EM_68HC12", - "EM_68HC16", - "EM_68K", - "EM_78KOR", - "EM_8051", - "EM_860", - "EM_88K", - "EM_960", - "EM_AARCH64", - "EM_ALPHA", - "EM_ALPHA_STD", - "EM_ALTERA_NIOS2", - "EM_AMDGPU", - "EM_ARC", - "EM_ARCA", - "EM_ARC_COMPACT", - "EM_ARC_COMPACT2", - "EM_ARM", - "EM_AVR", - "EM_AVR32", - "EM_BA1", - "EM_BA2", - "EM_BLACKFIN", - "EM_BPF", - "EM_C166", - "EM_CDP", - "EM_CE", - "EM_CLOUDSHIELD", - "EM_COGE", - "EM_COLDFIRE", - "EM_COOL", - "EM_COREA_1ST", - "EM_COREA_2ND", - "EM_CR", - "EM_CR16", - "EM_CRAYNV2", - "EM_CRIS", - "EM_CRX", - "EM_CSR_KALIMBA", - "EM_CUDA", - "EM_CYPRESS_M8C", - "EM_D10V", - "EM_D30V", - "EM_DSP24", - "EM_DSPIC30F", - "EM_DXP", - "EM_ECOG1", - "EM_ECOG16", - "EM_ECOG1X", - "EM_ECOG2", - "EM_ETPU", - "EM_EXCESS", - "EM_F2MC16", - "EM_FIREPATH", - "EM_FR20", - "EM_FR30", - "EM_FT32", - "EM_FX66", - "EM_H8S", - "EM_H8_300", - "EM_H8_300H", - "EM_H8_500", - "EM_HUANY", - "EM_IA_64", - "EM_INTEL205", - "EM_INTEL206", - "EM_INTEL207", - "EM_INTEL208", - "EM_INTEL209", - "EM_IP2K", - "EM_JAVELIN", - "EM_K10M", - "EM_KM32", - "EM_KMX16", - "EM_KMX32", - "EM_KMX8", - "EM_KVARC", - "EM_L10M", - "EM_LANAI", - "EM_LATTICEMICO32", - "EM_M16C", - "EM_M32", - "EM_M32C", - "EM_M32R", - "EM_MANIK", - "EM_MAX", - "EM_MAXQ30", - "EM_MCHP_PIC", - "EM_MCST_ELBRUS", - "EM_ME16", - "EM_METAG", - "EM_MICROBLAZE", - "EM_MIPS", - "EM_MIPS_RS3_LE", - "EM_MIPS_RS4_BE", - "EM_MIPS_X", - "EM_MMA", - "EM_MMDSP_PLUS", - "EM_MMIX", - "EM_MN10200", - "EM_MN10300", - "EM_MOXIE", - "EM_MSP430", - "EM_NCPU", - "EM_NDR1", - "EM_NDS32", - "EM_NONE", - "EM_NORC", - "EM_NS32K", - "EM_OPEN8", - "EM_OPENRISC", - "EM_PARISC", - "EM_PCP", - "EM_PDP10", - "EM_PDP11", - "EM_PDSP", - "EM_PJ", - "EM_PPC", - "EM_PPC64", - "EM_PRISM", - "EM_QDSP6", - "EM_R32C", - "EM_RCE", - "EM_RH32", - "EM_RISCV", - "EM_RL78", - "EM_RS08", - "EM_RX", - "EM_S370", - "EM_S390", - "EM_SCORE7", - "EM_SEP", - "EM_SE_C17", - "EM_SE_C33", - "EM_SH", - "EM_SHARC", - "EM_SLE9X", - "EM_SNP1K", - "EM_SPARC", - "EM_SPARC32PLUS", - "EM_SPARCV9", - "EM_ST100", - "EM_ST19", - "EM_ST200", - "EM_ST7", - "EM_ST9PLUS", - "EM_STARCORE", - "EM_STM8", - "EM_STXP7X", - "EM_SVX", - "EM_TILE64", - "EM_TILEGX", - "EM_TILEPRO", - "EM_TINYJ", - "EM_TI_ARP32", - "EM_TI_C2000", - "EM_TI_C5500", - "EM_TI_C6000", - "EM_TI_PRU", - "EM_TMM_GPP", - "EM_TPC", - "EM_TRICORE", - "EM_TRIMEDIA", - "EM_TSK3000", - "EM_UNICORE", - "EM_V800", - "EM_V850", - "EM_VAX", - "EM_VIDEOCORE", - "EM_VIDEOCORE3", - "EM_VIDEOCORE5", - "EM_VISIUM", - "EM_VPP500", - "EM_X86_64", - "EM_XCORE", - "EM_XGATE", - "EM_XIMO16", - "EM_XTENSA", - "EM_Z80", - "EM_ZSP", - "ET_CORE", - "ET_DYN", - "ET_EXEC", - "ET_HIOS", - "ET_HIPROC", - "ET_LOOS", - "ET_LOPROC", - "ET_NONE", - "ET_REL", - "EV_CURRENT", - "EV_NONE", - "ErrNoSymbols", - "File", - "FileHeader", - "FormatError", - "Header32", - "Header64", - "ImportedSymbol", - "Machine", - "NT_FPREGSET", - "NT_PRPSINFO", - "NT_PRSTATUS", - "NType", - "NewFile", - "OSABI", - "Open", - "PF_MASKOS", - "PF_MASKPROC", - "PF_R", - "PF_W", - "PF_X", - "PT_DYNAMIC", - "PT_HIOS", - "PT_HIPROC", - "PT_INTERP", - "PT_LOAD", - "PT_LOOS", - "PT_LOPROC", - "PT_NOTE", - "PT_NULL", - "PT_PHDR", - "PT_SHLIB", - "PT_TLS", - "Prog", - "Prog32", - "Prog64", - "ProgFlag", - "ProgHeader", - "ProgType", - "R_386", - "R_386_16", - "R_386_32", - "R_386_32PLT", - "R_386_8", - "R_386_COPY", - "R_386_GLOB_DAT", - "R_386_GOT32", - "R_386_GOT32X", - "R_386_GOTOFF", - "R_386_GOTPC", - "R_386_IRELATIVE", - "R_386_JMP_SLOT", - "R_386_NONE", - "R_386_PC16", - "R_386_PC32", - "R_386_PC8", - "R_386_PLT32", - "R_386_RELATIVE", - "R_386_SIZE32", - "R_386_TLS_DESC", - "R_386_TLS_DESC_CALL", - "R_386_TLS_DTPMOD32", - "R_386_TLS_DTPOFF32", - "R_386_TLS_GD", - "R_386_TLS_GD_32", - "R_386_TLS_GD_CALL", - "R_386_TLS_GD_POP", - "R_386_TLS_GD_PUSH", - "R_386_TLS_GOTDESC", - "R_386_TLS_GOTIE", - "R_386_TLS_IE", - "R_386_TLS_IE_32", - "R_386_TLS_LDM", - "R_386_TLS_LDM_32", - "R_386_TLS_LDM_CALL", - "R_386_TLS_LDM_POP", - "R_386_TLS_LDM_PUSH", - "R_386_TLS_LDO_32", - "R_386_TLS_LE", - "R_386_TLS_LE_32", - "R_386_TLS_TPOFF", - "R_386_TLS_TPOFF32", - "R_390", - "R_390_12", - "R_390_16", - "R_390_20", - "R_390_32", - "R_390_64", - "R_390_8", - "R_390_COPY", - "R_390_GLOB_DAT", - "R_390_GOT12", - "R_390_GOT16", - "R_390_GOT20", - "R_390_GOT32", - "R_390_GOT64", - "R_390_GOTENT", - "R_390_GOTOFF", - "R_390_GOTOFF16", - "R_390_GOTOFF64", - "R_390_GOTPC", - "R_390_GOTPCDBL", - "R_390_GOTPLT12", - "R_390_GOTPLT16", - "R_390_GOTPLT20", - "R_390_GOTPLT32", - "R_390_GOTPLT64", - "R_390_GOTPLTENT", - "R_390_GOTPLTOFF16", - "R_390_GOTPLTOFF32", - "R_390_GOTPLTOFF64", - "R_390_JMP_SLOT", - "R_390_NONE", - "R_390_PC16", - "R_390_PC16DBL", - "R_390_PC32", - "R_390_PC32DBL", - "R_390_PC64", - "R_390_PLT16DBL", - "R_390_PLT32", - "R_390_PLT32DBL", - "R_390_PLT64", - "R_390_RELATIVE", - "R_390_TLS_DTPMOD", - "R_390_TLS_DTPOFF", - "R_390_TLS_GD32", - "R_390_TLS_GD64", - "R_390_TLS_GDCALL", - "R_390_TLS_GOTIE12", - "R_390_TLS_GOTIE20", - "R_390_TLS_GOTIE32", - "R_390_TLS_GOTIE64", - "R_390_TLS_IE32", - "R_390_TLS_IE64", - "R_390_TLS_IEENT", - "R_390_TLS_LDCALL", - "R_390_TLS_LDM32", - "R_390_TLS_LDM64", - "R_390_TLS_LDO32", - "R_390_TLS_LDO64", - "R_390_TLS_LE32", - "R_390_TLS_LE64", - "R_390_TLS_LOAD", - "R_390_TLS_TPOFF", - "R_AARCH64", - "R_AARCH64_ABS16", - "R_AARCH64_ABS32", - "R_AARCH64_ABS64", - "R_AARCH64_ADD_ABS_LO12_NC", - "R_AARCH64_ADR_GOT_PAGE", - "R_AARCH64_ADR_PREL_LO21", - "R_AARCH64_ADR_PREL_PG_HI21", - "R_AARCH64_ADR_PREL_PG_HI21_NC", - "R_AARCH64_CALL26", - "R_AARCH64_CONDBR19", - "R_AARCH64_COPY", - "R_AARCH64_GLOB_DAT", - "R_AARCH64_GOT_LD_PREL19", - "R_AARCH64_IRELATIVE", - "R_AARCH64_JUMP26", - "R_AARCH64_JUMP_SLOT", - "R_AARCH64_LD64_GOTOFF_LO15", - "R_AARCH64_LD64_GOTPAGE_LO15", - "R_AARCH64_LD64_GOT_LO12_NC", - "R_AARCH64_LDST128_ABS_LO12_NC", - "R_AARCH64_LDST16_ABS_LO12_NC", - "R_AARCH64_LDST32_ABS_LO12_NC", - "R_AARCH64_LDST64_ABS_LO12_NC", - "R_AARCH64_LDST8_ABS_LO12_NC", - "R_AARCH64_LD_PREL_LO19", - "R_AARCH64_MOVW_SABS_G0", - "R_AARCH64_MOVW_SABS_G1", - "R_AARCH64_MOVW_SABS_G2", - "R_AARCH64_MOVW_UABS_G0", - "R_AARCH64_MOVW_UABS_G0_NC", - "R_AARCH64_MOVW_UABS_G1", - "R_AARCH64_MOVW_UABS_G1_NC", - "R_AARCH64_MOVW_UABS_G2", - "R_AARCH64_MOVW_UABS_G2_NC", - "R_AARCH64_MOVW_UABS_G3", - "R_AARCH64_NONE", - "R_AARCH64_NULL", - "R_AARCH64_P32_ABS16", - "R_AARCH64_P32_ABS32", - "R_AARCH64_P32_ADD_ABS_LO12_NC", - "R_AARCH64_P32_ADR_GOT_PAGE", - "R_AARCH64_P32_ADR_PREL_LO21", - "R_AARCH64_P32_ADR_PREL_PG_HI21", - "R_AARCH64_P32_CALL26", - "R_AARCH64_P32_CONDBR19", - "R_AARCH64_P32_COPY", - "R_AARCH64_P32_GLOB_DAT", - "R_AARCH64_P32_GOT_LD_PREL19", - "R_AARCH64_P32_IRELATIVE", - "R_AARCH64_P32_JUMP26", - "R_AARCH64_P32_JUMP_SLOT", - "R_AARCH64_P32_LD32_GOT_LO12_NC", - "R_AARCH64_P32_LDST128_ABS_LO12_NC", - "R_AARCH64_P32_LDST16_ABS_LO12_NC", - "R_AARCH64_P32_LDST32_ABS_LO12_NC", - "R_AARCH64_P32_LDST64_ABS_LO12_NC", - "R_AARCH64_P32_LDST8_ABS_LO12_NC", - "R_AARCH64_P32_LD_PREL_LO19", - "R_AARCH64_P32_MOVW_SABS_G0", - "R_AARCH64_P32_MOVW_UABS_G0", - "R_AARCH64_P32_MOVW_UABS_G0_NC", - "R_AARCH64_P32_MOVW_UABS_G1", - "R_AARCH64_P32_PREL16", - "R_AARCH64_P32_PREL32", - "R_AARCH64_P32_RELATIVE", - "R_AARCH64_P32_TLSDESC", - "R_AARCH64_P32_TLSDESC_ADD_LO12_NC", - "R_AARCH64_P32_TLSDESC_ADR_PAGE21", - "R_AARCH64_P32_TLSDESC_ADR_PREL21", - "R_AARCH64_P32_TLSDESC_CALL", - "R_AARCH64_P32_TLSDESC_LD32_LO12_NC", - "R_AARCH64_P32_TLSDESC_LD_PREL19", - "R_AARCH64_P32_TLSGD_ADD_LO12_NC", - "R_AARCH64_P32_TLSGD_ADR_PAGE21", - "R_AARCH64_P32_TLSIE_ADR_GOTTPREL_PAGE21", - "R_AARCH64_P32_TLSIE_LD32_GOTTPREL_LO12_NC", - "R_AARCH64_P32_TLSIE_LD_GOTTPREL_PREL19", - "R_AARCH64_P32_TLSLE_ADD_TPREL_HI12", - "R_AARCH64_P32_TLSLE_ADD_TPREL_LO12", - "R_AARCH64_P32_TLSLE_ADD_TPREL_LO12_NC", - "R_AARCH64_P32_TLSLE_MOVW_TPREL_G0", - "R_AARCH64_P32_TLSLE_MOVW_TPREL_G0_NC", - "R_AARCH64_P32_TLSLE_MOVW_TPREL_G1", - "R_AARCH64_P32_TLS_DTPMOD", - "R_AARCH64_P32_TLS_DTPREL", - "R_AARCH64_P32_TLS_TPREL", - "R_AARCH64_P32_TSTBR14", - "R_AARCH64_PREL16", - "R_AARCH64_PREL32", - "R_AARCH64_PREL64", - "R_AARCH64_RELATIVE", - "R_AARCH64_TLSDESC", - "R_AARCH64_TLSDESC_ADD", - "R_AARCH64_TLSDESC_ADD_LO12_NC", - "R_AARCH64_TLSDESC_ADR_PAGE21", - "R_AARCH64_TLSDESC_ADR_PREL21", - "R_AARCH64_TLSDESC_CALL", - "R_AARCH64_TLSDESC_LD64_LO12_NC", - "R_AARCH64_TLSDESC_LDR", - "R_AARCH64_TLSDESC_LD_PREL19", - "R_AARCH64_TLSDESC_OFF_G0_NC", - "R_AARCH64_TLSDESC_OFF_G1", - "R_AARCH64_TLSGD_ADD_LO12_NC", - "R_AARCH64_TLSGD_ADR_PAGE21", - "R_AARCH64_TLSGD_ADR_PREL21", - "R_AARCH64_TLSGD_MOVW_G0_NC", - "R_AARCH64_TLSGD_MOVW_G1", - "R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21", - "R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC", - "R_AARCH64_TLSIE_LD_GOTTPREL_PREL19", - "R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC", - "R_AARCH64_TLSIE_MOVW_GOTTPREL_G1", - "R_AARCH64_TLSLD_ADR_PAGE21", - "R_AARCH64_TLSLD_ADR_PREL21", - "R_AARCH64_TLSLD_LDST128_DTPREL_LO12", - "R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC", - "R_AARCH64_TLSLE_ADD_TPREL_HI12", - "R_AARCH64_TLSLE_ADD_TPREL_LO12", - "R_AARCH64_TLSLE_ADD_TPREL_LO12_NC", - "R_AARCH64_TLSLE_LDST128_TPREL_LO12", - "R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC", - "R_AARCH64_TLSLE_MOVW_TPREL_G0", - "R_AARCH64_TLSLE_MOVW_TPREL_G0_NC", - "R_AARCH64_TLSLE_MOVW_TPREL_G1", - "R_AARCH64_TLSLE_MOVW_TPREL_G1_NC", - "R_AARCH64_TLSLE_MOVW_TPREL_G2", - "R_AARCH64_TLS_DTPMOD64", - "R_AARCH64_TLS_DTPREL64", - "R_AARCH64_TLS_TPREL64", - "R_AARCH64_TSTBR14", - "R_ALPHA", - "R_ALPHA_BRADDR", - "R_ALPHA_COPY", - "R_ALPHA_GLOB_DAT", - "R_ALPHA_GPDISP", - "R_ALPHA_GPREL32", - "R_ALPHA_GPRELHIGH", - "R_ALPHA_GPRELLOW", - "R_ALPHA_GPVALUE", - "R_ALPHA_HINT", - "R_ALPHA_IMMED_BR_HI32", - "R_ALPHA_IMMED_GP_16", - "R_ALPHA_IMMED_GP_HI32", - "R_ALPHA_IMMED_LO32", - "R_ALPHA_IMMED_SCN_HI32", - "R_ALPHA_JMP_SLOT", - "R_ALPHA_LITERAL", - "R_ALPHA_LITUSE", - "R_ALPHA_NONE", - "R_ALPHA_OP_PRSHIFT", - "R_ALPHA_OP_PSUB", - "R_ALPHA_OP_PUSH", - "R_ALPHA_OP_STORE", - "R_ALPHA_REFLONG", - "R_ALPHA_REFQUAD", - "R_ALPHA_RELATIVE", - "R_ALPHA_SREL16", - "R_ALPHA_SREL32", - "R_ALPHA_SREL64", - "R_ARM", - "R_ARM_ABS12", - "R_ARM_ABS16", - "R_ARM_ABS32", - "R_ARM_ABS32_NOI", - "R_ARM_ABS8", - "R_ARM_ALU_PCREL_15_8", - "R_ARM_ALU_PCREL_23_15", - "R_ARM_ALU_PCREL_7_0", - "R_ARM_ALU_PC_G0", - "R_ARM_ALU_PC_G0_NC", - "R_ARM_ALU_PC_G1", - "R_ARM_ALU_PC_G1_NC", - "R_ARM_ALU_PC_G2", - "R_ARM_ALU_SBREL_19_12_NC", - "R_ARM_ALU_SBREL_27_20_CK", - "R_ARM_ALU_SB_G0", - "R_ARM_ALU_SB_G0_NC", - "R_ARM_ALU_SB_G1", - "R_ARM_ALU_SB_G1_NC", - "R_ARM_ALU_SB_G2", - "R_ARM_AMP_VCALL9", - "R_ARM_BASE_ABS", - "R_ARM_CALL", - "R_ARM_COPY", - "R_ARM_GLOB_DAT", - "R_ARM_GNU_VTENTRY", - "R_ARM_GNU_VTINHERIT", - "R_ARM_GOT32", - "R_ARM_GOTOFF", - "R_ARM_GOTOFF12", - "R_ARM_GOTPC", - "R_ARM_GOTRELAX", - "R_ARM_GOT_ABS", - "R_ARM_GOT_BREL12", - "R_ARM_GOT_PREL", - "R_ARM_IRELATIVE", - "R_ARM_JUMP24", - "R_ARM_JUMP_SLOT", - "R_ARM_LDC_PC_G0", - "R_ARM_LDC_PC_G1", - "R_ARM_LDC_PC_G2", - "R_ARM_LDC_SB_G0", - "R_ARM_LDC_SB_G1", - "R_ARM_LDC_SB_G2", - "R_ARM_LDRS_PC_G0", - "R_ARM_LDRS_PC_G1", - "R_ARM_LDRS_PC_G2", - "R_ARM_LDRS_SB_G0", - "R_ARM_LDRS_SB_G1", - "R_ARM_LDRS_SB_G2", - "R_ARM_LDR_PC_G1", - "R_ARM_LDR_PC_G2", - "R_ARM_LDR_SBREL_11_10_NC", - "R_ARM_LDR_SB_G0", - "R_ARM_LDR_SB_G1", - "R_ARM_LDR_SB_G2", - "R_ARM_ME_TOO", - "R_ARM_MOVT_ABS", - "R_ARM_MOVT_BREL", - "R_ARM_MOVT_PREL", - "R_ARM_MOVW_ABS_NC", - "R_ARM_MOVW_BREL", - "R_ARM_MOVW_BREL_NC", - "R_ARM_MOVW_PREL_NC", - "R_ARM_NONE", - "R_ARM_PC13", - "R_ARM_PC24", - "R_ARM_PLT32", - "R_ARM_PLT32_ABS", - "R_ARM_PREL31", - "R_ARM_PRIVATE_0", - "R_ARM_PRIVATE_1", - "R_ARM_PRIVATE_10", - "R_ARM_PRIVATE_11", - "R_ARM_PRIVATE_12", - "R_ARM_PRIVATE_13", - "R_ARM_PRIVATE_14", - "R_ARM_PRIVATE_15", - "R_ARM_PRIVATE_2", - "R_ARM_PRIVATE_3", - "R_ARM_PRIVATE_4", - "R_ARM_PRIVATE_5", - "R_ARM_PRIVATE_6", - "R_ARM_PRIVATE_7", - "R_ARM_PRIVATE_8", - "R_ARM_PRIVATE_9", - "R_ARM_RABS32", - "R_ARM_RBASE", - "R_ARM_REL32", - "R_ARM_REL32_NOI", - "R_ARM_RELATIVE", - "R_ARM_RPC24", - "R_ARM_RREL32", - "R_ARM_RSBREL32", - "R_ARM_RXPC25", - "R_ARM_SBREL31", - "R_ARM_SBREL32", - "R_ARM_SWI24", - "R_ARM_TARGET1", - "R_ARM_TARGET2", - "R_ARM_THM_ABS5", - "R_ARM_THM_ALU_ABS_G0_NC", - "R_ARM_THM_ALU_ABS_G1_NC", - "R_ARM_THM_ALU_ABS_G2_NC", - "R_ARM_THM_ALU_ABS_G3", - "R_ARM_THM_ALU_PREL_11_0", - "R_ARM_THM_GOT_BREL12", - "R_ARM_THM_JUMP11", - "R_ARM_THM_JUMP19", - "R_ARM_THM_JUMP24", - "R_ARM_THM_JUMP6", - "R_ARM_THM_JUMP8", - "R_ARM_THM_MOVT_ABS", - "R_ARM_THM_MOVT_BREL", - "R_ARM_THM_MOVT_PREL", - "R_ARM_THM_MOVW_ABS_NC", - "R_ARM_THM_MOVW_BREL", - "R_ARM_THM_MOVW_BREL_NC", - "R_ARM_THM_MOVW_PREL_NC", - "R_ARM_THM_PC12", - "R_ARM_THM_PC22", - "R_ARM_THM_PC8", - "R_ARM_THM_RPC22", - "R_ARM_THM_SWI8", - "R_ARM_THM_TLS_CALL", - "R_ARM_THM_TLS_DESCSEQ16", - "R_ARM_THM_TLS_DESCSEQ32", - "R_ARM_THM_XPC22", - "R_ARM_TLS_CALL", - "R_ARM_TLS_DESCSEQ", - "R_ARM_TLS_DTPMOD32", - "R_ARM_TLS_DTPOFF32", - "R_ARM_TLS_GD32", - "R_ARM_TLS_GOTDESC", - "R_ARM_TLS_IE12GP", - "R_ARM_TLS_IE32", - "R_ARM_TLS_LDM32", - "R_ARM_TLS_LDO12", - "R_ARM_TLS_LDO32", - "R_ARM_TLS_LE12", - "R_ARM_TLS_LE32", - "R_ARM_TLS_TPOFF32", - "R_ARM_V4BX", - "R_ARM_XPC25", - "R_INFO", - "R_INFO32", - "R_MIPS", - "R_MIPS_16", - "R_MIPS_26", - "R_MIPS_32", - "R_MIPS_64", - "R_MIPS_ADD_IMMEDIATE", - "R_MIPS_CALL16", - "R_MIPS_CALL_HI16", - "R_MIPS_CALL_LO16", - "R_MIPS_DELETE", - "R_MIPS_GOT16", - "R_MIPS_GOT_DISP", - "R_MIPS_GOT_HI16", - "R_MIPS_GOT_LO16", - "R_MIPS_GOT_OFST", - "R_MIPS_GOT_PAGE", - "R_MIPS_GPREL16", - "R_MIPS_GPREL32", - "R_MIPS_HI16", - "R_MIPS_HIGHER", - "R_MIPS_HIGHEST", - "R_MIPS_INSERT_A", - "R_MIPS_INSERT_B", - "R_MIPS_JALR", - "R_MIPS_LITERAL", - "R_MIPS_LO16", - "R_MIPS_NONE", - "R_MIPS_PC16", - "R_MIPS_PJUMP", - "R_MIPS_REL16", - "R_MIPS_REL32", - "R_MIPS_RELGOT", - "R_MIPS_SCN_DISP", - "R_MIPS_SHIFT5", - "R_MIPS_SHIFT6", - "R_MIPS_SUB", - "R_MIPS_TLS_DTPMOD32", - "R_MIPS_TLS_DTPMOD64", - "R_MIPS_TLS_DTPREL32", - "R_MIPS_TLS_DTPREL64", - "R_MIPS_TLS_DTPREL_HI16", - "R_MIPS_TLS_DTPREL_LO16", - "R_MIPS_TLS_GD", - "R_MIPS_TLS_GOTTPREL", - "R_MIPS_TLS_LDM", - "R_MIPS_TLS_TPREL32", - "R_MIPS_TLS_TPREL64", - "R_MIPS_TLS_TPREL_HI16", - "R_MIPS_TLS_TPREL_LO16", - "R_PPC", - "R_PPC64", - "R_PPC64_ADDR14", - "R_PPC64_ADDR14_BRNTAKEN", - "R_PPC64_ADDR14_BRTAKEN", - "R_PPC64_ADDR16", - "R_PPC64_ADDR16_DS", - "R_PPC64_ADDR16_HA", - "R_PPC64_ADDR16_HI", - "R_PPC64_ADDR16_HIGH", - "R_PPC64_ADDR16_HIGHA", - "R_PPC64_ADDR16_HIGHER", - "R_PPC64_ADDR16_HIGHERA", - "R_PPC64_ADDR16_HIGHEST", - "R_PPC64_ADDR16_HIGHESTA", - "R_PPC64_ADDR16_LO", - "R_PPC64_ADDR16_LO_DS", - "R_PPC64_ADDR24", - "R_PPC64_ADDR32", - "R_PPC64_ADDR64", - "R_PPC64_ADDR64_LOCAL", - "R_PPC64_DTPMOD64", - "R_PPC64_DTPREL16", - "R_PPC64_DTPREL16_DS", - "R_PPC64_DTPREL16_HA", - "R_PPC64_DTPREL16_HI", - "R_PPC64_DTPREL16_HIGH", - "R_PPC64_DTPREL16_HIGHA", - "R_PPC64_DTPREL16_HIGHER", - "R_PPC64_DTPREL16_HIGHERA", - "R_PPC64_DTPREL16_HIGHEST", - "R_PPC64_DTPREL16_HIGHESTA", - "R_PPC64_DTPREL16_LO", - "R_PPC64_DTPREL16_LO_DS", - "R_PPC64_DTPREL64", - "R_PPC64_ENTRY", - "R_PPC64_GOT16", - "R_PPC64_GOT16_DS", - "R_PPC64_GOT16_HA", - "R_PPC64_GOT16_HI", - "R_PPC64_GOT16_LO", - "R_PPC64_GOT16_LO_DS", - "R_PPC64_GOT_DTPREL16_DS", - "R_PPC64_GOT_DTPREL16_HA", - "R_PPC64_GOT_DTPREL16_HI", - "R_PPC64_GOT_DTPREL16_LO_DS", - "R_PPC64_GOT_TLSGD16", - "R_PPC64_GOT_TLSGD16_HA", - "R_PPC64_GOT_TLSGD16_HI", - "R_PPC64_GOT_TLSGD16_LO", - "R_PPC64_GOT_TLSLD16", - "R_PPC64_GOT_TLSLD16_HA", - "R_PPC64_GOT_TLSLD16_HI", - "R_PPC64_GOT_TLSLD16_LO", - "R_PPC64_GOT_TPREL16_DS", - "R_PPC64_GOT_TPREL16_HA", - "R_PPC64_GOT_TPREL16_HI", - "R_PPC64_GOT_TPREL16_LO_DS", - "R_PPC64_IRELATIVE", - "R_PPC64_JMP_IREL", - "R_PPC64_JMP_SLOT", - "R_PPC64_NONE", - "R_PPC64_PLT16_LO_DS", - "R_PPC64_PLTGOT16", - "R_PPC64_PLTGOT16_DS", - "R_PPC64_PLTGOT16_HA", - "R_PPC64_PLTGOT16_HI", - "R_PPC64_PLTGOT16_LO", - "R_PPC64_PLTGOT_LO_DS", - "R_PPC64_REL14", - "R_PPC64_REL14_BRNTAKEN", - "R_PPC64_REL14_BRTAKEN", - "R_PPC64_REL16", - "R_PPC64_REL16DX_HA", - "R_PPC64_REL16_HA", - "R_PPC64_REL16_HI", - "R_PPC64_REL16_LO", - "R_PPC64_REL24", - "R_PPC64_REL24_NOTOC", - "R_PPC64_REL32", - "R_PPC64_REL64", - "R_PPC64_SECTOFF_DS", - "R_PPC64_SECTOFF_LO_DS", - "R_PPC64_TLS", - "R_PPC64_TLSGD", - "R_PPC64_TLSLD", - "R_PPC64_TOC", - "R_PPC64_TOC16", - "R_PPC64_TOC16_DS", - "R_PPC64_TOC16_HA", - "R_PPC64_TOC16_HI", - "R_PPC64_TOC16_LO", - "R_PPC64_TOC16_LO_DS", - "R_PPC64_TOCSAVE", - "R_PPC64_TPREL16", - "R_PPC64_TPREL16_DS", - "R_PPC64_TPREL16_HA", - "R_PPC64_TPREL16_HI", - "R_PPC64_TPREL16_HIGH", - "R_PPC64_TPREL16_HIGHA", - "R_PPC64_TPREL16_HIGHER", - "R_PPC64_TPREL16_HIGHERA", - "R_PPC64_TPREL16_HIGHEST", - "R_PPC64_TPREL16_HIGHESTA", - "R_PPC64_TPREL16_LO", - "R_PPC64_TPREL16_LO_DS", - "R_PPC64_TPREL64", - "R_PPC_ADDR14", - "R_PPC_ADDR14_BRNTAKEN", - "R_PPC_ADDR14_BRTAKEN", - "R_PPC_ADDR16", - "R_PPC_ADDR16_HA", - "R_PPC_ADDR16_HI", - "R_PPC_ADDR16_LO", - "R_PPC_ADDR24", - "R_PPC_ADDR32", - "R_PPC_COPY", - "R_PPC_DTPMOD32", - "R_PPC_DTPREL16", - "R_PPC_DTPREL16_HA", - "R_PPC_DTPREL16_HI", - "R_PPC_DTPREL16_LO", - "R_PPC_DTPREL32", - "R_PPC_EMB_BIT_FLD", - "R_PPC_EMB_MRKREF", - "R_PPC_EMB_NADDR16", - "R_PPC_EMB_NADDR16_HA", - "R_PPC_EMB_NADDR16_HI", - "R_PPC_EMB_NADDR16_LO", - "R_PPC_EMB_NADDR32", - "R_PPC_EMB_RELSDA", - "R_PPC_EMB_RELSEC16", - "R_PPC_EMB_RELST_HA", - "R_PPC_EMB_RELST_HI", - "R_PPC_EMB_RELST_LO", - "R_PPC_EMB_SDA21", - "R_PPC_EMB_SDA2I16", - "R_PPC_EMB_SDA2REL", - "R_PPC_EMB_SDAI16", - "R_PPC_GLOB_DAT", - "R_PPC_GOT16", - "R_PPC_GOT16_HA", - "R_PPC_GOT16_HI", - "R_PPC_GOT16_LO", - "R_PPC_GOT_TLSGD16", - "R_PPC_GOT_TLSGD16_HA", - "R_PPC_GOT_TLSGD16_HI", - "R_PPC_GOT_TLSGD16_LO", - "R_PPC_GOT_TLSLD16", - "R_PPC_GOT_TLSLD16_HA", - "R_PPC_GOT_TLSLD16_HI", - "R_PPC_GOT_TLSLD16_LO", - "R_PPC_GOT_TPREL16", - "R_PPC_GOT_TPREL16_HA", - "R_PPC_GOT_TPREL16_HI", - "R_PPC_GOT_TPREL16_LO", - "R_PPC_JMP_SLOT", - "R_PPC_LOCAL24PC", - "R_PPC_NONE", - "R_PPC_PLT16_HA", - "R_PPC_PLT16_HI", - "R_PPC_PLT16_LO", - "R_PPC_PLT32", - "R_PPC_PLTREL24", - "R_PPC_PLTREL32", - "R_PPC_REL14", - "R_PPC_REL14_BRNTAKEN", - "R_PPC_REL14_BRTAKEN", - "R_PPC_REL24", - "R_PPC_REL32", - "R_PPC_RELATIVE", - "R_PPC_SDAREL16", - "R_PPC_SECTOFF", - "R_PPC_SECTOFF_HA", - "R_PPC_SECTOFF_HI", - "R_PPC_SECTOFF_LO", - "R_PPC_TLS", - "R_PPC_TPREL16", - "R_PPC_TPREL16_HA", - "R_PPC_TPREL16_HI", - "R_PPC_TPREL16_LO", - "R_PPC_TPREL32", - "R_PPC_UADDR16", - "R_PPC_UADDR32", - "R_RISCV", - "R_RISCV_32", - "R_RISCV_32_PCREL", - "R_RISCV_64", - "R_RISCV_ADD16", - "R_RISCV_ADD32", - "R_RISCV_ADD64", - "R_RISCV_ADD8", - "R_RISCV_ALIGN", - "R_RISCV_BRANCH", - "R_RISCV_CALL", - "R_RISCV_CALL_PLT", - "R_RISCV_COPY", - "R_RISCV_GNU_VTENTRY", - "R_RISCV_GNU_VTINHERIT", - "R_RISCV_GOT_HI20", - "R_RISCV_GPREL_I", - "R_RISCV_GPREL_S", - "R_RISCV_HI20", - "R_RISCV_JAL", - "R_RISCV_JUMP_SLOT", - "R_RISCV_LO12_I", - "R_RISCV_LO12_S", - "R_RISCV_NONE", - "R_RISCV_PCREL_HI20", - "R_RISCV_PCREL_LO12_I", - "R_RISCV_PCREL_LO12_S", - "R_RISCV_RELATIVE", - "R_RISCV_RELAX", - "R_RISCV_RVC_BRANCH", - "R_RISCV_RVC_JUMP", - "R_RISCV_RVC_LUI", - "R_RISCV_SET16", - "R_RISCV_SET32", - "R_RISCV_SET6", - "R_RISCV_SET8", - "R_RISCV_SUB16", - "R_RISCV_SUB32", - "R_RISCV_SUB6", - "R_RISCV_SUB64", - "R_RISCV_SUB8", - "R_RISCV_TLS_DTPMOD32", - "R_RISCV_TLS_DTPMOD64", - "R_RISCV_TLS_DTPREL32", - "R_RISCV_TLS_DTPREL64", - "R_RISCV_TLS_GD_HI20", - "R_RISCV_TLS_GOT_HI20", - "R_RISCV_TLS_TPREL32", - "R_RISCV_TLS_TPREL64", - "R_RISCV_TPREL_ADD", - "R_RISCV_TPREL_HI20", - "R_RISCV_TPREL_I", - "R_RISCV_TPREL_LO12_I", - "R_RISCV_TPREL_LO12_S", - "R_RISCV_TPREL_S", - "R_SPARC", - "R_SPARC_10", - "R_SPARC_11", - "R_SPARC_13", - "R_SPARC_16", - "R_SPARC_22", - "R_SPARC_32", - "R_SPARC_5", - "R_SPARC_6", - "R_SPARC_64", - "R_SPARC_7", - "R_SPARC_8", - "R_SPARC_COPY", - "R_SPARC_DISP16", - "R_SPARC_DISP32", - "R_SPARC_DISP64", - "R_SPARC_DISP8", - "R_SPARC_GLOB_DAT", - "R_SPARC_GLOB_JMP", - "R_SPARC_GOT10", - "R_SPARC_GOT13", - "R_SPARC_GOT22", - "R_SPARC_H44", - "R_SPARC_HH22", - "R_SPARC_HI22", - "R_SPARC_HIPLT22", - "R_SPARC_HIX22", - "R_SPARC_HM10", - "R_SPARC_JMP_SLOT", - "R_SPARC_L44", - "R_SPARC_LM22", - "R_SPARC_LO10", - "R_SPARC_LOPLT10", - "R_SPARC_LOX10", - "R_SPARC_M44", - "R_SPARC_NONE", - "R_SPARC_OLO10", - "R_SPARC_PC10", - "R_SPARC_PC22", - "R_SPARC_PCPLT10", - "R_SPARC_PCPLT22", - "R_SPARC_PCPLT32", - "R_SPARC_PC_HH22", - "R_SPARC_PC_HM10", - "R_SPARC_PC_LM22", - "R_SPARC_PLT32", - "R_SPARC_PLT64", - "R_SPARC_REGISTER", - "R_SPARC_RELATIVE", - "R_SPARC_UA16", - "R_SPARC_UA32", - "R_SPARC_UA64", - "R_SPARC_WDISP16", - "R_SPARC_WDISP19", - "R_SPARC_WDISP22", - "R_SPARC_WDISP30", - "R_SPARC_WPLT30", - "R_SYM32", - "R_SYM64", - "R_TYPE32", - "R_TYPE64", - "R_X86_64", - "R_X86_64_16", - "R_X86_64_32", - "R_X86_64_32S", - "R_X86_64_64", - "R_X86_64_8", - "R_X86_64_COPY", - "R_X86_64_DTPMOD64", - "R_X86_64_DTPOFF32", - "R_X86_64_DTPOFF64", - "R_X86_64_GLOB_DAT", - "R_X86_64_GOT32", - "R_X86_64_GOT64", - "R_X86_64_GOTOFF64", - "R_X86_64_GOTPC32", - "R_X86_64_GOTPC32_TLSDESC", - "R_X86_64_GOTPC64", - "R_X86_64_GOTPCREL", - "R_X86_64_GOTPCREL64", - "R_X86_64_GOTPCRELX", - "R_X86_64_GOTPLT64", - "R_X86_64_GOTTPOFF", - "R_X86_64_IRELATIVE", - "R_X86_64_JMP_SLOT", - "R_X86_64_NONE", - "R_X86_64_PC16", - "R_X86_64_PC32", - "R_X86_64_PC32_BND", - "R_X86_64_PC64", - "R_X86_64_PC8", - "R_X86_64_PLT32", - "R_X86_64_PLT32_BND", - "R_X86_64_PLTOFF64", - "R_X86_64_RELATIVE", - "R_X86_64_RELATIVE64", - "R_X86_64_REX_GOTPCRELX", - "R_X86_64_SIZE32", - "R_X86_64_SIZE64", - "R_X86_64_TLSDESC", - "R_X86_64_TLSDESC_CALL", - "R_X86_64_TLSGD", - "R_X86_64_TLSLD", - "R_X86_64_TPOFF32", - "R_X86_64_TPOFF64", - "Rel32", - "Rel64", - "Rela32", - "Rela64", - "SHF_ALLOC", - "SHF_COMPRESSED", - "SHF_EXECINSTR", - "SHF_GROUP", - "SHF_INFO_LINK", - "SHF_LINK_ORDER", - "SHF_MASKOS", - "SHF_MASKPROC", - "SHF_MERGE", - "SHF_OS_NONCONFORMING", - "SHF_STRINGS", - "SHF_TLS", - "SHF_WRITE", - "SHN_ABS", - "SHN_COMMON", - "SHN_HIOS", - "SHN_HIPROC", - "SHN_HIRESERVE", - "SHN_LOOS", - "SHN_LOPROC", - "SHN_LORESERVE", - "SHN_UNDEF", - "SHN_XINDEX", - "SHT_DYNAMIC", - "SHT_DYNSYM", - "SHT_FINI_ARRAY", - "SHT_GNU_ATTRIBUTES", - "SHT_GNU_HASH", - "SHT_GNU_LIBLIST", - "SHT_GNU_VERDEF", - "SHT_GNU_VERNEED", - "SHT_GNU_VERSYM", - "SHT_GROUP", - "SHT_HASH", - "SHT_HIOS", - "SHT_HIPROC", - "SHT_HIUSER", - "SHT_INIT_ARRAY", - "SHT_LOOS", - "SHT_LOPROC", - "SHT_LOUSER", - "SHT_NOBITS", - "SHT_NOTE", - "SHT_NULL", - "SHT_PREINIT_ARRAY", - "SHT_PROGBITS", - "SHT_REL", - "SHT_RELA", - "SHT_SHLIB", - "SHT_STRTAB", - "SHT_SYMTAB", - "SHT_SYMTAB_SHNDX", - "STB_GLOBAL", - "STB_HIOS", - "STB_HIPROC", - "STB_LOCAL", - "STB_LOOS", - "STB_LOPROC", - "STB_WEAK", - "STT_COMMON", - "STT_FILE", - "STT_FUNC", - "STT_HIOS", - "STT_HIPROC", - "STT_LOOS", - "STT_LOPROC", - "STT_NOTYPE", - "STT_OBJECT", - "STT_SECTION", - "STT_TLS", - "STV_DEFAULT", - "STV_HIDDEN", - "STV_INTERNAL", - "STV_PROTECTED", - "ST_BIND", - "ST_INFO", - "ST_TYPE", - "ST_VISIBILITY", - "Section", - "Section32", - "Section64", - "SectionFlag", - "SectionHeader", - "SectionIndex", - "SectionType", - "Sym32", - "Sym32Size", - "Sym64", - "Sym64Size", - "SymBind", - "SymType", - "SymVis", - "Symbol", - "Type", - "Version", - }, - "debug/gosym": []string{ - "DecodingError", - "Func", - "LineTable", - "NewLineTable", - "NewTable", - "Obj", - "Sym", - "Table", - "UnknownFileError", - "UnknownLineError", - }, - "debug/macho": []string{ - "ARM64_RELOC_ADDEND", - "ARM64_RELOC_BRANCH26", - "ARM64_RELOC_GOT_LOAD_PAGE21", - "ARM64_RELOC_GOT_LOAD_PAGEOFF12", - "ARM64_RELOC_PAGE21", - "ARM64_RELOC_PAGEOFF12", - "ARM64_RELOC_POINTER_TO_GOT", - "ARM64_RELOC_SUBTRACTOR", - "ARM64_RELOC_TLVP_LOAD_PAGE21", - "ARM64_RELOC_TLVP_LOAD_PAGEOFF12", - "ARM64_RELOC_UNSIGNED", - "ARM_RELOC_BR24", - "ARM_RELOC_HALF", - "ARM_RELOC_HALF_SECTDIFF", - "ARM_RELOC_LOCAL_SECTDIFF", - "ARM_RELOC_PAIR", - "ARM_RELOC_PB_LA_PTR", - "ARM_RELOC_SECTDIFF", - "ARM_RELOC_VANILLA", - "ARM_THUMB_32BIT_BRANCH", - "ARM_THUMB_RELOC_BR22", - "Cpu", - "Cpu386", - "CpuAmd64", - "CpuArm", - "CpuArm64", - "CpuPpc", - "CpuPpc64", - "Dylib", - "DylibCmd", - "Dysymtab", - "DysymtabCmd", - "ErrNotFat", - "FatArch", - "FatArchHeader", - "FatFile", - "File", - "FileHeader", - "FlagAllModsBound", - "FlagAllowStackExecution", - "FlagAppExtensionSafe", - "FlagBindAtLoad", - "FlagBindsToWeak", - "FlagCanonical", - "FlagDeadStrippableDylib", - "FlagDyldLink", - "FlagForceFlat", - "FlagHasTLVDescriptors", - "FlagIncrLink", - "FlagLazyInit", - "FlagNoFixPrebinding", - "FlagNoHeapExecution", - "FlagNoMultiDefs", - "FlagNoReexportedDylibs", - "FlagNoUndefs", - "FlagPIE", - "FlagPrebindable", - "FlagPrebound", - "FlagRootSafe", - "FlagSetuidSafe", - "FlagSplitSegs", - "FlagSubsectionsViaSymbols", - "FlagTwoLevel", - "FlagWeakDefines", - "FormatError", - "GENERIC_RELOC_LOCAL_SECTDIFF", - "GENERIC_RELOC_PAIR", - "GENERIC_RELOC_PB_LA_PTR", - "GENERIC_RELOC_SECTDIFF", - "GENERIC_RELOC_TLV", - "GENERIC_RELOC_VANILLA", - "Load", - "LoadBytes", - "LoadCmd", - "LoadCmdDylib", - "LoadCmdDylinker", - "LoadCmdDysymtab", - "LoadCmdRpath", - "LoadCmdSegment", - "LoadCmdSegment64", - "LoadCmdSymtab", - "LoadCmdThread", - "LoadCmdUnixThread", - "Magic32", - "Magic64", - "MagicFat", - "NewFatFile", - "NewFile", - "Nlist32", - "Nlist64", - "Open", - "OpenFat", - "Regs386", - "RegsAMD64", - "Reloc", - "RelocTypeARM", - "RelocTypeARM64", - "RelocTypeGeneric", - "RelocTypeX86_64", - "Rpath", - "RpathCmd", - "Section", - "Section32", - "Section64", - "SectionHeader", - "Segment", - "Segment32", - "Segment64", - "SegmentHeader", - "Symbol", - "Symtab", - "SymtabCmd", - "Thread", - "Type", - "TypeBundle", - "TypeDylib", - "TypeExec", - "TypeObj", - "X86_64_RELOC_BRANCH", - "X86_64_RELOC_GOT", - "X86_64_RELOC_GOT_LOAD", - "X86_64_RELOC_SIGNED", - "X86_64_RELOC_SIGNED_1", - "X86_64_RELOC_SIGNED_2", - "X86_64_RELOC_SIGNED_4", - "X86_64_RELOC_SUBTRACTOR", - "X86_64_RELOC_TLV", - "X86_64_RELOC_UNSIGNED", - }, - "debug/pe": []string{ - "COFFSymbol", - "COFFSymbolSize", - "DataDirectory", - "File", - "FileHeader", - "FormatError", - "IMAGE_DIRECTORY_ENTRY_ARCHITECTURE", - "IMAGE_DIRECTORY_ENTRY_BASERELOC", - "IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT", - "IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR", - "IMAGE_DIRECTORY_ENTRY_DEBUG", - "IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT", - "IMAGE_DIRECTORY_ENTRY_EXCEPTION", - "IMAGE_DIRECTORY_ENTRY_EXPORT", - "IMAGE_DIRECTORY_ENTRY_GLOBALPTR", - "IMAGE_DIRECTORY_ENTRY_IAT", - "IMAGE_DIRECTORY_ENTRY_IMPORT", - "IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG", - "IMAGE_DIRECTORY_ENTRY_RESOURCE", - "IMAGE_DIRECTORY_ENTRY_SECURITY", - "IMAGE_DIRECTORY_ENTRY_TLS", - "IMAGE_FILE_MACHINE_AM33", - "IMAGE_FILE_MACHINE_AMD64", - "IMAGE_FILE_MACHINE_ARM", - "IMAGE_FILE_MACHINE_ARM64", - "IMAGE_FILE_MACHINE_ARMNT", - "IMAGE_FILE_MACHINE_EBC", - "IMAGE_FILE_MACHINE_I386", - "IMAGE_FILE_MACHINE_IA64", - "IMAGE_FILE_MACHINE_M32R", - "IMAGE_FILE_MACHINE_MIPS16", - "IMAGE_FILE_MACHINE_MIPSFPU", - "IMAGE_FILE_MACHINE_MIPSFPU16", - "IMAGE_FILE_MACHINE_POWERPC", - "IMAGE_FILE_MACHINE_POWERPCFP", - "IMAGE_FILE_MACHINE_R4000", - "IMAGE_FILE_MACHINE_SH3", - "IMAGE_FILE_MACHINE_SH3DSP", - "IMAGE_FILE_MACHINE_SH4", - "IMAGE_FILE_MACHINE_SH5", - "IMAGE_FILE_MACHINE_THUMB", - "IMAGE_FILE_MACHINE_UNKNOWN", - "IMAGE_FILE_MACHINE_WCEMIPSV2", - "ImportDirectory", - "NewFile", - "Open", - "OptionalHeader32", - "OptionalHeader64", - "Reloc", - "Section", - "SectionHeader", - "SectionHeader32", - "StringTable", - "Symbol", - }, - "debug/plan9obj": []string{ - "File", - "FileHeader", - "Magic386", - "Magic64", - "MagicAMD64", - "MagicARM", - "NewFile", - "Open", - "Section", - "SectionHeader", - "Sym", - }, - "encoding": []string{ - "BinaryMarshaler", - "BinaryUnmarshaler", - "TextMarshaler", - "TextUnmarshaler", - }, - "encoding/ascii85": []string{ - "CorruptInputError", - "Decode", - "Encode", - "MaxEncodedLen", - "NewDecoder", - "NewEncoder", - }, - "encoding/asn1": []string{ - "BitString", - "ClassApplication", - "ClassContextSpecific", - "ClassPrivate", - "ClassUniversal", - "Enumerated", - "Flag", - "Marshal", - "MarshalWithParams", - "NullBytes", - "NullRawValue", - "ObjectIdentifier", - "RawContent", - "RawValue", - "StructuralError", - "SyntaxError", - "TagBitString", - "TagBoolean", - "TagEnum", - "TagGeneralString", - "TagGeneralizedTime", - "TagIA5String", - "TagInteger", - "TagNull", - "TagNumericString", - "TagOID", - "TagOctetString", - "TagPrintableString", - "TagSequence", - "TagSet", - "TagT61String", - "TagUTCTime", - "TagUTF8String", - "Unmarshal", - "UnmarshalWithParams", - }, - "encoding/base32": []string{ - "CorruptInputError", - "Encoding", - "HexEncoding", - "NewDecoder", - "NewEncoder", - "NewEncoding", - "NoPadding", - "StdEncoding", - "StdPadding", - }, - "encoding/base64": []string{ - "CorruptInputError", - "Encoding", - "NewDecoder", - "NewEncoder", - "NewEncoding", - "NoPadding", - "RawStdEncoding", - "RawURLEncoding", - "StdEncoding", - "StdPadding", - "URLEncoding", - }, - "encoding/binary": []string{ - "BigEndian", - "ByteOrder", - "LittleEndian", - "MaxVarintLen16", - "MaxVarintLen32", - "MaxVarintLen64", - "PutUvarint", - "PutVarint", - "Read", - "ReadUvarint", - "ReadVarint", - "Size", - "Uvarint", - "Varint", - "Write", - }, - "encoding/csv": []string{ - "ErrBareQuote", - "ErrFieldCount", - "ErrQuote", - "ErrTrailingComma", - "NewReader", - "NewWriter", - "ParseError", - "Reader", - "Writer", - }, - "encoding/gob": []string{ - "CommonType", - "Decoder", - "Encoder", - "GobDecoder", - "GobEncoder", - "NewDecoder", - "NewEncoder", - "Register", - "RegisterName", - }, - "encoding/hex": []string{ - "Decode", - "DecodeString", - "DecodedLen", - "Dump", - "Dumper", - "Encode", - "EncodeToString", - "EncodedLen", - "ErrLength", - "InvalidByteError", - "NewDecoder", - "NewEncoder", - }, - "encoding/json": []string{ - "Compact", - "Decoder", - "Delim", - "Encoder", - "HTMLEscape", - "Indent", - "InvalidUTF8Error", - "InvalidUnmarshalError", - "Marshal", - "MarshalIndent", - "Marshaler", - "MarshalerError", - "NewDecoder", - "NewEncoder", - "Number", - "RawMessage", - "SyntaxError", - "Token", - "Unmarshal", - "UnmarshalFieldError", - "UnmarshalTypeError", - "Unmarshaler", - "UnsupportedTypeError", - "UnsupportedValueError", - "Valid", - }, - "encoding/pem": []string{ - "Block", - "Decode", - "Encode", - "EncodeToMemory", - }, - "encoding/xml": []string{ - "Attr", - "CharData", - "Comment", - "CopyToken", - "Decoder", - "Directive", - "Encoder", - "EndElement", - "Escape", - "EscapeText", - "HTMLAutoClose", - "HTMLEntity", - "Header", - "Marshal", - "MarshalIndent", - "Marshaler", - "MarshalerAttr", - "Name", - "NewDecoder", - "NewEncoder", - "NewTokenDecoder", - "ProcInst", - "StartElement", - "SyntaxError", - "TagPathError", - "Token", - "TokenReader", - "Unmarshal", - "UnmarshalError", - "Unmarshaler", - "UnmarshalerAttr", - "UnsupportedTypeError", - }, - "errors": []string{ - "As", - "Is", - "New", - "Unwrap", - }, - "expvar": []string{ - "Do", - "Float", - "Func", - "Get", - "Handler", - "Int", - "KeyValue", - "Map", - "NewFloat", - "NewInt", - "NewMap", - "NewString", - "Publish", - "String", - "Var", - }, - "flag": []string{ - "Arg", - "Args", - "Bool", - "BoolVar", - "CommandLine", - "ContinueOnError", - "Duration", - "DurationVar", - "ErrHelp", - "ErrorHandling", - "ExitOnError", - "Flag", - "FlagSet", - "Float64", - "Float64Var", - "Getter", - "Int", - "Int64", - "Int64Var", - "IntVar", - "Lookup", - "NArg", - "NFlag", - "NewFlagSet", - "PanicOnError", - "Parse", - "Parsed", - "PrintDefaults", - "Set", - "String", - "StringVar", - "Uint", - "Uint64", - "Uint64Var", - "UintVar", - "UnquoteUsage", - "Usage", - "Value", - "Var", - "Visit", - "VisitAll", - }, - "fmt": []string{ - "Errorf", - "Formatter", - "Fprint", - "Fprintf", - "Fprintln", - "Fscan", - "Fscanf", - "Fscanln", - "GoStringer", - "Print", - "Printf", - "Println", - "Scan", - "ScanState", - "Scanf", - "Scanln", - "Scanner", - "Sprint", - "Sprintf", - "Sprintln", - "Sscan", - "Sscanf", - "Sscanln", - "State", - "Stringer", - }, - "go/ast": []string{ - "ArrayType", - "AssignStmt", - "Bad", - "BadDecl", - "BadExpr", - "BadStmt", - "BasicLit", - "BinaryExpr", - "BlockStmt", - "BranchStmt", - "CallExpr", - "CaseClause", - "ChanDir", - "ChanType", - "CommClause", - "Comment", - "CommentGroup", - "CommentMap", - "CompositeLit", - "Con", - "Decl", - "DeclStmt", - "DeferStmt", - "Ellipsis", - "EmptyStmt", - "Expr", - "ExprStmt", - "Field", - "FieldFilter", - "FieldList", - "File", - "FileExports", - "Filter", - "FilterDecl", - "FilterFile", - "FilterFuncDuplicates", - "FilterImportDuplicates", - "FilterPackage", - "FilterUnassociatedComments", - "ForStmt", - "Fprint", - "Fun", - "FuncDecl", - "FuncLit", - "FuncType", - "GenDecl", - "GoStmt", - "Ident", - "IfStmt", - "ImportSpec", - "Importer", - "IncDecStmt", - "IndexExpr", - "Inspect", - "InterfaceType", - "IsExported", - "KeyValueExpr", - "LabeledStmt", - "Lbl", - "MapType", - "MergeMode", - "MergePackageFiles", - "NewCommentMap", - "NewIdent", - "NewObj", - "NewPackage", - "NewScope", - "Node", - "NotNilFilter", - "ObjKind", - "Object", - "Package", - "PackageExports", - "ParenExpr", - "Pkg", - "Print", - "RECV", - "RangeStmt", - "ReturnStmt", - "SEND", - "Scope", - "SelectStmt", - "SelectorExpr", - "SendStmt", - "SliceExpr", - "SortImports", - "Spec", - "StarExpr", - "Stmt", - "StructType", - "SwitchStmt", - "Typ", - "TypeAssertExpr", - "TypeSpec", - "TypeSwitchStmt", - "UnaryExpr", - "ValueSpec", - "Var", - "Visitor", - "Walk", - }, - "go/build": []string{ - "AllowBinary", - "ArchChar", - "Context", - "Default", - "FindOnly", - "IgnoreVendor", - "Import", - "ImportComment", - "ImportDir", - "ImportMode", - "IsLocalImport", - "MultiplePackageError", - "NoGoError", - "Package", - "ToolDir", - }, - "go/constant": []string{ - "BinaryOp", - "BitLen", - "Bool", - "BoolVal", - "Bytes", - "Compare", - "Complex", - "Denom", - "Float", - "Float32Val", - "Float64Val", - "Imag", - "Int", - "Int64Val", - "Kind", - "Make", - "MakeBool", - "MakeFloat64", - "MakeFromBytes", - "MakeFromLiteral", - "MakeImag", - "MakeInt64", - "MakeString", - "MakeUint64", - "MakeUnknown", - "Num", - "Real", - "Shift", - "Sign", - "String", - "StringVal", - "ToComplex", - "ToFloat", - "ToInt", - "Uint64Val", - "UnaryOp", - "Unknown", - "Val", - "Value", - }, - "go/doc": []string{ - "AllDecls", - "AllMethods", - "Example", - "Examples", - "Filter", - "Func", - "IllegalPrefixes", - "IsPredeclared", - "Mode", - "New", - "Note", - "Package", - "PreserveAST", - "Synopsis", - "ToHTML", - "ToText", - "Type", - "Value", - }, - "go/format": []string{ - "Node", - "Source", - }, - "go/importer": []string{ - "Default", - "For", - "ForCompiler", - "Lookup", - }, - "go/parser": []string{ - "AllErrors", - "DeclarationErrors", - "ImportsOnly", - "Mode", - "PackageClauseOnly", - "ParseComments", - "ParseDir", - "ParseExpr", - "ParseExprFrom", - "ParseFile", - "SpuriousErrors", - "Trace", - }, - "go/printer": []string{ - "CommentedNode", - "Config", - "Fprint", - "Mode", - "RawFormat", - "SourcePos", - "TabIndent", - "UseSpaces", - }, - "go/scanner": []string{ - "Error", - "ErrorHandler", - "ErrorList", - "Mode", - "PrintError", - "ScanComments", - "Scanner", - }, - "go/token": []string{ - "ADD", - "ADD_ASSIGN", - "AND", - "AND_ASSIGN", - "AND_NOT", - "AND_NOT_ASSIGN", - "ARROW", - "ASSIGN", - "BREAK", - "CASE", - "CHAN", - "CHAR", - "COLON", - "COMMA", - "COMMENT", - "CONST", - "CONTINUE", - "DEC", - "DEFAULT", - "DEFER", - "DEFINE", - "ELLIPSIS", - "ELSE", - "EOF", - "EQL", - "FALLTHROUGH", - "FLOAT", - "FOR", - "FUNC", - "File", - "FileSet", - "GEQ", - "GO", - "GOTO", - "GTR", - "HighestPrec", - "IDENT", - "IF", - "ILLEGAL", - "IMAG", - "IMPORT", - "INC", - "INT", - "INTERFACE", - "IsExported", - "IsIdentifier", - "IsKeyword", - "LAND", - "LBRACE", - "LBRACK", - "LEQ", - "LOR", - "LPAREN", - "LSS", - "Lookup", - "LowestPrec", - "MAP", - "MUL", - "MUL_ASSIGN", - "NEQ", - "NOT", - "NewFileSet", - "NoPos", - "OR", - "OR_ASSIGN", - "PACKAGE", - "PERIOD", - "Pos", - "Position", - "QUO", - "QUO_ASSIGN", - "RANGE", - "RBRACE", - "RBRACK", - "REM", - "REM_ASSIGN", - "RETURN", - "RPAREN", - "SELECT", - "SEMICOLON", - "SHL", - "SHL_ASSIGN", - "SHR", - "SHR_ASSIGN", - "STRING", - "STRUCT", - "SUB", - "SUB_ASSIGN", - "SWITCH", - "TYPE", - "Token", - "UnaryPrec", - "VAR", - "XOR", - "XOR_ASSIGN", - }, - "go/types": []string{ - "Array", - "AssertableTo", - "AssignableTo", - "Basic", - "BasicInfo", - "BasicKind", - "Bool", - "Builtin", - "Byte", - "Chan", - "ChanDir", - "CheckExpr", - "Checker", - "Comparable", - "Complex128", - "Complex64", - "Config", - "Const", - "ConvertibleTo", - "DefPredeclaredTestFuncs", - "Default", - "Error", - "Eval", - "ExprString", - "FieldVal", - "Float32", - "Float64", - "Func", - "Id", - "Identical", - "IdenticalIgnoreTags", - "Implements", - "ImportMode", - "Importer", - "ImporterFrom", - "Info", - "Initializer", - "Int", - "Int16", - "Int32", - "Int64", - "Int8", - "Interface", - "Invalid", - "IsBoolean", - "IsComplex", - "IsConstType", - "IsFloat", - "IsInteger", - "IsInterface", - "IsNumeric", - "IsOrdered", - "IsString", - "IsUnsigned", - "IsUntyped", - "Label", - "LookupFieldOrMethod", - "Map", - "MethodExpr", - "MethodSet", - "MethodVal", - "MissingMethod", - "Named", - "NewArray", - "NewChan", - "NewChecker", - "NewConst", - "NewField", - "NewFunc", - "NewInterface", - "NewInterfaceType", - "NewLabel", - "NewMap", - "NewMethodSet", - "NewNamed", - "NewPackage", - "NewParam", - "NewPkgName", - "NewPointer", - "NewScope", - "NewSignature", - "NewSlice", - "NewStruct", - "NewTuple", - "NewTypeName", - "NewVar", - "Nil", - "Object", - "ObjectString", - "Package", - "PkgName", - "Pointer", - "Qualifier", - "RecvOnly", - "RelativeTo", - "Rune", - "Scope", - "Selection", - "SelectionKind", - "SelectionString", - "SendOnly", - "SendRecv", - "Signature", - "Sizes", - "SizesFor", - "Slice", - "StdSizes", - "String", - "Struct", - "Tuple", - "Typ", - "Type", - "TypeAndValue", - "TypeName", - "TypeString", - "Uint", - "Uint16", - "Uint32", - "Uint64", - "Uint8", - "Uintptr", - "Universe", - "Unsafe", - "UnsafePointer", - "UntypedBool", - "UntypedComplex", - "UntypedFloat", - "UntypedInt", - "UntypedNil", - "UntypedRune", - "UntypedString", - "Var", - "WriteExpr", - "WriteSignature", - "WriteType", - }, - "hash": []string{ - "Hash", - "Hash32", - "Hash64", - }, - "hash/adler32": []string{ - "Checksum", - "New", - "Size", - }, - "hash/crc32": []string{ - "Castagnoli", - "Checksum", - "ChecksumIEEE", - "IEEE", - "IEEETable", - "Koopman", - "MakeTable", - "New", - "NewIEEE", - "Size", - "Table", - "Update", - }, - "hash/crc64": []string{ - "Checksum", - "ECMA", - "ISO", - "MakeTable", - "New", - "Size", - "Table", - "Update", - }, - "hash/fnv": []string{ - "New128", - "New128a", - "New32", - "New32a", - "New64", - "New64a", - }, - "html": []string{ - "EscapeString", - "UnescapeString", - }, - "html/template": []string{ - "CSS", - "ErrAmbigContext", - "ErrBadHTML", - "ErrBranchEnd", - "ErrEndContext", - "ErrNoSuchTemplate", - "ErrOutputContext", - "ErrPartialCharset", - "ErrPartialEscape", - "ErrPredefinedEscaper", - "ErrRangeLoopReentry", - "ErrSlashAmbig", - "Error", - "ErrorCode", - "FuncMap", - "HTML", - "HTMLAttr", - "HTMLEscape", - "HTMLEscapeString", - "HTMLEscaper", - "IsTrue", - "JS", - "JSEscape", - "JSEscapeString", - "JSEscaper", - "JSStr", - "Must", - "New", - "OK", - "ParseFiles", - "ParseGlob", - "Srcset", - "Template", - "URL", - "URLQueryEscaper", - }, - "image": []string{ - "Alpha", - "Alpha16", - "Black", - "CMYK", - "Config", - "Decode", - "DecodeConfig", - "ErrFormat", - "Gray", - "Gray16", - "Image", - "NRGBA", - "NRGBA64", - "NYCbCrA", - "NewAlpha", - "NewAlpha16", - "NewCMYK", - "NewGray", - "NewGray16", - "NewNRGBA", - "NewNRGBA64", - "NewNYCbCrA", - "NewPaletted", - "NewRGBA", - "NewRGBA64", - "NewUniform", - "NewYCbCr", - "Opaque", - "Paletted", - "PalettedImage", - "Point", - "Pt", - "RGBA", - "RGBA64", - "Rect", - "Rectangle", - "RegisterFormat", - "Transparent", - "Uniform", - "White", - "YCbCr", - "YCbCrSubsampleRatio", - "YCbCrSubsampleRatio410", - "YCbCrSubsampleRatio411", - "YCbCrSubsampleRatio420", - "YCbCrSubsampleRatio422", - "YCbCrSubsampleRatio440", - "YCbCrSubsampleRatio444", - "ZP", - "ZR", - }, - "image/color": []string{ - "Alpha", - "Alpha16", - "Alpha16Model", - "AlphaModel", - "Black", - "CMYK", - "CMYKModel", - "CMYKToRGB", - "Color", - "Gray", - "Gray16", - "Gray16Model", - "GrayModel", - "Model", - "ModelFunc", - "NRGBA", - "NRGBA64", - "NRGBA64Model", - "NRGBAModel", - "NYCbCrA", - "NYCbCrAModel", - "Opaque", - "Palette", - "RGBA", - "RGBA64", - "RGBA64Model", - "RGBAModel", - "RGBToCMYK", - "RGBToYCbCr", - "Transparent", - "White", - "YCbCr", - "YCbCrModel", - "YCbCrToRGB", - }, - "image/color/palette": []string{ - "Plan9", - "WebSafe", - }, - "image/draw": []string{ - "Draw", - "DrawMask", - "Drawer", - "FloydSteinberg", - "Image", - "Op", - "Over", - "Quantizer", - "Src", - }, - "image/gif": []string{ - "Decode", - "DecodeAll", - "DecodeConfig", - "DisposalBackground", - "DisposalNone", - "DisposalPrevious", - "Encode", - "EncodeAll", - "GIF", - "Options", - }, - "image/jpeg": []string{ - "Decode", - "DecodeConfig", - "DefaultQuality", - "Encode", - "FormatError", - "Options", - "Reader", - "UnsupportedError", - }, - "image/png": []string{ - "BestCompression", - "BestSpeed", - "CompressionLevel", - "Decode", - "DecodeConfig", - "DefaultCompression", - "Encode", - "Encoder", - "EncoderBuffer", - "EncoderBufferPool", - "FormatError", - "NoCompression", - "UnsupportedError", - }, - "index/suffixarray": []string{ - "Index", - "New", - }, - "io": []string{ - "ByteReader", - "ByteScanner", - "ByteWriter", - "Closer", - "Copy", - "CopyBuffer", - "CopyN", - "EOF", - "ErrClosedPipe", - "ErrNoProgress", - "ErrShortBuffer", - "ErrShortWrite", - "ErrUnexpectedEOF", - "LimitReader", - "LimitedReader", - "MultiReader", - "MultiWriter", - "NewSectionReader", - "Pipe", - "PipeReader", - "PipeWriter", - "ReadAtLeast", - "ReadCloser", - "ReadFull", - "ReadSeeker", - "ReadWriteCloser", - "ReadWriteSeeker", - "ReadWriter", - "Reader", - "ReaderAt", - "ReaderFrom", - "RuneReader", - "RuneScanner", - "SectionReader", - "SeekCurrent", - "SeekEnd", - "SeekStart", - "Seeker", - "StringWriter", - "TeeReader", - "WriteCloser", - "WriteSeeker", - "WriteString", - "Writer", - "WriterAt", - "WriterTo", - }, - "io/ioutil": []string{ - "Discard", - "NopCloser", - "ReadAll", - "ReadDir", - "ReadFile", - "TempDir", - "TempFile", - "WriteFile", - }, - "log": []string{ - "Fatal", - "Fatalf", - "Fatalln", - "Flags", - "LUTC", - "Ldate", - "Llongfile", - "Lmicroseconds", - "Logger", - "Lshortfile", - "LstdFlags", - "Ltime", - "New", - "Output", - "Panic", - "Panicf", - "Panicln", - "Prefix", - "Print", - "Printf", - "Println", - "SetFlags", - "SetOutput", - "SetPrefix", - "Writer", - }, - "log/syslog": []string{ - "Dial", - "LOG_ALERT", - "LOG_AUTH", - "LOG_AUTHPRIV", - "LOG_CRIT", - "LOG_CRON", - "LOG_DAEMON", - "LOG_DEBUG", - "LOG_EMERG", - "LOG_ERR", - "LOG_FTP", - "LOG_INFO", - "LOG_KERN", - "LOG_LOCAL0", - "LOG_LOCAL1", - "LOG_LOCAL2", - "LOG_LOCAL3", - "LOG_LOCAL4", - "LOG_LOCAL5", - "LOG_LOCAL6", - "LOG_LOCAL7", - "LOG_LPR", - "LOG_MAIL", - "LOG_NEWS", - "LOG_NOTICE", - "LOG_SYSLOG", - "LOG_USER", - "LOG_UUCP", - "LOG_WARNING", - "New", - "NewLogger", - "Priority", - "Writer", - }, - "math": []string{ - "Abs", - "Acos", - "Acosh", - "Asin", - "Asinh", - "Atan", - "Atan2", - "Atanh", - "Cbrt", - "Ceil", - "Copysign", - "Cos", - "Cosh", - "Dim", - "E", - "Erf", - "Erfc", - "Erfcinv", - "Erfinv", - "Exp", - "Exp2", - "Expm1", - "Float32bits", - "Float32frombits", - "Float64bits", - "Float64frombits", - "Floor", - "Frexp", - "Gamma", - "Hypot", - "Ilogb", - "Inf", - "IsInf", - "IsNaN", - "J0", - "J1", - "Jn", - "Ldexp", - "Lgamma", - "Ln10", - "Ln2", - "Log", - "Log10", - "Log10E", - "Log1p", - "Log2", - "Log2E", - "Logb", - "Max", - "MaxFloat32", - "MaxFloat64", - "MaxInt16", - "MaxInt32", - "MaxInt64", - "MaxInt8", - "MaxUint16", - "MaxUint32", - "MaxUint64", - "MaxUint8", - "Min", - "MinInt16", - "MinInt32", - "MinInt64", - "MinInt8", - "Mod", - "Modf", - "NaN", - "Nextafter", - "Nextafter32", - "Phi", - "Pi", - "Pow", - "Pow10", - "Remainder", - "Round", - "RoundToEven", - "Signbit", - "Sin", - "Sincos", - "Sinh", - "SmallestNonzeroFloat32", - "SmallestNonzeroFloat64", - "Sqrt", - "Sqrt2", - "SqrtE", - "SqrtPhi", - "SqrtPi", - "Tan", - "Tanh", - "Trunc", - "Y0", - "Y1", - "Yn", - }, - "math/big": []string{ - "Above", - "Accuracy", - "AwayFromZero", - "Below", - "ErrNaN", - "Exact", - "Float", - "Int", - "Jacobi", - "MaxBase", - "MaxExp", - "MaxPrec", - "MinExp", - "NewFloat", - "NewInt", - "NewRat", - "ParseFloat", - "Rat", - "RoundingMode", - "ToNearestAway", - "ToNearestEven", - "ToNegativeInf", - "ToPositiveInf", - "ToZero", - "Word", - }, - "math/bits": []string{ - "Add", - "Add32", - "Add64", - "Div", - "Div32", - "Div64", - "LeadingZeros", - "LeadingZeros16", - "LeadingZeros32", - "LeadingZeros64", - "LeadingZeros8", - "Len", - "Len16", - "Len32", - "Len64", - "Len8", - "Mul", - "Mul32", - "Mul64", - "OnesCount", - "OnesCount16", - "OnesCount32", - "OnesCount64", - "OnesCount8", - "Reverse", - "Reverse16", - "Reverse32", - "Reverse64", - "Reverse8", - "ReverseBytes", - "ReverseBytes16", - "ReverseBytes32", - "ReverseBytes64", - "RotateLeft", - "RotateLeft16", - "RotateLeft32", - "RotateLeft64", - "RotateLeft8", - "Sub", - "Sub32", - "Sub64", - "TrailingZeros", - "TrailingZeros16", - "TrailingZeros32", - "TrailingZeros64", - "TrailingZeros8", - "UintSize", - }, - "math/cmplx": []string{ - "Abs", - "Acos", - "Acosh", - "Asin", - "Asinh", - "Atan", - "Atanh", - "Conj", - "Cos", - "Cosh", - "Cot", - "Exp", - "Inf", - "IsInf", - "IsNaN", - "Log", - "Log10", - "NaN", - "Phase", - "Polar", - "Pow", - "Rect", - "Sin", - "Sinh", - "Sqrt", - "Tan", - "Tanh", - }, - "math/rand": []string{ - "ExpFloat64", - "Float32", - "Float64", - "Int", - "Int31", - "Int31n", - "Int63", - "Int63n", - "Intn", - "New", - "NewSource", - "NewZipf", - "NormFloat64", - "Perm", - "Rand", - "Read", - "Seed", - "Shuffle", - "Source", - "Source64", - "Uint32", - "Uint64", - "Zipf", - }, - "mime": []string{ - "AddExtensionType", - "BEncoding", - "ErrInvalidMediaParameter", - "ExtensionsByType", - "FormatMediaType", - "ParseMediaType", - "QEncoding", - "TypeByExtension", - "WordDecoder", - "WordEncoder", - }, - "mime/multipart": []string{ - "ErrMessageTooLarge", - "File", - "FileHeader", - "Form", - "NewReader", - "NewWriter", - "Part", - "Reader", - "Writer", - }, - "mime/quotedprintable": []string{ - "NewReader", - "NewWriter", - "Reader", - "Writer", - }, - "net": []string{ - "Addr", - "AddrError", - "Buffers", - "CIDRMask", - "Conn", - "DNSConfigError", - "DNSError", - "DefaultResolver", - "Dial", - "DialIP", - "DialTCP", - "DialTimeout", - "DialUDP", - "DialUnix", - "Dialer", - "ErrWriteToConnected", - "Error", - "FileConn", - "FileListener", - "FilePacketConn", - "FlagBroadcast", - "FlagLoopback", - "FlagMulticast", - "FlagPointToPoint", - "FlagUp", - "Flags", - "HardwareAddr", - "IP", - "IPAddr", - "IPConn", - "IPMask", - "IPNet", - "IPv4", - "IPv4Mask", - "IPv4allrouter", - "IPv4allsys", - "IPv4bcast", - "IPv4len", - "IPv4zero", - "IPv6interfacelocalallnodes", - "IPv6len", - "IPv6linklocalallnodes", - "IPv6linklocalallrouters", - "IPv6loopback", - "IPv6unspecified", - "IPv6zero", - "Interface", - "InterfaceAddrs", - "InterfaceByIndex", - "InterfaceByName", - "Interfaces", - "InvalidAddrError", - "JoinHostPort", - "Listen", - "ListenConfig", - "ListenIP", - "ListenMulticastUDP", - "ListenPacket", - "ListenTCP", - "ListenUDP", - "ListenUnix", - "ListenUnixgram", - "Listener", - "LookupAddr", - "LookupCNAME", - "LookupHost", - "LookupIP", - "LookupMX", - "LookupNS", - "LookupPort", - "LookupSRV", - "LookupTXT", - "MX", - "NS", - "OpError", - "PacketConn", - "ParseCIDR", - "ParseError", - "ParseIP", - "ParseMAC", - "Pipe", - "ResolveIPAddr", - "ResolveTCPAddr", - "ResolveUDPAddr", - "ResolveUnixAddr", - "Resolver", - "SRV", - "SplitHostPort", - "TCPAddr", - "TCPConn", - "TCPListener", - "UDPAddr", - "UDPConn", - "UnixAddr", - "UnixConn", - "UnixListener", - "UnknownNetworkError", - }, - "net/http": []string{ - "CanonicalHeaderKey", - "Client", - "CloseNotifier", - "ConnState", - "Cookie", - "CookieJar", - "DefaultClient", - "DefaultMaxHeaderBytes", - "DefaultMaxIdleConnsPerHost", - "DefaultServeMux", - "DefaultTransport", - "DetectContentType", - "Dir", - "ErrAbortHandler", - "ErrBodyNotAllowed", - "ErrBodyReadAfterClose", - "ErrContentLength", - "ErrHandlerTimeout", - "ErrHeaderTooLong", - "ErrHijacked", - "ErrLineTooLong", - "ErrMissingBoundary", - "ErrMissingContentLength", - "ErrMissingFile", - "ErrNoCookie", - "ErrNoLocation", - "ErrNotMultipart", - "ErrNotSupported", - "ErrServerClosed", - "ErrShortBody", - "ErrSkipAltProtocol", - "ErrUnexpectedTrailer", - "ErrUseLastResponse", - "ErrWriteAfterFlush", - "Error", - "File", - "FileServer", - "FileSystem", - "Flusher", - "Get", - "Handle", - "HandleFunc", - "Handler", - "HandlerFunc", - "Head", - "Header", - "Hijacker", - "ListenAndServe", - "ListenAndServeTLS", - "LocalAddrContextKey", - "MaxBytesReader", - "MethodConnect", - "MethodDelete", - "MethodGet", - "MethodHead", - "MethodOptions", - "MethodPatch", - "MethodPost", - "MethodPut", - "MethodTrace", - "NewFileTransport", - "NewRequest", - "NewRequestWithContext", - "NewServeMux", - "NoBody", - "NotFound", - "NotFoundHandler", - "ParseHTTPVersion", - "ParseTime", - "Post", - "PostForm", - "ProtocolError", - "ProxyFromEnvironment", - "ProxyURL", - "PushOptions", - "Pusher", - "ReadRequest", - "ReadResponse", - "Redirect", - "RedirectHandler", - "Request", - "Response", - "ResponseWriter", - "RoundTripper", - "SameSite", - "SameSiteDefaultMode", - "SameSiteLaxMode", - "SameSiteNoneMode", - "SameSiteStrictMode", - "Serve", - "ServeContent", - "ServeFile", - "ServeMux", - "ServeTLS", - "Server", - "ServerContextKey", - "SetCookie", - "StateActive", - "StateClosed", - "StateHijacked", - "StateIdle", - "StateNew", - "StatusAccepted", - "StatusAlreadyReported", - "StatusBadGateway", - "StatusBadRequest", - "StatusConflict", - "StatusContinue", - "StatusCreated", - "StatusEarlyHints", - "StatusExpectationFailed", - "StatusFailedDependency", - "StatusForbidden", - "StatusFound", - "StatusGatewayTimeout", - "StatusGone", - "StatusHTTPVersionNotSupported", - "StatusIMUsed", - "StatusInsufficientStorage", - "StatusInternalServerError", - "StatusLengthRequired", - "StatusLocked", - "StatusLoopDetected", - "StatusMethodNotAllowed", - "StatusMisdirectedRequest", - "StatusMovedPermanently", - "StatusMultiStatus", - "StatusMultipleChoices", - "StatusNetworkAuthenticationRequired", - "StatusNoContent", - "StatusNonAuthoritativeInfo", - "StatusNotAcceptable", - "StatusNotExtended", - "StatusNotFound", - "StatusNotImplemented", - "StatusNotModified", - "StatusOK", - "StatusPartialContent", - "StatusPaymentRequired", - "StatusPermanentRedirect", - "StatusPreconditionFailed", - "StatusPreconditionRequired", - "StatusProcessing", - "StatusProxyAuthRequired", - "StatusRequestEntityTooLarge", - "StatusRequestHeaderFieldsTooLarge", - "StatusRequestTimeout", - "StatusRequestURITooLong", - "StatusRequestedRangeNotSatisfiable", - "StatusResetContent", - "StatusSeeOther", - "StatusServiceUnavailable", - "StatusSwitchingProtocols", - "StatusTeapot", - "StatusTemporaryRedirect", - "StatusText", - "StatusTooEarly", - "StatusTooManyRequests", - "StatusUnauthorized", - "StatusUnavailableForLegalReasons", - "StatusUnprocessableEntity", - "StatusUnsupportedMediaType", - "StatusUpgradeRequired", - "StatusUseProxy", - "StatusVariantAlsoNegotiates", - "StripPrefix", - "TimeFormat", - "TimeoutHandler", - "TrailerPrefix", - "Transport", - }, - "net/http/cgi": []string{ - "Handler", - "Request", - "RequestFromMap", - "Serve", - }, - "net/http/cookiejar": []string{ - "Jar", - "New", - "Options", - "PublicSuffixList", - }, - "net/http/fcgi": []string{ - "ErrConnClosed", - "ErrRequestAborted", - "ProcessEnv", - "Serve", - }, - "net/http/httptest": []string{ - "DefaultRemoteAddr", - "NewRecorder", - "NewRequest", - "NewServer", - "NewTLSServer", - "NewUnstartedServer", - "ResponseRecorder", - "Server", - }, - "net/http/httptrace": []string{ - "ClientTrace", - "ContextClientTrace", - "DNSDoneInfo", - "DNSStartInfo", - "GotConnInfo", - "WithClientTrace", - "WroteRequestInfo", - }, - "net/http/httputil": []string{ - "BufferPool", - "ClientConn", - "DumpRequest", - "DumpRequestOut", - "DumpResponse", - "ErrClosed", - "ErrLineTooLong", - "ErrPersistEOF", - "ErrPipeline", - "NewChunkedReader", - "NewChunkedWriter", - "NewClientConn", - "NewProxyClientConn", - "NewServerConn", - "NewSingleHostReverseProxy", - "ReverseProxy", - "ServerConn", - }, - "net/http/pprof": []string{ - "Cmdline", - "Handler", - "Index", - "Profile", - "Symbol", - "Trace", - }, - "net/mail": []string{ - "Address", - "AddressParser", - "ErrHeaderNotPresent", - "Header", - "Message", - "ParseAddress", - "ParseAddressList", - "ParseDate", - "ReadMessage", - }, - "net/rpc": []string{ - "Accept", - "Call", - "Client", - "ClientCodec", - "DefaultDebugPath", - "DefaultRPCPath", - "DefaultServer", - "Dial", - "DialHTTP", - "DialHTTPPath", - "ErrShutdown", - "HandleHTTP", - "NewClient", - "NewClientWithCodec", - "NewServer", - "Register", - "RegisterName", - "Request", - "Response", - "ServeCodec", - "ServeConn", - "ServeRequest", - "Server", - "ServerCodec", - "ServerError", - }, - "net/rpc/jsonrpc": []string{ - "Dial", - "NewClient", - "NewClientCodec", - "NewServerCodec", - "ServeConn", - }, - "net/smtp": []string{ - "Auth", - "CRAMMD5Auth", - "Client", - "Dial", - "NewClient", - "PlainAuth", - "SendMail", - "ServerInfo", - }, - "net/textproto": []string{ - "CanonicalMIMEHeaderKey", - "Conn", - "Dial", - "Error", - "MIMEHeader", - "NewConn", - "NewReader", - "NewWriter", - "Pipeline", - "ProtocolError", - "Reader", - "TrimBytes", - "TrimString", - "Writer", - }, - "net/url": []string{ - "Error", - "EscapeError", - "InvalidHostError", - "Parse", - "ParseQuery", - "ParseRequestURI", - "PathEscape", - "PathUnescape", - "QueryEscape", - "QueryUnescape", - "URL", - "User", - "UserPassword", - "Userinfo", - "Values", - }, - "os": []string{ - "Args", - "Chdir", - "Chmod", - "Chown", - "Chtimes", - "Clearenv", - "Create", - "DevNull", - "Environ", - "ErrClosed", - "ErrExist", - "ErrInvalid", - "ErrNoDeadline", - "ErrNotExist", - "ErrPermission", - "Executable", - "Exit", - "Expand", - "ExpandEnv", - "File", - "FileInfo", - "FileMode", - "FindProcess", - "Getegid", - "Getenv", - "Geteuid", - "Getgid", - "Getgroups", - "Getpagesize", - "Getpid", - "Getppid", - "Getuid", - "Getwd", - "Hostname", - "Interrupt", - "IsExist", - "IsNotExist", - "IsPathSeparator", - "IsPermission", - "IsTimeout", - "Kill", - "Lchown", - "Link", - "LinkError", - "LookupEnv", - "Lstat", - "Mkdir", - "MkdirAll", - "ModeAppend", - "ModeCharDevice", - "ModeDevice", - "ModeDir", - "ModeExclusive", - "ModeIrregular", - "ModeNamedPipe", - "ModePerm", - "ModeSetgid", - "ModeSetuid", - "ModeSocket", - "ModeSticky", - "ModeSymlink", - "ModeTemporary", - "ModeType", - "NewFile", - "NewSyscallError", - "O_APPEND", - "O_CREATE", - "O_EXCL", - "O_RDONLY", - "O_RDWR", - "O_SYNC", - "O_TRUNC", - "O_WRONLY", - "Open", - "OpenFile", - "PathError", - "PathListSeparator", - "PathSeparator", - "Pipe", - "ProcAttr", - "Process", - "ProcessState", - "Readlink", - "Remove", - "RemoveAll", - "Rename", - "SEEK_CUR", - "SEEK_END", - "SEEK_SET", - "SameFile", - "Setenv", - "Signal", - "StartProcess", - "Stat", - "Stderr", - "Stdin", - "Stdout", - "Symlink", - "SyscallError", - "TempDir", - "Truncate", - "Unsetenv", - "UserCacheDir", - "UserConfigDir", - "UserHomeDir", - }, - "os/exec": []string{ - "Cmd", - "Command", - "CommandContext", - "ErrNotFound", - "Error", - "ExitError", - "LookPath", - }, - "os/signal": []string{ - "Ignore", - "Ignored", - "Notify", - "Reset", - "Stop", - }, - "os/user": []string{ - "Current", - "Group", - "Lookup", - "LookupGroup", - "LookupGroupId", - "LookupId", - "UnknownGroupError", - "UnknownGroupIdError", - "UnknownUserError", - "UnknownUserIdError", - "User", - }, - "path": []string{ - "Base", - "Clean", - "Dir", - "ErrBadPattern", - "Ext", - "IsAbs", - "Join", - "Match", - "Split", - }, - "path/filepath": []string{ - "Abs", - "Base", - "Clean", - "Dir", - "ErrBadPattern", - "EvalSymlinks", - "Ext", - "FromSlash", - "Glob", - "HasPrefix", - "IsAbs", - "Join", - "ListSeparator", - "Match", - "Rel", - "Separator", - "SkipDir", - "Split", - "SplitList", - "ToSlash", - "VolumeName", - "Walk", - "WalkFunc", - }, - "plugin": []string{ - "Open", - "Plugin", - "Symbol", - }, - "reflect": []string{ - "Append", - "AppendSlice", - "Array", - "ArrayOf", - "Bool", - "BothDir", - "Chan", - "ChanDir", - "ChanOf", - "Complex128", - "Complex64", - "Copy", - "DeepEqual", - "Float32", - "Float64", - "Func", - "FuncOf", - "Indirect", - "Int", - "Int16", - "Int32", - "Int64", - "Int8", - "Interface", - "Invalid", - "Kind", - "MakeChan", - "MakeFunc", - "MakeMap", - "MakeMapWithSize", - "MakeSlice", - "Map", - "MapIter", - "MapOf", - "Method", - "New", - "NewAt", - "Ptr", - "PtrTo", - "RecvDir", - "Select", - "SelectCase", - "SelectDefault", - "SelectDir", - "SelectRecv", - "SelectSend", - "SendDir", - "Slice", - "SliceHeader", - "SliceOf", - "String", - "StringHeader", - "Struct", - "StructField", - "StructOf", - "StructTag", - "Swapper", - "Type", - "TypeOf", - "Uint", - "Uint16", - "Uint32", - "Uint64", - "Uint8", - "Uintptr", - "UnsafePointer", - "Value", - "ValueError", - "ValueOf", - "Zero", - }, - "regexp": []string{ - "Compile", - "CompilePOSIX", - "Match", - "MatchReader", - "MatchString", - "MustCompile", - "MustCompilePOSIX", - "QuoteMeta", - "Regexp", - }, - "regexp/syntax": []string{ - "ClassNL", - "Compile", - "DotNL", - "EmptyBeginLine", - "EmptyBeginText", - "EmptyEndLine", - "EmptyEndText", - "EmptyNoWordBoundary", - "EmptyOp", - "EmptyOpContext", - "EmptyWordBoundary", - "ErrInternalError", - "ErrInvalidCharClass", - "ErrInvalidCharRange", - "ErrInvalidEscape", - "ErrInvalidNamedCapture", - "ErrInvalidPerlOp", - "ErrInvalidRepeatOp", - "ErrInvalidRepeatSize", - "ErrInvalidUTF8", - "ErrMissingBracket", - "ErrMissingParen", - "ErrMissingRepeatArgument", - "ErrTrailingBackslash", - "ErrUnexpectedParen", - "Error", - "ErrorCode", - "Flags", - "FoldCase", - "Inst", - "InstAlt", - "InstAltMatch", - "InstCapture", - "InstEmptyWidth", - "InstFail", - "InstMatch", - "InstNop", - "InstOp", - "InstRune", - "InstRune1", - "InstRuneAny", - "InstRuneAnyNotNL", - "IsWordChar", - "Literal", - "MatchNL", - "NonGreedy", - "OneLine", - "Op", - "OpAlternate", - "OpAnyChar", - "OpAnyCharNotNL", - "OpBeginLine", - "OpBeginText", - "OpCapture", - "OpCharClass", - "OpConcat", - "OpEmptyMatch", - "OpEndLine", - "OpEndText", - "OpLiteral", - "OpNoMatch", - "OpNoWordBoundary", - "OpPlus", - "OpQuest", - "OpRepeat", - "OpStar", - "OpWordBoundary", - "POSIX", - "Parse", - "Perl", - "PerlX", - "Prog", - "Regexp", - "Simple", - "UnicodeGroups", - "WasDollar", - }, - "runtime": []string{ - "BlockProfile", - "BlockProfileRecord", - "Breakpoint", - "CPUProfile", - "Caller", - "Callers", - "CallersFrames", - "Compiler", - "Error", - "Frame", - "Frames", - "Func", - "FuncForPC", - "GC", - "GOARCH", - "GOMAXPROCS", - "GOOS", - "GOROOT", - "Goexit", - "GoroutineProfile", - "Gosched", - "KeepAlive", - "LockOSThread", - "MemProfile", - "MemProfileRate", - "MemProfileRecord", - "MemStats", - "MutexProfile", - "NumCPU", - "NumCgoCall", - "NumGoroutine", - "ReadMemStats", - "ReadTrace", - "SetBlockProfileRate", - "SetCPUProfileRate", - "SetCgoTraceback", - "SetFinalizer", - "SetMutexProfileFraction", - "Stack", - "StackRecord", - "StartTrace", - "StopTrace", - "ThreadCreateProfile", - "TypeAssertionError", - "UnlockOSThread", - "Version", - }, - "runtime/debug": []string{ - "BuildInfo", - "FreeOSMemory", - "GCStats", - "Module", - "PrintStack", - "ReadBuildInfo", - "ReadGCStats", - "SetGCPercent", - "SetMaxStack", - "SetMaxThreads", - "SetPanicOnFault", - "SetTraceback", - "Stack", - "WriteHeapDump", - }, - "runtime/pprof": []string{ - "Do", - "ForLabels", - "Label", - "LabelSet", - "Labels", - "Lookup", - "NewProfile", - "Profile", - "Profiles", - "SetGoroutineLabels", - "StartCPUProfile", - "StopCPUProfile", - "WithLabels", - "WriteHeapProfile", - }, - "runtime/trace": []string{ - "IsEnabled", - "Log", - "Logf", - "NewTask", - "Region", - "Start", - "StartRegion", - "Stop", - "Task", - "WithRegion", - }, - "sort": []string{ - "Float64Slice", - "Float64s", - "Float64sAreSorted", - "IntSlice", - "Interface", - "Ints", - "IntsAreSorted", - "IsSorted", - "Reverse", - "Search", - "SearchFloat64s", - "SearchInts", - "SearchStrings", - "Slice", - "SliceIsSorted", - "SliceStable", - "Sort", - "Stable", - "StringSlice", - "Strings", - "StringsAreSorted", - }, - "strconv": []string{ - "AppendBool", - "AppendFloat", - "AppendInt", - "AppendQuote", - "AppendQuoteRune", - "AppendQuoteRuneToASCII", - "AppendQuoteRuneToGraphic", - "AppendQuoteToASCII", - "AppendQuoteToGraphic", - "AppendUint", - "Atoi", - "CanBackquote", - "ErrRange", - "ErrSyntax", - "FormatBool", - "FormatFloat", - "FormatInt", - "FormatUint", - "IntSize", - "IsGraphic", - "IsPrint", - "Itoa", - "NumError", - "ParseBool", - "ParseFloat", - "ParseInt", - "ParseUint", - "Quote", - "QuoteRune", - "QuoteRuneToASCII", - "QuoteRuneToGraphic", - "QuoteToASCII", - "QuoteToGraphic", - "Unquote", - "UnquoteChar", - }, - "strings": []string{ - "Builder", - "Compare", - "Contains", - "ContainsAny", - "ContainsRune", - "Count", - "EqualFold", - "Fields", - "FieldsFunc", - "HasPrefix", - "HasSuffix", - "Index", - "IndexAny", - "IndexByte", - "IndexFunc", - "IndexRune", - "Join", - "LastIndex", - "LastIndexAny", - "LastIndexByte", - "LastIndexFunc", - "Map", - "NewReader", - "NewReplacer", - "Reader", - "Repeat", - "Replace", - "ReplaceAll", - "Replacer", - "Split", - "SplitAfter", - "SplitAfterN", - "SplitN", - "Title", - "ToLower", - "ToLowerSpecial", - "ToTitle", - "ToTitleSpecial", - "ToUpper", - "ToUpperSpecial", - "ToValidUTF8", - "Trim", - "TrimFunc", - "TrimLeft", - "TrimLeftFunc", - "TrimPrefix", - "TrimRight", - "TrimRightFunc", - "TrimSpace", - "TrimSuffix", - }, - "sync": []string{ - "Cond", - "Locker", - "Map", - "Mutex", - "NewCond", - "Once", - "Pool", - "RWMutex", - "WaitGroup", - }, - "sync/atomic": []string{ - "AddInt32", - "AddInt64", - "AddUint32", - "AddUint64", - "AddUintptr", - "CompareAndSwapInt32", - "CompareAndSwapInt64", - "CompareAndSwapPointer", - "CompareAndSwapUint32", - "CompareAndSwapUint64", - "CompareAndSwapUintptr", - "LoadInt32", - "LoadInt64", - "LoadPointer", - "LoadUint32", - "LoadUint64", - "LoadUintptr", - "StoreInt32", - "StoreInt64", - "StorePointer", - "StoreUint32", - "StoreUint64", - "StoreUintptr", - "SwapInt32", - "SwapInt64", - "SwapPointer", - "SwapUint32", - "SwapUint64", - "SwapUintptr", - "Value", - }, - "syscall": []string{ - "AF_ALG", - "AF_APPLETALK", - "AF_ARP", - "AF_ASH", - "AF_ATM", - "AF_ATMPVC", - "AF_ATMSVC", - "AF_AX25", - "AF_BLUETOOTH", - "AF_BRIDGE", - "AF_CAIF", - "AF_CAN", - "AF_CCITT", - "AF_CHAOS", - "AF_CNT", - "AF_COIP", - "AF_DATAKIT", - "AF_DECnet", - "AF_DLI", - "AF_E164", - "AF_ECMA", - "AF_ECONET", - "AF_ENCAP", - "AF_FILE", - "AF_HYLINK", - "AF_IEEE80211", - "AF_IEEE802154", - "AF_IMPLINK", - "AF_INET", - "AF_INET6", - "AF_INET6_SDP", - "AF_INET_SDP", - "AF_IPX", - "AF_IRDA", - "AF_ISDN", - "AF_ISO", - "AF_IUCV", - "AF_KEY", - "AF_LAT", - "AF_LINK", - "AF_LLC", - "AF_LOCAL", - "AF_MAX", - "AF_MPLS", - "AF_NATM", - "AF_NDRV", - "AF_NETBEUI", - "AF_NETBIOS", - "AF_NETGRAPH", - "AF_NETLINK", - "AF_NETROM", - "AF_NS", - "AF_OROUTE", - "AF_OSI", - "AF_PACKET", - "AF_PHONET", - "AF_PPP", - "AF_PPPOX", - "AF_PUP", - "AF_RDS", - "AF_RESERVED_36", - "AF_ROSE", - "AF_ROUTE", - "AF_RXRPC", - "AF_SCLUSTER", - "AF_SECURITY", - "AF_SIP", - "AF_SLOW", - "AF_SNA", - "AF_SYSTEM", - "AF_TIPC", - "AF_UNIX", - "AF_UNSPEC", - "AF_VENDOR00", - "AF_VENDOR01", - "AF_VENDOR02", - "AF_VENDOR03", - "AF_VENDOR04", - "AF_VENDOR05", - "AF_VENDOR06", - "AF_VENDOR07", - "AF_VENDOR08", - "AF_VENDOR09", - "AF_VENDOR10", - "AF_VENDOR11", - "AF_VENDOR12", - "AF_VENDOR13", - "AF_VENDOR14", - "AF_VENDOR15", - "AF_VENDOR16", - "AF_VENDOR17", - "AF_VENDOR18", - "AF_VENDOR19", - "AF_VENDOR20", - "AF_VENDOR21", - "AF_VENDOR22", - "AF_VENDOR23", - "AF_VENDOR24", - "AF_VENDOR25", - "AF_VENDOR26", - "AF_VENDOR27", - "AF_VENDOR28", - "AF_VENDOR29", - "AF_VENDOR30", - "AF_VENDOR31", - "AF_VENDOR32", - "AF_VENDOR33", - "AF_VENDOR34", - "AF_VENDOR35", - "AF_VENDOR36", - "AF_VENDOR37", - "AF_VENDOR38", - "AF_VENDOR39", - "AF_VENDOR40", - "AF_VENDOR41", - "AF_VENDOR42", - "AF_VENDOR43", - "AF_VENDOR44", - "AF_VENDOR45", - "AF_VENDOR46", - "AF_VENDOR47", - "AF_WANPIPE", - "AF_X25", - "AI_CANONNAME", - "AI_NUMERICHOST", - "AI_PASSIVE", - "APPLICATION_ERROR", - "ARPHRD_ADAPT", - "ARPHRD_APPLETLK", - "ARPHRD_ARCNET", - "ARPHRD_ASH", - "ARPHRD_ATM", - "ARPHRD_AX25", - "ARPHRD_BIF", - "ARPHRD_CHAOS", - "ARPHRD_CISCO", - "ARPHRD_CSLIP", - "ARPHRD_CSLIP6", - "ARPHRD_DDCMP", - "ARPHRD_DLCI", - "ARPHRD_ECONET", - "ARPHRD_EETHER", - "ARPHRD_ETHER", - "ARPHRD_EUI64", - "ARPHRD_FCAL", - "ARPHRD_FCFABRIC", - "ARPHRD_FCPL", - "ARPHRD_FCPP", - "ARPHRD_FDDI", - "ARPHRD_FRAD", - "ARPHRD_FRELAY", - "ARPHRD_HDLC", - "ARPHRD_HIPPI", - "ARPHRD_HWX25", - "ARPHRD_IEEE1394", - "ARPHRD_IEEE802", - "ARPHRD_IEEE80211", - "ARPHRD_IEEE80211_PRISM", - "ARPHRD_IEEE80211_RADIOTAP", - "ARPHRD_IEEE802154", - "ARPHRD_IEEE802154_PHY", - "ARPHRD_IEEE802_TR", - "ARPHRD_INFINIBAND", - "ARPHRD_IPDDP", - "ARPHRD_IPGRE", - "ARPHRD_IRDA", - "ARPHRD_LAPB", - "ARPHRD_LOCALTLK", - "ARPHRD_LOOPBACK", - "ARPHRD_METRICOM", - "ARPHRD_NETROM", - "ARPHRD_NONE", - "ARPHRD_PIMREG", - "ARPHRD_PPP", - "ARPHRD_PRONET", - "ARPHRD_RAWHDLC", - "ARPHRD_ROSE", - "ARPHRD_RSRVD", - "ARPHRD_SIT", - "ARPHRD_SKIP", - "ARPHRD_SLIP", - "ARPHRD_SLIP6", - "ARPHRD_STRIP", - "ARPHRD_TUNNEL", - "ARPHRD_TUNNEL6", - "ARPHRD_VOID", - "ARPHRD_X25", - "AUTHTYPE_CLIENT", - "AUTHTYPE_SERVER", - "Accept", - "Accept4", - "AcceptEx", - "Access", - "Acct", - "AddrinfoW", - "Adjtime", - "Adjtimex", - "AttachLsf", - "B0", - "B1000000", - "B110", - "B115200", - "B1152000", - "B1200", - "B134", - "B14400", - "B150", - "B1500000", - "B1800", - "B19200", - "B200", - "B2000000", - "B230400", - "B2400", - "B2500000", - "B28800", - "B300", - "B3000000", - "B3500000", - "B38400", - "B4000000", - "B460800", - "B4800", - "B50", - "B500000", - "B57600", - "B576000", - "B600", - "B7200", - "B75", - "B76800", - "B921600", - "B9600", - "BASE_PROTOCOL", - "BIOCFEEDBACK", - "BIOCFLUSH", - "BIOCGBLEN", - "BIOCGDIRECTION", - "BIOCGDIRFILT", - "BIOCGDLT", - "BIOCGDLTLIST", - "BIOCGETBUFMODE", - "BIOCGETIF", - "BIOCGETZMAX", - "BIOCGFEEDBACK", - "BIOCGFILDROP", - "BIOCGHDRCMPLT", - "BIOCGRSIG", - "BIOCGRTIMEOUT", - "BIOCGSEESENT", - "BIOCGSTATS", - "BIOCGSTATSOLD", - "BIOCGTSTAMP", - "BIOCIMMEDIATE", - "BIOCLOCK", - "BIOCPROMISC", - "BIOCROTZBUF", - "BIOCSBLEN", - "BIOCSDIRECTION", - "BIOCSDIRFILT", - "BIOCSDLT", - "BIOCSETBUFMODE", - "BIOCSETF", - "BIOCSETFNR", - "BIOCSETIF", - "BIOCSETWF", - "BIOCSETZBUF", - "BIOCSFEEDBACK", - "BIOCSFILDROP", - "BIOCSHDRCMPLT", - "BIOCSRSIG", - "BIOCSRTIMEOUT", - "BIOCSSEESENT", - "BIOCSTCPF", - "BIOCSTSTAMP", - "BIOCSUDPF", - "BIOCVERSION", - "BPF_A", - "BPF_ABS", - "BPF_ADD", - "BPF_ALIGNMENT", - "BPF_ALIGNMENT32", - "BPF_ALU", - "BPF_AND", - "BPF_B", - "BPF_BUFMODE_BUFFER", - "BPF_BUFMODE_ZBUF", - "BPF_DFLTBUFSIZE", - "BPF_DIRECTION_IN", - "BPF_DIRECTION_OUT", - "BPF_DIV", - "BPF_H", - "BPF_IMM", - "BPF_IND", - "BPF_JA", - "BPF_JEQ", - "BPF_JGE", - "BPF_JGT", - "BPF_JMP", - "BPF_JSET", - "BPF_K", - "BPF_LD", - "BPF_LDX", - "BPF_LEN", - "BPF_LSH", - "BPF_MAJOR_VERSION", - "BPF_MAXBUFSIZE", - "BPF_MAXINSNS", - "BPF_MEM", - "BPF_MEMWORDS", - "BPF_MINBUFSIZE", - "BPF_MINOR_VERSION", - "BPF_MISC", - "BPF_MSH", - "BPF_MUL", - "BPF_NEG", - "BPF_OR", - "BPF_RELEASE", - "BPF_RET", - "BPF_RSH", - "BPF_ST", - "BPF_STX", - "BPF_SUB", - "BPF_TAX", - "BPF_TXA", - "BPF_T_BINTIME", - "BPF_T_BINTIME_FAST", - "BPF_T_BINTIME_MONOTONIC", - "BPF_T_BINTIME_MONOTONIC_FAST", - "BPF_T_FAST", - "BPF_T_FLAG_MASK", - "BPF_T_FORMAT_MASK", - "BPF_T_MICROTIME", - "BPF_T_MICROTIME_FAST", - "BPF_T_MICROTIME_MONOTONIC", - "BPF_T_MICROTIME_MONOTONIC_FAST", - "BPF_T_MONOTONIC", - "BPF_T_MONOTONIC_FAST", - "BPF_T_NANOTIME", - "BPF_T_NANOTIME_FAST", - "BPF_T_NANOTIME_MONOTONIC", - "BPF_T_NANOTIME_MONOTONIC_FAST", - "BPF_T_NONE", - "BPF_T_NORMAL", - "BPF_W", - "BPF_X", - "BRKINT", - "Bind", - "BindToDevice", - "BpfBuflen", - "BpfDatalink", - "BpfHdr", - "BpfHeadercmpl", - "BpfInsn", - "BpfInterface", - "BpfJump", - "BpfProgram", - "BpfStat", - "BpfStats", - "BpfStmt", - "BpfTimeout", - "BpfTimeval", - "BpfVersion", - "BpfZbuf", - "BpfZbufHeader", - "ByHandleFileInformation", - "BytePtrFromString", - "ByteSliceFromString", - "CCR0_FLUSH", - "CERT_CHAIN_POLICY_AUTHENTICODE", - "CERT_CHAIN_POLICY_AUTHENTICODE_TS", - "CERT_CHAIN_POLICY_BASE", - "CERT_CHAIN_POLICY_BASIC_CONSTRAINTS", - "CERT_CHAIN_POLICY_EV", - "CERT_CHAIN_POLICY_MICROSOFT_ROOT", - "CERT_CHAIN_POLICY_NT_AUTH", - "CERT_CHAIN_POLICY_SSL", - "CERT_E_CN_NO_MATCH", - "CERT_E_EXPIRED", - "CERT_E_PURPOSE", - "CERT_E_ROLE", - "CERT_E_UNTRUSTEDROOT", - "CERT_STORE_ADD_ALWAYS", - "CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG", - "CERT_STORE_PROV_MEMORY", - "CERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT", - "CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT", - "CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT", - "CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT", - "CERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT", - "CERT_TRUST_INVALID_BASIC_CONSTRAINTS", - "CERT_TRUST_INVALID_EXTENSION", - "CERT_TRUST_INVALID_NAME_CONSTRAINTS", - "CERT_TRUST_INVALID_POLICY_CONSTRAINTS", - "CERT_TRUST_IS_CYCLIC", - "CERT_TRUST_IS_EXPLICIT_DISTRUST", - "CERT_TRUST_IS_NOT_SIGNATURE_VALID", - "CERT_TRUST_IS_NOT_TIME_VALID", - "CERT_TRUST_IS_NOT_VALID_FOR_USAGE", - "CERT_TRUST_IS_OFFLINE_REVOCATION", - "CERT_TRUST_IS_REVOKED", - "CERT_TRUST_IS_UNTRUSTED_ROOT", - "CERT_TRUST_NO_ERROR", - "CERT_TRUST_NO_ISSUANCE_CHAIN_POLICY", - "CERT_TRUST_REVOCATION_STATUS_UNKNOWN", - "CFLUSH", - "CLOCAL", - "CLONE_CHILD_CLEARTID", - "CLONE_CHILD_SETTID", - "CLONE_CSIGNAL", - "CLONE_DETACHED", - "CLONE_FILES", - "CLONE_FS", - "CLONE_IO", - "CLONE_NEWIPC", - "CLONE_NEWNET", - "CLONE_NEWNS", - "CLONE_NEWPID", - "CLONE_NEWUSER", - "CLONE_NEWUTS", - "CLONE_PARENT", - "CLONE_PARENT_SETTID", - "CLONE_PID", - "CLONE_PTRACE", - "CLONE_SETTLS", - "CLONE_SIGHAND", - "CLONE_SYSVSEM", - "CLONE_THREAD", - "CLONE_UNTRACED", - "CLONE_VFORK", - "CLONE_VM", - "CPUID_CFLUSH", - "CREAD", - "CREATE_ALWAYS", - "CREATE_NEW", - "CREATE_NEW_PROCESS_GROUP", - "CREATE_UNICODE_ENVIRONMENT", - "CRYPT_DEFAULT_CONTAINER_OPTIONAL", - "CRYPT_DELETEKEYSET", - "CRYPT_MACHINE_KEYSET", - "CRYPT_NEWKEYSET", - "CRYPT_SILENT", - "CRYPT_VERIFYCONTEXT", - "CS5", - "CS6", - "CS7", - "CS8", - "CSIZE", - "CSTART", - "CSTATUS", - "CSTOP", - "CSTOPB", - "CSUSP", - "CTL_MAXNAME", - "CTL_NET", - "CTL_QUERY", - "CTRL_BREAK_EVENT", - "CTRL_C_EVENT", - "CancelIo", - "CancelIoEx", - "CertAddCertificateContextToStore", - "CertChainContext", - "CertChainElement", - "CertChainPara", - "CertChainPolicyPara", - "CertChainPolicyStatus", - "CertCloseStore", - "CertContext", - "CertCreateCertificateContext", - "CertEnhKeyUsage", - "CertEnumCertificatesInStore", - "CertFreeCertificateChain", - "CertFreeCertificateContext", - "CertGetCertificateChain", - "CertInfo", - "CertOpenStore", - "CertOpenSystemStore", - "CertRevocationCrlInfo", - "CertRevocationInfo", - "CertSimpleChain", - "CertTrustListInfo", - "CertTrustStatus", - "CertUsageMatch", - "CertVerifyCertificateChainPolicy", - "Chdir", - "CheckBpfVersion", - "Chflags", - "Chmod", - "Chown", - "Chroot", - "Clearenv", - "Close", - "CloseHandle", - "CloseOnExec", - "Closesocket", - "CmsgLen", - "CmsgSpace", - "Cmsghdr", - "CommandLineToArgv", - "ComputerName", - "Conn", - "Connect", - "ConnectEx", - "ConvertSidToStringSid", - "ConvertStringSidToSid", - "CopySid", - "Creat", - "CreateDirectory", - "CreateFile", - "CreateFileMapping", - "CreateHardLink", - "CreateIoCompletionPort", - "CreatePipe", - "CreateProcess", - "CreateProcessAsUser", - "CreateSymbolicLink", - "CreateToolhelp32Snapshot", - "Credential", - "CryptAcquireContext", - "CryptGenRandom", - "CryptReleaseContext", - "DIOCBSFLUSH", - "DIOCOSFPFLUSH", - "DLL", - "DLLError", - "DLT_A429", - "DLT_A653_ICM", - "DLT_AIRONET_HEADER", - "DLT_AOS", - "DLT_APPLE_IP_OVER_IEEE1394", - "DLT_ARCNET", - "DLT_ARCNET_LINUX", - "DLT_ATM_CLIP", - "DLT_ATM_RFC1483", - "DLT_AURORA", - "DLT_AX25", - "DLT_AX25_KISS", - "DLT_BACNET_MS_TP", - "DLT_BLUETOOTH_HCI_H4", - "DLT_BLUETOOTH_HCI_H4_WITH_PHDR", - "DLT_CAN20B", - "DLT_CAN_SOCKETCAN", - "DLT_CHAOS", - "DLT_CHDLC", - "DLT_CISCO_IOS", - "DLT_C_HDLC", - "DLT_C_HDLC_WITH_DIR", - "DLT_DBUS", - "DLT_DECT", - "DLT_DOCSIS", - "DLT_DVB_CI", - "DLT_ECONET", - "DLT_EN10MB", - "DLT_EN3MB", - "DLT_ENC", - "DLT_ERF", - "DLT_ERF_ETH", - "DLT_ERF_POS", - "DLT_FC_2", - "DLT_FC_2_WITH_FRAME_DELIMS", - "DLT_FDDI", - "DLT_FLEXRAY", - "DLT_FRELAY", - "DLT_FRELAY_WITH_DIR", - "DLT_GCOM_SERIAL", - "DLT_GCOM_T1E1", - "DLT_GPF_F", - "DLT_GPF_T", - "DLT_GPRS_LLC", - "DLT_GSMTAP_ABIS", - "DLT_GSMTAP_UM", - "DLT_HDLC", - "DLT_HHDLC", - "DLT_HIPPI", - "DLT_IBM_SN", - "DLT_IBM_SP", - "DLT_IEEE802", - "DLT_IEEE802_11", - "DLT_IEEE802_11_RADIO", - "DLT_IEEE802_11_RADIO_AVS", - "DLT_IEEE802_15_4", - "DLT_IEEE802_15_4_LINUX", - "DLT_IEEE802_15_4_NOFCS", - "DLT_IEEE802_15_4_NONASK_PHY", - "DLT_IEEE802_16_MAC_CPS", - "DLT_IEEE802_16_MAC_CPS_RADIO", - "DLT_IPFILTER", - "DLT_IPMB", - "DLT_IPMB_LINUX", - "DLT_IPNET", - "DLT_IPOIB", - "DLT_IPV4", - "DLT_IPV6", - "DLT_IP_OVER_FC", - "DLT_JUNIPER_ATM1", - "DLT_JUNIPER_ATM2", - "DLT_JUNIPER_ATM_CEMIC", - "DLT_JUNIPER_CHDLC", - "DLT_JUNIPER_ES", - "DLT_JUNIPER_ETHER", - "DLT_JUNIPER_FIBRECHANNEL", - "DLT_JUNIPER_FRELAY", - "DLT_JUNIPER_GGSN", - "DLT_JUNIPER_ISM", - "DLT_JUNIPER_MFR", - "DLT_JUNIPER_MLFR", - "DLT_JUNIPER_MLPPP", - "DLT_JUNIPER_MONITOR", - "DLT_JUNIPER_PIC_PEER", - "DLT_JUNIPER_PPP", - "DLT_JUNIPER_PPPOE", - "DLT_JUNIPER_PPPOE_ATM", - "DLT_JUNIPER_SERVICES", - "DLT_JUNIPER_SRX_E2E", - "DLT_JUNIPER_ST", - "DLT_JUNIPER_VP", - "DLT_JUNIPER_VS", - "DLT_LAPB_WITH_DIR", - "DLT_LAPD", - "DLT_LIN", - "DLT_LINUX_EVDEV", - "DLT_LINUX_IRDA", - "DLT_LINUX_LAPD", - "DLT_LINUX_PPP_WITHDIRECTION", - "DLT_LINUX_SLL", - "DLT_LOOP", - "DLT_LTALK", - "DLT_MATCHING_MAX", - "DLT_MATCHING_MIN", - "DLT_MFR", - "DLT_MOST", - "DLT_MPEG_2_TS", - "DLT_MPLS", - "DLT_MTP2", - "DLT_MTP2_WITH_PHDR", - "DLT_MTP3", - "DLT_MUX27010", - "DLT_NETANALYZER", - "DLT_NETANALYZER_TRANSPARENT", - "DLT_NFC_LLCP", - "DLT_NFLOG", - "DLT_NG40", - "DLT_NULL", - "DLT_PCI_EXP", - "DLT_PFLOG", - "DLT_PFSYNC", - "DLT_PPI", - "DLT_PPP", - "DLT_PPP_BSDOS", - "DLT_PPP_ETHER", - "DLT_PPP_PPPD", - "DLT_PPP_SERIAL", - "DLT_PPP_WITH_DIR", - "DLT_PPP_WITH_DIRECTION", - "DLT_PRISM_HEADER", - "DLT_PRONET", - "DLT_RAIF1", - "DLT_RAW", - "DLT_RAWAF_MASK", - "DLT_RIO", - "DLT_SCCP", - "DLT_SITA", - "DLT_SLIP", - "DLT_SLIP_BSDOS", - "DLT_STANAG_5066_D_PDU", - "DLT_SUNATM", - "DLT_SYMANTEC_FIREWALL", - "DLT_TZSP", - "DLT_USB", - "DLT_USB_LINUX", - "DLT_USB_LINUX_MMAPPED", - "DLT_USER0", - "DLT_USER1", - "DLT_USER10", - "DLT_USER11", - "DLT_USER12", - "DLT_USER13", - "DLT_USER14", - "DLT_USER15", - "DLT_USER2", - "DLT_USER3", - "DLT_USER4", - "DLT_USER5", - "DLT_USER6", - "DLT_USER7", - "DLT_USER8", - "DLT_USER9", - "DLT_WIHART", - "DLT_X2E_SERIAL", - "DLT_X2E_XORAYA", - "DNSMXData", - "DNSPTRData", - "DNSRecord", - "DNSSRVData", - "DNSTXTData", - "DNS_INFO_NO_RECORDS", - "DNS_TYPE_A", - "DNS_TYPE_A6", - "DNS_TYPE_AAAA", - "DNS_TYPE_ADDRS", - "DNS_TYPE_AFSDB", - "DNS_TYPE_ALL", - "DNS_TYPE_ANY", - "DNS_TYPE_ATMA", - "DNS_TYPE_AXFR", - "DNS_TYPE_CERT", - "DNS_TYPE_CNAME", - "DNS_TYPE_DHCID", - "DNS_TYPE_DNAME", - "DNS_TYPE_DNSKEY", - "DNS_TYPE_DS", - "DNS_TYPE_EID", - "DNS_TYPE_GID", - "DNS_TYPE_GPOS", - "DNS_TYPE_HINFO", - "DNS_TYPE_ISDN", - "DNS_TYPE_IXFR", - "DNS_TYPE_KEY", - "DNS_TYPE_KX", - "DNS_TYPE_LOC", - "DNS_TYPE_MAILA", - "DNS_TYPE_MAILB", - "DNS_TYPE_MB", - "DNS_TYPE_MD", - "DNS_TYPE_MF", - "DNS_TYPE_MG", - "DNS_TYPE_MINFO", - "DNS_TYPE_MR", - "DNS_TYPE_MX", - "DNS_TYPE_NAPTR", - "DNS_TYPE_NBSTAT", - "DNS_TYPE_NIMLOC", - "DNS_TYPE_NS", - "DNS_TYPE_NSAP", - "DNS_TYPE_NSAPPTR", - "DNS_TYPE_NSEC", - "DNS_TYPE_NULL", - "DNS_TYPE_NXT", - "DNS_TYPE_OPT", - "DNS_TYPE_PTR", - "DNS_TYPE_PX", - "DNS_TYPE_RP", - "DNS_TYPE_RRSIG", - "DNS_TYPE_RT", - "DNS_TYPE_SIG", - "DNS_TYPE_SINK", - "DNS_TYPE_SOA", - "DNS_TYPE_SRV", - "DNS_TYPE_TEXT", - "DNS_TYPE_TKEY", - "DNS_TYPE_TSIG", - "DNS_TYPE_UID", - "DNS_TYPE_UINFO", - "DNS_TYPE_UNSPEC", - "DNS_TYPE_WINS", - "DNS_TYPE_WINSR", - "DNS_TYPE_WKS", - "DNS_TYPE_X25", - "DT_BLK", - "DT_CHR", - "DT_DIR", - "DT_FIFO", - "DT_LNK", - "DT_REG", - "DT_SOCK", - "DT_UNKNOWN", - "DT_WHT", - "DUPLICATE_CLOSE_SOURCE", - "DUPLICATE_SAME_ACCESS", - "DeleteFile", - "DetachLsf", - "DeviceIoControl", - "Dirent", - "DnsNameCompare", - "DnsQuery", - "DnsRecordListFree", - "DnsSectionAdditional", - "DnsSectionAnswer", - "DnsSectionAuthority", - "DnsSectionQuestion", - "Dup", - "Dup2", - "Dup3", - "DuplicateHandle", - "E2BIG", - "EACCES", - "EADDRINUSE", - "EADDRNOTAVAIL", - "EADV", - "EAFNOSUPPORT", - "EAGAIN", - "EALREADY", - "EAUTH", - "EBADARCH", - "EBADE", - "EBADEXEC", - "EBADF", - "EBADFD", - "EBADMACHO", - "EBADMSG", - "EBADR", - "EBADRPC", - "EBADRQC", - "EBADSLT", - "EBFONT", - "EBUSY", - "ECANCELED", - "ECAPMODE", - "ECHILD", - "ECHO", - "ECHOCTL", - "ECHOE", - "ECHOK", - "ECHOKE", - "ECHONL", - "ECHOPRT", - "ECHRNG", - "ECOMM", - "ECONNABORTED", - "ECONNREFUSED", - "ECONNRESET", - "EDEADLK", - "EDEADLOCK", - "EDESTADDRREQ", - "EDEVERR", - "EDOM", - "EDOOFUS", - "EDOTDOT", - "EDQUOT", - "EEXIST", - "EFAULT", - "EFBIG", - "EFER_LMA", - "EFER_LME", - "EFER_NXE", - "EFER_SCE", - "EFTYPE", - "EHOSTDOWN", - "EHOSTUNREACH", - "EHWPOISON", - "EIDRM", - "EILSEQ", - "EINPROGRESS", - "EINTR", - "EINVAL", - "EIO", - "EIPSEC", - "EISCONN", - "EISDIR", - "EISNAM", - "EKEYEXPIRED", - "EKEYREJECTED", - "EKEYREVOKED", - "EL2HLT", - "EL2NSYNC", - "EL3HLT", - "EL3RST", - "ELAST", - "ELF_NGREG", - "ELF_PRARGSZ", - "ELIBACC", - "ELIBBAD", - "ELIBEXEC", - "ELIBMAX", - "ELIBSCN", - "ELNRNG", - "ELOOP", - "EMEDIUMTYPE", - "EMFILE", - "EMLINK", - "EMSGSIZE", - "EMT_TAGOVF", - "EMULTIHOP", - "EMUL_ENABLED", - "EMUL_LINUX", - "EMUL_LINUX32", - "EMUL_MAXID", - "EMUL_NATIVE", - "ENAMETOOLONG", - "ENAVAIL", - "ENDRUNDISC", - "ENEEDAUTH", - "ENETDOWN", - "ENETRESET", - "ENETUNREACH", - "ENFILE", - "ENOANO", - "ENOATTR", - "ENOBUFS", - "ENOCSI", - "ENODATA", - "ENODEV", - "ENOENT", - "ENOEXEC", - "ENOKEY", - "ENOLCK", - "ENOLINK", - "ENOMEDIUM", - "ENOMEM", - "ENOMSG", - "ENONET", - "ENOPKG", - "ENOPOLICY", - "ENOPROTOOPT", - "ENOSPC", - "ENOSR", - "ENOSTR", - "ENOSYS", - "ENOTBLK", - "ENOTCAPABLE", - "ENOTCONN", - "ENOTDIR", - "ENOTEMPTY", - "ENOTNAM", - "ENOTRECOVERABLE", - "ENOTSOCK", - "ENOTSUP", - "ENOTTY", - "ENOTUNIQ", - "ENXIO", - "EN_SW_CTL_INF", - "EN_SW_CTL_PREC", - "EN_SW_CTL_ROUND", - "EN_SW_DATACHAIN", - "EN_SW_DENORM", - "EN_SW_INVOP", - "EN_SW_OVERFLOW", - "EN_SW_PRECLOSS", - "EN_SW_UNDERFLOW", - "EN_SW_ZERODIV", - "EOPNOTSUPP", - "EOVERFLOW", - "EOWNERDEAD", - "EPERM", - "EPFNOSUPPORT", - "EPIPE", - "EPOLLERR", - "EPOLLET", - "EPOLLHUP", - "EPOLLIN", - "EPOLLMSG", - "EPOLLONESHOT", - "EPOLLOUT", - "EPOLLPRI", - "EPOLLRDBAND", - "EPOLLRDHUP", - "EPOLLRDNORM", - "EPOLLWRBAND", - "EPOLLWRNORM", - "EPOLL_CLOEXEC", - "EPOLL_CTL_ADD", - "EPOLL_CTL_DEL", - "EPOLL_CTL_MOD", - "EPOLL_NONBLOCK", - "EPROCLIM", - "EPROCUNAVAIL", - "EPROGMISMATCH", - "EPROGUNAVAIL", - "EPROTO", - "EPROTONOSUPPORT", - "EPROTOTYPE", - "EPWROFF", - "ERANGE", - "EREMCHG", - "EREMOTE", - "EREMOTEIO", - "ERESTART", - "ERFKILL", - "EROFS", - "ERPCMISMATCH", - "ERROR_ACCESS_DENIED", - "ERROR_ALREADY_EXISTS", - "ERROR_BROKEN_PIPE", - "ERROR_BUFFER_OVERFLOW", - "ERROR_DIR_NOT_EMPTY", - "ERROR_ENVVAR_NOT_FOUND", - "ERROR_FILE_EXISTS", - "ERROR_FILE_NOT_FOUND", - "ERROR_HANDLE_EOF", - "ERROR_INSUFFICIENT_BUFFER", - "ERROR_IO_PENDING", - "ERROR_MOD_NOT_FOUND", - "ERROR_MORE_DATA", - "ERROR_NETNAME_DELETED", - "ERROR_NOT_FOUND", - "ERROR_NO_MORE_FILES", - "ERROR_OPERATION_ABORTED", - "ERROR_PATH_NOT_FOUND", - "ERROR_PRIVILEGE_NOT_HELD", - "ERROR_PROC_NOT_FOUND", - "ESHLIBVERS", - "ESHUTDOWN", - "ESOCKTNOSUPPORT", - "ESPIPE", - "ESRCH", - "ESRMNT", - "ESTALE", - "ESTRPIPE", - "ETHERCAP_JUMBO_MTU", - "ETHERCAP_VLAN_HWTAGGING", - "ETHERCAP_VLAN_MTU", - "ETHERMIN", - "ETHERMTU", - "ETHERMTU_JUMBO", - "ETHERTYPE_8023", - "ETHERTYPE_AARP", - "ETHERTYPE_ACCTON", - "ETHERTYPE_AEONIC", - "ETHERTYPE_ALPHA", - "ETHERTYPE_AMBER", - "ETHERTYPE_AMOEBA", - "ETHERTYPE_AOE", - "ETHERTYPE_APOLLO", - "ETHERTYPE_APOLLODOMAIN", - "ETHERTYPE_APPLETALK", - "ETHERTYPE_APPLITEK", - "ETHERTYPE_ARGONAUT", - "ETHERTYPE_ARP", - "ETHERTYPE_AT", - "ETHERTYPE_ATALK", - "ETHERTYPE_ATOMIC", - "ETHERTYPE_ATT", - "ETHERTYPE_ATTSTANFORD", - "ETHERTYPE_AUTOPHON", - "ETHERTYPE_AXIS", - "ETHERTYPE_BCLOOP", - "ETHERTYPE_BOFL", - "ETHERTYPE_CABLETRON", - "ETHERTYPE_CHAOS", - "ETHERTYPE_COMDESIGN", - "ETHERTYPE_COMPUGRAPHIC", - "ETHERTYPE_COUNTERPOINT", - "ETHERTYPE_CRONUS", - "ETHERTYPE_CRONUSVLN", - "ETHERTYPE_DCA", - "ETHERTYPE_DDE", - "ETHERTYPE_DEBNI", - "ETHERTYPE_DECAM", - "ETHERTYPE_DECCUST", - "ETHERTYPE_DECDIAG", - "ETHERTYPE_DECDNS", - "ETHERTYPE_DECDTS", - "ETHERTYPE_DECEXPER", - "ETHERTYPE_DECLAST", - "ETHERTYPE_DECLTM", - "ETHERTYPE_DECMUMPS", - "ETHERTYPE_DECNETBIOS", - "ETHERTYPE_DELTACON", - "ETHERTYPE_DIDDLE", - "ETHERTYPE_DLOG1", - "ETHERTYPE_DLOG2", - "ETHERTYPE_DN", - "ETHERTYPE_DOGFIGHT", - "ETHERTYPE_DSMD", - "ETHERTYPE_ECMA", - "ETHERTYPE_ENCRYPT", - "ETHERTYPE_ES", - "ETHERTYPE_EXCELAN", - "ETHERTYPE_EXPERDATA", - "ETHERTYPE_FLIP", - "ETHERTYPE_FLOWCONTROL", - "ETHERTYPE_FRARP", - "ETHERTYPE_GENDYN", - "ETHERTYPE_HAYES", - "ETHERTYPE_HIPPI_FP", - "ETHERTYPE_HITACHI", - "ETHERTYPE_HP", - "ETHERTYPE_IEEEPUP", - "ETHERTYPE_IEEEPUPAT", - "ETHERTYPE_IMLBL", - "ETHERTYPE_IMLBLDIAG", - "ETHERTYPE_IP", - "ETHERTYPE_IPAS", - "ETHERTYPE_IPV6", - "ETHERTYPE_IPX", - "ETHERTYPE_IPXNEW", - "ETHERTYPE_KALPANA", - "ETHERTYPE_LANBRIDGE", - "ETHERTYPE_LANPROBE", - "ETHERTYPE_LAT", - "ETHERTYPE_LBACK", - "ETHERTYPE_LITTLE", - "ETHERTYPE_LLDP", - "ETHERTYPE_LOGICRAFT", - "ETHERTYPE_LOOPBACK", - "ETHERTYPE_MATRA", - "ETHERTYPE_MAX", - "ETHERTYPE_MERIT", - "ETHERTYPE_MICP", - "ETHERTYPE_MOPDL", - "ETHERTYPE_MOPRC", - "ETHERTYPE_MOTOROLA", - "ETHERTYPE_MPLS", - "ETHERTYPE_MPLS_MCAST", - "ETHERTYPE_MUMPS", - "ETHERTYPE_NBPCC", - "ETHERTYPE_NBPCLAIM", - "ETHERTYPE_NBPCLREQ", - "ETHERTYPE_NBPCLRSP", - "ETHERTYPE_NBPCREQ", - "ETHERTYPE_NBPCRSP", - "ETHERTYPE_NBPDG", - "ETHERTYPE_NBPDGB", - "ETHERTYPE_NBPDLTE", - "ETHERTYPE_NBPRAR", - "ETHERTYPE_NBPRAS", - "ETHERTYPE_NBPRST", - "ETHERTYPE_NBPSCD", - "ETHERTYPE_NBPVCD", - "ETHERTYPE_NBS", - "ETHERTYPE_NCD", - "ETHERTYPE_NESTAR", - "ETHERTYPE_NETBEUI", - "ETHERTYPE_NOVELL", - "ETHERTYPE_NS", - "ETHERTYPE_NSAT", - "ETHERTYPE_NSCOMPAT", - "ETHERTYPE_NTRAILER", - "ETHERTYPE_OS9", - "ETHERTYPE_OS9NET", - "ETHERTYPE_PACER", - "ETHERTYPE_PAE", - "ETHERTYPE_PCS", - "ETHERTYPE_PLANNING", - "ETHERTYPE_PPP", - "ETHERTYPE_PPPOE", - "ETHERTYPE_PPPOEDISC", - "ETHERTYPE_PRIMENTS", - "ETHERTYPE_PUP", - "ETHERTYPE_PUPAT", - "ETHERTYPE_QINQ", - "ETHERTYPE_RACAL", - "ETHERTYPE_RATIONAL", - "ETHERTYPE_RAWFR", - "ETHERTYPE_RCL", - "ETHERTYPE_RDP", - "ETHERTYPE_RETIX", - "ETHERTYPE_REVARP", - "ETHERTYPE_SCA", - "ETHERTYPE_SECTRA", - "ETHERTYPE_SECUREDATA", - "ETHERTYPE_SGITW", - "ETHERTYPE_SG_BOUNCE", - "ETHERTYPE_SG_DIAG", - "ETHERTYPE_SG_NETGAMES", - "ETHERTYPE_SG_RESV", - "ETHERTYPE_SIMNET", - "ETHERTYPE_SLOW", - "ETHERTYPE_SLOWPROTOCOLS", - "ETHERTYPE_SNA", - "ETHERTYPE_SNMP", - "ETHERTYPE_SONIX", - "ETHERTYPE_SPIDER", - "ETHERTYPE_SPRITE", - "ETHERTYPE_STP", - "ETHERTYPE_TALARIS", - "ETHERTYPE_TALARISMC", - "ETHERTYPE_TCPCOMP", - "ETHERTYPE_TCPSM", - "ETHERTYPE_TEC", - "ETHERTYPE_TIGAN", - "ETHERTYPE_TRAIL", - "ETHERTYPE_TRANSETHER", - "ETHERTYPE_TYMSHARE", - "ETHERTYPE_UBBST", - "ETHERTYPE_UBDEBUG", - "ETHERTYPE_UBDIAGLOOP", - "ETHERTYPE_UBDL", - "ETHERTYPE_UBNIU", - "ETHERTYPE_UBNMC", - "ETHERTYPE_VALID", - "ETHERTYPE_VARIAN", - "ETHERTYPE_VAXELN", - "ETHERTYPE_VEECO", - "ETHERTYPE_VEXP", - "ETHERTYPE_VGLAB", - "ETHERTYPE_VINES", - "ETHERTYPE_VINESECHO", - "ETHERTYPE_VINESLOOP", - "ETHERTYPE_VITAL", - "ETHERTYPE_VLAN", - "ETHERTYPE_VLTLMAN", - "ETHERTYPE_VPROD", - "ETHERTYPE_VURESERVED", - "ETHERTYPE_WATERLOO", - "ETHERTYPE_WELLFLEET", - "ETHERTYPE_X25", - "ETHERTYPE_X75", - "ETHERTYPE_XNSSM", - "ETHERTYPE_XTP", - "ETHER_ADDR_LEN", - "ETHER_ALIGN", - "ETHER_CRC_LEN", - "ETHER_CRC_POLY_BE", - "ETHER_CRC_POLY_LE", - "ETHER_HDR_LEN", - "ETHER_MAX_DIX_LEN", - "ETHER_MAX_LEN", - "ETHER_MAX_LEN_JUMBO", - "ETHER_MIN_LEN", - "ETHER_PPPOE_ENCAP_LEN", - "ETHER_TYPE_LEN", - "ETHER_VLAN_ENCAP_LEN", - "ETH_P_1588", - "ETH_P_8021Q", - "ETH_P_802_2", - "ETH_P_802_3", - "ETH_P_AARP", - "ETH_P_ALL", - "ETH_P_AOE", - "ETH_P_ARCNET", - "ETH_P_ARP", - "ETH_P_ATALK", - "ETH_P_ATMFATE", - "ETH_P_ATMMPOA", - "ETH_P_AX25", - "ETH_P_BPQ", - "ETH_P_CAIF", - "ETH_P_CAN", - "ETH_P_CONTROL", - "ETH_P_CUST", - "ETH_P_DDCMP", - "ETH_P_DEC", - "ETH_P_DIAG", - "ETH_P_DNA_DL", - "ETH_P_DNA_RC", - "ETH_P_DNA_RT", - "ETH_P_DSA", - "ETH_P_ECONET", - "ETH_P_EDSA", - "ETH_P_FCOE", - "ETH_P_FIP", - "ETH_P_HDLC", - "ETH_P_IEEE802154", - "ETH_P_IEEEPUP", - "ETH_P_IEEEPUPAT", - "ETH_P_IP", - "ETH_P_IPV6", - "ETH_P_IPX", - "ETH_P_IRDA", - "ETH_P_LAT", - "ETH_P_LINK_CTL", - "ETH_P_LOCALTALK", - "ETH_P_LOOP", - "ETH_P_MOBITEX", - "ETH_P_MPLS_MC", - "ETH_P_MPLS_UC", - "ETH_P_PAE", - "ETH_P_PAUSE", - "ETH_P_PHONET", - "ETH_P_PPPTALK", - "ETH_P_PPP_DISC", - "ETH_P_PPP_MP", - "ETH_P_PPP_SES", - "ETH_P_PUP", - "ETH_P_PUPAT", - "ETH_P_RARP", - "ETH_P_SCA", - "ETH_P_SLOW", - "ETH_P_SNAP", - "ETH_P_TEB", - "ETH_P_TIPC", - "ETH_P_TRAILER", - "ETH_P_TR_802_2", - "ETH_P_WAN_PPP", - "ETH_P_WCCP", - "ETH_P_X25", - "ETIME", - "ETIMEDOUT", - "ETOOMANYREFS", - "ETXTBSY", - "EUCLEAN", - "EUNATCH", - "EUSERS", - "EVFILT_AIO", - "EVFILT_FS", - "EVFILT_LIO", - "EVFILT_MACHPORT", - "EVFILT_PROC", - "EVFILT_READ", - "EVFILT_SIGNAL", - "EVFILT_SYSCOUNT", - "EVFILT_THREADMARKER", - "EVFILT_TIMER", - "EVFILT_USER", - "EVFILT_VM", - "EVFILT_VNODE", - "EVFILT_WRITE", - "EV_ADD", - "EV_CLEAR", - "EV_DELETE", - "EV_DISABLE", - "EV_DISPATCH", - "EV_DROP", - "EV_ENABLE", - "EV_EOF", - "EV_ERROR", - "EV_FLAG0", - "EV_FLAG1", - "EV_ONESHOT", - "EV_OOBAND", - "EV_POLL", - "EV_RECEIPT", - "EV_SYSFLAGS", - "EWINDOWS", - "EWOULDBLOCK", - "EXDEV", - "EXFULL", - "EXTA", - "EXTB", - "EXTPROC", - "Environ", - "EpollCreate", - "EpollCreate1", - "EpollCtl", - "EpollEvent", - "EpollWait", - "Errno", - "EscapeArg", - "Exchangedata", - "Exec", - "Exit", - "ExitProcess", - "FD_CLOEXEC", - "FD_SETSIZE", - "FILE_ACTION_ADDED", - "FILE_ACTION_MODIFIED", - "FILE_ACTION_REMOVED", - "FILE_ACTION_RENAMED_NEW_NAME", - "FILE_ACTION_RENAMED_OLD_NAME", - "FILE_APPEND_DATA", - "FILE_ATTRIBUTE_ARCHIVE", - "FILE_ATTRIBUTE_DIRECTORY", - "FILE_ATTRIBUTE_HIDDEN", - "FILE_ATTRIBUTE_NORMAL", - "FILE_ATTRIBUTE_READONLY", - "FILE_ATTRIBUTE_REPARSE_POINT", - "FILE_ATTRIBUTE_SYSTEM", - "FILE_BEGIN", - "FILE_CURRENT", - "FILE_END", - "FILE_FLAG_BACKUP_SEMANTICS", - "FILE_FLAG_OPEN_REPARSE_POINT", - "FILE_FLAG_OVERLAPPED", - "FILE_LIST_DIRECTORY", - "FILE_MAP_COPY", - "FILE_MAP_EXECUTE", - "FILE_MAP_READ", - "FILE_MAP_WRITE", - "FILE_NOTIFY_CHANGE_ATTRIBUTES", - "FILE_NOTIFY_CHANGE_CREATION", - "FILE_NOTIFY_CHANGE_DIR_NAME", - "FILE_NOTIFY_CHANGE_FILE_NAME", - "FILE_NOTIFY_CHANGE_LAST_ACCESS", - "FILE_NOTIFY_CHANGE_LAST_WRITE", - "FILE_NOTIFY_CHANGE_SIZE", - "FILE_SHARE_DELETE", - "FILE_SHARE_READ", - "FILE_SHARE_WRITE", - "FILE_SKIP_COMPLETION_PORT_ON_SUCCESS", - "FILE_SKIP_SET_EVENT_ON_HANDLE", - "FILE_TYPE_CHAR", - "FILE_TYPE_DISK", - "FILE_TYPE_PIPE", - "FILE_TYPE_REMOTE", - "FILE_TYPE_UNKNOWN", - "FILE_WRITE_ATTRIBUTES", - "FLUSHO", - "FORMAT_MESSAGE_ALLOCATE_BUFFER", - "FORMAT_MESSAGE_ARGUMENT_ARRAY", - "FORMAT_MESSAGE_FROM_HMODULE", - "FORMAT_MESSAGE_FROM_STRING", - "FORMAT_MESSAGE_FROM_SYSTEM", - "FORMAT_MESSAGE_IGNORE_INSERTS", - "FORMAT_MESSAGE_MAX_WIDTH_MASK", - "FSCTL_GET_REPARSE_POINT", - "F_ADDFILESIGS", - "F_ADDSIGS", - "F_ALLOCATEALL", - "F_ALLOCATECONTIG", - "F_CANCEL", - "F_CHKCLEAN", - "F_CLOSEM", - "F_DUP2FD", - "F_DUP2FD_CLOEXEC", - "F_DUPFD", - "F_DUPFD_CLOEXEC", - "F_EXLCK", - "F_FLUSH_DATA", - "F_FREEZE_FS", - "F_FSCTL", - "F_FSDIRMASK", - "F_FSIN", - "F_FSINOUT", - "F_FSOUT", - "F_FSPRIV", - "F_FSVOID", - "F_FULLFSYNC", - "F_GETFD", - "F_GETFL", - "F_GETLEASE", - "F_GETLK", - "F_GETLK64", - "F_GETLKPID", - "F_GETNOSIGPIPE", - "F_GETOWN", - "F_GETOWN_EX", - "F_GETPATH", - "F_GETPATH_MTMINFO", - "F_GETPIPE_SZ", - "F_GETPROTECTIONCLASS", - "F_GETSIG", - "F_GLOBAL_NOCACHE", - "F_LOCK", - "F_LOG2PHYS", - "F_LOG2PHYS_EXT", - "F_MARKDEPENDENCY", - "F_MAXFD", - "F_NOCACHE", - "F_NODIRECT", - "F_NOTIFY", - "F_OGETLK", - "F_OK", - "F_OSETLK", - "F_OSETLKW", - "F_PARAM_MASK", - "F_PARAM_MAX", - "F_PATHPKG_CHECK", - "F_PEOFPOSMODE", - "F_PREALLOCATE", - "F_RDADVISE", - "F_RDAHEAD", - "F_RDLCK", - "F_READAHEAD", - "F_READBOOTSTRAP", - "F_SETBACKINGSTORE", - "F_SETFD", - "F_SETFL", - "F_SETLEASE", - "F_SETLK", - "F_SETLK64", - "F_SETLKW", - "F_SETLKW64", - "F_SETLK_REMOTE", - "F_SETNOSIGPIPE", - "F_SETOWN", - "F_SETOWN_EX", - "F_SETPIPE_SZ", - "F_SETPROTECTIONCLASS", - "F_SETSIG", - "F_SETSIZE", - "F_SHLCK", - "F_TEST", - "F_THAW_FS", - "F_TLOCK", - "F_ULOCK", - "F_UNLCK", - "F_UNLCKSYS", - "F_VOLPOSMODE", - "F_WRITEBOOTSTRAP", - "F_WRLCK", - "Faccessat", - "Fallocate", - "Fbootstraptransfer_t", - "Fchdir", - "Fchflags", - "Fchmod", - "Fchmodat", - "Fchown", - "Fchownat", - "FcntlFlock", - "FdSet", - "Fdatasync", - "FileNotifyInformation", - "Filetime", - "FindClose", - "FindFirstFile", - "FindNextFile", - "Flock", - "Flock_t", - "FlushBpf", - "FlushFileBuffers", - "FlushViewOfFile", - "ForkExec", - "ForkLock", - "FormatMessage", - "Fpathconf", - "FreeAddrInfoW", - "FreeEnvironmentStrings", - "FreeLibrary", - "Fsid", - "Fstat", - "Fstatat", - "Fstatfs", - "Fstore_t", - "Fsync", - "Ftruncate", - "FullPath", - "Futimes", - "Futimesat", - "GENERIC_ALL", - "GENERIC_EXECUTE", - "GENERIC_READ", - "GENERIC_WRITE", - "GUID", - "GetAcceptExSockaddrs", - "GetAdaptersInfo", - "GetAddrInfoW", - "GetCommandLine", - "GetComputerName", - "GetConsoleMode", - "GetCurrentDirectory", - "GetCurrentProcess", - "GetEnvironmentStrings", - "GetEnvironmentVariable", - "GetExitCodeProcess", - "GetFileAttributes", - "GetFileAttributesEx", - "GetFileExInfoStandard", - "GetFileExMaxInfoLevel", - "GetFileInformationByHandle", - "GetFileType", - "GetFullPathName", - "GetHostByName", - "GetIfEntry", - "GetLastError", - "GetLengthSid", - "GetLongPathName", - "GetProcAddress", - "GetProcessTimes", - "GetProtoByName", - "GetQueuedCompletionStatus", - "GetServByName", - "GetShortPathName", - "GetStartupInfo", - "GetStdHandle", - "GetSystemTimeAsFileTime", - "GetTempPath", - "GetTimeZoneInformation", - "GetTokenInformation", - "GetUserNameEx", - "GetUserProfileDirectory", - "GetVersion", - "Getcwd", - "Getdents", - "Getdirentries", - "Getdtablesize", - "Getegid", - "Getenv", - "Geteuid", - "Getfsstat", - "Getgid", - "Getgroups", - "Getpagesize", - "Getpeername", - "Getpgid", - "Getpgrp", - "Getpid", - "Getppid", - "Getpriority", - "Getrlimit", - "Getrusage", - "Getsid", - "Getsockname", - "Getsockopt", - "GetsockoptByte", - "GetsockoptICMPv6Filter", - "GetsockoptIPMreq", - "GetsockoptIPMreqn", - "GetsockoptIPv6MTUInfo", - "GetsockoptIPv6Mreq", - "GetsockoptInet4Addr", - "GetsockoptInt", - "GetsockoptUcred", - "Gettid", - "Gettimeofday", - "Getuid", - "Getwd", - "Getxattr", - "HANDLE_FLAG_INHERIT", - "HKEY_CLASSES_ROOT", - "HKEY_CURRENT_CONFIG", - "HKEY_CURRENT_USER", - "HKEY_DYN_DATA", - "HKEY_LOCAL_MACHINE", - "HKEY_PERFORMANCE_DATA", - "HKEY_USERS", - "HUPCL", - "Handle", - "Hostent", - "ICANON", - "ICMP6_FILTER", - "ICMPV6_FILTER", - "ICMPv6Filter", - "ICRNL", - "IEXTEN", - "IFAN_ARRIVAL", - "IFAN_DEPARTURE", - "IFA_ADDRESS", - "IFA_ANYCAST", - "IFA_BROADCAST", - "IFA_CACHEINFO", - "IFA_F_DADFAILED", - "IFA_F_DEPRECATED", - "IFA_F_HOMEADDRESS", - "IFA_F_NODAD", - "IFA_F_OPTIMISTIC", - "IFA_F_PERMANENT", - "IFA_F_SECONDARY", - "IFA_F_TEMPORARY", - "IFA_F_TENTATIVE", - "IFA_LABEL", - "IFA_LOCAL", - "IFA_MAX", - "IFA_MULTICAST", - "IFA_ROUTE", - "IFA_UNSPEC", - "IFF_ALLMULTI", - "IFF_ALTPHYS", - "IFF_AUTOMEDIA", - "IFF_BROADCAST", - "IFF_CANTCHANGE", - "IFF_CANTCONFIG", - "IFF_DEBUG", - "IFF_DRV_OACTIVE", - "IFF_DRV_RUNNING", - "IFF_DYING", - "IFF_DYNAMIC", - "IFF_LINK0", - "IFF_LINK1", - "IFF_LINK2", - "IFF_LOOPBACK", - "IFF_MASTER", - "IFF_MONITOR", - "IFF_MULTICAST", - "IFF_NOARP", - "IFF_NOTRAILERS", - "IFF_NO_PI", - "IFF_OACTIVE", - "IFF_ONE_QUEUE", - "IFF_POINTOPOINT", - "IFF_POINTTOPOINT", - "IFF_PORTSEL", - "IFF_PPROMISC", - "IFF_PROMISC", - "IFF_RENAMING", - "IFF_RUNNING", - "IFF_SIMPLEX", - "IFF_SLAVE", - "IFF_SMART", - "IFF_STATICARP", - "IFF_TAP", - "IFF_TUN", - "IFF_TUN_EXCL", - "IFF_UP", - "IFF_VNET_HDR", - "IFLA_ADDRESS", - "IFLA_BROADCAST", - "IFLA_COST", - "IFLA_IFALIAS", - "IFLA_IFNAME", - "IFLA_LINK", - "IFLA_LINKINFO", - "IFLA_LINKMODE", - "IFLA_MAP", - "IFLA_MASTER", - "IFLA_MAX", - "IFLA_MTU", - "IFLA_NET_NS_PID", - "IFLA_OPERSTATE", - "IFLA_PRIORITY", - "IFLA_PROTINFO", - "IFLA_QDISC", - "IFLA_STATS", - "IFLA_TXQLEN", - "IFLA_UNSPEC", - "IFLA_WEIGHT", - "IFLA_WIRELESS", - "IFNAMSIZ", - "IFT_1822", - "IFT_A12MPPSWITCH", - "IFT_AAL2", - "IFT_AAL5", - "IFT_ADSL", - "IFT_AFLANE8023", - "IFT_AFLANE8025", - "IFT_ARAP", - "IFT_ARCNET", - "IFT_ARCNETPLUS", - "IFT_ASYNC", - "IFT_ATM", - "IFT_ATMDXI", - "IFT_ATMFUNI", - "IFT_ATMIMA", - "IFT_ATMLOGICAL", - "IFT_ATMRADIO", - "IFT_ATMSUBINTERFACE", - "IFT_ATMVCIENDPT", - "IFT_ATMVIRTUAL", - "IFT_BGPPOLICYACCOUNTING", - "IFT_BLUETOOTH", - "IFT_BRIDGE", - "IFT_BSC", - "IFT_CARP", - "IFT_CCTEMUL", - "IFT_CELLULAR", - "IFT_CEPT", - "IFT_CES", - "IFT_CHANNEL", - "IFT_CNR", - "IFT_COFFEE", - "IFT_COMPOSITELINK", - "IFT_DCN", - "IFT_DIGITALPOWERLINE", - "IFT_DIGITALWRAPPEROVERHEADCHANNEL", - "IFT_DLSW", - "IFT_DOCSCABLEDOWNSTREAM", - "IFT_DOCSCABLEMACLAYER", - "IFT_DOCSCABLEUPSTREAM", - "IFT_DOCSCABLEUPSTREAMCHANNEL", - "IFT_DS0", - "IFT_DS0BUNDLE", - "IFT_DS1FDL", - "IFT_DS3", - "IFT_DTM", - "IFT_DUMMY", - "IFT_DVBASILN", - "IFT_DVBASIOUT", - "IFT_DVBRCCDOWNSTREAM", - "IFT_DVBRCCMACLAYER", - "IFT_DVBRCCUPSTREAM", - "IFT_ECONET", - "IFT_ENC", - "IFT_EON", - "IFT_EPLRS", - "IFT_ESCON", - "IFT_ETHER", - "IFT_FAITH", - "IFT_FAST", - "IFT_FASTETHER", - "IFT_FASTETHERFX", - "IFT_FDDI", - "IFT_FIBRECHANNEL", - "IFT_FRAMERELAYINTERCONNECT", - "IFT_FRAMERELAYMPI", - "IFT_FRDLCIENDPT", - "IFT_FRELAY", - "IFT_FRELAYDCE", - "IFT_FRF16MFRBUNDLE", - "IFT_FRFORWARD", - "IFT_G703AT2MB", - "IFT_G703AT64K", - "IFT_GIF", - "IFT_GIGABITETHERNET", - "IFT_GR303IDT", - "IFT_GR303RDT", - "IFT_H323GATEKEEPER", - "IFT_H323PROXY", - "IFT_HDH1822", - "IFT_HDLC", - "IFT_HDSL2", - "IFT_HIPERLAN2", - "IFT_HIPPI", - "IFT_HIPPIINTERFACE", - "IFT_HOSTPAD", - "IFT_HSSI", - "IFT_HY", - "IFT_IBM370PARCHAN", - "IFT_IDSL", - "IFT_IEEE1394", - "IFT_IEEE80211", - "IFT_IEEE80212", - "IFT_IEEE8023ADLAG", - "IFT_IFGSN", - "IFT_IMT", - "IFT_INFINIBAND", - "IFT_INTERLEAVE", - "IFT_IP", - "IFT_IPFORWARD", - "IFT_IPOVERATM", - "IFT_IPOVERCDLC", - "IFT_IPOVERCLAW", - "IFT_IPSWITCH", - "IFT_IPXIP", - "IFT_ISDN", - "IFT_ISDNBASIC", - "IFT_ISDNPRIMARY", - "IFT_ISDNS", - "IFT_ISDNU", - "IFT_ISO88022LLC", - "IFT_ISO88023", - "IFT_ISO88024", - "IFT_ISO88025", - "IFT_ISO88025CRFPINT", - "IFT_ISO88025DTR", - "IFT_ISO88025FIBER", - "IFT_ISO88026", - "IFT_ISUP", - "IFT_L2VLAN", - "IFT_L3IPVLAN", - "IFT_L3IPXVLAN", - "IFT_LAPB", - "IFT_LAPD", - "IFT_LAPF", - "IFT_LINEGROUP", - "IFT_LOCALTALK", - "IFT_LOOP", - "IFT_MEDIAMAILOVERIP", - "IFT_MFSIGLINK", - "IFT_MIOX25", - "IFT_MODEM", - "IFT_MPC", - "IFT_MPLS", - "IFT_MPLSTUNNEL", - "IFT_MSDSL", - "IFT_MVL", - "IFT_MYRINET", - "IFT_NFAS", - "IFT_NSIP", - "IFT_OPTICALCHANNEL", - "IFT_OPTICALTRANSPORT", - "IFT_OTHER", - "IFT_P10", - "IFT_P80", - "IFT_PARA", - "IFT_PDP", - "IFT_PFLOG", - "IFT_PFLOW", - "IFT_PFSYNC", - "IFT_PLC", - "IFT_PON155", - "IFT_PON622", - "IFT_POS", - "IFT_PPP", - "IFT_PPPMULTILINKBUNDLE", - "IFT_PROPATM", - "IFT_PROPBWAP2MP", - "IFT_PROPCNLS", - "IFT_PROPDOCSWIRELESSDOWNSTREAM", - "IFT_PROPDOCSWIRELESSMACLAYER", - "IFT_PROPDOCSWIRELESSUPSTREAM", - "IFT_PROPMUX", - "IFT_PROPVIRTUAL", - "IFT_PROPWIRELESSP2P", - "IFT_PTPSERIAL", - "IFT_PVC", - "IFT_Q2931", - "IFT_QLLC", - "IFT_RADIOMAC", - "IFT_RADSL", - "IFT_REACHDSL", - "IFT_RFC1483", - "IFT_RS232", - "IFT_RSRB", - "IFT_SDLC", - "IFT_SDSL", - "IFT_SHDSL", - "IFT_SIP", - "IFT_SIPSIG", - "IFT_SIPTG", - "IFT_SLIP", - "IFT_SMDSDXI", - "IFT_SMDSICIP", - "IFT_SONET", - "IFT_SONETOVERHEADCHANNEL", - "IFT_SONETPATH", - "IFT_SONETVT", - "IFT_SRP", - "IFT_SS7SIGLINK", - "IFT_STACKTOSTACK", - "IFT_STARLAN", - "IFT_STF", - "IFT_T1", - "IFT_TDLC", - "IFT_TELINK", - "IFT_TERMPAD", - "IFT_TR008", - "IFT_TRANSPHDLC", - "IFT_TUNNEL", - "IFT_ULTRA", - "IFT_USB", - "IFT_V11", - "IFT_V35", - "IFT_V36", - "IFT_V37", - "IFT_VDSL", - "IFT_VIRTUALIPADDRESS", - "IFT_VIRTUALTG", - "IFT_VOICEDID", - "IFT_VOICEEM", - "IFT_VOICEEMFGD", - "IFT_VOICEENCAP", - "IFT_VOICEFGDEANA", - "IFT_VOICEFXO", - "IFT_VOICEFXS", - "IFT_VOICEOVERATM", - "IFT_VOICEOVERCABLE", - "IFT_VOICEOVERFRAMERELAY", - "IFT_VOICEOVERIP", - "IFT_X213", - "IFT_X25", - "IFT_X25DDN", - "IFT_X25HUNTGROUP", - "IFT_X25MLP", - "IFT_X25PLE", - "IFT_XETHER", - "IGNBRK", - "IGNCR", - "IGNORE", - "IGNPAR", - "IMAXBEL", - "INFINITE", - "INLCR", - "INPCK", - "INVALID_FILE_ATTRIBUTES", - "IN_ACCESS", - "IN_ALL_EVENTS", - "IN_ATTRIB", - "IN_CLASSA_HOST", - "IN_CLASSA_MAX", - "IN_CLASSA_NET", - "IN_CLASSA_NSHIFT", - "IN_CLASSB_HOST", - "IN_CLASSB_MAX", - "IN_CLASSB_NET", - "IN_CLASSB_NSHIFT", - "IN_CLASSC_HOST", - "IN_CLASSC_NET", - "IN_CLASSC_NSHIFT", - "IN_CLASSD_HOST", - "IN_CLASSD_NET", - "IN_CLASSD_NSHIFT", - "IN_CLOEXEC", - "IN_CLOSE", - "IN_CLOSE_NOWRITE", - "IN_CLOSE_WRITE", - "IN_CREATE", - "IN_DELETE", - "IN_DELETE_SELF", - "IN_DONT_FOLLOW", - "IN_EXCL_UNLINK", - "IN_IGNORED", - "IN_ISDIR", - "IN_LINKLOCALNETNUM", - "IN_LOOPBACKNET", - "IN_MASK_ADD", - "IN_MODIFY", - "IN_MOVE", - "IN_MOVED_FROM", - "IN_MOVED_TO", - "IN_MOVE_SELF", - "IN_NONBLOCK", - "IN_ONESHOT", - "IN_ONLYDIR", - "IN_OPEN", - "IN_Q_OVERFLOW", - "IN_RFC3021_HOST", - "IN_RFC3021_MASK", - "IN_RFC3021_NET", - "IN_RFC3021_NSHIFT", - "IN_UNMOUNT", - "IOC_IN", - "IOC_INOUT", - "IOC_OUT", - "IOC_VENDOR", - "IOC_WS2", - "IO_REPARSE_TAG_SYMLINK", - "IPMreq", - "IPMreqn", - "IPPROTO_3PC", - "IPPROTO_ADFS", - "IPPROTO_AH", - "IPPROTO_AHIP", - "IPPROTO_APES", - "IPPROTO_ARGUS", - "IPPROTO_AX25", - "IPPROTO_BHA", - "IPPROTO_BLT", - "IPPROTO_BRSATMON", - "IPPROTO_CARP", - "IPPROTO_CFTP", - "IPPROTO_CHAOS", - "IPPROTO_CMTP", - "IPPROTO_COMP", - "IPPROTO_CPHB", - "IPPROTO_CPNX", - "IPPROTO_DCCP", - "IPPROTO_DDP", - "IPPROTO_DGP", - "IPPROTO_DIVERT", - "IPPROTO_DIVERT_INIT", - "IPPROTO_DIVERT_RESP", - "IPPROTO_DONE", - "IPPROTO_DSTOPTS", - "IPPROTO_EGP", - "IPPROTO_EMCON", - "IPPROTO_ENCAP", - "IPPROTO_EON", - "IPPROTO_ESP", - "IPPROTO_ETHERIP", - "IPPROTO_FRAGMENT", - "IPPROTO_GGP", - "IPPROTO_GMTP", - "IPPROTO_GRE", - "IPPROTO_HELLO", - "IPPROTO_HMP", - "IPPROTO_HOPOPTS", - "IPPROTO_ICMP", - "IPPROTO_ICMPV6", - "IPPROTO_IDP", - "IPPROTO_IDPR", - "IPPROTO_IDRP", - "IPPROTO_IGMP", - "IPPROTO_IGP", - "IPPROTO_IGRP", - "IPPROTO_IL", - "IPPROTO_INLSP", - "IPPROTO_INP", - "IPPROTO_IP", - "IPPROTO_IPCOMP", - "IPPROTO_IPCV", - "IPPROTO_IPEIP", - "IPPROTO_IPIP", - "IPPROTO_IPPC", - "IPPROTO_IPV4", - "IPPROTO_IPV6", - "IPPROTO_IPV6_ICMP", - "IPPROTO_IRTP", - "IPPROTO_KRYPTOLAN", - "IPPROTO_LARP", - "IPPROTO_LEAF1", - "IPPROTO_LEAF2", - "IPPROTO_MAX", - "IPPROTO_MAXID", - "IPPROTO_MEAS", - "IPPROTO_MH", - "IPPROTO_MHRP", - "IPPROTO_MICP", - "IPPROTO_MOBILE", - "IPPROTO_MPLS", - "IPPROTO_MTP", - "IPPROTO_MUX", - "IPPROTO_ND", - "IPPROTO_NHRP", - "IPPROTO_NONE", - "IPPROTO_NSP", - "IPPROTO_NVPII", - "IPPROTO_OLD_DIVERT", - "IPPROTO_OSPFIGP", - "IPPROTO_PFSYNC", - "IPPROTO_PGM", - "IPPROTO_PIGP", - "IPPROTO_PIM", - "IPPROTO_PRM", - "IPPROTO_PUP", - "IPPROTO_PVP", - "IPPROTO_RAW", - "IPPROTO_RCCMON", - "IPPROTO_RDP", - "IPPROTO_ROUTING", - "IPPROTO_RSVP", - "IPPROTO_RVD", - "IPPROTO_SATEXPAK", - "IPPROTO_SATMON", - "IPPROTO_SCCSP", - "IPPROTO_SCTP", - "IPPROTO_SDRP", - "IPPROTO_SEND", - "IPPROTO_SEP", - "IPPROTO_SKIP", - "IPPROTO_SPACER", - "IPPROTO_SRPC", - "IPPROTO_ST", - "IPPROTO_SVMTP", - "IPPROTO_SWIPE", - "IPPROTO_TCF", - "IPPROTO_TCP", - "IPPROTO_TLSP", - "IPPROTO_TP", - "IPPROTO_TPXX", - "IPPROTO_TRUNK1", - "IPPROTO_TRUNK2", - "IPPROTO_TTP", - "IPPROTO_UDP", - "IPPROTO_UDPLITE", - "IPPROTO_VINES", - "IPPROTO_VISA", - "IPPROTO_VMTP", - "IPPROTO_VRRP", - "IPPROTO_WBEXPAK", - "IPPROTO_WBMON", - "IPPROTO_WSN", - "IPPROTO_XNET", - "IPPROTO_XTP", - "IPV6_2292DSTOPTS", - "IPV6_2292HOPLIMIT", - "IPV6_2292HOPOPTS", - "IPV6_2292NEXTHOP", - "IPV6_2292PKTINFO", - "IPV6_2292PKTOPTIONS", - "IPV6_2292RTHDR", - "IPV6_ADDRFORM", - "IPV6_ADD_MEMBERSHIP", - "IPV6_AUTHHDR", - "IPV6_AUTH_LEVEL", - "IPV6_AUTOFLOWLABEL", - "IPV6_BINDANY", - "IPV6_BINDV6ONLY", - "IPV6_BOUND_IF", - "IPV6_CHECKSUM", - "IPV6_DEFAULT_MULTICAST_HOPS", - "IPV6_DEFAULT_MULTICAST_LOOP", - "IPV6_DEFHLIM", - "IPV6_DONTFRAG", - "IPV6_DROP_MEMBERSHIP", - "IPV6_DSTOPTS", - "IPV6_ESP_NETWORK_LEVEL", - "IPV6_ESP_TRANS_LEVEL", - "IPV6_FAITH", - "IPV6_FLOWINFO_MASK", - "IPV6_FLOWLABEL_MASK", - "IPV6_FRAGTTL", - "IPV6_FW_ADD", - "IPV6_FW_DEL", - "IPV6_FW_FLUSH", - "IPV6_FW_GET", - "IPV6_FW_ZERO", - "IPV6_HLIMDEC", - "IPV6_HOPLIMIT", - "IPV6_HOPOPTS", - "IPV6_IPCOMP_LEVEL", - "IPV6_IPSEC_POLICY", - "IPV6_JOIN_ANYCAST", - "IPV6_JOIN_GROUP", - "IPV6_LEAVE_ANYCAST", - "IPV6_LEAVE_GROUP", - "IPV6_MAXHLIM", - "IPV6_MAXOPTHDR", - "IPV6_MAXPACKET", - "IPV6_MAX_GROUP_SRC_FILTER", - "IPV6_MAX_MEMBERSHIPS", - "IPV6_MAX_SOCK_SRC_FILTER", - "IPV6_MIN_MEMBERSHIPS", - "IPV6_MMTU", - "IPV6_MSFILTER", - "IPV6_MTU", - "IPV6_MTU_DISCOVER", - "IPV6_MULTICAST_HOPS", - "IPV6_MULTICAST_IF", - "IPV6_MULTICAST_LOOP", - "IPV6_NEXTHOP", - "IPV6_OPTIONS", - "IPV6_PATHMTU", - "IPV6_PIPEX", - "IPV6_PKTINFO", - "IPV6_PMTUDISC_DO", - "IPV6_PMTUDISC_DONT", - "IPV6_PMTUDISC_PROBE", - "IPV6_PMTUDISC_WANT", - "IPV6_PORTRANGE", - "IPV6_PORTRANGE_DEFAULT", - "IPV6_PORTRANGE_HIGH", - "IPV6_PORTRANGE_LOW", - "IPV6_PREFER_TEMPADDR", - "IPV6_RECVDSTOPTS", - "IPV6_RECVDSTPORT", - "IPV6_RECVERR", - "IPV6_RECVHOPLIMIT", - "IPV6_RECVHOPOPTS", - "IPV6_RECVPATHMTU", - "IPV6_RECVPKTINFO", - "IPV6_RECVRTHDR", - "IPV6_RECVTCLASS", - "IPV6_ROUTER_ALERT", - "IPV6_RTABLE", - "IPV6_RTHDR", - "IPV6_RTHDRDSTOPTS", - "IPV6_RTHDR_LOOSE", - "IPV6_RTHDR_STRICT", - "IPV6_RTHDR_TYPE_0", - "IPV6_RXDSTOPTS", - "IPV6_RXHOPOPTS", - "IPV6_SOCKOPT_RESERVED1", - "IPV6_TCLASS", - "IPV6_UNICAST_HOPS", - "IPV6_USE_MIN_MTU", - "IPV6_V6ONLY", - "IPV6_VERSION", - "IPV6_VERSION_MASK", - "IPV6_XFRM_POLICY", - "IP_ADD_MEMBERSHIP", - "IP_ADD_SOURCE_MEMBERSHIP", - "IP_AUTH_LEVEL", - "IP_BINDANY", - "IP_BLOCK_SOURCE", - "IP_BOUND_IF", - "IP_DEFAULT_MULTICAST_LOOP", - "IP_DEFAULT_MULTICAST_TTL", - "IP_DF", - "IP_DIVERTFL", - "IP_DONTFRAG", - "IP_DROP_MEMBERSHIP", - "IP_DROP_SOURCE_MEMBERSHIP", - "IP_DUMMYNET3", - "IP_DUMMYNET_CONFIGURE", - "IP_DUMMYNET_DEL", - "IP_DUMMYNET_FLUSH", - "IP_DUMMYNET_GET", - "IP_EF", - "IP_ERRORMTU", - "IP_ESP_NETWORK_LEVEL", - "IP_ESP_TRANS_LEVEL", - "IP_FAITH", - "IP_FREEBIND", - "IP_FW3", - "IP_FW_ADD", - "IP_FW_DEL", - "IP_FW_FLUSH", - "IP_FW_GET", - "IP_FW_NAT_CFG", - "IP_FW_NAT_DEL", - "IP_FW_NAT_GET_CONFIG", - "IP_FW_NAT_GET_LOG", - "IP_FW_RESETLOG", - "IP_FW_TABLE_ADD", - "IP_FW_TABLE_DEL", - "IP_FW_TABLE_FLUSH", - "IP_FW_TABLE_GETSIZE", - "IP_FW_TABLE_LIST", - "IP_FW_ZERO", - "IP_HDRINCL", - "IP_IPCOMP_LEVEL", - "IP_IPSECFLOWINFO", - "IP_IPSEC_LOCAL_AUTH", - "IP_IPSEC_LOCAL_CRED", - "IP_IPSEC_LOCAL_ID", - "IP_IPSEC_POLICY", - "IP_IPSEC_REMOTE_AUTH", - "IP_IPSEC_REMOTE_CRED", - "IP_IPSEC_REMOTE_ID", - "IP_MAXPACKET", - "IP_MAX_GROUP_SRC_FILTER", - "IP_MAX_MEMBERSHIPS", - "IP_MAX_SOCK_MUTE_FILTER", - "IP_MAX_SOCK_SRC_FILTER", - "IP_MAX_SOURCE_FILTER", - "IP_MF", - "IP_MINFRAGSIZE", - "IP_MINTTL", - "IP_MIN_MEMBERSHIPS", - "IP_MSFILTER", - "IP_MSS", - "IP_MTU", - "IP_MTU_DISCOVER", - "IP_MULTICAST_IF", - "IP_MULTICAST_IFINDEX", - "IP_MULTICAST_LOOP", - "IP_MULTICAST_TTL", - "IP_MULTICAST_VIF", - "IP_NAT__XXX", - "IP_OFFMASK", - "IP_OLD_FW_ADD", - "IP_OLD_FW_DEL", - "IP_OLD_FW_FLUSH", - "IP_OLD_FW_GET", - "IP_OLD_FW_RESETLOG", - "IP_OLD_FW_ZERO", - "IP_ONESBCAST", - "IP_OPTIONS", - "IP_ORIGDSTADDR", - "IP_PASSSEC", - "IP_PIPEX", - "IP_PKTINFO", - "IP_PKTOPTIONS", - "IP_PMTUDISC", - "IP_PMTUDISC_DO", - "IP_PMTUDISC_DONT", - "IP_PMTUDISC_PROBE", - "IP_PMTUDISC_WANT", - "IP_PORTRANGE", - "IP_PORTRANGE_DEFAULT", - "IP_PORTRANGE_HIGH", - "IP_PORTRANGE_LOW", - "IP_RECVDSTADDR", - "IP_RECVDSTPORT", - "IP_RECVERR", - "IP_RECVIF", - "IP_RECVOPTS", - "IP_RECVORIGDSTADDR", - "IP_RECVPKTINFO", - "IP_RECVRETOPTS", - "IP_RECVRTABLE", - "IP_RECVTOS", - "IP_RECVTTL", - "IP_RETOPTS", - "IP_RF", - "IP_ROUTER_ALERT", - "IP_RSVP_OFF", - "IP_RSVP_ON", - "IP_RSVP_VIF_OFF", - "IP_RSVP_VIF_ON", - "IP_RTABLE", - "IP_SENDSRCADDR", - "IP_STRIPHDR", - "IP_TOS", - "IP_TRAFFIC_MGT_BACKGROUND", - "IP_TRANSPARENT", - "IP_TTL", - "IP_UNBLOCK_SOURCE", - "IP_XFRM_POLICY", - "IPv6MTUInfo", - "IPv6Mreq", - "ISIG", - "ISTRIP", - "IUCLC", - "IUTF8", - "IXANY", - "IXOFF", - "IXON", - "IfAddrmsg", - "IfAnnounceMsghdr", - "IfData", - "IfInfomsg", - "IfMsghdr", - "IfaMsghdr", - "IfmaMsghdr", - "IfmaMsghdr2", - "ImplementsGetwd", - "Inet4Pktinfo", - "Inet6Pktinfo", - "InotifyAddWatch", - "InotifyEvent", - "InotifyInit", - "InotifyInit1", - "InotifyRmWatch", - "InterfaceAddrMessage", - "InterfaceAnnounceMessage", - "InterfaceInfo", - "InterfaceMessage", - "InterfaceMulticastAddrMessage", - "InvalidHandle", - "Ioperm", - "Iopl", - "Iovec", - "IpAdapterInfo", - "IpAddrString", - "IpAddressString", - "IpMaskString", - "Issetugid", - "KEY_ALL_ACCESS", - "KEY_CREATE_LINK", - "KEY_CREATE_SUB_KEY", - "KEY_ENUMERATE_SUB_KEYS", - "KEY_EXECUTE", - "KEY_NOTIFY", - "KEY_QUERY_VALUE", - "KEY_READ", - "KEY_SET_VALUE", - "KEY_WOW64_32KEY", - "KEY_WOW64_64KEY", - "KEY_WRITE", - "Kevent", - "Kevent_t", - "Kill", - "Klogctl", - "Kqueue", - "LANG_ENGLISH", - "LAYERED_PROTOCOL", - "LCNT_OVERLOAD_FLUSH", - "LINUX_REBOOT_CMD_CAD_OFF", - "LINUX_REBOOT_CMD_CAD_ON", - "LINUX_REBOOT_CMD_HALT", - "LINUX_REBOOT_CMD_KEXEC", - "LINUX_REBOOT_CMD_POWER_OFF", - "LINUX_REBOOT_CMD_RESTART", - "LINUX_REBOOT_CMD_RESTART2", - "LINUX_REBOOT_CMD_SW_SUSPEND", - "LINUX_REBOOT_MAGIC1", - "LINUX_REBOOT_MAGIC2", - "LOCK_EX", - "LOCK_NB", - "LOCK_SH", - "LOCK_UN", - "LazyDLL", - "LazyProc", - "Lchown", - "Linger", - "Link", - "Listen", - "Listxattr", - "LoadCancelIoEx", - "LoadConnectEx", - "LoadCreateSymbolicLink", - "LoadDLL", - "LoadGetAddrInfo", - "LoadLibrary", - "LoadSetFileCompletionNotificationModes", - "LocalFree", - "Log2phys_t", - "LookupAccountName", - "LookupAccountSid", - "LookupSID", - "LsfJump", - "LsfSocket", - "LsfStmt", - "Lstat", - "MADV_AUTOSYNC", - "MADV_CAN_REUSE", - "MADV_CORE", - "MADV_DOFORK", - "MADV_DONTFORK", - "MADV_DONTNEED", - "MADV_FREE", - "MADV_FREE_REUSABLE", - "MADV_FREE_REUSE", - "MADV_HUGEPAGE", - "MADV_HWPOISON", - "MADV_MERGEABLE", - "MADV_NOCORE", - "MADV_NOHUGEPAGE", - "MADV_NORMAL", - "MADV_NOSYNC", - "MADV_PROTECT", - "MADV_RANDOM", - "MADV_REMOVE", - "MADV_SEQUENTIAL", - "MADV_SPACEAVAIL", - "MADV_UNMERGEABLE", - "MADV_WILLNEED", - "MADV_ZERO_WIRED_PAGES", - "MAP_32BIT", - "MAP_ALIGNED_SUPER", - "MAP_ALIGNMENT_16MB", - "MAP_ALIGNMENT_1TB", - "MAP_ALIGNMENT_256TB", - "MAP_ALIGNMENT_4GB", - "MAP_ALIGNMENT_64KB", - "MAP_ALIGNMENT_64PB", - "MAP_ALIGNMENT_MASK", - "MAP_ALIGNMENT_SHIFT", - "MAP_ANON", - "MAP_ANONYMOUS", - "MAP_COPY", - "MAP_DENYWRITE", - "MAP_EXECUTABLE", - "MAP_FILE", - "MAP_FIXED", - "MAP_FLAGMASK", - "MAP_GROWSDOWN", - "MAP_HASSEMAPHORE", - "MAP_HUGETLB", - "MAP_INHERIT", - "MAP_INHERIT_COPY", - "MAP_INHERIT_DEFAULT", - "MAP_INHERIT_DONATE_COPY", - "MAP_INHERIT_NONE", - "MAP_INHERIT_SHARE", - "MAP_JIT", - "MAP_LOCKED", - "MAP_NOCACHE", - "MAP_NOCORE", - "MAP_NOEXTEND", - "MAP_NONBLOCK", - "MAP_NORESERVE", - "MAP_NOSYNC", - "MAP_POPULATE", - "MAP_PREFAULT_READ", - "MAP_PRIVATE", - "MAP_RENAME", - "MAP_RESERVED0080", - "MAP_RESERVED0100", - "MAP_SHARED", - "MAP_STACK", - "MAP_TRYFIXED", - "MAP_TYPE", - "MAP_WIRED", - "MAXIMUM_REPARSE_DATA_BUFFER_SIZE", - "MAXLEN_IFDESCR", - "MAXLEN_PHYSADDR", - "MAX_ADAPTER_ADDRESS_LENGTH", - "MAX_ADAPTER_DESCRIPTION_LENGTH", - "MAX_ADAPTER_NAME_LENGTH", - "MAX_COMPUTERNAME_LENGTH", - "MAX_INTERFACE_NAME_LEN", - "MAX_LONG_PATH", - "MAX_PATH", - "MAX_PROTOCOL_CHAIN", - "MCL_CURRENT", - "MCL_FUTURE", - "MNT_DETACH", - "MNT_EXPIRE", - "MNT_FORCE", - "MSG_BCAST", - "MSG_CMSG_CLOEXEC", - "MSG_COMPAT", - "MSG_CONFIRM", - "MSG_CONTROLMBUF", - "MSG_CTRUNC", - "MSG_DONTROUTE", - "MSG_DONTWAIT", - "MSG_EOF", - "MSG_EOR", - "MSG_ERRQUEUE", - "MSG_FASTOPEN", - "MSG_FIN", - "MSG_FLUSH", - "MSG_HAVEMORE", - "MSG_HOLD", - "MSG_IOVUSRSPACE", - "MSG_LENUSRSPACE", - "MSG_MCAST", - "MSG_MORE", - "MSG_NAMEMBUF", - "MSG_NBIO", - "MSG_NEEDSA", - "MSG_NOSIGNAL", - "MSG_NOTIFICATION", - "MSG_OOB", - "MSG_PEEK", - "MSG_PROXY", - "MSG_RCVMORE", - "MSG_RST", - "MSG_SEND", - "MSG_SYN", - "MSG_TRUNC", - "MSG_TRYHARD", - "MSG_USERFLAGS", - "MSG_WAITALL", - "MSG_WAITFORONE", - "MSG_WAITSTREAM", - "MS_ACTIVE", - "MS_ASYNC", - "MS_BIND", - "MS_DEACTIVATE", - "MS_DIRSYNC", - "MS_INVALIDATE", - "MS_I_VERSION", - "MS_KERNMOUNT", - "MS_KILLPAGES", - "MS_MANDLOCK", - "MS_MGC_MSK", - "MS_MGC_VAL", - "MS_MOVE", - "MS_NOATIME", - "MS_NODEV", - "MS_NODIRATIME", - "MS_NOEXEC", - "MS_NOSUID", - "MS_NOUSER", - "MS_POSIXACL", - "MS_PRIVATE", - "MS_RDONLY", - "MS_REC", - "MS_RELATIME", - "MS_REMOUNT", - "MS_RMT_MASK", - "MS_SHARED", - "MS_SILENT", - "MS_SLAVE", - "MS_STRICTATIME", - "MS_SYNC", - "MS_SYNCHRONOUS", - "MS_UNBINDABLE", - "Madvise", - "MapViewOfFile", - "MaxTokenInfoClass", - "Mclpool", - "MibIfRow", - "Mkdir", - "Mkdirat", - "Mkfifo", - "Mknod", - "Mknodat", - "Mlock", - "Mlockall", - "Mmap", - "Mount", - "MoveFile", - "Mprotect", - "Msghdr", - "Munlock", - "Munlockall", - "Munmap", - "MustLoadDLL", - "NAME_MAX", - "NETLINK_ADD_MEMBERSHIP", - "NETLINK_AUDIT", - "NETLINK_BROADCAST_ERROR", - "NETLINK_CONNECTOR", - "NETLINK_DNRTMSG", - "NETLINK_DROP_MEMBERSHIP", - "NETLINK_ECRYPTFS", - "NETLINK_FIB_LOOKUP", - "NETLINK_FIREWALL", - "NETLINK_GENERIC", - "NETLINK_INET_DIAG", - "NETLINK_IP6_FW", - "NETLINK_ISCSI", - "NETLINK_KOBJECT_UEVENT", - "NETLINK_NETFILTER", - "NETLINK_NFLOG", - "NETLINK_NO_ENOBUFS", - "NETLINK_PKTINFO", - "NETLINK_RDMA", - "NETLINK_ROUTE", - "NETLINK_SCSITRANSPORT", - "NETLINK_SELINUX", - "NETLINK_UNUSED", - "NETLINK_USERSOCK", - "NETLINK_XFRM", - "NET_RT_DUMP", - "NET_RT_DUMP2", - "NET_RT_FLAGS", - "NET_RT_IFLIST", - "NET_RT_IFLIST2", - "NET_RT_IFLISTL", - "NET_RT_IFMALIST", - "NET_RT_MAXID", - "NET_RT_OIFLIST", - "NET_RT_OOIFLIST", - "NET_RT_STAT", - "NET_RT_STATS", - "NET_RT_TABLE", - "NET_RT_TRASH", - "NLA_ALIGNTO", - "NLA_F_NESTED", - "NLA_F_NET_BYTEORDER", - "NLA_HDRLEN", - "NLMSG_ALIGNTO", - "NLMSG_DONE", - "NLMSG_ERROR", - "NLMSG_HDRLEN", - "NLMSG_MIN_TYPE", - "NLMSG_NOOP", - "NLMSG_OVERRUN", - "NLM_F_ACK", - "NLM_F_APPEND", - "NLM_F_ATOMIC", - "NLM_F_CREATE", - "NLM_F_DUMP", - "NLM_F_ECHO", - "NLM_F_EXCL", - "NLM_F_MATCH", - "NLM_F_MULTI", - "NLM_F_REPLACE", - "NLM_F_REQUEST", - "NLM_F_ROOT", - "NOFLSH", - "NOTE_ABSOLUTE", - "NOTE_ATTRIB", - "NOTE_CHILD", - "NOTE_DELETE", - "NOTE_EOF", - "NOTE_EXEC", - "NOTE_EXIT", - "NOTE_EXITSTATUS", - "NOTE_EXTEND", - "NOTE_FFAND", - "NOTE_FFCOPY", - "NOTE_FFCTRLMASK", - "NOTE_FFLAGSMASK", - "NOTE_FFNOP", - "NOTE_FFOR", - "NOTE_FORK", - "NOTE_LINK", - "NOTE_LOWAT", - "NOTE_NONE", - "NOTE_NSECONDS", - "NOTE_PCTRLMASK", - "NOTE_PDATAMASK", - "NOTE_REAP", - "NOTE_RENAME", - "NOTE_RESOURCEEND", - "NOTE_REVOKE", - "NOTE_SECONDS", - "NOTE_SIGNAL", - "NOTE_TRACK", - "NOTE_TRACKERR", - "NOTE_TRIGGER", - "NOTE_TRUNCATE", - "NOTE_USECONDS", - "NOTE_VM_ERROR", - "NOTE_VM_PRESSURE", - "NOTE_VM_PRESSURE_SUDDEN_TERMINATE", - "NOTE_VM_PRESSURE_TERMINATE", - "NOTE_WRITE", - "NameCanonical", - "NameCanonicalEx", - "NameDisplay", - "NameDnsDomain", - "NameFullyQualifiedDN", - "NameSamCompatible", - "NameServicePrincipal", - "NameUniqueId", - "NameUnknown", - "NameUserPrincipal", - "Nanosleep", - "NetApiBufferFree", - "NetGetJoinInformation", - "NetSetupDomainName", - "NetSetupUnjoined", - "NetSetupUnknownStatus", - "NetSetupWorkgroupName", - "NetUserGetInfo", - "NetlinkMessage", - "NetlinkRIB", - "NetlinkRouteAttr", - "NetlinkRouteRequest", - "NewCallback", - "NewCallbackCDecl", - "NewLazyDLL", - "NlAttr", - "NlMsgerr", - "NlMsghdr", - "NsecToFiletime", - "NsecToTimespec", - "NsecToTimeval", - "Ntohs", - "OCRNL", - "OFDEL", - "OFILL", - "OFIOGETBMAP", - "OID_PKIX_KP_SERVER_AUTH", - "OID_SERVER_GATED_CRYPTO", - "OID_SGC_NETSCAPE", - "OLCUC", - "ONLCR", - "ONLRET", - "ONOCR", - "ONOEOT", - "OPEN_ALWAYS", - "OPEN_EXISTING", - "OPOST", - "O_ACCMODE", - "O_ALERT", - "O_ALT_IO", - "O_APPEND", - "O_ASYNC", - "O_CLOEXEC", - "O_CREAT", - "O_DIRECT", - "O_DIRECTORY", - "O_DSYNC", - "O_EVTONLY", - "O_EXCL", - "O_EXEC", - "O_EXLOCK", - "O_FSYNC", - "O_LARGEFILE", - "O_NDELAY", - "O_NOATIME", - "O_NOCTTY", - "O_NOFOLLOW", - "O_NONBLOCK", - "O_NOSIGPIPE", - "O_POPUP", - "O_RDONLY", - "O_RDWR", - "O_RSYNC", - "O_SHLOCK", - "O_SYMLINK", - "O_SYNC", - "O_TRUNC", - "O_TTY_INIT", - "O_WRONLY", - "Open", - "OpenCurrentProcessToken", - "OpenProcess", - "OpenProcessToken", - "Openat", - "Overlapped", - "PACKET_ADD_MEMBERSHIP", - "PACKET_BROADCAST", - "PACKET_DROP_MEMBERSHIP", - "PACKET_FASTROUTE", - "PACKET_HOST", - "PACKET_LOOPBACK", - "PACKET_MR_ALLMULTI", - "PACKET_MR_MULTICAST", - "PACKET_MR_PROMISC", - "PACKET_MULTICAST", - "PACKET_OTHERHOST", - "PACKET_OUTGOING", - "PACKET_RECV_OUTPUT", - "PACKET_RX_RING", - "PACKET_STATISTICS", - "PAGE_EXECUTE_READ", - "PAGE_EXECUTE_READWRITE", - "PAGE_EXECUTE_WRITECOPY", - "PAGE_READONLY", - "PAGE_READWRITE", - "PAGE_WRITECOPY", - "PARENB", - "PARMRK", - "PARODD", - "PENDIN", - "PFL_HIDDEN", - "PFL_MATCHES_PROTOCOL_ZERO", - "PFL_MULTIPLE_PROTO_ENTRIES", - "PFL_NETWORKDIRECT_PROVIDER", - "PFL_RECOMMENDED_PROTO_ENTRY", - "PF_FLUSH", - "PKCS_7_ASN_ENCODING", - "PMC5_PIPELINE_FLUSH", - "PRIO_PGRP", - "PRIO_PROCESS", - "PRIO_USER", - "PRI_IOFLUSH", - "PROCESS_QUERY_INFORMATION", - "PROCESS_TERMINATE", - "PROT_EXEC", - "PROT_GROWSDOWN", - "PROT_GROWSUP", - "PROT_NONE", - "PROT_READ", - "PROT_WRITE", - "PROV_DH_SCHANNEL", - "PROV_DSS", - "PROV_DSS_DH", - "PROV_EC_ECDSA_FULL", - "PROV_EC_ECDSA_SIG", - "PROV_EC_ECNRA_FULL", - "PROV_EC_ECNRA_SIG", - "PROV_FORTEZZA", - "PROV_INTEL_SEC", - "PROV_MS_EXCHANGE", - "PROV_REPLACE_OWF", - "PROV_RNG", - "PROV_RSA_AES", - "PROV_RSA_FULL", - "PROV_RSA_SCHANNEL", - "PROV_RSA_SIG", - "PROV_SPYRUS_LYNKS", - "PROV_SSL", - "PR_CAPBSET_DROP", - "PR_CAPBSET_READ", - "PR_CLEAR_SECCOMP_FILTER", - "PR_ENDIAN_BIG", - "PR_ENDIAN_LITTLE", - "PR_ENDIAN_PPC_LITTLE", - "PR_FPEMU_NOPRINT", - "PR_FPEMU_SIGFPE", - "PR_FP_EXC_ASYNC", - "PR_FP_EXC_DISABLED", - "PR_FP_EXC_DIV", - "PR_FP_EXC_INV", - "PR_FP_EXC_NONRECOV", - "PR_FP_EXC_OVF", - "PR_FP_EXC_PRECISE", - "PR_FP_EXC_RES", - "PR_FP_EXC_SW_ENABLE", - "PR_FP_EXC_UND", - "PR_GET_DUMPABLE", - "PR_GET_ENDIAN", - "PR_GET_FPEMU", - "PR_GET_FPEXC", - "PR_GET_KEEPCAPS", - "PR_GET_NAME", - "PR_GET_PDEATHSIG", - "PR_GET_SECCOMP", - "PR_GET_SECCOMP_FILTER", - "PR_GET_SECUREBITS", - "PR_GET_TIMERSLACK", - "PR_GET_TIMING", - "PR_GET_TSC", - "PR_GET_UNALIGN", - "PR_MCE_KILL", - "PR_MCE_KILL_CLEAR", - "PR_MCE_KILL_DEFAULT", - "PR_MCE_KILL_EARLY", - "PR_MCE_KILL_GET", - "PR_MCE_KILL_LATE", - "PR_MCE_KILL_SET", - "PR_SECCOMP_FILTER_EVENT", - "PR_SECCOMP_FILTER_SYSCALL", - "PR_SET_DUMPABLE", - "PR_SET_ENDIAN", - "PR_SET_FPEMU", - "PR_SET_FPEXC", - "PR_SET_KEEPCAPS", - "PR_SET_NAME", - "PR_SET_PDEATHSIG", - "PR_SET_PTRACER", - "PR_SET_SECCOMP", - "PR_SET_SECCOMP_FILTER", - "PR_SET_SECUREBITS", - "PR_SET_TIMERSLACK", - "PR_SET_TIMING", - "PR_SET_TSC", - "PR_SET_UNALIGN", - "PR_TASK_PERF_EVENTS_DISABLE", - "PR_TASK_PERF_EVENTS_ENABLE", - "PR_TIMING_STATISTICAL", - "PR_TIMING_TIMESTAMP", - "PR_TSC_ENABLE", - "PR_TSC_SIGSEGV", - "PR_UNALIGN_NOPRINT", - "PR_UNALIGN_SIGBUS", - "PTRACE_ARCH_PRCTL", - "PTRACE_ATTACH", - "PTRACE_CONT", - "PTRACE_DETACH", - "PTRACE_EVENT_CLONE", - "PTRACE_EVENT_EXEC", - "PTRACE_EVENT_EXIT", - "PTRACE_EVENT_FORK", - "PTRACE_EVENT_VFORK", - "PTRACE_EVENT_VFORK_DONE", - "PTRACE_GETCRUNCHREGS", - "PTRACE_GETEVENTMSG", - "PTRACE_GETFPREGS", - "PTRACE_GETFPXREGS", - "PTRACE_GETHBPREGS", - "PTRACE_GETREGS", - "PTRACE_GETREGSET", - "PTRACE_GETSIGINFO", - "PTRACE_GETVFPREGS", - "PTRACE_GETWMMXREGS", - "PTRACE_GET_THREAD_AREA", - "PTRACE_KILL", - "PTRACE_OLDSETOPTIONS", - "PTRACE_O_MASK", - "PTRACE_O_TRACECLONE", - "PTRACE_O_TRACEEXEC", - "PTRACE_O_TRACEEXIT", - "PTRACE_O_TRACEFORK", - "PTRACE_O_TRACESYSGOOD", - "PTRACE_O_TRACEVFORK", - "PTRACE_O_TRACEVFORKDONE", - "PTRACE_PEEKDATA", - "PTRACE_PEEKTEXT", - "PTRACE_PEEKUSR", - "PTRACE_POKEDATA", - "PTRACE_POKETEXT", - "PTRACE_POKEUSR", - "PTRACE_SETCRUNCHREGS", - "PTRACE_SETFPREGS", - "PTRACE_SETFPXREGS", - "PTRACE_SETHBPREGS", - "PTRACE_SETOPTIONS", - "PTRACE_SETREGS", - "PTRACE_SETREGSET", - "PTRACE_SETSIGINFO", - "PTRACE_SETVFPREGS", - "PTRACE_SETWMMXREGS", - "PTRACE_SET_SYSCALL", - "PTRACE_SET_THREAD_AREA", - "PTRACE_SINGLEBLOCK", - "PTRACE_SINGLESTEP", - "PTRACE_SYSCALL", - "PTRACE_SYSEMU", - "PTRACE_SYSEMU_SINGLESTEP", - "PTRACE_TRACEME", - "PT_ATTACH", - "PT_ATTACHEXC", - "PT_CONTINUE", - "PT_DATA_ADDR", - "PT_DENY_ATTACH", - "PT_DETACH", - "PT_FIRSTMACH", - "PT_FORCEQUOTA", - "PT_KILL", - "PT_MASK", - "PT_READ_D", - "PT_READ_I", - "PT_READ_U", - "PT_SIGEXC", - "PT_STEP", - "PT_TEXT_ADDR", - "PT_TEXT_END_ADDR", - "PT_THUPDATE", - "PT_TRACE_ME", - "PT_WRITE_D", - "PT_WRITE_I", - "PT_WRITE_U", - "ParseDirent", - "ParseNetlinkMessage", - "ParseNetlinkRouteAttr", - "ParseRoutingMessage", - "ParseRoutingSockaddr", - "ParseSocketControlMessage", - "ParseUnixCredentials", - "ParseUnixRights", - "PathMax", - "Pathconf", - "Pause", - "Pipe", - "Pipe2", - "PivotRoot", - "Pointer", - "PostQueuedCompletionStatus", - "Pread", - "Proc", - "ProcAttr", - "Process32First", - "Process32Next", - "ProcessEntry32", - "ProcessInformation", - "Protoent", - "PtraceAttach", - "PtraceCont", - "PtraceDetach", - "PtraceGetEventMsg", - "PtraceGetRegs", - "PtracePeekData", - "PtracePeekText", - "PtracePokeData", - "PtracePokeText", - "PtraceRegs", - "PtraceSetOptions", - "PtraceSetRegs", - "PtraceSingleStep", - "PtraceSyscall", - "Pwrite", - "REG_BINARY", - "REG_DWORD", - "REG_DWORD_BIG_ENDIAN", - "REG_DWORD_LITTLE_ENDIAN", - "REG_EXPAND_SZ", - "REG_FULL_RESOURCE_DESCRIPTOR", - "REG_LINK", - "REG_MULTI_SZ", - "REG_NONE", - "REG_QWORD", - "REG_QWORD_LITTLE_ENDIAN", - "REG_RESOURCE_LIST", - "REG_RESOURCE_REQUIREMENTS_LIST", - "REG_SZ", - "RLIMIT_AS", - "RLIMIT_CORE", - "RLIMIT_CPU", - "RLIMIT_DATA", - "RLIMIT_FSIZE", - "RLIMIT_NOFILE", - "RLIMIT_STACK", - "RLIM_INFINITY", - "RTAX_ADVMSS", - "RTAX_AUTHOR", - "RTAX_BRD", - "RTAX_CWND", - "RTAX_DST", - "RTAX_FEATURES", - "RTAX_FEATURE_ALLFRAG", - "RTAX_FEATURE_ECN", - "RTAX_FEATURE_SACK", - "RTAX_FEATURE_TIMESTAMP", - "RTAX_GATEWAY", - "RTAX_GENMASK", - "RTAX_HOPLIMIT", - "RTAX_IFA", - "RTAX_IFP", - "RTAX_INITCWND", - "RTAX_INITRWND", - "RTAX_LABEL", - "RTAX_LOCK", - "RTAX_MAX", - "RTAX_MTU", - "RTAX_NETMASK", - "RTAX_REORDERING", - "RTAX_RTO_MIN", - "RTAX_RTT", - "RTAX_RTTVAR", - "RTAX_SRC", - "RTAX_SRCMASK", - "RTAX_SSTHRESH", - "RTAX_TAG", - "RTAX_UNSPEC", - "RTAX_WINDOW", - "RTA_ALIGNTO", - "RTA_AUTHOR", - "RTA_BRD", - "RTA_CACHEINFO", - "RTA_DST", - "RTA_FLOW", - "RTA_GATEWAY", - "RTA_GENMASK", - "RTA_IFA", - "RTA_IFP", - "RTA_IIF", - "RTA_LABEL", - "RTA_MAX", - "RTA_METRICS", - "RTA_MULTIPATH", - "RTA_NETMASK", - "RTA_OIF", - "RTA_PREFSRC", - "RTA_PRIORITY", - "RTA_SRC", - "RTA_SRCMASK", - "RTA_TABLE", - "RTA_TAG", - "RTA_UNSPEC", - "RTCF_DIRECTSRC", - "RTCF_DOREDIRECT", - "RTCF_LOG", - "RTCF_MASQ", - "RTCF_NAT", - "RTCF_VALVE", - "RTF_ADDRCLASSMASK", - "RTF_ADDRCONF", - "RTF_ALLONLINK", - "RTF_ANNOUNCE", - "RTF_BLACKHOLE", - "RTF_BROADCAST", - "RTF_CACHE", - "RTF_CLONED", - "RTF_CLONING", - "RTF_CONDEMNED", - "RTF_DEFAULT", - "RTF_DELCLONE", - "RTF_DONE", - "RTF_DYNAMIC", - "RTF_FLOW", - "RTF_FMASK", - "RTF_GATEWAY", - "RTF_GWFLAG_COMPAT", - "RTF_HOST", - "RTF_IFREF", - "RTF_IFSCOPE", - "RTF_INTERFACE", - "RTF_IRTT", - "RTF_LINKRT", - "RTF_LLDATA", - "RTF_LLINFO", - "RTF_LOCAL", - "RTF_MASK", - "RTF_MODIFIED", - "RTF_MPATH", - "RTF_MPLS", - "RTF_MSS", - "RTF_MTU", - "RTF_MULTICAST", - "RTF_NAT", - "RTF_NOFORWARD", - "RTF_NONEXTHOP", - "RTF_NOPMTUDISC", - "RTF_PERMANENT_ARP", - "RTF_PINNED", - "RTF_POLICY", - "RTF_PRCLONING", - "RTF_PROTO1", - "RTF_PROTO2", - "RTF_PROTO3", - "RTF_REINSTATE", - "RTF_REJECT", - "RTF_RNH_LOCKED", - "RTF_SOURCE", - "RTF_SRC", - "RTF_STATIC", - "RTF_STICKY", - "RTF_THROW", - "RTF_TUNNEL", - "RTF_UP", - "RTF_USETRAILERS", - "RTF_WASCLONED", - "RTF_WINDOW", - "RTF_XRESOLVE", - "RTM_ADD", - "RTM_BASE", - "RTM_CHANGE", - "RTM_CHGADDR", - "RTM_DELACTION", - "RTM_DELADDR", - "RTM_DELADDRLABEL", - "RTM_DELETE", - "RTM_DELLINK", - "RTM_DELMADDR", - "RTM_DELNEIGH", - "RTM_DELQDISC", - "RTM_DELROUTE", - "RTM_DELRULE", - "RTM_DELTCLASS", - "RTM_DELTFILTER", - "RTM_DESYNC", - "RTM_F_CLONED", - "RTM_F_EQUALIZE", - "RTM_F_NOTIFY", - "RTM_F_PREFIX", - "RTM_GET", - "RTM_GET2", - "RTM_GETACTION", - "RTM_GETADDR", - "RTM_GETADDRLABEL", - "RTM_GETANYCAST", - "RTM_GETDCB", - "RTM_GETLINK", - "RTM_GETMULTICAST", - "RTM_GETNEIGH", - "RTM_GETNEIGHTBL", - "RTM_GETQDISC", - "RTM_GETROUTE", - "RTM_GETRULE", - "RTM_GETTCLASS", - "RTM_GETTFILTER", - "RTM_IEEE80211", - "RTM_IFANNOUNCE", - "RTM_IFINFO", - "RTM_IFINFO2", - "RTM_LLINFO_UPD", - "RTM_LOCK", - "RTM_LOSING", - "RTM_MAX", - "RTM_MAXSIZE", - "RTM_MISS", - "RTM_NEWACTION", - "RTM_NEWADDR", - "RTM_NEWADDRLABEL", - "RTM_NEWLINK", - "RTM_NEWMADDR", - "RTM_NEWMADDR2", - "RTM_NEWNDUSEROPT", - "RTM_NEWNEIGH", - "RTM_NEWNEIGHTBL", - "RTM_NEWPREFIX", - "RTM_NEWQDISC", - "RTM_NEWROUTE", - "RTM_NEWRULE", - "RTM_NEWTCLASS", - "RTM_NEWTFILTER", - "RTM_NR_FAMILIES", - "RTM_NR_MSGTYPES", - "RTM_OIFINFO", - "RTM_OLDADD", - "RTM_OLDDEL", - "RTM_OOIFINFO", - "RTM_REDIRECT", - "RTM_RESOLVE", - "RTM_RTTUNIT", - "RTM_SETDCB", - "RTM_SETGATE", - "RTM_SETLINK", - "RTM_SETNEIGHTBL", - "RTM_VERSION", - "RTNH_ALIGNTO", - "RTNH_F_DEAD", - "RTNH_F_ONLINK", - "RTNH_F_PERVASIVE", - "RTNLGRP_IPV4_IFADDR", - "RTNLGRP_IPV4_MROUTE", - "RTNLGRP_IPV4_ROUTE", - "RTNLGRP_IPV4_RULE", - "RTNLGRP_IPV6_IFADDR", - "RTNLGRP_IPV6_IFINFO", - "RTNLGRP_IPV6_MROUTE", - "RTNLGRP_IPV6_PREFIX", - "RTNLGRP_IPV6_ROUTE", - "RTNLGRP_IPV6_RULE", - "RTNLGRP_LINK", - "RTNLGRP_ND_USEROPT", - "RTNLGRP_NEIGH", - "RTNLGRP_NONE", - "RTNLGRP_NOTIFY", - "RTNLGRP_TC", - "RTN_ANYCAST", - "RTN_BLACKHOLE", - "RTN_BROADCAST", - "RTN_LOCAL", - "RTN_MAX", - "RTN_MULTICAST", - "RTN_NAT", - "RTN_PROHIBIT", - "RTN_THROW", - "RTN_UNICAST", - "RTN_UNREACHABLE", - "RTN_UNSPEC", - "RTN_XRESOLVE", - "RTPROT_BIRD", - "RTPROT_BOOT", - "RTPROT_DHCP", - "RTPROT_DNROUTED", - "RTPROT_GATED", - "RTPROT_KERNEL", - "RTPROT_MRT", - "RTPROT_NTK", - "RTPROT_RA", - "RTPROT_REDIRECT", - "RTPROT_STATIC", - "RTPROT_UNSPEC", - "RTPROT_XORP", - "RTPROT_ZEBRA", - "RTV_EXPIRE", - "RTV_HOPCOUNT", - "RTV_MTU", - "RTV_RPIPE", - "RTV_RTT", - "RTV_RTTVAR", - "RTV_SPIPE", - "RTV_SSTHRESH", - "RTV_WEIGHT", - "RT_CACHING_CONTEXT", - "RT_CLASS_DEFAULT", - "RT_CLASS_LOCAL", - "RT_CLASS_MAIN", - "RT_CLASS_MAX", - "RT_CLASS_UNSPEC", - "RT_DEFAULT_FIB", - "RT_NORTREF", - "RT_SCOPE_HOST", - "RT_SCOPE_LINK", - "RT_SCOPE_NOWHERE", - "RT_SCOPE_SITE", - "RT_SCOPE_UNIVERSE", - "RT_TABLEID_MAX", - "RT_TABLE_COMPAT", - "RT_TABLE_DEFAULT", - "RT_TABLE_LOCAL", - "RT_TABLE_MAIN", - "RT_TABLE_MAX", - "RT_TABLE_UNSPEC", - "RUSAGE_CHILDREN", - "RUSAGE_SELF", - "RUSAGE_THREAD", - "Radvisory_t", - "RawConn", - "RawSockaddr", - "RawSockaddrAny", - "RawSockaddrDatalink", - "RawSockaddrInet4", - "RawSockaddrInet6", - "RawSockaddrLinklayer", - "RawSockaddrNetlink", - "RawSockaddrUnix", - "RawSyscall", - "RawSyscall6", - "Read", - "ReadConsole", - "ReadDirectoryChanges", - "ReadDirent", - "ReadFile", - "Readlink", - "Reboot", - "Recvfrom", - "Recvmsg", - "RegCloseKey", - "RegEnumKeyEx", - "RegOpenKeyEx", - "RegQueryInfoKey", - "RegQueryValueEx", - "RemoveDirectory", - "Removexattr", - "Rename", - "Renameat", - "Revoke", - "Rlimit", - "Rmdir", - "RouteMessage", - "RouteRIB", - "RoutingMessage", - "RtAttr", - "RtGenmsg", - "RtMetrics", - "RtMsg", - "RtMsghdr", - "RtNexthop", - "Rusage", - "SCM_BINTIME", - "SCM_CREDENTIALS", - "SCM_CREDS", - "SCM_RIGHTS", - "SCM_TIMESTAMP", - "SCM_TIMESTAMPING", - "SCM_TIMESTAMPNS", - "SCM_TIMESTAMP_MONOTONIC", - "SHUT_RD", - "SHUT_RDWR", - "SHUT_WR", - "SID", - "SIDAndAttributes", - "SIGABRT", - "SIGALRM", - "SIGBUS", - "SIGCHLD", - "SIGCLD", - "SIGCONT", - "SIGEMT", - "SIGFPE", - "SIGHUP", - "SIGILL", - "SIGINFO", - "SIGINT", - "SIGIO", - "SIGIOT", - "SIGKILL", - "SIGLIBRT", - "SIGLWP", - "SIGPIPE", - "SIGPOLL", - "SIGPROF", - "SIGPWR", - "SIGQUIT", - "SIGSEGV", - "SIGSTKFLT", - "SIGSTOP", - "SIGSYS", - "SIGTERM", - "SIGTHR", - "SIGTRAP", - "SIGTSTP", - "SIGTTIN", - "SIGTTOU", - "SIGUNUSED", - "SIGURG", - "SIGUSR1", - "SIGUSR2", - "SIGVTALRM", - "SIGWINCH", - "SIGXCPU", - "SIGXFSZ", - "SIOCADDDLCI", - "SIOCADDMULTI", - "SIOCADDRT", - "SIOCAIFADDR", - "SIOCAIFGROUP", - "SIOCALIFADDR", - "SIOCARPIPLL", - "SIOCATMARK", - "SIOCAUTOADDR", - "SIOCAUTONETMASK", - "SIOCBRDGADD", - "SIOCBRDGADDS", - "SIOCBRDGARL", - "SIOCBRDGDADDR", - "SIOCBRDGDEL", - "SIOCBRDGDELS", - "SIOCBRDGFLUSH", - "SIOCBRDGFRL", - "SIOCBRDGGCACHE", - "SIOCBRDGGFD", - "SIOCBRDGGHT", - "SIOCBRDGGIFFLGS", - "SIOCBRDGGMA", - "SIOCBRDGGPARAM", - "SIOCBRDGGPRI", - "SIOCBRDGGRL", - "SIOCBRDGGSIFS", - "SIOCBRDGGTO", - "SIOCBRDGIFS", - "SIOCBRDGRTS", - "SIOCBRDGSADDR", - "SIOCBRDGSCACHE", - "SIOCBRDGSFD", - "SIOCBRDGSHT", - "SIOCBRDGSIFCOST", - "SIOCBRDGSIFFLGS", - "SIOCBRDGSIFPRIO", - "SIOCBRDGSMA", - "SIOCBRDGSPRI", - "SIOCBRDGSPROTO", - "SIOCBRDGSTO", - "SIOCBRDGSTXHC", - "SIOCDARP", - "SIOCDELDLCI", - "SIOCDELMULTI", - "SIOCDELRT", - "SIOCDEVPRIVATE", - "SIOCDIFADDR", - "SIOCDIFGROUP", - "SIOCDIFPHYADDR", - "SIOCDLIFADDR", - "SIOCDRARP", - "SIOCGARP", - "SIOCGDRVSPEC", - "SIOCGETKALIVE", - "SIOCGETLABEL", - "SIOCGETPFLOW", - "SIOCGETPFSYNC", - "SIOCGETSGCNT", - "SIOCGETVIFCNT", - "SIOCGETVLAN", - "SIOCGHIWAT", - "SIOCGIFADDR", - "SIOCGIFADDRPREF", - "SIOCGIFALIAS", - "SIOCGIFALTMTU", - "SIOCGIFASYNCMAP", - "SIOCGIFBOND", - "SIOCGIFBR", - "SIOCGIFBRDADDR", - "SIOCGIFCAP", - "SIOCGIFCONF", - "SIOCGIFCOUNT", - "SIOCGIFDATA", - "SIOCGIFDESCR", - "SIOCGIFDEVMTU", - "SIOCGIFDLT", - "SIOCGIFDSTADDR", - "SIOCGIFENCAP", - "SIOCGIFFIB", - "SIOCGIFFLAGS", - "SIOCGIFGATTR", - "SIOCGIFGENERIC", - "SIOCGIFGMEMB", - "SIOCGIFGROUP", - "SIOCGIFHARDMTU", - "SIOCGIFHWADDR", - "SIOCGIFINDEX", - "SIOCGIFKPI", - "SIOCGIFMAC", - "SIOCGIFMAP", - "SIOCGIFMEDIA", - "SIOCGIFMEM", - "SIOCGIFMETRIC", - "SIOCGIFMTU", - "SIOCGIFNAME", - "SIOCGIFNETMASK", - "SIOCGIFPDSTADDR", - "SIOCGIFPFLAGS", - "SIOCGIFPHYS", - "SIOCGIFPRIORITY", - "SIOCGIFPSRCADDR", - "SIOCGIFRDOMAIN", - "SIOCGIFRTLABEL", - "SIOCGIFSLAVE", - "SIOCGIFSTATUS", - "SIOCGIFTIMESLOT", - "SIOCGIFTXQLEN", - "SIOCGIFVLAN", - "SIOCGIFWAKEFLAGS", - "SIOCGIFXFLAGS", - "SIOCGLIFADDR", - "SIOCGLIFPHYADDR", - "SIOCGLIFPHYRTABLE", - "SIOCGLIFPHYTTL", - "SIOCGLINKSTR", - "SIOCGLOWAT", - "SIOCGPGRP", - "SIOCGPRIVATE_0", - "SIOCGPRIVATE_1", - "SIOCGRARP", - "SIOCGSPPPPARAMS", - "SIOCGSTAMP", - "SIOCGSTAMPNS", - "SIOCGVH", - "SIOCGVNETID", - "SIOCIFCREATE", - "SIOCIFCREATE2", - "SIOCIFDESTROY", - "SIOCIFGCLONERS", - "SIOCINITIFADDR", - "SIOCPROTOPRIVATE", - "SIOCRSLVMULTI", - "SIOCRTMSG", - "SIOCSARP", - "SIOCSDRVSPEC", - "SIOCSETKALIVE", - "SIOCSETLABEL", - "SIOCSETPFLOW", - "SIOCSETPFSYNC", - "SIOCSETVLAN", - "SIOCSHIWAT", - "SIOCSIFADDR", - "SIOCSIFADDRPREF", - "SIOCSIFALTMTU", - "SIOCSIFASYNCMAP", - "SIOCSIFBOND", - "SIOCSIFBR", - "SIOCSIFBRDADDR", - "SIOCSIFCAP", - "SIOCSIFDESCR", - "SIOCSIFDSTADDR", - "SIOCSIFENCAP", - "SIOCSIFFIB", - "SIOCSIFFLAGS", - "SIOCSIFGATTR", - "SIOCSIFGENERIC", - "SIOCSIFHWADDR", - "SIOCSIFHWBROADCAST", - "SIOCSIFKPI", - "SIOCSIFLINK", - "SIOCSIFLLADDR", - "SIOCSIFMAC", - "SIOCSIFMAP", - "SIOCSIFMEDIA", - "SIOCSIFMEM", - "SIOCSIFMETRIC", - "SIOCSIFMTU", - "SIOCSIFNAME", - "SIOCSIFNETMASK", - "SIOCSIFPFLAGS", - "SIOCSIFPHYADDR", - "SIOCSIFPHYS", - "SIOCSIFPRIORITY", - "SIOCSIFRDOMAIN", - "SIOCSIFRTLABEL", - "SIOCSIFRVNET", - "SIOCSIFSLAVE", - "SIOCSIFTIMESLOT", - "SIOCSIFTXQLEN", - "SIOCSIFVLAN", - "SIOCSIFVNET", - "SIOCSIFXFLAGS", - "SIOCSLIFPHYADDR", - "SIOCSLIFPHYRTABLE", - "SIOCSLIFPHYTTL", - "SIOCSLINKSTR", - "SIOCSLOWAT", - "SIOCSPGRP", - "SIOCSRARP", - "SIOCSSPPPPARAMS", - "SIOCSVH", - "SIOCSVNETID", - "SIOCZIFDATA", - "SIO_GET_EXTENSION_FUNCTION_POINTER", - "SIO_GET_INTERFACE_LIST", - "SIO_KEEPALIVE_VALS", - "SIO_UDP_CONNRESET", - "SOCK_CLOEXEC", - "SOCK_DCCP", - "SOCK_DGRAM", - "SOCK_FLAGS_MASK", - "SOCK_MAXADDRLEN", - "SOCK_NONBLOCK", - "SOCK_NOSIGPIPE", - "SOCK_PACKET", - "SOCK_RAW", - "SOCK_RDM", - "SOCK_SEQPACKET", - "SOCK_STREAM", - "SOL_AAL", - "SOL_ATM", - "SOL_DECNET", - "SOL_ICMPV6", - "SOL_IP", - "SOL_IPV6", - "SOL_IRDA", - "SOL_PACKET", - "SOL_RAW", - "SOL_SOCKET", - "SOL_TCP", - "SOL_X25", - "SOMAXCONN", - "SO_ACCEPTCONN", - "SO_ACCEPTFILTER", - "SO_ATTACH_FILTER", - "SO_BINDANY", - "SO_BINDTODEVICE", - "SO_BINTIME", - "SO_BROADCAST", - "SO_BSDCOMPAT", - "SO_DEBUG", - "SO_DETACH_FILTER", - "SO_DOMAIN", - "SO_DONTROUTE", - "SO_DONTTRUNC", - "SO_ERROR", - "SO_KEEPALIVE", - "SO_LABEL", - "SO_LINGER", - "SO_LINGER_SEC", - "SO_LISTENINCQLEN", - "SO_LISTENQLEN", - "SO_LISTENQLIMIT", - "SO_MARK", - "SO_NETPROC", - "SO_NKE", - "SO_NOADDRERR", - "SO_NOHEADER", - "SO_NOSIGPIPE", - "SO_NOTIFYCONFLICT", - "SO_NO_CHECK", - "SO_NO_DDP", - "SO_NO_OFFLOAD", - "SO_NP_EXTENSIONS", - "SO_NREAD", - "SO_NWRITE", - "SO_OOBINLINE", - "SO_OVERFLOWED", - "SO_PASSCRED", - "SO_PASSSEC", - "SO_PEERCRED", - "SO_PEERLABEL", - "SO_PEERNAME", - "SO_PEERSEC", - "SO_PRIORITY", - "SO_PROTOCOL", - "SO_PROTOTYPE", - "SO_RANDOMPORT", - "SO_RCVBUF", - "SO_RCVBUFFORCE", - "SO_RCVLOWAT", - "SO_RCVTIMEO", - "SO_RESTRICTIONS", - "SO_RESTRICT_DENYIN", - "SO_RESTRICT_DENYOUT", - "SO_RESTRICT_DENYSET", - "SO_REUSEADDR", - "SO_REUSEPORT", - "SO_REUSESHAREUID", - "SO_RTABLE", - "SO_RXQ_OVFL", - "SO_SECURITY_AUTHENTICATION", - "SO_SECURITY_ENCRYPTION_NETWORK", - "SO_SECURITY_ENCRYPTION_TRANSPORT", - "SO_SETFIB", - "SO_SNDBUF", - "SO_SNDBUFFORCE", - "SO_SNDLOWAT", - "SO_SNDTIMEO", - "SO_SPLICE", - "SO_TIMESTAMP", - "SO_TIMESTAMPING", - "SO_TIMESTAMPNS", - "SO_TIMESTAMP_MONOTONIC", - "SO_TYPE", - "SO_UPCALLCLOSEWAIT", - "SO_UPDATE_ACCEPT_CONTEXT", - "SO_UPDATE_CONNECT_CONTEXT", - "SO_USELOOPBACK", - "SO_USER_COOKIE", - "SO_VENDOR", - "SO_WANTMORE", - "SO_WANTOOBFLAG", - "SSLExtraCertChainPolicyPara", - "STANDARD_RIGHTS_ALL", - "STANDARD_RIGHTS_EXECUTE", - "STANDARD_RIGHTS_READ", - "STANDARD_RIGHTS_REQUIRED", - "STANDARD_RIGHTS_WRITE", - "STARTF_USESHOWWINDOW", - "STARTF_USESTDHANDLES", - "STD_ERROR_HANDLE", - "STD_INPUT_HANDLE", - "STD_OUTPUT_HANDLE", - "SUBLANG_ENGLISH_US", - "SW_FORCEMINIMIZE", - "SW_HIDE", - "SW_MAXIMIZE", - "SW_MINIMIZE", - "SW_NORMAL", - "SW_RESTORE", - "SW_SHOW", - "SW_SHOWDEFAULT", - "SW_SHOWMAXIMIZED", - "SW_SHOWMINIMIZED", - "SW_SHOWMINNOACTIVE", - "SW_SHOWNA", - "SW_SHOWNOACTIVATE", - "SW_SHOWNORMAL", - "SYMBOLIC_LINK_FLAG_DIRECTORY", - "SYNCHRONIZE", - "SYSCTL_VERSION", - "SYSCTL_VERS_0", - "SYSCTL_VERS_1", - "SYSCTL_VERS_MASK", - "SYS_ABORT2", - "SYS_ACCEPT", - "SYS_ACCEPT4", - "SYS_ACCEPT_NOCANCEL", - "SYS_ACCESS", - "SYS_ACCESS_EXTENDED", - "SYS_ACCT", - "SYS_ADD_KEY", - "SYS_ADD_PROFIL", - "SYS_ADJFREQ", - "SYS_ADJTIME", - "SYS_ADJTIMEX", - "SYS_AFS_SYSCALL", - "SYS_AIO_CANCEL", - "SYS_AIO_ERROR", - "SYS_AIO_FSYNC", - "SYS_AIO_READ", - "SYS_AIO_RETURN", - "SYS_AIO_SUSPEND", - "SYS_AIO_SUSPEND_NOCANCEL", - "SYS_AIO_WRITE", - "SYS_ALARM", - "SYS_ARCH_PRCTL", - "SYS_ARM_FADVISE64_64", - "SYS_ARM_SYNC_FILE_RANGE", - "SYS_ATGETMSG", - "SYS_ATPGETREQ", - "SYS_ATPGETRSP", - "SYS_ATPSNDREQ", - "SYS_ATPSNDRSP", - "SYS_ATPUTMSG", - "SYS_ATSOCKET", - "SYS_AUDIT", - "SYS_AUDITCTL", - "SYS_AUDITON", - "SYS_AUDIT_SESSION_JOIN", - "SYS_AUDIT_SESSION_PORT", - "SYS_AUDIT_SESSION_SELF", - "SYS_BDFLUSH", - "SYS_BIND", - "SYS_BINDAT", - "SYS_BREAK", - "SYS_BRK", - "SYS_BSDTHREAD_CREATE", - "SYS_BSDTHREAD_REGISTER", - "SYS_BSDTHREAD_TERMINATE", - "SYS_CAPGET", - "SYS_CAPSET", - "SYS_CAP_ENTER", - "SYS_CAP_FCNTLS_GET", - "SYS_CAP_FCNTLS_LIMIT", - "SYS_CAP_GETMODE", - "SYS_CAP_GETRIGHTS", - "SYS_CAP_IOCTLS_GET", - "SYS_CAP_IOCTLS_LIMIT", - "SYS_CAP_NEW", - "SYS_CAP_RIGHTS_GET", - "SYS_CAP_RIGHTS_LIMIT", - "SYS_CHDIR", - "SYS_CHFLAGS", - "SYS_CHFLAGSAT", - "SYS_CHMOD", - "SYS_CHMOD_EXTENDED", - "SYS_CHOWN", - "SYS_CHOWN32", - "SYS_CHROOT", - "SYS_CHUD", - "SYS_CLOCK_ADJTIME", - "SYS_CLOCK_GETCPUCLOCKID2", - "SYS_CLOCK_GETRES", - "SYS_CLOCK_GETTIME", - "SYS_CLOCK_NANOSLEEP", - "SYS_CLOCK_SETTIME", - "SYS_CLONE", - "SYS_CLOSE", - "SYS_CLOSEFROM", - "SYS_CLOSE_NOCANCEL", - "SYS_CONNECT", - "SYS_CONNECTAT", - "SYS_CONNECT_NOCANCEL", - "SYS_COPYFILE", - "SYS_CPUSET", - "SYS_CPUSET_GETAFFINITY", - "SYS_CPUSET_GETID", - "SYS_CPUSET_SETAFFINITY", - "SYS_CPUSET_SETID", - "SYS_CREAT", - "SYS_CREATE_MODULE", - "SYS_CSOPS", - "SYS_DELETE", - "SYS_DELETE_MODULE", - "SYS_DUP", - "SYS_DUP2", - "SYS_DUP3", - "SYS_EACCESS", - "SYS_EPOLL_CREATE", - "SYS_EPOLL_CREATE1", - "SYS_EPOLL_CTL", - "SYS_EPOLL_CTL_OLD", - "SYS_EPOLL_PWAIT", - "SYS_EPOLL_WAIT", - "SYS_EPOLL_WAIT_OLD", - "SYS_EVENTFD", - "SYS_EVENTFD2", - "SYS_EXCHANGEDATA", - "SYS_EXECVE", - "SYS_EXIT", - "SYS_EXIT_GROUP", - "SYS_EXTATTRCTL", - "SYS_EXTATTR_DELETE_FD", - "SYS_EXTATTR_DELETE_FILE", - "SYS_EXTATTR_DELETE_LINK", - "SYS_EXTATTR_GET_FD", - "SYS_EXTATTR_GET_FILE", - "SYS_EXTATTR_GET_LINK", - "SYS_EXTATTR_LIST_FD", - "SYS_EXTATTR_LIST_FILE", - "SYS_EXTATTR_LIST_LINK", - "SYS_EXTATTR_SET_FD", - "SYS_EXTATTR_SET_FILE", - "SYS_EXTATTR_SET_LINK", - "SYS_FACCESSAT", - "SYS_FADVISE64", - "SYS_FADVISE64_64", - "SYS_FALLOCATE", - "SYS_FANOTIFY_INIT", - "SYS_FANOTIFY_MARK", - "SYS_FCHDIR", - "SYS_FCHFLAGS", - "SYS_FCHMOD", - "SYS_FCHMODAT", - "SYS_FCHMOD_EXTENDED", - "SYS_FCHOWN", - "SYS_FCHOWN32", - "SYS_FCHOWNAT", - "SYS_FCHROOT", - "SYS_FCNTL", - "SYS_FCNTL64", - "SYS_FCNTL_NOCANCEL", - "SYS_FDATASYNC", - "SYS_FEXECVE", - "SYS_FFCLOCK_GETCOUNTER", - "SYS_FFCLOCK_GETESTIMATE", - "SYS_FFCLOCK_SETESTIMATE", - "SYS_FFSCTL", - "SYS_FGETATTRLIST", - "SYS_FGETXATTR", - "SYS_FHOPEN", - "SYS_FHSTAT", - "SYS_FHSTATFS", - "SYS_FILEPORT_MAKEFD", - "SYS_FILEPORT_MAKEPORT", - "SYS_FKTRACE", - "SYS_FLISTXATTR", - "SYS_FLOCK", - "SYS_FORK", - "SYS_FPATHCONF", - "SYS_FREEBSD6_FTRUNCATE", - "SYS_FREEBSD6_LSEEK", - "SYS_FREEBSD6_MMAP", - "SYS_FREEBSD6_PREAD", - "SYS_FREEBSD6_PWRITE", - "SYS_FREEBSD6_TRUNCATE", - "SYS_FREMOVEXATTR", - "SYS_FSCTL", - "SYS_FSETATTRLIST", - "SYS_FSETXATTR", - "SYS_FSGETPATH", - "SYS_FSTAT", - "SYS_FSTAT64", - "SYS_FSTAT64_EXTENDED", - "SYS_FSTATAT", - "SYS_FSTATAT64", - "SYS_FSTATFS", - "SYS_FSTATFS64", - "SYS_FSTATV", - "SYS_FSTATVFS1", - "SYS_FSTAT_EXTENDED", - "SYS_FSYNC", - "SYS_FSYNC_NOCANCEL", - "SYS_FSYNC_RANGE", - "SYS_FTIME", - "SYS_FTRUNCATE", - "SYS_FTRUNCATE64", - "SYS_FUTEX", - "SYS_FUTIMENS", - "SYS_FUTIMES", - "SYS_FUTIMESAT", - "SYS_GETATTRLIST", - "SYS_GETAUDIT", - "SYS_GETAUDIT_ADDR", - "SYS_GETAUID", - "SYS_GETCONTEXT", - "SYS_GETCPU", - "SYS_GETCWD", - "SYS_GETDENTS", - "SYS_GETDENTS64", - "SYS_GETDIRENTRIES", - "SYS_GETDIRENTRIES64", - "SYS_GETDIRENTRIESATTR", - "SYS_GETDTABLECOUNT", - "SYS_GETDTABLESIZE", - "SYS_GETEGID", - "SYS_GETEGID32", - "SYS_GETEUID", - "SYS_GETEUID32", - "SYS_GETFH", - "SYS_GETFSSTAT", - "SYS_GETFSSTAT64", - "SYS_GETGID", - "SYS_GETGID32", - "SYS_GETGROUPS", - "SYS_GETGROUPS32", - "SYS_GETHOSTUUID", - "SYS_GETITIMER", - "SYS_GETLCID", - "SYS_GETLOGIN", - "SYS_GETLOGINCLASS", - "SYS_GETPEERNAME", - "SYS_GETPGID", - "SYS_GETPGRP", - "SYS_GETPID", - "SYS_GETPMSG", - "SYS_GETPPID", - "SYS_GETPRIORITY", - "SYS_GETRESGID", - "SYS_GETRESGID32", - "SYS_GETRESUID", - "SYS_GETRESUID32", - "SYS_GETRLIMIT", - "SYS_GETRTABLE", - "SYS_GETRUSAGE", - "SYS_GETSGROUPS", - "SYS_GETSID", - "SYS_GETSOCKNAME", - "SYS_GETSOCKOPT", - "SYS_GETTHRID", - "SYS_GETTID", - "SYS_GETTIMEOFDAY", - "SYS_GETUID", - "SYS_GETUID32", - "SYS_GETVFSSTAT", - "SYS_GETWGROUPS", - "SYS_GETXATTR", - "SYS_GET_KERNEL_SYMS", - "SYS_GET_MEMPOLICY", - "SYS_GET_ROBUST_LIST", - "SYS_GET_THREAD_AREA", - "SYS_GTTY", - "SYS_IDENTITYSVC", - "SYS_IDLE", - "SYS_INITGROUPS", - "SYS_INIT_MODULE", - "SYS_INOTIFY_ADD_WATCH", - "SYS_INOTIFY_INIT", - "SYS_INOTIFY_INIT1", - "SYS_INOTIFY_RM_WATCH", - "SYS_IOCTL", - "SYS_IOPERM", - "SYS_IOPL", - "SYS_IOPOLICYSYS", - "SYS_IOPRIO_GET", - "SYS_IOPRIO_SET", - "SYS_IO_CANCEL", - "SYS_IO_DESTROY", - "SYS_IO_GETEVENTS", - "SYS_IO_SETUP", - "SYS_IO_SUBMIT", - "SYS_IPC", - "SYS_ISSETUGID", - "SYS_JAIL", - "SYS_JAIL_ATTACH", - "SYS_JAIL_GET", - "SYS_JAIL_REMOVE", - "SYS_JAIL_SET", - "SYS_KDEBUG_TRACE", - "SYS_KENV", - "SYS_KEVENT", - "SYS_KEVENT64", - "SYS_KEXEC_LOAD", - "SYS_KEYCTL", - "SYS_KILL", - "SYS_KLDFIND", - "SYS_KLDFIRSTMOD", - "SYS_KLDLOAD", - "SYS_KLDNEXT", - "SYS_KLDSTAT", - "SYS_KLDSYM", - "SYS_KLDUNLOAD", - "SYS_KLDUNLOADF", - "SYS_KQUEUE", - "SYS_KQUEUE1", - "SYS_KTIMER_CREATE", - "SYS_KTIMER_DELETE", - "SYS_KTIMER_GETOVERRUN", - "SYS_KTIMER_GETTIME", - "SYS_KTIMER_SETTIME", - "SYS_KTRACE", - "SYS_LCHFLAGS", - "SYS_LCHMOD", - "SYS_LCHOWN", - "SYS_LCHOWN32", - "SYS_LGETFH", - "SYS_LGETXATTR", - "SYS_LINK", - "SYS_LINKAT", - "SYS_LIO_LISTIO", - "SYS_LISTEN", - "SYS_LISTXATTR", - "SYS_LLISTXATTR", - "SYS_LOCK", - "SYS_LOOKUP_DCOOKIE", - "SYS_LPATHCONF", - "SYS_LREMOVEXATTR", - "SYS_LSEEK", - "SYS_LSETXATTR", - "SYS_LSTAT", - "SYS_LSTAT64", - "SYS_LSTAT64_EXTENDED", - "SYS_LSTATV", - "SYS_LSTAT_EXTENDED", - "SYS_LUTIMES", - "SYS_MAC_SYSCALL", - "SYS_MADVISE", - "SYS_MADVISE1", - "SYS_MAXSYSCALL", - "SYS_MBIND", - "SYS_MIGRATE_PAGES", - "SYS_MINCORE", - "SYS_MINHERIT", - "SYS_MKCOMPLEX", - "SYS_MKDIR", - "SYS_MKDIRAT", - "SYS_MKDIR_EXTENDED", - "SYS_MKFIFO", - "SYS_MKFIFOAT", - "SYS_MKFIFO_EXTENDED", - "SYS_MKNOD", - "SYS_MKNODAT", - "SYS_MLOCK", - "SYS_MLOCKALL", - "SYS_MMAP", - "SYS_MMAP2", - "SYS_MODCTL", - "SYS_MODFIND", - "SYS_MODFNEXT", - "SYS_MODIFY_LDT", - "SYS_MODNEXT", - "SYS_MODSTAT", - "SYS_MODWATCH", - "SYS_MOUNT", - "SYS_MOVE_PAGES", - "SYS_MPROTECT", - "SYS_MPX", - "SYS_MQUERY", - "SYS_MQ_GETSETATTR", - "SYS_MQ_NOTIFY", - "SYS_MQ_OPEN", - "SYS_MQ_TIMEDRECEIVE", - "SYS_MQ_TIMEDSEND", - "SYS_MQ_UNLINK", - "SYS_MREMAP", - "SYS_MSGCTL", - "SYS_MSGGET", - "SYS_MSGRCV", - "SYS_MSGRCV_NOCANCEL", - "SYS_MSGSND", - "SYS_MSGSND_NOCANCEL", - "SYS_MSGSYS", - "SYS_MSYNC", - "SYS_MSYNC_NOCANCEL", - "SYS_MUNLOCK", - "SYS_MUNLOCKALL", - "SYS_MUNMAP", - "SYS_NAME_TO_HANDLE_AT", - "SYS_NANOSLEEP", - "SYS_NEWFSTATAT", - "SYS_NFSCLNT", - "SYS_NFSSERVCTL", - "SYS_NFSSVC", - "SYS_NFSTAT", - "SYS_NICE", - "SYS_NLSTAT", - "SYS_NMOUNT", - "SYS_NSTAT", - "SYS_NTP_ADJTIME", - "SYS_NTP_GETTIME", - "SYS_OABI_SYSCALL_BASE", - "SYS_OBREAK", - "SYS_OLDFSTAT", - "SYS_OLDLSTAT", - "SYS_OLDOLDUNAME", - "SYS_OLDSTAT", - "SYS_OLDUNAME", - "SYS_OPEN", - "SYS_OPENAT", - "SYS_OPENBSD_POLL", - "SYS_OPEN_BY_HANDLE_AT", - "SYS_OPEN_EXTENDED", - "SYS_OPEN_NOCANCEL", - "SYS_OVADVISE", - "SYS_PACCEPT", - "SYS_PATHCONF", - "SYS_PAUSE", - "SYS_PCICONFIG_IOBASE", - "SYS_PCICONFIG_READ", - "SYS_PCICONFIG_WRITE", - "SYS_PDFORK", - "SYS_PDGETPID", - "SYS_PDKILL", - "SYS_PERF_EVENT_OPEN", - "SYS_PERSONALITY", - "SYS_PID_HIBERNATE", - "SYS_PID_RESUME", - "SYS_PID_SHUTDOWN_SOCKETS", - "SYS_PID_SUSPEND", - "SYS_PIPE", - "SYS_PIPE2", - "SYS_PIVOT_ROOT", - "SYS_PMC_CONTROL", - "SYS_PMC_GET_INFO", - "SYS_POLL", - "SYS_POLLTS", - "SYS_POLL_NOCANCEL", - "SYS_POSIX_FADVISE", - "SYS_POSIX_FALLOCATE", - "SYS_POSIX_OPENPT", - "SYS_POSIX_SPAWN", - "SYS_PPOLL", - "SYS_PRCTL", - "SYS_PREAD", - "SYS_PREAD64", - "SYS_PREADV", - "SYS_PREAD_NOCANCEL", - "SYS_PRLIMIT64", - "SYS_PROCCTL", - "SYS_PROCESS_POLICY", - "SYS_PROCESS_VM_READV", - "SYS_PROCESS_VM_WRITEV", - "SYS_PROC_INFO", - "SYS_PROF", - "SYS_PROFIL", - "SYS_PSELECT", - "SYS_PSELECT6", - "SYS_PSET_ASSIGN", - "SYS_PSET_CREATE", - "SYS_PSET_DESTROY", - "SYS_PSYNCH_CVBROAD", - "SYS_PSYNCH_CVCLRPREPOST", - "SYS_PSYNCH_CVSIGNAL", - "SYS_PSYNCH_CVWAIT", - "SYS_PSYNCH_MUTEXDROP", - "SYS_PSYNCH_MUTEXWAIT", - "SYS_PSYNCH_RW_DOWNGRADE", - "SYS_PSYNCH_RW_LONGRDLOCK", - "SYS_PSYNCH_RW_RDLOCK", - "SYS_PSYNCH_RW_UNLOCK", - "SYS_PSYNCH_RW_UNLOCK2", - "SYS_PSYNCH_RW_UPGRADE", - "SYS_PSYNCH_RW_WRLOCK", - "SYS_PSYNCH_RW_YIELDWRLOCK", - "SYS_PTRACE", - "SYS_PUTPMSG", - "SYS_PWRITE", - "SYS_PWRITE64", - "SYS_PWRITEV", - "SYS_PWRITE_NOCANCEL", - "SYS_QUERY_MODULE", - "SYS_QUOTACTL", - "SYS_RASCTL", - "SYS_RCTL_ADD_RULE", - "SYS_RCTL_GET_LIMITS", - "SYS_RCTL_GET_RACCT", - "SYS_RCTL_GET_RULES", - "SYS_RCTL_REMOVE_RULE", - "SYS_READ", - "SYS_READAHEAD", - "SYS_READDIR", - "SYS_READLINK", - "SYS_READLINKAT", - "SYS_READV", - "SYS_READV_NOCANCEL", - "SYS_READ_NOCANCEL", - "SYS_REBOOT", - "SYS_RECV", - "SYS_RECVFROM", - "SYS_RECVFROM_NOCANCEL", - "SYS_RECVMMSG", - "SYS_RECVMSG", - "SYS_RECVMSG_NOCANCEL", - "SYS_REMAP_FILE_PAGES", - "SYS_REMOVEXATTR", - "SYS_RENAME", - "SYS_RENAMEAT", - "SYS_REQUEST_KEY", - "SYS_RESTART_SYSCALL", - "SYS_REVOKE", - "SYS_RFORK", - "SYS_RMDIR", - "SYS_RTPRIO", - "SYS_RTPRIO_THREAD", - "SYS_RT_SIGACTION", - "SYS_RT_SIGPENDING", - "SYS_RT_SIGPROCMASK", - "SYS_RT_SIGQUEUEINFO", - "SYS_RT_SIGRETURN", - "SYS_RT_SIGSUSPEND", - "SYS_RT_SIGTIMEDWAIT", - "SYS_RT_TGSIGQUEUEINFO", - "SYS_SBRK", - "SYS_SCHED_GETAFFINITY", - "SYS_SCHED_GETPARAM", - "SYS_SCHED_GETSCHEDULER", - "SYS_SCHED_GET_PRIORITY_MAX", - "SYS_SCHED_GET_PRIORITY_MIN", - "SYS_SCHED_RR_GET_INTERVAL", - "SYS_SCHED_SETAFFINITY", - "SYS_SCHED_SETPARAM", - "SYS_SCHED_SETSCHEDULER", - "SYS_SCHED_YIELD", - "SYS_SCTP_GENERIC_RECVMSG", - "SYS_SCTP_GENERIC_SENDMSG", - "SYS_SCTP_GENERIC_SENDMSG_IOV", - "SYS_SCTP_PEELOFF", - "SYS_SEARCHFS", - "SYS_SECURITY", - "SYS_SELECT", - "SYS_SELECT_NOCANCEL", - "SYS_SEMCONFIG", - "SYS_SEMCTL", - "SYS_SEMGET", - "SYS_SEMOP", - "SYS_SEMSYS", - "SYS_SEMTIMEDOP", - "SYS_SEM_CLOSE", - "SYS_SEM_DESTROY", - "SYS_SEM_GETVALUE", - "SYS_SEM_INIT", - "SYS_SEM_OPEN", - "SYS_SEM_POST", - "SYS_SEM_TRYWAIT", - "SYS_SEM_UNLINK", - "SYS_SEM_WAIT", - "SYS_SEM_WAIT_NOCANCEL", - "SYS_SEND", - "SYS_SENDFILE", - "SYS_SENDFILE64", - "SYS_SENDMMSG", - "SYS_SENDMSG", - "SYS_SENDMSG_NOCANCEL", - "SYS_SENDTO", - "SYS_SENDTO_NOCANCEL", - "SYS_SETATTRLIST", - "SYS_SETAUDIT", - "SYS_SETAUDIT_ADDR", - "SYS_SETAUID", - "SYS_SETCONTEXT", - "SYS_SETDOMAINNAME", - "SYS_SETEGID", - "SYS_SETEUID", - "SYS_SETFIB", - "SYS_SETFSGID", - "SYS_SETFSGID32", - "SYS_SETFSUID", - "SYS_SETFSUID32", - "SYS_SETGID", - "SYS_SETGID32", - "SYS_SETGROUPS", - "SYS_SETGROUPS32", - "SYS_SETHOSTNAME", - "SYS_SETITIMER", - "SYS_SETLCID", - "SYS_SETLOGIN", - "SYS_SETLOGINCLASS", - "SYS_SETNS", - "SYS_SETPGID", - "SYS_SETPRIORITY", - "SYS_SETPRIVEXEC", - "SYS_SETREGID", - "SYS_SETREGID32", - "SYS_SETRESGID", - "SYS_SETRESGID32", - "SYS_SETRESUID", - "SYS_SETRESUID32", - "SYS_SETREUID", - "SYS_SETREUID32", - "SYS_SETRLIMIT", - "SYS_SETRTABLE", - "SYS_SETSGROUPS", - "SYS_SETSID", - "SYS_SETSOCKOPT", - "SYS_SETTID", - "SYS_SETTID_WITH_PID", - "SYS_SETTIMEOFDAY", - "SYS_SETUID", - "SYS_SETUID32", - "SYS_SETWGROUPS", - "SYS_SETXATTR", - "SYS_SET_MEMPOLICY", - "SYS_SET_ROBUST_LIST", - "SYS_SET_THREAD_AREA", - "SYS_SET_TID_ADDRESS", - "SYS_SGETMASK", - "SYS_SHARED_REGION_CHECK_NP", - "SYS_SHARED_REGION_MAP_AND_SLIDE_NP", - "SYS_SHMAT", - "SYS_SHMCTL", - "SYS_SHMDT", - "SYS_SHMGET", - "SYS_SHMSYS", - "SYS_SHM_OPEN", - "SYS_SHM_UNLINK", - "SYS_SHUTDOWN", - "SYS_SIGACTION", - "SYS_SIGALTSTACK", - "SYS_SIGNAL", - "SYS_SIGNALFD", - "SYS_SIGNALFD4", - "SYS_SIGPENDING", - "SYS_SIGPROCMASK", - "SYS_SIGQUEUE", - "SYS_SIGQUEUEINFO", - "SYS_SIGRETURN", - "SYS_SIGSUSPEND", - "SYS_SIGSUSPEND_NOCANCEL", - "SYS_SIGTIMEDWAIT", - "SYS_SIGWAIT", - "SYS_SIGWAITINFO", - "SYS_SOCKET", - "SYS_SOCKETCALL", - "SYS_SOCKETPAIR", - "SYS_SPLICE", - "SYS_SSETMASK", - "SYS_SSTK", - "SYS_STACK_SNAPSHOT", - "SYS_STAT", - "SYS_STAT64", - "SYS_STAT64_EXTENDED", - "SYS_STATFS", - "SYS_STATFS64", - "SYS_STATV", - "SYS_STATVFS1", - "SYS_STAT_EXTENDED", - "SYS_STIME", - "SYS_STTY", - "SYS_SWAPCONTEXT", - "SYS_SWAPCTL", - "SYS_SWAPOFF", - "SYS_SWAPON", - "SYS_SYMLINK", - "SYS_SYMLINKAT", - "SYS_SYNC", - "SYS_SYNCFS", - "SYS_SYNC_FILE_RANGE", - "SYS_SYSARCH", - "SYS_SYSCALL", - "SYS_SYSCALL_BASE", - "SYS_SYSFS", - "SYS_SYSINFO", - "SYS_SYSLOG", - "SYS_TEE", - "SYS_TGKILL", - "SYS_THREAD_SELFID", - "SYS_THR_CREATE", - "SYS_THR_EXIT", - "SYS_THR_KILL", - "SYS_THR_KILL2", - "SYS_THR_NEW", - "SYS_THR_SELF", - "SYS_THR_SET_NAME", - "SYS_THR_SUSPEND", - "SYS_THR_WAKE", - "SYS_TIME", - "SYS_TIMERFD_CREATE", - "SYS_TIMERFD_GETTIME", - "SYS_TIMERFD_SETTIME", - "SYS_TIMER_CREATE", - "SYS_TIMER_DELETE", - "SYS_TIMER_GETOVERRUN", - "SYS_TIMER_GETTIME", - "SYS_TIMER_SETTIME", - "SYS_TIMES", - "SYS_TKILL", - "SYS_TRUNCATE", - "SYS_TRUNCATE64", - "SYS_TUXCALL", - "SYS_UGETRLIMIT", - "SYS_ULIMIT", - "SYS_UMASK", - "SYS_UMASK_EXTENDED", - "SYS_UMOUNT", - "SYS_UMOUNT2", - "SYS_UNAME", - "SYS_UNDELETE", - "SYS_UNLINK", - "SYS_UNLINKAT", - "SYS_UNMOUNT", - "SYS_UNSHARE", - "SYS_USELIB", - "SYS_USTAT", - "SYS_UTIME", - "SYS_UTIMENSAT", - "SYS_UTIMES", - "SYS_UTRACE", - "SYS_UUIDGEN", - "SYS_VADVISE", - "SYS_VFORK", - "SYS_VHANGUP", - "SYS_VM86", - "SYS_VM86OLD", - "SYS_VMSPLICE", - "SYS_VM_PRESSURE_MONITOR", - "SYS_VSERVER", - "SYS_WAIT4", - "SYS_WAIT4_NOCANCEL", - "SYS_WAIT6", - "SYS_WAITEVENT", - "SYS_WAITID", - "SYS_WAITID_NOCANCEL", - "SYS_WAITPID", - "SYS_WATCHEVENT", - "SYS_WORKQ_KERNRETURN", - "SYS_WORKQ_OPEN", - "SYS_WRITE", - "SYS_WRITEV", - "SYS_WRITEV_NOCANCEL", - "SYS_WRITE_NOCANCEL", - "SYS_YIELD", - "SYS__LLSEEK", - "SYS__LWP_CONTINUE", - "SYS__LWP_CREATE", - "SYS__LWP_CTL", - "SYS__LWP_DETACH", - "SYS__LWP_EXIT", - "SYS__LWP_GETNAME", - "SYS__LWP_GETPRIVATE", - "SYS__LWP_KILL", - "SYS__LWP_PARK", - "SYS__LWP_SELF", - "SYS__LWP_SETNAME", - "SYS__LWP_SETPRIVATE", - "SYS__LWP_SUSPEND", - "SYS__LWP_UNPARK", - "SYS__LWP_UNPARK_ALL", - "SYS__LWP_WAIT", - "SYS__LWP_WAKEUP", - "SYS__NEWSELECT", - "SYS__PSET_BIND", - "SYS__SCHED_GETAFFINITY", - "SYS__SCHED_GETPARAM", - "SYS__SCHED_SETAFFINITY", - "SYS__SCHED_SETPARAM", - "SYS__SYSCTL", - "SYS__UMTX_LOCK", - "SYS__UMTX_OP", - "SYS__UMTX_UNLOCK", - "SYS___ACL_ACLCHECK_FD", - "SYS___ACL_ACLCHECK_FILE", - "SYS___ACL_ACLCHECK_LINK", - "SYS___ACL_DELETE_FD", - "SYS___ACL_DELETE_FILE", - "SYS___ACL_DELETE_LINK", - "SYS___ACL_GET_FD", - "SYS___ACL_GET_FILE", - "SYS___ACL_GET_LINK", - "SYS___ACL_SET_FD", - "SYS___ACL_SET_FILE", - "SYS___ACL_SET_LINK", - "SYS___CLONE", - "SYS___DISABLE_THREADSIGNAL", - "SYS___GETCWD", - "SYS___GETLOGIN", - "SYS___GET_TCB", - "SYS___MAC_EXECVE", - "SYS___MAC_GETFSSTAT", - "SYS___MAC_GET_FD", - "SYS___MAC_GET_FILE", - "SYS___MAC_GET_LCID", - "SYS___MAC_GET_LCTX", - "SYS___MAC_GET_LINK", - "SYS___MAC_GET_MOUNT", - "SYS___MAC_GET_PID", - "SYS___MAC_GET_PROC", - "SYS___MAC_MOUNT", - "SYS___MAC_SET_FD", - "SYS___MAC_SET_FILE", - "SYS___MAC_SET_LCTX", - "SYS___MAC_SET_LINK", - "SYS___MAC_SET_PROC", - "SYS___MAC_SYSCALL", - "SYS___OLD_SEMWAIT_SIGNAL", - "SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL", - "SYS___POSIX_CHOWN", - "SYS___POSIX_FCHOWN", - "SYS___POSIX_LCHOWN", - "SYS___POSIX_RENAME", - "SYS___PTHREAD_CANCELED", - "SYS___PTHREAD_CHDIR", - "SYS___PTHREAD_FCHDIR", - "SYS___PTHREAD_KILL", - "SYS___PTHREAD_MARKCANCEL", - "SYS___PTHREAD_SIGMASK", - "SYS___QUOTACTL", - "SYS___SEMCTL", - "SYS___SEMWAIT_SIGNAL", - "SYS___SEMWAIT_SIGNAL_NOCANCEL", - "SYS___SETLOGIN", - "SYS___SETUGID", - "SYS___SET_TCB", - "SYS___SIGACTION_SIGTRAMP", - "SYS___SIGTIMEDWAIT", - "SYS___SIGWAIT", - "SYS___SIGWAIT_NOCANCEL", - "SYS___SYSCTL", - "SYS___TFORK", - "SYS___THREXIT", - "SYS___THRSIGDIVERT", - "SYS___THRSLEEP", - "SYS___THRWAKEUP", - "S_ARCH1", - "S_ARCH2", - "S_BLKSIZE", - "S_IEXEC", - "S_IFBLK", - "S_IFCHR", - "S_IFDIR", - "S_IFIFO", - "S_IFLNK", - "S_IFMT", - "S_IFREG", - "S_IFSOCK", - "S_IFWHT", - "S_IREAD", - "S_IRGRP", - "S_IROTH", - "S_IRUSR", - "S_IRWXG", - "S_IRWXO", - "S_IRWXU", - "S_ISGID", - "S_ISTXT", - "S_ISUID", - "S_ISVTX", - "S_IWGRP", - "S_IWOTH", - "S_IWRITE", - "S_IWUSR", - "S_IXGRP", - "S_IXOTH", - "S_IXUSR", - "S_LOGIN_SET", - "SecurityAttributes", - "Seek", - "Select", - "Sendfile", - "Sendmsg", - "SendmsgN", - "Sendto", - "Servent", - "SetBpf", - "SetBpfBuflen", - "SetBpfDatalink", - "SetBpfHeadercmpl", - "SetBpfImmediate", - "SetBpfInterface", - "SetBpfPromisc", - "SetBpfTimeout", - "SetCurrentDirectory", - "SetEndOfFile", - "SetEnvironmentVariable", - "SetFileAttributes", - "SetFileCompletionNotificationModes", - "SetFilePointer", - "SetFileTime", - "SetHandleInformation", - "SetKevent", - "SetLsfPromisc", - "SetNonblock", - "Setdomainname", - "Setegid", - "Setenv", - "Seteuid", - "Setfsgid", - "Setfsuid", - "Setgid", - "Setgroups", - "Sethostname", - "Setlogin", - "Setpgid", - "Setpriority", - "Setprivexec", - "Setregid", - "Setresgid", - "Setresuid", - "Setreuid", - "Setrlimit", - "Setsid", - "Setsockopt", - "SetsockoptByte", - "SetsockoptICMPv6Filter", - "SetsockoptIPMreq", - "SetsockoptIPMreqn", - "SetsockoptIPv6Mreq", - "SetsockoptInet4Addr", - "SetsockoptInt", - "SetsockoptLinger", - "SetsockoptString", - "SetsockoptTimeval", - "Settimeofday", - "Setuid", - "Setxattr", - "Shutdown", - "SidTypeAlias", - "SidTypeComputer", - "SidTypeDeletedAccount", - "SidTypeDomain", - "SidTypeGroup", - "SidTypeInvalid", - "SidTypeLabel", - "SidTypeUnknown", - "SidTypeUser", - "SidTypeWellKnownGroup", - "Signal", - "SizeofBpfHdr", - "SizeofBpfInsn", - "SizeofBpfProgram", - "SizeofBpfStat", - "SizeofBpfVersion", - "SizeofBpfZbuf", - "SizeofBpfZbufHeader", - "SizeofCmsghdr", - "SizeofICMPv6Filter", - "SizeofIPMreq", - "SizeofIPMreqn", - "SizeofIPv6MTUInfo", - "SizeofIPv6Mreq", - "SizeofIfAddrmsg", - "SizeofIfAnnounceMsghdr", - "SizeofIfData", - "SizeofIfInfomsg", - "SizeofIfMsghdr", - "SizeofIfaMsghdr", - "SizeofIfmaMsghdr", - "SizeofIfmaMsghdr2", - "SizeofInet4Pktinfo", - "SizeofInet6Pktinfo", - "SizeofInotifyEvent", - "SizeofLinger", - "SizeofMsghdr", - "SizeofNlAttr", - "SizeofNlMsgerr", - "SizeofNlMsghdr", - "SizeofRtAttr", - "SizeofRtGenmsg", - "SizeofRtMetrics", - "SizeofRtMsg", - "SizeofRtMsghdr", - "SizeofRtNexthop", - "SizeofSockFilter", - "SizeofSockFprog", - "SizeofSockaddrAny", - "SizeofSockaddrDatalink", - "SizeofSockaddrInet4", - "SizeofSockaddrInet6", - "SizeofSockaddrLinklayer", - "SizeofSockaddrNetlink", - "SizeofSockaddrUnix", - "SizeofTCPInfo", - "SizeofUcred", - "SlicePtrFromStrings", - "SockFilter", - "SockFprog", - "Sockaddr", - "SockaddrDatalink", - "SockaddrGen", - "SockaddrInet4", - "SockaddrInet6", - "SockaddrLinklayer", - "SockaddrNetlink", - "SockaddrUnix", - "Socket", - "SocketControlMessage", - "SocketDisableIPv6", - "Socketpair", - "Splice", - "StartProcess", - "StartupInfo", - "Stat", - "Stat_t", - "Statfs", - "Statfs_t", - "Stderr", - "Stdin", - "Stdout", - "StringBytePtr", - "StringByteSlice", - "StringSlicePtr", - "StringToSid", - "StringToUTF16", - "StringToUTF16Ptr", - "Symlink", - "Sync", - "SyncFileRange", - "SysProcAttr", - "SysProcIDMap", - "Syscall", - "Syscall12", - "Syscall15", - "Syscall18", - "Syscall6", - "Syscall9", - "Sysctl", - "SysctlUint32", - "Sysctlnode", - "Sysinfo", - "Sysinfo_t", - "Systemtime", - "TCGETS", - "TCIFLUSH", - "TCIOFLUSH", - "TCOFLUSH", - "TCPInfo", - "TCPKeepalive", - "TCP_CA_NAME_MAX", - "TCP_CONGCTL", - "TCP_CONGESTION", - "TCP_CONNECTIONTIMEOUT", - "TCP_CORK", - "TCP_DEFER_ACCEPT", - "TCP_INFO", - "TCP_KEEPALIVE", - "TCP_KEEPCNT", - "TCP_KEEPIDLE", - "TCP_KEEPINIT", - "TCP_KEEPINTVL", - "TCP_LINGER2", - "TCP_MAXBURST", - "TCP_MAXHLEN", - "TCP_MAXOLEN", - "TCP_MAXSEG", - "TCP_MAXWIN", - "TCP_MAX_SACK", - "TCP_MAX_WINSHIFT", - "TCP_MD5SIG", - "TCP_MD5SIG_MAXKEYLEN", - "TCP_MINMSS", - "TCP_MINMSSOVERLOAD", - "TCP_MSS", - "TCP_NODELAY", - "TCP_NOOPT", - "TCP_NOPUSH", - "TCP_NSTATES", - "TCP_QUICKACK", - "TCP_RXT_CONNDROPTIME", - "TCP_RXT_FINDROP", - "TCP_SACK_ENABLE", - "TCP_SYNCNT", - "TCP_VENDOR", - "TCP_WINDOW_CLAMP", - "TCSAFLUSH", - "TCSETS", - "TF_DISCONNECT", - "TF_REUSE_SOCKET", - "TF_USE_DEFAULT_WORKER", - "TF_USE_KERNEL_APC", - "TF_USE_SYSTEM_THREAD", - "TF_WRITE_BEHIND", - "TH32CS_INHERIT", - "TH32CS_SNAPALL", - "TH32CS_SNAPHEAPLIST", - "TH32CS_SNAPMODULE", - "TH32CS_SNAPMODULE32", - "TH32CS_SNAPPROCESS", - "TH32CS_SNAPTHREAD", - "TIME_ZONE_ID_DAYLIGHT", - "TIME_ZONE_ID_STANDARD", - "TIME_ZONE_ID_UNKNOWN", - "TIOCCBRK", - "TIOCCDTR", - "TIOCCONS", - "TIOCDCDTIMESTAMP", - "TIOCDRAIN", - "TIOCDSIMICROCODE", - "TIOCEXCL", - "TIOCEXT", - "TIOCFLAG_CDTRCTS", - "TIOCFLAG_CLOCAL", - "TIOCFLAG_CRTSCTS", - "TIOCFLAG_MDMBUF", - "TIOCFLAG_PPS", - "TIOCFLAG_SOFTCAR", - "TIOCFLUSH", - "TIOCGDEV", - "TIOCGDRAINWAIT", - "TIOCGETA", - "TIOCGETD", - "TIOCGFLAGS", - "TIOCGICOUNT", - "TIOCGLCKTRMIOS", - "TIOCGLINED", - "TIOCGPGRP", - "TIOCGPTN", - "TIOCGQSIZE", - "TIOCGRANTPT", - "TIOCGRS485", - "TIOCGSERIAL", - "TIOCGSID", - "TIOCGSIZE", - "TIOCGSOFTCAR", - "TIOCGTSTAMP", - "TIOCGWINSZ", - "TIOCINQ", - "TIOCIXOFF", - "TIOCIXON", - "TIOCLINUX", - "TIOCMBIC", - "TIOCMBIS", - "TIOCMGDTRWAIT", - "TIOCMGET", - "TIOCMIWAIT", - "TIOCMODG", - "TIOCMODS", - "TIOCMSDTRWAIT", - "TIOCMSET", - "TIOCM_CAR", - "TIOCM_CD", - "TIOCM_CTS", - "TIOCM_DCD", - "TIOCM_DSR", - "TIOCM_DTR", - "TIOCM_LE", - "TIOCM_RI", - "TIOCM_RNG", - "TIOCM_RTS", - "TIOCM_SR", - "TIOCM_ST", - "TIOCNOTTY", - "TIOCNXCL", - "TIOCOUTQ", - "TIOCPKT", - "TIOCPKT_DATA", - "TIOCPKT_DOSTOP", - "TIOCPKT_FLUSHREAD", - "TIOCPKT_FLUSHWRITE", - "TIOCPKT_IOCTL", - "TIOCPKT_NOSTOP", - "TIOCPKT_START", - "TIOCPKT_STOP", - "TIOCPTMASTER", - "TIOCPTMGET", - "TIOCPTSNAME", - "TIOCPTYGNAME", - "TIOCPTYGRANT", - "TIOCPTYUNLK", - "TIOCRCVFRAME", - "TIOCREMOTE", - "TIOCSBRK", - "TIOCSCONS", - "TIOCSCTTY", - "TIOCSDRAINWAIT", - "TIOCSDTR", - "TIOCSERCONFIG", - "TIOCSERGETLSR", - "TIOCSERGETMULTI", - "TIOCSERGSTRUCT", - "TIOCSERGWILD", - "TIOCSERSETMULTI", - "TIOCSERSWILD", - "TIOCSER_TEMT", - "TIOCSETA", - "TIOCSETAF", - "TIOCSETAW", - "TIOCSETD", - "TIOCSFLAGS", - "TIOCSIG", - "TIOCSLCKTRMIOS", - "TIOCSLINED", - "TIOCSPGRP", - "TIOCSPTLCK", - "TIOCSQSIZE", - "TIOCSRS485", - "TIOCSSERIAL", - "TIOCSSIZE", - "TIOCSSOFTCAR", - "TIOCSTART", - "TIOCSTAT", - "TIOCSTI", - "TIOCSTOP", - "TIOCSTSTAMP", - "TIOCSWINSZ", - "TIOCTIMESTAMP", - "TIOCUCNTL", - "TIOCVHANGUP", - "TIOCXMTFRAME", - "TOKEN_ADJUST_DEFAULT", - "TOKEN_ADJUST_GROUPS", - "TOKEN_ADJUST_PRIVILEGES", - "TOKEN_ADJUST_SESSIONID", - "TOKEN_ALL_ACCESS", - "TOKEN_ASSIGN_PRIMARY", - "TOKEN_DUPLICATE", - "TOKEN_EXECUTE", - "TOKEN_IMPERSONATE", - "TOKEN_QUERY", - "TOKEN_QUERY_SOURCE", - "TOKEN_READ", - "TOKEN_WRITE", - "TOSTOP", - "TRUNCATE_EXISTING", - "TUNATTACHFILTER", - "TUNDETACHFILTER", - "TUNGETFEATURES", - "TUNGETIFF", - "TUNGETSNDBUF", - "TUNGETVNETHDRSZ", - "TUNSETDEBUG", - "TUNSETGROUP", - "TUNSETIFF", - "TUNSETLINK", - "TUNSETNOCSUM", - "TUNSETOFFLOAD", - "TUNSETOWNER", - "TUNSETPERSIST", - "TUNSETSNDBUF", - "TUNSETTXFILTER", - "TUNSETVNETHDRSZ", - "Tee", - "TerminateProcess", - "Termios", - "Tgkill", - "Time", - "Time_t", - "Times", - "Timespec", - "TimespecToNsec", - "Timeval", - "Timeval32", - "TimevalToNsec", - "Timex", - "Timezoneinformation", - "Tms", - "Token", - "TokenAccessInformation", - "TokenAuditPolicy", - "TokenDefaultDacl", - "TokenElevation", - "TokenElevationType", - "TokenGroups", - "TokenGroupsAndPrivileges", - "TokenHasRestrictions", - "TokenImpersonationLevel", - "TokenIntegrityLevel", - "TokenLinkedToken", - "TokenLogonSid", - "TokenMandatoryPolicy", - "TokenOrigin", - "TokenOwner", - "TokenPrimaryGroup", - "TokenPrivileges", - "TokenRestrictedSids", - "TokenSandBoxInert", - "TokenSessionId", - "TokenSessionReference", - "TokenSource", - "TokenStatistics", - "TokenType", - "TokenUIAccess", - "TokenUser", - "TokenVirtualizationAllowed", - "TokenVirtualizationEnabled", - "Tokenprimarygroup", - "Tokenuser", - "TranslateAccountName", - "TranslateName", - "TransmitFile", - "TransmitFileBuffers", - "Truncate", - "UNIX_PATH_MAX", - "USAGE_MATCH_TYPE_AND", - "USAGE_MATCH_TYPE_OR", - "UTF16FromString", - "UTF16PtrFromString", - "UTF16ToString", - "Ucred", - "Umask", - "Uname", - "Undelete", - "UnixCredentials", - "UnixRights", - "Unlink", - "Unlinkat", - "UnmapViewOfFile", - "Unmount", - "Unsetenv", - "Unshare", - "UserInfo10", - "Ustat", - "Ustat_t", - "Utimbuf", - "Utime", - "Utimes", - "UtimesNano", - "Utsname", - "VDISCARD", - "VDSUSP", - "VEOF", - "VEOL", - "VEOL2", - "VERASE", - "VERASE2", - "VINTR", - "VKILL", - "VLNEXT", - "VMIN", - "VQUIT", - "VREPRINT", - "VSTART", - "VSTATUS", - "VSTOP", - "VSUSP", - "VSWTC", - "VT0", - "VT1", - "VTDLY", - "VTIME", - "VWERASE", - "VirtualLock", - "VirtualUnlock", - "WAIT_ABANDONED", - "WAIT_FAILED", - "WAIT_OBJECT_0", - "WAIT_TIMEOUT", - "WALL", - "WALLSIG", - "WALTSIG", - "WCLONE", - "WCONTINUED", - "WCOREFLAG", - "WEXITED", - "WLINUXCLONE", - "WNOHANG", - "WNOTHREAD", - "WNOWAIT", - "WNOZOMBIE", - "WOPTSCHECKED", - "WORDSIZE", - "WSABuf", - "WSACleanup", - "WSADESCRIPTION_LEN", - "WSAData", - "WSAEACCES", - "WSAECONNABORTED", - "WSAECONNRESET", - "WSAEnumProtocols", - "WSAID_CONNECTEX", - "WSAIoctl", - "WSAPROTOCOL_LEN", - "WSAProtocolChain", - "WSAProtocolInfo", - "WSARecv", - "WSARecvFrom", - "WSASYS_STATUS_LEN", - "WSASend", - "WSASendTo", - "WSASendto", - "WSAStartup", - "WSTOPPED", - "WTRAPPED", - "WUNTRACED", - "Wait4", - "WaitForSingleObject", - "WaitStatus", - "Win32FileAttributeData", - "Win32finddata", - "Write", - "WriteConsole", - "WriteFile", - "X509_ASN_ENCODING", - "XCASE", - "XP1_CONNECTIONLESS", - "XP1_CONNECT_DATA", - "XP1_DISCONNECT_DATA", - "XP1_EXPEDITED_DATA", - "XP1_GRACEFUL_CLOSE", - "XP1_GUARANTEED_DELIVERY", - "XP1_GUARANTEED_ORDER", - "XP1_IFS_HANDLES", - "XP1_MESSAGE_ORIENTED", - "XP1_MULTIPOINT_CONTROL_PLANE", - "XP1_MULTIPOINT_DATA_PLANE", - "XP1_PARTIAL_MESSAGE", - "XP1_PSEUDO_STREAM", - "XP1_QOS_SUPPORTED", - "XP1_SAN_SUPPORT_SDP", - "XP1_SUPPORT_BROADCAST", - "XP1_SUPPORT_MULTIPOINT", - "XP1_UNI_RECV", - "XP1_UNI_SEND", - }, - "syscall/js": []string{ - "CopyBytesToGo", - "CopyBytesToJS", - "Error", - "Func", - "FuncOf", - "Global", - "Null", - "Type", - "TypeBoolean", - "TypeFunction", - "TypeNull", - "TypeNumber", - "TypeObject", - "TypeString", - "TypeSymbol", - "TypeUndefined", - "Undefined", - "Value", - "ValueError", - "ValueOf", - "Wrapper", - }, - "testing": []string{ - "AllocsPerRun", - "B", - "Benchmark", - "BenchmarkResult", - "Cover", - "CoverBlock", - "CoverMode", - "Coverage", - "Init", - "InternalBenchmark", - "InternalExample", - "InternalTest", - "M", - "Main", - "MainStart", - "PB", - "RegisterCover", - "RunBenchmarks", - "RunExamples", - "RunTests", - "Short", - "T", - "TB", - "Verbose", - }, - "testing/iotest": []string{ - "DataErrReader", - "ErrTimeout", - "HalfReader", - "NewReadLogger", - "NewWriteLogger", - "OneByteReader", - "TimeoutReader", - "TruncateWriter", - }, - "testing/quick": []string{ - "Check", - "CheckEqual", - "CheckEqualError", - "CheckError", - "Config", - "Generator", - "SetupError", - "Value", - }, - "text/scanner": []string{ - "Char", - "Comment", - "EOF", - "Float", - "GoTokens", - "GoWhitespace", - "Ident", - "Int", - "Position", - "RawString", - "ScanChars", - "ScanComments", - "ScanFloats", - "ScanIdents", - "ScanInts", - "ScanRawStrings", - "ScanStrings", - "Scanner", - "SkipComments", - "String", - "TokenString", - }, - "text/tabwriter": []string{ - "AlignRight", - "Debug", - "DiscardEmptyColumns", - "Escape", - "FilterHTML", - "NewWriter", - "StripEscape", - "TabIndent", - "Writer", - }, - "text/template": []string{ - "ExecError", - "FuncMap", - "HTMLEscape", - "HTMLEscapeString", - "HTMLEscaper", - "IsTrue", - "JSEscape", - "JSEscapeString", - "JSEscaper", - "Must", - "New", - "ParseFiles", - "ParseGlob", - "Template", - "URLQueryEscaper", - }, - "text/template/parse": []string{ - "ActionNode", - "BoolNode", - "BranchNode", - "ChainNode", - "CommandNode", - "DotNode", - "FieldNode", - "IdentifierNode", - "IfNode", - "IsEmptyTree", - "ListNode", - "New", - "NewIdentifier", - "NilNode", - "Node", - "NodeAction", - "NodeBool", - "NodeChain", - "NodeCommand", - "NodeDot", - "NodeField", - "NodeIdentifier", - "NodeIf", - "NodeList", - "NodeNil", - "NodeNumber", - "NodePipe", - "NodeRange", - "NodeString", - "NodeTemplate", - "NodeText", - "NodeType", - "NodeVariable", - "NodeWith", - "NumberNode", - "Parse", - "PipeNode", - "Pos", - "RangeNode", - "StringNode", - "TemplateNode", - "TextNode", - "Tree", - "VariableNode", - "WithNode", - }, - "time": []string{ - "ANSIC", - "After", - "AfterFunc", - "April", - "August", - "Date", - "December", - "Duration", - "February", - "FixedZone", - "Friday", - "Hour", - "January", - "July", - "June", - "Kitchen", - "LoadLocation", - "LoadLocationFromTZData", - "Local", - "Location", - "March", - "May", - "Microsecond", - "Millisecond", - "Minute", - "Monday", - "Month", - "Nanosecond", - "NewTicker", - "NewTimer", - "November", - "Now", - "October", - "Parse", - "ParseDuration", - "ParseError", - "ParseInLocation", - "RFC1123", - "RFC1123Z", - "RFC3339", - "RFC3339Nano", - "RFC822", - "RFC822Z", - "RFC850", - "RubyDate", - "Saturday", - "Second", - "September", - "Since", - "Sleep", - "Stamp", - "StampMicro", - "StampMilli", - "StampNano", - "Sunday", - "Thursday", - "Tick", - "Ticker", - "Time", - "Timer", - "Tuesday", - "UTC", - "Unix", - "UnixDate", - "Until", - "Wednesday", - "Weekday", - }, - "unicode": []string{ - "ASCII_Hex_Digit", - "Adlam", - "Ahom", - "Anatolian_Hieroglyphs", - "Arabic", - "Armenian", - "Avestan", - "AzeriCase", - "Balinese", - "Bamum", - "Bassa_Vah", - "Batak", - "Bengali", - "Bhaiksuki", - "Bidi_Control", - "Bopomofo", - "Brahmi", - "Braille", - "Buginese", - "Buhid", - "C", - "Canadian_Aboriginal", - "Carian", - "CaseRange", - "CaseRanges", - "Categories", - "Caucasian_Albanian", - "Cc", - "Cf", - "Chakma", - "Cham", - "Cherokee", - "Co", - "Common", - "Coptic", - "Cs", - "Cuneiform", - "Cypriot", - "Cyrillic", - "Dash", - "Deprecated", - "Deseret", - "Devanagari", - "Diacritic", - "Digit", - "Dogra", - "Duployan", - "Egyptian_Hieroglyphs", - "Elbasan", - "Ethiopic", - "Extender", - "FoldCategory", - "FoldScript", - "Georgian", - "Glagolitic", - "Gothic", - "Grantha", - "GraphicRanges", - "Greek", - "Gujarati", - "Gunjala_Gondi", - "Gurmukhi", - "Han", - "Hangul", - "Hanifi_Rohingya", - "Hanunoo", - "Hatran", - "Hebrew", - "Hex_Digit", - "Hiragana", - "Hyphen", - "IDS_Binary_Operator", - "IDS_Trinary_Operator", - "Ideographic", - "Imperial_Aramaic", - "In", - "Inherited", - "Inscriptional_Pahlavi", - "Inscriptional_Parthian", - "Is", - "IsControl", - "IsDigit", - "IsGraphic", - "IsLetter", - "IsLower", - "IsMark", - "IsNumber", - "IsOneOf", - "IsPrint", - "IsPunct", - "IsSpace", - "IsSymbol", - "IsTitle", - "IsUpper", - "Javanese", - "Join_Control", - "Kaithi", - "Kannada", - "Katakana", - "Kayah_Li", - "Kharoshthi", - "Khmer", - "Khojki", - "Khudawadi", - "L", - "Lao", - "Latin", - "Lepcha", - "Letter", - "Limbu", - "Linear_A", - "Linear_B", - "Lisu", - "Ll", - "Lm", - "Lo", - "Logical_Order_Exception", - "Lower", - "LowerCase", - "Lt", - "Lu", - "Lycian", - "Lydian", - "M", - "Mahajani", - "Makasar", - "Malayalam", - "Mandaic", - "Manichaean", - "Marchen", - "Mark", - "Masaram_Gondi", - "MaxASCII", - "MaxCase", - "MaxLatin1", - "MaxRune", - "Mc", - "Me", - "Medefaidrin", - "Meetei_Mayek", - "Mende_Kikakui", - "Meroitic_Cursive", - "Meroitic_Hieroglyphs", - "Miao", - "Mn", - "Modi", - "Mongolian", - "Mro", - "Multani", - "Myanmar", - "N", - "Nabataean", - "Nd", - "New_Tai_Lue", - "Newa", - "Nko", - "Nl", - "No", - "Noncharacter_Code_Point", - "Number", - "Nushu", - "Ogham", - "Ol_Chiki", - "Old_Hungarian", - "Old_Italic", - "Old_North_Arabian", - "Old_Permic", - "Old_Persian", - "Old_Sogdian", - "Old_South_Arabian", - "Old_Turkic", - "Oriya", - "Osage", - "Osmanya", - "Other", - "Other_Alphabetic", - "Other_Default_Ignorable_Code_Point", - "Other_Grapheme_Extend", - "Other_ID_Continue", - "Other_ID_Start", - "Other_Lowercase", - "Other_Math", - "Other_Uppercase", - "P", - "Pahawh_Hmong", - "Palmyrene", - "Pattern_Syntax", - "Pattern_White_Space", - "Pau_Cin_Hau", - "Pc", - "Pd", - "Pe", - "Pf", - "Phags_Pa", - "Phoenician", - "Pi", - "Po", - "Prepended_Concatenation_Mark", - "PrintRanges", - "Properties", - "Ps", - "Psalter_Pahlavi", - "Punct", - "Quotation_Mark", - "Radical", - "Range16", - "Range32", - "RangeTable", - "Regional_Indicator", - "Rejang", - "ReplacementChar", - "Runic", - "S", - "STerm", - "Samaritan", - "Saurashtra", - "Sc", - "Scripts", - "Sentence_Terminal", - "Sharada", - "Shavian", - "Siddham", - "SignWriting", - "SimpleFold", - "Sinhala", - "Sk", - "Sm", - "So", - "Soft_Dotted", - "Sogdian", - "Sora_Sompeng", - "Soyombo", - "Space", - "SpecialCase", - "Sundanese", - "Syloti_Nagri", - "Symbol", - "Syriac", - "Tagalog", - "Tagbanwa", - "Tai_Le", - "Tai_Tham", - "Tai_Viet", - "Takri", - "Tamil", - "Tangut", - "Telugu", - "Terminal_Punctuation", - "Thaana", - "Thai", - "Tibetan", - "Tifinagh", - "Tirhuta", - "Title", - "TitleCase", - "To", - "ToLower", - "ToTitle", - "ToUpper", - "TurkishCase", - "Ugaritic", - "Unified_Ideograph", - "Upper", - "UpperCase", - "UpperLower", - "Vai", - "Variation_Selector", - "Version", - "Warang_Citi", - "White_Space", - "Yi", - "Z", - "Zanabazar_Square", - "Zl", - "Zp", - "Zs", - }, - "unicode/utf16": []string{ - "Decode", - "DecodeRune", - "Encode", - "EncodeRune", - "IsSurrogate", - }, - "unicode/utf8": []string{ - "DecodeLastRune", - "DecodeLastRuneInString", - "DecodeRune", - "DecodeRuneInString", - "EncodeRune", - "FullRune", - "FullRuneInString", - "MaxRune", - "RuneCount", - "RuneCountInString", - "RuneError", - "RuneLen", - "RuneSelf", - "RuneStart", - "UTFMax", - "Valid", - "ValidRune", - "ValidString", - }, - "unsafe": []string{ - "Alignof", - "ArbitraryType", - "Offsetof", - "Pointer", - "Sizeof", - }, -} diff --git a/vendor/golang.org/x/tools/internal/jsonrpc2/handler.go b/vendor/golang.org/x/tools/internal/jsonrpc2/handler.go deleted file mode 100644 index bf8bfb3aa..000000000 --- a/vendor/golang.org/x/tools/internal/jsonrpc2/handler.go +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package jsonrpc2 - -import ( - "context" -) - -// Handler is the interface used to hook into the message handling of an rpc -// connection. -type Handler interface { - // Deliver is invoked to handle incoming requests. - // If the request returns false from IsNotify then the Handler must eventually - // call Reply on the Conn with the supplied request. - // Handlers are called synchronously, they should pass the work off to a go - // routine if they are going to take a long time. - // If Deliver returns true all subsequent handlers will be invoked with - // delivered set to true, and should not attempt to deliver the message. - Deliver(ctx context.Context, r *Request, delivered bool) bool - - // Cancel is invoked for cancelled outgoing requests. - // It is okay to use the connection to send notifications, but the context will - // be in the cancelled state, so you must do it with the background context - // instead. - // If Cancel returns true all subsequent handlers will be invoked with - // cancelled set to true, and should not attempt to cancel the message. - Cancel(ctx context.Context, conn *Conn, id ID, cancelled bool) bool - - // Log is invoked for all messages flowing through a Conn. - // direction indicates if the message being received or sent - // id is the message id, if not set it was a notification - // elapsed is the time between a call being seen and the response, and is - // negative for anything that is not a response. - // method is the method name specified in the message - // payload is the parameters for a call or notification, and the result for a - // response - - // Request is called near the start of processing any request. - Request(ctx context.Context, conn *Conn, direction Direction, r *WireRequest) context.Context - // Response is called near the start of processing any response. - Response(ctx context.Context, conn *Conn, direction Direction, r *WireResponse) context.Context - // Done is called when any request is fully processed. - // For calls, this means the response has also been processed, for notifies - // this is as soon as the message has been written to the stream. - // If err is set, it implies the request failed. - Done(ctx context.Context, err error) - // Read is called with a count each time some data is read from the stream. - // The read calls are delayed until after the data has been interpreted so - // that it can be attributed to a request/response. - Read(ctx context.Context, bytes int64) context.Context - // Wrote is called each time some data is written to the stream. - Wrote(ctx context.Context, bytes int64) context.Context - // Error is called with errors that cannot be delivered through the normal - // mechanisms, for instance a failure to process a notify cannot be delivered - // back to the other party. - Error(ctx context.Context, err error) -} - -// Direction is used to indicate to a logger whether the logged message was being -// sent or received. -type Direction bool - -const ( - // Send indicates the message is outgoing. - Send = Direction(true) - // Receive indicates the message is incoming. - Receive = Direction(false) -) - -func (d Direction) String() string { - switch d { - case Send: - return "send" - case Receive: - return "receive" - default: - panic("unreachable") - } -} - -type EmptyHandler struct{} - -func (EmptyHandler) Deliver(ctx context.Context, r *Request, delivered bool) bool { - return false -} - -func (EmptyHandler) Cancel(ctx context.Context, conn *Conn, id ID, cancelled bool) bool { - return false -} - -func (EmptyHandler) Request(ctx context.Context, conn *Conn, direction Direction, r *WireRequest) context.Context { - return ctx -} - -func (EmptyHandler) Response(ctx context.Context, conn *Conn, direction Direction, r *WireResponse) context.Context { - return ctx -} - -func (EmptyHandler) Done(ctx context.Context, err error) { -} - -func (EmptyHandler) Read(ctx context.Context, bytes int64) context.Context { - return ctx -} - -func (EmptyHandler) Wrote(ctx context.Context, bytes int64) context.Context { - return ctx -} - -func (EmptyHandler) Error(ctx context.Context, err error) {} - -type defaultHandler struct{ EmptyHandler } - -func (defaultHandler) Deliver(ctx context.Context, r *Request, delivered bool) bool { - if delivered { - return false - } - if !r.IsNotify() { - r.Reply(ctx, nil, NewErrorf(CodeMethodNotFound, "method %q not found", r.Method)) - } - return true -} diff --git a/vendor/golang.org/x/tools/internal/jsonrpc2/jsonrpc2.go b/vendor/golang.org/x/tools/internal/jsonrpc2/jsonrpc2.go deleted file mode 100644 index 62c8141b4..000000000 --- a/vendor/golang.org/x/tools/internal/jsonrpc2/jsonrpc2.go +++ /dev/null @@ -1,406 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package jsonrpc2 is a minimal implementation of the JSON RPC 2 spec. -// https://www.jsonrpc.org/specification -// It is intended to be compatible with other implementations at the wire level. -package jsonrpc2 - -import ( - "context" - "encoding/json" - "fmt" - "sync" - "sync/atomic" -) - -// Conn is a JSON RPC 2 client server connection. -// Conn is bidirectional; it does not have a designated server or client end. -type Conn struct { - seq int64 // must only be accessed using atomic operations - handlers []Handler - stream Stream - err error - pendingMu sync.Mutex // protects the pending map - pending map[ID]chan *WireResponse - handlingMu sync.Mutex // protects the handling map - handling map[ID]*Request -} - -type requestState int - -const ( - requestWaiting = requestState(iota) - requestSerial - requestParallel - requestReplied - requestDone -) - -// Request is sent to a server to represent a Call or Notify operaton. -type Request struct { - conn *Conn - cancel context.CancelFunc - state requestState - nextRequest chan struct{} - - // The Wire values of the request. - WireRequest -} - -// NewErrorf builds a Error struct for the supplied message and code. -// If args is not empty, message and args will be passed to Sprintf. -func NewErrorf(code int64, format string, args ...interface{}) *Error { - return &Error{ - Code: code, - Message: fmt.Sprintf(format, args...), - } -} - -// NewConn creates a new connection object around the supplied stream. -// You must call Run for the connection to be active. -func NewConn(s Stream) *Conn { - conn := &Conn{ - handlers: []Handler{defaultHandler{}}, - stream: s, - pending: make(map[ID]chan *WireResponse), - handling: make(map[ID]*Request), - } - return conn -} - -// AddHandler adds a new handler to the set the connection will invoke. -// Handlers are invoked in the reverse order of how they were added, this -// allows the most recent addition to be the first one to attempt to handle a -// message. -func (c *Conn) AddHandler(handler Handler) { - // prepend the new handlers so we use them first - c.handlers = append([]Handler{handler}, c.handlers...) -} - -// Cancel cancels a pending Call on the server side. -// The call is identified by its id. -// JSON RPC 2 does not specify a cancel message, so cancellation support is not -// directly wired in. This method allows a higher level protocol to choose how -// to propagate the cancel. -func (c *Conn) Cancel(id ID) { - c.handlingMu.Lock() - handling, found := c.handling[id] - c.handlingMu.Unlock() - if found { - handling.cancel() - } -} - -// Notify is called to send a notification request over the connection. -// It will return as soon as the notification has been sent, as no response is -// possible. -func (c *Conn) Notify(ctx context.Context, method string, params interface{}) (err error) { - jsonParams, err := marshalToRaw(params) - if err != nil { - return fmt.Errorf("marshalling notify parameters: %v", err) - } - request := &WireRequest{ - Method: method, - Params: jsonParams, - } - data, err := json.Marshal(request) - if err != nil { - return fmt.Errorf("marshalling notify request: %v", err) - } - for _, h := range c.handlers { - ctx = h.Request(ctx, c, Send, request) - } - defer func() { - for _, h := range c.handlers { - h.Done(ctx, err) - } - }() - n, err := c.stream.Write(ctx, data) - for _, h := range c.handlers { - ctx = h.Wrote(ctx, n) - } - return err -} - -// Call sends a request over the connection and then waits for a response. -// If the response is not an error, it will be decoded into result. -// result must be of a type you an pass to json.Unmarshal. -func (c *Conn) Call(ctx context.Context, method string, params, result interface{}) (err error) { - // generate a new request identifier - id := ID{Number: atomic.AddInt64(&c.seq, 1)} - jsonParams, err := marshalToRaw(params) - if err != nil { - return fmt.Errorf("marshalling call parameters: %v", err) - } - request := &WireRequest{ - ID: &id, - Method: method, - Params: jsonParams, - } - // marshal the request now it is complete - data, err := json.Marshal(request) - if err != nil { - return fmt.Errorf("marshalling call request: %v", err) - } - for _, h := range c.handlers { - ctx = h.Request(ctx, c, Send, request) - } - // we have to add ourselves to the pending map before we send, otherwise we - // are racing the response - rchan := make(chan *WireResponse) - c.pendingMu.Lock() - c.pending[id] = rchan - c.pendingMu.Unlock() - defer func() { - // clean up the pending response handler on the way out - c.pendingMu.Lock() - delete(c.pending, id) - c.pendingMu.Unlock() - for _, h := range c.handlers { - h.Done(ctx, err) - } - }() - // now we are ready to send - n, err := c.stream.Write(ctx, data) - for _, h := range c.handlers { - ctx = h.Wrote(ctx, n) - } - if err != nil { - // sending failed, we will never get a response, so don't leave it pending - return err - } - // now wait for the response - select { - case response := <-rchan: - for _, h := range c.handlers { - ctx = h.Response(ctx, c, Receive, response) - } - // is it an error response? - if response.Error != nil { - return response.Error - } - if result == nil || response.Result == nil { - return nil - } - if err := json.Unmarshal(*response.Result, result); err != nil { - return fmt.Errorf("unmarshalling result: %v", err) - } - return nil - case <-ctx.Done(): - // allow the handler to propagate the cancel - cancelled := false - for _, h := range c.handlers { - if h.Cancel(ctx, c, id, cancelled) { - cancelled = true - } - } - return ctx.Err() - } -} - -// Conn returns the connection that created this request. -func (r *Request) Conn() *Conn { return r.conn } - -// IsNotify returns true if this request is a notification. -func (r *Request) IsNotify() bool { - return r.ID == nil -} - -// Parallel indicates that the system is now allowed to process other requests -// in parallel with this one. -// It is safe to call any number of times, but must only be called from the -// request handling go routine. -// It is implied by both reply and by the handler returning. -func (r *Request) Parallel() { - if r.state >= requestParallel { - return - } - r.state = requestParallel - close(r.nextRequest) -} - -// Reply sends a reply to the given request. -// It is an error to call this if request was not a call. -// You must call this exactly once for any given request. -// It should only be called from the handler go routine. -// If err is set then result will be ignored. -// If the request has not yet dropped into parallel mode -// it will be before this function returns. -func (r *Request) Reply(ctx context.Context, result interface{}, err error) error { - if r.state >= requestReplied { - return fmt.Errorf("reply invoked more than once") - } - if r.IsNotify() { - return fmt.Errorf("reply not invoked with a valid call") - } - // reply ends the handling phase of a call, so if we are not yet - // parallel we should be now. The go routine is allowed to continue - // to do work after replying, which is why it is important to unlock - // the rpc system at this point. - r.Parallel() - r.state = requestReplied - - var raw *json.RawMessage - if err == nil { - raw, err = marshalToRaw(result) - } - response := &WireResponse{ - Result: raw, - ID: r.ID, - } - if err != nil { - if callErr, ok := err.(*Error); ok { - response.Error = callErr - } else { - response.Error = NewErrorf(0, "%s", err) - } - } - data, err := json.Marshal(response) - if err != nil { - return err - } - for _, h := range r.conn.handlers { - ctx = h.Response(ctx, r.conn, Send, response) - } - n, err := r.conn.stream.Write(ctx, data) - for _, h := range r.conn.handlers { - ctx = h.Wrote(ctx, n) - } - - if err != nil { - // TODO(iancottrell): if a stream write fails, we really need to shut down - // the whole stream - return err - } - return nil -} - -func (c *Conn) setHandling(r *Request, active bool) { - if r.ID == nil { - return - } - r.conn.handlingMu.Lock() - defer r.conn.handlingMu.Unlock() - if active { - r.conn.handling[*r.ID] = r - } else { - delete(r.conn.handling, *r.ID) - } -} - -// combined has all the fields of both Request and Response. -// We can decode this and then work out which it is. -type combined struct { - VersionTag VersionTag `json:"jsonrpc"` - ID *ID `json:"id,omitempty"` - Method string `json:"method"` - Params *json.RawMessage `json:"params,omitempty"` - Result *json.RawMessage `json:"result,omitempty"` - Error *Error `json:"error,omitempty"` -} - -// Run blocks until the connection is terminated, and returns any error that -// caused the termination. -// It must be called exactly once for each Conn. -// It returns only when the reader is closed or there is an error in the stream. -func (c *Conn) Run(runCtx context.Context) error { - // we need to make the next request "lock" in an unlocked state to allow - // the first incoming request to proceed. All later requests are unlocked - // by the preceding request going to parallel mode. - nextRequest := make(chan struct{}) - close(nextRequest) - for { - // get the data for a message - data, n, err := c.stream.Read(runCtx) - if err != nil { - // the stream failed, we cannot continue - return err - } - // read a combined message - msg := &combined{} - if err := json.Unmarshal(data, msg); err != nil { - // a badly formed message arrived, log it and continue - // we trust the stream to have isolated the error to just this message - for _, h := range c.handlers { - h.Error(runCtx, fmt.Errorf("unmarshal failed: %v", err)) - } - continue - } - // work out which kind of message we have - switch { - case msg.Method != "": - // if method is set it must be a request - reqCtx, cancelReq := context.WithCancel(runCtx) - thisRequest := nextRequest - nextRequest = make(chan struct{}) - req := &Request{ - conn: c, - cancel: cancelReq, - nextRequest: nextRequest, - WireRequest: WireRequest{ - VersionTag: msg.VersionTag, - Method: msg.Method, - Params: msg.Params, - ID: msg.ID, - }, - } - for _, h := range c.handlers { - reqCtx = h.Request(reqCtx, c, Receive, &req.WireRequest) - reqCtx = h.Read(reqCtx, n) - } - c.setHandling(req, true) - go func() { - <-thisRequest - req.state = requestSerial - defer func() { - c.setHandling(req, false) - if !req.IsNotify() && req.state < requestReplied { - req.Reply(reqCtx, nil, NewErrorf(CodeInternalError, "method %q did not reply", req.Method)) - } - req.Parallel() - for _, h := range c.handlers { - h.Done(reqCtx, err) - } - cancelReq() - }() - delivered := false - for _, h := range c.handlers { - if h.Deliver(reqCtx, req, delivered) { - delivered = true - } - } - }() - case msg.ID != nil: - // we have a response, get the pending entry from the map - c.pendingMu.Lock() - rchan := c.pending[*msg.ID] - if rchan != nil { - delete(c.pending, *msg.ID) - } - c.pendingMu.Unlock() - // and send the reply to the channel - response := &WireResponse{ - Result: msg.Result, - Error: msg.Error, - ID: msg.ID, - } - rchan <- response - close(rchan) - default: - for _, h := range c.handlers { - h.Error(runCtx, fmt.Errorf("message not a call, notify or response, ignoring")) - } - } - } -} - -func marshalToRaw(obj interface{}) (*json.RawMessage, error) { - data, err := json.Marshal(obj) - if err != nil { - return nil, err - } - raw := json.RawMessage(data) - return &raw, nil -} diff --git a/vendor/golang.org/x/tools/internal/jsonrpc2/stream.go b/vendor/golang.org/x/tools/internal/jsonrpc2/stream.go deleted file mode 100644 index f850c27c7..000000000 --- a/vendor/golang.org/x/tools/internal/jsonrpc2/stream.go +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package jsonrpc2 - -import ( - "bufio" - "context" - "encoding/json" - "fmt" - "io" - "strconv" - "strings" - "sync" -) - -// Stream abstracts the transport mechanics from the JSON RPC protocol. -// A Conn reads and writes messages using the stream it was provided on -// construction, and assumes that each call to Read or Write fully transfers -// a single message, or returns an error. -type Stream interface { - // Read gets the next message from the stream. - // It is never called concurrently. - Read(context.Context) ([]byte, int64, error) - // Write sends a message to the stream. - // It must be safe for concurrent use. - Write(context.Context, []byte) (int64, error) -} - -// NewStream returns a Stream built on top of an io.Reader and io.Writer -// The messages are sent with no wrapping, and rely on json decode consistency -// to determine message boundaries. -func NewStream(in io.Reader, out io.Writer) Stream { - return &plainStream{ - in: json.NewDecoder(in), - out: out, - } -} - -type plainStream struct { - in *json.Decoder - outMu sync.Mutex - out io.Writer -} - -func (s *plainStream) Read(ctx context.Context) ([]byte, int64, error) { - select { - case <-ctx.Done(): - return nil, 0, ctx.Err() - default: - } - var raw json.RawMessage - if err := s.in.Decode(&raw); err != nil { - return nil, 0, err - } - return raw, int64(len(raw)), nil -} - -func (s *plainStream) Write(ctx context.Context, data []byte) (int64, error) { - select { - case <-ctx.Done(): - return 0, ctx.Err() - default: - } - s.outMu.Lock() - n, err := s.out.Write(data) - s.outMu.Unlock() - return int64(n), err -} - -// NewHeaderStream returns a Stream built on top of an io.Reader and io.Writer -// The messages are sent with HTTP content length and MIME type headers. -// This is the format used by LSP and others. -func NewHeaderStream(in io.Reader, out io.Writer) Stream { - return &headerStream{ - in: bufio.NewReader(in), - out: out, - } -} - -type headerStream struct { - in *bufio.Reader - outMu sync.Mutex - out io.Writer -} - -func (s *headerStream) Read(ctx context.Context) ([]byte, int64, error) { - select { - case <-ctx.Done(): - return nil, 0, ctx.Err() - default: - } - var total, length int64 - // read the header, stop on the first empty line - for { - line, err := s.in.ReadString('\n') - total += int64(len(line)) - if err != nil { - return nil, total, fmt.Errorf("failed reading header line %q", err) - } - line = strings.TrimSpace(line) - // check we have a header line - if line == "" { - break - } - colon := strings.IndexRune(line, ':') - if colon < 0 { - return nil, total, fmt.Errorf("invalid header line %q", line) - } - name, value := line[:colon], strings.TrimSpace(line[colon+1:]) - switch name { - case "Content-Length": - if length, err = strconv.ParseInt(value, 10, 32); err != nil { - return nil, total, fmt.Errorf("failed parsing Content-Length: %v", value) - } - if length <= 0 { - return nil, total, fmt.Errorf("invalid Content-Length: %v", length) - } - default: - // ignoring unknown headers - } - } - if length == 0 { - return nil, total, fmt.Errorf("missing Content-Length header") - } - data := make([]byte, length) - if _, err := io.ReadFull(s.in, data); err != nil { - return nil, total, err - } - total += length - return data, total, nil -} - -func (s *headerStream) Write(ctx context.Context, data []byte) (int64, error) { - select { - case <-ctx.Done(): - return 0, ctx.Err() - default: - } - s.outMu.Lock() - defer s.outMu.Unlock() - n, err := fmt.Fprintf(s.out, "Content-Length: %v\r\n\r\n", len(data)) - total := int64(n) - if err == nil { - n, err = s.out.Write(data) - total += int64(n) - } - return total, err -} diff --git a/vendor/golang.org/x/tools/internal/jsonrpc2/wire.go b/vendor/golang.org/x/tools/internal/jsonrpc2/wire.go deleted file mode 100644 index 3e891e070..000000000 --- a/vendor/golang.org/x/tools/internal/jsonrpc2/wire.go +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package jsonrpc2 - -import ( - "encoding/json" - "fmt" - "strconv" -) - -// this file contains the go forms of the wire specification -// see http://www.jsonrpc.org/specification for details - -const ( - // CodeUnknownError should be used for all non coded errors. - CodeUnknownError = -32001 - // CodeParseError is used when invalid JSON was received by the server. - CodeParseError = -32700 - //CodeInvalidRequest is used when the JSON sent is not a valid Request object. - CodeInvalidRequest = -32600 - // CodeMethodNotFound should be returned by the handler when the method does - // not exist / is not available. - CodeMethodNotFound = -32601 - // CodeInvalidParams should be returned by the handler when method - // parameter(s) were invalid. - CodeInvalidParams = -32602 - // CodeInternalError is not currently returned but defined for completeness. - CodeInternalError = -32603 - - //CodeServerOverloaded is returned when a message was refused due to a - //server being temporarily unable to accept any new messages. - CodeServerOverloaded = -32000 -) - -// WireRequest is sent to a server to represent a Call or Notify operaton. -type WireRequest struct { - // VersionTag is always encoded as the string "2.0" - VersionTag VersionTag `json:"jsonrpc"` - // Method is a string containing the method name to invoke. - Method string `json:"method"` - // Params is either a struct or an array with the parameters of the method. - Params *json.RawMessage `json:"params,omitempty"` - // The id of this request, used to tie the Response back to the request. - // Will be either a string or a number. If not set, the Request is a notify, - // and no response is possible. - ID *ID `json:"id,omitempty"` -} - -// WireResponse is a reply to a Request. -// It will always have the ID field set to tie it back to a request, and will -// have either the Result or Error fields set depending on whether it is a -// success or failure response. -type WireResponse struct { - // VersionTag is always encoded as the string "2.0" - VersionTag VersionTag `json:"jsonrpc"` - // Result is the response value, and is required on success. - Result *json.RawMessage `json:"result,omitempty"` - // Error is a structured error response if the call fails. - Error *Error `json:"error,omitempty"` - // ID must be set and is the identifier of the Request this is a response to. - ID *ID `json:"id,omitempty"` -} - -// Error represents a structured error in a Response. -type Error struct { - // Code is an error code indicating the type of failure. - Code int64 `json:"code"` - // Message is a short description of the error. - Message string `json:"message"` - // Data is optional structured data containing additional information about the error. - Data *json.RawMessage `json:"data"` -} - -// VersionTag is a special 0 sized struct that encodes as the jsonrpc version -// tag. -// It will fail during decode if it is not the correct version tag in the -// stream. -type VersionTag struct{} - -// ID is a Request identifier. -// Only one of either the Name or Number members will be set, using the -// number form if the Name is the empty string. -type ID struct { - Name string - Number int64 -} - -func (err *Error) Error() string { - if err == nil { - return "" - } - return err.Message -} - -func (VersionTag) MarshalJSON() ([]byte, error) { - return json.Marshal("2.0") -} - -func (VersionTag) UnmarshalJSON(data []byte) error { - version := "" - if err := json.Unmarshal(data, &version); err != nil { - return err - } - if version != "2.0" { - return fmt.Errorf("Invalid RPC version %v", version) - } - return nil -} - -// String returns a string representation of the ID. -// The representation is non ambiguous, string forms are quoted, number forms -// are preceded by a # -func (id *ID) String() string { - if id == nil { - return "" - } - if id.Name != "" { - return strconv.Quote(id.Name) - } - return "#" + strconv.FormatInt(id.Number, 10) -} - -func (id *ID) MarshalJSON() ([]byte, error) { - if id.Name != "" { - return json.Marshal(id.Name) - } - return json.Marshal(id.Number) -} - -func (id *ID) UnmarshalJSON(data []byte) error { - *id = ID{} - if err := json.Unmarshal(data, &id.Number); err == nil { - return nil - } - return json.Unmarshal(data, &id.Name) -} diff --git a/vendor/golang.org/x/tools/internal/lsp/browser/README.md b/vendor/golang.org/x/tools/internal/lsp/browser/README.md deleted file mode 100644 index e5f04df4d..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/browser/README.md +++ /dev/null @@ -1 +0,0 @@ -This package is a copy of cmd/internal/browser from the go distribution \ No newline at end of file diff --git a/vendor/golang.org/x/tools/internal/lsp/browser/browser.go b/vendor/golang.org/x/tools/internal/lsp/browser/browser.go deleted file mode 100644 index 6867c85d2..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/browser/browser.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package browser provides utilities for interacting with users' browsers. -package browser - -import ( - "os" - "os/exec" - "runtime" - "time" -) - -// Commands returns a list of possible commands to use to open a url. -func Commands() [][]string { - var cmds [][]string - if exe := os.Getenv("BROWSER"); exe != "" { - cmds = append(cmds, []string{exe}) - } - switch runtime.GOOS { - case "darwin": - cmds = append(cmds, []string{"/usr/bin/open"}) - case "windows": - cmds = append(cmds, []string{"cmd", "/c", "start"}) - default: - if os.Getenv("DISPLAY") != "" { - // xdg-open is only for use in a desktop environment. - cmds = append(cmds, []string{"xdg-open"}) - } - } - cmds = append(cmds, - []string{"chrome"}, - []string{"google-chrome"}, - []string{"chromium"}, - []string{"firefox"}, - ) - return cmds -} - -// Open tries to open url in a browser and reports whether it succeeded. -func Open(url string) bool { - for _, args := range Commands() { - cmd := exec.Command(args[0], append(args[1:], url)...) - if cmd.Start() == nil && appearsSuccessful(cmd, 3*time.Second) { - return true - } - } - return false -} - -// appearsSuccessful reports whether the command appears to have run successfully. -// If the command runs longer than the timeout, it's deemed successful. -// If the command runs within the timeout, it's deemed successful if it exited cleanly. -func appearsSuccessful(cmd *exec.Cmd, timeout time.Duration) bool { - errc := make(chan error, 1) - go func() { - errc <- cmd.Wait() - }() - - select { - case <-time.After(timeout): - return true - case err := <-errc: - return err == nil - } -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cache/analysis.go b/vendor/golang.org/x/tools/internal/lsp/cache/analysis.go deleted file mode 100644 index 2adc23f8d..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cache/analysis.go +++ /dev/null @@ -1,379 +0,0 @@ -package cache - -import ( - "context" - "fmt" - "go/token" - "go/types" - "reflect" - "sort" - "sync" - - "golang.org/x/sync/errgroup" - "golang.org/x/tools/go/analysis" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/lsp/telemetry" - "golang.org/x/tools/internal/memoize" - "golang.org/x/tools/internal/telemetry/log" - errors "golang.org/x/xerrors" -) - -func (s *snapshot) Analyze(ctx context.Context, id string, analyzers []*analysis.Analyzer) ([]*source.Error, error) { - var roots []*actionHandle - - for _, a := range analyzers { - ah, err := s.actionHandle(ctx, packageID(id), source.ParseFull, a) - if err != nil { - return nil, err - } - roots = append(roots, ah) - } - - // Check if the context has been canceled before running the analyses. - if ctx.Err() != nil { - return nil, ctx.Err() - } - - var results []*source.Error - for _, ah := range roots { - diagnostics, _, err := ah.analyze(ctx) - if err != nil { - log.Error(ctx, "no results", err) - continue - } - results = append(results, diagnostics...) - } - return results, nil -} - -// An action represents one unit of analysis work: the application of -// one analysis to one package. Actions form a DAG, both within a -// package (as different analyzers are applied, either in sequence or -// parallel), and across packages (as dependencies are analyzed). -type actionHandle struct { - handle *memoize.Handle - - analyzer *analysis.Analyzer - pkg *pkg -} - -type actionData struct { - diagnostics []*source.Error - result interface{} - objectFacts map[objectFactKey]analysis.Fact - packageFacts map[packageFactKey]analysis.Fact - err error -} - -type objectFactKey struct { - obj types.Object - typ reflect.Type -} - -type packageFactKey struct { - pkg *types.Package - typ reflect.Type -} - -func (s *snapshot) actionHandle(ctx context.Context, id packageID, mode source.ParseMode, a *analysis.Analyzer) (*actionHandle, error) { - ah := s.getAction(id, mode, a) - if ah != nil { - return ah, nil - } - cph := s.getPackage(id, mode) - if cph == nil { - return nil, errors.Errorf("no CheckPackageHandle for %s:%v", id, mode == source.ParseExported) - } - if len(cph.key) == 0 { - return nil, errors.Errorf("no key for CheckPackageHandle %s", id) - } - pkg, err := cph.check(ctx) - if err != nil { - return nil, err - } - ah = &actionHandle{ - analyzer: a, - pkg: pkg, - } - var deps []*actionHandle - // Add a dependency on each required analyzers. - for _, req := range a.Requires { - reqActionHandle, err := s.actionHandle(ctx, id, mode, req) - if err != nil { - return nil, err - } - deps = append(deps, reqActionHandle) - } - // An analysis that consumes/produces facts - // must run on the package's dependencies too. - if len(a.FactTypes) > 0 { - importIDs := make([]string, 0, len(cph.m.deps)) - for _, importID := range cph.m.deps { - importIDs = append(importIDs, string(importID)) - } - sort.Strings(importIDs) // for determinism - for _, importID := range importIDs { - depActionHandle, err := s.actionHandle(ctx, packageID(importID), source.ParseExported, a) - if err != nil { - return nil, err - } - deps = append(deps, depActionHandle) - } - } - - fset := s.view.session.cache.fset - - h := s.view.session.cache.store.Bind(buildActionKey(a, cph), func(ctx context.Context) interface{} { - // Analyze dependencies first. - results, err := execAll(ctx, fset, deps) - if err != nil { - return &actionData{ - err: err, - } - } - return runAnalysis(ctx, fset, a, pkg, results) - }) - ah.handle = h - - s.addAction(ah) - return ah, nil -} - -func (act *actionHandle) analyze(ctx context.Context) ([]*source.Error, interface{}, error) { - v := act.handle.Get(ctx) - if v == nil { - return nil, nil, errors.Errorf("no analyses for %s", act.pkg.ID()) - } - data, ok := v.(*actionData) - if !ok { - return nil, nil, errors.Errorf("unexpected type for %s:%s", act.pkg.ID(), act.analyzer.Name) - } - return data.diagnostics, data.result, data.err -} - -func (act *actionHandle) cached() ([]*source.Error, interface{}, error) { - v := act.handle.Cached() - if v == nil { - return nil, nil, errors.Errorf("no analyses for %s", act.pkg.ID()) - } - data, ok := v.(*actionData) - if !ok { - return nil, nil, errors.Errorf("unexpected type for %s:%s", act.pkg.ID(), act.analyzer.Name) - } - return data.diagnostics, data.result, data.err -} - -func buildActionKey(a *analysis.Analyzer, cph *checkPackageHandle) string { - return hashContents([]byte(fmt.Sprintf("%p %s", a, string(cph.key)))) -} - -func (act *actionHandle) String() string { - return fmt.Sprintf("%s@%s", act.analyzer, act.pkg.PkgPath()) -} - -func execAll(ctx context.Context, fset *token.FileSet, actions []*actionHandle) (map[*actionHandle]*actionData, error) { - var mu sync.Mutex - results := make(map[*actionHandle]*actionData) - - g, ctx := errgroup.WithContext(ctx) - for _, act := range actions { - act := act - g.Go(func() error { - v := act.handle.Get(ctx) - if v == nil { - return errors.Errorf("no analyses for %s", act.pkg.ID()) - } - data, ok := v.(*actionData) - if !ok { - return errors.Errorf("unexpected type for %s: %T", act, v) - } - - mu.Lock() - defer mu.Unlock() - results[act] = data - - return nil - }) - } - return results, g.Wait() -} - -func runAnalysis(ctx context.Context, fset *token.FileSet, analyzer *analysis.Analyzer, pkg *pkg, deps map[*actionHandle]*actionData) (data *actionData) { - data = &actionData{ - objectFacts: make(map[objectFactKey]analysis.Fact), - packageFacts: make(map[packageFactKey]analysis.Fact), - } - defer func() { - if r := recover(); r != nil { - log.Print(ctx, fmt.Sprintf("analysis panicked: %s", r), telemetry.Package.Of(pkg.PkgPath)) - data.err = errors.Errorf("analysis %s for package %s panicked: %v", analyzer.Name, pkg.PkgPath()) - } - }() - - // Plumb the output values of the dependencies - // into the inputs of this action. Also facts. - inputs := make(map[*analysis.Analyzer]interface{}) - objectFacts := make(map[objectFactKey]analysis.Fact) - packageFacts := make(map[packageFactKey]analysis.Fact) - - for depHandle, depData := range deps { - if depHandle.pkg == pkg { - // Same package, different analysis (horizontal edge): - // in-memory outputs of prerequisite analyzers - // become inputs to this analysis pass. - inputs[depHandle.analyzer] = depData.result - } else if depHandle.analyzer == analyzer { // (always true) - // Same analysis, different package (vertical edge): - // serialized facts produced by prerequisite analysis - // become available to this analysis pass. - for key, fact := range depData.objectFacts { - // Filter out facts related to objects - // that are irrelevant downstream - // (equivalently: not in the compiler export data). - if !exportedFrom(key.obj, depHandle.pkg.types) { - continue - } - objectFacts[key] = fact - } - for key, fact := range depData.packageFacts { - // TODO: filter out facts that belong to - // packages not mentioned in the export data - // to prevent side channels. - - packageFacts[key] = fact - } - } - } - - var diagnostics []*analysis.Diagnostic - - // Run the analysis. - pass := &analysis.Pass{ - Analyzer: analyzer, - Fset: fset, - Files: pkg.GetSyntax(), - Pkg: pkg.GetTypes(), - TypesInfo: pkg.GetTypesInfo(), - TypesSizes: pkg.GetTypesSizes(), - ResultOf: inputs, - Report: func(d analysis.Diagnostic) { - // Prefix the diagnostic category with the analyzer's name. - if d.Category == "" { - d.Category = analyzer.Name - } else { - d.Category = analyzer.Name + "." + d.Category - } - diagnostics = append(diagnostics, &d) - }, - ImportObjectFact: func(obj types.Object, ptr analysis.Fact) bool { - if obj == nil { - panic("nil object") - } - key := objectFactKey{obj, factType(ptr)} - - if v, ok := objectFacts[key]; ok { - reflect.ValueOf(ptr).Elem().Set(reflect.ValueOf(v).Elem()) - return true - } - return false - }, - ExportObjectFact: func(obj types.Object, fact analysis.Fact) { - if obj.Pkg() != pkg.types { - panic(fmt.Sprintf("internal error: in analysis %s of package %s: Fact.Set(%s, %T): can't set facts on objects belonging another package", - analyzer, pkg.ID(), obj, fact)) - } - key := objectFactKey{obj, factType(fact)} - objectFacts[key] = fact // clobber any existing entry - }, - ImportPackageFact: func(pkg *types.Package, ptr analysis.Fact) bool { - if pkg == nil { - panic("nil package") - } - key := packageFactKey{pkg, factType(ptr)} - if v, ok := packageFacts[key]; ok { - reflect.ValueOf(ptr).Elem().Set(reflect.ValueOf(v).Elem()) - return true - } - return false - }, - ExportPackageFact: func(fact analysis.Fact) { - key := packageFactKey{pkg.types, factType(fact)} - packageFacts[key] = fact // clobber any existing entry - }, - AllObjectFacts: func() []analysis.ObjectFact { - facts := make([]analysis.ObjectFact, 0, len(objectFacts)) - for k := range objectFacts { - facts = append(facts, analysis.ObjectFact{Object: k.obj, Fact: objectFacts[k]}) - } - return facts - }, - AllPackageFacts: func() []analysis.PackageFact { - facts := make([]analysis.PackageFact, 0, len(packageFacts)) - for k := range packageFacts { - facts = append(facts, analysis.PackageFact{Package: k.pkg, Fact: packageFacts[k]}) - } - return facts - }, - } - - if pkg.IsIllTyped() { - data.err = errors.Errorf("analysis skipped due to errors in package: %v", pkg.GetErrors()) - return data - } - data.result, data.err = pass.Analyzer.Run(pass) - if data.err == nil { - if got, want := reflect.TypeOf(data.result), pass.Analyzer.ResultType; got != want { - data.err = errors.Errorf( - "internal error: on package %s, analyzer %s returned a result of type %v, but declared ResultType %v", - pass.Pkg.Path(), pass.Analyzer, got, want) - return data - } - } - - // disallow calls after Run - pass.ExportObjectFact = func(obj types.Object, fact analysis.Fact) { - panic(fmt.Sprintf("%s:%s: Pass.ExportObjectFact(%s, %T) called after Run", analyzer.Name, pkg.PkgPath(), obj, fact)) - } - pass.ExportPackageFact = func(fact analysis.Fact) { - panic(fmt.Sprintf("%s:%s: Pass.ExportPackageFact(%T) called after Run", analyzer.Name, pkg.PkgPath(), fact)) - } - - for _, diag := range diagnostics { - srcErr, err := sourceError(ctx, fset, pkg, diag) - if err != nil { - return nil - } - data.diagnostics = append(data.diagnostics, srcErr) - } - return data -} - -// exportedFrom reports whether obj may be visible to a package that imports pkg. -// This includes not just the exported members of pkg, but also unexported -// constants, types, fields, and methods, perhaps belonging to oether packages, -// that find there way into the API. -// This is an overapproximation of the more accurate approach used by -// gc export data, which walks the type graph, but it's much simpler. -// -// TODO(adonovan): do more accurate filtering by walking the type graph. -func exportedFrom(obj types.Object, pkg *types.Package) bool { - switch obj := obj.(type) { - case *types.Func: - return obj.Exported() && obj.Pkg() == pkg || - obj.Type().(*types.Signature).Recv() != nil - case *types.Var: - return obj.Exported() && obj.Pkg() == pkg || - obj.IsField() - case *types.TypeName, *types.Const: - return true - } - return false // Nil, Builtin, Label, or PkgName -} - -func factType(fact analysis.Fact) reflect.Type { - t := reflect.TypeOf(fact) - if t.Kind() != reflect.Ptr { - panic(fmt.Sprintf("invalid Fact type: got %T, want pointer", t)) - } - return t -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cache/builtin.go b/vendor/golang.org/x/tools/internal/lsp/cache/builtin.go deleted file mode 100644 index c634b60b2..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cache/builtin.go +++ /dev/null @@ -1,58 +0,0 @@ -package cache - -import ( - "context" - "go/ast" - - "golang.org/x/tools/go/packages" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" -) - -type builtinPkg struct { - pkg *ast.Package - files []source.ParseGoHandle -} - -func (b *builtinPkg) Lookup(name string) *ast.Object { - if b == nil || b.pkg == nil || b.pkg.Scope == nil { - return nil - } - return b.pkg.Scope.Lookup(name) -} - -func (b *builtinPkg) Files() []source.ParseGoHandle { - return b.files -} - -// buildBuiltinPkg builds the view's builtin package. -// It assumes that the view is not active yet, -// i.e. it has not been added to the session's list of views. -func (v *view) buildBuiltinPackage(ctx context.Context) error { - cfg := v.Config(ctx) - pkgs, err := packages.Load(cfg, "builtin") - if err != nil { - return err - } - if len(pkgs) != 1 { - return err - } - pkg := pkgs[0] - files := make(map[string]*ast.File) - for _, filename := range pkg.GoFiles { - fh := v.session.GetFile(span.FileURI(filename), source.Go) - ph := v.session.cache.ParseGoHandle(fh, source.ParseFull) - v.builtin.files = append(v.builtin.files, ph) - file, _, _, err := ph.Parse(ctx) - if err != nil { - return err - } - files[filename] = file - - v.ignoredURIsMu.Lock() - v.ignoredURIs[span.NewURI(filename)] = struct{}{} - v.ignoredURIsMu.Unlock() - } - v.builtin.pkg, err = ast.NewPackage(cfg.Fset, files, nil, nil) - return err -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cache/cache.go b/vendor/golang.org/x/tools/internal/lsp/cache/cache.go deleted file mode 100644 index e3a139695..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cache/cache.go +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cache - -import ( - "context" - "crypto/sha1" - "fmt" - "go/token" - "strconv" - "sync/atomic" - - "golang.org/x/tools/internal/lsp/debug" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/memoize" - "golang.org/x/tools/internal/span" -) - -func New(options func(*source.Options)) source.Cache { - index := atomic.AddInt64(&cacheIndex, 1) - c := &cache{ - fs: &nativeFileSystem{}, - id: strconv.FormatInt(index, 10), - fset: token.NewFileSet(), - options: options, - } - debug.AddCache(debugCache{c}) - return c -} - -type cache struct { - fs source.FileSystem - id string - fset *token.FileSet - options func(*source.Options) - - store memoize.Store -} - -type fileKey struct { - identity source.FileIdentity -} - -type fileHandle struct { - cache *cache - underlying source.FileHandle - handle *memoize.Handle -} - -type fileData struct { - memoize.NoCopy - bytes []byte - hash string - err error -} - -func (c *cache) GetFile(uri span.URI, kind source.FileKind) source.FileHandle { - underlying := c.fs.GetFile(uri, kind) - key := fileKey{ - identity: underlying.Identity(), - } - h := c.store.Bind(key, func(ctx context.Context) interface{} { - data := &fileData{} - data.bytes, data.hash, data.err = underlying.Read(ctx) - return data - }) - return &fileHandle{ - cache: c, - underlying: underlying, - handle: h, - } -} - -func (c *cache) NewSession(ctx context.Context) source.Session { - index := atomic.AddInt64(&sessionIndex, 1) - s := &session{ - cache: c, - id: strconv.FormatInt(index, 10), - options: source.DefaultOptions, - overlays: make(map[span.URI]*overlay), - filesWatchMap: NewWatchMap(), - } - debug.AddSession(debugSession{s}) - return s -} - -func (c *cache) FileSet() *token.FileSet { - return c.fset -} - -func (h *fileHandle) FileSystem() source.FileSystem { - return h.cache -} - -func (h *fileHandle) Identity() source.FileIdentity { - return h.underlying.Identity() -} - -func (h *fileHandle) Read(ctx context.Context) ([]byte, string, error) { - v := h.handle.Get(ctx) - if v == nil { - return nil, "", ctx.Err() - } - data := v.(*fileData) - return data.bytes, data.hash, data.err -} - -func hashContents(contents []byte) string { - // TODO: consider whether sha1 is the best choice here - // This hash is used for internal identity detection only - return fmt.Sprintf("%x", sha1.Sum(contents)) -} - -var cacheIndex, sessionIndex, viewIndex int64 - -type debugCache struct{ *cache } - -func (c *cache) ID() string { return c.id } -func (c debugCache) FileSet() *token.FileSet { return c.fset } diff --git a/vendor/golang.org/x/tools/internal/lsp/cache/check.go b/vendor/golang.org/x/tools/internal/lsp/cache/check.go deleted file mode 100644 index fb7772e2a..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cache/check.go +++ /dev/null @@ -1,326 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cache - -import ( - "bytes" - "context" - "fmt" - "go/ast" - "go/token" - "go/types" - "sort" - "sync" - - "golang.org/x/tools/go/packages" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/lsp/telemetry" - "golang.org/x/tools/internal/memoize" - "golang.org/x/tools/internal/telemetry/log" - "golang.org/x/tools/internal/telemetry/trace" - errors "golang.org/x/xerrors" -) - -// checkPackageHandle implements source.CheckPackageHandle. -type checkPackageHandle struct { - handle *memoize.Handle - - // files are the ParseGoHandles that compose the package. - files []source.ParseGoHandle - - // mode is the mode the the files were parsed in. - mode source.ParseMode - - // m is the metadata associated with the package. - m *metadata - - // key is the hashed key for the package. - key []byte -} - -func (cph *checkPackageHandle) packageKey() packageKey { - return packageKey{ - id: cph.m.id, - mode: cph.mode, - } -} - -// checkPackageData contains the data produced by type-checking a package. -type checkPackageData struct { - memoize.NoCopy - - pkg *pkg - err error -} - -// checkPackageHandle returns a source.CheckPackageHandle for a given package and config. -func (s *snapshot) checkPackageHandle(ctx context.Context, id packageID, mode source.ParseMode) (*checkPackageHandle, error) { - // Check if we already have this CheckPackageHandle cached. - if cph := s.getPackage(id, mode); cph != nil { - return cph, nil - } - - // Build the CheckPackageHandle for this ID and its dependencies. - cph, deps, err := s.buildKey(ctx, id, mode) - if err != nil { - return nil, err - } - - // Do not close over the checkPackageHandle or the snapshot in the Bind function. - // This creates a cycle, which causes the finalizers to never run on the handles. - // The possible cycles are: - // - // checkPackageHandle.h.function -> checkPackageHandle - // checkPackageHandle.h.function -> snapshot -> checkPackageHandle - // - - m := cph.m - files := cph.files - key := cph.key - fset := s.view.session.cache.fset - - h := s.view.session.cache.store.Bind(string(key), func(ctx context.Context) interface{} { - // Begin loading the direct dependencies, in parallel. - for _, dep := range deps { - go func(dep *checkPackageHandle) { - dep.check(ctx) - }(dep) - } - data := &checkPackageData{} - data.pkg, data.err = typeCheck(ctx, fset, m, mode, files, deps) - return data - }) - cph.handle = h - - // Cache the CheckPackageHandle in the snapshot. - s.addPackage(cph) - - return cph, nil -} - -// buildKey computes the checkPackageKey for a given checkPackageHandle. -func (s *snapshot) buildKey(ctx context.Context, id packageID, mode source.ParseMode) (*checkPackageHandle, map[packagePath]*checkPackageHandle, error) { - m := s.getMetadata(id) - if m == nil { - return nil, nil, errors.Errorf("no metadata for %s", id) - } - phs, err := s.parseGoHandles(ctx, m, mode) - if err != nil { - return nil, nil, err - } - cph := &checkPackageHandle{ - m: m, - files: phs, - mode: mode, - } - - // Make sure all of the depList are sorted. - depList := append([]packageID{}, m.deps...) - sort.Slice(depList, func(i, j int) bool { - return depList[i] < depList[j] - }) - - deps := make(map[packagePath]*checkPackageHandle) - - // Begin computing the key by getting the depKeys for all dependencies. - var depKeys [][]byte - for _, depID := range depList { - depHandle, err := s.checkPackageHandle(ctx, depID, source.ParseExported) - if err != nil { - log.Error(ctx, "no dep handle", err, telemetry.Package.Of(depID)) - - // One bad dependency should not prevent us from checking the entire package. - // Add a special key to mark a bad dependency. - depKeys = append(depKeys, []byte(fmt.Sprintf("%s import not found", id))) - continue - } - deps[depHandle.m.pkgPath] = depHandle - depKeys = append(depKeys, depHandle.key) - } - cph.key = checkPackageKey(cph.m.id, cph.files, m.config, depKeys) - return cph, deps, nil -} - -func checkPackageKey(id packageID, phs []source.ParseGoHandle, cfg *packages.Config, deps [][]byte) []byte { - return []byte(hashContents([]byte(fmt.Sprintf("%s%s%s%s", id, hashParseKeys(phs), hashConfig(cfg), hashContents(bytes.Join(deps, nil)))))) -} - -// hashConfig returns the hash for the *packages.Config. -func hashConfig(config *packages.Config) string { - b := bytes.NewBuffer(nil) - - // Dir, Mode, Env, BuildFlags are the parts of the config that can change. - b.WriteString(config.Dir) - b.WriteString(string(config.Mode)) - - for _, e := range config.Env { - b.WriteString(e) - } - for _, f := range config.BuildFlags { - b.WriteString(f) - } - return hashContents(b.Bytes()) -} - -func (cph *checkPackageHandle) Check(ctx context.Context) (source.Package, error) { - return cph.check(ctx) -} - -func (cph *checkPackageHandle) check(ctx context.Context) (*pkg, error) { - v := cph.handle.Get(ctx) - if v == nil { - return nil, errors.Errorf("no package for %s", cph.m.id) - } - data := v.(*checkPackageData) - return data.pkg, data.err -} - -func (cph *checkPackageHandle) Files() []source.ParseGoHandle { - return cph.files -} - -func (cph *checkPackageHandle) ID() string { - return string(cph.m.id) -} - -func (cph *checkPackageHandle) MissingDependencies() []string { - var md []string - for i := range cph.m.missingDeps { - md = append(md, string(i)) - } - return md -} - -func (cph *checkPackageHandle) Cached() (source.Package, error) { - return cph.cached() -} - -func (cph *checkPackageHandle) cached() (*pkg, error) { - v := cph.handle.Cached() - if v == nil { - return nil, errors.Errorf("no cached type information for %s", cph.m.pkgPath) - } - data := v.(*checkPackageData) - return data.pkg, data.err -} - -func (s *snapshot) parseGoHandles(ctx context.Context, m *metadata, mode source.ParseMode) ([]source.ParseGoHandle, error) { - phs := make([]source.ParseGoHandle, 0, len(m.files)) - for _, uri := range m.files { - f, err := s.view.GetFile(ctx, uri) - if err != nil { - return nil, err - } - fh := s.Handle(ctx, f) - phs = append(phs, s.view.session.cache.ParseGoHandle(fh, mode)) - } - return phs, nil -} - -func typeCheck(ctx context.Context, fset *token.FileSet, m *metadata, mode source.ParseMode, phs []source.ParseGoHandle, deps map[packagePath]*checkPackageHandle) (*pkg, error) { - ctx, done := trace.StartSpan(ctx, "cache.importer.typeCheck", telemetry.Package.Of(m.id)) - defer done() - - var rawErrors []error - for _, err := range m.errors { - rawErrors = append(rawErrors, err) - } - - pkg := &pkg{ - id: m.id, - pkgPath: m.pkgPath, - mode: mode, - files: phs, - imports: make(map[packagePath]*pkg), - typesSizes: m.typesSizes, - typesInfo: &types.Info{ - Types: make(map[ast.Expr]types.TypeAndValue), - Defs: make(map[*ast.Ident]types.Object), - Uses: make(map[*ast.Ident]types.Object), - Implicits: make(map[ast.Node]types.Object), - Selections: make(map[*ast.SelectorExpr]*types.Selection), - Scopes: make(map[ast.Node]*types.Scope), - }, - } - var ( - files = make([]*ast.File, len(pkg.files)) - parseErrors = make([]error, len(pkg.files)) - wg sync.WaitGroup - ) - for i, ph := range pkg.files { - wg.Add(1) - go func(i int, ph source.ParseGoHandle) { - defer wg.Done() - - files[i], _, parseErrors[i], _ = ph.Parse(ctx) - }(i, ph) - } - wg.Wait() - - for _, e := range parseErrors { - if e != nil { - rawErrors = append(rawErrors, e) - } - } - - var i int - for _, f := range files { - if f != nil { - files[i] = f - i++ - } - } - files = files[:i] - - // Use the default type information for the unsafe package. - if pkg.pkgPath == "unsafe" { - pkg.types = types.Unsafe - } else if len(files) == 0 { // not the unsafe package, no parsed files - return nil, errors.Errorf("no parsed files for package %s", pkg.pkgPath) - } else { - pkg.types = types.NewPackage(string(m.pkgPath), m.name) - } - - cfg := &types.Config{ - Error: func(e error) { - rawErrors = append(rawErrors, e) - }, - Importer: importerFunc(func(pkgPath string) (*types.Package, error) { - dep := deps[packagePath(pkgPath)] - if dep == nil { - return nil, errors.Errorf("no package for import %s", pkgPath) - } - depPkg, err := dep.check(ctx) - if err != nil { - return nil, err - } - pkg.imports[depPkg.pkgPath] = depPkg - return depPkg.types, nil - }), - } - check := types.NewChecker(cfg, fset, pkg.types, pkg.typesInfo) - - // Type checking errors are handled via the config, so ignore them here. - _ = check.Files(files) - - // We don't care about a package's errors unless we have parsed it in full. - if mode == source.ParseFull { - for _, e := range rawErrors { - srcErr, err := sourceError(ctx, fset, pkg, e) - if err != nil { - return nil, err - } - pkg.errors = append(pkg.errors, srcErr) - } - } - - return pkg, nil -} - -// An importFunc is an implementation of the single-method -// types.Importer interface based on a function value. -type importerFunc func(path string) (*types.Package, error) - -func (f importerFunc) Import(path string) (*types.Package, error) { return f(path) } diff --git a/vendor/golang.org/x/tools/internal/lsp/cache/errors.go b/vendor/golang.org/x/tools/internal/lsp/cache/errors.go deleted file mode 100644 index 57740ff2e..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cache/errors.go +++ /dev/null @@ -1,235 +0,0 @@ -package cache - -import ( - "bytes" - "context" - "go/scanner" - "go/token" - "go/types" - "strings" - - "golang.org/x/tools/go/analysis" - "golang.org/x/tools/go/packages" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" - errors "golang.org/x/xerrors" -) - -func sourceError(ctx context.Context, fset *token.FileSet, pkg *pkg, e interface{}) (*source.Error, error) { - var ( - spn span.Span - err error - msg, category string - kind source.ErrorKind - fixes []source.SuggestedFix - related []source.RelatedInformation - ) - switch e := e.(type) { - case packages.Error: - if e.Pos == "" { - spn = parseGoListError(e.Msg) - } else { - spn = span.Parse(e.Pos) - } - msg = e.Msg - kind = toSourceErrorKind(e.Kind) - - case *scanner.Error: - msg = e.Msg - kind = source.ParseError - spn, err = scannerErrorRange(ctx, fset, pkg, e.Pos) - if err != nil { - return nil, err - } - - case scanner.ErrorList: - // The first parser error is likely the root cause of the problem. - if e.Len() <= 0 { - return nil, errors.Errorf("no errors in %v", e) - } - msg = e[0].Msg - kind = source.ParseError - spn, err = scannerErrorRange(ctx, fset, pkg, e[0].Pos) - if err != nil { - return nil, err - } - - case types.Error: - msg = e.Msg - kind = source.TypeError - spn, err = typeErrorRange(ctx, fset, pkg, e.Pos) - if err != nil { - return nil, err - } - - case *analysis.Diagnostic: - spn, err = span.NewRange(fset, e.Pos, e.End).Span() - if err != nil { - return nil, err - } - msg = e.Message - kind = source.Analysis - category = e.Category - fixes, err = suggestedFixes(ctx, fset, pkg, e) - if err != nil { - return nil, err - } - related, err = relatedInformation(ctx, fset, pkg, e) - if err != nil { - return nil, err - } - } - rng, err := spanToRange(ctx, pkg, spn) - if err != nil { - return nil, err - } - return &source.Error{ - URI: spn.URI(), - Range: rng, - Message: msg, - Kind: kind, - Category: category, - SuggestedFixes: fixes, - Related: related, - }, nil -} - -func suggestedFixes(ctx context.Context, fset *token.FileSet, pkg *pkg, diag *analysis.Diagnostic) ([]source.SuggestedFix, error) { - var fixes []source.SuggestedFix - for _, fix := range diag.SuggestedFixes { - edits := make(map[span.URI][]protocol.TextEdit) - for _, e := range fix.TextEdits { - spn, err := span.NewRange(fset, e.Pos, e.End).Span() - if err != nil { - return nil, err - } - rng, err := spanToRange(ctx, pkg, spn) - if err != nil { - return nil, err - } - edits[spn.URI()] = append(edits[spn.URI()], protocol.TextEdit{ - Range: rng, - NewText: string(e.NewText), - }) - } - fixes = append(fixes, source.SuggestedFix{ - Title: fix.Message, - Edits: edits, - }) - } - return fixes, nil -} - -func relatedInformation(ctx context.Context, fset *token.FileSet, pkg *pkg, diag *analysis.Diagnostic) ([]source.RelatedInformation, error) { - var out []source.RelatedInformation - for _, related := range diag.Related { - spn, err := span.NewRange(fset, related.Pos, related.End).Span() - if err != nil { - return nil, err - } - rng, err := spanToRange(ctx, pkg, spn) - if err != nil { - return nil, err - } - out = append(out, source.RelatedInformation{ - URI: spn.URI(), - Range: rng, - Message: related.Message, - }) - } - return out, nil -} - -func toSourceErrorKind(kind packages.ErrorKind) source.ErrorKind { - switch kind { - case packages.ListError: - return source.ListError - case packages.ParseError: - return source.ParseError - case packages.TypeError: - return source.TypeError - default: - return source.UnknownError - } -} - -func typeErrorRange(ctx context.Context, fset *token.FileSet, pkg *pkg, pos token.Pos) (span.Span, error) { - spn, err := span.NewRange(fset, pos, pos).Span() - if err != nil { - return span.Span{}, err - } - posn := fset.Position(pos) - ph, _, err := findFileInPackage(ctx, span.FileURI(posn.Filename), pkg) - if err != nil { - return spn, nil // ignore errors - } - _, m, _, err := ph.Cached() - if err != nil { - return spn, nil - } - s, err := spn.WithOffset(m.Converter) - if err != nil { - return spn, nil // ignore errors - } - data, _, err := ph.File().Read(ctx) - if err != nil { - return spn, nil // ignore errors - } - start := s.Start() - offset := start.Offset() - if offset < len(data) { - if width := bytes.IndexAny(data[offset:], " \n,():;[]"); width > 0 { - return span.New(spn.URI(), start, span.NewPoint(start.Line(), start.Column()+width, offset+width)), nil - } - } - return spn, nil -} - -func scannerErrorRange(ctx context.Context, fset *token.FileSet, pkg *pkg, posn token.Position) (span.Span, error) { - ph, _, err := findFileInPackage(ctx, span.FileURI(posn.Filename), pkg) - if err != nil { - return span.Span{}, err - } - file, _, _, err := ph.Cached() - if err != nil { - return span.Span{}, err - } - tok := fset.File(file.Pos()) - if tok == nil { - return span.Span{}, errors.Errorf("no token.File for %s", ph.File().Identity().URI) - } - pos := tok.Pos(posn.Offset) - return span.NewRange(fset, pos, pos).Span() -} - -// spanToRange converts a span.Span to a protocol.Range, -// assuming that the span belongs to the package whose diagnostics are being computed. -func spanToRange(ctx context.Context, pkg *pkg, spn span.Span) (protocol.Range, error) { - ph, _, err := findFileInPackage(ctx, spn.URI(), pkg) - if err != nil { - return protocol.Range{}, err - } - _, m, _, err := ph.Cached() - if err != nil { - return protocol.Range{}, err - } - return m.Range(spn) -} - -// parseGoListError attempts to parse a standard `go list` error message -// by stripping off the trailing error message. -// -// It works only on errors whose message is prefixed by colon, -// followed by a space (": "). For example: -// -// attributes.go:13:1: expected 'package', found 'type' -// -func parseGoListError(input string) span.Span { - input = strings.TrimSpace(input) - msgIndex := strings.Index(input, ": ") - if msgIndex < 0 { - return span.Parse(input) - } - return span.Parse(input[:msgIndex]) -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cache/external.go b/vendor/golang.org/x/tools/internal/lsp/cache/external.go deleted file mode 100644 index a75ec078f..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cache/external.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cache - -import ( - "context" - "io/ioutil" - "os" - - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/lsp/telemetry" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/telemetry/trace" -) - -// ioLimit limits the number of parallel file reads per process. -var ioLimit = make(chan struct{}, 128) - -// nativeFileSystem implements FileSystem reading from the normal os file system. -type nativeFileSystem struct{} - -// nativeFileHandle implements FileHandle for nativeFileSystem -type nativeFileHandle struct { - fs *nativeFileSystem - identity source.FileIdentity -} - -func (fs *nativeFileSystem) GetFile(uri span.URI, kind source.FileKind) source.FileHandle { - version := "DOES NOT EXIST" - if fi, err := os.Stat(uri.Filename()); err == nil { - version = fi.ModTime().String() - } - return &nativeFileHandle{ - fs: fs, - identity: source.FileIdentity{ - URI: uri, - Version: version, - Kind: kind, - }, - } -} - -func (h *nativeFileHandle) FileSystem() source.FileSystem { - return h.fs -} - -func (h *nativeFileHandle) Identity() source.FileIdentity { - return h.identity -} - -func (h *nativeFileHandle) Read(ctx context.Context) ([]byte, string, error) { - ctx, done := trace.StartSpan(ctx, "cache.nativeFileHandle.Read", telemetry.File.Of(h.identity.URI.Filename())) - _ = ctx - defer done() - - ioLimit <- struct{}{} - defer func() { <-ioLimit }() - // TODO: this should fail if the version is not the same as the handle - data, err := ioutil.ReadFile(h.identity.URI.Filename()) - if err != nil { - return nil, "", err - } - return data, hashContents(data), nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cache/file.go b/vendor/golang.org/x/tools/internal/lsp/cache/file.go deleted file mode 100644 index 122dcdebd..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cache/file.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cache - -import ( - "go/token" - "path/filepath" - "strings" - - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" -) - -// viewFile extends source.File with helper methods for the view package. -type viewFile interface { - source.File - - filename() string - addURI(uri span.URI) int -} - -// fileBase holds the common functionality for all files. -// It is intended to be embedded in the file implementations -type fileBase struct { - uris []span.URI - fname string - kind source.FileKind - - view *view -} - -func dir(filename string) string { - return strings.ToLower(filepath.Dir(filename)) -} - -func basename(filename string) string { - return strings.ToLower(filepath.Base(filename)) -} - -func (f *fileBase) URI() span.URI { - return f.uris[0] -} - -func (f *fileBase) Kind() source.FileKind { - return f.kind -} - -func (f *fileBase) filename() string { - return f.fname -} - -// View returns the view associated with the file. -func (f *fileBase) View() source.View { - return f.view -} - -func (f *fileBase) FileSet() *token.FileSet { - return f.view.Session().Cache().FileSet() -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cache/gofile.go b/vendor/golang.org/x/tools/internal/lsp/cache/gofile.go deleted file mode 100644 index 0aa19e986..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cache/gofile.go +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cache - -import ( - "context" - - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/lsp/telemetry" - "golang.org/x/tools/internal/span" - errors "golang.org/x/xerrors" -) - -func (v *view) CheckPackageHandles(ctx context.Context, f source.File) (source.Snapshot, []source.CheckPackageHandle, error) { - // Get the snapshot that will be used for type-checking. - s := v.getSnapshot() - - cphs, err := s.CheckPackageHandles(ctx, f) - if err != nil { - return nil, nil, err - } - if len(cphs) == 0 { - return nil, nil, errors.Errorf("no CheckPackageHandles for %s", f.URI()) - } - return s, cphs, nil -} - -func (s *snapshot) CheckPackageHandles(ctx context.Context, f source.File) ([]source.CheckPackageHandle, error) { - ctx = telemetry.File.With(ctx, f.URI()) - - fh := s.Handle(ctx, f) - - // Determine if we need to type-check the package. - m, cphs, load, check := s.shouldCheck(fh) - - // We may need to re-load package metadata. - // We only need to this if it has been invalidated, and is therefore unvailable. - if load { - var err error - m, err = s.load(ctx, f.URI()) - if err != nil { - return nil, err - } - // If load has explicitly returned nil metadata and no error, - // it means that we should not re-type-check the packages. - if m == nil { - return cphs, nil - } - } - if check { - var results []source.CheckPackageHandle - for _, m := range m { - cph, err := s.checkPackageHandle(ctx, m.id, source.ParseFull) - if err != nil { - return nil, err - } - results = append(results, cph) - } - cphs = results - } - if len(cphs) == 0 { - return nil, errors.Errorf("no CheckPackageHandles for %s", f.URI()) - } - return cphs, nil -} - -func (s *snapshot) shouldCheck(fh source.FileHandle) (m []*metadata, cphs []source.CheckPackageHandle, load, check bool) { - // Get the metadata for the given file. - m = s.getMetadataForURI(fh.Identity().URI) - - // If there is no metadata for the package, we definitely need to type-check again. - if len(m) == 0 { - return nil, nil, true, true - } - - // If the metadata for the package had missing dependencies, - // we _may_ need to re-check. If the missing dependencies haven't changed - // since previous load, we will not check again. - for _, m := range m { - if len(m.missingDeps) != 0 { - load = true - check = true - } - } - // We expect to see a checked package for each package ID, - // and it should be parsed in full mode. - cphs = s.getPackages(fh.Identity().URI, source.ParseFull) - if len(cphs) < len(m) { - return m, nil, load, true - } - return m, cphs, load, check -} - -func (v *view) GetActiveReverseDeps(ctx context.Context, f source.File) (results []source.CheckPackageHandle) { - var ( - s = v.getSnapshot() - rdeps = transitiveReverseDependencies(ctx, f.URI(), s) - files = v.openFiles(ctx, rdeps) - seen = make(map[span.URI]struct{}) - ) - for _, f := range files { - if _, ok := seen[f.URI()]; ok { - continue - } - cphs, err := s.CheckPackageHandles(ctx, f) - if err != nil { - continue - } - cph, err := source.WidestCheckPackageHandle(cphs) - if err != nil { - continue - } - for _, ph := range cph.Files() { - seen[ph.File().Identity().URI] = struct{}{} - } - results = append(results, cph) - } - return results -} - -func transitiveReverseDependencies(ctx context.Context, uri span.URI, s *snapshot) (result []span.URI) { - var ( - seen = make(map[packageID]struct{}) - uris = make(map[span.URI]struct{}) - topLevelURIs = make(map[span.URI]struct{}) - ) - - metadata := s.getMetadataForURI(uri) - - for _, m := range metadata { - for _, uri := range m.files { - topLevelURIs[uri] = struct{}{} - } - s.reverseDependencies(m.id, uris, seen) - } - // Filter out the URIs that belong to the original package. - for uri := range uris { - if _, ok := topLevelURIs[uri]; ok { - continue - } - result = append(result, uri) - } - return result -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cache/load.go b/vendor/golang.org/x/tools/internal/lsp/cache/load.go deleted file mode 100644 index 3408d3fef..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cache/load.go +++ /dev/null @@ -1,221 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cache - -import ( - "context" - "fmt" - "go/types" - - "golang.org/x/tools/go/packages" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/lsp/telemetry" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/telemetry/log" - "golang.org/x/tools/internal/telemetry/tag" - "golang.org/x/tools/internal/telemetry/trace" - errors "golang.org/x/xerrors" -) - -type metadata struct { - id packageID - pkgPath packagePath - name string - files []span.URI - typesSizes types.Sizes - errors []packages.Error - deps []packageID - missingDeps map[packagePath]struct{} - - // config is the *packages.Config associated with the loaded package. - config *packages.Config -} - -func (s *snapshot) load(ctx context.Context, uri span.URI) ([]*metadata, error) { - ctx, done := trace.StartSpan(ctx, "cache.view.load", telemetry.URI.Of(uri)) - defer done() - - cfg := s.view.Config(ctx) - pkgs, err := packages.Load(cfg, fmt.Sprintf("file=%s", uri.Filename())) - - // If the context was canceled, return early. - // Otherwise, we might be type-checking an incomplete result. - if err == context.Canceled { - return nil, errors.Errorf("no metadata for %s: %v", uri.Filename(), err) - } - log.Print(ctx, "go/packages.Load", tag.Of("packages", len(pkgs))) - if len(pkgs) == 0 { - if err == nil { - err = errors.Errorf("go/packages.Load: no packages found for %s", uri) - } - // Return this error as a diagnostic to the user. - return nil, err - } - m, prevMissingImports, err := s.updateMetadata(ctx, uri, pkgs, cfg) - if err != nil { - return nil, err - } - meta, err := validateMetadata(ctx, m, prevMissingImports) - if err != nil { - return nil, err - } - return meta, nil -} - -func validateMetadata(ctx context.Context, metadata []*metadata, prevMissingImports map[packageID]map[packagePath]struct{}) ([]*metadata, error) { - // If we saw incorrect metadata for this package previously, don't both rechecking it. - for _, m := range metadata { - if len(m.missingDeps) > 0 { - prev, ok := prevMissingImports[m.id] - // There are missing imports that we previously hadn't seen before. - if !ok { - return metadata, nil - } - // The set of missing imports has changed. - if !sameSet(prev, m.missingDeps) { - return metadata, nil - } - } else { - // There are no missing imports. - return metadata, nil - } - } - return nil, nil -} - -func sameSet(x, y map[packagePath]struct{}) bool { - if len(x) != len(y) { - return false - } - for k := range x { - if _, ok := y[k]; !ok { - return false - } - } - return true -} - -// shouldLoad reparses a file's package and import declarations to -// determine if they have changed. -func (c *cache) shouldLoad(ctx context.Context, s *snapshot, originalFH, currentFH source.FileHandle) bool { - if originalFH == nil { - return true - } - - // Get the original and current parsed files in order to check package name and imports. - original, _, _, originalErr := c.ParseGoHandle(originalFH, source.ParseHeader).Parse(ctx) - current, _, _, currentErr := c.ParseGoHandle(currentFH, source.ParseHeader).Parse(ctx) - if originalErr != nil || currentErr != nil { - return (originalErr == nil) != (currentErr == nil) - } - - // Check if the package's metadata has changed. The cases handled are: - // - // 1. A package's name has changed - // 2. A file's imports have changed - // - if original.Name.Name != current.Name.Name { - return true - } - // If the package's imports have changed, re-run `go list`. - if len(original.Imports) != len(current.Imports) { - return true - } - for i, importSpec := range original.Imports { - // TODO: Handle the case where the imports have just been re-ordered. - if importSpec.Path.Value != current.Imports[i].Path.Value { - return true - } - } - return false -} - -func (s *snapshot) updateMetadata(ctx context.Context, uri span.URI, pkgs []*packages.Package, cfg *packages.Config) ([]*metadata, map[packageID]map[packagePath]struct{}, error) { - // Clear metadata since we are re-running go/packages. - prevMissingImports := make(map[packageID]map[packagePath]struct{}) - m := s.getMetadataForURI(uri) - - for _, m := range m { - if len(m.missingDeps) > 0 { - prevMissingImports[m.id] = m.missingDeps - } - } - - var results []*metadata - for _, pkg := range pkgs { - log.Print(ctx, "go/packages.Load", tag.Of("package", pkg.PkgPath), tag.Of("files", pkg.CompiledGoFiles)) - - // Set the metadata for this package. - if err := s.updateImports(ctx, packagePath(pkg.PkgPath), pkg, cfg, map[packageID]struct{}{}); err != nil { - return nil, nil, err - } - m := s.getMetadata(packageID(pkg.ID)) - if m != nil { - results = append(results, m) - } - } - - // Rebuild the import graph when the metadata is updated. - s.clearAndRebuildImportGraph() - - if len(results) == 0 { - return nil, nil, errors.Errorf("no metadata for %s", uri) - } - return results, prevMissingImports, nil -} - -func (s *snapshot) updateImports(ctx context.Context, pkgPath packagePath, pkg *packages.Package, cfg *packages.Config, seen map[packageID]struct{}) error { - id := packageID(pkg.ID) - if _, ok := seen[id]; ok { - return errors.Errorf("import cycle detected: %q", id) - } - // Recreate the metadata rather than reusing it to avoid locking. - m := &metadata{ - id: id, - pkgPath: pkgPath, - name: pkg.Name, - typesSizes: pkg.TypesSizes, - errors: pkg.Errors, - config: cfg, - } - seen[id] = struct{}{} - for _, filename := range pkg.CompiledGoFiles { - uri := span.FileURI(filename) - m.files = append(m.files, uri) - - s.addID(uri, m.id) - } - - copied := make(map[packageID]struct{}) - for k, v := range seen { - copied[k] = v - } - for importPath, importPkg := range pkg.Imports { - importPkgPath := packagePath(importPath) - importID := packageID(importPkg.ID) - - m.deps = append(m.deps, importID) - - // Don't remember any imports with significant errors. - if importPkgPath != "unsafe" && len(importPkg.CompiledGoFiles) == 0 { - if m.missingDeps == nil { - m.missingDeps = make(map[packagePath]struct{}) - } - m.missingDeps[importPkgPath] = struct{}{} - continue - } - dep := s.getMetadata(importID) - if dep == nil { - if err := s.updateImports(ctx, importPkgPath, importPkg, cfg, copied); err != nil { - log.Error(ctx, "error in dependency", err) - } - } - } - - // Add the metadata to the cache. - s.setMetadata(m) - - return nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cache/parse.go b/vendor/golang.org/x/tools/internal/lsp/cache/parse.go deleted file mode 100644 index 77a4e1687..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cache/parse.go +++ /dev/null @@ -1,573 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cache - -import ( - "bytes" - "context" - "go/ast" - "go/parser" - "go/scanner" - "go/token" - "reflect" - - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/lsp/telemetry" - "golang.org/x/tools/internal/memoize" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/telemetry/log" - "golang.org/x/tools/internal/telemetry/trace" - errors "golang.org/x/xerrors" -) - -// Limits the number of parallel parser calls per process. -var parseLimit = make(chan struct{}, 20) - -// parseKey uniquely identifies a parsed Go file. -type parseKey struct { - file source.FileIdentity - mode source.ParseMode -} - -type parseGoHandle struct { - handle *memoize.Handle - file source.FileHandle - mode source.ParseMode -} - -type parseGoData struct { - memoize.NoCopy - - ast *ast.File - parseError error // errors associated with parsing the file - mapper *protocol.ColumnMapper - err error -} - -func (c *cache) ParseGoHandle(fh source.FileHandle, mode source.ParseMode) source.ParseGoHandle { - key := parseKey{ - file: fh.Identity(), - mode: mode, - } - h := c.store.Bind(key, func(ctx context.Context) interface{} { - data := &parseGoData{} - data.ast, data.mapper, data.parseError, data.err = parseGo(ctx, c, fh, mode) - return data - }) - return &parseGoHandle{ - handle: h, - file: fh, - mode: mode, - } -} - -func (h *parseGoHandle) File() source.FileHandle { - return h.file -} - -func (h *parseGoHandle) Mode() source.ParseMode { - return h.mode -} - -func (h *parseGoHandle) Parse(ctx context.Context) (*ast.File, *protocol.ColumnMapper, error, error) { - v := h.handle.Get(ctx) - if v == nil { - return nil, nil, nil, errors.Errorf("no parsed file for %s", h.File().Identity().URI) - } - data := v.(*parseGoData) - return data.ast, data.mapper, data.parseError, data.err -} - -func (h *parseGoHandle) Cached() (*ast.File, *protocol.ColumnMapper, error, error) { - v := h.handle.Cached() - if v == nil { - return nil, nil, nil, errors.Errorf("no cached AST for %s", h.file.Identity().URI) - } - data := v.(*parseGoData) - return data.ast, data.mapper, data.parseError, data.err -} - -func hashParseKey(ph source.ParseGoHandle) string { - b := bytes.NewBuffer(nil) - b.WriteString(ph.File().Identity().String()) - b.WriteString(string(ph.Mode())) - return hashContents(b.Bytes()) -} - -func hashParseKeys(phs []source.ParseGoHandle) string { - b := bytes.NewBuffer(nil) - for _, ph := range phs { - b.WriteString(hashParseKey(ph)) - } - return hashContents(b.Bytes()) -} - -func parseGo(ctx context.Context, c *cache, fh source.FileHandle, mode source.ParseMode) (file *ast.File, mapper *protocol.ColumnMapper, parseError error, err error) { - ctx, done := trace.StartSpan(ctx, "cache.parseGo", telemetry.File.Of(fh.Identity().URI.Filename())) - defer done() - - buf, _, err := fh.Read(ctx) - if err != nil { - return nil, nil, nil, err - } - parseLimit <- struct{}{} - defer func() { <-parseLimit }() - parserMode := parser.AllErrors | parser.ParseComments - if mode == source.ParseHeader { - parserMode = parser.ImportsOnly | parser.ParseComments - } - file, parseError = parser.ParseFile(c.fset, fh.Identity().URI.Filename(), buf, parserMode) - if file != nil { - if mode == source.ParseExported { - trimAST(file) - } - // Fix any badly parsed parts of the AST. - tok := c.fset.File(file.Pos()) - if err := fix(ctx, file, tok, buf); err != nil { - log.Error(ctx, "failed to fix AST", err) - } - } - - if file == nil { - // If the file is nil only due to parse errors, - // the parse errors are the actual errors. - err := parseError - if err == nil { - err = errors.Errorf("no AST for %s", fh.Identity().URI) - } - return nil, nil, parseError, err - } - tok := c.FileSet().File(file.Pos()) - if tok == nil { - return nil, nil, parseError, errors.Errorf("no token.File for %s", fh.Identity().URI) - } - uri := fh.Identity().URI - content, _, err := fh.Read(ctx) - if err != nil { - return nil, nil, parseError, err - } - m := &protocol.ColumnMapper{ - URI: uri, - Converter: span.NewTokenConverter(c.FileSet(), tok), - Content: content, - } - return file, m, parseError, nil -} - -// trimAST clears any part of the AST not relevant to type checking -// expressions at pos. -func trimAST(file *ast.File) { - ast.Inspect(file, func(n ast.Node) bool { - if n == nil { - return false - } - switch n := n.(type) { - case *ast.FuncDecl: - n.Body = nil - case *ast.BlockStmt: - n.List = nil - case *ast.CaseClause: - n.Body = nil - case *ast.CommClause: - n.Body = nil - case *ast.CompositeLit: - // Leave elts in place for [...]T - // array literals, because they can - // affect the expression's type. - if !isEllipsisArray(n.Type) { - n.Elts = nil - } - } - return true - }) -} - -func isEllipsisArray(n ast.Expr) bool { - at, ok := n.(*ast.ArrayType) - if !ok { - return false - } - _, ok = at.Len.(*ast.Ellipsis) - return ok -} - -// fix inspects the AST and potentially modifies any *ast.BadStmts so that it can be -// type-checked more effectively. -func fix(ctx context.Context, n ast.Node, tok *token.File, src []byte) error { - var ( - ancestors []ast.Node - parent ast.Node - err error - ) - ast.Inspect(n, func(n ast.Node) bool { - if n == nil { - if len(ancestors) > 0 { - ancestors = ancestors[:len(ancestors)-1] - if len(ancestors) > 0 { - parent = ancestors[len(ancestors)-1] - } - } - return false - } - - switch n := n.(type) { - case *ast.BadStmt: - err = fixDeferOrGoStmt(n, parent, tok, src) // don't shadow err - if err == nil { - // Recursively fix in our fixed node. - err = fix(ctx, parent, tok, src) - } else { - err = errors.Errorf("unable to parse defer or go from *ast.BadStmt: %v", err) - } - return false - case *ast.BadExpr: - // Don't propagate this error since *ast.BadExpr is very common - // and it is only sometimes due to array types. Errors from here - // are expected and not actionable in general. - fixArrayErr := fixArrayType(n, parent, tok, src) - if fixArrayErr == nil { - // Recursively fix in our fixed node. - err = fix(ctx, parent, tok, src) - } - return false - default: - ancestors = append(ancestors, n) - parent = n - return true - } - }) - return err -} - -// fixArrayType tries to parse an *ast.BadExpr into an *ast.ArrayType. -// go/parser often turns lone array types like "[]int" into BadExprs -// if it isn't expecting a type. -func fixArrayType(bad *ast.BadExpr, parent ast.Node, tok *token.File, src []byte) error { - // Our expected input is a bad expression that looks like "[]someExpr". - - from := bad.Pos() - to := bad.End() - - if !from.IsValid() || !to.IsValid() { - return errors.Errorf("invalid BadExpr from/to: %d/%d", from, to) - } - - exprBytes := make([]byte, 0, int(to-from)+3) - // Avoid doing tok.Offset(to) since that panics if badExpr ends at EOF. - exprBytes = append(exprBytes, src[tok.Offset(from):tok.Offset(to-1)+1]...) - exprBytes = bytes.TrimSpace(exprBytes) - - // If our expression ends in "]" (e.g. "[]"), add a phantom selector - // so we can complete directly after the "[]". - if len(exprBytes) > 0 && exprBytes[len(exprBytes)-1] == ']' { - exprBytes = append(exprBytes, '_') - } - - // Add "{}" to turn our ArrayType into a CompositeLit. This is to - // handle the case of "[...]int" where we must make it a composite - // literal to be parseable. - exprBytes = append(exprBytes, '{', '}') - - expr, err := parseExpr(from, exprBytes) - if err != nil { - return err - } - - cl, _ := expr.(*ast.CompositeLit) - if cl == nil { - return errors.Errorf("expr not compLit (%T)", expr) - } - - at, _ := cl.Type.(*ast.ArrayType) - if at == nil { - return errors.Errorf("compLit type not array (%T)", cl.Type) - } - - if !replaceNode(parent, bad, at) { - return errors.Errorf("couldn't replace array type") - } - - return nil -} - -// fixDeferOrGoStmt tries to parse an *ast.BadStmt into a defer or a go statement. -// -// go/parser packages a statement of the form "defer x." as an *ast.BadStmt because -// it does not include a call expression. This means that go/types skips type-checking -// this statement entirely, and we can't use the type information when completing. -// Here, we try to generate a fake *ast.DeferStmt or *ast.GoStmt to put into the AST, -// instead of the *ast.BadStmt. -func fixDeferOrGoStmt(bad *ast.BadStmt, parent ast.Node, tok *token.File, src []byte) error { - // Check if we have a bad statement containing either a "go" or "defer". - s := &scanner.Scanner{} - s.Init(tok, src, nil, 0) - - var ( - pos token.Pos - tkn token.Token - ) - for { - if tkn == token.EOF { - return errors.Errorf("reached the end of the file") - } - if pos >= bad.From { - break - } - pos, tkn, _ = s.Scan() - } - - var stmt ast.Stmt - switch tkn { - case token.DEFER: - stmt = &ast.DeferStmt{ - Defer: pos, - } - case token.GO: - stmt = &ast.GoStmt{ - Go: pos, - } - default: - return errors.Errorf("no defer or go statement found") - } - - var ( - from, to, last token.Pos - lastToken token.Token - braceDepth int - phantomSelectors []token.Pos - ) -FindTo: - for { - to, tkn, _ = s.Scan() - - if from == token.NoPos { - from = to - } - - switch tkn { - case token.EOF: - break FindTo - case token.SEMICOLON: - // If we aren't in nested braces, end of statement means - // end of expression. - if braceDepth == 0 { - break FindTo - } - case token.LBRACE: - braceDepth++ - } - - // This handles the common dangling selector case. For example in - // - // defer fmt. - // y := 1 - // - // we notice the dangling period and end our expression. - // - // If the previous token was a "." and we are looking at a "}", - // the period is likely a dangling selector and needs a phantom - // "_". Likewise if the current token is on a different line than - // the period, the period is likely a dangling selector. - if lastToken == token.PERIOD && (tkn == token.RBRACE || tok.Line(to) > tok.Line(last)) { - // Insert phantom "_" selector after the dangling ".". - phantomSelectors = append(phantomSelectors, last+1) - // If we aren't in a block then end the expression after the ".". - if braceDepth == 0 { - to = last + 1 - break - } - } - - lastToken = tkn - last = to - - switch tkn { - case token.RBRACE: - braceDepth-- - if braceDepth <= 0 { - if braceDepth == 0 { - // +1 to include the "}" itself. - to += 1 - } - break FindTo - } - } - } - - if !from.IsValid() || tok.Offset(from) >= len(src) { - return errors.Errorf("invalid from position") - } - - if !to.IsValid() || tok.Offset(to) >= len(src) { - return errors.Errorf("invalid to position %d", to) - } - - // Insert any phantom selectors needed to prevent dangling "." from messing - // up the AST. - exprBytes := make([]byte, 0, int(to-from)+len(phantomSelectors)) - for i, b := range src[tok.Offset(from):tok.Offset(to)] { - if len(phantomSelectors) > 0 && from+token.Pos(i) == phantomSelectors[0] { - exprBytes = append(exprBytes, '_') - phantomSelectors = phantomSelectors[1:] - } - exprBytes = append(exprBytes, b) - } - - if len(phantomSelectors) > 0 { - exprBytes = append(exprBytes, '_') - } - - expr, err := parseExpr(from, exprBytes) - if err != nil { - return err - } - - // Package the expression into a fake *ast.CallExpr and re-insert - // into the function. - call := &ast.CallExpr{ - Fun: expr, - Lparen: to, - Rparen: to, - } - - switch stmt := stmt.(type) { - case *ast.DeferStmt: - stmt.Call = call - case *ast.GoStmt: - stmt.Call = call - } - - if !replaceNode(parent, bad, stmt) { - return errors.Errorf("couldn't replace CallExpr") - } - - return nil -} - -// parseExpr parses the expression in src and updates its position to -// start at pos. -func parseExpr(pos token.Pos, src []byte) (ast.Expr, error) { - // Wrap our expression to make it a valid Go file we can pass to ParseFile. - fileSrc := bytes.Join([][]byte{ - []byte("package fake;func _(){"), - src, - []byte("}"), - }, nil) - - // Use ParseFile instead of ParseExpr because ParseFile has - // best-effort behavior, whereas ParseExpr fails hard on any error. - fakeFile, err := parser.ParseFile(token.NewFileSet(), "", fileSrc, 0) - if fakeFile == nil { - return nil, errors.Errorf("error reading fake file source: %v", err) - } - - // Extract our expression node from inside the fake file. - if len(fakeFile.Decls) == 0 { - return nil, errors.Errorf("error parsing fake file: %v", err) - } - - fakeDecl, _ := fakeFile.Decls[0].(*ast.FuncDecl) - if fakeDecl == nil || len(fakeDecl.Body.List) == 0 { - return nil, errors.Errorf("no statement in %s: %v", src, err) - } - - exprStmt, ok := fakeDecl.Body.List[0].(*ast.ExprStmt) - if !ok { - return nil, errors.Errorf("no expr in %s: %v", src, err) - } - - expr := exprStmt.X - - // parser.ParseExpr returns undefined positions. - // Adjust them for the current file. - offsetPositions(expr, pos-1-(expr.Pos()-1)) - - return expr, nil -} - -var tokenPosType = reflect.TypeOf(token.NoPos) - -// offsetPositions applies an offset to the positions in an ast.Node. -func offsetPositions(expr ast.Expr, offset token.Pos) { - ast.Inspect(expr, func(n ast.Node) bool { - if n == nil { - return false - } - - v := reflect.ValueOf(n).Elem() - - switch v.Kind() { - case reflect.Struct: - for i := 0; i < v.NumField(); i++ { - f := v.Field(i) - if f.Type() != tokenPosType { - continue - } - - if !f.CanSet() { - continue - } - - f.SetInt(f.Int() + int64(offset)) - } - } - - return true - }) -} - -// replaceNode updates parent's child oldChild to be newChild. It -// retuns whether it replaced successfully. -func replaceNode(parent, oldChild, newChild ast.Node) bool { - if parent == nil || oldChild == nil || newChild == nil { - return false - } - - parentVal := reflect.ValueOf(parent).Elem() - if parentVal.Kind() != reflect.Struct { - return false - } - - newChildVal := reflect.ValueOf(newChild) - - tryReplace := func(v reflect.Value) bool { - if !v.CanSet() || !v.CanInterface() { - return false - } - - // If the existing value is oldChild, we found our child. Make - // sure our newChild is assignable and then make the swap. - if v.Interface() == oldChild && newChildVal.Type().AssignableTo(v.Type()) { - v.Set(newChildVal) - return true - } - - return false - } - - // Loop over parent's struct fields. - for i := 0; i < parentVal.NumField(); i++ { - f := parentVal.Field(i) - - switch f.Kind() { - // Check interface and pointer fields. - case reflect.Interface, reflect.Ptr: - if tryReplace(f) { - return true - } - - // Search through any slice fields. - case reflect.Slice: - for i := 0; i < f.Len(); i++ { - if tryReplace(f.Index(i)) { - return true - } - } - } - } - - return false -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cache/pkg.go b/vendor/golang.org/x/tools/internal/lsp/cache/pkg.go deleted file mode 100644 index 613f8097f..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cache/pkg.go +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cache - -import ( - "context" - "go/ast" - "go/types" - - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" - errors "golang.org/x/xerrors" -) - -// pkg contains the type information needed by the source package. -type pkg struct { - // ID and package path have their own types to avoid being used interchangeably. - id packageID - pkgPath packagePath - mode source.ParseMode - - files []source.ParseGoHandle - errors []*source.Error - imports map[packagePath]*pkg - types *types.Package - typesInfo *types.Info - typesSizes types.Sizes -} - -// Declare explicit types for package paths and IDs to ensure that we never use -// an ID where a path belongs, and vice versa. If we confused the two, it would -// result in confusing errors because package IDs often look like package paths. -type packageID string -type packagePath string - -func (p *pkg) ID() string { - return string(p.id) -} - -func (p *pkg) PkgPath() string { - return string(p.pkgPath) -} - -func (p *pkg) Files() []source.ParseGoHandle { - return p.files -} - -func (p *pkg) File(uri span.URI) (source.ParseGoHandle, error) { - for _, ph := range p.Files() { - if ph.File().Identity().URI == uri { - return ph, nil - } - } - return nil, errors.Errorf("no ParseGoHandle for %s", uri) -} - -func (p *pkg) GetSyntax() []*ast.File { - var syntax []*ast.File - for _, ph := range p.files { - file, _, _, err := ph.Cached() - if err == nil { - syntax = append(syntax, file) - } - } - return syntax -} - -func (p *pkg) GetErrors() []*source.Error { - return p.errors -} - -func (p *pkg) GetTypes() *types.Package { - return p.types -} - -func (p *pkg) GetTypesInfo() *types.Info { - return p.typesInfo -} - -func (p *pkg) GetTypesSizes() types.Sizes { - return p.typesSizes -} - -func (p *pkg) IsIllTyped() bool { - return p.types == nil || p.typesInfo == nil || p.typesSizes == nil -} - -func (p *pkg) GetImport(pkgPath string) (source.Package, error) { - if imp := p.imports[packagePath(pkgPath)]; imp != nil { - return imp, nil - } - // Don't return a nil pointer because that still satisfies the interface. - return nil, errors.Errorf("no imported package for %s", pkgPath) -} - -func (p *pkg) Imports() []source.Package { - var result []source.Package - for _, imp := range p.imports { - result = append(result, imp) - } - return result -} - -func (s *snapshot) FindAnalysisError(ctx context.Context, id string, diag protocol.Diagnostic) (*source.Error, error) { - acts := s.getActionHandles(packageID(id), source.ParseFull) - for _, act := range acts { - errors, _, err := act.analyze(ctx) - if err != nil { - return nil, err - } - for _, err := range errors { - if err.Category != diag.Source { - continue - } - if err.Message != diag.Message { - continue - } - if protocol.CompareRange(err.Range, diag.Range) != 0 { - continue - } - return err, nil - } - } - return nil, errors.Errorf("no matching diagnostic for %v", diag) -} - -func findFileInPackage(ctx context.Context, uri span.URI, pkg source.Package) (source.ParseGoHandle, source.Package, error) { - queue := []source.Package{pkg} - seen := make(map[string]bool) - - for len(queue) > 0 { - pkg := queue[0] - queue = queue[1:] - seen[pkg.ID()] = true - - for _, ph := range pkg.Files() { - if ph.File().Identity().URI == uri { - return ph, pkg, nil - } - } - for _, dep := range pkg.Imports() { - if !seen[dep.ID()] { - queue = append(queue, dep) - } - } - } - return nil, nil, errors.Errorf("no file for %s", uri) -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cache/session.go b/vendor/golang.org/x/tools/internal/lsp/cache/session.go deleted file mode 100644 index f2eaa7aa5..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cache/session.go +++ /dev/null @@ -1,427 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cache - -import ( - "context" - "path/filepath" - "sort" - "strconv" - "strings" - "sync" - "sync/atomic" - - "golang.org/x/tools/internal/lsp/debug" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/lsp/telemetry" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/telemetry/trace" - "golang.org/x/tools/internal/xcontext" - errors "golang.org/x/xerrors" -) - -type session struct { - cache *cache - id string - - options source.Options - - viewMu sync.Mutex - views []*view - viewMap map[span.URI]source.View - - overlayMu sync.Mutex - overlays map[span.URI]*overlay - - openFiles sync.Map - filesWatchMap *WatchMap -} - -type overlay struct { - session *session - uri span.URI - data []byte - hash string - kind source.FileKind - - // sameContentOnDisk is true if a file has been saved on disk, - // and therefore does not need to be part of the overlay sent to go/packages. - sameContentOnDisk bool - - // unchanged is true if a file has not yet been edited. - unchanged bool -} - -func (s *session) Options() source.Options { - return s.options -} - -func (s *session) SetOptions(options source.Options) { - s.options = options -} - -func (s *session) Shutdown(ctx context.Context) { - s.viewMu.Lock() - defer s.viewMu.Unlock() - for _, view := range s.views { - view.shutdown(ctx) - } - s.views = nil - s.viewMap = nil - debug.DropSession(debugSession{s}) -} - -func (s *session) Cache() source.Cache { - return s.cache -} - -func (s *session) NewView(ctx context.Context, name string, folder span.URI, options source.Options) source.View { - index := atomic.AddInt64(&viewIndex, 1) - s.viewMu.Lock() - defer s.viewMu.Unlock() - // We want a true background context and not a detached context here - // the spans need to be unrelated and no tag values should pollute it. - baseCtx := trace.Detach(xcontext.Detach(ctx)) - backgroundCtx, cancel := context.WithCancel(baseCtx) - v := &view{ - session: s, - id: strconv.FormatInt(index, 10), - options: options, - baseCtx: baseCtx, - backgroundCtx: backgroundCtx, - cancel: cancel, - name: name, - folder: folder, - filesByURI: make(map[span.URI]viewFile), - filesByBase: make(map[string][]viewFile), - snapshot: &snapshot{ - packages: make(map[packageKey]*checkPackageHandle), - ids: make(map[span.URI][]packageID), - metadata: make(map[packageID]*metadata), - files: make(map[span.URI]source.FileHandle), - importedBy: make(map[packageID][]packageID), - actions: make(map[actionKey]*actionHandle), - }, - ignoredURIs: make(map[span.URI]struct{}), - builtin: &builtinPkg{}, - } - v.snapshot.view = v - - if v.session.cache.options != nil { - v.session.cache.options(&v.options) - } - - // Preemptively build the builtin package, - // so we immediately add builtin.go to the list of ignored files. - v.buildBuiltinPackage(ctx) - - s.views = append(s.views, v) - // we always need to drop the view map - s.viewMap = make(map[span.URI]source.View) - debug.AddView(debugView{v}) - return v -} - -// View returns the view by name. -func (s *session) View(name string) source.View { - s.viewMu.Lock() - defer s.viewMu.Unlock() - for _, view := range s.views { - if view.Name() == name { - return view - } - } - return nil -} - -// ViewOf returns a view corresponding to the given URI. -// If the file is not already associated with a view, pick one using some heuristics. -func (s *session) ViewOf(uri span.URI) source.View { - s.viewMu.Lock() - defer s.viewMu.Unlock() - - // Check if we already know this file. - if v, found := s.viewMap[uri]; found { - return v - } - // Pick the best view for this file and memoize the result. - v := s.bestView(uri) - s.viewMap[uri] = v - return v -} - -func (s *session) viewsOf(uri span.URI) []*view { - s.viewMu.Lock() - defer s.viewMu.Unlock() - - var views []*view - for _, view := range s.views { - if strings.HasPrefix(string(uri), string(view.Folder())) { - views = append(views, view) - } - } - return views -} - -func (s *session) Views() []source.View { - s.viewMu.Lock() - defer s.viewMu.Unlock() - result := make([]source.View, len(s.views)) - for i, v := range s.views { - result[i] = v - } - return result -} - -// bestView finds the best view to associate a given URI with. -// viewMu must be held when calling this method. -func (s *session) bestView(uri span.URI) source.View { - // we need to find the best view for this file - var longest source.View - for _, view := range s.views { - if longest != nil && len(longest.Folder()) > len(view.Folder()) { - continue - } - if strings.HasPrefix(string(uri), string(view.Folder())) { - longest = view - } - } - if longest != nil { - return longest - } - // TODO: are there any more heuristics we can use? - return s.views[0] -} - -func (s *session) removeView(ctx context.Context, view *view) error { - s.viewMu.Lock() - defer s.viewMu.Unlock() - // we always need to drop the view map - s.viewMap = make(map[span.URI]source.View) - for i, v := range s.views { - if view == v { - // delete this view... we don't care about order but we do want to make - // sure we can garbage collect the view - s.views[i] = s.views[len(s.views)-1] - s.views[len(s.views)-1] = nil - s.views = s.views[:len(s.views)-1] - v.shutdown(ctx) - return nil - } - } - return errors.Errorf("view %s for %v not found", view.Name(), view.Folder()) -} - -// TODO: Propagate the language ID through to the view. -func (s *session) DidOpen(ctx context.Context, uri span.URI, kind source.FileKind, text []byte) error { - ctx = telemetry.File.With(ctx, uri) - - // Files with _ prefixes are ignored. - if strings.HasPrefix(filepath.Base(uri.Filename()), "_") { - for _, view := range s.views { - view.ignoredURIsMu.Lock() - view.ignoredURIs[uri] = struct{}{} - view.ignoredURIsMu.Unlock() - } - return nil - } - - // Make sure that the file gets added to the session's file watch map. - view := s.bestView(uri) - if _, err := view.GetFile(ctx, uri); err != nil { - return err - } - - // Mark the file as open. - s.openFiles.Store(uri, true) - - // Read the file on disk and compare it to the text provided. - // If it is the same as on disk, we can avoid sending it as an overlay to go/packages. - s.openOverlay(ctx, uri, kind, text) - return nil -} - -func (s *session) DidSave(uri span.URI) { - s.overlayMu.Lock() - defer s.overlayMu.Unlock() - - if overlay, ok := s.overlays[uri]; ok { - overlay.sameContentOnDisk = true - } -} - -func (s *session) DidClose(uri span.URI) { - s.openFiles.Delete(uri) -} - -func (s *session) IsOpen(uri span.URI) bool { - _, open := s.openFiles.Load(uri) - return open -} - -func (s *session) GetFile(uri span.URI, kind source.FileKind) source.FileHandle { - if overlay := s.readOverlay(uri); overlay != nil { - return overlay - } - // Fall back to the cache-level file system. - return s.cache.GetFile(uri, kind) -} - -func (s *session) SetOverlay(uri span.URI, kind source.FileKind, data []byte) bool { - s.overlayMu.Lock() - defer func() { - s.overlayMu.Unlock() - s.filesWatchMap.Notify(uri, protocol.Changed) - }() - - if data == nil { - delete(s.overlays, uri) - return false - } - - o := s.overlays[uri] - firstChange := o != nil && o.unchanged - - s.overlays[uri] = &overlay{ - session: s, - uri: uri, - kind: kind, - data: data, - hash: hashContents(data), - unchanged: o == nil, - } - return firstChange -} - -func (s *session) clearOverlay(uri span.URI) { - s.overlayMu.Lock() - defer s.overlayMu.Unlock() - - delete(s.overlays, uri) -} - -// openOverlay adds the file content to the overlay. -// It also checks if the provided content is equivalent to the file's content on disk. -func (s *session) openOverlay(ctx context.Context, uri span.URI, kind source.FileKind, data []byte) { - s.overlayMu.Lock() - defer func() { - s.overlayMu.Unlock() - s.filesWatchMap.Notify(uri, protocol.Created) - }() - s.overlays[uri] = &overlay{ - session: s, - uri: uri, - kind: kind, - data: data, - hash: hashContents(data), - unchanged: true, - } - // If the file is on disk, check if its content is the same as the overlay. - if _, hash, err := s.cache.GetFile(uri, kind).Read(ctx); err == nil { - if hash == s.overlays[uri].hash { - s.overlays[uri].sameContentOnDisk = true - } - } -} - -func (s *session) readOverlay(uri span.URI) *overlay { - s.overlayMu.Lock() - defer s.overlayMu.Unlock() - - // We might have the content saved in an overlay. - if overlay, ok := s.overlays[uri]; ok { - return overlay - } - return nil -} - -func (s *session) buildOverlay() map[string][]byte { - s.overlayMu.Lock() - defer s.overlayMu.Unlock() - - overlays := make(map[string][]byte) - for uri, overlay := range s.overlays { - if overlay.sameContentOnDisk { - continue - } - overlays[uri.Filename()] = overlay.data - } - return overlays -} - -func (s *session) DidChangeOutOfBand(ctx context.Context, uri span.URI, changeType protocol.FileChangeType) bool { - return s.filesWatchMap.Notify(uri, changeType) -} - -func (o *overlay) FileSystem() source.FileSystem { - return o.session -} - -func (o *overlay) Identity() source.FileIdentity { - return source.FileIdentity{ - URI: o.uri, - Version: o.hash, - Kind: o.kind, - } -} -func (o *overlay) Read(ctx context.Context) ([]byte, string, error) { - return o.data, o.hash, nil -} - -type debugSession struct{ *session } - -func (s debugSession) ID() string { return s.id } -func (s debugSession) Cache() debug.Cache { return debugCache{s.cache} } -func (s debugSession) Files() []*debug.File { - var files []*debug.File - seen := make(map[span.URI]*debug.File) - s.openFiles.Range(func(key interface{}, value interface{}) bool { - uri, ok := key.(span.URI) - if ok { - f := &debug.File{Session: s, URI: uri} - seen[uri] = f - files = append(files, f) - } - return true - }) - s.overlayMu.Lock() - defer s.overlayMu.Unlock() - for _, overlay := range s.overlays { - f, ok := seen[overlay.uri] - if !ok { - f = &debug.File{Session: s, URI: overlay.uri} - seen[overlay.uri] = f - files = append(files, f) - } - f.Data = string(overlay.data) - f.Error = nil - f.Hash = overlay.hash - } - sort.Slice(files, func(i int, j int) bool { - return files[i].URI < files[j].URI - }) - return files -} - -func (s debugSession) File(hash string) *debug.File { - s.overlayMu.Lock() - defer s.overlayMu.Unlock() - for _, overlay := range s.overlays { - if overlay.hash == hash { - return &debug.File{ - Session: s, - URI: overlay.uri, - Data: string(overlay.data), - Error: nil, - Hash: overlay.hash, - } - } - } - return &debug.File{ - Session: s, - Hash: hash, - } -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cache/snapshot.go b/vendor/golang.org/x/tools/internal/lsp/cache/snapshot.go deleted file mode 100644 index f409d73e1..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cache/snapshot.go +++ /dev/null @@ -1,431 +0,0 @@ -package cache - -import ( - "context" - "os" - "sync" - - "golang.org/x/tools/go/analysis" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" -) - -type snapshot struct { - id uint64 - view *view - - mu sync.Mutex - - // ids maps file URIs to package IDs. - // It may be invalidated on calls to go/packages. - ids map[span.URI][]packageID - - // metadata maps file IDs to their associated metadata. - // It may invalidated on calls to go/packages. - metadata map[packageID]*metadata - - // importedBy maps package IDs to the list of packages that import them. - importedBy map[packageID][]packageID - - // files maps file URIs to their corresponding FileHandles. - // It may invalidated when a file's content changes. - files map[span.URI]source.FileHandle - - // packages maps a packageKey to a set of CheckPackageHandles to which that file belongs. - // It may be invalidated when a file's content changes. - packages map[packageKey]*checkPackageHandle - - // actions maps an actionkey to its actionHandle. - actions map[actionKey]*actionHandle -} - -type packageKey struct { - mode source.ParseMode - id packageID -} - -type actionKey struct { - pkg packageKey - analyzer *analysis.Analyzer -} - -func (s *snapshot) View() source.View { - return s.view -} - -func (s *snapshot) getImportedBy(id packageID) []packageID { - s.mu.Lock() - defer s.mu.Unlock() - - // If we haven't rebuilt the import graph since creating the snapshot. - if len(s.importedBy) == 0 { - s.rebuildImportGraph() - } - - return s.importedBy[id] -} - -func (s *snapshot) addPackage(cph *checkPackageHandle) { - s.mu.Lock() - defer s.mu.Unlock() - - // TODO: We should make sure not to compute duplicate CheckPackageHandles, - // and instead panic here. This will be hard to do because we may encounter - // the same package multiple times in the dependency tree. - if _, ok := s.packages[cph.packageKey()]; ok { - return - } - s.packages[cph.packageKey()] = cph -} - -func (s *snapshot) getPackages(uri span.URI, m source.ParseMode) (cphs []source.CheckPackageHandle) { - s.mu.Lock() - defer s.mu.Unlock() - - if ids, ok := s.ids[uri]; ok { - for _, id := range ids { - key := packageKey{ - id: id, - mode: m, - } - cph, ok := s.packages[key] - if ok { - cphs = append(cphs, cph) - } - } - } - return cphs -} - -func (s *snapshot) KnownImportPaths() map[string]source.Package { - s.mu.Lock() - defer s.mu.Unlock() - - results := map[string]source.Package{} - for _, cph := range s.packages { - cachedPkg, err := cph.cached() - if err != nil { - continue - } - for importPath, newPkg := range cachedPkg.imports { - if oldPkg, ok := results[string(importPath)]; ok { - // Using the same trick as NarrowestPackageHandle, prefer non-variants. - if len(newPkg.files) < len(oldPkg.(*pkg).files) { - results[string(importPath)] = newPkg - } - } else { - results[string(importPath)] = newPkg - } - } - } - return results -} - -func (s *snapshot) getPackage(id packageID, m source.ParseMode) *checkPackageHandle { - s.mu.Lock() - defer s.mu.Unlock() - - key := packageKey{ - id: id, - mode: m, - } - return s.packages[key] -} - -func (s *snapshot) getActionHandles(id packageID, m source.ParseMode) []*actionHandle { - s.mu.Lock() - defer s.mu.Unlock() - - var acts []*actionHandle - for k, v := range s.actions { - if k.pkg.id == id && k.pkg.mode == m { - acts = append(acts, v) - } - } - return acts -} - -func (s *snapshot) getAction(id packageID, m source.ParseMode, a *analysis.Analyzer) *actionHandle { - s.mu.Lock() - defer s.mu.Unlock() - - key := actionKey{ - pkg: packageKey{ - id: id, - mode: m, - }, - analyzer: a, - } - return s.actions[key] -} - -func (s *snapshot) addAction(ah *actionHandle) { - s.mu.Lock() - defer s.mu.Unlock() - - key := actionKey{ - analyzer: ah.analyzer, - pkg: packageKey{ - id: ah.pkg.id, - mode: ah.pkg.mode, - }, - } - if _, ok := s.actions[key]; ok { - return - } - s.actions[key] = ah -} - -func (s *snapshot) getMetadataForURI(uri span.URI) (metadata []*metadata) { - s.mu.Lock() - defer s.mu.Unlock() - - for _, id := range s.ids[uri] { - if m, ok := s.metadata[id]; ok { - metadata = append(metadata, m) - } - } - return metadata -} - -func (s *snapshot) setMetadata(m *metadata) { - s.mu.Lock() - defer s.mu.Unlock() - - // TODO: We should make sure not to set duplicate metadata, - // and instead panic here. This can be done by making sure not to - // reset metadata information for packages we've already seen. - if _, ok := s.metadata[m.id]; ok { - return - } - s.metadata[m.id] = m -} - -func (s *snapshot) getMetadata(id packageID) *metadata { - s.mu.Lock() - defer s.mu.Unlock() - - return s.metadata[id] -} - -func (s *snapshot) addID(uri span.URI, id packageID) { - s.mu.Lock() - defer s.mu.Unlock() - - for _, existingID := range s.ids[uri] { - if existingID == id { - // TODO: We should make sure not to set duplicate IDs, - // and instead panic here. This can be done by making sure not to - // reset metadata information for packages we've already seen. - return - } - } - s.ids[uri] = append(s.ids[uri], id) -} - -func (s *snapshot) getIDs(uri span.URI) []packageID { - s.mu.Lock() - defer s.mu.Unlock() - - return s.ids[uri] -} - -func (s *snapshot) getFile(uri span.URI) source.FileHandle { - s.mu.Lock() - defer s.mu.Unlock() - - return s.files[uri] -} - -func (s *snapshot) Handle(ctx context.Context, f source.File) source.FileHandle { - s.mu.Lock() - defer s.mu.Unlock() - - if _, ok := s.files[f.URI()]; !ok { - s.files[f.URI()] = s.view.session.GetFile(f.URI(), f.Kind()) - } - return s.files[f.URI()] -} - -func (s *snapshot) clone(ctx context.Context, withoutURI *span.URI, withoutTypes, withoutMetadata map[span.URI]struct{}) *snapshot { - s.mu.Lock() - defer s.mu.Unlock() - - result := &snapshot{ - id: s.id + 1, - view: s.view, - ids: make(map[span.URI][]packageID), - importedBy: make(map[packageID][]packageID), - metadata: make(map[packageID]*metadata), - packages: make(map[packageKey]*checkPackageHandle), - actions: make(map[actionKey]*actionHandle), - files: make(map[span.URI]source.FileHandle), - } - // Copy all of the FileHandles except for the one that was invalidated. - for k, v := range s.files { - if withoutURI != nil && k == *withoutURI { - continue - } - result.files[k] = v - } - // Collect the IDs for the packages associated with the excluded URIs. - withoutMetadataIDs := make(map[packageID]struct{}) - withoutTypesIDs := make(map[packageID]struct{}) - for k, ids := range s.ids { - // Map URIs to IDs for exclusion. - if withoutTypes != nil { - if _, ok := withoutTypes[k]; ok { - for _, id := range ids { - withoutTypesIDs[id] = struct{}{} - } - } - } - if withoutMetadata != nil { - if _, ok := withoutMetadata[k]; ok { - for _, id := range ids { - withoutMetadataIDs[id] = struct{}{} - } - continue - } - } - result.ids[k] = ids - } - // Copy the package type information. - for k, v := range s.packages { - if _, ok := withoutTypesIDs[k.id]; ok { - continue - } - if _, ok := withoutMetadataIDs[k.id]; ok { - continue - } - result.packages[k] = v - } - // Copy the package analysis information. - for k, v := range s.actions { - if _, ok := withoutTypesIDs[k.pkg.id]; ok { - continue - } - if _, ok := withoutMetadataIDs[k.pkg.id]; ok { - continue - } - result.actions[k] = v - } - // Copy the package metadata. - for k, v := range s.metadata { - if _, ok := withoutMetadataIDs[k]; ok { - continue - } - result.metadata[k] = v - } - // Don't bother copying the importedBy graph, - // as it changes each time we update metadata. - return result -} - -// invalidateContent invalidates the content of a Go file, -// including any position and type information that depends on it. -func (v *view) invalidateContent(ctx context.Context, f source.File, kind source.FileKind, changeType protocol.FileChangeType) bool { - var ( - withoutTypes = make(map[span.URI]struct{}) - withoutMetadata = make(map[span.URI]struct{}) - ids = make(map[packageID]struct{}) - ) - - // This should be the only time we hold the view's snapshot lock for any period of time. - v.snapshotMu.Lock() - defer v.snapshotMu.Unlock() - - for _, id := range v.snapshot.getIDs(f.URI()) { - ids[id] = struct{}{} - } - - switch changeType { - case protocol.Created: - // If this is a file we don't yet know about, - // then we do not yet know what packages it should belong to. - // Make a rough estimate of what metadata to invalidate by finding the package IDs - // of all of the files in the same directory as this one. - // TODO(rstambler): Speed this up by mapping directories to filenames. - if dirStat, err := os.Stat(dir(f.URI().Filename())); err == nil { - for uri := range v.snapshot.files { - if fdirStat, err := os.Stat(dir(uri.Filename())); err == nil { - if os.SameFile(dirStat, fdirStat) { - for _, id := range v.snapshot.ids[uri] { - ids[id] = struct{}{} - } - } - } - } - } - } - - if len(ids) == 0 { - return false - } - - // Remove the package and all of its reverse dependencies from the cache. - for id := range ids { - v.snapshot.reverseDependencies(id, withoutTypes, map[packageID]struct{}{}) - } - - // Get the original FileHandle for the URI, if it exists. - originalFH := v.snapshot.getFile(f.URI()) - - // Make sure to clear out the content if there has been a deletion. - if changeType == protocol.Deleted { - v.session.clearOverlay(f.URI()) - } - - // Get the current FileHandle for the URI. - currentFH := v.session.GetFile(f.URI(), kind) - - // Check if the file's package name or imports have changed, - // and if so, invalidate metadata. - if v.session.cache.shouldLoad(ctx, v.snapshot, originalFH, currentFH) { - withoutMetadata = withoutTypes - - // TODO: If a package's name has changed, - // we should invalidate the metadata for the new package name (if it exists). - } - uri := f.URI() - v.snapshot = v.snapshot.clone(ctx, &uri, withoutTypes, withoutMetadata) - return true -} - -// reverseDependencies populates the uris map with file URIs belonging to the -// provided package and its transitive reverse dependencies. -func (s *snapshot) reverseDependencies(id packageID, uris map[span.URI]struct{}, seen map[packageID]struct{}) { - if _, ok := seen[id]; ok { - return - } - m := s.getMetadata(id) - if m == nil { - return - } - seen[id] = struct{}{} - importedBy := s.getImportedBy(id) - for _, parentID := range importedBy { - s.reverseDependencies(parentID, uris, seen) - } - for _, uri := range m.files { - uris[uri] = struct{}{} - } -} - -func (s *snapshot) clearAndRebuildImportGraph() { - s.mu.Lock() - defer s.mu.Unlock() - - // Completely invalidate the original map. - s.importedBy = make(map[packageID][]packageID) - s.rebuildImportGraph() -} - -func (s *snapshot) rebuildImportGraph() { - for id, m := range s.metadata { - for _, importID := range m.deps { - s.importedBy[importID] = append(s.importedBy[importID], id) - } - } -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cache/view.go b/vendor/golang.org/x/tools/internal/lsp/cache/view.go deleted file mode 100644 index ae3c9a5e2..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cache/view.go +++ /dev/null @@ -1,448 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package cache implements the caching layer for gopls. -package cache - -import ( - "context" - "fmt" - "go/ast" - "go/token" - "os" - "os/exec" - "strings" - "sync" - "time" - - "golang.org/x/tools/go/packages" - "golang.org/x/tools/internal/imports" - "golang.org/x/tools/internal/lsp/debug" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/telemetry/log" - "golang.org/x/tools/internal/telemetry/tag" - "golang.org/x/tools/internal/xcontext" - errors "golang.org/x/xerrors" -) - -type view struct { - session *session - id string - - options source.Options - - // mu protects all mutable state of the view. - mu sync.Mutex - - // baseCtx is the context handed to NewView. This is the parent of all - // background contexts created for this view. - baseCtx context.Context - - // backgroundCtx is the current context used by background tasks initiated - // by the view. - backgroundCtx context.Context - - // cancel is called when all action being performed by the current view - // should be stopped. - cancel context.CancelFunc - - // Name is the user visible name of this view. - name string - - // Folder is the root of this view. - folder span.URI - - // process is the process env for this view. - // Note: this contains cached module and filesystem state. - // - // TODO(suzmue): the state cached in the process env is specific to each view, - // however, there is state that can be shared between views that is not currently - // cached, like the module cache. - processEnv *imports.ProcessEnv - cacheRefreshTime time.Time - - // modFileVersions stores the last seen versions of the module files that are used - // by processEnvs resolver. - // TODO(suzmue): These versions may not actually be on disk. - modFileVersions map[string]string - - // keep track of files by uri and by basename, a single file may be mapped - // to multiple uris, and the same basename may map to multiple files - filesByURI map[span.URI]viewFile - filesByBase map[string][]viewFile - - snapshotMu sync.Mutex - snapshot *snapshot - - // builtin is used to resolve builtin types. - builtin *builtinPkg - - // ignoredURIs is the set of URIs of files that we ignore. - ignoredURIsMu sync.Mutex - ignoredURIs map[span.URI]struct{} -} - -func (v *view) Session() source.Session { - return v.session -} - -// Name returns the user visible name of this view. -func (v *view) Name() string { - return v.name -} - -// Folder returns the root of this view. -func (v *view) Folder() span.URI { - return v.folder -} - -func (v *view) Options() source.Options { - return v.options -} - -func (v *view) SetOptions(options source.Options) { - v.options = options -} - -// Config returns the configuration used for the view's interaction with the -// go/packages API. It is shared across all views. -func (v *view) Config(ctx context.Context) *packages.Config { - // TODO: Should we cache the config and/or overlay somewhere? - return &packages.Config{ - Dir: v.folder.Filename(), - Context: ctx, - Env: v.options.Env, - BuildFlags: v.options.BuildFlags, - Mode: packages.NeedName | - packages.NeedFiles | - packages.NeedCompiledGoFiles | - packages.NeedImports | - packages.NeedDeps | - packages.NeedTypesSizes, - Fset: v.session.cache.fset, - Overlay: v.session.buildOverlay(), - ParseFile: func(*token.FileSet, string, []byte) (*ast.File, error) { - panic("go/packages must not be used to parse files") - }, - Logf: func(format string, args ...interface{}) { - log.Print(ctx, fmt.Sprintf(format, args...)) - }, - Tests: true, - } -} - -func (v *view) RunProcessEnvFunc(ctx context.Context, fn func(*imports.Options) error, opts *imports.Options) error { - v.mu.Lock() - defer v.mu.Unlock() - if v.processEnv == nil { - var err error - if v.processEnv, err = v.buildProcessEnv(ctx); err != nil { - return err - } - } - - // Before running the user provided function, clear caches in the resolver. - if v.modFilesChanged() { - v.processEnv.GetResolver().(*imports.ModuleResolver).ClearForNewMod() - } - - // Run the user function. - opts.Env = v.processEnv - if err := fn(opts); err != nil { - return err - } - if v.cacheRefreshTime.IsZero() { - v.cacheRefreshTime = time.Now() - } - - // If applicable, store the file versions of the 'go.mod' files that are - // looked at by the resolver. - v.storeModFileVersions() - - if time.Since(v.cacheRefreshTime) > 30*time.Second { - go func() { - v.mu.Lock() - defer v.mu.Unlock() - - log.Print(context.Background(), "background imports cache refresh starting") - v.processEnv.GetResolver().ClearForNewScan() - _, err := imports.GetAllCandidates("", opts) - v.cacheRefreshTime = time.Now() - log.Print(context.Background(), "background refresh finished with err: ", tag.Of("err", err)) - }() - } - - return nil -} - -func (v *view) buildProcessEnv(ctx context.Context) (*imports.ProcessEnv, error) { - cfg := v.Config(ctx) - env := &imports.ProcessEnv{ - WorkingDir: cfg.Dir, - Logf: func(format string, args ...interface{}) { - log.Print(ctx, fmt.Sprintf(format, args...)) - }, - LocalPrefix: v.options.LocalPrefix, - Debug: true, - } - for _, kv := range cfg.Env { - split := strings.Split(kv, "=") - if len(split) < 2 { - continue - } - switch split[0] { - case "GOPATH": - env.GOPATH = split[1] - case "GOROOT": - env.GOROOT = split[1] - case "GO111MODULE": - env.GO111MODULE = split[1] - case "GOPROXY": - env.GOPROXY = split[1] - case "GOFLAGS": - env.GOFLAGS = split[1] - case "GOSUMDB": - env.GOSUMDB = split[1] - } - } - - if env.GOPATH == "" { - cmd := exec.CommandContext(ctx, "go", "env", "GOPATH") - cmd.Env = cfg.Env - if out, err := cmd.CombinedOutput(); err != nil { - return nil, err - } else { - env.GOPATH = strings.TrimSpace(string(out)) - } - } - return env, nil -} - -func (v *view) modFilesChanged() bool { - // Check the versions of the 'go.mod' files of the main module - // and modules included by a replace directive. Return true if - // any of these file versions do not match. - for filename, version := range v.modFileVersions { - if version != v.fileVersion(filename, source.Mod) { - return true - } - } - return false -} - -func (v *view) storeModFileVersions() { - // Store the mod files versions, if we are using a ModuleResolver. - r, moduleMode := v.processEnv.GetResolver().(*imports.ModuleResolver) - if !moduleMode || !r.Initialized { - return - } - v.modFileVersions = make(map[string]string) - - // Get the file versions of the 'go.mod' files of the main module - // and modules included by a replace directive in the resolver. - for _, mod := range r.ModsByModPath { - if (mod.Main || mod.Replace != nil) && mod.GoMod != "" { - v.modFileVersions[mod.GoMod] = v.fileVersion(mod.GoMod, source.Mod) - } - } -} - -func (v *view) fileVersion(filename string, kind source.FileKind) string { - uri := span.FileURI(filename) - f := v.session.GetFile(uri, kind) - return f.Identity().Version -} - -func (v *view) Shutdown(ctx context.Context) { - v.session.removeView(ctx, v) -} - -func (v *view) shutdown(context.Context) { - v.mu.Lock() - defer v.mu.Unlock() - if v.cancel != nil { - v.cancel() - v.cancel = nil - } - debug.DropView(debugView{v}) -} - -// Ignore checks if the given URI is a URI we ignore. -// As of right now, we only ignore files in the "builtin" package. -func (v *view) Ignore(uri span.URI) bool { - v.ignoredURIsMu.Lock() - defer v.ignoredURIsMu.Unlock() - - _, ok := v.ignoredURIs[uri] - return ok -} - -func (v *view) findIgnoredFile(ctx context.Context, uri span.URI) (source.ParseGoHandle, source.Package, error) { - // Check the builtin package. - for _, h := range v.BuiltinPackage().Files() { - if h.File().Identity().URI == uri { - return h, nil, nil - } - } - return nil, nil, errors.Errorf("no ignored file for %s", uri) -} - -func (v *view) BackgroundContext() context.Context { - v.mu.Lock() - defer v.mu.Unlock() - - return v.backgroundCtx -} - -func (v *view) BuiltinPackage() source.BuiltinPackage { - return v.builtin -} - -func (v *view) Snapshot() source.Snapshot { - return v.getSnapshot() -} - -func (v *view) getSnapshot() *snapshot { - v.snapshotMu.Lock() - defer v.snapshotMu.Unlock() - - return v.snapshot -} - -// SetContent sets the overlay contents for a file. -func (v *view) SetContent(ctx context.Context, uri span.URI, content []byte) (bool, error) { - v.mu.Lock() - defer v.mu.Unlock() - - // Cancel all still-running previous requests, since they would be - // operating on stale data. - v.cancel() - v.backgroundCtx, v.cancel = context.WithCancel(v.baseCtx) - - if v.Ignore(uri) { - return false, nil - } - - kind := source.DetectLanguage("", uri.Filename()) - return v.session.SetOverlay(uri, kind, content), nil -} - -// FindFile returns the file if the given URI is already a part of the view. -func (v *view) FindFile(ctx context.Context, uri span.URI) source.File { - v.mu.Lock() - defer v.mu.Unlock() - f, err := v.findFile(uri) - if err != nil { - return nil - } - return f -} - -// GetFile returns a File for the given URI. It will always succeed because it -// adds the file to the managed set if needed. -func (v *view) GetFile(ctx context.Context, uri span.URI) (source.File, error) { - v.mu.Lock() - defer v.mu.Unlock() - - // TODO(rstambler): Should there be a version that provides a kind explicitly? - kind := source.DetectLanguage("", uri.Filename()) - return v.getFile(ctx, uri, kind) -} - -// getFile is the unlocked internal implementation of GetFile. -func (v *view) getFile(ctx context.Context, uri span.URI, kind source.FileKind) (viewFile, error) { - f, err := v.findFile(uri) - if err != nil { - return nil, err - } else if f != nil { - return f, nil - } - f = &fileBase{ - view: v, - fname: uri.Filename(), - kind: source.Go, - } - v.session.filesWatchMap.Watch(uri, func(changeType protocol.FileChangeType) bool { - ctx := xcontext.Detach(ctx) - return v.invalidateContent(ctx, f, kind, changeType) - }) - v.mapFile(uri, f) - return f, nil -} - -// findFile checks the cache for any file matching the given uri. -// -// An error is only returned for an irreparable failure, for example, if the -// filename in question does not exist. -func (v *view) findFile(uri span.URI) (viewFile, error) { - if f := v.filesByURI[uri]; f != nil { - // a perfect match - return f, nil - } - // no exact match stored, time to do some real work - // check for any files with the same basename - fname := uri.Filename() - basename := basename(fname) - if candidates := v.filesByBase[basename]; candidates != nil { - pathStat, err := os.Stat(fname) - if os.IsNotExist(err) { - return nil, err - } - if err != nil { - return nil, nil // the file may exist, return without an error - } - for _, c := range candidates { - if cStat, err := os.Stat(c.filename()); err == nil { - if os.SameFile(pathStat, cStat) { - // same file, map it - v.mapFile(uri, c) - return c, nil - } - } - } - } - // no file with a matching name was found, it wasn't in our cache - return nil, nil -} - -func (f *fileBase) addURI(uri span.URI) int { - f.uris = append(f.uris, uri) - return len(f.uris) -} - -func (v *view) mapFile(uri span.URI, f viewFile) { - v.filesByURI[uri] = f - if f.addURI(uri) == 1 { - basename := basename(f.filename()) - v.filesByBase[basename] = append(v.filesByBase[basename], f) - } -} - -func (v *view) openFiles(ctx context.Context, uris []span.URI) (results []source.File) { - v.mu.Lock() - defer v.mu.Unlock() - - for _, uri := range uris { - // Call unlocked version of getFile since we hold the lock on the view. - if f, err := v.getFile(ctx, uri, source.Go); err == nil && v.session.IsOpen(uri) { - results = append(results, f) - } - } - return results -} - -func (v *view) FindFileInPackage(ctx context.Context, uri span.URI, pkg source.Package) (source.ParseGoHandle, source.Package, error) { - // Special case for ignored files. - if v.Ignore(uri) { - return v.findIgnoredFile(ctx, uri) - } - return findFileInPackage(ctx, uri, pkg) -} - -type debugView struct{ *view } - -func (v debugView) ID() string { return v.id } -func (v debugView) Session() debug.Session { return debugSession{v.session} } diff --git a/vendor/golang.org/x/tools/internal/lsp/cache/watcher.go b/vendor/golang.org/x/tools/internal/lsp/cache/watcher.go deleted file mode 100644 index 53fe4dc80..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cache/watcher.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cache - -import ( - "sync" - - "golang.org/x/tools/internal/lsp/protocol" -) - -type watcher struct { - id uint64 - callback func(changeType protocol.FileChangeType) bool -} - -type WatchMap struct { - mu sync.Mutex - nextID uint64 - watchers map[interface{}][]watcher -} - -func NewWatchMap() *WatchMap { - return &WatchMap{watchers: make(map[interface{}][]watcher)} -} -func (w *WatchMap) Watch(key interface{}, callback func(protocol.FileChangeType) bool) func() { - w.mu.Lock() - defer w.mu.Unlock() - id := w.nextID - w.nextID++ - w.watchers[key] = append(w.watchers[key], watcher{ - id: id, - callback: callback, - }) - return func() { - // unwatch if invoked - w.mu.Lock() - defer w.mu.Unlock() - // find and delete the watcher entry - entries := w.watchers[key] - for i, entry := range entries { - if entry.id == id { - // found it - entries[i] = entries[len(entries)-1] - entries = entries[:len(entries)-1] - } - } - } -} - -func (w *WatchMap) Notify(key interface{}, changeType protocol.FileChangeType) bool { - // Make a copy of the watcher callbacks so we don't need to hold - // the mutex during the callbacks (to avoid deadlocks). - w.mu.Lock() - entries := w.watchers[key] - entriesCopy := make([]watcher, len(entries)) - copy(entriesCopy, entries) - w.mu.Unlock() - - var result bool - for _, entry := range entriesCopy { - result = entry.callback(changeType) || result - } - return result -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cmd/check.go b/vendor/golang.org/x/tools/internal/lsp/cmd/check.go deleted file mode 100644 index f7786648b..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cmd/check.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cmd - -import ( - "context" - "flag" - "fmt" - "time" - - "golang.org/x/tools/internal/span" - errors "golang.org/x/xerrors" -) - -// check implements the check verb for gopls. -type check struct { - app *Application -} - -func (c *check) Name() string { return "check" } -func (c *check) Usage() string { return "" } -func (c *check) ShortHelp() string { return "show diagnostic results for the specified file" } -func (c *check) DetailedHelp(f *flag.FlagSet) { - fmt.Fprint(f.Output(), ` -Example: show the diagnostic results of this file: - - $ gopls check internal/lsp/cmd/check.go - - gopls check flags are: -`) - f.PrintDefaults() -} - -// Run performs the check on the files specified by args and prints the -// results to stdout. -func (c *check) Run(ctx context.Context, args ...string) error { - if len(args) == 0 { - // no files, so no results - return nil - } - checking := map[span.URI]*cmdFile{} - // now we ready to kick things off - conn, err := c.app.connect(ctx) - if err != nil { - return err - } - defer conn.terminate(ctx) - for _, arg := range args { - uri := span.FileURI(arg) - file := conn.AddFile(ctx, uri) - if file.err != nil { - return file.err - } - checking[uri] = file - } - // now wait for results - //TODO: maybe conn.ExecuteCommand(ctx, &protocol.ExecuteCommandParams{Command: "gopls-wait-idle"}) - for _, file := range checking { - select { - case <-file.hasDiagnostics: - case <-time.After(30 * time.Second): - return errors.Errorf("timed out waiting for results from %v", file.uri) - } - file.diagnosticsMu.Lock() - defer file.diagnosticsMu.Unlock() - for _, d := range file.diagnostics { - spn, err := file.mapper.RangeSpan(d.Range) - if err != nil { - return errors.Errorf("Could not convert position %v for %q", d.Range, d.Message) - } - fmt.Printf("%v: %v\n", spn, d.Message) - } - } - return nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cmd/cmd.go b/vendor/golang.org/x/tools/internal/lsp/cmd/cmd.go deleted file mode 100644 index c320a5efb..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cmd/cmd.go +++ /dev/null @@ -1,404 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package cmd handles the gopls command line. -// It contains a handler for each of the modes, along with all the flag handling -// and the command line output format. -package cmd - -import ( - "context" - "flag" - "fmt" - "go/token" - "io/ioutil" - "log" - "net" - "os" - "strings" - "sync" - - "golang.org/x/tools/internal/jsonrpc2" - "golang.org/x/tools/internal/lsp" - "golang.org/x/tools/internal/lsp/cache" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/telemetry/export" - "golang.org/x/tools/internal/telemetry/export/ocagent" - "golang.org/x/tools/internal/tool" - "golang.org/x/tools/internal/xcontext" - errors "golang.org/x/xerrors" -) - -// Application is the main application as passed to tool.Main -// It handles the main command line parsing and dispatch to the sub commands. -type Application struct { - // Core application flags - - // Embed the basic profiling flags supported by the tool package - tool.Profile - - // We include the server configuration directly for now, so the flags work - // even without the verb. - // TODO: Remove this when we stop allowing the serve verb by default. - Serve Serve - - // The base cache to use for sessions from this application. - cache source.Cache - - // The name of the binary, used in help and telemetry. - name string - - // The working directory to run commands in. - wd string - - // The environment variables to use. - env []string - - // Support for remote lsp server - Remote string `flag:"remote" help:"*EXPERIMENTAL* - forward all commands to a remote lsp"` - - // Enable verbose logging - Verbose bool `flag:"v" help:"Verbose output"` - - // Control ocagent export of telemetry - OCAgent string `flag:"ocagent" help:"The address of the ocagent, or off"` - - // PrepareOptions is called to update the options when a new view is built. - // It is primarily to allow the behavior of gopls to be modified by hooks. - PrepareOptions func(*source.Options) -} - -// Returns a new Application ready to run. -func New(name, wd string, env []string, options func(*source.Options)) *Application { - if wd == "" { - wd, _ = os.Getwd() - } - app := &Application{ - cache: cache.New(options), - name: name, - wd: wd, - env: env, - OCAgent: "off", //TODO: Remove this line to default the exporter to on - } - return app -} - -// Name implements tool.Application returning the binary name. -func (app *Application) Name() string { return app.name } - -// Usage implements tool.Application returning empty extra argument usage. -func (app *Application) Usage() string { return " [command-flags] [command-args]" } - -// ShortHelp implements tool.Application returning the main binary help. -func (app *Application) ShortHelp() string { - return "The Go Language source tools." -} - -// DetailedHelp implements tool.Application returning the main binary help. -// This includes the short help for all the sub commands. -func (app *Application) DetailedHelp(f *flag.FlagSet) { - fmt.Fprint(f.Output(), ` -Available commands are: -`) - for _, c := range app.commands() { - fmt.Fprintf(f.Output(), " %s : %v\n", c.Name(), c.ShortHelp()) - } - fmt.Fprint(f.Output(), ` -gopls flags are: -`) - f.PrintDefaults() -} - -// Run takes the args after top level flag processing, and invokes the correct -// sub command as specified by the first argument. -// If no arguments are passed it will invoke the server sub command, as a -// temporary measure for compatibility. -func (app *Application) Run(ctx context.Context, args ...string) error { - ocConfig := ocagent.Discover() - //TODO: we should not need to adjust the discovered configuration - ocConfig.Address = app.OCAgent - export.AddExporters(ocagent.Connect(ocConfig)) - app.Serve.app = app - if len(args) == 0 { - return tool.Run(ctx, &app.Serve, args) - } - command, args := args[0], args[1:] - for _, c := range app.commands() { - if c.Name() == command { - return tool.Run(ctx, c, args) - } - } - return tool.CommandLineErrorf("Unknown command %v", command) -} - -// commands returns the set of commands supported by the gopls tool on the -// command line. -// The command is specified by the first non flag argument. -func (app *Application) commands() []tool.Application { - return []tool.Application{ - &app.Serve, - &bug{}, - &check{app: app}, - &format{app: app}, - &links{app: app}, - &imports{app: app}, - &query{app: app}, - &references{app: app}, - &rename{app: app}, - &signature{app: app}, - &suggestedfix{app: app}, - &symbols{app: app}, - &version{app: app}, - } -} - -var ( - internalMu sync.Mutex - internalConnections = make(map[string]*connection) -) - -func (app *Application) connect(ctx context.Context) (*connection, error) { - switch app.Remote { - case "": - connection := newConnection(app) - ctx, connection.Server = lsp.NewClientServer(ctx, app.cache, connection.Client) - return connection, connection.initialize(ctx) - case "internal": - internalMu.Lock() - defer internalMu.Unlock() - if c := internalConnections[app.wd]; c != nil { - return c, nil - } - connection := newConnection(app) - ctx := xcontext.Detach(ctx) //TODO:a way of shutting down the internal server - cr, sw, _ := os.Pipe() - sr, cw, _ := os.Pipe() - var jc *jsonrpc2.Conn - ctx, jc, connection.Server = protocol.NewClient(ctx, jsonrpc2.NewHeaderStream(cr, cw), connection.Client) - go jc.Run(ctx) - go func() { - ctx, srv := lsp.NewServer(ctx, app.cache, jsonrpc2.NewHeaderStream(sr, sw)) - srv.Run(ctx) - }() - if err := connection.initialize(ctx); err != nil { - return nil, err - } - internalConnections[app.wd] = connection - return connection, nil - default: - connection := newConnection(app) - conn, err := net.Dial("tcp", app.Remote) - if err != nil { - return nil, err - } - stream := jsonrpc2.NewHeaderStream(conn, conn) - var jc *jsonrpc2.Conn - ctx, jc, connection.Server = protocol.NewClient(ctx, stream, connection.Client) - go jc.Run(ctx) - return connection, connection.initialize(ctx) - } -} - -func (c *connection) initialize(ctx context.Context) error { - params := &protocol.ParamInitia{} - params.RootURI = string(span.FileURI(c.Client.app.wd)) - params.Capabilities.Workspace.Configuration = true - params.Capabilities.TextDocument.Hover = &protocol.HoverClientCapabilities{ - ContentFormat: []protocol.MarkupKind{protocol.PlainText}, - } - if _, err := c.Server.Initialize(ctx, params); err != nil { - return err - } - if err := c.Server.Initialized(ctx, &protocol.InitializedParams{}); err != nil { - return err - } - return nil -} - -type connection struct { - protocol.Server - Client *cmdClient -} - -type cmdClient struct { - protocol.Server - app *Application - fset *token.FileSet - - filesMu sync.Mutex - files map[span.URI]*cmdFile -} - -type cmdFile struct { - uri span.URI - mapper *protocol.ColumnMapper - err error - added bool - hasDiagnostics chan struct{} - diagnosticsMu sync.Mutex - diagnostics []protocol.Diagnostic -} - -func newConnection(app *Application) *connection { - return &connection{ - Client: &cmdClient{ - app: app, - fset: token.NewFileSet(), - files: make(map[span.URI]*cmdFile), - }, - } -} - -func (c *cmdClient) ShowMessage(ctx context.Context, p *protocol.ShowMessageParams) error { return nil } - -func (c *cmdClient) ShowMessageRequest(ctx context.Context, p *protocol.ShowMessageRequestParams) (*protocol.MessageActionItem, error) { - return nil, nil -} - -func (c *cmdClient) LogMessage(ctx context.Context, p *protocol.LogMessageParams) error { - switch p.Type { - case protocol.Error: - log.Print("Error:", p.Message) - case protocol.Warning: - log.Print("Warning:", p.Message) - case protocol.Info: - if c.app.Verbose { - log.Print("Info:", p.Message) - } - case protocol.Log: - if c.app.Verbose { - log.Print("Log:", p.Message) - } - default: - if c.app.Verbose { - log.Print(p.Message) - } - } - return nil -} - -func (c *cmdClient) Event(ctx context.Context, t *interface{}) error { return nil } - -func (c *cmdClient) RegisterCapability(ctx context.Context, p *protocol.RegistrationParams) error { - return nil -} - -func (c *cmdClient) UnregisterCapability(ctx context.Context, p *protocol.UnregistrationParams) error { - return nil -} - -func (c *cmdClient) WorkspaceFolders(ctx context.Context) ([]protocol.WorkspaceFolder, error) { - return nil, nil -} - -func (c *cmdClient) Configuration(ctx context.Context, p *protocol.ParamConfig) ([]interface{}, error) { - results := make([]interface{}, len(p.Items)) - for i, item := range p.Items { - if item.Section != "gopls" { - continue - } - env := map[string]interface{}{} - for _, value := range c.app.env { - l := strings.SplitN(value, "=", 2) - if len(l) != 2 { - continue - } - env[l[0]] = l[1] - } - results[i] = map[string]interface{}{ - "env": env, - "go-diff": true, - } - } - return results, nil -} - -func (c *cmdClient) ApplyEdit(ctx context.Context, p *protocol.ApplyWorkspaceEditParams) (*protocol.ApplyWorkspaceEditResponse, error) { - return &protocol.ApplyWorkspaceEditResponse{Applied: false, FailureReason: "not implemented"}, nil -} - -func (c *cmdClient) PublishDiagnostics(ctx context.Context, p *protocol.PublishDiagnosticsParams) error { - c.filesMu.Lock() - defer c.filesMu.Unlock() - uri := span.URI(p.URI) - file := c.getFile(ctx, uri) - file.diagnosticsMu.Lock() - defer file.diagnosticsMu.Unlock() - hadDiagnostics := file.diagnostics != nil - file.diagnostics = p.Diagnostics - if file.diagnostics == nil { - file.diagnostics = []protocol.Diagnostic{} - } - if !hadDiagnostics { - close(file.hasDiagnostics) - } - return nil -} - -func (c *cmdClient) getFile(ctx context.Context, uri span.URI) *cmdFile { - file, found := c.files[uri] - if !found || file.err != nil { - file = &cmdFile{ - uri: uri, - hasDiagnostics: make(chan struct{}), - } - c.files[uri] = file - } - if file.mapper == nil { - fname := uri.Filename() - content, err := ioutil.ReadFile(fname) - if err != nil { - file.err = errors.Errorf("getFile: %v: %v", uri, err) - return file - } - f := c.fset.AddFile(fname, -1, len(content)) - f.SetLinesForContent(content) - converter := span.NewContentConverter(fname, content) - file.mapper = &protocol.ColumnMapper{ - URI: uri, - Converter: converter, - Content: content, - } - } - return file -} - -func (c *connection) AddFile(ctx context.Context, uri span.URI) *cmdFile { - c.Client.filesMu.Lock() - defer c.Client.filesMu.Unlock() - - file := c.Client.getFile(ctx, uri) - // This should never happen. - if file == nil { - return &cmdFile{ - uri: uri, - err: fmt.Errorf("no file found for %s", uri), - } - } - if file.err != nil || file.added { - return file - } - file.added = true - p := &protocol.DidOpenTextDocumentParams{} - p.TextDocument.URI = string(uri) - p.TextDocument.Text = string(file.mapper.Content) - p.TextDocument.LanguageID = source.DetectLanguage("", file.uri.Filename()).String() - if err := c.Server.DidOpen(ctx, p); err != nil { - file.err = errors.Errorf("%v: %v", uri, err) - } - return file -} - -func (c *connection) terminate(ctx context.Context) { - if c.Client.app.Remote == "internal" { - // internal connections need to be left alive for the next test - return - } - //TODO: do we need to handle errors on these calls? - c.Shutdown(ctx) - //TODO: right now calling exit terminates the process, we should rethink that - //server.Exit(ctx) -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cmd/definition.go b/vendor/golang.org/x/tools/internal/lsp/cmd/definition.go deleted file mode 100644 index c804aeca6..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cmd/definition.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cmd - -import ( - "context" - "encoding/json" - "flag" - "fmt" - "os" - "strings" - - guru "golang.org/x/tools/cmd/guru/serial" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/tool" - errors "golang.org/x/xerrors" -) - -// A Definition is the result of a 'definition' query. -type Definition struct { - Span span.Span `json:"span"` // span of the definition - Description string `json:"description"` // description of the denoted object -} - -// These constant is printed in the help, and then used in a test to verify the -// help is still valid. -// They refer to "Set" in "flag.FlagSet" from the DetailedHelp method below. -const ( - exampleLine = 44 - exampleColumn = 47 - exampleOffset = 1270 -) - -// definition implements the definition noun for the query command. -type definition struct { - query *query -} - -func (d *definition) Name() string { return "definition" } -func (d *definition) Usage() string { return "" } -func (d *definition) ShortHelp() string { return "show declaration of selected identifier" } -func (d *definition) DetailedHelp(f *flag.FlagSet) { - fmt.Fprintf(f.Output(), ` -Example: show the definition of the identifier at syntax at offset %[1]v in this file (flag.FlagSet): - -$ gopls definition internal/lsp/cmd/definition.go:%[1]v:%[2]v -$ gopls definition internal/lsp/cmd/definition.go:#%[3]v - - gopls query definition flags are: -`, exampleLine, exampleColumn, exampleOffset) - f.PrintDefaults() -} - -// Run performs the definition query as specified by args and prints the -// results to stdout. -func (d *definition) Run(ctx context.Context, args ...string) error { - if len(args) != 1 { - return tool.CommandLineErrorf("definition expects 1 argument") - } - conn, err := d.query.app.connect(ctx) - if err != nil { - return err - } - defer conn.terminate(ctx) - from := span.Parse(args[0]) - file := conn.AddFile(ctx, from.URI()) - if file.err != nil { - return file.err - } - loc, err := file.mapper.Location(from) - if err != nil { - return err - } - tdpp := protocol.TextDocumentPositionParams{ - TextDocument: protocol.TextDocumentIdentifier{URI: loc.URI}, - Position: loc.Range.Start, - } - p := protocol.DefinitionParams{ - TextDocumentPositionParams: tdpp, - } - locs, err := conn.Definition(ctx, &p) - if err != nil { - return errors.Errorf("%v: %v", from, err) - } - - if len(locs) == 0 { - return errors.Errorf("%v: not an identifier", from) - } - q := protocol.HoverParams{ - TextDocumentPositionParams: tdpp, - } - hover, err := conn.Hover(ctx, &q) - if err != nil { - return errors.Errorf("%v: %v", from, err) - } - if hover == nil { - return errors.Errorf("%v: not an identifier", from) - } - file = conn.AddFile(ctx, span.NewURI(locs[0].URI)) - if file.err != nil { - return errors.Errorf("%v: %v", from, file.err) - } - definition, err := file.mapper.Span(locs[0]) - if err != nil { - return errors.Errorf("%v: %v", from, err) - } - description := strings.TrimSpace(hover.Contents.Value) - var result interface{} - switch d.query.Emulate { - case "": - result = &Definition{ - Span: definition, - Description: description, - } - case emulateGuru: - pos := span.New(definition.URI(), definition.Start(), definition.Start()) - result = &guru.Definition{ - ObjPos: fmt.Sprint(pos), - Desc: description, - } - default: - return errors.Errorf("unknown emulation for definition: %s", d.query.Emulate) - } - if err != nil { - return err - } - if d.query.JSON { - enc := json.NewEncoder(os.Stdout) - enc.SetIndent("", "\t") - return enc.Encode(result) - } - switch d := result.(type) { - case *Definition: - fmt.Printf("%v: defined here as %s", d.Span, d.Description) - case *guru.Definition: - fmt.Printf("%s: defined here as %s", d.ObjPos, d.Desc) - default: - return errors.Errorf("no printer for type %T", result) - } - return nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cmd/format.go b/vendor/golang.org/x/tools/internal/lsp/cmd/format.go deleted file mode 100644 index d1ecf5696..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cmd/format.go +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cmd - -import ( - "context" - "flag" - "fmt" - "io/ioutil" - - "golang.org/x/tools/internal/lsp/diff" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" - errors "golang.org/x/xerrors" -) - -// format implements the format verb for gopls. -type format struct { - Diff bool `flag:"d" help:"display diffs instead of rewriting files"` - Write bool `flag:"w" help:"write result to (source) file instead of stdout"` - List bool `flag:"l" help:"list files whose formatting differs from gofmt's"` - - app *Application -} - -func (c *format) Name() string { return "format" } -func (c *format) Usage() string { return "" } -func (c *format) ShortHelp() string { return "format the code according to the go standard" } -func (c *format) DetailedHelp(f *flag.FlagSet) { - fmt.Fprint(f.Output(), ` -The arguments supplied may be simple file names, or ranges within files. - -Example: reformat this file: - - $ gopls format -w internal/lsp/cmd/check.go - - gopls format flags are: -`) - f.PrintDefaults() -} - -// Run performs the check on the files specified by args and prints the -// results to stdout. -func (c *format) Run(ctx context.Context, args ...string) error { - if len(args) == 0 { - // no files, so no results - return nil - } - // now we ready to kick things off - conn, err := c.app.connect(ctx) - if err != nil { - return err - } - defer conn.terminate(ctx) - for _, arg := range args { - spn := span.Parse(arg) - file := conn.AddFile(ctx, spn.URI()) - if file.err != nil { - return file.err - } - filename := spn.URI().Filename() - loc, err := file.mapper.Location(spn) - if err != nil { - return err - } - if loc.Range.Start != loc.Range.End { - return errors.Errorf("only full file formatting supported") - } - p := protocol.DocumentFormattingParams{ - TextDocument: protocol.TextDocumentIdentifier{URI: loc.URI}, - } - edits, err := conn.Formatting(ctx, &p) - if err != nil { - return errors.Errorf("%v: %v", spn, err) - } - sedits, err := source.FromProtocolEdits(file.mapper, edits) - if err != nil { - return errors.Errorf("%v: %v", spn, err) - } - formatted := diff.ApplyEdits(string(file.mapper.Content), sedits) - printIt := true - if c.List { - printIt = false - if len(edits) > 0 { - fmt.Println(filename) - } - } - if c.Write { - printIt = false - if len(edits) > 0 { - ioutil.WriteFile(filename, []byte(formatted), 0644) - } - } - if c.Diff { - printIt = false - u := diff.ToUnified(filename+".orig", filename, string(file.mapper.Content), sedits) - fmt.Print(u) - } - if printIt { - fmt.Print(formatted) - } - } - return nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cmd/imports.go b/vendor/golang.org/x/tools/internal/lsp/cmd/imports.go deleted file mode 100644 index 19531df41..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cmd/imports.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cmd - -import ( - "context" - "flag" - "fmt" - "io/ioutil" - - "golang.org/x/tools/internal/lsp/diff" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/tool" - errors "golang.org/x/xerrors" -) - -// imports implements the import verb for gopls. -type imports struct { - Diff bool `flag:"d" help:"display diffs instead of rewriting files"` - Write bool `flag:"w" help:"write result to (source) file instead of stdout"` - - app *Application -} - -func (t *imports) Name() string { return "imports" } -func (t *imports) Usage() string { return "" } -func (t *imports) ShortHelp() string { return "updates import statements" } -func (t *imports) DetailedHelp(f *flag.FlagSet) { - fmt.Fprintf(f.Output(), ` -Example: update imports statements in a file: - -  $ gopls imports -w internal/lsp/cmd/check.go - -gopls imports flags are: -`) - f.PrintDefaults() -} - -// Run performs diagnostic checks on the file specified and either; -// - if -w is specified, updates the file in place; -// - if -d is specified, prints out unified diffs of the changes; or -// - otherwise, prints the new versions to stdout. -func (t *imports) Run(ctx context.Context, args ...string) error { - if len(args) != 1 { - return tool.CommandLineErrorf("imports expects 1 argument") - } - conn, err := t.app.connect(ctx) - if err != nil { - return err - } - defer conn.terminate(ctx) - - from := span.Parse(args[0]) - uri := from.URI() - file := conn.AddFile(ctx, uri) - if file.err != nil { - return file.err - } - actions, err := conn.CodeAction(ctx, &protocol.CodeActionParams{ - TextDocument: protocol.TextDocumentIdentifier{ - URI: protocol.NewURI(uri), - }, - }) - if err != nil { - return errors.Errorf("%v: %v", from, err) - } - var edits []protocol.TextEdit - for _, a := range actions { - if a.Title == "Organize Imports" { - edits = (*a.Edit.Changes)[string(uri)] - } - } - sedits, err := source.FromProtocolEdits(file.mapper, edits) - if err != nil { - return errors.Errorf("%v: %v", edits, err) - } - - newContent := diff.ApplyEdits(string(file.mapper.Content), sedits) - - filename := file.uri.Filename() - switch { - case t.Write: - if len(edits) > 0 { - ioutil.WriteFile(filename, []byte(newContent), 0644) - } - case t.Diff: - diffs := diff.ToUnified(filename+".orig", filename, string(file.mapper.Content), sedits) - fmt.Print(diffs) - default: - fmt.Print(string(newContent)) - } - return nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cmd/info.go b/vendor/golang.org/x/tools/internal/lsp/cmd/info.go deleted file mode 100644 index 90244643f..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cmd/info.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cmd - -import ( - "bytes" - "context" - "flag" - "fmt" - "net/url" - "os" - "strings" - - "golang.org/x/tools/internal/lsp/browser" - "golang.org/x/tools/internal/lsp/debug" -) - -// version implements the version command. -type version struct { - app *Application -} - -// bug implements the bug command. -type bug struct{} - -func (v *version) Name() string { return "version" } -func (v *version) Usage() string { return "" } -func (v *version) ShortHelp() string { return "print the gopls version information" } -func (v *version) DetailedHelp(f *flag.FlagSet) { - fmt.Fprint(f.Output(), ``) - f.PrintDefaults() -} - -// Run collects some basic information and then prepares an issue ready to -// be reported. -func (v *version) Run(ctx context.Context, args ...string) error { - debug.PrintVersionInfo(os.Stdout, v.app.Verbose, debug.PlainText) - return nil -} - -func (b *bug) Name() string { return "bug" } -func (b *bug) Usage() string { return "" } -func (b *bug) ShortHelp() string { return "report a bug in gopls" } -func (b *bug) DetailedHelp(f *flag.FlagSet) { - fmt.Fprint(f.Output(), ``) - f.PrintDefaults() -} - -const goplsBugPrefix = "gopls: " -const goplsBugHeader = `Please answer these questions before submitting your issue. Thanks! - -#### What did you do? -If possible, provide a recipe for reproducing the error. -A complete runnable program is good. -A link on play.golang.org is better. -A failing unit test is the best. - -#### What did you expect to see? - - -#### What did you see instead? - - -` - -// Run collects some basic information and then prepares an issue ready to -// be reported. -func (b *bug) Run(ctx context.Context, args ...string) error { - buf := &bytes.Buffer{} - fmt.Fprint(buf, goplsBugHeader) - debug.PrintVersionInfo(buf, true, debug.Markdown) - body := buf.String() - title := strings.Join(args, " ") - if !strings.HasPrefix(title, goplsBugPrefix) { - title = goplsBugPrefix + title - } - if !browser.Open("https://github.com/golang/go/issues/new?title=" + url.QueryEscape(title) + "&body=" + url.QueryEscape(body)) { - fmt.Print("Please file a new issue at golang.org/issue/new using this template:\n\n") - fmt.Print(body) - } - return nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cmd/links.go b/vendor/golang.org/x/tools/internal/lsp/cmd/links.go deleted file mode 100644 index a93ae8fdb..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cmd/links.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cmd - -import ( - "context" - "encoding/json" - "flag" - "fmt" - "os" - - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/tool" - errors "golang.org/x/xerrors" -) - -// links implements the links verb for gopls. -type links struct { - JSON bool `flag:"json" help:"emit document links in JSON format"` - - app *Application -} - -func (l *links) Name() string { return "links" } -func (l *links) Usage() string { return "" } -func (l *links) ShortHelp() string { return "list links in a file" } -func (l *links) DetailedHelp(f *flag.FlagSet) { - fmt.Fprintf(f.Output(), ` -Example: list links contained within a file: - -  $ gopls links internal/lsp/cmd/check.go - -gopls links flags are: -`) - f.PrintDefaults() -} - -// Run finds all the links within a document -// - if -json is specified, outputs location range and uri -// - otherwise, prints the a list of unique links -func (l *links) Run(ctx context.Context, args ...string) error { - if len(args) != 1 { - return tool.CommandLineErrorf("links expects 1 argument") - } - conn, err := l.app.connect(ctx) - if err != nil { - return err - } - defer conn.terminate(ctx) - - from := span.Parse(args[0]) - uri := from.URI() - file := conn.AddFile(ctx, uri) - if file.err != nil { - return file.err - } - results, err := conn.DocumentLink(ctx, &protocol.DocumentLinkParams{ - TextDocument: protocol.TextDocumentIdentifier{ - URI: protocol.NewURI(uri), - }, - }) - if err != nil { - return errors.Errorf("%v: %v", from, err) - } - if l.JSON { - enc := json.NewEncoder(os.Stdout) - enc.SetIndent("", "\t") - return enc.Encode(results) - } - for _, v := range results { - fmt.Println(v.Target) - } - return nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cmd/query.go b/vendor/golang.org/x/tools/internal/lsp/cmd/query.go deleted file mode 100644 index 037b4d007..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cmd/query.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cmd - -import ( - "context" - "flag" - "fmt" - - "golang.org/x/tools/internal/tool" -) - -const ( - // The set of possible options that can be passed through the -emulate flag, - // which causes query to adjust its output to match that of the binary being - // emulated. - - // emulateGuru tells query to emulate the output format of the guru tool. - emulateGuru = "guru" -) - -// query implements the query command. -type query struct { - JSON bool `flag:"json" help:"emit output in JSON format"` - Emulate string `flag:"emulate" help:"compatibility mode, causes gopls to emulate another tool.\nvalues depend on the operation being performed"` - - app *Application -} - -func (q *query) Name() string { return "query" } -func (q *query) Usage() string { return " " } -func (q *query) ShortHelp() string { - return "answer queries about go source code" -} -func (q *query) DetailedHelp(f *flag.FlagSet) { - fmt.Fprint(f.Output(), ` -The mode argument determines the query to perform: -`) - for _, m := range q.modes() { - fmt.Fprintf(f.Output(), " %s : %v\n", m.Name(), m.ShortHelp()) - } - fmt.Fprint(f.Output(), ` -query flags are: -`) - f.PrintDefaults() -} - -// Run takes the args after command flag processing, and invokes the correct -// query mode as specified by the first argument. -func (q *query) Run(ctx context.Context, args ...string) error { - if len(args) == 0 { - return tool.CommandLineErrorf("query must be supplied a mode") - } - mode, args := args[0], args[1:] - for _, m := range q.modes() { - if m.Name() == mode { - return tool.Run(ctx, m, args) // pass errors up the chain - } - } - return tool.CommandLineErrorf("unknown command %v", mode) -} - -// modes returns the set of modes supported by the query command. -func (q *query) modes() []tool.Application { - return []tool.Application{ - &definition{query: q}, - } -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cmd/references.go b/vendor/golang.org/x/tools/internal/lsp/cmd/references.go deleted file mode 100644 index 03c170939..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cmd/references.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cmd - -import ( - "context" - "flag" - "fmt" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/tool" - "sort" -) - -// references implements the references verb for gopls -type references struct { - IncludeDeclaration bool `flag:"d" help:"include the declaration of the specified identifier in the results"` - - app *Application -} - -func (r *references) Name() string { return "references" } -func (r *references) Usage() string { return "" } -func (r *references) ShortHelp() string { return "display selected identifier's references" } -func (r *references) DetailedHelp(f *flag.FlagSet) { - fmt.Fprint(f.Output(), ` -Example: - - $ # 1-indexed location (:line:column or :#offset) of the target identifier - $ gopls references helper/helper.go:8:6 - $ gopls references helper/helper.go:#53 - - gopls references flags are: -`) - f.PrintDefaults() -} - -func (r *references) Run(ctx context.Context, args ...string) error { - if len(args) != 1 { - return tool.CommandLineErrorf("references expects 1 argument (position)") - } - - conn, err := r.app.connect(ctx) - if err != nil { - return err - } - defer conn.terminate(ctx) - - from := span.Parse(args[0]) - file := conn.AddFile(ctx, from.URI()) - if file.err != nil { - return file.err - } - - loc, err := file.mapper.Location(from) - if err != nil { - return err - } - - p := protocol.ReferenceParams{ - Context: protocol.ReferenceContext{ - IncludeDeclaration: r.IncludeDeclaration, - }, - TextDocumentPositionParams: protocol.TextDocumentPositionParams{ - TextDocument: protocol.TextDocumentIdentifier{URI: loc.URI}, - Position: loc.Range.Start, - }, - } - locations, err := conn.References(ctx, &p) - if err != nil { - return err - } - - if len(locations) == 0 { - return tool.CommandLineErrorf("%v: not an identifier", from) - } - - var spans []string - for _, l := range locations { - f := conn.AddFile(ctx, span.NewURI(l.URI)) - // convert location to span for user-friendly 1-indexed line - // and column numbers - span, err := f.mapper.Span(l) - if err != nil { - return err - } - spans = append(spans, fmt.Sprint(span)) - } - - sort.Strings(spans) - for _, s := range spans { - fmt.Println(s) - } - - return nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cmd/rename.go b/vendor/golang.org/x/tools/internal/lsp/cmd/rename.go deleted file mode 100644 index 47e26beb3..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cmd/rename.go +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cmd - -import ( - "context" - "flag" - "fmt" - "io/ioutil" - "os" - "path/filepath" - "sort" - - "golang.org/x/tools/internal/lsp/diff" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/tool" - errors "golang.org/x/xerrors" -) - -// rename implements the rename verb for gopls. -type rename struct { - Diff bool `flag:"d" help:"display diffs instead of rewriting files"` - Write bool `flag:"w" help:"write result to (source) file instead of stdout"` - - app *Application -} - -func (r *rename) Name() string { return "rename" } -func (r *rename) Usage() string { return "" } -func (r *rename) ShortHelp() string { return "rename selected identifier" } -func (r *rename) DetailedHelp(f *flag.FlagSet) { - fmt.Fprint(f.Output(), ` -Example: - - $ # 1-based location (:line:column or :#position) of the thing to change - $ gopls rename helper/helper.go:8:6 - $ gopls rename helper/helper.go:#53 - - gopls rename flags are: -`) - f.PrintDefaults() -} - -// Run renames the specified identifier and either; -// - if -w is specified, updates the file(s) in place; -// - if -d is specified, prints out unified diffs of the changes; or -// - otherwise, prints the new versions to stdout. -func (r *rename) Run(ctx context.Context, args ...string) error { - if len(args) != 2 { - return tool.CommandLineErrorf("definition expects 2 arguments (position, new name)") - } - conn, err := r.app.connect(ctx) - if err != nil { - return err - } - defer conn.terminate(ctx) - - from := span.Parse(args[0]) - file := conn.AddFile(ctx, from.URI()) - if file.err != nil { - return file.err - } - - loc, err := file.mapper.Location(from) - if err != nil { - return err - } - - p := protocol.RenameParams{ - TextDocument: protocol.TextDocumentIdentifier{URI: loc.URI}, - Position: loc.Range.Start, - NewName: args[1], - } - we, err := conn.Rename(ctx, &p) - if err != nil { - return err - } - - // Make output order predictable - var keys []string - for u := range *we.Changes { - keys = append(keys, u) - } - sort.Strings(keys) - changeCount := len(keys) - - for _, u := range keys { - edits := (*we.Changes)[u] - uri := span.NewURI(u) - cmdFile := conn.AddFile(ctx, uri) - filename := cmdFile.uri.Filename() - - // convert LSP-style edits to []diff.TextEdit cuz Spans are handy - renameEdits, err := source.FromProtocolEdits(cmdFile.mapper, edits) - if err != nil { - return errors.Errorf("%v: %v", edits, err) - } - - newContent := diff.ApplyEdits(string(cmdFile.mapper.Content), renameEdits) - - switch { - case r.Write: - fmt.Fprintln(os.Stderr, filename) - err := os.Rename(filename, filename+".orig") - if err != nil { - return errors.Errorf("%v: %v", edits, err) - } - ioutil.WriteFile(filename, []byte(newContent), 0644) - case r.Diff: - diffs := diff.ToUnified(filename+".orig", filename, string(cmdFile.mapper.Content), renameEdits) - fmt.Print(diffs) - default: - if len(keys) > 1 { - fmt.Printf("%s:\n", filepath.Base(filename)) - } - fmt.Print(string(newContent)) - if changeCount > 1 { // if this wasn't last change, print newline - fmt.Println() - } - changeCount -= 1 - } - } - return nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cmd/serve.go b/vendor/golang.org/x/tools/internal/lsp/cmd/serve.go deleted file mode 100644 index 79b4546ee..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cmd/serve.go +++ /dev/null @@ -1,221 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cmd - -import ( - "context" - "encoding/json" - "flag" - "fmt" - "io" - "log" - "net" - "os" - "path/filepath" - "time" - - "golang.org/x/tools/internal/jsonrpc2" - "golang.org/x/tools/internal/lsp" - "golang.org/x/tools/internal/lsp/debug" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/telemetry" - "golang.org/x/tools/internal/telemetry/trace" - "golang.org/x/tools/internal/tool" - errors "golang.org/x/xerrors" -) - -// Serve is a struct that exposes the configurable parts of the LSP server as -// flags, in the right form for tool.Main to consume. -type Serve struct { - Logfile string `flag:"logfile" help:"filename to log to. if value is \"auto\", then logging to a default output file is enabled"` - Mode string `flag:"mode" help:"no effect"` - Port int `flag:"port" help:"port on which to run gopls for debugging purposes"` - Address string `flag:"listen" help:"address on which to listen for remote connections"` - Trace bool `flag:"rpc.trace" help:"Print the full rpc trace in lsp inspector format"` - Debug string `flag:"debug" help:"Serve debug information on the supplied address"` - - app *Application -} - -func (s *Serve) Name() string { return "serve" } -func (s *Serve) Usage() string { return "" } -func (s *Serve) ShortHelp() string { - return "run a server for Go code using the Language Server Protocol" -} -func (s *Serve) DetailedHelp(f *flag.FlagSet) { - fmt.Fprint(f.Output(), ` -The server communicates using JSONRPC2 on stdin and stdout, and is intended to be run directly as -a child of an editor process. - -gopls server flags are: -`) - f.PrintDefaults() -} - -// Run configures a server based on the flags, and then runs it. -// It blocks until the server shuts down. -func (s *Serve) Run(ctx context.Context, args ...string) error { - if len(args) > 0 { - return tool.CommandLineErrorf("server does not take arguments, got %v", args) - } - out := os.Stderr - if s.Logfile != "" { - filename := s.Logfile - if filename == "auto" { - filename = filepath.Join(os.TempDir(), fmt.Sprintf("gopls-%d.log", os.Getpid())) - } - f, err := os.Create(filename) - if err != nil { - return errors.Errorf("Unable to create log file: %v", err) - } - defer f.Close() - log.SetOutput(io.MultiWriter(os.Stderr, f)) - out = f - } - - debug.Serve(ctx, s.Debug) - - if s.app.Remote != "" { - return s.forward() - } - - prepare := func(ctx context.Context, srv *lsp.Server) *lsp.Server { - srv.Conn.AddHandler(&handler{}) - return srv - } - run := func(ctx context.Context, srv *lsp.Server) { go prepare(ctx, srv).Run(ctx) } - if s.Address != "" { - return lsp.RunServerOnAddress(ctx, s.app.cache, s.Address, run) - } - if s.Port != 0 { - return lsp.RunServerOnPort(ctx, s.app.cache, s.Port, run) - } - stream := jsonrpc2.NewHeaderStream(os.Stdin, os.Stdout) - if s.Trace { - stream = protocol.LoggingStream(stream, out) - } - ctx, srv := lsp.NewServer(ctx, s.app.cache, stream) - return prepare(ctx, srv).Run(ctx) -} - -func (s *Serve) forward() error { - conn, err := net.Dial("tcp", s.app.Remote) - if err != nil { - return err - } - errc := make(chan error) - - go func(conn net.Conn) { - _, err := io.Copy(conn, os.Stdin) - errc <- err - }(conn) - - go func(conn net.Conn) { - _, err := io.Copy(os.Stdout, conn) - errc <- err - }(conn) - - return <-errc -} - -type handler struct{} - -type rpcStats struct { - method string - direction jsonrpc2.Direction - id *jsonrpc2.ID - payload *json.RawMessage - start time.Time - delivering func() - close func() -} - -type statsKeyType int - -const statsKey = statsKeyType(0) - -func (h *handler) Deliver(ctx context.Context, r *jsonrpc2.Request, delivered bool) bool { - stats := h.getStats(ctx) - if stats != nil { - stats.delivering() - } - return false -} - -func (h *handler) Cancel(ctx context.Context, conn *jsonrpc2.Conn, id jsonrpc2.ID, cancelled bool) bool { - return false -} - -func (h *handler) Request(ctx context.Context, conn *jsonrpc2.Conn, direction jsonrpc2.Direction, r *jsonrpc2.WireRequest) context.Context { - if r.Method == "" { - panic("no method in rpc stats") - } - stats := &rpcStats{ - method: r.Method, - start: time.Now(), - direction: direction, - payload: r.Params, - } - ctx = context.WithValue(ctx, statsKey, stats) - mode := telemetry.Outbound - if direction == jsonrpc2.Receive { - mode = telemetry.Inbound - } - ctx, stats.close = trace.StartSpan(ctx, r.Method, - telemetry.Method.Of(r.Method), - telemetry.RPCDirection.Of(mode), - telemetry.RPCID.Of(r.ID), - ) - telemetry.Started.Record(ctx, 1) - _, stats.delivering = trace.StartSpan(ctx, "queued") - return ctx -} - -func (h *handler) Response(ctx context.Context, conn *jsonrpc2.Conn, direction jsonrpc2.Direction, r *jsonrpc2.WireResponse) context.Context { - return ctx -} - -func (h *handler) Done(ctx context.Context, err error) { - stats := h.getStats(ctx) - if err != nil { - ctx = telemetry.StatusCode.With(ctx, "ERROR") - } else { - ctx = telemetry.StatusCode.With(ctx, "OK") - } - elapsedTime := time.Since(stats.start) - latencyMillis := float64(elapsedTime) / float64(time.Millisecond) - telemetry.Latency.Record(ctx, latencyMillis) - stats.close() -} - -func (h *handler) Read(ctx context.Context, bytes int64) context.Context { - telemetry.SentBytes.Record(ctx, bytes) - return ctx -} - -func (h *handler) Wrote(ctx context.Context, bytes int64) context.Context { - telemetry.ReceivedBytes.Record(ctx, bytes) - return ctx -} - -const eol = "\r\n\r\n\r\n" - -func (h *handler) Error(ctx context.Context, err error) { -} - -func (h *handler) getStats(ctx context.Context) *rpcStats { - stats, ok := ctx.Value(statsKey).(*rpcStats) - if !ok || stats == nil { - method, ok := ctx.Value(telemetry.Method).(string) - if !ok { - method = "???" - } - stats = &rpcStats{ - method: method, - close: func() {}, - } - } - return stats -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cmd/signature.go b/vendor/golang.org/x/tools/internal/lsp/cmd/signature.go deleted file mode 100644 index 7cc91cd5f..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cmd/signature.go +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cmd - -import ( - "context" - "flag" - "fmt" - - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/tool" -) - -// signature implements the signature verb for gopls -type signature struct { - app *Application -} - -func (r *signature) Name() string { return "signature" } -func (r *signature) Usage() string { return "" } -func (r *signature) ShortHelp() string { return "display selected identifier's signature" } -func (r *signature) DetailedHelp(f *flag.FlagSet) { - fmt.Fprint(f.Output(), ` -Example: - - $ # 1-indexed location (:line:column or :#offset) of the target identifier - $ gopls signature helper/helper.go:8:6 - $ gopls signature helper/helper.go:#53 - - gopls signature flags are: -`) - f.PrintDefaults() -} - -func (r *signature) Run(ctx context.Context, args ...string) error { - if len(args) != 1 { - return tool.CommandLineErrorf("signature expects 1 argument (position)") - } - - conn, err := r.app.connect(ctx) - if err != nil { - return err - } - defer conn.terminate(ctx) - - from := span.Parse(args[0]) - file := conn.AddFile(ctx, from.URI()) - if file.err != nil { - return file.err - } - - loc, err := file.mapper.Location(from) - if err != nil { - return err - } - - tdpp := protocol.TextDocumentPositionParams{ - TextDocument: protocol.TextDocumentIdentifier{ - URI: protocol.NewURI(from.URI()), - }, - Position: loc.Range.Start, - } - p := protocol.SignatureHelpParams{ - TextDocumentPositionParams: tdpp, - } - - s, err := conn.SignatureHelp(ctx, &p) - if err != nil { - return err - } - - if len(s.Signatures) == 0 { - return tool.CommandLineErrorf("%v: not a function", from) - } - - // there is only ever one possible signature, - // see toProtocolSignatureHelp in lsp/signature_help.go - signature := s.Signatures[0] - fmt.Printf("%s\n", signature.Label) - if signature.Documentation != "" { - fmt.Printf("\n%s\n", signature.Documentation) - } - - return nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cmd/suggested_fix.go b/vendor/golang.org/x/tools/internal/lsp/cmd/suggested_fix.go deleted file mode 100644 index 25ee8b62b..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cmd/suggested_fix.go +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cmd - -import ( - "context" - "flag" - "fmt" - "io/ioutil" - "time" - - "golang.org/x/tools/internal/lsp/diff" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/tool" - errors "golang.org/x/xerrors" -) - -// suggestedfix implements the fix verb for gopls. -type suggestedfix struct { - Diff bool `flag:"d" help:"display diffs instead of rewriting files"` - Write bool `flag:"w" help:"write result to (source) file instead of stdout"` - All bool `flag:"a" help:"apply all fixes, not just preferred fixes"` - - app *Application -} - -func (s *suggestedfix) Name() string { return "fix" } -func (s *suggestedfix) Usage() string { return "" } -func (s *suggestedfix) ShortHelp() string { return "apply suggested fixes" } -func (s *suggestedfix) DetailedHelp(f *flag.FlagSet) { - fmt.Fprintf(f.Output(), ` -Example: apply suggested fixes for this file: - -  $ gopls fix -w internal/lsp/cmd/check.go - -gopls fix flags are: -`) - f.PrintDefaults() -} - -// Run performs diagnostic checks on the file specified and either; -// - if -w is specified, updates the file in place; -// - if -d is specified, prints out unified diffs of the changes; or -// - otherwise, prints the new versions to stdout. -func (s *suggestedfix) Run(ctx context.Context, args ...string) error { - if len(args) != 1 { - return tool.CommandLineErrorf("fix expects 1 argument") - } - conn, err := s.app.connect(ctx) - if err != nil { - return err - } - defer conn.terminate(ctx) - - from := span.Parse(args[0]) - uri := from.URI() - file := conn.AddFile(ctx, uri) - if file.err != nil { - return file.err - } - - // Wait for diagnostics results - select { - case <-file.hasDiagnostics: - case <-time.After(30 * time.Second): - return errors.Errorf("timed out waiting for results from %v", file.uri) - } - - file.diagnosticsMu.Lock() - defer file.diagnosticsMu.Unlock() - - p := protocol.CodeActionParams{ - TextDocument: protocol.TextDocumentIdentifier{ - URI: protocol.NewURI(uri), - }, - Context: protocol.CodeActionContext{ - Only: []protocol.CodeActionKind{protocol.QuickFix}, - Diagnostics: file.diagnostics, - }, - } - actions, err := conn.CodeAction(ctx, &p) - if err != nil { - return errors.Errorf("%v: %v", from, err) - } - var edits []protocol.TextEdit - for _, a := range actions { - if a.IsPreferred || s.All { - edits = (*a.Edit.Changes)[string(uri)] - } - } - - sedits, err := source.FromProtocolEdits(file.mapper, edits) - if err != nil { - return errors.Errorf("%v: %v", edits, err) - } - newContent := diff.ApplyEdits(string(file.mapper.Content), sedits) - - filename := file.uri.Filename() - switch { - case s.Write: - if len(edits) > 0 { - ioutil.WriteFile(filename, []byte(newContent), 0644) - } - case s.Diff: - diffs := diff.ToUnified(filename+".orig", filename, string(file.mapper.Content), sedits) - fmt.Print(diffs) - default: - fmt.Print(string(newContent)) - } - return nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cmd/symbols.go b/vendor/golang.org/x/tools/internal/lsp/cmd/symbols.go deleted file mode 100644 index 6c2b34d51..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cmd/symbols.go +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cmd - -import ( - "context" - "flag" - "fmt" - "sort" - - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/tool" -) - -// references implements the references verb for gopls -type symbols struct { - app *Application -} - -func (r *symbols) Name() string { return "symbols" } -func (r *symbols) Usage() string { return "" } -func (r *symbols) ShortHelp() string { return "display selected file's symbols" } -func (r *symbols) DetailedHelp(f *flag.FlagSet) { - fmt.Fprint(f.Output(), ` -Example: - $ gopls symbols helper/helper.go -`) - f.PrintDefaults() -} -func (r *symbols) Run(ctx context.Context, args ...string) error { - if len(args) != 1 { - return tool.CommandLineErrorf("symbols expects 1 argument (position)") - } - - conn, err := r.app.connect(ctx) - if err != nil { - return err - } - defer conn.terminate(ctx) - - from := span.Parse(args[0]) - p := protocol.DocumentSymbolParams{ - TextDocument: protocol.TextDocumentIdentifier{ - URI: string(from.URI()), - }, - } - - symbols, err := conn.DocumentSymbol(ctx, &p) - if err != nil { - return err - } - - for _, s := range symbols { - fmt.Println(symbolToString(s)) - // Sort children for consistency - sort.Slice(s.Children, func(i, j int) bool { - return s.Children[i].Name < s.Children[j].Name - }) - for _, c := range s.Children { - fmt.Println("\t" + symbolToString(c)) - } - } - - return nil -} - -func symbolToString(symbol protocol.DocumentSymbol) string { - r := symbol.SelectionRange - // convert ranges to user friendly 1-based positions - position := fmt.Sprintf("%v:%v-%v:%v", - r.Start.Line+1, - r.Start.Character+1, - r.End.Line+1, - r.End.Character+1, - ) - return fmt.Sprintf("%s %s %s", symbol.Name, symbol.Kind, position) -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cmd/test/check.go b/vendor/golang.org/x/tools/internal/lsp/cmd/test/check.go deleted file mode 100644 index ad260d2e5..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cmd/test/check.go +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cmdtest - -import ( - "fmt" - "io/ioutil" - "strings" - "testing" - - "golang.org/x/tools/internal/lsp/cmd" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/tool" -) - -func (r *runner) Diagnostics(t *testing.T, uri span.URI, want []source.Diagnostic) { - if len(want) == 1 && want[0].Message == "" { - return - } - fname := uri.Filename() - args := []string{"-remote=internal", "check", fname} - app := cmd.New("gopls-test", r.data.Config.Dir, r.data.Exported.Config.Env, r.options) - out := CaptureStdOut(t, func() { - _ = tool.Run(r.ctx, app, args) - }) - // parse got into a collection of reports - got := map[string]struct{}{} - for _, l := range strings.Split(out, "\n") { - if len(l) == 0 { - continue - } - // parse and reprint to normalize the span - bits := strings.SplitN(l, ": ", 2) - if len(bits) == 2 { - spn := span.Parse(strings.TrimSpace(bits[0])) - spn = span.New(spn.URI(), spn.Start(), span.Point{}) - data, err := ioutil.ReadFile(fname) - if err != nil { - t.Fatal(err) - } - converter := span.NewContentConverter(fname, data) - s, err := spn.WithPosition(converter) - if err != nil { - t.Fatal(err) - } - l = fmt.Sprintf("%s: %s", s, strings.TrimSpace(bits[1])) - } - got[l] = struct{}{} - } - for _, diag := range want { - expect := fmt.Sprintf("%v:%v:%v: %v", diag.URI.Filename(), diag.Range.Start.Line+1, diag.Range.Start.Character+1, diag.Message) - if diag.Range.Start.Character == 0 { - expect = fmt.Sprintf("%v:%v: %v", diag.URI.Filename(), diag.Range.Start.Line+1, diag.Message) - } - // Skip the badimport test for now, until we do a better job with diagnostic ranges. - if strings.Contains(diag.URI.Filename(), "badimport") { - continue - } - _, found := got[expect] - if !found { - t.Errorf("missing diagnostic %q, %v", expect, got) - } else { - delete(got, expect) - } - } - for extra := range got { - // Skip the badimport test for now, until we do a better job with diagnostic ranges. - if strings.Contains(extra, "badimport") { - continue - } - t.Errorf("extra diagnostic %q", extra) - } -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cmd/test/cmdtest.go b/vendor/golang.org/x/tools/internal/lsp/cmd/test/cmdtest.go deleted file mode 100644 index b4d2bfc36..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cmd/test/cmdtest.go +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package cmdtest contains the test suite for the command line behavior of gopls. -package cmdtest - -import ( - "bytes" - "context" - "io/ioutil" - "os" - "path/filepath" - "strconv" - "strings" - "testing" - - "golang.org/x/tools/go/packages/packagestest" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/lsp/tests" - "golang.org/x/tools/internal/span" -) - -type runner struct { - exporter packagestest.Exporter - data *tests.Data - ctx context.Context - options func(*source.Options) -} - -func NewRunner(exporter packagestest.Exporter, data *tests.Data, ctx context.Context, options func(*source.Options)) tests.Tests { - return &runner{ - exporter: exporter, - data: data, - ctx: ctx, - options: options, - } -} - -func (r *runner) Completion(t *testing.T, src span.Span, test tests.Completion, items tests.CompletionItems) { - //TODO: add command line completions tests when it works -} - -func (r *runner) CompletionSnippet(t *testing.T, src span.Span, expected tests.CompletionSnippet, placeholders bool, items tests.CompletionItems) { - //TODO: add command line completions tests when it works -} - -func (r *runner) UnimportedCompletion(t *testing.T, src span.Span, test tests.Completion, items tests.CompletionItems) { - //TODO: add command line completions tests when it works -} - -func (r *runner) DeepCompletion(t *testing.T, src span.Span, test tests.Completion, items tests.CompletionItems) { - //TODO: add command line completions tests when it works -} - -func (r *runner) FuzzyCompletion(t *testing.T, src span.Span, test tests.Completion, items tests.CompletionItems) { - //TODO: add command line completions tests when it works -} - -func (r *runner) CaseSensitiveCompletion(t *testing.T, src span.Span, test tests.Completion, items tests.CompletionItems) { - //TODO: add command line completions tests when it works -} - -func (r *runner) RankCompletion(t *testing.T, src span.Span, test tests.Completion, items tests.CompletionItems) { - //TODO: add command line completions tests when it works -} - -func (r *runner) FoldingRange(t *testing.T, spn span.Span) { - //TODO: add command line folding range tests when it works -} - -func (r *runner) Highlight(t *testing.T, name string, locations []span.Span) { - //TODO: add command line highlight tests when it works -} - -func (r *runner) PrepareRename(t *testing.T, src span.Span, want *source.PrepareItem) { - //TODO: add command line prepare rename tests when it works -} - -func (r *runner) Implementation(t *testing.T, spn span.Span, imp tests.Implementations) { - //TODO: add implements tests when it works -} - -func CaptureStdOut(t testing.TB, f func()) string { - r, out, err := os.Pipe() - if err != nil { - t.Fatal(err) - } - old := os.Stdout - defer func() { - os.Stdout = old - out.Close() - r.Close() - }() - os.Stdout = out - f() - out.Close() - data, err := ioutil.ReadAll(r) - if err != nil { - t.Fatal(err) - } - return string(data) -} - -// normalizePaths replaces all paths present in s with just the fragment portion -// this is used to make golden files not depend on the temporary paths of the files -func normalizePaths(data *tests.Data, s string) string { - type entry struct { - path string - index int - fragment string - } - match := make([]entry, 0, len(data.Exported.Modules)) - // collect the initial state of all the matchers - for _, m := range data.Exported.Modules { - for fragment := range m.Files { - filename := data.Exported.File(m.Name, fragment) - index := strings.Index(s, filename) - if index >= 0 { - match = append(match, entry{filename, index, fragment}) - } - if slash := filepath.ToSlash(filename); slash != filename { - index := strings.Index(s, slash) - if index >= 0 { - match = append(match, entry{slash, index, fragment}) - } - } - quoted := strconv.Quote(filename) - if escaped := quoted[1 : len(quoted)-1]; escaped != filename { - index := strings.Index(s, escaped) - if index >= 0 { - match = append(match, entry{escaped, index, fragment}) - } - } - } - } - // result should be the same or shorter than the input - buf := bytes.NewBuffer(make([]byte, 0, len(s))) - last := 0 - for { - // find the nearest path match to the start of the buffer - next := -1 - nearest := len(s) - for i, c := range match { - if c.index >= 0 && nearest > c.index { - nearest = c.index - next = i - } - } - // if there are no matches, we copy the rest of the string and are done - if next < 0 { - buf.WriteString(s[last:]) - return buf.String() - } - // we have a match - n := &match[next] - // copy up to the start of the match - buf.WriteString(s[last:n.index]) - // skip over the filename - last = n.index + len(n.path) - // add in the fragment instead - buf.WriteString(n.fragment) - // see what the next match for this path is - n.index = strings.Index(s[last:], n.path) - if n.index >= 0 { - n.index += last - } - } -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cmd/test/definition.go b/vendor/golang.org/x/tools/internal/lsp/cmd/test/definition.go deleted file mode 100644 index 40da50be6..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cmd/test/definition.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cmdtest - -import ( - "fmt" - "runtime" - "strings" - "testing" - - "golang.org/x/tools/internal/lsp/cmd" - "golang.org/x/tools/internal/lsp/tests" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/tool" -) - -const ( - expectedDefinitionsCount = 28 - expectedTypeDefinitionsCount = 2 -) - -type godefMode int - -const ( - plainGodef = godefMode(1 << iota) - jsonGoDef -) - -var godefModes = []godefMode{ - plainGodef, - jsonGoDef, -} - -func (r *runner) Definition(t *testing.T, spn span.Span, d tests.Definition) { - if d.IsType || d.OnlyHover { - // TODO: support type definition, hover queries - return - } - d.Src = span.New(d.Src.URI(), span.NewPoint(0, 0, d.Src.Start().Offset()), span.Point{}) - for _, mode := range godefModes { - args := []string{"-remote=internal", "query"} - tag := d.Name + "-definition" - if mode&jsonGoDef != 0 { - tag += "-json" - args = append(args, "-json") - } - args = append(args, "definition") - uri := d.Src.URI() - args = append(args, fmt.Sprint(d.Src)) - got := CaptureStdOut(t, func() { - app := cmd.New("gopls-test", r.data.Config.Dir, r.data.Exported.Config.Env, r.options) - _ = tool.Run(r.ctx, app, args) - }) - got = normalizePaths(r.data, got) - if mode&jsonGoDef != 0 && runtime.GOOS == "windows" { - got = strings.Replace(got, "file:///", "file://", -1) - } - expect := strings.TrimSpace(string(r.data.Golden(tag, uri.Filename(), func() ([]byte, error) { - return []byte(got), nil - }))) - if expect != "" && !strings.HasPrefix(got, expect) { - t.Errorf("definition %v failed with %#v expected:\n%q\ngot:\n%q", tag, args, expect, got) - } - } -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cmd/test/format.go b/vendor/golang.org/x/tools/internal/lsp/cmd/test/format.go deleted file mode 100644 index 355f0d9cf..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cmd/test/format.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cmdtest - -import ( - "bytes" - "io/ioutil" - "os" - "os/exec" - "regexp" - "strings" - "testing" - - "golang.org/x/tools/internal/lsp/cmd" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/testenv" - "golang.org/x/tools/internal/tool" -) - -func (r *runner) Format(t *testing.T, spn span.Span) { - tag := "gofmt" - uri := spn.URI() - filename := uri.Filename() - expect := string(r.data.Golden(tag, filename, func() ([]byte, error) { - cmd := exec.Command("gofmt", filename) - contents, _ := cmd.Output() // ignore error, sometimes we have intentionally ungofmt-able files - contents = []byte(normalizePaths(r.data, fixFileHeader(string(contents)))) - return contents, nil - })) - if expect == "" { - //TODO: our error handling differs, for now just skip unformattable files - t.Skip("Unformattable file") - } - app := cmd.New("gopls-test", r.data.Config.Dir, r.data.Config.Env, r.options) - got := CaptureStdOut(t, func() { - _ = tool.Run(r.ctx, app, append([]string{"-remote=internal", "format"}, filename)) - }) - got = normalizePaths(r.data, got) - if expect != got { - t.Errorf("format failed for %s expected:\n%s\ngot:\n%s", filename, expect, got) - } - // now check we can build a valid unified diff - unified := CaptureStdOut(t, func() { - _ = tool.Run(r.ctx, app, append([]string{"-remote=internal", "format", "-d"}, filename)) - }) - checkUnified(t, filename, expect, unified) -} - -var unifiedHeader = regexp.MustCompile(`^diff -u.*\n(---\s+\S+\.go\.orig)\s+[\d-:. ]+(\n\+\+\+\s+\S+\.go)\s+[\d-:. ]+(\n@@)`) - -func fixFileHeader(s string) string { - match := unifiedHeader.FindStringSubmatch(s) - if match == nil { - return s - } - return strings.Join(append(match[1:], s[len(match[0]):]), "") -} - -func checkUnified(t *testing.T, filename string, expect string, patch string) { - testenv.NeedsTool(t, "patch") - if strings.Count(patch, "\n+++ ") > 1 { - // TODO(golang/go/#34580) - t.Skip("multi-file patch tests not supported yet") - } - applied := "" - if patch == "" { - applied = expect - } else { - temp, err := ioutil.TempFile("", "applied") - if err != nil { - t.Fatal(err) - } - temp.Close() - defer os.Remove(temp.Name()) - cmd := exec.Command("patch", "-u", "-p0", "-o", temp.Name(), filename) - cmd.Stdin = bytes.NewBuffer([]byte(patch)) - msg, err := cmd.CombinedOutput() - if err != nil { - t.Errorf("failed applying patch to %s: %v\ngot:\n%s\npatch:\n%s", filename, err, msg, patch) - return - } - out, err := ioutil.ReadFile(temp.Name()) - if err != nil { - t.Errorf("failed reading patched output for %s: %v\n", filename, err) - return - } - applied = string(out) - } - if expect != applied { - t.Errorf("apply unified gave wrong result for %s expected:\n%s\ngot:\n%s\npatch:\n%s", filename, expect, applied, patch) - } -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cmd/test/imports.go b/vendor/golang.org/x/tools/internal/lsp/cmd/test/imports.go deleted file mode 100644 index 9432a6c6e..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cmd/test/imports.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cmdtest - -import ( - "os/exec" - "testing" - - "golang.org/x/tools/internal/lsp/cmd" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/tool" -) - -func (r *runner) Import(t *testing.T, spn span.Span) { - uri := spn.URI() - filename := uri.Filename() - args := []string{"imports", filename} - app := cmd.New("gopls-test", r.data.Config.Dir, r.data.Exported.Config.Env, r.options) - got := CaptureStdOut(t, func() { - _ = tool.Run(r.ctx, app, args) - }) - want := string(r.data.Golden("goimports", filename, func() ([]byte, error) { - cmd := exec.Command("goimports", filename) - out, _ := cmd.Output() // ignore error, sometimes we have intentionally ungofmt-able files - return out, nil - })) - if want != got { - t.Errorf("imports failed for %s, expected:\n%v\ngot:\n%v", filename, want, got) - } -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cmd/test/links.go b/vendor/golang.org/x/tools/internal/lsp/cmd/test/links.go deleted file mode 100644 index 79a679965..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cmd/test/links.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cmdtest - -import ( - "encoding/json" - "testing" - - "golang.org/x/tools/internal/lsp/cmd" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/tests" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/tool" -) - -func (r *runner) Link(t *testing.T, uri span.URI, wantLinks []tests.Link) { - m, err := r.data.Mapper(uri) - if err != nil { - t.Fatal(err) - } - args := []string{"links", "-json", uri.Filename()} - app := cmd.New("gopls-test", r.data.Config.Dir, r.data.Exported.Config.Env, r.options) - out := CaptureStdOut(t, func() { - _ = tool.Run(r.ctx, app, args) - }) - var got []protocol.DocumentLink - err = json.Unmarshal([]byte(out), &got) - if err != nil { - t.Fatal(err) - } - if diff := tests.DiffLinks(m, wantLinks, got); diff != "" { - t.Error(diff) - } -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cmd/test/references.go b/vendor/golang.org/x/tools/internal/lsp/cmd/test/references.go deleted file mode 100644 index 55bbf9183..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cmd/test/references.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cmdtest - -import ( - "fmt" - "golang.org/x/tools/internal/lsp/cmd" - "golang.org/x/tools/internal/tool" - "testing" - - "golang.org/x/tools/internal/span" -) - -func (r *runner) References(t *testing.T, spn span.Span, itemList []span.Span) { - var expect string - for _, i := range itemList { - expect += fmt.Sprintln(i) - } - - uri := spn.URI() - filename := uri.Filename() - target := filename + fmt.Sprintf(":%v:%v", spn.Start().Line(), spn.Start().Column()) - - app := cmd.New("gopls-test", r.data.Config.Dir, r.data.Config.Env, r.options) - got := CaptureStdOut(t, func() { - err := tool.Run(r.ctx, app, append([]string{"-remote=internal", "references"}, target)) - if err != nil { - fmt.Println(spn.Start().Line()) - fmt.Println(err) - } - }) - - if expect != got { - t.Errorf("references failed for %s expected:\n%s\ngot:\n%s", target, expect, got) - } -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cmd/test/rename.go b/vendor/golang.org/x/tools/internal/lsp/cmd/test/rename.go deleted file mode 100644 index 9b227b9bd..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cmd/test/rename.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cmdtest - -import ( - "fmt" - "testing" - - "golang.org/x/tools/internal/lsp/cmd" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/tool" -) - -func (r *runner) Rename(t *testing.T, spn span.Span, newText string) { - filename := spn.URI().Filename() - goldenTag := newText + "-rename" - app := cmd.New("gopls-test", r.data.Config.Dir, r.data.Config.Env, r.options) - loc := fmt.Sprintf("%v", spn) - var err error - got := CaptureStdOut(t, func() { - err = tool.Run(r.ctx, app, []string{"-remote=internal", "rename", loc, newText}) - }) - if err != nil { - got = err.Error() - } - got = normalizePaths(r.data, got) - expect := string(r.data.Golden(goldenTag, filename, func() ([]byte, error) { - return []byte(got), nil - })) - if expect != got { - t.Errorf("rename failed with %v %v expected:\n%s\ngot:\n%s", loc, newText, expect, got) - } - // now check we can build a valid unified diff - unified := CaptureStdOut(t, func() { - _ = tool.Run(r.ctx, app, []string{"-remote=internal", "rename", "-d", loc, newText}) - }) - checkUnified(t, filename, expect, unified) -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cmd/test/signature.go b/vendor/golang.org/x/tools/internal/lsp/cmd/test/signature.go deleted file mode 100644 index 5ba55bd86..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cmd/test/signature.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cmdtest - -import ( - "fmt" - "testing" - - "golang.org/x/tools/internal/lsp/cmd" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/tool" - - "golang.org/x/tools/internal/span" -) - -func (r *runner) SignatureHelp(t *testing.T, spn span.Span, expectedSignature *source.SignatureInformation) { - goldenTag := "-signature" - if expectedSignature != nil { - goldenTag = expectedSignature.Label + goldenTag - } - uri := spn.URI() - filename := uri.Filename() - target := filename + fmt.Sprintf(":%v:%v", spn.Start().Line(), spn.Start().Column()) - - app := cmd.New("gopls-test", r.data.Config.Dir, r.data.Config.Env, r.options) - got := CaptureStdOut(t, func() { - tool.Run(r.ctx, app, append([]string{"-remote=internal", "signature"}, target)) - }) - - expect := string(r.data.Golden(goldenTag, filename, func() ([]byte, error) { - return []byte(got), nil - })) - - if expect != got { - t.Errorf("signature failed failed for %s expected:\n%s\ngot:\n%s", filename, expect, got) - } -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cmd/test/suggested_fix.go b/vendor/golang.org/x/tools/internal/lsp/cmd/test/suggested_fix.go deleted file mode 100644 index 9be0f8ede..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cmd/test/suggested_fix.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cmdtest - -import ( - "testing" - - "golang.org/x/tools/internal/lsp/cmd" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/tool" -) - -func (r *runner) SuggestedFix(t *testing.T, spn span.Span) { - uri := spn.URI() - filename := uri.Filename() - args := []string{"fix", "-a", filename} - app := cmd.New("gopls-test", r.data.Config.Dir, r.data.Exported.Config.Env, r.options) - got := CaptureStdOut(t, func() { - _ = tool.Run(r.ctx, app, args) - }) - want := string(r.data.Golden("suggestedfix", filename, func() ([]byte, error) { - return []byte(got), nil - })) - if want != got { - t.Errorf("suggested fixes failed for %s, expected:\n%v\ngot:\n%v", filename, want, got) - } -} diff --git a/vendor/golang.org/x/tools/internal/lsp/cmd/test/symbols.go b/vendor/golang.org/x/tools/internal/lsp/cmd/test/symbols.go deleted file mode 100644 index 05f00abc5..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/cmd/test/symbols.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cmdtest - -import ( - "testing" - - "fmt" - - "golang.org/x/tools/internal/lsp/cmd" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/tool" -) - -func (r *runner) Symbols(t *testing.T, uri span.URI, expectedSymbols []protocol.DocumentSymbol) { - filename := uri.Filename() - app := cmd.New("gopls-test", r.data.Config.Dir, r.data.Config.Env, r.options) - got := CaptureStdOut(t, func() { - err := tool.Run(r.ctx, app, append([]string{"-remote=internal", "symbols"}, filename)) - if err != nil { - fmt.Println(err) - } - }) - expect := string(r.data.Golden("symbols", filename, func() ([]byte, error) { - return []byte(got), nil - })) - if expect != got { - t.Errorf("symbols failed for %s expected:\n%s\ngot:\n%s", filename, expect, got) - } -} diff --git a/vendor/golang.org/x/tools/internal/lsp/code_action.go b/vendor/golang.org/x/tools/internal/lsp/code_action.go deleted file mode 100644 index 0d3966146..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/code_action.go +++ /dev/null @@ -1,241 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package lsp - -import ( - "context" - "fmt" - "sort" - "strings" - - "golang.org/x/tools/internal/imports" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/lsp/telemetry" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/telemetry/log" - errors "golang.org/x/xerrors" -) - -func (s *Server) codeAction(ctx context.Context, params *protocol.CodeActionParams) ([]protocol.CodeAction, error) { - uri := span.NewURI(params.TextDocument.URI) - view := s.session.ViewOf(uri) - f, err := view.GetFile(ctx, uri) - if err != nil { - return nil, err - } - - snapshot := view.Snapshot() - - // Determine the supported actions for this file kind. - fileKind := snapshot.Handle(ctx, f).Identity().Kind - supportedCodeActions, ok := view.Options().SupportedCodeActions[fileKind] - if !ok { - return nil, fmt.Errorf("no supported code actions for %v file kind", fileKind) - } - - // The Only field of the context specifies which code actions the client wants. - // If Only is empty, assume that the client wants all of the possible code actions. - var wanted map[protocol.CodeActionKind]bool - if len(params.Context.Only) == 0 { - wanted = supportedCodeActions - } else { - wanted = make(map[protocol.CodeActionKind]bool) - for _, only := range params.Context.Only { - wanted[only] = supportedCodeActions[only] - } - } - if len(wanted) == 0 { - return nil, errors.Errorf("no supported code action to execute for %s, wanted %v", uri, params.Context.Only) - } - - var codeActions []protocol.CodeAction - switch fileKind { - case source.Mod: - if !wanted[protocol.SourceOrganizeImports] { - return nil, nil - } - codeActions = append(codeActions, protocol.CodeAction{ - Title: "Tidy", - Kind: protocol.SourceOrganizeImports, - Command: &protocol.Command{ - Title: "Tidy", - Command: "tidy", - Arguments: []interface{}{ - f.URI(), - }, - }, - }) - case source.Go: - edits, editsPerFix, err := source.AllImportsFixes(ctx, view, f) - if err != nil { - return nil, err - } - if diagnostics := params.Context.Diagnostics; wanted[protocol.QuickFix] && len(diagnostics) > 0 { - // First, add the quick fixes reported by go/analysis. - qf, err := quickFixes(ctx, snapshot, f, diagnostics) - if err != nil { - log.Error(ctx, "quick fixes failed", err, telemetry.File.Of(uri)) - } - codeActions = append(codeActions, qf...) - - // If we also have diagnostics for missing imports, we can associate them with quick fixes. - if findImportErrors(diagnostics) { - // Separate this into a set of codeActions per diagnostic, where - // each action is the addition, removal, or renaming of one import. - for _, importFix := range editsPerFix { - // Get the diagnostics this fix would affect. - if fixDiagnostics := importDiagnostics(importFix.Fix, diagnostics); len(fixDiagnostics) > 0 { - codeActions = append(codeActions, protocol.CodeAction{ - Title: importFixTitle(importFix.Fix), - Kind: protocol.QuickFix, - Edit: &protocol.WorkspaceEdit{ - Changes: &map[string][]protocol.TextEdit{ - string(uri): importFix.Edits, - }, - }, - Diagnostics: fixDiagnostics, - }) - } - } - } - } - if wanted[protocol.SourceOrganizeImports] && len(edits) > 0 { - codeActions = append(codeActions, protocol.CodeAction{ - Title: "Organize Imports", - Kind: protocol.SourceOrganizeImports, - Edit: &protocol.WorkspaceEdit{ - Changes: &map[string][]protocol.TextEdit{ - string(uri): edits, - }, - }, - }) - } - default: - // Unsupported file kind for a code action. - return nil, nil - } - return codeActions, nil -} - -func (s *Server) getSupportedCodeActions() []protocol.CodeActionKind { - allCodeActionKinds := make(map[protocol.CodeActionKind]struct{}) - for _, kinds := range s.session.Options().SupportedCodeActions { - for kind := range kinds { - allCodeActionKinds[kind] = struct{}{} - } - } - var result []protocol.CodeActionKind - for kind := range allCodeActionKinds { - result = append(result, kind) - } - sort.Slice(result, func(i, j int) bool { - return result[i] < result[j] - }) - return result -} - -type protocolImportFix struct { - fix *imports.ImportFix - edits []protocol.TextEdit -} - -// findImports determines if a given diagnostic represents an error that could -// be fixed by organizing imports. -// TODO(rstambler): We need a better way to check this than string matching. -func findImportErrors(diagnostics []protocol.Diagnostic) bool { - for _, diagnostic := range diagnostics { - // "undeclared name: X" may be an unresolved import. - if strings.HasPrefix(diagnostic.Message, "undeclared name: ") { - return true - } - // "could not import: X" may be an invalid import. - if strings.HasPrefix(diagnostic.Message, "could not import: ") { - return true - } - // "X imported but not used" is an unused import. - // "X imported but not used as Y" is an unused import. - if strings.Contains(diagnostic.Message, " imported but not used") { - return true - } - } - return false -} - -func importFixTitle(fix *imports.ImportFix) string { - var str string - switch fix.FixType { - case imports.AddImport: - str = fmt.Sprintf("Add import: %s %q", fix.StmtInfo.Name, fix.StmtInfo.ImportPath) - case imports.DeleteImport: - str = fmt.Sprintf("Delete import: %s %q", fix.StmtInfo.Name, fix.StmtInfo.ImportPath) - case imports.SetImportName: - str = fmt.Sprintf("Rename import: %s %q", fix.StmtInfo.Name, fix.StmtInfo.ImportPath) - } - return str -} - -func importDiagnostics(fix *imports.ImportFix, diagnostics []protocol.Diagnostic) (results []protocol.Diagnostic) { - for _, diagnostic := range diagnostics { - switch { - // "undeclared name: X" may be an unresolved import. - case strings.HasPrefix(diagnostic.Message, "undeclared name: "): - ident := strings.TrimPrefix(diagnostic.Message, "undeclared name: ") - if ident == fix.IdentName { - results = append(results, diagnostic) - } - // "could not import: X" may be an invalid import. - case strings.HasPrefix(diagnostic.Message, "could not import: "): - ident := strings.TrimPrefix(diagnostic.Message, "could not import: ") - if ident == fix.IdentName { - results = append(results, diagnostic) - } - // "X imported but not used" is an unused import. - // "X imported but not used as Y" is an unused import. - case strings.Contains(diagnostic.Message, " imported but not used"): - idx := strings.Index(diagnostic.Message, " imported but not used") - importPath := diagnostic.Message[:idx] - if importPath == fmt.Sprintf("%q", fix.StmtInfo.ImportPath) { - results = append(results, diagnostic) - } - } - } - return results -} - -func quickFixes(ctx context.Context, s source.Snapshot, f source.File, diagnostics []protocol.Diagnostic) ([]protocol.CodeAction, error) { - var codeActions []protocol.CodeAction - cphs, err := s.CheckPackageHandles(ctx, f) - if err != nil { - return nil, err - } - // We get the package that source.Diagnostics would've used. This is hack. - // TODO(golang/go#32443): The correct solution will be to cache diagnostics per-file per-snapshot. - cph, err := source.WidestCheckPackageHandle(cphs) - if err != nil { - return nil, err - } - for _, diag := range diagnostics { - srcErr, err := s.FindAnalysisError(ctx, cph.ID(), diag) - if err != nil { - continue - } - for _, fix := range srcErr.SuggestedFixes { - edits := make(map[string][]protocol.TextEdit) - for uri, e := range fix.Edits { - edits[protocol.NewURI(uri)] = e - } - codeActions = append(codeActions, protocol.CodeAction{ - Title: fix.Title, - Kind: protocol.QuickFix, - Diagnostics: []protocol.Diagnostic{diag}, - Edit: &protocol.WorkspaceEdit{ - Changes: &edits, - }, - }) - } - } - return codeActions, nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/command.go b/vendor/golang.org/x/tools/internal/lsp/command.go deleted file mode 100644 index 72e864753..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/command.go +++ /dev/null @@ -1,35 +0,0 @@ -package lsp - -import ( - "context" - - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" - errors "golang.org/x/xerrors" -) - -func (s *Server) executeCommand(ctx context.Context, params *protocol.ExecuteCommandParams) (interface{}, error) { - switch params.Command { - case "tidy": - if len(params.Arguments) == 0 || len(params.Arguments) > 1 { - return nil, errors.Errorf("expected one file URI for call to `go mod tidy`, got %v", params.Arguments) - } - // Confirm that this action is being taken on a go.mod file. - uri := span.NewURI(params.Arguments[0].(string)) - view := s.session.ViewOf(uri) - f, err := view.GetFile(ctx, uri) - if err != nil { - return nil, err - } - fh := view.Snapshot().Handle(ctx, f) - if fh.Identity().Kind != source.Mod { - return nil, errors.Errorf("%s is not a mod file", uri) - } - // Run go.mod tidy on the view. - if err := source.ModTidy(ctx, view); err != nil { - return nil, err - } - } - return nil, nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/completion.go b/vendor/golang.org/x/tools/internal/lsp/completion.go deleted file mode 100644 index 949a433e9..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/completion.go +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package lsp - -import ( - "context" - "fmt" - "sort" - - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/telemetry/log" - "golang.org/x/tools/internal/telemetry/tag" -) - -func (s *Server) completion(ctx context.Context, params *protocol.CompletionParams) (*protocol.CompletionList, error) { - uri := span.NewURI(params.TextDocument.URI) - view := s.session.ViewOf(uri) - options := view.Options() - f, err := view.GetFile(ctx, uri) - if err != nil { - return nil, err - } - options.Completion.FullDocumentation = options.HoverKind == source.FullDocumentation - candidates, surrounding, err := source.Completion(ctx, view, f, params.Position, options.Completion) - if err != nil { - log.Print(ctx, "no completions found", tag.Of("At", params.Position), tag.Of("Failure", err)) - } - if candidates == nil { - return &protocol.CompletionList{ - Items: []protocol.CompletionItem{}, - }, nil - } - // We might need to adjust the position to account for the prefix. - rng, err := surrounding.Range() - if err != nil { - return nil, err - } - // Sort the candidates by score, since that is not supported by LSP yet. - sort.SliceStable(candidates, func(i, j int) bool { - return candidates[i].Score > candidates[j].Score - }) - - // When using deep completions/fuzzy matching, report results as incomplete so - // client fetches updated completions after every key stroke. - incompleteResults := options.Completion.Deep || options.Completion.FuzzyMatching - - items := toProtocolCompletionItems(candidates, rng, options) - - if incompleteResults { - prefix := surrounding.Prefix() - for i := range items { - // We send the prefix as the filterText to trick VSCode into not - // reordering our candidates. All the candidates will appear to - // be a perfect match, so VSCode's fuzzy matching/ranking just - // maintains the natural "sortText" ordering. We can only do - // this in tandem with "incompleteResults" since otherwise - // client side filtering is important. - items[i].FilterText = prefix - } - } - - return &protocol.CompletionList{ - IsIncomplete: incompleteResults, - Items: items, - }, nil -} - -func toProtocolCompletionItems(candidates []source.CompletionItem, rng protocol.Range, options source.Options) []protocol.CompletionItem { - var ( - items = make([]protocol.CompletionItem, 0, len(candidates)) - numDeepCompletionsSeen int - ) - for i, candidate := range candidates { - // Limit the number of deep completions to not overwhelm the user in cases - // with dozens of deep completion matches. - if candidate.Depth > 0 { - if !options.Completion.Deep { - continue - } - if numDeepCompletionsSeen >= source.MaxDeepCompletions { - continue - } - numDeepCompletionsSeen++ - } - insertText := candidate.InsertText - if options.InsertTextFormat == protocol.SnippetTextFormat { - insertText = candidate.Snippet() - } - - // This can happen if the client has snippets disabled but the - // candidate only supports snippet insertion. - if insertText == "" { - continue - } - - item := protocol.CompletionItem{ - Label: candidate.Label, - Detail: candidate.Detail, - Kind: candidate.Kind, - TextEdit: &protocol.TextEdit{ - NewText: insertText, - Range: rng, - }, - InsertTextFormat: options.InsertTextFormat, - AdditionalTextEdits: candidate.AdditionalTextEdits, - // This is a hack so that the client sorts completion results in the order - // according to their score. This can be removed upon the resolution of - // https://github.com/Microsoft/language-server-protocol/issues/348. - SortText: fmt.Sprintf("%05d", i), - FilterText: candidate.InsertText, - Preselect: i == 0, - Documentation: candidate.Documentation, - } - // Trigger signature help for any function or method completion. - // This is helpful even if a function does not have parameters, - // since we show return types as well. - switch item.Kind { - case protocol.FunctionCompletion, protocol.MethodCompletion: - item.Command = &protocol.Command{ - Command: "editor.action.triggerParameterHints", - } - } - items = append(items, item) - } - return items -} diff --git a/vendor/golang.org/x/tools/internal/lsp/debug/info.1.11.go b/vendor/golang.org/x/tools/internal/lsp/debug/info.1.11.go deleted file mode 100644 index 0dea1e9bb..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/debug/info.1.11.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !go1.12 - -package debug - -import ( - "fmt" - "io" -) - -func printBuildInfo(w io.Writer, verbose bool, mode PrintMode) { - fmt.Fprintf(w, "version %s, built in $GOPATH mode\n", Version) -} diff --git a/vendor/golang.org/x/tools/internal/lsp/debug/info.1.12.go b/vendor/golang.org/x/tools/internal/lsp/debug/info.1.12.go deleted file mode 100644 index e8bae36b4..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/debug/info.1.12.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.12 - -package debug - -import ( - "fmt" - "io" - "runtime/debug" -) - -func printBuildInfo(w io.Writer, verbose bool, mode PrintMode) { - if info, ok := debug.ReadBuildInfo(); ok { - fmt.Fprintf(w, "%v %v\n", info.Path, Version) - printModuleInfo(w, &info.Main, mode) - if verbose { - for _, dep := range info.Deps { - printModuleInfo(w, dep, mode) - } - } - } else { - fmt.Fprintf(w, "version %s, built in $GOPATH mode\n", Version) - } -} - -func printModuleInfo(w io.Writer, m *debug.Module, mode PrintMode) { - fmt.Fprintf(w, " %s@%s", m.Path, m.Version) - if m.Sum != "" { - fmt.Fprintf(w, " %s", m.Sum) - } - if m.Replace != nil { - fmt.Fprintf(w, " => %v", m.Replace.Path) - } - fmt.Fprintf(w, "\n") -} diff --git a/vendor/golang.org/x/tools/internal/lsp/debug/info.go b/vendor/golang.org/x/tools/internal/lsp/debug/info.go deleted file mode 100644 index 4b1477c82..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/debug/info.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package debug exports debug information for gopls. -package debug - -import ( - "fmt" - "io" - "os/exec" - "strings" -) - -type PrintMode int - -const ( - PlainText = PrintMode(iota) - Markdown - HTML -) - -// Version is a manually-updated mechanism for tracking versions. -var Version = "master" - -// This writes the version and environment information to a writer. -func PrintVersionInfo(w io.Writer, verbose bool, mode PrintMode) { - if !verbose { - printBuildInfo(w, false, mode) - return - } - section(w, mode, "Build info", func() { - printBuildInfo(w, true, mode) - }) - fmt.Fprint(w, "\n") - section(w, mode, "Go info", func() { - cmd := exec.Command("go", "version") - cmd.Stdout = w - cmd.Run() - fmt.Fprint(w, "\n") - cmd = exec.Command("go", "env") - cmd.Stdout = w - cmd.Run() - }) -} - -func section(w io.Writer, mode PrintMode, title string, body func()) { - switch mode { - case PlainText: - fmt.Fprintln(w, title) - fmt.Fprintln(w, strings.Repeat("-", len(title))) - body() - case Markdown: - fmt.Fprintf(w, "#### %s\n\n```\n", title) - body() - fmt.Fprintf(w, "```\n") - case HTML: - fmt.Fprintf(w, "

        %s

        \n
        \n", title)
        -		body()
        -		fmt.Fprint(w, "
        \n") - } -} diff --git a/vendor/golang.org/x/tools/internal/lsp/debug/metrics.go b/vendor/golang.org/x/tools/internal/lsp/debug/metrics.go deleted file mode 100644 index 44bd7eed4..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/debug/metrics.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package debug - -import ( - "golang.org/x/tools/internal/lsp/telemetry" - "golang.org/x/tools/internal/telemetry/metric" -) - -var ( - // the distributions we use for histograms - bytesDistribution = []int64{1 << 10, 1 << 11, 1 << 12, 1 << 14, 1 << 16, 1 << 20} - millisecondsDistribution = []float64{0.1, 0.5, 1, 2, 5, 10, 50, 100, 500, 1000, 5000, 10000, 50000, 100000} - - receivedBytes = metric.HistogramInt64{ - Name: "received_bytes", - Description: "Distribution of received bytes, by method.", - Keys: []interface{}{telemetry.RPCDirection, telemetry.Method}, - Buckets: bytesDistribution, - }.Record(telemetry.ReceivedBytes) - - sentBytes = metric.HistogramInt64{ - Name: "sent_bytes", - Description: "Distribution of sent bytes, by method.", - Keys: []interface{}{telemetry.RPCDirection, telemetry.Method}, - Buckets: bytesDistribution, - }.Record(telemetry.SentBytes) - - latency = metric.HistogramFloat64{ - Name: "latency", - Description: "Distribution of latency in milliseconds, by method.", - Keys: []interface{}{telemetry.RPCDirection, telemetry.Method}, - Buckets: millisecondsDistribution, - }.Record(telemetry.Latency) - - started = metric.Scalar{ - Name: "started", - Description: "Count of RPCs started by method.", - Keys: []interface{}{telemetry.RPCDirection, telemetry.Method}, - }.CountInt64(telemetry.Started) - - completed = metric.Scalar{ - Name: "completed", - Description: "Count of RPCs completed by method and status.", - Keys: []interface{}{telemetry.RPCDirection, telemetry.Method, telemetry.StatusCode}, - }.CountFloat64(telemetry.Latency) -) diff --git a/vendor/golang.org/x/tools/internal/lsp/debug/rpc.go b/vendor/golang.org/x/tools/internal/lsp/debug/rpc.go deleted file mode 100644 index fe3142711..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/debug/rpc.go +++ /dev/null @@ -1,216 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package debug - -import ( - "context" - "fmt" - "html/template" - "log" - "net/http" - "sort" - - tlm "golang.org/x/tools/internal/lsp/telemetry" - "golang.org/x/tools/internal/telemetry" - "golang.org/x/tools/internal/telemetry/metric" -) - -var rpcTmpl = template.Must(template.Must(BaseTemplate.Clone()).Parse(` -{{define "title"}}RPC Information{{end}} -{{define "body"}} -

        Inbound

        - {{template "rpcSection" .Inbound}} -

        Outbound

        - {{template "rpcSection" .Outbound}} -{{end}} -{{define "rpcSection"}} - {{range .}}

        - {{.Method}} {{.Started}} traces ({{.InProgress}} in progress) -
        - Latency {{with .Latency}}{{.Mean}} ({{.Min}}<{{.Max}}){{end}} - By bucket 0s {{range .Latency.Values}}{{.Count}} {{.Limit}} {{end}} -
        - Received {{with .Received}}{{.Mean}} ({{.Min}}<{{.Max}}){{end}} - Sent {{with .Sent}}{{.Mean}} ({{.Min}}<{{.Max}}){{end}} -
        - Result codes {{range .Codes}}{{.Key}}={{.Count}} {{end}} -

        - {{end}} -{{end}} -`)) - -type rpcs struct { - Inbound []*rpcStats - Outbound []*rpcStats -} - -type rpcStats struct { - Method string - Started int64 - Completed int64 - InProgress int64 - Latency rpcTimeHistogram - Received rpcBytesHistogram - Sent rpcBytesHistogram - Codes []*rpcCodeBucket -} - -type rpcTimeHistogram struct { - Sum timeUnits - Count int64 - Mean timeUnits - Min timeUnits - Max timeUnits - Values []rpcTimeBucket -} - -type rpcTimeBucket struct { - Limit timeUnits - Count int64 -} - -type rpcBytesHistogram struct { - Sum byteUnits - Count int64 - Mean byteUnits - Min byteUnits - Max byteUnits - Values []rpcBytesBucket -} - -type rpcBytesBucket struct { - Limit byteUnits - Count int64 -} - -type rpcCodeBucket struct { - Key string - Count int64 -} - -func (r *rpcs) StartSpan(ctx context.Context, span *telemetry.Span) {} -func (r *rpcs) FinishSpan(ctx context.Context, span *telemetry.Span) {} -func (r *rpcs) Log(ctx context.Context, event telemetry.Event) {} -func (r *rpcs) Flush() {} - -func (r *rpcs) Metric(ctx context.Context, data telemetry.MetricData) { - for i, group := range data.Groups() { - set := &r.Inbound - if group.Get(tlm.RPCDirection) == tlm.Outbound { - set = &r.Outbound - } - method, ok := group.Get(tlm.Method).(string) - if !ok { - log.Printf("Not a method... %v", group) - continue - } - index := sort.Search(len(*set), func(i int) bool { - return (*set)[i].Method >= method - }) - if index >= len(*set) || (*set)[index].Method != method { - old := *set - *set = make([]*rpcStats, len(old)+1) - copy(*set, old[:index]) - copy((*set)[index+1:], old[index:]) - (*set)[index] = &rpcStats{Method: method} - } - stats := (*set)[index] - switch data.Handle() { - case started: - stats.Started = data.(*metric.Int64Data).Rows[i] - case completed: - status, ok := group.Get(tlm.StatusCode).(string) - if !ok { - log.Printf("Not status... %v", group) - continue - } - var b *rpcCodeBucket - for c, entry := range stats.Codes { - if entry.Key == status { - b = stats.Codes[c] - break - } - } - if b == nil { - b = &rpcCodeBucket{Key: status} - stats.Codes = append(stats.Codes, b) - sort.Slice(stats.Codes, func(i int, j int) bool { - return stats.Codes[i].Key < stats.Codes[j].Key - }) - } - b.Count = data.(*metric.Int64Data).Rows[i] - case latency: - data := data.(*metric.HistogramFloat64Data) - row := data.Rows[i] - stats.Latency.Count = row.Count - stats.Latency.Sum = timeUnits(row.Sum) - stats.Latency.Min = timeUnits(row.Min) - stats.Latency.Max = timeUnits(row.Max) - stats.Latency.Mean = timeUnits(row.Sum) / timeUnits(row.Count) - stats.Latency.Values = make([]rpcTimeBucket, len(data.Info.Buckets)) - last := int64(0) - for i, b := range data.Info.Buckets { - stats.Latency.Values[i].Limit = timeUnits(b) - stats.Latency.Values[i].Count = row.Values[i] - last - last = row.Values[i] - } - case sentBytes: - data := data.(*metric.HistogramInt64Data) - row := data.Rows[i] - stats.Sent.Count = row.Count - stats.Sent.Sum = byteUnits(row.Sum) - stats.Sent.Min = byteUnits(row.Min) - stats.Sent.Max = byteUnits(row.Max) - stats.Sent.Mean = byteUnits(row.Sum) / byteUnits(row.Count) - case receivedBytes: - data := data.(*metric.HistogramInt64Data) - row := data.Rows[i] - stats.Received.Count = row.Count - stats.Received.Sum = byteUnits(row.Sum) - stats.Sent.Min = byteUnits(row.Min) - stats.Sent.Max = byteUnits(row.Max) - stats.Received.Mean = byteUnits(row.Sum) / byteUnits(row.Count) - } - } - - for _, set := range [][]*rpcStats{r.Inbound, r.Outbound} { - for _, stats := range set { - stats.Completed = 0 - for _, b := range stats.Codes { - stats.Completed += b.Count - } - stats.InProgress = stats.Started - stats.Completed - } - } -} - -func (r *rpcs) getData(req *http.Request) interface{} { - return r -} - -func units(v float64, suffixes []string) string { - s := "" - for _, s = range suffixes { - n := v / 1000 - if n < 1 { - break - } - v = n - } - return fmt.Sprintf("%.2f%s", v, s) -} - -type timeUnits float64 - -func (v timeUnits) String() string { - v = v * 1000 * 1000 - return units(float64(v), []string{"ns", "μs", "ms", "s"}) -} - -type byteUnits float64 - -func (v byteUnits) String() string { - return units(float64(v), []string{"B", "KB", "MB", "GB", "TB"}) -} diff --git a/vendor/golang.org/x/tools/internal/lsp/debug/serve.go b/vendor/golang.org/x/tools/internal/lsp/debug/serve.go deleted file mode 100644 index c62a5256c..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/debug/serve.go +++ /dev/null @@ -1,416 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package debug - -import ( - "bytes" - "context" - "go/token" - "html/template" - "net" - "net/http" - "net/http/pprof" - _ "net/http/pprof" // pull in the standard pprof handlers - "path" - "runtime" - "strconv" - "sync" - - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/telemetry/export" - "golang.org/x/tools/internal/telemetry/export/prometheus" - "golang.org/x/tools/internal/telemetry/log" - "golang.org/x/tools/internal/telemetry/tag" -) - -type Cache interface { - ID() string - FileSet() *token.FileSet -} - -type Session interface { - ID() string - Cache() Cache - Files() []*File - File(hash string) *File -} - -type View interface { - ID() string - Name() string - Folder() span.URI - Session() Session -} - -type File struct { - Session Session - URI span.URI - Data string - Error error - Hash string -} - -var ( - mu sync.Mutex - data = struct { - Caches []Cache - Sessions []Session - Views []View - }{} -) - -// AddCache adds a cache to the set being served -func AddCache(cache Cache) { - mu.Lock() - defer mu.Unlock() - data.Caches = append(data.Caches, cache) -} - -// DropCache drops a cache from the set being served -func DropCache(cache Cache) { - mu.Lock() - defer mu.Unlock() - //find and remove the cache - if i, _ := findCache(cache.ID()); i >= 0 { - copy(data.Caches[i:], data.Caches[i+1:]) - data.Caches[len(data.Caches)-1] = nil - data.Caches = data.Caches[:len(data.Caches)-1] - } -} - -func findCache(id string) (int, Cache) { - for i, c := range data.Caches { - if c.ID() == id { - return i, c - } - } - return -1, nil -} - -func getCache(r *http.Request) interface{} { - mu.Lock() - defer mu.Unlock() - id := path.Base(r.URL.Path) - result := struct { - Cache - Sessions []Session - }{} - _, result.Cache = findCache(id) - - // now find all the views that belong to this session - for _, v := range data.Sessions { - if v.Cache().ID() == id { - result.Sessions = append(result.Sessions, v) - } - } - return result -} - -func findSession(id string) Session { - for _, c := range data.Sessions { - if c.ID() == id { - return c - } - } - return nil -} - -func getSession(r *http.Request) interface{} { - mu.Lock() - defer mu.Unlock() - id := path.Base(r.URL.Path) - result := struct { - Session - Views []View - }{ - Session: findSession(id), - } - // now find all the views that belong to this session - for _, v := range data.Views { - if v.Session().ID() == id { - result.Views = append(result.Views, v) - } - } - return result -} - -func findView(id string) View { - for _, c := range data.Views { - if c.ID() == id { - return c - } - } - return nil -} - -func getView(r *http.Request) interface{} { - mu.Lock() - defer mu.Unlock() - id := path.Base(r.URL.Path) - return findView(id) -} - -func getFile(r *http.Request) interface{} { - mu.Lock() - defer mu.Unlock() - hash := path.Base(r.URL.Path) - sid := path.Base(path.Dir(r.URL.Path)) - session := findSession(sid) - return session.File(hash) -} - -func getInfo(r *http.Request) interface{} { - buf := &bytes.Buffer{} - PrintVersionInfo(buf, true, HTML) - return template.HTML(buf.String()) -} - -func getMemory(r *http.Request) interface{} { - var m runtime.MemStats - runtime.ReadMemStats(&m) - return m -} - -// AddSession adds a session to the set being served -func AddSession(session Session) { - mu.Lock() - defer mu.Unlock() - data.Sessions = append(data.Sessions, session) -} - -// DropSession drops a session from the set being served -func DropSession(session Session) { - mu.Lock() - defer mu.Unlock() - //find and remove the session -} - -// AddView adds a view to the set being served -func AddView(view View) { - mu.Lock() - defer mu.Unlock() - data.Views = append(data.Views, view) -} - -// DropView drops a view from the set being served -func DropView(view View) { - mu.Lock() - defer mu.Unlock() - //find and remove the view -} - -// Serve starts and runs a debug server in the background. -// It also logs the port the server starts on, to allow for :0 auto assigned -// ports. -func Serve(ctx context.Context, addr string) error { - mu.Lock() - defer mu.Unlock() - if addr == "" { - return nil - } - listener, err := net.Listen("tcp", addr) - if err != nil { - return err - } - log.Print(ctx, "Debug serving", tag.Of("Port", listener.Addr().(*net.TCPAddr).Port)) - prometheus := prometheus.New() - rpcs := &rpcs{} - traces := &traces{} - export.AddExporters(prometheus, rpcs, traces) - go func() { - mux := http.NewServeMux() - mux.HandleFunc("/", Render(mainTmpl, func(*http.Request) interface{} { return data })) - mux.HandleFunc("/debug/", Render(debugTmpl, nil)) - mux.HandleFunc("/debug/pprof/", pprof.Index) - mux.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline) - mux.HandleFunc("/debug/pprof/profile", pprof.Profile) - mux.HandleFunc("/debug/pprof/symbol", pprof.Symbol) - mux.HandleFunc("/debug/pprof/trace", pprof.Trace) - mux.HandleFunc("/metrics/", prometheus.Serve) - mux.HandleFunc("/rpc/", Render(rpcTmpl, rpcs.getData)) - mux.HandleFunc("/trace/", Render(traceTmpl, traces.getData)) - mux.HandleFunc("/cache/", Render(cacheTmpl, getCache)) - mux.HandleFunc("/session/", Render(sessionTmpl, getSession)) - mux.HandleFunc("/view/", Render(viewTmpl, getView)) - mux.HandleFunc("/file/", Render(fileTmpl, getFile)) - mux.HandleFunc("/info", Render(infoTmpl, getInfo)) - mux.HandleFunc("/memory", Render(memoryTmpl, getMemory)) - if err := http.Serve(listener, mux); err != nil { - log.Error(ctx, "Debug server failed", err) - return - } - log.Print(ctx, "Debug server finished") - }() - return nil -} - -func Render(tmpl *template.Template, fun func(*http.Request) interface{}) func(http.ResponseWriter, *http.Request) { - return func(w http.ResponseWriter, r *http.Request) { - var data interface{} - if fun != nil { - data = fun(r) - } - if err := tmpl.Execute(w, data); err != nil { - log.Error(context.Background(), "", err) - } - } -} - -func commas(s string) string { - for i := len(s); i > 3; { - i -= 3 - s = s[:i] + "," + s[i:] - } - return s -} - -func fuint64(v uint64) string { - return commas(strconv.FormatUint(v, 10)) -} - -func fuint32(v uint32) string { - return commas(strconv.FormatUint(uint64(v), 10)) -} - -var BaseTemplate = template.Must(template.New("").Parse(` - - -{{template "title" .}} - -{{block "head" .}}{{end}} - - -Main -Info -Memory -Metrics -RPC -Trace -
        -

        {{template "title" .}}

        -{{block "body" .}} -Unknown page -{{end}} - - - -{{define "cachelink"}}Cache {{.}}{{end}} -{{define "sessionlink"}}Session {{.}}{{end}} -{{define "viewlink"}}View {{.}}{{end}} -{{define "filelink"}}{{.URI}}{{end}} -`)).Funcs(template.FuncMap{ - "fuint64": fuint64, - "fuint32": fuint32, -}) - -var mainTmpl = template.Must(template.Must(BaseTemplate.Clone()).Parse(` -{{define "title"}}GoPls server information{{end}} -{{define "body"}} -

        Caches

        -
          {{range .Caches}}
        • {{template "cachelink" .ID}}
        • {{end}}
        -

        Sessions

        -
          {{range .Sessions}}
        • {{template "sessionlink" .ID}} from {{template "cachelink" .Cache.ID}}
        • {{end}}
        -

        Views

        -
          {{range .Views}}
        • {{.Name}} is {{template "viewlink" .ID}} from {{template "sessionlink" .Session.ID}} in {{.Folder}}
        • {{end}}
        -{{end}} -`)) - -var infoTmpl = template.Must(template.Must(BaseTemplate.Clone()).Parse(` -{{define "title"}}GoPls version information{{end}} -{{define "body"}} -{{.}} -{{end}} -`)) - -var memoryTmpl = template.Must(template.Must(BaseTemplate.Clone()).Parse(` -{{define "title"}}GoPls memory usage{{end}} -{{define "head"}}{{end}} -{{define "body"}} -

        Stats

        - - - - - - - - - - - - - - - - -
        Allocated bytes{{fuint64 .HeapAlloc}}
        Total allocated bytes{{fuint64 .TotalAlloc}}
        System bytes{{fuint64 .Sys}}
        Heap system bytes{{fuint64 .HeapSys}}
        Malloc calls{{fuint64 .Mallocs}}
        Frees{{fuint64 .Frees}}
        Idle heap bytes{{fuint64 .HeapIdle}}
        In use bytes{{fuint64 .HeapInuse}}
        Released to system bytes{{fuint64 .HeapReleased}}
        Heap object count{{fuint64 .HeapObjects}}
        Stack in use bytes{{fuint64 .StackInuse}}
        Stack from system bytes{{fuint64 .StackSys}}
        Bucket hash bytes{{fuint64 .BuckHashSys}}
        GC metadata bytes{{fuint64 .GCSys}}
        Off heap bytes{{fuint64 .OtherSys}}
        -

        By size

        - - -{{range .BySize}}{{end}} -
        SizeMallocsFrees
        {{fuint32 .Size}}{{fuint64 .Mallocs}}{{fuint64 .Frees}}
        -{{end}} -`)) - -var debugTmpl = template.Must(template.Must(BaseTemplate.Clone()).Parse(` -{{define "title"}}GoPls Debug pages{{end}} -{{define "body"}} -Profiling -{{end}} -`)) - -var cacheTmpl = template.Must(template.Must(BaseTemplate.Clone()).Parse(` -{{define "title"}}Cache {{.ID}}{{end}} -{{define "body"}} -

        Sessions

        -
          {{range .Sessions}}
        • {{template "sessionlink" .ID}}
        • {{end}}
        -{{end}} -`)) - -var sessionTmpl = template.Must(template.Must(BaseTemplate.Clone()).Parse(` -{{define "title"}}Session {{.ID}}{{end}} -{{define "body"}} -From: {{template "cachelink" .Cache.ID}}
        -

        Views

        -
          {{range .Views}}
        • {{.Name}} is {{template "viewlink" .ID}} in {{.Folder}}
        • {{end}}
        -

        Files

        -
          {{range .Files}}
        • {{template "filelink" .}}
        • {{end}}
        -{{end}} -`)) - -var viewTmpl = template.Must(template.Must(BaseTemplate.Clone()).Parse(` -{{define "title"}}View {{.ID}}{{end}} -{{define "body"}} -Name: {{.Name}}
        -Folder: {{.Folder}}
        -From: {{template "sessionlink" .Session.ID}}
        -

        Environment

        -
          {{range .Env}}
        • {{.}}
        • {{end}}
        -{{end}} -`)) - -var fileTmpl = template.Must(template.Must(BaseTemplate.Clone()).Parse(` -{{define "title"}}File {{.Hash}}{{end}} -{{define "body"}} -From: {{template "sessionlink" .Session.ID}}
        -URI: {{.URI}}
        -Hash: {{.Hash}}
        -Error: {{.Error}}
        -

        Contents

        -
        {{.Data}}
        -{{end}} -`)) diff --git a/vendor/golang.org/x/tools/internal/lsp/debug/trace.go b/vendor/golang.org/x/tools/internal/lsp/debug/trace.go deleted file mode 100644 index 4fd3de45f..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/debug/trace.go +++ /dev/null @@ -1,171 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package debug - -import ( - "bytes" - "context" - "fmt" - "html/template" - "net/http" - "sort" - "strings" - "time" - - "golang.org/x/tools/internal/telemetry" -) - -var traceTmpl = template.Must(template.Must(BaseTemplate.Clone()).Parse(` -{{define "title"}}Trace Information{{end}} -{{define "body"}} - {{range .Traces}}{{.Name}} last: {{.Last.Duration}}, longest: {{.Longest.Duration}}
        {{end}} - {{if .Selected}} -

        {{.Selected.Name}}

        - {{if .Selected.Last}}

        Last

          {{template "details" .Selected.Last}}
        {{end}} - {{if .Selected.Longest}}

        Longest

          {{template "details" .Selected.Longest}}
        {{end}} - {{end}} -{{end}} -{{define "details"}} -
      • {{.Offset}} {{.Name}} {{.Duration}} {{.Tags}}
      • - {{if .Events}}
          {{range .Events}}
        • {{.Offset}} {{.Tags}}
        • {{end}}
        {{end}} - {{if .Children}}
          {{range .Children}}{{template "details" .}}{{end}}
        {{end}} -{{end}} -`)) - -type traces struct { - sets map[string]*traceSet - unfinished map[telemetry.SpanContext]*traceData -} - -type traceResults struct { - Traces []*traceSet - Selected *traceSet -} - -type traceSet struct { - Name string - Last *traceData - Longest *traceData -} - -type traceData struct { - TraceID telemetry.TraceID - SpanID telemetry.SpanID - ParentID telemetry.SpanID - Name string - Start time.Time - Finish time.Time - Offset time.Duration - Duration time.Duration - Tags string - Events []traceEvent - Children []*traceData -} - -type traceEvent struct { - Time time.Time - Offset time.Duration - Tags string -} - -func (t *traces) StartSpan(ctx context.Context, span *telemetry.Span) { - if t.sets == nil { - t.sets = make(map[string]*traceSet) - t.unfinished = make(map[telemetry.SpanContext]*traceData) - } - // just starting, add it to the unfinished map - td := &traceData{ - TraceID: span.ID.TraceID, - SpanID: span.ID.SpanID, - ParentID: span.ParentID, - Name: span.Name, - Start: span.Start, - Tags: renderTags(span.Tags), - } - t.unfinished[span.ID] = td - // and wire up parents if we have them - if !span.ParentID.IsValid() { - return - } - parentID := telemetry.SpanContext{TraceID: span.ID.TraceID, SpanID: span.ParentID} - parent, found := t.unfinished[parentID] - if !found { - // trace had an invalid parent, so it cannot itself be valid - return - } - parent.Children = append(parent.Children, td) -} - -func (t *traces) FinishSpan(ctx context.Context, span *telemetry.Span) { - // finishing, must be already in the map - td, found := t.unfinished[span.ID] - if !found { - return // if this happens we are in a bad place - } - delete(t.unfinished, span.ID) - - td.Finish = span.Finish - td.Duration = span.Finish.Sub(span.Start) - td.Events = make([]traceEvent, len(span.Events)) - for i, event := range span.Events { - td.Events[i] = traceEvent{ - Time: event.At, - Tags: renderTags(event.Tags), - } - } - - set, ok := t.sets[span.Name] - if !ok { - set = &traceSet{Name: span.Name} - t.sets[span.Name] = set - } - set.Last = td - if set.Longest == nil || set.Last.Duration > set.Longest.Duration { - set.Longest = set.Last - } - if !td.ParentID.IsValid() { - fillOffsets(td, td.Start) - } -} - -func (t *traces) Log(ctx context.Context, event telemetry.Event) {} - -func (t *traces) Metric(ctx context.Context, data telemetry.MetricData) {} - -func (t *traces) Flush() {} - -func (t *traces) getData(req *http.Request) interface{} { - if len(t.sets) == 0 { - return nil - } - data := traceResults{} - data.Traces = make([]*traceSet, 0, len(t.sets)) - for _, set := range t.sets { - data.Traces = append(data.Traces, set) - } - sort.Slice(data.Traces, func(i, j int) bool { return data.Traces[i].Name < data.Traces[j].Name }) - if bits := strings.SplitN(req.URL.Path, "/trace/", 2); len(bits) > 1 { - data.Selected = t.sets[bits[1]] - } - return data -} - -func fillOffsets(td *traceData, start time.Time) { - td.Offset = td.Start.Sub(start) - for i := range td.Events { - td.Events[i].Offset = td.Events[i].Time.Sub(start) - } - for _, child := range td.Children { - fillOffsets(child, start) - } -} - -func renderTags(tags telemetry.TagList) string { - buf := &bytes.Buffer{} - for _, tag := range tags { - fmt.Fprintf(buf, "%v=%q ", tag.Key, tag.Value) - } - return buf.String() -} diff --git a/vendor/golang.org/x/tools/internal/lsp/definition.go b/vendor/golang.org/x/tools/internal/lsp/definition.go deleted file mode 100644 index f8f18df9e..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/definition.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package lsp - -import ( - "context" - - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" -) - -func (s *Server) definition(ctx context.Context, params *protocol.DefinitionParams) ([]protocol.Location, error) { - uri := span.NewURI(params.TextDocument.URI) - view := s.session.ViewOf(uri) - f, err := view.GetFile(ctx, uri) - if err != nil { - return nil, err - } - ident, err := source.Identifier(ctx, view, f, params.Position) - if err != nil { - return nil, err - } - decRange, err := ident.Declaration.Range() - if err != nil { - return nil, err - } - return []protocol.Location{ - { - URI: protocol.NewURI(ident.Declaration.URI()), - Range: decRange, - }, - }, nil -} - -func (s *Server) typeDefinition(ctx context.Context, params *protocol.TypeDefinitionParams) ([]protocol.Location, error) { - uri := span.NewURI(params.TextDocument.URI) - view := s.session.ViewOf(uri) - f, err := view.GetFile(ctx, uri) - if err != nil { - return nil, err - } - ident, err := source.Identifier(ctx, view, f, params.Position) - if err != nil { - return nil, err - } - identRange, err := ident.Type.Range() - if err != nil { - return nil, err - } - return []protocol.Location{ - { - URI: protocol.NewURI(ident.Type.URI()), - Range: identRange, - }, - }, nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/diagnostics.go b/vendor/golang.org/x/tools/internal/lsp/diagnostics.go deleted file mode 100644 index 2b68f7cb4..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/diagnostics.go +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package lsp - -import ( - "context" - "strings" - - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/lsp/telemetry" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/telemetry/log" - "golang.org/x/tools/internal/telemetry/trace" -) - -func (s *Server) diagnostics(view source.View, uri span.URI) error { - ctx := view.BackgroundContext() - ctx, done := trace.StartSpan(ctx, "lsp:background-worker") - defer done() - - ctx = telemetry.File.With(ctx, uri) - - f, err := view.GetFile(ctx, uri) - if err != nil { - return err - } - reports, warningMsg, err := source.Diagnostics(ctx, view, f, view.Options().DisabledAnalyses) - if err != nil { - return err - } - if warningMsg != "" { - s.client.ShowMessage(ctx, &protocol.ShowMessageParams{ - Type: protocol.Info, - Message: warningMsg, - }) - } - - s.undeliveredMu.Lock() - defer s.undeliveredMu.Unlock() - - for uri, diagnostics := range reports { - if err := s.publishDiagnostics(ctx, uri, diagnostics); err != nil { - if s.undelivered == nil { - s.undelivered = make(map[span.URI][]source.Diagnostic) - } - s.undelivered[uri] = diagnostics - - log.Error(ctx, "failed to deliver diagnostic (will retry)", err, telemetry.File) - continue - } - // In case we had old, undelivered diagnostics. - delete(s.undelivered, uri) - } - // Anytime we compute diagnostics, make sure to also send along any - // undelivered ones (only for remaining URIs). - for uri, diagnostics := range s.undelivered { - if err := s.publishDiagnostics(ctx, uri, diagnostics); err != nil { - log.Error(ctx, "failed to deliver diagnostic for (will not retry)", err, telemetry.File) - } - - // If we fail to deliver the same diagnostics twice, just give up. - delete(s.undelivered, uri) - } - return nil -} - -func (s *Server) publishDiagnostics(ctx context.Context, uri span.URI, diagnostics []source.Diagnostic) error { - s.client.PublishDiagnostics(ctx, &protocol.PublishDiagnosticsParams{ - Diagnostics: toProtocolDiagnostics(ctx, diagnostics), - URI: protocol.NewURI(uri), - }) - return nil -} - -func toProtocolDiagnostics(ctx context.Context, diagnostics []source.Diagnostic) []protocol.Diagnostic { - reports := []protocol.Diagnostic{} - for _, diag := range diagnostics { - related := make([]protocol.DiagnosticRelatedInformation, 0, len(diag.Related)) - for _, rel := range diag.Related { - related = append(related, protocol.DiagnosticRelatedInformation{ - Location: protocol.Location{ - URI: protocol.NewURI(rel.URI), - Range: rel.Range, - }, - Message: rel.Message, - }) - } - reports = append(reports, protocol.Diagnostic{ - Message: strings.TrimSpace(diag.Message), // go list returns errors prefixed by newline - Range: diag.Range, - Severity: diag.Severity, - Source: diag.Source, - Tags: diag.Tags, - RelatedInformation: related, - }) - } - return reports -} diff --git a/vendor/golang.org/x/tools/internal/lsp/diff/diff.go b/vendor/golang.org/x/tools/internal/lsp/diff/diff.go deleted file mode 100644 index 5536c3b89..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/diff/diff.go +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package diff supports a pluggable diff algorithm. -package diff - -import ( - "sort" - "strings" - - "golang.org/x/tools/internal/span" -) - -// TextEdit represents a change to a section of a document. -// The text within the specified span should be replaced by the supplied new text. -type TextEdit struct { - Span span.Span - NewText string -} - -// ComputeEdits is the type for a function that produces a set of edits that -// convert from the before content to the after content. -type ComputeEdits func(uri span.URI, before, after string) []TextEdit - -// SortTextEdits attempts to order all edits by their starting points. -// The sort is stable so that edits with the same starting point will not -// be reordered. -func SortTextEdits(d []TextEdit) { - // Use a stable sort to maintain the order of edits inserted at the same position. - sort.SliceStable(d, func(i int, j int) bool { - return span.Compare(d[i].Span, d[j].Span) < 0 - }) -} - -// ApplyEdits applies the set of edits to the before and returns the resulting -// content. -// It may panic or produce garbage if the edits are not valid for the provided -// before content. -func ApplyEdits(before string, edits []TextEdit) string { - // Preconditions: - // - all of the edits apply to before - // - and all the spans for each TextEdit have the same URI - if len(edits) == 0 { - return before - } - _, edits, _ = prepareEdits(before, edits) - after := strings.Builder{} - last := 0 - for _, edit := range edits { - start := edit.Span.Start().Offset() - if start > last { - after.WriteString(before[last:start]) - last = start - } - after.WriteString(edit.NewText) - last = edit.Span.End().Offset() - } - if last < len(before) { - after.WriteString(before[last:]) - } - return after.String() -} - -// LineEdits takes a set of edits and expands and merges them as necessary -// to ensure that there are only full line edits left when it is done. -func LineEdits(before string, edits []TextEdit) []TextEdit { - if len(edits) == 0 { - return nil - } - c, edits, partial := prepareEdits(before, edits) - if partial { - edits = lineEdits(before, c, edits) - } - return edits -} - -// prepareEdits returns a sorted copy of the edits -func prepareEdits(before string, edits []TextEdit) (*span.TokenConverter, []TextEdit, bool) { - partial := false - c := span.NewContentConverter("", []byte(before)) - copied := make([]TextEdit, len(edits)) - for i, edit := range edits { - edit.Span, _ = edit.Span.WithAll(c) - copied[i] = edit - partial = partial || - edit.Span.Start().Offset() >= len(before) || - edit.Span.Start().Column() > 1 || edit.Span.End().Column() > 1 - } - SortTextEdits(copied) - return c, copied, partial -} - -// lineEdits rewrites the edits to always be full line edits -func lineEdits(before string, c *span.TokenConverter, edits []TextEdit) []TextEdit { - adjusted := make([]TextEdit, 0, len(edits)) - current := TextEdit{Span: span.Invalid} - for _, edit := range edits { - if current.Span.IsValid() && edit.Span.Start().Line() <= current.Span.End().Line() { - // overlaps with the current edit, need to combine - // first get the gap from the previous edit - gap := before[current.Span.End().Offset():edit.Span.Start().Offset()] - // now add the text of this edit - current.NewText += gap + edit.NewText - // and then adjust the end position - current.Span = span.New(current.Span.URI(), current.Span.Start(), edit.Span.End()) - } else { - // does not overlap, add previous run (if there is one) - adjusted = addEdit(before, adjusted, current) - // and then remember this edit as the start of the next run - current = edit - } - } - // add the current pending run if there is one - return addEdit(before, adjusted, current) -} - -func addEdit(before string, edits []TextEdit, edit TextEdit) []TextEdit { - if !edit.Span.IsValid() { - return edits - } - // if edit is partial, expand it to full line now - start := edit.Span.Start() - end := edit.Span.End() - if start.Column() > 1 { - // prepend the text and adjust to start of line - delta := start.Column() - 1 - start = span.NewPoint(start.Line(), 1, start.Offset()-delta) - edit.Span = span.New(edit.Span.URI(), start, end) - edit.NewText = before[start.Offset():start.Offset()+delta] + edit.NewText - } - if start.Offset() >= len(before) && start.Line() > 1 && before[len(before)-1] != '\n' { - // after end of file that does not end in eol, so join to last line of file - // to do this we need to know where the start of the last line was - eol := strings.LastIndex(before, "\n") - if eol < 0 { - // file is one non terminated line - eol = 0 - } - delta := len(before) - eol - start = span.NewPoint(start.Line()-1, 1, start.Offset()-delta) - edit.Span = span.New(edit.Span.URI(), start, end) - edit.NewText = before[start.Offset():start.Offset()+delta] + edit.NewText - } - if end.Column() > 1 { - remains := before[end.Offset():] - eol := strings.IndexRune(remains, '\n') - if eol < 0 { - eol = len(remains) - } else { - eol++ - } - end = span.NewPoint(end.Line()+1, 1, end.Offset()+eol) - edit.Span = span.New(edit.Span.URI(), start, end) - edit.NewText = edit.NewText + remains[:eol] - } - edits = append(edits, edit) - return edits -} diff --git a/vendor/golang.org/x/tools/internal/lsp/diff/difftest/difftest.go b/vendor/golang.org/x/tools/internal/lsp/diff/difftest/difftest.go deleted file mode 100644 index 297515f9e..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/diff/difftest/difftest.go +++ /dev/null @@ -1,240 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package difftest supplies a set of tests that will operate on any -// implementation of a diff algorithm as exposed by -// "golang.org/x/tools/internal/lsp/diff" -package difftest - -import ( - "fmt" - "testing" - - "golang.org/x/tools/internal/lsp/diff" - "golang.org/x/tools/internal/span" -) - -const ( - FileA = "from" - FileB = "to" - UnifiedPrefix = "--- " + FileA + "\n+++ " + FileB + "\n" -) - -var TestCases = []struct { - Name, In, Out, Unified string - Edits, LineEdits []diff.TextEdit - NoDiff bool -}{{ - Name: "empty", - In: "", - Out: "", -}, { - Name: "no_diff", - In: "gargantuan\n", - Out: "gargantuan\n", -}, { - Name: "replace_all", - In: "fruit\n", - Out: "cheese\n", - Unified: UnifiedPrefix + ` -@@ -1 +1 @@ --fruit -+cheese -`[1:], - Edits: []diff.TextEdit{{Span: newSpan(0, 5), NewText: "cheese"}}, - LineEdits: []diff.TextEdit{{Span: newSpan(0, 6), NewText: "cheese\n"}}, -}, { - Name: "insert_rune", - In: "gord\n", - Out: "gourd\n", - Unified: UnifiedPrefix + ` -@@ -1 +1 @@ --gord -+gourd -`[1:], - Edits: []diff.TextEdit{{Span: newSpan(2, 2), NewText: "u"}}, - LineEdits: []diff.TextEdit{{Span: newSpan(0, 5), NewText: "gourd\n"}}, -}, { - Name: "delete_rune", - In: "groat\n", - Out: "goat\n", - Unified: UnifiedPrefix + ` -@@ -1 +1 @@ --groat -+goat -`[1:], - Edits: []diff.TextEdit{{Span: newSpan(1, 2), NewText: ""}}, - LineEdits: []diff.TextEdit{{Span: newSpan(0, 6), NewText: "goat\n"}}, -}, { - Name: "replace_rune", - In: "loud\n", - Out: "lord\n", - Unified: UnifiedPrefix + ` -@@ -1 +1 @@ --loud -+lord -`[1:], - Edits: []diff.TextEdit{{Span: newSpan(2, 3), NewText: "r"}}, - LineEdits: []diff.TextEdit{{Span: newSpan(0, 5), NewText: "lord\n"}}, -}, { - Name: "replace_partials", - In: "blanket\n", - Out: "bunker\n", - Unified: UnifiedPrefix + ` -@@ -1 +1 @@ --blanket -+bunker -`[1:], - Edits: []diff.TextEdit{ - {Span: newSpan(1, 3), NewText: "u"}, - {Span: newSpan(6, 7), NewText: "r"}, - }, - LineEdits: []diff.TextEdit{{Span: newSpan(0, 8), NewText: "bunker\n"}}, -}, { - Name: "insert_line", - In: "1: one\n3: three\n", - Out: "1: one\n2: two\n3: three\n", - Unified: UnifiedPrefix + ` -@@ -1,2 +1,3 @@ - 1: one -+2: two - 3: three -`[1:], - Edits: []diff.TextEdit{{Span: newSpan(7, 7), NewText: "2: two\n"}}, -}, { - Name: "replace_no_newline", - In: "A", - Out: "B", - Unified: UnifiedPrefix + ` -@@ -1 +1 @@ --A -\ No newline at end of file -+B -\ No newline at end of file -`[1:], - Edits: []diff.TextEdit{{Span: newSpan(0, 1), NewText: "B"}}, -}, { - Name: "add_end", - In: "A", - Out: "AB", - Unified: UnifiedPrefix + ` -@@ -1 +1 @@ --A -\ No newline at end of file -+AB -\ No newline at end of file -`[1:], - Edits: []diff.TextEdit{{Span: newSpan(1, 1), NewText: "B"}}, - LineEdits: []diff.TextEdit{{Span: newSpan(0, 1), NewText: "AB"}}, -}, { - Name: "add_newline", - In: "A", - Out: "A\n", - Unified: UnifiedPrefix + ` -@@ -1 +1 @@ --A -\ No newline at end of file -+A -`[1:], - Edits: []diff.TextEdit{{Span: newSpan(1, 1), NewText: "\n"}}, - LineEdits: []diff.TextEdit{{Span: newSpan(0, 1), NewText: "A\n"}}, -}, { - Name: "delete_front", - In: "A\nB\nC\nA\nB\nB\nA\n", - Out: "C\nB\nA\nB\nA\nC\n", - Unified: UnifiedPrefix + ` -@@ -1,7 +1,6 @@ --A --B - C -+B - A - B --B - A -+C -`[1:], - Edits: []diff.TextEdit{ - {Span: newSpan(0, 4), NewText: ""}, - {Span: newSpan(6, 6), NewText: "B\n"}, - {Span: newSpan(10, 12), NewText: ""}, - {Span: newSpan(14, 14), NewText: "C\n"}, - }, - NoDiff: true, // diff algorithm produces different delete/insert pattern -}, - { - Name: "replace_last_line", - In: "A\nB\n", - Out: "A\nC\n\n", - Unified: UnifiedPrefix + ` -@@ -1,2 +1,3 @@ - A --B -+C -+ -`[1:], - Edits: []diff.TextEdit{{Span: newSpan(2, 3), NewText: "C\n"}}, - LineEdits: []diff.TextEdit{{Span: newSpan(2, 4), NewText: "C\n\n"}}, - }, - { - Name: "mulitple_replace", - In: "A\nB\nC\nD\nE\nF\nG\n", - Out: "A\nH\nI\nJ\nE\nF\nK\n", - Unified: UnifiedPrefix + ` -@@ -1,7 +1,7 @@ - A --B --C --D -+H -+I -+J - E - F --G -+K -`[1:], - Edits: []diff.TextEdit{ - {Span: newSpan(2, 8), NewText: "H\nI\nJ\n"}, - {Span: newSpan(12, 14), NewText: "K\n"}, - }, - NoDiff: true, // diff algorithm produces different delete/insert pattern - }, -} - -func init() { - // expand all the spans to full versions - // we need them all to have their line number and column - for _, tc := range TestCases { - c := span.NewContentConverter("", []byte(tc.In)) - for i := range tc.Edits { - tc.Edits[i].Span, _ = tc.Edits[i].Span.WithAll(c) - } - for i := range tc.LineEdits { - tc.LineEdits[i].Span, _ = tc.LineEdits[i].Span.WithAll(c) - } - } -} - -func DiffTest(t *testing.T, compute diff.ComputeEdits) { - t.Helper() - for _, test := range TestCases { - t.Run(test.Name, func(t *testing.T) { - t.Helper() - edits := compute(span.FileURI("/"+test.Name), test.In, test.Out) - got := diff.ApplyEdits(test.In, edits) - unified := fmt.Sprint(diff.ToUnified(FileA, FileB, test.In, edits)) - if got != test.Out { - t.Errorf("got patched:\n%v\nfrom diff:\n%v\nexpected:\n%v", got, unified, test.Out) - } - if !test.NoDiff && unified != test.Unified { - t.Errorf("got diff:\n%v\nexpected:\n%v", unified, test.Unified) - } - }) - } -} - -func newSpan(start, end int) span.Span { - return span.New("", span.NewPoint(0, 0, start), span.NewPoint(0, 0, end)) -} diff --git a/vendor/golang.org/x/tools/internal/lsp/diff/myers/diff.go b/vendor/golang.org/x/tools/internal/lsp/diff/myers/diff.go deleted file mode 100644 index c50e33a80..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/diff/myers/diff.go +++ /dev/null @@ -1,205 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package myers implements the Myers diff algorithm. -package myers - -import ( - "strings" - - "golang.org/x/tools/internal/lsp/diff" - "golang.org/x/tools/internal/span" -) - -// Sources: -// https://blog.jcoglan.com/2017/02/17/the-myers-diff-algorithm-part-3/ -// https://www.codeproject.com/Articles/42279/%2FArticles%2F42279%2FInvestigating-Myers-diff-algorithm-Part-1-of-2 - -func ComputeEdits(uri span.URI, before, after string) []diff.TextEdit { - ops := operations(splitLines(before), splitLines(after)) - edits := make([]diff.TextEdit, 0, len(ops)) - for _, op := range ops { - s := span.New(uri, span.NewPoint(op.I1+1, 1, 0), span.NewPoint(op.I2+1, 1, 0)) - switch op.Kind { - case diff.Delete: - // Delete: unformatted[i1:i2] is deleted. - edits = append(edits, diff.TextEdit{Span: s}) - case diff.Insert: - // Insert: formatted[j1:j2] is inserted at unformatted[i1:i1]. - if content := strings.Join(op.Content, ""); content != "" { - edits = append(edits, diff.TextEdit{Span: s, NewText: content}) - } - } - } - return edits -} - -type operation struct { - Kind diff.OpKind - Content []string // content from b - I1, I2 int // indices of the line in a - J1 int // indices of the line in b, J2 implied by len(Content) -} - -// operations returns the list of operations to convert a into b, consolidating -// operations for multiple lines and not including equal lines. -func operations(a, b []string) []*operation { - if len(a) == 0 && len(b) == 0 { - return nil - } - - trace, offset := shortestEditSequence(a, b) - snakes := backtrack(trace, len(a), len(b), offset) - - M, N := len(a), len(b) - - var i int - solution := make([]*operation, len(a)+len(b)) - - add := func(op *operation, i2, j2 int) { - if op == nil { - return - } - op.I2 = i2 - if op.Kind == diff.Insert { - op.Content = b[op.J1:j2] - } - solution[i] = op - i++ - } - x, y := 0, 0 - for _, snake := range snakes { - if len(snake) < 2 { - continue - } - var op *operation - // delete (horizontal) - for snake[0]-snake[1] > x-y { - if op == nil { - op = &operation{ - Kind: diff.Delete, - I1: x, - J1: y, - } - } - x++ - if x == M { - break - } - } - add(op, x, y) - op = nil - // insert (vertical) - for snake[0]-snake[1] < x-y { - if op == nil { - op = &operation{ - Kind: diff.Insert, - I1: x, - J1: y, - } - } - y++ - } - add(op, x, y) - op = nil - // equal (diagonal) - for x < snake[0] { - x++ - y++ - } - if x >= M && y >= N { - break - } - } - return solution[:i] -} - -// backtrack uses the trace for the edit sequence computation and returns the -// "snakes" that make up the solution. A "snake" is a single deletion or -// insertion followed by zero or diagonals. -func backtrack(trace [][]int, x, y, offset int) [][]int { - snakes := make([][]int, len(trace)) - d := len(trace) - 1 - for ; x > 0 && y > 0 && d > 0; d-- { - V := trace[d] - if len(V) == 0 { - continue - } - snakes[d] = []int{x, y} - - k := x - y - - var kPrev int - if k == -d || (k != d && V[k-1+offset] < V[k+1+offset]) { - kPrev = k + 1 - } else { - kPrev = k - 1 - } - - x = V[kPrev+offset] - y = x - kPrev - } - if x < 0 || y < 0 { - return snakes - } - snakes[d] = []int{x, y} - return snakes -} - -// shortestEditSequence returns the shortest edit sequence that converts a into b. -func shortestEditSequence(a, b []string) ([][]int, int) { - M, N := len(a), len(b) - V := make([]int, 2*(N+M)+1) - offset := N + M - trace := make([][]int, N+M+1) - - // Iterate through the maximum possible length of the SES (N+M). - for d := 0; d <= N+M; d++ { - copyV := make([]int, len(V)) - // k lines are represented by the equation y = x - k. We move in - // increments of 2 because end points for even d are on even k lines. - for k := -d; k <= d; k += 2 { - // At each point, we either go down or to the right. We go down if - // k == -d, and we go to the right if k == d. We also prioritize - // the maximum x value, because we prefer deletions to insertions. - var x int - if k == -d || (k != d && V[k-1+offset] < V[k+1+offset]) { - x = V[k+1+offset] // down - } else { - x = V[k-1+offset] + 1 // right - } - - y := x - k - - // Diagonal moves while we have equal contents. - for x < M && y < N && a[x] == b[y] { - x++ - y++ - } - - V[k+offset] = x - - // Return if we've exceeded the maximum values. - if x == M && y == N { - // Makes sure to save the state of the array before returning. - copy(copyV, V) - trace[d] = copyV - return trace, offset - } - } - - // Save the state of the array. - copy(copyV, V) - trace[d] = copyV - } - return nil, 0 -} - -func splitLines(text string) []string { - lines := strings.SplitAfter(text, "\n") - if lines[len(lines)-1] == "" { - lines = lines[:len(lines)-1] - } - return lines -} diff --git a/vendor/golang.org/x/tools/internal/lsp/diff/unified.go b/vendor/golang.org/x/tools/internal/lsp/diff/unified.go deleted file mode 100644 index b2e630eff..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/diff/unified.go +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package diff - -import ( - "fmt" - "strings" -) - -// Unified represents a set of edits as a unified diff. -type Unified struct { - // From is the name of the original file. - From string - // To is the name of the modified file. - To string - // Hunks is the set of edit hunks needed to transform the file content. - Hunks []*Hunk -} - -// Hunk represents a contiguous set of line edits to apply. -type Hunk struct { - // The line in the original source where the hunk starts. - FromLine int - // The line in the original source where the hunk finishes. - ToLine int - // The set of line based edits to apply. - Lines []Line -} - -// Line represents a single line operation to apply as part of a Hunk. -type Line struct { - // Kind is the type of line this represents, deletion, insertion or copy. - Kind OpKind - // Content is the content of this line. - // For deletion it is the line being removed, for all others it is the line - // to put in the output. - Content string -} - -// OpKind is used to denote the type of operation a line represents. -type OpKind int - -const ( - // Delete is the operation kind for a line that is present in the input - // but not in the output. - Delete OpKind = iota - // Insert is the operation kind for a line that is new in the output. - Insert - // Equal is the operation kind for a line that is the same in the input and - // output, often used to provide context around edited lines. - Equal -) - -// String returns a human readable representation of an OpKind. It is not -// intended for machine processing. -func (k OpKind) String() string { - switch k { - case Delete: - return "delete" - case Insert: - return "insert" - case Equal: - return "equal" - default: - panic("unknown operation kind") - } -} - -const ( - edge = 3 - gap = edge * 2 -) - -// ToUnified takes a file contents and a sequence of edits, and calculates -// a unified diff that represents those edits. -func ToUnified(from, to string, content string, edits []TextEdit) Unified { - u := Unified{ - From: from, - To: to, - } - if len(edits) == 0 { - return u - } - c, edits, partial := prepareEdits(content, edits) - if partial { - edits = lineEdits(content, c, edits) - } - lines := splitLines(content) - var h *Hunk - last := 0 - toLine := 0 - for _, edit := range edits { - start := edit.Span.Start().Line() - 1 - end := edit.Span.End().Line() - 1 - switch { - case h != nil && start == last: - //direct extension - case h != nil && start <= last+gap: - //within range of previous lines, add the joiners - addEqualLines(h, lines, last, start) - default: - //need to start a new hunk - if h != nil { - // add the edge to the previous hunk - addEqualLines(h, lines, last, last+edge) - u.Hunks = append(u.Hunks, h) - } - toLine += start - last - h = &Hunk{ - FromLine: start + 1, - ToLine: toLine + 1, - } - // add the edge to the new hunk - delta := addEqualLines(h, lines, start-edge, start) - h.FromLine -= delta - h.ToLine -= delta - } - last = start - for i := start; i < end; i++ { - h.Lines = append(h.Lines, Line{Kind: Delete, Content: lines[i]}) - last++ - } - if edit.NewText != "" { - for _, line := range splitLines(edit.NewText) { - h.Lines = append(h.Lines, Line{Kind: Insert, Content: line}) - toLine++ - } - } - } - if h != nil { - // add the edge to the final hunk - addEqualLines(h, lines, last, last+edge) - u.Hunks = append(u.Hunks, h) - } - return u -} - -func splitLines(text string) []string { - lines := strings.SplitAfter(text, "\n") - if lines[len(lines)-1] == "" { - lines = lines[:len(lines)-1] - } - return lines -} - -func addEqualLines(h *Hunk, lines []string, start, end int) int { - delta := 0 - for i := start; i < end; i++ { - if i < 0 { - continue - } - if i >= len(lines) { - return delta - } - h.Lines = append(h.Lines, Line{Kind: Equal, Content: lines[i]}) - delta++ - } - return delta -} - -// Format converts a unified diff to the standard textual form for that diff. -// The output of this function can be passed to tools like patch. -func (u Unified) Format(f fmt.State, r rune) { - if len(u.Hunks) == 0 { - return - } - fmt.Fprintf(f, "--- %s\n", u.From) - fmt.Fprintf(f, "+++ %s\n", u.To) - for _, hunk := range u.Hunks { - fromCount, toCount := 0, 0 - for _, l := range hunk.Lines { - switch l.Kind { - case Delete: - fromCount++ - case Insert: - toCount++ - default: - fromCount++ - toCount++ - } - } - fmt.Fprint(f, "@@") - if fromCount > 1 { - fmt.Fprintf(f, " -%d,%d", hunk.FromLine, fromCount) - } else { - fmt.Fprintf(f, " -%d", hunk.FromLine) - } - if toCount > 1 { - fmt.Fprintf(f, " +%d,%d", hunk.ToLine, toCount) - } else { - fmt.Fprintf(f, " +%d", hunk.ToLine) - } - fmt.Fprint(f, " @@\n") - for _, l := range hunk.Lines { - switch l.Kind { - case Delete: - fmt.Fprintf(f, "-%s", l.Content) - case Insert: - fmt.Fprintf(f, "+%s", l.Content) - default: - fmt.Fprintf(f, " %s", l.Content) - } - if !strings.HasSuffix(l.Content, "\n") { - fmt.Fprintf(f, "\n\\ No newline at end of file\n") - } - } - } -} diff --git a/vendor/golang.org/x/tools/internal/lsp/folding_range.go b/vendor/golang.org/x/tools/internal/lsp/folding_range.go deleted file mode 100644 index d0eecc49a..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/folding_range.go +++ /dev/null @@ -1,41 +0,0 @@ -package lsp - -import ( - "context" - - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" -) - -func (s *Server) foldingRange(ctx context.Context, params *protocol.FoldingRangeParams) ([]protocol.FoldingRange, error) { - uri := span.NewURI(params.TextDocument.URI) - view := s.session.ViewOf(uri) - f, err := view.GetFile(ctx, uri) - if err != nil { - return nil, err - } - ranges, err := source.FoldingRange(ctx, view, f, view.Options().LineFoldingOnly) - if err != nil { - return nil, err - } - return toProtocolFoldingRanges(ranges) -} - -func toProtocolFoldingRanges(ranges []*source.FoldingRangeInfo) ([]protocol.FoldingRange, error) { - result := make([]protocol.FoldingRange, 0, len(ranges)) - for _, info := range ranges { - rng, err := info.Range() - if err != nil { - return nil, err - } - result = append(result, protocol.FoldingRange{ - StartLine: rng.Start.Line, - StartCharacter: rng.Start.Character, - EndLine: rng.End.Line, - EndCharacter: rng.End.Character, - Kind: string(info.Kind), - }) - } - return result, nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/format.go b/vendor/golang.org/x/tools/internal/lsp/format.go deleted file mode 100644 index 33e9b8d63..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/format.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package lsp - -import ( - "context" - - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" -) - -func (s *Server) formatting(ctx context.Context, params *protocol.DocumentFormattingParams) ([]protocol.TextEdit, error) { - uri := span.NewURI(params.TextDocument.URI) - view := s.session.ViewOf(uri) - f, err := view.GetFile(ctx, uri) - if err != nil { - return nil, err - } - return source.Format(ctx, view, f) -} diff --git a/vendor/golang.org/x/tools/internal/lsp/fuzzy/input.go b/vendor/golang.org/x/tools/internal/lsp/fuzzy/input.go deleted file mode 100644 index ac377035e..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/fuzzy/input.go +++ /dev/null @@ -1,168 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package fuzzy - -import ( - "unicode" -) - -// RuneRole specifies the role of a rune in the context of an input. -type RuneRole byte - -const ( - // RNone specifies a rune without any role in the input (i.e., whitespace/non-ASCII). - RNone RuneRole = iota - // RSep specifies a rune with the role of segment separator. - RSep - // RTail specifies a rune which is a lower-case tail in a word in the input. - RTail - // RUCTail specifies a rune which is an upper-case tail in a word in the input. - RUCTail - // RHead specifies a rune which is the first character in a word in the input. - RHead -) - -// RuneRoles detects the roles of each byte rune in an input string and stores it in the output -// slice. The rune role depends on the input type. Stops when it parsed all the runes in the string -// or when it filled the output. If output is nil, then it gets created. -func RuneRoles(str string, reuse []RuneRole) []RuneRole { - var output []RuneRole - if cap(reuse) < len(str) { - output = make([]RuneRole, 0, len(str)) - } else { - output = reuse[:0] - } - - prev, prev2 := rtNone, rtNone - for i := 0; i < len(str); i++ { - r := rune(str[i]) - - role := RNone - - curr := rtLower - if str[i] <= unicode.MaxASCII { - curr = runeType(rt[str[i]] - '0') - } - - if curr == rtLower { - if prev == rtNone || prev == rtPunct { - role = RHead - } else { - role = RTail - } - } else if curr == rtUpper { - role = RHead - - if prev == rtUpper { - // This and previous characters are both upper case. - - if i+1 == len(str) { - // This is last character, previous was also uppercase -> this is UCTail - // i.e., (current char is C): aBC / BC / ABC - role = RUCTail - } - } - } else if curr == rtPunct { - switch r { - case '.', ':': - role = RSep - } - } - if curr != rtLower { - if i > 1 && output[i-1] == RHead && prev2 == rtUpper && (output[i-2] == RHead || output[i-2] == RUCTail) { - // The previous two characters were uppercase. The current one is not a lower case, so the - // previous one can't be a HEAD. Make it a UCTail. - // i.e., (last char is current char - B must be a UCTail): ABC / ZABC / AB. - output[i-1] = RUCTail - } - } - - output = append(output, role) - prev2 = prev - prev = curr - } - return output -} - -type runeType byte - -const ( - rtNone runeType = iota - rtPunct - rtLower - rtUpper -) - -const rt = "00000000000000000000000000000000000000000000001122222222221000000333333333333333333333333330000002222222222222222222222222200000" - -// LastSegment returns the substring representing the last segment from the input, where each -// byte has an associated RuneRole in the roles slice. This makes sense only for inputs of Symbol -// or Filename type. -func LastSegment(input string, roles []RuneRole) string { - // Exclude ending separators. - end := len(input) - 1 - for end >= 0 && roles[end] == RSep { - end-- - } - if end < 0 { - return "" - } - - start := end - 1 - for start >= 0 && roles[start] != RSep { - start-- - } - - return input[start+1 : end+1] -} - -// ToLower transforms the input string to lower case, which is stored in the output byte slice. -// The lower casing considers only ASCII values - non ASCII values are left unmodified. -// Stops when parsed all input or when it filled the output slice. If output is nil, then it gets -// created. -func ToLower(input string, reuse []byte) []byte { - output := reuse - if cap(reuse) < len(input) { - output = make([]byte, len(input)) - } - - for i := 0; i < len(input); i++ { - r := rune(input[i]) - if r <= unicode.MaxASCII { - if 'A' <= r && r <= 'Z' { - r += 'a' - 'A' - } - } - output[i] = byte(r) - } - return output[:len(input)] -} - -// WordConsumer defines a consumer for a word delimited by the [start,end) byte offsets in an input -// (start is inclusive, end is exclusive). -type WordConsumer func(start, end int) - -// Words find word delimiters in an input based on its bytes' mappings to rune roles. The offset -// delimiters for each word are fed to the provided consumer function. -func Words(roles []RuneRole, consume WordConsumer) { - var wordStart int - for i, r := range roles { - switch r { - case RUCTail, RTail: - case RHead, RNone, RSep: - if i != wordStart { - consume(wordStart, i) - } - wordStart = i - if r != RHead { - // Skip this character. - wordStart = i + 1 - } - } - } - if wordStart != len(roles) { - consume(wordStart, len(roles)) - } -} diff --git a/vendor/golang.org/x/tools/internal/lsp/fuzzy/matcher.go b/vendor/golang.org/x/tools/internal/lsp/fuzzy/matcher.go deleted file mode 100644 index 0fbe5b314..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/fuzzy/matcher.go +++ /dev/null @@ -1,398 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package fuzzy implements a fuzzy matching algorithm. -package fuzzy - -import ( - "bytes" - "fmt" -) - -const ( - // MaxInputSize is the maximum size of the input scored against the fuzzy matcher. Longer inputs - // will be truncated to this size. - MaxInputSize = 127 - // MaxPatternSize is the maximum size of the pattern used to construct the fuzzy matcher. Longer - // inputs are truncated to this size. - MaxPatternSize = 63 -) - -type scoreVal int - -func (s scoreVal) val() int { - return int(s) >> 1 -} - -func (s scoreVal) prevK() int { - return int(s) & 1 -} - -func score(val int, prevK int /*0 or 1*/) scoreVal { - return scoreVal(val<<1 + prevK) -} - -// Matcher implements a fuzzy matching algorithm for scoring candidates against a pattern. -// The matcher does not support parallel usage. -type Matcher struct { - pattern string - patternLower []byte // lower-case version of the pattern - patternShort []byte // first characters of the pattern - caseSensitive bool // set if the pattern is mix-cased - - patternRoles []RuneRole // the role of each character in the pattern - roles []RuneRole // the role of each character in the tested string - - scores [MaxInputSize + 1][MaxPatternSize + 1][2]scoreVal - - scoreScale float32 - - lastCandidateLen int // in bytes - lastCandidateMatched bool - - // Here we save the last candidate in lower-case. This is basically a byte slice we reuse for - // performance reasons, so the slice is not reallocated for every candidate. - lowerBuf [MaxInputSize]byte - rolesBuf [MaxInputSize]RuneRole -} - -func (m *Matcher) bestK(i, j int) int { - if m.scores[i][j][0].val() < m.scores[i][j][1].val() { - return 1 - } - return 0 -} - -// NewMatcher returns a new fuzzy matcher for scoring candidates against the provided pattern. -func NewMatcher(pattern string) *Matcher { - if len(pattern) > MaxPatternSize { - pattern = pattern[:MaxPatternSize] - } - - m := &Matcher{ - pattern: pattern, - patternLower: ToLower(pattern, nil), - } - - for i, c := range m.patternLower { - if pattern[i] != c { - m.caseSensitive = true - break - } - } - - if len(pattern) > 3 { - m.patternShort = m.patternLower[:3] - } else { - m.patternShort = m.patternLower - } - - m.patternRoles = RuneRoles(pattern, nil) - - if len(pattern) > 0 { - maxCharScore := 4 - m.scoreScale = 1 / float32(maxCharScore*len(pattern)) - } - - return m -} - -// Score returns the score returned by matching the candidate to the pattern. -// This is not designed for parallel use. Multiple candidates must be scored sequentially. -// Returns a score between 0 and 1 (0 - no match, 1 - perfect match). -func (m *Matcher) Score(candidate string) float32 { - if len(candidate) > MaxInputSize { - candidate = candidate[:MaxInputSize] - } - lower := ToLower(candidate, m.lowerBuf[:]) - m.lastCandidateLen = len(candidate) - - if len(m.pattern) == 0 { - // Empty patterns perfectly match candidates. - return 1 - } - - if m.match(candidate, lower) { - sc := m.computeScore(candidate, lower) - if sc > minScore/2 && !m.poorMatch() { - m.lastCandidateMatched = true - if len(m.pattern) == len(candidate) { - // Perfect match. - return 1 - } - - if sc < 0 { - sc = 0 - } - normalizedScore := float32(sc) * m.scoreScale - if normalizedScore > 1 { - normalizedScore = 1 - } - - return normalizedScore - } - } - - m.lastCandidateMatched = false - return -1 -} - -const minScore = -10000 - -// MatchedRanges returns matches ranges for the last scored string as a flattened array of -// [begin, end) byte offset pairs. -func (m *Matcher) MatchedRanges() []int { - if len(m.pattern) == 0 || !m.lastCandidateMatched { - return nil - } - i, j := m.lastCandidateLen, len(m.pattern) - if m.scores[i][j][0].val() < minScore/2 && m.scores[i][j][1].val() < minScore/2 { - return nil - } - - var ret []int - k := m.bestK(i, j) - for i > 0 { - take := (k == 1) - k = m.scores[i][j][k].prevK() - if take { - if len(ret) == 0 || ret[len(ret)-1] != i { - ret = append(ret, i) - ret = append(ret, i-1) - } else { - ret[len(ret)-1] = i - 1 - } - j-- - } - i-- - } - // Reverse slice. - for i := 0; i < len(ret)/2; i++ { - ret[i], ret[len(ret)-1-i] = ret[len(ret)-1-i], ret[i] - } - return ret -} - -func (m *Matcher) match(candidate string, candidateLower []byte) bool { - i, j := 0, 0 - for ; i < len(candidateLower) && j < len(m.patternLower); i++ { - if candidateLower[i] == m.patternLower[j] { - j++ - } - } - if j != len(m.patternLower) { - return false - } - - // The input passes the simple test against pattern, so it is time to classify its characters. - // Character roles are used below to find the last segment. - m.roles = RuneRoles(candidate, m.rolesBuf[:]) - - return true -} - -func (m *Matcher) computeScore(candidate string, candidateLower []byte) int { - pattLen, candLen := len(m.pattern), len(candidate) - - for j := 0; j <= len(m.pattern); j++ { - m.scores[0][j][0] = minScore << 1 - m.scores[0][j][1] = minScore << 1 - } - m.scores[0][0][0] = score(0, 0) // Start with 0. - - segmentsLeft, lastSegStart := 1, 0 - for i := 0; i < candLen; i++ { - if m.roles[i] == RSep { - segmentsLeft++ - lastSegStart = i + 1 - } - } - - // A per-character bonus for a consecutive match. - consecutiveBonus := 2 - wordIdx := 0 // Word count within segment. - for i := 1; i <= candLen; i++ { - - role := m.roles[i-1] - isHead := role == RHead - - if isHead { - wordIdx++ - } else if role == RSep && segmentsLeft > 1 { - wordIdx = 0 - segmentsLeft-- - } - - var skipPenalty int - if i == 1 || (i-1) == lastSegStart { - // Skipping the start of first or last segment. - skipPenalty += 1 - } - - for j := 0; j <= pattLen; j++ { - // By default, we don't have a match. Fill in the skip data. - m.scores[i][j][1] = minScore << 1 - - // Compute the skip score. - k := 0 - if m.scores[i-1][j][0].val() < m.scores[i-1][j][1].val() { - k = 1 - } - - skipScore := m.scores[i-1][j][k].val() - // Do not penalize missing characters after the last matched segment. - if j != pattLen { - skipScore -= skipPenalty - } - m.scores[i][j][0] = score(skipScore, k) - - if j == 0 || candidateLower[i-1] != m.patternLower[j-1] { - // Not a match. - continue - } - pRole := m.patternRoles[j-1] - - if role == RTail && pRole == RHead { - if j > 1 { - // Not a match: a head in the pattern matches a tail character in the candidate. - continue - } - // Special treatment for the first character of the pattern. We allow - // matches in the middle of a word if they are long enough, at least - // min(3, pattern.length) characters. - if !bytes.HasPrefix(candidateLower[i-1:], m.patternShort) { - continue - } - } - - // Compute the char score. - var charScore int - // Bonus 1: the char is in the candidate's last segment. - if segmentsLeft <= 1 { - charScore++ - } - // Bonus 2: Case match or a Head in the pattern aligns with one in the word. - // Single-case patterns lack segmentation signals and we assume any character - // can be a head of a segment. - if candidate[i-1] == m.pattern[j-1] || role == RHead && (!m.caseSensitive || pRole == RHead) { - charScore++ - } - - // Penalty 1: pattern char is Head, candidate char is Tail. - if role == RTail && pRole == RHead { - charScore-- - } - // Penalty 2: first pattern character matched in the middle of a word. - if j == 1 && role == RTail { - charScore -= 4 - } - - // Third dimension encodes whether there is a gap between the previous match and the current - // one. - for k := 0; k < 2; k++ { - sc := m.scores[i-1][j-1][k].val() + charScore - - isConsecutive := k == 1 || i-1 == 0 || i-1 == lastSegStart - if isConsecutive { - // Bonus 3: a consecutive match. First character match also gets a bonus to - // ensure prefix final match score normalizes to 1.0. - // Logically, this is a part of charScore, but we have to compute it here because it - // only applies for consecutive matches (k == 1). - sc += consecutiveBonus - } - if k == 0 { - // Penalty 3: Matching inside a segment (and previous char wasn't matched). Penalize for the lack - // of alignment. - if role == RTail || role == RUCTail { - sc -= 3 - } - } - - if sc > m.scores[i][j][1].val() { - m.scores[i][j][1] = score(sc, k) - } - } - } - } - - result := m.scores[len(candidate)][len(m.pattern)][m.bestK(len(candidate), len(m.pattern))].val() - - return result -} - -// ScoreTable returns the score table computed for the provided candidate. Used only for debugging. -func (m *Matcher) ScoreTable(candidate string) string { - var buf bytes.Buffer - - var line1, line2, separator bytes.Buffer - line1.WriteString("\t") - line2.WriteString("\t") - for j := 0; j < len(m.pattern); j++ { - line1.WriteString(fmt.Sprintf("%c\t\t", m.pattern[j])) - separator.WriteString("----------------") - } - - buf.WriteString(line1.String()) - buf.WriteString("\n") - buf.WriteString(separator.String()) - buf.WriteString("\n") - - for i := 1; i <= len(candidate); i++ { - line1.Reset() - line2.Reset() - - line1.WriteString(fmt.Sprintf("%c\t", candidate[i-1])) - line2.WriteString("\t") - - for j := 1; j <= len(m.pattern); j++ { - line1.WriteString(fmt.Sprintf("M%6d(%c)\t", m.scores[i][j][0].val(), dir(m.scores[i][j][0].prevK()))) - line2.WriteString(fmt.Sprintf("H%6d(%c)\t", m.scores[i][j][1].val(), dir(m.scores[i][j][1].prevK()))) - } - buf.WriteString(line1.String()) - buf.WriteString("\n") - buf.WriteString(line2.String()) - buf.WriteString("\n") - buf.WriteString(separator.String()) - buf.WriteString("\n") - } - - return buf.String() -} - -func dir(prevK int) rune { - if prevK == 0 { - return 'M' - } - return 'H' -} - -func (m *Matcher) poorMatch() bool { - if len(m.pattern) < 2 { - return false - } - - i, j := m.lastCandidateLen, len(m.pattern) - k := m.bestK(i, j) - - var counter, len int - for i > 0 { - take := (k == 1) - k = m.scores[i][j][k].prevK() - if take { - len++ - if k == 0 && len < 3 && m.roles[i-1] == RTail { - // Short match in the middle of a word - counter++ - if counter > 1 { - return true - } - } - j-- - } else { - len = 0 - } - i-- - } - return false -} diff --git a/vendor/golang.org/x/tools/internal/lsp/general.go b/vendor/golang.org/x/tools/internal/lsp/general.go deleted file mode 100644 index 42b7472db..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/general.go +++ /dev/null @@ -1,260 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package lsp - -import ( - "bytes" - "context" - "fmt" - "os" - "path" - - "golang.org/x/tools/internal/jsonrpc2" - "golang.org/x/tools/internal/lsp/debug" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/telemetry/log" - errors "golang.org/x/xerrors" -) - -func (s *Server) initialize(ctx context.Context, params *protocol.ParamInitia) (*protocol.InitializeResult, error) { - s.stateMu.Lock() - state := s.state - s.stateMu.Unlock() - if state >= serverInitializing { - return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeInvalidRequest, "server already initialized") - } - s.stateMu.Lock() - s.state = serverInitializing - s.stateMu.Unlock() - - options := s.session.Options() - defer func() { s.session.SetOptions(options) }() - - // TODO: Handle results here. - source.SetOptions(&options, params.InitializationOptions) - options.ForClientCapabilities(params.Capabilities) - - s.pendingFolders = params.WorkspaceFolders - if len(s.pendingFolders) == 0 { - if params.RootURI != "" { - s.pendingFolders = []protocol.WorkspaceFolder{{ - URI: params.RootURI, - Name: path.Base(params.RootURI), - }} - } else { - // No folders and no root--we are in single file mode. - // TODO: https://golang.org/issue/34160. - return nil, errors.Errorf("gopls does not yet support editing a single file. Please open a directory.") - } - } - - var codeActionProvider interface{} - if ca := params.Capabilities.TextDocument.CodeAction; ca != nil && ca.CodeActionLiteralSupport != nil && - len(ca.CodeActionLiteralSupport.CodeActionKind.ValueSet) > 0 { - // If the client has specified CodeActionLiteralSupport, - // send the code actions we support. - // - // Using CodeActionOptions is only valid if codeActionLiteralSupport is set. - codeActionProvider = &protocol.CodeActionOptions{ - CodeActionKinds: s.getSupportedCodeActions(), - } - } else { - codeActionProvider = true - } - var renameOpts interface{} - if r := params.Capabilities.TextDocument.Rename; r != nil { - renameOpts = &protocol.RenameOptions{ - PrepareProvider: r.PrepareSupport, - } - } else { - renameOpts = true - } - return &protocol.InitializeResult{ - Capabilities: protocol.ServerCapabilities{ - CodeActionProvider: codeActionProvider, - CompletionProvider: &protocol.CompletionOptions{ - TriggerCharacters: []string{"."}, - }, - DefinitionProvider: true, - TypeDefinitionProvider: true, - ImplementationProvider: true, - DocumentFormattingProvider: true, - DocumentSymbolProvider: true, - ExecuteCommandProvider: &protocol.ExecuteCommandOptions{ - Commands: options.SupportedCommands, - }, - FoldingRangeProvider: true, - HoverProvider: true, - DocumentHighlightProvider: true, - DocumentLinkProvider: &protocol.DocumentLinkOptions{}, - ReferencesProvider: true, - RenameProvider: renameOpts, - SignatureHelpProvider: &protocol.SignatureHelpOptions{ - TriggerCharacters: []string{"(", ","}, - }, - TextDocumentSync: &protocol.TextDocumentSyncOptions{ - Change: options.TextDocumentSyncKind, - OpenClose: true, - Save: &protocol.SaveOptions{ - IncludeText: false, - }, - }, - Workspace: &struct { - WorkspaceFolders *struct { - Supported bool "json:\"supported,omitempty\"" - ChangeNotifications string "json:\"changeNotifications,omitempty\"" - } "json:\"workspaceFolders,omitempty\"" - }{ - WorkspaceFolders: &struct { - Supported bool "json:\"supported,omitempty\"" - ChangeNotifications string "json:\"changeNotifications,omitempty\"" - }{ - Supported: true, - ChangeNotifications: "workspace/didChangeWorkspaceFolders", - }, - }, - }, - }, nil -} - -func (s *Server) initialized(ctx context.Context, params *protocol.InitializedParams) error { - s.stateMu.Lock() - s.state = serverInitialized - s.stateMu.Unlock() - - options := s.session.Options() - defer func() { s.session.SetOptions(options) }() - - var registrations []protocol.Registration - if options.ConfigurationSupported && options.DynamicConfigurationSupported { - registrations = append(registrations, - protocol.Registration{ - ID: "workspace/didChangeConfiguration", - Method: "workspace/didChangeConfiguration", - }, - protocol.Registration{ - ID: "workspace/didChangeWorkspaceFolders", - Method: "workspace/didChangeWorkspaceFolders", - }, - ) - } - - if options.WatchFileChanges && options.DynamicWatchedFilesSupported { - registrations = append(registrations, protocol.Registration{ - ID: "workspace/didChangeWatchedFiles", - Method: "workspace/didChangeWatchedFiles", - RegisterOptions: protocol.DidChangeWatchedFilesRegistrationOptions{ - Watchers: []protocol.FileSystemWatcher{{ - GlobPattern: "**/*.go", - Kind: float64(protocol.WatchChange + protocol.WatchDelete + protocol.WatchCreate), - }}, - }, - }) - } - - if len(registrations) > 0 { - s.client.RegisterCapability(ctx, &protocol.RegistrationParams{ - Registrations: registrations, - }) - } - - buf := &bytes.Buffer{} - debug.PrintVersionInfo(buf, true, debug.PlainText) - log.Print(ctx, buf.String()) - - for _, folder := range s.pendingFolders { - if err := s.addView(ctx, folder.Name, span.NewURI(folder.URI)); err != nil { - return err - } - } - s.pendingFolders = nil - - return nil -} - -func (s *Server) fetchConfig(ctx context.Context, name string, folder span.URI, o *source.Options) error { - if !s.session.Options().ConfigurationSupported { - return nil - } - v := protocol.ParamConfig{ - ConfigurationParams: protocol.ConfigurationParams{ - Items: []protocol.ConfigurationItem{{ - ScopeURI: protocol.NewURI(folder), - Section: "gopls", - }, { - ScopeURI: protocol.NewURI(folder), - Section: fmt.Sprintf("gopls-%s", name), - }}, - }, - } - configs, err := s.client.Configuration(ctx, &v) - if err != nil { - return err - } - for _, config := range configs { - results := source.SetOptions(o, config) - for _, result := range results { - if result.Error != nil { - s.client.ShowMessage(ctx, &protocol.ShowMessageParams{ - Type: protocol.Error, - Message: result.Error.Error(), - }) - } - switch result.State { - case source.OptionUnexpected: - s.client.ShowMessage(ctx, &protocol.ShowMessageParams{ - Type: protocol.Error, - Message: fmt.Sprintf("unexpected config %s", result.Name), - }) - case source.OptionDeprecated: - msg := fmt.Sprintf("config %s is deprecated", result.Name) - if result.Replacement != "" { - msg = fmt.Sprintf("%s, use %s instead", msg, result.Replacement) - } - s.client.ShowMessage(ctx, &protocol.ShowMessageParams{ - Type: protocol.Warning, - Message: msg, - }) - } - } - } - return nil -} - -func (s *Server) shutdown(ctx context.Context) error { - s.stateMu.Lock() - defer s.stateMu.Unlock() - if s.state < serverInitialized { - return jsonrpc2.NewErrorf(jsonrpc2.CodeInvalidRequest, "server not initialized") - } - // drop all the active views - s.session.Shutdown(ctx) - s.state = serverShutDown - return nil -} - -func (s *Server) exit(ctx context.Context) error { - s.stateMu.Lock() - defer s.stateMu.Unlock() - if s.state != serverShutDown { - os.Exit(1) - } - os.Exit(0) - return nil -} - -func setBool(b *bool, m map[string]interface{}, name string) { - if v, ok := m[name].(bool); ok { - *b = v - } -} - -func setNotBool(b *bool, m map[string]interface{}, name string) { - if v, ok := m[name].(bool); ok { - *b = !v - } -} diff --git a/vendor/golang.org/x/tools/internal/lsp/highlight.go b/vendor/golang.org/x/tools/internal/lsp/highlight.go deleted file mode 100644 index 8a579a64b..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/highlight.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package lsp - -import ( - "context" - - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/lsp/telemetry" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/telemetry/log" -) - -func (s *Server) documentHighlight(ctx context.Context, params *protocol.DocumentHighlightParams) ([]protocol.DocumentHighlight, error) { - uri := span.NewURI(params.TextDocument.URI) - view := s.session.ViewOf(uri) - rngs, err := source.Highlight(ctx, view, uri, params.Position) - if err != nil { - log.Error(ctx, "no highlight", err, telemetry.URI.Of(uri)) - } - return toProtocolHighlight(rngs), nil -} - -func toProtocolHighlight(rngs []protocol.Range) []protocol.DocumentHighlight { - result := make([]protocol.DocumentHighlight, 0, len(rngs)) - kind := protocol.Text - for _, rng := range rngs { - result = append(result, protocol.DocumentHighlight{ - Kind: &kind, - Range: rng, - }) - } - return result -} diff --git a/vendor/golang.org/x/tools/internal/lsp/hover.go b/vendor/golang.org/x/tools/internal/lsp/hover.go deleted file mode 100644 index ddf1a32bb..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/hover.go +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package lsp - -import ( - "context" - "encoding/json" - "fmt" - - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/telemetry/log" -) - -func (s *Server) hover(ctx context.Context, params *protocol.HoverParams) (*protocol.Hover, error) { - uri := span.NewURI(params.TextDocument.URI) - view := s.session.ViewOf(uri) - f, err := view.GetFile(ctx, uri) - if err != nil { - return nil, err - } - ident, err := source.Identifier(ctx, view, f, params.Position) - if err != nil { - return nil, nil - } - hover, err := ident.Hover(ctx) - if err != nil { - return nil, err - } - rng, err := ident.Range() - if err != nil { - return nil, err - } - contents := s.toProtocolHoverContents(ctx, hover, view.Options()) - return &protocol.Hover{ - Contents: contents, - Range: &rng, - }, nil -} - -func (s *Server) toProtocolHoverContents(ctx context.Context, h *source.HoverInformation, options source.Options) protocol.MarkupContent { - content := protocol.MarkupContent{ - Kind: options.PreferredContentFormat, - } - signature := h.Signature - if content.Kind == protocol.Markdown { - signature = fmt.Sprintf("```go\n%s\n```", h.Signature) - } - - switch options.HoverKind { - case source.SingleLine: - doc := h.SingleLine - if content.Kind == protocol.Markdown { - doc = source.CommentToMarkdown(doc) - } - content.Value = doc - case source.NoDocumentation: - content.Value = signature - case source.SynopsisDocumentation: - if h.Synopsis != "" { - doc := h.Synopsis - if content.Kind == protocol.Markdown { - doc = source.CommentToMarkdown(h.Synopsis) - } - content.Value = fmt.Sprintf("%s\n%s", doc, signature) - } else { - content.Value = signature - } - case source.FullDocumentation: - if h.FullDocumentation != "" { - doc := h.FullDocumentation - if content.Kind == protocol.Markdown { - doc = source.CommentToMarkdown(h.FullDocumentation) - } - content.Value = fmt.Sprintf("%s\n%s", signature, doc) - } else { - content.Value = signature - } - case source.Structured: - b, err := json.Marshal(h) - if err != nil { - log.Error(ctx, "failed to marshal structured hover", err) - } - content.Value = string(b) - } - return content -} diff --git a/vendor/golang.org/x/tools/internal/lsp/implementation.go b/vendor/golang.org/x/tools/internal/lsp/implementation.go deleted file mode 100644 index dffc44928..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/implementation.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package lsp - -import ( - "context" - - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" -) - -func (s *Server) implementation(ctx context.Context, params *protocol.ImplementationParams) ([]protocol.Location, error) { - uri := span.NewURI(params.TextDocument.URI) - view := s.session.ViewOf(uri) - f, err := view.GetFile(ctx, uri) - if err != nil { - return nil, err - } - - return source.Implementation(ctx, view, f, params.Position) -} diff --git a/vendor/golang.org/x/tools/internal/lsp/link.go b/vendor/golang.org/x/tools/internal/lsp/link.go deleted file mode 100644 index 4c79bdc70..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/link.go +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package lsp - -import ( - "context" - "go/ast" - "go/token" - "regexp" - "strconv" - "sync" - - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/telemetry/log" - "golang.org/x/tools/internal/telemetry/tag" - errors "golang.org/x/xerrors" -) - -func (s *Server) documentLink(ctx context.Context, params *protocol.DocumentLinkParams) ([]protocol.DocumentLink, error) { - uri := span.NewURI(params.TextDocument.URI) - view := s.session.ViewOf(uri) - f, err := view.GetFile(ctx, uri) - if err != nil { - return nil, err - } - fh := view.Snapshot().Handle(ctx, f) - file, m, _, err := view.Session().Cache().ParseGoHandle(fh, source.ParseFull).Parse(ctx) - if err != nil { - return nil, err - } - var links []protocol.DocumentLink - ast.Inspect(file, func(node ast.Node) bool { - switch n := node.(type) { - case *ast.ImportSpec: - target, err := strconv.Unquote(n.Path.Value) - if err != nil { - log.Error(ctx, "cannot unquote import path", err, tag.Of("Path", n.Path.Value)) - return false - } - target = "https://godoc.org/" + target - l, err := toProtocolLink(view, m, target, n.Pos(), n.End()) - if err != nil { - log.Error(ctx, "cannot initialize DocumentLink", err, tag.Of("Path", n.Path.Value)) - return false - } - links = append(links, l) - return false - case *ast.BasicLit: - if n.Kind != token.STRING { - return false - } - l, err := findLinksInString(n.Value, n.Pos(), view, m) - if err != nil { - log.Error(ctx, "cannot find links in string", err) - return false - } - links = append(links, l...) - return false - } - return true - }) - - for _, commentGroup := range file.Comments { - for _, comment := range commentGroup.List { - l, err := findLinksInString(comment.Text, comment.Pos(), view, m) - if err != nil { - log.Error(ctx, "cannot find links in comment", err) - continue - } - links = append(links, l...) - } - } - - return links, nil -} - -func findLinksInString(src string, pos token.Pos, view source.View, mapper *protocol.ColumnMapper) ([]protocol.DocumentLink, error) { - var links []protocol.DocumentLink - re, err := getURLRegexp() - if err != nil { - return nil, errors.Errorf("cannot create regexp for links: %s", err.Error()) - } - for _, urlIndex := range re.FindAllIndex([]byte(src), -1) { - start := urlIndex[0] - end := urlIndex[1] - startPos := token.Pos(int(pos) + start) - endPos := token.Pos(int(pos) + end) - target := src[start:end] - l, err := toProtocolLink(view, mapper, target, startPos, endPos) - if err != nil { - return nil, err - } - links = append(links, l) - } - return links, nil -} - -const urlRegexpString = "(http|ftp|https)://([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?" - -var ( - urlRegexp *regexp.Regexp - regexpOnce sync.Once - regexpErr error -) - -func getURLRegexp() (*regexp.Regexp, error) { - regexpOnce.Do(func() { - urlRegexp, regexpErr = regexp.Compile(urlRegexpString) - }) - return urlRegexp, regexpErr -} - -func toProtocolLink(view source.View, mapper *protocol.ColumnMapper, target string, start, end token.Pos) (protocol.DocumentLink, error) { - spn, err := span.NewRange(view.Session().Cache().FileSet(), start, end).Span() - if err != nil { - return protocol.DocumentLink{}, err - } - rng, err := mapper.Range(spn) - if err != nil { - return protocol.DocumentLink{}, err - } - l := protocol.DocumentLink{ - Range: rng, - Target: target, - } - return l, nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/protocol/context.go b/vendor/golang.org/x/tools/internal/lsp/protocol/context.go deleted file mode 100644 index d024e002d..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/protocol/context.go +++ /dev/null @@ -1,45 +0,0 @@ -package protocol - -import ( - "context" - "fmt" - - "golang.org/x/tools/internal/telemetry" - "golang.org/x/tools/internal/telemetry/export" - "golang.org/x/tools/internal/xcontext" -) - -func init() { - export.AddExporters(logExporter{}) -} - -type contextKey int - -const ( - clientKey = contextKey(iota) -) - -func WithClient(ctx context.Context, client Client) context.Context { - return context.WithValue(ctx, clientKey, client) -} - -// logExporter sends the log event back to the client if there is one stored on the -// context. -type logExporter struct{} - -func (logExporter) StartSpan(context.Context, *telemetry.Span) {} -func (logExporter) FinishSpan(context.Context, *telemetry.Span) {} -func (logExporter) Metric(context.Context, telemetry.MetricData) {} -func (logExporter) Flush() {} - -func (logExporter) Log(ctx context.Context, event telemetry.Event) { - client, ok := ctx.Value(clientKey).(Client) - if !ok { - return - } - msg := &LogMessageParams{Type: Info, Message: fmt.Sprint(event)} - if event.Error != nil { - msg.Type = Error - } - go client.LogMessage(xcontext.Detach(ctx), msg) -} diff --git a/vendor/golang.org/x/tools/internal/lsp/protocol/doc.go b/vendor/golang.org/x/tools/internal/lsp/protocol/doc.go deleted file mode 100644 index 2ffdf5128..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/protocol/doc.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package protocol contains the structs that map directly to the wire format -// of the "Language Server Protocol". -// -// It is a literal transcription, with unmodified comments, and only the changes -// required to make it go code. -// Names are uppercased to export them. -// All fields have JSON tags added to correct the names. -// Fields marked with a ? are also marked as "omitempty" -// Fields that are "|| null" are made pointers -// Fields that are string or number are left as string -// Fields that are type "number" are made float64 -package protocol diff --git a/vendor/golang.org/x/tools/internal/lsp/protocol/enums.go b/vendor/golang.org/x/tools/internal/lsp/protocol/enums.go deleted file mode 100644 index 434808eeb..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/protocol/enums.go +++ /dev/null @@ -1,246 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package protocol - -import ( - "fmt" -) - -var ( - namesTextDocumentSyncKind [int(Incremental) + 1]string - namesInitializeError [int(UnknownProtocolVersion) + 1]string - namesMessageType [int(Log) + 1]string - namesFileChangeType [int(Deleted) + 1]string - namesWatchKind [int(WatchDelete) + 1]string - namesCompletionTriggerKind [int(TriggerForIncompleteCompletions) + 1]string - namesDiagnosticSeverity [int(SeverityHint) + 1]string - namesDiagnosticTag [int(Unnecessary) + 1]string - namesCompletionItemKind [int(TypeParameterCompletion) + 1]string - namesInsertTextFormat [int(SnippetTextFormat) + 1]string - namesDocumentHighlightKind [int(Write) + 1]string - namesSymbolKind [int(TypeParameter) + 1]string - namesTextDocumentSaveReason [int(FocusOut) + 1]string -) - -func init() { - namesTextDocumentSyncKind[int(None)] = "None" - namesTextDocumentSyncKind[int(Full)] = "Full" - namesTextDocumentSyncKind[int(Incremental)] = "Incremental" - - namesInitializeError[int(UnknownProtocolVersion)] = "UnknownProtocolVersion" - - namesMessageType[int(Error)] = "Error" - namesMessageType[int(Warning)] = "Warning" - namesMessageType[int(Info)] = "Info" - namesMessageType[int(Log)] = "Log" - - namesFileChangeType[int(Created)] = "Created" - namesFileChangeType[int(Changed)] = "Changed" - namesFileChangeType[int(Deleted)] = "Deleted" - - namesWatchKind[int(WatchCreate)] = "WatchCreate" - namesWatchKind[int(WatchChange)] = "WatchChange" - namesWatchKind[int(WatchDelete)] = "WatchDelete" - - namesCompletionTriggerKind[int(Invoked)] = "Invoked" - namesCompletionTriggerKind[int(TriggerCharacter)] = "TriggerCharacter" - namesCompletionTriggerKind[int(TriggerForIncompleteCompletions)] = "TriggerForIncompleteCompletions" - - namesDiagnosticSeverity[int(SeverityError)] = "Error" - namesDiagnosticSeverity[int(SeverityWarning)] = "Warning" - namesDiagnosticSeverity[int(SeverityInformation)] = "Information" - namesDiagnosticSeverity[int(SeverityHint)] = "Hint" - - namesDiagnosticTag[int(Unnecessary)] = "Unnecessary" - - namesCompletionItemKind[int(TextCompletion)] = "text" - namesCompletionItemKind[int(MethodCompletion)] = "method" - namesCompletionItemKind[int(FunctionCompletion)] = "func" - namesCompletionItemKind[int(ConstructorCompletion)] = "constructor" - namesCompletionItemKind[int(FieldCompletion)] = "field" - namesCompletionItemKind[int(VariableCompletion)] = "var" - namesCompletionItemKind[int(ClassCompletion)] = "type" - namesCompletionItemKind[int(InterfaceCompletion)] = "interface" - namesCompletionItemKind[int(ModuleCompletion)] = "package" - namesCompletionItemKind[int(PropertyCompletion)] = "property" - namesCompletionItemKind[int(UnitCompletion)] = "unit" - namesCompletionItemKind[int(ValueCompletion)] = "value" - namesCompletionItemKind[int(EnumCompletion)] = "enum" - namesCompletionItemKind[int(KeywordCompletion)] = "keyword" - namesCompletionItemKind[int(SnippetCompletion)] = "snippet" - namesCompletionItemKind[int(ColorCompletion)] = "color" - namesCompletionItemKind[int(FileCompletion)] = "file" - namesCompletionItemKind[int(ReferenceCompletion)] = "reference" - namesCompletionItemKind[int(FolderCompletion)] = "folder" - namesCompletionItemKind[int(EnumMemberCompletion)] = "enumMember" - namesCompletionItemKind[int(ConstantCompletion)] = "const" - namesCompletionItemKind[int(StructCompletion)] = "struct" - namesCompletionItemKind[int(EventCompletion)] = "event" - namesCompletionItemKind[int(OperatorCompletion)] = "operator" - namesCompletionItemKind[int(TypeParameterCompletion)] = "typeParam" - - namesInsertTextFormat[int(PlainTextTextFormat)] = "PlainText" - namesInsertTextFormat[int(SnippetTextFormat)] = "Snippet" - - namesDocumentHighlightKind[int(Text)] = "Text" - namesDocumentHighlightKind[int(Read)] = "Read" - namesDocumentHighlightKind[int(Write)] = "Write" - - namesSymbolKind[int(File)] = "File" - namesSymbolKind[int(Module)] = "Module" - namesSymbolKind[int(Namespace)] = "Namespace" - namesSymbolKind[int(Package)] = "Package" - namesSymbolKind[int(Class)] = "Class" - namesSymbolKind[int(Method)] = "Method" - namesSymbolKind[int(Property)] = "Property" - namesSymbolKind[int(Field)] = "Field" - namesSymbolKind[int(Constructor)] = "Constructor" - namesSymbolKind[int(Enum)] = "Enum" - namesSymbolKind[int(Interface)] = "Interface" - namesSymbolKind[int(Function)] = "Function" - namesSymbolKind[int(Variable)] = "Variable" - namesSymbolKind[int(Constant)] = "Constant" - namesSymbolKind[int(String)] = "String" - namesSymbolKind[int(Number)] = "Number" - namesSymbolKind[int(Boolean)] = "Boolean" - namesSymbolKind[int(Array)] = "Array" - namesSymbolKind[int(Object)] = "Object" - namesSymbolKind[int(Key)] = "Key" - namesSymbolKind[int(Null)] = "Null" - namesSymbolKind[int(EnumMember)] = "EnumMember" - namesSymbolKind[int(Struct)] = "Struct" - namesSymbolKind[int(Event)] = "Event" - namesSymbolKind[int(Operator)] = "Operator" - namesSymbolKind[int(TypeParameter)] = "TypeParameter" - - namesTextDocumentSaveReason[int(Manual)] = "Manual" - namesTextDocumentSaveReason[int(AfterDelay)] = "AfterDelay" - namesTextDocumentSaveReason[int(FocusOut)] = "FocusOut" -} - -func formatEnum(f fmt.State, c rune, i int, names []string, unknown string) { - s := "" - if i >= 0 && i < len(names) { - s = names[i] - } - if s != "" { - fmt.Fprint(f, s) - } else { - fmt.Fprintf(f, "%s(%d)", unknown, i) - } -} - -func parseEnum(s string, names []string) int { - for i, name := range names { - if s == name { - return i - } - } - return 0 -} - -func (e TextDocumentSyncKind) Format(f fmt.State, c rune) { - formatEnum(f, c, int(e), namesTextDocumentSyncKind[:], "TextDocumentSyncKind") -} - -func ParseTextDocumentSyncKind(s string) TextDocumentSyncKind { - return TextDocumentSyncKind(parseEnum(s, namesTextDocumentSyncKind[:])) -} - -func (e InitializeError) Format(f fmt.State, c rune) { - formatEnum(f, c, int(e), namesInitializeError[:], "InitializeError") -} - -func ParseInitializeError(s string) InitializeError { - return InitializeError(parseEnum(s, namesInitializeError[:])) -} - -func (e MessageType) Format(f fmt.State, c rune) { - formatEnum(f, c, int(e), namesMessageType[:], "MessageType") -} - -func ParseMessageType(s string) MessageType { - return MessageType(parseEnum(s, namesMessageType[:])) -} - -func (e FileChangeType) Format(f fmt.State, c rune) { - formatEnum(f, c, int(e), namesFileChangeType[:], "FileChangeType") -} - -func ParseFileChangeType(s string) FileChangeType { - return FileChangeType(parseEnum(s, namesFileChangeType[:])) -} - -func (e WatchKind) Format(f fmt.State, c rune) { - formatEnum(f, c, int(e), namesWatchKind[:], "WatchKind") -} - -func ParseWatchKind(s string) WatchKind { - return WatchKind(parseEnum(s, namesWatchKind[:])) -} - -func (e CompletionTriggerKind) Format(f fmt.State, c rune) { - formatEnum(f, c, int(e), namesCompletionTriggerKind[:], "CompletionTriggerKind") -} - -func ParseCompletionTriggerKind(s string) CompletionTriggerKind { - return CompletionTriggerKind(parseEnum(s, namesCompletionTriggerKind[:])) -} - -func (e DiagnosticSeverity) Format(f fmt.State, c rune) { - formatEnum(f, c, int(e), namesDiagnosticSeverity[:], "DiagnosticSeverity") -} - -func ParseDiagnosticSeverity(s string) DiagnosticSeverity { - return DiagnosticSeverity(parseEnum(s, namesDiagnosticSeverity[:])) -} - -func (e DiagnosticTag) Format(f fmt.State, c rune) { - formatEnum(f, c, int(e), namesDiagnosticTag[:], "DiagnosticTag") -} - -func ParseDiagnosticTag(s string) DiagnosticTag { - return DiagnosticTag(parseEnum(s, namesDiagnosticTag[:])) -} - -func (e CompletionItemKind) Format(f fmt.State, c rune) { - formatEnum(f, c, int(e), namesCompletionItemKind[:], "CompletionItemKind") -} - -func ParseCompletionItemKind(s string) CompletionItemKind { - return CompletionItemKind(parseEnum(s, namesCompletionItemKind[:])) -} - -func (e InsertTextFormat) Format(f fmt.State, c rune) { - formatEnum(f, c, int(e), namesInsertTextFormat[:], "InsertTextFormat") -} - -func ParseInsertTextFormat(s string) InsertTextFormat { - return InsertTextFormat(parseEnum(s, namesInsertTextFormat[:])) -} - -func (e DocumentHighlightKind) Format(f fmt.State, c rune) { - formatEnum(f, c, int(e), namesDocumentHighlightKind[:], "DocumentHighlightKind") -} - -func ParseDocumentHighlightKind(s string) DocumentHighlightKind { - return DocumentHighlightKind(parseEnum(s, namesDocumentHighlightKind[:])) -} - -func (e SymbolKind) Format(f fmt.State, c rune) { - formatEnum(f, c, int(e), namesSymbolKind[:], "SymbolKind") -} - -func ParseSymbolKind(s string) SymbolKind { - return SymbolKind(parseEnum(s, namesSymbolKind[:])) -} - -func (e TextDocumentSaveReason) Format(f fmt.State, c rune) { - formatEnum(f, c, int(e), namesTextDocumentSaveReason[:], "TextDocumentSaveReason") -} - -func ParseTextDocumentSaveReason(s string) TextDocumentSaveReason { - return TextDocumentSaveReason(parseEnum(s, namesTextDocumentSaveReason[:])) -} diff --git a/vendor/golang.org/x/tools/internal/lsp/protocol/log.go b/vendor/golang.org/x/tools/internal/lsp/protocol/log.go deleted file mode 100644 index 1bb5c27fc..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/protocol/log.go +++ /dev/null @@ -1,244 +0,0 @@ -package protocol - -import ( - "context" - "encoding/json" - "fmt" - "io" - "strings" - "sync" - "time" - - "golang.org/x/tools/internal/jsonrpc2" -) - -type loggingStream struct { - stream jsonrpc2.Stream - log io.Writer -} - -// LoggingStream returns a stream that does LSP protocol logging too -func LoggingStream(str jsonrpc2.Stream, w io.Writer) jsonrpc2.Stream { - return &loggingStream{str, w} -} - -func (s *loggingStream) Read(ctx context.Context) ([]byte, int64, error) { - data, count, err := s.stream.Read(ctx) - if err == nil { - logIn(s.log, data) - } - return data, count, err -} - -func (s *loggingStream) Write(ctx context.Context, data []byte) (int64, error) { - logOut(s.log, data) - count, err := s.stream.Write(ctx, data) - return count, err -} - -// Combined has all the fields of both Request and Response. -// We can decode this and then work out which it is. -type Combined struct { - VersionTag jsonrpc2.VersionTag `json:"jsonrpc"` - ID *jsonrpc2.ID `json:"id,omitempty"` - Method string `json:"method"` - Params *json.RawMessage `json:"params,omitempty"` - Result *json.RawMessage `json:"result,omitempty"` - Error *jsonrpc2.Error `json:"error,omitempty"` -} - -type req struct { - method string - start time.Time -} - -type mapped struct { - mu sync.Mutex - clientCalls map[string]req - serverCalls map[string]req -} - -var maps = &mapped{ - sync.Mutex{}, - make(map[string]req), - make(map[string]req), -} - -// these 4 methods are each used exactly once, but it seemed -// better to have the encapsulation rather than ad hoc mutex -// code in 4 places -func (m *mapped) client(id string, del bool) req { - m.mu.Lock() - defer m.mu.Unlock() - v := m.clientCalls[id] - if del { - delete(m.clientCalls, id) - } - return v -} - -func (m *mapped) server(id string, del bool) req { - m.mu.Lock() - defer m.mu.Unlock() - v := m.serverCalls[id] - if del { - delete(m.serverCalls, id) - } - return v -} - -func (m *mapped) setClient(id string, r req) { - m.mu.Lock() - defer m.mu.Unlock() - m.clientCalls[id] = r -} - -func (m *mapped) setServer(id string, r req) { - m.mu.Lock() - defer m.mu.Unlock() - m.serverCalls[id] = r -} - -const eor = "\r\n\r\n\r\n" - -func strID(x *jsonrpc2.ID) string { - if x == nil { - // should never happen, but we need a number - return "999999999" - } - if x.Name != "" { - return x.Name - } - return fmt.Sprintf("%d", x.Number) -} - -func logCommon(outfd io.Writer, data []byte) (*Combined, time.Time, string) { - if outfd == nil { - return nil, time.Time{}, "" - } - var v Combined - err := json.Unmarshal(data, &v) - if err != nil { - fmt.Fprintf(outfd, "Unmarshal %v\n", err) - panic(err) // do better - } - tm := time.Now() - tmfmt := tm.Format("15:04:05.000 PM") - return &v, tm, tmfmt -} - -// logOut and logIn could be combined. "received"<->"Sending", serverCalls<->clientCalls -// but it wouldn't be a lot shorter or clearer and "shutdown" is a special case - -// Writing a message to the client, log it -func logOut(outfd io.Writer, data []byte) { - v, tm, tmfmt := logCommon(outfd, data) - if v == nil { - return - } - if v.Error != nil { - id := strID(v.ID) - fmt.Fprintf(outfd, "[Error - %s] Received #%s %s%s", tmfmt, id, v.Error, eor) - return - } - buf := strings.Builder{} - id := strID(v.ID) - fmt.Fprintf(&buf, "[Trace - %s] ", tmfmt) // common beginning - if v.ID != nil && v.Method != "" && v.Params != nil { - fmt.Fprintf(&buf, "Received request '%s - (%s)'.\n", v.Method, id) - fmt.Fprintf(&buf, "Params: %s%s", *v.Params, eor) - maps.setServer(id, req{method: v.Method, start: tm}) - } else if v.ID != nil && v.Method == "" && v.Params == nil { - cc := maps.client(id, true) - elapsed := tm.Sub(cc.start) - fmt.Fprintf(&buf, "Received response '%s - (%s)' in %dms.\n", - cc.method, id, elapsed/time.Millisecond) - if v.Result == nil { - fmt.Fprintf(&buf, "Result: {}%s", eor) - } else { - fmt.Fprintf(&buf, "Result: %s%s", string(*v.Result), eor) - } - } else if v.ID == nil && v.Method != "" && v.Params != nil { - p := "null" - if v.Params != nil { - p = string(*v.Params) - } - fmt.Fprintf(&buf, "Received notification '%s'.\n", v.Method) - fmt.Fprintf(&buf, "Params: %s%s", p, eor) - } else { // for completeness, as it should never happen - buf = strings.Builder{} // undo common Trace - fmt.Fprintf(&buf, "[Error - %s] on write ID?%v method:%q Params:%v Result:%v Error:%v%s", - tmfmt, v.ID != nil, v.Method, v.Params != nil, - v.Result != nil, v.Error != nil, eor) - p := "null" - if v.Params != nil { - p = string(*v.Params) - } - r := "null" - if v.Result != nil { - r = string(*v.Result) - } - fmt.Fprintf(&buf, "%s\n%s\n%s%s", p, r, v.Error, eor) - } - outfd.Write([]byte(buf.String())) -} - -// Got a message from the client, log it -func logIn(outfd io.Writer, data []byte) { - v, tm, tmfmt := logCommon(outfd, data) - if v == nil { - return - } - // ID Method Params => Sending request - // ID !Method Result(might be null, but !Params) => Sending response (could we get an Error?) - // !ID Method Params => Sending notification - if v.Error != nil { // does this ever happen? - id := strID(v.ID) - fmt.Fprintf(outfd, "[Error - %s] Sent #%s %s%s", tmfmt, id, v.Error, eor) - return - } - buf := strings.Builder{} - id := strID(v.ID) - fmt.Fprintf(&buf, "[Trace - %s] ", tmfmt) // common beginning - if v.ID != nil && v.Method != "" && (v.Params != nil || v.Method == "shutdown") { - fmt.Fprintf(&buf, "Sending request '%s - (%s)'.\n", v.Method, id) - x := "{}" - if v.Params != nil { - x = string(*v.Params) - } - fmt.Fprintf(&buf, "Params: %s%s", x, eor) - maps.setClient(id, req{method: v.Method, start: tm}) - } else if v.ID != nil && v.Method == "" && v.Params == nil { - sc := maps.server(id, true) - elapsed := tm.Sub(sc.start) - fmt.Fprintf(&buf, "Sending response '%s - (%s)' took %dms.\n", - sc.method, id, elapsed/time.Millisecond) - if v.Result == nil { - fmt.Fprintf(&buf, "Result: {}%s", eor) - } else { - fmt.Fprintf(&buf, "Result: %s%s", string(*v.Result), eor) - } - } else if v.ID == nil && v.Method != "" { - p := "null" - if v.Params != nil { - p = string(*v.Params) - } - fmt.Fprintf(&buf, "Sending notification '%s'.\n", v.Method) - fmt.Fprintf(&buf, "Params: %s%s", p, eor) - } else { // for completeness, as it should never happen - buf = strings.Builder{} // undo common Trace - fmt.Fprintf(&buf, "[Error - %s] on read ID?%v method:%q Params:%v Result:%v Error:%v%s", - tmfmt, v.ID != nil, v.Method, v.Params != nil, - v.Result != nil, v.Error != nil, eor) - p := "null" - if v.Params != nil { - p = string(*v.Params) - } - r := "null" - if v.Result != nil { - r = string(*v.Result) - } - fmt.Fprintf(&buf, "%s\n%s\n%s%s", p, r, v.Error, eor) - } - outfd.Write([]byte(buf.String())) -} diff --git a/vendor/golang.org/x/tools/internal/lsp/protocol/protocol.go b/vendor/golang.org/x/tools/internal/lsp/protocol/protocol.go deleted file mode 100644 index 8aaa3ef2f..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/protocol/protocol.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package protocol - -import ( - "context" - "encoding/json" - - "golang.org/x/tools/internal/jsonrpc2" - "golang.org/x/tools/internal/telemetry/log" - "golang.org/x/tools/internal/telemetry/trace" - "golang.org/x/tools/internal/xcontext" -) - -const ( - // RequestCancelledError should be used when a request is cancelled early. - RequestCancelledError = -32800 -) - -type DocumentUri = string - -type canceller struct{ jsonrpc2.EmptyHandler } - -type clientHandler struct { - canceller - client Client -} - -type serverHandler struct { - canceller - server Server -} - -func (canceller) Request(ctx context.Context, conn *jsonrpc2.Conn, direction jsonrpc2.Direction, r *jsonrpc2.WireRequest) context.Context { - if direction == jsonrpc2.Receive && r.Method == "$/cancelRequest" { - var params CancelParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - log.Error(ctx, "", err) - } else { - conn.Cancel(params.ID) - } - } - return ctx -} - -func (canceller) Cancel(ctx context.Context, conn *jsonrpc2.Conn, id jsonrpc2.ID, cancelled bool) bool { - if cancelled { - return false - } - ctx = xcontext.Detach(ctx) - ctx, done := trace.StartSpan(ctx, "protocol.canceller") - defer done() - conn.Notify(ctx, "$/cancelRequest", &CancelParams{ID: id}) - return true -} - -func NewClient(ctx context.Context, stream jsonrpc2.Stream, client Client) (context.Context, *jsonrpc2.Conn, Server) { - ctx = WithClient(ctx, client) - conn := jsonrpc2.NewConn(stream) - conn.AddHandler(&clientHandler{client: client}) - return ctx, conn, &serverDispatcher{Conn: conn} -} - -func NewServer(ctx context.Context, stream jsonrpc2.Stream, server Server) (context.Context, *jsonrpc2.Conn, Client) { - conn := jsonrpc2.NewConn(stream) - client := &clientDispatcher{Conn: conn} - ctx = WithClient(ctx, client) - conn.AddHandler(&serverHandler{server: server}) - return ctx, conn, client -} - -func sendParseError(ctx context.Context, req *jsonrpc2.Request, err error) { - if _, ok := err.(*jsonrpc2.Error); !ok { - err = jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err) - } - if err := req.Reply(ctx, nil, err); err != nil { - log.Error(ctx, "", err) - } -} diff --git a/vendor/golang.org/x/tools/internal/lsp/protocol/span.go b/vendor/golang.org/x/tools/internal/lsp/protocol/span.go deleted file mode 100644 index 5c9c4d107..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/protocol/span.go +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// this file contains protocol<->span converters - -package protocol - -import ( - "fmt" - - "golang.org/x/tools/internal/span" - errors "golang.org/x/xerrors" -) - -type ColumnMapper struct { - URI span.URI - Converter *span.TokenConverter - Content []byte -} - -func NewURI(uri span.URI) string { - return string(uri) -} - -func (m *ColumnMapper) Location(s span.Span) (Location, error) { - rng, err := m.Range(s) - if err != nil { - return Location{}, err - } - return Location{URI: NewURI(s.URI()), Range: rng}, nil -} - -func (m *ColumnMapper) Range(s span.Span) (Range, error) { - if span.CompareURI(m.URI, s.URI()) != 0 { - return Range{}, errors.Errorf("column mapper is for file %q instead of %q", m.URI, s.URI()) - } - s, err := s.WithAll(m.Converter) - if err != nil { - return Range{}, err - } - start, err := m.Position(s.Start()) - if err != nil { - return Range{}, err - } - end, err := m.Position(s.End()) - if err != nil { - return Range{}, err - } - return Range{Start: start, End: end}, nil -} - -func (m *ColumnMapper) Position(p span.Point) (Position, error) { - chr, err := span.ToUTF16Column(p, m.Content) - if err != nil { - return Position{}, err - } - return Position{ - Line: float64(p.Line() - 1), - Character: float64(chr - 1), - }, nil -} - -func (m *ColumnMapper) Span(l Location) (span.Span, error) { - return m.RangeSpan(l.Range) -} - -func (m *ColumnMapper) RangeSpan(r Range) (span.Span, error) { - start, err := m.Point(r.Start) - if err != nil { - return span.Span{}, err - } - end, err := m.Point(r.End) - if err != nil { - return span.Span{}, err - } - return span.New(m.URI, start, end).WithAll(m.Converter) -} - -func (m *ColumnMapper) PointSpan(p Position) (span.Span, error) { - start, err := m.Point(p) - if err != nil { - return span.Span{}, err - } - return span.New(m.URI, start, start).WithAll(m.Converter) -} - -func (m *ColumnMapper) Point(p Position) (span.Point, error) { - line := int(p.Line) + 1 - offset, err := m.Converter.ToOffset(line, 1) - if err != nil { - return span.Point{}, err - } - lineStart := span.NewPoint(line, 1, offset) - return span.FromUTF16Column(lineStart, int(p.Character)+1, m.Content) -} - -func IsPoint(r Range) bool { - return r.Start.Line == r.End.Line && r.Start.Character == r.End.Character -} - -func CompareRange(a, b Range) int { - if r := ComparePosition(a.Start, b.Start); r != 0 { - return r - } - return ComparePosition(a.End, b.End) -} - -func ComparePosition(a, b Position) int { - if a.Line < b.Line { - return -1 - } - if a.Line > b.Line { - return 1 - } - if a.Character < b.Character { - return -1 - } - if a.Character > b.Character { - return 1 - } - return 0 -} - -func (r Range) Format(f fmt.State, _ rune) { - fmt.Fprintf(f, "%v:%v-%v:%v", r.Start.Line, r.Start.Character, r.End.Line, r.End.Character) -} diff --git a/vendor/golang.org/x/tools/internal/lsp/protocol/tsclient.go b/vendor/golang.org/x/tools/internal/lsp/protocol/tsclient.go deleted file mode 100644 index 969e05507..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/protocol/tsclient.go +++ /dev/null @@ -1,211 +0,0 @@ -package protocol - -// Code generated (see typescript/README.md) DO NOT EDIT. - -import ( - "context" - "encoding/json" - - "golang.org/x/tools/internal/jsonrpc2" - "golang.org/x/tools/internal/telemetry/log" - "golang.org/x/tools/internal/xcontext" -) - -type Client interface { - ShowMessage(context.Context, *ShowMessageParams) error - LogMessage(context.Context, *LogMessageParams) error - Event(context.Context, *interface{}) error - PublishDiagnostics(context.Context, *PublishDiagnosticsParams) error - WorkspaceFolders(context.Context) ([]WorkspaceFolder, error) - Configuration(context.Context, *ParamConfig) ([]interface{}, error) - RegisterCapability(context.Context, *RegistrationParams) error - UnregisterCapability(context.Context, *UnregistrationParams) error - ShowMessageRequest(context.Context, *ShowMessageRequestParams) (*MessageActionItem, error) - ApplyEdit(context.Context, *ApplyWorkspaceEditParams) (*ApplyWorkspaceEditResponse, error) -} - -func (h clientHandler) Deliver(ctx context.Context, r *jsonrpc2.Request, delivered bool) bool { - if delivered { - return false - } - if ctx.Err() != nil { - ctx := xcontext.Detach(ctx) - r.Reply(ctx, nil, jsonrpc2.NewErrorf(RequestCancelledError, "")) - return true - } - switch r.Method { - case "window/showMessage": // notif - var params ShowMessageParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - if err := h.client.ShowMessage(ctx, ¶ms); err != nil { - log.Error(ctx, "", err) - } - return true - case "window/logMessage": // notif - var params LogMessageParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - if err := h.client.LogMessage(ctx, ¶ms); err != nil { - log.Error(ctx, "", err) - } - return true - case "telemetry/event": // notif - var params interface{} - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - if err := h.client.Event(ctx, ¶ms); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/publishDiagnostics": // notif - var params PublishDiagnosticsParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - if err := h.client.PublishDiagnostics(ctx, ¶ms); err != nil { - log.Error(ctx, "", err) - } - return true - case "workspace/workspaceFolders": // req - if r.Params != nil { - r.Reply(ctx, nil, jsonrpc2.NewErrorf(jsonrpc2.CodeInvalidParams, "Expected no params")) - return true - } - resp, err := h.client.WorkspaceFolders(ctx) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "workspace/configuration": // req - var params ParamConfig - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.client.Configuration(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "client/registerCapability": // req - var params RegistrationParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - err := h.client.RegisterCapability(ctx, ¶ms) - if err := r.Reply(ctx, nil, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "client/unregisterCapability": // req - var params UnregistrationParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - err := h.client.UnregisterCapability(ctx, ¶ms) - if err := r.Reply(ctx, nil, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "window/showMessageRequest": // req - var params ShowMessageRequestParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.client.ShowMessageRequest(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "workspace/applyEdit": // req - var params ApplyWorkspaceEditParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.client.ApplyEdit(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - - default: - return false - } -} - -type clientDispatcher struct { - *jsonrpc2.Conn -} - -func (s *clientDispatcher) ShowMessage(ctx context.Context, params *ShowMessageParams) error { - return s.Conn.Notify(ctx, "window/showMessage", params) -} - -func (s *clientDispatcher) LogMessage(ctx context.Context, params *LogMessageParams) error { - return s.Conn.Notify(ctx, "window/logMessage", params) -} - -func (s *clientDispatcher) Event(ctx context.Context, params *interface{}) error { - return s.Conn.Notify(ctx, "telemetry/event", params) -} - -func (s *clientDispatcher) PublishDiagnostics(ctx context.Context, params *PublishDiagnosticsParams) error { - return s.Conn.Notify(ctx, "textDocument/publishDiagnostics", params) -} -func (s *clientDispatcher) WorkspaceFolders(ctx context.Context) ([]WorkspaceFolder, error) { - var result []WorkspaceFolder - if err := s.Conn.Call(ctx, "workspace/workspaceFolders", nil, &result); err != nil { - return nil, err - } - return result, nil -} - -func (s *clientDispatcher) Configuration(ctx context.Context, params *ParamConfig) ([]interface{}, error) { - var result []interface{} - if err := s.Conn.Call(ctx, "workspace/configuration", params, &result); err != nil { - return nil, err - } - return result, nil -} - -func (s *clientDispatcher) RegisterCapability(ctx context.Context, params *RegistrationParams) error { - return s.Conn.Call(ctx, "client/registerCapability", params, nil) // Call, not Notify -} - -func (s *clientDispatcher) UnregisterCapability(ctx context.Context, params *UnregistrationParams) error { - return s.Conn.Call(ctx, "client/unregisterCapability", params, nil) // Call, not Notify -} - -func (s *clientDispatcher) ShowMessageRequest(ctx context.Context, params *ShowMessageRequestParams) (*MessageActionItem, error) { - var result MessageActionItem - if err := s.Conn.Call(ctx, "window/showMessageRequest", params, &result); err != nil { - return nil, err - } - return &result, nil -} - -func (s *clientDispatcher) ApplyEdit(ctx context.Context, params *ApplyWorkspaceEditParams) (*ApplyWorkspaceEditResponse, error) { - var result ApplyWorkspaceEditResponse - if err := s.Conn.Call(ctx, "workspace/applyEdit", params, &result); err != nil { - return nil, err - } - return &result, nil -} - -// Types constructed to avoid structs as formal argument types -type ParamConfig struct { - ConfigurationParams - PartialResultParams -} diff --git a/vendor/golang.org/x/tools/internal/lsp/protocol/tsprotocol.go b/vendor/golang.org/x/tools/internal/lsp/protocol/tsprotocol.go deleted file mode 100644 index 4ac41ba29..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/protocol/tsprotocol.go +++ /dev/null @@ -1,4616 +0,0 @@ -// Package protocol contains data types and code for LSP jsonrpcs -// generated automatically from vscode-languageserver-node -// commit: 36ac51f057215e6e2e0408384e07ecf564a938da -// last fetched Tue Sep 24 2019 17:44:28 GMT-0400 (Eastern Daylight Time) -package protocol - -// Code generated (see typescript/README.md) DO NOT EDIT. - -/*ImplementationClientCapabilities defined: - * Since 3.6.0 - */ -type ImplementationClientCapabilities struct { - - /*DynamicRegistration defined: - * Whether implementation supports dynamic registration. If this is set to `true` - * the client supports the new `ImplementationRegistrationOptions` return value - * for the corresponding server capability as well. - */ - DynamicRegistration bool `json:"dynamicRegistration,omitempty"` - - /*LinkSupport defined: - * The client supports additional metadata in the form of definition links. - * - * Since 3.14.0 - */ - LinkSupport bool `json:"linkSupport,omitempty"` -} - -// ImplementationOptions is -type ImplementationOptions struct { - WorkDoneProgressOptions -} - -// ImplementationRegistrationOptions is -type ImplementationRegistrationOptions struct { - TextDocumentRegistrationOptions - ImplementationOptions - StaticRegistrationOptions -} - -// ImplementationParams is -type ImplementationParams struct { - TextDocumentPositionParams - WorkDoneProgressParams - PartialResultParams -} - -/*TypeDefinitionClientCapabilities defined: - * Since 3.6.0 - */ -type TypeDefinitionClientCapabilities struct { - - /*DynamicRegistration defined: - * Whether implementation supports dynamic registration. If this is set to `true` - * the client supports the new `TypeDefinitionRegistrationOptions` return value - * for the corresponding server capability as well. - */ - DynamicRegistration bool `json:"dynamicRegistration,omitempty"` - - /*LinkSupport defined: - * The client supports additional metadata in the form of definition links. - * - * Since 3.14.0 - */ - LinkSupport bool `json:"linkSupport,omitempty"` -} - -// TypeDefinitionOptions is -type TypeDefinitionOptions struct { - WorkDoneProgressOptions -} - -// TypeDefinitionRegistrationOptions is -type TypeDefinitionRegistrationOptions struct { - TextDocumentRegistrationOptions - TypeDefinitionOptions - StaticRegistrationOptions -} - -// TypeDefinitionParams is -type TypeDefinitionParams struct { - TextDocumentPositionParams - WorkDoneProgressParams - PartialResultParams -} - -// WorkspaceFoldersInitializeParams is -type WorkspaceFoldersInitializeParams struct { - - /*WorkspaceFolders defined: - * The actual configured workspace folders. - */ - WorkspaceFolders []WorkspaceFolder `json:"workspaceFolders"` -} - -// WorkspaceFoldersClientCapabilities is -type WorkspaceFoldersClientCapabilities struct { - - /*Workspace defined: - * The workspace client capabilities - */ - Workspace *struct { - - /*WorkspaceFolders defined: - * The client has support for workspace folders - */ - WorkspaceFolders bool `json:"workspaceFolders,omitempty"` - } `json:"workspace,omitempty"` -} - -// WorkspaceFoldersServerCapabilities is -type WorkspaceFoldersServerCapabilities struct { - - /*Workspace defined: - * The workspace server capabilities - */ - Workspace *struct { - - // WorkspaceFolders is - WorkspaceFolders *struct { - - /*Supported defined: - * The Server has support for workspace folders - */ - Supported bool `json:"supported,omitempty"` - - /*ChangeNotifications defined: - * Whether the server wants to receive workspace folder - * change notifications. - * - * If a strings is provided the string is treated as a ID - * under which the notification is registed on the client - * side. The ID can be used to unregister for these events - * using the `client/unregisterCapability` request. - */ - ChangeNotifications string `json:"changeNotifications,omitempty"` // string | boolean - } `json:"workspaceFolders,omitempty"` - } `json:"workspace,omitempty"` -} - -// WorkspaceFolder is -type WorkspaceFolder struct { - - /*URI defined: - * The associated URI for this workspace folder. - */ - URI string `json:"uri"` - - /*Name defined: - * The name of the workspace folder. Used to refer to this - * workspace folder in thge user interface. - */ - Name string `json:"name"` -} - -/*DidChangeWorkspaceFoldersParams defined: - * The parameters of a `workspace/didChangeWorkspaceFolders` notification. - */ -type DidChangeWorkspaceFoldersParams struct { - - /*Event defined: - * The actual workspace folder change event. - */ - Event WorkspaceFoldersChangeEvent `json:"event"` -} - -/*WorkspaceFoldersChangeEvent defined: - * The workspace folder change event. - */ -type WorkspaceFoldersChangeEvent struct { - - /*Added defined: - * The array of added workspace folders - */ - Added []WorkspaceFolder `json:"added"` - - /*Removed defined: - * The array of the removed workspace folders - */ - Removed []WorkspaceFolder `json:"removed"` -} - -// ConfigurationClientCapabilities is -type ConfigurationClientCapabilities struct { - - /*Workspace defined: - * The workspace client capabilities - */ - Workspace *struct { - - /*Configuration defined: - * The client supports `workspace/configuration` requests. - */ - Configuration bool `json:"configuration,omitempty"` - } `json:"workspace,omitempty"` -} - -// ConfigurationItem is -type ConfigurationItem struct { - - /*ScopeURI defined: - * The scope to get the configuration section for. - */ - ScopeURI string `json:"scopeUri,omitempty"` - - /*Section defined: - * The configuration section asked for. - */ - Section string `json:"section,omitempty"` -} - -/*ConfigurationParams defined: - * The parameters of a configuration request. - */ -type ConfigurationParams struct { - - // Items is - Items []ConfigurationItem `json:"items"` -} - -// DocumentColorClientCapabilities is -type DocumentColorClientCapabilities struct { - - /*DynamicRegistration defined: - * Whether implementation supports dynamic registration. If this is set to `true` - * the client supports the new `DocumentColorRegistrationOptions` return value - * for the corresponding server capability as well. - */ - DynamicRegistration bool `json:"dynamicRegistration,omitempty"` -} - -// DocumentColorOptions is -type DocumentColorOptions struct { - - /*ResolveProvider defined: - * Code lens has a resolve provider as well. - */ - ResolveProvider bool `json:"resolveProvider,omitempty"` - WorkDoneProgressOptions -} - -// DocumentColorRegistrationOptions is -type DocumentColorRegistrationOptions struct { - TextDocumentRegistrationOptions - StaticRegistrationOptions - DocumentColorOptions -} - -/*DocumentColorParams defined: - * Parameters for a [DocumentColorRequest](#DocumentColorRequest). - */ -type DocumentColorParams struct { - - /*TextDocument defined: - * The text document. - */ - TextDocument TextDocumentIdentifier `json:"textDocument"` - WorkDoneProgressParams - PartialResultParams -} - -/*ColorPresentationParams defined: - * Parameters for a [ColorPresentationRequest](#ColorPresentationRequest). - */ -type ColorPresentationParams struct { - - /*TextDocument defined: - * The text document. - */ - TextDocument TextDocumentIdentifier `json:"textDocument"` - - /*Color defined: - * The color to request presentations for. - */ - Color Color `json:"color"` - - /*Range defined: - * The range where the color would be inserted. Serves as a context. - */ - Range Range `json:"range"` - WorkDoneProgressParams - PartialResultParams -} - -// FoldingRangeClientCapabilities is -type FoldingRangeClientCapabilities struct { - - /*DynamicRegistration defined: - * Whether implementation supports dynamic registration for folding range providers. If this is set to `true` - * the client supports the new `FoldingRangeRegistrationOptions` return value for the corresponding server - * capability as well. - */ - DynamicRegistration bool `json:"dynamicRegistration,omitempty"` - - /*RangeLimit defined: - * The maximum number of folding ranges that the client prefers to receive per document. The value serves as a - * hint, servers are free to follow the limit. - */ - RangeLimit float64 `json:"rangeLimit,omitempty"` - - /*LineFoldingOnly defined: - * If set, the client signals that it only supports folding complete lines. If set, client will - * ignore specified `startCharacter` and `endCharacter` properties in a FoldingRange. - */ - LineFoldingOnly bool `json:"lineFoldingOnly,omitempty"` -} - -// FoldingRangeOptions is -type FoldingRangeOptions struct { - WorkDoneProgressOptions -} - -// FoldingRangeRegistrationOptions is -type FoldingRangeRegistrationOptions struct { - TextDocumentRegistrationOptions - FoldingRangeOptions - StaticRegistrationOptions -} - -/*FoldingRange defined: - * Represents a folding range. - */ -type FoldingRange struct { - - /*StartLine defined: - * The zero-based line number from where the folded range starts. - */ - StartLine float64 `json:"startLine"` - - /*StartCharacter defined: - * The zero-based character offset from where the folded range starts. If not defined, defaults to the length of the start line. - */ - StartCharacter float64 `json:"startCharacter,omitempty"` - - /*EndLine defined: - * The zero-based line number where the folded range ends. - */ - EndLine float64 `json:"endLine"` - - /*EndCharacter defined: - * The zero-based character offset before the folded range ends. If not defined, defaults to the length of the end line. - */ - EndCharacter float64 `json:"endCharacter,omitempty"` - - /*Kind defined: - * Describes the kind of the folding range such as `comment' or 'region'. The kind - * is used to categorize folding ranges and used by commands like 'Fold all comments'. See - * [FoldingRangeKind](#FoldingRangeKind) for an enumeration of standardized kinds. - */ - Kind string `json:"kind,omitempty"` -} - -/*FoldingRangeParams defined: - * Parameters for a [FoldingRangeRequest](#FoldingRangeRequest). - */ -type FoldingRangeParams struct { - - /*TextDocument defined: - * The text document. - */ - TextDocument TextDocumentIdentifier `json:"textDocument"` - WorkDoneProgressParams - PartialResultParams -} - -/*DeclarationClientCapabilities defined: - * Since 3.14.0 - */ -type DeclarationClientCapabilities struct { - - /*DynamicRegistration defined: - * Whether declaration supports dynamic registration. If this is set to `true` - * the client supports the new `DeclarationRegistrationOptions` return value - * for the corresponding server capability as well. - */ - DynamicRegistration bool `json:"dynamicRegistration,omitempty"` - - /*LinkSupport defined: - * The client supports additional metadata in the form of declaration links. - */ - LinkSupport bool `json:"linkSupport,omitempty"` -} - -// DeclarationOptions is -type DeclarationOptions struct { - WorkDoneProgressOptions -} - -// DeclarationRegistrationOptions is -type DeclarationRegistrationOptions struct { - DeclarationOptions - TextDocumentRegistrationOptions - StaticRegistrationOptions -} - -// DeclarationParams is -type DeclarationParams struct { - TextDocumentPositionParams - WorkDoneProgressParams - PartialResultParams -} - -// SelectionRangeClientCapabilities is -type SelectionRangeClientCapabilities struct { - - /*DynamicRegistration defined: - * Whether implementation supports dynamic registration for selection range providers. If this is set to `true` - * the client supports the new `SelectionRangeRegistrationOptions` return value for the corresponding server - * capability as well. - */ - DynamicRegistration bool `json:"dynamicRegistration,omitempty"` -} - -// SelectionRangeOptions is -type SelectionRangeOptions struct { - WorkDoneProgressOptions -} - -// SelectionRangeRegistrationOptions is -type SelectionRangeRegistrationOptions struct { - SelectionRangeOptions - TextDocumentRegistrationOptions - StaticRegistrationOptions -} - -/*SelectionRangeParams defined: - * A parameter literal used in selection range requests. - */ -type SelectionRangeParams struct { - - /*TextDocument defined: - * The text document. - */ - TextDocument TextDocumentIdentifier `json:"textDocument"` - - /*Positions defined: - * The positions inside the text document. - */ - Positions []Position `json:"positions"` - WorkDoneProgressParams - PartialResultParams -} - -/*Registration defined: - * General parameters to to register for an notification or to register a provider. - */ -type Registration struct { - - /*ID defined: - * The id used to register the request. The id can be used to deregister - * the request again. - */ - ID string `json:"id"` - - /*Method defined: - * The method to register for. - */ - Method string `json:"method"` - - /*RegisterOptions defined: - * Options necessary for the registration. - */ - RegisterOptions interface{} `json:"registerOptions,omitempty"` -} - -// RegistrationParams is -type RegistrationParams struct { - - // Registrations is - Registrations []Registration `json:"registrations"` -} - -/*Unregistration defined: - * General parameters to unregister a request or notification. - */ -type Unregistration struct { - - /*ID defined: - * The id used to unregister the request or notification. Usually an id - * provided during the register request. - */ - ID string `json:"id"` - - /*Method defined: - * The method to unregister for. - */ - Method string `json:"method"` -} - -// UnregistrationParams is -type UnregistrationParams struct { - - // Unregisterations is - Unregisterations []Unregistration `json:"unregisterations"` -} - -// WorkDoneProgressParams is -type WorkDoneProgressParams struct { - - /*WorkDoneToken defined: - * An optional token that a server can use to report work done progress. - */ - WorkDoneToken *ProgressToken `json:"workDoneToken,omitempty"` -} - -// PartialResultParams is -type PartialResultParams struct { - - /*PartialResultToken defined: - * An optional token that a server can use to report partial results (e.g. streaming) to - * the client. - */ - PartialResultToken *ProgressToken `json:"partialResultToken,omitempty"` -} - -/*TextDocumentPositionParams defined: - * A parameter literal used in requests to pass a text document and a position inside that - * document. - */ -type TextDocumentPositionParams struct { - - /*TextDocument defined: - * The text document. - */ - TextDocument TextDocumentIdentifier `json:"textDocument"` - - /*Position defined: - * The position inside the text document. - */ - Position Position `json:"position"` -} - -/*WorkspaceClientCapabilities defined: - * Workspace specific client capabilities. - */ -type WorkspaceClientCapabilities struct { - - /*ApplyEdit defined: - * The client supports applying batch edits - * to the workspace by supporting the request - * 'workspace/applyEdit' - */ - ApplyEdit bool `json:"applyEdit,omitempty"` - - /*WorkspaceEdit defined: - * Capabilities specific to `WorkspaceEdit`s - */ - WorkspaceEdit *WorkspaceEditClientCapabilities `json:"workspaceEdit,omitempty"` - - /*DidChangeConfiguration defined: - * Capabilities specific to the `workspace/didChangeConfiguration` notification. - */ - DidChangeConfiguration *DidChangeConfigurationClientCapabilities `json:"didChangeConfiguration,omitempty"` - - /*DidChangeWatchedFiles defined: - * Capabilities specific to the `workspace/didChangeWatchedFiles` notification. - */ - DidChangeWatchedFiles *DidChangeWatchedFilesClientCapabilities `json:"didChangeWatchedFiles,omitempty"` - - /*Symbol defined: - * Capabilities specific to the `workspace/symbol` request. - */ - Symbol *WorkspaceSymbolClientCapabilities `json:"symbol,omitempty"` - - /*ExecuteCommand defined: - * Capabilities specific to the `workspace/executeCommand` request. - */ - ExecuteCommand *ExecuteCommandClientCapabilities `json:"executeCommand,omitempty"` -} - -/*TextDocumentClientCapabilities defined: - * Text document specific client capabilities. - */ -type TextDocumentClientCapabilities struct { - - /*Synchronization defined: - * Defines which synchronization capabilities the client supports. - */ - Synchronization *TextDocumentSyncClientCapabilities `json:"synchronization,omitempty"` - - /*Completion defined: - * Capabilities specific to the `textDocument/completion` - */ - Completion *CompletionClientCapabilities `json:"completion,omitempty"` - - /*Hover defined: - * Capabilities specific to the `textDocument/hover` - */ - Hover *HoverClientCapabilities `json:"hover,omitempty"` - - /*SignatureHelp defined: - * Capabilities specific to the `textDocument/signatureHelp` - */ - SignatureHelp *SignatureHelpClientCapabilities `json:"signatureHelp,omitempty"` - - /*Declaration defined: - * Capabilities specific to the `textDocument/declaration` - * - * @since 3.14.0 - */ - Declaration *DeclarationClientCapabilities `json:"declaration,omitempty"` - - /*Definition defined: - * Capabilities specific to the `textDocument/definition` - */ - Definition *DefinitionClientCapabilities `json:"definition,omitempty"` - - /*TypeDefinition defined: - * Capabilities specific to the `textDocument/typeDefinition` - * - * @since 3.6.0 - */ - TypeDefinition *TypeDefinitionClientCapabilities `json:"typeDefinition,omitempty"` - - /*Implementation defined: - * Capabilities specific to the `textDocument/implementation` - * - * @since 3.6.0 - */ - Implementation *ImplementationClientCapabilities `json:"implementation,omitempty"` - - /*References defined: - * Capabilities specific to the `textDocument/references` - */ - References *ReferenceClientCapabilities `json:"references,omitempty"` - - /*DocumentHighlight defined: - * Capabilities specific to the `textDocument/documentHighlight` - */ - DocumentHighlight *DocumentHighlightClientCapabilities `json:"documentHighlight,omitempty"` - - /*DocumentSymbol defined: - * Capabilities specific to the `textDocument/documentSymbol` - */ - DocumentSymbol *DocumentSymbolClientCapabilities `json:"documentSymbol,omitempty"` - - /*CodeAction defined: - * Capabilities specific to the `textDocument/codeAction` - */ - CodeAction *CodeActionClientCapabilities `json:"codeAction,omitempty"` - - /*CodeLens defined: - * Capabilities specific to the `textDocument/codeLens` - */ - CodeLens *CodeLensClientCapabilities `json:"codeLens,omitempty"` - - /*DocumentLink defined: - * Capabilities specific to the `textDocument/documentLink` - */ - DocumentLink *DocumentLinkClientCapabilities `json:"documentLink,omitempty"` - - /*ColorProvider defined: - * Capabilities specific to the `textDocument/documentColor` - */ - ColorProvider *DocumentColorClientCapabilities `json:"colorProvider,omitempty"` - - /*Formatting defined: - * Capabilities specific to the `textDocument/formatting` - */ - Formatting *DocumentFormattingClientCapabilities `json:"formatting,omitempty"` - - /*RangeFormatting defined: - * Capabilities specific to the `textDocument/rangeFormatting` - */ - RangeFormatting *DocumentRangeFormattingClientCapabilities `json:"rangeFormatting,omitempty"` - - /*OnTypeFormatting defined: - * Capabilities specific to the `textDocument/onTypeFormatting` - */ - OnTypeFormatting *DocumentOnTypeFormattingClientCapabilities `json:"onTypeFormatting,omitempty"` - - /*Rename defined: - * Capabilities specific to the `textDocument/rename` - */ - Rename *RenameClientCapabilities `json:"rename,omitempty"` - - /*FoldingRange defined: - * Capabilities specific to `textDocument/foldingRange` requests. - * - * @since 3.10.0 - */ - FoldingRange *FoldingRangeClientCapabilities `json:"foldingRange,omitempty"` - - /*SelectionRange defined: - * Capabilities specific to `textDocument/selectionRange` requests - * - * @since 3.15.0 - */ - SelectionRange *SelectionRangeClientCapabilities `json:"selectionRange,omitempty"` - - /*PublishDiagnostics defined: - * Capabilities specific to `textDocument/publishDiagnostics`. - */ - PublishDiagnostics *PublishDiagnosticsClientCapabilities `json:"publishDiagnostics,omitempty"` -} - -/*InnerClientCapabilities defined: - * Defines the capabilities provided by the client. - */ -type InnerClientCapabilities struct { - - /*Workspace defined: - * Workspace specific client capabilities. - */ - Workspace *WorkspaceClientCapabilities `json:"workspace,omitempty"` - - /*TextDocument defined: - * Text document specific client capabilities. - */ - TextDocument *TextDocumentClientCapabilities `json:"textDocument,omitempty"` - - /*Window defined: - * Window specific client capabilities. - */ - Window interface{} `json:"window,omitempty"` - - /*Experimental defined: - * Experimental client capabilities. - */ - Experimental interface{} `json:"experimental,omitempty"` -} - -// ClientCapabilities is -type ClientCapabilities struct { - - /*Workspace defined: - * Workspace specific client capabilities. - */ - Workspace struct { - - /*ApplyEdit defined: - * The client supports applying batch edits - * to the workspace by supporting the request - * 'workspace/applyEdit' - */ - ApplyEdit bool `json:"applyEdit,omitempty"` - - /*WorkspaceEdit defined: - * Capabilities specific to `WorkspaceEdit`s - */ - WorkspaceEdit WorkspaceEditClientCapabilities `json:"workspaceEdit,omitempty"` - - /*DidChangeConfiguration defined: - * Capabilities specific to the `workspace/didChangeConfiguration` notification. - */ - DidChangeConfiguration DidChangeConfigurationClientCapabilities `json:"didChangeConfiguration,omitempty"` - - /*DidChangeWatchedFiles defined: - * Capabilities specific to the `workspace/didChangeWatchedFiles` notification. - */ - DidChangeWatchedFiles DidChangeWatchedFilesClientCapabilities `json:"didChangeWatchedFiles,omitempty"` - - /*Symbol defined: - * Capabilities specific to the `workspace/symbol` request. - */ - Symbol WorkspaceSymbolClientCapabilities `json:"symbol,omitempty"` - - /*ExecuteCommand defined: - * Capabilities specific to the `workspace/executeCommand` request. - */ - ExecuteCommand ExecuteCommandClientCapabilities `json:"executeCommand,omitempty"` - - /*WorkspaceFolders defined: - * The client has support for workspace folders - */ - WorkspaceFolders bool `json:"workspaceFolders,omitempty"` - - /*Configuration defined: - * The client supports `workspace/configuration` requests. - */ - Configuration bool `json:"configuration,omitempty"` - } `json:"workspace,omitempty"` - - /*TextDocument defined: - * Text document specific client capabilities. - */ - TextDocument TextDocumentClientCapabilities `json:"textDocument,omitempty"` - - /*Window defined: - * Window specific client capabilities. - */ - Window interface{} `json:"window,omitempty"` - - /*Experimental defined: - * Experimental client capabilities. - */ - Experimental interface{} `json:"experimental,omitempty"` - - /*DynamicRegistration defined: - * Whether implementation supports dynamic registration for selection range providers. If this is set to `true` - * the client supports the new `SelectionRangeRegistrationOptions` return value for the corresponding server - * capability as well. - */ - DynamicRegistration bool `json:"dynamicRegistration,omitempty"` -} - -/*StaticRegistrationOptions defined: - * Static registration options to be returned in the initialize - * request. - */ -type StaticRegistrationOptions struct { - - /*ID defined: - * The id used to register the request. The id can be used to deregister - * the request again. See also Registration#id. - */ - ID string `json:"id,omitempty"` -} - -/*TextDocumentRegistrationOptions defined: - * General text document registration options. - */ -type TextDocumentRegistrationOptions struct { - - /*DocumentSelector defined: - * A document selector to identify the scope of the registration. If set to null - * the document selector provided on the client side will be used. - */ - DocumentSelector DocumentSelector `json:"documentSelector"` -} - -/*SaveOptions defined: - * Save options. - */ -type SaveOptions struct { - - /*IncludeText defined: - * The client is supposed to include the content on save. - */ - IncludeText bool `json:"includeText,omitempty"` -} - -// WorkDoneProgressOptions is -type WorkDoneProgressOptions struct { - - // WorkDoneProgress is - WorkDoneProgress bool `json:"workDoneProgress,omitempty"` -} - -/*InnerServerCapabilities defined: - * Defines the capabilities provided by a language - * server. - */ -type InnerServerCapabilities struct { - - /*TextDocumentSync defined: - * Defines how text documents are synced. Is either a detailed structure defining each notification or - * for backwards compatibility the TextDocumentSyncKind number. - */ - TextDocumentSync interface{} `json:"textDocumentSync,omitempty"` // TextDocumentSyncOptions | TextDocumentSyncKind - - /*CompletionProvider defined: - * The server provides completion support. - */ - CompletionProvider *CompletionOptions `json:"completionProvider,omitempty"` - - /*HoverProvider defined: - * The server provides hover support. - */ - HoverProvider bool `json:"hoverProvider,omitempty"` // boolean | HoverOptions - - /*SignatureHelpProvider defined: - * The server provides signature help support. - */ - SignatureHelpProvider *SignatureHelpOptions `json:"signatureHelpProvider,omitempty"` - - /*DeclarationProvider defined: - * The server provides Goto Declaration support. - */ - DeclarationProvider bool `json:"declarationProvider,omitempty"` // boolean | DeclarationOptions | DeclarationRegistrationOptions - - /*DefinitionProvider defined: - * The server provides goto definition support. - */ - DefinitionProvider bool `json:"definitionProvider,omitempty"` // boolean | DefinitionOptions - - /*TypeDefinitionProvider defined: - * The server provides Goto Type Definition support. - */ - TypeDefinitionProvider bool `json:"typeDefinitionProvider,omitempty"` // boolean | TypeDefinitionOptions | TypeDefinitionRegistrationOptions - - /*ImplementationProvider defined: - * The server provides Goto Implementation support. - */ - ImplementationProvider bool `json:"implementationProvider,omitempty"` // boolean | ImplementationOptions | ImplementationRegistrationOptions - - /*ReferencesProvider defined: - * The server provides find references support. - */ - ReferencesProvider bool `json:"referencesProvider,omitempty"` // boolean | ReferenceOptions - - /*DocumentHighlightProvider defined: - * The server provides document highlight support. - */ - DocumentHighlightProvider bool `json:"documentHighlightProvider,omitempty"` // boolean | DocumentHighlightOptions - - /*DocumentSymbolProvider defined: - * The server provides document symbol support. - */ - DocumentSymbolProvider bool `json:"documentSymbolProvider,omitempty"` // boolean | DocumentSymbolOptions - - /*CodeActionProvider defined: - * The server provides code actions. CodeActionOptions may only be - * specified if the client states that it supports - * `codeActionLiteralSupport` in its initial `initialize` request. - */ - CodeActionProvider interface{} `json:"codeActionProvider,omitempty"` // boolean | CodeActionOptions - - /*CodeLensProvider defined: - * The server provides code lens. - */ - CodeLensProvider *CodeLensOptions `json:"codeLensProvider,omitempty"` - - /*DocumentLinkProvider defined: - * The server provides document link support. - */ - DocumentLinkProvider *DocumentLinkOptions `json:"documentLinkProvider,omitempty"` - - /*ColorProvider defined: - * The server provides color provider support. - */ - ColorProvider bool `json:"colorProvider,omitempty"` // boolean | DocumentColorOptions | DocumentColorRegistrationOptions - - /*WorkspaceSymbolProvider defined: - * The server provides workspace symbol support. - */ - WorkspaceSymbolProvider bool `json:"workspaceSymbolProvider,omitempty"` // boolean | WorkspaceSymbolOptions - - /*DocumentFormattingProvider defined: - * The server provides document formatting. - */ - DocumentFormattingProvider bool `json:"documentFormattingProvider,omitempty"` // boolean | DocumentFormattingOptions - - /*DocumentRangeFormattingProvider defined: - * The server provides document range formatting. - */ - DocumentRangeFormattingProvider bool `json:"documentRangeFormattingProvider,omitempty"` // boolean | DocumentRangeFormattingOptions - - /*DocumentOnTypeFormattingProvider defined: - * The server provides document formatting on typing. - */ - DocumentOnTypeFormattingProvider *DocumentOnTypeFormattingOptions `json:"documentOnTypeFormattingProvider,omitempty"` - - /*RenameProvider defined: - * The server provides rename support. RenameOptions may only be - * specified if the client states that it supports - * `prepareSupport` in its initial `initialize` request. - */ - RenameProvider interface{} `json:"renameProvider,omitempty"` // boolean | RenameOptions - - /*FoldingRangeProvider defined: - * The server provides folding provider support. - */ - FoldingRangeProvider bool `json:"foldingRangeProvider,omitempty"` // boolean | FoldingRangeOptions | FoldingRangeRegistrationOptions - - /*SelectionRangeProvider defined: - * The server provides selection range support. - */ - SelectionRangeProvider bool `json:"selectionRangeProvider,omitempty"` // boolean | SelectionRangeOptions | SelectionRangeRegistrationOptions - - /*ExecuteCommandProvider defined: - * The server provides execute command support. - */ - ExecuteCommandProvider *ExecuteCommandOptions `json:"executeCommandProvider,omitempty"` - - /*Experimental defined: - * Experimental server capabilities. - */ - Experimental interface{} `json:"experimental,omitempty"` -} - -// ServerCapabilities is -type ServerCapabilities struct { - - /*TextDocumentSync defined: - * Defines how text documents are synced. Is either a detailed structure defining each notification or - * for backwards compatibility the TextDocumentSyncKind number. - */ - TextDocumentSync interface{} `json:"textDocumentSync,omitempty"` // TextDocumentSyncOptions | TextDocumentSyncKind - - /*CompletionProvider defined: - * The server provides completion support. - */ - CompletionProvider *CompletionOptions `json:"completionProvider,omitempty"` - - /*HoverProvider defined: - * The server provides hover support. - */ - HoverProvider bool `json:"hoverProvider,omitempty"` // boolean | HoverOptions - - /*SignatureHelpProvider defined: - * The server provides signature help support. - */ - SignatureHelpProvider *SignatureHelpOptions `json:"signatureHelpProvider,omitempty"` - - /*DeclarationProvider defined: - * The server provides Goto Declaration support. - */ - DeclarationProvider bool `json:"declarationProvider,omitempty"` // boolean | DeclarationOptions | DeclarationRegistrationOptions - - /*DefinitionProvider defined: - * The server provides goto definition support. - */ - DefinitionProvider bool `json:"definitionProvider,omitempty"` // boolean | DefinitionOptions - - /*TypeDefinitionProvider defined: - * The server provides Goto Type Definition support. - */ - TypeDefinitionProvider bool `json:"typeDefinitionProvider,omitempty"` // boolean | TypeDefinitionOptions | TypeDefinitionRegistrationOptions - - /*ImplementationProvider defined: - * The server provides Goto Implementation support. - */ - ImplementationProvider bool `json:"implementationProvider,omitempty"` // boolean | ImplementationOptions | ImplementationRegistrationOptions - - /*ReferencesProvider defined: - * The server provides find references support. - */ - ReferencesProvider bool `json:"referencesProvider,omitempty"` // boolean | ReferenceOptions - - /*DocumentHighlightProvider defined: - * The server provides document highlight support. - */ - DocumentHighlightProvider bool `json:"documentHighlightProvider,omitempty"` // boolean | DocumentHighlightOptions - - /*DocumentSymbolProvider defined: - * The server provides document symbol support. - */ - DocumentSymbolProvider bool `json:"documentSymbolProvider,omitempty"` // boolean | DocumentSymbolOptions - - /*CodeActionProvider defined: - * The server provides code actions. CodeActionOptions may only be - * specified if the client states that it supports - * `codeActionLiteralSupport` in its initial `initialize` request. - */ - CodeActionProvider interface{} `json:"codeActionProvider,omitempty"` // boolean | CodeActionOptions - - /*CodeLensProvider defined: - * The server provides code lens. - */ - CodeLensProvider *CodeLensOptions `json:"codeLensProvider,omitempty"` - - /*DocumentLinkProvider defined: - * The server provides document link support. - */ - DocumentLinkProvider *DocumentLinkOptions `json:"documentLinkProvider,omitempty"` - - /*ColorProvider defined: - * The server provides color provider support. - */ - ColorProvider bool `json:"colorProvider,omitempty"` // boolean | DocumentColorOptions | DocumentColorRegistrationOptions - - /*WorkspaceSymbolProvider defined: - * The server provides workspace symbol support. - */ - WorkspaceSymbolProvider bool `json:"workspaceSymbolProvider,omitempty"` // boolean | WorkspaceSymbolOptions - - /*DocumentFormattingProvider defined: - * The server provides document formatting. - */ - DocumentFormattingProvider bool `json:"documentFormattingProvider,omitempty"` // boolean | DocumentFormattingOptions - - /*DocumentRangeFormattingProvider defined: - * The server provides document range formatting. - */ - DocumentRangeFormattingProvider bool `json:"documentRangeFormattingProvider,omitempty"` // boolean | DocumentRangeFormattingOptions - - /*DocumentOnTypeFormattingProvider defined: - * The server provides document formatting on typing. - */ - DocumentOnTypeFormattingProvider *DocumentOnTypeFormattingOptions `json:"documentOnTypeFormattingProvider,omitempty"` - - /*RenameProvider defined: - * The server provides rename support. RenameOptions may only be - * specified if the client states that it supports - * `prepareSupport` in its initial `initialize` request. - */ - RenameProvider interface{} `json:"renameProvider,omitempty"` // boolean | RenameOptions - - /*FoldingRangeProvider defined: - * The server provides folding provider support. - */ - FoldingRangeProvider bool `json:"foldingRangeProvider,omitempty"` // boolean | FoldingRangeOptions | FoldingRangeRegistrationOptions - - /*SelectionRangeProvider defined: - * The server provides selection range support. - */ - SelectionRangeProvider bool `json:"selectionRangeProvider,omitempty"` // boolean | SelectionRangeOptions | SelectionRangeRegistrationOptions - - /*ExecuteCommandProvider defined: - * The server provides execute command support. - */ - ExecuteCommandProvider *ExecuteCommandOptions `json:"executeCommandProvider,omitempty"` - - /*Experimental defined: - * Experimental server capabilities. - */ - Experimental interface{} `json:"experimental,omitempty"` - - /*Workspace defined: - * The workspace server capabilities - */ - Workspace *struct { - - // WorkspaceFolders is - WorkspaceFolders *struct { - - /*Supported defined: - * The Server has support for workspace folders - */ - Supported bool `json:"supported,omitempty"` - - /*ChangeNotifications defined: - * Whether the server wants to receive workspace folder - * change notifications. - * - * If a strings is provided the string is treated as a ID - * under which the notification is registed on the client - * side. The ID can be used to unregister for these events - * using the `client/unregisterCapability` request. - */ - ChangeNotifications string `json:"changeNotifications,omitempty"` // string | boolean - } `json:"workspaceFolders,omitempty"` - } `json:"workspace,omitempty"` -} - -/*InnerInitializeParams defined: - * The initialize parameters - */ -type InnerInitializeParams struct { - - /*ProcessID defined: - * The process Id of the parent process that started - * the server. - */ - ProcessID float64 `json:"processId"` - - /*ClientInfo defined: - * Information about the client - * - * @since 3.15.0 - */ - ClientInfo *struct { - - /*Name defined: - * The name of the client as defined by the client. - */ - Name string `json:"name"` - - /*Version defined: - * The client's version as defined by the client. - */ - Version string `json:"version,omitempty"` - } `json:"clientInfo,omitempty"` - - /*RootPath defined: - * The rootPath of the workspace. Is null - * if no folder is open. - * - * @deprecated in favour of rootUri. - */ - RootPath string `json:"rootPath,omitempty"` - - /*RootURI defined: - * The rootUri of the workspace. Is null if no - * folder is open. If both `rootPath` and `rootUri` are set - * `rootUri` wins. - * - * @deprecated in favour of workspaceFolders. - */ - RootURI DocumentURI `json:"rootUri"` - - /*Capabilities defined: - * The capabilities provided by the client (editor or tool) - */ - Capabilities ClientCapabilities `json:"capabilities"` - - /*InitializationOptions defined: - * User provided initialization options. - */ - InitializationOptions interface{} `json:"initializationOptions,omitempty"` - - /*Trace defined: - * The initial trace setting. If omitted trace is disabled ('off'). - */ - Trace string `json:"trace,omitempty"` // 'off' | 'messages' | 'verbose' - WorkDoneProgressParams -} - -// InitializeParams is -type InitializeParams struct { - - /*ProcessID defined: - * The process Id of the parent process that started - * the server. - */ - ProcessID float64 `json:"processId"` - - /*ClientInfo defined: - * Information about the client - * - * @since 3.15.0 - */ - ClientInfo *struct { - - /*Name defined: - * The name of the client as defined by the client. - */ - Name string `json:"name"` - - /*Version defined: - * The client's version as defined by the client. - */ - Version string `json:"version,omitempty"` - } `json:"clientInfo,omitempty"` - - /*RootPath defined: - * The rootPath of the workspace. Is null - * if no folder is open. - * - * @deprecated in favour of rootUri. - */ - RootPath string `json:"rootPath,omitempty"` - - /*RootURI defined: - * The rootUri of the workspace. Is null if no - * folder is open. If both `rootPath` and `rootUri` are set - * `rootUri` wins. - * - * @deprecated in favour of workspaceFolders. - */ - RootURI DocumentURI `json:"rootUri"` - - /*Capabilities defined: - * The capabilities provided by the client (editor or tool) - */ - Capabilities ClientCapabilities `json:"capabilities"` - - /*InitializationOptions defined: - * User provided initialization options. - */ - InitializationOptions interface{} `json:"initializationOptions,omitempty"` - - /*Trace defined: - * The initial trace setting. If omitted trace is disabled ('off'). - */ - Trace string `json:"trace,omitempty"` // 'off' | 'messages' | 'verbose' - - /*WorkspaceFolders defined: - * The actual configured workspace folders. - */ - WorkspaceFolders []WorkspaceFolder `json:"workspaceFolders"` -} - -/*InitializeResult defined: - * The result returned from an initialize request. - */ -type InitializeResult struct { - - /*Capabilities defined: - * The capabilities the language server provides. - */ - Capabilities ServerCapabilities `json:"capabilities"` - - /*ServerInfo defined: - * Information about the server. - * - * @since 3.15.0 - */ - ServerInfo *struct { - - /*Name defined: - * The name of the server as defined by the server. - */ - Name string `json:"name"` - - /*Version defined: - * The servers's version as defined by the server. - */ - Version string `json:"version,omitempty"` - } `json:"serverInfo,omitempty"` - - /*Custom defined: - * Custom initialization results. - */ - Custom map[string]interface{} `json:"custom"` // [custom: string]: any; -} - -// InitializedParams is -type InitializedParams struct { -} - -// DidChangeConfigurationClientCapabilities is -type DidChangeConfigurationClientCapabilities struct { - - /*DynamicRegistration defined: - * Did change configuration notification supports dynamic registration. - */ - DynamicRegistration bool `json:"dynamicRegistration,omitempty"` -} - -// DidChangeConfigurationRegistrationOptions is -type DidChangeConfigurationRegistrationOptions struct { - - // Section is - Section string `json:"section,omitempty"` // string | string[] -} - -/*DidChangeConfigurationParams defined: - * The parameters of a change configuration notification. - */ -type DidChangeConfigurationParams struct { - - /*Settings defined: - * The actual changed settings - */ - Settings interface{} `json:"settings"` -} - -/*ShowMessageParams defined: - * The parameters of a notification message. - */ -type ShowMessageParams struct { - - /*Type defined: - * The message type. See {@link MessageType} - */ - Type MessageType `json:"type"` - - /*Message defined: - * The actual message - */ - Message string `json:"message"` -} - -// MessageActionItem is -type MessageActionItem struct { - - /*Title defined: - * A short title like 'Retry', 'Open Log' etc. - */ - Title string `json:"title"` -} - -// ShowMessageRequestParams is -type ShowMessageRequestParams struct { - - /*Type defined: - * The message type. See {@link MessageType} - */ - Type MessageType `json:"type"` - - /*Message defined: - * The actual message - */ - Message string `json:"message"` - - /*Actions defined: - * The message action items to present. - */ - Actions []MessageActionItem `json:"actions,omitempty"` -} - -/*LogMessageParams defined: - * The log message parameters. - */ -type LogMessageParams struct { - - /*Type defined: - * The message type. See {@link MessageType} - */ - Type MessageType `json:"type"` - - /*Message defined: - * The actual message - */ - Message string `json:"message"` -} - -// TextDocumentSyncClientCapabilities is -type TextDocumentSyncClientCapabilities struct { - - /*DynamicRegistration defined: - * Whether text document synchronization supports dynamic registration. - */ - DynamicRegistration bool `json:"dynamicRegistration,omitempty"` - - /*WillSave defined: - * The client supports sending will save notifications. - */ - WillSave bool `json:"willSave,omitempty"` - - /*WillSaveWaitUntil defined: - * The client supports sending a will save request and - * waits for a response providing text edits which will - * be applied to the document before it is saved. - */ - WillSaveWaitUntil bool `json:"willSaveWaitUntil,omitempty"` - - /*DidSave defined: - * The client supports did save notifications. - */ - DidSave bool `json:"didSave,omitempty"` -} - -// TextDocumentSyncOptions is -type TextDocumentSyncOptions struct { - - /*OpenClose defined: - * Open and close notifications are sent to the server. If omitted open close notification should not - * be sent. - */ - OpenClose bool `json:"openClose,omitempty"` - - /*Change defined: - * Change notifications are sent to the server. See TextDocumentSyncKind.None, TextDocumentSyncKind.Full - * and TextDocumentSyncKind.Incremental. If omitted it defaults to TextDocumentSyncKind.None. - */ - Change TextDocumentSyncKind `json:"change,omitempty"` - - /*WillSave defined: - * If present will save notifications are sent to the server. If omitted the notification should not be - * sent. - */ - WillSave bool `json:"willSave,omitempty"` - - /*WillSaveWaitUntil defined: - * If present will save wait until requests are sent to the server. If omitted the request should not be - * sent. - */ - WillSaveWaitUntil bool `json:"willSaveWaitUntil,omitempty"` - - /*Save defined: - * If present save notifications are sent to the server. If omitted the notification should not be - * sent. - */ - Save *SaveOptions `json:"save,omitempty"` -} - -/*DidOpenTextDocumentParams defined: - * The parameters send in a open text document notification - */ -type DidOpenTextDocumentParams struct { - - /*TextDocument defined: - * The document that was opened. - */ - TextDocument TextDocumentItem `json:"textDocument"` -} - -/*DidChangeTextDocumentParams defined: - * The change text document notification's parameters. - */ -type DidChangeTextDocumentParams struct { - - /*TextDocument defined: - * The document that did change. The version number points - * to the version after all provided content changes have - * been applied. - */ - TextDocument VersionedTextDocumentIdentifier `json:"textDocument"` - - /*ContentChanges defined: - * The actual content changes. The content changes describe single state changes - * to the document. So if there are two content changes c1 and c2 for a document - * in state S then c1 move the document to S' and c2 to S''. - */ - ContentChanges []TextDocumentContentChangeEvent `json:"contentChanges"` -} - -/*TextDocumentChangeRegistrationOptions defined: - * Describe options to be used when registered for text document change events. - */ -type TextDocumentChangeRegistrationOptions struct { - - /*SyncKind defined: - * How documents are synced to the server. - */ - SyncKind TextDocumentSyncKind `json:"syncKind"` - TextDocumentRegistrationOptions -} - -/*DidCloseTextDocumentParams defined: - * The parameters send in a close text document notification - */ -type DidCloseTextDocumentParams struct { - - /*TextDocument defined: - * The document that was closed. - */ - TextDocument TextDocumentIdentifier `json:"textDocument"` -} - -/*DidSaveTextDocumentParams defined: - * The parameters send in a save text document notification - */ -type DidSaveTextDocumentParams struct { - - /*TextDocument defined: - * The document that was closed. - */ - TextDocument VersionedTextDocumentIdentifier `json:"textDocument"` - - /*Text defined: - * Optional the content when saved. Depends on the includeText value - * when the save notification was requested. - */ - Text string `json:"text,omitempty"` -} - -/*TextDocumentSaveRegistrationOptions defined: - * Save registration options. - */ -type TextDocumentSaveRegistrationOptions struct { - TextDocumentRegistrationOptions - SaveOptions -} - -/*WillSaveTextDocumentParams defined: - * The parameters send in a will save text document notification. - */ -type WillSaveTextDocumentParams struct { - - /*TextDocument defined: - * The document that will be saved. - */ - TextDocument TextDocumentIdentifier `json:"textDocument"` - - /*Reason defined: - * The 'TextDocumentSaveReason'. - */ - Reason TextDocumentSaveReason `json:"reason"` -} - -// DidChangeWatchedFilesClientCapabilities is -type DidChangeWatchedFilesClientCapabilities struct { - - /*DynamicRegistration defined: - * Did change watched files notification supports dynamic registration. Please note - * that the current protocol doesn't support static configuration for file changes - * from the server side. - */ - DynamicRegistration bool `json:"dynamicRegistration,omitempty"` -} - -/*DidChangeWatchedFilesParams defined: - * The watched files change notification's parameters. - */ -type DidChangeWatchedFilesParams struct { - - /*Changes defined: - * The actual file events. - */ - Changes []FileEvent `json:"changes"` -} - -/*FileEvent defined: - * An event describing a file change. - */ -type FileEvent struct { - - /*URI defined: - * The file's uri. - */ - URI DocumentURI `json:"uri"` - - /*Type defined: - * The change type. - */ - Type FileChangeType `json:"type"` -} - -/*DidChangeWatchedFilesRegistrationOptions defined: - * Describe options to be used when registered for text document change events. - */ -type DidChangeWatchedFilesRegistrationOptions struct { - - /*Watchers defined: - * The watchers to register. - */ - Watchers []FileSystemWatcher `json:"watchers"` -} - -// FileSystemWatcher is -type FileSystemWatcher struct { - - /*GlobPattern defined: - * The glob pattern to watch. Glob patterns can have the following syntax: - * - `*` to match one or more characters in a path segment - * - `?` to match on one character in a path segment - * - `**` to match any number of path segments, including none - * - `{}` to group conditions (e.g. `**​/*.{ts,js}` matches all TypeScript and JavaScript files) - * - `[]` to declare a range of characters to match in a path segment (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …) - * - `[!...]` to negate a range of characters to match in a path segment (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but not `example.0`) - */ - GlobPattern string `json:"globPattern"` - - /*Kind defined: - * The kind of events of interest. If omitted it defaults - * to WatchKind.Create | WatchKind.Change | WatchKind.Delete - * which is 7. - */ - Kind float64 `json:"kind,omitempty"` -} - -/*PublishDiagnosticsClientCapabilities defined: - * The publish diagnostic client capabilities. - */ -type PublishDiagnosticsClientCapabilities struct { - - /*RelatedInformation defined: - * Whether the clients accepts diagnostics with related information. - */ - RelatedInformation bool `json:"relatedInformation,omitempty"` - - /*TagSupport defined: - * Client supports the tag property to provide meta data about a diagnostic. - * Clients supporting tags have to handle unknown tags gracefully. - * - * @since 3.15.0 - */ - TagSupport *struct { - - /*ValueSet defined: - * The tags supported by the client. - */ - ValueSet []DiagnosticTag `json:"valueSet"` - } `json:"tagSupport,omitempty"` -} - -/*PublishDiagnosticsParams defined: - * The publish diagnostic notification's parameters. - */ -type PublishDiagnosticsParams struct { - - /*URI defined: - * The URI for which diagnostic information is reported. - */ - URI DocumentURI `json:"uri"` - - /*Version defined: - * Optional the version number of the document the diagnostics are published for. - * - * @since 3.15.0 - */ - Version float64 `json:"version,omitempty"` - - /*Diagnostics defined: - * An array of diagnostic information items. - */ - Diagnostics []Diagnostic `json:"diagnostics"` -} - -/*CompletionClientCapabilities defined: - * Completion client capabilities - */ -type CompletionClientCapabilities struct { - - /*DynamicRegistration defined: - * Whether completion supports dynamic registration. - */ - DynamicRegistration bool `json:"dynamicRegistration,omitempty"` - - /*CompletionItem defined: - * The client supports the following `CompletionItem` specific - * capabilities. - */ - CompletionItem *struct { - - /*SnippetSupport defined: - * Client supports snippets as insert text. - * - * A snippet can define tab stops and placeholders with `$1`, `$2` - * and `${3:foo}`. `$0` defines the final tab stop, it defaults to - * the end of the snippet. Placeholders with equal identifiers are linked, - * that is typing in one will update others too. - */ - SnippetSupport bool `json:"snippetSupport,omitempty"` - - /*CommitCharactersSupport defined: - * Client supports commit characters on a completion item. - */ - CommitCharactersSupport bool `json:"commitCharactersSupport,omitempty"` - - /*DocumentationFormat defined: - * Client supports the follow content formats for the documentation - * property. The order describes the preferred format of the client. - */ - DocumentationFormat []MarkupKind `json:"documentationFormat,omitempty"` - - /*DeprecatedSupport defined: - * Client supports the deprecated property on a completion item. - */ - DeprecatedSupport bool `json:"deprecatedSupport,omitempty"` - - /*PreselectSupport defined: - * Client supports the preselect property on a completion item. - */ - PreselectSupport bool `json:"preselectSupport,omitempty"` - - /*TagSupport defined: - * Client supports the tag property on a completion item. Clients supporting - * tags have to handle unknown tags gracefully. Clients especially need to - * preserve unknown tags when sending a completion item back to the server in - * a resolve call. - * - * @since 3.15.0 - */ - TagSupport *struct { - - /*ValueSet defined: - * The tags supported by the client. - */ - ValueSet []CompletionItemTag `json:"valueSet"` - } `json:"tagSupport,omitempty"` - } `json:"completionItem,omitempty"` - - // CompletionItemKind is - CompletionItemKind *struct { - - /*ValueSet defined: - * The completion item kind values the client supports. When this - * property exists the client also guarantees that it will - * handle values outside its set gracefully and falls back - * to a default value when unknown. - * - * If this property is not present the client only supports - * the completion items kinds from `Text` to `Reference` as defined in - * the initial version of the protocol. - */ - ValueSet []CompletionItemKind `json:"valueSet,omitempty"` - } `json:"completionItemKind,omitempty"` - - /*ContextSupport defined: - * The client supports to send additional context information for a - * `textDocument/completion` requestion. - */ - ContextSupport bool `json:"contextSupport,omitempty"` -} - -/*CompletionContext defined: - * Contains additional information about the context in which a completion request is triggered. - */ -type CompletionContext struct { - - /*TriggerKind defined: - * How the completion was triggered. - */ - TriggerKind CompletionTriggerKind `json:"triggerKind"` - - /*TriggerCharacter defined: - * The trigger character (a single character) that has trigger code complete. - * Is undefined if `triggerKind !== CompletionTriggerKind.TriggerCharacter` - */ - TriggerCharacter string `json:"triggerCharacter,omitempty"` -} - -/*CompletionParams defined: - * Completion parameters - */ -type CompletionParams struct { - - /*Context defined: - * The completion context. This is only available it the client specifies - * to send this using the client capability `textDocument.completion.contextSupport === true` - */ - Context *CompletionContext `json:"context,omitempty"` - TextDocumentPositionParams - WorkDoneProgressParams - PartialResultParams -} - -/*CompletionOptions defined: - * Completion options. - */ -type CompletionOptions struct { - - /*TriggerCharacters defined: - * Most tools trigger completion request automatically without explicitly requesting - * it using a keyboard shortcut (e.g. Ctrl+Space). Typically they do so when the user - * starts to type an identifier. For example if the user types `c` in a JavaScript file - * code complete will automatically pop up present `console` besides others as a - * completion item. Characters that make up identifiers don't need to be listed here. - * - * If code complete should automatically be trigger on characters not being valid inside - * an identifier (for example `.` in JavaScript) list them in `triggerCharacters`. - */ - TriggerCharacters []string `json:"triggerCharacters,omitempty"` - - /*AllCommitCharacters defined: - * The list of all possible characters that commit a completion. This field can be used - * if clients don't support individual commmit characters per completion item. See - * `ClientCapabilities.textDocument.completion.completionItem.commitCharactersSupport` - * - * @since 3.2.0 - */ - AllCommitCharacters []string `json:"allCommitCharacters,omitempty"` - - /*ResolveProvider defined: - * The server provides support to resolve additional - * information for a completion item. - */ - ResolveProvider bool `json:"resolveProvider,omitempty"` - WorkDoneProgressOptions -} - -/*CompletionRegistrationOptions defined: - * Registration options for a [CompletionRequest](#CompletionRequest). - */ -type CompletionRegistrationOptions struct { - TextDocumentRegistrationOptions - CompletionOptions -} - -// HoverClientCapabilities is -type HoverClientCapabilities struct { - - /*DynamicRegistration defined: - * Whether hover supports dynamic registration. - */ - DynamicRegistration bool `json:"dynamicRegistration,omitempty"` - - /*ContentFormat defined: - * Client supports the follow content formats for the content - * property. The order describes the preferred format of the client. - */ - ContentFormat []MarkupKind `json:"contentFormat,omitempty"` -} - -/*HoverOptions defined: - * Hover options. - */ -type HoverOptions struct { - WorkDoneProgressOptions -} - -/*HoverParams defined: - * Parameters for a [HoverRequest](#HoverRequest). - */ -type HoverParams struct { - TextDocumentPositionParams - WorkDoneProgressParams -} - -/*HoverRegistrationOptions defined: - * Registration options for a [HoverRequest](#HoverRequest). - */ -type HoverRegistrationOptions struct { - TextDocumentRegistrationOptions - HoverOptions -} - -/*SignatureHelpClientCapabilities defined: - * Client Capabilities for a [SignatureHelpRequest](#SignatureHelpRequest). - */ -type SignatureHelpClientCapabilities struct { - - /*DynamicRegistration defined: - * Whether signature help supports dynamic registration. - */ - DynamicRegistration bool `json:"dynamicRegistration,omitempty"` - - /*SignatureInformation defined: - * The client supports the following `SignatureInformation` - * specific properties. - */ - SignatureInformation *struct { - - /*DocumentationFormat defined: - * Client supports the follow content formats for the documentation - * property. The order describes the preferred format of the client. - */ - DocumentationFormat []MarkupKind `json:"documentationFormat,omitempty"` - - /*ParameterInformation defined: - * Client capabilities specific to parameter information. - */ - ParameterInformation *struct { - - /*LabelOffsetSupport defined: - * The client supports processing label offsets instead of a - * simple label string. - * - * @since 3.14.0 - */ - LabelOffsetSupport bool `json:"labelOffsetSupport,omitempty"` - } `json:"parameterInformation,omitempty"` - } `json:"signatureInformation,omitempty"` - - /*ContextSupport defined: - * The client supports to send additional context information for a - * `textDocument/signatureHelp` request. A client that opts into - * contextSupport will also support the `retriggerCharacters` on - * `SignatureHelpOptions`. - * - * @since 3.15.0 - */ - ContextSupport bool `json:"contextSupport,omitempty"` -} - -/*SignatureHelpOptions defined: - * Server Capabilities for a [SignatureHelpRequest](#SignatureHelpRequest). - */ -type SignatureHelpOptions struct { - - /*TriggerCharacters defined: - * List of characters that trigger signature help. - */ - TriggerCharacters []string `json:"triggerCharacters,omitempty"` - - /*RetriggerCharacters defined: - * List of characters that re-trigger signature help. - * - * These trigger characters are only active when signature help is already showing. All trigger characters - * are also counted as re-trigger characters. - * - * @since 3.15.0 - */ - RetriggerCharacters []string `json:"retriggerCharacters,omitempty"` - WorkDoneProgressOptions -} - -/*SignatureHelpContext defined: - * Additional information about the context in which a signature help request was triggered. - * - * @since 3.15.0 - */ -type SignatureHelpContext struct { - - /*TriggerKind defined: - * Action that caused signature help to be triggered. - */ - TriggerKind SignatureHelpTriggerKind `json:"triggerKind"` - - /*TriggerCharacter defined: - * Character that caused signature help to be triggered. - * - * This is undefined when `triggerKind !== SignatureHelpTriggerKind.TriggerCharacter` - */ - TriggerCharacter string `json:"triggerCharacter,omitempty"` - - /*IsRetrigger defined: - * `true` if signature help was already showing when it was triggered. - * - * Retriggers occur when the signature help is already active and can be caused by actions such as - * typing a trigger character, a cursor move, or document content changes. - */ - IsRetrigger bool `json:"isRetrigger"` - - /*ActiveSignatureHelp defined: - * The currently active `SignatureHelp`. - * - * The `activeSignatureHelp` has its `SignatureHelp.activeSignature` field updated based on - * the user navigating through available signatures. - */ - ActiveSignatureHelp *SignatureHelp `json:"activeSignatureHelp,omitempty"` -} - -/*SignatureHelpParams defined: - * Parameters for a [SignatureHelpRequest](#SignatureHelpRequest). - */ -type SignatureHelpParams struct { - - /*Context defined: - * The signature help context. This is only available if the client specifies - * to send this using the client capability `textDocument.signatureHelp.contextSupport === true` - * - * @since 3.15.0 - */ - Context *SignatureHelpContext `json:"context,omitempty"` - TextDocumentPositionParams - WorkDoneProgressParams -} - -/*SignatureHelpRegistrationOptions defined: - * Registration options for a [SignatureHelpRequest](#SignatureHelpRequest). - */ -type SignatureHelpRegistrationOptions struct { - TextDocumentRegistrationOptions - SignatureHelpOptions -} - -/*DefinitionClientCapabilities defined: - * Client Capabilities for a [DefinitionRequest](#DefinitionRequest). - */ -type DefinitionClientCapabilities struct { - - /*DynamicRegistration defined: - * Whether definition supports dynamic registration. - */ - DynamicRegistration bool `json:"dynamicRegistration,omitempty"` - - /*LinkSupport defined: - * The client supports additional metadata in the form of definition links. - * - * @since 3.14.0 - */ - LinkSupport bool `json:"linkSupport,omitempty"` -} - -/*DefinitionOptions defined: - * Server Capabilities for a [DefinitionRequest](#DefinitionRequest). - */ -type DefinitionOptions struct { - WorkDoneProgressOptions -} - -/*DefinitionParams defined: - * Parameters for a [DefinitionRequest](#DefinitionRequest). - */ -type DefinitionParams struct { - TextDocumentPositionParams - WorkDoneProgressParams - PartialResultParams -} - -/*DefinitionRegistrationOptions defined: - * Registration options for a [DefinitionRequest](#DefinitionRequest). - */ -type DefinitionRegistrationOptions struct { - TextDocumentRegistrationOptions - DefinitionOptions -} - -/*ReferenceClientCapabilities defined: - * Client Capabilities for a [ReferencesRequest](#ReferencesRequest). - */ -type ReferenceClientCapabilities struct { - - /*DynamicRegistration defined: - * Whether references supports dynamic registration. - */ - DynamicRegistration bool `json:"dynamicRegistration,omitempty"` -} - -/*ReferenceParams defined: - * Parameters for a [ReferencesRequest](#ReferencesRequest). - */ -type ReferenceParams struct { - - // Context is - Context ReferenceContext `json:"context"` - TextDocumentPositionParams - WorkDoneProgressParams - PartialResultParams -} - -/*ReferenceOptions defined: - * Reference options. - */ -type ReferenceOptions struct { - WorkDoneProgressOptions -} - -/*ReferenceRegistrationOptions defined: - * Registration options for a [ReferencesRequest](#ReferencesRequest). - */ -type ReferenceRegistrationOptions struct { - TextDocumentRegistrationOptions - ReferenceOptions -} - -/*DocumentHighlightClientCapabilities defined: - * Client Capabilities for a [DocumentHighlightRequest](#DocumentHighlightRequest). - */ -type DocumentHighlightClientCapabilities struct { - - /*DynamicRegistration defined: - * Whether document highlight supports dynamic registration. - */ - DynamicRegistration bool `json:"dynamicRegistration,omitempty"` -} - -/*DocumentHighlightParams defined: - * Parameters for a [DocumentHighlightRequest](#DocumentHighlightRequest). - */ -type DocumentHighlightParams struct { - TextDocumentPositionParams - WorkDoneProgressParams - PartialResultParams -} - -/*DocumentHighlightOptions defined: - * Provider options for a [DocumentHighlightRequest](#DocumentHighlightRequest). - */ -type DocumentHighlightOptions struct { - WorkDoneProgressOptions -} - -/*DocumentHighlightRegistrationOptions defined: - * Registration options for a [DocumentHighlightRequest](#DocumentHighlightRequest). - */ -type DocumentHighlightRegistrationOptions struct { - TextDocumentRegistrationOptions - DocumentHighlightOptions -} - -/*DocumentSymbolClientCapabilities defined: - * Client Capabilities for a [DocumentSymbolRequest](#DocumentSymbolRequest). - */ -type DocumentSymbolClientCapabilities struct { - - /*DynamicRegistration defined: - * Whether document symbol supports dynamic registration. - */ - DynamicRegistration bool `json:"dynamicRegistration,omitempty"` - - /*SymbolKind defined: - * Specific capabilities for the `SymbolKind`. - */ - SymbolKind *struct { - - /*ValueSet defined: - * The symbol kind values the client supports. When this - * property exists the client also guarantees that it will - * handle values outside its set gracefully and falls back - * to a default value when unknown. - * - * If this property is not present the client only supports - * the symbol kinds from `File` to `Array` as defined in - * the initial version of the protocol. - */ - ValueSet []SymbolKind `json:"valueSet,omitempty"` - } `json:"symbolKind,omitempty"` - - /*HierarchicalDocumentSymbolSupport defined: - * The client support hierarchical document symbols. - */ - HierarchicalDocumentSymbolSupport bool `json:"hierarchicalDocumentSymbolSupport,omitempty"` -} - -/*DocumentSymbolParams defined: - * Parameters for a [DocumentSymbolRequest](#DocumentSymbolRequest). - */ -type DocumentSymbolParams struct { - - /*TextDocument defined: - * The text document. - */ - TextDocument TextDocumentIdentifier `json:"textDocument"` - WorkDoneProgressParams - PartialResultParams -} - -/*DocumentSymbolOptions defined: - * Provider options for a [DocumentSymbolRequest](#DocumentSymbolRequest). - */ -type DocumentSymbolOptions struct { - WorkDoneProgressOptions -} - -/*DocumentSymbolRegistrationOptions defined: - * Registration options for a [DocumentSymbolRequest](#DocumentSymbolRequest). - */ -type DocumentSymbolRegistrationOptions struct { - TextDocumentRegistrationOptions - DocumentSymbolOptions -} - -/*CodeActionClientCapabilities defined: - * The Client Capabilities of a [CodeActionRequest](#CodeActionRequest). - */ -type CodeActionClientCapabilities struct { - - /*DynamicRegistration defined: - * Whether code action supports dynamic registration. - */ - DynamicRegistration bool `json:"dynamicRegistration,omitempty"` - - /*CodeActionLiteralSupport defined: - * The client support code action literals as a valid - * response of the `textDocument/codeAction` request. - * - * @since 3.8.0 - */ - CodeActionLiteralSupport *struct { - - /*CodeActionKind defined: - * The code action kind is support with the following value - * set. - */ - CodeActionKind struct { - - /*ValueSet defined: - * The code action kind values the client supports. When this - * property exists the client also guarantees that it will - * handle values outside its set gracefully and falls back - * to a default value when unknown. - */ - ValueSet []CodeActionKind `json:"valueSet"` - } `json:"codeActionKind"` - } `json:"codeActionLiteralSupport,omitempty"` - - /*IsPreferredSupport defined: - * Whether code action supports the `isPreferred` property. - * @since 3.15.0 - */ - IsPreferredSupport bool `json:"isPreferredSupport,omitempty"` -} - -/*CodeActionParams defined: - * The parameters of a [CodeActionRequest](#CodeActionRequest). - */ -type CodeActionParams struct { - - /*TextDocument defined: - * The document in which the command was invoked. - */ - TextDocument TextDocumentIdentifier `json:"textDocument"` - - /*Range defined: - * The range for which the command was invoked. - */ - Range Range `json:"range"` - - /*Context defined: - * Context carrying additional information. - */ - Context CodeActionContext `json:"context"` - WorkDoneProgressParams - PartialResultParams -} - -/*CodeActionOptions defined: - * Provider options for a [CodeActionRequest](#CodeActionRequest). - */ -type CodeActionOptions struct { - - /*CodeActionKinds defined: - * CodeActionKinds that this server may return. - * - * The list of kinds may be generic, such as `CodeActionKind.Refactor`, or the server - * may list out every specific kind they provide. - */ - CodeActionKinds []CodeActionKind `json:"codeActionKinds,omitempty"` - WorkDoneProgressOptions -} - -/*CodeActionRegistrationOptions defined: - * Registration options for a [CodeActionRequest](#CodeActionRequest). - */ -type CodeActionRegistrationOptions struct { - TextDocumentRegistrationOptions - CodeActionOptions -} - -/*WorkspaceSymbolClientCapabilities defined: - * Client capabilities for a [WorkspaceSymbolRequest](#WorkspaceSymbolRequest). - */ -type WorkspaceSymbolClientCapabilities struct { - - /*DynamicRegistration defined: - * Symbol request supports dynamic registration. - */ - DynamicRegistration bool `json:"dynamicRegistration,omitempty"` - - /*SymbolKind defined: - * Specific capabilities for the `SymbolKind` in the `workspace/symbol` request. - */ - SymbolKind *struct { - - /*ValueSet defined: - * The symbol kind values the client supports. When this - * property exists the client also guarantees that it will - * handle values outside its set gracefully and falls back - * to a default value when unknown. - * - * If this property is not present the client only supports - * the symbol kinds from `File` to `Array` as defined in - * the initial version of the protocol. - */ - ValueSet []SymbolKind `json:"valueSet,omitempty"` - } `json:"symbolKind,omitempty"` -} - -/*WorkspaceSymbolParams defined: - * The parameters of a [WorkspaceSymbolRequest](#WorkspaceSymbolRequest). - */ -type WorkspaceSymbolParams struct { - - /*Query defined: - * A query string to filter symbols by. Clients may send an empty - * string here to request all symbols. - */ - Query string `json:"query"` - WorkDoneProgressParams - PartialResultParams -} - -/*WorkspaceSymbolOptions defined: - * Server capabilities for a [WorkspaceSymbolRequest](#WorkspaceSymbolRequest). - */ -type WorkspaceSymbolOptions struct { - WorkDoneProgressOptions -} - -/*WorkspaceSymbolRegistrationOptions defined: - * Registration options for a [WorkspaceSymbolRequest](#WorkspaceSymbolRequest). - */ -type WorkspaceSymbolRegistrationOptions struct { - WorkspaceSymbolOptions -} - -/*CodeLensClientCapabilities defined: - * The client capabilities of a [CodeLensRequest](#CodeLensRequest). - */ -type CodeLensClientCapabilities struct { - - /*DynamicRegistration defined: - * Whether code lens supports dynamic registration. - */ - DynamicRegistration bool `json:"dynamicRegistration,omitempty"` -} - -/*CodeLensParams defined: - * The parameters of a [CodeLensRequest](#CodeLensRequest). - */ -type CodeLensParams struct { - - /*TextDocument defined: - * The document to request code lens for. - */ - TextDocument TextDocumentIdentifier `json:"textDocument"` - WorkDoneProgressParams - PartialResultParams -} - -/*CodeLensOptions defined: - * Code Lens provider options of a [CodeLensRequest](#CodeLensRequest). - */ -type CodeLensOptions struct { - - /*ResolveProvider defined: - * Code lens has a resolve provider as well. - */ - ResolveProvider bool `json:"resolveProvider,omitempty"` - WorkDoneProgressOptions -} - -/*CodeLensRegistrationOptions defined: - * Registration options for a [CodeLensRequest](#CodeLensRequest). - */ -type CodeLensRegistrationOptions struct { - TextDocumentRegistrationOptions - CodeLensOptions -} - -/*DocumentLinkClientCapabilities defined: - * The client capabilities of a [DocumentLinkRequest](#DocumentLinkRequest). - */ -type DocumentLinkClientCapabilities struct { - - /*DynamicRegistration defined: - * Whether document link supports dynamic registration. - */ - DynamicRegistration bool `json:"dynamicRegistration,omitempty"` - - /*TooltipSupport defined: - * Whether the client support the `tooltip` property on `DocumentLink`. - * - * @since 3.15.0 - */ - TooltipSupport bool `json:"tooltipSupport,omitempty"` -} - -/*DocumentLinkParams defined: - * The parameters of a [DocumentLinkRequest](#DocumentLinkRequest). - */ -type DocumentLinkParams struct { - - /*TextDocument defined: - * The document to provide document links for. - */ - TextDocument TextDocumentIdentifier `json:"textDocument"` - WorkDoneProgressParams - PartialResultParams -} - -/*DocumentLinkOptions defined: - * Provider options for a [DocumentLinkRequest](#DocumentLinkRequest). - */ -type DocumentLinkOptions struct { - - /*ResolveProvider defined: - * Document links have a resolve provider as well. - */ - ResolveProvider bool `json:"resolveProvider,omitempty"` - WorkDoneProgressOptions -} - -/*DocumentLinkRegistrationOptions defined: - * Registration options for a [DocumentLinkRequest](#DocumentLinkRequest). - */ -type DocumentLinkRegistrationOptions struct { - TextDocumentRegistrationOptions - DocumentLinkOptions -} - -/*DocumentFormattingClientCapabilities defined: - * Client capabilities of a [DocumentFormattingRequest](#DocumentFormattingRequest). - */ -type DocumentFormattingClientCapabilities struct { - - /*DynamicRegistration defined: - * Whether formatting supports dynamic registration. - */ - DynamicRegistration bool `json:"dynamicRegistration,omitempty"` -} - -/*DocumentFormattingParams defined: - * The parameters of a [DocumentFormattingRequest](#DocumentFormattingRequest). - */ -type DocumentFormattingParams struct { - - /*TextDocument defined: - * The document to format. - */ - TextDocument TextDocumentIdentifier `json:"textDocument"` - - /*Options defined: - * The format options - */ - Options FormattingOptions `json:"options"` - WorkDoneProgressParams -} - -/*DocumentFormattingOptions defined: - * Provider options for a [DocumentFormattingRequest](#DocumentFormattingRequest). - */ -type DocumentFormattingOptions struct { - WorkDoneProgressOptions -} - -/*DocumentFormattingRegistrationOptions defined: - * Registration options for a [DocumentFormattingRequest](#DocumentFormattingRequest). - */ -type DocumentFormattingRegistrationOptions struct { - TextDocumentRegistrationOptions - DocumentFormattingOptions -} - -/*DocumentRangeFormattingClientCapabilities defined: - * Client capabilities of a [DocumentRangeFormattingRequest](#DocumentRangeFormattingRequest). - */ -type DocumentRangeFormattingClientCapabilities struct { - - /*DynamicRegistration defined: - * Whether range formatting supports dynamic registration. - */ - DynamicRegistration bool `json:"dynamicRegistration,omitempty"` -} - -/*DocumentRangeFormattingParams defined: - * The parameters of a [DocumentRangeFormattingRequest](#DocumentRangeFormattingRequest). - */ -type DocumentRangeFormattingParams struct { - - /*TextDocument defined: - * The document to format. - */ - TextDocument TextDocumentIdentifier `json:"textDocument"` - - /*Range defined: - * The range to format - */ - Range Range `json:"range"` - - /*Options defined: - * The format options - */ - Options FormattingOptions `json:"options"` - WorkDoneProgressParams -} - -/*DocumentRangeFormattingOptions defined: - * Provider options for a [DocumentRangeFormattingRequest](#DocumentRangeFormattingRequest). - */ -type DocumentRangeFormattingOptions struct { - WorkDoneProgressOptions -} - -/*DocumentRangeFormattingRegistrationOptions defined: - * Registration options for a [DocumentRangeFormattingRequest](#DocumentRangeFormattingRequest). - */ -type DocumentRangeFormattingRegistrationOptions struct { - TextDocumentRegistrationOptions - DocumentRangeFormattingOptions -} - -/*DocumentOnTypeFormattingClientCapabilities defined: - * Client capabilities of a [DocumentOnTypeFormattingRequest](#DocumentOnTypeFormattingRequest). - */ -type DocumentOnTypeFormattingClientCapabilities struct { - - /*DynamicRegistration defined: - * Whether on type formatting supports dynamic registration. - */ - DynamicRegistration bool `json:"dynamicRegistration,omitempty"` -} - -/*DocumentOnTypeFormattingParams defined: - * The parameters of a [DocumentOnTypeFormattingRequest](#DocumentOnTypeFormattingRequest). - */ -type DocumentOnTypeFormattingParams struct { - - /*TextDocument defined: - * The document to format. - */ - TextDocument TextDocumentIdentifier `json:"textDocument"` - - /*Position defined: - * The position at which this request was send. - */ - Position Position `json:"position"` - - /*Ch defined: - * The character that has been typed. - */ - Ch string `json:"ch"` - - /*Options defined: - * The format options. - */ - Options FormattingOptions `json:"options"` -} - -/*DocumentOnTypeFormattingOptions defined: - * Provider options for a [DocumentOnTypeFormattingRequest](#DocumentOnTypeFormattingRequest). - */ -type DocumentOnTypeFormattingOptions struct { - - /*FirstTriggerCharacter defined: - * A character on which formatting should be triggered, like `}`. - */ - FirstTriggerCharacter string `json:"firstTriggerCharacter"` - - /*MoreTriggerCharacter defined: - * More trigger characters. - */ - MoreTriggerCharacter []string `json:"moreTriggerCharacter,omitempty"` -} - -/*DocumentOnTypeFormattingRegistrationOptions defined: - * Registration options for a [DocumentOnTypeFormattingRequest](#DocumentOnTypeFormattingRequest). - */ -type DocumentOnTypeFormattingRegistrationOptions struct { - TextDocumentRegistrationOptions - DocumentOnTypeFormattingOptions -} - -// RenameClientCapabilities is -type RenameClientCapabilities struct { - - /*DynamicRegistration defined: - * Whether rename supports dynamic registration. - */ - DynamicRegistration bool `json:"dynamicRegistration,omitempty"` - - /*PrepareSupport defined: - * Client supports testing for validity of rename operations - * before execution. - * - * @since version 3.12.0 - */ - PrepareSupport bool `json:"prepareSupport,omitempty"` -} - -/*RenameParams defined: - * The parameters of a [RenameRequest](#RenameRequest). - */ -type RenameParams struct { - - /*TextDocument defined: - * The document to rename. - */ - TextDocument TextDocumentIdentifier `json:"textDocument"` - - /*Position defined: - * The position at which this request was sent. - */ - Position Position `json:"position"` - - /*NewName defined: - * The new name of the symbol. If the given name is not valid the - * request must return a [ResponseError](#ResponseError) with an - * appropriate message set. - */ - NewName string `json:"newName"` - WorkDoneProgressParams -} - -/*RenameOptions defined: - * Provider options for a [RenameRequest](#RenameRequest). - */ -type RenameOptions struct { - - /*PrepareProvider defined: - * Renames should be checked and tested before being executed. - * - * @since version 3.12.0 - */ - PrepareProvider bool `json:"prepareProvider,omitempty"` - WorkDoneProgressOptions -} - -/*RenameRegistrationOptions defined: - * Registration options for a [RenameRequest](#RenameRequest). - */ -type RenameRegistrationOptions struct { - TextDocumentRegistrationOptions - RenameOptions -} - -// PrepareRenameParams is -type PrepareRenameParams struct { - TextDocumentPositionParams - WorkDoneProgressParams -} - -/*ExecuteCommandClientCapabilities defined: - * The client capabilities of a [ExecuteCommandRequest](#ExecuteCommandRequest). - */ -type ExecuteCommandClientCapabilities struct { - - /*DynamicRegistration defined: - * Execute command supports dynamic registration. - */ - DynamicRegistration bool `json:"dynamicRegistration,omitempty"` -} - -/*ExecuteCommandParams defined: - * The parameters of a [ExecuteCommandRequest](#ExecuteCommandRequest). - */ -type ExecuteCommandParams struct { - - /*Command defined: - * The identifier of the actual command handler. - */ - Command string `json:"command"` - - /*Arguments defined: - * Arguments that the command should be invoked with. - */ - Arguments []interface{} `json:"arguments,omitempty"` - WorkDoneProgressParams -} - -/*ExecuteCommandOptions defined: - * The server capabilities of a [ExecuteCommandRequest](#ExecuteCommandRequest). - */ -type ExecuteCommandOptions struct { - - /*Commands defined: - * The commands to be executed on the server - */ - Commands []string `json:"commands"` - WorkDoneProgressOptions -} - -/*ExecuteCommandRegistrationOptions defined: - * Registration options for a [ExecuteCommandRequest](#ExecuteCommandRequest). - */ -type ExecuteCommandRegistrationOptions struct { - ExecuteCommandOptions -} - -// WorkspaceEditClientCapabilities is -type WorkspaceEditClientCapabilities struct { - - /*DocumentChanges defined: - * The client supports versioned document changes in `WorkspaceEdit`s - */ - DocumentChanges bool `json:"documentChanges,omitempty"` - - /*ResourceOperations defined: - * The resource operations the client supports. Clients should at least - * support 'create', 'rename' and 'delete' files and folders. - * - * @since 3.13.0 - */ - ResourceOperations []ResourceOperationKind `json:"resourceOperations,omitempty"` - - /*FailureHandling defined: - * The failure handling strategy of a client if applying the workspace edit - * fails. - * - * @since 3.13.0 - */ - FailureHandling FailureHandlingKind `json:"failureHandling,omitempty"` -} - -/*ApplyWorkspaceEditParams defined: - * The parameters passed via a apply workspace edit request. - */ -type ApplyWorkspaceEditParams struct { - - /*Label defined: - * An optional label of the workspace edit. This label is - * presented in the user interface for example on an undo - * stack to undo the workspace edit. - */ - Label string `json:"label,omitempty"` - - /*Edit defined: - * The edits to apply. - */ - Edit WorkspaceEdit `json:"edit"` -} - -/*ApplyWorkspaceEditResponse defined: - * A response returned from the apply workspace edit request. - */ -type ApplyWorkspaceEditResponse struct { - - /*Applied defined: - * Indicates whether the edit was applied or not. - */ - Applied bool `json:"applied"` - - /*FailureReason defined: - * An optional textual description for why the edit was not applied. - * This may be used by the server for diagnostic logging or to provide - * a suitable error for a request that triggered the edit. - */ - FailureReason string `json:"failureReason,omitempty"` - - /*FailedChange defined: - * Depending on the client's failure handling strategy `failedChange` might - * contain the index of the change that failed. This property is only available - * if the client signals a `failureHandlingStrategy` in its client capabilities. - */ - FailedChange float64 `json:"failedChange,omitempty"` -} - -/*Position defined: - * Position in a text document expressed as zero-based line and character offset. - * The offsets are based on a UTF-16 string representation. So a string of the form - * `a𐐀b` the character offset of the character `a` is 0, the character offset of `𐐀` - * is 1 and the character offset of b is 3 since `𐐀` is represented using two code - * units in UTF-16. - * - * Positions are line end character agnostic. So you can not specify a position that - * denotes `\r|\n` or `\n|` where `|` represents the character offset. - */ -type Position struct { - - /*Line defined: - * Line position in a document (zero-based). - * If a line number is greater than the number of lines in a document, it defaults back to the number of lines in the document. - * If a line number is negative, it defaults to 0. - */ - Line float64 `json:"line"` - - /*Character defined: - * Character offset on a line in a document (zero-based). Assuming that the line is - * represented as a string, the `character` value represents the gap between the - * `character` and `character + 1`. - * - * If the character value is greater than the line length it defaults back to the - * line length. - * If a line number is negative, it defaults to 0. - */ - Character float64 `json:"character"` -} - -/*Range defined: - * A range in a text document expressed as (zero-based) start and end positions. - * - * If you want to specify a range that contains a line including the line ending - * character(s) then use an end position denoting the start of the next line. - * For example: - * ```ts - * { - * start: { line: 5, character: 23 } - * end : { line 6, character : 0 } - * } - * ``` - */ -type Range struct { - - /*Start defined: - * The range's start position - */ - Start Position `json:"start"` - - /*End defined: - * The range's end position. - */ - End Position `json:"end"` -} - -/*Location defined: - * Represents a location inside a resource, such as a line - * inside a text file. - */ -type Location struct { - - // URI is - URI DocumentURI `json:"uri"` - - // Range is - Range Range `json:"range"` -} - -/*LocationLink defined: - * Represents the connection of two locations. Provides additional metadata over normal [locations](#Location), - * including an origin range. - */ -type LocationLink struct { - - /*OriginSelectionRange defined: - * Span of the origin of this link. - * - * Used as the underlined span for mouse definition hover. Defaults to the word range at - * the definition position. - */ - OriginSelectionRange *Range `json:"originSelectionRange,omitempty"` - - /*TargetURI defined: - * The target resource identifier of this link. - */ - TargetURI DocumentURI `json:"targetUri"` - - /*TargetRange defined: - * The full target range of this link. If the target for example is a symbol then target range is the - * range enclosing this symbol not including leading/trailing whitespace but everything else - * like comments. This information is typically used to highlight the range in the editor. - */ - TargetRange Range `json:"targetRange"` - - /*TargetSelectionRange defined: - * The range that should be selected and revealed when this link is being followed, e.g the name of a function. - * Must be contained by the the `targetRange`. See also `DocumentSymbol#range` - */ - TargetSelectionRange Range `json:"targetSelectionRange"` -} - -/*Color defined: - * Represents a color in RGBA space. - */ -type Color struct { - - /*Red defined: - * The red component of this color in the range [0-1]. - */ - Red float64 `json:"red"` - - /*Green defined: - * The green component of this color in the range [0-1]. - */ - Green float64 `json:"green"` - - /*Blue defined: - * The blue component of this color in the range [0-1]. - */ - Blue float64 `json:"blue"` - - /*Alpha defined: - * The alpha component of this color in the range [0-1]. - */ - Alpha float64 `json:"alpha"` -} - -/*ColorInformation defined: - * Represents a color range from a document. - */ -type ColorInformation struct { - - /*Range defined: - * The range in the document where this color appers. - */ - Range Range `json:"range"` - - /*Color defined: - * The actual color value for this color range. - */ - Color Color `json:"color"` -} - -// ColorPresentation is -type ColorPresentation struct { - - /*Label defined: - * The label of this color presentation. It will be shown on the color - * picker header. By default this is also the text that is inserted when selecting - * this color presentation. - */ - Label string `json:"label"` - - /*TextEdit defined: - * An [edit](#TextEdit) which is applied to a document when selecting - * this presentation for the color. When `falsy` the [label](#ColorPresentation.label) - * is used. - */ - TextEdit *TextEdit `json:"textEdit,omitempty"` - - /*AdditionalTextEdits defined: - * An optional array of additional [text edits](#TextEdit) that are applied when - * selecting this color presentation. Edits must not overlap with the main [edit](#ColorPresentation.textEdit) nor with themselves. - */ - AdditionalTextEdits []TextEdit `json:"additionalTextEdits,omitempty"` -} - -/*DiagnosticRelatedInformation defined: - * Represents a related message and source code location for a diagnostic. This should be - * used to point to code locations that cause or related to a diagnostics, e.g when duplicating - * a symbol in a scope. - */ -type DiagnosticRelatedInformation struct { - - /*Location defined: - * The location of this related diagnostic information. - */ - Location Location `json:"location"` - - /*Message defined: - * The message of this related diagnostic information. - */ - Message string `json:"message"` -} - -/*Diagnostic defined: - * Represents a diagnostic, such as a compiler error or warning. Diagnostic objects - * are only valid in the scope of a resource. - */ -type Diagnostic struct { - - /*Range defined: - * The range at which the message applies - */ - Range Range `json:"range"` - - /*Severity defined: - * The diagnostic's severity. Can be omitted. If omitted it is up to the - * client to interpret diagnostics as error, warning, info or hint. - */ - Severity DiagnosticSeverity `json:"severity,omitempty"` - - /*Code defined: - * The diagnostic's code, which usually appear in the user interface. - */ - Code interface{} `json:"code,omitempty"` // number | string - - /*Source defined: - * A human-readable string describing the source of this - * diagnostic, e.g. 'typescript' or 'super lint'. It usually - * appears in the user interface. - */ - Source string `json:"source,omitempty"` - - /*Message defined: - * The diagnostic's message. It usually appears in the user interface - */ - Message string `json:"message"` - - /*Tags defined: - * Additional metadata about the diagnostic. - */ - Tags []DiagnosticTag `json:"tags,omitempty"` - - /*RelatedInformation defined: - * An array of related diagnostic information, e.g. when symbol-names within - * a scope collide all definitions can be marked via this property. - */ - RelatedInformation []DiagnosticRelatedInformation `json:"relatedInformation,omitempty"` -} - -/*Command defined: - * Represents a reference to a command. Provides a title which - * will be used to represent a command in the UI and, optionally, - * an array of arguments which will be passed to the command handler - * function when invoked. - */ -type Command struct { - - /*Title defined: - * Title of the command, like `save`. - */ - Title string `json:"title"` - - /*Command defined: - * The identifier of the actual command handler. - */ - Command string `json:"command"` - - /*Arguments defined: - * Arguments that the command handler should be - * invoked with. - */ - Arguments []interface{} `json:"arguments,omitempty"` -} - -/*TextEdit defined: - * A text edit applicable to a text document. - */ -type TextEdit struct { - - /*Range defined: - * The range of the text document to be manipulated. To insert - * text into a document create a range where start === end. - */ - Range Range `json:"range"` - - /*NewText defined: - * The string to be inserted. For delete operations use an - * empty string. - */ - NewText string `json:"newText"` -} - -/*TextDocumentEdit defined: - * Describes textual changes on a text document. - */ -type TextDocumentEdit struct { - - /*TextDocument defined: - * The text document to change. - */ - TextDocument VersionedTextDocumentIdentifier `json:"textDocument"` - - /*Edits defined: - * The edits to be applied. - */ - Edits []TextEdit `json:"edits"` -} - -// ResourceOperation is -type ResourceOperation struct { - - // Kind is - Kind string `json:"kind"` -} - -/*CreateFileOptions defined: - * Options to create a file. - */ -type CreateFileOptions struct { - - /*Overwrite defined: - * Overwrite existing file. Overwrite wins over `ignoreIfExists` - */ - Overwrite bool `json:"overwrite,omitempty"` - - /*IgnoreIfExists defined: - * Ignore if exists. - */ - IgnoreIfExists bool `json:"ignoreIfExists,omitempty"` -} - -/*CreateFile defined: - * Create file operation. - */ -type CreateFile struct { - - /*Kind defined: - * A create - */ - Kind string `json:"kind"` // 'create' - - /*URI defined: - * The resource to create. - */ - URI DocumentURI `json:"uri"` - - /*Options defined: - * Additional options - */ - Options *CreateFileOptions `json:"options,omitempty"` -} - -/*RenameFileOptions defined: - * Rename file options - */ -type RenameFileOptions struct { - - /*Overwrite defined: - * Overwrite target if existing. Overwrite wins over `ignoreIfExists` - */ - Overwrite bool `json:"overwrite,omitempty"` - - /*IgnoreIfExists defined: - * Ignores if target exists. - */ - IgnoreIfExists bool `json:"ignoreIfExists,omitempty"` -} - -/*RenameFile defined: - * Rename file operation - */ -type RenameFile struct { - - /*Kind defined: - * A rename - */ - Kind string `json:"kind"` // 'rename' - - /*OldURI defined: - * The old (existing) location. - */ - OldURI DocumentURI `json:"oldUri"` - - /*NewURI defined: - * The new location. - */ - NewURI DocumentURI `json:"newUri"` - - /*Options defined: - * Rename options. - */ - Options *RenameFileOptions `json:"options,omitempty"` -} - -/*DeleteFileOptions defined: - * Delete file options - */ -type DeleteFileOptions struct { - - /*Recursive defined: - * Delete the content recursively if a folder is denoted. - */ - Recursive bool `json:"recursive,omitempty"` - - /*IgnoreIfNotExists defined: - * Ignore the operation if the file doesn't exist. - */ - IgnoreIfNotExists bool `json:"ignoreIfNotExists,omitempty"` -} - -/*DeleteFile defined: - * Delete file operation - */ -type DeleteFile struct { - - /*Kind defined: - * A delete - */ - Kind string `json:"kind"` // 'delete' - - /*URI defined: - * The file to delete. - */ - URI DocumentURI `json:"uri"` - - /*Options defined: - * Delete options. - */ - Options *DeleteFileOptions `json:"options,omitempty"` -} - -/*WorkspaceEdit defined: - * A workspace edit represents changes to many resources managed in the workspace. The edit - * should either provide `changes` or `documentChanges`. If documentChanges are present - * they are preferred over `changes` if the client can handle versioned document edits. - */ -type WorkspaceEdit struct { - - /*Changes defined: - * Holds changes to existing resources. - */ - Changes *map[string][]TextEdit `json:"changes,omitempty"` // [uri: string]: TextEdit[]; - - /*DocumentChanges defined: - * Depending on the client capability `workspace.workspaceEdit.resourceOperations` document changes - * are either an array of `TextDocumentEdit`s to express changes to n different text documents - * where each text document edit addresses a specific version of a text document. Or it can contain - * above `TextDocumentEdit`s mixed with create, rename and delete file / folder operations. - * - * Whether a client supports versioned document edits is expressed via - * `workspace.workspaceEdit.documentChanges` client capability. - * - * If a client neither supports `documentChanges` nor `workspace.workspaceEdit.resourceOperations` then - * only plain `TextEdit`s using the `changes` property are supported. - */ - DocumentChanges []TextDocumentEdit `json:"documentChanges,omitempty"` // (TextDocumentEdit | CreateFile | RenameFile | DeleteFile) -} - -/*TextEditChange defined: - * A change to capture text edits for existing resources. - */ -type TextEditChange struct { -} - -/*TextDocumentIdentifier defined: - * A literal to identify a text document in the client. - */ -type TextDocumentIdentifier struct { - - /*URI defined: - * The text document's uri. - */ - URI DocumentURI `json:"uri"` -} - -/*VersionedTextDocumentIdentifier defined: - * An identifier to denote a specific version of a text document. - */ -type VersionedTextDocumentIdentifier struct { - - /*Version defined: - * The version number of this document. If a versioned text document identifier - * is sent from the server to the client and the file is not open in the editor - * (the server has not received an open notification before) the server can send - * `null` to indicate that the version is unknown and the content on disk is the - * truth (as speced with document content ownership). - */ - Version float64 `json:"version"` - TextDocumentIdentifier -} - -/*TextDocumentItem defined: - * An item to transfer a text document from the client to the - * server. - */ -type TextDocumentItem struct { - - /*URI defined: - * The text document's uri. - */ - URI DocumentURI `json:"uri"` - - /*LanguageID defined: - * The text document's language identifier - */ - LanguageID string `json:"languageId"` - - /*Version defined: - * The version number of this document (it will increase after each - * change, including undo/redo). - */ - Version float64 `json:"version"` - - /*Text defined: - * The content of the opened text document. - */ - Text string `json:"text"` -} - -/*MarkupContent defined: - * A `MarkupContent` literal represents a string value which content is interpreted base on its - * kind flag. Currently the protocol supports `plaintext` and `markdown` as markup kinds. - * - * If the kind is `markdown` then the value can contain fenced code blocks like in GitHub issues. - * See https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting - * - * Here is an example how such a string can be constructed using JavaScript / TypeScript: - * ```ts - * let markdown: MarkdownContent = { - * kind: MarkupKind.Markdown, - * value: [ - * '# Header', - * 'Some text', - * '```typescript', - * 'someCode();', - * '```' - * ].join('\n') - * }; - * ``` - * - * *Please Note* that clients might sanitize the return markdown. A client could decide to - * remove HTML from the markdown to avoid script execution. - */ -type MarkupContent struct { - - /*Kind defined: - * The type of the Markup - */ - Kind MarkupKind `json:"kind"` - - /*Value defined: - * The content itself - */ - Value string `json:"value"` -} - -/*CompletionItem defined: - * A completion item represents a text snippet that is - * proposed to complete text that is being typed. - */ -type CompletionItem struct { - - /*Label defined: - * The label of this completion item. By default - * also the text that is inserted when selecting - * this completion. - */ - Label string `json:"label"` - - /*Kind defined: - * The kind of this completion item. Based of the kind - * an icon is chosen by the editor. - */ - Kind CompletionItemKind `json:"kind,omitempty"` - - /*Tags defined: - * Tags for this completion item. - * - * @since 3.15.0 - */ - Tags []CompletionItemTag `json:"tags,omitempty"` - - /*Detail defined: - * A human-readable string with additional information - * about this item, like type or symbol information. - */ - Detail string `json:"detail,omitempty"` - - /*Documentation defined: - * A human-readable string that represents a doc-comment. - */ - Documentation string `json:"documentation,omitempty"` // string | MarkupContent - - /*Deprecated defined: - * Indicates if this item is deprecated. - * @deprecated Use `tags` instead. - */ - Deprecated bool `json:"deprecated,omitempty"` - - /*Preselect defined: - * Select this item when showing. - * - * *Note* that only one completion item can be selected and that the - * tool / client decides which item that is. The rule is that the *first* - * item of those that match best is selected. - */ - Preselect bool `json:"preselect,omitempty"` - - /*SortText defined: - * A string that should be used when comparing this item - * with other items. When `falsy` the [label](#CompletionItem.label) - * is used. - */ - SortText string `json:"sortText,omitempty"` - - /*FilterText defined: - * A string that should be used when filtering a set of - * completion items. When `falsy` the [label](#CompletionItem.label) - * is used. - */ - FilterText string `json:"filterText,omitempty"` - - /*InsertText defined: - * A string that should be inserted into a document when selecting - * this completion. When `falsy` the [label](#CompletionItem.label) - * is used. - * - * The `insertText` is subject to interpretation by the client side. - * Some tools might not take the string literally. For example - * VS Code when code complete is requested in this example `con` - * and a completion item with an `insertText` of `console` is provided it - * will only insert `sole`. Therefore it is recommended to use `textEdit` instead - * since it avoids additional client side interpretation. - */ - InsertText string `json:"insertText,omitempty"` - - /*InsertTextFormat defined: - * The format of the insert text. The format applies to both the `insertText` property - * and the `newText` property of a provided `textEdit`. - */ - InsertTextFormat InsertTextFormat `json:"insertTextFormat,omitempty"` - - /*TextEdit defined: - * An [edit](#TextEdit) which is applied to a document when selecting - * this completion. When an edit is provided the value of - * [insertText](#CompletionItem.insertText) is ignored. - * - * *Note:* The text edit's range must be a [single line] and it must contain the position - * at which completion has been requested. - */ - TextEdit *TextEdit `json:"textEdit,omitempty"` - - /*AdditionalTextEdits defined: - * An optional array of additional [text edits](#TextEdit) that are applied when - * selecting this completion. Edits must not overlap (including the same insert position) - * with the main [edit](#CompletionItem.textEdit) nor with themselves. - * - * Additional text edits should be used to change text unrelated to the current cursor position - * (for example adding an import statement at the top of the file if the completion item will - * insert an unqualified type). - */ - AdditionalTextEdits []TextEdit `json:"additionalTextEdits,omitempty"` - - /*CommitCharacters defined: - * An optional set of characters that when pressed while this completion is active will accept it first and - * then type that character. *Note* that all commit characters should have `length=1` and that superfluous - * characters will be ignored. - */ - CommitCharacters []string `json:"commitCharacters,omitempty"` - - /*Command defined: - * An optional [command](#Command) that is executed *after* inserting this completion. *Note* that - * additional modifications to the current document should be described with the - * [additionalTextEdits](#CompletionItem.additionalTextEdits)-property. - */ - Command *Command `json:"command,omitempty"` - - /*Data defined: - * An data entry field that is preserved on a completion item between - * a [CompletionRequest](#CompletionRequest) and a [CompletionResolveRequest] - * (#CompletionResolveRequest) - */ - Data interface{} `json:"data,omitempty"` -} - -/*CompletionList defined: - * Represents a collection of [completion items](#CompletionItem) to be presented - * in the editor. - */ -type CompletionList struct { - - /*IsIncomplete defined: - * This list it not complete. Further typing results in recomputing this list. - */ - IsIncomplete bool `json:"isIncomplete"` - - /*Items defined: - * The completion items. - */ - Items []CompletionItem `json:"items"` -} - -/*Hover defined: - * The result of a hover request. - */ -type Hover struct { - - /*Contents defined: - * The hover's content - */ - Contents MarkupContent `json:"contents"` // MarkupContent | MarkedString | MarkedString[] - - /*Range defined: - * An optional range - */ - Range *Range `json:"range,omitempty"` -} - -/*ParameterInformation defined: - * Represents a parameter of a callable-signature. A parameter can - * have a label and a doc-comment. - */ -type ParameterInformation struct { - - /*Label defined: - * The label of this parameter information. - * - * Either a string or an inclusive start and exclusive end offsets within its containing - * signature label. (see SignatureInformation.label). The offsets are based on a UTF-16 - * string representation as `Position` and `Range` does. - * - * *Note*: a label of type string should be a substring of its containing signature label. - * Its intended use case is to highlight the parameter label part in the `SignatureInformation.label`. - */ - Label string `json:"label"` // string | [number, number] - - /*Documentation defined: - * The human-readable doc-comment of this signature. Will be shown - * in the UI but can be omitted. - */ - Documentation string `json:"documentation,omitempty"` // string | MarkupContent -} - -/*SignatureInformation defined: - * Represents the signature of something callable. A signature - * can have a label, like a function-name, a doc-comment, and - * a set of parameters. - */ -type SignatureInformation struct { - - /*Label defined: - * The label of this signature. Will be shown in - * the UI. - */ - Label string `json:"label"` - - /*Documentation defined: - * The human-readable doc-comment of this signature. Will be shown - * in the UI but can be omitted. - */ - Documentation string `json:"documentation,omitempty"` // string | MarkupContent - - /*Parameters defined: - * The parameters of this signature. - */ - Parameters []ParameterInformation `json:"parameters,omitempty"` -} - -/*SignatureHelp defined: - * Signature help represents the signature of something - * callable. There can be multiple signature but only one - * active and only one active parameter. - */ -type SignatureHelp struct { - - /*Signatures defined: - * One or more signatures. - */ - Signatures []SignatureInformation `json:"signatures"` - - /*ActiveSignature defined: - * The active signature. Set to `null` if no - * signatures exist. - */ - ActiveSignature float64 `json:"activeSignature"` - - /*ActiveParameter defined: - * The active parameter of the active signature. Set to `null` - * if the active signature has no parameters. - */ - ActiveParameter float64 `json:"activeParameter"` -} - -/*ReferenceContext defined: - * Value-object that contains additional information when - * requesting references. - */ -type ReferenceContext struct { - - /*IncludeDeclaration defined: - * Include the declaration of the current symbol. - */ - IncludeDeclaration bool `json:"includeDeclaration"` -} - -/*DocumentHighlight defined: - * A document highlight is a range inside a text document which deserves - * special attention. Usually a document highlight is visualized by changing - * the background color of its range. - */ -type DocumentHighlight struct { - - /*Range defined: - * The range this highlight applies to. - */ - Range Range `json:"range"` - - /*Kind defined: - * The highlight kind, default is [text](#DocumentHighlightKind.Text). - */ - Kind *DocumentHighlightKind `json:"kind,omitempty"` -} - -/*SymbolInformation defined: - * Represents information about programming constructs like variables, classes, - * interfaces etc. - */ -type SymbolInformation struct { - - /*Name defined: - * The name of this symbol. - */ - Name string `json:"name"` - - /*Kind defined: - * The kind of this symbol. - */ - Kind SymbolKind `json:"kind"` - - /*Deprecated defined: - * Indicates if this symbol is deprecated. - */ - Deprecated bool `json:"deprecated,omitempty"` - - /*Location defined: - * The location of this symbol. The location's range is used by a tool - * to reveal the location in the editor. If the symbol is selected in the - * tool the range's start information is used to position the cursor. So - * the range usually spans more than the actual symbol's name and does - * normally include thinks like visibility modifiers. - * - * The range doesn't have to denote a node range in the sense of a abstract - * syntax tree. It can therefore not be used to re-construct a hierarchy of - * the symbols. - */ - Location Location `json:"location"` - - /*ContainerName defined: - * The name of the symbol containing this symbol. This information is for - * user interface purposes (e.g. to render a qualifier in the user interface - * if necessary). It can't be used to re-infer a hierarchy for the document - * symbols. - */ - ContainerName string `json:"containerName,omitempty"` -} - -/*DocumentSymbol defined: - * Represents programming constructs like variables, classes, interfaces etc. - * that appear in a document. Document symbols can be hierarchical and they - * have two ranges: one that encloses its definition and one that points to - * its most interesting range, e.g. the range of an identifier. - */ -type DocumentSymbol struct { - - /*Name defined: - * The name of this symbol. Will be displayed in the user interface and therefore must not be - * an empty string or a string only consisting of white spaces. - */ - Name string `json:"name"` - - /*Detail defined: - * More detail for this symbol, e.g the signature of a function. - */ - Detail string `json:"detail,omitempty"` - - /*Kind defined: - * The kind of this symbol. - */ - Kind SymbolKind `json:"kind"` - - /*Deprecated defined: - * Indicates if this symbol is deprecated. - */ - Deprecated bool `json:"deprecated,omitempty"` - - /*Range defined: - * The range enclosing this symbol not including leading/trailing whitespace but everything else - * like comments. This information is typically used to determine if the the clients cursor is - * inside the symbol to reveal in the symbol in the UI. - */ - Range Range `json:"range"` - - /*SelectionRange defined: - * The range that should be selected and revealed when this symbol is being picked, e.g the name of a function. - * Must be contained by the the `range`. - */ - SelectionRange Range `json:"selectionRange"` - - /*Children defined: - * Children of this symbol, e.g. properties of a class. - */ - Children []DocumentSymbol `json:"children,omitempty"` -} - -/*CodeActionContext defined: - * Contains additional diagnostic information about the context in which - * a [code action](#CodeActionProvider.provideCodeActions) is run. - */ -type CodeActionContext struct { - - /*Diagnostics defined: - * An array of diagnostics known on the client side overlapping the range provided to the - * `textDocument/codeAction` request. They are provied so that the server knows which - * errors are currently presented to the user for the given range. There is no guarantee - * that these accurately reflect the error state of the resource. The primary parameter - * to compute code actions is the provided range. - */ - Diagnostics []Diagnostic `json:"diagnostics"` - - /*Only defined: - * Requested kind of actions to return. - * - * Actions not of this kind are filtered out by the client before being shown. So servers - * can omit computing them. - */ - Only []CodeActionKind `json:"only,omitempty"` -} - -/*CodeAction defined: - * A code action represents a change that can be performed in code, e.g. to fix a problem or - * to refactor code. - * - * A CodeAction must set either `edit` and/or a `command`. If both are supplied, the `edit` is applied first, then the `command` is executed. - */ -type CodeAction struct { - - /*Title defined: - * A short, human-readable, title for this code action. - */ - Title string `json:"title"` - - /*Kind defined: - * The kind of the code action. - * - * Used to filter code actions. - */ - Kind CodeActionKind `json:"kind,omitempty"` - - /*Diagnostics defined: - * The diagnostics that this code action resolves. - */ - Diagnostics []Diagnostic `json:"diagnostics,omitempty"` - - /*IsPreferred defined: - * Marks this as a preferred action. Preferred actions are used by the `auto fix` command and can be targeted - * by keybindings. - * - * A quick fix should be marked preferred if it properly addresses the underlying error. - * A refactoring should be marked preferred if it is the most reasonable choice of actions to take. - * - * @since 3.15.0 - */ - IsPreferred bool `json:"isPreferred,omitempty"` - - /*Edit defined: - * The workspace edit this code action performs. - */ - Edit *WorkspaceEdit `json:"edit,omitempty"` - - /*Command defined: - * A command this code action executes. If a code action - * provides a edit and a command, first the edit is - * executed and then the command. - */ - Command *Command `json:"command,omitempty"` -} - -/*CodeLens defined: - * A code lens represents a [command](#Command) that should be shown along with - * source text, like the number of references, a way to run tests, etc. - * - * A code lens is _unresolved_ when no command is associated to it. For performance - * reasons the creation of a code lens and resolving should be done to two stages. - */ -type CodeLens struct { - - /*Range defined: - * The range in which this code lens is valid. Should only span a single line. - */ - Range Range `json:"range"` - - /*Command defined: - * The command this code lens represents. - */ - Command *Command `json:"command,omitempty"` - - /*Data defined: - * An data entry field that is preserved on a code lens item between - * a [CodeLensRequest](#CodeLensRequest) and a [CodeLensResolveRequest] - * (#CodeLensResolveRequest) - */ - Data interface{} `json:"data,omitempty"` -} - -/*FormattingOptions defined: - * Value-object describing what options formatting should use. - */ -type FormattingOptions struct { - - /*TabSize defined: - * Size of a tab in spaces. - */ - TabSize float64 `json:"tabSize"` - - /*InsertSpaces defined: - * Prefer spaces over tabs. - */ - InsertSpaces bool `json:"insertSpaces"` - - /*TrimTrailingWhitespace defined: - * Trim trailing whitespaces on a line. - * - * @since 3.15.0 - */ - TrimTrailingWhitespace bool `json:"trimTrailingWhitespace,omitempty"` - - /*InsertFinalNewline defined: - * Insert a newline character at the end of the file if one does not exist. - * - * @since 3.15.0 - */ - InsertFinalNewline bool `json:"insertFinalNewline,omitempty"` - - /*TrimFinalNewlines defined: - * Trim all newlines after the final newline at the end of the file. - * - * @since 3.15.0 - */ - TrimFinalNewlines bool `json:"trimFinalNewlines,omitempty"` - - /*Key defined: - * Signature for further properties. - */ - Key map[string]bool `json:"key"` // [key: string]: boolean | number | string | undefined; -} - -/*DocumentLink defined: - * A document link is a range in a text document that links to an internal or external resource, like another - * text document or a web site. - */ -type DocumentLink struct { - - /*Range defined: - * The range this link applies to. - */ - Range Range `json:"range"` - - /*Target defined: - * The uri this link points to. - */ - Target string `json:"target,omitempty"` - - /*Tooltip defined: - * The tooltip text when you hover over this link. - * - * If a tooltip is provided, is will be displayed in a string that includes instructions on how to - * trigger the link, such as `{0} (ctrl + click)`. The specific instructions vary depending on OS, - * user settings, and localization. - * - * @since 3.15.0 - */ - Tooltip string `json:"tooltip,omitempty"` - - /*Data defined: - * A data entry field that is preserved on a document link between a - * DocumentLinkRequest and a DocumentLinkResolveRequest. - */ - Data interface{} `json:"data,omitempty"` -} - -/*SelectionRange defined: - * A selection range represents a part of a selection hierarchy. A selection range - * may have a parent selection range that contains it. - */ -type SelectionRange struct { - - /*Range defined: - * The [range](#Range) of this selection range. - */ - Range Range `json:"range"` - - /*Parent defined: - * The parent selection range containing this range. Therefore `parent.range` must contain `this.range`. - */ - Parent *SelectionRange `json:"parent,omitempty"` -} - -/*TextDocument defined: - * A simple text document. Not to be implemented. - */ -type TextDocument struct { - - /*URI defined: - * The associated URI for this document. Most documents have the __file__-scheme, indicating that they - * represent files on disk. However, some documents may have other schemes indicating that they are not - * available on disk. - * - * @readonly - */ - URI DocumentURI `json:"uri"` - - /*LanguageID defined: - * The identifier of the language associated with this document. - * - * @readonly - */ - LanguageID string `json:"languageId"` - - /*Version defined: - * The version number of this document (it will increase after each - * change, including undo/redo). - * - * @readonly - */ - Version float64 `json:"version"` - - /*LineCount defined: - * The number of lines in this document. - * - * @readonly - */ - LineCount float64 `json:"lineCount"` -} - -/*TextDocumentChangeEvent defined: - * Event to signal changes to a simple text document. - */ -type TextDocumentChangeEvent struct { - - /*Document defined: - * The document that has changed. - */ - Document TextDocument `json:"document"` -} - -// TextDocumentWillSaveEvent is -type TextDocumentWillSaveEvent struct { - - /*Document defined: - * The document that will be saved - */ - Document TextDocument `json:"document"` - - /*Reason defined: - * The reason why save was triggered. - */ - Reason TextDocumentSaveReason `json:"reason"` -} - -/*TextDocumentContentChangeEvent defined: - * An event describing a change to a text document. If range and rangeLength are omitted - * the new text is considered to be the full content of the document. - */ -type TextDocumentContentChangeEvent struct { - - /*Range defined: - * The range of the document that changed. - */ - Range *Range `json:"range,omitempty"` - - /*RangeLength defined: - * The length of the range that got replaced. - */ - RangeLength float64 `json:"rangeLength,omitempty"` - - /*Text defined: - * The new text of the document. - */ - Text string `json:"text"` -} - -// ProgressParams is -type ProgressParams struct { - - /*Token defined: - * The progress token provided by the client or server. - */ - Token ProgressToken `json:"token"` - - /*Value defined: - * The progress data. - */ - Value interface{} `json:"value"` -} - -// SetTraceParams is -type SetTraceParams struct { - - // Value is - Value TraceValues `json:"value"` -} - -// LogTraceParams is -type LogTraceParams struct { - - // Message is - Message string `json:"message"` - - // Verbose is - Verbose string `json:"verbose,omitempty"` -} - -// Tracer is -type Tracer struct { -} - -// FoldingRangeKind defines constants -type FoldingRangeKind string - -// ResourceOperationKind defines constants -type ResourceOperationKind string - -// FailureHandlingKind defines constants -type FailureHandlingKind string - -// InitializeError defines constants -type InitializeError float64 - -// MessageType defines constants -type MessageType float64 - -// TextDocumentSyncKind defines constants -type TextDocumentSyncKind float64 - -// FileChangeType defines constants -type FileChangeType float64 - -// WatchKind defines constants -type WatchKind float64 - -// CompletionTriggerKind defines constants -type CompletionTriggerKind float64 - -// SignatureHelpTriggerKind defines constants -type SignatureHelpTriggerKind float64 - -// DiagnosticSeverity defines constants -type DiagnosticSeverity float64 - -// DiagnosticTag defines constants -type DiagnosticTag float64 - -// MarkupKind defines constants -type MarkupKind string - -// CompletionItemKind defines constants -type CompletionItemKind float64 - -// InsertTextFormat defines constants -type InsertTextFormat float64 - -// CompletionItemTag defines constants -type CompletionItemTag float64 - -// DocumentHighlightKind defines constants -type DocumentHighlightKind float64 - -// SymbolKind defines constants -type SymbolKind float64 - -// CodeActionKind defines constants -type CodeActionKind string - -// TextDocumentSaveReason defines constants -type TextDocumentSaveReason float64 - -// ErrorCodes defines constants -type ErrorCodes float64 - -// Touch defines constants -type Touch float64 - -// Trace defines constants -type Trace string - -// TraceFormat defines constants -type TraceFormat string - -// ConnectionErrors defines constants -type ConnectionErrors float64 - -// ConnectionState defines constants -type ConnectionState float64 - -const ( - - /*Comment defined: - * Folding range for a comment - */ - Comment FoldingRangeKind = "comment" - - /*Imports defined: - * Folding range for a imports or includes - */ - Imports FoldingRangeKind = "imports" - - /*Region defined: - * Folding range for a region (e.g. `#region`) - */ - Region FoldingRangeKind = "region" - - /*Create defined: - * Supports creating new files and folders. - */ - Create ResourceOperationKind = "create" - - /*Rename defined: - * Supports renaming existing files and folders. - */ - Rename ResourceOperationKind = "rename" - - /*Delete defined: - * Supports deleting existing files and folders. - */ - Delete ResourceOperationKind = "delete" - - /*Abort defined: - * Applying the workspace change is simply aborted if one of the changes provided - * fails. All operations executed before the failing operation stay executed. - */ - Abort FailureHandlingKind = "abort" - - /*Transactional defined: - * All operations are executed transactional. That means they either all - * succeed or no changes at all are applied to the workspace. - */ - Transactional FailureHandlingKind = "transactional" - - /*TextOnlyTransactional defined: - * If the workspace edit contains only textual file changes they are executed transactional. - * If resource changes (create, rename or delete file) are part of the change the failure - * handling startegy is abort. - */ - TextOnlyTransactional FailureHandlingKind = "textOnlyTransactional" - - /*Undo defined: - * The client tries to undo the operations already executed. But there is no - * guaruntee that this is succeeding. - */ - Undo FailureHandlingKind = "undo" - - /*UnknownProtocolVersion defined: - * If the protocol version provided by the client can't be handled by the server. - * @deprecated This initialize error got replaced by client capabilities. There is - * no version handshake in version 3.0x - */ - UnknownProtocolVersion InitializeError = 1 - - /*Error defined: - * An error message. - */ - Error MessageType = 1 - - /*Warning defined: - * A warning message. - */ - Warning MessageType = 2 - - /*Info defined: - * An information message. - */ - Info MessageType = 3 - - /*Log defined: - * A log message. - */ - Log MessageType = 4 - - /*None defined: - * Documents should not be synced at all. - */ - None TextDocumentSyncKind = 0 - - /*Full defined: - * Documents are synced by always sending the full content - * of the document. - */ - Full TextDocumentSyncKind = 1 - - /*Incremental defined: - * Documents are synced by sending the full content on open. - * After that only incremental updates to the document are - * send. - */ - Incremental TextDocumentSyncKind = 2 - - /*Created defined: - * The file got created. - */ - Created FileChangeType = 1 - - /*Changed defined: - * The file got changed. - */ - Changed FileChangeType = 2 - - /*Deleted defined: - * The file got deleted. - */ - Deleted FileChangeType = 3 - - /*WatchCreate defined: - * Interested in create events. - */ - WatchCreate WatchKind = 1 - - /*WatchChange defined: - * Interested in change events - */ - WatchChange WatchKind = 2 - - /*WatchDelete defined: - * Interested in delete events - */ - WatchDelete WatchKind = 4 - - /*Invoked defined: - * Completion was triggered by typing an identifier (24x7 code - * complete), manual invocation (e.g Ctrl+Space) or via API. - */ - Invoked CompletionTriggerKind = 1 - - /*TriggerCharacter defined: - * Completion was triggered by a trigger character specified by - * the `triggerCharacters` properties of the `CompletionRegistrationOptions`. - */ - TriggerCharacter CompletionTriggerKind = 2 - - /*TriggerForIncompleteCompletions defined: - * Completion was re-triggered as current completion list is incomplete - */ - TriggerForIncompleteCompletions CompletionTriggerKind = 3 - - /*ContentChange defined: - * Signature help was triggered by the cursor moving or by the document content changing. - */ - ContentChange SignatureHelpTriggerKind = 3 - - /*SeverityError defined: - * Reports an error. - */ - SeverityError DiagnosticSeverity = 1 - - /*SeverityWarning defined: - * Reports a warning. - */ - SeverityWarning DiagnosticSeverity = 2 - - /*SeverityInformation defined: - * Reports an information. - */ - SeverityInformation DiagnosticSeverity = 3 - - /*SeverityHint defined: - * Reports a hint. - */ - SeverityHint DiagnosticSeverity = 4 - - /*Unnecessary defined: - * Unused or unnecessary code. - * - * Clients are allowed to render diagnostics with this tag faded out instead of having - * an error squiggle. - */ - Unnecessary DiagnosticTag = 1 - - /*Deprecated defined: - * Deprecated or obsolete code. - * - * Clients are allowed to rendered diagnostics with this tag strike through. - */ - Deprecated DiagnosticTag = 2 - - /*PlainText defined: - * Plain text is supported as a content format - */ - PlainText MarkupKind = "plaintext" - - /*Markdown defined: - * Markdown is supported as a content format - */ - Markdown MarkupKind = "markdown" - - // TextCompletion is - TextCompletion CompletionItemKind = 1 - - // MethodCompletion is - MethodCompletion CompletionItemKind = 2 - - // FunctionCompletion is - FunctionCompletion CompletionItemKind = 3 - - // ConstructorCompletion is - ConstructorCompletion CompletionItemKind = 4 - - // FieldCompletion is - FieldCompletion CompletionItemKind = 5 - - // VariableCompletion is - VariableCompletion CompletionItemKind = 6 - - // ClassCompletion is - ClassCompletion CompletionItemKind = 7 - - // InterfaceCompletion is - InterfaceCompletion CompletionItemKind = 8 - - // ModuleCompletion is - ModuleCompletion CompletionItemKind = 9 - - // PropertyCompletion is - PropertyCompletion CompletionItemKind = 10 - - // UnitCompletion is - UnitCompletion CompletionItemKind = 11 - - // ValueCompletion is - ValueCompletion CompletionItemKind = 12 - - // EnumCompletion is - EnumCompletion CompletionItemKind = 13 - - // KeywordCompletion is - KeywordCompletion CompletionItemKind = 14 - - // SnippetCompletion is - SnippetCompletion CompletionItemKind = 15 - - // ColorCompletion is - ColorCompletion CompletionItemKind = 16 - - // FileCompletion is - FileCompletion CompletionItemKind = 17 - - // ReferenceCompletion is - ReferenceCompletion CompletionItemKind = 18 - - // FolderCompletion is - FolderCompletion CompletionItemKind = 19 - - // EnumMemberCompletion is - EnumMemberCompletion CompletionItemKind = 20 - - // ConstantCompletion is - ConstantCompletion CompletionItemKind = 21 - - // StructCompletion is - StructCompletion CompletionItemKind = 22 - - // EventCompletion is - EventCompletion CompletionItemKind = 23 - - // OperatorCompletion is - OperatorCompletion CompletionItemKind = 24 - - // TypeParameterCompletion is - TypeParameterCompletion CompletionItemKind = 25 - - /*PlainTextTextFormat defined: - * The primary text to be inserted is treated as a plain string. - */ - PlainTextTextFormat InsertTextFormat = 1 - - /*SnippetTextFormat defined: - * The primary text to be inserted is treated as a snippet. - * - * A snippet can define tab stops and placeholders with `$1`, `$2` - * and `${3:foo}`. `$0` defines the final tab stop, it defaults to - * the end of the snippet. Placeholders with equal identifiers are linked, - * that is typing in one will update others too. - * - * See also: https://github.com/Microsoft/vscode/blob/master/src/vs/editor/contrib/snippet/common/snippet.md - */ - SnippetTextFormat InsertTextFormat = 2 - - /*Text defined: - * A textual occurrence. - */ - Text DocumentHighlightKind = 1 - - /*Read defined: - * Read-access of a symbol, like reading a variable. - */ - Read DocumentHighlightKind = 2 - - /*Write defined: - * Write-access of a symbol, like writing to a variable. - */ - Write DocumentHighlightKind = 3 - - // File is - File SymbolKind = 1 - - // Module is - Module SymbolKind = 2 - - // Namespace is - Namespace SymbolKind = 3 - - // Package is - Package SymbolKind = 4 - - // Class is - Class SymbolKind = 5 - - // Method is - Method SymbolKind = 6 - - // Property is - Property SymbolKind = 7 - - // Field is - Field SymbolKind = 8 - - // Constructor is - Constructor SymbolKind = 9 - - // Enum is - Enum SymbolKind = 10 - - // Interface is - Interface SymbolKind = 11 - - // Function is - Function SymbolKind = 12 - - // Variable is - Variable SymbolKind = 13 - - // Constant is - Constant SymbolKind = 14 - - // String is - String SymbolKind = 15 - - // Number is - Number SymbolKind = 16 - - // Boolean is - Boolean SymbolKind = 17 - - // Array is - Array SymbolKind = 18 - - // Object is - Object SymbolKind = 19 - - // Key is - Key SymbolKind = 20 - - // Null is - Null SymbolKind = 21 - - // EnumMember is - EnumMember SymbolKind = 22 - - // Struct is - Struct SymbolKind = 23 - - // Event is - Event SymbolKind = 24 - - // Operator is - Operator SymbolKind = 25 - - // TypeParameter is - TypeParameter SymbolKind = 26 - - /*Empty defined: - * Empty kind. - */ - Empty CodeActionKind = "" - - /*QuickFix defined: - * Base kind for quickfix actions: 'quickfix' - */ - QuickFix CodeActionKind = "quickfix" - - /*Refactor defined: - * Base kind for refactoring actions: 'refactor' - */ - Refactor CodeActionKind = "refactor" - - /*RefactorExtract defined: - * Base kind for refactoring extraction actions: 'refactor.extract' - * - * Example extract actions: - * - * - Extract method - * - Extract function - * - Extract variable - * - Extract interface from class - * - ... - */ - RefactorExtract CodeActionKind = "refactor.extract" - - /*RefactorInline defined: - * Base kind for refactoring inline actions: 'refactor.inline' - * - * Example inline actions: - * - * - Inline function - * - Inline variable - * - Inline constant - * - ... - */ - RefactorInline CodeActionKind = "refactor.inline" - - /*RefactorRewrite defined: - * Base kind for refactoring rewrite actions: 'refactor.rewrite' - * - * Example rewrite actions: - * - * - Convert JavaScript function to class - * - Add or remove parameter - * - Encapsulate field - * - Make method static - * - Move method to base class - * - ... - */ - RefactorRewrite CodeActionKind = "refactor.rewrite" - - /*Source defined: - * Base kind for source actions: `source` - * - * Source code actions apply to the entire file. - */ - Source CodeActionKind = "source" - - /*SourceOrganizeImports defined: - * Base kind for an organize imports source action: `source.organizeImports` - */ - SourceOrganizeImports CodeActionKind = "source.organizeImports" - - /*Manual defined: - * Manually triggered, e.g. by the user pressing save, by starting debugging, - * or by an API call. - */ - Manual TextDocumentSaveReason = 1 - - /*AfterDelay defined: - * Automatic after a delay. - */ - AfterDelay TextDocumentSaveReason = 2 - - /*FocusOut defined: - * When the editor lost focus. - */ - FocusOut TextDocumentSaveReason = 3 - - // MessageWriteError is - MessageWriteError ErrorCodes = 1 - - // MessageReadError is - MessageReadError ErrorCodes = 2 - - // First is - First Touch = 1 - - // Last is - Last Touch = 2 - - // JSON is - JSON TraceFormat = "json" - - /*Closed defined: - * The connection is closed. - */ - Closed ConnectionErrors = 1 - - /*Disposed defined: - * The connection got disposed. - */ - Disposed ConnectionErrors = 2 - - /*AlreadyListening defined: - * The connection is already in listening mode. - */ - AlreadyListening ConnectionErrors = 3 - - // New is - New ConnectionState = 1 - - // Listening is - Listening ConnectionState = 2 -) - -// DocumentFilter is a type -/** - * A document filter denotes a document by different properties like - * the [language](#TextDocument.languageId), the [scheme](#Uri.scheme) of - * its resource, or a glob-pattern that is applied to the [path](#TextDocument.fileName). - * - * Glob patterns can have the following syntax: - * - `*` to match one or more characters in a path segment - * - `?` to match on one character in a path segment - * - `**` to match any number of path segments, including none - * - `{}` to group conditions (e.g. `**​/*.{ts,js}` matches all TypeScript and JavaScript files) - * - `[]` to declare a range of characters to match in a path segment (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …) - * - `[!...]` to negate a range of characters to match in a path segment (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but not `example.0`) - * - * @sample A language filter that applies to typescript files on disk: `{ language: 'typescript', scheme: 'file' }` - * @sample A language filter that applies to all package.json paths: `{ language: 'json', pattern: '**package.json' }` - */ -type DocumentFilter = struct { - - /*Language defined: A language id, like `typescript`. */ - Language string `json:"language,omitempty"` - - /*Scheme defined: A Uri [scheme](#Uri.scheme), like `file` or `untitled`. */ - Scheme string `json:"scheme,omitempty"` - - /*Pattern defined: A glob pattern, like `*.{ts,js}`. */ - Pattern string `json:"pattern,omitempty"` -} - -// DocumentSelector is a type -/** - * A document selector is the combination of one or many document filters. - * - * @sample `let sel:DocumentSelector = [{ language: 'typescript' }, { language: 'json', pattern: '**∕tsconfig.json' }]`; - */ -type DocumentSelector = []DocumentFilter - -// DocumentURI is a type -/** - * A tagging type for string properties that are actually URIs. - */ -type DocumentURI = string - -// MarkedString is a type -/** - * MarkedString can be used to render human readable text. It is either a markdown string - * or a code-block that provides a language and a code snippet. The language identifier - * is semantically equal to the optional language identifier in fenced code blocks in GitHub - * issues. See https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting - * - * The pair of a language and a value is an equivalent to markdown: - * ```${language} - * ${value} - * ``` - * - * Note that markdown strings will be sanitized - that means html will be escaped. - * @deprecated use MarkupContent instead. - */ -type MarkedString = string - -// DefinitionLink is a type -/** - * Information about where a symbol is defined. - * - * Provides additional metadata over normal [location](#Location) definitions, including the range of - * the defining symbol - */ -type DefinitionLink = LocationLink - -// DeclarationLink is a type -/** - * Information about where a symbol is declared. - * - * Provides additional metadata over normal [location](#Location) declarations, including the range of - * the declaring symbol. - * - * Servers should prefer returning `DeclarationLink` over `Declaration` if supported - * by the client. - */ -type DeclarationLink = LocationLink - -// LSPMessageType is a type -/** - * A LSP Log Entry. - */ -type LSPMessageType = string - -// ProgressToken is a type -type ProgressToken = interface{} // number | string -// TraceValues is a type -type TraceValues = string diff --git a/vendor/golang.org/x/tools/internal/lsp/protocol/tsserver.go b/vendor/golang.org/x/tools/internal/lsp/protocol/tsserver.go deleted file mode 100644 index 9ee423b5c..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/protocol/tsserver.go +++ /dev/null @@ -1,832 +0,0 @@ -package protocol - -// Code generated (see typescript/README.md) DO NOT EDIT. - -import ( - "context" - "encoding/json" - - "golang.org/x/tools/internal/jsonrpc2" - "golang.org/x/tools/internal/telemetry/log" - "golang.org/x/tools/internal/xcontext" -) - -type Server interface { - DidChangeWorkspaceFolders(context.Context, *DidChangeWorkspaceFoldersParams) error - Initialized(context.Context, *InitializedParams) error - Exit(context.Context) error - DidChangeConfiguration(context.Context, *DidChangeConfigurationParams) error - DidOpen(context.Context, *DidOpenTextDocumentParams) error - DidChange(context.Context, *DidChangeTextDocumentParams) error - DidClose(context.Context, *DidCloseTextDocumentParams) error - DidSave(context.Context, *DidSaveTextDocumentParams) error - WillSave(context.Context, *WillSaveTextDocumentParams) error - DidChangeWatchedFiles(context.Context, *DidChangeWatchedFilesParams) error - Progress(context.Context, *ProgressParams) error - SetTraceNotification(context.Context, *SetTraceParams) error - LogTraceNotification(context.Context, *LogTraceParams) error - Implementation(context.Context, *ImplementationParams) ([]Location, error) - TypeDefinition(context.Context, *TypeDefinitionParams) ([]Location, error) - DocumentColor(context.Context, *DocumentColorParams) ([]ColorInformation, error) - ColorPresentation(context.Context, *ColorPresentationParams) ([]ColorPresentation, error) - FoldingRange(context.Context, *FoldingRangeParams) ([]FoldingRange, error) - Declaration(context.Context, *DeclarationParams) ([]DeclarationLink, error) - SelectionRange(context.Context, *SelectionRangeParams) ([]SelectionRange, error) - Initialize(context.Context, *ParamInitia) (*InitializeResult, error) - Shutdown(context.Context) error - WillSaveWaitUntil(context.Context, *WillSaveTextDocumentParams) ([]TextEdit, error) - Completion(context.Context, *CompletionParams) (*CompletionList, error) - Resolve(context.Context, *CompletionItem) (*CompletionItem, error) - Hover(context.Context, *HoverParams) (*Hover, error) - SignatureHelp(context.Context, *SignatureHelpParams) (*SignatureHelp, error) - Definition(context.Context, *DefinitionParams) ([]Location, error) - References(context.Context, *ReferenceParams) ([]Location, error) - DocumentHighlight(context.Context, *DocumentHighlightParams) ([]DocumentHighlight, error) - DocumentSymbol(context.Context, *DocumentSymbolParams) ([]DocumentSymbol, error) - CodeAction(context.Context, *CodeActionParams) ([]CodeAction, error) - Symbol(context.Context, *WorkspaceSymbolParams) ([]SymbolInformation, error) - CodeLens(context.Context, *CodeLensParams) ([]CodeLens, error) - ResolveCodeLens(context.Context, *CodeLens) (*CodeLens, error) - DocumentLink(context.Context, *DocumentLinkParams) ([]DocumentLink, error) - ResolveDocumentLink(context.Context, *DocumentLink) (*DocumentLink, error) - Formatting(context.Context, *DocumentFormattingParams) ([]TextEdit, error) - RangeFormatting(context.Context, *DocumentRangeFormattingParams) ([]TextEdit, error) - OnTypeFormatting(context.Context, *DocumentOnTypeFormattingParams) ([]TextEdit, error) - Rename(context.Context, *RenameParams) (*WorkspaceEdit, error) - PrepareRename(context.Context, *PrepareRenameParams) (*Range, error) - ExecuteCommand(context.Context, *ExecuteCommandParams) (interface{}, error) -} - -func (h serverHandler) Deliver(ctx context.Context, r *jsonrpc2.Request, delivered bool) bool { - if delivered { - return false - } - if ctx.Err() != nil { - ctx := xcontext.Detach(ctx) - r.Reply(ctx, nil, jsonrpc2.NewErrorf(RequestCancelledError, "")) - return true - } - switch r.Method { - case "workspace/didChangeWorkspaceFolders": // notif - var params DidChangeWorkspaceFoldersParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - if err := h.server.DidChangeWorkspaceFolders(ctx, ¶ms); err != nil { - log.Error(ctx, "", err) - } - return true - case "initialized": // notif - var params InitializedParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - if err := h.server.Initialized(ctx, ¶ms); err != nil { - log.Error(ctx, "", err) - } - return true - case "exit": // notif - if err := h.server.Exit(ctx); err != nil { - log.Error(ctx, "", err) - } - return true - case "workspace/didChangeConfiguration": // notif - var params DidChangeConfigurationParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - if err := h.server.DidChangeConfiguration(ctx, ¶ms); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/didOpen": // notif - var params DidOpenTextDocumentParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - if err := h.server.DidOpen(ctx, ¶ms); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/didChange": // notif - var params DidChangeTextDocumentParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - if err := h.server.DidChange(ctx, ¶ms); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/didClose": // notif - var params DidCloseTextDocumentParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - if err := h.server.DidClose(ctx, ¶ms); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/didSave": // notif - var params DidSaveTextDocumentParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - if err := h.server.DidSave(ctx, ¶ms); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/willSave": // notif - var params WillSaveTextDocumentParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - if err := h.server.WillSave(ctx, ¶ms); err != nil { - log.Error(ctx, "", err) - } - return true - case "workspace/didChangeWatchedFiles": // notif - var params DidChangeWatchedFilesParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - if err := h.server.DidChangeWatchedFiles(ctx, ¶ms); err != nil { - log.Error(ctx, "", err) - } - return true - case "$/progress": // notif - var params ProgressParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - if err := h.server.Progress(ctx, ¶ms); err != nil { - log.Error(ctx, "", err) - } - return true - case "$/setTraceNotification": // notif - var params SetTraceParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - if err := h.server.SetTraceNotification(ctx, ¶ms); err != nil { - log.Error(ctx, "", err) - } - return true - case "$/logTraceNotification": // notif - var params LogTraceParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - if err := h.server.LogTraceNotification(ctx, ¶ms); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/implementation": // req - var params ImplementationParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.Implementation(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/typeDefinition": // req - var params TypeDefinitionParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.TypeDefinition(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/documentColor": // req - var params DocumentColorParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.DocumentColor(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/colorPresentation": // req - var params ColorPresentationParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.ColorPresentation(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/foldingRange": // req - var params FoldingRangeParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.FoldingRange(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/declaration": // req - var params DeclarationParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.Declaration(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/selectionRange": // req - var params SelectionRangeParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.SelectionRange(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "initialize": // req - var params ParamInitia - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.Initialize(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "shutdown": // req - if r.Params != nil { - r.Reply(ctx, nil, jsonrpc2.NewErrorf(jsonrpc2.CodeInvalidParams, "Expected no params")) - return true - } - err := h.server.Shutdown(ctx) - if err := r.Reply(ctx, nil, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/willSaveWaitUntil": // req - var params WillSaveTextDocumentParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.WillSaveWaitUntil(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/completion": // req - var params CompletionParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.Completion(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "completionItem/resolve": // req - var params CompletionItem - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.Resolve(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/hover": // req - var params HoverParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.Hover(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/signatureHelp": // req - var params SignatureHelpParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.SignatureHelp(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/definition": // req - var params DefinitionParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.Definition(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/references": // req - var params ReferenceParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.References(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/documentHighlight": // req - var params DocumentHighlightParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.DocumentHighlight(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/documentSymbol": // req - var params DocumentSymbolParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.DocumentSymbol(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/codeAction": // req - var params CodeActionParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.CodeAction(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "workspace/symbol": // req - var params WorkspaceSymbolParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.Symbol(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/codeLens": // req - var params CodeLensParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.CodeLens(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "codeLens/resolve": // req - var params CodeLens - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.ResolveCodeLens(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/documentLink": // req - var params DocumentLinkParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.DocumentLink(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "documentLink/resolve": // req - var params DocumentLink - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.ResolveDocumentLink(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/formatting": // req - var params DocumentFormattingParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.Formatting(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/rangeFormatting": // req - var params DocumentRangeFormattingParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.RangeFormatting(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/onTypeFormatting": // req - var params DocumentOnTypeFormattingParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.OnTypeFormatting(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/rename": // req - var params RenameParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.Rename(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "textDocument/prepareRename": // req - var params PrepareRenameParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.PrepareRename(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - case "workspace/executeCommand": // req - var params ExecuteCommandParams - if err := json.Unmarshal(*r.Params, ¶ms); err != nil { - sendParseError(ctx, r, err) - return true - } - resp, err := h.server.ExecuteCommand(ctx, ¶ms) - if err := r.Reply(ctx, resp, err); err != nil { - log.Error(ctx, "", err) - } - return true - - default: - return false - } -} - -type serverDispatcher struct { - *jsonrpc2.Conn -} - -func (s *serverDispatcher) DidChangeWorkspaceFolders(ctx context.Context, params *DidChangeWorkspaceFoldersParams) error { - return s.Conn.Notify(ctx, "workspace/didChangeWorkspaceFolders", params) -} - -func (s *serverDispatcher) Initialized(ctx context.Context, params *InitializedParams) error { - return s.Conn.Notify(ctx, "initialized", params) -} - -func (s *serverDispatcher) Exit(ctx context.Context) error { - return s.Conn.Notify(ctx, "exit", nil) -} - -func (s *serverDispatcher) DidChangeConfiguration(ctx context.Context, params *DidChangeConfigurationParams) error { - return s.Conn.Notify(ctx, "workspace/didChangeConfiguration", params) -} - -func (s *serverDispatcher) DidOpen(ctx context.Context, params *DidOpenTextDocumentParams) error { - return s.Conn.Notify(ctx, "textDocument/didOpen", params) -} - -func (s *serverDispatcher) DidChange(ctx context.Context, params *DidChangeTextDocumentParams) error { - return s.Conn.Notify(ctx, "textDocument/didChange", params) -} - -func (s *serverDispatcher) DidClose(ctx context.Context, params *DidCloseTextDocumentParams) error { - return s.Conn.Notify(ctx, "textDocument/didClose", params) -} - -func (s *serverDispatcher) DidSave(ctx context.Context, params *DidSaveTextDocumentParams) error { - return s.Conn.Notify(ctx, "textDocument/didSave", params) -} - -func (s *serverDispatcher) WillSave(ctx context.Context, params *WillSaveTextDocumentParams) error { - return s.Conn.Notify(ctx, "textDocument/willSave", params) -} - -func (s *serverDispatcher) DidChangeWatchedFiles(ctx context.Context, params *DidChangeWatchedFilesParams) error { - return s.Conn.Notify(ctx, "workspace/didChangeWatchedFiles", params) -} - -func (s *serverDispatcher) Progress(ctx context.Context, params *ProgressParams) error { - return s.Conn.Notify(ctx, "$/progress", params) -} - -func (s *serverDispatcher) SetTraceNotification(ctx context.Context, params *SetTraceParams) error { - return s.Conn.Notify(ctx, "$/setTraceNotification", params) -} - -func (s *serverDispatcher) LogTraceNotification(ctx context.Context, params *LogTraceParams) error { - return s.Conn.Notify(ctx, "$/logTraceNotification", params) -} -func (s *serverDispatcher) Implementation(ctx context.Context, params *ImplementationParams) ([]Location, error) { - var result []Location - if err := s.Conn.Call(ctx, "textDocument/implementation", params, &result); err != nil { - return nil, err - } - return result, nil -} - -func (s *serverDispatcher) TypeDefinition(ctx context.Context, params *TypeDefinitionParams) ([]Location, error) { - var result []Location - if err := s.Conn.Call(ctx, "textDocument/typeDefinition", params, &result); err != nil { - return nil, err - } - return result, nil -} - -func (s *serverDispatcher) DocumentColor(ctx context.Context, params *DocumentColorParams) ([]ColorInformation, error) { - var result []ColorInformation - if err := s.Conn.Call(ctx, "textDocument/documentColor", params, &result); err != nil { - return nil, err - } - return result, nil -} - -func (s *serverDispatcher) ColorPresentation(ctx context.Context, params *ColorPresentationParams) ([]ColorPresentation, error) { - var result []ColorPresentation - if err := s.Conn.Call(ctx, "textDocument/colorPresentation", params, &result); err != nil { - return nil, err - } - return result, nil -} - -func (s *serverDispatcher) FoldingRange(ctx context.Context, params *FoldingRangeParams) ([]FoldingRange, error) { - var result []FoldingRange - if err := s.Conn.Call(ctx, "textDocument/foldingRange", params, &result); err != nil { - return nil, err - } - return result, nil -} - -func (s *serverDispatcher) Declaration(ctx context.Context, params *DeclarationParams) ([]DeclarationLink, error) { - var result []DeclarationLink - if err := s.Conn.Call(ctx, "textDocument/declaration", params, &result); err != nil { - return nil, err - } - return result, nil -} - -func (s *serverDispatcher) SelectionRange(ctx context.Context, params *SelectionRangeParams) ([]SelectionRange, error) { - var result []SelectionRange - if err := s.Conn.Call(ctx, "textDocument/selectionRange", params, &result); err != nil { - return nil, err - } - return result, nil -} - -func (s *serverDispatcher) Initialize(ctx context.Context, params *ParamInitia) (*InitializeResult, error) { - var result InitializeResult - if err := s.Conn.Call(ctx, "initialize", params, &result); err != nil { - return nil, err - } - return &result, nil -} - -func (s *serverDispatcher) Shutdown(ctx context.Context) error { - return s.Conn.Call(ctx, "shutdown", nil, nil) -} - -func (s *serverDispatcher) WillSaveWaitUntil(ctx context.Context, params *WillSaveTextDocumentParams) ([]TextEdit, error) { - var result []TextEdit - if err := s.Conn.Call(ctx, "textDocument/willSaveWaitUntil", params, &result); err != nil { - return nil, err - } - return result, nil -} - -func (s *serverDispatcher) Completion(ctx context.Context, params *CompletionParams) (*CompletionList, error) { - var result CompletionList - if err := s.Conn.Call(ctx, "textDocument/completion", params, &result); err != nil { - return nil, err - } - return &result, nil -} - -func (s *serverDispatcher) Resolve(ctx context.Context, params *CompletionItem) (*CompletionItem, error) { - var result CompletionItem - if err := s.Conn.Call(ctx, "completionItem/resolve", params, &result); err != nil { - return nil, err - } - return &result, nil -} - -func (s *serverDispatcher) Hover(ctx context.Context, params *HoverParams) (*Hover, error) { - var result Hover - if err := s.Conn.Call(ctx, "textDocument/hover", params, &result); err != nil { - return nil, err - } - return &result, nil -} - -func (s *serverDispatcher) SignatureHelp(ctx context.Context, params *SignatureHelpParams) (*SignatureHelp, error) { - var result SignatureHelp - if err := s.Conn.Call(ctx, "textDocument/signatureHelp", params, &result); err != nil { - return nil, err - } - return &result, nil -} - -func (s *serverDispatcher) Definition(ctx context.Context, params *DefinitionParams) ([]Location, error) { - var result []Location - if err := s.Conn.Call(ctx, "textDocument/definition", params, &result); err != nil { - return nil, err - } - return result, nil -} - -func (s *serverDispatcher) References(ctx context.Context, params *ReferenceParams) ([]Location, error) { - var result []Location - if err := s.Conn.Call(ctx, "textDocument/references", params, &result); err != nil { - return nil, err - } - return result, nil -} - -func (s *serverDispatcher) DocumentHighlight(ctx context.Context, params *DocumentHighlightParams) ([]DocumentHighlight, error) { - var result []DocumentHighlight - if err := s.Conn.Call(ctx, "textDocument/documentHighlight", params, &result); err != nil { - return nil, err - } - return result, nil -} - -func (s *serverDispatcher) DocumentSymbol(ctx context.Context, params *DocumentSymbolParams) ([]DocumentSymbol, error) { - var result []DocumentSymbol - if err := s.Conn.Call(ctx, "textDocument/documentSymbol", params, &result); err != nil { - return nil, err - } - return result, nil -} - -func (s *serverDispatcher) CodeAction(ctx context.Context, params *CodeActionParams) ([]CodeAction, error) { - var result []CodeAction - if err := s.Conn.Call(ctx, "textDocument/codeAction", params, &result); err != nil { - return nil, err - } - return result, nil -} - -func (s *serverDispatcher) Symbol(ctx context.Context, params *WorkspaceSymbolParams) ([]SymbolInformation, error) { - var result []SymbolInformation - if err := s.Conn.Call(ctx, "workspace/symbol", params, &result); err != nil { - return nil, err - } - return result, nil -} - -func (s *serverDispatcher) CodeLens(ctx context.Context, params *CodeLensParams) ([]CodeLens, error) { - var result []CodeLens - if err := s.Conn.Call(ctx, "textDocument/codeLens", params, &result); err != nil { - return nil, err - } - return result, nil -} - -func (s *serverDispatcher) ResolveCodeLens(ctx context.Context, params *CodeLens) (*CodeLens, error) { - var result CodeLens - if err := s.Conn.Call(ctx, "codeLens/resolve", params, &result); err != nil { - return nil, err - } - return &result, nil -} - -func (s *serverDispatcher) DocumentLink(ctx context.Context, params *DocumentLinkParams) ([]DocumentLink, error) { - var result []DocumentLink - if err := s.Conn.Call(ctx, "textDocument/documentLink", params, &result); err != nil { - return nil, err - } - return result, nil -} - -func (s *serverDispatcher) ResolveDocumentLink(ctx context.Context, params *DocumentLink) (*DocumentLink, error) { - var result DocumentLink - if err := s.Conn.Call(ctx, "documentLink/resolve", params, &result); err != nil { - return nil, err - } - return &result, nil -} - -func (s *serverDispatcher) Formatting(ctx context.Context, params *DocumentFormattingParams) ([]TextEdit, error) { - var result []TextEdit - if err := s.Conn.Call(ctx, "textDocument/formatting", params, &result); err != nil { - return nil, err - } - return result, nil -} - -func (s *serverDispatcher) RangeFormatting(ctx context.Context, params *DocumentRangeFormattingParams) ([]TextEdit, error) { - var result []TextEdit - if err := s.Conn.Call(ctx, "textDocument/rangeFormatting", params, &result); err != nil { - return nil, err - } - return result, nil -} - -func (s *serverDispatcher) OnTypeFormatting(ctx context.Context, params *DocumentOnTypeFormattingParams) ([]TextEdit, error) { - var result []TextEdit - if err := s.Conn.Call(ctx, "textDocument/onTypeFormatting", params, &result); err != nil { - return nil, err - } - return result, nil -} - -func (s *serverDispatcher) Rename(ctx context.Context, params *RenameParams) (*WorkspaceEdit, error) { - var result WorkspaceEdit - if err := s.Conn.Call(ctx, "textDocument/rename", params, &result); err != nil { - return nil, err - } - return &result, nil -} - -func (s *serverDispatcher) PrepareRename(ctx context.Context, params *PrepareRenameParams) (*Range, error) { - var result Range - if err := s.Conn.Call(ctx, "textDocument/prepareRename", params, &result); err != nil { - return nil, err - } - return &result, nil -} - -func (s *serverDispatcher) ExecuteCommand(ctx context.Context, params *ExecuteCommandParams) (interface{}, error) { - var result interface{} - if err := s.Conn.Call(ctx, "workspace/executeCommand", params, &result); err != nil { - return nil, err - } - return result, nil -} - -type CancelParams struct { - /** - * The request id to cancel. - */ - ID jsonrpc2.ID `json:"id"` -} - -// Types constructed to avoid structs as formal argument types -type ParamInitia struct { - InitializeParams - WorkDoneProgressParams -} diff --git a/vendor/golang.org/x/tools/internal/lsp/references.go b/vendor/golang.org/x/tools/internal/lsp/references.go deleted file mode 100644 index 6930a6c17..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/references.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package lsp - -import ( - "context" - - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/telemetry/log" - "golang.org/x/tools/internal/telemetry/tag" -) - -func (s *Server) references(ctx context.Context, params *protocol.ReferenceParams) ([]protocol.Location, error) { - uri := span.NewURI(params.TextDocument.URI) - view := s.session.ViewOf(uri) - f, err := view.GetFile(ctx, uri) - if err != nil { - return nil, err - } - // Find all references to the identifier at the position. - ident, err := source.Identifier(ctx, view, f, params.Position) - if err != nil { - return nil, err - } - references, err := ident.References(ctx) - if err != nil { - log.Error(ctx, "no references", err, tag.Of("Identifier", ident.Name)) - } - - // Get the location of each reference to return as the result. - locations := make([]protocol.Location, 0, len(references)) - seen := make(map[span.Span]bool) - for _, ref := range references { - refSpan, err := ref.Span() - if err != nil { - return nil, err - } - if seen[refSpan] { - continue // already added this location - } - seen[refSpan] = true - refRange, err := ref.Range() - if err != nil { - return nil, err - } - locations = append(locations, protocol.Location{ - URI: protocol.NewURI(ref.URI()), - Range: refRange, - }) - } - // The declaration of this identifier may not be in the - // scope that we search for references, so make sure - // it is added to the beginning of the list if IncludeDeclaration - // was specified. - if params.Context.IncludeDeclaration { - decSpan, err := ident.Declaration.Span() - if err != nil { - return nil, err - } - if !seen[decSpan] { - rng, err := ident.Declaration.Range() - if err != nil { - return nil, err - } - locations = append([]protocol.Location{ - { - URI: protocol.NewURI(ident.Declaration.URI()), - Range: rng, - }, - }, locations...) - } - } - return locations, nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/rename.go b/vendor/golang.org/x/tools/internal/lsp/rename.go deleted file mode 100644 index 9ce36729a..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/rename.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package lsp - -import ( - "context" - - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" -) - -func (s *Server) rename(ctx context.Context, params *protocol.RenameParams) (*protocol.WorkspaceEdit, error) { - uri := span.NewURI(params.TextDocument.URI) - view := s.session.ViewOf(uri) - f, err := view.GetFile(ctx, uri) - if err != nil { - return nil, err - } - ident, err := source.Identifier(ctx, view, f, params.Position) - if err != nil { - return nil, err - } - edits, err := ident.Rename(ctx, view, params.NewName) - if err != nil { - return nil, err - } - changes := make(map[string][]protocol.TextEdit) - for uri, e := range edits { - changes[protocol.NewURI(uri)] = e - } - - return &protocol.WorkspaceEdit{Changes: &changes}, nil -} - -func (s *Server) prepareRename(ctx context.Context, params *protocol.PrepareRenameParams) (*protocol.Range, error) { - uri := span.NewURI(params.TextDocument.URI) - view := s.session.ViewOf(uri) - f, err := view.GetFile(ctx, uri) - if err != nil { - return nil, err - } - // Do not return errors here, as it adds clutter. - // Returning a nil result means there is not a valid rename. - item, err := source.PrepareRename(ctx, view, f, params.Position) - if err != nil { - return nil, nil - } - // TODO(suzmue): return ident.Name as the placeholder text. - return &item.Range, nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/reset_golden.sh b/vendor/golang.org/x/tools/internal/lsp/reset_golden.sh deleted file mode 100755 index 2689407ca..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/reset_golden.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -find ./internal/lsp/ -name *.golden -delete -go test ./internal/lsp/source -golden -go test ./internal/lsp/ -golden -go test ./internal/lsp/cmd -golden diff --git a/vendor/golang.org/x/tools/internal/lsp/server.go b/vendor/golang.org/x/tools/internal/lsp/server.go deleted file mode 100644 index 2a4345fb0..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/server.go +++ /dev/null @@ -1,275 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package lsp implements LSP for gopls. -package lsp - -import ( - "context" - "fmt" - "net" - "sync" - - "golang.org/x/tools/internal/jsonrpc2" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" -) - -// NewClientServer -func NewClientServer(ctx context.Context, cache source.Cache, client protocol.Client) (context.Context, *Server) { - ctx = protocol.WithClient(ctx, client) - return ctx, &Server{ - client: client, - session: cache.NewSession(ctx), - } -} - -// NewServer starts an LSP server on the supplied stream, and waits until the -// stream is closed. -func NewServer(ctx context.Context, cache source.Cache, stream jsonrpc2.Stream) (context.Context, *Server) { - s := &Server{} - ctx, s.Conn, s.client = protocol.NewServer(ctx, stream, s) - s.session = cache.NewSession(ctx) - return ctx, s -} - -// RunServerOnPort starts an LSP server on the given port and does not exit. -// This function exists for debugging purposes. -func RunServerOnPort(ctx context.Context, cache source.Cache, port int, h func(ctx context.Context, s *Server)) error { - return RunServerOnAddress(ctx, cache, fmt.Sprintf(":%v", port), h) -} - -// RunServerOnPort starts an LSP server on the given port and does not exit. -// This function exists for debugging purposes. -func RunServerOnAddress(ctx context.Context, cache source.Cache, addr string, h func(ctx context.Context, s *Server)) error { - ln, err := net.Listen("tcp", addr) - if err != nil { - return err - } - for { - conn, err := ln.Accept() - if err != nil { - return err - } - h(NewServer(ctx, cache, jsonrpc2.NewHeaderStream(conn, conn))) - } -} - -func (s *Server) Run(ctx context.Context) error { - return s.Conn.Run(ctx) -} - -type serverState int - -const ( - serverCreated = serverState(iota) - serverInitializing // set once the server has received "initialize" request - serverInitialized // set once the server has received "initialized" request - serverShutDown -) - -type Server struct { - Conn *jsonrpc2.Conn - client protocol.Client - - stateMu sync.Mutex - state serverState - - session source.Session - - // undelivered is a cache of any diagnostics that the server - // failed to deliver for some reason. - undeliveredMu sync.Mutex - undelivered map[span.URI][]source.Diagnostic - - // folders is only valid between initialize and initialized, and holds the - // set of folders to build views for when we are ready - pendingFolders []protocol.WorkspaceFolder -} - -// General - -func (s *Server) Initialize(ctx context.Context, params *protocol.ParamInitia) (*protocol.InitializeResult, error) { - return s.initialize(ctx, params) -} - -func (s *Server) Initialized(ctx context.Context, params *protocol.InitializedParams) error { - return s.initialized(ctx, params) -} - -func (s *Server) Shutdown(ctx context.Context) error { - return s.shutdown(ctx) -} - -func (s *Server) Exit(ctx context.Context) error { - return s.exit(ctx) -} - -// Workspace - -func (s *Server) DidChangeWorkspaceFolders(ctx context.Context, params *protocol.DidChangeWorkspaceFoldersParams) error { - return s.changeFolders(ctx, params.Event) -} - -func (s *Server) DidChangeConfiguration(context.Context, *protocol.DidChangeConfigurationParams) error { - return notImplemented("DidChangeConfiguration") -} - -func (s *Server) DidChangeWatchedFiles(ctx context.Context, params *protocol.DidChangeWatchedFilesParams) error { - return s.didChangeWatchedFiles(ctx, params) -} - -func (s *Server) Symbol(context.Context, *protocol.WorkspaceSymbolParams) ([]protocol.SymbolInformation, error) { - return nil, notImplemented("Symbol") -} - -func (s *Server) ExecuteCommand(ctx context.Context, params *protocol.ExecuteCommandParams) (interface{}, error) { - return s.executeCommand(ctx, params) -} - -// Text Synchronization - -func (s *Server) DidOpen(ctx context.Context, params *protocol.DidOpenTextDocumentParams) error { - return s.didOpen(ctx, params) -} - -func (s *Server) DidChange(ctx context.Context, params *protocol.DidChangeTextDocumentParams) error { - return s.didChange(ctx, params) -} - -func (s *Server) WillSave(context.Context, *protocol.WillSaveTextDocumentParams) error { - return notImplemented("WillSave") -} - -func (s *Server) WillSaveWaitUntil(context.Context, *protocol.WillSaveTextDocumentParams) ([]protocol.TextEdit, error) { - return nil, notImplemented("WillSaveWaitUntil") -} - -func (s *Server) DidSave(ctx context.Context, params *protocol.DidSaveTextDocumentParams) error { - return s.didSave(ctx, params) -} - -func (s *Server) DidClose(ctx context.Context, params *protocol.DidCloseTextDocumentParams) error { - return s.didClose(ctx, params) -} - -// Language Features - -func (s *Server) Completion(ctx context.Context, params *protocol.CompletionParams) (*protocol.CompletionList, error) { - return s.completion(ctx, params) -} - -func (s *Server) Resolve(ctx context.Context, item *protocol.CompletionItem) (*protocol.CompletionItem, error) { - return nil, notImplemented("completionItem/resolve") -} - -func (s *Server) Hover(ctx context.Context, params *protocol.HoverParams) (*protocol.Hover, error) { - return s.hover(ctx, params) -} - -func (s *Server) SignatureHelp(ctx context.Context, params *protocol.SignatureHelpParams) (*protocol.SignatureHelp, error) { - return s.signatureHelp(ctx, params) -} - -func (s *Server) Definition(ctx context.Context, params *protocol.DefinitionParams) ([]protocol.Location, error) { - return s.definition(ctx, params) -} - -func (s *Server) TypeDefinition(ctx context.Context, params *protocol.TypeDefinitionParams) ([]protocol.Location, error) { - return s.typeDefinition(ctx, params) -} - -func (s *Server) Implementation(ctx context.Context, params *protocol.ImplementationParams) ([]protocol.Location, error) { - return s.implementation(ctx, params) -} - -func (s *Server) References(ctx context.Context, params *protocol.ReferenceParams) ([]protocol.Location, error) { - return s.references(ctx, params) -} - -func (s *Server) DocumentHighlight(ctx context.Context, params *protocol.DocumentHighlightParams) ([]protocol.DocumentHighlight, error) { - return s.documentHighlight(ctx, params) -} - -func (s *Server) DocumentSymbol(ctx context.Context, params *protocol.DocumentSymbolParams) ([]protocol.DocumentSymbol, error) { - return s.documentSymbol(ctx, params) -} - -func (s *Server) CodeAction(ctx context.Context, params *protocol.CodeActionParams) ([]protocol.CodeAction, error) { - return s.codeAction(ctx, params) -} - -func (s *Server) CodeLens(context.Context, *protocol.CodeLensParams) ([]protocol.CodeLens, error) { - return nil, nil // ignore -} - -func (s *Server) ResolveCodeLens(context.Context, *protocol.CodeLens) (*protocol.CodeLens, error) { - return nil, notImplemented("ResolveCodeLens") -} - -func (s *Server) DocumentLink(ctx context.Context, params *protocol.DocumentLinkParams) ([]protocol.DocumentLink, error) { - return s.documentLink(ctx, params) -} - -func (s *Server) ResolveDocumentLink(context.Context, *protocol.DocumentLink) (*protocol.DocumentLink, error) { - return nil, notImplemented("ResolveDocumentLink") -} - -func (s *Server) DocumentColor(context.Context, *protocol.DocumentColorParams) ([]protocol.ColorInformation, error) { - return nil, notImplemented("DocumentColor") -} - -func (s *Server) ColorPresentation(context.Context, *protocol.ColorPresentationParams) ([]protocol.ColorPresentation, error) { - return nil, notImplemented("ColorPresentation") -} - -func (s *Server) Formatting(ctx context.Context, params *protocol.DocumentFormattingParams) ([]protocol.TextEdit, error) { - return s.formatting(ctx, params) -} - -func (s *Server) RangeFormatting(ctx context.Context, params *protocol.DocumentRangeFormattingParams) ([]protocol.TextEdit, error) { - return nil, notImplemented("RangeFormatting") -} - -func (s *Server) OnTypeFormatting(context.Context, *protocol.DocumentOnTypeFormattingParams) ([]protocol.TextEdit, error) { - return nil, notImplemented("OnTypeFormatting") -} - -func (s *Server) Rename(ctx context.Context, params *protocol.RenameParams) (*protocol.WorkspaceEdit, error) { - return s.rename(ctx, params) -} - -func (s *Server) Declaration(context.Context, *protocol.DeclarationParams) ([]protocol.DeclarationLink, error) { - return nil, notImplemented("Declaration") -} - -func (s *Server) FoldingRange(ctx context.Context, params *protocol.FoldingRangeParams) ([]protocol.FoldingRange, error) { - return s.foldingRange(ctx, params) -} - -func (s *Server) LogTraceNotification(context.Context, *protocol.LogTraceParams) error { - return notImplemented("LogtraceNotification") -} - -func (s *Server) PrepareRename(ctx context.Context, params *protocol.PrepareRenameParams) (*protocol.Range, error) { - // TODO(suzmue): support sending placeholder text. - return s.prepareRename(ctx, params) -} - -func (s *Server) Progress(context.Context, *protocol.ProgressParams) error { - return notImplemented("Progress") -} - -func (s *Server) SetTraceNotification(context.Context, *protocol.SetTraceParams) error { - return notImplemented("SetTraceNotification") -} - -func (s *Server) SelectionRange(context.Context, *protocol.SelectionRangeParams) ([]protocol.SelectionRange, error) { - return nil, notImplemented("SelectionRange") -} - -func notImplemented(method string) *jsonrpc2.Error { - return jsonrpc2.NewErrorf(jsonrpc2.CodeMethodNotFound, "method %q not yet implemented", method) -} diff --git a/vendor/golang.org/x/tools/internal/lsp/signature_help.go b/vendor/golang.org/x/tools/internal/lsp/signature_help.go deleted file mode 100644 index 5771ef16c..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/signature_help.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package lsp - -import ( - "context" - - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/telemetry/log" - "golang.org/x/tools/internal/telemetry/tag" -) - -func (s *Server) signatureHelp(ctx context.Context, params *protocol.SignatureHelpParams) (*protocol.SignatureHelp, error) { - uri := span.NewURI(params.TextDocument.URI) - view := s.session.ViewOf(uri) - f, err := view.GetFile(ctx, uri) - if err != nil { - return nil, err - } - info, err := source.SignatureHelp(ctx, view, f, params.Position) - if err != nil { - log.Print(ctx, "no signature help", tag.Of("At", params.Position), tag.Of("Failure", err)) - return nil, nil - } - return toProtocolSignatureHelp(info), nil -} - -func toProtocolSignatureHelp(info *source.SignatureInformation) *protocol.SignatureHelp { - return &protocol.SignatureHelp{ - ActiveParameter: float64(info.ActiveParameter), - ActiveSignature: 0, // there is only ever one possible signature - Signatures: []protocol.SignatureInformation{ - { - Label: info.Label, - Documentation: info.Documentation, - Parameters: toProtocolParameterInformation(info.Parameters), - }, - }, - } -} - -func toProtocolParameterInformation(info []source.ParameterInformation) []protocol.ParameterInformation { - var result []protocol.ParameterInformation - for _, p := range info { - result = append(result, protocol.ParameterInformation{ - Label: p.Label, - }) - } - return result -} diff --git a/vendor/golang.org/x/tools/internal/lsp/snippet/snippet_builder.go b/vendor/golang.org/x/tools/internal/lsp/snippet/snippet_builder.go deleted file mode 100644 index 3afd525f4..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/snippet/snippet_builder.go +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package snippet implements the specification for the LSP snippet format. -// -// Snippets are "tab stop" templates returned as an optional attribute of LSP -// completion candidates. As the user presses tab, they cycle through a series of -// tab stops defined in the snippet. Each tab stop can optionally have placeholder -// text, which can be pre-selected by editors. For a full description of syntax -// and features, see "Snippet Syntax" at -// https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/#textDocument_completion. -// -// A typical snippet looks like "foo(${1:i int}, ${2:s string})". -package snippet - -import ( - "fmt" - "strings" -) - -// A Builder is used to build an LSP snippet piecemeal. -// The zero value is ready to use. Do not copy a non-zero Builder. -type Builder struct { - // currentTabStop is the index of the previous tab stop. The - // next tab stop will be currentTabStop+1. - currentTabStop int - sb strings.Builder -} - -// Escape characters defined in https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/#textDocument_completion under "Grammar". -var replacer = strings.NewReplacer( - `\`, `\\`, - `}`, `\}`, - `$`, `\$`, -) - -func (b *Builder) WriteText(s string) { - replacer.WriteString(&b.sb, s) -} - -// WritePlaceholder writes a tab stop and placeholder value to the Builder. -// The callback style allows for creating nested placeholders. To write an -// empty tab stop, provide a nil callback. -func (b *Builder) WritePlaceholder(fn func(*Builder)) { - fmt.Fprintf(&b.sb, "${%d:", b.nextTabStop()) - if fn != nil { - fn(b) - } - b.sb.WriteByte('}') -} - -// WriteFinalTabstop marks where cursor ends up after the user has -// cycled through all the normal tab stops. It defaults to the -// character after the snippet. -func (b *Builder) WriteFinalTabstop() { - fmt.Fprint(&b.sb, "$0") -} - -// In addition to '\', '}', and '$', snippet choices also use '|' and ',' as -// meta characters, so they must be escaped within the choices. -var choiceReplacer = strings.NewReplacer( - `\`, `\\`, - `}`, `\}`, - `$`, `\$`, - `|`, `\|`, - `,`, `\,`, -) - -// WriteChoice writes a tab stop and list of text choices to the Builder. -// The user's editor will prompt the user to choose one of the choices. -func (b *Builder) WriteChoice(choices []string) { - fmt.Fprintf(&b.sb, "${%d|", b.nextTabStop()) - for i, c := range choices { - if i != 0 { - b.sb.WriteByte(',') - } - choiceReplacer.WriteString(&b.sb, c) - } - b.sb.WriteString("|}") -} - -// String returns the built snippet string. -func (b *Builder) String() string { - return b.sb.String() -} - -// nextTabStop returns the next tab stop index for a new placeholder. -func (b *Builder) nextTabStop() int { - // Tab stops start from 1, so increment before returning. - b.currentTabStop++ - return b.currentTabStop -} diff --git a/vendor/golang.org/x/tools/internal/lsp/source/comment.go b/vendor/golang.org/x/tools/internal/lsp/source/comment.go deleted file mode 100644 index 42458cc2a..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/source/comment.go +++ /dev/null @@ -1,389 +0,0 @@ -package source - -import ( - "bytes" - "io" - "regexp" - "strings" - "unicode" - "unicode/utf8" -) - -// CommentToMarkdown converts comment text to formatted markdown. -// The comment was prepared by DocReader, -// so it is known not to have leading, trailing blank lines -// nor to have trailing spaces at the end of lines. -// The comment markers have already been removed. -// -// Each line is converted into a markdown line and empty lines are just converted to -// newlines. Heading are prefixed with `### ` to make it a markdown heading. -// -// A span of indented lines retains a 4 space prefix block, with the common indent -// prefix removed unless empty, in which case it will be converted to a newline. -// -// URLs in the comment text are converted into links. -func CommentToMarkdown(text string) string { - buf := &bytes.Buffer{} - commentToMarkdown(buf, text) - return buf.String() -} - -var ( - mdNewline = []byte("\n") - mdHeader = []byte("### ") - mdIndent = []byte("    ") - mdLinkStart = []byte("[") - mdLinkDiv = []byte("](") - mdLinkEnd = []byte(")") -) - -func commentToMarkdown(w io.Writer, text string) { - isFirstLine := true - for _, b := range blocks(text) { - switch b.op { - case opPara: - if !isFirstLine { - w.Write(mdNewline) - } - - for _, line := range b.lines { - emphasize(w, line, true) - } - case opHead: - if !isFirstLine { - w.Write(mdNewline) - } - w.Write(mdNewline) - - for _, line := range b.lines { - w.Write(mdHeader) - commentEscape(w, line, true) - w.Write(mdNewline) - } - case opPre: - if !isFirstLine { - w.Write(mdNewline) - } - w.Write(mdNewline) - - for _, line := range b.lines { - if isBlank(line) { - w.Write(mdNewline) - } else { - w.Write(mdIndent) - w.Write([]byte(line)) - w.Write(mdNewline) - } - } - } - isFirstLine = false - } -} - -const ( - ulquo = "“" - urquo = "”" -) - -var ( - markdownEscape = regexp.MustCompile(`([\\\x60*{}[\]()#+\-.!_>~|"$%&'\/:;<=?@^])`) - - unicodeQuoteReplacer = strings.NewReplacer("``", ulquo, "''", urquo) -) - -// commentEscape escapes comment text for markdown. If nice is set, -// also turn `` into “; and '' into ”;. -func commentEscape(w io.Writer, text string, nice bool) { - if nice { - text = convertQuotes(text) - } - text = escapeRegex(text) - w.Write([]byte(text)) -} - -func convertQuotes(text string) string { - return unicodeQuoteReplacer.Replace(text) -} - -func escapeRegex(text string) string { - return markdownEscape.ReplaceAllString(text, `\$1`) -} - -func emphasize(w io.Writer, line string, nice bool) { - for { - m := matchRx.FindStringSubmatchIndex(line) - if m == nil { - break - } - // m >= 6 (two parenthesized sub-regexps in matchRx, 1st one is urlRx) - - // write text before match - commentEscape(w, line[0:m[0]], nice) - - // adjust match for URLs - match := line[m[0]:m[1]] - if strings.Contains(match, "://") { - m0, m1 := m[0], m[1] - for _, s := range []string{"()", "{}", "[]"} { - open, close := s[:1], s[1:] // E.g., "(" and ")" - // require opening parentheses before closing parentheses (#22285) - if i := strings.Index(match, close); i >= 0 && i < strings.Index(match, open) { - m1 = m0 + i - match = line[m0:m1] - } - // require balanced pairs of parentheses (#5043) - for i := 0; strings.Count(match, open) != strings.Count(match, close) && i < 10; i++ { - m1 = strings.LastIndexAny(line[:m1], s) - match = line[m0:m1] - } - } - if m1 != m[1] { - // redo matching with shortened line for correct indices - m = matchRx.FindStringSubmatchIndex(line[:m[0]+len(match)]) - } - } - - // Following code has been modified from go/doc since words is always - // nil. All html formatting has also been transformed into markdown formatting - - // analyze match - url := "" - if m[2] >= 0 { - url = match - } - - // write match - if len(url) > 0 { - w.Write(mdLinkStart) - } - - commentEscape(w, match, nice) - - if len(url) > 0 { - w.Write(mdLinkDiv) - w.Write([]byte(urlReplacer.Replace(url))) - w.Write(mdLinkEnd) - } - - // advance - line = line[m[1]:] - } - commentEscape(w, line, nice) -} - -// Everything from here on is a copy of go/doc/comment.go - -const ( - // Regexp for Go identifiers - identRx = `[\pL_][\pL_0-9]*` - - // Regexp for URLs - // Match parens, and check later for balance - see #5043, #22285 - // Match .,:;?! within path, but not at end - see #18139, #16565 - // This excludes some rare yet valid urls ending in common punctuation - // in order to allow sentences ending in URLs. - - // protocol (required) e.g. http - protoPart = `(https?|ftp|file|gopher|mailto|nntp)` - // host (required) e.g. www.example.com or [::1]:8080 - hostPart = `([a-zA-Z0-9_@\-.\[\]:]+)` - // path+query+fragment (optional) e.g. /path/index.html?q=foo#bar - pathPart = `([.,:;?!]*[a-zA-Z0-9$'()*+&#=@~_/\-\[\]%])*` - - urlRx = protoPart + `://` + hostPart + pathPart -) - -var ( - matchRx = regexp.MustCompile(`(` + urlRx + `)|(` + identRx + `)`) - urlReplacer = strings.NewReplacer(`(`, `\(`, `)`, `\)`) -) - -func indentLen(s string) int { - i := 0 - for i < len(s) && (s[i] == ' ' || s[i] == '\t') { - i++ - } - return i -} - -func isBlank(s string) bool { - return len(s) == 0 || (len(s) == 1 && s[0] == '\n') -} - -func commonPrefix(a, b string) string { - i := 0 - for i < len(a) && i < len(b) && a[i] == b[i] { - i++ - } - return a[0:i] -} - -func unindent(block []string) { - if len(block) == 0 { - return - } - - // compute maximum common white prefix - prefix := block[0][0:indentLen(block[0])] - for _, line := range block { - if !isBlank(line) { - prefix = commonPrefix(prefix, line[0:indentLen(line)]) - } - } - n := len(prefix) - - // remove - for i, line := range block { - if !isBlank(line) { - block[i] = line[n:] - } - } -} - -// heading returns the trimmed line if it passes as a section heading; -// otherwise it returns the empty string. -func heading(line string) string { - line = strings.TrimSpace(line) - if len(line) == 0 { - return "" - } - - // a heading must start with an uppercase letter - r, _ := utf8.DecodeRuneInString(line) - if !unicode.IsLetter(r) || !unicode.IsUpper(r) { - return "" - } - - // it must end in a letter or digit: - r, _ = utf8.DecodeLastRuneInString(line) - if !unicode.IsLetter(r) && !unicode.IsDigit(r) { - return "" - } - - // exclude lines with illegal characters. we allow "()," - if strings.ContainsAny(line, ";:!?+*/=[]{}_^°&§~%#@<\">\\") { - return "" - } - - // allow "'" for possessive "'s" only - for b := line; ; { - i := strings.IndexRune(b, '\'') - if i < 0 { - break - } - if i+1 >= len(b) || b[i+1] != 's' || (i+2 < len(b) && b[i+2] != ' ') { - return "" // not followed by "s " - } - b = b[i+2:] - } - - // allow "." when followed by non-space - for b := line; ; { - i := strings.IndexRune(b, '.') - if i < 0 { - break - } - if i+1 >= len(b) || b[i+1] == ' ' { - return "" // not followed by non-space - } - b = b[i+1:] - } - - return line -} - -type op int - -const ( - opPara op = iota - opHead - opPre -) - -type block struct { - op op - lines []string -} - -var nonAlphaNumRx = regexp.MustCompile(`[^a-zA-Z0-9]`) - -func anchorID(line string) string { - // Add a "hdr-" prefix to avoid conflicting with IDs used for package symbols. - return "hdr-" + nonAlphaNumRx.ReplaceAllString(line, "_") -} - -func blocks(text string) []block { - var ( - out []block - para []string - - lastWasBlank = false - lastWasHeading = false - ) - - close := func() { - if para != nil { - out = append(out, block{opPara, para}) - para = nil - } - } - - lines := strings.SplitAfter(text, "\n") - unindent(lines) - for i := 0; i < len(lines); { - line := lines[i] - if isBlank(line) { - // close paragraph - close() - i++ - lastWasBlank = true - continue - } - if indentLen(line) > 0 { - // close paragraph - close() - - // count indented or blank lines - j := i + 1 - for j < len(lines) && (isBlank(lines[j]) || indentLen(lines[j]) > 0) { - j++ - } - // but not trailing blank lines - for j > i && isBlank(lines[j-1]) { - j-- - } - pre := lines[i:j] - i = j - - unindent(pre) - - // put those lines in a pre block - out = append(out, block{opPre, pre}) - lastWasHeading = false - continue - } - - if lastWasBlank && !lastWasHeading && i+2 < len(lines) && - isBlank(lines[i+1]) && !isBlank(lines[i+2]) && indentLen(lines[i+2]) == 0 { - // current line is non-blank, surrounded by blank lines - // and the next non-blank line is not indented: this - // might be a heading. - if head := heading(line); head != "" { - close() - out = append(out, block{opHead, []string{head}}) - i += 2 - lastWasHeading = true - continue - } - } - - // open paragraph - lastWasBlank = false - lastWasHeading = false - para = append(para, lines[i]) - i++ - } - close() - - return out -} diff --git a/vendor/golang.org/x/tools/internal/lsp/source/completion.go b/vendor/golang.org/x/tools/internal/lsp/source/completion.go deleted file mode 100644 index 70be74522..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/source/completion.go +++ /dev/null @@ -1,1476 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package source - -import ( - "context" - "go/ast" - "go/constant" - "go/token" - "go/types" - "strings" - "time" - - "golang.org/x/tools/go/ast/astutil" - "golang.org/x/tools/internal/imports" - "golang.org/x/tools/internal/lsp/fuzzy" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/snippet" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/telemetry/log" - "golang.org/x/tools/internal/telemetry/trace" - errors "golang.org/x/xerrors" -) - -type CompletionItem struct { - // Label is the primary text the user sees for this completion item. - Label string - - // Detail is supplemental information to present to the user. - // This often contains the type or return type of the completion item. - Detail string - - // InsertText is the text to insert if this item is selected. - // Any of the prefix that has already been typed is not trimmed. - // The insert text does not contain snippets. - InsertText string - - Kind protocol.CompletionItemKind - - // An optional array of additional TextEdits that are applied when - // selecting this completion. - // - // Additional text edits should be used to change text unrelated to the current cursor position - // (for example adding an import statement at the top of the file if the completion item will - // insert an unqualified type). - AdditionalTextEdits []protocol.TextEdit - - // Depth is how many levels were searched to find this completion. - // For example when completing "foo<>", "fooBar" is depth 0, and - // "fooBar.Baz" is depth 1. - Depth int - - // Score is the internal relevance score. - // A higher score indicates that this completion item is more relevant. - Score float64 - - // snippet is the LSP snippet for the completion item. The LSP - // specification contains details about LSP snippets. For example, a - // snippet for a function with the following signature: - // - // func foo(a, b, c int) - // - // would be: - // - // foo(${1:a int}, ${2: b int}, ${3: c int}) - // - // If Placeholders is false in the CompletionOptions, the above - // snippet would instead be: - // - // foo(${1:}) - snippet *snippet.Builder - - // Documentation is the documentation for the completion item. - Documentation string -} - -// Snippet is a convenience returns the snippet if available, otherwise -// the InsertText. -// used for an item, depending on if the callee wants placeholders or not. -func (i *CompletionItem) Snippet() string { - if i.snippet != nil { - return i.snippet.String() - } - return i.InsertText -} - -// Scoring constants are used for weighting the relevance of different candidates. -const ( - // stdScore is the base score for all completion items. - stdScore float64 = 1.0 - - // highScore indicates a very relevant completion item. - highScore float64 = 10.0 - - // lowScore indicates an irrelevant or not useful completion item. - lowScore float64 = 0.01 -) - -// matcher matches a candidate's label against the user input. The -// returned score reflects the quality of the match. A score of zero -// indicates no match, and a score of one means a perfect match. -type matcher interface { - Score(candidateLabel string) (score float32) -} - -// prefixMatcher implements case sensitive prefix matching. -type prefixMatcher string - -func (pm prefixMatcher) Score(candidateLabel string) float32 { - if strings.HasPrefix(candidateLabel, string(pm)) { - return 1 - } - return -1 -} - -// insensitivePrefixMatcher implements case insensitive prefix matching. -type insensitivePrefixMatcher string - -func (ipm insensitivePrefixMatcher) Score(candidateLabel string) float32 { - if strings.HasPrefix(strings.ToLower(candidateLabel), string(ipm)) { - return 1 - } - return -1 -} - -// completer contains the necessary information for a single completion request. -type completer struct { - snapshot Snapshot - pkg Package - - qf types.Qualifier - opts CompletionOptions - - // view is the View associated with this completion request. - view View - - // ctx is the context associated with this completion request. - ctx context.Context - - // filename is the name of the file associated with this completion request. - filename string - - // file is the AST of the file associated with this completion request. - file *ast.File - - // pos is the position at which the request was triggered. - pos token.Pos - - // path is the path of AST nodes enclosing the position. - path []ast.Node - - // seen is the map that ensures we do not return duplicate results. - seen map[types.Object]bool - - // items is the list of completion items returned. - items []CompletionItem - - // surrounding describes the identifier surrounding the position. - surrounding *Selection - - // expectedType contains information about the type we expect the completion - // candidate to be. It will be the zero value if no information is available. - expectedType typeInference - - // enclosingFunc contains information about the function enclosing - // the position. - enclosingFunc *funcInfo - - // enclosingCompositeLiteral contains information about the composite literal - // enclosing the position. - enclosingCompositeLiteral *compLitInfo - - // deepState contains the current state of our deep completion search. - deepState deepCompletionState - - // matcher matches the candidates against the surrounding prefix. - matcher matcher - - // methodSetCache caches the types.NewMethodSet call, which is relatively - // expensive and can be called many times for the same type while searching - // for deep completions. - methodSetCache map[methodSetKey]*types.MethodSet - - // mapper converts the positions in the file from which the completion originated. - mapper *protocol.ColumnMapper - - // startTime is when we started processing this completion request. It does - // not include any time the request spent in the queue. - startTime time.Time -} - -// funcInfo holds info about a function object. -type funcInfo struct { - // sig is the function declaration enclosing the position. - sig *types.Signature - - // body is the function's body. - body *ast.BlockStmt -} - -type compLitInfo struct { - // cl is the *ast.CompositeLit enclosing the position. - cl *ast.CompositeLit - - // clType is the type of cl. - clType types.Type - - // kv is the *ast.KeyValueExpr enclosing the position, if any. - kv *ast.KeyValueExpr - - // inKey is true if we are certain the position is in the key side - // of a key-value pair. - inKey bool - - // maybeInFieldName is true if inKey is false and it is possible - // we are completing a struct field name. For example, - // "SomeStruct{<>}" will be inKey=false, but maybeInFieldName=true - // because we _could_ be completing a field name. - maybeInFieldName bool -} - -type methodSetKey struct { - typ types.Type - addressable bool -} - -// A Selection represents the cursor position and surrounding identifier. -type Selection struct { - content string - cursor token.Pos - mappedRange -} - -func (p Selection) Prefix() string { - return p.content[:p.cursor-p.spanRange.Start] -} - -func (p Selection) Suffix() string { - return p.content[p.cursor-p.spanRange.Start:] -} - -func (c *completer) setSurrounding(ident *ast.Ident) { - if c.surrounding != nil { - return - } - if !(ident.Pos() <= c.pos && c.pos <= ident.End()) { - return - } - - c.surrounding = &Selection{ - content: ident.Name, - cursor: c.pos, - mappedRange: mappedRange{ - // Overwrite the prefix only. - spanRange: span.NewRange(c.view.Session().Cache().FileSet(), ident.Pos(), c.pos), - m: c.mapper, - }, - } - - if c.opts.FuzzyMatching { - c.matcher = fuzzy.NewMatcher(c.surrounding.Prefix()) - } else if c.opts.CaseSensitive { - c.matcher = prefixMatcher(c.surrounding.Prefix()) - } else { - c.matcher = insensitivePrefixMatcher(strings.ToLower(c.surrounding.Prefix())) - } -} - -func (c *completer) getSurrounding() *Selection { - if c.surrounding == nil { - c.surrounding = &Selection{ - content: "", - cursor: c.pos, - mappedRange: mappedRange{ - spanRange: span.NewRange(c.view.Session().Cache().FileSet(), c.pos, c.pos), - m: c.mapper, - }, - } - } - return c.surrounding -} - -// found adds a candidate completion. We will also search through the object's -// members for more candidates. -func (c *completer) found(obj types.Object, score float64, imp *imports.ImportInfo) { - if obj.Pkg() != nil && obj.Pkg() != c.pkg.GetTypes() && !obj.Exported() { - // obj is not accessible because it lives in another package and is not - // exported. Don't treat it as a completion candidate. - return - } - - if c.inDeepCompletion() { - // When searching deep, just make sure we don't have a cycle in our chain. - // We don't dedupe by object because we want to allow both "foo.Baz" and - // "bar.Baz" even though "Baz" is represented the same types.Object in both. - for _, seenObj := range c.deepState.chain { - if seenObj == obj { - return - } - } - } else { - // At the top level, dedupe by object. - if c.seen[obj] { - return - } - c.seen[obj] = true - } - - // If we are running out of budgeted time we must limit our search for deep - // completion candidates. - if c.shouldPrune() { - return - } - - cand := candidate{ - obj: obj, - score: score, - imp: imp, - } - - if c.matchingCandidate(&cand) { - cand.score *= highScore - } else if isTypeName(obj) { - // If obj is a *types.TypeName that didn't otherwise match, check - // if a literal object of this type makes a good candidate. - c.literal(obj.Type(), imp) - } - - // Favor shallow matches by lowering weight according to depth. - cand.score -= cand.score * float64(len(c.deepState.chain)) / 10 - if cand.score < 0 { - cand.score = 0 - } - - cand.name = c.deepState.chainString(obj.Name()) - matchScore := c.matcher.Score(cand.name) - if matchScore > 0 { - cand.score *= float64(matchScore) - - // Avoid calling c.item() for deep candidates that wouldn't be in the top - // MaxDeepCompletions anyway. - if !c.inDeepCompletion() || c.deepState.isHighScore(cand.score) { - if item, err := c.item(cand); err == nil { - c.items = append(c.items, item) - } else { - log.Error(c.ctx, "error generating completion item", err) - } - } - } - - c.deepSearch(obj, imp) -} - -// candidate represents a completion candidate. -type candidate struct { - // obj is the types.Object to complete to. - obj types.Object - - // score is used to rank candidates. - score float64 - - // name is the deep object name path, e.g. "foo.bar" - name string - - // expandFuncCall is true if obj should be invoked in the completion. - // For example, expandFuncCall=true yields "foo()", expandFuncCall=false yields "foo". - expandFuncCall bool - - // imp is the import that needs to be added to this package in order - // for this candidate to be valid. nil if no import needed. - imp *imports.ImportInfo -} - -// ErrIsDefinition is an error that informs the user they got no -// completions because they tried to complete the name of a new object -// being defined. -type ErrIsDefinition struct { - objStr string -} - -func (e ErrIsDefinition) Error() string { - msg := "this is a definition" - if e.objStr != "" { - msg += " of " + e.objStr - } - return msg -} - -// Completion returns a list of possible candidates for completion, given a -// a file and a position. -// -// The selection is computed based on the preceding identifier and can be used by -// the client to score the quality of the completion. For instance, some clients -// may tolerate imperfect matches as valid completion results, since users may make typos. -func Completion(ctx context.Context, view View, f File, pos protocol.Position, opts CompletionOptions) ([]CompletionItem, *Selection, error) { - ctx, done := trace.StartSpan(ctx, "source.Completion") - defer done() - - startTime := time.Now() - - snapshot, cphs, err := view.CheckPackageHandles(ctx, f) - if err != nil { - return nil, nil, err - } - cph, err := NarrowestCheckPackageHandle(cphs) - if err != nil { - return nil, nil, err - } - pkg, err := cph.Check(ctx) - if err != nil { - return nil, nil, err - } - ph, err := pkg.File(f.URI()) - if err != nil { - return nil, nil, err - } - file, m, _, err := ph.Cached() - if err != nil { - return nil, nil, err - } - spn, err := m.PointSpan(pos) - if err != nil { - return nil, nil, err - } - rng, err := spn.Range(m.Converter) - if err != nil { - return nil, nil, err - } - // Completion is based on what precedes the cursor. - // Find the path to the position before pos. - path, _ := astutil.PathEnclosingInterval(file, rng.Start-1, rng.Start-1) - if path == nil { - return nil, nil, errors.Errorf("cannot find node enclosing position") - } - // Skip completion inside comments. - for _, g := range file.Comments { - if g.Pos() <= rng.Start && rng.Start <= g.End() { - return nil, nil, nil - } - } - // Skip completion inside any kind of literal. - if _, ok := path[0].(*ast.BasicLit); ok { - return nil, nil, nil - } - - c := &completer{ - pkg: pkg, - snapshot: snapshot, - qf: qualifier(file, pkg.GetTypes(), pkg.GetTypesInfo()), - view: view, - ctx: ctx, - filename: f.URI().Filename(), - file: file, - path: path, - pos: rng.Start, - seen: make(map[types.Object]bool), - enclosingFunc: enclosingFunction(path, rng.Start, pkg.GetTypesInfo()), - enclosingCompositeLiteral: enclosingCompositeLiteral(path, rng.Start, pkg.GetTypesInfo()), - opts: opts, - // default to a matcher that always matches - matcher: prefixMatcher(""), - methodSetCache: make(map[methodSetKey]*types.MethodSet), - mapper: m, - startTime: startTime, - } - - if opts.Deep { - // Initialize max search depth to unlimited. - c.deepState.maxDepth = -1 - } - - // Set the filter surrounding. - if ident, ok := path[0].(*ast.Ident); ok { - c.setSurrounding(ident) - } - - c.expectedType = expectedType(c) - - // Struct literals are handled entirely separately. - if c.wantStructFieldCompletions() { - if err := c.structLiteralFieldName(); err != nil { - return nil, nil, err - } - return c.items, c.getSurrounding(), nil - } - - if lt := c.wantLabelCompletion(); lt != labelNone { - c.labels(lt) - return c.items, c.getSurrounding(), nil - } - - switch n := path[0].(type) { - case *ast.Ident: - // Is this the Sel part of a selector? - if sel, ok := path[1].(*ast.SelectorExpr); ok && sel.Sel == n { - if err := c.selector(sel); err != nil { - return nil, nil, err - } - return c.items, c.getSurrounding(), nil - } - // reject defining identifiers - if obj, ok := pkg.GetTypesInfo().Defs[n]; ok { - if v, ok := obj.(*types.Var); ok && v.IsField() && v.Embedded() { - // An anonymous field is also a reference to a type. - } else { - objStr := "" - if obj != nil { - qual := types.RelativeTo(pkg.GetTypes()) - objStr = types.ObjectString(obj, qual) - } - return nil, nil, ErrIsDefinition{objStr: objStr} - } - } - if err := c.lexical(); err != nil { - return nil, nil, err - } - if err := c.keyword(); err != nil { - return nil, nil, err - } - - // The function name hasn't been typed yet, but the parens are there: - // recv.‸(arg) - case *ast.TypeAssertExpr: - // Create a fake selector expression. - if err := c.selector(&ast.SelectorExpr{X: n.X}); err != nil { - return nil, nil, err - } - - case *ast.SelectorExpr: - // The go parser inserts a phantom "_" Sel node when the selector is - // not followed by an identifier or a "(". The "_" isn't actually in - // the text, so don't think it is our surrounding. - // TODO: Find a way to differentiate between phantom "_" and real "_", - // perhaps by checking if "_" is present in file contents. - if n.Sel.Name != "_" || c.pos != n.Sel.Pos() { - c.setSurrounding(n.Sel) - } - - if err := c.selector(n); err != nil { - return nil, nil, err - } - - default: - // fallback to lexical completions - if err := c.lexical(); err != nil { - return nil, nil, err - } - } - - return c.items, c.getSurrounding(), nil -} - -func (c *completer) wantStructFieldCompletions() bool { - clInfo := c.enclosingCompositeLiteral - if clInfo == nil { - return false - } - - return clInfo.isStruct() && (clInfo.inKey || clInfo.maybeInFieldName) -} - -func (c *completer) wantTypeName() bool { - return c.expectedType.typeName.wantTypeName -} - -// selector finds completions for the specified selector expression. -func (c *completer) selector(sel *ast.SelectorExpr) error { - // Is sel a qualified identifier? - if id, ok := sel.X.(*ast.Ident); ok { - if pkgname, ok := c.pkg.GetTypesInfo().Uses[id].(*types.PkgName); ok { - c.packageMembers(pkgname.Imported(), nil) - return nil - } - } - - // Invariant: sel is a true selector. - tv, ok := c.pkg.GetTypesInfo().Types[sel.X] - if ok { - return c.methodsAndFields(tv.Type, tv.Addressable(), nil) - } - - // Try unimported packages. - if id, ok := sel.X.(*ast.Ident); ok { - pkgExports, err := PackageExports(c.ctx, c.view, id.Name, c.filename) - if err != nil { - return err - } - known := c.snapshot.KnownImportPaths() - for _, pkgExport := range pkgExports { - // If we've seen this import path, use the fully-typed version. - if knownPkg, ok := known[pkgExport.Fix.StmtInfo.ImportPath]; ok { - c.packageMembers(knownPkg.GetTypes(), &pkgExport.Fix.StmtInfo) - continue - } - - // Otherwise, continue with untyped proposals. - pkg := types.NewPackage(pkgExport.Fix.StmtInfo.ImportPath, pkgExport.Fix.IdentName) - for _, export := range pkgExport.Exports { - c.found(types.NewVar(0, pkg, export, nil), 0.07, &pkgExport.Fix.StmtInfo) - } - } - } - return nil -} - -func (c *completer) packageMembers(pkg *types.Package, imp *imports.ImportInfo) { - scope := pkg.Scope() - for _, name := range scope.Names() { - c.found(scope.Lookup(name), stdScore, imp) - } -} - -func (c *completer) methodsAndFields(typ types.Type, addressable bool, imp *imports.ImportInfo) error { - mset := c.methodSetCache[methodSetKey{typ, addressable}] - if mset == nil { - if addressable && !types.IsInterface(typ) && !isPointer(typ) { - // Add methods of *T, which includes methods with receiver T. - mset = types.NewMethodSet(types.NewPointer(typ)) - } else { - // Add methods of T. - mset = types.NewMethodSet(typ) - } - c.methodSetCache[methodSetKey{typ, addressable}] = mset - } - - for i := 0; i < mset.Len(); i++ { - c.found(mset.At(i).Obj(), stdScore, imp) - } - - // Add fields of T. - for _, f := range fieldSelections(typ) { - c.found(f, stdScore, imp) - } - return nil -} - -// lexical finds completions in the lexical environment. -func (c *completer) lexical() error { - var scopes []*types.Scope // scopes[i], where i) or the completion request is triggered - // from an already completed composite literal expression (e.g. &x{foo: 1, <>}) - // - // The position is not part of the composite literal unless it falls within the - // curly braces (e.g. "foo.Foo<>Struct{}"). - if !(n.Lbrace < pos && pos <= n.Rbrace) { - // Keep searching since we may yet be inside a composite literal. - // For example "Foo{B: Ba<>{}}". - break - } - - tv, ok := info.Types[n] - if !ok { - return nil - } - - clInfo := compLitInfo{ - cl: n, - clType: deref(tv.Type).Underlying(), - } - - var ( - expr ast.Expr - hasKeys bool - ) - for _, el := range n.Elts { - // Remember the expression that the position falls in, if any. - if el.Pos() <= pos && pos <= el.End() { - expr = el - } - - if kv, ok := el.(*ast.KeyValueExpr); ok { - hasKeys = true - // If expr == el then we know the position falls in this expression, - // so also record kv as the enclosing *ast.KeyValueExpr. - if expr == el { - clInfo.kv = kv - break - } - } - } - - if clInfo.kv != nil { - // If in a *ast.KeyValueExpr, we know we are in the key if the position - // is to the left of the colon (e.g. "Foo{F<>: V}". - clInfo.inKey = pos <= clInfo.kv.Colon - } else if hasKeys { - // If we aren't in a *ast.KeyValueExpr but the composite literal has - // other *ast.KeyValueExprs, we must be on the key side of a new - // *ast.KeyValueExpr (e.g. "Foo{F: V, <>}"). - clInfo.inKey = true - } else { - switch clInfo.clType.(type) { - case *types.Struct: - if len(n.Elts) == 0 { - // If the struct literal is empty, next could be a struct field - // name or an expression (e.g. "Foo{<>}" could become "Foo{F:}" - // or "Foo{someVar}"). - clInfo.maybeInFieldName = true - } else if len(n.Elts) == 1 { - // If there is one expression and the position is in that expression - // and the expression is an identifier, we may be writing a field - // name or an expression (e.g. "Foo{F<>}"). - _, clInfo.maybeInFieldName = expr.(*ast.Ident) - } - case *types.Map: - // If we aren't in a *ast.KeyValueExpr we must be adding a new key - // to the map. - clInfo.inKey = true - } - } - - return &clInfo - default: - if breaksExpectedTypeInference(n) { - return nil - } - } - } - - return nil -} - -// enclosingFunction returns the signature and body of the function -// enclosing the given position. -func enclosingFunction(path []ast.Node, pos token.Pos, info *types.Info) *funcInfo { - for _, node := range path { - switch t := node.(type) { - case *ast.FuncDecl: - if obj, ok := info.Defs[t.Name]; ok { - return &funcInfo{ - sig: obj.Type().(*types.Signature), - body: t.Body, - } - } - case *ast.FuncLit: - if typ, ok := info.Types[t]; ok { - return &funcInfo{ - sig: typ.Type.(*types.Signature), - body: t.Body, - } - } - } - } - return nil -} - -func (c *completer) expectedCompositeLiteralType() types.Type { - clInfo := c.enclosingCompositeLiteral - switch t := clInfo.clType.(type) { - case *types.Slice: - if clInfo.inKey { - return types.Typ[types.Int] - } - return t.Elem() - case *types.Array: - if clInfo.inKey { - return types.Typ[types.Int] - } - return t.Elem() - case *types.Map: - if clInfo.inKey { - return t.Key() - } - return t.Elem() - case *types.Struct: - // If we are completing a key (i.e. field name), there is no expected type. - if clInfo.inKey { - return nil - } - - // If we are in a key-value pair, but not in the key, then we must be on the - // value side. The expected type of the value will be determined from the key. - if clInfo.kv != nil { - if key, ok := clInfo.kv.Key.(*ast.Ident); ok { - for i := 0; i < t.NumFields(); i++ { - if field := t.Field(i); field.Name() == key.Name { - return field.Type() - } - } - } - } else { - // If we aren't in a key-value pair and aren't in the key, we must be using - // implicit field names. - - // The order of the literal fields must match the order in the struct definition. - // Find the element that the position belongs to and suggest that field's type. - if i := indexExprAtPos(c.pos, clInfo.cl.Elts); i < t.NumFields() { - return t.Field(i).Type() - } - } - } - return nil -} - -// typeModifier represents an operator that changes the expected type. -type typeModifier struct { - mod typeMod - arrayLen int64 -} - -type typeMod int - -const ( - star typeMod = iota // dereference operator for expressions, pointer indicator for types - reference // reference ("&") operator - chanRead // channel read ("<-") operator - slice // make a slice type ("[]" in "[]int") - array // make an array type ("[2]" in "[2]int") -) - -// typeInference holds information we have inferred about a type that can be -// used at the current position. -type typeInference struct { - // objType is the desired type of an object used at the query position. - objType types.Type - - // variadic is true if objType is a slice type from an initial - // variadic param. - variadic bool - - // modifiers are prefixes such as "*", "&" or "<-" that influence how - // a candidate type relates to the expected type. - modifiers []typeModifier - - // convertibleTo is a type our candidate type must be convertible to. - convertibleTo types.Type - - // typeName holds information about the expected type name at - // position, if any. - typeName typeNameInference -} - -// typeNameInference holds information about the expected type name at -// position. -type typeNameInference struct { - // wantTypeName is true if we expect the name of a type. - wantTypeName bool - - // modifiers are prefixes such as "*", "&" or "<-" that influence how - // a candidate type relates to the expected type. - modifiers []typeModifier - - // assertableFrom is a type that must be assertable to our candidate type. - assertableFrom types.Type - - // wantComparable is true if we want a comparable type. - wantComparable bool -} - -// expectedType returns information about the expected type for an expression at -// the query position. -func expectedType(c *completer) typeInference { - inf := typeInference{ - typeName: expectTypeName(c), - } - - if c.enclosingCompositeLiteral != nil { - inf.objType = c.expectedCompositeLiteralType() - return inf - } - -Nodes: - for i, node := range c.path { - switch node := node.(type) { - case *ast.BinaryExpr: - // Determine if query position comes from left or right of op. - e := node.X - if c.pos < node.OpPos { - e = node.Y - } - if tv, ok := c.pkg.GetTypesInfo().Types[e]; ok { - inf.objType = tv.Type - break Nodes - } - case *ast.AssignStmt: - // Only rank completions if you are on the right side of the token. - if c.pos > node.TokPos { - i := indexExprAtPos(c.pos, node.Rhs) - if i >= len(node.Lhs) { - i = len(node.Lhs) - 1 - } - if tv, ok := c.pkg.GetTypesInfo().Types[node.Lhs[i]]; ok { - inf.objType = tv.Type - break Nodes - } - } - return inf - case *ast.CallExpr: - // Only consider CallExpr args if position falls between parens. - if node.Lparen <= c.pos && c.pos <= node.Rparen { - // For type conversions like "int64(foo)" we can only infer our - // desired type is convertible to int64. - if typ := typeConversion(node, c.pkg.GetTypesInfo()); typ != nil { - inf.convertibleTo = typ - break Nodes - } - - if tv, ok := c.pkg.GetTypesInfo().Types[node.Fun]; ok { - if sig, ok := tv.Type.(*types.Signature); ok { - if sig.Params().Len() == 0 { - return inf - } - i := indexExprAtPos(c.pos, node.Args) - // Make sure not to run past the end of expected parameters. - if i >= sig.Params().Len() { - i = sig.Params().Len() - 1 - } - inf.objType = sig.Params().At(i).Type() - inf.variadic = sig.Variadic() && i == sig.Params().Len()-1 - break Nodes - } - } - } - return inf - case *ast.ReturnStmt: - if c.enclosingFunc != nil { - sig := c.enclosingFunc.sig - // Find signature result that corresponds to our return statement. - if resultIdx := indexExprAtPos(c.pos, node.Results); resultIdx < len(node.Results) { - if resultIdx < sig.Results().Len() { - inf.objType = sig.Results().At(resultIdx).Type() - break Nodes - } - } - } - return inf - case *ast.CaseClause: - if swtch, ok := findSwitchStmt(c.path[i+1:], c.pos, node).(*ast.SwitchStmt); ok { - if tv, ok := c.pkg.GetTypesInfo().Types[swtch.Tag]; ok { - inf.objType = tv.Type - break Nodes - } - } - return inf - case *ast.SliceExpr: - // Make sure position falls within the brackets (e.g. "foo[a:<>]"). - if node.Lbrack < c.pos && c.pos <= node.Rbrack { - inf.objType = types.Typ[types.Int] - break Nodes - } - return inf - case *ast.IndexExpr: - // Make sure position falls within the brackets (e.g. "foo[<>]"). - if node.Lbrack < c.pos && c.pos <= node.Rbrack { - if tv, ok := c.pkg.GetTypesInfo().Types[node.X]; ok { - switch t := tv.Type.Underlying().(type) { - case *types.Map: - inf.objType = t.Key() - case *types.Slice, *types.Array: - inf.objType = types.Typ[types.Int] - default: - return inf - } - break Nodes - } - } - return inf - case *ast.SendStmt: - // Make sure we are on right side of arrow (e.g. "foo <- <>"). - if c.pos > node.Arrow+1 { - if tv, ok := c.pkg.GetTypesInfo().Types[node.Chan]; ok { - if ch, ok := tv.Type.Underlying().(*types.Chan); ok { - inf.objType = ch.Elem() - break Nodes - } - } - } - return inf - case *ast.StarExpr: - inf.modifiers = append(inf.modifiers, typeModifier{mod: star}) - case *ast.UnaryExpr: - switch node.Op { - case token.AND: - inf.modifiers = append(inf.modifiers, typeModifier{mod: reference}) - case token.ARROW: - inf.modifiers = append(inf.modifiers, typeModifier{mod: chanRead}) - } - default: - if breaksExpectedTypeInference(node) { - return inf - } - } - } - - return inf -} - -// applyTypeModifiers applies the list of type modifiers to a type. -func (ti typeInference) applyTypeModifiers(typ types.Type) types.Type { - for _, mod := range ti.modifiers { - switch mod.mod { - case star: - // For every "*" deref operator, remove a pointer layer from candidate type. - typ = deref(typ) - case reference: - // For every "&" ref operator, add another pointer layer to candidate type. - typ = types.NewPointer(typ) - case chanRead: - // For every "<-" operator, remove a layer of channelness. - if ch, ok := typ.(*types.Chan); ok { - typ = ch.Elem() - } - } - } - return typ -} - -// applyTypeNameModifiers applies the list of type modifiers to a type name. -func (ti typeInference) applyTypeNameModifiers(typ types.Type) types.Type { - for _, mod := range ti.typeName.modifiers { - switch mod.mod { - case star: - // For every "*" indicator, add a pointer layer to type name. - typ = types.NewPointer(typ) - case array: - typ = types.NewArray(typ, mod.arrayLen) - case slice: - typ = types.NewSlice(typ) - } - } - return typ -} - -// findSwitchStmt returns an *ast.CaseClause's corresponding *ast.SwitchStmt or -// *ast.TypeSwitchStmt. path should start from the case clause's first ancestor. -func findSwitchStmt(path []ast.Node, pos token.Pos, c *ast.CaseClause) ast.Stmt { - // Make sure position falls within a "case <>:" clause. - if exprAtPos(pos, c.List) == nil { - return nil - } - // A case clause is always nested within a block statement in a switch statement. - if len(path) < 2 { - return nil - } - if _, ok := path[0].(*ast.BlockStmt); !ok { - return nil - } - switch s := path[1].(type) { - case *ast.SwitchStmt: - return s - case *ast.TypeSwitchStmt: - return s - default: - return nil - } -} - -// breaksExpectedTypeInference reports if an expression node's type is unrelated -// to its child expression node types. For example, "Foo{Bar: x.Baz(<>)}" should -// expect a function argument, not a composite literal value. -func breaksExpectedTypeInference(n ast.Node) bool { - switch n.(type) { - case *ast.FuncLit, *ast.CallExpr, *ast.TypeAssertExpr, *ast.IndexExpr, *ast.SliceExpr, *ast.CompositeLit: - return true - default: - return false - } -} - -// expectTypeName returns information about the expected type name at position. -func expectTypeName(c *completer) typeNameInference { - var ( - wantTypeName bool - wantComparable bool - modifiers []typeModifier - assertableFrom types.Type - ) - -Nodes: - for i, p := range c.path { - switch n := p.(type) { - case *ast.FieldList: - // Expect a type name if pos is in a FieldList. This applies to - // FuncType params/results, FuncDecl receiver, StructType, and - // InterfaceType. We don't need to worry about the field name - // because completion bails out early if pos is in an *ast.Ident - // that defines an object. - wantTypeName = true - break Nodes - case *ast.CaseClause: - // Expect type names in type switch case clauses. - if swtch, ok := findSwitchStmt(c.path[i+1:], c.pos, n).(*ast.TypeSwitchStmt); ok { - // The case clause types must be assertable from the type switch parameter. - ast.Inspect(swtch.Assign, func(n ast.Node) bool { - if ta, ok := n.(*ast.TypeAssertExpr); ok { - assertableFrom = c.pkg.GetTypesInfo().TypeOf(ta.X) - return false - } - return true - }) - wantTypeName = true - break Nodes - } - return typeNameInference{} - case *ast.TypeAssertExpr: - // Expect type names in type assert expressions. - if n.Lparen < c.pos && c.pos <= n.Rparen { - // The type in parens must be assertable from the expression type. - assertableFrom = c.pkg.GetTypesInfo().TypeOf(n.X) - wantTypeName = true - break Nodes - } - return typeNameInference{} - case *ast.StarExpr: - modifiers = append(modifiers, typeModifier{mod: star}) - case *ast.CompositeLit: - // We want a type name if position is in the "Type" part of a - // composite literal (e.g. "Foo<>{}"). - if n.Type != nil && n.Type.Pos() <= c.pos && c.pos <= n.Type.End() { - wantTypeName = true - } - break Nodes - case *ast.ArrayType: - // If we are inside the "Elt" part of an array type, we want a type name. - if n.Elt.Pos() <= c.pos && c.pos <= n.Elt.End() { - wantTypeName = true - if n.Len == nil { - // No "Len" expression means a slice type. - modifiers = append(modifiers, typeModifier{mod: slice}) - } else { - // Try to get the array type using the constant value of "Len". - tv, ok := c.pkg.GetTypesInfo().Types[n.Len] - if ok && tv.Value != nil && tv.Value.Kind() == constant.Int { - if arrayLen, ok := constant.Int64Val(tv.Value); ok { - modifiers = append(modifiers, typeModifier{mod: array, arrayLen: arrayLen}) - } - } - } - - // ArrayTypes can be nested, so keep going if our parent is an - // ArrayType. - if i < len(c.path)-1 { - if _, ok := c.path[i+1].(*ast.ArrayType); ok { - continue Nodes - } - } - - break Nodes - } - case *ast.MapType: - wantTypeName = true - if n.Key != nil { - wantComparable = n.Key.Pos() <= c.pos && c.pos <= n.Key.End() - } else { - // If the key is empty, assume we are completing the key if - // pos is directly after the "map[". - wantComparable = c.pos == n.Pos()+token.Pos(len("map[")) - } - break Nodes - default: - if breaksExpectedTypeInference(p) { - return typeNameInference{} - } - } - } - - return typeNameInference{ - wantTypeName: wantTypeName, - wantComparable: wantComparable, - modifiers: modifiers, - assertableFrom: assertableFrom, - } -} - -// matchingType reports whether a type matches the expected type. -func (c *completer) matchingType(T types.Type) bool { - fakeObj := types.NewVar(token.NoPos, c.pkg.GetTypes(), "", T) - return c.matchingCandidate(&candidate{obj: fakeObj}) -} - -// matchingCandidate reports whether a candidate matches our type -// inferences. -func (c *completer) matchingCandidate(cand *candidate) bool { - if isTypeName(cand.obj) { - return c.matchingTypeName(cand) - } else if c.wantTypeName() { - // If we want a type, a non-type object never matches. - return false - } - - objType := cand.obj.Type() - if objType == nil { - return true - } - - // Default to invoking *types.Func candidates. This is so function - // completions in an empty statement (or other cases with no expected type) - // are invoked by default. - cand.expandFuncCall = isFunc(cand.obj) - - typeMatches := func(candType types.Type) bool { - // Take into account any type modifiers on the expected type. - candType = c.expectedType.applyTypeModifiers(candType) - - if c.expectedType.objType != nil { - wantType := types.Default(c.expectedType.objType) - - // Handle untyped values specially since AssignableTo gives false negatives - // for them (see https://golang.org/issue/32146). - if candBasic, ok := candType.(*types.Basic); ok && candBasic.Info()&types.IsUntyped > 0 { - if wantBasic, ok := wantType.Underlying().(*types.Basic); ok { - // Check that their constant kind (bool|int|float|complex|string) matches. - // This doesn't take into account the constant value, so there will be some - // false positives due to integer sign and overflow. - if candBasic.Info()&types.IsConstType == wantBasic.Info()&types.IsConstType { - // Lower candidate score if the types are not identical. - // This avoids ranking untyped integer constants above - // candidates with an exact type match. - if !types.Identical(candType, c.expectedType.objType) { - cand.score /= 2 - } - return true - } - } - return false - } - - // AssignableTo covers the case where the types are equal, but also handles - // cases like assigning a concrete type to an interface type. - return types.AssignableTo(candType, wantType) - } - - return false - } - - if typeMatches(objType) { - // If obj's type matches, we don't want to expand to an invocation of obj. - cand.expandFuncCall = false - return true - } - - // Try using a function's return type as its type. - if sig, ok := objType.Underlying().(*types.Signature); ok && sig.Results().Len() == 1 { - if typeMatches(sig.Results().At(0).Type()) { - // If obj's return value matches the expected type, we need to invoke obj - // in the completion. - cand.expandFuncCall = true - return true - } - } - - if c.expectedType.convertibleTo != nil { - return types.ConvertibleTo(objType, c.expectedType.convertibleTo) - } - - return false -} - -func (c *completer) matchingTypeName(cand *candidate) bool { - if !c.wantTypeName() { - return false - } - - // Take into account any type name modifier prefixes. - actual := c.expectedType.applyTypeNameModifiers(cand.obj.Type()) - - if c.expectedType.typeName.assertableFrom != nil { - // Don't suggest the starting type in type assertions. For example, - // if "foo" is an io.Writer, don't suggest "foo.(io.Writer)". - if types.Identical(c.expectedType.typeName.assertableFrom, actual) { - return false - } - - if intf, ok := c.expectedType.typeName.assertableFrom.Underlying().(*types.Interface); ok { - if !types.AssertableTo(intf, actual) { - return false - } - } - } - - if c.expectedType.typeName.wantComparable && !types.Comparable(actual) { - return false - } - - // We can expect a type name and have an expected type in cases like: - // - // var foo []int - // foo = []i<> - // - // Where our expected type is "[]int", and we expect a type name. - if c.expectedType.objType != nil { - return types.AssignableTo(actual, c.expectedType.objType) - } - - // Default to saying any type name is a match. - return true -} diff --git a/vendor/golang.org/x/tools/internal/lsp/source/completion_format.go b/vendor/golang.org/x/tools/internal/lsp/source/completion_format.go deleted file mode 100644 index 000e664e2..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/source/completion_format.go +++ /dev/null @@ -1,283 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package source - -import ( - "bytes" - "context" - "fmt" - "go/ast" - "go/printer" - "go/types" - "strings" - - "golang.org/x/tools/internal/imports" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/snippet" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/telemetry/log" - "golang.org/x/tools/internal/telemetry/tag" - errors "golang.org/x/xerrors" -) - -// formatCompletion creates a completion item for a given candidate. -func (c *completer) item(cand candidate) (CompletionItem, error) { - obj := cand.obj - - // Handle builtin types separately. - if obj.Parent() == types.Universe { - return c.formatBuiltin(cand), nil - } - - var ( - label = cand.name - detail = types.TypeString(obj.Type(), c.qf) - insert = label - kind = protocol.TextCompletion - snip *snippet.Builder - protocolEdits []protocol.TextEdit - ) - if obj.Type() == nil { - detail = "" - } - - // expandFuncCall mutates the completion label, detail, and snippet - // to that of an invocation of sig. - expandFuncCall := func(sig *types.Signature) { - params := formatParams(sig.Params(), sig.Variadic(), c.qf) - snip = c.functionCallSnippet(label, params) - results, writeParens := formatResults(sig.Results(), c.qf) - detail = "func" + formatFunction(params, results, writeParens) - } - - switch obj := obj.(type) { - case *types.TypeName: - detail, kind = formatType(obj.Type(), c.qf) - case *types.Const: - kind = protocol.ConstantCompletion - case *types.Var: - if _, ok := obj.Type().(*types.Struct); ok { - detail = "struct{...}" // for anonymous structs - } - if obj.IsField() { - kind = protocol.FieldCompletion - snip = c.structFieldSnippet(label, detail) - } else { - kind = protocol.VariableCompletion - } - if obj.Type() == nil { - break - } - - if sig, ok := obj.Type().Underlying().(*types.Signature); ok && cand.expandFuncCall { - expandFuncCall(sig) - } - case *types.Func: - sig, ok := obj.Type().Underlying().(*types.Signature) - if !ok { - break - } - kind = protocol.FunctionCompletion - if sig != nil && sig.Recv() != nil { - kind = protocol.MethodCompletion - } - - if cand.expandFuncCall { - expandFuncCall(sig) - } - case *types.PkgName: - kind = protocol.ModuleCompletion - detail = fmt.Sprintf("%q", obj.Imported().Path()) - case *types.Label: - kind = protocol.ConstantCompletion - detail = "label" - } - - // If this candidate needs an additional import statement, - // add the additional text edits needed. - if cand.imp != nil { - addlEdits, err := c.importEdits(cand.imp) - if err != nil { - return CompletionItem{}, err - } - - protocolEdits = append(protocolEdits, addlEdits...) - if kind != protocol.ModuleCompletion { - if detail != "" { - detail += " " - } - detail += fmt.Sprintf("(from %q)", cand.imp.ImportPath) - } - } - - detail = strings.TrimPrefix(detail, "untyped ") - item := CompletionItem{ - Label: label, - InsertText: insert, - AdditionalTextEdits: protocolEdits, - Detail: detail, - Kind: kind, - Score: cand.score, - Depth: len(c.deepState.chain), - snippet: snip, - } - // If the user doesn't want documentation for completion items. - if !c.opts.Documentation { - return item, nil - } - pos := c.view.Session().Cache().FileSet().Position(obj.Pos()) - - // We ignore errors here, because some types, like "unsafe" or "error", - // may not have valid positions that we can use to get documentation. - if !pos.IsValid() { - return item, nil - } - uri := span.FileURI(pos.Filename) - ph, pkg, err := c.view.FindFileInPackage(c.ctx, uri, c.pkg) - if err != nil { - return CompletionItem{}, err - } - file, _, _, err := ph.Cached() - if err != nil { - return CompletionItem{}, err - } - if !(file.Pos() <= obj.Pos() && obj.Pos() <= file.End()) { - return CompletionItem{}, errors.Errorf("no file for %s", obj.Name()) - } - ident, err := findIdentifier(c.ctx, c.snapshot, pkg, file, obj.Pos()) - if err != nil { - return CompletionItem{}, err - } - hover, err := ident.Hover(c.ctx) - if err != nil { - return CompletionItem{}, err - } - item.Documentation = hover.Synopsis - if c.opts.FullDocumentation { - item.Documentation = hover.FullDocumentation - } - return item, nil -} - -// importEdits produces the text edits necessary to add the given import to the current file. -func (c *completer) importEdits(imp *imports.ImportInfo) ([]protocol.TextEdit, error) { - if imp == nil { - return nil, nil - } - - edit, err := addNamedImport(c.view.Session().Cache().FileSet(), c.file, imp.Name, imp.ImportPath) - if err != nil { - return nil, err - } - - return ToProtocolEdits(c.mapper, edit) -} - -func (c *completer) formatBuiltin(cand candidate) CompletionItem { - obj := cand.obj - item := CompletionItem{ - Label: obj.Name(), - InsertText: obj.Name(), - Score: cand.score, - } - switch obj.(type) { - case *types.Const: - item.Kind = protocol.ConstantCompletion - case *types.Builtin: - item.Kind = protocol.FunctionCompletion - builtin := c.view.BuiltinPackage().Lookup(obj.Name()) - if obj == nil { - break - } - decl, ok := builtin.Decl.(*ast.FuncDecl) - if !ok { - break - } - params, _ := formatFieldList(c.ctx, c.view, decl.Type.Params) - results, writeResultParens := formatFieldList(c.ctx, c.view, decl.Type.Results) - item.Label = obj.Name() - item.Detail = "func" + formatFunction(params, results, writeResultParens) - item.snippet = c.functionCallSnippet(obj.Name(), params) - case *types.TypeName: - if types.IsInterface(obj.Type()) { - item.Kind = protocol.InterfaceCompletion - } else { - item.Kind = protocol.ClassCompletion - } - case *types.Nil: - item.Kind = protocol.VariableCompletion - } - return item -} - -var replacer = strings.NewReplacer( - `ComplexType`, `complex128`, - `FloatType`, `float64`, - `IntegerType`, `int`, -) - -func formatFieldList(ctx context.Context, v View, list *ast.FieldList) ([]string, bool) { - if list == nil { - return nil, false - } - var writeResultParens bool - var result []string - for i := 0; i < len(list.List); i++ { - if i >= 1 { - writeResultParens = true - } - p := list.List[i] - cfg := printer.Config{Mode: printer.UseSpaces | printer.TabIndent, Tabwidth: 4} - b := &bytes.Buffer{} - if err := cfg.Fprint(b, v.Session().Cache().FileSet(), p.Type); err != nil { - log.Error(ctx, "unable to print type", nil, tag.Of("Type", p.Type)) - continue - } - typ := replacer.Replace(b.String()) - if len(p.Names) == 0 { - result = append(result, typ) - } - for _, name := range p.Names { - if name.Name != "" { - if i == 0 { - writeResultParens = true - } - result = append(result, fmt.Sprintf("%s %s", name.Name, typ)) - } else { - result = append(result, typ) - } - } - } - return result, writeResultParens -} - -// qualifier returns a function that appropriately formats a types.PkgName -// appearing in a *ast.File. -func qualifier(f *ast.File, pkg *types.Package, info *types.Info) types.Qualifier { - // Construct mapping of import paths to their defined or implicit names. - imports := make(map[*types.Package]string) - for _, imp := range f.Imports { - var obj types.Object - if imp.Name != nil { - obj = info.Defs[imp.Name] - } else { - - obj = info.Implicits[imp] - } - if pkgname, ok := obj.(*types.PkgName); ok { - imports[pkgname.Imported()] = pkgname.Name() - } - } - // Define qualifier to replace full package paths with names of the imports. - return func(p *types.Package) string { - if p == pkg { - return "" - } - if name, ok := imports[p]; ok { - return name - } - return p.Name() - } -} diff --git a/vendor/golang.org/x/tools/internal/lsp/source/completion_keywords.go b/vendor/golang.org/x/tools/internal/lsp/source/completion_keywords.go deleted file mode 100644 index ef787b750..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/source/completion_keywords.go +++ /dev/null @@ -1,105 +0,0 @@ -package source - -import ( - "go/ast" - - "golang.org/x/tools/internal/lsp/protocol" - - errors "golang.org/x/xerrors" -) - -const ( - BREAK = "break" - CASE = "case" - CHAN = "chan" - CONST = "const" - CONTINUE = "continue" - DEFAULT = "default" - DEFER = "defer" - ELSE = "else" - FALLTHROUGH = "fallthrough" - FOR = "for" - FUNC = "func" - GO = "go" - GOTO = "goto" - IF = "if" - IMPORT = "import" - INTERFACE = "interface" - MAP = "map" - PACKAGE = "package" - RANGE = "range" - RETURN = "return" - SELECT = "select" - STRUCT = "struct" - SWITCH = "switch" - TYPE = "type" - VAR = "var" -) - -// keyword looks at the current scope of an *ast.Ident and recommends keywords -func (c *completer) keyword() error { - if _, ok := c.path[0].(*ast.Ident); !ok { - // TODO(golang/go#34009): Support keyword completion in any context - return errors.Errorf("keywords are currently only recommended for identifiers") - } - // Track which keywords we've already determined are in a valid scope - // Use score to order keywords by how close we are to where they are useful - valid := make(map[string]float64) - - // only suggest keywords at the begnning of a statement - switch c.path[1].(type) { - case *ast.BlockStmt, *ast.CommClause, *ast.CaseClause, *ast.ExprStmt: - default: - return nil - } - - // Filter out keywords depending on scope - // Skip the first one because we want to look at the enclosing scopes - for _, n := range c.path[1:] { - switch node := n.(type) { - case *ast.CaseClause: - // only recommend "fallthrough" and "break" within the bodies of a case clause - if c.pos > node.Colon { - valid[BREAK] = stdScore - // TODO: "fallthrough" is only valid in switch statements - valid[FALLTHROUGH] = stdScore - } - case *ast.CommClause: - if c.pos > node.Colon { - valid[BREAK] = stdScore - } - case *ast.TypeSwitchStmt, *ast.SelectStmt, *ast.SwitchStmt: - valid[CASE] = stdScore + lowScore - valid[DEFAULT] = stdScore + lowScore - case *ast.ForStmt: - valid[BREAK] = stdScore - valid[CONTINUE] = stdScore - // This is a bit weak, functions allow for many keywords - case *ast.FuncDecl: - if node.Body != nil && c.pos > node.Body.Lbrace { - valid[DEFER] = stdScore - lowScore - valid[RETURN] = stdScore - lowScore - valid[FOR] = stdScore - lowScore - valid[GO] = stdScore - lowScore - valid[SWITCH] = stdScore - lowScore - valid[SELECT] = stdScore - lowScore - valid[IF] = stdScore - lowScore - valid[ELSE] = stdScore - lowScore - valid[VAR] = stdScore - lowScore - valid[CONST] = stdScore - lowScore - } - } - } - - for ident, score := range valid { - if c.matcher.Score(ident) > 0 { - c.items = append(c.items, CompletionItem{ - Label: ident, - Kind: protocol.KeywordCompletion, - InsertText: ident, - Score: score, - }) - } - } - return nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/source/completion_labels.go b/vendor/golang.org/x/tools/internal/lsp/source/completion_labels.go deleted file mode 100644 index e1314bb82..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/source/completion_labels.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package source - -import ( - "go/ast" - "go/token" -) - -type labelType int - -const ( - labelNone labelType = iota - labelBreak - labelContinue - labelGoto -) - -// wantLabelCompletion returns true if we want (only) label -// completions at the position. -func (c *completer) wantLabelCompletion() labelType { - if _, ok := c.path[0].(*ast.Ident); ok && len(c.path) > 1 { - // We want a label if we are an *ast.Ident child of a statement - // that accepts a label, e.g. "break Lo<>". - return takesLabel(c.path[1]) - } - - return labelNone -} - -// takesLabel returns the corresponding labelType if n is a statement -// that accepts a label, otherwise labelNone. -func takesLabel(n ast.Node) labelType { - if bs, ok := n.(*ast.BranchStmt); ok { - switch bs.Tok { - case token.BREAK: - return labelBreak - case token.CONTINUE: - return labelContinue - case token.GOTO: - return labelGoto - } - } - return labelNone -} - -// labels adds completion items for labels defined in the enclosing -// function. -func (c *completer) labels(lt labelType) { - if c.enclosingFunc == nil { - return - } - - addLabel := func(l *ast.LabeledStmt) { - labelObj := c.pkg.GetTypesInfo().ObjectOf(l.Label) - if labelObj != nil { - c.found(labelObj, highScore, nil) - } - } - - switch lt { - case labelBreak, labelContinue: - // "break" and "continue" only accept labels from enclosing statements. - - for _, p := range c.path { - switch p := p.(type) { - case *ast.FuncLit: - // Labels are function scoped, so don't continue out of functions. - return - case *ast.LabeledStmt: - switch p.Stmt.(type) { - case *ast.ForStmt, *ast.RangeStmt: - // Loop labels can be used for "break" or "continue". - addLabel(p) - case *ast.SwitchStmt, *ast.SelectStmt, *ast.TypeSwitchStmt: - // Switch and select labels can be used only for "break". - if lt == labelBreak { - addLabel(p) - } - } - } - } - case labelGoto: - // Goto accepts any label in the same function not in a nested - // block. It also doesn't take labels that would jump across - // variable definitions, but ignore that case for now. - ast.Inspect(c.enclosingFunc.body, func(n ast.Node) bool { - if n == nil { - return false - } - - switch n := n.(type) { - // Only search into block-like nodes enclosing our "goto". - // This prevents us from finding labels in nested blocks. - case *ast.BlockStmt, *ast.CommClause, *ast.CaseClause: - for _, p := range c.path { - if n == p { - return true - } - } - return false - case *ast.LabeledStmt: - addLabel(n) - } - - return true - }) - } -} diff --git a/vendor/golang.org/x/tools/internal/lsp/source/completion_literal.go b/vendor/golang.org/x/tools/internal/lsp/source/completion_literal.go deleted file mode 100644 index 110f9c695..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/source/completion_literal.go +++ /dev/null @@ -1,380 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package source - -import ( - "go/ast" - "go/token" - "go/types" - "strings" - "unicode" - - "golang.org/x/tools/internal/imports" - "golang.org/x/tools/internal/lsp/diff" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/snippet" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/telemetry/log" -) - -// literal generates composite literal, function literal, and make() -// completion items. -func (c *completer) literal(literalType types.Type, imp *imports.ImportInfo) { - if c.expectedType.objType == nil { - return - } - - // Don't provide literal candidates for variadic function arguments. - // For example, don't provide "[]interface{}{}" in "fmt.Print(<>)". - if c.expectedType.variadic { - return - } - - // Avoid literal candidates if the expected type is an empty - // interface. It isn't very useful to suggest a literal candidate of - // every possible type. - if isEmptyInterface(c.expectedType.objType) { - return - } - - // We handle unnamed literal completions explicitly before searching - // for candidates. Avoid named-type literal completions for - // unnamed-type expected type since that results in duplicate - // candidates. For example, in - // - // type mySlice []int - // var []int = <> - // - // don't offer "mySlice{}" since we have already added a candidate - // of "[]int{}". - if _, named := literalType.(*types.Named); named { - if _, named := deref(c.expectedType.objType).(*types.Named); !named { - return - } - } - - // Check if an object of type literalType or *literalType would - // match our expected type. - if !c.matchingType(literalType) { - literalType = types.NewPointer(literalType) - - if !c.matchingType(literalType) { - return - } - } - - ptr, isPointer := literalType.(*types.Pointer) - if isPointer { - literalType = ptr.Elem() - } - - var ( - qf = c.qf - sel = enclosingSelector(c.path, c.pos) - ) - - // Don't qualify the type name if we are in a selector expression - // since the package name is already present. - if sel != nil { - qf = func(_ *types.Package) string { return "" } - } - - typeName := types.TypeString(literalType, qf) - - // A type name of "[]int" doesn't work very will with the matcher - // since "[" isn't a valid identifier prefix. Here we strip off the - // slice (and array) prefix yielding just "int". - matchName := typeName - switch t := literalType.(type) { - case *types.Slice: - matchName = types.TypeString(t.Elem(), qf) - case *types.Array: - matchName = types.TypeString(t.Elem(), qf) - } - - addlEdits, err := c.importEdits(imp) - if err != nil { - log.Error(c.ctx, "error adding import for literal candidate", err) - return - } - - // If prefix matches the type name, client may want a composite literal. - if score := c.matcher.Score(matchName); score >= 0 { - if isPointer { - if sel != nil { - // If we are in a selector we must place the "&" before the selector. - // For example, "foo.B<>" must complete to "&foo.Bar{}", not - // "foo.&Bar{}". - edits, err := referenceEdit(c.view.Session().Cache().FileSet(), c.mapper, sel) - if err != nil { - log.Error(c.ctx, "error making edit for literal pointer completion", err) - return - } - addlEdits = append(addlEdits, edits...) - } else { - // Otherwise we can stick the "&" directly before the type name. - typeName = "&" + typeName - } - } - - switch t := literalType.Underlying().(type) { - case *types.Struct, *types.Array, *types.Slice, *types.Map: - c.compositeLiteral(t, typeName, float64(score), addlEdits) - case *types.Basic: - // Add a literal completion for basic types that implement our - // expected interface (e.g. named string type http.Dir - // implements http.FileSystem). - if isInterface(c.expectedType.objType) { - c.basicLiteral(t, typeName, float64(score), addlEdits) - } - } - } - - // If prefix matches "make", client may want a "make()" - // invocation. We also include the type name to allow for more - // flexible fuzzy matching. - if score := c.matcher.Score("make." + matchName); !isPointer && score >= 0 { - switch literalType.Underlying().(type) { - case *types.Slice: - // The second argument to "make()" for slices is required, so default to "0". - c.makeCall(typeName, "0", float64(score), addlEdits) - case *types.Map, *types.Chan: - // Maps and channels don't require the second argument, so omit - // to keep things simple for now. - c.makeCall(typeName, "", float64(score), addlEdits) - } - } - - // If prefix matches "func", client may want a function literal. - if score := c.matcher.Score("func"); !isPointer && score >= 0 { - switch t := literalType.Underlying().(type) { - case *types.Signature: - c.functionLiteral(t, float64(score)) - } - } -} - -// referenceEdit produces text edits that prepend a "&" operator to the -// specified node. -func referenceEdit(fset *token.FileSet, m *protocol.ColumnMapper, node ast.Node) ([]protocol.TextEdit, error) { - rng := span.Range{ - FileSet: fset, - Start: node.Pos(), - End: node.Pos(), - } - spn, err := rng.Span() - if err != nil { - return nil, err - } - return ToProtocolEdits(m, []diff.TextEdit{{ - Span: spn, - NewText: "&", - }}) -} - -// literalCandidateScore is the base score for literal candidates. -// Literal candidates match the expected type so they should be high -// scoring, but we want them ranked below lexical objects of the -// correct type, so scale down highScore. -const literalCandidateScore = highScore / 2 - -// functionLiteral adds a function literal completion item for the -// given signature. -func (c *completer) functionLiteral(sig *types.Signature, matchScore float64) { - snip := &snippet.Builder{} - snip.WriteText("func(") - seenParamNames := make(map[string]bool) - for i := 0; i < sig.Params().Len(); i++ { - if i > 0 { - snip.WriteText(", ") - } - - p := sig.Params().At(i) - name := p.Name() - - // If the parameter has no name in the signature, we need to try - // come up with a parameter name. - if name == "" { - // Our parameter names are guesses, so they must be placeholders - // for easy correction. If placeholders are disabled, don't - // offer the completion. - if !c.opts.Placeholders { - return - } - - // Try abbreviating named types. If the type isn't named, or the - // abbreviation duplicates a previous name, give up and use - // "_". The user will have to provide a name for this parameter - // in order to use it. - if named, ok := deref(p.Type()).(*types.Named); ok { - name = abbreviateCamel(named.Obj().Name()) - if seenParamNames[name] { - name = "_" - } else { - seenParamNames[name] = true - } - } else { - name = "_" - } - snip.WritePlaceholder(func(b *snippet.Builder) { - b.WriteText(name) - }) - } else { - snip.WriteText(name) - } - - // If the following param's type is identical to this one, omit - // this param's type string. For example, emit "i, j int" instead - // of "i int, j int". - if i == sig.Params().Len()-1 || !types.Identical(p.Type(), sig.Params().At(i+1).Type()) { - snip.WriteText(" ") - typeStr := types.TypeString(p.Type(), c.qf) - if sig.Variadic() && i == sig.Params().Len()-1 { - typeStr = strings.Replace(typeStr, "[]", "...", 1) - } - snip.WriteText(typeStr) - } - } - snip.WriteText(")") - - results := sig.Results() - if results.Len() > 0 { - snip.WriteText(" ") - } - - resultsNeedParens := results.Len() > 1 || - results.Len() == 1 && results.At(0).Name() != "" - - if resultsNeedParens { - snip.WriteText("(") - } - for i := 0; i < results.Len(); i++ { - if i > 0 { - snip.WriteText(", ") - } - r := results.At(i) - if name := r.Name(); name != "" { - snip.WriteText(name + " ") - } - snip.WriteText(types.TypeString(r.Type(), c.qf)) - } - if resultsNeedParens { - snip.WriteText(")") - } - - snip.WriteText(" {") - snip.WriteFinalTabstop() - snip.WriteText("}") - - c.items = append(c.items, CompletionItem{ - Label: "func(...) {}", - Score: matchScore * literalCandidateScore, - Kind: protocol.VariableCompletion, - snippet: snip, - }) -} - -// abbreviateCamel abbreviates camel case identifiers into -// abbreviations. For example, "fooBar" is abbreviated "fb". -func abbreviateCamel(s string) string { - var ( - b strings.Builder - useNextUpper bool - ) - for i, r := range s { - if i == 0 { - b.WriteRune(unicode.ToLower(r)) - } - - if unicode.IsUpper(r) { - if useNextUpper { - b.WriteRune(unicode.ToLower(r)) - useNextUpper = false - } - } else { - useNextUpper = true - } - } - - return b.String() -} - -// compositeLiteral adds a composite literal completion item for the given typeName. -func (c *completer) compositeLiteral(T types.Type, typeName string, matchScore float64, edits []protocol.TextEdit) { - snip := &snippet.Builder{} - snip.WriteText(typeName + "{") - // Don't put the tab stop inside the composite literal curlies "{}" - // for structs that have no fields. - if strct, ok := T.(*types.Struct); !ok || strct.NumFields() > 0 { - snip.WriteFinalTabstop() - } - snip.WriteText("}") - - nonSnippet := typeName + "{}" - - c.items = append(c.items, CompletionItem{ - Label: nonSnippet, - InsertText: nonSnippet, - Score: matchScore * literalCandidateScore, - Kind: protocol.VariableCompletion, - AdditionalTextEdits: edits, - snippet: snip, - }) -} - -// basicLiteral adds a literal completion item for the given basic -// type name typeName. -func (c *completer) basicLiteral(T types.Type, typeName string, matchScore float64, edits []protocol.TextEdit) { - snip := &snippet.Builder{} - snip.WriteText(typeName + "(") - snip.WriteFinalTabstop() - snip.WriteText(")") - - nonSnippet := typeName + "()" - - c.items = append(c.items, CompletionItem{ - Label: nonSnippet, - InsertText: nonSnippet, - Detail: T.String(), - Score: matchScore * literalCandidateScore, - Kind: protocol.VariableCompletion, - AdditionalTextEdits: edits, - snippet: snip, - }) -} - -// makeCall adds a completion item for a "make()" call given a specific type. -func (c *completer) makeCall(typeName string, secondArg string, matchScore float64, edits []protocol.TextEdit) { - // Keep it simple and don't add any placeholders for optional "make()" arguments. - - snip := &snippet.Builder{} - snip.WriteText("make(" + typeName) - if secondArg != "" { - snip.WriteText(", ") - snip.WritePlaceholder(func(b *snippet.Builder) { - if c.opts.Placeholders { - b.WriteText(secondArg) - } - }) - } - snip.WriteText(")") - - var nonSnippet strings.Builder - nonSnippet.WriteString("make(" + typeName) - if secondArg != "" { - nonSnippet.WriteString(", ") - nonSnippet.WriteString(secondArg) - } - nonSnippet.WriteByte(')') - - c.items = append(c.items, CompletionItem{ - Label: nonSnippet.String(), - InsertText: nonSnippet.String(), - Score: matchScore * literalCandidateScore, - Kind: protocol.FunctionCompletion, - AdditionalTextEdits: edits, - snippet: snip, - }) -} diff --git a/vendor/golang.org/x/tools/internal/lsp/source/completion_snippet.go b/vendor/golang.org/x/tools/internal/lsp/source/completion_snippet.go deleted file mode 100644 index 74f635a5a..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/source/completion_snippet.go +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package source - -import ( - "go/ast" - - "golang.org/x/tools/internal/lsp/snippet" -) - -// structFieldSnippets calculates the snippet for struct literal field names. -func (c *completer) structFieldSnippet(label, detail string) *snippet.Builder { - if !c.wantStructFieldCompletions() { - return nil - } - - // If we are in a deep completion then we can't be completing a field - // name (e.g. "Foo{f<>}" completing to "Foo{f.Bar}" should not generate - // a snippet). - if c.inDeepCompletion() { - return nil - } - - clInfo := c.enclosingCompositeLiteral - - // If we are already in a key-value expression, we don't want a snippet. - if clInfo.kv != nil { - return nil - } - - snip := &snippet.Builder{} - - // A plain snippet turns "Foo{Ba<>" into "Foo{Bar: <>". - snip.WriteText(label + ": ") - snip.WritePlaceholder(func(b *snippet.Builder) { - // A placeholder snippet turns "Foo{Ba<>" into "Foo{Bar: <*int*>". - if c.opts.Placeholders { - b.WriteText(detail) - } - }) - - fset := c.view.Session().Cache().FileSet() - - // If the cursor position is on a different line from the literal's opening brace, - // we are in a multiline literal. - if fset.Position(c.pos).Line != fset.Position(clInfo.cl.Lbrace).Line { - snip.WriteText(",") - } - - return snip -} - -// functionCallSnippets calculates the snippet for function calls. -func (c *completer) functionCallSnippet(name string, params []string) *snippet.Builder { - // If there is no suffix then we need to reuse existing call parens - // "()" if present. If there is an identifer suffix then we always - // need to include "()" since we don't overwrite the suffix. - if c.surrounding != nil && c.surrounding.Suffix() == "" && len(c.path) > 1 { - // If we are the left side (i.e. "Fun") part of a call expression, - // we don't want a snippet since there are already parens present. - switch n := c.path[1].(type) { - case *ast.CallExpr: - // The Lparen != Rparen check detects fudged CallExprs we - // inserted when fixing the AST. In this case, we do still need - // to insert the calling "()" parens. - if n.Fun == c.path[0] && n.Lparen != n.Rparen { - return nil - } - case *ast.SelectorExpr: - if len(c.path) > 2 { - if call, ok := c.path[2].(*ast.CallExpr); ok && call.Fun == c.path[1] && call.Lparen != call.Rparen { - return nil - } - } - } - } - snip := &snippet.Builder{} - snip.WriteText(name + "(") - - if c.opts.Placeholders { - // A placeholder snippet turns "someFun<>" into "someFunc(<*i int*>, *s string*)". - for i, p := range params { - if i > 0 { - snip.WriteText(", ") - } - snip.WritePlaceholder(func(b *snippet.Builder) { - b.WriteText(p) - }) - } - } else { - // A plain snippet turns "someFun<>" into "someFunc(<>)". - if len(params) > 0 { - snip.WritePlaceholder(nil) - } - } - - snip.WriteText(")") - - return snip -} diff --git a/vendor/golang.org/x/tools/internal/lsp/source/deep_completion.go b/vendor/golang.org/x/tools/internal/lsp/source/deep_completion.go deleted file mode 100644 index eddacac75..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/source/deep_completion.go +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package source - -import ( - "go/types" - "strings" - "time" - - "golang.org/x/tools/internal/imports" -) - -// Limit deep completion results because in most cases there are too many -// to be useful. -const MaxDeepCompletions = 3 - -// deepCompletionState stores our state as we search for deep completions. -// "deep completion" refers to searching into objects' fields and methods to -// find more completion candidates. -type deepCompletionState struct { - // maxDepth limits the deep completion search depth. 0 means - // disabled and -1 means unlimited. - maxDepth int - - // chain holds the traversal path as we do a depth-first search through - // objects' members looking for exact type matches. - chain []types.Object - - // chainNames holds the names of the chain objects. This allows us to - // save allocations as we build many deep completion items. - chainNames []string - - // highScores tracks the highest deep candidate scores we have found - // so far. This is used to avoid work for low scoring deep candidates. - highScores [MaxDeepCompletions]float64 - - // candidateCount is the count of unique deep candidates encountered - // so far. - candidateCount int -} - -// push pushes obj onto our search stack. If invoke is true then -// invocation parens "()" will be appended to the object name. -func (s *deepCompletionState) push(obj types.Object, invoke bool) { - s.chain = append(s.chain, obj) - - name := obj.Name() - if invoke { - name += "()" - } - s.chainNames = append(s.chainNames, name) -} - -// pop pops the last object off our search stack. -func (s *deepCompletionState) pop() { - s.chain = s.chain[:len(s.chain)-1] - s.chainNames = s.chainNames[:len(s.chainNames)-1] -} - -// chainString joins the chain of objects' names together on ".". -func (s *deepCompletionState) chainString(finalName string) string { - s.chainNames = append(s.chainNames, finalName) - chainStr := strings.Join(s.chainNames, ".") - s.chainNames = s.chainNames[:len(s.chainNames)-1] - return chainStr -} - -// isHighScore returns whether score is among the top MaxDeepCompletions -// deep candidate scores encountered so far. If so, it adds score to -// highScores, possibly displacing an existing high score. -func (s *deepCompletionState) isHighScore(score float64) bool { - // Invariant: s.highScores is sorted with highest score first. Unclaimed - // positions are trailing zeros. - - // First check for an unclaimed spot and claim if available. - for i, deepScore := range s.highScores { - if deepScore == 0 { - s.highScores[i] = score - return true - } - } - - // Otherwise, if we beat an existing score then take its spot and scoot - // all lower scores down one position. - for i, deepScore := range s.highScores { - if score > deepScore { - copy(s.highScores[i+1:], s.highScores[i:]) - s.highScores[i] = score - return true - } - } - - return false -} - -func (c *completer) inDeepCompletion() bool { - return len(c.deepState.chain) > 0 -} - -// shouldPrune returns whether we should prune the current deep -// candidate search to reduce the overall search scope. The -// maximum search depth is reduced gradually as we use up our -// completionBudget. -func (c *completer) shouldPrune() bool { - if !c.inDeepCompletion() { - return false - } - - // Check our remaining budget every 100 candidates. - if c.opts.Budget > 0 && c.deepState.candidateCount%100 == 0 { - spent := float64(time.Since(c.startTime)) / float64(c.opts.Budget) - - switch { - case spent >= 0.90: - // We are close to exhausting our budget. Disable deep completions. - c.deepState.maxDepth = 0 - case spent >= 0.75: - // We are running out of budget, reduce max depth again. - c.deepState.maxDepth = 2 - case spent >= 0.5: - // We have used half our budget, reduce max depth again. - c.deepState.maxDepth = 3 - case spent >= 0.25: - // We have used a good chunk of our budget, so start limiting our search. - // By default the search depth is unlimited, so this limit, while still - // generous, is normally a huge reduction in search scope that will result - // in our search completing very soon. - c.deepState.maxDepth = 4 - } - } - - c.deepState.candidateCount++ - - if c.deepState.maxDepth >= 0 { - return len(c.deepState.chain) >= c.deepState.maxDepth - } - - return false -} - -// deepSearch searches through obj's subordinate objects for more -// completion items. -func (c *completer) deepSearch(obj types.Object, imp *imports.ImportInfo) { - if c.deepState.maxDepth == 0 { - return - } - - // If we are definitely completing a struct field name, deep completions - // don't make sense. - if c.wantStructFieldCompletions() && c.enclosingCompositeLiteral.inKey { - return - } - - // Don't search into type names. - if isTypeName(obj) { - return - } - - if obj.Type() == nil { - return - } - - // Don't search embedded fields because they were already included in their - // parent's fields. - if v, ok := obj.(*types.Var); ok && v.Embedded() { - return - } - - if sig, ok := obj.Type().Underlying().(*types.Signature); ok { - // If obj is a function that takes no arguments and returns one - // value, keep searching across the function call. - if sig.Params().Len() == 0 && sig.Results().Len() == 1 { - // Pass invoke=true since the function needs to be invoked in - // the deep chain. - c.deepState.push(obj, true) - // The result of a function call is not addressable. - c.methodsAndFields(sig.Results().At(0).Type(), false, imp) - c.deepState.pop() - } - } - - // Push this object onto our search stack. - c.deepState.push(obj, false) - - switch obj := obj.(type) { - case *types.PkgName: - c.packageMembers(obj.Imported(), imp) - default: - // For now it is okay to assume obj is addressable since we don't search beyond - // function calls. - c.methodsAndFields(obj.Type(), true, imp) - } - - // Pop the object off our search stack. - c.deepState.pop() -} diff --git a/vendor/golang.org/x/tools/internal/lsp/source/diagnostics.go b/vendor/golang.org/x/tools/internal/lsp/source/diagnostics.go deleted file mode 100644 index fe4d38a43..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/source/diagnostics.go +++ /dev/null @@ -1,240 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package source - -import ( - "context" - "fmt" - - "golang.org/x/tools/go/analysis" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/telemetry" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/telemetry/log" - "golang.org/x/tools/internal/telemetry/trace" -) - -type Diagnostic struct { - URI span.URI - Range protocol.Range - Message string - Source string - Severity protocol.DiagnosticSeverity - Tags []protocol.DiagnosticTag - - SuggestedFixes []SuggestedFix - Related []RelatedInformation -} - -type SuggestedFix struct { - Title string - Edits map[span.URI][]protocol.TextEdit -} - -type RelatedInformation struct { - URI span.URI - Range protocol.Range - Message string -} - -func Diagnostics(ctx context.Context, view View, f File, disabledAnalyses map[string]struct{}) (map[span.URI][]Diagnostic, string, error) { - ctx, done := trace.StartSpan(ctx, "source.Diagnostics", telemetry.File.Of(f.URI())) - defer done() - - snapshot, cphs, err := view.CheckPackageHandles(ctx, f) - if err != nil { - return nil, "", err - } - cph, err := WidestCheckPackageHandle(cphs) - if err != nil { - return nil, "", err - } - - // If we are missing dependencies, it may because the user's workspace is - // not correctly configured. Report errors, if possible. - var warningMsg string - if len(cph.MissingDependencies()) > 0 { - warningMsg, err = checkCommonErrors(ctx, view, f.URI()) - if err != nil { - log.Error(ctx, "error checking common errors", err, telemetry.File.Of(f.URI)) - } - } - pkg, err := cph.Check(ctx) - if err != nil { - log.Error(ctx, "no package for file", err) - return singleDiagnostic(f.URI(), "%s is not part of a package", f.URI()), "", nil - } - - // Prepare the reports we will send for the files in this package. - reports := make(map[span.URI][]Diagnostic) - for _, fh := range pkg.Files() { - clearReports(view, reports, fh.File().Identity().URI) - } - - // Prepare any additional reports for the errors in this package. - for _, err := range pkg.GetErrors() { - if err.Kind != ListError { - continue - } - clearReports(view, reports, err.URI) - } - - // Run diagnostics for the package that this URI belongs to. - if !diagnostics(ctx, view, pkg, reports) { - // If we don't have any list, parse, or type errors, run analyses. - if err := analyses(ctx, snapshot, cph, disabledAnalyses, reports); err != nil { - log.Error(ctx, "failed to run analyses", err, telemetry.File.Of(f.URI())) - } - } - // Updates to the diagnostics for this package may need to be propagated. - revDeps := view.GetActiveReverseDeps(ctx, f) - for _, cph := range revDeps { - pkg, err := cph.Check(ctx) - if err != nil { - return nil, warningMsg, err - } - for _, fh := range pkg.Files() { - clearReports(view, reports, fh.File().Identity().URI) - } - diagnostics(ctx, view, pkg, reports) - } - return reports, warningMsg, nil -} - -type diagnosticSet struct { - listErrors, parseErrors, typeErrors []*Diagnostic -} - -func diagnostics(ctx context.Context, view View, pkg Package, reports map[span.URI][]Diagnostic) bool { - ctx, done := trace.StartSpan(ctx, "source.diagnostics", telemetry.Package.Of(pkg.ID())) - defer done() - - diagSets := make(map[span.URI]*diagnosticSet) - for _, err := range pkg.GetErrors() { - diag := &Diagnostic{ - URI: err.URI, - Message: err.Message, - Range: err.Range, - Severity: protocol.SeverityError, - } - set, ok := diagSets[diag.URI] - if !ok { - set = &diagnosticSet{} - diagSets[diag.URI] = set - } - switch err.Kind { - case ParseError: - set.parseErrors = append(set.parseErrors, diag) - diag.Source = "syntax" - case TypeError: - set.typeErrors = append(set.typeErrors, diag) - diag.Source = "compiler" - case ListError: - set.listErrors = append(set.listErrors, diag) - diag.Source = "go list" - } - } - var nonEmptyDiagnostics bool // track if we actually send non-empty diagnostics - for uri, set := range diagSets { - // Don't report type errors if there are parse errors or list errors. - diags := set.typeErrors - if len(set.parseErrors) > 0 { - diags = set.parseErrors - } else if len(set.listErrors) > 0 { - diags = set.listErrors - } - if len(diags) > 0 { - nonEmptyDiagnostics = true - } - for _, diag := range diags { - if _, ok := reports[uri]; ok { - reports[uri] = append(reports[uri], *diag) - } - } - } - return nonEmptyDiagnostics -} - -func analyses(ctx context.Context, snapshot Snapshot, cph CheckPackageHandle, disabledAnalyses map[string]struct{}, reports map[span.URI][]Diagnostic) error { - var analyzers []*analysis.Analyzer - for _, a := range snapshot.View().Options().Analyzers { - if _, ok := disabledAnalyses[a.Name]; ok { - continue - } - analyzers = append(analyzers, a) - } - - diagnostics, err := snapshot.Analyze(ctx, cph.ID(), analyzers) - if err != nil { - return err - } - - // Report diagnostics and errors from root analyzers. - for _, e := range diagnostics { - // This is a bit of a hack, but clients > 3.15 will be able to grey out unnecessary code. - // If we are deleting code as part of all of our suggested fixes, assume that this is dead code. - // TODO(golang/go/#34508): Return these codes from the diagnostics themselves. - var tags []protocol.DiagnosticTag - if onlyDeletions(e.SuggestedFixes) { - tags = append(tags, protocol.Unnecessary) - } - addReport(snapshot.View(), reports, Diagnostic{ - URI: e.URI, - Range: e.Range, - Message: e.Message, - Source: e.Category, - Severity: protocol.SeverityWarning, - Tags: tags, - SuggestedFixes: e.SuggestedFixes, - Related: e.Related, - }) - } - return nil -} - -func clearReports(v View, reports map[span.URI][]Diagnostic, uri span.URI) { - if v.Ignore(uri) { - return - } - reports[uri] = []Diagnostic{} -} - -func addReport(v View, reports map[span.URI][]Diagnostic, diagnostic Diagnostic) { - if v.Ignore(diagnostic.URI) { - return - } - if _, ok := reports[diagnostic.URI]; ok { - reports[diagnostic.URI] = append(reports[diagnostic.URI], diagnostic) - } -} - -func singleDiagnostic(uri span.URI, format string, a ...interface{}) map[span.URI][]Diagnostic { - return map[span.URI][]Diagnostic{ - uri: []Diagnostic{{ - Source: "LSP", - URI: uri, - Range: protocol.Range{}, - Message: fmt.Sprintf(format, a...), - Severity: protocol.SeverityError, - }}, - } -} - -// onlyDeletions returns true if all of the suggested fixes are deletions. -func onlyDeletions(fixes []SuggestedFix) bool { - for _, fix := range fixes { - for _, edits := range fix.Edits { - for _, edit := range edits { - if edit.NewText != "" { - return false - } - if protocol.ComparePosition(edit.Range.Start, edit.Range.End) == 0 { - return false - } - } - } - } - return true -} diff --git a/vendor/golang.org/x/tools/internal/lsp/source/errors.go b/vendor/golang.org/x/tools/internal/lsp/source/errors.go deleted file mode 100644 index 634e28756..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/source/errors.go +++ /dev/null @@ -1,99 +0,0 @@ -package source - -import ( - "bytes" - "context" - "fmt" - "os" - "os/exec" - "path/filepath" - "strings" - - "golang.org/x/tools/internal/span" -) - -const ( - // TODO(rstambler): We should really be able to point to a link on the website. - modulesWiki = "https://github.com/golang/go/wiki/Modules" -) - -func checkCommonErrors(ctx context.Context, view View, uri span.URI) (string, error) { - // Unfortunately, we probably can't have go/packages expose a function like this. - // Since we only really understand the `go` command, check the user's GOPACKAGESDRIVER - // and, if they are using `go list`, consider the possible error cases. - gopackagesdriver := os.Getenv("GOPACKAGESDRIVER") - if gopackagesdriver != "" && gopackagesdriver != "off" { - return "", nil - } - - // Some cases we should be able to detect: - // - // 1. The user is in GOPATH mode and is working outside their GOPATH - // 2. The user is in module mode and has opened a subdirectory of their module - // - gopath := os.Getenv("GOPATH") - cfg := view.Config(ctx) - - // Invoke `go env GOMOD` inside of the directory of the file. - fdir := filepath.Dir(uri.Filename()) - b, err := invokeGo(ctx, fdir, cfg.Env, "env", "GOMOD") - if err != nil { - return "", err - } - modFile := strings.TrimSpace(b.String()) - if modFile == filepath.FromSlash("/dev/null") { - modFile = "" - } - - // Not inside of a module. - inAModule := modFile != "" - inGopath := strings.HasPrefix(uri.Filename(), filepath.Join(gopath, "src")) - moduleMode := os.Getenv("GO111MODULE") - - var msg string - // The user is in a module. - if inAModule { - // The workspace root is open to a directory different from the module root. - if modRoot := filepath.Dir(modFile); cfg.Dir != filepath.Dir(modFile) { - msg = fmt.Sprintf("Your workspace root is %s, but your module root is %s. Please add %s as a workspace folder.", cfg.Dir, modRoot, modRoot) - } - } else if inGopath { - if moduleMode == "on" { - msg = "You are in module mode, but you are not inside of a module. Please create a module." - } - } else { - msg = fmt.Sprintf("You are neither in a module nor in your GOPATH. Please see %s for information on how to set up your Go project.", modulesWiki) - } - return msg, nil -} - -// invokeGo returns the stdout of a go command invocation. -// Borrowed from golang.org/x/tools/go/packages/golist.go. -func invokeGo(ctx context.Context, dir string, env []string, args ...string) (*bytes.Buffer, error) { - stdout := new(bytes.Buffer) - stderr := new(bytes.Buffer) - cmd := exec.CommandContext(ctx, "go", args...) - // On darwin the cwd gets resolved to the real path, which breaks anything that - // expects the working directory to keep the original path, including the - // go command when dealing with modules. - // The Go stdlib has a special feature where if the cwd and the PWD are the - // same node then it trusts the PWD, so by setting it in the env for the child - // process we fix up all the paths returned by the go command. - cmd.Env = append(append([]string{}, env...), "PWD="+dir) - cmd.Dir = dir - cmd.Stdout = stdout - cmd.Stderr = stderr - - if err := cmd.Run(); err != nil { - // Check for 'go' executable not being found. - if ee, ok := err.(*exec.Error); ok && ee.Err == exec.ErrNotFound { - return nil, fmt.Errorf("'gopls requires 'go', but %s", exec.ErrNotFound) - } - if _, ok := err.(*exec.ExitError); !ok { - // Catastrophic error: - // - context cancellation - return nil, fmt.Errorf("couldn't exec 'go %v': %s %T", args, err, err) - } - } - return stdout, nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/source/folding_range.go b/vendor/golang.org/x/tools/internal/lsp/source/folding_range.go deleted file mode 100644 index e944e9b6d..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/source/folding_range.go +++ /dev/null @@ -1,202 +0,0 @@ -package source - -import ( - "context" - "go/ast" - "go/token" - "sort" - - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/span" -) - -type FoldingRangeInfo struct { - mappedRange - Kind protocol.FoldingRangeKind -} - -// FoldingRange gets all of the folding range for f. -func FoldingRange(ctx context.Context, view View, f File, lineFoldingOnly bool) (ranges []*FoldingRangeInfo, err error) { - // TODO(suzmue): consider limiting the number of folding ranges returned, and - // implement a way to prioritize folding ranges in that case. - s := view.Snapshot() - fh := s.Handle(ctx, f) - ph := view.Session().Cache().ParseGoHandle(fh, ParseFull) - file, m, _, err := ph.Parse(ctx) - if err != nil { - return nil, err - } - - // Get folding ranges for comments separately as they are not walked by ast.Inspect. - ranges = append(ranges, commentsFoldingRange(view, m, file)...) - - foldingFunc := foldingRange - if lineFoldingOnly { - foldingFunc = lineFoldingRange - } - - visit := func(n ast.Node) bool { - rng := foldingFunc(view, m, n) - if rng != nil { - ranges = append(ranges, rng) - } - return true - } - // Walk the ast and collect folding ranges. - ast.Inspect(file, visit) - - sort.Slice(ranges, func(i, j int) bool { - irng, _ := ranges[i].Range() - jrng, _ := ranges[j].Range() - return protocol.CompareRange(irng, jrng) < 0 - }) - - return ranges, nil -} - -// foldingRange calculates the folding range for n. -func foldingRange(view View, m *protocol.ColumnMapper, n ast.Node) *FoldingRangeInfo { - var kind protocol.FoldingRangeKind - var start, end token.Pos - switch n := n.(type) { - case *ast.BlockStmt: - // Fold from position of "{" to position of "}". - start, end = n.Lbrace+1, n.Rbrace - case *ast.CaseClause: - // Fold from position of ":" to end. - start, end = n.Colon+1, n.End() - case *ast.CallExpr: - // Fold from position of "(" to position of ")". - start, end = n.Lparen+1, n.Rparen - case *ast.FieldList: - // Fold from position of opening parenthesis/brace, to position of - // closing parenthesis/brace. - start, end = n.Opening+1, n.Closing - case *ast.GenDecl: - // If this is an import declaration, set the kind to be protocol.Imports. - if n.Tok == token.IMPORT { - kind = protocol.Imports - } - start, end = n.Lparen+1, n.Rparen - } - if !start.IsValid() || !end.IsValid() { - return nil - } - return &FoldingRangeInfo{ - mappedRange: mappedRange{ - m: m, - spanRange: span.NewRange(view.Session().Cache().FileSet(), start, end), - }, - Kind: kind, - } -} - -// lineFoldingRange calculates the line folding range for n. -func lineFoldingRange(view View, m *protocol.ColumnMapper, n ast.Node) *FoldingRangeInfo { - fset := view.Session().Cache().FileSet() - - // TODO(suzmue): include trailing empty lines before the closing - // parenthesis/brace. - var kind protocol.FoldingRangeKind - var start, end token.Pos - switch n := n.(type) { - case *ast.BlockStmt: - // Fold lines between "{" and "}". - if !n.Lbrace.IsValid() || !n.Rbrace.IsValid() { - break - } - nStmts := len(n.List) - if nStmts == 0 { - break - } - // Don't want to fold if the start is on the same line as the brace. - if fset.Position(n.Lbrace).Line == fset.Position(n.List[0].Pos()).Line { - break - } - // Don't want to fold if the end is on the same line as the brace. - if fset.Position(n.Rbrace).Line == fset.Position(n.List[nStmts-1].End()).Line { - break - } - start, end = n.Lbrace+1, n.List[nStmts-1].End() - case *ast.CaseClause: - // Fold from position of ":" to end. - start, end = n.Colon+1, n.End() - case *ast.FieldList: - // Fold lines between opening parenthesis/brace and closing parenthesis/brace. - if !n.Opening.IsValid() || !n.Closing.IsValid() { - break - } - nFields := len(n.List) - if nFields == 0 { - break - } - // Don't want to fold if the start is on the same line as the parenthesis/brace. - if fset.Position(n.Opening).Line == fset.Position(n.List[nFields-1].End()).Line { - break - } - // Don't want to fold if the end is on the same line as the parenthesis/brace. - if fset.Position(n.Closing).Line == fset.Position(n.List[nFields-1].End()).Line { - break - } - start, end = n.Opening+1, n.List[nFields-1].End() - case *ast.GenDecl: - // If this is an import declaration, set the kind to be protocol.Imports. - if n.Tok == token.IMPORT { - kind = protocol.Imports - } - // Fold from position of "(" to position of ")". - if !n.Lparen.IsValid() || !n.Rparen.IsValid() { - break - } - nSpecs := len(n.Specs) - if nSpecs == 0 { - break - } - // Don't want to fold if the end is on the same line as the parenthesis/brace. - if fset.Position(n.Lparen).Line == fset.Position(n.Specs[0].Pos()).Line { - break - } - // Don't want to fold if the end is on the same line as the parenthesis/brace. - if fset.Position(n.Rparen).Line == fset.Position(n.Specs[nSpecs-1].End()).Line { - break - } - start, end = n.Lparen+1, n.Specs[nSpecs-1].End() - } - - // Check that folding positions are valid. - if !start.IsValid() || !end.IsValid() { - return nil - } - // Do not fold if the start and end lines are the same. - if fset.Position(start).Line == fset.Position(end).Line { - return nil - } - return &FoldingRangeInfo{ - mappedRange: mappedRange{ - m: m, - spanRange: span.NewRange(fset, start, end), - }, - Kind: kind, - } -} - -// commentsFoldingRange returns the folding ranges for all comment blocks in file. -// The folding range starts at the end of the first comment, and ends at the end of the -// comment block and has kind protocol.Comment. -func commentsFoldingRange(view View, m *protocol.ColumnMapper, file *ast.File) (comments []*FoldingRangeInfo) { - for _, commentGrp := range file.Comments { - // Don't fold single comments. - if len(commentGrp.List) <= 1 { - continue - } - comments = append(comments, &FoldingRangeInfo{ - mappedRange: mappedRange{ - m: m, - // Fold from the end of the first line comment to the end of the comment block. - spanRange: span.NewRange(view.Session().Cache().FileSet(), commentGrp.List[0].End(), commentGrp.End()), - }, - Kind: protocol.Comment, - }) - } - return comments -} diff --git a/vendor/golang.org/x/tools/internal/lsp/source/format.go b/vendor/golang.org/x/tools/internal/lsp/source/format.go deleted file mode 100644 index 4a8974f3b..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/source/format.go +++ /dev/null @@ -1,359 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package source provides core features for use by Go editors and tools. -package source - -import ( - "bytes" - "context" - "go/format" - - "golang.org/x/tools/internal/imports" - "golang.org/x/tools/internal/lsp/diff" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/telemetry/trace" - errors "golang.org/x/xerrors" -) - -// Format formats a file with a given range. -func Format(ctx context.Context, view View, f File) ([]protocol.TextEdit, error) { - ctx, done := trace.StartSpan(ctx, "source.Format") - defer done() - - snapshot, cphs, err := view.CheckPackageHandles(ctx, f) - if err != nil { - return nil, err - } - cph, err := NarrowestCheckPackageHandle(cphs) - if err != nil { - return nil, err - } - pkg, err := cph.Check(ctx) - if err != nil { - return nil, err - } - ph, err := pkg.File(f.URI()) - if err != nil { - return nil, err - } - // Be extra careful that the file's ParseMode is correct, - // otherwise we might replace the user's code with a trimmed AST. - if ph.Mode() != ParseFull { - return nil, errors.Errorf("%s was parsed in the incorrect mode", ph.File().Identity().URI) - } - file, m, _, err := ph.Parse(ctx) - if err != nil { - return nil, err - } - if hasListErrors(pkg) || hasParseErrors(pkg, f.URI()) { - // Even if this package has list or parse errors, this file may not - // have any parse errors and can still be formatted. Using format.Node - // on an ast with errors may result in code being added or removed. - // Attempt to format the source of this file instead. - formatted, err := formatSource(ctx, snapshot, f) - if err != nil { - return nil, err - } - return computeTextEdits(ctx, view, ph.File(), m, string(formatted)) - } - - fset := view.Session().Cache().FileSet() - buf := &bytes.Buffer{} - - // format.Node changes slightly from one release to another, so the version - // of Go used to build the LSP server will determine how it formats code. - // This should be acceptable for all users, who likely be prompted to rebuild - // the LSP server on each Go release. - if err := format.Node(buf, fset, file); err != nil { - return nil, err - } - return computeTextEdits(ctx, view, ph.File(), m, buf.String()) -} - -func formatSource(ctx context.Context, s Snapshot, f File) ([]byte, error) { - ctx, done := trace.StartSpan(ctx, "source.formatSource") - defer done() - - data, _, err := s.Handle(ctx, f).Read(ctx) - if err != nil { - return nil, err - } - return format.Source(data) -} - -// Imports formats a file using the goimports tool. -func Imports(ctx context.Context, view View, f File) ([]protocol.TextEdit, error) { - ctx, done := trace.StartSpan(ctx, "source.Imports") - defer done() - - _, cphs, err := view.CheckPackageHandles(ctx, f) - if err != nil { - return nil, err - } - cph, err := NarrowestCheckPackageHandle(cphs) - if err != nil { - return nil, err - } - pkg, err := cph.Check(ctx) - if err != nil { - return nil, err - } - if hasListErrors(pkg) { - return nil, errors.Errorf("%s has list errors, not running goimports", f.URI()) - } - ph, err := pkg.File(f.URI()) - if err != nil { - return nil, err - } - // Be extra careful that the file's ParseMode is correct, - // otherwise we might replace the user's code with a trimmed AST. - if ph.Mode() != ParseFull { - return nil, errors.Errorf("%s was parsed in the incorrect mode", ph.File().Identity().URI) - } - options := &imports.Options{ - // Defaults. - AllErrors: true, - Comments: true, - Fragment: true, - FormatOnly: false, - TabIndent: true, - TabWidth: 8, - } - var formatted []byte - importFn := func(opts *imports.Options) error { - data, _, err := ph.File().Read(ctx) - if err != nil { - return err - } - formatted, err = imports.Process(ph.File().Identity().URI.Filename(), data, opts) - return err - } - err = view.RunProcessEnvFunc(ctx, importFn, options) - if err != nil { - return nil, err - } - _, m, _, err := ph.Parse(ctx) - if err != nil { - return nil, err - } - return computeTextEdits(ctx, view, ph.File(), m, string(formatted)) -} - -type ImportFix struct { - Fix *imports.ImportFix - Edits []protocol.TextEdit -} - -// AllImportsFixes formats f for each possible fix to the imports. -// In addition to returning the result of applying all edits, -// it returns a list of fixes that could be applied to the file, with the -// corresponding TextEdits that would be needed to apply that fix. -func AllImportsFixes(ctx context.Context, view View, f File) (edits []protocol.TextEdit, editsPerFix []*ImportFix, err error) { - ctx, done := trace.StartSpan(ctx, "source.AllImportsFixes") - defer done() - - _, cphs, err := view.CheckPackageHandles(ctx, f) - if err != nil { - return nil, nil, err - } - cph, err := NarrowestCheckPackageHandle(cphs) - if err != nil { - return nil, nil, err - } - pkg, err := cph.Check(ctx) - if err != nil { - return nil, nil, err - } - if hasListErrors(pkg) { - return nil, nil, errors.Errorf("%s has list errors, not running goimports", f.URI()) - } - options := &imports.Options{ - // Defaults. - AllErrors: true, - Comments: true, - Fragment: true, - FormatOnly: false, - TabIndent: true, - TabWidth: 8, - } - importFn := func(opts *imports.Options) error { - var ph ParseGoHandle - for _, h := range pkg.Files() { - if h.File().Identity().URI == f.URI() { - ph = h - } - } - if ph == nil { - return errors.Errorf("no ParseGoHandle for %s", f.URI()) - } - data, _, err := ph.File().Read(ctx) - if err != nil { - return err - } - fixes, err := imports.FixImports(f.URI().Filename(), data, opts) - if err != nil { - return err - } - // Do not change the file if there are no import fixes. - if len(fixes) == 0 { - return nil - } - // Apply all of the import fixes to the file. - formatted, err := imports.ApplyFixes(fixes, f.URI().Filename(), data, options) - if err != nil { - return err - } - _, m, _, err := ph.Parse(ctx) - if err != nil { - return err - } - edits, err = computeTextEdits(ctx, view, ph.File(), m, string(formatted)) - if err != nil { - return err - } - // Add the edits for each fix to the result. - editsPerFix = make([]*ImportFix, len(fixes)) - for i, fix := range fixes { - formatted, err := imports.ApplyFixes([]*imports.ImportFix{fix}, f.URI().Filename(), data, options) - if err != nil { - return err - } - edits, err := computeTextEdits(ctx, view, ph.File(), m, string(formatted)) - if err != nil { - return err - } - editsPerFix[i] = &ImportFix{ - Fix: fix, - Edits: edits, - } - } - return nil - } - err = view.RunProcessEnvFunc(ctx, importFn, options) - if err != nil { - return nil, nil, err - } - - return edits, editsPerFix, nil -} - -// CandidateImports returns every import that could be added to filename. -func CandidateImports(ctx context.Context, view View, filename string) ([]imports.ImportFix, error) { - ctx, done := trace.StartSpan(ctx, "source.CandidateImports") - defer done() - - options := &imports.Options{ - // Defaults. - AllErrors: true, - Comments: true, - Fragment: true, - FormatOnly: false, - TabIndent: true, - TabWidth: 8, - } - - var imps []imports.ImportFix - importFn := func(opts *imports.Options) error { - var err error - imps, err = imports.GetAllCandidates(filename, opts) - return err - } - err := view.RunProcessEnvFunc(ctx, importFn, options) - return imps, err -} - -// PackageExports returns all the packages named pkg that could be imported by -// filename, and their exports. -func PackageExports(ctx context.Context, view View, pkg, filename string) ([]imports.PackageExport, error) { - ctx, done := trace.StartSpan(ctx, "source.PackageExports") - defer done() - - options := &imports.Options{ - // Defaults. - AllErrors: true, - Comments: true, - Fragment: true, - FormatOnly: false, - TabIndent: true, - TabWidth: 8, - } - - var pkgs []imports.PackageExport - importFn := func(opts *imports.Options) error { - var err error - pkgs, err = imports.GetPackageExports(pkg, filename, opts) - return err - } - err := view.RunProcessEnvFunc(ctx, importFn, options) - return pkgs, err -} - -// hasParseErrors returns true if the given file has parse errors. -func hasParseErrors(pkg Package, uri span.URI) bool { - for _, err := range pkg.GetErrors() { - if err.URI == uri && err.Kind == ParseError { - return true - } - } - return false -} - -func hasListErrors(pkg Package) bool { - for _, err := range pkg.GetErrors() { - if err.Kind == ListError { - return true - } - } - return false -} - -func computeTextEdits(ctx context.Context, view View, fh FileHandle, m *protocol.ColumnMapper, formatted string) ([]protocol.TextEdit, error) { - ctx, done := trace.StartSpan(ctx, "source.computeTextEdits") - defer done() - - data, _, err := fh.Read(ctx) - if err != nil { - return nil, err - } - edits := view.Options().ComputeEdits(fh.Identity().URI, string(data), formatted) - return ToProtocolEdits(m, edits) -} - -func ToProtocolEdits(m *protocol.ColumnMapper, edits []diff.TextEdit) ([]protocol.TextEdit, error) { - if edits == nil { - return nil, nil - } - result := make([]protocol.TextEdit, len(edits)) - for i, edit := range edits { - rng, err := m.Range(edit.Span) - if err != nil { - return nil, err - } - result[i] = protocol.TextEdit{ - Range: rng, - NewText: edit.NewText, - } - } - return result, nil -} - -func FromProtocolEdits(m *protocol.ColumnMapper, edits []protocol.TextEdit) ([]diff.TextEdit, error) { - if edits == nil { - return nil, nil - } - result := make([]diff.TextEdit, len(edits)) - for i, edit := range edits { - spn, err := m.RangeSpan(edit.Range) - if err != nil { - return nil, err - } - result[i] = diff.TextEdit{ - Span: spn, - NewText: edit.NewText, - } - } - return result, nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/source/highlight.go b/vendor/golang.org/x/tools/internal/lsp/source/highlight.go deleted file mode 100644 index 8c0c1041e..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/source/highlight.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package source - -import ( - "context" - "go/ast" - - "golang.org/x/tools/go/ast/astutil" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/telemetry/trace" - errors "golang.org/x/xerrors" -) - -func Highlight(ctx context.Context, view View, uri span.URI, pos protocol.Position) ([]protocol.Range, error) { - ctx, done := trace.StartSpan(ctx, "source.Highlight") - defer done() - - f, err := view.GetFile(ctx, uri) - if err != nil { - return nil, err - } - fh := view.Snapshot().Handle(ctx, f) - ph := view.Session().Cache().ParseGoHandle(fh, ParseFull) - file, m, _, err := ph.Parse(ctx) - if err != nil { - return nil, err - } - spn, err := m.PointSpan(pos) - if err != nil { - return nil, err - } - rng, err := spn.Range(m.Converter) - if err != nil { - return nil, err - } - path, _ := astutil.PathEnclosingInterval(file, rng.Start, rng.Start) - if len(path) == 0 { - return nil, errors.Errorf("no enclosing position found for %v:%v", int(pos.Line), int(pos.Character)) - } - id, ok := path[0].(*ast.Ident) - if !ok { - // If the cursor is not within an identifier, return empty results. - return []protocol.Range{}, nil - } - var result []protocol.Range - if id.Obj != nil { - ast.Inspect(path[len(path)-1], func(n ast.Node) bool { - if n, ok := n.(*ast.Ident); ok && n.Obj == id.Obj { - rng, err := nodeToProtocolRange(ctx, view, m, n) - if err == nil { - result = append(result, rng) - } - } - return true - }) - } - return result, nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/source/hover.go b/vendor/golang.org/x/tools/internal/lsp/source/hover.go deleted file mode 100644 index 0123e1c3a..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/source/hover.go +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package source - -import ( - "context" - "fmt" - "go/ast" - "go/doc" - "go/format" - "go/types" - "strings" - - "golang.org/x/tools/internal/telemetry/trace" - errors "golang.org/x/xerrors" -) - -type HoverInformation struct { - // Signature is the symbol's signature. - Signature string `json:"signature"` - - // SingleLine is a single line describing the symbol. - // This is recommended only for use in clients that show a single line for hover. - SingleLine string `json:"singleLine"` - - // Synopsis is a single sentence synopsis of the symbol's documentation. - Synopsis string `json:"synopsis"` - - // FullDocumentation is the symbol's full documentation. - FullDocumentation string `json:"fullDocumentation"` - - source interface{} - comment *ast.CommentGroup -} - -func (i *IdentifierInfo) Hover(ctx context.Context) (*HoverInformation, error) { - ctx, done := trace.StartSpan(ctx, "source.Hover") - defer done() - - h, err := i.Declaration.hover(ctx) - if err != nil { - return nil, err - } - // Determine the symbol's signature. - switch x := h.source.(type) { - case ast.Node: - var b strings.Builder - if err := format.Node(&b, i.Snapshot.View().Session().Cache().FileSet(), x); err != nil { - return nil, err - } - h.Signature = b.String() - case types.Object: - h.Signature = objectString(x, i.qf) - } - - // Set the documentation. - if i.Declaration.obj != nil { - h.SingleLine = objectString(i.Declaration.obj, i.qf) - } - if h.comment != nil { - h.FullDocumentation = h.comment.Text() - h.Synopsis = doc.Synopsis(h.FullDocumentation) - } - return h, nil -} - -// objectString is a wrapper around the types.ObjectString function. -// It handles adding more information to the object string. -func objectString(obj types.Object, qf types.Qualifier) string { - str := types.ObjectString(obj, qf) - switch obj := obj.(type) { - case *types.Const: - str = fmt.Sprintf("%s = %s", str, obj.Val()) - } - return str -} - -func (d Declaration) hover(ctx context.Context) (*HoverInformation, error) { - _, done := trace.StartSpan(ctx, "source.hover") - defer done() - - obj := d.obj - switch node := d.node.(type) { - case *ast.ImportSpec: - return &HoverInformation{source: node}, nil - case *ast.GenDecl: - switch obj := obj.(type) { - case *types.TypeName, *types.Var, *types.Const, *types.Func: - return formatGenDecl(node, obj, obj.Type()) - } - case *ast.TypeSpec: - if obj.Parent() == types.Universe { - if obj.Name() == "error" { - return &HoverInformation{source: node}, nil - } - return &HoverInformation{source: node.Name}, nil // comments not needed for builtins - } - case *ast.FuncDecl: - switch obj.(type) { - case *types.Func: - return &HoverInformation{source: obj, comment: node.Doc}, nil - case *types.Builtin: - return &HoverInformation{source: node.Type, comment: node.Doc}, nil - } - } - return &HoverInformation{source: obj}, nil -} - -func formatGenDecl(node *ast.GenDecl, obj types.Object, typ types.Type) (*HoverInformation, error) { - if _, ok := typ.(*types.Named); ok { - switch typ.Underlying().(type) { - case *types.Interface, *types.Struct: - return formatGenDecl(node, obj, typ.Underlying()) - } - } - var spec ast.Spec - for _, s := range node.Specs { - if s.Pos() <= obj.Pos() && obj.Pos() <= s.End() { - spec = s - break - } - } - if spec == nil { - return nil, errors.Errorf("no spec for node %v at position %v", node, obj.Pos()) - } - // If we have a field or method. - switch obj.(type) { - case *types.Var, *types.Const, *types.Func: - return formatVar(spec, obj) - } - // Handle types. - switch spec := spec.(type) { - case *ast.TypeSpec: - if len(node.Specs) > 1 { - // If multiple types are declared in the same block. - return &HoverInformation{source: spec.Type, comment: spec.Doc}, nil - } else { - return &HoverInformation{source: spec, comment: node.Doc}, nil - } - case *ast.ValueSpec: - return &HoverInformation{source: spec, comment: spec.Doc}, nil - case *ast.ImportSpec: - return &HoverInformation{source: spec, comment: spec.Doc}, nil - } - return nil, errors.Errorf("unable to format spec %v (%T)", spec, spec) -} - -func formatVar(node ast.Spec, obj types.Object) (*HoverInformation, error) { - var fieldList *ast.FieldList - if spec, ok := node.(*ast.TypeSpec); ok { - switch t := spec.Type.(type) { - case *ast.StructType: - fieldList = t.Fields - case *ast.InterfaceType: - fieldList = t.Methods - } - } - // If we have a struct or interface declaration, - // we need to match the object to the corresponding field or method. - if fieldList != nil { - for i := 0; i < len(fieldList.List); i++ { - field := fieldList.List[i] - if field.Pos() <= obj.Pos() && obj.Pos() <= field.End() { - if field.Doc.Text() != "" { - return &HoverInformation{source: obj, comment: field.Doc}, nil - } else if field.Comment.Text() != "" { - return &HoverInformation{source: obj, comment: field.Comment}, nil - } - } - } - } - // If we weren't able to find documentation for the object. - return &HoverInformation{source: obj}, nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/source/identifier.go b/vendor/golang.org/x/tools/internal/lsp/source/identifier.go deleted file mode 100644 index 4addaf373..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/source/identifier.go +++ /dev/null @@ -1,362 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package source - -import ( - "context" - "go/ast" - "go/token" - "go/types" - "strconv" - - "golang.org/x/tools/go/ast/astutil" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/telemetry/trace" - errors "golang.org/x/xerrors" -) - -// IdentifierInfo holds information about an identifier in Go source. -type IdentifierInfo struct { - Name string - File ParseGoHandle - Snapshot Snapshot - mappedRange - - Type struct { - mappedRange - Object types.Object - } - - Declaration Declaration - - pkg Package - ident *ast.Ident - wasEmbeddedField bool - qf types.Qualifier -} - -type Declaration struct { - mappedRange - node ast.Node - obj types.Object - wasImplicit bool -} - -// Identifier returns identifier information for a position -// in a file, accounting for a potentially incomplete selector. -func Identifier(ctx context.Context, view View, f File, pos protocol.Position) (*IdentifierInfo, error) { - snapshot, cphs, err := view.CheckPackageHandles(ctx, f) - if err != nil { - return nil, err - } - cph, err := WidestCheckPackageHandle(cphs) - if err != nil { - return nil, err - } - pkg, err := cph.Check(ctx) - if err != nil { - return nil, err - } - ph, err := pkg.File(f.URI()) - if err != nil { - return nil, err - } - file, m, _, err := ph.Cached() - if err != nil { - return nil, err - } - spn, err := m.PointSpan(pos) - if err != nil { - return nil, err - } - rng, err := spn.Range(m.Converter) - if err != nil { - return nil, err - } - return findIdentifier(ctx, snapshot, pkg, file, rng.Start) -} - -func findIdentifier(ctx context.Context, snapshot Snapshot, pkg Package, file *ast.File, pos token.Pos) (*IdentifierInfo, error) { - if result, err := identifier(ctx, snapshot, pkg, file, pos); err != nil || result != nil { - return result, err - } - // If the position is not an identifier but immediately follows - // an identifier or selector period (as is common when - // requesting a completion), use the path to the preceding node. - ident, err := identifier(ctx, snapshot, pkg, file, pos-1) - if ident == nil && err == nil { - err = errors.New("no identifier found") - } - return ident, err -} - -// identifier checks a single position for a potential identifier. -func identifier(ctx context.Context, snapshot Snapshot, pkg Package, file *ast.File, pos token.Pos) (*IdentifierInfo, error) { - ctx, done := trace.StartSpan(ctx, "source.identifier") - defer done() - - var err error - - // Handle import specs separately, as there is no formal position for a package declaration. - if result, err := importSpec(ctx, snapshot, pkg, file, pos); result != nil || err != nil { - return result, err - } - path, _ := astutil.PathEnclosingInterval(file, pos, pos) - if path == nil { - return nil, errors.Errorf("can't find node enclosing position") - } - view := snapshot.View() - uri := span.FileURI(view.Session().Cache().FileSet().Position(pos).Filename) - var ph ParseGoHandle - for _, h := range pkg.Files() { - if h.File().Identity().URI == uri { - ph = h - } - } - result := &IdentifierInfo{ - File: ph, - Snapshot: snapshot, - qf: qualifier(file, pkg.GetTypes(), pkg.GetTypesInfo()), - pkg: pkg, - ident: searchForIdent(path[0]), - } - // No identifier at the given position. - if result.ident == nil { - return nil, nil - } - for _, n := range path[1:] { - if field, ok := n.(*ast.Field); ok { - result.wasEmbeddedField = len(field.Names) == 0 - break - } - } - result.Name = result.ident.Name - if result.mappedRange, err = posToMappedRange(ctx, view, pkg, result.ident.Pos(), result.ident.End()); err != nil { - return nil, err - } - result.Declaration.obj = pkg.GetTypesInfo().ObjectOf(result.ident) - if result.Declaration.obj == nil { - // If there was no types.Object for the declaration, there might be an implicit local variable - // declaration in a type switch. - if objs := typeSwitchVar(pkg.GetTypesInfo(), path); len(objs) > 0 { - // There is no types.Object for the declaration of an implicit local variable, - // but all of the types.Objects associated with the usages of this variable can be - // used to connect it back to the declaration. - // Preserve the first of these objects and treat it as if it were the declaring object. - result.Declaration.obj = objs[0] - result.Declaration.wasImplicit = true - } else { - // Probably a type error. - return nil, errors.Errorf("no object for ident %v", result.Name) - } - } - - // Handle builtins separately. - if result.Declaration.obj.Parent() == types.Universe { - obj := view.BuiltinPackage().Lookup(result.Name) - if obj == nil { - return result, nil - } - decl, ok := obj.Decl.(ast.Node) - if !ok { - return nil, errors.Errorf("no declaration for %s", result.Name) - } - result.Declaration.node = decl - if result.Declaration.mappedRange, err = nameToMappedRange(ctx, view, pkg, decl.Pos(), result.Name); err != nil { - return nil, err - } - return result, nil - } - - if result.wasEmbeddedField { - // The original position was on the embedded field declaration, so we - // try to dig out the type and jump to that instead. - if v, ok := result.Declaration.obj.(*types.Var); ok { - if typObj := typeToObject(v.Type()); typObj != nil { - result.Declaration.obj = typObj - } - } - } - - for _, obj := range pkg.GetTypesInfo().Implicits { - if obj.Pos() == result.Declaration.obj.Pos() { - // Mark this declaration as implicit, since it will not - // appear in a (*types.Info).Defs map. - result.Declaration.wasImplicit = true - break - } - } - - if result.Declaration.mappedRange, err = objToMappedRange(ctx, view, pkg, result.Declaration.obj); err != nil { - return nil, err - } - if result.Declaration.node, err = objToNode(ctx, snapshot.View(), pkg, result.Declaration.obj); err != nil { - return nil, err - } - typ := pkg.GetTypesInfo().TypeOf(result.ident) - if typ == nil { - return result, nil - } - - result.Type.Object = typeToObject(typ) - if result.Type.Object != nil { - // Identifiers with the type "error" are a special case with no position. - if hasErrorType(result.Type.Object) { - return result, nil - } - if result.Type.mappedRange, err = objToMappedRange(ctx, view, pkg, result.Type.Object); err != nil { - return nil, err - } - } - return result, nil -} - -func searchForIdent(n ast.Node) *ast.Ident { - switch node := n.(type) { - case *ast.Ident: - return node - case *ast.SelectorExpr: - return node.Sel - case *ast.StarExpr: - return searchForIdent(node.X) - } - return nil -} - -func typeToObject(typ types.Type) types.Object { - switch typ := typ.(type) { - case *types.Named: - return typ.Obj() - case *types.Pointer: - return typeToObject(typ.Elem()) - default: - return nil - } -} - -func hasErrorType(obj types.Object) bool { - return types.IsInterface(obj.Type()) && obj.Pkg() == nil && obj.Name() == "error" -} - -func objToNode(ctx context.Context, v View, pkg Package, obj types.Object) (ast.Decl, error) { - uri := span.FileURI(v.Session().Cache().FileSet().Position(obj.Pos()).Filename) - ph, _, err := v.FindFileInPackage(ctx, uri, pkg) - if err != nil { - return nil, err - } - declAST, _, _, err := ph.Cached() - if declAST == nil { - return nil, err - } - if !(declAST.Pos() <= obj.Pos() && obj.Pos() <= declAST.End()) { - return nil, errors.Errorf("no file for %s", obj.Name()) - } - path, _ := astutil.PathEnclosingInterval(declAST, obj.Pos(), obj.Pos()) - if path == nil { - return nil, errors.Errorf("no path for object %v", obj.Name()) - } - for _, node := range path { - switch node := node.(type) { - case *ast.GenDecl: - // Type names, fields, and methods. - switch obj.(type) { - case *types.TypeName, *types.Var, *types.Const, *types.Func: - return node, nil - } - case *ast.FuncDecl: - // Function signatures. - if _, ok := obj.(*types.Func); ok { - return node, nil - } - } - } - return nil, nil // didn't find a node, but don't fail -} - -// importSpec handles positions inside of an *ast.ImportSpec. -func importSpec(ctx context.Context, snapshot Snapshot, pkg Package, file *ast.File, pos token.Pos) (*IdentifierInfo, error) { - var imp *ast.ImportSpec - for _, spec := range file.Imports { - if spec.Path.Pos() <= pos && pos < spec.Path.End() { - imp = spec - } - } - if imp == nil { - return nil, nil - } - importPath, err := strconv.Unquote(imp.Path.Value) - if err != nil { - return nil, errors.Errorf("import path not quoted: %s (%v)", imp.Path.Value, err) - } - uri := span.FileURI(snapshot.View().Session().Cache().FileSet().Position(pos).Filename) - var ph ParseGoHandle - for _, h := range pkg.Files() { - if h.File().Identity().URI == uri { - ph = h - } - } - result := &IdentifierInfo{ - File: ph, - Snapshot: snapshot, - Name: importPath, - pkg: pkg, - } - if result.mappedRange, err = posToMappedRange(ctx, snapshot.View(), pkg, imp.Path.Pos(), imp.Path.End()); err != nil { - return nil, err - } - // Consider the "declaration" of an import spec to be the imported package. - importedPkg, err := pkg.GetImport(importPath) - if err != nil { - return nil, err - } - if importedPkg.GetSyntax() == nil { - return nil, errors.Errorf("no syntax for for %q", importPath) - } - // Heuristic: Jump to the longest (most "interesting") file of the package. - var dest *ast.File - for _, f := range importedPkg.GetSyntax() { - if dest == nil || f.End()-f.Pos() > dest.End()-dest.Pos() { - dest = f - } - } - if dest == nil { - return nil, errors.Errorf("package %q has no files", importPath) - } - if result.Declaration.mappedRange, err = posToMappedRange(ctx, snapshot.View(), pkg, dest.Pos(), dest.End()); err != nil { - return nil, err - } - result.Declaration.node = imp - return result, nil -} - -// typeSwitchVar handles the special case of a local variable implicitly defined in a type switch. -// In such cases, the definition of the implicit variable will not be recorded in the *types.Info.Defs map, -// but rather in the *types.Info.Implicits map. -func typeSwitchVar(info *types.Info, path []ast.Node) []types.Object { - if len(path) < 3 { - return nil - } - // Check for [Ident AssignStmt TypeSwitchStmt...] - if _, ok := path[0].(*ast.Ident); !ok { - return nil - } - if _, ok := path[1].(*ast.AssignStmt); !ok { - return nil - } - sw, ok := path[2].(*ast.TypeSwitchStmt) - if !ok { - return nil - } - - var res []types.Object - for _, stmt := range sw.Body.List { - obj := info.Implicits[stmt.(*ast.CaseClause)] - if obj != nil { - res = append(res, obj) - } - } - return res -} diff --git a/vendor/golang.org/x/tools/internal/lsp/source/implementation.go b/vendor/golang.org/x/tools/internal/lsp/source/implementation.go deleted file mode 100644 index bcfcc0658..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/source/implementation.go +++ /dev/null @@ -1,158 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// The code in this file is based largely on the code in -// cmd/guru/implements.go. The guru implementation supports -// looking up "implementers" of methods also, but that -// code has been cut out here for now for simplicity. - -package source - -import ( - "context" - "errors" - "go/types" - "sort" - - "golang.org/x/tools/go/types/typeutil" - "golang.org/x/tools/internal/lsp/protocol" -) - -func Implementation(ctx context.Context, view View, f File, position protocol.Position) ([]protocol.Location, error) { - // Find all references to the identifier at the position. - ident, err := Identifier(ctx, view, f, position) - if err != nil { - return nil, err - } - - res, err := ident.implementations(ctx) - if err != nil { - return nil, err - } - - var locations []protocol.Location - for _, t := range res.to { - // We'll provide implementations that are named types and pointers to named types. - if p, ok := t.(*types.Pointer); ok { - t = p.Elem() - } - if n, ok := t.(*types.Named); ok { - ph, pkg, err := view.FindFileInPackage(ctx, f.URI(), ident.pkg) - if err != nil { - return nil, err - } - f, _, _, err := ph.Cached() - if err != nil { - return nil, err - } - ident, err := findIdentifier(ctx, view.Snapshot(), pkg, f, n.Obj().Pos()) - if err != nil { - return nil, err - } - decRange, err := ident.Declaration.Range() - if err != nil { - return nil, err - } - locations = append(locations, protocol.Location{ - URI: protocol.NewURI(ident.Declaration.URI()), - Range: decRange, - }) - } - } - - return locations, nil -} - -func (i *IdentifierInfo) implementations(ctx context.Context) (implementsResult, error) { - if i.Type.Object == nil { - return implementsResult{}, errors.New("no type info object for identifier") - } - T := i.Type.Object.Type() - - // Find all named types, even local types (which can have - // methods due to promotion) and the built-in "error". - // We ignore aliases 'type M = N' to avoid duplicate - // reporting of the Named type N. - var allNamed []*types.Named - info := i.pkg.GetTypesInfo() - for _, obj := range info.Defs { - if obj, ok := obj.(*types.TypeName); ok && !obj.IsAlias() { - if named, ok := obj.Type().(*types.Named); ok { - allNamed = append(allNamed, named) - } - } - } - - allNamed = append(allNamed, types.Universe.Lookup("error").Type().(*types.Named)) - - var msets typeutil.MethodSetCache - - // TODO(matloob): We only use the to result for now. Figure out if we want to - // surface the from and fromPtr results to users. - // Test each named type. - var to, from, fromPtr []types.Type - for _, U := range allNamed { - if isInterface(T) { - if msets.MethodSet(T).Len() == 0 { - continue // empty interface - } - if isInterface(U) { - if msets.MethodSet(U).Len() == 0 { - continue // empty interface - } - - // T interface, U interface - if !types.Identical(T, U) { - if types.AssignableTo(U, T) { - to = append(to, U) - } - if types.AssignableTo(T, U) { - from = append(from, U) - } - } - } else { - // T interface, U concrete - if types.AssignableTo(U, T) { - to = append(to, U) - } else if pU := types.NewPointer(U); types.AssignableTo(pU, T) { - to = append(to, pU) - } - } - } else if isInterface(U) { - if msets.MethodSet(U).Len() == 0 { - continue // empty interface - } - - // T concrete, U interface - if types.AssignableTo(T, U) { - from = append(from, U) - } else if pT := types.NewPointer(T); types.AssignableTo(pT, U) { - fromPtr = append(fromPtr, U) - } - } - } - - // Sort types (arbitrarily) to ensure test determinism. - sort.Sort(typesByString(to)) - sort.Sort(typesByString(from)) - sort.Sort(typesByString(fromPtr)) - - // TODO(matloob): Perhaps support calling implements on methods instead of just interface types, - // as guru does. - - return implementsResult{to, from, fromPtr}, nil -} - -// implementsResult contains the results of an implements query. -type implementsResult struct { - to []types.Type // named or ptr-to-named types assignable to interface T - from []types.Type // named interfaces assignable from T - fromPtr []types.Type // named interfaces assignable only from *T -} - -type typesByString []types.Type - -func (p typesByString) Len() int { return len(p) } -func (p typesByString) Less(i, j int) bool { return p[i].String() < p[j].String() } -func (p typesByString) Swap(i, j int) { p[i], p[j] = p[j], p[i] } diff --git a/vendor/golang.org/x/tools/internal/lsp/source/imports.go b/vendor/golang.org/x/tools/internal/lsp/source/imports.go deleted file mode 100644 index 53fb4358e..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/source/imports.go +++ /dev/null @@ -1,264 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package source - -import ( - "bytes" - "fmt" - "go/ast" - "go/format" - "go/token" - "strconv" - "strings" - - "golang.org/x/tools/internal/lsp/diff" - "golang.org/x/tools/internal/span" -) - -// Taken and then modified from golang.org/x/tools/go/ast/astutil. -// -// We currently choose to create our own version of AddNamedImport for the following reasons: -// 1. We do not want to edit the current ast. This is so that we can use the same ast -// to get the changes from multiple distinct modifications. -// 2. We need the changes that *only* affect the import declarations, because the edits -// are not allowed to overlap with the position in the source that is being edited. -// astutil.AddNamedImport makes it hard to determine what changes need to be made -// to the source document from the ast, as astutil.AddNamedImport includes a merging pass. - -// addNamedImport adds the import with the given name and path to the file f, if absent. -// If name is not empty, it is used to rename the import. -// -// For example, calling -// addNamedImport(fset, f, "pathpkg", "path") -// adds -// import pathpkg "path" -// -// addNamedImport only returns edits that affect the import declarations. -func addNamedImport(fset *token.FileSet, f *ast.File, name, path string) (edits []diff.TextEdit, err error) { - if alreadyImportsNamed(f, name, path) { - return nil, nil - } - - newImport := &ast.ImportSpec{ - Path: &ast.BasicLit{ - Kind: token.STRING, - Value: strconv.Quote(path), - }, - } - if name != "" { - newImport.Name = &ast.Ident{Name: name} - } - - // Find an import decl to add to. - // The goal is to find an existing import - // whose import path has the longest shared - // prefix with path. - var ( - bestMatch = -1 // length of longest shared prefix - lastImport = -1 // index in f.Decls of the file's final import decl - impDecl *ast.GenDecl // import decl containing the best match - impIndex = -1 // spec index in impDecl containing the best match - - isThirdPartyPath = isThirdParty(path) - ) - for i, decl := range f.Decls { - gen, ok := decl.(*ast.GenDecl) - if ok && gen.Tok == token.IMPORT { - lastImport = i - // Do not add to import "C", to avoid disrupting the - // association with its doc comment, breaking cgo. - if declImports(gen, "C") { - continue - } - - // Do not add to single imports. - if !gen.Lparen.IsValid() { - continue - } - - // Match an empty import decl if that's all that is available. - if len(gen.Specs) == 0 && bestMatch == -1 { - impDecl = gen - } - - // Compute longest shared prefix with imports in this group and find best - // matched import spec. - // 1. Always prefer import spec with longest shared prefix. - // 2. While match length is 0, - // - for stdlib package: prefer first import spec. - // - for third party package: prefer first third party import spec. - // We cannot use last import spec as best match for third party package - // because grouped imports are usually placed last by goimports -local - // flag. - // See issue #19190. - seenAnyThirdParty := false - for j, spec := range gen.Specs { - impspec := spec.(*ast.ImportSpec) - p := importPath(impspec) - n := matchLen(p, path) - if n > bestMatch || (bestMatch == 0 && !seenAnyThirdParty && isThirdPartyPath) { - bestMatch = n - impDecl = gen - impIndex = j - } - seenAnyThirdParty = seenAnyThirdParty || isThirdParty(p) - } - } - } - - var insertPos token.Pos - var newText string - // If no import decl found, add one after the last import. - if impDecl == nil { - // Add an import decl after the last import. - impDecl = &ast.GenDecl{ - Tok: token.IMPORT, - } - impDecl.Specs = append(impDecl.Specs, newImport) - - if lastImport >= 0 { - insertPos = f.Decls[lastImport].End() - } else { - // There are no existing imports. - // Our new import goes after the package declaration. - insertPos = f.Name.End() - } - - // Print the whole import declaration. - newText = fmt.Sprintf("\n\nimport %s", printImportSpec(fset, newImport)) - } else { - // Insert new import at insertAt. - insertAt := 0 - if impIndex >= 0 { - // insert after the found import - insertAt = impIndex + 1 - } - - insertPos = impDecl.Lparen + 1 // insert after the parenthesis - if len(impDecl.Specs) > 0 { - insertPos = impDecl.Specs[0].Pos() // insert at the beginning - } - if insertAt > 0 { - // If there is a comment after an existing import, preserve the comment - // position by adding the new import after the comment. - if spec, ok := impDecl.Specs[insertAt-1].(*ast.ImportSpec); ok && spec.Comment != nil { - insertPos = spec.Comment.End() - } else { - // Assign same position as the previous import, - // so that the sorter sees it as being in the same block. - insertPos = impDecl.Specs[insertAt-1].End() - } - } - - // Print this import declaration. - newText = fmt.Sprintf("\n\t%s", printImportSpec(fset, newImport)) - } - - // If we didn't find a valid insert position, return no edits. - if !insertPos.IsValid() { - return edits, nil - } - - // Make sure that we are printed after any comments that start on the same line. - file := fset.File(insertPos) - pkgLine := file.Line(insertPos) - for _, c := range f.Comments { - if file.Line(c.Pos()) > pkgLine { - break - } - if c.End() > insertPos { - insertPos = c.End() - } - } - - rng := span.NewRange(fset, insertPos, insertPos) - spn, err := rng.Span() - if err != nil { - return nil, err - } - - edits = append(edits, diff.TextEdit{ - Span: spn, - NewText: newText, - }) - return edits, nil -} - -func printImportSpec(fset *token.FileSet, spec *ast.ImportSpec) string { - var buf bytes.Buffer - format.Node(&buf, fset, spec) - return buf.String() -} - -func isThirdParty(importPath string) bool { - // Third party package import path usually contains "." (".com", ".org", ...) - // This logic is taken from golang.org/x/tools/imports package. - return strings.Contains(importPath, ".") -} - -// alreadyImports reports whether f has an import with the specified path. -func alreadyImports(f *ast.File, path string) bool { - for _, s := range f.Imports { - if importPath(s) == path { - return true - } - } - return false -} - -// alreadyImportsNamed reports whether f has an import with the specified name -// and path. -func alreadyImportsNamed(f *ast.File, name, path string) bool { - for _, s := range f.Imports { - if importName(s) == name && importPath(s) == path { - return true - } - } - return false -} - -// importName returns the name of s, -// or "" if the import is not named. -func importName(s *ast.ImportSpec) string { - if s.Name == nil { - return "" - } - return s.Name.Name -} - -// importPath returns the unquoted import path of s, -// or "" if the path is not properly quoted. -func importPath(s *ast.ImportSpec) string { - t, err := strconv.Unquote(s.Path.Value) - if err != nil { - return "" - } - return t -} - -// declImports reports whether gen contains an import of path. -func declImports(gen *ast.GenDecl, path string) bool { - if gen.Tok != token.IMPORT { - return false - } - for _, spec := range gen.Specs { - impspec := spec.(*ast.ImportSpec) - if importPath(impspec) == path { - return true - } - } - return false -} - -// matchLen returns the length of the longest path segment prefix shared by x and y. -func matchLen(x, y string) int { - n := 0 - for i := 0; i < len(x) && i < len(y) && x[i] == y[i]; i++ { - if x[i] == '/' { - n++ - } - } - return n -} diff --git a/vendor/golang.org/x/tools/internal/lsp/source/options.go b/vendor/golang.org/x/tools/internal/lsp/source/options.go deleted file mode 100644 index b69d9faf6..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/source/options.go +++ /dev/null @@ -1,363 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package source - -import ( - "fmt" - "os" - "time" - - "golang.org/x/tools/go/analysis" - "golang.org/x/tools/go/analysis/passes/asmdecl" - "golang.org/x/tools/go/analysis/passes/assign" - "golang.org/x/tools/go/analysis/passes/atomic" - "golang.org/x/tools/go/analysis/passes/atomicalign" - "golang.org/x/tools/go/analysis/passes/bools" - "golang.org/x/tools/go/analysis/passes/buildtag" - "golang.org/x/tools/go/analysis/passes/cgocall" - "golang.org/x/tools/go/analysis/passes/composite" - "golang.org/x/tools/go/analysis/passes/copylock" - "golang.org/x/tools/go/analysis/passes/httpresponse" - "golang.org/x/tools/go/analysis/passes/loopclosure" - "golang.org/x/tools/go/analysis/passes/lostcancel" - "golang.org/x/tools/go/analysis/passes/nilfunc" - "golang.org/x/tools/go/analysis/passes/printf" - "golang.org/x/tools/go/analysis/passes/shift" - "golang.org/x/tools/go/analysis/passes/sortslice" - "golang.org/x/tools/go/analysis/passes/stdmethods" - "golang.org/x/tools/go/analysis/passes/structtag" - "golang.org/x/tools/go/analysis/passes/tests" - "golang.org/x/tools/go/analysis/passes/unmarshal" - "golang.org/x/tools/go/analysis/passes/unreachable" - "golang.org/x/tools/go/analysis/passes/unsafeptr" - "golang.org/x/tools/go/analysis/passes/unusedresult" - "golang.org/x/tools/internal/lsp/diff" - "golang.org/x/tools/internal/lsp/diff/myers" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/telemetry/tag" - errors "golang.org/x/xerrors" -) - -var ( - DefaultOptions = Options{ - Env: os.Environ(), - TextDocumentSyncKind: protocol.Incremental, - HoverKind: SynopsisDocumentation, - InsertTextFormat: protocol.PlainTextTextFormat, - PreferredContentFormat: protocol.PlainText, - SupportedCodeActions: map[FileKind]map[protocol.CodeActionKind]bool{ - Go: { - protocol.SourceOrganizeImports: true, - protocol.QuickFix: true, - }, - Mod: { - protocol.SourceOrganizeImports: true, - }, - Sum: {}, - }, - SupportedCommands: []string{ - "tidy", // for go.mod files - }, - Completion: CompletionOptions{ - Documentation: true, - Deep: true, - FuzzyMatching: true, - Budget: 100 * time.Millisecond, - }, - ComputeEdits: myers.ComputeEdits, - Analyzers: defaultAnalyzers, - GoDiff: true, - } -) - -type Options struct { - // Env is the current set of environment overrides on this view. - Env []string - - // BuildFlags is used to adjust the build flags applied to the view. - BuildFlags []string - - HoverKind HoverKind - DisabledAnalyses map[string]struct{} - - StaticCheck bool - GoDiff bool - - WatchFileChanges bool - InsertTextFormat protocol.InsertTextFormat - ConfigurationSupported bool - DynamicConfigurationSupported bool - DynamicWatchedFilesSupported bool - PreferredContentFormat protocol.MarkupKind - LineFoldingOnly bool - - SupportedCodeActions map[FileKind]map[protocol.CodeActionKind]bool - - SupportedCommands []string - - // TODO: Remove the option once we are certain there are no issues here. - TextDocumentSyncKind protocol.TextDocumentSyncKind - - Completion CompletionOptions - - ComputeEdits diff.ComputeEdits - - Analyzers []*analysis.Analyzer - - // LocalPrefix is used to specify goimports's -local behavior. - LocalPrefix string -} - -type CompletionOptions struct { - Deep bool - FuzzyMatching bool - CaseSensitive bool - Unimported bool - Documentation bool - FullDocumentation bool - Placeholders bool - - // Budget is the soft latency goal for completion requests. Most - // requests finish in a couple milliseconds, but in some cases deep - // completions can take much longer. As we use up our budget we - // dynamically reduce the search scope to ensure we return timely - // results. Zero means unlimited. - Budget time.Duration -} - -type HoverKind int - -const ( - SingleLine = HoverKind(iota) - NoDocumentation - SynopsisDocumentation - FullDocumentation - - // structured is an experimental setting that returns a structured hover format. - // This format separates the signature from the documentation, so that the client - // can do more manipulation of these fields. - // - // This should only be used by clients that support this behavior. - Structured -) - -type OptionResults []OptionResult - -type OptionResult struct { - Name string - Value interface{} - Error error - - State OptionState - Replacement string -} - -type OptionState int - -const ( - OptionHandled = OptionState(iota) - OptionDeprecated - OptionUnexpected -) - -func SetOptions(options *Options, opts interface{}) OptionResults { - var results OptionResults - switch opts := opts.(type) { - case nil: - case map[string]interface{}: - for name, value := range opts { - results = append(results, options.set(name, value)) - } - default: - results = append(results, OptionResult{ - Value: opts, - Error: errors.Errorf("Invalid options type %T", opts), - }) - } - return results -} - -func (o *Options) ForClientCapabilities(caps protocol.ClientCapabilities) { - // Check if the client supports snippets in completion items. - if c := caps.TextDocument.Completion; c != nil && c.CompletionItem != nil && c.CompletionItem.SnippetSupport { - o.InsertTextFormat = protocol.SnippetTextFormat - } - // Check if the client supports configuration messages. - o.ConfigurationSupported = caps.Workspace.Configuration - o.DynamicConfigurationSupported = caps.Workspace.DidChangeConfiguration.DynamicRegistration - o.DynamicWatchedFilesSupported = caps.Workspace.DidChangeWatchedFiles.DynamicRegistration - - // Check which types of content format are supported by this client. - if hover := caps.TextDocument.Hover; hover != nil && len(hover.ContentFormat) > 0 { - o.PreferredContentFormat = hover.ContentFormat[0] - } - // Check if the client supports only line folding. - if fr := caps.TextDocument.FoldingRange; fr != nil { - o.LineFoldingOnly = fr.LineFoldingOnly - } -} - -func (o *Options) set(name string, value interface{}) OptionResult { - result := OptionResult{Name: name, Value: value} - switch name { - case "env": - menv, ok := value.(map[string]interface{}) - if !ok { - result.errorf("invalid config gopls.env type %T", value) - break - } - for k, v := range menv { - o.Env = append(o.Env, fmt.Sprintf("%s=%s", k, v)) - } - - case "buildFlags": - iflags, ok := value.([]interface{}) - if !ok { - result.errorf("invalid config gopls.buildFlags type %T", value) - break - } - flags := make([]string, 0, len(iflags)) - for _, flag := range iflags { - flags = append(flags, fmt.Sprintf("%s", flag)) - } - o.BuildFlags = flags - - case "noIncrementalSync": - if v, ok := result.asBool(); ok && v { - o.TextDocumentSyncKind = protocol.Full - } - case "watchFileChanges": - result.setBool(&o.WatchFileChanges) - case "completionDocumentation": - result.setBool(&o.Completion.Documentation) - case "usePlaceholders": - result.setBool(&o.Completion.Placeholders) - case "deepCompletion": - result.setBool(&o.Completion.Deep) - case "fuzzyMatching": - result.setBool(&o.Completion.FuzzyMatching) - case "caseSensitiveCompletion": - result.setBool(&o.Completion.CaseSensitive) - case "completeUnimported": - result.setBool(&o.Completion.Unimported) - - case "hoverKind": - hoverKind, ok := value.(string) - if !ok { - result.errorf("invalid type %T for string option %q", value, name) - break - } - switch hoverKind { - case "NoDocumentation": - o.HoverKind = NoDocumentation - case "SingleLine": - o.HoverKind = SingleLine - case "SynopsisDocumentation": - o.HoverKind = SynopsisDocumentation - case "FullDocumentation": - o.HoverKind = FullDocumentation - case "Structured": - o.HoverKind = Structured - default: - result.errorf("Unsupported hover kind", tag.Of("HoverKind", hoverKind)) - } - - case "experimentalDisabledAnalyses": - disabledAnalyses, ok := value.([]interface{}) - if !ok { - result.errorf("Invalid type %T for []string option %q", value, name) - break - } - o.DisabledAnalyses = make(map[string]struct{}) - for _, a := range disabledAnalyses { - o.DisabledAnalyses[fmt.Sprint(a)] = struct{}{} - } - - case "staticcheck": - result.setBool(&o.StaticCheck) - - case "go-diff": - result.setBool(&o.GoDiff) - - case "local": - localPrefix, ok := value.(string) - if !ok { - result.errorf("invalid type %T for string option %q", value, name) - break - } - o.LocalPrefix = localPrefix - - // Deprecated settings. - case "wantSuggestedFixes": - result.State = OptionDeprecated - - case "disableDeepCompletion": - result.State = OptionDeprecated - result.Replacement = "deepCompletion" - - case "disableFuzzyMatching": - result.State = OptionDeprecated - result.Replacement = "fuzzyMatching" - - case "wantCompletionDocumentation": - result.State = OptionDeprecated - result.Replacement = "completionDocumentation" - - case "wantUnimportedCompletions": - result.State = OptionDeprecated - result.Replacement = "completeUnimported" - - default: - result.State = OptionUnexpected - } - return result -} - -func (r *OptionResult) errorf(msg string, values ...interface{}) { - r.Error = errors.Errorf(msg, values...) -} - -func (r *OptionResult) asBool() (bool, bool) { - b, ok := r.Value.(bool) - if !ok { - r.errorf("Invalid type %T for bool option %q", r.Value, r.Name) - return false, false - } - return b, true -} - -func (r *OptionResult) setBool(b *bool) { - if v, ok := r.asBool(); ok { - *b = v - } -} - -var defaultAnalyzers = []*analysis.Analyzer{ - // The traditional vet suite: - asmdecl.Analyzer, - assign.Analyzer, - atomic.Analyzer, - atomicalign.Analyzer, - bools.Analyzer, - buildtag.Analyzer, - cgocall.Analyzer, - composite.Analyzer, - copylock.Analyzer, - httpresponse.Analyzer, - loopclosure.Analyzer, - lostcancel.Analyzer, - nilfunc.Analyzer, - printf.Analyzer, - shift.Analyzer, - stdmethods.Analyzer, - structtag.Analyzer, - tests.Analyzer, - unmarshal.Analyzer, - unreachable.Analyzer, - unsafeptr.Analyzer, - unusedresult.Analyzer, - // Non-vet analyzers - sortslice.Analyzer, -} diff --git a/vendor/golang.org/x/tools/internal/lsp/source/references.go b/vendor/golang.org/x/tools/internal/lsp/source/references.go deleted file mode 100644 index 5fd20f822..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/source/references.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package source - -import ( - "context" - "go/ast" - "go/types" - - "golang.org/x/tools/internal/telemetry/trace" - errors "golang.org/x/xerrors" -) - -// ReferenceInfo holds information about reference to an identifier in Go source. -type ReferenceInfo struct { - Name string - mappedRange - ident *ast.Ident - obj types.Object - pkg Package - isDeclaration bool -} - -// References returns a list of references for a given identifier within the packages -// containing i.File. Declarations appear first in the result. -func (i *IdentifierInfo) References(ctx context.Context) ([]*ReferenceInfo, error) { - ctx, done := trace.StartSpan(ctx, "source.References") - defer done() - - var references []*ReferenceInfo - - // If the object declaration is nil, assume it is an import spec and do not look for references. - if i.Declaration.obj == nil { - return nil, errors.Errorf("no references for an import spec") - } - info := i.pkg.GetTypesInfo() - if info == nil { - return nil, errors.Errorf("package %s has no types info", i.pkg.PkgPath()) - } - if i.Declaration.wasImplicit { - // The definition is implicit, so we must add it separately. - // This occurs when the variable is declared in a type switch statement - // or is an implicit package name. Both implicits are local to a file. - references = append(references, &ReferenceInfo{ - Name: i.Declaration.obj.Name(), - mappedRange: i.Declaration.mappedRange, - obj: i.Declaration.obj, - pkg: i.pkg, - isDeclaration: true, - }) - } - for ident, obj := range info.Defs { - if obj == nil || !sameObj(obj, i.Declaration.obj) { - continue - } - rng, err := posToMappedRange(ctx, i.Snapshot.View(), i.pkg, ident.Pos(), ident.End()) - if err != nil { - return nil, err - } - // Add the declarations at the beginning of the references list. - references = append([]*ReferenceInfo{{ - Name: ident.Name, - ident: ident, - obj: obj, - pkg: i.pkg, - isDeclaration: true, - mappedRange: rng, - }}, references...) - } - for ident, obj := range info.Uses { - if obj == nil || !sameObj(obj, i.Declaration.obj) { - continue - } - rng, err := posToMappedRange(ctx, i.Snapshot.View(), i.pkg, ident.Pos(), ident.End()) - if err != nil { - return nil, err - } - references = append(references, &ReferenceInfo{ - Name: ident.Name, - ident: ident, - pkg: i.pkg, - obj: obj, - mappedRange: rng, - }) - } - return references, nil -} - -// sameObj returns true if obj is the same as declObj. -// Objects are the same if they have the some Pos and Name. -func sameObj(obj, declObj types.Object) bool { - // TODO(suzmue): support the case where an identifier may have two different - // declaration positions. - return obj.Pos() == declObj.Pos() && obj.Name() == declObj.Name() -} diff --git a/vendor/golang.org/x/tools/internal/lsp/source/rename.go b/vendor/golang.org/x/tools/internal/lsp/source/rename.go deleted file mode 100644 index d6b50f829..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/source/rename.go +++ /dev/null @@ -1,374 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package source - -import ( - "bytes" - "context" - "go/ast" - "go/format" - "go/token" - "go/types" - "regexp" - - "golang.org/x/tools/go/types/typeutil" - "golang.org/x/tools/internal/lsp/diff" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/telemetry/trace" - "golang.org/x/tools/refactor/satisfy" - errors "golang.org/x/xerrors" -) - -type renamer struct { - ctx context.Context - fset *token.FileSet - refs []*ReferenceInfo - objsToUpdate map[types.Object]bool - hadConflicts bool - errors string - from, to string - satisfyConstraints map[satisfy.Constraint]bool - packages map[*types.Package]Package // may include additional packages that are a rdep of pkg - msets typeutil.MethodSetCache - changeMethods bool -} - -type PrepareItem struct { - Range protocol.Range - Text string -} - -func PrepareRename(ctx context.Context, view View, f File, pos protocol.Position) (*PrepareItem, error) { - ctx, done := trace.StartSpan(ctx, "source.PrepareRename") - defer done() - - i, err := Identifier(ctx, view, f, pos) - if err != nil { - return nil, err - } - - // TODO(rstambler): We should handle this in a better way. - // If the object declaration is nil, assume it is an import spec. - if i.Declaration.obj == nil { - // Find the corresponding package name for this import spec - // and rename that instead. - ident, err := i.getPkgName(ctx) - if err != nil { - return nil, err - } - i = ident - } - - // Do not rename builtin identifiers. - if i.Declaration.obj.Parent() == types.Universe { - return nil, errors.Errorf("cannot rename builtin %q", i.Name) - } - rng, err := i.mappedRange.Range() - if err != nil { - return nil, err - } - return &PrepareItem{ - Range: rng, - Text: i.Name, - }, nil -} - -// Rename returns a map of TextEdits for each file modified when renaming a given identifier within a package. -func (i *IdentifierInfo) Rename(ctx context.Context, view View, newName string) (map[span.URI][]protocol.TextEdit, error) { - ctx, done := trace.StartSpan(ctx, "source.Rename") - defer done() - - // TODO(rstambler): We should handle this in a better way. - // If the object declaration is nil, assume it is an import spec. - if i.Declaration.obj == nil { - // Find the corresponding package name for this import spec - // and rename that instead. - ident, err := i.getPkgName(ctx) - if err != nil { - return nil, err - } - return ident.Rename(ctx, view, newName) - } - if i.Name == newName { - return nil, errors.Errorf("old and new names are the same: %s", newName) - } - if !isValidIdentifier(newName) { - return nil, errors.Errorf("invalid identifier to rename: %q", i.Name) - } - // Do not rename builtin identifiers. - if i.Declaration.obj.Parent() == types.Universe { - return nil, errors.Errorf("cannot rename builtin %q", i.Name) - } - if i.pkg == nil || i.pkg.IsIllTyped() { - return nil, errors.Errorf("package for %s is ill typed", i.File.File().Identity().URI) - } - // Do not rename identifiers declared in another package. - if i.pkg.GetTypes() != i.Declaration.obj.Pkg() { - return nil, errors.Errorf("failed to rename because %q is declared in package %q", i.Name, i.Declaration.obj.Pkg().Name()) - } - - refs, err := i.References(ctx) - if err != nil { - return nil, err - } - - r := renamer{ - ctx: ctx, - fset: view.Session().Cache().FileSet(), - refs: refs, - objsToUpdate: make(map[types.Object]bool), - from: i.Name, - to: newName, - packages: make(map[*types.Package]Package), - } - for _, from := range refs { - r.packages[from.pkg.GetTypes()] = from.pkg - } - - // Check that the renaming of the identifier is ok. - for _, ref := range refs { - r.check(ref.obj) - if r.hadConflicts { // one error is enough. - break - } - } - if r.hadConflicts { - return nil, errors.Errorf(r.errors) - } - - changes, err := r.update() - if err != nil { - return nil, err - } - result := make(map[span.URI][]protocol.TextEdit) - for uri, edits := range changes { - // These edits should really be associated with FileHandles for maximal correctness. - // For now, this is good enough. - f, err := view.GetFile(ctx, uri) - if err != nil { - return nil, err - } - fh := i.Snapshot.Handle(ctx, f) - data, _, err := fh.Read(ctx) - if err != nil { - return nil, err - } - converter := span.NewContentConverter(uri.Filename(), data) - m := &protocol.ColumnMapper{ - URI: uri, - Converter: converter, - Content: data, - } - // Sort the edits first. - diff.SortTextEdits(edits) - protocolEdits, err := ToProtocolEdits(m, edits) - if err != nil { - return nil, err - } - result[uri] = protocolEdits - } - return result, nil -} - -// getPkgName gets the pkg name associated with an identifer representing -// the import path in an import spec. -func (i *IdentifierInfo) getPkgName(ctx context.Context) (*IdentifierInfo, error) { - ph, err := i.pkg.File(i.URI()) - if err != nil { - return nil, err - } - file, _, _, err := ph.Cached() - if err != nil { - return nil, err - } - var namePos token.Pos - for _, spec := range file.Imports { - if spec.Path.Pos() == i.spanRange.Start { - namePos = spec.Pos() - break - } - } - if !namePos.IsValid() { - return nil, errors.Errorf("import spec not found for %q", i.Name) - } - // Look for the object defined at NamePos. - for _, obj := range i.pkg.GetTypesInfo().Defs { - pkgName, ok := obj.(*types.PkgName) - if ok && pkgName.Pos() == namePos { - return getPkgNameIdentifier(ctx, i, pkgName) - } - } - for _, obj := range i.pkg.GetTypesInfo().Implicits { - pkgName, ok := obj.(*types.PkgName) - if ok && pkgName.Pos() == namePos { - return getPkgNameIdentifier(ctx, i, pkgName) - } - } - return nil, errors.Errorf("no package name for %q", i.Name) -} - -// getPkgNameIdentifier returns an IdentifierInfo representing pkgName. -// pkgName must be in the same package and file as ident. -func getPkgNameIdentifier(ctx context.Context, ident *IdentifierInfo, pkgName *types.PkgName) (*IdentifierInfo, error) { - decl := Declaration{ - obj: pkgName, - wasImplicit: true, - } - var err error - if decl.mappedRange, err = objToMappedRange(ctx, ident.Snapshot.View(), ident.pkg, decl.obj); err != nil { - return nil, err - } - if decl.node, err = objToNode(ctx, ident.Snapshot.View(), ident.pkg, decl.obj); err != nil { - return nil, err - } - return &IdentifierInfo{ - Snapshot: ident.Snapshot, - Name: pkgName.Name(), - mappedRange: decl.mappedRange, - File: ident.File, - Declaration: decl, - pkg: ident.pkg, - wasEmbeddedField: false, - qf: ident.qf, - }, nil -} - -// Rename all references to the identifier. -func (r *renamer) update() (map[span.URI][]diff.TextEdit, error) { - result := make(map[span.URI][]diff.TextEdit) - seen := make(map[span.Span]bool) - - docRegexp, err := regexp.Compile(`\b` + r.from + `\b`) - if err != nil { - return nil, err - } - for _, ref := range r.refs { - refSpan, err := ref.spanRange.Span() - if err != nil { - return nil, err - } - if seen[refSpan] { - continue - } - seen[refSpan] = true - - // Renaming a types.PkgName may result in the addition or removal of an identifier, - // so we deal with this separately. - if pkgName, ok := ref.obj.(*types.PkgName); ok && ref.isDeclaration { - edit, err := r.updatePkgName(pkgName) - if err != nil { - return nil, err - } - result[refSpan.URI()] = append(result[refSpan.URI()], *edit) - continue - } - - // Replace the identifier with r.to. - edit := diff.TextEdit{ - Span: refSpan, - NewText: r.to, - } - - result[refSpan.URI()] = append(result[refSpan.URI()], edit) - - if !ref.isDeclaration || ref.ident == nil { // uses do not have doc comments to update. - continue - } - - doc := r.docComment(ref.pkg, ref.ident) - if doc == nil { - continue - } - - // Perform the rename in doc comments declared in the original package. - for _, comment := range doc.List { - for _, locs := range docRegexp.FindAllStringIndex(comment.Text, -1) { - rng := span.NewRange(r.fset, comment.Pos()+token.Pos(locs[0]), comment.Pos()+token.Pos(locs[1])) - spn, err := rng.Span() - if err != nil { - return nil, err - } - result[spn.URI()] = append(result[spn.URI()], diff.TextEdit{ - Span: spn, - NewText: r.to, - }) - } - } - } - - return result, nil -} - -// docComment returns the doc for an identifier. -func (r *renamer) docComment(pkg Package, id *ast.Ident) *ast.CommentGroup { - _, nodes, _ := pathEnclosingInterval(r.ctx, r.fset, pkg, id.Pos(), id.End()) - for _, node := range nodes { - switch decl := node.(type) { - case *ast.FuncDecl: - return decl.Doc - case *ast.Field: - return decl.Doc - case *ast.GenDecl: - return decl.Doc - // For {Type,Value}Spec, if the doc on the spec is absent, - // search for the enclosing GenDecl - case *ast.TypeSpec: - if decl.Doc != nil { - return decl.Doc - } - case *ast.ValueSpec: - if decl.Doc != nil { - return decl.Doc - } - case *ast.Ident: - default: - return nil - } - } - return nil -} - -// updatePkgName returns the updates to rename a pkgName in the import spec -func (r *renamer) updatePkgName(pkgName *types.PkgName) (*diff.TextEdit, error) { - // Modify ImportSpec syntax to add or remove the Name as needed. - pkg := r.packages[pkgName.Pkg()] - _, path, _ := pathEnclosingInterval(r.ctx, r.fset, pkg, pkgName.Pos(), pkgName.Pos()) - if len(path) < 2 { - return nil, errors.Errorf("no path enclosing interval for %s", pkgName.Name()) - } - spec, ok := path[1].(*ast.ImportSpec) - if !ok { - return nil, errors.Errorf("failed to update PkgName for %s", pkgName.Name()) - } - - var astIdent *ast.Ident // will be nil if ident is removed - if pkgName.Imported().Name() != r.to { - // ImportSpec.Name needed - astIdent = &ast.Ident{NamePos: spec.Path.Pos(), Name: r.to} - } - - // Make a copy of the ident that just has the name and path. - updated := &ast.ImportSpec{ - Name: astIdent, - Path: spec.Path, - EndPos: spec.EndPos, - } - - rng := span.NewRange(r.fset, spec.Pos(), spec.End()) - spn, err := rng.Span() - if err != nil { - return nil, err - } - - var buf bytes.Buffer - format.Node(&buf, r.fset, updated) - newText := buf.String() - - return &diff.TextEdit{ - Span: spn, - NewText: newText, - }, nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/source/rename_check.go b/vendor/golang.org/x/tools/internal/lsp/source/rename_check.go deleted file mode 100644 index 320771961..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/source/rename_check.go +++ /dev/null @@ -1,945 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. -// -// Taken from golang.org/x/tools/refactor/rename. - -package source - -import ( - "context" - "fmt" - "go/ast" - "go/token" - "go/types" - "reflect" - "strconv" - "strings" - "unicode" - - "golang.org/x/tools/go/ast/astutil" - "golang.org/x/tools/refactor/satisfy" -) - -// errorf reports an error (e.g. conflict) and prevents file modification. -func (r *renamer) errorf(pos token.Pos, format string, args ...interface{}) { - r.hadConflicts = true - r.errors += fmt.Sprintf(format, args...) -} - -// check performs safety checks of the renaming of the 'from' object to r.to. -func (r *renamer) check(from types.Object) { - if r.objsToUpdate[from] { - return - } - r.objsToUpdate[from] = true - - // NB: order of conditions is important. - if from_, ok := from.(*types.PkgName); ok { - r.checkInFileBlock(from_) - } else if from_, ok := from.(*types.Label); ok { - r.checkLabel(from_) - } else if isPackageLevel(from) { - r.checkInPackageBlock(from) - } else if v, ok := from.(*types.Var); ok && v.IsField() { - r.checkStructField(v) - } else if f, ok := from.(*types.Func); ok && recv(f) != nil { - r.checkMethod(f) - } else if isLocal(from) { - r.checkInLocalScope(from) - } else { - r.errorf(from.Pos(), "unexpected %s object %q (please report a bug)\n", - objectKind(from), from) - } -} - -// checkInFileBlock performs safety checks for renames of objects in the file block, -// i.e. imported package names. -func (r *renamer) checkInFileBlock(from *types.PkgName) { - // Check import name is not "init". - if r.to == "init" { - r.errorf(from.Pos(), "%q is not a valid imported package name", r.to) - } - - // Check for conflicts between file and package block. - if prev := from.Pkg().Scope().Lookup(r.to); prev != nil { - r.errorf(from.Pos(), "renaming this %s %q to %q would conflict", - objectKind(from), from.Name(), r.to) - r.errorf(prev.Pos(), "\twith this package member %s", - objectKind(prev)) - return // since checkInPackageBlock would report redundant errors - } - - // Check for conflicts in lexical scope. - r.checkInLexicalScope(from, r.packages[from.Pkg()]) -} - -// checkInPackageBlock performs safety checks for renames of -// func/var/const/type objects in the package block. -func (r *renamer) checkInPackageBlock(from types.Object) { - // Check that there are no references to the name from another - // package if the renaming would make it unexported. - if ast.IsExported(from.Name()) && !ast.IsExported(r.to) { - for typ, pkg := range r.packages { - if typ == from.Pkg() { - continue - } - if id := someUse(pkg.GetTypesInfo(), from); id != nil && - !r.checkExport(id, typ, from) { - break - } - } - } - - pkg := r.packages[from.Pkg()] - if pkg == nil { - return - } - - // Check that in the package block, "init" is a function, and never referenced. - if r.to == "init" { - kind := objectKind(from) - if kind == "func" { - // Reject if intra-package references to it exist. - for id, obj := range pkg.GetTypesInfo().Uses { - if obj == from { - r.errorf(from.Pos(), - "renaming this func %q to %q would make it a package initializer", - from.Name(), r.to) - r.errorf(id.Pos(), "\tbut references to it exist") - break - } - } - } else { - r.errorf(from.Pos(), "you cannot have a %s at package level named %q", - kind, r.to) - } - } - - // Check for conflicts between package block and all file blocks. - for _, f := range pkg.GetSyntax() { - fileScope := pkg.GetTypesInfo().Scopes[f] - b, prev := fileScope.LookupParent(r.to, token.NoPos) - if b == fileScope { - r.errorf(from.Pos(), "renaming this %s %q to %q would conflict", - objectKind(from), from.Name(), r.to) - r.errorf(prev.Pos(), "\twith this %s", - objectKind(prev)) - return // since checkInPackageBlock would report redundant errors - } - } - - // Check for conflicts in lexical scope. - if from.Exported() { - for _, pkg := range r.packages { - r.checkInLexicalScope(from, pkg) - } - } else { - r.checkInLexicalScope(from, pkg) - } -} - -func (r *renamer) checkInLocalScope(from types.Object) { - pkg := r.packages[from.Pkg()] - r.checkInLexicalScope(from, pkg) -} - -// checkInLexicalScope performs safety checks that a renaming does not -// change the lexical reference structure of the specified package. -// -// For objects in lexical scope, there are three kinds of conflicts: -// same-, sub-, and super-block conflicts. We will illustrate all three -// using this example: -// -// var x int -// var z int -// -// func f(y int) { -// print(x) -// print(y) -// } -// -// Renaming x to z encounters a SAME-BLOCK CONFLICT, because an object -// with the new name already exists, defined in the same lexical block -// as the old object. -// -// Renaming x to y encounters a SUB-BLOCK CONFLICT, because there exists -// a reference to x from within (what would become) a hole in its scope. -// The definition of y in an (inner) sub-block would cast a shadow in -// the scope of the renamed variable. -// -// Renaming y to x encounters a SUPER-BLOCK CONFLICT. This is the -// converse situation: there is an existing definition of the new name -// (x) in an (enclosing) super-block, and the renaming would create a -// hole in its scope, within which there exist references to it. The -// new name casts a shadow in scope of the existing definition of x in -// the super-block. -// -// Removing the old name (and all references to it) is always safe, and -// requires no checks. -// -func (r *renamer) checkInLexicalScope(from types.Object, pkg Package) { - b := from.Parent() // the block defining the 'from' object - if b != nil { - toBlock, to := b.LookupParent(r.to, from.Parent().End()) - if toBlock == b { - // same-block conflict - r.errorf(from.Pos(), "renaming this %s %q to %q", - objectKind(from), from.Name(), r.to) - r.errorf(to.Pos(), "\tconflicts with %s in same block", - objectKind(to)) - return - } else if toBlock != nil { - // Check for super-block conflict. - // The name r.to is defined in a superblock. - // Is that name referenced from within this block? - forEachLexicalRef(r.ctx, pkg, to, func(id *ast.Ident, block *types.Scope) bool { - _, obj := lexicalLookup(block, from.Name(), id.Pos()) - if obj == from { - // super-block conflict - r.errorf(from.Pos(), "renaming this %s %q to %q", - objectKind(from), from.Name(), r.to) - r.errorf(id.Pos(), "\twould shadow this reference") - r.errorf(to.Pos(), "\tto the %s declared here", - objectKind(to)) - return false // stop - } - return true - }) - } - } - // Check for sub-block conflict. - // Is there an intervening definition of r.to between - // the block defining 'from' and some reference to it? - forEachLexicalRef(r.ctx, pkg, from, func(id *ast.Ident, block *types.Scope) bool { - // Find the block that defines the found reference. - // It may be an ancestor. - fromBlock, _ := lexicalLookup(block, from.Name(), id.Pos()) - - // See what r.to would resolve to in the same scope. - toBlock, to := lexicalLookup(block, r.to, id.Pos()) - if to != nil { - // sub-block conflict - if deeper(toBlock, fromBlock) { - r.errorf(from.Pos(), "renaming this %s %q to %q", - objectKind(from), from.Name(), r.to) - r.errorf(id.Pos(), "\twould cause this reference to become shadowed") - r.errorf(to.Pos(), "\tby this intervening %s definition", - objectKind(to)) - return false // stop - } - } - return true - }) - - // Renaming a type that is used as an embedded field - // requires renaming the field too. e.g. - // type T int // if we rename this to U.. - // var s struct {T} - // print(s.T) // ...this must change too - if _, ok := from.(*types.TypeName); ok { - for id, obj := range pkg.GetTypesInfo().Uses { - if obj == from { - if field := pkg.GetTypesInfo().Defs[id]; field != nil { - r.check(field) - } - } - } - } -} - -// lexicalLookup is like (*types.Scope).LookupParent but respects the -// environment visible at pos. It assumes the relative position -// information is correct with each file. -func lexicalLookup(block *types.Scope, name string, pos token.Pos) (*types.Scope, types.Object) { - for b := block; b != nil; b = b.Parent() { - obj := b.Lookup(name) - // The scope of a package-level object is the entire package, - // so ignore pos in that case. - // No analogous clause is needed for file-level objects - // since no reference can appear before an import decl. - if obj != nil && (b == obj.Pkg().Scope() || obj.Pos() < pos) { - return b, obj - } - } - return nil, nil -} - -// deeper reports whether block x is lexically deeper than y. -func deeper(x, y *types.Scope) bool { - if x == y || x == nil { - return false - } else if y == nil { - return true - } else { - return deeper(x.Parent(), y.Parent()) - } -} - -// forEachLexicalRef calls fn(id, block) for each identifier id in package -// pkg that is a reference to obj in lexical scope. block is the -// lexical block enclosing the reference. If fn returns false the -// iteration is terminated and findLexicalRefs returns false. -func forEachLexicalRef(ctx context.Context, pkg Package, obj types.Object, fn func(id *ast.Ident, block *types.Scope) bool) bool { - ok := true - var stack []ast.Node - - var visit func(n ast.Node) bool - visit = func(n ast.Node) bool { - if n == nil { - stack = stack[:len(stack)-1] // pop - return false - } - if !ok { - return false // bail out - } - - stack = append(stack, n) // push - switch n := n.(type) { - case *ast.Ident: - if pkg.GetTypesInfo().Uses[n] == obj { - block := enclosingBlock(pkg.GetTypesInfo(), stack) - if !fn(n, block) { - ok = false - } - } - return visit(nil) // pop stack - - case *ast.SelectorExpr: - // don't visit n.Sel - ast.Inspect(n.X, visit) - return visit(nil) // pop stack, don't descend - - case *ast.CompositeLit: - // Handle recursion ourselves for struct literals - // so we don't visit field identifiers. - tv := pkg.GetTypesInfo().Types[n] - if _, ok := deref(tv.Type).Underlying().(*types.Struct); ok { - if n.Type != nil { - ast.Inspect(n.Type, visit) - } - for _, elt := range n.Elts { - if kv, ok := elt.(*ast.KeyValueExpr); ok { - ast.Inspect(kv.Value, visit) - } else { - ast.Inspect(elt, visit) - } - } - return visit(nil) // pop stack, don't descend - } - } - return true - } - - for _, f := range pkg.GetSyntax() { - ast.Inspect(f, visit) - if len(stack) != 0 { - panic(stack) - } - if !ok { - break - } - } - return ok -} - -// enclosingBlock returns the innermost block enclosing the specified -// AST node, specified in the form of a path from the root of the file, -// [file...n]. -func enclosingBlock(info *types.Info, stack []ast.Node) *types.Scope { - for i := range stack { - n := stack[len(stack)-1-i] - // For some reason, go/types always associates a - // function's scope with its FuncType. - // TODO(adonovan): feature or a bug? - switch f := n.(type) { - case *ast.FuncDecl: - n = f.Type - case *ast.FuncLit: - n = f.Type - } - if b := info.Scopes[n]; b != nil { - return b - } - } - panic("no Scope for *ast.File") -} - -func (r *renamer) checkLabel(label *types.Label) { - // Check there are no identical labels in the function's label block. - // (Label blocks don't nest, so this is easy.) - if prev := label.Parent().Lookup(r.to); prev != nil { - r.errorf(label.Pos(), "renaming this label %q to %q", label.Name(), prev.Name()) - r.errorf(prev.Pos(), "\twould conflict with this one") - } -} - -// checkStructField checks that the field renaming will not cause -// conflicts at its declaration, or ambiguity or changes to any selection. -func (r *renamer) checkStructField(from *types.Var) { - // Check that the struct declaration is free of field conflicts, - // and field/method conflicts. - - // go/types offers no easy way to get from a field (or interface - // method) to its declaring struct (or interface), so we must - // ascend the AST. - pkg, path, _ := pathEnclosingInterval(r.ctx, r.fset, r.packages[from.Pkg()], from.Pos(), from.Pos()) - if pkg == nil || path == nil { - return - } - // path matches this pattern: - // [Ident SelectorExpr? StarExpr? Field FieldList StructType ParenExpr* ... File] - - // Ascend to FieldList. - var i int - for { - if _, ok := path[i].(*ast.FieldList); ok { - break - } - i++ - } - i++ - tStruct := path[i].(*ast.StructType) - i++ - // Ascend past parens (unlikely). - for { - _, ok := path[i].(*ast.ParenExpr) - if !ok { - break - } - i++ - } - if spec, ok := path[i].(*ast.TypeSpec); ok { - // This struct is also a named type. - // We must check for direct (non-promoted) field/field - // and method/field conflicts. - named := pkg.GetTypesInfo().Defs[spec.Name].Type() - prev, indices, _ := types.LookupFieldOrMethod(named, true, pkg.GetTypes(), r.to) - if len(indices) == 1 { - r.errorf(from.Pos(), "renaming this field %q to %q", - from.Name(), r.to) - r.errorf(prev.Pos(), "\twould conflict with this %s", - objectKind(prev)) - return // skip checkSelections to avoid redundant errors - } - } else { - // This struct is not a named type. - // We need only check for direct (non-promoted) field/field conflicts. - T := pkg.GetTypesInfo().Types[tStruct].Type.Underlying().(*types.Struct) - for i := 0; i < T.NumFields(); i++ { - if prev := T.Field(i); prev.Name() == r.to { - r.errorf(from.Pos(), "renaming this field %q to %q", - from.Name(), r.to) - r.errorf(prev.Pos(), "\twould conflict with this field") - return // skip checkSelections to avoid redundant errors - } - } - } - - // Renaming an anonymous field requires renaming the type too. e.g. - // print(s.T) // if we rename T to U, - // type T int // this and - // var s struct {T} // this must change too. - if from.Anonymous() { - if named, ok := from.Type().(*types.Named); ok { - r.check(named.Obj()) - } else if named, ok := deref(from.Type()).(*types.Named); ok { - r.check(named.Obj()) - } - } - - // Check integrity of existing (field and method) selections. - r.checkSelections(from) -} - -// checkSelection checks that all uses and selections that resolve to -// the specified object would continue to do so after the renaming. -func (r *renamer) checkSelections(from types.Object) { - for typ, pkg := range r.packages { - if id := someUse(pkg.GetTypesInfo(), from); id != nil { - if !r.checkExport(id, typ, from) { - return - } - } - - for syntax, sel := range pkg.GetTypesInfo().Selections { - // There may be extant selections of only the old - // name or only the new name, so we must check both. - // (If neither, the renaming is sound.) - // - // In both cases, we wish to compare the lengths - // of the implicit field path (Selection.Index) - // to see if the renaming would change it. - // - // If a selection that resolves to 'from', when renamed, - // would yield a path of the same or shorter length, - // this indicates ambiguity or a changed referent, - // analogous to same- or sub-block lexical conflict. - // - // If a selection using the name 'to' would - // yield a path of the same or shorter length, - // this indicates ambiguity or shadowing, - // analogous to same- or super-block lexical conflict. - - // TODO(adonovan): fix: derive from Types[syntax.X].Mode - // TODO(adonovan): test with pointer, value, addressable value. - isAddressable := true - - if sel.Obj() == from { - if obj, indices, _ := types.LookupFieldOrMethod(sel.Recv(), isAddressable, from.Pkg(), r.to); obj != nil { - // Renaming this existing selection of - // 'from' may block access to an existing - // type member named 'to'. - delta := len(indices) - len(sel.Index()) - if delta > 0 { - continue // no ambiguity - } - r.selectionConflict(from, delta, syntax, obj) - return - } - - } else if sel.Obj().Name() == r.to { - if obj, indices, _ := types.LookupFieldOrMethod(sel.Recv(), isAddressable, from.Pkg(), from.Name()); obj == from { - // Renaming 'from' may cause this existing - // selection of the name 'to' to change - // its meaning. - delta := len(indices) - len(sel.Index()) - if delta > 0 { - continue // no ambiguity - } - r.selectionConflict(from, -delta, syntax, sel.Obj()) - return - } - } - } - } -} - -func (r *renamer) selectionConflict(from types.Object, delta int, syntax *ast.SelectorExpr, obj types.Object) { - r.errorf(from.Pos(), "renaming this %s %q to %q", - objectKind(from), from.Name(), r.to) - - switch { - case delta < 0: - // analogous to sub-block conflict - r.errorf(syntax.Sel.Pos(), - "\twould change the referent of this selection") - r.errorf(obj.Pos(), "\tof this %s", objectKind(obj)) - case delta == 0: - // analogous to same-block conflict - r.errorf(syntax.Sel.Pos(), - "\twould make this reference ambiguous") - r.errorf(obj.Pos(), "\twith this %s", objectKind(obj)) - case delta > 0: - // analogous to super-block conflict - r.errorf(syntax.Sel.Pos(), - "\twould shadow this selection") - r.errorf(obj.Pos(), "\tof the %s declared here", - objectKind(obj)) - } -} - -// checkMethod performs safety checks for renaming a method. -// There are three hazards: -// - declaration conflicts -// - selection ambiguity/changes -// - entailed renamings of assignable concrete/interface types. -// We reject renamings initiated at concrete methods if it would -// change the assignability relation. For renamings of abstract -// methods, we rename all methods transitively coupled to it via -// assignability. -func (r *renamer) checkMethod(from *types.Func) { - // e.g. error.Error - if from.Pkg() == nil { - r.errorf(from.Pos(), "you cannot rename built-in method %s", from) - return - } - - // ASSIGNABILITY: We reject renamings of concrete methods that - // would break a 'satisfy' constraint; but renamings of abstract - // methods are allowed to proceed, and we rename affected - // concrete and abstract methods as necessary. It is the - // initial method that determines the policy. - - // Check for conflict at point of declaration. - // Check to ensure preservation of assignability requirements. - R := recv(from).Type() - if isInterface(R) { - // Abstract method - - // declaration - prev, _, _ := types.LookupFieldOrMethod(R, false, from.Pkg(), r.to) - if prev != nil { - r.errorf(from.Pos(), "renaming this interface method %q to %q", - from.Name(), r.to) - r.errorf(prev.Pos(), "\twould conflict with this method") - return - } - - // Check all interfaces that embed this one for - // declaration conflicts too. - for _, pkg := range r.packages { - // Start with named interface types (better errors) - for _, obj := range pkg.GetTypesInfo().Defs { - if obj, ok := obj.(*types.TypeName); ok && isInterface(obj.Type()) { - f, _, _ := types.LookupFieldOrMethod( - obj.Type(), false, from.Pkg(), from.Name()) - if f == nil { - continue - } - t, _, _ := types.LookupFieldOrMethod( - obj.Type(), false, from.Pkg(), r.to) - if t == nil { - continue - } - r.errorf(from.Pos(), "renaming this interface method %q to %q", - from.Name(), r.to) - r.errorf(t.Pos(), "\twould conflict with this method") - r.errorf(obj.Pos(), "\tin named interface type %q", obj.Name()) - } - } - - // Now look at all literal interface types (includes named ones again). - for e, tv := range pkg.GetTypesInfo().Types { - if e, ok := e.(*ast.InterfaceType); ok { - _ = e - _ = tv.Type.(*types.Interface) - // TODO(adonovan): implement same check as above. - } - } - } - - // assignability - // - // Find the set of concrete or abstract methods directly - // coupled to abstract method 'from' by some - // satisfy.Constraint, and rename them too. - for key := range r.satisfy() { - // key = (lhs, rhs) where lhs is always an interface. - - lsel := r.msets.MethodSet(key.LHS).Lookup(from.Pkg(), from.Name()) - if lsel == nil { - continue - } - rmethods := r.msets.MethodSet(key.RHS) - rsel := rmethods.Lookup(from.Pkg(), from.Name()) - if rsel == nil { - continue - } - - // If both sides have a method of this name, - // and one of them is m, the other must be coupled. - var coupled *types.Func - switch from { - case lsel.Obj(): - coupled = rsel.Obj().(*types.Func) - case rsel.Obj(): - coupled = lsel.Obj().(*types.Func) - default: - continue - } - - // We must treat concrete-to-interface - // constraints like an implicit selection C.f of - // each interface method I.f, and check that the - // renaming leaves the selection unchanged and - // unambiguous. - // - // Fun fact: the implicit selection of C.f - // type I interface{f()} - // type C struct{I} - // func (C) g() - // var _ I = C{} // here - // yields abstract method I.f. This can make error - // messages less than obvious. - // - if !isInterface(key.RHS) { - // The logic below was derived from checkSelections. - - rtosel := rmethods.Lookup(from.Pkg(), r.to) - if rtosel != nil { - rto := rtosel.Obj().(*types.Func) - delta := len(rsel.Index()) - len(rtosel.Index()) - if delta < 0 { - continue // no ambiguity - } - - // TODO(adonovan): record the constraint's position. - keyPos := token.NoPos - - r.errorf(from.Pos(), "renaming this method %q to %q", - from.Name(), r.to) - if delta == 0 { - // analogous to same-block conflict - r.errorf(keyPos, "\twould make the %s method of %s invoked via interface %s ambiguous", - r.to, key.RHS, key.LHS) - r.errorf(rto.Pos(), "\twith (%s).%s", - recv(rto).Type(), r.to) - } else { - // analogous to super-block conflict - r.errorf(keyPos, "\twould change the %s method of %s invoked via interface %s", - r.to, key.RHS, key.LHS) - r.errorf(coupled.Pos(), "\tfrom (%s).%s", - recv(coupled).Type(), r.to) - r.errorf(rto.Pos(), "\tto (%s).%s", - recv(rto).Type(), r.to) - } - return // one error is enough - } - } - - if !r.changeMethods { - // This should be unreachable. - r.errorf(from.Pos(), "internal error: during renaming of abstract method %s", from) - r.errorf(coupled.Pos(), "\tchangedMethods=false, coupled method=%s", coupled) - r.errorf(from.Pos(), "\tPlease file a bug report") - return - } - - // Rename the coupled method to preserve assignability. - r.check(coupled) - } - } else { - // Concrete method - - // declaration - prev, indices, _ := types.LookupFieldOrMethod(R, true, from.Pkg(), r.to) - if prev != nil && len(indices) == 1 { - r.errorf(from.Pos(), "renaming this method %q to %q", - from.Name(), r.to) - r.errorf(prev.Pos(), "\twould conflict with this %s", - objectKind(prev)) - return - } - - // assignability - // - // Find the set of abstract methods coupled to concrete - // method 'from' by some satisfy.Constraint, and rename - // them too. - // - // Coupling may be indirect, e.g. I.f <-> C.f via type D. - // - // type I interface {f()} - // type C int - // type (C) f() - // type D struct{C} - // var _ I = D{} - // - for key := range r.satisfy() { - // key = (lhs, rhs) where lhs is always an interface. - if isInterface(key.RHS) { - continue - } - rsel := r.msets.MethodSet(key.RHS).Lookup(from.Pkg(), from.Name()) - if rsel == nil || rsel.Obj() != from { - continue // rhs does not have the method - } - lsel := r.msets.MethodSet(key.LHS).Lookup(from.Pkg(), from.Name()) - if lsel == nil { - continue - } - imeth := lsel.Obj().(*types.Func) - - // imeth is the abstract method (e.g. I.f) - // and key.RHS is the concrete coupling type (e.g. D). - if !r.changeMethods { - r.errorf(from.Pos(), "renaming this method %q to %q", - from.Name(), r.to) - var pos token.Pos - var iface string - - I := recv(imeth).Type() - if named, ok := I.(*types.Named); ok { - pos = named.Obj().Pos() - iface = "interface " + named.Obj().Name() - } else { - pos = from.Pos() - iface = I.String() - } - r.errorf(pos, "\twould make %s no longer assignable to %s", - key.RHS, iface) - r.errorf(imeth.Pos(), "\t(rename %s.%s if you intend to change both types)", - I, from.Name()) - return // one error is enough - } - - // Rename the coupled interface method to preserve assignability. - r.check(imeth) - } - } - - // Check integrity of existing (field and method) selections. - // We skip this if there were errors above, to avoid redundant errors. - r.checkSelections(from) -} - -func (r *renamer) checkExport(id *ast.Ident, pkg *types.Package, from types.Object) bool { - // Reject cross-package references if r.to is unexported. - // (Such references may be qualified identifiers or field/method - // selections.) - if !ast.IsExported(r.to) && pkg != from.Pkg() { - r.errorf(from.Pos(), - "renaming %q to %q would make it unexported", - from.Name(), r.to) - r.errorf(id.Pos(), "\tbreaking references from packages such as %q", - pkg.Path()) - return false - } - return true -} - -// satisfy returns the set of interface satisfaction constraints. -func (r *renamer) satisfy() map[satisfy.Constraint]bool { - if r.satisfyConstraints == nil { - // Compute on demand: it's expensive. - var f satisfy.Finder - for _, pkg := range r.packages { - // From satisfy.Finder documentation: - // - // The package must be free of type errors, and - // info.{Defs,Uses,Selections,Types} must have been populated by the - // type-checker. - // - // Only proceed if all packages have no errors. - if errs := pkg.GetErrors(); len(errs) > 0 { - r.errorf(token.NoPos, // we don't have a position for this error. - "renaming %q to %q not possible because %q has errors", - r.from, r.to, pkg.PkgPath()) - return nil - } - f.Find(pkg.GetTypesInfo(), pkg.GetSyntax()) - } - r.satisfyConstraints = f.Result - } - return r.satisfyConstraints -} - -// -- helpers ---------------------------------------------------------- - -// recv returns the method's receiver. -func recv(meth *types.Func) *types.Var { - return meth.Type().(*types.Signature).Recv() -} - -// someUse returns an arbitrary use of obj within info. -func someUse(info *types.Info, obj types.Object) *ast.Ident { - for id, o := range info.Uses { - if o == obj { - return id - } - } - return nil -} - -// pathEnclosingInterval returns the Package and ast.Node that -// contain source interval [start, end), and all the node's ancestors -// up to the AST root. It searches all ast.Files of all packages. -// exact is defined as for astutil.PathEnclosingInterval. -// -// The zero value is returned if not found. -// -func pathEnclosingInterval(ctx context.Context, fset *token.FileSet, pkg Package, start, end token.Pos) (resPkg Package, path []ast.Node, exact bool) { - var pkgs = []Package{pkg} - for _, f := range pkg.GetSyntax() { - for _, imp := range f.Imports { - if imp == nil { - continue - } - importPath, err := strconv.Unquote(imp.Path.Value) - if err != nil { - continue - } - importPkg, err := pkg.GetImport(importPath) - if err != nil { - return nil, nil, false - } - pkgs = append(pkgs, importPkg) - } - } - for _, p := range pkgs { - for _, f := range p.GetSyntax() { - if f.Pos() == token.NoPos { - // This can happen if the parser saw - // too many errors and bailed out. - // (Use parser.AllErrors to prevent that.) - continue - } - if !tokenFileContainsPos(fset.File(f.Pos()), start) { - continue - } - if path, exact := astutil.PathEnclosingInterval(f, start, end); path != nil { - return pkg, path, exact - } - } - } - return nil, nil, false -} - -// TODO(adonovan): make this a method: func (*token.File) Contains(token.Pos) -func tokenFileContainsPos(f *token.File, pos token.Pos) bool { - p := int(pos) - base := f.Base() - return base <= p && p < base+f.Size() -} - -func objectKind(obj types.Object) string { - switch obj := obj.(type) { - case *types.PkgName: - return "imported package name" - case *types.TypeName: - return "type" - case *types.Var: - if obj.IsField() { - return "field" - } - case *types.Func: - if obj.Type().(*types.Signature).Recv() != nil { - return "method" - } - } - // label, func, var, const - return strings.ToLower(strings.TrimPrefix(reflect.TypeOf(obj).String(), "*types.")) -} - -// NB: for renamings, blank is not considered valid. -func isValidIdentifier(id string) bool { - if id == "" || id == "_" { - return false - } - for i, r := range id { - if !isLetter(r) && (i == 0 || !isDigit(r)) { - return false - } - } - return token.Lookup(id) == token.IDENT -} - -// isLocal reports whether obj is local to some function. -// Precondition: not a struct field or interface method. -func isLocal(obj types.Object) bool { - // [... 5=stmt 4=func 3=file 2=pkg 1=universe] - var depth int - for scope := obj.Parent(); scope != nil; scope = scope.Parent() { - depth++ - } - return depth >= 4 -} - -func isPackageLevel(obj types.Object) bool { - return obj.Pkg().Scope().Lookup(obj.Name()) == obj -} - -// -- Plundered from golang.org/x/tools/go/ssa ----------------- - -func isInterface(T types.Type) bool { return types.IsInterface(T) } - -// -- Plundered from go/scanner: --------------------------------------- - -func isLetter(ch rune) bool { - return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' || ch >= 0x80 && unicode.IsLetter(ch) -} - -func isDigit(ch rune) bool { - return '0' <= ch && ch <= '9' || ch >= 0x80 && unicode.IsDigit(ch) -} diff --git a/vendor/golang.org/x/tools/internal/lsp/source/signature_help.go b/vendor/golang.org/x/tools/internal/lsp/source/signature_help.go deleted file mode 100644 index c884edab9..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/source/signature_help.go +++ /dev/null @@ -1,214 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package source - -import ( - "context" - "go/ast" - "go/doc" - "go/token" - "go/types" - - "golang.org/x/tools/go/ast/astutil" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/telemetry/trace" - errors "golang.org/x/xerrors" -) - -type SignatureInformation struct { - Label, Documentation string - Parameters []ParameterInformation - ActiveParameter int -} - -type ParameterInformation struct { - Label string -} - -func SignatureHelp(ctx context.Context, view View, f File, pos protocol.Position) (*SignatureInformation, error) { - ctx, done := trace.StartSpan(ctx, "source.SignatureHelp") - defer done() - - _, cphs, err := view.CheckPackageHandles(ctx, f) - if err != nil { - return nil, err - } - cph, err := NarrowestCheckPackageHandle(cphs) - if err != nil { - return nil, err - } - pkg, err := cph.Check(ctx) - if err != nil { - return nil, err - } - ph, err := pkg.File(f.URI()) - if err != nil { - return nil, err - } - file, m, _, err := ph.Cached() - if err != nil { - return nil, err - } - spn, err := m.PointSpan(pos) - if err != nil { - return nil, err - } - rng, err := spn.Range(m.Converter) - if err != nil { - return nil, err - } - // Find a call expression surrounding the query position. - var callExpr *ast.CallExpr - path, _ := astutil.PathEnclosingInterval(file, rng.Start, rng.Start) - if path == nil { - return nil, errors.Errorf("cannot find node enclosing position") - } -FindCall: - for _, node := range path { - switch node := node.(type) { - case *ast.CallExpr: - if rng.Start >= node.Lparen && rng.Start <= node.Rparen { - callExpr = node - break FindCall - } - case *ast.FuncLit, *ast.FuncType: - // The user is within an anonymous function, - // which may be the parameter to the *ast.CallExpr. - // Don't show signature help in this case. - return nil, errors.Errorf("no signature help within a function declaration") - } - } - if callExpr == nil || callExpr.Fun == nil { - return nil, errors.Errorf("cannot find an enclosing function") - } - - // Get the object representing the function, if available. - // There is no object in certain cases such as calling a function returned by - // a function (e.g. "foo()()"). - var obj types.Object - switch t := callExpr.Fun.(type) { - case *ast.Ident: - obj = pkg.GetTypesInfo().ObjectOf(t) - case *ast.SelectorExpr: - obj = pkg.GetTypesInfo().ObjectOf(t.Sel) - } - - // Handle builtin functions separately. - if obj, ok := obj.(*types.Builtin); ok { - return builtinSignature(ctx, view, callExpr, obj.Name(), rng.Start) - } - - // Get the type information for the function being called. - sigType := pkg.GetTypesInfo().TypeOf(callExpr.Fun) - if sigType == nil { - return nil, errors.Errorf("cannot get type for Fun %[1]T (%[1]v)", callExpr.Fun) - } - - sig, _ := sigType.Underlying().(*types.Signature) - if sig == nil { - return nil, errors.Errorf("cannot find signature for Fun %[1]T (%[1]v)", callExpr.Fun) - } - - qf := qualifier(file, pkg.GetTypes(), pkg.GetTypesInfo()) - params := formatParams(sig.Params(), sig.Variadic(), qf) - results, writeResultParens := formatResults(sig.Results(), qf) - activeParam := activeParameter(callExpr, sig.Params().Len(), sig.Variadic(), rng.Start) - - var ( - name string - comment *ast.CommentGroup - ) - if obj != nil { - node, err := objToNode(ctx, view, pkg, obj) - if err != nil { - return nil, err - } - rng, err := objToMappedRange(ctx, view, pkg, obj) - if err != nil { - return nil, err - } - decl := &Declaration{ - obj: obj, - mappedRange: rng, - node: node, - } - d, err := decl.hover(ctx) - if err != nil { - return nil, err - } - name = obj.Name() - comment = d.comment - } else { - name = "func" - } - return signatureInformation(name, comment, params, results, writeResultParens, activeParam), nil -} - -func builtinSignature(ctx context.Context, v View, callExpr *ast.CallExpr, name string, pos token.Pos) (*SignatureInformation, error) { - obj := v.BuiltinPackage().Lookup(name) - if obj == nil { - return nil, errors.Errorf("no object for %s", name) - } - decl, ok := obj.Decl.(*ast.FuncDecl) - if !ok { - return nil, errors.Errorf("no function declaration for builtin: %s", name) - } - params, _ := formatFieldList(ctx, v, decl.Type.Params) - results, writeResultParens := formatFieldList(ctx, v, decl.Type.Results) - - var ( - numParams int - variadic bool - ) - if decl.Type.Params.List != nil { - numParams = len(decl.Type.Params.List) - lastParam := decl.Type.Params.List[numParams-1] - if _, ok := lastParam.Type.(*ast.Ellipsis); ok { - variadic = true - } - } - activeParam := activeParameter(callExpr, numParams, variadic, pos) - return signatureInformation(name, nil, params, results, writeResultParens, activeParam), nil -} - -func signatureInformation(name string, comment *ast.CommentGroup, params, results []string, writeResultParens bool, activeParam int) *SignatureInformation { - paramInfo := make([]ParameterInformation, 0, len(params)) - for _, p := range params { - paramInfo = append(paramInfo, ParameterInformation{Label: p}) - } - label := name + formatFunction(params, results, writeResultParens) - var c string - if comment != nil { - c = doc.Synopsis(comment.Text()) - } - return &SignatureInformation{ - Label: label, - Documentation: c, - Parameters: paramInfo, - ActiveParameter: activeParam, - } -} - -func activeParameter(callExpr *ast.CallExpr, numParams int, variadic bool, pos token.Pos) int { - // Determine the query position relative to the number of parameters in the function. - var activeParam int - var start, end token.Pos - for _, expr := range callExpr.Args { - if start == token.NoPos { - start = expr.Pos() - } - end = expr.End() - if start <= pos && pos <= end { - break - } - - // Don't advance the active parameter for the last parameter of a variadic function. - if !variadic || activeParam < numParams-1 { - activeParam++ - } - start = expr.Pos() + 1 // to account for commas - } - return activeParam -} diff --git a/vendor/golang.org/x/tools/internal/lsp/source/suggested_fix.go b/vendor/golang.org/x/tools/internal/lsp/source/suggested_fix.go deleted file mode 100644 index d150341cd..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/source/suggested_fix.go +++ /dev/null @@ -1 +0,0 @@ -package source diff --git a/vendor/golang.org/x/tools/internal/lsp/source/symbols.go b/vendor/golang.org/x/tools/internal/lsp/source/symbols.go deleted file mode 100644 index 6bb5bf71a..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/source/symbols.go +++ /dev/null @@ -1,293 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package source - -import ( - "context" - "fmt" - "go/ast" - "go/types" - - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/telemetry/trace" -) - -func DocumentSymbols(ctx context.Context, view View, f File) ([]protocol.DocumentSymbol, error) { - ctx, done := trace.StartSpan(ctx, "source.DocumentSymbols") - defer done() - - _, cphs, err := view.CheckPackageHandles(ctx, f) - if err != nil { - return nil, err - } - cph, err := NarrowestCheckPackageHandle(cphs) - if err != nil { - return nil, err - } - pkg, err := cph.Check(ctx) - if err != nil { - return nil, err - } - ph, err := pkg.File(f.URI()) - if err != nil { - return nil, err - } - file, m, _, err := ph.Cached() - if err != nil { - return nil, err - } - - info := pkg.GetTypesInfo() - q := qualifier(file, pkg.GetTypes(), info) - - methodsToReceiver := make(map[types.Type][]protocol.DocumentSymbol) - symbolsToReceiver := make(map[types.Type]int) - var symbols []protocol.DocumentSymbol - for _, decl := range file.Decls { - switch decl := decl.(type) { - case *ast.FuncDecl: - if obj := info.ObjectOf(decl.Name); obj != nil { - if fs := funcSymbol(ctx, view, m, decl, obj, q); fs.Kind == protocol.Method { - // Store methods separately, as we want them to appear as children - // of the corresponding type (which we may not have seen yet). - rtype := obj.Type().(*types.Signature).Recv().Type() - methodsToReceiver[rtype] = append(methodsToReceiver[rtype], fs) - } else { - symbols = append(symbols, fs) - } - } - case *ast.GenDecl: - for _, spec := range decl.Specs { - switch spec := spec.(type) { - case *ast.TypeSpec: - if obj := info.ObjectOf(spec.Name); obj != nil { - ts := typeSymbol(ctx, view, m, info, spec, obj, q) - symbols = append(symbols, ts) - symbolsToReceiver[obj.Type()] = len(symbols) - 1 - } - case *ast.ValueSpec: - for _, name := range spec.Names { - if obj := info.ObjectOf(name); obj != nil { - symbols = append(symbols, varSymbol(ctx, view, m, decl, name, obj, q)) - } - } - } - } - } - } - - // Attempt to associate methods to the corresponding type symbol. - for typ, methods := range methodsToReceiver { - if ptr, ok := typ.(*types.Pointer); ok { - typ = ptr.Elem() - } - - if i, ok := symbolsToReceiver[typ]; ok { - symbols[i].Children = append(symbols[i].Children, methods...) - } else { - // The type definition for the receiver of these methods was not in the document. - symbols = append(symbols, methods...) - } - } - return symbols, nil -} - -func funcSymbol(ctx context.Context, view View, m *protocol.ColumnMapper, decl *ast.FuncDecl, obj types.Object, q types.Qualifier) protocol.DocumentSymbol { - s := protocol.DocumentSymbol{ - Name: obj.Name(), - Kind: protocol.Function, - } - if span, err := nodeToProtocolRange(ctx, view, m, decl); err == nil { - s.Range = span - } - if span, err := nodeToProtocolRange(ctx, view, m, decl.Name); err == nil { - s.SelectionRange = span - } - sig, _ := obj.Type().(*types.Signature) - if sig != nil { - if sig.Recv() != nil { - s.Kind = protocol.Method - } - s.Detail += "(" - for i := 0; i < sig.Params().Len(); i++ { - if i > 0 { - s.Detail += ", " - } - param := sig.Params().At(i) - label := types.TypeString(param.Type(), q) - if param.Name() != "" { - label = fmt.Sprintf("%s %s", param.Name(), label) - } - s.Detail += label - } - s.Detail += ")" - } - return s -} - -func setKind(s *protocol.DocumentSymbol, typ types.Type, q types.Qualifier) { - switch typ := typ.Underlying().(type) { - case *types.Interface: - s.Kind = protocol.Interface - case *types.Struct: - s.Kind = protocol.Struct - case *types.Signature: - s.Kind = protocol.Function - if typ.Recv() != nil { - s.Kind = protocol.Method - } - case *types.Named: - setKind(s, typ.Underlying(), q) - case *types.Basic: - i := typ.Info() - switch { - case i&types.IsNumeric != 0: - s.Kind = protocol.Number - case i&types.IsBoolean != 0: - s.Kind = protocol.Boolean - case i&types.IsString != 0: - s.Kind = protocol.String - } - default: - s.Kind = protocol.Variable - } -} - -func typeSymbol(ctx context.Context, view View, m *protocol.ColumnMapper, info *types.Info, spec *ast.TypeSpec, obj types.Object, q types.Qualifier) protocol.DocumentSymbol { - s := protocol.DocumentSymbol{ - Name: obj.Name(), - } - s.Detail, _ = formatType(obj.Type(), q) - setKind(&s, obj.Type(), q) - - if span, err := nodeToProtocolRange(ctx, view, m, spec); err == nil { - s.Range = span - } - if span, err := nodeToProtocolRange(ctx, view, m, spec.Name); err == nil { - s.SelectionRange = span - } - t, objIsStruct := obj.Type().Underlying().(*types.Struct) - st, specIsStruct := spec.Type.(*ast.StructType) - if objIsStruct && specIsStruct { - for i := 0; i < t.NumFields(); i++ { - f := t.Field(i) - child := protocol.DocumentSymbol{ - Name: f.Name(), - Kind: protocol.Field, - } - child.Detail, _ = formatType(f.Type(), q) - - spanNode, selectionNode := nodesForStructField(i, st) - if span, err := nodeToProtocolRange(ctx, view, m, spanNode); err == nil { - child.Range = span - } - if span, err := nodeToProtocolRange(ctx, view, m, selectionNode); err == nil { - child.SelectionRange = span - } - s.Children = append(s.Children, child) - } - } - - ti, objIsInterface := obj.Type().Underlying().(*types.Interface) - ai, specIsInterface := spec.Type.(*ast.InterfaceType) - if objIsInterface && specIsInterface { - for i := 0; i < ti.NumExplicitMethods(); i++ { - method := ti.ExplicitMethod(i) - child := protocol.DocumentSymbol{ - Name: method.Name(), - Kind: protocol.Method, - } - - var spanNode, selectionNode ast.Node - Methods: - for _, f := range ai.Methods.List { - for _, id := range f.Names { - if id.Name == method.Name() { - spanNode, selectionNode = f, id - break Methods - } - } - } - if span, err := nodeToProtocolRange(ctx, view, m, spanNode); err == nil { - child.Range = span - } - if span, err := nodeToProtocolRange(ctx, view, m, selectionNode); err == nil { - child.SelectionRange = span - } - s.Children = append(s.Children, child) - } - - for i := 0; i < ti.NumEmbeddeds(); i++ { - embedded := ti.EmbeddedType(i) - nt, isNamed := embedded.(*types.Named) - if !isNamed { - continue - } - - child := protocol.DocumentSymbol{ - Name: types.TypeString(embedded, q), - } - setKind(&child, embedded, q) - var spanNode, selectionNode ast.Node - Embeddeds: - for _, f := range ai.Methods.List { - if len(f.Names) > 0 { - continue - } - - if t := info.TypeOf(f.Type); types.Identical(nt, t) { - spanNode, selectionNode = f, f.Type - break Embeddeds - } - } - if rng, err := nodeToProtocolRange(ctx, view, m, spanNode); err == nil { - child.Range = rng - } - if span, err := nodeToProtocolRange(ctx, view, m, selectionNode); err == nil { - child.SelectionRange = span - } - s.Children = append(s.Children, child) - } - } - return s -} - -func nodesForStructField(i int, st *ast.StructType) (span, selection ast.Node) { - j := 0 - for _, field := range st.Fields.List { - if len(field.Names) == 0 { - if i == j { - return field, field.Type - } - j++ - continue - } - for _, name := range field.Names { - if i == j { - return field, name - } - j++ - } - } - return nil, nil -} - -func varSymbol(ctx context.Context, view View, m *protocol.ColumnMapper, decl ast.Node, name *ast.Ident, obj types.Object, q types.Qualifier) protocol.DocumentSymbol { - s := protocol.DocumentSymbol{ - Name: obj.Name(), - Kind: protocol.Variable, - } - if _, ok := obj.(*types.Const); ok { - s.Kind = protocol.Constant - } - if rng, err := nodeToProtocolRange(ctx, view, m, decl); err == nil { - s.Range = rng - } - if span, err := nodeToProtocolRange(ctx, view, m, name); err == nil { - s.SelectionRange = span - } - s.Detail = types.TypeString(obj.Type(), q) - return s -} diff --git a/vendor/golang.org/x/tools/internal/lsp/source/tidy.go b/vendor/golang.org/x/tools/internal/lsp/source/tidy.go deleted file mode 100644 index 476a32a42..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/source/tidy.go +++ /dev/null @@ -1,19 +0,0 @@ -package source - -import ( - "context" -) - -func ModTidy(ctx context.Context, view View) error { - cfg := view.Config(ctx) - - // Running `go mod tidy` modifies the file on disk directly. - // Ideally, we should return modules that could possibly be removed - // and apply each action as an edit. - // - // TODO(rstambler): This will be possible when golang/go#27005 is resolved. - if _, err := invokeGo(ctx, view.Folder().Filename(), cfg.Env, "mod", "tidy"); err != nil { - return err - } - return nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/source/util.go b/vendor/golang.org/x/tools/internal/lsp/source/util.go deleted file mode 100644 index e056a6ef5..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/source/util.go +++ /dev/null @@ -1,474 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package source - -import ( - "context" - "fmt" - "go/ast" - "go/token" - "go/types" - "path/filepath" - "regexp" - "strings" - - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/span" - errors "golang.org/x/xerrors" -) - -type mappedRange struct { - spanRange span.Range - m *protocol.ColumnMapper - - // protocolRange is the result of converting the spanRange using the mapper. - // It is computed on-demand. - protocolRange *protocol.Range -} - -func (s mappedRange) Range() (protocol.Range, error) { - if s.protocolRange == nil { - spn, err := s.spanRange.Span() - if err != nil { - return protocol.Range{}, err - } - prng, err := s.m.Range(spn) - if err != nil { - return protocol.Range{}, err - } - s.protocolRange = &prng - } - return *s.protocolRange, nil -} - -func (s mappedRange) Span() (span.Span, error) { - return s.spanRange.Span() -} - -func (s mappedRange) URI() span.URI { - return s.m.URI -} - -// NarrowestCheckPackageHandle picks the "narrowest" package for a given file. -// -// By "narrowest" package, we mean the package with the fewest number of files -// that includes the given file. This solves the problem of test variants, -// as the test will have more files than the non-test package. -func NarrowestCheckPackageHandle(handles []CheckPackageHandle) (CheckPackageHandle, error) { - if len(handles) < 1 { - return nil, errors.Errorf("no CheckPackageHandles") - } - result := handles[0] - for _, handle := range handles[1:] { - if result == nil || len(handle.Files()) < len(result.Files()) { - result = handle - } - } - if result == nil { - return nil, errors.Errorf("nil CheckPackageHandles have been returned") - } - return result, nil -} - -// WidestCheckPackageHandle returns the CheckPackageHandle containing the most files. -// -// This is useful for something like diagnostics, where we'd prefer to offer diagnostics -// for as many files as possible. -func WidestCheckPackageHandle(handles []CheckPackageHandle) (CheckPackageHandle, error) { - if len(handles) < 1 { - return nil, errors.Errorf("no CheckPackageHandles") - } - result := handles[0] - for _, handle := range handles[1:] { - if result == nil || len(handle.Files()) > len(result.Files()) { - result = handle - } - } - if result == nil { - return nil, errors.Errorf("nil CheckPackageHandles have been returned") - } - return result, nil -} - -func IsGenerated(ctx context.Context, view View, uri span.URI) bool { - f, err := view.GetFile(ctx, uri) - if err != nil { - return false - } - ph := view.Session().Cache().ParseGoHandle(view.Snapshot().Handle(ctx, f), ParseHeader) - parsed, _, _, err := ph.Parse(ctx) - if err != nil { - return false - } - tok := view.Session().Cache().FileSet().File(parsed.Pos()) - if tok == nil { - return false - } - for _, commentGroup := range parsed.Comments { - for _, comment := range commentGroup.List { - if matched := generatedRx.MatchString(comment.Text); matched { - // Check if comment is at the beginning of the line in source. - if pos := tok.Position(comment.Slash); pos.Column == 1 { - return true - } - } - } - } - return false -} - -func nodeToProtocolRange(ctx context.Context, view View, m *protocol.ColumnMapper, n ast.Node) (protocol.Range, error) { - mrng, err := nodeToMappedRange(ctx, view, m, n) - if err != nil { - return protocol.Range{}, err - } - return mrng.Range() -} - -func objToMappedRange(ctx context.Context, v View, pkg Package, obj types.Object) (mappedRange, error) { - if pkgName, ok := obj.(*types.PkgName); ok { - // An imported Go package has a package-local, unqualified name. - // When the name matches the imported package name, there is no - // identifier in the import spec with the local package name. - // - // For example: - // import "go/ast" // name "ast" matches package name - // import a "go/ast" // name "a" does not match package name - // - // When the identifier does not appear in the source, have the range - // of the object be the point at the beginning of the declaration. - if pkgName.Imported().Name() == pkgName.Name() { - return nameToMappedRange(ctx, v, pkg, obj.Pos(), "") - } - } - return nameToMappedRange(ctx, v, pkg, obj.Pos(), obj.Name()) -} - -func nameToMappedRange(ctx context.Context, v View, pkg Package, pos token.Pos, name string) (mappedRange, error) { - return posToMappedRange(ctx, v, pkg, pos, pos+token.Pos(len(name))) -} - -func nodeToMappedRange(ctx context.Context, view View, m *protocol.ColumnMapper, n ast.Node) (mappedRange, error) { - return posToRange(ctx, view, m, n.Pos(), n.End()) -} - -func posToMappedRange(ctx context.Context, v View, pkg Package, pos, end token.Pos) (mappedRange, error) { - m, err := posToMapper(ctx, v, pkg, pos) - if err != nil { - return mappedRange{}, err - } - return posToRange(ctx, v, m, pos, end) -} - -func posToRange(ctx context.Context, view View, m *protocol.ColumnMapper, pos, end token.Pos) (mappedRange, error) { - if !pos.IsValid() { - return mappedRange{}, errors.Errorf("invalid position for %v", pos) - } - if !end.IsValid() { - return mappedRange{}, errors.Errorf("invalid position for %v", end) - } - return mappedRange{ - m: m, - spanRange: span.NewRange(view.Session().Cache().FileSet(), pos, end), - }, nil -} - -func posToMapper(ctx context.Context, v View, pkg Package, pos token.Pos) (*protocol.ColumnMapper, error) { - posn := v.Session().Cache().FileSet().Position(pos) - ph, _, err := v.FindFileInPackage(ctx, span.FileURI(posn.Filename), pkg) - if err != nil { - return nil, err - } - _, m, _, err := ph.Cached() - return m, err -} - -// Matches cgo generated comment as well as the proposed standard: -// https://golang.org/s/generatedcode -var generatedRx = regexp.MustCompile(`// .*DO NOT EDIT\.?`) - -func DetectLanguage(langID, filename string) FileKind { - switch langID { - case "go": - return Go - case "go.mod": - return Mod - case "go.sum": - return Sum - } - // Fallback to detecting the language based on the file extension. - switch filepath.Ext(filename) { - case ".mod": - return Mod - case ".sum": - return Sum - default: // fallback to Go - return Go - } -} - -func (k FileKind) String() string { - switch k { - case Mod: - return "go.mod" - case Sum: - return "go.sum" - default: - return "go" - } -} - -// indexExprAtPos returns the index of the expression containing pos. -func indexExprAtPos(pos token.Pos, args []ast.Expr) int { - for i, expr := range args { - if expr.Pos() <= pos && pos <= expr.End() { - return i - } - } - return len(args) -} - -func exprAtPos(pos token.Pos, args []ast.Expr) ast.Expr { - for _, expr := range args { - if expr.Pos() <= pos && pos <= expr.End() { - return expr - } - } - return nil -} - -// fieldSelections returns the set of fields that can -// be selected from a value of type T. -func fieldSelections(T types.Type) (fields []*types.Var) { - // TODO(adonovan): this algorithm doesn't exclude ambiguous - // selections that match more than one field/method. - // types.NewSelectionSet should do that for us. - - seen := make(map[*types.Var]bool) // for termination on recursive types - - var visit func(T types.Type) - visit = func(T types.Type) { - if T, ok := deref(T).Underlying().(*types.Struct); ok { - for i := 0; i < T.NumFields(); i++ { - f := T.Field(i) - if seen[f] { - continue - } - seen[f] = true - fields = append(fields, f) - if f.Anonymous() { - visit(f.Type()) - } - } - } - } - visit(T) - - return fields -} - -// resolveInvalid traverses the node of the AST that defines the scope -// containing the declaration of obj, and attempts to find a user-friendly -// name for its invalid type. The resulting Object and its Type are fake. -func resolveInvalid(obj types.Object, node ast.Node, info *types.Info) types.Object { - // Construct a fake type for the object and return a fake object with this type. - formatResult := func(expr ast.Expr) types.Object { - var typename string - switch t := expr.(type) { - case *ast.SelectorExpr: - typename = fmt.Sprintf("%s.%s", t.X, t.Sel) - case *ast.Ident: - typename = t.String() - default: - return nil - } - typ := types.NewNamed(types.NewTypeName(token.NoPos, obj.Pkg(), typename, nil), types.Typ[types.Invalid], nil) - return types.NewVar(obj.Pos(), obj.Pkg(), obj.Name(), typ) - } - var resultExpr ast.Expr - ast.Inspect(node, func(node ast.Node) bool { - switch n := node.(type) { - case *ast.ValueSpec: - for _, name := range n.Names { - if info.Defs[name] == obj { - resultExpr = n.Type - } - } - return false - case *ast.Field: // This case handles parameters and results of a FuncDecl or FuncLit. - for _, name := range n.Names { - if info.Defs[name] == obj { - resultExpr = n.Type - } - } - return false - // TODO(rstambler): Handle range statements. - default: - return true - } - }) - return formatResult(resultExpr) -} - -func isPointer(T types.Type) bool { - _, ok := T.(*types.Pointer) - return ok -} - -// deref returns a pointer's element type; otherwise it returns typ. -func deref(typ types.Type) types.Type { - if p, ok := typ.Underlying().(*types.Pointer); ok { - return p.Elem() - } - return typ -} - -func isTypeName(obj types.Object) bool { - _, ok := obj.(*types.TypeName) - return ok -} - -func isFunc(obj types.Object) bool { - _, ok := obj.(*types.Func) - return ok -} - -func isEmptyInterface(T types.Type) bool { - intf, _ := T.(*types.Interface) - return intf != nil && intf.NumMethods() == 0 -} - -// isSelector returns the enclosing *ast.SelectorExpr when pos is in the -// selector. -func enclosingSelector(path []ast.Node, pos token.Pos) *ast.SelectorExpr { - if len(path) == 0 { - return nil - } - - if sel, ok := path[0].(*ast.SelectorExpr); ok { - return sel - } - - if _, ok := path[0].(*ast.Ident); ok && len(path) > 1 { - if sel, ok := path[1].(*ast.SelectorExpr); ok && pos >= sel.Sel.Pos() { - return sel - } - } - - return nil -} - -// typeConversion returns the type being converted to if call is a type -// conversion expression. -func typeConversion(call *ast.CallExpr, info *types.Info) types.Type { - var ident *ast.Ident - switch expr := call.Fun.(type) { - case *ast.Ident: - ident = expr - case *ast.SelectorExpr: - ident = expr.Sel - default: - return nil - } - - // Type conversion (e.g. "float64(foo)"). - if fun, _ := info.ObjectOf(ident).(*types.TypeName); fun != nil { - return fun.Type() - } - - return nil -} - -func formatParams(tup *types.Tuple, variadic bool, qf types.Qualifier) []string { - params := make([]string, 0, tup.Len()) - for i := 0; i < tup.Len(); i++ { - el := tup.At(i) - typ := types.TypeString(el.Type(), qf) - - // Handle a variadic parameter (can only be the final parameter). - if variadic && i == tup.Len()-1 { - typ = strings.Replace(typ, "[]", "...", 1) - } - - if el.Name() == "" { - params = append(params, typ) - } else { - params = append(params, el.Name()+" "+typ) - } - } - return params -} - -func formatResults(tup *types.Tuple, qf types.Qualifier) ([]string, bool) { - var writeResultParens bool - results := make([]string, 0, tup.Len()) - for i := 0; i < tup.Len(); i++ { - if i >= 1 { - writeResultParens = true - } - el := tup.At(i) - typ := types.TypeString(el.Type(), qf) - - if el.Name() == "" { - results = append(results, typ) - } else { - if i == 0 { - writeResultParens = true - } - results = append(results, el.Name()+" "+typ) - } - } - return results, writeResultParens -} - -// formatType returns the detail and kind for an object of type *types.TypeName. -func formatType(typ types.Type, qf types.Qualifier) (detail string, kind protocol.CompletionItemKind) { - if types.IsInterface(typ) { - detail = "interface{...}" - kind = protocol.InterfaceCompletion - } else if _, ok := typ.(*types.Struct); ok { - detail = "struct{...}" - kind = protocol.StructCompletion - } else if typ != typ.Underlying() { - detail, kind = formatType(typ.Underlying(), qf) - } else { - detail = types.TypeString(typ, qf) - kind = protocol.ClassCompletion - } - return detail, kind -} - -func formatFunction(params []string, results []string, writeResultParens bool) string { - var detail strings.Builder - - detail.WriteByte('(') - for i, p := range params { - if i > 0 { - detail.WriteString(", ") - } - detail.WriteString(p) - } - detail.WriteByte(')') - - // Add space between parameters and results. - if len(results) > 0 { - detail.WriteByte(' ') - } - - if writeResultParens { - detail.WriteByte('(') - } - for i, p := range results { - if i > 0 { - detail.WriteString(", ") - } - detail.WriteString(p) - } - if writeResultParens { - detail.WriteByte(')') - } - - return detail.String() -} diff --git a/vendor/golang.org/x/tools/internal/lsp/source/view.go b/vendor/golang.org/x/tools/internal/lsp/source/view.go deleted file mode 100644 index 747c9232e..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/source/view.go +++ /dev/null @@ -1,334 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package source - -import ( - "context" - "fmt" - "go/ast" - "go/token" - "go/types" - - "golang.org/x/tools/go/analysis" - "golang.org/x/tools/go/packages" - "golang.org/x/tools/internal/imports" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/span" -) - -// FileIdentity uniquely identifies a file at a version from a FileSystem. -type FileIdentity struct { - URI span.URI - Version string - Kind FileKind -} - -func (identity FileIdentity) String() string { - return fmt.Sprintf("%s%s%s", identity.URI, identity.Version, identity.Kind) -} - -// FileHandle represents a handle to a specific version of a single file from -// a specific file system. -type FileHandle interface { - // FileSystem returns the file system this handle was acquired from. - FileSystem() FileSystem - - // Identity returns the FileIdentity for the file. - Identity() FileIdentity - - // Read reads the contents of a file and returns it along with its hash value. - // If the file is not available, returns a nil slice and an error. - Read(ctx context.Context) ([]byte, string, error) -} - -// FileSystem is the interface to something that provides file contents. -type FileSystem interface { - // GetFile returns a handle for the specified file. - GetFile(uri span.URI, kind FileKind) FileHandle -} - -// FileKind describes the kind of the file in question. -// It can be one of Go, mod, or sum. -type FileKind int - -const ( - Go = FileKind(iota) - Mod - Sum - UnknownKind -) - -// ParseGoHandle represents a handle to the AST for a file. -type ParseGoHandle interface { - // File returns a file handle for which to get the AST. - File() FileHandle - - // Mode returns the parse mode of this handle. - Mode() ParseMode - - // Parse returns the parsed AST for the file. - // If the file is not available, returns nil and an error. - Parse(ctx context.Context) (*ast.File, *protocol.ColumnMapper, error, error) - - // Cached returns the AST for this handle, if it has already been stored. - Cached() (*ast.File, *protocol.ColumnMapper, error, error) -} - -// ParseMode controls the content of the AST produced when parsing a source file. -type ParseMode int - -const ( - // ParseHeader specifies that the main package declaration and imports are needed. - // This is the mode used when attempting to examine the package graph structure. - ParseHeader = ParseMode(iota) - - // ParseExported specifies that the public symbols are needed, but things like - // private symbols and function bodies are not. - // This mode is used for things where a package is being consumed only as a - // dependency. - ParseExported - - // ParseFull specifies the full AST is needed. - // This is used for files of direct interest where the entire contents must - // be considered. - ParseFull -) - -// CheckPackageHandle represents a handle to a specific version of a package. -// It is uniquely defined by the file handles that make up the package. -type CheckPackageHandle interface { - // ID returns the ID of the package associated with the CheckPackageHandle. - ID() string - - // ParseGoHandle returns a ParseGoHandle for which to get the package. - Files() []ParseGoHandle - - // Check returns the type-checked Package for the CheckPackageHandle. - Check(ctx context.Context) (Package, error) - - // Cached returns the Package for the CheckPackageHandle if it has already been stored. - Cached() (Package, error) - - // MissingDependencies reports any unresolved imports. - MissingDependencies() []string -} - -// Cache abstracts the core logic of dealing with the environment from the -// higher level logic that processes the information to produce results. -// The cache provides access to files and their contents, so the source -// package does not directly access the file system. -// A single cache is intended to be process wide, and is the primary point of -// sharing between all consumers. -// A cache may have many active sessions at any given time. -type Cache interface { - // A FileSystem that reads file contents from external storage. - FileSystem - - // NewSession creates a new Session manager and returns it. - NewSession(ctx context.Context) Session - - // FileSet returns the shared fileset used by all files in the system. - FileSet() *token.FileSet - - // ParseGoHandle returns a ParseGoHandle for the given file handle. - ParseGoHandle(fh FileHandle, mode ParseMode) ParseGoHandle -} - -// Session represents a single connection from a client. -// This is the level at which things like open files are maintained on behalf -// of the client. -// A session may have many active views at any given time. -type Session interface { - // NewView creates a new View and returns it. - NewView(ctx context.Context, name string, folder span.URI, options Options) View - - // Cache returns the cache that created this session. - Cache() Cache - - // View returns a view with a matching name, if the session has one. - View(name string) View - - // ViewOf returns a view corresponding to the given URI. - ViewOf(uri span.URI) View - - // Views returns the set of active views built by this session. - Views() []View - - // Shutdown the session and all views it has created. - Shutdown(ctx context.Context) - - // A FileSystem prefers the contents from overlays, and falls back to the - // content from the underlying cache if no overlay is present. - FileSystem - - // DidOpen is invoked each time a file is opened in the editor. - DidOpen(ctx context.Context, uri span.URI, kind FileKind, text []byte) error - - // DidSave is invoked each time an open file is saved in the editor. - DidSave(uri span.URI) - - // DidClose is invoked each time an open file is closed in the editor. - DidClose(uri span.URI) - - // IsOpen returns whether the editor currently has a file open. - IsOpen(uri span.URI) bool - - // Called to set the effective contents of a file from this session. - SetOverlay(uri span.URI, kind FileKind, data []byte) (wasFirstChange bool) - - // DidChangeOutOfBand is called when a file under the root folder changes. - // If the file was open in the editor, it returns true. - DidChangeOutOfBand(ctx context.Context, uri span.URI, change protocol.FileChangeType) bool - - // Options returns a copy of the SessionOptions for this session. - Options() Options - - // SetOptions sets the options of this session to new values. - SetOptions(Options) -} - -// View represents a single workspace. -// This is the level at which we maintain configuration like working directory -// and build tags. -type View interface { - // Session returns the session that created this view. - Session() Session - - // Name returns the name this view was constructed with. - Name() string - - // Folder returns the root folder for this view. - Folder() span.URI - - // BuiltinPackage returns the type information for the special "builtin" package. - BuiltinPackage() BuiltinPackage - - // GetFile returns the file object for a given URI, initializing it - // if it is not already part of the view. - GetFile(ctx context.Context, uri span.URI) (File, error) - - // FindFile returns the file object for a given URI if it is - // already part of the view. - FindFile(ctx context.Context, uri span.URI) File - - // Called to set the effective contents of a file from this view. - SetContent(ctx context.Context, uri span.URI, content []byte) (wasFirstChange bool, err error) - - // BackgroundContext returns a context used for all background processing - // on behalf of this view. - BackgroundContext() context.Context - - // Shutdown closes this view, and detaches it from it's session. - Shutdown(ctx context.Context) - - // Ignore returns true if this file should be ignored by this view. - Ignore(span.URI) bool - - // Config returns the configuration for the view. - Config(ctx context.Context) *packages.Config - - // RunProcessEnvFunc runs fn with the process env for this view inserted into opts. - // Note: the process env contains cached module and filesystem state. - RunProcessEnvFunc(ctx context.Context, fn func(*imports.Options) error, opts *imports.Options) error - - // Options returns a copy of the Options for this view. - Options() Options - - // SetOptions sets the options of this view to new values. - // Warning: Do not use this, unless in a test. - // This function does not correctly invalidate the view when needed. - SetOptions(Options) - - // CheckPackageHandles returns the CheckPackageHandles for the packages - // that this file belongs to. - CheckPackageHandles(ctx context.Context, f File) (Snapshot, []CheckPackageHandle, error) - - // GetActiveReverseDeps returns the active files belonging to the reverse - // dependencies of this file's package. - GetActiveReverseDeps(ctx context.Context, f File) []CheckPackageHandle - - // FindFileInPackage returns the AST and type information for a file that may - // belong to or be part of a dependency of the given package. - FindFileInPackage(ctx context.Context, uri span.URI, pkg Package) (ParseGoHandle, Package, error) - - // Snapshot returns the current snapshot for the view. - Snapshot() Snapshot -} - -// Snapshot represents the current state for the given view. -type Snapshot interface { - // Handle returns the FileHandle for the given file. - Handle(ctx context.Context, f File) FileHandle - - // View returns the View associated with this snapshot. - View() View - - // Analyze runs the analyses for the given package at this snapshot. - Analyze(ctx context.Context, id string, analyzers []*analysis.Analyzer) ([]*Error, error) - - // FindAnalysisError returns the analysis error represented by the diagnostic. - // This is used to get the SuggestedFixes associated with that error. - FindAnalysisError(ctx context.Context, id string, diag protocol.Diagnostic) (*Error, error) - - // CheckPackageHandles returns the CheckPackageHandles for the packages - // that this file belongs to. - CheckPackageHandles(ctx context.Context, f File) ([]CheckPackageHandle, error) - - // KnownImportPaths returns all the packages loaded in this snapshot, - // indexed by their import path. - KnownImportPaths() map[string]Package -} - -// File represents a source file of any type. -type File interface { - URI() span.URI - Kind() FileKind -} - -// Package represents a Go package that has been type-checked. It maintains -// only the relevant fields of a *go/packages.Package. -type Package interface { - ID() string - PkgPath() string - Files() []ParseGoHandle - File(uri span.URI) (ParseGoHandle, error) - GetSyntax() []*ast.File - GetErrors() []*Error - GetTypes() *types.Package - GetTypesInfo() *types.Info - GetTypesSizes() types.Sizes - IsIllTyped() bool - GetImport(pkgPath string) (Package, error) - Imports() []Package -} - -type Error struct { - URI span.URI - Range protocol.Range - Kind ErrorKind - Message string - Category string // only used by analysis errors so far - SuggestedFixes []SuggestedFix - Related []RelatedInformation -} - -type ErrorKind int - -const ( - UnknownError = ErrorKind(iota) - ListError - ParseError - TypeError - Analysis -) - -func (e *Error) Error() string { - return fmt.Sprintf("%s:%s: %s", e.URI, e.Range, e.Message) -} - -type BuiltinPackage interface { - Lookup(name string) *ast.Object - Files() []ParseGoHandle -} diff --git a/vendor/golang.org/x/tools/internal/lsp/symbols.go b/vendor/golang.org/x/tools/internal/lsp/symbols.go deleted file mode 100644 index 66f1654e6..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/symbols.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package lsp - -import ( - "context" - - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/telemetry/trace" -) - -func (s *Server) documentSymbol(ctx context.Context, params *protocol.DocumentSymbolParams) ([]protocol.DocumentSymbol, error) { - ctx, done := trace.StartSpan(ctx, "lsp.Server.documentSymbol") - defer done() - - uri := span.NewURI(params.TextDocument.URI) - view := s.session.ViewOf(uri) - f, err := view.GetFile(ctx, uri) - if err != nil { - return nil, err - } - return source.DocumentSymbols(ctx, view, f) -} diff --git a/vendor/golang.org/x/tools/internal/lsp/telemetry/telemetry.go b/vendor/golang.org/x/tools/internal/lsp/telemetry/telemetry.go deleted file mode 100644 index ae4c24674..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/telemetry/telemetry.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package telemetry provides the hooks and adapters to allow use of telemetry -// throughout gopls. -package telemetry - -import ( - "golang.org/x/tools/internal/telemetry/stats" - "golang.org/x/tools/internal/telemetry/tag" - "golang.org/x/tools/internal/telemetry/unit" -) - -const ( - // create the tag keys we use - Method = tag.Key("method") - StatusCode = tag.Key("status.code") - StatusMessage = tag.Key("status.message") - RPCID = tag.Key("id") - RPCDirection = tag.Key("direction") - File = tag.Key("file") - URI = tag.Key("URI") - Package = tag.Key("package") - PackagePath = tag.Key("package_path") -) - -var ( - // create the stats we measure - Started = stats.Int64("started", "Count of started RPCs.", unit.Dimensionless) - ReceivedBytes = stats.Int64("received_bytes", "Bytes received.", unit.Bytes) - SentBytes = stats.Int64("sent_bytes", "Bytes sent.", unit.Bytes) - Latency = stats.Float64("latency_ms", "Elapsed time in milliseconds", unit.Milliseconds) -) - -const ( - Inbound = "in" - Outbound = "out" -) diff --git a/vendor/golang.org/x/tools/internal/lsp/tests/completion.go b/vendor/golang.org/x/tools/internal/lsp/tests/completion.go deleted file mode 100644 index 8936e506b..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/tests/completion.go +++ /dev/null @@ -1,172 +0,0 @@ -package tests - -import ( - "bytes" - "fmt" - "sort" - "strings" - - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" -) - -func ToProtocolCompletionItems(items []source.CompletionItem) []protocol.CompletionItem { - var result []protocol.CompletionItem - for _, item := range items { - result = append(result, ToProtocolCompletionItem(item)) - } - return result -} - -func ToProtocolCompletionItem(item source.CompletionItem) protocol.CompletionItem { - pItem := protocol.CompletionItem{ - Label: item.Label, - Kind: item.Kind, - Detail: item.Detail, - Documentation: item.Documentation, - InsertText: item.InsertText, - TextEdit: &protocol.TextEdit{ - NewText: item.Snippet(), - }, - } - if pItem.InsertText == "" { - pItem.InsertText = pItem.Label - } - return pItem -} - -func FilterBuiltins(items []protocol.CompletionItem) []protocol.CompletionItem { - var got []protocol.CompletionItem - for _, item := range items { - if isBuiltin(item.Label, item.Detail, item.Kind) { - continue - } - got = append(got, item) - } - return got -} - -func isBuiltin(label, detail string, kind protocol.CompletionItemKind) bool { - if detail == "" && kind == protocol.ClassCompletion { - return true - } - // Remaining builtin constants, variables, interfaces, and functions. - trimmed := label - if i := strings.Index(trimmed, "("); i >= 0 { - trimmed = trimmed[:i] - } - switch trimmed { - case "append", "cap", "close", "complex", "copy", "delete", - "error", "false", "imag", "iota", "len", "make", "new", - "nil", "panic", "print", "println", "real", "recover", "true": - return true - } - return false -} - -func CheckCompletionOrder(want, got []protocol.CompletionItem) string { - var ( - matchedIdxs []int - lastGotIdx int - inOrder = true - ) - for _, w := range want { - var found bool - for i, g := range got { - if w.Label == g.Label && w.Detail == g.Detail && w.Kind == g.Kind { - matchedIdxs = append(matchedIdxs, i) - found = true - if i < lastGotIdx { - inOrder = false - } - lastGotIdx = i - break - } - } - if !found { - return summarizeCompletionItems(-1, []protocol.CompletionItem{w}, got, "didn't find expected completion") - } - } - - sort.Ints(matchedIdxs) - matched := make([]protocol.CompletionItem, 0, len(matchedIdxs)) - for _, idx := range matchedIdxs { - matched = append(matched, got[idx]) - } - - if !inOrder { - return summarizeCompletionItems(-1, want, matched, "completions out of order") - } - - return "" -} - -func DiffSnippets(want string, got *protocol.CompletionItem) string { - if want == "" { - if got != nil { - return fmt.Sprintf("expected no snippet but got %s", got.TextEdit.NewText) - } - } else { - if got == nil { - return fmt.Sprintf("couldn't find completion matching %q", want) - } - if want != got.TextEdit.NewText { - return fmt.Sprintf("expected snippet %q, got %q", want, got.TextEdit.NewText) - } - } - return "" -} - -func FindItem(list []protocol.CompletionItem, want source.CompletionItem) *protocol.CompletionItem { - for _, item := range list { - if item.Label == want.Label { - return &item - } - } - return nil -} - -// DiffCompletionItems prints the diff between expected and actual completion -// test results. -func DiffCompletionItems(want, got []protocol.CompletionItem) string { - if len(got) != len(want) { - return summarizeCompletionItems(-1, want, got, "different lengths got %v want %v", len(got), len(want)) - } - for i, w := range want { - g := got[i] - if w.Label != g.Label { - return summarizeCompletionItems(i, want, got, "incorrect Label got %v want %v", g.Label, w.Label) - } - if w.Detail != g.Detail { - return summarizeCompletionItems(i, want, got, "incorrect Detail got %v want %v", g.Detail, w.Detail) - } - if w.Documentation != "" && !strings.HasPrefix(w.Documentation, "@") { - if w.Documentation != g.Documentation { - return summarizeCompletionItems(i, want, got, "incorrect Documentation got %v want %v", g.Documentation, w.Documentation) - } - } - if w.Kind != g.Kind { - return summarizeCompletionItems(i, want, got, "incorrect Kind got %v want %v", g.Kind, w.Kind) - } - } - return "" -} - -func summarizeCompletionItems(i int, want, got []protocol.CompletionItem, reason string, args ...interface{}) string { - msg := &bytes.Buffer{} - fmt.Fprint(msg, "completion failed") - if i >= 0 { - fmt.Fprintf(msg, " at %d", i) - } - fmt.Fprint(msg, " because of ") - fmt.Fprintf(msg, reason, args...) - fmt.Fprint(msg, ":\nexpected:\n") - for _, d := range want { - fmt.Fprintf(msg, " %v\n", d) - } - fmt.Fprintf(msg, "got:\n") - for _, d := range got { - fmt.Fprintf(msg, " %v\n", d) - } - return msg.String() -} diff --git a/vendor/golang.org/x/tools/internal/lsp/tests/diagnostics.go b/vendor/golang.org/x/tools/internal/lsp/tests/diagnostics.go deleted file mode 100644 index 92f948c1f..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/tests/diagnostics.go +++ /dev/null @@ -1,90 +0,0 @@ -package tests - -import ( - "bytes" - "fmt" - "sort" - "strings" - - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" -) - -// DiffDiagnostics prints the diff between expected and actual diagnostics test -// results. -func DiffDiagnostics(want, got []source.Diagnostic) string { - sortDiagnostics(want) - sortDiagnostics(got) - - if len(got) != len(want) { - return summarizeDiagnostics(-1, want, got, "different lengths got %v want %v", len(got), len(want)) - } - for i, w := range want { - g := got[i] - if w.Message != g.Message { - return summarizeDiagnostics(i, want, got, "incorrect Message got %v want %v", g.Message, w.Message) - } - if w.Severity != g.Severity { - return summarizeDiagnostics(i, want, got, "incorrect Severity got %v want %v", g.Severity, w.Severity) - } - if w.Source != g.Source { - return summarizeDiagnostics(i, want, got, "incorrect Source got %v want %v", g.Source, w.Source) - } - // Don't check the range on the badimport test. - if strings.Contains(string(g.URI), "badimport") { - continue - } - if protocol.ComparePosition(w.Range.Start, g.Range.Start) != 0 { - return summarizeDiagnostics(i, want, got, "incorrect Start got %v want %v", g.Range.Start, w.Range.Start) - } - if !protocol.IsPoint(g.Range) { // Accept any 'want' range if the diagnostic returns a zero-length range. - if protocol.ComparePosition(w.Range.End, g.Range.End) != 0 { - return summarizeDiagnostics(i, want, got, "incorrect End got %v want %v", g.Range.End, w.Range.End) - } - } - } - return "" -} - -func sortDiagnostics(d []source.Diagnostic) { - sort.Slice(d, func(i int, j int) bool { - return compareDiagnostic(d[i], d[j]) < 0 - }) -} - -func compareDiagnostic(a, b source.Diagnostic) int { - if r := span.CompareURI(a.URI, b.URI); r != 0 { - return r - } - if r := protocol.CompareRange(a.Range, b.Range); r != 0 { - return r - } - if a.Message < b.Message { - return -1 - } - if a.Message == b.Message { - return 0 - } else { - return 1 - } -} - -func summarizeDiagnostics(i int, want []source.Diagnostic, got []source.Diagnostic, reason string, args ...interface{}) string { - msg := &bytes.Buffer{} - fmt.Fprint(msg, "diagnostics failed") - if i >= 0 { - fmt.Fprintf(msg, " at %d", i) - } - fmt.Fprint(msg, " because of ") - fmt.Fprintf(msg, reason, args...) - fmt.Fprint(msg, ":\nexpected:\n") - for _, d := range want { - fmt.Fprintf(msg, " %s:%v: %s\n", d.URI, d.Range, d.Message) - } - fmt.Fprintf(msg, "got:\n") - for _, d := range got { - fmt.Fprintf(msg, " %s:%v: %s\n", d.URI, d.Range, d.Message) - } - return msg.String() -} diff --git a/vendor/golang.org/x/tools/internal/lsp/tests/links.go b/vendor/golang.org/x/tools/internal/lsp/tests/links.go deleted file mode 100644 index 07fc3ef17..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/tests/links.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package tests - -import ( - "fmt" - "go/token" - - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/span" -) - -// DiffLinks takes the links we got and checks if they are located within the source or a Note. -// If the link is within a Note, the link is removed. -// Returns an diff comment if there are differences and empty string if no diffs -func DiffLinks(mapper *protocol.ColumnMapper, wantLinks []Link, gotLinks []protocol.DocumentLink) string { - var notePositions []token.Position - links := make(map[span.Span]string, len(wantLinks)) - for _, link := range wantLinks { - links[link.Src] = link.Target - notePositions = append(notePositions, link.NotePosition) - } - for _, link := range gotLinks { - spn, err := mapper.RangeSpan(link.Range) - if err != nil { - return fmt.Sprintf("%v", err) - } - linkInNote := false - for _, notePosition := range notePositions { - // Drop the links found inside expectation notes arguments as this links are not collected by expect package - if notePosition.Line == spn.Start().Line() && - notePosition.Column <= spn.Start().Column() { - delete(links, spn) - linkInNote = true - } - } - if linkInNote { - continue - } - if target, ok := links[spn]; ok { - delete(links, spn) - if target != link.Target { - return fmt.Sprintf("for %v want %v, got %v\n", spn, link.Target, target) - } - } else { - return fmt.Sprintf("unexpected link %v:%v\n", spn, link.Target) - } - } - for spn, target := range links { - return fmt.Sprintf("missing link %v:%v\n", spn, target) - } - return "" -} diff --git a/vendor/golang.org/x/tools/internal/lsp/tests/tests.go b/vendor/golang.org/x/tools/internal/lsp/tests/tests.go deleted file mode 100644 index 4b47ff618..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/tests/tests.go +++ /dev/null @@ -1,922 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package tests exports functionality to be used across a variety of gopls tests. -package tests - -import ( - "bytes" - "context" - "flag" - "fmt" - "go/ast" - "go/token" - "io/ioutil" - "path/filepath" - "sort" - "strings" - "sync" - "testing" - - "golang.org/x/tools/go/expect" - "golang.org/x/tools/go/packages" - "golang.org/x/tools/go/packages/packagestest" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/txtar" -) - -const ( - overlayFileSuffix = ".overlay" - goldenFileSuffix = ".golden" - inFileSuffix = ".in" - testModule = "golang.org/x/tools/internal/lsp" -) - -var UpdateGolden = flag.Bool("golden", false, "Update golden files") - -type Diagnostics map[span.URI][]source.Diagnostic -type CompletionItems map[token.Pos]*source.CompletionItem -type Completions map[span.Span]Completion -type CompletionSnippets map[span.Span]CompletionSnippet -type UnimportedCompletions map[span.Span]Completion -type DeepCompletions map[span.Span]Completion -type FuzzyCompletions map[span.Span]Completion -type CaseSensitiveCompletions map[span.Span]Completion -type RankCompletions map[span.Span]Completion -type FoldingRanges []span.Span -type Formats []span.Span -type Imports []span.Span -type SuggestedFixes []span.Span -type Definitions map[span.Span]Definition -type Implementationses map[span.Span]Implementations -type Highlights map[string][]span.Span -type References map[span.Span][]span.Span -type Renames map[span.Span]string -type PrepareRenames map[span.Span]*source.PrepareItem -type Symbols map[span.URI][]protocol.DocumentSymbol -type SymbolsChildren map[string][]protocol.DocumentSymbol -type Signatures map[span.Span]*source.SignatureInformation -type Links map[span.URI][]Link - -type Data struct { - Config packages.Config - Exported *packagestest.Exported - Diagnostics Diagnostics - CompletionItems CompletionItems - Completions Completions - CompletionSnippets CompletionSnippets - UnimportedCompletions UnimportedCompletions - DeepCompletions DeepCompletions - FuzzyCompletions FuzzyCompletions - CaseSensitiveCompletions CaseSensitiveCompletions - RankCompletions RankCompletions - FoldingRanges FoldingRanges - Formats Formats - Imports Imports - SuggestedFixes SuggestedFixes - Definitions Definitions - Implementationses Implementationses - Highlights Highlights - References References - Renames Renames - PrepareRenames PrepareRenames - Symbols Symbols - symbolsChildren SymbolsChildren - Signatures Signatures - Links Links - - t testing.TB - fragments map[string]string - dir string - golden map[string]*Golden - - mappersMu sync.Mutex - mappers map[span.URI]*protocol.ColumnMapper -} - -type Tests interface { - Diagnostics(*testing.T, span.URI, []source.Diagnostic) - Completion(*testing.T, span.Span, Completion, CompletionItems) - CompletionSnippet(*testing.T, span.Span, CompletionSnippet, bool, CompletionItems) - UnimportedCompletion(*testing.T, span.Span, Completion, CompletionItems) - DeepCompletion(*testing.T, span.Span, Completion, CompletionItems) - FuzzyCompletion(*testing.T, span.Span, Completion, CompletionItems) - CaseSensitiveCompletion(*testing.T, span.Span, Completion, CompletionItems) - RankCompletion(*testing.T, span.Span, Completion, CompletionItems) - FoldingRange(*testing.T, span.Span) - Format(*testing.T, span.Span) - Import(*testing.T, span.Span) - SuggestedFix(*testing.T, span.Span) - Definition(*testing.T, span.Span, Definition) - Implementation(*testing.T, span.Span, Implementations) - Highlight(*testing.T, string, []span.Span) - References(*testing.T, span.Span, []span.Span) - Rename(*testing.T, span.Span, string) - PrepareRename(*testing.T, span.Span, *source.PrepareItem) - Symbols(*testing.T, span.URI, []protocol.DocumentSymbol) - SignatureHelp(*testing.T, span.Span, *source.SignatureInformation) - Link(*testing.T, span.URI, []Link) -} - -type Definition struct { - Name string - IsType bool - OnlyHover bool - Src, Def span.Span -} - -type Implementations struct { - Src span.Span - Implementations []span.Span -} - -type CompletionTestType int - -const ( - // Default runs the standard completion tests. - CompletionDefault = CompletionTestType(iota) - - // Unimported tests the autocompletion of unimported packages. - CompletionUnimported - - // Deep tests deep completion. - CompletionDeep - - // Fuzzy tests deep completion and fuzzy matching. - CompletionFuzzy - - // CaseSensitive tests case sensitive completion - CompletionCaseSensitve - - // CompletionRank candidates in test must be valid and in the right relative order. - CompletionRank -) - -type Completion struct { - CompletionItems []token.Pos -} - -type CompletionSnippet struct { - CompletionItem token.Pos - PlainSnippet string - PlaceholderSnippet string -} - -type Link struct { - Src span.Span - Target string - NotePosition token.Position -} - -type Golden struct { - Filename string - Archive *txtar.Archive - Modified bool -} - -func Context(t testing.TB) context.Context { - return context.Background() -} - -func DefaultOptions() source.Options { - o := source.DefaultOptions - o.SupportedCodeActions = map[source.FileKind]map[protocol.CodeActionKind]bool{ - source.Go: { - protocol.SourceOrganizeImports: true, - protocol.QuickFix: true, - }, - source.Mod: {}, - source.Sum: {}, - } - o.HoverKind = source.SynopsisDocumentation - o.InsertTextFormat = protocol.SnippetTextFormat - return o -} - -func Load(t testing.TB, exporter packagestest.Exporter, dir string) *Data { - t.Helper() - - data := &Data{ - Diagnostics: make(Diagnostics), - CompletionItems: make(CompletionItems), - Completions: make(Completions), - CompletionSnippets: make(CompletionSnippets), - UnimportedCompletions: make(UnimportedCompletions), - DeepCompletions: make(DeepCompletions), - FuzzyCompletions: make(FuzzyCompletions), - RankCompletions: make(RankCompletions), - CaseSensitiveCompletions: make(CaseSensitiveCompletions), - Definitions: make(Definitions), - Implementationses: make(Implementationses), - Highlights: make(Highlights), - References: make(References), - Renames: make(Renames), - PrepareRenames: make(PrepareRenames), - Symbols: make(Symbols), - symbolsChildren: make(SymbolsChildren), - Signatures: make(Signatures), - Links: make(Links), - - t: t, - dir: dir, - fragments: map[string]string{}, - golden: map[string]*Golden{}, - mappers: map[span.URI]*protocol.ColumnMapper{}, - } - - files := packagestest.MustCopyFileTree(dir) - overlays := map[string][]byte{} - for fragment, operation := range files { - if trimmed := strings.TrimSuffix(fragment, goldenFileSuffix); trimmed != fragment { - delete(files, fragment) - goldFile := filepath.Join(dir, fragment) - archive, err := txtar.ParseFile(goldFile) - if err != nil { - t.Fatalf("could not read golden file %v: %v", fragment, err) - } - data.golden[trimmed] = &Golden{ - Filename: goldFile, - Archive: archive, - } - } else if trimmed := strings.TrimSuffix(fragment, inFileSuffix); trimmed != fragment { - delete(files, fragment) - files[trimmed] = operation - } else if index := strings.Index(fragment, overlayFileSuffix); index >= 0 { - delete(files, fragment) - partial := fragment[:index] + fragment[index+len(overlayFileSuffix):] - contents, err := ioutil.ReadFile(filepath.Join(dir, fragment)) - if err != nil { - t.Fatal(err) - } - overlays[partial] = contents - } - } - modules := []packagestest.Module{ - { - Name: testModule, - Files: files, - Overlay: overlays, - }, - { - Name: "example.com/extramodule", - Files: map[string]interface{}{ - "pkg/x.go": "package pkg\n", - }, - }, - } - data.Exported = packagestest.Export(t, exporter, modules) - for fragment := range files { - filename := data.Exported.File(testModule, fragment) - data.fragments[filename] = fragment - } - - // Turn off go/packages debug logging. - data.Exported.Config.Logf = nil - data.Config.Logf = nil - - // Merge the exported.Config with the view.Config. - data.Config = *data.Exported.Config - data.Config.Fset = token.NewFileSet() - data.Config.Context = Context(nil) - data.Config.ParseFile = func(fset *token.FileSet, filename string, src []byte) (*ast.File, error) { - panic("ParseFile should not be called") - } - - // Do a first pass to collect special markers for completion. - if err := data.Exported.Expect(map[string]interface{}{ - "item": func(name string, r packagestest.Range, _ []string) { - data.Exported.Mark(name, r) - }, - }); err != nil { - t.Fatal(err) - } - - // Collect any data that needs to be used by subsequent tests. - if err := data.Exported.Expect(map[string]interface{}{ - "diag": data.collectDiagnostics, - "item": data.collectCompletionItems, - "complete": data.collectCompletions(CompletionDefault), - "unimported": data.collectCompletions(CompletionUnimported), - "deep": data.collectCompletions(CompletionDeep), - "fuzzy": data.collectCompletions(CompletionFuzzy), - "casesensitive": data.collectCompletions(CompletionCaseSensitve), - "rank": data.collectCompletions(CompletionRank), - "snippet": data.collectCompletionSnippets, - "fold": data.collectFoldingRanges, - "format": data.collectFormats, - "import": data.collectImports, - "godef": data.collectDefinitions, - "implementations": data.collectImplementations, - "typdef": data.collectTypeDefinitions, - "hover": data.collectHoverDefinitions, - "highlight": data.collectHighlights, - "refs": data.collectReferences, - "rename": data.collectRenames, - "prepare": data.collectPrepareRenames, - "symbol": data.collectSymbols, - "signature": data.collectSignatures, - "link": data.collectLinks, - "suggestedfix": data.collectSuggestedFixes, - }); err != nil { - t.Fatal(err) - } - for _, symbols := range data.Symbols { - for i := range symbols { - children := data.symbolsChildren[symbols[i].Name] - symbols[i].Children = children - } - } - // Collect names for the entries that require golden files. - if err := data.Exported.Expect(map[string]interface{}{ - "godef": data.collectDefinitionNames, - "hover": data.collectDefinitionNames, - }); err != nil { - t.Fatal(err) - } - return data -} - -func Run(t *testing.T, tests Tests, data *Data) { - t.Helper() - checkData(t, data) - - t.Run("Completion", func(t *testing.T) { - t.Helper() - for src, test := range data.Completions { - t.Run(spanName(src), func(t *testing.T) { - t.Helper() - tests.Completion(t, src, test, data.CompletionItems) - }) - } - }) - - t.Run("CompletionSnippets", func(t *testing.T) { - t.Helper() - for _, placeholders := range []bool{true, false} { - for src, expected := range data.CompletionSnippets { - name := spanName(src) - if placeholders { - name += "_placeholders" - } - t.Run(name, func(t *testing.T) { - t.Helper() - tests.CompletionSnippet(t, src, expected, placeholders, data.CompletionItems) - }) - } - } - }) - - t.Run("UnimportedCompletion", func(t *testing.T) { - t.Helper() - for src, test := range data.UnimportedCompletions { - t.Run(spanName(src), func(t *testing.T) { - t.Helper() - tests.UnimportedCompletion(t, src, test, data.CompletionItems) - }) - } - }) - - t.Run("DeepCompletion", func(t *testing.T) { - t.Helper() - for src, test := range data.DeepCompletions { - t.Run(spanName(src), func(t *testing.T) { - t.Helper() - tests.DeepCompletion(t, src, test, data.CompletionItems) - }) - } - }) - - t.Run("FuzzyCompletion", func(t *testing.T) { - t.Helper() - for src, test := range data.FuzzyCompletions { - t.Run(spanName(src), func(t *testing.T) { - t.Helper() - tests.FuzzyCompletion(t, src, test, data.CompletionItems) - }) - } - }) - - t.Run("CaseSensitiveCompletion", func(t *testing.T) { - t.Helper() - for src, test := range data.CaseSensitiveCompletions { - t.Run(spanName(src), func(t *testing.T) { - t.Helper() - tests.CaseSensitiveCompletion(t, src, test, data.CompletionItems) - }) - } - }) - - t.Run("RankCompletions", func(t *testing.T) { - t.Helper() - for src, test := range data.RankCompletions { - t.Run(spanName(src), func(t *testing.T) { - t.Helper() - tests.RankCompletion(t, src, test, data.CompletionItems) - }) - } - }) - - t.Run("Diagnostics", func(t *testing.T) { - t.Helper() - for uri, want := range data.Diagnostics { - t.Run(uriName(uri), func(t *testing.T) { - t.Helper() - tests.Diagnostics(t, uri, want) - }) - } - }) - - t.Run("FoldingRange", func(t *testing.T) { - t.Helper() - for _, spn := range data.FoldingRanges { - t.Run(uriName(spn.URI()), func(t *testing.T) { - t.Helper() - tests.FoldingRange(t, spn) - }) - } - }) - - t.Run("Format", func(t *testing.T) { - t.Helper() - for _, spn := range data.Formats { - t.Run(uriName(spn.URI()), func(t *testing.T) { - t.Helper() - tests.Format(t, spn) - }) - } - }) - - t.Run("Import", func(t *testing.T) { - t.Helper() - for _, spn := range data.Imports { - t.Run(uriName(spn.URI()), func(t *testing.T) { - t.Helper() - tests.Import(t, spn) - }) - } - }) - - t.Run("SuggestedFix", func(t *testing.T) { - t.Helper() - for _, spn := range data.SuggestedFixes { - t.Run(spanName(spn), func(t *testing.T) { - t.Helper() - tests.SuggestedFix(t, spn) - }) - } - }) - - t.Run("Definition", func(t *testing.T) { - t.Helper() - for spn, d := range data.Definitions { - t.Run(spanName(spn), func(t *testing.T) { - t.Helper() - tests.Definition(t, spn, d) - }) - } - }) - - t.Run("Implementation", func(t *testing.T) { - t.Helper() - for spn, m := range data.Implementationses { - t.Run(spanName(spn), func(t *testing.T) { - t.Helper() - tests.Implementation(t, spn, m) - }) - } - }) - - t.Run("Highlight", func(t *testing.T) { - t.Helper() - for name, locations := range data.Highlights { - t.Run(name, func(t *testing.T) { - t.Helper() - tests.Highlight(t, name, locations) - }) - } - }) - - t.Run("References", func(t *testing.T) { - t.Helper() - for src, itemList := range data.References { - t.Run(spanName(src), func(t *testing.T) { - t.Helper() - tests.References(t, src, itemList) - }) - } - }) - - t.Run("Renames", func(t *testing.T) { - t.Helper() - for spn, newText := range data.Renames { - t.Run(uriName(spn.URI())+"_"+newText, func(t *testing.T) { - t.Helper() - tests.Rename(t, spn, newText) - }) - } - }) - - t.Run("PrepareRenames", func(t *testing.T) { - t.Helper() - for src, want := range data.PrepareRenames { - t.Run(spanName(src), func(t *testing.T) { - t.Helper() - tests.PrepareRename(t, src, want) - }) - } - }) - - t.Run("Symbols", func(t *testing.T) { - t.Helper() - for uri, expectedSymbols := range data.Symbols { - t.Run(uriName(uri), func(t *testing.T) { - t.Helper() - tests.Symbols(t, uri, expectedSymbols) - }) - } - }) - - t.Run("SignatureHelp", func(t *testing.T) { - t.Helper() - for spn, expectedSignature := range data.Signatures { - t.Run(spanName(spn), func(t *testing.T) { - t.Helper() - tests.SignatureHelp(t, spn, expectedSignature) - }) - } - }) - - t.Run("Link", func(t *testing.T) { - t.Helper() - for uri, wantLinks := range data.Links { - t.Run(uriName(uri), func(t *testing.T) { - t.Helper() - tests.Link(t, uri, wantLinks) - }) - } - }) - - if *UpdateGolden { - for _, golden := range data.golden { - if !golden.Modified { - continue - } - sort.Slice(golden.Archive.Files, func(i, j int) bool { - return golden.Archive.Files[i].Name < golden.Archive.Files[j].Name - }) - if err := ioutil.WriteFile(golden.Filename, txtar.Format(golden.Archive), 0666); err != nil { - t.Fatal(err) - } - } - } -} - -func checkData(t *testing.T, data *Data) { - buf := &bytes.Buffer{} - diagnosticsCount := 0 - for _, want := range data.Diagnostics { - diagnosticsCount += len(want) - } - linksCount := 0 - for _, want := range data.Links { - linksCount += len(want) - } - definitionCount := 0 - typeDefinitionCount := 0 - for _, d := range data.Definitions { - if d.IsType { - typeDefinitionCount++ - } else { - definitionCount++ - } - } - - fmt.Fprintf(buf, "CompletionsCount = %v\n", len(data.Completions)) - fmt.Fprintf(buf, "CompletionSnippetCount = %v\n", len(data.CompletionSnippets)) - fmt.Fprintf(buf, "UnimportedCompletionsCount = %v\n", len(data.UnimportedCompletions)) - fmt.Fprintf(buf, "DeepCompletionsCount = %v\n", len(data.DeepCompletions)) - fmt.Fprintf(buf, "FuzzyCompletionsCount = %v\n", len(data.FuzzyCompletions)) - fmt.Fprintf(buf, "RankedCompletionsCount = %v\n", len(data.RankCompletions)) - fmt.Fprintf(buf, "CaseSensitiveCompletionsCount = %v\n", len(data.CaseSensitiveCompletions)) - fmt.Fprintf(buf, "DiagnosticsCount = %v\n", diagnosticsCount) - fmt.Fprintf(buf, "FoldingRangesCount = %v\n", len(data.FoldingRanges)) - fmt.Fprintf(buf, "FormatCount = %v\n", len(data.Formats)) - fmt.Fprintf(buf, "ImportCount = %v\n", len(data.Imports)) - fmt.Fprintf(buf, "SuggestedFixCount = %v\n", len(data.SuggestedFixes)) - fmt.Fprintf(buf, "DefinitionsCount = %v\n", definitionCount) - fmt.Fprintf(buf, "TypeDefinitionsCount = %v\n", typeDefinitionCount) - fmt.Fprintf(buf, "HighlightsCount = %v\n", len(data.Highlights)) - fmt.Fprintf(buf, "ReferencesCount = %v\n", len(data.References)) - fmt.Fprintf(buf, "RenamesCount = %v\n", len(data.Renames)) - fmt.Fprintf(buf, "PrepareRenamesCount = %v\n", len(data.PrepareRenames)) - fmt.Fprintf(buf, "SymbolsCount = %v\n", len(data.Symbols)) - fmt.Fprintf(buf, "SignaturesCount = %v\n", len(data.Signatures)) - fmt.Fprintf(buf, "LinksCount = %v\n", linksCount) - - want := string(data.Golden("summary", "summary.txt", func() ([]byte, error) { - return buf.Bytes(), nil - })) - got := buf.String() - if want != got { - t.Errorf("test summary does not match, want\n%s\ngot:\n%s", want, got) - } -} - -func (data *Data) Mapper(uri span.URI) (*protocol.ColumnMapper, error) { - data.mappersMu.Lock() - defer data.mappersMu.Unlock() - - if _, ok := data.mappers[uri]; !ok { - content, err := data.Exported.FileContents(uri.Filename()) - if err != nil { - return nil, err - } - converter := span.NewContentConverter(uri.Filename(), content) - data.mappers[uri] = &protocol.ColumnMapper{ - URI: uri, - Converter: converter, - Content: content, - } - } - return data.mappers[uri], nil -} - -func (data *Data) Golden(tag string, target string, update func() ([]byte, error)) []byte { - data.t.Helper() - fragment, found := data.fragments[target] - if !found { - if filepath.IsAbs(target) { - data.t.Fatalf("invalid golden file fragment %v", target) - } - fragment = target - } - golden := data.golden[fragment] - if golden == nil { - if !*UpdateGolden { - data.t.Fatalf("could not find golden file %v: %v", fragment, tag) - } - golden = &Golden{ - Filename: filepath.Join(data.dir, fragment+goldenFileSuffix), - Archive: &txtar.Archive{}, - Modified: true, - } - data.golden[fragment] = golden - } - var file *txtar.File - for i := range golden.Archive.Files { - f := &golden.Archive.Files[i] - if f.Name == tag { - file = f - break - } - } - if *UpdateGolden { - if file == nil { - golden.Archive.Files = append(golden.Archive.Files, txtar.File{ - Name: tag, - }) - file = &golden.Archive.Files[len(golden.Archive.Files)-1] - } - contents, err := update() - if err != nil { - data.t.Fatalf("could not update golden file %v: %v", fragment, err) - } - file.Data = append(contents, '\n') // add trailing \n for txtar - golden.Modified = true - } - if file == nil { - data.t.Fatalf("could not find golden contents %v: %v", fragment, tag) - } - return file.Data[:len(file.Data)-1] // drop the trailing \n -} - -func (data *Data) collectDiagnostics(spn span.Span, msgSource, msg string) { - if _, ok := data.Diagnostics[spn.URI()]; !ok { - data.Diagnostics[spn.URI()] = []source.Diagnostic{} - } - severity := protocol.SeverityError - if strings.Contains(string(spn.URI()), "analyzer") { - severity = protocol.SeverityWarning - } - // This is not the correct way to do this, - // but it seems excessive to do the full conversion here. - want := source.Diagnostic{ - URI: spn.URI(), - Range: protocol.Range{ - Start: protocol.Position{ - Line: float64(spn.Start().Line()) - 1, - Character: float64(spn.Start().Column()) - 1, - }, - End: protocol.Position{ - Line: float64(spn.End().Line()) - 1, - Character: float64(spn.End().Column()) - 1, - }, - }, - Severity: severity, - Source: msgSource, - Message: msg, - } - data.Diagnostics[spn.URI()] = append(data.Diagnostics[spn.URI()], want) -} - -func (data *Data) collectCompletions(typ CompletionTestType) func(span.Span, []token.Pos) { - result := func(m map[span.Span]Completion, src span.Span, expected []token.Pos) { - m[src] = Completion{ - CompletionItems: expected, - } - } - switch typ { - case CompletionDeep: - return func(src span.Span, expected []token.Pos) { - result(data.DeepCompletions, src, expected) - } - case CompletionUnimported: - return func(src span.Span, expected []token.Pos) { - result(data.UnimportedCompletions, src, expected) - } - case CompletionFuzzy: - return func(src span.Span, expected []token.Pos) { - result(data.FuzzyCompletions, src, expected) - } - case CompletionRank: - return func(src span.Span, expected []token.Pos) { - result(data.RankCompletions, src, expected) - } - case CompletionCaseSensitve: - return func(src span.Span, expected []token.Pos) { - result(data.CaseSensitiveCompletions, src, expected) - } - default: - return func(src span.Span, expected []token.Pos) { - result(data.Completions, src, expected) - } - } -} - -func (data *Data) collectCompletionItems(pos token.Pos, args []string) { - if len(args) < 3 { - return - } - label, detail, kind := args[0], args[1], args[2] - var documentation string - if len(args) == 4 { - documentation = args[3] - } - data.CompletionItems[pos] = &source.CompletionItem{ - Label: label, - Detail: detail, - Kind: protocol.ParseCompletionItemKind(kind), - Documentation: documentation, - } -} - -func (data *Data) collectFoldingRanges(spn span.Span) { - data.FoldingRanges = append(data.FoldingRanges, spn) -} - -func (data *Data) collectFormats(spn span.Span) { - data.Formats = append(data.Formats, spn) -} - -func (data *Data) collectImports(spn span.Span) { - data.Imports = append(data.Imports, spn) -} - -func (data *Data) collectSuggestedFixes(spn span.Span) { - data.SuggestedFixes = append(data.SuggestedFixes, spn) -} - -func (data *Data) collectDefinitions(src, target span.Span) { - data.Definitions[src] = Definition{ - Src: src, - Def: target, - } -} - -func (data *Data) collectImplementations(src, target span.Span) { - // Add target to the list of expected implementations for src - imps := data.Implementationses[src] - imps.Src = src // Src is already set if imps already exists, but then we're setting it to the same thing. - imps.Implementations = append(imps.Implementations, target) - data.Implementationses[src] = imps -} - -func (data *Data) collectHoverDefinitions(src, target span.Span) { - data.Definitions[src] = Definition{ - Src: src, - Def: target, - OnlyHover: true, - } -} - -func (data *Data) collectTypeDefinitions(src, target span.Span) { - data.Definitions[src] = Definition{ - Src: src, - Def: target, - IsType: true, - } -} - -func (data *Data) collectDefinitionNames(src span.Span, name string) { - d := data.Definitions[src] - d.Name = name - data.Definitions[src] = d -} - -func (data *Data) collectHighlights(name string, rng span.Span) { - data.Highlights[name] = append(data.Highlights[name], rng) -} - -func (data *Data) collectReferences(src span.Span, expected []span.Span) { - data.References[src] = expected -} - -func (data *Data) collectRenames(src span.Span, newText string) { - data.Renames[src] = newText -} - -func (data *Data) collectPrepareRenames(src span.Span, rng span.Range, placeholder string) { - if int(rng.End-rng.Start) != len(placeholder) { - // If the length of the placeholder and the length of the range do not match, - // make the range just be the start. - rng = span.NewRange(rng.FileSet, rng.Start, rng.Start) - } - m, err := data.Mapper(src.URI()) - if err != nil { - data.t.Fatal(err) - } - // Convert range to span and then to protocol.Range. - spn, err := rng.Span() - if err != nil { - data.t.Fatal(err) - } - prng, err := m.Range(spn) - if err != nil { - data.t.Fatal(err) - } - data.PrepareRenames[src] = &source.PrepareItem{ - Range: prng, - Text: placeholder, - } -} - -func (data *Data) collectSymbols(name string, spn span.Span, kind string, parentName string) { - m, err := data.Mapper(spn.URI()) - if err != nil { - data.t.Fatal(err) - } - rng, err := m.Range(spn) - if err != nil { - data.t.Fatal(err) - } - sym := protocol.DocumentSymbol{ - Name: name, - Kind: protocol.ParseSymbolKind(kind), - SelectionRange: rng, - } - if parentName == "" { - data.Symbols[spn.URI()] = append(data.Symbols[spn.URI()], sym) - } else { - data.symbolsChildren[parentName] = append(data.symbolsChildren[parentName], sym) - } -} - -func (data *Data) collectSignatures(spn span.Span, signature string, activeParam int64) { - data.Signatures[spn] = &source.SignatureInformation{ - Label: signature, - ActiveParameter: int(activeParam), - } - // Hardcode special case to test the lack of a signature. - if signature == "" && activeParam == 0 { - data.Signatures[spn] = nil - } -} - -func (data *Data) collectCompletionSnippets(spn span.Span, item token.Pos, plain, placeholder string) { - data.CompletionSnippets[spn] = CompletionSnippet{ - CompletionItem: item, - PlainSnippet: plain, - PlaceholderSnippet: placeholder, - } -} - -func (data *Data) collectLinks(spn span.Span, link string, note *expect.Note, fset *token.FileSet) { - position := fset.Position(note.Pos) - uri := spn.URI() - data.Links[uri] = append(data.Links[uri], Link{ - Src: spn, - Target: link, - NotePosition: position, - }) -} - -func uriName(uri span.URI) string { - return filepath.Base(strings.TrimSuffix(uri.Filename(), ".go")) -} - -func spanName(spn span.Span) string { - return fmt.Sprintf("%v_%v_%v", uriName(spn.URI()), spn.Start().Line(), spn.Start().Column()) -} diff --git a/vendor/golang.org/x/tools/internal/lsp/text_synchronization.go b/vendor/golang.org/x/tools/internal/lsp/text_synchronization.go deleted file mode 100644 index 4019daca1..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/text_synchronization.go +++ /dev/null @@ -1,177 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package lsp - -import ( - "bytes" - "context" - "fmt" - - "golang.org/x/tools/internal/jsonrpc2" - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/lsp/telemetry" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/telemetry/log" - errors "golang.org/x/xerrors" -) - -func (s *Server) didOpen(ctx context.Context, params *protocol.DidOpenTextDocumentParams) error { - uri := span.NewURI(params.TextDocument.URI) - text := []byte(params.TextDocument.Text) - - // Confirm that the file's language ID is related to Go. - fileKind := source.DetectLanguage(params.TextDocument.LanguageID, uri.Filename()) - - // Open the file. - s.session.DidOpen(ctx, uri, fileKind, text) - - view := s.session.ViewOf(uri) - - // Run diagnostics on the newly-changed file. - go s.diagnostics(view, uri) - - return nil -} - -func (s *Server) didChange(ctx context.Context, params *protocol.DidChangeTextDocumentParams) error { - options := s.session.Options() - if len(params.ContentChanges) < 1 { - return jsonrpc2.NewErrorf(jsonrpc2.CodeInternalError, "no content changes provided") - } - - uri := span.NewURI(params.TextDocument.URI) - - // Check if the client sent the full content of the file. - // We accept a full content change even if the server expected incremental changes. - text, isFullChange := fullChange(params.ContentChanges) - - // We only accept an incremental change if the server expected it. - if !isFullChange { - switch options.TextDocumentSyncKind { - case protocol.Full: - return errors.Errorf("expected a full content change, received incremental changes for %s", uri) - case protocol.Incremental: - // Determine the new file content. - var err error - text, err = s.applyChanges(ctx, uri, params.ContentChanges) - if err != nil { - return err - } - } - } - // Cache the new file content and send fresh diagnostics. - view := s.session.ViewOf(uri) - wasFirstChange, err := view.SetContent(ctx, uri, []byte(text)) - if err != nil { - return err - } - - // TODO: Ideally, we should be able to specify that a generated file should be opened as read-only. - // Tell the user that they should not be editing a generated file. - if source.IsGenerated(ctx, view, uri) && wasFirstChange { - s.client.ShowMessage(ctx, &protocol.ShowMessageParams{ - Message: fmt.Sprintf("Do not edit this file! %s is a generated file.", uri.Filename()), - Type: protocol.Warning, - }) - } - - // Run diagnostics on the newly-changed file. - go s.diagnostics(view, uri) - - return nil -} - -func fullChange(changes []protocol.TextDocumentContentChangeEvent) (string, bool) { - if len(changes) > 1 { - return "", false - } - // The length of the changes must be 1 at this point. - if changes[0].Range == nil && changes[0].RangeLength == 0 { - return changes[0].Text, true - } - return "", false -} - -func (s *Server) applyChanges(ctx context.Context, uri span.URI, changes []protocol.TextDocumentContentChangeEvent) (string, error) { - content, _, err := s.session.GetFile(uri, source.UnknownKind).Read(ctx) - if err != nil { - return "", jsonrpc2.NewErrorf(jsonrpc2.CodeInternalError, "file not found (%v)", err) - } - for _, change := range changes { - // Update column mapper along with the content. - converter := span.NewContentConverter(uri.Filename(), content) - m := &protocol.ColumnMapper{ - URI: uri, - Converter: converter, - Content: content, - } - - spn, err := m.RangeSpan(*change.Range) - if err != nil { - return "", err - } - if !spn.HasOffset() { - return "", jsonrpc2.NewErrorf(jsonrpc2.CodeInternalError, "invalid range for content change") - } - start, end := spn.Start().Offset(), spn.End().Offset() - if end < start { - return "", jsonrpc2.NewErrorf(jsonrpc2.CodeInternalError, "invalid range for content change") - } - var buf bytes.Buffer - buf.Write(content[:start]) - buf.WriteString(change.Text) - buf.Write(content[end:]) - content = buf.Bytes() - } - return string(content), nil -} - -func (s *Server) didSave(ctx context.Context, params *protocol.DidSaveTextDocumentParams) error { - s.session.DidSave(span.NewURI(params.TextDocument.URI)) - return nil -} - -func (s *Server) didClose(ctx context.Context, params *protocol.DidCloseTextDocumentParams) error { - uri := span.NewURI(params.TextDocument.URI) - ctx = telemetry.URI.With(ctx, uri) - s.session.DidClose(uri) - view := s.session.ViewOf(uri) - if _, err := view.SetContent(ctx, uri, nil); err != nil { - return err - } - clear := []span.URI{uri} // by default, clear the closed URI - defer func() { - for _, uri := range clear { - if err := s.publishDiagnostics(ctx, uri, []source.Diagnostic{}); err != nil { - log.Error(ctx, "failed to clear diagnostics", err, telemetry.File) - } - } - }() - // If the current file was the only open file for its package, - // clear out all diagnostics for the package. - f, err := view.GetFile(ctx, uri) - if err != nil { - log.Error(ctx, "no file", err, telemetry.URI) - return nil - } - _, cphs, err := view.CheckPackageHandles(ctx, f) - if err != nil { - log.Error(ctx, "no CheckPackageHandles", err, telemetry.URI.Of(uri)) - return nil - } - for _, cph := range cphs { - for _, ph := range cph.Files() { - // If other files from this package are open, don't clear. - if s.session.IsOpen(ph.File().Identity().URI) { - clear = nil - return nil - } - clear = append(clear, ph.File().Identity().URI) - } - } - - return nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/watched_files.go b/vendor/golang.org/x/tools/internal/lsp/watched_files.go deleted file mode 100644 index b6238e01a..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/watched_files.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package lsp - -import ( - "context" - - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/lsp/source" - "golang.org/x/tools/internal/lsp/telemetry" - "golang.org/x/tools/internal/span" - "golang.org/x/tools/internal/telemetry/log" -) - -func (s *Server) didChangeWatchedFiles(ctx context.Context, params *protocol.DidChangeWatchedFilesParams) error { - for _, change := range params.Changes { - uri := span.NewURI(change.URI) - ctx := telemetry.File.With(ctx, uri) - - for _, view := range s.session.Views() { - if !view.Options().WatchFileChanges { - continue - } - switch change.Type { - case protocol.Changed, protocol.Created: - // If client has this file open, don't do anything. - // The client's contents must remain the source of truth. - if s.session.IsOpen(uri) { - break - } - if s.session.DidChangeOutOfBand(ctx, uri, change.Type) { - // If we had been tracking the given file, - // recompute diagnostics to reflect updated file contents. - go s.diagnostics(view, uri) - } - case protocol.Deleted: - f := view.FindFile(ctx, uri) - // If we have never seen this file before, there is nothing to do. - if f == nil { - continue - } - _, cphs, err := view.CheckPackageHandles(ctx, f) - if err != nil { - log.Error(ctx, "didChangeWatchedFiles: CheckPackageHandles", err, telemetry.File) - continue - } - cph, err := source.WidestCheckPackageHandle(cphs) - if err != nil { - log.Error(ctx, "didChangeWatchedFiles: WidestCheckPackageHandle", err, telemetry.File) - continue - } - // Find a different file in the same package we can use to trigger diagnostics. - // TODO(rstambler): Allow diagnostics to be called per-package to avoid this. - var otherFile source.File - for _, ph := range cph.Files() { - if ph.File().Identity().URI == f.URI() { - continue - } - if f := view.FindFile(ctx, ph.File().Identity().URI); f != nil && s.session.IsOpen(f.URI()) { - otherFile = f - break - } - } - - // Notify the view of the deletion of the file. - s.session.DidChangeOutOfBand(ctx, uri, change.Type) - - // If this was the only file in the package, clear its diagnostics. - if otherFile == nil { - if err := s.publishDiagnostics(ctx, uri, []source.Diagnostic{}); err != nil { - log.Error(ctx, "failed to clear diagnostics", err, telemetry.URI.Of(uri)) - } - return nil - } - - // Refresh diagnostics for the package the file belonged to. - go s.diagnostics(view, otherFile.URI()) - } - } - } - return nil -} diff --git a/vendor/golang.org/x/tools/internal/lsp/workspace.go b/vendor/golang.org/x/tools/internal/lsp/workspace.go deleted file mode 100644 index 42a252a9f..000000000 --- a/vendor/golang.org/x/tools/internal/lsp/workspace.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package lsp - -import ( - "context" - - "golang.org/x/tools/internal/lsp/protocol" - "golang.org/x/tools/internal/span" - errors "golang.org/x/xerrors" -) - -func (s *Server) changeFolders(ctx context.Context, event protocol.WorkspaceFoldersChangeEvent) error { - for _, folder := range event.Removed { - view := s.session.View(folder.Name) - if view != nil { - view.Shutdown(ctx) - } else { - return errors.Errorf("view %s for %v not found", folder.Name, folder.URI) - } - } - - for _, folder := range event.Added { - if err := s.addView(ctx, folder.Name, span.NewURI(folder.URI)); err != nil { - return err - } - } - return nil -} - -func (s *Server) addView(ctx context.Context, name string, uri span.URI) error { - s.stateMu.Lock() - state := s.state - s.stateMu.Unlock() - if state < serverInitialized { - return errors.Errorf("addView called before server initialized") - } - - options := s.session.Options() - s.fetchConfig(ctx, name, uri, &options) - s.session.NewView(ctx, name, uri, options) - return nil -} diff --git a/vendor/golang.org/x/tools/internal/memoize/memoize.go b/vendor/golang.org/x/tools/internal/memoize/memoize.go deleted file mode 100644 index da3e365b3..000000000 --- a/vendor/golang.org/x/tools/internal/memoize/memoize.go +++ /dev/null @@ -1,199 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package memoize supports memoizing the return values of functions with -// idempotent results that are expensive to compute. -// -// The memoized result is returned again the next time the function is invoked. -// To prevent excessive memory use, the return values are only remembered -// for as long as they still have a user. -// -// To use this package, build a store and use it to acquire handles with the -// Bind method. -// -package memoize - -import ( - "context" - "runtime" - "sync" - "unsafe" - - "golang.org/x/tools/internal/xcontext" -) - -// Store binds keys to functions, returning handles that can be used to access -// the functions results. -type Store struct { - mu sync.Mutex - // entries is the set of values stored. - entries map[interface{}]uintptr -} - -// Function is the type for functions that can be memoized. -// The result must be a pointer. -type Function func(ctx context.Context) interface{} - -// Handle is returned from a store when a key is bound to a function. -// It is then used to access the results of that function. -type Handle struct { - mu sync.Mutex - store *Store - key interface{} - // the function that will be used to populate the value - function Function - // the lazily poplulated value - value interface{} - // wait is used to block until the value is ready - // will only be non nil if the generator is already running - wait chan interface{} - // the cancel function for the context being used by the generator - // it can be used to abort the generator if the handle is garbage - // collected. - cancel context.CancelFunc -} - -// Has returns true if they key is currently valid for this store. -func (s *Store) Has(key interface{}) bool { - s.mu.Lock() - defer s.mu.Unlock() - _, found := s.entries[key] - return found -} - -// Bind returns a handle for the given key and function. -// -// Each call to bind will return the same handle if it is already bound. -// Bind will always return a valid handle, creating one if needed. -// Each key can only have one handle at any given time. -// The value will be held for as long as the handle is, once it has been -// generated. -// Bind does not cause the value to be generated. -func (s *Store) Bind(key interface{}, function Function) *Handle { - // panic early if the function is nil - // it would panic later anyway, but in a way that was much harder to debug - if function == nil { - panic("the function passed to bind must not be nil") - } - // check if we already have the key - s.mu.Lock() - defer s.mu.Unlock() - h := s.get(key) - if h != nil { - // we have a handle already, just return it - return h - } - // we have not seen this key before, add a new entry - if s.entries == nil { - s.entries = make(map[interface{}]uintptr) - } - h = &Handle{ - store: s, - key: key, - function: function, - } - // now add the weak reference to the handle into the map - s.entries[key] = uintptr(unsafe.Pointer(h)) - // add the deletion the entry when the handle is garbage collected - runtime.SetFinalizer(h, release) - return h -} - -// Find returns the handle associated with a key, if it is bound. -// -// It cannot cause a new handle to be generated, and thus may return nil. -func (s *Store) Find(key interface{}) *Handle { - s.mu.Lock() - defer s.mu.Unlock() - return s.get(key) -} - -// Cached returns the value associated with a key. -// -// It cannot cause the value to be generated. -// It will return the cached value, if present. -func (s *Store) Cached(key interface{}) interface{} { - h := s.Find(key) - if h == nil { - return nil - } - return h.Cached() -} - -//go:nocheckptr -// nocheckptr because: https://github.com/golang/go/issues/35125#issuecomment-545671062 -func (s *Store) get(key interface{}) *Handle { - // this must be called with the store mutex already held - e, found := s.entries[key] - if !found { - return nil - } - return (*Handle)(unsafe.Pointer(e)) -} - -// Cached returns the value associated with a handle. -// -// It will never cause the value to be generated. -// It will return the cached value, if present. -func (h *Handle) Cached() interface{} { - h.mu.Lock() - defer h.mu.Unlock() - return h.value -} - -// Get returns the value associated with a handle. -// -// If the value is not yet ready, the underlying function will be invoked. -// This activates the handle, and it will remember the value for as long as it exists. -func (h *Handle) Get(ctx context.Context) interface{} { - h.mu.Lock() - defer h.mu.Unlock() - if h.function == nil { - return h.value - } - // value not ready yet - select { - case h.value = <-h.run(ctx): - // successfully got the value - h.function = nil - h.cancel = nil - return h.value - case <-ctx.Done(): - // cancelled outer context, leave the generator running - // for someone else to pick up later - return nil - } -} - -// run starts the generator if necessary and returns the value channel. -func (h *Handle) run(ctx context.Context) chan interface{} { - if h.wait != nil { - // generator already running - return h.wait - } - // we use a length one "postbox" so the go routine can quit even if - // nobody wants the result yet - h.wait = make(chan interface{}, 1) - ctx, cancel := context.WithCancel(xcontext.Detach(ctx)) - h.cancel = cancel - go func() { - // in here the handle lock is not held - // we post the value back to the first caller that waits for it - h.wait <- h.function(ctx) - close(h.wait) - }() - return h.wait -} - -func release(p interface{}) { - h := p.(*Handle) - h.store.mu.Lock() - defer h.store.mu.Unlock() - // there is a small gap between the garbage collector deciding that the handle - // is liable for collection and the finalizer being called - // if the handle is recovered during that time, you will end up with a valid - // handle that no longer has an entry in the map, and that no longer has a - // finalizer associated with it, but that is okay. - delete(h.store.entries, h.key) -} diff --git a/vendor/golang.org/x/tools/internal/memoize/nocopy.go b/vendor/golang.org/x/tools/internal/memoize/nocopy.go deleted file mode 100644 index 891322599..000000000 --- a/vendor/golang.org/x/tools/internal/memoize/nocopy.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package memoize - -// NoCopy is a type with no public methods that will trigger a vet check if it -// is ever copied. -// You can embed this in any type intended to be used as a value. This helps -// avoid accidentally holding a copy of a value instead of the value itself. -type NoCopy struct { - noCopy noCopy -} - -// noCopy may be embedded into structs which must not be copied -// after the first use. -// -// See https://golang.org/issues/8005#issuecomment-190753527 -// for details. -type noCopy struct{} - -// Lock is a no-op used by -copylocks checker from `go vet`. -func (*noCopy) Lock() {} -func (*noCopy) Unlock() {} diff --git a/vendor/golang.org/x/tools/internal/module/module.go b/vendor/golang.org/x/tools/internal/module/module.go deleted file mode 100644 index 9a4edb9de..000000000 --- a/vendor/golang.org/x/tools/internal/module/module.go +++ /dev/null @@ -1,540 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package module defines the module.Version type -// along with support code. -package module - -// IMPORTANT NOTE -// -// This file essentially defines the set of valid import paths for the go command. -// There are many subtle considerations, including Unicode ambiguity, -// security, network, and file system representations. -// -// This file also defines the set of valid module path and version combinations, -// another topic with many subtle considerations. -// -// Changes to the semantics in this file require approval from rsc. - -import ( - "fmt" - "sort" - "strings" - "unicode" - "unicode/utf8" - - "golang.org/x/tools/internal/semver" -) - -// A Version is defined by a module path and version pair. -type Version struct { - Path string - - // Version is usually a semantic version in canonical form. - // There are two exceptions to this general rule. - // First, the top-level target of a build has no specific version - // and uses Version = "". - // Second, during MVS calculations the version "none" is used - // to represent the decision to take no version of a given module. - Version string `json:",omitempty"` -} - -// Check checks that a given module path, version pair is valid. -// In addition to the path being a valid module path -// and the version being a valid semantic version, -// the two must correspond. -// For example, the path "yaml/v2" only corresponds to -// semantic versions beginning with "v2.". -func Check(path, version string) error { - if err := CheckPath(path); err != nil { - return err - } - if !semver.IsValid(version) { - return fmt.Errorf("malformed semantic version %v", version) - } - _, pathMajor, _ := SplitPathVersion(path) - if !MatchPathMajor(version, pathMajor) { - if pathMajor == "" { - pathMajor = "v0 or v1" - } - if pathMajor[0] == '.' { // .v1 - pathMajor = pathMajor[1:] - } - return fmt.Errorf("mismatched module path %v and version %v (want %v)", path, version, pathMajor) - } - return nil -} - -// firstPathOK reports whether r can appear in the first element of a module path. -// The first element of the path must be an LDH domain name, at least for now. -// To avoid case ambiguity, the domain name must be entirely lower case. -func firstPathOK(r rune) bool { - return r == '-' || r == '.' || - '0' <= r && r <= '9' || - 'a' <= r && r <= 'z' -} - -// pathOK reports whether r can appear in an import path element. -// Paths can be ASCII letters, ASCII digits, and limited ASCII punctuation: + - . _ and ~. -// This matches what "go get" has historically recognized in import paths. -// TODO(rsc): We would like to allow Unicode letters, but that requires additional -// care in the safe encoding (see note below). -func pathOK(r rune) bool { - if r < utf8.RuneSelf { - return r == '+' || r == '-' || r == '.' || r == '_' || r == '~' || - '0' <= r && r <= '9' || - 'A' <= r && r <= 'Z' || - 'a' <= r && r <= 'z' - } - return false -} - -// fileNameOK reports whether r can appear in a file name. -// For now we allow all Unicode letters but otherwise limit to pathOK plus a few more punctuation characters. -// If we expand the set of allowed characters here, we have to -// work harder at detecting potential case-folding and normalization collisions. -// See note about "safe encoding" below. -func fileNameOK(r rune) bool { - if r < utf8.RuneSelf { - // Entire set of ASCII punctuation, from which we remove characters: - // ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ - // We disallow some shell special characters: " ' * < > ? ` | - // (Note that some of those are disallowed by the Windows file system as well.) - // We also disallow path separators / : and \ (fileNameOK is only called on path element characters). - // We allow spaces (U+0020) in file names. - const allowed = "!#$%&()+,-.=@[]^_{}~ " - if '0' <= r && r <= '9' || 'A' <= r && r <= 'Z' || 'a' <= r && r <= 'z' { - return true - } - for i := 0; i < len(allowed); i++ { - if rune(allowed[i]) == r { - return true - } - } - return false - } - // It may be OK to add more ASCII punctuation here, but only carefully. - // For example Windows disallows < > \, and macOS disallows :, so we must not allow those. - return unicode.IsLetter(r) -} - -// CheckPath checks that a module path is valid. -func CheckPath(path string) error { - if err := checkPath(path, false); err != nil { - return fmt.Errorf("malformed module path %q: %v", path, err) - } - i := strings.Index(path, "/") - if i < 0 { - i = len(path) - } - if i == 0 { - return fmt.Errorf("malformed module path %q: leading slash", path) - } - if !strings.Contains(path[:i], ".") { - return fmt.Errorf("malformed module path %q: missing dot in first path element", path) - } - if path[0] == '-' { - return fmt.Errorf("malformed module path %q: leading dash in first path element", path) - } - for _, r := range path[:i] { - if !firstPathOK(r) { - return fmt.Errorf("malformed module path %q: invalid char %q in first path element", path, r) - } - } - if _, _, ok := SplitPathVersion(path); !ok { - return fmt.Errorf("malformed module path %q: invalid version", path) - } - return nil -} - -// CheckImportPath checks that an import path is valid. -func CheckImportPath(path string) error { - if err := checkPath(path, false); err != nil { - return fmt.Errorf("malformed import path %q: %v", path, err) - } - return nil -} - -// checkPath checks that a general path is valid. -// It returns an error describing why but not mentioning path. -// Because these checks apply to both module paths and import paths, -// the caller is expected to add the "malformed ___ path %q: " prefix. -// fileName indicates whether the final element of the path is a file name -// (as opposed to a directory name). -func checkPath(path string, fileName bool) error { - if !utf8.ValidString(path) { - return fmt.Errorf("invalid UTF-8") - } - if path == "" { - return fmt.Errorf("empty string") - } - if strings.Contains(path, "..") { - return fmt.Errorf("double dot") - } - if strings.Contains(path, "//") { - return fmt.Errorf("double slash") - } - if path[len(path)-1] == '/' { - return fmt.Errorf("trailing slash") - } - elemStart := 0 - for i, r := range path { - if r == '/' { - if err := checkElem(path[elemStart:i], fileName); err != nil { - return err - } - elemStart = i + 1 - } - } - if err := checkElem(path[elemStart:], fileName); err != nil { - return err - } - return nil -} - -// checkElem checks whether an individual path element is valid. -// fileName indicates whether the element is a file name (not a directory name). -func checkElem(elem string, fileName bool) error { - if elem == "" { - return fmt.Errorf("empty path element") - } - if strings.Count(elem, ".") == len(elem) { - return fmt.Errorf("invalid path element %q", elem) - } - if elem[0] == '.' && !fileName { - return fmt.Errorf("leading dot in path element") - } - if elem[len(elem)-1] == '.' { - return fmt.Errorf("trailing dot in path element") - } - charOK := pathOK - if fileName { - charOK = fileNameOK - } - for _, r := range elem { - if !charOK(r) { - return fmt.Errorf("invalid char %q", r) - } - } - - // Windows disallows a bunch of path elements, sadly. - // See https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file - short := elem - if i := strings.Index(short, "."); i >= 0 { - short = short[:i] - } - for _, bad := range badWindowsNames { - if strings.EqualFold(bad, short) { - return fmt.Errorf("disallowed path element %q", elem) - } - } - return nil -} - -// CheckFilePath checks whether a slash-separated file path is valid. -func CheckFilePath(path string) error { - if err := checkPath(path, true); err != nil { - return fmt.Errorf("malformed file path %q: %v", path, err) - } - return nil -} - -// badWindowsNames are the reserved file path elements on Windows. -// See https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file -var badWindowsNames = []string{ - "CON", - "PRN", - "AUX", - "NUL", - "COM1", - "COM2", - "COM3", - "COM4", - "COM5", - "COM6", - "COM7", - "COM8", - "COM9", - "LPT1", - "LPT2", - "LPT3", - "LPT4", - "LPT5", - "LPT6", - "LPT7", - "LPT8", - "LPT9", -} - -// SplitPathVersion returns prefix and major version such that prefix+pathMajor == path -// and version is either empty or "/vN" for N >= 2. -// As a special case, gopkg.in paths are recognized directly; -// they require ".vN" instead of "/vN", and for all N, not just N >= 2. -func SplitPathVersion(path string) (prefix, pathMajor string, ok bool) { - if strings.HasPrefix(path, "gopkg.in/") { - return splitGopkgIn(path) - } - - i := len(path) - dot := false - for i > 0 && ('0' <= path[i-1] && path[i-1] <= '9' || path[i-1] == '.') { - if path[i-1] == '.' { - dot = true - } - i-- - } - if i <= 1 || i == len(path) || path[i-1] != 'v' || path[i-2] != '/' { - return path, "", true - } - prefix, pathMajor = path[:i-2], path[i-2:] - if dot || len(pathMajor) <= 2 || pathMajor[2] == '0' || pathMajor == "/v1" { - return path, "", false - } - return prefix, pathMajor, true -} - -// splitGopkgIn is like SplitPathVersion but only for gopkg.in paths. -func splitGopkgIn(path string) (prefix, pathMajor string, ok bool) { - if !strings.HasPrefix(path, "gopkg.in/") { - return path, "", false - } - i := len(path) - if strings.HasSuffix(path, "-unstable") { - i -= len("-unstable") - } - for i > 0 && ('0' <= path[i-1] && path[i-1] <= '9') { - i-- - } - if i <= 1 || path[i-1] != 'v' || path[i-2] != '.' { - // All gopkg.in paths must end in vN for some N. - return path, "", false - } - prefix, pathMajor = path[:i-2], path[i-2:] - if len(pathMajor) <= 2 || pathMajor[2] == '0' && pathMajor != ".v0" { - return path, "", false - } - return prefix, pathMajor, true -} - -// MatchPathMajor reports whether the semantic version v -// matches the path major version pathMajor. -func MatchPathMajor(v, pathMajor string) bool { - if strings.HasPrefix(pathMajor, ".v") && strings.HasSuffix(pathMajor, "-unstable") { - pathMajor = strings.TrimSuffix(pathMajor, "-unstable") - } - if strings.HasPrefix(v, "v0.0.0-") && pathMajor == ".v1" { - // Allow old bug in pseudo-versions that generated v0.0.0- pseudoversion for gopkg .v1. - // For example, gopkg.in/yaml.v2@v2.2.1's go.mod requires gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405. - return true - } - m := semver.Major(v) - if pathMajor == "" { - return m == "v0" || m == "v1" || semver.Build(v) == "+incompatible" - } - return (pathMajor[0] == '/' || pathMajor[0] == '.') && m == pathMajor[1:] -} - -// CanonicalVersion returns the canonical form of the version string v. -// It is the same as semver.Canonical(v) except that it preserves the special build suffix "+incompatible". -func CanonicalVersion(v string) string { - cv := semver.Canonical(v) - if semver.Build(v) == "+incompatible" { - cv += "+incompatible" - } - return cv -} - -// Sort sorts the list by Path, breaking ties by comparing Versions. -func Sort(list []Version) { - sort.Slice(list, func(i, j int) bool { - mi := list[i] - mj := list[j] - if mi.Path != mj.Path { - return mi.Path < mj.Path - } - // To help go.sum formatting, allow version/file. - // Compare semver prefix by semver rules, - // file by string order. - vi := mi.Version - vj := mj.Version - var fi, fj string - if k := strings.Index(vi, "/"); k >= 0 { - vi, fi = vi[:k], vi[k:] - } - if k := strings.Index(vj, "/"); k >= 0 { - vj, fj = vj[:k], vj[k:] - } - if vi != vj { - return semver.Compare(vi, vj) < 0 - } - return fi < fj - }) -} - -// Safe encodings -// -// Module paths appear as substrings of file system paths -// (in the download cache) and of web server URLs in the proxy protocol. -// In general we cannot rely on file systems to be case-sensitive, -// nor can we rely on web servers, since they read from file systems. -// That is, we cannot rely on the file system to keep rsc.io/QUOTE -// and rsc.io/quote separate. Windows and macOS don't. -// Instead, we must never require two different casings of a file path. -// Because we want the download cache to match the proxy protocol, -// and because we want the proxy protocol to be possible to serve -// from a tree of static files (which might be stored on a case-insensitive -// file system), the proxy protocol must never require two different casings -// of a URL path either. -// -// One possibility would be to make the safe encoding be the lowercase -// hexadecimal encoding of the actual path bytes. This would avoid ever -// needing different casings of a file path, but it would be fairly illegible -// to most programmers when those paths appeared in the file system -// (including in file paths in compiler errors and stack traces) -// in web server logs, and so on. Instead, we want a safe encoding that -// leaves most paths unaltered. -// -// The safe encoding is this: -// replace every uppercase letter with an exclamation mark -// followed by the letter's lowercase equivalent. -// -// For example, -// github.com/Azure/azure-sdk-for-go -> github.com/!azure/azure-sdk-for-go. -// github.com/GoogleCloudPlatform/cloudsql-proxy -> github.com/!google!cloud!platform/cloudsql-proxy -// github.com/Sirupsen/logrus -> github.com/!sirupsen/logrus. -// -// Import paths that avoid upper-case letters are left unchanged. -// Note that because import paths are ASCII-only and avoid various -// problematic punctuation (like : < and >), the safe encoding is also ASCII-only -// and avoids the same problematic punctuation. -// -// Import paths have never allowed exclamation marks, so there is no -// need to define how to encode a literal !. -// -// Although paths are disallowed from using Unicode (see pathOK above), -// the eventual plan is to allow Unicode letters as well, to assume that -// file systems and URLs are Unicode-safe (storing UTF-8), and apply -// the !-for-uppercase convention. Note however that not all runes that -// are different but case-fold equivalent are an upper/lower pair. -// For example, U+004B ('K'), U+006B ('k'), and U+212A ('K' for Kelvin) -// are considered to case-fold to each other. When we do add Unicode -// letters, we must not assume that upper/lower are the only case-equivalent pairs. -// Perhaps the Kelvin symbol would be disallowed entirely, for example. -// Or perhaps it would encode as "!!k", or perhaps as "(212A)". -// -// Also, it would be nice to allow Unicode marks as well as letters, -// but marks include combining marks, and then we must deal not -// only with case folding but also normalization: both U+00E9 ('é') -// and U+0065 U+0301 ('e' followed by combining acute accent) -// look the same on the page and are treated by some file systems -// as the same path. If we do allow Unicode marks in paths, there -// must be some kind of normalization to allow only one canonical -// encoding of any character used in an import path. - -// EncodePath returns the safe encoding of the given module path. -// It fails if the module path is invalid. -func EncodePath(path string) (encoding string, err error) { - if err := CheckPath(path); err != nil { - return "", err - } - - return encodeString(path) -} - -// EncodeVersion returns the safe encoding of the given module version. -// Versions are allowed to be in non-semver form but must be valid file names -// and not contain exclamation marks. -func EncodeVersion(v string) (encoding string, err error) { - if err := checkElem(v, true); err != nil || strings.Contains(v, "!") { - return "", fmt.Errorf("disallowed version string %q", v) - } - return encodeString(v) -} - -func encodeString(s string) (encoding string, err error) { - haveUpper := false - for _, r := range s { - if r == '!' || r >= utf8.RuneSelf { - // This should be disallowed by CheckPath, but diagnose anyway. - // The correctness of the encoding loop below depends on it. - return "", fmt.Errorf("internal error: inconsistency in EncodePath") - } - if 'A' <= r && r <= 'Z' { - haveUpper = true - } - } - - if !haveUpper { - return s, nil - } - - var buf []byte - for _, r := range s { - if 'A' <= r && r <= 'Z' { - buf = append(buf, '!', byte(r+'a'-'A')) - } else { - buf = append(buf, byte(r)) - } - } - return string(buf), nil -} - -// DecodePath returns the module path of the given safe encoding. -// It fails if the encoding is invalid or encodes an invalid path. -func DecodePath(encoding string) (path string, err error) { - path, ok := decodeString(encoding) - if !ok { - return "", fmt.Errorf("invalid module path encoding %q", encoding) - } - if err := CheckPath(path); err != nil { - return "", fmt.Errorf("invalid module path encoding %q: %v", encoding, err) - } - return path, nil -} - -// DecodeVersion returns the version string for the given safe encoding. -// It fails if the encoding is invalid or encodes an invalid version. -// Versions are allowed to be in non-semver form but must be valid file names -// and not contain exclamation marks. -func DecodeVersion(encoding string) (v string, err error) { - v, ok := decodeString(encoding) - if !ok { - return "", fmt.Errorf("invalid version encoding %q", encoding) - } - if err := checkElem(v, true); err != nil { - return "", fmt.Errorf("disallowed version string %q", v) - } - return v, nil -} - -func decodeString(encoding string) (string, bool) { - var buf []byte - - bang := false - for _, r := range encoding { - if r >= utf8.RuneSelf { - return "", false - } - if bang { - bang = false - if r < 'a' || 'z' < r { - return "", false - } - buf = append(buf, byte(r+'A'-'a')) - continue - } - if r == '!' { - bang = true - continue - } - if 'A' <= r && r <= 'Z' { - return "", false - } - buf = append(buf, byte(r)) - } - if bang { - return "", false - } - return string(buf), true -} diff --git a/vendor/golang.org/x/tools/internal/semver/semver.go b/vendor/golang.org/x/tools/internal/semver/semver.go deleted file mode 100644 index 4af7118e5..000000000 --- a/vendor/golang.org/x/tools/internal/semver/semver.go +++ /dev/null @@ -1,388 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package semver implements comparison of semantic version strings. -// In this package, semantic version strings must begin with a leading "v", -// as in "v1.0.0". -// -// The general form of a semantic version string accepted by this package is -// -// vMAJOR[.MINOR[.PATCH[-PRERELEASE][+BUILD]]] -// -// where square brackets indicate optional parts of the syntax; -// MAJOR, MINOR, and PATCH are decimal integers without extra leading zeros; -// PRERELEASE and BUILD are each a series of non-empty dot-separated identifiers -// using only alphanumeric characters and hyphens; and -// all-numeric PRERELEASE identifiers must not have leading zeros. -// -// This package follows Semantic Versioning 2.0.0 (see semver.org) -// with two exceptions. First, it requires the "v" prefix. Second, it recognizes -// vMAJOR and vMAJOR.MINOR (with no prerelease or build suffixes) -// as shorthands for vMAJOR.0.0 and vMAJOR.MINOR.0. -package semver - -// parsed returns the parsed form of a semantic version string. -type parsed struct { - major string - minor string - patch string - short string - prerelease string - build string - err string -} - -// IsValid reports whether v is a valid semantic version string. -func IsValid(v string) bool { - _, ok := parse(v) - return ok -} - -// Canonical returns the canonical formatting of the semantic version v. -// It fills in any missing .MINOR or .PATCH and discards build metadata. -// Two semantic versions compare equal only if their canonical formattings -// are identical strings. -// The canonical invalid semantic version is the empty string. -func Canonical(v string) string { - p, ok := parse(v) - if !ok { - return "" - } - if p.build != "" { - return v[:len(v)-len(p.build)] - } - if p.short != "" { - return v + p.short - } - return v -} - -// Major returns the major version prefix of the semantic version v. -// For example, Major("v2.1.0") == "v2". -// If v is an invalid semantic version string, Major returns the empty string. -func Major(v string) string { - pv, ok := parse(v) - if !ok { - return "" - } - return v[:1+len(pv.major)] -} - -// MajorMinor returns the major.minor version prefix of the semantic version v. -// For example, MajorMinor("v2.1.0") == "v2.1". -// If v is an invalid semantic version string, MajorMinor returns the empty string. -func MajorMinor(v string) string { - pv, ok := parse(v) - if !ok { - return "" - } - i := 1 + len(pv.major) - if j := i + 1 + len(pv.minor); j <= len(v) && v[i] == '.' && v[i+1:j] == pv.minor { - return v[:j] - } - return v[:i] + "." + pv.minor -} - -// Prerelease returns the prerelease suffix of the semantic version v. -// For example, Prerelease("v2.1.0-pre+meta") == "-pre". -// If v is an invalid semantic version string, Prerelease returns the empty string. -func Prerelease(v string) string { - pv, ok := parse(v) - if !ok { - return "" - } - return pv.prerelease -} - -// Build returns the build suffix of the semantic version v. -// For example, Build("v2.1.0+meta") == "+meta". -// If v is an invalid semantic version string, Build returns the empty string. -func Build(v string) string { - pv, ok := parse(v) - if !ok { - return "" - } - return pv.build -} - -// Compare returns an integer comparing two versions according to -// according to semantic version precedence. -// The result will be 0 if v == w, -1 if v < w, or +1 if v > w. -// -// An invalid semantic version string is considered less than a valid one. -// All invalid semantic version strings compare equal to each other. -func Compare(v, w string) int { - pv, ok1 := parse(v) - pw, ok2 := parse(w) - if !ok1 && !ok2 { - return 0 - } - if !ok1 { - return -1 - } - if !ok2 { - return +1 - } - if c := compareInt(pv.major, pw.major); c != 0 { - return c - } - if c := compareInt(pv.minor, pw.minor); c != 0 { - return c - } - if c := compareInt(pv.patch, pw.patch); c != 0 { - return c - } - return comparePrerelease(pv.prerelease, pw.prerelease) -} - -// Max canonicalizes its arguments and then returns the version string -// that compares greater. -func Max(v, w string) string { - v = Canonical(v) - w = Canonical(w) - if Compare(v, w) > 0 { - return v - } - return w -} - -func parse(v string) (p parsed, ok bool) { - if v == "" || v[0] != 'v' { - p.err = "missing v prefix" - return - } - p.major, v, ok = parseInt(v[1:]) - if !ok { - p.err = "bad major version" - return - } - if v == "" { - p.minor = "0" - p.patch = "0" - p.short = ".0.0" - return - } - if v[0] != '.' { - p.err = "bad minor prefix" - ok = false - return - } - p.minor, v, ok = parseInt(v[1:]) - if !ok { - p.err = "bad minor version" - return - } - if v == "" { - p.patch = "0" - p.short = ".0" - return - } - if v[0] != '.' { - p.err = "bad patch prefix" - ok = false - return - } - p.patch, v, ok = parseInt(v[1:]) - if !ok { - p.err = "bad patch version" - return - } - if len(v) > 0 && v[0] == '-' { - p.prerelease, v, ok = parsePrerelease(v) - if !ok { - p.err = "bad prerelease" - return - } - } - if len(v) > 0 && v[0] == '+' { - p.build, v, ok = parseBuild(v) - if !ok { - p.err = "bad build" - return - } - } - if v != "" { - p.err = "junk on end" - ok = false - return - } - ok = true - return -} - -func parseInt(v string) (t, rest string, ok bool) { - if v == "" { - return - } - if v[0] < '0' || '9' < v[0] { - return - } - i := 1 - for i < len(v) && '0' <= v[i] && v[i] <= '9' { - i++ - } - if v[0] == '0' && i != 1 { - return - } - return v[:i], v[i:], true -} - -func parsePrerelease(v string) (t, rest string, ok bool) { - // "A pre-release version MAY be denoted by appending a hyphen and - // a series of dot separated identifiers immediately following the patch version. - // Identifiers MUST comprise only ASCII alphanumerics and hyphen [0-9A-Za-z-]. - // Identifiers MUST NOT be empty. Numeric identifiers MUST NOT include leading zeroes." - if v == "" || v[0] != '-' { - return - } - i := 1 - start := 1 - for i < len(v) && v[i] != '+' { - if !isIdentChar(v[i]) && v[i] != '.' { - return - } - if v[i] == '.' { - if start == i || isBadNum(v[start:i]) { - return - } - start = i + 1 - } - i++ - } - if start == i || isBadNum(v[start:i]) { - return - } - return v[:i], v[i:], true -} - -func parseBuild(v string) (t, rest string, ok bool) { - if v == "" || v[0] != '+' { - return - } - i := 1 - start := 1 - for i < len(v) { - if !isIdentChar(v[i]) { - return - } - if v[i] == '.' { - if start == i { - return - } - start = i + 1 - } - i++ - } - if start == i { - return - } - return v[:i], v[i:], true -} - -func isIdentChar(c byte) bool { - return 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' || '0' <= c && c <= '9' || c == '-' -} - -func isBadNum(v string) bool { - i := 0 - for i < len(v) && '0' <= v[i] && v[i] <= '9' { - i++ - } - return i == len(v) && i > 1 && v[0] == '0' -} - -func isNum(v string) bool { - i := 0 - for i < len(v) && '0' <= v[i] && v[i] <= '9' { - i++ - } - return i == len(v) -} - -func compareInt(x, y string) int { - if x == y { - return 0 - } - if len(x) < len(y) { - return -1 - } - if len(x) > len(y) { - return +1 - } - if x < y { - return -1 - } else { - return +1 - } -} - -func comparePrerelease(x, y string) int { - // "When major, minor, and patch are equal, a pre-release version has - // lower precedence than a normal version. - // Example: 1.0.0-alpha < 1.0.0. - // Precedence for two pre-release versions with the same major, minor, - // and patch version MUST be determined by comparing each dot separated - // identifier from left to right until a difference is found as follows: - // identifiers consisting of only digits are compared numerically and - // identifiers with letters or hyphens are compared lexically in ASCII - // sort order. Numeric identifiers always have lower precedence than - // non-numeric identifiers. A larger set of pre-release fields has a - // higher precedence than a smaller set, if all of the preceding - // identifiers are equal. - // Example: 1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta < - // 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0." - if x == y { - return 0 - } - if x == "" { - return +1 - } - if y == "" { - return -1 - } - for x != "" && y != "" { - x = x[1:] // skip - or . - y = y[1:] // skip - or . - var dx, dy string - dx, x = nextIdent(x) - dy, y = nextIdent(y) - if dx != dy { - ix := isNum(dx) - iy := isNum(dy) - if ix != iy { - if ix { - return -1 - } else { - return +1 - } - } - if ix { - if len(dx) < len(dy) { - return -1 - } - if len(dx) > len(dy) { - return +1 - } - } - if dx < dy { - return -1 - } else { - return +1 - } - } - } - if x == "" { - return -1 - } else { - return +1 - } -} - -func nextIdent(x string) (dx, rest string) { - i := 0 - for i < len(x) && x[i] != '.' { - i++ - } - return x[:i], x[i:] -} diff --git a/vendor/golang.org/x/tools/internal/span/parse.go b/vendor/golang.org/x/tools/internal/span/parse.go deleted file mode 100644 index b3f268a38..000000000 --- a/vendor/golang.org/x/tools/internal/span/parse.go +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package span - -import ( - "strconv" - "strings" - "unicode/utf8" -) - -// Parse returns the location represented by the input. -// All inputs are valid locations, as they can always be a pure filename. -// The returned span will be normalized, and thus if printed may produce a -// different string. -func Parse(input string) Span { - // :0:0#0-0:0#0 - valid := input - var hold, offset int - hadCol := false - suf := rstripSuffix(input) - if suf.sep == "#" { - offset = suf.num - suf = rstripSuffix(suf.remains) - } - if suf.sep == ":" { - valid = suf.remains - hold = suf.num - hadCol = true - suf = rstripSuffix(suf.remains) - } - switch { - case suf.sep == ":": - return New(NewURI(suf.remains), NewPoint(suf.num, hold, offset), Point{}) - case suf.sep == "-": - // we have a span, fall out of the case to continue - default: - // separator not valid, rewind to either the : or the start - return New(NewURI(valid), NewPoint(hold, 0, offset), Point{}) - } - // only the span form can get here - // at this point we still don't know what the numbers we have mean - // if have not yet seen a : then we might have either a line or a column depending - // on whether start has a column or not - // we build an end point and will fix it later if needed - end := NewPoint(suf.num, hold, offset) - hold, offset = 0, 0 - suf = rstripSuffix(suf.remains) - if suf.sep == "#" { - offset = suf.num - suf = rstripSuffix(suf.remains) - } - if suf.sep != ":" { - // turns out we don't have a span after all, rewind - return New(NewURI(valid), end, Point{}) - } - valid = suf.remains - hold = suf.num - suf = rstripSuffix(suf.remains) - if suf.sep != ":" { - // line#offset only - return New(NewURI(valid), NewPoint(hold, 0, offset), end) - } - // we have a column, so if end only had one number, it is also the column - if !hadCol { - end = NewPoint(suf.num, end.v.Line, end.v.Offset) - } - return New(NewURI(suf.remains), NewPoint(suf.num, hold, offset), end) -} - -type suffix struct { - remains string - sep string - num int -} - -func rstripSuffix(input string) suffix { - if len(input) == 0 { - return suffix{"", "", -1} - } - remains := input - num := -1 - // first see if we have a number at the end - last := strings.LastIndexFunc(remains, func(r rune) bool { return r < '0' || r > '9' }) - if last >= 0 && last < len(remains)-1 { - number, err := strconv.ParseInt(remains[last+1:], 10, 64) - if err == nil { - num = int(number) - remains = remains[:last+1] - } - } - // now see if we have a trailing separator - r, w := utf8.DecodeLastRuneInString(remains) - if r != ':' && r != '#' && r == '#' { - return suffix{input, "", -1} - } - remains = remains[:len(remains)-w] - return suffix{remains, string(r), num} -} diff --git a/vendor/golang.org/x/tools/internal/span/span.go b/vendor/golang.org/x/tools/internal/span/span.go deleted file mode 100644 index 4d2ad0986..000000000 --- a/vendor/golang.org/x/tools/internal/span/span.go +++ /dev/null @@ -1,285 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package span contains support for representing with positions and ranges in -// text files. -package span - -import ( - "encoding/json" - "fmt" - "path" -) - -// Span represents a source code range in standardized form. -type Span struct { - v span -} - -// Point represents a single point within a file. -// In general this should only be used as part of a Span, as on its own it -// does not carry enough information. -type Point struct { - v point -} - -type span struct { - URI URI `json:"uri"` - Start point `json:"start"` - End point `json:"end"` -} - -type point struct { - Line int `json:"line"` - Column int `json:"column"` - Offset int `json:"offset"` -} - -// Invalid is a span that reports false from IsValid -var Invalid = Span{v: span{Start: invalidPoint.v, End: invalidPoint.v}} - -var invalidPoint = Point{v: point{Line: 0, Column: 0, Offset: -1}} - -// Converter is the interface to an object that can convert between line:column -// and offset forms for a single file. -type Converter interface { - //ToPosition converts from an offset to a line:column pair. - ToPosition(offset int) (int, int, error) - //ToOffset converts from a line:column pair to an offset. - ToOffset(line, col int) (int, error) -} - -func New(uri URI, start Point, end Point) Span { - s := Span{v: span{URI: uri, Start: start.v, End: end.v}} - s.v.clean() - return s -} - -func NewPoint(line, col, offset int) Point { - p := Point{v: point{Line: line, Column: col, Offset: offset}} - p.v.clean() - return p -} - -func Compare(a, b Span) int { - if r := CompareURI(a.URI(), b.URI()); r != 0 { - return r - } - if r := comparePoint(a.v.Start, b.v.Start); r != 0 { - return r - } - return comparePoint(a.v.End, b.v.End) -} - -func ComparePoint(a, b Point) int { - return comparePoint(a.v, b.v) -} - -func comparePoint(a, b point) int { - if !a.hasPosition() { - if a.Offset < b.Offset { - return -1 - } - if a.Offset > b.Offset { - return 1 - } - return 0 - } - if a.Line < b.Line { - return -1 - } - if a.Line > b.Line { - return 1 - } - if a.Column < b.Column { - return -1 - } - if a.Column > b.Column { - return 1 - } - return 0 -} - -func (s Span) HasPosition() bool { return s.v.Start.hasPosition() } -func (s Span) HasOffset() bool { return s.v.Start.hasOffset() } -func (s Span) IsValid() bool { return s.v.Start.isValid() } -func (s Span) IsPoint() bool { return s.v.Start == s.v.End } -func (s Span) URI() URI { return s.v.URI } -func (s Span) Start() Point { return Point{s.v.Start} } -func (s Span) End() Point { return Point{s.v.End} } -func (s *Span) MarshalJSON() ([]byte, error) { return json.Marshal(&s.v) } -func (s *Span) UnmarshalJSON(b []byte) error { return json.Unmarshal(b, &s.v) } - -func (p Point) HasPosition() bool { return p.v.hasPosition() } -func (p Point) HasOffset() bool { return p.v.hasOffset() } -func (p Point) IsValid() bool { return p.v.isValid() } -func (p *Point) MarshalJSON() ([]byte, error) { return json.Marshal(&p.v) } -func (p *Point) UnmarshalJSON(b []byte) error { return json.Unmarshal(b, &p.v) } -func (p Point) Line() int { - if !p.v.hasPosition() { - panic(fmt.Errorf("position not set in %v", p.v)) - } - return p.v.Line -} -func (p Point) Column() int { - if !p.v.hasPosition() { - panic(fmt.Errorf("position not set in %v", p.v)) - } - return p.v.Column -} -func (p Point) Offset() int { - if !p.v.hasOffset() { - panic(fmt.Errorf("offset not set in %v", p.v)) - } - return p.v.Offset -} - -func (p point) hasPosition() bool { return p.Line > 0 } -func (p point) hasOffset() bool { return p.Offset >= 0 } -func (p point) isValid() bool { return p.hasPosition() || p.hasOffset() } -func (p point) isZero() bool { - return (p.Line == 1 && p.Column == 1) || (!p.hasPosition() && p.Offset == 0) -} - -func (s *span) clean() { - //this presumes the points are already clean - if !s.End.isValid() || (s.End == point{}) { - s.End = s.Start - } -} - -func (p *point) clean() { - if p.Line < 0 { - p.Line = 0 - } - if p.Column <= 0 { - if p.Line > 0 { - p.Column = 1 - } else { - p.Column = 0 - } - } - if p.Offset == 0 && (p.Line > 1 || p.Column > 1) { - p.Offset = -1 - } -} - -// Format implements fmt.Formatter to print the Location in a standard form. -// The format produced is one that can be read back in using Parse. -func (s Span) Format(f fmt.State, c rune) { - fullForm := f.Flag('+') - preferOffset := f.Flag('#') - // we should always have a uri, simplify if it is file format - //TODO: make sure the end of the uri is unambiguous - uri := string(s.v.URI) - if c == 'f' { - uri = path.Base(uri) - } else if !fullForm { - uri = s.v.URI.Filename() - } - fmt.Fprint(f, uri) - if !s.IsValid() || (!fullForm && s.v.Start.isZero() && s.v.End.isZero()) { - return - } - // see which bits of start to write - printOffset := s.HasOffset() && (fullForm || preferOffset || !s.HasPosition()) - printLine := s.HasPosition() && (fullForm || !printOffset) - printColumn := printLine && (fullForm || (s.v.Start.Column > 1 || s.v.End.Column > 1)) - fmt.Fprint(f, ":") - if printLine { - fmt.Fprintf(f, "%d", s.v.Start.Line) - } - if printColumn { - fmt.Fprintf(f, ":%d", s.v.Start.Column) - } - if printOffset { - fmt.Fprintf(f, "#%d", s.v.Start.Offset) - } - // start is written, do we need end? - if s.IsPoint() { - return - } - // we don't print the line if it did not change - printLine = fullForm || (printLine && s.v.End.Line > s.v.Start.Line) - fmt.Fprint(f, "-") - if printLine { - fmt.Fprintf(f, "%d", s.v.End.Line) - } - if printColumn { - if printLine { - fmt.Fprint(f, ":") - } - fmt.Fprintf(f, "%d", s.v.End.Column) - } - if printOffset { - fmt.Fprintf(f, "#%d", s.v.End.Offset) - } -} - -func (s Span) WithPosition(c Converter) (Span, error) { - if err := s.update(c, true, false); err != nil { - return Span{}, err - } - return s, nil -} - -func (s Span) WithOffset(c Converter) (Span, error) { - if err := s.update(c, false, true); err != nil { - return Span{}, err - } - return s, nil -} - -func (s Span) WithAll(c Converter) (Span, error) { - if err := s.update(c, true, true); err != nil { - return Span{}, err - } - return s, nil -} - -func (s *Span) update(c Converter, withPos, withOffset bool) error { - if !s.IsValid() { - return fmt.Errorf("cannot add information to an invalid span") - } - if withPos && !s.HasPosition() { - if err := s.v.Start.updatePosition(c); err != nil { - return err - } - if s.v.End.Offset == s.v.Start.Offset { - s.v.End = s.v.Start - } else if err := s.v.End.updatePosition(c); err != nil { - return err - } - } - if withOffset && (!s.HasOffset() || (s.v.End.hasPosition() && !s.v.End.hasOffset())) { - if err := s.v.Start.updateOffset(c); err != nil { - return err - } - if s.v.End.Line == s.v.Start.Line && s.v.End.Column == s.v.Start.Column { - s.v.End.Offset = s.v.Start.Offset - } else if err := s.v.End.updateOffset(c); err != nil { - return err - } - } - return nil -} - -func (p *point) updatePosition(c Converter) error { - line, col, err := c.ToPosition(p.Offset) - if err != nil { - return err - } - p.Line = line - p.Column = col - return nil -} - -func (p *point) updateOffset(c Converter) error { - offset, err := c.ToOffset(p.Line, p.Column) - if err != nil { - return err - } - p.Offset = offset - return nil -} diff --git a/vendor/golang.org/x/tools/internal/span/token.go b/vendor/golang.org/x/tools/internal/span/token.go deleted file mode 100644 index ce44541b2..000000000 --- a/vendor/golang.org/x/tools/internal/span/token.go +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package span - -import ( - "fmt" - "go/token" -) - -// Range represents a source code range in token.Pos form. -// It also carries the FileSet that produced the positions, so that it is -// self contained. -type Range struct { - FileSet *token.FileSet - Start token.Pos - End token.Pos -} - -// TokenConverter is a Converter backed by a token file set and file. -// It uses the file set methods to work out the conversions, which -// makes it fast and does not require the file contents. -type TokenConverter struct { - fset *token.FileSet - file *token.File -} - -// NewRange creates a new Range from a FileSet and two positions. -// To represent a point pass a 0 as the end pos. -func NewRange(fset *token.FileSet, start, end token.Pos) Range { - return Range{ - FileSet: fset, - Start: start, - End: end, - } -} - -// NewTokenConverter returns an implementation of Converter backed by a -// token.File. -func NewTokenConverter(fset *token.FileSet, f *token.File) *TokenConverter { - return &TokenConverter{fset: fset, file: f} -} - -// NewContentConverter returns an implementation of Converter for the -// given file content. -func NewContentConverter(filename string, content []byte) *TokenConverter { - fset := token.NewFileSet() - f := fset.AddFile(filename, -1, len(content)) - f.SetLinesForContent(content) - return &TokenConverter{fset: fset, file: f} -} - -// IsPoint returns true if the range represents a single point. -func (r Range) IsPoint() bool { - return r.Start == r.End -} - -// Span converts a Range to a Span that represents the Range. -// It will fill in all the members of the Span, calculating the line and column -// information. -func (r Range) Span() (Span, error) { - f := r.FileSet.File(r.Start) - if f == nil { - return Span{}, fmt.Errorf("file not found in FileSet") - } - s := Span{v: span{URI: FileURI(f.Name())}} - var err error - s.v.Start.Offset, err = offset(f, r.Start) - if err != nil { - return Span{}, err - } - if r.End.IsValid() { - s.v.End.Offset, err = offset(f, r.End) - if err != nil { - return Span{}, err - } - } - s.v.Start.clean() - s.v.End.clean() - s.v.clean() - converter := NewTokenConverter(r.FileSet, f) - return s.WithPosition(converter) -} - -// offset is a copy of the Offset function in go/token, but with the adjustment -// that it does not panic on invalid positions. -func offset(f *token.File, pos token.Pos) (int, error) { - if int(pos) < f.Base() || int(pos) > f.Base()+f.Size() { - return 0, fmt.Errorf("invalid pos") - } - return int(pos) - f.Base(), nil -} - -// Range converts a Span to a Range that represents the Span for the supplied -// File. -func (s Span) Range(converter *TokenConverter) (Range, error) { - s, err := s.WithOffset(converter) - if err != nil { - return Range{}, err - } - // go/token will panic if the offset is larger than the file's size, - // so check here to avoid panicking. - if s.Start().Offset() > converter.file.Size() { - return Range{}, fmt.Errorf("start offset %v is past the end of the file %v", s.Start(), converter.file.Size()) - } - if s.End().Offset() > converter.file.Size() { - return Range{}, fmt.Errorf("end offset %v is past the end of the file %v", s.End(), converter.file.Size()) - } - return Range{ - FileSet: converter.fset, - Start: converter.file.Pos(s.Start().Offset()), - End: converter.file.Pos(s.End().Offset()), - }, nil -} - -func (l *TokenConverter) ToPosition(offset int) (int, int, error) { - if offset > l.file.Size() { - return 0, 0, fmt.Errorf("offset %v is past the end of the file %v", offset, l.file.Size()) - } - pos := l.file.Pos(offset) - p := l.fset.Position(pos) - if offset == l.file.Size() { - return p.Line + 1, 1, nil - } - return p.Line, p.Column, nil -} - -func (l *TokenConverter) ToOffset(line, col int) (int, error) { - if line < 0 { - return -1, fmt.Errorf("line is not valid") - } - lineMax := l.file.LineCount() + 1 - if line > lineMax { - return -1, fmt.Errorf("line is beyond end of file %v", lineMax) - } else if line == lineMax { - if col > 1 { - return -1, fmt.Errorf("column is beyond end of file") - } - // at the end of the file, allowing for a trailing eol - return l.file.Size(), nil - } - pos := lineStart(l.file, line) - if !pos.IsValid() { - return -1, fmt.Errorf("line is not in file") - } - // we assume that column is in bytes here, and that the first byte of a - // line is at column 1 - pos += token.Pos(col - 1) - return offset(l.file, pos) -} diff --git a/vendor/golang.org/x/tools/internal/span/token111.go b/vendor/golang.org/x/tools/internal/span/token111.go deleted file mode 100644 index bf7a5406b..000000000 --- a/vendor/golang.org/x/tools/internal/span/token111.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !go1.12 - -package span - -import ( - "go/token" -) - -// lineStart is the pre-Go 1.12 version of (*token.File).LineStart. For Go -// versions <= 1.11, we borrow logic from the analysisutil package. -// TODO(rstambler): Delete this file when we no longer support Go 1.11. -func lineStart(f *token.File, line int) token.Pos { - // Use binary search to find the start offset of this line. - - min := 0 // inclusive - max := f.Size() // exclusive - for { - offset := (min + max) / 2 - pos := f.Pos(offset) - posn := f.Position(pos) - if posn.Line == line { - return pos - (token.Pos(posn.Column) - 1) - } - - if min+1 >= max { - return token.NoPos - } - - if posn.Line < line { - min = offset - } else { - max = offset - } - } -} diff --git a/vendor/golang.org/x/tools/internal/span/token112.go b/vendor/golang.org/x/tools/internal/span/token112.go deleted file mode 100644 index 017aec9c1..000000000 --- a/vendor/golang.org/x/tools/internal/span/token112.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.12 - -package span - -import ( - "go/token" -) - -// TODO(rstambler): Delete this file when we no longer support Go 1.11. -func lineStart(f *token.File, line int) token.Pos { - return f.LineStart(line) -} diff --git a/vendor/golang.org/x/tools/internal/span/uri.go b/vendor/golang.org/x/tools/internal/span/uri.go deleted file mode 100644 index e05a9e6ef..000000000 --- a/vendor/golang.org/x/tools/internal/span/uri.go +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package span - -import ( - "fmt" - "net/url" - "os" - "path" - "path/filepath" - "runtime" - "strings" - "unicode" -) - -const fileScheme = "file" - -// URI represents the full URI for a file. -type URI string - -// Filename returns the file path for the given URI. -// It is an error to call this on a URI that is not a valid filename. -func (uri URI) Filename() string { - filename, err := filename(uri) - if err != nil { - panic(err) - } - return filepath.FromSlash(filename) -} - -func filename(uri URI) (string, error) { - if uri == "" { - return "", nil - } - u, err := url.ParseRequestURI(string(uri)) - if err != nil { - return "", err - } - if u.Scheme != fileScheme { - return "", fmt.Errorf("only file URIs are supported, got %q from %q", u.Scheme, uri) - } - if isWindowsDriveURI(u.Path) { - u.Path = u.Path[1:] - } - return u.Path, nil -} - -// NewURI returns a span URI for the string. -// It will attempt to detect if the string is a file path or uri. -func NewURI(s string) URI { - if u, err := url.PathUnescape(s); err == nil { - s = u - } - if strings.HasPrefix(s, fileScheme+"://") { - return URI(s) - } - return FileURI(s) -} - -func CompareURI(a, b URI) int { - if equalURI(a, b) { - return 0 - } - if a < b { - return -1 - } - return 1 -} - -func equalURI(a, b URI) bool { - if a == b { - return true - } - // If we have the same URI basename, we may still have the same file URIs. - if !strings.EqualFold(path.Base(string(a)), path.Base(string(b))) { - return false - } - fa, err := filename(a) - if err != nil { - return false - } - fb, err := filename(b) - if err != nil { - return false - } - // Stat the files to check if they are equal. - infoa, err := os.Stat(filepath.FromSlash(fa)) - if err != nil { - return false - } - infob, err := os.Stat(filepath.FromSlash(fb)) - if err != nil { - return false - } - return os.SameFile(infoa, infob) -} - -// FileURI returns a span URI for the supplied file path. -// It will always have the file scheme. -func FileURI(path string) URI { - if path == "" { - return "" - } - // Handle standard library paths that contain the literal "$GOROOT". - // TODO(rstambler): The go/packages API should allow one to determine a user's $GOROOT. - const prefix = "$GOROOT" - if len(path) >= len(prefix) && strings.EqualFold(prefix, path[:len(prefix)]) { - suffix := path[len(prefix):] - path = runtime.GOROOT() + suffix - } - if !isWindowsDrivePath(path) { - if abs, err := filepath.Abs(path); err == nil { - path = abs - } - } - // Check the file path again, in case it became absolute. - if isWindowsDrivePath(path) { - path = "/" + path - } - path = filepath.ToSlash(path) - u := url.URL{ - Scheme: fileScheme, - Path: path, - } - uri := u.String() - if unescaped, err := url.PathUnescape(uri); err == nil { - uri = unescaped - } - return URI(uri) -} - -// isWindowsDrivePath returns true if the file path is of the form used by -// Windows. We check if the path begins with a drive letter, followed by a ":". -func isWindowsDrivePath(path string) bool { - if len(path) < 4 { - return false - } - return unicode.IsLetter(rune(path[0])) && path[1] == ':' -} - -// isWindowsDriveURI returns true if the file URI is of the format used by -// Windows URIs. The url.Parse package does not specially handle Windows paths -// (see https://golang.org/issue/6027). We check if the URI path has -// a drive prefix (e.g. "/C:"). If so, we trim the leading "/". -func isWindowsDriveURI(uri string) bool { - if len(uri) < 4 { - return false - } - return uri[0] == '/' && unicode.IsLetter(rune(uri[1])) && uri[2] == ':' -} diff --git a/vendor/golang.org/x/tools/internal/span/utf16.go b/vendor/golang.org/x/tools/internal/span/utf16.go deleted file mode 100644 index 561b3fa50..000000000 --- a/vendor/golang.org/x/tools/internal/span/utf16.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package span - -import ( - "fmt" - "unicode/utf16" - "unicode/utf8" -) - -// ToUTF16Column calculates the utf16 column expressed by the point given the -// supplied file contents. -// This is used to convert from the native (always in bytes) column -// representation and the utf16 counts used by some editors. -func ToUTF16Column(p Point, content []byte) (int, error) { - if content == nil { - return -1, fmt.Errorf("ToUTF16Column: missing content") - } - if !p.HasPosition() { - return -1, fmt.Errorf("ToUTF16Column: point is missing position") - } - if !p.HasOffset() { - return -1, fmt.Errorf("ToUTF16Column: point is missing offset") - } - offset := p.Offset() // 0-based - colZero := p.Column() - 1 // 0-based - if colZero == 0 { - // 0-based column 0, so it must be chr 1 - return 1, nil - } else if colZero < 0 { - return -1, fmt.Errorf("ToUTF16Column: column is invalid (%v)", colZero) - } - // work out the offset at the start of the line using the column - lineOffset := offset - colZero - if lineOffset < 0 || offset > len(content) { - return -1, fmt.Errorf("ToUTF16Column: offsets %v-%v outside file contents (%v)", lineOffset, offset, len(content)) - } - // Use the offset to pick out the line start. - // This cannot panic: offset > len(content) and lineOffset < offset. - start := content[lineOffset:] - - // Now, truncate down to the supplied column. - start = start[:colZero] - - // and count the number of utf16 characters - // in theory we could do this by hand more efficiently... - return len(utf16.Encode([]rune(string(start)))) + 1, nil -} - -// FromUTF16Column advances the point by the utf16 character offset given the -// supplied line contents. -// This is used to convert from the utf16 counts used by some editors to the -// native (always in bytes) column representation. -func FromUTF16Column(p Point, chr int, content []byte) (Point, error) { - if !p.HasOffset() { - return Point{}, fmt.Errorf("FromUTF16Column: point is missing offset") - } - // if chr is 1 then no adjustment needed - if chr <= 1 { - return p, nil - } - if p.Offset() >= len(content) { - return p, fmt.Errorf("FromUTF16Column: offset (%v) greater than length of content (%v)", p.Offset(), len(content)) - } - remains := content[p.Offset():] - // scan forward the specified number of characters - for count := 1; count < chr; count++ { - if len(remains) <= 0 { - return Point{}, fmt.Errorf("FromUTF16Column: chr goes beyond the content") - } - r, w := utf8.DecodeRune(remains) - if r == '\n' { - // Per the LSP spec: - // - // > If the character value is greater than the line length it - // > defaults back to the line length. - break - } - remains = remains[w:] - if r >= 0x10000 { - // a two point rune - count++ - // if we finished in a two point rune, do not advance past the first - if count >= chr { - break - } - } - p.v.Column += w - p.v.Offset += w - } - return p, nil -} diff --git a/vendor/golang.org/x/tools/internal/telemetry/context.go b/vendor/golang.org/x/tools/internal/telemetry/context.go deleted file mode 100644 index b8037ca0f..000000000 --- a/vendor/golang.org/x/tools/internal/telemetry/context.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package telemetry - -import "context" - -type contextKeyType int - -const ( - spanContextKey = contextKeyType(iota) -) - -func WithSpan(ctx context.Context, span *Span) context.Context { - return context.WithValue(ctx, spanContextKey, span) -} - -func GetSpan(ctx context.Context) *Span { - v := ctx.Value(spanContextKey) - if v == nil { - return nil - } - return v.(*Span) -} diff --git a/vendor/golang.org/x/tools/internal/telemetry/doc.go b/vendor/golang.org/x/tools/internal/telemetry/doc.go deleted file mode 100644 index b5b93f222..000000000 --- a/vendor/golang.org/x/tools/internal/telemetry/doc.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package telemetry provides an opinionated set of packages that cover the main -// concepts of telemetry in an implementation agnostic way. -// As a library author you should look at -// stats (for aggregatable measurements) -// trace (for scoped timing spans) -// log (for for time based events) -// As a binary author you might look at -// metric (for methods of aggregating stats) -// exporter (for methods of exporting the telemetry to external tools) -// debug (for serving internal http pages of some of the telemetry) -package telemetry diff --git a/vendor/golang.org/x/tools/internal/telemetry/event.go b/vendor/golang.org/x/tools/internal/telemetry/event.go deleted file mode 100644 index 88a3478db..000000000 --- a/vendor/golang.org/x/tools/internal/telemetry/event.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package telemetry - -import ( - "fmt" - "time" -) - -type Event struct { - At time.Time - Message string - Error error - Tags TagList -} - -func (e Event) Format(f fmt.State, r rune) { - if !e.At.IsZero() { - fmt.Fprint(f, e.At.Format("2006/01/02 15:04:05 ")) - } - fmt.Fprint(f, e.Message) - if e.Error != nil { - if f.Flag('+') { - fmt.Fprintf(f, ": %+v", e.Error) - } else { - fmt.Fprintf(f, ": %v", e.Error) - } - } - for _, tag := range e.Tags { - fmt.Fprintf(f, "\n\t%v = %v", tag.Key, tag.Value) - } -} diff --git a/vendor/golang.org/x/tools/internal/telemetry/export/export.go b/vendor/golang.org/x/tools/internal/telemetry/export/export.go deleted file mode 100644 index 8ed8cd3ff..000000000 --- a/vendor/golang.org/x/tools/internal/telemetry/export/export.go +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package export holds the definition of the telemetry Exporter interface, -// along with some simple implementations. -// Larger more complex exporters are in sub packages of their own. -package export - -import ( - "context" - "os" - "sync" - "time" - - "golang.org/x/tools/internal/telemetry" -) - -type Exporter interface { - StartSpan(context.Context, *telemetry.Span) - FinishSpan(context.Context, *telemetry.Span) - - // Log is a function that handles logging events. - // Observers may use information in the context to decide what to do with a - // given log event. They should return true if they choose to handle the - Log(context.Context, telemetry.Event) - - Metric(context.Context, telemetry.MetricData) - - Flush() -} - -var ( - exporterMu sync.Mutex - exporter = LogWriter(os.Stderr, true) -) - -func AddExporters(e ...Exporter) { - exporterMu.Lock() - defer exporterMu.Unlock() - exporter = Multi(append([]Exporter{exporter}, e...)...) -} - -func StartSpan(ctx context.Context, span *telemetry.Span, at time.Time) { - exporterMu.Lock() - defer exporterMu.Unlock() - span.Start = at - exporter.StartSpan(ctx, span) -} - -func FinishSpan(ctx context.Context, span *telemetry.Span, at time.Time) { - exporterMu.Lock() - defer exporterMu.Unlock() - span.Finish = at - exporter.FinishSpan(ctx, span) -} - -func Tag(ctx context.Context, at time.Time, tags telemetry.TagList) { - exporterMu.Lock() - defer exporterMu.Unlock() - // If context has a span we need to add the tags to it - span := telemetry.GetSpan(ctx) - if span == nil { - return - } - if span.Start.IsZero() { - // span still being created, tag it directly - span.Tags = append(span.Tags, tags...) - return - } - // span in progress, add an event to the span - span.Events = append(span.Events, telemetry.Event{ - At: at, - Tags: tags, - }) -} - -func Log(ctx context.Context, event telemetry.Event) { - exporterMu.Lock() - defer exporterMu.Unlock() - // If context has a span we need to add the event to it - span := telemetry.GetSpan(ctx) - if span != nil { - span.Events = append(span.Events, event) - } - // and now also hand the event of to the current observer - exporter.Log(ctx, event) -} - -func Metric(ctx context.Context, data telemetry.MetricData) { - exporterMu.Lock() - defer exporterMu.Unlock() - exporter.Metric(ctx, data) -} - -func Flush() { - exporterMu.Lock() - defer exporterMu.Unlock() - exporter.Flush() -} diff --git a/vendor/golang.org/x/tools/internal/telemetry/export/log.go b/vendor/golang.org/x/tools/internal/telemetry/export/log.go deleted file mode 100644 index d840e5356..000000000 --- a/vendor/golang.org/x/tools/internal/telemetry/export/log.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package export - -import ( - "context" - "fmt" - "io" - - "golang.org/x/tools/internal/telemetry" -) - -// LogWriter returns an observer that logs events to the supplied writer. -// If onlyErrors is true it does not log any event that did not have an -// associated error. -// It ignores all telemetry other than log events. -func LogWriter(w io.Writer, onlyErrors bool) Exporter { - return &logWriter{writer: w, onlyErrors: onlyErrors} -} - -type logWriter struct { - writer io.Writer - onlyErrors bool -} - -func (w *logWriter) StartSpan(context.Context, *telemetry.Span) {} -func (w *logWriter) FinishSpan(context.Context, *telemetry.Span) {} -func (w *logWriter) Log(ctx context.Context, event telemetry.Event) { - if event.Error == nil { - // we only log errors by default - return - } - fmt.Fprintf(w.writer, "%v\n", event) -} -func (w *logWriter) Metric(context.Context, telemetry.MetricData) {} -func (w *logWriter) Flush() {} diff --git a/vendor/golang.org/x/tools/internal/telemetry/export/multi.go b/vendor/golang.org/x/tools/internal/telemetry/export/multi.go deleted file mode 100644 index df19f2c33..000000000 --- a/vendor/golang.org/x/tools/internal/telemetry/export/multi.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package export - -import ( - "context" - - "golang.org/x/tools/internal/telemetry" -) - -// Multi returns an exporter that invokes all the exporters given to it in order. -func Multi(e ...Exporter) Exporter { - a := make(multi, 0, len(e)) - for _, i := range e { - if i == nil { - continue - } - if i, ok := i.(multi); ok { - a = append(a, i...) - continue - } - a = append(a, i) - } - return a -} - -type multi []Exporter - -func (m multi) StartSpan(ctx context.Context, span *telemetry.Span) { - for _, o := range m { - o.StartSpan(ctx, span) - } -} -func (m multi) FinishSpan(ctx context.Context, span *telemetry.Span) { - for _, o := range m { - o.FinishSpan(ctx, span) - } -} -func (m multi) Log(ctx context.Context, event telemetry.Event) { - for _, o := range m { - o.Log(ctx, event) - } -} -func (m multi) Metric(ctx context.Context, data telemetry.MetricData) { - for _, o := range m { - o.Metric(ctx, data) - } -} -func (m multi) Flush() { - for _, o := range m { - o.Flush() - } -} diff --git a/vendor/golang.org/x/tools/internal/telemetry/export/null.go b/vendor/golang.org/x/tools/internal/telemetry/export/null.go deleted file mode 100644 index cc01ba7a2..000000000 --- a/vendor/golang.org/x/tools/internal/telemetry/export/null.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package export - -import ( - "context" - - "golang.org/x/tools/internal/telemetry" -) - -// Null returns an observer that does nothing. -func Null() Exporter { - return null{} -} - -type null struct{} - -func (null) StartSpan(context.Context, *telemetry.Span) {} -func (null) FinishSpan(context.Context, *telemetry.Span) {} -func (null) Log(context.Context, telemetry.Event) {} -func (null) Metric(context.Context, telemetry.MetricData) {} -func (null) Flush() {} diff --git a/vendor/golang.org/x/tools/internal/telemetry/export/ocagent/metrics.go b/vendor/golang.org/x/tools/internal/telemetry/export/ocagent/metrics.go deleted file mode 100644 index 6cb824df6..000000000 --- a/vendor/golang.org/x/tools/internal/telemetry/export/ocagent/metrics.go +++ /dev/null @@ -1,214 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ocagent - -import ( - "fmt" - "time" - - "golang.org/x/tools/internal/telemetry" - "golang.org/x/tools/internal/telemetry/export/ocagent/wire" - "golang.org/x/tools/internal/telemetry/metric" -) - -// dataToMetricDescriptor return a *wire.MetricDescriptor based on data. -func dataToMetricDescriptor(data telemetry.MetricData) *wire.MetricDescriptor { - if data == nil { - return nil - } - descriptor := &wire.MetricDescriptor{ - Name: data.Handle(), - Description: getDescription(data), - // TODO: Unit? - Type: dataToMetricDescriptorType(data), - LabelKeys: getLabelKeys(data), - } - - return descriptor -} - -// getDescription returns the description of data. -func getDescription(data telemetry.MetricData) string { - switch d := data.(type) { - case *metric.Int64Data: - return d.Info.Description - - case *metric.Float64Data: - return d.Info.Description - - case *metric.HistogramInt64Data: - return d.Info.Description - - case *metric.HistogramFloat64Data: - return d.Info.Description - } - - return "" -} - -// getLabelKeys returns a slice of *wire.LabelKeys based on the keys -// in data. -func getLabelKeys(data telemetry.MetricData) []*wire.LabelKey { - switch d := data.(type) { - case *metric.Int64Data: - return infoKeysToLabelKeys(d.Info.Keys) - - case *metric.Float64Data: - return infoKeysToLabelKeys(d.Info.Keys) - - case *metric.HistogramInt64Data: - return infoKeysToLabelKeys(d.Info.Keys) - - case *metric.HistogramFloat64Data: - return infoKeysToLabelKeys(d.Info.Keys) - } - - return nil -} - -// dataToMetricDescriptorType returns a wire.MetricDescriptor_Type based on the -// underlying type of data. -func dataToMetricDescriptorType(data telemetry.MetricData) wire.MetricDescriptor_Type { - switch d := data.(type) { - case *metric.Int64Data: - if d.IsGauge { - return wire.MetricDescriptor_GAUGE_INT64 - } - return wire.MetricDescriptor_CUMULATIVE_INT64 - - case *metric.Float64Data: - if d.IsGauge { - return wire.MetricDescriptor_GAUGE_DOUBLE - } - return wire.MetricDescriptor_CUMULATIVE_DOUBLE - - case *metric.HistogramInt64Data: - return wire.MetricDescriptor_CUMULATIVE_DISTRIBUTION - - case *metric.HistogramFloat64Data: - return wire.MetricDescriptor_CUMULATIVE_DISTRIBUTION - } - - return wire.MetricDescriptor_UNSPECIFIED -} - -// dataToTimeseries returns a slice of *wire.TimeSeries based on the -// points in data. -func dataToTimeseries(data telemetry.MetricData, start time.Time) []*wire.TimeSeries { - if data == nil { - return nil - } - - numRows := numRows(data) - startTimestamp := convertTimestamp(start) - timeseries := make([]*wire.TimeSeries, 0, numRows) - - for i := 0; i < numRows; i++ { - timeseries = append(timeseries, &wire.TimeSeries{ - StartTimestamp: &startTimestamp, - // TODO: labels? - Points: dataToPoints(data, i), - }) - } - - return timeseries -} - -// numRows returns the number of rows in data. -func numRows(data telemetry.MetricData) int { - switch d := data.(type) { - case *metric.Int64Data: - return len(d.Rows) - case *metric.Float64Data: - return len(d.Rows) - case *metric.HistogramInt64Data: - return len(d.Rows) - case *metric.HistogramFloat64Data: - return len(d.Rows) - } - - return 0 -} - -// dataToPoints returns an array of *wire.Points based on the point(s) -// in data at index i. -func dataToPoints(data telemetry.MetricData, i int) []*wire.Point { - switch d := data.(type) { - case *metric.Int64Data: - timestamp := convertTimestamp(*d.EndTime) - return []*wire.Point{ - { - Value: wire.PointInt64Value{ - Int64Value: d.Rows[i], - }, - Timestamp: ×tamp, - }, - } - case *metric.Float64Data: - timestamp := convertTimestamp(*d.EndTime) - return []*wire.Point{ - { - Value: wire.PointDoubleValue{ - DoubleValue: d.Rows[i], - }, - Timestamp: ×tamp, - }, - } - case *metric.HistogramInt64Data: - row := d.Rows[i] - bucketBounds := make([]float64, len(d.Info.Buckets)) - for i, val := range d.Info.Buckets { - bucketBounds[i] = float64(val) - } - return distributionToPoints(row.Values, row.Count, float64(row.Sum), bucketBounds, *d.EndTime) - case *metric.HistogramFloat64Data: - row := d.Rows[i] - return distributionToPoints(row.Values, row.Count, row.Sum, d.Info.Buckets, *d.EndTime) - } - - return nil -} - -// distributionToPoints returns an array of *wire.Points containing a -// wire.PointDistributionValue representing a distribution with the -// supplied counts, count, and sum. -func distributionToPoints(counts []int64, count int64, sum float64, bucketBounds []float64, end time.Time) []*wire.Point { - buckets := make([]*wire.Bucket, len(counts)) - for i := 0; i < len(counts); i++ { - buckets[i] = &wire.Bucket{ - Count: counts[i], - } - } - timestamp := convertTimestamp(end) - return []*wire.Point{ - { - Value: wire.PointDistributionValue{ - DistributionValue: &wire.DistributionValue{ - Count: count, - Sum: sum, - // TODO: SumOfSquaredDeviation? - Buckets: buckets, - BucketOptions: wire.BucketOptionsExplicit{ - Bounds: bucketBounds, - }, - }, - }, - Timestamp: ×tamp, - }, - } -} - -// infoKeysToLabelKeys returns an array of *wire.LabelKeys containing the -// string values of the elements of labelKeys. -func infoKeysToLabelKeys(infoKeys []interface{}) []*wire.LabelKey { - labelKeys := make([]*wire.LabelKey, 0, len(infoKeys)) - for _, key := range infoKeys { - labelKeys = append(labelKeys, &wire.LabelKey{ - Key: fmt.Sprintf("%v", key), - }) - } - - return labelKeys -} diff --git a/vendor/golang.org/x/tools/internal/telemetry/export/ocagent/ocagent.go b/vendor/golang.org/x/tools/internal/telemetry/export/ocagent/ocagent.go deleted file mode 100644 index cad7e1338..000000000 --- a/vendor/golang.org/x/tools/internal/telemetry/export/ocagent/ocagent.go +++ /dev/null @@ -1,300 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package ocagent adds the ability to export all telemetry to an ocagent. -// This keeps the compile time dependencies to zero and allows the agent to -// have the exporters needed for telemetry aggregation and viewing systems. -package ocagent - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "net/http" - "os" - "path/filepath" - "sync" - "time" - - "golang.org/x/tools/internal/telemetry" - "golang.org/x/tools/internal/telemetry/export" - "golang.org/x/tools/internal/telemetry/export/ocagent/wire" - "golang.org/x/tools/internal/telemetry/tag" -) - -type Config struct { - Start time.Time - Host string - Process uint32 - Client *http.Client - Service string - Address string - Rate time.Duration -} - -// Discover finds the local agent to export to, it will return nil if there -// is not one running. -// TODO: Actually implement a discovery protocol rather than a hard coded address -func Discover() *Config { - return &Config{ - Address: "http://localhost:55678", - } -} - -type exporter struct { - mu sync.Mutex - config Config - node *wire.Node - spans []*wire.Span - metrics []*wire.Metric -} - -// Connect creates a process specific exporter with the specified -// serviceName and the address of the ocagent to which it will upload -// its telemetry. -func Connect(config *Config) export.Exporter { - if config == nil || config.Address == "off" { - return nil - } - exporter := &exporter{config: *config} - if exporter.config.Start.IsZero() { - exporter.config.Start = time.Now() - } - if exporter.config.Host == "" { - hostname, _ := os.Hostname() - exporter.config.Host = hostname - } - if exporter.config.Process == 0 { - exporter.config.Process = uint32(os.Getpid()) - } - if exporter.config.Client == nil { - exporter.config.Client = http.DefaultClient - } - if exporter.config.Service == "" { - exporter.config.Service = filepath.Base(os.Args[0]) - } - if exporter.config.Rate == 0 { - exporter.config.Rate = 2 * time.Second - } - exporter.node = &wire.Node{ - Identifier: &wire.ProcessIdentifier{ - HostName: exporter.config.Host, - Pid: exporter.config.Process, - StartTimestamp: convertTimestamp(exporter.config.Start), - }, - LibraryInfo: &wire.LibraryInfo{ - Language: wire.LanguageGo, - ExporterVersion: "0.0.1", - CoreLibraryVersion: "x/tools", - }, - ServiceInfo: &wire.ServiceInfo{ - Name: exporter.config.Service, - }, - } - go func() { - for _ = range time.Tick(exporter.config.Rate) { - exporter.Flush() - } - }() - return exporter -} - -func (e *exporter) StartSpan(ctx context.Context, span *telemetry.Span) {} - -func (e *exporter) FinishSpan(ctx context.Context, span *telemetry.Span) { - e.mu.Lock() - defer e.mu.Unlock() - e.spans = append(e.spans, convertSpan(span)) -} - -func (e *exporter) Log(context.Context, telemetry.Event) {} - -func (e *exporter) Metric(ctx context.Context, data telemetry.MetricData) { - e.mu.Lock() - defer e.mu.Unlock() - e.metrics = append(e.metrics, convertMetric(data, e.config.Start)) -} - -func (e *exporter) Flush() { - e.mu.Lock() - defer e.mu.Unlock() - spans := e.spans - e.spans = nil - metrics := e.metrics - e.metrics = nil - - if len(spans) > 0 { - e.send("/v1/trace", &wire.ExportTraceServiceRequest{ - Node: e.node, - Spans: spans, - //TODO: Resource? - }) - } - if len(metrics) > 0 { - e.send("/v1/metrics", &wire.ExportMetricsServiceRequest{ - Node: e.node, - Metrics: metrics, - //TODO: Resource? - }) - } -} - -func (e *exporter) send(endpoint string, message interface{}) { - blob, err := json.Marshal(message) - if err != nil { - errorInExport("ocagent failed to marshal message for %v: %v", endpoint, err) - return - } - uri := e.config.Address + endpoint - req, err := http.NewRequest("POST", uri, bytes.NewReader(blob)) - if err != nil { - errorInExport("ocagent failed to build request for %v: %v", uri, err) - return - } - req.Header.Set("Content-Type", "application/json") - res, err := e.config.Client.Do(req) - if err != nil { - errorInExport("ocagent failed to send message: %v \n", err) - return - } - if res.Body != nil { - res.Body.Close() - } - return -} - -func errorInExport(message string, args ...interface{}) { - // This function is useful when debugging the exporter, but in general we - // want to just drop any export -} - -func convertTimestamp(t time.Time) wire.Timestamp { - return t.Format(time.RFC3339Nano) -} - -func toTruncatableString(s string) *wire.TruncatableString { - if s == "" { - return nil - } - return &wire.TruncatableString{Value: s} -} - -func convertSpan(span *telemetry.Span) *wire.Span { - result := &wire.Span{ - TraceId: span.ID.TraceID[:], - SpanId: span.ID.SpanID[:], - TraceState: nil, //TODO? - ParentSpanId: span.ParentID[:], - Name: toTruncatableString(span.Name), - Kind: wire.UnspecifiedSpanKind, - StartTime: convertTimestamp(span.Start), - EndTime: convertTimestamp(span.Finish), - Attributes: convertAttributes(span.Tags), - TimeEvents: convertEvents(span.Events), - SameProcessAsParentSpan: true, - //TODO: StackTrace? - //TODO: Links? - //TODO: Status? - //TODO: Resource? - } - return result -} - -func convertMetric(data telemetry.MetricData, start time.Time) *wire.Metric { - descriptor := dataToMetricDescriptor(data) - timeseries := dataToTimeseries(data, start) - - if descriptor == nil && timeseries == nil { - return nil - } - - // TODO: handle Histogram metrics - return &wire.Metric{ - MetricDescriptor: descriptor, - Timeseries: timeseries, - // TODO: attach Resource? - } -} - -func convertAttributes(tags telemetry.TagList) *wire.Attributes { - if len(tags) == 0 { - return nil - } - attributes := make(map[string]wire.Attribute) - for _, tag := range tags { - attributes[fmt.Sprint(tag.Key)] = convertAttribute(tag.Value) - } - return &wire.Attributes{AttributeMap: attributes} -} - -func convertAttribute(v interface{}) wire.Attribute { - switch v := v.(type) { - case int8: - return wire.IntAttribute{IntValue: int64(v)} - case int16: - return wire.IntAttribute{IntValue: int64(v)} - case int32: - return wire.IntAttribute{IntValue: int64(v)} - case int64: - return wire.IntAttribute{IntValue: v} - case int: - return wire.IntAttribute{IntValue: int64(v)} - case uint8: - return wire.IntAttribute{IntValue: int64(v)} - case uint16: - return wire.IntAttribute{IntValue: int64(v)} - case uint32: - return wire.IntAttribute{IntValue: int64(v)} - case uint64: - return wire.IntAttribute{IntValue: int64(v)} - case uint: - return wire.IntAttribute{IntValue: int64(v)} - case float32: - return wire.DoubleAttribute{DoubleValue: float64(v)} - case float64: - return wire.DoubleAttribute{DoubleValue: v} - case bool: - return wire.BoolAttribute{BoolValue: v} - case string: - return wire.StringAttribute{StringValue: toTruncatableString(v)} - default: - return wire.StringAttribute{StringValue: toTruncatableString(fmt.Sprint(v))} - } -} - -func convertEvents(events []telemetry.Event) *wire.TimeEvents { - //TODO: MessageEvents? - result := make([]wire.TimeEvent, len(events)) - for i, event := range events { - result[i] = convertEvent(event) - } - return &wire.TimeEvents{TimeEvent: result} -} - -func convertEvent(event telemetry.Event) wire.TimeEvent { - return wire.TimeEvent{ - Time: convertTimestamp(event.At), - Annotation: convertAnnotation(event), - } -} - -func convertAnnotation(event telemetry.Event) *wire.Annotation { - description := event.Message - if description == "" && event.Error != nil { - description = event.Error.Error() - event.Error = nil - } - tags := event.Tags - if event.Error != nil { - tags = append(tags, tag.Of("Error", event.Error)) - } - if description == "" && len(tags) == 0 { - return nil - } - return &wire.Annotation{ - Description: toTruncatableString(description), - Attributes: convertAttributes(tags), - } -} diff --git a/vendor/golang.org/x/tools/internal/telemetry/export/ocagent/wire/common.go b/vendor/golang.org/x/tools/internal/telemetry/export/ocagent/wire/common.go deleted file mode 100644 index b53fb8159..000000000 --- a/vendor/golang.org/x/tools/internal/telemetry/export/ocagent/wire/common.go +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package wire - -// This file holds common ocagent types - -type Node struct { - Identifier *ProcessIdentifier `json:"identifier,omitempty"` - LibraryInfo *LibraryInfo `json:"library_info,omitempty"` - ServiceInfo *ServiceInfo `json:"service_info,omitempty"` - Attributes map[string]string `json:"attributes,omitempty"` -} - -type Resource struct { - Type string `json:"type,omitempty"` - Labels map[string]string `json:"labels,omitempty"` -} - -type TruncatableString struct { - Value string `json:"value,omitempty"` - TruncatedByteCount int32 `json:"truncated_byte_count,omitempty"` -} - -type Attributes struct { - AttributeMap map[string]Attribute `json:"attributeMap,omitempty"` - DroppedAttributesCount int32 `json:"dropped_attributes_count,omitempty"` -} - -type StringAttribute struct { - StringValue *TruncatableString `json:"stringValue,omitempty"` -} - -type IntAttribute struct { - IntValue int64 `json:"intValue,omitempty"` -} - -type BoolAttribute struct { - BoolValue bool `json:"boolValue,omitempty"` -} - -type DoubleAttribute struct { - DoubleValue float64 `json:"doubleValue,omitempty"` -} - -type Attribute interface { - tagAttribute() -} - -func (StringAttribute) tagAttribute() {} -func (IntAttribute) tagAttribute() {} -func (BoolAttribute) tagAttribute() {} -func (DoubleAttribute) tagAttribute() {} - -type StackTrace struct { - StackFrames *StackFrames `json:"stack_frames,omitempty"` - StackTraceHashId uint64 `json:"stack_trace_hash_id,omitempty"` -} - -type StackFrames struct { - Frame []*StackFrame `json:"frame,omitempty"` - DroppedFramesCount int32 `json:"dropped_frames_count,omitempty"` -} - -type StackFrame struct { - FunctionName *TruncatableString `json:"function_name,omitempty"` - OriginalFunctionName *TruncatableString `json:"original_function_name,omitempty"` - FileName *TruncatableString `json:"file_name,omitempty"` - LineNumber int64 `json:"line_number,omitempty"` - ColumnNumber int64 `json:"column_number,omitempty"` - LoadModule *Module `json:"load_module,omitempty"` - SourceVersion *TruncatableString `json:"source_version,omitempty"` -} - -type Module struct { - Module *TruncatableString `json:"module,omitempty"` - BuildId *TruncatableString `json:"build_id,omitempty"` -} - -type ProcessIdentifier struct { - HostName string `json:"host_name,omitempty"` - Pid uint32 `json:"pid,omitempty"` - StartTimestamp Timestamp `json:"start_timestamp,omitempty"` -} - -type LibraryInfo struct { - Language Language `json:"language,omitempty"` - ExporterVersion string `json:"exporter_version,omitempty"` - CoreLibraryVersion string `json:"core_library_version,omitempty"` -} - -type Language int32 - -const ( - LanguageGo Language = 4 -) - -type ServiceInfo struct { - Name string `json:"name,omitempty"` -} diff --git a/vendor/golang.org/x/tools/internal/telemetry/export/ocagent/wire/core.go b/vendor/golang.org/x/tools/internal/telemetry/export/ocagent/wire/core.go deleted file mode 100644 index 95c05d669..000000000 --- a/vendor/golang.org/x/tools/internal/telemetry/export/ocagent/wire/core.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package wire - -// This file contains type that match core proto types - -type Timestamp = string - -type Int64Value struct { - Value int64 `json:"value,omitempty"` -} - -type DoubleValue struct { - Value float64 `json:"value,omitempty"` -} diff --git a/vendor/golang.org/x/tools/internal/telemetry/export/ocagent/wire/metrics.go b/vendor/golang.org/x/tools/internal/telemetry/export/ocagent/wire/metrics.go deleted file mode 100644 index ea82becfd..000000000 --- a/vendor/golang.org/x/tools/internal/telemetry/export/ocagent/wire/metrics.go +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package wire - -type ExportMetricsServiceRequest struct { - Node *Node `json:"node,omitempty"` - Metrics []*Metric `json:"metrics,omitempty"` - Resource *Resource `json:"resource,omitempty"` -} - -type Metric struct { - MetricDescriptor *MetricDescriptor `json:"metric_descriptor,omitempty"` - Timeseries []*TimeSeries `json:"timeseries,omitempty"` - Resource *Resource `json:"resource,omitempty"` -} - -type MetricDescriptor struct { - Name string `json:"name,omitempty"` - Description string `json:"description,omitempty"` - Unit string `json:"unit,omitempty"` - Type MetricDescriptor_Type `json:"type,omitempty"` - LabelKeys []*LabelKey `json:"label_keys,omitempty"` -} - -type MetricDescriptor_Type int32 - -const ( - MetricDescriptor_UNSPECIFIED MetricDescriptor_Type = 0 - MetricDescriptor_GAUGE_INT64 MetricDescriptor_Type = 1 - MetricDescriptor_GAUGE_DOUBLE MetricDescriptor_Type = 2 - MetricDescriptor_GAUGE_DISTRIBUTION MetricDescriptor_Type = 3 - MetricDescriptor_CUMULATIVE_INT64 MetricDescriptor_Type = 4 - MetricDescriptor_CUMULATIVE_DOUBLE MetricDescriptor_Type = 5 - MetricDescriptor_CUMULATIVE_DISTRIBUTION MetricDescriptor_Type = 6 - MetricDescriptor_SUMMARY MetricDescriptor_Type = 7 -) - -type LabelKey struct { - Key string `json:"key,omitempty"` - Description string `json:"description,omitempty"` -} - -type TimeSeries struct { - StartTimestamp *Timestamp `json:"start_timestamp,omitempty"` - LabelValues []*LabelValue `json:"label_values,omitempty"` - Points []*Point `json:"points,omitempty"` -} - -type LabelValue struct { - Value string `json:"value,omitempty"` - HasValue bool `json:"has_value,omitempty"` -} - -type Point struct { - Timestamp *Timestamp `json:"timestamp,omitempty"` - Value PointValue `json:"value,omitempty"` -} - -type PointInt64Value struct { - Int64Value int64 `json:"int64Value,omitempty"` -} - -type PointDoubleValue struct { - DoubleValue float64 `json:"doubleValue,omitempty"` -} - -type PointDistributionValue struct { - DistributionValue *DistributionValue `json:"distributionValue,omitempty"` -} - -type PointSummaryValue struct { - SummaryValue *SummaryValue `json:"summaryValue,omitempty"` -} - -type PointValue interface { - tagPointValue() -} - -func (PointInt64Value) tagPointValue() {} -func (PointDoubleValue) tagPointValue() {} -func (PointDistributionValue) tagPointValue() {} -func (PointSummaryValue) tagPointValue() {} - -type DistributionValue struct { - Count int64 `json:"count,omitempty"` - Sum float64 `json:"sum,omitempty"` - SumOfSquaredDeviation float64 `json:"sum_of_squared_deviation,omitempty"` - BucketOptions BucketOptions `json:"bucket_options,omitempty"` - Buckets []*Bucket `json:"buckets,omitempty"` -} - -type BucketOptionsExplicit struct { - Bounds []float64 `json:"bounds,omitempty"` -} - -type BucketOptions interface { - tagBucketOptions() -} - -func (BucketOptionsExplicit) tagBucketOptions() {} - -type Bucket struct { - Count int64 `json:"count,omitempty"` - Exemplar *Exemplar `json:"exemplar,omitempty"` -} - -type Exemplar struct { - Value float64 `json:"value,omitempty"` - Timestamp *Timestamp `json:"timestamp,omitempty"` - Attachments map[string]string `json:"attachments,omitempty"` -} - -type SummaryValue struct { - Count *Int64Value `json:"count,omitempty"` - Sum *DoubleValue `json:"sum,omitempty"` - Snapshot *Snapshot `json:"snapshot,omitempty"` -} - -type Snapshot struct { - Count *Int64Value `json:"count,omitempty"` - Sum *DoubleValue `json:"sum,omitempty"` - PercentileValues []*SnapshotValueAtPercentile `json:"percentile_values,omitempty"` -} - -type SnapshotValueAtPercentile struct { - Percentile float64 `json:"percentile,omitempty"` - Value float64 `json:"value,omitempty"` -} diff --git a/vendor/golang.org/x/tools/internal/telemetry/export/ocagent/wire/trace.go b/vendor/golang.org/x/tools/internal/telemetry/export/ocagent/wire/trace.go deleted file mode 100644 index fb737430a..000000000 --- a/vendor/golang.org/x/tools/internal/telemetry/export/ocagent/wire/trace.go +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package wire - -type ExportTraceServiceRequest struct { - Node *Node `json:"node,omitempty"` - Spans []*Span `json:"spans,omitempty"` - Resource *Resource `json:"resource,omitempty"` -} - -type Span struct { - TraceId []byte `json:"trace_id,omitempty"` - SpanId []byte `json:"span_id,omitempty"` - TraceState *TraceState `json:"tracestate,omitempty"` - ParentSpanId []byte `json:"parent_span_id,omitempty"` - Name *TruncatableString `json:"name,omitempty"` - Kind SpanKind `json:"kind,omitempty"` - StartTime Timestamp `json:"start_time,omitempty"` - EndTime Timestamp `json:"end_time,omitempty"` - Attributes *Attributes `json:"attributes,omitempty"` - StackTrace *StackTrace `json:"stack_trace,omitempty"` - TimeEvents *TimeEvents `json:"time_events,omitempty"` - Links *Links `json:"links,omitempty"` - Status *Status `json:"status,omitempty"` - Resource *Resource `json:"resource,omitempty"` - SameProcessAsParentSpan bool `json:"same_process_as_parent_span,omitempty"` - ChildSpanCount bool `json:"child_span_count,omitempty"` -} - -type TraceState struct { - Entries []*TraceStateEntry `json:"entries,omitempty"` -} - -type TraceStateEntry struct { - Key string `json:"key,omitempty"` - Value string `json:"value,omitempty"` -} - -type SpanKind int32 - -const ( - UnspecifiedSpanKind SpanKind = 0 - ServerSpanKind SpanKind = 1 - ClientSpanKind SpanKind = 2 -) - -type TimeEvents struct { - TimeEvent []TimeEvent `json:"timeEvent,omitempty"` - DroppedAnnotationsCount int32 `json:"dropped_annotations_count,omitempty"` - DroppedMessageEventsCount int32 `json:"dropped_message_events_count,omitempty"` -} - -type TimeEvent struct { - Time Timestamp `json:"time,omitempty"` - MessageEvent *MessageEvent `json:"messageEvent,omitempty"` - Annotation *Annotation `json:"annotation,omitempty"` -} - -type Annotation struct { - Description *TruncatableString `json:"description,omitempty"` - Attributes *Attributes `json:"attributes,omitempty"` -} - -type MessageEvent struct { - Type MessageEventType `json:"type,omitempty"` - Id uint64 `json:"id,omitempty"` - UncompressedSize uint64 `json:"uncompressed_size,omitempty"` - CompressedSize uint64 `json:"compressed_size,omitempty"` -} - -type MessageEventType int32 - -const ( - UnspecifiedMessageEvent MessageEventType = iota - SentMessageEvent - ReceivedMessageEvent -) - -type TimeEventValue interface { - tagTimeEventValue() -} - -func (Annotation) tagTimeEventValue() {} -func (MessageEvent) tagTimeEventValue() {} - -type Links struct { - Link []*Link `json:"link,omitempty"` - DroppedLinksCount int32 `json:"dropped_links_count,omitempty"` -} - -type Link struct { - TraceId []byte `json:"trace_id,omitempty"` - SpanId []byte `json:"span_id,omitempty"` - Type LinkType `json:"type,omitempty"` - Attributes *Attributes `json:"attributes,omitempty"` - TraceState *TraceState `json:"tracestate,omitempty"` -} - -type LinkType int32 - -const ( - UnspecifiedLinkType LinkType = 0 - ChildLinkType LinkType = 1 - ParentLinkType LinkType = 2 -) - -type Status struct { - Code int32 `json:"code,omitempty"` - Message string `json:"message,omitempty"` -} diff --git a/vendor/golang.org/x/tools/internal/telemetry/export/prometheus/prometheus.go b/vendor/golang.org/x/tools/internal/telemetry/export/prometheus/prometheus.go deleted file mode 100644 index ccbdf96b1..000000000 --- a/vendor/golang.org/x/tools/internal/telemetry/export/prometheus/prometheus.go +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package prometheus - -import ( - "bytes" - "context" - "fmt" - "net/http" - "sort" - "sync" - - "golang.org/x/tools/internal/telemetry" - "golang.org/x/tools/internal/telemetry/metric" -) - -func New() *Exporter { - return &Exporter{} -} - -type Exporter struct { - mu sync.Mutex - metrics []telemetry.MetricData -} - -func (e *Exporter) StartSpan(ctx context.Context, span *telemetry.Span) {} -func (e *Exporter) FinishSpan(ctx context.Context, span *telemetry.Span) {} -func (e *Exporter) Log(ctx context.Context, event telemetry.Event) {} -func (e *Exporter) Flush() {} - -func (e *Exporter) Metric(ctx context.Context, data telemetry.MetricData) { - e.mu.Lock() - defer e.mu.Unlock() - name := data.Handle() - // We keep the metrics in name sorted order so the page is stable and easy - // to read. We do this with an insertion sort rather than sorting the list - // each time - index := sort.Search(len(e.metrics), func(i int) bool { - return e.metrics[i].Handle() >= name - }) - if index >= len(e.metrics) || e.metrics[index].Handle() != name { - // we have a new metric, so we need to make a space for it - old := e.metrics - e.metrics = make([]telemetry.MetricData, len(old)+1) - copy(e.metrics, old[:index]) - copy(e.metrics[index+1:], old[index:]) - } - e.metrics[index] = data -} - -func (e *Exporter) header(w http.ResponseWriter, name, description string, isGauge, isHistogram bool) { - kind := "counter" - if isGauge { - kind = "gauge" - } - if isHistogram { - kind = "histogram" - } - fmt.Fprintf(w, "# HELP %s %s\n", name, description) - fmt.Fprintf(w, "# TYPE %s %s\n", name, kind) -} - -func (e *Exporter) row(w http.ResponseWriter, name string, group telemetry.TagList, extra string, value interface{}) { - fmt.Fprint(w, name) - buf := &bytes.Buffer{} - fmt.Fprint(buf, group) - if extra != "" { - if buf.Len() > 0 { - fmt.Fprint(buf, ",") - } - fmt.Fprint(buf, extra) - } - if buf.Len() > 0 { - fmt.Fprint(w, "{") - buf.WriteTo(w) - fmt.Fprint(w, "}") - } - fmt.Fprintf(w, " %v\n", value) -} - -func (e *Exporter) Serve(w http.ResponseWriter, r *http.Request) { - e.mu.Lock() - defer e.mu.Unlock() - for _, data := range e.metrics { - switch data := data.(type) { - case *metric.Int64Data: - e.header(w, data.Info.Name, data.Info.Description, data.IsGauge, false) - for i, group := range data.Groups() { - e.row(w, data.Info.Name, group, "", data.Rows[i]) - } - - case *metric.Float64Data: - e.header(w, data.Info.Name, data.Info.Description, data.IsGauge, false) - for i, group := range data.Groups() { - e.row(w, data.Info.Name, group, "", data.Rows[i]) - } - - case *metric.HistogramInt64Data: - e.header(w, data.Info.Name, data.Info.Description, false, true) - for i, group := range data.Groups() { - row := data.Rows[i] - for j, b := range data.Info.Buckets { - e.row(w, data.Info.Name+"_bucket", group, fmt.Sprintf(`le="%v"`, b), row.Values[j]) - } - e.row(w, data.Info.Name+"_bucket", group, `le="+Inf"`, row.Count) - e.row(w, data.Info.Name+"_count", group, "", row.Count) - e.row(w, data.Info.Name+"_sum", group, "", row.Sum) - } - - case *metric.HistogramFloat64Data: - e.header(w, data.Info.Name, data.Info.Description, false, true) - for i, group := range data.Groups() { - row := data.Rows[i] - for j, b := range data.Info.Buckets { - e.row(w, data.Info.Name+"_bucket", group, fmt.Sprintf(`le="%v"`, b), row.Values[j]) - } - e.row(w, data.Info.Name+"_bucket", group, `le="+Inf"`, row.Count) - e.row(w, data.Info.Name+"_count", group, "", row.Count) - e.row(w, data.Info.Name+"_sum", group, "", row.Sum) - } - } - } -} diff --git a/vendor/golang.org/x/tools/internal/telemetry/id.go b/vendor/golang.org/x/tools/internal/telemetry/id.go deleted file mode 100644 index 8be110c62..000000000 --- a/vendor/golang.org/x/tools/internal/telemetry/id.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package telemetry - -import ( - crand "crypto/rand" - "encoding/binary" - "fmt" - "math/rand" - "sync" - "sync/atomic" -) - -type TraceID [16]byte -type SpanID [8]byte - -func (t TraceID) String() string { - return fmt.Sprintf("%02x", t[:]) -} - -func (s SpanID) String() string { - return fmt.Sprintf("%02x", s[:]) -} - -func (s SpanID) IsValid() bool { - return s != SpanID{} -} - -var ( - generationMu sync.Mutex - nextSpanID uint64 - spanIDInc uint64 - - traceIDAdd [2]uint64 - traceIDRand *rand.Rand -) - -func initGenerator() { - var rngSeed int64 - for _, p := range []interface{}{ - &rngSeed, &traceIDAdd, &nextSpanID, &spanIDInc, - } { - binary.Read(crand.Reader, binary.LittleEndian, p) - } - traceIDRand = rand.New(rand.NewSource(rngSeed)) - spanIDInc |= 1 -} - -func NewTraceID() TraceID { - generationMu.Lock() - defer generationMu.Unlock() - if traceIDRand == nil { - initGenerator() - } - var tid [16]byte - binary.LittleEndian.PutUint64(tid[0:8], traceIDRand.Uint64()+traceIDAdd[0]) - binary.LittleEndian.PutUint64(tid[8:16], traceIDRand.Uint64()+traceIDAdd[1]) - return tid -} - -func NewSpanID() SpanID { - var id uint64 - for id == 0 { - id = atomic.AddUint64(&nextSpanID, spanIDInc) - } - var sid [8]byte - binary.LittleEndian.PutUint64(sid[:], id) - return sid -} diff --git a/vendor/golang.org/x/tools/internal/telemetry/log/log.go b/vendor/golang.org/x/tools/internal/telemetry/log/log.go deleted file mode 100644 index f6c3f4435..000000000 --- a/vendor/golang.org/x/tools/internal/telemetry/log/log.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package log is a context based logging package, designed to interact well -// with both the lsp protocol and the other telemetry packages. -package log - -import ( - "context" - "time" - - "golang.org/x/tools/internal/telemetry" - "golang.org/x/tools/internal/telemetry/export" - "golang.org/x/tools/internal/telemetry/tag" -) - -type Event telemetry.Event - -// With sends a tag list to the installed loggers. -func With(ctx context.Context, tags ...telemetry.Tag) { - export.Log(ctx, telemetry.Event{ - At: time.Now(), - Tags: tags, - }) -} - -// Print takes a message and a tag list and combines them into a single tag -// list before delivering them to the loggers. -func Print(ctx context.Context, message string, tags ...tag.Tagger) { - export.Log(ctx, telemetry.Event{ - At: time.Now(), - Message: message, - Tags: tag.Tags(ctx, tags...), - }) -} - -// Print takes a message and a tag list and combines them into a single tag -// list before delivering them to the loggers. -func Error(ctx context.Context, message string, err error, tags ...tag.Tagger) { - if err == nil { - err = errorString(message) - message = "" - } - export.Log(ctx, telemetry.Event{ - At: time.Now(), - Message: message, - Error: err, - Tags: tag.Tags(ctx, tags...), - }) -} - -type errorString string - -// Error allows errorString to conform to the error interface. -func (err errorString) Error() string { return string(err) } diff --git a/vendor/golang.org/x/tools/internal/telemetry/metric.go b/vendor/golang.org/x/tools/internal/telemetry/metric.go deleted file mode 100644 index 071dbbcd7..000000000 --- a/vendor/golang.org/x/tools/internal/telemetry/metric.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package telemetry - -// Data represents a single point in the time series of a metric. -// This provides the common interface to all metrics no matter their data -// format. -// To get the actual values for the metric you must type assert to a concrete -// metric type. -type MetricData interface { - // Handle returns the metric handle this data is for. - Handle() string - // Groups reports the rows that currently exist for this metric. - Groups() []TagList -} diff --git a/vendor/golang.org/x/tools/internal/telemetry/metric/metric.go b/vendor/golang.org/x/tools/internal/telemetry/metric/metric.go deleted file mode 100644 index 98f0bd813..000000000 --- a/vendor/golang.org/x/tools/internal/telemetry/metric/metric.go +++ /dev/null @@ -1,373 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package metric aggregates stats into metrics that can be exported. -package metric - -import ( - "context" - "sort" - "time" - - "golang.org/x/tools/internal/telemetry" - "golang.org/x/tools/internal/telemetry/export" - "golang.org/x/tools/internal/telemetry/stats" - "golang.org/x/tools/internal/telemetry/tag" -) - -// Scalar represents the construction information for a scalar metric. -type Scalar struct { - // Name is the unique name of this metric. - Name string - // Description can be used by observers to describe the metric to users. - Description string - // Keys is the set of tags that collectively describe rows of the metric. - Keys []interface{} -} - -// HistogramInt64 represents the construction information for an int64 histogram metric. -type HistogramInt64 struct { - // Name is the unique name of this metric. - Name string - // Description can be used by observers to describe the metric to users. - Description string - // Keys is the set of tags that collectively describe rows of the metric. - Keys []interface{} - // Buckets holds the inclusive upper bound of each bucket in the histogram. - Buckets []int64 -} - -// HistogramFloat64 represents the construction information for an float64 histogram metric. -type HistogramFloat64 struct { - // Name is the unique name of this metric. - Name string - // Description can be used by observers to describe the metric to users. - Description string - // Keys is the set of tags that collectively describe rows of the metric. - Keys []interface{} - // Buckets holds the inclusive upper bound of each bucket in the histogram. - Buckets []float64 -} - -// CountInt64 creates a new metric based on the Scalar information that counts -// the number of times the supplied int64 measure is set. -// Metrics of this type will use Int64Data. -func (info Scalar) CountInt64(measure *stats.Int64Measure) string { - data := &Int64Data{Info: &info} - measure.Subscribe(data.countInt64) - return info.Name -} - -// SumInt64 creates a new metric based on the Scalar information that sums all -// the values recorded on the int64 measure. -// Metrics of this type will use Int64Data. -func (info Scalar) SumInt64(measure *stats.Int64Measure) string { - data := &Int64Data{Info: &info} - measure.Subscribe(data.sum) - _ = data - return info.Name -} - -// LatestInt64 creates a new metric based on the Scalar information that tracks -// the most recent value recorded on the int64 measure. -// Metrics of this type will use Int64Data. -func (info Scalar) LatestInt64(measure *stats.Int64Measure) string { - data := &Int64Data{Info: &info, IsGauge: true} - measure.Subscribe(data.latest) - return info.Name -} - -// CountFloat64 creates a new metric based on the Scalar information that counts -// the number of times the supplied float64 measure is set. -// Metrics of this type will use Int64Data. -func (info Scalar) CountFloat64(measure *stats.Float64Measure) string { - data := &Int64Data{Info: &info} - measure.Subscribe(data.countFloat64) - return info.Name -} - -// SumFloat64 creates a new metric based on the Scalar information that sums all -// the values recorded on the float64 measure. -// Metrics of this type will use Float64Data. -func (info Scalar) SumFloat64(measure *stats.Float64Measure) string { - data := &Float64Data{Info: &info} - measure.Subscribe(data.sum) - return info.Name -} - -// LatestFloat64 creates a new metric based on the Scalar information that tracks -// the most recent value recorded on the float64 measure. -// Metrics of this type will use Float64Data. -func (info Scalar) LatestFloat64(measure *stats.Float64Measure) string { - data := &Float64Data{Info: &info, IsGauge: true} - measure.Subscribe(data.latest) - return info.Name -} - -// Record creates a new metric based on the HistogramInt64 information that -// tracks the bucketized counts of values recorded on the int64 measure. -// Metrics of this type will use HistogramInt64Data. -func (info HistogramInt64) Record(measure *stats.Int64Measure) string { - data := &HistogramInt64Data{Info: &info} - measure.Subscribe(data.record) - return info.Name -} - -// Record creates a new metric based on the HistogramFloat64 information that -// tracks the bucketized counts of values recorded on the float64 measure. -// Metrics of this type will use HistogramFloat64Data. -func (info HistogramFloat64) Record(measure *stats.Float64Measure) string { - data := &HistogramFloat64Data{Info: &info} - measure.Subscribe(data.record) - return info.Name -} - -// Int64Data is a concrete implementation of Data for int64 scalar metrics. -type Int64Data struct { - // Info holds the original consruction information. - Info *Scalar - // IsGauge is true for metrics that track values, rather than increasing over time. - IsGauge bool - // Rows holds the per group values for the metric. - Rows []int64 - // End is the last time this metric was updated. - EndTime *time.Time - - groups []telemetry.TagList -} - -// Float64Data is a concrete implementation of Data for float64 scalar metrics. -type Float64Data struct { - // Info holds the original consruction information. - Info *Scalar - // IsGauge is true for metrics that track values, rather than increasing over time. - IsGauge bool - // Rows holds the per group values for the metric. - Rows []float64 - // End is the last time this metric was updated. - EndTime *time.Time - - groups []telemetry.TagList -} - -// HistogramInt64Data is a concrete implementation of Data for int64 histogram metrics. -type HistogramInt64Data struct { - // Info holds the original consruction information. - Info *HistogramInt64 - // Rows holds the per group values for the metric. - Rows []*HistogramInt64Row - // End is the last time this metric was updated. - EndTime *time.Time - - groups []telemetry.TagList -} - -// HistogramInt64Row holds the values for a single row of a HistogramInt64Data. -type HistogramInt64Row struct { - // Values is the counts per bucket. - Values []int64 - // Count is the total count. - Count int64 - // Sum is the sum of all the values recorded. - Sum int64 - // Min is the smallest recorded value. - Min int64 - // Max is the largest recorded value. - Max int64 -} - -// HistogramFloat64Data is a concrete implementation of Data for float64 histogram metrics. -type HistogramFloat64Data struct { - // Info holds the original consruction information. - Info *HistogramFloat64 - // Rows holds the per group values for the metric. - Rows []*HistogramFloat64Row - // End is the last time this metric was updated. - EndTime *time.Time - - groups []telemetry.TagList -} - -// HistogramFloat64Row holds the values for a single row of a HistogramFloat64Data. -type HistogramFloat64Row struct { - // Values is the counts per bucket. - Values []int64 - // Count is the total count. - Count int64 - // Sum is the sum of all the values recorded. - Sum float64 - // Min is the smallest recorded value. - Min float64 - // Max is the largest recorded value. - Max float64 -} - -func getGroup(ctx context.Context, g *[]telemetry.TagList, keys []interface{}) (int, bool) { - group := tag.Get(ctx, keys...) - old := *g - index := sort.Search(len(old), func(i int) bool { - return !old[i].Less(group) - }) - if index < len(old) && group.Equal(old[index]) { - // not a new group - return index, false - } - *g = make([]telemetry.TagList, len(old)+1) - copy(*g, old[:index]) - copy((*g)[index+1:], old[index:]) - (*g)[index] = group - return index, true -} - -func (data *Int64Data) Handle() string { return data.Info.Name } -func (data *Int64Data) Groups() []telemetry.TagList { return data.groups } - -func (data *Int64Data) modify(ctx context.Context, at time.Time, f func(v int64) int64) { - index, insert := getGroup(ctx, &data.groups, data.Info.Keys) - old := data.Rows - if insert { - data.Rows = make([]int64, len(old)+1) - copy(data.Rows, old[:index]) - copy(data.Rows[index+1:], old[index:]) - } else { - data.Rows = make([]int64, len(old)) - copy(data.Rows, old) - } - data.Rows[index] = f(data.Rows[index]) - data.EndTime = &at - frozen := *data - export.Metric(ctx, &frozen) -} - -func (data *Int64Data) countInt64(ctx context.Context, measure *stats.Int64Measure, value int64, at time.Time) { - data.modify(ctx, at, func(v int64) int64 { return v + 1 }) -} - -func (data *Int64Data) countFloat64(ctx context.Context, measure *stats.Float64Measure, value float64, at time.Time) { - data.modify(ctx, at, func(v int64) int64 { return v + 1 }) -} - -func (data *Int64Data) sum(ctx context.Context, measure *stats.Int64Measure, value int64, at time.Time) { - data.modify(ctx, at, func(v int64) int64 { return v + value }) -} - -func (data *Int64Data) latest(ctx context.Context, measure *stats.Int64Measure, value int64, at time.Time) { - data.modify(ctx, at, func(v int64) int64 { return value }) -} - -func (data *Float64Data) Handle() string { return data.Info.Name } -func (data *Float64Data) Groups() []telemetry.TagList { return data.groups } - -func (data *Float64Data) modify(ctx context.Context, at time.Time, f func(v float64) float64) { - index, insert := getGroup(ctx, &data.groups, data.Info.Keys) - old := data.Rows - if insert { - data.Rows = make([]float64, len(old)+1) - copy(data.Rows, old[:index]) - copy(data.Rows[index+1:], old[index:]) - } else { - data.Rows = make([]float64, len(old)) - copy(data.Rows, old) - } - data.Rows[index] = f(data.Rows[index]) - data.EndTime = &at - frozen := *data - export.Metric(ctx, &frozen) -} - -func (data *Float64Data) sum(ctx context.Context, measure *stats.Float64Measure, value float64, at time.Time) { - data.modify(ctx, at, func(v float64) float64 { return v + value }) -} - -func (data *Float64Data) latest(ctx context.Context, measure *stats.Float64Measure, value float64, at time.Time) { - data.modify(ctx, at, func(v float64) float64 { return value }) -} - -func (data *HistogramInt64Data) Handle() string { return data.Info.Name } -func (data *HistogramInt64Data) Groups() []telemetry.TagList { return data.groups } - -func (data *HistogramInt64Data) modify(ctx context.Context, at time.Time, f func(v *HistogramInt64Row)) { - index, insert := getGroup(ctx, &data.groups, data.Info.Keys) - old := data.Rows - var v HistogramInt64Row - if insert { - data.Rows = make([]*HistogramInt64Row, len(old)+1) - copy(data.Rows, old[:index]) - copy(data.Rows[index+1:], old[index:]) - } else { - data.Rows = make([]*HistogramInt64Row, len(old)) - copy(data.Rows, old) - v = *data.Rows[index] - } - oldValues := v.Values - v.Values = make([]int64, len(data.Info.Buckets)) - copy(v.Values, oldValues) - f(&v) - data.Rows[index] = &v - data.EndTime = &at - frozen := *data - export.Metric(ctx, &frozen) -} - -func (data *HistogramInt64Data) record(ctx context.Context, measure *stats.Int64Measure, value int64, at time.Time) { - data.modify(ctx, at, func(v *HistogramInt64Row) { - v.Sum += value - if v.Min > value || v.Count == 0 { - v.Min = value - } - if v.Max < value || v.Count == 0 { - v.Max = value - } - v.Count++ - for i, b := range data.Info.Buckets { - if value <= b { - v.Values[i]++ - } - } - }) -} - -func (data *HistogramFloat64Data) Handle() string { return data.Info.Name } -func (data *HistogramFloat64Data) Groups() []telemetry.TagList { return data.groups } - -func (data *HistogramFloat64Data) modify(ctx context.Context, at time.Time, f func(v *HistogramFloat64Row)) { - index, insert := getGroup(ctx, &data.groups, data.Info.Keys) - old := data.Rows - var v HistogramFloat64Row - if insert { - data.Rows = make([]*HistogramFloat64Row, len(old)+1) - copy(data.Rows, old[:index]) - copy(data.Rows[index+1:], old[index:]) - } else { - data.Rows = make([]*HistogramFloat64Row, len(old)) - copy(data.Rows, old) - v = *data.Rows[index] - } - oldValues := v.Values - v.Values = make([]int64, len(data.Info.Buckets)) - copy(v.Values, oldValues) - f(&v) - data.Rows[index] = &v - data.EndTime = &at - frozen := *data - export.Metric(ctx, &frozen) -} - -func (data *HistogramFloat64Data) record(ctx context.Context, measure *stats.Float64Measure, value float64, at time.Time) { - data.modify(ctx, at, func(v *HistogramFloat64Row) { - v.Sum += value - if v.Min > value || v.Count == 0 { - v.Min = value - } - if v.Max < value || v.Count == 0 { - v.Max = value - } - v.Count++ - for i, b := range data.Info.Buckets { - if value <= b { - v.Values[i]++ - } - } - }) -} diff --git a/vendor/golang.org/x/tools/internal/telemetry/stats/stats.go b/vendor/golang.org/x/tools/internal/telemetry/stats/stats.go deleted file mode 100644 index e6eb36484..000000000 --- a/vendor/golang.org/x/tools/internal/telemetry/stats/stats.go +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package stats provides support for recording telemetry statistics. -// It acts as a coordination point between things that want to record stats, -// and things that want to aggregate and report stats. -package stats - -import ( - "context" - "time" - - "golang.org/x/tools/internal/telemetry/unit" -) - -// Int64Measure is used to record integer values. -type Int64Measure struct { - name string - description string - unit unit.Unit - subscribers []Int64Subscriber -} - -// Int64Measure is used to record floating point values. -type Float64Measure struct { - name string - description string - unit unit.Unit - subscribers []Float64Subscriber -} - -// Int64Subscriber is the type for functions that want to listen to -// integer statistic events. -type Int64Subscriber func(ctx context.Context, im *Int64Measure, value int64, at time.Time) - -// Float64Subscriber is the type for functions that want to listen to -// floating point statistic events. -type Float64Subscriber func(ctx context.Context, fm *Float64Measure, value float64, at time.Time) - -// Int64 creates a new Int64Measure and prepares it for use. -func Int64(name string, description string, unit unit.Unit) *Int64Measure { - return &Int64Measure{ - name: name, - description: description, - unit: unit, - } -} - -// Float64 creates a new Float64Measure and prepares it for use. -func Float64(name string, description string, unit unit.Unit) *Float64Measure { - return &Float64Measure{ - name: name, - description: description, - unit: unit, - } -} - -// Name returns the name this measure was given on construction. -func (m *Int64Measure) Name() string { return m.name } - -// Description returns the description this measure was given on construction. -func (m *Int64Measure) Description() string { return m.description } - -// Unit returns the units this measure was given on construction. -func (m *Int64Measure) Unit() unit.Unit { return m.unit } - -// Subscribe adds a new subscriber to this measure. -func (m *Int64Measure) Subscribe(s Int64Subscriber) { m.subscribers = append(m.subscribers, s) } - -// Record delivers a new value to the subscribers of this measure. -func (m *Int64Measure) Record(ctx context.Context, value int64) { - at := time.Now() - do(func() { - for _, s := range m.subscribers { - s(ctx, m, value, at) - } - }) -} - -// Name returns the name this measure was given on construction. -func (m *Float64Measure) Name() string { return m.name } - -// Description returns the description this measure was given on construction. -func (m *Float64Measure) Description() string { return m.description } - -// Unit returns the units this measure was given on construction. -func (m *Float64Measure) Unit() unit.Unit { return m.unit } - -// Subscribe adds a new subscriber to this measure. -func (m *Float64Measure) Subscribe(s Float64Subscriber) { m.subscribers = append(m.subscribers, s) } - -// Record delivers a new value to the subscribers of this measure. -func (m *Float64Measure) Record(ctx context.Context, value float64) { - at := time.Now() - do(func() { - for _, s := range m.subscribers { - s(ctx, m, value, at) - } - }) -} diff --git a/vendor/golang.org/x/tools/internal/telemetry/stats/worker.go b/vendor/golang.org/x/tools/internal/telemetry/stats/worker.go deleted file mode 100644 index e690a2c08..000000000 --- a/vendor/golang.org/x/tools/internal/telemetry/stats/worker.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package stats - -import ( - "fmt" - "os" -) - -var ( - // TODO: Think about whether this is the right concurrency model, and what - // TODO: the queue length should be - workQueue = make(chan func(), 1000) -) - -func init() { - go func() { - for task := range workQueue { - task() - } - }() -} - -// do adds a task to the list of things to work on in the background. -// All tasks will be handled in submission order, and no two tasks will happen -// concurrently so they do not need to do any kind of locking. -// It is safe however to call Do concurrently. -// No promises are made about when the tasks will be performed. -// This function may block, but in general it will return very quickly and -// before the task has been run. -func do(task func()) { - select { - case workQueue <- task: - default: - fmt.Fprint(os.Stderr, "work queue is full\n") - workQueue <- task - } -} diff --git a/vendor/golang.org/x/tools/internal/telemetry/tag.go b/vendor/golang.org/x/tools/internal/telemetry/tag.go deleted file mode 100644 index 6d7e11daf..000000000 --- a/vendor/golang.org/x/tools/internal/telemetry/tag.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package telemetry - -import ( - "context" - "fmt" -) - -// Tag holds a key and value pair. -// It is normally used when passing around lists of tags. -type Tag struct { - Key interface{} - Value interface{} -} - -// TagList is a way of passing around a collection of key value pairs. -// It is an alternative to the less efficient and unordered method of using -// maps. -type TagList []Tag - -// Format is used for debug printing of tags. -func (t Tag) Format(f fmt.State, r rune) { - fmt.Fprintf(f, `%v="%v"`, t.Key, t.Value) -} - -// Get returns the tag unmodified. -// It makes Key conform to the Tagger interface. -func (t Tag) Tag(ctx context.Context) Tag { - return t -} - -// Get will get a single key's value from the list. -func (l TagList) Get(k interface{}) interface{} { - for _, t := range l { - if t.Key == k { - return t.Value - } - } - return nil -} - -// Format pretty prints a list. -// It is intended only for debugging. -func (l TagList) Format(f fmt.State, r rune) { - printed := false - for _, t := range l { - if t.Value == nil { - continue - } - if printed { - fmt.Fprint(f, ",") - } - fmt.Fprint(f, t) - printed = true - } -} - -// Equal returns true if two lists are identical. -func (l TagList) Equal(other TagList) bool { - //TODO: make this more efficient - return fmt.Sprint(l) == fmt.Sprint(other) -} - -// Less is intended only for using tag lists as a sorting key. -func (l TagList) Less(other TagList) bool { - //TODO: make this more efficient - return fmt.Sprint(l) < fmt.Sprint(other) -} diff --git a/vendor/golang.org/x/tools/internal/telemetry/tag/key.go b/vendor/golang.org/x/tools/internal/telemetry/tag/key.go deleted file mode 100644 index bf7d9cfdb..000000000 --- a/vendor/golang.org/x/tools/internal/telemetry/tag/key.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package tag provides support for telemetry tagging. -package tag - -import ( - "context" - - "golang.org/x/tools/internal/telemetry" -) - -// Key represents the key for a context tag. -// It is a helper to make use of context tagging slightly easier to read, it is -// not strictly needed to use it at all. -// It is intended that your common tagging keys are declared as constants of -// this type, and then you can use the methods of this type to apply and find -// those values in the context. -type Key string - -// Of returns a Tag for a key and value. -// This is a trivial helper that makes common logging easier to read. -func Of(key interface{}, value interface{}) telemetry.Tag { - return telemetry.Tag{Key: key, Value: value} -} - -// Of creates a new Tag with this key and the supplied value. -// You can use this when building a tag list. -func (k Key) Of(v interface{}) telemetry.Tag { - return telemetry.Tag{Key: k, Value: v} -} - -// Tag can be used to get a tag for the key from a context. -// It makes Key conform to the Tagger interface. -func (k Key) Tag(ctx context.Context) telemetry.Tag { - return telemetry.Tag{Key: k, Value: ctx.Value(k)} -} - -// With applies sets this key to the supplied value on the context and -// returns the new context generated. -// It uses the With package level function so that observers are also notified. -func (k Key) With(ctx context.Context, v interface{}) context.Context { - return With(ctx, telemetry.Tag{Key: k, Value: v}) -} diff --git a/vendor/golang.org/x/tools/internal/telemetry/tag/tag.go b/vendor/golang.org/x/tools/internal/telemetry/tag/tag.go deleted file mode 100644 index c6192aba9..000000000 --- a/vendor/golang.org/x/tools/internal/telemetry/tag/tag.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package tag provides support for telemetry tagging. -// This package is a thin shim over contexts with the main addition being the -// the ability to observe when contexts get tagged with new values. -package tag - -import ( - "context" - "time" - - "golang.org/x/tools/internal/telemetry" - "golang.org/x/tools/internal/telemetry/export" -) - -//TODO: Do we need to do something more efficient than just store tags -//TODO: directly on the context? - -// Tagger is the interface to something that returns a Tag given a context. -// Both Tag itself and Key support this interface, allowing methods that can -// take either (and other implementations as well) -type Tagger interface { - // Tag returns a Tag potentially using information from the Context. - Tag(context.Context) telemetry.Tag -} - -// With is roughly equivalent to context.WithValue except that it also notifies -// registered observers. -// Unlike WithValue, it takes a list of tags so that you can set many values -// at once if needed. Each call to With results in one invocation of each -// observer. -func With(ctx context.Context, tags ...telemetry.Tag) context.Context { - at := time.Now() - for _, t := range tags { - ctx = context.WithValue(ctx, t.Key, t.Value) - } - export.Tag(ctx, at, tags) - return ctx -} - -// Get collects a set of values from the context and returns them as a tag list. -func Get(ctx context.Context, keys ...interface{}) telemetry.TagList { - tags := make(telemetry.TagList, len(keys)) - for i, key := range keys { - tags[i] = telemetry.Tag{Key: key, Value: ctx.Value(key)} - } - return tags -} - -// Tags collects a list of tags for the taggers from the context. -func Tags(ctx context.Context, taggers ...Tagger) telemetry.TagList { - tags := make(telemetry.TagList, len(taggers)) - for i, t := range taggers { - tags[i] = t.Tag(ctx) - } - return tags -} diff --git a/vendor/golang.org/x/tools/internal/telemetry/trace.go b/vendor/golang.org/x/tools/internal/telemetry/trace.go deleted file mode 100644 index 5356baa41..000000000 --- a/vendor/golang.org/x/tools/internal/telemetry/trace.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package telemetry - -import ( - "fmt" - "time" -) - -type SpanContext struct { - TraceID TraceID - SpanID SpanID -} - -type Span struct { - Name string - ID SpanContext - ParentID SpanID - Start time.Time - Finish time.Time - Tags TagList - Events []Event -} - -func (s *SpanContext) Format(f fmt.State, r rune) { - fmt.Fprintf(f, "%v:%v", s.TraceID, s.SpanID) -} - -func (s *Span) Format(f fmt.State, r rune) { - fmt.Fprintf(f, "%v %v", s.Name, s.ID) - if s.ParentID.IsValid() { - fmt.Fprintf(f, "[%v]", s.ParentID) - } - fmt.Fprintf(f, " %v->%v", s.Start, s.Finish) -} diff --git a/vendor/golang.org/x/tools/internal/telemetry/trace/trace.go b/vendor/golang.org/x/tools/internal/telemetry/trace/trace.go deleted file mode 100644 index 014c554b2..000000000 --- a/vendor/golang.org/x/tools/internal/telemetry/trace/trace.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package trace adds support for telemetry tracing. -package trace - -import ( - "context" - "time" - - "golang.org/x/tools/internal/telemetry" - "golang.org/x/tools/internal/telemetry/export" - "golang.org/x/tools/internal/telemetry/tag" -) - -func StartSpan(ctx context.Context, name string, tags ...telemetry.Tag) (context.Context, func()) { - start := time.Now() - span := &telemetry.Span{Name: name} - if parent := telemetry.GetSpan(ctx); parent != nil { - span.ID.TraceID = parent.ID.TraceID - span.ParentID = parent.ID.SpanID - } else { - span.ID.TraceID = telemetry.NewTraceID() - } - span.ID.SpanID = telemetry.NewSpanID() - ctx = telemetry.WithSpan(ctx, span) - if len(tags) > 0 { - ctx = tag.With(ctx, tags...) - } - export.StartSpan(ctx, span, start) - return ctx, func() { export.FinishSpan(ctx, span, time.Now()) } -} - -// Detach returns a context without an associated span. -// This allows the creation of spans that are not children of the current span. -func Detach(ctx context.Context) context.Context { - return telemetry.WithSpan(ctx, nil) -} diff --git a/vendor/golang.org/x/tools/internal/telemetry/unit/unit.go b/vendor/golang.org/x/tools/internal/telemetry/unit/unit.go deleted file mode 100644 index a904a280e..000000000 --- a/vendor/golang.org/x/tools/internal/telemetry/unit/unit.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package unit holds the definitions for the units you can use in telemetry. -package unit - -// Unit is used to specify the units for a given measure. -// This is can used for display purposes. -type Unit string - -const ( - // UnitDimensionless indicates that a measure has no specified units. - Dimensionless = "1" - // UnitBytes indicates that that a measure is recording number of bytes. - Bytes = "By" - // UnitMilliseconds indicates that a measure is recording a duration in milliseconds. - Milliseconds = "ms" -) diff --git a/vendor/golang.org/x/tools/internal/testenv/testenv.go b/vendor/golang.org/x/tools/internal/testenv/testenv.go deleted file mode 100644 index 295cc45d3..000000000 --- a/vendor/golang.org/x/tools/internal/testenv/testenv.go +++ /dev/null @@ -1,157 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package testenv contains helper functions for skipping tests -// based on which tools are present in the environment. -package testenv - -import ( - "fmt" - "io/ioutil" - "os" - "os/exec" - "runtime" - "strings" -) - -// Testing is an abstraction of a *testing.T. -type Testing interface { - Skipf(format string, args ...interface{}) - Fatalf(format string, args ...interface{}) -} - -type helperer interface { - Helper() -} - -// packageMainIsDevel reports whether the module containing package main -// is a development version (if module information is available). -// -// Builds in GOPATH mode and builds that lack module information are assumed to -// be development versions. -var packageMainIsDevel = func() bool { return true } - -func hasTool(tool string) error { - _, err := exec.LookPath(tool) - if err != nil { - return err - } - switch tool { - case "patch": - // check that the patch tools supports the -o argument - temp, err := ioutil.TempFile("", "patch-test") - if err != nil { - return err - } - temp.Close() - defer os.Remove(temp.Name()) - cmd := exec.Command(tool, "-o", temp.Name()) - if err := cmd.Run(); err != nil { - return err - } - } - return nil -} - -func allowMissingTool(tool string) bool { - if runtime.GOOS == "android" { - // Android builds generally run tests on a separate machine from the build, - // so don't expect any external tools to be available. - return true - } - - switch tool { - case "go": - if os.Getenv("GO_BUILDER_NAME") == "illumos-amd64-joyent" { - // Work around a misconfigured builder (see https://golang.org/issue/33950). - return true - } - case "diff": - if os.Getenv("GO_BUILDER_NAME") != "" { - return true - } - case "patch": - if os.Getenv("GO_BUILDER_NAME") != "" { - return true - } - } - - // If a developer is actively working on this test, we expect them to have all - // of its dependencies installed. However, if it's just a dependency of some - // other module (for example, being run via 'go test all'), we should be more - // tolerant of unusual environments. - return !packageMainIsDevel() -} - -// NeedsTool skips t if the named tool is not present in the path. -func NeedsTool(t Testing, tool string) { - if t, ok := t.(helperer); ok { - t.Helper() - } - err := hasTool(tool) - if err == nil { - return - } - if allowMissingTool(tool) { - t.Skipf("skipping because %s tool not available: %v", tool, err) - } else { - t.Fatalf("%s tool not available: %v", tool, err) - } -} - -// NeedsGoPackages skips t if the go/packages driver (or 'go' tool) implied by -// the current process environment is not present in the path. -func NeedsGoPackages(t Testing) { - if t, ok := t.(helperer); ok { - t.Helper() - } - - tool := os.Getenv("GOPACKAGESDRIVER") - switch tool { - case "off": - // "off" forces go/packages to use the go command. - tool = "go" - case "": - if _, err := exec.LookPath("gopackagesdriver"); err == nil { - tool = "gopackagesdriver" - } else { - tool = "go" - } - } - - NeedsTool(t, tool) -} - -// NeedsGoPackagesEnv skips t if the go/packages driver (or 'go' tool) implied -// by env is not present in the path. -func NeedsGoPackagesEnv(t Testing, env []string) { - if t, ok := t.(helperer); ok { - t.Helper() - } - - for _, v := range env { - if strings.HasPrefix(v, "GOPACKAGESDRIVER=") { - tool := strings.TrimPrefix(v, "GOPACKAGESDRIVER=") - if tool == "off" { - NeedsTool(t, "go") - } else { - NeedsTool(t, tool) - } - return - } - } - - NeedsGoPackages(t) -} - -// ExitIfSmallMachine emits a helpful diagnostic and calls os.Exit(0) if the -// current machine is a builder known to have scarce resources. -// -// It should be called from within a TestMain function. -func ExitIfSmallMachine() { - if os.Getenv("GO_BUILDER_NAME") == "linux-arm" { - fmt.Fprintln(os.Stderr, "skipping test: linux-arm builder lacks sufficient memory (https://golang.org/issue/32834)") - os.Exit(0) - } -} diff --git a/vendor/golang.org/x/tools/internal/testenv/testenv_112.go b/vendor/golang.org/x/tools/internal/testenv/testenv_112.go deleted file mode 100644 index b25846c20..000000000 --- a/vendor/golang.org/x/tools/internal/testenv/testenv_112.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.12 - -package testenv - -import "runtime/debug" - -func packageMainIsDevelModule() bool { - info, ok := debug.ReadBuildInfo() - if !ok { - // Most test binaries currently lack build info, but this should become more - // permissive once https://golang.org/issue/33976 is fixed. - return true - } - - // Note: info.Main.Version describes the version of the module containing - // package main, not the version of “the main module”. - // See https://golang.org/issue/33975. - return info.Main.Version == "(devel)" -} - -func init() { - packageMainIsDevel = packageMainIsDevelModule -} diff --git a/vendor/golang.org/x/tools/internal/tool/tool.go b/vendor/golang.org/x/tools/internal/tool/tool.go deleted file mode 100644 index b50569ace..000000000 --- a/vendor/golang.org/x/tools/internal/tool/tool.go +++ /dev/null @@ -1,205 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package tool is an opinionated harness for writing Go tools. -package tool - -import ( - "context" - "flag" - "fmt" - "log" - "os" - "reflect" - "runtime" - "runtime/pprof" - "runtime/trace" - "time" -) - -// This file is a very opinionated harness for writing your main function. -// The original version of the file is in golang.org/x/tools/internal/tool. -// -// It adds a method to the Application type -// Main(name, usage string, args []string) -// which should normally be invoked from a true main as follows: -// func main() { -// (&Application{}).Main("myapp", "non-flag-command-line-arg-help", os.Args[1:]) -// } -// It recursively scans the application object for fields with a tag containing -// `flag:"flagname" help:"short help text"`` -// uses all those fields to build command line flags. -// It expects the Application type to have a method -// Run(context.Context, args...string) error -// which it invokes only after all command line flag processing has been finished. -// If Run returns an error, the error will be printed to stderr and the -// application will quit with a non zero exit status. - -// Profile can be embedded in your application struct to automatically -// add command line arguments and handling for the common profiling methods. -type Profile struct { - CPU string `flag:"profile.cpu" help:"write CPU profile to this file"` - Memory string `flag:"profile.mem" help:"write memory profile to this file"` - Trace string `flag:"profile.trace" help:"write trace log to this file"` -} - -// Application is the interface that must be satisfied by an object passed to Main. -type Application interface { - // Name returns the application's name. It is used in help and error messages. - Name() string - // Most of the help usage is automatically generated, this string should only - // describe the contents of non flag arguments. - Usage() string - // ShortHelp returns the one line overview of the command. - ShortHelp() string - // DetailedHelp should print a detailed help message. It will only ever be shown - // when the ShortHelp is also printed, so there is no need to duplicate - // anything from there. - // It is passed the flag set so it can print the default values of the flags. - // It should use the flag sets configured Output to write the help to. - DetailedHelp(*flag.FlagSet) - // Run is invoked after all flag processing, and inside the profiling and - // error handling harness. - Run(ctx context.Context, args ...string) error -} - -// This is the type returned by CommandLineErrorf, which causes the outer main -// to trigger printing of the command line help. -type commandLineError string - -func (e commandLineError) Error() string { return string(e) } - -// CommandLineErrorf is like fmt.Errorf except that it returns a value that -// triggers printing of the command line help. -// In general you should use this when generating command line validation errors. -func CommandLineErrorf(message string, args ...interface{}) error { - return commandLineError(fmt.Sprintf(message, args...)) -} - -// Main should be invoked directly by main function. -// It will only return if there was no error. If an error -// was encountered it is printed to standard error and the -// application exits with an exit code of 2. -func Main(ctx context.Context, app Application, args []string) { - s := flag.NewFlagSet(app.Name(), flag.ExitOnError) - s.Usage = func() { - fmt.Fprint(s.Output(), app.ShortHelp()) - fmt.Fprintf(s.Output(), "\n\nUsage: %v [flags] %v\n", app.Name(), app.Usage()) - app.DetailedHelp(s) - } - if err := Run(ctx, app, args); err != nil { - fmt.Fprintf(s.Output(), "%s: %v\n", app.Name(), err) - if _, printHelp := err.(commandLineError); printHelp { - s.Usage() - } - os.Exit(2) - } -} - -// Run is the inner loop for Main; invoked by Main, recursively by -// Run, and by various tests. It runs the application and returns an -// error. -func Run(ctx context.Context, app Application, args []string) error { - s := flag.NewFlagSet(app.Name(), flag.ExitOnError) - p := addFlags(s, reflect.StructField{}, reflect.ValueOf(app)) - s.Parse(args) - - if p != nil && p.CPU != "" { - f, err := os.Create(p.CPU) - if err != nil { - return err - } - if err := pprof.StartCPUProfile(f); err != nil { - return err - } - defer pprof.StopCPUProfile() - } - - if p != nil && p.Trace != "" { - f, err := os.Create(p.Trace) - if err != nil { - return err - } - if err := trace.Start(f); err != nil { - return err - } - defer func() { - trace.Stop() - log.Printf("To view the trace, run:\n$ go tool trace view %s", p.Trace) - }() - } - - if p != nil && p.Memory != "" { - f, err := os.Create(p.Memory) - if err != nil { - return err - } - defer func() { - runtime.GC() // get up-to-date statistics - if err := pprof.WriteHeapProfile(f); err != nil { - log.Printf("Writing memory profile: %v", err) - } - f.Close() - }() - } - - return app.Run(ctx, s.Args()...) -} - -// addFlags scans fields of structs recursively to find things with flag tags -// and add them to the flag set. -func addFlags(f *flag.FlagSet, field reflect.StructField, value reflect.Value) *Profile { - // is it a field we are allowed to reflect on? - if field.PkgPath != "" { - return nil - } - // now see if is actually a flag - flagName, isFlag := field.Tag.Lookup("flag") - help := field.Tag.Get("help") - if !isFlag { - // not a flag, but it might be a struct with flags in it - if value.Elem().Kind() != reflect.Struct { - return nil - } - p, _ := value.Interface().(*Profile) - // go through all the fields of the struct - sv := value.Elem() - for i := 0; i < sv.Type().NumField(); i++ { - child := sv.Type().Field(i) - v := sv.Field(i) - // make sure we have a pointer - if v.Kind() != reflect.Ptr { - v = v.Addr() - } - // check if that field is a flag or contains flags - if fp := addFlags(f, child, v); fp != nil { - p = fp - } - } - return p - } - switch v := value.Interface().(type) { - case flag.Value: - f.Var(v, flagName, help) - case *bool: - f.BoolVar(v, flagName, *v, help) - case *time.Duration: - f.DurationVar(v, flagName, *v, help) - case *float64: - f.Float64Var(v, flagName, *v, help) - case *int64: - f.Int64Var(v, flagName, *v, help) - case *int: - f.IntVar(v, flagName, *v, help) - case *string: - f.StringVar(v, flagName, *v, help) - case *uint: - f.UintVar(v, flagName, *v, help) - case *uint64: - f.Uint64Var(v, flagName, *v, help) - default: - log.Fatalf("Cannot understand flag of type %T", v) - } - return nil -} diff --git a/vendor/golang.org/x/tools/internal/txtar/archive.go b/vendor/golang.org/x/tools/internal/txtar/archive.go deleted file mode 100644 index c384f33bd..000000000 --- a/vendor/golang.org/x/tools/internal/txtar/archive.go +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package txtar implements a trivial text-based file archive format. -// -// The goals for the format are: -// -// - be trivial enough to create and edit by hand. -// - be able to store trees of text files describing go command test cases. -// - diff nicely in git history and code reviews. -// -// Non-goals include being a completely general archive format, -// storing binary data, storing file modes, storing special files like -// symbolic links, and so on. -// -// Txtar format -// -// A txtar archive is zero or more comment lines and then a sequence of file entries. -// Each file entry begins with a file marker line of the form "-- FILENAME --" -// and is followed by zero or more file content lines making up the file data. -// The comment or file content ends at the next file marker line. -// The file marker line must begin with the three-byte sequence "-- " -// and end with the three-byte sequence " --", but the enclosed -// file name can be surrounding by additional white space, -// all of which is stripped. -// -// If the txtar file is missing a trailing newline on the final line, -// parsers should consider a final newline to be present anyway. -// -// There are no possible syntax errors in a txtar archive. -package txtar - -import ( - "bytes" - "fmt" - "io/ioutil" - "strings" -) - -// An Archive is a collection of files. -type Archive struct { - Comment []byte - Files []File -} - -// A File is a single file in an archive. -type File struct { - Name string // name of file ("foo/bar.txt") - Data []byte // text content of file -} - -// Format returns the serialized form of an Archive. -// It is assumed that the Archive data structure is well-formed: -// a.Comment and all a.File[i].Data contain no file marker lines, -// and all a.File[i].Name is non-empty. -func Format(a *Archive) []byte { - var buf bytes.Buffer - buf.Write(fixNL(a.Comment)) - for _, f := range a.Files { - fmt.Fprintf(&buf, "-- %s --\n", f.Name) - buf.Write(fixNL(f.Data)) - } - return buf.Bytes() -} - -// ParseFile parses the named file as an archive. -func ParseFile(file string) (*Archive, error) { - data, err := ioutil.ReadFile(file) - if err != nil { - return nil, err - } - return Parse(data), nil -} - -// Parse parses the serialized form of an Archive. -// The returned Archive holds slices of data. -func Parse(data []byte) *Archive { - a := new(Archive) - var name string - a.Comment, name, data = findFileMarker(data) - for name != "" { - f := File{name, nil} - f.Data, name, data = findFileMarker(data) - a.Files = append(a.Files, f) - } - return a -} - -var ( - newlineMarker = []byte("\n-- ") - marker = []byte("-- ") - markerEnd = []byte(" --") -) - -// findFileMarker finds the next file marker in data, -// extracts the file name, and returns the data before the marker, -// the file name, and the data after the marker. -// If there is no next marker, findFileMarker returns before = fixNL(data), name = "", after = nil. -func findFileMarker(data []byte) (before []byte, name string, after []byte) { - var i int - for { - if name, after = isMarker(data[i:]); name != "" { - return data[:i], name, after - } - j := bytes.Index(data[i:], newlineMarker) - if j < 0 { - return fixNL(data), "", nil - } - i += j + 1 // positioned at start of new possible marker - } -} - -// isMarker checks whether data begins with a file marker line. -// If so, it returns the name from the line and the data after the line. -// Otherwise it returns name == "" with an unspecified after. -func isMarker(data []byte) (name string, after []byte) { - if !bytes.HasPrefix(data, marker) { - return "", nil - } - if i := bytes.IndexByte(data, '\n'); i >= 0 { - data, after = data[:i], data[i+1:] - } - if !bytes.HasSuffix(data, markerEnd) { - return "", nil - } - return strings.TrimSpace(string(data[len(marker) : len(data)-len(markerEnd)])), after -} - -// If data is empty or ends in \n, fixNL returns data. -// Otherwise fixNL returns a new slice consisting of data with a final \n added. -func fixNL(data []byte) []byte { - if len(data) == 0 || data[len(data)-1] == '\n' { - return data - } - d := make([]byte, len(data)+1) - copy(d, data) - d[len(data)] = '\n' - return d -} diff --git a/vendor/golang.org/x/tools/internal/xcontext/xcontext.go b/vendor/golang.org/x/tools/internal/xcontext/xcontext.go deleted file mode 100644 index ff8ed4ebb..000000000 --- a/vendor/golang.org/x/tools/internal/xcontext/xcontext.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package xcontext is a package to offer the extra functionality we need -// from contexts that is not available from the standard context package. -package xcontext - -import ( - "context" - "time" -) - -// Detach returns a context that keeps all the values of its parent context -// but detaches from the cancellation and error handling. -func Detach(ctx context.Context) context.Context { return detachedContext{ctx} } - -type detachedContext struct{ parent context.Context } - -func (v detachedContext) Deadline() (time.Time, bool) { return time.Time{}, false } -func (v detachedContext) Done() <-chan struct{} { return nil } -func (v detachedContext) Err() error { return nil } -func (v detachedContext) Value(key interface{}) interface{} { return v.parent.Value(key) } diff --git a/vendor/golang.org/x/tools/playground/playground.go b/vendor/golang.org/x/tools/playground/playground.go deleted file mode 100644 index 14e984183..000000000 --- a/vendor/golang.org/x/tools/playground/playground.go +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package playground registers HTTP handlers at "/compile" and "/share" that -// proxy requests to the golang.org playground service. -// This package may be used unaltered on App Engine Standard with Go 1.11+ runtime. -package playground // import "golang.org/x/tools/playground" - -import ( - "bytes" - "context" - "fmt" - "io" - "log" - "net/http" - "os" - "strings" - "time" - - "golang.org/x/tools/godoc/golangorgenv" -) - -const baseURL = "https://play.golang.org" - -func init() { - http.HandleFunc("/compile", bounce) - http.HandleFunc("/share", bounce) -} - -func bounce(w http.ResponseWriter, r *http.Request) { - b := new(bytes.Buffer) - if err := passThru(b, r); os.IsPermission(err) { - http.Error(w, "403 Forbidden", http.StatusForbidden) - log.Println(err) - return - } else if err != nil { - http.Error(w, "500 Internal Server Error", http.StatusInternalServerError) - log.Println(err) - return - } - io.Copy(w, b) -} - -func passThru(w io.Writer, req *http.Request) error { - if req.URL.Path == "/share" && googleCN(req) { - return os.ErrPermission - } - defer req.Body.Close() - url := baseURL + req.URL.Path - ctx, cancel := context.WithTimeout(req.Context(), 60*time.Second) - defer cancel() - r, err := post(ctx, url, req.Header.Get("Content-Type"), req.Body) - if err != nil { - return fmt.Errorf("making POST request: %v", err) - } - defer r.Body.Close() - if _, err := io.Copy(w, r.Body); err != nil { - return fmt.Errorf("copying response Body: %v", err) - } - return nil -} - -func post(ctx context.Context, url, contentType string, body io.Reader) (*http.Response, error) { - req, err := http.NewRequest(http.MethodPost, url, body) - if err != nil { - return nil, fmt.Errorf("http.NewRequest: %v", err) - } - req.Header.Set("Content-Type", contentType) - return http.DefaultClient.Do(req.WithContext(ctx)) -} - -// googleCN reports whether request r is considered -// to be served from golang.google.cn. -func googleCN(r *http.Request) bool { - if r.FormValue("googlecn") != "" { - return true - } - if strings.HasSuffix(r.Host, ".cn") { - return true - } - if !golangorgenv.CheckCountry() { - return false - } - switch r.Header.Get("X-Appengine-Country") { - case "", "ZZ", "CN": - return true - } - return false -} diff --git a/vendor/golang.org/x/tools/playground/socket/socket.go b/vendor/golang.org/x/tools/playground/socket/socket.go deleted file mode 100644 index 0c275bffa..000000000 --- a/vendor/golang.org/x/tools/playground/socket/socket.go +++ /dev/null @@ -1,524 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !appengine - -// Package socket implements an WebSocket-based playground backend. -// Clients connect to a websocket handler and send run/kill commands, and -// the server sends the output and exit status of the running processes. -// Multiple clients running multiple processes may be served concurrently. -// The wire format is JSON and is described by the Message type. -// -// This will not run on App Engine as WebSockets are not supported there. -package socket // import "golang.org/x/tools/playground/socket" - -import ( - "bytes" - "encoding/json" - "errors" - "go/parser" - "go/token" - "io" - "io/ioutil" - "log" - "net" - "net/http" - "net/url" - "os" - "os/exec" - "path/filepath" - "runtime" - "strconv" - "strings" - "time" - "unicode/utf8" - - "golang.org/x/net/websocket" -) - -// RunScripts specifies whether the socket handler should execute shell scripts -// (snippets that start with a shebang). -var RunScripts = true - -// Environ provides an environment when a binary, such as the go tool, is -// invoked. -var Environ func() []string = os.Environ - -const ( - // The maximum number of messages to send per session (avoid flooding). - msgLimit = 1000 - - // Batch messages sent in this interval and send as a single message. - msgDelay = 10 * time.Millisecond -) - -// Message is the wire format for the websocket connection to the browser. -// It is used for both sending output messages and receiving commands, as -// distinguished by the Kind field. -type Message struct { - Id string // client-provided unique id for the process - Kind string // in: "run", "kill" out: "stdout", "stderr", "end" - Body string - Options *Options `json:",omitempty"` -} - -// Options specify additional message options. -type Options struct { - Race bool // use -race flag when building code (for "run" only) -} - -// NewHandler returns a websocket server which checks the origin of requests. -func NewHandler(origin *url.URL) websocket.Server { - return websocket.Server{ - Config: websocket.Config{Origin: origin}, - Handshake: handshake, - Handler: websocket.Handler(socketHandler), - } -} - -// handshake checks the origin of a request during the websocket handshake. -func handshake(c *websocket.Config, req *http.Request) error { - o, err := websocket.Origin(c, req) - if err != nil { - log.Println("bad websocket origin:", err) - return websocket.ErrBadWebSocketOrigin - } - _, port, err := net.SplitHostPort(c.Origin.Host) - if err != nil { - log.Println("bad websocket origin:", err) - return websocket.ErrBadWebSocketOrigin - } - ok := c.Origin.Scheme == o.Scheme && (c.Origin.Host == o.Host || c.Origin.Host == net.JoinHostPort(o.Host, port)) - if !ok { - log.Println("bad websocket origin:", o) - return websocket.ErrBadWebSocketOrigin - } - log.Println("accepting connection from:", req.RemoteAddr) - return nil -} - -// socketHandler handles the websocket connection for a given present session. -// It handles transcoding Messages to and from JSON format, and starting -// and killing processes. -func socketHandler(c *websocket.Conn) { - in, out := make(chan *Message), make(chan *Message) - errc := make(chan error, 1) - - // Decode messages from client and send to the in channel. - go func() { - dec := json.NewDecoder(c) - for { - var m Message - if err := dec.Decode(&m); err != nil { - errc <- err - return - } - in <- &m - } - }() - - // Receive messages from the out channel and encode to the client. - go func() { - enc := json.NewEncoder(c) - for m := range out { - if err := enc.Encode(m); err != nil { - errc <- err - return - } - } - }() - defer close(out) - - // Start and kill processes and handle errors. - proc := make(map[string]*process) - for { - select { - case m := <-in: - switch m.Kind { - case "run": - log.Println("running snippet from:", c.Request().RemoteAddr) - proc[m.Id].Kill() - proc[m.Id] = startProcess(m.Id, m.Body, out, m.Options) - case "kill": - proc[m.Id].Kill() - } - case err := <-errc: - if err != io.EOF { - // A encode or decode has failed; bail. - log.Println(err) - } - // Shut down any running processes. - for _, p := range proc { - p.Kill() - } - return - } - } -} - -// process represents a running process. -type process struct { - out chan<- *Message - done chan struct{} // closed when wait completes - run *exec.Cmd - bin string -} - -// startProcess builds and runs the given program, sending its output -// and end event as Messages on the provided channel. -func startProcess(id, body string, dest chan<- *Message, opt *Options) *process { - var ( - done = make(chan struct{}) - out = make(chan *Message) - p = &process{out: out, done: done} - ) - go func() { - defer close(done) - for m := range buffer(limiter(out, p), time.After) { - m.Id = id - dest <- m - } - }() - var err error - if path, args := shebang(body); path != "" { - if RunScripts { - err = p.startProcess(path, args, body) - } else { - err = errors.New("script execution is not allowed") - } - } else { - err = p.start(body, opt) - } - if err != nil { - p.end(err) - return nil - } - go func() { - p.end(p.run.Wait()) - }() - return p -} - -// end sends an "end" message to the client, containing the process id and the -// given error value. It also removes the binary, if present. -func (p *process) end(err error) { - if p.bin != "" { - defer os.Remove(p.bin) - } - m := &Message{Kind: "end"} - if err != nil { - m.Body = err.Error() - } - p.out <- m - close(p.out) -} - -// A killer provides a mechanism to terminate a process. -// The Kill method returns only once the process has exited. -type killer interface { - Kill() -} - -// limiter returns a channel that wraps the given channel. -// It receives Messages from the given channel and sends them to the returned -// channel until it passes msgLimit messages, at which point it will kill the -// process and pass only the "end" message. -// When the given channel is closed, or when the "end" message is received, -// it closes the returned channel. -func limiter(in <-chan *Message, p killer) <-chan *Message { - out := make(chan *Message) - go func() { - defer close(out) - n := 0 - for m := range in { - switch { - case n < msgLimit || m.Kind == "end": - out <- m - if m.Kind == "end" { - return - } - case n == msgLimit: - // Kill in a goroutine as Kill will not return - // until the process' output has been - // processed, and we're doing that in this loop. - go p.Kill() - default: - continue // don't increment - } - n++ - } - }() - return out -} - -// buffer returns a channel that wraps the given channel. It receives messages -// from the given channel and sends them to the returned channel. -// Message bodies are gathered over the period msgDelay and coalesced into a -// single Message before they are passed on. Messages of the same kind are -// coalesced; when a message of a different kind is received, any buffered -// messages are flushed. When the given channel is closed, buffer flushes the -// remaining buffered messages and closes the returned channel. -// The timeAfter func should be time.After. It exists for testing. -func buffer(in <-chan *Message, timeAfter func(time.Duration) <-chan time.Time) <-chan *Message { - out := make(chan *Message) - go func() { - defer close(out) - var ( - tc <-chan time.Time - buf []byte - kind string - flush = func() { - if len(buf) == 0 { - return - } - out <- &Message{Kind: kind, Body: safeString(buf)} - buf = buf[:0] // recycle buffer - kind = "" - } - ) - for { - select { - case m, ok := <-in: - if !ok { - flush() - return - } - if m.Kind == "end" { - flush() - out <- m - return - } - if kind != m.Kind { - flush() - kind = m.Kind - if tc == nil { - tc = timeAfter(msgDelay) - } - } - buf = append(buf, m.Body...) - case <-tc: - flush() - tc = nil - } - } - }() - return out -} - -// Kill stops the process if it is running and waits for it to exit. -func (p *process) Kill() { - if p == nil || p.run == nil { - return - } - p.run.Process.Kill() - <-p.done // block until process exits -} - -// shebang looks for a shebang ('#!') at the beginning of the passed string. -// If found, it returns the path and args after the shebang. -// args includes the command as args[0]. -func shebang(body string) (path string, args []string) { - body = strings.TrimSpace(body) - if !strings.HasPrefix(body, "#!") { - return "", nil - } - if i := strings.Index(body, "\n"); i >= 0 { - body = body[:i] - } - fs := strings.Fields(body[2:]) - return fs[0], fs -} - -// startProcess starts a given program given its path and passing the given body -// to the command standard input. -func (p *process) startProcess(path string, args []string, body string) error { - cmd := &exec.Cmd{ - Path: path, - Args: args, - Stdin: strings.NewReader(body), - Stdout: &messageWriter{kind: "stdout", out: p.out}, - Stderr: &messageWriter{kind: "stderr", out: p.out}, - } - if err := cmd.Start(); err != nil { - return err - } - p.run = cmd - return nil -} - -// start builds and starts the given program, sending its output to p.out, -// and stores the running *exec.Cmd in the run field. -func (p *process) start(body string, opt *Options) error { - // We "go build" and then exec the binary so that the - // resultant *exec.Cmd is a handle to the user's program - // (rather than the go tool process). - // This makes Kill work. - - bin := filepath.Join(tmpdir, "compile"+strconv.Itoa(<-uniq)) - src := bin + ".go" - if runtime.GOOS == "windows" { - bin += ".exe" - } - - // write body to x.go - defer os.Remove(src) - err := ioutil.WriteFile(src, []byte(body), 0666) - if err != nil { - return err - } - - // build x.go, creating x - p.bin = bin // to be removed by p.end - dir, file := filepath.Split(src) - args := []string{"go", "build", "-tags", "OMIT"} - if opt != nil && opt.Race { - p.out <- &Message{ - Kind: "stderr", - Body: "Running with race detector.\n", - } - args = append(args, "-race") - } - args = append(args, "-o", bin, file) - cmd := p.cmd(dir, args...) - cmd.Stdout = cmd.Stderr // send compiler output to stderr - if err := cmd.Run(); err != nil { - return err - } - - // run x - if isNacl() { - cmd, err = p.naclCmd(bin) - if err != nil { - return err - } - } else { - cmd = p.cmd("", bin) - } - if opt != nil && opt.Race { - cmd.Env = append(cmd.Env, "GOMAXPROCS=2") - } - if err := cmd.Start(); err != nil { - // If we failed to exec, that might be because they built - // a non-main package instead of an executable. - // Check and report that. - if name, err := packageName(body); err == nil && name != "main" { - return errors.New(`executable programs must use "package main"`) - } - return err - } - p.run = cmd - return nil -} - -// cmd builds an *exec.Cmd that writes its standard output and error to the -// process' output channel. -func (p *process) cmd(dir string, args ...string) *exec.Cmd { - cmd := exec.Command(args[0], args[1:]...) - cmd.Dir = dir - cmd.Env = Environ() - cmd.Stdout = &messageWriter{kind: "stdout", out: p.out} - cmd.Stderr = &messageWriter{kind: "stderr", out: p.out} - return cmd -} - -func isNacl() bool { - for _, v := range append(Environ(), os.Environ()...) { - if v == "GOOS=nacl" { - return true - } - } - return false -} - -// naclCmd returns an *exec.Cmd that executes bin under native client. -func (p *process) naclCmd(bin string) (*exec.Cmd, error) { - pwd, err := os.Getwd() - if err != nil { - return nil, err - } - var args []string - env := []string{ - "NACLENV_GOOS=" + runtime.GOOS, - "NACLENV_GOROOT=/go", - "NACLENV_NACLPWD=" + strings.Replace(pwd, runtime.GOROOT(), "/go", 1), - } - switch runtime.GOARCH { - case "amd64": - env = append(env, "NACLENV_GOARCH=amd64p32") - args = []string{"sel_ldr_x86_64"} - case "386": - env = append(env, "NACLENV_GOARCH=386") - args = []string{"sel_ldr_x86_32"} - case "arm": - env = append(env, "NACLENV_GOARCH=arm") - selLdr, err := exec.LookPath("sel_ldr_arm") - if err != nil { - return nil, err - } - args = []string{"nacl_helper_bootstrap_arm", selLdr, "--reserved_at_zero=0xXXXXXXXXXXXXXXXX"} - default: - return nil, errors.New("native client does not support GOARCH=" + runtime.GOARCH) - } - - cmd := p.cmd("", append(args, "-l", "/dev/null", "-S", "-e", bin)...) - cmd.Env = append(cmd.Env, env...) - - return cmd, nil -} - -func packageName(body string) (string, error) { - f, err := parser.ParseFile(token.NewFileSet(), "prog.go", - strings.NewReader(body), parser.PackageClauseOnly) - if err != nil { - return "", err - } - return f.Name.String(), nil -} - -// messageWriter is an io.Writer that converts all writes to Message sends on -// the out channel with the specified id and kind. -type messageWriter struct { - kind string - out chan<- *Message -} - -func (w *messageWriter) Write(b []byte) (n int, err error) { - w.out <- &Message{Kind: w.kind, Body: safeString(b)} - return len(b), nil -} - -// safeString returns b as a valid UTF-8 string. -func safeString(b []byte) string { - if utf8.Valid(b) { - return string(b) - } - var buf bytes.Buffer - for len(b) > 0 { - r, size := utf8.DecodeRune(b) - b = b[size:] - buf.WriteRune(r) - } - return buf.String() -} - -var tmpdir string - -func init() { - // find real path to temporary directory - var err error - tmpdir, err = filepath.EvalSymlinks(os.TempDir()) - if err != nil { - log.Fatal(err) - } -} - -var uniq = make(chan int) // a source of numbers for naming temporary files - -func init() { - go func() { - for i := 0; ; i++ { - uniq <- i - } - }() -} diff --git a/vendor/golang.org/x/tools/present/args.go b/vendor/golang.org/x/tools/present/args.go deleted file mode 100644 index d63196e02..000000000 --- a/vendor/golang.org/x/tools/present/args.go +++ /dev/null @@ -1,228 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package present - -import ( - "errors" - "regexp" - "strconv" - "unicode/utf8" -) - -// This file is stolen from go/src/cmd/godoc/codewalk.go. -// It's an evaluator for the file address syntax implemented by acme and sam, -// but using Go-native regular expressions. -// To keep things reasonably close, this version uses (?m:re) for all user-provided -// regular expressions. That is the only change to the code from codewalk.go. -// See http://9p.io/sys/doc/sam/sam.html Table II for details on the syntax. - -// addrToByte evaluates the given address starting at offset start in data. -// It returns the lo and hi byte offset of the matched region within data. -func addrToByteRange(addr string, start int, data []byte) (lo, hi int, err error) { - if addr == "" { - lo, hi = start, len(data) - return - } - var ( - dir byte - prevc byte - charOffset bool - ) - lo = start - hi = start - for addr != "" && err == nil { - c := addr[0] - switch c { - default: - err = errors.New("invalid address syntax near " + string(c)) - case ',': - if len(addr) == 1 { - hi = len(data) - } else { - _, hi, err = addrToByteRange(addr[1:], hi, data) - } - return - - case '+', '-': - if prevc == '+' || prevc == '-' { - lo, hi, err = addrNumber(data, lo, hi, prevc, 1, charOffset) - } - dir = c - - case '$': - lo = len(data) - hi = len(data) - if len(addr) > 1 { - dir = '+' - } - - case '#': - charOffset = true - - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - var i int - for i = 1; i < len(addr); i++ { - if addr[i] < '0' || addr[i] > '9' { - break - } - } - var n int - n, err = strconv.Atoi(addr[0:i]) - if err != nil { - break - } - lo, hi, err = addrNumber(data, lo, hi, dir, n, charOffset) - dir = 0 - charOffset = false - prevc = c - addr = addr[i:] - continue - - case '/': - var i, j int - Regexp: - for i = 1; i < len(addr); i++ { - switch addr[i] { - case '\\': - i++ - case '/': - j = i + 1 - break Regexp - } - } - if j == 0 { - j = i - } - pattern := addr[1:i] - lo, hi, err = addrRegexp(data, lo, hi, dir, pattern) - prevc = c - addr = addr[j:] - continue - } - prevc = c - addr = addr[1:] - } - - if err == nil && dir != 0 { - lo, hi, err = addrNumber(data, lo, hi, dir, 1, charOffset) - } - if err != nil { - return 0, 0, err - } - return lo, hi, nil -} - -// addrNumber applies the given dir, n, and charOffset to the address lo, hi. -// dir is '+' or '-', n is the count, and charOffset is true if the syntax -// used was #n. Applying +n (or +#n) means to advance n lines -// (or characters) after hi. Applying -n (or -#n) means to back up n lines -// (or characters) before lo. -// The return value is the new lo, hi. -func addrNumber(data []byte, lo, hi int, dir byte, n int, charOffset bool) (int, int, error) { - switch dir { - case 0: - lo = 0 - hi = 0 - fallthrough - - case '+': - if charOffset { - pos := hi - for ; n > 0 && pos < len(data); n-- { - _, size := utf8.DecodeRune(data[pos:]) - pos += size - } - if n == 0 { - return pos, pos, nil - } - break - } - // find next beginning of line - if hi > 0 { - for hi < len(data) && data[hi-1] != '\n' { - hi++ - } - } - lo = hi - if n == 0 { - return lo, hi, nil - } - for ; hi < len(data); hi++ { - if data[hi] != '\n' { - continue - } - switch n--; n { - case 1: - lo = hi + 1 - case 0: - return lo, hi + 1, nil - } - } - - case '-': - if charOffset { - // Scan backward for bytes that are not UTF-8 continuation bytes. - pos := lo - for ; pos > 0 && n > 0; pos-- { - if data[pos]&0xc0 != 0x80 { - n-- - } - } - if n == 0 { - return pos, pos, nil - } - break - } - // find earlier beginning of line - for lo > 0 && data[lo-1] != '\n' { - lo-- - } - hi = lo - if n == 0 { - return lo, hi, nil - } - for ; lo >= 0; lo-- { - if lo > 0 && data[lo-1] != '\n' { - continue - } - switch n--; n { - case 1: - hi = lo - case 0: - return lo, hi, nil - } - } - } - - return 0, 0, errors.New("address out of range") -} - -// addrRegexp searches for pattern in the given direction starting at lo, hi. -// The direction dir is '+' (search forward from hi) or '-' (search backward from lo). -// Backward searches are unimplemented. -func addrRegexp(data []byte, lo, hi int, dir byte, pattern string) (int, int, error) { - // We want ^ and $ to work as in sam/acme, so use ?m. - re, err := regexp.Compile("(?m:" + pattern + ")") - if err != nil { - return 0, 0, err - } - if dir == '-' { - // Could implement reverse search using binary search - // through file, but that seems like overkill. - return 0, 0, errors.New("reverse search not implemented") - } - m := re.FindIndex(data[hi:]) - if len(m) > 0 { - m[0] += hi - m[1] += hi - } else if hi > 0 { - // No match. Wrap to beginning of data. - m = re.FindIndex(data) - } - if len(m) == 0 { - return 0, 0, errors.New("no match for " + pattern) - } - return m[0], m[1], nil -} diff --git a/vendor/golang.org/x/tools/present/caption.go b/vendor/golang.org/x/tools/present/caption.go deleted file mode 100644 index 00e0b5d05..000000000 --- a/vendor/golang.org/x/tools/present/caption.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package present - -import "strings" - -func init() { - Register("caption", parseCaption) -} - -type Caption struct { - Text string -} - -func (c Caption) TemplateName() string { return "caption" } - -func parseCaption(_ *Context, _ string, _ int, text string) (Elem, error) { - text = strings.TrimSpace(strings.TrimPrefix(text, ".caption")) - return Caption{text}, nil -} diff --git a/vendor/golang.org/x/tools/present/code.go b/vendor/golang.org/x/tools/present/code.go deleted file mode 100644 index b47a72a50..000000000 --- a/vendor/golang.org/x/tools/present/code.go +++ /dev/null @@ -1,267 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package present - -import ( - "bufio" - "bytes" - "fmt" - "html/template" - "path/filepath" - "regexp" - "strconv" - "strings" -) - -// PlayEnabled specifies whether runnable playground snippets should be -// displayed in the present user interface. -var PlayEnabled = false - -// TODO(adg): replace the PlayEnabled flag with something less spaghetti-like. -// Instead this will probably be determined by a template execution Context -// value that contains various global metadata required when rendering -// templates. - -// NotesEnabled specifies whether presenter notes should be displayed in the -// present user interface. -var NotesEnabled = false - -func init() { - Register("code", parseCode) - Register("play", parseCode) -} - -type Code struct { - Text template.HTML - Play bool // runnable code - Edit bool // editable code - FileName string // file name - Ext string // file extension - Raw []byte // content of the file -} - -func (c Code) TemplateName() string { return "code" } - -// The input line is a .code or .play entry with a file name and an optional HLfoo marker on the end. -// Anything between the file and HL (if any) is an address expression, which we treat as a string here. -// We pick off the HL first, for easy parsing. -var ( - highlightRE = regexp.MustCompile(`\s+HL([a-zA-Z0-9_]+)?$`) - hlCommentRE = regexp.MustCompile(`(.+) // HL(.*)$`) - codeRE = regexp.MustCompile(`\.(code|play)\s+((?:(?:-edit|-numbers)\s+)*)([^\s]+)(?:\s+(.*))?$`) -) - -// parseCode parses a code present directive. Its syntax: -// .code [-numbers] [-edit] [address] [highlight] -// The directive may also be ".play" if the snippet is executable. -func parseCode(ctx *Context, sourceFile string, sourceLine int, cmd string) (Elem, error) { - cmd = strings.TrimSpace(cmd) - - // Pull off the HL, if any, from the end of the input line. - highlight := "" - if hl := highlightRE.FindStringSubmatchIndex(cmd); len(hl) == 4 { - if hl[2] < 0 || hl[3] < 0 { - return nil, fmt.Errorf("%s:%d invalid highlight syntax", sourceFile, sourceLine) - } - highlight = cmd[hl[2]:hl[3]] - cmd = cmd[:hl[2]-2] - } - - // Parse the remaining command line. - // Arguments: - // args[0]: whole match - // args[1]: .code/.play - // args[2]: flags ("-edit -numbers") - // args[3]: file name - // args[4]: optional address - args := codeRE.FindStringSubmatch(cmd) - if len(args) != 5 { - return nil, fmt.Errorf("%s:%d: syntax error for .code/.play invocation", sourceFile, sourceLine) - } - command, flags, file, addr := args[1], args[2], args[3], strings.TrimSpace(args[4]) - play := command == "play" && PlayEnabled - - // Read in code file and (optionally) match address. - filename := filepath.Join(filepath.Dir(sourceFile), file) - textBytes, err := ctx.ReadFile(filename) - if err != nil { - return nil, fmt.Errorf("%s:%d: %v", sourceFile, sourceLine, err) - } - lo, hi, err := addrToByteRange(addr, 0, textBytes) - if err != nil { - return nil, fmt.Errorf("%s:%d: %v", sourceFile, sourceLine, err) - } - if lo > hi { - // The search in addrToByteRange can wrap around so we might - // end up with the range ending before its starting point - hi, lo = lo, hi - } - - // Acme pattern matches can stop mid-line, - // so run to end of line in both directions if not at line start/end. - for lo > 0 && textBytes[lo-1] != '\n' { - lo-- - } - if hi > 0 { - for hi < len(textBytes) && textBytes[hi-1] != '\n' { - hi++ - } - } - - lines := codeLines(textBytes, lo, hi) - - data := &codeTemplateData{ - Lines: formatLines(lines, highlight), - Edit: strings.Contains(flags, "-edit"), - Numbers: strings.Contains(flags, "-numbers"), - } - - // Include before and after in a hidden span for playground code. - if play { - data.Prefix = textBytes[:lo] - data.Suffix = textBytes[hi:] - } - - var buf bytes.Buffer - if err := codeTemplate.Execute(&buf, data); err != nil { - return nil, err - } - return Code{ - Text: template.HTML(buf.String()), - Play: play, - Edit: data.Edit, - FileName: filepath.Base(filename), - Ext: filepath.Ext(filename), - Raw: rawCode(lines), - }, nil -} - -// formatLines returns a new slice of codeLine with the given lines -// replacing tabs with spaces and adding highlighting where needed. -func formatLines(lines []codeLine, highlight string) []codeLine { - formatted := make([]codeLine, len(lines)) - for i, line := range lines { - // Replace tabs with spaces, which work better in HTML. - line.L = strings.Replace(line.L, "\t", " ", -1) - - // Highlight lines that end with "// HL[highlight]" - // and strip the magic comment. - if m := hlCommentRE.FindStringSubmatch(line.L); m != nil { - line.L = m[1] - line.HL = m[2] == highlight - } - - formatted[i] = line - } - return formatted -} - -// rawCode returns the code represented by the given codeLines without any kind -// of formatting. -func rawCode(lines []codeLine) []byte { - b := new(bytes.Buffer) - for _, line := range lines { - b.WriteString(line.L) - b.WriteByte('\n') - } - return b.Bytes() -} - -type codeTemplateData struct { - Lines []codeLine - Prefix, Suffix []byte - Edit, Numbers bool -} - -var leadingSpaceRE = regexp.MustCompile(`^[ \t]*`) - -var codeTemplate = template.Must(template.New("code").Funcs(template.FuncMap{ - "trimSpace": strings.TrimSpace, - "leadingSpace": leadingSpaceRE.FindString, -}).Parse(codeTemplateHTML)) - -const codeTemplateHTML = ` -{{with .Prefix}}
        {{printf "%s" .}}
        {{end}} - -{{/* - */}}{{range .Lines}}{{/* - */}}{{if .HL}}{{leadingSpace .L}}{{trimSpace .L}}{{/* - */}}{{else}}{{.L}}{{end}}{{/* -*/}} -{{end}}
        - -{{with .Suffix}}
        {{printf "%s" .}}
        {{end}} -` - -// codeLine represents a line of code extracted from a source file. -type codeLine struct { - L string // The line of code. - N int // The line number from the source file. - HL bool // Whether the line should be highlighted. -} - -// codeLines takes a source file and returns the lines that -// span the byte range specified by start and end. -// It discards lines that end in "OMIT". -func codeLines(src []byte, start, end int) (lines []codeLine) { - startLine := 1 - for i, b := range src { - if i == start { - break - } - if b == '\n' { - startLine++ - } - } - s := bufio.NewScanner(bytes.NewReader(src[start:end])) - for n := startLine; s.Scan(); n++ { - l := s.Text() - if strings.HasSuffix(l, "OMIT") { - continue - } - lines = append(lines, codeLine{L: l, N: n}) - } - // Trim leading and trailing blank lines. - for len(lines) > 0 && len(lines[0].L) == 0 { - lines = lines[1:] - } - for len(lines) > 0 && len(lines[len(lines)-1].L) == 0 { - lines = lines[:len(lines)-1] - } - return -} - -func parseArgs(name string, line int, args []string) (res []interface{}, err error) { - res = make([]interface{}, len(args)) - for i, v := range args { - if len(v) == 0 { - return nil, fmt.Errorf("%s:%d bad code argument %q", name, line, v) - } - switch v[0] { - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - n, err := strconv.Atoi(v) - if err != nil { - return nil, fmt.Errorf("%s:%d bad code argument %q", name, line, v) - } - res[i] = n - case '/': - if len(v) < 2 || v[len(v)-1] != '/' { - return nil, fmt.Errorf("%s:%d bad code argument %q", name, line, v) - } - res[i] = v - case '$': - res[i] = "$" - case '_': - if len(v) == 1 { - // Do nothing; "_" indicates an intentionally empty parameter. - break - } - fallthrough - default: - return nil, fmt.Errorf("%s:%d bad code argument %q", name, line, v) - } - } - return -} diff --git a/vendor/golang.org/x/tools/present/doc.go b/vendor/golang.org/x/tools/present/doc.go deleted file mode 100644 index ff75d66c4..000000000 --- a/vendor/golang.org/x/tools/present/doc.go +++ /dev/null @@ -1,261 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* -The present file format - -Present files have the following format. The first non-blank non-comment -line is the title, so the header looks like - - Title of document - Subtitle of document - 15:04 2 Jan 2006 - Tags: foo, bar, baz - - Author Name - Job title, Company - joe@example.com - http://url/ - @twitter_name - -The subtitle, date, and tags lines are optional. - -The date line may be written without a time: - 2 Jan 2006 -In this case, the time will be interpreted as 10am UTC on that date. - -The tags line is a comma-separated list of tags that may be used to categorize -the document. - -The author section may contain a mixture of text, twitter names, and links. -For slide presentations, only the plain text lines will be displayed on the -first slide. - -Multiple presenters may be specified, separated by a blank line. - -After that come slides/sections, each after a blank line: - - * Title of slide or section (must have asterisk) - - Some Text - - ** Subsection - - - bullets - - more bullets - - a bullet with - - *** Sub-subsection - - Some More text - - Preformatted text - is indented (however you like) - - Further Text, including invocations like: - - .code x.go /^func main/,/^}/ - .play y.go - .image image.jpg - .background image.jpg - .iframe http://foo - .link http://foo label - .html file.html - .caption _Gopher_ by [[https://www.instagram.com/reneefrench/][Renée French]] - - Again, more text - -Blank lines are OK (not mandatory) after the title and after the -text. Text, bullets, and .code etc. are all optional; title is -not. - -Lines starting with # in column 1 are commentary. - -Fonts: - -Within the input for plain text or lists, text bracketed by font -markers will be presented in italic, bold, or program font. -Marker characters are _ (italic), * (bold) and ` (program font). -An opening marker must be preceded by a space or punctuation -character or else be at start of a line; similarly, a closing -marker must be followed by a space or punctuation character or -else be at the end of a line. Unmatched markers appear as plain text. -There must be no spaces between markers. Within marked text, -a single marker character becomes a space and a doubled single -marker quotes the marker character. - - _italic_ - *bold* - `program` - Markup—_especially_italic_text_—can easily be overused. - _Why_use_scoped__ptr_? Use plain ***ptr* instead. - -Inline links: - -Links can be included in any text with the form [[url][label]], or -[[url]] to use the URL itself as the label. - -Functions: - -A number of template functions are available through invocations -in the input text. Each such invocation contains a period as the -first character on the line, followed immediately by the name of -the function, followed by any arguments. A typical invocation might -be - .play demo.go /^func show/,/^}/ -(except that the ".play" must be at the beginning of the line and -not be indented like this.) - -Here follows a description of the functions: - -code: - -Injects program source into the output by extracting code from files -and injecting them as HTML-escaped
         blocks.  The argument is
        -a file name followed by an optional address that specifies what
        -section of the file to display. The address syntax is similar in
        -its simplest form to that of ed, but comes from sam and is more
        -general. See
        -	https://plan9.io/sys/doc/sam/sam.html Table II
        -for full details. The displayed block is always rounded out to a
        -full line at both ends.
        -
        -If no pattern is present, the entire file is displayed.
        -
        -Any line in the program that ends with the four characters
        -	OMIT
        -is deleted from the source before inclusion, making it easy
        -to write things like
        -	.code test.go /START OMIT/,/END OMIT/
        -to find snippets like this
        -	tedious_code = boring_function()
        -	// START OMIT
        -	interesting_code = fascinating_function()
        -	// END OMIT
        -and see only this:
        -	interesting_code = fascinating_function()
        -
        -Also, inside the displayed text a line that ends
        -	// HL
        -will be highlighted in the display. A highlighting mark may have a
        -suffix word, such as
        -	// HLxxx
        -Such highlights are enabled only if the code invocation ends with
        -"HL" followed by the word:
        -	.code test.go /^type Foo/,/^}/ HLxxx
        -
        -The .code function may take one or more flags immediately preceding
        -the filename. This command shows test.go in an editable text area:
        -	.code -edit test.go
        -This command shows test.go with line numbers:
        -	.code -numbers test.go
        -
        -play:
        -
        -The function "play" is the same as "code" but puts a button
        -on the displayed source so the program can be run from the browser.
        -Although only the selected text is shown, all the source is included
        -in the HTML output so it can be presented to the compiler.
        -
        -link:
        -
        -Create a hyperlink. The syntax is 1 or 2 space-separated arguments.
        -The first argument is always the HTTP URL.  If there is a second
        -argument, it is the text label to display for this link.
        -
        -	.link http://golang.org golang.org
        -
        -image:
        -
        -The template uses the function "image" to inject picture files.
        -
        -The syntax is simple: 1 or 3 space-separated arguments.
        -The first argument is always the file name.
        -If there are more arguments, they are the height and width;
        -both must be present, or substituted with an underscore.
        -Replacing a dimension argument with the underscore parameter
        -preserves the aspect ratio of the image when scaling.
        -
        -	.image images/betsy.jpg 100 200
        -
        -	.image images/janet.jpg _ 300
        -
        -video:
        -
        -The template uses the function "video" to inject video files.
        -
        -The syntax is simple: 2 or 4 space-separated arguments.
        -The first argument is always the file name.
        -The second argument is always the file content-type.
        -If there are more arguments, they are the height and width;
        -both must be present, or substituted with an underscore.
        -Replacing a dimension argument with the underscore parameter
        -preserves the aspect ratio of the video when scaling.
        -
        -	.video videos/evangeline.mp4 video/mp4 400 600
        -
        -	.video videos/mabel.ogg video/ogg 500 _
        -
        -background:
        -
        -The template uses the function "background" to set the background image for
        -a slide.  The only argument is the file name of the image.
        -
        -	.background images/susan.jpg
        -
        -caption:
        -
        -The template uses the function "caption" to inject figure captions.
        -
        -The text after ".caption" is embedded in a figcaption element after
        -processing styling and links as in standard text lines.
        -
        -	.caption _Gopher_ by [[http://www.reneefrench.com][Renée French]]
        -
        -iframe:
        -
        -The function "iframe" injects iframes (pages inside pages).
        -Its syntax is the same as that of image.
        -
        -html:
        -
        -The function html includes the contents of the specified file as
        -unescaped HTML. This is useful for including custom HTML elements
        -that cannot be created using only the slide format.
        -It is your responsibility to make sure the included HTML is valid and safe.
        -
        -	.html file.html
        -
        -Presenter notes:
        -
        -Presenter notes may be enabled by appending the "-notes" flag when you run
        -your "present" binary.
        -
        -This will allow you to open a second window by pressing 'N' from your browser
        -displaying your slides. The second window is completely synced with your main
        -window, except that presenter notes are only visible on the second window.
        -
        -Lines that begin with ": " are treated as presenter notes.
        -
        -	* Title of slide
        -
        -	Some Text
        -
        -	: Presenter notes (first paragraph)
        -	: Presenter notes (subsequent paragraph(s))
        -
        -Notes may appear anywhere within the slide text. For example:
        -
        -	* Title of slide
        -
        -	: Presenter notes (first paragraph)
        -
        -	Some Text
        -
        -	: Presenter notes (subsequent paragraph(s))
        -
        -This has the same result as the example above.
        -
        -*/
        -package present // import "golang.org/x/tools/present"
        diff --git a/vendor/golang.org/x/tools/present/html.go b/vendor/golang.org/x/tools/present/html.go
        deleted file mode 100644
        index cca90ef4a..000000000
        --- a/vendor/golang.org/x/tools/present/html.go
        +++ /dev/null
        @@ -1,31 +0,0 @@
        -package present
        -
        -import (
        -	"errors"
        -	"html/template"
        -	"path/filepath"
        -	"strings"
        -)
        -
        -func init() {
        -	Register("html", parseHTML)
        -}
        -
        -func parseHTML(ctx *Context, fileName string, lineno int, text string) (Elem, error) {
        -	p := strings.Fields(text)
        -	if len(p) != 2 {
        -		return nil, errors.New("invalid .html args")
        -	}
        -	name := filepath.Join(filepath.Dir(fileName), p[1])
        -	b, err := ctx.ReadFile(name)
        -	if err != nil {
        -		return nil, err
        -	}
        -	return HTML{template.HTML(b)}, nil
        -}
        -
        -type HTML struct {
        -	template.HTML
        -}
        -
        -func (s HTML) TemplateName() string { return "html" }
        diff --git a/vendor/golang.org/x/tools/present/iframe.go b/vendor/golang.org/x/tools/present/iframe.go
        deleted file mode 100644
        index 057d22958..000000000
        --- a/vendor/golang.org/x/tools/present/iframe.go
        +++ /dev/null
        @@ -1,48 +0,0 @@
        -// Copyright 2013 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package present
        -
        -import (
        -	"fmt"
        -	"strings"
        -)
        -
        -func init() {
        -	Register("iframe", parseIframe)
        -}
        -
        -type Iframe struct {
        -	URL    string
        -	Width  int
        -	Height int
        -}
        -
        -func (i Iframe) TemplateName() string { return "iframe" }
        -
        -func parseIframe(ctx *Context, fileName string, lineno int, text string) (Elem, error) {
        -	args := strings.Fields(text)
        -	if len(args) < 2 {
        -		return nil, fmt.Errorf("incorrect iframe invocation: %q", text)
        -	}
        -	i := Iframe{URL: args[1]}
        -	a, err := parseArgs(fileName, lineno, args[2:])
        -	if err != nil {
        -		return nil, err
        -	}
        -	switch len(a) {
        -	case 0:
        -		// no size parameters
        -	case 2:
        -		if v, ok := a[0].(int); ok {
        -			i.Height = v
        -		}
        -		if v, ok := a[1].(int); ok {
        -			i.Width = v
        -		}
        -	default:
        -		return nil, fmt.Errorf("incorrect iframe invocation: %q", text)
        -	}
        -	return i, nil
        -}
        diff --git a/vendor/golang.org/x/tools/present/image.go b/vendor/golang.org/x/tools/present/image.go
        deleted file mode 100644
        index 84965cae5..000000000
        --- a/vendor/golang.org/x/tools/present/image.go
        +++ /dev/null
        @@ -1,53 +0,0 @@
        -// Copyright 2012 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package present
        -
        -import (
        -	"fmt"
        -	"strings"
        -)
        -
        -func init() {
        -	Register("image", parseImage)
        -}
        -
        -type Image struct {
        -	URL    string
        -	Width  int
        -	Height int
        -}
        -
        -func (i Image) TemplateName() string { return "image" }
        -
        -func parseImage(ctx *Context, fileName string, lineno int, text string) (Elem, error) {
        -	args := strings.Fields(text)
        -	if len(args) < 2 {
        -		return nil, fmt.Errorf("incorrect image invocation: %q", text)
        -	}
        -	img := Image{URL: args[1]}
        -	a, err := parseArgs(fileName, lineno, args[2:])
        -	if err != nil {
        -		return nil, err
        -	}
        -	switch len(a) {
        -	case 0:
        -		// no size parameters
        -	case 2:
        -		// If a parameter is empty (underscore) or invalid
        -		// leave the field set to zero. The "image" action
        -		// template will then omit that img tag attribute and
        -		// the browser will calculate the value to preserve
        -		// the aspect ratio.
        -		if v, ok := a[0].(int); ok {
        -			img.Height = v
        -		}
        -		if v, ok := a[1].(int); ok {
        -			img.Width = v
        -		}
        -	default:
        -		return nil, fmt.Errorf("incorrect image invocation: %q", text)
        -	}
        -	return img, nil
        -}
        diff --git a/vendor/golang.org/x/tools/present/link.go b/vendor/golang.org/x/tools/present/link.go
        deleted file mode 100644
        index 2aead352e..000000000
        --- a/vendor/golang.org/x/tools/present/link.go
        +++ /dev/null
        @@ -1,100 +0,0 @@
        -// Copyright 2012 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package present
        -
        -import (
        -	"fmt"
        -	"log"
        -	"net/url"
        -	"strings"
        -)
        -
        -func init() {
        -	Register("link", parseLink)
        -}
        -
        -type Link struct {
        -	URL   *url.URL
        -	Label string
        -}
        -
        -func (l Link) TemplateName() string { return "link" }
        -
        -func parseLink(ctx *Context, fileName string, lineno int, text string) (Elem, error) {
        -	args := strings.Fields(text)
        -	if len(args) < 2 {
        -		return nil, fmt.Errorf("link element must have at least 2 arguments")
        -	}
        -	url, err := url.Parse(args[1])
        -	if err != nil {
        -		return nil, err
        -	}
        -	label := ""
        -	if len(args) > 2 {
        -		label = strings.Join(args[2:], " ")
        -	} else {
        -		scheme := url.Scheme + "://"
        -		if url.Scheme == "mailto" {
        -			scheme = "mailto:"
        -		}
        -		label = strings.Replace(url.String(), scheme, "", 1)
        -	}
        -	return Link{url, label}, nil
        -}
        -
        -func renderLink(href, text string) string {
        -	text = font(text)
        -	if text == "" {
        -		text = href
        -	}
        -	// Open links in new window only when their url is absolute.
        -	target := "_blank"
        -	if u, err := url.Parse(href); err != nil {
        -		log.Println("renderLink parsing url:", err)
        -	} else if !u.IsAbs() || u.Scheme == "javascript" {
        -		target = "_self"
        -	}
        -
        -	return fmt.Sprintf(`%s`, href, target, text)
        -}
        -
        -// parseInlineLink parses an inline link at the start of s, and returns
        -// a rendered HTML link and the total length of the raw inline link.
        -// If no inline link is present, it returns all zeroes.
        -func parseInlineLink(s string) (link string, length int) {
        -	if !strings.HasPrefix(s, "[[") {
        -		return
        -	}
        -	end := strings.Index(s, "]]")
        -	if end == -1 {
        -		return
        -	}
        -	urlEnd := strings.Index(s, "]")
        -	rawURL := s[2:urlEnd]
        -	const badURLChars = `<>"{}|\^[] ` + "`" // per RFC2396 section 2.4.3
        -	if strings.ContainsAny(rawURL, badURLChars) {
        -		return
        -	}
        -	if urlEnd == end {
        -		simpleUrl := ""
        -		url, err := url.Parse(rawURL)
        -		if err == nil {
        -			// If the URL is http://foo.com, drop the http://
        -			// In other words, render [[http://golang.org]] as:
        -			//   golang.org
        -			if strings.HasPrefix(rawURL, url.Scheme+"://") {
        -				simpleUrl = strings.TrimPrefix(rawURL, url.Scheme+"://")
        -			} else if strings.HasPrefix(rawURL, url.Scheme+":") {
        -				simpleUrl = strings.TrimPrefix(rawURL, url.Scheme+":")
        -			}
        -		}
        -		return renderLink(rawURL, simpleUrl), end + 2
        -	}
        -	if s[urlEnd:urlEnd+2] != "][" {
        -		return
        -	}
        -	text := s[urlEnd+2 : end]
        -	return renderLink(rawURL, text), end + 2
        -}
        diff --git a/vendor/golang.org/x/tools/present/parse.go b/vendor/golang.org/x/tools/present/parse.go
        deleted file mode 100644
        index dd0f00b27..000000000
        --- a/vendor/golang.org/x/tools/present/parse.go
        +++ /dev/null
        @@ -1,568 +0,0 @@
        -// Copyright 2011 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package present
        -
        -import (
        -	"bufio"
        -	"bytes"
        -	"errors"
        -	"fmt"
        -	"html/template"
        -	"io"
        -	"io/ioutil"
        -	"log"
        -	"net/url"
        -	"regexp"
        -	"strings"
        -	"time"
        -	"unicode"
        -	"unicode/utf8"
        -)
        -
        -var (
        -	parsers = make(map[string]ParseFunc)
        -	funcs   = template.FuncMap{}
        -)
        -
        -// Template returns an empty template with the action functions in its FuncMap.
        -func Template() *template.Template {
        -	return template.New("").Funcs(funcs)
        -}
        -
        -// Render renders the doc to the given writer using the provided template.
        -func (d *Doc) Render(w io.Writer, t *template.Template) error {
        -	data := struct {
        -		*Doc
        -		Template     *template.Template
        -		PlayEnabled  bool
        -		NotesEnabled bool
        -	}{d, t, PlayEnabled, NotesEnabled}
        -	return t.ExecuteTemplate(w, "root", data)
        -}
        -
        -// Render renders the section to the given writer using the provided template.
        -func (s *Section) Render(w io.Writer, t *template.Template) error {
        -	data := struct {
        -		*Section
        -		Template    *template.Template
        -		PlayEnabled bool
        -	}{s, t, PlayEnabled}
        -	return t.ExecuteTemplate(w, "section", data)
        -}
        -
        -type ParseFunc func(ctx *Context, fileName string, lineNumber int, inputLine string) (Elem, error)
        -
        -// Register binds the named action, which does not begin with a period, to the
        -// specified parser to be invoked when the name, with a period, appears in the
        -// present input text.
        -func Register(name string, parser ParseFunc) {
        -	if len(name) == 0 || name[0] == ';' {
        -		panic("bad name in Register: " + name)
        -	}
        -	parsers["."+name] = parser
        -}
        -
        -// Doc represents an entire document.
        -type Doc struct {
        -	Title      string
        -	Subtitle   string
        -	Time       time.Time
        -	Authors    []Author
        -	TitleNotes []string
        -	Sections   []Section
        -	Tags       []string
        -}
        -
        -// Author represents the person who wrote and/or is presenting the document.
        -type Author struct {
        -	Elem []Elem
        -}
        -
        -// TextElem returns the first text elements of the author details.
        -// This is used to display the author' name, job title, and company
        -// without the contact details.
        -func (p *Author) TextElem() (elems []Elem) {
        -	for _, el := range p.Elem {
        -		if _, ok := el.(Text); !ok {
        -			break
        -		}
        -		elems = append(elems, el)
        -	}
        -	return
        -}
        -
        -// Section represents a section of a document (such as a presentation slide)
        -// comprising a title and a list of elements.
        -type Section struct {
        -	Number  []int
        -	Title   string
        -	Elem    []Elem
        -	Notes   []string
        -	Classes []string
        -	Styles  []string
        -}
        -
        -// HTMLAttributes for the section
        -func (s Section) HTMLAttributes() template.HTMLAttr {
        -	if len(s.Classes) == 0 && len(s.Styles) == 0 {
        -		return ""
        -	}
        -
        -	var class string
        -	if len(s.Classes) > 0 {
        -		class = fmt.Sprintf(`class=%q`, strings.Join(s.Classes, " "))
        -	}
        -	var style string
        -	if len(s.Styles) > 0 {
        -		style = fmt.Sprintf(`style=%q`, strings.Join(s.Styles, " "))
        -	}
        -	return template.HTMLAttr(strings.Join([]string{class, style}, " "))
        -}
        -
        -// Sections contained within the section.
        -func (s Section) Sections() (sections []Section) {
        -	for _, e := range s.Elem {
        -		if section, ok := e.(Section); ok {
        -			sections = append(sections, section)
        -		}
        -	}
        -	return
        -}
        -
        -// Level returns the level of the given section.
        -// The document title is level 1, main section 2, etc.
        -func (s Section) Level() int {
        -	return len(s.Number) + 1
        -}
        -
        -// FormattedNumber returns a string containing the concatenation of the
        -// numbers identifying a Section.
        -func (s Section) FormattedNumber() string {
        -	b := &bytes.Buffer{}
        -	for _, n := range s.Number {
        -		fmt.Fprintf(b, "%v.", n)
        -	}
        -	return b.String()
        -}
        -
        -func (s Section) TemplateName() string { return "section" }
        -
        -// Elem defines the interface for a present element. That is, something that
        -// can provide the name of the template used to render the element.
        -type Elem interface {
        -	TemplateName() string
        -}
        -
        -// renderElem implements the elem template function, used to render
        -// sub-templates.
        -func renderElem(t *template.Template, e Elem) (template.HTML, error) {
        -	var data interface{} = e
        -	if s, ok := e.(Section); ok {
        -		data = struct {
        -			Section
        -			Template *template.Template
        -		}{s, t}
        -	}
        -	return execTemplate(t, e.TemplateName(), data)
        -}
        -
        -// pageNum derives a page number from a section.
        -func pageNum(s Section, offset int) int {
        -	if len(s.Number) == 0 {
        -		return offset
        -	}
        -	return s.Number[0] + offset
        -}
        -
        -func init() {
        -	funcs["elem"] = renderElem
        -	funcs["pagenum"] = pageNum
        -}
        -
        -// execTemplate is a helper to execute a template and return the output as a
        -// template.HTML value.
        -func execTemplate(t *template.Template, name string, data interface{}) (template.HTML, error) {
        -	b := new(bytes.Buffer)
        -	err := t.ExecuteTemplate(b, name, data)
        -	if err != nil {
        -		return "", err
        -	}
        -	return template.HTML(b.String()), nil
        -}
        -
        -// Text represents an optionally preformatted paragraph.
        -type Text struct {
        -	Lines []string
        -	Pre   bool
        -}
        -
        -func (t Text) TemplateName() string { return "text" }
        -
        -// List represents a bulleted list.
        -type List struct {
        -	Bullet []string
        -}
        -
        -func (l List) TemplateName() string { return "list" }
        -
        -// Lines is a helper for parsing line-based input.
        -type Lines struct {
        -	line int // 0 indexed, so has 1-indexed number of last line returned
        -	text []string
        -}
        -
        -func readLines(r io.Reader) (*Lines, error) {
        -	var lines []string
        -	s := bufio.NewScanner(r)
        -	for s.Scan() {
        -		lines = append(lines, s.Text())
        -	}
        -	if err := s.Err(); err != nil {
        -		return nil, err
        -	}
        -	return &Lines{0, lines}, nil
        -}
        -
        -func (l *Lines) next() (text string, ok bool) {
        -	for {
        -		current := l.line
        -		l.line++
        -		if current >= len(l.text) {
        -			return "", false
        -		}
        -		text = l.text[current]
        -		// Lines starting with # are comments.
        -		if len(text) == 0 || text[0] != '#' {
        -			ok = true
        -			break
        -		}
        -	}
        -	return
        -}
        -
        -func (l *Lines) back() {
        -	l.line--
        -}
        -
        -func (l *Lines) nextNonEmpty() (text string, ok bool) {
        -	for {
        -		text, ok = l.next()
        -		if !ok {
        -			return
        -		}
        -		if len(text) > 0 {
        -			break
        -		}
        -	}
        -	return
        -}
        -
        -// A Context specifies the supporting context for parsing a presentation.
        -type Context struct {
        -	// ReadFile reads the file named by filename and returns the contents.
        -	ReadFile func(filename string) ([]byte, error)
        -}
        -
        -// ParseMode represents flags for the Parse function.
        -type ParseMode int
        -
        -const (
        -	// If set, parse only the title and subtitle.
        -	TitlesOnly ParseMode = 1
        -)
        -
        -// Parse parses a document from r.
        -func (ctx *Context) Parse(r io.Reader, name string, mode ParseMode) (*Doc, error) {
        -	doc := new(Doc)
        -	lines, err := readLines(r)
        -	if err != nil {
        -		return nil, err
        -	}
        -
        -	for i := lines.line; i < len(lines.text); i++ {
        -		if strings.HasPrefix(lines.text[i], "*") {
        -			break
        -		}
        -
        -		if isSpeakerNote(lines.text[i]) {
        -			doc.TitleNotes = append(doc.TitleNotes, lines.text[i][2:])
        -		}
        -	}
        -
        -	err = parseHeader(doc, lines)
        -	if err != nil {
        -		return nil, err
        -	}
        -	if mode&TitlesOnly != 0 {
        -		return doc, nil
        -	}
        -
        -	// Authors
        -	if doc.Authors, err = parseAuthors(lines); err != nil {
        -		return nil, err
        -	}
        -	// Sections
        -	if doc.Sections, err = parseSections(ctx, name, lines, []int{}); err != nil {
        -		return nil, err
        -	}
        -	return doc, nil
        -}
        -
        -// Parse parses a document from r. Parse reads assets used by the presentation
        -// from the file system using ioutil.ReadFile.
        -func Parse(r io.Reader, name string, mode ParseMode) (*Doc, error) {
        -	ctx := Context{ReadFile: ioutil.ReadFile}
        -	return ctx.Parse(r, name, mode)
        -}
        -
        -// isHeading matches any section heading.
        -var isHeading = regexp.MustCompile(`^\*+ `)
        -
        -// lesserHeading returns true if text is a heading of a lesser or equal level
        -// than that denoted by prefix.
        -func lesserHeading(text, prefix string) bool {
        -	return isHeading.MatchString(text) && !strings.HasPrefix(text, prefix+"*")
        -}
        -
        -// parseSections parses Sections from lines for the section level indicated by
        -// number (a nil number indicates the top level).
        -func parseSections(ctx *Context, name string, lines *Lines, number []int) ([]Section, error) {
        -	var sections []Section
        -	for i := 1; ; i++ {
        -		// Next non-empty line is title.
        -		text, ok := lines.nextNonEmpty()
        -		for ok && text == "" {
        -			text, ok = lines.next()
        -		}
        -		if !ok {
        -			break
        -		}
        -		prefix := strings.Repeat("*", len(number)+1)
        -		if !strings.HasPrefix(text, prefix+" ") {
        -			lines.back()
        -			break
        -		}
        -		section := Section{
        -			Number: append(append([]int{}, number...), i),
        -			Title:  text[len(prefix)+1:],
        -		}
        -		text, ok = lines.nextNonEmpty()
        -		for ok && !lesserHeading(text, prefix) {
        -			var e Elem
        -			r, _ := utf8.DecodeRuneInString(text)
        -			switch {
        -			case unicode.IsSpace(r):
        -				i := strings.IndexFunc(text, func(r rune) bool {
        -					return !unicode.IsSpace(r)
        -				})
        -				if i < 0 {
        -					break
        -				}
        -				indent := text[:i]
        -				var s []string
        -				for ok && (strings.HasPrefix(text, indent) || text == "") {
        -					if text != "" {
        -						text = text[i:]
        -					}
        -					s = append(s, text)
        -					text, ok = lines.next()
        -				}
        -				lines.back()
        -				pre := strings.Join(s, "\n")
        -				pre = strings.Replace(pre, "\t", "    ", -1) // browsers treat tabs badly
        -				pre = strings.TrimRightFunc(pre, unicode.IsSpace)
        -				e = Text{Lines: []string{pre}, Pre: true}
        -			case strings.HasPrefix(text, "- "):
        -				var b []string
        -				for ok && strings.HasPrefix(text, "- ") {
        -					b = append(b, text[2:])
        -					text, ok = lines.next()
        -				}
        -				lines.back()
        -				e = List{Bullet: b}
        -			case isSpeakerNote(text):
        -				section.Notes = append(section.Notes, text[2:])
        -			case strings.HasPrefix(text, prefix+"* "):
        -				lines.back()
        -				subsecs, err := parseSections(ctx, name, lines, section.Number)
        -				if err != nil {
        -					return nil, err
        -				}
        -				for _, ss := range subsecs {
        -					section.Elem = append(section.Elem, ss)
        -				}
        -			case strings.HasPrefix(text, "."):
        -				args := strings.Fields(text)
        -				if args[0] == ".background" {
        -					section.Classes = append(section.Classes, "background")
        -					section.Styles = append(section.Styles, "background-image: url('"+args[1]+"')")
        -					break
        -				}
        -				parser := parsers[args[0]]
        -				if parser == nil {
        -					return nil, fmt.Errorf("%s:%d: unknown command %q\n", name, lines.line, text)
        -				}
        -				t, err := parser(ctx, name, lines.line, text)
        -				if err != nil {
        -					return nil, err
        -				}
        -				e = t
        -			default:
        -				var l []string
        -				for ok && strings.TrimSpace(text) != "" {
        -					if text[0] == '.' { // Command breaks text block.
        -						lines.back()
        -						break
        -					}
        -					if strings.HasPrefix(text, `\.`) { // Backslash escapes initial period.
        -						text = text[1:]
        -					}
        -					l = append(l, text)
        -					text, ok = lines.next()
        -				}
        -				if len(l) > 0 {
        -					e = Text{Lines: l}
        -				}
        -			}
        -			if e != nil {
        -				section.Elem = append(section.Elem, e)
        -			}
        -			text, ok = lines.nextNonEmpty()
        -		}
        -		if isHeading.MatchString(text) {
        -			lines.back()
        -		}
        -		sections = append(sections, section)
        -	}
        -	return sections, nil
        -}
        -
        -func parseHeader(doc *Doc, lines *Lines) error {
        -	var ok bool
        -	// First non-empty line starts header.
        -	doc.Title, ok = lines.nextNonEmpty()
        -	if !ok {
        -		return errors.New("unexpected EOF; expected title")
        -	}
        -	for {
        -		text, ok := lines.next()
        -		if !ok {
        -			return errors.New("unexpected EOF")
        -		}
        -		if text == "" {
        -			break
        -		}
        -		if isSpeakerNote(text) {
        -			continue
        -		}
        -		const tagPrefix = "Tags:"
        -		if strings.HasPrefix(text, tagPrefix) {
        -			tags := strings.Split(text[len(tagPrefix):], ",")
        -			for i := range tags {
        -				tags[i] = strings.TrimSpace(tags[i])
        -			}
        -			doc.Tags = append(doc.Tags, tags...)
        -		} else if t, ok := parseTime(text); ok {
        -			doc.Time = t
        -		} else if doc.Subtitle == "" {
        -			doc.Subtitle = text
        -		} else {
        -			return fmt.Errorf("unexpected header line: %q", text)
        -		}
        -	}
        -	return nil
        -}
        -
        -func parseAuthors(lines *Lines) (authors []Author, err error) {
        -	// This grammar demarcates authors with blanks.
        -
        -	// Skip blank lines.
        -	if _, ok := lines.nextNonEmpty(); !ok {
        -		return nil, errors.New("unexpected EOF")
        -	}
        -	lines.back()
        -
        -	var a *Author
        -	for {
        -		text, ok := lines.next()
        -		if !ok {
        -			return nil, errors.New("unexpected EOF")
        -		}
        -
        -		// If we find a section heading, we're done.
        -		if strings.HasPrefix(text, "* ") {
        -			lines.back()
        -			break
        -		}
        -
        -		if isSpeakerNote(text) {
        -			continue
        -		}
        -
        -		// If we encounter a blank we're done with this author.
        -		if a != nil && len(text) == 0 {
        -			authors = append(authors, *a)
        -			a = nil
        -			continue
        -		}
        -		if a == nil {
        -			a = new(Author)
        -		}
        -
        -		// Parse the line. Those that
        -		// - begin with @ are twitter names,
        -		// - contain slashes are links, or
        -		// - contain an @ symbol are an email address.
        -		// The rest is just text.
        -		var el Elem
        -		switch {
        -		case strings.HasPrefix(text, "@"):
        -			el = parseURL("http://twitter.com/" + text[1:])
        -		case strings.Contains(text, ":"):
        -			el = parseURL(text)
        -		case strings.Contains(text, "@"):
        -			el = parseURL("mailto:" + text)
        -		}
        -		if l, ok := el.(Link); ok {
        -			l.Label = text
        -			el = l
        -		}
        -		if el == nil {
        -			el = Text{Lines: []string{text}}
        -		}
        -		a.Elem = append(a.Elem, el)
        -	}
        -	if a != nil {
        -		authors = append(authors, *a)
        -	}
        -	return authors, nil
        -}
        -
        -func parseURL(text string) Elem {
        -	u, err := url.Parse(text)
        -	if err != nil {
        -		log.Printf("Parse(%q): %v", text, err)
        -		return nil
        -	}
        -	return Link{URL: u}
        -}
        -
        -func parseTime(text string) (t time.Time, ok bool) {
        -	t, err := time.Parse("15:04 2 Jan 2006", text)
        -	if err == nil {
        -		return t, true
        -	}
        -	t, err = time.Parse("2 Jan 2006", text)
        -	if err == nil {
        -		// at 11am UTC it is the same date everywhere
        -		t = t.Add(time.Hour * 11)
        -		return t, true
        -	}
        -	return time.Time{}, false
        -}
        -
        -func isSpeakerNote(s string) bool {
        -	return strings.HasPrefix(s, ": ")
        -}
        diff --git a/vendor/golang.org/x/tools/present/style.go b/vendor/golang.org/x/tools/present/style.go
        deleted file mode 100644
        index e2c228e55..000000000
        --- a/vendor/golang.org/x/tools/present/style.go
        +++ /dev/null
        @@ -1,167 +0,0 @@
        -// Copyright 2012 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package present
        -
        -import (
        -	"bytes"
        -	"html"
        -	"html/template"
        -	"strings"
        -	"unicode"
        -	"unicode/utf8"
        -)
        -
        -/*
        -	Fonts are demarcated by an initial and final char bracketing a
        -	space-delimited word, plus possibly some terminal punctuation.
        -	The chars are
        -		_ for italic
        -		* for bold
        -		` (back quote) for fixed width.
        -	Inner appearances of the char become spaces. For instance,
        -		_this_is_italic_!
        -	becomes
        -		this is italic!
        -*/
        -
        -func init() {
        -	funcs["style"] = Style
        -}
        -
        -// Style returns s with HTML entities escaped and font indicators turned into
        -// HTML font tags.
        -func Style(s string) template.HTML {
        -	return template.HTML(font(html.EscapeString(s)))
        -}
        -
        -// font returns s with font indicators turned into HTML font tags.
        -func font(s string) string {
        -	if !strings.ContainsAny(s, "[`_*") {
        -		return s
        -	}
        -	words := split(s)
        -	var b bytes.Buffer
        -Word:
        -	for w, word := range words {
        -		if len(word) < 2 {
        -			continue Word
        -		}
        -		if link, _ := parseInlineLink(word); link != "" {
        -			words[w] = link
        -			continue Word
        -		}
        -		const marker = "_*`"
        -		// Initial punctuation is OK but must be peeled off.
        -		first := strings.IndexAny(word, marker)
        -		if first == -1 {
        -			continue Word
        -		}
        -		// Opening marker must be at the beginning of the token or else preceded by punctuation.
        -		if first != 0 {
        -			r, _ := utf8.DecodeLastRuneInString(word[:first])
        -			if !unicode.IsPunct(r) {
        -				continue Word
        -			}
        -		}
        -		open, word := word[:first], word[first:]
        -		char := word[0] // ASCII is OK.
        -		close := ""
        -		switch char {
        -		default:
        -			continue Word
        -		case '_':
        -			open += ""
        -			close = ""
        -		case '*':
        -			open += ""
        -			close = ""
        -		case '`':
        -			open += ""
        -			close = ""
        -		}
        -		// Closing marker must be at the end of the token or else followed by punctuation.
        -		last := strings.LastIndex(word, word[:1])
        -		if last == 0 {
        -			continue Word
        -		}
        -		if last+1 != len(word) {
        -			r, _ := utf8.DecodeRuneInString(word[last+1:])
        -			if !unicode.IsPunct(r) {
        -				continue Word
        -			}
        -		}
        -		head, tail := word[:last+1], word[last+1:]
        -		b.Reset()
        -		b.WriteString(open)
        -		var wid int
        -		for i := 1; i < len(head)-1; i += wid {
        -			var r rune
        -			r, wid = utf8.DecodeRuneInString(head[i:])
        -			if r != rune(char) {
        -				// Ordinary character.
        -				b.WriteRune(r)
        -				continue
        -			}
        -			if head[i+1] != char {
        -				// Inner char becomes space.
        -				b.WriteRune(' ')
        -				continue
        -			}
        -			// Doubled char becomes real char.
        -			// Not worth worrying about "_x__".
        -			b.WriteByte(char)
        -			wid++ // Consumed two chars, both ASCII.
        -		}
        -		b.WriteString(close) // Write closing tag.
        -		b.WriteString(tail)  // Restore trailing punctuation.
        -		words[w] = b.String()
        -	}
        -	return strings.Join(words, "")
        -}
        -
        -// split is like strings.Fields but also returns the runs of spaces
        -// and treats inline links as distinct words.
        -func split(s string) []string {
        -	var (
        -		words = make([]string, 0, 10)
        -		start = 0
        -	)
        -
        -	// appendWord appends the string s[start:end] to the words slice.
        -	// If the word contains the beginning of a link, the non-link portion
        -	// of the word and the entire link are appended as separate words,
        -	// and the start index is advanced to the end of the link.
        -	appendWord := func(end int) {
        -		if j := strings.Index(s[start:end], "[["); j > -1 {
        -			if _, l := parseInlineLink(s[start+j:]); l > 0 {
        -				// Append portion before link, if any.
        -				if j > 0 {
        -					words = append(words, s[start:start+j])
        -				}
        -				// Append link itself.
        -				words = append(words, s[start+j:start+j+l])
        -				// Advance start index to end of link.
        -				start = start + j + l
        -				return
        -			}
        -		}
        -		// No link; just add the word.
        -		words = append(words, s[start:end])
        -		start = end
        -	}
        -
        -	wasSpace := false
        -	for i, r := range s {
        -		isSpace := unicode.IsSpace(r)
        -		if i > start && isSpace != wasSpace {
        -			appendWord(i)
        -		}
        -		wasSpace = isSpace
        -	}
        -	for start < len(s) {
        -		appendWord(len(s))
        -	}
        -	return words
        -}
        diff --git a/vendor/golang.org/x/tools/present/video.go b/vendor/golang.org/x/tools/present/video.go
        deleted file mode 100644
        index 93d93502b..000000000
        --- a/vendor/golang.org/x/tools/present/video.go
        +++ /dev/null
        @@ -1,54 +0,0 @@
        -// Copyright 2016 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package present
        -
        -import (
        -	"fmt"
        -	"strings"
        -)
        -
        -func init() {
        -	Register("video", parseVideo)
        -}
        -
        -type Video struct {
        -	URL        string
        -	SourceType string
        -	Width      int
        -	Height     int
        -}
        -
        -func (v Video) TemplateName() string { return "video" }
        -
        -func parseVideo(ctx *Context, fileName string, lineno int, text string) (Elem, error) {
        -	args := strings.Fields(text)
        -	if len(args) < 3 {
        -		return nil, fmt.Errorf("incorrect video invocation: %q", text)
        -	}
        -	vid := Video{URL: args[1], SourceType: args[2]}
        -	a, err := parseArgs(fileName, lineno, args[3:])
        -	if err != nil {
        -		return nil, err
        -	}
        -	switch len(a) {
        -	case 0:
        -		// no size parameters
        -	case 2:
        -		// If a parameter is empty (underscore) or invalid
        -		// leave the field set to zero. The "video" action
        -		// template will then omit that vid tag attribute and
        -		// the browser will calculate the value to preserve
        -		// the aspect ratio.
        -		if v, ok := a[0].(int); ok {
        -			vid.Height = v
        -		}
        -		if v, ok := a[1].(int); ok {
        -			vid.Width = v
        -		}
        -	default:
        -		return nil, fmt.Errorf("incorrect video invocation: %q", text)
        -	}
        -	return vid, nil
        -}
        diff --git a/vendor/golang.org/x/tools/refactor/importgraph/graph.go b/vendor/golang.org/x/tools/refactor/importgraph/graph.go
        deleted file mode 100644
        index d2d8f098b..000000000
        --- a/vendor/golang.org/x/tools/refactor/importgraph/graph.go
        +++ /dev/null
        @@ -1,167 +0,0 @@
        -// Copyright 2014 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -// Package importgraph computes the forward and reverse import
        -// dependency graphs for all packages in a Go workspace.
        -package importgraph // import "golang.org/x/tools/refactor/importgraph"
        -
        -import (
        -	"go/build"
        -	"sync"
        -
        -	"golang.org/x/tools/go/buildutil"
        -)
        -
        -// A Graph is an import dependency graph, either forward or reverse.
        -//
        -// The graph maps each node (a package import path) to the set of its
        -// successors in the graph.  For a forward graph, this is the set of
        -// imported packages (prerequisites); for a reverse graph, it is the set
        -// of importing packages (clients).
        -//
        -// Graph construction inspects all imports in each package's directory,
        -// including those in _test.go files, so the resulting graph may be cyclic.
        -type Graph map[string]map[string]bool
        -
        -func (g Graph) addEdge(from, to string) {
        -	edges := g[from]
        -	if edges == nil {
        -		edges = make(map[string]bool)
        -		g[from] = edges
        -	}
        -	edges[to] = true
        -}
        -
        -// Search returns all the nodes of the graph reachable from
        -// any of the specified roots, by following edges forwards.
        -// Relationally, this is the reflexive transitive closure.
        -func (g Graph) Search(roots ...string) map[string]bool {
        -	seen := make(map[string]bool)
        -	var visit func(x string)
        -	visit = func(x string) {
        -		if !seen[x] {
        -			seen[x] = true
        -			for y := range g[x] {
        -				visit(y)
        -			}
        -		}
        -	}
        -	for _, root := range roots {
        -		visit(root)
        -	}
        -	return seen
        -}
        -
        -// Build scans the specified Go workspace and builds the forward and
        -// reverse import dependency graphs for all its packages.
        -// It also returns a mapping from canonical import paths to errors for packages
        -// whose loading was not entirely successful.
        -// A package may appear in the graph and in the errors mapping.
        -// All package paths are canonical and may contain "/vendor/".
        -func Build(ctxt *build.Context) (forward, reverse Graph, errors map[string]error) {
        -	type importEdge struct {
        -		from, to string
        -	}
        -	type pathError struct {
        -		path string
        -		err  error
        -	}
        -
        -	ch := make(chan interface{})
        -
        -	go func() {
        -		sema := make(chan int, 20) // I/O concurrency limiting semaphore
        -		var wg sync.WaitGroup
        -		buildutil.ForEachPackage(ctxt, func(path string, err error) {
        -			if err != nil {
        -				ch <- pathError{path, err}
        -				return
        -			}
        -
        -			wg.Add(1)
        -			go func() {
        -				defer wg.Done()
        -
        -				sema <- 1
        -				bp, err := ctxt.Import(path, "", 0)
        -				<-sema
        -
        -				if err != nil {
        -					if _, ok := err.(*build.NoGoError); ok {
        -						// empty directory is not an error
        -					} else {
        -						ch <- pathError{path, err}
        -					}
        -					// Even in error cases, Import usually returns a package.
        -				}
        -
        -				// absolutize resolves an import path relative
        -				// to the current package bp.
        -				// The absolute form may contain "vendor".
        -				//
        -				// The vendoring feature slows down Build by 3×.
        -				// Here are timings from a 1400 package workspace:
        -				//    1100ms: current code (with vendor check)
        -				//     880ms: with a nonblocking cache around ctxt.IsDir
        -				//     840ms: nonblocking cache with duplicate suppression
        -				//     340ms: original code (no vendor check)
        -				// TODO(adonovan): optimize, somehow.
        -				memo := make(map[string]string)
        -				absolutize := func(path string) string {
        -					canon, ok := memo[path]
        -					if !ok {
        -						sema <- 1
        -						bp2, _ := ctxt.Import(path, bp.Dir, build.FindOnly)
        -						<-sema
        -
        -						if bp2 != nil {
        -							canon = bp2.ImportPath
        -						} else {
        -							canon = path
        -						}
        -						memo[path] = canon
        -					}
        -					return canon
        -				}
        -
        -				if bp != nil {
        -					for _, imp := range bp.Imports {
        -						ch <- importEdge{path, absolutize(imp)}
        -					}
        -					for _, imp := range bp.TestImports {
        -						ch <- importEdge{path, absolutize(imp)}
        -					}
        -					for _, imp := range bp.XTestImports {
        -						ch <- importEdge{path, absolutize(imp)}
        -					}
        -				}
        -
        -			}()
        -		})
        -		wg.Wait()
        -		close(ch)
        -	}()
        -
        -	forward = make(Graph)
        -	reverse = make(Graph)
        -
        -	for e := range ch {
        -		switch e := e.(type) {
        -		case pathError:
        -			if errors == nil {
        -				errors = make(map[string]error)
        -			}
        -			errors[e.path] = e.err
        -
        -		case importEdge:
        -			if e.to == "C" {
        -				continue // "C" is fake
        -			}
        -			forward.addEdge(e.from, e.to)
        -			reverse.addEdge(e.to, e.from)
        -		}
        -	}
        -
        -	return forward, reverse, errors
        -}
        diff --git a/vendor/golang.org/x/tools/refactor/rename/check.go b/vendor/golang.org/x/tools/refactor/rename/check.go
        deleted file mode 100644
        index 838fc7b79..000000000
        --- a/vendor/golang.org/x/tools/refactor/rename/check.go
        +++ /dev/null
        @@ -1,858 +0,0 @@
        -// Copyright 2014 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package rename
        -
        -// This file defines the safety checks for each kind of renaming.
        -
        -import (
        -	"fmt"
        -	"go/ast"
        -	"go/token"
        -	"go/types"
        -
        -	"golang.org/x/tools/go/loader"
        -	"golang.org/x/tools/refactor/satisfy"
        -)
        -
        -// errorf reports an error (e.g. conflict) and prevents file modification.
        -func (r *renamer) errorf(pos token.Pos, format string, args ...interface{}) {
        -	r.hadConflicts = true
        -	reportError(r.iprog.Fset.Position(pos), fmt.Sprintf(format, args...))
        -}
        -
        -// check performs safety checks of the renaming of the 'from' object to r.to.
        -func (r *renamer) check(from types.Object) {
        -	if r.objsToUpdate[from] {
        -		return
        -	}
        -	r.objsToUpdate[from] = true
        -
        -	// NB: order of conditions is important.
        -	if from_, ok := from.(*types.PkgName); ok {
        -		r.checkInFileBlock(from_)
        -	} else if from_, ok := from.(*types.Label); ok {
        -		r.checkLabel(from_)
        -	} else if isPackageLevel(from) {
        -		r.checkInPackageBlock(from)
        -	} else if v, ok := from.(*types.Var); ok && v.IsField() {
        -		r.checkStructField(v)
        -	} else if f, ok := from.(*types.Func); ok && recv(f) != nil {
        -		r.checkMethod(f)
        -	} else if isLocal(from) {
        -		r.checkInLocalScope(from)
        -	} else {
        -		r.errorf(from.Pos(), "unexpected %s object %q (please report a bug)\n",
        -			objectKind(from), from)
        -	}
        -}
        -
        -// checkInFileBlock performs safety checks for renames of objects in the file block,
        -// i.e. imported package names.
        -func (r *renamer) checkInFileBlock(from *types.PkgName) {
        -	// Check import name is not "init".
        -	if r.to == "init" {
        -		r.errorf(from.Pos(), "%q is not a valid imported package name", r.to)
        -	}
        -
        -	// Check for conflicts between file and package block.
        -	if prev := from.Pkg().Scope().Lookup(r.to); prev != nil {
        -		r.errorf(from.Pos(), "renaming this %s %q to %q would conflict",
        -			objectKind(from), from.Name(), r.to)
        -		r.errorf(prev.Pos(), "\twith this package member %s",
        -			objectKind(prev))
        -		return // since checkInPackageBlock would report redundant errors
        -	}
        -
        -	// Check for conflicts in lexical scope.
        -	r.checkInLexicalScope(from, r.packages[from.Pkg()])
        -
        -	// Finally, modify ImportSpec syntax to add or remove the Name as needed.
        -	info, path, _ := r.iprog.PathEnclosingInterval(from.Pos(), from.Pos())
        -	if from.Imported().Name() == r.to {
        -		// ImportSpec.Name not needed
        -		path[1].(*ast.ImportSpec).Name = nil
        -	} else {
        -		// ImportSpec.Name needed
        -		if spec := path[1].(*ast.ImportSpec); spec.Name == nil {
        -			spec.Name = &ast.Ident{NamePos: spec.Path.Pos(), Name: r.to}
        -			info.Defs[spec.Name] = from
        -		}
        -	}
        -}
        -
        -// checkInPackageBlock performs safety checks for renames of
        -// func/var/const/type objects in the package block.
        -func (r *renamer) checkInPackageBlock(from types.Object) {
        -	// Check that there are no references to the name from another
        -	// package if the renaming would make it unexported.
        -	if ast.IsExported(from.Name()) && !ast.IsExported(r.to) {
        -		for pkg, info := range r.packages {
        -			if pkg == from.Pkg() {
        -				continue
        -			}
        -			if id := someUse(info, from); id != nil &&
        -				!r.checkExport(id, pkg, from) {
        -				break
        -			}
        -		}
        -	}
        -
        -	info := r.packages[from.Pkg()]
        -
        -	// Check that in the package block, "init" is a function, and never referenced.
        -	if r.to == "init" {
        -		kind := objectKind(from)
        -		if kind == "func" {
        -			// Reject if intra-package references to it exist.
        -			for id, obj := range info.Uses {
        -				if obj == from {
        -					r.errorf(from.Pos(),
        -						"renaming this func %q to %q would make it a package initializer",
        -						from.Name(), r.to)
        -					r.errorf(id.Pos(), "\tbut references to it exist")
        -					break
        -				}
        -			}
        -		} else {
        -			r.errorf(from.Pos(), "you cannot have a %s at package level named %q",
        -				kind, r.to)
        -		}
        -	}
        -
        -	// Check for conflicts between package block and all file blocks.
        -	for _, f := range info.Files {
        -		fileScope := info.Info.Scopes[f]
        -		b, prev := fileScope.LookupParent(r.to, token.NoPos)
        -		if b == fileScope {
        -			r.errorf(from.Pos(), "renaming this %s %q to %q would conflict",
        -				objectKind(from), from.Name(), r.to)
        -			r.errorf(prev.Pos(), "\twith this %s",
        -				objectKind(prev))
        -			return // since checkInPackageBlock would report redundant errors
        -		}
        -	}
        -
        -	// Check for conflicts in lexical scope.
        -	if from.Exported() {
        -		for _, info := range r.packages {
        -			r.checkInLexicalScope(from, info)
        -		}
        -	} else {
        -		r.checkInLexicalScope(from, info)
        -	}
        -}
        -
        -func (r *renamer) checkInLocalScope(from types.Object) {
        -	info := r.packages[from.Pkg()]
        -
        -	// Is this object an implicit local var for a type switch?
        -	// Each case has its own var, whose position is the decl of y,
        -	// but Ident in that decl does not appear in the Uses map.
        -	//
        -	//   switch y := x.(type) {	 // Defs[Ident(y)] is undefined
        -	//   case int:    print(y)       // Implicits[CaseClause(int)]    = Var(y_int)
        -	//   case string: print(y)       // Implicits[CaseClause(string)] = Var(y_string)
        -	//   }
        -	//
        -	var isCaseVar bool
        -	for syntax, obj := range info.Implicits {
        -		if _, ok := syntax.(*ast.CaseClause); ok && obj.Pos() == from.Pos() {
        -			isCaseVar = true
        -			r.check(obj)
        -		}
        -	}
        -
        -	r.checkInLexicalScope(from, info)
        -
        -	// Finally, if this was a type switch, change the variable y.
        -	if isCaseVar {
        -		_, path, _ := r.iprog.PathEnclosingInterval(from.Pos(), from.Pos())
        -		path[0].(*ast.Ident).Name = r.to // path is [Ident AssignStmt TypeSwitchStmt...]
        -	}
        -}
        -
        -// checkInLexicalScope performs safety checks that a renaming does not
        -// change the lexical reference structure of the specified package.
        -//
        -// For objects in lexical scope, there are three kinds of conflicts:
        -// same-, sub-, and super-block conflicts.  We will illustrate all three
        -// using this example:
        -//
        -//	var x int
        -//	var z int
        -//
        -//	func f(y int) {
        -//		print(x)
        -//		print(y)
        -//	}
        -//
        -// Renaming x to z encounters a SAME-BLOCK CONFLICT, because an object
        -// with the new name already exists, defined in the same lexical block
        -// as the old object.
        -//
        -// Renaming x to y encounters a SUB-BLOCK CONFLICT, because there exists
        -// a reference to x from within (what would become) a hole in its scope.
        -// The definition of y in an (inner) sub-block would cast a shadow in
        -// the scope of the renamed variable.
        -//
        -// Renaming y to x encounters a SUPER-BLOCK CONFLICT.  This is the
        -// converse situation: there is an existing definition of the new name
        -// (x) in an (enclosing) super-block, and the renaming would create a
        -// hole in its scope, within which there exist references to it.  The
        -// new name casts a shadow in scope of the existing definition of x in
        -// the super-block.
        -//
        -// Removing the old name (and all references to it) is always safe, and
        -// requires no checks.
        -//
        -func (r *renamer) checkInLexicalScope(from types.Object, info *loader.PackageInfo) {
        -	b := from.Parent() // the block defining the 'from' object
        -	if b != nil {
        -		toBlock, to := b.LookupParent(r.to, from.Parent().End())
        -		if toBlock == b {
        -			// same-block conflict
        -			r.errorf(from.Pos(), "renaming this %s %q to %q",
        -				objectKind(from), from.Name(), r.to)
        -			r.errorf(to.Pos(), "\tconflicts with %s in same block",
        -				objectKind(to))
        -			return
        -		} else if toBlock != nil {
        -			// Check for super-block conflict.
        -			// The name r.to is defined in a superblock.
        -			// Is that name referenced from within this block?
        -			forEachLexicalRef(info, to, func(id *ast.Ident, block *types.Scope) bool {
        -				_, obj := lexicalLookup(block, from.Name(), id.Pos())
        -				if obj == from {
        -					// super-block conflict
        -					r.errorf(from.Pos(), "renaming this %s %q to %q",
        -						objectKind(from), from.Name(), r.to)
        -					r.errorf(id.Pos(), "\twould shadow this reference")
        -					r.errorf(to.Pos(), "\tto the %s declared here",
        -						objectKind(to))
        -					return false // stop
        -				}
        -				return true
        -			})
        -		}
        -	}
        -
        -	// Check for sub-block conflict.
        -	// Is there an intervening definition of r.to between
        -	// the block defining 'from' and some reference to it?
        -	forEachLexicalRef(info, from, func(id *ast.Ident, block *types.Scope) bool {
        -		// Find the block that defines the found reference.
        -		// It may be an ancestor.
        -		fromBlock, _ := lexicalLookup(block, from.Name(), id.Pos())
        -
        -		// See what r.to would resolve to in the same scope.
        -		toBlock, to := lexicalLookup(block, r.to, id.Pos())
        -		if to != nil {
        -			// sub-block conflict
        -			if deeper(toBlock, fromBlock) {
        -				r.errorf(from.Pos(), "renaming this %s %q to %q",
        -					objectKind(from), from.Name(), r.to)
        -				r.errorf(id.Pos(), "\twould cause this reference to become shadowed")
        -				r.errorf(to.Pos(), "\tby this intervening %s definition",
        -					objectKind(to))
        -				return false // stop
        -			}
        -		}
        -		return true
        -	})
        -
        -	// Renaming a type that is used as an embedded field
        -	// requires renaming the field too. e.g.
        -	// 	type T int // if we rename this to U..
        -	// 	var s struct {T}
        -	// 	print(s.T) // ...this must change too
        -	if _, ok := from.(*types.TypeName); ok {
        -		for id, obj := range info.Uses {
        -			if obj == from {
        -				if field := info.Defs[id]; field != nil {
        -					r.check(field)
        -				}
        -			}
        -		}
        -	}
        -}
        -
        -// lexicalLookup is like (*types.Scope).LookupParent but respects the
        -// environment visible at pos.  It assumes the relative position
        -// information is correct with each file.
        -func lexicalLookup(block *types.Scope, name string, pos token.Pos) (*types.Scope, types.Object) {
        -	for b := block; b != nil; b = b.Parent() {
        -		obj := b.Lookup(name)
        -		// The scope of a package-level object is the entire package,
        -		// so ignore pos in that case.
        -		// No analogous clause is needed for file-level objects
        -		// since no reference can appear before an import decl.
        -		if obj != nil && (b == obj.Pkg().Scope() || obj.Pos() < pos) {
        -			return b, obj
        -		}
        -	}
        -	return nil, nil
        -}
        -
        -// deeper reports whether block x is lexically deeper than y.
        -func deeper(x, y *types.Scope) bool {
        -	if x == y || x == nil {
        -		return false
        -	} else if y == nil {
        -		return true
        -	} else {
        -		return deeper(x.Parent(), y.Parent())
        -	}
        -}
        -
        -// forEachLexicalRef calls fn(id, block) for each identifier id in package
        -// info that is a reference to obj in lexical scope.  block is the
        -// lexical block enclosing the reference.  If fn returns false the
        -// iteration is terminated and findLexicalRefs returns false.
        -func forEachLexicalRef(info *loader.PackageInfo, obj types.Object, fn func(id *ast.Ident, block *types.Scope) bool) bool {
        -	ok := true
        -	var stack []ast.Node
        -
        -	var visit func(n ast.Node) bool
        -	visit = func(n ast.Node) bool {
        -		if n == nil {
        -			stack = stack[:len(stack)-1] // pop
        -			return false
        -		}
        -		if !ok {
        -			return false // bail out
        -		}
        -
        -		stack = append(stack, n) // push
        -		switch n := n.(type) {
        -		case *ast.Ident:
        -			if info.Uses[n] == obj {
        -				block := enclosingBlock(&info.Info, stack)
        -				if !fn(n, block) {
        -					ok = false
        -				}
        -			}
        -			return visit(nil) // pop stack
        -
        -		case *ast.SelectorExpr:
        -			// don't visit n.Sel
        -			ast.Inspect(n.X, visit)
        -			return visit(nil) // pop stack, don't descend
        -
        -		case *ast.CompositeLit:
        -			// Handle recursion ourselves for struct literals
        -			// so we don't visit field identifiers.
        -			tv := info.Types[n]
        -			if _, ok := deref(tv.Type).Underlying().(*types.Struct); ok {
        -				if n.Type != nil {
        -					ast.Inspect(n.Type, visit)
        -				}
        -				for _, elt := range n.Elts {
        -					if kv, ok := elt.(*ast.KeyValueExpr); ok {
        -						ast.Inspect(kv.Value, visit)
        -					} else {
        -						ast.Inspect(elt, visit)
        -					}
        -				}
        -				return visit(nil) // pop stack, don't descend
        -			}
        -		}
        -		return true
        -	}
        -
        -	for _, f := range info.Files {
        -		ast.Inspect(f, visit)
        -		if len(stack) != 0 {
        -			panic(stack)
        -		}
        -		if !ok {
        -			break
        -		}
        -	}
        -	return ok
        -}
        -
        -// enclosingBlock returns the innermost block enclosing the specified
        -// AST node, specified in the form of a path from the root of the file,
        -// [file...n].
        -func enclosingBlock(info *types.Info, stack []ast.Node) *types.Scope {
        -	for i := range stack {
        -		n := stack[len(stack)-1-i]
        -		// For some reason, go/types always associates a
        -		// function's scope with its FuncType.
        -		// TODO(adonovan): feature or a bug?
        -		switch f := n.(type) {
        -		case *ast.FuncDecl:
        -			n = f.Type
        -		case *ast.FuncLit:
        -			n = f.Type
        -		}
        -		if b := info.Scopes[n]; b != nil {
        -			return b
        -		}
        -	}
        -	panic("no Scope for *ast.File")
        -}
        -
        -func (r *renamer) checkLabel(label *types.Label) {
        -	// Check there are no identical labels in the function's label block.
        -	// (Label blocks don't nest, so this is easy.)
        -	if prev := label.Parent().Lookup(r.to); prev != nil {
        -		r.errorf(label.Pos(), "renaming this label %q to %q", label.Name(), prev.Name())
        -		r.errorf(prev.Pos(), "\twould conflict with this one")
        -	}
        -}
        -
        -// checkStructField checks that the field renaming will not cause
        -// conflicts at its declaration, or ambiguity or changes to any selection.
        -func (r *renamer) checkStructField(from *types.Var) {
        -	// Check that the struct declaration is free of field conflicts,
        -	// and field/method conflicts.
        -
        -	// go/types offers no easy way to get from a field (or interface
        -	// method) to its declaring struct (or interface), so we must
        -	// ascend the AST.
        -	info, path, _ := r.iprog.PathEnclosingInterval(from.Pos(), from.Pos())
        -	// path matches this pattern:
        -	// [Ident SelectorExpr? StarExpr? Field FieldList StructType ParenExpr* ... File]
        -
        -	// Ascend to FieldList.
        -	var i int
        -	for {
        -		if _, ok := path[i].(*ast.FieldList); ok {
        -			break
        -		}
        -		i++
        -	}
        -	i++
        -	tStruct := path[i].(*ast.StructType)
        -	i++
        -	// Ascend past parens (unlikely).
        -	for {
        -		_, ok := path[i].(*ast.ParenExpr)
        -		if !ok {
        -			break
        -		}
        -		i++
        -	}
        -	if spec, ok := path[i].(*ast.TypeSpec); ok {
        -		// This struct is also a named type.
        -		// We must check for direct (non-promoted) field/field
        -		// and method/field conflicts.
        -		named := info.Defs[spec.Name].Type()
        -		prev, indices, _ := types.LookupFieldOrMethod(named, true, info.Pkg, r.to)
        -		if len(indices) == 1 {
        -			r.errorf(from.Pos(), "renaming this field %q to %q",
        -				from.Name(), r.to)
        -			r.errorf(prev.Pos(), "\twould conflict with this %s",
        -				objectKind(prev))
        -			return // skip checkSelections to avoid redundant errors
        -		}
        -	} else {
        -		// This struct is not a named type.
        -		// We need only check for direct (non-promoted) field/field conflicts.
        -		T := info.Types[tStruct].Type.Underlying().(*types.Struct)
        -		for i := 0; i < T.NumFields(); i++ {
        -			if prev := T.Field(i); prev.Name() == r.to {
        -				r.errorf(from.Pos(), "renaming this field %q to %q",
        -					from.Name(), r.to)
        -				r.errorf(prev.Pos(), "\twould conflict with this field")
        -				return // skip checkSelections to avoid redundant errors
        -			}
        -		}
        -	}
        -
        -	// Renaming an anonymous field requires renaming the type too. e.g.
        -	// 	print(s.T)       // if we rename T to U,
        -	// 	type T int       // this and
        -	// 	var s struct {T} // this must change too.
        -	if from.Anonymous() {
        -		if named, ok := from.Type().(*types.Named); ok {
        -			r.check(named.Obj())
        -		} else if named, ok := deref(from.Type()).(*types.Named); ok {
        -			r.check(named.Obj())
        -		}
        -	}
        -
        -	// Check integrity of existing (field and method) selections.
        -	r.checkSelections(from)
        -}
        -
        -// checkSelection checks that all uses and selections that resolve to
        -// the specified object would continue to do so after the renaming.
        -func (r *renamer) checkSelections(from types.Object) {
        -	for pkg, info := range r.packages {
        -		if id := someUse(info, from); id != nil {
        -			if !r.checkExport(id, pkg, from) {
        -				return
        -			}
        -		}
        -
        -		for syntax, sel := range info.Selections {
        -			// There may be extant selections of only the old
        -			// name or only the new name, so we must check both.
        -			// (If neither, the renaming is sound.)
        -			//
        -			// In both cases, we wish to compare the lengths
        -			// of the implicit field path (Selection.Index)
        -			// to see if the renaming would change it.
        -			//
        -			// If a selection that resolves to 'from', when renamed,
        -			// would yield a path of the same or shorter length,
        -			// this indicates ambiguity or a changed referent,
        -			// analogous to same- or sub-block lexical conflict.
        -			//
        -			// If a selection using the name 'to' would
        -			// yield a path of the same or shorter length,
        -			// this indicates ambiguity or shadowing,
        -			// analogous to same- or super-block lexical conflict.
        -
        -			// TODO(adonovan): fix: derive from Types[syntax.X].Mode
        -			// TODO(adonovan): test with pointer, value, addressable value.
        -			isAddressable := true
        -
        -			if sel.Obj() == from {
        -				if obj, indices, _ := types.LookupFieldOrMethod(sel.Recv(), isAddressable, from.Pkg(), r.to); obj != nil {
        -					// Renaming this existing selection of
        -					// 'from' may block access to an existing
        -					// type member named 'to'.
        -					delta := len(indices) - len(sel.Index())
        -					if delta > 0 {
        -						continue // no ambiguity
        -					}
        -					r.selectionConflict(from, delta, syntax, obj)
        -					return
        -				}
        -
        -			} else if sel.Obj().Name() == r.to {
        -				if obj, indices, _ := types.LookupFieldOrMethod(sel.Recv(), isAddressable, from.Pkg(), from.Name()); obj == from {
        -					// Renaming 'from' may cause this existing
        -					// selection of the name 'to' to change
        -					// its meaning.
        -					delta := len(indices) - len(sel.Index())
        -					if delta > 0 {
        -						continue //  no ambiguity
        -					}
        -					r.selectionConflict(from, -delta, syntax, sel.Obj())
        -					return
        -				}
        -			}
        -		}
        -	}
        -}
        -
        -func (r *renamer) selectionConflict(from types.Object, delta int, syntax *ast.SelectorExpr, obj types.Object) {
        -	r.errorf(from.Pos(), "renaming this %s %q to %q",
        -		objectKind(from), from.Name(), r.to)
        -
        -	switch {
        -	case delta < 0:
        -		// analogous to sub-block conflict
        -		r.errorf(syntax.Sel.Pos(),
        -			"\twould change the referent of this selection")
        -		r.errorf(obj.Pos(), "\tof this %s", objectKind(obj))
        -	case delta == 0:
        -		// analogous to same-block conflict
        -		r.errorf(syntax.Sel.Pos(),
        -			"\twould make this reference ambiguous")
        -		r.errorf(obj.Pos(), "\twith this %s", objectKind(obj))
        -	case delta > 0:
        -		// analogous to super-block conflict
        -		r.errorf(syntax.Sel.Pos(),
        -			"\twould shadow this selection")
        -		r.errorf(obj.Pos(), "\tof the %s declared here",
        -			objectKind(obj))
        -	}
        -}
        -
        -// checkMethod performs safety checks for renaming a method.
        -// There are three hazards:
        -// - declaration conflicts
        -// - selection ambiguity/changes
        -// - entailed renamings of assignable concrete/interface types.
        -//   We reject renamings initiated at concrete methods if it would
        -//   change the assignability relation.  For renamings of abstract
        -//   methods, we rename all methods transitively coupled to it via
        -//   assignability.
        -func (r *renamer) checkMethod(from *types.Func) {
        -	// e.g. error.Error
        -	if from.Pkg() == nil {
        -		r.errorf(from.Pos(), "you cannot rename built-in method %s", from)
        -		return
        -	}
        -
        -	// ASSIGNABILITY: We reject renamings of concrete methods that
        -	// would break a 'satisfy' constraint; but renamings of abstract
        -	// methods are allowed to proceed, and we rename affected
        -	// concrete and abstract methods as necessary.  It is the
        -	// initial method that determines the policy.
        -
        -	// Check for conflict at point of declaration.
        -	// Check to ensure preservation of assignability requirements.
        -	R := recv(from).Type()
        -	if isInterface(R) {
        -		// Abstract method
        -
        -		// declaration
        -		prev, _, _ := types.LookupFieldOrMethod(R, false, from.Pkg(), r.to)
        -		if prev != nil {
        -			r.errorf(from.Pos(), "renaming this interface method %q to %q",
        -				from.Name(), r.to)
        -			r.errorf(prev.Pos(), "\twould conflict with this method")
        -			return
        -		}
        -
        -		// Check all interfaces that embed this one for
        -		// declaration conflicts too.
        -		for _, info := range r.packages {
        -			// Start with named interface types (better errors)
        -			for _, obj := range info.Defs {
        -				if obj, ok := obj.(*types.TypeName); ok && isInterface(obj.Type()) {
        -					f, _, _ := types.LookupFieldOrMethod(
        -						obj.Type(), false, from.Pkg(), from.Name())
        -					if f == nil {
        -						continue
        -					}
        -					t, _, _ := types.LookupFieldOrMethod(
        -						obj.Type(), false, from.Pkg(), r.to)
        -					if t == nil {
        -						continue
        -					}
        -					r.errorf(from.Pos(), "renaming this interface method %q to %q",
        -						from.Name(), r.to)
        -					r.errorf(t.Pos(), "\twould conflict with this method")
        -					r.errorf(obj.Pos(), "\tin named interface type %q", obj.Name())
        -				}
        -			}
        -
        -			// Now look at all literal interface types (includes named ones again).
        -			for e, tv := range info.Types {
        -				if e, ok := e.(*ast.InterfaceType); ok {
        -					_ = e
        -					_ = tv.Type.(*types.Interface)
        -					// TODO(adonovan): implement same check as above.
        -				}
        -			}
        -		}
        -
        -		// assignability
        -		//
        -		// Find the set of concrete or abstract methods directly
        -		// coupled to abstract method 'from' by some
        -		// satisfy.Constraint, and rename them too.
        -		for key := range r.satisfy() {
        -			// key = (lhs, rhs) where lhs is always an interface.
        -
        -			lsel := r.msets.MethodSet(key.LHS).Lookup(from.Pkg(), from.Name())
        -			if lsel == nil {
        -				continue
        -			}
        -			rmethods := r.msets.MethodSet(key.RHS)
        -			rsel := rmethods.Lookup(from.Pkg(), from.Name())
        -			if rsel == nil {
        -				continue
        -			}
        -
        -			// If both sides have a method of this name,
        -			// and one of them is m, the other must be coupled.
        -			var coupled *types.Func
        -			switch from {
        -			case lsel.Obj():
        -				coupled = rsel.Obj().(*types.Func)
        -			case rsel.Obj():
        -				coupled = lsel.Obj().(*types.Func)
        -			default:
        -				continue
        -			}
        -
        -			// We must treat concrete-to-interface
        -			// constraints like an implicit selection C.f of
        -			// each interface method I.f, and check that the
        -			// renaming leaves the selection unchanged and
        -			// unambiguous.
        -			//
        -			// Fun fact: the implicit selection of C.f
        -			// 	type I interface{f()}
        -			// 	type C struct{I}
        -			// 	func (C) g()
        -			//      var _ I = C{} // here
        -			// yields abstract method I.f.  This can make error
        -			// messages less than obvious.
        -			//
        -			if !isInterface(key.RHS) {
        -				// The logic below was derived from checkSelections.
        -
        -				rtosel := rmethods.Lookup(from.Pkg(), r.to)
        -				if rtosel != nil {
        -					rto := rtosel.Obj().(*types.Func)
        -					delta := len(rsel.Index()) - len(rtosel.Index())
        -					if delta < 0 {
        -						continue // no ambiguity
        -					}
        -
        -					// TODO(adonovan): record the constraint's position.
        -					keyPos := token.NoPos
        -
        -					r.errorf(from.Pos(), "renaming this method %q to %q",
        -						from.Name(), r.to)
        -					if delta == 0 {
        -						// analogous to same-block conflict
        -						r.errorf(keyPos, "\twould make the %s method of %s invoked via interface %s ambiguous",
        -							r.to, key.RHS, key.LHS)
        -						r.errorf(rto.Pos(), "\twith (%s).%s",
        -							recv(rto).Type(), r.to)
        -					} else {
        -						// analogous to super-block conflict
        -						r.errorf(keyPos, "\twould change the %s method of %s invoked via interface %s",
        -							r.to, key.RHS, key.LHS)
        -						r.errorf(coupled.Pos(), "\tfrom (%s).%s",
        -							recv(coupled).Type(), r.to)
        -						r.errorf(rto.Pos(), "\tto (%s).%s",
        -							recv(rto).Type(), r.to)
        -					}
        -					return // one error is enough
        -				}
        -			}
        -
        -			if !r.changeMethods {
        -				// This should be unreachable.
        -				r.errorf(from.Pos(), "internal error: during renaming of abstract method %s", from)
        -				r.errorf(coupled.Pos(), "\tchangedMethods=false, coupled method=%s", coupled)
        -				r.errorf(from.Pos(), "\tPlease file a bug report")
        -				return
        -			}
        -
        -			// Rename the coupled method to preserve assignability.
        -			r.check(coupled)
        -		}
        -	} else {
        -		// Concrete method
        -
        -		// declaration
        -		prev, indices, _ := types.LookupFieldOrMethod(R, true, from.Pkg(), r.to)
        -		if prev != nil && len(indices) == 1 {
        -			r.errorf(from.Pos(), "renaming this method %q to %q",
        -				from.Name(), r.to)
        -			r.errorf(prev.Pos(), "\twould conflict with this %s",
        -				objectKind(prev))
        -			return
        -		}
        -
        -		// assignability
        -		//
        -		// Find the set of abstract methods coupled to concrete
        -		// method 'from' by some satisfy.Constraint, and rename
        -		// them too.
        -		//
        -		// Coupling may be indirect, e.g. I.f <-> C.f via type D.
        -		//
        -		// 	type I interface {f()}
        -		//	type C int
        -		//	type (C) f()
        -		//	type D struct{C}
        -		//	var _ I = D{}
        -		//
        -		for key := range r.satisfy() {
        -			// key = (lhs, rhs) where lhs is always an interface.
        -			if isInterface(key.RHS) {
        -				continue
        -			}
        -			rsel := r.msets.MethodSet(key.RHS).Lookup(from.Pkg(), from.Name())
        -			if rsel == nil || rsel.Obj() != from {
        -				continue // rhs does not have the method
        -			}
        -			lsel := r.msets.MethodSet(key.LHS).Lookup(from.Pkg(), from.Name())
        -			if lsel == nil {
        -				continue
        -			}
        -			imeth := lsel.Obj().(*types.Func)
        -
        -			// imeth is the abstract method (e.g. I.f)
        -			// and key.RHS is the concrete coupling type (e.g. D).
        -			if !r.changeMethods {
        -				r.errorf(from.Pos(), "renaming this method %q to %q",
        -					from.Name(), r.to)
        -				var pos token.Pos
        -				var iface string
        -
        -				I := recv(imeth).Type()
        -				if named, ok := I.(*types.Named); ok {
        -					pos = named.Obj().Pos()
        -					iface = "interface " + named.Obj().Name()
        -				} else {
        -					pos = from.Pos()
        -					iface = I.String()
        -				}
        -				r.errorf(pos, "\twould make %s no longer assignable to %s",
        -					key.RHS, iface)
        -				r.errorf(imeth.Pos(), "\t(rename %s.%s if you intend to change both types)",
        -					I, from.Name())
        -				return // one error is enough
        -			}
        -
        -			// Rename the coupled interface method to preserve assignability.
        -			r.check(imeth)
        -		}
        -	}
        -
        -	// Check integrity of existing (field and method) selections.
        -	// We skip this if there were errors above, to avoid redundant errors.
        -	r.checkSelections(from)
        -}
        -
        -func (r *renamer) checkExport(id *ast.Ident, pkg *types.Package, from types.Object) bool {
        -	// Reject cross-package references if r.to is unexported.
        -	// (Such references may be qualified identifiers or field/method
        -	// selections.)
        -	if !ast.IsExported(r.to) && pkg != from.Pkg() {
        -		r.errorf(from.Pos(),
        -			"renaming this %s %q to %q would make it unexported",
        -			objectKind(from), from.Name(), r.to)
        -		r.errorf(id.Pos(), "\tbreaking references from packages such as %q",
        -			pkg.Path())
        -		return false
        -	}
        -	return true
        -}
        -
        -// satisfy returns the set of interface satisfaction constraints.
        -func (r *renamer) satisfy() map[satisfy.Constraint]bool {
        -	if r.satisfyConstraints == nil {
        -		// Compute on demand: it's expensive.
        -		var f satisfy.Finder
        -		for _, info := range r.packages {
        -			f.Find(&info.Info, info.Files)
        -		}
        -		r.satisfyConstraints = f.Result
        -	}
        -	return r.satisfyConstraints
        -}
        -
        -// -- helpers ----------------------------------------------------------
        -
        -// recv returns the method's receiver.
        -func recv(meth *types.Func) *types.Var {
        -	return meth.Type().(*types.Signature).Recv()
        -}
        -
        -// someUse returns an arbitrary use of obj within info.
        -func someUse(info *loader.PackageInfo, obj types.Object) *ast.Ident {
        -	for id, o := range info.Uses {
        -		if o == obj {
        -			return id
        -		}
        -	}
        -	return nil
        -}
        -
        -// -- Plundered from golang.org/x/tools/go/ssa -----------------
        -
        -func isInterface(T types.Type) bool { return types.IsInterface(T) }
        -
        -func deref(typ types.Type) types.Type {
        -	if p, _ := typ.(*types.Pointer); p != nil {
        -		return p.Elem()
        -	}
        -	return typ
        -}
        diff --git a/vendor/golang.org/x/tools/refactor/rename/mvpkg.go b/vendor/golang.org/x/tools/refactor/rename/mvpkg.go
        deleted file mode 100644
        index 91c00ff14..000000000
        --- a/vendor/golang.org/x/tools/refactor/rename/mvpkg.go
        +++ /dev/null
        @@ -1,365 +0,0 @@
        -// Copyright 2015 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// licence that can be found in the LICENSE file.
        -
        -// This file contains the implementation of the 'gomvpkg' command
        -// whose main function is in golang.org/x/tools/cmd/gomvpkg.
        -
        -package rename
        -
        -// TODO(matloob):
        -// - think about what happens if the package is moving across version control systems.
        -// - dot imports are not supported. Make sure it's clearly documented.
        -
        -import (
        -	"bytes"
        -	"fmt"
        -	"go/ast"
        -	"go/build"
        -	"go/format"
        -	"go/token"
        -	"log"
        -	"os"
        -	"os/exec"
        -	"path"
        -	"path/filepath"
        -	"regexp"
        -	"runtime"
        -	"strconv"
        -	"strings"
        -	"text/template"
        -
        -	"golang.org/x/tools/go/buildutil"
        -	"golang.org/x/tools/go/loader"
        -	"golang.org/x/tools/refactor/importgraph"
        -)
        -
        -// Move, given a package path and a destination package path, will try
        -// to move the given package to the new path. The Move function will
        -// first check for any conflicts preventing the move, such as a
        -// package already existing at the destination package path. If the
        -// move can proceed, it builds an import graph to find all imports of
        -// the packages whose paths need to be renamed. This includes uses of
        -// the subpackages of the package to be moved as those packages will
        -// also need to be moved. It then renames all imports to point to the
        -// new paths, and then moves the packages to their new paths.
        -func Move(ctxt *build.Context, from, to, moveTmpl string) error {
        -	srcDir, err := srcDir(ctxt, from)
        -	if err != nil {
        -		return err
        -	}
        -
        -	// This should be the only place in the program that constructs
        -	// file paths.
        -	fromDir := buildutil.JoinPath(ctxt, srcDir, filepath.FromSlash(from))
        -	toDir := buildutil.JoinPath(ctxt, srcDir, filepath.FromSlash(to))
        -	toParent := filepath.Dir(toDir)
        -	if !buildutil.IsDir(ctxt, toParent) {
        -		return fmt.Errorf("parent directory does not exist for path %s", toDir)
        -	}
        -
        -	// Build the import graph and figure out which packages to update.
        -	_, rev, errors := importgraph.Build(ctxt)
        -	if len(errors) > 0 {
        -		// With a large GOPATH tree, errors are inevitable.
        -		// Report them but proceed.
        -		fmt.Fprintf(os.Stderr, "While scanning Go workspace:\n")
        -		for path, err := range errors {
        -			fmt.Fprintf(os.Stderr, "Package %q: %s.\n", path, err)
        -		}
        -	}
        -
        -	// Determine the affected packages---the set of packages whose import
        -	// statements need updating.
        -	affectedPackages := map[string]bool{from: true}
        -	destinations := make(map[string]string) // maps old import path to new import path
        -	for pkg := range subpackages(ctxt, srcDir, from) {
        -		for r := range rev[pkg] {
        -			affectedPackages[r] = true
        -		}
        -		destinations[pkg] = strings.Replace(pkg, from, to, 1)
        -	}
        -
        -	// Load all the affected packages.
        -	iprog, err := loadProgram(ctxt, affectedPackages)
        -	if err != nil {
        -		return err
        -	}
        -
        -	// Prepare the move command, if one was supplied.
        -	var cmd string
        -	if moveTmpl != "" {
        -		if cmd, err = moveCmd(moveTmpl, fromDir, toDir); err != nil {
        -			return err
        -		}
        -	}
        -
        -	m := mover{
        -		ctxt:             ctxt,
        -		rev:              rev,
        -		iprog:            iprog,
        -		from:             from,
        -		to:               to,
        -		fromDir:          fromDir,
        -		toDir:            toDir,
        -		affectedPackages: affectedPackages,
        -		destinations:     destinations,
        -		cmd:              cmd,
        -	}
        -
        -	if err := m.checkValid(); err != nil {
        -		return err
        -	}
        -
        -	m.move()
        -
        -	return nil
        -}
        -
        -// srcDir returns the absolute path of the srcdir containing pkg.
        -func srcDir(ctxt *build.Context, pkg string) (string, error) {
        -	for _, srcDir := range ctxt.SrcDirs() {
        -		path := buildutil.JoinPath(ctxt, srcDir, pkg)
        -		if buildutil.IsDir(ctxt, path) {
        -			return srcDir, nil
        -		}
        -	}
        -	return "", fmt.Errorf("src dir not found for package: %s", pkg)
        -}
        -
        -// subpackages returns the set of packages in the given srcDir whose
        -// import path equals to root, or has "root/" as the prefix.
        -func subpackages(ctxt *build.Context, srcDir string, root string) map[string]bool {
        -	var subs = make(map[string]bool)
        -	buildutil.ForEachPackage(ctxt, func(pkg string, err error) {
        -		if err != nil {
        -			log.Fatalf("unexpected error in ForEachPackage: %v", err)
        -		}
        -
        -		// Only process the package root, or a sub-package of it.
        -		if !(strings.HasPrefix(pkg, root) &&
        -			(len(pkg) == len(root) || pkg[len(root)] == '/')) {
        -			return
        -		}
        -
        -		p, err := ctxt.Import(pkg, "", build.FindOnly)
        -		if err != nil {
        -			log.Fatalf("unexpected: package %s can not be located by build context: %s", pkg, err)
        -		}
        -		if p.SrcRoot == "" {
        -			log.Fatalf("unexpected: could not determine srcDir for package %s: %s", pkg, err)
        -		}
        -		if p.SrcRoot != srcDir {
        -			return
        -		}
        -
        -		subs[pkg] = true
        -	})
        -	return subs
        -}
        -
        -type mover struct {
        -	// iprog contains all packages whose contents need to be updated
        -	// with new package names or import paths.
        -	iprog *loader.Program
        -	ctxt  *build.Context
        -	// rev is the reverse import graph.
        -	rev importgraph.Graph
        -	// from and to are the source and destination import
        -	// paths. fromDir and toDir are the source and destination
        -	// absolute paths that package source files will be moved between.
        -	from, to, fromDir, toDir string
        -	// affectedPackages is the set of all packages whose contents need
        -	// to be updated to reflect new package names or import paths.
        -	affectedPackages map[string]bool
        -	// destinations maps each subpackage to be moved to its
        -	// destination path.
        -	destinations map[string]string
        -	// cmd, if not empty, will be executed to move fromDir to toDir.
        -	cmd string
        -}
        -
        -func (m *mover) checkValid() error {
        -	const prefix = "invalid move destination"
        -
        -	match, err := regexp.MatchString("^[_\\pL][_\\pL\\p{Nd}]*$", path.Base(m.to))
        -	if err != nil {
        -		panic("regexp.MatchString failed")
        -	}
        -	if !match {
        -		return fmt.Errorf("%s: %s; gomvpkg does not support move destinations "+
        -			"whose base names are not valid go identifiers", prefix, m.to)
        -	}
        -
        -	if buildutil.FileExists(m.ctxt, m.toDir) {
        -		return fmt.Errorf("%s: %s conflicts with file %s", prefix, m.to, m.toDir)
        -	}
        -	if buildutil.IsDir(m.ctxt, m.toDir) {
        -		return fmt.Errorf("%s: %s conflicts with directory %s", prefix, m.to, m.toDir)
        -	}
        -
        -	for _, toSubPkg := range m.destinations {
        -		if _, err := m.ctxt.Import(toSubPkg, "", build.FindOnly); err == nil {
        -			return fmt.Errorf("%s: %s; package or subpackage %s already exists",
        -				prefix, m.to, toSubPkg)
        -		}
        -	}
        -
        -	return nil
        -}
        -
        -// moveCmd produces the version control move command used to move fromDir to toDir by
        -// executing the given template.
        -func moveCmd(moveTmpl, fromDir, toDir string) (string, error) {
        -	tmpl, err := template.New("movecmd").Parse(moveTmpl)
        -	if err != nil {
        -		return "", err
        -	}
        -
        -	var buf bytes.Buffer
        -	err = tmpl.Execute(&buf, struct {
        -		Src string
        -		Dst string
        -	}{fromDir, toDir})
        -	return buf.String(), err
        -}
        -
        -func (m *mover) move() error {
        -	filesToUpdate := make(map[*ast.File]bool)
        -
        -	// Change the moved package's "package" declaration to its new base name.
        -	pkg, ok := m.iprog.Imported[m.from]
        -	if !ok {
        -		log.Fatalf("unexpected: package %s is not in import map", m.from)
        -	}
        -	newName := filepath.Base(m.to)
        -	for _, f := range pkg.Files {
        -		// Update all import comments.
        -		for _, cg := range f.Comments {
        -			c := cg.List[0]
        -			if c.Slash >= f.Name.End() &&
        -				sameLine(m.iprog.Fset, c.Slash, f.Name.End()) &&
        -				(f.Decls == nil || c.Slash < f.Decls[0].Pos()) {
        -				if strings.HasPrefix(c.Text, `// import "`) {
        -					c.Text = `// import "` + m.to + `"`
        -					break
        -				}
        -				if strings.HasPrefix(c.Text, `/* import "`) {
        -					c.Text = `/* import "` + m.to + `" */`
        -					break
        -				}
        -			}
        -		}
        -		f.Name.Name = newName // change package decl
        -		filesToUpdate[f] = true
        -	}
        -
        -	// Look through the external test packages (m.iprog.Created contains the external test packages).
        -	for _, info := range m.iprog.Created {
        -		// Change the "package" declaration of the external test package.
        -		if info.Pkg.Path() == m.from+"_test" {
        -			for _, f := range info.Files {
        -				f.Name.Name = newName + "_test" // change package decl
        -				filesToUpdate[f] = true
        -			}
        -		}
        -
        -		// Mark all the loaded external test packages, which import the "from" package,
        -		// as affected packages and update the imports.
        -		for _, imp := range info.Pkg.Imports() {
        -			if imp.Path() == m.from {
        -				m.affectedPackages[info.Pkg.Path()] = true
        -				m.iprog.Imported[info.Pkg.Path()] = info
        -				if err := importName(m.iprog, info, m.from, path.Base(m.from), newName); err != nil {
        -					return err
        -				}
        -			}
        -		}
        -	}
        -
        -	// Update imports of that package to use the new import name.
        -	// None of the subpackages will change their name---only the from package
        -	// itself will.
        -	for p := range m.rev[m.from] {
        -		if err := importName(m.iprog, m.iprog.Imported[p], m.from, path.Base(m.from), newName); err != nil {
        -			return err
        -		}
        -	}
        -
        -	// Update import paths for all imports by affected packages.
        -	for ap := range m.affectedPackages {
        -		info, ok := m.iprog.Imported[ap]
        -		if !ok {
        -			log.Fatalf("unexpected: package %s is not in import map", ap)
        -		}
        -		for _, f := range info.Files {
        -			for _, imp := range f.Imports {
        -				importPath, _ := strconv.Unquote(imp.Path.Value)
        -				if newPath, ok := m.destinations[importPath]; ok {
        -					imp.Path.Value = strconv.Quote(newPath)
        -
        -					oldName := path.Base(importPath)
        -					if imp.Name != nil {
        -						oldName = imp.Name.Name
        -					}
        -
        -					newName := path.Base(newPath)
        -					if imp.Name == nil && oldName != newName {
        -						imp.Name = ast.NewIdent(oldName)
        -					} else if imp.Name == nil || imp.Name.Name == newName {
        -						imp.Name = nil
        -					}
        -					filesToUpdate[f] = true
        -				}
        -			}
        -		}
        -	}
        -
        -	for f := range filesToUpdate {
        -		var buf bytes.Buffer
        -		if err := format.Node(&buf, m.iprog.Fset, f); err != nil {
        -			log.Printf("failed to pretty-print syntax tree: %v", err)
        -			continue
        -		}
        -		tokenFile := m.iprog.Fset.File(f.Pos())
        -		writeFile(tokenFile.Name(), buf.Bytes())
        -	}
        -
        -	// Move the directories.
        -	// If either the fromDir or toDir are contained under version control it is
        -	// the user's responsibility to provide a custom move command that updates
        -	// version control to reflect the move.
        -	// TODO(matloob): If the parent directory of toDir does not exist, create it.
        -	//      For now, it's required that it does exist.
        -
        -	if m.cmd != "" {
        -		// TODO(matloob): Verify that the windows and plan9 cases are correct.
        -		var cmd *exec.Cmd
        -		switch runtime.GOOS {
        -		case "windows":
        -			cmd = exec.Command("cmd", "/c", m.cmd)
        -		case "plan9":
        -			cmd = exec.Command("rc", "-c", m.cmd)
        -		default:
        -			cmd = exec.Command("sh", "-c", m.cmd)
        -		}
        -		cmd.Stderr = os.Stderr
        -		cmd.Stdout = os.Stdout
        -		if err := cmd.Run(); err != nil {
        -			return fmt.Errorf("version control system's move command failed: %v", err)
        -		}
        -
        -		return nil
        -	}
        -
        -	return moveDirectory(m.fromDir, m.toDir)
        -}
        -
        -// sameLine reports whether two positions in the same file are on the same line.
        -func sameLine(fset *token.FileSet, x, y token.Pos) bool {
        -	return fset.Position(x).Line == fset.Position(y).Line
        -}
        -
        -var moveDirectory = func(from, to string) error {
        -	return os.Rename(from, to)
        -}
        diff --git a/vendor/golang.org/x/tools/refactor/rename/rename.go b/vendor/golang.org/x/tools/refactor/rename/rename.go
        deleted file mode 100644
        index 3651c62bf..000000000
        --- a/vendor/golang.org/x/tools/refactor/rename/rename.go
        +++ /dev/null
        @@ -1,603 +0,0 @@
        -// Copyright 2014 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -// Package rename contains the implementation of the 'gorename' command
        -// whose main function is in golang.org/x/tools/cmd/gorename.
        -// See the Usage constant for the command documentation.
        -package rename // import "golang.org/x/tools/refactor/rename"
        -
        -import (
        -	"bytes"
        -	"errors"
        -	"fmt"
        -	"go/ast"
        -	"go/build"
        -	"go/format"
        -	"go/parser"
        -	"go/token"
        -	"go/types"
        -	"io"
        -	"io/ioutil"
        -	"log"
        -	"os"
        -	"os/exec"
        -	"path"
        -	"regexp"
        -	"sort"
        -	"strconv"
        -	"strings"
        -
        -	"golang.org/x/tools/go/loader"
        -	"golang.org/x/tools/go/types/typeutil"
        -	"golang.org/x/tools/refactor/importgraph"
        -	"golang.org/x/tools/refactor/satisfy"
        -)
        -
        -const Usage = `gorename: precise type-safe renaming of identifiers in Go source code.
        -
        -Usage:
        -
        - gorename (-from  | -offset :#) -to  [-force]
        -
        -You must specify the object (named entity) to rename using the -offset
        -or -from flag.  Exactly one must be specified.
        -
        -Flags:
        -
        --offset    specifies the filename and byte offset of an identifier to rename.
        -           This form is intended for use by text editors.
        -
        --from      specifies the object to rename using a query notation;
        -           This form is intended for interactive use at the command line.
        -           A legal -from query has one of the following forms:
        -
        -  "encoding/json".Decoder.Decode        method of package-level named type
        -  (*"encoding/json".Decoder).Decode     ditto, alternative syntax
        -  "encoding/json".Decoder.buf           field of package-level named struct type
        -  "encoding/json".HTMLEscape            package member (const, func, var, type)
        -  "encoding/json".Decoder.Decode::x     local object x within a method
        -  "encoding/json".HTMLEscape::x         local object x within a function
        -  "encoding/json"::x                    object x anywhere within a package
        -  json.go::x                            object x within file json.go
        -
        -           Double-quotes must be escaped when writing a shell command.
        -           Quotes may be omitted for single-segment import paths such as "fmt".
        -
        -           For methods, the parens and '*' on the receiver type are both
        -           optional.
        -
        -           It is an error if one of the ::x queries matches multiple
        -           objects.
        -
        --to        the new name.
        -
        --force     causes the renaming to proceed even if conflicts were reported.
        -           The resulting program may be ill-formed, or experience a change
        -           in behaviour.
        -
        -           WARNING: this flag may even cause the renaming tool to crash.
        -           (In due course this bug will be fixed by moving certain
        -           analyses into the type-checker.)
        -
        --d         display diffs instead of rewriting files
        -
        --v         enables verbose logging.
        -
        -gorename automatically computes the set of packages that might be
        -affected.  For a local renaming, this is just the package specified by
        --from or -offset, but for a potentially exported name, gorename scans
        -the workspace ($GOROOT and $GOPATH).
        -
        -gorename rejects renamings of concrete methods that would change the
        -assignability relation between types and interfaces. If the interface
        -change was intentional, initiate the renaming at the interface method.
        -
        -gorename rejects any renaming that would create a conflict at the point
        -of declaration, or a reference conflict (ambiguity or shadowing), or
        -anything else that could cause the resulting program not to compile.
        -
        -
        -Examples:
        -
        -$ gorename -offset file.go:#123 -to foo
        -
        -  Rename the object whose identifier is at byte offset 123 within file file.go.
        -
        -$ gorename -from '"bytes".Buffer.Len' -to Size
        -
        -  Rename the "Len" method of the *bytes.Buffer type to "Size".
        -`
        -
        -// ---- TODO ----
        -
        -// Correctness:
        -// - handle dot imports correctly
        -// - document limitations (reflection, 'implements' algorithm).
        -// - sketch a proof of exhaustiveness.
        -
        -// Features:
        -// - support running on packages specified as *.go files on the command line
        -// - support running on programs containing errors (loader.Config.AllowErrors)
        -// - allow users to specify a scope other than "global" (to avoid being
        -//   stuck by neglected packages in $GOPATH that don't build).
        -// - support renaming the package clause (no object)
        -// - support renaming an import path (no ident or object)
        -//   (requires filesystem + SCM updates).
        -// - detect and reject edits to autogenerated files (cgo, protobufs)
        -//   and optionally $GOROOT packages.
        -// - report all conflicts, or at least all qualitatively distinct ones.
        -//   Sometimes we stop to avoid redundancy, but
        -//   it may give a disproportionate sense of safety in -force mode.
        -// - support renaming all instances of a pattern, e.g.
        -//   all receiver vars of a given type,
        -//   all local variables of a given type,
        -//   all PkgNames for a given package.
        -// - emit JSON output for other editors and tools.
        -
        -var (
        -	// Force enables patching of the source files even if conflicts were reported.
        -	// The resulting program may be ill-formed.
        -	// It may even cause gorename to crash.  TODO(adonovan): fix that.
        -	Force bool
        -
        -	// Diff causes the tool to display diffs instead of rewriting files.
        -	Diff bool
        -
        -	// DiffCmd specifies the diff command used by the -d feature.
        -	// (The command must accept a -u flag and two filename arguments.)
        -	DiffCmd = "diff"
        -
        -	// ConflictError is returned by Main when it aborts the renaming due to conflicts.
        -	// (It is distinguished because the interesting errors are the conflicts themselves.)
        -	ConflictError = errors.New("renaming aborted due to conflicts")
        -
        -	// Verbose enables extra logging.
        -	Verbose bool
        -)
        -
        -var stdout io.Writer = os.Stdout
        -
        -type renamer struct {
        -	iprog              *loader.Program
        -	objsToUpdate       map[types.Object]bool
        -	hadConflicts       bool
        -	from, to           string
        -	satisfyConstraints map[satisfy.Constraint]bool
        -	packages           map[*types.Package]*loader.PackageInfo // subset of iprog.AllPackages to inspect
        -	msets              typeutil.MethodSetCache
        -	changeMethods      bool
        -}
        -
        -var reportError = func(posn token.Position, message string) {
        -	fmt.Fprintf(os.Stderr, "%s: %s\n", posn, message)
        -}
        -
        -// importName renames imports of fromPath within the package specified by info.
        -// If fromName is not empty, importName renames only imports as fromName.
        -// If the renaming would lead to a conflict, the file is left unchanged.
        -func importName(iprog *loader.Program, info *loader.PackageInfo, fromPath, fromName, to string) error {
        -	if fromName == to {
        -		return nil // no-op (e.g. rename x/foo to y/foo)
        -	}
        -	for _, f := range info.Files {
        -		var from types.Object
        -		for _, imp := range f.Imports {
        -			importPath, _ := strconv.Unquote(imp.Path.Value)
        -			importName := path.Base(importPath)
        -			if imp.Name != nil {
        -				importName = imp.Name.Name
        -			}
        -			if importPath == fromPath && (fromName == "" || importName == fromName) {
        -				from = info.Implicits[imp]
        -				break
        -			}
        -		}
        -		if from == nil {
        -			continue
        -		}
        -		r := renamer{
        -			iprog:        iprog,
        -			objsToUpdate: make(map[types.Object]bool),
        -			to:           to,
        -			packages:     map[*types.Package]*loader.PackageInfo{info.Pkg: info},
        -		}
        -		r.check(from)
        -		if r.hadConflicts {
        -			reportError(iprog.Fset.Position(f.Imports[0].Pos()),
        -				"skipping update of this file")
        -			continue // ignore errors; leave the existing name
        -		}
        -		if err := r.update(); err != nil {
        -			return err
        -		}
        -	}
        -	return nil
        -}
        -
        -func Main(ctxt *build.Context, offsetFlag, fromFlag, to string) error {
        -	// -- Parse the -from or -offset specifier ----------------------------
        -
        -	if (offsetFlag == "") == (fromFlag == "") {
        -		return fmt.Errorf("exactly one of the -from and -offset flags must be specified")
        -	}
        -
        -	if !isValidIdentifier(to) {
        -		return fmt.Errorf("-to %q: not a valid identifier", to)
        -	}
        -
        -	if Diff {
        -		defer func(saved func(string, []byte) error) { writeFile = saved }(writeFile)
        -		writeFile = diff
        -	}
        -
        -	var spec *spec
        -	var err error
        -	if fromFlag != "" {
        -		spec, err = parseFromFlag(ctxt, fromFlag)
        -	} else {
        -		spec, err = parseOffsetFlag(ctxt, offsetFlag)
        -	}
        -	if err != nil {
        -		return err
        -	}
        -
        -	if spec.fromName == to {
        -		return fmt.Errorf("the old and new names are the same: %s", to)
        -	}
        -
        -	// -- Load the program consisting of the initial package  -------------
        -
        -	iprog, err := loadProgram(ctxt, map[string]bool{spec.pkg: true})
        -	if err != nil {
        -		return err
        -	}
        -
        -	fromObjects, err := findFromObjects(iprog, spec)
        -	if err != nil {
        -		return err
        -	}
        -
        -	// -- Load a larger program, for global renamings ---------------------
        -
        -	if requiresGlobalRename(fromObjects, to) {
        -		// For a local refactoring, we needn't load more
        -		// packages, but if the renaming affects the package's
        -		// API, we we must load all packages that depend on the
        -		// package defining the object, plus their tests.
        -
        -		if Verbose {
        -			log.Print("Potentially global renaming; scanning workspace...")
        -		}
        -
        -		// Scan the workspace and build the import graph.
        -		_, rev, errors := importgraph.Build(ctxt)
        -		if len(errors) > 0 {
        -			// With a large GOPATH tree, errors are inevitable.
        -			// Report them but proceed.
        -			fmt.Fprintf(os.Stderr, "While scanning Go workspace:\n")
        -			for path, err := range errors {
        -				fmt.Fprintf(os.Stderr, "Package %q: %s.\n", path, err)
        -			}
        -		}
        -
        -		// Enumerate the set of potentially affected packages.
        -		affectedPackages := make(map[string]bool)
        -		for _, obj := range fromObjects {
        -			// External test packages are never imported,
        -			// so they will never appear in the graph.
        -			for path := range rev.Search(obj.Pkg().Path()) {
        -				affectedPackages[path] = true
        -			}
        -		}
        -
        -		// TODO(adonovan): allow the user to specify the scope,
        -		// or -ignore patterns?  Computing the scope when we
        -		// don't (yet) support inputs containing errors can make
        -		// the tool rather brittle.
        -
        -		// Re-load the larger program.
        -		iprog, err = loadProgram(ctxt, affectedPackages)
        -		if err != nil {
        -			return err
        -		}
        -
        -		fromObjects, err = findFromObjects(iprog, spec)
        -		if err != nil {
        -			return err
        -		}
        -	}
        -
        -	// -- Do the renaming -------------------------------------------------
        -
        -	r := renamer{
        -		iprog:        iprog,
        -		objsToUpdate: make(map[types.Object]bool),
        -		from:         spec.fromName,
        -		to:           to,
        -		packages:     make(map[*types.Package]*loader.PackageInfo),
        -	}
        -
        -	// A renaming initiated at an interface method indicates the
        -	// intention to rename abstract and concrete methods as needed
        -	// to preserve assignability.
        -	for _, obj := range fromObjects {
        -		if obj, ok := obj.(*types.Func); ok {
        -			recv := obj.Type().(*types.Signature).Recv()
        -			if recv != nil && isInterface(recv.Type().Underlying()) {
        -				r.changeMethods = true
        -				break
        -			}
        -		}
        -	}
        -
        -	// Only the initially imported packages (iprog.Imported) and
        -	// their external tests (iprog.Created) should be inspected or
        -	// modified, as only they have type-checked functions bodies.
        -	// The rest are just dependencies, needed only for package-level
        -	// type information.
        -	for _, info := range iprog.Imported {
        -		r.packages[info.Pkg] = info
        -	}
        -	for _, info := range iprog.Created { // (tests)
        -		r.packages[info.Pkg] = info
        -	}
        -
        -	for _, from := range fromObjects {
        -		r.check(from)
        -	}
        -	if r.hadConflicts && !Force {
        -		return ConflictError
        -	}
        -	return r.update()
        -}
        -
        -// loadProgram loads the specified set of packages (plus their tests)
        -// and all their dependencies, from source, through the specified build
        -// context.  Only packages in pkgs will have their functions bodies typechecked.
        -func loadProgram(ctxt *build.Context, pkgs map[string]bool) (*loader.Program, error) {
        -	conf := loader.Config{
        -		Build:      ctxt,
        -		ParserMode: parser.ParseComments,
        -
        -		// TODO(adonovan): enable this.  Requires making a lot of code more robust!
        -		AllowErrors: false,
        -	}
        -	// Optimization: don't type-check the bodies of functions in our
        -	// dependencies, since we only need exported package members.
        -	conf.TypeCheckFuncBodies = func(p string) bool {
        -		return pkgs[p] || pkgs[strings.TrimSuffix(p, "_test")]
        -	}
        -
        -	if Verbose {
        -		var list []string
        -		for pkg := range pkgs {
        -			list = append(list, pkg)
        -		}
        -		sort.Strings(list)
        -		for _, pkg := range list {
        -			log.Printf("Loading package: %s", pkg)
        -		}
        -	}
        -
        -	for pkg := range pkgs {
        -		conf.ImportWithTests(pkg)
        -	}
        -
        -	// Ideally we would just return conf.Load() here, but go/types
        -	// reports certain "soft" errors that gc does not (Go issue 14596).
        -	// As a workaround, we set AllowErrors=true and then duplicate
        -	// the loader's error checking but allow soft errors.
        -	// It would be nice if the loader API permitted "AllowErrors: soft".
        -	conf.AllowErrors = true
        -	prog, err := conf.Load()
        -	if err != nil {
        -		return nil, err
        -	}
        -
        -	var errpkgs []string
        -	// Report hard errors in indirectly imported packages.
        -	for _, info := range prog.AllPackages {
        -		if containsHardErrors(info.Errors) {
        -			errpkgs = append(errpkgs, info.Pkg.Path())
        -		}
        -	}
        -	if errpkgs != nil {
        -		var more string
        -		if len(errpkgs) > 3 {
        -			more = fmt.Sprintf(" and %d more", len(errpkgs)-3)
        -			errpkgs = errpkgs[:3]
        -		}
        -		return nil, fmt.Errorf("couldn't load packages due to errors: %s%s",
        -			strings.Join(errpkgs, ", "), more)
        -	}
        -	return prog, nil
        -}
        -
        -func containsHardErrors(errors []error) bool {
        -	for _, err := range errors {
        -		if err, ok := err.(types.Error); ok && err.Soft {
        -			continue
        -		}
        -		return true
        -	}
        -	return false
        -}
        -
        -// requiresGlobalRename reports whether this renaming could potentially
        -// affect other packages in the Go workspace.
        -func requiresGlobalRename(fromObjects []types.Object, to string) bool {
        -	var tfm bool
        -	for _, from := range fromObjects {
        -		if from.Exported() {
        -			return true
        -		}
        -		switch objectKind(from) {
        -		case "type", "field", "method":
        -			tfm = true
        -		}
        -	}
        -	if ast.IsExported(to) && tfm {
        -		// A global renaming may be necessary even if we're
        -		// exporting a previous unexported name, since if it's
        -		// the name of a type, field or method, this could
        -		// change selections in other packages.
        -		// (We include "type" in this list because a type
        -		// used as an embedded struct field entails a field
        -		// renaming.)
        -		return true
        -	}
        -	return false
        -}
        -
        -// update updates the input files.
        -func (r *renamer) update() error {
        -	// We use token.File, not filename, since a file may appear to
        -	// belong to multiple packages and be parsed more than once.
        -	// token.File captures this distinction; filename does not.
        -
        -	var nidents int
        -	var filesToUpdate = make(map[*token.File]bool)
        -	docRegexp := regexp.MustCompile(`\b` + r.from + `\b`)
        -	for _, info := range r.packages {
        -		// Mutate the ASTs and note the filenames.
        -		for id, obj := range info.Defs {
        -			if r.objsToUpdate[obj] {
        -				nidents++
        -				id.Name = r.to
        -				filesToUpdate[r.iprog.Fset.File(id.Pos())] = true
        -				// Perform the rename in doc comments too.
        -				if doc := r.docComment(id); doc != nil {
        -					for _, comment := range doc.List {
        -						comment.Text = docRegexp.ReplaceAllString(comment.Text, r.to)
        -					}
        -				}
        -			}
        -		}
        -
        -		for id, obj := range info.Uses {
        -			if r.objsToUpdate[obj] {
        -				nidents++
        -				id.Name = r.to
        -				filesToUpdate[r.iprog.Fset.File(id.Pos())] = true
        -			}
        -		}
        -	}
        -
        -	// Renaming not supported if cgo files are affected.
        -	var generatedFileNames []string
        -	for _, info := range r.packages {
        -		for _, f := range info.Files {
        -			tokenFile := r.iprog.Fset.File(f.Pos())
        -			if filesToUpdate[tokenFile] && generated(f, tokenFile) {
        -				generatedFileNames = append(generatedFileNames, tokenFile.Name())
        -			}
        -		}
        -	}
        -	if !Force && len(generatedFileNames) > 0 {
        -		return fmt.Errorf("refusing to modify generated file%s containing DO NOT EDIT marker: %v", plural(len(generatedFileNames)), generatedFileNames)
        -	}
        -
        -	// Write affected files.
        -	var nerrs, npkgs int
        -	for _, info := range r.packages {
        -		first := true
        -		for _, f := range info.Files {
        -			tokenFile := r.iprog.Fset.File(f.Pos())
        -			if filesToUpdate[tokenFile] {
        -				if first {
        -					npkgs++
        -					first = false
        -					if Verbose {
        -						log.Printf("Updating package %s", info.Pkg.Path())
        -					}
        -				}
        -
        -				filename := tokenFile.Name()
        -				var buf bytes.Buffer
        -				if err := format.Node(&buf, r.iprog.Fset, f); err != nil {
        -					log.Printf("failed to pretty-print syntax tree: %v", err)
        -					nerrs++
        -					continue
        -				}
        -				if err := writeFile(filename, buf.Bytes()); err != nil {
        -					log.Print(err)
        -					nerrs++
        -				}
        -			}
        -		}
        -	}
        -	if !Diff {
        -		fmt.Printf("Renamed %d occurrence%s in %d file%s in %d package%s.\n",
        -			nidents, plural(nidents),
        -			len(filesToUpdate), plural(len(filesToUpdate)),
        -			npkgs, plural(npkgs))
        -	}
        -	if nerrs > 0 {
        -		return fmt.Errorf("failed to rewrite %d file%s", nerrs, plural(nerrs))
        -	}
        -	return nil
        -}
        -
        -// docComment returns the doc for an identifier.
        -func (r *renamer) docComment(id *ast.Ident) *ast.CommentGroup {
        -	_, nodes, _ := r.iprog.PathEnclosingInterval(id.Pos(), id.End())
        -	for _, node := range nodes {
        -		switch decl := node.(type) {
        -		case *ast.FuncDecl:
        -			return decl.Doc
        -		case *ast.Field:
        -			return decl.Doc
        -		case *ast.GenDecl:
        -			return decl.Doc
        -		// For {Type,Value}Spec, if the doc on the spec is absent,
        -		// search for the enclosing GenDecl
        -		case *ast.TypeSpec:
        -			if decl.Doc != nil {
        -				return decl.Doc
        -			}
        -		case *ast.ValueSpec:
        -			if decl.Doc != nil {
        -				return decl.Doc
        -			}
        -		case *ast.Ident:
        -		default:
        -			return nil
        -		}
        -	}
        -	return nil
        -}
        -
        -func plural(n int) string {
        -	if n != 1 {
        -		return "s"
        -	}
        -	return ""
        -}
        -
        -// writeFile is a seam for testing and for the -d flag.
        -var writeFile = reallyWriteFile
        -
        -func reallyWriteFile(filename string, content []byte) error {
        -	return ioutil.WriteFile(filename, content, 0644)
        -}
        -
        -func diff(filename string, content []byte) error {
        -	renamed := fmt.Sprintf("%s.%d.renamed", filename, os.Getpid())
        -	if err := ioutil.WriteFile(renamed, content, 0644); err != nil {
        -		return err
        -	}
        -	defer os.Remove(renamed)
        -
        -	diff, err := exec.Command(DiffCmd, "-u", filename, renamed).CombinedOutput()
        -	if len(diff) > 0 {
        -		// diff exits with a non-zero status when the files don't match.
        -		// Ignore that failure as long as we get output.
        -		stdout.Write(diff)
        -		return nil
        -	}
        -	if err != nil {
        -		return fmt.Errorf("computing diff: %v", err)
        -	}
        -	return nil
        -}
        diff --git a/vendor/golang.org/x/tools/refactor/rename/spec.go b/vendor/golang.org/x/tools/refactor/rename/spec.go
        deleted file mode 100644
        index 0c4526d15..000000000
        --- a/vendor/golang.org/x/tools/refactor/rename/spec.go
        +++ /dev/null
        @@ -1,593 +0,0 @@
        -// Copyright 2014 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package rename
        -
        -// This file contains logic related to specifying a renaming: parsing of
        -// the flags as a form of query, and finding the object(s) it denotes.
        -// See Usage for flag details.
        -
        -import (
        -	"bytes"
        -	"fmt"
        -	"go/ast"
        -	"go/build"
        -	"go/parser"
        -	"go/token"
        -	"go/types"
        -	"log"
        -	"os"
        -	"path/filepath"
        -	"regexp"
        -	"strconv"
        -	"strings"
        -
        -	"golang.org/x/tools/go/buildutil"
        -	"golang.org/x/tools/go/loader"
        -)
        -
        -// A spec specifies an entity to rename.
        -//
        -// It is populated from an -offset flag or -from query;
        -// see Usage for the allowed -from query forms.
        -//
        -type spec struct {
        -	// pkg is the package containing the position
        -	// specified by the -from or -offset flag.
        -	// If filename == "", our search for the 'from' entity
        -	// is restricted to this package.
        -	pkg string
        -
        -	// The original name of the entity being renamed.
        -	// If the query had a ::from component, this is that;
        -	// otherwise it's the last segment, e.g.
        -	//   (encoding/json.Decoder).from
        -	//   encoding/json.from
        -	fromName string
        -
        -	// -- The remaining fields are private to this file.  All are optional. --
        -
        -	// The query's ::x suffix, if any.
        -	searchFor string
        -
        -	// e.g. "Decoder" in "(encoding/json.Decoder).fieldOrMethod"
        -	//                or "encoding/json.Decoder
        -	pkgMember string
        -
        -	// e.g. fieldOrMethod in "(encoding/json.Decoder).fieldOrMethod"
        -	typeMember string
        -
        -	// Restricts the query to this file.
        -	// Implied by -from="file.go::x" and -offset flags.
        -	filename string
        -
        -	// Byte offset of the 'from' identifier within the file named 'filename'.
        -	// -offset mode only.
        -	offset int
        -}
        -
        -// parseFromFlag interprets the "-from" flag value as a renaming specification.
        -// See Usage in rename.go for valid formats.
        -func parseFromFlag(ctxt *build.Context, fromFlag string) (*spec, error) {
        -	var spec spec
        -	var main string // sans "::x" suffix
        -	switch parts := strings.Split(fromFlag, "::"); len(parts) {
        -	case 1:
        -		main = parts[0]
        -	case 2:
        -		main = parts[0]
        -		spec.searchFor = parts[1]
        -		if parts[1] == "" {
        -			// error
        -		}
        -	default:
        -		return nil, fmt.Errorf("-from %q: invalid identifier specification (see -help for formats)", fromFlag)
        -	}
        -
        -	if strings.HasSuffix(main, ".go") {
        -		// main is "filename.go"
        -		if spec.searchFor == "" {
        -			return nil, fmt.Errorf("-from: filename %q must have a ::name suffix", main)
        -		}
        -		spec.filename = main
        -		if !buildutil.FileExists(ctxt, spec.filename) {
        -			return nil, fmt.Errorf("no such file: %s", spec.filename)
        -		}
        -
        -		bp, err := buildutil.ContainingPackage(ctxt, wd, spec.filename)
        -		if err != nil {
        -			return nil, err
        -		}
        -		spec.pkg = bp.ImportPath
        -
        -	} else {
        -		// main is one of:
        -		//  "importpath"
        -		//  "importpath".member
        -		//  (*"importpath".type).fieldormethod           (parens and star optional)
        -		if err := parseObjectSpec(&spec, main); err != nil {
        -			return nil, err
        -		}
        -	}
        -
        -	if spec.searchFor != "" {
        -		spec.fromName = spec.searchFor
        -	}
        -
        -	cwd, err := os.Getwd()
        -	if err != nil {
        -		return nil, err
        -	}
        -
        -	// Sanitize the package.
        -	bp, err := ctxt.Import(spec.pkg, cwd, build.FindOnly)
        -	if err != nil {
        -		return nil, fmt.Errorf("can't find package %q", spec.pkg)
        -	}
        -	spec.pkg = bp.ImportPath
        -
        -	if !isValidIdentifier(spec.fromName) {
        -		return nil, fmt.Errorf("-from: invalid identifier %q", spec.fromName)
        -	}
        -
        -	if Verbose {
        -		log.Printf("-from spec: %+v", spec)
        -	}
        -
        -	return &spec, nil
        -}
        -
        -// parseObjectSpec parses main as one of the non-filename forms of
        -// object specification.
        -func parseObjectSpec(spec *spec, main string) error {
        -	// Parse main as a Go expression, albeit a strange one.
        -	e, _ := parser.ParseExpr(main)
        -
        -	if pkg := parseImportPath(e); pkg != "" {
        -		// e.g. bytes or "encoding/json": a package
        -		spec.pkg = pkg
        -		if spec.searchFor == "" {
        -			return fmt.Errorf("-from %q: package import path %q must have a ::name suffix",
        -				main, main)
        -		}
        -		return nil
        -	}
        -
        -	if e, ok := e.(*ast.SelectorExpr); ok {
        -		x := unparen(e.X)
        -
        -		// Strip off star constructor, if any.
        -		if star, ok := x.(*ast.StarExpr); ok {
        -			x = star.X
        -		}
        -
        -		if pkg := parseImportPath(x); pkg != "" {
        -			// package member e.g. "encoding/json".HTMLEscape
        -			spec.pkg = pkg              // e.g. "encoding/json"
        -			spec.pkgMember = e.Sel.Name // e.g. "HTMLEscape"
        -			spec.fromName = e.Sel.Name
        -			return nil
        -		}
        -
        -		if x, ok := x.(*ast.SelectorExpr); ok {
        -			// field/method of type e.g. ("encoding/json".Decoder).Decode
        -			y := unparen(x.X)
        -			if pkg := parseImportPath(y); pkg != "" {
        -				spec.pkg = pkg               // e.g. "encoding/json"
        -				spec.pkgMember = x.Sel.Name  // e.g. "Decoder"
        -				spec.typeMember = e.Sel.Name // e.g. "Decode"
        -				spec.fromName = e.Sel.Name
        -				return nil
        -			}
        -		}
        -	}
        -
        -	return fmt.Errorf("-from %q: invalid expression", main)
        -}
        -
        -// parseImportPath returns the import path of the package denoted by e.
        -// Any import path may be represented as a string literal;
        -// single-segment import paths (e.g. "bytes") may also be represented as
        -// ast.Ident.  parseImportPath returns "" for all other expressions.
        -func parseImportPath(e ast.Expr) string {
        -	switch e := e.(type) {
        -	case *ast.Ident:
        -		return e.Name // e.g. bytes
        -
        -	case *ast.BasicLit:
        -		if e.Kind == token.STRING {
        -			pkgname, _ := strconv.Unquote(e.Value)
        -			return pkgname // e.g. "encoding/json"
        -		}
        -	}
        -	return ""
        -}
        -
        -// parseOffsetFlag interprets the "-offset" flag value as a renaming specification.
        -func parseOffsetFlag(ctxt *build.Context, offsetFlag string) (*spec, error) {
        -	var spec spec
        -	// Validate -offset, e.g. file.go:#123
        -	parts := strings.Split(offsetFlag, ":#")
        -	if len(parts) != 2 {
        -		return nil, fmt.Errorf("-offset %q: invalid offset specification", offsetFlag)
        -	}
        -
        -	spec.filename = parts[0]
        -	if !buildutil.FileExists(ctxt, spec.filename) {
        -		return nil, fmt.Errorf("no such file: %s", spec.filename)
        -	}
        -
        -	bp, err := buildutil.ContainingPackage(ctxt, wd, spec.filename)
        -	if err != nil {
        -		return nil, err
        -	}
        -	spec.pkg = bp.ImportPath
        -
        -	for _, r := range parts[1] {
        -		if !isDigit(r) {
        -			return nil, fmt.Errorf("-offset %q: non-numeric offset", offsetFlag)
        -		}
        -	}
        -	spec.offset, err = strconv.Atoi(parts[1])
        -	if err != nil {
        -		return nil, fmt.Errorf("-offset %q: non-numeric offset", offsetFlag)
        -	}
        -
        -	// Parse the file and check there's an identifier at that offset.
        -	fset := token.NewFileSet()
        -	f, err := buildutil.ParseFile(fset, ctxt, nil, wd, spec.filename, parser.ParseComments)
        -	if err != nil {
        -		return nil, fmt.Errorf("-offset %q: cannot parse file: %s", offsetFlag, err)
        -	}
        -
        -	id := identAtOffset(fset, f, spec.offset)
        -	if id == nil {
        -		return nil, fmt.Errorf("-offset %q: no identifier at this position", offsetFlag)
        -	}
        -
        -	spec.fromName = id.Name
        -
        -	return &spec, nil
        -}
        -
        -var wd = func() string {
        -	wd, err := os.Getwd()
        -	if err != nil {
        -		panic("cannot get working directory: " + err.Error())
        -	}
        -	return wd
        -}()
        -
        -// For source trees built with 'go build', the -from or -offset
        -// spec identifies exactly one initial 'from' object to rename ,
        -// but certain proprietary build systems allow a single file to
        -// appear in multiple packages (e.g. the test package contains a
        -// copy of its library), so there may be multiple objects for
        -// the same source entity.
        -
        -func findFromObjects(iprog *loader.Program, spec *spec) ([]types.Object, error) {
        -	if spec.filename != "" {
        -		return findFromObjectsInFile(iprog, spec)
        -	}
        -
        -	// Search for objects defined in specified package.
        -
        -	// TODO(adonovan): the iprog.ImportMap has an entry {"main": ...}
        -	// for main packages, even though that's not an import path.
        -	// Seems like a bug.
        -	//
        -	// pkg := iprog.ImportMap[spec.pkg]
        -	// if pkg == nil {
        -	// 	return fmt.Errorf("cannot find package %s", spec.pkg) // can't happen?
        -	// }
        -	// info := iprog.AllPackages[pkg]
        -
        -	// Workaround: lookup by value.
        -	var info *loader.PackageInfo
        -	var pkg *types.Package
        -	for pkg, info = range iprog.AllPackages {
        -		if pkg.Path() == spec.pkg {
        -			break
        -		}
        -	}
        -	if info == nil {
        -		return nil, fmt.Errorf("package %q was not loaded", spec.pkg)
        -	}
        -
        -	objects, err := findObjects(info, spec)
        -	if err != nil {
        -		return nil, err
        -	}
        -	if len(objects) > 1 {
        -		// ambiguous "*" scope query
        -		return nil, ambiguityError(iprog.Fset, objects)
        -	}
        -	return objects, nil
        -}
        -
        -func findFromObjectsInFile(iprog *loader.Program, spec *spec) ([]types.Object, error) {
        -	var fromObjects []types.Object
        -	for _, info := range iprog.AllPackages {
        -		// restrict to specified filename
        -		// NB: under certain proprietary build systems, a given
        -		// filename may appear in multiple packages.
        -		for _, f := range info.Files {
        -			thisFile := iprog.Fset.File(f.Pos())
        -			if !sameFile(thisFile.Name(), spec.filename) {
        -				continue
        -			}
        -			// This package contains the query file.
        -
        -			if spec.offset != 0 {
        -				// We cannot refactor generated files since position information is invalidated.
        -				if generated(f, thisFile) {
        -					return nil, fmt.Errorf("cannot rename identifiers in generated file containing DO NOT EDIT marker: %s", thisFile.Name())
        -				}
        -
        -				// Search for a specific ident by file/offset.
        -				id := identAtOffset(iprog.Fset, f, spec.offset)
        -				if id == nil {
        -					// can't happen?
        -					return nil, fmt.Errorf("identifier not found")
        -				}
        -				obj := info.Uses[id]
        -				if obj == nil {
        -					obj = info.Defs[id]
        -					if obj == nil {
        -						// Ident without Object.
        -
        -						// Package clause?
        -						pos := thisFile.Pos(spec.offset)
        -						_, path, _ := iprog.PathEnclosingInterval(pos, pos)
        -						if len(path) == 2 { // [Ident File]
        -							// TODO(adonovan): support this case.
        -							return nil, fmt.Errorf("cannot rename %q: renaming package clauses is not yet supported",
        -								path[1].(*ast.File).Name.Name)
        -						}
        -
        -						// Implicit y in "switch y := x.(type) {"?
        -						if obj := typeSwitchVar(&info.Info, path); obj != nil {
        -							return []types.Object{obj}, nil
        -						}
        -
        -						// Probably a type error.
        -						return nil, fmt.Errorf("cannot find object for %q", id.Name)
        -					}
        -				}
        -				if obj.Pkg() == nil {
        -					return nil, fmt.Errorf("cannot rename predeclared identifiers (%s)", obj)
        -
        -				}
        -
        -				fromObjects = append(fromObjects, obj)
        -			} else {
        -				// do a package-wide query
        -				objects, err := findObjects(info, spec)
        -				if err != nil {
        -					return nil, err
        -				}
        -
        -				// filter results: only objects defined in thisFile
        -				var filtered []types.Object
        -				for _, obj := range objects {
        -					if iprog.Fset.File(obj.Pos()) == thisFile {
        -						filtered = append(filtered, obj)
        -					}
        -				}
        -				if len(filtered) == 0 {
        -					return nil, fmt.Errorf("no object %q declared in file %s",
        -						spec.fromName, spec.filename)
        -				} else if len(filtered) > 1 {
        -					return nil, ambiguityError(iprog.Fset, filtered)
        -				}
        -				fromObjects = append(fromObjects, filtered[0])
        -			}
        -			break
        -		}
        -	}
        -	if len(fromObjects) == 0 {
        -		// can't happen?
        -		return nil, fmt.Errorf("file %s was not part of the loaded program", spec.filename)
        -	}
        -	return fromObjects, nil
        -}
        -
        -func typeSwitchVar(info *types.Info, path []ast.Node) types.Object {
        -	if len(path) > 3 {
        -		// [Ident AssignStmt TypeSwitchStmt...]
        -		if sw, ok := path[2].(*ast.TypeSwitchStmt); ok {
        -			// choose the first case.
        -			if len(sw.Body.List) > 0 {
        -				obj := info.Implicits[sw.Body.List[0].(*ast.CaseClause)]
        -				if obj != nil {
        -					return obj
        -				}
        -			}
        -		}
        -	}
        -	return nil
        -}
        -
        -// On success, findObjects returns the list of objects named
        -// spec.fromName matching the spec.  On success, the result has exactly
        -// one element unless spec.searchFor!="", in which case it has at least one
        -// element.
        -//
        -func findObjects(info *loader.PackageInfo, spec *spec) ([]types.Object, error) {
        -	if spec.pkgMember == "" {
        -		if spec.searchFor == "" {
        -			panic(spec)
        -		}
        -		objects := searchDefs(&info.Info, spec.searchFor)
        -		if objects == nil {
        -			return nil, fmt.Errorf("no object %q declared in package %q",
        -				spec.searchFor, info.Pkg.Path())
        -		}
        -		return objects, nil
        -	}
        -
        -	pkgMember := info.Pkg.Scope().Lookup(spec.pkgMember)
        -	if pkgMember == nil {
        -		return nil, fmt.Errorf("package %q has no member %q",
        -			info.Pkg.Path(), spec.pkgMember)
        -	}
        -
        -	var searchFunc *types.Func
        -	if spec.typeMember == "" {
        -		// package member
        -		if spec.searchFor == "" {
        -			return []types.Object{pkgMember}, nil
        -		}
        -
        -		// Search within pkgMember, which must be a function.
        -		searchFunc, _ = pkgMember.(*types.Func)
        -		if searchFunc == nil {
        -			return nil, fmt.Errorf("cannot search for %q within %s %q",
        -				spec.searchFor, objectKind(pkgMember), pkgMember)
        -		}
        -	} else {
        -		// field/method of type
        -		// e.g. (encoding/json.Decoder).Decode
        -		// or ::x within it.
        -
        -		tName, _ := pkgMember.(*types.TypeName)
        -		if tName == nil {
        -			return nil, fmt.Errorf("%s.%s is a %s, not a type",
        -				info.Pkg.Path(), pkgMember.Name(), objectKind(pkgMember))
        -		}
        -
        -		// search within named type.
        -		obj, _, _ := types.LookupFieldOrMethod(tName.Type(), true, info.Pkg, spec.typeMember)
        -		if obj == nil {
        -			return nil, fmt.Errorf("cannot find field or method %q of %s %s.%s",
        -				spec.typeMember, typeKind(tName.Type()), info.Pkg.Path(), tName.Name())
        -		}
        -
        -		if spec.searchFor == "" {
        -			// If it is an embedded field, return the type of the field.
        -			if v, ok := obj.(*types.Var); ok && v.Anonymous() {
        -				switch t := v.Type().(type) {
        -				case *types.Pointer:
        -					return []types.Object{t.Elem().(*types.Named).Obj()}, nil
        -				case *types.Named:
        -					return []types.Object{t.Obj()}, nil
        -				}
        -			}
        -			return []types.Object{obj}, nil
        -		}
        -
        -		searchFunc, _ = obj.(*types.Func)
        -		if searchFunc == nil {
        -			return nil, fmt.Errorf("cannot search for local name %q within %s (%s.%s).%s; need a function",
        -				spec.searchFor, objectKind(obj), info.Pkg.Path(), tName.Name(),
        -				obj.Name())
        -		}
        -		if isInterface(tName.Type()) {
        -			return nil, fmt.Errorf("cannot search for local name %q within abstract method (%s.%s).%s",
        -				spec.searchFor, info.Pkg.Path(), tName.Name(), searchFunc.Name())
        -		}
        -	}
        -
        -	// -- search within function or method --
        -
        -	decl := funcDecl(info, searchFunc)
        -	if decl == nil {
        -		return nil, fmt.Errorf("cannot find syntax for %s", searchFunc) // can't happen?
        -	}
        -
        -	var objects []types.Object
        -	for _, obj := range searchDefs(&info.Info, spec.searchFor) {
        -		// We use positions, not scopes, to determine whether
        -		// the obj is within searchFunc.  This is clumsy, but the
        -		// alternative, using the types.Scope tree, doesn't
        -		// account for non-lexical objects like fields and
        -		// interface methods.
        -		if decl.Pos() <= obj.Pos() && obj.Pos() < decl.End() && obj != searchFunc {
        -			objects = append(objects, obj)
        -		}
        -	}
        -	if objects == nil {
        -		return nil, fmt.Errorf("no local definition of %q within %s",
        -			spec.searchFor, searchFunc)
        -	}
        -	return objects, nil
        -}
        -
        -func funcDecl(info *loader.PackageInfo, fn *types.Func) *ast.FuncDecl {
        -	for _, f := range info.Files {
        -		for _, d := range f.Decls {
        -			if d, ok := d.(*ast.FuncDecl); ok && info.Defs[d.Name] == fn {
        -				return d
        -			}
        -		}
        -	}
        -	return nil
        -}
        -
        -func searchDefs(info *types.Info, name string) []types.Object {
        -	var objects []types.Object
        -	for id, obj := range info.Defs {
        -		if obj == nil {
        -			// e.g. blank ident.
        -			// TODO(adonovan): but also implicit y in
        -			//    switch y := x.(type)
        -			// Needs some thought.
        -			continue
        -		}
        -		if id.Name == name {
        -			objects = append(objects, obj)
        -		}
        -	}
        -	return objects
        -}
        -
        -func identAtOffset(fset *token.FileSet, f *ast.File, offset int) *ast.Ident {
        -	var found *ast.Ident
        -	ast.Inspect(f, func(n ast.Node) bool {
        -		if id, ok := n.(*ast.Ident); ok {
        -			idpos := fset.Position(id.Pos()).Offset
        -			if idpos <= offset && offset < idpos+len(id.Name) {
        -				found = id
        -			}
        -		}
        -		return found == nil // keep traversing only until found
        -	})
        -	return found
        -}
        -
        -// ambiguityError returns an error describing an ambiguous "*" scope query.
        -func ambiguityError(fset *token.FileSet, objects []types.Object) error {
        -	var buf bytes.Buffer
        -	for i, obj := range objects {
        -		if i > 0 {
        -			buf.WriteString(", ")
        -		}
        -		posn := fset.Position(obj.Pos())
        -		fmt.Fprintf(&buf, "%s at %s:%d:%d",
        -			objectKind(obj), filepath.Base(posn.Filename), posn.Line, posn.Column)
        -	}
        -	return fmt.Errorf("ambiguous specifier %s matches %s",
        -		objects[0].Name(), buf.String())
        -}
        -
        -// Matches cgo generated comment as well as the proposed standard:
        -//	https://golang.org/s/generatedcode
        -var generatedRx = regexp.MustCompile(`// .*DO NOT EDIT\.?`)
        -
        -// generated reports whether ast.File is a generated file.
        -func generated(f *ast.File, tokenFile *token.File) bool {
        -
        -	// Iterate over the comments in the file
        -	for _, commentGroup := range f.Comments {
        -		for _, comment := range commentGroup.List {
        -			if matched := generatedRx.MatchString(comment.Text); matched {
        -				// Check if comment is at the beginning of the line in source
        -				if pos := tokenFile.Position(comment.Slash); pos.Column == 1 {
        -					return true
        -				}
        -			}
        -		}
        -	}
        -	return false
        -}
        diff --git a/vendor/golang.org/x/tools/refactor/rename/util.go b/vendor/golang.org/x/tools/refactor/rename/util.go
        deleted file mode 100644
        index e8f8d7498..000000000
        --- a/vendor/golang.org/x/tools/refactor/rename/util.go
        +++ /dev/null
        @@ -1,105 +0,0 @@
        -// Copyright 2014 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package rename
        -
        -import (
        -	"go/ast"
        -	"go/token"
        -	"go/types"
        -	"os"
        -	"path/filepath"
        -	"reflect"
        -	"runtime"
        -	"strings"
        -	"unicode"
        -
        -	"golang.org/x/tools/go/ast/astutil"
        -)
        -
        -func objectKind(obj types.Object) string {
        -	switch obj := obj.(type) {
        -	case *types.PkgName:
        -		return "imported package name"
        -	case *types.TypeName:
        -		return "type"
        -	case *types.Var:
        -		if obj.IsField() {
        -			return "field"
        -		}
        -	case *types.Func:
        -		if obj.Type().(*types.Signature).Recv() != nil {
        -			return "method"
        -		}
        -	}
        -	// label, func, var, const
        -	return strings.ToLower(strings.TrimPrefix(reflect.TypeOf(obj).String(), "*types."))
        -}
        -
        -func typeKind(T types.Type) string {
        -	return strings.ToLower(strings.TrimPrefix(reflect.TypeOf(T.Underlying()).String(), "*types."))
        -}
        -
        -// NB: for renamings, blank is not considered valid.
        -func isValidIdentifier(id string) bool {
        -	if id == "" || id == "_" {
        -		return false
        -	}
        -	for i, r := range id {
        -		if !isLetter(r) && (i == 0 || !isDigit(r)) {
        -			return false
        -		}
        -	}
        -	return token.Lookup(id) == token.IDENT
        -}
        -
        -// isLocal reports whether obj is local to some function.
        -// Precondition: not a struct field or interface method.
        -func isLocal(obj types.Object) bool {
        -	// [... 5=stmt 4=func 3=file 2=pkg 1=universe]
        -	var depth int
        -	for scope := obj.Parent(); scope != nil; scope = scope.Parent() {
        -		depth++
        -	}
        -	return depth >= 4
        -}
        -
        -func isPackageLevel(obj types.Object) bool {
        -	return obj.Pkg().Scope().Lookup(obj.Name()) == obj
        -}
        -
        -// -- Plundered from go/scanner: ---------------------------------------
        -
        -func isLetter(ch rune) bool {
        -	return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' || ch >= 0x80 && unicode.IsLetter(ch)
        -}
        -
        -func isDigit(ch rune) bool {
        -	return '0' <= ch && ch <= '9' || ch >= 0x80 && unicode.IsDigit(ch)
        -}
        -
        -// -- Plundered from golang.org/x/tools/cmd/guru -----------------
        -
        -// sameFile returns true if x and y have the same basename and denote
        -// the same file.
        -//
        -func sameFile(x, y string) bool {
        -	if runtime.GOOS == "windows" {
        -		x = filepath.ToSlash(x)
        -		y = filepath.ToSlash(y)
        -	}
        -	if x == y {
        -		return true
        -	}
        -	if filepath.Base(x) == filepath.Base(y) { // (optimisation)
        -		if xi, err := os.Stat(x); err == nil {
        -			if yi, err := os.Stat(y); err == nil {
        -				return os.SameFile(xi, yi)
        -			}
        -		}
        -	}
        -	return false
        -}
        -
        -func unparen(e ast.Expr) ast.Expr { return astutil.Unparen(e) }
        diff --git a/vendor/golang.org/x/tools/refactor/satisfy/find.go b/vendor/golang.org/x/tools/refactor/satisfy/find.go
        deleted file mode 100644
        index 34b349e15..000000000
        --- a/vendor/golang.org/x/tools/refactor/satisfy/find.go
        +++ /dev/null
        @@ -1,705 +0,0 @@
        -// Copyright 2014 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -// Package satisfy inspects the type-checked ASTs of Go packages and
        -// reports the set of discovered type constraints of the form (lhs, rhs
        -// Type) where lhs is a non-trivial interface, rhs satisfies this
        -// interface, and this fact is necessary for the package to be
        -// well-typed.
        -//
        -// THIS PACKAGE IS EXPERIMENTAL AND MAY CHANGE AT ANY TIME.
        -//
        -// It is provided only for the gorename tool.  Ideally this
        -// functionality will become part of the type-checker in due course,
        -// since it is computing it anyway, and it is robust for ill-typed
        -// inputs, which this package is not.
        -//
        -package satisfy // import "golang.org/x/tools/refactor/satisfy"
        -
        -// NOTES:
        -//
        -// We don't care about numeric conversions, so we don't descend into
        -// types or constant expressions.  This is unsound because
        -// constant expressions can contain arbitrary statements, e.g.
        -//   const x = len([1]func(){func() {
        -//     ...
        -//   }})
        -//
        -// TODO(adonovan): make this robust against ill-typed input.
        -// Or move it into the type-checker.
        -//
        -// Assignability conversions are possible in the following places:
        -// - in assignments y = x, y := x, var y = x.
        -// - from call argument types to formal parameter types
        -// - in append and delete calls
        -// - from return operands to result parameter types
        -// - in composite literal T{k:v}, from k and v to T's field/element/key type
        -// - in map[key] from key to the map's key type
        -// - in comparisons x==y and switch x { case y: }.
        -// - in explicit conversions T(x)
        -// - in sends ch <- x, from x to the channel element type
        -// - in type assertions x.(T) and switch x.(type) { case T: }
        -//
        -// The results of this pass provide information equivalent to the
        -// ssa.MakeInterface and ssa.ChangeInterface instructions.
        -
        -import (
        -	"fmt"
        -	"go/ast"
        -	"go/token"
        -	"go/types"
        -
        -	"golang.org/x/tools/go/ast/astutil"
        -	"golang.org/x/tools/go/types/typeutil"
        -)
        -
        -// A Constraint records the fact that the RHS type does and must
        -// satisfy the LHS type, which is an interface.
        -// The names are suggestive of an assignment statement LHS = RHS.
        -type Constraint struct {
        -	LHS, RHS types.Type
        -}
        -
        -// A Finder inspects the type-checked ASTs of Go packages and
        -// accumulates the set of type constraints (x, y) such that x is
        -// assignable to y, y is an interface, and both x and y have methods.
        -//
        -// In other words, it returns the subset of the "implements" relation
        -// that is checked during compilation of a package.  Refactoring tools
        -// will need to preserve at least this part of the relation to ensure
        -// continued compilation.
        -//
        -type Finder struct {
        -	Result    map[Constraint]bool
        -	msetcache typeutil.MethodSetCache
        -
        -	// per-Find state
        -	info *types.Info
        -	sig  *types.Signature
        -}
        -
        -// Find inspects a single package, populating Result with its pairs of
        -// constrained types.
        -//
        -// The result is non-canonical and thus may contain duplicates (but this
        -// tends to preserves names of interface types better).
        -//
        -// The package must be free of type errors, and
        -// info.{Defs,Uses,Selections,Types} must have been populated by the
        -// type-checker.
        -//
        -func (f *Finder) Find(info *types.Info, files []*ast.File) {
        -	if f.Result == nil {
        -		f.Result = make(map[Constraint]bool)
        -	}
        -
        -	f.info = info
        -	for _, file := range files {
        -		for _, d := range file.Decls {
        -			switch d := d.(type) {
        -			case *ast.GenDecl:
        -				if d.Tok == token.VAR { // ignore consts
        -					for _, spec := range d.Specs {
        -						f.valueSpec(spec.(*ast.ValueSpec))
        -					}
        -				}
        -
        -			case *ast.FuncDecl:
        -				if d.Body != nil {
        -					f.sig = f.info.Defs[d.Name].Type().(*types.Signature)
        -					f.stmt(d.Body)
        -					f.sig = nil
        -				}
        -			}
        -		}
        -	}
        -	f.info = nil
        -}
        -
        -var (
        -	tInvalid     = types.Typ[types.Invalid]
        -	tUntypedBool = types.Typ[types.UntypedBool]
        -	tUntypedNil  = types.Typ[types.UntypedNil]
        -)
        -
        -// exprN visits an expression in a multi-value context.
        -func (f *Finder) exprN(e ast.Expr) types.Type {
        -	typ := f.info.Types[e].Type.(*types.Tuple)
        -	switch e := e.(type) {
        -	case *ast.ParenExpr:
        -		return f.exprN(e.X)
        -
        -	case *ast.CallExpr:
        -		// x, err := f(args)
        -		sig := f.expr(e.Fun).Underlying().(*types.Signature)
        -		f.call(sig, e.Args)
        -
        -	case *ast.IndexExpr:
        -		// y, ok := x[i]
        -		x := f.expr(e.X)
        -		f.assign(f.expr(e.Index), x.Underlying().(*types.Map).Key())
        -
        -	case *ast.TypeAssertExpr:
        -		// y, ok := x.(T)
        -		f.typeAssert(f.expr(e.X), typ.At(0).Type())
        -
        -	case *ast.UnaryExpr: // must be receive <-
        -		// y, ok := <-x
        -		f.expr(e.X)
        -
        -	default:
        -		panic(e)
        -	}
        -	return typ
        -}
        -
        -func (f *Finder) call(sig *types.Signature, args []ast.Expr) {
        -	if len(args) == 0 {
        -		return
        -	}
        -
        -	// Ellipsis call?  e.g. f(x, y, z...)
        -	if _, ok := args[len(args)-1].(*ast.Ellipsis); ok {
        -		for i, arg := range args {
        -			// The final arg is a slice, and so is the final param.
        -			f.assign(sig.Params().At(i).Type(), f.expr(arg))
        -		}
        -		return
        -	}
        -
        -	var argtypes []types.Type
        -
        -	// Gather the effective actual parameter types.
        -	if tuple, ok := f.info.Types[args[0]].Type.(*types.Tuple); ok {
        -		// f(g()) call where g has multiple results?
        -		f.expr(args[0])
        -		// unpack the tuple
        -		for i := 0; i < tuple.Len(); i++ {
        -			argtypes = append(argtypes, tuple.At(i).Type())
        -		}
        -	} else {
        -		for _, arg := range args {
        -			argtypes = append(argtypes, f.expr(arg))
        -		}
        -	}
        -
        -	// Assign the actuals to the formals.
        -	if !sig.Variadic() {
        -		for i, argtype := range argtypes {
        -			f.assign(sig.Params().At(i).Type(), argtype)
        -		}
        -	} else {
        -		// The first n-1 parameters are assigned normally.
        -		nnormals := sig.Params().Len() - 1
        -		for i, argtype := range argtypes[:nnormals] {
        -			f.assign(sig.Params().At(i).Type(), argtype)
        -		}
        -		// Remaining args are assigned to elements of varargs slice.
        -		tElem := sig.Params().At(nnormals).Type().(*types.Slice).Elem()
        -		for i := nnormals; i < len(argtypes); i++ {
        -			f.assign(tElem, argtypes[i])
        -		}
        -	}
        -}
        -
        -func (f *Finder) builtin(obj *types.Builtin, sig *types.Signature, args []ast.Expr, T types.Type) types.Type {
        -	switch obj.Name() {
        -	case "make", "new":
        -		// skip the type operand
        -		for _, arg := range args[1:] {
        -			f.expr(arg)
        -		}
        -
        -	case "append":
        -		s := f.expr(args[0])
        -		if _, ok := args[len(args)-1].(*ast.Ellipsis); ok && len(args) == 2 {
        -			// append(x, y...)   including append([]byte, "foo"...)
        -			f.expr(args[1])
        -		} else {
        -			// append(x, y, z)
        -			tElem := s.Underlying().(*types.Slice).Elem()
        -			for _, arg := range args[1:] {
        -				f.assign(tElem, f.expr(arg))
        -			}
        -		}
        -
        -	case "delete":
        -		m := f.expr(args[0])
        -		k := f.expr(args[1])
        -		f.assign(m.Underlying().(*types.Map).Key(), k)
        -
        -	default:
        -		// ordinary call
        -		f.call(sig, args)
        -	}
        -
        -	return T
        -}
        -
        -func (f *Finder) extract(tuple types.Type, i int) types.Type {
        -	if tuple, ok := tuple.(*types.Tuple); ok && i < tuple.Len() {
        -		return tuple.At(i).Type()
        -	}
        -	return tInvalid
        -}
        -
        -func (f *Finder) valueSpec(spec *ast.ValueSpec) {
        -	var T types.Type
        -	if spec.Type != nil {
        -		T = f.info.Types[spec.Type].Type
        -	}
        -	switch len(spec.Values) {
        -	case len(spec.Names): // e.g. var x, y = f(), g()
        -		for _, value := range spec.Values {
        -			v := f.expr(value)
        -			if T != nil {
        -				f.assign(T, v)
        -			}
        -		}
        -
        -	case 1: // e.g. var x, y = f()
        -		tuple := f.exprN(spec.Values[0])
        -		for i := range spec.Names {
        -			if T != nil {
        -				f.assign(T, f.extract(tuple, i))
        -			}
        -		}
        -	}
        -}
        -
        -// assign records pairs of distinct types that are related by
        -// assignability, where the left-hand side is an interface and both
        -// sides have methods.
        -//
        -// It should be called for all assignability checks, type assertions,
        -// explicit conversions and comparisons between two types, unless the
        -// types are uninteresting (e.g. lhs is a concrete type, or the empty
        -// interface; rhs has no methods).
        -//
        -func (f *Finder) assign(lhs, rhs types.Type) {
        -	if types.Identical(lhs, rhs) {
        -		return
        -	}
        -	if !isInterface(lhs) {
        -		return
        -	}
        -
        -	if f.msetcache.MethodSet(lhs).Len() == 0 {
        -		return
        -	}
        -	if f.msetcache.MethodSet(rhs).Len() == 0 {
        -		return
        -	}
        -	// record the pair
        -	f.Result[Constraint{lhs, rhs}] = true
        -}
        -
        -// typeAssert must be called for each type assertion x.(T) where x has
        -// interface type I.
        -func (f *Finder) typeAssert(I, T types.Type) {
        -	// Type assertions are slightly subtle, because they are allowed
        -	// to be "impossible", e.g.
        -	//
        -	// 	var x interface{f()}
        -	//	_ = x.(interface{f()int}) // legal
        -	//
        -	// (In hindsight, the language spec should probably not have
        -	// allowed this, but it's too late to fix now.)
        -	//
        -	// This means that a type assert from I to T isn't exactly a
        -	// constraint that T is assignable to I, but for a refactoring
        -	// tool it is a conditional constraint that, if T is assignable
        -	// to I before a refactoring, it should remain so after.
        -
        -	if types.AssignableTo(T, I) {
        -		f.assign(I, T)
        -	}
        -}
        -
        -// compare must be called for each comparison x==y.
        -func (f *Finder) compare(x, y types.Type) {
        -	if types.AssignableTo(x, y) {
        -		f.assign(y, x)
        -	} else if types.AssignableTo(y, x) {
        -		f.assign(x, y)
        -	}
        -}
        -
        -// expr visits a true expression (not a type or defining ident)
        -// and returns its type.
        -func (f *Finder) expr(e ast.Expr) types.Type {
        -	tv := f.info.Types[e]
        -	if tv.Value != nil {
        -		return tv.Type // prune the descent for constants
        -	}
        -
        -	// tv.Type may be nil for an ast.Ident.
        -
        -	switch e := e.(type) {
        -	case *ast.BadExpr, *ast.BasicLit:
        -		// no-op
        -
        -	case *ast.Ident:
        -		// (referring idents only)
        -		if obj, ok := f.info.Uses[e]; ok {
        -			return obj.Type()
        -		}
        -		if e.Name == "_" { // e.g. "for _ = range x"
        -			return tInvalid
        -		}
        -		panic("undefined ident: " + e.Name)
        -
        -	case *ast.Ellipsis:
        -		if e.Elt != nil {
        -			f.expr(e.Elt)
        -		}
        -
        -	case *ast.FuncLit:
        -		saved := f.sig
        -		f.sig = tv.Type.(*types.Signature)
        -		f.stmt(e.Body)
        -		f.sig = saved
        -
        -	case *ast.CompositeLit:
        -		switch T := deref(tv.Type).Underlying().(type) {
        -		case *types.Struct:
        -			for i, elem := range e.Elts {
        -				if kv, ok := elem.(*ast.KeyValueExpr); ok {
        -					f.assign(f.info.Uses[kv.Key.(*ast.Ident)].Type(), f.expr(kv.Value))
        -				} else {
        -					f.assign(T.Field(i).Type(), f.expr(elem))
        -				}
        -			}
        -
        -		case *types.Map:
        -			for _, elem := range e.Elts {
        -				elem := elem.(*ast.KeyValueExpr)
        -				f.assign(T.Key(), f.expr(elem.Key))
        -				f.assign(T.Elem(), f.expr(elem.Value))
        -			}
        -
        -		case *types.Array, *types.Slice:
        -			tElem := T.(interface {
        -				Elem() types.Type
        -			}).Elem()
        -			for _, elem := range e.Elts {
        -				if kv, ok := elem.(*ast.KeyValueExpr); ok {
        -					// ignore the key
        -					f.assign(tElem, f.expr(kv.Value))
        -				} else {
        -					f.assign(tElem, f.expr(elem))
        -				}
        -			}
        -
        -		default:
        -			panic("unexpected composite literal type: " + tv.Type.String())
        -		}
        -
        -	case *ast.ParenExpr:
        -		f.expr(e.X)
        -
        -	case *ast.SelectorExpr:
        -		if _, ok := f.info.Selections[e]; ok {
        -			f.expr(e.X) // selection
        -		} else {
        -			return f.info.Uses[e.Sel].Type() // qualified identifier
        -		}
        -
        -	case *ast.IndexExpr:
        -		x := f.expr(e.X)
        -		i := f.expr(e.Index)
        -		if ux, ok := x.Underlying().(*types.Map); ok {
        -			f.assign(ux.Key(), i)
        -		}
        -
        -	case *ast.SliceExpr:
        -		f.expr(e.X)
        -		if e.Low != nil {
        -			f.expr(e.Low)
        -		}
        -		if e.High != nil {
        -			f.expr(e.High)
        -		}
        -		if e.Max != nil {
        -			f.expr(e.Max)
        -		}
        -
        -	case *ast.TypeAssertExpr:
        -		x := f.expr(e.X)
        -		f.typeAssert(x, f.info.Types[e.Type].Type)
        -
        -	case *ast.CallExpr:
        -		if tvFun := f.info.Types[e.Fun]; tvFun.IsType() {
        -			// conversion
        -			arg0 := f.expr(e.Args[0])
        -			f.assign(tvFun.Type, arg0)
        -		} else {
        -			// function call
        -			if id, ok := unparen(e.Fun).(*ast.Ident); ok {
        -				if obj, ok := f.info.Uses[id].(*types.Builtin); ok {
        -					sig := f.info.Types[id].Type.(*types.Signature)
        -					return f.builtin(obj, sig, e.Args, tv.Type)
        -				}
        -			}
        -			// ordinary call
        -			f.call(f.expr(e.Fun).Underlying().(*types.Signature), e.Args)
        -		}
        -
        -	case *ast.StarExpr:
        -		f.expr(e.X)
        -
        -	case *ast.UnaryExpr:
        -		f.expr(e.X)
        -
        -	case *ast.BinaryExpr:
        -		x := f.expr(e.X)
        -		y := f.expr(e.Y)
        -		if e.Op == token.EQL || e.Op == token.NEQ {
        -			f.compare(x, y)
        -		}
        -
        -	case *ast.KeyValueExpr:
        -		f.expr(e.Key)
        -		f.expr(e.Value)
        -
        -	case *ast.ArrayType,
        -		*ast.StructType,
        -		*ast.FuncType,
        -		*ast.InterfaceType,
        -		*ast.MapType,
        -		*ast.ChanType:
        -		panic(e)
        -	}
        -
        -	if tv.Type == nil {
        -		panic(fmt.Sprintf("no type for %T", e))
        -	}
        -
        -	return tv.Type
        -}
        -
        -func (f *Finder) stmt(s ast.Stmt) {
        -	switch s := s.(type) {
        -	case *ast.BadStmt,
        -		*ast.EmptyStmt,
        -		*ast.BranchStmt:
        -		// no-op
        -
        -	case *ast.DeclStmt:
        -		d := s.Decl.(*ast.GenDecl)
        -		if d.Tok == token.VAR { // ignore consts
        -			for _, spec := range d.Specs {
        -				f.valueSpec(spec.(*ast.ValueSpec))
        -			}
        -		}
        -
        -	case *ast.LabeledStmt:
        -		f.stmt(s.Stmt)
        -
        -	case *ast.ExprStmt:
        -		f.expr(s.X)
        -
        -	case *ast.SendStmt:
        -		ch := f.expr(s.Chan)
        -		val := f.expr(s.Value)
        -		f.assign(ch.Underlying().(*types.Chan).Elem(), val)
        -
        -	case *ast.IncDecStmt:
        -		f.expr(s.X)
        -
        -	case *ast.AssignStmt:
        -		switch s.Tok {
        -		case token.ASSIGN, token.DEFINE:
        -			// y := x   or   y = x
        -			var rhsTuple types.Type
        -			if len(s.Lhs) != len(s.Rhs) {
        -				rhsTuple = f.exprN(s.Rhs[0])
        -			}
        -			for i := range s.Lhs {
        -				var lhs, rhs types.Type
        -				if rhsTuple == nil {
        -					rhs = f.expr(s.Rhs[i]) // 1:1 assignment
        -				} else {
        -					rhs = f.extract(rhsTuple, i) // n:1 assignment
        -				}
        -
        -				if id, ok := s.Lhs[i].(*ast.Ident); ok {
        -					if id.Name != "_" {
        -						if obj, ok := f.info.Defs[id]; ok {
        -							lhs = obj.Type() // definition
        -						}
        -					}
        -				}
        -				if lhs == nil {
        -					lhs = f.expr(s.Lhs[i]) // assignment
        -				}
        -				f.assign(lhs, rhs)
        -			}
        -
        -		default:
        -			// y op= x
        -			f.expr(s.Lhs[0])
        -			f.expr(s.Rhs[0])
        -		}
        -
        -	case *ast.GoStmt:
        -		f.expr(s.Call)
        -
        -	case *ast.DeferStmt:
        -		f.expr(s.Call)
        -
        -	case *ast.ReturnStmt:
        -		formals := f.sig.Results()
        -		switch len(s.Results) {
        -		case formals.Len(): // 1:1
        -			for i, result := range s.Results {
        -				f.assign(formals.At(i).Type(), f.expr(result))
        -			}
        -
        -		case 1: // n:1
        -			tuple := f.exprN(s.Results[0])
        -			for i := 0; i < formals.Len(); i++ {
        -				f.assign(formals.At(i).Type(), f.extract(tuple, i))
        -			}
        -		}
        -
        -	case *ast.SelectStmt:
        -		f.stmt(s.Body)
        -
        -	case *ast.BlockStmt:
        -		for _, s := range s.List {
        -			f.stmt(s)
        -		}
        -
        -	case *ast.IfStmt:
        -		if s.Init != nil {
        -			f.stmt(s.Init)
        -		}
        -		f.expr(s.Cond)
        -		f.stmt(s.Body)
        -		if s.Else != nil {
        -			f.stmt(s.Else)
        -		}
        -
        -	case *ast.SwitchStmt:
        -		if s.Init != nil {
        -			f.stmt(s.Init)
        -		}
        -		var tag types.Type = tUntypedBool
        -		if s.Tag != nil {
        -			tag = f.expr(s.Tag)
        -		}
        -		for _, cc := range s.Body.List {
        -			cc := cc.(*ast.CaseClause)
        -			for _, cond := range cc.List {
        -				f.compare(tag, f.info.Types[cond].Type)
        -			}
        -			for _, s := range cc.Body {
        -				f.stmt(s)
        -			}
        -		}
        -
        -	case *ast.TypeSwitchStmt:
        -		if s.Init != nil {
        -			f.stmt(s.Init)
        -		}
        -		var I types.Type
        -		switch ass := s.Assign.(type) {
        -		case *ast.ExprStmt: // x.(type)
        -			I = f.expr(unparen(ass.X).(*ast.TypeAssertExpr).X)
        -		case *ast.AssignStmt: // y := x.(type)
        -			I = f.expr(unparen(ass.Rhs[0]).(*ast.TypeAssertExpr).X)
        -		}
        -		for _, cc := range s.Body.List {
        -			cc := cc.(*ast.CaseClause)
        -			for _, cond := range cc.List {
        -				tCase := f.info.Types[cond].Type
        -				if tCase != tUntypedNil {
        -					f.typeAssert(I, tCase)
        -				}
        -			}
        -			for _, s := range cc.Body {
        -				f.stmt(s)
        -			}
        -		}
        -
        -	case *ast.CommClause:
        -		if s.Comm != nil {
        -			f.stmt(s.Comm)
        -		}
        -		for _, s := range s.Body {
        -			f.stmt(s)
        -		}
        -
        -	case *ast.ForStmt:
        -		if s.Init != nil {
        -			f.stmt(s.Init)
        -		}
        -		if s.Cond != nil {
        -			f.expr(s.Cond)
        -		}
        -		if s.Post != nil {
        -			f.stmt(s.Post)
        -		}
        -		f.stmt(s.Body)
        -
        -	case *ast.RangeStmt:
        -		x := f.expr(s.X)
        -		// No conversions are involved when Tok==DEFINE.
        -		if s.Tok == token.ASSIGN {
        -			if s.Key != nil {
        -				k := f.expr(s.Key)
        -				var xelem types.Type
        -				// keys of array, *array, slice, string aren't interesting
        -				switch ux := x.Underlying().(type) {
        -				case *types.Chan:
        -					xelem = ux.Elem()
        -				case *types.Map:
        -					xelem = ux.Key()
        -				}
        -				if xelem != nil {
        -					f.assign(xelem, k)
        -				}
        -			}
        -			if s.Value != nil {
        -				val := f.expr(s.Value)
        -				var xelem types.Type
        -				// values of strings aren't interesting
        -				switch ux := x.Underlying().(type) {
        -				case *types.Array:
        -					xelem = ux.Elem()
        -				case *types.Chan:
        -					xelem = ux.Elem()
        -				case *types.Map:
        -					xelem = ux.Elem()
        -				case *types.Pointer: // *array
        -					xelem = deref(ux).(*types.Array).Elem()
        -				case *types.Slice:
        -					xelem = ux.Elem()
        -				}
        -				if xelem != nil {
        -					f.assign(xelem, val)
        -				}
        -			}
        -		}
        -		f.stmt(s.Body)
        -
        -	default:
        -		panic(s)
        -	}
        -}
        -
        -// -- Plundered from golang.org/x/tools/go/ssa -----------------
        -
        -// deref returns a pointer's element type; otherwise it returns typ.
        -func deref(typ types.Type) types.Type {
        -	if p, ok := typ.Underlying().(*types.Pointer); ok {
        -		return p.Elem()
        -	}
        -	return typ
        -}
        -
        -func unparen(e ast.Expr) ast.Expr { return astutil.Unparen(e) }
        -
        -func isInterface(T types.Type) bool { return types.IsInterface(T) }
        diff --git a/vendor/golang.org/x/xerrors/LICENSE b/vendor/golang.org/x/xerrors/LICENSE
        deleted file mode 100644
        index e4a47e17f..000000000
        --- a/vendor/golang.org/x/xerrors/LICENSE
        +++ /dev/null
        @@ -1,27 +0,0 @@
        -Copyright (c) 2019 The Go Authors. All rights reserved.
        -
        -Redistribution and use in source and binary forms, with or without
        -modification, are permitted provided that the following conditions are
        -met:
        -
        -   * Redistributions of source code must retain the above copyright
        -notice, this list of conditions and the following disclaimer.
        -   * Redistributions in binary form must reproduce the above
        -copyright notice, this list of conditions and the following disclaimer
        -in the documentation and/or other materials provided with the
        -distribution.
        -   * Neither the name of Google Inc. nor the names of its
        -contributors may be used to endorse or promote products derived from
        -this software without specific prior written permission.
        -
        -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
        -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
        -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
        -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
        -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
        -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
        -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
        -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
        -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
        -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        diff --git a/vendor/golang.org/x/xerrors/PATENTS b/vendor/golang.org/x/xerrors/PATENTS
        deleted file mode 100644
        index 733099041..000000000
        --- a/vendor/golang.org/x/xerrors/PATENTS
        +++ /dev/null
        @@ -1,22 +0,0 @@
        -Additional IP Rights Grant (Patents)
        -
        -"This implementation" means the copyrightable works distributed by
        -Google as part of the Go project.
        -
        -Google hereby grants to You a perpetual, worldwide, non-exclusive,
        -no-charge, royalty-free, irrevocable (except as stated in this section)
        -patent license to make, have made, use, offer to sell, sell, import,
        -transfer and otherwise run, modify and propagate the contents of this
        -implementation of Go, where such license applies only to those patent
        -claims, both currently owned or controlled by Google and acquired in
        -the future, licensable by Google that are necessarily infringed by this
        -implementation of Go.  This grant does not include claims that would be
        -infringed only as a consequence of further modification of this
        -implementation.  If you or your agent or exclusive licensee institute or
        -order or agree to the institution of patent litigation against any
        -entity (including a cross-claim or counterclaim in a lawsuit) alleging
        -that this implementation of Go or any code incorporated within this
        -implementation of Go constitutes direct or contributory patent
        -infringement, or inducement of patent infringement, then any patent
        -rights granted to you under this License for this implementation of Go
        -shall terminate as of the date such litigation is filed.
        diff --git a/vendor/golang.org/x/xerrors/README b/vendor/golang.org/x/xerrors/README
        deleted file mode 100644
        index aac7867a5..000000000
        --- a/vendor/golang.org/x/xerrors/README
        +++ /dev/null
        @@ -1,2 +0,0 @@
        -This repository holds the transition packages for the new Go 1.13 error values.
        -See golang.org/design/29934-error-values.
        diff --git a/vendor/golang.org/x/xerrors/adaptor.go b/vendor/golang.org/x/xerrors/adaptor.go
        deleted file mode 100644
        index 4317f2483..000000000
        --- a/vendor/golang.org/x/xerrors/adaptor.go
        +++ /dev/null
        @@ -1,193 +0,0 @@
        -// Copyright 2018 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package xerrors
        -
        -import (
        -	"bytes"
        -	"fmt"
        -	"io"
        -	"reflect"
        -	"strconv"
        -)
        -
        -// FormatError calls the FormatError method of f with an errors.Printer
        -// configured according to s and verb, and writes the result to s.
        -func FormatError(f Formatter, s fmt.State, verb rune) {
        -	// Assuming this function is only called from the Format method, and given
        -	// that FormatError takes precedence over Format, it cannot be called from
        -	// any package that supports errors.Formatter. It is therefore safe to
        -	// disregard that State may be a specific printer implementation and use one
        -	// of our choice instead.
        -
        -	// limitations: does not support printing error as Go struct.
        -
        -	var (
        -		sep    = " " // separator before next error
        -		p      = &state{State: s}
        -		direct = true
        -	)
        -
        -	var err error = f
        -
        -	switch verb {
        -	// Note that this switch must match the preference order
        -	// for ordinary string printing (%#v before %+v, and so on).
        -
        -	case 'v':
        -		if s.Flag('#') {
        -			if stringer, ok := err.(fmt.GoStringer); ok {
        -				io.WriteString(&p.buf, stringer.GoString())
        -				goto exit
        -			}
        -			// proceed as if it were %v
        -		} else if s.Flag('+') {
        -			p.printDetail = true
        -			sep = "\n  - "
        -		}
        -	case 's':
        -	case 'q', 'x', 'X':
        -		// Use an intermediate buffer in the rare cases that precision,
        -		// truncation, or one of the alternative verbs (q, x, and X) are
        -		// specified.
        -		direct = false
        -
        -	default:
        -		p.buf.WriteString("%!")
        -		p.buf.WriteRune(verb)
        -		p.buf.WriteByte('(')
        -		switch {
        -		case err != nil:
        -			p.buf.WriteString(reflect.TypeOf(f).String())
        -		default:
        -			p.buf.WriteString("")
        -		}
        -		p.buf.WriteByte(')')
        -		io.Copy(s, &p.buf)
        -		return
        -	}
        -
        -loop:
        -	for {
        -		switch v := err.(type) {
        -		case Formatter:
        -			err = v.FormatError((*printer)(p))
        -		case fmt.Formatter:
        -			v.Format(p, 'v')
        -			break loop
        -		default:
        -			io.WriteString(&p.buf, v.Error())
        -			break loop
        -		}
        -		if err == nil {
        -			break
        -		}
        -		if p.needColon || !p.printDetail {
        -			p.buf.WriteByte(':')
        -			p.needColon = false
        -		}
        -		p.buf.WriteString(sep)
        -		p.inDetail = false
        -		p.needNewline = false
        -	}
        -
        -exit:
        -	width, okW := s.Width()
        -	prec, okP := s.Precision()
        -
        -	if !direct || (okW && width > 0) || okP {
        -		// Construct format string from State s.
        -		format := []byte{'%'}
        -		if s.Flag('-') {
        -			format = append(format, '-')
        -		}
        -		if s.Flag('+') {
        -			format = append(format, '+')
        -		}
        -		if s.Flag(' ') {
        -			format = append(format, ' ')
        -		}
        -		if okW {
        -			format = strconv.AppendInt(format, int64(width), 10)
        -		}
        -		if okP {
        -			format = append(format, '.')
        -			format = strconv.AppendInt(format, int64(prec), 10)
        -		}
        -		format = append(format, string(verb)...)
        -		fmt.Fprintf(s, string(format), p.buf.String())
        -	} else {
        -		io.Copy(s, &p.buf)
        -	}
        -}
        -
        -var detailSep = []byte("\n    ")
        -
        -// state tracks error printing state. It implements fmt.State.
        -type state struct {
        -	fmt.State
        -	buf bytes.Buffer
        -
        -	printDetail bool
        -	inDetail    bool
        -	needColon   bool
        -	needNewline bool
        -}
        -
        -func (s *state) Write(b []byte) (n int, err error) {
        -	if s.printDetail {
        -		if len(b) == 0 {
        -			return 0, nil
        -		}
        -		if s.inDetail && s.needColon {
        -			s.needNewline = true
        -			if b[0] == '\n' {
        -				b = b[1:]
        -			}
        -		}
        -		k := 0
        -		for i, c := range b {
        -			if s.needNewline {
        -				if s.inDetail && s.needColon {
        -					s.buf.WriteByte(':')
        -					s.needColon = false
        -				}
        -				s.buf.Write(detailSep)
        -				s.needNewline = false
        -			}
        -			if c == '\n' {
        -				s.buf.Write(b[k:i])
        -				k = i + 1
        -				s.needNewline = true
        -			}
        -		}
        -		s.buf.Write(b[k:])
        -		if !s.inDetail {
        -			s.needColon = true
        -		}
        -	} else if !s.inDetail {
        -		s.buf.Write(b)
        -	}
        -	return len(b), nil
        -}
        -
        -// printer wraps a state to implement an xerrors.Printer.
        -type printer state
        -
        -func (s *printer) Print(args ...interface{}) {
        -	if !s.inDetail || s.printDetail {
        -		fmt.Fprint((*state)(s), args...)
        -	}
        -}
        -
        -func (s *printer) Printf(format string, args ...interface{}) {
        -	if !s.inDetail || s.printDetail {
        -		fmt.Fprintf((*state)(s), format, args...)
        -	}
        -}
        -
        -func (s *printer) Detail() bool {
        -	s.inDetail = true
        -	return s.printDetail
        -}
        diff --git a/vendor/golang.org/x/xerrors/codereview.cfg b/vendor/golang.org/x/xerrors/codereview.cfg
        deleted file mode 100644
        index 3f8b14b64..000000000
        --- a/vendor/golang.org/x/xerrors/codereview.cfg
        +++ /dev/null
        @@ -1 +0,0 @@
        -issuerepo: golang/go
        diff --git a/vendor/golang.org/x/xerrors/doc.go b/vendor/golang.org/x/xerrors/doc.go
        deleted file mode 100644
        index eef99d9d5..000000000
        --- a/vendor/golang.org/x/xerrors/doc.go
        +++ /dev/null
        @@ -1,22 +0,0 @@
        -// Copyright 2019 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -// Package xerrors implements functions to manipulate errors.
        -//
        -// This package is based on the Go 2 proposal for error values:
        -//   https://golang.org/design/29934-error-values
        -//
        -// These functions were incorporated into the standard library's errors package
        -// in Go 1.13:
        -// - Is
        -// - As
        -// - Unwrap
        -//
        -// Also, Errorf's %w verb was incorporated into fmt.Errorf.
        -//
        -// Use this package to get equivalent behavior in all supported Go versions.
        -//
        -// No other features of this package were included in Go 1.13, and at present
        -// there are no plans to include any of them.
        -package xerrors // import "golang.org/x/xerrors"
        diff --git a/vendor/golang.org/x/xerrors/errors.go b/vendor/golang.org/x/xerrors/errors.go
        deleted file mode 100644
        index e88d3772d..000000000
        --- a/vendor/golang.org/x/xerrors/errors.go
        +++ /dev/null
        @@ -1,33 +0,0 @@
        -// Copyright 2011 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package xerrors
        -
        -import "fmt"
        -
        -// errorString is a trivial implementation of error.
        -type errorString struct {
        -	s     string
        -	frame Frame
        -}
        -
        -// New returns an error that formats as the given text.
        -//
        -// The returned error contains a Frame set to the caller's location and
        -// implements Formatter to show this information when printed with details.
        -func New(text string) error {
        -	return &errorString{text, Caller(1)}
        -}
        -
        -func (e *errorString) Error() string {
        -	return e.s
        -}
        -
        -func (e *errorString) Format(s fmt.State, v rune) { FormatError(e, s, v) }
        -
        -func (e *errorString) FormatError(p Printer) (next error) {
        -	p.Print(e.s)
        -	e.frame.Format(p)
        -	return nil
        -}
        diff --git a/vendor/golang.org/x/xerrors/fmt.go b/vendor/golang.org/x/xerrors/fmt.go
        deleted file mode 100644
        index 74c1c93ec..000000000
        --- a/vendor/golang.org/x/xerrors/fmt.go
        +++ /dev/null
        @@ -1,109 +0,0 @@
        -// Copyright 2018 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package xerrors
        -
        -import (
        -	"fmt"
        -	"strings"
        -
        -	"golang.org/x/xerrors/internal"
        -)
        -
        -// Errorf formats according to a format specifier and returns the string as a
        -// value that satisfies error.
        -//
        -// The returned error includes the file and line number of the caller when
        -// formatted with additional detail enabled. If the last argument is an error
        -// the returned error's Format method will return it if the format string ends
        -// with ": %s", ": %v", or ": %w". If the last argument is an error and the
        -// format string ends with ": %w", the returned error implements Wrapper
        -// with an Unwrap method returning it.
        -func Errorf(format string, a ...interface{}) error {
        -	err, wrap := lastError(format, a)
        -	format = formatPlusW(format)
        -	if err == nil {
        -		return &noWrapError{fmt.Sprintf(format, a...), nil, Caller(1)}
        -	}
        -
        -	// TODO: this is not entirely correct. The error value could be
        -	// printed elsewhere in format if it mixes numbered with unnumbered
        -	// substitutions. With relatively small changes to doPrintf we can
        -	// have it optionally ignore extra arguments and pass the argument
        -	// list in its entirety.
        -	msg := fmt.Sprintf(format[:len(format)-len(": %s")], a[:len(a)-1]...)
        -	frame := Frame{}
        -	if internal.EnableTrace {
        -		frame = Caller(1)
        -	}
        -	if wrap {
        -		return &wrapError{msg, err, frame}
        -	}
        -	return &noWrapError{msg, err, frame}
        -}
        -
        -// formatPlusW is used to avoid the vet check that will barf at %w.
        -func formatPlusW(s string) string {
        -	return s
        -}
        -
        -func lastError(format string, a []interface{}) (err error, wrap bool) {
        -	wrap = strings.HasSuffix(format, ": %w")
        -	if !wrap &&
        -		!strings.HasSuffix(format, ": %s") &&
        -		!strings.HasSuffix(format, ": %v") {
        -		return nil, false
        -	}
        -
        -	if len(a) == 0 {
        -		return nil, false
        -	}
        -
        -	err, ok := a[len(a)-1].(error)
        -	if !ok {
        -		return nil, false
        -	}
        -
        -	return err, wrap
        -}
        -
        -type noWrapError struct {
        -	msg   string
        -	err   error
        -	frame Frame
        -}
        -
        -func (e *noWrapError) Error() string {
        -	return fmt.Sprint(e)
        -}
        -
        -func (e *noWrapError) Format(s fmt.State, v rune) { FormatError(e, s, v) }
        -
        -func (e *noWrapError) FormatError(p Printer) (next error) {
        -	p.Print(e.msg)
        -	e.frame.Format(p)
        -	return e.err
        -}
        -
        -type wrapError struct {
        -	msg   string
        -	err   error
        -	frame Frame
        -}
        -
        -func (e *wrapError) Error() string {
        -	return fmt.Sprint(e)
        -}
        -
        -func (e *wrapError) Format(s fmt.State, v rune) { FormatError(e, s, v) }
        -
        -func (e *wrapError) FormatError(p Printer) (next error) {
        -	p.Print(e.msg)
        -	e.frame.Format(p)
        -	return e.err
        -}
        -
        -func (e *wrapError) Unwrap() error {
        -	return e.err
        -}
        diff --git a/vendor/golang.org/x/xerrors/format.go b/vendor/golang.org/x/xerrors/format.go
        deleted file mode 100644
        index 1bc9c26b9..000000000
        --- a/vendor/golang.org/x/xerrors/format.go
        +++ /dev/null
        @@ -1,34 +0,0 @@
        -// Copyright 2018 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package xerrors
        -
        -// A Formatter formats error messages.
        -type Formatter interface {
        -	error
        -
        -	// FormatError prints the receiver's first error and returns the next error in
        -	// the error chain, if any.
        -	FormatError(p Printer) (next error)
        -}
        -
        -// A Printer formats error messages.
        -//
        -// The most common implementation of Printer is the one provided by package fmt
        -// during Printf (as of Go 1.13). Localization packages such as golang.org/x/text/message
        -// typically provide their own implementations.
        -type Printer interface {
        -	// Print appends args to the message output.
        -	Print(args ...interface{})
        -
        -	// Printf writes a formatted string.
        -	Printf(format string, args ...interface{})
        -
        -	// Detail reports whether error detail is requested.
        -	// After the first call to Detail, all text written to the Printer
        -	// is formatted as additional detail, or ignored when
        -	// detail has not been requested.
        -	// If Detail returns false, the caller can avoid printing the detail at all.
        -	Detail() bool
        -}
        diff --git a/vendor/golang.org/x/xerrors/frame.go b/vendor/golang.org/x/xerrors/frame.go
        deleted file mode 100644
        index 0de628ec5..000000000
        --- a/vendor/golang.org/x/xerrors/frame.go
        +++ /dev/null
        @@ -1,56 +0,0 @@
        -// Copyright 2018 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package xerrors
        -
        -import (
        -	"runtime"
        -)
        -
        -// A Frame contains part of a call stack.
        -type Frame struct {
        -	// Make room for three PCs: the one we were asked for, what it called,
        -	// and possibly a PC for skipPleaseUseCallersFrames. See:
        -	// https://go.googlesource.com/go/+/032678e0fb/src/runtime/extern.go#169
        -	frames [3]uintptr
        -}
        -
        -// Caller returns a Frame that describes a frame on the caller's stack.
        -// The argument skip is the number of frames to skip over.
        -// Caller(0) returns the frame for the caller of Caller.
        -func Caller(skip int) Frame {
        -	var s Frame
        -	runtime.Callers(skip+1, s.frames[:])
        -	return s
        -}
        -
        -// location reports the file, line, and function of a frame.
        -//
        -// The returned function may be "" even if file and line are not.
        -func (f Frame) location() (function, file string, line int) {
        -	frames := runtime.CallersFrames(f.frames[:])
        -	if _, ok := frames.Next(); !ok {
        -		return "", "", 0
        -	}
        -	fr, ok := frames.Next()
        -	if !ok {
        -		return "", "", 0
        -	}
        -	return fr.Function, fr.File, fr.Line
        -}
        -
        -// Format prints the stack as error detail.
        -// It should be called from an error's Format implementation
        -// after printing any other error detail.
        -func (f Frame) Format(p Printer) {
        -	if p.Detail() {
        -		function, file, line := f.location()
        -		if function != "" {
        -			p.Printf("%s\n    ", function)
        -		}
        -		if file != "" {
        -			p.Printf("%s:%d\n", file, line)
        -		}
        -	}
        -}
        diff --git a/vendor/golang.org/x/xerrors/go.mod b/vendor/golang.org/x/xerrors/go.mod
        deleted file mode 100644
        index 870d4f612..000000000
        --- a/vendor/golang.org/x/xerrors/go.mod
        +++ /dev/null
        @@ -1,3 +0,0 @@
        -module golang.org/x/xerrors
        -
        -go 1.11
        diff --git a/vendor/golang.org/x/xerrors/internal/internal.go b/vendor/golang.org/x/xerrors/internal/internal.go
        deleted file mode 100644
        index 89f4eca5d..000000000
        --- a/vendor/golang.org/x/xerrors/internal/internal.go
        +++ /dev/null
        @@ -1,8 +0,0 @@
        -// Copyright 2018 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package internal
        -
        -// EnableTrace indicates whether stack information should be recorded in errors.
        -var EnableTrace = true
        diff --git a/vendor/golang.org/x/xerrors/wrap.go b/vendor/golang.org/x/xerrors/wrap.go
        deleted file mode 100644
        index 9a3b51037..000000000
        --- a/vendor/golang.org/x/xerrors/wrap.go
        +++ /dev/null
        @@ -1,106 +0,0 @@
        -// Copyright 2018 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package xerrors
        -
        -import (
        -	"reflect"
        -)
        -
        -// A Wrapper provides context around another error.
        -type Wrapper interface {
        -	// Unwrap returns the next error in the error chain.
        -	// If there is no next error, Unwrap returns nil.
        -	Unwrap() error
        -}
        -
        -// Opaque returns an error with the same error formatting as err
        -// but that does not match err and cannot be unwrapped.
        -func Opaque(err error) error {
        -	return noWrapper{err}
        -}
        -
        -type noWrapper struct {
        -	error
        -}
        -
        -func (e noWrapper) FormatError(p Printer) (next error) {
        -	if f, ok := e.error.(Formatter); ok {
        -		return f.FormatError(p)
        -	}
        -	p.Print(e.error)
        -	return nil
        -}
        -
        -// Unwrap returns the result of calling the Unwrap method on err, if err implements
        -// Unwrap. Otherwise, Unwrap returns nil.
        -func Unwrap(err error) error {
        -	u, ok := err.(Wrapper)
        -	if !ok {
        -		return nil
        -	}
        -	return u.Unwrap()
        -}
        -
        -// Is reports whether any error in err's chain matches target.
        -//
        -// An error is considered to match a target if it is equal to that target or if
        -// it implements a method Is(error) bool such that Is(target) returns true.
        -func Is(err, target error) bool {
        -	if target == nil {
        -		return err == target
        -	}
        -
        -	isComparable := reflect.TypeOf(target).Comparable()
        -	for {
        -		if isComparable && err == target {
        -			return true
        -		}
        -		if x, ok := err.(interface{ Is(error) bool }); ok && x.Is(target) {
        -			return true
        -		}
        -		// TODO: consider supporing target.Is(err). This would allow
        -		// user-definable predicates, but also may allow for coping with sloppy
        -		// APIs, thereby making it easier to get away with them.
        -		if err = Unwrap(err); err == nil {
        -			return false
        -		}
        -	}
        -}
        -
        -// As finds the first error in err's chain that matches the type to which target
        -// points, and if so, sets the target to its value and returns true. An error
        -// matches a type if it is assignable to the target type, or if it has a method
        -// As(interface{}) bool such that As(target) returns true. As will panic if target
        -// is not a non-nil pointer to a type which implements error or is of interface type.
        -//
        -// The As method should set the target to its value and return true if err
        -// matches the type to which target points.
        -func As(err error, target interface{}) bool {
        -	if target == nil {
        -		panic("errors: target cannot be nil")
        -	}
        -	val := reflect.ValueOf(target)
        -	typ := val.Type()
        -	if typ.Kind() != reflect.Ptr || val.IsNil() {
        -		panic("errors: target must be a non-nil pointer")
        -	}
        -	if e := typ.Elem(); e.Kind() != reflect.Interface && !e.Implements(errorType) {
        -		panic("errors: *target must be interface or implement error")
        -	}
        -	targetType := typ.Elem()
        -	for err != nil {
        -		if reflect.TypeOf(err).AssignableTo(targetType) {
        -			val.Elem().Set(reflect.ValueOf(err))
        -			return true
        -		}
        -		if x, ok := err.(interface{ As(interface{}) bool }); ok && x.As(target) {
        -			return true
        -		}
        -		err = Unwrap(err)
        -	}
        -	return false
        -}
        -
        -var errorType = reflect.TypeOf((*error)(nil)).Elem()
        diff --git a/vendor/gonum.org/v1/gonum/AUTHORS b/vendor/gonum.org/v1/gonum/AUTHORS
        index f8a1701c6..08848ecea 100644
        --- a/vendor/gonum.org/v1/gonum/AUTHORS
        +++ b/vendor/gonum.org/v1/gonum/AUTHORS
        @@ -1,4 +1,4 @@
        -# This is the official list of gonum authors for copyright purposes.
        +# This is the official list of Gonum authors for copyright purposes.
         # This file is distinct from the CONTRIBUTORS files.
         # See the latter for an explanation.
         
        @@ -8,18 +8,27 @@
         
         # Please keep the list sorted.
         
        -Brendan Tracey 
        +Alexander Egurnov 
        +Andrei Blinnikov 
         Bill Gray 
         Bill Noon 
        +Brendan Tracey 
         Brent Pedersen 
         Chad Kunde 
         Chih-Wei Chang 
         Chris Tessum 
        +Christophe Meessen 
        +Clayton Northey 
         Dan Kortschak  
         Daniel Fireman 
        +Dario Heinisch 
        +David Kleiven 
         David Samborski 
         Davor Kapsa 
         DeepMind Technologies
        +Delaney Gillilan 
        +Dezmond Goff 
        +Dong-hee Na 
         Egon Elbre 
         Ekaterina Efimova 
         Ethan Burns 
        @@ -30,40 +39,49 @@ Francesc Campoy 
         Google Inc
         Gustaf Johansson 
         Iakov Davydov 
        +Igor Mikushkin 
        +Iskander Sharipov 
         Jalem Raj Rohit 
         James Bell 
         James Bowman 
         James Holmes <32bitkid@gmail.com>
         Janne Snabb 
        -Jeff Juozapaitis 
         Jeremy Atkinson 
         Jonas Kahler 
        +Jonas Schulze 
         Jonathan J Lawlor 
        +Jonathan Reiter 
         Jonathan Schroeder 
         Joseph Watson 
         Josh Wilson 
         Julien Roland 
        +Kai Trukenmüller 
         Kent English 
         Kevin C. Zimmerman 
        +Kirill Motkov 
         Konstantin Shaposhnikov 
         Leonid Kneller 
         Lyron Winderbaum 
        +Martin Diz 
         Matthieu Di Mercurio 
         Max Halford 
         MinJae Kwon 
        +Nathan Edwards 
        +Nick Potts 
        +Nils Wogatzky 
         Olivier Wulveryck 
         Or Rikon 
         Pontus Melke 
         Renée French
         Rishi Desai 
         Robin Eklind 
        -Samuel Kelemen 
         Sam Zaydel 
        +Samuel Kelemen 
         Saran Ahluwalia 
         Scott Holden 
         Sebastien Binet 
        -source{d} 
         Shawn Smith 
        +source{d} 
         Spencer Lyon 
         Steve McCoy 
         Taesu Pyo 
        @@ -71,7 +89,10 @@ Takeshi Yoneda 
         The University of Adelaide
         The University of Minnesota
         The University of Washington
        +Thomas Berg 
         Tobin Harding 
         Vincent Thiery 
         Vladimír Chalupecký 
         Yevgeniy Vahlis 
        +Yucheng Zhu 
        +Zoe Juozapaitis
        diff --git a/vendor/gonum.org/v1/gonum/CONTRIBUTORS b/vendor/gonum.org/v1/gonum/CONTRIBUTORS
        index a84c47bc2..37262444c 100644
        --- a/vendor/gonum.org/v1/gonum/CONTRIBUTORS
        +++ b/vendor/gonum.org/v1/gonum/CONTRIBUTORS
        @@ -1,6 +1,6 @@
         # This is the official list of people who can contribute
        -# (and typically have contributed) code to the gonum
        -# repository.
        +# (and typically have contributed) code to the Gonum
        +# project.
         #
         # The AUTHORS file lists the copyright holders; this file
         # lists people.  For example, Google employees would be listed here
        @@ -15,18 +15,27 @@
         #
         # Please keep the list sorted.
         
        +Alexander Egurnov 
        +Andrei Blinnikov 
         Andrew Brampton 
        -Brendan Tracey 
         Bill Gray 
         Bill Noon 
        +Brendan Tracey 
         Brent Pedersen 
         Chad Kunde 
         Chih-Wei Chang 
         Chris Tessum 
        +Christophe Meessen 
        +Clayton Northey 
         Dan Kortschak  
         Daniel Fireman 
        +Dario Heinisch 
        +David Kleiven 
         David Samborski 
         Davor Kapsa 
        +Delaney Gillilan 
        +Dezmond Goff 
        +Dong-hee Na 
         Egon Elbre 
         Ekaterina Efimova 
         Ethan Burns 
        @@ -36,35 +45,44 @@ Fazlul Shahriar 
         Francesc Campoy 
         Gustaf Johansson 
         Iakov Davydov 
        +Igor Mikushkin 
        +Iskander Sharipov 
         Jalem Raj Rohit 
         James Bell 
         James Bowman 
         James Holmes <32bitkid@gmail.com>
         Janne Snabb 
        -Jeff Juozapaitis 
         Jeremy Atkinson 
         Jonas Kahler 
        +Jonas Schulze 
         Jonathan J Lawlor 
        +Jonathan Reiter 
         Jonathan Schroeder 
         Joseph Watson 
         Josh Wilson 
         Julien Roland 
        +Kai Trukenmüller 
         Kent English 
         Kevin C. Zimmerman 
        +Kirill Motkov 
         Konstantin Shaposhnikov 
         Leonid Kneller 
         Lyron Winderbaum 
        +Martin Diz 
         Matthieu Di Mercurio 
         Max Halford 
         MinJae Kwon 
        +Nathan Edwards 
        +Nick Potts 
        +Nils Wogatzky 
         Olivier Wulveryck 
         Or Rikon 
         Pontus Melke 
         Renée French
         Rishi Desai 
         Robin Eklind 
        -Samuel Kelemen 
         Sam Zaydel 
        +Samuel Kelemen 
         Saran Ahluwalia 
         Scott Holden 
         Sebastien Binet 
        @@ -73,7 +91,10 @@ Spencer Lyon 
         Steve McCoy 
         Taesu Pyo 
         Takeshi Yoneda 
        +Thomas Berg 
         Tobin Harding 
         Vincent Thiery 
         Vladimír Chalupecký 
         Yevgeniy Vahlis 
        +Yucheng Zhu 
        +Zoe Juozapaitis
        diff --git a/vendor/gonum.org/v1/gonum/LICENSE b/vendor/gonum.org/v1/gonum/LICENSE
        index 5f1c3f9cc..ed477e59b 100644
        --- a/vendor/gonum.org/v1/gonum/LICENSE
        +++ b/vendor/gonum.org/v1/gonum/LICENSE
        @@ -7,7 +7,7 @@ modification, are permitted provided that the following conditions are met:
             * Redistributions in binary form must reproduce the above copyright
               notice, this list of conditions and the following disclaimer in the
               documentation and/or other materials provided with the distribution.
        -    * Neither the name of the gonum project nor the names of its authors and
        +    * Neither the name of the Gonum project nor the names of its authors and
               contributors may be used to endorse or promote products derived from this
               software without specific prior written permission.
         
        diff --git a/vendor/gonum.org/v1/gonum/blas/blas64/blas64.go b/vendor/gonum.org/v1/gonum/blas/blas64/blas64.go
        index c71a4c66a..5871321eb 100644
        --- a/vendor/gonum.org/v1/gonum/blas/blas64/blas64.go
        +++ b/vendor/gonum.org/v1/gonum/blas/blas64/blas64.go
        @@ -28,6 +28,7 @@ func Implementation() blas.Float64 {
         
         // Vector represents a vector with an associated element increment.
         type Vector struct {
        +	N    int
         	Data []float64
         	Inc  int
         }
        @@ -98,34 +99,41 @@ type SymmetricPacked struct {
         
         // Level 1
         
        -const negInc = "blas64: negative vector increment"
        +const (
        +	negInc    = "blas64: negative vector increment"
        +	badLength = "blas64: vector length mismatch"
        +)
         
         // Dot computes the dot product of the two vectors:
         //  \sum_i x[i]*y[i].
        -func Dot(n int, x, y Vector) float64 {
        -	return blas64.Ddot(n, x.Data, x.Inc, y.Data, y.Inc)
        +// Dot will panic if the lengths of x and y do not match.
        +func Dot(x, y Vector) float64 {
        +	if x.N != y.N {
        +		panic(badLength)
        +	}
        +	return blas64.Ddot(x.N, x.Data, x.Inc, y.Data, y.Inc)
         }
         
         // Nrm2 computes the Euclidean norm of the vector x:
         //  sqrt(\sum_i x[i]*x[i]).
         //
         // Nrm2 will panic if the vector increment is negative.
        -func Nrm2(n int, x Vector) float64 {
        +func Nrm2(x Vector) float64 {
         	if x.Inc < 0 {
         		panic(negInc)
         	}
        -	return blas64.Dnrm2(n, x.Data, x.Inc)
        +	return blas64.Dnrm2(x.N, x.Data, x.Inc)
         }
         
         // Asum computes the sum of the absolute values of the elements of x:
         //  \sum_i |x[i]|.
         //
         // Asum will panic if the vector increment is negative.
        -func Asum(n int, x Vector) float64 {
        +func Asum(x Vector) float64 {
         	if x.Inc < 0 {
         		panic(negInc)
         	}
        -	return blas64.Dasum(n, x.Data, x.Inc)
        +	return blas64.Dasum(x.N, x.Data, x.Inc)
         }
         
         // Iamax returns the index of an element of x with the largest absolute value.
        @@ -133,29 +141,41 @@ func Asum(n int, x Vector) float64 {
         // Iamax returns -1 if n == 0.
         //
         // Iamax will panic if the vector increment is negative.
        -func Iamax(n int, x Vector) int {
        +func Iamax(x Vector) int {
         	if x.Inc < 0 {
         		panic(negInc)
         	}
        -	return blas64.Idamax(n, x.Data, x.Inc)
        +	return blas64.Idamax(x.N, x.Data, x.Inc)
         }
         
         // Swap exchanges the elements of the two vectors:
         //  x[i], y[i] = y[i], x[i] for all i.
        -func Swap(n int, x, y Vector) {
        -	blas64.Dswap(n, x.Data, x.Inc, y.Data, y.Inc)
        +// Swap will panic if the lengths of x and y do not match.
        +func Swap(x, y Vector) {
        +	if x.N != y.N {
        +		panic(badLength)
        +	}
        +	blas64.Dswap(x.N, x.Data, x.Inc, y.Data, y.Inc)
         }
         
         // Copy copies the elements of x into the elements of y:
         //  y[i] = x[i] for all i.
        -func Copy(n int, x, y Vector) {
        -	blas64.Dcopy(n, x.Data, x.Inc, y.Data, y.Inc)
        +// Copy will panic if the lengths of x and y do not match.
        +func Copy(x, y Vector) {
        +	if x.N != y.N {
        +		panic(badLength)
        +	}
        +	blas64.Dcopy(x.N, x.Data, x.Inc, y.Data, y.Inc)
         }
         
         // Axpy adds x scaled by alpha to y:
         //  y[i] += alpha*x[i] for all i.
        -func Axpy(n int, alpha float64, x, y Vector) {
        -	blas64.Daxpy(n, alpha, x.Data, x.Inc, y.Data, y.Inc)
        +// Axpy will panic if the lengths of x and y do not match.
        +func Axpy(alpha float64, x, y Vector) {
        +	if x.N != y.N {
        +		panic(badLength)
        +	}
        +	blas64.Daxpy(x.N, alpha, x.Data, x.Inc, y.Data, y.Inc)
         }
         
         // Rotg computes the parameters of a Givens plane rotation so that
        @@ -185,72 +205,78 @@ func Rotmg(d1, d2, b1, b2 float64) (p blas.DrotmParams, rd1, rd2, rb1 float64) {
         // and y:
         //  x[i] =  c*x[i] + s*y[i],
         //  y[i] = -s*x[i] + c*y[i], for all i.
        -func Rot(n int, x, y Vector, c, s float64) {
        -	blas64.Drot(n, x.Data, x.Inc, y.Data, y.Inc, c, s)
        +func Rot(x, y Vector, c, s float64) {
        +	if x.N != y.N {
        +		panic(badLength)
        +	}
        +	blas64.Drot(x.N, x.Data, x.Inc, y.Data, y.Inc, c, s)
         }
         
         // Rotm applies the modified Givens rotation to n points represented by the
         // vectors x and y.
        -func Rotm(n int, x, y Vector, p blas.DrotmParams) {
        -	blas64.Drotm(n, x.Data, x.Inc, y.Data, y.Inc, p)
        +func Rotm(x, y Vector, p blas.DrotmParams) {
        +	if x.N != y.N {
        +		panic(badLength)
        +	}
        +	blas64.Drotm(x.N, x.Data, x.Inc, y.Data, y.Inc, p)
         }
         
         // Scal scales the vector x by alpha:
         //  x[i] *= alpha for all i.
         //
         // Scal will panic if the vector increment is negative.
        -func Scal(n int, alpha float64, x Vector) {
        +func Scal(alpha float64, x Vector) {
         	if x.Inc < 0 {
         		panic(negInc)
         	}
        -	blas64.Dscal(n, alpha, x.Data, x.Inc)
        +	blas64.Dscal(x.N, alpha, x.Data, x.Inc)
         }
         
         // Level 2
         
         // Gemv computes
        -//  y = alpha * A * x + beta * y,   if t == blas.NoTrans,
        -//  y = alpha * A^T * x + beta * y, if t == blas.Trans or blas.ConjTrans,
        +//  y = alpha * A * x + beta * y   if t == blas.NoTrans,
        +//  y = alpha * Aᵀ * x + beta * y  if t == blas.Trans or blas.ConjTrans,
         // where A is an m×n dense matrix, x and y are vectors, and alpha and beta are scalars.
         func Gemv(t blas.Transpose, alpha float64, a General, x Vector, beta float64, y Vector) {
         	blas64.Dgemv(t, a.Rows, a.Cols, alpha, a.Data, a.Stride, x.Data, x.Inc, beta, y.Data, y.Inc)
         }
         
         // Gbmv computes
        -//  y = alpha * A * x + beta * y,   if t == blas.NoTrans,
        -//  y = alpha * A^T * x + beta * y, if t == blas.Trans or blas.ConjTrans,
        +//  y = alpha * A * x + beta * y   if t == blas.NoTrans,
        +//  y = alpha * Aᵀ * x + beta * y  if t == blas.Trans or blas.ConjTrans,
         // where A is an m×n band matrix, x and y are vectors, and alpha and beta are scalars.
         func Gbmv(t blas.Transpose, alpha float64, a Band, x Vector, beta float64, y Vector) {
         	blas64.Dgbmv(t, a.Rows, a.Cols, a.KL, a.KU, alpha, a.Data, a.Stride, x.Data, x.Inc, beta, y.Data, y.Inc)
         }
         
         // Trmv computes
        -//  x = A * x,   if t == blas.NoTrans,
        -//  x = A^T * x, if t == blas.Trans or blas.ConjTrans,
        +//  x = A * x   if t == blas.NoTrans,
        +//  x = Aᵀ * x  if t == blas.Trans or blas.ConjTrans,
         // where A is an n×n triangular matrix, and x is a vector.
         func Trmv(t blas.Transpose, a Triangular, x Vector) {
         	blas64.Dtrmv(a.Uplo, t, a.Diag, a.N, a.Data, a.Stride, x.Data, x.Inc)
         }
         
         // Tbmv computes
        -//  x = A * x,   if t == blas.NoTrans,
        -//  x = A^T * x, if t == blas.Trans or blas.ConjTrans,
        +//  x = A * x   if t == blas.NoTrans,
        +//  x = Aᵀ * x  if t == blas.Trans or blas.ConjTrans,
         // where A is an n×n triangular band matrix, and x is a vector.
         func Tbmv(t blas.Transpose, a TriangularBand, x Vector) {
         	blas64.Dtbmv(a.Uplo, t, a.Diag, a.N, a.K, a.Data, a.Stride, x.Data, x.Inc)
         }
         
         // Tpmv computes
        -//  x = A * x,   if t == blas.NoTrans,
        -//  x = A^T * x, if t == blas.Trans or blas.ConjTrans,
        +//  x = A * x   if t == blas.NoTrans,
        +//  x = Aᵀ * x  if t == blas.Trans or blas.ConjTrans,
         // where A is an n×n triangular matrix in packed format, and x is a vector.
         func Tpmv(t blas.Transpose, a TriangularPacked, x Vector) {
         	blas64.Dtpmv(a.Uplo, t, a.Diag, a.N, a.Data, x.Data, x.Inc)
         }
         
         // Trsv solves
        -//  A * x = b,   if t == blas.NoTrans,
        -//  A^T * x = b, if t == blas.Trans or blas.ConjTrans,
        +//  A * x = b   if t == blas.NoTrans,
        +//  Aᵀ * x = b  if t == blas.Trans or blas.ConjTrans,
         // where A is an n×n triangular matrix, and x and b are vectors.
         //
         // At entry to the function, x contains the values of b, and the result is
        @@ -263,8 +289,8 @@ func Trsv(t blas.Transpose, a Triangular, x Vector) {
         }
         
         // Tbsv solves
        -//  A * x = b,   if t == blas.NoTrans,
        -//  A^T * x = b, if t == blas.Trans or blas.ConjTrans,
        +//  A * x = b   if t == blas.NoTrans,
        +//  Aᵀ * x = b  if t == blas.Trans or blas.ConjTrans,
         // where A is an n×n triangular band matrix, and x and b are vectors.
         //
         // At entry to the function, x contains the values of b, and the result is
        @@ -277,8 +303,8 @@ func Tbsv(t blas.Transpose, a TriangularBand, x Vector) {
         }
         
         // Tpsv solves
        -//  A * x = b,   if t == blas.NoTrans,
        -//  A^T * x = b, if t == blas.Trans or blas.ConjTrans,
        +//  A * x = b   if t == blas.NoTrans,
        +//  Aᵀ * x = b  if t == blas.Trans or blas.ConjTrans,
         // where A is an n×n triangular matrix in packed format, and x and b are
         // vectors.
         //
        @@ -292,7 +318,7 @@ func Tpsv(t blas.Transpose, a TriangularPacked, x Vector) {
         }
         
         // Symv computes
        -//    y = alpha * A * x + beta * y,
        +//  y = alpha * A * x + beta * y,
         // where A is an n×n symmetric matrix, x and y are vectors, and alpha and
         // beta are scalars.
         func Symv(alpha float64, a Symmetric, x Vector, beta float64, y Vector) {
        @@ -308,7 +334,7 @@ func Sbmv(alpha float64, a SymmetricBand, x Vector, beta float64, y Vector) {
         }
         
         // Spmv performs
        -//    y = alpha * A * x + beta * y,
        +//  y = alpha * A * x + beta * y,
         // where A is an n×n symmetric matrix in packed format, x and y are vectors,
         // and alpha and beta are scalars.
         func Spmv(alpha float64, a SymmetricPacked, x Vector, beta float64, y Vector) {
        @@ -316,21 +342,21 @@ func Spmv(alpha float64, a SymmetricPacked, x Vector, beta float64, y Vector) {
         }
         
         // Ger performs a rank-1 update
        -//  A += alpha * x * y^T,
        +//  A += alpha * x * yᵀ,
         // where A is an m×n dense matrix, x and y are vectors, and alpha is a scalar.
         func Ger(alpha float64, x, y Vector, a General) {
         	blas64.Dger(a.Rows, a.Cols, alpha, x.Data, x.Inc, y.Data, y.Inc, a.Data, a.Stride)
         }
         
         // Syr performs a rank-1 update
        -//  A += alpha * x * x^T,
        +//  A += alpha * x * xᵀ,
         // where A is an n×n symmetric matrix, x is a vector, and alpha is a scalar.
         func Syr(alpha float64, x Vector, a Symmetric) {
         	blas64.Dsyr(a.Uplo, a.N, alpha, x.Data, x.Inc, a.Data, a.Stride)
         }
         
         // Spr performs the rank-1 update
        -//  A += alpha * x * x^T,
        +//  A += alpha * x * xᵀ,
         // where A is an n×n symmetric matrix in packed format, x is a vector, and
         // alpha is a scalar.
         func Spr(alpha float64, x Vector, a SymmetricPacked) {
        @@ -338,14 +364,14 @@ func Spr(alpha float64, x Vector, a SymmetricPacked) {
         }
         
         // Syr2 performs a rank-2 update
        -//  A += alpha * x * y^T + alpha * y * x^T,
        +//  A += alpha * x * yᵀ + alpha * y * xᵀ,
         // where A is a symmetric n×n matrix, x and y are vectors, and alpha is a scalar.
         func Syr2(alpha float64, x, y Vector, a Symmetric) {
         	blas64.Dsyr2(a.Uplo, a.N, alpha, x.Data, x.Inc, y.Data, y.Inc, a.Data, a.Stride)
         }
         
         // Spr2 performs a rank-2 update
        -//  A += alpha * x * y^T + alpha * y * x^T,
        +//  A += alpha * x * yᵀ + alpha * y * xᵀ,
         // where A is an n×n symmetric matrix in packed format, x and y are vectors,
         // and alpha is a scalar.
         func Spr2(alpha float64, x, y Vector, a SymmetricPacked) {
        @@ -374,8 +400,8 @@ func Gemm(tA, tB blas.Transpose, alpha float64, a, b General, beta float64, c Ge
         }
         
         // Symm performs
        -//  C = alpha * A * B + beta * C, if s == blas.Left,
        -//  C = alpha * B * A + beta * C, if s == blas.Right,
        +//  C = alpha * A * B + beta * C  if s == blas.Left,
        +//  C = alpha * B * A + beta * C  if s == blas.Right,
         // where A is an n×n or m×m symmetric matrix, B and C are m×n matrices, and
         // alpha is a scalar.
         func Symm(s blas.Side, alpha float64, a Symmetric, b General, beta float64, c General) {
        @@ -389,8 +415,8 @@ func Symm(s blas.Side, alpha float64, a Symmetric, b General, beta float64, c Ge
         }
         
         // Syrk performs a symmetric rank-k update
        -//  C = alpha * A * A^T + beta * C, if t == blas.NoTrans,
        -//  C = alpha * A^T * A + beta * C, if t == blas.Trans or blas.ConjTrans,
        +//  C = alpha * A * Aᵀ + beta * C  if t == blas.NoTrans,
        +//  C = alpha * Aᵀ * A + beta * C  if t == blas.Trans or blas.ConjTrans,
         // where C is an n×n symmetric matrix, A is an n×k matrix if t == blas.NoTrans and
         // a k×n matrix otherwise, and alpha and beta are scalars.
         func Syrk(t blas.Transpose, alpha float64, a General, beta float64, c Symmetric) {
        @@ -404,8 +430,8 @@ func Syrk(t blas.Transpose, alpha float64, a General, beta float64, c Symmetric)
         }
         
         // Syr2k performs a symmetric rank-2k update
        -//  C = alpha * A * B^T + alpha * B * A^T + beta * C, if t == blas.NoTrans,
        -//  C = alpha * A^T * B + alpha * B^T * A + beta * C, if t == blas.Trans or blas.ConjTrans,
        +//  C = alpha * A * Bᵀ + alpha * B * Aᵀ + beta * C  if t == blas.NoTrans,
        +//  C = alpha * Aᵀ * B + alpha * Bᵀ * A + beta * C  if t == blas.Trans or blas.ConjTrans,
         // where C is an n×n symmetric matrix, A and B are n×k matrices if t == NoTrans
         // and k×n matrices otherwise, and alpha and beta are scalars.
         func Syr2k(t blas.Transpose, alpha float64, a, b General, beta float64, c Symmetric) {
        @@ -419,10 +445,10 @@ func Syr2k(t blas.Transpose, alpha float64, a, b General, beta float64, c Symmet
         }
         
         // Trmm performs
        -//  B = alpha * A * B,   if tA == blas.NoTrans and s == blas.Left,
        -//  B = alpha * A^T * B, if tA == blas.Trans or blas.ConjTrans, and s == blas.Left,
        -//  B = alpha * B * A,   if tA == blas.NoTrans and s == blas.Right,
        -//  B = alpha * B * A^T, if tA == blas.Trans or blas.ConjTrans, and s == blas.Right,
        +//  B = alpha * A * B   if tA == blas.NoTrans and s == blas.Left,
        +//  B = alpha * Aᵀ * B  if tA == blas.Trans or blas.ConjTrans, and s == blas.Left,
        +//  B = alpha * B * A   if tA == blas.NoTrans and s == blas.Right,
        +//  B = alpha * B * Aᵀ  if tA == blas.Trans or blas.ConjTrans, and s == blas.Right,
         // where A is an n×n or m×m triangular matrix, B is an m×n matrix, and alpha is
         // a scalar.
         func Trmm(s blas.Side, tA blas.Transpose, alpha float64, a Triangular, b General) {
        @@ -430,10 +456,10 @@ func Trmm(s blas.Side, tA blas.Transpose, alpha float64, a Triangular, b General
         }
         
         // Trsm solves
        -//  A * X = alpha * B,   if tA == blas.NoTrans and s == blas.Left,
        -//  A^T * X = alpha * B, if tA == blas.Trans or blas.ConjTrans, and s == blas.Left,
        -//  X * A = alpha * B,   if tA == blas.NoTrans and s == blas.Right,
        -//  X * A^T = alpha * B, if tA == blas.Trans or blas.ConjTrans, and s == blas.Right,
        +//  A * X = alpha * B   if tA == blas.NoTrans and s == blas.Left,
        +//  Aᵀ * X = alpha * B  if tA == blas.Trans or blas.ConjTrans, and s == blas.Left,
        +//  X * A = alpha * B   if tA == blas.NoTrans and s == blas.Right,
        +//  X * Aᵀ = alpha * B  if tA == blas.Trans or blas.ConjTrans, and s == blas.Right,
         // where A is an n×n or m×m triangular matrix, X and B are m×n matrices, and
         // alpha is a scalar.
         //
        diff --git a/vendor/gonum.org/v1/gonum/blas/blas64/conv.go b/vendor/gonum.org/v1/gonum/blas/blas64/conv.go
        index 882fd8a71..6cc6517f1 100644
        --- a/vendor/gonum.org/v1/gonum/blas/blas64/conv.go
        +++ b/vendor/gonum.org/v1/gonum/blas/blas64/conv.go
        @@ -169,7 +169,7 @@ func (t Band) From(a BandCols) {
         	}
         }
         
        -// TriangularBandCols represents a symmetric matrix using the band column-major storage scheme.
        +// TriangularBandCols represents a triangular matrix using the band column-major storage scheme.
         type TriangularBandCols TriangularBand
         
         // From fills the receiver with elements from a. The receiver
        diff --git a/vendor/gonum.org/v1/gonum/blas/cblas128/cblas128.go b/vendor/gonum.org/v1/gonum/blas/cblas128/cblas128.go
        new file mode 100644
        index 000000000..4b7458437
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/blas/cblas128/cblas128.go
        @@ -0,0 +1,532 @@
        +// Copyright ©2015 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package cblas128
        +
        +import (
        +	"gonum.org/v1/gonum/blas"
        +	"gonum.org/v1/gonum/blas/gonum"
        +)
        +
        +var cblas128 blas.Complex128 = gonum.Implementation{}
        +
        +// Use sets the BLAS complex128 implementation to be used by subsequent BLAS calls.
        +// The default implementation is
        +// gonum.org/v1/gonum/blas/gonum.Implementation.
        +func Use(b blas.Complex128) {
        +	cblas128 = b
        +}
        +
        +// Implementation returns the current BLAS complex128 implementation.
        +//
        +// Implementation allows direct calls to the current the BLAS complex128 implementation
        +// giving finer control of parameters.
        +func Implementation() blas.Complex128 {
        +	return cblas128
        +}
        +
        +// Vector represents a vector with an associated element increment.
        +type Vector struct {
        +	N    int
        +	Inc  int
        +	Data []complex128
        +}
        +
        +// General represents a matrix using the conventional storage scheme.
        +type General struct {
        +	Rows, Cols int
        +	Stride     int
        +	Data       []complex128
        +}
        +
        +// Band represents a band matrix using the band storage scheme.
        +type Band struct {
        +	Rows, Cols int
        +	KL, KU     int
        +	Stride     int
        +	Data       []complex128
        +}
        +
        +// Triangular represents a triangular matrix using the conventional storage scheme.
        +type Triangular struct {
        +	N      int
        +	Stride int
        +	Data   []complex128
        +	Uplo   blas.Uplo
        +	Diag   blas.Diag
        +}
        +
        +// TriangularBand represents a triangular matrix using the band storage scheme.
        +type TriangularBand struct {
        +	N, K   int
        +	Stride int
        +	Data   []complex128
        +	Uplo   blas.Uplo
        +	Diag   blas.Diag
        +}
        +
        +// TriangularPacked represents a triangular matrix using the packed storage scheme.
        +type TriangularPacked struct {
        +	N    int
        +	Data []complex128
        +	Uplo blas.Uplo
        +	Diag blas.Diag
        +}
        +
        +// Symmetric represents a symmetric matrix using the conventional storage scheme.
        +type Symmetric struct {
        +	N      int
        +	Stride int
        +	Data   []complex128
        +	Uplo   blas.Uplo
        +}
        +
        +// SymmetricBand represents a symmetric matrix using the band storage scheme.
        +type SymmetricBand struct {
        +	N, K   int
        +	Stride int
        +	Data   []complex128
        +	Uplo   blas.Uplo
        +}
        +
        +// SymmetricPacked represents a symmetric matrix using the packed storage scheme.
        +type SymmetricPacked struct {
        +	N    int
        +	Data []complex128
        +	Uplo blas.Uplo
        +}
        +
        +// Hermitian represents an Hermitian matrix using the conventional storage scheme.
        +type Hermitian Symmetric
        +
        +// HermitianBand represents an Hermitian matrix using the band storage scheme.
        +type HermitianBand SymmetricBand
        +
        +// HermitianPacked represents an Hermitian matrix using the packed storage scheme.
        +type HermitianPacked SymmetricPacked
        +
        +// Level 1
        +
        +const (
        +	negInc    = "cblas128: negative vector increment"
        +	badLength = "cblas128: vector length mismatch"
        +)
        +
        +// Dotu computes the dot product of the two vectors without
        +// complex conjugation:
        +//  xᵀ * y.
        +// Dotu will panic if the lengths of x and y do not match.
        +func Dotu(x, y Vector) complex128 {
        +	if x.N != y.N {
        +		panic(badLength)
        +	}
        +	return cblas128.Zdotu(x.N, x.Data, x.Inc, y.Data, y.Inc)
        +}
        +
        +// Dotc computes the dot product of the two vectors with
        +// complex conjugation:
        +//  xᴴ * y.
        +// Dotc will panic if the lengths of x and y do not match.
        +func Dotc(x, y Vector) complex128 {
        +	if x.N != y.N {
        +		panic(badLength)
        +	}
        +	return cblas128.Zdotc(x.N, x.Data, x.Inc, y.Data, y.Inc)
        +}
        +
        +// Nrm2 computes the Euclidean norm of the vector x:
        +//  sqrt(\sum_i x[i] * x[i]).
        +//
        +// Nrm2 will panic if the vector increment is negative.
        +func Nrm2(x Vector) float64 {
        +	if x.Inc < 0 {
        +		panic(negInc)
        +	}
        +	return cblas128.Dznrm2(x.N, x.Data, x.Inc)
        +}
        +
        +// Asum computes the sum of magnitudes of the real and imaginary parts of
        +// elements of the vector x:
        +//  \sum_i (|Re x[i]| + |Im x[i]|).
        +//
        +// Asum will panic if the vector increment is negative.
        +func Asum(x Vector) float64 {
        +	if x.Inc < 0 {
        +		panic(negInc)
        +	}
        +	return cblas128.Dzasum(x.N, x.Data, x.Inc)
        +}
        +
        +// Iamax returns the index of an element of x with the largest sum of
        +// magnitudes of the real and imaginary parts (|Re x[i]|+|Im x[i]|).
        +// If there are multiple such indices, the earliest is returned.
        +//
        +// Iamax returns -1 if n == 0.
        +//
        +// Iamax will panic if the vector increment is negative.
        +func Iamax(x Vector) int {
        +	if x.Inc < 0 {
        +		panic(negInc)
        +	}
        +	return cblas128.Izamax(x.N, x.Data, x.Inc)
        +}
        +
        +// Swap exchanges the elements of two vectors:
        +//  x[i], y[i] = y[i], x[i] for all i.
        +// Swap will panic if the lengths of x and y do not match.
        +func Swap(x, y Vector) {
        +	if x.N != y.N {
        +		panic(badLength)
        +	}
        +	cblas128.Zswap(x.N, x.Data, x.Inc, y.Data, y.Inc)
        +}
        +
        +// Copy copies the elements of x into the elements of y:
        +//  y[i] = x[i] for all i.
        +// Copy will panic if the lengths of x and y do not match.
        +func Copy(x, y Vector) {
        +	if x.N != y.N {
        +		panic(badLength)
        +	}
        +	cblas128.Zcopy(x.N, x.Data, x.Inc, y.Data, y.Inc)
        +}
        +
        +// Axpy computes
        +//  y = alpha * x + y,
        +// where x and y are vectors, and alpha is a scalar.
        +// Axpy will panic if the lengths of x and y do not match.
        +func Axpy(alpha complex128, x, y Vector) {
        +	if x.N != y.N {
        +		panic(badLength)
        +	}
        +	cblas128.Zaxpy(x.N, alpha, x.Data, x.Inc, y.Data, y.Inc)
        +}
        +
        +// Scal computes
        +//  x = alpha * x,
        +// where x is a vector, and alpha is a scalar.
        +//
        +// Scal will panic if the vector increment is negative.
        +func Scal(alpha complex128, x Vector) {
        +	if x.Inc < 0 {
        +		panic(negInc)
        +	}
        +	cblas128.Zscal(x.N, alpha, x.Data, x.Inc)
        +}
        +
        +// Dscal computes
        +//  x = alpha * x,
        +// where x is a vector, and alpha is a real scalar.
        +//
        +// Dscal will panic if the vector increment is negative.
        +func Dscal(alpha float64, x Vector) {
        +	if x.Inc < 0 {
        +		panic(negInc)
        +	}
        +	cblas128.Zdscal(x.N, alpha, x.Data, x.Inc)
        +}
        +
        +// Level 2
        +
        +// Gemv computes
        +//  y = alpha * A * x + beta * y   if t == blas.NoTrans,
        +//  y = alpha * Aᵀ * x + beta * y  if t == blas.Trans,
        +//  y = alpha * Aᴴ * x + beta * y  if t == blas.ConjTrans,
        +// where A is an m×n dense matrix, x and y are vectors, and alpha and beta are
        +// scalars.
        +func Gemv(t blas.Transpose, alpha complex128, a General, x Vector, beta complex128, y Vector) {
        +	cblas128.Zgemv(t, a.Rows, a.Cols, alpha, a.Data, a.Stride, x.Data, x.Inc, beta, y.Data, y.Inc)
        +}
        +
        +// Gbmv computes
        +//  y = alpha * A * x + beta * y   if t == blas.NoTrans,
        +//  y = alpha * Aᵀ * x + beta * y  if t == blas.Trans,
        +//  y = alpha * Aᴴ * x + beta * y  if t == blas.ConjTrans,
        +// where A is an m×n band matrix, x and y are vectors, and alpha and beta are
        +// scalars.
        +func Gbmv(t blas.Transpose, alpha complex128, a Band, x Vector, beta complex128, y Vector) {
        +	cblas128.Zgbmv(t, a.Rows, a.Cols, a.KL, a.KU, alpha, a.Data, a.Stride, x.Data, x.Inc, beta, y.Data, y.Inc)
        +}
        +
        +// Trmv computes
        +//  x = A * x   if t == blas.NoTrans,
        +//  x = Aᵀ * x  if t == blas.Trans,
        +//  x = Aᴴ * x  if t == blas.ConjTrans,
        +// where A is an n×n triangular matrix, and x is a vector.
        +func Trmv(t blas.Transpose, a Triangular, x Vector) {
        +	cblas128.Ztrmv(a.Uplo, t, a.Diag, a.N, a.Data, a.Stride, x.Data, x.Inc)
        +}
        +
        +// Tbmv computes
        +//  x = A * x   if t == blas.NoTrans,
        +//  x = Aᵀ * x  if t == blas.Trans,
        +//  x = Aᴴ * x  if t == blas.ConjTrans,
        +// where A is an n×n triangular band matrix, and x is a vector.
        +func Tbmv(t blas.Transpose, a TriangularBand, x Vector) {
        +	cblas128.Ztbmv(a.Uplo, t, a.Diag, a.N, a.K, a.Data, a.Stride, x.Data, x.Inc)
        +}
        +
        +// Tpmv computes
        +//  x = A * x   if t == blas.NoTrans,
        +//  x = Aᵀ * x  if t == blas.Trans,
        +//  x = Aᴴ * x  if t == blas.ConjTrans,
        +// where A is an n×n triangular matrix in packed format, and x is a vector.
        +func Tpmv(t blas.Transpose, a TriangularPacked, x Vector) {
        +	cblas128.Ztpmv(a.Uplo, t, a.Diag, a.N, a.Data, x.Data, x.Inc)
        +}
        +
        +// Trsv solves
        +//  A * x = b   if t == blas.NoTrans,
        +//  Aᵀ * x = b  if t == blas.Trans,
        +//  Aᴴ * x = b  if t == blas.ConjTrans,
        +// where A is an n×n triangular matrix and x is a vector.
        +//
        +// At entry to the function, x contains the values of b, and the result is
        +// stored in-place into x.
        +//
        +// No test for singularity or near-singularity is included in this
        +// routine. Such tests must be performed before calling this routine.
        +func Trsv(t blas.Transpose, a Triangular, x Vector) {
        +	cblas128.Ztrsv(a.Uplo, t, a.Diag, a.N, a.Data, a.Stride, x.Data, x.Inc)
        +}
        +
        +// Tbsv solves
        +//  A * x = b   if t == blas.NoTrans,
        +//  Aᵀ * x = b  if t == blas.Trans,
        +//  Aᴴ * x = b  if t == blas.ConjTrans,
        +// where A is an n×n triangular band matrix, and x is a vector.
        +//
        +// At entry to the function, x contains the values of b, and the result is
        +// stored in-place into x.
        +//
        +// No test for singularity or near-singularity is included in this
        +// routine. Such tests must be performed before calling this routine.
        +func Tbsv(t blas.Transpose, a TriangularBand, x Vector) {
        +	cblas128.Ztbsv(a.Uplo, t, a.Diag, a.N, a.K, a.Data, a.Stride, x.Data, x.Inc)
        +}
        +
        +// Tpsv solves
        +//  A * x = b   if t == blas.NoTrans,
        +//  Aᵀ * x = b  if t == blas.Trans,
        +//  Aᴴ * x = b  if t == blas.ConjTrans,
        +// where A is an n×n triangular matrix in packed format and x is a vector.
        +//
        +// At entry to the function, x contains the values of b, and the result is
        +// stored in-place into x.
        +//
        +// No test for singularity or near-singularity is included in this
        +// routine. Such tests must be performed before calling this routine.
        +func Tpsv(t blas.Transpose, a TriangularPacked, x Vector) {
        +	cblas128.Ztpsv(a.Uplo, t, a.Diag, a.N, a.Data, x.Data, x.Inc)
        +}
        +
        +// Hemv computes
        +//  y = alpha * A * x + beta * y,
        +// where A is an n×n Hermitian matrix, x and y are vectors, and alpha and
        +// beta are scalars.
        +func Hemv(alpha complex128, a Hermitian, x Vector, beta complex128, y Vector) {
        +	cblas128.Zhemv(a.Uplo, a.N, alpha, a.Data, a.Stride, x.Data, x.Inc, beta, y.Data, y.Inc)
        +}
        +
        +// Hbmv performs
        +//  y = alpha * A * x + beta * y,
        +// where A is an n×n Hermitian band matrix, x and y are vectors, and alpha
        +// and beta are scalars.
        +func Hbmv(alpha complex128, a HermitianBand, x Vector, beta complex128, y Vector) {
        +	cblas128.Zhbmv(a.Uplo, a.N, a.K, alpha, a.Data, a.Stride, x.Data, x.Inc, beta, y.Data, y.Inc)
        +}
        +
        +// Hpmv performs
        +//  y = alpha * A * x + beta * y,
        +// where A is an n×n Hermitian matrix in packed format, x and y are vectors,
        +// and alpha and beta are scalars.
        +func Hpmv(alpha complex128, a HermitianPacked, x Vector, beta complex128, y Vector) {
        +	cblas128.Zhpmv(a.Uplo, a.N, alpha, a.Data, x.Data, x.Inc, beta, y.Data, y.Inc)
        +}
        +
        +// Geru performs a rank-1 update
        +//  A += alpha * x * yᵀ,
        +// where A is an m×n dense matrix, x and y are vectors, and alpha is a scalar.
        +func Geru(alpha complex128, x, y Vector, a General) {
        +	cblas128.Zgeru(a.Rows, a.Cols, alpha, x.Data, x.Inc, y.Data, y.Inc, a.Data, a.Stride)
        +}
        +
        +// Gerc performs a rank-1 update
        +//  A += alpha * x * yᴴ,
        +// where A is an m×n dense matrix, x and y are vectors, and alpha is a scalar.
        +func Gerc(alpha complex128, x, y Vector, a General) {
        +	cblas128.Zgerc(a.Rows, a.Cols, alpha, x.Data, x.Inc, y.Data, y.Inc, a.Data, a.Stride)
        +}
        +
        +// Her performs a rank-1 update
        +//  A += alpha * x * yᵀ,
        +// where A is an m×n Hermitian matrix, x and y are vectors, and alpha is a scalar.
        +func Her(alpha float64, x Vector, a Hermitian) {
        +	cblas128.Zher(a.Uplo, a.N, alpha, x.Data, x.Inc, a.Data, a.Stride)
        +}
        +
        +// Hpr performs a rank-1 update
        +//  A += alpha * x * xᴴ,
        +// where A is an n×n Hermitian matrix in packed format, x is a vector, and
        +// alpha is a scalar.
        +func Hpr(alpha float64, x Vector, a HermitianPacked) {
        +	cblas128.Zhpr(a.Uplo, a.N, alpha, x.Data, x.Inc, a.Data)
        +}
        +
        +// Her2 performs a rank-2 update
        +//  A += alpha * x * yᴴ + conj(alpha) * y * xᴴ,
        +// where A is an n×n Hermitian matrix, x and y are vectors, and alpha is a scalar.
        +func Her2(alpha complex128, x, y Vector, a Hermitian) {
        +	cblas128.Zher2(a.Uplo, a.N, alpha, x.Data, x.Inc, y.Data, y.Inc, a.Data, a.Stride)
        +}
        +
        +// Hpr2 performs a rank-2 update
        +//  A += alpha * x * yᴴ + conj(alpha) * y * xᴴ,
        +// where A is an n×n Hermitian matrix in packed format, x and y are vectors,
        +// and alpha is a scalar.
        +func Hpr2(alpha complex128, x, y Vector, a HermitianPacked) {
        +	cblas128.Zhpr2(a.Uplo, a.N, alpha, x.Data, x.Inc, y.Data, y.Inc, a.Data)
        +}
        +
        +// Level 3
        +
        +// Gemm computes
        +//  C = alpha * A * B + beta * C,
        +// where A, B, and C are dense matrices, and alpha and beta are scalars.
        +// tA and tB specify whether A or B are transposed or conjugated.
        +func Gemm(tA, tB blas.Transpose, alpha complex128, a, b General, beta complex128, c General) {
        +	var m, n, k int
        +	if tA == blas.NoTrans {
        +		m, k = a.Rows, a.Cols
        +	} else {
        +		m, k = a.Cols, a.Rows
        +	}
        +	if tB == blas.NoTrans {
        +		n = b.Cols
        +	} else {
        +		n = b.Rows
        +	}
        +	cblas128.Zgemm(tA, tB, m, n, k, alpha, a.Data, a.Stride, b.Data, b.Stride, beta, c.Data, c.Stride)
        +}
        +
        +// Symm performs
        +//  C = alpha * A * B + beta * C  if s == blas.Left,
        +//  C = alpha * B * A + beta * C  if s == blas.Right,
        +// where A is an n×n or m×m symmetric matrix, B and C are m×n matrices, and
        +// alpha and beta are scalars.
        +func Symm(s blas.Side, alpha complex128, a Symmetric, b General, beta complex128, c General) {
        +	var m, n int
        +	if s == blas.Left {
        +		m, n = a.N, b.Cols
        +	} else {
        +		m, n = b.Rows, a.N
        +	}
        +	cblas128.Zsymm(s, a.Uplo, m, n, alpha, a.Data, a.Stride, b.Data, b.Stride, beta, c.Data, c.Stride)
        +}
        +
        +// Syrk performs a symmetric rank-k update
        +//  C = alpha * A * Aᵀ + beta * C  if t == blas.NoTrans,
        +//  C = alpha * Aᵀ * A + beta * C  if t == blas.Trans,
        +// where C is an n×n symmetric matrix, A is an n×k matrix if t == blas.NoTrans
        +// and a k×n matrix otherwise, and alpha and beta are scalars.
        +func Syrk(t blas.Transpose, alpha complex128, a General, beta complex128, c Symmetric) {
        +	var n, k int
        +	if t == blas.NoTrans {
        +		n, k = a.Rows, a.Cols
        +	} else {
        +		n, k = a.Cols, a.Rows
        +	}
        +	cblas128.Zsyrk(c.Uplo, t, n, k, alpha, a.Data, a.Stride, beta, c.Data, c.Stride)
        +}
        +
        +// Syr2k performs a symmetric rank-2k update
        +//  C = alpha * A * Bᵀ + alpha * B * Aᵀ + beta * C  if t == blas.NoTrans,
        +//  C = alpha * Aᵀ * B + alpha * Bᵀ * A + beta * C  if t == blas.Trans,
        +// where C is an n×n symmetric matrix, A and B are n×k matrices if
        +// t == blas.NoTrans and k×n otherwise, and alpha and beta are scalars.
        +func Syr2k(t blas.Transpose, alpha complex128, a, b General, beta complex128, c Symmetric) {
        +	var n, k int
        +	if t == blas.NoTrans {
        +		n, k = a.Rows, a.Cols
        +	} else {
        +		n, k = a.Cols, a.Rows
        +	}
        +	cblas128.Zsyr2k(c.Uplo, t, n, k, alpha, a.Data, a.Stride, b.Data, b.Stride, beta, c.Data, c.Stride)
        +}
        +
        +// Trmm performs
        +//  B = alpha * A * B   if tA == blas.NoTrans and s == blas.Left,
        +//  B = alpha * Aᵀ * B  if tA == blas.Trans and s == blas.Left,
        +//  B = alpha * Aᴴ * B  if tA == blas.ConjTrans and s == blas.Left,
        +//  B = alpha * B * A   if tA == blas.NoTrans and s == blas.Right,
        +//  B = alpha * B * Aᵀ  if tA == blas.Trans and s == blas.Right,
        +//  B = alpha * B * Aᴴ  if tA == blas.ConjTrans and s == blas.Right,
        +// where A is an n×n or m×m triangular matrix, B is an m×n matrix, and alpha is
        +// a scalar.
        +func Trmm(s blas.Side, tA blas.Transpose, alpha complex128, a Triangular, b General) {
        +	cblas128.Ztrmm(s, a.Uplo, tA, a.Diag, b.Rows, b.Cols, alpha, a.Data, a.Stride, b.Data, b.Stride)
        +}
        +
        +// Trsm solves
        +//  A * X = alpha * B   if tA == blas.NoTrans and s == blas.Left,
        +//  Aᵀ * X = alpha * B  if tA == blas.Trans and s == blas.Left,
        +//  Aᴴ * X = alpha * B  if tA == blas.ConjTrans and s == blas.Left,
        +//  X * A = alpha * B   if tA == blas.NoTrans and s == blas.Right,
        +//  X * Aᵀ = alpha * B  if tA == blas.Trans and s == blas.Right,
        +//  X * Aᴴ = alpha * B  if tA == blas.ConjTrans and s == blas.Right,
        +// where A is an n×n or m×m triangular matrix, X and B are m×n matrices, and
        +// alpha is a scalar.
        +//
        +// At entry to the function, b contains the values of B, and the result is
        +// stored in-place into b.
        +//
        +// No check is made that A is invertible.
        +func Trsm(s blas.Side, tA blas.Transpose, alpha complex128, a Triangular, b General) {
        +	cblas128.Ztrsm(s, a.Uplo, tA, a.Diag, b.Rows, b.Cols, alpha, a.Data, a.Stride, b.Data, b.Stride)
        +}
        +
        +// Hemm performs
        +//  C = alpha * A * B + beta * C  if s == blas.Left,
        +//  C = alpha * B * A + beta * C  if s == blas.Right,
        +// where A is an n×n or m×m Hermitian matrix, B and C are m×n matrices, and
        +// alpha and beta are scalars.
        +func Hemm(s blas.Side, alpha complex128, a Hermitian, b General, beta complex128, c General) {
        +	var m, n int
        +	if s == blas.Left {
        +		m, n = a.N, b.Cols
        +	} else {
        +		m, n = b.Rows, a.N
        +	}
        +	cblas128.Zhemm(s, a.Uplo, m, n, alpha, a.Data, a.Stride, b.Data, b.Stride, beta, c.Data, c.Stride)
        +}
        +
        +// Herk performs the Hermitian rank-k update
        +//  C = alpha * A * Aᴴ + beta*C  if t == blas.NoTrans,
        +//  C = alpha * Aᴴ * A + beta*C  if t == blas.ConjTrans,
        +// where C is an n×n Hermitian matrix, A is an n×k matrix if t == blas.NoTrans
        +// and a k×n matrix otherwise, and alpha and beta are scalars.
        +func Herk(t blas.Transpose, alpha float64, a General, beta float64, c Hermitian) {
        +	var n, k int
        +	if t == blas.NoTrans {
        +		n, k = a.Rows, a.Cols
        +	} else {
        +		n, k = a.Cols, a.Rows
        +	}
        +	cblas128.Zherk(c.Uplo, t, n, k, alpha, a.Data, a.Stride, beta, c.Data, c.Stride)
        +}
        +
        +// Her2k performs the Hermitian rank-2k update
        +//  C = alpha * A * Bᴴ + conj(alpha) * B * Aᴴ + beta * C  if t == blas.NoTrans,
        +//  C = alpha * Aᴴ * B + conj(alpha) * Bᴴ * A + beta * C  if t == blas.ConjTrans,
        +// where C is an n×n Hermitian matrix, A and B are n×k matrices if t == NoTrans
        +// and k×n matrices otherwise, and alpha and beta are scalars.
        +func Her2k(t blas.Transpose, alpha complex128, a, b General, beta float64, c Hermitian) {
        +	var n, k int
        +	if t == blas.NoTrans {
        +		n, k = a.Rows, a.Cols
        +	} else {
        +		n, k = a.Cols, a.Rows
        +	}
        +	cblas128.Zher2k(c.Uplo, t, n, k, alpha, a.Data, a.Stride, b.Data, b.Stride, beta, c.Data, c.Stride)
        +}
        diff --git a/vendor/gonum.org/v1/gonum/blas/cblas128/conv.go b/vendor/gonum.org/v1/gonum/blas/cblas128/conv.go
        new file mode 100644
        index 000000000..c459e1d87
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/blas/cblas128/conv.go
        @@ -0,0 +1,279 @@
        +// Code generated by "go generate gonum.org/v1/gonum/blas”; DO NOT EDIT.
        +
        +// Copyright ©2015 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package cblas128
        +
        +import "gonum.org/v1/gonum/blas"
        +
        +// GeneralCols represents a matrix using the conventional column-major storage scheme.
        +type GeneralCols General
        +
        +// From fills the receiver with elements from a. The receiver
        +// must have the same dimensions as a and have adequate backing
        +// data storage.
        +func (t GeneralCols) From(a General) {
        +	if t.Rows != a.Rows || t.Cols != a.Cols {
        +		panic("cblas128: mismatched dimension")
        +	}
        +	if len(t.Data) < (t.Cols-1)*t.Stride+t.Rows {
        +		panic("cblas128: short data slice")
        +	}
        +	for i := 0; i < a.Rows; i++ {
        +		for j, v := range a.Data[i*a.Stride : i*a.Stride+a.Cols] {
        +			t.Data[i+j*t.Stride] = v
        +		}
        +	}
        +}
        +
        +// From fills the receiver with elements from a. The receiver
        +// must have the same dimensions as a and have adequate backing
        +// data storage.
        +func (t General) From(a GeneralCols) {
        +	if t.Rows != a.Rows || t.Cols != a.Cols {
        +		panic("cblas128: mismatched dimension")
        +	}
        +	if len(t.Data) < (t.Rows-1)*t.Stride+t.Cols {
        +		panic("cblas128: short data slice")
        +	}
        +	for j := 0; j < a.Cols; j++ {
        +		for i, v := range a.Data[j*a.Stride : j*a.Stride+a.Rows] {
        +			t.Data[i*t.Stride+j] = v
        +		}
        +	}
        +}
        +
        +// TriangularCols represents a matrix using the conventional column-major storage scheme.
        +type TriangularCols Triangular
        +
        +// From fills the receiver with elements from a. The receiver
        +// must have the same dimensions, uplo and diag as a and have
        +// adequate backing data storage.
        +func (t TriangularCols) From(a Triangular) {
        +	if t.N != a.N {
        +		panic("cblas128: mismatched dimension")
        +	}
        +	if t.Uplo != a.Uplo {
        +		panic("cblas128: mismatched BLAS uplo")
        +	}
        +	if t.Diag != a.Diag {
        +		panic("cblas128: mismatched BLAS diag")
        +	}
        +	switch a.Uplo {
        +	default:
        +		panic("cblas128: bad BLAS uplo")
        +	case blas.Upper:
        +		for i := 0; i < a.N; i++ {
        +			for j := i; j < a.N; j++ {
        +				t.Data[i+j*t.Stride] = a.Data[i*a.Stride+j]
        +			}
        +		}
        +	case blas.Lower:
        +		for i := 0; i < a.N; i++ {
        +			for j := 0; j <= i; j++ {
        +				t.Data[i+j*t.Stride] = a.Data[i*a.Stride+j]
        +			}
        +		}
        +	case blas.All:
        +		for i := 0; i < a.N; i++ {
        +			for j := 0; j < a.N; j++ {
        +				t.Data[i+j*t.Stride] = a.Data[i*a.Stride+j]
        +			}
        +		}
        +	}
        +}
        +
        +// From fills the receiver with elements from a. The receiver
        +// must have the same dimensions, uplo and diag as a and have
        +// adequate backing data storage.
        +func (t Triangular) From(a TriangularCols) {
        +	if t.N != a.N {
        +		panic("cblas128: mismatched dimension")
        +	}
        +	if t.Uplo != a.Uplo {
        +		panic("cblas128: mismatched BLAS uplo")
        +	}
        +	if t.Diag != a.Diag {
        +		panic("cblas128: mismatched BLAS diag")
        +	}
        +	switch a.Uplo {
        +	default:
        +		panic("cblas128: bad BLAS uplo")
        +	case blas.Upper:
        +		for i := 0; i < a.N; i++ {
        +			for j := i; j < a.N; j++ {
        +				t.Data[i*t.Stride+j] = a.Data[i+j*a.Stride]
        +			}
        +		}
        +	case blas.Lower:
        +		for i := 0; i < a.N; i++ {
        +			for j := 0; j <= i; j++ {
        +				t.Data[i*t.Stride+j] = a.Data[i+j*a.Stride]
        +			}
        +		}
        +	case blas.All:
        +		for i := 0; i < a.N; i++ {
        +			for j := 0; j < a.N; j++ {
        +				t.Data[i*t.Stride+j] = a.Data[i+j*a.Stride]
        +			}
        +		}
        +	}
        +}
        +
        +// BandCols represents a matrix using the band column-major storage scheme.
        +type BandCols Band
        +
        +// From fills the receiver with elements from a. The receiver
        +// must have the same dimensions and bandwidth as a and have
        +// adequate backing data storage.
        +func (t BandCols) From(a Band) {
        +	if t.Rows != a.Rows || t.Cols != a.Cols {
        +		panic("cblas128: mismatched dimension")
        +	}
        +	if t.KL != a.KL || t.KU != a.KU {
        +		panic("cblas128: mismatched bandwidth")
        +	}
        +	if a.Stride < a.KL+a.KU+1 {
        +		panic("cblas128: short stride for source")
        +	}
        +	if t.Stride < t.KL+t.KU+1 {
        +		panic("cblas128: short stride for destination")
        +	}
        +	for i := 0; i < a.Rows; i++ {
        +		for j := max(0, i-a.KL); j < min(i+a.KU+1, a.Cols); j++ {
        +			t.Data[i+t.KU-j+j*t.Stride] = a.Data[j+a.KL-i+i*a.Stride]
        +		}
        +	}
        +}
        +
        +// From fills the receiver with elements from a. The receiver
        +// must have the same dimensions and bandwidth as a and have
        +// adequate backing data storage.
        +func (t Band) From(a BandCols) {
        +	if t.Rows != a.Rows || t.Cols != a.Cols {
        +		panic("cblas128: mismatched dimension")
        +	}
        +	if t.KL != a.KL || t.KU != a.KU {
        +		panic("cblas128: mismatched bandwidth")
        +	}
        +	if a.Stride < a.KL+a.KU+1 {
        +		panic("cblas128: short stride for source")
        +	}
        +	if t.Stride < t.KL+t.KU+1 {
        +		panic("cblas128: short stride for destination")
        +	}
        +	for j := 0; j < a.Cols; j++ {
        +		for i := max(0, j-a.KU); i < min(j+a.KL+1, a.Rows); i++ {
        +			t.Data[j+a.KL-i+i*a.Stride] = a.Data[i+t.KU-j+j*t.Stride]
        +		}
        +	}
        +}
        +
        +// TriangularBandCols represents a triangular matrix using the band column-major storage scheme.
        +type TriangularBandCols TriangularBand
        +
        +// From fills the receiver with elements from a. The receiver
        +// must have the same dimensions, bandwidth and uplo as a and
        +// have adequate backing data storage.
        +func (t TriangularBandCols) From(a TriangularBand) {
        +	if t.N != a.N {
        +		panic("cblas128: mismatched dimension")
        +	}
        +	if t.K != a.K {
        +		panic("cblas128: mismatched bandwidth")
        +	}
        +	if a.Stride < a.K+1 {
        +		panic("cblas128: short stride for source")
        +	}
        +	if t.Stride < t.K+1 {
        +		panic("cblas128: short stride for destination")
        +	}
        +	if t.Uplo != a.Uplo {
        +		panic("cblas128: mismatched BLAS uplo")
        +	}
        +	if t.Diag != a.Diag {
        +		panic("cblas128: mismatched BLAS diag")
        +	}
        +	dst := BandCols{
        +		Rows: t.N, Cols: t.N,
        +		Stride: t.Stride,
        +		Data:   t.Data,
        +	}
        +	src := Band{
        +		Rows: a.N, Cols: a.N,
        +		Stride: a.Stride,
        +		Data:   a.Data,
        +	}
        +	switch a.Uplo {
        +	default:
        +		panic("cblas128: bad BLAS uplo")
        +	case blas.Upper:
        +		dst.KU = t.K
        +		src.KU = a.K
        +	case blas.Lower:
        +		dst.KL = t.K
        +		src.KL = a.K
        +	}
        +	dst.From(src)
        +}
        +
        +// From fills the receiver with elements from a. The receiver
        +// must have the same dimensions, bandwidth and uplo as a and
        +// have adequate backing data storage.
        +func (t TriangularBand) From(a TriangularBandCols) {
        +	if t.N != a.N {
        +		panic("cblas128: mismatched dimension")
        +	}
        +	if t.K != a.K {
        +		panic("cblas128: mismatched bandwidth")
        +	}
        +	if a.Stride < a.K+1 {
        +		panic("cblas128: short stride for source")
        +	}
        +	if t.Stride < t.K+1 {
        +		panic("cblas128: short stride for destination")
        +	}
        +	if t.Uplo != a.Uplo {
        +		panic("cblas128: mismatched BLAS uplo")
        +	}
        +	if t.Diag != a.Diag {
        +		panic("cblas128: mismatched BLAS diag")
        +	}
        +	dst := Band{
        +		Rows: t.N, Cols: t.N,
        +		Stride: t.Stride,
        +		Data:   t.Data,
        +	}
        +	src := BandCols{
        +		Rows: a.N, Cols: a.N,
        +		Stride: a.Stride,
        +		Data:   a.Data,
        +	}
        +	switch a.Uplo {
        +	default:
        +		panic("cblas128: bad BLAS uplo")
        +	case blas.Upper:
        +		dst.KU = t.K
        +		src.KU = a.K
        +	case blas.Lower:
        +		dst.KL = t.K
        +		src.KL = a.K
        +	}
        +	dst.From(src)
        +}
        +
        +func min(a, b int) int {
        +	if a < b {
        +		return a
        +	}
        +	return b
        +}
        +
        +func max(a, b int) int {
        +	if a > b {
        +		return a
        +	}
        +	return b
        +}
        diff --git a/vendor/gonum.org/v1/gonum/blas/cblas128/conv_hermitian.go b/vendor/gonum.org/v1/gonum/blas/cblas128/conv_hermitian.go
        new file mode 100644
        index 000000000..51c3a5777
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/blas/cblas128/conv_hermitian.go
        @@ -0,0 +1,155 @@
        +// Code generated by "go generate gonum.org/v1/gonum/blas”; DO NOT EDIT.
        +
        +// Copyright ©2015 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package cblas128
        +
        +import "gonum.org/v1/gonum/blas"
        +
        +// HermitianCols represents a matrix using the conventional column-major storage scheme.
        +type HermitianCols Hermitian
        +
        +// From fills the receiver with elements from a. The receiver
        +// must have the same dimensions and uplo as a and have adequate
        +// backing data storage.
        +func (t HermitianCols) From(a Hermitian) {
        +	if t.N != a.N {
        +		panic("cblas128: mismatched dimension")
        +	}
        +	if t.Uplo != a.Uplo {
        +		panic("cblas128: mismatched BLAS uplo")
        +	}
        +	switch a.Uplo {
        +	default:
        +		panic("cblas128: bad BLAS uplo")
        +	case blas.Upper:
        +		for i := 0; i < a.N; i++ {
        +			for j := i; j < a.N; j++ {
        +				t.Data[i+j*t.Stride] = a.Data[i*a.Stride+j]
        +			}
        +		}
        +	case blas.Lower:
        +		for i := 0; i < a.N; i++ {
        +			for j := 0; j <= i; j++ {
        +				t.Data[i+j*t.Stride] = a.Data[i*a.Stride+j]
        +			}
        +		}
        +	}
        +}
        +
        +// From fills the receiver with elements from a. The receiver
        +// must have the same dimensions and uplo as a and have adequate
        +// backing data storage.
        +func (t Hermitian) From(a HermitianCols) {
        +	if t.N != a.N {
        +		panic("cblas128: mismatched dimension")
        +	}
        +	if t.Uplo != a.Uplo {
        +		panic("cblas128: mismatched BLAS uplo")
        +	}
        +	switch a.Uplo {
        +	default:
        +		panic("cblas128: bad BLAS uplo")
        +	case blas.Upper:
        +		for i := 0; i < a.N; i++ {
        +			for j := i; j < a.N; j++ {
        +				t.Data[i*t.Stride+j] = a.Data[i+j*a.Stride]
        +			}
        +		}
        +	case blas.Lower:
        +		for i := 0; i < a.N; i++ {
        +			for j := 0; j <= i; j++ {
        +				t.Data[i*t.Stride+j] = a.Data[i+j*a.Stride]
        +			}
        +		}
        +	}
        +}
        +
        +// HermitianBandCols represents an Hermitian matrix using the band column-major storage scheme.
        +type HermitianBandCols HermitianBand
        +
        +// From fills the receiver with elements from a. The receiver
        +// must have the same dimensions, bandwidth and uplo as a and
        +// have adequate backing data storage.
        +func (t HermitianBandCols) From(a HermitianBand) {
        +	if t.N != a.N {
        +		panic("cblas128: mismatched dimension")
        +	}
        +	if t.K != a.K {
        +		panic("cblas128: mismatched bandwidth")
        +	}
        +	if a.Stride < a.K+1 {
        +		panic("cblas128: short stride for source")
        +	}
        +	if t.Stride < t.K+1 {
        +		panic("cblas128: short stride for destination")
        +	}
        +	if t.Uplo != a.Uplo {
        +		panic("cblas128: mismatched BLAS uplo")
        +	}
        +	dst := BandCols{
        +		Rows: t.N, Cols: t.N,
        +		Stride: t.Stride,
        +		Data:   t.Data,
        +	}
        +	src := Band{
        +		Rows: a.N, Cols: a.N,
        +		Stride: a.Stride,
        +		Data:   a.Data,
        +	}
        +	switch a.Uplo {
        +	default:
        +		panic("cblas128: bad BLAS uplo")
        +	case blas.Upper:
        +		dst.KU = t.K
        +		src.KU = a.K
        +	case blas.Lower:
        +		dst.KL = t.K
        +		src.KL = a.K
        +	}
        +	dst.From(src)
        +}
        +
        +// From fills the receiver with elements from a. The receiver
        +// must have the same dimensions, bandwidth and uplo as a and
        +// have adequate backing data storage.
        +func (t HermitianBand) From(a HermitianBandCols) {
        +	if t.N != a.N {
        +		panic("cblas128: mismatched dimension")
        +	}
        +	if t.K != a.K {
        +		panic("cblas128: mismatched bandwidth")
        +	}
        +	if a.Stride < a.K+1 {
        +		panic("cblas128: short stride for source")
        +	}
        +	if t.Stride < t.K+1 {
        +		panic("cblas128: short stride for destination")
        +	}
        +	if t.Uplo != a.Uplo {
        +		panic("cblas128: mismatched BLAS uplo")
        +	}
        +	dst := Band{
        +		Rows: t.N, Cols: t.N,
        +		Stride: t.Stride,
        +		Data:   t.Data,
        +	}
        +	src := BandCols{
        +		Rows: a.N, Cols: a.N,
        +		Stride: a.Stride,
        +		Data:   a.Data,
        +	}
        +	switch a.Uplo {
        +	default:
        +		panic("cblas128: bad BLAS uplo")
        +	case blas.Upper:
        +		dst.KU = t.K
        +		src.KU = a.K
        +	case blas.Lower:
        +		dst.KL = t.K
        +		src.KL = a.K
        +	}
        +	dst.From(src)
        +}
        diff --git a/vendor/gonum.org/v1/gonum/blas/cblas128/conv_symmetric.go b/vendor/gonum.org/v1/gonum/blas/cblas128/conv_symmetric.go
        new file mode 100644
        index 000000000..f1bf40c20
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/blas/cblas128/conv_symmetric.go
        @@ -0,0 +1,155 @@
        +// Code generated by "go generate gonum.org/v1/gonum/blas”; DO NOT EDIT.
        +
        +// Copyright ©2015 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package cblas128
        +
        +import "gonum.org/v1/gonum/blas"
        +
        +// SymmetricCols represents a matrix using the conventional column-major storage scheme.
        +type SymmetricCols Symmetric
        +
        +// From fills the receiver with elements from a. The receiver
        +// must have the same dimensions and uplo as a and have adequate
        +// backing data storage.
        +func (t SymmetricCols) From(a Symmetric) {
        +	if t.N != a.N {
        +		panic("cblas128: mismatched dimension")
        +	}
        +	if t.Uplo != a.Uplo {
        +		panic("cblas128: mismatched BLAS uplo")
        +	}
        +	switch a.Uplo {
        +	default:
        +		panic("cblas128: bad BLAS uplo")
        +	case blas.Upper:
        +		for i := 0; i < a.N; i++ {
        +			for j := i; j < a.N; j++ {
        +				t.Data[i+j*t.Stride] = a.Data[i*a.Stride+j]
        +			}
        +		}
        +	case blas.Lower:
        +		for i := 0; i < a.N; i++ {
        +			for j := 0; j <= i; j++ {
        +				t.Data[i+j*t.Stride] = a.Data[i*a.Stride+j]
        +			}
        +		}
        +	}
        +}
        +
        +// From fills the receiver with elements from a. The receiver
        +// must have the same dimensions and uplo as a and have adequate
        +// backing data storage.
        +func (t Symmetric) From(a SymmetricCols) {
        +	if t.N != a.N {
        +		panic("cblas128: mismatched dimension")
        +	}
        +	if t.Uplo != a.Uplo {
        +		panic("cblas128: mismatched BLAS uplo")
        +	}
        +	switch a.Uplo {
        +	default:
        +		panic("cblas128: bad BLAS uplo")
        +	case blas.Upper:
        +		for i := 0; i < a.N; i++ {
        +			for j := i; j < a.N; j++ {
        +				t.Data[i*t.Stride+j] = a.Data[i+j*a.Stride]
        +			}
        +		}
        +	case blas.Lower:
        +		for i := 0; i < a.N; i++ {
        +			for j := 0; j <= i; j++ {
        +				t.Data[i*t.Stride+j] = a.Data[i+j*a.Stride]
        +			}
        +		}
        +	}
        +}
        +
        +// SymmetricBandCols represents a symmetric matrix using the band column-major storage scheme.
        +type SymmetricBandCols SymmetricBand
        +
        +// From fills the receiver with elements from a. The receiver
        +// must have the same dimensions, bandwidth and uplo as a and
        +// have adequate backing data storage.
        +func (t SymmetricBandCols) From(a SymmetricBand) {
        +	if t.N != a.N {
        +		panic("cblas128: mismatched dimension")
        +	}
        +	if t.K != a.K {
        +		panic("cblas128: mismatched bandwidth")
        +	}
        +	if a.Stride < a.K+1 {
        +		panic("cblas128: short stride for source")
        +	}
        +	if t.Stride < t.K+1 {
        +		panic("cblas128: short stride for destination")
        +	}
        +	if t.Uplo != a.Uplo {
        +		panic("cblas128: mismatched BLAS uplo")
        +	}
        +	dst := BandCols{
        +		Rows: t.N, Cols: t.N,
        +		Stride: t.Stride,
        +		Data:   t.Data,
        +	}
        +	src := Band{
        +		Rows: a.N, Cols: a.N,
        +		Stride: a.Stride,
        +		Data:   a.Data,
        +	}
        +	switch a.Uplo {
        +	default:
        +		panic("cblas128: bad BLAS uplo")
        +	case blas.Upper:
        +		dst.KU = t.K
        +		src.KU = a.K
        +	case blas.Lower:
        +		dst.KL = t.K
        +		src.KL = a.K
        +	}
        +	dst.From(src)
        +}
        +
        +// From fills the receiver with elements from a. The receiver
        +// must have the same dimensions, bandwidth and uplo as a and
        +// have adequate backing data storage.
        +func (t SymmetricBand) From(a SymmetricBandCols) {
        +	if t.N != a.N {
        +		panic("cblas128: mismatched dimension")
        +	}
        +	if t.K != a.K {
        +		panic("cblas128: mismatched bandwidth")
        +	}
        +	if a.Stride < a.K+1 {
        +		panic("cblas128: short stride for source")
        +	}
        +	if t.Stride < t.K+1 {
        +		panic("cblas128: short stride for destination")
        +	}
        +	if t.Uplo != a.Uplo {
        +		panic("cblas128: mismatched BLAS uplo")
        +	}
        +	dst := Band{
        +		Rows: t.N, Cols: t.N,
        +		Stride: t.Stride,
        +		Data:   t.Data,
        +	}
        +	src := BandCols{
        +		Rows: a.N, Cols: a.N,
        +		Stride: a.Stride,
        +		Data:   a.Data,
        +	}
        +	switch a.Uplo {
        +	default:
        +		panic("cblas128: bad BLAS uplo")
        +	case blas.Upper:
        +		dst.KU = t.K
        +		src.KU = a.K
        +	case blas.Lower:
        +		dst.KL = t.K
        +		src.KL = a.K
        +	}
        +	dst.From(src)
        +}
        diff --git a/vendor/gonum.org/v1/gonum/blas/cblas128/doc.go b/vendor/gonum.org/v1/gonum/blas/cblas128/doc.go
        new file mode 100644
        index 000000000..09719b19e
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/blas/cblas128/doc.go
        @@ -0,0 +1,6 @@
        +// Copyright ©2017 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// Package cblas128 provides a simple interface to the complex128 BLAS API.
        +package cblas128 // import "gonum.org/v1/gonum/blas/cblas128"
        diff --git a/vendor/gonum.org/v1/gonum/blas/conversions.bash b/vendor/gonum.org/v1/gonum/blas/conversions.bash
        old mode 100755
        new mode 100644
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/cmplx.go b/vendor/gonum.org/v1/gonum/blas/gonum/cmplx.go
        deleted file mode 100644
        index 53180913c..000000000
        --- a/vendor/gonum.org/v1/gonum/blas/gonum/cmplx.go
        +++ /dev/null
        @@ -1,164 +0,0 @@
        -// Copyright ©2017 The Gonum Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package gonum
        -
        -import "gonum.org/v1/gonum/blas"
        -
        -var (
        -	_ blas.Complex64  = Implementation{}
        -	_ blas.Complex128 = Implementation{}
        -)
        -
        -// TODO(btracey): Replace this as complex routines are added, and instead
        -// automatically generate the complex64 routines from the complex128 ones.
        -
        -var noComplex = "native: implementation does not implement this routine, see the cgo wrapper in gonum.org/v1/netlib/blas"
        -
        -// Level 1 complex64 routines.
        -
        -func (Implementation) Cdotu(n int, x []complex64, incX int, y []complex64, incY int) (dotu complex64) {
        -	panic(noComplex)
        -}
        -func (Implementation) Cdotc(n int, x []complex64, incX int, y []complex64, incY int) (dotc complex64) {
        -	panic(noComplex)
        -}
        -func (Implementation) Scnrm2(n int, x []complex64, incX int) float32 {
        -	panic(noComplex)
        -}
        -func (Implementation) Scasum(n int, x []complex64, incX int) float32 {
        -	panic(noComplex)
        -}
        -func (Implementation) Icamax(n int, x []complex64, incX int) int {
        -	panic(noComplex)
        -}
        -func (Implementation) Cswap(n int, x []complex64, incX int, y []complex64, incY int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Ccopy(n int, x []complex64, incX int, y []complex64, incY int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Caxpy(n int, alpha complex64, x []complex64, incX int, y []complex64, incY int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Cscal(n int, alpha complex64, x []complex64, incX int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Csscal(n int, alpha float32, x []complex64, incX int) {
        -	panic(noComplex)
        -}
        -
        -// Level 2 complex64 routines.
        -
        -func (Implementation) Cgemv(tA blas.Transpose, m, n int, alpha complex64, a []complex64, lda int, x []complex64, incX int, beta complex64, y []complex64, incY int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Cgbmv(tA blas.Transpose, m, n, kL, kU int, alpha complex64, a []complex64, lda int, x []complex64, incX int, beta complex64, y []complex64, incY int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Ctrmv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, a []complex64, lda int, x []complex64, incX int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Ctbmv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n, k int, a []complex64, lda int, x []complex64, incX int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Ctpmv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, ap []complex64, x []complex64, incX int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Ctrsv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, a []complex64, lda int, x []complex64, incX int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Ctbsv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n, k int, a []complex64, lda int, x []complex64, incX int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Ctpsv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, ap []complex64, x []complex64, incX int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Chemv(ul blas.Uplo, n int, alpha complex64, a []complex64, lda int, x []complex64, incX int, beta complex64, y []complex64, incY int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Chbmv(ul blas.Uplo, n, k int, alpha complex64, a []complex64, lda int, x []complex64, incX int, beta complex64, y []complex64, incY int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Chpmv(ul blas.Uplo, n int, alpha complex64, ap []complex64, x []complex64, incX int, beta complex64, y []complex64, incY int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Cgeru(m, n int, alpha complex64, x []complex64, incX int, y []complex64, incY int, a []complex64, lda int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Cgerc(m, n int, alpha complex64, x []complex64, incX int, y []complex64, incY int, a []complex64, lda int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Cher(ul blas.Uplo, n int, alpha float32, x []complex64, incX int, a []complex64, lda int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Chpr(ul blas.Uplo, n int, alpha float32, x []complex64, incX int, a []complex64) {
        -	panic(noComplex)
        -}
        -func (Implementation) Cher2(ul blas.Uplo, n int, alpha complex64, x []complex64, incX int, y []complex64, incY int, a []complex64, lda int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Chpr2(ul blas.Uplo, n int, alpha complex64, x []complex64, incX int, y []complex64, incY int, ap []complex64) {
        -	panic(noComplex)
        -}
        -
        -// Level 3 complex64 routines.
        -
        -func (Implementation) Cgemm(tA, tB blas.Transpose, m, n, k int, alpha complex64, a []complex64, lda int, b []complex64, ldb int, beta complex64, c []complex64, ldc int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Csymm(s blas.Side, ul blas.Uplo, m, n int, alpha complex64, a []complex64, lda int, b []complex64, ldb int, beta complex64, c []complex64, ldc int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Csyrk(ul blas.Uplo, t blas.Transpose, n, k int, alpha complex64, a []complex64, lda int, beta complex64, c []complex64, ldc int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Csyr2k(ul blas.Uplo, t blas.Transpose, n, k int, alpha complex64, a []complex64, lda int, b []complex64, ldb int, beta complex64, c []complex64, ldc int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Ctrmm(s blas.Side, ul blas.Uplo, tA blas.Transpose, d blas.Diag, m, n int, alpha complex64, a []complex64, lda int, b []complex64, ldb int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Ctrsm(s blas.Side, ul blas.Uplo, tA blas.Transpose, d blas.Diag, m, n int, alpha complex64, a []complex64, lda int, b []complex64, ldb int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Chemm(s blas.Side, ul blas.Uplo, m, n int, alpha complex64, a []complex64, lda int, b []complex64, ldb int, beta complex64, c []complex64, ldc int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Cherk(ul blas.Uplo, t blas.Transpose, n, k int, alpha float32, a []complex64, lda int, beta float32, c []complex64, ldc int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Cher2k(ul blas.Uplo, t blas.Transpose, n, k int, alpha complex64, a []complex64, lda int, b []complex64, ldb int, beta float32, c []complex64, ldc int) {
        -	panic(noComplex)
        -}
        -
        -// Level 3 complex128 routines.
        -
        -func (Implementation) Zgemm(tA, tB blas.Transpose, m, n, k int, alpha complex128, a []complex128, lda int, b []complex128, ldb int, beta complex128, c []complex128, ldc int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Zsymm(s blas.Side, ul blas.Uplo, m, n int, alpha complex128, a []complex128, lda int, b []complex128, ldb int, beta complex128, c []complex128, ldc int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Zsyrk(ul blas.Uplo, t blas.Transpose, n, k int, alpha complex128, a []complex128, lda int, beta complex128, c []complex128, ldc int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Zsyr2k(ul blas.Uplo, t blas.Transpose, n, k int, alpha complex128, a []complex128, lda int, b []complex128, ldb int, beta complex128, c []complex128, ldc int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Ztrmm(s blas.Side, ul blas.Uplo, tA blas.Transpose, d blas.Diag, m, n int, alpha complex128, a []complex128, lda int, b []complex128, ldb int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Ztrsm(s blas.Side, ul blas.Uplo, tA blas.Transpose, d blas.Diag, m, n int, alpha complex128, a []complex128, lda int, b []complex128, ldb int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Zhemm(s blas.Side, ul blas.Uplo, m, n int, alpha complex128, a []complex128, lda int, b []complex128, ldb int, beta complex128, c []complex128, ldc int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Zherk(ul blas.Uplo, t blas.Transpose, n, k int, alpha float64, a []complex128, lda int, beta float64, c []complex128, ldc int) {
        -	panic(noComplex)
        -}
        -func (Implementation) Zher2k(ul blas.Uplo, t blas.Transpose, n, k int, alpha complex128, a []complex128, lda int, b []complex128, ldb int, beta float64, c []complex128, ldc int) {
        -	panic(noComplex)
        -}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/dgemm.go b/vendor/gonum.org/v1/gonum/blas/gonum/dgemm.go
        index 4147aa88e..167dd27c9 100644
        --- a/vendor/gonum.org/v1/gonum/blas/gonum/dgemm.go
        +++ b/vendor/gonum.org/v1/gonum/blas/gonum/dgemm.go
        @@ -14,32 +14,88 @@ import (
         
         // Dgemm performs one of the matrix-matrix operations
         //  C = alpha * A * B + beta * C
        -//  C = alpha * A^T * B + beta * C
        -//  C = alpha * A * B^T + beta * C
        -//  C = alpha * A^T * B^T + beta * C
        +//  C = alpha * Aᵀ * B + beta * C
        +//  C = alpha * A * Bᵀ + beta * C
        +//  C = alpha * Aᵀ * Bᵀ + beta * C
         // where A is an m×k or k×m dense matrix, B is an n×k or k×n dense matrix, C is
         // an m×n matrix, and alpha and beta are scalars. tA and tB specify whether A or
         // B are transposed.
         func (Implementation) Dgemm(tA, tB blas.Transpose, m, n, k int, alpha float64, a []float64, lda int, b []float64, ldb int, beta float64, c []float64, ldc int) {
        -	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        +	switch tA {
        +	default:
         		panic(badTranspose)
        +	case blas.NoTrans, blas.Trans, blas.ConjTrans:
         	}
        -	if tB != blas.NoTrans && tB != blas.Trans && tB != blas.ConjTrans {
        +	switch tB {
        +	default:
         		panic(badTranspose)
        +	case blas.NoTrans, blas.Trans, blas.ConjTrans:
        +	}
        +	if m < 0 {
        +		panic(mLT0)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if k < 0 {
        +		panic(kLT0)
         	}
         	aTrans := tA == blas.Trans || tA == blas.ConjTrans
         	if aTrans {
        -		checkDMatrix('a', k, m, a, lda)
        +		if lda < max(1, m) {
        +			panic(badLdA)
        +		}
         	} else {
        -		checkDMatrix('a', m, k, a, lda)
        +		if lda < max(1, k) {
        +			panic(badLdA)
        +		}
         	}
         	bTrans := tB == blas.Trans || tB == blas.ConjTrans
         	if bTrans {
        -		checkDMatrix('b', n, k, b, ldb)
        +		if ldb < max(1, k) {
        +			panic(badLdB)
        +		}
        +	} else {
        +		if ldb < max(1, n) {
        +			panic(badLdB)
        +		}
        +	}
        +	if ldc < max(1, n) {
        +		panic(badLdC)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if aTrans {
        +		if len(a) < (k-1)*lda+m {
        +			panic(shortA)
        +		}
        +	} else {
        +		if len(a) < (m-1)*lda+k {
        +			panic(shortA)
        +		}
        +	}
        +	if bTrans {
        +		if len(b) < (n-1)*ldb+k {
        +			panic(shortB)
        +		}
         	} else {
        -		checkDMatrix('b', k, n, b, ldb)
        +		if len(b) < (k-1)*ldb+n {
        +			panic(shortB)
        +		}
        +	}
        +	if len(c) < (m-1)*ldc+n {
        +		panic(shortC)
        +	}
        +
        +	// Quick return if possible.
        +	if (alpha == 0 || k == 0) && beta == 1 {
        +		return
         	}
        -	checkDMatrix('c', m, n, c, ldc)
         
         	// scale c
         	if beta != 1 {
        @@ -78,9 +134,9 @@ func dgemmParallel(aTrans, bTrans bool, m, n, k int, a []float64, lda int, b []f
         	// In all cases, there is one dimension for each matrix along which
         	// C must be updated sequentially.
         	// Cij = \sum_k Aik Bki,	(A * B)
        -	// Cij = \sum_k Aki Bkj,	(A^T * B)
        -	// Cij = \sum_k Aik Bjk,	(A * B^T)
        -	// Cij = \sum_k Aki Bjk,	(A^T * B^T)
        +	// Cij = \sum_k Aki Bkj,	(Aᵀ * B)
        +	// Cij = \sum_k Aik Bjk,	(A * Bᵀ)
        +	// Cij = \sum_k Aki Bjk,	(Aᵀ * Bᵀ)
         	//
         	// This code computes one {i, j} block sequentially along the k dimension,
         	// and computes all of the {i, j} blocks concurrently. This
        @@ -124,13 +180,6 @@ func dgemmParallel(aTrans, bTrans bool, m, n, k int, a []float64, lda int, b []f
         		wg.Add(1)
         		go func() {
         			defer wg.Done()
        -			// Make local copies of otherwise global variables to reduce shared memory.
        -			// This has a noticeable effect on benchmarks in some cases.
        -			alpha := alpha
        -			aTrans := aTrans
        -			bTrans := bTrans
        -			m := m
        -			n := n
         			for sub := range sendChan {
         				i := sub.i
         				j := sub.j
        @@ -210,7 +259,7 @@ func dgemmSerialNotNot(m, n, k int, a []float64, lda int, b []float64, ldb int,
         		for l, v := range a[i*lda : i*lda+k] {
         			tmp := alpha * v
         			if tmp != 0 {
        -				f64.AxpyUnitaryTo(ctmp, tmp, b[l*ldb:l*ldb+n], ctmp)
        +				f64.AxpyUnitary(tmp, b[l*ldb:l*ldb+n], ctmp)
         			}
         		}
         	}
        @@ -226,7 +275,7 @@ func dgemmSerialTransNot(m, n, k int, a []float64, lda int, b []float64, ldb int
         			tmp := alpha * v
         			if tmp != 0 {
         				ctmp := c[i*ldc : i*ldc+n]
        -				f64.AxpyUnitaryTo(ctmp, tmp, btmp, ctmp)
        +				f64.AxpyUnitary(tmp, btmp, ctmp)
         			}
         		}
         	}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/errors.go b/vendor/gonum.org/v1/gonum/blas/gonum/errors.go
        new file mode 100644
        index 000000000..e98575d0f
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/blas/gonum/errors.go
        @@ -0,0 +1,35 @@
        +// Copyright ©2015 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package gonum
        +
        +// Panic strings used during parameter checks.
        +// This list is duplicated in netlib/blas/netlib. Keep in sync.
        +const (
        +	zeroIncX = "blas: zero x index increment"
        +	zeroIncY = "blas: zero y index increment"
        +
        +	mLT0  = "blas: m < 0"
        +	nLT0  = "blas: n < 0"
        +	kLT0  = "blas: k < 0"
        +	kLLT0 = "blas: kL < 0"
        +	kULT0 = "blas: kU < 0"
        +
        +	badUplo      = "blas: illegal triangle"
        +	badTranspose = "blas: illegal transpose"
        +	badDiag      = "blas: illegal diagonal"
        +	badSide      = "blas: illegal side"
        +	badFlag      = "blas: illegal rotm flag"
        +
        +	badLdA = "blas: bad leading dimension of A"
        +	badLdB = "blas: bad leading dimension of B"
        +	badLdC = "blas: bad leading dimension of C"
        +
        +	shortX  = "blas: insufficient length of x"
        +	shortY  = "blas: insufficient length of y"
        +	shortAP = "blas: insufficient length of ap"
        +	shortA  = "blas: insufficient length of a"
        +	shortB  = "blas: insufficient length of b"
        +	shortC  = "blas: insufficient length of c"
        +)
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/gemv.go b/vendor/gonum.org/v1/gonum/blas/gonum/gemv.go
        index acd8f323b..8bc3bf66d 100644
        --- a/vendor/gonum.org/v1/gonum/blas/gonum/gemv.go
        +++ b/vendor/gonum.org/v1/gonum/blas/gonum/gemv.go
        @@ -13,8 +13,8 @@ import (
         // TODO(Kunde21):  Merge these methods back into level2double/level2single when Sgemv assembly kernels are merged into f32.
         
         // Dgemv computes
        -//  y = alpha * A * x + beta * y    if tA = blas.NoTrans
        -//  y = alpha * A^T * x + beta * y  if tA = blas.Trans or blas.ConjTrans
        +//  y = alpha * A * x + beta * y   if tA = blas.NoTrans
        +//  y = alpha * Aᵀ * x + beta * y  if tA = blas.Trans or blas.ConjTrans
         // where A is an m×n dense matrix, x and y are vectors, and alpha and beta are scalars.
         func (Implementation) Dgemv(tA blas.Transpose, m, n int, alpha float64, a []float64, lda int, x []float64, incX int, beta float64, y []float64, incY int) {
         	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        @@ -29,7 +29,6 @@ func (Implementation) Dgemv(tA blas.Transpose, m, n int, alpha float64, a []floa
         	if lda < max(1, n) {
         		panic(badLdA)
         	}
        -
         	if incX == 0 {
         		panic(zeroIncX)
         	}
        @@ -43,18 +42,24 @@ func (Implementation) Dgemv(tA blas.Transpose, m, n int, alpha float64, a []floa
         		lenX = n
         		lenY = m
         	}
        +
        +	// Quick return if possible
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
         	if (incX > 0 && (lenX-1)*incX >= len(x)) || (incX < 0 && (1-lenX)*incX >= len(x)) {
        -		panic(badX)
        +		panic(shortX)
         	}
         	if (incY > 0 && (lenY-1)*incY >= len(y)) || (incY < 0 && (1-lenY)*incY >= len(y)) {
        -		panic(badY)
        +		panic(shortY)
         	}
        -	if lda*(m-1)+n > len(a) || lda < max(1, n) {
        -		panic(badLdA)
        +	if len(a) < lda*(m-1)+n {
        +		panic(shortA)
         	}
         
         	// Quick return if possible
        -	if m == 0 || n == 0 || (alpha == 0 && beta == 1) {
        +	if alpha == 0 && beta == 1 {
         		return
         	}
         
        @@ -78,8 +83,8 @@ func (Implementation) Dgemv(tA blas.Transpose, m, n int, alpha float64, a []floa
         }
         
         // Sgemv computes
        -//  y = alpha * A * x + beta * y    if tA = blas.NoTrans
        -//  y = alpha * A^T * x + beta * y  if tA = blas.Trans or blas.ConjTrans
        +//  y = alpha * A * x + beta * y   if tA = blas.NoTrans
        +//  y = alpha * Aᵀ * x + beta * y  if tA = blas.Trans or blas.ConjTrans
         // where A is an m×n dense matrix, x and y are vectors, and alpha and beta are scalars.
         //
         // Float32 implementations are autogenerated and not directly tested.
        @@ -96,13 +101,18 @@ func (Implementation) Sgemv(tA blas.Transpose, m, n int, alpha float32, a []floa
         	if lda < max(1, n) {
         		panic(badLdA)
         	}
        -
         	if incX == 0 {
         		panic(zeroIncX)
         	}
         	if incY == 0 {
         		panic(zeroIncY)
         	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
         	// Set up indexes
         	lenX := m
         	lenY := n
        @@ -111,28 +121,20 @@ func (Implementation) Sgemv(tA blas.Transpose, m, n int, alpha float32, a []floa
         		lenY = m
         	}
         	if (incX > 0 && (lenX-1)*incX >= len(x)) || (incX < 0 && (1-lenX)*incX >= len(x)) {
        -		panic(badX)
        +		panic(shortX)
         	}
         	if (incY > 0 && (lenY-1)*incY >= len(y)) || (incY < 0 && (1-lenY)*incY >= len(y)) {
        -		panic(badY)
        +		panic(shortY)
         	}
        -	if lda*(m-1)+n > len(a) || lda < max(1, n) {
        -		panic(badLdA)
        +	if len(a) < lda*(m-1)+n {
        +		panic(shortA)
         	}
         
        -	// Quick return if possible
        -	if m == 0 || n == 0 || (alpha == 0 && beta == 1) {
        +	// Quick return if possible.
        +	if alpha == 0 && beta == 1 {
         		return
         	}
         
        -	var kx, ky int
        -	if incX < 0 {
        -		kx = -(lenX - 1) * incX
        -	}
        -	if incY < 0 {
        -		ky = -(lenY - 1) * incY
        -	}
        -
         	// First form y = beta * y
         	if incY > 0 {
         		Implementation{}.Sscal(lenY, beta, y, incY)
        @@ -144,11 +146,19 @@ func (Implementation) Sgemv(tA blas.Transpose, m, n int, alpha float32, a []floa
         		return
         	}
         
        +	var kx, ky int
        +	if incX < 0 {
        +		kx = -(lenX - 1) * incX
        +	}
        +	if incY < 0 {
        +		ky = -(lenY - 1) * incY
        +	}
        +
         	// Form y = alpha * A * x + y
         	if tA == blas.NoTrans {
         		if incX == 1 && incY == 1 {
         			for i := 0; i < m; i++ {
        -				y[i] += alpha * f32.DotUnitary(a[lda*i:lda*i+n], x)
        +				y[i] += alpha * f32.DotUnitary(a[lda*i:lda*i+n], x[:n])
         			}
         			return
         		}
        @@ -164,7 +174,7 @@ func (Implementation) Sgemv(tA blas.Transpose, m, n int, alpha float32, a []floa
         		for i := 0; i < m; i++ {
         			tmp := alpha * x[i]
         			if tmp != 0 {
        -				f32.AxpyUnitaryTo(y, tmp, a[lda*i:lda*i+n], y)
        +				f32.AxpyUnitaryTo(y, tmp, a[lda*i:lda*i+n], y[:n])
         			}
         		}
         		return
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/gonum.go b/vendor/gonum.org/v1/gonum/blas/gonum/gonum.go
        index e18b69be2..8ab8d43e1 100644
        --- a/vendor/gonum.org/v1/gonum/blas/gonum/gonum.go
        +++ b/vendor/gonum.org/v1/gonum/blas/gonum/gonum.go
        @@ -6,34 +6,14 @@
         
         package gonum
         
        -import "math"
        +import (
        +	"math"
         
        -type Implementation struct{}
        -
        -// The following are panic strings used during parameter checks.
        -const (
        -	zeroIncX = "blas: zero x index increment"
        -	zeroIncY = "blas: zero y index increment"
        -
        -	mLT0  = "blas: m < 0"
        -	nLT0  = "blas: n < 0"
        -	kLT0  = "blas: k < 0"
        -	kLLT0 = "blas: kL < 0"
        -	kULT0 = "blas: kU < 0"
        -
        -	badUplo      = "blas: illegal triangle"
        -	badTranspose = "blas: illegal transpose"
        -	badDiag      = "blas: illegal diagonal"
        -	badSide      = "blas: illegal side"
        -
        -	badLdA = "blas: bad leading dimension of A"
        -	badLdB = "blas: bad leading dimension of B"
        -	badLdC = "blas: bad leading dimension of C"
        -
        -	badX = "blas: bad length of x"
        -	badY = "blas: bad length of y"
        +	"gonum.org/v1/gonum/internal/math32"
         )
         
        +type Implementation struct{}
        +
         // [SD]gemm behavior constants. These are kept here to keep them out of the
         // way during single precision code genration.
         const (
        @@ -61,115 +41,6 @@ func min(a, b int) int {
         	return a
         }
         
        -func checkSMatrix(name byte, m, n int, a []float32, lda int) {
        -	if m < 0 {
        -		panic(mLT0)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if lda < n {
        -		panic("blas: illegal stride of " + string(name))
        -	}
        -	if len(a) < (m-1)*lda+n {
        -		panic("blas: index of " + string(name) + " out of range")
        -	}
        -}
        -
        -func checkDMatrix(name byte, m, n int, a []float64, lda int) {
        -	if m < 0 {
        -		panic(mLT0)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if lda < n {
        -		panic("blas: illegal stride of " + string(name))
        -	}
        -	if len(a) < (m-1)*lda+n {
        -		panic("blas: index of " + string(name) + " out of range")
        -	}
        -}
        -
        -func checkZMatrix(name byte, m, n int, a []complex128, lda int) {
        -	if m < 0 {
        -		panic(mLT0)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if lda < max(1, n) {
        -		panic("blas: illegal stride of " + string(name))
        -	}
        -	if len(a) < (m-1)*lda+n {
        -		panic("blas: insufficient " + string(name) + " matrix slice length")
        -	}
        -}
        -
        -func checkZBandMatrix(name byte, m, n, kL, kU int, ab []complex128, ldab int) {
        -	if m < 0 {
        -		panic(mLT0)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if kL < 0 {
        -		panic(kLLT0)
        -	}
        -	if kU < 0 {
        -		panic(kULT0)
        -	}
        -	if ldab < kL+kU+1 {
        -		panic("blas: illegal stride of band matrix " + string(name))
        -	}
        -	nRow := min(m, n+kL)
        -	if len(ab) < (nRow-1)*ldab+kL+1+kU {
        -		panic("blas: insufficient " + string(name) + " band matrix slice length")
        -	}
        -}
        -
        -func checkZhbMatrix(name byte, n, k int, ab []complex128, ldab int) {
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if k < 0 {
        -		panic(kLT0)
        -	}
        -	if ldab < k+1 {
        -		panic("blas: illegal stride of Hermitian band matrix " + string(name))
        -	}
        -	if len(ab) < (n-1)*ldab+k+1 {
        -		panic("blas: insufficient " + string(name) + " Hermitian band matrix slice length")
        -	}
        -}
        -
        -func checkZtbMatrix(name byte, n, k int, ab []complex128, ldab int) {
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if k < 0 {
        -		panic(kLT0)
        -	}
        -	if ldab < k+1 {
        -		panic("blas: illegal stride of triangular band matrix " + string(name))
        -	}
        -	if len(ab) < (n-1)*ldab+k+1 {
        -		panic("blas: insufficient " + string(name) + " triangular band matrix slice length")
        -	}
        -}
        -
        -func checkZVector(name byte, n int, x []complex128, incX int) {
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic("blas: insufficient " + string(name) + " vector slice length")
        -	}
        -}
        -
         // blocks returns the number of divisions of the dimension length with the given
         // block size.
         func blocks(dim, bsize int) int {
        @@ -180,3 +51,8 @@ func blocks(dim, bsize int) int {
         func dcabs1(z complex128) float64 {
         	return math.Abs(real(z)) + math.Abs(imag(z))
         }
        +
        +// scabs1 returns |real(z)|+|imag(z)|.
        +func scabs1(z complex64) float32 {
        +	return math32.Abs(real(z)) + math32.Abs(imag(z))
        +}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/level1cmplx128.go b/vendor/gonum.org/v1/gonum/blas/gonum/level1cmplx128.go
        index d437b8c8d..a207db4bf 100644
        --- a/vendor/gonum.org/v1/gonum/blas/gonum/level1cmplx128.go
        +++ b/vendor/gonum.org/v1/gonum/blas/gonum/level1cmplx128.go
        @@ -7,9 +7,12 @@ package gonum
         import (
         	"math"
         
        +	"gonum.org/v1/gonum/blas"
         	"gonum.org/v1/gonum/internal/asm/c128"
         )
         
        +var _ blas.Complex128Level1 = Implementation{}
        +
         // Dzasum returns the sum of the absolute values of the elements of x
         //  \sum_i |Re(x[i])| + |Im(x[i])|
         // Dzasum returns 0 if incX is negative.
        @@ -26,7 +29,7 @@ func (Implementation) Dzasum(n int, x []complex128, incX int) float64 {
         	var sum float64
         	if incX == 1 {
         		if len(x) < n {
        -			panic(badX)
        +			panic(shortX)
         		}
         		for _, v := range x[:n] {
         			sum += dcabs1(v)
        @@ -34,7 +37,7 @@ func (Implementation) Dzasum(n int, x []complex128, incX int) float64 {
         		return sum
         	}
         	if (n-1)*incX >= len(x) {
        -		panic(badX)
        +		panic(shortX)
         	}
         	for i := 0; i < n; i++ {
         		v := x[i*incX]
        @@ -60,7 +63,7 @@ func (Implementation) Dznrm2(n int, x []complex128, incX int) float64 {
         		panic(nLT0)
         	}
         	if (n-1)*incX >= len(x) {
        -		panic(badX)
        +		panic(shortX)
         	}
         	var (
         		scale float64
        @@ -134,7 +137,7 @@ func (Implementation) Izamax(n int, x []complex128, incX int) int {
         		panic(nLT0)
         	}
         	if len(x) <= (n-1)*incX {
        -		panic(badX)
        +		panic(shortX)
         	}
         	idx := 0
         	max := dcabs1(x[0])
        @@ -176,10 +179,10 @@ func (Implementation) Zaxpy(n int, alpha complex128, x []complex128, incX int, y
         		panic(nLT0)
         	}
         	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        +		panic(shortX)
         	}
         	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        -		panic(badY)
        +		panic(shortY)
         	}
         	if alpha == 0 {
         		return
        @@ -213,10 +216,10 @@ func (Implementation) Zcopy(n int, x []complex128, incX int, y []complex128, inc
         		panic(nLT0)
         	}
         	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        +		panic(shortX)
         	}
         	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        -		panic(badY)
        +		panic(shortY)
         	}
         	if incX == 1 && incY == 1 {
         		copy(y[:n], x[:n])
        @@ -237,7 +240,7 @@ func (Implementation) Zcopy(n int, x []complex128, incX int, y []complex128, inc
         }
         
         // Zdotc computes the dot product
        -//  x^H · y
        +//  xᴴ · y
         // of two complex vectors x and y.
         func (Implementation) Zdotc(n int, x []complex128, incX int, y []complex128, incY int) complex128 {
         	if incX == 0 {
        @@ -254,10 +257,10 @@ func (Implementation) Zdotc(n int, x []complex128, incX int, y []complex128, inc
         	}
         	if incX == 1 && incY == 1 {
         		if len(x) < n {
        -			panic(badX)
        +			panic(shortX)
         		}
         		if len(y) < n {
        -			panic(badY)
        +			panic(shortY)
         		}
         		return c128.DotcUnitary(x[:n], y[:n])
         	}
        @@ -269,16 +272,16 @@ func (Implementation) Zdotc(n int, x []complex128, incX int, y []complex128, inc
         		iy = (-n + 1) * incY
         	}
         	if ix >= len(x) || (n-1)*incX >= len(x) {
        -		panic(badX)
        +		panic(shortX)
         	}
         	if iy >= len(y) || (n-1)*incY >= len(y) {
        -		panic(badY)
        +		panic(shortY)
         	}
         	return c128.DotcInc(x, y, uintptr(n), uintptr(incX), uintptr(incY), uintptr(ix), uintptr(iy))
         }
         
         // Zdotu computes the dot product
        -//  x^T · y
        +//  xᵀ · y
         // of two complex vectors x and y.
         func (Implementation) Zdotu(n int, x []complex128, incX int, y []complex128, incY int) complex128 {
         	if incX == 0 {
        @@ -295,10 +298,10 @@ func (Implementation) Zdotu(n int, x []complex128, incX int, y []complex128, inc
         	}
         	if incX == 1 && incY == 1 {
         		if len(x) < n {
        -			panic(badX)
        +			panic(shortX)
         		}
         		if len(y) < n {
        -			panic(badY)
        +			panic(shortY)
         		}
         		return c128.DotuUnitary(x[:n], y[:n])
         	}
        @@ -310,10 +313,10 @@ func (Implementation) Zdotu(n int, x []complex128, incX int, y []complex128, inc
         		iy = (-n + 1) * incY
         	}
         	if ix >= len(x) || (n-1)*incX >= len(x) {
        -		panic(badX)
        +		panic(shortX)
         	}
         	if iy >= len(y) || (n-1)*incY >= len(y) {
        -		panic(badY)
        +		panic(shortY)
         	}
         	return c128.DotuInc(x, y, uintptr(n), uintptr(incX), uintptr(incY), uintptr(ix), uintptr(iy))
         }
        @@ -328,7 +331,7 @@ func (Implementation) Zdscal(n int, alpha float64, x []complex128, incX int) {
         		return
         	}
         	if (n-1)*incX >= len(x) {
        -		panic(badX)
        +		panic(shortX)
         	}
         	if n < 1 {
         		if n == 0 {
        @@ -372,7 +375,7 @@ func (Implementation) Zscal(n int, alpha complex128, x []complex128, incX int) {
         		return
         	}
         	if (n-1)*incX >= len(x) {
        -		panic(badX)
        +		panic(shortX)
         	}
         	if n < 1 {
         		if n == 0 {
        @@ -415,10 +418,10 @@ func (Implementation) Zswap(n int, x []complex128, incX int, y []complex128, inc
         		panic(nLT0)
         	}
         	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        +		panic(shortX)
         	}
         	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        -		panic(badY)
        +		panic(shortY)
         	}
         	if incX == 1 && incY == 1 {
         		x = x[:n]
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/level1cmplx64.go b/vendor/gonum.org/v1/gonum/blas/gonum/level1cmplx64.go
        new file mode 100644
        index 000000000..018bae213
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/blas/gonum/level1cmplx64.go
        @@ -0,0 +1,467 @@
        +// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.
        +
        +// Copyright ©2017 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package gonum
        +
        +import (
        +	math "gonum.org/v1/gonum/internal/math32"
        +
        +	"gonum.org/v1/gonum/blas"
        +	"gonum.org/v1/gonum/internal/asm/c64"
        +)
        +
        +var _ blas.Complex64Level1 = Implementation{}
        +
        +// Scasum returns the sum of the absolute values of the elements of x
        +//  \sum_i |Re(x[i])| + |Im(x[i])|
        +// Scasum returns 0 if incX is negative.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Scasum(n int, x []complex64, incX int) float32 {
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if incX < 1 {
        +		if incX == 0 {
        +			panic(zeroIncX)
        +		}
        +		return 0
        +	}
        +	var sum float32
        +	if incX == 1 {
        +		if len(x) < n {
        +			panic(shortX)
        +		}
        +		for _, v := range x[:n] {
        +			sum += scabs1(v)
        +		}
        +		return sum
        +	}
        +	if (n-1)*incX >= len(x) {
        +		panic(shortX)
        +	}
        +	for i := 0; i < n; i++ {
        +		v := x[i*incX]
        +		sum += scabs1(v)
        +	}
        +	return sum
        +}
        +
        +// Scnrm2 computes the Euclidean norm of the complex vector x,
        +//  ‖x‖_2 = sqrt(\sum_i x[i] * conj(x[i])).
        +// This function returns 0 if incX is negative.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Scnrm2(n int, x []complex64, incX int) float32 {
        +	if incX < 1 {
        +		if incX == 0 {
        +			panic(zeroIncX)
        +		}
        +		return 0
        +	}
        +	if n < 1 {
        +		if n == 0 {
        +			return 0
        +		}
        +		panic(nLT0)
        +	}
        +	if (n-1)*incX >= len(x) {
        +		panic(shortX)
        +	}
        +	var (
        +		scale float32
        +		ssq   float32 = 1
        +	)
        +	if incX == 1 {
        +		for _, v := range x[:n] {
        +			re, im := math.Abs(real(v)), math.Abs(imag(v))
        +			if re != 0 {
        +				if re > scale {
        +					ssq = 1 + ssq*(scale/re)*(scale/re)
        +					scale = re
        +				} else {
        +					ssq += (re / scale) * (re / scale)
        +				}
        +			}
        +			if im != 0 {
        +				if im > scale {
        +					ssq = 1 + ssq*(scale/im)*(scale/im)
        +					scale = im
        +				} else {
        +					ssq += (im / scale) * (im / scale)
        +				}
        +			}
        +		}
        +		if math.IsInf(scale, 1) {
        +			return math.Inf(1)
        +		}
        +		return scale * math.Sqrt(ssq)
        +	}
        +	for ix := 0; ix < n*incX; ix += incX {
        +		re, im := math.Abs(real(x[ix])), math.Abs(imag(x[ix]))
        +		if re != 0 {
        +			if re > scale {
        +				ssq = 1 + ssq*(scale/re)*(scale/re)
        +				scale = re
        +			} else {
        +				ssq += (re / scale) * (re / scale)
        +			}
        +		}
        +		if im != 0 {
        +			if im > scale {
        +				ssq = 1 + ssq*(scale/im)*(scale/im)
        +				scale = im
        +			} else {
        +				ssq += (im / scale) * (im / scale)
        +			}
        +		}
        +	}
        +	if math.IsInf(scale, 1) {
        +		return math.Inf(1)
        +	}
        +	return scale * math.Sqrt(ssq)
        +}
        +
        +// Icamax returns the index of the first element of x having largest |Re(·)|+|Im(·)|.
        +// Icamax returns -1 if n is 0 or incX is negative.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Icamax(n int, x []complex64, incX int) int {
        +	if incX < 1 {
        +		if incX == 0 {
        +			panic(zeroIncX)
        +		}
        +		// Return invalid index.
        +		return -1
        +	}
        +	if n < 1 {
        +		if n == 0 {
        +			// Return invalid index.
        +			return -1
        +		}
        +		panic(nLT0)
        +	}
        +	if len(x) <= (n-1)*incX {
        +		panic(shortX)
        +	}
        +	idx := 0
        +	max := scabs1(x[0])
        +	if incX == 1 {
        +		for i, v := range x[1:n] {
        +			absV := scabs1(v)
        +			if absV > max {
        +				max = absV
        +				idx = i + 1
        +			}
        +		}
        +		return idx
        +	}
        +	ix := incX
        +	for i := 1; i < n; i++ {
        +		absV := scabs1(x[ix])
        +		if absV > max {
        +			max = absV
        +			idx = i
        +		}
        +		ix += incX
        +	}
        +	return idx
        +}
        +
        +// Caxpy adds alpha times x to y:
        +//  y[i] += alpha * x[i] for all i
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Caxpy(n int, alpha complex64, x []complex64, incX int, y []complex64, incY int) {
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +	if n < 1 {
        +		if n == 0 {
        +			return
        +		}
        +		panic(nLT0)
        +	}
        +	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        +		panic(shortY)
        +	}
        +	if alpha == 0 {
        +		return
        +	}
        +	if incX == 1 && incY == 1 {
        +		c64.AxpyUnitary(alpha, x[:n], y[:n])
        +		return
        +	}
        +	var ix, iy int
        +	if incX < 0 {
        +		ix = (1 - n) * incX
        +	}
        +	if incY < 0 {
        +		iy = (1 - n) * incY
        +	}
        +	c64.AxpyInc(alpha, x, y, uintptr(n), uintptr(incX), uintptr(incY), uintptr(ix), uintptr(iy))
        +}
        +
        +// Ccopy copies the vector x to vector y.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Ccopy(n int, x []complex64, incX int, y []complex64, incY int) {
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +	if n < 1 {
        +		if n == 0 {
        +			return
        +		}
        +		panic(nLT0)
        +	}
        +	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        +		panic(shortY)
        +	}
        +	if incX == 1 && incY == 1 {
        +		copy(y[:n], x[:n])
        +		return
        +	}
        +	var ix, iy int
        +	if incX < 0 {
        +		ix = (-n + 1) * incX
        +	}
        +	if incY < 0 {
        +		iy = (-n + 1) * incY
        +	}
        +	for i := 0; i < n; i++ {
        +		y[iy] = x[ix]
        +		ix += incX
        +		iy += incY
        +	}
        +}
        +
        +// Cdotc computes the dot product
        +//  xᴴ · y
        +// of two complex vectors x and y.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Cdotc(n int, x []complex64, incX int, y []complex64, incY int) complex64 {
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +	if n <= 0 {
        +		if n == 0 {
        +			return 0
        +		}
        +		panic(nLT0)
        +	}
        +	if incX == 1 && incY == 1 {
        +		if len(x) < n {
        +			panic(shortX)
        +		}
        +		if len(y) < n {
        +			panic(shortY)
        +		}
        +		return c64.DotcUnitary(x[:n], y[:n])
        +	}
        +	var ix, iy int
        +	if incX < 0 {
        +		ix = (-n + 1) * incX
        +	}
        +	if incY < 0 {
        +		iy = (-n + 1) * incY
        +	}
        +	if ix >= len(x) || (n-1)*incX >= len(x) {
        +		panic(shortX)
        +	}
        +	if iy >= len(y) || (n-1)*incY >= len(y) {
        +		panic(shortY)
        +	}
        +	return c64.DotcInc(x, y, uintptr(n), uintptr(incX), uintptr(incY), uintptr(ix), uintptr(iy))
        +}
        +
        +// Cdotu computes the dot product
        +//  xᵀ · y
        +// of two complex vectors x and y.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Cdotu(n int, x []complex64, incX int, y []complex64, incY int) complex64 {
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +	if n <= 0 {
        +		if n == 0 {
        +			return 0
        +		}
        +		panic(nLT0)
        +	}
        +	if incX == 1 && incY == 1 {
        +		if len(x) < n {
        +			panic(shortX)
        +		}
        +		if len(y) < n {
        +			panic(shortY)
        +		}
        +		return c64.DotuUnitary(x[:n], y[:n])
        +	}
        +	var ix, iy int
        +	if incX < 0 {
        +		ix = (-n + 1) * incX
        +	}
        +	if incY < 0 {
        +		iy = (-n + 1) * incY
        +	}
        +	if ix >= len(x) || (n-1)*incX >= len(x) {
        +		panic(shortX)
        +	}
        +	if iy >= len(y) || (n-1)*incY >= len(y) {
        +		panic(shortY)
        +	}
        +	return c64.DotuInc(x, y, uintptr(n), uintptr(incX), uintptr(incY), uintptr(ix), uintptr(iy))
        +}
        +
        +// Csscal scales the vector x by a real scalar alpha.
        +// Csscal has no effect if incX < 0.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Csscal(n int, alpha float32, x []complex64, incX int) {
        +	if incX < 1 {
        +		if incX == 0 {
        +			panic(zeroIncX)
        +		}
        +		return
        +	}
        +	if (n-1)*incX >= len(x) {
        +		panic(shortX)
        +	}
        +	if n < 1 {
        +		if n == 0 {
        +			return
        +		}
        +		panic(nLT0)
        +	}
        +	if alpha == 0 {
        +		if incX == 1 {
        +			x = x[:n]
        +			for i := range x {
        +				x[i] = 0
        +			}
        +			return
        +		}
        +		for ix := 0; ix < n*incX; ix += incX {
        +			x[ix] = 0
        +		}
        +		return
        +	}
        +	if incX == 1 {
        +		x = x[:n]
        +		for i, v := range x {
        +			x[i] = complex(alpha*real(v), alpha*imag(v))
        +		}
        +		return
        +	}
        +	for ix := 0; ix < n*incX; ix += incX {
        +		v := x[ix]
        +		x[ix] = complex(alpha*real(v), alpha*imag(v))
        +	}
        +}
        +
        +// Cscal scales the vector x by a complex scalar alpha.
        +// Cscal has no effect if incX < 0.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Cscal(n int, alpha complex64, x []complex64, incX int) {
        +	if incX < 1 {
        +		if incX == 0 {
        +			panic(zeroIncX)
        +		}
        +		return
        +	}
        +	if (n-1)*incX >= len(x) {
        +		panic(shortX)
        +	}
        +	if n < 1 {
        +		if n == 0 {
        +			return
        +		}
        +		panic(nLT0)
        +	}
        +	if alpha == 0 {
        +		if incX == 1 {
        +			x = x[:n]
        +			for i := range x {
        +				x[i] = 0
        +			}
        +			return
        +		}
        +		for ix := 0; ix < n*incX; ix += incX {
        +			x[ix] = 0
        +		}
        +		return
        +	}
        +	if incX == 1 {
        +		c64.ScalUnitary(alpha, x[:n])
        +		return
        +	}
        +	c64.ScalInc(alpha, x, uintptr(n), uintptr(incX))
        +}
        +
        +// Cswap exchanges the elements of two complex vectors x and y.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Cswap(n int, x []complex64, incX int, y []complex64, incY int) {
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +	if n < 1 {
        +		if n == 0 {
        +			return
        +		}
        +		panic(nLT0)
        +	}
        +	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        +		panic(shortY)
        +	}
        +	if incX == 1 && incY == 1 {
        +		x = x[:n]
        +		for i, v := range x {
        +			x[i], y[i] = y[i], v
        +		}
        +		return
        +	}
        +	var ix, iy int
        +	if incX < 0 {
        +		ix = (-n + 1) * incX
        +	}
        +	if incY < 0 {
        +		iy = (-n + 1) * incY
        +	}
        +	for i := 0; i < n; i++ {
        +		x[ix], y[iy] = y[iy], x[ix]
        +		ix += incX
        +		iy += incY
        +	}
        +}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/level1double.go b/vendor/gonum.org/v1/gonum/blas/gonum/level1double.go
        deleted file mode 100644
        index 84a6f2b06..000000000
        --- a/vendor/gonum.org/v1/gonum/blas/gonum/level1double.go
        +++ /dev/null
        @@ -1,620 +0,0 @@
        -// Copyright ©2015 The Gonum Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package gonum
        -
        -import (
        -	"math"
        -
        -	"gonum.org/v1/gonum/blas"
        -	"gonum.org/v1/gonum/internal/asm/f64"
        -)
        -
        -var _ blas.Float64Level1 = Implementation{}
        -
        -// Dnrm2 computes the Euclidean norm of a vector,
        -//  sqrt(\sum_i x[i] * x[i]).
        -// This function returns 0 if incX is negative.
        -func (Implementation) Dnrm2(n int, x []float64, incX int) float64 {
        -	if incX < 1 {
        -		if incX == 0 {
        -			panic(zeroIncX)
        -		}
        -		return 0
        -	}
        -	if incX > 0 && (n-1)*incX >= len(x) {
        -		panic(badX)
        -	}
        -	if n < 2 {
        -		if n == 1 {
        -			return math.Abs(x[0])
        -		}
        -		if n == 0 {
        -			return 0
        -		}
        -		panic(nLT0)
        -	}
        -	var (
        -		scale      float64 = 0
        -		sumSquares float64 = 1
        -	)
        -	if incX == 1 {
        -		x = x[:n]
        -		for _, v := range x {
        -			if v == 0 {
        -				continue
        -			}
        -			absxi := math.Abs(v)
        -			if math.IsNaN(absxi) {
        -				return math.NaN()
        -			}
        -			if scale < absxi {
        -				sumSquares = 1 + sumSquares*(scale/absxi)*(scale/absxi)
        -				scale = absxi
        -			} else {
        -				sumSquares = sumSquares + (absxi/scale)*(absxi/scale)
        -			}
        -		}
        -		if math.IsInf(scale, 1) {
        -			return math.Inf(1)
        -		}
        -		return scale * math.Sqrt(sumSquares)
        -	}
        -	for ix := 0; ix < n*incX; ix += incX {
        -		val := x[ix]
        -		if val == 0 {
        -			continue
        -		}
        -		absxi := math.Abs(val)
        -		if math.IsNaN(absxi) {
        -			return math.NaN()
        -		}
        -		if scale < absxi {
        -			sumSquares = 1 + sumSquares*(scale/absxi)*(scale/absxi)
        -			scale = absxi
        -		} else {
        -			sumSquares = sumSquares + (absxi/scale)*(absxi/scale)
        -		}
        -	}
        -	if math.IsInf(scale, 1) {
        -		return math.Inf(1)
        -	}
        -	return scale * math.Sqrt(sumSquares)
        -}
        -
        -// Dasum computes the sum of the absolute values of the elements of x.
        -//  \sum_i |x[i]|
        -// Dasum returns 0 if incX is negative.
        -func (Implementation) Dasum(n int, x []float64, incX int) float64 {
        -	var sum float64
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if incX < 1 {
        -		if incX == 0 {
        -			panic(zeroIncX)
        -		}
        -		return 0
        -	}
        -	if incX > 0 && (n-1)*incX >= len(x) {
        -		panic(badX)
        -	}
        -	if incX == 1 {
        -		x = x[:n]
        -		for _, v := range x {
        -			sum += math.Abs(v)
        -		}
        -		return sum
        -	}
        -	for i := 0; i < n; i++ {
        -		sum += math.Abs(x[i*incX])
        -	}
        -	return sum
        -}
        -
        -// Idamax returns the index of an element of x with the largest absolute value.
        -// If there are multiple such indices the earliest is returned.
        -// Idamax returns -1 if n == 0.
        -func (Implementation) Idamax(n int, x []float64, incX int) int {
        -	if incX < 1 {
        -		if incX == 0 {
        -			panic(zeroIncX)
        -		}
        -		return -1
        -	}
        -	if incX > 0 && (n-1)*incX >= len(x) {
        -		panic(badX)
        -	}
        -	if n < 2 {
        -		if n == 1 {
        -			return 0
        -		}
        -		if n == 0 {
        -			return -1 // Netlib returns invalid index when n == 0
        -		}
        -		panic(nLT0)
        -	}
        -	idx := 0
        -	max := math.Abs(x[0])
        -	if incX == 1 {
        -		for i, v := range x[:n] {
        -			absV := math.Abs(v)
        -			if absV > max {
        -				max = absV
        -				idx = i
        -			}
        -		}
        -		return idx
        -	}
        -	ix := incX
        -	for i := 1; i < n; i++ {
        -		v := x[ix]
        -		absV := math.Abs(v)
        -		if absV > max {
        -			max = absV
        -			idx = i
        -		}
        -		ix += incX
        -	}
        -	return idx
        -}
        -
        -// Dswap exchanges the elements of two vectors.
        -//  x[i], y[i] = y[i], x[i] for all i
        -func (Implementation) Dswap(n int, x []float64, incX int, y []float64, incY int) {
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	if n < 1 {
        -		if n == 0 {
        -			return
        -		}
        -		panic(nLT0)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        -		panic(badY)
        -	}
        -	if incX == 1 && incY == 1 {
        -		x = x[:n]
        -		for i, v := range x {
        -			x[i], y[i] = y[i], v
        -		}
        -		return
        -	}
        -	var ix, iy int
        -	if incX < 0 {
        -		ix = (-n + 1) * incX
        -	}
        -	if incY < 0 {
        -		iy = (-n + 1) * incY
        -	}
        -	for i := 0; i < n; i++ {
        -		x[ix], y[iy] = y[iy], x[ix]
        -		ix += incX
        -		iy += incY
        -	}
        -}
        -
        -// Dcopy copies the elements of x into the elements of y.
        -//  y[i] = x[i] for all i
        -func (Implementation) Dcopy(n int, x []float64, incX int, y []float64, incY int) {
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	if n < 1 {
        -		if n == 0 {
        -			return
        -		}
        -		panic(nLT0)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        -		panic(badY)
        -	}
        -	if incX == 1 && incY == 1 {
        -		copy(y[:n], x[:n])
        -		return
        -	}
        -	var ix, iy int
        -	if incX < 0 {
        -		ix = (-n + 1) * incX
        -	}
        -	if incY < 0 {
        -		iy = (-n + 1) * incY
        -	}
        -	for i := 0; i < n; i++ {
        -		y[iy] = x[ix]
        -		ix += incX
        -		iy += incY
        -	}
        -}
        -
        -// Daxpy adds alpha times x to y
        -//  y[i] += alpha * x[i] for all i
        -func (Implementation) Daxpy(n int, alpha float64, x []float64, incX int, y []float64, incY int) {
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	if n < 1 {
        -		if n == 0 {
        -			return
        -		}
        -		panic(nLT0)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        -		panic(badY)
        -	}
        -	if alpha == 0 {
        -		return
        -	}
        -	if incX == 1 && incY == 1 {
        -		f64.AxpyUnitary(alpha, x[:n], y[:n])
        -		return
        -	}
        -	var ix, iy int
        -	if incX < 0 {
        -		ix = (-n + 1) * incX
        -	}
        -	if incY < 0 {
        -		iy = (-n + 1) * incY
        -	}
        -	f64.AxpyInc(alpha, x, y, uintptr(n), uintptr(incX), uintptr(incY), uintptr(ix), uintptr(iy))
        -}
        -
        -// Drotg computes the plane rotation
        -//   _    _      _ _       _ _
        -//  |  c s |    | a |     | r |
        -//  | -s c |  * | b |   = | 0 |
        -//   ‾    ‾      ‾ ‾       ‾ ‾
        -// where
        -//  r = ±√(a^2 + b^2)
        -//  c = a/r, the cosine of the plane rotation
        -//  s = b/r, the sine of the plane rotation
        -//
        -// NOTE: There is a discrepancy between the refence implementation and the BLAS
        -// technical manual regarding the sign for r when a or b are zero.
        -// Drotg agrees with the definition in the manual and other
        -// common BLAS implementations.
        -func (Implementation) Drotg(a, b float64) (c, s, r, z float64) {
        -	if b == 0 && a == 0 {
        -		return 1, 0, a, 0
        -	}
        -	absA := math.Abs(a)
        -	absB := math.Abs(b)
        -	aGTb := absA > absB
        -	r = math.Hypot(a, b)
        -	if aGTb {
        -		r = math.Copysign(r, a)
        -	} else {
        -		r = math.Copysign(r, b)
        -	}
        -	c = a / r
        -	s = b / r
        -	if aGTb {
        -		z = s
        -	} else if c != 0 { // r == 0 case handled above
        -		z = 1 / c
        -	} else {
        -		z = 1
        -	}
        -	return
        -}
        -
        -// Drotmg computes the modified Givens rotation. See
        -// http://www.netlib.org/lapack/explore-html/df/deb/drotmg_8f.html
        -// for more details.
        -func (Implementation) Drotmg(d1, d2, x1, y1 float64) (p blas.DrotmParams, rd1, rd2, rx1 float64) {
        -	// The implementation of Drotmg used here is taken from Hopkins 1997
        -	// Appendix A: https://doi.org/10.1145/289251.289253
        -	// with the exception of the gam constants below.
        -
        -	const (
        -		gam    = 4096.0
        -		gamsq  = gam * gam
        -		rgamsq = 1.0 / gamsq
        -	)
        -
        -	if d1 < 0 {
        -		p.Flag = blas.Rescaling // Error state.
        -		return p, 0, 0, 0
        -	}
        -
        -	if d2 == 0 || y1 == 0 {
        -		p.Flag = blas.Identity
        -		return p, d1, d2, x1
        -	}
        -
        -	var h11, h12, h21, h22 float64
        -	if (d1 == 0 || x1 == 0) && d2 > 0 {
        -		p.Flag = blas.Diagonal
        -		h12 = 1
        -		h21 = -1
        -		x1 = y1
        -		d1, d2 = d2, d1
        -	} else {
        -		p2 := d2 * y1
        -		p1 := d1 * x1
        -		q2 := p2 * y1
        -		q1 := p1 * x1
        -		if math.Abs(q1) > math.Abs(q2) {
        -			p.Flag = blas.OffDiagonal
        -			h11 = 1
        -			h22 = 1
        -			h21 = -y1 / x1
        -			h12 = p2 / p1
        -			u := 1 - h12*h21
        -			if u <= 0 {
        -				p.Flag = blas.Rescaling // Error state.
        -				return p, 0, 0, 0
        -			}
        -
        -			d1 /= u
        -			d2 /= u
        -			x1 *= u
        -		} else {
        -			if q2 < 0 {
        -				p.Flag = blas.Rescaling // Error state.
        -				return p, 0, 0, 0
        -			}
        -
        -			p.Flag = blas.Diagonal
        -			h21 = -1
        -			h12 = 1
        -			h11 = p1 / p2
        -			h22 = x1 / y1
        -			u := 1 + h11*h22
        -			d1, d2 = d2/u, d1/u
        -			x1 = y1 * u
        -		}
        -	}
        -
        -	for d1 <= rgamsq && d1 != 0 {
        -		p.Flag = blas.Rescaling
        -		d1 = (d1 * gam) * gam
        -		x1 /= gam
        -		h11 /= gam
        -		h12 /= gam
        -	}
        -	for d1 > gamsq {
        -		p.Flag = blas.Rescaling
        -		d1 = (d1 / gam) / gam
        -		x1 *= gam
        -		h11 *= gam
        -		h12 *= gam
        -	}
        -
        -	for math.Abs(d2) <= rgamsq && d2 != 0 {
        -		p.Flag = blas.Rescaling
        -		d2 = (d2 * gam) * gam
        -		h21 /= gam
        -		h22 /= gam
        -	}
        -	for math.Abs(d2) > gamsq {
        -		p.Flag = blas.Rescaling
        -		d2 = (d2 / gam) / gam
        -		h21 *= gam
        -		h22 *= gam
        -	}
        -
        -	switch p.Flag {
        -	case blas.Diagonal:
        -		p.H = [4]float64{0: h11, 3: h22}
        -	case blas.OffDiagonal:
        -		p.H = [4]float64{1: h21, 2: h12}
        -	case blas.Rescaling:
        -		p.H = [4]float64{h11, h21, h12, h22}
        -	default:
        -		panic("blas: unexpected blas.Flag")
        -	}
        -
        -	return p, d1, d2, x1
        -}
        -
        -// Drot applies a plane transformation.
        -//  x[i] = c * x[i] + s * y[i]
        -//  y[i] = c * y[i] - s * x[i]
        -func (Implementation) Drot(n int, x []float64, incX int, y []float64, incY int, c float64, s float64) {
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	if n < 1 {
        -		if n == 0 {
        -			return
        -		}
        -		panic(nLT0)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        -		panic(badY)
        -	}
        -	if incX == 1 && incY == 1 {
        -		x = x[:n]
        -		for i, vx := range x {
        -			vy := y[i]
        -			x[i], y[i] = c*vx+s*vy, c*vy-s*vx
        -		}
        -		return
        -	}
        -	var ix, iy int
        -	if incX < 0 {
        -		ix = (-n + 1) * incX
        -	}
        -	if incY < 0 {
        -		iy = (-n + 1) * incY
        -	}
        -	for i := 0; i < n; i++ {
        -		vx := x[ix]
        -		vy := y[iy]
        -		x[ix], y[iy] = c*vx+s*vy, c*vy-s*vx
        -		ix += incX
        -		iy += incY
        -	}
        -}
        -
        -// Drotm applies the modified Givens rotation to the 2×n matrix.
        -func (Implementation) Drotm(n int, x []float64, incX int, y []float64, incY int, p blas.DrotmParams) {
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	if n <= 0 {
        -		if n == 0 {
        -			return
        -		}
        -		panic(nLT0)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        -		panic(badY)
        -	}
        -
        -	if p.Flag == blas.Identity {
        -		return
        -	}
        -
        -	switch p.Flag {
        -	case blas.Rescaling:
        -		h11 := p.H[0]
        -		h12 := p.H[2]
        -		h21 := p.H[1]
        -		h22 := p.H[3]
        -		if incX == 1 && incY == 1 {
        -			x = x[:n]
        -			for i, vx := range x {
        -				vy := y[i]
        -				x[i], y[i] = vx*h11+vy*h12, vx*h21+vy*h22
        -			}
        -			return
        -		}
        -		var ix, iy int
        -		if incX < 0 {
        -			ix = (-n + 1) * incX
        -		}
        -		if incY < 0 {
        -			iy = (-n + 1) * incY
        -		}
        -		for i := 0; i < n; i++ {
        -			vx := x[ix]
        -			vy := y[iy]
        -			x[ix], y[iy] = vx*h11+vy*h12, vx*h21+vy*h22
        -			ix += incX
        -			iy += incY
        -		}
        -	case blas.OffDiagonal:
        -		h12 := p.H[2]
        -		h21 := p.H[1]
        -		if incX == 1 && incY == 1 {
        -			x = x[:n]
        -			for i, vx := range x {
        -				vy := y[i]
        -				x[i], y[i] = vx+vy*h12, vx*h21+vy
        -			}
        -			return
        -		}
        -		var ix, iy int
        -		if incX < 0 {
        -			ix = (-n + 1) * incX
        -		}
        -		if incY < 0 {
        -			iy = (-n + 1) * incY
        -		}
        -		for i := 0; i < n; i++ {
        -			vx := x[ix]
        -			vy := y[iy]
        -			x[ix], y[iy] = vx+vy*h12, vx*h21+vy
        -			ix += incX
        -			iy += incY
        -		}
        -	case blas.Diagonal:
        -		h11 := p.H[0]
        -		h22 := p.H[3]
        -		if incX == 1 && incY == 1 {
        -			x = x[:n]
        -			for i, vx := range x {
        -				vy := y[i]
        -				x[i], y[i] = vx*h11+vy, -vx+vy*h22
        -			}
        -			return
        -		}
        -		var ix, iy int
        -		if incX < 0 {
        -			ix = (-n + 1) * incX
        -		}
        -		if incY < 0 {
        -			iy = (-n + 1) * incY
        -		}
        -		for i := 0; i < n; i++ {
        -			vx := x[ix]
        -			vy := y[iy]
        -			x[ix], y[iy] = vx*h11+vy, -vx+vy*h22
        -			ix += incX
        -			iy += incY
        -		}
        -	}
        -}
        -
        -// Dscal scales x by alpha.
        -//  x[i] *= alpha
        -// Dscal has no effect if incX < 0.
        -func (Implementation) Dscal(n int, alpha float64, x []float64, incX int) {
        -	if incX < 1 {
        -		if incX == 0 {
        -			panic(zeroIncX)
        -		}
        -		return
        -	}
        -	if (n-1)*incX >= len(x) {
        -		panic(badX)
        -	}
        -	if n < 1 {
        -		if n == 0 {
        -			return
        -		}
        -		panic(nLT0)
        -	}
        -	if alpha == 0 {
        -		if incX == 1 {
        -			x = x[:n]
        -			for i := range x {
        -				x[i] = 0
        -			}
        -			return
        -		}
        -		for ix := 0; ix < n*incX; ix += incX {
        -			x[ix] = 0
        -		}
        -		return
        -	}
        -	if incX == 1 {
        -		f64.ScalUnitary(alpha, x[:n])
        -		return
        -	}
        -	f64.ScalInc(alpha, x, uintptr(n), uintptr(incX))
        -}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/level1double_ddot.go b/vendor/gonum.org/v1/gonum/blas/gonum/level1double_ddot.go
        deleted file mode 100644
        index 95205e754..000000000
        --- a/vendor/gonum.org/v1/gonum/blas/gonum/level1double_ddot.go
        +++ /dev/null
        @@ -1,49 +0,0 @@
        -// Copyright ©2015 The Gonum Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package gonum
        -
        -import (
        -	"gonum.org/v1/gonum/internal/asm/f64"
        -)
        -
        -// Ddot computes the dot product of the two vectors
        -//  \sum_i x[i]*y[i]
        -func (Implementation) Ddot(n int, x []float64, incX int, y []float64, incY int) float64 {
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	if n <= 0 {
        -		if n == 0 {
        -			return 0
        -		}
        -		panic(nLT0)
        -	}
        -	if incX == 1 && incY == 1 {
        -		if len(x) < n {
        -			panic(badX)
        -		}
        -		if len(y) < n {
        -			panic(badY)
        -		}
        -		return f64.DotUnitary(x[:n], y)
        -	}
        -	var ix, iy int
        -	if incX < 0 {
        -		ix = (-n + 1) * incX
        -	}
        -	if incY < 0 {
        -		iy = (-n + 1) * incY
        -	}
        -	if ix >= len(x) || ix+(n-1)*incX >= len(x) {
        -		panic(badX)
        -	}
        -	if iy >= len(y) || iy+(n-1)*incY >= len(y) {
        -		panic(badY)
        -	}
        -	return f64.DotInc(x, y, uintptr(n), uintptr(incX), uintptr(incY), uintptr(ix), uintptr(iy))
        -}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/level1float32.go b/vendor/gonum.org/v1/gonum/blas/gonum/level1float32.go
        new file mode 100644
        index 000000000..c1648fb8d
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/blas/gonum/level1float32.go
        @@ -0,0 +1,602 @@
        +// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.
        +
        +// Copyright ©2015 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package gonum
        +
        +import (
        +	math "gonum.org/v1/gonum/internal/math32"
        +
        +	"gonum.org/v1/gonum/blas"
        +	"gonum.org/v1/gonum/internal/asm/f32"
        +)
        +
        +var _ blas.Float32Level1 = Implementation{}
        +
        +// Snrm2 computes the Euclidean norm of a vector,
        +//  sqrt(\sum_i x[i] * x[i]).
        +// This function returns 0 if incX is negative.
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Snrm2(n int, x []float32, incX int) float32 {
        +	if incX < 1 {
        +		if incX == 0 {
        +			panic(zeroIncX)
        +		}
        +		return 0
        +	}
        +	if len(x) <= (n-1)*incX {
        +		panic(shortX)
        +	}
        +	if n < 2 {
        +		if n == 1 {
        +			return math.Abs(x[0])
        +		}
        +		if n == 0 {
        +			return 0
        +		}
        +		panic(nLT0)
        +	}
        +	if incX == 1 {
        +		return f32.L2NormUnitary(x[:n])
        +	}
        +	return f32.L2NormInc(x, uintptr(n), uintptr(incX))
        +}
        +
        +// Sasum computes the sum of the absolute values of the elements of x.
        +//  \sum_i |x[i]|
        +// Sasum returns 0 if incX is negative.
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Sasum(n int, x []float32, incX int) float32 {
        +	var sum float32
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if incX < 1 {
        +		if incX == 0 {
        +			panic(zeroIncX)
        +		}
        +		return 0
        +	}
        +	if len(x) <= (n-1)*incX {
        +		panic(shortX)
        +	}
        +	if incX == 1 {
        +		x = x[:n]
        +		for _, v := range x {
        +			sum += math.Abs(v)
        +		}
        +		return sum
        +	}
        +	for i := 0; i < n; i++ {
        +		sum += math.Abs(x[i*incX])
        +	}
        +	return sum
        +}
        +
        +// Isamax returns the index of an element of x with the largest absolute value.
        +// If there are multiple such indices the earliest is returned.
        +// Isamax returns -1 if n == 0.
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Isamax(n int, x []float32, incX int) int {
        +	if incX < 1 {
        +		if incX == 0 {
        +			panic(zeroIncX)
        +		}
        +		return -1
        +	}
        +	if len(x) <= (n-1)*incX {
        +		panic(shortX)
        +	}
        +	if n < 2 {
        +		if n == 1 {
        +			return 0
        +		}
        +		if n == 0 {
        +			return -1 // Netlib returns invalid index when n == 0.
        +		}
        +		panic(nLT0)
        +	}
        +	idx := 0
        +	max := math.Abs(x[0])
        +	if incX == 1 {
        +		for i, v := range x[:n] {
        +			absV := math.Abs(v)
        +			if absV > max {
        +				max = absV
        +				idx = i
        +			}
        +		}
        +		return idx
        +	}
        +	ix := incX
        +	for i := 1; i < n; i++ {
        +		v := x[ix]
        +		absV := math.Abs(v)
        +		if absV > max {
        +			max = absV
        +			idx = i
        +		}
        +		ix += incX
        +	}
        +	return idx
        +}
        +
        +// Sswap exchanges the elements of two vectors.
        +//  x[i], y[i] = y[i], x[i] for all i
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Sswap(n int, x []float32, incX int, y []float32, incY int) {
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +	if n < 1 {
        +		if n == 0 {
        +			return
        +		}
        +		panic(nLT0)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +	if incX == 1 && incY == 1 {
        +		x = x[:n]
        +		for i, v := range x {
        +			x[i], y[i] = y[i], v
        +		}
        +		return
        +	}
        +	var ix, iy int
        +	if incX < 0 {
        +		ix = (-n + 1) * incX
        +	}
        +	if incY < 0 {
        +		iy = (-n + 1) * incY
        +	}
        +	for i := 0; i < n; i++ {
        +		x[ix], y[iy] = y[iy], x[ix]
        +		ix += incX
        +		iy += incY
        +	}
        +}
        +
        +// Scopy copies the elements of x into the elements of y.
        +//  y[i] = x[i] for all i
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Scopy(n int, x []float32, incX int, y []float32, incY int) {
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +	if n < 1 {
        +		if n == 0 {
        +			return
        +		}
        +		panic(nLT0)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +	if incX == 1 && incY == 1 {
        +		copy(y[:n], x[:n])
        +		return
        +	}
        +	var ix, iy int
        +	if incX < 0 {
        +		ix = (-n + 1) * incX
        +	}
        +	if incY < 0 {
        +		iy = (-n + 1) * incY
        +	}
        +	for i := 0; i < n; i++ {
        +		y[iy] = x[ix]
        +		ix += incX
        +		iy += incY
        +	}
        +}
        +
        +// Saxpy adds alpha times x to y
        +//  y[i] += alpha * x[i] for all i
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Saxpy(n int, alpha float32, x []float32, incX int, y []float32, incY int) {
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +	if n < 1 {
        +		if n == 0 {
        +			return
        +		}
        +		panic(nLT0)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +	if alpha == 0 {
        +		return
        +	}
        +	if incX == 1 && incY == 1 {
        +		f32.AxpyUnitary(alpha, x[:n], y[:n])
        +		return
        +	}
        +	var ix, iy int
        +	if incX < 0 {
        +		ix = (-n + 1) * incX
        +	}
        +	if incY < 0 {
        +		iy = (-n + 1) * incY
        +	}
        +	f32.AxpyInc(alpha, x, y, uintptr(n), uintptr(incX), uintptr(incY), uintptr(ix), uintptr(iy))
        +}
        +
        +// Srotg computes the plane rotation
        +//   _    _      _ _       _ _
        +//  |  c s |    | a |     | r |
        +//  | -s c |  * | b |   = | 0 |
        +//   ‾    ‾      ‾ ‾       ‾ ‾
        +// where
        +//  r = ±√(a^2 + b^2)
        +//  c = a/r, the cosine of the plane rotation
        +//  s = b/r, the sine of the plane rotation
        +//
        +// NOTE: There is a discrepancy between the reference implementation and the BLAS
        +// technical manual regarding the sign for r when a or b are zero.
        +// Srotg agrees with the definition in the manual and other
        +// common BLAS implementations.
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Srotg(a, b float32) (c, s, r, z float32) {
        +	if b == 0 && a == 0 {
        +		return 1, 0, a, 0
        +	}
        +	absA := math.Abs(a)
        +	absB := math.Abs(b)
        +	aGTb := absA > absB
        +	r = math.Hypot(a, b)
        +	if aGTb {
        +		r = math.Copysign(r, a)
        +	} else {
        +		r = math.Copysign(r, b)
        +	}
        +	c = a / r
        +	s = b / r
        +	if aGTb {
        +		z = s
        +	} else if c != 0 { // r == 0 case handled above
        +		z = 1 / c
        +	} else {
        +		z = 1
        +	}
        +	return
        +}
        +
        +// Srotmg computes the modified Givens rotation. See
        +// http://www.netlib.org/lapack/explore-html/df/deb/drotmg_8f.html
        +// for more details.
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Srotmg(d1, d2, x1, y1 float32) (p blas.SrotmParams, rd1, rd2, rx1 float32) {
        +	// The implementation of Drotmg used here is taken from Hopkins 1997
        +	// Appendix A: https://doi.org/10.1145/289251.289253
        +	// with the exception of the gam constants below.
        +
        +	const (
        +		gam    = 4096.0
        +		gamsq  = gam * gam
        +		rgamsq = 1.0 / gamsq
        +	)
        +
        +	if d1 < 0 {
        +		p.Flag = blas.Rescaling // Error state.
        +		return p, 0, 0, 0
        +	}
        +
        +	if d2 == 0 || y1 == 0 {
        +		p.Flag = blas.Identity
        +		return p, d1, d2, x1
        +	}
        +
        +	var h11, h12, h21, h22 float32
        +	if (d1 == 0 || x1 == 0) && d2 > 0 {
        +		p.Flag = blas.Diagonal
        +		h12 = 1
        +		h21 = -1
        +		x1 = y1
        +		d1, d2 = d2, d1
        +	} else {
        +		p2 := d2 * y1
        +		p1 := d1 * x1
        +		q2 := p2 * y1
        +		q1 := p1 * x1
        +		if math.Abs(q1) > math.Abs(q2) {
        +			p.Flag = blas.OffDiagonal
        +			h11 = 1
        +			h22 = 1
        +			h21 = -y1 / x1
        +			h12 = p2 / p1
        +			u := 1 - float32(h12*h21)
        +			if u <= 0 {
        +				p.Flag = blas.Rescaling // Error state.
        +				return p, 0, 0, 0
        +			}
        +
        +			d1 /= u
        +			d2 /= u
        +			x1 *= u
        +		} else {
        +			if q2 < 0 {
        +				p.Flag = blas.Rescaling // Error state.
        +				return p, 0, 0, 0
        +			}
        +
        +			p.Flag = blas.Diagonal
        +			h21 = -1
        +			h12 = 1
        +			h11 = p1 / p2
        +			h22 = x1 / y1
        +			u := 1 + float32(h11*h22)
        +			d1, d2 = d2/u, d1/u
        +			x1 = y1 * u
        +		}
        +	}
        +
        +	for d1 <= rgamsq && d1 != 0 {
        +		p.Flag = blas.Rescaling
        +		d1 = (d1 * gam) * gam
        +		x1 /= gam
        +		h11 /= gam
        +		h12 /= gam
        +	}
        +	for d1 > gamsq {
        +		p.Flag = blas.Rescaling
        +		d1 = (d1 / gam) / gam
        +		x1 *= gam
        +		h11 *= gam
        +		h12 *= gam
        +	}
        +
        +	for math.Abs(d2) <= rgamsq && d2 != 0 {
        +		p.Flag = blas.Rescaling
        +		d2 = (d2 * gam) * gam
        +		h21 /= gam
        +		h22 /= gam
        +	}
        +	for math.Abs(d2) > gamsq {
        +		p.Flag = blas.Rescaling
        +		d2 = (d2 / gam) / gam
        +		h21 *= gam
        +		h22 *= gam
        +	}
        +
        +	switch p.Flag {
        +	case blas.Diagonal:
        +		p.H = [4]float32{0: h11, 3: h22}
        +	case blas.OffDiagonal:
        +		p.H = [4]float32{1: h21, 2: h12}
        +	case blas.Rescaling:
        +		p.H = [4]float32{h11, h21, h12, h22}
        +	default:
        +		panic(badFlag)
        +	}
        +
        +	return p, d1, d2, x1
        +}
        +
        +// Srot applies a plane transformation.
        +//  x[i] = c * x[i] + s * y[i]
        +//  y[i] = c * y[i] - s * x[i]
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Srot(n int, x []float32, incX int, y []float32, incY int, c float32, s float32) {
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +	if n < 1 {
        +		if n == 0 {
        +			return
        +		}
        +		panic(nLT0)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +	if incX == 1 && incY == 1 {
        +		x = x[:n]
        +		for i, vx := range x {
        +			vy := y[i]
        +			x[i], y[i] = c*vx+s*vy, c*vy-s*vx
        +		}
        +		return
        +	}
        +	var ix, iy int
        +	if incX < 0 {
        +		ix = (-n + 1) * incX
        +	}
        +	if incY < 0 {
        +		iy = (-n + 1) * incY
        +	}
        +	for i := 0; i < n; i++ {
        +		vx := x[ix]
        +		vy := y[iy]
        +		x[ix], y[iy] = c*vx+s*vy, c*vy-s*vx
        +		ix += incX
        +		iy += incY
        +	}
        +}
        +
        +// Srotm applies the modified Givens rotation to the 2×n matrix.
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Srotm(n int, x []float32, incX int, y []float32, incY int, p blas.SrotmParams) {
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +	if n <= 0 {
        +		if n == 0 {
        +			return
        +		}
        +		panic(nLT0)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +
        +	if p.Flag == blas.Identity {
        +		return
        +	}
        +
        +	switch p.Flag {
        +	case blas.Rescaling:
        +		h11 := p.H[0]
        +		h12 := p.H[2]
        +		h21 := p.H[1]
        +		h22 := p.H[3]
        +		if incX == 1 && incY == 1 {
        +			x = x[:n]
        +			for i, vx := range x {
        +				vy := y[i]
        +				x[i], y[i] = float32(vx*h11)+float32(vy*h12), float32(vx*h21)+float32(vy*h22)
        +			}
        +			return
        +		}
        +		var ix, iy int
        +		if incX < 0 {
        +			ix = (-n + 1) * incX
        +		}
        +		if incY < 0 {
        +			iy = (-n + 1) * incY
        +		}
        +		for i := 0; i < n; i++ {
        +			vx := x[ix]
        +			vy := y[iy]
        +			x[ix], y[iy] = float32(vx*h11)+float32(vy*h12), float32(vx*h21)+float32(vy*h22)
        +			ix += incX
        +			iy += incY
        +		}
        +	case blas.OffDiagonal:
        +		h12 := p.H[2]
        +		h21 := p.H[1]
        +		if incX == 1 && incY == 1 {
        +			x = x[:n]
        +			for i, vx := range x {
        +				vy := y[i]
        +				x[i], y[i] = vx+float32(vy*h12), float32(vx*h21)+vy
        +			}
        +			return
        +		}
        +		var ix, iy int
        +		if incX < 0 {
        +			ix = (-n + 1) * incX
        +		}
        +		if incY < 0 {
        +			iy = (-n + 1) * incY
        +		}
        +		for i := 0; i < n; i++ {
        +			vx := x[ix]
        +			vy := y[iy]
        +			x[ix], y[iy] = vx+float32(vy*h12), float32(vx*h21)+vy
        +			ix += incX
        +			iy += incY
        +		}
        +	case blas.Diagonal:
        +		h11 := p.H[0]
        +		h22 := p.H[3]
        +		if incX == 1 && incY == 1 {
        +			x = x[:n]
        +			for i, vx := range x {
        +				vy := y[i]
        +				x[i], y[i] = float32(vx*h11)+vy, -vx+float32(vy*h22)
        +			}
        +			return
        +		}
        +		var ix, iy int
        +		if incX < 0 {
        +			ix = (-n + 1) * incX
        +		}
        +		if incY < 0 {
        +			iy = (-n + 1) * incY
        +		}
        +		for i := 0; i < n; i++ {
        +			vx := x[ix]
        +			vy := y[iy]
        +			x[ix], y[iy] = float32(vx*h11)+vy, -vx+float32(vy*h22)
        +			ix += incX
        +			iy += incY
        +		}
        +	}
        +}
        +
        +// Sscal scales x by alpha.
        +//  x[i] *= alpha
        +// Sscal has no effect if incX < 0.
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Sscal(n int, alpha float32, x []float32, incX int) {
        +	if incX < 1 {
        +		if incX == 0 {
        +			panic(zeroIncX)
        +		}
        +		return
        +	}
        +	if n < 1 {
        +		if n == 0 {
        +			return
        +		}
        +		panic(nLT0)
        +	}
        +	if (n-1)*incX >= len(x) {
        +		panic(shortX)
        +	}
        +	if alpha == 0 {
        +		if incX == 1 {
        +			x = x[:n]
        +			for i := range x {
        +				x[i] = 0
        +			}
        +			return
        +		}
        +		for ix := 0; ix < n*incX; ix += incX {
        +			x[ix] = 0
        +		}
        +		return
        +	}
        +	if incX == 1 {
        +		f32.ScalUnitary(alpha, x[:n])
        +		return
        +	}
        +	f32.ScalInc(alpha, x, uintptr(n), uintptr(incX))
        +}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/level1float32_dsdot.go b/vendor/gonum.org/v1/gonum/blas/gonum/level1float32_dsdot.go
        new file mode 100644
        index 000000000..089e0d8f0
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/blas/gonum/level1float32_dsdot.go
        @@ -0,0 +1,53 @@
        +// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.
        +
        +// Copyright ©2015 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package gonum
        +
        +import (
        +	"gonum.org/v1/gonum/internal/asm/f32"
        +)
        +
        +// Dsdot computes the dot product of the two vectors
        +//  \sum_i x[i]*y[i]
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Dsdot(n int, x []float32, incX int, y []float32, incY int) float64 {
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +	if n <= 0 {
        +		if n == 0 {
        +			return 0
        +		}
        +		panic(nLT0)
        +	}
        +	if incX == 1 && incY == 1 {
        +		if len(x) < n {
        +			panic(shortX)
        +		}
        +		if len(y) < n {
        +			panic(shortY)
        +		}
        +		return f32.DdotUnitary(x[:n], y[:n])
        +	}
        +	var ix, iy int
        +	if incX < 0 {
        +		ix = (-n + 1) * incX
        +	}
        +	if incY < 0 {
        +		iy = (-n + 1) * incY
        +	}
        +	if ix >= len(x) || ix+(n-1)*incX >= len(x) {
        +		panic(shortX)
        +	}
        +	if iy >= len(y) || iy+(n-1)*incY >= len(y) {
        +		panic(shortY)
        +	}
        +	return f32.DdotInc(x, y, uintptr(n), uintptr(incX), uintptr(incY), uintptr(ix), uintptr(iy))
        +}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/level1float32_sdot.go b/vendor/gonum.org/v1/gonum/blas/gonum/level1float32_sdot.go
        new file mode 100644
        index 000000000..41c3e7923
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/blas/gonum/level1float32_sdot.go
        @@ -0,0 +1,53 @@
        +// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.
        +
        +// Copyright ©2015 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package gonum
        +
        +import (
        +	"gonum.org/v1/gonum/internal/asm/f32"
        +)
        +
        +// Sdot computes the dot product of the two vectors
        +//  \sum_i x[i]*y[i]
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Sdot(n int, x []float32, incX int, y []float32, incY int) float32 {
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +	if n <= 0 {
        +		if n == 0 {
        +			return 0
        +		}
        +		panic(nLT0)
        +	}
        +	if incX == 1 && incY == 1 {
        +		if len(x) < n {
        +			panic(shortX)
        +		}
        +		if len(y) < n {
        +			panic(shortY)
        +		}
        +		return f32.DotUnitary(x[:n], y[:n])
        +	}
        +	var ix, iy int
        +	if incX < 0 {
        +		ix = (-n + 1) * incX
        +	}
        +	if incY < 0 {
        +		iy = (-n + 1) * incY
        +	}
        +	if ix >= len(x) || ix+(n-1)*incX >= len(x) {
        +		panic(shortX)
        +	}
        +	if iy >= len(y) || iy+(n-1)*incY >= len(y) {
        +		panic(shortY)
        +	}
        +	return f32.DotInc(x, y, uintptr(n), uintptr(incX), uintptr(incY), uintptr(ix), uintptr(iy))
        +}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/level1float32_sdsdot.go b/vendor/gonum.org/v1/gonum/blas/gonum/level1float32_sdsdot.go
        new file mode 100644
        index 000000000..69dd8aa1f
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/blas/gonum/level1float32_sdsdot.go
        @@ -0,0 +1,53 @@
        +// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.
        +
        +// Copyright ©2015 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package gonum
        +
        +import (
        +	"gonum.org/v1/gonum/internal/asm/f32"
        +)
        +
        +// Sdsdot computes the dot product of the two vectors plus a constant
        +//  alpha + \sum_i x[i]*y[i]
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Sdsdot(n int, alpha float32, x []float32, incX int, y []float32, incY int) float32 {
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +	if n <= 0 {
        +		if n == 0 {
        +			return 0
        +		}
        +		panic(nLT0)
        +	}
        +	if incX == 1 && incY == 1 {
        +		if len(x) < n {
        +			panic(shortX)
        +		}
        +		if len(y) < n {
        +			panic(shortY)
        +		}
        +		return alpha + float32(f32.DdotUnitary(x[:n], y[:n]))
        +	}
        +	var ix, iy int
        +	if incX < 0 {
        +		ix = (-n + 1) * incX
        +	}
        +	if incY < 0 {
        +		iy = (-n + 1) * incY
        +	}
        +	if ix >= len(x) || ix+(n-1)*incX >= len(x) {
        +		panic(shortX)
        +	}
        +	if iy >= len(y) || iy+(n-1)*incY >= len(y) {
        +		panic(shortY)
        +	}
        +	return alpha + float32(f32.DdotInc(x, y, uintptr(n), uintptr(incX), uintptr(incY), uintptr(ix), uintptr(iy)))
        +}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/level1float64.go b/vendor/gonum.org/v1/gonum/blas/gonum/level1float64.go
        new file mode 100644
        index 000000000..af0afdcce
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/blas/gonum/level1float64.go
        @@ -0,0 +1,578 @@
        +// Copyright ©2015 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package gonum
        +
        +import (
        +	"math"
        +
        +	"gonum.org/v1/gonum/blas"
        +	"gonum.org/v1/gonum/internal/asm/f64"
        +)
        +
        +var _ blas.Float64Level1 = Implementation{}
        +
        +// Dnrm2 computes the Euclidean norm of a vector,
        +//  sqrt(\sum_i x[i] * x[i]).
        +// This function returns 0 if incX is negative.
        +func (Implementation) Dnrm2(n int, x []float64, incX int) float64 {
        +	if incX < 1 {
        +		if incX == 0 {
        +			panic(zeroIncX)
        +		}
        +		return 0
        +	}
        +	if len(x) <= (n-1)*incX {
        +		panic(shortX)
        +	}
        +	if n < 2 {
        +		if n == 1 {
        +			return math.Abs(x[0])
        +		}
        +		if n == 0 {
        +			return 0
        +		}
        +		panic(nLT0)
        +	}
        +	if incX == 1 {
        +		return f64.L2NormUnitary(x[:n])
        +	}
        +	return f64.L2NormInc(x, uintptr(n), uintptr(incX))
        +}
        +
        +// Dasum computes the sum of the absolute values of the elements of x.
        +//  \sum_i |x[i]|
        +// Dasum returns 0 if incX is negative.
        +func (Implementation) Dasum(n int, x []float64, incX int) float64 {
        +	var sum float64
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if incX < 1 {
        +		if incX == 0 {
        +			panic(zeroIncX)
        +		}
        +		return 0
        +	}
        +	if len(x) <= (n-1)*incX {
        +		panic(shortX)
        +	}
        +	if incX == 1 {
        +		x = x[:n]
        +		for _, v := range x {
        +			sum += math.Abs(v)
        +		}
        +		return sum
        +	}
        +	for i := 0; i < n; i++ {
        +		sum += math.Abs(x[i*incX])
        +	}
        +	return sum
        +}
        +
        +// Idamax returns the index of an element of x with the largest absolute value.
        +// If there are multiple such indices the earliest is returned.
        +// Idamax returns -1 if n == 0.
        +func (Implementation) Idamax(n int, x []float64, incX int) int {
        +	if incX < 1 {
        +		if incX == 0 {
        +			panic(zeroIncX)
        +		}
        +		return -1
        +	}
        +	if len(x) <= (n-1)*incX {
        +		panic(shortX)
        +	}
        +	if n < 2 {
        +		if n == 1 {
        +			return 0
        +		}
        +		if n == 0 {
        +			return -1 // Netlib returns invalid index when n == 0.
        +		}
        +		panic(nLT0)
        +	}
        +	idx := 0
        +	max := math.Abs(x[0])
        +	if incX == 1 {
        +		for i, v := range x[:n] {
        +			absV := math.Abs(v)
        +			if absV > max {
        +				max = absV
        +				idx = i
        +			}
        +		}
        +		return idx
        +	}
        +	ix := incX
        +	for i := 1; i < n; i++ {
        +		v := x[ix]
        +		absV := math.Abs(v)
        +		if absV > max {
        +			max = absV
        +			idx = i
        +		}
        +		ix += incX
        +	}
        +	return idx
        +}
        +
        +// Dswap exchanges the elements of two vectors.
        +//  x[i], y[i] = y[i], x[i] for all i
        +func (Implementation) Dswap(n int, x []float64, incX int, y []float64, incY int) {
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +	if n < 1 {
        +		if n == 0 {
        +			return
        +		}
        +		panic(nLT0)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +	if incX == 1 && incY == 1 {
        +		x = x[:n]
        +		for i, v := range x {
        +			x[i], y[i] = y[i], v
        +		}
        +		return
        +	}
        +	var ix, iy int
        +	if incX < 0 {
        +		ix = (-n + 1) * incX
        +	}
        +	if incY < 0 {
        +		iy = (-n + 1) * incY
        +	}
        +	for i := 0; i < n; i++ {
        +		x[ix], y[iy] = y[iy], x[ix]
        +		ix += incX
        +		iy += incY
        +	}
        +}
        +
        +// Dcopy copies the elements of x into the elements of y.
        +//  y[i] = x[i] for all i
        +func (Implementation) Dcopy(n int, x []float64, incX int, y []float64, incY int) {
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +	if n < 1 {
        +		if n == 0 {
        +			return
        +		}
        +		panic(nLT0)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +	if incX == 1 && incY == 1 {
        +		copy(y[:n], x[:n])
        +		return
        +	}
        +	var ix, iy int
        +	if incX < 0 {
        +		ix = (-n + 1) * incX
        +	}
        +	if incY < 0 {
        +		iy = (-n + 1) * incY
        +	}
        +	for i := 0; i < n; i++ {
        +		y[iy] = x[ix]
        +		ix += incX
        +		iy += incY
        +	}
        +}
        +
        +// Daxpy adds alpha times x to y
        +//  y[i] += alpha * x[i] for all i
        +func (Implementation) Daxpy(n int, alpha float64, x []float64, incX int, y []float64, incY int) {
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +	if n < 1 {
        +		if n == 0 {
        +			return
        +		}
        +		panic(nLT0)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +	if alpha == 0 {
        +		return
        +	}
        +	if incX == 1 && incY == 1 {
        +		f64.AxpyUnitary(alpha, x[:n], y[:n])
        +		return
        +	}
        +	var ix, iy int
        +	if incX < 0 {
        +		ix = (-n + 1) * incX
        +	}
        +	if incY < 0 {
        +		iy = (-n + 1) * incY
        +	}
        +	f64.AxpyInc(alpha, x, y, uintptr(n), uintptr(incX), uintptr(incY), uintptr(ix), uintptr(iy))
        +}
        +
        +// Drotg computes the plane rotation
        +//   _    _      _ _       _ _
        +//  |  c s |    | a |     | r |
        +//  | -s c |  * | b |   = | 0 |
        +//   ‾    ‾      ‾ ‾       ‾ ‾
        +// where
        +//  r = ±√(a^2 + b^2)
        +//  c = a/r, the cosine of the plane rotation
        +//  s = b/r, the sine of the plane rotation
        +//
        +// NOTE: There is a discrepancy between the reference implementation and the BLAS
        +// technical manual regarding the sign for r when a or b are zero.
        +// Drotg agrees with the definition in the manual and other
        +// common BLAS implementations.
        +func (Implementation) Drotg(a, b float64) (c, s, r, z float64) {
        +	if b == 0 && a == 0 {
        +		return 1, 0, a, 0
        +	}
        +	absA := math.Abs(a)
        +	absB := math.Abs(b)
        +	aGTb := absA > absB
        +	r = math.Hypot(a, b)
        +	if aGTb {
        +		r = math.Copysign(r, a)
        +	} else {
        +		r = math.Copysign(r, b)
        +	}
        +	c = a / r
        +	s = b / r
        +	if aGTb {
        +		z = s
        +	} else if c != 0 { // r == 0 case handled above
        +		z = 1 / c
        +	} else {
        +		z = 1
        +	}
        +	return
        +}
        +
        +// Drotmg computes the modified Givens rotation. See
        +// http://www.netlib.org/lapack/explore-html/df/deb/drotmg_8f.html
        +// for more details.
        +func (Implementation) Drotmg(d1, d2, x1, y1 float64) (p blas.DrotmParams, rd1, rd2, rx1 float64) {
        +	// The implementation of Drotmg used here is taken from Hopkins 1997
        +	// Appendix A: https://doi.org/10.1145/289251.289253
        +	// with the exception of the gam constants below.
        +
        +	const (
        +		gam    = 4096.0
        +		gamsq  = gam * gam
        +		rgamsq = 1.0 / gamsq
        +	)
        +
        +	if d1 < 0 {
        +		p.Flag = blas.Rescaling // Error state.
        +		return p, 0, 0, 0
        +	}
        +
        +	if d2 == 0 || y1 == 0 {
        +		p.Flag = blas.Identity
        +		return p, d1, d2, x1
        +	}
        +
        +	var h11, h12, h21, h22 float64
        +	if (d1 == 0 || x1 == 0) && d2 > 0 {
        +		p.Flag = blas.Diagonal
        +		h12 = 1
        +		h21 = -1
        +		x1 = y1
        +		d1, d2 = d2, d1
        +	} else {
        +		p2 := d2 * y1
        +		p1 := d1 * x1
        +		q2 := p2 * y1
        +		q1 := p1 * x1
        +		if math.Abs(q1) > math.Abs(q2) {
        +			p.Flag = blas.OffDiagonal
        +			h11 = 1
        +			h22 = 1
        +			h21 = -y1 / x1
        +			h12 = p2 / p1
        +			u := 1 - float64(h12*h21)
        +			if u <= 0 {
        +				p.Flag = blas.Rescaling // Error state.
        +				return p, 0, 0, 0
        +			}
        +
        +			d1 /= u
        +			d2 /= u
        +			x1 *= u
        +		} else {
        +			if q2 < 0 {
        +				p.Flag = blas.Rescaling // Error state.
        +				return p, 0, 0, 0
        +			}
        +
        +			p.Flag = blas.Diagonal
        +			h21 = -1
        +			h12 = 1
        +			h11 = p1 / p2
        +			h22 = x1 / y1
        +			u := 1 + float64(h11*h22)
        +			d1, d2 = d2/u, d1/u
        +			x1 = y1 * u
        +		}
        +	}
        +
        +	for d1 <= rgamsq && d1 != 0 {
        +		p.Flag = blas.Rescaling
        +		d1 = (d1 * gam) * gam
        +		x1 /= gam
        +		h11 /= gam
        +		h12 /= gam
        +	}
        +	for d1 > gamsq {
        +		p.Flag = blas.Rescaling
        +		d1 = (d1 / gam) / gam
        +		x1 *= gam
        +		h11 *= gam
        +		h12 *= gam
        +	}
        +
        +	for math.Abs(d2) <= rgamsq && d2 != 0 {
        +		p.Flag = blas.Rescaling
        +		d2 = (d2 * gam) * gam
        +		h21 /= gam
        +		h22 /= gam
        +	}
        +	for math.Abs(d2) > gamsq {
        +		p.Flag = blas.Rescaling
        +		d2 = (d2 / gam) / gam
        +		h21 *= gam
        +		h22 *= gam
        +	}
        +
        +	switch p.Flag {
        +	case blas.Diagonal:
        +		p.H = [4]float64{0: h11, 3: h22}
        +	case blas.OffDiagonal:
        +		p.H = [4]float64{1: h21, 2: h12}
        +	case blas.Rescaling:
        +		p.H = [4]float64{h11, h21, h12, h22}
        +	default:
        +		panic(badFlag)
        +	}
        +
        +	return p, d1, d2, x1
        +}
        +
        +// Drot applies a plane transformation.
        +//  x[i] = c * x[i] + s * y[i]
        +//  y[i] = c * y[i] - s * x[i]
        +func (Implementation) Drot(n int, x []float64, incX int, y []float64, incY int, c float64, s float64) {
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +	if n < 1 {
        +		if n == 0 {
        +			return
        +		}
        +		panic(nLT0)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +	if incX == 1 && incY == 1 {
        +		x = x[:n]
        +		for i, vx := range x {
        +			vy := y[i]
        +			x[i], y[i] = c*vx+s*vy, c*vy-s*vx
        +		}
        +		return
        +	}
        +	var ix, iy int
        +	if incX < 0 {
        +		ix = (-n + 1) * incX
        +	}
        +	if incY < 0 {
        +		iy = (-n + 1) * incY
        +	}
        +	for i := 0; i < n; i++ {
        +		vx := x[ix]
        +		vy := y[iy]
        +		x[ix], y[iy] = c*vx+s*vy, c*vy-s*vx
        +		ix += incX
        +		iy += incY
        +	}
        +}
        +
        +// Drotm applies the modified Givens rotation to the 2×n matrix.
        +func (Implementation) Drotm(n int, x []float64, incX int, y []float64, incY int, p blas.DrotmParams) {
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +	if n <= 0 {
        +		if n == 0 {
        +			return
        +		}
        +		panic(nLT0)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +
        +	if p.Flag == blas.Identity {
        +		return
        +	}
        +
        +	switch p.Flag {
        +	case blas.Rescaling:
        +		h11 := p.H[0]
        +		h12 := p.H[2]
        +		h21 := p.H[1]
        +		h22 := p.H[3]
        +		if incX == 1 && incY == 1 {
        +			x = x[:n]
        +			for i, vx := range x {
        +				vy := y[i]
        +				x[i], y[i] = float64(vx*h11)+float64(vy*h12), float64(vx*h21)+float64(vy*h22)
        +			}
        +			return
        +		}
        +		var ix, iy int
        +		if incX < 0 {
        +			ix = (-n + 1) * incX
        +		}
        +		if incY < 0 {
        +			iy = (-n + 1) * incY
        +		}
        +		for i := 0; i < n; i++ {
        +			vx := x[ix]
        +			vy := y[iy]
        +			x[ix], y[iy] = float64(vx*h11)+float64(vy*h12), float64(vx*h21)+float64(vy*h22)
        +			ix += incX
        +			iy += incY
        +		}
        +	case blas.OffDiagonal:
        +		h12 := p.H[2]
        +		h21 := p.H[1]
        +		if incX == 1 && incY == 1 {
        +			x = x[:n]
        +			for i, vx := range x {
        +				vy := y[i]
        +				x[i], y[i] = vx+float64(vy*h12), float64(vx*h21)+vy
        +			}
        +			return
        +		}
        +		var ix, iy int
        +		if incX < 0 {
        +			ix = (-n + 1) * incX
        +		}
        +		if incY < 0 {
        +			iy = (-n + 1) * incY
        +		}
        +		for i := 0; i < n; i++ {
        +			vx := x[ix]
        +			vy := y[iy]
        +			x[ix], y[iy] = vx+float64(vy*h12), float64(vx*h21)+vy
        +			ix += incX
        +			iy += incY
        +		}
        +	case blas.Diagonal:
        +		h11 := p.H[0]
        +		h22 := p.H[3]
        +		if incX == 1 && incY == 1 {
        +			x = x[:n]
        +			for i, vx := range x {
        +				vy := y[i]
        +				x[i], y[i] = float64(vx*h11)+vy, -vx+float64(vy*h22)
        +			}
        +			return
        +		}
        +		var ix, iy int
        +		if incX < 0 {
        +			ix = (-n + 1) * incX
        +		}
        +		if incY < 0 {
        +			iy = (-n + 1) * incY
        +		}
        +		for i := 0; i < n; i++ {
        +			vx := x[ix]
        +			vy := y[iy]
        +			x[ix], y[iy] = float64(vx*h11)+vy, -vx+float64(vy*h22)
        +			ix += incX
        +			iy += incY
        +		}
        +	}
        +}
        +
        +// Dscal scales x by alpha.
        +//  x[i] *= alpha
        +// Dscal has no effect if incX < 0.
        +func (Implementation) Dscal(n int, alpha float64, x []float64, incX int) {
        +	if incX < 1 {
        +		if incX == 0 {
        +			panic(zeroIncX)
        +		}
        +		return
        +	}
        +	if n < 1 {
        +		if n == 0 {
        +			return
        +		}
        +		panic(nLT0)
        +	}
        +	if (n-1)*incX >= len(x) {
        +		panic(shortX)
        +	}
        +	if alpha == 0 {
        +		if incX == 1 {
        +			x = x[:n]
        +			for i := range x {
        +				x[i] = 0
        +			}
        +			return
        +		}
        +		for ix := 0; ix < n*incX; ix += incX {
        +			x[ix] = 0
        +		}
        +		return
        +	}
        +	if incX == 1 {
        +		f64.ScalUnitary(alpha, x[:n])
        +		return
        +	}
        +	f64.ScalInc(alpha, x, uintptr(n), uintptr(incX))
        +}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/level1float64_ddot.go b/vendor/gonum.org/v1/gonum/blas/gonum/level1float64_ddot.go
        new file mode 100644
        index 000000000..be87ba13d
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/blas/gonum/level1float64_ddot.go
        @@ -0,0 +1,49 @@
        +// Copyright ©2015 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package gonum
        +
        +import (
        +	"gonum.org/v1/gonum/internal/asm/f64"
        +)
        +
        +// Ddot computes the dot product of the two vectors
        +//  \sum_i x[i]*y[i]
        +func (Implementation) Ddot(n int, x []float64, incX int, y []float64, incY int) float64 {
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +	if n <= 0 {
        +		if n == 0 {
        +			return 0
        +		}
        +		panic(nLT0)
        +	}
        +	if incX == 1 && incY == 1 {
        +		if len(x) < n {
        +			panic(shortX)
        +		}
        +		if len(y) < n {
        +			panic(shortY)
        +		}
        +		return f64.DotUnitary(x[:n], y[:n])
        +	}
        +	var ix, iy int
        +	if incX < 0 {
        +		ix = (-n + 1) * incX
        +	}
        +	if incY < 0 {
        +		iy = (-n + 1) * incY
        +	}
        +	if ix >= len(x) || ix+(n-1)*incX >= len(x) {
        +		panic(shortX)
        +	}
        +	if iy >= len(y) || iy+(n-1)*incY >= len(y) {
        +		panic(shortY)
        +	}
        +	return f64.DotInc(x, y, uintptr(n), uintptr(incX), uintptr(incY), uintptr(ix), uintptr(iy))
        +}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/level1single.go b/vendor/gonum.org/v1/gonum/blas/gonum/level1single.go
        deleted file mode 100644
        index c34cd9432..000000000
        --- a/vendor/gonum.org/v1/gonum/blas/gonum/level1single.go
        +++ /dev/null
        @@ -1,644 +0,0 @@
        -// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.
        -
        -// Copyright ©2015 The Gonum Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package gonum
        -
        -import (
        -	math "gonum.org/v1/gonum/internal/math32"
        -
        -	"gonum.org/v1/gonum/blas"
        -	"gonum.org/v1/gonum/internal/asm/f32"
        -)
        -
        -var _ blas.Float32Level1 = Implementation{}
        -
        -// Snrm2 computes the Euclidean norm of a vector,
        -//  sqrt(\sum_i x[i] * x[i]).
        -// This function returns 0 if incX is negative.
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Snrm2(n int, x []float32, incX int) float32 {
        -	if incX < 1 {
        -		if incX == 0 {
        -			panic(zeroIncX)
        -		}
        -		return 0
        -	}
        -	if incX > 0 && (n-1)*incX >= len(x) {
        -		panic(badX)
        -	}
        -	if n < 2 {
        -		if n == 1 {
        -			return math.Abs(x[0])
        -		}
        -		if n == 0 {
        -			return 0
        -		}
        -		panic(nLT0)
        -	}
        -	var (
        -		scale      float32 = 0
        -		sumSquares float32 = 1
        -	)
        -	if incX == 1 {
        -		x = x[:n]
        -		for _, v := range x {
        -			if v == 0 {
        -				continue
        -			}
        -			absxi := math.Abs(v)
        -			if math.IsNaN(absxi) {
        -				return math.NaN()
        -			}
        -			if scale < absxi {
        -				sumSquares = 1 + sumSquares*(scale/absxi)*(scale/absxi)
        -				scale = absxi
        -			} else {
        -				sumSquares = sumSquares + (absxi/scale)*(absxi/scale)
        -			}
        -		}
        -		if math.IsInf(scale, 1) {
        -			return math.Inf(1)
        -		}
        -		return scale * math.Sqrt(sumSquares)
        -	}
        -	for ix := 0; ix < n*incX; ix += incX {
        -		val := x[ix]
        -		if val == 0 {
        -			continue
        -		}
        -		absxi := math.Abs(val)
        -		if math.IsNaN(absxi) {
        -			return math.NaN()
        -		}
        -		if scale < absxi {
        -			sumSquares = 1 + sumSquares*(scale/absxi)*(scale/absxi)
        -			scale = absxi
        -		} else {
        -			sumSquares = sumSquares + (absxi/scale)*(absxi/scale)
        -		}
        -	}
        -	if math.IsInf(scale, 1) {
        -		return math.Inf(1)
        -	}
        -	return scale * math.Sqrt(sumSquares)
        -}
        -
        -// Sasum computes the sum of the absolute values of the elements of x.
        -//  \sum_i |x[i]|
        -// Sasum returns 0 if incX is negative.
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Sasum(n int, x []float32, incX int) float32 {
        -	var sum float32
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if incX < 1 {
        -		if incX == 0 {
        -			panic(zeroIncX)
        -		}
        -		return 0
        -	}
        -	if incX > 0 && (n-1)*incX >= len(x) {
        -		panic(badX)
        -	}
        -	if incX == 1 {
        -		x = x[:n]
        -		for _, v := range x {
        -			sum += math.Abs(v)
        -		}
        -		return sum
        -	}
        -	for i := 0; i < n; i++ {
        -		sum += math.Abs(x[i*incX])
        -	}
        -	return sum
        -}
        -
        -// Isamax returns the index of an element of x with the largest absolute value.
        -// If there are multiple such indices the earliest is returned.
        -// Isamax returns -1 if n == 0.
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Isamax(n int, x []float32, incX int) int {
        -	if incX < 1 {
        -		if incX == 0 {
        -			panic(zeroIncX)
        -		}
        -		return -1
        -	}
        -	if incX > 0 && (n-1)*incX >= len(x) {
        -		panic(badX)
        -	}
        -	if n < 2 {
        -		if n == 1 {
        -			return 0
        -		}
        -		if n == 0 {
        -			return -1 // Netlib returns invalid index when n == 0
        -		}
        -		panic(nLT0)
        -	}
        -	idx := 0
        -	max := math.Abs(x[0])
        -	if incX == 1 {
        -		for i, v := range x[:n] {
        -			absV := math.Abs(v)
        -			if absV > max {
        -				max = absV
        -				idx = i
        -			}
        -		}
        -		return idx
        -	}
        -	ix := incX
        -	for i := 1; i < n; i++ {
        -		v := x[ix]
        -		absV := math.Abs(v)
        -		if absV > max {
        -			max = absV
        -			idx = i
        -		}
        -		ix += incX
        -	}
        -	return idx
        -}
        -
        -// Sswap exchanges the elements of two vectors.
        -//  x[i], y[i] = y[i], x[i] for all i
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Sswap(n int, x []float32, incX int, y []float32, incY int) {
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	if n < 1 {
        -		if n == 0 {
        -			return
        -		}
        -		panic(nLT0)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        -		panic(badY)
        -	}
        -	if incX == 1 && incY == 1 {
        -		x = x[:n]
        -		for i, v := range x {
        -			x[i], y[i] = y[i], v
        -		}
        -		return
        -	}
        -	var ix, iy int
        -	if incX < 0 {
        -		ix = (-n + 1) * incX
        -	}
        -	if incY < 0 {
        -		iy = (-n + 1) * incY
        -	}
        -	for i := 0; i < n; i++ {
        -		x[ix], y[iy] = y[iy], x[ix]
        -		ix += incX
        -		iy += incY
        -	}
        -}
        -
        -// Scopy copies the elements of x into the elements of y.
        -//  y[i] = x[i] for all i
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Scopy(n int, x []float32, incX int, y []float32, incY int) {
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	if n < 1 {
        -		if n == 0 {
        -			return
        -		}
        -		panic(nLT0)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        -		panic(badY)
        -	}
        -	if incX == 1 && incY == 1 {
        -		copy(y[:n], x[:n])
        -		return
        -	}
        -	var ix, iy int
        -	if incX < 0 {
        -		ix = (-n + 1) * incX
        -	}
        -	if incY < 0 {
        -		iy = (-n + 1) * incY
        -	}
        -	for i := 0; i < n; i++ {
        -		y[iy] = x[ix]
        -		ix += incX
        -		iy += incY
        -	}
        -}
        -
        -// Saxpy adds alpha times x to y
        -//  y[i] += alpha * x[i] for all i
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Saxpy(n int, alpha float32, x []float32, incX int, y []float32, incY int) {
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	if n < 1 {
        -		if n == 0 {
        -			return
        -		}
        -		panic(nLT0)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        -		panic(badY)
        -	}
        -	if alpha == 0 {
        -		return
        -	}
        -	if incX == 1 && incY == 1 {
        -		f32.AxpyUnitary(alpha, x[:n], y[:n])
        -		return
        -	}
        -	var ix, iy int
        -	if incX < 0 {
        -		ix = (-n + 1) * incX
        -	}
        -	if incY < 0 {
        -		iy = (-n + 1) * incY
        -	}
        -	f32.AxpyInc(alpha, x, y, uintptr(n), uintptr(incX), uintptr(incY), uintptr(ix), uintptr(iy))
        -}
        -
        -// Srotg computes the plane rotation
        -//   _    _      _ _       _ _
        -//  |  c s |    | a |     | r |
        -//  | -s c |  * | b |   = | 0 |
        -//   ‾    ‾      ‾ ‾       ‾ ‾
        -// where
        -//  r = ±√(a^2 + b^2)
        -//  c = a/r, the cosine of the plane rotation
        -//  s = b/r, the sine of the plane rotation
        -//
        -// NOTE: There is a discrepancy between the refence implementation and the BLAS
        -// technical manual regarding the sign for r when a or b are zero.
        -// Srotg agrees with the definition in the manual and other
        -// common BLAS implementations.
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Srotg(a, b float32) (c, s, r, z float32) {
        -	if b == 0 && a == 0 {
        -		return 1, 0, a, 0
        -	}
        -	absA := math.Abs(a)
        -	absB := math.Abs(b)
        -	aGTb := absA > absB
        -	r = math.Hypot(a, b)
        -	if aGTb {
        -		r = math.Copysign(r, a)
        -	} else {
        -		r = math.Copysign(r, b)
        -	}
        -	c = a / r
        -	s = b / r
        -	if aGTb {
        -		z = s
        -	} else if c != 0 { // r == 0 case handled above
        -		z = 1 / c
        -	} else {
        -		z = 1
        -	}
        -	return
        -}
        -
        -// Srotmg computes the modified Givens rotation. See
        -// http://www.netlib.org/lapack/explore-html/df/deb/drotmg_8f.html
        -// for more details.
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Srotmg(d1, d2, x1, y1 float32) (p blas.SrotmParams, rd1, rd2, rx1 float32) {
        -	// The implementation of Drotmg used here is taken from Hopkins 1997
        -	// Appendix A: https://doi.org/10.1145/289251.289253
        -	// with the exception of the gam constants below.
        -
        -	const (
        -		gam    = 4096.0
        -		gamsq  = gam * gam
        -		rgamsq = 1.0 / gamsq
        -	)
        -
        -	if d1 < 0 {
        -		p.Flag = blas.Rescaling // Error state.
        -		return p, 0, 0, 0
        -	}
        -
        -	if d2 == 0 || y1 == 0 {
        -		p.Flag = blas.Identity
        -		return p, d1, d2, x1
        -	}
        -
        -	var h11, h12, h21, h22 float32
        -	if (d1 == 0 || x1 == 0) && d2 > 0 {
        -		p.Flag = blas.Diagonal
        -		h12 = 1
        -		h21 = -1
        -		x1 = y1
        -		d1, d2 = d2, d1
        -	} else {
        -		p2 := d2 * y1
        -		p1 := d1 * x1
        -		q2 := p2 * y1
        -		q1 := p1 * x1
        -		if math.Abs(q1) > math.Abs(q2) {
        -			p.Flag = blas.OffDiagonal
        -			h11 = 1
        -			h22 = 1
        -			h21 = -y1 / x1
        -			h12 = p2 / p1
        -			u := 1 - h12*h21
        -			if u <= 0 {
        -				p.Flag = blas.Rescaling // Error state.
        -				return p, 0, 0, 0
        -			}
        -
        -			d1 /= u
        -			d2 /= u
        -			x1 *= u
        -		} else {
        -			if q2 < 0 {
        -				p.Flag = blas.Rescaling // Error state.
        -				return p, 0, 0, 0
        -			}
        -
        -			p.Flag = blas.Diagonal
        -			h21 = -1
        -			h12 = 1
        -			h11 = p1 / p2
        -			h22 = x1 / y1
        -			u := 1 + h11*h22
        -			d1, d2 = d2/u, d1/u
        -			x1 = y1 * u
        -		}
        -	}
        -
        -	for d1 <= rgamsq && d1 != 0 {
        -		p.Flag = blas.Rescaling
        -		d1 = (d1 * gam) * gam
        -		x1 /= gam
        -		h11 /= gam
        -		h12 /= gam
        -	}
        -	for d1 > gamsq {
        -		p.Flag = blas.Rescaling
        -		d1 = (d1 / gam) / gam
        -		x1 *= gam
        -		h11 *= gam
        -		h12 *= gam
        -	}
        -
        -	for math.Abs(d2) <= rgamsq && d2 != 0 {
        -		p.Flag = blas.Rescaling
        -		d2 = (d2 * gam) * gam
        -		h21 /= gam
        -		h22 /= gam
        -	}
        -	for math.Abs(d2) > gamsq {
        -		p.Flag = blas.Rescaling
        -		d2 = (d2 / gam) / gam
        -		h21 *= gam
        -		h22 *= gam
        -	}
        -
        -	switch p.Flag {
        -	case blas.Diagonal:
        -		p.H = [4]float32{0: h11, 3: h22}
        -	case blas.OffDiagonal:
        -		p.H = [4]float32{1: h21, 2: h12}
        -	case blas.Rescaling:
        -		p.H = [4]float32{h11, h21, h12, h22}
        -	default:
        -		panic("blas: unexpected blas.Flag")
        -	}
        -
        -	return p, d1, d2, x1
        -}
        -
        -// Srot applies a plane transformation.
        -//  x[i] = c * x[i] + s * y[i]
        -//  y[i] = c * y[i] - s * x[i]
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Srot(n int, x []float32, incX int, y []float32, incY int, c float32, s float32) {
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	if n < 1 {
        -		if n == 0 {
        -			return
        -		}
        -		panic(nLT0)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        -		panic(badY)
        -	}
        -	if incX == 1 && incY == 1 {
        -		x = x[:n]
        -		for i, vx := range x {
        -			vy := y[i]
        -			x[i], y[i] = c*vx+s*vy, c*vy-s*vx
        -		}
        -		return
        -	}
        -	var ix, iy int
        -	if incX < 0 {
        -		ix = (-n + 1) * incX
        -	}
        -	if incY < 0 {
        -		iy = (-n + 1) * incY
        -	}
        -	for i := 0; i < n; i++ {
        -		vx := x[ix]
        -		vy := y[iy]
        -		x[ix], y[iy] = c*vx+s*vy, c*vy-s*vx
        -		ix += incX
        -		iy += incY
        -	}
        -}
        -
        -// Srotm applies the modified Givens rotation to the 2×n matrix.
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Srotm(n int, x []float32, incX int, y []float32, incY int, p blas.SrotmParams) {
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	if n <= 0 {
        -		if n == 0 {
        -			return
        -		}
        -		panic(nLT0)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        -		panic(badY)
        -	}
        -
        -	if p.Flag == blas.Identity {
        -		return
        -	}
        -
        -	switch p.Flag {
        -	case blas.Rescaling:
        -		h11 := p.H[0]
        -		h12 := p.H[2]
        -		h21 := p.H[1]
        -		h22 := p.H[3]
        -		if incX == 1 && incY == 1 {
        -			x = x[:n]
        -			for i, vx := range x {
        -				vy := y[i]
        -				x[i], y[i] = vx*h11+vy*h12, vx*h21+vy*h22
        -			}
        -			return
        -		}
        -		var ix, iy int
        -		if incX < 0 {
        -			ix = (-n + 1) * incX
        -		}
        -		if incY < 0 {
        -			iy = (-n + 1) * incY
        -		}
        -		for i := 0; i < n; i++ {
        -			vx := x[ix]
        -			vy := y[iy]
        -			x[ix], y[iy] = vx*h11+vy*h12, vx*h21+vy*h22
        -			ix += incX
        -			iy += incY
        -		}
        -	case blas.OffDiagonal:
        -		h12 := p.H[2]
        -		h21 := p.H[1]
        -		if incX == 1 && incY == 1 {
        -			x = x[:n]
        -			for i, vx := range x {
        -				vy := y[i]
        -				x[i], y[i] = vx+vy*h12, vx*h21+vy
        -			}
        -			return
        -		}
        -		var ix, iy int
        -		if incX < 0 {
        -			ix = (-n + 1) * incX
        -		}
        -		if incY < 0 {
        -			iy = (-n + 1) * incY
        -		}
        -		for i := 0; i < n; i++ {
        -			vx := x[ix]
        -			vy := y[iy]
        -			x[ix], y[iy] = vx+vy*h12, vx*h21+vy
        -			ix += incX
        -			iy += incY
        -		}
        -	case blas.Diagonal:
        -		h11 := p.H[0]
        -		h22 := p.H[3]
        -		if incX == 1 && incY == 1 {
        -			x = x[:n]
        -			for i, vx := range x {
        -				vy := y[i]
        -				x[i], y[i] = vx*h11+vy, -vx+vy*h22
        -			}
        -			return
        -		}
        -		var ix, iy int
        -		if incX < 0 {
        -			ix = (-n + 1) * incX
        -		}
        -		if incY < 0 {
        -			iy = (-n + 1) * incY
        -		}
        -		for i := 0; i < n; i++ {
        -			vx := x[ix]
        -			vy := y[iy]
        -			x[ix], y[iy] = vx*h11+vy, -vx+vy*h22
        -			ix += incX
        -			iy += incY
        -		}
        -	}
        -}
        -
        -// Sscal scales x by alpha.
        -//  x[i] *= alpha
        -// Sscal has no effect if incX < 0.
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Sscal(n int, alpha float32, x []float32, incX int) {
        -	if incX < 1 {
        -		if incX == 0 {
        -			panic(zeroIncX)
        -		}
        -		return
        -	}
        -	if (n-1)*incX >= len(x) {
        -		panic(badX)
        -	}
        -	if n < 1 {
        -		if n == 0 {
        -			return
        -		}
        -		panic(nLT0)
        -	}
        -	if alpha == 0 {
        -		if incX == 1 {
        -			x = x[:n]
        -			for i := range x {
        -				x[i] = 0
        -			}
        -			return
        -		}
        -		for ix := 0; ix < n*incX; ix += incX {
        -			x[ix] = 0
        -		}
        -		return
        -	}
        -	if incX == 1 {
        -		f32.ScalUnitary(alpha, x[:n])
        -		return
        -	}
        -	f32.ScalInc(alpha, x, uintptr(n), uintptr(incX))
        -}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/level1single_dsdot.go b/vendor/gonum.org/v1/gonum/blas/gonum/level1single_dsdot.go
        deleted file mode 100644
        index 3c9ef1227..000000000
        --- a/vendor/gonum.org/v1/gonum/blas/gonum/level1single_dsdot.go
        +++ /dev/null
        @@ -1,53 +0,0 @@
        -// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.
        -
        -// Copyright ©2015 The Gonum Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package gonum
        -
        -import (
        -	"gonum.org/v1/gonum/internal/asm/f32"
        -)
        -
        -// Dsdot computes the dot product of the two vectors
        -//  \sum_i x[i]*y[i]
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Dsdot(n int, x []float32, incX int, y []float32, incY int) float64 {
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	if n <= 0 {
        -		if n == 0 {
        -			return 0
        -		}
        -		panic(nLT0)
        -	}
        -	if incX == 1 && incY == 1 {
        -		if len(x) < n {
        -			panic(badX)
        -		}
        -		if len(y) < n {
        -			panic(badY)
        -		}
        -		return f32.DdotUnitary(x[:n], y)
        -	}
        -	var ix, iy int
        -	if incX < 0 {
        -		ix = (-n + 1) * incX
        -	}
        -	if incY < 0 {
        -		iy = (-n + 1) * incY
        -	}
        -	if ix >= len(x) || ix+(n-1)*incX >= len(x) {
        -		panic(badX)
        -	}
        -	if iy >= len(y) || iy+(n-1)*incY >= len(y) {
        -		panic(badY)
        -	}
        -	return f32.DdotInc(x, y, uintptr(n), uintptr(incX), uintptr(incY), uintptr(ix), uintptr(iy))
        -}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/level1single_sdot.go b/vendor/gonum.org/v1/gonum/blas/gonum/level1single_sdot.go
        deleted file mode 100644
        index 72fe6f814..000000000
        --- a/vendor/gonum.org/v1/gonum/blas/gonum/level1single_sdot.go
        +++ /dev/null
        @@ -1,53 +0,0 @@
        -// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.
        -
        -// Copyright ©2015 The Gonum Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package gonum
        -
        -import (
        -	"gonum.org/v1/gonum/internal/asm/f32"
        -)
        -
        -// Sdot computes the dot product of the two vectors
        -//  \sum_i x[i]*y[i]
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Sdot(n int, x []float32, incX int, y []float32, incY int) float32 {
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	if n <= 0 {
        -		if n == 0 {
        -			return 0
        -		}
        -		panic(nLT0)
        -	}
        -	if incX == 1 && incY == 1 {
        -		if len(x) < n {
        -			panic(badX)
        -		}
        -		if len(y) < n {
        -			panic(badY)
        -		}
        -		return f32.DotUnitary(x[:n], y)
        -	}
        -	var ix, iy int
        -	if incX < 0 {
        -		ix = (-n + 1) * incX
        -	}
        -	if incY < 0 {
        -		iy = (-n + 1) * incY
        -	}
        -	if ix >= len(x) || ix+(n-1)*incX >= len(x) {
        -		panic(badX)
        -	}
        -	if iy >= len(y) || iy+(n-1)*incY >= len(y) {
        -		panic(badY)
        -	}
        -	return f32.DotInc(x, y, uintptr(n), uintptr(incX), uintptr(incY), uintptr(ix), uintptr(iy))
        -}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/level1single_sdsdot.go b/vendor/gonum.org/v1/gonum/blas/gonum/level1single_sdsdot.go
        deleted file mode 100644
        index 81142c483..000000000
        --- a/vendor/gonum.org/v1/gonum/blas/gonum/level1single_sdsdot.go
        +++ /dev/null
        @@ -1,53 +0,0 @@
        -// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.
        -
        -// Copyright ©2015 The Gonum Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package gonum
        -
        -import (
        -	"gonum.org/v1/gonum/internal/asm/f32"
        -)
        -
        -// Sdsdot computes the dot product of the two vectors plus a constant
        -//  alpha + \sum_i x[i]*y[i]
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Sdsdot(n int, alpha float32, x []float32, incX int, y []float32, incY int) float32 {
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	if n <= 0 {
        -		if n == 0 {
        -			return 0
        -		}
        -		panic(nLT0)
        -	}
        -	if incX == 1 && incY == 1 {
        -		if len(x) < n {
        -			panic(badX)
        -		}
        -		if len(y) < n {
        -			panic(badY)
        -		}
        -		return alpha + float32(f32.DdotUnitary(x[:n], y))
        -	}
        -	var ix, iy int
        -	if incX < 0 {
        -		ix = (-n + 1) * incX
        -	}
        -	if incY < 0 {
        -		iy = (-n + 1) * incY
        -	}
        -	if ix >= len(x) || ix+(n-1)*incX >= len(x) {
        -		panic(badX)
        -	}
        -	if iy >= len(y) || iy+(n-1)*incY >= len(y) {
        -		panic(badY)
        -	}
        -	return alpha + float32(f32.DdotInc(x, y, uintptr(n), uintptr(incX), uintptr(incY), uintptr(ix), uintptr(iy)))
        -}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/level2cmplx128.go b/vendor/gonum.org/v1/gonum/blas/gonum/level2cmplx128.go
        index 6af2a5ba7..d0ca4eb9c 100644
        --- a/vendor/gonum.org/v1/gonum/blas/gonum/level2cmplx128.go
        +++ b/vendor/gonum.org/v1/gonum/blas/gonum/level2cmplx128.go
        @@ -11,29 +11,66 @@ import (
         	"gonum.org/v1/gonum/internal/asm/c128"
         )
         
        +var _ blas.Complex128Level2 = Implementation{}
        +
         // Zgbmv performs one of the matrix-vector operations
        -//  y = alpha * A * x + beta * y    if trans = blas.NoTrans
        -//  y = alpha * A^T * x + beta * y  if trans = blas.Trans
        -//  y = alpha * A^H * x + beta * y  if trans = blas.ConjTrans
        +//  y = alpha * A * x + beta * y   if trans = blas.NoTrans
        +//  y = alpha * Aᵀ * x + beta * y  if trans = blas.Trans
        +//  y = alpha * Aᴴ * x + beta * y  if trans = blas.ConjTrans
         // where alpha and beta are scalars, x and y are vectors, and A is an m×n band matrix
         // with kL sub-diagonals and kU super-diagonals.
        -func (Implementation) Zgbmv(trans blas.Transpose, m, n, kL, kU int, alpha complex128, ab []complex128, ldab int, x []complex128, incX int, beta complex128, y []complex128, incY int) {
        -	checkZBandMatrix('A', m, n, kL, kU, ab, ldab)
        -	var lenX, lenY int
        +func (Implementation) Zgbmv(trans blas.Transpose, m, n, kL, kU int, alpha complex128, a []complex128, lda int, x []complex128, incX int, beta complex128, y []complex128, incY int) {
         	switch trans {
         	default:
         		panic(badTranspose)
        -	case blas.NoTrans:
        -		lenX = n
        -		lenY = m
        -	case blas.Trans, blas.ConjTrans:
        -		lenX = m
        -		lenY = n
        +	case blas.NoTrans, blas.Trans, blas.ConjTrans:
        +	}
        +	if m < 0 {
        +		panic(mLT0)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if kL < 0 {
        +		panic(kLLT0)
        +	}
        +	if kU < 0 {
        +		panic(kULT0)
        +	}
        +	if lda < kL+kU+1 {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
         	}
        -	checkZVector('x', lenX, x, incX)
        -	checkZVector('y', lenY, y, incY)
         
        -	if m == 0 || n == 0 || (alpha == 0 && beta == 1) {
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(min(m, n+kL)-1)+kL+kU+1 {
        +		panic(shortA)
        +	}
        +	var lenX, lenY int
        +	if trans == blas.NoTrans {
        +		lenX, lenY = n, m
        +	} else {
        +		lenX, lenY = m, n
        +	}
        +	if (incX > 0 && len(x) <= (lenX-1)*incX) || (incX < 0 && len(x) <= (1-lenX)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (lenY-1)*incY) || (incY < 0 && len(y) <= (1-lenY)*incY) {
        +		panic(shortY)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 && beta == 1 {
         		return
         	}
         
        @@ -82,7 +119,7 @@ func (Implementation) Zgbmv(trans blas.Transpose, m, n, kL, kU int, alpha comple
         			for i := 0; i < nRow; i++ {
         				l := max(0, kL-i)
         				u := min(nCol, n+kL-i)
        -				aRow := ab[i*ldab+l : i*ldab+u]
        +				aRow := a[i*lda+l : i*lda+u]
         				off := max(0, i-kL)
         				xtmp := x[off : off+u-l]
         				var sum complex128
        @@ -96,7 +133,7 @@ func (Implementation) Zgbmv(trans blas.Transpose, m, n, kL, kU int, alpha comple
         			for i := 0; i < nRow; i++ {
         				l := max(0, kL-i)
         				u := min(nCol, n+kL-i)
        -				aRow := ab[i*ldab+l : i*ldab+u]
        +				aRow := a[i*lda+l : i*lda+u]
         				off := max(0, i-kL) * incX
         				jx := kx
         				var sum complex128
        @@ -113,7 +150,7 @@ func (Implementation) Zgbmv(trans blas.Transpose, m, n, kL, kU int, alpha comple
         			for i := 0; i < nRow; i++ {
         				l := max(0, kL-i)
         				u := min(nCol, n+kL-i)
        -				aRow := ab[i*ldab+l : i*ldab+u]
        +				aRow := a[i*lda+l : i*lda+u]
         				off := max(0, i-kL) * incY
         				alphaxi := alpha * x[i]
         				jy := ky
        @@ -127,7 +164,7 @@ func (Implementation) Zgbmv(trans blas.Transpose, m, n, kL, kU int, alpha comple
         			for i := 0; i < nRow; i++ {
         				l := max(0, kL-i)
         				u := min(nCol, n+kL-i)
        -				aRow := ab[i*ldab+l : i*ldab+u]
        +				aRow := a[i*lda+l : i*lda+u]
         				off := max(0, i-kL) * incY
         				alphaxi := alpha * x[ix]
         				jy := ky
        @@ -143,7 +180,7 @@ func (Implementation) Zgbmv(trans blas.Transpose, m, n, kL, kU int, alpha comple
         			for i := 0; i < nRow; i++ {
         				l := max(0, kL-i)
         				u := min(nCol, n+kL-i)
        -				aRow := ab[i*ldab+l : i*ldab+u]
        +				aRow := a[i*lda+l : i*lda+u]
         				off := max(0, i-kL) * incY
         				alphaxi := alpha * x[i]
         				jy := ky
        @@ -157,7 +194,7 @@ func (Implementation) Zgbmv(trans blas.Transpose, m, n, kL, kU int, alpha comple
         			for i := 0; i < nRow; i++ {
         				l := max(0, kL-i)
         				u := min(nCol, n+kL-i)
        -				aRow := ab[i*ldab+l : i*ldab+u]
        +				aRow := a[i*lda+l : i*lda+u]
         				off := max(0, i-kL) * incY
         				alphaxi := alpha * x[ix]
         				jy := ky
        @@ -172,27 +209,38 @@ func (Implementation) Zgbmv(trans blas.Transpose, m, n, kL, kU int, alpha comple
         }
         
         // Zgemv performs one of the matrix-vector operations
        -//  y = alpha * A * x + beta * y    if trans = blas.NoTrans
        -//  y = alpha * A^T * x + beta * y  if trans = blas.Trans
        -//  y = alpha * A^H * x + beta * y  if trans = blas.ConjTrans
        +//  y = alpha * A * x + beta * y   if trans = blas.NoTrans
        +//  y = alpha * Aᵀ * x + beta * y  if trans = blas.Trans
        +//  y = alpha * Aᴴ * x + beta * y  if trans = blas.ConjTrans
         // where alpha and beta are scalars, x and y are vectors, and A is an m×n dense matrix.
         func (Implementation) Zgemv(trans blas.Transpose, m, n int, alpha complex128, a []complex128, lda int, x []complex128, incX int, beta complex128, y []complex128, incY int) {
        -	checkZMatrix('A', m, n, a, lda)
         	switch trans {
         	default:
         		panic(badTranspose)
        -	case blas.NoTrans:
        -		checkZVector('x', n, x, incX)
        -		checkZVector('y', m, y, incY)
        -	case blas.Trans, blas.ConjTrans:
        -		checkZVector('x', m, x, incX)
        -		checkZVector('y', n, y, incY)
        +	case blas.NoTrans, blas.Trans, blas.ConjTrans:
        +	}
        +	if m < 0 {
        +		panic(mLT0)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
         	}
         
        -	if m == 0 || n == 0 || (alpha == 0 && beta == 1) {
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
         		return
         	}
         
        +	// For zero matrix size the following slice length checks are trivially satisfied.
         	var lenX, lenY int
         	if trans == blas.NoTrans {
         		lenX = n
        @@ -201,6 +249,21 @@ func (Implementation) Zgemv(trans blas.Transpose, m, n int, alpha complex128, a
         		lenX = m
         		lenY = n
         	}
        +	if len(a) < lda*(m-1)+n {
        +		panic(shortA)
        +	}
        +	if (incX > 0 && len(x) <= (lenX-1)*incX) || (incX < 0 && len(x) <= (1-lenX)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (lenY-1)*incY) || (incY < 0 && len(y) <= (1-lenY)*incY) {
        +		panic(shortY)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 && beta == 1 {
        +		return
        +	}
        +
         	var kx int
         	if incX < 0 {
         		kx = (1 - lenX) * incX
        @@ -259,7 +322,7 @@ func (Implementation) Zgemv(trans blas.Transpose, m, n int, alpha complex128, a
         		return
         
         	case blas.Trans:
        -		// Form y = alpha*A^T*x + y.
        +		// Form y = alpha*Aᵀ*x + y.
         		ix := kx
         		if incY == 1 {
         			for i := 0; i < m; i++ {
        @@ -275,7 +338,7 @@ func (Implementation) Zgemv(trans blas.Transpose, m, n int, alpha complex128, a
         		return
         
         	case blas.ConjTrans:
        -		// Form y = alpha*A^H*x + y.
        +		// Form y = alpha*Aᴴ*x + y.
         		ix := kx
         		if incY == 1 {
         			for i := 0; i < m; i++ {
        @@ -301,15 +364,44 @@ func (Implementation) Zgemv(trans blas.Transpose, m, n int, alpha complex128, a
         }
         
         // Zgerc performs the rank-one operation
        -//  A += alpha * x * y^H
        +//  A += alpha * x * yᴴ
         // where A is an m×n dense matrix, alpha is a scalar, x is an m element vector,
         // and y is an n element vector.
         func (Implementation) Zgerc(m, n int, alpha complex128, x []complex128, incX int, y []complex128, incY int, a []complex128, lda int) {
        -	checkZMatrix('A', m, n, a, lda)
        -	checkZVector('x', m, x, incX)
        -	checkZVector('y', n, y, incY)
        +	if m < 0 {
        +		panic(mLT0)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if (incX > 0 && len(x) <= (m-1)*incX) || (incX < 0 && len(x) <= (1-m)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +	if len(a) < lda*(m-1)+n {
        +		panic(shortA)
        +	}
         
        -	if m == 0 || n == 0 || alpha == 0 {
        +	// Quick return if possible.
        +	if alpha == 0 {
         		return
         	}
         
        @@ -330,15 +422,44 @@ func (Implementation) Zgerc(m, n int, alpha complex128, x []complex128, incX int
         }
         
         // Zgeru performs the rank-one operation
        -//  A += alpha * x * y^T
        +//  A += alpha * x * yᵀ
         // where A is an m×n dense matrix, alpha is a scalar, x is an m element vector,
         // and y is an n element vector.
         func (Implementation) Zgeru(m, n int, alpha complex128, x []complex128, incX int, y []complex128, incY int, a []complex128, lda int) {
        -	checkZMatrix('A', m, n, a, lda)
        -	checkZVector('x', m, x, incX)
        -	checkZVector('y', n, y, incY)
        +	if m < 0 {
        +		panic(mLT0)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
         
        -	if m == 0 || n == 0 || alpha == 0 {
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if (incX > 0 && len(x) <= (m-1)*incX) || (incX < 0 && len(x) <= (1-m)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +	if len(a) < lda*(m-1)+n {
        +		panic(shortA)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 {
         		return
         	}
         
        @@ -374,15 +495,46 @@ func (Implementation) Zgeru(m, n int, alpha complex128, x []complex128, incX int
         // where alpha and beta are scalars, x and y are vectors, and A is an n×n
         // Hermitian band matrix with k super-diagonals. The imaginary parts of
         // the diagonal elements of A are ignored and assumed to be zero.
        -func (Implementation) Zhbmv(uplo blas.Uplo, n, k int, alpha complex128, ab []complex128, ldab int, x []complex128, incX int, beta complex128, y []complex128, incY int) {
        -	if uplo != blas.Upper && uplo != blas.Lower {
        +func (Implementation) Zhbmv(uplo blas.Uplo, n, k int, alpha complex128, a []complex128, lda int, x []complex128, incX int, beta complex128, y []complex128, incY int) {
        +	switch uplo {
        +	default:
         		panic(badUplo)
        +	case blas.Upper, blas.Lower:
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if k < 0 {
        +		panic(kLT0)
        +	}
        +	if lda < k+1 {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
         	}
        -	checkZhbMatrix('A', n, k, ab, ldab)
        -	checkZVector('x', n, x, incX)
        -	checkZVector('y', n, y, incY)
         
        -	if n == 0 || (alpha == 0 && beta == 1) {
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(n-1)+k+1 {
        +		panic(shortA)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 && beta == 1 {
         		return
         	}
         
        @@ -428,13 +580,13 @@ func (Implementation) Zhbmv(uplo blas.Uplo, n, k int, alpha complex128, ab []com
         		return
         	}
         
        -	// The elements of A are accessed sequentially with one pass through ab.
        +	// The elements of A are accessed sequentially with one pass through a.
         	switch uplo {
         	case blas.Upper:
         		iy := ky
         		if incX == 1 {
         			for i := 0; i < n; i++ {
        -				aRow := ab[i*ldab:]
        +				aRow := a[i*lda:]
         				alphaxi := alpha * x[i]
         				sum := alphaxi * complex(real(aRow[0]), 0)
         				u := min(k+1, n-i)
        @@ -451,7 +603,7 @@ func (Implementation) Zhbmv(uplo blas.Uplo, n, k int, alpha complex128, ab []com
         		} else {
         			ix := kx
         			for i := 0; i < n; i++ {
        -				aRow := ab[i*ldab:]
        +				aRow := a[i*lda:]
         				alphaxi := alpha * x[ix]
         				sum := alphaxi * complex(real(aRow[0]), 0)
         				u := min(k+1, n-i)
        @@ -476,7 +628,7 @@ func (Implementation) Zhbmv(uplo blas.Uplo, n, k int, alpha complex128, ab []com
         				l := max(0, k-i)
         				alphaxi := alpha * x[i]
         				jy := l * incY
        -				aRow := ab[i*ldab:]
        +				aRow := a[i*lda:]
         				for j := l; j < k; j++ {
         					v := aRow[j]
         					y[iy] += alpha * v * x[i-k+j]
        @@ -493,7 +645,7 @@ func (Implementation) Zhbmv(uplo blas.Uplo, n, k int, alpha complex128, ab []com
         				alphaxi := alpha * x[ix]
         				jx := l * incX
         				jy := l * incY
        -				aRow := ab[i*ldab:]
        +				aRow := a[i*lda:]
         				for j := l; j < k; j++ {
         					v := aRow[j]
         					y[iy] += alpha * v * x[ix-k*incX+jx]
        @@ -515,14 +667,42 @@ func (Implementation) Zhbmv(uplo blas.Uplo, n, k int, alpha complex128, ab []com
         // Hermitian matrix. The imaginary parts of the diagonal elements of A are
         // ignored and assumed to be zero.
         func (Implementation) Zhemv(uplo blas.Uplo, n int, alpha complex128, a []complex128, lda int, x []complex128, incX int, beta complex128, y []complex128, incY int) {
        -	if uplo != blas.Upper && uplo != blas.Lower {
        +	switch uplo {
        +	default:
         		panic(badUplo)
        +	case blas.Upper, blas.Lower:
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
         	}
        -	checkZMatrix('A', n, n, a, lda)
        -	checkZVector('x', n, x, incX)
        -	checkZVector('y', n, y, incY)
         
        -	if n == 0 || (alpha == 0 && beta == 1) {
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(n-1)+n {
        +		panic(shortA)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 && beta == 1 {
         		return
         	}
         
        @@ -642,18 +822,41 @@ func (Implementation) Zhemv(uplo blas.Uplo, n int, alpha complex128, a []complex
         }
         
         // Zher performs the Hermitian rank-one operation
        -//  A += alpha * x * x^H
        +//  A += alpha * x * xᴴ
         // where A is an n×n Hermitian matrix, alpha is a real scalar, and x is an n
         // element vector. On entry, the imaginary parts of the diagonal elements of A
         // are ignored and assumed to be zero, on return they will be set to zero.
         func (Implementation) Zher(uplo blas.Uplo, n int, alpha float64, x []complex128, incX int, a []complex128, lda int) {
        -	if uplo != blas.Upper && uplo != blas.Lower {
        +	switch uplo {
        +	default:
         		panic(badUplo)
        +	case blas.Upper, blas.Lower:
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
         	}
        -	checkZMatrix('A', n, n, a, lda)
        -	checkZVector('x', n, x, incX)
         
        -	if n == 0 || alpha == 0 {
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if len(a) < lda*(n-1)+n {
        +		panic(shortA)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 {
         		return
         	}
         
        @@ -741,19 +944,47 @@ func (Implementation) Zher(uplo blas.Uplo, n int, alpha float64, x []complex128,
         }
         
         // Zher2 performs the Hermitian rank-two operation
        -//  A += alpha * x * y^H + conj(alpha) * y * x^H
        +//  A += alpha * x * yᴴ + conj(alpha) * y * xᴴ
         // where alpha is a scalar, x and y are n element vectors and A is an n×n
         // Hermitian matrix. On entry, the imaginary parts of the diagonal elements are
         // ignored and assumed to be zero. On return they will be set to zero.
         func (Implementation) Zher2(uplo blas.Uplo, n int, alpha complex128, x []complex128, incX int, y []complex128, incY int, a []complex128, lda int) {
        -	if uplo != blas.Upper && uplo != blas.Lower {
        +	switch uplo {
        +	default:
         		panic(badUplo)
        +	case blas.Upper, blas.Lower:
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
         	}
        -	checkZMatrix('A', n, n, a, lda)
        -	checkZVector('x', n, x, incX)
        -	checkZVector('y', n, y, incY)
         
        -	if n == 0 || alpha == 0 {
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +	if len(a) < lda*(n-1)+n {
        +		panic(shortA)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 {
         		return
         	}
         
        @@ -855,16 +1086,39 @@ func (Implementation) Zher2(uplo blas.Uplo, n int, alpha complex128, x []complex
         // Hermitian matrix in packed form. The imaginary parts of the diagonal
         // elements of A are ignored and assumed to be zero.
         func (Implementation) Zhpmv(uplo blas.Uplo, n int, alpha complex128, ap []complex128, x []complex128, incX int, beta complex128, y []complex128, incY int) {
        -	if uplo != blas.Upper && uplo != blas.Lower {
        +	switch uplo {
        +	default:
         		panic(badUplo)
        +	case blas.Upper, blas.Lower:
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
         	}
        -	checkZVector('x', n, x, incX)
        -	checkZVector('y', n, y, incY)
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
         	if len(ap) < n*(n+1)/2 {
        -		panic("blas: insufficient A packed matrix slice length")
        +		panic(shortAP)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
         	}
         
        -	if n == 0 || (alpha == 0 && beta == 1) {
        +	// Quick return if possible.
        +	if alpha == 0 && beta == 1 {
         		return
         	}
         
        @@ -994,23 +1248,38 @@ func (Implementation) Zhpmv(uplo blas.Uplo, n int, alpha complex128, ap []comple
         }
         
         // Zhpr performs the Hermitian rank-1 operation
        -//  A += alpha * x * x^H
        +//  A += alpha * x * xᴴ
         // where alpha is a real scalar, x is a vector, and A is an n×n hermitian matrix
         // in packed form. On entry, the imaginary parts of the diagonal elements are
         // assumed to be zero, and on return they are set to zero.
         func (Implementation) Zhpr(uplo blas.Uplo, n int, alpha float64, x []complex128, incX int, ap []complex128) {
        -	if uplo != blas.Upper && uplo != blas.Lower {
        +	switch uplo {
        +	default:
         		panic(badUplo)
        +	case blas.Upper, blas.Lower:
         	}
         	if n < 0 {
         		panic(nLT0)
         	}
        -	checkZVector('x', n, x, incX)
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
         	if len(ap) < n*(n+1)/2 {
        -		panic("blas: insufficient A packed matrix slice length")
        +		panic(shortAP)
         	}
         
        -	if n == 0 || alpha == 0 {
        +	// Quick return if possible.
        +	if alpha == 0 {
         		return
         	}
         
        @@ -1113,24 +1382,44 @@ func (Implementation) Zhpr(uplo blas.Uplo, n int, alpha float64, x []complex128,
         }
         
         // Zhpr2 performs the Hermitian rank-2 operation
        -//  A += alpha * x * y^H + conj(alpha) * y * x^H
        +//  A += alpha * x * yᴴ + conj(alpha) * y * xᴴ
         // where alpha is a complex scalar, x and y are n element vectors, and A is an
         // n×n Hermitian matrix, supplied in packed form. On entry, the imaginary parts
         // of the diagonal elements are assumed to be zero, and on return they are set to zero.
         func (Implementation) Zhpr2(uplo blas.Uplo, n int, alpha complex128, x []complex128, incX int, y []complex128, incY int, ap []complex128) {
        -	if uplo != blas.Upper && uplo != blas.Lower {
        +	switch uplo {
        +	default:
         		panic(badUplo)
        +	case blas.Upper, blas.Lower:
         	}
         	if n < 0 {
         		panic(nLT0)
         	}
        -	checkZVector('x', n, x, incX)
        -	checkZVector('y', n, y, incY)
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
         	if len(ap) < n*(n+1)/2 {
        -		panic("blas: insufficient A packed matrix slice length")
        +		panic(shortAP)
         	}
         
        -	if n == 0 || alpha == 0 {
        +	// Quick return if possible.
        +	if alpha == 0 {
         		return
         	}
         
        @@ -1240,28 +1529,53 @@ func (Implementation) Zhpr2(uplo blas.Uplo, n int, alpha complex128, x []complex
         }
         
         // Ztbmv performs one of the matrix-vector operations
        -//  x = A * x    if trans = blas.NoTrans
        -//  x = A^T * x  if trans = blas.Trans
        -//  x = A^H * x  if trans = blas.ConjTrans
        +//  x = A * x   if trans = blas.NoTrans
        +//  x = Aᵀ * x  if trans = blas.Trans
        +//  x = Aᴴ * x  if trans = blas.ConjTrans
         // where x is an n element vector and A is an n×n triangular band matrix, with
         // (k+1) diagonals.
        -func (Implementation) Ztbmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag, n, k int, ab []complex128, ldab int, x []complex128, incX int) {
        -	if uplo != blas.Upper && uplo != blas.Lower {
        -		panic(badUplo)
        -	}
        -	if trans != blas.NoTrans && trans != blas.Trans && trans != blas.ConjTrans {
        +func (Implementation) Ztbmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag, n, k int, a []complex128, lda int, x []complex128, incX int) {
        +	switch trans {
        +	default:
         		panic(badTranspose)
        +	case blas.NoTrans, blas.Trans, blas.ConjTrans:
         	}
        -	if diag != blas.Unit && diag != blas.NonUnit {
        +	switch uplo {
        +	default:
        +		panic(badUplo)
        +	case blas.Upper, blas.Lower:
        +	}
        +	switch diag {
        +	default:
         		panic(badDiag)
        +	case blas.NonUnit, blas.Unit:
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if k < 0 {
        +		panic(kLT0)
        +	}
        +	if lda < k+1 {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
         	}
        -	checkZtbMatrix('A', n, k, ab, ldab)
        -	checkZVector('x', n, x, incX)
         
        +	// Quick return if possible.
         	if n == 0 {
         		return
         	}
         
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(n-1)+k+1 {
        +		panic(shortA)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +
         	// Set up start index in X.
         	var kx int
         	if incX < 0 {
        @@ -1275,10 +1589,10 @@ func (Implementation) Ztbmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         				for i := 0; i < n; i++ {
         					xi := x[i]
         					if diag == blas.NonUnit {
        -						xi *= ab[i*ldab]
        +						xi *= a[i*lda]
         					}
         					kk := min(k, n-i-1)
        -					for j, aij := range ab[i*ldab+1 : i*ldab+kk+1] {
        +					for j, aij := range a[i*lda+1 : i*lda+kk+1] {
         						xi += x[i+j+1] * aij
         					}
         					x[i] = xi
        @@ -1288,11 +1602,11 @@ func (Implementation) Ztbmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         				for i := 0; i < n; i++ {
         					xi := x[ix]
         					if diag == blas.NonUnit {
        -						xi *= ab[i*ldab]
        +						xi *= a[i*lda]
         					}
         					kk := min(k, n-i-1)
         					jx := ix + incX
        -					for _, aij := range ab[i*ldab+1 : i*ldab+kk+1] {
        +					for _, aij := range a[i*lda+1 : i*lda+kk+1] {
         						xi += x[jx] * aij
         						jx += incX
         					}
        @@ -1305,10 +1619,10 @@ func (Implementation) Ztbmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         				for i := n - 1; i >= 0; i-- {
         					xi := x[i]
         					if diag == blas.NonUnit {
        -						xi *= ab[i*ldab+k]
        +						xi *= a[i*lda+k]
         					}
         					kk := min(k, i)
        -					for j, aij := range ab[i*ldab+k-kk : i*ldab+k] {
        +					for j, aij := range a[i*lda+k-kk : i*lda+k] {
         						xi += x[i-kk+j] * aij
         					}
         					x[i] = xi
        @@ -1318,11 +1632,11 @@ func (Implementation) Ztbmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         				for i := n - 1; i >= 0; i-- {
         					xi := x[ix]
         					if diag == blas.NonUnit {
        -						xi *= ab[i*ldab+k]
        +						xi *= a[i*lda+k]
         					}
         					kk := min(k, i)
         					jx := ix - kk*incX
        -					for _, aij := range ab[i*ldab+k-kk : i*ldab+k] {
        +					for _, aij := range a[i*lda+k-kk : i*lda+k] {
         						xi += x[jx] * aij
         						jx += incX
         					}
        @@ -1337,11 +1651,11 @@ func (Implementation) Ztbmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         				for i := n - 1; i >= 0; i-- {
         					kk := min(k, n-i-1)
         					xi := x[i]
        -					for j, aij := range ab[i*ldab+1 : i*ldab+kk+1] {
        +					for j, aij := range a[i*lda+1 : i*lda+kk+1] {
         						x[i+j+1] += xi * aij
         					}
         					if diag == blas.NonUnit {
        -						x[i] *= ab[i*ldab]
        +						x[i] *= a[i*lda]
         					}
         				}
         			} else {
        @@ -1350,12 +1664,12 @@ func (Implementation) Ztbmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         					kk := min(k, n-i-1)
         					jx := ix + incX
         					xi := x[ix]
        -					for _, aij := range ab[i*ldab+1 : i*ldab+kk+1] {
        +					for _, aij := range a[i*lda+1 : i*lda+kk+1] {
         						x[jx] += xi * aij
         						jx += incX
         					}
         					if diag == blas.NonUnit {
        -						x[ix] *= ab[i*ldab]
        +						x[ix] *= a[i*lda]
         					}
         					ix -= incX
         				}
        @@ -1365,11 +1679,11 @@ func (Implementation) Ztbmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         				for i := 0; i < n; i++ {
         					kk := min(k, i)
         					xi := x[i]
        -					for j, aij := range ab[i*ldab+k-kk : i*ldab+k] {
        +					for j, aij := range a[i*lda+k-kk : i*lda+k] {
         						x[i-kk+j] += xi * aij
         					}
         					if diag == blas.NonUnit {
        -						x[i] *= ab[i*ldab+k]
        +						x[i] *= a[i*lda+k]
         					}
         				}
         			} else {
        @@ -1378,12 +1692,12 @@ func (Implementation) Ztbmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         					kk := min(k, i)
         					jx := ix - kk*incX
         					xi := x[ix]
        -					for _, aij := range ab[i*ldab+k-kk : i*ldab+k] {
        +					for _, aij := range a[i*lda+k-kk : i*lda+k] {
         						x[jx] += xi * aij
         						jx += incX
         					}
         					if diag == blas.NonUnit {
        -						x[ix] *= ab[i*ldab+k]
        +						x[ix] *= a[i*lda+k]
         					}
         					ix += incX
         				}
        @@ -1395,11 +1709,11 @@ func (Implementation) Ztbmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         				for i := n - 1; i >= 0; i-- {
         					kk := min(k, n-i-1)
         					xi := x[i]
        -					for j, aij := range ab[i*ldab+1 : i*ldab+kk+1] {
        +					for j, aij := range a[i*lda+1 : i*lda+kk+1] {
         						x[i+j+1] += xi * cmplx.Conj(aij)
         					}
         					if diag == blas.NonUnit {
        -						x[i] *= cmplx.Conj(ab[i*ldab])
        +						x[i] *= cmplx.Conj(a[i*lda])
         					}
         				}
         			} else {
        @@ -1408,12 +1722,12 @@ func (Implementation) Ztbmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         					kk := min(k, n-i-1)
         					jx := ix + incX
         					xi := x[ix]
        -					for _, aij := range ab[i*ldab+1 : i*ldab+kk+1] {
        +					for _, aij := range a[i*lda+1 : i*lda+kk+1] {
         						x[jx] += xi * cmplx.Conj(aij)
         						jx += incX
         					}
         					if diag == blas.NonUnit {
        -						x[ix] *= cmplx.Conj(ab[i*ldab])
        +						x[ix] *= cmplx.Conj(a[i*lda])
         					}
         					ix -= incX
         				}
        @@ -1423,11 +1737,11 @@ func (Implementation) Ztbmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         				for i := 0; i < n; i++ {
         					kk := min(k, i)
         					xi := x[i]
        -					for j, aij := range ab[i*ldab+k-kk : i*ldab+k] {
        +					for j, aij := range a[i*lda+k-kk : i*lda+k] {
         						x[i-kk+j] += xi * cmplx.Conj(aij)
         					}
         					if diag == blas.NonUnit {
        -						x[i] *= cmplx.Conj(ab[i*ldab+k])
        +						x[i] *= cmplx.Conj(a[i*lda+k])
         					}
         				}
         			} else {
        @@ -1436,12 +1750,12 @@ func (Implementation) Ztbmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         					kk := min(k, i)
         					jx := ix - kk*incX
         					xi := x[ix]
        -					for _, aij := range ab[i*ldab+k-kk : i*ldab+k] {
        +					for _, aij := range a[i*lda+k-kk : i*lda+k] {
         						x[jx] += xi * cmplx.Conj(aij)
         						jx += incX
         					}
         					if diag == blas.NonUnit {
        -						x[ix] *= cmplx.Conj(ab[i*ldab+k])
        +						x[ix] *= cmplx.Conj(a[i*lda+k])
         					}
         					ix += incX
         				}
        @@ -1451,9 +1765,9 @@ func (Implementation) Ztbmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         }
         
         // Ztbsv solves one of the systems of equations
        -//  A * x = b    if trans == blas.NoTrans
        -//  A^T * x = b  if trans == blas.Trans
        -//  A^H * x = b  if trans == blas.ConjTrans
        +//  A * x = b   if trans == blas.NoTrans
        +//  Aᵀ * x = b  if trans == blas.Trans
        +//  Aᴴ * x = b  if trans == blas.ConjTrans
         // where b and x are n element vectors and A is an n×n triangular band matrix
         // with (k+1) diagonals.
         //
        @@ -1462,23 +1776,48 @@ func (Implementation) Ztbmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         //
         // No test for singularity or near-singularity is included in this
         // routine. Such tests must be performed before calling this routine.
        -func (Implementation) Ztbsv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag, n, k int, ab []complex128, ldab int, x []complex128, incX int) {
        -	if uplo != blas.Upper && uplo != blas.Lower {
        -		panic(badUplo)
        -	}
        -	if trans != blas.NoTrans && trans != blas.Trans && trans != blas.ConjTrans {
        +func (Implementation) Ztbsv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag, n, k int, a []complex128, lda int, x []complex128, incX int) {
        +	switch trans {
        +	default:
         		panic(badTranspose)
        +	case blas.NoTrans, blas.Trans, blas.ConjTrans:
        +	}
        +	switch uplo {
        +	default:
        +		panic(badUplo)
        +	case blas.Upper, blas.Lower:
         	}
        -	if diag != blas.Unit && diag != blas.NonUnit {
        +	switch diag {
        +	default:
         		panic(badDiag)
        +	case blas.NonUnit, blas.Unit:
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if k < 0 {
        +		panic(kLT0)
        +	}
        +	if lda < k+1 {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
         	}
        -	checkZtbMatrix('A', n, k, ab, ldab)
        -	checkZVector('x', n, x, incX)
         
        +	// Quick return if possible.
         	if n == 0 {
         		return
         	}
         
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(n-1)+k+1 {
        +		panic(shortA)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +
         	// Set up start index in X.
         	var kx int
         	if incX < 0 {
        @@ -1492,12 +1831,12 @@ func (Implementation) Ztbsv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         				for i := n - 1; i >= 0; i-- {
         					kk := min(k, n-i-1)
         					var sum complex128
        -					for j, aij := range ab[i*ldab+1 : i*ldab+kk+1] {
        +					for j, aij := range a[i*lda+1 : i*lda+kk+1] {
         						sum += x[i+1+j] * aij
         					}
         					x[i] -= sum
         					if diag == blas.NonUnit {
        -						x[i] /= ab[i*ldab]
        +						x[i] /= a[i*lda]
         					}
         				}
         			} else {
        @@ -1506,13 +1845,13 @@ func (Implementation) Ztbsv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         					kk := min(k, n-i-1)
         					var sum complex128
         					jx := ix + incX
        -					for _, aij := range ab[i*ldab+1 : i*ldab+kk+1] {
        +					for _, aij := range a[i*lda+1 : i*lda+kk+1] {
         						sum += x[jx] * aij
         						jx += incX
         					}
         					x[ix] -= sum
         					if diag == blas.NonUnit {
        -						x[ix] /= ab[i*ldab]
        +						x[ix] /= a[i*lda]
         					}
         					ix -= incX
         				}
        @@ -1522,12 +1861,12 @@ func (Implementation) Ztbsv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         				for i := 0; i < n; i++ {
         					kk := min(k, i)
         					var sum complex128
        -					for j, aij := range ab[i*ldab+k-kk : i*ldab+k] {
        +					for j, aij := range a[i*lda+k-kk : i*lda+k] {
         						sum += x[i-kk+j] * aij
         					}
         					x[i] -= sum
         					if diag == blas.NonUnit {
        -						x[i] /= ab[i*ldab+k]
        +						x[i] /= a[i*lda+k]
         					}
         				}
         			} else {
        @@ -1536,13 +1875,13 @@ func (Implementation) Ztbsv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         					kk := min(k, i)
         					var sum complex128
         					jx := ix - kk*incX
        -					for _, aij := range ab[i*ldab+k-kk : i*ldab+k] {
        +					for _, aij := range a[i*lda+k-kk : i*lda+k] {
         						sum += x[jx] * aij
         						jx += incX
         					}
         					x[ix] -= sum
         					if diag == blas.NonUnit {
        -						x[ix] /= ab[i*ldab+k]
        +						x[ix] /= a[i*lda+k]
         					}
         					ix += incX
         				}
        @@ -1553,11 +1892,11 @@ func (Implementation) Ztbsv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         			if incX == 1 {
         				for i := 0; i < n; i++ {
         					if diag == blas.NonUnit {
        -						x[i] /= ab[i*ldab]
        +						x[i] /= a[i*lda]
         					}
         					kk := min(k, n-i-1)
         					xi := x[i]
        -					for j, aij := range ab[i*ldab+1 : i*ldab+kk+1] {
        +					for j, aij := range a[i*lda+1 : i*lda+kk+1] {
         						x[i+1+j] -= xi * aij
         					}
         				}
        @@ -1565,12 +1904,12 @@ func (Implementation) Ztbsv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         				ix := kx
         				for i := 0; i < n; i++ {
         					if diag == blas.NonUnit {
        -						x[ix] /= ab[i*ldab]
        +						x[ix] /= a[i*lda]
         					}
         					kk := min(k, n-i-1)
         					xi := x[ix]
         					jx := ix + incX
        -					for _, aij := range ab[i*ldab+1 : i*ldab+kk+1] {
        +					for _, aij := range a[i*lda+1 : i*lda+kk+1] {
         						x[jx] -= xi * aij
         						jx += incX
         					}
        @@ -1581,11 +1920,11 @@ func (Implementation) Ztbsv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         			if incX == 1 {
         				for i := n - 1; i >= 0; i-- {
         					if diag == blas.NonUnit {
        -						x[i] /= ab[i*ldab+k]
        +						x[i] /= a[i*lda+k]
         					}
         					kk := min(k, i)
         					xi := x[i]
        -					for j, aij := range ab[i*ldab+k-kk : i*ldab+k] {
        +					for j, aij := range a[i*lda+k-kk : i*lda+k] {
         						x[i-kk+j] -= xi * aij
         					}
         				}
        @@ -1593,12 +1932,12 @@ func (Implementation) Ztbsv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         				ix := kx + (n-1)*incX
         				for i := n - 1; i >= 0; i-- {
         					if diag == blas.NonUnit {
        -						x[ix] /= ab[i*ldab+k]
        +						x[ix] /= a[i*lda+k]
         					}
         					kk := min(k, i)
         					xi := x[ix]
         					jx := ix - kk*incX
        -					for _, aij := range ab[i*ldab+k-kk : i*ldab+k] {
        +					for _, aij := range a[i*lda+k-kk : i*lda+k] {
         						x[jx] -= xi * aij
         						jx += incX
         					}
        @@ -1611,11 +1950,11 @@ func (Implementation) Ztbsv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         			if incX == 1 {
         				for i := 0; i < n; i++ {
         					if diag == blas.NonUnit {
        -						x[i] /= cmplx.Conj(ab[i*ldab])
        +						x[i] /= cmplx.Conj(a[i*lda])
         					}
         					kk := min(k, n-i-1)
         					xi := x[i]
        -					for j, aij := range ab[i*ldab+1 : i*ldab+kk+1] {
        +					for j, aij := range a[i*lda+1 : i*lda+kk+1] {
         						x[i+1+j] -= xi * cmplx.Conj(aij)
         					}
         				}
        @@ -1623,12 +1962,12 @@ func (Implementation) Ztbsv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         				ix := kx
         				for i := 0; i < n; i++ {
         					if diag == blas.NonUnit {
        -						x[ix] /= cmplx.Conj(ab[i*ldab])
        +						x[ix] /= cmplx.Conj(a[i*lda])
         					}
         					kk := min(k, n-i-1)
         					xi := x[ix]
         					jx := ix + incX
        -					for _, aij := range ab[i*ldab+1 : i*ldab+kk+1] {
        +					for _, aij := range a[i*lda+1 : i*lda+kk+1] {
         						x[jx] -= xi * cmplx.Conj(aij)
         						jx += incX
         					}
        @@ -1639,11 +1978,11 @@ func (Implementation) Ztbsv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         			if incX == 1 {
         				for i := n - 1; i >= 0; i-- {
         					if diag == blas.NonUnit {
        -						x[i] /= cmplx.Conj(ab[i*ldab+k])
        +						x[i] /= cmplx.Conj(a[i*lda+k])
         					}
         					kk := min(k, i)
         					xi := x[i]
        -					for j, aij := range ab[i*ldab+k-kk : i*ldab+k] {
        +					for j, aij := range a[i*lda+k-kk : i*lda+k] {
         						x[i-kk+j] -= xi * cmplx.Conj(aij)
         					}
         				}
        @@ -1651,12 +1990,12 @@ func (Implementation) Ztbsv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         				ix := kx + (n-1)*incX
         				for i := n - 1; i >= 0; i-- {
         					if diag == blas.NonUnit {
        -						x[ix] /= cmplx.Conj(ab[i*ldab+k])
        +						x[ix] /= cmplx.Conj(a[i*lda+k])
         					}
         					kk := min(k, i)
         					xi := x[ix]
         					jx := ix - kk*incX
        -					for _, aij := range ab[i*ldab+k-kk : i*ldab+k] {
        +					for _, aij := range a[i*lda+k-kk : i*lda+k] {
         						x[jx] -= xi * cmplx.Conj(aij)
         						jx += incX
         					}
        @@ -1668,30 +2007,47 @@ func (Implementation) Ztbsv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         }
         
         // Ztpmv performs one of the matrix-vector operations
        -//  x = A * x    if trans = blas.NoTrans
        -//  x = A^T * x  if trans = blas.Trans
        -//  x = A^H * x  if trans = blas.ConjTrans
        +//  x = A * x   if trans = blas.NoTrans
        +//  x = Aᵀ * x  if trans = blas.Trans
        +//  x = Aᴴ * x  if trans = blas.ConjTrans
         // where x is an n element vector and A is an n×n triangular matrix, supplied in
         // packed form.
         func (Implementation) Ztpmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag, n int, ap []complex128, x []complex128, incX int) {
        -	if uplo != blas.Upper && uplo != blas.Lower {
        +	switch uplo {
        +	default:
         		panic(badUplo)
        +	case blas.Upper, blas.Lower:
         	}
        -	if trans != blas.NoTrans && trans != blas.Trans && trans != blas.ConjTrans {
        +	switch trans {
        +	default:
         		panic(badTranspose)
        +	case blas.NoTrans, blas.Trans, blas.ConjTrans:
         	}
        -	if diag != blas.Unit && diag != blas.NonUnit {
        +	switch diag {
        +	default:
         		panic(badDiag)
        +	case blas.NonUnit, blas.Unit:
         	}
        -	checkZVector('x', n, x, incX)
        -	if len(ap) < n*(n+1)/2 {
        -		panic("blas: insufficient A packed matrix slice length")
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
         	}
         
        +	// Quick return if possible.
         	if n == 0 {
         		return
         	}
         
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(ap) < n*(n+1)/2 {
        +		panic(shortAP)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +
         	// Set up start index in X.
         	var kx int
         	if incX < 0 {
        @@ -1760,7 +2116,7 @@ func (Implementation) Ztpmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         	}
         
         	if trans == blas.Trans {
        -		// Form x = A^T*x.
        +		// Form x = Aᵀ*x.
         		if uplo == blas.Upper {
         			// kk points to the current diagonal element in ap.
         			kk := n*(n+1)/2 - 1
        @@ -1820,7 +2176,7 @@ func (Implementation) Ztpmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         		return
         	}
         
        -	// Form x = A^H*x.
        +	// Form x = Aᴴ*x.
         	if uplo == blas.Upper {
         		// kk points to the current diagonal element in ap.
         		kk := n*(n+1)/2 - 1
        @@ -1889,9 +2245,9 @@ func (Implementation) Ztpmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         }
         
         // Ztpsv solves one of the systems of equations
        -//  A * x = b    if trans == blas.NoTrans
        -//  A^T * x = b  if trans == blas.Trans
        -//  A^H * x = b  if trans == blas.ConjTrans
        +//  A * x = b   if trans == blas.NoTrans
        +//  Aᵀ * x = b  if trans == blas.Trans
        +//  Aᴴ * x = b  if trans == blas.ConjTrans
         // where b and x are n element vectors and A is an n×n triangular matrix in
         // packed form.
         //
        @@ -1901,24 +2257,41 @@ func (Implementation) Ztpmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         // No test for singularity or near-singularity is included in this
         // routine. Such tests must be performed before calling this routine.
         func (Implementation) Ztpsv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag, n int, ap []complex128, x []complex128, incX int) {
        -	if uplo != blas.Upper && uplo != blas.Lower {
        +	switch uplo {
        +	default:
         		panic(badUplo)
        +	case blas.Upper, blas.Lower:
         	}
        -	if trans != blas.NoTrans && trans != blas.Trans && trans != blas.ConjTrans {
        +	switch trans {
        +	default:
         		panic(badTranspose)
        +	case blas.NoTrans, blas.Trans, blas.ConjTrans:
         	}
        -	if diag != blas.Unit && diag != blas.NonUnit {
        +	switch diag {
        +	default:
         		panic(badDiag)
        +	case blas.NonUnit, blas.Unit:
         	}
        -	if len(ap) < n*(n+1)/2 {
        -		panic("blas: insufficient A packed matrix slice length")
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
         	}
        -	checkZVector('x', n, x, incX)
         
        +	// Quick return if possible.
         	if n == 0 {
         		return
         	}
         
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(ap) < n*(n+1)/2 {
        +		panic(shortAP)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +
         	// Set up start index in X.
         	var kx int
         	if incX < 0 {
        @@ -1961,7 +2334,7 @@ func (Implementation) Ztpsv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         			if incX == 1 {
         				for i := 0; i < n; i++ {
         					if i > 0 {
        -						x[i] -= c128.DotuUnitary(x[:i], ap[kk:kk+i+1])
        +						x[i] -= c128.DotuUnitary(x[:i], ap[kk:kk+i])
         					}
         					if diag == blas.NonUnit {
         						x[i] /= ap[kk+i]
        @@ -1972,7 +2345,7 @@ func (Implementation) Ztpsv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         				ix := kx
         				for i := 0; i < n; i++ {
         					if i > 0 {
        -						x[ix] -= c128.DotuInc(x, ap[kk:kk+i+1], uintptr(i), uintptr(incX), 1, uintptr(kx), 0)
        +						x[ix] -= c128.DotuInc(x, ap[kk:kk+i], uintptr(i), uintptr(incX), 1, uintptr(kx), 0)
         					}
         					if diag == blas.NonUnit {
         						x[ix] /= ap[kk+i]
        @@ -1986,7 +2359,7 @@ func (Implementation) Ztpsv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         	}
         
         	if trans == blas.Trans {
        -		// Form x = inv(A^T)*x.
        +		// Form x = inv(Aᵀ)*x.
         		if uplo == blas.Upper {
         			kk := 0
         			if incX == 1 {
        @@ -2041,7 +2414,7 @@ func (Implementation) Ztpsv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         		return
         	}
         
        -	// Form x = inv(A^H)*x.
        +	// Form x = inv(Aᴴ)*x.
         	if uplo == blas.Upper {
         		kk := 0
         		if incX == 1 {
        @@ -2108,27 +2481,49 @@ func (Implementation) Ztpsv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         }
         
         // Ztrmv performs one of the matrix-vector operations
        -//  x = A * x    if trans = blas.NoTrans
        -//  x = A^T * x  if trans = blas.Trans
        -//  x = A^H * x  if trans = blas.ConjTrans
        +//  x = A * x   if trans = blas.NoTrans
        +//  x = Aᵀ * x  if trans = blas.Trans
        +//  x = Aᴴ * x  if trans = blas.ConjTrans
         // where x is a vector, and A is an n×n triangular matrix.
         func (Implementation) Ztrmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag, n int, a []complex128, lda int, x []complex128, incX int) {
        -	if uplo != blas.Upper && uplo != blas.Lower {
        -		panic(badUplo)
        -	}
        -	if trans != blas.NoTrans && trans != blas.Trans && trans != blas.ConjTrans {
        +	switch trans {
        +	default:
         		panic(badTranspose)
        +	case blas.NoTrans, blas.Trans, blas.ConjTrans:
         	}
        -	if diag != blas.Unit && diag != blas.NonUnit {
        +	switch uplo {
        +	default:
        +		panic(badUplo)
        +	case blas.Upper, blas.Lower:
        +	}
        +	switch diag {
        +	default:
         		panic(badDiag)
        +	case blas.NonUnit, blas.Unit:
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
         	}
        -	checkZMatrix('A', n, n, a, lda)
        -	checkZVector('x', n, x, incX)
         
        +	// Quick return if possible.
         	if n == 0 {
         		return
         	}
         
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(n-1)+n {
        +		panic(shortA)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +
         	// Set up start index in X.
         	var kx int
         	if incX < 0 {
        @@ -2188,7 +2583,7 @@ func (Implementation) Ztrmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         	}
         
         	if trans == blas.Trans {
        -		// Form x = A^T*x.
        +		// Form x = Aᵀ*x.
         		if uplo == blas.Upper {
         			if incX == 1 {
         				for i := n - 1; i >= 0; i-- {
        @@ -2239,7 +2634,7 @@ func (Implementation) Ztrmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         		return
         	}
         
        -	// Form x = A^H*x.
        +	// Form x = Aᴴ*x.
         	if uplo == blas.Upper {
         		if incX == 1 {
         			for i := n - 1; i >= 0; i-- {
        @@ -2294,9 +2689,9 @@ func (Implementation) Ztrmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         }
         
         // Ztrsv solves one of the systems of equations
        -//  A * x = b    if trans == blas.NoTrans
        -//  A^T * x = b  if trans == blas.Trans
        -//  A^H * x = b  if trans == blas.ConjTrans
        +//  A * x = b   if trans == blas.NoTrans
        +//  Aᵀ * x = b  if trans == blas.Trans
        +//  Aᴴ * x = b  if trans == blas.ConjTrans
         // where b and x are n element vectors and A is an n×n triangular matrix.
         //
         // On entry, x contains the values of b, and the solution is
        @@ -2305,22 +2700,44 @@ func (Implementation) Ztrmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         // No test for singularity or near-singularity is included in this
         // routine. Such tests must be performed before calling this routine.
         func (Implementation) Ztrsv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag, n int, a []complex128, lda int, x []complex128, incX int) {
        -	if uplo != blas.Upper && uplo != blas.Lower {
        -		panic(badUplo)
        -	}
        -	if trans != blas.NoTrans && trans != blas.Trans && trans != blas.ConjTrans {
        +	switch trans {
        +	default:
         		panic(badTranspose)
        +	case blas.NoTrans, blas.Trans, blas.ConjTrans:
        +	}
        +	switch uplo {
        +	default:
        +		panic(badUplo)
        +	case blas.Upper, blas.Lower:
         	}
        -	if diag != blas.Unit && diag != blas.NonUnit {
        +	switch diag {
        +	default:
         		panic(badDiag)
        +	case blas.NonUnit, blas.Unit:
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
         	}
        -	checkZMatrix('A', n, n, a, lda)
        -	checkZVector('x', n, x, incX)
         
        +	// Quick return if possible.
         	if n == 0 {
         		return
         	}
         
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(n-1)+n {
        +		panic(shortA)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +
         	// Set up start index in X.
         	var kx int
         	if incX < 0 {
        @@ -2382,7 +2799,7 @@ func (Implementation) Ztrsv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         	}
         
         	if trans == blas.Trans {
        -		// Form x = inv(A^T)*x.
        +		// Form x = inv(Aᵀ)*x.
         		if uplo == blas.Upper {
         			if incX == 1 {
         				for j := 0; j < n; j++ {
        @@ -2432,7 +2849,7 @@ func (Implementation) Ztrsv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag
         		return
         	}
         
        -	// Form x = inv(A^H)*x.
        +	// Form x = inv(Aᴴ)*x.
         	if uplo == blas.Upper {
         		if incX == 1 {
         			for j := 0; j < n; j++ {
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/level2cmplx64.go b/vendor/gonum.org/v1/gonum/blas/gonum/level2cmplx64.go
        new file mode 100644
        index 000000000..3aa4c21cb
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/blas/gonum/level2cmplx64.go
        @@ -0,0 +1,2942 @@
        +// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.
        +
        +// Copyright ©2017 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package gonum
        +
        +import (
        +	cmplx "gonum.org/v1/gonum/internal/cmplx64"
        +
        +	"gonum.org/v1/gonum/blas"
        +	"gonum.org/v1/gonum/internal/asm/c64"
        +)
        +
        +var _ blas.Complex64Level2 = Implementation{}
        +
        +// Cgbmv performs one of the matrix-vector operations
        +//  y = alpha * A * x + beta * y   if trans = blas.NoTrans
        +//  y = alpha * Aᵀ * x + beta * y  if trans = blas.Trans
        +//  y = alpha * Aᴴ * x + beta * y  if trans = blas.ConjTrans
        +// where alpha and beta are scalars, x and y are vectors, and A is an m×n band matrix
        +// with kL sub-diagonals and kU super-diagonals.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Cgbmv(trans blas.Transpose, m, n, kL, kU int, alpha complex64, a []complex64, lda int, x []complex64, incX int, beta complex64, y []complex64, incY int) {
        +	switch trans {
        +	default:
        +		panic(badTranspose)
        +	case blas.NoTrans, blas.Trans, blas.ConjTrans:
        +	}
        +	if m < 0 {
        +		panic(mLT0)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if kL < 0 {
        +		panic(kLLT0)
        +	}
        +	if kU < 0 {
        +		panic(kULT0)
        +	}
        +	if lda < kL+kU+1 {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(min(m, n+kL)-1)+kL+kU+1 {
        +		panic(shortA)
        +	}
        +	var lenX, lenY int
        +	if trans == blas.NoTrans {
        +		lenX, lenY = n, m
        +	} else {
        +		lenX, lenY = m, n
        +	}
        +	if (incX > 0 && len(x) <= (lenX-1)*incX) || (incX < 0 && len(x) <= (1-lenX)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (lenY-1)*incY) || (incY < 0 && len(y) <= (1-lenY)*incY) {
        +		panic(shortY)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 && beta == 1 {
        +		return
        +	}
        +
        +	var kx int
        +	if incX < 0 {
        +		kx = (1 - lenX) * incX
        +	}
        +	var ky int
        +	if incY < 0 {
        +		ky = (1 - lenY) * incY
        +	}
        +
        +	// Form y = beta*y.
        +	if beta != 1 {
        +		if incY == 1 {
        +			if beta == 0 {
        +				for i := range y[:lenY] {
        +					y[i] = 0
        +				}
        +			} else {
        +				c64.ScalUnitary(beta, y[:lenY])
        +			}
        +		} else {
        +			iy := ky
        +			if beta == 0 {
        +				for i := 0; i < lenY; i++ {
        +					y[iy] = 0
        +					iy += incY
        +				}
        +			} else {
        +				if incY > 0 {
        +					c64.ScalInc(beta, y, uintptr(lenY), uintptr(incY))
        +				} else {
        +					c64.ScalInc(beta, y, uintptr(lenY), uintptr(-incY))
        +				}
        +			}
        +		}
        +	}
        +
        +	nRow := min(m, n+kL)
        +	nCol := kL + 1 + kU
        +	switch trans {
        +	case blas.NoTrans:
        +		iy := ky
        +		if incX == 1 {
        +			for i := 0; i < nRow; i++ {
        +				l := max(0, kL-i)
        +				u := min(nCol, n+kL-i)
        +				aRow := a[i*lda+l : i*lda+u]
        +				off := max(0, i-kL)
        +				xtmp := x[off : off+u-l]
        +				var sum complex64
        +				for j, v := range aRow {
        +					sum += xtmp[j] * v
        +				}
        +				y[iy] += alpha * sum
        +				iy += incY
        +			}
        +		} else {
        +			for i := 0; i < nRow; i++ {
        +				l := max(0, kL-i)
        +				u := min(nCol, n+kL-i)
        +				aRow := a[i*lda+l : i*lda+u]
        +				off := max(0, i-kL) * incX
        +				jx := kx
        +				var sum complex64
        +				for _, v := range aRow {
        +					sum += x[off+jx] * v
        +					jx += incX
        +				}
        +				y[iy] += alpha * sum
        +				iy += incY
        +			}
        +		}
        +	case blas.Trans:
        +		if incX == 1 {
        +			for i := 0; i < nRow; i++ {
        +				l := max(0, kL-i)
        +				u := min(nCol, n+kL-i)
        +				aRow := a[i*lda+l : i*lda+u]
        +				off := max(0, i-kL) * incY
        +				alphaxi := alpha * x[i]
        +				jy := ky
        +				for _, v := range aRow {
        +					y[off+jy] += alphaxi * v
        +					jy += incY
        +				}
        +			}
        +		} else {
        +			ix := kx
        +			for i := 0; i < nRow; i++ {
        +				l := max(0, kL-i)
        +				u := min(nCol, n+kL-i)
        +				aRow := a[i*lda+l : i*lda+u]
        +				off := max(0, i-kL) * incY
        +				alphaxi := alpha * x[ix]
        +				jy := ky
        +				for _, v := range aRow {
        +					y[off+jy] += alphaxi * v
        +					jy += incY
        +				}
        +				ix += incX
        +			}
        +		}
        +	case blas.ConjTrans:
        +		if incX == 1 {
        +			for i := 0; i < nRow; i++ {
        +				l := max(0, kL-i)
        +				u := min(nCol, n+kL-i)
        +				aRow := a[i*lda+l : i*lda+u]
        +				off := max(0, i-kL) * incY
        +				alphaxi := alpha * x[i]
        +				jy := ky
        +				for _, v := range aRow {
        +					y[off+jy] += alphaxi * cmplx.Conj(v)
        +					jy += incY
        +				}
        +			}
        +		} else {
        +			ix := kx
        +			for i := 0; i < nRow; i++ {
        +				l := max(0, kL-i)
        +				u := min(nCol, n+kL-i)
        +				aRow := a[i*lda+l : i*lda+u]
        +				off := max(0, i-kL) * incY
        +				alphaxi := alpha * x[ix]
        +				jy := ky
        +				for _, v := range aRow {
        +					y[off+jy] += alphaxi * cmplx.Conj(v)
        +					jy += incY
        +				}
        +				ix += incX
        +			}
        +		}
        +	}
        +}
        +
        +// Cgemv performs one of the matrix-vector operations
        +//  y = alpha * A * x + beta * y   if trans = blas.NoTrans
        +//  y = alpha * Aᵀ * x + beta * y  if trans = blas.Trans
        +//  y = alpha * Aᴴ * x + beta * y  if trans = blas.ConjTrans
        +// where alpha and beta are scalars, x and y are vectors, and A is an m×n dense matrix.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Cgemv(trans blas.Transpose, m, n int, alpha complex64, a []complex64, lda int, x []complex64, incX int, beta complex64, y []complex64, incY int) {
        +	switch trans {
        +	default:
        +		panic(badTranspose)
        +	case blas.NoTrans, blas.Trans, blas.ConjTrans:
        +	}
        +	if m < 0 {
        +		panic(mLT0)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	var lenX, lenY int
        +	if trans == blas.NoTrans {
        +		lenX = n
        +		lenY = m
        +	} else {
        +		lenX = m
        +		lenY = n
        +	}
        +	if len(a) < lda*(m-1)+n {
        +		panic(shortA)
        +	}
        +	if (incX > 0 && len(x) <= (lenX-1)*incX) || (incX < 0 && len(x) <= (1-lenX)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (lenY-1)*incY) || (incY < 0 && len(y) <= (1-lenY)*incY) {
        +		panic(shortY)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 && beta == 1 {
        +		return
        +	}
        +
        +	var kx int
        +	if incX < 0 {
        +		kx = (1 - lenX) * incX
        +	}
        +	var ky int
        +	if incY < 0 {
        +		ky = (1 - lenY) * incY
        +	}
        +
        +	// Form y = beta*y.
        +	if beta != 1 {
        +		if incY == 1 {
        +			if beta == 0 {
        +				for i := range y[:lenY] {
        +					y[i] = 0
        +				}
        +			} else {
        +				c64.ScalUnitary(beta, y[:lenY])
        +			}
        +		} else {
        +			iy := ky
        +			if beta == 0 {
        +				for i := 0; i < lenY; i++ {
        +					y[iy] = 0
        +					iy += incY
        +				}
        +			} else {
        +				if incY > 0 {
        +					c64.ScalInc(beta, y, uintptr(lenY), uintptr(incY))
        +				} else {
        +					c64.ScalInc(beta, y, uintptr(lenY), uintptr(-incY))
        +				}
        +			}
        +		}
        +	}
        +
        +	if alpha == 0 {
        +		return
        +	}
        +
        +	switch trans {
        +	default:
        +		// Form y = alpha*A*x + y.
        +		iy := ky
        +		if incX == 1 {
        +			for i := 0; i < m; i++ {
        +				y[iy] += alpha * c64.DotuUnitary(a[i*lda:i*lda+n], x[:n])
        +				iy += incY
        +			}
        +			return
        +		}
        +		for i := 0; i < m; i++ {
        +			y[iy] += alpha * c64.DotuInc(a[i*lda:i*lda+n], x, uintptr(n), 1, uintptr(incX), 0, uintptr(kx))
        +			iy += incY
        +		}
        +		return
        +
        +	case blas.Trans:
        +		// Form y = alpha*Aᵀ*x + y.
        +		ix := kx
        +		if incY == 1 {
        +			for i := 0; i < m; i++ {
        +				c64.AxpyUnitary(alpha*x[ix], a[i*lda:i*lda+n], y[:n])
        +				ix += incX
        +			}
        +			return
        +		}
        +		for i := 0; i < m; i++ {
        +			c64.AxpyInc(alpha*x[ix], a[i*lda:i*lda+n], y, uintptr(n), 1, uintptr(incY), 0, uintptr(ky))
        +			ix += incX
        +		}
        +		return
        +
        +	case blas.ConjTrans:
        +		// Form y = alpha*Aᴴ*x + y.
        +		ix := kx
        +		if incY == 1 {
        +			for i := 0; i < m; i++ {
        +				tmp := alpha * x[ix]
        +				for j := 0; j < n; j++ {
        +					y[j] += tmp * cmplx.Conj(a[i*lda+j])
        +				}
        +				ix += incX
        +			}
        +			return
        +		}
        +		for i := 0; i < m; i++ {
        +			tmp := alpha * x[ix]
        +			jy := ky
        +			for j := 0; j < n; j++ {
        +				y[jy] += tmp * cmplx.Conj(a[i*lda+j])
        +				jy += incY
        +			}
        +			ix += incX
        +		}
        +		return
        +	}
        +}
        +
        +// Cgerc performs the rank-one operation
        +//  A += alpha * x * yᴴ
        +// where A is an m×n dense matrix, alpha is a scalar, x is an m element vector,
        +// and y is an n element vector.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Cgerc(m, n int, alpha complex64, x []complex64, incX int, y []complex64, incY int, a []complex64, lda int) {
        +	if m < 0 {
        +		panic(mLT0)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if (incX > 0 && len(x) <= (m-1)*incX) || (incX < 0 && len(x) <= (1-m)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +	if len(a) < lda*(m-1)+n {
        +		panic(shortA)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 {
        +		return
        +	}
        +
        +	var kx, jy int
        +	if incX < 0 {
        +		kx = (1 - m) * incX
        +	}
        +	if incY < 0 {
        +		jy = (1 - n) * incY
        +	}
        +	for j := 0; j < n; j++ {
        +		if y[jy] != 0 {
        +			tmp := alpha * cmplx.Conj(y[jy])
        +			c64.AxpyInc(tmp, x, a[j:], uintptr(m), uintptr(incX), uintptr(lda), uintptr(kx), 0)
        +		}
        +		jy += incY
        +	}
        +}
        +
        +// Cgeru performs the rank-one operation
        +//  A += alpha * x * yᵀ
        +// where A is an m×n dense matrix, alpha is a scalar, x is an m element vector,
        +// and y is an n element vector.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Cgeru(m, n int, alpha complex64, x []complex64, incX int, y []complex64, incY int, a []complex64, lda int) {
        +	if m < 0 {
        +		panic(mLT0)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if (incX > 0 && len(x) <= (m-1)*incX) || (incX < 0 && len(x) <= (1-m)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +	if len(a) < lda*(m-1)+n {
        +		panic(shortA)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 {
        +		return
        +	}
        +
        +	var kx int
        +	if incX < 0 {
        +		kx = (1 - m) * incX
        +	}
        +	if incY == 1 {
        +		for i := 0; i < m; i++ {
        +			if x[kx] != 0 {
        +				tmp := alpha * x[kx]
        +				c64.AxpyUnitary(tmp, y[:n], a[i*lda:i*lda+n])
        +			}
        +			kx += incX
        +		}
        +		return
        +	}
        +	var jy int
        +	if incY < 0 {
        +		jy = (1 - n) * incY
        +	}
        +	for i := 0; i < m; i++ {
        +		if x[kx] != 0 {
        +			tmp := alpha * x[kx]
        +			c64.AxpyInc(tmp, y, a[i*lda:i*lda+n], uintptr(n), uintptr(incY), 1, uintptr(jy), 0)
        +		}
        +		kx += incX
        +	}
        +}
        +
        +// Chbmv performs the matrix-vector operation
        +//  y = alpha * A * x + beta * y
        +// where alpha and beta are scalars, x and y are vectors, and A is an n×n
        +// Hermitian band matrix with k super-diagonals. The imaginary parts of
        +// the diagonal elements of A are ignored and assumed to be zero.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Chbmv(uplo blas.Uplo, n, k int, alpha complex64, a []complex64, lda int, x []complex64, incX int, beta complex64, y []complex64, incY int) {
        +	switch uplo {
        +	default:
        +		panic(badUplo)
        +	case blas.Upper, blas.Lower:
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if k < 0 {
        +		panic(kLT0)
        +	}
        +	if lda < k+1 {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(n-1)+k+1 {
        +		panic(shortA)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 && beta == 1 {
        +		return
        +	}
        +
        +	// Set up the start indices in X and Y.
        +	var kx int
        +	if incX < 0 {
        +		kx = (1 - n) * incX
        +	}
        +	var ky int
        +	if incY < 0 {
        +		ky = (1 - n) * incY
        +	}
        +
        +	// Form y = beta*y.
        +	if beta != 1 {
        +		if incY == 1 {
        +			if beta == 0 {
        +				for i := range y[:n] {
        +					y[i] = 0
        +				}
        +			} else {
        +				for i, v := range y[:n] {
        +					y[i] = beta * v
        +				}
        +			}
        +		} else {
        +			iy := ky
        +			if beta == 0 {
        +				for i := 0; i < n; i++ {
        +					y[iy] = 0
        +					iy += incY
        +				}
        +			} else {
        +				for i := 0; i < n; i++ {
        +					y[iy] = beta * y[iy]
        +					iy += incY
        +				}
        +			}
        +		}
        +	}
        +
        +	if alpha == 0 {
        +		return
        +	}
        +
        +	// The elements of A are accessed sequentially with one pass through a.
        +	switch uplo {
        +	case blas.Upper:
        +		iy := ky
        +		if incX == 1 {
        +			for i := 0; i < n; i++ {
        +				aRow := a[i*lda:]
        +				alphaxi := alpha * x[i]
        +				sum := alphaxi * complex(real(aRow[0]), 0)
        +				u := min(k+1, n-i)
        +				jy := incY
        +				for j := 1; j < u; j++ {
        +					v := aRow[j]
        +					sum += alpha * x[i+j] * v
        +					y[iy+jy] += alphaxi * cmplx.Conj(v)
        +					jy += incY
        +				}
        +				y[iy] += sum
        +				iy += incY
        +			}
        +		} else {
        +			ix := kx
        +			for i := 0; i < n; i++ {
        +				aRow := a[i*lda:]
        +				alphaxi := alpha * x[ix]
        +				sum := alphaxi * complex(real(aRow[0]), 0)
        +				u := min(k+1, n-i)
        +				jx := incX
        +				jy := incY
        +				for j := 1; j < u; j++ {
        +					v := aRow[j]
        +					sum += alpha * x[ix+jx] * v
        +					y[iy+jy] += alphaxi * cmplx.Conj(v)
        +					jx += incX
        +					jy += incY
        +				}
        +				y[iy] += sum
        +				ix += incX
        +				iy += incY
        +			}
        +		}
        +	case blas.Lower:
        +		iy := ky
        +		if incX == 1 {
        +			for i := 0; i < n; i++ {
        +				l := max(0, k-i)
        +				alphaxi := alpha * x[i]
        +				jy := l * incY
        +				aRow := a[i*lda:]
        +				for j := l; j < k; j++ {
        +					v := aRow[j]
        +					y[iy] += alpha * v * x[i-k+j]
        +					y[iy-k*incY+jy] += alphaxi * cmplx.Conj(v)
        +					jy += incY
        +				}
        +				y[iy] += alphaxi * complex(real(aRow[k]), 0)
        +				iy += incY
        +			}
        +		} else {
        +			ix := kx
        +			for i := 0; i < n; i++ {
        +				l := max(0, k-i)
        +				alphaxi := alpha * x[ix]
        +				jx := l * incX
        +				jy := l * incY
        +				aRow := a[i*lda:]
        +				for j := l; j < k; j++ {
        +					v := aRow[j]
        +					y[iy] += alpha * v * x[ix-k*incX+jx]
        +					y[iy-k*incY+jy] += alphaxi * cmplx.Conj(v)
        +					jx += incX
        +					jy += incY
        +				}
        +				y[iy] += alphaxi * complex(real(aRow[k]), 0)
        +				ix += incX
        +				iy += incY
        +			}
        +		}
        +	}
        +}
        +
        +// Chemv performs the matrix-vector operation
        +//  y = alpha * A * x + beta * y
        +// where alpha and beta are scalars, x and y are vectors, and A is an n×n
        +// Hermitian matrix. The imaginary parts of the diagonal elements of A are
        +// ignored and assumed to be zero.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Chemv(uplo blas.Uplo, n int, alpha complex64, a []complex64, lda int, x []complex64, incX int, beta complex64, y []complex64, incY int) {
        +	switch uplo {
        +	default:
        +		panic(badUplo)
        +	case blas.Upper, blas.Lower:
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(n-1)+n {
        +		panic(shortA)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 && beta == 1 {
        +		return
        +	}
        +
        +	// Set up the start indices in X and Y.
        +	var kx int
        +	if incX < 0 {
        +		kx = (1 - n) * incX
        +	}
        +	var ky int
        +	if incY < 0 {
        +		ky = (1 - n) * incY
        +	}
        +
        +	// Form y = beta*y.
        +	if beta != 1 {
        +		if incY == 1 {
        +			if beta == 0 {
        +				for i := range y[:n] {
        +					y[i] = 0
        +				}
        +			} else {
        +				for i, v := range y[:n] {
        +					y[i] = beta * v
        +				}
        +			}
        +		} else {
        +			iy := ky
        +			if beta == 0 {
        +				for i := 0; i < n; i++ {
        +					y[iy] = 0
        +					iy += incY
        +				}
        +			} else {
        +				for i := 0; i < n; i++ {
        +					y[iy] = beta * y[iy]
        +					iy += incY
        +				}
        +			}
        +		}
        +	}
        +
        +	if alpha == 0 {
        +		return
        +	}
        +
        +	// The elements of A are accessed sequentially with one pass through
        +	// the triangular part of A.
        +
        +	if uplo == blas.Upper {
        +		// Form y when A is stored in upper triangle.
        +		if incX == 1 && incY == 1 {
        +			for i := 0; i < n; i++ {
        +				tmp1 := alpha * x[i]
        +				var tmp2 complex64
        +				for j := i + 1; j < n; j++ {
        +					y[j] += tmp1 * cmplx.Conj(a[i*lda+j])
        +					tmp2 += a[i*lda+j] * x[j]
        +				}
        +				aii := complex(real(a[i*lda+i]), 0)
        +				y[i] += tmp1*aii + alpha*tmp2
        +			}
        +		} else {
        +			ix := kx
        +			iy := ky
        +			for i := 0; i < n; i++ {
        +				tmp1 := alpha * x[ix]
        +				var tmp2 complex64
        +				jx := ix
        +				jy := iy
        +				for j := i + 1; j < n; j++ {
        +					jx += incX
        +					jy += incY
        +					y[jy] += tmp1 * cmplx.Conj(a[i*lda+j])
        +					tmp2 += a[i*lda+j] * x[jx]
        +				}
        +				aii := complex(real(a[i*lda+i]), 0)
        +				y[iy] += tmp1*aii + alpha*tmp2
        +				ix += incX
        +				iy += incY
        +			}
        +		}
        +		return
        +	}
        +
        +	// Form y when A is stored in lower triangle.
        +	if incX == 1 && incY == 1 {
        +		for i := 0; i < n; i++ {
        +			tmp1 := alpha * x[i]
        +			var tmp2 complex64
        +			for j := 0; j < i; j++ {
        +				y[j] += tmp1 * cmplx.Conj(a[i*lda+j])
        +				tmp2 += a[i*lda+j] * x[j]
        +			}
        +			aii := complex(real(a[i*lda+i]), 0)
        +			y[i] += tmp1*aii + alpha*tmp2
        +		}
        +	} else {
        +		ix := kx
        +		iy := ky
        +		for i := 0; i < n; i++ {
        +			tmp1 := alpha * x[ix]
        +			var tmp2 complex64
        +			jx := kx
        +			jy := ky
        +			for j := 0; j < i; j++ {
        +				y[jy] += tmp1 * cmplx.Conj(a[i*lda+j])
        +				tmp2 += a[i*lda+j] * x[jx]
        +				jx += incX
        +				jy += incY
        +			}
        +			aii := complex(real(a[i*lda+i]), 0)
        +			y[iy] += tmp1*aii + alpha*tmp2
        +			ix += incX
        +			iy += incY
        +		}
        +	}
        +}
        +
        +// Cher performs the Hermitian rank-one operation
        +//  A += alpha * x * xᴴ
        +// where A is an n×n Hermitian matrix, alpha is a real scalar, and x is an n
        +// element vector. On entry, the imaginary parts of the diagonal elements of A
        +// are ignored and assumed to be zero, on return they will be set to zero.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Cher(uplo blas.Uplo, n int, alpha float32, x []complex64, incX int, a []complex64, lda int) {
        +	switch uplo {
        +	default:
        +		panic(badUplo)
        +	case blas.Upper, blas.Lower:
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if len(a) < lda*(n-1)+n {
        +		panic(shortA)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 {
        +		return
        +	}
        +
        +	var kx int
        +	if incX < 0 {
        +		kx = (1 - n) * incX
        +	}
        +	if uplo == blas.Upper {
        +		if incX == 1 {
        +			for i := 0; i < n; i++ {
        +				if x[i] != 0 {
        +					tmp := complex(alpha*real(x[i]), alpha*imag(x[i]))
        +					aii := real(a[i*lda+i])
        +					xtmp := real(tmp * cmplx.Conj(x[i]))
        +					a[i*lda+i] = complex(aii+xtmp, 0)
        +					for j := i + 1; j < n; j++ {
        +						a[i*lda+j] += tmp * cmplx.Conj(x[j])
        +					}
        +				} else {
        +					aii := real(a[i*lda+i])
        +					a[i*lda+i] = complex(aii, 0)
        +				}
        +			}
        +			return
        +		}
        +
        +		ix := kx
        +		for i := 0; i < n; i++ {
        +			if x[ix] != 0 {
        +				tmp := complex(alpha*real(x[ix]), alpha*imag(x[ix]))
        +				aii := real(a[i*lda+i])
        +				xtmp := real(tmp * cmplx.Conj(x[ix]))
        +				a[i*lda+i] = complex(aii+xtmp, 0)
        +				jx := ix + incX
        +				for j := i + 1; j < n; j++ {
        +					a[i*lda+j] += tmp * cmplx.Conj(x[jx])
        +					jx += incX
        +				}
        +			} else {
        +				aii := real(a[i*lda+i])
        +				a[i*lda+i] = complex(aii, 0)
        +			}
        +			ix += incX
        +		}
        +		return
        +	}
        +
        +	if incX == 1 {
        +		for i := 0; i < n; i++ {
        +			if x[i] != 0 {
        +				tmp := complex(alpha*real(x[i]), alpha*imag(x[i]))
        +				for j := 0; j < i; j++ {
        +					a[i*lda+j] += tmp * cmplx.Conj(x[j])
        +				}
        +				aii := real(a[i*lda+i])
        +				xtmp := real(tmp * cmplx.Conj(x[i]))
        +				a[i*lda+i] = complex(aii+xtmp, 0)
        +			} else {
        +				aii := real(a[i*lda+i])
        +				a[i*lda+i] = complex(aii, 0)
        +			}
        +		}
        +		return
        +	}
        +
        +	ix := kx
        +	for i := 0; i < n; i++ {
        +		if x[ix] != 0 {
        +			tmp := complex(alpha*real(x[ix]), alpha*imag(x[ix]))
        +			jx := kx
        +			for j := 0; j < i; j++ {
        +				a[i*lda+j] += tmp * cmplx.Conj(x[jx])
        +				jx += incX
        +			}
        +			aii := real(a[i*lda+i])
        +			xtmp := real(tmp * cmplx.Conj(x[ix]))
        +			a[i*lda+i] = complex(aii+xtmp, 0)
        +
        +		} else {
        +			aii := real(a[i*lda+i])
        +			a[i*lda+i] = complex(aii, 0)
        +		}
        +		ix += incX
        +	}
        +}
        +
        +// Cher2 performs the Hermitian rank-two operation
        +//  A += alpha * x * yᴴ + conj(alpha) * y * xᴴ
        +// where alpha is a scalar, x and y are n element vectors and A is an n×n
        +// Hermitian matrix. On entry, the imaginary parts of the diagonal elements are
        +// ignored and assumed to be zero. On return they will be set to zero.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Cher2(uplo blas.Uplo, n int, alpha complex64, x []complex64, incX int, y []complex64, incY int, a []complex64, lda int) {
        +	switch uplo {
        +	default:
        +		panic(badUplo)
        +	case blas.Upper, blas.Lower:
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +	if len(a) < lda*(n-1)+n {
        +		panic(shortA)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 {
        +		return
        +	}
        +
        +	var kx, ky int
        +	var ix, iy int
        +	if incX != 1 || incY != 1 {
        +		if incX < 0 {
        +			kx = (1 - n) * incX
        +		}
        +		if incY < 0 {
        +			ky = (1 - n) * incY
        +		}
        +		ix = kx
        +		iy = ky
        +	}
        +	if uplo == blas.Upper {
        +		if incX == 1 && incY == 1 {
        +			for i := 0; i < n; i++ {
        +				if x[i] != 0 || y[i] != 0 {
        +					tmp1 := alpha * x[i]
        +					tmp2 := cmplx.Conj(alpha) * y[i]
        +					aii := real(a[i*lda+i]) + real(tmp1*cmplx.Conj(y[i])) + real(tmp2*cmplx.Conj(x[i]))
        +					a[i*lda+i] = complex(aii, 0)
        +					for j := i + 1; j < n; j++ {
        +						a[i*lda+j] += tmp1*cmplx.Conj(y[j]) + tmp2*cmplx.Conj(x[j])
        +					}
        +				} else {
        +					aii := real(a[i*lda+i])
        +					a[i*lda+i] = complex(aii, 0)
        +				}
        +			}
        +			return
        +		}
        +		for i := 0; i < n; i++ {
        +			if x[ix] != 0 || y[iy] != 0 {
        +				tmp1 := alpha * x[ix]
        +				tmp2 := cmplx.Conj(alpha) * y[iy]
        +				aii := real(a[i*lda+i]) + real(tmp1*cmplx.Conj(y[iy])) + real(tmp2*cmplx.Conj(x[ix]))
        +				a[i*lda+i] = complex(aii, 0)
        +				jx := ix + incX
        +				jy := iy + incY
        +				for j := i + 1; j < n; j++ {
        +					a[i*lda+j] += tmp1*cmplx.Conj(y[jy]) + tmp2*cmplx.Conj(x[jx])
        +					jx += incX
        +					jy += incY
        +				}
        +			} else {
        +				aii := real(a[i*lda+i])
        +				a[i*lda+i] = complex(aii, 0)
        +			}
        +			ix += incX
        +			iy += incY
        +		}
        +		return
        +	}
        +
        +	if incX == 1 && incY == 1 {
        +		for i := 0; i < n; i++ {
        +			if x[i] != 0 || y[i] != 0 {
        +				tmp1 := alpha * x[i]
        +				tmp2 := cmplx.Conj(alpha) * y[i]
        +				for j := 0; j < i; j++ {
        +					a[i*lda+j] += tmp1*cmplx.Conj(y[j]) + tmp2*cmplx.Conj(x[j])
        +				}
        +				aii := real(a[i*lda+i]) + real(tmp1*cmplx.Conj(y[i])) + real(tmp2*cmplx.Conj(x[i]))
        +				a[i*lda+i] = complex(aii, 0)
        +			} else {
        +				aii := real(a[i*lda+i])
        +				a[i*lda+i] = complex(aii, 0)
        +			}
        +		}
        +		return
        +	}
        +	for i := 0; i < n; i++ {
        +		if x[ix] != 0 || y[iy] != 0 {
        +			tmp1 := alpha * x[ix]
        +			tmp2 := cmplx.Conj(alpha) * y[iy]
        +			jx := kx
        +			jy := ky
        +			for j := 0; j < i; j++ {
        +				a[i*lda+j] += tmp1*cmplx.Conj(y[jy]) + tmp2*cmplx.Conj(x[jx])
        +				jx += incX
        +				jy += incY
        +			}
        +			aii := real(a[i*lda+i]) + real(tmp1*cmplx.Conj(y[iy])) + real(tmp2*cmplx.Conj(x[ix]))
        +			a[i*lda+i] = complex(aii, 0)
        +		} else {
        +			aii := real(a[i*lda+i])
        +			a[i*lda+i] = complex(aii, 0)
        +		}
        +		ix += incX
        +		iy += incY
        +	}
        +}
        +
        +// Chpmv performs the matrix-vector operation
        +//  y = alpha * A * x + beta * y
        +// where alpha and beta are scalars, x and y are vectors, and A is an n×n
        +// Hermitian matrix in packed form. The imaginary parts of the diagonal
        +// elements of A are ignored and assumed to be zero.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Chpmv(uplo blas.Uplo, n int, alpha complex64, ap []complex64, x []complex64, incX int, beta complex64, y []complex64, incY int) {
        +	switch uplo {
        +	default:
        +		panic(badUplo)
        +	case blas.Upper, blas.Lower:
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(ap) < n*(n+1)/2 {
        +		panic(shortAP)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 && beta == 1 {
        +		return
        +	}
        +
        +	// Set up the start indices in X and Y.
        +	var kx int
        +	if incX < 0 {
        +		kx = (1 - n) * incX
        +	}
        +	var ky int
        +	if incY < 0 {
        +		ky = (1 - n) * incY
        +	}
        +
        +	// Form y = beta*y.
        +	if beta != 1 {
        +		if incY == 1 {
        +			if beta == 0 {
        +				for i := range y[:n] {
        +					y[i] = 0
        +				}
        +			} else {
        +				for i, v := range y[:n] {
        +					y[i] = beta * v
        +				}
        +			}
        +		} else {
        +			iy := ky
        +			if beta == 0 {
        +				for i := 0; i < n; i++ {
        +					y[iy] = 0
        +					iy += incY
        +				}
        +			} else {
        +				for i := 0; i < n; i++ {
        +					y[iy] *= beta
        +					iy += incY
        +				}
        +			}
        +		}
        +	}
        +
        +	if alpha == 0 {
        +		return
        +	}
        +
        +	// The elements of A are accessed sequentially with one pass through ap.
        +
        +	var kk int
        +	if uplo == blas.Upper {
        +		// Form y when ap contains the upper triangle.
        +		// Here, kk points to the current diagonal element in ap.
        +		if incX == 1 && incY == 1 {
        +			for i := 0; i < n; i++ {
        +				tmp1 := alpha * x[i]
        +				y[i] += tmp1 * complex(real(ap[kk]), 0)
        +				var tmp2 complex64
        +				k := kk + 1
        +				for j := i + 1; j < n; j++ {
        +					y[j] += tmp1 * cmplx.Conj(ap[k])
        +					tmp2 += ap[k] * x[j]
        +					k++
        +				}
        +				y[i] += alpha * tmp2
        +				kk += n - i
        +			}
        +		} else {
        +			ix := kx
        +			iy := ky
        +			for i := 0; i < n; i++ {
        +				tmp1 := alpha * x[ix]
        +				y[iy] += tmp1 * complex(real(ap[kk]), 0)
        +				var tmp2 complex64
        +				jx := ix
        +				jy := iy
        +				for k := kk + 1; k < kk+n-i; k++ {
        +					jx += incX
        +					jy += incY
        +					y[jy] += tmp1 * cmplx.Conj(ap[k])
        +					tmp2 += ap[k] * x[jx]
        +				}
        +				y[iy] += alpha * tmp2
        +				ix += incX
        +				iy += incY
        +				kk += n - i
        +			}
        +		}
        +		return
        +	}
        +
        +	// Form y when ap contains the lower triangle.
        +	// Here, kk points to the beginning of current row in ap.
        +	if incX == 1 && incY == 1 {
        +		for i := 0; i < n; i++ {
        +			tmp1 := alpha * x[i]
        +			var tmp2 complex64
        +			k := kk
        +			for j := 0; j < i; j++ {
        +				y[j] += tmp1 * cmplx.Conj(ap[k])
        +				tmp2 += ap[k] * x[j]
        +				k++
        +			}
        +			aii := complex(real(ap[kk+i]), 0)
        +			y[i] += tmp1*aii + alpha*tmp2
        +			kk += i + 1
        +		}
        +	} else {
        +		ix := kx
        +		iy := ky
        +		for i := 0; i < n; i++ {
        +			tmp1 := alpha * x[ix]
        +			var tmp2 complex64
        +			jx := kx
        +			jy := ky
        +			for k := kk; k < kk+i; k++ {
        +				y[jy] += tmp1 * cmplx.Conj(ap[k])
        +				tmp2 += ap[k] * x[jx]
        +				jx += incX
        +				jy += incY
        +			}
        +			aii := complex(real(ap[kk+i]), 0)
        +			y[iy] += tmp1*aii + alpha*tmp2
        +			ix += incX
        +			iy += incY
        +			kk += i + 1
        +		}
        +	}
        +}
        +
        +// Chpr performs the Hermitian rank-1 operation
        +//  A += alpha * x * xᴴ
        +// where alpha is a real scalar, x is a vector, and A is an n×n hermitian matrix
        +// in packed form. On entry, the imaginary parts of the diagonal elements are
        +// assumed to be zero, and on return they are set to zero.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Chpr(uplo blas.Uplo, n int, alpha float32, x []complex64, incX int, ap []complex64) {
        +	switch uplo {
        +	default:
        +		panic(badUplo)
        +	case blas.Upper, blas.Lower:
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if len(ap) < n*(n+1)/2 {
        +		panic(shortAP)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 {
        +		return
        +	}
        +
        +	// Set up start index in X.
        +	var kx int
        +	if incX < 0 {
        +		kx = (1 - n) * incX
        +	}
        +
        +	// The elements of A are accessed sequentially with one pass through ap.
        +
        +	var kk int
        +	if uplo == blas.Upper {
        +		// Form A when upper triangle is stored in AP.
        +		// Here, kk points to the current diagonal element in ap.
        +		if incX == 1 {
        +			for i := 0; i < n; i++ {
        +				xi := x[i]
        +				if xi != 0 {
        +					aii := real(ap[kk]) + alpha*real(cmplx.Conj(xi)*xi)
        +					ap[kk] = complex(aii, 0)
        +
        +					tmp := complex(alpha, 0) * xi
        +					a := ap[kk+1 : kk+n-i]
        +					x := x[i+1 : n]
        +					for j, v := range x {
        +						a[j] += tmp * cmplx.Conj(v)
        +					}
        +				} else {
        +					ap[kk] = complex(real(ap[kk]), 0)
        +				}
        +				kk += n - i
        +			}
        +		} else {
        +			ix := kx
        +			for i := 0; i < n; i++ {
        +				xi := x[ix]
        +				if xi != 0 {
        +					aii := real(ap[kk]) + alpha*real(cmplx.Conj(xi)*xi)
        +					ap[kk] = complex(aii, 0)
        +
        +					tmp := complex(alpha, 0) * xi
        +					jx := ix + incX
        +					a := ap[kk+1 : kk+n-i]
        +					for k := range a {
        +						a[k] += tmp * cmplx.Conj(x[jx])
        +						jx += incX
        +					}
        +				} else {
        +					ap[kk] = complex(real(ap[kk]), 0)
        +				}
        +				ix += incX
        +				kk += n - i
        +			}
        +		}
        +		return
        +	}
        +
        +	// Form A when lower triangle is stored in AP.
        +	// Here, kk points to the beginning of current row in ap.
        +	if incX == 1 {
        +		for i := 0; i < n; i++ {
        +			xi := x[i]
        +			if xi != 0 {
        +				tmp := complex(alpha, 0) * xi
        +				a := ap[kk : kk+i]
        +				for j, v := range x[:i] {
        +					a[j] += tmp * cmplx.Conj(v)
        +				}
        +
        +				aii := real(ap[kk+i]) + alpha*real(cmplx.Conj(xi)*xi)
        +				ap[kk+i] = complex(aii, 0)
        +			} else {
        +				ap[kk+i] = complex(real(ap[kk+i]), 0)
        +			}
        +			kk += i + 1
        +		}
        +	} else {
        +		ix := kx
        +		for i := 0; i < n; i++ {
        +			xi := x[ix]
        +			if xi != 0 {
        +				tmp := complex(alpha, 0) * xi
        +				a := ap[kk : kk+i]
        +				jx := kx
        +				for k := range a {
        +					a[k] += tmp * cmplx.Conj(x[jx])
        +					jx += incX
        +				}
        +
        +				aii := real(ap[kk+i]) + alpha*real(cmplx.Conj(xi)*xi)
        +				ap[kk+i] = complex(aii, 0)
        +			} else {
        +				ap[kk+i] = complex(real(ap[kk+i]), 0)
        +			}
        +			ix += incX
        +			kk += i + 1
        +		}
        +	}
        +}
        +
        +// Chpr2 performs the Hermitian rank-2 operation
        +//  A += alpha * x * yᴴ + conj(alpha) * y * xᴴ
        +// where alpha is a complex scalar, x and y are n element vectors, and A is an
        +// n×n Hermitian matrix, supplied in packed form. On entry, the imaginary parts
        +// of the diagonal elements are assumed to be zero, and on return they are set to zero.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Chpr2(uplo blas.Uplo, n int, alpha complex64, x []complex64, incX int, y []complex64, incY int, ap []complex64) {
        +	switch uplo {
        +	default:
        +		panic(badUplo)
        +	case blas.Upper, blas.Lower:
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +	if len(ap) < n*(n+1)/2 {
        +		panic(shortAP)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 {
        +		return
        +	}
        +
        +	// Set up start indices in X and Y.
        +	var kx int
        +	if incX < 0 {
        +		kx = (1 - n) * incX
        +	}
        +	var ky int
        +	if incY < 0 {
        +		ky = (1 - n) * incY
        +	}
        +
        +	// The elements of A are accessed sequentially with one pass through ap.
        +
        +	var kk int
        +	if uplo == blas.Upper {
        +		// Form A when upper triangle is stored in AP.
        +		// Here, kk points to the current diagonal element in ap.
        +		if incX == 1 && incY == 1 {
        +			for i := 0; i < n; i++ {
        +				if x[i] != 0 || y[i] != 0 {
        +					tmp1 := alpha * x[i]
        +					tmp2 := cmplx.Conj(alpha) * y[i]
        +					aii := real(ap[kk]) + real(tmp1*cmplx.Conj(y[i])) + real(tmp2*cmplx.Conj(x[i]))
        +					ap[kk] = complex(aii, 0)
        +					k := kk + 1
        +					for j := i + 1; j < n; j++ {
        +						ap[k] += tmp1*cmplx.Conj(y[j]) + tmp2*cmplx.Conj(x[j])
        +						k++
        +					}
        +				} else {
        +					ap[kk] = complex(real(ap[kk]), 0)
        +				}
        +				kk += n - i
        +			}
        +		} else {
        +			ix := kx
        +			iy := ky
        +			for i := 0; i < n; i++ {
        +				if x[ix] != 0 || y[iy] != 0 {
        +					tmp1 := alpha * x[ix]
        +					tmp2 := cmplx.Conj(alpha) * y[iy]
        +					aii := real(ap[kk]) + real(tmp1*cmplx.Conj(y[iy])) + real(tmp2*cmplx.Conj(x[ix]))
        +					ap[kk] = complex(aii, 0)
        +					jx := ix + incX
        +					jy := iy + incY
        +					for k := kk + 1; k < kk+n-i; k++ {
        +						ap[k] += tmp1*cmplx.Conj(y[jy]) + tmp2*cmplx.Conj(x[jx])
        +						jx += incX
        +						jy += incY
        +					}
        +				} else {
        +					ap[kk] = complex(real(ap[kk]), 0)
        +				}
        +				ix += incX
        +				iy += incY
        +				kk += n - i
        +			}
        +		}
        +		return
        +	}
        +
        +	// Form A when lower triangle is stored in AP.
        +	// Here, kk points to the beginning of current row in ap.
        +	if incX == 1 && incY == 1 {
        +		for i := 0; i < n; i++ {
        +			if x[i] != 0 || y[i] != 0 {
        +				tmp1 := alpha * x[i]
        +				tmp2 := cmplx.Conj(alpha) * y[i]
        +				k := kk
        +				for j := 0; j < i; j++ {
        +					ap[k] += tmp1*cmplx.Conj(y[j]) + tmp2*cmplx.Conj(x[j])
        +					k++
        +				}
        +				aii := real(ap[kk+i]) + real(tmp1*cmplx.Conj(y[i])) + real(tmp2*cmplx.Conj(x[i]))
        +				ap[kk+i] = complex(aii, 0)
        +			} else {
        +				ap[kk+i] = complex(real(ap[kk+i]), 0)
        +			}
        +			kk += i + 1
        +		}
        +	} else {
        +		ix := kx
        +		iy := ky
        +		for i := 0; i < n; i++ {
        +			if x[ix] != 0 || y[iy] != 0 {
        +				tmp1 := alpha * x[ix]
        +				tmp2 := cmplx.Conj(alpha) * y[iy]
        +				jx := kx
        +				jy := ky
        +				for k := kk; k < kk+i; k++ {
        +					ap[k] += tmp1*cmplx.Conj(y[jy]) + tmp2*cmplx.Conj(x[jx])
        +					jx += incX
        +					jy += incY
        +				}
        +				aii := real(ap[kk+i]) + real(tmp1*cmplx.Conj(y[iy])) + real(tmp2*cmplx.Conj(x[ix]))
        +				ap[kk+i] = complex(aii, 0)
        +			} else {
        +				ap[kk+i] = complex(real(ap[kk+i]), 0)
        +			}
        +			ix += incX
        +			iy += incY
        +			kk += i + 1
        +		}
        +	}
        +}
        +
        +// Ctbmv performs one of the matrix-vector operations
        +//  x = A * x   if trans = blas.NoTrans
        +//  x = Aᵀ * x  if trans = blas.Trans
        +//  x = Aᴴ * x  if trans = blas.ConjTrans
        +// where x is an n element vector and A is an n×n triangular band matrix, with
        +// (k+1) diagonals.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Ctbmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag, n, k int, a []complex64, lda int, x []complex64, incX int) {
        +	switch trans {
        +	default:
        +		panic(badTranspose)
        +	case blas.NoTrans, blas.Trans, blas.ConjTrans:
        +	}
        +	switch uplo {
        +	default:
        +		panic(badUplo)
        +	case blas.Upper, blas.Lower:
        +	}
        +	switch diag {
        +	default:
        +		panic(badDiag)
        +	case blas.NonUnit, blas.Unit:
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if k < 0 {
        +		panic(kLT0)
        +	}
        +	if lda < k+1 {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(n-1)+k+1 {
        +		panic(shortA)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +
        +	// Set up start index in X.
        +	var kx int
        +	if incX < 0 {
        +		kx = (1 - n) * incX
        +	}
        +
        +	switch trans {
        +	case blas.NoTrans:
        +		if uplo == blas.Upper {
        +			if incX == 1 {
        +				for i := 0; i < n; i++ {
        +					xi := x[i]
        +					if diag == blas.NonUnit {
        +						xi *= a[i*lda]
        +					}
        +					kk := min(k, n-i-1)
        +					for j, aij := range a[i*lda+1 : i*lda+kk+1] {
        +						xi += x[i+j+1] * aij
        +					}
        +					x[i] = xi
        +				}
        +			} else {
        +				ix := kx
        +				for i := 0; i < n; i++ {
        +					xi := x[ix]
        +					if diag == blas.NonUnit {
        +						xi *= a[i*lda]
        +					}
        +					kk := min(k, n-i-1)
        +					jx := ix + incX
        +					for _, aij := range a[i*lda+1 : i*lda+kk+1] {
        +						xi += x[jx] * aij
        +						jx += incX
        +					}
        +					x[ix] = xi
        +					ix += incX
        +				}
        +			}
        +		} else {
        +			if incX == 1 {
        +				for i := n - 1; i >= 0; i-- {
        +					xi := x[i]
        +					if diag == blas.NonUnit {
        +						xi *= a[i*lda+k]
        +					}
        +					kk := min(k, i)
        +					for j, aij := range a[i*lda+k-kk : i*lda+k] {
        +						xi += x[i-kk+j] * aij
        +					}
        +					x[i] = xi
        +				}
        +			} else {
        +				ix := kx + (n-1)*incX
        +				for i := n - 1; i >= 0; i-- {
        +					xi := x[ix]
        +					if diag == blas.NonUnit {
        +						xi *= a[i*lda+k]
        +					}
        +					kk := min(k, i)
        +					jx := ix - kk*incX
        +					for _, aij := range a[i*lda+k-kk : i*lda+k] {
        +						xi += x[jx] * aij
        +						jx += incX
        +					}
        +					x[ix] = xi
        +					ix -= incX
        +				}
        +			}
        +		}
        +	case blas.Trans:
        +		if uplo == blas.Upper {
        +			if incX == 1 {
        +				for i := n - 1; i >= 0; i-- {
        +					kk := min(k, n-i-1)
        +					xi := x[i]
        +					for j, aij := range a[i*lda+1 : i*lda+kk+1] {
        +						x[i+j+1] += xi * aij
        +					}
        +					if diag == blas.NonUnit {
        +						x[i] *= a[i*lda]
        +					}
        +				}
        +			} else {
        +				ix := kx + (n-1)*incX
        +				for i := n - 1; i >= 0; i-- {
        +					kk := min(k, n-i-1)
        +					jx := ix + incX
        +					xi := x[ix]
        +					for _, aij := range a[i*lda+1 : i*lda+kk+1] {
        +						x[jx] += xi * aij
        +						jx += incX
        +					}
        +					if diag == blas.NonUnit {
        +						x[ix] *= a[i*lda]
        +					}
        +					ix -= incX
        +				}
        +			}
        +		} else {
        +			if incX == 1 {
        +				for i := 0; i < n; i++ {
        +					kk := min(k, i)
        +					xi := x[i]
        +					for j, aij := range a[i*lda+k-kk : i*lda+k] {
        +						x[i-kk+j] += xi * aij
        +					}
        +					if diag == blas.NonUnit {
        +						x[i] *= a[i*lda+k]
        +					}
        +				}
        +			} else {
        +				ix := kx
        +				for i := 0; i < n; i++ {
        +					kk := min(k, i)
        +					jx := ix - kk*incX
        +					xi := x[ix]
        +					for _, aij := range a[i*lda+k-kk : i*lda+k] {
        +						x[jx] += xi * aij
        +						jx += incX
        +					}
        +					if diag == blas.NonUnit {
        +						x[ix] *= a[i*lda+k]
        +					}
        +					ix += incX
        +				}
        +			}
        +		}
        +	case blas.ConjTrans:
        +		if uplo == blas.Upper {
        +			if incX == 1 {
        +				for i := n - 1; i >= 0; i-- {
        +					kk := min(k, n-i-1)
        +					xi := x[i]
        +					for j, aij := range a[i*lda+1 : i*lda+kk+1] {
        +						x[i+j+1] += xi * cmplx.Conj(aij)
        +					}
        +					if diag == blas.NonUnit {
        +						x[i] *= cmplx.Conj(a[i*lda])
        +					}
        +				}
        +			} else {
        +				ix := kx + (n-1)*incX
        +				for i := n - 1; i >= 0; i-- {
        +					kk := min(k, n-i-1)
        +					jx := ix + incX
        +					xi := x[ix]
        +					for _, aij := range a[i*lda+1 : i*lda+kk+1] {
        +						x[jx] += xi * cmplx.Conj(aij)
        +						jx += incX
        +					}
        +					if diag == blas.NonUnit {
        +						x[ix] *= cmplx.Conj(a[i*lda])
        +					}
        +					ix -= incX
        +				}
        +			}
        +		} else {
        +			if incX == 1 {
        +				for i := 0; i < n; i++ {
        +					kk := min(k, i)
        +					xi := x[i]
        +					for j, aij := range a[i*lda+k-kk : i*lda+k] {
        +						x[i-kk+j] += xi * cmplx.Conj(aij)
        +					}
        +					if diag == blas.NonUnit {
        +						x[i] *= cmplx.Conj(a[i*lda+k])
        +					}
        +				}
        +			} else {
        +				ix := kx
        +				for i := 0; i < n; i++ {
        +					kk := min(k, i)
        +					jx := ix - kk*incX
        +					xi := x[ix]
        +					for _, aij := range a[i*lda+k-kk : i*lda+k] {
        +						x[jx] += xi * cmplx.Conj(aij)
        +						jx += incX
        +					}
        +					if diag == blas.NonUnit {
        +						x[ix] *= cmplx.Conj(a[i*lda+k])
        +					}
        +					ix += incX
        +				}
        +			}
        +		}
        +	}
        +}
        +
        +// Ctbsv solves one of the systems of equations
        +//  A * x = b   if trans == blas.NoTrans
        +//  Aᵀ * x = b  if trans == blas.Trans
        +//  Aᴴ * x = b  if trans == blas.ConjTrans
        +// where b and x are n element vectors and A is an n×n triangular band matrix
        +// with (k+1) diagonals.
        +//
        +// On entry, x contains the values of b, and the solution is
        +// stored in-place into x.
        +//
        +// No test for singularity or near-singularity is included in this
        +// routine. Such tests must be performed before calling this routine.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Ctbsv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag, n, k int, a []complex64, lda int, x []complex64, incX int) {
        +	switch trans {
        +	default:
        +		panic(badTranspose)
        +	case blas.NoTrans, blas.Trans, blas.ConjTrans:
        +	}
        +	switch uplo {
        +	default:
        +		panic(badUplo)
        +	case blas.Upper, blas.Lower:
        +	}
        +	switch diag {
        +	default:
        +		panic(badDiag)
        +	case blas.NonUnit, blas.Unit:
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if k < 0 {
        +		panic(kLT0)
        +	}
        +	if lda < k+1 {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(n-1)+k+1 {
        +		panic(shortA)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +
        +	// Set up start index in X.
        +	var kx int
        +	if incX < 0 {
        +		kx = (1 - n) * incX
        +	}
        +
        +	switch trans {
        +	case blas.NoTrans:
        +		if uplo == blas.Upper {
        +			if incX == 1 {
        +				for i := n - 1; i >= 0; i-- {
        +					kk := min(k, n-i-1)
        +					var sum complex64
        +					for j, aij := range a[i*lda+1 : i*lda+kk+1] {
        +						sum += x[i+1+j] * aij
        +					}
        +					x[i] -= sum
        +					if diag == blas.NonUnit {
        +						x[i] /= a[i*lda]
        +					}
        +				}
        +			} else {
        +				ix := kx + (n-1)*incX
        +				for i := n - 1; i >= 0; i-- {
        +					kk := min(k, n-i-1)
        +					var sum complex64
        +					jx := ix + incX
        +					for _, aij := range a[i*lda+1 : i*lda+kk+1] {
        +						sum += x[jx] * aij
        +						jx += incX
        +					}
        +					x[ix] -= sum
        +					if diag == blas.NonUnit {
        +						x[ix] /= a[i*lda]
        +					}
        +					ix -= incX
        +				}
        +			}
        +		} else {
        +			if incX == 1 {
        +				for i := 0; i < n; i++ {
        +					kk := min(k, i)
        +					var sum complex64
        +					for j, aij := range a[i*lda+k-kk : i*lda+k] {
        +						sum += x[i-kk+j] * aij
        +					}
        +					x[i] -= sum
        +					if diag == blas.NonUnit {
        +						x[i] /= a[i*lda+k]
        +					}
        +				}
        +			} else {
        +				ix := kx
        +				for i := 0; i < n; i++ {
        +					kk := min(k, i)
        +					var sum complex64
        +					jx := ix - kk*incX
        +					for _, aij := range a[i*lda+k-kk : i*lda+k] {
        +						sum += x[jx] * aij
        +						jx += incX
        +					}
        +					x[ix] -= sum
        +					if diag == blas.NonUnit {
        +						x[ix] /= a[i*lda+k]
        +					}
        +					ix += incX
        +				}
        +			}
        +		}
        +	case blas.Trans:
        +		if uplo == blas.Upper {
        +			if incX == 1 {
        +				for i := 0; i < n; i++ {
        +					if diag == blas.NonUnit {
        +						x[i] /= a[i*lda]
        +					}
        +					kk := min(k, n-i-1)
        +					xi := x[i]
        +					for j, aij := range a[i*lda+1 : i*lda+kk+1] {
        +						x[i+1+j] -= xi * aij
        +					}
        +				}
        +			} else {
        +				ix := kx
        +				for i := 0; i < n; i++ {
        +					if diag == blas.NonUnit {
        +						x[ix] /= a[i*lda]
        +					}
        +					kk := min(k, n-i-1)
        +					xi := x[ix]
        +					jx := ix + incX
        +					for _, aij := range a[i*lda+1 : i*lda+kk+1] {
        +						x[jx] -= xi * aij
        +						jx += incX
        +					}
        +					ix += incX
        +				}
        +			}
        +		} else {
        +			if incX == 1 {
        +				for i := n - 1; i >= 0; i-- {
        +					if diag == blas.NonUnit {
        +						x[i] /= a[i*lda+k]
        +					}
        +					kk := min(k, i)
        +					xi := x[i]
        +					for j, aij := range a[i*lda+k-kk : i*lda+k] {
        +						x[i-kk+j] -= xi * aij
        +					}
        +				}
        +			} else {
        +				ix := kx + (n-1)*incX
        +				for i := n - 1; i >= 0; i-- {
        +					if diag == blas.NonUnit {
        +						x[ix] /= a[i*lda+k]
        +					}
        +					kk := min(k, i)
        +					xi := x[ix]
        +					jx := ix - kk*incX
        +					for _, aij := range a[i*lda+k-kk : i*lda+k] {
        +						x[jx] -= xi * aij
        +						jx += incX
        +					}
        +					ix -= incX
        +				}
        +			}
        +		}
        +	case blas.ConjTrans:
        +		if uplo == blas.Upper {
        +			if incX == 1 {
        +				for i := 0; i < n; i++ {
        +					if diag == blas.NonUnit {
        +						x[i] /= cmplx.Conj(a[i*lda])
        +					}
        +					kk := min(k, n-i-1)
        +					xi := x[i]
        +					for j, aij := range a[i*lda+1 : i*lda+kk+1] {
        +						x[i+1+j] -= xi * cmplx.Conj(aij)
        +					}
        +				}
        +			} else {
        +				ix := kx
        +				for i := 0; i < n; i++ {
        +					if diag == blas.NonUnit {
        +						x[ix] /= cmplx.Conj(a[i*lda])
        +					}
        +					kk := min(k, n-i-1)
        +					xi := x[ix]
        +					jx := ix + incX
        +					for _, aij := range a[i*lda+1 : i*lda+kk+1] {
        +						x[jx] -= xi * cmplx.Conj(aij)
        +						jx += incX
        +					}
        +					ix += incX
        +				}
        +			}
        +		} else {
        +			if incX == 1 {
        +				for i := n - 1; i >= 0; i-- {
        +					if diag == blas.NonUnit {
        +						x[i] /= cmplx.Conj(a[i*lda+k])
        +					}
        +					kk := min(k, i)
        +					xi := x[i]
        +					for j, aij := range a[i*lda+k-kk : i*lda+k] {
        +						x[i-kk+j] -= xi * cmplx.Conj(aij)
        +					}
        +				}
        +			} else {
        +				ix := kx + (n-1)*incX
        +				for i := n - 1; i >= 0; i-- {
        +					if diag == blas.NonUnit {
        +						x[ix] /= cmplx.Conj(a[i*lda+k])
        +					}
        +					kk := min(k, i)
        +					xi := x[ix]
        +					jx := ix - kk*incX
        +					for _, aij := range a[i*lda+k-kk : i*lda+k] {
        +						x[jx] -= xi * cmplx.Conj(aij)
        +						jx += incX
        +					}
        +					ix -= incX
        +				}
        +			}
        +		}
        +	}
        +}
        +
        +// Ctpmv performs one of the matrix-vector operations
        +//  x = A * x   if trans = blas.NoTrans
        +//  x = Aᵀ * x  if trans = blas.Trans
        +//  x = Aᴴ * x  if trans = blas.ConjTrans
        +// where x is an n element vector and A is an n×n triangular matrix, supplied in
        +// packed form.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Ctpmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag, n int, ap []complex64, x []complex64, incX int) {
        +	switch uplo {
        +	default:
        +		panic(badUplo)
        +	case blas.Upper, blas.Lower:
        +	}
        +	switch trans {
        +	default:
        +		panic(badTranspose)
        +	case blas.NoTrans, blas.Trans, blas.ConjTrans:
        +	}
        +	switch diag {
        +	default:
        +		panic(badDiag)
        +	case blas.NonUnit, blas.Unit:
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(ap) < n*(n+1)/2 {
        +		panic(shortAP)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +
        +	// Set up start index in X.
        +	var kx int
        +	if incX < 0 {
        +		kx = (1 - n) * incX
        +	}
        +
        +	// The elements of A are accessed sequentially with one pass through A.
        +
        +	if trans == blas.NoTrans {
        +		// Form x = A*x.
        +		if uplo == blas.Upper {
        +			// kk points to the current diagonal element in ap.
        +			kk := 0
        +			if incX == 1 {
        +				x = x[:n]
        +				for i := range x {
        +					if diag == blas.NonUnit {
        +						x[i] *= ap[kk]
        +					}
        +					if n-i-1 > 0 {
        +						x[i] += c64.DotuUnitary(ap[kk+1:kk+n-i], x[i+1:])
        +					}
        +					kk += n - i
        +				}
        +			} else {
        +				ix := kx
        +				for i := 0; i < n; i++ {
        +					if diag == blas.NonUnit {
        +						x[ix] *= ap[kk]
        +					}
        +					if n-i-1 > 0 {
        +						x[ix] += c64.DotuInc(ap[kk+1:kk+n-i], x, uintptr(n-i-1), 1, uintptr(incX), 0, uintptr(ix+incX))
        +					}
        +					ix += incX
        +					kk += n - i
        +				}
        +			}
        +		} else {
        +			// kk points to the beginning of current row in ap.
        +			kk := n*(n+1)/2 - n
        +			if incX == 1 {
        +				for i := n - 1; i >= 0; i-- {
        +					if diag == blas.NonUnit {
        +						x[i] *= ap[kk+i]
        +					}
        +					if i > 0 {
        +						x[i] += c64.DotuUnitary(ap[kk:kk+i], x[:i])
        +					}
        +					kk -= i
        +				}
        +			} else {
        +				ix := kx + (n-1)*incX
        +				for i := n - 1; i >= 0; i-- {
        +					if diag == blas.NonUnit {
        +						x[ix] *= ap[kk+i]
        +					}
        +					if i > 0 {
        +						x[ix] += c64.DotuInc(ap[kk:kk+i], x, uintptr(i), 1, uintptr(incX), 0, uintptr(kx))
        +					}
        +					ix -= incX
        +					kk -= i
        +				}
        +			}
        +		}
        +		return
        +	}
        +
        +	if trans == blas.Trans {
        +		// Form x = Aᵀ*x.
        +		if uplo == blas.Upper {
        +			// kk points to the current diagonal element in ap.
        +			kk := n*(n+1)/2 - 1
        +			if incX == 1 {
        +				for i := n - 1; i >= 0; i-- {
        +					xi := x[i]
        +					if diag == blas.NonUnit {
        +						x[i] *= ap[kk]
        +					}
        +					if n-i-1 > 0 {
        +						c64.AxpyUnitary(xi, ap[kk+1:kk+n-i], x[i+1:n])
        +					}
        +					kk -= n - i + 1
        +				}
        +			} else {
        +				ix := kx + (n-1)*incX
        +				for i := n - 1; i >= 0; i-- {
        +					xi := x[ix]
        +					if diag == blas.NonUnit {
        +						x[ix] *= ap[kk]
        +					}
        +					if n-i-1 > 0 {
        +						c64.AxpyInc(xi, ap[kk+1:kk+n-i], x, uintptr(n-i-1), 1, uintptr(incX), 0, uintptr(ix+incX))
        +					}
        +					ix -= incX
        +					kk -= n - i + 1
        +				}
        +			}
        +		} else {
        +			// kk points to the beginning of current row in ap.
        +			kk := 0
        +			if incX == 1 {
        +				x = x[:n]
        +				for i := range x {
        +					if i > 0 {
        +						c64.AxpyUnitary(x[i], ap[kk:kk+i], x[:i])
        +					}
        +					if diag == blas.NonUnit {
        +						x[i] *= ap[kk+i]
        +					}
        +					kk += i + 1
        +				}
        +			} else {
        +				ix := kx
        +				for i := 0; i < n; i++ {
        +					if i > 0 {
        +						c64.AxpyInc(x[ix], ap[kk:kk+i], x, uintptr(i), 1, uintptr(incX), 0, uintptr(kx))
        +					}
        +					if diag == blas.NonUnit {
        +						x[ix] *= ap[kk+i]
        +					}
        +					ix += incX
        +					kk += i + 1
        +				}
        +			}
        +		}
        +		return
        +	}
        +
        +	// Form x = Aᴴ*x.
        +	if uplo == blas.Upper {
        +		// kk points to the current diagonal element in ap.
        +		kk := n*(n+1)/2 - 1
        +		if incX == 1 {
        +			for i := n - 1; i >= 0; i-- {
        +				xi := x[i]
        +				if diag == blas.NonUnit {
        +					x[i] *= cmplx.Conj(ap[kk])
        +				}
        +				k := kk + 1
        +				for j := i + 1; j < n; j++ {
        +					x[j] += xi * cmplx.Conj(ap[k])
        +					k++
        +				}
        +				kk -= n - i + 1
        +			}
        +		} else {
        +			ix := kx + (n-1)*incX
        +			for i := n - 1; i >= 0; i-- {
        +				xi := x[ix]
        +				if diag == blas.NonUnit {
        +					x[ix] *= cmplx.Conj(ap[kk])
        +				}
        +				jx := ix + incX
        +				k := kk + 1
        +				for j := i + 1; j < n; j++ {
        +					x[jx] += xi * cmplx.Conj(ap[k])
        +					jx += incX
        +					k++
        +				}
        +				ix -= incX
        +				kk -= n - i + 1
        +			}
        +		}
        +	} else {
        +		// kk points to the beginning of current row in ap.
        +		kk := 0
        +		if incX == 1 {
        +			x = x[:n]
        +			for i, xi := range x {
        +				for j := 0; j < i; j++ {
        +					x[j] += xi * cmplx.Conj(ap[kk+j])
        +				}
        +				if diag == blas.NonUnit {
        +					x[i] *= cmplx.Conj(ap[kk+i])
        +				}
        +				kk += i + 1
        +			}
        +		} else {
        +			ix := kx
        +			for i := 0; i < n; i++ {
        +				xi := x[ix]
        +				jx := kx
        +				for j := 0; j < i; j++ {
        +					x[jx] += xi * cmplx.Conj(ap[kk+j])
        +					jx += incX
        +				}
        +				if diag == blas.NonUnit {
        +					x[ix] *= cmplx.Conj(ap[kk+i])
        +				}
        +				ix += incX
        +				kk += i + 1
        +			}
        +		}
        +	}
        +}
        +
        +// Ctpsv solves one of the systems of equations
        +//  A * x = b   if trans == blas.NoTrans
        +//  Aᵀ * x = b  if trans == blas.Trans
        +//  Aᴴ * x = b  if trans == blas.ConjTrans
        +// where b and x are n element vectors and A is an n×n triangular matrix in
        +// packed form.
        +//
        +// On entry, x contains the values of b, and the solution is
        +// stored in-place into x.
        +//
        +// No test for singularity or near-singularity is included in this
        +// routine. Such tests must be performed before calling this routine.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Ctpsv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag, n int, ap []complex64, x []complex64, incX int) {
        +	switch uplo {
        +	default:
        +		panic(badUplo)
        +	case blas.Upper, blas.Lower:
        +	}
        +	switch trans {
        +	default:
        +		panic(badTranspose)
        +	case blas.NoTrans, blas.Trans, blas.ConjTrans:
        +	}
        +	switch diag {
        +	default:
        +		panic(badDiag)
        +	case blas.NonUnit, blas.Unit:
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(ap) < n*(n+1)/2 {
        +		panic(shortAP)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +
        +	// Set up start index in X.
        +	var kx int
        +	if incX < 0 {
        +		kx = (1 - n) * incX
        +	}
        +
        +	// The elements of A are accessed sequentially with one pass through ap.
        +
        +	if trans == blas.NoTrans {
        +		// Form x = inv(A)*x.
        +		if uplo == blas.Upper {
        +			kk := n*(n+1)/2 - 1
        +			if incX == 1 {
        +				for i := n - 1; i >= 0; i-- {
        +					aii := ap[kk]
        +					if n-i-1 > 0 {
        +						x[i] -= c64.DotuUnitary(x[i+1:n], ap[kk+1:kk+n-i])
        +					}
        +					if diag == blas.NonUnit {
        +						x[i] /= aii
        +					}
        +					kk -= n - i + 1
        +				}
        +			} else {
        +				ix := kx + (n-1)*incX
        +				for i := n - 1; i >= 0; i-- {
        +					aii := ap[kk]
        +					if n-i-1 > 0 {
        +						x[ix] -= c64.DotuInc(x, ap[kk+1:kk+n-i], uintptr(n-i-1), uintptr(incX), 1, uintptr(ix+incX), 0)
        +					}
        +					if diag == blas.NonUnit {
        +						x[ix] /= aii
        +					}
        +					ix -= incX
        +					kk -= n - i + 1
        +				}
        +			}
        +		} else {
        +			kk := 0
        +			if incX == 1 {
        +				for i := 0; i < n; i++ {
        +					if i > 0 {
        +						x[i] -= c64.DotuUnitary(x[:i], ap[kk:kk+i])
        +					}
        +					if diag == blas.NonUnit {
        +						x[i] /= ap[kk+i]
        +					}
        +					kk += i + 1
        +				}
        +			} else {
        +				ix := kx
        +				for i := 0; i < n; i++ {
        +					if i > 0 {
        +						x[ix] -= c64.DotuInc(x, ap[kk:kk+i], uintptr(i), uintptr(incX), 1, uintptr(kx), 0)
        +					}
        +					if diag == blas.NonUnit {
        +						x[ix] /= ap[kk+i]
        +					}
        +					ix += incX
        +					kk += i + 1
        +				}
        +			}
        +		}
        +		return
        +	}
        +
        +	if trans == blas.Trans {
        +		// Form x = inv(Aᵀ)*x.
        +		if uplo == blas.Upper {
        +			kk := 0
        +			if incX == 1 {
        +				for j := 0; j < n; j++ {
        +					if diag == blas.NonUnit {
        +						x[j] /= ap[kk]
        +					}
        +					if n-j-1 > 0 {
        +						c64.AxpyUnitary(-x[j], ap[kk+1:kk+n-j], x[j+1:n])
        +					}
        +					kk += n - j
        +				}
        +			} else {
        +				jx := kx
        +				for j := 0; j < n; j++ {
        +					if diag == blas.NonUnit {
        +						x[jx] /= ap[kk]
        +					}
        +					if n-j-1 > 0 {
        +						c64.AxpyInc(-x[jx], ap[kk+1:kk+n-j], x, uintptr(n-j-1), 1, uintptr(incX), 0, uintptr(jx+incX))
        +					}
        +					jx += incX
        +					kk += n - j
        +				}
        +			}
        +		} else {
        +			kk := n*(n+1)/2 - n
        +			if incX == 1 {
        +				for j := n - 1; j >= 0; j-- {
        +					if diag == blas.NonUnit {
        +						x[j] /= ap[kk+j]
        +					}
        +					if j > 0 {
        +						c64.AxpyUnitary(-x[j], ap[kk:kk+j], x[:j])
        +					}
        +					kk -= j
        +				}
        +			} else {
        +				jx := kx + (n-1)*incX
        +				for j := n - 1; j >= 0; j-- {
        +					if diag == blas.NonUnit {
        +						x[jx] /= ap[kk+j]
        +					}
        +					if j > 0 {
        +						c64.AxpyInc(-x[jx], ap[kk:kk+j], x, uintptr(j), 1, uintptr(incX), 0, uintptr(kx))
        +					}
        +					jx -= incX
        +					kk -= j
        +				}
        +			}
        +		}
        +		return
        +	}
        +
        +	// Form x = inv(Aᴴ)*x.
        +	if uplo == blas.Upper {
        +		kk := 0
        +		if incX == 1 {
        +			for j := 0; j < n; j++ {
        +				if diag == blas.NonUnit {
        +					x[j] /= cmplx.Conj(ap[kk])
        +				}
        +				xj := x[j]
        +				k := kk + 1
        +				for i := j + 1; i < n; i++ {
        +					x[i] -= xj * cmplx.Conj(ap[k])
        +					k++
        +				}
        +				kk += n - j
        +			}
        +		} else {
        +			jx := kx
        +			for j := 0; j < n; j++ {
        +				if diag == blas.NonUnit {
        +					x[jx] /= cmplx.Conj(ap[kk])
        +				}
        +				xj := x[jx]
        +				ix := jx + incX
        +				k := kk + 1
        +				for i := j + 1; i < n; i++ {
        +					x[ix] -= xj * cmplx.Conj(ap[k])
        +					ix += incX
        +					k++
        +				}
        +				jx += incX
        +				kk += n - j
        +			}
        +		}
        +	} else {
        +		kk := n*(n+1)/2 - n
        +		if incX == 1 {
        +			for j := n - 1; j >= 0; j-- {
        +				if diag == blas.NonUnit {
        +					x[j] /= cmplx.Conj(ap[kk+j])
        +				}
        +				xj := x[j]
        +				for i := 0; i < j; i++ {
        +					x[i] -= xj * cmplx.Conj(ap[kk+i])
        +				}
        +				kk -= j
        +			}
        +		} else {
        +			jx := kx + (n-1)*incX
        +			for j := n - 1; j >= 0; j-- {
        +				if diag == blas.NonUnit {
        +					x[jx] /= cmplx.Conj(ap[kk+j])
        +				}
        +				xj := x[jx]
        +				ix := kx
        +				for i := 0; i < j; i++ {
        +					x[ix] -= xj * cmplx.Conj(ap[kk+i])
        +					ix += incX
        +				}
        +				jx -= incX
        +				kk -= j
        +			}
        +		}
        +	}
        +}
        +
        +// Ctrmv performs one of the matrix-vector operations
        +//  x = A * x   if trans = blas.NoTrans
        +//  x = Aᵀ * x  if trans = blas.Trans
        +//  x = Aᴴ * x  if trans = blas.ConjTrans
        +// where x is a vector, and A is an n×n triangular matrix.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Ctrmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag, n int, a []complex64, lda int, x []complex64, incX int) {
        +	switch trans {
        +	default:
        +		panic(badTranspose)
        +	case blas.NoTrans, blas.Trans, blas.ConjTrans:
        +	}
        +	switch uplo {
        +	default:
        +		panic(badUplo)
        +	case blas.Upper, blas.Lower:
        +	}
        +	switch diag {
        +	default:
        +		panic(badDiag)
        +	case blas.NonUnit, blas.Unit:
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(n-1)+n {
        +		panic(shortA)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +
        +	// Set up start index in X.
        +	var kx int
        +	if incX < 0 {
        +		kx = (1 - n) * incX
        +	}
        +
        +	// The elements of A are accessed sequentially with one pass through A.
        +
        +	if trans == blas.NoTrans {
        +		// Form x = A*x.
        +		if uplo == blas.Upper {
        +			if incX == 1 {
        +				for i := 0; i < n; i++ {
        +					if diag == blas.NonUnit {
        +						x[i] *= a[i*lda+i]
        +					}
        +					if n-i-1 > 0 {
        +						x[i] += c64.DotuUnitary(a[i*lda+i+1:i*lda+n], x[i+1:n])
        +					}
        +				}
        +			} else {
        +				ix := kx
        +				for i := 0; i < n; i++ {
        +					if diag == blas.NonUnit {
        +						x[ix] *= a[i*lda+i]
        +					}
        +					if n-i-1 > 0 {
        +						x[ix] += c64.DotuInc(a[i*lda+i+1:i*lda+n], x, uintptr(n-i-1), 1, uintptr(incX), 0, uintptr(ix+incX))
        +					}
        +					ix += incX
        +				}
        +			}
        +		} else {
        +			if incX == 1 {
        +				for i := n - 1; i >= 0; i-- {
        +					if diag == blas.NonUnit {
        +						x[i] *= a[i*lda+i]
        +					}
        +					if i > 0 {
        +						x[i] += c64.DotuUnitary(a[i*lda:i*lda+i], x[:i])
        +					}
        +				}
        +			} else {
        +				ix := kx + (n-1)*incX
        +				for i := n - 1; i >= 0; i-- {
        +					if diag == blas.NonUnit {
        +						x[ix] *= a[i*lda+i]
        +					}
        +					if i > 0 {
        +						x[ix] += c64.DotuInc(a[i*lda:i*lda+i], x, uintptr(i), 1, uintptr(incX), 0, uintptr(kx))
        +					}
        +					ix -= incX
        +				}
        +			}
        +		}
        +		return
        +	}
        +
        +	if trans == blas.Trans {
        +		// Form x = Aᵀ*x.
        +		if uplo == blas.Upper {
        +			if incX == 1 {
        +				for i := n - 1; i >= 0; i-- {
        +					xi := x[i]
        +					if diag == blas.NonUnit {
        +						x[i] *= a[i*lda+i]
        +					}
        +					if n-i-1 > 0 {
        +						c64.AxpyUnitary(xi, a[i*lda+i+1:i*lda+n], x[i+1:n])
        +					}
        +				}
        +			} else {
        +				ix := kx + (n-1)*incX
        +				for i := n - 1; i >= 0; i-- {
        +					xi := x[ix]
        +					if diag == blas.NonUnit {
        +						x[ix] *= a[i*lda+i]
        +					}
        +					if n-i-1 > 0 {
        +						c64.AxpyInc(xi, a[i*lda+i+1:i*lda+n], x, uintptr(n-i-1), 1, uintptr(incX), 0, uintptr(ix+incX))
        +					}
        +					ix -= incX
        +				}
        +			}
        +		} else {
        +			if incX == 1 {
        +				for i := 0; i < n; i++ {
        +					if i > 0 {
        +						c64.AxpyUnitary(x[i], a[i*lda:i*lda+i], x[:i])
        +					}
        +					if diag == blas.NonUnit {
        +						x[i] *= a[i*lda+i]
        +					}
        +				}
        +			} else {
        +				ix := kx
        +				for i := 0; i < n; i++ {
        +					if i > 0 {
        +						c64.AxpyInc(x[ix], a[i*lda:i*lda+i], x, uintptr(i), 1, uintptr(incX), 0, uintptr(kx))
        +					}
        +					if diag == blas.NonUnit {
        +						x[ix] *= a[i*lda+i]
        +					}
        +					ix += incX
        +				}
        +			}
        +		}
        +		return
        +	}
        +
        +	// Form x = Aᴴ*x.
        +	if uplo == blas.Upper {
        +		if incX == 1 {
        +			for i := n - 1; i >= 0; i-- {
        +				xi := x[i]
        +				if diag == blas.NonUnit {
        +					x[i] *= cmplx.Conj(a[i*lda+i])
        +				}
        +				for j := i + 1; j < n; j++ {
        +					x[j] += xi * cmplx.Conj(a[i*lda+j])
        +				}
        +			}
        +		} else {
        +			ix := kx + (n-1)*incX
        +			for i := n - 1; i >= 0; i-- {
        +				xi := x[ix]
        +				if diag == blas.NonUnit {
        +					x[ix] *= cmplx.Conj(a[i*lda+i])
        +				}
        +				jx := ix + incX
        +				for j := i + 1; j < n; j++ {
        +					x[jx] += xi * cmplx.Conj(a[i*lda+j])
        +					jx += incX
        +				}
        +				ix -= incX
        +			}
        +		}
        +	} else {
        +		if incX == 1 {
        +			for i := 0; i < n; i++ {
        +				for j := 0; j < i; j++ {
        +					x[j] += x[i] * cmplx.Conj(a[i*lda+j])
        +				}
        +				if diag == blas.NonUnit {
        +					x[i] *= cmplx.Conj(a[i*lda+i])
        +				}
        +			}
        +		} else {
        +			ix := kx
        +			for i := 0; i < n; i++ {
        +				jx := kx
        +				for j := 0; j < i; j++ {
        +					x[jx] += x[ix] * cmplx.Conj(a[i*lda+j])
        +					jx += incX
        +				}
        +				if diag == blas.NonUnit {
        +					x[ix] *= cmplx.Conj(a[i*lda+i])
        +				}
        +				ix += incX
        +			}
        +		}
        +	}
        +}
        +
        +// Ctrsv solves one of the systems of equations
        +//  A * x = b   if trans == blas.NoTrans
        +//  Aᵀ * x = b  if trans == blas.Trans
        +//  Aᴴ * x = b  if trans == blas.ConjTrans
        +// where b and x are n element vectors and A is an n×n triangular matrix.
        +//
        +// On entry, x contains the values of b, and the solution is
        +// stored in-place into x.
        +//
        +// No test for singularity or near-singularity is included in this
        +// routine. Such tests must be performed before calling this routine.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Ctrsv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag, n int, a []complex64, lda int, x []complex64, incX int) {
        +	switch trans {
        +	default:
        +		panic(badTranspose)
        +	case blas.NoTrans, blas.Trans, blas.ConjTrans:
        +	}
        +	switch uplo {
        +	default:
        +		panic(badUplo)
        +	case blas.Upper, blas.Lower:
        +	}
        +	switch diag {
        +	default:
        +		panic(badDiag)
        +	case blas.NonUnit, blas.Unit:
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(n-1)+n {
        +		panic(shortA)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +
        +	// Set up start index in X.
        +	var kx int
        +	if incX < 0 {
        +		kx = (1 - n) * incX
        +	}
        +
        +	// The elements of A are accessed sequentially with one pass through A.
        +
        +	if trans == blas.NoTrans {
        +		// Form x = inv(A)*x.
        +		if uplo == blas.Upper {
        +			if incX == 1 {
        +				for i := n - 1; i >= 0; i-- {
        +					aii := a[i*lda+i]
        +					if n-i-1 > 0 {
        +						x[i] -= c64.DotuUnitary(x[i+1:n], a[i*lda+i+1:i*lda+n])
        +					}
        +					if diag == blas.NonUnit {
        +						x[i] /= aii
        +					}
        +				}
        +			} else {
        +				ix := kx + (n-1)*incX
        +				for i := n - 1; i >= 0; i-- {
        +					aii := a[i*lda+i]
        +					if n-i-1 > 0 {
        +						x[ix] -= c64.DotuInc(x, a[i*lda+i+1:i*lda+n], uintptr(n-i-1), uintptr(incX), 1, uintptr(ix+incX), 0)
        +					}
        +					if diag == blas.NonUnit {
        +						x[ix] /= aii
        +					}
        +					ix -= incX
        +				}
        +			}
        +		} else {
        +			if incX == 1 {
        +				for i := 0; i < n; i++ {
        +					if i > 0 {
        +						x[i] -= c64.DotuUnitary(x[:i], a[i*lda:i*lda+i])
        +					}
        +					if diag == blas.NonUnit {
        +						x[i] /= a[i*lda+i]
        +					}
        +				}
        +			} else {
        +				ix := kx
        +				for i := 0; i < n; i++ {
        +					if i > 0 {
        +						x[ix] -= c64.DotuInc(x, a[i*lda:i*lda+i], uintptr(i), uintptr(incX), 1, uintptr(kx), 0)
        +					}
        +					if diag == blas.NonUnit {
        +						x[ix] /= a[i*lda+i]
        +					}
        +					ix += incX
        +				}
        +			}
        +		}
        +		return
        +	}
        +
        +	if trans == blas.Trans {
        +		// Form x = inv(Aᵀ)*x.
        +		if uplo == blas.Upper {
        +			if incX == 1 {
        +				for j := 0; j < n; j++ {
        +					if diag == blas.NonUnit {
        +						x[j] /= a[j*lda+j]
        +					}
        +					if n-j-1 > 0 {
        +						c64.AxpyUnitary(-x[j], a[j*lda+j+1:j*lda+n], x[j+1:n])
        +					}
        +				}
        +			} else {
        +				jx := kx
        +				for j := 0; j < n; j++ {
        +					if diag == blas.NonUnit {
        +						x[jx] /= a[j*lda+j]
        +					}
        +					if n-j-1 > 0 {
        +						c64.AxpyInc(-x[jx], a[j*lda+j+1:j*lda+n], x, uintptr(n-j-1), 1, uintptr(incX), 0, uintptr(jx+incX))
        +					}
        +					jx += incX
        +				}
        +			}
        +		} else {
        +			if incX == 1 {
        +				for j := n - 1; j >= 0; j-- {
        +					if diag == blas.NonUnit {
        +						x[j] /= a[j*lda+j]
        +					}
        +					xj := x[j]
        +					if j > 0 {
        +						c64.AxpyUnitary(-xj, a[j*lda:j*lda+j], x[:j])
        +					}
        +				}
        +			} else {
        +				jx := kx + (n-1)*incX
        +				for j := n - 1; j >= 0; j-- {
        +					if diag == blas.NonUnit {
        +						x[jx] /= a[j*lda+j]
        +					}
        +					if j > 0 {
        +						c64.AxpyInc(-x[jx], a[j*lda:j*lda+j], x, uintptr(j), 1, uintptr(incX), 0, uintptr(kx))
        +					}
        +					jx -= incX
        +				}
        +			}
        +		}
        +		return
        +	}
        +
        +	// Form x = inv(Aᴴ)*x.
        +	if uplo == blas.Upper {
        +		if incX == 1 {
        +			for j := 0; j < n; j++ {
        +				if diag == blas.NonUnit {
        +					x[j] /= cmplx.Conj(a[j*lda+j])
        +				}
        +				xj := x[j]
        +				for i := j + 1; i < n; i++ {
        +					x[i] -= xj * cmplx.Conj(a[j*lda+i])
        +				}
        +			}
        +		} else {
        +			jx := kx
        +			for j := 0; j < n; j++ {
        +				if diag == blas.NonUnit {
        +					x[jx] /= cmplx.Conj(a[j*lda+j])
        +				}
        +				xj := x[jx]
        +				ix := jx + incX
        +				for i := j + 1; i < n; i++ {
        +					x[ix] -= xj * cmplx.Conj(a[j*lda+i])
        +					ix += incX
        +				}
        +				jx += incX
        +			}
        +		}
        +	} else {
        +		if incX == 1 {
        +			for j := n - 1; j >= 0; j-- {
        +				if diag == blas.NonUnit {
        +					x[j] /= cmplx.Conj(a[j*lda+j])
        +				}
        +				xj := x[j]
        +				for i := 0; i < j; i++ {
        +					x[i] -= xj * cmplx.Conj(a[j*lda+i])
        +				}
        +			}
        +		} else {
        +			jx := kx + (n-1)*incX
        +			for j := n - 1; j >= 0; j-- {
        +				if diag == blas.NonUnit {
        +					x[jx] /= cmplx.Conj(a[j*lda+j])
        +				}
        +				xj := x[jx]
        +				ix := kx
        +				for i := 0; i < j; i++ {
        +					x[ix] -= xj * cmplx.Conj(a[j*lda+i])
        +					ix += incX
        +				}
        +				jx -= incX
        +			}
        +		}
        +	}
        +}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/level2double.go b/vendor/gonum.org/v1/gonum/blas/gonum/level2double.go
        deleted file mode 100644
        index ce5f9ed16..000000000
        --- a/vendor/gonum.org/v1/gonum/blas/gonum/level2double.go
        +++ /dev/null
        @@ -1,2070 +0,0 @@
        -// Copyright ©2014 The Gonum Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package gonum
        -
        -import (
        -	"gonum.org/v1/gonum/blas"
        -	"gonum.org/v1/gonum/internal/asm/f64"
        -)
        -
        -var _ blas.Float64Level2 = Implementation{}
        -
        -// Dger performs the rank-one operation
        -//  A += alpha * x * y^T
        -// where A is an m×n dense matrix, x and y are vectors, and alpha is a scalar.
        -func (Implementation) Dger(m, n int, alpha float64, x []float64, incX int, y []float64, incY int, a []float64, lda int) {
        -	// Check inputs
        -	if m < 0 {
        -		panic("m < 0")
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	if (incX > 0 && (m-1)*incX >= len(x)) || (incX < 0 && (1-m)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        -		panic(badY)
        -	}
        -	if lda*(m-1)+n > len(a) || lda < max(1, n) {
        -		panic(badLdA)
        -	}
        -	if lda < max(1, n) {
        -		panic(badLdA)
        -	}
        -
        -	// Quick return if possible
        -	if m == 0 || n == 0 || alpha == 0 {
        -		return
        -	}
        -	f64.Ger(uintptr(m), uintptr(n),
        -		alpha,
        -		x, uintptr(incX),
        -		y, uintptr(incY),
        -		a, uintptr(lda))
        -}
        -
        -// Dgbmv performs one of the matrix-vector operations
        -//  y = alpha * A * x + beta * y    if tA == blas.NoTrans
        -//  y = alpha * A^T * x + beta * y  if tA == blas.Trans or blas.ConjTrans
        -// where A is an m×n band matrix with kL sub-diagonals and kU super-diagonals,
        -// x and y are vectors, and alpha and beta are scalars.
        -func (Implementation) Dgbmv(tA blas.Transpose, m, n, kL, kU int, alpha float64, a []float64, lda int, x []float64, incX int, beta float64, y []float64, incY int) {
        -	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        -		panic(badTranspose)
        -	}
        -	if m < 0 {
        -		panic(mLT0)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if kL < 0 {
        -		panic(kLLT0)
        -	}
        -	if kL < 0 {
        -		panic(kULT0)
        -	}
        -	if lda < kL+kU+1 {
        -		panic(badLdA)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	// Set up indexes
        -	lenX := m
        -	lenY := n
        -	if tA == blas.NoTrans {
        -		lenX = n
        -		lenY = m
        -	}
        -	if (incX > 0 && (lenX-1)*incX >= len(x)) || (incX < 0 && (1-lenX)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if (incY > 0 && (lenY-1)*incY >= len(y)) || (incY < 0 && (1-lenY)*incY >= len(y)) {
        -		panic(badY)
        -	}
        -	if lda*(min(m, n+kL)-1)+kL+kU+1 > len(a) || lda < kL+kU+1 {
        -		panic(badLdA)
        -	}
        -
        -	// Quick return if possible
        -	if m == 0 || n == 0 || (alpha == 0 && beta == 1) {
        -		return
        -	}
        -
        -	var kx, ky int
        -	if incX < 0 {
        -		kx = -(lenX - 1) * incX
        -	}
        -	if incY < 0 {
        -		ky = -(lenY - 1) * incY
        -	}
        -
        -	// First form y = beta * y
        -	if incY > 0 {
        -		Implementation{}.Dscal(lenY, beta, y, incY)
        -	} else {
        -		Implementation{}.Dscal(lenY, beta, y, -incY)
        -	}
        -
        -	if alpha == 0 {
        -		return
        -	}
        -
        -	// i and j are indices of the compacted banded matrix.
        -	// off is the offset into the dense matrix (off + j = densej)
        -	nCol := kU + 1 + kL
        -	if tA == blas.NoTrans {
        -		iy := ky
        -		if incX == 1 {
        -			for i := 0; i < min(m, n+kL); i++ {
        -				l := max(0, kL-i)
        -				u := min(nCol, n+kL-i)
        -				off := max(0, i-kL)
        -				atmp := a[i*lda+l : i*lda+u]
        -				xtmp := x[off : off+u-l]
        -				var sum float64
        -				for j, v := range atmp {
        -					sum += xtmp[j] * v
        -				}
        -				y[iy] += sum * alpha
        -				iy += incY
        -			}
        -			return
        -		}
        -		for i := 0; i < min(m, n+kL); i++ {
        -			l := max(0, kL-i)
        -			u := min(nCol, n+kL-i)
        -			off := max(0, i-kL)
        -			atmp := a[i*lda+l : i*lda+u]
        -			jx := kx
        -			var sum float64
        -			for _, v := range atmp {
        -				sum += x[off*incX+jx] * v
        -				jx += incX
        -			}
        -			y[iy] += sum * alpha
        -			iy += incY
        -		}
        -		return
        -	}
        -	if incX == 1 {
        -		for i := 0; i < min(m, n+kL); i++ {
        -			l := max(0, kL-i)
        -			u := min(nCol, n+kL-i)
        -			off := max(0, i-kL)
        -			atmp := a[i*lda+l : i*lda+u]
        -			tmp := alpha * x[i]
        -			jy := ky
        -			for _, v := range atmp {
        -				y[jy+off*incY] += tmp * v
        -				jy += incY
        -			}
        -		}
        -		return
        -	}
        -	ix := kx
        -	for i := 0; i < min(m, n+kL); i++ {
        -		l := max(0, kL-i)
        -		u := min(nCol, n+kL-i)
        -		off := max(0, i-kL)
        -		atmp := a[i*lda+l : i*lda+u]
        -		tmp := alpha * x[ix]
        -		jy := ky
        -		for _, v := range atmp {
        -			y[jy+off*incY] += tmp * v
        -			jy += incY
        -		}
        -		ix += incX
        -	}
        -}
        -
        -// Dtrmv performs one of the matrix-vector operations
        -//  x = A * x    if tA == blas.NoTrans
        -//  x = A^T * x  if tA == blas.Trans or blas.ConjTrans
        -// where A is an n×n triangular matrix, and x is a vector.
        -func (Implementation) Dtrmv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, a []float64, lda int, x []float64, incX int) {
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        -		panic(badTranspose)
        -	}
        -	if d != blas.NonUnit && d != blas.Unit {
        -		panic(badDiag)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if lda < n {
        -		panic(badLdA)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if lda*(n-1)+n > len(a) || lda < max(1, n) {
        -		panic(badLdA)
        -	}
        -	if n == 0 {
        -		return
        -	}
        -	nonUnit := d != blas.Unit
        -	if n == 1 {
        -		if nonUnit {
        -			x[0] *= a[0]
        -		}
        -		return
        -	}
        -	var kx int
        -	if incX <= 0 {
        -		kx = -(n - 1) * incX
        -	}
        -	if tA == blas.NoTrans {
        -		if ul == blas.Upper {
        -			if incX == 1 {
        -				for i := 0; i < n; i++ {
        -					ilda := i * lda
        -					var tmp float64
        -					if nonUnit {
        -						tmp = a[ilda+i] * x[i]
        -					} else {
        -						tmp = x[i]
        -					}
        -					xtmp := x[i+1:]
        -					x[i] = tmp + f64.DotUnitary(a[ilda+i+1:ilda+n], xtmp)
        -				}
        -				return
        -			}
        -			ix := kx
        -			for i := 0; i < n; i++ {
        -				ilda := i * lda
        -				var tmp float64
        -				if nonUnit {
        -					tmp = a[ilda+i] * x[ix]
        -				} else {
        -					tmp = x[ix]
        -				}
        -				x[ix] = tmp + f64.DotInc(x, a[ilda+i+1:ilda+n], uintptr(n-i-1), uintptr(incX), 1, uintptr(ix+incX), 0)
        -				ix += incX
        -			}
        -			return
        -		}
        -		if incX == 1 {
        -			for i := n - 1; i >= 0; i-- {
        -				ilda := i * lda
        -				var tmp float64
        -				if nonUnit {
        -					tmp += a[ilda+i] * x[i]
        -				} else {
        -					tmp = x[i]
        -				}
        -				x[i] = tmp + f64.DotUnitary(a[ilda:ilda+i], x)
        -			}
        -			return
        -		}
        -		ix := kx + (n-1)*incX
        -		for i := n - 1; i >= 0; i-- {
        -			ilda := i * lda
        -			var tmp float64
        -			if nonUnit {
        -				tmp = a[ilda+i] * x[ix]
        -			} else {
        -				tmp = x[ix]
        -			}
        -			x[ix] = tmp + f64.DotInc(x, a[ilda:ilda+i], uintptr(i), uintptr(incX), 1, uintptr(kx), 0)
        -			ix -= incX
        -		}
        -		return
        -	}
        -	// Cases where a is transposed.
        -	if ul == blas.Upper {
        -		if incX == 1 {
        -			for i := n - 1; i >= 0; i-- {
        -				ilda := i * lda
        -				xi := x[i]
        -				f64.AxpyUnitary(xi, a[ilda+i+1:ilda+n], x[i+1:n])
        -				if nonUnit {
        -					x[i] *= a[ilda+i]
        -				}
        -			}
        -			return
        -		}
        -		ix := kx + (n-1)*incX
        -		for i := n - 1; i >= 0; i-- {
        -			ilda := i * lda
        -			xi := x[ix]
        -			f64.AxpyInc(xi, a[ilda+i+1:ilda+n], x, uintptr(n-i-1), 1, uintptr(incX), 0, uintptr(kx+(i+1)*incX))
        -			if nonUnit {
        -				x[ix] *= a[ilda+i]
        -			}
        -			ix -= incX
        -		}
        -		return
        -	}
        -	if incX == 1 {
        -		for i := 0; i < n; i++ {
        -			ilda := i * lda
        -			xi := x[i]
        -			f64.AxpyUnitary(xi, a[ilda:ilda+i], x)
        -			if nonUnit {
        -				x[i] *= a[i*lda+i]
        -			}
        -		}
        -		return
        -	}
        -	ix := kx
        -	for i := 0; i < n; i++ {
        -		ilda := i * lda
        -		xi := x[ix]
        -		f64.AxpyInc(xi, a[ilda:ilda+i], x, uintptr(i), 1, uintptr(incX), 0, uintptr(kx))
        -		if nonUnit {
        -			x[ix] *= a[ilda+i]
        -		}
        -		ix += incX
        -	}
        -}
        -
        -// Dtrsv solves one of the systems of equations
        -//  A * x = b    if tA == blas.NoTrans
        -//  A^T * x = b  if tA == blas.Trans or blas.ConjTrans
        -// where A is an n×n triangular matrix, and x and b are vectors.
        -//
        -// At entry to the function, x contains the values of b, and the result is
        -// stored in-place into x.
        -//
        -// No test for singularity or near-singularity is included in this
        -// routine. Such tests must be performed before calling this routine.
        -func (Implementation) Dtrsv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, a []float64, lda int, x []float64, incX int) {
        -	// Test the input parameters
        -	// Verify inputs
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        -		panic(badTranspose)
        -	}
        -	if d != blas.NonUnit && d != blas.Unit {
        -		panic(badDiag)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if lda*(n-1)+n > len(a) || lda < max(1, n) {
        -		panic(badLdA)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	// Quick return if possible
        -	if n == 0 {
        -		return
        -	}
        -	if n == 1 {
        -		if d == blas.NonUnit {
        -			x[0] /= a[0]
        -		}
        -		return
        -	}
        -
        -	var kx int
        -	if incX < 0 {
        -		kx = -(n - 1) * incX
        -	}
        -	nonUnit := d == blas.NonUnit
        -	if tA == blas.NoTrans {
        -		if ul == blas.Upper {
        -			if incX == 1 {
        -				for i := n - 1; i >= 0; i-- {
        -					var sum float64
        -					atmp := a[i*lda+i+1 : i*lda+n]
        -					for j, v := range atmp {
        -						jv := i + j + 1
        -						sum += x[jv] * v
        -					}
        -					x[i] -= sum
        -					if nonUnit {
        -						x[i] /= a[i*lda+i]
        -					}
        -				}
        -				return
        -			}
        -			ix := kx + (n-1)*incX
        -			for i := n - 1; i >= 0; i-- {
        -				var sum float64
        -				jx := ix + incX
        -				atmp := a[i*lda+i+1 : i*lda+n]
        -				for _, v := range atmp {
        -					sum += x[jx] * v
        -					jx += incX
        -				}
        -				x[ix] -= sum
        -				if nonUnit {
        -					x[ix] /= a[i*lda+i]
        -				}
        -				ix -= incX
        -			}
        -			return
        -		}
        -		if incX == 1 {
        -			for i := 0; i < n; i++ {
        -				var sum float64
        -				atmp := a[i*lda : i*lda+i]
        -				for j, v := range atmp {
        -					sum += x[j] * v
        -				}
        -				x[i] -= sum
        -				if nonUnit {
        -					x[i] /= a[i*lda+i]
        -				}
        -			}
        -			return
        -		}
        -		ix := kx
        -		for i := 0; i < n; i++ {
        -			jx := kx
        -			var sum float64
        -			atmp := a[i*lda : i*lda+i]
        -			for _, v := range atmp {
        -				sum += x[jx] * v
        -				jx += incX
        -			}
        -			x[ix] -= sum
        -			if nonUnit {
        -				x[ix] /= a[i*lda+i]
        -			}
        -			ix += incX
        -		}
        -		return
        -	}
        -	// Cases where a is transposed.
        -	if ul == blas.Upper {
        -		if incX == 1 {
        -			for i := 0; i < n; i++ {
        -				if nonUnit {
        -					x[i] /= a[i*lda+i]
        -				}
        -				xi := x[i]
        -				atmp := a[i*lda+i+1 : i*lda+n]
        -				for j, v := range atmp {
        -					jv := j + i + 1
        -					x[jv] -= v * xi
        -				}
        -			}
        -			return
        -		}
        -		ix := kx
        -		for i := 0; i < n; i++ {
        -			if nonUnit {
        -				x[ix] /= a[i*lda+i]
        -			}
        -			xi := x[ix]
        -			jx := kx + (i+1)*incX
        -			atmp := a[i*lda+i+1 : i*lda+n]
        -			for _, v := range atmp {
        -				x[jx] -= v * xi
        -				jx += incX
        -			}
        -			ix += incX
        -		}
        -		return
        -	}
        -	if incX == 1 {
        -		for i := n - 1; i >= 0; i-- {
        -			if nonUnit {
        -				x[i] /= a[i*lda+i]
        -			}
        -			xi := x[i]
        -			atmp := a[i*lda : i*lda+i]
        -			for j, v := range atmp {
        -				x[j] -= v * xi
        -			}
        -		}
        -		return
        -	}
        -	ix := kx + (n-1)*incX
        -	for i := n - 1; i >= 0; i-- {
        -		if nonUnit {
        -			x[ix] /= a[i*lda+i]
        -		}
        -		xi := x[ix]
        -		jx := kx
        -		atmp := a[i*lda : i*lda+i]
        -		for _, v := range atmp {
        -			x[jx] -= v * xi
        -			jx += incX
        -		}
        -		ix -= incX
        -	}
        -}
        -
        -// Dsymv performs the matrix-vector operation
        -//  y = alpha * A * x + beta * y
        -// where A is an n×n symmetric matrix, x and y are vectors, and alpha and
        -// beta are scalars.
        -func (Implementation) Dsymv(ul blas.Uplo, n int, alpha float64, a []float64, lda int, x []float64, incX int, beta float64, y []float64, incY int) {
        -	// Check inputs
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if lda > 1 && lda < n {
        -		panic(badLdA)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        -		panic(badY)
        -	}
        -	if lda*(n-1)+n > len(a) || lda < max(1, n) {
        -		panic(badLdA)
        -	}
        -	// Quick return if possible
        -	if n == 0 || (alpha == 0 && beta == 1) {
        -		return
        -	}
        -
        -	// Set up start points
        -	var kx, ky int
        -	if incX < 0 {
        -		kx = -(n - 1) * incX
        -	}
        -	if incY < 0 {
        -		ky = -(n - 1) * incY
        -	}
        -
        -	// Form y = beta * y
        -	if beta != 1 {
        -		if incY > 0 {
        -			Implementation{}.Dscal(n, beta, y, incY)
        -		} else {
        -			Implementation{}.Dscal(n, beta, y, -incY)
        -		}
        -	}
        -
        -	if alpha == 0 {
        -		return
        -	}
        -
        -	if n == 1 {
        -		y[0] += alpha * a[0] * x[0]
        -		return
        -	}
        -
        -	if ul == blas.Upper {
        -		if incX == 1 {
        -			iy := ky
        -			for i := 0; i < n; i++ {
        -				xv := x[i] * alpha
        -				sum := x[i] * a[i*lda+i]
        -				jy := ky + (i+1)*incY
        -				atmp := a[i*lda+i+1 : i*lda+n]
        -				for j, v := range atmp {
        -					jp := j + i + 1
        -					sum += x[jp] * v
        -					y[jy] += xv * v
        -					jy += incY
        -				}
        -				y[iy] += alpha * sum
        -				iy += incY
        -			}
        -			return
        -		}
        -		ix := kx
        -		iy := ky
        -		for i := 0; i < n; i++ {
        -			xv := x[ix] * alpha
        -			sum := x[ix] * a[i*lda+i]
        -			jx := kx + (i+1)*incX
        -			jy := ky + (i+1)*incY
        -			atmp := a[i*lda+i+1 : i*lda+n]
        -			for _, v := range atmp {
        -				sum += x[jx] * v
        -				y[jy] += xv * v
        -				jx += incX
        -				jy += incY
        -			}
        -			y[iy] += alpha * sum
        -			ix += incX
        -			iy += incY
        -		}
        -		return
        -	}
        -	// Cases where a is lower triangular.
        -	if incX == 1 {
        -		iy := ky
        -		for i := 0; i < n; i++ {
        -			jy := ky
        -			xv := alpha * x[i]
        -			atmp := a[i*lda : i*lda+i]
        -			var sum float64
        -			for j, v := range atmp {
        -				sum += x[j] * v
        -				y[jy] += xv * v
        -				jy += incY
        -			}
        -			sum += x[i] * a[i*lda+i]
        -			sum *= alpha
        -			y[iy] += sum
        -			iy += incY
        -		}
        -		return
        -	}
        -	ix := kx
        -	iy := ky
        -	for i := 0; i < n; i++ {
        -		jx := kx
        -		jy := ky
        -		xv := alpha * x[ix]
        -		atmp := a[i*lda : i*lda+i]
        -		var sum float64
        -		for _, v := range atmp {
        -			sum += x[jx] * v
        -			y[jy] += xv * v
        -			jx += incX
        -			jy += incY
        -		}
        -		sum += x[ix] * a[i*lda+i]
        -		sum *= alpha
        -		y[iy] += sum
        -		ix += incX
        -		iy += incY
        -	}
        -}
        -
        -// Dtbmv performs one of the matrix-vector operations
        -//  x = A * x    if tA == blas.NoTrans
        -//  x = A^T * x  if tA == blas.Trans or blas.ConjTrans
        -// where A is an n×n triangular band matrix with k+1 diagonals, and x is a vector.
        -func (Implementation) Dtbmv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n, k int, a []float64, lda int, x []float64, incX int) {
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        -		panic(badTranspose)
        -	}
        -	if d != blas.NonUnit && d != blas.Unit {
        -		panic(badDiag)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if k < 0 {
        -		panic(kLT0)
        -	}
        -	if lda*(n-1)+k+1 > len(a) || lda < k+1 {
        -		panic(badLdA)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if n == 0 {
        -		return
        -	}
        -	var kx int
        -	if incX < 0 {
        -		kx = -(n - 1) * incX
        -	}
        -
        -	nonunit := d != blas.Unit
        -
        -	if tA == blas.NoTrans {
        -		if ul == blas.Upper {
        -			if incX == 1 {
        -				for i := 0; i < n; i++ {
        -					u := min(1+k, n-i)
        -					var sum float64
        -					atmp := a[i*lda:]
        -					xtmp := x[i:]
        -					for j := 1; j < u; j++ {
        -						sum += xtmp[j] * atmp[j]
        -					}
        -					if nonunit {
        -						sum += xtmp[0] * atmp[0]
        -					} else {
        -						sum += xtmp[0]
        -					}
        -					x[i] = sum
        -				}
        -				return
        -			}
        -			ix := kx
        -			for i := 0; i < n; i++ {
        -				u := min(1+k, n-i)
        -				var sum float64
        -				atmp := a[i*lda:]
        -				jx := incX
        -				for j := 1; j < u; j++ {
        -					sum += x[ix+jx] * atmp[j]
        -					jx += incX
        -				}
        -				if nonunit {
        -					sum += x[ix] * atmp[0]
        -				} else {
        -					sum += x[ix]
        -				}
        -				x[ix] = sum
        -				ix += incX
        -			}
        -			return
        -		}
        -		if incX == 1 {
        -			for i := n - 1; i >= 0; i-- {
        -				l := max(0, k-i)
        -				atmp := a[i*lda:]
        -				var sum float64
        -				for j := l; j < k; j++ {
        -					sum += x[i-k+j] * atmp[j]
        -				}
        -				if nonunit {
        -					sum += x[i] * atmp[k]
        -				} else {
        -					sum += x[i]
        -				}
        -				x[i] = sum
        -			}
        -			return
        -		}
        -		ix := kx + (n-1)*incX
        -		for i := n - 1; i >= 0; i-- {
        -			l := max(0, k-i)
        -			atmp := a[i*lda:]
        -			var sum float64
        -			jx := l * incX
        -			for j := l; j < k; j++ {
        -				sum += x[ix-k*incX+jx] * atmp[j]
        -				jx += incX
        -			}
        -			if nonunit {
        -				sum += x[ix] * atmp[k]
        -			} else {
        -				sum += x[ix]
        -			}
        -			x[ix] = sum
        -			ix -= incX
        -		}
        -		return
        -	}
        -	if ul == blas.Upper {
        -		if incX == 1 {
        -			for i := n - 1; i >= 0; i-- {
        -				u := k + 1
        -				if i < u {
        -					u = i + 1
        -				}
        -				var sum float64
        -				for j := 1; j < u; j++ {
        -					sum += x[i-j] * a[(i-j)*lda+j]
        -				}
        -				if nonunit {
        -					sum += x[i] * a[i*lda]
        -				} else {
        -					sum += x[i]
        -				}
        -				x[i] = sum
        -			}
        -			return
        -		}
        -		ix := kx + (n-1)*incX
        -		for i := n - 1; i >= 0; i-- {
        -			u := k + 1
        -			if i < u {
        -				u = i + 1
        -			}
        -			var sum float64
        -			jx := incX
        -			for j := 1; j < u; j++ {
        -				sum += x[ix-jx] * a[(i-j)*lda+j]
        -				jx += incX
        -			}
        -			if nonunit {
        -				sum += x[ix] * a[i*lda]
        -			} else {
        -				sum += x[ix]
        -			}
        -			x[ix] = sum
        -			ix -= incX
        -		}
        -		return
        -	}
        -	if incX == 1 {
        -		for i := 0; i < n; i++ {
        -			u := k
        -			if i+k >= n {
        -				u = n - i - 1
        -			}
        -			var sum float64
        -			for j := 0; j < u; j++ {
        -				sum += x[i+j+1] * a[(i+j+1)*lda+k-j-1]
        -			}
        -			if nonunit {
        -				sum += x[i] * a[i*lda+k]
        -			} else {
        -				sum += x[i]
        -			}
        -			x[i] = sum
        -		}
        -		return
        -	}
        -	ix := kx
        -	for i := 0; i < n; i++ {
        -		u := k
        -		if i+k >= n {
        -			u = n - i - 1
        -		}
        -		var (
        -			sum float64
        -			jx  int
        -		)
        -		for j := 0; j < u; j++ {
        -			sum += x[ix+jx+incX] * a[(i+j+1)*lda+k-j-1]
        -			jx += incX
        -		}
        -		if nonunit {
        -			sum += x[ix] * a[i*lda+k]
        -		} else {
        -			sum += x[ix]
        -		}
        -		x[ix] = sum
        -		ix += incX
        -	}
        -}
        -
        -// Dtpmv performs one of the matrix-vector operations
        -//  x = A * x    if tA == blas.NoTrans
        -//  x = A^T * x  if tA == blas.Trans or blas.ConjTrans
        -// where A is an n×n triangular matrix in packed format, and x is a vector.
        -func (Implementation) Dtpmv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, ap []float64, x []float64, incX int) {
        -	// Verify inputs
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        -		panic(badTranspose)
        -	}
        -	if d != blas.NonUnit && d != blas.Unit {
        -		panic(badDiag)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if len(ap) < (n*(n+1))/2 {
        -		panic(badLdA)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if n == 0 {
        -		return
        -	}
        -	var kx int
        -	if incX < 0 {
        -		kx = -(n - 1) * incX
        -	}
        -
        -	nonUnit := d == blas.NonUnit
        -	var offset int // Offset is the index of (i,i)
        -	if tA == blas.NoTrans {
        -		if ul == blas.Upper {
        -			if incX == 1 {
        -				for i := 0; i < n; i++ {
        -					xi := x[i]
        -					if nonUnit {
        -						xi *= ap[offset]
        -					}
        -					atmp := ap[offset+1 : offset+n-i]
        -					xtmp := x[i+1:]
        -					for j, v := range atmp {
        -						xi += v * xtmp[j]
        -					}
        -					x[i] = xi
        -					offset += n - i
        -				}
        -				return
        -			}
        -			ix := kx
        -			for i := 0; i < n; i++ {
        -				xix := x[ix]
        -				if nonUnit {
        -					xix *= ap[offset]
        -				}
        -				atmp := ap[offset+1 : offset+n-i]
        -				jx := kx + (i+1)*incX
        -				for _, v := range atmp {
        -					xix += v * x[jx]
        -					jx += incX
        -				}
        -				x[ix] = xix
        -				offset += n - i
        -				ix += incX
        -			}
        -			return
        -		}
        -		if incX == 1 {
        -			offset = n*(n+1)/2 - 1
        -			for i := n - 1; i >= 0; i-- {
        -				xi := x[i]
        -				if nonUnit {
        -					xi *= ap[offset]
        -				}
        -				atmp := ap[offset-i : offset]
        -				for j, v := range atmp {
        -					xi += v * x[j]
        -				}
        -				x[i] = xi
        -				offset -= i + 1
        -			}
        -			return
        -		}
        -		ix := kx + (n-1)*incX
        -		offset = n*(n+1)/2 - 1
        -		for i := n - 1; i >= 0; i-- {
        -			xix := x[ix]
        -			if nonUnit {
        -				xix *= ap[offset]
        -			}
        -			atmp := ap[offset-i : offset]
        -			jx := kx
        -			for _, v := range atmp {
        -				xix += v * x[jx]
        -				jx += incX
        -			}
        -			x[ix] = xix
        -			offset -= i + 1
        -			ix -= incX
        -		}
        -		return
        -	}
        -	// Cases where ap is transposed.
        -	if ul == blas.Upper {
        -		if incX == 1 {
        -			offset = n*(n+1)/2 - 1
        -			for i := n - 1; i >= 0; i-- {
        -				xi := x[i]
        -				atmp := ap[offset+1 : offset+n-i]
        -				xtmp := x[i+1:]
        -				for j, v := range atmp {
        -					xtmp[j] += v * xi
        -				}
        -				if nonUnit {
        -					x[i] *= ap[offset]
        -				}
        -				offset -= n - i + 1
        -			}
        -			return
        -		}
        -		ix := kx + (n-1)*incX
        -		offset = n*(n+1)/2 - 1
        -		for i := n - 1; i >= 0; i-- {
        -			xix := x[ix]
        -			jx := kx + (i+1)*incX
        -			atmp := ap[offset+1 : offset+n-i]
        -			for _, v := range atmp {
        -				x[jx] += v * xix
        -				jx += incX
        -			}
        -			if nonUnit {
        -				x[ix] *= ap[offset]
        -			}
        -			offset -= n - i + 1
        -			ix -= incX
        -		}
        -		return
        -	}
        -	if incX == 1 {
        -		for i := 0; i < n; i++ {
        -			xi := x[i]
        -			atmp := ap[offset-i : offset]
        -			for j, v := range atmp {
        -				x[j] += v * xi
        -			}
        -			if nonUnit {
        -				x[i] *= ap[offset]
        -			}
        -			offset += i + 2
        -		}
        -		return
        -	}
        -	ix := kx
        -	for i := 0; i < n; i++ {
        -		xix := x[ix]
        -		jx := kx
        -		atmp := ap[offset-i : offset]
        -		for _, v := range atmp {
        -			x[jx] += v * xix
        -			jx += incX
        -		}
        -		if nonUnit {
        -			x[ix] *= ap[offset]
        -		}
        -		ix += incX
        -		offset += i + 2
        -	}
        -}
        -
        -// Dtbsv solves one of the systems of equations
        -//  A * x = b    if tA == blas.NoTrans
        -//  A^T * x = b  if tA == blas.Trans or tA == blas.ConjTrans
        -// where A is an n×n triangular band matrix with k+1 diagonals,
        -// and x and b are vectors.
        -//
        -// At entry to the function, x contains the values of b, and the result is
        -// stored in-place into x.
        -//
        -// No test for singularity or near-singularity is included in this
        -// routine. Such tests must be performed before calling this routine.
        -func (Implementation) Dtbsv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n, k int, a []float64, lda int, x []float64, incX int) {
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        -		panic(badTranspose)
        -	}
        -	if d != blas.NonUnit && d != blas.Unit {
        -		panic(badDiag)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if lda*(n-1)+k+1 > len(a) || lda < k+1 {
        -		panic(badLdA)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if n == 0 {
        -		return
        -	}
        -	var kx int
        -	if incX < 0 {
        -		kx = -(n - 1) * incX
        -	}
        -	nonUnit := d == blas.NonUnit
        -	// Form x = A^-1 x.
        -	// Several cases below use subslices for speed improvement.
        -	// The incX != 1 cases usually do not because incX may be negative.
        -	if tA == blas.NoTrans {
        -		if ul == blas.Upper {
        -			if incX == 1 {
        -				for i := n - 1; i >= 0; i-- {
        -					bands := k
        -					if i+bands >= n {
        -						bands = n - i - 1
        -					}
        -					atmp := a[i*lda+1:]
        -					xtmp := x[i+1 : i+bands+1]
        -					var sum float64
        -					for j, v := range xtmp {
        -						sum += v * atmp[j]
        -					}
        -					x[i] -= sum
        -					if nonUnit {
        -						x[i] /= a[i*lda]
        -					}
        -				}
        -				return
        -			}
        -			ix := kx + (n-1)*incX
        -			for i := n - 1; i >= 0; i-- {
        -				max := k + 1
        -				if i+max > n {
        -					max = n - i
        -				}
        -				atmp := a[i*lda:]
        -				var (
        -					jx  int
        -					sum float64
        -				)
        -				for j := 1; j < max; j++ {
        -					jx += incX
        -					sum += x[ix+jx] * atmp[j]
        -				}
        -				x[ix] -= sum
        -				if nonUnit {
        -					x[ix] /= atmp[0]
        -				}
        -				ix -= incX
        -			}
        -			return
        -		}
        -		if incX == 1 {
        -			for i := 0; i < n; i++ {
        -				bands := k
        -				if i-k < 0 {
        -					bands = i
        -				}
        -				atmp := a[i*lda+k-bands:]
        -				xtmp := x[i-bands : i]
        -				var sum float64
        -				for j, v := range xtmp {
        -					sum += v * atmp[j]
        -				}
        -				x[i] -= sum
        -				if nonUnit {
        -					x[i] /= atmp[bands]
        -				}
        -			}
        -			return
        -		}
        -		ix := kx
        -		for i := 0; i < n; i++ {
        -			bands := k
        -			if i-k < 0 {
        -				bands = i
        -			}
        -			atmp := a[i*lda+k-bands:]
        -			var (
        -				sum float64
        -				jx  int
        -			)
        -			for j := 0; j < bands; j++ {
        -				sum += x[ix-bands*incX+jx] * atmp[j]
        -				jx += incX
        -			}
        -			x[ix] -= sum
        -			if nonUnit {
        -				x[ix] /= atmp[bands]
        -			}
        -			ix += incX
        -		}
        -		return
        -	}
        -	// Cases where a is transposed.
        -	if ul == blas.Upper {
        -		if incX == 1 {
        -			for i := 0; i < n; i++ {
        -				bands := k
        -				if i-k < 0 {
        -					bands = i
        -				}
        -				var sum float64
        -				for j := 0; j < bands; j++ {
        -					sum += x[i-bands+j] * a[(i-bands+j)*lda+bands-j]
        -				}
        -				x[i] -= sum
        -				if nonUnit {
        -					x[i] /= a[i*lda]
        -				}
        -			}
        -			return
        -		}
        -		ix := kx
        -		for i := 0; i < n; i++ {
        -			bands := k
        -			if i-k < 0 {
        -				bands = i
        -			}
        -			var (
        -				sum float64
        -				jx  int
        -			)
        -			for j := 0; j < bands; j++ {
        -				sum += x[ix-bands*incX+jx] * a[(i-bands+j)*lda+bands-j]
        -				jx += incX
        -			}
        -			x[ix] -= sum
        -			if nonUnit {
        -				x[ix] /= a[i*lda]
        -			}
        -			ix += incX
        -		}
        -		return
        -	}
        -	if incX == 1 {
        -		for i := n - 1; i >= 0; i-- {
        -			bands := k
        -			if i+bands >= n {
        -				bands = n - i - 1
        -			}
        -			var sum float64
        -			xtmp := x[i+1 : i+1+bands]
        -			for j, v := range xtmp {
        -				sum += v * a[(i+j+1)*lda+k-j-1]
        -			}
        -			x[i] -= sum
        -			if nonUnit {
        -				x[i] /= a[i*lda+k]
        -			}
        -		}
        -		return
        -	}
        -	ix := kx + (n-1)*incX
        -	for i := n - 1; i >= 0; i-- {
        -		bands := k
        -		if i+bands >= n {
        -			bands = n - i - 1
        -		}
        -		var (
        -			sum float64
        -			jx  int
        -		)
        -		for j := 0; j < bands; j++ {
        -			sum += x[ix+jx+incX] * a[(i+j+1)*lda+k-j-1]
        -			jx += incX
        -		}
        -		x[ix] -= sum
        -		if nonUnit {
        -			x[ix] /= a[i*lda+k]
        -		}
        -		ix -= incX
        -	}
        -}
        -
        -// Dsbmv performs the matrix-vector operation
        -//  y = alpha * A * x + beta * y
        -// where A is an n×n symmetric band matrix with k super-diagonals, x and y are
        -// vectors, and alpha and beta are scalars.
        -func (Implementation) Dsbmv(ul blas.Uplo, n, k int, alpha float64, a []float64, lda int, x []float64, incX int, beta float64, y []float64, incY int) {
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        -		panic(badY)
        -	}
        -	if lda*(n-1)+k+1 > len(a) || lda < k+1 {
        -		panic(badLdA)
        -	}
        -
        -	// Quick return if possible
        -	if n == 0 || (alpha == 0 && beta == 1) {
        -		return
        -	}
        -
        -	// Set up indexes
        -	lenX := n
        -	lenY := n
        -	var kx, ky int
        -	if incX < 0 {
        -		kx = -(lenX - 1) * incX
        -	}
        -	if incY < 0 {
        -		ky = -(lenY - 1) * incY
        -	}
        -
        -	// First form y = beta * y
        -	if incY > 0 {
        -		Implementation{}.Dscal(lenY, beta, y, incY)
        -	} else {
        -		Implementation{}.Dscal(lenY, beta, y, -incY)
        -	}
        -
        -	if alpha == 0 {
        -		return
        -	}
        -
        -	if ul == blas.Upper {
        -		if incX == 1 {
        -			iy := ky
        -			for i := 0; i < n; i++ {
        -				atmp := a[i*lda:]
        -				tmp := alpha * x[i]
        -				sum := tmp * atmp[0]
        -				u := min(k, n-i-1)
        -				jy := incY
        -				for j := 1; j <= u; j++ {
        -					v := atmp[j]
        -					sum += alpha * x[i+j] * v
        -					y[iy+jy] += tmp * v
        -					jy += incY
        -				}
        -				y[iy] += sum
        -				iy += incY
        -			}
        -			return
        -		}
        -		ix := kx
        -		iy := ky
        -		for i := 0; i < n; i++ {
        -			atmp := a[i*lda:]
        -			tmp := alpha * x[ix]
        -			sum := tmp * atmp[0]
        -			u := min(k, n-i-1)
        -			jx := incX
        -			jy := incY
        -			for j := 1; j <= u; j++ {
        -				v := atmp[j]
        -				sum += alpha * x[ix+jx] * v
        -				y[iy+jy] += tmp * v
        -				jx += incX
        -				jy += incY
        -			}
        -			y[iy] += sum
        -			ix += incX
        -			iy += incY
        -		}
        -		return
        -	}
        -
        -	// Casses where a has bands below the diagonal.
        -	if incX == 1 {
        -		iy := ky
        -		for i := 0; i < n; i++ {
        -			l := max(0, k-i)
        -			tmp := alpha * x[i]
        -			jy := l * incY
        -			atmp := a[i*lda:]
        -			for j := l; j < k; j++ {
        -				v := atmp[j]
        -				y[iy] += alpha * v * x[i-k+j]
        -				y[iy-k*incY+jy] += tmp * v
        -				jy += incY
        -			}
        -			y[iy] += tmp * atmp[k]
        -			iy += incY
        -		}
        -		return
        -	}
        -	ix := kx
        -	iy := ky
        -	for i := 0; i < n; i++ {
        -		l := max(0, k-i)
        -		tmp := alpha * x[ix]
        -		jx := l * incX
        -		jy := l * incY
        -		atmp := a[i*lda:]
        -		for j := l; j < k; j++ {
        -			v := atmp[j]
        -			y[iy] += alpha * v * x[ix-k*incX+jx]
        -			y[iy-k*incY+jy] += tmp * v
        -			jx += incX
        -			jy += incY
        -		}
        -		y[iy] += tmp * atmp[k]
        -		ix += incX
        -		iy += incY
        -	}
        -}
        -
        -// Dsyr performs the symmetric rank-one update
        -//  A += alpha * x * x^T
        -// where A is an n×n symmetric matrix, and x is a vector.
        -func (Implementation) Dsyr(ul blas.Uplo, n int, alpha float64, x []float64, incX int, a []float64, lda int) {
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if lda*(n-1)+n > len(a) || lda < max(1, n) {
        -		panic(badLdA)
        -	}
        -	if alpha == 0 || n == 0 {
        -		return
        -	}
        -
        -	lenX := n
        -	var kx int
        -	if incX < 0 {
        -		kx = -(lenX - 1) * incX
        -	}
        -	if ul == blas.Upper {
        -		if incX == 1 {
        -			for i := 0; i < n; i++ {
        -				tmp := x[i] * alpha
        -				if tmp != 0 {
        -					atmp := a[i*lda+i : i*lda+n]
        -					xtmp := x[i:n]
        -					for j, v := range xtmp {
        -						atmp[j] += v * tmp
        -					}
        -				}
        -			}
        -			return
        -		}
        -		ix := kx
        -		for i := 0; i < n; i++ {
        -			tmp := x[ix] * alpha
        -			if tmp != 0 {
        -				jx := ix
        -				atmp := a[i*lda:]
        -				for j := i; j < n; j++ {
        -					atmp[j] += x[jx] * tmp
        -					jx += incX
        -				}
        -			}
        -			ix += incX
        -		}
        -		return
        -	}
        -	// Cases where a is lower triangular.
        -	if incX == 1 {
        -		for i := 0; i < n; i++ {
        -			tmp := x[i] * alpha
        -			if tmp != 0 {
        -				atmp := a[i*lda:]
        -				xtmp := x[:i+1]
        -				for j, v := range xtmp {
        -					atmp[j] += tmp * v
        -				}
        -			}
        -		}
        -		return
        -	}
        -	ix := kx
        -	for i := 0; i < n; i++ {
        -		tmp := x[ix] * alpha
        -		if tmp != 0 {
        -			atmp := a[i*lda:]
        -			jx := kx
        -			for j := 0; j < i+1; j++ {
        -				atmp[j] += tmp * x[jx]
        -				jx += incX
        -			}
        -		}
        -		ix += incX
        -	}
        -}
        -
        -// Dsyr2 performs the symmetric rank-two update
        -//  A += alpha * x * y^T + alpha * y * x^T
        -// where A is an n×n symmetric matrix, x and y are vectors, and alpha is a scalar.
        -func (Implementation) Dsyr2(ul blas.Uplo, n int, alpha float64, x []float64, incX int, y []float64, incY int, a []float64, lda int) {
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        -		panic(badY)
        -	}
        -	if lda*(n-1)+n > len(a) || lda < max(1, n) {
        -		panic(badLdA)
        -	}
        -	if alpha == 0 {
        -		return
        -	}
        -
        -	var ky, kx int
        -	if incY < 0 {
        -		ky = -(n - 1) * incY
        -	}
        -	if incX < 0 {
        -		kx = -(n - 1) * incX
        -	}
        -	if ul == blas.Upper {
        -		if incX == 1 && incY == 1 {
        -			for i := 0; i < n; i++ {
        -				xi := x[i]
        -				yi := y[i]
        -				atmp := a[i*lda:]
        -				for j := i; j < n; j++ {
        -					atmp[j] += alpha * (xi*y[j] + x[j]*yi)
        -				}
        -			}
        -			return
        -		}
        -		ix := kx
        -		iy := ky
        -		for i := 0; i < n; i++ {
        -			jx := kx + i*incX
        -			jy := ky + i*incY
        -			xi := x[ix]
        -			yi := y[iy]
        -			atmp := a[i*lda:]
        -			for j := i; j < n; j++ {
        -				atmp[j] += alpha * (xi*y[jy] + x[jx]*yi)
        -				jx += incX
        -				jy += incY
        -			}
        -			ix += incX
        -			iy += incY
        -		}
        -		return
        -	}
        -	if incX == 1 && incY == 1 {
        -		for i := 0; i < n; i++ {
        -			xi := x[i]
        -			yi := y[i]
        -			atmp := a[i*lda:]
        -			for j := 0; j <= i; j++ {
        -				atmp[j] += alpha * (xi*y[j] + x[j]*yi)
        -			}
        -		}
        -		return
        -	}
        -	ix := kx
        -	iy := ky
        -	for i := 0; i < n; i++ {
        -		jx := kx
        -		jy := ky
        -		xi := x[ix]
        -		yi := y[iy]
        -		atmp := a[i*lda:]
        -		for j := 0; j <= i; j++ {
        -			atmp[j] += alpha * (xi*y[jy] + x[jx]*yi)
        -			jx += incX
        -			jy += incY
        -		}
        -		ix += incX
        -		iy += incY
        -	}
        -}
        -
        -// Dtpsv solves one of the systems of equations
        -//  A * x = b    if tA == blas.NoTrans
        -//  A^T * x = b  if tA == blas.Trans or blas.ConjTrans
        -// where A is an n×n triangular matrix in packed format, and x and b are vectors.
        -//
        -// At entry to the function, x contains the values of b, and the result is
        -// stored in-place into x.
        -//
        -// No test for singularity or near-singularity is included in this
        -// routine. Such tests must be performed before calling this routine.
        -func (Implementation) Dtpsv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, ap []float64, x []float64, incX int) {
        -	// Verify inputs
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        -		panic(badTranspose)
        -	}
        -	if d != blas.NonUnit && d != blas.Unit {
        -		panic(badDiag)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if len(ap) < (n*(n+1))/2 {
        -		panic(badLdA)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if n == 0 {
        -		return
        -	}
        -	var kx int
        -	if incX < 0 {
        -		kx = -(n - 1) * incX
        -	}
        -
        -	nonUnit := d == blas.NonUnit
        -	var offset int // Offset is the index of (i,i)
        -	if tA == blas.NoTrans {
        -		if ul == blas.Upper {
        -			offset = n*(n+1)/2 - 1
        -			if incX == 1 {
        -				for i := n - 1; i >= 0; i-- {
        -					atmp := ap[offset+1 : offset+n-i]
        -					xtmp := x[i+1:]
        -					var sum float64
        -					for j, v := range atmp {
        -						sum += v * xtmp[j]
        -					}
        -					x[i] -= sum
        -					if nonUnit {
        -						x[i] /= ap[offset]
        -					}
        -					offset -= n - i + 1
        -				}
        -				return
        -			}
        -			ix := kx + (n-1)*incX
        -			for i := n - 1; i >= 0; i-- {
        -				atmp := ap[offset+1 : offset+n-i]
        -				jx := kx + (i+1)*incX
        -				var sum float64
        -				for _, v := range atmp {
        -					sum += v * x[jx]
        -					jx += incX
        -				}
        -				x[ix] -= sum
        -				if nonUnit {
        -					x[ix] /= ap[offset]
        -				}
        -				ix -= incX
        -				offset -= n - i + 1
        -			}
        -			return
        -		}
        -		if incX == 1 {
        -			for i := 0; i < n; i++ {
        -				atmp := ap[offset-i : offset]
        -				var sum float64
        -				for j, v := range atmp {
        -					sum += v * x[j]
        -				}
        -				x[i] -= sum
        -				if nonUnit {
        -					x[i] /= ap[offset]
        -				}
        -				offset += i + 2
        -			}
        -			return
        -		}
        -		ix := kx
        -		for i := 0; i < n; i++ {
        -			jx := kx
        -			atmp := ap[offset-i : offset]
        -			var sum float64
        -			for _, v := range atmp {
        -				sum += v * x[jx]
        -				jx += incX
        -			}
        -			x[ix] -= sum
        -			if nonUnit {
        -				x[ix] /= ap[offset]
        -			}
        -			ix += incX
        -			offset += i + 2
        -		}
        -		return
        -	}
        -	// Cases where ap is transposed.
        -	if ul == blas.Upper {
        -		if incX == 1 {
        -			for i := 0; i < n; i++ {
        -				if nonUnit {
        -					x[i] /= ap[offset]
        -				}
        -				xi := x[i]
        -				atmp := ap[offset+1 : offset+n-i]
        -				xtmp := x[i+1:]
        -				for j, v := range atmp {
        -					xtmp[j] -= v * xi
        -				}
        -				offset += n - i
        -			}
        -			return
        -		}
        -		ix := kx
        -		for i := 0; i < n; i++ {
        -			if nonUnit {
        -				x[ix] /= ap[offset]
        -			}
        -			xix := x[ix]
        -			atmp := ap[offset+1 : offset+n-i]
        -			jx := kx + (i+1)*incX
        -			for _, v := range atmp {
        -				x[jx] -= v * xix
        -				jx += incX
        -			}
        -			ix += incX
        -			offset += n - i
        -		}
        -		return
        -	}
        -	if incX == 1 {
        -		offset = n*(n+1)/2 - 1
        -		for i := n - 1; i >= 0; i-- {
        -			if nonUnit {
        -				x[i] /= ap[offset]
        -			}
        -			xi := x[i]
        -			atmp := ap[offset-i : offset]
        -			for j, v := range atmp {
        -				x[j] -= v * xi
        -			}
        -			offset -= i + 1
        -		}
        -		return
        -	}
        -	ix := kx + (n-1)*incX
        -	offset = n*(n+1)/2 - 1
        -	for i := n - 1; i >= 0; i-- {
        -		if nonUnit {
        -			x[ix] /= ap[offset]
        -		}
        -		xix := x[ix]
        -		atmp := ap[offset-i : offset]
        -		jx := kx
        -		for _, v := range atmp {
        -			x[jx] -= v * xix
        -			jx += incX
        -		}
        -		ix -= incX
        -		offset -= i + 1
        -	}
        -}
        -
        -// Dspmv performs the matrix-vector operation
        -//  y = alpha * A * x + beta * y
        -// where A is an n×n symmetric matrix in packed format, x and y are vectors,
        -// and alpha and beta are scalars.
        -func (Implementation) Dspmv(ul blas.Uplo, n int, alpha float64, a []float64, x []float64, incX int, beta float64, y []float64, incY int) {
        -	// Verify inputs
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if len(a) < (n*(n+1))/2 {
        -		panic(badLdA)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        -		panic(badY)
        -	}
        -	// Quick return if possible
        -	if n == 0 || (alpha == 0 && beta == 1) {
        -		return
        -	}
        -
        -	// Set up start points
        -	var kx, ky int
        -	if incX < 0 {
        -		kx = -(n - 1) * incX
        -	}
        -	if incY < 0 {
        -		ky = -(n - 1) * incY
        -	}
        -
        -	// Form y = beta * y
        -	if beta != 1 {
        -		if incY > 0 {
        -			Implementation{}.Dscal(n, beta, y, incY)
        -		} else {
        -			Implementation{}.Dscal(n, beta, y, -incY)
        -		}
        -	}
        -
        -	if alpha == 0 {
        -		return
        -	}
        -
        -	if n == 1 {
        -		y[0] += alpha * a[0] * x[0]
        -		return
        -	}
        -	var offset int // Offset is the index of (i,i).
        -	if ul == blas.Upper {
        -		if incX == 1 {
        -			iy := ky
        -			for i := 0; i < n; i++ {
        -				xv := x[i] * alpha
        -				sum := a[offset] * x[i]
        -				atmp := a[offset+1 : offset+n-i]
        -				xtmp := x[i+1:]
        -				jy := ky + (i+1)*incY
        -				for j, v := range atmp {
        -					sum += v * xtmp[j]
        -					y[jy] += v * xv
        -					jy += incY
        -				}
        -				y[iy] += alpha * sum
        -				iy += incY
        -				offset += n - i
        -			}
        -			return
        -		}
        -		ix := kx
        -		iy := ky
        -		for i := 0; i < n; i++ {
        -			xv := x[ix] * alpha
        -			sum := a[offset] * x[ix]
        -			atmp := a[offset+1 : offset+n-i]
        -			jx := kx + (i+1)*incX
        -			jy := ky + (i+1)*incY
        -			for _, v := range atmp {
        -				sum += v * x[jx]
        -				y[jy] += v * xv
        -				jx += incX
        -				jy += incY
        -			}
        -			y[iy] += alpha * sum
        -			ix += incX
        -			iy += incY
        -			offset += n - i
        -		}
        -		return
        -	}
        -	if incX == 1 {
        -		iy := ky
        -		for i := 0; i < n; i++ {
        -			xv := x[i] * alpha
        -			atmp := a[offset-i : offset]
        -			jy := ky
        -			var sum float64
        -			for j, v := range atmp {
        -				sum += v * x[j]
        -				y[jy] += v * xv
        -				jy += incY
        -			}
        -			sum += a[offset] * x[i]
        -			y[iy] += alpha * sum
        -			iy += incY
        -			offset += i + 2
        -		}
        -		return
        -	}
        -	ix := kx
        -	iy := ky
        -	for i := 0; i < n; i++ {
        -		xv := x[ix] * alpha
        -		atmp := a[offset-i : offset]
        -		jx := kx
        -		jy := ky
        -		var sum float64
        -		for _, v := range atmp {
        -			sum += v * x[jx]
        -			y[jy] += v * xv
        -			jx += incX
        -			jy += incY
        -		}
        -
        -		sum += a[offset] * x[ix]
        -		y[iy] += alpha * sum
        -		ix += incX
        -		iy += incY
        -		offset += i + 2
        -	}
        -}
        -
        -// Dspr performs the symmetric rank-one operation
        -//  A += alpha * x * x^T
        -// where A is an n×n symmetric matrix in packed format, x is a vector, and
        -// alpha is a scalar.
        -func (Implementation) Dspr(ul blas.Uplo, n int, alpha float64, x []float64, incX int, a []float64) {
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if len(a) < (n*(n+1))/2 {
        -		panic(badLdA)
        -	}
        -	if alpha == 0 || n == 0 {
        -		return
        -	}
        -	lenX := n
        -	var kx int
        -	if incX < 0 {
        -		kx = -(lenX - 1) * incX
        -	}
        -	var offset int // Offset is the index of (i,i).
        -	if ul == blas.Upper {
        -		if incX == 1 {
        -			for i := 0; i < n; i++ {
        -				atmp := a[offset:]
        -				xv := alpha * x[i]
        -				xtmp := x[i:n]
        -				for j, v := range xtmp {
        -					atmp[j] += xv * v
        -				}
        -				offset += n - i
        -			}
        -			return
        -		}
        -		ix := kx
        -		for i := 0; i < n; i++ {
        -			jx := kx + i*incX
        -			atmp := a[offset:]
        -			xv := alpha * x[ix]
        -			for j := 0; j < n-i; j++ {
        -				atmp[j] += xv * x[jx]
        -				jx += incX
        -			}
        -			ix += incX
        -			offset += n - i
        -		}
        -		return
        -	}
        -	if incX == 1 {
        -		for i := 0; i < n; i++ {
        -			atmp := a[offset-i:]
        -			xv := alpha * x[i]
        -			xtmp := x[:i+1]
        -			for j, v := range xtmp {
        -				atmp[j] += xv * v
        -			}
        -			offset += i + 2
        -		}
        -		return
        -	}
        -	ix := kx
        -	for i := 0; i < n; i++ {
        -		jx := kx
        -		atmp := a[offset-i:]
        -		xv := alpha * x[ix]
        -		for j := 0; j <= i; j++ {
        -			atmp[j] += xv * x[jx]
        -			jx += incX
        -		}
        -		ix += incX
        -		offset += i + 2
        -	}
        -}
        -
        -// Dspr2 performs the symmetric rank-2 update
        -//  A += alpha * x * y^T + alpha * y * x^T
        -// where A is an n×n symmetric matrix in packed format, x and y are vectors,
        -// and alpha is a scalar.
        -func (Implementation) Dspr2(ul blas.Uplo, n int, alpha float64, x []float64, incX int, y []float64, incY int, ap []float64) {
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        -		panic(badY)
        -	}
        -	if len(ap) < (n*(n+1))/2 {
        -		panic(badLdA)
        -	}
        -	if alpha == 0 {
        -		return
        -	}
        -	var ky, kx int
        -	if incY < 0 {
        -		ky = -(n - 1) * incY
        -	}
        -	if incX < 0 {
        -		kx = -(n - 1) * incX
        -	}
        -	var offset int // Offset is the index of (i,i).
        -	if ul == blas.Upper {
        -		if incX == 1 && incY == 1 {
        -			for i := 0; i < n; i++ {
        -				atmp := ap[offset:]
        -				xi := x[i]
        -				yi := y[i]
        -				xtmp := x[i:n]
        -				ytmp := y[i:n]
        -				for j, v := range xtmp {
        -					atmp[j] += alpha * (xi*ytmp[j] + v*yi)
        -				}
        -				offset += n - i
        -			}
        -			return
        -		}
        -		ix := kx
        -		iy := ky
        -		for i := 0; i < n; i++ {
        -			jx := kx + i*incX
        -			jy := ky + i*incY
        -			atmp := ap[offset:]
        -			xi := x[ix]
        -			yi := y[iy]
        -			for j := 0; j < n-i; j++ {
        -				atmp[j] += alpha * (xi*y[jy] + x[jx]*yi)
        -				jx += incX
        -				jy += incY
        -			}
        -			ix += incX
        -			iy += incY
        -			offset += n - i
        -		}
        -		return
        -	}
        -	if incX == 1 && incY == 1 {
        -		for i := 0; i < n; i++ {
        -			atmp := ap[offset-i:]
        -			xi := x[i]
        -			yi := y[i]
        -			xtmp := x[:i+1]
        -			for j, v := range xtmp {
        -				atmp[j] += alpha * (xi*y[j] + v*yi)
        -			}
        -			offset += i + 2
        -		}
        -		return
        -	}
        -	ix := kx
        -	iy := ky
        -	for i := 0; i < n; i++ {
        -		jx := kx
        -		jy := ky
        -		atmp := ap[offset-i:]
        -		for j := 0; j <= i; j++ {
        -			atmp[j] += alpha * (x[ix]*y[jy] + x[jx]*y[iy])
        -			jx += incX
        -			jy += incY
        -		}
        -		ix += incX
        -		iy += incY
        -		offset += i + 2
        -	}
        -}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/level2float32.go b/vendor/gonum.org/v1/gonum/blas/gonum/level2float32.go
        new file mode 100644
        index 000000000..d37a0b17d
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/blas/gonum/level2float32.go
        @@ -0,0 +1,2296 @@
        +// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.
        +
        +// Copyright ©2014 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package gonum
        +
        +import (
        +	"gonum.org/v1/gonum/blas"
        +	"gonum.org/v1/gonum/internal/asm/f32"
        +)
        +
        +var _ blas.Float32Level2 = Implementation{}
        +
        +// Sger performs the rank-one operation
        +//  A += alpha * x * yᵀ
        +// where A is an m×n dense matrix, x and y are vectors, and alpha is a scalar.
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Sger(m, n int, alpha float32, x []float32, incX int, y []float32, incY int, a []float32, lda int) {
        +	if m < 0 {
        +		panic(mLT0)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if (incX > 0 && len(x) <= (m-1)*incX) || (incX < 0 && len(x) <= (1-m)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +	if len(a) < lda*(m-1)+n {
        +		panic(shortA)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 {
        +		return
        +	}
        +	f32.Ger(uintptr(m), uintptr(n),
        +		alpha,
        +		x, uintptr(incX),
        +		y, uintptr(incY),
        +		a, uintptr(lda))
        +}
        +
        +// Sgbmv performs one of the matrix-vector operations
        +//  y = alpha * A * x + beta * y   if tA == blas.NoTrans
        +//  y = alpha * Aᵀ * x + beta * y  if tA == blas.Trans or blas.ConjTrans
        +// where A is an m×n band matrix with kL sub-diagonals and kU super-diagonals,
        +// x and y are vectors, and alpha and beta are scalars.
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Sgbmv(tA blas.Transpose, m, n, kL, kU int, alpha float32, a []float32, lda int, x []float32, incX int, beta float32, y []float32, incY int) {
        +	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        +		panic(badTranspose)
        +	}
        +	if m < 0 {
        +		panic(mLT0)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if kL < 0 {
        +		panic(kLLT0)
        +	}
        +	if kU < 0 {
        +		panic(kULT0)
        +	}
        +	if lda < kL+kU+1 {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(min(m, n+kL)-1)+kL+kU+1 {
        +		panic(shortA)
        +	}
        +	lenX := m
        +	lenY := n
        +	if tA == blas.NoTrans {
        +		lenX = n
        +		lenY = m
        +	}
        +	if (incX > 0 && len(x) <= (lenX-1)*incX) || (incX < 0 && len(x) <= (1-lenX)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (lenY-1)*incY) || (incY < 0 && len(y) <= (1-lenY)*incY) {
        +		panic(shortY)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 && beta == 1 {
        +		return
        +	}
        +
        +	var kx, ky int
        +	if incX < 0 {
        +		kx = -(lenX - 1) * incX
        +	}
        +	if incY < 0 {
        +		ky = -(lenY - 1) * incY
        +	}
        +
        +	// Form y = beta * y.
        +	if beta != 1 {
        +		if incY == 1 {
        +			if beta == 0 {
        +				for i := range y[:lenY] {
        +					y[i] = 0
        +				}
        +			} else {
        +				f32.ScalUnitary(beta, y[:lenY])
        +			}
        +		} else {
        +			iy := ky
        +			if beta == 0 {
        +				for i := 0; i < lenY; i++ {
        +					y[iy] = 0
        +					iy += incY
        +				}
        +			} else {
        +				if incY > 0 {
        +					f32.ScalInc(beta, y, uintptr(lenY), uintptr(incY))
        +				} else {
        +					f32.ScalInc(beta, y, uintptr(lenY), uintptr(-incY))
        +				}
        +			}
        +		}
        +	}
        +
        +	if alpha == 0 {
        +		return
        +	}
        +
        +	// i and j are indices of the compacted banded matrix.
        +	// off is the offset into the dense matrix (off + j = densej)
        +	nCol := kU + 1 + kL
        +	if tA == blas.NoTrans {
        +		iy := ky
        +		if incX == 1 {
        +			for i := 0; i < min(m, n+kL); i++ {
        +				l := max(0, kL-i)
        +				u := min(nCol, n+kL-i)
        +				off := max(0, i-kL)
        +				atmp := a[i*lda+l : i*lda+u]
        +				xtmp := x[off : off+u-l]
        +				var sum float32
        +				for j, v := range atmp {
        +					sum += xtmp[j] * v
        +				}
        +				y[iy] += sum * alpha
        +				iy += incY
        +			}
        +			return
        +		}
        +		for i := 0; i < min(m, n+kL); i++ {
        +			l := max(0, kL-i)
        +			u := min(nCol, n+kL-i)
        +			off := max(0, i-kL)
        +			atmp := a[i*lda+l : i*lda+u]
        +			jx := kx
        +			var sum float32
        +			for _, v := range atmp {
        +				sum += x[off*incX+jx] * v
        +				jx += incX
        +			}
        +			y[iy] += sum * alpha
        +			iy += incY
        +		}
        +		return
        +	}
        +	if incX == 1 {
        +		for i := 0; i < min(m, n+kL); i++ {
        +			l := max(0, kL-i)
        +			u := min(nCol, n+kL-i)
        +			off := max(0, i-kL)
        +			atmp := a[i*lda+l : i*lda+u]
        +			tmp := alpha * x[i]
        +			jy := ky
        +			for _, v := range atmp {
        +				y[jy+off*incY] += tmp * v
        +				jy += incY
        +			}
        +		}
        +		return
        +	}
        +	ix := kx
        +	for i := 0; i < min(m, n+kL); i++ {
        +		l := max(0, kL-i)
        +		u := min(nCol, n+kL-i)
        +		off := max(0, i-kL)
        +		atmp := a[i*lda+l : i*lda+u]
        +		tmp := alpha * x[ix]
        +		jy := ky
        +		for _, v := range atmp {
        +			y[jy+off*incY] += tmp * v
        +			jy += incY
        +		}
        +		ix += incX
        +	}
        +}
        +
        +// Strmv performs one of the matrix-vector operations
        +//  x = A * x   if tA == blas.NoTrans
        +//  x = Aᵀ * x  if tA == blas.Trans or blas.ConjTrans
        +// where A is an n×n triangular matrix, and x is a vector.
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Strmv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, a []float32, lda int, x []float32, incX int) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        +		panic(badTranspose)
        +	}
        +	if d != blas.NonUnit && d != blas.Unit {
        +		panic(badDiag)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(n-1)+n {
        +		panic(shortA)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +
        +	nonUnit := d != blas.Unit
        +	if n == 1 {
        +		if nonUnit {
        +			x[0] *= a[0]
        +		}
        +		return
        +	}
        +	var kx int
        +	if incX <= 0 {
        +		kx = -(n - 1) * incX
        +	}
        +	if tA == blas.NoTrans {
        +		if ul == blas.Upper {
        +			if incX == 1 {
        +				for i := 0; i < n; i++ {
        +					ilda := i * lda
        +					var tmp float32
        +					if nonUnit {
        +						tmp = a[ilda+i] * x[i]
        +					} else {
        +						tmp = x[i]
        +					}
        +					x[i] = tmp + f32.DotUnitary(a[ilda+i+1:ilda+n], x[i+1:n])
        +				}
        +				return
        +			}
        +			ix := kx
        +			for i := 0; i < n; i++ {
        +				ilda := i * lda
        +				var tmp float32
        +				if nonUnit {
        +					tmp = a[ilda+i] * x[ix]
        +				} else {
        +					tmp = x[ix]
        +				}
        +				x[ix] = tmp + f32.DotInc(x, a[ilda+i+1:ilda+n], uintptr(n-i-1), uintptr(incX), 1, uintptr(ix+incX), 0)
        +				ix += incX
        +			}
        +			return
        +		}
        +		if incX == 1 {
        +			for i := n - 1; i >= 0; i-- {
        +				ilda := i * lda
        +				var tmp float32
        +				if nonUnit {
        +					tmp += a[ilda+i] * x[i]
        +				} else {
        +					tmp = x[i]
        +				}
        +				x[i] = tmp + f32.DotUnitary(a[ilda:ilda+i], x[:i])
        +			}
        +			return
        +		}
        +		ix := kx + (n-1)*incX
        +		for i := n - 1; i >= 0; i-- {
        +			ilda := i * lda
        +			var tmp float32
        +			if nonUnit {
        +				tmp = a[ilda+i] * x[ix]
        +			} else {
        +				tmp = x[ix]
        +			}
        +			x[ix] = tmp + f32.DotInc(x, a[ilda:ilda+i], uintptr(i), uintptr(incX), 1, uintptr(kx), 0)
        +			ix -= incX
        +		}
        +		return
        +	}
        +	// Cases where a is transposed.
        +	if ul == blas.Upper {
        +		if incX == 1 {
        +			for i := n - 1; i >= 0; i-- {
        +				ilda := i * lda
        +				xi := x[i]
        +				f32.AxpyUnitary(xi, a[ilda+i+1:ilda+n], x[i+1:n])
        +				if nonUnit {
        +					x[i] *= a[ilda+i]
        +				}
        +			}
        +			return
        +		}
        +		ix := kx + (n-1)*incX
        +		for i := n - 1; i >= 0; i-- {
        +			ilda := i * lda
        +			xi := x[ix]
        +			f32.AxpyInc(xi, a[ilda+i+1:ilda+n], x, uintptr(n-i-1), 1, uintptr(incX), 0, uintptr(kx+(i+1)*incX))
        +			if nonUnit {
        +				x[ix] *= a[ilda+i]
        +			}
        +			ix -= incX
        +		}
        +		return
        +	}
        +	if incX == 1 {
        +		for i := 0; i < n; i++ {
        +			ilda := i * lda
        +			xi := x[i]
        +			f32.AxpyUnitary(xi, a[ilda:ilda+i], x[:i])
        +			if nonUnit {
        +				x[i] *= a[i*lda+i]
        +			}
        +		}
        +		return
        +	}
        +	ix := kx
        +	for i := 0; i < n; i++ {
        +		ilda := i * lda
        +		xi := x[ix]
        +		f32.AxpyInc(xi, a[ilda:ilda+i], x, uintptr(i), 1, uintptr(incX), 0, uintptr(kx))
        +		if nonUnit {
        +			x[ix] *= a[ilda+i]
        +		}
        +		ix += incX
        +	}
        +}
        +
        +// Strsv solves one of the systems of equations
        +//  A * x = b   if tA == blas.NoTrans
        +//  Aᵀ * x = b  if tA == blas.Trans or blas.ConjTrans
        +// where A is an n×n triangular matrix, and x and b are vectors.
        +//
        +// At entry to the function, x contains the values of b, and the result is
        +// stored in-place into x.
        +//
        +// No test for singularity or near-singularity is included in this
        +// routine. Such tests must be performed before calling this routine.
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Strsv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, a []float32, lda int, x []float32, incX int) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        +		panic(badTranspose)
        +	}
        +	if d != blas.NonUnit && d != blas.Unit {
        +		panic(badDiag)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(n-1)+n {
        +		panic(shortA)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +
        +	if n == 1 {
        +		if d == blas.NonUnit {
        +			x[0] /= a[0]
        +		}
        +		return
        +	}
        +
        +	var kx int
        +	if incX < 0 {
        +		kx = -(n - 1) * incX
        +	}
        +	nonUnit := d == blas.NonUnit
        +	if tA == blas.NoTrans {
        +		if ul == blas.Upper {
        +			if incX == 1 {
        +				for i := n - 1; i >= 0; i-- {
        +					var sum float32
        +					atmp := a[i*lda+i+1 : i*lda+n]
        +					for j, v := range atmp {
        +						jv := i + j + 1
        +						sum += x[jv] * v
        +					}
        +					x[i] -= sum
        +					if nonUnit {
        +						x[i] /= a[i*lda+i]
        +					}
        +				}
        +				return
        +			}
        +			ix := kx + (n-1)*incX
        +			for i := n - 1; i >= 0; i-- {
        +				var sum float32
        +				jx := ix + incX
        +				atmp := a[i*lda+i+1 : i*lda+n]
        +				for _, v := range atmp {
        +					sum += x[jx] * v
        +					jx += incX
        +				}
        +				x[ix] -= sum
        +				if nonUnit {
        +					x[ix] /= a[i*lda+i]
        +				}
        +				ix -= incX
        +			}
        +			return
        +		}
        +		if incX == 1 {
        +			for i := 0; i < n; i++ {
        +				var sum float32
        +				atmp := a[i*lda : i*lda+i]
        +				for j, v := range atmp {
        +					sum += x[j] * v
        +				}
        +				x[i] -= sum
        +				if nonUnit {
        +					x[i] /= a[i*lda+i]
        +				}
        +			}
        +			return
        +		}
        +		ix := kx
        +		for i := 0; i < n; i++ {
        +			jx := kx
        +			var sum float32
        +			atmp := a[i*lda : i*lda+i]
        +			for _, v := range atmp {
        +				sum += x[jx] * v
        +				jx += incX
        +			}
        +			x[ix] -= sum
        +			if nonUnit {
        +				x[ix] /= a[i*lda+i]
        +			}
        +			ix += incX
        +		}
        +		return
        +	}
        +	// Cases where a is transposed.
        +	if ul == blas.Upper {
        +		if incX == 1 {
        +			for i := 0; i < n; i++ {
        +				if nonUnit {
        +					x[i] /= a[i*lda+i]
        +				}
        +				xi := x[i]
        +				atmp := a[i*lda+i+1 : i*lda+n]
        +				for j, v := range atmp {
        +					jv := j + i + 1
        +					x[jv] -= v * xi
        +				}
        +			}
        +			return
        +		}
        +		ix := kx
        +		for i := 0; i < n; i++ {
        +			if nonUnit {
        +				x[ix] /= a[i*lda+i]
        +			}
        +			xi := x[ix]
        +			jx := kx + (i+1)*incX
        +			atmp := a[i*lda+i+1 : i*lda+n]
        +			for _, v := range atmp {
        +				x[jx] -= v * xi
        +				jx += incX
        +			}
        +			ix += incX
        +		}
        +		return
        +	}
        +	if incX == 1 {
        +		for i := n - 1; i >= 0; i-- {
        +			if nonUnit {
        +				x[i] /= a[i*lda+i]
        +			}
        +			xi := x[i]
        +			atmp := a[i*lda : i*lda+i]
        +			for j, v := range atmp {
        +				x[j] -= v * xi
        +			}
        +		}
        +		return
        +	}
        +	ix := kx + (n-1)*incX
        +	for i := n - 1; i >= 0; i-- {
        +		if nonUnit {
        +			x[ix] /= a[i*lda+i]
        +		}
        +		xi := x[ix]
        +		jx := kx
        +		atmp := a[i*lda : i*lda+i]
        +		for _, v := range atmp {
        +			x[jx] -= v * xi
        +			jx += incX
        +		}
        +		ix -= incX
        +	}
        +}
        +
        +// Ssymv performs the matrix-vector operation
        +//  y = alpha * A * x + beta * y
        +// where A is an n×n symmetric matrix, x and y are vectors, and alpha and
        +// beta are scalars.
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Ssymv(ul blas.Uplo, n int, alpha float32, a []float32, lda int, x []float32, incX int, beta float32, y []float32, incY int) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(n-1)+n {
        +		panic(shortA)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 && beta == 1 {
        +		return
        +	}
        +
        +	// Set up start points
        +	var kx, ky int
        +	if incX < 0 {
        +		kx = -(n - 1) * incX
        +	}
        +	if incY < 0 {
        +		ky = -(n - 1) * incY
        +	}
        +
        +	// Form y = beta * y
        +	if beta != 1 {
        +		if incY == 1 {
        +			if beta == 0 {
        +				for i := range y[:n] {
        +					y[i] = 0
        +				}
        +			} else {
        +				f32.ScalUnitary(beta, y[:n])
        +			}
        +		} else {
        +			iy := ky
        +			if beta == 0 {
        +				for i := 0; i < n; i++ {
        +					y[iy] = 0
        +					iy += incY
        +				}
        +			} else {
        +				if incY > 0 {
        +					f32.ScalInc(beta, y, uintptr(n), uintptr(incY))
        +				} else {
        +					f32.ScalInc(beta, y, uintptr(n), uintptr(-incY))
        +				}
        +			}
        +		}
        +	}
        +
        +	if alpha == 0 {
        +		return
        +	}
        +
        +	if n == 1 {
        +		y[0] += alpha * a[0] * x[0]
        +		return
        +	}
        +
        +	if ul == blas.Upper {
        +		if incX == 1 {
        +			iy := ky
        +			for i := 0; i < n; i++ {
        +				xv := x[i] * alpha
        +				sum := x[i] * a[i*lda+i]
        +				jy := ky + (i+1)*incY
        +				atmp := a[i*lda+i+1 : i*lda+n]
        +				for j, v := range atmp {
        +					jp := j + i + 1
        +					sum += x[jp] * v
        +					y[jy] += xv * v
        +					jy += incY
        +				}
        +				y[iy] += alpha * sum
        +				iy += incY
        +			}
        +			return
        +		}
        +		ix := kx
        +		iy := ky
        +		for i := 0; i < n; i++ {
        +			xv := x[ix] * alpha
        +			sum := x[ix] * a[i*lda+i]
        +			jx := kx + (i+1)*incX
        +			jy := ky + (i+1)*incY
        +			atmp := a[i*lda+i+1 : i*lda+n]
        +			for _, v := range atmp {
        +				sum += x[jx] * v
        +				y[jy] += xv * v
        +				jx += incX
        +				jy += incY
        +			}
        +			y[iy] += alpha * sum
        +			ix += incX
        +			iy += incY
        +		}
        +		return
        +	}
        +	// Cases where a is lower triangular.
        +	if incX == 1 {
        +		iy := ky
        +		for i := 0; i < n; i++ {
        +			jy := ky
        +			xv := alpha * x[i]
        +			atmp := a[i*lda : i*lda+i]
        +			var sum float32
        +			for j, v := range atmp {
        +				sum += x[j] * v
        +				y[jy] += xv * v
        +				jy += incY
        +			}
        +			sum += x[i] * a[i*lda+i]
        +			sum *= alpha
        +			y[iy] += sum
        +			iy += incY
        +		}
        +		return
        +	}
        +	ix := kx
        +	iy := ky
        +	for i := 0; i < n; i++ {
        +		jx := kx
        +		jy := ky
        +		xv := alpha * x[ix]
        +		atmp := a[i*lda : i*lda+i]
        +		var sum float32
        +		for _, v := range atmp {
        +			sum += x[jx] * v
        +			y[jy] += xv * v
        +			jx += incX
        +			jy += incY
        +		}
        +		sum += x[ix] * a[i*lda+i]
        +		sum *= alpha
        +		y[iy] += sum
        +		ix += incX
        +		iy += incY
        +	}
        +}
        +
        +// Stbmv performs one of the matrix-vector operations
        +//  x = A * x   if tA == blas.NoTrans
        +//  x = Aᵀ * x  if tA == blas.Trans or blas.ConjTrans
        +// where A is an n×n triangular band matrix with k+1 diagonals, and x is a vector.
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Stbmv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n, k int, a []float32, lda int, x []float32, incX int) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        +		panic(badTranspose)
        +	}
        +	if d != blas.NonUnit && d != blas.Unit {
        +		panic(badDiag)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if k < 0 {
        +		panic(kLT0)
        +	}
        +	if lda < k+1 {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(n-1)+k+1 {
        +		panic(shortA)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +
        +	var kx int
        +	if incX < 0 {
        +		kx = -(n - 1) * incX
        +	}
        +
        +	nonunit := d != blas.Unit
        +
        +	if tA == blas.NoTrans {
        +		if ul == blas.Upper {
        +			if incX == 1 {
        +				for i := 0; i < n; i++ {
        +					u := min(1+k, n-i)
        +					var sum float32
        +					atmp := a[i*lda:]
        +					xtmp := x[i:]
        +					for j := 1; j < u; j++ {
        +						sum += xtmp[j] * atmp[j]
        +					}
        +					if nonunit {
        +						sum += xtmp[0] * atmp[0]
        +					} else {
        +						sum += xtmp[0]
        +					}
        +					x[i] = sum
        +				}
        +				return
        +			}
        +			ix := kx
        +			for i := 0; i < n; i++ {
        +				u := min(1+k, n-i)
        +				var sum float32
        +				atmp := a[i*lda:]
        +				jx := incX
        +				for j := 1; j < u; j++ {
        +					sum += x[ix+jx] * atmp[j]
        +					jx += incX
        +				}
        +				if nonunit {
        +					sum += x[ix] * atmp[0]
        +				} else {
        +					sum += x[ix]
        +				}
        +				x[ix] = sum
        +				ix += incX
        +			}
        +			return
        +		}
        +		if incX == 1 {
        +			for i := n - 1; i >= 0; i-- {
        +				l := max(0, k-i)
        +				atmp := a[i*lda:]
        +				var sum float32
        +				for j := l; j < k; j++ {
        +					sum += x[i-k+j] * atmp[j]
        +				}
        +				if nonunit {
        +					sum += x[i] * atmp[k]
        +				} else {
        +					sum += x[i]
        +				}
        +				x[i] = sum
        +			}
        +			return
        +		}
        +		ix := kx + (n-1)*incX
        +		for i := n - 1; i >= 0; i-- {
        +			l := max(0, k-i)
        +			atmp := a[i*lda:]
        +			var sum float32
        +			jx := l * incX
        +			for j := l; j < k; j++ {
        +				sum += x[ix-k*incX+jx] * atmp[j]
        +				jx += incX
        +			}
        +			if nonunit {
        +				sum += x[ix] * atmp[k]
        +			} else {
        +				sum += x[ix]
        +			}
        +			x[ix] = sum
        +			ix -= incX
        +		}
        +		return
        +	}
        +	if ul == blas.Upper {
        +		if incX == 1 {
        +			for i := n - 1; i >= 0; i-- {
        +				u := k + 1
        +				if i < u {
        +					u = i + 1
        +				}
        +				var sum float32
        +				for j := 1; j < u; j++ {
        +					sum += x[i-j] * a[(i-j)*lda+j]
        +				}
        +				if nonunit {
        +					sum += x[i] * a[i*lda]
        +				} else {
        +					sum += x[i]
        +				}
        +				x[i] = sum
        +			}
        +			return
        +		}
        +		ix := kx + (n-1)*incX
        +		for i := n - 1; i >= 0; i-- {
        +			u := k + 1
        +			if i < u {
        +				u = i + 1
        +			}
        +			var sum float32
        +			jx := incX
        +			for j := 1; j < u; j++ {
        +				sum += x[ix-jx] * a[(i-j)*lda+j]
        +				jx += incX
        +			}
        +			if nonunit {
        +				sum += x[ix] * a[i*lda]
        +			} else {
        +				sum += x[ix]
        +			}
        +			x[ix] = sum
        +			ix -= incX
        +		}
        +		return
        +	}
        +	if incX == 1 {
        +		for i := 0; i < n; i++ {
        +			u := k
        +			if i+k >= n {
        +				u = n - i - 1
        +			}
        +			var sum float32
        +			for j := 0; j < u; j++ {
        +				sum += x[i+j+1] * a[(i+j+1)*lda+k-j-1]
        +			}
        +			if nonunit {
        +				sum += x[i] * a[i*lda+k]
        +			} else {
        +				sum += x[i]
        +			}
        +			x[i] = sum
        +		}
        +		return
        +	}
        +	ix := kx
        +	for i := 0; i < n; i++ {
        +		u := k
        +		if i+k >= n {
        +			u = n - i - 1
        +		}
        +		var (
        +			sum float32
        +			jx  int
        +		)
        +		for j := 0; j < u; j++ {
        +			sum += x[ix+jx+incX] * a[(i+j+1)*lda+k-j-1]
        +			jx += incX
        +		}
        +		if nonunit {
        +			sum += x[ix] * a[i*lda+k]
        +		} else {
        +			sum += x[ix]
        +		}
        +		x[ix] = sum
        +		ix += incX
        +	}
        +}
        +
        +// Stpmv performs one of the matrix-vector operations
        +//  x = A * x   if tA == blas.NoTrans
        +//  x = Aᵀ * x  if tA == blas.Trans or blas.ConjTrans
        +// where A is an n×n triangular matrix in packed format, and x is a vector.
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Stpmv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, ap []float32, x []float32, incX int) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        +		panic(badTranspose)
        +	}
        +	if d != blas.NonUnit && d != blas.Unit {
        +		panic(badDiag)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(ap) < n*(n+1)/2 {
        +		panic(shortAP)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +
        +	var kx int
        +	if incX < 0 {
        +		kx = -(n - 1) * incX
        +	}
        +
        +	nonUnit := d == blas.NonUnit
        +	var offset int // Offset is the index of (i,i)
        +	if tA == blas.NoTrans {
        +		if ul == blas.Upper {
        +			if incX == 1 {
        +				for i := 0; i < n; i++ {
        +					xi := x[i]
        +					if nonUnit {
        +						xi *= ap[offset]
        +					}
        +					atmp := ap[offset+1 : offset+n-i]
        +					xtmp := x[i+1:]
        +					for j, v := range atmp {
        +						xi += v * xtmp[j]
        +					}
        +					x[i] = xi
        +					offset += n - i
        +				}
        +				return
        +			}
        +			ix := kx
        +			for i := 0; i < n; i++ {
        +				xix := x[ix]
        +				if nonUnit {
        +					xix *= ap[offset]
        +				}
        +				atmp := ap[offset+1 : offset+n-i]
        +				jx := kx + (i+1)*incX
        +				for _, v := range atmp {
        +					xix += v * x[jx]
        +					jx += incX
        +				}
        +				x[ix] = xix
        +				offset += n - i
        +				ix += incX
        +			}
        +			return
        +		}
        +		if incX == 1 {
        +			offset = n*(n+1)/2 - 1
        +			for i := n - 1; i >= 0; i-- {
        +				xi := x[i]
        +				if nonUnit {
        +					xi *= ap[offset]
        +				}
        +				atmp := ap[offset-i : offset]
        +				for j, v := range atmp {
        +					xi += v * x[j]
        +				}
        +				x[i] = xi
        +				offset -= i + 1
        +			}
        +			return
        +		}
        +		ix := kx + (n-1)*incX
        +		offset = n*(n+1)/2 - 1
        +		for i := n - 1; i >= 0; i-- {
        +			xix := x[ix]
        +			if nonUnit {
        +				xix *= ap[offset]
        +			}
        +			atmp := ap[offset-i : offset]
        +			jx := kx
        +			for _, v := range atmp {
        +				xix += v * x[jx]
        +				jx += incX
        +			}
        +			x[ix] = xix
        +			offset -= i + 1
        +			ix -= incX
        +		}
        +		return
        +	}
        +	// Cases where ap is transposed.
        +	if ul == blas.Upper {
        +		if incX == 1 {
        +			offset = n*(n+1)/2 - 1
        +			for i := n - 1; i >= 0; i-- {
        +				xi := x[i]
        +				atmp := ap[offset+1 : offset+n-i]
        +				xtmp := x[i+1:]
        +				for j, v := range atmp {
        +					xtmp[j] += v * xi
        +				}
        +				if nonUnit {
        +					x[i] *= ap[offset]
        +				}
        +				offset -= n - i + 1
        +			}
        +			return
        +		}
        +		ix := kx + (n-1)*incX
        +		offset = n*(n+1)/2 - 1
        +		for i := n - 1; i >= 0; i-- {
        +			xix := x[ix]
        +			jx := kx + (i+1)*incX
        +			atmp := ap[offset+1 : offset+n-i]
        +			for _, v := range atmp {
        +				x[jx] += v * xix
        +				jx += incX
        +			}
        +			if nonUnit {
        +				x[ix] *= ap[offset]
        +			}
        +			offset -= n - i + 1
        +			ix -= incX
        +		}
        +		return
        +	}
        +	if incX == 1 {
        +		for i := 0; i < n; i++ {
        +			xi := x[i]
        +			atmp := ap[offset-i : offset]
        +			for j, v := range atmp {
        +				x[j] += v * xi
        +			}
        +			if nonUnit {
        +				x[i] *= ap[offset]
        +			}
        +			offset += i + 2
        +		}
        +		return
        +	}
        +	ix := kx
        +	for i := 0; i < n; i++ {
        +		xix := x[ix]
        +		jx := kx
        +		atmp := ap[offset-i : offset]
        +		for _, v := range atmp {
        +			x[jx] += v * xix
        +			jx += incX
        +		}
        +		if nonUnit {
        +			x[ix] *= ap[offset]
        +		}
        +		ix += incX
        +		offset += i + 2
        +	}
        +}
        +
        +// Stbsv solves one of the systems of equations
        +//  A * x = b   if tA == blas.NoTrans
        +//  Aᵀ * x = b  if tA == blas.Trans or tA == blas.ConjTrans
        +// where A is an n×n triangular band matrix with k+1 diagonals,
        +// and x and b are vectors.
        +//
        +// At entry to the function, x contains the values of b, and the result is
        +// stored in-place into x.
        +//
        +// No test for singularity or near-singularity is included in this
        +// routine. Such tests must be performed before calling this routine.
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Stbsv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n, k int, a []float32, lda int, x []float32, incX int) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        +		panic(badTranspose)
        +	}
        +	if d != blas.NonUnit && d != blas.Unit {
        +		panic(badDiag)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if k < 0 {
        +		panic(kLT0)
        +	}
        +	if lda < k+1 {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(n-1)+k+1 {
        +		panic(shortA)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +
        +	var kx int
        +	if incX < 0 {
        +		kx = -(n - 1) * incX
        +	}
        +	nonUnit := d == blas.NonUnit
        +	// Form x = A^-1 x.
        +	// Several cases below use subslices for speed improvement.
        +	// The incX != 1 cases usually do not because incX may be negative.
        +	if tA == blas.NoTrans {
        +		if ul == blas.Upper {
        +			if incX == 1 {
        +				for i := n - 1; i >= 0; i-- {
        +					bands := k
        +					if i+bands >= n {
        +						bands = n - i - 1
        +					}
        +					atmp := a[i*lda+1:]
        +					xtmp := x[i+1 : i+bands+1]
        +					var sum float32
        +					for j, v := range xtmp {
        +						sum += v * atmp[j]
        +					}
        +					x[i] -= sum
        +					if nonUnit {
        +						x[i] /= a[i*lda]
        +					}
        +				}
        +				return
        +			}
        +			ix := kx + (n-1)*incX
        +			for i := n - 1; i >= 0; i-- {
        +				max := k + 1
        +				if i+max > n {
        +					max = n - i
        +				}
        +				atmp := a[i*lda:]
        +				var (
        +					jx  int
        +					sum float32
        +				)
        +				for j := 1; j < max; j++ {
        +					jx += incX
        +					sum += x[ix+jx] * atmp[j]
        +				}
        +				x[ix] -= sum
        +				if nonUnit {
        +					x[ix] /= atmp[0]
        +				}
        +				ix -= incX
        +			}
        +			return
        +		}
        +		if incX == 1 {
        +			for i := 0; i < n; i++ {
        +				bands := k
        +				if i-k < 0 {
        +					bands = i
        +				}
        +				atmp := a[i*lda+k-bands:]
        +				xtmp := x[i-bands : i]
        +				var sum float32
        +				for j, v := range xtmp {
        +					sum += v * atmp[j]
        +				}
        +				x[i] -= sum
        +				if nonUnit {
        +					x[i] /= atmp[bands]
        +				}
        +			}
        +			return
        +		}
        +		ix := kx
        +		for i := 0; i < n; i++ {
        +			bands := k
        +			if i-k < 0 {
        +				bands = i
        +			}
        +			atmp := a[i*lda+k-bands:]
        +			var (
        +				sum float32
        +				jx  int
        +			)
        +			for j := 0; j < bands; j++ {
        +				sum += x[ix-bands*incX+jx] * atmp[j]
        +				jx += incX
        +			}
        +			x[ix] -= sum
        +			if nonUnit {
        +				x[ix] /= atmp[bands]
        +			}
        +			ix += incX
        +		}
        +		return
        +	}
        +	// Cases where a is transposed.
        +	if ul == blas.Upper {
        +		if incX == 1 {
        +			for i := 0; i < n; i++ {
        +				bands := k
        +				if i-k < 0 {
        +					bands = i
        +				}
        +				var sum float32
        +				for j := 0; j < bands; j++ {
        +					sum += x[i-bands+j] * a[(i-bands+j)*lda+bands-j]
        +				}
        +				x[i] -= sum
        +				if nonUnit {
        +					x[i] /= a[i*lda]
        +				}
        +			}
        +			return
        +		}
        +		ix := kx
        +		for i := 0; i < n; i++ {
        +			bands := k
        +			if i-k < 0 {
        +				bands = i
        +			}
        +			var (
        +				sum float32
        +				jx  int
        +			)
        +			for j := 0; j < bands; j++ {
        +				sum += x[ix-bands*incX+jx] * a[(i-bands+j)*lda+bands-j]
        +				jx += incX
        +			}
        +			x[ix] -= sum
        +			if nonUnit {
        +				x[ix] /= a[i*lda]
        +			}
        +			ix += incX
        +		}
        +		return
        +	}
        +	if incX == 1 {
        +		for i := n - 1; i >= 0; i-- {
        +			bands := k
        +			if i+bands >= n {
        +				bands = n - i - 1
        +			}
        +			var sum float32
        +			xtmp := x[i+1 : i+1+bands]
        +			for j, v := range xtmp {
        +				sum += v * a[(i+j+1)*lda+k-j-1]
        +			}
        +			x[i] -= sum
        +			if nonUnit {
        +				x[i] /= a[i*lda+k]
        +			}
        +		}
        +		return
        +	}
        +	ix := kx + (n-1)*incX
        +	for i := n - 1; i >= 0; i-- {
        +		bands := k
        +		if i+bands >= n {
        +			bands = n - i - 1
        +		}
        +		var (
        +			sum float32
        +			jx  int
        +		)
        +		for j := 0; j < bands; j++ {
        +			sum += x[ix+jx+incX] * a[(i+j+1)*lda+k-j-1]
        +			jx += incX
        +		}
        +		x[ix] -= sum
        +		if nonUnit {
        +			x[ix] /= a[i*lda+k]
        +		}
        +		ix -= incX
        +	}
        +}
        +
        +// Ssbmv performs the matrix-vector operation
        +//  y = alpha * A * x + beta * y
        +// where A is an n×n symmetric band matrix with k super-diagonals, x and y are
        +// vectors, and alpha and beta are scalars.
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Ssbmv(ul blas.Uplo, n, k int, alpha float32, a []float32, lda int, x []float32, incX int, beta float32, y []float32, incY int) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if k < 0 {
        +		panic(kLT0)
        +	}
        +	if lda < k+1 {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(n-1)+k+1 {
        +		panic(shortA)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 && beta == 1 {
        +		return
        +	}
        +
        +	// Set up indexes
        +	lenX := n
        +	lenY := n
        +	var kx, ky int
        +	if incX < 0 {
        +		kx = -(lenX - 1) * incX
        +	}
        +	if incY < 0 {
        +		ky = -(lenY - 1) * incY
        +	}
        +
        +	// Form y = beta * y.
        +	if beta != 1 {
        +		if incY == 1 {
        +			if beta == 0 {
        +				for i := range y[:n] {
        +					y[i] = 0
        +				}
        +			} else {
        +				f32.ScalUnitary(beta, y[:n])
        +			}
        +		} else {
        +			iy := ky
        +			if beta == 0 {
        +				for i := 0; i < n; i++ {
        +					y[iy] = 0
        +					iy += incY
        +				}
        +			} else {
        +				if incY > 0 {
        +					f32.ScalInc(beta, y, uintptr(n), uintptr(incY))
        +				} else {
        +					f32.ScalInc(beta, y, uintptr(n), uintptr(-incY))
        +				}
        +			}
        +		}
        +	}
        +
        +	if alpha == 0 {
        +		return
        +	}
        +
        +	if ul == blas.Upper {
        +		if incX == 1 {
        +			iy := ky
        +			for i := 0; i < n; i++ {
        +				atmp := a[i*lda:]
        +				tmp := alpha * x[i]
        +				sum := tmp * atmp[0]
        +				u := min(k, n-i-1)
        +				jy := incY
        +				for j := 1; j <= u; j++ {
        +					v := atmp[j]
        +					sum += alpha * x[i+j] * v
        +					y[iy+jy] += tmp * v
        +					jy += incY
        +				}
        +				y[iy] += sum
        +				iy += incY
        +			}
        +			return
        +		}
        +		ix := kx
        +		iy := ky
        +		for i := 0; i < n; i++ {
        +			atmp := a[i*lda:]
        +			tmp := alpha * x[ix]
        +			sum := tmp * atmp[0]
        +			u := min(k, n-i-1)
        +			jx := incX
        +			jy := incY
        +			for j := 1; j <= u; j++ {
        +				v := atmp[j]
        +				sum += alpha * x[ix+jx] * v
        +				y[iy+jy] += tmp * v
        +				jx += incX
        +				jy += incY
        +			}
        +			y[iy] += sum
        +			ix += incX
        +			iy += incY
        +		}
        +		return
        +	}
        +
        +	// Casses where a has bands below the diagonal.
        +	if incX == 1 {
        +		iy := ky
        +		for i := 0; i < n; i++ {
        +			l := max(0, k-i)
        +			tmp := alpha * x[i]
        +			jy := l * incY
        +			atmp := a[i*lda:]
        +			for j := l; j < k; j++ {
        +				v := atmp[j]
        +				y[iy] += alpha * v * x[i-k+j]
        +				y[iy-k*incY+jy] += tmp * v
        +				jy += incY
        +			}
        +			y[iy] += tmp * atmp[k]
        +			iy += incY
        +		}
        +		return
        +	}
        +	ix := kx
        +	iy := ky
        +	for i := 0; i < n; i++ {
        +		l := max(0, k-i)
        +		tmp := alpha * x[ix]
        +		jx := l * incX
        +		jy := l * incY
        +		atmp := a[i*lda:]
        +		for j := l; j < k; j++ {
        +			v := atmp[j]
        +			y[iy] += alpha * v * x[ix-k*incX+jx]
        +			y[iy-k*incY+jy] += tmp * v
        +			jx += incX
        +			jy += incY
        +		}
        +		y[iy] += tmp * atmp[k]
        +		ix += incX
        +		iy += incY
        +	}
        +}
        +
        +// Ssyr performs the symmetric rank-one update
        +//  A += alpha * x * xᵀ
        +// where A is an n×n symmetric matrix, and x is a vector.
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Ssyr(ul blas.Uplo, n int, alpha float32, x []float32, incX int, a []float32, lda int) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if len(a) < lda*(n-1)+n {
        +		panic(shortA)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 {
        +		return
        +	}
        +
        +	lenX := n
        +	var kx int
        +	if incX < 0 {
        +		kx = -(lenX - 1) * incX
        +	}
        +	if ul == blas.Upper {
        +		if incX == 1 {
        +			for i := 0; i < n; i++ {
        +				tmp := x[i] * alpha
        +				if tmp != 0 {
        +					atmp := a[i*lda+i : i*lda+n]
        +					xtmp := x[i:n]
        +					for j, v := range xtmp {
        +						atmp[j] += v * tmp
        +					}
        +				}
        +			}
        +			return
        +		}
        +		ix := kx
        +		for i := 0; i < n; i++ {
        +			tmp := x[ix] * alpha
        +			if tmp != 0 {
        +				jx := ix
        +				atmp := a[i*lda:]
        +				for j := i; j < n; j++ {
        +					atmp[j] += x[jx] * tmp
        +					jx += incX
        +				}
        +			}
        +			ix += incX
        +		}
        +		return
        +	}
        +	// Cases where a is lower triangular.
        +	if incX == 1 {
        +		for i := 0; i < n; i++ {
        +			tmp := x[i] * alpha
        +			if tmp != 0 {
        +				atmp := a[i*lda:]
        +				xtmp := x[:i+1]
        +				for j, v := range xtmp {
        +					atmp[j] += tmp * v
        +				}
        +			}
        +		}
        +		return
        +	}
        +	ix := kx
        +	for i := 0; i < n; i++ {
        +		tmp := x[ix] * alpha
        +		if tmp != 0 {
        +			atmp := a[i*lda:]
        +			jx := kx
        +			for j := 0; j < i+1; j++ {
        +				atmp[j] += tmp * x[jx]
        +				jx += incX
        +			}
        +		}
        +		ix += incX
        +	}
        +}
        +
        +// Ssyr2 performs the symmetric rank-two update
        +//  A += alpha * x * yᵀ + alpha * y * xᵀ
        +// where A is an n×n symmetric matrix, x and y are vectors, and alpha is a scalar.
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Ssyr2(ul blas.Uplo, n int, alpha float32, x []float32, incX int, y []float32, incY int, a []float32, lda int) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +	if len(a) < lda*(n-1)+n {
        +		panic(shortA)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 {
        +		return
        +	}
        +
        +	var ky, kx int
        +	if incY < 0 {
        +		ky = -(n - 1) * incY
        +	}
        +	if incX < 0 {
        +		kx = -(n - 1) * incX
        +	}
        +	if ul == blas.Upper {
        +		if incX == 1 && incY == 1 {
        +			for i := 0; i < n; i++ {
        +				xi := x[i]
        +				yi := y[i]
        +				atmp := a[i*lda:]
        +				for j := i; j < n; j++ {
        +					atmp[j] += alpha * (xi*y[j] + x[j]*yi)
        +				}
        +			}
        +			return
        +		}
        +		ix := kx
        +		iy := ky
        +		for i := 0; i < n; i++ {
        +			jx := kx + i*incX
        +			jy := ky + i*incY
        +			xi := x[ix]
        +			yi := y[iy]
        +			atmp := a[i*lda:]
        +			for j := i; j < n; j++ {
        +				atmp[j] += alpha * (xi*y[jy] + x[jx]*yi)
        +				jx += incX
        +				jy += incY
        +			}
        +			ix += incX
        +			iy += incY
        +		}
        +		return
        +	}
        +	if incX == 1 && incY == 1 {
        +		for i := 0; i < n; i++ {
        +			xi := x[i]
        +			yi := y[i]
        +			atmp := a[i*lda:]
        +			for j := 0; j <= i; j++ {
        +				atmp[j] += alpha * (xi*y[j] + x[j]*yi)
        +			}
        +		}
        +		return
        +	}
        +	ix := kx
        +	iy := ky
        +	for i := 0; i < n; i++ {
        +		jx := kx
        +		jy := ky
        +		xi := x[ix]
        +		yi := y[iy]
        +		atmp := a[i*lda:]
        +		for j := 0; j <= i; j++ {
        +			atmp[j] += alpha * (xi*y[jy] + x[jx]*yi)
        +			jx += incX
        +			jy += incY
        +		}
        +		ix += incX
        +		iy += incY
        +	}
        +}
        +
        +// Stpsv solves one of the systems of equations
        +//  A * x = b   if tA == blas.NoTrans
        +//  Aᵀ * x = b  if tA == blas.Trans or blas.ConjTrans
        +// where A is an n×n triangular matrix in packed format, and x and b are vectors.
        +//
        +// At entry to the function, x contains the values of b, and the result is
        +// stored in-place into x.
        +//
        +// No test for singularity or near-singularity is included in this
        +// routine. Such tests must be performed before calling this routine.
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Stpsv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, ap []float32, x []float32, incX int) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        +		panic(badTranspose)
        +	}
        +	if d != blas.NonUnit && d != blas.Unit {
        +		panic(badDiag)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(ap) < n*(n+1)/2 {
        +		panic(shortAP)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +
        +	var kx int
        +	if incX < 0 {
        +		kx = -(n - 1) * incX
        +	}
        +
        +	nonUnit := d == blas.NonUnit
        +	var offset int // Offset is the index of (i,i)
        +	if tA == blas.NoTrans {
        +		if ul == blas.Upper {
        +			offset = n*(n+1)/2 - 1
        +			if incX == 1 {
        +				for i := n - 1; i >= 0; i-- {
        +					atmp := ap[offset+1 : offset+n-i]
        +					xtmp := x[i+1:]
        +					var sum float32
        +					for j, v := range atmp {
        +						sum += v * xtmp[j]
        +					}
        +					x[i] -= sum
        +					if nonUnit {
        +						x[i] /= ap[offset]
        +					}
        +					offset -= n - i + 1
        +				}
        +				return
        +			}
        +			ix := kx + (n-1)*incX
        +			for i := n - 1; i >= 0; i-- {
        +				atmp := ap[offset+1 : offset+n-i]
        +				jx := kx + (i+1)*incX
        +				var sum float32
        +				for _, v := range atmp {
        +					sum += v * x[jx]
        +					jx += incX
        +				}
        +				x[ix] -= sum
        +				if nonUnit {
        +					x[ix] /= ap[offset]
        +				}
        +				ix -= incX
        +				offset -= n - i + 1
        +			}
        +			return
        +		}
        +		if incX == 1 {
        +			for i := 0; i < n; i++ {
        +				atmp := ap[offset-i : offset]
        +				var sum float32
        +				for j, v := range atmp {
        +					sum += v * x[j]
        +				}
        +				x[i] -= sum
        +				if nonUnit {
        +					x[i] /= ap[offset]
        +				}
        +				offset += i + 2
        +			}
        +			return
        +		}
        +		ix := kx
        +		for i := 0; i < n; i++ {
        +			jx := kx
        +			atmp := ap[offset-i : offset]
        +			var sum float32
        +			for _, v := range atmp {
        +				sum += v * x[jx]
        +				jx += incX
        +			}
        +			x[ix] -= sum
        +			if nonUnit {
        +				x[ix] /= ap[offset]
        +			}
        +			ix += incX
        +			offset += i + 2
        +		}
        +		return
        +	}
        +	// Cases where ap is transposed.
        +	if ul == blas.Upper {
        +		if incX == 1 {
        +			for i := 0; i < n; i++ {
        +				if nonUnit {
        +					x[i] /= ap[offset]
        +				}
        +				xi := x[i]
        +				atmp := ap[offset+1 : offset+n-i]
        +				xtmp := x[i+1:]
        +				for j, v := range atmp {
        +					xtmp[j] -= v * xi
        +				}
        +				offset += n - i
        +			}
        +			return
        +		}
        +		ix := kx
        +		for i := 0; i < n; i++ {
        +			if nonUnit {
        +				x[ix] /= ap[offset]
        +			}
        +			xix := x[ix]
        +			atmp := ap[offset+1 : offset+n-i]
        +			jx := kx + (i+1)*incX
        +			for _, v := range atmp {
        +				x[jx] -= v * xix
        +				jx += incX
        +			}
        +			ix += incX
        +			offset += n - i
        +		}
        +		return
        +	}
        +	if incX == 1 {
        +		offset = n*(n+1)/2 - 1
        +		for i := n - 1; i >= 0; i-- {
        +			if nonUnit {
        +				x[i] /= ap[offset]
        +			}
        +			xi := x[i]
        +			atmp := ap[offset-i : offset]
        +			for j, v := range atmp {
        +				x[j] -= v * xi
        +			}
        +			offset -= i + 1
        +		}
        +		return
        +	}
        +	ix := kx + (n-1)*incX
        +	offset = n*(n+1)/2 - 1
        +	for i := n - 1; i >= 0; i-- {
        +		if nonUnit {
        +			x[ix] /= ap[offset]
        +		}
        +		xix := x[ix]
        +		atmp := ap[offset-i : offset]
        +		jx := kx
        +		for _, v := range atmp {
        +			x[jx] -= v * xix
        +			jx += incX
        +		}
        +		ix -= incX
        +		offset -= i + 1
        +	}
        +}
        +
        +// Sspmv performs the matrix-vector operation
        +//  y = alpha * A * x + beta * y
        +// where A is an n×n symmetric matrix in packed format, x and y are vectors,
        +// and alpha and beta are scalars.
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Sspmv(ul blas.Uplo, n int, alpha float32, ap []float32, x []float32, incX int, beta float32, y []float32, incY int) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(ap) < n*(n+1)/2 {
        +		panic(shortAP)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 && beta == 1 {
        +		return
        +	}
        +
        +	// Set up start points
        +	var kx, ky int
        +	if incX < 0 {
        +		kx = -(n - 1) * incX
        +	}
        +	if incY < 0 {
        +		ky = -(n - 1) * incY
        +	}
        +
        +	// Form y = beta * y.
        +	if beta != 1 {
        +		if incY == 1 {
        +			if beta == 0 {
        +				for i := range y[:n] {
        +					y[i] = 0
        +				}
        +			} else {
        +				f32.ScalUnitary(beta, y[:n])
        +			}
        +		} else {
        +			iy := ky
        +			if beta == 0 {
        +				for i := 0; i < n; i++ {
        +					y[iy] = 0
        +					iy += incY
        +				}
        +			} else {
        +				if incY > 0 {
        +					f32.ScalInc(beta, y, uintptr(n), uintptr(incY))
        +				} else {
        +					f32.ScalInc(beta, y, uintptr(n), uintptr(-incY))
        +				}
        +			}
        +		}
        +	}
        +
        +	if alpha == 0 {
        +		return
        +	}
        +
        +	if n == 1 {
        +		y[0] += alpha * ap[0] * x[0]
        +		return
        +	}
        +	var offset int // Offset is the index of (i,i).
        +	if ul == blas.Upper {
        +		if incX == 1 {
        +			iy := ky
        +			for i := 0; i < n; i++ {
        +				xv := x[i] * alpha
        +				sum := ap[offset] * x[i]
        +				atmp := ap[offset+1 : offset+n-i]
        +				xtmp := x[i+1:]
        +				jy := ky + (i+1)*incY
        +				for j, v := range atmp {
        +					sum += v * xtmp[j]
        +					y[jy] += v * xv
        +					jy += incY
        +				}
        +				y[iy] += alpha * sum
        +				iy += incY
        +				offset += n - i
        +			}
        +			return
        +		}
        +		ix := kx
        +		iy := ky
        +		for i := 0; i < n; i++ {
        +			xv := x[ix] * alpha
        +			sum := ap[offset] * x[ix]
        +			atmp := ap[offset+1 : offset+n-i]
        +			jx := kx + (i+1)*incX
        +			jy := ky + (i+1)*incY
        +			for _, v := range atmp {
        +				sum += v * x[jx]
        +				y[jy] += v * xv
        +				jx += incX
        +				jy += incY
        +			}
        +			y[iy] += alpha * sum
        +			ix += incX
        +			iy += incY
        +			offset += n - i
        +		}
        +		return
        +	}
        +	if incX == 1 {
        +		iy := ky
        +		for i := 0; i < n; i++ {
        +			xv := x[i] * alpha
        +			atmp := ap[offset-i : offset]
        +			jy := ky
        +			var sum float32
        +			for j, v := range atmp {
        +				sum += v * x[j]
        +				y[jy] += v * xv
        +				jy += incY
        +			}
        +			sum += ap[offset] * x[i]
        +			y[iy] += alpha * sum
        +			iy += incY
        +			offset += i + 2
        +		}
        +		return
        +	}
        +	ix := kx
        +	iy := ky
        +	for i := 0; i < n; i++ {
        +		xv := x[ix] * alpha
        +		atmp := ap[offset-i : offset]
        +		jx := kx
        +		jy := ky
        +		var sum float32
        +		for _, v := range atmp {
        +			sum += v * x[jx]
        +			y[jy] += v * xv
        +			jx += incX
        +			jy += incY
        +		}
        +
        +		sum += ap[offset] * x[ix]
        +		y[iy] += alpha * sum
        +		ix += incX
        +		iy += incY
        +		offset += i + 2
        +	}
        +}
        +
        +// Sspr performs the symmetric rank-one operation
        +//  A += alpha * x * xᵀ
        +// where A is an n×n symmetric matrix in packed format, x is a vector, and
        +// alpha is a scalar.
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Sspr(ul blas.Uplo, n int, alpha float32, x []float32, incX int, ap []float32) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if len(ap) < n*(n+1)/2 {
        +		panic(shortAP)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 {
        +		return
        +	}
        +
        +	lenX := n
        +	var kx int
        +	if incX < 0 {
        +		kx = -(lenX - 1) * incX
        +	}
        +	var offset int // Offset is the index of (i,i).
        +	if ul == blas.Upper {
        +		if incX == 1 {
        +			for i := 0; i < n; i++ {
        +				atmp := ap[offset:]
        +				xv := alpha * x[i]
        +				xtmp := x[i:n]
        +				for j, v := range xtmp {
        +					atmp[j] += xv * v
        +				}
        +				offset += n - i
        +			}
        +			return
        +		}
        +		ix := kx
        +		for i := 0; i < n; i++ {
        +			jx := kx + i*incX
        +			atmp := ap[offset:]
        +			xv := alpha * x[ix]
        +			for j := 0; j < n-i; j++ {
        +				atmp[j] += xv * x[jx]
        +				jx += incX
        +			}
        +			ix += incX
        +			offset += n - i
        +		}
        +		return
        +	}
        +	if incX == 1 {
        +		for i := 0; i < n; i++ {
        +			atmp := ap[offset-i:]
        +			xv := alpha * x[i]
        +			xtmp := x[:i+1]
        +			for j, v := range xtmp {
        +				atmp[j] += xv * v
        +			}
        +			offset += i + 2
        +		}
        +		return
        +	}
        +	ix := kx
        +	for i := 0; i < n; i++ {
        +		jx := kx
        +		atmp := ap[offset-i:]
        +		xv := alpha * x[ix]
        +		for j := 0; j <= i; j++ {
        +			atmp[j] += xv * x[jx]
        +			jx += incX
        +		}
        +		ix += incX
        +		offset += i + 2
        +	}
        +}
        +
        +// Sspr2 performs the symmetric rank-2 update
        +//  A += alpha * x * yᵀ + alpha * y * xᵀ
        +// where A is an n×n symmetric matrix in packed format, x and y are vectors,
        +// and alpha is a scalar.
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Sspr2(ul blas.Uplo, n int, alpha float32, x []float32, incX int, y []float32, incY int, ap []float32) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +	if len(ap) < n*(n+1)/2 {
        +		panic(shortAP)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 {
        +		return
        +	}
        +
        +	var ky, kx int
        +	if incY < 0 {
        +		ky = -(n - 1) * incY
        +	}
        +	if incX < 0 {
        +		kx = -(n - 1) * incX
        +	}
        +	var offset int // Offset is the index of (i,i).
        +	if ul == blas.Upper {
        +		if incX == 1 && incY == 1 {
        +			for i := 0; i < n; i++ {
        +				atmp := ap[offset:]
        +				xi := x[i]
        +				yi := y[i]
        +				xtmp := x[i:n]
        +				ytmp := y[i:n]
        +				for j, v := range xtmp {
        +					atmp[j] += alpha * (xi*ytmp[j] + v*yi)
        +				}
        +				offset += n - i
        +			}
        +			return
        +		}
        +		ix := kx
        +		iy := ky
        +		for i := 0; i < n; i++ {
        +			jx := kx + i*incX
        +			jy := ky + i*incY
        +			atmp := ap[offset:]
        +			xi := x[ix]
        +			yi := y[iy]
        +			for j := 0; j < n-i; j++ {
        +				atmp[j] += alpha * (xi*y[jy] + x[jx]*yi)
        +				jx += incX
        +				jy += incY
        +			}
        +			ix += incX
        +			iy += incY
        +			offset += n - i
        +		}
        +		return
        +	}
        +	if incX == 1 && incY == 1 {
        +		for i := 0; i < n; i++ {
        +			atmp := ap[offset-i:]
        +			xi := x[i]
        +			yi := y[i]
        +			xtmp := x[:i+1]
        +			for j, v := range xtmp {
        +				atmp[j] += alpha * (xi*y[j] + v*yi)
        +			}
        +			offset += i + 2
        +		}
        +		return
        +	}
        +	ix := kx
        +	iy := ky
        +	for i := 0; i < n; i++ {
        +		jx := kx
        +		jy := ky
        +		atmp := ap[offset-i:]
        +		for j := 0; j <= i; j++ {
        +			atmp[j] += alpha * (x[ix]*y[jy] + x[jx]*y[iy])
        +			jx += incX
        +			jy += incY
        +		}
        +		ix += incX
        +		iy += incY
        +		offset += i + 2
        +	}
        +}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/level2float64.go b/vendor/gonum.org/v1/gonum/blas/gonum/level2float64.go
        new file mode 100644
        index 000000000..725efca55
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/blas/gonum/level2float64.go
        @@ -0,0 +1,2264 @@
        +// Copyright ©2014 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package gonum
        +
        +import (
        +	"gonum.org/v1/gonum/blas"
        +	"gonum.org/v1/gonum/internal/asm/f64"
        +)
        +
        +var _ blas.Float64Level2 = Implementation{}
        +
        +// Dger performs the rank-one operation
        +//  A += alpha * x * yᵀ
        +// where A is an m×n dense matrix, x and y are vectors, and alpha is a scalar.
        +func (Implementation) Dger(m, n int, alpha float64, x []float64, incX int, y []float64, incY int, a []float64, lda int) {
        +	if m < 0 {
        +		panic(mLT0)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if (incX > 0 && len(x) <= (m-1)*incX) || (incX < 0 && len(x) <= (1-m)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +	if len(a) < lda*(m-1)+n {
        +		panic(shortA)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 {
        +		return
        +	}
        +	f64.Ger(uintptr(m), uintptr(n),
        +		alpha,
        +		x, uintptr(incX),
        +		y, uintptr(incY),
        +		a, uintptr(lda))
        +}
        +
        +// Dgbmv performs one of the matrix-vector operations
        +//  y = alpha * A * x + beta * y   if tA == blas.NoTrans
        +//  y = alpha * Aᵀ * x + beta * y  if tA == blas.Trans or blas.ConjTrans
        +// where A is an m×n band matrix with kL sub-diagonals and kU super-diagonals,
        +// x and y are vectors, and alpha and beta are scalars.
        +func (Implementation) Dgbmv(tA blas.Transpose, m, n, kL, kU int, alpha float64, a []float64, lda int, x []float64, incX int, beta float64, y []float64, incY int) {
        +	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        +		panic(badTranspose)
        +	}
        +	if m < 0 {
        +		panic(mLT0)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if kL < 0 {
        +		panic(kLLT0)
        +	}
        +	if kU < 0 {
        +		panic(kULT0)
        +	}
        +	if lda < kL+kU+1 {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(min(m, n+kL)-1)+kL+kU+1 {
        +		panic(shortA)
        +	}
        +	lenX := m
        +	lenY := n
        +	if tA == blas.NoTrans {
        +		lenX = n
        +		lenY = m
        +	}
        +	if (incX > 0 && len(x) <= (lenX-1)*incX) || (incX < 0 && len(x) <= (1-lenX)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (lenY-1)*incY) || (incY < 0 && len(y) <= (1-lenY)*incY) {
        +		panic(shortY)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 && beta == 1 {
        +		return
        +	}
        +
        +	var kx, ky int
        +	if incX < 0 {
        +		kx = -(lenX - 1) * incX
        +	}
        +	if incY < 0 {
        +		ky = -(lenY - 1) * incY
        +	}
        +
        +	// Form y = beta * y.
        +	if beta != 1 {
        +		if incY == 1 {
        +			if beta == 0 {
        +				for i := range y[:lenY] {
        +					y[i] = 0
        +				}
        +			} else {
        +				f64.ScalUnitary(beta, y[:lenY])
        +			}
        +		} else {
        +			iy := ky
        +			if beta == 0 {
        +				for i := 0; i < lenY; i++ {
        +					y[iy] = 0
        +					iy += incY
        +				}
        +			} else {
        +				if incY > 0 {
        +					f64.ScalInc(beta, y, uintptr(lenY), uintptr(incY))
        +				} else {
        +					f64.ScalInc(beta, y, uintptr(lenY), uintptr(-incY))
        +				}
        +			}
        +		}
        +	}
        +
        +	if alpha == 0 {
        +		return
        +	}
        +
        +	// i and j are indices of the compacted banded matrix.
        +	// off is the offset into the dense matrix (off + j = densej)
        +	nCol := kU + 1 + kL
        +	if tA == blas.NoTrans {
        +		iy := ky
        +		if incX == 1 {
        +			for i := 0; i < min(m, n+kL); i++ {
        +				l := max(0, kL-i)
        +				u := min(nCol, n+kL-i)
        +				off := max(0, i-kL)
        +				atmp := a[i*lda+l : i*lda+u]
        +				xtmp := x[off : off+u-l]
        +				var sum float64
        +				for j, v := range atmp {
        +					sum += xtmp[j] * v
        +				}
        +				y[iy] += sum * alpha
        +				iy += incY
        +			}
        +			return
        +		}
        +		for i := 0; i < min(m, n+kL); i++ {
        +			l := max(0, kL-i)
        +			u := min(nCol, n+kL-i)
        +			off := max(0, i-kL)
        +			atmp := a[i*lda+l : i*lda+u]
        +			jx := kx
        +			var sum float64
        +			for _, v := range atmp {
        +				sum += x[off*incX+jx] * v
        +				jx += incX
        +			}
        +			y[iy] += sum * alpha
        +			iy += incY
        +		}
        +		return
        +	}
        +	if incX == 1 {
        +		for i := 0; i < min(m, n+kL); i++ {
        +			l := max(0, kL-i)
        +			u := min(nCol, n+kL-i)
        +			off := max(0, i-kL)
        +			atmp := a[i*lda+l : i*lda+u]
        +			tmp := alpha * x[i]
        +			jy := ky
        +			for _, v := range atmp {
        +				y[jy+off*incY] += tmp * v
        +				jy += incY
        +			}
        +		}
        +		return
        +	}
        +	ix := kx
        +	for i := 0; i < min(m, n+kL); i++ {
        +		l := max(0, kL-i)
        +		u := min(nCol, n+kL-i)
        +		off := max(0, i-kL)
        +		atmp := a[i*lda+l : i*lda+u]
        +		tmp := alpha * x[ix]
        +		jy := ky
        +		for _, v := range atmp {
        +			y[jy+off*incY] += tmp * v
        +			jy += incY
        +		}
        +		ix += incX
        +	}
        +}
        +
        +// Dtrmv performs one of the matrix-vector operations
        +//  x = A * x   if tA == blas.NoTrans
        +//  x = Aᵀ * x  if tA == blas.Trans or blas.ConjTrans
        +// where A is an n×n triangular matrix, and x is a vector.
        +func (Implementation) Dtrmv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, a []float64, lda int, x []float64, incX int) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        +		panic(badTranspose)
        +	}
        +	if d != blas.NonUnit && d != blas.Unit {
        +		panic(badDiag)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(n-1)+n {
        +		panic(shortA)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +
        +	nonUnit := d != blas.Unit
        +	if n == 1 {
        +		if nonUnit {
        +			x[0] *= a[0]
        +		}
        +		return
        +	}
        +	var kx int
        +	if incX <= 0 {
        +		kx = -(n - 1) * incX
        +	}
        +	if tA == blas.NoTrans {
        +		if ul == blas.Upper {
        +			if incX == 1 {
        +				for i := 0; i < n; i++ {
        +					ilda := i * lda
        +					var tmp float64
        +					if nonUnit {
        +						tmp = a[ilda+i] * x[i]
        +					} else {
        +						tmp = x[i]
        +					}
        +					x[i] = tmp + f64.DotUnitary(a[ilda+i+1:ilda+n], x[i+1:n])
        +				}
        +				return
        +			}
        +			ix := kx
        +			for i := 0; i < n; i++ {
        +				ilda := i * lda
        +				var tmp float64
        +				if nonUnit {
        +					tmp = a[ilda+i] * x[ix]
        +				} else {
        +					tmp = x[ix]
        +				}
        +				x[ix] = tmp + f64.DotInc(x, a[ilda+i+1:ilda+n], uintptr(n-i-1), uintptr(incX), 1, uintptr(ix+incX), 0)
        +				ix += incX
        +			}
        +			return
        +		}
        +		if incX == 1 {
        +			for i := n - 1; i >= 0; i-- {
        +				ilda := i * lda
        +				var tmp float64
        +				if nonUnit {
        +					tmp += a[ilda+i] * x[i]
        +				} else {
        +					tmp = x[i]
        +				}
        +				x[i] = tmp + f64.DotUnitary(a[ilda:ilda+i], x[:i])
        +			}
        +			return
        +		}
        +		ix := kx + (n-1)*incX
        +		for i := n - 1; i >= 0; i-- {
        +			ilda := i * lda
        +			var tmp float64
        +			if nonUnit {
        +				tmp = a[ilda+i] * x[ix]
        +			} else {
        +				tmp = x[ix]
        +			}
        +			x[ix] = tmp + f64.DotInc(x, a[ilda:ilda+i], uintptr(i), uintptr(incX), 1, uintptr(kx), 0)
        +			ix -= incX
        +		}
        +		return
        +	}
        +	// Cases where a is transposed.
        +	if ul == blas.Upper {
        +		if incX == 1 {
        +			for i := n - 1; i >= 0; i-- {
        +				ilda := i * lda
        +				xi := x[i]
        +				f64.AxpyUnitary(xi, a[ilda+i+1:ilda+n], x[i+1:n])
        +				if nonUnit {
        +					x[i] *= a[ilda+i]
        +				}
        +			}
        +			return
        +		}
        +		ix := kx + (n-1)*incX
        +		for i := n - 1; i >= 0; i-- {
        +			ilda := i * lda
        +			xi := x[ix]
        +			f64.AxpyInc(xi, a[ilda+i+1:ilda+n], x, uintptr(n-i-1), 1, uintptr(incX), 0, uintptr(kx+(i+1)*incX))
        +			if nonUnit {
        +				x[ix] *= a[ilda+i]
        +			}
        +			ix -= incX
        +		}
        +		return
        +	}
        +	if incX == 1 {
        +		for i := 0; i < n; i++ {
        +			ilda := i * lda
        +			xi := x[i]
        +			f64.AxpyUnitary(xi, a[ilda:ilda+i], x[:i])
        +			if nonUnit {
        +				x[i] *= a[i*lda+i]
        +			}
        +		}
        +		return
        +	}
        +	ix := kx
        +	for i := 0; i < n; i++ {
        +		ilda := i * lda
        +		xi := x[ix]
        +		f64.AxpyInc(xi, a[ilda:ilda+i], x, uintptr(i), 1, uintptr(incX), 0, uintptr(kx))
        +		if nonUnit {
        +			x[ix] *= a[ilda+i]
        +		}
        +		ix += incX
        +	}
        +}
        +
        +// Dtrsv solves one of the systems of equations
        +//  A * x = b   if tA == blas.NoTrans
        +//  Aᵀ * x = b  if tA == blas.Trans or blas.ConjTrans
        +// where A is an n×n triangular matrix, and x and b are vectors.
        +//
        +// At entry to the function, x contains the values of b, and the result is
        +// stored in-place into x.
        +//
        +// No test for singularity or near-singularity is included in this
        +// routine. Such tests must be performed before calling this routine.
        +func (Implementation) Dtrsv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, a []float64, lda int, x []float64, incX int) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        +		panic(badTranspose)
        +	}
        +	if d != blas.NonUnit && d != blas.Unit {
        +		panic(badDiag)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(n-1)+n {
        +		panic(shortA)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +
        +	if n == 1 {
        +		if d == blas.NonUnit {
        +			x[0] /= a[0]
        +		}
        +		return
        +	}
        +
        +	var kx int
        +	if incX < 0 {
        +		kx = -(n - 1) * incX
        +	}
        +	nonUnit := d == blas.NonUnit
        +	if tA == blas.NoTrans {
        +		if ul == blas.Upper {
        +			if incX == 1 {
        +				for i := n - 1; i >= 0; i-- {
        +					var sum float64
        +					atmp := a[i*lda+i+1 : i*lda+n]
        +					for j, v := range atmp {
        +						jv := i + j + 1
        +						sum += x[jv] * v
        +					}
        +					x[i] -= sum
        +					if nonUnit {
        +						x[i] /= a[i*lda+i]
        +					}
        +				}
        +				return
        +			}
        +			ix := kx + (n-1)*incX
        +			for i := n - 1; i >= 0; i-- {
        +				var sum float64
        +				jx := ix + incX
        +				atmp := a[i*lda+i+1 : i*lda+n]
        +				for _, v := range atmp {
        +					sum += x[jx] * v
        +					jx += incX
        +				}
        +				x[ix] -= sum
        +				if nonUnit {
        +					x[ix] /= a[i*lda+i]
        +				}
        +				ix -= incX
        +			}
        +			return
        +		}
        +		if incX == 1 {
        +			for i := 0; i < n; i++ {
        +				var sum float64
        +				atmp := a[i*lda : i*lda+i]
        +				for j, v := range atmp {
        +					sum += x[j] * v
        +				}
        +				x[i] -= sum
        +				if nonUnit {
        +					x[i] /= a[i*lda+i]
        +				}
        +			}
        +			return
        +		}
        +		ix := kx
        +		for i := 0; i < n; i++ {
        +			jx := kx
        +			var sum float64
        +			atmp := a[i*lda : i*lda+i]
        +			for _, v := range atmp {
        +				sum += x[jx] * v
        +				jx += incX
        +			}
        +			x[ix] -= sum
        +			if nonUnit {
        +				x[ix] /= a[i*lda+i]
        +			}
        +			ix += incX
        +		}
        +		return
        +	}
        +	// Cases where a is transposed.
        +	if ul == blas.Upper {
        +		if incX == 1 {
        +			for i := 0; i < n; i++ {
        +				if nonUnit {
        +					x[i] /= a[i*lda+i]
        +				}
        +				xi := x[i]
        +				atmp := a[i*lda+i+1 : i*lda+n]
        +				for j, v := range atmp {
        +					jv := j + i + 1
        +					x[jv] -= v * xi
        +				}
        +			}
        +			return
        +		}
        +		ix := kx
        +		for i := 0; i < n; i++ {
        +			if nonUnit {
        +				x[ix] /= a[i*lda+i]
        +			}
        +			xi := x[ix]
        +			jx := kx + (i+1)*incX
        +			atmp := a[i*lda+i+1 : i*lda+n]
        +			for _, v := range atmp {
        +				x[jx] -= v * xi
        +				jx += incX
        +			}
        +			ix += incX
        +		}
        +		return
        +	}
        +	if incX == 1 {
        +		for i := n - 1; i >= 0; i-- {
        +			if nonUnit {
        +				x[i] /= a[i*lda+i]
        +			}
        +			xi := x[i]
        +			atmp := a[i*lda : i*lda+i]
        +			for j, v := range atmp {
        +				x[j] -= v * xi
        +			}
        +		}
        +		return
        +	}
        +	ix := kx + (n-1)*incX
        +	for i := n - 1; i >= 0; i-- {
        +		if nonUnit {
        +			x[ix] /= a[i*lda+i]
        +		}
        +		xi := x[ix]
        +		jx := kx
        +		atmp := a[i*lda : i*lda+i]
        +		for _, v := range atmp {
        +			x[jx] -= v * xi
        +			jx += incX
        +		}
        +		ix -= incX
        +	}
        +}
        +
        +// Dsymv performs the matrix-vector operation
        +//  y = alpha * A * x + beta * y
        +// where A is an n×n symmetric matrix, x and y are vectors, and alpha and
        +// beta are scalars.
        +func (Implementation) Dsymv(ul blas.Uplo, n int, alpha float64, a []float64, lda int, x []float64, incX int, beta float64, y []float64, incY int) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(n-1)+n {
        +		panic(shortA)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 && beta == 1 {
        +		return
        +	}
        +
        +	// Set up start points
        +	var kx, ky int
        +	if incX < 0 {
        +		kx = -(n - 1) * incX
        +	}
        +	if incY < 0 {
        +		ky = -(n - 1) * incY
        +	}
        +
        +	// Form y = beta * y
        +	if beta != 1 {
        +		if incY == 1 {
        +			if beta == 0 {
        +				for i := range y[:n] {
        +					y[i] = 0
        +				}
        +			} else {
        +				f64.ScalUnitary(beta, y[:n])
        +			}
        +		} else {
        +			iy := ky
        +			if beta == 0 {
        +				for i := 0; i < n; i++ {
        +					y[iy] = 0
        +					iy += incY
        +				}
        +			} else {
        +				if incY > 0 {
        +					f64.ScalInc(beta, y, uintptr(n), uintptr(incY))
        +				} else {
        +					f64.ScalInc(beta, y, uintptr(n), uintptr(-incY))
        +				}
        +			}
        +		}
        +	}
        +
        +	if alpha == 0 {
        +		return
        +	}
        +
        +	if n == 1 {
        +		y[0] += alpha * a[0] * x[0]
        +		return
        +	}
        +
        +	if ul == blas.Upper {
        +		if incX == 1 {
        +			iy := ky
        +			for i := 0; i < n; i++ {
        +				xv := x[i] * alpha
        +				sum := x[i] * a[i*lda+i]
        +				jy := ky + (i+1)*incY
        +				atmp := a[i*lda+i+1 : i*lda+n]
        +				for j, v := range atmp {
        +					jp := j + i + 1
        +					sum += x[jp] * v
        +					y[jy] += xv * v
        +					jy += incY
        +				}
        +				y[iy] += alpha * sum
        +				iy += incY
        +			}
        +			return
        +		}
        +		ix := kx
        +		iy := ky
        +		for i := 0; i < n; i++ {
        +			xv := x[ix] * alpha
        +			sum := x[ix] * a[i*lda+i]
        +			jx := kx + (i+1)*incX
        +			jy := ky + (i+1)*incY
        +			atmp := a[i*lda+i+1 : i*lda+n]
        +			for _, v := range atmp {
        +				sum += x[jx] * v
        +				y[jy] += xv * v
        +				jx += incX
        +				jy += incY
        +			}
        +			y[iy] += alpha * sum
        +			ix += incX
        +			iy += incY
        +		}
        +		return
        +	}
        +	// Cases where a is lower triangular.
        +	if incX == 1 {
        +		iy := ky
        +		for i := 0; i < n; i++ {
        +			jy := ky
        +			xv := alpha * x[i]
        +			atmp := a[i*lda : i*lda+i]
        +			var sum float64
        +			for j, v := range atmp {
        +				sum += x[j] * v
        +				y[jy] += xv * v
        +				jy += incY
        +			}
        +			sum += x[i] * a[i*lda+i]
        +			sum *= alpha
        +			y[iy] += sum
        +			iy += incY
        +		}
        +		return
        +	}
        +	ix := kx
        +	iy := ky
        +	for i := 0; i < n; i++ {
        +		jx := kx
        +		jy := ky
        +		xv := alpha * x[ix]
        +		atmp := a[i*lda : i*lda+i]
        +		var sum float64
        +		for _, v := range atmp {
        +			sum += x[jx] * v
        +			y[jy] += xv * v
        +			jx += incX
        +			jy += incY
        +		}
        +		sum += x[ix] * a[i*lda+i]
        +		sum *= alpha
        +		y[iy] += sum
        +		ix += incX
        +		iy += incY
        +	}
        +}
        +
        +// Dtbmv performs one of the matrix-vector operations
        +//  x = A * x   if tA == blas.NoTrans
        +//  x = Aᵀ * x  if tA == blas.Trans or blas.ConjTrans
        +// where A is an n×n triangular band matrix with k+1 diagonals, and x is a vector.
        +func (Implementation) Dtbmv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n, k int, a []float64, lda int, x []float64, incX int) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        +		panic(badTranspose)
        +	}
        +	if d != blas.NonUnit && d != blas.Unit {
        +		panic(badDiag)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if k < 0 {
        +		panic(kLT0)
        +	}
        +	if lda < k+1 {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(n-1)+k+1 {
        +		panic(shortA)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +
        +	var kx int
        +	if incX < 0 {
        +		kx = -(n - 1) * incX
        +	}
        +
        +	nonunit := d != blas.Unit
        +
        +	if tA == blas.NoTrans {
        +		if ul == blas.Upper {
        +			if incX == 1 {
        +				for i := 0; i < n; i++ {
        +					u := min(1+k, n-i)
        +					var sum float64
        +					atmp := a[i*lda:]
        +					xtmp := x[i:]
        +					for j := 1; j < u; j++ {
        +						sum += xtmp[j] * atmp[j]
        +					}
        +					if nonunit {
        +						sum += xtmp[0] * atmp[0]
        +					} else {
        +						sum += xtmp[0]
        +					}
        +					x[i] = sum
        +				}
        +				return
        +			}
        +			ix := kx
        +			for i := 0; i < n; i++ {
        +				u := min(1+k, n-i)
        +				var sum float64
        +				atmp := a[i*lda:]
        +				jx := incX
        +				for j := 1; j < u; j++ {
        +					sum += x[ix+jx] * atmp[j]
        +					jx += incX
        +				}
        +				if nonunit {
        +					sum += x[ix] * atmp[0]
        +				} else {
        +					sum += x[ix]
        +				}
        +				x[ix] = sum
        +				ix += incX
        +			}
        +			return
        +		}
        +		if incX == 1 {
        +			for i := n - 1; i >= 0; i-- {
        +				l := max(0, k-i)
        +				atmp := a[i*lda:]
        +				var sum float64
        +				for j := l; j < k; j++ {
        +					sum += x[i-k+j] * atmp[j]
        +				}
        +				if nonunit {
        +					sum += x[i] * atmp[k]
        +				} else {
        +					sum += x[i]
        +				}
        +				x[i] = sum
        +			}
        +			return
        +		}
        +		ix := kx + (n-1)*incX
        +		for i := n - 1; i >= 0; i-- {
        +			l := max(0, k-i)
        +			atmp := a[i*lda:]
        +			var sum float64
        +			jx := l * incX
        +			for j := l; j < k; j++ {
        +				sum += x[ix-k*incX+jx] * atmp[j]
        +				jx += incX
        +			}
        +			if nonunit {
        +				sum += x[ix] * atmp[k]
        +			} else {
        +				sum += x[ix]
        +			}
        +			x[ix] = sum
        +			ix -= incX
        +		}
        +		return
        +	}
        +	if ul == blas.Upper {
        +		if incX == 1 {
        +			for i := n - 1; i >= 0; i-- {
        +				u := k + 1
        +				if i < u {
        +					u = i + 1
        +				}
        +				var sum float64
        +				for j := 1; j < u; j++ {
        +					sum += x[i-j] * a[(i-j)*lda+j]
        +				}
        +				if nonunit {
        +					sum += x[i] * a[i*lda]
        +				} else {
        +					sum += x[i]
        +				}
        +				x[i] = sum
        +			}
        +			return
        +		}
        +		ix := kx + (n-1)*incX
        +		for i := n - 1; i >= 0; i-- {
        +			u := k + 1
        +			if i < u {
        +				u = i + 1
        +			}
        +			var sum float64
        +			jx := incX
        +			for j := 1; j < u; j++ {
        +				sum += x[ix-jx] * a[(i-j)*lda+j]
        +				jx += incX
        +			}
        +			if nonunit {
        +				sum += x[ix] * a[i*lda]
        +			} else {
        +				sum += x[ix]
        +			}
        +			x[ix] = sum
        +			ix -= incX
        +		}
        +		return
        +	}
        +	if incX == 1 {
        +		for i := 0; i < n; i++ {
        +			u := k
        +			if i+k >= n {
        +				u = n - i - 1
        +			}
        +			var sum float64
        +			for j := 0; j < u; j++ {
        +				sum += x[i+j+1] * a[(i+j+1)*lda+k-j-1]
        +			}
        +			if nonunit {
        +				sum += x[i] * a[i*lda+k]
        +			} else {
        +				sum += x[i]
        +			}
        +			x[i] = sum
        +		}
        +		return
        +	}
        +	ix := kx
        +	for i := 0; i < n; i++ {
        +		u := k
        +		if i+k >= n {
        +			u = n - i - 1
        +		}
        +		var (
        +			sum float64
        +			jx  int
        +		)
        +		for j := 0; j < u; j++ {
        +			sum += x[ix+jx+incX] * a[(i+j+1)*lda+k-j-1]
        +			jx += incX
        +		}
        +		if nonunit {
        +			sum += x[ix] * a[i*lda+k]
        +		} else {
        +			sum += x[ix]
        +		}
        +		x[ix] = sum
        +		ix += incX
        +	}
        +}
        +
        +// Dtpmv performs one of the matrix-vector operations
        +//  x = A * x   if tA == blas.NoTrans
        +//  x = Aᵀ * x  if tA == blas.Trans or blas.ConjTrans
        +// where A is an n×n triangular matrix in packed format, and x is a vector.
        +func (Implementation) Dtpmv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, ap []float64, x []float64, incX int) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        +		panic(badTranspose)
        +	}
        +	if d != blas.NonUnit && d != blas.Unit {
        +		panic(badDiag)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(ap) < n*(n+1)/2 {
        +		panic(shortAP)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +
        +	var kx int
        +	if incX < 0 {
        +		kx = -(n - 1) * incX
        +	}
        +
        +	nonUnit := d == blas.NonUnit
        +	var offset int // Offset is the index of (i,i)
        +	if tA == blas.NoTrans {
        +		if ul == blas.Upper {
        +			if incX == 1 {
        +				for i := 0; i < n; i++ {
        +					xi := x[i]
        +					if nonUnit {
        +						xi *= ap[offset]
        +					}
        +					atmp := ap[offset+1 : offset+n-i]
        +					xtmp := x[i+1:]
        +					for j, v := range atmp {
        +						xi += v * xtmp[j]
        +					}
        +					x[i] = xi
        +					offset += n - i
        +				}
        +				return
        +			}
        +			ix := kx
        +			for i := 0; i < n; i++ {
        +				xix := x[ix]
        +				if nonUnit {
        +					xix *= ap[offset]
        +				}
        +				atmp := ap[offset+1 : offset+n-i]
        +				jx := kx + (i+1)*incX
        +				for _, v := range atmp {
        +					xix += v * x[jx]
        +					jx += incX
        +				}
        +				x[ix] = xix
        +				offset += n - i
        +				ix += incX
        +			}
        +			return
        +		}
        +		if incX == 1 {
        +			offset = n*(n+1)/2 - 1
        +			for i := n - 1; i >= 0; i-- {
        +				xi := x[i]
        +				if nonUnit {
        +					xi *= ap[offset]
        +				}
        +				atmp := ap[offset-i : offset]
        +				for j, v := range atmp {
        +					xi += v * x[j]
        +				}
        +				x[i] = xi
        +				offset -= i + 1
        +			}
        +			return
        +		}
        +		ix := kx + (n-1)*incX
        +		offset = n*(n+1)/2 - 1
        +		for i := n - 1; i >= 0; i-- {
        +			xix := x[ix]
        +			if nonUnit {
        +				xix *= ap[offset]
        +			}
        +			atmp := ap[offset-i : offset]
        +			jx := kx
        +			for _, v := range atmp {
        +				xix += v * x[jx]
        +				jx += incX
        +			}
        +			x[ix] = xix
        +			offset -= i + 1
        +			ix -= incX
        +		}
        +		return
        +	}
        +	// Cases where ap is transposed.
        +	if ul == blas.Upper {
        +		if incX == 1 {
        +			offset = n*(n+1)/2 - 1
        +			for i := n - 1; i >= 0; i-- {
        +				xi := x[i]
        +				atmp := ap[offset+1 : offset+n-i]
        +				xtmp := x[i+1:]
        +				for j, v := range atmp {
        +					xtmp[j] += v * xi
        +				}
        +				if nonUnit {
        +					x[i] *= ap[offset]
        +				}
        +				offset -= n - i + 1
        +			}
        +			return
        +		}
        +		ix := kx + (n-1)*incX
        +		offset = n*(n+1)/2 - 1
        +		for i := n - 1; i >= 0; i-- {
        +			xix := x[ix]
        +			jx := kx + (i+1)*incX
        +			atmp := ap[offset+1 : offset+n-i]
        +			for _, v := range atmp {
        +				x[jx] += v * xix
        +				jx += incX
        +			}
        +			if nonUnit {
        +				x[ix] *= ap[offset]
        +			}
        +			offset -= n - i + 1
        +			ix -= incX
        +		}
        +		return
        +	}
        +	if incX == 1 {
        +		for i := 0; i < n; i++ {
        +			xi := x[i]
        +			atmp := ap[offset-i : offset]
        +			for j, v := range atmp {
        +				x[j] += v * xi
        +			}
        +			if nonUnit {
        +				x[i] *= ap[offset]
        +			}
        +			offset += i + 2
        +		}
        +		return
        +	}
        +	ix := kx
        +	for i := 0; i < n; i++ {
        +		xix := x[ix]
        +		jx := kx
        +		atmp := ap[offset-i : offset]
        +		for _, v := range atmp {
        +			x[jx] += v * xix
        +			jx += incX
        +		}
        +		if nonUnit {
        +			x[ix] *= ap[offset]
        +		}
        +		ix += incX
        +		offset += i + 2
        +	}
        +}
        +
        +// Dtbsv solves one of the systems of equations
        +//  A * x = b   if tA == blas.NoTrans
        +//  Aᵀ * x = b  if tA == blas.Trans or tA == blas.ConjTrans
        +// where A is an n×n triangular band matrix with k+1 diagonals,
        +// and x and b are vectors.
        +//
        +// At entry to the function, x contains the values of b, and the result is
        +// stored in-place into x.
        +//
        +// No test for singularity or near-singularity is included in this
        +// routine. Such tests must be performed before calling this routine.
        +func (Implementation) Dtbsv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n, k int, a []float64, lda int, x []float64, incX int) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        +		panic(badTranspose)
        +	}
        +	if d != blas.NonUnit && d != blas.Unit {
        +		panic(badDiag)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if k < 0 {
        +		panic(kLT0)
        +	}
        +	if lda < k+1 {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(n-1)+k+1 {
        +		panic(shortA)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +
        +	var kx int
        +	if incX < 0 {
        +		kx = -(n - 1) * incX
        +	}
        +	nonUnit := d == blas.NonUnit
        +	// Form x = A^-1 x.
        +	// Several cases below use subslices for speed improvement.
        +	// The incX != 1 cases usually do not because incX may be negative.
        +	if tA == blas.NoTrans {
        +		if ul == blas.Upper {
        +			if incX == 1 {
        +				for i := n - 1; i >= 0; i-- {
        +					bands := k
        +					if i+bands >= n {
        +						bands = n - i - 1
        +					}
        +					atmp := a[i*lda+1:]
        +					xtmp := x[i+1 : i+bands+1]
        +					var sum float64
        +					for j, v := range xtmp {
        +						sum += v * atmp[j]
        +					}
        +					x[i] -= sum
        +					if nonUnit {
        +						x[i] /= a[i*lda]
        +					}
        +				}
        +				return
        +			}
        +			ix := kx + (n-1)*incX
        +			for i := n - 1; i >= 0; i-- {
        +				max := k + 1
        +				if i+max > n {
        +					max = n - i
        +				}
        +				atmp := a[i*lda:]
        +				var (
        +					jx  int
        +					sum float64
        +				)
        +				for j := 1; j < max; j++ {
        +					jx += incX
        +					sum += x[ix+jx] * atmp[j]
        +				}
        +				x[ix] -= sum
        +				if nonUnit {
        +					x[ix] /= atmp[0]
        +				}
        +				ix -= incX
        +			}
        +			return
        +		}
        +		if incX == 1 {
        +			for i := 0; i < n; i++ {
        +				bands := k
        +				if i-k < 0 {
        +					bands = i
        +				}
        +				atmp := a[i*lda+k-bands:]
        +				xtmp := x[i-bands : i]
        +				var sum float64
        +				for j, v := range xtmp {
        +					sum += v * atmp[j]
        +				}
        +				x[i] -= sum
        +				if nonUnit {
        +					x[i] /= atmp[bands]
        +				}
        +			}
        +			return
        +		}
        +		ix := kx
        +		for i := 0; i < n; i++ {
        +			bands := k
        +			if i-k < 0 {
        +				bands = i
        +			}
        +			atmp := a[i*lda+k-bands:]
        +			var (
        +				sum float64
        +				jx  int
        +			)
        +			for j := 0; j < bands; j++ {
        +				sum += x[ix-bands*incX+jx] * atmp[j]
        +				jx += incX
        +			}
        +			x[ix] -= sum
        +			if nonUnit {
        +				x[ix] /= atmp[bands]
        +			}
        +			ix += incX
        +		}
        +		return
        +	}
        +	// Cases where a is transposed.
        +	if ul == blas.Upper {
        +		if incX == 1 {
        +			for i := 0; i < n; i++ {
        +				bands := k
        +				if i-k < 0 {
        +					bands = i
        +				}
        +				var sum float64
        +				for j := 0; j < bands; j++ {
        +					sum += x[i-bands+j] * a[(i-bands+j)*lda+bands-j]
        +				}
        +				x[i] -= sum
        +				if nonUnit {
        +					x[i] /= a[i*lda]
        +				}
        +			}
        +			return
        +		}
        +		ix := kx
        +		for i := 0; i < n; i++ {
        +			bands := k
        +			if i-k < 0 {
        +				bands = i
        +			}
        +			var (
        +				sum float64
        +				jx  int
        +			)
        +			for j := 0; j < bands; j++ {
        +				sum += x[ix-bands*incX+jx] * a[(i-bands+j)*lda+bands-j]
        +				jx += incX
        +			}
        +			x[ix] -= sum
        +			if nonUnit {
        +				x[ix] /= a[i*lda]
        +			}
        +			ix += incX
        +		}
        +		return
        +	}
        +	if incX == 1 {
        +		for i := n - 1; i >= 0; i-- {
        +			bands := k
        +			if i+bands >= n {
        +				bands = n - i - 1
        +			}
        +			var sum float64
        +			xtmp := x[i+1 : i+1+bands]
        +			for j, v := range xtmp {
        +				sum += v * a[(i+j+1)*lda+k-j-1]
        +			}
        +			x[i] -= sum
        +			if nonUnit {
        +				x[i] /= a[i*lda+k]
        +			}
        +		}
        +		return
        +	}
        +	ix := kx + (n-1)*incX
        +	for i := n - 1; i >= 0; i-- {
        +		bands := k
        +		if i+bands >= n {
        +			bands = n - i - 1
        +		}
        +		var (
        +			sum float64
        +			jx  int
        +		)
        +		for j := 0; j < bands; j++ {
        +			sum += x[ix+jx+incX] * a[(i+j+1)*lda+k-j-1]
        +			jx += incX
        +		}
        +		x[ix] -= sum
        +		if nonUnit {
        +			x[ix] /= a[i*lda+k]
        +		}
        +		ix -= incX
        +	}
        +}
        +
        +// Dsbmv performs the matrix-vector operation
        +//  y = alpha * A * x + beta * y
        +// where A is an n×n symmetric band matrix with k super-diagonals, x and y are
        +// vectors, and alpha and beta are scalars.
        +func (Implementation) Dsbmv(ul blas.Uplo, n, k int, alpha float64, a []float64, lda int, x []float64, incX int, beta float64, y []float64, incY int) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if k < 0 {
        +		panic(kLT0)
        +	}
        +	if lda < k+1 {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(n-1)+k+1 {
        +		panic(shortA)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 && beta == 1 {
        +		return
        +	}
        +
        +	// Set up indexes
        +	lenX := n
        +	lenY := n
        +	var kx, ky int
        +	if incX < 0 {
        +		kx = -(lenX - 1) * incX
        +	}
        +	if incY < 0 {
        +		ky = -(lenY - 1) * incY
        +	}
        +
        +	// Form y = beta * y.
        +	if beta != 1 {
        +		if incY == 1 {
        +			if beta == 0 {
        +				for i := range y[:n] {
        +					y[i] = 0
        +				}
        +			} else {
        +				f64.ScalUnitary(beta, y[:n])
        +			}
        +		} else {
        +			iy := ky
        +			if beta == 0 {
        +				for i := 0; i < n; i++ {
        +					y[iy] = 0
        +					iy += incY
        +				}
        +			} else {
        +				if incY > 0 {
        +					f64.ScalInc(beta, y, uintptr(n), uintptr(incY))
        +				} else {
        +					f64.ScalInc(beta, y, uintptr(n), uintptr(-incY))
        +				}
        +			}
        +		}
        +	}
        +
        +	if alpha == 0 {
        +		return
        +	}
        +
        +	if ul == blas.Upper {
        +		if incX == 1 {
        +			iy := ky
        +			for i := 0; i < n; i++ {
        +				atmp := a[i*lda:]
        +				tmp := alpha * x[i]
        +				sum := tmp * atmp[0]
        +				u := min(k, n-i-1)
        +				jy := incY
        +				for j := 1; j <= u; j++ {
        +					v := atmp[j]
        +					sum += alpha * x[i+j] * v
        +					y[iy+jy] += tmp * v
        +					jy += incY
        +				}
        +				y[iy] += sum
        +				iy += incY
        +			}
        +			return
        +		}
        +		ix := kx
        +		iy := ky
        +		for i := 0; i < n; i++ {
        +			atmp := a[i*lda:]
        +			tmp := alpha * x[ix]
        +			sum := tmp * atmp[0]
        +			u := min(k, n-i-1)
        +			jx := incX
        +			jy := incY
        +			for j := 1; j <= u; j++ {
        +				v := atmp[j]
        +				sum += alpha * x[ix+jx] * v
        +				y[iy+jy] += tmp * v
        +				jx += incX
        +				jy += incY
        +			}
        +			y[iy] += sum
        +			ix += incX
        +			iy += incY
        +		}
        +		return
        +	}
        +
        +	// Casses where a has bands below the diagonal.
        +	if incX == 1 {
        +		iy := ky
        +		for i := 0; i < n; i++ {
        +			l := max(0, k-i)
        +			tmp := alpha * x[i]
        +			jy := l * incY
        +			atmp := a[i*lda:]
        +			for j := l; j < k; j++ {
        +				v := atmp[j]
        +				y[iy] += alpha * v * x[i-k+j]
        +				y[iy-k*incY+jy] += tmp * v
        +				jy += incY
        +			}
        +			y[iy] += tmp * atmp[k]
        +			iy += incY
        +		}
        +		return
        +	}
        +	ix := kx
        +	iy := ky
        +	for i := 0; i < n; i++ {
        +		l := max(0, k-i)
        +		tmp := alpha * x[ix]
        +		jx := l * incX
        +		jy := l * incY
        +		atmp := a[i*lda:]
        +		for j := l; j < k; j++ {
        +			v := atmp[j]
        +			y[iy] += alpha * v * x[ix-k*incX+jx]
        +			y[iy-k*incY+jy] += tmp * v
        +			jx += incX
        +			jy += incY
        +		}
        +		y[iy] += tmp * atmp[k]
        +		ix += incX
        +		iy += incY
        +	}
        +}
        +
        +// Dsyr performs the symmetric rank-one update
        +//  A += alpha * x * xᵀ
        +// where A is an n×n symmetric matrix, and x is a vector.
        +func (Implementation) Dsyr(ul blas.Uplo, n int, alpha float64, x []float64, incX int, a []float64, lda int) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if len(a) < lda*(n-1)+n {
        +		panic(shortA)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 {
        +		return
        +	}
        +
        +	lenX := n
        +	var kx int
        +	if incX < 0 {
        +		kx = -(lenX - 1) * incX
        +	}
        +	if ul == blas.Upper {
        +		if incX == 1 {
        +			for i := 0; i < n; i++ {
        +				tmp := x[i] * alpha
        +				if tmp != 0 {
        +					atmp := a[i*lda+i : i*lda+n]
        +					xtmp := x[i:n]
        +					for j, v := range xtmp {
        +						atmp[j] += v * tmp
        +					}
        +				}
        +			}
        +			return
        +		}
        +		ix := kx
        +		for i := 0; i < n; i++ {
        +			tmp := x[ix] * alpha
        +			if tmp != 0 {
        +				jx := ix
        +				atmp := a[i*lda:]
        +				for j := i; j < n; j++ {
        +					atmp[j] += x[jx] * tmp
        +					jx += incX
        +				}
        +			}
        +			ix += incX
        +		}
        +		return
        +	}
        +	// Cases where a is lower triangular.
        +	if incX == 1 {
        +		for i := 0; i < n; i++ {
        +			tmp := x[i] * alpha
        +			if tmp != 0 {
        +				atmp := a[i*lda:]
        +				xtmp := x[:i+1]
        +				for j, v := range xtmp {
        +					atmp[j] += tmp * v
        +				}
        +			}
        +		}
        +		return
        +	}
        +	ix := kx
        +	for i := 0; i < n; i++ {
        +		tmp := x[ix] * alpha
        +		if tmp != 0 {
        +			atmp := a[i*lda:]
        +			jx := kx
        +			for j := 0; j < i+1; j++ {
        +				atmp[j] += tmp * x[jx]
        +				jx += incX
        +			}
        +		}
        +		ix += incX
        +	}
        +}
        +
        +// Dsyr2 performs the symmetric rank-two update
        +//  A += alpha * x * yᵀ + alpha * y * xᵀ
        +// where A is an n×n symmetric matrix, x and y are vectors, and alpha is a scalar.
        +func (Implementation) Dsyr2(ul blas.Uplo, n int, alpha float64, x []float64, incX int, y []float64, incY int, a []float64, lda int) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if lda < max(1, n) {
        +		panic(badLdA)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +	if len(a) < lda*(n-1)+n {
        +		panic(shortA)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 {
        +		return
        +	}
        +
        +	var ky, kx int
        +	if incY < 0 {
        +		ky = -(n - 1) * incY
        +	}
        +	if incX < 0 {
        +		kx = -(n - 1) * incX
        +	}
        +	if ul == blas.Upper {
        +		if incX == 1 && incY == 1 {
        +			for i := 0; i < n; i++ {
        +				xi := x[i]
        +				yi := y[i]
        +				atmp := a[i*lda:]
        +				for j := i; j < n; j++ {
        +					atmp[j] += alpha * (xi*y[j] + x[j]*yi)
        +				}
        +			}
        +			return
        +		}
        +		ix := kx
        +		iy := ky
        +		for i := 0; i < n; i++ {
        +			jx := kx + i*incX
        +			jy := ky + i*incY
        +			xi := x[ix]
        +			yi := y[iy]
        +			atmp := a[i*lda:]
        +			for j := i; j < n; j++ {
        +				atmp[j] += alpha * (xi*y[jy] + x[jx]*yi)
        +				jx += incX
        +				jy += incY
        +			}
        +			ix += incX
        +			iy += incY
        +		}
        +		return
        +	}
        +	if incX == 1 && incY == 1 {
        +		for i := 0; i < n; i++ {
        +			xi := x[i]
        +			yi := y[i]
        +			atmp := a[i*lda:]
        +			for j := 0; j <= i; j++ {
        +				atmp[j] += alpha * (xi*y[j] + x[j]*yi)
        +			}
        +		}
        +		return
        +	}
        +	ix := kx
        +	iy := ky
        +	for i := 0; i < n; i++ {
        +		jx := kx
        +		jy := ky
        +		xi := x[ix]
        +		yi := y[iy]
        +		atmp := a[i*lda:]
        +		for j := 0; j <= i; j++ {
        +			atmp[j] += alpha * (xi*y[jy] + x[jx]*yi)
        +			jx += incX
        +			jy += incY
        +		}
        +		ix += incX
        +		iy += incY
        +	}
        +}
        +
        +// Dtpsv solves one of the systems of equations
        +//  A * x = b   if tA == blas.NoTrans
        +//  Aᵀ * x = b  if tA == blas.Trans or blas.ConjTrans
        +// where A is an n×n triangular matrix in packed format, and x and b are vectors.
        +//
        +// At entry to the function, x contains the values of b, and the result is
        +// stored in-place into x.
        +//
        +// No test for singularity or near-singularity is included in this
        +// routine. Such tests must be performed before calling this routine.
        +func (Implementation) Dtpsv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, ap []float64, x []float64, incX int) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        +		panic(badTranspose)
        +	}
        +	if d != blas.NonUnit && d != blas.Unit {
        +		panic(badDiag)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(ap) < n*(n+1)/2 {
        +		panic(shortAP)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +
        +	var kx int
        +	if incX < 0 {
        +		kx = -(n - 1) * incX
        +	}
        +
        +	nonUnit := d == blas.NonUnit
        +	var offset int // Offset is the index of (i,i)
        +	if tA == blas.NoTrans {
        +		if ul == blas.Upper {
        +			offset = n*(n+1)/2 - 1
        +			if incX == 1 {
        +				for i := n - 1; i >= 0; i-- {
        +					atmp := ap[offset+1 : offset+n-i]
        +					xtmp := x[i+1:]
        +					var sum float64
        +					for j, v := range atmp {
        +						sum += v * xtmp[j]
        +					}
        +					x[i] -= sum
        +					if nonUnit {
        +						x[i] /= ap[offset]
        +					}
        +					offset -= n - i + 1
        +				}
        +				return
        +			}
        +			ix := kx + (n-1)*incX
        +			for i := n - 1; i >= 0; i-- {
        +				atmp := ap[offset+1 : offset+n-i]
        +				jx := kx + (i+1)*incX
        +				var sum float64
        +				for _, v := range atmp {
        +					sum += v * x[jx]
        +					jx += incX
        +				}
        +				x[ix] -= sum
        +				if nonUnit {
        +					x[ix] /= ap[offset]
        +				}
        +				ix -= incX
        +				offset -= n - i + 1
        +			}
        +			return
        +		}
        +		if incX == 1 {
        +			for i := 0; i < n; i++ {
        +				atmp := ap[offset-i : offset]
        +				var sum float64
        +				for j, v := range atmp {
        +					sum += v * x[j]
        +				}
        +				x[i] -= sum
        +				if nonUnit {
        +					x[i] /= ap[offset]
        +				}
        +				offset += i + 2
        +			}
        +			return
        +		}
        +		ix := kx
        +		for i := 0; i < n; i++ {
        +			jx := kx
        +			atmp := ap[offset-i : offset]
        +			var sum float64
        +			for _, v := range atmp {
        +				sum += v * x[jx]
        +				jx += incX
        +			}
        +			x[ix] -= sum
        +			if nonUnit {
        +				x[ix] /= ap[offset]
        +			}
        +			ix += incX
        +			offset += i + 2
        +		}
        +		return
        +	}
        +	// Cases where ap is transposed.
        +	if ul == blas.Upper {
        +		if incX == 1 {
        +			for i := 0; i < n; i++ {
        +				if nonUnit {
        +					x[i] /= ap[offset]
        +				}
        +				xi := x[i]
        +				atmp := ap[offset+1 : offset+n-i]
        +				xtmp := x[i+1:]
        +				for j, v := range atmp {
        +					xtmp[j] -= v * xi
        +				}
        +				offset += n - i
        +			}
        +			return
        +		}
        +		ix := kx
        +		for i := 0; i < n; i++ {
        +			if nonUnit {
        +				x[ix] /= ap[offset]
        +			}
        +			xix := x[ix]
        +			atmp := ap[offset+1 : offset+n-i]
        +			jx := kx + (i+1)*incX
        +			for _, v := range atmp {
        +				x[jx] -= v * xix
        +				jx += incX
        +			}
        +			ix += incX
        +			offset += n - i
        +		}
        +		return
        +	}
        +	if incX == 1 {
        +		offset = n*(n+1)/2 - 1
        +		for i := n - 1; i >= 0; i-- {
        +			if nonUnit {
        +				x[i] /= ap[offset]
        +			}
        +			xi := x[i]
        +			atmp := ap[offset-i : offset]
        +			for j, v := range atmp {
        +				x[j] -= v * xi
        +			}
        +			offset -= i + 1
        +		}
        +		return
        +	}
        +	ix := kx + (n-1)*incX
        +	offset = n*(n+1)/2 - 1
        +	for i := n - 1; i >= 0; i-- {
        +		if nonUnit {
        +			x[ix] /= ap[offset]
        +		}
        +		xix := x[ix]
        +		atmp := ap[offset-i : offset]
        +		jx := kx
        +		for _, v := range atmp {
        +			x[jx] -= v * xix
        +			jx += incX
        +		}
        +		ix -= incX
        +		offset -= i + 1
        +	}
        +}
        +
        +// Dspmv performs the matrix-vector operation
        +//  y = alpha * A * x + beta * y
        +// where A is an n×n symmetric matrix in packed format, x and y are vectors,
        +// and alpha and beta are scalars.
        +func (Implementation) Dspmv(ul blas.Uplo, n int, alpha float64, ap []float64, x []float64, incX int, beta float64, y []float64, incY int) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(ap) < n*(n+1)/2 {
        +		panic(shortAP)
        +	}
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 && beta == 1 {
        +		return
        +	}
        +
        +	// Set up start points
        +	var kx, ky int
        +	if incX < 0 {
        +		kx = -(n - 1) * incX
        +	}
        +	if incY < 0 {
        +		ky = -(n - 1) * incY
        +	}
        +
        +	// Form y = beta * y.
        +	if beta != 1 {
        +		if incY == 1 {
        +			if beta == 0 {
        +				for i := range y[:n] {
        +					y[i] = 0
        +				}
        +			} else {
        +				f64.ScalUnitary(beta, y[:n])
        +			}
        +		} else {
        +			iy := ky
        +			if beta == 0 {
        +				for i := 0; i < n; i++ {
        +					y[iy] = 0
        +					iy += incY
        +				}
        +			} else {
        +				if incY > 0 {
        +					f64.ScalInc(beta, y, uintptr(n), uintptr(incY))
        +				} else {
        +					f64.ScalInc(beta, y, uintptr(n), uintptr(-incY))
        +				}
        +			}
        +		}
        +	}
        +
        +	if alpha == 0 {
        +		return
        +	}
        +
        +	if n == 1 {
        +		y[0] += alpha * ap[0] * x[0]
        +		return
        +	}
        +	var offset int // Offset is the index of (i,i).
        +	if ul == blas.Upper {
        +		if incX == 1 {
        +			iy := ky
        +			for i := 0; i < n; i++ {
        +				xv := x[i] * alpha
        +				sum := ap[offset] * x[i]
        +				atmp := ap[offset+1 : offset+n-i]
        +				xtmp := x[i+1:]
        +				jy := ky + (i+1)*incY
        +				for j, v := range atmp {
        +					sum += v * xtmp[j]
        +					y[jy] += v * xv
        +					jy += incY
        +				}
        +				y[iy] += alpha * sum
        +				iy += incY
        +				offset += n - i
        +			}
        +			return
        +		}
        +		ix := kx
        +		iy := ky
        +		for i := 0; i < n; i++ {
        +			xv := x[ix] * alpha
        +			sum := ap[offset] * x[ix]
        +			atmp := ap[offset+1 : offset+n-i]
        +			jx := kx + (i+1)*incX
        +			jy := ky + (i+1)*incY
        +			for _, v := range atmp {
        +				sum += v * x[jx]
        +				y[jy] += v * xv
        +				jx += incX
        +				jy += incY
        +			}
        +			y[iy] += alpha * sum
        +			ix += incX
        +			iy += incY
        +			offset += n - i
        +		}
        +		return
        +	}
        +	if incX == 1 {
        +		iy := ky
        +		for i := 0; i < n; i++ {
        +			xv := x[i] * alpha
        +			atmp := ap[offset-i : offset]
        +			jy := ky
        +			var sum float64
        +			for j, v := range atmp {
        +				sum += v * x[j]
        +				y[jy] += v * xv
        +				jy += incY
        +			}
        +			sum += ap[offset] * x[i]
        +			y[iy] += alpha * sum
        +			iy += incY
        +			offset += i + 2
        +		}
        +		return
        +	}
        +	ix := kx
        +	iy := ky
        +	for i := 0; i < n; i++ {
        +		xv := x[ix] * alpha
        +		atmp := ap[offset-i : offset]
        +		jx := kx
        +		jy := ky
        +		var sum float64
        +		for _, v := range atmp {
        +			sum += v * x[jx]
        +			y[jy] += v * xv
        +			jx += incX
        +			jy += incY
        +		}
        +
        +		sum += ap[offset] * x[ix]
        +		y[iy] += alpha * sum
        +		ix += incX
        +		iy += incY
        +		offset += i + 2
        +	}
        +}
        +
        +// Dspr performs the symmetric rank-one operation
        +//  A += alpha * x * xᵀ
        +// where A is an n×n symmetric matrix in packed format, x is a vector, and
        +// alpha is a scalar.
        +func (Implementation) Dspr(ul blas.Uplo, n int, alpha float64, x []float64, incX int, ap []float64) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if len(ap) < n*(n+1)/2 {
        +		panic(shortAP)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 {
        +		return
        +	}
        +
        +	lenX := n
        +	var kx int
        +	if incX < 0 {
        +		kx = -(lenX - 1) * incX
        +	}
        +	var offset int // Offset is the index of (i,i).
        +	if ul == blas.Upper {
        +		if incX == 1 {
        +			for i := 0; i < n; i++ {
        +				atmp := ap[offset:]
        +				xv := alpha * x[i]
        +				xtmp := x[i:n]
        +				for j, v := range xtmp {
        +					atmp[j] += xv * v
        +				}
        +				offset += n - i
        +			}
        +			return
        +		}
        +		ix := kx
        +		for i := 0; i < n; i++ {
        +			jx := kx + i*incX
        +			atmp := ap[offset:]
        +			xv := alpha * x[ix]
        +			for j := 0; j < n-i; j++ {
        +				atmp[j] += xv * x[jx]
        +				jx += incX
        +			}
        +			ix += incX
        +			offset += n - i
        +		}
        +		return
        +	}
        +	if incX == 1 {
        +		for i := 0; i < n; i++ {
        +			atmp := ap[offset-i:]
        +			xv := alpha * x[i]
        +			xtmp := x[:i+1]
        +			for j, v := range xtmp {
        +				atmp[j] += xv * v
        +			}
        +			offset += i + 2
        +		}
        +		return
        +	}
        +	ix := kx
        +	for i := 0; i < n; i++ {
        +		jx := kx
        +		atmp := ap[offset-i:]
        +		xv := alpha * x[ix]
        +		for j := 0; j <= i; j++ {
        +			atmp[j] += xv * x[jx]
        +			jx += incX
        +		}
        +		ix += incX
        +		offset += i + 2
        +	}
        +}
        +
        +// Dspr2 performs the symmetric rank-2 update
        +//  A += alpha * x * yᵀ + alpha * y * xᵀ
        +// where A is an n×n symmetric matrix in packed format, x and y are vectors,
        +// and alpha is a scalar.
        +func (Implementation) Dspr2(ul blas.Uplo, n int, alpha float64, x []float64, incX int, y []float64, incY int, ap []float64) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if incX == 0 {
        +		panic(zeroIncX)
        +	}
        +	if incY == 0 {
        +		panic(zeroIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if (incX > 0 && len(x) <= (n-1)*incX) || (incX < 0 && len(x) <= (1-n)*incX) {
        +		panic(shortX)
        +	}
        +	if (incY > 0 && len(y) <= (n-1)*incY) || (incY < 0 && len(y) <= (1-n)*incY) {
        +		panic(shortY)
        +	}
        +	if len(ap) < n*(n+1)/2 {
        +		panic(shortAP)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 {
        +		return
        +	}
        +
        +	var ky, kx int
        +	if incY < 0 {
        +		ky = -(n - 1) * incY
        +	}
        +	if incX < 0 {
        +		kx = -(n - 1) * incX
        +	}
        +	var offset int // Offset is the index of (i,i).
        +	if ul == blas.Upper {
        +		if incX == 1 && incY == 1 {
        +			for i := 0; i < n; i++ {
        +				atmp := ap[offset:]
        +				xi := x[i]
        +				yi := y[i]
        +				xtmp := x[i:n]
        +				ytmp := y[i:n]
        +				for j, v := range xtmp {
        +					atmp[j] += alpha * (xi*ytmp[j] + v*yi)
        +				}
        +				offset += n - i
        +			}
        +			return
        +		}
        +		ix := kx
        +		iy := ky
        +		for i := 0; i < n; i++ {
        +			jx := kx + i*incX
        +			jy := ky + i*incY
        +			atmp := ap[offset:]
        +			xi := x[ix]
        +			yi := y[iy]
        +			for j := 0; j < n-i; j++ {
        +				atmp[j] += alpha * (xi*y[jy] + x[jx]*yi)
        +				jx += incX
        +				jy += incY
        +			}
        +			ix += incX
        +			iy += incY
        +			offset += n - i
        +		}
        +		return
        +	}
        +	if incX == 1 && incY == 1 {
        +		for i := 0; i < n; i++ {
        +			atmp := ap[offset-i:]
        +			xi := x[i]
        +			yi := y[i]
        +			xtmp := x[:i+1]
        +			for j, v := range xtmp {
        +				atmp[j] += alpha * (xi*y[j] + v*yi)
        +			}
        +			offset += i + 2
        +		}
        +		return
        +	}
        +	ix := kx
        +	iy := ky
        +	for i := 0; i < n; i++ {
        +		jx := kx
        +		jy := ky
        +		atmp := ap[offset-i:]
        +		for j := 0; j <= i; j++ {
        +			atmp[j] += alpha * (x[ix]*y[jy] + x[jx]*y[iy])
        +			jx += incX
        +			jy += incY
        +		}
        +		ix += incX
        +		iy += incY
        +		offset += i + 2
        +	}
        +}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/level2single.go b/vendor/gonum.org/v1/gonum/blas/gonum/level2single.go
        deleted file mode 100644
        index 7bc8b0d43..000000000
        --- a/vendor/gonum.org/v1/gonum/blas/gonum/level2single.go
        +++ /dev/null
        @@ -1,2102 +0,0 @@
        -// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.
        -
        -// Copyright ©2014 The Gonum Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package gonum
        -
        -import (
        -	"gonum.org/v1/gonum/blas"
        -	"gonum.org/v1/gonum/internal/asm/f32"
        -)
        -
        -var _ blas.Float32Level2 = Implementation{}
        -
        -// Sger performs the rank-one operation
        -//  A += alpha * x * y^T
        -// where A is an m×n dense matrix, x and y are vectors, and alpha is a scalar.
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Sger(m, n int, alpha float32, x []float32, incX int, y []float32, incY int, a []float32, lda int) {
        -	// Check inputs
        -	if m < 0 {
        -		panic("m < 0")
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	if (incX > 0 && (m-1)*incX >= len(x)) || (incX < 0 && (1-m)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        -		panic(badY)
        -	}
        -	if lda*(m-1)+n > len(a) || lda < max(1, n) {
        -		panic(badLdA)
        -	}
        -	if lda < max(1, n) {
        -		panic(badLdA)
        -	}
        -
        -	// Quick return if possible
        -	if m == 0 || n == 0 || alpha == 0 {
        -		return
        -	}
        -	f32.Ger(uintptr(m), uintptr(n),
        -		alpha,
        -		x, uintptr(incX),
        -		y, uintptr(incY),
        -		a, uintptr(lda))
        -}
        -
        -// Sgbmv performs one of the matrix-vector operations
        -//  y = alpha * A * x + beta * y    if tA == blas.NoTrans
        -//  y = alpha * A^T * x + beta * y  if tA == blas.Trans or blas.ConjTrans
        -// where A is an m×n band matrix with kL sub-diagonals and kU super-diagonals,
        -// x and y are vectors, and alpha and beta are scalars.
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Sgbmv(tA blas.Transpose, m, n, kL, kU int, alpha float32, a []float32, lda int, x []float32, incX int, beta float32, y []float32, incY int) {
        -	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        -		panic(badTranspose)
        -	}
        -	if m < 0 {
        -		panic(mLT0)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if kL < 0 {
        -		panic(kLLT0)
        -	}
        -	if kL < 0 {
        -		panic(kULT0)
        -	}
        -	if lda < kL+kU+1 {
        -		panic(badLdA)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	// Set up indexes
        -	lenX := m
        -	lenY := n
        -	if tA == blas.NoTrans {
        -		lenX = n
        -		lenY = m
        -	}
        -	if (incX > 0 && (lenX-1)*incX >= len(x)) || (incX < 0 && (1-lenX)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if (incY > 0 && (lenY-1)*incY >= len(y)) || (incY < 0 && (1-lenY)*incY >= len(y)) {
        -		panic(badY)
        -	}
        -	if lda*(min(m, n+kL)-1)+kL+kU+1 > len(a) || lda < kL+kU+1 {
        -		panic(badLdA)
        -	}
        -
        -	// Quick return if possible
        -	if m == 0 || n == 0 || (alpha == 0 && beta == 1) {
        -		return
        -	}
        -
        -	var kx, ky int
        -	if incX < 0 {
        -		kx = -(lenX - 1) * incX
        -	}
        -	if incY < 0 {
        -		ky = -(lenY - 1) * incY
        -	}
        -
        -	// First form y = beta * y
        -	if incY > 0 {
        -		Implementation{}.Sscal(lenY, beta, y, incY)
        -	} else {
        -		Implementation{}.Sscal(lenY, beta, y, -incY)
        -	}
        -
        -	if alpha == 0 {
        -		return
        -	}
        -
        -	// i and j are indices of the compacted banded matrix.
        -	// off is the offset into the dense matrix (off + j = densej)
        -	nCol := kU + 1 + kL
        -	if tA == blas.NoTrans {
        -		iy := ky
        -		if incX == 1 {
        -			for i := 0; i < min(m, n+kL); i++ {
        -				l := max(0, kL-i)
        -				u := min(nCol, n+kL-i)
        -				off := max(0, i-kL)
        -				atmp := a[i*lda+l : i*lda+u]
        -				xtmp := x[off : off+u-l]
        -				var sum float32
        -				for j, v := range atmp {
        -					sum += xtmp[j] * v
        -				}
        -				y[iy] += sum * alpha
        -				iy += incY
        -			}
        -			return
        -		}
        -		for i := 0; i < min(m, n+kL); i++ {
        -			l := max(0, kL-i)
        -			u := min(nCol, n+kL-i)
        -			off := max(0, i-kL)
        -			atmp := a[i*lda+l : i*lda+u]
        -			jx := kx
        -			var sum float32
        -			for _, v := range atmp {
        -				sum += x[off*incX+jx] * v
        -				jx += incX
        -			}
        -			y[iy] += sum * alpha
        -			iy += incY
        -		}
        -		return
        -	}
        -	if incX == 1 {
        -		for i := 0; i < min(m, n+kL); i++ {
        -			l := max(0, kL-i)
        -			u := min(nCol, n+kL-i)
        -			off := max(0, i-kL)
        -			atmp := a[i*lda+l : i*lda+u]
        -			tmp := alpha * x[i]
        -			jy := ky
        -			for _, v := range atmp {
        -				y[jy+off*incY] += tmp * v
        -				jy += incY
        -			}
        -		}
        -		return
        -	}
        -	ix := kx
        -	for i := 0; i < min(m, n+kL); i++ {
        -		l := max(0, kL-i)
        -		u := min(nCol, n+kL-i)
        -		off := max(0, i-kL)
        -		atmp := a[i*lda+l : i*lda+u]
        -		tmp := alpha * x[ix]
        -		jy := ky
        -		for _, v := range atmp {
        -			y[jy+off*incY] += tmp * v
        -			jy += incY
        -		}
        -		ix += incX
        -	}
        -}
        -
        -// Strmv performs one of the matrix-vector operations
        -//  x = A * x    if tA == blas.NoTrans
        -//  x = A^T * x  if tA == blas.Trans or blas.ConjTrans
        -// where A is an n×n triangular matrix, and x is a vector.
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Strmv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, a []float32, lda int, x []float32, incX int) {
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        -		panic(badTranspose)
        -	}
        -	if d != blas.NonUnit && d != blas.Unit {
        -		panic(badDiag)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if lda < n {
        -		panic(badLdA)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if lda*(n-1)+n > len(a) || lda < max(1, n) {
        -		panic(badLdA)
        -	}
        -	if n == 0 {
        -		return
        -	}
        -	nonUnit := d != blas.Unit
        -	if n == 1 {
        -		if nonUnit {
        -			x[0] *= a[0]
        -		}
        -		return
        -	}
        -	var kx int
        -	if incX <= 0 {
        -		kx = -(n - 1) * incX
        -	}
        -	if tA == blas.NoTrans {
        -		if ul == blas.Upper {
        -			if incX == 1 {
        -				for i := 0; i < n; i++ {
        -					ilda := i * lda
        -					var tmp float32
        -					if nonUnit {
        -						tmp = a[ilda+i] * x[i]
        -					} else {
        -						tmp = x[i]
        -					}
        -					xtmp := x[i+1:]
        -					x[i] = tmp + f32.DotUnitary(a[ilda+i+1:ilda+n], xtmp)
        -				}
        -				return
        -			}
        -			ix := kx
        -			for i := 0; i < n; i++ {
        -				ilda := i * lda
        -				var tmp float32
        -				if nonUnit {
        -					tmp = a[ilda+i] * x[ix]
        -				} else {
        -					tmp = x[ix]
        -				}
        -				x[ix] = tmp + f32.DotInc(x, a[ilda+i+1:ilda+n], uintptr(n-i-1), uintptr(incX), 1, uintptr(ix+incX), 0)
        -				ix += incX
        -			}
        -			return
        -		}
        -		if incX == 1 {
        -			for i := n - 1; i >= 0; i-- {
        -				ilda := i * lda
        -				var tmp float32
        -				if nonUnit {
        -					tmp += a[ilda+i] * x[i]
        -				} else {
        -					tmp = x[i]
        -				}
        -				x[i] = tmp + f32.DotUnitary(a[ilda:ilda+i], x)
        -			}
        -			return
        -		}
        -		ix := kx + (n-1)*incX
        -		for i := n - 1; i >= 0; i-- {
        -			ilda := i * lda
        -			var tmp float32
        -			if nonUnit {
        -				tmp = a[ilda+i] * x[ix]
        -			} else {
        -				tmp = x[ix]
        -			}
        -			x[ix] = tmp + f32.DotInc(x, a[ilda:ilda+i], uintptr(i), uintptr(incX), 1, uintptr(kx), 0)
        -			ix -= incX
        -		}
        -		return
        -	}
        -	// Cases where a is transposed.
        -	if ul == blas.Upper {
        -		if incX == 1 {
        -			for i := n - 1; i >= 0; i-- {
        -				ilda := i * lda
        -				xi := x[i]
        -				f32.AxpyUnitary(xi, a[ilda+i+1:ilda+n], x[i+1:n])
        -				if nonUnit {
        -					x[i] *= a[ilda+i]
        -				}
        -			}
        -			return
        -		}
        -		ix := kx + (n-1)*incX
        -		for i := n - 1; i >= 0; i-- {
        -			ilda := i * lda
        -			xi := x[ix]
        -			f32.AxpyInc(xi, a[ilda+i+1:ilda+n], x, uintptr(n-i-1), 1, uintptr(incX), 0, uintptr(kx+(i+1)*incX))
        -			if nonUnit {
        -				x[ix] *= a[ilda+i]
        -			}
        -			ix -= incX
        -		}
        -		return
        -	}
        -	if incX == 1 {
        -		for i := 0; i < n; i++ {
        -			ilda := i * lda
        -			xi := x[i]
        -			f32.AxpyUnitary(xi, a[ilda:ilda+i], x)
        -			if nonUnit {
        -				x[i] *= a[i*lda+i]
        -			}
        -		}
        -		return
        -	}
        -	ix := kx
        -	for i := 0; i < n; i++ {
        -		ilda := i * lda
        -		xi := x[ix]
        -		f32.AxpyInc(xi, a[ilda:ilda+i], x, uintptr(i), 1, uintptr(incX), 0, uintptr(kx))
        -		if nonUnit {
        -			x[ix] *= a[ilda+i]
        -		}
        -		ix += incX
        -	}
        -}
        -
        -// Strsv solves one of the systems of equations
        -//  A * x = b    if tA == blas.NoTrans
        -//  A^T * x = b  if tA == blas.Trans or blas.ConjTrans
        -// where A is an n×n triangular matrix, and x and b are vectors.
        -//
        -// At entry to the function, x contains the values of b, and the result is
        -// stored in-place into x.
        -//
        -// No test for singularity or near-singularity is included in this
        -// routine. Such tests must be performed before calling this routine.
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Strsv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, a []float32, lda int, x []float32, incX int) {
        -	// Test the input parameters
        -	// Verify inputs
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        -		panic(badTranspose)
        -	}
        -	if d != blas.NonUnit && d != blas.Unit {
        -		panic(badDiag)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if lda*(n-1)+n > len(a) || lda < max(1, n) {
        -		panic(badLdA)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	// Quick return if possible
        -	if n == 0 {
        -		return
        -	}
        -	if n == 1 {
        -		if d == blas.NonUnit {
        -			x[0] /= a[0]
        -		}
        -		return
        -	}
        -
        -	var kx int
        -	if incX < 0 {
        -		kx = -(n - 1) * incX
        -	}
        -	nonUnit := d == blas.NonUnit
        -	if tA == blas.NoTrans {
        -		if ul == blas.Upper {
        -			if incX == 1 {
        -				for i := n - 1; i >= 0; i-- {
        -					var sum float32
        -					atmp := a[i*lda+i+1 : i*lda+n]
        -					for j, v := range atmp {
        -						jv := i + j + 1
        -						sum += x[jv] * v
        -					}
        -					x[i] -= sum
        -					if nonUnit {
        -						x[i] /= a[i*lda+i]
        -					}
        -				}
        -				return
        -			}
        -			ix := kx + (n-1)*incX
        -			for i := n - 1; i >= 0; i-- {
        -				var sum float32
        -				jx := ix + incX
        -				atmp := a[i*lda+i+1 : i*lda+n]
        -				for _, v := range atmp {
        -					sum += x[jx] * v
        -					jx += incX
        -				}
        -				x[ix] -= sum
        -				if nonUnit {
        -					x[ix] /= a[i*lda+i]
        -				}
        -				ix -= incX
        -			}
        -			return
        -		}
        -		if incX == 1 {
        -			for i := 0; i < n; i++ {
        -				var sum float32
        -				atmp := a[i*lda : i*lda+i]
        -				for j, v := range atmp {
        -					sum += x[j] * v
        -				}
        -				x[i] -= sum
        -				if nonUnit {
        -					x[i] /= a[i*lda+i]
        -				}
        -			}
        -			return
        -		}
        -		ix := kx
        -		for i := 0; i < n; i++ {
        -			jx := kx
        -			var sum float32
        -			atmp := a[i*lda : i*lda+i]
        -			for _, v := range atmp {
        -				sum += x[jx] * v
        -				jx += incX
        -			}
        -			x[ix] -= sum
        -			if nonUnit {
        -				x[ix] /= a[i*lda+i]
        -			}
        -			ix += incX
        -		}
        -		return
        -	}
        -	// Cases where a is transposed.
        -	if ul == blas.Upper {
        -		if incX == 1 {
        -			for i := 0; i < n; i++ {
        -				if nonUnit {
        -					x[i] /= a[i*lda+i]
        -				}
        -				xi := x[i]
        -				atmp := a[i*lda+i+1 : i*lda+n]
        -				for j, v := range atmp {
        -					jv := j + i + 1
        -					x[jv] -= v * xi
        -				}
        -			}
        -			return
        -		}
        -		ix := kx
        -		for i := 0; i < n; i++ {
        -			if nonUnit {
        -				x[ix] /= a[i*lda+i]
        -			}
        -			xi := x[ix]
        -			jx := kx + (i+1)*incX
        -			atmp := a[i*lda+i+1 : i*lda+n]
        -			for _, v := range atmp {
        -				x[jx] -= v * xi
        -				jx += incX
        -			}
        -			ix += incX
        -		}
        -		return
        -	}
        -	if incX == 1 {
        -		for i := n - 1; i >= 0; i-- {
        -			if nonUnit {
        -				x[i] /= a[i*lda+i]
        -			}
        -			xi := x[i]
        -			atmp := a[i*lda : i*lda+i]
        -			for j, v := range atmp {
        -				x[j] -= v * xi
        -			}
        -		}
        -		return
        -	}
        -	ix := kx + (n-1)*incX
        -	for i := n - 1; i >= 0; i-- {
        -		if nonUnit {
        -			x[ix] /= a[i*lda+i]
        -		}
        -		xi := x[ix]
        -		jx := kx
        -		atmp := a[i*lda : i*lda+i]
        -		for _, v := range atmp {
        -			x[jx] -= v * xi
        -			jx += incX
        -		}
        -		ix -= incX
        -	}
        -}
        -
        -// Ssymv performs the matrix-vector operation
        -//  y = alpha * A * x + beta * y
        -// where A is an n×n symmetric matrix, x and y are vectors, and alpha and
        -// beta are scalars.
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Ssymv(ul blas.Uplo, n int, alpha float32, a []float32, lda int, x []float32, incX int, beta float32, y []float32, incY int) {
        -	// Check inputs
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if lda > 1 && lda < n {
        -		panic(badLdA)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        -		panic(badY)
        -	}
        -	if lda*(n-1)+n > len(a) || lda < max(1, n) {
        -		panic(badLdA)
        -	}
        -	// Quick return if possible
        -	if n == 0 || (alpha == 0 && beta == 1) {
        -		return
        -	}
        -
        -	// Set up start points
        -	var kx, ky int
        -	if incX < 0 {
        -		kx = -(n - 1) * incX
        -	}
        -	if incY < 0 {
        -		ky = -(n - 1) * incY
        -	}
        -
        -	// Form y = beta * y
        -	if beta != 1 {
        -		if incY > 0 {
        -			Implementation{}.Sscal(n, beta, y, incY)
        -		} else {
        -			Implementation{}.Sscal(n, beta, y, -incY)
        -		}
        -	}
        -
        -	if alpha == 0 {
        -		return
        -	}
        -
        -	if n == 1 {
        -		y[0] += alpha * a[0] * x[0]
        -		return
        -	}
        -
        -	if ul == blas.Upper {
        -		if incX == 1 {
        -			iy := ky
        -			for i := 0; i < n; i++ {
        -				xv := x[i] * alpha
        -				sum := x[i] * a[i*lda+i]
        -				jy := ky + (i+1)*incY
        -				atmp := a[i*lda+i+1 : i*lda+n]
        -				for j, v := range atmp {
        -					jp := j + i + 1
        -					sum += x[jp] * v
        -					y[jy] += xv * v
        -					jy += incY
        -				}
        -				y[iy] += alpha * sum
        -				iy += incY
        -			}
        -			return
        -		}
        -		ix := kx
        -		iy := ky
        -		for i := 0; i < n; i++ {
        -			xv := x[ix] * alpha
        -			sum := x[ix] * a[i*lda+i]
        -			jx := kx + (i+1)*incX
        -			jy := ky + (i+1)*incY
        -			atmp := a[i*lda+i+1 : i*lda+n]
        -			for _, v := range atmp {
        -				sum += x[jx] * v
        -				y[jy] += xv * v
        -				jx += incX
        -				jy += incY
        -			}
        -			y[iy] += alpha * sum
        -			ix += incX
        -			iy += incY
        -		}
        -		return
        -	}
        -	// Cases where a is lower triangular.
        -	if incX == 1 {
        -		iy := ky
        -		for i := 0; i < n; i++ {
        -			jy := ky
        -			xv := alpha * x[i]
        -			atmp := a[i*lda : i*lda+i]
        -			var sum float32
        -			for j, v := range atmp {
        -				sum += x[j] * v
        -				y[jy] += xv * v
        -				jy += incY
        -			}
        -			sum += x[i] * a[i*lda+i]
        -			sum *= alpha
        -			y[iy] += sum
        -			iy += incY
        -		}
        -		return
        -	}
        -	ix := kx
        -	iy := ky
        -	for i := 0; i < n; i++ {
        -		jx := kx
        -		jy := ky
        -		xv := alpha * x[ix]
        -		atmp := a[i*lda : i*lda+i]
        -		var sum float32
        -		for _, v := range atmp {
        -			sum += x[jx] * v
        -			y[jy] += xv * v
        -			jx += incX
        -			jy += incY
        -		}
        -		sum += x[ix] * a[i*lda+i]
        -		sum *= alpha
        -		y[iy] += sum
        -		ix += incX
        -		iy += incY
        -	}
        -}
        -
        -// Stbmv performs one of the matrix-vector operations
        -//  x = A * x    if tA == blas.NoTrans
        -//  x = A^T * x  if tA == blas.Trans or blas.ConjTrans
        -// where A is an n×n triangular band matrix with k+1 diagonals, and x is a vector.
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Stbmv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n, k int, a []float32, lda int, x []float32, incX int) {
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        -		panic(badTranspose)
        -	}
        -	if d != blas.NonUnit && d != blas.Unit {
        -		panic(badDiag)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if k < 0 {
        -		panic(kLT0)
        -	}
        -	if lda*(n-1)+k+1 > len(a) || lda < k+1 {
        -		panic(badLdA)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if n == 0 {
        -		return
        -	}
        -	var kx int
        -	if incX < 0 {
        -		kx = -(n - 1) * incX
        -	}
        -
        -	nonunit := d != blas.Unit
        -
        -	if tA == blas.NoTrans {
        -		if ul == blas.Upper {
        -			if incX == 1 {
        -				for i := 0; i < n; i++ {
        -					u := min(1+k, n-i)
        -					var sum float32
        -					atmp := a[i*lda:]
        -					xtmp := x[i:]
        -					for j := 1; j < u; j++ {
        -						sum += xtmp[j] * atmp[j]
        -					}
        -					if nonunit {
        -						sum += xtmp[0] * atmp[0]
        -					} else {
        -						sum += xtmp[0]
        -					}
        -					x[i] = sum
        -				}
        -				return
        -			}
        -			ix := kx
        -			for i := 0; i < n; i++ {
        -				u := min(1+k, n-i)
        -				var sum float32
        -				atmp := a[i*lda:]
        -				jx := incX
        -				for j := 1; j < u; j++ {
        -					sum += x[ix+jx] * atmp[j]
        -					jx += incX
        -				}
        -				if nonunit {
        -					sum += x[ix] * atmp[0]
        -				} else {
        -					sum += x[ix]
        -				}
        -				x[ix] = sum
        -				ix += incX
        -			}
        -			return
        -		}
        -		if incX == 1 {
        -			for i := n - 1; i >= 0; i-- {
        -				l := max(0, k-i)
        -				atmp := a[i*lda:]
        -				var sum float32
        -				for j := l; j < k; j++ {
        -					sum += x[i-k+j] * atmp[j]
        -				}
        -				if nonunit {
        -					sum += x[i] * atmp[k]
        -				} else {
        -					sum += x[i]
        -				}
        -				x[i] = sum
        -			}
        -			return
        -		}
        -		ix := kx + (n-1)*incX
        -		for i := n - 1; i >= 0; i-- {
        -			l := max(0, k-i)
        -			atmp := a[i*lda:]
        -			var sum float32
        -			jx := l * incX
        -			for j := l; j < k; j++ {
        -				sum += x[ix-k*incX+jx] * atmp[j]
        -				jx += incX
        -			}
        -			if nonunit {
        -				sum += x[ix] * atmp[k]
        -			} else {
        -				sum += x[ix]
        -			}
        -			x[ix] = sum
        -			ix -= incX
        -		}
        -		return
        -	}
        -	if ul == blas.Upper {
        -		if incX == 1 {
        -			for i := n - 1; i >= 0; i-- {
        -				u := k + 1
        -				if i < u {
        -					u = i + 1
        -				}
        -				var sum float32
        -				for j := 1; j < u; j++ {
        -					sum += x[i-j] * a[(i-j)*lda+j]
        -				}
        -				if nonunit {
        -					sum += x[i] * a[i*lda]
        -				} else {
        -					sum += x[i]
        -				}
        -				x[i] = sum
        -			}
        -			return
        -		}
        -		ix := kx + (n-1)*incX
        -		for i := n - 1; i >= 0; i-- {
        -			u := k + 1
        -			if i < u {
        -				u = i + 1
        -			}
        -			var sum float32
        -			jx := incX
        -			for j := 1; j < u; j++ {
        -				sum += x[ix-jx] * a[(i-j)*lda+j]
        -				jx += incX
        -			}
        -			if nonunit {
        -				sum += x[ix] * a[i*lda]
        -			} else {
        -				sum += x[ix]
        -			}
        -			x[ix] = sum
        -			ix -= incX
        -		}
        -		return
        -	}
        -	if incX == 1 {
        -		for i := 0; i < n; i++ {
        -			u := k
        -			if i+k >= n {
        -				u = n - i - 1
        -			}
        -			var sum float32
        -			for j := 0; j < u; j++ {
        -				sum += x[i+j+1] * a[(i+j+1)*lda+k-j-1]
        -			}
        -			if nonunit {
        -				sum += x[i] * a[i*lda+k]
        -			} else {
        -				sum += x[i]
        -			}
        -			x[i] = sum
        -		}
        -		return
        -	}
        -	ix := kx
        -	for i := 0; i < n; i++ {
        -		u := k
        -		if i+k >= n {
        -			u = n - i - 1
        -		}
        -		var (
        -			sum float32
        -			jx  int
        -		)
        -		for j := 0; j < u; j++ {
        -			sum += x[ix+jx+incX] * a[(i+j+1)*lda+k-j-1]
        -			jx += incX
        -		}
        -		if nonunit {
        -			sum += x[ix] * a[i*lda+k]
        -		} else {
        -			sum += x[ix]
        -		}
        -		x[ix] = sum
        -		ix += incX
        -	}
        -}
        -
        -// Stpmv performs one of the matrix-vector operations
        -//  x = A * x    if tA == blas.NoTrans
        -//  x = A^T * x  if tA == blas.Trans or blas.ConjTrans
        -// where A is an n×n triangular matrix in packed format, and x is a vector.
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Stpmv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, ap []float32, x []float32, incX int) {
        -	// Verify inputs
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        -		panic(badTranspose)
        -	}
        -	if d != blas.NonUnit && d != blas.Unit {
        -		panic(badDiag)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if len(ap) < (n*(n+1))/2 {
        -		panic(badLdA)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if n == 0 {
        -		return
        -	}
        -	var kx int
        -	if incX < 0 {
        -		kx = -(n - 1) * incX
        -	}
        -
        -	nonUnit := d == blas.NonUnit
        -	var offset int // Offset is the index of (i,i)
        -	if tA == blas.NoTrans {
        -		if ul == blas.Upper {
        -			if incX == 1 {
        -				for i := 0; i < n; i++ {
        -					xi := x[i]
        -					if nonUnit {
        -						xi *= ap[offset]
        -					}
        -					atmp := ap[offset+1 : offset+n-i]
        -					xtmp := x[i+1:]
        -					for j, v := range atmp {
        -						xi += v * xtmp[j]
        -					}
        -					x[i] = xi
        -					offset += n - i
        -				}
        -				return
        -			}
        -			ix := kx
        -			for i := 0; i < n; i++ {
        -				xix := x[ix]
        -				if nonUnit {
        -					xix *= ap[offset]
        -				}
        -				atmp := ap[offset+1 : offset+n-i]
        -				jx := kx + (i+1)*incX
        -				for _, v := range atmp {
        -					xix += v * x[jx]
        -					jx += incX
        -				}
        -				x[ix] = xix
        -				offset += n - i
        -				ix += incX
        -			}
        -			return
        -		}
        -		if incX == 1 {
        -			offset = n*(n+1)/2 - 1
        -			for i := n - 1; i >= 0; i-- {
        -				xi := x[i]
        -				if nonUnit {
        -					xi *= ap[offset]
        -				}
        -				atmp := ap[offset-i : offset]
        -				for j, v := range atmp {
        -					xi += v * x[j]
        -				}
        -				x[i] = xi
        -				offset -= i + 1
        -			}
        -			return
        -		}
        -		ix := kx + (n-1)*incX
        -		offset = n*(n+1)/2 - 1
        -		for i := n - 1; i >= 0; i-- {
        -			xix := x[ix]
        -			if nonUnit {
        -				xix *= ap[offset]
        -			}
        -			atmp := ap[offset-i : offset]
        -			jx := kx
        -			for _, v := range atmp {
        -				xix += v * x[jx]
        -				jx += incX
        -			}
        -			x[ix] = xix
        -			offset -= i + 1
        -			ix -= incX
        -		}
        -		return
        -	}
        -	// Cases where ap is transposed.
        -	if ul == blas.Upper {
        -		if incX == 1 {
        -			offset = n*(n+1)/2 - 1
        -			for i := n - 1; i >= 0; i-- {
        -				xi := x[i]
        -				atmp := ap[offset+1 : offset+n-i]
        -				xtmp := x[i+1:]
        -				for j, v := range atmp {
        -					xtmp[j] += v * xi
        -				}
        -				if nonUnit {
        -					x[i] *= ap[offset]
        -				}
        -				offset -= n - i + 1
        -			}
        -			return
        -		}
        -		ix := kx + (n-1)*incX
        -		offset = n*(n+1)/2 - 1
        -		for i := n - 1; i >= 0; i-- {
        -			xix := x[ix]
        -			jx := kx + (i+1)*incX
        -			atmp := ap[offset+1 : offset+n-i]
        -			for _, v := range atmp {
        -				x[jx] += v * xix
        -				jx += incX
        -			}
        -			if nonUnit {
        -				x[ix] *= ap[offset]
        -			}
        -			offset -= n - i + 1
        -			ix -= incX
        -		}
        -		return
        -	}
        -	if incX == 1 {
        -		for i := 0; i < n; i++ {
        -			xi := x[i]
        -			atmp := ap[offset-i : offset]
        -			for j, v := range atmp {
        -				x[j] += v * xi
        -			}
        -			if nonUnit {
        -				x[i] *= ap[offset]
        -			}
        -			offset += i + 2
        -		}
        -		return
        -	}
        -	ix := kx
        -	for i := 0; i < n; i++ {
        -		xix := x[ix]
        -		jx := kx
        -		atmp := ap[offset-i : offset]
        -		for _, v := range atmp {
        -			x[jx] += v * xix
        -			jx += incX
        -		}
        -		if nonUnit {
        -			x[ix] *= ap[offset]
        -		}
        -		ix += incX
        -		offset += i + 2
        -	}
        -}
        -
        -// Stbsv solves one of the systems of equations
        -//  A * x = b    if tA == blas.NoTrans
        -//  A^T * x = b  if tA == blas.Trans or tA == blas.ConjTrans
        -// where A is an n×n triangular band matrix with k+1 diagonals,
        -// and x and b are vectors.
        -//
        -// At entry to the function, x contains the values of b, and the result is
        -// stored in-place into x.
        -//
        -// No test for singularity or near-singularity is included in this
        -// routine. Such tests must be performed before calling this routine.
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Stbsv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n, k int, a []float32, lda int, x []float32, incX int) {
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        -		panic(badTranspose)
        -	}
        -	if d != blas.NonUnit && d != blas.Unit {
        -		panic(badDiag)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if lda*(n-1)+k+1 > len(a) || lda < k+1 {
        -		panic(badLdA)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if n == 0 {
        -		return
        -	}
        -	var kx int
        -	if incX < 0 {
        -		kx = -(n - 1) * incX
        -	}
        -	nonUnit := d == blas.NonUnit
        -	// Form x = A^-1 x.
        -	// Several cases below use subslices for speed improvement.
        -	// The incX != 1 cases usually do not because incX may be negative.
        -	if tA == blas.NoTrans {
        -		if ul == blas.Upper {
        -			if incX == 1 {
        -				for i := n - 1; i >= 0; i-- {
        -					bands := k
        -					if i+bands >= n {
        -						bands = n - i - 1
        -					}
        -					atmp := a[i*lda+1:]
        -					xtmp := x[i+1 : i+bands+1]
        -					var sum float32
        -					for j, v := range xtmp {
        -						sum += v * atmp[j]
        -					}
        -					x[i] -= sum
        -					if nonUnit {
        -						x[i] /= a[i*lda]
        -					}
        -				}
        -				return
        -			}
        -			ix := kx + (n-1)*incX
        -			for i := n - 1; i >= 0; i-- {
        -				max := k + 1
        -				if i+max > n {
        -					max = n - i
        -				}
        -				atmp := a[i*lda:]
        -				var (
        -					jx  int
        -					sum float32
        -				)
        -				for j := 1; j < max; j++ {
        -					jx += incX
        -					sum += x[ix+jx] * atmp[j]
        -				}
        -				x[ix] -= sum
        -				if nonUnit {
        -					x[ix] /= atmp[0]
        -				}
        -				ix -= incX
        -			}
        -			return
        -		}
        -		if incX == 1 {
        -			for i := 0; i < n; i++ {
        -				bands := k
        -				if i-k < 0 {
        -					bands = i
        -				}
        -				atmp := a[i*lda+k-bands:]
        -				xtmp := x[i-bands : i]
        -				var sum float32
        -				for j, v := range xtmp {
        -					sum += v * atmp[j]
        -				}
        -				x[i] -= sum
        -				if nonUnit {
        -					x[i] /= atmp[bands]
        -				}
        -			}
        -			return
        -		}
        -		ix := kx
        -		for i := 0; i < n; i++ {
        -			bands := k
        -			if i-k < 0 {
        -				bands = i
        -			}
        -			atmp := a[i*lda+k-bands:]
        -			var (
        -				sum float32
        -				jx  int
        -			)
        -			for j := 0; j < bands; j++ {
        -				sum += x[ix-bands*incX+jx] * atmp[j]
        -				jx += incX
        -			}
        -			x[ix] -= sum
        -			if nonUnit {
        -				x[ix] /= atmp[bands]
        -			}
        -			ix += incX
        -		}
        -		return
        -	}
        -	// Cases where a is transposed.
        -	if ul == blas.Upper {
        -		if incX == 1 {
        -			for i := 0; i < n; i++ {
        -				bands := k
        -				if i-k < 0 {
        -					bands = i
        -				}
        -				var sum float32
        -				for j := 0; j < bands; j++ {
        -					sum += x[i-bands+j] * a[(i-bands+j)*lda+bands-j]
        -				}
        -				x[i] -= sum
        -				if nonUnit {
        -					x[i] /= a[i*lda]
        -				}
        -			}
        -			return
        -		}
        -		ix := kx
        -		for i := 0; i < n; i++ {
        -			bands := k
        -			if i-k < 0 {
        -				bands = i
        -			}
        -			var (
        -				sum float32
        -				jx  int
        -			)
        -			for j := 0; j < bands; j++ {
        -				sum += x[ix-bands*incX+jx] * a[(i-bands+j)*lda+bands-j]
        -				jx += incX
        -			}
        -			x[ix] -= sum
        -			if nonUnit {
        -				x[ix] /= a[i*lda]
        -			}
        -			ix += incX
        -		}
        -		return
        -	}
        -	if incX == 1 {
        -		for i := n - 1; i >= 0; i-- {
        -			bands := k
        -			if i+bands >= n {
        -				bands = n - i - 1
        -			}
        -			var sum float32
        -			xtmp := x[i+1 : i+1+bands]
        -			for j, v := range xtmp {
        -				sum += v * a[(i+j+1)*lda+k-j-1]
        -			}
        -			x[i] -= sum
        -			if nonUnit {
        -				x[i] /= a[i*lda+k]
        -			}
        -		}
        -		return
        -	}
        -	ix := kx + (n-1)*incX
        -	for i := n - 1; i >= 0; i-- {
        -		bands := k
        -		if i+bands >= n {
        -			bands = n - i - 1
        -		}
        -		var (
        -			sum float32
        -			jx  int
        -		)
        -		for j := 0; j < bands; j++ {
        -			sum += x[ix+jx+incX] * a[(i+j+1)*lda+k-j-1]
        -			jx += incX
        -		}
        -		x[ix] -= sum
        -		if nonUnit {
        -			x[ix] /= a[i*lda+k]
        -		}
        -		ix -= incX
        -	}
        -}
        -
        -// Ssbmv performs the matrix-vector operation
        -//  y = alpha * A * x + beta * y
        -// where A is an n×n symmetric band matrix with k super-diagonals, x and y are
        -// vectors, and alpha and beta are scalars.
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Ssbmv(ul blas.Uplo, n, k int, alpha float32, a []float32, lda int, x []float32, incX int, beta float32, y []float32, incY int) {
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        -		panic(badY)
        -	}
        -	if lda*(n-1)+k+1 > len(a) || lda < k+1 {
        -		panic(badLdA)
        -	}
        -
        -	// Quick return if possible
        -	if n == 0 || (alpha == 0 && beta == 1) {
        -		return
        -	}
        -
        -	// Set up indexes
        -	lenX := n
        -	lenY := n
        -	var kx, ky int
        -	if incX < 0 {
        -		kx = -(lenX - 1) * incX
        -	}
        -	if incY < 0 {
        -		ky = -(lenY - 1) * incY
        -	}
        -
        -	// First form y = beta * y
        -	if incY > 0 {
        -		Implementation{}.Sscal(lenY, beta, y, incY)
        -	} else {
        -		Implementation{}.Sscal(lenY, beta, y, -incY)
        -	}
        -
        -	if alpha == 0 {
        -		return
        -	}
        -
        -	if ul == blas.Upper {
        -		if incX == 1 {
        -			iy := ky
        -			for i := 0; i < n; i++ {
        -				atmp := a[i*lda:]
        -				tmp := alpha * x[i]
        -				sum := tmp * atmp[0]
        -				u := min(k, n-i-1)
        -				jy := incY
        -				for j := 1; j <= u; j++ {
        -					v := atmp[j]
        -					sum += alpha * x[i+j] * v
        -					y[iy+jy] += tmp * v
        -					jy += incY
        -				}
        -				y[iy] += sum
        -				iy += incY
        -			}
        -			return
        -		}
        -		ix := kx
        -		iy := ky
        -		for i := 0; i < n; i++ {
        -			atmp := a[i*lda:]
        -			tmp := alpha * x[ix]
        -			sum := tmp * atmp[0]
        -			u := min(k, n-i-1)
        -			jx := incX
        -			jy := incY
        -			for j := 1; j <= u; j++ {
        -				v := atmp[j]
        -				sum += alpha * x[ix+jx] * v
        -				y[iy+jy] += tmp * v
        -				jx += incX
        -				jy += incY
        -			}
        -			y[iy] += sum
        -			ix += incX
        -			iy += incY
        -		}
        -		return
        -	}
        -
        -	// Casses where a has bands below the diagonal.
        -	if incX == 1 {
        -		iy := ky
        -		for i := 0; i < n; i++ {
        -			l := max(0, k-i)
        -			tmp := alpha * x[i]
        -			jy := l * incY
        -			atmp := a[i*lda:]
        -			for j := l; j < k; j++ {
        -				v := atmp[j]
        -				y[iy] += alpha * v * x[i-k+j]
        -				y[iy-k*incY+jy] += tmp * v
        -				jy += incY
        -			}
        -			y[iy] += tmp * atmp[k]
        -			iy += incY
        -		}
        -		return
        -	}
        -	ix := kx
        -	iy := ky
        -	for i := 0; i < n; i++ {
        -		l := max(0, k-i)
        -		tmp := alpha * x[ix]
        -		jx := l * incX
        -		jy := l * incY
        -		atmp := a[i*lda:]
        -		for j := l; j < k; j++ {
        -			v := atmp[j]
        -			y[iy] += alpha * v * x[ix-k*incX+jx]
        -			y[iy-k*incY+jy] += tmp * v
        -			jx += incX
        -			jy += incY
        -		}
        -		y[iy] += tmp * atmp[k]
        -		ix += incX
        -		iy += incY
        -	}
        -}
        -
        -// Ssyr performs the symmetric rank-one update
        -//  A += alpha * x * x^T
        -// where A is an n×n symmetric matrix, and x is a vector.
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Ssyr(ul blas.Uplo, n int, alpha float32, x []float32, incX int, a []float32, lda int) {
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if lda*(n-1)+n > len(a) || lda < max(1, n) {
        -		panic(badLdA)
        -	}
        -	if alpha == 0 || n == 0 {
        -		return
        -	}
        -
        -	lenX := n
        -	var kx int
        -	if incX < 0 {
        -		kx = -(lenX - 1) * incX
        -	}
        -	if ul == blas.Upper {
        -		if incX == 1 {
        -			for i := 0; i < n; i++ {
        -				tmp := x[i] * alpha
        -				if tmp != 0 {
        -					atmp := a[i*lda+i : i*lda+n]
        -					xtmp := x[i:n]
        -					for j, v := range xtmp {
        -						atmp[j] += v * tmp
        -					}
        -				}
        -			}
        -			return
        -		}
        -		ix := kx
        -		for i := 0; i < n; i++ {
        -			tmp := x[ix] * alpha
        -			if tmp != 0 {
        -				jx := ix
        -				atmp := a[i*lda:]
        -				for j := i; j < n; j++ {
        -					atmp[j] += x[jx] * tmp
        -					jx += incX
        -				}
        -			}
        -			ix += incX
        -		}
        -		return
        -	}
        -	// Cases where a is lower triangular.
        -	if incX == 1 {
        -		for i := 0; i < n; i++ {
        -			tmp := x[i] * alpha
        -			if tmp != 0 {
        -				atmp := a[i*lda:]
        -				xtmp := x[:i+1]
        -				for j, v := range xtmp {
        -					atmp[j] += tmp * v
        -				}
        -			}
        -		}
        -		return
        -	}
        -	ix := kx
        -	for i := 0; i < n; i++ {
        -		tmp := x[ix] * alpha
        -		if tmp != 0 {
        -			atmp := a[i*lda:]
        -			jx := kx
        -			for j := 0; j < i+1; j++ {
        -				atmp[j] += tmp * x[jx]
        -				jx += incX
        -			}
        -		}
        -		ix += incX
        -	}
        -}
        -
        -// Ssyr2 performs the symmetric rank-two update
        -//  A += alpha * x * y^T + alpha * y * x^T
        -// where A is an n×n symmetric matrix, x and y are vectors, and alpha is a scalar.
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Ssyr2(ul blas.Uplo, n int, alpha float32, x []float32, incX int, y []float32, incY int, a []float32, lda int) {
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        -		panic(badY)
        -	}
        -	if lda*(n-1)+n > len(a) || lda < max(1, n) {
        -		panic(badLdA)
        -	}
        -	if alpha == 0 {
        -		return
        -	}
        -
        -	var ky, kx int
        -	if incY < 0 {
        -		ky = -(n - 1) * incY
        -	}
        -	if incX < 0 {
        -		kx = -(n - 1) * incX
        -	}
        -	if ul == blas.Upper {
        -		if incX == 1 && incY == 1 {
        -			for i := 0; i < n; i++ {
        -				xi := x[i]
        -				yi := y[i]
        -				atmp := a[i*lda:]
        -				for j := i; j < n; j++ {
        -					atmp[j] += alpha * (xi*y[j] + x[j]*yi)
        -				}
        -			}
        -			return
        -		}
        -		ix := kx
        -		iy := ky
        -		for i := 0; i < n; i++ {
        -			jx := kx + i*incX
        -			jy := ky + i*incY
        -			xi := x[ix]
        -			yi := y[iy]
        -			atmp := a[i*lda:]
        -			for j := i; j < n; j++ {
        -				atmp[j] += alpha * (xi*y[jy] + x[jx]*yi)
        -				jx += incX
        -				jy += incY
        -			}
        -			ix += incX
        -			iy += incY
        -		}
        -		return
        -	}
        -	if incX == 1 && incY == 1 {
        -		for i := 0; i < n; i++ {
        -			xi := x[i]
        -			yi := y[i]
        -			atmp := a[i*lda:]
        -			for j := 0; j <= i; j++ {
        -				atmp[j] += alpha * (xi*y[j] + x[j]*yi)
        -			}
        -		}
        -		return
        -	}
        -	ix := kx
        -	iy := ky
        -	for i := 0; i < n; i++ {
        -		jx := kx
        -		jy := ky
        -		xi := x[ix]
        -		yi := y[iy]
        -		atmp := a[i*lda:]
        -		for j := 0; j <= i; j++ {
        -			atmp[j] += alpha * (xi*y[jy] + x[jx]*yi)
        -			jx += incX
        -			jy += incY
        -		}
        -		ix += incX
        -		iy += incY
        -	}
        -}
        -
        -// Stpsv solves one of the systems of equations
        -//  A * x = b    if tA == blas.NoTrans
        -//  A^T * x = b  if tA == blas.Trans or blas.ConjTrans
        -// where A is an n×n triangular matrix in packed format, and x and b are vectors.
        -//
        -// At entry to the function, x contains the values of b, and the result is
        -// stored in-place into x.
        -//
        -// No test for singularity or near-singularity is included in this
        -// routine. Such tests must be performed before calling this routine.
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Stpsv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, ap []float32, x []float32, incX int) {
        -	// Verify inputs
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        -		panic(badTranspose)
        -	}
        -	if d != blas.NonUnit && d != blas.Unit {
        -		panic(badDiag)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if len(ap) < (n*(n+1))/2 {
        -		panic(badLdA)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if n == 0 {
        -		return
        -	}
        -	var kx int
        -	if incX < 0 {
        -		kx = -(n - 1) * incX
        -	}
        -
        -	nonUnit := d == blas.NonUnit
        -	var offset int // Offset is the index of (i,i)
        -	if tA == blas.NoTrans {
        -		if ul == blas.Upper {
        -			offset = n*(n+1)/2 - 1
        -			if incX == 1 {
        -				for i := n - 1; i >= 0; i-- {
        -					atmp := ap[offset+1 : offset+n-i]
        -					xtmp := x[i+1:]
        -					var sum float32
        -					for j, v := range atmp {
        -						sum += v * xtmp[j]
        -					}
        -					x[i] -= sum
        -					if nonUnit {
        -						x[i] /= ap[offset]
        -					}
        -					offset -= n - i + 1
        -				}
        -				return
        -			}
        -			ix := kx + (n-1)*incX
        -			for i := n - 1; i >= 0; i-- {
        -				atmp := ap[offset+1 : offset+n-i]
        -				jx := kx + (i+1)*incX
        -				var sum float32
        -				for _, v := range atmp {
        -					sum += v * x[jx]
        -					jx += incX
        -				}
        -				x[ix] -= sum
        -				if nonUnit {
        -					x[ix] /= ap[offset]
        -				}
        -				ix -= incX
        -				offset -= n - i + 1
        -			}
        -			return
        -		}
        -		if incX == 1 {
        -			for i := 0; i < n; i++ {
        -				atmp := ap[offset-i : offset]
        -				var sum float32
        -				for j, v := range atmp {
        -					sum += v * x[j]
        -				}
        -				x[i] -= sum
        -				if nonUnit {
        -					x[i] /= ap[offset]
        -				}
        -				offset += i + 2
        -			}
        -			return
        -		}
        -		ix := kx
        -		for i := 0; i < n; i++ {
        -			jx := kx
        -			atmp := ap[offset-i : offset]
        -			var sum float32
        -			for _, v := range atmp {
        -				sum += v * x[jx]
        -				jx += incX
        -			}
        -			x[ix] -= sum
        -			if nonUnit {
        -				x[ix] /= ap[offset]
        -			}
        -			ix += incX
        -			offset += i + 2
        -		}
        -		return
        -	}
        -	// Cases where ap is transposed.
        -	if ul == blas.Upper {
        -		if incX == 1 {
        -			for i := 0; i < n; i++ {
        -				if nonUnit {
        -					x[i] /= ap[offset]
        -				}
        -				xi := x[i]
        -				atmp := ap[offset+1 : offset+n-i]
        -				xtmp := x[i+1:]
        -				for j, v := range atmp {
        -					xtmp[j] -= v * xi
        -				}
        -				offset += n - i
        -			}
        -			return
        -		}
        -		ix := kx
        -		for i := 0; i < n; i++ {
        -			if nonUnit {
        -				x[ix] /= ap[offset]
        -			}
        -			xix := x[ix]
        -			atmp := ap[offset+1 : offset+n-i]
        -			jx := kx + (i+1)*incX
        -			for _, v := range atmp {
        -				x[jx] -= v * xix
        -				jx += incX
        -			}
        -			ix += incX
        -			offset += n - i
        -		}
        -		return
        -	}
        -	if incX == 1 {
        -		offset = n*(n+1)/2 - 1
        -		for i := n - 1; i >= 0; i-- {
        -			if nonUnit {
        -				x[i] /= ap[offset]
        -			}
        -			xi := x[i]
        -			atmp := ap[offset-i : offset]
        -			for j, v := range atmp {
        -				x[j] -= v * xi
        -			}
        -			offset -= i + 1
        -		}
        -		return
        -	}
        -	ix := kx + (n-1)*incX
        -	offset = n*(n+1)/2 - 1
        -	for i := n - 1; i >= 0; i-- {
        -		if nonUnit {
        -			x[ix] /= ap[offset]
        -		}
        -		xix := x[ix]
        -		atmp := ap[offset-i : offset]
        -		jx := kx
        -		for _, v := range atmp {
        -			x[jx] -= v * xix
        -			jx += incX
        -		}
        -		ix -= incX
        -		offset -= i + 1
        -	}
        -}
        -
        -// Sspmv performs the matrix-vector operation
        -//  y = alpha * A * x + beta * y
        -// where A is an n×n symmetric matrix in packed format, x and y are vectors,
        -// and alpha and beta are scalars.
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Sspmv(ul blas.Uplo, n int, alpha float32, a []float32, x []float32, incX int, beta float32, y []float32, incY int) {
        -	// Verify inputs
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if len(a) < (n*(n+1))/2 {
        -		panic(badLdA)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        -		panic(badY)
        -	}
        -	// Quick return if possible
        -	if n == 0 || (alpha == 0 && beta == 1) {
        -		return
        -	}
        -
        -	// Set up start points
        -	var kx, ky int
        -	if incX < 0 {
        -		kx = -(n - 1) * incX
        -	}
        -	if incY < 0 {
        -		ky = -(n - 1) * incY
        -	}
        -
        -	// Form y = beta * y
        -	if beta != 1 {
        -		if incY > 0 {
        -			Implementation{}.Sscal(n, beta, y, incY)
        -		} else {
        -			Implementation{}.Sscal(n, beta, y, -incY)
        -		}
        -	}
        -
        -	if alpha == 0 {
        -		return
        -	}
        -
        -	if n == 1 {
        -		y[0] += alpha * a[0] * x[0]
        -		return
        -	}
        -	var offset int // Offset is the index of (i,i).
        -	if ul == blas.Upper {
        -		if incX == 1 {
        -			iy := ky
        -			for i := 0; i < n; i++ {
        -				xv := x[i] * alpha
        -				sum := a[offset] * x[i]
        -				atmp := a[offset+1 : offset+n-i]
        -				xtmp := x[i+1:]
        -				jy := ky + (i+1)*incY
        -				for j, v := range atmp {
        -					sum += v * xtmp[j]
        -					y[jy] += v * xv
        -					jy += incY
        -				}
        -				y[iy] += alpha * sum
        -				iy += incY
        -				offset += n - i
        -			}
        -			return
        -		}
        -		ix := kx
        -		iy := ky
        -		for i := 0; i < n; i++ {
        -			xv := x[ix] * alpha
        -			sum := a[offset] * x[ix]
        -			atmp := a[offset+1 : offset+n-i]
        -			jx := kx + (i+1)*incX
        -			jy := ky + (i+1)*incY
        -			for _, v := range atmp {
        -				sum += v * x[jx]
        -				y[jy] += v * xv
        -				jx += incX
        -				jy += incY
        -			}
        -			y[iy] += alpha * sum
        -			ix += incX
        -			iy += incY
        -			offset += n - i
        -		}
        -		return
        -	}
        -	if incX == 1 {
        -		iy := ky
        -		for i := 0; i < n; i++ {
        -			xv := x[i] * alpha
        -			atmp := a[offset-i : offset]
        -			jy := ky
        -			var sum float32
        -			for j, v := range atmp {
        -				sum += v * x[j]
        -				y[jy] += v * xv
        -				jy += incY
        -			}
        -			sum += a[offset] * x[i]
        -			y[iy] += alpha * sum
        -			iy += incY
        -			offset += i + 2
        -		}
        -		return
        -	}
        -	ix := kx
        -	iy := ky
        -	for i := 0; i < n; i++ {
        -		xv := x[ix] * alpha
        -		atmp := a[offset-i : offset]
        -		jx := kx
        -		jy := ky
        -		var sum float32
        -		for _, v := range atmp {
        -			sum += v * x[jx]
        -			y[jy] += v * xv
        -			jx += incX
        -			jy += incY
        -		}
        -
        -		sum += a[offset] * x[ix]
        -		y[iy] += alpha * sum
        -		ix += incX
        -		iy += incY
        -		offset += i + 2
        -	}
        -}
        -
        -// Sspr performs the symmetric rank-one operation
        -//  A += alpha * x * x^T
        -// where A is an n×n symmetric matrix in packed format, x is a vector, and
        -// alpha is a scalar.
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Sspr(ul blas.Uplo, n int, alpha float32, x []float32, incX int, a []float32) {
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if len(a) < (n*(n+1))/2 {
        -		panic(badLdA)
        -	}
        -	if alpha == 0 || n == 0 {
        -		return
        -	}
        -	lenX := n
        -	var kx int
        -	if incX < 0 {
        -		kx = -(lenX - 1) * incX
        -	}
        -	var offset int // Offset is the index of (i,i).
        -	if ul == blas.Upper {
        -		if incX == 1 {
        -			for i := 0; i < n; i++ {
        -				atmp := a[offset:]
        -				xv := alpha * x[i]
        -				xtmp := x[i:n]
        -				for j, v := range xtmp {
        -					atmp[j] += xv * v
        -				}
        -				offset += n - i
        -			}
        -			return
        -		}
        -		ix := kx
        -		for i := 0; i < n; i++ {
        -			jx := kx + i*incX
        -			atmp := a[offset:]
        -			xv := alpha * x[ix]
        -			for j := 0; j < n-i; j++ {
        -				atmp[j] += xv * x[jx]
        -				jx += incX
        -			}
        -			ix += incX
        -			offset += n - i
        -		}
        -		return
        -	}
        -	if incX == 1 {
        -		for i := 0; i < n; i++ {
        -			atmp := a[offset-i:]
        -			xv := alpha * x[i]
        -			xtmp := x[:i+1]
        -			for j, v := range xtmp {
        -				atmp[j] += xv * v
        -			}
        -			offset += i + 2
        -		}
        -		return
        -	}
        -	ix := kx
        -	for i := 0; i < n; i++ {
        -		jx := kx
        -		atmp := a[offset-i:]
        -		xv := alpha * x[ix]
        -		for j := 0; j <= i; j++ {
        -			atmp[j] += xv * x[jx]
        -			jx += incX
        -		}
        -		ix += incX
        -		offset += i + 2
        -	}
        -}
        -
        -// Sspr2 performs the symmetric rank-2 update
        -//  A += alpha * x * y^T + alpha * y * x^T
        -// where A is an n×n symmetric matrix in packed format, x and y are vectors,
        -// and alpha is a scalar.
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Sspr2(ul blas.Uplo, n int, alpha float32, x []float32, incX int, y []float32, incY int, ap []float32) {
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if incX == 0 {
        -		panic(zeroIncX)
        -	}
        -	if incY == 0 {
        -		panic(zeroIncY)
        -	}
        -	if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
        -		panic(badX)
        -	}
        -	if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
        -		panic(badY)
        -	}
        -	if len(ap) < (n*(n+1))/2 {
        -		panic(badLdA)
        -	}
        -	if alpha == 0 {
        -		return
        -	}
        -	var ky, kx int
        -	if incY < 0 {
        -		ky = -(n - 1) * incY
        -	}
        -	if incX < 0 {
        -		kx = -(n - 1) * incX
        -	}
        -	var offset int // Offset is the index of (i,i).
        -	if ul == blas.Upper {
        -		if incX == 1 && incY == 1 {
        -			for i := 0; i < n; i++ {
        -				atmp := ap[offset:]
        -				xi := x[i]
        -				yi := y[i]
        -				xtmp := x[i:n]
        -				ytmp := y[i:n]
        -				for j, v := range xtmp {
        -					atmp[j] += alpha * (xi*ytmp[j] + v*yi)
        -				}
        -				offset += n - i
        -			}
        -			return
        -		}
        -		ix := kx
        -		iy := ky
        -		for i := 0; i < n; i++ {
        -			jx := kx + i*incX
        -			jy := ky + i*incY
        -			atmp := ap[offset:]
        -			xi := x[ix]
        -			yi := y[iy]
        -			for j := 0; j < n-i; j++ {
        -				atmp[j] += alpha * (xi*y[jy] + x[jx]*yi)
        -				jx += incX
        -				jy += incY
        -			}
        -			ix += incX
        -			iy += incY
        -			offset += n - i
        -		}
        -		return
        -	}
        -	if incX == 1 && incY == 1 {
        -		for i := 0; i < n; i++ {
        -			atmp := ap[offset-i:]
        -			xi := x[i]
        -			yi := y[i]
        -			xtmp := x[:i+1]
        -			for j, v := range xtmp {
        -				atmp[j] += alpha * (xi*y[j] + v*yi)
        -			}
        -			offset += i + 2
        -		}
        -		return
        -	}
        -	ix := kx
        -	iy := ky
        -	for i := 0; i < n; i++ {
        -		jx := kx
        -		jy := ky
        -		atmp := ap[offset-i:]
        -		for j := 0; j <= i; j++ {
        -			atmp[j] += alpha * (x[ix]*y[jy] + x[jx]*y[iy])
        -			jx += incX
        -			jy += incY
        -		}
        -		ix += incX
        -		iy += incY
        -		offset += i + 2
        -	}
        -}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/level3cmplx128.go b/vendor/gonum.org/v1/gonum/blas/gonum/level3cmplx128.go
        new file mode 100644
        index 000000000..f2a2b2f54
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/blas/gonum/level3cmplx128.go
        @@ -0,0 +1,1715 @@
        +// Copyright ©2019 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package gonum
        +
        +import (
        +	"math/cmplx"
        +
        +	"gonum.org/v1/gonum/blas"
        +	"gonum.org/v1/gonum/internal/asm/c128"
        +)
        +
        +var _ blas.Complex128Level3 = Implementation{}
        +
        +// Zgemm performs one of the matrix-matrix operations
        +//  C = alpha * op(A) * op(B) + beta * C
        +// where op(X) is one of
        +//  op(X) = X  or  op(X) = Xᵀ  or  op(X) = Xᴴ,
        +// alpha and beta are scalars, and A, B and C are matrices, with op(A) an m×k matrix,
        +// op(B) a k×n matrix and C an m×n matrix.
        +func (Implementation) Zgemm(tA, tB blas.Transpose, m, n, k int, alpha complex128, a []complex128, lda int, b []complex128, ldb int, beta complex128, c []complex128, ldc int) {
        +	switch tA {
        +	default:
        +		panic(badTranspose)
        +	case blas.NoTrans, blas.Trans, blas.ConjTrans:
        +	}
        +	switch tB {
        +	default:
        +		panic(badTranspose)
        +	case blas.NoTrans, blas.Trans, blas.ConjTrans:
        +	}
        +	switch {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case k < 0:
        +		panic(kLT0)
        +	}
        +	rowA, colA := m, k
        +	if tA != blas.NoTrans {
        +		rowA, colA = k, m
        +	}
        +	if lda < max(1, colA) {
        +		panic(badLdA)
        +	}
        +	rowB, colB := k, n
        +	if tB != blas.NoTrans {
        +		rowB, colB = n, k
        +	}
        +	if ldb < max(1, colB) {
        +		panic(badLdB)
        +	}
        +	if ldc < max(1, n) {
        +		panic(badLdC)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < (rowA-1)*lda+colA {
        +		panic(shortA)
        +	}
        +	if len(b) < (rowB-1)*ldb+colB {
        +		panic(shortB)
        +	}
        +	if len(c) < (m-1)*ldc+n {
        +		panic(shortC)
        +	}
        +
        +	// Quick return if possible.
        +	if (alpha == 0 || k == 0) && beta == 1 {
        +		return
        +	}
        +
        +	if alpha == 0 {
        +		if beta == 0 {
        +			for i := 0; i < m; i++ {
        +				for j := 0; j < n; j++ {
        +					c[i*ldc+j] = 0
        +				}
        +			}
        +		} else {
        +			for i := 0; i < m; i++ {
        +				for j := 0; j < n; j++ {
        +					c[i*ldc+j] *= beta
        +				}
        +			}
        +		}
        +		return
        +	}
        +
        +	switch tA {
        +	case blas.NoTrans:
        +		switch tB {
        +		case blas.NoTrans:
        +			// Form  C = alpha * A * B + beta * C.
        +			for i := 0; i < m; i++ {
        +				switch {
        +				case beta == 0:
        +					for j := 0; j < n; j++ {
        +						c[i*ldc+j] = 0
        +					}
        +				case beta != 1:
        +					for j := 0; j < n; j++ {
        +						c[i*ldc+j] *= beta
        +					}
        +				}
        +				for l := 0; l < k; l++ {
        +					tmp := alpha * a[i*lda+l]
        +					for j := 0; j < n; j++ {
        +						c[i*ldc+j] += tmp * b[l*ldb+j]
        +					}
        +				}
        +			}
        +		case blas.Trans:
        +			// Form  C = alpha * A * Bᵀ + beta * C.
        +			for i := 0; i < m; i++ {
        +				switch {
        +				case beta == 0:
        +					for j := 0; j < n; j++ {
        +						c[i*ldc+j] = 0
        +					}
        +				case beta != 1:
        +					for j := 0; j < n; j++ {
        +						c[i*ldc+j] *= beta
        +					}
        +				}
        +				for l := 0; l < k; l++ {
        +					tmp := alpha * a[i*lda+l]
        +					for j := 0; j < n; j++ {
        +						c[i*ldc+j] += tmp * b[j*ldb+l]
        +					}
        +				}
        +			}
        +		case blas.ConjTrans:
        +			// Form  C = alpha * A * Bᴴ + beta * C.
        +			for i := 0; i < m; i++ {
        +				switch {
        +				case beta == 0:
        +					for j := 0; j < n; j++ {
        +						c[i*ldc+j] = 0
        +					}
        +				case beta != 1:
        +					for j := 0; j < n; j++ {
        +						c[i*ldc+j] *= beta
        +					}
        +				}
        +				for l := 0; l < k; l++ {
        +					tmp := alpha * a[i*lda+l]
        +					for j := 0; j < n; j++ {
        +						c[i*ldc+j] += tmp * cmplx.Conj(b[j*ldb+l])
        +					}
        +				}
        +			}
        +		}
        +	case blas.Trans:
        +		switch tB {
        +		case blas.NoTrans:
        +			// Form  C = alpha * Aᵀ * B + beta * C.
        +			for i := 0; i < m; i++ {
        +				for j := 0; j < n; j++ {
        +					var tmp complex128
        +					for l := 0; l < k; l++ {
        +						tmp += a[l*lda+i] * b[l*ldb+j]
        +					}
        +					if beta == 0 {
        +						c[i*ldc+j] = alpha * tmp
        +					} else {
        +						c[i*ldc+j] = alpha*tmp + beta*c[i*ldc+j]
        +					}
        +				}
        +			}
        +		case blas.Trans:
        +			// Form  C = alpha * Aᵀ * Bᵀ + beta * C.
        +			for i := 0; i < m; i++ {
        +				for j := 0; j < n; j++ {
        +					var tmp complex128
        +					for l := 0; l < k; l++ {
        +						tmp += a[l*lda+i] * b[j*ldb+l]
        +					}
        +					if beta == 0 {
        +						c[i*ldc+j] = alpha * tmp
        +					} else {
        +						c[i*ldc+j] = alpha*tmp + beta*c[i*ldc+j]
        +					}
        +				}
        +			}
        +		case blas.ConjTrans:
        +			// Form  C = alpha * Aᵀ * Bᴴ + beta * C.
        +			for i := 0; i < m; i++ {
        +				for j := 0; j < n; j++ {
        +					var tmp complex128
        +					for l := 0; l < k; l++ {
        +						tmp += a[l*lda+i] * cmplx.Conj(b[j*ldb+l])
        +					}
        +					if beta == 0 {
        +						c[i*ldc+j] = alpha * tmp
        +					} else {
        +						c[i*ldc+j] = alpha*tmp + beta*c[i*ldc+j]
        +					}
        +				}
        +			}
        +		}
        +	case blas.ConjTrans:
        +		switch tB {
        +		case blas.NoTrans:
        +			// Form  C = alpha * Aᴴ * B + beta * C.
        +			for i := 0; i < m; i++ {
        +				for j := 0; j < n; j++ {
        +					var tmp complex128
        +					for l := 0; l < k; l++ {
        +						tmp += cmplx.Conj(a[l*lda+i]) * b[l*ldb+j]
        +					}
        +					if beta == 0 {
        +						c[i*ldc+j] = alpha * tmp
        +					} else {
        +						c[i*ldc+j] = alpha*tmp + beta*c[i*ldc+j]
        +					}
        +				}
        +			}
        +		case blas.Trans:
        +			// Form  C = alpha * Aᴴ * Bᵀ + beta * C.
        +			for i := 0; i < m; i++ {
        +				for j := 0; j < n; j++ {
        +					var tmp complex128
        +					for l := 0; l < k; l++ {
        +						tmp += cmplx.Conj(a[l*lda+i]) * b[j*ldb+l]
        +					}
        +					if beta == 0 {
        +						c[i*ldc+j] = alpha * tmp
        +					} else {
        +						c[i*ldc+j] = alpha*tmp + beta*c[i*ldc+j]
        +					}
        +				}
        +			}
        +		case blas.ConjTrans:
        +			// Form  C = alpha * Aᴴ * Bᴴ + beta * C.
        +			for i := 0; i < m; i++ {
        +				for j := 0; j < n; j++ {
        +					var tmp complex128
        +					for l := 0; l < k; l++ {
        +						tmp += cmplx.Conj(a[l*lda+i]) * cmplx.Conj(b[j*ldb+l])
        +					}
        +					if beta == 0 {
        +						c[i*ldc+j] = alpha * tmp
        +					} else {
        +						c[i*ldc+j] = alpha*tmp + beta*c[i*ldc+j]
        +					}
        +				}
        +			}
        +		}
        +	}
        +}
        +
        +// Zhemm performs one of the matrix-matrix operations
        +//  C = alpha*A*B + beta*C  if side == blas.Left
        +//  C = alpha*B*A + beta*C  if side == blas.Right
        +// where alpha and beta are scalars, A is an m×m or n×n hermitian matrix and B
        +// and C are m×n matrices. The imaginary parts of the diagonal elements of A are
        +// assumed to be zero.
        +func (Implementation) Zhemm(side blas.Side, uplo blas.Uplo, m, n int, alpha complex128, a []complex128, lda int, b []complex128, ldb int, beta complex128, c []complex128, ldc int) {
        +	na := m
        +	if side == blas.Right {
        +		na = n
        +	}
        +	switch {
        +	case side != blas.Left && side != blas.Right:
        +		panic(badSide)
        +	case uplo != blas.Lower && uplo != blas.Upper:
        +		panic(badUplo)
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, na):
        +		panic(badLdA)
        +	case ldb < max(1, n):
        +		panic(badLdB)
        +	case ldc < max(1, n):
        +		panic(badLdC)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(na-1)+na {
        +		panic(shortA)
        +	}
        +	if len(b) < ldb*(m-1)+n {
        +		panic(shortB)
        +	}
        +	if len(c) < ldc*(m-1)+n {
        +		panic(shortC)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 && beta == 1 {
        +		return
        +	}
        +
        +	if alpha == 0 {
        +		if beta == 0 {
        +			for i := 0; i < m; i++ {
        +				ci := c[i*ldc : i*ldc+n]
        +				for j := range ci {
        +					ci[j] = 0
        +				}
        +			}
        +		} else {
        +			for i := 0; i < m; i++ {
        +				ci := c[i*ldc : i*ldc+n]
        +				c128.ScalUnitary(beta, ci)
        +			}
        +		}
        +		return
        +	}
        +
        +	if side == blas.Left {
        +		// Form  C = alpha*A*B + beta*C.
        +		for i := 0; i < m; i++ {
        +			atmp := alpha * complex(real(a[i*lda+i]), 0)
        +			bi := b[i*ldb : i*ldb+n]
        +			ci := c[i*ldc : i*ldc+n]
        +			if beta == 0 {
        +				for j, bij := range bi {
        +					ci[j] = atmp * bij
        +				}
        +			} else {
        +				for j, bij := range bi {
        +					ci[j] = atmp*bij + beta*ci[j]
        +				}
        +			}
        +			if uplo == blas.Upper {
        +				for k := 0; k < i; k++ {
        +					atmp = alpha * cmplx.Conj(a[k*lda+i])
        +					c128.AxpyUnitary(atmp, b[k*ldb:k*ldb+n], ci)
        +				}
        +				for k := i + 1; k < m; k++ {
        +					atmp = alpha * a[i*lda+k]
        +					c128.AxpyUnitary(atmp, b[k*ldb:k*ldb+n], ci)
        +				}
        +			} else {
        +				for k := 0; k < i; k++ {
        +					atmp = alpha * a[i*lda+k]
        +					c128.AxpyUnitary(atmp, b[k*ldb:k*ldb+n], ci)
        +				}
        +				for k := i + 1; k < m; k++ {
        +					atmp = alpha * cmplx.Conj(a[k*lda+i])
        +					c128.AxpyUnitary(atmp, b[k*ldb:k*ldb+n], ci)
        +				}
        +			}
        +		}
        +	} else {
        +		// Form  C = alpha*B*A + beta*C.
        +		if uplo == blas.Upper {
        +			for i := 0; i < m; i++ {
        +				for j := n - 1; j >= 0; j-- {
        +					abij := alpha * b[i*ldb+j]
        +					aj := a[j*lda+j+1 : j*lda+n]
        +					bi := b[i*ldb+j+1 : i*ldb+n]
        +					ci := c[i*ldc+j+1 : i*ldc+n]
        +					var tmp complex128
        +					for k, ajk := range aj {
        +						ci[k] += abij * ajk
        +						tmp += bi[k] * cmplx.Conj(ajk)
        +					}
        +					ajj := complex(real(a[j*lda+j]), 0)
        +					if beta == 0 {
        +						c[i*ldc+j] = abij*ajj + alpha*tmp
        +					} else {
        +						c[i*ldc+j] = abij*ajj + alpha*tmp + beta*c[i*ldc+j]
        +					}
        +				}
        +			}
        +		} else {
        +			for i := 0; i < m; i++ {
        +				for j := 0; j < n; j++ {
        +					abij := alpha * b[i*ldb+j]
        +					aj := a[j*lda : j*lda+j]
        +					bi := b[i*ldb : i*ldb+j]
        +					ci := c[i*ldc : i*ldc+j]
        +					var tmp complex128
        +					for k, ajk := range aj {
        +						ci[k] += abij * ajk
        +						tmp += bi[k] * cmplx.Conj(ajk)
        +					}
        +					ajj := complex(real(a[j*lda+j]), 0)
        +					if beta == 0 {
        +						c[i*ldc+j] = abij*ajj + alpha*tmp
        +					} else {
        +						c[i*ldc+j] = abij*ajj + alpha*tmp + beta*c[i*ldc+j]
        +					}
        +				}
        +			}
        +		}
        +	}
        +}
        +
        +// Zherk performs one of the hermitian rank-k operations
        +//  C = alpha*A*Aᴴ + beta*C  if trans == blas.NoTrans
        +//  C = alpha*Aᴴ*A + beta*C  if trans == blas.ConjTrans
        +// where alpha and beta are real scalars, C is an n×n hermitian matrix and A is
        +// an n×k matrix in the first case and a k×n matrix in the second case.
        +//
        +// The imaginary parts of the diagonal elements of C are assumed to be zero, and
        +// on return they will be set to zero.
        +func (Implementation) Zherk(uplo blas.Uplo, trans blas.Transpose, n, k int, alpha float64, a []complex128, lda int, beta float64, c []complex128, ldc int) {
        +	var rowA, colA int
        +	switch trans {
        +	default:
        +		panic(badTranspose)
        +	case blas.NoTrans:
        +		rowA, colA = n, k
        +	case blas.ConjTrans:
        +		rowA, colA = k, n
        +	}
        +	switch {
        +	case uplo != blas.Lower && uplo != blas.Upper:
        +		panic(badUplo)
        +	case n < 0:
        +		panic(nLT0)
        +	case k < 0:
        +		panic(kLT0)
        +	case lda < max(1, colA):
        +		panic(badLdA)
        +	case ldc < max(1, n):
        +		panic(badLdC)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < (rowA-1)*lda+colA {
        +		panic(shortA)
        +	}
        +	if len(c) < (n-1)*ldc+n {
        +		panic(shortC)
        +	}
        +
        +	// Quick return if possible.
        +	if (alpha == 0 || k == 0) && beta == 1 {
        +		return
        +	}
        +
        +	if alpha == 0 {
        +		if uplo == blas.Upper {
        +			if beta == 0 {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc+i : i*ldc+n]
        +					for j := range ci {
        +						ci[j] = 0
        +					}
        +				}
        +			} else {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc+i : i*ldc+n]
        +					ci[0] = complex(beta*real(ci[0]), 0)
        +					if i != n-1 {
        +						c128.DscalUnitary(beta, ci[1:])
        +					}
        +				}
        +			}
        +		} else {
        +			if beta == 0 {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc : i*ldc+i+1]
        +					for j := range ci {
        +						ci[j] = 0
        +					}
        +				}
        +			} else {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc : i*ldc+i+1]
        +					if i != 0 {
        +						c128.DscalUnitary(beta, ci[:i])
        +					}
        +					ci[i] = complex(beta*real(ci[i]), 0)
        +				}
        +			}
        +		}
        +		return
        +	}
        +
        +	calpha := complex(alpha, 0)
        +	if trans == blas.NoTrans {
        +		// Form  C = alpha*A*Aᴴ + beta*C.
        +		cbeta := complex(beta, 0)
        +		if uplo == blas.Upper {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc+i : i*ldc+n]
        +				ai := a[i*lda : i*lda+k]
        +				switch {
        +				case beta == 0:
        +					// Handle the i-th diagonal element of C.
        +					ci[0] = complex(alpha*real(c128.DotcUnitary(ai, ai)), 0)
        +					// Handle the remaining elements on the i-th row of C.
        +					for jc := range ci[1:] {
        +						j := i + 1 + jc
        +						ci[jc+1] = calpha * c128.DotcUnitary(a[j*lda:j*lda+k], ai)
        +					}
        +				case beta != 1:
        +					cii := calpha*c128.DotcUnitary(ai, ai) + cbeta*ci[0]
        +					ci[0] = complex(real(cii), 0)
        +					for jc, cij := range ci[1:] {
        +						j := i + 1 + jc
        +						ci[jc+1] = calpha*c128.DotcUnitary(a[j*lda:j*lda+k], ai) + cbeta*cij
        +					}
        +				default:
        +					cii := calpha*c128.DotcUnitary(ai, ai) + ci[0]
        +					ci[0] = complex(real(cii), 0)
        +					for jc, cij := range ci[1:] {
        +						j := i + 1 + jc
        +						ci[jc+1] = calpha*c128.DotcUnitary(a[j*lda:j*lda+k], ai) + cij
        +					}
        +				}
        +			}
        +		} else {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc : i*ldc+i+1]
        +				ai := a[i*lda : i*lda+k]
        +				switch {
        +				case beta == 0:
        +					// Handle the first i-1 elements on the i-th row of C.
        +					for j := range ci[:i] {
        +						ci[j] = calpha * c128.DotcUnitary(a[j*lda:j*lda+k], ai)
        +					}
        +					// Handle the i-th diagonal element of C.
        +					ci[i] = complex(alpha*real(c128.DotcUnitary(ai, ai)), 0)
        +				case beta != 1:
        +					for j, cij := range ci[:i] {
        +						ci[j] = calpha*c128.DotcUnitary(a[j*lda:j*lda+k], ai) + cbeta*cij
        +					}
        +					cii := calpha*c128.DotcUnitary(ai, ai) + cbeta*ci[i]
        +					ci[i] = complex(real(cii), 0)
        +				default:
        +					for j, cij := range ci[:i] {
        +						ci[j] = calpha*c128.DotcUnitary(a[j*lda:j*lda+k], ai) + cij
        +					}
        +					cii := calpha*c128.DotcUnitary(ai, ai) + ci[i]
        +					ci[i] = complex(real(cii), 0)
        +				}
        +			}
        +		}
        +	} else {
        +		// Form  C = alpha*Aᴴ*A + beta*C.
        +		if uplo == blas.Upper {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc+i : i*ldc+n]
        +				switch {
        +				case beta == 0:
        +					for jc := range ci {
        +						ci[jc] = 0
        +					}
        +				case beta != 1:
        +					c128.DscalUnitary(beta, ci)
        +					ci[0] = complex(real(ci[0]), 0)
        +				default:
        +					ci[0] = complex(real(ci[0]), 0)
        +				}
        +				for j := 0; j < k; j++ {
        +					aji := cmplx.Conj(a[j*lda+i])
        +					if aji != 0 {
        +						c128.AxpyUnitary(calpha*aji, a[j*lda+i:j*lda+n], ci)
        +					}
        +				}
        +				c[i*ldc+i] = complex(real(c[i*ldc+i]), 0)
        +			}
        +		} else {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc : i*ldc+i+1]
        +				switch {
        +				case beta == 0:
        +					for j := range ci {
        +						ci[j] = 0
        +					}
        +				case beta != 1:
        +					c128.DscalUnitary(beta, ci)
        +					ci[i] = complex(real(ci[i]), 0)
        +				default:
        +					ci[i] = complex(real(ci[i]), 0)
        +				}
        +				for j := 0; j < k; j++ {
        +					aji := cmplx.Conj(a[j*lda+i])
        +					if aji != 0 {
        +						c128.AxpyUnitary(calpha*aji, a[j*lda:j*lda+i+1], ci)
        +					}
        +				}
        +				c[i*ldc+i] = complex(real(c[i*ldc+i]), 0)
        +			}
        +		}
        +	}
        +}
        +
        +// Zher2k performs one of the hermitian rank-2k operations
        +//  C = alpha*A*Bᴴ + conj(alpha)*B*Aᴴ + beta*C  if trans == blas.NoTrans
        +//  C = alpha*Aᴴ*B + conj(alpha)*Bᴴ*A + beta*C  if trans == blas.ConjTrans
        +// where alpha and beta are scalars with beta real, C is an n×n hermitian matrix
        +// and A and B are n×k matrices in the first case and k×n matrices in the second case.
        +//
        +// The imaginary parts of the diagonal elements of C are assumed to be zero, and
        +// on return they will be set to zero.
        +func (Implementation) Zher2k(uplo blas.Uplo, trans blas.Transpose, n, k int, alpha complex128, a []complex128, lda int, b []complex128, ldb int, beta float64, c []complex128, ldc int) {
        +	var row, col int
        +	switch trans {
        +	default:
        +		panic(badTranspose)
        +	case blas.NoTrans:
        +		row, col = n, k
        +	case blas.ConjTrans:
        +		row, col = k, n
        +	}
        +	switch {
        +	case uplo != blas.Lower && uplo != blas.Upper:
        +		panic(badUplo)
        +	case n < 0:
        +		panic(nLT0)
        +	case k < 0:
        +		panic(kLT0)
        +	case lda < max(1, col):
        +		panic(badLdA)
        +	case ldb < max(1, col):
        +		panic(badLdB)
        +	case ldc < max(1, n):
        +		panic(badLdC)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < (row-1)*lda+col {
        +		panic(shortA)
        +	}
        +	if len(b) < (row-1)*ldb+col {
        +		panic(shortB)
        +	}
        +	if len(c) < (n-1)*ldc+n {
        +		panic(shortC)
        +	}
        +
        +	// Quick return if possible.
        +	if (alpha == 0 || k == 0) && beta == 1 {
        +		return
        +	}
        +
        +	if alpha == 0 {
        +		if uplo == blas.Upper {
        +			if beta == 0 {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc+i : i*ldc+n]
        +					for j := range ci {
        +						ci[j] = 0
        +					}
        +				}
        +			} else {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc+i : i*ldc+n]
        +					ci[0] = complex(beta*real(ci[0]), 0)
        +					if i != n-1 {
        +						c128.DscalUnitary(beta, ci[1:])
        +					}
        +				}
        +			}
        +		} else {
        +			if beta == 0 {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc : i*ldc+i+1]
        +					for j := range ci {
        +						ci[j] = 0
        +					}
        +				}
        +			} else {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc : i*ldc+i+1]
        +					if i != 0 {
        +						c128.DscalUnitary(beta, ci[:i])
        +					}
        +					ci[i] = complex(beta*real(ci[i]), 0)
        +				}
        +			}
        +		}
        +		return
        +	}
        +
        +	conjalpha := cmplx.Conj(alpha)
        +	cbeta := complex(beta, 0)
        +	if trans == blas.NoTrans {
        +		// Form  C = alpha*A*Bᴴ + conj(alpha)*B*Aᴴ + beta*C.
        +		if uplo == blas.Upper {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc+i+1 : i*ldc+n]
        +				ai := a[i*lda : i*lda+k]
        +				bi := b[i*ldb : i*ldb+k]
        +				if beta == 0 {
        +					cii := alpha*c128.DotcUnitary(bi, ai) + conjalpha*c128.DotcUnitary(ai, bi)
        +					c[i*ldc+i] = complex(real(cii), 0)
        +					for jc := range ci {
        +						j := i + 1 + jc
        +						ci[jc] = alpha*c128.DotcUnitary(b[j*ldb:j*ldb+k], ai) + conjalpha*c128.DotcUnitary(a[j*lda:j*lda+k], bi)
        +					}
        +				} else {
        +					cii := alpha*c128.DotcUnitary(bi, ai) + conjalpha*c128.DotcUnitary(ai, bi) + cbeta*c[i*ldc+i]
        +					c[i*ldc+i] = complex(real(cii), 0)
        +					for jc, cij := range ci {
        +						j := i + 1 + jc
        +						ci[jc] = alpha*c128.DotcUnitary(b[j*ldb:j*ldb+k], ai) + conjalpha*c128.DotcUnitary(a[j*lda:j*lda+k], bi) + cbeta*cij
        +					}
        +				}
        +			}
        +		} else {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc : i*ldc+i]
        +				ai := a[i*lda : i*lda+k]
        +				bi := b[i*ldb : i*ldb+k]
        +				if beta == 0 {
        +					for j := range ci {
        +						ci[j] = alpha*c128.DotcUnitary(b[j*ldb:j*ldb+k], ai) + conjalpha*c128.DotcUnitary(a[j*lda:j*lda+k], bi)
        +					}
        +					cii := alpha*c128.DotcUnitary(bi, ai) + conjalpha*c128.DotcUnitary(ai, bi)
        +					c[i*ldc+i] = complex(real(cii), 0)
        +				} else {
        +					for j, cij := range ci {
        +						ci[j] = alpha*c128.DotcUnitary(b[j*ldb:j*ldb+k], ai) + conjalpha*c128.DotcUnitary(a[j*lda:j*lda+k], bi) + cbeta*cij
        +					}
        +					cii := alpha*c128.DotcUnitary(bi, ai) + conjalpha*c128.DotcUnitary(ai, bi) + cbeta*c[i*ldc+i]
        +					c[i*ldc+i] = complex(real(cii), 0)
        +				}
        +			}
        +		}
        +	} else {
        +		// Form  C = alpha*Aᴴ*B + conj(alpha)*Bᴴ*A + beta*C.
        +		if uplo == blas.Upper {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc+i : i*ldc+n]
        +				switch {
        +				case beta == 0:
        +					for jc := range ci {
        +						ci[jc] = 0
        +					}
        +				case beta != 1:
        +					c128.DscalUnitary(beta, ci)
        +					ci[0] = complex(real(ci[0]), 0)
        +				default:
        +					ci[0] = complex(real(ci[0]), 0)
        +				}
        +				for j := 0; j < k; j++ {
        +					aji := a[j*lda+i]
        +					bji := b[j*ldb+i]
        +					if aji != 0 {
        +						c128.AxpyUnitary(alpha*cmplx.Conj(aji), b[j*ldb+i:j*ldb+n], ci)
        +					}
        +					if bji != 0 {
        +						c128.AxpyUnitary(conjalpha*cmplx.Conj(bji), a[j*lda+i:j*lda+n], ci)
        +					}
        +				}
        +				ci[0] = complex(real(ci[0]), 0)
        +			}
        +		} else {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc : i*ldc+i+1]
        +				switch {
        +				case beta == 0:
        +					for j := range ci {
        +						ci[j] = 0
        +					}
        +				case beta != 1:
        +					c128.DscalUnitary(beta, ci)
        +					ci[i] = complex(real(ci[i]), 0)
        +				default:
        +					ci[i] = complex(real(ci[i]), 0)
        +				}
        +				for j := 0; j < k; j++ {
        +					aji := a[j*lda+i]
        +					bji := b[j*ldb+i]
        +					if aji != 0 {
        +						c128.AxpyUnitary(alpha*cmplx.Conj(aji), b[j*ldb:j*ldb+i+1], ci)
        +					}
        +					if bji != 0 {
        +						c128.AxpyUnitary(conjalpha*cmplx.Conj(bji), a[j*lda:j*lda+i+1], ci)
        +					}
        +				}
        +				ci[i] = complex(real(ci[i]), 0)
        +			}
        +		}
        +	}
        +}
        +
        +// Zsymm performs one of the matrix-matrix operations
        +//  C = alpha*A*B + beta*C  if side == blas.Left
        +//  C = alpha*B*A + beta*C  if side == blas.Right
        +// where alpha and beta are scalars, A is an m×m or n×n symmetric matrix and B
        +// and C are m×n matrices.
        +func (Implementation) Zsymm(side blas.Side, uplo blas.Uplo, m, n int, alpha complex128, a []complex128, lda int, b []complex128, ldb int, beta complex128, c []complex128, ldc int) {
        +	na := m
        +	if side == blas.Right {
        +		na = n
        +	}
        +	switch {
        +	case side != blas.Left && side != blas.Right:
        +		panic(badSide)
        +	case uplo != blas.Lower && uplo != blas.Upper:
        +		panic(badUplo)
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, na):
        +		panic(badLdA)
        +	case ldb < max(1, n):
        +		panic(badLdB)
        +	case ldc < max(1, n):
        +		panic(badLdC)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(na-1)+na {
        +		panic(shortA)
        +	}
        +	if len(b) < ldb*(m-1)+n {
        +		panic(shortB)
        +	}
        +	if len(c) < ldc*(m-1)+n {
        +		panic(shortC)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 && beta == 1 {
        +		return
        +	}
        +
        +	if alpha == 0 {
        +		if beta == 0 {
        +			for i := 0; i < m; i++ {
        +				ci := c[i*ldc : i*ldc+n]
        +				for j := range ci {
        +					ci[j] = 0
        +				}
        +			}
        +		} else {
        +			for i := 0; i < m; i++ {
        +				ci := c[i*ldc : i*ldc+n]
        +				c128.ScalUnitary(beta, ci)
        +			}
        +		}
        +		return
        +	}
        +
        +	if side == blas.Left {
        +		// Form  C = alpha*A*B + beta*C.
        +		for i := 0; i < m; i++ {
        +			atmp := alpha * a[i*lda+i]
        +			bi := b[i*ldb : i*ldb+n]
        +			ci := c[i*ldc : i*ldc+n]
        +			if beta == 0 {
        +				for j, bij := range bi {
        +					ci[j] = atmp * bij
        +				}
        +			} else {
        +				for j, bij := range bi {
        +					ci[j] = atmp*bij + beta*ci[j]
        +				}
        +			}
        +			if uplo == blas.Upper {
        +				for k := 0; k < i; k++ {
        +					atmp = alpha * a[k*lda+i]
        +					c128.AxpyUnitary(atmp, b[k*ldb:k*ldb+n], ci)
        +				}
        +				for k := i + 1; k < m; k++ {
        +					atmp = alpha * a[i*lda+k]
        +					c128.AxpyUnitary(atmp, b[k*ldb:k*ldb+n], ci)
        +				}
        +			} else {
        +				for k := 0; k < i; k++ {
        +					atmp = alpha * a[i*lda+k]
        +					c128.AxpyUnitary(atmp, b[k*ldb:k*ldb+n], ci)
        +				}
        +				for k := i + 1; k < m; k++ {
        +					atmp = alpha * a[k*lda+i]
        +					c128.AxpyUnitary(atmp, b[k*ldb:k*ldb+n], ci)
        +				}
        +			}
        +		}
        +	} else {
        +		// Form  C = alpha*B*A + beta*C.
        +		if uplo == blas.Upper {
        +			for i := 0; i < m; i++ {
        +				for j := n - 1; j >= 0; j-- {
        +					abij := alpha * b[i*ldb+j]
        +					aj := a[j*lda+j+1 : j*lda+n]
        +					bi := b[i*ldb+j+1 : i*ldb+n]
        +					ci := c[i*ldc+j+1 : i*ldc+n]
        +					var tmp complex128
        +					for k, ajk := range aj {
        +						ci[k] += abij * ajk
        +						tmp += bi[k] * ajk
        +					}
        +					if beta == 0 {
        +						c[i*ldc+j] = abij*a[j*lda+j] + alpha*tmp
        +					} else {
        +						c[i*ldc+j] = abij*a[j*lda+j] + alpha*tmp + beta*c[i*ldc+j]
        +					}
        +				}
        +			}
        +		} else {
        +			for i := 0; i < m; i++ {
        +				for j := 0; j < n; j++ {
        +					abij := alpha * b[i*ldb+j]
        +					aj := a[j*lda : j*lda+j]
        +					bi := b[i*ldb : i*ldb+j]
        +					ci := c[i*ldc : i*ldc+j]
        +					var tmp complex128
        +					for k, ajk := range aj {
        +						ci[k] += abij * ajk
        +						tmp += bi[k] * ajk
        +					}
        +					if beta == 0 {
        +						c[i*ldc+j] = abij*a[j*lda+j] + alpha*tmp
        +					} else {
        +						c[i*ldc+j] = abij*a[j*lda+j] + alpha*tmp + beta*c[i*ldc+j]
        +					}
        +				}
        +			}
        +		}
        +	}
        +}
        +
        +// Zsyrk performs one of the symmetric rank-k operations
        +//  C = alpha*A*Aᵀ + beta*C  if trans == blas.NoTrans
        +//  C = alpha*Aᵀ*A + beta*C  if trans == blas.Trans
        +// where alpha and beta are scalars, C is an n×n symmetric matrix and A is
        +// an n×k matrix in the first case and a k×n matrix in the second case.
        +func (Implementation) Zsyrk(uplo blas.Uplo, trans blas.Transpose, n, k int, alpha complex128, a []complex128, lda int, beta complex128, c []complex128, ldc int) {
        +	var rowA, colA int
        +	switch trans {
        +	default:
        +		panic(badTranspose)
        +	case blas.NoTrans:
        +		rowA, colA = n, k
        +	case blas.Trans:
        +		rowA, colA = k, n
        +	}
        +	switch {
        +	case uplo != blas.Lower && uplo != blas.Upper:
        +		panic(badUplo)
        +	case n < 0:
        +		panic(nLT0)
        +	case k < 0:
        +		panic(kLT0)
        +	case lda < max(1, colA):
        +		panic(badLdA)
        +	case ldc < max(1, n):
        +		panic(badLdC)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < (rowA-1)*lda+colA {
        +		panic(shortA)
        +	}
        +	if len(c) < (n-1)*ldc+n {
        +		panic(shortC)
        +	}
        +
        +	// Quick return if possible.
        +	if (alpha == 0 || k == 0) && beta == 1 {
        +		return
        +	}
        +
        +	if alpha == 0 {
        +		if uplo == blas.Upper {
        +			if beta == 0 {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc+i : i*ldc+n]
        +					for j := range ci {
        +						ci[j] = 0
        +					}
        +				}
        +			} else {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc+i : i*ldc+n]
        +					c128.ScalUnitary(beta, ci)
        +				}
        +			}
        +		} else {
        +			if beta == 0 {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc : i*ldc+i+1]
        +					for j := range ci {
        +						ci[j] = 0
        +					}
        +				}
        +			} else {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc : i*ldc+i+1]
        +					c128.ScalUnitary(beta, ci)
        +				}
        +			}
        +		}
        +		return
        +	}
        +
        +	if trans == blas.NoTrans {
        +		// Form  C = alpha*A*Aᵀ + beta*C.
        +		if uplo == blas.Upper {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc+i : i*ldc+n]
        +				ai := a[i*lda : i*lda+k]
        +				for jc, cij := range ci {
        +					j := i + jc
        +					ci[jc] = beta*cij + alpha*c128.DotuUnitary(ai, a[j*lda:j*lda+k])
        +				}
        +			}
        +		} else {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc : i*ldc+i+1]
        +				ai := a[i*lda : i*lda+k]
        +				for j, cij := range ci {
        +					ci[j] = beta*cij + alpha*c128.DotuUnitary(ai, a[j*lda:j*lda+k])
        +				}
        +			}
        +		}
        +	} else {
        +		// Form  C = alpha*Aᵀ*A + beta*C.
        +		if uplo == blas.Upper {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc+i : i*ldc+n]
        +				switch {
        +				case beta == 0:
        +					for jc := range ci {
        +						ci[jc] = 0
        +					}
        +				case beta != 1:
        +					for jc := range ci {
        +						ci[jc] *= beta
        +					}
        +				}
        +				for j := 0; j < k; j++ {
        +					aji := a[j*lda+i]
        +					if aji != 0 {
        +						c128.AxpyUnitary(alpha*aji, a[j*lda+i:j*lda+n], ci)
        +					}
        +				}
        +			}
        +		} else {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc : i*ldc+i+1]
        +				switch {
        +				case beta == 0:
        +					for j := range ci {
        +						ci[j] = 0
        +					}
        +				case beta != 1:
        +					for j := range ci {
        +						ci[j] *= beta
        +					}
        +				}
        +				for j := 0; j < k; j++ {
        +					aji := a[j*lda+i]
        +					if aji != 0 {
        +						c128.AxpyUnitary(alpha*aji, a[j*lda:j*lda+i+1], ci)
        +					}
        +				}
        +			}
        +		}
        +	}
        +}
        +
        +// Zsyr2k performs one of the symmetric rank-2k operations
        +//  C = alpha*A*Bᵀ + alpha*B*Aᵀ + beta*C  if trans == blas.NoTrans
        +//  C = alpha*Aᵀ*B + alpha*Bᵀ*A + beta*C  if trans == blas.Trans
        +// where alpha and beta are scalars, C is an n×n symmetric matrix and A and B
        +// are n×k matrices in the first case and k×n matrices in the second case.
        +func (Implementation) Zsyr2k(uplo blas.Uplo, trans blas.Transpose, n, k int, alpha complex128, a []complex128, lda int, b []complex128, ldb int, beta complex128, c []complex128, ldc int) {
        +	var row, col int
        +	switch trans {
        +	default:
        +		panic(badTranspose)
        +	case blas.NoTrans:
        +		row, col = n, k
        +	case blas.Trans:
        +		row, col = k, n
        +	}
        +	switch {
        +	case uplo != blas.Lower && uplo != blas.Upper:
        +		panic(badUplo)
        +	case n < 0:
        +		panic(nLT0)
        +	case k < 0:
        +		panic(kLT0)
        +	case lda < max(1, col):
        +		panic(badLdA)
        +	case ldb < max(1, col):
        +		panic(badLdB)
        +	case ldc < max(1, n):
        +		panic(badLdC)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < (row-1)*lda+col {
        +		panic(shortA)
        +	}
        +	if len(b) < (row-1)*ldb+col {
        +		panic(shortB)
        +	}
        +	if len(c) < (n-1)*ldc+n {
        +		panic(shortC)
        +	}
        +
        +	// Quick return if possible.
        +	if (alpha == 0 || k == 0) && beta == 1 {
        +		return
        +	}
        +
        +	if alpha == 0 {
        +		if uplo == blas.Upper {
        +			if beta == 0 {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc+i : i*ldc+n]
        +					for j := range ci {
        +						ci[j] = 0
        +					}
        +				}
        +			} else {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc+i : i*ldc+n]
        +					c128.ScalUnitary(beta, ci)
        +				}
        +			}
        +		} else {
        +			if beta == 0 {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc : i*ldc+i+1]
        +					for j := range ci {
        +						ci[j] = 0
        +					}
        +				}
        +			} else {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc : i*ldc+i+1]
        +					c128.ScalUnitary(beta, ci)
        +				}
        +			}
        +		}
        +		return
        +	}
        +
        +	if trans == blas.NoTrans {
        +		// Form  C = alpha*A*Bᵀ + alpha*B*Aᵀ + beta*C.
        +		if uplo == blas.Upper {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc+i : i*ldc+n]
        +				ai := a[i*lda : i*lda+k]
        +				bi := b[i*ldb : i*ldb+k]
        +				if beta == 0 {
        +					for jc := range ci {
        +						j := i + jc
        +						ci[jc] = alpha*c128.DotuUnitary(ai, b[j*ldb:j*ldb+k]) + alpha*c128.DotuUnitary(bi, a[j*lda:j*lda+k])
        +					}
        +				} else {
        +					for jc, cij := range ci {
        +						j := i + jc
        +						ci[jc] = alpha*c128.DotuUnitary(ai, b[j*ldb:j*ldb+k]) + alpha*c128.DotuUnitary(bi, a[j*lda:j*lda+k]) + beta*cij
        +					}
        +				}
        +			}
        +		} else {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc : i*ldc+i+1]
        +				ai := a[i*lda : i*lda+k]
        +				bi := b[i*ldb : i*ldb+k]
        +				if beta == 0 {
        +					for j := range ci {
        +						ci[j] = alpha*c128.DotuUnitary(ai, b[j*ldb:j*ldb+k]) + alpha*c128.DotuUnitary(bi, a[j*lda:j*lda+k])
        +					}
        +				} else {
        +					for j, cij := range ci {
        +						ci[j] = alpha*c128.DotuUnitary(ai, b[j*ldb:j*ldb+k]) + alpha*c128.DotuUnitary(bi, a[j*lda:j*lda+k]) + beta*cij
        +					}
        +				}
        +			}
        +		}
        +	} else {
        +		// Form  C = alpha*Aᵀ*B + alpha*Bᵀ*A + beta*C.
        +		if uplo == blas.Upper {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc+i : i*ldc+n]
        +				switch {
        +				case beta == 0:
        +					for jc := range ci {
        +						ci[jc] = 0
        +					}
        +				case beta != 1:
        +					for jc := range ci {
        +						ci[jc] *= beta
        +					}
        +				}
        +				for j := 0; j < k; j++ {
        +					aji := a[j*lda+i]
        +					bji := b[j*ldb+i]
        +					if aji != 0 {
        +						c128.AxpyUnitary(alpha*aji, b[j*ldb+i:j*ldb+n], ci)
        +					}
        +					if bji != 0 {
        +						c128.AxpyUnitary(alpha*bji, a[j*lda+i:j*lda+n], ci)
        +					}
        +				}
        +			}
        +		} else {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc : i*ldc+i+1]
        +				switch {
        +				case beta == 0:
        +					for j := range ci {
        +						ci[j] = 0
        +					}
        +				case beta != 1:
        +					for j := range ci {
        +						ci[j] *= beta
        +					}
        +				}
        +				for j := 0; j < k; j++ {
        +					aji := a[j*lda+i]
        +					bji := b[j*ldb+i]
        +					if aji != 0 {
        +						c128.AxpyUnitary(alpha*aji, b[j*ldb:j*ldb+i+1], ci)
        +					}
        +					if bji != 0 {
        +						c128.AxpyUnitary(alpha*bji, a[j*lda:j*lda+i+1], ci)
        +					}
        +				}
        +			}
        +		}
        +	}
        +}
        +
        +// Ztrmm performs one of the matrix-matrix operations
        +//  B = alpha * op(A) * B  if side == blas.Left,
        +//  B = alpha * B * op(A)  if side == blas.Right,
        +// where alpha is a scalar, B is an m×n matrix, A is a unit, or non-unit,
        +// upper or lower triangular matrix and op(A) is one of
        +//  op(A) = A   if trans == blas.NoTrans,
        +//  op(A) = Aᵀ  if trans == blas.Trans,
        +//  op(A) = Aᴴ  if trans == blas.ConjTrans.
        +func (Implementation) Ztrmm(side blas.Side, uplo blas.Uplo, trans blas.Transpose, diag blas.Diag, m, n int, alpha complex128, a []complex128, lda int, b []complex128, ldb int) {
        +	na := m
        +	if side == blas.Right {
        +		na = n
        +	}
        +	switch {
        +	case side != blas.Left && side != blas.Right:
        +		panic(badSide)
        +	case uplo != blas.Lower && uplo != blas.Upper:
        +		panic(badUplo)
        +	case trans != blas.NoTrans && trans != blas.Trans && trans != blas.ConjTrans:
        +		panic(badTranspose)
        +	case diag != blas.Unit && diag != blas.NonUnit:
        +		panic(badDiag)
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, na):
        +		panic(badLdA)
        +	case ldb < max(1, n):
        +		panic(badLdB)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < (na-1)*lda+na {
        +		panic(shortA)
        +	}
        +	if len(b) < (m-1)*ldb+n {
        +		panic(shortB)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 {
        +		for i := 0; i < m; i++ {
        +			bi := b[i*ldb : i*ldb+n]
        +			for j := range bi {
        +				bi[j] = 0
        +			}
        +		}
        +		return
        +	}
        +
        +	noConj := trans != blas.ConjTrans
        +	noUnit := diag == blas.NonUnit
        +	if side == blas.Left {
        +		if trans == blas.NoTrans {
        +			// Form B = alpha*A*B.
        +			if uplo == blas.Upper {
        +				for i := 0; i < m; i++ {
        +					aii := alpha
        +					if noUnit {
        +						aii *= a[i*lda+i]
        +					}
        +					bi := b[i*ldb : i*ldb+n]
        +					for j := range bi {
        +						bi[j] *= aii
        +					}
        +					for ja, aij := range a[i*lda+i+1 : i*lda+m] {
        +						j := ja + i + 1
        +						if aij != 0 {
        +							c128.AxpyUnitary(alpha*aij, b[j*ldb:j*ldb+n], bi)
        +						}
        +					}
        +				}
        +			} else {
        +				for i := m - 1; i >= 0; i-- {
        +					aii := alpha
        +					if noUnit {
        +						aii *= a[i*lda+i]
        +					}
        +					bi := b[i*ldb : i*ldb+n]
        +					for j := range bi {
        +						bi[j] *= aii
        +					}
        +					for j, aij := range a[i*lda : i*lda+i] {
        +						if aij != 0 {
        +							c128.AxpyUnitary(alpha*aij, b[j*ldb:j*ldb+n], bi)
        +						}
        +					}
        +				}
        +			}
        +		} else {
        +			// Form B = alpha*Aᵀ*B  or  B = alpha*Aᴴ*B.
        +			if uplo == blas.Upper {
        +				for k := m - 1; k >= 0; k-- {
        +					bk := b[k*ldb : k*ldb+n]
        +					for ja, ajk := range a[k*lda+k+1 : k*lda+m] {
        +						if ajk == 0 {
        +							continue
        +						}
        +						j := k + 1 + ja
        +						if noConj {
        +							c128.AxpyUnitary(alpha*ajk, bk, b[j*ldb:j*ldb+n])
        +						} else {
        +							c128.AxpyUnitary(alpha*cmplx.Conj(ajk), bk, b[j*ldb:j*ldb+n])
        +						}
        +					}
        +					akk := alpha
        +					if noUnit {
        +						if noConj {
        +							akk *= a[k*lda+k]
        +						} else {
        +							akk *= cmplx.Conj(a[k*lda+k])
        +						}
        +					}
        +					if akk != 1 {
        +						c128.ScalUnitary(akk, bk)
        +					}
        +				}
        +			} else {
        +				for k := 0; k < m; k++ {
        +					bk := b[k*ldb : k*ldb+n]
        +					for j, ajk := range a[k*lda : k*lda+k] {
        +						if ajk == 0 {
        +							continue
        +						}
        +						if noConj {
        +							c128.AxpyUnitary(alpha*ajk, bk, b[j*ldb:j*ldb+n])
        +						} else {
        +							c128.AxpyUnitary(alpha*cmplx.Conj(ajk), bk, b[j*ldb:j*ldb+n])
        +						}
        +					}
        +					akk := alpha
        +					if noUnit {
        +						if noConj {
        +							akk *= a[k*lda+k]
        +						} else {
        +							akk *= cmplx.Conj(a[k*lda+k])
        +						}
        +					}
        +					if akk != 1 {
        +						c128.ScalUnitary(akk, bk)
        +					}
        +				}
        +			}
        +		}
        +	} else {
        +		if trans == blas.NoTrans {
        +			// Form B = alpha*B*A.
        +			if uplo == blas.Upper {
        +				for i := 0; i < m; i++ {
        +					bi := b[i*ldb : i*ldb+n]
        +					for k := n - 1; k >= 0; k-- {
        +						abik := alpha * bi[k]
        +						if abik == 0 {
        +							continue
        +						}
        +						bi[k] = abik
        +						if noUnit {
        +							bi[k] *= a[k*lda+k]
        +						}
        +						c128.AxpyUnitary(abik, a[k*lda+k+1:k*lda+n], bi[k+1:])
        +					}
        +				}
        +			} else {
        +				for i := 0; i < m; i++ {
        +					bi := b[i*ldb : i*ldb+n]
        +					for k := 0; k < n; k++ {
        +						abik := alpha * bi[k]
        +						if abik == 0 {
        +							continue
        +						}
        +						bi[k] = abik
        +						if noUnit {
        +							bi[k] *= a[k*lda+k]
        +						}
        +						c128.AxpyUnitary(abik, a[k*lda:k*lda+k], bi[:k])
        +					}
        +				}
        +			}
        +		} else {
        +			// Form B = alpha*B*Aᵀ  or  B = alpha*B*Aᴴ.
        +			if uplo == blas.Upper {
        +				for i := 0; i < m; i++ {
        +					bi := b[i*ldb : i*ldb+n]
        +					for j, bij := range bi {
        +						if noConj {
        +							if noUnit {
        +								bij *= a[j*lda+j]
        +							}
        +							bij += c128.DotuUnitary(a[j*lda+j+1:j*lda+n], bi[j+1:n])
        +						} else {
        +							if noUnit {
        +								bij *= cmplx.Conj(a[j*lda+j])
        +							}
        +							bij += c128.DotcUnitary(a[j*lda+j+1:j*lda+n], bi[j+1:n])
        +						}
        +						bi[j] = alpha * bij
        +					}
        +				}
        +			} else {
        +				for i := 0; i < m; i++ {
        +					bi := b[i*ldb : i*ldb+n]
        +					for j := n - 1; j >= 0; j-- {
        +						bij := bi[j]
        +						if noConj {
        +							if noUnit {
        +								bij *= a[j*lda+j]
        +							}
        +							bij += c128.DotuUnitary(a[j*lda:j*lda+j], bi[:j])
        +						} else {
        +							if noUnit {
        +								bij *= cmplx.Conj(a[j*lda+j])
        +							}
        +							bij += c128.DotcUnitary(a[j*lda:j*lda+j], bi[:j])
        +						}
        +						bi[j] = alpha * bij
        +					}
        +				}
        +			}
        +		}
        +	}
        +}
        +
        +// Ztrsm solves one of the matrix equations
        +//  op(A) * X = alpha * B  if side == blas.Left,
        +//  X * op(A) = alpha * B  if side == blas.Right,
        +// where alpha is a scalar, X and B are m×n matrices, A is a unit or
        +// non-unit, upper or lower triangular matrix and op(A) is one of
        +//  op(A) = A   if transA == blas.NoTrans,
        +//  op(A) = Aᵀ  if transA == blas.Trans,
        +//  op(A) = Aᴴ  if transA == blas.ConjTrans.
        +// On return the matrix X is overwritten on B.
        +func (Implementation) Ztrsm(side blas.Side, uplo blas.Uplo, transA blas.Transpose, diag blas.Diag, m, n int, alpha complex128, a []complex128, lda int, b []complex128, ldb int) {
        +	na := m
        +	if side == blas.Right {
        +		na = n
        +	}
        +	switch {
        +	case side != blas.Left && side != blas.Right:
        +		panic(badSide)
        +	case uplo != blas.Lower && uplo != blas.Upper:
        +		panic(badUplo)
        +	case transA != blas.NoTrans && transA != blas.Trans && transA != blas.ConjTrans:
        +		panic(badTranspose)
        +	case diag != blas.Unit && diag != blas.NonUnit:
        +		panic(badDiag)
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, na):
        +		panic(badLdA)
        +	case ldb < max(1, n):
        +		panic(badLdB)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < (na-1)*lda+na {
        +		panic(shortA)
        +	}
        +	if len(b) < (m-1)*ldb+n {
        +		panic(shortB)
        +	}
        +
        +	if alpha == 0 {
        +		for i := 0; i < m; i++ {
        +			for j := 0; j < n; j++ {
        +				b[i*ldb+j] = 0
        +			}
        +		}
        +		return
        +	}
        +
        +	noConj := transA != blas.ConjTrans
        +	noUnit := diag == blas.NonUnit
        +	if side == blas.Left {
        +		if transA == blas.NoTrans {
        +			// Form  B = alpha*inv(A)*B.
        +			if uplo == blas.Upper {
        +				for i := m - 1; i >= 0; i-- {
        +					bi := b[i*ldb : i*ldb+n]
        +					if alpha != 1 {
        +						c128.ScalUnitary(alpha, bi)
        +					}
        +					for ka, aik := range a[i*lda+i+1 : i*lda+m] {
        +						k := i + 1 + ka
        +						if aik != 0 {
        +							c128.AxpyUnitary(-aik, b[k*ldb:k*ldb+n], bi)
        +						}
        +					}
        +					if noUnit {
        +						c128.ScalUnitary(1/a[i*lda+i], bi)
        +					}
        +				}
        +			} else {
        +				for i := 0; i < m; i++ {
        +					bi := b[i*ldb : i*ldb+n]
        +					if alpha != 1 {
        +						c128.ScalUnitary(alpha, bi)
        +					}
        +					for j, aij := range a[i*lda : i*lda+i] {
        +						if aij != 0 {
        +							c128.AxpyUnitary(-aij, b[j*ldb:j*ldb+n], bi)
        +						}
        +					}
        +					if noUnit {
        +						c128.ScalUnitary(1/a[i*lda+i], bi)
        +					}
        +				}
        +			}
        +		} else {
        +			// Form  B = alpha*inv(Aᵀ)*B  or  B = alpha*inv(Aᴴ)*B.
        +			if uplo == blas.Upper {
        +				for i := 0; i < m; i++ {
        +					bi := b[i*ldb : i*ldb+n]
        +					if noUnit {
        +						if noConj {
        +							c128.ScalUnitary(1/a[i*lda+i], bi)
        +						} else {
        +							c128.ScalUnitary(1/cmplx.Conj(a[i*lda+i]), bi)
        +						}
        +					}
        +					for ja, aij := range a[i*lda+i+1 : i*lda+m] {
        +						if aij == 0 {
        +							continue
        +						}
        +						j := i + 1 + ja
        +						if noConj {
        +							c128.AxpyUnitary(-aij, bi, b[j*ldb:j*ldb+n])
        +						} else {
        +							c128.AxpyUnitary(-cmplx.Conj(aij), bi, b[j*ldb:j*ldb+n])
        +						}
        +					}
        +					if alpha != 1 {
        +						c128.ScalUnitary(alpha, bi)
        +					}
        +				}
        +			} else {
        +				for i := m - 1; i >= 0; i-- {
        +					bi := b[i*ldb : i*ldb+n]
        +					if noUnit {
        +						if noConj {
        +							c128.ScalUnitary(1/a[i*lda+i], bi)
        +						} else {
        +							c128.ScalUnitary(1/cmplx.Conj(a[i*lda+i]), bi)
        +						}
        +					}
        +					for j, aij := range a[i*lda : i*lda+i] {
        +						if aij == 0 {
        +							continue
        +						}
        +						if noConj {
        +							c128.AxpyUnitary(-aij, bi, b[j*ldb:j*ldb+n])
        +						} else {
        +							c128.AxpyUnitary(-cmplx.Conj(aij), bi, b[j*ldb:j*ldb+n])
        +						}
        +					}
        +					if alpha != 1 {
        +						c128.ScalUnitary(alpha, bi)
        +					}
        +				}
        +			}
        +		}
        +	} else {
        +		if transA == blas.NoTrans {
        +			// Form  B = alpha*B*inv(A).
        +			if uplo == blas.Upper {
        +				for i := 0; i < m; i++ {
        +					bi := b[i*ldb : i*ldb+n]
        +					if alpha != 1 {
        +						c128.ScalUnitary(alpha, bi)
        +					}
        +					for j, bij := range bi {
        +						if bij == 0 {
        +							continue
        +						}
        +						if noUnit {
        +							bi[j] /= a[j*lda+j]
        +						}
        +						c128.AxpyUnitary(-bi[j], a[j*lda+j+1:j*lda+n], bi[j+1:n])
        +					}
        +				}
        +			} else {
        +				for i := 0; i < m; i++ {
        +					bi := b[i*ldb : i*ldb+n]
        +					if alpha != 1 {
        +						c128.ScalUnitary(alpha, bi)
        +					}
        +					for j := n - 1; j >= 0; j-- {
        +						if bi[j] == 0 {
        +							continue
        +						}
        +						if noUnit {
        +							bi[j] /= a[j*lda+j]
        +						}
        +						c128.AxpyUnitary(-bi[j], a[j*lda:j*lda+j], bi[:j])
        +					}
        +				}
        +			}
        +		} else {
        +			// Form  B = alpha*B*inv(Aᵀ)  or   B = alpha*B*inv(Aᴴ).
        +			if uplo == blas.Upper {
        +				for i := 0; i < m; i++ {
        +					bi := b[i*ldb : i*ldb+n]
        +					for j := n - 1; j >= 0; j-- {
        +						bij := alpha * bi[j]
        +						if noConj {
        +							bij -= c128.DotuUnitary(a[j*lda+j+1:j*lda+n], bi[j+1:n])
        +							if noUnit {
        +								bij /= a[j*lda+j]
        +							}
        +						} else {
        +							bij -= c128.DotcUnitary(a[j*lda+j+1:j*lda+n], bi[j+1:n])
        +							if noUnit {
        +								bij /= cmplx.Conj(a[j*lda+j])
        +							}
        +						}
        +						bi[j] = bij
        +					}
        +				}
        +			} else {
        +				for i := 0; i < m; i++ {
        +					bi := b[i*ldb : i*ldb+n]
        +					for j, bij := range bi {
        +						bij *= alpha
        +						if noConj {
        +							bij -= c128.DotuUnitary(a[j*lda:j*lda+j], bi[:j])
        +							if noUnit {
        +								bij /= a[j*lda+j]
        +							}
        +						} else {
        +							bij -= c128.DotcUnitary(a[j*lda:j*lda+j], bi[:j])
        +							if noUnit {
        +								bij /= cmplx.Conj(a[j*lda+j])
        +							}
        +						}
        +						bi[j] = bij
        +					}
        +				}
        +			}
        +		}
        +	}
        +}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/level3cmplx64.go b/vendor/gonum.org/v1/gonum/blas/gonum/level3cmplx64.go
        new file mode 100644
        index 000000000..570b2af10
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/blas/gonum/level3cmplx64.go
        @@ -0,0 +1,1735 @@
        +// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.
        +
        +// Copyright ©2019 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package gonum
        +
        +import (
        +	cmplx "gonum.org/v1/gonum/internal/cmplx64"
        +
        +	"gonum.org/v1/gonum/blas"
        +	"gonum.org/v1/gonum/internal/asm/c64"
        +)
        +
        +var _ blas.Complex64Level3 = Implementation{}
        +
        +// Cgemm performs one of the matrix-matrix operations
        +//  C = alpha * op(A) * op(B) + beta * C
        +// where op(X) is one of
        +//  op(X) = X  or  op(X) = Xᵀ  or  op(X) = Xᴴ,
        +// alpha and beta are scalars, and A, B and C are matrices, with op(A) an m×k matrix,
        +// op(B) a k×n matrix and C an m×n matrix.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Cgemm(tA, tB blas.Transpose, m, n, k int, alpha complex64, a []complex64, lda int, b []complex64, ldb int, beta complex64, c []complex64, ldc int) {
        +	switch tA {
        +	default:
        +		panic(badTranspose)
        +	case blas.NoTrans, blas.Trans, blas.ConjTrans:
        +	}
        +	switch tB {
        +	default:
        +		panic(badTranspose)
        +	case blas.NoTrans, blas.Trans, blas.ConjTrans:
        +	}
        +	switch {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case k < 0:
        +		panic(kLT0)
        +	}
        +	rowA, colA := m, k
        +	if tA != blas.NoTrans {
        +		rowA, colA = k, m
        +	}
        +	if lda < max(1, colA) {
        +		panic(badLdA)
        +	}
        +	rowB, colB := k, n
        +	if tB != blas.NoTrans {
        +		rowB, colB = n, k
        +	}
        +	if ldb < max(1, colB) {
        +		panic(badLdB)
        +	}
        +	if ldc < max(1, n) {
        +		panic(badLdC)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < (rowA-1)*lda+colA {
        +		panic(shortA)
        +	}
        +	if len(b) < (rowB-1)*ldb+colB {
        +		panic(shortB)
        +	}
        +	if len(c) < (m-1)*ldc+n {
        +		panic(shortC)
        +	}
        +
        +	// Quick return if possible.
        +	if (alpha == 0 || k == 0) && beta == 1 {
        +		return
        +	}
        +
        +	if alpha == 0 {
        +		if beta == 0 {
        +			for i := 0; i < m; i++ {
        +				for j := 0; j < n; j++ {
        +					c[i*ldc+j] = 0
        +				}
        +			}
        +		} else {
        +			for i := 0; i < m; i++ {
        +				for j := 0; j < n; j++ {
        +					c[i*ldc+j] *= beta
        +				}
        +			}
        +		}
        +		return
        +	}
        +
        +	switch tA {
        +	case blas.NoTrans:
        +		switch tB {
        +		case blas.NoTrans:
        +			// Form  C = alpha * A * B + beta * C.
        +			for i := 0; i < m; i++ {
        +				switch {
        +				case beta == 0:
        +					for j := 0; j < n; j++ {
        +						c[i*ldc+j] = 0
        +					}
        +				case beta != 1:
        +					for j := 0; j < n; j++ {
        +						c[i*ldc+j] *= beta
        +					}
        +				}
        +				for l := 0; l < k; l++ {
        +					tmp := alpha * a[i*lda+l]
        +					for j := 0; j < n; j++ {
        +						c[i*ldc+j] += tmp * b[l*ldb+j]
        +					}
        +				}
        +			}
        +		case blas.Trans:
        +			// Form  C = alpha * A * Bᵀ + beta * C.
        +			for i := 0; i < m; i++ {
        +				switch {
        +				case beta == 0:
        +					for j := 0; j < n; j++ {
        +						c[i*ldc+j] = 0
        +					}
        +				case beta != 1:
        +					for j := 0; j < n; j++ {
        +						c[i*ldc+j] *= beta
        +					}
        +				}
        +				for l := 0; l < k; l++ {
        +					tmp := alpha * a[i*lda+l]
        +					for j := 0; j < n; j++ {
        +						c[i*ldc+j] += tmp * b[j*ldb+l]
        +					}
        +				}
        +			}
        +		case blas.ConjTrans:
        +			// Form  C = alpha * A * Bᴴ + beta * C.
        +			for i := 0; i < m; i++ {
        +				switch {
        +				case beta == 0:
        +					for j := 0; j < n; j++ {
        +						c[i*ldc+j] = 0
        +					}
        +				case beta != 1:
        +					for j := 0; j < n; j++ {
        +						c[i*ldc+j] *= beta
        +					}
        +				}
        +				for l := 0; l < k; l++ {
        +					tmp := alpha * a[i*lda+l]
        +					for j := 0; j < n; j++ {
        +						c[i*ldc+j] += tmp * cmplx.Conj(b[j*ldb+l])
        +					}
        +				}
        +			}
        +		}
        +	case blas.Trans:
        +		switch tB {
        +		case blas.NoTrans:
        +			// Form  C = alpha * Aᵀ * B + beta * C.
        +			for i := 0; i < m; i++ {
        +				for j := 0; j < n; j++ {
        +					var tmp complex64
        +					for l := 0; l < k; l++ {
        +						tmp += a[l*lda+i] * b[l*ldb+j]
        +					}
        +					if beta == 0 {
        +						c[i*ldc+j] = alpha * tmp
        +					} else {
        +						c[i*ldc+j] = alpha*tmp + beta*c[i*ldc+j]
        +					}
        +				}
        +			}
        +		case blas.Trans:
        +			// Form  C = alpha * Aᵀ * Bᵀ + beta * C.
        +			for i := 0; i < m; i++ {
        +				for j := 0; j < n; j++ {
        +					var tmp complex64
        +					for l := 0; l < k; l++ {
        +						tmp += a[l*lda+i] * b[j*ldb+l]
        +					}
        +					if beta == 0 {
        +						c[i*ldc+j] = alpha * tmp
        +					} else {
        +						c[i*ldc+j] = alpha*tmp + beta*c[i*ldc+j]
        +					}
        +				}
        +			}
        +		case blas.ConjTrans:
        +			// Form  C = alpha * Aᵀ * Bᴴ + beta * C.
        +			for i := 0; i < m; i++ {
        +				for j := 0; j < n; j++ {
        +					var tmp complex64
        +					for l := 0; l < k; l++ {
        +						tmp += a[l*lda+i] * cmplx.Conj(b[j*ldb+l])
        +					}
        +					if beta == 0 {
        +						c[i*ldc+j] = alpha * tmp
        +					} else {
        +						c[i*ldc+j] = alpha*tmp + beta*c[i*ldc+j]
        +					}
        +				}
        +			}
        +		}
        +	case blas.ConjTrans:
        +		switch tB {
        +		case blas.NoTrans:
        +			// Form  C = alpha * Aᴴ * B + beta * C.
        +			for i := 0; i < m; i++ {
        +				for j := 0; j < n; j++ {
        +					var tmp complex64
        +					for l := 0; l < k; l++ {
        +						tmp += cmplx.Conj(a[l*lda+i]) * b[l*ldb+j]
        +					}
        +					if beta == 0 {
        +						c[i*ldc+j] = alpha * tmp
        +					} else {
        +						c[i*ldc+j] = alpha*tmp + beta*c[i*ldc+j]
        +					}
        +				}
        +			}
        +		case blas.Trans:
        +			// Form  C = alpha * Aᴴ * Bᵀ + beta * C.
        +			for i := 0; i < m; i++ {
        +				for j := 0; j < n; j++ {
        +					var tmp complex64
        +					for l := 0; l < k; l++ {
        +						tmp += cmplx.Conj(a[l*lda+i]) * b[j*ldb+l]
        +					}
        +					if beta == 0 {
        +						c[i*ldc+j] = alpha * tmp
        +					} else {
        +						c[i*ldc+j] = alpha*tmp + beta*c[i*ldc+j]
        +					}
        +				}
        +			}
        +		case blas.ConjTrans:
        +			// Form  C = alpha * Aᴴ * Bᴴ + beta * C.
        +			for i := 0; i < m; i++ {
        +				for j := 0; j < n; j++ {
        +					var tmp complex64
        +					for l := 0; l < k; l++ {
        +						tmp += cmplx.Conj(a[l*lda+i]) * cmplx.Conj(b[j*ldb+l])
        +					}
        +					if beta == 0 {
        +						c[i*ldc+j] = alpha * tmp
        +					} else {
        +						c[i*ldc+j] = alpha*tmp + beta*c[i*ldc+j]
        +					}
        +				}
        +			}
        +		}
        +	}
        +}
        +
        +// Chemm performs one of the matrix-matrix operations
        +//  C = alpha*A*B + beta*C  if side == blas.Left
        +//  C = alpha*B*A + beta*C  if side == blas.Right
        +// where alpha and beta are scalars, A is an m×m or n×n hermitian matrix and B
        +// and C are m×n matrices. The imaginary parts of the diagonal elements of A are
        +// assumed to be zero.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Chemm(side blas.Side, uplo blas.Uplo, m, n int, alpha complex64, a []complex64, lda int, b []complex64, ldb int, beta complex64, c []complex64, ldc int) {
        +	na := m
        +	if side == blas.Right {
        +		na = n
        +	}
        +	switch {
        +	case side != blas.Left && side != blas.Right:
        +		panic(badSide)
        +	case uplo != blas.Lower && uplo != blas.Upper:
        +		panic(badUplo)
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, na):
        +		panic(badLdA)
        +	case ldb < max(1, n):
        +		panic(badLdB)
        +	case ldc < max(1, n):
        +		panic(badLdC)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(na-1)+na {
        +		panic(shortA)
        +	}
        +	if len(b) < ldb*(m-1)+n {
        +		panic(shortB)
        +	}
        +	if len(c) < ldc*(m-1)+n {
        +		panic(shortC)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 && beta == 1 {
        +		return
        +	}
        +
        +	if alpha == 0 {
        +		if beta == 0 {
        +			for i := 0; i < m; i++ {
        +				ci := c[i*ldc : i*ldc+n]
        +				for j := range ci {
        +					ci[j] = 0
        +				}
        +			}
        +		} else {
        +			for i := 0; i < m; i++ {
        +				ci := c[i*ldc : i*ldc+n]
        +				c64.ScalUnitary(beta, ci)
        +			}
        +		}
        +		return
        +	}
        +
        +	if side == blas.Left {
        +		// Form  C = alpha*A*B + beta*C.
        +		for i := 0; i < m; i++ {
        +			atmp := alpha * complex(real(a[i*lda+i]), 0)
        +			bi := b[i*ldb : i*ldb+n]
        +			ci := c[i*ldc : i*ldc+n]
        +			if beta == 0 {
        +				for j, bij := range bi {
        +					ci[j] = atmp * bij
        +				}
        +			} else {
        +				for j, bij := range bi {
        +					ci[j] = atmp*bij + beta*ci[j]
        +				}
        +			}
        +			if uplo == blas.Upper {
        +				for k := 0; k < i; k++ {
        +					atmp = alpha * cmplx.Conj(a[k*lda+i])
        +					c64.AxpyUnitary(atmp, b[k*ldb:k*ldb+n], ci)
        +				}
        +				for k := i + 1; k < m; k++ {
        +					atmp = alpha * a[i*lda+k]
        +					c64.AxpyUnitary(atmp, b[k*ldb:k*ldb+n], ci)
        +				}
        +			} else {
        +				for k := 0; k < i; k++ {
        +					atmp = alpha * a[i*lda+k]
        +					c64.AxpyUnitary(atmp, b[k*ldb:k*ldb+n], ci)
        +				}
        +				for k := i + 1; k < m; k++ {
        +					atmp = alpha * cmplx.Conj(a[k*lda+i])
        +					c64.AxpyUnitary(atmp, b[k*ldb:k*ldb+n], ci)
        +				}
        +			}
        +		}
        +	} else {
        +		// Form  C = alpha*B*A + beta*C.
        +		if uplo == blas.Upper {
        +			for i := 0; i < m; i++ {
        +				for j := n - 1; j >= 0; j-- {
        +					abij := alpha * b[i*ldb+j]
        +					aj := a[j*lda+j+1 : j*lda+n]
        +					bi := b[i*ldb+j+1 : i*ldb+n]
        +					ci := c[i*ldc+j+1 : i*ldc+n]
        +					var tmp complex64
        +					for k, ajk := range aj {
        +						ci[k] += abij * ajk
        +						tmp += bi[k] * cmplx.Conj(ajk)
        +					}
        +					ajj := complex(real(a[j*lda+j]), 0)
        +					if beta == 0 {
        +						c[i*ldc+j] = abij*ajj + alpha*tmp
        +					} else {
        +						c[i*ldc+j] = abij*ajj + alpha*tmp + beta*c[i*ldc+j]
        +					}
        +				}
        +			}
        +		} else {
        +			for i := 0; i < m; i++ {
        +				for j := 0; j < n; j++ {
        +					abij := alpha * b[i*ldb+j]
        +					aj := a[j*lda : j*lda+j]
        +					bi := b[i*ldb : i*ldb+j]
        +					ci := c[i*ldc : i*ldc+j]
        +					var tmp complex64
        +					for k, ajk := range aj {
        +						ci[k] += abij * ajk
        +						tmp += bi[k] * cmplx.Conj(ajk)
        +					}
        +					ajj := complex(real(a[j*lda+j]), 0)
        +					if beta == 0 {
        +						c[i*ldc+j] = abij*ajj + alpha*tmp
        +					} else {
        +						c[i*ldc+j] = abij*ajj + alpha*tmp + beta*c[i*ldc+j]
        +					}
        +				}
        +			}
        +		}
        +	}
        +}
        +
        +// Cherk performs one of the hermitian rank-k operations
        +//  C = alpha*A*Aᴴ + beta*C  if trans == blas.NoTrans
        +//  C = alpha*Aᴴ*A + beta*C  if trans == blas.ConjTrans
        +// where alpha and beta are real scalars, C is an n×n hermitian matrix and A is
        +// an n×k matrix in the first case and a k×n matrix in the second case.
        +//
        +// The imaginary parts of the diagonal elements of C are assumed to be zero, and
        +// on return they will be set to zero.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Cherk(uplo blas.Uplo, trans blas.Transpose, n, k int, alpha float32, a []complex64, lda int, beta float32, c []complex64, ldc int) {
        +	var rowA, colA int
        +	switch trans {
        +	default:
        +		panic(badTranspose)
        +	case blas.NoTrans:
        +		rowA, colA = n, k
        +	case blas.ConjTrans:
        +		rowA, colA = k, n
        +	}
        +	switch {
        +	case uplo != blas.Lower && uplo != blas.Upper:
        +		panic(badUplo)
        +	case n < 0:
        +		panic(nLT0)
        +	case k < 0:
        +		panic(kLT0)
        +	case lda < max(1, colA):
        +		panic(badLdA)
        +	case ldc < max(1, n):
        +		panic(badLdC)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < (rowA-1)*lda+colA {
        +		panic(shortA)
        +	}
        +	if len(c) < (n-1)*ldc+n {
        +		panic(shortC)
        +	}
        +
        +	// Quick return if possible.
        +	if (alpha == 0 || k == 0) && beta == 1 {
        +		return
        +	}
        +
        +	if alpha == 0 {
        +		if uplo == blas.Upper {
        +			if beta == 0 {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc+i : i*ldc+n]
        +					for j := range ci {
        +						ci[j] = 0
        +					}
        +				}
        +			} else {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc+i : i*ldc+n]
        +					ci[0] = complex(beta*real(ci[0]), 0)
        +					if i != n-1 {
        +						c64.SscalUnitary(beta, ci[1:])
        +					}
        +				}
        +			}
        +		} else {
        +			if beta == 0 {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc : i*ldc+i+1]
        +					for j := range ci {
        +						ci[j] = 0
        +					}
        +				}
        +			} else {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc : i*ldc+i+1]
        +					if i != 0 {
        +						c64.SscalUnitary(beta, ci[:i])
        +					}
        +					ci[i] = complex(beta*real(ci[i]), 0)
        +				}
        +			}
        +		}
        +		return
        +	}
        +
        +	calpha := complex(alpha, 0)
        +	if trans == blas.NoTrans {
        +		// Form  C = alpha*A*Aᴴ + beta*C.
        +		cbeta := complex(beta, 0)
        +		if uplo == blas.Upper {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc+i : i*ldc+n]
        +				ai := a[i*lda : i*lda+k]
        +				switch {
        +				case beta == 0:
        +					// Handle the i-th diagonal element of C.
        +					ci[0] = complex(alpha*real(c64.DotcUnitary(ai, ai)), 0)
        +					// Handle the remaining elements on the i-th row of C.
        +					for jc := range ci[1:] {
        +						j := i + 1 + jc
        +						ci[jc+1] = calpha * c64.DotcUnitary(a[j*lda:j*lda+k], ai)
        +					}
        +				case beta != 1:
        +					cii := calpha*c64.DotcUnitary(ai, ai) + cbeta*ci[0]
        +					ci[0] = complex(real(cii), 0)
        +					for jc, cij := range ci[1:] {
        +						j := i + 1 + jc
        +						ci[jc+1] = calpha*c64.DotcUnitary(a[j*lda:j*lda+k], ai) + cbeta*cij
        +					}
        +				default:
        +					cii := calpha*c64.DotcUnitary(ai, ai) + ci[0]
        +					ci[0] = complex(real(cii), 0)
        +					for jc, cij := range ci[1:] {
        +						j := i + 1 + jc
        +						ci[jc+1] = calpha*c64.DotcUnitary(a[j*lda:j*lda+k], ai) + cij
        +					}
        +				}
        +			}
        +		} else {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc : i*ldc+i+1]
        +				ai := a[i*lda : i*lda+k]
        +				switch {
        +				case beta == 0:
        +					// Handle the first i-1 elements on the i-th row of C.
        +					for j := range ci[:i] {
        +						ci[j] = calpha * c64.DotcUnitary(a[j*lda:j*lda+k], ai)
        +					}
        +					// Handle the i-th diagonal element of C.
        +					ci[i] = complex(alpha*real(c64.DotcUnitary(ai, ai)), 0)
        +				case beta != 1:
        +					for j, cij := range ci[:i] {
        +						ci[j] = calpha*c64.DotcUnitary(a[j*lda:j*lda+k], ai) + cbeta*cij
        +					}
        +					cii := calpha*c64.DotcUnitary(ai, ai) + cbeta*ci[i]
        +					ci[i] = complex(real(cii), 0)
        +				default:
        +					for j, cij := range ci[:i] {
        +						ci[j] = calpha*c64.DotcUnitary(a[j*lda:j*lda+k], ai) + cij
        +					}
        +					cii := calpha*c64.DotcUnitary(ai, ai) + ci[i]
        +					ci[i] = complex(real(cii), 0)
        +				}
        +			}
        +		}
        +	} else {
        +		// Form  C = alpha*Aᴴ*A + beta*C.
        +		if uplo == blas.Upper {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc+i : i*ldc+n]
        +				switch {
        +				case beta == 0:
        +					for jc := range ci {
        +						ci[jc] = 0
        +					}
        +				case beta != 1:
        +					c64.SscalUnitary(beta, ci)
        +					ci[0] = complex(real(ci[0]), 0)
        +				default:
        +					ci[0] = complex(real(ci[0]), 0)
        +				}
        +				for j := 0; j < k; j++ {
        +					aji := cmplx.Conj(a[j*lda+i])
        +					if aji != 0 {
        +						c64.AxpyUnitary(calpha*aji, a[j*lda+i:j*lda+n], ci)
        +					}
        +				}
        +				c[i*ldc+i] = complex(real(c[i*ldc+i]), 0)
        +			}
        +		} else {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc : i*ldc+i+1]
        +				switch {
        +				case beta == 0:
        +					for j := range ci {
        +						ci[j] = 0
        +					}
        +				case beta != 1:
        +					c64.SscalUnitary(beta, ci)
        +					ci[i] = complex(real(ci[i]), 0)
        +				default:
        +					ci[i] = complex(real(ci[i]), 0)
        +				}
        +				for j := 0; j < k; j++ {
        +					aji := cmplx.Conj(a[j*lda+i])
        +					if aji != 0 {
        +						c64.AxpyUnitary(calpha*aji, a[j*lda:j*lda+i+1], ci)
        +					}
        +				}
        +				c[i*ldc+i] = complex(real(c[i*ldc+i]), 0)
        +			}
        +		}
        +	}
        +}
        +
        +// Cher2k performs one of the hermitian rank-2k operations
        +//  C = alpha*A*Bᴴ + conj(alpha)*B*Aᴴ + beta*C  if trans == blas.NoTrans
        +//  C = alpha*Aᴴ*B + conj(alpha)*Bᴴ*A + beta*C  if trans == blas.ConjTrans
        +// where alpha and beta are scalars with beta real, C is an n×n hermitian matrix
        +// and A and B are n×k matrices in the first case and k×n matrices in the second case.
        +//
        +// The imaginary parts of the diagonal elements of C are assumed to be zero, and
        +// on return they will be set to zero.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Cher2k(uplo blas.Uplo, trans blas.Transpose, n, k int, alpha complex64, a []complex64, lda int, b []complex64, ldb int, beta float32, c []complex64, ldc int) {
        +	var row, col int
        +	switch trans {
        +	default:
        +		panic(badTranspose)
        +	case blas.NoTrans:
        +		row, col = n, k
        +	case blas.ConjTrans:
        +		row, col = k, n
        +	}
        +	switch {
        +	case uplo != blas.Lower && uplo != blas.Upper:
        +		panic(badUplo)
        +	case n < 0:
        +		panic(nLT0)
        +	case k < 0:
        +		panic(kLT0)
        +	case lda < max(1, col):
        +		panic(badLdA)
        +	case ldb < max(1, col):
        +		panic(badLdB)
        +	case ldc < max(1, n):
        +		panic(badLdC)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < (row-1)*lda+col {
        +		panic(shortA)
        +	}
        +	if len(b) < (row-1)*ldb+col {
        +		panic(shortB)
        +	}
        +	if len(c) < (n-1)*ldc+n {
        +		panic(shortC)
        +	}
        +
        +	// Quick return if possible.
        +	if (alpha == 0 || k == 0) && beta == 1 {
        +		return
        +	}
        +
        +	if alpha == 0 {
        +		if uplo == blas.Upper {
        +			if beta == 0 {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc+i : i*ldc+n]
        +					for j := range ci {
        +						ci[j] = 0
        +					}
        +				}
        +			} else {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc+i : i*ldc+n]
        +					ci[0] = complex(beta*real(ci[0]), 0)
        +					if i != n-1 {
        +						c64.SscalUnitary(beta, ci[1:])
        +					}
        +				}
        +			}
        +		} else {
        +			if beta == 0 {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc : i*ldc+i+1]
        +					for j := range ci {
        +						ci[j] = 0
        +					}
        +				}
        +			} else {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc : i*ldc+i+1]
        +					if i != 0 {
        +						c64.SscalUnitary(beta, ci[:i])
        +					}
        +					ci[i] = complex(beta*real(ci[i]), 0)
        +				}
        +			}
        +		}
        +		return
        +	}
        +
        +	conjalpha := cmplx.Conj(alpha)
        +	cbeta := complex(beta, 0)
        +	if trans == blas.NoTrans {
        +		// Form  C = alpha*A*Bᴴ + conj(alpha)*B*Aᴴ + beta*C.
        +		if uplo == blas.Upper {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc+i+1 : i*ldc+n]
        +				ai := a[i*lda : i*lda+k]
        +				bi := b[i*ldb : i*ldb+k]
        +				if beta == 0 {
        +					cii := alpha*c64.DotcUnitary(bi, ai) + conjalpha*c64.DotcUnitary(ai, bi)
        +					c[i*ldc+i] = complex(real(cii), 0)
        +					for jc := range ci {
        +						j := i + 1 + jc
        +						ci[jc] = alpha*c64.DotcUnitary(b[j*ldb:j*ldb+k], ai) + conjalpha*c64.DotcUnitary(a[j*lda:j*lda+k], bi)
        +					}
        +				} else {
        +					cii := alpha*c64.DotcUnitary(bi, ai) + conjalpha*c64.DotcUnitary(ai, bi) + cbeta*c[i*ldc+i]
        +					c[i*ldc+i] = complex(real(cii), 0)
        +					for jc, cij := range ci {
        +						j := i + 1 + jc
        +						ci[jc] = alpha*c64.DotcUnitary(b[j*ldb:j*ldb+k], ai) + conjalpha*c64.DotcUnitary(a[j*lda:j*lda+k], bi) + cbeta*cij
        +					}
        +				}
        +			}
        +		} else {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc : i*ldc+i]
        +				ai := a[i*lda : i*lda+k]
        +				bi := b[i*ldb : i*ldb+k]
        +				if beta == 0 {
        +					for j := range ci {
        +						ci[j] = alpha*c64.DotcUnitary(b[j*ldb:j*ldb+k], ai) + conjalpha*c64.DotcUnitary(a[j*lda:j*lda+k], bi)
        +					}
        +					cii := alpha*c64.DotcUnitary(bi, ai) + conjalpha*c64.DotcUnitary(ai, bi)
        +					c[i*ldc+i] = complex(real(cii), 0)
        +				} else {
        +					for j, cij := range ci {
        +						ci[j] = alpha*c64.DotcUnitary(b[j*ldb:j*ldb+k], ai) + conjalpha*c64.DotcUnitary(a[j*lda:j*lda+k], bi) + cbeta*cij
        +					}
        +					cii := alpha*c64.DotcUnitary(bi, ai) + conjalpha*c64.DotcUnitary(ai, bi) + cbeta*c[i*ldc+i]
        +					c[i*ldc+i] = complex(real(cii), 0)
        +				}
        +			}
        +		}
        +	} else {
        +		// Form  C = alpha*Aᴴ*B + conj(alpha)*Bᴴ*A + beta*C.
        +		if uplo == blas.Upper {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc+i : i*ldc+n]
        +				switch {
        +				case beta == 0:
        +					for jc := range ci {
        +						ci[jc] = 0
        +					}
        +				case beta != 1:
        +					c64.SscalUnitary(beta, ci)
        +					ci[0] = complex(real(ci[0]), 0)
        +				default:
        +					ci[0] = complex(real(ci[0]), 0)
        +				}
        +				for j := 0; j < k; j++ {
        +					aji := a[j*lda+i]
        +					bji := b[j*ldb+i]
        +					if aji != 0 {
        +						c64.AxpyUnitary(alpha*cmplx.Conj(aji), b[j*ldb+i:j*ldb+n], ci)
        +					}
        +					if bji != 0 {
        +						c64.AxpyUnitary(conjalpha*cmplx.Conj(bji), a[j*lda+i:j*lda+n], ci)
        +					}
        +				}
        +				ci[0] = complex(real(ci[0]), 0)
        +			}
        +		} else {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc : i*ldc+i+1]
        +				switch {
        +				case beta == 0:
        +					for j := range ci {
        +						ci[j] = 0
        +					}
        +				case beta != 1:
        +					c64.SscalUnitary(beta, ci)
        +					ci[i] = complex(real(ci[i]), 0)
        +				default:
        +					ci[i] = complex(real(ci[i]), 0)
        +				}
        +				for j := 0; j < k; j++ {
        +					aji := a[j*lda+i]
        +					bji := b[j*ldb+i]
        +					if aji != 0 {
        +						c64.AxpyUnitary(alpha*cmplx.Conj(aji), b[j*ldb:j*ldb+i+1], ci)
        +					}
        +					if bji != 0 {
        +						c64.AxpyUnitary(conjalpha*cmplx.Conj(bji), a[j*lda:j*lda+i+1], ci)
        +					}
        +				}
        +				ci[i] = complex(real(ci[i]), 0)
        +			}
        +		}
        +	}
        +}
        +
        +// Csymm performs one of the matrix-matrix operations
        +//  C = alpha*A*B + beta*C  if side == blas.Left
        +//  C = alpha*B*A + beta*C  if side == blas.Right
        +// where alpha and beta are scalars, A is an m×m or n×n symmetric matrix and B
        +// and C are m×n matrices.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Csymm(side blas.Side, uplo blas.Uplo, m, n int, alpha complex64, a []complex64, lda int, b []complex64, ldb int, beta complex64, c []complex64, ldc int) {
        +	na := m
        +	if side == blas.Right {
        +		na = n
        +	}
        +	switch {
        +	case side != blas.Left && side != blas.Right:
        +		panic(badSide)
        +	case uplo != blas.Lower && uplo != blas.Upper:
        +		panic(badUplo)
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, na):
        +		panic(badLdA)
        +	case ldb < max(1, n):
        +		panic(badLdB)
        +	case ldc < max(1, n):
        +		panic(badLdC)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(na-1)+na {
        +		panic(shortA)
        +	}
        +	if len(b) < ldb*(m-1)+n {
        +		panic(shortB)
        +	}
        +	if len(c) < ldc*(m-1)+n {
        +		panic(shortC)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 && beta == 1 {
        +		return
        +	}
        +
        +	if alpha == 0 {
        +		if beta == 0 {
        +			for i := 0; i < m; i++ {
        +				ci := c[i*ldc : i*ldc+n]
        +				for j := range ci {
        +					ci[j] = 0
        +				}
        +			}
        +		} else {
        +			for i := 0; i < m; i++ {
        +				ci := c[i*ldc : i*ldc+n]
        +				c64.ScalUnitary(beta, ci)
        +			}
        +		}
        +		return
        +	}
        +
        +	if side == blas.Left {
        +		// Form  C = alpha*A*B + beta*C.
        +		for i := 0; i < m; i++ {
        +			atmp := alpha * a[i*lda+i]
        +			bi := b[i*ldb : i*ldb+n]
        +			ci := c[i*ldc : i*ldc+n]
        +			if beta == 0 {
        +				for j, bij := range bi {
        +					ci[j] = atmp * bij
        +				}
        +			} else {
        +				for j, bij := range bi {
        +					ci[j] = atmp*bij + beta*ci[j]
        +				}
        +			}
        +			if uplo == blas.Upper {
        +				for k := 0; k < i; k++ {
        +					atmp = alpha * a[k*lda+i]
        +					c64.AxpyUnitary(atmp, b[k*ldb:k*ldb+n], ci)
        +				}
        +				for k := i + 1; k < m; k++ {
        +					atmp = alpha * a[i*lda+k]
        +					c64.AxpyUnitary(atmp, b[k*ldb:k*ldb+n], ci)
        +				}
        +			} else {
        +				for k := 0; k < i; k++ {
        +					atmp = alpha * a[i*lda+k]
        +					c64.AxpyUnitary(atmp, b[k*ldb:k*ldb+n], ci)
        +				}
        +				for k := i + 1; k < m; k++ {
        +					atmp = alpha * a[k*lda+i]
        +					c64.AxpyUnitary(atmp, b[k*ldb:k*ldb+n], ci)
        +				}
        +			}
        +		}
        +	} else {
        +		// Form  C = alpha*B*A + beta*C.
        +		if uplo == blas.Upper {
        +			for i := 0; i < m; i++ {
        +				for j := n - 1; j >= 0; j-- {
        +					abij := alpha * b[i*ldb+j]
        +					aj := a[j*lda+j+1 : j*lda+n]
        +					bi := b[i*ldb+j+1 : i*ldb+n]
        +					ci := c[i*ldc+j+1 : i*ldc+n]
        +					var tmp complex64
        +					for k, ajk := range aj {
        +						ci[k] += abij * ajk
        +						tmp += bi[k] * ajk
        +					}
        +					if beta == 0 {
        +						c[i*ldc+j] = abij*a[j*lda+j] + alpha*tmp
        +					} else {
        +						c[i*ldc+j] = abij*a[j*lda+j] + alpha*tmp + beta*c[i*ldc+j]
        +					}
        +				}
        +			}
        +		} else {
        +			for i := 0; i < m; i++ {
        +				for j := 0; j < n; j++ {
        +					abij := alpha * b[i*ldb+j]
        +					aj := a[j*lda : j*lda+j]
        +					bi := b[i*ldb : i*ldb+j]
        +					ci := c[i*ldc : i*ldc+j]
        +					var tmp complex64
        +					for k, ajk := range aj {
        +						ci[k] += abij * ajk
        +						tmp += bi[k] * ajk
        +					}
        +					if beta == 0 {
        +						c[i*ldc+j] = abij*a[j*lda+j] + alpha*tmp
        +					} else {
        +						c[i*ldc+j] = abij*a[j*lda+j] + alpha*tmp + beta*c[i*ldc+j]
        +					}
        +				}
        +			}
        +		}
        +	}
        +}
        +
        +// Csyrk performs one of the symmetric rank-k operations
        +//  C = alpha*A*Aᵀ + beta*C  if trans == blas.NoTrans
        +//  C = alpha*Aᵀ*A + beta*C  if trans == blas.Trans
        +// where alpha and beta are scalars, C is an n×n symmetric matrix and A is
        +// an n×k matrix in the first case and a k×n matrix in the second case.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Csyrk(uplo blas.Uplo, trans blas.Transpose, n, k int, alpha complex64, a []complex64, lda int, beta complex64, c []complex64, ldc int) {
        +	var rowA, colA int
        +	switch trans {
        +	default:
        +		panic(badTranspose)
        +	case blas.NoTrans:
        +		rowA, colA = n, k
        +	case blas.Trans:
        +		rowA, colA = k, n
        +	}
        +	switch {
        +	case uplo != blas.Lower && uplo != blas.Upper:
        +		panic(badUplo)
        +	case n < 0:
        +		panic(nLT0)
        +	case k < 0:
        +		panic(kLT0)
        +	case lda < max(1, colA):
        +		panic(badLdA)
        +	case ldc < max(1, n):
        +		panic(badLdC)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < (rowA-1)*lda+colA {
        +		panic(shortA)
        +	}
        +	if len(c) < (n-1)*ldc+n {
        +		panic(shortC)
        +	}
        +
        +	// Quick return if possible.
        +	if (alpha == 0 || k == 0) && beta == 1 {
        +		return
        +	}
        +
        +	if alpha == 0 {
        +		if uplo == blas.Upper {
        +			if beta == 0 {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc+i : i*ldc+n]
        +					for j := range ci {
        +						ci[j] = 0
        +					}
        +				}
        +			} else {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc+i : i*ldc+n]
        +					c64.ScalUnitary(beta, ci)
        +				}
        +			}
        +		} else {
        +			if beta == 0 {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc : i*ldc+i+1]
        +					for j := range ci {
        +						ci[j] = 0
        +					}
        +				}
        +			} else {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc : i*ldc+i+1]
        +					c64.ScalUnitary(beta, ci)
        +				}
        +			}
        +		}
        +		return
        +	}
        +
        +	if trans == blas.NoTrans {
        +		// Form  C = alpha*A*Aᵀ + beta*C.
        +		if uplo == blas.Upper {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc+i : i*ldc+n]
        +				ai := a[i*lda : i*lda+k]
        +				for jc, cij := range ci {
        +					j := i + jc
        +					ci[jc] = beta*cij + alpha*c64.DotuUnitary(ai, a[j*lda:j*lda+k])
        +				}
        +			}
        +		} else {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc : i*ldc+i+1]
        +				ai := a[i*lda : i*lda+k]
        +				for j, cij := range ci {
        +					ci[j] = beta*cij + alpha*c64.DotuUnitary(ai, a[j*lda:j*lda+k])
        +				}
        +			}
        +		}
        +	} else {
        +		// Form  C = alpha*Aᵀ*A + beta*C.
        +		if uplo == blas.Upper {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc+i : i*ldc+n]
        +				switch {
        +				case beta == 0:
        +					for jc := range ci {
        +						ci[jc] = 0
        +					}
        +				case beta != 1:
        +					for jc := range ci {
        +						ci[jc] *= beta
        +					}
        +				}
        +				for j := 0; j < k; j++ {
        +					aji := a[j*lda+i]
        +					if aji != 0 {
        +						c64.AxpyUnitary(alpha*aji, a[j*lda+i:j*lda+n], ci)
        +					}
        +				}
        +			}
        +		} else {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc : i*ldc+i+1]
        +				switch {
        +				case beta == 0:
        +					for j := range ci {
        +						ci[j] = 0
        +					}
        +				case beta != 1:
        +					for j := range ci {
        +						ci[j] *= beta
        +					}
        +				}
        +				for j := 0; j < k; j++ {
        +					aji := a[j*lda+i]
        +					if aji != 0 {
        +						c64.AxpyUnitary(alpha*aji, a[j*lda:j*lda+i+1], ci)
        +					}
        +				}
        +			}
        +		}
        +	}
        +}
        +
        +// Csyr2k performs one of the symmetric rank-2k operations
        +//  C = alpha*A*Bᵀ + alpha*B*Aᵀ + beta*C  if trans == blas.NoTrans
        +//  C = alpha*Aᵀ*B + alpha*Bᵀ*A + beta*C  if trans == blas.Trans
        +// where alpha and beta are scalars, C is an n×n symmetric matrix and A and B
        +// are n×k matrices in the first case and k×n matrices in the second case.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Csyr2k(uplo blas.Uplo, trans blas.Transpose, n, k int, alpha complex64, a []complex64, lda int, b []complex64, ldb int, beta complex64, c []complex64, ldc int) {
        +	var row, col int
        +	switch trans {
        +	default:
        +		panic(badTranspose)
        +	case blas.NoTrans:
        +		row, col = n, k
        +	case blas.Trans:
        +		row, col = k, n
        +	}
        +	switch {
        +	case uplo != blas.Lower && uplo != blas.Upper:
        +		panic(badUplo)
        +	case n < 0:
        +		panic(nLT0)
        +	case k < 0:
        +		panic(kLT0)
        +	case lda < max(1, col):
        +		panic(badLdA)
        +	case ldb < max(1, col):
        +		panic(badLdB)
        +	case ldc < max(1, n):
        +		panic(badLdC)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < (row-1)*lda+col {
        +		panic(shortA)
        +	}
        +	if len(b) < (row-1)*ldb+col {
        +		panic(shortB)
        +	}
        +	if len(c) < (n-1)*ldc+n {
        +		panic(shortC)
        +	}
        +
        +	// Quick return if possible.
        +	if (alpha == 0 || k == 0) && beta == 1 {
        +		return
        +	}
        +
        +	if alpha == 0 {
        +		if uplo == blas.Upper {
        +			if beta == 0 {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc+i : i*ldc+n]
        +					for j := range ci {
        +						ci[j] = 0
        +					}
        +				}
        +			} else {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc+i : i*ldc+n]
        +					c64.ScalUnitary(beta, ci)
        +				}
        +			}
        +		} else {
        +			if beta == 0 {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc : i*ldc+i+1]
        +					for j := range ci {
        +						ci[j] = 0
        +					}
        +				}
        +			} else {
        +				for i := 0; i < n; i++ {
        +					ci := c[i*ldc : i*ldc+i+1]
        +					c64.ScalUnitary(beta, ci)
        +				}
        +			}
        +		}
        +		return
        +	}
        +
        +	if trans == blas.NoTrans {
        +		// Form  C = alpha*A*Bᵀ + alpha*B*Aᵀ + beta*C.
        +		if uplo == blas.Upper {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc+i : i*ldc+n]
        +				ai := a[i*lda : i*lda+k]
        +				bi := b[i*ldb : i*ldb+k]
        +				if beta == 0 {
        +					for jc := range ci {
        +						j := i + jc
        +						ci[jc] = alpha*c64.DotuUnitary(ai, b[j*ldb:j*ldb+k]) + alpha*c64.DotuUnitary(bi, a[j*lda:j*lda+k])
        +					}
        +				} else {
        +					for jc, cij := range ci {
        +						j := i + jc
        +						ci[jc] = alpha*c64.DotuUnitary(ai, b[j*ldb:j*ldb+k]) + alpha*c64.DotuUnitary(bi, a[j*lda:j*lda+k]) + beta*cij
        +					}
        +				}
        +			}
        +		} else {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc : i*ldc+i+1]
        +				ai := a[i*lda : i*lda+k]
        +				bi := b[i*ldb : i*ldb+k]
        +				if beta == 0 {
        +					for j := range ci {
        +						ci[j] = alpha*c64.DotuUnitary(ai, b[j*ldb:j*ldb+k]) + alpha*c64.DotuUnitary(bi, a[j*lda:j*lda+k])
        +					}
        +				} else {
        +					for j, cij := range ci {
        +						ci[j] = alpha*c64.DotuUnitary(ai, b[j*ldb:j*ldb+k]) + alpha*c64.DotuUnitary(bi, a[j*lda:j*lda+k]) + beta*cij
        +					}
        +				}
        +			}
        +		}
        +	} else {
        +		// Form  C = alpha*Aᵀ*B + alpha*Bᵀ*A + beta*C.
        +		if uplo == blas.Upper {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc+i : i*ldc+n]
        +				switch {
        +				case beta == 0:
        +					for jc := range ci {
        +						ci[jc] = 0
        +					}
        +				case beta != 1:
        +					for jc := range ci {
        +						ci[jc] *= beta
        +					}
        +				}
        +				for j := 0; j < k; j++ {
        +					aji := a[j*lda+i]
        +					bji := b[j*ldb+i]
        +					if aji != 0 {
        +						c64.AxpyUnitary(alpha*aji, b[j*ldb+i:j*ldb+n], ci)
        +					}
        +					if bji != 0 {
        +						c64.AxpyUnitary(alpha*bji, a[j*lda+i:j*lda+n], ci)
        +					}
        +				}
        +			}
        +		} else {
        +			for i := 0; i < n; i++ {
        +				ci := c[i*ldc : i*ldc+i+1]
        +				switch {
        +				case beta == 0:
        +					for j := range ci {
        +						ci[j] = 0
        +					}
        +				case beta != 1:
        +					for j := range ci {
        +						ci[j] *= beta
        +					}
        +				}
        +				for j := 0; j < k; j++ {
        +					aji := a[j*lda+i]
        +					bji := b[j*ldb+i]
        +					if aji != 0 {
        +						c64.AxpyUnitary(alpha*aji, b[j*ldb:j*ldb+i+1], ci)
        +					}
        +					if bji != 0 {
        +						c64.AxpyUnitary(alpha*bji, a[j*lda:j*lda+i+1], ci)
        +					}
        +				}
        +			}
        +		}
        +	}
        +}
        +
        +// Ctrmm performs one of the matrix-matrix operations
        +//  B = alpha * op(A) * B  if side == blas.Left,
        +//  B = alpha * B * op(A)  if side == blas.Right,
        +// where alpha is a scalar, B is an m×n matrix, A is a unit, or non-unit,
        +// upper or lower triangular matrix and op(A) is one of
        +//  op(A) = A   if trans == blas.NoTrans,
        +//  op(A) = Aᵀ  if trans == blas.Trans,
        +//  op(A) = Aᴴ  if trans == blas.ConjTrans.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Ctrmm(side blas.Side, uplo blas.Uplo, trans blas.Transpose, diag blas.Diag, m, n int, alpha complex64, a []complex64, lda int, b []complex64, ldb int) {
        +	na := m
        +	if side == blas.Right {
        +		na = n
        +	}
        +	switch {
        +	case side != blas.Left && side != blas.Right:
        +		panic(badSide)
        +	case uplo != blas.Lower && uplo != blas.Upper:
        +		panic(badUplo)
        +	case trans != blas.NoTrans && trans != blas.Trans && trans != blas.ConjTrans:
        +		panic(badTranspose)
        +	case diag != blas.Unit && diag != blas.NonUnit:
        +		panic(badDiag)
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, na):
        +		panic(badLdA)
        +	case ldb < max(1, n):
        +		panic(badLdB)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < (na-1)*lda+na {
        +		panic(shortA)
        +	}
        +	if len(b) < (m-1)*ldb+n {
        +		panic(shortB)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 {
        +		for i := 0; i < m; i++ {
        +			bi := b[i*ldb : i*ldb+n]
        +			for j := range bi {
        +				bi[j] = 0
        +			}
        +		}
        +		return
        +	}
        +
        +	noConj := trans != blas.ConjTrans
        +	noUnit := diag == blas.NonUnit
        +	if side == blas.Left {
        +		if trans == blas.NoTrans {
        +			// Form B = alpha*A*B.
        +			if uplo == blas.Upper {
        +				for i := 0; i < m; i++ {
        +					aii := alpha
        +					if noUnit {
        +						aii *= a[i*lda+i]
        +					}
        +					bi := b[i*ldb : i*ldb+n]
        +					for j := range bi {
        +						bi[j] *= aii
        +					}
        +					for ja, aij := range a[i*lda+i+1 : i*lda+m] {
        +						j := ja + i + 1
        +						if aij != 0 {
        +							c64.AxpyUnitary(alpha*aij, b[j*ldb:j*ldb+n], bi)
        +						}
        +					}
        +				}
        +			} else {
        +				for i := m - 1; i >= 0; i-- {
        +					aii := alpha
        +					if noUnit {
        +						aii *= a[i*lda+i]
        +					}
        +					bi := b[i*ldb : i*ldb+n]
        +					for j := range bi {
        +						bi[j] *= aii
        +					}
        +					for j, aij := range a[i*lda : i*lda+i] {
        +						if aij != 0 {
        +							c64.AxpyUnitary(alpha*aij, b[j*ldb:j*ldb+n], bi)
        +						}
        +					}
        +				}
        +			}
        +		} else {
        +			// Form B = alpha*Aᵀ*B  or  B = alpha*Aᴴ*B.
        +			if uplo == blas.Upper {
        +				for k := m - 1; k >= 0; k-- {
        +					bk := b[k*ldb : k*ldb+n]
        +					for ja, ajk := range a[k*lda+k+1 : k*lda+m] {
        +						if ajk == 0 {
        +							continue
        +						}
        +						j := k + 1 + ja
        +						if noConj {
        +							c64.AxpyUnitary(alpha*ajk, bk, b[j*ldb:j*ldb+n])
        +						} else {
        +							c64.AxpyUnitary(alpha*cmplx.Conj(ajk), bk, b[j*ldb:j*ldb+n])
        +						}
        +					}
        +					akk := alpha
        +					if noUnit {
        +						if noConj {
        +							akk *= a[k*lda+k]
        +						} else {
        +							akk *= cmplx.Conj(a[k*lda+k])
        +						}
        +					}
        +					if akk != 1 {
        +						c64.ScalUnitary(akk, bk)
        +					}
        +				}
        +			} else {
        +				for k := 0; k < m; k++ {
        +					bk := b[k*ldb : k*ldb+n]
        +					for j, ajk := range a[k*lda : k*lda+k] {
        +						if ajk == 0 {
        +							continue
        +						}
        +						if noConj {
        +							c64.AxpyUnitary(alpha*ajk, bk, b[j*ldb:j*ldb+n])
        +						} else {
        +							c64.AxpyUnitary(alpha*cmplx.Conj(ajk), bk, b[j*ldb:j*ldb+n])
        +						}
        +					}
        +					akk := alpha
        +					if noUnit {
        +						if noConj {
        +							akk *= a[k*lda+k]
        +						} else {
        +							akk *= cmplx.Conj(a[k*lda+k])
        +						}
        +					}
        +					if akk != 1 {
        +						c64.ScalUnitary(akk, bk)
        +					}
        +				}
        +			}
        +		}
        +	} else {
        +		if trans == blas.NoTrans {
        +			// Form B = alpha*B*A.
        +			if uplo == blas.Upper {
        +				for i := 0; i < m; i++ {
        +					bi := b[i*ldb : i*ldb+n]
        +					for k := n - 1; k >= 0; k-- {
        +						abik := alpha * bi[k]
        +						if abik == 0 {
        +							continue
        +						}
        +						bi[k] = abik
        +						if noUnit {
        +							bi[k] *= a[k*lda+k]
        +						}
        +						c64.AxpyUnitary(abik, a[k*lda+k+1:k*lda+n], bi[k+1:])
        +					}
        +				}
        +			} else {
        +				for i := 0; i < m; i++ {
        +					bi := b[i*ldb : i*ldb+n]
        +					for k := 0; k < n; k++ {
        +						abik := alpha * bi[k]
        +						if abik == 0 {
        +							continue
        +						}
        +						bi[k] = abik
        +						if noUnit {
        +							bi[k] *= a[k*lda+k]
        +						}
        +						c64.AxpyUnitary(abik, a[k*lda:k*lda+k], bi[:k])
        +					}
        +				}
        +			}
        +		} else {
        +			// Form B = alpha*B*Aᵀ  or  B = alpha*B*Aᴴ.
        +			if uplo == blas.Upper {
        +				for i := 0; i < m; i++ {
        +					bi := b[i*ldb : i*ldb+n]
        +					for j, bij := range bi {
        +						if noConj {
        +							if noUnit {
        +								bij *= a[j*lda+j]
        +							}
        +							bij += c64.DotuUnitary(a[j*lda+j+1:j*lda+n], bi[j+1:n])
        +						} else {
        +							if noUnit {
        +								bij *= cmplx.Conj(a[j*lda+j])
        +							}
        +							bij += c64.DotcUnitary(a[j*lda+j+1:j*lda+n], bi[j+1:n])
        +						}
        +						bi[j] = alpha * bij
        +					}
        +				}
        +			} else {
        +				for i := 0; i < m; i++ {
        +					bi := b[i*ldb : i*ldb+n]
        +					for j := n - 1; j >= 0; j-- {
        +						bij := bi[j]
        +						if noConj {
        +							if noUnit {
        +								bij *= a[j*lda+j]
        +							}
        +							bij += c64.DotuUnitary(a[j*lda:j*lda+j], bi[:j])
        +						} else {
        +							if noUnit {
        +								bij *= cmplx.Conj(a[j*lda+j])
        +							}
        +							bij += c64.DotcUnitary(a[j*lda:j*lda+j], bi[:j])
        +						}
        +						bi[j] = alpha * bij
        +					}
        +				}
        +			}
        +		}
        +	}
        +}
        +
        +// Ctrsm solves one of the matrix equations
        +//  op(A) * X = alpha * B  if side == blas.Left,
        +//  X * op(A) = alpha * B  if side == blas.Right,
        +// where alpha is a scalar, X and B are m×n matrices, A is a unit or
        +// non-unit, upper or lower triangular matrix and op(A) is one of
        +//  op(A) = A   if transA == blas.NoTrans,
        +//  op(A) = Aᵀ  if transA == blas.Trans,
        +//  op(A) = Aᴴ  if transA == blas.ConjTrans.
        +// On return the matrix X is overwritten on B.
        +//
        +// Complex64 implementations are autogenerated and not directly tested.
        +func (Implementation) Ctrsm(side blas.Side, uplo blas.Uplo, transA blas.Transpose, diag blas.Diag, m, n int, alpha complex64, a []complex64, lda int, b []complex64, ldb int) {
        +	na := m
        +	if side == blas.Right {
        +		na = n
        +	}
        +	switch {
        +	case side != blas.Left && side != blas.Right:
        +		panic(badSide)
        +	case uplo != blas.Lower && uplo != blas.Upper:
        +		panic(badUplo)
        +	case transA != blas.NoTrans && transA != blas.Trans && transA != blas.ConjTrans:
        +		panic(badTranspose)
        +	case diag != blas.Unit && diag != blas.NonUnit:
        +		panic(badDiag)
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, na):
        +		panic(badLdA)
        +	case ldb < max(1, n):
        +		panic(badLdB)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < (na-1)*lda+na {
        +		panic(shortA)
        +	}
        +	if len(b) < (m-1)*ldb+n {
        +		panic(shortB)
        +	}
        +
        +	if alpha == 0 {
        +		for i := 0; i < m; i++ {
        +			for j := 0; j < n; j++ {
        +				b[i*ldb+j] = 0
        +			}
        +		}
        +		return
        +	}
        +
        +	noConj := transA != blas.ConjTrans
        +	noUnit := diag == blas.NonUnit
        +	if side == blas.Left {
        +		if transA == blas.NoTrans {
        +			// Form  B = alpha*inv(A)*B.
        +			if uplo == blas.Upper {
        +				for i := m - 1; i >= 0; i-- {
        +					bi := b[i*ldb : i*ldb+n]
        +					if alpha != 1 {
        +						c64.ScalUnitary(alpha, bi)
        +					}
        +					for ka, aik := range a[i*lda+i+1 : i*lda+m] {
        +						k := i + 1 + ka
        +						if aik != 0 {
        +							c64.AxpyUnitary(-aik, b[k*ldb:k*ldb+n], bi)
        +						}
        +					}
        +					if noUnit {
        +						c64.ScalUnitary(1/a[i*lda+i], bi)
        +					}
        +				}
        +			} else {
        +				for i := 0; i < m; i++ {
        +					bi := b[i*ldb : i*ldb+n]
        +					if alpha != 1 {
        +						c64.ScalUnitary(alpha, bi)
        +					}
        +					for j, aij := range a[i*lda : i*lda+i] {
        +						if aij != 0 {
        +							c64.AxpyUnitary(-aij, b[j*ldb:j*ldb+n], bi)
        +						}
        +					}
        +					if noUnit {
        +						c64.ScalUnitary(1/a[i*lda+i], bi)
        +					}
        +				}
        +			}
        +		} else {
        +			// Form  B = alpha*inv(Aᵀ)*B  or  B = alpha*inv(Aᴴ)*B.
        +			if uplo == blas.Upper {
        +				for i := 0; i < m; i++ {
        +					bi := b[i*ldb : i*ldb+n]
        +					if noUnit {
        +						if noConj {
        +							c64.ScalUnitary(1/a[i*lda+i], bi)
        +						} else {
        +							c64.ScalUnitary(1/cmplx.Conj(a[i*lda+i]), bi)
        +						}
        +					}
        +					for ja, aij := range a[i*lda+i+1 : i*lda+m] {
        +						if aij == 0 {
        +							continue
        +						}
        +						j := i + 1 + ja
        +						if noConj {
        +							c64.AxpyUnitary(-aij, bi, b[j*ldb:j*ldb+n])
        +						} else {
        +							c64.AxpyUnitary(-cmplx.Conj(aij), bi, b[j*ldb:j*ldb+n])
        +						}
        +					}
        +					if alpha != 1 {
        +						c64.ScalUnitary(alpha, bi)
        +					}
        +				}
        +			} else {
        +				for i := m - 1; i >= 0; i-- {
        +					bi := b[i*ldb : i*ldb+n]
        +					if noUnit {
        +						if noConj {
        +							c64.ScalUnitary(1/a[i*lda+i], bi)
        +						} else {
        +							c64.ScalUnitary(1/cmplx.Conj(a[i*lda+i]), bi)
        +						}
        +					}
        +					for j, aij := range a[i*lda : i*lda+i] {
        +						if aij == 0 {
        +							continue
        +						}
        +						if noConj {
        +							c64.AxpyUnitary(-aij, bi, b[j*ldb:j*ldb+n])
        +						} else {
        +							c64.AxpyUnitary(-cmplx.Conj(aij), bi, b[j*ldb:j*ldb+n])
        +						}
        +					}
        +					if alpha != 1 {
        +						c64.ScalUnitary(alpha, bi)
        +					}
        +				}
        +			}
        +		}
        +	} else {
        +		if transA == blas.NoTrans {
        +			// Form  B = alpha*B*inv(A).
        +			if uplo == blas.Upper {
        +				for i := 0; i < m; i++ {
        +					bi := b[i*ldb : i*ldb+n]
        +					if alpha != 1 {
        +						c64.ScalUnitary(alpha, bi)
        +					}
        +					for j, bij := range bi {
        +						if bij == 0 {
        +							continue
        +						}
        +						if noUnit {
        +							bi[j] /= a[j*lda+j]
        +						}
        +						c64.AxpyUnitary(-bi[j], a[j*lda+j+1:j*lda+n], bi[j+1:n])
        +					}
        +				}
        +			} else {
        +				for i := 0; i < m; i++ {
        +					bi := b[i*ldb : i*ldb+n]
        +					if alpha != 1 {
        +						c64.ScalUnitary(alpha, bi)
        +					}
        +					for j := n - 1; j >= 0; j-- {
        +						if bi[j] == 0 {
        +							continue
        +						}
        +						if noUnit {
        +							bi[j] /= a[j*lda+j]
        +						}
        +						c64.AxpyUnitary(-bi[j], a[j*lda:j*lda+j], bi[:j])
        +					}
        +				}
        +			}
        +		} else {
        +			// Form  B = alpha*B*inv(Aᵀ)  or   B = alpha*B*inv(Aᴴ).
        +			if uplo == blas.Upper {
        +				for i := 0; i < m; i++ {
        +					bi := b[i*ldb : i*ldb+n]
        +					for j := n - 1; j >= 0; j-- {
        +						bij := alpha * bi[j]
        +						if noConj {
        +							bij -= c64.DotuUnitary(a[j*lda+j+1:j*lda+n], bi[j+1:n])
        +							if noUnit {
        +								bij /= a[j*lda+j]
        +							}
        +						} else {
        +							bij -= c64.DotcUnitary(a[j*lda+j+1:j*lda+n], bi[j+1:n])
        +							if noUnit {
        +								bij /= cmplx.Conj(a[j*lda+j])
        +							}
        +						}
        +						bi[j] = bij
        +					}
        +				}
        +			} else {
        +				for i := 0; i < m; i++ {
        +					bi := b[i*ldb : i*ldb+n]
        +					for j, bij := range bi {
        +						bij *= alpha
        +						if noConj {
        +							bij -= c64.DotuUnitary(a[j*lda:j*lda+j], bi[:j])
        +							if noUnit {
        +								bij /= a[j*lda+j]
        +							}
        +						} else {
        +							bij -= c64.DotcUnitary(a[j*lda:j*lda+j], bi[:j])
        +							if noUnit {
        +								bij /= cmplx.Conj(a[j*lda+j])
        +							}
        +						}
        +						bi[j] = bij
        +					}
        +				}
        +			}
        +		}
        +	}
        +}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/level3double.go b/vendor/gonum.org/v1/gonum/blas/gonum/level3double.go
        deleted file mode 100644
        index 39e754d0a..000000000
        --- a/vendor/gonum.org/v1/gonum/blas/gonum/level3double.go
        +++ /dev/null
        @@ -1,833 +0,0 @@
        -// Copyright ©2014 The Gonum Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package gonum
        -
        -import (
        -	"gonum.org/v1/gonum/blas"
        -	"gonum.org/v1/gonum/internal/asm/f64"
        -)
        -
        -var _ blas.Float64Level3 = Implementation{}
        -
        -// Dtrsm solves one of the matrix equations
        -//  A * X = alpha * B    if tA == blas.NoTrans and side == blas.Left
        -//  A^T * X = alpha * B  if tA == blas.Trans or blas.ConjTrans, and side == blas.Left
        -//  X * A = alpha * B    if tA == blas.NoTrans and side == blas.Right
        -//  X * A^T = alpha * B  if tA == blas.Trans or blas.ConjTrans, and side == blas.Right
        -// where A is an n×n or m×m triangular matrix, X and B are m×n matrices, and alpha is a
        -// scalar.
        -//
        -// At entry to the function, X contains the values of B, and the result is
        -// stored in-place into X.
        -//
        -// No check is made that A is invertible.
        -func (Implementation) Dtrsm(s blas.Side, ul blas.Uplo, tA blas.Transpose, d blas.Diag, m, n int, alpha float64, a []float64, lda int, b []float64, ldb int) {
        -	if s != blas.Left && s != blas.Right {
        -		panic(badSide)
        -	}
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        -		panic(badTranspose)
        -	}
        -	if d != blas.NonUnit && d != blas.Unit {
        -		panic(badDiag)
        -	}
        -	if m < 0 {
        -		panic(mLT0)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if ldb < n {
        -		panic(badLdB)
        -	}
        -	var k int
        -	if s == blas.Left {
        -		k = m
        -	} else {
        -		k = n
        -	}
        -	if lda*(k-1)+k > len(a) || lda < max(1, k) {
        -		panic(badLdA)
        -	}
        -	if ldb*(m-1)+n > len(b) || ldb < max(1, n) {
        -		panic(badLdB)
        -	}
        -
        -	if m == 0 || n == 0 {
        -		return
        -	}
        -
        -	if alpha == 0 {
        -		for i := 0; i < m; i++ {
        -			btmp := b[i*ldb : i*ldb+n]
        -			for j := range btmp {
        -				btmp[j] = 0
        -			}
        -		}
        -		return
        -	}
        -	nonUnit := d == blas.NonUnit
        -	if s == blas.Left {
        -		if tA == blas.NoTrans {
        -			if ul == blas.Upper {
        -				for i := m - 1; i >= 0; i-- {
        -					btmp := b[i*ldb : i*ldb+n]
        -					if alpha != 1 {
        -						for j := range btmp {
        -							btmp[j] *= alpha
        -						}
        -					}
        -					for ka, va := range a[i*lda+i+1 : i*lda+m] {
        -						k := ka + i + 1
        -						if va != 0 {
        -							f64.AxpyUnitaryTo(btmp, -va, b[k*ldb:k*ldb+n], btmp)
        -						}
        -					}
        -					if nonUnit {
        -						tmp := 1 / a[i*lda+i]
        -						for j := 0; j < n; j++ {
        -							btmp[j] *= tmp
        -						}
        -					}
        -				}
        -				return
        -			}
        -			for i := 0; i < m; i++ {
        -				btmp := b[i*ldb : i*ldb+n]
        -				if alpha != 1 {
        -					for j := 0; j < n; j++ {
        -						btmp[j] *= alpha
        -					}
        -				}
        -				for k, va := range a[i*lda : i*lda+i] {
        -					if va != 0 {
        -						f64.AxpyUnitaryTo(btmp, -va, b[k*ldb:k*ldb+n], btmp)
        -					}
        -				}
        -				if nonUnit {
        -					tmp := 1 / a[i*lda+i]
        -					for j := 0; j < n; j++ {
        -						btmp[j] *= tmp
        -					}
        -				}
        -			}
        -			return
        -		}
        -		// Cases where a is transposed
        -		if ul == blas.Upper {
        -			for k := 0; k < m; k++ {
        -				btmpk := b[k*ldb : k*ldb+n]
        -				if nonUnit {
        -					tmp := 1 / a[k*lda+k]
        -					for j := 0; j < n; j++ {
        -						btmpk[j] *= tmp
        -					}
        -				}
        -				for ia, va := range a[k*lda+k+1 : k*lda+m] {
        -					i := ia + k + 1
        -					if va != 0 {
        -						btmp := b[i*ldb : i*ldb+n]
        -						f64.AxpyUnitaryTo(btmp, -va, btmpk, btmp)
        -					}
        -				}
        -				if alpha != 1 {
        -					for j := 0; j < n; j++ {
        -						btmpk[j] *= alpha
        -					}
        -				}
        -			}
        -			return
        -		}
        -		for k := m - 1; k >= 0; k-- {
        -			btmpk := b[k*ldb : k*ldb+n]
        -			if nonUnit {
        -				tmp := 1 / a[k*lda+k]
        -				for j := 0; j < n; j++ {
        -					btmpk[j] *= tmp
        -				}
        -			}
        -			for i, va := range a[k*lda : k*lda+k] {
        -				if va != 0 {
        -					btmp := b[i*ldb : i*ldb+n]
        -					f64.AxpyUnitaryTo(btmp, -va, btmpk, btmp)
        -				}
        -			}
        -			if alpha != 1 {
        -				for j := 0; j < n; j++ {
        -					btmpk[j] *= alpha
        -				}
        -			}
        -		}
        -		return
        -	}
        -	// Cases where a is to the right of X.
        -	if tA == blas.NoTrans {
        -		if ul == blas.Upper {
        -			for i := 0; i < m; i++ {
        -				btmp := b[i*ldb : i*ldb+n]
        -				if alpha != 1 {
        -					for j := 0; j < n; j++ {
        -						btmp[j] *= alpha
        -					}
        -				}
        -				for k, vb := range btmp {
        -					if vb != 0 {
        -						if btmp[k] != 0 {
        -							if nonUnit {
        -								btmp[k] /= a[k*lda+k]
        -							}
        -							btmpk := btmp[k+1 : n]
        -							f64.AxpyUnitaryTo(btmpk, -btmp[k], a[k*lda+k+1:k*lda+n], btmpk)
        -						}
        -					}
        -				}
        -			}
        -			return
        -		}
        -		for i := 0; i < m; i++ {
        -			btmp := b[i*lda : i*lda+n]
        -			if alpha != 1 {
        -				for j := 0; j < n; j++ {
        -					btmp[j] *= alpha
        -				}
        -			}
        -			for k := n - 1; k >= 0; k-- {
        -				if btmp[k] != 0 {
        -					if nonUnit {
        -						btmp[k] /= a[k*lda+k]
        -					}
        -					f64.AxpyUnitaryTo(btmp, -btmp[k], a[k*lda:k*lda+k], btmp)
        -				}
        -			}
        -		}
        -		return
        -	}
        -	// Cases where a is transposed.
        -	if ul == blas.Upper {
        -		for i := 0; i < m; i++ {
        -			btmp := b[i*lda : i*lda+n]
        -			for j := n - 1; j >= 0; j-- {
        -				tmp := alpha*btmp[j] - f64.DotUnitary(a[j*lda+j+1:j*lda+n], btmp[j+1:])
        -				if nonUnit {
        -					tmp /= a[j*lda+j]
        -				}
        -				btmp[j] = tmp
        -			}
        -		}
        -		return
        -	}
        -	for i := 0; i < m; i++ {
        -		btmp := b[i*lda : i*lda+n]
        -		for j := 0; j < n; j++ {
        -			tmp := alpha*btmp[j] - f64.DotUnitary(a[j*lda:j*lda+j], btmp)
        -			if nonUnit {
        -				tmp /= a[j*lda+j]
        -			}
        -			btmp[j] = tmp
        -		}
        -	}
        -}
        -
        -// Dsymm performs one of the matrix-matrix operations
        -//  C = alpha * A * B + beta * C  if side == blas.Left
        -//  C = alpha * B * A + beta * C  if side == blas.Right
        -// where A is an n×n or m×m symmetric matrix, B and C are m×n matrices, and alpha
        -// is a scalar.
        -func (Implementation) Dsymm(s blas.Side, ul blas.Uplo, m, n int, alpha float64, a []float64, lda int, b []float64, ldb int, beta float64, c []float64, ldc int) {
        -	if s != blas.Right && s != blas.Left {
        -		panic("goblas: bad side")
        -	}
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if m < 0 {
        -		panic(mLT0)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	var k int
        -	if s == blas.Left {
        -		k = m
        -	} else {
        -		k = n
        -	}
        -	if lda*(k-1)+k > len(a) || lda < max(1, k) {
        -		panic(badLdA)
        -	}
        -	if ldb*(m-1)+n > len(b) || ldb < max(1, n) {
        -		panic(badLdB)
        -	}
        -	if ldc*(m-1)+n > len(c) || ldc < max(1, n) {
        -		panic(badLdC)
        -	}
        -	if m == 0 || n == 0 {
        -		return
        -	}
        -	if alpha == 0 && beta == 1 {
        -		return
        -	}
        -	if alpha == 0 {
        -		if beta == 0 {
        -			for i := 0; i < m; i++ {
        -				ctmp := c[i*ldc : i*ldc+n]
        -				for j := range ctmp {
        -					ctmp[j] = 0
        -				}
        -			}
        -			return
        -		}
        -		for i := 0; i < m; i++ {
        -			ctmp := c[i*ldc : i*ldc+n]
        -			for j := 0; j < n; j++ {
        -				ctmp[j] *= beta
        -			}
        -		}
        -		return
        -	}
        -
        -	isUpper := ul == blas.Upper
        -	if s == blas.Left {
        -		for i := 0; i < m; i++ {
        -			atmp := alpha * a[i*lda+i]
        -			btmp := b[i*ldb : i*ldb+n]
        -			ctmp := c[i*ldc : i*ldc+n]
        -			for j, v := range btmp {
        -				ctmp[j] *= beta
        -				ctmp[j] += atmp * v
        -			}
        -
        -			for k := 0; k < i; k++ {
        -				var atmp float64
        -				if isUpper {
        -					atmp = a[k*lda+i]
        -				} else {
        -					atmp = a[i*lda+k]
        -				}
        -				atmp *= alpha
        -				ctmp := c[i*ldc : i*ldc+n]
        -				f64.AxpyUnitaryTo(ctmp, atmp, b[k*ldb:k*ldb+n], ctmp)
        -			}
        -			for k := i + 1; k < m; k++ {
        -				var atmp float64
        -				if isUpper {
        -					atmp = a[i*lda+k]
        -				} else {
        -					atmp = a[k*lda+i]
        -				}
        -				atmp *= alpha
        -				ctmp := c[i*ldc : i*ldc+n]
        -				f64.AxpyUnitaryTo(ctmp, atmp, b[k*ldb:k*ldb+n], ctmp)
        -			}
        -		}
        -		return
        -	}
        -	if isUpper {
        -		for i := 0; i < m; i++ {
        -			for j := n - 1; j >= 0; j-- {
        -				tmp := alpha * b[i*ldb+j]
        -				var tmp2 float64
        -				atmp := a[j*lda+j+1 : j*lda+n]
        -				btmp := b[i*ldb+j+1 : i*ldb+n]
        -				ctmp := c[i*ldc+j+1 : i*ldc+n]
        -				for k, v := range atmp {
        -					ctmp[k] += tmp * v
        -					tmp2 += btmp[k] * v
        -				}
        -				c[i*ldc+j] *= beta
        -				c[i*ldc+j] += tmp*a[j*lda+j] + alpha*tmp2
        -			}
        -		}
        -		return
        -	}
        -	for i := 0; i < m; i++ {
        -		for j := 0; j < n; j++ {
        -			tmp := alpha * b[i*ldb+j]
        -			var tmp2 float64
        -			atmp := a[j*lda : j*lda+j]
        -			btmp := b[i*ldb : i*ldb+j]
        -			ctmp := c[i*ldc : i*ldc+j]
        -			for k, v := range atmp {
        -				ctmp[k] += tmp * v
        -				tmp2 += btmp[k] * v
        -			}
        -			c[i*ldc+j] *= beta
        -			c[i*ldc+j] += tmp*a[j*lda+j] + alpha*tmp2
        -		}
        -	}
        -}
        -
        -// Dsyrk performs one of the symmetric rank-k operations
        -//  C = alpha * A * A^T + beta * C  if tA == blas.NoTrans
        -//  C = alpha * A^T * A + beta * C  if tA == blas.Trans or tA == blas.ConjTrans
        -// where A is an n×k or k×n matrix, C is an n×n symmetric matrix, and alpha and
        -// beta are scalars.
        -func (Implementation) Dsyrk(ul blas.Uplo, tA blas.Transpose, n, k int, alpha float64, a []float64, lda int, beta float64, c []float64, ldc int) {
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if tA != blas.Trans && tA != blas.NoTrans && tA != blas.ConjTrans {
        -		panic(badTranspose)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if k < 0 {
        -		panic(kLT0)
        -	}
        -	if ldc < n {
        -		panic(badLdC)
        -	}
        -	var row, col int
        -	if tA == blas.NoTrans {
        -		row, col = n, k
        -	} else {
        -		row, col = k, n
        -	}
        -	if lda*(row-1)+col > len(a) || lda < max(1, col) {
        -		panic(badLdA)
        -	}
        -	if ldc*(n-1)+n > len(c) || ldc < max(1, n) {
        -		panic(badLdC)
        -	}
        -	if alpha == 0 {
        -		if beta == 0 {
        -			if ul == blas.Upper {
        -				for i := 0; i < n; i++ {
        -					ctmp := c[i*ldc+i : i*ldc+n]
        -					for j := range ctmp {
        -						ctmp[j] = 0
        -					}
        -				}
        -				return
        -			}
        -			for i := 0; i < n; i++ {
        -				ctmp := c[i*ldc : i*ldc+i+1]
        -				for j := range ctmp {
        -					ctmp[j] = 0
        -				}
        -			}
        -			return
        -		}
        -		if ul == blas.Upper {
        -			for i := 0; i < n; i++ {
        -				ctmp := c[i*ldc+i : i*ldc+n]
        -				for j := range ctmp {
        -					ctmp[j] *= beta
        -				}
        -			}
        -			return
        -		}
        -		for i := 0; i < n; i++ {
        -			ctmp := c[i*ldc : i*ldc+i+1]
        -			for j := range ctmp {
        -				ctmp[j] *= beta
        -			}
        -		}
        -		return
        -	}
        -	if tA == blas.NoTrans {
        -		if ul == blas.Upper {
        -			for i := 0; i < n; i++ {
        -				ctmp := c[i*ldc+i : i*ldc+n]
        -				atmp := a[i*lda : i*lda+k]
        -				for jc, vc := range ctmp {
        -					j := jc + i
        -					ctmp[jc] = vc*beta + alpha*f64.DotUnitary(atmp, a[j*lda:j*lda+k])
        -				}
        -			}
        -			return
        -		}
        -		for i := 0; i < n; i++ {
        -			atmp := a[i*lda : i*lda+k]
        -			for j, vc := range c[i*ldc : i*ldc+i+1] {
        -				c[i*ldc+j] = vc*beta + alpha*f64.DotUnitary(a[j*lda:j*lda+k], atmp)
        -			}
        -		}
        -		return
        -	}
        -	// Cases where a is transposed.
        -	if ul == blas.Upper {
        -		for i := 0; i < n; i++ {
        -			ctmp := c[i*ldc+i : i*ldc+n]
        -			if beta != 1 {
        -				for j := range ctmp {
        -					ctmp[j] *= beta
        -				}
        -			}
        -			for l := 0; l < k; l++ {
        -				tmp := alpha * a[l*lda+i]
        -				if tmp != 0 {
        -					f64.AxpyUnitaryTo(ctmp, tmp, a[l*lda+i:l*lda+n], ctmp)
        -				}
        -			}
        -		}
        -		return
        -	}
        -	for i := 0; i < n; i++ {
        -		ctmp := c[i*ldc : i*ldc+i+1]
        -		if beta != 0 {
        -			for j := range ctmp {
        -				ctmp[j] *= beta
        -			}
        -		}
        -		for l := 0; l < k; l++ {
        -			tmp := alpha * a[l*lda+i]
        -			if tmp != 0 {
        -				f64.AxpyUnitaryTo(ctmp, tmp, a[l*lda:l*lda+i+1], ctmp)
        -			}
        -		}
        -	}
        -}
        -
        -// Dsyr2k performs one of the symmetric rank 2k operations
        -//  C = alpha * A * B^T + alpha * B * A^T + beta * C  if tA == blas.NoTrans
        -//  C = alpha * A^T * B + alpha * B^T * A + beta * C  if tA == blas.Trans or tA == blas.ConjTrans
        -// where A and B are n×k or k×n matrices, C is an n×n symmetric matrix, and
        -// alpha and beta are scalars.
        -func (Implementation) Dsyr2k(ul blas.Uplo, tA blas.Transpose, n, k int, alpha float64, a []float64, lda int, b []float64, ldb int, beta float64, c []float64, ldc int) {
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if tA != blas.Trans && tA != blas.NoTrans && tA != blas.ConjTrans {
        -		panic(badTranspose)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if k < 0 {
        -		panic(kLT0)
        -	}
        -	if ldc < n {
        -		panic(badLdC)
        -	}
        -	var row, col int
        -	if tA == blas.NoTrans {
        -		row, col = n, k
        -	} else {
        -		row, col = k, n
        -	}
        -	if lda*(row-1)+col > len(a) || lda < max(1, col) {
        -		panic(badLdA)
        -	}
        -	if ldb*(row-1)+col > len(b) || ldb < max(1, col) {
        -		panic(badLdB)
        -	}
        -	if ldc*(n-1)+n > len(c) || ldc < max(1, n) {
        -		panic(badLdC)
        -	}
        -	if alpha == 0 {
        -		if beta == 0 {
        -			if ul == blas.Upper {
        -				for i := 0; i < n; i++ {
        -					ctmp := c[i*ldc+i : i*ldc+n]
        -					for j := range ctmp {
        -						ctmp[j] = 0
        -					}
        -				}
        -				return
        -			}
        -			for i := 0; i < n; i++ {
        -				ctmp := c[i*ldc : i*ldc+i+1]
        -				for j := range ctmp {
        -					ctmp[j] = 0
        -				}
        -			}
        -			return
        -		}
        -		if ul == blas.Upper {
        -			for i := 0; i < n; i++ {
        -				ctmp := c[i*ldc+i : i*ldc+n]
        -				for j := range ctmp {
        -					ctmp[j] *= beta
        -				}
        -			}
        -			return
        -		}
        -		for i := 0; i < n; i++ {
        -			ctmp := c[i*ldc : i*ldc+i+1]
        -			for j := range ctmp {
        -				ctmp[j] *= beta
        -			}
        -		}
        -		return
        -	}
        -	if tA == blas.NoTrans {
        -		if ul == blas.Upper {
        -			for i := 0; i < n; i++ {
        -				atmp := a[i*lda : i*lda+k]
        -				btmp := b[i*ldb : i*ldb+k]
        -				ctmp := c[i*ldc+i : i*ldc+n]
        -				for jc := range ctmp {
        -					j := i + jc
        -					var tmp1, tmp2 float64
        -					binner := b[j*ldb : j*ldb+k]
        -					for l, v := range a[j*lda : j*lda+k] {
        -						tmp1 += v * btmp[l]
        -						tmp2 += atmp[l] * binner[l]
        -					}
        -					ctmp[jc] *= beta
        -					ctmp[jc] += alpha * (tmp1 + tmp2)
        -				}
        -			}
        -			return
        -		}
        -		for i := 0; i < n; i++ {
        -			atmp := a[i*lda : i*lda+k]
        -			btmp := b[i*ldb : i*ldb+k]
        -			ctmp := c[i*ldc : i*ldc+i+1]
        -			for j := 0; j <= i; j++ {
        -				var tmp1, tmp2 float64
        -				binner := b[j*ldb : j*ldb+k]
        -				for l, v := range a[j*lda : j*lda+k] {
        -					tmp1 += v * btmp[l]
        -					tmp2 += atmp[l] * binner[l]
        -				}
        -				ctmp[j] *= beta
        -				ctmp[j] += alpha * (tmp1 + tmp2)
        -			}
        -		}
        -		return
        -	}
        -	if ul == blas.Upper {
        -		for i := 0; i < n; i++ {
        -			ctmp := c[i*ldc+i : i*ldc+n]
        -			if beta != 1 {
        -				for j := range ctmp {
        -					ctmp[j] *= beta
        -				}
        -			}
        -			for l := 0; l < k; l++ {
        -				tmp1 := alpha * b[l*lda+i]
        -				tmp2 := alpha * a[l*lda+i]
        -				btmp := b[l*ldb+i : l*ldb+n]
        -				if tmp1 != 0 || tmp2 != 0 {
        -					for j, v := range a[l*lda+i : l*lda+n] {
        -						ctmp[j] += v*tmp1 + btmp[j]*tmp2
        -					}
        -				}
        -			}
        -		}
        -		return
        -	}
        -	for i := 0; i < n; i++ {
        -		ctmp := c[i*ldc : i*ldc+i+1]
        -		if beta != 1 {
        -			for j := range ctmp {
        -				ctmp[j] *= beta
        -			}
        -		}
        -		for l := 0; l < k; l++ {
        -			tmp1 := alpha * b[l*lda+i]
        -			tmp2 := alpha * a[l*lda+i]
        -			btmp := b[l*ldb : l*ldb+i+1]
        -			if tmp1 != 0 || tmp2 != 0 {
        -				for j, v := range a[l*lda : l*lda+i+1] {
        -					ctmp[j] += v*tmp1 + btmp[j]*tmp2
        -				}
        -			}
        -		}
        -	}
        -}
        -
        -// Dtrmm performs one of the matrix-matrix operations
        -//  B = alpha * A * B    if tA == blas.NoTrans and side == blas.Left
        -//  B = alpha * A^T * B  if tA == blas.Trans or blas.ConjTrans, and side == blas.Left
        -//  B = alpha * B * A    if tA == blas.NoTrans and side == blas.Right
        -//  B = alpha * B * A^T  if tA == blas.Trans or blas.ConjTrans, and side == blas.Right
        -// where A is an n×n or m×m triangular matrix, B is an m×n matrix, and alpha is a scalar.
        -func (Implementation) Dtrmm(s blas.Side, ul blas.Uplo, tA blas.Transpose, d blas.Diag, m, n int, alpha float64, a []float64, lda int, b []float64, ldb int) {
        -	if s != blas.Left && s != blas.Right {
        -		panic(badSide)
        -	}
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        -		panic(badTranspose)
        -	}
        -	if d != blas.NonUnit && d != blas.Unit {
        -		panic(badDiag)
        -	}
        -	if m < 0 {
        -		panic(mLT0)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	var k int
        -	if s == blas.Left {
        -		k = m
        -	} else {
        -		k = n
        -	}
        -	if lda*(k-1)+k > len(a) || lda < max(1, k) {
        -		panic(badLdA)
        -	}
        -	if ldb*(m-1)+n > len(b) || ldb < max(1, n) {
        -		panic(badLdB)
        -	}
        -	if alpha == 0 {
        -		for i := 0; i < m; i++ {
        -			btmp := b[i*ldb : i*ldb+n]
        -			for j := range btmp {
        -				btmp[j] = 0
        -			}
        -		}
        -		return
        -	}
        -
        -	nonUnit := d == blas.NonUnit
        -	if s == blas.Left {
        -		if tA == blas.NoTrans {
        -			if ul == blas.Upper {
        -				for i := 0; i < m; i++ {
        -					tmp := alpha
        -					if nonUnit {
        -						tmp *= a[i*lda+i]
        -					}
        -					btmp := b[i*ldb : i*ldb+n]
        -					for j := range btmp {
        -						btmp[j] *= tmp
        -					}
        -					for ka, va := range a[i*lda+i+1 : i*lda+m] {
        -						k := ka + i + 1
        -						tmp := alpha * va
        -						if tmp != 0 {
        -							f64.AxpyUnitaryTo(btmp, tmp, b[k*ldb:k*ldb+n], btmp)
        -						}
        -					}
        -				}
        -				return
        -			}
        -			for i := m - 1; i >= 0; i-- {
        -				tmp := alpha
        -				if nonUnit {
        -					tmp *= a[i*lda+i]
        -				}
        -				btmp := b[i*ldb : i*ldb+n]
        -				for j := range btmp {
        -					btmp[j] *= tmp
        -				}
        -				for k, va := range a[i*lda : i*lda+i] {
        -					tmp := alpha * va
        -					if tmp != 0 {
        -						f64.AxpyUnitaryTo(btmp, tmp, b[k*ldb:k*ldb+n], btmp)
        -					}
        -				}
        -			}
        -			return
        -		}
        -		// Cases where a is transposed.
        -		if ul == blas.Upper {
        -			for k := m - 1; k >= 0; k-- {
        -				btmpk := b[k*ldb : k*ldb+n]
        -				for ia, va := range a[k*lda+k+1 : k*lda+m] {
        -					i := ia + k + 1
        -					btmp := b[i*ldb : i*ldb+n]
        -					tmp := alpha * va
        -					if tmp != 0 {
        -						f64.AxpyUnitaryTo(btmp, tmp, btmpk, btmp)
        -					}
        -				}
        -				tmp := alpha
        -				if nonUnit {
        -					tmp *= a[k*lda+k]
        -				}
        -				if tmp != 1 {
        -					for j := 0; j < n; j++ {
        -						btmpk[j] *= tmp
        -					}
        -				}
        -			}
        -			return
        -		}
        -		for k := 0; k < m; k++ {
        -			btmpk := b[k*ldb : k*ldb+n]
        -			for i, va := range a[k*lda : k*lda+k] {
        -				btmp := b[i*ldb : i*ldb+n]
        -				tmp := alpha * va
        -				if tmp != 0 {
        -					f64.AxpyUnitaryTo(btmp, tmp, btmpk, btmp)
        -				}
        -			}
        -			tmp := alpha
        -			if nonUnit {
        -				tmp *= a[k*lda+k]
        -			}
        -			if tmp != 1 {
        -				for j := 0; j < n; j++ {
        -					btmpk[j] *= tmp
        -				}
        -			}
        -		}
        -		return
        -	}
        -	// Cases where a is on the right
        -	if tA == blas.NoTrans {
        -		if ul == blas.Upper {
        -			for i := 0; i < m; i++ {
        -				btmp := b[i*ldb : i*ldb+n]
        -				for k := n - 1; k >= 0; k-- {
        -					tmp := alpha * btmp[k]
        -					if tmp != 0 {
        -						btmp[k] = tmp
        -						if nonUnit {
        -							btmp[k] *= a[k*lda+k]
        -						}
        -						for ja, v := range a[k*lda+k+1 : k*lda+n] {
        -							j := ja + k + 1
        -							btmp[j] += tmp * v
        -						}
        -					}
        -				}
        -			}
        -			return
        -		}
        -		for i := 0; i < m; i++ {
        -			btmp := b[i*ldb : i*ldb+n]
        -			for k := 0; k < n; k++ {
        -				tmp := alpha * btmp[k]
        -				if tmp != 0 {
        -					btmp[k] = tmp
        -					if nonUnit {
        -						btmp[k] *= a[k*lda+k]
        -					}
        -					f64.AxpyUnitaryTo(btmp, tmp, a[k*lda:k*lda+k], btmp)
        -				}
        -			}
        -		}
        -		return
        -	}
        -	// Cases where a is transposed.
        -	if ul == blas.Upper {
        -		for i := 0; i < m; i++ {
        -			btmp := b[i*ldb : i*ldb+n]
        -			for j, vb := range btmp {
        -				tmp := vb
        -				if nonUnit {
        -					tmp *= a[j*lda+j]
        -				}
        -				tmp += f64.DotUnitary(a[j*lda+j+1:j*lda+n], btmp[j+1:n])
        -				btmp[j] = alpha * tmp
        -			}
        -		}
        -		return
        -	}
        -	for i := 0; i < m; i++ {
        -		btmp := b[i*ldb : i*ldb+n]
        -		for j := n - 1; j >= 0; j-- {
        -			tmp := btmp[j]
        -			if nonUnit {
        -				tmp *= a[j*lda+j]
        -			}
        -			tmp += f64.DotUnitary(a[j*lda:j*lda+j], btmp[:j])
        -			btmp[j] = alpha * tmp
        -		}
        -	}
        -}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/level3float32.go b/vendor/gonum.org/v1/gonum/blas/gonum/level3float32.go
        new file mode 100644
        index 000000000..a565b9e82
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/blas/gonum/level3float32.go
        @@ -0,0 +1,876 @@
        +// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.
        +
        +// Copyright ©2014 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package gonum
        +
        +import (
        +	"gonum.org/v1/gonum/blas"
        +	"gonum.org/v1/gonum/internal/asm/f32"
        +)
        +
        +var _ blas.Float32Level3 = Implementation{}
        +
        +// Strsm solves one of the matrix equations
        +//  A * X = alpha * B   if tA == blas.NoTrans and side == blas.Left
        +//  Aᵀ * X = alpha * B  if tA == blas.Trans or blas.ConjTrans, and side == blas.Left
        +//  X * A = alpha * B   if tA == blas.NoTrans and side == blas.Right
        +//  X * Aᵀ = alpha * B  if tA == blas.Trans or blas.ConjTrans, and side == blas.Right
        +// where A is an n×n or m×m triangular matrix, X and B are m×n matrices, and alpha is a
        +// scalar.
        +//
        +// At entry to the function, X contains the values of B, and the result is
        +// stored in-place into X.
        +//
        +// No check is made that A is invertible.
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Strsm(s blas.Side, ul blas.Uplo, tA blas.Transpose, d blas.Diag, m, n int, alpha float32, a []float32, lda int, b []float32, ldb int) {
        +	if s != blas.Left && s != blas.Right {
        +		panic(badSide)
        +	}
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        +		panic(badTranspose)
        +	}
        +	if d != blas.NonUnit && d != blas.Unit {
        +		panic(badDiag)
        +	}
        +	if m < 0 {
        +		panic(mLT0)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	k := n
        +	if s == blas.Left {
        +		k = m
        +	}
        +	if lda < max(1, k) {
        +		panic(badLdA)
        +	}
        +	if ldb < max(1, n) {
        +		panic(badLdB)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(k-1)+k {
        +		panic(shortA)
        +	}
        +	if len(b) < ldb*(m-1)+n {
        +		panic(shortB)
        +	}
        +
        +	if alpha == 0 {
        +		for i := 0; i < m; i++ {
        +			btmp := b[i*ldb : i*ldb+n]
        +			for j := range btmp {
        +				btmp[j] = 0
        +			}
        +		}
        +		return
        +	}
        +	nonUnit := d == blas.NonUnit
        +	if s == blas.Left {
        +		if tA == blas.NoTrans {
        +			if ul == blas.Upper {
        +				for i := m - 1; i >= 0; i-- {
        +					btmp := b[i*ldb : i*ldb+n]
        +					if alpha != 1 {
        +						f32.ScalUnitary(alpha, btmp)
        +					}
        +					for ka, va := range a[i*lda+i+1 : i*lda+m] {
        +						if va != 0 {
        +							k := ka + i + 1
        +							f32.AxpyUnitary(-va, b[k*ldb:k*ldb+n], btmp)
        +						}
        +					}
        +					if nonUnit {
        +						tmp := 1 / a[i*lda+i]
        +						f32.ScalUnitary(tmp, btmp)
        +					}
        +				}
        +				return
        +			}
        +			for i := 0; i < m; i++ {
        +				btmp := b[i*ldb : i*ldb+n]
        +				if alpha != 1 {
        +					f32.ScalUnitary(alpha, btmp)
        +				}
        +				for k, va := range a[i*lda : i*lda+i] {
        +					if va != 0 {
        +						f32.AxpyUnitary(-va, b[k*ldb:k*ldb+n], btmp)
        +					}
        +				}
        +				if nonUnit {
        +					tmp := 1 / a[i*lda+i]
        +					f32.ScalUnitary(tmp, btmp)
        +				}
        +			}
        +			return
        +		}
        +		// Cases where a is transposed
        +		if ul == blas.Upper {
        +			for k := 0; k < m; k++ {
        +				btmpk := b[k*ldb : k*ldb+n]
        +				if nonUnit {
        +					tmp := 1 / a[k*lda+k]
        +					f32.ScalUnitary(tmp, btmpk)
        +				}
        +				for ia, va := range a[k*lda+k+1 : k*lda+m] {
        +					if va != 0 {
        +						i := ia + k + 1
        +						f32.AxpyUnitary(-va, btmpk, b[i*ldb:i*ldb+n])
        +					}
        +				}
        +				if alpha != 1 {
        +					f32.ScalUnitary(alpha, btmpk)
        +				}
        +			}
        +			return
        +		}
        +		for k := m - 1; k >= 0; k-- {
        +			btmpk := b[k*ldb : k*ldb+n]
        +			if nonUnit {
        +				tmp := 1 / a[k*lda+k]
        +				f32.ScalUnitary(tmp, btmpk)
        +			}
        +			for i, va := range a[k*lda : k*lda+k] {
        +				if va != 0 {
        +					f32.AxpyUnitary(-va, btmpk, b[i*ldb:i*ldb+n])
        +				}
        +			}
        +			if alpha != 1 {
        +				f32.ScalUnitary(alpha, btmpk)
        +			}
        +		}
        +		return
        +	}
        +	// Cases where a is to the right of X.
        +	if tA == blas.NoTrans {
        +		if ul == blas.Upper {
        +			for i := 0; i < m; i++ {
        +				btmp := b[i*ldb : i*ldb+n]
        +				if alpha != 1 {
        +					f32.ScalUnitary(alpha, btmp)
        +				}
        +				for k, vb := range btmp {
        +					if vb == 0 {
        +						continue
        +					}
        +					if nonUnit {
        +						btmp[k] /= a[k*lda+k]
        +					}
        +					f32.AxpyUnitary(-btmp[k], a[k*lda+k+1:k*lda+n], btmp[k+1:n])
        +				}
        +			}
        +			return
        +		}
        +		for i := 0; i < m; i++ {
        +			btmp := b[i*ldb : i*ldb+n]
        +			if alpha != 1 {
        +				f32.ScalUnitary(alpha, btmp)
        +			}
        +			for k := n - 1; k >= 0; k-- {
        +				if btmp[k] == 0 {
        +					continue
        +				}
        +				if nonUnit {
        +					btmp[k] /= a[k*lda+k]
        +				}
        +				f32.AxpyUnitary(-btmp[k], a[k*lda:k*lda+k], btmp[:k])
        +			}
        +		}
        +		return
        +	}
        +	// Cases where a is transposed.
        +	if ul == blas.Upper {
        +		for i := 0; i < m; i++ {
        +			btmp := b[i*ldb : i*ldb+n]
        +			for j := n - 1; j >= 0; j-- {
        +				tmp := alpha*btmp[j] - f32.DotUnitary(a[j*lda+j+1:j*lda+n], btmp[j+1:])
        +				if nonUnit {
        +					tmp /= a[j*lda+j]
        +				}
        +				btmp[j] = tmp
        +			}
        +		}
        +		return
        +	}
        +	for i := 0; i < m; i++ {
        +		btmp := b[i*ldb : i*ldb+n]
        +		for j := 0; j < n; j++ {
        +			tmp := alpha*btmp[j] - f32.DotUnitary(a[j*lda:j*lda+j], btmp[:j])
        +			if nonUnit {
        +				tmp /= a[j*lda+j]
        +			}
        +			btmp[j] = tmp
        +		}
        +	}
        +}
        +
        +// Ssymm performs one of the matrix-matrix operations
        +//  C = alpha * A * B + beta * C  if side == blas.Left
        +//  C = alpha * B * A + beta * C  if side == blas.Right
        +// where A is an n×n or m×m symmetric matrix, B and C are m×n matrices, and alpha
        +// is a scalar.
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Ssymm(s blas.Side, ul blas.Uplo, m, n int, alpha float32, a []float32, lda int, b []float32, ldb int, beta float32, c []float32, ldc int) {
        +	if s != blas.Right && s != blas.Left {
        +		panic(badSide)
        +	}
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if m < 0 {
        +		panic(mLT0)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	k := n
        +	if s == blas.Left {
        +		k = m
        +	}
        +	if lda < max(1, k) {
        +		panic(badLdA)
        +	}
        +	if ldb < max(1, n) {
        +		panic(badLdB)
        +	}
        +	if ldc < max(1, n) {
        +		panic(badLdC)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(k-1)+k {
        +		panic(shortA)
        +	}
        +	if len(b) < ldb*(m-1)+n {
        +		panic(shortB)
        +	}
        +	if len(c) < ldc*(m-1)+n {
        +		panic(shortC)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 && beta == 1 {
        +		return
        +	}
        +
        +	if alpha == 0 {
        +		if beta == 0 {
        +			for i := 0; i < m; i++ {
        +				ctmp := c[i*ldc : i*ldc+n]
        +				for j := range ctmp {
        +					ctmp[j] = 0
        +				}
        +			}
        +			return
        +		}
        +		for i := 0; i < m; i++ {
        +			ctmp := c[i*ldc : i*ldc+n]
        +			for j := 0; j < n; j++ {
        +				ctmp[j] *= beta
        +			}
        +		}
        +		return
        +	}
        +
        +	isUpper := ul == blas.Upper
        +	if s == blas.Left {
        +		for i := 0; i < m; i++ {
        +			atmp := alpha * a[i*lda+i]
        +			btmp := b[i*ldb : i*ldb+n]
        +			ctmp := c[i*ldc : i*ldc+n]
        +			for j, v := range btmp {
        +				ctmp[j] *= beta
        +				ctmp[j] += atmp * v
        +			}
        +
        +			for k := 0; k < i; k++ {
        +				var atmp float32
        +				if isUpper {
        +					atmp = a[k*lda+i]
        +				} else {
        +					atmp = a[i*lda+k]
        +				}
        +				atmp *= alpha
        +				f32.AxpyUnitary(atmp, b[k*ldb:k*ldb+n], ctmp)
        +			}
        +			for k := i + 1; k < m; k++ {
        +				var atmp float32
        +				if isUpper {
        +					atmp = a[i*lda+k]
        +				} else {
        +					atmp = a[k*lda+i]
        +				}
        +				atmp *= alpha
        +				f32.AxpyUnitary(atmp, b[k*ldb:k*ldb+n], ctmp)
        +			}
        +		}
        +		return
        +	}
        +	if isUpper {
        +		for i := 0; i < m; i++ {
        +			for j := n - 1; j >= 0; j-- {
        +				tmp := alpha * b[i*ldb+j]
        +				var tmp2 float32
        +				atmp := a[j*lda+j+1 : j*lda+n]
        +				btmp := b[i*ldb+j+1 : i*ldb+n]
        +				ctmp := c[i*ldc+j+1 : i*ldc+n]
        +				for k, v := range atmp {
        +					ctmp[k] += tmp * v
        +					tmp2 += btmp[k] * v
        +				}
        +				c[i*ldc+j] *= beta
        +				c[i*ldc+j] += tmp*a[j*lda+j] + alpha*tmp2
        +			}
        +		}
        +		return
        +	}
        +	for i := 0; i < m; i++ {
        +		for j := 0; j < n; j++ {
        +			tmp := alpha * b[i*ldb+j]
        +			var tmp2 float32
        +			atmp := a[j*lda : j*lda+j]
        +			btmp := b[i*ldb : i*ldb+j]
        +			ctmp := c[i*ldc : i*ldc+j]
        +			for k, v := range atmp {
        +				ctmp[k] += tmp * v
        +				tmp2 += btmp[k] * v
        +			}
        +			c[i*ldc+j] *= beta
        +			c[i*ldc+j] += tmp*a[j*lda+j] + alpha*tmp2
        +		}
        +	}
        +}
        +
        +// Ssyrk performs one of the symmetric rank-k operations
        +//  C = alpha * A * Aᵀ + beta * C  if tA == blas.NoTrans
        +//  C = alpha * Aᵀ * A + beta * C  if tA == blas.Trans or tA == blas.ConjTrans
        +// where A is an n×k or k×n matrix, C is an n×n symmetric matrix, and alpha and
        +// beta are scalars.
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Ssyrk(ul blas.Uplo, tA blas.Transpose, n, k int, alpha float32, a []float32, lda int, beta float32, c []float32, ldc int) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if tA != blas.Trans && tA != blas.NoTrans && tA != blas.ConjTrans {
        +		panic(badTranspose)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if k < 0 {
        +		panic(kLT0)
        +	}
        +	row, col := k, n
        +	if tA == blas.NoTrans {
        +		row, col = n, k
        +	}
        +	if lda < max(1, col) {
        +		panic(badLdA)
        +	}
        +	if ldc < max(1, n) {
        +		panic(badLdC)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(row-1)+col {
        +		panic(shortA)
        +	}
        +	if len(c) < ldc*(n-1)+n {
        +		panic(shortC)
        +	}
        +
        +	if alpha == 0 {
        +		if beta == 0 {
        +			if ul == blas.Upper {
        +				for i := 0; i < n; i++ {
        +					ctmp := c[i*ldc+i : i*ldc+n]
        +					for j := range ctmp {
        +						ctmp[j] = 0
        +					}
        +				}
        +				return
        +			}
        +			for i := 0; i < n; i++ {
        +				ctmp := c[i*ldc : i*ldc+i+1]
        +				for j := range ctmp {
        +					ctmp[j] = 0
        +				}
        +			}
        +			return
        +		}
        +		if ul == blas.Upper {
        +			for i := 0; i < n; i++ {
        +				ctmp := c[i*ldc+i : i*ldc+n]
        +				for j := range ctmp {
        +					ctmp[j] *= beta
        +				}
        +			}
        +			return
        +		}
        +		for i := 0; i < n; i++ {
        +			ctmp := c[i*ldc : i*ldc+i+1]
        +			for j := range ctmp {
        +				ctmp[j] *= beta
        +			}
        +		}
        +		return
        +	}
        +	if tA == blas.NoTrans {
        +		if ul == blas.Upper {
        +			for i := 0; i < n; i++ {
        +				ctmp := c[i*ldc+i : i*ldc+n]
        +				atmp := a[i*lda : i*lda+k]
        +				if beta == 0 {
        +					for jc := range ctmp {
        +						j := jc + i
        +						ctmp[jc] = alpha * f32.DotUnitary(atmp, a[j*lda:j*lda+k])
        +					}
        +				} else {
        +					for jc, vc := range ctmp {
        +						j := jc + i
        +						ctmp[jc] = vc*beta + alpha*f32.DotUnitary(atmp, a[j*lda:j*lda+k])
        +					}
        +				}
        +			}
        +			return
        +		}
        +		for i := 0; i < n; i++ {
        +			ctmp := c[i*ldc : i*ldc+i+1]
        +			atmp := a[i*lda : i*lda+k]
        +			if beta == 0 {
        +				for j := range ctmp {
        +					ctmp[j] = alpha * f32.DotUnitary(a[j*lda:j*lda+k], atmp)
        +				}
        +			} else {
        +				for j, vc := range ctmp {
        +					ctmp[j] = vc*beta + alpha*f32.DotUnitary(a[j*lda:j*lda+k], atmp)
        +				}
        +			}
        +		}
        +		return
        +	}
        +	// Cases where a is transposed.
        +	if ul == blas.Upper {
        +		for i := 0; i < n; i++ {
        +			ctmp := c[i*ldc+i : i*ldc+n]
        +			if beta == 0 {
        +				for j := range ctmp {
        +					ctmp[j] = 0
        +				}
        +			} else if beta != 1 {
        +				for j := range ctmp {
        +					ctmp[j] *= beta
        +				}
        +			}
        +			for l := 0; l < k; l++ {
        +				tmp := alpha * a[l*lda+i]
        +				if tmp != 0 {
        +					f32.AxpyUnitary(tmp, a[l*lda+i:l*lda+n], ctmp)
        +				}
        +			}
        +		}
        +		return
        +	}
        +	for i := 0; i < n; i++ {
        +		ctmp := c[i*ldc : i*ldc+i+1]
        +		if beta != 1 {
        +			for j := range ctmp {
        +				ctmp[j] *= beta
        +			}
        +		}
        +		for l := 0; l < k; l++ {
        +			tmp := alpha * a[l*lda+i]
        +			if tmp != 0 {
        +				f32.AxpyUnitary(tmp, a[l*lda:l*lda+i+1], ctmp)
        +			}
        +		}
        +	}
        +}
        +
        +// Ssyr2k performs one of the symmetric rank 2k operations
        +//  C = alpha * A * Bᵀ + alpha * B * Aᵀ + beta * C  if tA == blas.NoTrans
        +//  C = alpha * Aᵀ * B + alpha * Bᵀ * A + beta * C  if tA == blas.Trans or tA == blas.ConjTrans
        +// where A and B are n×k or k×n matrices, C is an n×n symmetric matrix, and
        +// alpha and beta are scalars.
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Ssyr2k(ul blas.Uplo, tA blas.Transpose, n, k int, alpha float32, a []float32, lda int, b []float32, ldb int, beta float32, c []float32, ldc int) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if tA != blas.Trans && tA != blas.NoTrans && tA != blas.ConjTrans {
        +		panic(badTranspose)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if k < 0 {
        +		panic(kLT0)
        +	}
        +	row, col := k, n
        +	if tA == blas.NoTrans {
        +		row, col = n, k
        +	}
        +	if lda < max(1, col) {
        +		panic(badLdA)
        +	}
        +	if ldb < max(1, col) {
        +		panic(badLdB)
        +	}
        +	if ldc < max(1, n) {
        +		panic(badLdC)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(row-1)+col {
        +		panic(shortA)
        +	}
        +	if len(b) < ldb*(row-1)+col {
        +		panic(shortB)
        +	}
        +	if len(c) < ldc*(n-1)+n {
        +		panic(shortC)
        +	}
        +
        +	if alpha == 0 {
        +		if beta == 0 {
        +			if ul == blas.Upper {
        +				for i := 0; i < n; i++ {
        +					ctmp := c[i*ldc+i : i*ldc+n]
        +					for j := range ctmp {
        +						ctmp[j] = 0
        +					}
        +				}
        +				return
        +			}
        +			for i := 0; i < n; i++ {
        +				ctmp := c[i*ldc : i*ldc+i+1]
        +				for j := range ctmp {
        +					ctmp[j] = 0
        +				}
        +			}
        +			return
        +		}
        +		if ul == blas.Upper {
        +			for i := 0; i < n; i++ {
        +				ctmp := c[i*ldc+i : i*ldc+n]
        +				for j := range ctmp {
        +					ctmp[j] *= beta
        +				}
        +			}
        +			return
        +		}
        +		for i := 0; i < n; i++ {
        +			ctmp := c[i*ldc : i*ldc+i+1]
        +			for j := range ctmp {
        +				ctmp[j] *= beta
        +			}
        +		}
        +		return
        +	}
        +	if tA == blas.NoTrans {
        +		if ul == blas.Upper {
        +			for i := 0; i < n; i++ {
        +				atmp := a[i*lda : i*lda+k]
        +				btmp := b[i*ldb : i*ldb+k]
        +				ctmp := c[i*ldc+i : i*ldc+n]
        +				for jc := range ctmp {
        +					j := i + jc
        +					var tmp1, tmp2 float32
        +					binner := b[j*ldb : j*ldb+k]
        +					for l, v := range a[j*lda : j*lda+k] {
        +						tmp1 += v * btmp[l]
        +						tmp2 += atmp[l] * binner[l]
        +					}
        +					ctmp[jc] *= beta
        +					ctmp[jc] += alpha * (tmp1 + tmp2)
        +				}
        +			}
        +			return
        +		}
        +		for i := 0; i < n; i++ {
        +			atmp := a[i*lda : i*lda+k]
        +			btmp := b[i*ldb : i*ldb+k]
        +			ctmp := c[i*ldc : i*ldc+i+1]
        +			for j := 0; j <= i; j++ {
        +				var tmp1, tmp2 float32
        +				binner := b[j*ldb : j*ldb+k]
        +				for l, v := range a[j*lda : j*lda+k] {
        +					tmp1 += v * btmp[l]
        +					tmp2 += atmp[l] * binner[l]
        +				}
        +				ctmp[j] *= beta
        +				ctmp[j] += alpha * (tmp1 + tmp2)
        +			}
        +		}
        +		return
        +	}
        +	if ul == blas.Upper {
        +		for i := 0; i < n; i++ {
        +			ctmp := c[i*ldc+i : i*ldc+n]
        +			if beta != 1 {
        +				for j := range ctmp {
        +					ctmp[j] *= beta
        +				}
        +			}
        +			for l := 0; l < k; l++ {
        +				tmp1 := alpha * b[l*ldb+i]
        +				tmp2 := alpha * a[l*lda+i]
        +				btmp := b[l*ldb+i : l*ldb+n]
        +				if tmp1 != 0 || tmp2 != 0 {
        +					for j, v := range a[l*lda+i : l*lda+n] {
        +						ctmp[j] += v*tmp1 + btmp[j]*tmp2
        +					}
        +				}
        +			}
        +		}
        +		return
        +	}
        +	for i := 0; i < n; i++ {
        +		ctmp := c[i*ldc : i*ldc+i+1]
        +		if beta != 1 {
        +			for j := range ctmp {
        +				ctmp[j] *= beta
        +			}
        +		}
        +		for l := 0; l < k; l++ {
        +			tmp1 := alpha * b[l*ldb+i]
        +			tmp2 := alpha * a[l*lda+i]
        +			btmp := b[l*ldb : l*ldb+i+1]
        +			if tmp1 != 0 || tmp2 != 0 {
        +				for j, v := range a[l*lda : l*lda+i+1] {
        +					ctmp[j] += v*tmp1 + btmp[j]*tmp2
        +				}
        +			}
        +		}
        +	}
        +}
        +
        +// Strmm performs one of the matrix-matrix operations
        +//  B = alpha * A * B   if tA == blas.NoTrans and side == blas.Left
        +//  B = alpha * Aᵀ * B  if tA == blas.Trans or blas.ConjTrans, and side == blas.Left
        +//  B = alpha * B * A   if tA == blas.NoTrans and side == blas.Right
        +//  B = alpha * B * Aᵀ  if tA == blas.Trans or blas.ConjTrans, and side == blas.Right
        +// where A is an n×n or m×m triangular matrix, B is an m×n matrix, and alpha is a scalar.
        +//
        +// Float32 implementations are autogenerated and not directly tested.
        +func (Implementation) Strmm(s blas.Side, ul blas.Uplo, tA blas.Transpose, d blas.Diag, m, n int, alpha float32, a []float32, lda int, b []float32, ldb int) {
        +	if s != blas.Left && s != blas.Right {
        +		panic(badSide)
        +	}
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        +		panic(badTranspose)
        +	}
        +	if d != blas.NonUnit && d != blas.Unit {
        +		panic(badDiag)
        +	}
        +	if m < 0 {
        +		panic(mLT0)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	k := n
        +	if s == blas.Left {
        +		k = m
        +	}
        +	if lda < max(1, k) {
        +		panic(badLdA)
        +	}
        +	if ldb < max(1, n) {
        +		panic(badLdB)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(k-1)+k {
        +		panic(shortA)
        +	}
        +	if len(b) < ldb*(m-1)+n {
        +		panic(shortB)
        +	}
        +
        +	if alpha == 0 {
        +		for i := 0; i < m; i++ {
        +			btmp := b[i*ldb : i*ldb+n]
        +			for j := range btmp {
        +				btmp[j] = 0
        +			}
        +		}
        +		return
        +	}
        +
        +	nonUnit := d == blas.NonUnit
        +	if s == blas.Left {
        +		if tA == blas.NoTrans {
        +			if ul == blas.Upper {
        +				for i := 0; i < m; i++ {
        +					tmp := alpha
        +					if nonUnit {
        +						tmp *= a[i*lda+i]
        +					}
        +					btmp := b[i*ldb : i*ldb+n]
        +					f32.ScalUnitary(tmp, btmp)
        +					for ka, va := range a[i*lda+i+1 : i*lda+m] {
        +						k := ka + i + 1
        +						if va != 0 {
        +							f32.AxpyUnitary(alpha*va, b[k*ldb:k*ldb+n], btmp)
        +						}
        +					}
        +				}
        +				return
        +			}
        +			for i := m - 1; i >= 0; i-- {
        +				tmp := alpha
        +				if nonUnit {
        +					tmp *= a[i*lda+i]
        +				}
        +				btmp := b[i*ldb : i*ldb+n]
        +				f32.ScalUnitary(tmp, btmp)
        +				for k, va := range a[i*lda : i*lda+i] {
        +					if va != 0 {
        +						f32.AxpyUnitary(alpha*va, b[k*ldb:k*ldb+n], btmp)
        +					}
        +				}
        +			}
        +			return
        +		}
        +		// Cases where a is transposed.
        +		if ul == blas.Upper {
        +			for k := m - 1; k >= 0; k-- {
        +				btmpk := b[k*ldb : k*ldb+n]
        +				for ia, va := range a[k*lda+k+1 : k*lda+m] {
        +					i := ia + k + 1
        +					btmp := b[i*ldb : i*ldb+n]
        +					if va != 0 {
        +						f32.AxpyUnitary(alpha*va, btmpk, btmp)
        +					}
        +				}
        +				tmp := alpha
        +				if nonUnit {
        +					tmp *= a[k*lda+k]
        +				}
        +				if tmp != 1 {
        +					f32.ScalUnitary(tmp, btmpk)
        +				}
        +			}
        +			return
        +		}
        +		for k := 0; k < m; k++ {
        +			btmpk := b[k*ldb : k*ldb+n]
        +			for i, va := range a[k*lda : k*lda+k] {
        +				btmp := b[i*ldb : i*ldb+n]
        +				if va != 0 {
        +					f32.AxpyUnitary(alpha*va, btmpk, btmp)
        +				}
        +			}
        +			tmp := alpha
        +			if nonUnit {
        +				tmp *= a[k*lda+k]
        +			}
        +			if tmp != 1 {
        +				f32.ScalUnitary(tmp, btmpk)
        +			}
        +		}
        +		return
        +	}
        +	// Cases where a is on the right
        +	if tA == blas.NoTrans {
        +		if ul == blas.Upper {
        +			for i := 0; i < m; i++ {
        +				btmp := b[i*ldb : i*ldb+n]
        +				for k := n - 1; k >= 0; k-- {
        +					tmp := alpha * btmp[k]
        +					if tmp == 0 {
        +						continue
        +					}
        +					btmp[k] = tmp
        +					if nonUnit {
        +						btmp[k] *= a[k*lda+k]
        +					}
        +					f32.AxpyUnitary(tmp, a[k*lda+k+1:k*lda+n], btmp[k+1:n])
        +				}
        +			}
        +			return
        +		}
        +		for i := 0; i < m; i++ {
        +			btmp := b[i*ldb : i*ldb+n]
        +			for k := 0; k < n; k++ {
        +				tmp := alpha * btmp[k]
        +				if tmp == 0 {
        +					continue
        +				}
        +				btmp[k] = tmp
        +				if nonUnit {
        +					btmp[k] *= a[k*lda+k]
        +				}
        +				f32.AxpyUnitary(tmp, a[k*lda:k*lda+k], btmp[:k])
        +			}
        +		}
        +		return
        +	}
        +	// Cases where a is transposed.
        +	if ul == blas.Upper {
        +		for i := 0; i < m; i++ {
        +			btmp := b[i*ldb : i*ldb+n]
        +			for j, vb := range btmp {
        +				tmp := vb
        +				if nonUnit {
        +					tmp *= a[j*lda+j]
        +				}
        +				tmp += f32.DotUnitary(a[j*lda+j+1:j*lda+n], btmp[j+1:n])
        +				btmp[j] = alpha * tmp
        +			}
        +		}
        +		return
        +	}
        +	for i := 0; i < m; i++ {
        +		btmp := b[i*ldb : i*ldb+n]
        +		for j := n - 1; j >= 0; j-- {
        +			tmp := btmp[j]
        +			if nonUnit {
        +				tmp *= a[j*lda+j]
        +			}
        +			tmp += f32.DotUnitary(a[j*lda:j*lda+j], btmp[:j])
        +			btmp[j] = alpha * tmp
        +		}
        +	}
        +}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/level3float64.go b/vendor/gonum.org/v1/gonum/blas/gonum/level3float64.go
        new file mode 100644
        index 000000000..bf91d14fc
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/blas/gonum/level3float64.go
        @@ -0,0 +1,864 @@
        +// Copyright ©2014 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package gonum
        +
        +import (
        +	"gonum.org/v1/gonum/blas"
        +	"gonum.org/v1/gonum/internal/asm/f64"
        +)
        +
        +var _ blas.Float64Level3 = Implementation{}
        +
        +// Dtrsm solves one of the matrix equations
        +//  A * X = alpha * B   if tA == blas.NoTrans and side == blas.Left
        +//  Aᵀ * X = alpha * B  if tA == blas.Trans or blas.ConjTrans, and side == blas.Left
        +//  X * A = alpha * B   if tA == blas.NoTrans and side == blas.Right
        +//  X * Aᵀ = alpha * B  if tA == blas.Trans or blas.ConjTrans, and side == blas.Right
        +// where A is an n×n or m×m triangular matrix, X and B are m×n matrices, and alpha is a
        +// scalar.
        +//
        +// At entry to the function, X contains the values of B, and the result is
        +// stored in-place into X.
        +//
        +// No check is made that A is invertible.
        +func (Implementation) Dtrsm(s blas.Side, ul blas.Uplo, tA blas.Transpose, d blas.Diag, m, n int, alpha float64, a []float64, lda int, b []float64, ldb int) {
        +	if s != blas.Left && s != blas.Right {
        +		panic(badSide)
        +	}
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        +		panic(badTranspose)
        +	}
        +	if d != blas.NonUnit && d != blas.Unit {
        +		panic(badDiag)
        +	}
        +	if m < 0 {
        +		panic(mLT0)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	k := n
        +	if s == blas.Left {
        +		k = m
        +	}
        +	if lda < max(1, k) {
        +		panic(badLdA)
        +	}
        +	if ldb < max(1, n) {
        +		panic(badLdB)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(k-1)+k {
        +		panic(shortA)
        +	}
        +	if len(b) < ldb*(m-1)+n {
        +		panic(shortB)
        +	}
        +
        +	if alpha == 0 {
        +		for i := 0; i < m; i++ {
        +			btmp := b[i*ldb : i*ldb+n]
        +			for j := range btmp {
        +				btmp[j] = 0
        +			}
        +		}
        +		return
        +	}
        +	nonUnit := d == blas.NonUnit
        +	if s == blas.Left {
        +		if tA == blas.NoTrans {
        +			if ul == blas.Upper {
        +				for i := m - 1; i >= 0; i-- {
        +					btmp := b[i*ldb : i*ldb+n]
        +					if alpha != 1 {
        +						f64.ScalUnitary(alpha, btmp)
        +					}
        +					for ka, va := range a[i*lda+i+1 : i*lda+m] {
        +						if va != 0 {
        +							k := ka + i + 1
        +							f64.AxpyUnitary(-va, b[k*ldb:k*ldb+n], btmp)
        +						}
        +					}
        +					if nonUnit {
        +						tmp := 1 / a[i*lda+i]
        +						f64.ScalUnitary(tmp, btmp)
        +					}
        +				}
        +				return
        +			}
        +			for i := 0; i < m; i++ {
        +				btmp := b[i*ldb : i*ldb+n]
        +				if alpha != 1 {
        +					f64.ScalUnitary(alpha, btmp)
        +				}
        +				for k, va := range a[i*lda : i*lda+i] {
        +					if va != 0 {
        +						f64.AxpyUnitary(-va, b[k*ldb:k*ldb+n], btmp)
        +					}
        +				}
        +				if nonUnit {
        +					tmp := 1 / a[i*lda+i]
        +					f64.ScalUnitary(tmp, btmp)
        +				}
        +			}
        +			return
        +		}
        +		// Cases where a is transposed
        +		if ul == blas.Upper {
        +			for k := 0; k < m; k++ {
        +				btmpk := b[k*ldb : k*ldb+n]
        +				if nonUnit {
        +					tmp := 1 / a[k*lda+k]
        +					f64.ScalUnitary(tmp, btmpk)
        +				}
        +				for ia, va := range a[k*lda+k+1 : k*lda+m] {
        +					if va != 0 {
        +						i := ia + k + 1
        +						f64.AxpyUnitary(-va, btmpk, b[i*ldb:i*ldb+n])
        +					}
        +				}
        +				if alpha != 1 {
        +					f64.ScalUnitary(alpha, btmpk)
        +				}
        +			}
        +			return
        +		}
        +		for k := m - 1; k >= 0; k-- {
        +			btmpk := b[k*ldb : k*ldb+n]
        +			if nonUnit {
        +				tmp := 1 / a[k*lda+k]
        +				f64.ScalUnitary(tmp, btmpk)
        +			}
        +			for i, va := range a[k*lda : k*lda+k] {
        +				if va != 0 {
        +					f64.AxpyUnitary(-va, btmpk, b[i*ldb:i*ldb+n])
        +				}
        +			}
        +			if alpha != 1 {
        +				f64.ScalUnitary(alpha, btmpk)
        +			}
        +		}
        +		return
        +	}
        +	// Cases where a is to the right of X.
        +	if tA == blas.NoTrans {
        +		if ul == blas.Upper {
        +			for i := 0; i < m; i++ {
        +				btmp := b[i*ldb : i*ldb+n]
        +				if alpha != 1 {
        +					f64.ScalUnitary(alpha, btmp)
        +				}
        +				for k, vb := range btmp {
        +					if vb == 0 {
        +						continue
        +					}
        +					if nonUnit {
        +						btmp[k] /= a[k*lda+k]
        +					}
        +					f64.AxpyUnitary(-btmp[k], a[k*lda+k+1:k*lda+n], btmp[k+1:n])
        +				}
        +			}
        +			return
        +		}
        +		for i := 0; i < m; i++ {
        +			btmp := b[i*ldb : i*ldb+n]
        +			if alpha != 1 {
        +				f64.ScalUnitary(alpha, btmp)
        +			}
        +			for k := n - 1; k >= 0; k-- {
        +				if btmp[k] == 0 {
        +					continue
        +				}
        +				if nonUnit {
        +					btmp[k] /= a[k*lda+k]
        +				}
        +				f64.AxpyUnitary(-btmp[k], a[k*lda:k*lda+k], btmp[:k])
        +			}
        +		}
        +		return
        +	}
        +	// Cases where a is transposed.
        +	if ul == blas.Upper {
        +		for i := 0; i < m; i++ {
        +			btmp := b[i*ldb : i*ldb+n]
        +			for j := n - 1; j >= 0; j-- {
        +				tmp := alpha*btmp[j] - f64.DotUnitary(a[j*lda+j+1:j*lda+n], btmp[j+1:])
        +				if nonUnit {
        +					tmp /= a[j*lda+j]
        +				}
        +				btmp[j] = tmp
        +			}
        +		}
        +		return
        +	}
        +	for i := 0; i < m; i++ {
        +		btmp := b[i*ldb : i*ldb+n]
        +		for j := 0; j < n; j++ {
        +			tmp := alpha*btmp[j] - f64.DotUnitary(a[j*lda:j*lda+j], btmp[:j])
        +			if nonUnit {
        +				tmp /= a[j*lda+j]
        +			}
        +			btmp[j] = tmp
        +		}
        +	}
        +}
        +
        +// Dsymm performs one of the matrix-matrix operations
        +//  C = alpha * A * B + beta * C  if side == blas.Left
        +//  C = alpha * B * A + beta * C  if side == blas.Right
        +// where A is an n×n or m×m symmetric matrix, B and C are m×n matrices, and alpha
        +// is a scalar.
        +func (Implementation) Dsymm(s blas.Side, ul blas.Uplo, m, n int, alpha float64, a []float64, lda int, b []float64, ldb int, beta float64, c []float64, ldc int) {
        +	if s != blas.Right && s != blas.Left {
        +		panic(badSide)
        +	}
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if m < 0 {
        +		panic(mLT0)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	k := n
        +	if s == blas.Left {
        +		k = m
        +	}
        +	if lda < max(1, k) {
        +		panic(badLdA)
        +	}
        +	if ldb < max(1, n) {
        +		panic(badLdB)
        +	}
        +	if ldc < max(1, n) {
        +		panic(badLdC)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(k-1)+k {
        +		panic(shortA)
        +	}
        +	if len(b) < ldb*(m-1)+n {
        +		panic(shortB)
        +	}
        +	if len(c) < ldc*(m-1)+n {
        +		panic(shortC)
        +	}
        +
        +	// Quick return if possible.
        +	if alpha == 0 && beta == 1 {
        +		return
        +	}
        +
        +	if alpha == 0 {
        +		if beta == 0 {
        +			for i := 0; i < m; i++ {
        +				ctmp := c[i*ldc : i*ldc+n]
        +				for j := range ctmp {
        +					ctmp[j] = 0
        +				}
        +			}
        +			return
        +		}
        +		for i := 0; i < m; i++ {
        +			ctmp := c[i*ldc : i*ldc+n]
        +			for j := 0; j < n; j++ {
        +				ctmp[j] *= beta
        +			}
        +		}
        +		return
        +	}
        +
        +	isUpper := ul == blas.Upper
        +	if s == blas.Left {
        +		for i := 0; i < m; i++ {
        +			atmp := alpha * a[i*lda+i]
        +			btmp := b[i*ldb : i*ldb+n]
        +			ctmp := c[i*ldc : i*ldc+n]
        +			for j, v := range btmp {
        +				ctmp[j] *= beta
        +				ctmp[j] += atmp * v
        +			}
        +
        +			for k := 0; k < i; k++ {
        +				var atmp float64
        +				if isUpper {
        +					atmp = a[k*lda+i]
        +				} else {
        +					atmp = a[i*lda+k]
        +				}
        +				atmp *= alpha
        +				f64.AxpyUnitary(atmp, b[k*ldb:k*ldb+n], ctmp)
        +			}
        +			for k := i + 1; k < m; k++ {
        +				var atmp float64
        +				if isUpper {
        +					atmp = a[i*lda+k]
        +				} else {
        +					atmp = a[k*lda+i]
        +				}
        +				atmp *= alpha
        +				f64.AxpyUnitary(atmp, b[k*ldb:k*ldb+n], ctmp)
        +			}
        +		}
        +		return
        +	}
        +	if isUpper {
        +		for i := 0; i < m; i++ {
        +			for j := n - 1; j >= 0; j-- {
        +				tmp := alpha * b[i*ldb+j]
        +				var tmp2 float64
        +				atmp := a[j*lda+j+1 : j*lda+n]
        +				btmp := b[i*ldb+j+1 : i*ldb+n]
        +				ctmp := c[i*ldc+j+1 : i*ldc+n]
        +				for k, v := range atmp {
        +					ctmp[k] += tmp * v
        +					tmp2 += btmp[k] * v
        +				}
        +				c[i*ldc+j] *= beta
        +				c[i*ldc+j] += tmp*a[j*lda+j] + alpha*tmp2
        +			}
        +		}
        +		return
        +	}
        +	for i := 0; i < m; i++ {
        +		for j := 0; j < n; j++ {
        +			tmp := alpha * b[i*ldb+j]
        +			var tmp2 float64
        +			atmp := a[j*lda : j*lda+j]
        +			btmp := b[i*ldb : i*ldb+j]
        +			ctmp := c[i*ldc : i*ldc+j]
        +			for k, v := range atmp {
        +				ctmp[k] += tmp * v
        +				tmp2 += btmp[k] * v
        +			}
        +			c[i*ldc+j] *= beta
        +			c[i*ldc+j] += tmp*a[j*lda+j] + alpha*tmp2
        +		}
        +	}
        +}
        +
        +// Dsyrk performs one of the symmetric rank-k operations
        +//  C = alpha * A * Aᵀ + beta * C  if tA == blas.NoTrans
        +//  C = alpha * Aᵀ * A + beta * C  if tA == blas.Trans or tA == blas.ConjTrans
        +// where A is an n×k or k×n matrix, C is an n×n symmetric matrix, and alpha and
        +// beta are scalars.
        +func (Implementation) Dsyrk(ul blas.Uplo, tA blas.Transpose, n, k int, alpha float64, a []float64, lda int, beta float64, c []float64, ldc int) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if tA != blas.Trans && tA != blas.NoTrans && tA != blas.ConjTrans {
        +		panic(badTranspose)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if k < 0 {
        +		panic(kLT0)
        +	}
        +	row, col := k, n
        +	if tA == blas.NoTrans {
        +		row, col = n, k
        +	}
        +	if lda < max(1, col) {
        +		panic(badLdA)
        +	}
        +	if ldc < max(1, n) {
        +		panic(badLdC)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(row-1)+col {
        +		panic(shortA)
        +	}
        +	if len(c) < ldc*(n-1)+n {
        +		panic(shortC)
        +	}
        +
        +	if alpha == 0 {
        +		if beta == 0 {
        +			if ul == blas.Upper {
        +				for i := 0; i < n; i++ {
        +					ctmp := c[i*ldc+i : i*ldc+n]
        +					for j := range ctmp {
        +						ctmp[j] = 0
        +					}
        +				}
        +				return
        +			}
        +			for i := 0; i < n; i++ {
        +				ctmp := c[i*ldc : i*ldc+i+1]
        +				for j := range ctmp {
        +					ctmp[j] = 0
        +				}
        +			}
        +			return
        +		}
        +		if ul == blas.Upper {
        +			for i := 0; i < n; i++ {
        +				ctmp := c[i*ldc+i : i*ldc+n]
        +				for j := range ctmp {
        +					ctmp[j] *= beta
        +				}
        +			}
        +			return
        +		}
        +		for i := 0; i < n; i++ {
        +			ctmp := c[i*ldc : i*ldc+i+1]
        +			for j := range ctmp {
        +				ctmp[j] *= beta
        +			}
        +		}
        +		return
        +	}
        +	if tA == blas.NoTrans {
        +		if ul == blas.Upper {
        +			for i := 0; i < n; i++ {
        +				ctmp := c[i*ldc+i : i*ldc+n]
        +				atmp := a[i*lda : i*lda+k]
        +				if beta == 0 {
        +					for jc := range ctmp {
        +						j := jc + i
        +						ctmp[jc] = alpha * f64.DotUnitary(atmp, a[j*lda:j*lda+k])
        +					}
        +				} else {
        +					for jc, vc := range ctmp {
        +						j := jc + i
        +						ctmp[jc] = vc*beta + alpha*f64.DotUnitary(atmp, a[j*lda:j*lda+k])
        +					}
        +				}
        +			}
        +			return
        +		}
        +		for i := 0; i < n; i++ {
        +			ctmp := c[i*ldc : i*ldc+i+1]
        +			atmp := a[i*lda : i*lda+k]
        +			if beta == 0 {
        +				for j := range ctmp {
        +					ctmp[j] = alpha * f64.DotUnitary(a[j*lda:j*lda+k], atmp)
        +				}
        +			} else {
        +				for j, vc := range ctmp {
        +					ctmp[j] = vc*beta + alpha*f64.DotUnitary(a[j*lda:j*lda+k], atmp)
        +				}
        +			}
        +		}
        +		return
        +	}
        +	// Cases where a is transposed.
        +	if ul == blas.Upper {
        +		for i := 0; i < n; i++ {
        +			ctmp := c[i*ldc+i : i*ldc+n]
        +			if beta == 0 {
        +				for j := range ctmp {
        +					ctmp[j] = 0
        +				}
        +			} else if beta != 1 {
        +				for j := range ctmp {
        +					ctmp[j] *= beta
        +				}
        +			}
        +			for l := 0; l < k; l++ {
        +				tmp := alpha * a[l*lda+i]
        +				if tmp != 0 {
        +					f64.AxpyUnitary(tmp, a[l*lda+i:l*lda+n], ctmp)
        +				}
        +			}
        +		}
        +		return
        +	}
        +	for i := 0; i < n; i++ {
        +		ctmp := c[i*ldc : i*ldc+i+1]
        +		if beta != 1 {
        +			for j := range ctmp {
        +				ctmp[j] *= beta
        +			}
        +		}
        +		for l := 0; l < k; l++ {
        +			tmp := alpha * a[l*lda+i]
        +			if tmp != 0 {
        +				f64.AxpyUnitary(tmp, a[l*lda:l*lda+i+1], ctmp)
        +			}
        +		}
        +	}
        +}
        +
        +// Dsyr2k performs one of the symmetric rank 2k operations
        +//  C = alpha * A * Bᵀ + alpha * B * Aᵀ + beta * C  if tA == blas.NoTrans
        +//  C = alpha * Aᵀ * B + alpha * Bᵀ * A + beta * C  if tA == blas.Trans or tA == blas.ConjTrans
        +// where A and B are n×k or k×n matrices, C is an n×n symmetric matrix, and
        +// alpha and beta are scalars.
        +func (Implementation) Dsyr2k(ul blas.Uplo, tA blas.Transpose, n, k int, alpha float64, a []float64, lda int, b []float64, ldb int, beta float64, c []float64, ldc int) {
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if tA != blas.Trans && tA != blas.NoTrans && tA != blas.ConjTrans {
        +		panic(badTranspose)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if k < 0 {
        +		panic(kLT0)
        +	}
        +	row, col := k, n
        +	if tA == blas.NoTrans {
        +		row, col = n, k
        +	}
        +	if lda < max(1, col) {
        +		panic(badLdA)
        +	}
        +	if ldb < max(1, col) {
        +		panic(badLdB)
        +	}
        +	if ldc < max(1, n) {
        +		panic(badLdC)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(row-1)+col {
        +		panic(shortA)
        +	}
        +	if len(b) < ldb*(row-1)+col {
        +		panic(shortB)
        +	}
        +	if len(c) < ldc*(n-1)+n {
        +		panic(shortC)
        +	}
        +
        +	if alpha == 0 {
        +		if beta == 0 {
        +			if ul == blas.Upper {
        +				for i := 0; i < n; i++ {
        +					ctmp := c[i*ldc+i : i*ldc+n]
        +					for j := range ctmp {
        +						ctmp[j] = 0
        +					}
        +				}
        +				return
        +			}
        +			for i := 0; i < n; i++ {
        +				ctmp := c[i*ldc : i*ldc+i+1]
        +				for j := range ctmp {
        +					ctmp[j] = 0
        +				}
        +			}
        +			return
        +		}
        +		if ul == blas.Upper {
        +			for i := 0; i < n; i++ {
        +				ctmp := c[i*ldc+i : i*ldc+n]
        +				for j := range ctmp {
        +					ctmp[j] *= beta
        +				}
        +			}
        +			return
        +		}
        +		for i := 0; i < n; i++ {
        +			ctmp := c[i*ldc : i*ldc+i+1]
        +			for j := range ctmp {
        +				ctmp[j] *= beta
        +			}
        +		}
        +		return
        +	}
        +	if tA == blas.NoTrans {
        +		if ul == blas.Upper {
        +			for i := 0; i < n; i++ {
        +				atmp := a[i*lda : i*lda+k]
        +				btmp := b[i*ldb : i*ldb+k]
        +				ctmp := c[i*ldc+i : i*ldc+n]
        +				for jc := range ctmp {
        +					j := i + jc
        +					var tmp1, tmp2 float64
        +					binner := b[j*ldb : j*ldb+k]
        +					for l, v := range a[j*lda : j*lda+k] {
        +						tmp1 += v * btmp[l]
        +						tmp2 += atmp[l] * binner[l]
        +					}
        +					ctmp[jc] *= beta
        +					ctmp[jc] += alpha * (tmp1 + tmp2)
        +				}
        +			}
        +			return
        +		}
        +		for i := 0; i < n; i++ {
        +			atmp := a[i*lda : i*lda+k]
        +			btmp := b[i*ldb : i*ldb+k]
        +			ctmp := c[i*ldc : i*ldc+i+1]
        +			for j := 0; j <= i; j++ {
        +				var tmp1, tmp2 float64
        +				binner := b[j*ldb : j*ldb+k]
        +				for l, v := range a[j*lda : j*lda+k] {
        +					tmp1 += v * btmp[l]
        +					tmp2 += atmp[l] * binner[l]
        +				}
        +				ctmp[j] *= beta
        +				ctmp[j] += alpha * (tmp1 + tmp2)
        +			}
        +		}
        +		return
        +	}
        +	if ul == blas.Upper {
        +		for i := 0; i < n; i++ {
        +			ctmp := c[i*ldc+i : i*ldc+n]
        +			if beta != 1 {
        +				for j := range ctmp {
        +					ctmp[j] *= beta
        +				}
        +			}
        +			for l := 0; l < k; l++ {
        +				tmp1 := alpha * b[l*ldb+i]
        +				tmp2 := alpha * a[l*lda+i]
        +				btmp := b[l*ldb+i : l*ldb+n]
        +				if tmp1 != 0 || tmp2 != 0 {
        +					for j, v := range a[l*lda+i : l*lda+n] {
        +						ctmp[j] += v*tmp1 + btmp[j]*tmp2
        +					}
        +				}
        +			}
        +		}
        +		return
        +	}
        +	for i := 0; i < n; i++ {
        +		ctmp := c[i*ldc : i*ldc+i+1]
        +		if beta != 1 {
        +			for j := range ctmp {
        +				ctmp[j] *= beta
        +			}
        +		}
        +		for l := 0; l < k; l++ {
        +			tmp1 := alpha * b[l*ldb+i]
        +			tmp2 := alpha * a[l*lda+i]
        +			btmp := b[l*ldb : l*ldb+i+1]
        +			if tmp1 != 0 || tmp2 != 0 {
        +				for j, v := range a[l*lda : l*lda+i+1] {
        +					ctmp[j] += v*tmp1 + btmp[j]*tmp2
        +				}
        +			}
        +		}
        +	}
        +}
        +
        +// Dtrmm performs one of the matrix-matrix operations
        +//  B = alpha * A * B   if tA == blas.NoTrans and side == blas.Left
        +//  B = alpha * Aᵀ * B  if tA == blas.Trans or blas.ConjTrans, and side == blas.Left
        +//  B = alpha * B * A   if tA == blas.NoTrans and side == blas.Right
        +//  B = alpha * B * Aᵀ  if tA == blas.Trans or blas.ConjTrans, and side == blas.Right
        +// where A is an n×n or m×m triangular matrix, B is an m×n matrix, and alpha is a scalar.
        +func (Implementation) Dtrmm(s blas.Side, ul blas.Uplo, tA blas.Transpose, d blas.Diag, m, n int, alpha float64, a []float64, lda int, b []float64, ldb int) {
        +	if s != blas.Left && s != blas.Right {
        +		panic(badSide)
        +	}
        +	if ul != blas.Lower && ul != blas.Upper {
        +		panic(badUplo)
        +	}
        +	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        +		panic(badTranspose)
        +	}
        +	if d != blas.NonUnit && d != blas.Unit {
        +		panic(badDiag)
        +	}
        +	if m < 0 {
        +		panic(mLT0)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	k := n
        +	if s == blas.Left {
        +		k = m
        +	}
        +	if lda < max(1, k) {
        +		panic(badLdA)
        +	}
        +	if ldb < max(1, n) {
        +		panic(badLdB)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if len(a) < lda*(k-1)+k {
        +		panic(shortA)
        +	}
        +	if len(b) < ldb*(m-1)+n {
        +		panic(shortB)
        +	}
        +
        +	if alpha == 0 {
        +		for i := 0; i < m; i++ {
        +			btmp := b[i*ldb : i*ldb+n]
        +			for j := range btmp {
        +				btmp[j] = 0
        +			}
        +		}
        +		return
        +	}
        +
        +	nonUnit := d == blas.NonUnit
        +	if s == blas.Left {
        +		if tA == blas.NoTrans {
        +			if ul == blas.Upper {
        +				for i := 0; i < m; i++ {
        +					tmp := alpha
        +					if nonUnit {
        +						tmp *= a[i*lda+i]
        +					}
        +					btmp := b[i*ldb : i*ldb+n]
        +					f64.ScalUnitary(tmp, btmp)
        +					for ka, va := range a[i*lda+i+1 : i*lda+m] {
        +						k := ka + i + 1
        +						if va != 0 {
        +							f64.AxpyUnitary(alpha*va, b[k*ldb:k*ldb+n], btmp)
        +						}
        +					}
        +				}
        +				return
        +			}
        +			for i := m - 1; i >= 0; i-- {
        +				tmp := alpha
        +				if nonUnit {
        +					tmp *= a[i*lda+i]
        +				}
        +				btmp := b[i*ldb : i*ldb+n]
        +				f64.ScalUnitary(tmp, btmp)
        +				for k, va := range a[i*lda : i*lda+i] {
        +					if va != 0 {
        +						f64.AxpyUnitary(alpha*va, b[k*ldb:k*ldb+n], btmp)
        +					}
        +				}
        +			}
        +			return
        +		}
        +		// Cases where a is transposed.
        +		if ul == blas.Upper {
        +			for k := m - 1; k >= 0; k-- {
        +				btmpk := b[k*ldb : k*ldb+n]
        +				for ia, va := range a[k*lda+k+1 : k*lda+m] {
        +					i := ia + k + 1
        +					btmp := b[i*ldb : i*ldb+n]
        +					if va != 0 {
        +						f64.AxpyUnitary(alpha*va, btmpk, btmp)
        +					}
        +				}
        +				tmp := alpha
        +				if nonUnit {
        +					tmp *= a[k*lda+k]
        +				}
        +				if tmp != 1 {
        +					f64.ScalUnitary(tmp, btmpk)
        +				}
        +			}
        +			return
        +		}
        +		for k := 0; k < m; k++ {
        +			btmpk := b[k*ldb : k*ldb+n]
        +			for i, va := range a[k*lda : k*lda+k] {
        +				btmp := b[i*ldb : i*ldb+n]
        +				if va != 0 {
        +					f64.AxpyUnitary(alpha*va, btmpk, btmp)
        +				}
        +			}
        +			tmp := alpha
        +			if nonUnit {
        +				tmp *= a[k*lda+k]
        +			}
        +			if tmp != 1 {
        +				f64.ScalUnitary(tmp, btmpk)
        +			}
        +		}
        +		return
        +	}
        +	// Cases where a is on the right
        +	if tA == blas.NoTrans {
        +		if ul == blas.Upper {
        +			for i := 0; i < m; i++ {
        +				btmp := b[i*ldb : i*ldb+n]
        +				for k := n - 1; k >= 0; k-- {
        +					tmp := alpha * btmp[k]
        +					if tmp == 0 {
        +						continue
        +					}
        +					btmp[k] = tmp
        +					if nonUnit {
        +						btmp[k] *= a[k*lda+k]
        +					}
        +					f64.AxpyUnitary(tmp, a[k*lda+k+1:k*lda+n], btmp[k+1:n])
        +				}
        +			}
        +			return
        +		}
        +		for i := 0; i < m; i++ {
        +			btmp := b[i*ldb : i*ldb+n]
        +			for k := 0; k < n; k++ {
        +				tmp := alpha * btmp[k]
        +				if tmp == 0 {
        +					continue
        +				}
        +				btmp[k] = tmp
        +				if nonUnit {
        +					btmp[k] *= a[k*lda+k]
        +				}
        +				f64.AxpyUnitary(tmp, a[k*lda:k*lda+k], btmp[:k])
        +			}
        +		}
        +		return
        +	}
        +	// Cases where a is transposed.
        +	if ul == blas.Upper {
        +		for i := 0; i < m; i++ {
        +			btmp := b[i*ldb : i*ldb+n]
        +			for j, vb := range btmp {
        +				tmp := vb
        +				if nonUnit {
        +					tmp *= a[j*lda+j]
        +				}
        +				tmp += f64.DotUnitary(a[j*lda+j+1:j*lda+n], btmp[j+1:n])
        +				btmp[j] = alpha * tmp
        +			}
        +		}
        +		return
        +	}
        +	for i := 0; i < m; i++ {
        +		btmp := b[i*ldb : i*ldb+n]
        +		for j := n - 1; j >= 0; j-- {
        +			tmp := btmp[j]
        +			if nonUnit {
        +				tmp *= a[j*lda+j]
        +			}
        +			tmp += f64.DotUnitary(a[j*lda:j*lda+j], btmp[:j])
        +			btmp[j] = alpha * tmp
        +		}
        +	}
        +}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/level3single.go b/vendor/gonum.org/v1/gonum/blas/gonum/level3single.go
        deleted file mode 100644
        index d24ce78c8..000000000
        --- a/vendor/gonum.org/v1/gonum/blas/gonum/level3single.go
        +++ /dev/null
        @@ -1,845 +0,0 @@
        -// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.
        -
        -// Copyright ©2014 The Gonum Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package gonum
        -
        -import (
        -	"gonum.org/v1/gonum/blas"
        -	"gonum.org/v1/gonum/internal/asm/f32"
        -)
        -
        -var _ blas.Float32Level3 = Implementation{}
        -
        -// Strsm solves one of the matrix equations
        -//  A * X = alpha * B    if tA == blas.NoTrans and side == blas.Left
        -//  A^T * X = alpha * B  if tA == blas.Trans or blas.ConjTrans, and side == blas.Left
        -//  X * A = alpha * B    if tA == blas.NoTrans and side == blas.Right
        -//  X * A^T = alpha * B  if tA == blas.Trans or blas.ConjTrans, and side == blas.Right
        -// where A is an n×n or m×m triangular matrix, X and B are m×n matrices, and alpha is a
        -// scalar.
        -//
        -// At entry to the function, X contains the values of B, and the result is
        -// stored in-place into X.
        -//
        -// No check is made that A is invertible.
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Strsm(s blas.Side, ul blas.Uplo, tA blas.Transpose, d blas.Diag, m, n int, alpha float32, a []float32, lda int, b []float32, ldb int) {
        -	if s != blas.Left && s != blas.Right {
        -		panic(badSide)
        -	}
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        -		panic(badTranspose)
        -	}
        -	if d != blas.NonUnit && d != blas.Unit {
        -		panic(badDiag)
        -	}
        -	if m < 0 {
        -		panic(mLT0)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if ldb < n {
        -		panic(badLdB)
        -	}
        -	var k int
        -	if s == blas.Left {
        -		k = m
        -	} else {
        -		k = n
        -	}
        -	if lda*(k-1)+k > len(a) || lda < max(1, k) {
        -		panic(badLdA)
        -	}
        -	if ldb*(m-1)+n > len(b) || ldb < max(1, n) {
        -		panic(badLdB)
        -	}
        -
        -	if m == 0 || n == 0 {
        -		return
        -	}
        -
        -	if alpha == 0 {
        -		for i := 0; i < m; i++ {
        -			btmp := b[i*ldb : i*ldb+n]
        -			for j := range btmp {
        -				btmp[j] = 0
        -			}
        -		}
        -		return
        -	}
        -	nonUnit := d == blas.NonUnit
        -	if s == blas.Left {
        -		if tA == blas.NoTrans {
        -			if ul == blas.Upper {
        -				for i := m - 1; i >= 0; i-- {
        -					btmp := b[i*ldb : i*ldb+n]
        -					if alpha != 1 {
        -						for j := range btmp {
        -							btmp[j] *= alpha
        -						}
        -					}
        -					for ka, va := range a[i*lda+i+1 : i*lda+m] {
        -						k := ka + i + 1
        -						if va != 0 {
        -							f32.AxpyUnitaryTo(btmp, -va, b[k*ldb:k*ldb+n], btmp)
        -						}
        -					}
        -					if nonUnit {
        -						tmp := 1 / a[i*lda+i]
        -						for j := 0; j < n; j++ {
        -							btmp[j] *= tmp
        -						}
        -					}
        -				}
        -				return
        -			}
        -			for i := 0; i < m; i++ {
        -				btmp := b[i*ldb : i*ldb+n]
        -				if alpha != 1 {
        -					for j := 0; j < n; j++ {
        -						btmp[j] *= alpha
        -					}
        -				}
        -				for k, va := range a[i*lda : i*lda+i] {
        -					if va != 0 {
        -						f32.AxpyUnitaryTo(btmp, -va, b[k*ldb:k*ldb+n], btmp)
        -					}
        -				}
        -				if nonUnit {
        -					tmp := 1 / a[i*lda+i]
        -					for j := 0; j < n; j++ {
        -						btmp[j] *= tmp
        -					}
        -				}
        -			}
        -			return
        -		}
        -		// Cases where a is transposed
        -		if ul == blas.Upper {
        -			for k := 0; k < m; k++ {
        -				btmpk := b[k*ldb : k*ldb+n]
        -				if nonUnit {
        -					tmp := 1 / a[k*lda+k]
        -					for j := 0; j < n; j++ {
        -						btmpk[j] *= tmp
        -					}
        -				}
        -				for ia, va := range a[k*lda+k+1 : k*lda+m] {
        -					i := ia + k + 1
        -					if va != 0 {
        -						btmp := b[i*ldb : i*ldb+n]
        -						f32.AxpyUnitaryTo(btmp, -va, btmpk, btmp)
        -					}
        -				}
        -				if alpha != 1 {
        -					for j := 0; j < n; j++ {
        -						btmpk[j] *= alpha
        -					}
        -				}
        -			}
        -			return
        -		}
        -		for k := m - 1; k >= 0; k-- {
        -			btmpk := b[k*ldb : k*ldb+n]
        -			if nonUnit {
        -				tmp := 1 / a[k*lda+k]
        -				for j := 0; j < n; j++ {
        -					btmpk[j] *= tmp
        -				}
        -			}
        -			for i, va := range a[k*lda : k*lda+k] {
        -				if va != 0 {
        -					btmp := b[i*ldb : i*ldb+n]
        -					f32.AxpyUnitaryTo(btmp, -va, btmpk, btmp)
        -				}
        -			}
        -			if alpha != 1 {
        -				for j := 0; j < n; j++ {
        -					btmpk[j] *= alpha
        -				}
        -			}
        -		}
        -		return
        -	}
        -	// Cases where a is to the right of X.
        -	if tA == blas.NoTrans {
        -		if ul == blas.Upper {
        -			for i := 0; i < m; i++ {
        -				btmp := b[i*ldb : i*ldb+n]
        -				if alpha != 1 {
        -					for j := 0; j < n; j++ {
        -						btmp[j] *= alpha
        -					}
        -				}
        -				for k, vb := range btmp {
        -					if vb != 0 {
        -						if btmp[k] != 0 {
        -							if nonUnit {
        -								btmp[k] /= a[k*lda+k]
        -							}
        -							btmpk := btmp[k+1 : n]
        -							f32.AxpyUnitaryTo(btmpk, -btmp[k], a[k*lda+k+1:k*lda+n], btmpk)
        -						}
        -					}
        -				}
        -			}
        -			return
        -		}
        -		for i := 0; i < m; i++ {
        -			btmp := b[i*lda : i*lda+n]
        -			if alpha != 1 {
        -				for j := 0; j < n; j++ {
        -					btmp[j] *= alpha
        -				}
        -			}
        -			for k := n - 1; k >= 0; k-- {
        -				if btmp[k] != 0 {
        -					if nonUnit {
        -						btmp[k] /= a[k*lda+k]
        -					}
        -					f32.AxpyUnitaryTo(btmp, -btmp[k], a[k*lda:k*lda+k], btmp)
        -				}
        -			}
        -		}
        -		return
        -	}
        -	// Cases where a is transposed.
        -	if ul == blas.Upper {
        -		for i := 0; i < m; i++ {
        -			btmp := b[i*lda : i*lda+n]
        -			for j := n - 1; j >= 0; j-- {
        -				tmp := alpha*btmp[j] - f32.DotUnitary(a[j*lda+j+1:j*lda+n], btmp[j+1:])
        -				if nonUnit {
        -					tmp /= a[j*lda+j]
        -				}
        -				btmp[j] = tmp
        -			}
        -		}
        -		return
        -	}
        -	for i := 0; i < m; i++ {
        -		btmp := b[i*lda : i*lda+n]
        -		for j := 0; j < n; j++ {
        -			tmp := alpha*btmp[j] - f32.DotUnitary(a[j*lda:j*lda+j], btmp)
        -			if nonUnit {
        -				tmp /= a[j*lda+j]
        -			}
        -			btmp[j] = tmp
        -		}
        -	}
        -}
        -
        -// Ssymm performs one of the matrix-matrix operations
        -//  C = alpha * A * B + beta * C  if side == blas.Left
        -//  C = alpha * B * A + beta * C  if side == blas.Right
        -// where A is an n×n or m×m symmetric matrix, B and C are m×n matrices, and alpha
        -// is a scalar.
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Ssymm(s blas.Side, ul blas.Uplo, m, n int, alpha float32, a []float32, lda int, b []float32, ldb int, beta float32, c []float32, ldc int) {
        -	if s != blas.Right && s != blas.Left {
        -		panic("goblas: bad side")
        -	}
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if m < 0 {
        -		panic(mLT0)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	var k int
        -	if s == blas.Left {
        -		k = m
        -	} else {
        -		k = n
        -	}
        -	if lda*(k-1)+k > len(a) || lda < max(1, k) {
        -		panic(badLdA)
        -	}
        -	if ldb*(m-1)+n > len(b) || ldb < max(1, n) {
        -		panic(badLdB)
        -	}
        -	if ldc*(m-1)+n > len(c) || ldc < max(1, n) {
        -		panic(badLdC)
        -	}
        -	if m == 0 || n == 0 {
        -		return
        -	}
        -	if alpha == 0 && beta == 1 {
        -		return
        -	}
        -	if alpha == 0 {
        -		if beta == 0 {
        -			for i := 0; i < m; i++ {
        -				ctmp := c[i*ldc : i*ldc+n]
        -				for j := range ctmp {
        -					ctmp[j] = 0
        -				}
        -			}
        -			return
        -		}
        -		for i := 0; i < m; i++ {
        -			ctmp := c[i*ldc : i*ldc+n]
        -			for j := 0; j < n; j++ {
        -				ctmp[j] *= beta
        -			}
        -		}
        -		return
        -	}
        -
        -	isUpper := ul == blas.Upper
        -	if s == blas.Left {
        -		for i := 0; i < m; i++ {
        -			atmp := alpha * a[i*lda+i]
        -			btmp := b[i*ldb : i*ldb+n]
        -			ctmp := c[i*ldc : i*ldc+n]
        -			for j, v := range btmp {
        -				ctmp[j] *= beta
        -				ctmp[j] += atmp * v
        -			}
        -
        -			for k := 0; k < i; k++ {
        -				var atmp float32
        -				if isUpper {
        -					atmp = a[k*lda+i]
        -				} else {
        -					atmp = a[i*lda+k]
        -				}
        -				atmp *= alpha
        -				ctmp := c[i*ldc : i*ldc+n]
        -				f32.AxpyUnitaryTo(ctmp, atmp, b[k*ldb:k*ldb+n], ctmp)
        -			}
        -			for k := i + 1; k < m; k++ {
        -				var atmp float32
        -				if isUpper {
        -					atmp = a[i*lda+k]
        -				} else {
        -					atmp = a[k*lda+i]
        -				}
        -				atmp *= alpha
        -				ctmp := c[i*ldc : i*ldc+n]
        -				f32.AxpyUnitaryTo(ctmp, atmp, b[k*ldb:k*ldb+n], ctmp)
        -			}
        -		}
        -		return
        -	}
        -	if isUpper {
        -		for i := 0; i < m; i++ {
        -			for j := n - 1; j >= 0; j-- {
        -				tmp := alpha * b[i*ldb+j]
        -				var tmp2 float32
        -				atmp := a[j*lda+j+1 : j*lda+n]
        -				btmp := b[i*ldb+j+1 : i*ldb+n]
        -				ctmp := c[i*ldc+j+1 : i*ldc+n]
        -				for k, v := range atmp {
        -					ctmp[k] += tmp * v
        -					tmp2 += btmp[k] * v
        -				}
        -				c[i*ldc+j] *= beta
        -				c[i*ldc+j] += tmp*a[j*lda+j] + alpha*tmp2
        -			}
        -		}
        -		return
        -	}
        -	for i := 0; i < m; i++ {
        -		for j := 0; j < n; j++ {
        -			tmp := alpha * b[i*ldb+j]
        -			var tmp2 float32
        -			atmp := a[j*lda : j*lda+j]
        -			btmp := b[i*ldb : i*ldb+j]
        -			ctmp := c[i*ldc : i*ldc+j]
        -			for k, v := range atmp {
        -				ctmp[k] += tmp * v
        -				tmp2 += btmp[k] * v
        -			}
        -			c[i*ldc+j] *= beta
        -			c[i*ldc+j] += tmp*a[j*lda+j] + alpha*tmp2
        -		}
        -	}
        -}
        -
        -// Ssyrk performs one of the symmetric rank-k operations
        -//  C = alpha * A * A^T + beta * C  if tA == blas.NoTrans
        -//  C = alpha * A^T * A + beta * C  if tA == blas.Trans or tA == blas.ConjTrans
        -// where A is an n×k or k×n matrix, C is an n×n symmetric matrix, and alpha and
        -// beta are scalars.
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Ssyrk(ul blas.Uplo, tA blas.Transpose, n, k int, alpha float32, a []float32, lda int, beta float32, c []float32, ldc int) {
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if tA != blas.Trans && tA != blas.NoTrans && tA != blas.ConjTrans {
        -		panic(badTranspose)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if k < 0 {
        -		panic(kLT0)
        -	}
        -	if ldc < n {
        -		panic(badLdC)
        -	}
        -	var row, col int
        -	if tA == blas.NoTrans {
        -		row, col = n, k
        -	} else {
        -		row, col = k, n
        -	}
        -	if lda*(row-1)+col > len(a) || lda < max(1, col) {
        -		panic(badLdA)
        -	}
        -	if ldc*(n-1)+n > len(c) || ldc < max(1, n) {
        -		panic(badLdC)
        -	}
        -	if alpha == 0 {
        -		if beta == 0 {
        -			if ul == blas.Upper {
        -				for i := 0; i < n; i++ {
        -					ctmp := c[i*ldc+i : i*ldc+n]
        -					for j := range ctmp {
        -						ctmp[j] = 0
        -					}
        -				}
        -				return
        -			}
        -			for i := 0; i < n; i++ {
        -				ctmp := c[i*ldc : i*ldc+i+1]
        -				for j := range ctmp {
        -					ctmp[j] = 0
        -				}
        -			}
        -			return
        -		}
        -		if ul == blas.Upper {
        -			for i := 0; i < n; i++ {
        -				ctmp := c[i*ldc+i : i*ldc+n]
        -				for j := range ctmp {
        -					ctmp[j] *= beta
        -				}
        -			}
        -			return
        -		}
        -		for i := 0; i < n; i++ {
        -			ctmp := c[i*ldc : i*ldc+i+1]
        -			for j := range ctmp {
        -				ctmp[j] *= beta
        -			}
        -		}
        -		return
        -	}
        -	if tA == blas.NoTrans {
        -		if ul == blas.Upper {
        -			for i := 0; i < n; i++ {
        -				ctmp := c[i*ldc+i : i*ldc+n]
        -				atmp := a[i*lda : i*lda+k]
        -				for jc, vc := range ctmp {
        -					j := jc + i
        -					ctmp[jc] = vc*beta + alpha*f32.DotUnitary(atmp, a[j*lda:j*lda+k])
        -				}
        -			}
        -			return
        -		}
        -		for i := 0; i < n; i++ {
        -			atmp := a[i*lda : i*lda+k]
        -			for j, vc := range c[i*ldc : i*ldc+i+1] {
        -				c[i*ldc+j] = vc*beta + alpha*f32.DotUnitary(a[j*lda:j*lda+k], atmp)
        -			}
        -		}
        -		return
        -	}
        -	// Cases where a is transposed.
        -	if ul == blas.Upper {
        -		for i := 0; i < n; i++ {
        -			ctmp := c[i*ldc+i : i*ldc+n]
        -			if beta != 1 {
        -				for j := range ctmp {
        -					ctmp[j] *= beta
        -				}
        -			}
        -			for l := 0; l < k; l++ {
        -				tmp := alpha * a[l*lda+i]
        -				if tmp != 0 {
        -					f32.AxpyUnitaryTo(ctmp, tmp, a[l*lda+i:l*lda+n], ctmp)
        -				}
        -			}
        -		}
        -		return
        -	}
        -	for i := 0; i < n; i++ {
        -		ctmp := c[i*ldc : i*ldc+i+1]
        -		if beta != 0 {
        -			for j := range ctmp {
        -				ctmp[j] *= beta
        -			}
        -		}
        -		for l := 0; l < k; l++ {
        -			tmp := alpha * a[l*lda+i]
        -			if tmp != 0 {
        -				f32.AxpyUnitaryTo(ctmp, tmp, a[l*lda:l*lda+i+1], ctmp)
        -			}
        -		}
        -	}
        -}
        -
        -// Ssyr2k performs one of the symmetric rank 2k operations
        -//  C = alpha * A * B^T + alpha * B * A^T + beta * C  if tA == blas.NoTrans
        -//  C = alpha * A^T * B + alpha * B^T * A + beta * C  if tA == blas.Trans or tA == blas.ConjTrans
        -// where A and B are n×k or k×n matrices, C is an n×n symmetric matrix, and
        -// alpha and beta are scalars.
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Ssyr2k(ul blas.Uplo, tA blas.Transpose, n, k int, alpha float32, a []float32, lda int, b []float32, ldb int, beta float32, c []float32, ldc int) {
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if tA != blas.Trans && tA != blas.NoTrans && tA != blas.ConjTrans {
        -		panic(badTranspose)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	if k < 0 {
        -		panic(kLT0)
        -	}
        -	if ldc < n {
        -		panic(badLdC)
        -	}
        -	var row, col int
        -	if tA == blas.NoTrans {
        -		row, col = n, k
        -	} else {
        -		row, col = k, n
        -	}
        -	if lda*(row-1)+col > len(a) || lda < max(1, col) {
        -		panic(badLdA)
        -	}
        -	if ldb*(row-1)+col > len(b) || ldb < max(1, col) {
        -		panic(badLdB)
        -	}
        -	if ldc*(n-1)+n > len(c) || ldc < max(1, n) {
        -		panic(badLdC)
        -	}
        -	if alpha == 0 {
        -		if beta == 0 {
        -			if ul == blas.Upper {
        -				for i := 0; i < n; i++ {
        -					ctmp := c[i*ldc+i : i*ldc+n]
        -					for j := range ctmp {
        -						ctmp[j] = 0
        -					}
        -				}
        -				return
        -			}
        -			for i := 0; i < n; i++ {
        -				ctmp := c[i*ldc : i*ldc+i+1]
        -				for j := range ctmp {
        -					ctmp[j] = 0
        -				}
        -			}
        -			return
        -		}
        -		if ul == blas.Upper {
        -			for i := 0; i < n; i++ {
        -				ctmp := c[i*ldc+i : i*ldc+n]
        -				for j := range ctmp {
        -					ctmp[j] *= beta
        -				}
        -			}
        -			return
        -		}
        -		for i := 0; i < n; i++ {
        -			ctmp := c[i*ldc : i*ldc+i+1]
        -			for j := range ctmp {
        -				ctmp[j] *= beta
        -			}
        -		}
        -		return
        -	}
        -	if tA == blas.NoTrans {
        -		if ul == blas.Upper {
        -			for i := 0; i < n; i++ {
        -				atmp := a[i*lda : i*lda+k]
        -				btmp := b[i*ldb : i*ldb+k]
        -				ctmp := c[i*ldc+i : i*ldc+n]
        -				for jc := range ctmp {
        -					j := i + jc
        -					var tmp1, tmp2 float32
        -					binner := b[j*ldb : j*ldb+k]
        -					for l, v := range a[j*lda : j*lda+k] {
        -						tmp1 += v * btmp[l]
        -						tmp2 += atmp[l] * binner[l]
        -					}
        -					ctmp[jc] *= beta
        -					ctmp[jc] += alpha * (tmp1 + tmp2)
        -				}
        -			}
        -			return
        -		}
        -		for i := 0; i < n; i++ {
        -			atmp := a[i*lda : i*lda+k]
        -			btmp := b[i*ldb : i*ldb+k]
        -			ctmp := c[i*ldc : i*ldc+i+1]
        -			for j := 0; j <= i; j++ {
        -				var tmp1, tmp2 float32
        -				binner := b[j*ldb : j*ldb+k]
        -				for l, v := range a[j*lda : j*lda+k] {
        -					tmp1 += v * btmp[l]
        -					tmp2 += atmp[l] * binner[l]
        -				}
        -				ctmp[j] *= beta
        -				ctmp[j] += alpha * (tmp1 + tmp2)
        -			}
        -		}
        -		return
        -	}
        -	if ul == blas.Upper {
        -		for i := 0; i < n; i++ {
        -			ctmp := c[i*ldc+i : i*ldc+n]
        -			if beta != 1 {
        -				for j := range ctmp {
        -					ctmp[j] *= beta
        -				}
        -			}
        -			for l := 0; l < k; l++ {
        -				tmp1 := alpha * b[l*lda+i]
        -				tmp2 := alpha * a[l*lda+i]
        -				btmp := b[l*ldb+i : l*ldb+n]
        -				if tmp1 != 0 || tmp2 != 0 {
        -					for j, v := range a[l*lda+i : l*lda+n] {
        -						ctmp[j] += v*tmp1 + btmp[j]*tmp2
        -					}
        -				}
        -			}
        -		}
        -		return
        -	}
        -	for i := 0; i < n; i++ {
        -		ctmp := c[i*ldc : i*ldc+i+1]
        -		if beta != 1 {
        -			for j := range ctmp {
        -				ctmp[j] *= beta
        -			}
        -		}
        -		for l := 0; l < k; l++ {
        -			tmp1 := alpha * b[l*lda+i]
        -			tmp2 := alpha * a[l*lda+i]
        -			btmp := b[l*ldb : l*ldb+i+1]
        -			if tmp1 != 0 || tmp2 != 0 {
        -				for j, v := range a[l*lda : l*lda+i+1] {
        -					ctmp[j] += v*tmp1 + btmp[j]*tmp2
        -				}
        -			}
        -		}
        -	}
        -}
        -
        -// Strmm performs one of the matrix-matrix operations
        -//  B = alpha * A * B    if tA == blas.NoTrans and side == blas.Left
        -//  B = alpha * A^T * B  if tA == blas.Trans or blas.ConjTrans, and side == blas.Left
        -//  B = alpha * B * A    if tA == blas.NoTrans and side == blas.Right
        -//  B = alpha * B * A^T  if tA == blas.Trans or blas.ConjTrans, and side == blas.Right
        -// where A is an n×n or m×m triangular matrix, B is an m×n matrix, and alpha is a scalar.
        -//
        -// Float32 implementations are autogenerated and not directly tested.
        -func (Implementation) Strmm(s blas.Side, ul blas.Uplo, tA blas.Transpose, d blas.Diag, m, n int, alpha float32, a []float32, lda int, b []float32, ldb int) {
        -	if s != blas.Left && s != blas.Right {
        -		panic(badSide)
        -	}
        -	if ul != blas.Lower && ul != blas.Upper {
        -		panic(badUplo)
        -	}
        -	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        -		panic(badTranspose)
        -	}
        -	if d != blas.NonUnit && d != blas.Unit {
        -		panic(badDiag)
        -	}
        -	if m < 0 {
        -		panic(mLT0)
        -	}
        -	if n < 0 {
        -		panic(nLT0)
        -	}
        -	var k int
        -	if s == blas.Left {
        -		k = m
        -	} else {
        -		k = n
        -	}
        -	if lda*(k-1)+k > len(a) || lda < max(1, k) {
        -		panic(badLdA)
        -	}
        -	if ldb*(m-1)+n > len(b) || ldb < max(1, n) {
        -		panic(badLdB)
        -	}
        -	if alpha == 0 {
        -		for i := 0; i < m; i++ {
        -			btmp := b[i*ldb : i*ldb+n]
        -			for j := range btmp {
        -				btmp[j] = 0
        -			}
        -		}
        -		return
        -	}
        -
        -	nonUnit := d == blas.NonUnit
        -	if s == blas.Left {
        -		if tA == blas.NoTrans {
        -			if ul == blas.Upper {
        -				for i := 0; i < m; i++ {
        -					tmp := alpha
        -					if nonUnit {
        -						tmp *= a[i*lda+i]
        -					}
        -					btmp := b[i*ldb : i*ldb+n]
        -					for j := range btmp {
        -						btmp[j] *= tmp
        -					}
        -					for ka, va := range a[i*lda+i+1 : i*lda+m] {
        -						k := ka + i + 1
        -						tmp := alpha * va
        -						if tmp != 0 {
        -							f32.AxpyUnitaryTo(btmp, tmp, b[k*ldb:k*ldb+n], btmp)
        -						}
        -					}
        -				}
        -				return
        -			}
        -			for i := m - 1; i >= 0; i-- {
        -				tmp := alpha
        -				if nonUnit {
        -					tmp *= a[i*lda+i]
        -				}
        -				btmp := b[i*ldb : i*ldb+n]
        -				for j := range btmp {
        -					btmp[j] *= tmp
        -				}
        -				for k, va := range a[i*lda : i*lda+i] {
        -					tmp := alpha * va
        -					if tmp != 0 {
        -						f32.AxpyUnitaryTo(btmp, tmp, b[k*ldb:k*ldb+n], btmp)
        -					}
        -				}
        -			}
        -			return
        -		}
        -		// Cases where a is transposed.
        -		if ul == blas.Upper {
        -			for k := m - 1; k >= 0; k-- {
        -				btmpk := b[k*ldb : k*ldb+n]
        -				for ia, va := range a[k*lda+k+1 : k*lda+m] {
        -					i := ia + k + 1
        -					btmp := b[i*ldb : i*ldb+n]
        -					tmp := alpha * va
        -					if tmp != 0 {
        -						f32.AxpyUnitaryTo(btmp, tmp, btmpk, btmp)
        -					}
        -				}
        -				tmp := alpha
        -				if nonUnit {
        -					tmp *= a[k*lda+k]
        -				}
        -				if tmp != 1 {
        -					for j := 0; j < n; j++ {
        -						btmpk[j] *= tmp
        -					}
        -				}
        -			}
        -			return
        -		}
        -		for k := 0; k < m; k++ {
        -			btmpk := b[k*ldb : k*ldb+n]
        -			for i, va := range a[k*lda : k*lda+k] {
        -				btmp := b[i*ldb : i*ldb+n]
        -				tmp := alpha * va
        -				if tmp != 0 {
        -					f32.AxpyUnitaryTo(btmp, tmp, btmpk, btmp)
        -				}
        -			}
        -			tmp := alpha
        -			if nonUnit {
        -				tmp *= a[k*lda+k]
        -			}
        -			if tmp != 1 {
        -				for j := 0; j < n; j++ {
        -					btmpk[j] *= tmp
        -				}
        -			}
        -		}
        -		return
        -	}
        -	// Cases where a is on the right
        -	if tA == blas.NoTrans {
        -		if ul == blas.Upper {
        -			for i := 0; i < m; i++ {
        -				btmp := b[i*ldb : i*ldb+n]
        -				for k := n - 1; k >= 0; k-- {
        -					tmp := alpha * btmp[k]
        -					if tmp != 0 {
        -						btmp[k] = tmp
        -						if nonUnit {
        -							btmp[k] *= a[k*lda+k]
        -						}
        -						for ja, v := range a[k*lda+k+1 : k*lda+n] {
        -							j := ja + k + 1
        -							btmp[j] += tmp * v
        -						}
        -					}
        -				}
        -			}
        -			return
        -		}
        -		for i := 0; i < m; i++ {
        -			btmp := b[i*ldb : i*ldb+n]
        -			for k := 0; k < n; k++ {
        -				tmp := alpha * btmp[k]
        -				if tmp != 0 {
        -					btmp[k] = tmp
        -					if nonUnit {
        -						btmp[k] *= a[k*lda+k]
        -					}
        -					f32.AxpyUnitaryTo(btmp, tmp, a[k*lda:k*lda+k], btmp)
        -				}
        -			}
        -		}
        -		return
        -	}
        -	// Cases where a is transposed.
        -	if ul == blas.Upper {
        -		for i := 0; i < m; i++ {
        -			btmp := b[i*ldb : i*ldb+n]
        -			for j, vb := range btmp {
        -				tmp := vb
        -				if nonUnit {
        -					tmp *= a[j*lda+j]
        -				}
        -				tmp += f32.DotUnitary(a[j*lda+j+1:j*lda+n], btmp[j+1:n])
        -				btmp[j] = alpha * tmp
        -			}
        -		}
        -		return
        -	}
        -	for i := 0; i < m; i++ {
        -		btmp := b[i*ldb : i*ldb+n]
        -		for j := n - 1; j >= 0; j-- {
        -			tmp := btmp[j]
        -			if nonUnit {
        -				tmp *= a[j*lda+j]
        -			}
        -			tmp += f32.DotUnitary(a[j*lda:j*lda+j], btmp[:j])
        -			btmp[j] = alpha * tmp
        -		}
        -	}
        -}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/sgemm.go b/vendor/gonum.org/v1/gonum/blas/gonum/sgemm.go
        index 24a8b7ed9..079b94ce4 100644
        --- a/vendor/gonum.org/v1/gonum/blas/gonum/sgemm.go
        +++ b/vendor/gonum.org/v1/gonum/blas/gonum/sgemm.go
        @@ -16,34 +16,90 @@ import (
         
         // Sgemm performs one of the matrix-matrix operations
         //  C = alpha * A * B + beta * C
        -//  C = alpha * A^T * B + beta * C
        -//  C = alpha * A * B^T + beta * C
        -//  C = alpha * A^T * B^T + beta * C
        +//  C = alpha * Aᵀ * B + beta * C
        +//  C = alpha * A * Bᵀ + beta * C
        +//  C = alpha * Aᵀ * Bᵀ + beta * C
         // where A is an m×k or k×m dense matrix, B is an n×k or k×n dense matrix, C is
         // an m×n matrix, and alpha and beta are scalars. tA and tB specify whether A or
         // B are transposed.
         //
         // Float32 implementations are autogenerated and not directly tested.
         func (Implementation) Sgemm(tA, tB blas.Transpose, m, n, k int, alpha float32, a []float32, lda int, b []float32, ldb int, beta float32, c []float32, ldc int) {
        -	if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
        +	switch tA {
        +	default:
         		panic(badTranspose)
        +	case blas.NoTrans, blas.Trans, blas.ConjTrans:
         	}
        -	if tB != blas.NoTrans && tB != blas.Trans && tB != blas.ConjTrans {
        +	switch tB {
        +	default:
         		panic(badTranspose)
        +	case blas.NoTrans, blas.Trans, blas.ConjTrans:
        +	}
        +	if m < 0 {
        +		panic(mLT0)
        +	}
        +	if n < 0 {
        +		panic(nLT0)
        +	}
        +	if k < 0 {
        +		panic(kLT0)
         	}
         	aTrans := tA == blas.Trans || tA == blas.ConjTrans
         	if aTrans {
        -		checkSMatrix('a', k, m, a, lda)
        +		if lda < max(1, m) {
        +			panic(badLdA)
        +		}
         	} else {
        -		checkSMatrix('a', m, k, a, lda)
        +		if lda < max(1, k) {
        +			panic(badLdA)
        +		}
         	}
         	bTrans := tB == blas.Trans || tB == blas.ConjTrans
         	if bTrans {
        -		checkSMatrix('b', n, k, b, ldb)
        +		if ldb < max(1, k) {
        +			panic(badLdB)
        +		}
        +	} else {
        +		if ldb < max(1, n) {
        +			panic(badLdB)
        +		}
        +	}
        +	if ldc < max(1, n) {
        +		panic(badLdC)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	// For zero matrix size the following slice length checks are trivially satisfied.
        +	if aTrans {
        +		if len(a) < (k-1)*lda+m {
        +			panic(shortA)
        +		}
        +	} else {
        +		if len(a) < (m-1)*lda+k {
        +			panic(shortA)
        +		}
        +	}
        +	if bTrans {
        +		if len(b) < (n-1)*ldb+k {
        +			panic(shortB)
        +		}
         	} else {
        -		checkSMatrix('b', k, n, b, ldb)
        +		if len(b) < (k-1)*ldb+n {
        +			panic(shortB)
        +		}
        +	}
        +	if len(c) < (m-1)*ldc+n {
        +		panic(shortC)
        +	}
        +
        +	// Quick return if possible.
        +	if (alpha == 0 || k == 0) && beta == 1 {
        +		return
         	}
        -	checkSMatrix('c', m, n, c, ldc)
         
         	// scale c
         	if beta != 1 {
        @@ -82,9 +138,9 @@ func sgemmParallel(aTrans, bTrans bool, m, n, k int, a []float32, lda int, b []f
         	// In all cases, there is one dimension for each matrix along which
         	// C must be updated sequentially.
         	// Cij = \sum_k Aik Bki,	(A * B)
        -	// Cij = \sum_k Aki Bkj,	(A^T * B)
        -	// Cij = \sum_k Aik Bjk,	(A * B^T)
        -	// Cij = \sum_k Aki Bjk,	(A^T * B^T)
        +	// Cij = \sum_k Aki Bkj,	(Aᵀ * B)
        +	// Cij = \sum_k Aik Bjk,	(A * Bᵀ)
        +	// Cij = \sum_k Aki Bjk,	(Aᵀ * Bᵀ)
         	//
         	// This code computes one {i, j} block sequentially along the k dimension,
         	// and computes all of the {i, j} blocks concurrently. This
        @@ -128,13 +184,6 @@ func sgemmParallel(aTrans, bTrans bool, m, n, k int, a []float32, lda int, b []f
         		wg.Add(1)
         		go func() {
         			defer wg.Done()
        -			// Make local copies of otherwise global variables to reduce shared memory.
        -			// This has a noticeable effect on benchmarks in some cases.
        -			alpha := alpha
        -			aTrans := aTrans
        -			bTrans := bTrans
        -			m := m
        -			n := n
         			for sub := range sendChan {
         				i := sub.i
         				j := sub.j
        @@ -214,7 +263,7 @@ func sgemmSerialNotNot(m, n, k int, a []float32, lda int, b []float32, ldb int,
         		for l, v := range a[i*lda : i*lda+k] {
         			tmp := alpha * v
         			if tmp != 0 {
        -				f32.AxpyUnitaryTo(ctmp, tmp, b[l*ldb:l*ldb+n], ctmp)
        +				f32.AxpyUnitary(tmp, b[l*ldb:l*ldb+n], ctmp)
         			}
         		}
         	}
        @@ -230,7 +279,7 @@ func sgemmSerialTransNot(m, n, k int, a []float32, lda int, b []float32, ldb int
         			tmp := alpha * v
         			if tmp != 0 {
         				ctmp := c[i*ldc : i*ldc+n]
        -				f32.AxpyUnitaryTo(ctmp, tmp, btmp, ctmp)
        +				f32.AxpyUnitary(tmp, btmp, ctmp)
         			}
         		}
         	}
        diff --git a/vendor/gonum.org/v1/gonum/blas/gonum/single_precision.bash b/vendor/gonum.org/v1/gonum/blas/gonum/single_precision.bash
        old mode 100755
        new mode 100644
        index 00d1b8822..234100725
        --- a/vendor/gonum.org/v1/gonum/blas/gonum/single_precision.bash
        +++ b/vendor/gonum.org/v1/gonum/blas/gonum/single_precision.bash
        @@ -4,126 +4,182 @@
         # Use of this source code is governed by a BSD-style
         # license that can be found in the LICENSE file.
         
        -WARNING='//\
        +WARNINGF32='//\
         // Float32 implementations are autogenerated and not directly tested.\
         '
        +WARNINGC64='//\
        +// Complex64 implementations are autogenerated and not directly tested.\
        +'
         
         # Level1 routines.
         
        -echo Generating level1single.go
        -echo -e '// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.\n' > level1single.go
        -cat level1double.go \
        +echo Generating level1float32.go
        +echo -e '// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.\n' > level1float32.go
        +cat level1float64.go \
         | gofmt -r 'blas.Float64Level1 -> blas.Float32Level1' \
         \
         | gofmt -r 'float64 -> float32' \
         | gofmt -r 'blas.DrotmParams -> blas.SrotmParams' \
         \
         | gofmt -r 'f64.AxpyInc -> f32.AxpyInc' \
        -| gofmt -r 'f64.AxpyIncTo -> f32.AxpyIncTo' \
         | gofmt -r 'f64.AxpyUnitary -> f32.AxpyUnitary' \
        -| gofmt -r 'f64.AxpyUnitaryTo -> f32.AxpyUnitaryTo' \
         | gofmt -r 'f64.DotUnitary -> f32.DotUnitary' \
        +| gofmt -r 'f64.L2NormInc -> f32.L2NormInc' \
        +| gofmt -r 'f64.L2NormUnitary -> f32.L2NormUnitary' \
         | gofmt -r 'f64.ScalInc -> f32.ScalInc' \
         | gofmt -r 'f64.ScalUnitary -> f32.ScalUnitary' \
         \
        -| sed -e "s_^\(func (Implementation) \)D\(.*\)\$_$WARNING\1S\2_" \
        +| sed -e "s_^\(func (Implementation) \)D\(.*\)\$_$WARNINGF32\1S\2_" \
               -e 's_^// D_// S_' \
        -      -e "s_^\(func (Implementation) \)Id\(.*\)\$_$WARNING\1Is\2_" \
        +      -e "s_^\(func (Implementation) \)Id\(.*\)\$_$WARNINGF32\1Is\2_" \
               -e 's_^// Id_// Is_' \
               -e 's_"gonum.org/v1/gonum/internal/asm/f64"_"gonum.org/v1/gonum/internal/asm/f32"_' \
               -e 's_"math"_math "gonum.org/v1/gonum/internal/math32"_' \
        ->> level1single.go
        +>> level1float32.go
         
        -echo Generating level1single_sdot.go
        -echo -e '// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.\n' > level1single_sdot.go
        -cat level1double_ddot.go \
        +echo Generating level1cmplx64.go
        +echo -e '// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.\n' > level1cmplx64.go
        +cat level1cmplx128.go \
        +| gofmt -r 'blas.Complex128Level1 -> blas.Complex64Level1' \
        +\
        +| gofmt -r 'float64 -> float32' \
        +| gofmt -r 'complex128 -> complex64' \
        +\
        +| gofmt -r 'c128.AxpyInc -> c64.AxpyInc' \
        +| gofmt -r 'c128.AxpyUnitary -> c64.AxpyUnitary' \
        +| gofmt -r 'c128.DotcInc -> c64.DotcInc' \
        +| gofmt -r 'c128.DotcUnitary -> c64.DotcUnitary' \
        +| gofmt -r 'c128.DotuInc -> c64.DotuInc' \
        +| gofmt -r 'c128.DotuUnitary -> c64.DotuUnitary' \
        +| gofmt -r 'c128.ScalInc -> c64.ScalInc' \
        +| gofmt -r 'c128.ScalUnitary -> c64.ScalUnitary' \
        +| gofmt -r 'dcabs1 -> scabs1' \
        +\
        +| sed -e "s_^\(func (Implementation) \)Zdot\(.*\)\$_$WARNINGC64\1Cdot\2_" \
        +      -e 's_^// Zdot_// Cdot_' \
        +      -e "s_^\(func (Implementation) \)Zdscal\(.*\)\$_$WARNINGC64\1Csscal\2_" \
        +      -e 's_^// Zdscal_// Csscal_' \
        +      -e "s_^\(func (Implementation) \)Z\(.*\)\$_$WARNINGC64\1C\2_" \
        +      -e 's_^// Z_// C_' \
        +      -e "s_^\(func (Implementation) \)Iz\(.*\)\$_$WARNINGC64\1Ic\2_" \
        +      -e 's_^// Iz_// Ic_' \
        +      -e "s_^\(func (Implementation) \)Dz\(.*\)\$_$WARNINGC64\1Sc\2_" \
        +      -e 's_^// Dz_// Sc_' \
        +      -e 's_"gonum.org/v1/gonum/internal/asm/c128"_"gonum.org/v1/gonum/internal/asm/c64"_' \
        +      -e 's_"math"_math "gonum.org/v1/gonum/internal/math32"_' \
        +>> level1cmplx64.go
        +
        +echo Generating level1float32_sdot.go
        +echo -e '// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.\n' > level1float32_sdot.go
        +cat level1float64_ddot.go \
         | gofmt -r 'float64 -> float32' \
         \
         | gofmt -r 'f64.DotInc -> f32.DotInc' \
         | gofmt -r 'f64.DotUnitary -> f32.DotUnitary' \
         \
        -| sed -e "s_^\(func (Implementation) \)D\(.*\)\$_$WARNING\1S\2_" \
        +| sed -e "s_^\(func (Implementation) \)D\(.*\)\$_$WARNINGF32\1S\2_" \
               -e 's_^// D_// S_' \
               -e 's_"gonum.org/v1/gonum/internal/asm/f64"_"gonum.org/v1/gonum/internal/asm/f32"_' \
        ->> level1single_sdot.go
        +>> level1float32_sdot.go
         
        -echo Generating level1single_dsdot.go
        -echo -e '// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.\n' > level1single_dsdot.go
        -cat level1double_ddot.go \
        +echo Generating level1float32_dsdot.go
        +echo -e '// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.\n' > level1float32_dsdot.go
        +cat level1float64_ddot.go \
         | gofmt -r '[]float64 -> []float32' \
         \
         | gofmt -r 'f64.DotInc -> f32.DdotInc' \
         | gofmt -r 'f64.DotUnitary -> f32.DdotUnitary' \
         \
        -| sed -e "s_^\(func (Implementation) \)D\(.*\)\$_$WARNING\1Ds\2_" \
        +| sed -e "s_^\(func (Implementation) \)D\(.*\)\$_$WARNINGF32\1Ds\2_" \
               -e 's_^// D_// Ds_' \
               -e 's_"gonum.org/v1/gonum/internal/asm/f64"_"gonum.org/v1/gonum/internal/asm/f32"_' \
        ->> level1single_dsdot.go
        +>> level1float32_dsdot.go
         
        -echo Generating level1single_sdsdot.go
        -echo -e '// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.\n' > level1single_sdsdot.go
        -cat level1double_ddot.go \
        +echo Generating level1float32_sdsdot.go
        +echo -e '// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.\n' > level1float32_sdsdot.go
        +cat level1float64_ddot.go \
         | gofmt -r 'float64 -> float32' \
         \
         | gofmt -r 'f64.DotInc(x, y, f(n), f(incX), f(incY), f(ix), f(iy)) -> alpha + float32(f32.DdotInc(x, y, f(n), f(incX), f(incY), f(ix), f(iy)))' \
         | gofmt -r 'f64.DotUnitary(a, b) -> alpha + float32(f32.DdotUnitary(a, b))' \
         \
        -| sed -e "s_^\(func (Implementation) \)D\(.*\)\$_$WARNING\1Sds\2_" \
        +| sed -e "s_^\(func (Implementation) \)D\(.*\)\$_$WARNINGF32\1Sds\2_" \
               -e 's_^// D\(.*\)$_// Sds\1 plus a constant_' \
               -e 's_\\sum_alpha + \\sum_' \
               -e 's/n int/n int, alpha float32/' \
               -e 's_"gonum.org/v1/gonum/internal/asm/f64"_"gonum.org/v1/gonum/internal/asm/f32"_' \
        ->> level1single_sdsdot.go
        +>> level1float32_sdsdot.go
         
         
         # Level2 routines.
         
        -echo Generating level2single.go
        -echo -e '// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.\n' > level2single.go
        -cat level2double.go \
        +echo Generating level2float32.go
        +echo -e '// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.\n' > level2float32.go
        +cat level2float64.go \
         | gofmt -r 'blas.Float64Level2 -> blas.Float32Level2' \
         \
         | gofmt -r 'float64 -> float32' \
         \
        -| gofmt -r 'Dscal -> Sscal' \
        -\
         | gofmt -r 'f64.AxpyInc -> f32.AxpyInc' \
         | gofmt -r 'f64.AxpyIncTo -> f32.AxpyIncTo' \
         | gofmt -r 'f64.AxpyUnitary -> f32.AxpyUnitary' \
         | gofmt -r 'f64.AxpyUnitaryTo -> f32.AxpyUnitaryTo' \
         | gofmt -r 'f64.DotInc -> f32.DotInc' \
         | gofmt -r 'f64.DotUnitary -> f32.DotUnitary' \
        +| gofmt -r 'f64.ScalInc -> f32.ScalInc' \
        +| gofmt -r 'f64.ScalUnitary -> f32.ScalUnitary' \
         | gofmt -r 'f64.Ger -> f32.Ger' \
         \
        -| sed -e "s_^\(func (Implementation) \)D\(.*\)\$_$WARNING\1S\2_" \
        +| sed -e "s_^\(func (Implementation) \)D\(.*\)\$_$WARNINGF32\1S\2_" \
               -e 's_^// D_// S_' \
               -e 's_"gonum.org/v1/gonum/internal/asm/f64"_"gonum.org/v1/gonum/internal/asm/f32"_' \
        ->> level2single.go
        +>> level2float32.go
         
        +echo Generating level2cmplx64.go
        +echo -e '// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.\n' > level2cmplx64.go
        +cat level2cmplx128.go \
        +| gofmt -r 'blas.Complex128Level2 -> blas.Complex64Level2' \
        +\
        +| gofmt -r 'complex128 -> complex64' \
        +| gofmt -r 'float64 -> float32' \
        +\
        +| gofmt -r 'c128.AxpyInc -> c64.AxpyInc' \
        +| gofmt -r 'c128.AxpyUnitary -> c64.AxpyUnitary' \
        +| gofmt -r 'c128.DotuInc -> c64.DotuInc' \
        +| gofmt -r 'c128.DotuUnitary -> c64.DotuUnitary' \
        +| gofmt -r 'c128.ScalInc -> c64.ScalInc' \
        +| gofmt -r 'c128.ScalUnitary -> c64.ScalUnitary' \
        +\
        +| sed -e "s_^\(func (Implementation) \)Z\(.*\)\$_$WARNINGC64\1C\2_" \
        +      -e 's_^// Z_// C_' \
        +      -e 's_"gonum.org/v1/gonum/internal/asm/c128"_"gonum.org/v1/gonum/internal/asm/c64"_' \
        +      -e 's_"math/cmplx"_cmplx "gonum.org/v1/gonum/internal/cmplx64"_' \
        +>> level2cmplx64.go
         
         # Level3 routines.
         
        -echo Generating level3single.go
        -echo -e '// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.\n' > level3single.go
        -cat level3double.go \
        +echo Generating level3float32.go
        +echo -e '// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.\n' > level3float32.go
        +cat level3float64.go \
         | gofmt -r 'blas.Float64Level3 -> blas.Float32Level3' \
         \
         | gofmt -r 'float64 -> float32' \
         \
         | gofmt -r 'f64.AxpyUnitaryTo -> f32.AxpyUnitaryTo' \
        +| gofmt -r 'f64.AxpyUnitary -> f32.AxpyUnitary' \
         | gofmt -r 'f64.DotUnitary -> f32.DotUnitary' \
        +| gofmt -r 'f64.ScalUnitary -> f32.ScalUnitary' \
         \
        -| sed -e "s_^\(func (Implementation) \)D\(.*\)\$_$WARNING\1S\2_" \
        +| sed -e "s_^\(func (Implementation) \)D\(.*\)\$_$WARNINGF32\1S\2_" \
               -e 's_^// D_// S_' \
               -e 's_"gonum.org/v1/gonum/internal/asm/f64"_"gonum.org/v1/gonum/internal/asm/f32"_' \
        ->> level3single.go
        +>> level3float32.go
         
         echo Generating sgemm.go
         echo -e '// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.\n' > sgemm.go
         cat dgemm.go \
         | gofmt -r 'float64 -> float32' \
         | gofmt -r 'sliceView64 -> sliceView32' \
        -| gofmt -r 'checkDMatrix -> checkSMatrix' \
         \
         | gofmt -r 'dgemmParallel -> sgemmParallel' \
         | gofmt -r 'computeNumBlocks64 -> computeNumBlocks32' \
        @@ -134,12 +190,31 @@ cat dgemm.go \
         | gofmt -r 'dgemmSerialTransTrans -> sgemmSerialTransTrans' \
         \
         | gofmt -r 'f64.AxpyInc -> f32.AxpyInc' \
        -| gofmt -r 'f64.AxpyIncTo -> f32.AxpyIncTo' \
        -| gofmt -r 'f64.AxpyUnitaryTo -> f32.AxpyUnitaryTo' \
        +| gofmt -r 'f64.AxpyUnitary -> f32.AxpyUnitary' \
         | gofmt -r 'f64.DotUnitary -> f32.DotUnitary' \
         \
        -| sed -e "s_^\(func (Implementation) \)D\(.*\)\$_$WARNING\1S\2_" \
        +| sed -e "s_^\(func (Implementation) \)D\(.*\)\$_$WARNINGF32\1S\2_" \
               -e 's_^// D_// S_' \
               -e 's_^// d_// s_' \
               -e 's_"gonum.org/v1/gonum/internal/asm/f64"_"gonum.org/v1/gonum/internal/asm/f32"_' \
         >> sgemm.go
        +
        +echo Generating level3cmplx64.go
        +echo -e '// Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.\n' > level3cmplx64.go
        +cat level3cmplx128.go \
        +| gofmt -r 'blas.Complex128Level3 -> blas.Complex64Level3' \
        +\
        +| gofmt -r 'float64 -> float32' \
        +| gofmt -r 'complex128 -> complex64' \
        +\
        +| gofmt -r 'c128.ScalUnitary -> c64.ScalUnitary' \
        +| gofmt -r 'c128.DscalUnitary -> c64.SscalUnitary' \
        +| gofmt -r 'c128.DotcUnitary -> c64.DotcUnitary' \
        +| gofmt -r 'c128.AxpyUnitary -> c64.AxpyUnitary' \
        +| gofmt -r 'c128.DotuUnitary -> c64.DotuUnitary' \
        +\
        +| sed -e "s_^\(func (Implementation) \)Z\(.*\)\$_$WARNINGC64\1C\2_" \
        +      -e 's_^// Z_// C_' \
        +      -e 's_"gonum.org/v1/gonum/internal/asm/c128"_"gonum.org/v1/gonum/internal/asm/c64"_' \
        +      -e 's_"math/cmplx"_cmplx "gonum.org/v1/gonum/internal/cmplx64"_' \
        +>> level3cmplx64.go
        diff --git a/vendor/gonum.org/v1/gonum/floats/floats.go b/vendor/gonum.org/v1/gonum/floats/floats.go
        index 76d6c77cb..6a0efae2b 100644
        --- a/vendor/gonum.org/v1/gonum/floats/floats.go
        +++ b/vendor/gonum.org/v1/gonum/floats/floats.go
        @@ -152,14 +152,10 @@ func Distance(s, t []float64, L float64) float64 {
         	if len(s) == 0 {
         		return 0
         	}
        -	var norm float64
         	if L == 2 {
        -		for i, v := range s {
        -			diff := t[i] - v
        -			norm = math.Hypot(norm, diff)
        -		}
        -		return norm
        +		return f64.L2DistanceUnitary(s, t)
         	}
        +	var norm float64
         	if L == 1 {
         		for i, v := range s {
         			norm += math.Abs(t[i] - v)
        @@ -648,11 +644,7 @@ func Norm(s []float64, L float64) float64 {
         		return 0
         	}
         	if L == 2 {
        -		twoNorm := math.Abs(s[0])
        -		for i := 1; i < len(s); i++ {
        -			twoNorm = math.Hypot(twoNorm, s[i])
        -		}
        -		return twoNorm
        +		return f64.L2NormUnitary(s)
         	}
         	var norm float64
         	if L == 1 {
        @@ -809,6 +801,17 @@ func Scale(c float64, dst []float64) {
         	}
         }
         
        +// ScaleTo multiplies the elements in s by c and stores the result in dst.
        +func ScaleTo(dst []float64, c float64, s []float64) []float64 {
        +	if len(dst) != len(s) {
        +		panic("floats: lengths of slices do not match")
        +	}
        +	if len(dst) > 0 {
        +		f64.ScalUnitaryTo(dst, c, s)
        +	}
        +	return dst
        +}
        +
         // Span returns a set of N equally spaced points between l and u, where N
         // is equal to the length of the destination. The first element of the destination
         // is l, the final element of the destination is u.
        @@ -897,11 +900,7 @@ func SubTo(dst, s, t []float64) []float64 {
         
         // Sum returns the sum of the elements of the slice.
         func Sum(s []float64) float64 {
        -	var sum float64
        -	for _, val := range s {
        -		sum += val
        -	}
        -	return sum
        +	return f64.Sum(s)
         }
         
         // Within returns the first index i where s[i] <= v < s[i+1]. Within panics if:
        diff --git a/vendor/gonum.org/v1/gonum/graph/formats/cytoscapejs/testdata/LICENSE b/vendor/gonum.org/v1/gonum/graph/formats/cytoscapejs/testdata/LICENSE
        deleted file mode 100644
        index 9e21a7e3e..000000000
        --- a/vendor/gonum.org/v1/gonum/graph/formats/cytoscapejs/testdata/LICENSE
        +++ /dev/null
        @@ -1,21 +0,0 @@
        -
        -
        -Copyright (c) 2016-2018, The Cytoscape Consortium.
        -
        -Permission is hereby granted, free of charge, to any person obtaining a copy of
        -this software and associated documentation files (the “Software”), to deal in
        -the Software without restriction, including without limitation the rights to
        -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
        -of the Software, and to permit persons to whom the Software is furnished to do
        -so, subject to the following conditions:
        -
        -The above copyright notice and this permission notice shall be included in all
        -copies or substantial portions of the Software.
        -
        -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        -SOFTWARE.
        \ No newline at end of file
        diff --git a/vendor/gonum.org/v1/gonum/graph/formats/sigmajs/testdata/LICENSE.txt b/vendor/gonum.org/v1/gonum/graph/formats/sigmajs/testdata/LICENSE.txt
        deleted file mode 100644
        index 81739df1a..000000000
        --- a/vendor/gonum.org/v1/gonum/graph/formats/sigmajs/testdata/LICENSE.txt
        +++ /dev/null
        @@ -1,12 +0,0 @@
        -Copyright (C) 2013-2014, Alexis Jacomy, http://sigmajs.org
        -
        -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
        -to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
        -and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
        -
        -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
        -
        -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
        -IN THE SOFTWARE.
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/c128/axpyinc_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/c128/axpyinc_amd64.s
        index 0a4c14c29..68490e51a 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/c128/axpyinc_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/c128/axpyinc_amd64.s
        @@ -2,7 +2,7 @@
         // Use of this source code is governed by a BSD-style
         // license that can be found in the LICENSE file.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/c128/axpyincto_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/c128/axpyincto_amd64.s
        index cb57f4bed..50d21f2cb 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/c128/axpyincto_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/c128/axpyincto_amd64.s
        @@ -2,7 +2,7 @@
         // Use of this source code is governed by a BSD-style
         // license that can be found in the LICENSE file.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/c128/axpyunitary_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/c128/axpyunitary_amd64.s
        index f1fddce71..ccf82896f 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/c128/axpyunitary_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/c128/axpyunitary_amd64.s
        @@ -2,7 +2,7 @@
         // Use of this source code is governed by a BSD-style
         // license that can be found in the LICENSE file.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/c128/axpyunitaryto_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/c128/axpyunitaryto_amd64.s
        index b80015fda..07ceabca9 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/c128/axpyunitaryto_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/c128/axpyunitaryto_amd64.s
        @@ -2,7 +2,7 @@
         // Use of this source code is governed by a BSD-style
         // license that can be found in the LICENSE file.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/c128/dotcinc_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/c128/dotcinc_amd64.s
        index 301d294fa..03c07db9f 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/c128/dotcinc_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/c128/dotcinc_amd64.s
        @@ -2,7 +2,7 @@
         // Use of this source code is governed by a BSD-style
         // license that can be found in the LICENSE file.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/c128/dotcunitary_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/c128/dotcunitary_amd64.s
        index 1db7e156d..adce85e1d 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/c128/dotcunitary_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/c128/dotcunitary_amd64.s
        @@ -2,7 +2,7 @@
         // Use of this source code is governed by a BSD-style
         // license that can be found in the LICENSE file.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/c128/dotuinc_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/c128/dotuinc_amd64.s
        index 386467fcb..5b15444d8 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/c128/dotuinc_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/c128/dotuinc_amd64.s
        @@ -2,7 +2,7 @@
         // Use of this source code is governed by a BSD-style
         // license that can be found in the LICENSE file.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/c128/dotuunitary_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/c128/dotuunitary_amd64.s
        index d0d507cdc..a45f31e9e 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/c128/dotuunitary_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/c128/dotuunitary_amd64.s
        @@ -2,7 +2,7 @@
         // Use of this source code is governed by a BSD-style
         // license that can be found in the LICENSE file.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/c128/dscalinc_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/c128/dscalinc_amd64.s
        index 40d5851a6..d8fd54d22 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/c128/dscalinc_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/c128/dscalinc_amd64.s
        @@ -2,7 +2,7 @@
         // Use of this source code is governed by a BSD-style
         // license that can be found in the LICENSE file.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/c128/dscalunitary_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/c128/dscalunitary_amd64.s
        index cbc0768aa..6ed900a66 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/c128/dscalunitary_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/c128/dscalunitary_amd64.s
        @@ -2,7 +2,7 @@
         // Use of this source code is governed by a BSD-style
         // license that can be found in the LICENSE file.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/c128/scalUnitary_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/c128/scalUnitary_amd64.s
        index 7b807b3a4..f08590e1b 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/c128/scalUnitary_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/c128/scalUnitary_amd64.s
        @@ -2,7 +2,7 @@
         // Use of this source code is governed by a BSD-style
         // license that can be found in the LICENSE file.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/c128/scalinc_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/c128/scalinc_amd64.s
        index 7857c1554..5829ee54b 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/c128/scalinc_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/c128/scalinc_amd64.s
        @@ -2,7 +2,7 @@
         // Use of this source code is governed by a BSD-style
         // license that can be found in the LICENSE file.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/c64/axpyinc_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/c64/axpyinc_amd64.s
        new file mode 100644
        index 000000000..5f1051164
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/c64/axpyinc_amd64.s
        @@ -0,0 +1,151 @@
        +// Copyright ©2016 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// +build !noasm,!appengine,!safe
        +
        +#include "textflag.h"
        +
        +// MOVSHDUP X3, X2
        +#define MOVSHDUP_X3_X2 BYTE $0xF3; BYTE $0x0F; BYTE $0x16; BYTE $0xD3
        +// MOVSLDUP X3, X3
        +#define MOVSLDUP_X3_X3 BYTE $0xF3; BYTE $0x0F; BYTE $0x12; BYTE $0xDB
        +// ADDSUBPS X2, X3
        +#define ADDSUBPS_X2_X3 BYTE $0xF2; BYTE $0x0F; BYTE $0xD0; BYTE $0xDA
        +
        +// MOVSHDUP X5, X4
        +#define MOVSHDUP_X5_X4 BYTE $0xF3; BYTE $0x0F; BYTE $0x16; BYTE $0xE5
        +// MOVSLDUP X5, X5
        +#define MOVSLDUP_X5_X5 BYTE $0xF3; BYTE $0x0F; BYTE $0x12; BYTE $0xED
        +// ADDSUBPS X4, X5
        +#define ADDSUBPS_X4_X5 BYTE $0xF2; BYTE $0x0F; BYTE $0xD0; BYTE $0xEC
        +
        +// MOVSHDUP X7, X6
        +#define MOVSHDUP_X7_X6 BYTE $0xF3; BYTE $0x0F; BYTE $0x16; BYTE $0xF7
        +// MOVSLDUP X7, X7
        +#define MOVSLDUP_X7_X7 BYTE $0xF3; BYTE $0x0F; BYTE $0x12; BYTE $0xFF
        +// ADDSUBPS X6, X7
        +#define ADDSUBPS_X6_X7 BYTE $0xF2; BYTE $0x0F; BYTE $0xD0; BYTE $0xFE
        +
        +// MOVSHDUP X9, X8
        +#define MOVSHDUP_X9_X8 BYTE $0xF3; BYTE $0x45; BYTE $0x0F; BYTE $0x16; BYTE $0xC1
        +// MOVSLDUP X9, X9
        +#define MOVSLDUP_X9_X9 BYTE $0xF3; BYTE $0x45; BYTE $0x0F; BYTE $0x12; BYTE $0xC9
        +// ADDSUBPS X8, X9
        +#define ADDSUBPS_X8_X9 BYTE $0xF2; BYTE $0x45; BYTE $0x0F; BYTE $0xD0; BYTE $0xC8
        +
        +// func AxpyInc(alpha complex64, x, y []complex64, n, incX, incY, ix, iy uintptr)
        +TEXT ·AxpyInc(SB), NOSPLIT, $0
        +	MOVQ   x_base+8(FP), SI  // SI = &x
        +	MOVQ   y_base+32(FP), DI // DI = &y
        +	MOVQ   n+56(FP), CX      // CX = n
        +	CMPQ   CX, $0            // if n==0 { return }
        +	JE     axpyi_end
        +	MOVQ   ix+80(FP), R8     // R8 = ix
        +	MOVQ   iy+88(FP), R9     // R9 = iy
        +	LEAQ   (SI)(R8*8), SI    // SI = &(x[ix])
        +	LEAQ   (DI)(R9*8), DI    // DI = &(y[iy])
        +	MOVQ   DI, DX            // DX = DI    // Read/Write pointers
        +	MOVQ   incX+64(FP), R8   // R8 = incX
        +	SHLQ   $3, R8            // R8 *= sizeof(complex64)
        +	MOVQ   incY+72(FP), R9   // R9 = incY
        +	SHLQ   $3, R9            // R9 *= sizeof(complex64)
        +	MOVSD  alpha+0(FP), X0   // X0 = { 0, 0, imag(a), real(a) }
        +	MOVAPS X0, X1
        +	SHUFPS $0x11, X1, X1     // X1 = { 0, 0, real(a), imag(a) }
        +	MOVAPS X0, X10           // Copy X0 and X1 for pipelining
        +	MOVAPS X1, X11
        +	MOVQ   CX, BX
        +	ANDQ   $3, CX            // CX = n % 4
        +	SHRQ   $2, BX            // BX = floor( n / 4 )
        +	JZ     axpyi_tail        // if BX == 0 { goto axpyi_tail }
        +
        +axpyi_loop: // do {
        +	MOVSD (SI), X3       // X_i = { imag(x[i+1]), real(x[i+1]) }
        +	MOVSD (SI)(R8*1), X5
        +	LEAQ  (SI)(R8*2), SI // SI = &(SI[incX*2])
        +	MOVSD (SI), X7
        +	MOVSD (SI)(R8*1), X9
        +
        +	// X_(i-1) = { imag(x[i]), imag(x[i]) }
        +	MOVSHDUP_X3_X2
        +	MOVSHDUP_X5_X4
        +	MOVSHDUP_X7_X6
        +	MOVSHDUP_X9_X8
        +
        +	// X_i = { real(x[i]), real(x[i]) }
        +	MOVSLDUP_X3_X3
        +	MOVSLDUP_X5_X5
        +	MOVSLDUP_X7_X7
        +	MOVSLDUP_X9_X9
        +
        +	// X_(i-1) = {  real(a) * imag(x[i]),   imag(a) * imag(x[i]) }
        +	// X_i     = {  imag(a) * real(x[i]),   real(a) * real(x[i])  }
        +	MULPS X1, X2
        +	MULPS X0, X3
        +	MULPS X11, X4
        +	MULPS X10, X5
        +	MULPS X1, X6
        +	MULPS X0, X7
        +	MULPS X11, X8
        +	MULPS X10, X9
        +
        +	// X_i = {
        +	//	imag(result[i]):   imag(a)*real(x[i]) + real(a)*imag(x[i]),
        +	//	real(result[i]):   real(a)*real(x[i]) - imag(a)*imag(x[i]),
        +	//  }
        +	ADDSUBPS_X2_X3
        +	ADDSUBPS_X4_X5
        +	ADDSUBPS_X6_X7
        +	ADDSUBPS_X8_X9
        +
        +	// X_i = { imag(result[i]) + imag(y[i]), real(result[i]) + real(y[i]) }
        +	MOVSD (DX), X2
        +	MOVSD (DX)(R9*1), X4
        +	LEAQ  (DX)(R9*2), DX // DX = &(DX[incY*2])
        +	MOVSD (DX), X6
        +	MOVSD (DX)(R9*1), X8
        +	ADDPS X2, X3
        +	ADDPS X4, X5
        +	ADDPS X6, X7
        +	ADDPS X8, X9
        +
        +	MOVSD X3, (DI)       // y[i] = X_i
        +	MOVSD X5, (DI)(R9*1)
        +	LEAQ  (DI)(R9*2), DI // DI = &(DI[incDst])
        +	MOVSD X7, (DI)
        +	MOVSD X9, (DI)(R9*1)
        +	LEAQ  (SI)(R8*2), SI // SI = &(SI[incX*2])
        +	LEAQ  (DX)(R9*2), DX // DX = &(DX[incY*2])
        +	LEAQ  (DI)(R9*2), DI // DI = &(DI[incDst])
        +	DECQ  BX
        +	JNZ   axpyi_loop     // }  while --BX > 0
        +	CMPQ  CX, $0         // if CX == 0 { return }
        +	JE    axpyi_end
        +
        +axpyi_tail: // do {
        +	MOVSD (SI), X3 // X_i = { imag(x[i+1]), real(x[i+1]) }
        +	MOVSHDUP_X3_X2 // X_(i-1) = { real(x[i]), real(x[i]) }
        +	MOVSLDUP_X3_X3 // X_i = { imag(x[i]), imag(x[i]) }
        +
        +	// X_i     = { imag(a) * real(x[i]),  real(a) * real(x[i]) }
        +	// X_(i-1) = { real(a) * imag(x[i]),  imag(a) * imag(x[i]) }
        +	MULPS X1, X2
        +	MULPS X0, X3
        +
        +	// X_i = {
        +	//	imag(result[i]):   imag(a)*real(x[i]) + real(a)*imag(x[i]),
        +	//	real(result[i]):   real(a)*real(x[i]) - imag(a)*imag(x[i]),
        +	//  }
        +	ADDSUBPS_X2_X3 // (ai*x1r+ar*x1i, ar*x1r-ai*x1i)
        +
        +	// X_i = { imag(result[i]) + imag(y[i]),  real(result[i]) + real(y[i])  }
        +	MOVSD (DI), X4
        +	ADDPS X4, X3
        +	MOVSD X3, (DI)   // y[i] = X_i
        +	ADDQ  R8, SI     // SI += incX
        +	ADDQ  R9, DI     // DI += incY
        +	LOOP  axpyi_tail // } while --CX > 0
        +
        +axpyi_end:
        +	RET
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/c64/axpyincto_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/c64/axpyincto_amd64.s
        new file mode 100644
        index 000000000..5b0e2848a
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/c64/axpyincto_amd64.s
        @@ -0,0 +1,156 @@
        +// Copyright ©2016 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// +build !noasm,!appengine,!safe
        +
        +#include "textflag.h"
        +
        +// MOVSHDUP X3, X2
        +#define MOVSHDUP_X3_X2 BYTE $0xF3; BYTE $0x0F; BYTE $0x16; BYTE $0xD3
        +// MOVSLDUP X3, X3
        +#define MOVSLDUP_X3_X3 BYTE $0xF3; BYTE $0x0F; BYTE $0x12; BYTE $0xDB
        +// ADDSUBPS X2, X3
        +#define ADDSUBPS_X2_X3 BYTE $0xF2; BYTE $0x0F; BYTE $0xD0; BYTE $0xDA
        +
        +// MOVSHDUP X5, X4
        +#define MOVSHDUP_X5_X4 BYTE $0xF3; BYTE $0x0F; BYTE $0x16; BYTE $0xE5
        +// MOVSLDUP X5, X5
        +#define MOVSLDUP_X5_X5 BYTE $0xF3; BYTE $0x0F; BYTE $0x12; BYTE $0xED
        +// ADDSUBPS X4, X5
        +#define ADDSUBPS_X4_X5 BYTE $0xF2; BYTE $0x0F; BYTE $0xD0; BYTE $0xEC
        +
        +// MOVSHDUP X7, X6
        +#define MOVSHDUP_X7_X6 BYTE $0xF3; BYTE $0x0F; BYTE $0x16; BYTE $0xF7
        +// MOVSLDUP X7, X7
        +#define MOVSLDUP_X7_X7 BYTE $0xF3; BYTE $0x0F; BYTE $0x12; BYTE $0xFF
        +// ADDSUBPS X6, X7
        +#define ADDSUBPS_X6_X7 BYTE $0xF2; BYTE $0x0F; BYTE $0xD0; BYTE $0xFE
        +
        +// MOVSHDUP X9, X8
        +#define MOVSHDUP_X9_X8 BYTE $0xF3; BYTE $0x45; BYTE $0x0F; BYTE $0x16; BYTE $0xC1
        +// MOVSLDUP X9, X9
        +#define MOVSLDUP_X9_X9 BYTE $0xF3; BYTE $0x45; BYTE $0x0F; BYTE $0x12; BYTE $0xC9
        +// ADDSUBPS X8, X9
        +#define ADDSUBPS_X8_X9 BYTE $0xF2; BYTE $0x45; BYTE $0x0F; BYTE $0xD0; BYTE $0xC8
        +
        +// func AxpyIncTo(dst []complex64, incDst, idst uintptr, alpha complex64, x, y []complex64, n, incX, incY, ix, iy uintptr)
        +TEXT ·AxpyIncTo(SB), NOSPLIT, $0
        +	MOVQ   dst_base+0(FP), DI // DI = &dst
        +	MOVQ   x_base+48(FP), SI  // SI = &x
        +	MOVQ   y_base+72(FP), DX  // DX = &y
        +	MOVQ   n+96(FP), CX       // CX = n
        +	CMPQ   CX, $0             // if n==0 { return }
        +	JE     axpyi_end
        +	MOVQ   ix+120(FP), R8     // Load the first index
        +	MOVQ   iy+128(FP), R9
        +	MOVQ   idst+32(FP), R10
        +	LEAQ   (SI)(R8*8), SI     // SI = &(x[ix])
        +	LEAQ   (DX)(R9*8), DX     // DX = &(y[iy])
        +	LEAQ   (DI)(R10*8), DI    // DI = &(dst[idst])
        +	MOVQ   incX+104(FP), R8   // Incrementors*8 for easy iteration (ADDQ)
        +	SHLQ   $3, R8
        +	MOVQ   incY+112(FP), R9
        +	SHLQ   $3, R9
        +	MOVQ   incDst+24(FP), R10
        +	SHLQ   $3, R10
        +	MOVSD  alpha+40(FP), X0   // X0 = { 0, 0, imag(a), real(a) }
        +	MOVAPS X0, X1
        +	SHUFPS $0x11, X1, X1      // X1 = { 0, 0, real(a), imag(a) }
        +	MOVAPS X0, X10            // Copy X0 and X1 for pipelining
        +	MOVAPS X1, X11
        +	MOVQ   CX, BX
        +	ANDQ   $3, CX             // CX = n % 4
        +	SHRQ   $2, BX             // BX = floor( n / 4 )
        +	JZ     axpyi_tail         // if BX == 0 { goto axpyi_tail }
        +
        +axpyi_loop: // do {
        +	MOVSD (SI), X3       // X_i = { imag(x[i]), real(x[i]) }
        +	MOVSD (SI)(R8*1), X5
        +	LEAQ  (SI)(R8*2), SI // SI = &(SI[incX*2])
        +	MOVSD (SI), X7
        +	MOVSD (SI)(R8*1), X9
        +
        +	// X_(i-1) = { imag(x[i]), imag(x[i]) }
        +	MOVSHDUP_X3_X2
        +	MOVSHDUP_X5_X4
        +	MOVSHDUP_X7_X6
        +	MOVSHDUP_X9_X8
        +
        +	// X_i = { real(x[i]), real(x[i]) }
        +	MOVSLDUP_X3_X3
        +	MOVSLDUP_X5_X5
        +	MOVSLDUP_X7_X7
        +	MOVSLDUP_X9_X9
        +
        +	// X_(i-1) = {  real(a) * imag(x[i]),   imag(a) * imag(x[i]) }
        +	// X_i     = {  imag(a) * real(x[i]),   real(a) * real(x[i])  }
        +	MULPS X1, X2
        +	MULPS X0, X3
        +	MULPS X11, X4
        +	MULPS X10, X5
        +	MULPS X1, X6
        +	MULPS X0, X7
        +	MULPS X11, X8
        +	MULPS X10, X9
        +
        +	// X_i = {
        +	//	imag(result[i]):   imag(a)*real(x[i]) + real(a)*imag(x[i]),
        +	//	real(result[i]):   real(a)*real(x[i]) - imag(a)*imag(x[i]),
        +	//  }
        +	ADDSUBPS_X2_X3
        +	ADDSUBPS_X4_X5
        +	ADDSUBPS_X6_X7
        +	ADDSUBPS_X8_X9
        +
        +	// X_i = { imag(result[i]) + imag(y[i]), real(result[i]) + real(y[i]) }
        +	MOVSD (DX), X2
        +	MOVSD (DX)(R9*1), X4
        +	LEAQ  (DX)(R9*2), DX // DX = &(DX[incY*2])
        +	MOVSD (DX), X6
        +	MOVSD (DX)(R9*1), X8
        +	ADDPS X2, X3
        +	ADDPS X4, X5
        +	ADDPS X6, X7
        +	ADDPS X8, X9
        +
        +	MOVSD X3, (DI)        // y[i] = X_i
        +	MOVSD X5, (DI)(R10*1)
        +	LEAQ  (DI)(R10*2), DI // DI = &(DI[incDst])
        +	MOVSD X7, (DI)
        +	MOVSD X9, (DI)(R10*1)
        +	LEAQ  (SI)(R8*2), SI  // SI = &(SI[incX*2])
        +	LEAQ  (DX)(R9*2), DX  // DX = &(DX[incY*2])
        +	LEAQ  (DI)(R10*2), DI // DI = &(DI[incDst])
        +	DECQ  BX
        +	JNZ   axpyi_loop      // } while --BX > 0
        +	CMPQ  CX, $0          // if CX == 0 { return }
        +	JE    axpyi_end
        +
        +axpyi_tail:
        +	MOVSD (SI), X3 // X_i     = { imag(x[i]), real(x[i]) }
        +	MOVSHDUP_X3_X2 // X_(i-1) = { imag(x[i]), imag(x[i]) }
        +	MOVSLDUP_X3_X3 // X_i     = { real(x[i]), real(x[i]) }
        +
        +	// X_i     = { imag(a) * real(x[i]),  real(a) * real(x[i]) }
        +	// X_(i-1) = { real(a) * imag(x[i]),  imag(a) * imag(x[i]) }
        +	MULPS X1, X2
        +	MULPS X0, X3
        +
        +	// X_i = {
        +	//	imag(result[i]):   imag(a)*real(x[i]) + real(a)*imag(x[i]),
        +	//	real(result[i]):   real(a)*real(x[i]) - imag(a)*imag(x[i]),
        +	//  }
        +	ADDSUBPS_X2_X3
        +
        +	// X_i = { imag(result[i]) + imag(y[i]),  real(result[i]) + real(y[i])  }
        +	MOVSD (DX), X4
        +	ADDPS X4, X3
        +	MOVSD X3, (DI)   // y[i] = X_i
        +	ADDQ  R8, SI     // SI += incX
        +	ADDQ  R9, DX     // DX += incY
        +	ADDQ  R10, DI    // DI += incDst
        +	LOOP  axpyi_tail // } while --CX > 0
        +
        +axpyi_end:
        +	RET
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/c64/axpyunitary_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/c64/axpyunitary_amd64.s
        new file mode 100644
        index 000000000..c38cb3c50
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/c64/axpyunitary_amd64.s
        @@ -0,0 +1,160 @@
        +// Copyright ©2016 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// +build !noasm,!appengine,!safe
        +
        +#include "textflag.h"
        +
        +// MOVSHDUP X3, X2
        +#define MOVSHDUP_X3_X2 BYTE $0xF3; BYTE $0x0F; BYTE $0x16; BYTE $0xD3
        +// MOVSLDUP X3, X3
        +#define MOVSLDUP_X3_X3 BYTE $0xF3; BYTE $0x0F; BYTE $0x12; BYTE $0xDB
        +// ADDSUBPS X2, X3
        +#define ADDSUBPS_X2_X3 BYTE $0xF2; BYTE $0x0F; BYTE $0xD0; BYTE $0xDA
        +
        +// MOVSHDUP X5, X4
        +#define MOVSHDUP_X5_X4 BYTE $0xF3; BYTE $0x0F; BYTE $0x16; BYTE $0xE5
        +// MOVSLDUP X5, X5
        +#define MOVSLDUP_X5_X5 BYTE $0xF3; BYTE $0x0F; BYTE $0x12; BYTE $0xED
        +// ADDSUBPS X4, X5
        +#define ADDSUBPS_X4_X5 BYTE $0xF2; BYTE $0x0F; BYTE $0xD0; BYTE $0xEC
        +
        +// MOVSHDUP X7, X6
        +#define MOVSHDUP_X7_X6 BYTE $0xF3; BYTE $0x0F; BYTE $0x16; BYTE $0xF7
        +// MOVSLDUP X7, X7
        +#define MOVSLDUP_X7_X7 BYTE $0xF3; BYTE $0x0F; BYTE $0x12; BYTE $0xFF
        +// ADDSUBPS X6, X7
        +#define ADDSUBPS_X6_X7 BYTE $0xF2; BYTE $0x0F; BYTE $0xD0; BYTE $0xFE
        +
        +// MOVSHDUP X9, X8
        +#define MOVSHDUP_X9_X8 BYTE $0xF3; BYTE $0x45; BYTE $0x0F; BYTE $0x16; BYTE $0xC1
        +// MOVSLDUP X9, X9
        +#define MOVSLDUP_X9_X9 BYTE $0xF3; BYTE $0x45; BYTE $0x0F; BYTE $0x12; BYTE $0xC9
        +// ADDSUBPS X8, X9
        +#define ADDSUBPS_X8_X9 BYTE $0xF2; BYTE $0x45; BYTE $0x0F; BYTE $0xD0; BYTE $0xC8
        +
        +// func AxpyUnitary(alpha complex64, x, y []complex64)
        +TEXT ·AxpyUnitary(SB), NOSPLIT, $0
        +	MOVQ    x_base+8(FP), SI  // SI = &x
        +	MOVQ    y_base+32(FP), DI // DI = &y
        +	MOVQ    x_len+16(FP), CX  // CX = min( len(x), len(y) )
        +	CMPQ    y_len+40(FP), CX
        +	CMOVQLE y_len+40(FP), CX
        +	CMPQ    CX, $0            // if CX == 0 { return }
        +	JE      caxy_end
        +	PXOR    X0, X0            // Clear work registers and cache-align loop
        +	PXOR    X1, X1
        +	MOVSD   alpha+0(FP), X0   // X0 = { 0, 0, imag(a), real(a) }
        +	SHUFPD  $0, X0, X0        // X0  = { imag(a), real(a), imag(a), real(a) }
        +	MOVAPS  X0, X1
        +	SHUFPS  $0x11, X1, X1     // X1 = { real(a), imag(a), real(a), imag(a) }
        +	XORQ    AX, AX            // i = 0
        +	MOVQ    DI, BX            // Align on 16-byte boundary for ADDPS
        +	ANDQ    $15, BX           // BX = &y & 15
        +	JZ      caxy_no_trim      // if BX == 0 { goto caxy_no_trim }
        +
        +	// Trim first value in unaligned buffer
        +	XORPS X2, X2         // Clear work registers and cache-align loop
        +	XORPS X3, X3
        +	XORPS X4, X4
        +	MOVSD (SI)(AX*8), X3 // X3 = { imag(x[i]), real(x[i]) }
        +	MOVSHDUP_X3_X2       // X2 = { imag(x[i]), imag(x[i]) }
        +	MOVSLDUP_X3_X3       // X3 = { real(x[i]), real(x[i]) }
        +	MULPS X1, X2         // X2 = { real(a) * imag(x[i]), imag(a) * imag(x[i]) }
        +	MULPS X0, X3         // X3 = { imag(a) * real(x[i]), real(a) * real(x[i]) }
        +
        +	// X3 = { imag(a)*real(x[i]) + real(a)*imag(x[i]), real(a)*real(x[i]) - imag(a)*imag(x[i]) }
        +	ADDSUBPS_X2_X3
        +	MOVSD (DI)(AX*8), X4 // X3 += y[i]
        +	ADDPS X4, X3
        +	MOVSD X3, (DI)(AX*8) // y[i]  = X3
        +	INCQ  AX             // i++
        +	DECQ  CX             // --CX
        +	JZ    caxy_end       // if CX == 0 { return }
        +
        +caxy_no_trim:
        +	MOVAPS X0, X10   // Copy X0 and X1 for pipelineing
        +	MOVAPS X1, X11
        +	MOVQ   CX, BX
        +	ANDQ   $7, CX    // CX = n % 8
        +	SHRQ   $3, BX    // BX = floor( n / 8 )
        +	JZ     caxy_tail // if BX == 0 { goto caxy_tail }
        +
        +caxy_loop: // do {
        +	// X_i = { imag(x[i]), real(x[i]), imag(x[i+1]), real(x[i+1]) }
        +	MOVUPS (SI)(AX*8), X3
        +	MOVUPS 16(SI)(AX*8), X5
        +	MOVUPS 32(SI)(AX*8), X7
        +	MOVUPS 48(SI)(AX*8), X9
        +
        +	// X_(i-1) = { imag(x[i]), imag(x[i]), imag(x[i]+1), imag(x[i]+1) }
        +	MOVSHDUP_X3_X2
        +	MOVSHDUP_X5_X4
        +	MOVSHDUP_X7_X6
        +	MOVSHDUP_X9_X8
        +
        +	// X_i = { real(x[i]), real(x[i]), real(x[i+1]), real(x[i+1]) }
        +	MOVSLDUP_X3_X3
        +	MOVSLDUP_X5_X5
        +	MOVSLDUP_X7_X7
        +	MOVSLDUP_X9_X9
        +
        +	// X_i     = {  imag(a) * real(x[i]),   real(a) * real(x[i]),
        +	// 		imag(a) * real(x[i+1]), real(a) * real(x[i+1])  }
        +	// X_(i-1) = {  real(a) * imag(x[i]),   imag(a) * imag(x[i]),
        +	//		real(a) * imag(x[i+1]), imag(a) * imag(x[i+1])  }
        +	MULPS X1, X2
        +	MULPS X0, X3
        +	MULPS X11, X4
        +	MULPS X10, X5
        +	MULPS X1, X6
        +	MULPS X0, X7
        +	MULPS X11, X8
        +	MULPS X10, X9
        +
        +	// X_i = {
        +	//	imag(result[i]):   imag(a)*real(x[i]) + real(a)*imag(x[i]),
        +	//	real(result[i]):   real(a)*real(x[i]) - imag(a)*imag(x[i]),
        +	//	imag(result[i+1]): imag(a)*real(x[i+1]) + real(a)*imag(x[i+1]),
        +	//	real(result[i+1]): real(a)*real(x[i+1]) - imag(a)*imag(x[i+1]),
        +	//  }
        +	ADDSUBPS_X2_X3
        +	ADDSUBPS_X4_X5
        +	ADDSUBPS_X6_X7
        +	ADDSUBPS_X8_X9
        +
        +	// X_i = { imag(result[i])   + imag(y[i]),   real(result[i])   + real(y[i]),
        +	//	   imag(result[i+1]) + imag(y[i+1]), real(result[i+1]) + real(y[i+1])  }
        +	ADDPS  (DI)(AX*8), X3
        +	ADDPS  16(DI)(AX*8), X5
        +	ADDPS  32(DI)(AX*8), X7
        +	ADDPS  48(DI)(AX*8), X9
        +	MOVUPS X3, (DI)(AX*8)   // y[i:i+1] = X_i
        +	MOVUPS X5, 16(DI)(AX*8)
        +	MOVUPS X7, 32(DI)(AX*8)
        +	MOVUPS X9, 48(DI)(AX*8)
        +	ADDQ   $8, AX           // i += 8
        +	DECQ   BX               // --BX
        +	JNZ    caxy_loop        // }  while BX > 0
        +	CMPQ   CX, $0           // if CX == 0  { return }
        +	JE     caxy_end
        +
        +caxy_tail: // do {
        +	MOVSD (SI)(AX*8), X3 // X3 = { imag(x[i]), real(x[i]) }
        +	MOVSHDUP_X3_X2       // X2 = { imag(x[i]), imag(x[i]) }
        +	MOVSLDUP_X3_X3       // X3 = { real(x[i]), real(x[i]) }
        +	MULPS X1, X2         // X2 = { real(a) * imag(x[i]), imag(a) * imag(x[i]) }
        +	MULPS X0, X3         // X3 = { imag(a) * real(x[i]), real(a) * real(x[i]) }
        +
        +	// X3 = { imag(a)*real(x[i]) + real(a)*imag(x[i]),
        +	//	  real(a)*real(x[i]) - imag(a)*imag(x[i])   }
        +	ADDSUBPS_X2_X3
        +	MOVSD (DI)(AX*8), X4 // X3 += y[i]
        +	ADDPS X4, X3
        +	MOVSD X3, (DI)(AX*8) // y[i]  = X3
        +	INCQ  AX             // ++i
        +	LOOP  caxy_tail      // } while --CX > 0
        +
        +caxy_end:
        +	RET
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/c64/axpyunitaryto_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/c64/axpyunitaryto_amd64.s
        new file mode 100644
        index 000000000..fee4bb94f
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/c64/axpyunitaryto_amd64.s
        @@ -0,0 +1,157 @@
        +// Copyright ©2016 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// +build !noasm,!appengine,!safe
        +
        +#include "textflag.h"
        +
        +// MOVSHDUP X3, X2
        +#define MOVSHDUP_X3_X2 BYTE $0xF3; BYTE $0x0F; BYTE $0x16; BYTE $0xD3
        +// MOVSLDUP X3, X3
        +#define MOVSLDUP_X3_X3 BYTE $0xF3; BYTE $0x0F; BYTE $0x12; BYTE $0xDB
        +// ADDSUBPS X2, X3
        +#define ADDSUBPS_X2_X3 BYTE $0xF2; BYTE $0x0F; BYTE $0xD0; BYTE $0xDA
        +
        +// MOVSHDUP X5, X4
        +#define MOVSHDUP_X5_X4 BYTE $0xF3; BYTE $0x0F; BYTE $0x16; BYTE $0xE5
        +// MOVSLDUP X5, X5
        +#define MOVSLDUP_X5_X5 BYTE $0xF3; BYTE $0x0F; BYTE $0x12; BYTE $0xED
        +// ADDSUBPS X4, X5
        +#define ADDSUBPS_X4_X5 BYTE $0xF2; BYTE $0x0F; BYTE $0xD0; BYTE $0xEC
        +
        +// MOVSHDUP X7, X6
        +#define MOVSHDUP_X7_X6 BYTE $0xF3; BYTE $0x0F; BYTE $0x16; BYTE $0xF7
        +// MOVSLDUP X7, X7
        +#define MOVSLDUP_X7_X7 BYTE $0xF3; BYTE $0x0F; BYTE $0x12; BYTE $0xFF
        +// ADDSUBPS X6, X7
        +#define ADDSUBPS_X6_X7 BYTE $0xF2; BYTE $0x0F; BYTE $0xD0; BYTE $0xFE
        +
        +// MOVSHDUP X9, X8
        +#define MOVSHDUP_X9_X8 BYTE $0xF3; BYTE $0x45; BYTE $0x0F; BYTE $0x16; BYTE $0xC1
        +// MOVSLDUP X9, X9
        +#define MOVSLDUP_X9_X9 BYTE $0xF3; BYTE $0x45; BYTE $0x0F; BYTE $0x12; BYTE $0xC9
        +// ADDSUBPS X8, X9
        +#define ADDSUBPS_X8_X9 BYTE $0xF2; BYTE $0x45; BYTE $0x0F; BYTE $0xD0; BYTE $0xC8
        +
        +// func AxpyUnitaryTo(dst []complex64, alpha complex64, x, y []complex64)
        +TEXT ·AxpyUnitaryTo(SB), NOSPLIT, $0
        +	MOVQ    dst_base+0(FP), DI // DI = &dst
        +	MOVQ    x_base+32(FP), SI  // SI = &x
        +	MOVQ    y_base+56(FP), DX  // DX = &y
        +	MOVQ    x_len+40(FP), CX
        +	CMPQ    y_len+64(FP), CX   // CX = min( len(x), len(y), len(dst) )
        +	CMOVQLE y_len+64(FP), CX
        +	CMPQ    dst_len+8(FP), CX
        +	CMOVQLE dst_len+8(FP), CX
        +	CMPQ    CX, $0             // if CX == 0 { return }
        +	JE      caxy_end
        +	MOVSD   alpha+24(FP), X0   // X0 = { 0, 0, imag(a), real(a) }
        +	SHUFPD  $0, X0, X0         // X0  = { imag(a), real(a), imag(a), real(a) }
        +	MOVAPS  X0, X1
        +	SHUFPS  $0x11, X1, X1      // X1 = { real(a), imag(a), real(a), imag(a) }
        +	XORQ    AX, AX             // i = 0
        +	MOVQ    DX, BX             // Align on 16-byte boundary for ADDPS
        +	ANDQ    $15, BX            // BX = &y & 15
        +	JZ      caxy_no_trim       // if BX == 0 { goto caxy_no_trim }
        +
        +	MOVSD (SI)(AX*8), X3 // X3 = { imag(x[i]), real(x[i]) }
        +	MOVSHDUP_X3_X2       // X2 = { imag(x[i]), imag(x[i]) }
        +	MOVSLDUP_X3_X3       // X3 = { real(x[i]), real(x[i]) }
        +	MULPS X1, X2         // X2 = { real(a) * imag(x[i]), imag(a) * imag(x[i]) }
        +	MULPS X0, X3         // X3 = { imag(a) * real(x[i]), real(a) * real(x[i]) }
        +
        +	// X3 = { imag(a)*real(x[i]) + real(a)*imag(x[i]), real(a)*real(x[i]) - imag(a)*imag(x[i]) }
        +	ADDSUBPS_X2_X3
        +	MOVSD (DX)(AX*8), X4 // X3 += y[i]
        +	ADDPS X4, X3
        +	MOVSD X3, (DI)(AX*8) // dst[i]  = X3
        +	INCQ  AX             // i++
        +	DECQ  CX             // --CX
        +	JZ    caxy_tail      // if BX == 0 { goto caxy_tail }
        +
        +caxy_no_trim:
        +	MOVAPS X0, X10   // Copy X0 and X1 for pipelineing
        +	MOVAPS X1, X11
        +	MOVQ   CX, BX
        +	ANDQ   $7, CX    // CX = n % 8
        +	SHRQ   $3, BX    // BX = floor( n / 8 )
        +	JZ     caxy_tail // if BX == 0 { goto caxy_tail }
        +
        +caxy_loop:
        +	// X_i = { imag(x[i]), real(x[i]), imag(x[i+1]), real(x[i+1]) }
        +	MOVUPS (SI)(AX*8), X3
        +	MOVUPS 16(SI)(AX*8), X5
        +	MOVUPS 32(SI)(AX*8), X7
        +	MOVUPS 48(SI)(AX*8), X9
        +
        +	// X_(i-1) = { imag(x[i]), imag(x[i]), imag(x[i]+1), imag(x[i]+1) }
        +	MOVSHDUP_X3_X2
        +	MOVSHDUP_X5_X4
        +	MOVSHDUP_X7_X6
        +	MOVSHDUP_X9_X8
        +
        +	// X_i = { real(x[i]), real(x[i]), real(x[i+1]), real(x[i+1]) }
        +	MOVSLDUP_X3_X3
        +	MOVSLDUP_X5_X5
        +	MOVSLDUP_X7_X7
        +	MOVSLDUP_X9_X9
        +
        +	// X_i     = {  imag(a) * real(x[i]),   real(a) * real(x[i]),
        +	// 		imag(a) * real(x[i+1]), real(a) * real(x[i+1])  }
        +	// X_(i-1) = {  real(a) * imag(x[i]),   imag(a) * imag(x[i]),
        +	//		real(a) * imag(x[i+1]), imag(a) * imag(x[i+1])  }
        +	MULPS X1, X2
        +	MULPS X0, X3
        +	MULPS X11, X4
        +	MULPS X10, X5
        +	MULPS X1, X6
        +	MULPS X0, X7
        +	MULPS X11, X8
        +	MULPS X10, X9
        +
        +	// X_i = {
        +	//	imag(result[i]):   imag(a)*real(x[i]) + real(a)*imag(x[i]),
        +	//	real(result[i]):   real(a)*real(x[i]) - imag(a)*imag(x[i]),
        +	//	imag(result[i+1]): imag(a)*real(x[i+1]) + real(a)*imag(x[i+1]),
        +	//	real(result[i+1]): real(a)*real(x[i+1]) - imag(a)*imag(x[i+1]),
        +	//  }
        +	ADDSUBPS_X2_X3
        +	ADDSUBPS_X4_X5
        +	ADDSUBPS_X6_X7
        +	ADDSUBPS_X8_X9
        +
        +	// X_i = { imag(result[i])   + imag(y[i]),   real(result[i])   + real(y[i]),
        +	//	   imag(result[i+1]) + imag(y[i+1]), real(result[i+1]) + real(y[i+1])  }
        +	ADDPS  (DX)(AX*8), X3
        +	ADDPS  16(DX)(AX*8), X5
        +	ADDPS  32(DX)(AX*8), X7
        +	ADDPS  48(DX)(AX*8), X9
        +	MOVUPS X3, (DI)(AX*8)   // y[i:i+1] = X_i
        +	MOVUPS X5, 16(DI)(AX*8)
        +	MOVUPS X7, 32(DI)(AX*8)
        +	MOVUPS X9, 48(DI)(AX*8)
        +	ADDQ   $8, AX           // i += 8
        +	DECQ   BX               // --BX
        +	JNZ    caxy_loop        // }  while BX > 0
        +	CMPQ   CX, $0           // if CX == 0  { return }
        +	JE     caxy_end
        +
        +caxy_tail: // do {
        +	MOVSD (SI)(AX*8), X3 // X3 = { imag(x[i]), real(x[i]) }
        +	MOVSHDUP_X3_X2       // X2 = { imag(x[i]), imag(x[i]) }
        +	MOVSLDUP_X3_X3       // X3 = { real(x[i]), real(x[i]) }
        +	MULPS X1, X2         // X2 = { real(a) * imag(x[i]), imag(a) * imag(x[i]) }
        +	MULPS X0, X3         // X3 = { imag(a) * real(x[i]), real(a) * real(x[i]) }
        +
        +	// X3 = { imag(a)*real(x[i]) + real(a)*imag(x[i]),
        +	//	  real(a)*real(x[i]) - imag(a)*imag(x[i])  }
        +	ADDSUBPS_X2_X3
        +	MOVSD (DX)(AX*8), X4 // X3 += y[i]
        +	ADDPS X4, X3
        +	MOVSD X3, (DI)(AX*8) // y[i]  = X3
        +	INCQ  AX             // ++i
        +	LOOP  caxy_tail      // } while --CX > 0
        +
        +caxy_end:
        +	RET
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/c64/conj.go b/vendor/gonum.org/v1/gonum/internal/asm/c64/conj.go
        new file mode 100644
        index 000000000..910e1e5c7
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/c64/conj.go
        @@ -0,0 +1,7 @@
        +// Copyright ©2015 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package c64
        +
        +func conj(c complex64) complex64 { return complex(real(c), -imag(c)) }
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/c64/doc.go b/vendor/gonum.org/v1/gonum/internal/asm/c64/doc.go
        new file mode 100644
        index 000000000..35f1b2a26
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/c64/doc.go
        @@ -0,0 +1,6 @@
        +// Copyright ©2017 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// Package c64 provides complex64 vector primitives.
        +package c64 // import "gonum.org/v1/gonum/internal/asm/c64"
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/c64/dotcinc_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/c64/dotcinc_amd64.s
        new file mode 100644
        index 000000000..2161643cd
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/c64/dotcinc_amd64.s
        @@ -0,0 +1,160 @@
        +// Copyright ©2016 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// +build !noasm,!appengine,!safe
        +
        +#include "textflag.h"
        +
        +#define MOVSHDUP_X3_X2    LONG $0xD3160FF3 // MOVSHDUP X3, X2
        +#define MOVSHDUP_X5_X4    LONG $0xE5160FF3 // MOVSHDUP X5, X4
        +#define MOVSHDUP_X7_X6    LONG $0xF7160FF3 // MOVSHDUP X7, X6
        +#define MOVSHDUP_X9_X8    LONG $0x160F45F3; BYTE $0xC1 // MOVSHDUP X9, X8
        +
        +#define MOVSLDUP_X3_X3    LONG $0xDB120FF3 // MOVSLDUP X3, X3
        +#define MOVSLDUP_X5_X5    LONG $0xED120FF3 // MOVSLDUP X5, X5
        +#define MOVSLDUP_X7_X7    LONG $0xFF120FF3 // MOVSLDUP X7, X7
        +#define MOVSLDUP_X9_X9    LONG $0x120F45F3; BYTE $0xC9 // MOVSLDUP X9, X9
        +
        +#define ADDSUBPS_X2_X3    LONG $0xDAD00FF2 // ADDSUBPS X2, X3
        +#define ADDSUBPS_X4_X5    LONG $0xECD00FF2 // ADDSUBPS X4, X5
        +#define ADDSUBPS_X6_X7    LONG $0xFED00FF2 // ADDSUBPS X6, X7
        +#define ADDSUBPS_X8_X9    LONG $0xD00F45F2; BYTE $0xC8 // ADDSUBPS X8, X9
        +
        +#define X_PTR SI
        +#define Y_PTR DI
        +#define LEN CX
        +#define TAIL BX
        +#define SUM X0
        +#define P_SUM X1
        +#define INC_X R8
        +#define INCx3_X R9
        +#define INC_Y R10
        +#define INCx3_Y R11
        +#define NEG1 X15
        +#define P_NEG1 X14
        +
        +// func DotcInc(x, y []complex64, n, incX, incY, ix, iy uintptr) (sum complex64)
        +TEXT ·DotcInc(SB), NOSPLIT, $0
        +	MOVQ   x_base+0(FP), X_PTR     // X_PTR = &x
        +	MOVQ   y_base+24(FP), Y_PTR    // Y_PTR = &y
        +	PXOR   SUM, SUM                // SUM = 0
        +	PXOR   P_SUM, P_SUM            // P_SUM = 0
        +	MOVQ   n+48(FP), LEN           // LEN = n
        +	CMPQ   LEN, $0                 // if LEN == 0 { return }
        +	JE     dotc_end
        +	MOVQ   ix+72(FP), INC_X
        +	MOVQ   iy+80(FP), INC_Y
        +	LEAQ   (X_PTR)(INC_X*8), X_PTR // X_PTR = &(X_PTR[ix])
        +	LEAQ   (Y_PTR)(INC_Y*8), Y_PTR // Y_PTR = &(Y_PTR[iy])
        +	MOVQ   incX+56(FP), INC_X      // INC_X = incX * sizeof(complex64)
        +	SHLQ   $3, INC_X
        +	MOVQ   incY+64(FP), INC_Y      // INC_Y = incY * sizeof(complex64)
        +	SHLQ   $3, INC_Y
        +	MOVSS  $(-1.0), NEG1
        +	SHUFPS $0, NEG1, NEG1          // { -1, -1, -1, -1 }
        +
        +	MOVQ LEN, TAIL
        +	ANDQ $3, TAIL  // TAIL = LEN % 4
        +	SHRQ $2, LEN   // LEN = floor( LEN / 4 )
        +	JZ   dotc_tail // if LEN == 0 { goto dotc_tail }
        +
        +	MOVUPS NEG1, P_NEG1              // Copy NEG1 for pipelining
        +	LEAQ   (INC_X)(INC_X*2), INCx3_X // INCx3_X = INC_X * 3
        +	LEAQ   (INC_Y)(INC_Y*2), INCx3_Y // INCx3_Y = INC_Y * 3
        +
        +dotc_loop: // do {
        +	MOVSD (X_PTR), X3            // X_i = { imag(x[i]), real(x[i]) }
        +	MOVSD (X_PTR)(INC_X*1), X5
        +	MOVSD (X_PTR)(INC_X*2), X7
        +	MOVSD (X_PTR)(INCx3_X*1), X9
        +
        +	// X_(i-1) = { imag(x[i]), imag(x[i]) }
        +	MOVSHDUP_X3_X2
        +	MOVSHDUP_X5_X4
        +	MOVSHDUP_X7_X6
        +	MOVSHDUP_X9_X8
        +
        +	// X_i = { real(x[i]), real(x[i]) }
        +	MOVSLDUP_X3_X3
        +	MOVSLDUP_X5_X5
        +	MOVSLDUP_X7_X7
        +	MOVSLDUP_X9_X9
        +
        +	// X_(i-1) = { -imag(x[i]), -imag(x[i]) }
        +	MULPS NEG1, X2
        +	MULPS P_NEG1, X4
        +	MULPS NEG1, X6
        +	MULPS P_NEG1, X8
        +
        +	// X_j = { imag(y[i]), real(y[i]) }
        +	MOVSD (Y_PTR), X10
        +	MOVSD (Y_PTR)(INC_Y*1), X11
        +	MOVSD (Y_PTR)(INC_Y*2), X12
        +	MOVSD (Y_PTR)(INCx3_Y*1), X13
        +
        +	// X_i     = { imag(y[i]) * real(x[i]), real(y[i]) * real(x[i]) }
        +	MULPS X10, X3
        +	MULPS X11, X5
        +	MULPS X12, X7
        +	MULPS X13, X9
        +
        +	// X_j = { real(y[i]), imag(y[i]) }
        +	SHUFPS $0xB1, X10, X10
        +	SHUFPS $0xB1, X11, X11
        +	SHUFPS $0xB1, X12, X12
        +	SHUFPS $0xB1, X13, X13
        +
        +	// X_(i-1) = { real(y[i]) * imag(x[i]), imag(y[i]) * imag(x[i]) }
        +	MULPS X10, X2
        +	MULPS X11, X4
        +	MULPS X12, X6
        +	MULPS X13, X8
        +
        +	// X_i = {
        +	//	imag(result[i]):  imag(y[i]) * real(x[i]) + real(y[i]) * imag(x[i]),
        +	//	real(result[i]):  real(y[i]) * real(x[i]) - imag(y[i]) * imag(x[i])  }
        +	ADDSUBPS_X2_X3
        +	ADDSUBPS_X4_X5
        +	ADDSUBPS_X6_X7
        +	ADDSUBPS_X8_X9
        +
        +	// SUM += X_i
        +	ADDPS X3, SUM
        +	ADDPS X5, P_SUM
        +	ADDPS X7, SUM
        +	ADDPS X9, P_SUM
        +
        +	LEAQ (X_PTR)(INC_X*4), X_PTR // X_PTR = &(X_PTR[INC_X*4])
        +	LEAQ (Y_PTR)(INC_Y*4), Y_PTR // Y_PTR = &(Y_PTR[INC_Y*4])
        +
        +	DECQ LEN
        +	JNZ  dotc_loop // } while --LEN > 0
        +
        +	ADDPS P_SUM, SUM // SUM = { P_SUM + SUM }
        +	CMPQ  TAIL, $0   // if TAIL == 0 { return }
        +	JE    dotc_end
        +
        +dotc_tail: // do {
        +	MOVSD  (X_PTR), X3    // X_i = { imag(x[i]), real(x[i]) }
        +	MOVSHDUP_X3_X2        // X_(i-1) = { imag(x[i]), imag(x[i]) }
        +	MOVSLDUP_X3_X3        // X_i = { real(x[i]), real(x[i]) }
        +	MULPS  NEG1, X2       // X_(i-1) = { -imag(x[i]), imag(x[i]) }
        +	MOVUPS (Y_PTR), X10   // X_j = { imag(y[i]), real(y[i]) }
        +	MULPS  X10, X3        // X_i = { imag(y[i]) * real(x[i]), real(y[i]) * real(x[i]) }
        +	SHUFPS $0x1, X10, X10 // X_j = { real(y[i]), imag(y[i]) }
        +	MULPS  X10, X2        // X_(i-1) = { real(y[i]) * imag(x[i]), imag(y[i]) * imag(x[i]) }
        +
        +	// X_i = {
        +	//	imag(result[i]):  imag(y[i])*real(x[i]) + real(y[i])*imag(x[i]),
        +	//	real(result[i]):  real(y[i])*real(x[i]) - imag(y[i])*imag(x[i]) }
        +	ADDSUBPS_X2_X3
        +	ADDPS X3, SUM      // SUM += X_i
        +	ADDQ  INC_X, X_PTR // X_PTR += INC_X
        +	ADDQ  INC_Y, Y_PTR // Y_PTR += INC_Y
        +	DECQ  TAIL
        +	JNZ   dotc_tail    // } while --TAIL > 0
        +
        +dotc_end:
        +	MOVSD SUM, sum+88(FP) // return SUM
        +	RET
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/c64/dotcunitary_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/c64/dotcunitary_amd64.s
        new file mode 100644
        index 000000000..4efc52b1a
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/c64/dotcunitary_amd64.s
        @@ -0,0 +1,208 @@
        +// Copyright ©2017 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// +build !noasm,!appengine,!safe
        +
        +#include "textflag.h"
        +
        +#define MOVSLDUP_XPTR_IDX_8__X3    LONG $0x1C120FF3; BYTE $0xC6 // MOVSLDUP (SI)(AX*8), X3
        +#define MOVSLDUP_16_XPTR_IDX_8__X5    LONG $0x6C120FF3; WORD $0x10C6 // MOVSLDUP 16(SI)(AX*8), X5
        +#define MOVSLDUP_32_XPTR_IDX_8__X7    LONG $0x7C120FF3; WORD $0x20C6 // MOVSLDUP 32(SI)(AX*8), X7
        +#define MOVSLDUP_48_XPTR_IDX_8__X9    LONG $0x120F44F3; WORD $0xC64C; BYTE $0x30 // MOVSLDUP 48(SI)(AX*8), X9
        +
        +#define MOVSHDUP_XPTR_IDX_8__X2    LONG $0x14160FF3; BYTE $0xC6 // MOVSHDUP (SI)(AX*8), X2
        +#define MOVSHDUP_16_XPTR_IDX_8__X4    LONG $0x64160FF3; WORD $0x10C6 // MOVSHDUP 16(SI)(AX*8), X4
        +#define MOVSHDUP_32_XPTR_IDX_8__X6    LONG $0x74160FF3; WORD $0x20C6 // MOVSHDUP 32(SI)(AX*8), X6
        +#define MOVSHDUP_48_XPTR_IDX_8__X8    LONG $0x160F44F3; WORD $0xC644; BYTE $0x30 // MOVSHDUP 48(SI)(AX*8), X8
        +
        +#define MOVSHDUP_X3_X2    LONG $0xD3160FF3 // MOVSHDUP X3, X2
        +#define MOVSLDUP_X3_X3    LONG $0xDB120FF3 // MOVSLDUP X3, X3
        +
        +#define ADDSUBPS_X2_X3    LONG $0xDAD00FF2 // ADDSUBPS X2, X3
        +#define ADDSUBPS_X4_X5    LONG $0xECD00FF2 // ADDSUBPS X4, X5
        +#define ADDSUBPS_X6_X7    LONG $0xFED00FF2 // ADDSUBPS X6, X7
        +#define ADDSUBPS_X8_X9    LONG $0xD00F45F2; BYTE $0xC8 // ADDSUBPS X8, X9
        +
        +#define X_PTR SI
        +#define Y_PTR DI
        +#define LEN CX
        +#define TAIL BX
        +#define SUM X0
        +#define P_SUM X1
        +#define IDX AX
        +#define I_IDX DX
        +#define NEG1 X15
        +#define P_NEG1 X14
        +
        +// func DotcUnitary(x, y []complex64) (sum complex64)
        +TEXT ·DotcUnitary(SB), NOSPLIT, $0
        +	MOVQ    x_base+0(FP), X_PTR  // X_PTR = &x
        +	MOVQ    y_base+24(FP), Y_PTR // Y_PTR = &y
        +	PXOR    SUM, SUM             // SUM = 0
        +	PXOR    P_SUM, P_SUM         // P_SUM = 0
        +	MOVQ    x_len+8(FP), LEN     // LEN = min( len(x), len(y) )
        +	CMPQ    y_len+32(FP), LEN
        +	CMOVQLE y_len+32(FP), LEN
        +	CMPQ    LEN, $0              // if LEN == 0 { return }
        +	JE      dotc_end
        +	XORQ    IDX, IDX             // i = 0
        +	MOVSS   $(-1.0), NEG1
        +	SHUFPS  $0, NEG1, NEG1       // { -1, -1, -1, -1 }
        +
        +	MOVQ X_PTR, DX
        +	ANDQ $15, DX      // DX = &x & 15
        +	JZ   dotc_aligned // if DX == 0 { goto dotc_aligned }
        +
        +	MOVSD  (X_PTR)(IDX*8), X3  // X_i     = { imag(x[i]), real(x[i]) }
        +	MOVSHDUP_X3_X2             // X_(i-1) = { imag(x[i]), imag(x[i]) }
        +	MOVSLDUP_X3_X3             // X_i     = { real(x[i]), real(x[i]) }
        +	MOVSD  (Y_PTR)(IDX*8), X10 // X_j     = { imag(y[i]), real(y[i]) }
        +	MULPS  NEG1, X2            // X_(i-1) = { -imag(x[i]), imag(x[i]) }
        +	MULPS  X10, X3             // X_i     = { imag(y[i]) * real(x[i]), real(y[i]) * real(x[i]) }
        +	SHUFPS $0x1, X10, X10      // X_j     = { real(y[i]), imag(y[i]) }
        +	MULPS  X10, X2             // X_(i-1) = { real(y[i]) * imag(x[i]), imag(y[i]) * imag(x[i]) }
        +
        +	// X_i = {
        +	//	imag(result[i]):  imag(y[i])*real(x[i]) + real(y[i])*imag(x[i]),
        +	//	real(result[i]):  real(y[i])*real(x[i]) - imag(y[i])*imag(x[i]) }
        +	ADDSUBPS_X2_X3
        +
        +	MOVAPS X3, SUM  // SUM = X_i
        +	INCQ   IDX      // IDX++
        +	DECQ   LEN      // LEN--
        +	JZ     dotc_ret // if LEN == 0 { goto dotc_ret }
        +
        +dotc_aligned:
        +	MOVQ   LEN, TAIL
        +	ANDQ   $7, TAIL     // TAIL = LEN % 8
        +	SHRQ   $3, LEN      // LEN = floor( LEN / 8 )
        +	JZ     dotc_tail    // if LEN == 0 { return }
        +	MOVUPS NEG1, P_NEG1 // Copy NEG1 for pipelining
        +
        +dotc_loop: // do {
        +	MOVSLDUP_XPTR_IDX_8__X3    // X_i = { real(x[i]), real(x[i]), real(x[i+1]), real(x[i+1]) }
        +	MOVSLDUP_16_XPTR_IDX_8__X5
        +	MOVSLDUP_32_XPTR_IDX_8__X7
        +	MOVSLDUP_48_XPTR_IDX_8__X9
        +
        +	MOVSHDUP_XPTR_IDX_8__X2    // X_(i-1) = { imag(x[i]), imag(x[i]), imag(x[i+1]), imag(x[i+1]) }
        +	MOVSHDUP_16_XPTR_IDX_8__X4
        +	MOVSHDUP_32_XPTR_IDX_8__X6
        +	MOVSHDUP_48_XPTR_IDX_8__X8
        +
        +	// X_j = { imag(y[i]), real(y[i]), imag(y[i+1]), real(y[i+1]) }
        +	MOVUPS (Y_PTR)(IDX*8), X10
        +	MOVUPS 16(Y_PTR)(IDX*8), X11
        +	MOVUPS 32(Y_PTR)(IDX*8), X12
        +	MOVUPS 48(Y_PTR)(IDX*8), X13
        +
        +	// X_(i-1) = { -imag(x[i]), -imag(x[i]), -imag(x[i]+1), -imag(x[i]+1) }
        +	MULPS NEG1, X2
        +	MULPS P_NEG1, X4
        +	MULPS NEG1, X6
        +	MULPS P_NEG1, X8
        +
        +	// X_i     = {  imag(y[i])   * real(x[i]),   real(y[i])   * real(x[i]),
        +	// 		imag(y[i+1]) * real(x[i+1]), real(y[i+1]) * real(x[i+1])  }
        +	MULPS X10, X3
        +	MULPS X11, X5
        +	MULPS X12, X7
        +	MULPS X13, X9
        +
        +	// X_j = { real(y[i]), imag(y[i]), real(y[i+1]), imag(y[i+1]) }
        +	SHUFPS $0xB1, X10, X10
        +	SHUFPS $0xB1, X11, X11
        +	SHUFPS $0xB1, X12, X12
        +	SHUFPS $0xB1, X13, X13
        +
        +	// X_(i-1) = {  real(y[i])   * imag(x[i]),   imag(y[i])   * imag(x[i]),
        +	//		real(y[i+1]) * imag(x[i+1]), imag(y[i+1]) * imag(x[i+1])  }
        +	MULPS X10, X2
        +	MULPS X11, X4
        +	MULPS X12, X6
        +	MULPS X13, X8
        +
        +	// X_i = {
        +	//	imag(result[i]):   imag(y[i])   * real(x[i])   + real(y[i])   * imag(x[i]),
        +	//	real(result[i]):   real(y[i])   * real(x[i])   - imag(y[i])   * imag(x[i]),
        +	//	imag(result[i+1]): imag(y[i+1]) * real(x[i+1]) + real(y[i+1]) * imag(x[i+1]),
        +	//	real(result[i+1]): real(y[i+1]) * real(x[i+1]) - imag(y[i+1]) * imag(x[i+1]),
        +	//  }
        +	ADDSUBPS_X2_X3
        +	ADDSUBPS_X4_X5
        +	ADDSUBPS_X6_X7
        +	ADDSUBPS_X8_X9
        +
        +	// SUM += X_i
        +	ADDPS X3, SUM
        +	ADDPS X5, P_SUM
        +	ADDPS X7, SUM
        +	ADDPS X9, P_SUM
        +
        +	ADDQ $8, IDX   // IDX += 8
        +	DECQ LEN
        +	JNZ  dotc_loop // } while --LEN > 0
        +
        +	ADDPS SUM, P_SUM // P_SUM = { P_SUM[1] + SUM[1], P_SUM[0] + SUM[0] }
        +	XORPS SUM, SUM   // SUM = 0
        +
        +	CMPQ TAIL, $0 // if TAIL == 0 { return }
        +	JE   dotc_end
        +
        +dotc_tail:
        +	MOVQ TAIL, LEN
        +	SHRQ $1, LEN       // LEN = floor( LEN / 2 )
        +	JZ   dotc_tail_one // if LEN == 0 { goto dotc_tail_one }
        +
        +dotc_tail_two: // do {
        +	MOVSLDUP_XPTR_IDX_8__X3    // X_i = { real(x[i]), real(x[i]), real(x[i+1]), real(x[i+1]) }
        +	MOVSHDUP_XPTR_IDX_8__X2    // X_(i-1) = { imag(x[i]), imag(x[i]), imag(x[i]+1), imag(x[i]+1) }
        +	MOVUPS (Y_PTR)(IDX*8), X10 // X_j = { imag(y[i]), real(y[i]) }
        +	MULPS  NEG1, X2            // X_(i-1) = { -imag(x[i]), imag(x[i]) }
        +	MULPS  X10, X3             // X_i = { imag(y[i]) * real(x[i]), real(y[i]) * real(x[i]) }
        +	SHUFPS $0xB1, X10, X10     // X_j = { real(y[i]), imag(y[i]) }
        +	MULPS  X10, X2             // X_(i-1) = { real(y[i]) * imag(x[i]), imag(y[i]) * imag(x[i]) }
        +
        +	// X_i = {
        +	//	imag(result[i]):  imag(y[i])*real(x[i]) + real(y[i])*imag(x[i]),
        +	//	real(result[i]):  real(y[i])*real(x[i]) - imag(y[i])*imag(x[i]) }
        +	ADDSUBPS_X2_X3
        +
        +	ADDPS X3, SUM // SUM += X_i
        +
        +	ADDQ $2, IDX       // IDX += 2
        +	DECQ LEN
        +	JNZ  dotc_tail_two // } while --LEN > 0
        +
        +	ADDPS SUM, P_SUM // P_SUM = { P_SUM[1] + SUM[1], P_SUM[0] + SUM[0] }
        +	XORPS SUM, SUM   // SUM = 0
        +
        +	ANDQ $1, TAIL
        +	JZ   dotc_end
        +
        +dotc_tail_one:
        +	MOVSD  (X_PTR)(IDX*8), X3  // X_i = { imag(x[i]), real(x[i]) }
        +	MOVSHDUP_X3_X2             // X_(i-1) = { imag(x[i]), imag(x[i]) }
        +	MOVSLDUP_X3_X3             // X_i = { real(x[i]), real(x[i]) }
        +	MOVSD  (Y_PTR)(IDX*8), X10 // X_j = { imag(y[i]), real(y[i]) }
        +	MULPS  NEG1, X2            // X_(i-1) = { -imag(x[i]), imag(x[i]) }
        +	MULPS  X10, X3             // X_i = { imag(y[i]) * real(x[i]), real(y[i]) * real(x[i]) }
        +	SHUFPS $0x1, X10, X10      // X_j = { real(y[i]), imag(y[i]) }
        +	MULPS  X10, X2             // X_(i-1) = { real(y[i]) * imag(x[i]), imag(y[i]) * imag(x[i]) }
        +
        +	// X_i = {
        +	//	imag(result[i]):  imag(y[i])*real(x[i]) + real(y[i])*imag(x[i]),
        +	//	real(result[i]):  real(y[i])*real(x[i]) - imag(y[i])*imag(x[i]) }
        +	ADDSUBPS_X2_X3
        +
        +	ADDPS X3, SUM // SUM += X_i
        +
        +dotc_end:
        +	ADDPS   P_SUM, SUM   // SUM = { P_SUM[0] + SUM[0] }
        +	MOVHLPS P_SUM, P_SUM // P_SUM = { P_SUM[1], P_SUM[1] }
        +	ADDPS   P_SUM, SUM   // SUM = { P_SUM[1] + SUM[0] }
        +
        +dotc_ret:
        +	MOVSD SUM, sum+48(FP) // return SUM
        +	RET
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/c64/dotuinc_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/c64/dotuinc_amd64.s
        new file mode 100644
        index 000000000..6b26c5ab7
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/c64/dotuinc_amd64.s
        @@ -0,0 +1,148 @@
        +// Copyright ©2016 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// +build !noasm,!appengine,!safe
        +
        +#include "textflag.h"
        +
        +#define MOVSHDUP_X3_X2    LONG $0xD3160FF3 // MOVSHDUP X3, X2
        +#define MOVSHDUP_X5_X4    LONG $0xE5160FF3 // MOVSHDUP X5, X4
        +#define MOVSHDUP_X7_X6    LONG $0xF7160FF3 // MOVSHDUP X7, X6
        +#define MOVSHDUP_X9_X8    LONG $0x160F45F3; BYTE $0xC1 // MOVSHDUP X9, X8
        +
        +#define MOVSLDUP_X3_X3    LONG $0xDB120FF3 // MOVSLDUP X3, X3
        +#define MOVSLDUP_X5_X5    LONG $0xED120FF3 // MOVSLDUP X5, X5
        +#define MOVSLDUP_X7_X7    LONG $0xFF120FF3 // MOVSLDUP X7, X7
        +#define MOVSLDUP_X9_X9    LONG $0x120F45F3; BYTE $0xC9 // MOVSLDUP X9, X9
        +
        +#define ADDSUBPS_X2_X3    LONG $0xDAD00FF2 // ADDSUBPS X2, X3
        +#define ADDSUBPS_X4_X5    LONG $0xECD00FF2 // ADDSUBPS X4, X5
        +#define ADDSUBPS_X6_X7    LONG $0xFED00FF2 // ADDSUBPS X6, X7
        +#define ADDSUBPS_X8_X9    LONG $0xD00F45F2; BYTE $0xC8 // ADDSUBPS X8, X9
        +
        +#define X_PTR SI
        +#define Y_PTR DI
        +#define LEN CX
        +#define TAIL BX
        +#define SUM X0
        +#define P_SUM X1
        +#define INC_X R8
        +#define INCx3_X R9
        +#define INC_Y R10
        +#define INCx3_Y R11
        +
        +// func DotuInc(x, y []complex64, n, incX, incY, ix, iy uintptr) (sum complex64)
        +TEXT ·DotuInc(SB), NOSPLIT, $0
        +	MOVQ x_base+0(FP), X_PTR     // X_PTR = &x
        +	MOVQ y_base+24(FP), Y_PTR    // Y_PTR = &y
        +	PXOR SUM, SUM                // SUM = 0
        +	PXOR P_SUM, P_SUM            // P_SUM = 0
        +	MOVQ n+48(FP), LEN           // LEN = n
        +	CMPQ LEN, $0                 // if LEN == 0 { return }
        +	JE   dotu_end
        +	MOVQ ix+72(FP), INC_X
        +	MOVQ iy+80(FP), INC_Y
        +	LEAQ (X_PTR)(INC_X*8), X_PTR // X_PTR = &(X_PTR[ix])
        +	LEAQ (Y_PTR)(INC_Y*8), Y_PTR // Y_PTR = &(Y_PTR[iy])
        +	MOVQ incX+56(FP), INC_X      // INC_X = incX * sizeof(complex64)
        +	SHLQ $3, INC_X
        +	MOVQ incY+64(FP), INC_Y      // INC_Y = incY * sizeof(complex64)
        +	SHLQ $3, INC_Y
        +
        +	MOVQ LEN, TAIL
        +	ANDQ $3, TAIL  // TAIL = LEN % 4
        +	SHRQ $2, LEN   // LEN = floor( LEN / 4 )
        +	JZ   dotu_tail // if TAIL == 0 { goto dotu_tail }
        +
        +	LEAQ (INC_X)(INC_X*2), INCx3_X // INCx3_X = INC_X * 3
        +	LEAQ (INC_Y)(INC_Y*2), INCx3_Y // INCx3_Y = INC_Y * 3
        +
        +dotu_loop: // do {
        +	MOVSD (X_PTR), X3            // X_i = { imag(x[i]), real(x[i]) }
        +	MOVSD (X_PTR)(INC_X*1), X5
        +	MOVSD (X_PTR)(INC_X*2), X7
        +	MOVSD (X_PTR)(INCx3_X*1), X9
        +
        +	// X_(i-1) = { imag(x[i]), imag(x[i]) }
        +	MOVSHDUP_X3_X2
        +	MOVSHDUP_X5_X4
        +	MOVSHDUP_X7_X6
        +	MOVSHDUP_X9_X8
        +
        +	// X_i = { real(x[i]), real(x[i]) }
        +	MOVSLDUP_X3_X3
        +	MOVSLDUP_X5_X5
        +	MOVSLDUP_X7_X7
        +	MOVSLDUP_X9_X9
        +
        +	// X_j = { imag(y[i]), real(y[i]) }
        +	MOVSD (Y_PTR), X10
        +	MOVSD (Y_PTR)(INC_Y*1), X11
        +	MOVSD (Y_PTR)(INC_Y*2), X12
        +	MOVSD (Y_PTR)(INCx3_Y*1), X13
        +
        +	// X_i = { imag(y[i]) * real(x[i]), real(y[i]) * real(x[i]) }
        +	MULPS X10, X3
        +	MULPS X11, X5
        +	MULPS X12, X7
        +	MULPS X13, X9
        +
        +	// X_j = { real(y[i]), imag(y[i]) }
        +	SHUFPS $0xB1, X10, X10
        +	SHUFPS $0xB1, X11, X11
        +	SHUFPS $0xB1, X12, X12
        +	SHUFPS $0xB1, X13, X13
        +
        +	// X_(i-1) = { real(y[i]) * imag(x[i]), imag(y[i]) * imag(x[i]) }
        +	MULPS X10, X2
        +	MULPS X11, X4
        +	MULPS X12, X6
        +	MULPS X13, X8
        +
        +	// X_i = {
        +	//	imag(result[i]):  imag(y[i]) * real(x[i]) + real(y[i]) * imag(x[i]),
        +	//	real(result[i]):  real(y[i]) * real(x[i]) - imag(y[i]) * imag(x[i])  }
        +	ADDSUBPS_X2_X3
        +	ADDSUBPS_X4_X5
        +	ADDSUBPS_X6_X7
        +	ADDSUBPS_X8_X9
        +
        +	// SUM += X_i
        +	ADDPS X3, SUM
        +	ADDPS X5, P_SUM
        +	ADDPS X7, SUM
        +	ADDPS X9, P_SUM
        +
        +	LEAQ (X_PTR)(INC_X*4), X_PTR // X_PTR = &(X_PTR[INC_X*4])
        +	LEAQ (Y_PTR)(INC_Y*4), Y_PTR // Y_PTR = &(Y_PTR[INC_Y*4])
        +
        +	DECQ LEN
        +	JNZ  dotu_loop // } while --LEN > 0
        +
        +	ADDPS P_SUM, SUM // SUM = { P_SUM + SUM }
        +	CMPQ  TAIL, $0   // if TAIL == 0 { return }
        +	JE    dotu_end
        +
        +dotu_tail: // do {
        +	MOVSD  (X_PTR), X3    // X_i = { imag(x[i]), real(x[i]) }
        +	MOVSHDUP_X3_X2        // X_(i-1) = { imag(x[i]), imag(x[i]) }
        +	MOVSLDUP_X3_X3        // X_i = { real(x[i]), real(x[i]) }
        +	MOVUPS (Y_PTR), X10   // X_j = { imag(y[i]), real(y[i]) }
        +	MULPS  X10, X3        // X_i = { imag(y[i]) * real(x[i]), real(y[i]) * real(x[i]) }
        +	SHUFPS $0x1, X10, X10 // X_j = { real(y[i]), imag(y[i]) }
        +	MULPS  X10, X2        // X_(i-1) = { real(y[i]) * imag(x[i]), imag(y[i]) * imag(x[i]) }
        +
        +	// X_i = {
        +	//	imag(result[i]):  imag(y[i])*real(x[i]) + real(y[i])*imag(x[i]),
        +	//	real(result[i]):  real(y[i])*real(x[i]) - imag(y[i])*imag(x[i])  }
        +	ADDSUBPS_X2_X3
        +	ADDPS X3, SUM      // SUM += X_i
        +	ADDQ  INC_X, X_PTR // X_PTR += INC_X
        +	ADDQ  INC_Y, Y_PTR // Y_PTR += INC_Y
        +	DECQ  TAIL
        +	JNZ   dotu_tail    // } while --TAIL > 0
        +
        +dotu_end:
        +	MOVSD SUM, sum+88(FP) // return SUM
        +	RET
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/c64/dotuunitary_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/c64/dotuunitary_amd64.s
        new file mode 100644
        index 000000000..07a115b33
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/c64/dotuunitary_amd64.s
        @@ -0,0 +1,197 @@
        +// Copyright ©2017 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// +build !noasm,!appengine,!safe
        +
        +#include "textflag.h"
        +
        +#define MOVSLDUP_XPTR_IDX_8__X3    LONG $0x1C120FF3; BYTE $0xC6 // MOVSLDUP (SI)(AX*8), X3
        +#define MOVSLDUP_16_XPTR_IDX_8__X5    LONG $0x6C120FF3; WORD $0x10C6 // MOVSLDUP 16(SI)(AX*8), X5
        +#define MOVSLDUP_32_XPTR_IDX_8__X7    LONG $0x7C120FF3; WORD $0x20C6 // MOVSLDUP 32(SI)(AX*8), X7
        +#define MOVSLDUP_48_XPTR_IDX_8__X9    LONG $0x120F44F3; WORD $0xC64C; BYTE $0x30 // MOVSLDUP 48(SI)(AX*8), X9
        +
        +#define MOVSHDUP_XPTR_IDX_8__X2    LONG $0x14160FF3; BYTE $0xC6 // MOVSHDUP (SI)(AX*8), X2
        +#define MOVSHDUP_16_XPTR_IDX_8__X4    LONG $0x64160FF3; WORD $0x10C6 // MOVSHDUP 16(SI)(AX*8), X4
        +#define MOVSHDUP_32_XPTR_IDX_8__X6    LONG $0x74160FF3; WORD $0x20C6 // MOVSHDUP 32(SI)(AX*8), X6
        +#define MOVSHDUP_48_XPTR_IDX_8__X8    LONG $0x160F44F3; WORD $0xC644; BYTE $0x30 // MOVSHDUP 48(SI)(AX*8), X8
        +
        +#define MOVSHDUP_X3_X2    LONG $0xD3160FF3 // MOVSHDUP X3, X2
        +#define MOVSLDUP_X3_X3    LONG $0xDB120FF3 // MOVSLDUP X3, X3
        +
        +#define ADDSUBPS_X2_X3    LONG $0xDAD00FF2 // ADDSUBPS X2, X3
        +#define ADDSUBPS_X4_X5    LONG $0xECD00FF2 // ADDSUBPS X4, X5
        +#define ADDSUBPS_X6_X7    LONG $0xFED00FF2 // ADDSUBPS X6, X7
        +#define ADDSUBPS_X8_X9    LONG $0xD00F45F2; BYTE $0xC8 // ADDSUBPS X8, X9
        +
        +#define X_PTR SI
        +#define Y_PTR DI
        +#define LEN CX
        +#define TAIL BX
        +#define SUM X0
        +#define P_SUM X1
        +#define IDX AX
        +#define I_IDX DX
        +#define NEG1 X15
        +#define P_NEG1 X14
        +
        +// func DotuUnitary(x, y []complex64) (sum complex64)
        +TEXT ·DotuUnitary(SB), NOSPLIT, $0
        +	MOVQ    x_base+0(FP), X_PTR  // X_PTR = &x
        +	MOVQ    y_base+24(FP), Y_PTR // Y_PTR = &y
        +	PXOR    SUM, SUM             // SUM = 0
        +	PXOR    P_SUM, P_SUM         // P_SUM = 0
        +	MOVQ    x_len+8(FP), LEN     // LEN = min( len(x), len(y) )
        +	CMPQ    y_len+32(FP), LEN
        +	CMOVQLE y_len+32(FP), LEN
        +	CMPQ    LEN, $0              // if LEN == 0 { return }
        +	JE      dotu_end
        +	XORQ    IDX, IDX             // IDX = 0
        +
        +	MOVQ X_PTR, DX
        +	ANDQ $15, DX      // DX = &x & 15
        +	JZ   dotu_aligned // if DX == 0 { goto dotu_aligned }
        +
        +	MOVSD  (X_PTR)(IDX*8), X3  // X_i     = { imag(x[i]), real(x[i]) }
        +	MOVSHDUP_X3_X2             // X_(i-1) = { imag(x[i]), imag(x[i]) }
        +	MOVSLDUP_X3_X3             // X_i     = { real(x[i]), real(x[i]) }
        +	MOVSD  (Y_PTR)(IDX*8), X10 // X_j     = { imag(y[i]), real(y[i]) }
        +	MULPS  X10, X3             // X_i     = { imag(y[i]) * real(x[i]), real(y[i]) * real(x[i]) }
        +	SHUFPS $0x1, X10, X10      // X_j     = { real(y[i]), imag(y[i]) }
        +	MULPS  X10, X2             // X_(i-1) = { real(y[i]) * imag(x[i]), imag(y[i]) * imag(x[i]) }
        +
        +	// X_i = {
        +	//	imag(result[i]):  imag(y[i])*real(x[i]) + real(y[i])*imag(x[i]),
        +	//	real(result[i]):  real(y[i])*real(x[i]) - imag(y[i])*imag(x[i]) }
        +	ADDSUBPS_X2_X3
        +
        +	MOVAPS X3, SUM  // SUM = X_i
        +	INCQ   IDX      // IDX++
        +	DECQ   LEN      // LEN--
        +	JZ     dotu_end // if LEN == 0 { goto dotu_end }
        +
        +dotu_aligned:
        +	MOVQ LEN, TAIL
        +	ANDQ $7, TAIL     // TAIL = LEN % 8
        +	SHRQ $3, LEN      // LEN = floor( LEN / 8 )
        +	JZ   dotu_tail    // if LEN == 0 { goto dotu_tail }
        +	PXOR P_SUM, P_SUM
        +
        +dotu_loop: // do {
        +	MOVSLDUP_XPTR_IDX_8__X3    // X_i = { real(x[i]), real(x[i]), real(x[i+1]), real(x[i+1]) }
        +	MOVSLDUP_16_XPTR_IDX_8__X5
        +	MOVSLDUP_32_XPTR_IDX_8__X7
        +	MOVSLDUP_48_XPTR_IDX_8__X9
        +
        +	MOVSHDUP_XPTR_IDX_8__X2    // X_(i-1) = { imag(x[i]), imag(x[i]), imag(x[i]+1), imag(x[i]+1) }
        +	MOVSHDUP_16_XPTR_IDX_8__X4
        +	MOVSHDUP_32_XPTR_IDX_8__X6
        +	MOVSHDUP_48_XPTR_IDX_8__X8
        +
        +	// X_j = { imag(y[i]), real(y[i]), imag(y[i+1]), real(y[i+1]) }
        +	MOVUPS (Y_PTR)(IDX*8), X10
        +	MOVUPS 16(Y_PTR)(IDX*8), X11
        +	MOVUPS 32(Y_PTR)(IDX*8), X12
        +	MOVUPS 48(Y_PTR)(IDX*8), X13
        +
        +	// X_i     = {  imag(y[i])   * real(x[i]),   real(y[i])   * real(x[i]),
        +	// 		imag(y[i+1]) * real(x[i+1]), real(y[i+1]) * real(x[i+1])  }
        +	MULPS X10, X3
        +	MULPS X11, X5
        +	MULPS X12, X7
        +	MULPS X13, X9
        +
        +	// X_j = { real(y[i]), imag(y[i]), real(y[i+1]), imag(y[i+1]) }
        +	SHUFPS $0xB1, X10, X10
        +	SHUFPS $0xB1, X11, X11
        +	SHUFPS $0xB1, X12, X12
        +	SHUFPS $0xB1, X13, X13
        +
        +	// X_(i-1) = {  real(y[i])   * imag(x[i]),   imag(y[i])   * imag(x[i]),
        +	//		real(y[i+1]) * imag(x[i+1]), imag(y[i+1]) * imag(x[i+1])  }
        +	MULPS X10, X2
        +	MULPS X11, X4
        +	MULPS X12, X6
        +	MULPS X13, X8
        +
        +	// X_i = {
        +	//	imag(result[i]):   imag(y[i])   * real(x[i])   + real(y[i])   * imag(x[i]),
        +	//	real(result[i]):   real(y[i])   * real(x[i])   - imag(y[i])   * imag(x[i]),
        +	//	imag(result[i+1]): imag(y[i+1]) * real(x[i+1]) + real(y[i+1]) * imag(x[i+1]),
        +	//	real(result[i+1]): real(y[i+1]) * real(x[i+1]) - imag(y[i+1]) * imag(x[i+1]),
        +	//  }
        +	ADDSUBPS_X2_X3
        +	ADDSUBPS_X4_X5
        +	ADDSUBPS_X6_X7
        +	ADDSUBPS_X8_X9
        +
        +	// SUM += X_i
        +	ADDPS X3, SUM
        +	ADDPS X5, P_SUM
        +	ADDPS X7, SUM
        +	ADDPS X9, P_SUM
        +
        +	ADDQ $8, IDX   // IDX += 8
        +	DECQ LEN
        +	JNZ  dotu_loop // } while --LEN > 0
        +
        +	ADDPS SUM, P_SUM // P_SUM = { P_SUM[1] + SUM[1], P_SUM[0] + SUM[0] }
        +	XORPS SUM, SUM   // SUM = 0
        +
        +	CMPQ TAIL, $0 // if TAIL == 0 { return }
        +	JE   dotu_end
        +
        +dotu_tail:
        +	MOVQ TAIL, LEN
        +	SHRQ $1, LEN       // LEN = floor( LEN / 2 )
        +	JZ   dotu_tail_one // if LEN == 0 { goto dotc_tail_one }
        +
        +dotu_tail_two: // do {
        +	MOVSLDUP_XPTR_IDX_8__X3    // X_i = { real(x[i]), real(x[i]), real(x[i+1]), real(x[i+1]) }
        +	MOVSHDUP_XPTR_IDX_8__X2    // X_(i-1) = { imag(x[i]), imag(x[i]), imag(x[i]+1), imag(x[i]+1) }
        +	MOVUPS (Y_PTR)(IDX*8), X10 // X_j = { imag(y[i]), real(y[i]) }
        +	MULPS  X10, X3             // X_i = { imag(y[i]) * real(x[i]), real(y[i]) * real(x[i]) }
        +	SHUFPS $0xB1, X10, X10     // X_j = { real(y[i]), imag(y[i]) }
        +	MULPS  X10, X2             // X_(i-1) = { real(y[i]) * imag(x[i]), imag(y[i]) * imag(x[i]) }
        +
        +	// X_i = {
        +	//	imag(result[i]):  imag(y[i])*real(x[i]) + real(y[i])*imag(x[i]),
        +	//	real(result[i]):  real(y[i])*real(x[i]) - imag(y[i])*imag(x[i]) }
        +	ADDSUBPS_X2_X3
        +
        +	ADDPS X3, SUM // SUM += X_i
        +
        +	ADDQ $2, IDX       // IDX += 2
        +	DECQ LEN
        +	JNZ  dotu_tail_two // } while --LEN > 0
        +
        +	ADDPS SUM, P_SUM // P_SUM = { P_SUM[1] + SUM[1], P_SUM[0] + SUM[0] }
        +	XORPS SUM, SUM   // SUM = 0
        +
        +	ANDQ $1, TAIL
        +	JZ   dotu_end
        +
        +dotu_tail_one:
        +	MOVSD  (X_PTR)(IDX*8), X3  // X_i = { imag(x[i]), real(x[i]) }
        +	MOVSHDUP_X3_X2             // X_(i-1) = { imag(x[i]), imag(x[i]) }
        +	MOVSLDUP_X3_X3             // X_i = { real(x[i]), real(x[i]) }
        +	MOVSD  (Y_PTR)(IDX*8), X10 // X_j = { imag(y[i]), real(y[i]) }
        +	MULPS  X10, X3             // X_i = { imag(y[i]) * real(x[i]), real(y[i]) * real(x[i]) }
        +	SHUFPS $0x1, X10, X10      // X_j = { real(y[i]), imag(y[i]) }
        +	MULPS  X10, X2             // X_(i-1) = { real(y[i]) * imag(x[i]), imag(y[i]) * imag(x[i]) }
        +
        +	// X_i = {
        +	//	imag(result[i]):  imag(y[i])*real(x[i]) + real(y[i])*imag(x[i]),
        +	//	real(result[i]):  real(y[i])*real(x[i]) - imag(y[i])*imag(x[i]) }
        +	ADDSUBPS_X2_X3
        +
        +	ADDPS X3, SUM // SUM += X_i
        +
        +dotu_end:
        +	ADDPS   P_SUM, SUM   // SUM = { P_SUM[0] + SUM[0] }
        +	MOVHLPS P_SUM, P_SUM // P_SUM = { P_SUM[1], P_SUM[1] }
        +	ADDPS   P_SUM, SUM   // SUM = { P_SUM[1] + SUM[0] }
        +
        +dotu_ret:
        +	MOVSD SUM, sum+48(FP) // return SUM
        +	RET
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/c64/scal.go b/vendor/gonum.org/v1/gonum/internal/asm/c64/scal.go
        new file mode 100644
        index 000000000..a84def876
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/c64/scal.go
        @@ -0,0 +1,79 @@
        +// Copyright ©2016 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package c64
        +
        +// ScalUnitary is
        +//  for i := range x {
        +//  	x[i] *= alpha
        +//  }
        +func ScalUnitary(alpha complex64, x []complex64) {
        +	for i := range x {
        +		x[i] *= alpha
        +	}
        +}
        +
        +// ScalUnitaryTo is
        +//  for i, v := range x {
        +//  	dst[i] = alpha * v
        +//  }
        +func ScalUnitaryTo(dst []complex64, alpha complex64, x []complex64) {
        +	for i, v := range x {
        +		dst[i] = alpha * v
        +	}
        +}
        +
        +// ScalInc is
        +//  var ix uintptr
        +//  for i := 0; i < int(n); i++ {
        +//  	x[ix] *= alpha
        +//  	ix += incX
        +//  }
        +func ScalInc(alpha complex64, x []complex64, n, incX uintptr) {
        +	var ix uintptr
        +	for i := 0; i < int(n); i++ {
        +		x[ix] *= alpha
        +		ix += incX
        +	}
        +}
        +
        +// ScalIncTo is
        +//  var idst, ix uintptr
        +//  for i := 0; i < int(n); i++ {
        +//  	dst[idst] = alpha * x[ix]
        +//  	ix += incX
        +//  	idst += incDst
        +//  }
        +func ScalIncTo(dst []complex64, incDst uintptr, alpha complex64, x []complex64, n, incX uintptr) {
        +	var idst, ix uintptr
        +	for i := 0; i < int(n); i++ {
        +		dst[idst] = alpha * x[ix]
        +		ix += incX
        +		idst += incDst
        +	}
        +}
        +
        +// SscalUnitary is
        +//  for i, v := range x {
        +//  	x[i] = complex(real(v)*alpha, imag(v)*alpha)
        +//  }
        +func SscalUnitary(alpha float32, x []complex64) {
        +	for i, v := range x {
        +		x[i] = complex(real(v)*alpha, imag(v)*alpha)
        +	}
        +}
        +
        +// SscalInc is
        +//  var ix uintptr
        +//  for i := 0; i < int(n); i++ {
        +//  	x[ix] = complex(real(x[ix])*alpha, imag(x[ix])*alpha)
        +//  	ix += inc
        +//  }
        +func SscalInc(alpha float32, x []complex64, n, inc uintptr) {
        +	var ix uintptr
        +	for i := 0; i < int(n); i++ {
        +		x[ix] = complex(real(x[ix])*alpha, imag(x[ix])*alpha)
        +		ix += inc
        +	}
        +}
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/c64/stubs_amd64.go b/vendor/gonum.org/v1/gonum/internal/asm/c64/stubs_amd64.go
        new file mode 100644
        index 000000000..3e12d6bcd
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/c64/stubs_amd64.go
        @@ -0,0 +1,68 @@
        +// Copyright ©2016 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// +build !noasm,!appengine,!safe
        +
        +package c64
        +
        +// AxpyUnitary is
        +//  for i, v := range x {
        +//  	y[i] += alpha * v
        +//  }
        +func AxpyUnitary(alpha complex64, x, y []complex64)
        +
        +// AxpyUnitaryTo is
        +//  for i, v := range x {
        +//  	dst[i] = alpha*v + y[i]
        +//  }
        +func AxpyUnitaryTo(dst []complex64, alpha complex64, x, y []complex64)
        +
        +// AxpyInc is
        +//  for i := 0; i < int(n); i++ {
        +//  	y[iy] += alpha * x[ix]
        +//  	ix += incX
        +//  	iy += incY
        +//  }
        +func AxpyInc(alpha complex64, x, y []complex64, n, incX, incY, ix, iy uintptr)
        +
        +// AxpyIncTo is
        +//  for i := 0; i < int(n); i++ {
        +//  	dst[idst] = alpha*x[ix] + y[iy]
        +//  	ix += incX
        +//  	iy += incY
        +//  	idst += incDst
        +//  }
        +func AxpyIncTo(dst []complex64, incDst, idst uintptr, alpha complex64, x, y []complex64, n, incX, incY, ix, iy uintptr)
        +
        +// DotcUnitary is
        +//  for i, v := range x {
        +//  	sum += y[i] * conj(v)
        +//  }
        +//  return sum
        +func DotcUnitary(x, y []complex64) (sum complex64)
        +
        +// DotcInc is
        +//  for i := 0; i < int(n); i++ {
        +//  	sum += y[iy] * conj(x[ix])
        +//  	ix += incX
        +//  	iy += incY
        +//  }
        +//  return sum
        +func DotcInc(x, y []complex64, n, incX, incY, ix, iy uintptr) (sum complex64)
        +
        +// DotuUnitary is
        +//  for i, v := range x {
        +//  	sum += y[i] * v
        +//  }
        +//  return sum
        +func DotuUnitary(x, y []complex64) (sum complex64)
        +
        +// DotuInc is
        +//  for i := 0; i < int(n); i++ {
        +//  	sum += y[iy] * x[ix]
        +//  	ix += incX
        +//  	iy += incY
        +//  }
        +//  return sum
        +func DotuInc(x, y []complex64, n, incX, incY, ix, iy uintptr) (sum complex64)
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/c64/stubs_noasm.go b/vendor/gonum.org/v1/gonum/internal/asm/c64/stubs_noasm.go
        new file mode 100644
        index 000000000..411afcb2a
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/c64/stubs_noasm.go
        @@ -0,0 +1,113 @@
        +// Copyright ©2016 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// +build !amd64 noasm appengine safe
        +
        +package c64
        +
        +// AxpyUnitary is
        +//  for i, v := range x {
        +//  	y[i] += alpha * v
        +//  }
        +func AxpyUnitary(alpha complex64, x, y []complex64) {
        +	for i, v := range x {
        +		y[i] += alpha * v
        +	}
        +}
        +
        +// AxpyUnitaryTo is
        +//  for i, v := range x {
        +//  	dst[i] = alpha*v + y[i]
        +//  }
        +func AxpyUnitaryTo(dst []complex64, alpha complex64, x, y []complex64) {
        +	for i, v := range x {
        +		dst[i] = alpha*v + y[i]
        +	}
        +}
        +
        +// AxpyInc is
        +//  for i := 0; i < int(n); i++ {
        +//  	y[iy] += alpha * x[ix]
        +//  	ix += incX
        +//  	iy += incY
        +//  }
        +func AxpyInc(alpha complex64, x, y []complex64, n, incX, incY, ix, iy uintptr) {
        +	for i := 0; i < int(n); i++ {
        +		y[iy] += alpha * x[ix]
        +		ix += incX
        +		iy += incY
        +	}
        +}
        +
        +// AxpyIncTo is
        +//  for i := 0; i < int(n); i++ {
        +//  	dst[idst] = alpha*x[ix] + y[iy]
        +//  	ix += incX
        +//  	iy += incY
        +//  	idst += incDst
        +//  }
        +func AxpyIncTo(dst []complex64, incDst, idst uintptr, alpha complex64, x, y []complex64, n, incX, incY, ix, iy uintptr) {
        +	for i := 0; i < int(n); i++ {
        +		dst[idst] = alpha*x[ix] + y[iy]
        +		ix += incX
        +		iy += incY
        +		idst += incDst
        +	}
        +}
        +
        +// DotcUnitary is
        +//  for i, v := range x {
        +//  	sum += y[i] * conj(v)
        +//  }
        +//  return sum
        +func DotcUnitary(x, y []complex64) (sum complex64) {
        +	for i, v := range x {
        +		sum += y[i] * conj(v)
        +	}
        +	return sum
        +}
        +
        +// DotcInc is
        +//  for i := 0; i < int(n); i++ {
        +//  	sum += y[iy] * conj(x[ix])
        +//  	ix += incX
        +//  	iy += incY
        +//  }
        +//  return sum
        +func DotcInc(x, y []complex64, n, incX, incY, ix, iy uintptr) (sum complex64) {
        +	for i := 0; i < int(n); i++ {
        +		sum += y[iy] * conj(x[ix])
        +		ix += incX
        +		iy += incY
        +	}
        +	return sum
        +}
        +
        +// DotuUnitary is
        +//  for i, v := range x {
        +//  	sum += y[i] * v
        +//  }
        +//  return sum
        +func DotuUnitary(x, y []complex64) (sum complex64) {
        +	for i, v := range x {
        +		sum += y[i] * v
        +	}
        +	return sum
        +}
        +
        +// DotuInc is
        +//  for i := 0; i < int(n); i++ {
        +//  	sum += y[iy] * x[ix]
        +//  	ix += incX
        +//  	iy += incY
        +//  }
        +//  return sum
        +func DotuInc(x, y []complex64, n, incX, incY, ix, iy uintptr) (sum complex64) {
        +	for i := 0; i < int(n); i++ {
        +		sum += y[iy] * x[ix]
        +		ix += incX
        +		iy += incY
        +	}
        +	return sum
        +}
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f32/axpyinc_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/f32/axpyinc_amd64.s
        index 2d167c08f..ebf360ff7 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/f32/axpyinc_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f32/axpyinc_amd64.s
        @@ -2,7 +2,7 @@
         // Use of this source code is governed by a BSD-style
         // license that can be found in the LICENSE file.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f32/axpyincto_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/f32/axpyincto_amd64.s
        index b79f9926c..4e9020e4f 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/f32/axpyincto_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f32/axpyincto_amd64.s
        @@ -2,7 +2,7 @@
         // Use of this source code is governed by a BSD-style
         // license that can be found in the LICENSE file.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f32/axpyunitary_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/f32/axpyunitary_amd64.s
        index 97df90a07..224b84255 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/f32/axpyunitary_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f32/axpyunitary_amd64.s
        @@ -2,7 +2,7 @@
         // Use of this source code is governed by a BSD-style
         // license that can be found in the LICENSE file.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f32/axpyunitaryto_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/f32/axpyunitaryto_amd64.s
        index a826ca312..e26ccff35 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/f32/axpyunitaryto_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f32/axpyunitaryto_amd64.s
        @@ -2,7 +2,7 @@
         // Use of this source code is governed by a BSD-style
         // license that can be found in the LICENSE file.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f32/ddotinc_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/f32/ddotinc_amd64.s
        index 4518e0495..de9e31292 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/f32/ddotinc_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f32/ddotinc_amd64.s
        @@ -2,7 +2,7 @@
         // Use of this source code is governed by a BSD-style
         // license that can be found in the LICENSE file.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f32/ddotunitary_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/f32/ddotunitary_amd64.s
        index 231cbd3bf..d39ab7860 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/f32/ddotunitary_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f32/ddotunitary_amd64.s
        @@ -2,7 +2,7 @@
         // Use of this source code is governed by a BSD-style
         // license that can be found in the LICENSE file.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f32/dotinc_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/f32/dotinc_amd64.s
        index 4d36b289c..b6f40210c 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/f32/dotinc_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f32/dotinc_amd64.s
        @@ -2,7 +2,7 @@
         // Use of this source code is governed by a BSD-style
         // license that can be found in the LICENSE file.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f32/dotunitary_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/f32/dotunitary_amd64.s
        index c32ede5a9..fd4f7b4e0 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/f32/dotunitary_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f32/dotunitary_amd64.s
        @@ -2,7 +2,7 @@
         // Use of this source code is governed by a BSD-style
         // license that can be found in the LICENSE file.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f32/ge_amd64.go b/vendor/gonum.org/v1/gonum/internal/asm/f32/ge_amd64.go
        index 2b336a2af..a27fcaad9 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/f32/ge_amd64.go
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f32/ge_amd64.go
        @@ -7,7 +7,7 @@
         package f32
         
         // Ger performs the rank-one operation
        -//  A += alpha * x * y^T
        +//  A += alpha * x * yᵀ
         // where A is an m×n dense matrix, x and y are vectors, and alpha is a scalar.
         func Ger(m, n uintptr, alpha float32,
         	x []float32, incX uintptr,
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f32/ge_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/f32/ge_amd64.s
        index e5e80c52c..ecb2641a9 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/f32/ge_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f32/ge_amd64.s
        @@ -2,7 +2,7 @@
         // Use of this source code is governed by a BSD-style
         // license that can be found in the LICENSE file.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f32/ge_noasm.go b/vendor/gonum.org/v1/gonum/internal/asm/f32/ge_noasm.go
        index d92f9968d..562302d88 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/f32/ge_noasm.go
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f32/ge_noasm.go
        @@ -7,7 +7,7 @@
         package f32
         
         // Ger performs the rank-one operation
        -//  A += alpha * x * y^T
        +//  A += alpha * x * yᵀ
         // where A is an m×n dense matrix, x and y are vectors, and alpha is a scalar.
         func Ger(m, n uintptr, alpha float32, x []float32, incX uintptr, y []float32, incY uintptr, a []float32, lda uintptr) {
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f32/l2norm.go b/vendor/gonum.org/v1/gonum/internal/asm/f32/l2norm.go
        new file mode 100644
        index 000000000..0f2a77405
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f32/l2norm.go
        @@ -0,0 +1,90 @@
        +// Copyright ©2019 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package f32
        +
        +import "gonum.org/v1/gonum/internal/math32"
        +
        +// L2NormUnitary is the level 2 norm of x.
        +func L2NormUnitary(x []float32) (sum float32) {
        +	var scale float32
        +	var sumSquares float32 = 1
        +	for _, v := range x {
        +		if v == 0 {
        +			continue
        +		}
        +		absxi := math32.Abs(v)
        +		if math32.IsNaN(absxi) {
        +			return math32.NaN()
        +		}
        +		if scale < absxi {
        +			s := scale / absxi
        +			sumSquares = 1 + sumSquares*s*s
        +			scale = absxi
        +		} else {
        +			s := absxi / scale
        +			sumSquares += s * s
        +		}
        +	}
        +	if math32.IsInf(scale, 1) {
        +		return math32.Inf(1)
        +	}
        +	return scale * math32.Sqrt(sumSquares)
        +}
        +
        +// L2NormInc is the level 2 norm of x.
        +func L2NormInc(x []float32, n, incX uintptr) (sum float32) {
        +	var scale float32
        +	var sumSquares float32 = 1
        +	for ix := uintptr(0); ix < n*incX; ix += incX {
        +		val := x[ix]
        +		if val == 0 {
        +			continue
        +		}
        +		absxi := math32.Abs(val)
        +		if math32.IsNaN(absxi) {
        +			return math32.NaN()
        +		}
        +		if scale < absxi {
        +			s := scale / absxi
        +			sumSquares = 1 + sumSquares*s*s
        +			scale = absxi
        +		} else {
        +			s := absxi / scale
        +			sumSquares += s * s
        +		}
        +	}
        +	if math32.IsInf(scale, 1) {
        +		return math32.Inf(1)
        +	}
        +	return scale * math32.Sqrt(sumSquares)
        +}
        +
        +// L2DistanceUnitary is the L2 norm of x-y.
        +func L2DistanceUnitary(x, y []float32) (sum float32) {
        +	var scale float32
        +	var sumSquares float32 = 1
        +	for i, v := range x {
        +		v -= y[i]
        +		if v == 0 {
        +			continue
        +		}
        +		absxi := math32.Abs(v)
        +		if math32.IsNaN(absxi) {
        +			return math32.NaN()
        +		}
        +		if scale < absxi {
        +			s := scale / absxi
        +			sumSquares = 1 + sumSquares*s*s
        +			scale = absxi
        +		} else {
        +			s := absxi / scale
        +			sumSquares += s * s
        +		}
        +	}
        +	if math32.IsInf(scale, 1) {
        +		return math32.Inf(1)
        +	}
        +	return scale * math32.Sqrt(sumSquares)
        +}
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f64/axpyinc_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/f64/axpyinc_amd64.s
        index 95fe9f904..aab22e35a 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/f64/axpyinc_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f64/axpyinc_amd64.s
        @@ -34,7 +34,7 @@
         // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
         // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f64/axpyincto_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/f64/axpyincto_amd64.s
        index dcb79d878..f2fb97715 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/f64/axpyincto_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f64/axpyincto_amd64.s
        @@ -34,7 +34,7 @@
         // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
         // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f64/axpyunitary_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/f64/axpyunitary_amd64.s
        index bc290a152..cc519cfd4 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/f64/axpyunitary_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f64/axpyunitary_amd64.s
        @@ -34,7 +34,7 @@
         // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
         // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f64/axpyunitaryto_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/f64/axpyunitaryto_amd64.s
        index 16798ebaa..3918092f5 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/f64/axpyunitaryto_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f64/axpyunitaryto_amd64.s
        @@ -34,7 +34,7 @@
         // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
         // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f64/dot_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/f64/dot_amd64.s
        index eff25059f..6daba1bae 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/f64/dot_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f64/dot_amd64.s
        @@ -34,7 +34,7 @@
         // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
         // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f64/ge_amd64.go b/vendor/gonum.org/v1/gonum/internal/asm/f64/ge_amd64.go
        index 00c99e932..506fdbbd0 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/f64/ge_amd64.go
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f64/ge_amd64.go
        @@ -7,7 +7,7 @@
         package f64
         
         // Ger performs the rank-one operation
        -//  A += alpha * x * y^T
        +//  A += alpha * x * yᵀ
         // where A is an m×n dense matrix, x and y are vectors, and alpha is a scalar.
         func Ger(m, n uintptr, alpha float64, x []float64, incX uintptr, y []float64, incY uintptr, a []float64, lda uintptr)
         
        @@ -17,6 +17,6 @@ func Ger(m, n uintptr, alpha float64, x []float64, incX uintptr, y []float64, in
         func GemvN(m, n uintptr, alpha float64, a []float64, lda uintptr, x []float64, incX uintptr, beta float64, y []float64, incY uintptr)
         
         // GemvT computes
        -//  y = alpha * A^T * x + beta * y
        +//  y = alpha * Aᵀ * x + beta * y
         // where A is an m×n dense matrix, x and y are vectors, and alpha and beta are scalars.
         func GemvT(m, n uintptr, alpha float64, a []float64, lda uintptr, x []float64, incX uintptr, beta float64, y []float64, incY uintptr)
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f64/ge_noasm.go b/vendor/gonum.org/v1/gonum/internal/asm/f64/ge_noasm.go
        index 5a2c1d35c..4b949d014 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/f64/ge_noasm.go
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f64/ge_noasm.go
        @@ -7,7 +7,7 @@
         package f64
         
         // Ger performs the rank-one operation
        -//  A += alpha * x * y^T
        +//  A += alpha * x * yᵀ
         // where A is an m×n dense matrix, x and y are vectors, and alpha is a scalar.
         func Ger(m, n uintptr, alpha float64, x []float64, incX uintptr, y []float64, incY uintptr, a []float64, lda uintptr) {
         	if incX == 1 && incY == 1 {
        @@ -73,7 +73,7 @@ func GemvN(m, n uintptr, alpha float64, a []float64, lda uintptr, x []float64, i
         }
         
         // GemvT computes
        -//  y = alpha * A^T * x + beta * y
        +//  y = alpha * Aᵀ * x + beta * y
         // where A is an m×n dense matrix, x and y are vectors, and alpha and beta are scalars.
         func GemvT(m, n uintptr, alpha float64, a []float64, lda uintptr, x []float64, incX uintptr, beta float64, y []float64, incY uintptr) {
         	var kx, ky, i uintptr
        @@ -99,7 +99,7 @@ func GemvT(m, n uintptr, alpha float64, a []float64, lda uintptr, x []float64, i
         	case int(incY) < 0:
         		ScalInc(beta, y, n, uintptr(int(-incY)))
         	case incY == 1:
        -		ScalUnitary(beta, y)
        +		ScalUnitary(beta, y[:n])
         	default:
         		ScalInc(beta, y, n, incY)
         	}
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f64/gemvN_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/f64/gemvN_amd64.s
        index 2abdddd83..f0a98f0f8 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/f64/gemvN_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f64/gemvN_amd64.s
        @@ -1,8 +1,8 @@
        -// Copyright ©2017 The gonum Authors. All rights reserved.
        +// Copyright ©2017 The Gonum Authors. All rights reserved.
         // Use of this source code is governed by a BSD-style
         // license that can be found in the LICENSE file.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f64/gemvT_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/f64/gemvT_amd64.s
        index 87ba5cbfc..87a9445e9 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/f64/gemvT_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f64/gemvT_amd64.s
        @@ -1,8 +1,8 @@
        -// Copyright ©2017 The gonum Authors. All rights reserved.
        +// Copyright ©2017 The Gonum Authors. All rights reserved.
         // Use of this source code is governed by a BSD-style
         // license that can be found in the LICENSE file.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f64/ger_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/f64/ger_amd64.s
        index 8c1b36a65..7ae5cf7c4 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/f64/ger_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f64/ger_amd64.s
        @@ -2,7 +2,7 @@
         // Use of this source code is governed by a BSD-style
         // license that can be found in the LICENSE file.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f64/l2norm_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/f64/l2norm_amd64.s
        new file mode 100644
        index 000000000..f454f752a
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f64/l2norm_amd64.s
        @@ -0,0 +1,109 @@
        +// Copyright ©2019 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// +build !noasm,!appengine,!safe
        +
        +#include "textflag.h"
        +
        +#define SUMSQ X0
        +#define ABSX X1
        +#define SCALE X2
        +#define ZERO X3
        +#define TMP X4
        +#define ABSMASK X5
        +#define INF X7
        +#define INFMASK X11
        +#define NANMASK X12
        +#define IDX AX
        +#define LEN SI
        +#define X_ DI
        +
        +#define ABSMASK_DATA l2nrodata<>+0(SB)
        +#define INF_DATA l2nrodata<>+8(SB)
        +#define NAN_DATA l2nrodata<>+16(SB)
        +// AbsMask
        +DATA l2nrodata<>+0(SB)/8, $0x7FFFFFFFFFFFFFFF
        +// Inf
        +DATA l2nrodata<>+8(SB)/8, $0x7FF0000000000000
        +// NaN
        +DATA l2nrodata<>+16(SB)/8, $0xFFF8000000000000
        +GLOBL l2nrodata<>+0(SB), RODATA, $24
        +
        +// L2NormUnitary returns the L2-norm of x.
        +// func L2NormUnitary(x []float64) (norm float64)
        +TEXT ·L2NormUnitary(SB), NOSPLIT, $0
        +	MOVQ x_len+8(FP), LEN // LEN = len(x)
        +	MOVQ x_base+0(FP), X_
        +	PXOR ZERO, ZERO
        +	CMPQ LEN, $0          // if LEN == 0 { return 0 }
        +	JZ   retZero
        +
        +	PXOR  INFMASK, INFMASK
        +	PXOR  NANMASK, NANMASK
        +	MOVSD $1.0, SUMSQ           // ssq = 1
        +	XORPS SCALE, SCALE
        +	MOVSD ABSMASK_DATA, ABSMASK
        +	MOVSD INF_DATA, INF
        +	XORQ  IDX, IDX              // idx == 0
        +
        +initZero:  // for ;x[i]==0; i++ {}
        +	// Skip all leading zeros, to avoid divide by zero NaN
        +	MOVSD   (X_)(IDX*8), ABSX // absxi = x[i]
        +	UCOMISD ABSX, ZERO
        +	JP      retNaN            // if isNaN(x[i]) { return NaN }
        +	JNE     loop              // if x[i] != 0 { goto loop }
        +	INCQ    IDX               // i++
        +	CMPQ    IDX, LEN
        +	JE      retZero           // if i == LEN { return 0 }
        +	JMP     initZero
        +
        +loop:
        +	MOVSD   (X_)(IDX*8), ABSX // absxi = x[i]
        +	MOVUPS  ABSX, TMP
        +	CMPSD   ABSX, TMP, $3
        +	ORPD    TMP, NANMASK      // NANMASK = NANMASK | IsNaN(absxi)
        +	MOVSD   INF, TMP
        +	ANDPD   ABSMASK, ABSX     // absxi == Abs(absxi)
        +	CMPSD   ABSX, TMP, $0
        +	ORPD    TMP, INFMASK      // INFMASK =  INFMASK | IsInf(absxi)
        +	UCOMISD SCALE, ABSX
        +	JA      adjScale          // IF SCALE > ABSXI { goto adjScale }
        +
        +	DIVSD SCALE, ABSX // absxi = scale / absxi
        +	MULSD ABSX, ABSX  // absxi *= absxi
        +	ADDSD ABSX, SUMSQ // sumsq += absxi
        +	INCQ  IDX         // i++
        +	CMPQ  IDX, LEN
        +	JNE   loop        // if i < LEN { continue }
        +	JMP   retSum      // if i == LEN { goto retSum }
        +
        +adjScale:  // Scale > Absxi
        +	DIVSD  ABSX, SCALE  // tmp = absxi / scale
        +	MULSD  SCALE, SUMSQ // sumsq *= tmp
        +	MULSD  SCALE, SUMSQ // sumsq *= tmp
        +	ADDSD  $1.0, SUMSQ  // sumsq += 1
        +	MOVUPS ABSX, SCALE  // scale = absxi
        +	INCQ   IDX          // i++
        +	CMPQ   IDX, LEN
        +	JNE    loop         // if i < LEN { continue }
        +
        +retSum:  // Calculate return value
        +	SQRTSD  SUMSQ, SUMSQ     // sumsq = sqrt(sumsq)
        +	MULSD   SCALE, SUMSQ     // sumsq += scale
        +	MOVQ    SUMSQ, R10       // tmp = sumsq
        +	UCOMISD ZERO, INFMASK
        +	CMOVQPS INF_DATA, R10    // if INFMASK { tmp = INF }
        +	UCOMISD ZERO, NANMASK
        +	CMOVQPS NAN_DATA, R10    // if NANMASK { tmp = NaN }
        +	MOVQ    R10, norm+24(FP) // return tmp
        +	RET
        +
        +retZero:
        +	MOVSD ZERO, norm+24(FP) // return 0
        +	RET
        +
        +retNaN:
        +	MOVSD NAN_DATA, TMP    // return NaN
        +	MOVSD TMP, norm+24(FP)
        +	RET
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f64/l2norm_noasm.go b/vendor/gonum.org/v1/gonum/internal/asm/f64/l2norm_noasm.go
        new file mode 100644
        index 000000000..1e1dfa2ef
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f64/l2norm_noasm.go
        @@ -0,0 +1,92 @@
        +// Copyright ©2019 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// +build !amd64 noasm appengine safe
        +
        +package f64
        +
        +import "math"
        +
        +// L2NormUnitary returns the L2-norm of x.
        +func L2NormUnitary(x []float64) (norm float64) {
        +	var scale float64
        +	sumSquares := 1.0
        +	for _, v := range x {
        +		if v == 0 {
        +			continue
        +		}
        +		absxi := math.Abs(v)
        +		if math.IsNaN(absxi) {
        +			return math.NaN()
        +		}
        +		if scale < absxi {
        +			s := scale / absxi
        +			sumSquares = 1 + sumSquares*s*s
        +			scale = absxi
        +		} else {
        +			s := absxi / scale
        +			sumSquares += s * s
        +		}
        +	}
        +	if math.IsInf(scale, 1) {
        +		return math.Inf(1)
        +	}
        +	return scale * math.Sqrt(sumSquares)
        +}
        +
        +// L2NormInc returns the L2-norm of x.
        +func L2NormInc(x []float64, n, incX uintptr) (norm float64) {
        +	var scale float64
        +	sumSquares := 1.0
        +	for ix := uintptr(0); ix < n*incX; ix += incX {
        +		val := x[ix]
        +		if val == 0 {
        +			continue
        +		}
        +		absxi := math.Abs(val)
        +		if math.IsNaN(absxi) {
        +			return math.NaN()
        +		}
        +		if scale < absxi {
        +			s := scale / absxi
        +			sumSquares = 1 + sumSquares*s*s
        +			scale = absxi
        +		} else {
        +			s := absxi / scale
        +			sumSquares += s * s
        +		}
        +	}
        +	if math.IsInf(scale, 1) {
        +		return math.Inf(1)
        +	}
        +	return scale * math.Sqrt(sumSquares)
        +}
        +
        +// L2DistanceUnitary returns the L2-norm of x-y.
        +func L2DistanceUnitary(x, y []float64) (norm float64) {
        +	var scale float64
        +	sumSquares := 1.0
        +	for i, v := range x {
        +		v -= y[i]
        +		if v == 0 {
        +			continue
        +		}
        +		absxi := math.Abs(v)
        +		if math.IsNaN(absxi) {
        +			return math.NaN()
        +		}
        +		if scale < absxi {
        +			s := scale / absxi
        +			sumSquares = 1 + sumSquares*s*s
        +			scale = absxi
        +		} else {
        +			s := absxi / scale
        +			sumSquares += s * s
        +		}
        +	}
        +	if math.IsInf(scale, 1) {
        +		return math.Inf(1)
        +	}
        +	return scale * math.Sqrt(sumSquares)
        +}
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f64/l2normdist_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/f64/l2normdist_amd64.s
        new file mode 100644
        index 000000000..6d1060178
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f64/l2normdist_amd64.s
        @@ -0,0 +1,115 @@
        +// Copyright ©2019 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// +build !noasm,!appengine,!safe
        +
        +#include "textflag.h"
        +
        +#define SUMSQ X0
        +#define ABSX X1
        +#define SCALE X2
        +#define ZERO X3
        +#define TMP X4
        +#define ABSMASK X5
        +#define INF X7
        +#define INFMASK X11
        +#define NANMASK X12
        +#define IDX AX
        +#define X_ DI
        +#define Y_ BX
        +#define LEN SI
        +
        +#define ABSMASK_DATA l2nrodata<>+0(SB)
        +#define INF_DATA l2nrodata<>+8(SB)
        +#define NAN_DATA l2nrodata<>+16(SB)
        +// AbsMask
        +DATA l2nrodata<>+0(SB)/8, $0x7FFFFFFFFFFFFFFF
        +// Inf
        +DATA l2nrodata<>+8(SB)/8, $0x7FF0000000000000
        +// NaN
        +DATA l2nrodata<>+16(SB)/8, $0xFFF8000000000000
        +GLOBL l2nrodata<>+0(SB), RODATA, $24
        +
        +// L2DistanceUnitary returns the L2-norm of x-y.
        +// func L2DistanceUnitary(x,y []float64) (norm float64)
        +TEXT ·L2DistanceUnitary(SB), NOSPLIT, $0
        +	MOVQ    x_base+0(FP), X_
        +	MOVQ    y_base+24(FP), Y_
        +	PXOR    ZERO, ZERO
        +	MOVQ    x_len+8(FP), LEN  // LEN = min( len(x), len(y) )
        +	CMPQ    y_len+32(FP), LEN
        +	CMOVQLE y_len+32(FP), LEN
        +	CMPQ    LEN, $0           // if LEN == 0 { return 0 }
        +	JZ      retZero
        +
        +	PXOR  INFMASK, INFMASK
        +	PXOR  NANMASK, NANMASK
        +	MOVSD $1.0, SUMSQ           // ssq = 1
        +	XORPS SCALE, SCALE
        +	MOVSD ABSMASK_DATA, ABSMASK
        +	MOVSD INF_DATA, INF
        +	XORQ  IDX, IDX              // idx == 0
        +
        +initZero:  // for ;x[i]==0; i++ {}
        +	// Skip all leading zeros, to avoid divide by zero NaN
        +	MOVSD   (X_)(IDX*8), ABSX // absxi = x[i]
        +	SUBSD   (Y_)(IDX*8), ABSX // absxi = x[i]-y[i]
        +	UCOMISD ABSX, ZERO
        +	JP      retNaN            // if isNaN(absxi) { return NaN }
        +	JNE     loop              // if absxi != 0 { goto loop }
        +	INCQ    IDX               // i++
        +	CMPQ    IDX, LEN
        +	JE      retZero           // if i == LEN { return 0 }
        +	JMP     initZero
        +
        +loop:
        +	MOVSD   (X_)(IDX*8), ABSX // absxi = x[i]
        +	SUBSD   (Y_)(IDX*8), ABSX // absxi = x[i]-y[i]
        +	MOVUPS  ABSX, TMP
        +	CMPSD   ABSX, TMP, $3
        +	ORPD    TMP, NANMASK      // NANMASK = NANMASK | IsNaN(absxi)
        +	MOVSD   INF, TMP
        +	ANDPD   ABSMASK, ABSX     // absxi == Abs(absxi)
        +	CMPSD   ABSX, TMP, $0
        +	ORPD    TMP, INFMASK      // INFMASK =  INFMASK | IsInf(absxi)
        +	UCOMISD SCALE, ABSX
        +	JA      adjScale          // IF SCALE > ABSXI { goto adjScale }
        +
        +	DIVSD SCALE, ABSX // absxi = scale / absxi
        +	MULSD ABSX, ABSX  // absxi *= absxi
        +	ADDSD ABSX, SUMSQ // sumsq += absxi
        +	INCQ  IDX         // i++
        +	CMPQ  IDX, LEN
        +	JNE   loop        // if i < LEN { continue }
        +	JMP   retSum      // if i == LEN { goto retSum }
        +
        +adjScale:  // Scale > Absxi
        +	DIVSD  ABSX, SCALE  // tmp = absxi / scale
        +	MULSD  SCALE, SUMSQ // sumsq *= tmp
        +	MULSD  SCALE, SUMSQ // sumsq *= tmp
        +	ADDSD  $1.0, SUMSQ  // sumsq += 1
        +	MOVUPS ABSX, SCALE  // scale = absxi
        +	INCQ   IDX          // i++
        +	CMPQ   IDX, LEN
        +	JNE    loop         // if i < LEN { continue }
        +
        +retSum:  // Calculate return value
        +	SQRTSD  SUMSQ, SUMSQ     // sumsq = sqrt(sumsq)
        +	MULSD   SCALE, SUMSQ     // sumsq += scale
        +	MOVQ    SUMSQ, R10       // tmp = sumsq
        +	UCOMISD ZERO, INFMASK
        +	CMOVQPS INF_DATA, R10    // if INFMASK { tmp = INF }
        +	UCOMISD ZERO, NANMASK
        +	CMOVQPS NAN_DATA, R10    // if NANMASK { tmp = NaN }
        +	MOVQ    R10, norm+48(FP) // return tmp
        +	RET
        +
        +retZero:
        +	MOVSD ZERO, norm+48(FP) // return 0
        +	RET
        +
        +retNaN:
        +	MOVSD NAN_DATA, TMP    // return NaN
        +	MOVSD TMP, norm+48(FP)
        +	RET
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f64/l2norminc_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/f64/l2norminc_amd64.s
        new file mode 100644
        index 000000000..13ccc16e1
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f64/l2norminc_amd64.s
        @@ -0,0 +1,110 @@
        +// Copyright ©2019 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// +build !noasm,!appengine,!safe
        +
        +#include "textflag.h"
        +
        +#define SUMSQ X0
        +#define ABSX X1
        +#define SCALE X2
        +#define ZERO X3
        +#define TMP X4
        +#define ABSMASK X5
        +#define INF X7
        +#define INFMASK X11
        +#define NANMASK X12
        +#define IDX AX
        +#define LEN SI
        +#define INC BX
        +#define X_ DI
        +
        +#define ABSMASK_DATA l2nrodata<>+0(SB)
        +#define INF_DATA l2nrodata<>+8(SB)
        +#define NAN_DATA l2nrodata<>+16(SB)
        +// AbsMask
        +DATA l2nrodata<>+0(SB)/8, $0x7FFFFFFFFFFFFFFF
        +// Inf
        +DATA l2nrodata<>+8(SB)/8, $0x7FF0000000000000
        +// NaN
        +DATA l2nrodata<>+16(SB)/8, $0xFFF8000000000000
        +GLOBL l2nrodata<>+0(SB), RODATA, $24
        +
        +// func L2NormInc(x []float64, n, incX uintptr) (norm float64)
        +TEXT ·L2NormInc(SB), NOSPLIT, $0
        +	MOVQ n+24(FP), LEN    // LEN = len(x)
        +	MOVQ incX+32(FP), INC
        +	MOVQ x_base+0(FP), X_
        +	XORPS ZERO, ZERO
        +	CMPQ LEN, $0          // if LEN == 0 { return 0 }
        +	JZ   retZero
        +
        +	XORPS INFMASK, INFMASK
        +	XORPS NANMASK, NANMASK
        +	MOVSD $1.0, SUMSQ           // ssq = 1
        +	XORPS SCALE, SCALE
        +	MOVSD ABSMASK_DATA, ABSMASK
        +	MOVSD INF_DATA, INF
        +	SHLQ  $3, INC               // INC *= sizeof(float64)
        +
        +initZero:  // for ;x[i]==0; i++ {}
        +	// Skip all leading zeros, to avoid divide by zero NaN
        +	MOVSD   (X_), ABSX // absxi = x[i]
        +	UCOMISD ABSX, ZERO
        +	JP      retNaN     // if isNaN(x[i]) { return NaN }
        +	JNZ     loop       // if x[i] != 0 { goto loop }
        +	ADDQ    INC, X_    // i += INC
        +	DECQ    LEN        // LEN--
        +	JZ      retZero    // if LEN == 0 { return 0 }
        +	JMP     initZero
        +
        +loop:
        +	MOVSD   (X_), ABSX    // absxi = x[i]
        +	MOVUPS  ABSX, TMP
        +	CMPSD   ABSX, TMP, $3
        +	ORPD    TMP, NANMASK  // NANMASK = NANMASK | IsNaN(absxi)
        +	MOVSD   INF, TMP
        +	ANDPD   ABSMASK, ABSX // absxi == Abs(absxi)
        +	CMPSD   ABSX, TMP, $0
        +	ORPD    TMP, INFMASK  // INFMASK =  INFMASK | IsInf(absxi)
        +	UCOMISD SCALE, ABSX
        +	JA      adjScale      // IF SCALE > ABSXI { goto adjScale }
        +
        +	DIVSD SCALE, ABSX // absxi = scale / absxi
        +	MULSD ABSX, ABSX  // absxi *= absxi
        +	ADDSD ABSX, SUMSQ // sumsq += absxi
        +	ADDQ  INC, X_     // i += INC
        +	DECQ  LEN         // LEN--
        +	JNZ   loop        // if LEN > 0 { continue }
        +	JMP   retSum      // if LEN == 0 { goto retSum }
        +
        +adjScale:  // Scale > Absxi
        +	DIVSD  ABSX, SCALE  // tmp = absxi / scale
        +	MULSD  SCALE, SUMSQ // sumsq *= tmp
        +	MULSD  SCALE, SUMSQ // sumsq *= tmp
        +	ADDSD  $1.0, SUMSQ  // sumsq += 1
        +	MOVUPS ABSX, SCALE  // scale = absxi
        +	ADDQ   INC, X_      // i += INC
        +	DECQ   LEN          // LEN--
        +	JNZ    loop         // if LEN > 0 { continue }
        +
        +retSum:  // Calculate return value
        +	SQRTSD  SUMSQ, SUMSQ     // sumsq = sqrt(sumsq)
        +	MULSD   SCALE, SUMSQ     // sumsq += scale
        +	MOVQ    SUMSQ, R10       // tmp = sumsq
        +	UCOMISD ZERO, INFMASK
        +	CMOVQPS INF_DATA, R10    // if INFMASK { tmp = INF }
        +	UCOMISD ZERO, NANMASK
        +	CMOVQPS NAN_DATA, R10    // if NANMASK { tmp = NaN }
        +	MOVQ    R10, norm+40(FP) // return tmp
        +	RET
        +
        +retZero:
        +	MOVSD ZERO, norm+40(FP) // return 0
        +	RET
        +
        +retNaN:
        +	MOVSD NAN_DATA, TMP    // return NaN
        +	MOVSD TMP, norm+40(FP)
        +	RET
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f64/scalinc_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/f64/scalinc_amd64.s
        index fb8b545eb..cf185fc0d 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/f64/scalinc_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f64/scalinc_amd64.s
        @@ -34,7 +34,7 @@
         // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
         // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f64/scalincto_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/f64/scalincto_amd64.s
        index 186fd1c05..cf359ac1e 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/f64/scalincto_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f64/scalincto_amd64.s
        @@ -34,7 +34,7 @@
         // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
         // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f64/scalunitary_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/f64/scalunitary_amd64.s
        index f852c7f7c..560aef2a3 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/f64/scalunitary_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f64/scalunitary_amd64.s
        @@ -34,7 +34,7 @@
         // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
         // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f64/scalunitaryto_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/f64/scalunitaryto_amd64.s
        index d2b607f52..a5b2b018f 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/f64/scalunitaryto_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f64/scalunitaryto_amd64.s
        @@ -34,7 +34,7 @@
         // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
         // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
         #include "textflag.h"
         
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f64/stubs_amd64.go b/vendor/gonum.org/v1/gonum/internal/asm/f64/stubs_amd64.go
        index f6cf96ca4..3ff058271 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/f64/stubs_amd64.go
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f64/stubs_amd64.go
        @@ -163,3 +163,90 @@ func ScalInc(alpha float64, x []float64, n, incX uintptr)
         //  	idst += incDst
         //  }
         func ScalIncTo(dst []float64, incDst uintptr, alpha float64, x []float64, n, incX uintptr)
        +
        +// Sum is
        +//  var sum float64
        +//  for i := range x {
        +//      sum += x[i]
        +//  }
        +func Sum(x []float64) float64
        +
        +// L2NormUnitary returns the L2-norm of x.
        +//   var scale float64
        +//   sumSquares := 1.0
        +//   for _, v := range x {
        +//   	if v == 0 {
        +//   		continue
        +//   	}
        +//   	absxi := math.Abs(v)
        +//   	if math.IsNaN(absxi) {
        +//   		return math.NaN()
        +//   	}
        +//   	if scale < absxi {
        +//   		s := scale / absxi
        +//   		sumSquares = 1 + sumSquares*s*s
        +//   		scale = absxi
        +//   	} else {
        +//   		s := absxi / scale
        +//   		sumSquares += s * s
        +//   	}
        +// 	  	if math.IsInf(scale, 1) {
        +// 		  	return math.Inf(1)
        +// 	  	}
        +//   }
        +//   return scale * math.Sqrt(sumSquares)
        +func L2NormUnitary(x []float64) (norm float64)
        +
        +// L2NormInc returns the L2-norm of x.
        +// 	var scale float64
        +// 	sumSquares := 1.0
        +// 	for ix := uintptr(0); ix < n*incX; ix += incX {
        +// 		val := x[ix]
        +// 		if val == 0 {
        +// 			continue
        +// 		}
        +// 		absxi := math.Abs(val)
        +// 		if math.IsNaN(absxi) {
        +// 			return math.NaN()
        +// 		}
        +// 		if scale < absxi {
        +// 			s := scale / absxi
        +// 			sumSquares = 1 + sumSquares*s*s
        +// 			scale = absxi
        +// 		} else {
        +// 			s := absxi / scale
        +// 			sumSquares += s * s
        +// 		}
        +// 	}
        +// 	if math.IsInf(scale, 1) {
        +// 		return math.Inf(1)
        +// 	}
        +// 	return scale * math.Sqrt(sumSquares)
        +func L2NormInc(x []float64, n, incX uintptr) (norm float64)
        +
        +// L2DistanceUnitary returns the L2-norm of x-y.
        +// 	var scale float64
        +// 	sumSquares := 1.0
        +// 	for i, v := range x {
        +// 		v -= y[i]
        +// 		if v == 0 {
        +// 			continue
        +// 		}
        +// 		absxi := math.Abs(v)
        +// 		if math.IsNaN(absxi) {
        +// 			return math.NaN()
        +// 		}
        +// 		if scale < absxi {
        +// 			s := scale / absxi
        +// 			sumSquares = 1 + sumSquares*s*s
        +// 			scale = absxi
        +// 		} else {
        +// 			s := absxi / scale
        +// 			sumSquares += s * s
        +// 		}
        +// 	}
        +// 	if math.IsInf(scale, 1) {
        +// 		return math.Inf(1)
        +// 	}
        +// 	return scale * math.Sqrt(sumSquares)
        +func L2DistanceUnitary(x, y []float64) (norm float64)
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f64/stubs_noasm.go b/vendor/gonum.org/v1/gonum/internal/asm/f64/stubs_noasm.go
        index eae620b1f..670978aa4 100644
        --- a/vendor/gonum.org/v1/gonum/internal/asm/f64/stubs_noasm.go
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f64/stubs_noasm.go
        @@ -155,3 +155,16 @@ func LinfDist(s, t []float64) float64 {
         	}
         	return norm
         }
        +
        +// Sum is
        +//  var sum float64
        +//  for i := range x {
        +//      sum += x[i]
        +//  }
        +func Sum(x []float64) float64 {
        +	var sum float64
        +	for _, v := range x {
        +		sum += v
        +	}
        +	return sum
        +}
        diff --git a/vendor/gonum.org/v1/gonum/internal/asm/f64/sum_amd64.s b/vendor/gonum.org/v1/gonum/internal/asm/f64/sum_amd64.s
        new file mode 100644
        index 000000000..4d9d68121
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/internal/asm/f64/sum_amd64.s
        @@ -0,0 +1,100 @@
        +// Copyright ©2018 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// +build !noasm,!appengine,!safe
        +
        +#include "textflag.h"
        +
        +#define X_PTR SI
        +#define IDX AX
        +#define LEN CX
        +#define TAIL BX
        +#define SUM X0
        +#define SUM_1 X1
        +#define SUM_2 X2
        +#define SUM_3 X3
        +
        +// func Sum(x []float64) float64
        +TEXT ·Sum(SB), NOSPLIT, $0
        +	MOVQ x_base+0(FP), X_PTR // X_PTR = &x
        +	MOVQ x_len+8(FP), LEN    // LEN = len(x)
        +	XORQ IDX, IDX            // i = 0
        +	PXOR SUM, SUM            // p_sum_i = 0
        +	CMPQ LEN, $0             // if LEN == 0 { return 0 }
        +	JE   sum_end
        +
        +	PXOR SUM_1, SUM_1
        +	PXOR SUM_2, SUM_2
        +	PXOR SUM_3, SUM_3
        +
        +	MOVQ X_PTR, TAIL // Check memory alignment
        +	ANDQ $15, TAIL   // TAIL = &y % 16
        +	JZ   no_trim     // if TAIL == 0 { goto no_trim }
        +
        +	// Align on 16-byte boundary
        +	ADDSD (X_PTR), X0 // X0 += x[0]
        +	INCQ  IDX         // i++
        +	DECQ  LEN         // LEN--
        +	DECQ  TAIL        // TAIL--
        +	JZ    sum_end     // if TAIL == 0 { return }
        +
        +no_trim:
        +	MOVQ LEN, TAIL
        +	SHRQ $4, LEN   // LEN = floor( n / 16 )
        +	JZ   sum_tail8 // if LEN == 0 { goto sum_tail8 }
        +
        +sum_loop: // sum 16x wide do {
        +	ADDPD (SI)(AX*8), SUM      // sum_i += x[i:i+2]
        +	ADDPD 16(SI)(AX*8), SUM_1
        +	ADDPD 32(SI)(AX*8), SUM_2
        +	ADDPD 48(SI)(AX*8), SUM_3
        +	ADDPD 64(SI)(AX*8), SUM
        +	ADDPD 80(SI)(AX*8), SUM_1
        +	ADDPD 96(SI)(AX*8), SUM_2
        +	ADDPD 112(SI)(AX*8), SUM_3
        +	ADDQ  $16, IDX             // i += 16
        +	DECQ  LEN
        +	JNZ   sum_loop             // } while --CX > 0
        +
        +sum_tail8:
        +	TESTQ $8, TAIL
        +	JZ    sum_tail4
        +
        +	ADDPD (SI)(AX*8), SUM     // sum_i += x[i:i+2]
        +	ADDPD 16(SI)(AX*8), SUM_1
        +	ADDPD 32(SI)(AX*8), SUM_2
        +	ADDPD 48(SI)(AX*8), SUM_3
        +	ADDQ  $8, IDX
        +
        +sum_tail4:
        +	ADDPD SUM_3, SUM
        +	ADDPD SUM_2, SUM_1
        +
        +	TESTQ $4, TAIL
        +	JZ    sum_tail2
        +
        +	ADDPD (SI)(AX*8), SUM     // sum_i += x[i:i+2]
        +	ADDPD 16(SI)(AX*8), SUM_1
        +	ADDQ  $4, IDX
        +
        +sum_tail2:
        +	ADDPD SUM_1, SUM
        +
        +	TESTQ $2, TAIL
        +	JZ    sum_tail1
        +
        +	ADDPD (SI)(AX*8), SUM // sum_i += x[i:i+2]
        +	ADDQ  $2, IDX
        +
        +sum_tail1:
        +	HADDPD SUM, SUM // sum_i[0] += sum_i[1]
        +
        +	TESTQ $1, TAIL
        +	JZ    sum_end
        +
        +	ADDSD (SI)(IDX*8), SUM
        +
        +sum_end: // return sum
        +	MOVSD SUM, ret+24(FP)
        +	RET
        diff --git a/vendor/gonum.org/v1/gonum/internal/cmplx64/abs.go b/vendor/gonum.org/v1/gonum/internal/cmplx64/abs.go
        new file mode 100644
        index 000000000..ac6eb81c0
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/internal/cmplx64/abs.go
        @@ -0,0 +1,14 @@
        +// Copyright 2010 The Go Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// Copyright ©2017 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package cmplx64
        +
        +import math "gonum.org/v1/gonum/internal/math32"
        +
        +// Abs returns the absolute value (also called the modulus) of x.
        +func Abs(x complex64) float32 { return math.Hypot(real(x), imag(x)) }
        diff --git a/vendor/gonum.org/v1/gonum/internal/cmplx64/conj.go b/vendor/gonum.org/v1/gonum/internal/cmplx64/conj.go
        new file mode 100644
        index 000000000..705262f2f
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/internal/cmplx64/conj.go
        @@ -0,0 +1,12 @@
        +// Copyright 2010 The Go Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// Copyright ©2017 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package cmplx64
        +
        +// Conj returns the complex conjugate of x.
        +func Conj(x complex64) complex64 { return complex(real(x), -imag(x)) }
        diff --git a/vendor/gonum.org/v1/gonum/internal/cmplx64/doc.go b/vendor/gonum.org/v1/gonum/internal/cmplx64/doc.go
        new file mode 100644
        index 000000000..5424ea099
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/internal/cmplx64/doc.go
        @@ -0,0 +1,7 @@
        +// Copyright ©2017 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// Package cmplx64 provides complex64 versions of standard library math/cmplx
        +// package routines used by gonum/blas.
        +package cmplx64 // import "gonum.org/v1/gonum/internal/cmplx64"
        diff --git a/vendor/gonum.org/v1/gonum/internal/cmplx64/isinf.go b/vendor/gonum.org/v1/gonum/internal/cmplx64/isinf.go
        new file mode 100644
        index 000000000..21d3d180e
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/internal/cmplx64/isinf.go
        @@ -0,0 +1,25 @@
        +// Copyright 2010 The Go Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// Copyright ©2017 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package cmplx64
        +
        +import math "gonum.org/v1/gonum/internal/math32"
        +
        +// IsInf returns true if either real(x) or imag(x) is an infinity.
        +func IsInf(x complex64) bool {
        +	if math.IsInf(real(x), 0) || math.IsInf(imag(x), 0) {
        +		return true
        +	}
        +	return false
        +}
        +
        +// Inf returns a complex infinity, complex(+Inf, +Inf).
        +func Inf() complex64 {
        +	inf := math.Inf(1)
        +	return complex(inf, inf)
        +}
        diff --git a/vendor/gonum.org/v1/gonum/internal/cmplx64/isnan.go b/vendor/gonum.org/v1/gonum/internal/cmplx64/isnan.go
        new file mode 100644
        index 000000000..7e0bf788f
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/internal/cmplx64/isnan.go
        @@ -0,0 +1,29 @@
        +// Copyright 2010 The Go Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// Copyright ©2017 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package cmplx64
        +
        +import math "gonum.org/v1/gonum/internal/math32"
        +
        +// IsNaN returns true if either real(x) or imag(x) is NaN
        +// and neither is an infinity.
        +func IsNaN(x complex64) bool {
        +	switch {
        +	case math.IsInf(real(x), 0) || math.IsInf(imag(x), 0):
        +		return false
        +	case math.IsNaN(real(x)) || math.IsNaN(imag(x)):
        +		return true
        +	}
        +	return false
        +}
        +
        +// NaN returns a complex ``not-a-number'' value.
        +func NaN() complex64 {
        +	nan := math.NaN()
        +	return complex(nan, nan)
        +}
        diff --git a/vendor/gonum.org/v1/gonum/internal/cmplx64/sqrt.go b/vendor/gonum.org/v1/gonum/internal/cmplx64/sqrt.go
        new file mode 100644
        index 000000000..439987b4b
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/internal/cmplx64/sqrt.go
        @@ -0,0 +1,108 @@
        +// Copyright 2010 The Go Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// Copyright ©2017 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package cmplx64
        +
        +import math "gonum.org/v1/gonum/internal/math32"
        +
        +// The original C code, the long comment, and the constants
        +// below are from http://netlib.sandia.gov/cephes/c9x-complex/clog.c.
        +// The go code is a simplified version of the original C.
        +//
        +// Cephes Math Library Release 2.8:  June, 2000
        +// Copyright 1984, 1987, 1989, 1992, 2000 by Stephen L. Moshier
        +//
        +// The readme file at http://netlib.sandia.gov/cephes/ says:
        +//    Some software in this archive may be from the book _Methods and
        +// Programs for Mathematical Functions_ (Prentice-Hall or Simon & Schuster
        +// International, 1989) or from the Cephes Mathematical Library, a
        +// commercial product. In either event, it is copyrighted by the author.
        +// What you see here may be used freely but it comes with no support or
        +// guarantee.
        +//
        +//   The two known misprints in the book are repaired here in the
        +// source listings for the gamma function and the incomplete beta
        +// integral.
        +//
        +//   Stephen L. Moshier
        +//   moshier@na-net.ornl.gov
        +
        +// Complex square root
        +//
        +// DESCRIPTION:
        +//
        +// If z = x + iy,  r = |z|, then
        +//
        +//                       1/2
        +// Re w  =  [ (r + x)/2 ]   ,
        +//
        +//                       1/2
        +// Im w  =  [ (r - x)/2 ]   .
        +//
        +// Cancelation error in r-x or r+x is avoided by using the
        +// identity  2 Re w Im w  =  y.
        +//
        +// Note that -w is also a square root of z. The root chosen
        +// is always in the right half plane and Im w has the same sign as y.
        +//
        +// ACCURACY:
        +//
        +//                      Relative error:
        +// arithmetic   domain     # trials      peak         rms
        +//    DEC       -10,+10     25000       3.2e-17     9.6e-18
        +//    IEEE      -10,+10   1,000,000     2.9e-16     6.1e-17
        +
        +// Sqrt returns the square root of x.
        +// The result r is chosen so that real(r) ≥ 0 and imag(r) has the same sign as imag(x).
        +func Sqrt(x complex64) complex64 {
        +	if imag(x) == 0 {
        +		if real(x) == 0 {
        +			return complex(0, 0)
        +		}
        +		if real(x) < 0 {
        +			return complex(0, math.Sqrt(-real(x)))
        +		}
        +		return complex(math.Sqrt(real(x)), 0)
        +	}
        +	if real(x) == 0 {
        +		if imag(x) < 0 {
        +			r := math.Sqrt(-0.5 * imag(x))
        +			return complex(r, -r)
        +		}
        +		r := math.Sqrt(0.5 * imag(x))
        +		return complex(r, r)
        +	}
        +	a := real(x)
        +	b := imag(x)
        +	var scale float32
        +	// Rescale to avoid internal overflow or underflow.
        +	if math.Abs(a) > 4 || math.Abs(b) > 4 {
        +		a *= 0.25
        +		b *= 0.25
        +		scale = 2
        +	} else {
        +		a *= 1.8014398509481984e16 // 2**54
        +		b *= 1.8014398509481984e16
        +		scale = 7.450580596923828125e-9 // 2**-27
        +	}
        +	r := math.Hypot(a, b)
        +	var t float32
        +	if a > 0 {
        +		t = math.Sqrt(0.5*r + 0.5*a)
        +		r = scale * math.Abs((0.5*b)/t)
        +		t *= scale
        +	} else {
        +		r = math.Sqrt(0.5*r - 0.5*a)
        +		t = scale * math.Abs((0.5*b)/r)
        +		r *= scale
        +	}
        +	if b < 0 {
        +		return complex(t, -r)
        +	}
        +	return complex(t, r)
        +}
        diff --git a/vendor/gonum.org/v1/gonum/internal/math32/sqrt.go b/vendor/gonum.org/v1/gonum/internal/math32/sqrt.go
        index bf630de99..d5b179e5b 100644
        --- a/vendor/gonum.org/v1/gonum/internal/math32/sqrt.go
        +++ b/vendor/gonum.org/v1/gonum/internal/math32/sqrt.go
        @@ -2,7 +2,7 @@
         // Use of this source code is governed by a BSD-style
         // license that can be found in the LICENSE file.
         
        -// +build !amd64 noasm appengine safe
        +// +build !amd64,!arm64 noasm appengine safe
         
         package math32
         
        @@ -19,7 +19,6 @@ import (
         //	Sqrt(NaN) = NaN
         func Sqrt(x float32) float32 {
         	// FIXME(kortschak): Direct translation of the math package
        -	// asm code for 386 fails to build. No test hardware is available
        -	// for arm, so using conversion instead.
        +	// asm code for 386 fails to build.
         	return float32(math.Sqrt(float64(x)))
         }
        diff --git a/vendor/gonum.org/v1/gonum/internal/math32/sqrt_amd64.s b/vendor/gonum.org/v1/gonum/internal/math32/sqrt_amd64.s
        index fa2b8696e..3b9f6fe7e 100644
        --- a/vendor/gonum.org/v1/gonum/internal/math32/sqrt_amd64.s
        +++ b/vendor/gonum.org/v1/gonum/internal/math32/sqrt_amd64.s
        @@ -6,12 +6,9 @@
         // Use of this source code is governed by a BSD-style
         // license that can be found in the LICENSE file.
         
        -//+build !noasm,!appengine,!safe
        +// +build !noasm,!appengine,!safe
         
        -// TODO(kortschak): use textflag.h after we drop Go 1.3 support
        -//#include "textflag.h"
        -// Don't insert stack check preamble.
        -#define NOSPLIT	4
        +#include "textflag.h"
         
         // func Sqrt(x float32) float32
         TEXT ·Sqrt(SB),NOSPLIT,$0
        diff --git a/vendor/gonum.org/v1/gonum/internal/math32/sqrt_arm64.go b/vendor/gonum.org/v1/gonum/internal/math32/sqrt_arm64.go
        new file mode 100644
        index 000000000..905ae5c68
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/internal/math32/sqrt_arm64.go
        @@ -0,0 +1,20 @@
        +// Copyright 2009 The Go Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// Copyright ©2015 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// +build !noasm,!appengine,!safe
        +
        +package math32
        +
        +// Sqrt returns the square root of x.
        +//
        +// Special cases are:
        +//	Sqrt(+Inf) = +Inf
        +//	Sqrt(±0) = ±0
        +//	Sqrt(x < 0) = NaN
        +//	Sqrt(NaN) = NaN
        +func Sqrt(x float32) float32
        diff --git a/vendor/gonum.org/v1/gonum/internal/math32/sqrt_arm64.s b/vendor/gonum.org/v1/gonum/internal/math32/sqrt_arm64.s
        new file mode 100644
        index 000000000..74df8fda5
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/internal/math32/sqrt_arm64.s
        @@ -0,0 +1,18 @@
        +// Copyright 2015 The Go Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// Copyright ©2020 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// +build !noasm,!appengine,!safe
        +
        +#include "textflag.h"
        +
        +// func Sqrt(x float32) float32
        +TEXT ·Sqrt(SB),NOSPLIT,$0
        +	FMOVS	x+0(FP), F0
        +	FSQRTS	F0, F0
        +	FMOVS	F0, ret+8(FP)
        +	RET
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dbdsqr.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dbdsqr.go
        index dd6e8b3a4..acbf45348 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dbdsqr.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dbdsqr.go
        @@ -15,19 +15,19 @@ import (
         // Dbdsqr performs a singular value decomposition of a real n×n bidiagonal matrix.
         //
         // The SVD of the bidiagonal matrix B is
        -//  B = Q * S * P^T
        +//  B = Q * S * Pᵀ
         // where S is a diagonal matrix of singular values, Q is an orthogonal matrix of
         // left singular vectors, and P is an orthogonal matrix of right singular vectors.
         //
         // Q and P are only computed if requested. If left singular vectors are requested,
         // this routine returns U * Q instead of Q, and if right singular vectors are
        -// requested P^T * VT is returned instead of P^T.
        +// requested Pᵀ * VT is returned instead of Pᵀ.
         //
         // Frequently Dbdsqr is used in conjunction with Dgebrd which reduces a general
         // matrix A into bidiagonal form. In this case, the SVD of A is
        -//  A = (U * Q) * S * (P^T * VT)
        +//  A = (U * Q) * S * (Pᵀ * VT)
         //
        -// This routine may also compute Q^T * C.
        +// This routine may also compute Qᵀ * C.
         //
         // d and e contain the elements of the bidiagonal matrix b. d must have length at
         // least n, and e must have length at least n-1. Dbdsqr will panic if there is
        @@ -35,13 +35,13 @@ import (
         // order.
         //
         // VT is a matrix of size n×ncvt whose elements are stored in vt. The elements
        -// of vt are modified to contain P^T * VT on exit. VT is not used if ncvt == 0.
        +// of vt are modified to contain Pᵀ * VT on exit. VT is not used if ncvt == 0.
         //
         // U is a matrix of size nru×n whose elements are stored in u. The elements
         // of u are modified to contain U * Q on exit. U is not used if nru == 0.
         //
         // C is a matrix of size n×ncc whose elements are stored in c. The elements
        -// of c are modified to contain Q^T * C on exit. C is not used if ncc == 0.
        +// of c are modified to contain Qᵀ * C on exit. C is not used if ncc == 0.
         //
         // work contains temporary storage and must have length at least 4*(n-1). Dbdsqr
         // will panic if there is insufficient working memory.
        @@ -50,35 +50,53 @@ import (
         //
         // Dbdsqr is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dbdsqr(uplo blas.Uplo, n, ncvt, nru, ncc int, d, e, vt []float64, ldvt int, u []float64, ldu int, c []float64, ldc int, work []float64) (ok bool) {
        -	if uplo != blas.Upper && uplo != blas.Lower {
        +	switch {
        +	case uplo != blas.Upper && uplo != blas.Lower:
         		panic(badUplo)
        +	case n < 0:
        +		panic(nLT0)
        +	case ncvt < 0:
        +		panic(ncvtLT0)
        +	case nru < 0:
        +		panic(nruLT0)
        +	case ncc < 0:
        +		panic(nccLT0)
        +	case ldvt < max(1, ncvt):
        +		panic(badLdVT)
        +	case (ldu < max(1, n) && nru > 0) || (ldu < 1 && nru == 0):
        +		panic(badLdU)
        +	case ldc < max(1, ncc):
        +		panic(badLdC)
         	}
        -	if ncvt != 0 {
        -		checkMatrix(n, ncvt, vt, ldvt)
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return true
        +	}
        +
        +	if len(vt) < (n-1)*ldvt+ncvt && ncvt != 0 {
        +		panic(shortVT)
         	}
        -	if nru != 0 {
        -		checkMatrix(nru, n, u, ldu)
        +	if len(u) < (nru-1)*ldu+n && nru != 0 {
        +		panic(shortU)
         	}
        -	if ncc != 0 {
        -		checkMatrix(n, ncc, c, ldc)
        +	if len(c) < (n-1)*ldc+ncc && ncc != 0 {
        +		panic(shortC)
         	}
         	if len(d) < n {
        -		panic(badD)
        +		panic(shortD)
         	}
         	if len(e) < n-1 {
        -		panic(badE)
        +		panic(shortE)
         	}
         	if len(work) < 4*(n-1) {
        -		panic(badWork)
        +		panic(shortWork)
         	}
        +
         	var info int
         	bi := blas64.Implementation()
        -	const (
        -		maxIter = 6
        -	)
        -	if n == 0 {
        -		return true
        -	}
        +	const maxIter = 6
        +
         	if n != 1 {
         		// If the singular vectors do not need to be computed, use qd algorithm.
         		if !(ncvt > 0 || nru > 0 || ncc > 0) {
        @@ -87,7 +105,6 @@ func (impl Implementation) Dbdsqr(uplo blas.Uplo, n, ncvt, nru, ncc int, d, e, v
         			if info != 2 {
         				return info == 0
         			}
        -			info = 0
         		}
         		nm1 := n - 1
         		nm12 := nm1 + nm1
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dcombssq.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dcombssq.go
        new file mode 100644
        index 000000000..e807e0a1d
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dcombssq.go
        @@ -0,0 +1,21 @@
        +// Copyright ©2019 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package gonum
        +
        +// Dcombssq adds two scaled sum-of-squares quantities, V := V1 + V2,
        +//  V_scale^2 * V_ssq := V1_scale^2 * V1_ssq + V2_scale^2 * V2_ssq
        +// and returns the result V.
        +//
        +// Dcombssq is an internal routine. It is exported for testing purposes.
        +func (Implementation) Dcombssq(scale1, ssq1, scale2, ssq2 float64) (scale, ssq float64) {
        +	if scale1 >= scale2 {
        +		if scale1 != 0 {
        +			return scale1, ssq1 + (scale2/scale1)*(scale2/scale1)*ssq2
        +		}
        +		// If the input is non-negative and we are here, then scale2 must inevitably be 0, too.
        +		return 0, 0
        +	}
        +	return scale2, ssq2 + (scale1/scale2)*(scale1/scale2)*ssq1
        +}
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dgebak.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dgebak.go
        index 136522ada..b8c61203f 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dgebak.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dgebak.go
        @@ -10,8 +10,8 @@ import (
         )
         
         // Dgebak updates an n×m matrix V as
        -//  V = P D V,        if side == lapack.EVRight,
        -//  V = P D^{-1} V,   if side == lapack.EVLeft,
        +//  V = P D V       if side == lapack.EVRight,
        +//  V = P D^{-1} V  if side == lapack.EVLeft,
         // where P and D are n×n permutation and scaling matrices, respectively,
         // implicitly represented by job, scale, ilo and ihi as returned by Dgebal.
         //
        @@ -21,26 +21,37 @@ import (
         //
         // Dgebak is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dgebak(job lapack.BalanceJob, side lapack.EVSide, n, ilo, ihi int, scale []float64, m int, v []float64, ldv int) {
        -	switch job {
        -	default:
        +	switch {
        +	case job != lapack.BalanceNone && job != lapack.Permute && job != lapack.Scale && job != lapack.PermuteScale:
         		panic(badBalanceJob)
        -	case lapack.BalanceNone, lapack.Permute, lapack.Scale, lapack.PermuteScale:
        -	}
        -	switch side {
        -	default:
        +	case side != lapack.EVLeft && side != lapack.EVRight:
         		panic(badEVSide)
        -	case lapack.EVLeft, lapack.EVRight:
        -	}
        -	checkMatrix(n, m, v, ldv)
        -	switch {
        +	case n < 0:
        +		panic(nLT0)
         	case ilo < 0 || max(0, n-1) < ilo:
         		panic(badIlo)
         	case ihi < min(ilo, n-1) || n <= ihi:
         		panic(badIhi)
        +	case m < 0:
        +		panic(mLT0)
        +	case ldv < max(1, m):
        +		panic(badLdV)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 || m == 0 {
        +		return
        +	}
        +
        +	if len(scale) < n {
        +		panic(shortScale)
        +	}
        +	if len(v) < (n-1)*ldv+m {
        +		panic(shortV)
         	}
         
         	// Quick return if possible.
        -	if n == 0 || m == 0 || job == lapack.BalanceNone {
        +	if job == lapack.BalanceNone {
         		return
         	}
         
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dgebal.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dgebal.go
        index cb591a84e..f4690b504 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dgebal.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dgebal.go
        @@ -15,10 +15,10 @@ import (
         // and scaling. Both steps are optional and depend on the value of job.
         //
         // Permuting consists of applying a permutation matrix P such that the matrix
        -// that results from P^T*A*P takes the upper block triangular form
        -//            [ T1  X  Y  ]
        -//  P^T A P = [  0  B  Z  ],
        -//            [  0  0  T2 ]
        +// that results from Pᵀ*A*P takes the upper block triangular form
        +//           [ T1  X  Y  ]
        +//  Pᵀ A P = [  0  B  Z  ],
        +//           [  0  0  T2 ]
         // where T1 and T2 are upper triangular matrices and B contains at least one
         // nonzero off-diagonal element in each row and column. The indices ilo and ihi
         // mark the starting and ending columns of the submatrix B. The eigenvalues of A
        @@ -55,26 +55,37 @@ import (
         //
         // Dgebal is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dgebal(job lapack.BalanceJob, n int, a []float64, lda int, scale []float64) (ilo, ihi int) {
        -	switch job {
        -	default:
        +	switch {
        +	case job != lapack.BalanceNone && job != lapack.Permute && job != lapack.Scale && job != lapack.PermuteScale:
         		panic(badBalanceJob)
        -	case lapack.BalanceNone, lapack.Permute, lapack.Scale, lapack.PermuteScale:
        -	}
        -	checkMatrix(n, n, a, lda)
        -	if len(scale) != n {
        -		panic("lapack: bad length of scale")
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
         	}
         
         	ilo = 0
         	ihi = n - 1
         
        -	if n == 0 || job == lapack.BalanceNone {
        +	if n == 0 {
        +		return ilo, ihi
        +	}
        +
        +	if len(scale) != n {
        +		panic(shortScale)
        +	}
        +
        +	if job == lapack.BalanceNone {
         		for i := range scale {
         			scale[i] = 1
         		}
         		return ilo, ihi
         	}
         
        +	if len(a) < (n-1)*lda+n {
        +		panic(shortA)
        +	}
        +
         	bi := blas64.Implementation()
         	swapped := true
         
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dgebd2.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dgebd2.go
        index a8e4aacbc..6dc97ce59 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dgebd2.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dgebd2.go
        @@ -8,29 +8,41 @@ import "gonum.org/v1/gonum/blas"
         
         // Dgebd2 reduces an m×n matrix A to upper or lower bidiagonal form by an orthogonal
         // transformation.
        -//  Q^T * A * P = B
        +//  Qᵀ * A * P = B
         // if m >= n, B is upper diagonal, otherwise B is lower bidiagonal.
         // d is the diagonal, len = min(m,n)
         // e is the off-diagonal len = min(m,n)-1
         //
         // Dgebd2 is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dgebd2(m, n int, a []float64, lda int, d, e, tauQ, tauP, work []float64) {
        -	checkMatrix(m, n, a, lda)
        -	if len(d) < min(m, n) {
        -		panic(badD)
        +	switch {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
         	}
        -	if len(e) < min(m, n)-1 {
        -		panic(badE)
        -	}
        -	if len(tauQ) < min(m, n) {
        -		panic(badTauQ)
        -	}
        -	if len(tauP) < min(m, n) {
        -		panic(badTauP)
        +
        +	// Quick return if possible.
        +	minmn := min(m, n)
        +	if minmn == 0 {
        +		return
         	}
        -	if len(work) < max(m, n) {
        -		panic(badWork)
        +
        +	switch {
        +	case len(d) < minmn:
        +		panic(shortD)
        +	case len(e) < minmn-1:
        +		panic(shortE)
        +	case len(tauQ) < minmn:
        +		panic(shortTauQ)
        +	case len(tauP) < minmn:
        +		panic(shortTauP)
        +	case len(work) < max(m, n):
        +		panic(shortWork)
         	}
        +
         	if m >= n {
         		for i := 0; i < n; i++ {
         			a[i*lda+i], tauQ[i] = impl.Dlarfg(m-i, a[i*lda+i], a[min(i+1, m-1)*lda+i:], lda)
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dgebrd.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dgebrd.go
        index 794ac2c0e..8faef130d 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dgebrd.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dgebrd.go
        @@ -11,7 +11,7 @@ import (
         
         // Dgebrd reduces a general m×n matrix A to upper or lower bidiagonal form B by
         // an orthogonal transformation:
        -//  Q^T * A * P = B.
        +//  Qᵀ * A * P = B.
         // The diagonal elements of B are stored in d and the off-diagonal elements are stored
         // in e. These are additionally stored along the diagonal of A and the off-diagonal
         // of A. If m >= n B is an upper-bidiagonal matrix, and if m < n B is a
        @@ -24,8 +24,8 @@ import (
         //  if m < n,  Q = H_0 * H_1 * ... * H_{m-2},
         //             P = G_0 * G_1 * ... * G_{m-1},
         // where
        -//  H_i = I - tauQ[i] * v_i * v_i^T,
        -//  G_i = I - tauP[i] * u_i * u_i^T.
        +//  H_i = I - tauQ[i] * v_i * v_iᵀ,
        +//  G_i = I - tauP[i] * u_i * u_iᵀ.
         //
         // As an example, on exit the entries of A when m = 6, and n = 5
         //  [ d   e  u1  u1  u1]
        @@ -53,46 +53,62 @@ import (
         //
         // Dgebrd is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dgebrd(m, n int, a []float64, lda int, d, e, tauQ, tauP, work []float64, lwork int) {
        -	checkMatrix(m, n, a, lda)
        -	// Calculate optimal work.
        -	nb := impl.Ilaenv(1, "DGEBRD", " ", m, n, -1, -1)
        -	var lworkOpt int
        -	if lwork == -1 {
        -		if len(work) < 1 {
        -			panic(badWork)
        -		}
        -		lworkOpt = ((m + n) * nb)
        -		work[0] = float64(max(1, lworkOpt))
        -		return
        +	switch {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	case lwork < max(1, max(m, n)) && lwork != -1:
        +		panic(badLWork)
        +	case len(work) < max(1, lwork):
        +		panic(shortWork)
         	}
        +
        +	// Quick return if possible.
         	minmn := min(m, n)
        -	if len(d) < minmn {
        -		panic(badD)
        -	}
        -	if len(e) < minmn-1 {
        -		panic(badE)
        +	if minmn == 0 {
        +		work[0] = 1
        +		return
         	}
        -	if len(tauQ) < minmn {
        -		panic(badTauQ)
        +
        +	nb := impl.Ilaenv(1, "DGEBRD", " ", m, n, -1, -1)
        +	lwkopt := (m + n) * nb
        +	if lwork == -1 {
        +		work[0] = float64(lwkopt)
        +		return
         	}
        -	if len(tauP) < minmn {
        -		panic(badTauP)
        +
        +	switch {
        +	case len(a) < (m-1)*lda+n:
        +		panic(shortA)
        +	case len(d) < minmn:
        +		panic(shortD)
        +	case len(e) < minmn-1:
        +		panic(shortE)
        +	case len(tauQ) < minmn:
        +		panic(shortTauQ)
        +	case len(tauP) < minmn:
        +		panic(shortTauP)
         	}
        +
        +	nx := minmn
         	ws := max(m, n)
        -	if lwork < max(1, ws) {
        -		panic(badWork)
        -	}
        -	if len(work) < lwork {
        -		panic(badWork)
        -	}
        -	var nx int
        -	if nb > 1 && nb < minmn {
        +	if 1 < nb && nb < minmn {
        +		// At least one blocked operation can be done.
        +		// Get the crossover point nx.
         		nx = max(nb, impl.Ilaenv(3, "DGEBRD", " ", m, n, -1, -1))
        +		// Determine when to switch from blocked to unblocked code.
         		if nx < minmn {
        +			// At least one blocked operation will be done.
         			ws = (m + n) * nb
         			if lwork < ws {
        +				// Not enough work space for the optimal nb,
        +				// consider using a smaller block size.
         				nbmin := impl.Ilaenv(2, "DGEBRD", " ", m, n, -1, -1)
         				if lwork >= (m+n)*nbmin {
        +					// Enough work space for minimum block size.
         					nb = lwork / (m + n)
         				} else {
         					nb = minmn
        @@ -100,17 +116,12 @@ func (impl Implementation) Dgebrd(m, n int, a []float64, lda int, d, e, tauQ, ta
         				}
         			}
         		}
        -	} else {
        -		nx = minmn
         	}
         	bi := blas64.Implementation()
         	ldworkx := nb
         	ldworky := nb
         	var i int
        -	// Netlib lapack has minmn - nx, but this makes the last nx rows (which by
        -	// default is large) be unblocked. As written here, the blocking is more
        -	// consistent.
        -	for i = 0; i < minmn-nb; i += nb {
        +	for i = 0; i < minmn-nx; i += nb {
         		// Reduce rows and columns i:i+nb to bidiagonal form and return
         		// the matrices X and Y which are needed to update the unreduced
         		// part of the matrix.
        @@ -146,5 +157,5 @@ func (impl Implementation) Dgebrd(m, n int, a []float64, lda int, d, e, tauQ, ta
         	}
         	// Use unblocked code to reduce the remainder of the matrix.
         	impl.Dgebd2(m-i, n-i, a[i*lda+i:], lda, d[i:], e[i:], tauQ[i:], tauP[i:], work)
        -	work[0] = float64(lworkOpt)
        +	work[0] = float64(ws)
         }
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dgecon.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dgecon.go
        index 04e01535f..1d1ca586b 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dgecon.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dgecon.go
        @@ -24,20 +24,31 @@ import (
         //
         // iwork is a temporary data slice of length at least n and Dgecon will panic otherwise.
         func (impl Implementation) Dgecon(norm lapack.MatrixNorm, n int, a []float64, lda int, anorm float64, work []float64, iwork []int) float64 {
        -	checkMatrix(n, n, a, lda)
        -	if norm != lapack.MaxColumnSum && norm != lapack.MaxRowSum {
        +	switch {
        +	case norm != lapack.MaxColumnSum && norm != lapack.MaxRowSum:
         		panic(badNorm)
        -	}
        -	if len(work) < 4*n {
        -		panic(badWork)
        -	}
        -	if len(iwork) < n {
        -		panic(badWork)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
         	}
         
        +	// Quick return if possible.
         	if n == 0 {
         		return 1
        -	} else if anorm == 0 {
        +	}
        +
        +	switch {
        +	case len(a) < (n-1)*lda+n:
        +		panic(shortA)
        +	case len(work) < 4*n:
        +		panic(shortWork)
        +	case len(iwork) < n:
        +		panic(shortIWork)
        +	}
        +
        +	// Quick return if possible.
        +	if anorm == 0 {
         		return 0
         	}
         
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dgeev.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dgeev.go
        index 114d96edf..972e36cb6 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dgeev.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dgeev.go
        @@ -19,8 +19,8 @@ import (
         // is defined by
         //  A v_j = λ_j v_j,
         // and the left eigenvector u_j corresponding to an eigenvalue λ_j is defined by
        -//  u_j^H A = λ_j u_j^H,
        -// where u_j^H is the conjugate transpose of u_j.
        +//  u_jᴴ A = λ_j u_jᴴ,
        +// where u_jᴴ is the conjugate transpose of u_j.
         //
         // On return, A will be overwritten and the left and right eigenvectors will be
         // stored, respectively, in the columns of the n×n matrices VL and VR in the
        @@ -53,7 +53,7 @@ import (
         // larger.  On return, optimal value of lwork will be stored in work[0].
         //
         // If lwork == -1, instead of performing Dgeev, the function only calculates the
        -// optimal vaule of lwork and stores it into work[0].
        +// optimal value of lwork and stores it into work[0].
         //
         // On return, first is the index of the first valid eigenvalue. If first == 0,
         // all eigenvalues and eigenvectors have been computed. If first is positive,
        @@ -61,50 +61,31 @@ import (
         // computed and wr[first:] and wi[first:] contain those eigenvalues which have
         // converged.
         func (impl Implementation) Dgeev(jobvl lapack.LeftEVJob, jobvr lapack.RightEVJob, n int, a []float64, lda int, wr, wi []float64, vl []float64, ldvl int, vr []float64, ldvr int, work []float64, lwork int) (first int) {
        -	var wantvl bool
        -	switch jobvl {
        -	default:
        -		panic("lapack: invalid LeftEVJob")
        -	case lapack.LeftEVCompute:
        -		wantvl = true
        -	case lapack.LeftEVNone:
        -	}
        -	var wantvr bool
        -	switch jobvr {
        -	default:
        -		panic("lapack: invalid RightEVJob")
        -	case lapack.RightEVCompute:
        -		wantvr = true
        -	case lapack.RightEVNone:
        -	}
        -	switch {
        -	case n < 0:
        -		panic(nLT0)
        -	case len(work) < lwork:
        -		panic(shortWork)
        -	}
        +	wantvl := jobvl == lapack.LeftEVCompute
        +	wantvr := jobvr == lapack.RightEVCompute
         	var minwrk int
         	if wantvl || wantvr {
         		minwrk = max(1, 4*n)
         	} else {
         		minwrk = max(1, 3*n)
         	}
        -	if lwork != -1 {
        -		checkMatrix(n, n, a, lda)
        -		if wantvl {
        -			checkMatrix(n, n, vl, ldvl)
        -		}
        -		if wantvr {
        -			checkMatrix(n, n, vr, ldvr)
        -		}
        -		switch {
        -		case len(wr) != n:
        -			panic("lapack: bad length of wr")
        -		case len(wi) != n:
        -			panic("lapack: bad length of wi")
        -		case lwork < minwrk:
        -			panic(badWork)
        -		}
        +	switch {
        +	case jobvl != lapack.LeftEVCompute && jobvl != lapack.LeftEVNone:
        +		panic(badLeftEVJob)
        +	case jobvr != lapack.RightEVCompute && jobvr != lapack.RightEVNone:
        +		panic(badRightEVJob)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	case ldvl < 1 || (ldvl < n && wantvl):
        +		panic(badLdVL)
        +	case ldvr < 1 || (ldvr < n && wantvr):
        +		panic(badLdVR)
        +	case lwork < minwrk && lwork != -1:
        +		panic(badLWork)
        +	case len(work) < lwork:
        +		panic(shortWork)
         	}
         
         	// Quick return if possible.
        @@ -117,19 +98,19 @@ func (impl Implementation) Dgeev(jobvl lapack.LeftEVJob, jobvr lapack.RightEVJob
         	if wantvl || wantvr {
         		maxwrk = max(maxwrk, 2*n+(n-1)*impl.Ilaenv(1, "DORGHR", " ", n, 1, n, -1))
         		impl.Dhseqr(lapack.EigenvaluesAndSchur, lapack.SchurOrig, n, 0, n-1,
        -			nil, 1, nil, nil, nil, 1, work, -1)
        +			a, lda, wr, wi, nil, n, work, -1)
         		maxwrk = max(maxwrk, max(n+1, n+int(work[0])))
         		side := lapack.EVLeft
         		if wantvr {
         			side = lapack.EVRight
         		}
        -		impl.Dtrevc3(side, lapack.EVAllMulQ, nil, n, nil, 1, nil, 1, nil, 1,
        +		impl.Dtrevc3(side, lapack.EVAllMulQ, nil, n, a, lda, vl, ldvl, vr, ldvr,
         			n, work, -1)
         		maxwrk = max(maxwrk, n+int(work[0]))
         		maxwrk = max(maxwrk, 4*n)
         	} else {
         		impl.Dhseqr(lapack.EigenvaluesOnly, lapack.SchurNone, n, 0, n-1,
        -			nil, 1, nil, nil, nil, 1, work, -1)
        +			a, lda, wr, wi, vr, ldvr, work, -1)
         		maxwrk = max(maxwrk, max(n+1, n+int(work[0])))
         	}
         	maxwrk = max(maxwrk, minwrk)
        @@ -139,6 +120,19 @@ func (impl Implementation) Dgeev(jobvl lapack.LeftEVJob, jobvr lapack.RightEVJob
         		return 0
         	}
         
        +	switch {
        +	case len(a) < (n-1)*lda+n:
        +		panic(shortA)
        +	case len(wr) != n:
        +		panic(badLenWr)
        +	case len(wi) != n:
        +		panic(badLenWi)
        +	case len(vl) < (n-1)*ldvl+n && wantvl:
        +		panic(shortVL)
        +	case len(vr) < (n-1)*ldvr+n && wantvr:
        +		panic(shortVR)
        +	}
        +
         	// Get machine constants.
         	smlnum := math.Sqrt(dlamchS) / dlamchP
         	bignum := 1 / smlnum
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dgehd2.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dgehd2.go
        index 368283788..15f45b5e0 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dgehd2.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dgehd2.go
        @@ -7,13 +7,13 @@ package gonum
         import "gonum.org/v1/gonum/blas"
         
         // Dgehd2 reduces a block of a general n×n matrix A to upper Hessenberg form H
        -// by an orthogonal similarity transformation Q^T * A * Q = H.
        +// by an orthogonal similarity transformation Qᵀ * A * Q = H.
         //
         // The matrix Q is represented as a product of (ihi-ilo) elementary
         // reflectors
         //  Q = H_{ilo} H_{ilo+1} ... H_{ihi-1}.
         // Each H_i has the form
        -//  H_i = I - tau[i] * v * v^T
        +//  H_i = I - tau[i] * v * vᵀ
         // where v is a real vector with v[0:i+1] = 0, v[i+1] = 1 and v[ihi+1:n] = 0.
         // v[i+2:ihi+1] is stored on exit in A[i+2:ihi+1,i].
         //
        @@ -56,16 +56,29 @@ import "gonum.org/v1/gonum/blas"
         //
         // Dgehd2 is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dgehd2(n, ilo, ihi int, a []float64, lda int, tau, work []float64) {
        -	checkMatrix(n, n, a, lda)
         	switch {
        -	case ilo < 0 || ilo > max(0, n-1):
        +	case n < 0:
        +		panic(nLT0)
        +	case ilo < 0 || max(0, n-1) < ilo:
         		panic(badIlo)
        -	case ihi < min(ilo, n-1) || ihi >= n:
        +	case ihi < min(ilo, n-1) || n <= ihi:
         		panic(badIhi)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	switch {
        +	case len(a) < (n-1)*lda+n:
        +		panic(shortA)
         	case len(tau) != n-1:
        -		panic(badTau)
        +		panic(badLenTau)
         	case len(work) < n:
        -		panic(badWork)
        +		panic(shortWork)
         	}
         
         	for i := ilo; i < ihi; i++ {
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dgehrd.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dgehrd.go
        index 027747d1d..2fc759875 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dgehrd.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dgehrd.go
        @@ -11,13 +11,13 @@ import (
         )
         
         // Dgehrd reduces a block of a real n×n general matrix A to upper Hessenberg
        -// form H by an orthogonal similarity transformation Q^T * A * Q = H.
        +// form H by an orthogonal similarity transformation Qᵀ * A * Q = H.
         //
         // The matrix Q is represented as a product of (ihi-ilo) elementary
         // reflectors
         //  Q = H_{ilo} H_{ilo+1} ... H_{ihi-1}.
         // Each H_i has the form
        -//  H_i = I - tau[i] * v * v^T
        +//  H_i = I - tau[i] * v * vᵀ
         // where v is a real vector with v[0:i+1] = 0, v[i+1] = 1 and v[ihi+1:n] = 0.
         // v[i+2:ihi+1] is stored on exit in A[i+2:ihi+1,i].
         //
        @@ -67,20 +67,24 @@ import (
         // Dgehrd is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dgehrd(n, ilo, ihi int, a []float64, lda int, tau, work []float64, lwork int) {
         	switch {
        +	case n < 0:
        +		panic(nLT0)
         	case ilo < 0 || max(0, n-1) < ilo:
         		panic(badIlo)
         	case ihi < min(ilo, n-1) || n <= ihi:
         		panic(badIhi)
        +	case lda < max(1, n):
        +		panic(badLdA)
         	case lwork < max(1, n) && lwork != -1:
        -		panic(badWork)
        +		panic(badLWork)
         	case len(work) < lwork:
         		panic(shortWork)
         	}
        -	if lwork != -1 {
        -		checkMatrix(n, n, a, lda)
        -		if len(tau) != n-1 && n > 0 {
        -			panic(badTau)
        -		}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		work[0] = 1
        +		return
         	}
         
         	const (
        @@ -96,6 +100,13 @@ func (impl Implementation) Dgehrd(n, ilo, ihi int, a []float64, lda int, tau, wo
         		return
         	}
         
        +	if len(a) < (n-1)*lda+n {
        +		panic(shortA)
        +	}
        +	if len(tau) != n-1 {
        +		panic(badLenTau)
        +	}
        +
         	// Set tau[:ilo] and tau[ihi:] to zero.
         	for i := 0; i < ilo; i++ {
         		tau[i] = 0
        @@ -147,12 +158,12 @@ func (impl Implementation) Dgehrd(n, ilo, ihi int, a []float64, lda int, tau, wo
         			ib := min(nb, ihi-i)
         
         			// Reduce columns [i:i+ib] to Hessenberg form, returning the
        -			// matrices V and T of the block reflector H = I - V*T*V^T
        +			// matrices V and T of the block reflector H = I - V*T*Vᵀ
         			// which performs the reduction, and also the matrix Y = A*V*T.
         			impl.Dlahr2(ihi+1, i+1, ib, a[i:], lda, tau[i:], work[iwt:], ldt, work, ldwork)
         
         			// Apply the block reflector H to A[:ihi+1,i+ib:ihi+1] from the
        -			// right, computing  A := A - Y * V^T. V[i+ib,i+ib-1] must be set
        +			// right, computing  A := A - Y * Vᵀ. V[i+ib,i+ib-1] must be set
         			// to 1.
         			ei := a[(i+ib)*lda+i+ib-1]
         			a[(i+ib)*lda+i+ib-1] = 1
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dgelq2.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dgelq2.go
        index 05b3ce45b..abc96f7d2 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dgelq2.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dgelq2.go
        @@ -25,14 +25,30 @@ import "gonum.org/v1/gonum/blas"
         //
         // Dgelq2 is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dgelq2(m, n int, a []float64, lda int, tau, work []float64) {
        -	checkMatrix(m, n, a, lda)
        +	switch {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	}
        +
        +	// Quick return if possible.
         	k := min(m, n)
        -	if len(tau) < k {
        -		panic(badTau)
        +	if k == 0 {
        +		return
         	}
        -	if len(work) < m {
        -		panic(badWork)
        +
        +	switch {
        +	case len(a) < (m-1)*lda+n:
        +		panic(shortA)
        +	case len(tau) < k:
        +		panic(shortTau)
        +	case len(work) < m:
        +		panic(shortWork)
         	}
        +
         	for i := 0; i < k; i++ {
         		a[i*lda+i], tau[i] = impl.Dlarfg(n-i, a[i*lda+i], a[i*lda+min(i+1, n-1):], 1)
         		if i < m-1 {
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dgelqf.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dgelqf.go
        index 12913911b..f1fd13a01 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dgelqf.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dgelqf.go
        @@ -21,33 +21,44 @@ import (
         //
         // tau must have length at least min(m,n), and this function will panic otherwise.
         func (impl Implementation) Dgelqf(m, n int, a []float64, lda int, tau, work []float64, lwork int) {
        +	switch {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	case lwork < max(1, m) && lwork != -1:
        +		panic(badLWork)
        +	case len(work) < max(1, lwork):
        +		panic(shortWork)
        +	}
        +
        +	k := min(m, n)
        +	if k == 0 {
        +		work[0] = 1
        +		return
        +	}
        +
         	nb := impl.Ilaenv(1, "DGELQF", " ", m, n, -1, -1)
        -	lworkopt := m * max(nb, 1)
         	if lwork == -1 {
        -		work[0] = float64(lworkopt)
        +		work[0] = float64(m * nb)
         		return
         	}
        -	checkMatrix(m, n, a, lda)
        -	if len(work) < lwork {
        -		panic(shortWork)
        -	}
        -	if lwork < m {
        -		panic(badWork)
        +
        +	if len(a) < (m-1)*lda+n {
        +		panic(shortA)
         	}
        -	k := min(m, n)
         	if len(tau) < k {
        -		panic(badTau)
        -	}
        -	if k == 0 {
        -		return
        +		panic(shortTau)
         	}
        +
         	// Find the optimal blocking size based on the size of available memory
         	// and optimal machine parameters.
         	nbmin := 2
         	var nx int
         	iws := m
        -	ldwork := nb
        -	if nb > 1 && k > nb {
        +	if 1 < nb && nb < k {
         		nx = max(0, impl.Ilaenv(3, "DGELQF", " ", m, n, -1, -1))
         		if nx < k {
         			iws = m * nb
        @@ -57,9 +68,10 @@ func (impl Implementation) Dgelqf(m, n int, a []float64, lda int, tau, work []fl
         			}
         		}
         	}
        +	ldwork := nb
         	// Computed blocked LQ factorization.
         	var i int
        -	if nb >= nbmin && nb < k && nx < k {
        +	if nbmin <= nb && nb < k && nx < k {
         		for i = 0; i < k-nx; i += nb {
         			ib := min(k-i, nb)
         			impl.Dgelq2(ib, n-i, a[i*lda+i:], lda, tau[i:], work)
        @@ -81,4 +93,5 @@ func (impl Implementation) Dgelqf(m, n int, a []float64, lda int, tau, work []fl
         	if i < k {
         		impl.Dgelq2(m-i, n-i, a[i*lda+i:], lda, tau[i:], work)
         	}
        +	work[0] = float64(iws)
         }
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dgels.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dgels.go
        index 214b96630..cb0dbe86f 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dgels.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dgels.go
        @@ -20,7 +20,7 @@ import (
         //  2. If m < n and trans == blas.NoTrans, Dgels finds the minimum norm solution of
         //     A * X = B.
         //  3. If m >= n and trans == blas.Trans, Dgels finds the minimum norm solution of
        -//     A^T * X = B.
        +//     Aᵀ * X = B.
         //  4. If m < n and trans == blas.Trans, Dgels finds X such that || A*X - B||_2
         //     is minimized.
         // Note that the least-squares solutions (cases 1 and 3) perform the minimization
        @@ -39,46 +39,63 @@ import (
         // In the special case that lwork == -1, work[0] will be set to the optimal working
         // length.
         func (impl Implementation) Dgels(trans blas.Transpose, m, n, nrhs int, a []float64, lda int, b []float64, ldb int, work []float64, lwork int) bool {
        -	notran := trans == blas.NoTrans
        -	checkMatrix(m, n, a, lda)
         	mn := min(m, n)
        -	checkMatrix(max(m, n), nrhs, b, ldb)
        +	minwrk := mn + max(mn, nrhs)
        +	switch {
        +	case trans != blas.NoTrans && trans != blas.Trans && trans != blas.ConjTrans:
        +		panic(badTrans)
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case nrhs < 0:
        +		panic(nrhsLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	case ldb < max(1, nrhs):
        +		panic(badLdB)
        +	case lwork < max(1, minwrk) && lwork != -1:
        +		panic(badLWork)
        +	case len(work) < max(1, lwork):
        +		panic(shortWork)
        +	}
         
        -	// Find optimal block size.
        -	tpsd := true
        -	if notran {
        -		tpsd = false
        +	// Quick return if possible.
        +	if mn == 0 || nrhs == 0 {
        +		impl.Dlaset(blas.All, max(m, n), nrhs, 0, 0, b, ldb)
        +		work[0] = 1
        +		return true
         	}
        +
        +	// Find optimal block size.
         	var nb int
         	if m >= n {
         		nb = impl.Ilaenv(1, "DGEQRF", " ", m, n, -1, -1)
        -		if tpsd {
        +		if trans != blas.NoTrans {
         			nb = max(nb, impl.Ilaenv(1, "DORMQR", "LN", m, nrhs, n, -1))
         		} else {
         			nb = max(nb, impl.Ilaenv(1, "DORMQR", "LT", m, nrhs, n, -1))
         		}
         	} else {
         		nb = impl.Ilaenv(1, "DGELQF", " ", m, n, -1, -1)
        -		if tpsd {
        +		if trans != blas.NoTrans {
         			nb = max(nb, impl.Ilaenv(1, "DORMLQ", "LT", n, nrhs, m, -1))
         		} else {
         			nb = max(nb, impl.Ilaenv(1, "DORMLQ", "LN", n, nrhs, m, -1))
         		}
         	}
        +	wsize := max(1, mn+max(mn, nrhs)*nb)
        +	work[0] = float64(wsize)
        +
         	if lwork == -1 {
        -		work[0] = float64(max(1, mn+max(mn, nrhs)*nb))
         		return true
         	}
         
        -	if len(work) < lwork {
        -		panic(shortWork)
        -	}
        -	if lwork < mn+max(mn, nrhs) {
        -		panic(badWork)
        -	}
        -	if m == 0 || n == 0 || nrhs == 0 {
        -		impl.Dlaset(blas.All, max(m, n), nrhs, 0, 0, b, ldb)
        -		return true
        +	switch {
        +	case len(a) < (m-1)*lda+n:
        +		panic(shortA)
        +	case len(b) < (max(m, n)-1)*ldb+nrhs:
        +		panic(shortB)
         	}
         
         	// Scale the input matrices if they contain extreme values.
        @@ -97,7 +114,7 @@ func (impl Implementation) Dgels(trans blas.Transpose, m, n, nrhs int, a []float
         		return true
         	}
         	brow := m
        -	if tpsd {
        +	if trans != blas.NoTrans {
         		brow = n
         	}
         	bnrm := impl.Dlange(lapack.MaxAbs, brow, nrhs, b, ldb, nil)
        @@ -114,7 +131,7 @@ func (impl Implementation) Dgels(trans blas.Transpose, m, n, nrhs int, a []float
         	var scllen int
         	if m >= n {
         		impl.Dgeqrf(m, n, a, lda, work, work[mn:], lwork-mn)
        -		if !tpsd {
        +		if trans == blas.NoTrans {
         			impl.Dormqr(blas.Left, blas.Trans, m, nrhs, n,
         				a, lda,
         				work[:n],
        @@ -148,7 +165,7 @@ func (impl Implementation) Dgels(trans blas.Transpose, m, n, nrhs int, a []float
         		}
         	} else {
         		impl.Dgelqf(m, n, a, lda, work, work[mn:], lwork-mn)
        -		if !tpsd {
        +		if trans == blas.NoTrans {
         			ok := impl.Dtrtrs(blas.Lower, blas.NoTrans, blas.NonUnit,
         				m, nrhs,
         				a, lda,
        @@ -196,5 +213,7 @@ func (impl Implementation) Dgels(trans blas.Transpose, m, n, nrhs int, a []float
         	if ibscl == 2 {
         		impl.Dlascl(lapack.General, 0, 0, bignum, bnrm, scllen, nrhs, b, ldb)
         	}
        +
        +	work[0] = float64(wsize)
         	return true
         }
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dgeql2.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dgeql2.go
        index 6d9b7413f..73e42d1a7 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dgeql2.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dgeql2.go
        @@ -14,7 +14,7 @@ import "gonum.org/v1/gonum/blas"
         // Q is represented as a product of elementary reflectors,
         //  Q = H_{k-1} * ... * H_1 * H_0
         // where k = min(m,n) and each H_i has the form
        -//  H_i = I - tau[i] * v_i * v_i^T
        +//  H_i = I - tau[i] * v_i * v_iᵀ
         // Vector v_i has v[m-k+i+1:m] = 0, v[m-k+i] = 1, and v[:m-k+i+1] is stored on
         // exit in A[0:m-k+i-1, n-k+i].
         //
        @@ -24,14 +24,30 @@ import "gonum.org/v1/gonum/blas"
         //
         // Dgeql2 is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dgeql2(m, n int, a []float64, lda int, tau, work []float64) {
        -	checkMatrix(m, n, a, lda)
        -	if len(tau) < min(m, n) {
        -		panic(badTau)
        -	}
        -	if len(work) < n {
        -		panic(badWork)
        +	switch {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
         	}
        +
        +	// Quick return if possible.
         	k := min(m, n)
        +	if k == 0 {
        +		return
        +	}
        +
        +	switch {
        +	case len(a) < (m-1)*lda+n:
        +		panic(shortA)
        +	case len(tau) < k:
        +		panic(shortTau)
        +	case len(work) < n:
        +		panic(shortWork)
        +	}
        +
         	var aii float64
         	for i := k - 1; i >= 0; i-- {
         		// Generate elementary reflector H_i to annihilate A[0:m-k+i-1, n-k+i].
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dgeqp3.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dgeqp3.go
        index ef71b3ad2..d072d2885 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dgeqp3.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dgeqp3.go
        @@ -15,7 +15,7 @@ import (
         // The matrix Q is represented as a product of elementary reflectors
         //  Q = H_0 H_1 . . . H_{k-1}, where k = min(m,n).
         // Each H_i has the form
        -//  H_i = I - tau * v * v^T
        +//  H_i = I - tau * v * vᵀ
         // where tau and v are real vectors with v[0:i-1] = 0 and v[i] = 1;
         // v[i:m] is stored on exit in A[i:m, i], and tau in tau[i].
         //
        @@ -45,38 +45,50 @@ func (impl Implementation) Dgeqp3(m, n int, a []float64, lda int, jpvt []int, ta
         		inbmin = 2
         		ixover = 3
         	)
        -	checkMatrix(m, n, a, lda)
         
        -	if len(jpvt) != n {
        -		panic(badIpiv)
        -	}
        -	for _, v := range jpvt {
        -		if v < -1 || n <= v {
        -			panic("lapack: jpvt element out of range")
        -		}
        -	}
         	minmn := min(m, n)
        -	if len(work) < max(1, lwork) {
        -		panic(badWork)
        +	iws := 3*n + 1
        +	if minmn == 0 {
        +		iws = 1
        +	}
        +	switch {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	case lwork < iws && lwork != -1:
        +		panic(badLWork)
        +	case len(work) < max(1, lwork):
        +		panic(shortWork)
         	}
         
        -	var iws, lwkopt, nb int
        +	// Quick return if possible.
         	if minmn == 0 {
        -		iws = 1
        -		lwkopt = 1
        -	} else {
        -		iws = 3*n + 1
        -		nb = impl.Ilaenv(inb, "DGEQRF", " ", m, n, -1, -1)
        -		lwkopt = 2*n + (n+1)*nb
        +		work[0] = 1
        +		return
         	}
        -	work[0] = float64(lwkopt)
         
        +	nb := impl.Ilaenv(inb, "DGEQRF", " ", m, n, -1, -1)
         	if lwork == -1 {
        +		work[0] = float64(2*n + (n+1)*nb)
         		return
         	}
         
        -	if len(tau) < minmn {
        -		panic(badTau)
        +	switch {
        +	case len(a) < (m-1)*lda+n:
        +		panic(shortA)
        +	case len(jpvt) != n:
        +		panic(badLenJpvt)
        +	case len(tau) < minmn:
        +		panic(shortTau)
        +	}
        +
        +	for _, v := range jpvt {
        +		if v < -1 || n <= v {
        +			panic(badJpvt)
        +		}
         	}
         
         	bi := blas64.Implementation()
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dgeqr2.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dgeqr2.go
        index 05df42653..57bf37729 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dgeqr2.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dgeqr2.go
        @@ -22,7 +22,7 @@ import "gonum.org/v1/gonum/blas"
         //  v[j] = 0           j < i
         //  v[j] = 1           j == i
         //  v[j] = a[j*lda+i]  j > i
        -// and computing H_i = I - tau[i] * v * v^T.
        +// and computing H_i = I - tau[i] * v * vᵀ.
         //
         // The orthonormal matrix Q can be constructed from a product of these elementary
         // reflectors, Q = H_0 * H_1 * ... * H_{k-1}, where k = min(m,n).
        @@ -34,14 +34,31 @@ func (impl Implementation) Dgeqr2(m, n int, a []float64, lda int, tau, work []fl
         	// TODO(btracey): This is oriented such that columns of a are eliminated.
         	// This likely could be re-arranged to take better advantage of row-major
         	// storage.
        -	checkMatrix(m, n, a, lda)
        -	if len(work) < n {
        -		panic(badWork)
        +
        +	switch {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	case len(work) < n:
        +		panic(shortWork)
         	}
        +
        +	// Quick return if possible.
         	k := min(m, n)
        -	if len(tau) < k {
        -		panic(badTau)
        +	if k == 0 {
        +		return
         	}
        +
        +	switch {
        +	case len(a) < (m-1)*lda+n:
        +		panic(shortA)
        +	case len(tau) < k:
        +		panic(shortTau)
        +	}
        +
         	for i := 0; i < k; i++ {
         		// Generate elementary reflector H_i.
         		a[i*lda+i], tau[i] = impl.Dlarfg(m-i, a[i*lda+i], a[min((i+1), m-1)*lda+i:], lda)
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dgeqrf.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dgeqrf.go
        index a8a8155a8..d14088a16 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dgeqrf.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dgeqrf.go
        @@ -22,32 +22,43 @@ import (
         //
         // tau must have length at least min(m,n), and this function will panic otherwise.
         func (impl Implementation) Dgeqrf(m, n int, a []float64, lda int, tau, work []float64, lwork int) {
        -	if len(work) < max(1, lwork) {
        +	switch {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	case lwork < max(1, n) && lwork != -1:
        +		panic(badLWork)
        +	case len(work) < max(1, lwork):
         		panic(shortWork)
         	}
        +
        +	// Quick return if possible.
        +	k := min(m, n)
        +	if k == 0 {
        +		work[0] = 1
        +		return
        +	}
        +
         	// nb is the optimal blocksize, i.e. the number of columns transformed at a time.
         	nb := impl.Ilaenv(1, "DGEQRF", " ", m, n, -1, -1)
        -	lworkopt := max(1, n*nb)
         	if lwork == -1 {
        -		work[0] = float64(lworkopt)
        +		work[0] = float64(n * nb)
         		return
         	}
        -	checkMatrix(m, n, a, lda)
        -	if lwork < n {
        -		panic(badWork)
        +
        +	if len(a) < (m-1)*lda+n {
        +		panic(shortA)
         	}
        -	k := min(m, n)
         	if len(tau) < k {
        -		panic(badTau)
        -	}
        -	if k == 0 {
        -		work[0] = 1
        -		return
        +		panic(shortTau)
         	}
        +
         	nbmin := 2 // Minimal block size.
         	var nx int // Use unblocked (unless changed in the next for loop)
         	iws := n
        -	ldwork := nb
         	// Only consider blocked if the suggested block size is > 1 and the
         	// number of rows or columns is sufficiently large.
         	if 1 < nb && nb < k {
        @@ -55,7 +66,7 @@ func (impl Implementation) Dgeqrf(m, n int, a []float64, lda int, tau, work []fl
         		// to unblocked.
         		nx = max(0, impl.Ilaenv(3, "DGEQRF", " ", m, n, -1, -1))
         		if k > nx {
        -			iws = ldwork * n
        +			iws = n * nb
         			if lwork < iws {
         				// Not enough workspace to use the optimal block
         				// size. Get the minimum block size instead.
        @@ -64,18 +75,17 @@ func (impl Implementation) Dgeqrf(m, n int, a []float64, lda int, tau, work []fl
         			}
         		}
         	}
        -	for i := range work {
        -		work[i] = 0
        -	}
        +
         	// Compute QR using a blocked algorithm.
         	var i int
         	if nbmin <= nb && nb < k && nx < k {
        +		ldwork := nb
         		for i = 0; i < k-nx; i += nb {
         			ib := min(k-i, nb)
         			// Compute the QR factorization of the current block.
         			impl.Dgeqr2(m-i, ib, a[i*lda+i:], lda, tau[i:], work)
         			if i+ib < n {
        -				// Form the triangular factor of the block reflector and apply H^T
        +				// Form the triangular factor of the block reflector and apply Hᵀ
         				// In Dlarft, work becomes the T matrix.
         				impl.Dlarft(lapack.Forward, lapack.ColumnWise, m-i, ib,
         					a[i*lda+i:], lda,
        @@ -94,5 +104,5 @@ func (impl Implementation) Dgeqrf(m, n int, a []float64, lda int, tau, work []fl
         	if i < k {
         		impl.Dgeqr2(m-i, n-i, a[i*lda+i:], lda, tau[i:], work)
         	}
        -	work[0] = float64(lworkopt)
        +	work[0] = float64(iws)
         }
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dgerq2.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dgerq2.go
        index 52ac2cb8e..a06dec5a0 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dgerq2.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dgerq2.go
        @@ -19,7 +19,7 @@ import "gonum.org/v1/gonum/blas"
         // The matrix Q is represented as a product of elementary reflectors
         //  Q = H_0 H_1 . . . H_{min(m,n)-1}.
         // Each H(i) has the form
        -//  H_i = I - tau_i * v * v^T
        +//  H_i = I - tau_i * v * vᵀ
         // where v is a vector with v[0:n-k+i-1] stored in A[m-k+i, 0:n-k+i-1],
         // v[n-k+i:n] = 0 and v[n-k+i] = 1.
         //
        @@ -28,13 +28,28 @@ import "gonum.org/v1/gonum/blas"
         //
         // Dgerq2 is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dgerq2(m, n int, a []float64, lda int, tau, work []float64) {
        -	checkMatrix(m, n, a, lda)
        +	switch {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	case len(work) < m:
        +		panic(shortWork)
        +	}
        +
        +	// Quick return if possible.
         	k := min(m, n)
        -	if len(tau) < k {
        -		panic(badTau)
        +	if k == 0 {
        +		return
         	}
        -	if len(work) < m {
        -		panic(badWork)
        +
        +	switch {
        +	case len(a) < (m-1)*lda+n:
        +		panic(shortA)
        +	case len(tau) < k:
        +		panic(shortTau)
         	}
         
         	for i := k - 1; i >= 0; i-- {
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dgerqf.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dgerqf.go
        index 7ecdf55f3..861155485 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dgerqf.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dgerqf.go
        @@ -22,7 +22,7 @@ import (
         // The matrix Q is represented as a product of elementary reflectors
         //  Q = H_0 H_1 . . . H_{min(m,n)-1}.
         // Each H(i) has the form
        -//  H_i = I - tau_i * v * v^T
        +//  H_i = I - tau_i * v * vᵀ
         // where v is a vector with v[0:n-k+i-1] stored in A[m-k+i, 0:n-k+i-1],
         // v[n-k+i:n] = 0 and v[n-k+i] = 1.
         //
        @@ -32,36 +32,37 @@ import (
         //
         // Dgerqf is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dgerqf(m, n int, a []float64, lda int, tau, work []float64, lwork int) {
        -	checkMatrix(m, n, a, lda)
        -
        -	if len(work) < max(1, lwork) {
        +	switch {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	case lwork < max(1, m) && lwork != -1:
        +		panic(badLWork)
        +	case len(work) < max(1, lwork):
         		panic(shortWork)
         	}
        -	if lwork != -1 && lwork < max(1, m) {
        -		panic(badWork)
        -	}
         
        +	// Quick return if possible.
         	k := min(m, n)
        -	if len(tau) != k {
        -		panic(badTau)
        -	}
        -
        -	var nb, lwkopt int
         	if k == 0 {
        -		lwkopt = 1
        -	} else {
        -		nb = impl.Ilaenv(1, "DGERQF", " ", m, n, -1, -1)
        -		lwkopt = m * nb
        +		work[0] = 1
        +		return
         	}
        -	work[0] = float64(lwkopt)
         
        +	nb := impl.Ilaenv(1, "DGERQF", " ", m, n, -1, -1)
         	if lwork == -1 {
        +		work[0] = float64(m * nb)
         		return
         	}
         
        -	// Return quickly if possible.
        -	if k == 0 {
        -		return
        +	if len(a) < (m-1)*lda+n {
        +		panic(shortA)
        +	}
        +	if len(tau) != k {
        +		panic(badLenTau)
         	}
         
         	nbmin := 2
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dgesvd.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dgesvd.go
        index 6dcfda9ca..f2e985470 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dgesvd.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dgesvd.go
        @@ -17,7 +17,7 @@ const noSVDO = "dgesvd: not coded for overwrite"
         // Dgesvd computes the singular value decomposition of the input matrix A.
         //
         // The singular value decomposition is
        -//  A = U * Sigma * V^T
        +//  A = U * Sigma * Vᵀ
         // where Sigma is an m×n diagonal matrix containing the singular values of A,
         // U is an m×m orthogonal matrix and V is an n×n orthogonal matrix. The first
         // min(m,n) columns of U and V are the left and right singular vectors of A
        @@ -29,7 +29,7 @@ const noSVDO = "dgesvd: not coded for overwrite"
         //  jobU == lapack.SVDStore     The first min(m,n) columns are returned in u
         //  jobU == lapack.SVDOverwrite The first min(m,n) columns of U are written into a
         //  jobU == lapack.SVDNone      The columns of U are not computed.
        -// The behavior is the same for jobVT and the rows of V^T. At most one of jobU
        +// The behavior is the same for jobVT and the rows of Vᵀ. At most one of jobU
         // and jobVT can equal lapack.SVDOverwrite, and Dgesvd will panic otherwise.
         //
         // On entry, a contains the data for the m×n matrix A. During the call to Dgesvd
        @@ -45,7 +45,7 @@ const noSVDO = "dgesvd: not coded for overwrite"
         // not used.
         //
         // vt contains the left singular vectors on exit, stored row-wise. If
        -// jobV == lapack.SVDAll, vt is of size n×m. If jobVT == lapack.SVDStore vt is
        +// jobV == lapack.SVDAll, vt is of size n×n. If jobVT == lapack.SVDStore vt is
         // of size min(m,n)×n. If jobVT == lapack.SVDOverwrite or lapack.SVDNone, vt is
         // not used.
         //
        @@ -57,70 +57,87 @@ const noSVDO = "dgesvd: not coded for overwrite"
         //
         // Dgesvd returns whether the decomposition successfully completed.
         func (impl Implementation) Dgesvd(jobU, jobVT lapack.SVDJob, m, n int, a []float64, lda int, s, u []float64, ldu int, vt []float64, ldvt int, work []float64, lwork int) (ok bool) {
        -	minmn := min(m, n)
        -	checkMatrix(m, n, a, lda)
        -	if jobU == lapack.SVDAll {
        -		checkMatrix(m, m, u, ldu)
        -	} else if jobU == lapack.SVDStore {
        -		checkMatrix(m, minmn, u, ldu)
        -	}
        -	if jobVT == lapack.SVDAll {
        -		checkMatrix(n, n, vt, ldvt)
        -	} else if jobVT == lapack.SVDStore {
        -		checkMatrix(minmn, n, vt, ldvt)
        -	}
        -	if jobU == lapack.SVDOverwrite && jobVT == lapack.SVDOverwrite {
        -		panic("lapack: both jobU and jobVT are lapack.SVDOverwrite")
        -	}
        -	if len(s) < minmn {
        -		panic(badS)
        -	}
         	if jobU == lapack.SVDOverwrite || jobVT == lapack.SVDOverwrite {
         		panic(noSVDO)
         	}
        -	if m == 0 || n == 0 {
        -		return true
        -	}
         
         	wantua := jobU == lapack.SVDAll
         	wantus := jobU == lapack.SVDStore
         	wantuas := wantua || wantus
         	wantuo := jobU == lapack.SVDOverwrite
         	wantun := jobU == lapack.SVDNone
        +	if !(wantua || wantus || wantuo || wantun) {
        +		panic(badSVDJob)
        +	}
         
         	wantva := jobVT == lapack.SVDAll
         	wantvs := jobVT == lapack.SVDStore
         	wantvas := wantva || wantvs
         	wantvo := jobVT == lapack.SVDOverwrite
         	wantvn := jobVT == lapack.SVDNone
        +	if !(wantva || wantvs || wantvo || wantvn) {
        +		panic(badSVDJob)
        +	}
         
        -	bi := blas64.Implementation()
        -	var mnthr int
        +	if wantuo && wantvo {
        +		panic(bothSVDOver)
        +	}
         
        -	// Compute optimal space for subroutines.
        -	maxwrk := 1
        +	minmn := min(m, n)
        +	minwork := 1
        +	if minmn > 0 {
        +		minwork = max(3*minmn+max(m, n), 5*minmn)
        +	}
        +	switch {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	case ldu < 1, wantua && ldu < m, wantus && ldu < minmn:
        +		panic(badLdU)
        +	case ldvt < 1 || (wantvas && ldvt < n):
        +		panic(badLdVT)
        +	case lwork < minwork && lwork != -1:
        +		panic(badLWork)
        +	case len(work) < max(1, lwork):
        +		panic(shortWork)
        +	}
        +
        +	// Quick return if possible.
        +	if minmn == 0 {
        +		work[0] = 1
        +		return true
        +	}
        +
        +	// Compute optimal workspace size for subroutines.
         	opts := string(jobU) + string(jobVT)
        +	mnthr := impl.Ilaenv(6, "DGESVD", opts, m, n, 0, 0)
        +	maxwrk := 1
         	var wrkbl, bdspac int
         	if m >= n {
        -		mnthr = impl.Ilaenv(6, "DGESVD", opts, m, n, 0, 0)
         		bdspac = 5 * n
         		impl.Dgeqrf(m, n, a, lda, nil, work, -1)
         		lwork_dgeqrf := int(work[0])
        +
         		impl.Dorgqr(m, n, n, a, lda, nil, work, -1)
         		lwork_dorgqr_n := int(work[0])
         		impl.Dorgqr(m, m, n, a, lda, nil, work, -1)
         		lwork_dorgqr_m := int(work[0])
        +
         		impl.Dgebrd(n, n, a, lda, s, nil, nil, nil, work, -1)
         		lwork_dgebrd := int(work[0])
        +
         		impl.Dorgbr(lapack.GeneratePT, n, n, n, a, lda, nil, work, -1)
         		lwork_dorgbr_p := int(work[0])
        +
         		impl.Dorgbr(lapack.GenerateQ, n, n, n, a, lda, nil, work, -1)
         		lwork_dorgbr_q := int(work[0])
         
         		if m >= mnthr {
        -			// m >> n
         			if wantun {
        -				// Path 1
        +				// Path 1 (m much larger than n, jobU == None)
         				maxwrk = n + lwork_dgeqrf
         				maxwrk = max(maxwrk, 3*n+lwork_dgebrd)
         				if wantvo || wantvas {
        @@ -128,15 +145,15 @@ func (impl Implementation) Dgesvd(jobU, jobVT lapack.SVDJob, m, n int, a []float
         				}
         				maxwrk = max(maxwrk, bdspac)
         			} else if wantuo && wantvn {
        -				// Path 2
        +				// Path 2 (m much larger than n, jobU == Overwrite, jobVT == None)
         				wrkbl = n + lwork_dgeqrf
         				wrkbl = max(wrkbl, n+lwork_dorgqr_n)
         				wrkbl = max(wrkbl, 3*n+lwork_dgebrd)
         				wrkbl = max(wrkbl, 3*n+lwork_dorgbr_q)
         				wrkbl = max(wrkbl, bdspac)
         				maxwrk = max(n*n+wrkbl, n*n+m*n+n)
        -			} else if wantuo && wantvs {
        -				// Path 3
        +			} else if wantuo && wantvas {
        +				// Path 3 (m much larger than n, jobU == Overwrite, jobVT == Store or All)
         				wrkbl = n + lwork_dgeqrf
         				wrkbl = max(wrkbl, n+lwork_dorgqr_n)
         				wrkbl = max(wrkbl, 3*n+lwork_dgebrd)
        @@ -145,7 +162,7 @@ func (impl Implementation) Dgesvd(jobU, jobVT lapack.SVDJob, m, n int, a []float
         				wrkbl = max(wrkbl, bdspac)
         				maxwrk = max(n*n+wrkbl, n*n+m*n+n)
         			} else if wantus && wantvn {
        -				// Path 4
        +				// Path 4 (m much larger than n, jobU == Store, jobVT == None)
         				wrkbl = n + lwork_dgeqrf
         				wrkbl = max(wrkbl, n+lwork_dorgqr_n)
         				wrkbl = max(wrkbl, 3*n+lwork_dgebrd)
        @@ -153,7 +170,7 @@ func (impl Implementation) Dgesvd(jobU, jobVT lapack.SVDJob, m, n int, a []float
         				wrkbl = max(wrkbl, bdspac)
         				maxwrk = n*n + wrkbl
         			} else if wantus && wantvo {
        -				// Path 5
        +				// Path 5 (m much larger than n, jobU == Store, jobVT == Overwrite)
         				wrkbl = n + lwork_dgeqrf
         				wrkbl = max(wrkbl, n+lwork_dorgqr_n)
         				wrkbl = max(wrkbl, 3*n+lwork_dgebrd)
        @@ -162,7 +179,7 @@ func (impl Implementation) Dgesvd(jobU, jobVT lapack.SVDJob, m, n int, a []float
         				wrkbl = max(wrkbl, bdspac)
         				maxwrk = 2*n*n + wrkbl
         			} else if wantus && wantvas {
        -				// Path 6
        +				// Path 6 (m much larger than n, jobU == Store, jobVT == Store or All)
         				wrkbl = n + lwork_dgeqrf
         				wrkbl = max(wrkbl, n+lwork_dorgqr_n)
         				wrkbl = max(wrkbl, 3*n+lwork_dgebrd)
        @@ -171,7 +188,7 @@ func (impl Implementation) Dgesvd(jobU, jobVT lapack.SVDJob, m, n int, a []float
         				wrkbl = max(wrkbl, bdspac)
         				maxwrk = n*n + wrkbl
         			} else if wantua && wantvn {
        -				// Path 7
        +				// Path 7 (m much larger than n, jobU == All, jobVT == None)
         				wrkbl = n + lwork_dgeqrf
         				wrkbl = max(wrkbl, n+lwork_dorgqr_m)
         				wrkbl = max(wrkbl, 3*n+lwork_dgebrd)
        @@ -179,7 +196,7 @@ func (impl Implementation) Dgesvd(jobU, jobVT lapack.SVDJob, m, n int, a []float
         				wrkbl = max(wrkbl, bdspac)
         				maxwrk = n*n + wrkbl
         			} else if wantua && wantvo {
        -				// Path 8
        +				// Path 8 (m much larger than n, jobU == All, jobVT == Overwrite)
         				wrkbl = n + lwork_dgeqrf
         				wrkbl = max(wrkbl, n+lwork_dorgqr_m)
         				wrkbl = max(wrkbl, 3*n+lwork_dgebrd)
        @@ -188,7 +205,7 @@ func (impl Implementation) Dgesvd(jobU, jobVT lapack.SVDJob, m, n int, a []float
         				wrkbl = max(wrkbl, bdspac)
         				maxwrk = 2*n*n + wrkbl
         			} else if wantua && wantvas {
        -				// Path 9
        +				// Path 9 (m much larger than n, jobU == All, jobVT == Store or All)
         				wrkbl = n + lwork_dgeqrf
         				wrkbl = max(wrkbl, n+lwork_dorgqr_m)
         				wrkbl = max(wrkbl, 3*n+lwork_dgebrd)
        @@ -198,7 +215,7 @@ func (impl Implementation) Dgesvd(jobU, jobVT lapack.SVDJob, m, n int, a []float
         				maxwrk = n*n + wrkbl
         			}
         		} else {
        -			// Path 10: m > n
        +			// Path 10 (m at least n, but not much larger)
         			impl.Dgebrd(m, n, a, lda, s, nil, nil, nil, work, -1)
         			lwork_dgebrd := int(work[0])
         			maxwrk = 3*n + lwork_dgebrd
        @@ -218,25 +235,28 @@ func (impl Implementation) Dgesvd(jobU, jobVT lapack.SVDJob, m, n int, a []float
         			maxwrk = max(maxwrk, bdspac)
         		}
         	} else {
        -		mnthr = impl.Ilaenv(6, "DGESVD", opts, m, n, 0, 0)
        -
         		bdspac = 5 * m
        +
         		impl.Dgelqf(m, n, a, lda, nil, work, -1)
         		lwork_dgelqf := int(work[0])
        +
         		impl.Dorglq(n, n, m, nil, n, nil, work, -1)
         		lwork_dorglq_n := int(work[0])
         		impl.Dorglq(m, n, m, a, lda, nil, work, -1)
         		lwork_dorglq_m := int(work[0])
        +
         		impl.Dgebrd(m, m, a, lda, s, nil, nil, nil, work, -1)
         		lwork_dgebrd := int(work[0])
        +
         		impl.Dorgbr(lapack.GeneratePT, m, m, m, a, n, nil, work, -1)
         		lwork_dorgbr_p := int(work[0])
        +
         		impl.Dorgbr(lapack.GenerateQ, m, m, m, a, n, nil, work, -1)
         		lwork_dorgbr_q := int(work[0])
        +
         		if n >= mnthr {
        -			// n >> m
         			if wantvn {
        -				// Path 1t
        +				// Path 1t (n much larger than m, jobVT == None)
         				maxwrk = m + lwork_dgelqf
         				maxwrk = max(maxwrk, 3*m+lwork_dgebrd)
         				if wantuo || wantuas {
        @@ -244,7 +264,7 @@ func (impl Implementation) Dgesvd(jobU, jobVT lapack.SVDJob, m, n int, a []float
         				}
         				maxwrk = max(maxwrk, bdspac)
         			} else if wantvo && wantun {
        -				// Path 2t
        +				// Path 2t (n much larger than m, jobU == None, jobVT == Overwrite)
         				wrkbl = m + lwork_dgelqf
         				wrkbl = max(wrkbl, m+lwork_dorglq_m)
         				wrkbl = max(wrkbl, 3*m+lwork_dgebrd)
        @@ -252,7 +272,7 @@ func (impl Implementation) Dgesvd(jobU, jobVT lapack.SVDJob, m, n int, a []float
         				wrkbl = max(wrkbl, bdspac)
         				maxwrk = max(m*m+wrkbl, m*m+m*n+m)
         			} else if wantvo && wantuas {
        -				// Path 3t
        +				// Path 3t (n much larger than m, jobU == Store or All, jobVT == Overwrite)
         				wrkbl = m + lwork_dgelqf
         				wrkbl = max(wrkbl, m+lwork_dorglq_m)
         				wrkbl = max(wrkbl, 3*m+lwork_dgebrd)
        @@ -261,7 +281,7 @@ func (impl Implementation) Dgesvd(jobU, jobVT lapack.SVDJob, m, n int, a []float
         				wrkbl = max(wrkbl, bdspac)
         				maxwrk = max(m*m+wrkbl, m*m+m*n+m)
         			} else if wantvs && wantun {
        -				// Path 4t
        +				// Path 4t (n much larger than m, jobU == None, jobVT == Store)
         				wrkbl = m + lwork_dgelqf
         				wrkbl = max(wrkbl, m+lwork_dorglq_m)
         				wrkbl = max(wrkbl, 3*m+lwork_dgebrd)
        @@ -269,7 +289,7 @@ func (impl Implementation) Dgesvd(jobU, jobVT lapack.SVDJob, m, n int, a []float
         				wrkbl = max(wrkbl, bdspac)
         				maxwrk = m*m + wrkbl
         			} else if wantvs && wantuo {
        -				// Path 5t
        +				// Path 5t (n much larger than m, jobU == Overwrite, jobVT == Store)
         				wrkbl = m + lwork_dgelqf
         				wrkbl = max(wrkbl, m+lwork_dorglq_m)
         				wrkbl = max(wrkbl, 3*m+lwork_dgebrd)
        @@ -278,7 +298,7 @@ func (impl Implementation) Dgesvd(jobU, jobVT lapack.SVDJob, m, n int, a []float
         				wrkbl = max(wrkbl, bdspac)
         				maxwrk = 2*m*m + wrkbl
         			} else if wantvs && wantuas {
        -				// Path 6t
        +				// Path 6t (n much larger than m, jobU == Store or All, jobVT == Store)
         				wrkbl = m + lwork_dgelqf
         				wrkbl = max(wrkbl, m+lwork_dorglq_m)
         				wrkbl = max(wrkbl, 3*m+lwork_dgebrd)
        @@ -287,7 +307,7 @@ func (impl Implementation) Dgesvd(jobU, jobVT lapack.SVDJob, m, n int, a []float
         				wrkbl = max(wrkbl, bdspac)
         				maxwrk = m*m + wrkbl
         			} else if wantva && wantun {
        -				// Path 7t
        +				// Path 7t (n much larger than m, jobU== None, jobVT == All)
         				wrkbl = m + lwork_dgelqf
         				wrkbl = max(wrkbl, m+lwork_dorglq_n)
         				wrkbl = max(wrkbl, 3*m+lwork_dgebrd)
        @@ -295,7 +315,7 @@ func (impl Implementation) Dgesvd(jobU, jobVT lapack.SVDJob, m, n int, a []float
         				wrkbl = max(wrkbl, bdspac)
         				maxwrk = m*m + wrkbl
         			} else if wantva && wantuo {
        -				// Path 8t
        +				// Path 8t (n much larger than m, jobU == Overwrite, jobVT == All)
         				wrkbl = m + lwork_dgelqf
         				wrkbl = max(wrkbl, m+lwork_dorglq_n)
         				wrkbl = max(wrkbl, 3*m+lwork_dgebrd)
        @@ -304,7 +324,7 @@ func (impl Implementation) Dgesvd(jobU, jobVT lapack.SVDJob, m, n int, a []float
         				wrkbl = max(wrkbl, bdspac)
         				maxwrk = 2*m*m + wrkbl
         			} else if wantva && wantuas {
        -				// Path 9t
        +				// Path 9t (n much larger than m, jobU == Store or All, jobVT == All)
         				wrkbl = m + lwork_dgelqf
         				wrkbl = max(wrkbl, m+lwork_dorglq_n)
         				wrkbl = max(wrkbl, 3*m+lwork_dgebrd)
        @@ -314,7 +334,7 @@ func (impl Implementation) Dgesvd(jobU, jobVT lapack.SVDJob, m, n int, a []float
         				maxwrk = m*m + wrkbl
         			}
         		} else {
        -			// Path 10t, n > m
        +			// Path 10t (n greater than m, but not much larger)
         			impl.Dgebrd(m, n, a, lda, s, nil, nil, nil, work, -1)
         			lwork_dgebrd = int(work[0])
         			maxwrk = 3*m + lwork_dgebrd
        @@ -335,27 +355,23 @@ func (impl Implementation) Dgesvd(jobU, jobVT lapack.SVDJob, m, n int, a []float
         		}
         	}
         
        -	minWork := max(1, 5*minmn)
        -	if !((wantun && m >= mnthr) || (wantvn && n >= mnthr)) {
        -		minWork = max(minWork, 3*minmn+max(m, n))
        +	maxwrk = max(maxwrk, minwork)
        +	if lwork == -1 {
        +		work[0] = float64(maxwrk)
        +		return true
         	}
         
        -	if lwork != -1 {
        -		if len(work) < lwork {
        -			panic(badWork)
        -		}
        -		if lwork < minWork {
        -			panic(badWork)
        -		}
        +	if len(a) < (m-1)*lda+n {
        +		panic(shortA)
         	}
        -	if m == 0 || n == 0 {
        -		return true
        +	if len(s) < minmn {
        +		panic(shortS)
         	}
        -
        -	maxwrk = max(maxwrk, minWork)
        -	work[0] = float64(maxwrk)
        -	if lwork == -1 {
        -		return true
        +	if (len(u) < (m-1)*ldu+m && wantua) || (len(u) < (m-1)*ldu+minmn && wantus) {
        +		panic(shortU)
        +	}
        +	if (len(vt) < (n-1)*ldvt+n && wantva) || (len(vt) < (minmn-1)*ldvt+n && wantvs) {
        +		panic(shortVT)
         	}
         
         	// Perform decomposition.
        @@ -374,6 +390,7 @@ func (impl Implementation) Dgesvd(jobU, jobVT lapack.SVDJob, m, n int, a []float
         		impl.Dlascl(lapack.General, 0, 0, anrm, bignum, m, n, a, lda)
         	}
         
        +	bi := blas64.Implementation()
         	var ie int
         	if m >= n {
         		// If A has sufficiently more rows than columns, use the QR decomposition.
        @@ -773,7 +790,9 @@ func (impl Implementation) Dgesvd(jobU, jobVT lapack.SVDJob, m, n int, a []float
         
         						// Copy R from A to VT, zeroing out below it.
         						impl.Dlacpy(blas.Upper, n, n, a, lda, vt, ldvt)
        -						impl.Dlaset(blas.Lower, n-1, n-1, 0, 0, vt[ldvt:], ldvt)
        +						if n > 1 {
        +							impl.Dlaset(blas.Lower, n-1, n-1, 0, 0, vt[ldvt:], ldvt)
        +						}
         
         						ie := itau
         						itauq := ie + n
        @@ -796,7 +815,7 @@ func (impl Implementation) Dgesvd(jobU, jobVT lapack.SVDJob, m, n int, a []float
         						// Perform bidiagonal QR iteration, computing left singular
         						// vectors of A in U and computing right singular vectors
         						// of A in VT.
        -						impl.Dbdsqr(blas.Upper, n, n, m, 0, s, work[ie:],
        +						ok = impl.Dbdsqr(blas.Upper, n, n, m, 0, s, work[ie:],
         							vt, ldvt, u, ldu, work, 1, work[iwork:])
         					}
         				}
        @@ -1081,7 +1100,7 @@ func (impl Implementation) Dgesvd(jobU, jobVT lapack.SVDJob, m, n int, a []float
         						// Perform bidiagonal QR iteration, computing left singular
         						// vectors of A in U and computing right singular vectors
         						// of A in VT.
        -						impl.Dbdsqr(blas.Upper, m, n, m, 0, s, work[ie:], vt, ldvt,
        +						ok = impl.Dbdsqr(blas.Upper, m, n, m, 0, s, work[ie:], vt, ldvt,
         							u, ldu, work, 1, work[iwork:])
         					}
         				}
        @@ -1338,16 +1357,16 @@ func (impl Implementation) Dgesvd(jobU, jobVT lapack.SVDJob, m, n int, a []float
         	// Undo scaling if necessary.
         	if iscl {
         		if anrm > bignum {
        -			impl.Dlascl(lapack.General, 0, 0, bignum, anrm, minmn, 1, s, minmn)
        +			impl.Dlascl(lapack.General, 0, 0, bignum, anrm, 1, minmn, s, minmn)
         		}
         		if !ok && anrm > bignum {
        -			impl.Dlascl(lapack.General, 0, 0, bignum, anrm, minmn-1, 1, work[minmn:], minmn)
        +			impl.Dlascl(lapack.General, 0, 0, bignum, anrm, 1, minmn-1, work[1:], minmn)
         		}
         		if anrm < smlnum {
        -			impl.Dlascl(lapack.General, 0, 0, smlnum, anrm, minmn, 1, s, minmn)
        +			impl.Dlascl(lapack.General, 0, 0, smlnum, anrm, 1, minmn, s, minmn)
         		}
         		if !ok && anrm < smlnum {
        -			impl.Dlascl(lapack.General, 0, 0, smlnum, anrm, minmn-1, 1, work[minmn:], minmn)
        +			impl.Dlascl(lapack.General, 0, 0, smlnum, anrm, 1, minmn-1, work[1:], minmn)
         		}
         	}
         	work[0] = float64(maxwrk)
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dgetf2.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dgetf2.go
        index 1256bf343..63ad72e99 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dgetf2.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dgetf2.go
        @@ -29,14 +29,29 @@ import (
         // Dgetf2 is an internal routine. It is exported for testing purposes.
         func (Implementation) Dgetf2(m, n int, a []float64, lda int, ipiv []int) (ok bool) {
         	mn := min(m, n)
        -	checkMatrix(m, n, a, lda)
        -	if len(ipiv) < mn {
        -		panic(badIpiv)
        +	switch {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
         	}
        -	if m == 0 || n == 0 {
        +
        +	// Quick return if possible.
        +	if mn == 0 {
         		return true
         	}
        +
        +	switch {
        +	case len(a) < (m-1)*lda+n:
        +		panic(shortA)
        +	case len(ipiv) != mn:
        +		panic(badLenIpiv)
        +	}
        +
         	bi := blas64.Implementation()
        +
         	sfmin := dlamchS
         	ok = true
         	for j := 0; j < mn; j++ {
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dgetrf.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dgetrf.go
        index 7c0cc25bb..ad01e71e4 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dgetrf.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dgetrf.go
        @@ -28,23 +28,38 @@ import (
         // system of equations.
         func (impl Implementation) Dgetrf(m, n int, a []float64, lda int, ipiv []int) (ok bool) {
         	mn := min(m, n)
        -	checkMatrix(m, n, a, lda)
        -	if len(ipiv) < mn {
        -		panic(badIpiv)
        +	switch {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
         	}
        -	if m == 0 || n == 0 {
        -		return false
        +
        +	// Quick return if possible.
        +	if mn == 0 {
        +		return true
        +	}
        +
        +	switch {
        +	case len(a) < (m-1)*lda+n:
        +		panic(shortA)
        +	case len(ipiv) != mn:
        +		panic(badLenIpiv)
         	}
        +
         	bi := blas64.Implementation()
        +
         	nb := impl.Ilaenv(1, "DGETRF", " ", m, n, -1, -1)
        -	if nb <= 1 || nb >= min(m, n) {
        +	if nb <= 1 || mn <= nb {
         		// Use the unblocked algorithm.
         		return impl.Dgetf2(m, n, a, lda, ipiv)
         	}
         	ok = true
         	for j := 0; j < mn; j += nb {
         		jb := min(mn-j, nb)
        -		blockOk := impl.Dgetf2(m-j, jb, a[j*lda+j:], lda, ipiv[j:])
        +		blockOk := impl.Dgetf2(m-j, jb, a[j*lda+j:], lda, ipiv[j:j+jb])
         		if !blockOk {
         			ok = false
         		}
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dgetri.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dgetri.go
        index 47f6306e8..b2f2ae46b 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dgetri.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dgetri.go
        @@ -22,71 +22,95 @@ import (
         // by the temporary space available. If lwork == -1, instead of performing Dgetri,
         // the optimal work length will be stored into work[0].
         func (impl Implementation) Dgetri(n int, a []float64, lda int, ipiv []int, work []float64, lwork int) (ok bool) {
        -	checkMatrix(n, n, a, lda)
        -	if len(ipiv) < n {
        -		panic(badIpiv)
        +	iws := max(1, n)
        +	switch {
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	case lwork < iws && lwork != -1:
        +		panic(badLWork)
        +	case len(work) < max(1, lwork):
        +		panic(shortWork)
         	}
        +
        +	if n == 0 {
        +		work[0] = 1
        +		return true
        +	}
        +
         	nb := impl.Ilaenv(1, "DGETRI", " ", n, -1, -1, -1)
         	if lwork == -1 {
         		work[0] = float64(n * nb)
         		return true
         	}
        -	if lwork < n {
        -		panic(badWork)
        -	}
        -	if len(work) < lwork {
        -		panic(badWork)
        -	}
        -	if n == 0 {
        -		return true
        +
        +	switch {
        +	case len(a) < (n-1)*lda+n:
        +		panic(shortA)
        +	case len(ipiv) != n:
        +		panic(badLenIpiv)
         	}
        +
        +	// Form inv(U).
         	ok = impl.Dtrtri(blas.Upper, blas.NonUnit, n, a, lda)
         	if !ok {
         		return false
         	}
        +
         	nbmin := 2
        -	ldwork := nb
        -	if nb > 1 && nb < n {
        -		iws := max(ldwork*n, 1)
        +	if 1 < nb && nb < n {
        +		iws = max(n*nb, 1)
         		if lwork < iws {
        -			nb = lwork / ldwork
        +			nb = lwork / n
         			nbmin = max(2, impl.Ilaenv(2, "DGETRI", " ", n, -1, -1, -1))
         		}
         	}
        +	ldwork := nb
        +
         	bi := blas64.Implementation()
        +	// Solve the equation inv(A)*L = inv(U) for inv(A).
         	// TODO(btracey): Replace this with a more row-major oriented algorithm.
        -	if nb < nbmin || nb >= n {
        +	if nb < nbmin || n <= nb {
         		// Unblocked code.
         		for j := n - 1; j >= 0; j-- {
         			for i := j + 1; i < n; i++ {
        -				work[i*ldwork] = a[i*lda+j]
        +				// Copy current column of L to work and replace with zeros.
        +				work[i] = a[i*lda+j]
         				a[i*lda+j] = 0
         			}
        -			if j < n {
        -				bi.Dgemv(blas.NoTrans, n, n-j-1, -1, a[(j+1):], lda, work[(j+1)*ldwork:], ldwork, 1, a[j:], lda)
        +			// Compute current column of inv(A).
        +			if j < n-1 {
        +				bi.Dgemv(blas.NoTrans, n, n-j-1, -1, a[(j+1):], lda, work[(j+1):], 1, 1, a[j:], lda)
         			}
         		}
         	} else {
        +		// Blocked code.
         		nn := ((n - 1) / nb) * nb
         		for j := nn; j >= 0; j -= nb {
         			jb := min(nb, n-j)
        -			for jj := j; jj < j+jb-1; jj++ {
        +			// Copy current block column of L to work and replace
        +			// with zeros.
        +			for jj := j; jj < j+jb; jj++ {
         				for i := jj + 1; i < n; i++ {
         					work[i*ldwork+(jj-j)] = a[i*lda+jj]
         					a[i*lda+jj] = 0
         				}
         			}
        +			// Compute current block column of inv(A).
         			if j+jb < n {
         				bi.Dgemm(blas.NoTrans, blas.NoTrans, n, jb, n-j-jb, -1, a[(j+jb):], lda, work[(j+jb)*ldwork:], ldwork, 1, a[j:], lda)
        -				bi.Dtrsm(blas.Right, blas.Lower, blas.NoTrans, blas.Unit, n, jb, 1, work[j*ldwork:], ldwork, a[j:], lda)
         			}
        +			bi.Dtrsm(blas.Right, blas.Lower, blas.NoTrans, blas.Unit, n, jb, 1, work[j*ldwork:], ldwork, a[j:], lda)
         		}
         	}
        +	// Apply column interchanges.
         	for j := n - 2; j >= 0; j-- {
         		jp := ipiv[j]
         		if jp != j {
         			bi.Dswap(n, a[j:], lda, a[jp:], lda)
         		}
         	}
        +	work[0] = float64(iws)
         	return true
         }
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dgetrs.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dgetrs.go
        index da7e0c636..553193453 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dgetrs.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dgetrs.go
        @@ -11,8 +11,8 @@ import (
         
         // Dgetrs solves a system of equations using an LU factorization.
         // The system of equations solved is
        -//  A * X = B if trans == blas.Trans
        -//  A^T * X = B if trans == blas.NoTrans
        +//  A * X = B  if trans == blas.Trans
        +//  Aᵀ * X = B if trans == blas.NoTrans
         // A is a general n×n matrix with stride lda. B is a general matrix of size n×nrhs.
         //
         // On entry b contains the elements of the matrix B. On exit, b contains the
        @@ -21,18 +21,35 @@ import (
         // a and ipiv contain the LU factorization of A and the permutation indices as
         // computed by Dgetrf. ipiv is zero-indexed.
         func (impl Implementation) Dgetrs(trans blas.Transpose, n, nrhs int, a []float64, lda int, ipiv []int, b []float64, ldb int) {
        -	checkMatrix(n, n, a, lda)
        -	checkMatrix(n, nrhs, b, ldb)
        -	if len(ipiv) < n {
        -		panic(badIpiv)
        +	switch {
        +	case trans != blas.NoTrans && trans != blas.Trans && trans != blas.ConjTrans:
        +		panic(badTrans)
        +	case n < 0:
        +		panic(nLT0)
        +	case nrhs < 0:
        +		panic(nrhsLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	case ldb < max(1, nrhs):
        +		panic(badLdB)
         	}
        +
        +	// Quick return if possible.
         	if n == 0 || nrhs == 0 {
         		return
         	}
        -	if trans != blas.Trans && trans != blas.NoTrans {
        -		panic(badTrans)
        +
        +	switch {
        +	case len(a) < (n-1)*lda+n:
        +		panic(shortA)
        +	case len(b) < (n-1)*ldb+nrhs:
        +		panic(shortB)
        +	case len(ipiv) != n:
        +		panic(badLenIpiv)
         	}
        +
         	bi := blas64.Implementation()
        +
         	if trans == blas.NoTrans {
         		// Solve A * X = B.
         		impl.Dlaswp(nrhs, b, ldb, 0, n-1, ipiv, 1)
        @@ -44,11 +61,11 @@ func (impl Implementation) Dgetrs(trans blas.Transpose, n, nrhs int, a []float64
         			n, nrhs, 1, a, lda, b, ldb)
         		return
         	}
        -	// Solve A^T * X = B.
        -	// Solve U^T * X = B, updating b.
        +	// Solve Aᵀ * X = B.
        +	// Solve Uᵀ * X = B, updating b.
         	bi.Dtrsm(blas.Left, blas.Upper, blas.Trans, blas.NonUnit,
         		n, nrhs, 1, a, lda, b, ldb)
        -	// Solve L^T * X = B, updating b.
        +	// Solve Lᵀ * X = B, updating b.
         	bi.Dtrsm(blas.Left, blas.Lower, blas.Trans, blas.Unit,
         		n, nrhs, 1, a, lda, b, ldb)
         	impl.Dlaswp(nrhs, b, ldb, 0, n-1, ipiv, -1)
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dggsvd3.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dggsvd3.go
        index d062c8f85..d5c8be9e2 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dggsvd3.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dggsvd3.go
        @@ -13,13 +13,13 @@ import (
         
         // Dggsvd3 computes the generalized singular value decomposition (GSVD)
         // of an m×n matrix A and p×n matrix B:
        -//  U^T*A*Q = D1*[ 0 R ]
        +//  Uᵀ*A*Q = D1*[ 0 R ]
         //
        -//  V^T*B*Q = D2*[ 0 R ]
        +//  Vᵀ*B*Q = D2*[ 0 R ]
         // where U, V and Q are orthogonal matrices.
         //
         // Dggsvd3 returns k and l, the dimensions of the sub-blocks. k+l
        -// is the effective numerical rank of the (m+p)×n matrix [ A^T B^T ]^T.
        +// is the effective numerical rank of the (m+p)×n matrix [ Aᵀ Bᵀ ]ᵀ.
         // R is a (k+l)×(k+l) nonsingular upper triangular matrix, D1 and
         // D2 are m×(k+l) and p×(k+l) diagonal matrices and of the following
         // structures, respectively:
        @@ -108,43 +108,38 @@ import (
         // lwork is -1, work[0] holds the optimal lwork on return, but Dggsvd3 does
         // not perform the GSVD.
         func (impl Implementation) Dggsvd3(jobU, jobV, jobQ lapack.GSVDJob, m, n, p int, a []float64, lda int, b []float64, ldb int, alpha, beta, u []float64, ldu int, v []float64, ldv int, q []float64, ldq int, work []float64, lwork int, iwork []int) (k, l int, ok bool) {
        -	checkMatrix(m, n, a, lda)
        -	checkMatrix(p, n, b, ldb)
        -
         	wantu := jobU == lapack.GSVDU
        -	if wantu {
        -		checkMatrix(m, m, u, ldu)
        -	} else if jobU != lapack.GSVDNone {
        -		panic(badGSVDJob + "U")
        -	}
         	wantv := jobV == lapack.GSVDV
        -	if wantv {
        -		checkMatrix(p, p, v, ldv)
        -	} else if jobV != lapack.GSVDNone {
        -		panic(badGSVDJob + "V")
        -	}
         	wantq := jobQ == lapack.GSVDQ
        -	if wantq {
        -		checkMatrix(n, n, q, ldq)
        -	} else if jobQ != lapack.GSVDNone {
        +	switch {
        +	case !wantu && jobU != lapack.GSVDNone:
        +		panic(badGSVDJob + "U")
        +	case !wantv && jobV != lapack.GSVDNone:
        +		panic(badGSVDJob + "V")
        +	case !wantq && jobQ != lapack.GSVDNone:
         		panic(badGSVDJob + "Q")
        -	}
        -
        -	if len(alpha) != n {
        -		panic(badAlpha)
        -	}
        -	if len(beta) != n {
        -		panic(badBeta)
        -	}
        -
        -	if lwork != -1 && lwork <= n {
        -		panic(badWork)
        -	}
        -	if len(work) < max(1, lwork) {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case p < 0:
        +		panic(pLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	case ldb < max(1, n):
        +		panic(badLdB)
        +	case ldu < 1, wantu && ldu < m:
        +		panic(badLdU)
        +	case ldv < 1, wantv && ldv < p:
        +		panic(badLdV)
        +	case ldq < 1, wantq && ldq < n:
        +		panic(badLdQ)
        +	case len(iwork) < n:
        +		panic(shortWork)
        +	case lwork < 1 && lwork != -1:
        +		panic(badLWork)
        +	case len(work) < max(1, lwork):
         		panic(shortWork)
        -	}
        -	if len(iwork) < n {
        -		panic(badWork)
         	}
         
         	// Determine optimal work length.
        @@ -166,6 +161,23 @@ func (impl Implementation) Dggsvd3(jobU, jobV, jobQ lapack.GSVDJob, m, n, p int,
         		return 0, 0, true
         	}
         
        +	switch {
        +	case len(a) < (m-1)*lda+n:
        +		panic(shortA)
        +	case len(b) < (p-1)*ldb+n:
        +		panic(shortB)
        +	case wantu && len(u) < (m-1)*ldu+m:
        +		panic(shortU)
        +	case wantv && len(v) < (p-1)*ldv+p:
        +		panic(shortV)
        +	case wantq && len(q) < (n-1)*ldq+n:
        +		panic(shortQ)
        +	case len(alpha) != n:
        +		panic(badLenAlpha)
        +	case len(beta) != n:
        +		panic(badLenBeta)
        +	}
        +
         	// Compute the Frobenius norm of matrices A and B.
         	anorm := impl.Dlange(lapack.Frobenius, m, n, a, lda, nil)
         	bnorm := impl.Dlange(lapack.Frobenius, p, n, b, ldb, nil)
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dggsvp3.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dggsvp3.go
        index 19187968e..902260c17 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dggsvp3.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dggsvp3.go
        @@ -14,16 +14,16 @@ import (
         // Dggsvp3 computes orthogonal matrices U, V and Q such that
         //
         //                  n-k-l  k    l
        -//  U^T*A*Q =    k [ 0    A12  A13 ] if m-k-l >= 0;
        +//  Uᵀ*A*Q =     k [ 0    A12  A13 ] if m-k-l >= 0;
         //               l [ 0     0   A23 ]
         //           m-k-l [ 0     0    0  ]
         //
         //                  n-k-l  k    l
        -//  U^T*A*Q =    k [ 0    A12  A13 ] if m-k-l < 0;
        +//  Uᵀ*A*Q =     k [ 0    A12  A13 ] if m-k-l < 0;
         //             m-k [ 0     0   A23 ]
         //
         //                  n-k-l  k    l
        -//  V^T*B*Q =    l [ 0     0   B13 ]
        +//  Vᵀ*B*Q =     l [ 0     0   B13 ]
         //             p-l [ 0     0    0  ]
         //
         // where the k×k matrix A12 and l×l matrix B13 are non-singular
        @@ -31,7 +31,7 @@ import (
         // otherwise A23 is (m-k)×l upper trapezoidal.
         //
         // Dggsvp3 returns k and l, the dimensions of the sub-blocks. k+l
        -// is the effective numerical rank of the (m+p)×n matrix [ A^T B^T ]^T.
        +// is the effective numerical rank of the (m+p)×n matrix [ Aᵀ Bᵀ ]ᵀ.
         //
         // jobU, jobV and jobQ are options for computing the orthogonal matrices. The behavior
         // is as follows
        @@ -54,43 +54,38 @@ import (
         //
         // Dggsvp3 is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dggsvp3(jobU, jobV, jobQ lapack.GSVDJob, m, p, n int, a []float64, lda int, b []float64, ldb int, tola, tolb float64, u []float64, ldu int, v []float64, ldv int, q []float64, ldq int, iwork []int, tau, work []float64, lwork int) (k, l int) {
        -	const forward = true
        -
        -	checkMatrix(m, n, a, lda)
        -	checkMatrix(p, n, b, ldb)
        -
         	wantu := jobU == lapack.GSVDU
        -	if !wantu && jobU != lapack.GSVDNone {
        -		panic(badGSVDJob + "U")
        -	}
        -	if jobU != lapack.GSVDNone {
        -		checkMatrix(m, m, u, ldu)
        -	}
        -
         	wantv := jobV == lapack.GSVDV
        -	if !wantv && jobV != lapack.GSVDNone {
        -		panic(badGSVDJob + "V")
        -	}
        -	if jobV != lapack.GSVDNone {
        -		checkMatrix(p, p, v, ldv)
        -	}
        -
         	wantq := jobQ == lapack.GSVDQ
        -	if !wantq && jobQ != lapack.GSVDNone {
        +	switch {
        +	case !wantu && jobU != lapack.GSVDNone:
        +		panic(badGSVDJob + "U")
        +	case !wantv && jobV != lapack.GSVDNone:
        +		panic(badGSVDJob + "V")
        +	case !wantq && jobQ != lapack.GSVDNone:
         		panic(badGSVDJob + "Q")
        -	}
        -	if jobQ != lapack.GSVDNone {
        -		checkMatrix(n, n, q, ldq)
        -	}
        -
        -	if len(iwork) != n {
        -		panic(badWork)
        -	}
        -	if lwork != -1 && lwork < 1 {
        -		panic(badWork)
        -	}
        -	if len(work) < max(1, lwork) {
        -		panic(badWork)
        +	case m < 0:
        +		panic(mLT0)
        +	case p < 0:
        +		panic(pLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	case ldb < max(1, n):
        +		panic(badLdB)
        +	case ldu < 1, wantu && ldu < m:
        +		panic(badLdU)
        +	case ldv < 1, wantv && ldv < p:
        +		panic(badLdV)
        +	case ldq < 1, wantq && ldq < n:
        +		panic(badLdQ)
        +	case len(iwork) != n:
        +		panic(shortWork)
        +	case lwork < 1 && lwork != -1:
        +		panic(badLWork)
        +	case len(work) < max(1, lwork):
        +		panic(shortWork)
         	}
         
         	var lwkopt int
        @@ -112,13 +107,26 @@ func (impl Implementation) Dggsvp3(jobU, jobV, jobQ lapack.GSVDJob, m, p, n int,
         		return 0, 0
         	}
         
        -	// tau check must come after lwkopt query since
        -	// the Dggsvd3 call for lwkopt query may have
        -	// lwork == -1, and tau is provided by work.
        -	if len(tau) < n {
        -		panic(badTau)
        +	switch {
        +	case len(a) < (m-1)*lda+n:
        +		panic(shortA)
        +	case len(b) < (p-1)*ldb+n:
        +		panic(shortB)
        +	case wantu && len(u) < (m-1)*ldu+m:
        +		panic(shortU)
        +	case wantv && len(v) < (p-1)*ldv+p:
        +		panic(shortV)
        +	case wantq && len(q) < (n-1)*ldq+n:
        +		panic(shortQ)
        +	case len(tau) < n:
        +		// tau check must come after lwkopt query since
        +		// the Dggsvd3 call for lwkopt query may have
        +		// lwork == -1, and tau is provided by work.
        +		panic(shortTau)
         	}
         
        +	const forward = true
        +
         	// QR with column pivoting of B: B*P = V*[ S11 S12 ].
         	//                                       [  0   0  ]
         	for i := range iwork[:n] {
        @@ -166,11 +174,11 @@ func (impl Implementation) Dggsvp3(jobU, jobV, jobQ lapack.GSVDJob, m, p, n int,
         		// RQ factorization of [ S11 S12 ]: [ S11 S12 ] = [ 0 S12 ]*Z.
         		impl.Dgerq2(l, n, b, ldb, tau, work)
         
        -		// Update A := A*Z^T.
        +		// Update A := A*Zᵀ.
         		impl.Dormr2(blas.Right, blas.Trans, m, n, l, b, ldb, tau, a, lda, work)
         
         		if wantq {
        -			// Update Q := Q*Z^T.
        +			// Update Q := Q*Zᵀ.
         			impl.Dormr2(blas.Right, blas.Trans, n, n, l, b, ldb, tau, q, ldq, work)
         		}
         
        @@ -189,7 +197,7 @@ func (impl Implementation) Dggsvp3(jobU, jobV, jobQ lapack.GSVDJob, m, p, n int,
         	//
         	// then the following does the complete QR decomposition of A11:
         	//
        -	//          A11 = U*[  0  T12 ]*P1^T.
        +	//          A11 = U*[  0  T12 ]*P1ᵀ.
         	//                  [  0   0  ]
         	for i := range iwork[:n-l] {
         		iwork[i] = 0
        @@ -203,7 +211,7 @@ func (impl Implementation) Dggsvp3(jobU, jobV, jobQ lapack.GSVDJob, m, p, n int,
         		}
         	}
         
        -	// Update A12 := U^T*A12, where A12 = A[0:m, n-l:n].
        +	// Update A12 := Uᵀ*A12, where A12 = A[0:m, n-l:n].
         	impl.Dorm2r(blas.Left, blas.Trans, m, l, min(m, n-l), a, lda, tau, a[n-l:], lda, work)
         
         	if wantu {
        @@ -237,7 +245,7 @@ func (impl Implementation) Dggsvp3(jobU, jobV, jobQ lapack.GSVDJob, m, p, n int,
         		impl.Dgerq2(k, n-l, a, lda, tau, work)
         
         		if wantq {
        -			// Update Q[0:n, 0:n-l] := Q[0:n, 0:n-l]*Z1^T.
        +			// Update Q[0:n, 0:n-l] := Q[0:n, 0:n-l]*Z1ᵀ.
         			impl.Dorm2r(blas.Right, blas.Trans, n, n-l, k, a, lda, tau, q, ldq, work)
         		}
         
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dhseqr.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dhseqr.go
        index 7e641b12c..61390fbde 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dhseqr.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dhseqr.go
        @@ -13,14 +13,14 @@ import (
         
         // Dhseqr computes the eigenvalues of an n×n Hessenberg matrix H and,
         // optionally, the matrices T and Z from the Schur decomposition
        -//  H = Z T Z^T,
        +//  H = Z T Zᵀ,
         // where T is an n×n upper quasi-triangular matrix (the Schur form), and Z is
         // the n×n orthogonal matrix of Schur vectors.
         //
         // Optionally Z may be postmultiplied into an input orthogonal matrix Q so that
         // this routine can give the Schur factorization of a matrix A which has been
         // reduced to the Hessenberg form H by the orthogonal matrix Q:
        -//  A = Q H Q^T = (QZ) T (QZ)^T.
        +//  A = Q H Qᵀ = (QZ) T (QZ)ᵀ.
         //
         // If job == lapack.EigenvaluesOnly, only the eigenvalues will be computed.
         // If job == lapack.EigenvaluesAndSchur, the eigenvalues and the Schur form T will
        @@ -43,8 +43,8 @@ import (
         // and Dhseqr will panic otherwise. ilo and ihi are typically set by a previous
         // call to Dgebal, otherwise they should be set to 0 and n-1, respectively. It
         // must hold that
        -//  0 <= ilo <= ihi < n,     if n > 0,
        -//  ilo == 0 and ihi == -1,  if n == 0.
        +//  0 <= ilo <= ihi < n     if n > 0,
        +//  ilo == 0 and ihi == -1  if n == 0.
         //
         // wr and wi must have length n.
         //
        @@ -119,44 +119,52 @@ import (
         //
         // Dhseqr is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dhseqr(job lapack.SchurJob, compz lapack.SchurComp, n, ilo, ihi int, h []float64, ldh int, wr, wi []float64, z []float64, ldz int, work []float64, lwork int) (unconverged int) {
        -	var wantt bool
        -	switch job {
        -	default:
        +	wantt := job == lapack.EigenvaluesAndSchur
        +	wantz := compz == lapack.SchurHess || compz == lapack.SchurOrig
        +
        +	switch {
        +	case job != lapack.EigenvaluesOnly && job != lapack.EigenvaluesAndSchur:
         		panic(badSchurJob)
        -	case lapack.EigenvaluesOnly:
        -	case lapack.EigenvaluesAndSchur:
        -		wantt = true
        -	}
        -	var wantz bool
        -	switch compz {
        -	default:
        +	case compz != lapack.SchurNone && compz != lapack.SchurHess && compz != lapack.SchurOrig:
         		panic(badSchurComp)
        -	case lapack.SchurNone:
        -	case lapack.SchurHess, lapack.SchurOrig:
        -		wantz = true
        -	}
        -	switch {
         	case n < 0:
         		panic(nLT0)
         	case ilo < 0 || max(0, n-1) < ilo:
         		panic(badIlo)
         	case ihi < min(ilo, n-1) || n <= ihi:
         		panic(badIhi)
        -	case len(work) < lwork:
        -		panic(shortWork)
        +	case ldh < max(1, n):
        +		panic(badLdH)
        +	case ldz < 1, wantz && ldz < n:
        +		panic(badLdZ)
         	case lwork < max(1, n) && lwork != -1:
        -		panic(badWork)
        +		panic(badLWork)
        +	case len(work) < max(1, lwork):
        +		panic(shortWork)
         	}
        -	if lwork != -1 {
        -		checkMatrix(n, n, h, ldh)
        -		switch {
        -		case wantz:
        -			checkMatrix(n, n, z, ldz)
        -		case len(wr) < n:
        -			panic("lapack: wr has insufficient length")
        -		case len(wi) < n:
        -			panic("lapack: wi has insufficient length")
        -		}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		work[0] = 1
        +		return 0
        +	}
        +
        +	// Quick return in case of a workspace query.
        +	if lwork == -1 {
        +		impl.Dlaqr04(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, ilo, ihi, z, ldz, work, -1, 1)
        +		work[0] = math.Max(float64(n), work[0])
        +		return 0
        +	}
        +
        +	switch {
        +	case len(h) < (n-1)*ldh+n:
        +		panic(shortH)
        +	case wantz && len(z) < (n-1)*ldz+n:
        +		panic(shortZ)
        +	case len(wr) < n:
        +		panic(shortWr)
        +	case len(wi) < n:
        +		panic(shortWi)
         	}
         
         	const (
        @@ -173,19 +181,6 @@ func (impl Implementation) Dhseqr(job lapack.SchurJob, compz lapack.SchurComp, n
         		nl = 49
         	)
         
        -	// Quick return if possible.
        -	if n == 0 {
        -		work[0] = 1
        -		return 0
        -	}
        -
        -	// Quick return in case of a workspace query.
        -	if lwork == -1 {
        -		impl.Dlaqr04(wantt, wantz, n, ilo, ihi, nil, 0, nil, nil, ilo, ihi, nil, 0, work, -1, 1)
        -		work[0] = math.Max(float64(n), work[0])
        -		return 0
        -	}
        -
         	// Copy eigenvalues isolated by Dgebal.
         	for i := 0; i < ilo; i++ {
         		wr[i] = h[i*ldh+i]
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlabrd.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlabrd.go
        index 0527ebef1..8f7d2949a 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlabrd.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlabrd.go
        @@ -25,8 +25,8 @@ import (
         //  Q = H_0 * H_1 * ... * H_{nb-1}
         //  P = G_0 * G_1 * ... * G_{nb-1}
         // where
        -//  H_i = I - tauQ[i] * v_i * v_i^T
        -//  G_i = I - tauP[i] * u_i * u_i^T
        +//  H_i = I - tauQ[i] * v_i * v_iᵀ
        +//  G_i = I - tauP[i] * u_i * u_iᵀ
         //
         // As an example, on exit the entries of A when m = 6, n = 5, and nb = 2
         //  [ 1   1  u1  u1  u1]
        @@ -44,7 +44,7 @@ import (
         //
         // Dlabrd also returns the matrices X and Y which are used with U and V to
         // apply the transformation to the unreduced part of the matrix
        -//  A := A - V*Y^T - X*U^T
        +//  A := A - V*Yᵀ - X*Uᵀ
         // and returns the matrices X and Y which are needed to apply the
         // transformation to the unreduced part of A.
         //
        @@ -53,25 +53,48 @@ import (
         //
         // Dlabrd is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dlabrd(m, n, nb int, a []float64, lda int, d, e, tauQ, tauP, x []float64, ldx int, y []float64, ldy int) {
        -	checkMatrix(m, n, a, lda)
        -	checkMatrix(m, nb, x, ldx)
        -	checkMatrix(n, nb, y, ldy)
        -	if len(d) < nb {
        -		panic(badD)
        +	switch {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case nb < 0:
        +		panic(nbLT0)
        +	case nb > n:
        +		panic(nbGTN)
        +	case nb > m:
        +		panic(nbGTM)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	case ldx < max(1, nb):
        +		panic(badLdX)
        +	case ldy < max(1, nb):
        +		panic(badLdY)
         	}
        -	if len(e) < nb {
        -		panic(badE)
        -	}
        -	if len(tauQ) < nb {
        -		panic(badTauQ)
        -	}
        -	if len(tauP) < nb {
        -		panic(badTauP)
        -	}
        -	if m <= 0 || n <= 0 {
        +
        +	if m == 0 || n == 0 || nb == 0 {
         		return
         	}
        +
        +	switch {
        +	case len(a) < (m-1)*lda+n:
        +		panic(shortA)
        +	case len(d) < nb:
        +		panic(shortD)
        +	case len(e) < nb:
        +		panic(shortE)
        +	case len(tauQ) < nb:
        +		panic(shortTauQ)
        +	case len(tauP) < nb:
        +		panic(shortTauP)
        +	case len(x) < (m-1)*ldx+nb:
        +		panic(shortX)
        +	case len(y) < (n-1)*ldy+nb:
        +		panic(shortY)
        +	}
        +
         	bi := blas64.Implementation()
        +
         	if m >= n {
         		// Reduce to upper bidiagonal form.
         		for i := 0; i < nb; i++ {
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlacn2.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlacn2.go
        index 751d5caa9..d97e5edf8 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlacn2.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlacn2.go
        @@ -18,7 +18,7 @@ import (
         // On the initial call, kase must be 0.
         // In between calls, x must be overwritten by
         //  A * X    if kase was returned as 1,
        -//  A^T * X  if kase was returned as 2,
        +//  Aᵀ * X   if kase was returned as 2,
         // and all other parameters must not be changed.
         // On the final return, kase is returned as 0, v contains A*W where W is a
         // vector, and est = norm(V)/norm(W) is a lower bound for 1-norm of A.
        @@ -28,22 +28,24 @@ import (
         //
         // Dlacn2 is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dlacn2(n int, v, x []float64, isgn []int, est float64, kase int, isave *[3]int) (float64, int) {
        -	if n < 1 {
        -		panic("lapack: non-positive n")
        +	switch {
        +	case n < 1:
        +		panic(nLT1)
        +	case len(v) < n:
        +		panic(shortV)
        +	case len(x) < n:
        +		panic(shortX)
        +	case len(isgn) < n:
        +		panic(shortIsgn)
        +	case isave[0] < 0 || 5 < isave[0]:
        +		panic(badIsave)
        +	case isave[0] == 0 && kase != 0:
        +		panic(badIsave)
         	}
        -	checkVector(n, x, 1)
        -	checkVector(n, v, 1)
        -	if len(isgn) < n {
        -		panic("lapack: insufficient isgn length")
        -	}
        -	if isave[0] < 0 || isave[0] > 5 {
        -		panic("lapack: bad isave value")
        -	}
        -	if isave[0] == 0 && kase != 0 {
        -		panic("lapack: bad isave value")
        -	}
        -	itmax := 5
        +
        +	const itmax = 5
         	bi := blas64.Implementation()
        +
         	if kase == 0 {
         		for i := 0; i < n; i++ {
         			x[i] = 1 / float64(n)
        @@ -53,8 +55,6 @@ func (impl Implementation) Dlacn2(n int, v, x []float64, isgn []int, est float64
         		return est, kase
         	}
         	switch isave[0] {
        -	default:
        -		panic("unreachable")
         	case 1:
         		if n == 1 {
         			v[0] = x[0]
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlacpy.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlacpy.go
        index 2fe952d58..a37f3b0db 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlacpy.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlacpy.go
        @@ -12,18 +12,37 @@ import "gonum.org/v1/gonum/blas"
         //
         // Dlacpy is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dlacpy(uplo blas.Uplo, m, n int, a []float64, lda int, b []float64, ldb int) {
        -	checkMatrix(m, n, a, lda)
        -	checkMatrix(m, n, b, ldb)
        -	switch uplo {
        -	default:
        +	switch {
        +	case uplo != blas.Upper && uplo != blas.Lower && uplo != blas.All:
         		panic(badUplo)
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	case ldb < max(1, n):
        +		panic(badLdB)
        +	}
        +
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	switch {
        +	case len(a) < (m-1)*lda+n:
        +		panic(shortA)
        +	case len(b) < (m-1)*ldb+n:
        +		panic(shortB)
        +	}
        +
        +	switch uplo {
         	case blas.Upper:
         		for i := 0; i < m; i++ {
         			for j := i; j < n; j++ {
         				b[i*ldb+j] = a[i*lda+j]
         			}
         		}
        -
         	case blas.Lower:
         		for i := 0; i < m; i++ {
         			for j := 0; j < min(i+1, n); j++ {
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlaexc.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlaexc.go
        index 8ffe2ebaa..2b79bd8ae 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlaexc.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlaexc.go
        @@ -35,26 +35,34 @@ import (
         //
         // Dlaexc is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dlaexc(wantq bool, n int, t []float64, ldt int, q []float64, ldq int, j1, n1, n2 int, work []float64) (ok bool) {
        -	checkMatrix(n, n, t, ldt)
        -	if wantq {
        -		checkMatrix(n, n, q, ldq)
        -	}
        -	if j1 < 0 || n <= j1 {
        -		panic("lapack: index j1 out of range")
        -	}
        -	if len(work) < n {
        -		panic(badWork)
        -	}
        -	if n1 < 0 || 2 < n1 {
        -		panic("lapack: invalid value of n1")
        -	}
        -	if n2 < 0 || 2 < n2 {
        -		panic("lapack: invalid value of n2")
        +	switch {
        +	case n < 0:
        +		panic(nLT0)
        +	case ldt < max(1, n):
        +		panic(badLdT)
        +	case wantq && ldt < max(1, n):
        +		panic(badLdQ)
        +	case j1 < 0 || n <= j1:
        +		panic(badJ1)
        +	case len(work) < n:
        +		panic(shortWork)
        +	case n1 < 0 || 2 < n1:
        +		panic(badN1)
        +	case n2 < 0 || 2 < n2:
        +		panic(badN2)
         	}
         
         	if n == 0 || n1 == 0 || n2 == 0 {
         		return true
         	}
        +
        +	switch {
        +	case len(t) < (n-1)*ldt+n:
        +		panic(shortT)
        +	case wantq && len(q) < (n-1)*ldq+n:
        +		panic(shortQ)
        +	}
        +
         	if j1+n1 >= n {
         		// TODO(vladimir-ch): Reference LAPACK does this check whether
         		// the start of the second block is in the matrix T. It returns
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlags2.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlags2.go
        index 6954deb42..1622275d6 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlags2.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlags2.go
        @@ -11,19 +11,19 @@ import "math"
         //
         // If upper is true
         //
        -//  U^T*A*Q = U^T*[ a1 a2 ]*Q = [ x  0 ]
        -//                [ 0  a3 ]     [ x  x ]
        +//  Uᵀ*A*Q = Uᵀ*[ a1 a2 ]*Q = [ x  0 ]
        +//              [ 0  a3 ]     [ x  x ]
         // and
        -//  V^T*B*Q = V^T*[ b1 b2 ]*Q = [ x  0 ]
        -//                [ 0  b3 ]     [ x  x ]
        +//  Vᵀ*B*Q = Vᵀ*[ b1 b2 ]*Q = [ x  0 ]
        +//              [ 0  b3 ]     [ x  x ]
         //
         // otherwise
         //
        -//  U^T*A*Q = U^T*[ a1 0  ]*Q = [ x  x ]
        -//                [ a2 a3 ]     [ 0  x ]
        +//  Uᵀ*A*Q = Uᵀ*[ a1 0  ]*Q = [ x  x ]
        +//              [ a2 a3 ]     [ 0  x ]
         // and
        -//  V^T*B*Q = V^T*[ b1 0  ]*Q = [ x  x ]
        -//                [ b2 b3 ]     [ 0  x ].
        +//  Vᵀ*B*Q = Vᵀ*[ b1 0  ]*Q = [ x  x ]
        +//              [ b2 b3 ]     [ 0  x ].
         //
         // The rows of the transformed A and B are parallel, where
         //
        @@ -48,8 +48,8 @@ func (impl Implementation) Dlags2(upper bool, a1, a2, a3, b1, b2, b3 float64) (c
         		_, _, snr, csr, snl, csl := impl.Dlasv2(a, b, d)
         
         		if math.Abs(csl) >= math.Abs(snl) || math.Abs(csr) >= math.Abs(snr) {
        -			// Compute the [0, 0] and [0, 1] elements of U^T*A and V^T*B,
        -			// and [0, 1] element of |U|^T*|A| and |V|^T*|B|.
        +			// Compute the [0, 0] and [0, 1] elements of Uᵀ*A and Vᵀ*B,
        +			// and [0, 1] element of |U|ᵀ*|A| and |V|ᵀ*|B|.
         
         			ua11r := csl * a1
         			ua12 := csl*a2 + snl*a3
        @@ -60,7 +60,7 @@ func (impl Implementation) Dlags2(upper bool, a1, a2, a3, b1, b2, b3 float64) (c
         			aua12 := math.Abs(csl)*math.Abs(a2) + math.Abs(snl)*math.Abs(a3)
         			avb12 := math.Abs(csr)*math.Abs(b2) + math.Abs(snr)*math.Abs(b3)
         
        -			// Zero [0, 1] elements of U^T*A and V^T*B.
        +			// Zero [0, 1] elements of Uᵀ*A and Vᵀ*B.
         			if math.Abs(ua11r)+math.Abs(ua12) != 0 {
         				if aua12/(math.Abs(ua11r)+math.Abs(ua12)) <= avb12/(math.Abs(vb11r)+math.Abs(vb12)) {
         					csq, snq, _ = impl.Dlartg(-ua11r, ua12)
        @@ -76,8 +76,8 @@ func (impl Implementation) Dlags2(upper bool, a1, a2, a3, b1, b2, b3 float64) (c
         			csv = csr
         			snv = -snr
         		} else {
        -			// Compute the [1, 0] and [1, 1] elements of U^T*A and V^T*B,
        -			// and [1, 1] element of |U|^T*|A| and |V|^T*|B|.
        +			// Compute the [1, 0] and [1, 1] elements of Uᵀ*A and Vᵀ*B,
        +			// and [1, 1] element of |U|ᵀ*|A| and |V|ᵀ*|B|.
         
         			ua21 := -snl * a1
         			ua22 := -snl*a2 + csl*a3
        @@ -88,7 +88,7 @@ func (impl Implementation) Dlags2(upper bool, a1, a2, a3, b1, b2, b3 float64) (c
         			aua22 := math.Abs(snl)*math.Abs(a2) + math.Abs(csl)*math.Abs(a3)
         			avb22 := math.Abs(snr)*math.Abs(b2) + math.Abs(csr)*math.Abs(b3)
         
        -			// Zero [1, 1] elements of U^T*A and V^T*B, and then swap.
        +			// Zero [1, 1] elements of Uᵀ*A and Vᵀ*B, and then swap.
         			if math.Abs(ua21)+math.Abs(ua22) != 0 {
         				if aua22/(math.Abs(ua21)+math.Abs(ua22)) <= avb22/(math.Abs(vb21)+math.Abs(vb22)) {
         					csq, snq, _ = impl.Dlartg(-ua21, ua22)
        @@ -120,8 +120,8 @@ func (impl Implementation) Dlags2(upper bool, a1, a2, a3, b1, b2, b3 float64) (c
         		_, _, snr, csr, snl, csl := impl.Dlasv2(a, c, d)
         
         		if math.Abs(csr) >= math.Abs(snr) || math.Abs(csl) >= math.Abs(snl) {
        -			// Compute the [1, 0] and [1, 1] elements of U^T*A and V^T*B,
        -			// and [1, 0] element of |U|^T*|A| and |V|^T*|B|.
        +			// Compute the [1, 0] and [1, 1] elements of Uᵀ*A and Vᵀ*B,
        +			// and [1, 0] element of |U|ᵀ*|A| and |V|ᵀ*|B|.
         
         			ua21 := -snr*a1 + csr*a2
         			ua22r := csr * a3
        @@ -132,7 +132,7 @@ func (impl Implementation) Dlags2(upper bool, a1, a2, a3, b1, b2, b3 float64) (c
         			aua21 := math.Abs(snr)*math.Abs(a1) + math.Abs(csr)*math.Abs(a2)
         			avb21 := math.Abs(snl)*math.Abs(b1) + math.Abs(csl)*math.Abs(b2)
         
        -			// Zero [1, 0] elements of U^T*A and V^T*B.
        +			// Zero [1, 0] elements of Uᵀ*A and Vᵀ*B.
         			if (math.Abs(ua21) + math.Abs(ua22r)) != 0 {
         				if aua21/(math.Abs(ua21)+math.Abs(ua22r)) <= avb21/(math.Abs(vb21)+math.Abs(vb22r)) {
         					csq, snq, _ = impl.Dlartg(ua22r, ua21)
        @@ -148,8 +148,8 @@ func (impl Implementation) Dlags2(upper bool, a1, a2, a3, b1, b2, b3 float64) (c
         			csv = csl
         			snv = -snl
         		} else {
        -			// Compute the [0, 0] and [0, 1] elements of U^T *A and V^T *B,
        -			// and [0, 0] element of |U|^T*|A| and |V|^T*|B|.
        +			// Compute the [0, 0] and [0, 1] elements of Uᵀ *A and Vᵀ *B,
        +			// and [0, 0] element of |U|ᵀ*|A| and |V|ᵀ*|B|.
         
         			ua11 := csr*a1 + snr*a2
         			ua12 := snr * a3
        @@ -160,7 +160,7 @@ func (impl Implementation) Dlags2(upper bool, a1, a2, a3, b1, b2, b3 float64) (c
         			aua11 := math.Abs(csr)*math.Abs(a1) + math.Abs(snr)*math.Abs(a2)
         			avb11 := math.Abs(csl)*math.Abs(b1) + math.Abs(snl)*math.Abs(b2)
         
        -			// Zero [0, 0] elements of U^T*A and V^T*B, and then swap.
        +			// Zero [0, 0] elements of Uᵀ*A and Vᵀ*B, and then swap.
         			if (math.Abs(ua11) + math.Abs(ua12)) != 0 {
         				if aua11/(math.Abs(ua11)+math.Abs(ua12)) <= avb11/(math.Abs(vb11)+math.Abs(vb12)) {
         					csq, snq, _ = impl.Dlartg(ua12, ua11)
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlahqr.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlahqr.go
        index 66330ab8b..00a869bce 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlahqr.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlahqr.go
        @@ -72,33 +72,41 @@ import (
         //
         // Dlahqr is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dlahqr(wantt, wantz bool, n, ilo, ihi int, h []float64, ldh int, wr, wi []float64, iloz, ihiz int, z []float64, ldz int) (unconverged int) {
        -	checkMatrix(n, n, h, ldh)
         	switch {
        -	case ilo < 0 || max(0, ihi) < ilo:
        +	case n < 0:
        +		panic(nLT0)
        +	case ilo < 0, max(0, ihi) < ilo:
         		panic(badIlo)
        -	case n <= ihi:
        +	case ihi >= n:
         		panic(badIhi)
        -	case len(wr) != ihi+1:
        -		panic("lapack: bad length of wr")
        -	case len(wi) != ihi+1:
        -		panic("lapack: bad length of wi")
        -	case ilo > 0 && h[ilo*ldh+ilo-1] != 0:
        -		panic("lapack: block is not isolated")
        -	}
        -	if wantz {
        -		checkMatrix(n, n, z, ldz)
        -		switch {
        -		case iloz < 0 || ilo < iloz:
        -			panic("lapack: iloz out of range")
        -		case ihiz < ihi || n <= ihiz:
        -			panic("lapack: ihiz out of range")
        -		}
        +	case ldh < max(1, n):
        +		panic(badLdH)
        +	case wantz && (iloz < 0 || ilo < iloz):
        +		panic(badIloz)
        +	case wantz && (ihiz < ihi || n <= ihiz):
        +		panic(badIhiz)
        +	case ldz < 1, wantz && ldz < n:
        +		panic(badLdZ)
         	}
         
         	// Quick return if possible.
         	if n == 0 {
         		return 0
         	}
        +
        +	switch {
        +	case len(h) < (n-1)*ldh+n:
        +		panic(shortH)
        +	case len(wr) != ihi+1:
        +		panic(shortWr)
        +	case len(wi) != ihi+1:
        +		panic(shortWi)
        +	case wantz && len(z) < (n-1)*ldz+n:
        +		panic(shortZ)
        +	case ilo > 0 && h[ilo*ldh+ilo-1] != 0:
        +		panic(notIsolated)
        +	}
        +
         	if ilo == ihi {
         		wr[ilo] = h[ilo*ldh+ilo]
         		wi[ilo] = 0
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlahr2.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlahr2.go
        index 9d23bc060..43b7308f1 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlahr2.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlahr2.go
        @@ -11,21 +11,21 @@ import (
         
         // Dlahr2 reduces the first nb columns of a real general n×(n-k+1) matrix A so
         // that elements below the k-th subdiagonal are zero. The reduction is performed
        -// by an orthogonal similarity transformation Q^T * A * Q. Dlahr2 returns the
        -// matrices V and T which determine Q as a block reflector I - V*T*V^T, and
        +// by an orthogonal similarity transformation Qᵀ * A * Q. Dlahr2 returns the
        +// matrices V and T which determine Q as a block reflector I - V*T*Vᵀ, and
         // also the matrix Y = A * V * T.
         //
         // The matrix Q is represented as a product of nb elementary reflectors
         //  Q = H_0 * H_1 * ... * H_{nb-1}.
         // Each H_i has the form
        -//  H_i = I - tau[i] * v * v^T,
        +//  H_i = I - tau[i] * v * vᵀ,
         // where v is a real vector with v[0:i+k-1] = 0 and v[i+k-1] = 1. v[i+k:n] is
         // stored on exit in A[i+k+1:n,i].
         //
         // The elements of the vectors v together form the (n-k+1)×nb matrix
         // V which is needed, with T and Y, to apply the transformation to the
         // unreduced part of the matrix, using an update of the form
        -//  A = (I - V*T*V^T) * (A - Y*V^T).
        +//  A = (I - V*T*Vᵀ) * (A - Y*Vᵀ).
         //
         // On entry, a contains the n×(n-k+1) general matrix A. On return, the elements
         // on and above the k-th subdiagonal in the first nb columns are overwritten
        @@ -65,15 +65,41 @@ import (
         //
         // Dlahr2 is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dlahr2(n, k, nb int, a []float64, lda int, tau, t []float64, ldt int, y []float64, ldy int) {
        -	checkMatrix(n, n-k+1, a, lda)
        -	if len(tau) < nb {
        -		panic(badTau)
        +	switch {
        +	case n < 0:
        +		panic(nLT0)
        +	case k < 0:
        +		panic(kLT0)
        +	case nb < 0:
        +		panic(nbLT0)
        +	case nb > n:
        +		panic(nbGTN)
        +	case lda < max(1, n-k+1):
        +		panic(badLdA)
        +	case ldt < max(1, nb):
        +		panic(badLdT)
        +	case ldy < max(1, nb):
        +		panic(badLdY)
         	}
        -	checkMatrix(nb, nb, t, ldt)
        -	checkMatrix(n, nb, y, ldy)
         
         	// Quick return if possible.
        -	if n <= 1 {
        +	if n < 0 {
        +		return
        +	}
        +
        +	switch {
        +	case len(a) < (n-1)*lda+n-k+1:
        +		panic(shortA)
        +	case len(tau) < nb:
        +		panic(shortTau)
        +	case len(t) < (nb-1)*ldt+nb:
        +		panic(shortT)
        +	case len(y) < (n-1)*ldy+nb:
        +		panic(shortY)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 1 {
         		return
         	}
         
        @@ -83,31 +109,31 @@ func (impl Implementation) Dlahr2(n, k, nb int, a []float64, lda int, tau, t []f
         		if i > 0 {
         			// Update A[k:n,i].
         
        -			// Update i-th column of A - Y * V^T.
        +			// Update i-th column of A - Y * Vᵀ.
         			bi.Dgemv(blas.NoTrans, n-k, i,
         				-1, y[k*ldy:], ldy,
         				a[(k+i-1)*lda:], 1,
         				1, a[k*lda+i:], lda)
         
        -			// Apply I - V * T^T * V^T to this column (call it b)
        +			// Apply I - V * Tᵀ * Vᵀ to this column (call it b)
         			// from the left, using the last column of T as
         			// workspace.
         			// Let V = [ V1 ]   and   b = [ b1 ]   (first i rows)
         			//         [ V2 ]             [ b2 ]
         			// where V1 is unit lower triangular.
         			//
        -			// w := V1^T * b1.
        +			// w := V1ᵀ * b1.
         			bi.Dcopy(i, a[k*lda+i:], lda, t[nb-1:], ldt)
         			bi.Dtrmv(blas.Lower, blas.Trans, blas.Unit, i,
         				a[k*lda:], lda, t[nb-1:], ldt)
         
        -			// w := w + V2^T * b2.
        +			// w := w + V2ᵀ * b2.
         			bi.Dgemv(blas.Trans, n-k-i, i,
         				1, a[(k+i)*lda:], lda,
         				a[(k+i)*lda+i:], lda,
         				1, t[nb-1:], ldt)
         
        -			// w := T^T * w.
        +			// w := Tᵀ * w.
         			bi.Dtrmv(blas.Upper, blas.Trans, blas.NonUnit, i,
         				t, ldt, t[nb-1:], ldt)
         
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlaln2.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlaln2.go
        index 07cf5213c..df8164a79 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlaln2.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlaln2.go
        @@ -7,8 +7,8 @@ package gonum
         import "math"
         
         // Dlaln2 solves a linear equation or a system of 2 linear equations of the form
        -//  (ca A   - w D) X = scale B,  if trans == false,
        -//  (ca A^T - w D) X = scale B,  if trans == true,
        +//  (ca A   - w D) X = scale B  if trans == false,
        +//  (ca Aᵀ - w D) X = scale B   if trans == true,
         // where A is a na×na real matrix, ca is a real scalar, D is a na×na diagonal
         // real matrix, w is a scalar, real if nw == 1, complex if nw == 2, and X and B
         // are na×1 matrices, real if w is real, complex if w is complex.
        @@ -57,15 +57,24 @@ func (impl Implementation) Dlaln2(trans bool, na, nw int, smin, ca float64, a []
         	// would be simpler and more natural, and the implementation not as
         	// convoluted.
         
        -	if na != 1 && na != 2 {
        -		panic("lapack: invalid value of na")
        +	switch {
        +	case na != 1 && na != 2:
        +		panic(badNa)
        +	case nw != 1 && nw != 2:
        +		panic(badNw)
        +	case lda < na:
        +		panic(badLdA)
        +	case len(a) < (na-1)*lda+na:
        +		panic(shortA)
        +	case ldb < nw:
        +		panic(badLdB)
        +	case len(b) < (na-1)*ldb+nw:
        +		panic(shortB)
        +	case ldx < nw:
        +		panic(badLdX)
        +	case len(x) < (na-1)*ldx+nw:
        +		panic(shortX)
         	}
        -	if nw != 1 && nw != 2 {
        -		panic("lapack: invalid value of nw")
        -	}
        -	checkMatrix(na, na, a, lda)
        -	checkMatrix(na, nw, b, ldb)
        -	checkMatrix(na, nw, x, ldx)
         
         	smlnum := 2 * dlamchS
         	bignum := 1 / smlnum
        @@ -138,7 +147,7 @@ func (impl Implementation) Dlaln2(trans bool, na, nw int, smin, ca float64, a []
         	// Compute the real part of
         	//  C = ca A   - w D
         	// or
        -	//  C = ca A^T - w D.
        +	//  C = ca Aᵀ - w D.
         	crv := [4]float64{
         		ca*a[0] - wr*d1,
         		ca * a[1],
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlange.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlange.go
        index 2e5093687..059487701 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlange.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlange.go
        @@ -10,29 +10,40 @@ import (
         	"gonum.org/v1/gonum/lapack"
         )
         
        -// Dlange computes the matrix norm of the general m×n matrix a. The input norm
        -// specifies the norm computed.
        -//  lapack.MaxAbs: the maximum absolute value of an element.
        -//  lapack.MaxColumnSum: the maximum column sum of the absolute values of the entries.
        -//  lapack.MaxRowSum: the maximum row sum of the absolute values of the entries.
        -//  lapack.Frobenius: the square root of the sum of the squares of the entries.
        -// If norm == lapack.MaxColumnSum, work must be of length n, and this function will panic otherwise.
        -// There are no restrictions on work for the other matrix norms.
        +// Dlange returns the value of the specified norm of a general m×n matrix A:
        +//  lapack.MaxAbs:       the maximum absolute value of any element.
        +//  lapack.MaxColumnSum: the maximum column sum of the absolute values of the elements (1-norm).
        +//  lapack.MaxRowSum:    the maximum row sum of the absolute values of the elements (infinity-norm).
        +//  lapack.Frobenius:    the square root of the sum of the squares of the elements (Frobenius norm).
        +// If norm == lapack.MaxColumnSum, work must be of length n, and this function will
        +// panic otherwise. There are no restrictions on work for the other matrix norms.
         func (impl Implementation) Dlange(norm lapack.MatrixNorm, m, n int, a []float64, lda int, work []float64) float64 {
         	// TODO(btracey): These should probably be refactored to use BLAS calls.
        -	checkMatrix(m, n, a, lda)
        -	switch norm {
        -	case lapack.MaxRowSum, lapack.MaxColumnSum, lapack.Frobenius, lapack.MaxAbs:
        -	default:
        +	switch {
        +	case norm != lapack.MaxRowSum && norm != lapack.MaxColumnSum && norm != lapack.Frobenius && norm != lapack.MaxAbs:
         		panic(badNorm)
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
         	}
        -	if norm == lapack.MaxColumnSum && len(work) < n {
        -		panic(badWork)
        -	}
        -	if m == 0 && n == 0 {
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
         		return 0
         	}
        -	if norm == lapack.MaxAbs {
        +
        +	switch {
        +	case len(a) < (m-1)*lda+n:
        +		panic(badLdA)
        +	case norm == lapack.MaxColumnSum && len(work) < n:
        +		panic(shortWork)
        +	}
        +
        +	switch norm {
        +	case lapack.MaxAbs:
         		var value float64
         		for i := 0; i < m; i++ {
         			for j := 0; j < n; j++ {
        @@ -40,11 +51,7 @@ func (impl Implementation) Dlange(norm lapack.MatrixNorm, m, n int, a []float64,
         			}
         		}
         		return value
        -	}
        -	if norm == lapack.MaxColumnSum {
        -		if len(work) < n {
        -			panic(badWork)
        -		}
        +	case lapack.MaxColumnSum:
         		for i := 0; i < n; i++ {
         			work[i] = 0
         		}
        @@ -58,8 +65,7 @@ func (impl Implementation) Dlange(norm lapack.MatrixNorm, m, n int, a []float64,
         			value = math.Max(value, work[i])
         		}
         		return value
        -	}
        -	if norm == lapack.MaxRowSum {
        +	case lapack.MaxRowSum:
         		var value float64
         		for i := 0; i < m; i++ {
         			var sum float64
        @@ -69,16 +75,14 @@ func (impl Implementation) Dlange(norm lapack.MatrixNorm, m, n int, a []float64,
         			value = math.Max(value, sum)
         		}
         		return value
        -	}
        -	if norm == lapack.Frobenius {
        -		var value float64
        +	default:
        +		// lapack.Frobenius
         		scale := 0.0
         		sum := 1.0
         		for i := 0; i < m; i++ {
        -			scale, sum = impl.Dlassq(n, a[i*lda:], 1, scale, sum)
        +			rowscale, rowsum := impl.Dlassq(n, a[i*lda:], 1, 0, 1)
        +			scale, sum = impl.Dcombssq(scale, sum, rowscale, rowsum)
         		}
        -		value = scale * math.Sqrt(sum)
        -		return value
        +		return scale * math.Sqrt(sum)
         	}
        -	panic("lapack: bad matrix norm")
         }
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlansb.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlansb.go
        new file mode 100644
        index 000000000..ac293759f
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlansb.go
        @@ -0,0 +1,135 @@
        +// Copyright ©2019 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package gonum
        +
        +import (
        +	"math"
        +
        +	"gonum.org/v1/gonum/blas"
        +	"gonum.org/v1/gonum/lapack"
        +)
        +
        +// Dlansb returns the given norm of an n×n symmetric band matrix with kd
        +// super-diagonals.
        +//
        +// When norm is lapack.MaxColumnSum or lapack.MaxRowSum, the length of work must
        +// be at least n.
        +func (impl Implementation) Dlansb(norm lapack.MatrixNorm, uplo blas.Uplo, n, kd int, ab []float64, ldab int, work []float64) float64 {
        +	switch {
        +	case norm != lapack.MaxAbs && norm != lapack.MaxRowSum && norm != lapack.MaxColumnSum && norm != lapack.Frobenius:
        +		panic(badNorm)
        +	case uplo != blas.Upper && uplo != blas.Lower:
        +		panic(badUplo)
        +	case n < 0:
        +		panic(nLT0)
        +	case kd < 0:
        +		panic(kdLT0)
        +	case ldab < kd+1:
        +		panic(badLdA)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return 0
        +	}
        +
        +	switch {
        +	case len(ab) < (n-1)*ldab+kd+1:
        +		panic(shortAB)
        +	case len(work) < n && (norm == lapack.MaxColumnSum || norm == lapack.MaxRowSum):
        +		panic(shortWork)
        +	}
        +
        +	var value float64
        +	switch norm {
        +	case lapack.MaxAbs:
        +		if uplo == blas.Upper {
        +			for i := 0; i < n; i++ {
        +				for j := 0; j < min(n-i, kd+1); j++ {
        +					aij := math.Abs(ab[i*ldab+j])
        +					if aij > value || math.IsNaN(aij) {
        +						value = aij
        +					}
        +				}
        +			}
        +		} else {
        +			for i := 0; i < n; i++ {
        +				for j := max(0, kd-i); j < kd+1; j++ {
        +					aij := math.Abs(ab[i*ldab+j])
        +					if aij > value || math.IsNaN(aij) {
        +						value = aij
        +					}
        +				}
        +			}
        +		}
        +	case lapack.MaxColumnSum, lapack.MaxRowSum:
        +		work = work[:n]
        +		var sum float64
        +		if uplo == blas.Upper {
        +			for i := range work {
        +				work[i] = 0
        +			}
        +			for i := 0; i < n; i++ {
        +				sum := work[i] + math.Abs(ab[i*ldab])
        +				for j := i + 1; j < min(i+kd+1, n); j++ {
        +					aij := math.Abs(ab[i*ldab+j-i])
        +					sum += aij
        +					work[j] += aij
        +				}
        +				if sum > value || math.IsNaN(sum) {
        +					value = sum
        +				}
        +			}
        +		} else {
        +			for i := 0; i < n; i++ {
        +				sum = 0
        +				for j := max(0, i-kd); j < i; j++ {
        +					aij := math.Abs(ab[i*ldab+kd+j-i])
        +					sum += aij
        +					work[j] += aij
        +				}
        +				work[i] = sum + math.Abs(ab[i*ldab+kd])
        +			}
        +			for _, sum := range work {
        +				if sum > value || math.IsNaN(sum) {
        +					value = sum
        +				}
        +			}
        +		}
        +	case lapack.Frobenius:
        +		scale := 0.0
        +		ssq := 1.0
        +		if uplo == blas.Upper {
        +			if kd > 0 {
        +				// Sum off-diagonals.
        +				for i := 0; i < n-1; i++ {
        +					ilen := min(n-i-1, kd)
        +					rowscale, rowssq := impl.Dlassq(ilen, ab[i*ldab+1:], 1, 0, 1)
        +					scale, ssq = impl.Dcombssq(scale, ssq, rowscale, rowssq)
        +				}
        +				ssq *= 2
        +			}
        +			// Sum diagonal.
        +			dscale, dssq := impl.Dlassq(n, ab, ldab, 0, 1)
        +			scale, ssq = impl.Dcombssq(scale, ssq, dscale, dssq)
        +		} else {
        +			if kd > 0 {
        +				// Sum off-diagonals.
        +				for i := 1; i < n; i++ {
        +					ilen := min(i, kd)
        +					rowscale, rowssq := impl.Dlassq(ilen, ab[i*ldab+kd-ilen:], 1, 0, 1)
        +					scale, ssq = impl.Dcombssq(scale, ssq, rowscale, rowssq)
        +				}
        +				ssq *= 2
        +			}
        +			// Sum diagonal.
        +			dscale, dssq := impl.Dlassq(n, ab[kd:], ldab, 0, 1)
        +			scale, ssq = impl.Dcombssq(scale, ssq, dscale, dssq)
        +		}
        +		value = scale * math.Sqrt(ssq)
        +	}
        +
        +	return value
        +}
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlanst.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlanst.go
        index ad5394863..9ca1897e3 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlanst.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlanst.go
        @@ -14,15 +14,22 @@ import (
         // The diagonal elements of A are stored in d and the off-diagonal elements
         // are stored in e.
         func (impl Implementation) Dlanst(norm lapack.MatrixNorm, n int, d, e []float64) float64 {
        -	if len(d) < n {
        -		panic(badD)
        -	}
        -	if len(e) < n-1 {
        -		panic(badE)
        +	switch {
        +	case norm != lapack.MaxRowSum && norm != lapack.MaxColumnSum && norm != lapack.Frobenius && norm != lapack.MaxAbs:
        +		panic(badNorm)
        +	case n < 0:
        +		panic(nLT0)
         	}
        -	if n <= 0 {
        +	if n == 0 {
         		return 0
         	}
        +	switch {
        +	case len(d) < n:
        +		panic(shortD)
        +	case len(e) < n-1:
        +		panic(shortE)
        +	}
        +
         	switch norm {
         	default:
         		panic(badNorm)
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlansy.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlansy.go
        index f8e260587..2c6f5cf3b 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlansy.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlansy.go
        @@ -11,29 +11,34 @@ import (
         	"gonum.org/v1/gonum/lapack"
         )
         
        -// Dlansy computes the specified norm of an n×n symmetric matrix. If
        -// norm == lapack.MaxColumnSum or norm == lapackMaxRowSum work must have length
        +// Dlansy returns the value of the specified norm of an n×n symmetric matrix. If
        +// norm == lapack.MaxColumnSum or norm == lapack.MaxRowSum, work must have length
         // at least n, otherwise work is unused.
         func (impl Implementation) Dlansy(norm lapack.MatrixNorm, uplo blas.Uplo, n int, a []float64, lda int, work []float64) float64 {
        -	checkMatrix(n, n, a, lda)
        -	switch norm {
        -	case lapack.MaxRowSum, lapack.MaxColumnSum, lapack.Frobenius, lapack.MaxAbs:
        -	default:
        +	switch {
        +	case norm != lapack.MaxRowSum && norm != lapack.MaxColumnSum && norm != lapack.Frobenius && norm != lapack.MaxAbs:
         		panic(badNorm)
        -	}
        -	if (norm == lapack.MaxColumnSum || norm == lapack.MaxRowSum) && len(work) < n {
        -		panic(badWork)
        -	}
        -	if uplo != blas.Upper && uplo != blas.Lower {
        +	case uplo != blas.Upper && uplo != blas.Lower:
         		panic(badUplo)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
         	}
         
        +	// Quick return if possible.
         	if n == 0 {
         		return 0
         	}
        +
        +	switch {
        +	case len(a) < (n-1)*lda+n:
        +		panic(shortA)
        +	case (norm == lapack.MaxColumnSum || norm == lapack.MaxRowSum) && len(work) < n:
        +		panic(shortWork)
        +	}
        +
         	switch norm {
        -	default:
        -		panic("unreachable")
         	case lapack.MaxAbs:
         		if uplo == blas.Upper {
         			var max float64
        @@ -98,28 +103,26 @@ func (impl Implementation) Dlansy(norm lapack.MatrixNorm, uplo blas.Uplo, n int,
         			}
         		}
         		return max
        -	case lapack.Frobenius:
        +	default:
        +		// lapack.Frobenius:
        +		scale := 0.0
        +		ssq := 1.0
        +		// Sum off-diagonals.
         		if uplo == blas.Upper {
        -			var sum float64
        -			for i := 0; i < n; i++ {
        -				v := a[i*lda+i]
        -				sum += v * v
        -				for j := i + 1; j < n; j++ {
        -					v := a[i*lda+j]
        -					sum += 2 * v * v
        -				}
        +			for i := 0; i < n-1; i++ {
        +				rowscale, rowssq := impl.Dlassq(n-i-1, a[i*lda+i+1:], 1, 0, 1)
        +				scale, ssq = impl.Dcombssq(scale, ssq, rowscale, rowssq)
         			}
        -			return math.Sqrt(sum)
        -		}
        -		var sum float64
        -		for i := 0; i < n; i++ {
        -			for j := 0; j < i; j++ {
        -				v := a[i*lda+j]
        -				sum += 2 * v * v
        +		} else {
        +			for i := 1; i < n; i++ {
        +				rowscale, rowssq := impl.Dlassq(i, a[i*lda:], 1, 0, 1)
        +				scale, ssq = impl.Dcombssq(scale, ssq, rowscale, rowssq)
         			}
        -			v := a[i*lda+i]
        -			sum += v * v
         		}
        -		return math.Sqrt(sum)
        +		ssq *= 2
        +		// Sum diagonal.
        +		dscale, dssq := impl.Dlassq(n, a, lda+1, 0, 1)
        +		scale, ssq = impl.Dcombssq(scale, ssq, dscale, dssq)
        +		return scale * math.Sqrt(ssq)
         	}
         }
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlantr.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlantr.go
        index e3dbde112..cb40d2337 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlantr.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlantr.go
        @@ -15,27 +15,35 @@ import (
         // norm == lapack.MaxColumnSum work must have length at least n, otherwise work
         // is unused.
         func (impl Implementation) Dlantr(norm lapack.MatrixNorm, uplo blas.Uplo, diag blas.Diag, m, n int, a []float64, lda int, work []float64) float64 {
        -	checkMatrix(m, n, a, lda)
        -	switch norm {
        -	case lapack.MaxRowSum, lapack.MaxColumnSum, lapack.Frobenius, lapack.MaxAbs:
        -	default:
        +	switch {
        +	case norm != lapack.MaxRowSum && norm != lapack.MaxColumnSum && norm != lapack.Frobenius && norm != lapack.MaxAbs:
         		panic(badNorm)
        -	}
        -	if uplo != blas.Upper && uplo != blas.Lower {
        +	case uplo != blas.Upper && uplo != blas.Lower:
         		panic(badUplo)
        -	}
        -	if diag != blas.Unit && diag != blas.NonUnit {
        +	case diag != blas.Unit && diag != blas.NonUnit:
         		panic(badDiag)
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
         	}
        -	if norm == lapack.MaxColumnSum && len(work) < n {
        -		panic(badWork)
        -	}
        -	if min(m, n) == 0 {
        +
        +	// Quick return if possible.
        +	minmn := min(m, n)
        +	if minmn == 0 {
         		return 0
         	}
        +
        +	switch {
        +	case len(a) < (m-1)*lda+n:
        +		panic(shortA)
        +	case norm == lapack.MaxColumnSum && len(work) < n:
        +		panic(shortWork)
        +	}
        +
         	switch norm {
        -	default:
        -		panic("unreachable")
         	case lapack.MaxAbs:
         		if diag == blas.Unit {
         			value := 1.0
        @@ -95,10 +103,10 @@ func (impl Implementation) Dlantr(norm lapack.MatrixNorm, uplo blas.Uplo, diag b
         		return value
         	case lapack.MaxColumnSum:
         		if diag == blas.Unit {
        -			for i := 0; i < min(m, n); i++ {
        +			for i := 0; i < minmn; i++ {
         				work[i] = 1
         			}
        -			for i := min(m, n); i < n; i++ {
        +			for i := minmn; i < n; i++ {
         				work[i] = 0
         			}
         			if uplo == blas.Upper {
        @@ -148,7 +156,7 @@ func (impl Implementation) Dlantr(norm lapack.MatrixNorm, uplo blas.Uplo, diag b
         			if uplo == blas.Upper {
         				for i := 0; i < m; i++ {
         					var sum float64
        -					if i < min(m, n) {
        +					if i < minmn {
         						sum = 1
         					}
         					for j := i + 1; j < n; j++ {
        @@ -163,9 +171,9 @@ func (impl Implementation) Dlantr(norm lapack.MatrixNorm, uplo blas.Uplo, diag b
         				}
         				return maxsum
         			} else {
        -				for i := 1; i < m; i++ {
        +				for i := 0; i < m; i++ {
         					var sum float64
        -					if i < min(m, n) {
        +					if i < minmn {
         						sum = 1
         					}
         					for j := 0; j < min(i, n); j++ {
        @@ -211,42 +219,38 @@ func (impl Implementation) Dlantr(norm lapack.MatrixNorm, uplo blas.Uplo, diag b
         				return maxsum
         			}
         		}
        -	case lapack.Frobenius:
        -		var nrm float64
        +	default:
        +		// lapack.Frobenius:
        +		var scale, ssq float64
         		if diag == blas.Unit {
        +			scale = 1
        +			ssq = float64(min(m, n))
         			if uplo == blas.Upper {
        -				for i := 0; i < m; i++ {
        -					for j := i + 1; j < n; j++ {
        -						tmp := a[i*lda+j]
        -						nrm += tmp * tmp
        -					}
        +				for i := 0; i < min(m, n); i++ {
        +					rowscale, rowssq := impl.Dlassq(n-i-1, a[i*lda+i+1:], 1, 0, 1)
        +					scale, ssq = impl.Dcombssq(scale, ssq, rowscale, rowssq)
         				}
         			} else {
         				for i := 1; i < m; i++ {
        -					for j := 0; j < min(i, n); j++ {
        -						tmp := a[i*lda+j]
        -						nrm += tmp * tmp
        -					}
        +					rowscale, rowssq := impl.Dlassq(min(i, n), a[i*lda:], 1, 0, 1)
        +					scale, ssq = impl.Dcombssq(scale, ssq, rowscale, rowssq)
         				}
         			}
        -			nrm += float64(min(m, n))
         		} else {
        +			scale = 0
        +			ssq = 1
         			if uplo == blas.Upper {
        -				for i := 0; i < m; i++ {
        -					for j := i; j < n; j++ {
        -						tmp := math.Abs(a[i*lda+j])
        -						nrm += tmp * tmp
        -					}
        +				for i := 0; i < min(m, n); i++ {
        +					rowscale, rowssq := impl.Dlassq(n-i, a[i*lda+i:], 1, 0, 1)
        +					scale, ssq = impl.Dcombssq(scale, ssq, rowscale, rowssq)
         				}
         			} else {
         				for i := 0; i < m; i++ {
        -					for j := 0; j <= min(i, n-1); j++ {
        -						tmp := math.Abs(a[i*lda+j])
        -						nrm += tmp * tmp
        -					}
        +					rowscale, rowssq := impl.Dlassq(min(i+1, n), a[i*lda:], 1, 0, 1)
        +					scale, ssq = impl.Dcombssq(scale, ssq, rowscale, rowssq)
         				}
         			}
         		}
        -		return math.Sqrt(nrm)
        +		return scale * math.Sqrt(ssq)
         	}
         }
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlanv2.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlanv2.go
        index e5dcfb752..f5bf761f1 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlanv2.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlanv2.go
        @@ -110,7 +110,7 @@ func (impl Implementation) Dlanv2(a, b, c, d float64) (aa, bb, cc, dd float64, r
         						dd = temp - p
         						cs1 := sab * tau
         						sn1 := sac * tau
        -						cs, sn = cs*cs1-sn*sn1, cs*sn1+sn+cs1
        +						cs, sn = cs*cs1-sn*sn1, cs*sn1+sn*cs1
         					}
         				} else {
         					bb = -cc
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlapll.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlapll.go
        index cb5c0b7ef..bf98c338e 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlapll.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlapll.go
        @@ -14,10 +14,29 @@ import "gonum.org/v1/gonum/blas/blas64"
         //
         // Dlapll is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dlapll(n int, x []float64, incX int, y []float64, incY int) float64 {
        -	checkVector(n, x, incX)
        -	checkVector(n, y, incY)
        +	switch {
        +	case n < 0:
        +		panic(nLT0)
        +	case incX <= 0:
        +		panic(badIncX)
        +	case incY <= 0:
        +		panic(badIncY)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return 0
        +	}
        +
        +	switch {
        +	case len(x) < 1+(n-1)*incX:
        +		panic(shortX)
        +	case len(y) < 1+(n-1)*incY:
        +		panic(shortY)
        +	}
         
        -	if n <= 1 {
        +	// Quick return if possible.
        +	if n == 1 {
         		return 0
         	}
         
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlapmt.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlapmt.go
        index f5a5b1fd6..55f1567f3 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlapmt.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlapmt.go
        @@ -19,12 +19,29 @@ import "gonum.org/v1/gonum/blas/blas64"
         //
         // k must have length n, otherwise Dlapmt will panic. k is zero-indexed.
         func (impl Implementation) Dlapmt(forward bool, m, n int, x []float64, ldx int, k []int) {
        -	checkMatrix(m, n, x, ldx)
        -	if len(k) != n {
        -		panic(badKperm)
        +	switch {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case ldx < max(1, n):
        +		panic(badLdX)
         	}
         
        -	if n <= 1 {
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	switch {
        +	case len(x) < (m-1)*ldx+n:
        +		panic(shortX)
        +	case len(k) != n:
        +		panic(badLenK)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 1 {
         		return
         	}
         
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlaqp2.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlaqp2.go
        index 80f43905e..cc3bc06db 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlaqp2.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlaqp2.go
        @@ -34,22 +34,38 @@ import (
         //
         // Dlaqp2 is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dlaqp2(m, n, offset int, a []float64, lda int, jpvt []int, tau, vn1, vn2, work []float64) {
        -	checkMatrix(m, n, a, lda)
        -	if len(jpvt) != n {
        -		panic(badIpiv)
        +	switch {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case offset < 0:
        +		panic(offsetLT0)
        +	case offset > m:
        +		panic(offsetGTM)
        +	case lda < max(1, n):
        +		panic(badLdA)
         	}
        -	mn := min(m-offset, n)
        -	if len(tau) < mn {
        -		panic(badTau)
        -	}
        -	if len(vn1) < n {
        -		panic(badVn1)
        -	}
        -	if len(vn2) < n {
        -		panic(badVn2)
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
         	}
        -	if len(work) < n {
        -		panic(badWork)
        +
        +	mn := min(m-offset, n)
        +	switch {
        +	case len(a) < (m-1)*lda+n:
        +		panic(shortA)
        +	case len(jpvt) != n:
        +		panic(badLenJpvt)
        +	case len(tau) < mn:
        +		panic(shortTau)
        +	case len(vn1) < n:
        +		panic(shortVn1)
        +	case len(vn2) < n:
        +		panic(shortVn2)
        +	case len(work) < n:
        +		panic(shortWork)
         	}
         
         	tol3z := math.Sqrt(dlamchE)
        @@ -77,7 +93,7 @@ func (impl Implementation) Dlaqp2(m, n, offset int, a []float64, lda int, jpvt [
         		}
         
         		if i < n-1 {
        -			// Apply H_i^T to A[offset+i:m, i:n] from the left.
        +			// Apply H_iᵀ to A[offset+i:m, i:n] from the left.
         			aii := a[offpi*lda+i]
         			a[offpi*lda+i] = 1
         			impl.Dlarf(blas.Left, m-offpi, n-i-1, a[offpi*lda+i:], lda, tau[i], a[offpi*lda+i+1:], lda, work)
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlaqps.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlaqps.go
        index 89cfd094c..da1a60e5c 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlaqps.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlaqps.go
        @@ -49,28 +49,55 @@ import (
         //
         // Dlaqps is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dlaqps(m, n, offset, nb int, a []float64, lda int, jpvt []int, tau, vn1, vn2, auxv, f []float64, ldf int) (kb int) {
        -	checkMatrix(m, n, a, lda)
        -	checkMatrix(n, nb, f, ldf)
        -	if offset > m {
        +	switch {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case offset < 0:
        +		panic(offsetLT0)
        +	case offset > m:
         		panic(offsetGTM)
        +	case nb < 0:
        +		panic(nbLT0)
        +	case nb > n:
        +		panic(nbGTN)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	case ldf < max(1, nb):
        +		panic(badLdF)
         	}
        -	if n < 0 || nb > n {
        -		panic(badNb)
        -	}
        -	if len(jpvt) != n {
        -		panic(badIpiv)
        +
        +	if m == 0 || n == 0 {
        +		return 0
         	}
        -	if len(tau) < nb {
        -		panic(badTau)
        +
        +	switch {
        +	case len(a) < (m-1)*lda+n:
        +		panic(shortA)
        +	case len(jpvt) != n:
        +		panic(badLenJpvt)
        +	case len(vn1) < n:
        +		panic(shortVn1)
        +	case len(vn2) < n:
        +		panic(shortVn2)
         	}
        -	if len(vn1) < n {
        -		panic(badVn1)
        +
        +	if nb == 0 {
        +		return 0
         	}
        -	if len(vn2) < n {
        -		panic(badVn2)
        +
        +	switch {
        +	case len(tau) < nb:
        +		panic(shortTau)
        +	case len(auxv) < nb:
        +		panic(shortAuxv)
        +	case len(f) < (n-1)*ldf+nb:
        +		panic(shortF)
         	}
        -	if len(auxv) < nb {
        -		panic(badAuxv)
        +
        +	if offset == m {
        +		return 0
         	}
         
         	lastrk := min(m, n+offset)
        @@ -95,7 +122,7 @@ func (impl Implementation) Dlaqps(m, n, offset, nb int, a []float64, lda int, jp
         
         		// Apply previous Householder reflectors to column K:
         		//
        -		// A[rk:m, k] = A[rk:m, k] - A[rk:m, 0:k-1]*F[k, 0:k-1]^T.
        +		// A[rk:m, k] = A[rk:m, k] - A[rk:m, 0:k-1]*F[k, 0:k-1]ᵀ.
         		if k > 0 {
         			bi.Dgemv(blas.NoTrans, m-rk, k, -1,
         				a[rk*lda:], lda,
        @@ -116,7 +143,7 @@ func (impl Implementation) Dlaqps(m, n, offset, nb int, a []float64, lda int, jp
         
         		// Compute kth column of F:
         		//
        -		// Compute F[k+1:n, k] = tau[k]*A[rk:m, k+1:n]^T*A[rk:m, k].
        +		// Compute F[k+1:n, k] = tau[k]*A[rk:m, k+1:n]ᵀ*A[rk:m, k].
         		if k < n-1 {
         			bi.Dgemv(blas.Trans, m-rk, n-k-1, tau[k],
         				a[rk*lda+k+1:], lda,
        @@ -132,7 +159,7 @@ func (impl Implementation) Dlaqps(m, n, offset, nb int, a []float64, lda int, jp
         
         		// Incremental updating of F:
         		//
        -		// F[0:n, k] := F[0:n, k] - tau[k]*F[0:n, 0:k-1]*A[rk:m, 0:k-1]^T*A[rk:m,k].
        +		// F[0:n, k] := F[0:n, k] - tau[k]*F[0:n, 0:k-1]*A[rk:m, 0:k-1]ᵀ*A[rk:m,k].
         		if k > 0 {
         			bi.Dgemv(blas.Trans, m-rk, k, -tau[k],
         				a[rk*lda:], lda,
        @@ -148,7 +175,7 @@ func (impl Implementation) Dlaqps(m, n, offset, nb int, a []float64, lda int, jp
         
         		// Update the current row of A:
         		//
        -		// A[rk, k+1:n] = A[rk, k+1:n] - A[rk, 0:k]*F[k+1:n, 0:k]^T.
        +		// A[rk, k+1:n] = A[rk, k+1:n] - A[rk, 0:k]*F[k+1:n, 0:k]ᵀ.
         		if k < n-1 {
         			bi.Dgemv(blas.NoTrans, n-k-1, k+1, -1,
         				f[(k+1)*ldf:], ldf,
        @@ -189,7 +216,7 @@ func (impl Implementation) Dlaqps(m, n, offset, nb int, a []float64, lda int, jp
         
         	// Apply the block reflector to the rest of the matrix:
         	//
        -	// A[offset+kb+1:m, kb+1:n] := A[offset+kb+1:m, kb+1:n] - A[offset+kb+1:m, 1:kb]*F[kb+1:n, 1:kb]^T.
        +	// A[offset+kb+1:m, kb+1:n] := A[offset+kb+1:m, kb+1:n] - A[offset+kb+1:m, 1:kb]*F[kb+1:n, 1:kb]ᵀ.
         	if kb < min(n, m-offset) {
         		bi.Dgemm(blas.NoTrans, blas.Trans,
         			m-rk, n-kb, kb, -1,
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlaqr04.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlaqr04.go
        index 945c657de..9a6da4092 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlaqr04.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlaqr04.go
        @@ -12,7 +12,7 @@ import (
         
         // Dlaqr04 computes the eigenvalues of a block of an n×n upper Hessenberg matrix
         // H, and optionally the matrices T and Z from the Schur decomposition
        -//  H = Z T Z^T
        +//  H = Z T Zᵀ
         // where T is an upper quasi-triangular matrix (the Schur form), and Z is the
         // orthogonal matrix of Schur vectors.
         //
        @@ -24,8 +24,8 @@ import (
         // Z[iloz:ihiz+1,ilo:ihi+1], otherwise Z will not be referenced.
         //
         // ilo and ihi determine the block of H on which Dlaqr04 operates. It must hold that
        -//  0 <= ilo <= ihi < n,     if n > 0,
        -//  ilo == 0 and ihi == -1,  if n == 0,
        +//  0 <= ilo <= ihi < n     if n > 0,
        +//  ilo == 0 and ihi == -1  if n == 0,
         // and the block must be isolated, that is,
         //  ilo == 0   or H[ilo,ilo-1] == 0,
         //  ihi == n-1 or H[ihi+1,ihi] == 0,
        @@ -39,8 +39,8 @@ import (
         // otherwise Dlaqr04 will panic.
         //
         // work must have length at least lwork and lwork must be
        -//  lwork >= 1,  if n <= 11,
        -//  lwork >= n,  if n > 11,
        +//  lwork >= 1  if n <= 11,
        +//  lwork >= n  if n > 11,
         // otherwise Dlaqr04 will panic. lwork as large as 6*n may be required for
         // optimal performance. On return, work[0] will contain the optimal value of
         // lwork.
        @@ -123,58 +123,61 @@ func (impl Implementation) Dlaqr04(wantt, wantz bool, n, ilo, ihi int, h []float
         	)
         
         	switch {
        +	case n < 0:
        +		panic(nLT0)
         	case ilo < 0 || max(0, n-1) < ilo:
         		panic(badIlo)
         	case ihi < min(ilo, n-1) || n <= ihi:
         		panic(badIhi)
        -	case lwork < 1 && n <= ntiny && lwork != -1:
        -		panic(badWork)
        +	case ldh < max(1, n):
        +		panic(badLdH)
        +	case wantz && (iloz < 0 || ilo < iloz):
        +		panic(badIloz)
        +	case wantz && (ihiz < ihi || n <= ihiz):
        +		panic(badIhiz)
        +	case ldz < 1, wantz && ldz < n:
        +		panic(badLdZ)
        +	case lwork < 1 && lwork != -1:
        +		panic(badLWork)
         	// TODO(vladimir-ch): Enable if and when we figure out what the minimum
         	// necessary lwork value is. Dlaqr04 says that the minimum is n which
         	// clashes with Dlaqr23's opinion about optimal work when nw <= 2
         	// (independent of n).
         	// case lwork < n && n > ntiny && lwork != -1:
        -	// 	panic(badWork)
        -	case len(work) < lwork:
        +	// 	panic(badLWork)
        +	case len(work) < max(1, lwork):
         		panic(shortWork)
         	case recur < 0:
        -		panic("lapack: recur is negative")
        +		panic(recurLT0)
         	}
        -	if wantz {
        -		if iloz < 0 || ilo < iloz {
        -			panic("lapack: invalid value of iloz")
        -		}
        -		if ihiz < ihi || n <= ihiz {
        -			panic("lapack: invalid value of ihiz")
        -		}
        +
        +	// Quick return.
        +	if n == 0 {
        +		work[0] = 1
        +		return 0
         	}
        +
         	if lwork != -1 {
        -		checkMatrix(n, n, h, ldh)
        -		if wantz {
        -			checkMatrix(n, n, z, ldz)
        -		}
         		switch {
        -		case ilo > 0 && h[ilo*ldh+ilo-1] != 0:
        -			panic("lapack: block not isolated")
        -		case ihi+1 < n && h[(ihi+1)*ldh+ihi] != 0:
        -			panic("lapack: block not isolated")
        +		case len(h) < (n-1)*ldh+n:
        +			panic(shortH)
         		case len(wr) != ihi+1:
        -			panic("lapack: bad length of wr")
        +			panic(badLenWr)
         		case len(wi) != ihi+1:
        -			panic("lapack: bad length of wi")
        +			panic(badLenWi)
        +		case wantz && len(z) < (n-1)*ldz+n:
        +			panic(shortZ)
        +		case ilo > 0 && h[ilo*ldh+ilo-1] != 0:
        +			panic(notIsolated)
        +		case ihi+1 < n && h[(ihi+1)*ldh+ihi] != 0:
        +			panic(notIsolated)
         		}
         	}
         
        -	// Quick return.
        -	if n == 0 {
        -		work[0] = 1
        -		return 0
        -	}
        -
         	if n <= ntiny {
         		// Tiny matrices must use Dlahqr.
        -		work[0] = 1
         		if lwork == -1 {
        +			work[0] = 1
         			return 0
         		}
         		return impl.Dlahqr(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, ihiz, z, ldz)
        @@ -217,8 +220,8 @@ func (impl Implementation) Dlaqr04(wantt, wantz bool, n, ilo, ihi int, h []float
         	nsr = max(2, nsr&^1)
         
         	// Workspace query call to Dlaqr23.
        -	impl.Dlaqr23(wantt, wantz, n, ilo, ihi, nwr+1, nil, 0, iloz, ihiz, nil, 0,
        -		nil, nil, nil, 0, n, nil, 0, n, nil, 0, work, -1, recur)
        +	impl.Dlaqr23(wantt, wantz, n, ilo, ihi, nwr+1, h, ldh, iloz, ihiz, z, ldz,
        +		wr, wi, h, ldh, n, h, ldh, n, h, ldh, work, -1, recur)
         	// Optimal workspace is max(Dlaqr5, Dlaqr23).
         	lwkopt := max(3*nsr/2, int(work[0]))
         	// Quick return in case of workspace query.
        @@ -381,7 +384,7 @@ func (impl Implementation) Dlaqr04(wantt, wantz bool, n, ilo, ihi int, h []float
         						wr[ks:ks+ns], wi[ks:ks+ns], 0, 0, nil, 0, work, lwork, recur-1)
         				} else {
         					ks += impl.Dlahqr(false, false, ns, 0, ns-1, h[kt*ldh:], ldh,
        -						wr[ks:ks+ns], wi[ks:ks+ns], 0, 0, nil, 0)
        +						wr[ks:ks+ns], wi[ks:ks+ns], 0, 0, nil, 1)
         				}
         				// In case of a rare QR failure use eigenvalues
         				// of the trailing 2×2 principal submatrix.
        @@ -440,7 +443,7 @@ func (impl Implementation) Dlaqr04(wantt, wantz bool, n, ilo, ihi int, h []float
         			}
         		}
         
        -		// Use up to ns of the the smallest magnitude shifts. If there
        +		// Use up to ns of the smallest magnitude shifts. If there
         		// aren't ns shifts available, then use them all, possibly
         		// dropping one to make the number of shifts even.
         		ns = min(ns, kbot-ks+1) &^ 1
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlaqr1.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlaqr1.go
        index 493b8e445..e21373bd1 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlaqr1.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlaqr1.go
        @@ -18,15 +18,17 @@ import "math"
         //
         // Dlaqr1 is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dlaqr1(n int, h []float64, ldh int, sr1, si1, sr2, si2 float64, v []float64) {
        -	if n != 2 && n != 3 {
        -		panic(badDims)
        -	}
        -	checkMatrix(n, n, h, ldh)
        -	if len(v) != n {
        -		panic(badSlice)
        -	}
        -	if !((sr1 == sr2 && si1 == -si2) || (si1 == 0 && si2 == 0)) {
        +	switch {
        +	case n != 2 && n != 3:
        +		panic("lapack: n must be 2 or 3")
        +	case ldh < n:
        +		panic(badLdH)
        +	case len(h) < (n-1)*ldh+n:
        +		panic(shortH)
        +	case !((sr1 == sr2 && si1 == -si2) || (si1 == 0 && si2 == 0)):
         		panic(badShifts)
        +	case len(v) != n:
        +		panic(shortV)
         	}
         
         	if n == 2 {
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlaqr23.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlaqr23.go
        index 24fdf12b8..58af1e6d0 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlaqr23.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlaqr23.go
        @@ -29,8 +29,8 @@ import (
         //
         // ktop and kbot determine a block [ktop:kbot+1,ktop:kbot+1] along the diagonal
         // of H. It must hold that
        -//  0 <= ilo <= ihi < n,     if n > 0,
        -//  ilo == 0 and ihi == -1,  if n == 0,
        +//  0 <= ilo <= ihi < n     if n > 0,
        +//  ilo == 0 and ihi == -1  if n == 0,
         // and the block must be isolated, that is, it must hold that
         //  ktop == 0   or H[ktop,ktop-1] == 0,
         //  kbot == n-1 or H[kbot+1,kbot] == 0,
        @@ -80,48 +80,38 @@ import (
         //
         func (impl Implementation) Dlaqr23(wantt, wantz bool, n, ktop, kbot, nw int, h []float64, ldh int, iloz, ihiz int, z []float64, ldz int, sr, si []float64, v []float64, ldv int, nh int, t []float64, ldt int, nv int, wv []float64, ldwv int, work []float64, lwork int, recur int) (ns, nd int) {
         	switch {
        +	case n < 0:
        +		panic(nLT0)
         	case ktop < 0 || max(0, n-1) < ktop:
        -		panic("lapack: invalid value of ktop")
        +		panic(badKtop)
         	case kbot < min(ktop, n-1) || n <= kbot:
        -		panic("lapack: invalid value of kbot")
        -	case (nw < 0 || kbot-ktop+1 < nw) && lwork != -1:
        -		panic("lapack: invalid value of nw")
        +		panic(badKbot)
        +	case nw < 0 || kbot-ktop+1+1 < nw:
        +		panic(badNw)
        +	case ldh < max(1, n):
        +		panic(badLdH)
        +	case wantz && (iloz < 0 || ktop < iloz):
        +		panic(badIloz)
        +	case wantz && (ihiz < kbot || n <= ihiz):
        +		panic(badIhiz)
        +	case ldz < 1, wantz && ldz < n:
        +		panic(badLdZ)
        +	case ldv < max(1, nw):
        +		panic(badLdV)
         	case nh < nw:
        -		panic("lapack: invalid value of nh")
        +		panic(badNh)
        +	case ldt < max(1, nh):
        +		panic(badLdT)
        +	case nv < 0:
        +		panic(nvLT0)
        +	case ldwv < max(1, nw):
        +		panic(badLdWV)
         	case lwork < max(1, 2*nw) && lwork != -1:
        -		panic(badWork)
        -	case len(work) < lwork:
        +		panic(badLWork)
        +	case len(work) < max(1, lwork):
         		panic(shortWork)
         	case recur < 0:
        -		panic("lapack: recur is negative")
        -	}
        -	if wantz {
        -		switch {
        -		case iloz < 0 || ktop < iloz:
        -			panic("lapack: invalid value of iloz")
        -		case ihiz < kbot || n <= ihiz:
        -			panic("lapack: invalid value of ihiz")
        -		}
        -	}
        -	if lwork != -1 {
        -		// Check input slices only if not doing workspace query.
        -		checkMatrix(n, n, h, ldh)
        -		checkMatrix(nw, nw, v, ldv)
        -		checkMatrix(nw, nh, t, ldt)
        -		checkMatrix(nv, nw, wv, ldwv)
        -		if wantz {
        -			checkMatrix(n, n, z, ldz)
        -		}
        -		switch {
        -		case ktop > 0 && h[ktop*ldh+ktop-1] != 0:
        -			panic("lapack: block not isolated")
        -		case kbot+1 < n && h[(kbot+1)*ldh+kbot] != 0:
        -			panic("lapack: block not isolated")
        -		case len(sr) != kbot+1:
        -			panic("lapack: bad length of sr")
        -		case len(si) != kbot+1:
        -			panic("lapack: bad length of si")
        -		}
        +		panic(recurLT0)
         	}
         
         	// Quick return for zero window size.
        @@ -137,14 +127,14 @@ func (impl Implementation) Dlaqr23(wantt, wantz bool, n, ktop, kbot, nw int, h [
         	lwkopt := max(1, 2*nw)
         	if jw > 2 {
         		// Workspace query call to Dgehrd.
        -		impl.Dgehrd(jw, 0, jw-2, nil, 0, nil, work, -1)
        +		impl.Dgehrd(jw, 0, jw-2, t, ldt, work, work, -1)
         		lwk1 := int(work[0])
         		// Workspace query call to Dormhr.
        -		impl.Dormhr(blas.Right, blas.NoTrans, jw, jw, 0, jw-2, nil, 0, nil, nil, 0, work, -1)
        +		impl.Dormhr(blas.Right, blas.NoTrans, jw, jw, 0, jw-2, t, ldt, work, v, ldv, work, -1)
         		lwk2 := int(work[0])
         		if recur > 0 {
         			// Workspace query call to Dlaqr04.
        -			impl.Dlaqr04(true, true, jw, 0, jw-1, nil, 0, nil, nil, 0, jw-1, nil, 0, work, -1, recur-1)
        +			impl.Dlaqr04(true, true, jw, 0, jw-1, t, ldt, sr, si, 0, jw-1, v, ldv, work, -1, recur-1)
         			lwk3 := int(work[0])
         			// Optimal workspace.
         			lwkopt = max(jw+max(lwk1, lwk2), lwk3)
        @@ -159,6 +149,28 @@ func (impl Implementation) Dlaqr23(wantt, wantz bool, n, ktop, kbot, nw int, h [
         		return 0, 0
         	}
         
        +	// Check input slices only if not doing workspace query.
        +	switch {
        +	case len(h) < (n-1)*ldh+n:
        +		panic(shortH)
        +	case len(v) < (nw-1)*ldv+nw:
        +		panic(shortV)
        +	case len(t) < (nw-1)*ldt+nh:
        +		panic(shortT)
        +	case len(wv) < (nv-1)*ldwv+nw:
        +		panic(shortWV)
        +	case wantz && len(z) < (n-1)*ldz+n:
        +		panic(shortZ)
        +	case len(sr) != kbot+1:
        +		panic(badLenSr)
        +	case len(si) != kbot+1:
        +		panic(badLenSi)
        +	case ktop > 0 && h[ktop*ldh+ktop-1] != 0:
        +		panic(notIsolated)
        +	case kbot+1 < n && h[(kbot+1)*ldh+kbot] != 0:
        +		panic(notIsolated)
        +	}
        +
         	// Machine constants.
         	ulp := dlamchP
         	smlnum := float64(n) / ulp * dlamchS
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlaqr5.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlaqr5.go
        index 48198122c..0b0640ee5 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlaqr5.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlaqr5.go
        @@ -67,40 +67,68 @@ import (
         //
         // Dlaqr5 is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dlaqr5(wantt, wantz bool, kacc22 int, n, ktop, kbot, nshfts int, sr, si []float64, h []float64, ldh int, iloz, ihiz int, z []float64, ldz int, v []float64, ldv int, u []float64, ldu int, nv int, wv []float64, ldwv int, nh int, wh []float64, ldwh int) {
        -	checkMatrix(n, n, h, ldh)
        -	if ktop < 0 || n <= ktop {
        -		panic("lapack: invalid value of ktop")
        -	}
        -	if ktop > 0 && h[ktop*ldh+ktop-1] != 0 {
        -		panic("lapack: diagonal block is not isolated")
        -	}
        -	if kbot < 0 || n <= kbot {
        -		panic("lapack: invalid value of kbot")
        -	}
        -	if kbot < n-1 && h[(kbot+1)*ldh+kbot] != 0 {
        -		panic("lapack: diagonal block is not isolated")
        -	}
        -	if nshfts < 0 || nshfts&0x1 != 0 {
        -		panic("lapack: invalid number of shifts")
        -	}
        -	if len(sr) != nshfts || len(si) != nshfts {
        -		panic(badSlice) // TODO(vladimir-ch) Another message?
        -	}
        -	if wantz {
        -		if ihiz >= n {
        -			panic("lapack: invalid value of ihiz")
        -		}
        -		if iloz < 0 || ihiz < iloz {
        -			panic("lapack: invalid value of iloz")
        -		}
        -		checkMatrix(n, n, z, ldz)
        -	}
        -	checkMatrix(nshfts/2, 3, v, ldv) // Transposed w.r.t. lapack.
        -	checkMatrix(3*nshfts-3, 3*nshfts-3, u, ldu)
        -	checkMatrix(nv, 3*nshfts-3, wv, ldwv)
        -	checkMatrix(3*nshfts-3, nh, wh, ldwh)
        -	if kacc22 != 0 && kacc22 != 1 && kacc22 != 2 {
        -		panic("lapack: invalid value of kacc22")
        +	switch {
        +	case kacc22 != 0 && kacc22 != 1 && kacc22 != 2:
        +		panic(badKacc22)
        +	case n < 0:
        +		panic(nLT0)
        +	case ktop < 0 || n <= ktop:
        +		panic(badKtop)
        +	case kbot < 0 || n <= kbot:
        +		panic(badKbot)
        +
        +	case nshfts < 0:
        +		panic(nshftsLT0)
        +	case nshfts&0x1 != 0:
        +		panic(nshftsOdd)
        +	case len(sr) != nshfts:
        +		panic(badLenSr)
        +	case len(si) != nshfts:
        +		panic(badLenSi)
        +
        +	case ldh < max(1, n):
        +		panic(badLdH)
        +	case len(h) < (n-1)*ldh+n:
        +		panic(shortH)
        +
        +	case wantz && ihiz >= n:
        +		panic(badIhiz)
        +	case wantz && iloz < 0 || ihiz < iloz:
        +		panic(badIloz)
        +	case ldz < 1, wantz && ldz < n:
        +		panic(badLdZ)
        +	case wantz && len(z) < (n-1)*ldz+n:
        +		panic(shortZ)
        +
        +	case ldv < 3:
        +		// V is transposed w.r.t. reference lapack.
        +		panic(badLdV)
        +	case len(v) < (nshfts/2-1)*ldv+3:
        +		panic(shortV)
        +
        +	case ldu < max(1, 3*nshfts-3):
        +		panic(badLdU)
        +	case len(u) < (3*nshfts-3-1)*ldu+3*nshfts-3:
        +		panic(shortU)
        +
        +	case nv < 0:
        +		panic(nvLT0)
        +	case ldwv < max(1, 3*nshfts-3):
        +		panic(badLdWV)
        +	case len(wv) < (nv-1)*ldwv+3*nshfts-3:
        +		panic(shortWV)
        +
        +	case nh < 0:
        +		panic(nhLT0)
        +	case ldwh < max(1, nh):
        +		panic(badLdWH)
        +	case len(wh) < (3*nshfts-3-1)*ldwh+nh:
        +		panic(shortWH)
        +
        +	case ktop > 0 && h[ktop*ldh+ktop-1] != 0:
        +		panic(notIsolated)
        +	case kbot < n-1 && h[(kbot+1)*ldh+kbot] != 0:
        +		panic(notIsolated)
         	}
         
         	// If there are no shifts, then there is nothing to do.
        @@ -320,7 +348,7 @@ func (impl Implementation) Dlaqr5(wantt, wantz bool, kacc22 int, n, ktop, kbot,
         					h[j*ldh+k+3] -= refsum * v[m*ldv+2]
         				}
         				if accum {
        -					// Accumulate U. (If necessary, update Z later with with an
        +					// Accumulate U. (If necessary, update Z later with an
         					// efficient matrix-matrix multiply.)
         					kms := k - incol
         					for j := max(0, ktop-incol-1); j < kdu; j++ {
        @@ -516,12 +544,12 @@ func (impl Implementation) Dlaqr5(wantt, wantz bool, kacc22 int, n, ktop, kbot,
         			// rows get multiplied by zero).
         			impl.Dlacpy(blas.All, knz, jlen, h[(incol+1+j2)*ldh+jcol:], ldh, wh[kzs*ldwh:], ldwh)
         
        -			// Multiply by U21^T.
        +			// Multiply by U21ᵀ.
         			impl.Dlaset(blas.All, kzs, jlen, 0, 0, wh, ldwh)
         			bi.Dtrmm(blas.Left, blas.Upper, blas.Trans, blas.NonUnit, knz, jlen,
         				1, u[j2*ldu+kzs:], ldu, wh[kzs*ldwh:], ldwh)
         
        -			// Multiply top of H by U11^T.
        +			// Multiply top of H by U11ᵀ.
         			bi.Dgemm(blas.Trans, blas.NoTrans, i2, jlen, j2,
         				1, u, ldu, h[(incol+1)*ldh+jcol:], ldh,
         				1, wh, ldwh)
        @@ -529,7 +557,7 @@ func (impl Implementation) Dlaqr5(wantt, wantz bool, kacc22 int, n, ktop, kbot,
         			// Copy top of H to bottom of WH.
         			impl.Dlacpy(blas.All, j2, jlen, h[(incol+1)*ldh+jcol:], ldh, wh[i2*ldwh:], ldwh)
         
        -			// Multiply by U21^T.
        +			// Multiply by U21ᵀ.
         			bi.Dtrmm(blas.Left, blas.Lower, blas.Trans, blas.NonUnit, j2, jlen,
         				1, u[i2:], ldu, wh[i2*ldwh:], ldwh)
         
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlarf.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlarf.go
        index 5fe24f4a9..0d8518267 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlarf.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlarf.go
        @@ -9,46 +9,62 @@ import (
         	"gonum.org/v1/gonum/blas/blas64"
         )
         
        -// Dlarf applies an elementary reflector to a general rectangular matrix c.
        -// This computes
        -//  c = h * c if side == Left
        -//  c = c * h if side == right
        -// where
        -//  h = 1 - tau * v * v^T
        -// and c is an m * n matrix.
        +// Dlarf applies an elementary reflector H to an m×n matrix C:
        +//  C = H * C  if side == blas.Left
        +//  C = C * H  if side == blas.Right
        +// H is represented in the form
        +//  H = I - tau * v * vᵀ
        +// where tau is a scalar and v is a vector.
         //
        -// work is temporary storage of length at least m if side == Left and at least
        -// n if side == Right. This function will panic if this length requirement is not met.
        +// work must have length at least m if side == blas.Left and
        +// at least n if side == blas.Right.
         //
         // Dlarf is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dlarf(side blas.Side, m, n int, v []float64, incv int, tau float64, c []float64, ldc int, work []float64) {
        -	applyleft := side == blas.Left
        -	if (applyleft && len(work) < n) || (!applyleft && len(work) < m) {
        -		panic(badWork)
        +	switch {
        +	case side != blas.Left && side != blas.Right:
        +		panic(badSide)
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case incv == 0:
        +		panic(zeroIncV)
        +	case ldc < max(1, n):
        +		panic(badLdC)
         	}
        -	checkMatrix(m, n, c, ldc)
         
        -	// v has length m if applyleft and n otherwise.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	applyleft := side == blas.Left
         	lenV := n
         	if applyleft {
         		lenV = m
         	}
         
        -	checkVector(lenV, v, incv)
        +	switch {
        +	case len(v) < 1+(lenV-1)*abs(incv):
        +		panic(shortV)
        +	case len(c) < (m-1)*ldc+n:
        +		panic(shortC)
        +	case (applyleft && len(work) < n) || (!applyleft && len(work) < m):
        +		panic(shortWork)
        +	}
         
        -	lastv := 0 // last non-zero element of v
        -	lastc := 0 // last non-zero row/column of c
        +	lastv := -1 // last non-zero element of v
        +	lastc := -1 // last non-zero row/column of C
         	if tau != 0 {
        -		var i int
         		if applyleft {
         			lastv = m - 1
         		} else {
         			lastv = n - 1
         		}
        +		var i int
         		if incv > 0 {
         			i = lastv * incv
         		}
        -
         		// Look for the last non-zero row in v.
         		for lastv >= 0 && v[i] == 0 {
         			lastv--
        @@ -65,19 +81,18 @@ func (impl Implementation) Dlarf(side blas.Side, m, n int, v []float64, incv int
         	if lastv == -1 || lastc == -1 {
         		return
         	}
        -	// Sometimes 1-indexing is nicer ...
         	bi := blas64.Implementation()
         	if applyleft {
         		// Form H * C
        -		// w[0:lastc+1] = c[1:lastv+1, 1:lastc+1]^T * v[1:lastv+1,1]
        +		// w[0:lastc+1] = c[1:lastv+1, 1:lastc+1]ᵀ * v[1:lastv+1,1]
         		bi.Dgemv(blas.Trans, lastv+1, lastc+1, 1, c, ldc, v, incv, 0, work, 1)
        -		// c[0: lastv, 0: lastc] = c[...] - w[0:lastv, 1] * v[1:lastc, 1]^T
        +		// c[0: lastv, 0: lastc] = c[...] - w[0:lastv, 1] * v[1:lastc, 1]ᵀ
         		bi.Dger(lastv+1, lastc+1, -tau, v, incv, work, 1, c, ldc)
        -		return
        +	} else {
        +		// Form C * H
        +		// w[0:lastc+1,1] := c[0:lastc+1,0:lastv+1] * v[0:lastv+1,1]
        +		bi.Dgemv(blas.NoTrans, lastc+1, lastv+1, 1, c, ldc, v, incv, 0, work, 1)
        +		// c[0:lastc+1,0:lastv+1] = c[...] - w[0:lastc+1,0] * v[0:lastv+1,0]ᵀ
        +		bi.Dger(lastc+1, lastv+1, -tau, work, 1, v, incv, c, ldc)
         	}
        -	// Form C*H
        -	// w[0:lastc+1,1] := c[0:lastc+1,0:lastv+1] * v[0:lastv+1,1]
        -	bi.Dgemv(blas.NoTrans, lastc+1, lastv+1, 1, c, ldc, v, incv, 0, work, 1)
        -	// c[0:lastc+1,0:lastv+1] = c[...] - w[0:lastc+1,0] * v[0:lastv+1,0]^T
        -	bi.Dger(lastc+1, lastv+1, -tau, work, 1, v, incv, c, ldc)
         }
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlarfb.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlarfb.go
        index 3de2684b1..d3ddc8e4b 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlarfb.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlarfb.go
        @@ -13,13 +13,13 @@ import (
         // Dlarfb applies a block reflector to a matrix.
         //
         // In the call to Dlarfb, the mxn c is multiplied by the implicitly defined matrix h as follows:
        -//  c = h * c if side == Left and trans == NoTrans
        -//  c = c * h if side == Right and trans == NoTrans
        -//  c = h^T * c if side == Left and trans == Trans
        -//  c = c * h^T if side == Right and trans == Trans
        +//  c = h * c   if side == Left and trans == NoTrans
        +//  c = c * h   if side == Right and trans == NoTrans
        +//  c = hᵀ * c  if side == Left and trans == Trans
        +//  c = c * hᵀ  if side == Right and trans == Trans
         // h is a product of elementary reflectors. direct sets the direction of multiplication
        -//  h = h_1 * h_2 * ... * h_k if direct == Forward
        -//  h = h_k * h_k-1 * ... * h_1 if direct == Backward
        +//  h = h_1 * h_2 * ... * h_k    if direct == Forward
        +//  h = h_k * h_k-1 * ... * h_1  if direct == Backward
         // The combination of direct and store defines the orientation of the elementary
         // reflectors. In all cases the ones on the diagonal are implicitly represented.
         //
        @@ -56,38 +56,56 @@ import (
         //
         // Dlarfb is an internal routine. It is exported for testing purposes.
         func (Implementation) Dlarfb(side blas.Side, trans blas.Transpose, direct lapack.Direct, store lapack.StoreV, m, n, k int, v []float64, ldv int, t []float64, ldt int, c []float64, ldc int, work []float64, ldwork int) {
        -	if side != blas.Left && side != blas.Right {
        -		panic(badSide)
        +	nv := m
        +	if side == blas.Right {
        +		nv = n
         	}
        -	if trans != blas.Trans && trans != blas.NoTrans {
        +	switch {
        +	case side != blas.Left && side != blas.Right:
        +		panic(badSide)
        +	case trans != blas.Trans && trans != blas.NoTrans:
         		panic(badTrans)
        -	}
        -	if direct != lapack.Forward && direct != lapack.Backward {
        +	case direct != lapack.Forward && direct != lapack.Backward:
         		panic(badDirect)
        -	}
        -	if store != lapack.ColumnWise && store != lapack.RowWise {
        -		panic(badStore)
        -	}
        -	checkMatrix(m, n, c, ldc)
        -	if k < 0 {
        +	case store != lapack.ColumnWise && store != lapack.RowWise:
        +		panic(badStoreV)
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case k < 0:
         		panic(kLT0)
        +	case store == lapack.ColumnWise && ldv < max(1, k):
        +		panic(badLdV)
        +	case store == lapack.RowWise && ldv < max(1, nv):
        +		panic(badLdV)
        +	case ldt < max(1, k):
        +		panic(badLdT)
        +	case ldc < max(1, n):
        +		panic(badLdC)
        +	case ldwork < max(1, k):
        +		panic(badLdWork)
         	}
        -	checkMatrix(k, k, t, ldt)
        -	nv := m
        +
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
         	nw := n
         	if side == blas.Right {
        -		nv = n
         		nw = m
         	}
        -	if store == lapack.ColumnWise {
        -		checkMatrix(nv, k, v, ldv)
        -	} else {
        -		checkMatrix(k, nv, v, ldv)
        -	}
        -	checkMatrix(nw, k, work, ldwork)
        -
        -	if m == 0 || n == 0 {
        -		return
        +	switch {
        +	case store == lapack.ColumnWise && len(v) < (nv-1)*ldv+k:
        +		panic(shortV)
        +	case store == lapack.RowWise && len(v) < (k-1)*ldv+nv:
        +		panic(shortV)
        +	case len(t) < (k-1)*ldt+k:
        +		panic(shortT)
        +	case len(c) < (m-1)*ldc+n:
        +		panic(shortC)
        +	case len(work) < (nw-1)*ldwork+k:
        +		panic(shortWork)
         	}
         
         	bi := blas64.Implementation()
        @@ -100,13 +118,13 @@ func (Implementation) Dlarfb(side blas.Side, trans blas.Transpose, direct lapack
         	// elements are copied into the columns of the working array. The
         	// loops should go in the other direction so the data is written
         	// into the rows of work so the copy is not strided. A bigger change
        -	// would be to replace work with work^T, but benchmarks would be
        +	// would be to replace work with workᵀ, but benchmarks would be
         	// needed to see if the change is merited.
         	if store == lapack.ColumnWise {
         		if direct == lapack.Forward {
         			// V1 is the first k rows of C. V2 is the remaining rows.
         			if side == blas.Left {
        -				// W = C^T V = C1^T V1 + C2^T V2 (stored in work).
        +				// W = Cᵀ V = C1ᵀ V1 + C2ᵀ V2 (stored in work).
         
         				// W = C1.
         				for j := 0; j < k; j++ {
        @@ -118,27 +136,27 @@ func (Implementation) Dlarfb(side blas.Side, trans blas.Transpose, direct lapack
         					v, ldv,
         					work, ldwork)
         				if m > k {
        -					// W = W + C2^T V2.
        +					// W = W + C2ᵀ V2.
         					bi.Dgemm(blas.Trans, blas.NoTrans, n, k, m-k,
         						1, c[k*ldc:], ldc, v[k*ldv:], ldv,
         						1, work, ldwork)
         				}
        -				// W = W * T^T or W * T.
        +				// W = W * Tᵀ or W * T.
         				bi.Dtrmm(blas.Right, blas.Upper, transt, blas.NonUnit, n, k,
         					1, t, ldt,
         					work, ldwork)
        -				// C -= V * W^T.
        +				// C -= V * Wᵀ.
         				if m > k {
        -					// C2 -= V2 * W^T.
        +					// C2 -= V2 * Wᵀ.
         					bi.Dgemm(blas.NoTrans, blas.Trans, m-k, n, k,
         						-1, v[k*ldv:], ldv, work, ldwork,
         						1, c[k*ldc:], ldc)
         				}
        -				// W *= V1^T.
        +				// W *= V1ᵀ.
         				bi.Dtrmm(blas.Right, blas.Lower, blas.Trans, blas.Unit, n, k,
         					1, v, ldv,
         					work, ldwork)
        -				// C1 -= W^T.
        +				// C1 -= Wᵀ.
         				// TODO(btracey): This should use blas.Axpy.
         				for i := 0; i < n; i++ {
         					for j := 0; j < k; j++ {
        @@ -147,7 +165,7 @@ func (Implementation) Dlarfb(side blas.Side, trans blas.Transpose, direct lapack
         				}
         				return
         			}
        -			// Form C = C * H or C * H^T, where C = (C1 C2).
        +			// Form C = C * H or C * Hᵀ, where C = (C1 C2).
         
         			// W = C1.
         			for i := 0; i < k; i++ {
        @@ -162,7 +180,7 @@ func (Implementation) Dlarfb(side blas.Side, trans blas.Transpose, direct lapack
         					1, c[k:], ldc, v[k*ldv:], ldv,
         					1, work, ldwork)
         			}
        -			// W *= T or T^T.
        +			// W *= T or Tᵀ.
         			bi.Dtrmm(blas.Right, blas.Upper, trans, blas.NonUnit, m, k,
         				1, t, ldt,
         				work, ldwork)
        @@ -171,7 +189,7 @@ func (Implementation) Dlarfb(side blas.Side, trans blas.Transpose, direct lapack
         					-1, work, ldwork, v[k*ldv:], ldv,
         					1, c[k:], ldc)
         			}
        -			// C -= W * V^T.
        +			// C -= W * Vᵀ.
         			bi.Dtrmm(blas.Right, blas.Lower, blas.Trans, blas.Unit, m, k,
         				1, v, ldv,
         				work, ldwork)
        @@ -189,9 +207,9 @@ func (Implementation) Dlarfb(side blas.Side, trans blas.Transpose, direct lapack
         		// Where V2 is unit upper triangular.
         		if side == blas.Left {
         			// Form H * C or
        -			// W = C^T V.
        +			// W = Cᵀ V.
         
        -			// W = C2^T.
        +			// W = C2ᵀ.
         			for j := 0; j < k; j++ {
         				bi.Dcopy(n, c[(m-k+j)*ldc:], 1, work[j:], ldwork)
         			}
        @@ -200,26 +218,26 @@ func (Implementation) Dlarfb(side blas.Side, trans blas.Transpose, direct lapack
         				1, v[(m-k)*ldv:], ldv,
         				work, ldwork)
         			if m > k {
        -				// W += C1^T * V1.
        +				// W += C1ᵀ * V1.
         				bi.Dgemm(blas.Trans, blas.NoTrans, n, k, m-k,
         					1, c, ldc, v, ldv,
         					1, work, ldwork)
         			}
        -			// W *= T or T^T.
        +			// W *= T or Tᵀ.
         			bi.Dtrmm(blas.Right, blas.Lower, transt, blas.NonUnit, n, k,
         				1, t, ldt,
         				work, ldwork)
        -			// C -= V * W^T.
        +			// C -= V * Wᵀ.
         			if m > k {
         				bi.Dgemm(blas.NoTrans, blas.Trans, m-k, n, k,
         					-1, v, ldv, work, ldwork,
         					1, c, ldc)
         			}
        -			// W *= V2^T.
        +			// W *= V2ᵀ.
         			bi.Dtrmm(blas.Right, blas.Upper, blas.Trans, blas.Unit, n, k,
         				1, v[(m-k)*ldv:], ldv,
         				work, ldwork)
        -			// C2 -= W^T.
        +			// C2 -= Wᵀ.
         			// TODO(btracey): This should use blas.Axpy.
         			for i := 0; i < n; i++ {
         				for j := 0; j < k; j++ {
        @@ -228,7 +246,7 @@ func (Implementation) Dlarfb(side blas.Side, trans blas.Transpose, direct lapack
         			}
         			return
         		}
        -		// Form C * H or C * H^T where C = (C1 C2).
        +		// Form C * H or C * Hᵀ where C = (C1 C2).
         		// W = C * V.
         
         		// W = C2.
        @@ -245,18 +263,18 @@ func (Implementation) Dlarfb(side blas.Side, trans blas.Transpose, direct lapack
         				1, c, ldc, v, ldv,
         				1, work, ldwork)
         		}
        -		// W *= T or T^T.
        +		// W *= T or Tᵀ.
         		bi.Dtrmm(blas.Right, blas.Lower, trans, blas.NonUnit, m, k,
         			1, t, ldt,
         			work, ldwork)
        -		// C -= W * V^T.
        +		// C -= W * Vᵀ.
         		if n > k {
        -			// C1 -= W * V1^T.
        +			// C1 -= W * V1ᵀ.
         			bi.Dgemm(blas.NoTrans, blas.Trans, m, n-k, k,
         				-1, work, ldwork, v, ldv,
         				1, c, ldc)
         		}
        -		// W *= V2^T.
        +		// W *= V2ᵀ.
         		bi.Dtrmm(blas.Right, blas.Upper, blas.Trans, blas.Unit, m, k,
         			1, v[(n-k)*ldv:], ldv,
         			work, ldwork)
        @@ -273,14 +291,14 @@ func (Implementation) Dlarfb(side blas.Side, trans blas.Transpose, direct lapack
         	if direct == lapack.Forward {
         		// V = (V1 V2) where v1 is unit upper triangular.
         		if side == blas.Left {
        -			// Form H * C or H^T * C where C = (C1; C2).
        -			// W = C^T * V^T.
        +			// Form H * C or Hᵀ * C where C = (C1; C2).
        +			// W = Cᵀ * Vᵀ.
         
        -			// W = C1^T.
        +			// W = C1ᵀ.
         			for j := 0; j < k; j++ {
         				bi.Dcopy(n, c[j*ldc:], 1, work[j:], ldwork)
         			}
        -			// W *= V1^T.
        +			// W *= V1ᵀ.
         			bi.Dtrmm(blas.Right, blas.Upper, blas.Trans, blas.Unit, n, k,
         				1, v, ldv,
         				work, ldwork)
        @@ -289,11 +307,11 @@ func (Implementation) Dlarfb(side blas.Side, trans blas.Transpose, direct lapack
         					1, c[k*ldc:], ldc, v[k:], ldv,
         					1, work, ldwork)
         			}
        -			// W *= T or T^T.
        +			// W *= T or Tᵀ.
         			bi.Dtrmm(blas.Right, blas.Upper, transt, blas.NonUnit, n, k,
         				1, t, ldt,
         				work, ldwork)
        -			// C -= V^T * W^T.
        +			// C -= Vᵀ * Wᵀ.
         			if m > k {
         				bi.Dgemm(blas.Trans, blas.Trans, m-k, n, k,
         					-1, v[k:], ldv, work, ldwork,
        @@ -303,7 +321,7 @@ func (Implementation) Dlarfb(side blas.Side, trans blas.Transpose, direct lapack
         			bi.Dtrmm(blas.Right, blas.Upper, blas.NoTrans, blas.Unit, n, k,
         				1, v, ldv,
         				work, ldwork)
        -			// C1 -= W^T.
        +			// C1 -= Wᵀ.
         			// TODO(btracey): This should use blas.Axpy.
         			for i := 0; i < n; i++ {
         				for j := 0; j < k; j++ {
        @@ -312,14 +330,14 @@ func (Implementation) Dlarfb(side blas.Side, trans blas.Transpose, direct lapack
         			}
         			return
         		}
        -		// Form C * H or C * H^T where C = (C1 C2).
        -		// W = C * V^T.
        +		// Form C * H or C * Hᵀ where C = (C1 C2).
        +		// W = C * Vᵀ.
         
         		// W = C1.
         		for j := 0; j < k; j++ {
         			bi.Dcopy(m, c[j:], ldc, work[j:], ldwork)
         		}
        -		// W *= V1^T.
        +		// W *= V1ᵀ.
         		bi.Dtrmm(blas.Right, blas.Upper, blas.Trans, blas.Unit, m, k,
         			1, v, ldv,
         			work, ldwork)
        @@ -328,7 +346,7 @@ func (Implementation) Dlarfb(side blas.Side, trans blas.Transpose, direct lapack
         				1, c[k:], ldc, v[k:], ldv,
         				1, work, ldwork)
         		}
        -		// W *= T or T^T.
        +		// W *= T or Tᵀ.
         		bi.Dtrmm(blas.Right, blas.Upper, trans, blas.NonUnit, m, k,
         			1, t, ldt,
         			work, ldwork)
        @@ -353,14 +371,14 @@ func (Implementation) Dlarfb(side blas.Side, trans blas.Transpose, direct lapack
         	}
         	// V = (V1 V2) where V2 is the last k columns and is lower unit triangular.
         	if side == blas.Left {
        -		// Form H * C or H^T C where C = (C1 ; C2).
        -		// W = C^T * V^T.
        +		// Form H * C or Hᵀ C where C = (C1 ; C2).
        +		// W = Cᵀ * Vᵀ.
         
        -		// W = C2^T.
        +		// W = C2ᵀ.
         		for j := 0; j < k; j++ {
         			bi.Dcopy(n, c[(m-k+j)*ldc:], 1, work[j:], ldwork)
         		}
        -		// W *= V2^T.
        +		// W *= V2ᵀ.
         		bi.Dtrmm(blas.Right, blas.Lower, blas.Trans, blas.Unit, n, k,
         			1, v[m-k:], ldv,
         			work, ldwork)
        @@ -369,11 +387,11 @@ func (Implementation) Dlarfb(side blas.Side, trans blas.Transpose, direct lapack
         				1, c, ldc, v, ldv,
         				1, work, ldwork)
         		}
        -		// W *= T or T^T.
        +		// W *= T or Tᵀ.
         		bi.Dtrmm(blas.Right, blas.Lower, transt, blas.NonUnit, n, k,
         			1, t, ldt,
         			work, ldwork)
        -		// C -= V^T * W^T.
        +		// C -= Vᵀ * Wᵀ.
         		if m > k {
         			bi.Dgemm(blas.Trans, blas.Trans, m-k, n, k,
         				-1, v, ldv, work, ldwork,
        @@ -383,7 +401,7 @@ func (Implementation) Dlarfb(side blas.Side, trans blas.Transpose, direct lapack
         		bi.Dtrmm(blas.Right, blas.Lower, blas.NoTrans, blas.Unit, n, k,
         			1, v[m-k:], ldv,
         			work, ldwork)
        -		// C2 -= W^T.
        +		// C2 -= Wᵀ.
         		// TODO(btracey): This should use blas.Axpy.
         		for i := 0; i < n; i++ {
         			for j := 0; j < k; j++ {
        @@ -392,13 +410,13 @@ func (Implementation) Dlarfb(side blas.Side, trans blas.Transpose, direct lapack
         		}
         		return
         	}
        -	// Form C * H or C * H^T where C = (C1 C2).
        -	// W = C * V^T.
        +	// Form C * H or C * Hᵀ where C = (C1 C2).
        +	// W = C * Vᵀ.
         	// W = C2.
         	for j := 0; j < k; j++ {
         		bi.Dcopy(m, c[n-k+j:], ldc, work[j:], ldwork)
         	}
        -	// W *= V2^T.
        +	// W *= V2ᵀ.
         	bi.Dtrmm(blas.Right, blas.Lower, blas.Trans, blas.Unit, m, k,
         		1, v[n-k:], ldv,
         		work, ldwork)
        @@ -407,7 +425,7 @@ func (Implementation) Dlarfb(side blas.Side, trans blas.Transpose, direct lapack
         			1, c, ldc, v, ldv,
         			1, work, ldwork)
         	}
        -	// W *= T or T^T.
        +	// W *= T or Tᵀ.
         	bi.Dtrmm(blas.Right, blas.Lower, trans, blas.NonUnit, m, k,
         		1, t, ldt,
         		work, ldwork)
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlarfg.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlarfg.go
        index 52a67a46b..3f614b044 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlarfg.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlarfg.go
        @@ -14,23 +14,32 @@ import (
         // a real elementary reflector of order n such that
         //  H * (alpha) = (beta)
         //      (    x)   (   0)
        -//  H^T * H = I
        +//  Hᵀ * H = I
         // H is represented in the form
        -//  H = 1 - tau * (1; v) * (1 v^T)
        +//  H = 1 - tau * (1; v) * (1 vᵀ)
         // where tau is a real scalar.
         //
         // On entry, x contains the vector x, on exit it contains v.
         //
         // Dlarfg is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dlarfg(n int, alpha float64, x []float64, incX int) (beta, tau float64) {
        -	if n < 0 {
        +	switch {
        +	case n < 0:
         		panic(nLT0)
        +	case incX <= 0:
        +		panic(badIncX)
         	}
        +
         	if n <= 1 {
         		return alpha, 0
         	}
        -	checkVector(n-1, x, incX)
        +
        +	if len(x) < 1+(n-2)*abs(incX) {
        +		panic(shortX)
        +	}
        +
         	bi := blas64.Implementation()
        +
         	xnorm := bi.Dnrm2(n-1, x, incX)
         	if xnorm == 0 {
         		return alpha, 0
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlarft.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlarft.go
        index eaec81320..1d84fb5d6 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlarft.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlarft.go
        @@ -12,8 +12,8 @@ import (
         
         // Dlarft forms the triangular factor T of a block reflector H, storing the answer
         // in t.
        -//  H = I - V * T * V^T  if store == lapack.ColumnWise
        -//  H = I - V^T * T * V  if store == lapack.RowWise
        +//  H = I - V * T * Vᵀ  if store == lapack.ColumnWise
        +//  H = I - Vᵀ * T * V  if store == lapack.RowWise
         // H is defined by a product of the elementary reflectors where
         //  H = H_0 * H_1 * ... * H_{k-1}  if direct == lapack.Forward
         //  H = H_{k-1} * ... * H_1 * H_0  if direct == lapack.Backward
        @@ -28,25 +28,41 @@ import (
         // tau contains the scalar factors of the elementary reflectors H_i.
         //
         // Dlarft is an internal routine. It is exported for testing purposes.
        -func (Implementation) Dlarft(direct lapack.Direct, store lapack.StoreV, n, k int,
        -	v []float64, ldv int, tau []float64, t []float64, ldt int) {
        -	if n == 0 {
        -		return
        -	}
        -	if n < 0 || k < 0 {
        -		panic(negDimension)
        +func (Implementation) Dlarft(direct lapack.Direct, store lapack.StoreV, n, k int, v []float64, ldv int, tau []float64, t []float64, ldt int) {
        +	mv, nv := n, k
        +	if store == lapack.RowWise {
        +		mv, nv = k, n
         	}
        -	if direct != lapack.Forward && direct != lapack.Backward {
        +	switch {
        +	case direct != lapack.Forward && direct != lapack.Backward:
         		panic(badDirect)
        +	case store != lapack.RowWise && store != lapack.ColumnWise:
        +		panic(badStoreV)
        +	case n < 0:
        +		panic(nLT0)
        +	case k < 1:
        +		panic(kLT1)
        +	case ldv < max(1, nv):
        +		panic(badLdV)
        +	case len(tau) < k:
        +		panic(shortTau)
        +	case ldt < max(1, k):
        +		panic(shortT)
         	}
        -	if store != lapack.RowWise && store != lapack.ColumnWise {
        -		panic(badStore)
        +
        +	if n == 0 {
        +		return
         	}
        -	if len(tau) < k {
        -		panic(badTau)
        +
        +	switch {
        +	case len(v) < (mv-1)*ldv+nv:
        +		panic(shortV)
        +	case len(t) < (k-1)*ldt+k:
        +		panic(shortT)
         	}
        -	checkMatrix(k, k, t, ldt)
        +
         	bi := blas64.Implementation()
        +
         	// TODO(btracey): There are a number of minor obvious loop optimizations here.
         	// TODO(btracey): It may be possible to rearrange some of the code so that
         	// index of 1 is more common in the Dgemv.
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlarfx.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlarfx.go
        index 6b3f905c0..a018593fe 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlarfx.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlarfx.go
        @@ -11,7 +11,7 @@ import "gonum.org/v1/gonum/blas"
         // than 11.
         //
         // H is represented in the form
        -//  H = I - tau * v * v^T,
        +//  H = I - tau * v * vᵀ,
         // where tau is a real scalar and v is a real vector. If tau = 0, then H is
         // taken to be the identity matrix.
         //
        @@ -27,20 +27,35 @@ import "gonum.org/v1/gonum/blas"
         //
         // Dlarfx is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dlarfx(side blas.Side, m, n int, v []float64, tau float64, c []float64, ldc int, work []float64) {
        -	checkMatrix(m, n, c, ldc)
        -	switch side {
        -	case blas.Left:
        -		checkVector(m, v, 1)
        -		if m > 10 && len(work) < n {
        -			panic(badWork)
        -		}
        -	case blas.Right:
        -		checkVector(n, v, 1)
        -		if n > 10 && len(work) < m {
        -			panic(badWork)
        -		}
        -	default:
        +	switch {
        +	case side != blas.Left && side != blas.Right:
         		panic(badSide)
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case ldc < max(1, n):
        +		panic(badLdC)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
        +	nh := m
        +	lwork := n
        +	if side == blas.Right {
        +		nh = n
        +		lwork = m
        +	}
        +	switch {
        +	case len(v) < nh:
        +		panic(shortV)
        +	case len(c) < (m-1)*ldc+n:
        +		panic(shortC)
        +	case nh > 10 && len(work) < lwork:
        +		panic(shortWork)
         	}
         
         	if tau == 0 {
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlascl.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlascl.go
        index 51363fe50..61c4eb79c 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlascl.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlascl.go
        @@ -17,16 +17,40 @@ import (
         //
         // Dlascl is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dlascl(kind lapack.MatrixType, kl, ku int, cfrom, cto float64, m, n int, a []float64, lda int) {
        -	checkMatrix(m, n, a, lda)
        -	if cfrom == 0 {
        -		panic(zeroDiv)
        +	switch kind {
        +	default:
        +		panic(badMatrixType)
        +	case 'H', 'B', 'Q', 'Z': // See dlascl.f.
        +		panic("not implemented")
        +	case lapack.General, lapack.UpperTri, lapack.LowerTri:
        +		if lda < max(1, n) {
        +			panic(badLdA)
        +		}
         	}
        -	if math.IsNaN(cfrom) || math.IsNaN(cto) {
        -		panic(nanScale)
        +	switch {
        +	case cfrom == 0:
        +		panic(zeroCFrom)
        +	case math.IsNaN(cfrom):
        +		panic(nanCFrom)
        +	case math.IsNaN(cto):
        +		panic(nanCTo)
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
         	}
        +
         	if n == 0 || m == 0 {
         		return
         	}
        +
        +	switch kind {
        +	case lapack.General, lapack.UpperTri, lapack.LowerTri:
        +		if len(a) < (m-1)*lda+n {
        +			panic(shortA)
        +		}
        +	}
        +
         	smlnum := dlamchS
         	bignum := 1 / smlnum
         	cfromc := cfrom
        @@ -61,8 +85,6 @@ func (impl Implementation) Dlascl(kind lapack.MatrixType, kl, ku int, cfrom, cto
         			}
         		}
         		switch kind {
        -		default:
        -			panic("lapack: not implemented")
         		case lapack.General:
         			for i := 0; i < m; i++ {
         				for j := 0; j < n; j++ {
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlaset.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlaset.go
        index 3116631eb..b8b6b0f4d 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlaset.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlaset.go
        @@ -14,27 +14,45 @@ import "gonum.org/v1/gonum/blas"
         //
         // Dlaset is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dlaset(uplo blas.Uplo, m, n int, alpha, beta float64, a []float64, lda int) {
        -	checkMatrix(m, n, a, lda)
        -	if uplo == blas.Upper {
        +	switch {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	}
        +
        +	minmn := min(m, n)
        +	if minmn == 0 {
        +		return
        +	}
        +
        +	if len(a) < (m-1)*lda+n {
        +		panic(shortA)
        +	}
        +
        +	switch uplo {
        +	case blas.Upper:
         		for i := 0; i < m; i++ {
         			for j := i + 1; j < n; j++ {
         				a[i*lda+j] = alpha
         			}
         		}
        -	} else if uplo == blas.Lower {
        +	case blas.Lower:
         		for i := 0; i < m; i++ {
        -			for j := 0; j < min(i+1, n); j++ {
        +			for j := 0; j < min(i, n); j++ {
         				a[i*lda+j] = alpha
         			}
         		}
        -	} else {
        +	default:
         		for i := 0; i < m; i++ {
         			for j := 0; j < n; j++ {
         				a[i*lda+j] = alpha
         			}
         		}
         	}
        -	for i := 0; i < min(m, n); i++ {
        +	for i := 0; i < minmn; i++ {
         		a[i*lda+i] = beta
         	}
         }
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlasq1.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlasq1.go
        index 4a37cfc55..1f1d1dc42 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlasq1.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlasq1.go
        @@ -19,30 +19,33 @@ import (
         //
         // Dlasq1 is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dlasq1(n int, d, e, work []float64) (info int) {
        -	// TODO(btracey): replace info with an error.
         	if n < 0 {
         		panic(nLT0)
         	}
        -	if len(work) < 4*n {
        -		panic(badWork)
        -	}
        -	if len(d) < n {
        -		panic("lapack: length of d less than n")
        -	}
        -	if len(e) < n-1 {
        -		panic("lapack: length of e less than n-1")
        -	}
        +
         	if n == 0 {
         		return info
         	}
        +
        +	switch {
        +	case len(d) < n:
        +		panic(shortD)
        +	case len(e) < n-1:
        +		panic(shortE)
        +	case len(work) < 4*n:
        +		panic(shortWork)
        +	}
        +
         	if n == 1 {
         		d[0] = math.Abs(d[0])
         		return info
         	}
        +
         	if n == 2 {
         		d[1], d[0] = impl.Dlas2(d[0], e[0], d[1])
         		return info
         	}
        +
         	// Estimate the largest singular value.
         	var sigmx float64
         	for i := 0; i < n-1; i++ {
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlasq2.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlasq2.go
        index 009e506b6..fd24a5509 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlasq2.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlasq2.go
        @@ -35,31 +35,34 @@ import (
         //
         // Dlasq2 is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dlasq2(n int, z []float64) (info int) {
        -	// TODO(btracey): make info an error.
        -	if len(z) < 4*n {
        -		panic(badZ)
        -	}
        -	const cbias = 1.5
        -
        -	eps := dlamchP
        -	safmin := dlamchS
        -	tol := eps * 100
        -	tol2 := tol * tol
         	if n < 0 {
         		panic(nLT0)
         	}
        +
         	if n == 0 {
         		return info
         	}
        +
        +	if len(z) < 4*n {
        +		panic(shortZ)
        +	}
        +
         	if n == 1 {
         		if z[0] < 0 {
         			panic(negZ)
         		}
         		return info
         	}
        +
        +	const cbias = 1.5
        +
        +	eps := dlamchP
        +	safmin := dlamchS
        +	tol := eps * 100
        +	tol2 := tol * tol
         	if n == 2 {
         		if z[1] < 0 || z[2] < 0 {
        -			panic("lapack: bad z value")
        +			panic(negZ)
         		} else if z[2] > z[0] {
         			z[0], z[2] = z[2], z[0]
         		}
        @@ -87,7 +90,7 @@ func (impl Implementation) Dlasq2(n int, z []float64) (info int) {
         	var i1, n1 int
         	for k := 0; k < 2*(n-1); k += 2 {
         		if z[k] < 0 || z[k+1] < 0 {
        -			panic("lapack: bad z value")
        +			panic(negZ)
         		}
         		d += z[k]
         		e += z[k+1]
        @@ -95,10 +98,9 @@ func (impl Implementation) Dlasq2(n int, z []float64) (info int) {
         		emin = math.Min(emin, z[k+1])
         	}
         	if z[2*(n-1)] < 0 {
        -		panic("lapack: bad z value")
        +		panic(negZ)
         	}
         	d += z[2*(n-1)]
        -	qmax = math.Max(qmax, z[2*(n-1)])
         	// Check for diagonality.
         	if e == 0 {
         		for k := 1; k < n; k++ {
        @@ -330,7 +332,6 @@ outer:
         		// This might need to be done for several blocks.
         		info = 2
         		i1 = i0
        -		n1 = n0
         		for {
         			tempq = z[4*i0]
         			z[4*i0] += sigma
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlasq3.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlasq3.go
        index 7139ebb5f..a05e94ef1 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlasq3.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlasq3.go
        @@ -13,6 +13,17 @@ import "math"
         // Dlasq3 is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dlasq3(i0, n0 int, z []float64, pp int, dmin, sigma, desig, qmax float64, nFail, iter, nDiv int, ttype int, dmin1, dmin2, dn, dn1, dn2, g, tau float64) (
         	i0Out, n0Out, ppOut int, dminOut, sigmaOut, desigOut, qmaxOut float64, nFailOut, iterOut, nDivOut, ttypeOut int, dmin1Out, dmin2Out, dnOut, dn1Out, dn2Out, gOut, tauOut float64) {
        +	switch {
        +	case i0 < 0:
        +		panic(i0LT0)
        +	case n0 < 0:
        +		panic(n0LT0)
        +	case len(z) < 4*n0:
        +		panic(shortZ)
        +	case pp != 0 && pp != 1 && pp != 2:
        +		panic(badPp)
        +	}
        +
         	const cbias = 1.5
         
         	n0in := n0
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlasq4.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlasq4.go
        index 1d581a206..f6dbb31b9 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlasq4.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlasq4.go
        @@ -12,6 +12,17 @@ import "math"
         //
         // Dlasq4 is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dlasq4(i0, n0 int, z []float64, pp int, n0in int, dmin, dmin1, dmin2, dn, dn1, dn2, tau float64, ttype int, g float64) (tauOut float64, ttypeOut int, gOut float64) {
        +	switch {
        +	case i0 < 0:
        +		panic(i0LT0)
        +	case n0 < 0:
        +		panic(n0LT0)
        +	case len(z) < 4*n0:
        +		panic(shortZ)
        +	case pp != 0 && pp != 1:
        +		panic(badPp)
        +	}
        +
         	const (
         		cnst1 = 0.563
         		cnst2 = 1.01
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlasq5.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlasq5.go
        index e9e9fbeb1..d3826d918 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlasq5.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlasq5.go
        @@ -13,9 +13,22 @@ import "math"
         func (impl Implementation) Dlasq5(i0, n0 int, z []float64, pp int, tau, sigma float64) (i0Out, n0Out, ppOut int, tauOut, sigmaOut, dmin, dmin1, dmin2, dn, dnm1, dnm2 float64) {
         	// The lapack function has inputs for ieee and eps, but Go requires ieee so
         	// these are unnecessary.
        +
        +	switch {
        +	case i0 < 0:
        +		panic(i0LT0)
        +	case n0 < 0:
        +		panic(n0LT0)
        +	case len(z) < 4*n0:
        +		panic(shortZ)
        +	case pp != 0 && pp != 1:
        +		panic(badPp)
        +	}
        +
         	if n0-i0-1 <= 0 {
         		return i0, n0, pp, tau, sigma, dmin, dmin1, dmin2, dn, dnm1, dnm2
         	}
        +
         	eps := dlamchP
         	dthresh := eps * (sigma + tau)
         	if tau < dthresh*0.5 {
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlasq6.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlasq6.go
        index f12cbf6a3..54bf58756 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlasq6.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlasq6.go
        @@ -13,12 +13,21 @@ import "math"
         //
         // Dlasq6 is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dlasq6(i0, n0 int, z []float64, pp int) (dmin, dmin1, dmin2, dn, dnm1, dnm2 float64) {
        -	if len(z) < 4*(n0+1) {
        -		panic(badZ)
        +	switch {
        +	case i0 < 0:
        +		panic(i0LT0)
        +	case n0 < 0:
        +		panic(n0LT0)
        +	case len(z) < 4*n0:
        +		panic(shortZ)
        +	case pp != 0 && pp != 1:
        +		panic(badPp)
         	}
        +
         	if n0-i0-1 <= 0 {
         		return dmin, dmin1, dmin2, dn, dnm1, dnm2
         	}
        +
         	safmin := dlamchS
         	j4 := 4*(i0+1) + pp - 4 // -4 rather than -3 for zero indexing
         	emin := z[j4+4]
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlasr.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlasr.go
        index cc9e39104..6bacca5ef 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlasr.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlasr.go
        @@ -12,9 +12,9 @@ import (
         // Dlasr applies a sequence of plane rotations to the m×n matrix A. This series
         // of plane rotations is implicitly represented by a matrix P. P is multiplied
         // by a depending on the value of side -- A = P * A if side == lapack.Left,
        -// A = A * P^T if side == lapack.Right.
        +// A = A * Pᵀ if side == lapack.Right.
         //
        -//The exact value of P depends on the value of pivot, but in all cases P is
        +// The exact value of P depends on the value of pivot, but in all cases P is
         // implicitly represented by a series of 2×2 rotation matrices. The entries of
         // rotation matrix k are defined by s[k] and c[k]
         //  R(k) = [ c[k] s[k]]
        @@ -55,34 +55,45 @@ import (
         //
         // Dlasr is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dlasr(side blas.Side, pivot lapack.Pivot, direct lapack.Direct, m, n int, c, s, a []float64, lda int) {
        -	checkMatrix(m, n, a, lda)
        -	if side != blas.Left && side != blas.Right {
        +	switch {
        +	case side != blas.Left && side != blas.Right:
         		panic(badSide)
        -	}
        -	if pivot != lapack.Variable && pivot != lapack.Top && pivot != lapack.Bottom {
        +	case pivot != lapack.Variable && pivot != lapack.Top && pivot != lapack.Bottom:
         		panic(badPivot)
        -	}
        -	if direct != lapack.Forward && direct != lapack.Backward {
        +	case direct != lapack.Forward && direct != lapack.Backward:
         		panic(badDirect)
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	}
        +
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		return
         	}
        +
         	if side == blas.Left {
         		if len(c) < m-1 {
        -			panic(badSlice)
        +			panic(shortC)
         		}
         		if len(s) < m-1 {
        -			panic(badSlice)
        +			panic(shortS)
         		}
         	} else {
         		if len(c) < n-1 {
        -			panic(badSlice)
        +			panic(shortC)
         		}
         		if len(s) < n-1 {
        -			panic(badSlice)
        +			panic(shortS)
         		}
         	}
        -	if m == 0 || n == 0 {
        -		return
        +	if len(a) < (m-1)*lda+n {
        +		panic(shortA)
         	}
        +
         	if side == blas.Left {
         		if pivot == lapack.Variable {
         			if direct == lapack.Forward {
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlasrt.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlasrt.go
        index 86786cfef..be472805b 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlasrt.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlasrt.go
        @@ -17,7 +17,13 @@ import (
         //
         // Dlasrt is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dlasrt(s lapack.Sort, n int, d []float64) {
        -	checkVector(n, d, 1)
        +	switch {
        +	case n < 0:
        +		panic(nLT0)
        +	case len(d) < n:
        +		panic(shortD)
        +	}
        +
         	d = d[:n]
         	switch s {
         	default:
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlassq.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlassq.go
        index 5a7f87090..9c2dc7729 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlassq.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlassq.go
        @@ -13,9 +13,19 @@ import "math"
         //
         // Dlassq is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dlassq(n int, x []float64, incx int, scale float64, sumsq float64) (scl, smsq float64) {
        -	if n <= 0 {
        +	switch {
        +	case n < 0:
        +		panic(nLT0)
        +	case incx <= 0:
        +		panic(badIncX)
        +	case len(x) < 1+(n-1)*incx:
        +		panic(shortX)
        +	}
        +
        +	if n == 0 {
         		return scale, sumsq
         	}
        +
         	for ix := 0; ix <= (n-1)*incx; ix += incx {
         		absxi := math.Abs(x[ix])
         		if absxi > 0 || math.IsNaN(absxi) {
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlaswp.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlaswp.go
        index c5586e053..b207d1218 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlaswp.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlaswp.go
        @@ -25,8 +25,12 @@ func (impl Implementation) Dlaswp(n int, a []float64, lda int, k1, k2 int, ipiv
         		panic(badK2)
         	case k1 < 0 || k2 < k1:
         		panic(badK1)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	case len(a) < (k2-1)*lda+n:
        +		panic(shortA)
         	case len(ipiv) != k2+1:
        -		panic(badIpiv)
        +		panic(badLenIpiv)
         	case incX != 1 && incX != -1:
         		panic(absIncNotOne)
         	}
        @@ -34,6 +38,7 @@ func (impl Implementation) Dlaswp(n int, a []float64, lda int, k1, k2 int, ipiv
         	if n == 0 {
         		return
         	}
        +
         	bi := blas64.Implementation()
         	if incX == 1 {
         		for k := k1; k <= k2; k++ {
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlasy2.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlasy2.go
        index abfe60e58..d670f40de 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlasy2.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlasy2.go
        @@ -12,10 +12,10 @@ import (
         
         // Dlasy2 solves the Sylvester matrix equation where the matrices are of order 1
         // or 2. It computes the unknown n1×n2 matrix X so that
        -//  TL*X   + sgn*X*TR   = scale*B,  if tranl == false and tranr == false,
        -//  TL^T*X + sgn*X*TR   = scale*B,  if tranl == true  and tranr == false,
        -//  TL*X   + sgn*X*TR^T = scale*B,  if tranl == false and tranr == true,
        -//  TL^T*X + sgn*X*TR^T = scale*B,  if tranl == true  and tranr == true,
        +//  TL*X   + sgn*X*TR  = scale*B  if tranl == false and tranr == false,
        +//  TLᵀ*X + sgn*X*TR   = scale*B  if tranl == true  and tranr == false,
        +//  TL*X   + sgn*X*TRᵀ = scale*B  if tranl == false and tranr == true,
        +//  TLᵀ*X + sgn*X*TRᵀ  = scale*B  if tranl == true  and tranr == true,
         // where TL is n1×n1, TR is n2×n2, B is n1×n2, and 1 <= n1,n2 <= 2.
         //
         // isgn must be 1 or -1, and n1 and n2 must be 0, 1, or 2, but these conditions
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlatbs.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlatbs.go
        new file mode 100644
        index 000000000..0d3cf9f02
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlatbs.go
        @@ -0,0 +1,452 @@
        +// Copyright ©2019 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package gonum
        +
        +import (
        +	"math"
        +
        +	"gonum.org/v1/gonum/blas"
        +	"gonum.org/v1/gonum/blas/blas64"
        +)
        +
        +// Dlatbs solves a triangular banded system of equations
        +//  A * x = s*b    if trans == blas.NoTrans
        +//  Aᵀ * x = s*b  if trans == blas.Trans or blas.ConjTrans
        +// where A is an upper or lower triangular band matrix, x and b are n-element
        +// vectors, and s is a scaling factor chosen so that the components of x will be
        +// less than the overflow threshold.
        +//
        +// On entry, x contains the right-hand side b of the triangular system.
        +// On return, x is overwritten by the solution vector x.
        +//
        +// normin specifies whether the cnorm parameter contains the column norms of A on
        +// entry. If it is true, cnorm[j] contains the norm of the off-diagonal part of
        +// the j-th column of A. If it is false, the norms will be computed and stored
        +// in cnorm.
        +//
        +// Dlatbs returns the scaling factor s for the triangular system. If the matrix
        +// A is singular (A[j,j]==0 for some j), then scale is set to 0 and a
        +// non-trivial solution to A*x = 0 is returned.
        +//
        +// Dlatbs is an internal routine. It is exported for testing purposes.
        +func (Implementation) Dlatbs(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag, normin bool, n, kd int, ab []float64, ldab int, x, cnorm []float64) (scale float64) {
        +	noTran := trans == blas.NoTrans
        +	switch {
        +	case uplo != blas.Upper && uplo != blas.Lower:
        +		panic(badUplo)
        +	case !noTran && trans != blas.Trans && trans != blas.ConjTrans:
        +		panic(badTrans)
        +	case diag != blas.NonUnit && diag != blas.Unit:
        +		panic(badDiag)
        +	case n < 0:
        +		panic(nLT0)
        +	case kd < 0:
        +		panic(kdLT0)
        +	case ldab < kd+1:
        +		panic(badLdA)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return 0
        +	}
        +
        +	switch {
        +	case len(ab) < (n-1)*ldab+kd+1:
        +		panic(shortAB)
        +	case len(x) < n:
        +		panic(shortX)
        +	case len(cnorm) < n:
        +		panic(shortCNorm)
        +	}
        +
        +	// Parameters to control overflow.
        +	smlnum := dlamchS / dlamchP
        +	bignum := 1 / smlnum
        +
        +	bi := blas64.Implementation()
        +	kld := max(1, ldab-1)
        +	if !normin {
        +		// Compute the 1-norm of each column, not including the diagonal.
        +		if uplo == blas.Upper {
        +			for j := 0; j < n; j++ {
        +				jlen := min(j, kd)
        +				if jlen > 0 {
        +					cnorm[j] = bi.Dasum(jlen, ab[(j-jlen)*ldab+jlen:], kld)
        +				} else {
        +					cnorm[j] = 0
        +				}
        +			}
        +		} else {
        +			for j := 0; j < n; j++ {
        +				jlen := min(n-j-1, kd)
        +				if jlen > 0 {
        +					cnorm[j] = bi.Dasum(jlen, ab[(j+1)*ldab+kd-1:], kld)
        +				} else {
        +					cnorm[j] = 0
        +				}
        +			}
        +		}
        +	}
        +
        +	// Set up indices and increments for loops below.
        +	var (
        +		jFirst, jLast, jInc int
        +		maind               int
        +	)
        +	if noTran {
        +		if uplo == blas.Upper {
        +			jFirst = n - 1
        +			jLast = -1
        +			jInc = -1
        +			maind = 0
        +		} else {
        +			jFirst = 0
        +			jLast = n
        +			jInc = 1
        +			maind = kd
        +		}
        +	} else {
        +		if uplo == blas.Upper {
        +			jFirst = 0
        +			jLast = n
        +			jInc = 1
        +			maind = 0
        +		} else {
        +			jFirst = n - 1
        +			jLast = -1
        +			jInc = -1
        +			maind = kd
        +		}
        +	}
        +
        +	// Scale the column norms by tscal if the maximum element in cnorm is
        +	// greater than bignum.
        +	tmax := cnorm[bi.Idamax(n, cnorm, 1)]
        +	tscal := 1.0
        +	if tmax > bignum {
        +		tscal = 1 / (smlnum * tmax)
        +		bi.Dscal(n, tscal, cnorm, 1)
        +	}
        +
        +	// Compute a bound on the computed solution vector to see if the Level 2
        +	// BLAS routine Dtbsv can be used.
        +
        +	xMax := math.Abs(x[bi.Idamax(n, x, 1)])
        +	xBnd := xMax
        +	grow := 0.0
        +	// Compute the growth only if the maximum element in cnorm is NOT greater
        +	// than bignum.
        +	if tscal != 1 {
        +		goto skipComputeGrow
        +	}
        +	if noTran {
        +		// Compute the growth in A * x = b.
        +		if diag == blas.NonUnit {
        +			// A is non-unit triangular.
        +			//
        +			// Compute grow = 1/G_j and xBnd = 1/M_j.
        +			// Initially, G_0 = max{x(i), i=1,...,n}.
        +			grow = 1 / math.Max(xBnd, smlnum)
        +			xBnd = grow
        +			for j := jFirst; j != jLast; j += jInc {
        +				if grow <= smlnum {
        +					// Exit the loop because the growth factor is too small.
        +					goto skipComputeGrow
        +				}
        +				// M_j = G_{j-1} / abs(A[j,j])
        +				tjj := math.Abs(ab[j*ldab+maind])
        +				xBnd = math.Min(xBnd, math.Min(1, tjj)*grow)
        +				if tjj+cnorm[j] >= smlnum {
        +					// G_j = G_{j-1}*( 1 + cnorm[j] / abs(A[j,j]) )
        +					grow *= tjj / (tjj + cnorm[j])
        +				} else {
        +					// G_j could overflow, set grow to 0.
        +					grow = 0
        +				}
        +			}
        +			grow = xBnd
        +		} else {
        +			// A is unit triangular.
        +			//
        +			// Compute grow = 1/G_j, where G_0 = max{x(i), i=1,...,n}.
        +			grow = math.Min(1, 1/math.Max(xBnd, smlnum))
        +			for j := jFirst; j != jLast; j += jInc {
        +				if grow <= smlnum {
        +					// Exit the loop because the growth factor is too small.
        +					goto skipComputeGrow
        +				}
        +				// G_j = G_{j-1}*( 1 + cnorm[j] )
        +				grow /= 1 + cnorm[j]
        +			}
        +		}
        +	} else {
        +		// Compute the growth in Aᵀ * x = b.
        +		if diag == blas.NonUnit {
        +			// A is non-unit triangular.
        +			//
        +			// Compute grow = 1/G_j and xBnd = 1/M_j.
        +			// Initially, G_0 = max{x(i), i=1,...,n}.
        +			grow = 1 / math.Max(xBnd, smlnum)
        +			xBnd = grow
        +			for j := jFirst; j != jLast; j += jInc {
        +				if grow <= smlnum {
        +					// Exit the loop because the growth factor is too small.
        +					goto skipComputeGrow
        +				}
        +				// G_j = max( G_{j-1}, M_{j-1}*( 1 + cnorm[j] ) )
        +				xj := 1 + cnorm[j]
        +				grow = math.Min(grow, xBnd/xj)
        +				// M_j = M_{j-1}*( 1 + cnorm[j] ) / abs(A[j,j])
        +				tjj := math.Abs(ab[j*ldab+maind])
        +				if xj > tjj {
        +					xBnd *= tjj / xj
        +				}
        +			}
        +			grow = math.Min(grow, xBnd)
        +		} else {
        +			// A is unit triangular.
        +			//
        +			// Compute grow = 1/G_j, where G_0 = max{x(i), i=1,...,n}.
        +			grow = math.Min(1, 1/math.Max(xBnd, smlnum))
        +			for j := jFirst; j != jLast; j += jInc {
        +				if grow <= smlnum {
        +					// Exit the loop because the growth factor is too small.
        +					goto skipComputeGrow
        +				}
        +				// G_j = G_{j-1}*( 1 + cnorm[j] )
        +				grow /= 1 + cnorm[j]
        +			}
        +		}
        +	}
        +skipComputeGrow:
        +
        +	if grow*tscal > smlnum {
        +		// The reciprocal of the bound on elements of X is not too small, use
        +		// the Level 2 BLAS solve.
        +		bi.Dtbsv(uplo, trans, diag, n, kd, ab, ldab, x, 1)
        +		// Scale the column norms by 1/tscal for return.
        +		if tscal != 1 {
        +			bi.Dscal(n, 1/tscal, cnorm, 1)
        +		}
        +		return 1
        +	}
        +
        +	// Use a Level 1 BLAS solve, scaling intermediate results.
        +
        +	scale = 1
        +	if xMax > bignum {
        +		// Scale x so that its components are less than or equal to bignum in
        +		// absolute value.
        +		scale = bignum / xMax
        +		bi.Dscal(n, scale, x, 1)
        +		xMax = bignum
        +	}
        +
        +	if noTran {
        +		// Solve A * x = b.
        +		for j := jFirst; j != jLast; j += jInc {
        +			// Compute x[j] = b[j] / A[j,j], scaling x if necessary.
        +			xj := math.Abs(x[j])
        +			tjjs := tscal
        +			if diag == blas.NonUnit {
        +				tjjs *= ab[j*ldab+maind]
        +			}
        +			tjj := math.Abs(tjjs)
        +			switch {
        +			case tjj > smlnum:
        +				// smlnum < abs(A[j,j])
        +				if tjj < 1 && xj > tjj*bignum {
        +					// Scale x by 1/b[j].
        +					rec := 1 / xj
        +					bi.Dscal(n, rec, x, 1)
        +					scale *= rec
        +					xMax *= rec
        +				}
        +				x[j] /= tjjs
        +				xj = math.Abs(x[j])
        +			case tjj > 0:
        +				// 0 < abs(A[j,j]) <= smlnum
        +				if xj > tjj*bignum {
        +					// Scale x by (1/abs(x[j]))*abs(A[j,j])*bignum to avoid
        +					// overflow when dividing by A[j,j].
        +					rec := tjj * bignum / xj
        +					if cnorm[j] > 1 {
        +						// Scale by 1/cnorm[j] to avoid overflow when
        +						// multiplying x[j] times column j.
        +						rec /= cnorm[j]
        +					}
        +					bi.Dscal(n, rec, x, 1)
        +					scale *= rec
        +					xMax *= rec
        +				}
        +				x[j] /= tjjs
        +				xj = math.Abs(x[j])
        +			default:
        +				// A[j,j] == 0: Set x[0:n] = 0, x[j] = 1, and scale = 0, and
        +				// compute a solution to A*x = 0.
        +				for i := range x[:n] {
        +					x[i] = 0
        +				}
        +				x[j] = 1
        +				xj = 1
        +				scale = 0
        +				xMax = 0
        +			}
        +
        +			// Scale x if necessary to avoid overflow when adding a multiple of
        +			// column j of A.
        +			switch {
        +			case xj > 1:
        +				rec := 1 / xj
        +				if cnorm[j] > (bignum-xMax)*rec {
        +					// Scale x by 1/(2*abs(x[j])).
        +					rec *= 0.5
        +					bi.Dscal(n, rec, x, 1)
        +					scale *= rec
        +				}
        +			case xj*cnorm[j] > bignum-xMax:
        +				// Scale x by 1/2.
        +				bi.Dscal(n, 0.5, x, 1)
        +				scale *= 0.5
        +			}
        +
        +			if uplo == blas.Upper {
        +				if j > 0 {
        +					// Compute the update
        +					//  x[max(0,j-kd):j] := x[max(0,j-kd):j] - x[j] * A[max(0,j-kd):j,j]
        +					jlen := min(j, kd)
        +					if jlen > 0 {
        +						bi.Daxpy(jlen, -x[j]*tscal, ab[(j-jlen)*ldab+jlen:], kld, x[j-jlen:], 1)
        +					}
        +					i := bi.Idamax(j, x, 1)
        +					xMax = math.Abs(x[i])
        +				}
        +			} else if j < n-1 {
        +				// Compute the update
        +				//  x[j+1:min(j+kd,n)] := x[j+1:min(j+kd,n)] - x[j] * A[j+1:min(j+kd,n),j]
        +				jlen := min(kd, n-j-1)
        +				if jlen > 0 {
        +					bi.Daxpy(jlen, -x[j]*tscal, ab[(j+1)*ldab+kd-1:], kld, x[j+1:], 1)
        +				}
        +				i := j + 1 + bi.Idamax(n-j-1, x[j+1:], 1)
        +				xMax = math.Abs(x[i])
        +			}
        +		}
        +	} else {
        +		// Solve Aᵀ * x = b.
        +		for j := jFirst; j != jLast; j += jInc {
        +			// Compute x[j] = b[j] - sum A[k,j]*x[k].
        +			//                       k!=j
        +			xj := math.Abs(x[j])
        +			tjjs := tscal
        +			if diag == blas.NonUnit {
        +				tjjs *= ab[j*ldab+maind]
        +			}
        +			tjj := math.Abs(tjjs)
        +			rec := 1 / math.Max(1, xMax)
        +			uscal := tscal
        +			if cnorm[j] > (bignum-xj)*rec {
        +				// If x[j] could overflow, scale x by 1/(2*xMax).
        +				rec *= 0.5
        +				if tjj > 1 {
        +					// Divide by A[j,j] when scaling x if A[j,j] > 1.
        +					rec = math.Min(1, rec*tjj)
        +					uscal /= tjjs
        +				}
        +				if rec < 1 {
        +					bi.Dscal(n, rec, x, 1)
        +					scale *= rec
        +					xMax *= rec
        +				}
        +			}
        +
        +			var sumj float64
        +			if uscal == 1 {
        +				// If the scaling needed for A in the dot product is 1, call
        +				// Ddot to perform the dot product...
        +				if uplo == blas.Upper {
        +					jlen := min(j, kd)
        +					if jlen > 0 {
        +						sumj = bi.Ddot(jlen, ab[(j-jlen)*ldab+jlen:], kld, x[j-jlen:], 1)
        +					}
        +				} else {
        +					jlen := min(n-j-1, kd)
        +					if jlen > 0 {
        +						sumj = bi.Ddot(jlen, ab[(j+1)*ldab+kd-1:], kld, x[j+1:], 1)
        +					}
        +				}
        +			} else {
        +				// ...otherwise, use in-line code for the dot product.
        +				if uplo == blas.Upper {
        +					jlen := min(j, kd)
        +					for i := 0; i < jlen; i++ {
        +						sumj += (ab[(j-jlen+i)*ldab+jlen-i] * uscal) * x[j-jlen+i]
        +					}
        +				} else {
        +					jlen := min(n-j-1, kd)
        +					for i := 0; i < jlen; i++ {
        +						sumj += (ab[(j+1+i)*ldab+kd-1-i] * uscal) * x[j+i+1]
        +					}
        +				}
        +			}
        +
        +			if uscal == tscal {
        +				// Compute x[j] := ( x[j] - sumj ) / A[j,j]
        +				// if 1/A[j,j] was not used to scale the dot product.
        +				x[j] -= sumj
        +				xj = math.Abs(x[j])
        +				// Compute x[j] = x[j] / A[j,j], scaling if necessary.
        +				// Note: the reference implementation skips this step for blas.Unit matrices
        +				// when tscal is equal to 1 but it complicates the logic and only saves
        +				// the comparison and division in the first switch-case. Not skipping it
        +				// is also consistent with the NoTrans case above.
        +				switch {
        +				case tjj > smlnum:
        +					// smlnum < abs(A[j,j]):
        +					if tjj < 1 && xj > tjj*bignum {
        +						// Scale x by 1/abs(x[j]).
        +						rec := 1 / xj
        +						bi.Dscal(n, rec, x, 1)
        +						scale *= rec
        +						xMax *= rec
        +					}
        +					x[j] /= tjjs
        +				case tjj > 0:
        +					// 0 < abs(A[j,j]) <= smlnum:
        +					if xj > tjj*bignum {
        +						// Scale x by (1/abs(x[j]))*abs(A[j,j])*bignum.
        +						rec := (tjj * bignum) / xj
        +						bi.Dscal(n, rec, x, 1)
        +						scale *= rec
        +						xMax *= rec
        +					}
        +					x[j] /= tjjs
        +				default:
        +					// A[j,j] == 0: Set x[0:n] = 0, x[j] = 1, and scale = 0, and
        +					// compute a solution Aᵀ * x = 0.
        +					for i := range x[:n] {
        +						x[i] = 0
        +					}
        +					x[j] = 1
        +					scale = 0
        +					xMax = 0
        +				}
        +			} else {
        +				// Compute x[j] := x[j] / A[j,j] - sumj
        +				// if the dot product has already been divided by 1/A[j,j].
        +				x[j] = x[j]/tjjs - sumj
        +			}
        +			xMax = math.Max(xMax, math.Abs(x[j]))
        +		}
        +		scale /= tscal
        +	}
        +
        +	// Scale the column norms by 1/tscal for return.
        +	if tscal != 1 {
        +		bi.Dscal(n, 1/tscal, cnorm, 1)
        +	}
        +	return scale
        +}
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlatrd.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlatrd.go
        index 04eba4a0e..1e057aa38 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlatrd.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlatrd.go
        @@ -11,7 +11,7 @@ import (
         
         // Dlatrd reduces nb rows and columns of a real n×n symmetric matrix A to symmetric
         // tridiagonal form. It computes the orthonormal similarity transformation
        -//  Q^T * A * Q
        +//  Qᵀ * A * Q
         // and returns the matrices V and W to apply to the unreduced part of A. If
         // uplo == blas.Upper, the upper triangle is supplied and the last nb rows are
         // reduced. If uplo == blas.Lower, the lower triangle is supplied and the first
        @@ -51,7 +51,7 @@ import (
         //
         // The matrix Q is represented as a product of elementary reflectors. Each reflector
         // H has the form
        -//  I - tau * v * v^T
        +//  I - tau * v * vᵀ
         // If uplo == blas.Upper,
         //  Q = H_{n-1} * H_{n-2} * ... * H_{n-nb}
         // where v[:i-1] is stored in A[:i-1,i], v[i-1] = 1, and v[i:n] = 0.
        @@ -62,22 +62,42 @@ import (
         //
         // The vectors v form the n×nb matrix V which is used with W to apply a
         // symmetric rank-2 update to the unreduced part of A
        -//  A = A - V * W^T - W * V^T
        +//  A = A - V * Wᵀ - W * Vᵀ
         //
         // Dlatrd is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dlatrd(uplo blas.Uplo, n, nb int, a []float64, lda int, e, tau, w []float64, ldw int) {
        -	checkMatrix(n, n, a, lda)
        -	checkMatrix(n, nb, w, ldw)
        -	if len(e) < n-1 {
        -		panic(badE)
        +	switch {
        +	case uplo != blas.Upper && uplo != blas.Lower:
        +		panic(badUplo)
        +	case n < 0:
        +		panic(nLT0)
        +	case nb < 0:
        +		panic(nbLT0)
        +	case nb > n:
        +		panic(nbGTN)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	case ldw < max(1, nb):
        +		panic(badLdW)
         	}
        -	if len(tau) < n-1 {
        -		panic(badTau)
        -	}
        -	if n <= 0 {
        +
        +	if n == 0 {
         		return
         	}
        +
        +	switch {
        +	case len(a) < (n-1)*lda+n:
        +		panic(shortA)
        +	case len(w) < (n-1)*ldw+nb:
        +		panic(shortW)
        +	case len(e) < n-1:
        +		panic(shortE)
        +	case len(tau) < n-1:
        +		panic(shortTau)
        +	}
        +
         	bi := blas64.Implementation()
        +
         	if uplo == blas.Upper {
         		for i := n - 1; i >= n-nb; i-- {
         			iw := i - n + nb
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlatrs.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlatrs.go
        index f0c94764e..73970bcf6 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dlatrs.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlatrs.go
        @@ -14,11 +14,11 @@ import (
         // Dlatrs solves a triangular system of equations scaled to prevent overflow. It
         // solves
         //  A * x = scale * b if trans == blas.NoTrans
        -//  A^T * x = scale * b if trans == blas.Trans
        +//  Aᵀ * x = scale * b if trans == blas.Trans
         // where the scale s is set for numeric stability.
         //
         // A is an n×n triangular matrix. On entry, the slice x contains the values of
        -// of b, and on exit it contains the solution vector x.
        +// b, and on exit it contains the solution vector x.
         //
         // If normin == true, cnorm is an input and cnorm[j] contains the norm of the off-diagonal
         // part of the j^th column of A. If trans == blas.NoTrans, cnorm[j] must be greater
        @@ -28,33 +28,42 @@ import (
         //
         // Dlatrs is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dlatrs(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag, normin bool, n int, a []float64, lda int, x []float64, cnorm []float64) (scale float64) {
        -	if uplo != blas.Upper && uplo != blas.Lower {
        +	switch {
        +	case uplo != blas.Upper && uplo != blas.Lower:
         		panic(badUplo)
        -	}
        -	if trans != blas.Trans && trans != blas.NoTrans {
        +	case trans != blas.NoTrans && trans != blas.Trans && trans != blas.ConjTrans:
         		panic(badTrans)
        -	}
        -	if diag != blas.Unit && diag != blas.NonUnit {
        +	case diag != blas.Unit && diag != blas.NonUnit:
         		panic(badDiag)
        -	}
        -	upper := uplo == blas.Upper
        -	noTrans := trans == blas.NoTrans
        -	nonUnit := diag == blas.NonUnit
        -
        -	if n < 0 {
        +	case n < 0:
         		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
         	}
        -	checkMatrix(n, n, a, lda)
        -	checkVector(n, x, 1)
        -	checkVector(n, cnorm, 1)
         
        +	// Quick return if possible.
         	if n == 0 {
         		return 0
         	}
        +
        +	switch {
        +	case len(a) < (n-1)*lda+n:
        +		panic(shortA)
        +	case len(x) < n:
        +		panic(shortX)
        +	case len(cnorm) < n:
        +		panic(shortCNorm)
        +	}
        +
        +	upper := uplo == blas.Upper
        +	nonUnit := diag == blas.NonUnit
        +
         	smlnum := dlamchS / dlamchP
         	bignum := 1 / smlnum
         	scale = 1
        +
         	bi := blas64.Implementation()
        +
         	if !normin {
         		if upper {
         			cnorm[0] = 0
        @@ -85,7 +94,7 @@ func (impl Implementation) Dlatrs(uplo blas.Uplo, trans blas.Transpose, diag bla
         	xbnd := xmax
         	var grow float64
         	var jfirst, jlast, jinc int
        -	if noTrans {
        +	if trans == blas.NoTrans {
         		if upper {
         			jfirst = n - 1
         			jlast = -1
        @@ -183,7 +192,7 @@ Solve:
         		bi.Dscal(n, scale, x, 1)
         		xmax = bignum
         	}
        -	if noTrans {
        +	if trans == blas.NoTrans {
         		for j := jfirst; j != jlast; j += jinc {
         			xj := math.Abs(x[j])
         			var tjj, tjjs float64
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlauu2.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlauu2.go
        new file mode 100644
        index 000000000..24e98ddd5
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlauu2.go
        @@ -0,0 +1,64 @@
        +// Copyright ©2018 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package gonum
        +
        +import (
        +	"gonum.org/v1/gonum/blas"
        +	"gonum.org/v1/gonum/blas/blas64"
        +)
        +
        +// Dlauu2 computes the product
        +//  U * Uᵀ  if uplo is blas.Upper
        +//  Lᵀ * L  if uplo is blas.Lower
        +// where U or L is stored in the upper or lower triangular part of A.
        +// Only the upper or lower triangle of the result is stored, overwriting
        +// the corresponding factor in A.
        +func (impl Implementation) Dlauu2(uplo blas.Uplo, n int, a []float64, lda int) {
        +	switch {
        +	case uplo != blas.Upper && uplo != blas.Lower:
        +		panic(badUplo)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	if len(a) < (n-1)*lda+n {
        +		panic(shortA)
        +	}
        +
        +	bi := blas64.Implementation()
        +
        +	if uplo == blas.Upper {
        +		// Compute the product U*Uᵀ.
        +		for i := 0; i < n; i++ {
        +			aii := a[i*lda+i]
        +			if i < n-1 {
        +				a[i*lda+i] = bi.Ddot(n-i, a[i*lda+i:], 1, a[i*lda+i:], 1)
        +				bi.Dgemv(blas.NoTrans, i, n-i-1, 1, a[i+1:], lda, a[i*lda+i+1:], 1,
        +					aii, a[i:], lda)
        +			} else {
        +				bi.Dscal(i+1, aii, a[i:], lda)
        +			}
        +		}
        +	} else {
        +		// Compute the product Lᵀ*L.
        +		for i := 0; i < n; i++ {
        +			aii := a[i*lda+i]
        +			if i < n-1 {
        +				a[i*lda+i] = bi.Ddot(n-i, a[i*lda+i:], lda, a[i*lda+i:], lda)
        +				bi.Dgemv(blas.Trans, n-i-1, i, 1, a[(i+1)*lda:], lda, a[(i+1)*lda+i:], lda,
        +					aii, a[i*lda:], 1)
        +			} else {
        +				bi.Dscal(i+1, aii, a[i*lda:], 1)
        +			}
        +		}
        +	}
        +}
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dlauum.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dlauum.go
        new file mode 100644
        index 000000000..995fdc059
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dlauum.go
        @@ -0,0 +1,81 @@
        +// Copyright ©2018 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package gonum
        +
        +import (
        +	"gonum.org/v1/gonum/blas"
        +	"gonum.org/v1/gonum/blas/blas64"
        +)
        +
        +// Dlauum computes the product
        +//  U * Uᵀ  if uplo is blas.Upper
        +//  Lᵀ * L  if uplo is blas.Lower
        +// where U or L is stored in the upper or lower triangular part of A.
        +// Only the upper or lower triangle of the result is stored, overwriting
        +// the corresponding factor in A.
        +func (impl Implementation) Dlauum(uplo blas.Uplo, n int, a []float64, lda int) {
        +	switch {
        +	case uplo != blas.Upper && uplo != blas.Lower:
        +		panic(badUplo)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	if len(a) < (n-1)*lda+n {
        +		panic(shortA)
        +	}
        +
        +	// Determine the block size.
        +	opts := "U"
        +	if uplo == blas.Lower {
        +		opts = "L"
        +	}
        +	nb := impl.Ilaenv(1, "DLAUUM", opts, n, -1, -1, -1)
        +
        +	if nb <= 1 || n <= nb {
        +		// Use unblocked code.
        +		impl.Dlauu2(uplo, n, a, lda)
        +		return
        +	}
        +
        +	// Use blocked code.
        +	bi := blas64.Implementation()
        +	if uplo == blas.Upper {
        +		// Compute the product U*Uᵀ.
        +		for i := 0; i < n; i += nb {
        +			ib := min(nb, n-i)
        +			bi.Dtrmm(blas.Right, blas.Upper, blas.Trans, blas.NonUnit,
        +				i, ib, 1, a[i*lda+i:], lda, a[i:], lda)
        +			impl.Dlauu2(blas.Upper, ib, a[i*lda+i:], lda)
        +			if n-i-ib > 0 {
        +				bi.Dgemm(blas.NoTrans, blas.Trans, i, ib, n-i-ib,
        +					1, a[i+ib:], lda, a[i*lda+i+ib:], lda, 1, a[i:], lda)
        +				bi.Dsyrk(blas.Upper, blas.NoTrans, ib, n-i-ib,
        +					1, a[i*lda+i+ib:], lda, 1, a[i*lda+i:], lda)
        +			}
        +		}
        +	} else {
        +		// Compute the product Lᵀ*L.
        +		for i := 0; i < n; i += nb {
        +			ib := min(nb, n-i)
        +			bi.Dtrmm(blas.Left, blas.Lower, blas.Trans, blas.NonUnit,
        +				ib, i, 1, a[i*lda+i:], lda, a[i*lda:], lda)
        +			impl.Dlauu2(blas.Lower, ib, a[i*lda+i:], lda)
        +			if n-i-ib > 0 {
        +				bi.Dgemm(blas.Trans, blas.NoTrans, ib, i, n-i-ib,
        +					1, a[(i+ib)*lda+i:], lda, a[(i+ib)*lda:], lda, 1, a[i*lda:], lda)
        +				bi.Dsyrk(blas.Lower, blas.Trans, ib, n-i-ib,
        +					1, a[(i+ib)*lda+i:], lda, 1, a[i*lda+i:], lda)
        +			}
        +		}
        +	}
        +}
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/doc.go b/vendor/gonum.org/v1/gonum/lapack/gonum/doc.go
        index 07156bf14..1857c5018 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/doc.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/doc.go
        @@ -16,13 +16,13 @@
         // Most LAPACK functions are built on top the routines defined in the BLAS API,
         // and as such the computation time for many LAPACK functions is
         // dominated by BLAS calls. Here, BLAS is accessed through the
        -// the blas64 package (https://godoc.org/golang.org/v1/gonum/blas/blas64). In particular,
        +// blas64 package (https://godoc.org/golang.org/v1/gonum/blas/blas64). In particular,
         // this implies that an external BLAS library will be used if it is
         // registered in blas64.
         //
         // The full LAPACK capability has not been implemented at present. The full
         // API is very large, containing approximately 200 functions for double precision
        -// alone. Future additions will be focused on supporting the gonum matrix
        +// alone. Future additions will be focused on supporting the Gonum matrix
         // package (https://godoc.org/github.com/gonum/matrix/mat64), though pull requests
         // with implementations and tests for LAPACK function are encouraged.
         package gonum // import "gonum.org/v1/gonum/lapack/gonum"
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dorg2l.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dorg2l.go
        index 320719862..a20765a9e 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dorg2l.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dorg2l.go
        @@ -22,23 +22,34 @@ import (
         //
         // Dorg2l is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dorg2l(m, n, k int, a []float64, lda int, tau, work []float64) {
        -	checkMatrix(m, n, a, lda)
        -	if len(tau) < k {
        -		panic(badTau)
        -	}
        -	if len(work) < n {
        -		panic(badWork)
        -	}
        -	if m < n {
        -		panic(mLTN)
        -	}
        -	if k > n {
        +	switch {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case n > m:
        +		panic(nGTM)
        +	case k < 0:
        +		panic(kLT0)
        +	case k > n:
         		panic(kGTN)
        +	case lda < max(1, n):
        +		panic(badLdA)
         	}
        +
         	if n == 0 {
         		return
         	}
         
        +	switch {
        +	case len(a) < (m-1)*lda+n:
        +		panic(shortA)
        +	case len(tau) < k:
        +		panic(shortTau)
        +	case len(work) < n:
        +		panic(shortWork)
        +	}
        +
         	// Initialize columns 0:n-k to columns of the unit matrix.
         	for j := 0; j < n-k; j++ {
         		for l := 0; l < m; l++ {
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dorg2r.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dorg2r.go
        index d75250171..de4477571 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dorg2r.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dorg2r.go
        @@ -17,26 +17,36 @@ import (
         //
         // Dorg2r is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dorg2r(m, n, k int, a []float64, lda int, tau []float64, work []float64) {
        -	checkMatrix(m, n, a, lda)
        -	if len(tau) < k {
        -		panic(badTau)
        -	}
        -	if len(work) < n {
        -		panic(badWork)
        -	}
        -	if k > n {
        +	switch {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case n > m:
        +		panic(nGTM)
        +	case k < 0:
        +		panic(kLT0)
        +	case k > n:
         		panic(kGTN)
        +	case lda < max(1, n):
        +		panic(badLdA)
         	}
        -	if n > m {
        -		panic(mLTN)
        -	}
        -	if len(work) < n {
        -		panic(badWork)
        -	}
        +
         	if n == 0 {
         		return
         	}
        +
        +	switch {
        +	case len(a) < (m-1)*lda+n:
        +		panic(shortA)
        +	case len(tau) < k:
        +		panic(shortTau)
        +	case len(work) < n:
        +		panic(shortWork)
        +	}
        +
         	bi := blas64.Implementation()
        +
         	// Initialize columns k+1:n to columns of the unit matrix.
         	for l := 0; l < m; l++ {
         		for j := k; j < n; j++ {
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dorgbr.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dorgbr.go
        index f14062813..8a4fe2b5f 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dorgbr.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dorgbr.go
        @@ -6,52 +6,59 @@ package gonum
         
         import "gonum.org/v1/gonum/lapack"
         
        -// Dorgbr generates one of the matrices Q or P^T computed by Dgebrd
        +// Dorgbr generates one of the matrices Q or Pᵀ computed by Dgebrd
         // computed from the decomposition Dgebrd. See Dgebd2 for the description of
        -// Q and P^T.
        +// Q and Pᵀ.
         //
         // If vect == lapack.GenerateQ, then a is assumed to have been an m×k matrix and
         // Q is of order m. If m >= k, then Dorgbr returns the first n columns of Q
         // where m >= n >= k. If m < k, then Dorgbr returns Q as an m×m matrix.
         //
         // If vect == lapack.GeneratePT, then A is assumed to have been a k×n matrix, and
        -// P^T is of order n. If k < n, then Dorgbr returns the first m rows of P^T,
        -// where n >= m >= k. If k >= n, then Dorgbr returns P^T as an n×n matrix.
        +// Pᵀ is of order n. If k < n, then Dorgbr returns the first m rows of Pᵀ,
        +// where n >= m >= k. If k >= n, then Dorgbr returns Pᵀ as an n×n matrix.
         //
         // Dorgbr is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dorgbr(vect lapack.GenOrtho, m, n, k int, a []float64, lda int, tau, work []float64, lwork int) {
        +	wantq := vect == lapack.GenerateQ
         	mn := min(m, n)
        -	var wantq bool
        -	switch vect {
        -	case lapack.GenerateQ:
        -		wantq = true
        -	case lapack.GeneratePT:
        -	default:
        +	switch {
        +	case vect != lapack.GenerateQ && vect != lapack.GeneratePT:
         		panic(badGenOrtho)
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case k < 0:
        +		panic(kLT0)
        +	case wantq && n > m:
        +		panic(nGTM)
        +	case wantq && n < min(m, k):
        +		panic("lapack: n < min(m,k)")
        +	case !wantq && m > n:
        +		panic(mGTN)
        +	case !wantq && m < min(n, k):
        +		panic("lapack: m < min(n,k)")
        +	case lda < max(1, n) && lwork != -1:
        +		// Normally, we follow the reference and require the leading
        +		// dimension to be always valid, even in case of workspace
        +		// queries. However, if a caller provided a placeholder value
        +		// for lda (and a) when doing a workspace query that didn't
        +		// fulfill the condition here, it would cause a panic. This is
        +		// exactly what Dgesvd does.
        +		panic(badLdA)
        +	case lwork < max(1, mn) && lwork != -1:
        +		panic(badLWork)
        +	case len(work) < max(1, lwork):
        +		panic(shortWork)
         	}
        -	if wantq {
        -		if m < n || n < min(m, k) || m < min(m, k) {
        -			panic(badDims)
        -		}
        -	} else {
        -		if n < m || m < min(n, k) || n < min(n, k) {
        -			panic(badDims)
        -		}
        -	}
        -	if wantq {
        -		if m >= k {
        -			checkMatrix(m, k, a, lda)
        -		} else {
        -			checkMatrix(m, m, a, lda)
        -		}
        -	} else {
        -		if n >= k {
        -			checkMatrix(k, n, a, lda)
        -		} else {
        -			checkMatrix(n, n, a, lda)
        -		}
        -	}
        +
        +	// Quick return if possible.
         	work[0] = 1
        +	if m == 0 || n == 0 {
        +		return
        +	}
        +
         	if wantq {
         		if m >= k {
         			impl.Dorgqr(m, n, k, a, lda, tau, work, -1)
        @@ -71,16 +78,16 @@ func (impl Implementation) Dorgbr(vect lapack.GenOrtho, m, n, k int, a []float64
         		work[0] = float64(lworkopt)
         		return
         	}
        -	if len(work) < lwork {
        -		panic(badWork)
        -	}
        -	if lwork < mn {
        -		panic(badWork)
        -	}
        -	if m == 0 || n == 0 {
        -		work[0] = 1
        -		return
        +
        +	switch {
        +	case len(a) < (m-1)*lda+n:
        +		panic(shortA)
        +	case wantq && len(tau) < min(m, k):
        +		panic(shortTau)
        +	case !wantq && len(tau) < min(n, k):
        +		panic(shortTau)
         	}
        +
         	if wantq {
         		// Form Q, determined by a call to Dgebrd to reduce an m×k matrix.
         		if m >= k {
        @@ -105,12 +112,12 @@ func (impl Implementation) Dorgbr(vect lapack.GenOrtho, m, n, k int, a []float64
         			}
         		}
         	} else {
        -		// Form P^T, determined by a call to Dgebrd to reduce a k×n matrix.
        +		// Form Pᵀ, determined by a call to Dgebrd to reduce a k×n matrix.
         		if k < n {
         			impl.Dorglq(m, n, k, a, lda, tau, work, lwork)
         		} else {
         			// Shift the vectors which define the elementary reflectors one
        -			// row downward, and set the first row and column of P^T to
        +			// row downward, and set the first row and column of Pᵀ to
         			// those of the unit matrix.
         			a[0] = 1
         			for i := 1; i < n; i++ {
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dorghr.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dorghr.go
        index b7ea7b2cf..fd65531ba 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dorghr.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dorghr.go
        @@ -15,8 +15,8 @@ package gonum
         //
         // ilo and ihi must have the same values as in the previous call of Dgehrd. It
         // must hold that
        -//  0 <= ilo <= ihi < n,  if n > 0,
        -//  ilo = 0, ihi = -1,    if n == 0.
        +//  0 <= ilo <= ihi < n  if n > 0,
        +//  ilo = 0, ihi = -1    if n == 0.
         //
         // tau contains the scalar factors of the elementary reflectors, as returned by
         // Dgehrd. tau must have length n-1.
        @@ -33,29 +33,37 @@ package gonum
         //
         // Dorghr is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dorghr(n, ilo, ihi int, a []float64, lda int, tau, work []float64, lwork int) {
        -	checkMatrix(n, n, a, lda)
         	nh := ihi - ilo
         	switch {
         	case ilo < 0 || max(1, n) <= ilo:
         		panic(badIlo)
         	case ihi < min(ilo, n-1) || n <= ihi:
         		panic(badIhi)
        +	case lda < max(1, n):
        +		panic(badLdA)
         	case lwork < max(1, nh) && lwork != -1:
        -		panic(badWork)
        +		panic(badLWork)
         	case len(work) < max(1, lwork):
         		panic(shortWork)
         	}
         
        +	// Quick return if possible.
        +	if n == 0 {
        +		work[0] = 1
        +		return
        +	}
        +
         	lwkopt := max(1, nh) * impl.Ilaenv(1, "DORGQR", " ", nh, nh, nh, -1)
         	if lwork == -1 {
         		work[0] = float64(lwkopt)
         		return
         	}
         
        -	// Quick return if possible.
        -	if n == 0 {
        -		work[0] = 1
        -		return
        +	switch {
        +	case len(a) < (n-1)*lda+n:
        +		panic(shortA)
        +	case len(tau) < n-1:
        +		panic(shortTau)
         	}
         
         	// Shift the vectors which define the elementary reflectors one column
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dorgl2.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dorgl2.go
        index 06303812f..b5566b9de 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dorgl2.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dorgl2.go
        @@ -17,26 +17,34 @@ import (
         //
         // Dorgl2 is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dorgl2(m, n, k int, a []float64, lda int, tau, work []float64) {
        -	checkMatrix(m, n, a, lda)
        -	if len(tau) < k {
        -		panic(badTau)
        -	}
        -	if k > m {
        -		panic(kGTM)
        -	}
        -	if k > m {
        -		panic(kGTM)
        -	}
        -	if m > n {
        +	switch {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < m:
         		panic(nLTM)
        +	case k < 0:
        +		panic(kLT0)
        +	case k > m:
        +		panic(kGTM)
        +	case lda < max(1, m):
        +		panic(badLdA)
         	}
        -	if len(work) < m {
        -		panic(badWork)
        -	}
        +
         	if m == 0 {
         		return
         	}
        +
        +	switch {
        +	case len(a) < (m-1)*lda+n:
        +		panic(shortA)
        +	case len(tau) < k:
        +		panic(shortTau)
        +	case len(work) < m:
        +		panic(shortWork)
        +	}
        +
         	bi := blas64.Implementation()
        +
         	if k < m {
         		for i := k; i < m; i++ {
         			for j := 0; j < n; j++ {
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dorglq.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dorglq.go
        index 4f45a6a39..a6dd980ce 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dorglq.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dorglq.go
        @@ -15,7 +15,7 @@ import (
         // Dorglq is the blocked version of Dorgl2 that makes greater use of level-3 BLAS
         // routines.
         //
        -// len(tau) >= k, 0 <= k <= n, and 0 <= n <= m.
        +// len(tau) >= k, 0 <= k <= m, and 0 <= m <= n.
         //
         // work is temporary storage, and lwork specifies the usable memory length. At minimum,
         // lwork >= m, and the amount of blocking is limited by the usable length.
        @@ -26,39 +26,46 @@ import (
         //
         // Dorglq is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dorglq(m, n, k int, a []float64, lda int, tau, work []float64, lwork int) {
        -	nb := impl.Ilaenv(1, "DORGLQ", " ", m, n, k, -1)
        -	// work is treated as an n×nb matrix
        -	if lwork == -1 {
        -		work[0] = float64(max(1, m) * nb)
        -		return
        -	}
        -	checkMatrix(m, n, a, lda)
        -	if k < 0 {
        +	switch {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < m:
        +		panic(nLTM)
        +	case k < 0:
         		panic(kLT0)
        -	}
        -	if k > m {
        +	case k > m:
         		panic(kGTM)
        -	}
        -	if m > n {
        -		panic(nLTM)
        -	}
        -	if len(tau) < k {
        -		panic(badTau)
        -	}
        -	if len(work) < lwork {
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	case lwork < max(1, m) && lwork != -1:
        +		panic(badLWork)
        +	case len(work) < max(1, lwork):
         		panic(shortWork)
         	}
        -	if lwork < m {
        -		panic(badWork)
        -	}
        +
         	if m == 0 {
        +		work[0] = 1
         		return
         	}
        -	nbmin := 2 // Minimum number of blocks
        -	var nx int // Minimum number of rows
        +
        +	nb := impl.Ilaenv(1, "DORGLQ", " ", m, n, k, -1)
        +	if lwork == -1 {
        +		work[0] = float64(m * nb)
        +		return
        +	}
        +
        +	switch {
        +	case len(a) < (m-1)*lda+n:
        +		panic(shortA)
        +	case len(tau) < k:
        +		panic(shortTau)
        +	}
        +
        +	nbmin := 2 // Minimum block size
        +	var nx int // Crossover size from blocked to unbloked code
         	iws := m   // Length of work needed
         	var ldwork int
        -	if nb > 1 && nb < k {
        +	if 1 < nb && nb < k {
         		nx = max(0, impl.Ilaenv(3, "DORGLQ", " ", m, n, k, -1))
         		if nx < k {
         			ldwork = nb
        @@ -70,12 +77,11 @@ func (impl Implementation) Dorglq(m, n, k int, a []float64, lda int, tau, work [
         			}
         		}
         	}
        +
         	var ki, kk int
        -	if nb >= nbmin && nb < k && nx < k {
        +	if nbmin <= nb && nb < k && nx < k {
         		// The first kk rows are handled by the blocked method.
        -		// Note: lapack has nx here, but this means the last nx rows are handled
        -		// serially which could be quite different than nb.
        -		ki = ((k - nb - 1) / nb) * nb
        +		ki = ((k - nx - 1) / nb) * nb
         		kk = min(k, ki+nb)
         		for i := kk; i < m; i++ {
         			for j := 0; j < kk; j++ {
        @@ -87,31 +93,31 @@ func (impl Implementation) Dorglq(m, n, k int, a []float64, lda int, tau, work [
         		// Perform the operation on colums kk to the end.
         		impl.Dorgl2(m-kk, n-kk, k-kk, a[kk*lda+kk:], lda, tau[kk:], work)
         	}
        -	if kk == 0 {
        -		return
        -	}
        -	// Perform the operation on column-blocks
        -	for i := ki; i >= 0; i -= nb {
        -		ib := min(nb, k-i)
        -		if i+ib < m {
        -			impl.Dlarft(lapack.Forward, lapack.RowWise,
        -				n-i, ib,
        -				a[i*lda+i:], lda,
        -				tau[i:],
        -				work, ldwork)
        +	if kk > 0 {
        +		// Perform the operation on column-blocks
        +		for i := ki; i >= 0; i -= nb {
        +			ib := min(nb, k-i)
        +			if i+ib < m {
        +				impl.Dlarft(lapack.Forward, lapack.RowWise,
        +					n-i, ib,
        +					a[i*lda+i:], lda,
        +					tau[i:],
        +					work, ldwork)
         
        -			impl.Dlarfb(blas.Right, blas.Trans, lapack.Forward, lapack.RowWise,
        -				m-i-ib, n-i, ib,
        -				a[i*lda+i:], lda,
        -				work, ldwork,
        -				a[(i+ib)*lda+i:], lda,
        -				work[ib*ldwork:], ldwork)
        -		}
        -		impl.Dorgl2(ib, n-i, ib, a[i*lda+i:], lda, tau[i:], work)
        -		for l := i; l < i+ib; l++ {
        -			for j := 0; j < i; j++ {
        -				a[l*lda+j] = 0
        +				impl.Dlarfb(blas.Right, blas.Trans, lapack.Forward, lapack.RowWise,
        +					m-i-ib, n-i, ib,
        +					a[i*lda+i:], lda,
        +					work, ldwork,
        +					a[(i+ib)*lda+i:], lda,
        +					work[ib*ldwork:], ldwork)
        +			}
        +			impl.Dorgl2(ib, n-i, ib, a[i*lda+i:], lda, tau[i:], work)
        +			for l := i; l < i+ib; l++ {
        +				for j := 0; j < i; j++ {
        +					a[l*lda+j] = 0
        +				}
         			}
         		}
         	}
        +	work[0] = float64(iws)
         }
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dorgql.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dorgql.go
        index 35967d72e..6927ba4ca 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dorgql.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dorgql.go
        @@ -33,26 +33,25 @@ import (
         // Dorgql is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dorgql(m, n, k int, a []float64, lda int, tau, work []float64, lwork int) {
         	switch {
        +	case m < 0:
        +		panic(mLT0)
         	case n < 0:
         		panic(nLT0)
        -	case m < n:
        -		panic(mLTN)
        +	case n > m:
        +		panic(nGTM)
         	case k < 0:
         		panic(kLT0)
         	case k > n:
         		panic(kGTN)
        +	case lda < max(1, n):
        +		panic(badLdA)
         	case lwork < max(1, n) && lwork != -1:
        -		panic(badWork)
        -	case len(work) < lwork:
        +		panic(badLWork)
        +	case len(work) < max(1, lwork):
         		panic(shortWork)
         	}
        -	if lwork != -1 {
        -		checkMatrix(m, n, a, lda)
        -		if len(tau) < k {
        -			panic(badTau)
        -		}
        -	}
         
        +	// Quick return if possible.
         	if n == 0 {
         		work[0] = 1
         		return
        @@ -64,10 +63,17 @@ func (impl Implementation) Dorgql(m, n, k int, a []float64, lda int, tau, work [
         		return
         	}
         
        +	switch {
        +	case len(a) < (m-1)*lda+n:
        +		panic(shortA)
        +	case len(tau) < k:
        +		panic(shortTau)
        +	}
        +
         	nbmin := 2
         	var nx, ldwork int
         	iws := n
        -	if nb > 1 && nb < k {
        +	if 1 < nb && nb < k {
         		// Determine when to cross over from blocked to unblocked code.
         		nx = max(0, impl.Ilaenv(3, "DORGQL", " ", m, n, k, -1))
         		if nx < k {
        @@ -84,7 +90,7 @@ func (impl Implementation) Dorgql(m, n, k int, a []float64, lda int, tau, work [
         	}
         
         	var kk int
        -	if nb >= nbmin && nb < k && nx < k {
        +	if nbmin <= nb && nb < k && nx < k {
         		// Use blocked code after the first block. The last kk columns are handled
         		// by the block method.
         		kk = min(k, ((k-nx+nb-1)/nb)*nb)
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dorgqr.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dorgqr.go
        index 6b8fb7423..f07fdaf46 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dorgqr.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dorgqr.go
        @@ -28,39 +28,55 @@ import (
         //
         // Dorgqr is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dorgqr(m, n, k int, a []float64, lda int, tau, work []float64, lwork int) {
        -	nb := impl.Ilaenv(1, "DORGQR", " ", m, n, k, -1)
        -	// work is treated as an n×nb matrix
        -	if lwork == -1 {
        -		work[0] = float64(max(1, n) * nb)
        -		return
        -	}
        -	checkMatrix(m, n, a, lda)
        -	if k < 0 {
        +	switch {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case n > m:
        +		panic(nGTM)
        +	case k < 0:
         		panic(kLT0)
        -	}
        -	if k > n {
        +	case k > n:
         		panic(kGTN)
        -	}
        -	if n > m {
        -		panic(mLTN)
        -	}
        -	if len(tau) < k {
        -		panic(badTau)
        -	}
        -	if len(work) < lwork {
        +	case lda < max(1, n) && lwork != -1:
        +		// Normally, we follow the reference and require the leading
        +		// dimension to be always valid, even in case of workspace
        +		// queries. However, if a caller provided a placeholder value
        +		// for lda (and a) when doing a workspace query that didn't
        +		// fulfill the condition here, it would cause a panic. This is
        +		// exactly what Dgesvd does.
        +		panic(badLdA)
        +	case lwork < max(1, n) && lwork != -1:
        +		panic(badLWork)
        +	case len(work) < max(1, lwork):
         		panic(shortWork)
         	}
        -	if lwork < n {
        -		panic(badWork)
        -	}
        +
         	if n == 0 {
        +		work[0] = 1
        +		return
        +	}
        +
        +	nb := impl.Ilaenv(1, "DORGQR", " ", m, n, k, -1)
        +	// work is treated as an n×nb matrix
        +	if lwork == -1 {
        +		work[0] = float64(n * nb)
         		return
         	}
        -	nbmin := 2 // Minimum number of blocks
        -	var nx int // Minimum number of rows
        +
        +	switch {
        +	case len(a) < (m-1)*lda+n:
        +		panic(shortA)
        +	case len(tau) < k:
        +		panic(shortTau)
        +	}
        +
        +	nbmin := 2 // Minimum block size
        +	var nx int // Crossover size from blocked to unbloked code
         	iws := n   // Length of work needed
         	var ldwork int
        -	if nb > 1 && nb < k {
        +	if 1 < nb && nb < k {
         		nx = max(0, impl.Ilaenv(3, "DORGQR", " ", m, n, k, -1))
         		if nx < k {
         			ldwork = nb
        @@ -73,14 +89,12 @@ func (impl Implementation) Dorgqr(m, n, k int, a []float64, lda int, tau, work [
         		}
         	}
         	var ki, kk int
        -	if nb >= nbmin && nb < k && nx < k {
        +	if nbmin <= nb && nb < k && nx < k {
         		// The first kk columns are handled by the blocked method.
        -		// Note: lapack has nx here, but this means the last nx rows are handled
        -		// serially which could be quite different than nb.
        -		ki = ((k - nb - 1) / nb) * nb
        +		ki = ((k - nx - 1) / nb) * nb
         		kk = min(k, ki+nb)
        -		for j := kk; j < n; j++ {
        -			for i := 0; i < kk; i++ {
        +		for i := 0; i < kk; i++ {
        +			for j := kk; j < n; j++ {
         				a[i*lda+j] = 0
         			}
         		}
        @@ -89,32 +103,32 @@ func (impl Implementation) Dorgqr(m, n, k int, a []float64, lda int, tau, work [
         		// Perform the operation on colums kk to the end.
         		impl.Dorg2r(m-kk, n-kk, k-kk, a[kk*lda+kk:], lda, tau[kk:], work)
         	}
        -	if kk == 0 {
        -		return
        -	}
        -	// Perform the operation on column-blocks
        -	for i := ki; i >= 0; i -= nb {
        -		ib := min(nb, k-i)
        -		if i+ib < n {
        -			impl.Dlarft(lapack.Forward, lapack.ColumnWise,
        -				m-i, ib,
        -				a[i*lda+i:], lda,
        -				tau[i:],
        -				work, ldwork)
        +	if kk > 0 {
        +		// Perform the operation on column-blocks.
        +		for i := ki; i >= 0; i -= nb {
        +			ib := min(nb, k-i)
        +			if i+ib < n {
        +				impl.Dlarft(lapack.Forward, lapack.ColumnWise,
        +					m-i, ib,
        +					a[i*lda+i:], lda,
        +					tau[i:],
        +					work, ldwork)
         
        -			impl.Dlarfb(blas.Left, blas.NoTrans, lapack.Forward, lapack.ColumnWise,
        -				m-i, n-i-ib, ib,
        -				a[i*lda+i:], lda,
        -				work, ldwork,
        -				a[i*lda+i+ib:], lda,
        -				work[ib*ldwork:], ldwork)
        -		}
        -		impl.Dorg2r(m-i, ib, ib, a[i*lda+i:], lda, tau[i:], work)
        -		// Set rows 0:i-1 of current block to zero
        -		for j := i; j < i+ib; j++ {
        -			for l := 0; l < i; l++ {
        -				a[l*lda+j] = 0
        +				impl.Dlarfb(blas.Left, blas.NoTrans, lapack.Forward, lapack.ColumnWise,
        +					m-i, n-i-ib, ib,
        +					a[i*lda+i:], lda,
        +					work, ldwork,
        +					a[i*lda+i+ib:], lda,
        +					work[ib*ldwork:], ldwork)
        +			}
        +			impl.Dorg2r(m-i, ib, ib, a[i*lda+i:], lda, tau[i:], work)
        +			// Set rows 0:i-1 of current block to zero.
        +			for j := i; j < i+ib; j++ {
        +				for l := 0; l < i; l++ {
        +					a[l*lda+j] = 0
        +				}
         			}
         		}
         	}
        +	work[0] = float64(iws)
         }
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dorgtr.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dorgtr.go
        index 6984ff55e..483fbcae9 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dorgtr.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dorgtr.go
        @@ -25,19 +25,17 @@ import "gonum.org/v1/gonum/blas"
         //
         // Dorgtr is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dorgtr(uplo blas.Uplo, n int, a []float64, lda int, tau, work []float64, lwork int) {
        -	checkMatrix(n, n, a, lda)
        -	if len(tau) < n-1 {
        -		panic(badTau)
        -	}
        -	if len(work) < lwork {
        -		panic(badWork)
        -	}
        -	if lwork < n-1 && lwork != -1 {
        -		panic(badWork)
        -	}
        -	upper := uplo == blas.Upper
        -	if !upper && uplo != blas.Lower {
        +	switch {
        +	case uplo != blas.Upper && uplo != blas.Lower:
         		panic(badUplo)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	case lwork < max(1, n-1) && lwork != -1:
        +		panic(badLWork)
        +	case len(work) < max(1, lwork):
        +		panic(shortWork)
         	}
         
         	if n == 0 {
        @@ -46,7 +44,7 @@ func (impl Implementation) Dorgtr(uplo blas.Uplo, n int, a []float64, lda int, t
         	}
         
         	var nb int
        -	if upper {
        +	if uplo == blas.Upper {
         		nb = impl.Ilaenv(1, "DORGQL", " ", n-1, n-1, n-1, -1)
         	} else {
         		nb = impl.Ilaenv(1, "DORGQR", " ", n-1, n-1, n-1, -1)
        @@ -57,7 +55,14 @@ func (impl Implementation) Dorgtr(uplo blas.Uplo, n int, a []float64, lda int, t
         		return
         	}
         
        -	if upper {
        +	switch {
        +	case len(a) < (n-1)*lda+n:
        +		panic(shortA)
        +	case len(tau) < n-1:
        +		panic(shortTau)
        +	}
        +
        +	if uplo == blas.Upper {
         		// Q was determined by a call to Dsytrd with uplo == blas.Upper.
         		// Shift the vectors which define the elementary reflectors one column
         		// to the left, and set the last row and column of Q to those of the unit
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dorm2r.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dorm2r.go
        index e8fb1d4de..8311f7426 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dorm2r.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dorm2r.go
        @@ -8,10 +8,10 @@ import "gonum.org/v1/gonum/blas"
         
         // Dorm2r multiplies a general matrix C by an orthogonal matrix from a QR factorization
         // determined by Dgeqrf.
        -//  C = Q * C    if side == blas.Left and trans == blas.NoTrans
        -//  C = Q^T * C  if side == blas.Left and trans == blas.Trans
        -//  C = C * Q    if side == blas.Right and trans == blas.NoTrans
        -//  C = C * Q^T  if side == blas.Right and trans == blas.Trans
        +//  C = Q * C   if side == blas.Left and trans == blas.NoTrans
        +//  C = Qᵀ * C  if side == blas.Left and trans == blas.Trans
        +//  C = C * Q   if side == blas.Right and trans == blas.NoTrans
        +//  C = C * Qᵀ  if side == blas.Right and trans == blas.Trans
         // If side == blas.Left, a is a matrix of size m×k, and if side == blas.Right
         // a is of size n×k.
         //
        @@ -23,37 +23,50 @@ import "gonum.org/v1/gonum/blas"
         //
         // Dorm2r is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dorm2r(side blas.Side, trans blas.Transpose, m, n, k int, a []float64, lda int, tau, c []float64, ldc int, work []float64) {
        -	if side != blas.Left && side != blas.Right {
        +	left := side == blas.Left
        +	switch {
        +	case !left && side != blas.Right:
         		panic(badSide)
        -	}
        -	if trans != blas.Trans && trans != blas.NoTrans {
        +	case trans != blas.Trans && trans != blas.NoTrans:
         		panic(badTrans)
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case k < 0:
        +		panic(kLT0)
        +	case left && k > m:
        +		panic(kGTM)
        +	case !left && k > n:
        +		panic(kGTN)
        +	case lda < max(1, k):
        +		panic(badLdA)
        +	case ldc < max(1, n):
        +		panic(badLdC)
         	}
         
        -	left := side == blas.Left
        -	notran := trans == blas.NoTrans
        -	if left {
        -		// Q is m x m
        -		checkMatrix(m, k, a, lda)
        -		if len(work) < n {
        -			panic(badWork)
        -		}
        -	} else {
        -		// Q is n x n
        -		checkMatrix(n, k, a, lda)
        -		if len(work) < m {
        -			panic(badWork)
        -		}
        -	}
        -	checkMatrix(m, n, c, ldc)
        +	// Quick return if possible.
         	if m == 0 || n == 0 || k == 0 {
         		return
         	}
        -	if len(tau) < k {
        -		panic(badTau)
        +
        +	switch {
        +	case left && len(a) < (m-1)*lda+k:
        +		panic(shortA)
        +	case !left && len(a) < (n-1)*lda+k:
        +		panic(shortA)
        +	case len(c) < (m-1)*ldc+n:
        +		panic(shortC)
        +	case len(tau) < k:
        +		panic(shortTau)
        +	case left && len(work) < n:
        +		panic(shortWork)
        +	case !left && len(work) < m:
        +		panic(shortWork)
         	}
        +
         	if left {
        -		if notran {
        +		if trans == blas.NoTrans {
         			for i := k - 1; i >= 0; i-- {
         				aii := a[i*lda+i]
         				a[i*lda+i] = 1
        @@ -70,7 +83,7 @@ func (impl Implementation) Dorm2r(side blas.Side, trans blas.Transpose, m, n, k
         		}
         		return
         	}
        -	if notran {
        +	if trans == blas.NoTrans {
         		for i := 0; i < k; i++ {
         			aii := a[i*lda+i]
         			a[i*lda+i] = 1
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dormbr.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dormbr.go
        index 12f62362f..e1b37373f 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dormbr.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dormbr.go
        @@ -15,15 +15,15 @@ import (
         // Dormbr overwrites the m×n matrix C with
         //  Q * C   if vect == lapack.ApplyQ, side == blas.Left, and trans == blas.NoTrans
         //  C * Q   if vect == lapack.ApplyQ, side == blas.Right, and trans == blas.NoTrans
        -//  Q^T * C if vect == lapack.ApplyQ, side == blas.Left, and trans == blas.Trans
        -//  C * Q^T if vect == lapack.ApplyQ, side == blas.Right, and trans == blas.Trans
        +//  Qᵀ * C  if vect == lapack.ApplyQ, side == blas.Left, and trans == blas.Trans
        +//  C * Qᵀ  if vect == lapack.ApplyQ, side == blas.Right, and trans == blas.Trans
         //
         //  P * C   if vect == lapack.ApplyP, side == blas.Left, and trans == blas.NoTrans
         //  C * P   if vect == lapack.ApplyP, side == blas.Right, and trans == blas.NoTrans
        -//  P^T * C if vect == lapack.ApplyP, side == blas.Left, and trans == blas.Trans
        -//  C * P^T if vect == lapack.ApplyP, side == blas.Right, and trans == blas.Trans
        +//  Pᵀ * C  if vect == lapack.ApplyP, side == blas.Left, and trans == blas.Trans
        +//  C * Pᵀ  if vect == lapack.ApplyP, side == blas.Right, and trans == blas.Trans
         // where P and Q are the orthogonal matrices determined by Dgebrd when reducing
        -// a matrix A to bidiagonal form: A = Q * B * P^T. See Dgebrd for the
        +// a matrix A to bidiagonal form: A = Q * B * Pᵀ. See Dgebrd for the
         // definitions of Q and P.
         //
         // If vect == lapack.ApplyQ, A is assumed to have been an nq×k matrix, while if
        @@ -45,40 +45,43 @@ import (
         //
         // Dormbr is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dormbr(vect lapack.ApplyOrtho, side blas.Side, trans blas.Transpose, m, n, k int, a []float64, lda int, tau, c []float64, ldc int, work []float64, lwork int) {
        -	if side != blas.Left && side != blas.Right {
        -		panic(badSide)
        -	}
        -	if trans != blas.NoTrans && trans != blas.Trans {
        -		panic(badTrans)
        -	}
        -	if vect != lapack.ApplyP && vect != lapack.ApplyQ {
        -		panic(badApplyOrtho)
        -	}
         	nq := n
         	nw := m
         	if side == blas.Left {
         		nq = m
         		nw = n
         	}
        -	if vect == lapack.ApplyQ {
        -		checkMatrix(nq, min(nq, k), a, lda)
        -	} else {
        -		checkMatrix(min(nq, k), nq, a, lda)
        -	}
        -	if len(tau) < min(nq, k) {
        -		panic(badTau)
        -	}
        -	checkMatrix(m, n, c, ldc)
        -	if len(work) < lwork {
        +	applyQ := vect == lapack.ApplyQ
        +	switch {
        +	case !applyQ && vect != lapack.ApplyP:
        +		panic(badApplyOrtho)
        +	case side != blas.Left && side != blas.Right:
        +		panic(badSide)
        +	case trans != blas.NoTrans && trans != blas.Trans:
        +		panic(badTrans)
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case k < 0:
        +		panic(kLT0)
        +	case applyQ && lda < max(1, min(nq, k)):
        +		panic(badLdA)
        +	case !applyQ && lda < max(1, nq):
        +		panic(badLdA)
        +	case ldc < max(1, n):
        +		panic(badLdC)
        +	case lwork < max(1, nw) && lwork != -1:
        +		panic(badLWork)
        +	case len(work) < max(1, lwork):
         		panic(shortWork)
         	}
        -	if lwork < max(1, nw) && lwork != -1 {
        -		panic(badWork)
        -	}
         
        -	applyQ := vect == lapack.ApplyQ
        -	left := side == blas.Left
        -	var nb int
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		work[0] = 1
        +		return
        +	}
         
         	// The current implementation does not use opts, but a future change may
         	// use these options so construct them.
        @@ -93,14 +96,15 @@ func (impl Implementation) Dormbr(vect lapack.ApplyOrtho, side blas.Side, trans
         	} else {
         		opts += "N"
         	}
        +	var nb int
         	if applyQ {
        -		if left {
        +		if side == blas.Left {
         			nb = impl.Ilaenv(1, "DORMQR", opts, m-1, n, m-1, -1)
         		} else {
         			nb = impl.Ilaenv(1, "DORMQR", opts, m, n-1, n-1, -1)
         		}
         	} else {
        -		if left {
        +		if side == blas.Left {
         			nb = impl.Ilaenv(1, "DORMLQ", opts, m-1, n, m-1, -1)
         		} else {
         			nb = impl.Ilaenv(1, "DORMLQ", opts, m, n-1, n-1, -1)
        @@ -109,19 +113,33 @@ func (impl Implementation) Dormbr(vect lapack.ApplyOrtho, side blas.Side, trans
         	lworkopt := max(1, nw) * nb
         	if lwork == -1 {
         		work[0] = float64(lworkopt)
        +		return
        +	}
        +
        +	minnqk := min(nq, k)
        +	switch {
        +	case applyQ && len(a) < (nq-1)*lda+minnqk:
        +		panic(shortA)
        +	case !applyQ && len(a) < (minnqk-1)*lda+nq:
        +		panic(shortA)
        +	case len(tau) < minnqk:
        +		panic(shortTau)
        +	case len(c) < (m-1)*ldc+n:
        +		panic(shortC)
         	}
        +
         	if applyQ {
         		// Change the operation to get Q depending on the size of the initial
         		// matrix to Dgebrd. The size matters due to the storage location of
         		// the off-diagonal elements.
         		if nq >= k {
        -			impl.Dormqr(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork)
        +			impl.Dormqr(side, trans, m, n, k, a, lda, tau[:k], c, ldc, work, lwork)
         		} else if nq > 1 {
         			mi := m
         			ni := n - 1
         			i1 := 0
         			i2 := 1
        -			if left {
        +			if side == blas.Left {
         				mi = m - 1
         				ni = n
         				i1 = 1
        @@ -132,10 +150,12 @@ func (impl Implementation) Dormbr(vect lapack.ApplyOrtho, side blas.Side, trans
         		work[0] = float64(lworkopt)
         		return
         	}
        +
         	transt := blas.Trans
         	if trans == blas.Trans {
         		transt = blas.NoTrans
         	}
        +
         	// Change the operation to get P depending on the size of the initial
         	// matrix to Dgebrd. The size matters due to the storage location of
         	// the off-diagonal elements.
        @@ -146,7 +166,7 @@ func (impl Implementation) Dormbr(vect lapack.ApplyOrtho, side blas.Side, trans
         		ni := n - 1
         		i1 := 0
         		i2 := 1
        -		if left {
        +		if side == blas.Left {
         			mi = m - 1
         			ni = n
         			i1 = 1
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dormhr.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dormhr.go
        index f6cb1b265..ac4d3ae69 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dormhr.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dormhr.go
        @@ -7,10 +7,10 @@ package gonum
         import "gonum.org/v1/gonum/blas"
         
         // Dormhr multiplies an m×n general matrix C with an nq×nq orthogonal matrix Q
        -//  Q * C,    if side == blas.Left and trans == blas.NoTrans,
        -//  Q^T * C,  if side == blas.Left and trans == blas.Trans,
        -//  C * Q,    if side == blas.Right and trans == blas.NoTrans,
        -//  C * Q^T,  if side == blas.Right and trans == blas.Trans,
        +//  Q * C   if side == blas.Left  and trans == blas.NoTrans,
        +//  Qᵀ * C  if side == blas.Left  and trans == blas.Trans,
        +//  C * Q   if side == blas.Right and trans == blas.NoTrans,
        +//  C * Qᵀ  if side == blas.Right and trans == blas.Trans,
         // where nq == m if side == blas.Left and nq == n if side == blas.Right.
         //
         // Q is defined implicitly as the product of ihi-ilo elementary reflectors, as
        @@ -21,10 +21,10 @@ import "gonum.org/v1/gonum/blas"
         //
         // ilo and ihi must have the same values as in the previous call of Dgehrd. It
         // must hold that
        -//  0 <= ilo <= ihi < m,   if m > 0 and side == blas.Left,
        -//  ilo = 0 and ihi = -1,  if m = 0 and side == blas.Left,
        -//  0 <= ilo <= ihi < n,   if n > 0 and side == blas.Right,
        -//  ilo = 0 and ihi = -1,  if n = 0 and side == blas.Right.
        +//  0 <= ilo <= ihi < m   if m > 0 and side == blas.Left,
        +//  ilo = 0 and ihi = -1  if m = 0 and side == blas.Left,
        +//  0 <= ilo <= ihi < n   if n > 0 and side == blas.Right,
        +//  ilo = 0 and ihi = -1  if n = 0 and side == blas.Right.
         //
         // a and lda represent an m×m matrix if side == blas.Left and an n×n matrix if
         // side == blas.Right. The matrix contains vectors which define the elementary
        @@ -50,39 +50,37 @@ import "gonum.org/v1/gonum/blas"
         //
         // Dormhr is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dormhr(side blas.Side, trans blas.Transpose, m, n, ilo, ihi int, a []float64, lda int, tau, c []float64, ldc int, work []float64, lwork int) {
        -	var (
        -		nq int // The order of Q.
        -		nw int // The minimum length of work.
        -	)
        -	switch side {
        -	case blas.Left:
        +	nq := n // The order of Q.
        +	nw := m // The minimum length of work.
        +	if side == blas.Left {
         		nq = m
         		nw = n
        -	case blas.Right:
        -		nq = n
        -		nw = m
        -	default:
        -		panic(badSide)
         	}
         	switch {
        +	case side != blas.Left && side != blas.Right:
        +		panic(badSide)
         	case trans != blas.NoTrans && trans != blas.Trans:
         		panic(badTrans)
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
         	case ilo < 0 || max(1, nq) <= ilo:
         		panic(badIlo)
         	case ihi < min(ilo, nq-1) || nq <= ihi:
         		panic(badIhi)
        +	case lda < max(1, nq):
        +		panic(badLdA)
         	case lwork < max(1, nw) && lwork != -1:
        -		panic(badWork)
        +		panic(badLWork)
         	case len(work) < max(1, lwork):
         		panic(shortWork)
         	}
        -	if lwork != -1 {
        -		checkMatrix(m, n, c, ldc)
        -		checkMatrix(nq, nq, a, lda)
        -		if len(tau) != nq-1 && nq > 0 {
        -			panic(badTau)
        -		}
         
        +	// Quick return if possible.
        +	if m == 0 || n == 0 {
        +		work[0] = 1
        +		return
         	}
         
         	nh := ihi - ilo
        @@ -106,10 +104,20 @@ func (impl Implementation) Dormhr(side blas.Side, trans blas.Transpose, m, n, il
         		return
         	}
         
        -	if m == 0 || n == 0 || nh == 0 {
        +	if nh == 0 {
         		work[0] = 1
         		return
         	}
        +
        +	switch {
        +	case len(a) < (nq-1)*lda+nq:
        +		panic(shortA)
        +	case len(c) < (m-1)*ldc+n:
        +		panic(shortC)
        +	case len(tau) != nq-1:
        +		panic(badLenTau)
        +	}
        +
         	if side == blas.Left {
         		impl.Dormqr(side, trans, nh, n, nh, a[(ilo+1)*lda+ilo:], lda,
         			tau[ilo:ihi], c[(ilo+1)*ldc:], ldc, work, lwork)
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dorml2.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dorml2.go
        index 1c217b5b4..df474ca4d 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dorml2.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dorml2.go
        @@ -8,10 +8,10 @@ import "gonum.org/v1/gonum/blas"
         
         // Dorml2 multiplies a general matrix C by an orthogonal matrix from an LQ factorization
         // determined by Dgelqf.
        -//  C = Q * C    if side == blas.Left and trans == blas.NoTrans
        -//  C = Q^T * C  if side == blas.Left and trans == blas.Trans
        -//  C = C * Q    if side == blas.Right and trans == blas.NoTrans
        -//  C = C * Q^T  if side == blas.Right and trans == blas.Trans
        +//  C = Q * C   if side == blas.Left and trans == blas.NoTrans
        +//  C = Qᵀ * C  if side == blas.Left and trans == blas.Trans
        +//  C = C * Q   if side == blas.Right and trans == blas.NoTrans
        +//  C = C * Qᵀ  if side == blas.Right and trans == blas.Trans
         // If side == blas.Left, a is a matrix of side k×m, and if side == blas.Right
         // a is of size k×n.
         //
        @@ -23,32 +23,51 @@ import "gonum.org/v1/gonum/blas"
         //
         // Dorml2 is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dorml2(side blas.Side, trans blas.Transpose, m, n, k int, a []float64, lda int, tau, c []float64, ldc int, work []float64) {
        -	if side != blas.Left && side != blas.Right {
        +	left := side == blas.Left
        +	switch {
        +	case !left && side != blas.Right:
         		panic(badSide)
        -	}
        -	if trans != blas.Trans && trans != blas.NoTrans {
        +	case trans != blas.Trans && trans != blas.NoTrans:
         		panic(badTrans)
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case k < 0:
        +		panic(kLT0)
        +	case left && k > m:
        +		panic(kGTM)
        +	case !left && k > n:
        +		panic(kGTN)
        +	case left && lda < max(1, m):
        +		panic(badLdA)
        +	case !left && lda < max(1, n):
        +		panic(badLdA)
         	}
         
        -	left := side == blas.Left
        -	notran := trans == blas.NoTrans
        -	if left {
        -		checkMatrix(k, m, a, lda)
        -		if len(work) < n {
        -			panic(badWork)
        -		}
        -	} else {
        -		checkMatrix(k, n, a, lda)
        -		if len(work) < m {
        -			panic(badWork)
        -		}
        -	}
        -	checkMatrix(m, n, c, ldc)
        +	// Quick return if possible.
         	if m == 0 || n == 0 || k == 0 {
         		return
         	}
        +
        +	switch {
        +	case left && len(a) < (k-1)*lda+m:
        +		panic(shortA)
        +	case !left && len(a) < (k-1)*lda+n:
        +		panic(shortA)
        +	case len(tau) < k:
        +		panic(shortTau)
        +	case len(c) < (m-1)*ldc+n:
        +		panic(shortC)
        +	case left && len(work) < n:
        +		panic(shortWork)
        +	case !left && len(work) < m:
        +		panic(shortWork)
        +	}
        +
        +	notrans := trans == blas.NoTrans
         	switch {
        -	case left && notran:
        +	case left && notrans:
         		for i := 0; i < k; i++ {
         			aii := a[i*lda+i]
         			a[i*lda+i] = 1
        @@ -56,7 +75,7 @@ func (impl Implementation) Dorml2(side blas.Side, trans blas.Transpose, m, n, k
         			a[i*lda+i] = aii
         		}
         
        -	case left && !notran:
        +	case left && !notrans:
         		for i := k - 1; i >= 0; i-- {
         			aii := a[i*lda+i]
         			a[i*lda+i] = 1
        @@ -64,7 +83,7 @@ func (impl Implementation) Dorml2(side blas.Side, trans blas.Transpose, m, n, k
         			a[i*lda+i] = aii
         		}
         
        -	case !left && notran:
        +	case !left && notrans:
         		for i := k - 1; i >= 0; i-- {
         			aii := a[i*lda+i]
         			a[i*lda+i] = 1
        @@ -72,7 +91,7 @@ func (impl Implementation) Dorml2(side blas.Side, trans blas.Transpose, m, n, k
         			a[i*lda+i] = aii
         		}
         
        -	case !left && !notran:
        +	case !left && !notrans:
         		for i := 0; i < k; i++ {
         			aii := a[i*lda+i]
         			a[i*lda+i] = 1
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dormlq.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dormlq.go
        index d7a27643c..a86a8a569 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dormlq.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dormlq.go
        @@ -11,10 +11,10 @@ import (
         
         // Dormlq multiplies the matrix C by the orthogonal matrix Q defined by the
         // slices a and tau. A and tau are as returned from Dgelqf.
        -//  C = Q * C    if side == blas.Left and trans == blas.NoTrans
        -//  C = Q^T * C  if side == blas.Left and trans == blas.Trans
        -//  C = C * Q    if side == blas.Right and trans == blas.NoTrans
        -//  C = C * Q^T  if side == blas.Right and trans == blas.Trans
        +//  C = Q * C   if side == blas.Left and trans == blas.NoTrans
        +//  C = Qᵀ * C  if side == blas.Left and trans == blas.Trans
        +//  C = C * Q   if side == blas.Right and trans == blas.NoTrans
        +//  C = C * Qᵀ  if side == blas.Right and trans == blas.Trans
         // If side == blas.Left, A is a matrix of side k×m, and if side == blas.Right
         // A is of size k×n. This uses a blocked algorithm.
         //
        @@ -28,33 +28,37 @@ import (
         // tau contains the Householder scales and must have length at least k, and
         // this function will panic otherwise.
         func (impl Implementation) Dormlq(side blas.Side, trans blas.Transpose, m, n, k int, a []float64, lda int, tau, c []float64, ldc int, work []float64, lwork int) {
        -	if side != blas.Left && side != blas.Right {
        -		panic(badSide)
        -	}
        -	if trans != blas.Trans && trans != blas.NoTrans {
        -		panic(badTrans)
        -	}
         	left := side == blas.Left
        -	if left {
        -		checkMatrix(k, m, a, lda)
        -	} else {
        -		checkMatrix(k, n, a, lda)
        -	}
        -	checkMatrix(m, n, c, ldc)
        -	if len(tau) < k {
        -		panic(badTau)
        -	}
        -	if len(work) < lwork {
        -		panic(shortWork)
        -	}
         	nw := m
         	if left {
         		nw = n
         	}
        -	if lwork < max(1, nw) && lwork != -1 {
        -		panic(badWork)
        +	switch {
        +	case !left && side != blas.Right:
        +		panic(badSide)
        +	case trans != blas.Trans && trans != blas.NoTrans:
        +		panic(badTrans)
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case k < 0:
        +		panic(kLT0)
        +	case left && k > m:
        +		panic(kGTM)
        +	case !left && k > n:
        +		panic(kGTN)
        +	case left && lda < max(1, m):
        +		panic(badLdA)
        +	case !left && lda < max(1, n):
        +		panic(badLdA)
        +	case lwork < max(1, nw) && lwork != -1:
        +		panic(badLWork)
        +	case len(work) < max(1, lwork):
        +		panic(shortWork)
         	}
         
        +	// Quick return if possible.
         	if m == 0 || n == 0 || k == 0 {
         		work[0] = 1
         		return
        @@ -73,6 +77,17 @@ func (impl Implementation) Dormlq(side blas.Side, trans blas.Transpose, m, n, k
         		return
         	}
         
        +	switch {
        +	case left && len(a) < (k-1)*lda+m:
        +		panic(shortA)
        +	case !left && len(a) < (k-1)*lda+n:
        +		panic(shortA)
        +	case len(tau) < k:
        +		panic(shortTau)
        +	case len(c) < (m-1)*ldc+n:
        +		panic(shortC)
        +	}
        +
         	nbmin := 2
         	if 1 < nb && nb < k {
         		iws := nw*nb + tsize
        @@ -92,14 +107,14 @@ func (impl Implementation) Dormlq(side blas.Side, trans blas.Transpose, m, n, k
         	wrk := work[tsize:]
         	ldwrk := nb
         
        -	notran := trans == blas.NoTrans
        +	notrans := trans == blas.NoTrans
         	transt := blas.NoTrans
        -	if notran {
        +	if notrans {
         		transt = blas.Trans
         	}
         
         	switch {
        -	case left && notran:
        +	case left && notrans:
         		for i := 0; i < k; i += nb {
         			ib := min(nb, k-i)
         			impl.Dlarft(lapack.Forward, lapack.RowWise, m-i, ib,
        @@ -113,7 +128,7 @@ func (impl Implementation) Dormlq(side blas.Side, trans blas.Transpose, m, n, k
         				wrk, ldwrk)
         		}
         
        -	case left && !notran:
        +	case left && !notrans:
         		for i := ((k - 1) / nb) * nb; i >= 0; i -= nb {
         			ib := min(nb, k-i)
         			impl.Dlarft(lapack.Forward, lapack.RowWise, m-i, ib,
        @@ -127,7 +142,7 @@ func (impl Implementation) Dormlq(side blas.Side, trans blas.Transpose, m, n, k
         				wrk, ldwrk)
         		}
         
        -	case !left && notran:
        +	case !left && notrans:
         		for i := ((k - 1) / nb) * nb; i >= 0; i -= nb {
         			ib := min(nb, k-i)
         			impl.Dlarft(lapack.Forward, lapack.RowWise, n-i, ib,
        @@ -141,7 +156,7 @@ func (impl Implementation) Dormlq(side blas.Side, trans blas.Transpose, m, n, k
         				wrk, ldwrk)
         		}
         
        -	case !left && !notran:
        +	case !left && !notrans:
         		for i := 0; i < k; i += nb {
         			ib := min(nb, k-i)
         			impl.Dlarft(lapack.Forward, lapack.RowWise, n-i, ib,
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dormqr.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dormqr.go
        index 3fa9009f8..ae67de5fc 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dormqr.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dormqr.go
        @@ -10,10 +10,10 @@ import (
         )
         
         // Dormqr multiplies an m×n matrix C by an orthogonal matrix Q as
        -//  C = Q * C,    if side == blas.Left  and trans == blas.NoTrans,
        -//  C = Q^T * C,  if side == blas.Left  and trans == blas.Trans,
        -//  C = C * Q,    if side == blas.Right and trans == blas.NoTrans,
        -//  C = C * Q^T,  if side == blas.Right and trans == blas.Trans,
        +//  C = Q * C   if side == blas.Left  and trans == blas.NoTrans,
        +//  C = Qᵀ * C  if side == blas.Left  and trans == blas.Trans,
        +//  C = C * Q   if side == blas.Right and trans == blas.NoTrans,
        +//  C = C * Qᵀ  if side == blas.Right and trans == blas.Trans,
         // where Q is defined as the product of k elementary reflectors
         //  Q = H_0 * H_1 * ... * H_{k-1}.
         //
        @@ -37,37 +37,39 @@ import (
         // If lwork is -1, instead of performing Dormqr, the optimal workspace size will
         // be stored into work[0].
         func (impl Implementation) Dormqr(side blas.Side, trans blas.Transpose, m, n, k int, a []float64, lda int, tau, c []float64, ldc int, work []float64, lwork int) {
        -	var nq, nw int
        -	switch side {
        -	default:
        -		panic(badSide)
        -	case blas.Left:
        +	left := side == blas.Left
        +	nq := n
        +	nw := m
        +	if left {
         		nq = m
         		nw = n
        -	case blas.Right:
        -		nq = n
        -		nw = m
         	}
         	switch {
        +	case !left && side != blas.Right:
        +		panic(badSide)
         	case trans != blas.NoTrans && trans != blas.Trans:
         		panic(badTrans)
        -	case m < 0 || n < 0:
        -		panic(negDimension)
        -	case k < 0 || nq < k:
        -		panic("lapack: invalid value of k")
        -	case len(work) < lwork:
        -		panic(shortWork)
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case k < 0:
        +		panic(kLT0)
        +	case left && k > m:
        +		panic(kGTM)
        +	case !left && k > n:
        +		panic(kGTN)
        +	case lda < max(1, k):
        +		panic(badLdA)
        +	case ldc < max(1, n):
        +		panic(badLdC)
         	case lwork < max(1, nw) && lwork != -1:
        -		panic(badWork)
        -	}
        -	if lwork != -1 {
        -		checkMatrix(nq, k, a, lda)
        -		checkMatrix(m, n, c, ldc)
        -		if len(tau) != k {
        -			panic(badTau)
        -		}
        +		panic(badLWork)
        +	case len(work) < max(1, lwork):
        +		panic(shortWork)
         	}
         
        +	// Quick return if possible.
         	if m == 0 || n == 0 || k == 0 {
         		work[0] = 1
         		return
        @@ -86,6 +88,15 @@ func (impl Implementation) Dormqr(side blas.Side, trans blas.Transpose, m, n, k
         		return
         	}
         
        +	switch {
        +	case len(a) < (nq-1)*lda+k:
        +		panic(shortA)
        +	case len(tau) != k:
        +		panic(badLenTau)
        +	case len(c) < (m-1)*ldc+n:
        +		panic(shortC)
        +	}
        +
         	nbmin := 2
         	if 1 < nb && nb < k {
         		if lwork < nw*nb+tsize {
        @@ -102,12 +113,11 @@ func (impl Implementation) Dormqr(side blas.Side, trans blas.Transpose, m, n, k
         	}
         
         	var (
        -		ldwork = nb
        -		left   = side == blas.Left
        -		notran = trans == blas.NoTrans
        +		ldwork  = nb
        +		notrans = trans == blas.NoTrans
         	)
         	switch {
        -	case left && notran:
        +	case left && notrans:
         		for i := ((k - 1) / nb) * nb; i >= 0; i -= nb {
         			ib := min(nb, k-i)
         			impl.Dlarft(lapack.Forward, lapack.ColumnWise, m-i, ib,
        @@ -121,7 +131,7 @@ func (impl Implementation) Dormqr(side blas.Side, trans blas.Transpose, m, n, k
         				work[tsize:], ldwork)
         		}
         
        -	case left && !notran:
        +	case left && !notrans:
         		for i := 0; i < k; i += nb {
         			ib := min(nb, k-i)
         			impl.Dlarft(lapack.Forward, lapack.ColumnWise, m-i, ib,
        @@ -135,7 +145,7 @@ func (impl Implementation) Dormqr(side blas.Side, trans blas.Transpose, m, n, k
         				work[tsize:], ldwork)
         		}
         
        -	case !left && notran:
        +	case !left && notrans:
         		for i := 0; i < k; i += nb {
         			ib := min(nb, k-i)
         			impl.Dlarft(lapack.Forward, lapack.ColumnWise, n-i, ib,
        @@ -149,7 +159,7 @@ func (impl Implementation) Dormqr(side blas.Side, trans blas.Transpose, m, n, k
         				work[tsize:], ldwork)
         		}
         
        -	case !left && !notran:
        +	case !left && !notrans:
         		for i := ((k - 1) / nb) * nb; i >= 0; i -= nb {
         			ib := min(nb, k-i)
         			impl.Dlarft(lapack.Forward, lapack.ColumnWise, n-i, ib,
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dormr2.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dormr2.go
        index 3a6b43304..4bf0d8793 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dormr2.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dormr2.go
        @@ -8,10 +8,10 @@ import "gonum.org/v1/gonum/blas"
         
         // Dormr2 multiplies a general matrix C by an orthogonal matrix from a RQ factorization
         // determined by Dgerqf.
        -//  C = Q * C    if side == blas.Left and trans == blas.NoTrans
        -//  C = Q^T * C  if side == blas.Left and trans == blas.Trans
        -//  C = C * Q    if side == blas.Right and trans == blas.NoTrans
        -//  C = C * Q^T  if side == blas.Right and trans == blas.Trans
        +//  C = Q * C   if side == blas.Left and trans == blas.NoTrans
        +//  C = Qᵀ * C  if side == blas.Left and trans == blas.Trans
        +//  C = C * Q   if side == blas.Right and trans == blas.NoTrans
        +//  C = C * Qᵀ  if side == blas.Right and trans == blas.Trans
         // If side == blas.Left, a is a matrix of size k×m, and if side == blas.Right
         // a is of size k×n.
         //
        @@ -23,42 +23,52 @@ import "gonum.org/v1/gonum/blas"
         //
         // Dormr2 is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dormr2(side blas.Side, trans blas.Transpose, m, n, k int, a []float64, lda int, tau, c []float64, ldc int, work []float64) {
        -	if side != blas.Left && side != blas.Right {
        -		panic(badSide)
        -	}
        -	if trans != blas.Trans && trans != blas.NoTrans {
        -		panic(badTrans)
        -	}
        -
         	left := side == blas.Left
        -	notran := trans == blas.NoTrans
        +	nq := n
        +	nw := m
         	if left {
        -		if k > m {
        -			panic(kGTM)
        -		}
        -		checkMatrix(k, m, a, lda)
        -		if len(work) < n {
        -			panic(badWork)
        -		}
        -	} else {
        -		if k > n {
        -			panic(kGTN)
        -		}
        -		checkMatrix(k, n, a, lda)
        -		if len(work) < m {
        -			panic(badWork)
        -		}
        +		nq = m
        +		nw = n
         	}
        -	if len(tau) < k {
        -		panic(badTau)
        +	switch {
        +	case !left && side != blas.Right:
        +		panic(badSide)
        +	case trans != blas.NoTrans && trans != blas.Trans:
        +		panic(badTrans)
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case k < 0:
        +		panic(kLT0)
        +	case left && k > m:
        +		panic(kGTM)
        +	case !left && k > n:
        +		panic(kGTN)
        +	case lda < max(1, nq):
        +		panic(badLdA)
        +	case ldc < max(1, n):
        +		panic(badLdC)
         	}
        -	checkMatrix(m, n, c, ldc)
         
        +	// Quick return if possible.
         	if m == 0 || n == 0 || k == 0 {
         		return
         	}
        +
        +	switch {
        +	case len(a) < (k-1)*lda+nq:
        +		panic(shortA)
        +	case len(tau) < k:
        +		panic(shortTau)
        +	case len(c) < (m-1)*ldc+n:
        +		panic(shortC)
        +	case len(work) < nw:
        +		panic(shortWork)
        +	}
        +
         	if left {
        -		if notran {
        +		if trans == blas.NoTrans {
         			for i := k - 1; i >= 0; i-- {
         				aii := a[i*lda+(m-k+i)]
         				a[i*lda+(m-k+i)] = 1
        @@ -75,7 +85,7 @@ func (impl Implementation) Dormr2(side blas.Side, trans blas.Transpose, m, n, k
         		}
         		return
         	}
        -	if notran {
        +	if trans == blas.NoTrans {
         		for i := 0; i < k; i++ {
         			aii := a[i*lda+(n-k+i)]
         			a[i*lda+(n-k+i)] = 1
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dpbcon.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dpbcon.go
        new file mode 100644
        index 000000000..f55a596c3
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dpbcon.go
        @@ -0,0 +1,108 @@
        +// Copyright ©2019 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package gonum
        +
        +import (
        +	"math"
        +
        +	"gonum.org/v1/gonum/blas"
        +	"gonum.org/v1/gonum/blas/blas64"
        +)
        +
        +// Dpbcon returns an estimate of the reciprocal of the condition number (in the
        +// 1-norm) of an n×n symmetric positive definite band matrix using the Cholesky
        +// factorization
        +//  A = Uᵀ*U  if uplo == blas.Upper
        +//  A = L*Lᵀ  if uplo == blas.Lower
        +// computed by Dpbtrf. The estimate is obtained for norm(inv(A)), and the
        +// reciprocal of the condition number is computed as
        +//  rcond = 1 / (anorm * norm(inv(A))).
        +//
        +// The length of work must be at least 3*n and the length of iwork must be at
        +// least n.
        +func (impl Implementation) Dpbcon(uplo blas.Uplo, n, kd int, ab []float64, ldab int, anorm float64, work []float64, iwork []int) (rcond float64) {
        +	switch {
        +	case uplo != blas.Upper && uplo != blas.Lower:
        +		panic(badUplo)
        +	case n < 0:
        +		panic(nLT0)
        +	case kd < 0:
        +		panic(kdLT0)
        +	case ldab < kd+1:
        +		panic(badLdA)
        +	case anorm < 0:
        +		panic(badNorm)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return 1
        +	}
        +
        +	switch {
        +	case len(ab) < (n-1)*ldab+kd+1:
        +		panic(shortAB)
        +	case len(work) < 3*n:
        +		panic(shortWork)
        +	case len(iwork) < n:
        +		panic(shortIWork)
        +	}
        +
        +	// Quick return if possible.
        +	if anorm == 0 {
        +		return 0
        +	}
        +
        +	const smlnum = dlamchS
        +
        +	var (
        +		ainvnm float64
        +		kase   int
        +		isave  [3]int
        +		normin bool
        +
        +		// Denote work slices.
        +		x     = work[:n]
        +		v     = work[n : 2*n]
        +		cnorm = work[2*n : 3*n]
        +	)
        +	// Estimate the 1-norm of the inverse.
        +	bi := blas64.Implementation()
        +	for {
        +		ainvnm, kase = impl.Dlacn2(n, v, x, iwork, ainvnm, kase, &isave)
        +		if kase == 0 {
        +			break
        +		}
        +		var op1, op2 blas.Transpose
        +		if uplo == blas.Upper {
        +			// Multiply x by inv(Uᵀ),
        +			op1 = blas.Trans
        +			// then by inv(Uᵀ).
        +			op2 = blas.NoTrans
        +		} else {
        +			// Multiply x by inv(L),
        +			op1 = blas.NoTrans
        +			// then by inv(Lᵀ).
        +			op2 = blas.Trans
        +		}
        +		scaleL := impl.Dlatbs(uplo, op1, blas.NonUnit, normin, n, kd, ab, ldab, x, cnorm)
        +		normin = true
        +		scaleU := impl.Dlatbs(uplo, op2, blas.NonUnit, normin, n, kd, ab, ldab, x, cnorm)
        +		// Multiply x by 1/scale if doing so will not cause overflow.
        +		scale := scaleL * scaleU
        +		if scale != 1 {
        +			ix := bi.Idamax(n, x, 1)
        +			if scale < math.Abs(x[ix])*smlnum || scale == 0 {
        +				return 0
        +			}
        +			impl.Drscl(n, scale, x, 1)
        +		}
        +	}
        +	if ainvnm == 0 {
        +		return 0
        +	}
        +	// Return the estimate of the reciprocal condition number.
        +	return (1 / ainvnm) / anorm
        +}
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dpbtf2.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dpbtf2.go
        index 0c60385bb..e54bc46fd 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dpbtf2.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dpbtf2.go
        @@ -14,8 +14,8 @@ import (
         // Dpbtf2 computes the Cholesky factorization of a symmetric positive banded
         // matrix ab. The matrix ab is n×n with kd diagonal bands. The Cholesky
         // factorization computed is
        -//  A = U^T * U if ul == blas.Upper
        -//  A = L * L^T if ul == blas.Lower
        +//  A = Uᵀ * U  if ul == blas.Upper
        +//  A = L * Lᵀ  if ul == blas.Lower
         // ul also specifies the storage of ab. If ul == blas.Upper, then
         // ab is stored as an upper-triangular banded matrix with kd super-diagonals,
         // and if ul == blas.Lower, ab is stored as a lower-triangular banded matrix
        @@ -47,26 +47,41 @@ import (
         // version.
         //
         // Dpbtf2 is an internal routine, exported for testing purposes.
        -func (Implementation) Dpbtf2(ul blas.Uplo, n, kd int, ab []float64, ldab int) (ok bool) {
        -	if ul != blas.Upper && ul != blas.Lower {
        +func (Implementation) Dpbtf2(uplo blas.Uplo, n, kd int, ab []float64, ldab int) (ok bool) {
        +	switch {
        +	case uplo != blas.Upper && uplo != blas.Lower:
         		panic(badUplo)
        +	case n < 0:
        +		panic(nLT0)
        +	case kd < 0:
        +		panic(kdLT0)
        +	case ldab < kd+1:
        +		panic(badLdA)
         	}
        -	checkSymBanded(ab, n, kd, ldab)
        +
        +	// Quick return if possible.
         	if n == 0 {
        -		return
        +		return true
        +	}
        +
        +	if len(ab) < (n-1)*ldab+kd+1 {
        +		panic(shortAB)
         	}
        +
         	bi := blas64.Implementation()
        +
         	kld := max(1, ldab-1)
        -	if ul == blas.Upper {
        +	if uplo == blas.Upper {
        +		// Compute the Cholesky factorization A = Uᵀ * U.
         		for j := 0; j < n; j++ {
        -			// Compute U(J,J) and test for non positive-definiteness.
        +			// Compute U(j,j) and test for non-positive-definiteness.
         			ajj := ab[j*ldab]
         			if ajj <= 0 {
         				return false
         			}
         			ajj = math.Sqrt(ajj)
         			ab[j*ldab] = ajj
        -			// Compute elements j+1:j+kn of row J and update the trailing submatrix
        +			// Compute elements j+1:j+kn of row j and update the trailing submatrix
         			// within the band.
         			kn := min(kd, n-j-1)
         			if kn > 0 {
        @@ -76,16 +91,16 @@ func (Implementation) Dpbtf2(ul blas.Uplo, n, kd int, ab []float64, ldab int) (o
         		}
         		return true
         	}
        +	// Compute the Cholesky factorization A = L * Lᵀ.
         	for j := 0; j < n; j++ {
        -		// Compute L(J,J) and test for non positive-definiteness.
        +		// Compute L(j,j) and test for non-positive-definiteness.
         		ajj := ab[j*ldab+kd]
         		if ajj <= 0 {
         			return false
         		}
         		ajj = math.Sqrt(ajj)
         		ab[j*ldab+kd] = ajj
        -
        -		// Compute elements J+1:J+KN of column J and update the trailing submatrix
        +		// Compute elements j+1:j+kn of column j and update the trailing submatrix
         		// within the band.
         		kn := min(kd, n-j-1)
         		if kn > 0 {
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dpbtrf.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dpbtrf.go
        new file mode 100644
        index 000000000..d8814cdbb
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dpbtrf.go
        @@ -0,0 +1,214 @@
        +// Copyright ©2019 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package gonum
        +
        +import (
        +	"gonum.org/v1/gonum/blas"
        +	"gonum.org/v1/gonum/blas/blas64"
        +)
        +
        +// Dpbtrf computes the Cholesky factorization of an n×n symmetric positive
        +// definite band matrix
        +//  A = Uᵀ * U  if uplo == blas.Upper
        +//  A = L * Lᵀ  if uplo == blas.Lower
        +// where U is an upper triangular band matrix and L is lower triangular. kd is
        +// the number of super- or sub-diagonals of A.
        +//
        +// The band storage scheme is illustrated below when n = 6 and kd = 2. Elements
        +// marked * are not used by the function.
        +//
        +//  uplo == blas.Upper
        +//  On entry:         On return:
        +//   a00  a01  a02     u00  u01  u02
        +//   a11  a12  a13     u11  u12  u13
        +//   a22  a23  a24     u22  u23  u24
        +//   a33  a34  a35     u33  u34  u35
        +//   a44  a45   *      u44  u45   *
        +//   a55   *    *      u55   *    *
        +//
        +//  uplo == blas.Lower
        +//  On entry:         On return:
        +//    *    *   a00       *    *   l00
        +//    *   a10  a11       *   l10  l11
        +//   a20  a21  a22      l20  l21  l22
        +//   a31  a32  a33      l31  l32  l33
        +//   a42  a43  a44      l42  l43  l44
        +//   a53  a54  a55      l53  l54  l55
        +func (impl Implementation) Dpbtrf(uplo blas.Uplo, n, kd int, ab []float64, ldab int) (ok bool) {
        +	const nbmax = 32
        +
        +	switch {
        +	case uplo != blas.Upper && uplo != blas.Lower:
        +		panic(badUplo)
        +	case n < 0:
        +		panic(nLT0)
        +	case kd < 0:
        +		panic(kdLT0)
        +	case ldab < kd+1:
        +		panic(badLdA)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return true
        +	}
        +
        +	if len(ab) < (n-1)*ldab+kd+1 {
        +		panic(shortAB)
        +	}
        +
        +	opts := string(blas.Upper)
        +	if uplo == blas.Lower {
        +		opts = string(blas.Lower)
        +	}
        +	nb := impl.Ilaenv(1, "DPBTRF", opts, n, kd, -1, -1)
        +	// The block size must not exceed the semi-bandwidth kd, and must not
        +	// exceed the limit set by the size of the local array work.
        +	nb = min(nb, nbmax)
        +
        +	if nb <= 1 || kd < nb {
        +		// Use unblocked code.
        +		return impl.Dpbtf2(uplo, n, kd, ab, ldab)
        +	}
        +
        +	// Use blocked code.
        +	ldwork := nb
        +	work := make([]float64, nb*ldwork)
        +	bi := blas64.Implementation()
        +	if uplo == blas.Upper {
        +		// Compute the Cholesky factorization of a symmetric band
        +		// matrix, given the upper triangle of the matrix in band
        +		// storage.
        +
        +		// Process the band matrix one diagonal block at a time.
        +		for i := 0; i < n; i += nb {
        +			ib := min(nb, n-i)
        +			// Factorize the diagonal block.
        +			ok := impl.Dpotf2(uplo, ib, ab[i*ldab:], ldab-1)
        +			if !ok {
        +				return false
        +			}
        +			if i+ib >= n {
        +				continue
        +			}
        +			// Update the relevant part of the trailing submatrix.
        +			// If A11 denotes the diagonal block which has just been
        +			// factorized, then we need to update the remaining
        +			// blocks in the diagram:
        +			//
        +			//  A11   A12   A13
        +			//        A22   A23
        +			//              A33
        +			//
        +			// The numbers of rows and columns in the partitioning
        +			// are ib, i2, i3 respectively. The blocks A12, A22 and
        +			// A23 are empty if ib = kd. The upper triangle of A13
        +			// lies outside the band.
        +			i2 := min(kd-ib, n-i-ib)
        +			if i2 > 0 {
        +				// Update A12.
        +				bi.Dtrsm(blas.Left, blas.Upper, blas.Trans, blas.NonUnit, ib, i2,
        +					1, ab[i*ldab:], ldab-1, ab[i*ldab+ib:], ldab-1)
        +				// Update A22.
        +				bi.Dsyrk(blas.Upper, blas.Trans, i2, ib,
        +					-1, ab[i*ldab+ib:], ldab-1, 1, ab[(i+ib)*ldab:], ldab-1)
        +			}
        +			i3 := min(ib, n-i-kd)
        +			if i3 > 0 {
        +				// Copy the lower triangle of A13 into the work array.
        +				for ii := 0; ii < ib; ii++ {
        +					for jj := 0; jj <= min(ii, i3-1); jj++ {
        +						work[ii*ldwork+jj] = ab[(i+ii)*ldab+kd-ii+jj]
        +					}
        +				}
        +				// Update A13 (in the work array).
        +				bi.Dtrsm(blas.Left, blas.Upper, blas.Trans, blas.NonUnit, ib, i3,
        +					1, ab[i*ldab:], ldab-1, work, ldwork)
        +				// Update A23.
        +				if i2 > 0 {
        +					bi.Dgemm(blas.Trans, blas.NoTrans, i2, i3, ib,
        +						-1, ab[i*ldab+ib:], ldab-1, work, ldwork,
        +						1, ab[(i+ib)*ldab+kd-ib:], ldab-1)
        +				}
        +				// Update A33.
        +				bi.Dsyrk(blas.Upper, blas.Trans, i3, ib,
        +					-1, work, ldwork, 1, ab[(i+kd)*ldab:], ldab-1)
        +				// Copy the lower triangle of A13 back into place.
        +				for ii := 0; ii < ib; ii++ {
        +					for jj := 0; jj <= min(ii, i3-1); jj++ {
        +						ab[(i+ii)*ldab+kd-ii+jj] = work[ii*ldwork+jj]
        +					}
        +				}
        +			}
        +		}
        +	} else {
        +		// Compute the Cholesky factorization of a symmetric band
        +		// matrix, given the lower triangle of the matrix in band
        +		// storage.
        +
        +		// Process the band matrix one diagonal block at a time.
        +		for i := 0; i < n; i += nb {
        +			ib := min(nb, n-i)
        +			// Factorize the diagonal block.
        +			ok := impl.Dpotf2(uplo, ib, ab[i*ldab+kd:], ldab-1)
        +			if !ok {
        +				return false
        +			}
        +			if i+ib >= n {
        +				continue
        +			}
        +			// Update the relevant part of the trailing submatrix.
        +			// If A11 denotes the diagonal block which has just been
        +			// factorized, then we need to update the remaining
        +			// blocks in the diagram:
        +			//
        +			//  A11
        +			//  A21   A22
        +			//  A31   A32   A33
        +			//
        +			// The numbers of rows and columns in the partitioning
        +			// are ib, i2, i3 respectively. The blocks A21, A22 and
        +			// A32 are empty if ib = kd. The lowr triangle of A31
        +			// lies outside the band.
        +			i2 := min(kd-ib, n-i-ib)
        +			if i2 > 0 {
        +				// Update A21.
        +				bi.Dtrsm(blas.Right, blas.Lower, blas.Trans, blas.NonUnit, i2, ib,
        +					1, ab[i*ldab+kd:], ldab-1, ab[(i+ib)*ldab+kd-ib:], ldab-1)
        +				// Update A22.
        +				bi.Dsyrk(blas.Lower, blas.NoTrans, i2, ib,
        +					-1, ab[(i+ib)*ldab+kd-ib:], ldab-1, 1, ab[(i+ib)*ldab+kd:], ldab-1)
        +			}
        +			i3 := min(ib, n-i-kd)
        +			if i3 > 0 {
        +				// Copy the upper triangle of A31 into the work array.
        +				for ii := 0; ii < i3; ii++ {
        +					for jj := ii; jj < ib; jj++ {
        +						work[ii*ldwork+jj] = ab[(ii+i+kd)*ldab+jj-ii]
        +					}
        +				}
        +				// Update A31 (in the work array).
        +				bi.Dtrsm(blas.Right, blas.Lower, blas.Trans, blas.NonUnit, i3, ib,
        +					1, ab[i*ldab+kd:], ldab-1, work, ldwork)
        +				// Update A32.
        +				if i2 > 0 {
        +					bi.Dgemm(blas.NoTrans, blas.Trans, i3, i2, ib,
        +						-1, work, ldwork, ab[(i+ib)*ldab+kd-ib:], ldab-1,
        +						1, ab[(i+kd)*ldab+ib:], ldab-1)
        +				}
        +				// Update A33.
        +				bi.Dsyrk(blas.Lower, blas.NoTrans, i3, ib,
        +					-1, work, ldwork, 1, ab[(i+kd)*ldab+kd:], ldab-1)
        +				// Copy the upper triangle of A31 back into place.
        +				for ii := 0; ii < i3; ii++ {
        +					for jj := ii; jj < ib; jj++ {
        +						ab[(ii+i+kd)*ldab+jj-ii] = work[ii*ldwork+jj]
        +					}
        +				}
        +			}
        +		}
        +	}
        +	return true
        +}
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dpbtrs.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dpbtrs.go
        new file mode 100644
        index 000000000..f3d9559db
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dpbtrs.go
        @@ -0,0 +1,67 @@
        +// Copyright ©2019 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package gonum
        +
        +import (
        +	"gonum.org/v1/gonum/blas"
        +	"gonum.org/v1/gonum/blas/blas64"
        +)
        +
        +// Dpbtrs solves a system of linear equations A*X = B with an n×n symmetric
        +// positive definite band matrix A using the Cholesky factorization
        +//  A = Uᵀ * U  if uplo == blas.Upper
        +//  A = L * Lᵀ  if uplo == blas.Lower
        +// computed by Dpbtrf. kd is the number of super- or sub-diagonals of A. See the
        +// documentation for Dpbtrf for a description of the band storage format of A.
        +//
        +// On entry, b contains the n×nrhs right hand side matrix B. On return, it is
        +// overwritten with the solution matrix X.
        +func (Implementation) Dpbtrs(uplo blas.Uplo, n, kd, nrhs int, ab []float64, ldab int, b []float64, ldb int) {
        +	switch {
        +	case uplo != blas.Upper && uplo != blas.Lower:
        +		panic(badUplo)
        +	case n < 0:
        +		panic(nLT0)
        +	case kd < 0:
        +		panic(kdLT0)
        +	case nrhs < 0:
        +		panic(nrhsLT0)
        +	case ldab < kd+1:
        +		panic(badLdA)
        +	case ldb < max(1, nrhs):
        +		panic(badLdB)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 || nrhs == 0 {
        +		return
        +	}
        +
        +	if len(ab) < (n-1)*ldab+kd+1 {
        +		panic(shortAB)
        +	}
        +	if len(b) < (n-1)*ldb+nrhs {
        +		panic(shortB)
        +	}
        +
        +	bi := blas64.Implementation()
        +	if uplo == blas.Upper {
        +		// Solve A*X = B where A = Uᵀ*U.
        +		for j := 0; j < nrhs; j++ {
        +			// Solve Uᵀ*Y = B, overwriting B with Y.
        +			bi.Dtbsv(blas.Upper, blas.Trans, blas.NonUnit, n, kd, ab, ldab, b[j:], ldb)
        +			// Solve U*X = Y, overwriting Y with X.
        +			bi.Dtbsv(blas.Upper, blas.NoTrans, blas.NonUnit, n, kd, ab, ldab, b[j:], ldb)
        +		}
        +	} else {
        +		// Solve A*X = B where A = L*Lᵀ.
        +		for j := 0; j < nrhs; j++ {
        +			// Solve L*Y = B, overwriting B with Y.
        +			bi.Dtbsv(blas.Lower, blas.NoTrans, blas.NonUnit, n, kd, ab, ldab, b[j:], ldb)
        +			// Solve Lᵀ*X = Y, overwriting Y with X.
        +			bi.Dtbsv(blas.Lower, blas.Trans, blas.NonUnit, n, kd, ab, ldab, b[j:], ldb)
        +		}
        +	}
        +}
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dpocon.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dpocon.go
        index 98d6c02b0..7af4c1872 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dpocon.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dpocon.go
        @@ -21,41 +21,55 @@ import (
         //
         // iwork is a temporary data slice of length at least n and Dpocon will panic otherwise.
         func (impl Implementation) Dpocon(uplo blas.Uplo, n int, a []float64, lda int, anorm float64, work []float64, iwork []int) float64 {
        -	checkMatrix(n, n, a, lda)
        -	if uplo != blas.Upper && uplo != blas.Lower {
        +	switch {
        +	case uplo != blas.Upper && uplo != blas.Lower:
         		panic(badUplo)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	case anorm < 0:
        +		panic(negANorm)
         	}
        -	if len(work) < 3*n {
        -		panic(badWork)
        -	}
        -	if len(iwork) < n {
        -		panic(badWork)
        -	}
        -	var rcond float64
        +
        +	// Quick return if possible.
         	if n == 0 {
         		return 1
         	}
        +
        +	switch {
        +	case len(a) < (n-1)*lda+n:
        +		panic(shortA)
        +	case len(work) < 3*n:
        +		panic(shortWork)
        +	case len(iwork) < n:
        +		panic(shortIWork)
        +	}
        +
         	if anorm == 0 {
        -		return rcond
        +		return 0
         	}
         
         	bi := blas64.Implementation()
        -	var ainvnm float64
        -	smlnum := dlamchS
        -	upper := uplo == blas.Upper
        -	var kase int
        -	var normin bool
        -	isave := new([3]int)
        -	var sl, su float64
        +
        +	var (
        +		smlnum = dlamchS
        +		rcond  float64
        +		sl, su float64
        +		normin bool
        +		ainvnm float64
        +		kase   int
        +		isave  [3]int
        +	)
         	for {
        -		ainvnm, kase = impl.Dlacn2(n, work[n:], work, iwork, ainvnm, kase, isave)
        +		ainvnm, kase = impl.Dlacn2(n, work[n:], work, iwork, ainvnm, kase, &isave)
         		if kase == 0 {
         			if ainvnm != 0 {
         				rcond = (1 / ainvnm) / anorm
         			}
         			return rcond
         		}
        -		if upper {
        +		if uplo == blas.Upper {
         			sl = impl.Dlatrs(blas.Upper, blas.Trans, blas.NonUnit, normin, n, a, lda, work, work[2*n:])
         			normin = true
         			su = impl.Dlatrs(blas.Upper, blas.NoTrans, blas.NonUnit, normin, n, a, lda, work, work[2*n:])
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dpotf2.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dpotf2.go
        index 3d1cfb68d..83411f1cf 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dpotf2.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dpotf2.go
        @@ -13,22 +13,32 @@ import (
         
         // Dpotf2 computes the Cholesky decomposition of the symmetric positive definite
         // matrix a. If ul == blas.Upper, then a is stored as an upper-triangular matrix,
        -// and a = U^T U is stored in place into a. If ul == blas.Lower, then a = L L^T
        +// and a = Uᵀ U is stored in place into a. If ul == blas.Lower, then a = L Lᵀ
         // is computed and stored in-place into a. If a is not positive definite, false
         // is returned. This is the unblocked version of the algorithm.
         //
         // Dpotf2 is an internal routine. It is exported for testing purposes.
         func (Implementation) Dpotf2(ul blas.Uplo, n int, a []float64, lda int) (ok bool) {
        -	if ul != blas.Upper && ul != blas.Lower {
        +	switch {
        +	case ul != blas.Upper && ul != blas.Lower:
         		panic(badUplo)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
         	}
        -	checkMatrix(n, n, a, lda)
         
        +	// Quick return if possible.
         	if n == 0 {
         		return true
         	}
         
        +	if len(a) < (n-1)*lda+n {
        +		panic(shortA)
        +	}
        +
         	bi := blas64.Implementation()
        +
         	if ul == blas.Upper {
         		for j := 0; j < n; j++ {
         			ajj := a[j*lda+j]
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dpotrf.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dpotrf.go
        index 0ff3afcc4..7c8168016 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dpotrf.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dpotrf.go
        @@ -11,19 +11,28 @@ import (
         
         // Dpotrf computes the Cholesky decomposition of the symmetric positive definite
         // matrix a. If ul == blas.Upper, then a is stored as an upper-triangular matrix,
        -// and a = U^T U is stored in place into a. If ul == blas.Lower, then a = L L^T
        +// and a = Uᵀ U is stored in place into a. If ul == blas.Lower, then a = L Lᵀ
         // is computed and stored in-place into a. If a is not positive definite, false
         // is returned. This is the blocked version of the algorithm.
         func (impl Implementation) Dpotrf(ul blas.Uplo, n int, a []float64, lda int) (ok bool) {
        -	if ul != blas.Upper && ul != blas.Lower {
        +	switch {
        +	case ul != blas.Upper && ul != blas.Lower:
         		panic(badUplo)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
         	}
        -	checkMatrix(n, n, a, lda)
         
        +	// Quick return if possible.
         	if n == 0 {
         		return true
         	}
         
        +	if len(a) < (n-1)*lda+n {
        +		panic(shortA)
        +	}
        +
         	nb := impl.Ilaenv(1, "DPOTRF", string(ul), n, -1, -1, -1)
         	if nb <= 1 || n <= nb {
         		return impl.Dpotf2(ul, n, a, lda)
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dpotri.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dpotri.go
        new file mode 100644
        index 000000000..6fa981c13
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dpotri.go
        @@ -0,0 +1,44 @@
        +// Copyright ©2019 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package gonum
        +
        +import "gonum.org/v1/gonum/blas"
        +
        +// Dpotri computes the inverse of a real symmetric positive definite matrix A
        +// using its Cholesky factorization.
        +//
        +// On entry, a contains the triangular factor U or L from the Cholesky
        +// factorization A = Uᵀ*U or A = L*Lᵀ, as computed by Dpotrf.
        +// On return, a contains the upper or lower triangle of the (symmetric)
        +// inverse of A, overwriting the input factor U or L.
        +func (impl Implementation) Dpotri(uplo blas.Uplo, n int, a []float64, lda int) (ok bool) {
        +	switch {
        +	case uplo != blas.Upper && uplo != blas.Lower:
        +		panic(badUplo)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return true
        +	}
        +
        +	if len(a) < (n-1)*lda+n {
        +		panic(shortA)
        +	}
        +
        +	// Invert the triangular Cholesky factor U or L.
        +	ok = impl.Dtrtri(uplo, blas.NonUnit, n, a, lda)
        +	if !ok {
        +		return false
        +	}
        +
        +	// Form inv(U)*inv(U)ᵀ or inv(L)ᵀ*inv(L).
        +	impl.Dlauum(uplo, n, a, lda)
        +	return true
        +}
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dpotrs.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dpotrs.go
        index 3c12423bf..8977013db 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dpotrs.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dpotrs.go
        @@ -12,35 +12,51 @@ import (
         // Dpotrs solves a system of n linear equations A*X = B where A is an n×n
         // symmetric positive definite matrix and B is an n×nrhs matrix. The matrix A is
         // represented by its Cholesky factorization
        -//  A = U^T*U  if uplo == blas.Upper
        -//  A = L*L^T  if uplo == blas.Lower
        +//  A = Uᵀ*U  if uplo == blas.Upper
        +//  A = L*Lᵀ  if uplo == blas.Lower
         // as computed by Dpotrf. On entry, B contains the right-hand side matrix B, on
         // return it contains the solution matrix X.
         func (Implementation) Dpotrs(uplo blas.Uplo, n, nrhs int, a []float64, lda int, b []float64, ldb int) {
        -	if uplo != blas.Upper && uplo != blas.Lower {
        +	switch {
        +	case uplo != blas.Upper && uplo != blas.Lower:
         		panic(badUplo)
        +	case n < 0:
        +		panic(nLT0)
        +	case nrhs < 0:
        +		panic(nrhsLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	case ldb < max(1, nrhs):
        +		panic(badLdB)
         	}
        -	checkMatrix(n, n, a, lda)
        -	checkMatrix(n, nrhs, b, ldb)
         
        +	// Quick return if possible.
         	if n == 0 || nrhs == 0 {
         		return
         	}
         
        +	switch {
        +	case len(a) < (n-1)*lda+n:
        +		panic(shortA)
        +	case len(b) < (n-1)*ldb+nrhs:
        +		panic(shortB)
        +	}
        +
         	bi := blas64.Implementation()
        +
         	if uplo == blas.Upper {
        -		// Solve U^T * U * X = B where U is stored in the upper triangle of A.
        +		// Solve Uᵀ * U * X = B where U is stored in the upper triangle of A.
         
        -		// Solve U^T * X = B, overwriting B with X.
        +		// Solve Uᵀ * X = B, overwriting B with X.
         		bi.Dtrsm(blas.Left, blas.Upper, blas.Trans, blas.NonUnit, n, nrhs, 1, a, lda, b, ldb)
         		// Solve U * X = B, overwriting B with X.
         		bi.Dtrsm(blas.Left, blas.Upper, blas.NoTrans, blas.NonUnit, n, nrhs, 1, a, lda, b, ldb)
         	} else {
        -		// Solve L * L^T * X = B where L is stored in the lower triangle of A.
        +		// Solve L * Lᵀ * X = B where L is stored in the lower triangle of A.
         
         		// Solve L * X = B, overwriting B with X.
         		bi.Dtrsm(blas.Left, blas.Lower, blas.NoTrans, blas.NonUnit, n, nrhs, 1, a, lda, b, ldb)
        -		// Solve L^T * X = B, overwriting B with X.
        +		// Solve Lᵀ * X = B, overwriting B with X.
         		bi.Dtrsm(blas.Left, blas.Lower, blas.Trans, blas.NonUnit, n, nrhs, 1, a, lda, b, ldb)
         	}
         }
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/drscl.go b/vendor/gonum.org/v1/gonum/lapack/gonum/drscl.go
        index 302c32301..b2772dbc2 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/drscl.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/drscl.go
        @@ -15,8 +15,24 @@ import (
         //
         // Drscl is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Drscl(n int, a float64, x []float64, incX int) {
        -	checkVector(n, x, incX)
        +	switch {
        +	case n < 0:
        +		panic(nLT0)
        +	case incX <= 0:
        +		panic(badIncX)
        +	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return
        +	}
        +
        +	if len(x) < 1+(n-1)*incX {
        +		panic(shortX)
        +	}
        +
         	bi := blas64.Implementation()
        +
         	cden := a
         	cnum := 1.0
         	smlnum := dlamchS
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dsteqr.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dsteqr.go
        index 90bf37d6f..d6c7861ab 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dsteqr.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dsteqr.go
        @@ -37,23 +37,29 @@ import (
         //
         // Dsteqr is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dsteqr(compz lapack.EVComp, n int, d, e, z []float64, ldz int, work []float64) (ok bool) {
        -	if n < 0 {
        +	switch {
        +	case compz != lapack.EVCompNone && compz != lapack.EVTridiag && compz != lapack.EVOrig:
        +		panic(badEVComp)
        +	case n < 0:
         		panic(nLT0)
        +	case ldz < 1, compz != lapack.EVCompNone && ldz < n:
        +		panic(badLdZ)
         	}
        -	if len(d) < n {
        -		panic(badD)
        -	}
        -	if len(e) < n-1 {
        -		panic(badE)
        -	}
        -	if compz != lapack.EVCompNone && compz != lapack.EVTridiag && compz != lapack.EVOrig {
        -		panic(badEVComp)
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return true
         	}
        -	if compz != lapack.EVCompNone {
        -		if len(work) < max(1, 2*n-2) {
        -			panic(badWork)
        -		}
        -		checkMatrix(n, n, z, ldz)
        +
        +	switch {
        +	case len(d) < n:
        +		panic(shortD)
        +	case len(e) < n-1:
        +		panic(shortE)
        +	case compz != lapack.EVCompNone && len(z) < (n-1)*ldz+n:
        +		panic(shortZ)
        +	case compz != lapack.EVCompNone && len(work) < max(1, 2*n-2):
        +		panic(shortWork)
         	}
         
         	var icompz int
        @@ -63,9 +69,6 @@ func (impl Implementation) Dsteqr(compz lapack.EVComp, n int, d, e, z []float64,
         		icompz = 2
         	}
         
        -	if n == 0 {
        -		return true
        -	}
         	if n == 1 {
         		if icompz == 2 {
         			z[0] = 1
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dsterf.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dsterf.go
        index 636cf1eb6..dc1e178df 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dsterf.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dsterf.go
        @@ -26,14 +26,21 @@ func (impl Implementation) Dsterf(n int, d, e []float64) (ok bool) {
         	if n < 0 {
         		panic(nLT0)
         	}
        +
        +	// Quick return if possible.
         	if n == 0 {
         		return true
         	}
        -	if len(d) < n {
        -		panic(badD)
        +
        +	switch {
        +	case len(d) < n:
        +		panic(shortD)
        +	case len(e) < n-1:
        +		panic(shortE)
         	}
        -	if len(e) < n-1 {
        -		panic(badE)
        +
        +	if n == 1 {
        +		return true
         	}
         
         	const (
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dsyev.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dsyev.go
        index 29a783192..5f57f3a5c 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dsyev.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dsyev.go
        @@ -28,45 +28,55 @@ import (
         // limited by the usable length. If lwork == -1, instead of computing Dsyev the
         // optimal work length is stored into work[0].
         func (impl Implementation) Dsyev(jobz lapack.EVJob, uplo blas.Uplo, n int, a []float64, lda int, w, work []float64, lwork int) (ok bool) {
        -	checkMatrix(n, n, a, lda)
        -	upper := uplo == blas.Upper
        -	var wantz bool
        -	switch jobz {
        -	default:
        +	switch {
        +	case jobz != lapack.EVNone && jobz != lapack.EVCompute:
         		panic(badEVJob)
        -	case lapack.EVCompute:
        -		wantz = true
        -	case lapack.EVNone:
        +	case uplo != blas.Upper && uplo != blas.Lower:
        +		panic(badUplo)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	case lwork < max(1, 3*n-1) && lwork != -1:
        +		panic(badLWork)
        +	case len(work) < max(1, lwork):
        +		panic(shortWork)
         	}
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return true
        +	}
        +
         	var opts string
        -	if upper {
        +	if uplo == blas.Upper {
         		opts = "U"
         	} else {
         		opts = "L"
         	}
         	nb := impl.Ilaenv(1, "DSYTRD", opts, n, -1, -1, -1)
         	lworkopt := max(1, (nb+2)*n)
        -	work[0] = float64(lworkopt)
         	if lwork == -1 {
        +		work[0] = float64(lworkopt)
         		return
         	}
        -	if len(work) < lwork {
        -		panic(badWork)
        -	}
        -	if lwork < 3*n-1 {
        -		panic(badWork)
        -	}
        -	if n == 0 {
        -		return true
        +
        +	switch {
        +	case len(a) < (n-1)*lda+n:
        +		panic(shortA)
        +	case len(w) < n:
        +		panic(shortW)
         	}
        +
         	if n == 1 {
         		w[0] = a[0]
         		work[0] = 2
        -		if wantz {
        +		if jobz == lapack.EVCompute {
         			a[0] = 1
         		}
         		return true
         	}
        +
         	safmin := dlamchS
         	eps := dlamchP
         	smlnum := safmin / eps
        @@ -87,7 +97,7 @@ func (impl Implementation) Dsyev(jobz lapack.EVJob, uplo blas.Uplo, n int, a []f
         	}
         	if scaled {
         		kind := lapack.LowerTri
        -		if upper {
        +		if uplo == blas.Upper {
         			kind = lapack.UpperTri
         		}
         		impl.Dlascl(kind, 0, 0, 1, sigma, n, n, a, lda)
        @@ -100,7 +110,7 @@ func (impl Implementation) Dsyev(jobz lapack.EVJob, uplo blas.Uplo, n int, a []f
         
         	// For eigenvalues only, call Dsterf. For eigenvectors, first call Dorgtr
         	// to generate the orthogonal matrix, then call Dsteqr.
        -	if !wantz {
        +	if jobz == lapack.EVNone {
         		ok = impl.Dsterf(n, w, work[inde:])
         	} else {
         		impl.Dorgtr(uplo, n, a, lda, work[indtau:], work[indwork:], llwork)
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dsytd2.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dsytd2.go
        index b6dc60c03..8658f4e5c 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dsytd2.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dsytd2.go
        @@ -9,15 +9,15 @@ import (
         	"gonum.org/v1/gonum/blas/blas64"
         )
         
        -// Dsytd2 reduces a symmetric n×n matrix A to symmetric tridiagonal form T by an
        -// orthogonal similarity transformation
        -//  Q^T * A * Q = T
        +// Dsytd2 reduces a symmetric n×n matrix A to symmetric tridiagonal form T by
        +// an orthogonal similarity transformation
        +//  Qᵀ * A * Q = T
         // On entry, the matrix is contained in the specified triangle of a. On exit,
         // if uplo == blas.Upper, the diagonal and first super-diagonal of a are
         // overwritten with the elements of T. The elements above the first super-diagonal
        -// are overwritten with the the elementary reflectors that are used with the
        -// elements written to tau in order to construct Q. If uplo == blas.Lower, the
        -// elements are written in the lower triangular region.
        +// are overwritten with the elementary reflectors that are used with
        +// the elements written to tau in order to construct Q. If uplo == blas.Lower,
        +// the elements are written in the lower triangular region.
         //
         // d must have length at least n. e and tau must have length at least n-1. Dsytd2
         // will panic if these sizes are not met.
        @@ -28,7 +28,7 @@ import (
         // and if uplo == blas.Lower
         //  Q = H_0 * H_1 * ... * H_{n-2}
         // where
        -//  H_i = I - tau * v * v^T
        +//  H_i = I - tau * v * vᵀ
         // where tau is stored in tau[i], and v is stored in a.
         //
         // If uplo == blas.Upper, v[0:i-1] is stored in A[0:i-1,i+1], v[i] = 1, and
        @@ -49,24 +49,37 @@ import (
         //
         // Dsytd2 is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dsytd2(uplo blas.Uplo, n int, a []float64, lda int, d, e, tau []float64) {
        -	checkMatrix(n, n, a, lda)
        -	if len(d) < n {
        -		panic(badD)
        +	switch {
        +	case uplo != blas.Upper && uplo != blas.Lower:
        +		panic(badUplo)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
         	}
        -	if len(e) < n-1 {
        -		panic(badE)
        -	}
        -	if len(tau) < n-1 {
        -		panic(badTau)
        -	}
        -	if n <= 0 {
        +
        +	// Quick return if possible.
        +	if n == 0 {
         		return
         	}
        +
        +	switch {
        +	case len(a) < (n-1)*lda+n:
        +		panic(shortA)
        +	case len(d) < n:
        +		panic(shortD)
        +	case len(e) < n-1:
        +		panic(shortE)
        +	case len(tau) < n-1:
        +		panic(shortTau)
        +	}
        +
         	bi := blas64.Implementation()
        +
         	if uplo == blas.Upper {
         		// Reduce the upper triangle of A.
         		for i := n - 2; i >= 0; i-- {
        -			// Generate elementary reflector H_i = I - tau * v * v^T to
        +			// Generate elementary reflector H_i = I - tau * v * vᵀ to
         			// annihilate A[i:i-1, i+1].
         			var taui float64
         			a[i*lda+i+1], taui = impl.Dlarfg(i+1, a[i*lda+i+1], a[i+1:], lda)
        @@ -78,12 +91,12 @@ func (impl Implementation) Dsytd2(uplo blas.Uplo, n int, a []float64, lda int, d
         				// Compute x := tau * A * v storing x in tau[0:i].
         				bi.Dsymv(uplo, i+1, taui, a, lda, a[i+1:], lda, 0, tau, 1)
         
        -				// Compute w := x - 1/2 * tau * (x^T * v) * v.
        +				// Compute w := x - 1/2 * tau * (xᵀ * v) * v.
         				alpha := -0.5 * taui * bi.Ddot(i+1, tau, 1, a[i+1:], lda)
         				bi.Daxpy(i+1, alpha, a[i+1:], lda, tau, 1)
         
         				// Apply the transformation as a rank-2 update
        -				// A = A - v * w^T - w * v^T.
        +				// A = A - v * wᵀ - w * vᵀ.
         				bi.Dsyr2(uplo, i+1, -1, a[i+1:], lda, tau, 1, a, lda)
         				a[i*lda+i+1] = e[i]
         			}
        @@ -95,7 +108,7 @@ func (impl Implementation) Dsytd2(uplo blas.Uplo, n int, a []float64, lda int, d
         	}
         	// Reduce the lower triangle of A.
         	for i := 0; i < n-1; i++ {
        -		// Generate elementary reflector H_i = I - tau * v * v^T to
        +		// Generate elementary reflector H_i = I - tau * v * vᵀ to
         		// annihilate A[i+2:n, i].
         		var taui float64
         		a[(i+1)*lda+i], taui = impl.Dlarfg(n-i-1, a[(i+1)*lda+i], a[min(i+2, n-1)*lda+i:], lda)
        @@ -107,12 +120,12 @@ func (impl Implementation) Dsytd2(uplo blas.Uplo, n int, a []float64, lda int, d
         			// Compute x := tau * A * v, storing y in tau[i:n-1].
         			bi.Dsymv(uplo, n-i-1, taui, a[(i+1)*lda+i+1:], lda, a[(i+1)*lda+i:], lda, 0, tau[i:], 1)
         
        -			// Compute w := x - 1/2 * tau * (x^T * v) * v.
        +			// Compute w := x - 1/2 * tau * (xᵀ * v) * v.
         			alpha := -0.5 * taui * bi.Ddot(n-i-1, tau[i:], 1, a[(i+1)*lda+i:], lda)
         			bi.Daxpy(n-i-1, alpha, a[(i+1)*lda+i:], lda, tau[i:], 1)
         
         			// Apply the transformation as a rank-2 update
        -			// A = A - v * w^T - w * v^T.
        +			// A = A - v * wᵀ - w * vᵀ.
         			bi.Dsyr2(uplo, n-i-1, -1, a[(i+1)*lda+i:], lda, tau[i:], 1, a[(i+1)*lda+i+1:], lda)
         			a[(i+1)*lda+i] = e[i]
         		}
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dsytrd.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dsytrd.go
        index b079140cf..262a56c9a 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dsytrd.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dsytrd.go
        @@ -11,7 +11,7 @@ import (
         
         // Dsytrd reduces a symmetric n×n matrix A to symmetric tridiagonal form by an
         // orthogonal similarity transformation
        -//  Q^T * A * Q = T
        +//  Qᵀ * A * Q = T
         // where Q is an orthonormal matrix and T is symmetric and tridiagonal.
         //
         // On entry, a contains the elements of the input matrix in the triangle specified
        @@ -23,7 +23,7 @@ import (
         // If uplo == blas.Upper, Q is constructed with
         //  Q = H_{n-2} * ... * H_1 * H_0
         // where
        -//  H_i = I - tau_i * v * v^T
        +//  H_i = I - tau_i * v * vᵀ
         // v is constructed as v[i+1:n] = 0, v[i] = 1, v[0:i-1] is stored in A[0:i-1, i+1].
         // The elements of A are
         //  [ d   e  v1  v2  v3]
        @@ -35,7 +35,7 @@ import (
         // If uplo == blas.Lower, Q is constructed with
         //  Q = H_0 * H_1 * ... * H_{n-2}
         // where
        -//  H_i = I - tau_i * v * v^T
        +//  H_i = I - tau_i * v * vᵀ
         // v is constructed as v[0:i+1] = 0, v[i+1] = 1, v[i+2:n] is stored in A[i+2:n, i].
         // The elements of A are
         //  [ d                ]
        @@ -55,68 +55,62 @@ import (
         //
         // Dsytrd is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dsytrd(uplo blas.Uplo, n int, a []float64, lda int, d, e, tau, work []float64, lwork int) {
        -	checkMatrix(n, n, a, lda)
        -	if len(d) < n {
        -		panic(badD)
        -	}
        -	if len(e) < n-1 {
        -		panic(badE)
        -	}
        -	if len(tau) < n-1 {
        -		panic(badTau)
        -	}
        -	if len(work) < lwork {
        -		panic(shortWork)
        -	}
        -	if lwork != -1 && lwork < 1 {
        -		panic(badWork)
        -	}
        -
        -	var upper bool
        -	var opts string
        -	switch uplo {
        -	case blas.Upper:
        -		upper = true
        -		opts = "U"
        -	case blas.Lower:
        -		opts = "L"
        -	default:
        +	switch {
        +	case uplo != blas.Upper && uplo != blas.Lower:
         		panic(badUplo)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	case lwork < 1 && lwork != -1:
        +		panic(badLWork)
        +	case len(work) < max(1, lwork):
        +		panic(shortWork)
         	}
         
        +	// Quick return if possible.
         	if n == 0 {
         		work[0] = 1
         		return
         	}
         
        -	nb := impl.Ilaenv(1, "DSYTRD", opts, n, -1, -1, -1)
        +	nb := impl.Ilaenv(1, "DSYTRD", string(uplo), n, -1, -1, -1)
         	lworkopt := n * nb
         	if lwork == -1 {
         		work[0] = float64(lworkopt)
         		return
         	}
         
        -	nx := n
        +	switch {
        +	case len(a) < (n-1)*lda+n:
        +		panic(shortA)
        +	case len(d) < n:
        +		panic(shortD)
        +	case len(e) < n-1:
        +		panic(shortE)
        +	case len(tau) < n-1:
        +		panic(shortTau)
        +	}
        +
         	bi := blas64.Implementation()
        +
        +	nx := n
        +	iws := 1
         	var ldwork int
         	if 1 < nb && nb < n {
         		// Determine when to cross over from blocked to unblocked code. The last
         		// block is always handled by unblocked code.
        -		opts := "L"
        -		if upper {
        -			opts = "U"
        -		}
        -		nx = max(nb, impl.Ilaenv(3, "DSYTRD", opts, n, -1, -1, -1))
        +		nx = max(nb, impl.Ilaenv(3, "DSYTRD", string(uplo), n, -1, -1, -1))
         		if nx < n {
         			// Determine if workspace is large enough for blocked code.
         			ldwork = nb
        -			iws := n * ldwork
        +			iws = n * ldwork
         			if lwork < iws {
         				// Not enough workspace to use optimal nb: determine the minimum
         				// value of nb and reduce nb or force use of unblocked code by
         				// setting nx = n.
         				nb = max(lwork/n, 1)
        -				nbmin := impl.Ilaenv(2, "DSYTRD", opts, n, -1, -1, -1)
        +				nbmin := impl.Ilaenv(2, "DSYTRD", string(uplo), n, -1, -1, -1)
         				if nb < nbmin {
         					nx = n
         				}
        @@ -129,7 +123,7 @@ func (impl Implementation) Dsytrd(uplo blas.Uplo, n int, a []float64, lda int, d
         	}
         	ldwork = nb
         
        -	if upper {
        +	if uplo == blas.Upper {
         		// Reduce the upper triangle of A. Columns 0:kk are handled by the
         		// unblocked method.
         		var i int
        @@ -140,7 +134,7 @@ func (impl Implementation) Dsytrd(uplo blas.Uplo, n int, a []float64, lda int, d
         			impl.Dlatrd(uplo, i+nb, nb, a, lda, e, tau, work, ldwork)
         
         			// Update the unreduced submatrix A[0:i-1,0:i-1], using an update
        -			// of the form A = A - V*W^T - W*V^T.
        +			// of the form A = A - V*Wᵀ - W*Vᵀ.
         			bi.Dsyr2k(uplo, blas.NoTrans, i, nb, -1, a[i:], lda, work, ldwork, 1, a, lda)
         
         			// Copy superdiagonal elements back into A, and diagonal elements into D.
        @@ -161,7 +155,7 @@ func (impl Implementation) Dsytrd(uplo blas.Uplo, n int, a []float64, lda int, d
         			impl.Dlatrd(uplo, n-i, nb, a[i*lda+i:], lda, e[i:], tau[i:], work, ldwork)
         
         			// Update the unreduced submatrix A[i+ib:n, i+ib:n], using an update
        -			// of the form A = A + V*W^T - W*V^T.
        +			// of the form A = A + V*Wᵀ - W*Vᵀ.
         			bi.Dsyr2k(uplo, blas.NoTrans, n-i-nb, nb, -1, a[(i+nb)*lda+i:], lda,
         				work[nb*ldwork:], ldwork, 1, a[(i+nb)*lda+i+nb:], lda)
         
        @@ -174,5 +168,5 @@ func (impl Implementation) Dsytrd(uplo blas.Uplo, n int, a []float64, lda int, d
         		// Use unblocked code to reduce the last or only block.
         		impl.Dsytd2(uplo, n-i, a[i*lda+i:], lda, d[i:], e[i:], tau[i:])
         	}
        -	work[0] = float64(lworkopt)
        +	work[0] = float64(iws)
         }
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dtgsja.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dtgsja.go
        index 8a1beefe3..3628ca628 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dtgsja.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dtgsja.go
        @@ -38,7 +38,7 @@ import (
         //
         // On exit,
         //
        -//  U^T*A*Q = D1*[ 0 R ], V^T*B*Q = D2*[ 0 R ],
        +//  Uᵀ*A*Q = D1*[ 0 R ], Vᵀ*B*Q = D2*[ 0 R ],
         //
         // where U, V and Q are orthogonal matrices.
         // R is a non-singular upper triangular matrix, and D1 and D2 are
        @@ -103,7 +103,7 @@ import (
         // min(l,m-k)×l triangular or trapezoidal matrix A23 and l×l
         // matrix B13 to the form:
         //
        -//  U1^T*A13*Q1 = C1*R1; V1^T*B13*Q1 = S1*R1,
        +//  U1ᵀ*A13*Q1 = C1*R1; V1ᵀ*B13*Q1 = S1*R1,
         //
         // where U1, V1 and Q1 are orthogonal matrices. C1 and S1 are diagonal
         // matrices satisfying
        @@ -159,45 +159,61 @@ import (
         func (impl Implementation) Dtgsja(jobU, jobV, jobQ lapack.GSVDJob, m, p, n, k, l int, a []float64, lda int, b []float64, ldb int, tola, tolb float64, alpha, beta, u []float64, ldu int, v []float64, ldv int, q []float64, ldq int, work []float64) (cycles int, ok bool) {
         	const maxit = 40
         
        -	checkMatrix(m, n, a, lda)
        -	checkMatrix(p, n, b, ldb)
        -
        -	if len(alpha) != n {
        -		panic(badAlpha)
        -	}
        -	if len(beta) != n {
        -		panic(badBeta)
        -	}
        -
         	initu := jobU == lapack.GSVDUnit
         	wantu := initu || jobU == lapack.GSVDU
        -	if !initu && !wantu && jobU != lapack.GSVDNone {
        -		panic(badGSVDJob + "U")
        -	}
        -	if jobU != lapack.GSVDNone {
        -		checkMatrix(m, m, u, ldu)
        -	}
         
         	initv := jobV == lapack.GSVDUnit
         	wantv := initv || jobV == lapack.GSVDV
        -	if !initv && !wantv && jobV != lapack.GSVDNone {
        -		panic(badGSVDJob + "V")
        -	}
        -	if jobV != lapack.GSVDNone {
        -		checkMatrix(p, p, v, ldv)
        -	}
         
         	initq := jobQ == lapack.GSVDUnit
         	wantq := initq || jobQ == lapack.GSVDQ
        -	if !initq && !wantq && jobQ != lapack.GSVDNone {
        +
        +	switch {
        +	case !initu && !wantu && jobU != lapack.GSVDNone:
        +		panic(badGSVDJob + "U")
        +	case !initv && !wantv && jobV != lapack.GSVDNone:
        +		panic(badGSVDJob + "V")
        +	case !initq && !wantq && jobQ != lapack.GSVDNone:
         		panic(badGSVDJob + "Q")
        -	}
        -	if jobQ != lapack.GSVDNone {
        -		checkMatrix(n, n, q, ldq)
        -	}
        +	case m < 0:
        +		panic(mLT0)
        +	case p < 0:
        +		panic(pLT0)
        +	case n < 0:
        +		panic(nLT0)
        +
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	case len(a) < (m-1)*lda+n:
        +		panic(shortA)
        +
        +	case ldb < max(1, n):
        +		panic(badLdB)
        +	case len(b) < (p-1)*ldb+n:
        +		panic(shortB)
        +
        +	case len(alpha) != n:
        +		panic(badLenAlpha)
        +	case len(beta) != n:
        +		panic(badLenBeta)
        +
        +	case ldu < 1, wantu && ldu < m:
        +		panic(badLdU)
        +	case wantu && len(u) < (m-1)*ldu+m:
        +		panic(shortU)
        +
        +	case ldv < 1, wantv && ldv < p:
        +		panic(badLdV)
        +	case wantv && len(v) < (p-1)*ldv+p:
        +		panic(shortV)
        +
        +	case ldq < 1, wantq && ldq < n:
        +		panic(badLdQ)
        +	case wantq && len(q) < (n-1)*ldq+n:
        +		panic(shortQ)
         
        -	if len(work) < 2*n {
        -		panic(badWork)
        +	case len(work) < 2*n:
        +		panic(shortWork)
         	}
         
         	// Initialize U, V and Q, if necessary
        @@ -247,12 +263,12 @@ func (impl Implementation) Dtgsja(jobU, jobV, jobQ lapack.GSVDJob, m, p, n, k, l
         
         				csu, snu, csv, snv, csq, snq := impl.Dlags2(upper, a1, a2, a3, b1, b2, b3)
         
        -				// Update (k+i)-th and (k+j)-th rows of matrix A: U^T*A.
        +				// Update (k+i)-th and (k+j)-th rows of matrix A: Uᵀ*A.
         				if k+j < m {
         					bi.Drot(l, a[(k+j)*lda+n-l:], 1, a[(k+i)*lda+n-l:], 1, csu, snu)
         				}
         
        -				// Update i-th and j-th rows of matrix B: V^T*B.
        +				// Update i-th and j-th rows of matrix B: Vᵀ*B.
         				bi.Drot(l, b[j*ldb+n-l:], 1, b[i*ldb+n-l:], 1, csv, snv)
         
         				// Update (n-l+i)-th and (n-l+j)-th columns of matrices
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dtrcon.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dtrcon.go
        index 42d9648f4..899c95dd5 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dtrcon.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dtrcon.go
        @@ -19,24 +19,32 @@ import (
         //
         // iwork is a temporary data slice of length at least n and Dtrcon will panic otherwise.
         func (impl Implementation) Dtrcon(norm lapack.MatrixNorm, uplo blas.Uplo, diag blas.Diag, n int, a []float64, lda int, work []float64, iwork []int) float64 {
        -	if norm != lapack.MaxColumnSum && norm != lapack.MaxRowSum {
        +	switch {
        +	case norm != lapack.MaxColumnSum && norm != lapack.MaxRowSum:
         		panic(badNorm)
        -	}
        -	if uplo != blas.Upper && uplo != blas.Lower {
        +	case uplo != blas.Upper && uplo != blas.Lower:
         		panic(badUplo)
        -	}
        -	if diag != blas.NonUnit && diag != blas.Unit {
        +	case diag != blas.NonUnit && diag != blas.Unit:
         		panic(badDiag)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
         	}
        -	if len(work) < 3*n {
        -		panic(badWork)
        -	}
        -	if len(iwork) < n {
        -		panic(badWork)
        -	}
        +
         	if n == 0 {
         		return 1
         	}
        +
        +	switch {
        +	case len(a) < (n-1)*lda+n:
        +		panic(shortA)
        +	case len(work) < 3*n:
        +		panic(shortWork)
        +	case len(iwork) < n:
        +		panic(shortIWork)
        +	}
        +
         	bi := blas64.Implementation()
         
         	var rcond float64
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dtrevc3.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dtrevc3.go
        index a99d9fa76..c6568665f 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dtrevc3.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dtrevc3.go
        @@ -15,14 +15,14 @@ import (
         // Dtrevc3 computes some or all of the right and/or left eigenvectors of an n×n
         // upper quasi-triangular matrix T in Schur canonical form. Matrices of this
         // type are produced by the Schur factorization of a real general matrix A
        -//  A = Q T Q^T,
        +//  A = Q T Qᵀ,
         // as computed by Dhseqr.
         //
         // The right eigenvector x of T corresponding to an
         // eigenvalue λ is defined by
         //  T x = λ x,
         // and the left eigenvector y is defined by
        -//  y^T T = λ y^T.
        +//  yᵀ T = λ yᵀ.
         //
         // The eigenvalues are read directly from the diagonal blocks of T.
         //
        @@ -62,7 +62,7 @@ import (
         //
         // On entry, if howmny is lapack.EVAllMulQ, it is assumed that VL (if side
         // is lapack.EVLeft or lapack.EVBoth) contains an n×n matrix QL,
        -// and that VR (if side is lapack.EVLeft or lapack.EVBoth) contains
        +// and that VR (if side is lapack.EVRight or lapack.EVBoth) contains
         // an n×n matrix QR. QL and QR are typically the orthogonal matrix Q of Schur
         // vectors returned by Dhseqr.
         //
        @@ -106,86 +106,110 @@ import (
         //
         // Dtrevc3 is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dtrevc3(side lapack.EVSide, howmny lapack.EVHowMany, selected []bool, n int, t []float64, ldt int, vl []float64, ldvl int, vr []float64, ldvr int, mm int, work []float64, lwork int) (m int) {
        -	switch side {
        -	default:
        +	bothv := side == lapack.EVBoth
        +	rightv := side == lapack.EVRight || bothv
        +	leftv := side == lapack.EVLeft || bothv
        +	switch {
        +	case !rightv && !leftv:
         		panic(badEVSide)
        -	case lapack.EVRight, lapack.EVLeft, lapack.EVBoth:
        -	}
        -	switch howmny {
        -	default:
        +	case howmny != lapack.EVAll && howmny != lapack.EVAllMulQ && howmny != lapack.EVSelected:
         		panic(badEVHowMany)
        -	case lapack.EVAll, lapack.EVAllMulQ, lapack.EVSelected:
        -	}
        -	switch {
         	case n < 0:
         		panic(nLT0)
        -	case len(work) < lwork:
        -		panic(shortWork)
        +	case ldt < max(1, n):
        +		panic(badLdT)
        +	case mm < 0:
        +		panic(mmLT0)
        +	case ldvl < 1:
        +		// ldvl and ldvr are also checked below after the computation of
        +		// m (number of columns of VL and VR) in case of howmny == EVSelected.
        +		panic(badLdVL)
        +	case ldvr < 1:
        +		panic(badLdVR)
         	case lwork < max(1, 3*n) && lwork != -1:
        -		panic(badWork)
        -	}
        -	if lwork != -1 {
        -		if howmny == lapack.EVSelected {
        -			if len(selected) != n {
        -				panic("lapack: bad selected length")
        -			}
        -			// Set m to the number of columns required to store the
        -			// selected eigenvectors, and standardize the slice
        -			// selected.
        -			for j := 0; j < n; {
        -				if j == n-1 || t[(j+1)*ldt+j] == 0 {
        -					// Diagonal 1×1 block corresponding to a
        -					// real eigenvalue.
        -					if selected[j] {
        -						m++
        -					}
        -					j++
        -				} else {
        -					// Diagonal 2×2 block corresponding to a
        -					// complex eigenvalue.
        -					if selected[j] || selected[j+1] {
        -						selected[j] = true
        -						selected[j+1] = false
        -						m += 2
        -					}
        -					j += 2
        -				}
        -			}
        -		} else {
        -			m = n
        -		}
        -		if m > mm {
        -			panic("lapack: insufficient number of columns")
        -		}
        -		checkMatrix(n, n, t, ldt)
        -		if (side == lapack.EVRight || side == lapack.EVBoth) && m > 0 {
        -			checkMatrix(n, m, vr, ldvr)
        -		}
        -		if (side == lapack.EVLeft || side == lapack.EVBoth) && m > 0 {
        -			checkMatrix(n, m, vl, ldvl)
        -		}
        +		panic(badLWork)
        +	case len(work) < max(1, lwork):
        +		panic(shortWork)
         	}
         
         	// Quick return if possible.
         	if n == 0 {
         		work[0] = 1
        -		return m
        +		return 0
         	}
         
        -	const (
        -		nbmin = 8
        -		nbmax = 128
        -	)
        -	nb := impl.Ilaenv(1, "DTREVC", string(side)+string(howmny), n, -1, -1, -1)
        +	// Normally we don't check slice lengths until after the workspace
        +	// query. However, even in case of the workspace query we need to
        +	// compute and return the value of m, and since the computation accesses t,
        +	// we put the length check of t here.
        +	if len(t) < (n-1)*ldt+n {
        +		panic(shortT)
        +	}
        +
        +	if howmny == lapack.EVSelected {
        +		if len(selected) != n {
        +			panic(badLenSelected)
        +		}
        +		// Set m to the number of columns required to store the selected
        +		// eigenvectors, and standardize the slice selected.
        +		// Each selected real eigenvector occupies one column and each
        +		// selected complex eigenvector occupies two columns.
        +		for j := 0; j < n; {
        +			if j == n-1 || t[(j+1)*ldt+j] == 0 {
        +				// Diagonal 1×1 block corresponding to a
        +				// real eigenvalue.
        +				if selected[j] {
        +					m++
        +				}
        +				j++
        +			} else {
        +				// Diagonal 2×2 block corresponding to a
        +				// complex eigenvalue.
        +				if selected[j] || selected[j+1] {
        +					selected[j] = true
        +					selected[j+1] = false
        +					m += 2
        +				}
        +				j += 2
        +			}
        +		}
        +	} else {
        +		m = n
        +	}
        +	if mm < m {
        +		panic(badMm)
        +	}
         
         	// Quick return in case of a workspace query.
        +	nb := impl.Ilaenv(1, "DTREVC", string(side)+string(howmny), n, -1, -1, -1)
         	if lwork == -1 {
         		work[0] = float64(n + 2*n*nb)
         		return m
         	}
         
        +	// Quick return if no eigenvectors were selected.
        +	if m == 0 {
        +		return 0
        +	}
        +
        +	switch {
        +	case leftv && ldvl < mm:
        +		panic(badLdVL)
        +	case leftv && len(vl) < (n-1)*ldvl+mm:
        +		panic(shortVL)
        +
        +	case rightv && ldvr < mm:
        +		panic(badLdVR)
        +	case rightv && len(vr) < (n-1)*ldvr+mm:
        +		panic(shortVR)
        +	}
        +
         	// Use blocked version of back-transformation if sufficient workspace.
         	// Zero-out the workspace to avoid potential NaN propagation.
        +	const (
        +		nbmin = 8
        +		nbmax = 128
        +	)
         	if howmny == lapack.EVAllMulQ && lwork >= n+2*n*nbmin {
         		nb = min((lwork-n)/(2*n), nbmax)
         		impl.Dlaset(blas.All, n, 1+2*nb, 0, 0, work[:n+2*nb*n], 1+2*nb)
        @@ -590,7 +614,7 @@ leftev:
         				b[k*ldb+iv] = -t[ki*ldt+k]
         			}
         			// Solve transposed quasi-triangular system:
        -			//  [ T[ki+1:n,ki+1:n] - wr ]^T * X = scale*b
        +			//  [ T[ki+1:n,ki+1:n] - wr ]ᵀ * X = scale*b
         			vmax := 1.0
         			vcrit := bignum
         			for j := ki + 1; j < n; {
        @@ -603,10 +627,9 @@ leftev:
         						rec := 1 / vmax
         						bi.Dscal(n-ki, rec, b[ki*ldb+iv:], ldb)
         						vmax = 1
        -						vcrit = bignum
         					}
         					b[j*ldb+iv] -= bi.Ddot(j-ki-1, t[(ki+1)*ldt+j:], ldt, b[(ki+1)*ldb+iv:], ldb)
        -					// Solve [ T[j,j] - wr ]^T * X = b.
        +					// Solve [ T[j,j] - wr ]ᵀ * X = b.
         					scale, _, _ := impl.Dlaln2(false, 1, 1, smin, 1, t[j*ldt+j:], ldt,
         						1, 1, b[j*ldb+iv:], ldb, wr, 0, x[:1], 2)
         					// Scale if necessary.
        @@ -624,15 +647,14 @@ leftev:
         					// when forming the right-hand side.
         					beta := math.Max(norms[j], norms[j+1])
         					if beta > vcrit {
        -						bi.Dscal(n-ki+1, 1/vmax, b[ki*ldb+iv:], 1)
        +						bi.Dscal(n-ki, 1/vmax, b[ki*ldb+iv:], ldb)
         						vmax = 1
        -						vcrit = bignum
         					}
         					b[j*ldb+iv] -= bi.Ddot(j-ki-1, t[(ki+1)*ldt+j:], ldt, b[(ki+1)*ldb+iv:], ldb)
         					b[(j+1)*ldb+iv] -= bi.Ddot(j-ki-1, t[(ki+1)*ldt+j+1:], ldt, b[(ki+1)*ldb+iv:], ldb)
         					// Solve
        -					//  [ T[j,j]-wr  T[j,j+1]      ]^T * X = scale*[ b1 ]
        -					//  [ T[j+1,j]   T[j+1,j+1]-wr ]               [ b2 ]
        +					//  [ T[j,j]-wr  T[j,j+1]      ]ᵀ * X = scale*[ b1 ]
        +					//  [ T[j+1,j]   T[j+1,j+1]-wr ]              [ b2 ]
         					scale, _, _ := impl.Dlaln2(true, 2, 1, smin, 1, t[j*ldt+j:], ldt,
         						1, 1, b[j*ldb+iv:], ldb, wr, 0, x[:3], 2)
         					// Scale if necessary.
        @@ -680,8 +702,8 @@ leftev:
         			// Complex left eigenvector.
         
         			// Initial solve:
        -			// [ [ T[ki,ki]   T[ki,ki+1]   ]^T - (wr - i* wi) ]*X = 0.
        -			// [ [ T[ki+1,ki] T[ki+1,ki+1] ]                  ]
        +			// [ [ T[ki,ki]   T[ki,ki+1]   ]ᵀ - (wr - i* wi) ]*X = 0.
        +			// [ [ T[ki+1,ki] T[ki+1,ki+1] ]                 ]
         			if math.Abs(t[ki*ldt+ki+1]) >= math.Abs(t[(ki+1)*ldt+ki]) {
         				b[ki*ldb+iv] = wi / t[ki*ldt+ki+1]
         				b[(ki+1)*ldb+iv+1] = 1
        @@ -697,7 +719,7 @@ leftev:
         				b[k*ldb+iv+1] = -b[(ki+1)*ldb+iv+1] * t[(ki+1)*ldt+k]
         			}
         			// Solve transposed quasi-triangular system:
        -			// [ T[ki+2:n,ki+2:n]^T - (wr-i*wi) ]*X = b1+i*b2
        +			// [ T[ki+2:n,ki+2:n]ᵀ - (wr-i*wi) ]*X = b1+i*b2
         			vmax := 1.0
         			vcrit := bignum
         			for j := ki + 2; j < n; {
        @@ -711,7 +733,6 @@ leftev:
         						bi.Dscal(n-ki, rec, b[ki*ldb+iv:], ldb)
         						bi.Dscal(n-ki, rec, b[ki*ldb+iv+1:], ldb)
         						vmax = 1
        -						vcrit = bignum
         					}
         					b[j*ldb+iv] -= bi.Ddot(j-ki-2, t[(ki+2)*ldt+j:], ldt, b[(ki+2)*ldb+iv:], ldb)
         					b[j*ldb+iv+1] -= bi.Ddot(j-ki-2, t[(ki+2)*ldt+j:], ldt, b[(ki+2)*ldb+iv+1:], ldb)
        @@ -738,15 +759,14 @@ leftev:
         						bi.Dscal(n-ki, rec, b[ki*ldb+iv:], ldb)
         						bi.Dscal(n-ki, rec, b[ki*ldb+iv+1:], ldb)
         						vmax = 1
        -						vcrit = bignum
         					}
         					b[j*ldb+iv] -= bi.Ddot(j-ki-2, t[(ki+2)*ldt+j:], ldt, b[(ki+2)*ldb+iv:], ldb)
         					b[j*ldb+iv+1] -= bi.Ddot(j-ki-2, t[(ki+2)*ldt+j:], ldt, b[(ki+2)*ldb+iv+1:], ldb)
         					b[(j+1)*ldb+iv] -= bi.Ddot(j-ki-2, t[(ki+2)*ldt+j+1:], ldt, b[(ki+2)*ldb+iv:], ldb)
         					b[(j+1)*ldb+iv+1] -= bi.Ddot(j-ki-2, t[(ki+2)*ldt+j+1:], ldt, b[(ki+2)*ldb+iv+1:], ldb)
         					// Solve 2×2 complex linear equation
        -					//  [ [T[j,j]   T[j,j+1]  ]^T - (wr-i*wi)*I ]*X = scale*b
        -					//  [ [T[j+1,j] T[j+1,j+1]]                 ]
        +					//  [ [T[j,j]   T[j,j+1]  ]ᵀ - (wr-i*wi)*I ]*X = scale*b
        +					//  [ [T[j+1,j] T[j+1,j+1]]                ]
         					scale, _, _ := impl.Dlaln2(true, 2, 2, smin, 1, t[j*ldt+j:], ldt,
         						1, 1, b[j*ldb+iv:], ldb, wr, -wi, x[:], 2)
         					// Scale if necessary.
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dtrexc.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dtrexc.go
        index 1953fca91..d063872ac 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dtrexc.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dtrexc.go
        @@ -7,7 +7,7 @@ package gonum
         import "gonum.org/v1/gonum/lapack"
         
         // Dtrexc reorders the real Schur factorization of a n×n real matrix
        -//  A = Q*T*Q^T
        +//  A = Q*T*Qᵀ
         // so that the diagonal block of T with row index ifst is moved to row ilst.
         //
         // On entry, T must be in Schur canonical form, that is, block upper triangular
        @@ -15,7 +15,7 @@ import "gonum.org/v1/gonum/lapack"
         // elements equal and its off-diagonal elements of opposite sign.
         //
         // On return, T will be reordered by an orthogonal similarity transformation Z
        -// as Z^T*T*Z, and will be again in Schur canonical form.
        +// as Zᵀ*T*Z, and will be again in Schur canonical form.
         //
         // If compq is lapack.UpdateSchur, on return the matrix Q of Schur vectors will be
         // updated by post-multiplying it with Z.
        @@ -46,31 +46,37 @@ import "gonum.org/v1/gonum/lapack"
         //
         // Dtrexc is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dtrexc(compq lapack.UpdateSchurComp, n int, t []float64, ldt int, q []float64, ldq int, ifst, ilst int, work []float64) (ifstOut, ilstOut int, ok bool) {
        -	checkMatrix(n, n, t, ldt)
        -	var wantq bool
        -	switch compq {
        -	default:
        -		panic("lapack: bad value of compq")
        -	case lapack.UpdateSchurNone:
        -		// Nothing to do because wantq is already false.
        -	case lapack.UpdateSchur:
        -		wantq = true
        -		checkMatrix(n, n, q, ldq)
        -	}
        -	if (ifst < 0 || n <= ifst) && n > 0 {
        -		panic("lapack: ifst out of range")
        -	}
        -	if (ilst < 0 || n <= ilst) && n > 0 {
        -		panic("lapack: ilst out of range")
        +	switch {
        +	case compq != lapack.UpdateSchur && compq != lapack.UpdateSchurNone:
        +		panic(badUpdateSchurComp)
        +	case n < 0:
        +		panic(nLT0)
        +	case ldt < max(1, n):
        +		panic(badLdT)
        +	case ldq < 1, compq == lapack.UpdateSchur && ldq < n:
        +		panic(badLdQ)
        +	case (ifst < 0 || n <= ifst) && n > 0:
        +		panic(badIfst)
        +	case (ilst < 0 || n <= ilst) && n > 0:
        +		panic(badIlst)
         	}
        -	if len(work) < n {
        -		panic(badWork)
        +
        +	// Quick return if possible.
        +	if n == 0 {
        +		return ifst, ilst, true
         	}
         
        -	ok = true
        +	switch {
        +	case len(t) < (n-1)*ldt+n:
        +		panic(shortT)
        +	case compq == lapack.UpdateSchur && len(q) < (n-1)*ldq+n:
        +		panic(shortQ)
        +	case len(work) < n:
        +		panic(shortWork)
        +	}
         
         	// Quick return if possible.
        -	if n <= 1 {
        +	if n == 1 {
         		return ifst, ilst, true
         	}
         
        @@ -93,6 +99,9 @@ func (impl Implementation) Dtrexc(compq lapack.UpdateSchurComp, n int, t []float
         		nbl = 2
         	}
         
        +	ok = true
        +	wantq := compq == lapack.UpdateSchur
        +
         	switch {
         	case ifst == ilst:
         		return ifst, ilst, true
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dtrti2.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dtrti2.go
        index a43efe6fd..efc24b65e 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dtrti2.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dtrti2.go
        @@ -14,13 +14,25 @@ import (
         //
         // Dtrti2 is an internal routine. It is exported for testing purposes.
         func (impl Implementation) Dtrti2(uplo blas.Uplo, diag blas.Diag, n int, a []float64, lda int) {
        -	checkMatrix(n, n, a, lda)
        -	if uplo != blas.Upper && uplo != blas.Lower {
        +	switch {
        +	case uplo != blas.Upper && uplo != blas.Lower:
         		panic(badUplo)
        -	}
        -	if diag != blas.NonUnit && diag != blas.Unit {
        +	case diag != blas.NonUnit && diag != blas.Unit:
         		panic(badDiag)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	}
        +
        +	if n == 0 {
        +		return
         	}
        +
        +	if len(a) < (n-1)*lda+n {
        +		panic(shortA)
        +	}
        +
         	bi := blas64.Implementation()
         
         	nonUnit := diag == blas.NonUnit
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dtrtri.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dtrtri.go
        index 95f1b3be4..6ec3663c3 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dtrtri.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dtrtri.go
        @@ -16,18 +16,26 @@ import (
         // Dtrtri will not perform the inversion if the matrix is singular, and returns
         // a boolean indicating whether the inversion was successful.
         func (impl Implementation) Dtrtri(uplo blas.Uplo, diag blas.Diag, n int, a []float64, lda int) (ok bool) {
        -	checkMatrix(n, n, a, lda)
        -	if uplo != blas.Upper && uplo != blas.Lower {
        +	switch {
        +	case uplo != blas.Upper && uplo != blas.Lower:
         		panic(badUplo)
        -	}
        -	if diag != blas.NonUnit && diag != blas.Unit {
        +	case diag != blas.NonUnit && diag != blas.Unit:
         		panic(badDiag)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
         	}
        +
         	if n == 0 {
        -		return false
        +		return true
         	}
        -	nonUnit := diag == blas.NonUnit
        -	if nonUnit {
        +
        +	if len(a) < (n-1)*lda+n {
        +		panic(shortA)
        +	}
        +
        +	if diag == blas.NonUnit {
         		for i := 0; i < n; i++ {
         			if a[i*lda+i] == 0 {
         				return false
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/dtrtrs.go b/vendor/gonum.org/v1/gonum/lapack/gonum/dtrtrs.go
        index e1782d232..2145fbd5f 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/dtrtrs.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/dtrtrs.go
        @@ -9,14 +9,39 @@ import (
         	"gonum.org/v1/gonum/blas/blas64"
         )
         
        -// Dtrtrs solves a triangular system of the form A * X = B or A^T * X = B. Dtrtrs
        +// Dtrtrs solves a triangular system of the form A * X = B or Aᵀ * X = B. Dtrtrs
         // returns whether the solve completed successfully. If A is singular, no solve is performed.
         func (impl Implementation) Dtrtrs(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag, n, nrhs int, a []float64, lda int, b []float64, ldb int) (ok bool) {
        -	nounit := diag == blas.NonUnit
        +	switch {
        +	case uplo != blas.Upper && uplo != blas.Lower:
        +		panic(badUplo)
        +	case trans != blas.NoTrans && trans != blas.Trans && trans != blas.ConjTrans:
        +		panic(badTrans)
        +	case diag != blas.NonUnit && diag != blas.Unit:
        +		panic(badDiag)
        +	case n < 0:
        +		panic(nLT0)
        +	case nrhs < 0:
        +		panic(nrhsLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	case ldb < max(1, nrhs):
        +		panic(badLdB)
        +	}
        +
         	if n == 0 {
        -		return false
        +		return true
         	}
        +
        +	switch {
        +	case len(a) < (n-1)*lda+n:
        +		panic(shortA)
        +	case len(b) < (n-1)*ldb+nrhs:
        +		panic(shortB)
        +	}
        +
         	// Check for singularity.
        +	nounit := diag == blas.NonUnit
         	if nounit {
         		for i := 0; i < n; i++ {
         			if a[i*lda+i] == 0 {
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/errors.go b/vendor/gonum.org/v1/gonum/lapack/gonum/errors.go
        index e406b87fd..3c0cb68ef 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/errors.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/errors.go
        @@ -6,61 +6,169 @@ package gonum
         
         // This list is duplicated in netlib/lapack/netlib. Keep in sync.
         const (
        -	absIncNotOne  = "lapack: increment not one or negative one"
        -	badAlpha      = "lapack: bad alpha length"
        -	badApplyOrtho = "lapack: bad ApplyOrtho"
        -	badAuxv       = "lapack: auxv has insufficient length"
        -	badBeta       = "lapack: bad beta length"
        -	badD          = "lapack: d has insufficient length"
        -	badDiag       = "lapack: bad diag"
        -	badDims       = "lapack: bad input dimensions"
        -	badDirect     = "lapack: bad direct"
        -	badE          = "lapack: e has insufficient length"
        -	badEVComp     = "lapack: bad EVComp"
        -	badEVHowMany  = "lapack: bad EVHowMany"
        -	badEVJob      = "lapack: bad EVJob"
        -	badEVSide     = "lapack: bad EVSide"
        -	badGenOrtho   = "lapack: bad GenOrtho"
        -	badGSVDJob    = "lapack: bad GSVDJob"
        -	badIlo        = "lapack: ilo out of range"
        -	badIhi        = "lapack: ihi out of range"
        -	badIpiv       = "lapack: bad permutation length"
        -	badBalanceJob = "lapack: bad BalanceJob"
        -	badK1         = "lapack: k1 out of range"
        -	badK2         = "lapack: k2 out of range"
        -	badKperm      = "lapack: incorrect permutation length"
        -	badLdA        = "lapack: index of a out of range"
        -	badNb         = "lapack: nb out of range"
        -	badNorm       = "lapack: bad norm"
        -	badPivot      = "lapack: bad pivot"
        -	badS          = "lapack: s has insufficient length"
        -	badSchurComp  = "lapack: bad SchurComp"
        -	badSchurJob   = "lapack: bad SchurJob"
        -	badShifts     = "lapack: bad shifts"
        -	badSide       = "lapack: bad side"
        -	badSlice      = "lapack: bad input slice length"
        -	badSort       = "lapack: bad Sort"
        -	badStore      = "lapack: bad store"
        -	badTau        = "lapack: tau has insufficient length"
        -	badTauQ       = "lapack: tauQ has insufficient length"
        -	badTauP       = "lapack: tauP has insufficient length"
        -	badTrans      = "lapack: bad trans"
        -	badVn1        = "lapack: vn1 has insufficient length"
        -	badVn2        = "lapack: vn2 has insufficient length"
        -	badUplo       = "lapack: illegal triangle"
        -	badWork       = "lapack: insufficient working memory"
        -	badZ          = "lapack: insufficient z length"
        -	kGTM          = "lapack: k > m"
        -	kGTN          = "lapack: k > n"
        -	kLT0          = "lapack: k < 0"
        -	mLT0          = "lapack: m < 0"
        -	mLTN          = "lapack: m < n"
        -	nanScale      = "lapack: NaN scale factor"
        -	negDimension  = "lapack: negative matrix dimension"
        -	negZ          = "lapack: negative z value"
        -	nLT0          = "lapack: n < 0"
        -	nLTM          = "lapack: n < m"
        -	offsetGTM     = "lapack: offset > m"
        -	shortWork     = "lapack: working array shorter than declared"
        -	zeroDiv       = "lapack: zero divisor"
        +	// Panic strings for bad enumeration values.
        +	badApplyOrtho      = "lapack: bad ApplyOrtho"
        +	badBalanceJob      = "lapack: bad BalanceJob"
        +	badDiag            = "lapack: bad Diag"
        +	badDirect          = "lapack: bad Direct"
        +	badEVComp          = "lapack: bad EVComp"
        +	badEVHowMany       = "lapack: bad EVHowMany"
        +	badEVJob           = "lapack: bad EVJob"
        +	badEVSide          = "lapack: bad EVSide"
        +	badGSVDJob         = "lapack: bad GSVDJob"
        +	badGenOrtho        = "lapack: bad GenOrtho"
        +	badLeftEVJob       = "lapack: bad LeftEVJob"
        +	badMatrixType      = "lapack: bad MatrixType"
        +	badNorm            = "lapack: bad Norm"
        +	badPivot           = "lapack: bad Pivot"
        +	badRightEVJob      = "lapack: bad RightEVJob"
        +	badSVDJob          = "lapack: bad SVDJob"
        +	badSchurComp       = "lapack: bad SchurComp"
        +	badSchurJob        = "lapack: bad SchurJob"
        +	badSide            = "lapack: bad Side"
        +	badSort            = "lapack: bad Sort"
        +	badStoreV          = "lapack: bad StoreV"
        +	badTrans           = "lapack: bad Trans"
        +	badUpdateSchurComp = "lapack: bad UpdateSchurComp"
        +	badUplo            = "lapack: bad Uplo"
        +	bothSVDOver        = "lapack: both jobU and jobVT are lapack.SVDOverwrite"
        +
        +	// Panic strings for bad numerical and string values.
        +	badIfst     = "lapack: ifst out of range"
        +	badIhi      = "lapack: ihi out of range"
        +	badIhiz     = "lapack: ihiz out of range"
        +	badIlo      = "lapack: ilo out of range"
        +	badIloz     = "lapack: iloz out of range"
        +	badIlst     = "lapack: ilst out of range"
        +	badIsave    = "lapack: bad isave value"
        +	badIspec    = "lapack: bad ispec value"
        +	badJ1       = "lapack: j1 out of range"
        +	badJpvt     = "lapack: bad element of jpvt"
        +	badK1       = "lapack: k1 out of range"
        +	badK2       = "lapack: k2 out of range"
        +	badKacc22   = "lapack: invalid value of kacc22"
        +	badKbot     = "lapack: kbot out of range"
        +	badKtop     = "lapack: ktop out of range"
        +	badLWork    = "lapack: insufficient declared workspace length"
        +	badMm       = "lapack: mm out of range"
        +	badN1       = "lapack: bad value of n1"
        +	badN2       = "lapack: bad value of n2"
        +	badNa       = "lapack: bad value of na"
        +	badName     = "lapack: bad name"
        +	badNh       = "lapack: bad value of nh"
        +	badNw       = "lapack: bad value of nw"
        +	badPp       = "lapack: bad value of pp"
        +	badShifts   = "lapack: bad shifts"
        +	i0LT0       = "lapack: i0 < 0"
        +	kGTM        = "lapack: k > m"
        +	kGTN        = "lapack: k > n"
        +	kLT0        = "lapack: k < 0"
        +	kLT1        = "lapack: k < 1"
        +	kdLT0       = "lapack: kd < 0"
        +	mGTN        = "lapack: m > n"
        +	mLT0        = "lapack: m < 0"
        +	mmLT0       = "lapack: mm < 0"
        +	n0LT0       = "lapack: n0 < 0"
        +	nGTM        = "lapack: n > m"
        +	nLT0        = "lapack: n < 0"
        +	nLT1        = "lapack: n < 1"
        +	nLTM        = "lapack: n < m"
        +	nanCFrom    = "lapack: cfrom is NaN"
        +	nanCTo      = "lapack: cto is NaN"
        +	nbGTM       = "lapack: nb > m"
        +	nbGTN       = "lapack: nb > n"
        +	nbLT0       = "lapack: nb < 0"
        +	nccLT0      = "lapack: ncc < 0"
        +	ncvtLT0     = "lapack: ncvt < 0"
        +	negANorm    = "lapack: anorm < 0"
        +	negZ        = "lapack: negative z value"
        +	nhLT0       = "lapack: nh < 0"
        +	notIsolated = "lapack: block is not isolated"
        +	nrhsLT0     = "lapack: nrhs < 0"
        +	nruLT0      = "lapack: nru < 0"
        +	nshftsLT0   = "lapack: nshfts < 0"
        +	nshftsOdd   = "lapack: nshfts must be even"
        +	nvLT0       = "lapack: nv < 0"
        +	offsetGTM   = "lapack: offset > m"
        +	offsetLT0   = "lapack: offset < 0"
        +	pLT0        = "lapack: p < 0"
        +	recurLT0    = "lapack: recur < 0"
        +	zeroCFrom   = "lapack: zero cfrom"
        +
        +	// Panic strings for bad slice lengths.
        +	badLenAlpha    = "lapack: bad length of alpha"
        +	badLenBeta     = "lapack: bad length of beta"
        +	badLenIpiv     = "lapack: bad length of ipiv"
        +	badLenJpvt     = "lapack: bad length of jpvt"
        +	badLenK        = "lapack: bad length of k"
        +	badLenSelected = "lapack: bad length of selected"
        +	badLenSi       = "lapack: bad length of si"
        +	badLenSr       = "lapack: bad length of sr"
        +	badLenTau      = "lapack: bad length of tau"
        +	badLenWi       = "lapack: bad length of wi"
        +	badLenWr       = "lapack: bad length of wr"
        +
        +	// Panic strings for insufficient slice lengths.
        +	shortA     = "lapack: insufficient length of a"
        +	shortAB    = "lapack: insufficient length of ab"
        +	shortAuxv  = "lapack: insufficient length of auxv"
        +	shortB     = "lapack: insufficient length of b"
        +	shortC     = "lapack: insufficient length of c"
        +	shortCNorm = "lapack: insufficient length of cnorm"
        +	shortD     = "lapack: insufficient length of d"
        +	shortE     = "lapack: insufficient length of e"
        +	shortF     = "lapack: insufficient length of f"
        +	shortH     = "lapack: insufficient length of h"
        +	shortIWork = "lapack: insufficient length of iwork"
        +	shortIsgn  = "lapack: insufficient length of isgn"
        +	shortQ     = "lapack: insufficient length of q"
        +	shortS     = "lapack: insufficient length of s"
        +	shortScale = "lapack: insufficient length of scale"
        +	shortT     = "lapack: insufficient length of t"
        +	shortTau   = "lapack: insufficient length of tau"
        +	shortTauP  = "lapack: insufficient length of tauP"
        +	shortTauQ  = "lapack: insufficient length of tauQ"
        +	shortU     = "lapack: insufficient length of u"
        +	shortV     = "lapack: insufficient length of v"
        +	shortVL    = "lapack: insufficient length of vl"
        +	shortVR    = "lapack: insufficient length of vr"
        +	shortVT    = "lapack: insufficient length of vt"
        +	shortVn1   = "lapack: insufficient length of vn1"
        +	shortVn2   = "lapack: insufficient length of vn2"
        +	shortW     = "lapack: insufficient length of w"
        +	shortWH    = "lapack: insufficient length of wh"
        +	shortWV    = "lapack: insufficient length of wv"
        +	shortWi    = "lapack: insufficient length of wi"
        +	shortWork  = "lapack: insufficient length of work"
        +	shortWr    = "lapack: insufficient length of wr"
        +	shortX     = "lapack: insufficient length of x"
        +	shortY     = "lapack: insufficient length of y"
        +	shortZ     = "lapack: insufficient length of z"
        +
        +	// Panic strings for bad leading dimensions of matrices.
        +	badLdA    = "lapack: bad leading dimension of A"
        +	badLdB    = "lapack: bad leading dimension of B"
        +	badLdC    = "lapack: bad leading dimension of C"
        +	badLdF    = "lapack: bad leading dimension of F"
        +	badLdH    = "lapack: bad leading dimension of H"
        +	badLdQ    = "lapack: bad leading dimension of Q"
        +	badLdT    = "lapack: bad leading dimension of T"
        +	badLdU    = "lapack: bad leading dimension of U"
        +	badLdV    = "lapack: bad leading dimension of V"
        +	badLdVL   = "lapack: bad leading dimension of VL"
        +	badLdVR   = "lapack: bad leading dimension of VR"
        +	badLdVT   = "lapack: bad leading dimension of VT"
        +	badLdW    = "lapack: bad leading dimension of W"
        +	badLdWH   = "lapack: bad leading dimension of WH"
        +	badLdWV   = "lapack: bad leading dimension of WV"
        +	badLdWork = "lapack: bad leading dimension of Work"
        +	badLdX    = "lapack: bad leading dimension of X"
        +	badLdY    = "lapack: bad leading dimension of Y"
        +	badLdZ    = "lapack: bad leading dimension of Z"
        +
        +	// Panic strings for bad vector increments.
        +	absIncNotOne = "lapack: increment not one or negative one"
        +	badIncX      = "lapack: incX <= 0"
        +	badIncY      = "lapack: incY <= 0"
        +	zeroIncV     = "lapack: incv == 0"
         )
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/general.go b/vendor/gonum.org/v1/gonum/lapack/gonum/general.go
        deleted file mode 100644
        index 56d7cd83a..000000000
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/general.go
        +++ /dev/null
        @@ -1,84 +0,0 @@
        -// Copyright ©2015 The Gonum Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package gonum
        -
        -import "gonum.org/v1/gonum/lapack"
        -
        -// Implementation is the native Go implementation of LAPACK routines. It
        -// is built on top of calls to the return of blas64.Implementation(), so while
        -// this code is in pure Go, the underlying BLAS implementation may not be.
        -type Implementation struct{}
        -
        -var _ lapack.Float64 = Implementation{}
        -
        -// checkMatrix verifies the parameters of a matrix input.
        -func checkMatrix(m, n int, a []float64, lda int) {
        -	if m < 0 {
        -		panic("lapack: has negative number of rows")
        -	}
        -	if n < 0 {
        -		panic("lapack: has negative number of columns")
        -	}
        -	if lda < n {
        -		panic("lapack: stride less than number of columns")
        -	}
        -	if len(a) < (m-1)*lda+n {
        -		panic("lapack: insufficient matrix slice length")
        -	}
        -}
        -
        -func checkVector(n int, v []float64, inc int) {
        -	if n < 0 {
        -		panic("lapack: negative vector length")
        -	}
        -	if (inc > 0 && (n-1)*inc >= len(v)) || (inc < 0 && (1-n)*inc >= len(v)) {
        -		panic("lapack: insufficient vector slice length")
        -	}
        -}
        -
        -func checkSymBanded(ab []float64, n, kd, lda int) {
        -	if n < 0 {
        -		panic("lapack: negative banded length")
        -	}
        -	if kd < 0 {
        -		panic("lapack: negative bandwidth value")
        -	}
        -	if lda < kd+1 {
        -		panic("lapack: stride less than number of bands")
        -	}
        -	if len(ab) < (n-1)*lda+kd {
        -		panic("lapack: insufficient banded vector length")
        -	}
        -}
        -
        -func min(a, b int) int {
        -	if a < b {
        -		return a
        -	}
        -	return b
        -}
        -
        -func max(a, b int) int {
        -	if a > b {
        -		return a
        -	}
        -	return b
        -}
        -
        -const (
        -	// dlamchE is the machine epsilon. For IEEE this is 2^{-53}.
        -	dlamchE = 1.0 / (1 << 53)
        -
        -	// dlamchB is the radix of the machine (the base of the number system).
        -	dlamchB = 2
        -
        -	// dlamchP is base * eps.
        -	dlamchP = dlamchB * dlamchE
        -
        -	// dlamchS is the "safe minimum", that is, the lowest number such that
        -	// 1/dlamchS does not overflow, or also the smallest normal number.
        -	// For IEEE this is 2^{-1022}.
        -	dlamchS = 1.0 / (1 << 256) / (1 << 256) / (1 << 256) / (1 << 254)
        -)
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/iladlc.go b/vendor/gonum.org/v1/gonum/lapack/gonum/iladlc.go
        index bd0e4d8fe..b251d7269 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/iladlc.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/iladlc.go
        @@ -9,10 +9,22 @@ package gonum
         //
         // Iladlc is an internal routine. It is exported for testing purposes.
         func (Implementation) Iladlc(m, n int, a []float64, lda int) int {
        +	switch {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	}
        +
         	if n == 0 || m == 0 {
        -		return n - 1
        +		return -1
        +	}
        +
        +	if len(a) < (m-1)*lda+n {
        +		panic(shortA)
         	}
        -	checkMatrix(m, n, a, lda)
         
         	// Test common case where corner is non-zero.
         	if a[n-1] != 0 || a[(m-1)*lda+(n-1)] != 0 {
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/iladlr.go b/vendor/gonum.org/v1/gonum/lapack/gonum/iladlr.go
        index 9f9e0d937..b73fe18ea 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/iladlr.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/iladlr.go
        @@ -9,11 +9,22 @@ package gonum
         //
         // Iladlr is an internal routine. It is exported for testing purposes.
         func (Implementation) Iladlr(m, n int, a []float64, lda int) int {
        -	if m == 0 {
        -		return m - 1
        +	switch {
        +	case m < 0:
        +		panic(mLT0)
        +	case n < 0:
        +		panic(nLT0)
        +	case lda < max(1, n):
        +		panic(badLdA)
        +	}
        +
        +	if n == 0 || m == 0 {
        +		return -1
         	}
         
        -	checkMatrix(m, n, a, lda)
        +	if len(a) < (m-1)*lda+n {
        +		panic(shortA)
        +	}
         
         	// Check the common case where the corner is non-zero
         	if a[(m-1)*lda] != 0 || a[(m-1)*lda+n-1] != 0 {
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/ilaenv.go b/vendor/gonum.org/v1/gonum/lapack/gonum/ilaenv.go
        index 7f08ba605..b40110486 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/ilaenv.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/ilaenv.go
        @@ -22,28 +22,28 @@ package gonum
         //           information.
         //
         // Ilaenv is an internal routine. It is exported for testing purposes.
        -func (impl Implementation) Ilaenv(ispec int, s string, opts string, n1, n2, n3, n4 int) int {
        +func (impl Implementation) Ilaenv(ispec int, name string, opts string, n1, n2, n3, n4 int) int {
         	// TODO(btracey): Replace this with a constant lookup? A list of constants?
        -	sname := s[0] == 'S' || s[0] == 'D'
        -	cname := s[0] == 'C' || s[0] == 'Z'
        +	sname := name[0] == 'S' || name[0] == 'D'
        +	cname := name[0] == 'C' || name[0] == 'Z'
         	if !sname && !cname {
        -		panic("lapack: bad name")
        +		panic(badName)
         	}
        -	c2 := s[1:3]
        -	c3 := s[3:6]
        +	c2 := name[1:3]
        +	c3 := name[3:6]
         	c4 := c3[1:3]
         
         	switch ispec {
         	default:
        -		panic("lapack: bad ispec")
        +		panic(badIspec)
         	case 1:
         		switch c2 {
         		default:
        -			panic("lapack: bad function name")
        +			panic(badName)
         		case "GE":
         			switch c3 {
         			default:
        -				panic("lapack: bad function name")
        +				panic(badName)
         			case "TRF":
         				if sname {
         					return 64
        @@ -73,7 +73,7 @@ func (impl Implementation) Ilaenv(ispec int, s string, opts string, n1, n2, n3,
         		case "PO":
         			switch c3 {
         			default:
        -				panic("lapack: bad function name")
        +				panic(badName)
         			case "TRF":
         				if sname {
         					return 64
        @@ -83,7 +83,7 @@ func (impl Implementation) Ilaenv(ispec int, s string, opts string, n1, n2, n3,
         		case "SY":
         			switch c3 {
         			default:
        -				panic("lapack: bad function name")
        +				panic(badName)
         			case "TRF":
         				if sname {
         					return 64
        @@ -97,7 +97,7 @@ func (impl Implementation) Ilaenv(ispec int, s string, opts string, n1, n2, n3,
         		case "HE":
         			switch c3 {
         			default:
        -				panic("lapack: bad function name")
        +				panic(badName)
         			case "TRF":
         				return 64
         			case "TRD":
        @@ -108,18 +108,18 @@ func (impl Implementation) Ilaenv(ispec int, s string, opts string, n1, n2, n3,
         		case "OR":
         			switch c3[0] {
         			default:
        -				panic("lapack: bad function name")
        +				panic(badName)
         			case 'G':
         				switch c3[1:] {
         				default:
        -					panic("lapack: bad function name")
        +					panic(badName)
         				case "QR", "RQ", "LQ", "QL", "HR", "TR", "BR":
         					return 32
         				}
         			case 'M':
         				switch c3[1:] {
         				default:
        -					panic("lapack: bad function name")
        +					panic(badName)
         				case "QR", "RQ", "LQ", "QL", "HR", "TR", "BR":
         					return 32
         				}
        @@ -127,18 +127,18 @@ func (impl Implementation) Ilaenv(ispec int, s string, opts string, n1, n2, n3,
         		case "UN":
         			switch c3[0] {
         			default:
        -				panic("lapack: bad function name")
        +				panic(badName)
         			case 'G':
         				switch c3[1:] {
         				default:
        -					panic("lapack: bad function name")
        +					panic(badName)
         				case "QR", "RQ", "LQ", "QL", "HR", "TR", "BR":
         					return 32
         				}
         			case 'M':
         				switch c3[1:] {
         				default:
        -					panic("lapack: bad function name")
        +					panic(badName)
         				case "QR", "RQ", "LQ", "QL", "HR", "TR", "BR":
         					return 32
         				}
        @@ -146,7 +146,7 @@ func (impl Implementation) Ilaenv(ispec int, s string, opts string, n1, n2, n3,
         		case "GB":
         			switch c3 {
         			default:
        -				panic("lapack: bad function name")
        +				panic(badName)
         			case "TRF":
         				if sname {
         					if n4 <= 64 {
        @@ -162,15 +162,15 @@ func (impl Implementation) Ilaenv(ispec int, s string, opts string, n1, n2, n3,
         		case "PB":
         			switch c3 {
         			default:
        -				panic("lapack: bad function name")
        +				panic(badName)
         			case "TRF":
         				if sname {
        -					if n4 <= 64 {
        +					if n2 <= 64 {
         						return 1
         					}
         					return 32
         				}
        -				if n4 <= 64 {
        +				if n2 <= 64 {
         					return 1
         				}
         				return 32
        @@ -178,7 +178,7 @@ func (impl Implementation) Ilaenv(ispec int, s string, opts string, n1, n2, n3,
         		case "TR":
         			switch c3 {
         			default:
        -				panic("lapack: bad function name")
        +				panic(badName)
         			case "TRI":
         				if sname {
         					return 64
        @@ -193,7 +193,7 @@ func (impl Implementation) Ilaenv(ispec int, s string, opts string, n1, n2, n3,
         		case "LA":
         			switch c3 {
         			default:
        -				panic("lapack: bad function name")
        +				panic(badName)
         			case "UUM":
         				if sname {
         					return 64
        @@ -204,16 +204,16 @@ func (impl Implementation) Ilaenv(ispec int, s string, opts string, n1, n2, n3,
         			if sname && c3 == "EBZ" {
         				return 1
         			}
        -			panic("lapack: bad function name")
        +			panic(badName)
         		}
         	case 2:
         		switch c2 {
         		default:
        -			panic("lapack: bad function name")
        +			panic(badName)
         		case "GE":
         			switch c3 {
         			default:
        -				panic("lapack: bad function name")
        +				panic(badName)
         			case "QRF", "RQF", "LQF", "QLF":
         				if sname {
         					return 2
        @@ -238,7 +238,7 @@ func (impl Implementation) Ilaenv(ispec int, s string, opts string, n1, n2, n3,
         		case "SY":
         			switch c3 {
         			default:
        -				panic("lapack: bad function name")
        +				panic(badName)
         			case "TRF":
         				if sname {
         					return 8
        @@ -248,31 +248,31 @@ func (impl Implementation) Ilaenv(ispec int, s string, opts string, n1, n2, n3,
         				if sname {
         					return 2
         				}
        -				panic("lapack: bad function name")
        +				panic(badName)
         			}
         		case "HE":
         			if c3 == "TRD" {
         				return 2
         			}
        -			panic("lapack: bad function name")
        +			panic(badName)
         		case "OR":
         			if !sname {
        -				panic("lapack: bad function name")
        +				panic(badName)
         			}
         			switch c3[0] {
         			default:
        -				panic("lapack: bad function name")
        +				panic(badName)
         			case 'G':
         				switch c4 {
         				default:
        -					panic("lapack: bad function name")
        +					panic(badName)
         				case "QR", "RQ", "LQ", "QL", "HR", "TR", "BR":
         					return 2
         				}
         			case 'M':
         				switch c4 {
         				default:
        -					panic("lapack: bad function name")
        +					panic(badName)
         				case "QR", "RQ", "LQ", "QL", "HR", "TR", "BR":
         					return 2
         				}
        @@ -280,18 +280,18 @@ func (impl Implementation) Ilaenv(ispec int, s string, opts string, n1, n2, n3,
         		case "UN":
         			switch c3[0] {
         			default:
        -				panic("lapack: bad function name")
        +				panic(badName)
         			case 'G':
         				switch c4 {
         				default:
        -					panic("lapack: bad function name")
        +					panic(badName)
         				case "QR", "RQ", "LQ", "QL", "HR", "TR", "BR":
         					return 2
         				}
         			case 'M':
         				switch c4 {
         				default:
        -					panic("lapack: bad function name")
        +					panic(badName)
         				case "QR", "RQ", "LQ", "QL", "HR", "TR", "BR":
         					return 2
         				}
        @@ -300,11 +300,11 @@ func (impl Implementation) Ilaenv(ispec int, s string, opts string, n1, n2, n3,
         	case 3:
         		switch c2 {
         		default:
        -			panic("lapack: bad function name")
        +			panic(badName)
         		case "GE":
         			switch c3 {
         			default:
        -				panic("lapack: bad function name")
        +				panic(badName)
         			case "QRF", "RQF", "LQF", "QLF":
         				if sname {
         					return 128
        @@ -325,20 +325,20 @@ func (impl Implementation) Ilaenv(ispec int, s string, opts string, n1, n2, n3,
         			if sname && c3 == "TRD" {
         				return 32
         			}
        -			panic("lapack: bad function name")
        +			panic(badName)
         		case "HE":
         			if c3 == "TRD" {
         				return 32
         			}
        -			panic("lapack: bad function name")
        +			panic(badName)
         		case "OR":
         			switch c3[0] {
         			default:
        -				panic("lapack: bad function name")
        +				panic(badName)
         			case 'G':
         				switch c4 {
         				default:
        -					panic("lapack: bad function name")
        +					panic(badName)
         				case "QR", "RQ", "LQ", "QL", "HR", "TR", "BR":
         					return 128
         				}
        @@ -346,11 +346,11 @@ func (impl Implementation) Ilaenv(ispec int, s string, opts string, n1, n2, n3,
         		case "UN":
         			switch c3[0] {
         			default:
        -				panic("lapack: bad function name")
        +				panic(badName)
         			case 'G':
         				switch c4 {
         				default:
        -					panic("lapack: bad function name")
        +					panic(badName)
         				case "QR", "RQ", "LQ", "QL", "HR", "TR", "BR":
         					return 128
         				}
        @@ -382,6 +382,6 @@ func (impl Implementation) Ilaenv(ispec int, s string, opts string, n1, n2, n3,
         		return 1
         	case 12, 13, 14, 15, 16:
         		// Dhseqr and related functions for eigenvalue problems.
        -		return impl.Iparmq(ispec, s, opts, n1, n2, n3, n4)
        +		return impl.Iparmq(ispec, name, opts, n1, n2, n3, n4)
         	}
         }
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/iparmq.go b/vendor/gonum.org/v1/gonum/lapack/gonum/iparmq.go
        index ea3d6dfbc..3800f11ce 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/gonum/iparmq.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/iparmq.go
        @@ -52,7 +52,7 @@ func (Implementation) Iparmq(ispec int, name, opts string, n, ilo, ihi, lwork in
         
         	switch ispec {
         	default:
        -		panic("lapack: bad ispec")
        +		panic(badIspec)
         
         	case 12:
         		// Matrices of order smaller than nmin get sent to Dlahqr, the
        @@ -82,7 +82,7 @@ func (Implementation) Iparmq(ispec int, name, opts string, n, ilo, ihi, lwork in
         
         	case 16:
         		if len(name) != 6 {
        -			panic("lapack: bad name")
        +			panic(badName)
         		}
         		const (
         			k22min = 14
        diff --git a/vendor/gonum.org/v1/gonum/lapack/gonum/lapack.go b/vendor/gonum.org/v1/gonum/lapack/gonum/lapack.go
        new file mode 100644
        index 000000000..9195a7083
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/lapack/gonum/lapack.go
        @@ -0,0 +1,51 @@
        +// Copyright ©2015 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package gonum
        +
        +import "gonum.org/v1/gonum/lapack"
        +
        +// Implementation is the native Go implementation of LAPACK routines. It
        +// is built on top of calls to the return of blas64.Implementation(), so while
        +// this code is in pure Go, the underlying BLAS implementation may not be.
        +type Implementation struct{}
        +
        +var _ lapack.Float64 = Implementation{}
        +
        +func min(a, b int) int {
        +	if a < b {
        +		return a
        +	}
        +	return b
        +}
        +
        +func max(a, b int) int {
        +	if a > b {
        +		return a
        +	}
        +	return b
        +}
        +
        +func abs(a int) int {
        +	if a < 0 {
        +		return -a
        +	}
        +	return a
        +}
        +
        +const (
        +	// dlamchE is the machine epsilon. For IEEE this is 2^{-53}.
        +	dlamchE = 0x1p-53
        +
        +	// dlamchB is the radix of the machine (the base of the number system).
        +	dlamchB = 2
        +
        +	// dlamchP is base * eps.
        +	dlamchP = dlamchB * dlamchE
        +
        +	// dlamchS is the "safe minimum", that is, the lowest number such that
        +	// 1/dlamchS does not overflow, or also the smallest normal number.
        +	// For IEEE this is 2^{-1022}.
        +	dlamchS = 0x1p-1022
        +)
        diff --git a/vendor/gonum.org/v1/gonum/lapack/lapack.go b/vendor/gonum.org/v1/gonum/lapack/lapack.go
        index 0c2747385..da55fd9d1 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/lapack.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/lapack.go
        @@ -29,6 +29,7 @@ type Float64 interface {
         	Dormlq(side blas.Side, trans blas.Transpose, m, n, k int, a []float64, lda int, tau, c []float64, ldc int, work []float64, lwork int)
         	Dpocon(uplo blas.Uplo, n int, a []float64, lda int, anorm float64, work []float64, iwork []int) float64
         	Dpotrf(ul blas.Uplo, n int, a []float64, lda int) (ok bool)
        +	Dpotri(ul blas.Uplo, n int, a []float64, lda int) (ok bool)
         	Dpotrs(ul blas.Uplo, n, nrhs int, a []float64, lda int, b []float64, ldb int)
         	Dsyev(jobz EVJob, uplo blas.Uplo, n int, a []float64, lda int, w, work []float64, lwork int) (ok bool)
         	Dtrcon(norm MatrixNorm, uplo blas.Uplo, diag blas.Diag, n int, a []float64, lda int, work []float64, iwork []int) float64
        @@ -92,15 +93,15 @@ const (
         type ApplyOrtho byte
         
         const (
        -	ApplyP ApplyOrtho = 'P' // Apply P or P^T.
        -	ApplyQ ApplyOrtho = 'Q' // Apply Q or Q^T.
        +	ApplyP ApplyOrtho = 'P' // Apply P or Pᵀ.
        +	ApplyQ ApplyOrtho = 'Q' // Apply Q or Qᵀ.
         )
         
         // GenOrtho specifies which orthogonal matrix is generated in Dorgbr.
         type GenOrtho byte
         
         const (
        -	GeneratePT GenOrtho = 'P' // Generate P^T.
        +	GeneratePT GenOrtho = 'P' // Generate Pᵀ.
         	GenerateQ  GenOrtho = 'Q' // Generate Q.
         )
         
        diff --git a/vendor/gonum.org/v1/gonum/lapack/lapack64/lapack64.go b/vendor/gonum.org/v1/gonum/lapack/lapack64/lapack64.go
        index 03139d21a..0aa76b6aa 100644
        --- a/vendor/gonum.org/v1/gonum/lapack/lapack64/lapack64.go
        +++ b/vendor/gonum.org/v1/gonum/lapack/lapack64/lapack64.go
        @@ -19,16 +19,23 @@ func Use(l lapack.Float64) {
         	lapack64 = l
         }
         
        +func max(a, b int) int {
        +	if a > b {
        +		return a
        +	}
        +	return b
        +}
        +
         // Potrf computes the Cholesky factorization of a.
         // The factorization has the form
        -//  A = U^T * U if a.Uplo == blas.Upper, or
        -//  A = L * L^T if a.Uplo == blas.Lower,
        +//  A = Uᵀ * U  if a.Uplo == blas.Upper, or
        +//  A = L * Lᵀ  if a.Uplo == blas.Lower,
         // where U is an upper triangular matrix and L is lower triangular.
         // The triangular matrix is returned in t, and the underlying data between
         // a and t is shared. The returned bool indicates whether a is positive
         // definite and the factorization could be finished.
         func Potrf(a blas64.Symmetric) (t blas64.Triangular, ok bool) {
        -	ok = lapack64.Dpotrf(a.Uplo, a.N, a.Data, a.Stride)
        +	ok = lapack64.Dpotrf(a.Uplo, a.N, a.Data, max(1, a.Stride))
         	t.Uplo = a.Uplo
         	t.N = a.N
         	t.Data = a.Data
        @@ -37,13 +44,33 @@ func Potrf(a blas64.Symmetric) (t blas64.Triangular, ok bool) {
         	return
         }
         
        +// Potri computes the inverse of a real symmetric positive definite matrix A
        +// using its Cholesky factorization.
        +//
        +// On entry, t contains the triangular factor U or L from the Cholesky
        +// factorization A = Uᵀ*U or A = L*Lᵀ, as computed by Potrf.
        +//
        +// On return, the upper or lower triangle of the (symmetric) inverse of A is
        +// stored in t, overwriting the input factor U or L, and also returned in a. The
        +// underlying data between a and t is shared.
        +//
        +// The returned bool indicates whether the inverse was computed successfully.
        +func Potri(t blas64.Triangular) (a blas64.Symmetric, ok bool) {
        +	ok = lapack64.Dpotri(t.Uplo, t.N, t.Data, max(1, t.Stride))
        +	a.Uplo = t.Uplo
        +	a.N = t.N
        +	a.Data = t.Data
        +	a.Stride = t.Stride
        +	return
        +}
        +
         // Potrs solves a system of n linear equations A*X = B where A is an n×n
         // symmetric positive definite matrix and B is an n×nrhs matrix, using the
        -// Cholesky factorization A = U^T*U or A = L*L^T. t contains the corresponding
        +// Cholesky factorization A = Uᵀ*U or A = L*Lᵀ. t contains the corresponding
         // triangular factor as returned by Potrf. On entry, B contains the right-hand
         // side matrix B, on return it contains the solution matrix X.
         func Potrs(t blas64.Triangular, b blas64.General) {
        -	lapack64.Dpotrs(t.Uplo, t.N, b.Cols, t.Data, t.Stride, b.Data, b.Stride)
        +	lapack64.Dpotrs(t.Uplo, t.N, b.Cols, t.Data, max(1, t.Stride), b.Data, max(1, b.Stride))
         }
         
         // Gecon estimates the reciprocal of the condition number of the n×n matrix A
        @@ -58,7 +85,7 @@ func Potrs(t blas64.Triangular, b blas64.General) {
         //
         // iwork is a temporary data slice of length at least n and Gecon will panic otherwise.
         func Gecon(norm lapack.MatrixNorm, a blas64.General, anorm float64, work []float64, iwork []int) float64 {
        -	return lapack64.Dgecon(norm, a.Cols, a.Data, a.Stride, anorm, work, iwork)
        +	return lapack64.Dgecon(norm, a.Cols, a.Data, max(1, a.Stride), anorm, work, iwork)
         }
         
         // Gels finds a minimum-norm solution based on the matrices A and B using the
        @@ -72,7 +99,7 @@ func Gecon(norm lapack.MatrixNorm, a blas64.General, anorm float64, work []float
         //  2. If m < n and trans == blas.NoTrans, Gels finds the minimum norm solution of
         //     A * X = B.
         //  3. If m >= n and trans == blas.Trans, Gels finds the minimum norm solution of
        -//     A^T * X = B.
        +//     Aᵀ * X = B.
         //  4. If m < n and trans == blas.Trans, Gels finds X such that || A*X - B||_2
         //     is minimized.
         // Note that the least-squares solutions (cases 1 and 3) perform the minimization
        @@ -91,7 +118,7 @@ func Gecon(norm lapack.MatrixNorm, a blas64.General, anorm float64, work []float
         // In the special case that lwork == -1, work[0] will be set to the optimal working
         // length.
         func Gels(trans blas.Transpose, a blas64.General, b blas64.General, work []float64, lwork int) bool {
        -	return lapack64.Dgels(trans, a.Rows, a.Cols, b.Cols, a.Data, a.Stride, b.Data, b.Stride, work, lwork)
        +	return lapack64.Dgels(trans, a.Rows, a.Cols, b.Cols, a.Data, max(1, a.Stride), b.Data, max(1, b.Stride), work, lwork)
         }
         
         // Geqrf computes the QR factorization of the m×n matrix A using a blocked
        @@ -106,7 +133,7 @@ func Gels(trans blas.Transpose, a blas64.General, b blas64.General, work []float
         //  v[j] = 0           j < i
         //  v[j] = 1           j == i
         //  v[j] = a[j*lda+i]  j > i
        -// and computing H_i = I - tau[i] * v * v^T.
        +// and computing H_i = I - tau[i] * v * vᵀ.
         //
         // The orthonormal matrix Q can be constucted from a product of these elementary
         // reflectors, Q = H_0 * H_1 * ... * H_{k-1}, where k = min(m,n).
        @@ -117,7 +144,7 @@ func Gels(trans blas.Transpose, a blas64.General, b blas64.General, work []float
         // by the temporary space available. If lwork == -1, instead of performing Geqrf,
         // the optimal work length will be stored into work[0].
         func Geqrf(a blas64.General, tau, work []float64, lwork int) {
        -	lapack64.Dgeqrf(a.Rows, a.Cols, a.Data, a.Stride, tau, work, lwork)
        +	lapack64.Dgeqrf(a.Rows, a.Cols, a.Data, max(1, a.Stride), tau, work, lwork)
         }
         
         // Gelqf computes the LQ factorization of the m×n matrix A using a blocked
        @@ -137,13 +164,13 @@ func Geqrf(a blas64.General, tau, work []float64, lwork int) {
         // by the temporary space available. If lwork == -1, instead of performing Gelqf,
         // the optimal work length will be stored into work[0].
         func Gelqf(a blas64.General, tau, work []float64, lwork int) {
        -	lapack64.Dgelqf(a.Rows, a.Cols, a.Data, a.Stride, tau, work, lwork)
        +	lapack64.Dgelqf(a.Rows, a.Cols, a.Data, max(1, a.Stride), tau, work, lwork)
         }
         
         // Gesvd computes the singular value decomposition of the input matrix A.
         //
         // The singular value decomposition is
        -//  A = U * Sigma * V^T
        +//  A = U * Sigma * Vᵀ
         // where Sigma is an m×n diagonal matrix containing the singular values of A,
         // U is an m×m orthogonal matrix and V is an n×n orthogonal matrix. The first
         // min(m,n) columns of U and V are the left and right singular vectors of A
        @@ -155,7 +182,7 @@ func Gelqf(a blas64.General, tau, work []float64, lwork int) {
         //  jobU == lapack.SVDStore     The first min(m,n) columns are returned in u
         //  jobU == lapack.SVDOverwrite The first min(m,n) columns of U are written into a
         //  jobU == lapack.SVDNone      The columns of U are not computed.
        -// The behavior is the same for jobVT and the rows of V^T. At most one of jobU
        +// The behavior is the same for jobVT and the rows of Vᵀ. At most one of jobU
         // and jobVT can equal lapack.SVDOverwrite, and Gesvd will panic otherwise.
         //
         // On entry, a contains the data for the m×n matrix A. During the call to Gesvd
        @@ -183,7 +210,7 @@ func Gelqf(a blas64.General, tau, work []float64, lwork int) {
         //
         // Gesvd returns whether the decomposition successfully completed.
         func Gesvd(jobU, jobVT lapack.SVDJob, a, u, vt blas64.General, s, work []float64, lwork int) (ok bool) {
        -	return lapack64.Dgesvd(jobU, jobVT, a.Rows, a.Cols, a.Data, a.Stride, s, u.Data, u.Stride, vt.Data, vt.Stride, work, lwork)
        +	return lapack64.Dgesvd(jobU, jobVT, a.Rows, a.Cols, a.Data, max(1, a.Stride), s, u.Data, max(1, u.Stride), vt.Data, max(1, vt.Stride), work, lwork)
         }
         
         // Getrf computes the LU decomposition of the m×n matrix A.
        @@ -204,7 +231,7 @@ func Gesvd(jobU, jobVT lapack.SVDJob, a, u, vt blas64.General, s, work []float64
         // will occur if the false is returned and the result is used to solve a
         // system of equations.
         func Getrf(a blas64.General, ipiv []int) bool {
        -	return lapack64.Dgetrf(a.Rows, a.Cols, a.Data, a.Stride, ipiv)
        +	return lapack64.Dgetrf(a.Rows, a.Cols, a.Data, max(1, a.Stride), ipiv)
         }
         
         // Getri computes the inverse of the matrix A using the LU factorization computed
        @@ -220,13 +247,13 @@ func Getrf(a blas64.General, ipiv []int) bool {
         // by the temporary space available. If lwork == -1, instead of performing Getri,
         // the optimal work length will be stored into work[0].
         func Getri(a blas64.General, ipiv []int, work []float64, lwork int) (ok bool) {
        -	return lapack64.Dgetri(a.Cols, a.Data, a.Stride, ipiv, work, lwork)
        +	return lapack64.Dgetri(a.Cols, a.Data, max(1, a.Stride), ipiv, work, lwork)
         }
         
         // Getrs solves a system of equations using an LU factorization.
         // The system of equations solved is
        -//  A * X = B if trans == blas.Trans
        -//  A^T * X = B if trans == blas.NoTrans
        +//  A * X = B   if trans == blas.Trans
        +//  Aᵀ * X = B  if trans == blas.NoTrans
         // A is a general n×n matrix with stride lda. B is a general matrix of size n×nrhs.
         //
         // On entry b contains the elements of the matrix B. On exit, b contains the
        @@ -235,18 +262,18 @@ func Getri(a blas64.General, ipiv []int, work []float64, lwork int) (ok bool) {
         // a and ipiv contain the LU factorization of A and the permutation indices as
         // computed by Getrf. ipiv is zero-indexed.
         func Getrs(trans blas.Transpose, a blas64.General, b blas64.General, ipiv []int) {
        -	lapack64.Dgetrs(trans, a.Cols, b.Cols, a.Data, a.Stride, ipiv, b.Data, b.Stride)
        +	lapack64.Dgetrs(trans, a.Cols, b.Cols, a.Data, max(1, a.Stride), ipiv, b.Data, max(1, b.Stride))
         }
         
         // Ggsvd3 computes the generalized singular value decomposition (GSVD)
         // of an m×n matrix A and p×n matrix B:
        -//  U^T*A*Q = D1*[ 0 R ]
        +//  Uᵀ*A*Q = D1*[ 0 R ]
         //
        -//  V^T*B*Q = D2*[ 0 R ]
        +//  Vᵀ*B*Q = D2*[ 0 R ]
         // where U, V and Q are orthogonal matrices.
         //
         // Ggsvd3 returns k and l, the dimensions of the sub-blocks. k+l
        -// is the effective numerical rank of the (m+p)×n matrix [ A^T B^T ]^T.
        +// is the effective numerical rank of the (m+p)×n matrix [ Aᵀ Bᵀ ]ᵀ.
         // R is a (k+l)×(k+l) nonsingular upper triangular matrix, D1 and
         // D2 are m×(k+l) and p×(k+l) diagonal matrices and of the following
         // structures, respectively:
        @@ -335,7 +362,7 @@ func Getrs(trans blas.Transpose, a blas64.General, b blas64.General, ipiv []int)
         // lwork is -1, work[0] holds the optimal lwork on return, but Ggsvd3 does
         // not perform the GSVD.
         func Ggsvd3(jobU, jobV, jobQ lapack.GSVDJob, a, b blas64.General, alpha, beta []float64, u, v, q blas64.General, work []float64, lwork int, iwork []int) (k, l int, ok bool) {
        -	return lapack64.Dggsvd3(jobU, jobV, jobQ, a.Rows, a.Cols, b.Rows, a.Data, a.Stride, b.Data, b.Stride, alpha, beta, u.Data, u.Stride, v.Data, v.Stride, q.Data, q.Stride, work, lwork, iwork)
        +	return lapack64.Dggsvd3(jobU, jobV, jobQ, a.Rows, a.Cols, b.Rows, a.Data, max(1, a.Stride), b.Data, max(1, b.Stride), alpha, beta, u.Data, max(1, u.Stride), v.Data, max(1, v.Stride), q.Data, max(1, q.Stride), work, lwork, iwork)
         }
         
         // Lange computes the matrix norm of the general m×n matrix A. The input norm
        @@ -347,7 +374,7 @@ func Ggsvd3(jobU, jobV, jobQ lapack.GSVDJob, a, b blas64.General, alpha, beta []
         // If norm == lapack.MaxColumnSum, work must be of length n, and this function will panic otherwise.
         // There are no restrictions on work for the other matrix norms.
         func Lange(norm lapack.MatrixNorm, a blas64.General, work []float64) float64 {
        -	return lapack64.Dlange(norm, a.Rows, a.Cols, a.Data, a.Stride, work)
        +	return lapack64.Dlange(norm, a.Rows, a.Cols, a.Data, max(1, a.Stride), work)
         }
         
         // Lansy computes the specified norm of an n×n symmetric matrix. If
        @@ -355,14 +382,14 @@ func Lange(norm lapack.MatrixNorm, a blas64.General, work []float64) float64 {
         // at least n and this function will panic otherwise.
         // There are no restrictions on work for the other matrix norms.
         func Lansy(norm lapack.MatrixNorm, a blas64.Symmetric, work []float64) float64 {
        -	return lapack64.Dlansy(norm, a.Uplo, a.N, a.Data, a.Stride, work)
        +	return lapack64.Dlansy(norm, a.Uplo, a.N, a.Data, max(1, a.Stride), work)
         }
         
         // Lantr computes the specified norm of an m×n trapezoidal matrix A. If
         // norm == lapack.MaxColumnSum work must have length at least n and this function
         // will panic otherwise. There are no restrictions on work for the other matrix norms.
         func Lantr(norm lapack.MatrixNorm, a blas64.Triangular, work []float64) float64 {
        -	return lapack64.Dlantr(norm, a.Uplo, a.Diag, a.N, a.N, a.Data, a.Stride, work)
        +	return lapack64.Dlantr(norm, a.Uplo, a.Diag, a.N, a.N, a.Data, max(1, a.Stride), work)
         }
         
         // Lapmt rearranges the columns of the m×n matrix X as specified by the
        @@ -378,15 +405,15 @@ func Lantr(norm lapack.MatrixNorm, a blas64.Triangular, work []float64) float64
         //
         // k must have length n, otherwise Lapmt will panic. k is zero-indexed.
         func Lapmt(forward bool, x blas64.General, k []int) {
        -	lapack64.Dlapmt(forward, x.Rows, x.Cols, x.Data, x.Stride, k)
        +	lapack64.Dlapmt(forward, x.Rows, x.Cols, x.Data, max(1, x.Stride), k)
         }
         
         // Ormlq multiplies the matrix C by the othogonal matrix Q defined by
         // A and tau. A and tau are as returned from Gelqf.
        -//  C = Q * C    if side == blas.Left and trans == blas.NoTrans
        -//  C = Q^T * C  if side == blas.Left and trans == blas.Trans
        -//  C = C * Q    if side == blas.Right and trans == blas.NoTrans
        -//  C = C * Q^T  if side == blas.Right and trans == blas.Trans
        +//  C = Q * C   if side == blas.Left and trans == blas.NoTrans
        +//  C = Qᵀ * C  if side == blas.Left and trans == blas.Trans
        +//  C = C * Q   if side == blas.Right and trans == blas.NoTrans
        +//  C = C * Qᵀ  if side == blas.Right and trans == blas.Trans
         // If side == blas.Left, A is a matrix of side k×m, and if side == blas.Right
         // A is of size k×n. This uses a blocked algorithm.
         //
        @@ -400,14 +427,14 @@ func Lapmt(forward bool, x blas64.General, k []int) {
         // Tau contains the Householder scales and must have length at least k, and
         // this function will panic otherwise.
         func Ormlq(side blas.Side, trans blas.Transpose, a blas64.General, tau []float64, c blas64.General, work []float64, lwork int) {
        -	lapack64.Dormlq(side, trans, c.Rows, c.Cols, a.Rows, a.Data, a.Stride, tau, c.Data, c.Stride, work, lwork)
        +	lapack64.Dormlq(side, trans, c.Rows, c.Cols, a.Rows, a.Data, max(1, a.Stride), tau, c.Data, max(1, c.Stride), work, lwork)
         }
         
         // Ormqr multiplies an m×n matrix C by an orthogonal matrix Q as
        -//  C = Q * C,    if side == blas.Left  and trans == blas.NoTrans,
        -//  C = Q^T * C,  if side == blas.Left  and trans == blas.Trans,
        -//  C = C * Q,    if side == blas.Right and trans == blas.NoTrans,
        -//  C = C * Q^T,  if side == blas.Right and trans == blas.Trans,
        +//  C = Q * C   if side == blas.Left  and trans == blas.NoTrans,
        +//  C = Qᵀ * C  if side == blas.Left  and trans == blas.Trans,
        +//  C = C * Q   if side == blas.Right and trans == blas.NoTrans,
        +//  C = C * Qᵀ  if side == blas.Right and trans == blas.Trans,
         // where Q is defined as the product of k elementary reflectors
         //  Q = H_0 * H_1 * ... * H_{k-1}.
         //
        @@ -431,7 +458,7 @@ func Ormlq(side blas.Side, trans blas.Transpose, a blas64.General, tau []float64
         // If lwork is -1, instead of performing Ormqr, the optimal workspace size will
         // be stored into work[0].
         func Ormqr(side blas.Side, trans blas.Transpose, a blas64.General, tau []float64, c blas64.General, work []float64, lwork int) {
        -	lapack64.Dormqr(side, trans, c.Rows, c.Cols, a.Cols, a.Data, a.Stride, tau, c.Data, c.Stride, work, lwork)
        +	lapack64.Dormqr(side, trans, c.Rows, c.Cols, a.Cols, a.Data, max(1, a.Stride), tau, c.Data, max(1, c.Stride), work, lwork)
         }
         
         // Pocon estimates the reciprocal of the condition number of a positive-definite
        @@ -444,7 +471,7 @@ func Ormqr(side blas.Side, trans blas.Transpose, a blas64.General, tau []float64
         //
         // iwork is a temporary data slice of length at least n and Pocon will panic otherwise.
         func Pocon(a blas64.Symmetric, anorm float64, work []float64, iwork []int) float64 {
        -	return lapack64.Dpocon(a.Uplo, a.N, a.Data, a.Stride, anorm, work, iwork)
        +	return lapack64.Dpocon(a.Uplo, a.N, a.Data, max(1, a.Stride), anorm, work, iwork)
         }
         
         // Syev computes all eigenvalues and, optionally, the eigenvectors of a real
        @@ -463,7 +490,7 @@ func Pocon(a blas64.Symmetric, anorm float64, work []float64, iwork []int) float
         // limited by the usable length. If lwork == -1, instead of computing Syev the
         // optimal work length is stored into work[0].
         func Syev(jobz lapack.EVJob, a blas64.Symmetric, w, work []float64, lwork int) (ok bool) {
        -	return lapack64.Dsyev(jobz, a.Uplo, a.N, a.Data, a.Stride, w, work, lwork)
        +	return lapack64.Dsyev(jobz, a.Uplo, a.N, a.Data, max(1, a.Stride), w, work, lwork)
         }
         
         // Trcon estimates the reciprocal of the condition number of a triangular matrix A.
        @@ -473,7 +500,7 @@ func Syev(jobz lapack.EVJob, a blas64.Symmetric, w, work []float64, lwork int) (
         //
         // iwork is a temporary data slice of length at least n and Trcon will panic otherwise.
         func Trcon(norm lapack.MatrixNorm, a blas64.Triangular, work []float64, iwork []int) float64 {
        -	return lapack64.Dtrcon(norm, a.Uplo, a.Diag, a.N, a.Data, a.Stride, work, iwork)
        +	return lapack64.Dtrcon(norm, a.Uplo, a.Diag, a.N, a.Data, max(1, a.Stride), work, iwork)
         }
         
         // Trtri computes the inverse of a triangular matrix, storing the result in place
        @@ -482,13 +509,13 @@ func Trcon(norm lapack.MatrixNorm, a blas64.Triangular, work []float64, iwork []
         // Trtri will not perform the inversion if the matrix is singular, and returns
         // a boolean indicating whether the inversion was successful.
         func Trtri(a blas64.Triangular) (ok bool) {
        -	return lapack64.Dtrtri(a.Uplo, a.Diag, a.N, a.Data, a.Stride)
        +	return lapack64.Dtrtri(a.Uplo, a.Diag, a.N, a.Data, max(1, a.Stride))
         }
         
        -// Trtrs solves a triangular system of the form A * X = B or A^T * X = B. Trtrs
        +// Trtrs solves a triangular system of the form A * X = B or Aᵀ * X = B. Trtrs
         // returns whether the solve completed successfully. If A is singular, no solve is performed.
         func Trtrs(trans blas.Transpose, a blas64.Triangular, b blas64.General) (ok bool) {
        -	return lapack64.Dtrtrs(a.Uplo, trans, a.Diag, a.N, b.Cols, a.Data, a.Stride, b.Data, b.Stride)
        +	return lapack64.Dtrtrs(a.Uplo, trans, a.Diag, a.N, b.Cols, a.Data, max(1, a.Stride), b.Data, max(1, b.Stride))
         }
         
         // Geev computes the eigenvalues and, optionally, the left and/or right
        @@ -498,8 +525,8 @@ func Trtrs(trans blas.Transpose, a blas64.Triangular, b blas64.General) (ok bool
         // is defined by
         //  A v_j = λ_j v_j,
         // and the left eigenvector u_j corresponding to an eigenvalue λ_j is defined by
        -//  u_j^H A = λ_j u_j^H,
        -// where u_j^H is the conjugate transpose of u_j.
        +//  u_jᴴ A = λ_j u_jᴴ,
        +// where u_jᴴ is the conjugate transpose of u_j.
         //
         // On return, A will be overwritten and the left and right eigenvectors will be
         // stored, respectively, in the columns of the n×n matrices VL and VR in the
        @@ -550,5 +577,5 @@ func Geev(jobvl lapack.LeftEVJob, jobvr lapack.RightEVJob, a blas64.General, wr,
         	if jobvr == lapack.RightEVCompute && (vr.Rows != n || vr.Cols != n) {
         		panic("lapack64: bad size of VR")
         	}
        -	return lapack64.Dgeev(jobvl, jobvr, n, a.Data, a.Stride, wr, wi, vl.Data, vl.Stride, vr.Data, vr.Stride, work, lwork)
        +	return lapack64.Dgeev(jobvl, jobvr, n, a.Data, max(1, a.Stride), wr, wi, vl.Data, max(1, vl.Stride), vr.Data, max(1, vr.Stride), work, lwork)
         }
        diff --git a/vendor/gonum.org/v1/gonum/mat/band.go b/vendor/gonum.org/v1/gonum/mat/band.go
        index d196a5aef..b8994b4e7 100644
        --- a/vendor/gonum.org/v1/gonum/mat/band.go
        +++ b/vendor/gonum.org/v1/gonum/mat/band.go
        @@ -5,14 +5,17 @@
         package mat
         
         import (
        +	"gonum.org/v1/gonum/blas"
         	"gonum.org/v1/gonum/blas/blas64"
         )
         
         var (
         	bandDense *BandDense
        -	_         Matrix    = bandDense
        -	_         Banded    = bandDense
        -	_         RawBander = bandDense
        +	_         Matrix      = bandDense
        +	_         allMatrix   = bandDense
        +	_         denseMatrix = bandDense
        +	_         Banded      = bandDense
        +	_         RawBander   = bandDense
         
         	_ NonZeroDoer    = bandDense
         	_ RowNonZeroDoer = bandDense
        @@ -107,6 +110,7 @@ func (t TransposeBand) UntransposeBand() Banded {
         // BandDense will be reflected in data. If neither of these is true, NewBandDense
         // will panic. kl must be at least zero and less r, and ku must be at least zero and
         // less than c, otherwise NewBandDense will panic.
        +// NewBandDense will panic if either r or c is zero.
         //
         // The data must be arranged in row-major order constructed by removing the zeros
         // from the rows outside the band and aligning the diagonals. For example, the matrix
        @@ -126,7 +130,10 @@ func (t TransposeBand) UntransposeBand() Banded {
         // which is passed to NewBandDense as []float64{*, 1, 2, 3, 4, ...} with kl=1 and ku=2.
         // Only the values in the band portion of the matrix are used.
         func NewBandDense(r, c, kl, ku int, data []float64) *BandDense {
        -	if r < 0 || c < 0 || kl < 0 || ku < 0 {
        +	if r <= 0 || c <= 0 || kl < 0 || ku < 0 {
        +		if r == 0 || c == 0 {
        +			panic(ErrZeroLength)
        +		}
         		panic("mat: negative dimension")
         	}
         	if kl+1 > r || ku+1 > c {
        @@ -184,6 +191,45 @@ func (b *BandDense) RawBand() blas64.Band {
         	return b.mat
         }
         
        +// SetRawBand sets the underlying blas64.Band used by the receiver.
        +// Changes to elements in the receiver following the call will be reflected
        +// in the input.
        +func (b *BandDense) SetRawBand(mat blas64.Band) {
        +	b.mat = mat
        +}
        +
        +// IsEmpty returns whether the receiver is empty. Empty matrices can be the
        +// receiver for size-restricted operations. The receiver can be zeroed using Reset.
        +func (b *BandDense) IsEmpty() bool {
        +	return b.mat.Stride == 0
        +}
        +
        +// Reset empties the matrix so that it can be reused as the
        +// receiver of a dimensionally restricted operation.
        +//
        +// Reset should not be used when the matrix shares backing data.
        +// See the Reseter interface for more information.
        +func (b *BandDense) Reset() {
        +	b.mat.Rows = 0
        +	b.mat.Cols = 0
        +	b.mat.KL = 0
        +	b.mat.KU = 0
        +	b.mat.Stride = 0
        +	b.mat.Data = b.mat.Data[:0:0]
        +}
        +
        +// DiagView returns the diagonal as a matrix backed by the original data.
        +func (b *BandDense) DiagView() Diagonal {
        +	n := min(b.mat.Rows, b.mat.Cols)
        +	return &DiagDense{
        +		mat: blas64.Vector{
        +			N:    n,
        +			Inc:  b.mat.Stride,
        +			Data: b.mat.Data[b.mat.KL : (n-1)*b.mat.Stride+b.mat.KL+1],
        +		},
        +	}
        +}
        +
         // DoNonZero calls the function fn for each of the non-zero elements of b. The function fn
         // takes a row/column index and the element value of b at (i, j).
         func (b *BandDense) DoNonZero(fn func(i, j int, v float64)) {
        @@ -226,3 +272,64 @@ func (b *BandDense) DoColNonZero(j int, fn func(i, j int, v float64)) {
         		}
         	}
         }
        +
        +// Zero sets all of the matrix elements to zero.
        +func (b *BandDense) Zero() {
        +	m := b.mat.Rows
        +	kL := b.mat.KL
        +	nCol := b.mat.KU + 1 + kL
        +	for i := 0; i < m; i++ {
        +		l := max(0, kL-i)
        +		u := min(nCol, m+kL-i)
        +		zero(b.mat.Data[i*b.mat.Stride+l : i*b.mat.Stride+u])
        +	}
        +}
        +
        +// Trace computes the trace of the matrix.
        +func (b *BandDense) Trace() float64 {
        +	r, c := b.Dims()
        +	if r != c {
        +		panic(ErrShape)
        +	}
        +	rb := b.RawBand()
        +	var tr float64
        +	for i := 0; i < r; i++ {
        +		tr += rb.Data[rb.KL+i*rb.Stride]
        +	}
        +	return tr
        +}
        +
        +// MulVecTo computes B⋅x or Bᵀ⋅x storing the result into dst.
        +func (b *BandDense) MulVecTo(dst *VecDense, trans bool, x Vector) {
        +	m, n := b.Dims()
        +	if trans {
        +		m, n = n, m
        +	}
        +	if x.Len() != n {
        +		panic(ErrShape)
        +	}
        +	dst.reuseAsNonZeroed(m)
        +
        +	t := blas.NoTrans
        +	if trans {
        +		t = blas.Trans
        +	}
        +
        +	xMat, _ := untransposeExtract(x)
        +	if xVec, ok := xMat.(*VecDense); ok {
        +		if dst != xVec {
        +			dst.checkOverlap(xVec.mat)
        +			blas64.Gbmv(t, 1, b.mat, xVec.mat, 0, dst.mat)
        +		} else {
        +			xCopy := getWorkspaceVec(n, false)
        +			xCopy.CloneVec(xVec)
        +			blas64.Gbmv(t, 1, b.mat, xCopy.mat, 0, dst.mat)
        +			putWorkspaceVec(xCopy)
        +		}
        +	} else {
        +		xCopy := getWorkspaceVec(n, false)
        +		xCopy.CloneVec(x)
        +		blas64.Gbmv(t, 1, b.mat, xCopy.mat, 0, dst.mat)
        +		putWorkspaceVec(xCopy)
        +	}
        +}
        diff --git a/vendor/gonum.org/v1/gonum/mat/cdense.go b/vendor/gonum.org/v1/gonum/mat/cdense.go
        new file mode 100644
        index 000000000..4a1b453ac
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/mat/cdense.go
        @@ -0,0 +1,202 @@
        +// Copyright ©2019 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package mat
        +
        +import "gonum.org/v1/gonum/blas/cblas128"
        +
        +var (
        +	cDense *CDense
        +
        +	_ CMatrix   = cDense
        +	_ allMatrix = cDense
        +)
        +
        +// CDense is a dense matrix representation with complex data.
        +type CDense struct {
        +	mat cblas128.General
        +
        +	capRows, capCols int
        +}
        +
        +// Dims returns the number of rows and columns in the matrix.
        +func (m *CDense) Dims() (r, c int) {
        +	return m.mat.Rows, m.mat.Cols
        +}
        +
        +// H performs an implicit conjugate transpose by returning the receiver inside a
        +// Conjugate.
        +func (m *CDense) H() CMatrix {
        +	return Conjugate{m}
        +}
        +
        +// NewCDense creates a new complex Dense matrix with r rows and c columns.
        +// If data == nil, a new slice is allocated for the backing slice.
        +// If len(data) == r*c, data is used as the backing slice, and changes to the
        +// elements of the returned CDense will be reflected in data.
        +// If neither of these is true, NewCDense will panic.
        +// NewCDense will panic if either r or c is zero.
        +//
        +// The data must be arranged in row-major order, i.e. the (i*c + j)-th
        +// element in the data slice is the {i, j}-th element in the matrix.
        +func NewCDense(r, c int, data []complex128) *CDense {
        +	if r <= 0 || c <= 0 {
        +		if r == 0 || c == 0 {
        +			panic(ErrZeroLength)
        +		}
        +		panic("mat: negative dimension")
        +	}
        +	if data != nil && r*c != len(data) {
        +		panic(ErrShape)
        +	}
        +	if data == nil {
        +		data = make([]complex128, r*c)
        +	}
        +	return &CDense{
        +		mat: cblas128.General{
        +			Rows:   r,
        +			Cols:   c,
        +			Stride: c,
        +			Data:   data,
        +		},
        +		capRows: r,
        +		capCols: c,
        +	}
        +}
        +
        +// ReuseAs changes the receiver if it IsEmpty() to be of size r×c.
        +//
        +// ReuseAs re-uses the backing data slice if it has sufficient capacity,
        +// otherwise a new slice is allocated. The backing data is zero on return.
        +//
        +// ReuseAs panics if the receiver is not empty, and panics if
        +// the input sizes are less than one. To empty the receiver for re-use,
        +// Reset should be used.
        +func (m *CDense) ReuseAs(r, c int) {
        +	if r <= 0 || c <= 0 {
        +		if r == 0 || c == 0 {
        +			panic(ErrZeroLength)
        +		}
        +		panic(ErrNegativeDimension)
        +	}
        +	if !m.IsEmpty() {
        +		panic(ErrReuseNonEmpty)
        +	}
        +	m.reuseAsZeroed(r, c)
        +}
        +
        +// reuseAs resizes an empty matrix to a r×c matrix,
        +// or checks that a non-empty matrix is r×c.
        +//
        +// reuseAs must be kept in sync with reuseAsZeroed.
        +func (m *CDense) reuseAsNonZeroed(r, c int) {
        +	if m.mat.Rows > m.capRows || m.mat.Cols > m.capCols {
        +		// Panic as a string, not a mat.Error.
        +		panic("mat: caps not correctly set")
        +	}
        +	if r == 0 || c == 0 {
        +		panic(ErrZeroLength)
        +	}
        +	if m.IsEmpty() {
        +		m.mat = cblas128.General{
        +			Rows:   r,
        +			Cols:   c,
        +			Stride: c,
        +			Data:   useC(m.mat.Data, r*c),
        +		}
        +		m.capRows = r
        +		m.capCols = c
        +		return
        +	}
        +	if r != m.mat.Rows || c != m.mat.Cols {
        +		panic(ErrShape)
        +	}
        +}
        +
        +func (m *CDense) reuseAsZeroed(r, c int) {
        +	// This must be kept in-sync with reuseAs.
        +	if m.mat.Rows > m.capRows || m.mat.Cols > m.capCols {
        +		// Panic as a string, not a mat.Error.
        +		panic("mat: caps not correctly set")
        +	}
        +	if r == 0 || c == 0 {
        +		panic(ErrZeroLength)
        +	}
        +	if m.IsEmpty() {
        +		m.mat = cblas128.General{
        +			Rows:   r,
        +			Cols:   c,
        +			Stride: c,
        +			Data:   useZeroedC(m.mat.Data, r*c),
        +		}
        +		m.capRows = r
        +		m.capCols = c
        +		return
        +	}
        +	if r != m.mat.Rows || c != m.mat.Cols {
        +		panic(ErrShape)
        +	}
        +	m.Zero()
        +}
        +
        +// Reset zeros the dimensions of the matrix so that it can be reused as the
        +// receiver of a dimensionally restricted operation.
        +//
        +// Reset should not be used when the matrix shares backing data.
        +// See the Reseter interface for more information.
        +func (m *CDense) Reset() {
        +	// Row, Cols and Stride must be zeroed in unison.
        +	m.mat.Rows, m.mat.Cols, m.mat.Stride = 0, 0, 0
        +	m.capRows, m.capCols = 0, 0
        +	m.mat.Data = m.mat.Data[:0]
        +}
        +
        +// IsEmpty returns whether the receiver is empty. Empty matrices can be the
        +// receiver for size-restricted operations. The receiver can be zeroed using Reset.
        +func (m *CDense) IsEmpty() bool {
        +	// It must be the case that m.Dims() returns
        +	// zeros in this case. See comment in Reset().
        +	return m.mat.Stride == 0
        +}
        +
        +// Zero sets all of the matrix elements to zero.
        +func (m *CDense) Zero() {
        +	r := m.mat.Rows
        +	c := m.mat.Cols
        +	for i := 0; i < r; i++ {
        +		zeroC(m.mat.Data[i*m.mat.Stride : i*m.mat.Stride+c])
        +	}
        +}
        +
        +// Copy makes a copy of elements of a into the receiver. It is similar to the
        +// built-in copy; it copies as much as the overlap between the two matrices and
        +// returns the number of rows and columns it copied. If a aliases the receiver
        +// and is a transposed Dense or VecDense, with a non-unitary increment, Copy will
        +// panic.
        +//
        +// See the Copier interface for more information.
        +func (m *CDense) Copy(a CMatrix) (r, c int) {
        +	r, c = a.Dims()
        +	if a == m {
        +		return r, c
        +	}
        +	r = min(r, m.mat.Rows)
        +	c = min(c, m.mat.Cols)
        +	if r == 0 || c == 0 {
        +		return 0, 0
        +	}
        +	// TODO(btracey): Check for overlap when complex version exists.
        +	// TODO(btracey): Add fast-paths.
        +	for i := 0; i < r; i++ {
        +		for j := 0; j < c; j++ {
        +			m.set(i, j, a.At(i, j))
        +		}
        +	}
        +	return r, c
        +}
        +
        +// RawCMatrix returns the underlying cblas128.General used by the receiver.
        +// Changes to elements in the receiver following the call will be reflected
        +// in returned cblas128.General.
        +func (m *CDense) RawCMatrix() cblas128.General { return m.mat }
        diff --git a/vendor/gonum.org/v1/gonum/mat/cholesky.go b/vendor/gonum.org/v1/gonum/mat/cholesky.go
        index 9c32b8687..9082c21b8 100644
        --- a/vendor/gonum.org/v1/gonum/mat/cholesky.go
        +++ b/vendor/gonum.org/v1/gonum/mat/cholesky.go
        @@ -17,8 +17,21 @@ const (
         	badCholesky = "mat: invalid Cholesky factorization"
         )
         
        -// Cholesky is a type for creating and using the Cholesky factorization of a
        -// symmetric positive definite matrix.
        +var (
        +	_ Matrix    = (*Cholesky)(nil)
        +	_ Symmetric = (*Cholesky)(nil)
        +)
        +
        +// Cholesky is a symmetric positive definite matrix represented by its
        +// Cholesky decomposition.
        +//
        +// The decomposition can be constructed using the Factorize method. The
        +// factorization itself can be extracted using the UTo or LTo methods, and the
        +// original symmetric matrix can be recovered with ToSym.
        +//
        +// Note that this matrix representation is useful for certain operations, in
        +// particular finding solutions to linear equations. It is very inefficient
        +// at other operations, in particular At is slow.
         //
         // Cholesky methods may only be called on a value that has been successfully
         // initialized by a call to Factorize that has returned true. Calls to methods
        @@ -42,8 +55,8 @@ func (c *Cholesky) updateCond(norm float64) {
         	if norm < 0 {
         		// This is an approximation. By the definition of a norm,
         		//  |AB| <= |A| |B|.
        -		// Since A = U^T*U, we get for the condition number κ that
        -		//  κ(A) := |A| |A^-1| = |U^T*U| |A^-1| <= |U^T| |U| |A^-1|,
        +		// Since A = Uᵀ*U, we get for the condition number κ that
        +		//  κ(A) := |A| |A^-1| = |Uᵀ*U| |A^-1| <= |Uᵀ| |U| |A^-1|,
         		// so this will overestimate the condition number somewhat.
         		// The norm of the original factorized matrix cannot be stored
         		// because of update possibilities.
        @@ -58,8 +71,52 @@ func (c *Cholesky) updateCond(norm float64) {
         	c.cond = 1 / v
         }
         
        +// Dims returns the dimensions of the matrix.
        +func (ch *Cholesky) Dims() (r, c int) {
        +	if !ch.valid() {
        +		panic(badCholesky)
        +	}
        +	r, c = ch.chol.Dims()
        +	return r, c
        +}
        +
        +// At returns the element at row i, column j.
        +func (c *Cholesky) At(i, j int) float64 {
        +	if !c.valid() {
        +		panic(badCholesky)
        +	}
        +	n := c.Symmetric()
        +	if uint(i) >= uint(n) {
        +		panic(ErrRowAccess)
        +	}
        +	if uint(j) >= uint(n) {
        +		panic(ErrColAccess)
        +	}
        +
        +	var val float64
        +	for k := 0; k <= min(i, j); k++ {
        +		val += c.chol.at(k, i) * c.chol.at(k, j)
        +	}
        +	return val
        +}
        +
        +// T returns the the receiver, the transpose of a symmetric matrix.
        +func (c *Cholesky) T() Matrix {
        +	return c
        +}
        +
        +// Symmetric implements the Symmetric interface and returns the number of rows
        +// in the matrix (this is also the number of columns).
        +func (c *Cholesky) Symmetric() int {
        +	r, _ := c.chol.Dims()
        +	return r
        +}
        +
         // Cond returns the condition number of the factorized matrix.
         func (c *Cholesky) Cond() float64 {
        +	if !c.valid() {
        +		panic(badCholesky)
        +	}
         	return c.cond
         }
         
        @@ -97,10 +154,19 @@ func (c *Cholesky) Reset() {
         	c.cond = math.Inf(1)
         }
         
        +// IsEmpty returns whether the receiver is empty. Empty matrices can be the
        +// receiver for size-restricted operations. The receiver can be emptied using
        +// Reset.
        +func (c *Cholesky) IsEmpty() bool {
        +	return c.chol == nil || c.chol.IsEmpty()
        +}
        +
         // SetFromU sets the Cholesky decomposition from the given triangular matrix.
        -// SetFromU panics if t is not upper triangular. Note that t is copied into,
        -// not stored inside, the receiver.
        -func (c *Cholesky) SetFromU(t *TriDense) {
        +// SetFromU panics if t is not upper triangular. If the receiver is empty it
        +// is resized to be n×n, the size of t. If dst is non-empty, SetFromU panics
        +// if c is not of size n×n. Note that t is copied into, not stored inside, the
        +// receiver.
        +func (c *Cholesky) SetFromU(t Triangular) {
         	n, kind := t.Triangle()
         	if kind != Upper {
         		panic("cholesky: matrix must be upper triangular")
        @@ -108,7 +174,7 @@ func (c *Cholesky) SetFromU(t *TriDense) {
         	if c.chol == nil {
         		c.chol = NewTriDense(n, Upper, nil)
         	} else {
        -		c.chol = NewTriDense(n, Upper, use(c.chol.mat.Data, n*n))
        +		c.chol.reuseAsNonZeroed(n, Upper)
         	}
         	c.chol.Copy(t)
         	c.updateCond(-1)
        @@ -121,7 +187,7 @@ func (c *Cholesky) Clone(chol *Cholesky) {
         	if !chol.valid() {
         		panic(badCholesky)
         	}
        -	n := chol.Size()
        +	n := chol.Symmetric()
         	if c.chol == nil {
         		c.chol = NewTriDense(n, Upper, nil)
         	} else {
        @@ -131,14 +197,6 @@ func (c *Cholesky) Clone(chol *Cholesky) {
         	c.cond = chol.cond
         }
         
        -// Size returns the dimension of the factorized matrix.
        -func (c *Cholesky) Size() int {
        -	if !c.valid() {
        -		panic(badCholesky)
        -	}
        -	return c.chol.mat.N
        -}
        -
         // Det returns the determinant of the matrix that has been factorized.
         func (c *Cholesky) Det() float64 {
         	if !c.valid() {
        @@ -159,9 +217,9 @@ func (c *Cholesky) LogDet() float64 {
         	return det
         }
         
        -// Solve finds the matrix x that solves A * X = B where A is represented
        -// by the Cholesky decomposition, placing the result in x.
        -func (c *Cholesky) Solve(x *Dense, b Matrix) error {
        +// SolveTo finds the matrix X that solves A * X = B where A is represented
        +// by the Cholesky decomposition. The result is stored in-place into dst.
        +func (c *Cholesky) SolveTo(dst *Dense, b Matrix) error {
         	if !c.valid() {
         		panic(badCholesky)
         	}
        @@ -171,20 +229,21 @@ func (c *Cholesky) Solve(x *Dense, b Matrix) error {
         		panic(ErrShape)
         	}
         
        -	x.reuseAs(bm, bn)
        -	if b != x {
        -		x.Copy(b)
        +	dst.reuseAsNonZeroed(bm, bn)
        +	if b != dst {
        +		dst.Copy(b)
         	}
        -	lapack64.Potrs(c.chol.mat, x.mat)
        +	lapack64.Potrs(c.chol.mat, dst.mat)
         	if c.cond > ConditionTolerance {
         		return Condition(c.cond)
         	}
         	return nil
         }
         
        -// SolveChol finds the matrix x that solves A * X = B where A and B are represented
        -// by their Cholesky decompositions a and b, placing the result in x.
        -func (a *Cholesky) SolveChol(x *Dense, b *Cholesky) error {
        +// SolveCholTo finds the matrix X that solves A * X = B where A and B are represented
        +// by their Cholesky decompositions a and b. The result is stored in-place into
        +// dst.
        +func (a *Cholesky) SolveCholTo(dst *Dense, b *Cholesky) error {
         	if !a.valid() || !b.valid() {
         		panic(badCholesky)
         	}
        @@ -193,20 +252,21 @@ func (a *Cholesky) SolveChol(x *Dense, b *Cholesky) error {
         		panic(ErrShape)
         	}
         
        -	x.reuseAsZeroed(bn, bn)
        -	x.Copy(b.chol.T())
        -	blas64.Trsm(blas.Left, blas.Trans, 1, a.chol.mat, x.mat)
        -	blas64.Trsm(blas.Left, blas.NoTrans, 1, a.chol.mat, x.mat)
        -	blas64.Trmm(blas.Right, blas.NoTrans, 1, b.chol.mat, x.mat)
        +	dst.reuseAsZeroed(bn, bn)
        +	dst.Copy(b.chol.T())
        +	blas64.Trsm(blas.Left, blas.Trans, 1, a.chol.mat, dst.mat)
        +	blas64.Trsm(blas.Left, blas.NoTrans, 1, a.chol.mat, dst.mat)
        +	blas64.Trmm(blas.Right, blas.NoTrans, 1, b.chol.mat, dst.mat)
         	if a.cond > ConditionTolerance {
         		return Condition(a.cond)
         	}
         	return nil
         }
         
        -// SolveVec finds the vector x that solves A * x = b where A is represented
        -// by the Cholesky decomposition, placing the result in x.
        -func (c *Cholesky) SolveVec(x *VecDense, b Vector) error {
        +// SolveVecTo finds the vector X that solves A * x = b where A is represented
        +// by the Cholesky decomposition. The result is stored in-place into
        +// dst.
        +func (c *Cholesky) SolveVecTo(dst *VecDense, b Vector) error {
         	if !c.valid() {
         		panic(badCholesky)
         	}
        @@ -216,18 +276,18 @@ func (c *Cholesky) SolveVec(x *VecDense, b Vector) error {
         	}
         	switch rv := b.(type) {
         	default:
        -		x.reuseAs(n)
        -		return c.Solve(x.asDense(), b)
        +		dst.reuseAsNonZeroed(n)
        +		return c.SolveTo(dst.asDense(), b)
         	case RawVectorer:
         		bmat := rv.RawVector()
        -		if x != b {
        -			x.checkOverlap(bmat)
        +		if dst != b {
        +			dst.checkOverlap(bmat)
         		}
        -		x.reuseAs(n)
        -		if x != b {
        -			x.CopyVec(b)
        +		dst.reuseAsNonZeroed(n)
        +		if dst != b {
        +			dst.CopyVec(b)
         		}
        -		lapack64.Potrs(c.chol.mat, x.asGeneral())
        +		lapack64.Potrs(c.chol.mat, dst.asGeneral())
         		if c.cond > ConditionTolerance {
         			return Condition(c.cond)
         		}
        @@ -242,57 +302,98 @@ func (c *Cholesky) RawU() Triangular {
         	return c.chol
         }
         
        -// UTo extracts the n×n upper triangular matrix U from a Cholesky
        -// decomposition into dst and returns the result. If dst is nil a new
        -// TriDense is allocated.
        -//  A = U^T * U.
        -func (c *Cholesky) UTo(dst *TriDense) *TriDense {
        +// UTo stores into dst the n×n upper triangular matrix U from a Cholesky
        +// decomposition
        +//  A = Uᵀ * U.
        +// If dst is empty, it is resized to be an n×n upper triangular matrix. When dst
        +// is non-empty, UTo panics if dst is not n×n or not Upper. UTo will also panic
        +// if the receiver does not contain a successful factorization.
        +func (c *Cholesky) UTo(dst *TriDense) {
         	if !c.valid() {
         		panic(badCholesky)
         	}
         	n := c.chol.mat.N
        -	if dst == nil {
        -		dst = NewTriDense(n, Upper, make([]float64, n*n))
        +	if dst.IsEmpty() {
        +		dst.ReuseAsTri(n, Upper)
         	} else {
        -		dst.reuseAs(n, Upper)
        +		n2, kind := dst.Triangle()
        +		if n != n2 {
        +			panic(ErrShape)
        +		}
        +		if kind != Upper {
        +			panic(ErrTriangle)
        +		}
         	}
         	dst.Copy(c.chol)
        -	return dst
         }
         
        -// LTo extracts the n×n lower triangular matrix L from a Cholesky
        -// decomposition into dst and returns the result. If dst is nil a new
        -// TriDense is allocated.
        -//  A = L * L^T.
        -func (c *Cholesky) LTo(dst *TriDense) *TriDense {
        +// LTo stores into dst the n×n lower triangular matrix L from a Cholesky
        +// decomposition
        +//  A = L * Lᵀ.
        +// If dst is empty, it is resized to be an n×n lower triangular matrix. When dst
        +// is non-empty, LTo panics if dst is not n×n or not Lower. LTo will also panic
        +// if the receiver does not contain a successful factorization.
        +func (c *Cholesky) LTo(dst *TriDense) {
         	if !c.valid() {
         		panic(badCholesky)
         	}
         	n := c.chol.mat.N
        -	if dst == nil {
        -		dst = NewTriDense(n, Lower, make([]float64, n*n))
        +	if dst.IsEmpty() {
        +		dst.ReuseAsTri(n, Lower)
         	} else {
        -		dst.reuseAs(n, Lower)
        +		n2, kind := dst.Triangle()
        +		if n != n2 {
        +			panic(ErrShape)
        +		}
        +		if kind != Lower {
        +			panic(ErrTriangle)
        +		}
         	}
         	dst.Copy(c.chol.TTri())
        -	return dst
         }
         
        -// ToSym reconstructs the original positive definite matrix given its
        -// Cholesky decomposition into dst and returns the result. If dst is nil
        -// a new SymDense is allocated.
        -func (c *Cholesky) ToSym(dst *SymDense) *SymDense {
        +// ToSym reconstructs the original positive definite matrix from its
        +// Cholesky decomposition, storing the result into dst. If dst is
        +// empty it is resized to be n×n. If dst is non-empty, ToSym panics
        +// if dst is not of size n×n. ToSym will also panic if the receiver
        +// does not contain a successful factorization.
        +func (c *Cholesky) ToSym(dst *SymDense) {
         	if !c.valid() {
         		panic(badCholesky)
         	}
         	n := c.chol.mat.N
        -	if dst == nil {
        -		dst = NewSymDense(n, make([]float64, n*n))
        +	if dst.IsEmpty() {
        +		dst.ReuseAsSym(n)
         	} else {
        -		dst.reuseAs(n)
        +		n2 := dst.Symmetric()
        +		if n != n2 {
        +			panic(ErrShape)
        +		}
        +	}
        +	// Create a TriDense representing the Cholesky factor U with dst's
        +	// backing slice.
        +	// Operations on u are reflected in s.
        +	u := &TriDense{
        +		mat: blas64.Triangular{
        +			Uplo:   blas.Upper,
        +			Diag:   blas.NonUnit,
        +			N:      n,
        +			Data:   dst.mat.Data,
        +			Stride: dst.mat.Stride,
        +		},
        +		cap: n,
        +	}
        +	u.Copy(c.chol)
        +	// Compute the product Uᵀ*U using the algorithm from LAPACK/TESTING/LIN/dpot01.f
        +	a := u.mat.Data
        +	lda := u.mat.Stride
        +	bi := blas64.Implementation()
        +	for k := n - 1; k >= 0; k-- {
        +		a[k*lda+k] = bi.Ddot(k+1, a[k:], lda, a[k:], lda)
        +		if k > 0 {
        +			bi.Dtrmv(blas.Upper, blas.Trans, blas.NonUnit, k, a, lda, a[k:], lda)
        +		}
         	}
        -	dst.SymOuterK(1, c.chol.T())
        -	return dst
         }
         
         // InverseTo computes the inverse of the matrix represented by its Cholesky
        @@ -304,28 +405,40 @@ func (c *Cholesky) InverseTo(s *SymDense) error {
         	if !c.valid() {
         		panic(badCholesky)
         	}
        -	// TODO(btracey): Replace this code with a direct call to Dpotri when it
        -	// is available.
        -	s.reuseAs(c.chol.mat.N)
        -	// If:
        -	//  chol(A) = U^T * U
        -	// Then:
        -	//  chol(A^-1) = S * S^T
        -	// where S = U^-1
        -	var t TriDense
        -	err := t.InverseTri(c.chol)
        -	s.SymOuterK(1, &t)
        -	return err
        +	s.reuseAsNonZeroed(c.chol.mat.N)
        +	// Create a TriDense representing the Cholesky factor U with the backing
        +	// slice from s.
        +	// Operations on u are reflected in s.
        +	u := &TriDense{
        +		mat: blas64.Triangular{
        +			Uplo:   blas.Upper,
        +			Diag:   blas.NonUnit,
        +			N:      s.mat.N,
        +			Data:   s.mat.Data,
        +			Stride: s.mat.Stride,
        +		},
        +		cap: s.mat.N,
        +	}
        +	u.Copy(c.chol)
        +
        +	_, ok := lapack64.Potri(u.mat)
        +	if !ok {
        +		return Condition(math.Inf(1))
        +	}
        +	if c.cond > ConditionTolerance {
        +		return Condition(c.cond)
        +	}
        +	return nil
         }
         
         // Scale multiplies the original matrix A by a positive constant using
         // its Cholesky decomposition, storing the result in-place into the receiver.
         // That is, if the original Cholesky factorization is
        -//  U^T * U = A
        +//  Uᵀ * U = A
         // the updated factorization is
        -//  U'^T * U' = f A = A'
        -// Scale panics if the constant is non-positive, or if the receiver is non-zero
        -// and is of a different Size from the input.
        +//  U'ᵀ * U' = f A = A'
        +// Scale panics if the constant is non-positive, or if the receiver is non-empty
        +// and is of a different size from the input.
         func (c *Cholesky) Scale(f float64, orig *Cholesky) {
         	if !orig.valid() {
         		panic(badCholesky)
        @@ -333,7 +446,7 @@ func (c *Cholesky) Scale(f float64, orig *Cholesky) {
         	if f <= 0 {
         		panic("cholesky: scaling by a non-positive constant")
         	}
        -	n := orig.Size()
        +	n := orig.Symmetric()
         	if c.chol == nil {
         		c.chol = NewTriDense(n, Upper, nil)
         	} else if c.chol.mat.N != n {
        @@ -352,10 +465,11 @@ func (c *Cholesky) Scale(f float64, orig *Cholesky) {
         // that k > w' A^-1 w. If this condition does not hold then ExtendVecSym will
         // return false and the receiver will not be updated.
         //
        -// ExtendVecSym will panic if v.Len() != a.Size()+1 or if a does not contain
        +// ExtendVecSym will panic if v.Len() != a.Symmetric()+1 or if a does not contain
         // a valid decomposition.
        -func (chol *Cholesky) ExtendVecSym(a *Cholesky, v Vector) (ok bool) {
        -	n := a.Size()
        +func (c *Cholesky) ExtendVecSym(a *Cholesky, v Vector) (ok bool) {
        +	n := a.Symmetric()
        +
         	if v.Len() != n+1 {
         		panic(badSliceLength)
         	}
        @@ -387,10 +501,10 @@ func (chol *Cholesky) ExtendVecSym(a *Cholesky, v Vector) (ok bool) {
         	}
         	k := v.At(n, 0)
         
        -	c := NewVecDense(n, nil)
        -	c.SolveVec(a.chol.T(), w)
        +	var t VecDense
        +	_ = t.SolveVec(a.chol.T(), w)
         
        -	dot := Dot(c, c)
        +	dot := Dot(&t, &t)
         	if dot >= k {
         		return false
         	}
        @@ -399,20 +513,20 @@ func (chol *Cholesky) ExtendVecSym(a *Cholesky, v Vector) (ok bool) {
         	newU := NewTriDense(n+1, Upper, nil)
         	newU.Copy(a.chol)
         	for i := 0; i < n; i++ {
        -		newU.SetTri(i, n, c.At(i, 0))
        +		newU.SetTri(i, n, t.At(i, 0))
         	}
         	newU.SetTri(n, n, d)
        -	chol.chol = newU
        -	chol.updateCond(-1)
        +	c.chol = newU
        +	c.updateCond(-1)
         	return true
         }
         
         // SymRankOne performs a rank-1 update of the original matrix A and refactorizes
         // its Cholesky factorization, storing the result into the receiver. That is, if
         // in the original Cholesky factorization
        -//  U^T * U = A,
        +//  Uᵀ * U = A,
         // in the updated factorization
        -//  U'^T * U' = A + alpha * x * x^T = A'.
        +//  U'ᵀ * U' = A + alpha * x * xᵀ = A'.
         //
         // Note that when alpha is negative, the updating problem may be ill-conditioned
         // and the results may be inaccurate, or the updated matrix A' may not be
        @@ -425,7 +539,7 @@ func (c *Cholesky) SymRankOne(orig *Cholesky, alpha float64, x Vector) (ok bool)
         	if !orig.valid() {
         		panic(badCholesky)
         	}
        -	n := orig.Size()
        +	n := orig.Symmetric()
         	if r, c := x.Dims(); r != n || c != 1 {
         		panic(ErrShape)
         	}
        @@ -478,12 +592,12 @@ func (c *Cholesky) SymRankOne(orig *Cholesky, alpha float64, x Vector) (ok bool)
         		tmp.CopyVec(x)
         		xmat = tmp.RawVector()
         	}
        -	blas64.Copy(n, xmat, blas64.Vector{Data: work, Inc: 1})
        +	blas64.Copy(xmat, blas64.Vector{N: n, Data: work, Inc: 1})
         
         	if alpha > 0 {
         		// Compute rank-1 update.
         		if alpha != 1 {
        -			blas64.Scal(n, math.Sqrt(alpha), blas64.Vector{Data: work, Inc: 1})
        +			blas64.Scal(math.Sqrt(alpha), blas64.Vector{N: n, Data: work, Inc: 1})
         		}
         		umat := c.chol.mat
         		stride := umat.Stride
        @@ -503,9 +617,9 @@ func (c *Cholesky) SymRankOne(orig *Cholesky, alpha float64, x Vector) (ok bool)
         				// Multiply the extended factorization matrix by
         				// the Givens matrix from the left. Only
         				// the i-th row and x are modified.
        -				blas64.Rot(n-i-1,
        -					blas64.Vector{Data: umat.Data[i*stride+i+1 : i*stride+n], Inc: 1},
        -					blas64.Vector{Data: work[i+1 : n], Inc: 1},
        +				blas64.Rot(
        +					blas64.Vector{N: n - i - 1, Data: umat.Data[i*stride+i+1 : i*stride+n], Inc: 1},
        +					blas64.Vector{N: n - i - 1, Data: work[i+1 : n], Inc: 1},
         					c, s)
         			}
         		}
        @@ -516,9 +630,9 @@ func (c *Cholesky) SymRankOne(orig *Cholesky, alpha float64, x Vector) (ok bool)
         	// Compute rank-1 downdate.
         	alpha = math.Sqrt(-alpha)
         	if alpha != 1 {
        -		blas64.Scal(n, alpha, blas64.Vector{Data: work, Inc: 1})
        +		blas64.Scal(alpha, blas64.Vector{N: n, Data: work, Inc: 1})
         	}
        -	// Solve U^T * p = x storing the result into work.
        +	// Solve Uᵀ * p = x storing the result into work.
         	ok = lapack64.Trtrs(blas.Trans, c.chol.RawTriangular(), blas64.General{
         		Rows:   n,
         		Cols:   1,
        @@ -530,7 +644,7 @@ func (c *Cholesky) SymRankOne(orig *Cholesky, alpha float64, x Vector) (ok bool)
         		// the factorization is valid.
         		panic(badCholesky)
         	}
        -	norm := blas64.Nrm2(n, blas64.Vector{Data: work, Inc: 1})
        +	norm := blas64.Nrm2(blas64.Vector{N: n, Data: work, Inc: 1})
         	if norm >= 1 {
         		// The updated matrix is not positive definite.
         		return false
        @@ -557,9 +671,9 @@ func (c *Cholesky) SymRankOne(orig *Cholesky, alpha float64, x Vector) (ok bool)
         		// Apply Givens matrices to U.
         		// TODO(vladimir-ch): Use workspace to avoid modifying the
         		// receiver in case an invalid factorization is created.
        -		blas64.Rot(n-i,
        -			blas64.Vector{Data: work[i:n], Inc: 1},
        -			blas64.Vector{Data: umat.Data[i*stride+i : i*stride+n], Inc: 1},
        +		blas64.Rot(
        +			blas64.Vector{N: n - i, Data: work[i:n], Inc: 1},
        +			blas64.Vector{N: n - i, Data: umat.Data[i*stride+i : i*stride+n], Inc: 1},
         			cos[i], sin[i])
         		if umat.Data[i*stride+i] == 0 {
         			// The matrix is singular (may rarely happen due to
        @@ -570,7 +684,7 @@ func (c *Cholesky) SymRankOne(orig *Cholesky, alpha float64, x Vector) (ok bool)
         			// that on the i-th row the diagonal is negative,
         			// multiply U from the left by an identity matrix that
         			// has -1 on the i-th row.
        -			blas64.Scal(n-i, -1, blas64.Vector{Data: umat.Data[i*stride+i : i*stride+n], Inc: 1})
        +			blas64.Scal(-1, blas64.Vector{N: n - i, Data: umat.Data[i*stride+i : i*stride+n], Inc: 1})
         		}
         	}
         	if ok {
        @@ -582,5 +696,5 @@ func (c *Cholesky) SymRankOne(orig *Cholesky, alpha float64, x Vector) (ok bool)
         }
         
         func (c *Cholesky) valid() bool {
        -	return c.chol != nil && !c.chol.IsZero()
        +	return c.chol != nil && !c.chol.IsEmpty()
         }
        diff --git a/vendor/gonum.org/v1/gonum/mat/cmatrix.go b/vendor/gonum.org/v1/gonum/mat/cmatrix.go
        index fa8e135b3..3a7b3dac3 100644
        --- a/vendor/gonum.org/v1/gonum/mat/cmatrix.go
        +++ b/vendor/gonum.org/v1/gonum/mat/cmatrix.go
        @@ -4,6 +4,14 @@
         
         package mat
         
        +import (
        +	"math"
        +	"math/cmplx"
        +
        +	"gonum.org/v1/gonum/blas/cblas128"
        +	"gonum.org/v1/gonum/floats"
        +)
        +
         // CMatrix is the basic matrix interface type for complex matrices.
         type CMatrix interface {
         	// Dims returns the dimensions of a Matrix.
        @@ -20,6 +28,12 @@ type CMatrix interface {
         	H() CMatrix
         }
         
        +// A RawCMatrixer can return a cblas128.General representation of the receiver. Changes to the cblas128.General.Data
        +// slice will be reflected in the original matrix, changes to the Rows, Cols and Stride fields will not.
        +type RawCMatrixer interface {
        +	RawCMatrix() cblas128.General
        +}
        +
         var (
         	_ CMatrix      = Conjugate{}
         	_ Unconjugator = Conjugate{}
        @@ -32,11 +46,11 @@ type Conjugate struct {
         	CMatrix CMatrix
         }
         
        -// At returns the value of the element at row i and column j of the transposed
        -// matrix, that is, row j and column i of the Matrix field.
        +// At returns the value of the element at row i and column j of the conjugate
        +// transposed matrix, that is, row j and column i of the Matrix field.
         func (t Conjugate) At(i, j int) complex128 {
         	z := t.CMatrix.At(j, i)
        -	return complex(real(z), -imag(z))
        +	return cmplx.Conj(z)
         }
         
         // Dims returns the dimensions of the transposed matrix. The number of rows returned
        @@ -69,3 +83,135 @@ type Unconjugator interface {
         	// conjugate transpose.
         	Unconjugate() CMatrix
         }
        +
        +// useC returns a complex128 slice with l elements, using c if it
        +// has the necessary capacity, otherwise creating a new slice.
        +func useC(c []complex128, l int) []complex128 {
        +	if l <= cap(c) {
        +		return c[:l]
        +	}
        +	return make([]complex128, l)
        +}
        +
        +// useZeroedC returns a complex128 slice with l elements, using c if it
        +// has the necessary capacity, otherwise creating a new slice. The
        +// elements of the returned slice are guaranteed to be zero.
        +func useZeroedC(c []complex128, l int) []complex128 {
        +	if l <= cap(c) {
        +		c = c[:l]
        +		zeroC(c)
        +		return c
        +	}
        +	return make([]complex128, l)
        +}
        +
        +// zeroC zeros the given slice's elements.
        +func zeroC(c []complex128) {
        +	for i := range c {
        +		c[i] = 0
        +	}
        +}
        +
        +// unconjugate unconjugates a matrix if applicable. If a is an Unconjugator, then
        +// unconjugate returns the underlying matrix and true. If it is not, then it returns
        +// the input matrix and false.
        +func unconjugate(a CMatrix) (CMatrix, bool) {
        +	if ut, ok := a.(Unconjugator); ok {
        +		return ut.Unconjugate(), true
        +	}
        +	return a, false
        +}
        +
        +// CEqual returns whether the matrices a and b have the same size
        +// and are element-wise equal.
        +func CEqual(a, b CMatrix) bool {
        +	ar, ac := a.Dims()
        +	br, bc := b.Dims()
        +	if ar != br || ac != bc {
        +		return false
        +	}
        +	// TODO(btracey): Add in fast-paths.
        +	for i := 0; i < ar; i++ {
        +		for j := 0; j < ac; j++ {
        +			if a.At(i, j) != b.At(i, j) {
        +				return false
        +			}
        +		}
        +	}
        +	return true
        +}
        +
        +// CEqualApprox returns whether the matrices a and b have the same size and contain all equal
        +// elements with tolerance for element-wise equality specified by epsilon. Matrices
        +// with non-equal shapes are not equal.
        +func CEqualApprox(a, b CMatrix, epsilon float64) bool {
        +	// TODO(btracey):
        +	ar, ac := a.Dims()
        +	br, bc := b.Dims()
        +	if ar != br || ac != bc {
        +		return false
        +	}
        +	for i := 0; i < ar; i++ {
        +		for j := 0; j < ac; j++ {
        +			if !cEqualWithinAbsOrRel(a.At(i, j), b.At(i, j), epsilon, epsilon) {
        +				return false
        +			}
        +		}
        +	}
        +	return true
        +}
        +
        +// TODO(btracey): Move these into a cmplxs if/when we have one.
        +
        +func cEqualWithinAbsOrRel(a, b complex128, absTol, relTol float64) bool {
        +	if cEqualWithinAbs(a, b, absTol) {
        +		return true
        +	}
        +	return cEqualWithinRel(a, b, relTol)
        +}
        +
        +// cEqualWithinAbs returns true if a and b have an absolute
        +// difference of less than tol.
        +func cEqualWithinAbs(a, b complex128, tol float64) bool {
        +	return a == b || cmplx.Abs(a-b) <= tol
        +}
        +
        +const minNormalFloat64 = 2.2250738585072014e-308
        +
        +// cEqualWithinRel returns true if the difference between a and b
        +// is not greater than tol times the greater value.
        +func cEqualWithinRel(a, b complex128, tol float64) bool {
        +	if a == b {
        +		return true
        +	}
        +	if cmplx.IsNaN(a) || cmplx.IsNaN(b) {
        +		return false
        +	}
        +	// Cannot play the same trick as in floats because there are multiple
        +	// possible infinities.
        +	if cmplx.IsInf(a) {
        +		if !cmplx.IsInf(b) {
        +			return false
        +		}
        +		ra := real(a)
        +		if math.IsInf(ra, 0) {
        +			if ra == real(b) {
        +				return floats.EqualWithinRel(imag(a), imag(b), tol)
        +			}
        +			return false
        +		}
        +		if imag(a) == imag(b) {
        +			return floats.EqualWithinRel(ra, real(b), tol)
        +		}
        +		return false
        +	}
        +	if cmplx.IsInf(b) {
        +		return false
        +	}
        +
        +	delta := cmplx.Abs(a - b)
        +	if delta <= minNormalFloat64 {
        +		return delta <= tol*minNormalFloat64
        +	}
        +	return delta/math.Max(cmplx.Abs(a), cmplx.Abs(b)) <= tol
        +}
        diff --git a/vendor/gonum.org/v1/gonum/mat/consts.go b/vendor/gonum.org/v1/gonum/mat/consts.go
        index a7b6370d5..3de3f5bf4 100644
        --- a/vendor/gonum.org/v1/gonum/mat/consts.go
        +++ b/vendor/gonum.org/v1/gonum/mat/consts.go
        @@ -13,42 +13,3 @@ const (
         	// Lower specifies a lower triangular matrix.
         	Lower TriKind = false
         )
        -
        -// SVDKind specifies the treatment of singular vectors during an SVD
        -// factorization.
        -type SVDKind int
        -
        -const (
        -	// SVDNone specifies that no singular vectors should be computed during
        -	// the decomposition.
        -	SVDNone SVDKind = iota + 1
        -	// SVDThin computes the thin singular vectors, that is, it computes
        -	//  A = U~ * Σ * V~^T
        -	// where U~ is of size m×min(m,n), Σ is a diagonal matrix of size min(m,n)×min(m,n)
        -	// and V~ is of size n×min(m,n).
        -	SVDThin
        -	// SVDFull computes the full singular value decomposition,
        -	//  A = U * Σ * V^T
        -	// where U is of size m×m, Σ is an m×n diagonal matrix, and V is an n×n matrix.
        -	SVDFull
        -)
        -
        -// GSVDKind specifies the treatment of singular vectors during a GSVD
        -// factorization.
        -type GSVDKind int
        -
        -const (
        -	// GSVDU specifies that the U singular vectors should be computed during
        -	// the decomposition.
        -	GSVDU GSVDKind = 1 << iota
        -	// GSVDV specifies that the V singular vectors should be computed during
        -	// the decomposition.
        -	GSVDV
        -	// GSVDQ specifies that the Q singular vectors should be computed during
        -	// the decomposition.
        -	GSVDQ
        -
        -	// GSVDNone specifies that no singular vector should be computed during
        -	// the decomposition.
        -	GSVDNone
        -)
        diff --git a/vendor/gonum.org/v1/gonum/mat/dense.go b/vendor/gonum.org/v1/gonum/mat/dense.go
        index 2057ceea1..3194d3568 100644
        --- a/vendor/gonum.org/v1/gonum/mat/dense.go
        +++ b/vendor/gonum.org/v1/gonum/mat/dense.go
        @@ -12,10 +12,12 @@ import (
         var (
         	dense *Dense
         
        -	_ Matrix  = dense
        -	_ Mutable = dense
        +	_ Matrix      = dense
        +	_ allMatrix   = dense
        +	_ denseMatrix = dense
        +	_ Mutable     = dense
         
        -	_ Cloner       = dense
        +	_ ClonerFrom   = dense
         	_ RowViewer    = dense
         	_ ColViewer    = dense
         	_ RawRowViewer = dense
        @@ -38,12 +40,16 @@ type Dense struct {
         // a new slice is allocated for the backing slice. If len(data) == r*c, data is
         // used as the backing slice, and changes to the elements of the returned Dense
         // will be reflected in data. If neither of these is true, NewDense will panic.
        +// NewDense will panic if either r or c is zero.
         //
         // The data must be arranged in row-major order, i.e. the (i*c + j)-th
         // element in the data slice is the {i, j}-th element in the matrix.
         func NewDense(r, c int, data []float64) *Dense {
        -	if r < 0 || c < 0 {
        -		panic("mat: negative dimension")
        +	if r <= 0 || c <= 0 {
        +		if r == 0 || c == 0 {
        +			panic(ErrZeroLength)
        +		}
        +		panic(ErrNegativeDimension)
         	}
         	if data != nil && r*c != len(data) {
         		panic(ErrShape)
        @@ -63,11 +69,32 @@ func NewDense(r, c int, data []float64) *Dense {
         	}
         }
         
        -// reuseAs resizes an empty matrix to a r×c matrix,
        -// or checks that a non-empty matrix is r×c.
        +// ReuseAs changes the receiver if it IsEmpty() to be of size r×c.
        +//
        +// ReuseAs re-uses the backing data slice if it has sufficient capacity,
        +// otherwise a new slice is allocated. The backing data is zero on return.
         //
        -// reuseAs must be kept in sync with reuseAsZeroed.
        -func (m *Dense) reuseAs(r, c int) {
        +// ReuseAs panics if the receiver is not empty, and panics if
        +// the input sizes are less than one. To empty the receiver for re-use,
        +// Reset should be used.
        +func (m *Dense) ReuseAs(r, c int) {
        +	if r <= 0 || c <= 0 {
        +		if r == 0 || c == 0 {
        +			panic(ErrZeroLength)
        +		}
        +		panic(ErrNegativeDimension)
        +	}
        +	if !m.IsEmpty() {
        +		panic(ErrReuseNonEmpty)
        +	}
        +	m.reuseAsZeroed(r, c)
        +}
        +
        +// reuseAsNonZeroed resizes an empty matrix to a r×c matrix,
        +// or checks that a non-empty matrix is r×c. It does not zero
        +// the data in the receiver.
        +func (m *Dense) reuseAsNonZeroed(r, c int) {
        +	// reuseAs must be kept in sync with reuseAsZeroed.
         	if m.mat.Rows > m.capRows || m.mat.Cols > m.capCols {
         		// Panic as a string, not a mat.Error.
         		panic("mat: caps not correctly set")
        @@ -75,7 +102,7 @@ func (m *Dense) reuseAs(r, c int) {
         	if r == 0 || c == 0 {
         		panic(ErrZeroLength)
         	}
        -	if m.IsZero() {
        +	if m.IsEmpty() {
         		m.mat = blas64.General{
         			Rows:   r,
         			Cols:   c,
        @@ -94,9 +121,8 @@ func (m *Dense) reuseAs(r, c int) {
         // reuseAsZeroed resizes an empty matrix to a r×c matrix,
         // or checks that a non-empty matrix is r×c. It zeroes
         // all the elements of the matrix.
        -//
        -// reuseAsZeroed must be kept in sync with reuseAs.
         func (m *Dense) reuseAsZeroed(r, c int) {
        +	// reuseAsZeroed must be kept in sync with reuseAsNonZeroed.
         	if m.mat.Rows > m.capRows || m.mat.Cols > m.capCols {
         		// Panic as a string, not a mat.Error.
         		panic("mat: caps not correctly set")
        @@ -104,7 +130,7 @@ func (m *Dense) reuseAsZeroed(r, c int) {
         	if r == 0 || c == 0 {
         		panic(ErrZeroLength)
         	}
        -	if m.IsZero() {
        +	if m.IsEmpty() {
         		m.mat = blas64.General{
         			Rows:   r,
         			Cols:   c,
        @@ -118,19 +144,16 @@ func (m *Dense) reuseAsZeroed(r, c int) {
         	if r != m.mat.Rows || c != m.mat.Cols {
         		panic(ErrShape)
         	}
        -	for i := 0; i < r; i++ {
        -		zero(m.mat.Data[i*m.mat.Stride : i*m.mat.Stride+c])
        -	}
        +	m.Zero()
         }
         
        -// untranspose untransposes a matrix if applicable. If a is an Untransposer, then
        -// untranspose returns the underlying matrix and true. If it is not, then it returns
        -// the input matrix and false.
        -func untranspose(a Matrix) (Matrix, bool) {
        -	if ut, ok := a.(Untransposer); ok {
        -		return ut.Untranspose(), true
        +// Zero sets all of the matrix elements to zero.
        +func (m *Dense) Zero() {
        +	r := m.mat.Rows
        +	c := m.mat.Cols
        +	for i := 0; i < r; i++ {
        +		zero(m.mat.Data[i*m.mat.Stride : i*m.mat.Stride+c])
         	}
        -	return a, false
         }
         
         // isolatedWorkspace returns a new dense matrix w with the size of a and
        @@ -148,9 +171,10 @@ func (m *Dense) isolatedWorkspace(a Matrix) (w *Dense, restore func()) {
         	}
         }
         
        -// Reset zeros the dimensions of the matrix so that it can be reused as the
        +// Reset empties the matrix so that it can be reused as the
         // receiver of a dimensionally restricted operation.
         //
        +// Reset should not be used when the matrix shares backing data.
         // See the Reseter interface for more information.
         func (m *Dense) Reset() {
         	// Row, Cols and Stride must be zeroed in unison.
        @@ -159,9 +183,10 @@ func (m *Dense) Reset() {
         	m.mat.Data = m.mat.Data[:0]
         }
         
        -// IsZero returns whether the receiver is zero-sized. Zero-sized matrices can be the
        -// receiver for size-restricted operations. Dense matrices can be zeroed using Reset.
        -func (m *Dense) IsZero() bool {
        +// IsEmpty returns whether the receiver is empty. Empty matrices can be the
        +// receiver for size-restricted operations. The receiver can be emptied using
        +// Reset.
        +func (m *Dense) IsEmpty() bool {
         	// It must be the case that m.Dims() returns
         	// zeros in this case. See comment in Reset().
         	return m.mat.Stride == 0
        @@ -185,7 +210,7 @@ func (m *Dense) asTriDense(n int, diag blas.Diag, uplo blas.Uplo) *TriDense {
         // DenseCopyOf returns a newly allocated copy of the elements of a.
         func DenseCopyOf(a Matrix) *Dense {
         	d := &Dense{}
        -	d.Clone(a)
        +	d.CloneFrom(a)
         	return d
         }
         
        @@ -232,9 +257,9 @@ func (m *Dense) SetCol(j int, src []float64) {
         		panic(ErrColLength)
         	}
         
        -	blas64.Copy(m.mat.Rows,
        -		blas64.Vector{Inc: 1, Data: src},
        -		blas64.Vector{Inc: m.mat.Stride, Data: m.mat.Data[j:]},
        +	blas64.Copy(
        +		blas64.Vector{N: m.mat.Rows, Inc: 1, Data: src},
        +		blas64.Vector{N: m.mat.Rows, Inc: m.mat.Stride, Data: m.mat.Data[j:]},
         	)
         }
         
        @@ -274,6 +299,18 @@ func (m *Dense) rawRowView(i int) []float64 {
         	return m.mat.Data[i*m.mat.Stride : i*m.mat.Stride+m.mat.Cols]
         }
         
        +// DiagView returns the diagonal as a matrix backed by the original data.
        +func (m *Dense) DiagView() Diagonal {
        +	n := min(m.mat.Rows, m.mat.Cols)
        +	return &DiagDense{
        +		mat: blas64.Vector{
        +			N:    n,
        +			Inc:  m.mat.Stride + 1,
        +			Data: m.mat.Data[:(n-1)*m.mat.Stride+n],
        +		},
        +	}
        +}
        +
         // Slice returns a new Matrix that shares backing data with the receiver.
         // The returned matrix starts at {i,j} of the receiver and extends k-i rows
         // and l-j columns. The final row in the resulting matrix is k-1 and the
        @@ -281,6 +318,10 @@ func (m *Dense) rawRowView(i int) []float64 {
         // Slice panics with ErrIndexOutOfRange if the slice is outside the capacity
         // of the receiver.
         func (m *Dense) Slice(i, k, j, l int) Matrix {
        +	return m.slice(i, k, j, l)
        +}
        +
        +func (m *Dense) slice(i, k, j, l int) *Dense {
         	mr, mc := m.Caps()
         	if i < 0 || mr <= i || j < 0 || mc <= j || k < i || mr < k || l < j || mc < l {
         		if i == k || j == l {
        @@ -362,12 +403,12 @@ func (m *Dense) Grow(r, c int) Matrix {
         	return &t
         }
         
        -// Clone makes a copy of a into the receiver, overwriting the previous value of
        -// the receiver. The clone operation does not make any restriction on shape and
        +// CloneFrom makes a copy of a into the receiver, overwriting the previous value of
        +// the receiver. The clone from operation does not make any restriction on shape and
         // will not cause shadowing.
         //
        -// See the Cloner interface for more information.
        -func (m *Dense) Clone(a Matrix) {
        +// See the ClonerFrom interface for more information.
        +func (m *Dense) CloneFrom(a Matrix) {
         	r, c := a.Dims()
         	mat := blas64.General{
         		Rows:   r,
        @@ -376,16 +417,15 @@ func (m *Dense) Clone(a Matrix) {
         	}
         	m.capRows, m.capCols = r, c
         
        -	aU, trans := untranspose(a)
        +	aU, trans := untransposeExtract(a)
         	switch aU := aU.(type) {
        -	case RawMatrixer:
        -		amat := aU.RawMatrix()
        +	case *Dense:
        +		amat := aU.mat
         		mat.Data = make([]float64, r*c)
         		if trans {
         			for i := 0; i < r; i++ {
        -				blas64.Copy(c,
        -					blas64.Vector{Inc: amat.Stride, Data: amat.Data[i : i+(c-1)*amat.Stride+1]},
        -					blas64.Vector{Inc: 1, Data: mat.Data[i*c : (i+1)*c]})
        +				blas64.Copy(blas64.Vector{N: c, Inc: amat.Stride, Data: amat.Data[i : i+(c-1)*amat.Stride+1]},
        +					blas64.Vector{N: c, Inc: 1, Data: mat.Data[i*c : (i+1)*c]})
         			}
         		} else {
         			for i := 0; i < r; i++ {
        @@ -394,10 +434,9 @@ func (m *Dense) Clone(a Matrix) {
         		}
         	case *VecDense:
         		amat := aU.mat
        -		mat.Data = make([]float64, aU.n)
        -		blas64.Copy(aU.n,
        -			blas64.Vector{Inc: amat.Inc, Data: amat.Data},
        -			blas64.Vector{Inc: 1, Data: mat.Data})
        +		mat.Data = make([]float64, aU.mat.N)
        +		blas64.Copy(blas64.Vector{N: aU.mat.N, Inc: amat.Inc, Data: amat.Data},
        +			blas64.Vector{N: aU.mat.N, Inc: 1, Data: mat.Data})
         	default:
         		mat.Data = make([]float64, r*c)
         		w := *m
        @@ -431,18 +470,17 @@ func (m *Dense) Copy(a Matrix) (r, c int) {
         		return 0, 0
         	}
         
        -	aU, trans := untranspose(a)
        +	aU, trans := untransposeExtract(a)
         	switch aU := aU.(type) {
        -	case RawMatrixer:
        -		amat := aU.RawMatrix()
        +	case *Dense:
        +		amat := aU.mat
         		if trans {
         			if amat.Stride != 1 {
         				m.checkOverlap(amat)
         			}
         			for i := 0; i < r; i++ {
        -				blas64.Copy(c,
        -					blas64.Vector{Inc: amat.Stride, Data: amat.Data[i : i+(c-1)*amat.Stride+1]},
        -					blas64.Vector{Inc: 1, Data: m.mat.Data[i*m.mat.Stride : i*m.mat.Stride+c]})
        +				blas64.Copy(blas64.Vector{N: c, Inc: amat.Stride, Data: amat.Data[i : i+(c-1)*amat.Stride+1]},
        +					blas64.Vector{N: c, Inc: 1, Data: m.mat.Data[i*m.mat.Stride : i*m.mat.Stride+c]})
         			}
         		} else {
         			switch o := offset(m.mat.Data, amat.Data); {
        @@ -477,13 +515,11 @@ func (m *Dense) Copy(a Matrix) (r, c int) {
         		}
         		switch o := offset(m.mat.Data, amat.Data); {
         		case o < 0:
        -			blas64.Copy(n,
        -				blas64.Vector{Inc: -amat.Inc, Data: amat.Data},
        -				blas64.Vector{Inc: -stride, Data: m.mat.Data})
        +			blas64.Copy(blas64.Vector{N: n, Inc: -amat.Inc, Data: amat.Data},
        +				blas64.Vector{N: n, Inc: -stride, Data: m.mat.Data})
         		case o > 0:
        -			blas64.Copy(n,
        -				blas64.Vector{Inc: amat.Inc, Data: amat.Data},
        -				blas64.Vector{Inc: stride, Data: m.mat.Data})
        +			blas64.Copy(blas64.Vector{N: n, Inc: amat.Inc, Data: amat.Data},
        +				blas64.Vector{N: n, Inc: stride, Data: m.mat.Data})
         		default:
         			// Nothing to do.
         		}
        @@ -510,10 +546,10 @@ func (m *Dense) Stack(a, b Matrix) {
         		panic(ErrShape)
         	}
         
        -	m.reuseAs(ar+br, ac)
        +	m.reuseAsNonZeroed(ar+br, ac)
         
         	m.Copy(a)
        -	w := m.Slice(ar, ar+br, 0, bc).(*Dense)
        +	w := m.slice(ar, ar+br, 0, bc)
         	w.Copy(b)
         }
         
        @@ -528,9 +564,23 @@ func (m *Dense) Augment(a, b Matrix) {
         		panic(ErrShape)
         	}
         
        -	m.reuseAs(ar, ac+bc)
        +	m.reuseAsNonZeroed(ar, ac+bc)
         
         	m.Copy(a)
        -	w := m.Slice(0, br, ac, ac+bc).(*Dense)
        +	w := m.slice(0, br, ac, ac+bc)
         	w.Copy(b)
         }
        +
        +// Trace returns the trace of the matrix. The matrix must be square or Trace
        +// will panic.
        +func (m *Dense) Trace() float64 {
        +	if m.mat.Rows != m.mat.Cols {
        +		panic(ErrSquare)
        +	}
        +	// TODO(btracey): could use internal asm sum routine.
        +	var v float64
        +	for i := 0; i < m.mat.Rows; i++ {
        +		v += m.mat.Data[i*m.mat.Stride+i]
        +	}
        +	return v
        +}
        diff --git a/vendor/gonum.org/v1/gonum/mat/dense_arithmetic.go b/vendor/gonum.org/v1/gonum/mat/dense_arithmetic.go
        index e909a6a19..e007b6002 100644
        --- a/vendor/gonum.org/v1/gonum/mat/dense_arithmetic.go
        +++ b/vendor/gonum.org/v1/gonum/mat/dense_arithmetic.go
        @@ -21,13 +21,13 @@ func (m *Dense) Add(a, b Matrix) {
         		panic(ErrShape)
         	}
         
        -	aU, _ := untranspose(a)
        -	bU, _ := untranspose(b)
        -	m.reuseAs(ar, ac)
        +	aU, _ := untransposeExtract(a)
        +	bU, _ := untransposeExtract(b)
        +	m.reuseAsNonZeroed(ar, ac)
         
        -	if arm, ok := a.(RawMatrixer); ok {
        -		if brm, ok := b.(RawMatrixer); ok {
        -			amat, bmat := arm.RawMatrix(), brm.RawMatrix()
        +	if arm, ok := a.(*Dense); ok {
        +		if brm, ok := b.(*Dense); ok {
        +			amat, bmat := arm.mat, brm.mat
         			if m != aU {
         				m.checkOverlap(amat)
         			}
        @@ -70,13 +70,13 @@ func (m *Dense) Sub(a, b Matrix) {
         		panic(ErrShape)
         	}
         
        -	aU, _ := untranspose(a)
        -	bU, _ := untranspose(b)
        -	m.reuseAs(ar, ac)
        +	aU, _ := untransposeExtract(a)
        +	bU, _ := untransposeExtract(b)
        +	m.reuseAsNonZeroed(ar, ac)
         
        -	if arm, ok := a.(RawMatrixer); ok {
        -		if brm, ok := b.(RawMatrixer); ok {
        -			amat, bmat := arm.RawMatrix(), brm.RawMatrix()
        +	if arm, ok := a.(*Dense); ok {
        +		if brm, ok := b.(*Dense); ok {
        +			amat, bmat := arm.mat, brm.mat
         			if m != aU {
         				m.checkOverlap(amat)
         			}
        @@ -120,13 +120,13 @@ func (m *Dense) MulElem(a, b Matrix) {
         		panic(ErrShape)
         	}
         
        -	aU, _ := untranspose(a)
        -	bU, _ := untranspose(b)
        -	m.reuseAs(ar, ac)
        +	aU, _ := untransposeExtract(a)
        +	bU, _ := untransposeExtract(b)
        +	m.reuseAsNonZeroed(ar, ac)
         
        -	if arm, ok := a.(RawMatrixer); ok {
        -		if brm, ok := b.(RawMatrixer); ok {
        -			amat, bmat := arm.RawMatrix(), brm.RawMatrix()
        +	if arm, ok := a.(*Dense); ok {
        +		if brm, ok := b.(*Dense); ok {
        +			amat, bmat := arm.mat, brm.mat
         			if m != aU {
         				m.checkOverlap(amat)
         			}
        @@ -170,13 +170,13 @@ func (m *Dense) DivElem(a, b Matrix) {
         		panic(ErrShape)
         	}
         
        -	aU, _ := untranspose(a)
        -	bU, _ := untranspose(b)
        -	m.reuseAs(ar, ac)
        +	aU, _ := untransposeExtract(a)
        +	bU, _ := untransposeExtract(b)
        +	m.reuseAsNonZeroed(ar, ac)
         
        -	if arm, ok := a.(RawMatrixer); ok {
        -		if brm, ok := b.(RawMatrixer); ok {
        -			amat, bmat := arm.RawMatrix(), brm.RawMatrix()
        +	if arm, ok := a.(*Dense); ok {
        +		if brm, ok := b.(*Dense); ok {
        +			amat, bmat := arm.mat, brm.mat
         			if m != aU {
         				m.checkOverlap(amat)
         			}
        @@ -220,12 +220,12 @@ func (m *Dense) Inverse(a Matrix) error {
         	if r != c {
         		panic(ErrSquare)
         	}
        -	m.reuseAs(a.Dims())
        -	aU, aTrans := untranspose(a)
        +	m.reuseAsNonZeroed(a.Dims())
        +	aU, aTrans := untransposeExtract(a)
         	switch rm := aU.(type) {
        -	case RawMatrixer:
        +	case *Dense:
         		if m != aU || aTrans {
        -			if m == aU || m.checkOverlap(rm.RawMatrix()) {
        +			if m == aU || m.checkOverlap(rm.mat) {
         				tmp := getWorkspace(r, c, false)
         				tmp.Copy(a)
         				m.Copy(tmp)
        @@ -276,9 +276,9 @@ func (m *Dense) Mul(a, b Matrix) {
         		panic(ErrShape)
         	}
         
        -	aU, aTrans := untranspose(a)
        -	bU, bTrans := untranspose(b)
        -	m.reuseAs(ar, bc)
        +	aU, aTrans := untransposeExtract(a)
        +	bU, bTrans := untransposeExtract(b)
        +	m.reuseAsNonZeroed(ar, bc)
         	var restore func()
         	if m == aU {
         		m, restore = m.isolatedWorkspace(aU)
        @@ -298,55 +298,52 @@ func (m *Dense) Mul(a, b Matrix) {
         
         	// Some of the cases do not have a transpose option, so create
         	// temporary memory.
        -	// C = A^T * B = (B^T * A)^T
        -	// C^T = B^T * A.
        -	if aUrm, ok := aU.(RawMatrixer); ok {
        -		amat := aUrm.RawMatrix()
        +	// C = Aᵀ * B = (Bᵀ * A)ᵀ
        +	// Cᵀ = Bᵀ * A.
        +	if aU, ok := aU.(*Dense); ok {
         		if restore == nil {
        -			m.checkOverlap(amat)
        +			m.checkOverlap(aU.mat)
         		}
        -		if bUrm, ok := bU.(RawMatrixer); ok {
        -			bmat := bUrm.RawMatrix()
        +		switch bU := bU.(type) {
        +		case *Dense:
         			if restore == nil {
        -				m.checkOverlap(bmat)
        +				m.checkOverlap(bU.mat)
         			}
        -			blas64.Gemm(aT, bT, 1, amat, bmat, 0, m.mat)
        +			blas64.Gemm(aT, bT, 1, aU.mat, bU.mat, 0, m.mat)
         			return
        -		}
        -		if bU, ok := bU.(RawSymmetricer); ok {
        -			bmat := bU.RawSymmetric()
        +
        +		case *SymDense:
         			if aTrans {
         				c := getWorkspace(ac, ar, false)
        -				blas64.Symm(blas.Left, 1, bmat, amat, 0, c.mat)
        +				blas64.Symm(blas.Left, 1, bU.mat, aU.mat, 0, c.mat)
         				strictCopy(m, c.T())
         				putWorkspace(c)
         				return
         			}
        -			blas64.Symm(blas.Right, 1, bmat, amat, 0, m.mat)
        +			blas64.Symm(blas.Right, 1, bU.mat, aU.mat, 0, m.mat)
         			return
        -		}
        -		if bU, ok := bU.(RawTriangular); ok {
        +
        +		case *TriDense:
         			// Trmm updates in place, so copy aU first.
        -			bmat := bU.RawTriangular()
         			if aTrans {
         				c := getWorkspace(ac, ar, false)
         				var tmp Dense
        -				tmp.SetRawMatrix(amat)
        +				tmp.SetRawMatrix(aU.mat)
         				c.Copy(&tmp)
         				bT := blas.Trans
         				if bTrans {
         					bT = blas.NoTrans
         				}
        -				blas64.Trmm(blas.Left, bT, 1, bmat, c.mat)
        +				blas64.Trmm(blas.Left, bT, 1, bU.mat, c.mat)
         				strictCopy(m, c.T())
         				putWorkspace(c)
         				return
         			}
         			m.Copy(a)
        -			blas64.Trmm(blas.Right, bT, 1, bmat, m.mat)
        +			blas64.Trmm(blas.Right, bT, 1, bU.mat, m.mat)
         			return
        -		}
        -		if bU, ok := bU.(*VecDense); ok {
        +
        +		case *VecDense:
         			m.checkOverlap(bU.asGeneral())
         			bvec := bU.RawVector()
         			if bTrans {
        @@ -358,56 +355,54 @@ func (m *Dense) Mul(a, b Matrix) {
         					Stride: bvec.Inc,
         					Data:   bvec.Data,
         				}
        -				blas64.Gemm(aT, bT, 1, amat, bmat, 0, m.mat)
        +				blas64.Gemm(aT, bT, 1, aU.mat, bmat, 0, m.mat)
         				return
         			}
         			cvec := blas64.Vector{
         				Inc:  m.mat.Stride,
         				Data: m.mat.Data,
         			}
        -			blas64.Gemv(aT, 1, amat, bvec, 0, cvec)
        +			blas64.Gemv(aT, 1, aU.mat, bvec, 0, cvec)
         			return
         		}
         	}
        -	if bUrm, ok := bU.(RawMatrixer); ok {
        -		bmat := bUrm.RawMatrix()
        +	if bU, ok := bU.(*Dense); ok {
         		if restore == nil {
        -			m.checkOverlap(bmat)
        +			m.checkOverlap(bU.mat)
         		}
        -		if aU, ok := aU.(RawSymmetricer); ok {
        -			amat := aU.RawSymmetric()
        +		switch aU := aU.(type) {
        +		case *SymDense:
         			if bTrans {
         				c := getWorkspace(bc, br, false)
        -				blas64.Symm(blas.Right, 1, amat, bmat, 0, c.mat)
        +				blas64.Symm(blas.Right, 1, aU.mat, bU.mat, 0, c.mat)
         				strictCopy(m, c.T())
         				putWorkspace(c)
         				return
         			}
        -			blas64.Symm(blas.Left, 1, amat, bmat, 0, m.mat)
        +			blas64.Symm(blas.Left, 1, aU.mat, bU.mat, 0, m.mat)
         			return
        -		}
        -		if aU, ok := aU.(RawTriangular); ok {
        +
        +		case *TriDense:
         			// Trmm updates in place, so copy bU first.
        -			amat := aU.RawTriangular()
         			if bTrans {
         				c := getWorkspace(bc, br, false)
         				var tmp Dense
        -				tmp.SetRawMatrix(bmat)
        +				tmp.SetRawMatrix(bU.mat)
         				c.Copy(&tmp)
         				aT := blas.Trans
         				if aTrans {
         					aT = blas.NoTrans
         				}
        -				blas64.Trmm(blas.Right, aT, 1, amat, c.mat)
        +				blas64.Trmm(blas.Right, aT, 1, aU.mat, c.mat)
         				strictCopy(m, c.T())
         				putWorkspace(c)
         				return
         			}
         			m.Copy(b)
        -			blas64.Trmm(blas.Left, aT, 1, amat, m.mat)
        +			blas64.Trmm(blas.Left, aT, 1, aU.mat, m.mat)
         			return
        -		}
        -		if aU, ok := aU.(*VecDense); ok {
        +
        +		case *VecDense:
         			m.checkOverlap(aU.asGeneral())
         			avec := aU.RawVector()
         			if aTrans {
        @@ -421,7 +416,7 @@ func (m *Dense) Mul(a, b Matrix) {
         				if bTrans {
         					bT = blas.NoTrans
         				}
        -				blas64.Gemv(bT, 1, bmat, avec, 0, cvec)
        +				blas64.Gemv(bT, 1, bU.mat, avec, 0, cvec)
         				return
         			}
         			// {ar,1} x {1,bc} which is not a vector result.
        @@ -432,7 +427,7 @@ func (m *Dense) Mul(a, b Matrix) {
         				Stride: avec.Inc,
         				Data:   avec.Data,
         			}
        -			blas64.Gemm(aT, bT, 1, amat, bmat, 0, m.mat)
        +			blas64.Gemm(aT, bT, 1, amat, bU.mat, 0, m.mat)
         			return
         		}
         	}
        @@ -476,7 +471,7 @@ func (m *Dense) Exp(a Matrix) {
         		panic(ErrShape)
         	}
         
        -	m.reuseAs(r, r)
        +	m.reuseAsNonZeroed(r, r)
         	if r == 1 {
         		m.mat.Data[0] = math.Exp(a.At(0, 0))
         		return
        @@ -504,12 +499,13 @@ func (m *Dense) Exp(a Matrix) {
         	a1.Copy(a)
         	v := getWorkspace(r, r, true)
         	vraw := v.RawMatrix()
        -	vvec := blas64.Vector{Inc: 1, Data: vraw.Data}
        +	n := r * r
        +	vvec := blas64.Vector{N: n, Inc: 1, Data: vraw.Data}
         	defer putWorkspace(v)
         
         	u := getWorkspace(r, r, true)
         	uraw := u.RawMatrix()
        -	uvec := blas64.Vector{Inc: 1, Data: uraw.Data}
        +	uvec := blas64.Vector{N: n, Inc: 1, Data: uraw.Data}
         	defer putWorkspace(u)
         
         	a2 := getWorkspace(r, r, false)
        @@ -525,7 +521,7 @@ func (m *Dense) Exp(a Matrix) {
         		// this is not as horrible as it looks.
         		p := getWorkspace(r, r, true)
         		praw := p.RawMatrix()
        -		pvec := blas64.Vector{Inc: 1, Data: praw.Data}
        +		pvec := blas64.Vector{N: n, Inc: 1, Data: praw.Data}
         		defer putWorkspace(p)
         
         		for k := 0; k < r; k++ {
        @@ -537,8 +533,8 @@ func (m *Dense) Exp(a Matrix) {
         		a2.Mul(a1, a1)
         		for j := 0; j <= i; j++ {
         			p.Mul(p, a2)
        -			blas64.Axpy(r*r, t.b[2*j+2], pvec, vvec)
        -			blas64.Axpy(r*r, t.b[2*j+3], pvec, uvec)
        +			blas64.Axpy(t.b[2*j+2], pvec, vvec)
        +			blas64.Axpy(t.b[2*j+3], pvec, uvec)
         		}
         		u.Mul(a1, u)
         
        @@ -549,7 +545,7 @@ func (m *Dense) Exp(a Matrix) {
         		vpu.Add(v, u)
         		vmu.Sub(v, u)
         
        -		m.Solve(vmu, vpu)
        +		_ = m.Solve(vmu, vpu)
         		return
         	}
         
        @@ -573,43 +569,43 @@ func (m *Dense) Exp(a Matrix) {
         		i.set(j, j, 1)
         	}
         	iraw := i.RawMatrix()
        -	ivec := blas64.Vector{Inc: 1, Data: iraw.Data}
        +	ivec := blas64.Vector{N: n, Inc: 1, Data: iraw.Data}
         	defer putWorkspace(i)
         
         	a2raw := a2.RawMatrix()
        -	a2vec := blas64.Vector{Inc: 1, Data: a2raw.Data}
        +	a2vec := blas64.Vector{N: n, Inc: 1, Data: a2raw.Data}
         
         	a4 := getWorkspace(r, r, false)
         	a4raw := a4.RawMatrix()
        -	a4vec := blas64.Vector{Inc: 1, Data: a4raw.Data}
        +	a4vec := blas64.Vector{N: n, Inc: 1, Data: a4raw.Data}
         	defer putWorkspace(a4)
         	a4.Mul(a2, a2)
         
         	a6 := getWorkspace(r, r, false)
         	a6raw := a6.RawMatrix()
        -	a6vec := blas64.Vector{Inc: 1, Data: a6raw.Data}
        +	a6vec := blas64.Vector{N: n, Inc: 1, Data: a6raw.Data}
         	defer putWorkspace(a6)
         	a6.Mul(a2, a4)
         
         	// V = A_6(b_12*A_6 + b_10*A_4 + b_8*A_2) + b_6*A_6 + b_4*A_4 + b_2*A_2 +b_0*I
        -	blas64.Axpy(r*r, b[12], a6vec, vvec)
        -	blas64.Axpy(r*r, b[10], a4vec, vvec)
        -	blas64.Axpy(r*r, b[8], a2vec, vvec)
        +	blas64.Axpy(b[12], a6vec, vvec)
        +	blas64.Axpy(b[10], a4vec, vvec)
        +	blas64.Axpy(b[8], a2vec, vvec)
         	v.Mul(v, a6)
        -	blas64.Axpy(r*r, b[6], a6vec, vvec)
        -	blas64.Axpy(r*r, b[4], a4vec, vvec)
        -	blas64.Axpy(r*r, b[2], a2vec, vvec)
        -	blas64.Axpy(r*r, b[0], ivec, vvec)
        +	blas64.Axpy(b[6], a6vec, vvec)
        +	blas64.Axpy(b[4], a4vec, vvec)
        +	blas64.Axpy(b[2], a2vec, vvec)
        +	blas64.Axpy(b[0], ivec, vvec)
         
         	// U = A(A_6(b_13*A_6 + b_11*A_4 + b_9*A_2) + b_7*A_6 + b_5*A_4 + b_2*A_3 +b_1*I)
        -	blas64.Axpy(r*r, b[13], a6vec, uvec)
        -	blas64.Axpy(r*r, b[11], a4vec, uvec)
        -	blas64.Axpy(r*r, b[9], a2vec, uvec)
        +	blas64.Axpy(b[13], a6vec, uvec)
        +	blas64.Axpy(b[11], a4vec, uvec)
        +	blas64.Axpy(b[9], a2vec, uvec)
         	u.Mul(u, a6)
        -	blas64.Axpy(r*r, b[7], a6vec, uvec)
        -	blas64.Axpy(r*r, b[5], a4vec, uvec)
        -	blas64.Axpy(r*r, b[3], a2vec, uvec)
        -	blas64.Axpy(r*r, b[1], ivec, uvec)
        +	blas64.Axpy(b[7], a6vec, uvec)
        +	blas64.Axpy(b[5], a4vec, uvec)
        +	blas64.Axpy(b[3], a2vec, uvec)
        +	blas64.Axpy(b[1], ivec, uvec)
         	u.Mul(u, a1)
         
         	// Use i as a workspace here and
        @@ -619,7 +615,7 @@ func (m *Dense) Exp(a Matrix) {
         	vpu.Add(v, u)
         	vmu.Sub(v, u)
         
        -	m.Solve(vmu, vpu)
        +	_ = m.Solve(vmu, vpu)
         
         	for ; s > 0; s-- {
         		m.Mul(m, m)
        @@ -630,14 +626,14 @@ func (m *Dense) Exp(a Matrix) {
         // in the receiver. Pow will panic if n is negative or if a is not square.
         func (m *Dense) Pow(a Matrix, n int) {
         	if n < 0 {
        -		panic("matrix: illegal power")
        +		panic("mat: illegal power")
         	}
         	r, c := a.Dims()
         	if r != c {
         		panic(ErrShape)
         	}
         
        -	m.reuseAs(r, c)
        +	m.reuseAsNonZeroed(r, c)
         
         	// Take possible fast paths.
         	switch n {
        @@ -677,17 +673,31 @@ func (m *Dense) Pow(a Matrix, n int) {
         	putWorkspace(x)
         }
         
        +// Kronecker calculates the Kronecker product of a and b, placing the result in
        +// the receiver.
        +func (m *Dense) Kronecker(a, b Matrix) {
        +	ra, ca := a.Dims()
        +	rb, cb := b.Dims()
        +
        +	m.reuseAsNonZeroed(ra*rb, ca*cb)
        +	for i := 0; i < ra; i++ {
        +		for j := 0; j < ca; j++ {
        +			m.slice(i*rb, (i+1)*rb, j*cb, (j+1)*cb).Scale(a.At(i, j), b)
        +		}
        +	}
        +}
        +
         // Scale multiplies the elements of a by f, placing the result in the receiver.
         //
         // See the Scaler interface for more information.
         func (m *Dense) Scale(f float64, a Matrix) {
         	ar, ac := a.Dims()
         
        -	m.reuseAs(ar, ac)
        +	m.reuseAsNonZeroed(ar, ac)
         
        -	aU, aTrans := untranspose(a)
        -	if rm, ok := aU.(RawMatrixer); ok {
        -		amat := rm.RawMatrix()
        +	aU, aTrans := untransposeExtract(a)
        +	if rm, ok := aU.(*Dense); ok {
        +		amat := rm.mat
         		if m == aU || m.checkOverlap(amat) {
         			var restore func()
         			m, restore = m.isolatedWorkspace(a)
        @@ -723,11 +733,11 @@ func (m *Dense) Scale(f float64, a Matrix) {
         func (m *Dense) Apply(fn func(i, j int, v float64) float64, a Matrix) {
         	ar, ac := a.Dims()
         
        -	m.reuseAs(ar, ac)
        +	m.reuseAsNonZeroed(ar, ac)
         
        -	aU, aTrans := untranspose(a)
        -	if rm, ok := aU.(RawMatrixer); ok {
        -		amat := rm.RawMatrix()
        +	aU, aTrans := untransposeExtract(a)
        +	if rm, ok := aU.(*Dense); ok {
        +		amat := rm.mat
         		if m == aU || m.checkOverlap(amat) {
         			var restore func()
         			m, restore = m.isolatedWorkspace(a)
        @@ -757,54 +767,55 @@ func (m *Dense) Apply(fn func(i, j int, v float64) float64, a Matrix) {
         	}
         }
         
        -// RankOne performs a rank-one update to the matrix a and stores the result
        -// in the receiver. If a is zero, see Outer.
        -//  m = a + alpha * x * y'
        +// RankOne performs a rank-one update to the matrix a with the vectors x and
        +// y, where x and y are treated as column vectors. The result is stored in the
        +// receiver. The Outer method can be used instead of RankOne if a is not needed.
        +//  m = a + alpha * x * yᵀ
         func (m *Dense) RankOne(a Matrix, alpha float64, x, y Vector) {
         	ar, ac := a.Dims()
        -	xr, xc := x.Dims()
        -	if xr != ar || xc != 1 {
        +	if x.Len() != ar {
         		panic(ErrShape)
         	}
        -	yr, yc := y.Dims()
        -	if yr != ac || yc != 1 {
        +	if y.Len() != ac {
         		panic(ErrShape)
         	}
         
         	if a != m {
        -		aU, _ := untranspose(a)
        -		if rm, ok := aU.(RawMatrixer); ok {
        +		aU, _ := untransposeExtract(a)
        +		if rm, ok := aU.(*Dense); ok {
         			m.checkOverlap(rm.RawMatrix())
         		}
         	}
         
         	var xmat, ymat blas64.Vector
         	fast := true
        -	xU, _ := untranspose(x)
        -	if rv, ok := xU.(RawVectorer); ok {
        -		xmat = rv.RawVector()
        -		m.checkOverlap((&VecDense{mat: xmat, n: x.Len()}).asGeneral())
        +	xU, _ := untransposeExtract(x)
        +	if rv, ok := xU.(*VecDense); ok {
        +		r, c := xU.Dims()
        +		xmat = rv.mat
        +		m.checkOverlap(generalFromVector(xmat, r, c))
         	} else {
         		fast = false
         	}
        -	yU, _ := untranspose(y)
        -	if rv, ok := yU.(RawVectorer); ok {
        -		ymat = rv.RawVector()
        -		m.checkOverlap((&VecDense{mat: ymat, n: y.Len()}).asGeneral())
        +	yU, _ := untransposeExtract(y)
        +	if rv, ok := yU.(*VecDense); ok {
        +		r, c := yU.Dims()
        +		ymat = rv.mat
        +		m.checkOverlap(generalFromVector(ymat, r, c))
         	} else {
         		fast = false
         	}
         
         	if fast {
         		if m != a {
        -			m.reuseAs(ar, ac)
        +			m.reuseAsNonZeroed(ar, ac)
         			m.Copy(a)
         		}
         		blas64.Ger(alpha, xmat, ymat, m.mat)
         		return
         	}
         
        -	m.reuseAs(ar, ac)
        +	m.reuseAsNonZeroed(ar, ac)
         	for i := 0; i < ar; i++ {
         		for j := 0; j < ac; j++ {
         			m.set(i, j, a.At(i, j)+alpha*x.AtVec(i)*y.AtVec(j))
        @@ -812,59 +823,30 @@ func (m *Dense) RankOne(a Matrix, alpha float64, x, y Vector) {
         	}
         }
         
        -// Outer calculates the outer product of the column vectors x and y,
        -// and stores the result in the receiver.
        -//  m = alpha * x * y'
        +// Outer calculates the outer product of the vectors x and y, where x and y
        +// are treated as column vectors, and stores the result in the receiver.
        +//  m = alpha * x * yᵀ
         // In order to update an existing matrix, see RankOne.
         func (m *Dense) Outer(alpha float64, x, y Vector) {
        -	xr, xc := x.Dims()
        -	if xc != 1 {
        -		panic(ErrShape)
        -	}
        -	yr, yc := y.Dims()
        -	if yc != 1 {
        -		panic(ErrShape)
        -	}
        +	r, c := x.Len(), y.Len()
         
        -	r := xr
        -	c := yr
        -
        -	// Copied from reuseAs with use replaced by useZeroed
        -	// and a final zero of the matrix elements if we pass
        -	// the shape checks.
        -	// TODO(kortschak): Factor out into reuseZeroedAs if
        -	// we find another case that needs it.
        -	if m.mat.Rows > m.capRows || m.mat.Cols > m.capCols {
        -		// Panic as a string, not a mat.Error.
        -		panic("mat: caps not correctly set")
        -	}
        -	if m.IsZero() {
        -		m.mat = blas64.General{
        -			Rows:   r,
        -			Cols:   c,
        -			Stride: c,
        -			Data:   useZeroed(m.mat.Data, r*c),
        -		}
        -		m.capRows = r
        -		m.capCols = c
        -	} else if r != m.mat.Rows || c != m.mat.Cols {
        -		panic(ErrShape)
        -	}
        +	m.reuseAsZeroed(r, c)
         
         	var xmat, ymat blas64.Vector
         	fast := true
        -	xU, _ := untranspose(x)
        -	if rv, ok := xU.(RawVectorer); ok {
        -		xmat = rv.RawVector()
        -		m.checkOverlap((&VecDense{mat: xmat, n: x.Len()}).asGeneral())
        -
        +	xU, _ := untransposeExtract(x)
        +	if rv, ok := xU.(*VecDense); ok {
        +		r, c := xU.Dims()
        +		xmat = rv.mat
        +		m.checkOverlap(generalFromVector(xmat, r, c))
         	} else {
         		fast = false
         	}
        -	yU, _ := untranspose(y)
        -	if rv, ok := yU.(RawVectorer); ok {
        -		ymat = rv.RawVector()
        -		m.checkOverlap((&VecDense{mat: ymat, n: y.Len()}).asGeneral())
        +	yU, _ := untransposeExtract(y)
        +	if rv, ok := yU.(*VecDense); ok {
        +		r, c := yU.Dims()
        +		ymat = rv.mat
        +		m.checkOverlap(generalFromVector(ymat, r, c))
         	} else {
         		fast = false
         	}
        diff --git a/vendor/gonum.org/v1/gonum/mat/diagonal.go b/vendor/gonum.org/v1/gonum/mat/diagonal.go
        index 3dbaaf63e..f3357d6b6 100644
        --- a/vendor/gonum.org/v1/gonum/mat/diagonal.go
        +++ b/vendor/gonum.org/v1/gonum/mat/diagonal.go
        @@ -12,21 +12,56 @@ import (
         var (
         	diagDense *DiagDense
         	_         Matrix          = diagDense
        +	_         allMatrix       = diagDense
        +	_         denseMatrix     = diagDense
         	_         Diagonal        = diagDense
         	_         MutableDiagonal = diagDense
         	_         Triangular      = diagDense
        +	_         TriBanded       = diagDense
         	_         Symmetric       = diagDense
        +	_         SymBanded       = diagDense
         	_         Banded          = diagDense
         	_         RawBander       = diagDense
         	_         RawSymBander    = diagDense
        +
        +	diag Diagonal
        +	_    Matrix     = diag
        +	_    Diagonal   = diag
        +	_    Triangular = diag
        +	_    TriBanded  = diag
        +	_    Symmetric  = diag
        +	_    SymBanded  = diag
        +	_    Banded     = diag
         )
         
         // Diagonal represents a diagonal matrix, that is a square matrix that only
         // has non-zero terms on the diagonal.
         type Diagonal interface {
         	Matrix
        -	// Diag returns the number of rows/columns in the matrix
        +	// Diag returns the number of rows/columns in the matrix.
         	Diag() int
        +
        +	// Bandwidth and TBand are included in the Diagonal interface
        +	// to allow the use of Diagonal types in banded functions.
        +	// Bandwidth will always return (0, 0).
        +	Bandwidth() (kl, ku int)
        +	TBand() Banded
        +
        +	// Triangle and TTri are included in the Diagonal interface
        +	// to allow the use of Diagonal types in triangular functions.
        +	Triangle() (int, TriKind)
        +	TTri() Triangular
        +
        +	// Symmetric and SymBand are included in the Diagonal interface
        +	// to allow the use of Diagonal types in symmetric and banded symmetric
        +	// functions respectively.
        +	Symmetric() int
        +	SymBand() (n, k int)
        +
        +	// TriBand and TTriBand are included in the Diagonal interface
        +	// to allow the use of Diagonal types in triangular banded functions.
        +	TriBand() (n, k int, kind TriKind)
        +	TTriBand() TriBanded
         }
         
         // MutableDiagonal is a Diagonal matrix whose elements can be set.
        @@ -37,14 +72,17 @@ type MutableDiagonal interface {
         
         // DiagDense represents a diagonal matrix in dense storage format.
         type DiagDense struct {
        -	data []float64
        +	mat blas64.Vector
         }
         
        -// NewDiagonal creates a new Diagonal matrix with n rows and n columns.
        -// The length of data must be n or data must be nil, otherwise NewDiagonal
        -// will panic.
        -func NewDiagonal(n int, data []float64) *DiagDense {
        -	if n < 0 {
        +// NewDiagDense creates a new Diagonal matrix with n rows and n columns.
        +// The length of data must be n or data must be nil, otherwise NewDiagDense
        +// will panic. NewDiagDense will panic if n is zero.
        +func NewDiagDense(n int, data []float64) *DiagDense {
        +	if n <= 0 {
        +		if n == 0 {
        +			panic(ErrZeroLength)
        +		}
         		panic("mat: negative dimension")
         	}
         	if data == nil {
        @@ -54,18 +92,18 @@ func NewDiagonal(n int, data []float64) *DiagDense {
         		panic(ErrShape)
         	}
         	return &DiagDense{
        -		data: data,
        +		mat: blas64.Vector{N: n, Data: data, Inc: 1},
         	}
         }
         
         // Diag returns the dimension of the receiver.
         func (d *DiagDense) Diag() int {
        -	return len(d.data)
        +	return d.mat.N
         }
         
         // Dims returns the dimensions of the matrix.
         func (d *DiagDense) Dims() (r, c int) {
        -	return len(d.data), len(d.data)
        +	return d.mat.N, d.mat.N
         }
         
         // T returns the transpose of the matrix.
        @@ -74,46 +112,215 @@ func (d *DiagDense) T() Matrix {
         }
         
         // TTri returns the transpose of the matrix. Note that Diagonal matrices are
        -// Upper by default
        +// Upper by default.
         func (d *DiagDense) TTri() Triangular {
         	return TransposeTri{d}
         }
         
        +// TBand performs an implicit transpose by returning the receiver inside a
        +// TransposeBand.
         func (d *DiagDense) TBand() Banded {
         	return TransposeBand{d}
         }
         
        +// TTriBand performs an implicit transpose by returning the receiver inside a
        +// TransposeTriBand. Note that Diagonal matrices are Upper by default.
        +func (d *DiagDense) TTriBand() TriBanded {
        +	return TransposeTriBand{d}
        +}
        +
        +// Bandwidth returns the upper and lower bandwidths of the matrix.
        +// These values are always zero for diagonal matrices.
         func (d *DiagDense) Bandwidth() (kl, ku int) {
         	return 0, 0
         }
         
         // Symmetric implements the Symmetric interface.
         func (d *DiagDense) Symmetric() int {
        -	return len(d.data)
        +	return d.mat.N
        +}
        +
        +// SymBand returns the number of rows/columns in the matrix, and the size of
        +// the bandwidth.
        +func (d *DiagDense) SymBand() (n, k int) {
        +	return d.mat.N, 0
         }
         
         // Triangle implements the Triangular interface.
         func (d *DiagDense) Triangle() (int, TriKind) {
        -	return len(d.data), Upper
        +	return d.mat.N, Upper
         }
         
        +// TriBand returns the number of rows/columns in the matrix, the
        +// size of the bandwidth, and the orientation. Note that Diagonal matrices are
        +// Upper by default.
        +func (d *DiagDense) TriBand() (n, k int, kind TriKind) {
        +	return d.mat.N, 0, Upper
        +}
        +
        +// Reset empties the matrix so that it can be reused as the
        +// receiver of a dimensionally restricted operation.
        +//
        +// Reset should not be used when the matrix shares backing data.
        +// See the Reseter interface for more information.
        +func (d *DiagDense) Reset() {
        +	// No change of Inc or n to 0 may be
        +	// made unless both are set to 0.
        +	d.mat.Inc = 0
        +	d.mat.N = 0
        +	d.mat.Data = d.mat.Data[:0]
        +}
        +
        +// Zero sets all of the matrix elements to zero.
        +func (d *DiagDense) Zero() {
        +	for i := 0; i < d.mat.N; i++ {
        +		d.mat.Data[d.mat.Inc*i] = 0
        +	}
        +}
        +
        +// DiagView returns the diagonal as a matrix backed by the original data.
        +func (d *DiagDense) DiagView() Diagonal {
        +	return d
        +}
        +
        +// DiagFrom copies the diagonal of m into the receiver. The receiver must
        +// be min(r, c) long or empty, otherwise DiagFrom will panic.
        +func (d *DiagDense) DiagFrom(m Matrix) {
        +	n := min(m.Dims())
        +	d.reuseAsNonZeroed(n)
        +
        +	var vec blas64.Vector
        +	switch r := m.(type) {
        +	case *DiagDense:
        +		vec = r.mat
        +	case RawBander:
        +		mat := r.RawBand()
        +		vec = blas64.Vector{
        +			N:    n,
        +			Inc:  mat.Stride,
        +			Data: mat.Data[mat.KL : (n-1)*mat.Stride+mat.KL+1],
        +		}
        +	case RawMatrixer:
        +		mat := r.RawMatrix()
        +		vec = blas64.Vector{
        +			N:    n,
        +			Inc:  mat.Stride + 1,
        +			Data: mat.Data[:(n-1)*mat.Stride+n],
        +		}
        +	case RawSymBander:
        +		mat := r.RawSymBand()
        +		vec = blas64.Vector{
        +			N:    n,
        +			Inc:  mat.Stride,
        +			Data: mat.Data[:(n-1)*mat.Stride+1],
        +		}
        +	case RawSymmetricer:
        +		mat := r.RawSymmetric()
        +		vec = blas64.Vector{
        +			N:    n,
        +			Inc:  mat.Stride + 1,
        +			Data: mat.Data[:(n-1)*mat.Stride+n],
        +		}
        +	case RawTriBander:
        +		mat := r.RawTriBand()
        +		data := mat.Data
        +		if mat.Uplo == blas.Lower {
        +			data = data[mat.K:]
        +		}
        +		vec = blas64.Vector{
        +			N:    n,
        +			Inc:  mat.Stride,
        +			Data: data[:(n-1)*mat.Stride+1],
        +		}
        +	case RawTriangular:
        +		mat := r.RawTriangular()
        +		if mat.Diag == blas.Unit {
        +			for i := 0; i < n; i += d.mat.Inc {
        +				d.mat.Data[i] = 1
        +			}
        +			return
        +		}
        +		vec = blas64.Vector{
        +			N:    n,
        +			Inc:  mat.Stride + 1,
        +			Data: mat.Data[:(n-1)*mat.Stride+n],
        +		}
        +	case RawVectorer:
        +		d.mat.Data[0] = r.RawVector().Data[0]
        +		return
        +	default:
        +		for i := 0; i < n; i++ {
        +			d.setDiag(i, m.At(i, i))
        +		}
        +		return
        +	}
        +	blas64.Copy(vec, d.mat)
        +}
        +
        +// RawBand returns the underlying data used by the receiver represented
        +// as a blas64.Band.
        +// Changes to elements in the receiver following the call will be reflected
        +// in returned blas64.Band.
         func (d *DiagDense) RawBand() blas64.Band {
         	return blas64.Band{
        -		Rows:   len(d.data),
        -		Cols:   len(d.data),
        +		Rows:   d.mat.N,
        +		Cols:   d.mat.N,
         		KL:     0,
         		KU:     0,
        -		Stride: 1,
        -		Data:   d.data,
        +		Stride: d.mat.Inc,
        +		Data:   d.mat.Data,
         	}
         }
         
        +// RawSymBand returns the underlying data used by the receiver represented
        +// as a blas64.SymmetricBand.
        +// Changes to elements in the receiver following the call will be reflected
        +// in returned blas64.Band.
         func (d *DiagDense) RawSymBand() blas64.SymmetricBand {
         	return blas64.SymmetricBand{
        -		N:      len(d.data),
        +		N:      d.mat.N,
         		K:      0,
        -		Stride: 1,
        +		Stride: d.mat.Inc,
         		Uplo:   blas.Upper,
        -		Data:   d.data,
        +		Data:   d.mat.Data,
        +	}
        +}
        +
        +// reuseAsNonZeroed resizes an empty diagonal to a r×r diagonal,
        +// or checks that a non-empty matrix is r×r.
        +func (d *DiagDense) reuseAsNonZeroed(r int) {
        +	if r == 0 {
        +		panic(ErrZeroLength)
        +	}
        +	if d.IsEmpty() {
        +		d.mat = blas64.Vector{
        +			Inc:  1,
        +			Data: use(d.mat.Data, r),
        +		}
        +		d.mat.N = r
        +		return
         	}
        +	if r != d.mat.N {
        +		panic(ErrShape)
        +	}
        +}
        +
        +// IsEmpty returns whether the receiver is empty. Empty matrices can be the
        +// receiver for size-restricted operations. The receiver can be emptied using
        +// Reset.
        +func (d *DiagDense) IsEmpty() bool {
        +	// It must be the case that d.Dims() returns
        +	// zeros in this case. See comment in Reset().
        +	return d.mat.Inc == 0
        +}
        +
        +// Trace returns the trace.
        +func (d *DiagDense) Trace() float64 {
        +	rb := d.RawBand()
        +	var tr float64
        +	for i := 0; i < rb.Rows; i++ {
        +		tr += rb.Data[rb.KL+i*rb.Stride]
        +	}
        +	return tr
        +
         }
        diff --git a/vendor/gonum.org/v1/gonum/mat/doc.go b/vendor/gonum.org/v1/gonum/mat/doc.go
        index 2cc910015..6d8e873d6 100644
        --- a/vendor/gonum.org/v1/gonum/mat/doc.go
        +++ b/vendor/gonum.org/v1/gonum/mat/doc.go
        @@ -16,13 +16,16 @@
         //  - Methods and functions for using matrix data (Add, Trace, SymRankOne)
         //  - Types for constructing and using matrix factorizations (QR, LU)
         //  - The complementary types for complex matrices, CMatrix, CSymDense, etc.
        +// In the documentation below, we use "matrix" as a short-hand for all of
        +// the FooDense types implemented in this package. We use "Matrix" to
        +// refer to the Matrix interface.
         //
         // A matrix may be constructed through the corresponding New function. If no
         // backing array is provided the matrix will be initialized to all zeros.
         //  // Allocate a zeroed real matrix of size 3×5
         //  zero := mat.NewDense(3, 5, nil)
         // If a backing data slice is provided, the matrix will have those elements.
        -// Matrices are all stored in row-major format.
        +// All matrices are all stored in row-major format.
         //  // Generate a 6×6 matrix of random values.
         //  data := make([]float64, 36)
         //  for i := range data {
        @@ -34,24 +37,29 @@
         //  tr := mat.Trace(a)
         // and are implemented as methods when the operation modifies the receiver.
         //  zero.Copy(a)
        -//
        -// Receivers must be the correct size for the matrix operations, otherwise the
        -// operation will panic. As a special case for convenience, a zero-value matrix
        -// will be modified to have the correct size, allocating data if necessary.
        -//  var c mat.Dense // construct a new zero-sized matrix
        -//  c.Mul(a, a)     // c is automatically adjusted to be 6×6
        -//
        -// Zero-value of a matrix
        -//
        -// A zero-value matrix is either the Go language definition of a zero-value or
        -// is a zero-sized matrix with zero-length stride. Matrix implementations may have
        -// a Reset method to revert the receiver into a zero-valued matrix and an IsZero
        -// method that returns whether the matrix is zero-valued.
        -// So the following will all result in a zero-value matrix.
        -//  - var a mat.Dense
        -//  - a := NewDense(0, 0, make([]float64, 0, 100))
        -//  - a.Reset()
        -// A zero-value matrix can not be sliced even if it does have an adequately sized
        +// Note that the input arguments to most functions and methods are interfaces
        +// rather than concrete types `func Trace(Matrix)` rather than
        +// `func Trace(*Dense)` allowing flexible use of internal and external
        +// Matrix types.
        +//
        +// When a matrix is the destination or receiver for a function or method,
        +// the operation will panic if the matrix is not the correct size.
        +// An exception is if that destination is empty (see below).
        +//
        +// Empty matrix
        +//
        +// An empty matrix is one that has zero size. Empty matrices are used to allow
        +// the destination of a matrix operation to assume the correct size automatically.
        +// This operation will re-use the backing data, if available, or will allocate
        +// new data if necessary. The IsEmpty method returns whether the given matrix
        +// is empty. The zero-value of a matrix is empty, and is useful for easily
        +// getting the result of matrix operations.
        +//  var c mat.Dense // construct a new zero-value matrix
        +//  c.Mul(a, a)     // c is automatically adjusted to be the right size
        +// The Reset method can be used to revert a matrix to an empty matrix.
        +// Reset should not be used when multiple different matrices share the same backing
        +// data slice. This can cause unexpected data modifications after being resized.
        +// An empty matrix can not be sliced even if it does have an adequately sized
         // backing data slice, but can be expanded using its Grow method if it exists.
         //
         // The Matrix Interfaces
        @@ -60,12 +68,12 @@
         // matrices, The Matrix interface is defined by three functions: Dims, which
         // returns the dimensions of the Matrix, At, which returns the element in the
         // specified location, and T for returning a Transpose (discussed later). All of
        -// the concrete types can perform these behaviors and so implement the interface.
        +// the matrix types can perform these behaviors and so implement the interface.
         // Methods and functions are designed to use this interface, so in particular the method
         //  func (m *Dense) Mul(a, b Matrix)
         // constructs a *Dense from the result of a multiplication with any Matrix types,
        -// not just *Dense. Where more restrictive requirements must be met, there are also the
        -// Symmetric and Triangular interfaces. For example, in
        +// not just *Dense. Where more restrictive requirements must be met, there are also
        +// additional interfaces like Symmetric and Triangular. For example, in
         //  func (s *SymDense) AddSym(a, b Symmetric)
         // the Symmetric interface guarantees a symmetric result.
         //
        @@ -77,7 +85,7 @@
         //
         // The T method is used for transposition on real matrices, and H is used for
         // conjugate transposition on complex matrices. For example, c.Mul(a.T(), b) computes
        -// c = a^T * b. The mat types implement this method implicitly —
        +// c = aᵀ * b. The mat types implement this method implicitly —
         // see the Transpose and Conjugate types for more details. Note that some
         // operations have a transpose as part of their definition, as in *SymDense.SymOuterK.
         //
        @@ -126,7 +134,8 @@
         // Invariants
         //
         // Matrix input arguments to functions are never directly modified. If an operation
        -// changes Matrix data, the mutated matrix will be the receiver of a function.
        +// changes Matrix data, the mutated matrix will be the receiver of a method, or
        +// will be the first argument to a method or function.
         //
         // For convenience, a matrix may be used as both a receiver and as an input, e.g.
         //  a.Pow(a, 6)
        diff --git a/vendor/gonum.org/v1/gonum/mat/eigen.go b/vendor/gonum.org/v1/gonum/mat/eigen.go
        index 8996a92ac..4bed4068a 100644
        --- a/vendor/gonum.org/v1/gonum/mat/eigen.go
        +++ b/vendor/gonum.org/v1/gonum/mat/eigen.go
        @@ -11,7 +11,7 @@ import (
         
         const (
         	badFact   = "mat: use without successful factorization"
        -	badNoVect = "mat: eigenvectors not computed"
        +	noVectors = "mat: eigenvectors not computed"
         )
         
         // EigenSym is a type for creating and manipulating the Eigen decomposition of
        @@ -34,6 +34,10 @@ type EigenSym struct {
         // Factorize returns whether the decomposition succeeded. If the decomposition
         // failed, methods that require a successful factorization will panic.
         func (e *EigenSym) Factorize(a Symmetric, vectors bool) (ok bool) {
        +	// kill previous decomposition
        +	e.vectorsComputed = false
        +	e.values = e.values[:]
        +
         	n := a.Symmetric()
         	sd := NewSymDense(n, nil)
         	sd.CopySym(a)
        @@ -87,38 +91,60 @@ func (e *EigenSym) Values(dst []float64) []float64 {
         	return dst
         }
         
        -// EigenvectorsSym extracts the eigenvectors of the factorized matrix and stores
        -// them in the receiver. Each eigenvector is a column corresponding to the
        -// respective eigenvalue returned by e.Values.
        +// VectorsTo stores the eigenvectors of the decomposition into the columns of
        +// dst.
         //
        -// EigenvectorsSym panics if the factorization was not successful or if the
        -// decomposition did not compute the eigenvectors.
        -func (m *Dense) EigenvectorsSym(e *EigenSym) {
        +// If dst is empty, VectorsTo will resize dst to be n×n. When dst is
        +// non-empty, VectorsTo will panic if dst is not n×n. VectorsTo will also
        +// panic if the eigenvectors were not computed during the factorization,
        +// or if the receiver does not contain a successful factorization.
        +func (e *EigenSym) VectorsTo(dst *Dense) {
         	if !e.succFact() {
         		panic(badFact)
         	}
         	if !e.vectorsComputed {
        -		panic(badNoVect)
        +		panic(noVectors)
        +	}
        +	r, c := e.vectors.Dims()
        +	if dst.IsEmpty() {
        +		dst.ReuseAs(r, c)
        +	} else {
        +		r2, c2 := dst.Dims()
        +		if r != r2 || c != c2 {
        +			panic(ErrShape)
        +		}
         	}
        -	m.reuseAs(len(e.values), len(e.values))
        -	m.Copy(e.vectors)
        +	dst.Copy(e.vectors)
         }
         
        +// EigenKind specifies the computation of eigenvectors during factorization.
        +type EigenKind int
        +
        +const (
        +	// EigenNone specifies to not compute any eigenvectors.
        +	EigenNone EigenKind = 0
        +	// EigenLeft specifies to compute the left eigenvectors.
        +	EigenLeft EigenKind = 1 << iota
        +	// EigenRight specifies to compute the right eigenvectors.
        +	EigenRight
        +	// EigenBoth is a convenience value for computing both eigenvectors.
        +	EigenBoth EigenKind = EigenLeft | EigenRight
        +)
        +
         // Eigen is a type for creating and using the eigenvalue decomposition of a dense matrix.
         type Eigen struct {
         	n int // The size of the factorized matrix.
         
        -	right bool // have the right eigenvectors been computed
        -	left  bool // have the left eigenvectors been computed
        +	kind EigenKind
         
         	values   []complex128
        -	rVectors *Dense
        -	lVectors *Dense
        +	rVectors *CDense
        +	lVectors *CDense
         }
         
         // succFact returns whether the receiver contains a successful factorization.
         func (e *Eigen) succFact() bool {
        -	return len(e.values) != 0
        +	return e.n != 0
         }
         
         // Factorize computes the eigenvalues of the square matrix a, and optionally
        @@ -127,7 +153,7 @@ func (e *Eigen) succFact() bool {
         // A right eigenvalue/eigenvector combination is defined by
         //  A * x_r = λ * x_r
         // where x_r is the column vector called an eigenvector, and λ is the corresponding
        -// eigenvector.
        +// eigenvalue.
         //
         // Similarly, a left eigenvalue/eigenvector combination is defined by
         //  x_l * A = λ * x_l
        @@ -135,23 +161,27 @@ func (e *Eigen) succFact() bool {
         //
         // Typically eigenvectors refer to right eigenvectors.
         //
        -// In all cases, Eigen computes the eigenvalues of the matrix. If right and left
        -// are true, then the right and left eigenvectors will be computed, respectively.
        +// In all cases, Factorize computes the eigenvalues of the matrix. kind
        +// specifies which of the eigenvectors, if any, to compute. See the EigenKind
        +// documentation for more information.
         // Eigen panics if the input matrix is not square.
         //
         // Factorize returns whether the decomposition succeeded. If the decomposition
         // failed, methods that require a successful factorization will panic.
        -func (e *Eigen) Factorize(a Matrix, left, right bool) (ok bool) {
        -	// TODO(btracey): Change implementation to store VecDenses as a *CMat when
        -	// #308 is resolved.
        -
        +func (e *Eigen) Factorize(a Matrix, kind EigenKind) (ok bool) {
        +	// kill previous factorization.
        +	e.n = 0
        +	e.kind = 0
         	// Copy a because it is modified during the Lapack call.
         	r, c := a.Dims()
         	if r != c {
         		panic(ErrShape)
         	}
         	var sd Dense
        -	sd.Clone(a)
        +	sd.CloneFrom(a)
        +
        +	left := kind&EigenLeft != 0
        +	right := kind&EigenRight != 0
         
         	var vl, vr Dense
         	jobvl := lapack.LeftEVNone
        @@ -181,18 +211,43 @@ func (e *Eigen) Factorize(a Matrix, left, right bool) (ok bool) {
         		return false
         	}
         	e.n = r
        -	e.right = right
        -	e.left = left
        -	e.lVectors = &vl
        -	e.rVectors = &vr
        +	e.kind = kind
        +
        +	// Construct complex eigenvalues from float64 data.
         	values := make([]complex128, r)
         	for i, v := range wr {
         		values[i] = complex(v, wi[i])
         	}
         	e.values = values
        +
        +	// Construct complex eigenvectors from float64 data.
        +	var cvl, cvr CDense
        +	if left {
        +		cvl = *NewCDense(r, r, nil)
        +		e.complexEigenTo(&cvl, &vl)
        +		e.lVectors = &cvl
        +	} else {
        +		e.lVectors = nil
        +	}
        +	if right {
        +		cvr = *NewCDense(c, c, nil)
        +		e.complexEigenTo(&cvr, &vr)
        +		e.rVectors = &cvr
        +	} else {
        +		e.rVectors = nil
        +	}
         	return true
         }
         
        +// Kind returns the EigenKind of the decomposition. If no decomposition has been
        +// computed, Kind returns -1.
        +func (e *Eigen) Kind() EigenKind {
        +	if !e.succFact() {
        +		return -1
        +	}
        +	return e.kind
        +}
        +
         // Values extracts the eigenvalues of the factorized matrix. If dst is
         // non-nil, the values are stored in-place into dst. In this case
         // dst must have length n, otherwise Values will panic. If dst is
        @@ -214,48 +269,92 @@ func (e *Eigen) Values(dst []complex128) []complex128 {
         	return dst
         }
         
        -// Vectors returns the right eigenvectors of the decomposition. Vectors
        -// will panic if the right eigenvectors were not computed during the factorization,
        -// or if the factorization was not successful.
        +// complexEigenTo extracts the complex eigenvectors from the real matrix d
        +// and stores them into the complex matrix dst.
         //
        -// The returned matrix will contain the right eigenvectors of the decomposition
        -// in the columns of the n×n matrix in the same order as their eigenvalues.
        +// The columns of the returned n×n dense matrix contain the eigenvectors of the
        +// decomposition in the same order as the eigenvalues.
         // If the j-th eigenvalue is real, then
        -//  u_j = VL[:,j],
        -//  v_j = VR[:,j],
        -// and if it is not real, then j and j+1 form a complex conjugate pair and the
        -// eigenvectors can be recovered as
        -//  u_j     = VL[:,j] + i*VL[:,j+1],
        -//  u_{j+1} = VL[:,j] - i*VL[:,j+1],
        -//  v_j     = VR[:,j] + i*VR[:,j+1],
        -//  v_{j+1} = VR[:,j] - i*VR[:,j+1],
        -// where i is the imaginary unit. The computed eigenvectors are normalized to
        -// have Euclidean norm equal to 1 and largest component real.
        +//  dst[:,j] = d[:,j],
        +// and if it is not real, then the elements of the j-th and (j+1)-th columns of d
        +// form complex conjugate pairs and the eigenvectors are recovered as
        +//  dst[:,j]   = d[:,j] + i*d[:,j+1],
        +//  dst[:,j+1] = d[:,j] - i*d[:,j+1],
        +// where i is the imaginary unit.
        +func (e *Eigen) complexEigenTo(dst *CDense, d *Dense) {
        +	r, c := d.Dims()
        +	cr, cc := dst.Dims()
        +	if r != cr {
        +		panic("size mismatch")
        +	}
        +	if c != cc {
        +		panic("size mismatch")
        +	}
        +	for j := 0; j < c; j++ {
        +		if imag(e.values[j]) == 0 {
        +			for i := 0; i < r; i++ {
        +				dst.set(i, j, complex(d.at(i, j), 0))
        +			}
        +			continue
        +		}
        +		for i := 0; i < r; i++ {
        +			real := d.at(i, j)
        +			imag := d.at(i, j+1)
        +			dst.set(i, j, complex(real, imag))
        +			dst.set(i, j+1, complex(real, -imag))
        +		}
        +		j++
        +	}
        +}
        +
        +// VectorsTo stores the right eigenvectors of the decomposition into the columns
        +// of dst. The computed eigenvectors are normalized to have Euclidean norm equal
        +// to 1 and largest component real.
         //
        -// BUG: This signature and behavior will change when issue #308 is resolved.
        -func (e *Eigen) Vectors() *Dense {
        +// If dst is empty, VectorsTo will resize dst to be n×n. When dst is
        +// non-empty, VectorsTo will panic if dst is not n×n. VectorsTo will also
        +// panic if the eigenvectors were not computed during the factorization,
        +// or if the receiver does not contain a successful factorization.
        +func (e *Eigen) VectorsTo(dst *CDense) {
         	if !e.succFact() {
         		panic(badFact)
         	}
        -	if !e.right {
        -		panic(badNoVect)
        +	if e.kind&EigenRight == 0 {
        +		panic(noVectors)
         	}
        -	return DenseCopyOf(e.rVectors)
        +	if dst.IsEmpty() {
        +		dst.ReuseAs(e.n, e.n)
        +	} else {
        +		r, c := dst.Dims()
        +		if r != e.n || c != e.n {
        +			panic(ErrShape)
        +		}
        +	}
        +	dst.Copy(e.rVectors)
         }
         
        -// LeftVectors returns the left eigenvectors of the decomposition. LeftVectors
        -// will panic if the left eigenvectors were not computed during the factorization.
        -// or if the factorization was not successful.
        -//
        -// See the documentation in lapack64.Geev for the format of the vectors.
        +// LeftVectorsTo stores the left eigenvectors of the decomposition into the
        +// columns of dst. The computed eigenvectors are normalized to have Euclidean
        +// norm equal to 1 and largest component real.
         //
        -// BUG: This signature and behavior will change when issue #308 is resolved.
        -func (e *Eigen) LeftVectors() *Dense {
        +// If dst is empty, LeftVectorsTo will resize dst to be n×n. When dst is
        +// non-empty, LeftVectorsTo will panic if dst is not n×n. LeftVectorsTo will also
        +// panic if the left eigenvectors were not computed during the factorization,
        +// or if the receiver does not contain a successful factorization
        +func (e *Eigen) LeftVectorsTo(dst *CDense) {
         	if !e.succFact() {
         		panic(badFact)
         	}
        -	if !e.left {
        -		panic(badNoVect)
        +	if e.kind&EigenLeft == 0 {
        +		panic(noVectors)
        +	}
        +	if dst.IsEmpty() {
        +		dst.ReuseAs(e.n, e.n)
        +	} else {
        +		r, c := dst.Dims()
        +		if r != e.n || c != e.n {
        +			panic(ErrShape)
        +		}
         	}
        -	return DenseCopyOf(e.lVectors)
        +	dst.Copy(e.lVectors)
         }
        diff --git a/vendor/gonum.org/v1/gonum/mat/errors.go b/vendor/gonum.org/v1/gonum/mat/errors.go
        index 0430d126f..8609f7ceb 100644
        --- a/vendor/gonum.org/v1/gonum/mat/errors.go
        +++ b/vendor/gonum.org/v1/gonum/mat/errors.go
        @@ -37,7 +37,7 @@ const (
         	// in the matrix packages.
         	CondNorm = lapack.MaxRowSum
         
        -	// CondNormTrans is the norm used to compute on A^T to get the same result as
        +	// CondNormTrans is the norm used to compute on Aᵀ to get the same result as
         	// computing CondNorm on A.
         	CondNormTrans = lapack.MaxColumnSum
         )
        @@ -114,26 +114,28 @@ type Error struct{ string }
         func (err Error) Error() string { return err.string }
         
         var (
        -	ErrIndexOutOfRange     = Error{"matrix: index out of range"}
        -	ErrRowAccess           = Error{"matrix: row index out of range"}
        -	ErrColAccess           = Error{"matrix: column index out of range"}
        -	ErrVectorAccess        = Error{"matrix: vector index out of range"}
        -	ErrZeroLength          = Error{"matrix: zero length in matrix dimension"}
        -	ErrRowLength           = Error{"matrix: row length mismatch"}
        -	ErrColLength           = Error{"matrix: col length mismatch"}
        -	ErrSquare              = Error{"matrix: expect square matrix"}
        -	ErrNormOrder           = Error{"matrix: invalid norm order for matrix"}
        -	ErrSingular            = Error{"matrix: matrix is singular"}
        -	ErrShape               = Error{"matrix: dimension mismatch"}
        -	ErrIllegalStride       = Error{"matrix: illegal stride"}
        -	ErrPivot               = Error{"matrix: malformed pivot list"}
        -	ErrTriangle            = Error{"matrix: triangular storage mismatch"}
        -	ErrTriangleSet         = Error{"matrix: triangular set out of bounds"}
        -	ErrBandSet             = Error{"matrix: band set out of bounds"}
        -	ErrDiagSet             = Error{"matrix: diagonal set out of bounds"}
        -	ErrSliceLengthMismatch = Error{"matrix: input slice length mismatch"}
        -	ErrNotPSD              = Error{"matrix: input not positive symmetric definite"}
        -	ErrFailedEigen         = Error{"matrix: eigendecomposition not successful"}
        +	ErrNegativeDimension   = Error{"mat: negative dimension"}
        +	ErrIndexOutOfRange     = Error{"mat: index out of range"}
        +	ErrReuseNonEmpty       = Error{"mat: reuse of non-empty matrix"}
        +	ErrRowAccess           = Error{"mat: row index out of range"}
        +	ErrColAccess           = Error{"mat: column index out of range"}
        +	ErrVectorAccess        = Error{"mat: vector index out of range"}
        +	ErrZeroLength          = Error{"mat: zero length in matrix dimension"}
        +	ErrRowLength           = Error{"mat: row length mismatch"}
        +	ErrColLength           = Error{"mat: col length mismatch"}
        +	ErrSquare              = Error{"mat: expect square matrix"}
        +	ErrNormOrder           = Error{"mat: invalid norm order for matrix"}
        +	ErrSingular            = Error{"mat: matrix is singular"}
        +	ErrShape               = Error{"mat: dimension mismatch"}
        +	ErrIllegalStride       = Error{"mat: illegal stride"}
        +	ErrPivot               = Error{"mat: malformed pivot list"}
        +	ErrTriangle            = Error{"mat: triangular storage mismatch"}
        +	ErrTriangleSet         = Error{"mat: triangular set out of bounds"}
        +	ErrBandSet             = Error{"mat: band set out of bounds"}
        +	ErrDiagSet             = Error{"mat: diagonal set out of bounds"}
        +	ErrSliceLengthMismatch = Error{"mat: input slice length mismatch"}
        +	ErrNotPSD              = Error{"mat: input not positive symmetric definite"}
        +	ErrFailedEigen         = Error{"mat: eigendecomposition not successful"}
         )
         
         // ErrorStack represents matrix handling errors that have been recovered by Maybe wrappers.
        diff --git a/vendor/gonum.org/v1/gonum/mat/format.go b/vendor/gonum.org/v1/gonum/mat/format.go
        index ce72eb19a..9b60cb318 100644
        --- a/vendor/gonum.org/v1/gonum/mat/format.go
        +++ b/vendor/gonum.org/v1/gonum/mat/format.go
        @@ -66,7 +66,7 @@ func (f formatter) Format(fs fmt.State, c rune) {
         }
         
         // format prints a pretty representation of m to the fs io.Writer. The format character c
        -// specifies the numerical representation of of elements; valid values are those for float64
        +// specifies the numerical representation of elements; valid values are those for float64
         // specified in the fmt package, with their associated flags. In addition to this, a space
         // preceding a verb indicates that zero values should be represented by the dot character.
         // The printed range of the matrix can be limited by specifying a positive value for margin;
        diff --git a/vendor/gonum.org/v1/gonum/mat/gsvd.go b/vendor/gonum.org/v1/gonum/mat/gsvd.go
        index f2b82cb53..031a822d2 100644
        --- a/vendor/gonum.org/v1/gonum/mat/gsvd.go
        +++ b/vendor/gonum.org/v1/gonum/mat/gsvd.go
        @@ -11,6 +11,29 @@ import (
         	"gonum.org/v1/gonum/lapack/lapack64"
         )
         
        +// GSVDKind specifies the treatment of singular vectors during a GSVD
        +// factorization.
        +type GSVDKind int
        +
        +const (
        +	// GSVDNone specifies that no singular vectors should be computed during
        +	// the decomposition.
        +	GSVDNone GSVDKind = 0
        +
        +	// GSVDU specifies that the U singular vectors should be computed during
        +	// the decomposition.
        +	GSVDU GSVDKind = 1 << iota
        +	// GSVDV specifies that the V singular vectors should be computed during
        +	// the decomposition.
        +	GSVDV
        +	// GSVDQ specifies that the Q singular vectors should be computed during
        +	// the decomposition.
        +	GSVDQ
        +
        +	// GSVDAll is a convenience value for computing all of the singular vectors.
        +	GSVDAll = GSVDU | GSVDV | GSVDQ
        +)
        +
         // GSVD is a type for creating and using the Generalized Singular Value Decomposition
         // (GSVD) of a matrix.
         //
        @@ -28,18 +51,23 @@ type GSVD struct {
         	iwork []int
         }
         
        +// succFact returns whether the receiver contains a successful factorization.
        +func (gsvd *GSVD) succFact() bool {
        +	return gsvd.r != 0
        +}
        +
         // Factorize computes the generalized singular value decomposition (GSVD) of the input
         // the r×c matrix A and the p×c matrix B. The singular values of A and B are computed
         // in all cases, while the singular vectors are optionally computed depending on the
         // input kind.
         //
        -// The full singular value decomposition (kind == GSVDU|GSVDV|GSVDQ) deconstructs A and B as
        -//  A = U * Σ₁ * [ 0 R ] * Q^T
        +// The full singular value decomposition (kind == GSVDAll) deconstructs A and B as
        +//  A = U * Σ₁ * [ 0 R ] * Qᵀ
         //
        -//  B = V * Σ₂ * [ 0 R ] * Q^T
        +//  B = V * Σ₂ * [ 0 R ] * Qᵀ
         // where Σ₁ and Σ₂ are r×(k+l) and p×(k+l) diagonal matrices of singular values, and
         // U, V and Q are r×r, p×p and c×c orthogonal matrices of singular vectors. k+l is the
        -// effective numerical rank of the matrix [ A^T B^T ]^T.
        +// effective numerical rank of the matrix [ Aᵀ Bᵀ ]ᵀ.
         //
         // It is frequently not necessary to compute the full GSVD. Computation time and
         // storage costs can be reduced using the appropriate kind. Either only the singular
        @@ -49,6 +77,10 @@ type GSVD struct {
         // Factorize returns whether the decomposition succeeded. If the decomposition
         // failed, routines that require a successful factorization will panic.
         func (gsvd *GSVD) Factorize(a, b Matrix, kind GSVDKind) (ok bool) {
        +	// kill the previous decomposition
        +	gsvd.r = 0
        +	gsvd.kind = 0
        +
         	r, c := a.Dims()
         	gsvd.r, gsvd.c = r, c
         	p, c := b.Dims()
        @@ -64,7 +96,7 @@ func (gsvd *GSVD) Factorize(a, b Matrix, kind GSVDKind) (ok bool) {
         		jobU = lapack.GSVDNone
         		jobV = lapack.GSVDNone
         		jobQ = lapack.GSVDNone
        -	case (GSVDU|GSVDV|GSVDQ)&kind != 0:
        +	case GSVDAll&kind != 0:
         		if GSVDU&kind != 0 {
         			jobU = lapack.GSVDU
         			gsvd.u = blas64.General{
        @@ -115,13 +147,16 @@ func (gsvd *GSVD) Factorize(a, b Matrix, kind GSVDKind) (ok bool) {
         	return ok
         }
         
        -// Kind returns the matrix.GSVDKind of the decomposition. If no decomposition has been
        -// computed, Kind returns 0.
        +// Kind returns the GSVDKind of the decomposition. If no decomposition has been
        +// computed, Kind returns -1.
         func (gsvd *GSVD) Kind() GSVDKind {
        +	if !gsvd.succFact() {
        +		return -1
        +	}
         	return gsvd.kind
         }
         
        -// Rank returns the k and l terms of the rank of [ A^T B^T ]^T.
        +// Rank returns the k and l terms of the rank of [ Aᵀ Bᵀ ]ᵀ.
         func (gsvd *GSVD) Rank() (k, l int) {
         	return gsvd.k, gsvd.l
         }
        @@ -134,8 +169,8 @@ func (gsvd *GSVD) Rank() (k, l int) {
         //
         // GeneralizedValues will panic if the receiver does not contain a successful factorization.
         func (gsvd *GSVD) GeneralizedValues(v []float64) []float64 {
        -	if gsvd.kind == 0 {
        -		panic("gsvd: no decomposition computed")
        +	if !gsvd.succFact() {
        +		panic(badFact)
         	}
         	r := gsvd.r
         	c := gsvd.c
        @@ -159,8 +194,8 @@ func (gsvd *GSVD) GeneralizedValues(v []float64) []float64 {
         //
         // ValuesA will panic if the receiver does not contain a successful factorization.
         func (gsvd *GSVD) ValuesA(s []float64) []float64 {
        -	if gsvd.kind == 0 {
        -		panic("gsvd: no decomposition computed")
        +	if !gsvd.succFact() {
        +		panic(badFact)
         	}
         	r := gsvd.r
         	c := gsvd.c
        @@ -184,8 +219,8 @@ func (gsvd *GSVD) ValuesA(s []float64) []float64 {
         //
         // ValuesB will panic if the receiver does not contain a successful factorization.
         func (gsvd *GSVD) ValuesB(s []float64) []float64 {
        -	if gsvd.kind == 0 {
        -		panic("gsvd: no decomposition computed")
        +	if !gsvd.succFact() {
        +		panic(badFact)
         	}
         	r := gsvd.r
         	c := gsvd.c
        @@ -201,60 +236,67 @@ func (gsvd *GSVD) ValuesB(s []float64) []float64 {
         	return s
         }
         
        -// ZeroRTo extracts the matrix [ 0 R ] from the singular value decomposition, storing
        -// the result in-place into dst. [ 0 R ] is size (k+l)×c.
        -// If dst is nil, a new matrix is allocated. The resulting ZeroR matrix is returned.
        +// ZeroRTo extracts the matrix [ 0 R ] from the singular value decomposition,
        +// storing the result into dst. [ 0 R ] is of size (k+l)×c.
         //
        -// ZeroRTo will panic if the receiver does not contain a successful factorization.
        -func (gsvd *GSVD) ZeroRTo(dst *Dense) *Dense {
        -	if gsvd.kind == 0 {
        -		panic("gsvd: no decomposition computed")
        +// If dst is empty, ZeroRTo will resize dst to be (k+l)×c. When dst is
        +// non-empty, ZeroRTo will panic if dst is not (k+l)×c. ZeroRTo will also panic
        +// if the receiver does not contain a successful factorization.
        +func (gsvd *GSVD) ZeroRTo(dst *Dense) {
        +	if !gsvd.succFact() {
        +		panic(badFact)
         	}
         	r := gsvd.r
         	c := gsvd.c
         	k := gsvd.k
         	l := gsvd.l
         	h := min(k+l, r)
        -	if dst == nil {
        -		dst = NewDense(k+l, c, nil)
        +	if dst.IsEmpty() {
        +		dst.ReuseAs(k+l, c)
         	} else {
        -		dst.reuseAsZeroed(k+l, c)
        +		r2, c2 := dst.Dims()
        +		if r2 != k+l || c != c2 {
        +			panic(ErrShape)
        +		}
        +		dst.Zero()
         	}
         	a := Dense{
         		mat:     gsvd.a,
         		capRows: r,
         		capCols: c,
         	}
        -	dst.Slice(0, h, c-k-l, c).(*Dense).
        -		Copy(a.Slice(0, h, c-k-l, c))
        +	dst.slice(0, h, c-k-l, c).Copy(a.Slice(0, h, c-k-l, c))
         	if r < k+l {
         		b := Dense{
         			mat:     gsvd.b,
         			capRows: gsvd.p,
         			capCols: c,
         		}
        -		dst.Slice(r, k+l, c+r-k-l, c).(*Dense).
        -			Copy(b.Slice(r-k, l, c+r-k-l, c))
        +		dst.slice(r, k+l, c+r-k-l, c).Copy(b.Slice(r-k, l, c+r-k-l, c))
         	}
        -	return dst
         }
         
         // SigmaATo extracts the matrix Σ₁ from the singular value decomposition, storing
        -// the result in-place into dst. Σ₁ is size r×(k+l).
        -// If dst is nil, a new matrix is allocated. The resulting SigmaA matrix is returned.
        +// the result into dst. Σ₁ is size r×(k+l).
         //
        -// SigmaATo will panic if the receiver does not contain a successful factorization.
        -func (gsvd *GSVD) SigmaATo(dst *Dense) *Dense {
        -	if gsvd.kind == 0 {
        -		panic("gsvd: no decomposition computed")
        +// If dst is empty, SigmaATo will resize dst to be r×(k+l). When dst is
        +// non-empty, SigmATo will panic if dst is not r×(k+l). SigmaATo will also
        +// panic if the receiver does not contain a successful factorization.
        +func (gsvd *GSVD) SigmaATo(dst *Dense) {
        +	if !gsvd.succFact() {
        +		panic(badFact)
         	}
         	r := gsvd.r
         	k := gsvd.k
         	l := gsvd.l
        -	if dst == nil {
        -		dst = NewDense(r, k+l, nil)
        +	if dst.IsEmpty() {
        +		dst.ReuseAs(r, k+l)
         	} else {
        -		dst.reuseAsZeroed(r, k+l)
        +		r2, c := dst.Dims()
        +		if r2 != r || c != k+l {
        +			panic(ErrShape)
        +		}
        +		dst.Zero()
         	}
         	for i := 0; i < k; i++ {
         		dst.set(i, i, 1)
        @@ -262,26 +304,30 @@ func (gsvd *GSVD) SigmaATo(dst *Dense) *Dense {
         	for i := k; i < min(r, k+l); i++ {
         		dst.set(i, i, gsvd.s1[i])
         	}
        -	return dst
         }
         
         // SigmaBTo extracts the matrix Σ₂ from the singular value decomposition, storing
        -// the result in-place into dst. Σ₂ is size p×(k+l).
        -// If dst is nil, a new matrix is allocated. The resulting SigmaB matrix is returned.
        +// the result into dst. Σ₂ is size p×(k+l).
         //
        -// SigmaBTo will panic if the receiver does not contain a successful factorization.
        -func (gsvd *GSVD) SigmaBTo(dst *Dense) *Dense {
        -	if gsvd.kind == 0 {
        -		panic("gsvd: no decomposition computed")
        +// If dst is empty, SigmaBTo will resize dst to be p×(k+l). When dst is
        +// non-empty, SigmBTo will panic if dst is not p×(k+l). SigmaBTo will also
        +// panic if the receiver does not contain a successful factorization.
        +func (gsvd *GSVD) SigmaBTo(dst *Dense) {
        +	if !gsvd.succFact() {
        +		panic(badFact)
         	}
         	r := gsvd.r
         	p := gsvd.p
         	k := gsvd.k
         	l := gsvd.l
        -	if dst == nil {
        -		dst = NewDense(p, k+l, nil)
        +	if dst.IsEmpty() {
        +		dst.ReuseAs(p, k+l)
         	} else {
        -		dst.reuseAsZeroed(p, k+l)
        +		r, c := dst.Dims()
        +		if r != p || c != k+l {
        +			panic(ErrShape)
        +		}
        +		dst.Zero()
         	}
         	for i := 0; i < min(l, r-k); i++ {
         		dst.set(i, i+k, gsvd.s2[k+i])
        @@ -289,24 +335,30 @@ func (gsvd *GSVD) SigmaBTo(dst *Dense) *Dense {
         	for i := r - k; i < l; i++ {
         		dst.set(i, i+k, 1)
         	}
        -	return dst
         }
         
         // UTo extracts the matrix U from the singular value decomposition, storing
        -// the result in-place into dst. U is size r×r.
        -// If dst is nil, a new matrix is allocated. The resulting U matrix is returned.
        +// the result into dst. U is size r×r.
         //
        -// UTo will panic if the receiver does not contain a successful factorization.
        -func (gsvd *GSVD) UTo(dst *Dense) *Dense {
        +// If dst is empty, UTo will resize dst to be r×r. When dst is
        +// non-empty, UTo will panic if dst is not r×r. UTo will also
        +// panic if the receiver does not contain a successful factorization.
        +func (gsvd *GSVD) UTo(dst *Dense) {
        +	if !gsvd.succFact() {
        +		panic(badFact)
        +	}
         	if gsvd.kind&GSVDU == 0 {
         		panic("mat: improper GSVD kind")
         	}
         	r := gsvd.u.Rows
         	c := gsvd.u.Cols
        -	if dst == nil {
        -		dst = NewDense(r, c, nil)
        +	if dst.IsEmpty() {
        +		dst.ReuseAs(r, c)
         	} else {
        -		dst.reuseAs(r, c)
        +		r2, c2 := dst.Dims()
        +		if r != r2 || c != c2 {
        +			panic(ErrShape)
        +		}
         	}
         
         	tmp := &Dense{
        @@ -315,24 +367,30 @@ func (gsvd *GSVD) UTo(dst *Dense) *Dense {
         		capCols: c,
         	}
         	dst.Copy(tmp)
        -	return dst
         }
         
         // VTo extracts the matrix V from the singular value decomposition, storing
        -// the result in-place into dst. V is size p×p.
        -// If dst is nil, a new matrix is allocated. The resulting V matrix is returned.
        +// the result into dst. V is size p×p.
         //
        -// VTo will panic if the receiver does not contain a successful factorization.
        -func (gsvd *GSVD) VTo(dst *Dense) *Dense {
        +// If dst is empty, VTo will resize dst to be p×p. When dst is
        +// non-empty, VTo will panic if dst is not p×p. VTo will also
        +// panic if the receiver does not contain a successful factorization.
        +func (gsvd *GSVD) VTo(dst *Dense) {
        +	if !gsvd.succFact() {
        +		panic(badFact)
        +	}
         	if gsvd.kind&GSVDV == 0 {
         		panic("mat: improper GSVD kind")
         	}
         	r := gsvd.v.Rows
         	c := gsvd.v.Cols
        -	if dst == nil {
        -		dst = NewDense(r, c, nil)
        +	if dst.IsEmpty() {
        +		dst.ReuseAs(r, c)
         	} else {
        -		dst.reuseAs(r, c)
        +		r2, c2 := dst.Dims()
        +		if r != r2 || c != c2 {
        +			panic(ErrShape)
        +		}
         	}
         
         	tmp := &Dense{
        @@ -341,24 +399,30 @@ func (gsvd *GSVD) VTo(dst *Dense) *Dense {
         		capCols: c,
         	}
         	dst.Copy(tmp)
        -	return dst
         }
         
         // QTo extracts the matrix Q from the singular value decomposition, storing
        -// the result in-place into dst. Q is size c×c.
        -// If dst is nil, a new matrix is allocated. The resulting Q matrix is returned.
        +// the result into dst. Q is size c×c.
         //
        -// QTo will panic if the receiver does not contain a successful factorization.
        -func (gsvd *GSVD) QTo(dst *Dense) *Dense {
        +// If dst is empty, QTo will resize dst to be c×c. When dst is
        +// non-empty, QTo will panic if dst is not c×c. QTo will also
        +// panic if the receiver does not contain a successful factorization.
        +func (gsvd *GSVD) QTo(dst *Dense) {
        +	if !gsvd.succFact() {
        +		panic(badFact)
        +	}
         	if gsvd.kind&GSVDQ == 0 {
         		panic("mat: improper GSVD kind")
         	}
         	r := gsvd.q.Rows
         	c := gsvd.q.Cols
        -	if dst == nil {
        -		dst = NewDense(r, c, nil)
        +	if dst.IsEmpty() {
        +		dst.ReuseAs(r, c)
         	} else {
        -		dst.reuseAs(r, c)
        +		r2, c2 := dst.Dims()
        +		if r != r2 || c != c2 {
        +			panic(ErrShape)
        +		}
         	}
         
         	tmp := &Dense{
        @@ -367,5 +431,4 @@ func (gsvd *GSVD) QTo(dst *Dense) *Dense {
         		capCols: c,
         	}
         	dst.Copy(tmp)
        -	return dst
         }
        diff --git a/vendor/gonum.org/v1/gonum/mat/hogsvd.go b/vendor/gonum.org/v1/gonum/mat/hogsvd.go
        index 4b0a8ba67..23777b9c1 100644
        --- a/vendor/gonum.org/v1/gonum/mat/hogsvd.go
        +++ b/vendor/gonum.org/v1/gonum/mat/hogsvd.go
        @@ -24,16 +24,21 @@ type HOGSVD struct {
         	err error
         }
         
        +// succFact returns whether the receiver contains a successful factorization.
        +func (gsvd *HOGSVD) succFact() bool {
        +	return gsvd.n != 0
        +}
        +
         // Factorize computes the higher order generalized singular value decomposition (HOGSVD)
         // of the n input r_i×c column tall matrices in m. HOGSV extends the GSVD case from 2 to n
         // input matrices.
         //
        -//  M_0 = U_0 * Σ_0 * V^T
        -//  M_1 = U_1 * Σ_1 * V^T
        +//  M_0 = U_0 * Σ_0 * Vᵀ
        +//  M_1 = U_1 * Σ_1 * Vᵀ
         //  .
         //  .
         //  .
        -//  M_{n-1} = U_{n-1} * Σ_{n-1} * V^T
        +//  M_{n-1} = U_{n-1} * Σ_{n-1} * Vᵀ
         //
         // where U_i are r_i×c matrices of singular vectors, Σ are c×c matrices singular values, and V
         // is a c×c matrix of singular vectors.
        @@ -80,13 +85,13 @@ func (gsvd *HOGSVD) Factorize(m ...Matrix) (ok bool) {
         	defer putWorkspace(sij)
         	for i, ai := range a {
         		for _, aj := range a[i+1:] {
        -			gsvd.err = ai.SolveChol(sij, &aj)
        +			gsvd.err = ai.SolveCholTo(sij, &aj)
         			if gsvd.err != nil {
         				return false
         			}
         			s.Add(s, sij)
         
        -			gsvd.err = aj.SolveChol(sij, &ai)
        +			gsvd.err = aj.SolveCholTo(sij, &ai)
         			if gsvd.err != nil {
         				return false
         			}
        @@ -96,23 +101,35 @@ func (gsvd *HOGSVD) Factorize(m ...Matrix) (ok bool) {
         	s.Scale(1/float64(len(m)*(len(m)-1)), s)
         
         	var eig Eigen
        -	ok = eig.Factorize(s.T(), false, true)
        +	ok = eig.Factorize(s.T(), EigenRight)
         	if !ok {
         		gsvd.err = errors.New("hogsvd: eigen decomposition failed")
         		return false
         	}
        -	v := eig.Vectors()
        +	var vc CDense
        +	eig.VectorsTo(&vc)
        +	// vc is guaranteed to have real eigenvalues.
        +	rc, cc := vc.Dims()
        +	v := NewDense(rc, cc, nil)
        +	for i := 0; i < rc; i++ {
        +		for j := 0; j < cc; j++ {
        +			a := vc.At(i, j)
        +			v.set(i, j, real(a))
        +		}
        +	}
        +	// Rescale the columns of v by their Frobenius norms.
        +	// Work done in cv is reflected in v.
         	var cv VecDense
         	for j := 0; j < c; j++ {
         		cv.ColViewOf(v, j)
        -		cv.ScaleVec(1/blas64.Nrm2(c, cv.mat), &cv)
        +		cv.ScaleVec(1/blas64.Nrm2(cv.mat), &cv)
         	}
         
         	b := make([]Dense, len(m))
         	biT := getWorkspace(c, r, false)
         	defer putWorkspace(biT)
         	for i, d := range m {
        -		// All calls to reset will leave a zeroed
        +		// All calls to reset will leave an emptied
         		// matrix with capacity to store the result
         		// without additional allocation.
         		biT.Reset()
        @@ -120,7 +137,7 @@ func (gsvd *HOGSVD) Factorize(m ...Matrix) (ok bool) {
         		if gsvd.err != nil {
         			return false
         		}
        -		b[i].Clone(biT.T())
        +		b[i].CloneFrom(biT.T())
         	}
         
         	gsvd.n = len(m)
        @@ -142,22 +159,25 @@ func (gsvd *HOGSVD) Len() int {
         
         // UTo extracts the matrix U_n from the singular value decomposition, storing
         // the result in-place into dst. U_n is size r×c.
        -// If dst is nil, a new matrix is allocated. The resulting U matrix is returned.
         //
        -// UTo will panic if the receiver does not contain a successful factorization.
        -func (gsvd *HOGSVD) UTo(dst *Dense, n int) *Dense {
        -	if gsvd.n == 0 {
        -		panic("hogsvd: unsuccessful factorization")
        +// If dst is empty, UTo will resize dst to be r×c. When dst is
        +// non-empty, UTo will panic if dst is not r×c. UTo will also
        +// panic if the receiver does not contain a successful factorization.
        +func (gsvd *HOGSVD) UTo(dst *Dense, n int) {
        +	if !gsvd.succFact() {
        +		panic(badFact)
         	}
         	if n < 0 || gsvd.n <= n {
         		panic("hogsvd: invalid index")
         	}
        -
        -	if dst == nil {
        -		r, c := gsvd.b[n].Dims()
        -		dst = NewDense(r, c, nil)
        +	r, c := gsvd.b[n].Dims()
        +	if dst.IsEmpty() {
        +		dst.ReuseAs(r, c)
         	} else {
        -		dst.reuseAs(gsvd.b[n].Dims())
        +		r2, c2 := dst.Dims()
        +		if r != r2 || c != c2 {
        +			panic(ErrShape)
        +		}
         	}
         	dst.Copy(&gsvd.b[n])
         	var v VecDense
        @@ -165,7 +185,6 @@ func (gsvd *HOGSVD) UTo(dst *Dense, n int) *Dense {
         		v.ColViewOf(dst, j)
         		v.ScaleVec(1/f, &v)
         	}
        -	return dst
         }
         
         // Values returns the nth set of singular values of the factorized system.
        @@ -176,14 +195,14 @@ func (gsvd *HOGSVD) UTo(dst *Dense, n int) *Dense {
         //
         // Values will panic if the receiver does not contain a successful factorization.
         func (gsvd *HOGSVD) Values(s []float64, n int) []float64 {
        -	if gsvd.n == 0 {
        -		panic("hogsvd: unsuccessful factorization")
        +	if !gsvd.succFact() {
        +		panic(badFact)
         	}
         	if n < 0 || gsvd.n <= n {
         		panic("hogsvd: invalid index")
         	}
         
        -	r, c := gsvd.b[n].Dims()
        +	_, c := gsvd.b[n].Dims()
         	if s == nil {
         		s = make([]float64, c)
         	} else if len(s) != c {
        @@ -192,26 +211,29 @@ func (gsvd *HOGSVD) Values(s []float64, n int) []float64 {
         	var v VecDense
         	for j := 0; j < c; j++ {
         		v.ColViewOf(&gsvd.b[n], j)
        -		s[j] = blas64.Nrm2(r, v.mat)
        +		s[j] = blas64.Nrm2(v.mat)
         	}
         	return s
         }
         
         // VTo extracts the matrix V from the singular value decomposition, storing
         // the result in-place into dst. V is size c×c.
        -// If dst is nil, a new matrix is allocated. The resulting V matrix is returned.
         //
        -// VTo will panic if the receiver does not contain a successful factorization.
        -func (gsvd *HOGSVD) VTo(dst *Dense) *Dense {
        -	if gsvd.n == 0 {
        -		panic("hogsvd: unsuccessful factorization")
        -	}
        -	if dst == nil {
        -		r, c := gsvd.v.Dims()
        -		dst = NewDense(r, c, nil)
        +// If dst is empty, VTo will resize dst to be c×c. When dst is
        +// non-empty, VTo will panic if dst is not c×c. VTo will also
        +// panic if the receiver does not contain a successful factorization.
        +func (gsvd *HOGSVD) VTo(dst *Dense) {
        +	if !gsvd.succFact() {
        +		panic(badFact)
        +	}
        +	r, c := gsvd.v.Dims()
        +	if dst.IsEmpty() {
        +		dst.ReuseAs(r, c)
         	} else {
        -		dst.reuseAs(gsvd.v.Dims())
        +		r2, c2 := dst.Dims()
        +		if r != r2 || c != c2 {
        +			panic(ErrShape)
        +		}
         	}
         	dst.Copy(gsvd.v)
        -	return dst
         }
        diff --git a/vendor/gonum.org/v1/gonum/mat/index_bound_checks.go b/vendor/gonum.org/v1/gonum/mat/index_bound_checks.go
        index e773cc059..59815a676 100644
        --- a/vendor/gonum.org/v1/gonum/mat/index_bound_checks.go
        +++ b/vendor/gonum.org/v1/gonum/mat/index_bound_checks.go
        @@ -38,6 +38,36 @@ func (m *Dense) set(i, j int, v float64) {
         	m.mat.Data[i*m.mat.Stride+j] = v
         }
         
        +// At returns the element at row i, column j.
        +func (m *CDense) At(i, j int) complex128 {
        +	return m.at(i, j)
        +}
        +
        +func (m *CDense) at(i, j int) complex128 {
        +	if uint(i) >= uint(m.mat.Rows) {
        +		panic(ErrRowAccess)
        +	}
        +	if uint(j) >= uint(m.mat.Cols) {
        +		panic(ErrColAccess)
        +	}
        +	return m.mat.Data[i*m.mat.Stride+j]
        +}
        +
        +// Set sets the element at row i, column j to the value v.
        +func (m *CDense) Set(i, j int, v complex128) {
        +	m.set(i, j, v)
        +}
        +
        +func (m *CDense) set(i, j int, v complex128) {
        +	if uint(i) >= uint(m.mat.Rows) {
        +		panic(ErrRowAccess)
        +	}
        +	if uint(j) >= uint(m.mat.Cols) {
        +		panic(ErrColAccess)
        +	}
        +	m.mat.Data[i*m.mat.Stride+j] = v
        +}
        +
         // At returns the element at row i.
         // It panics if i is out of bounds or if j is not zero.
         func (v *VecDense) At(i, j int) float64 {
        @@ -54,7 +84,7 @@ func (v *VecDense) AtVec(i int) float64 {
         }
         
         func (v *VecDense) at(i int) float64 {
        -	if uint(i) >= uint(v.n) {
        +	if uint(i) >= uint(v.mat.N) {
         		panic(ErrRowAccess)
         	}
         	return v.mat.Data[i*v.mat.Inc]
        @@ -67,7 +97,7 @@ func (v *VecDense) SetVec(i int, val float64) {
         }
         
         func (v *VecDense) setVec(i int, val float64) {
        -	if uint(i) >= uint(v.n) {
        +	if uint(i) >= uint(v.mat.N) {
         		panic(ErrVectorAccess)
         	}
         	v.mat.Data[i*v.mat.Inc] = val
        @@ -232,22 +262,76 @@ func (s *SymBandDense) set(i, j int, v float64) {
         	s.mat.Data[i*s.mat.Stride+pj] = v
         }
         
        +func (t *TriBandDense) At(i, j int) float64 {
        +	return t.at(i, j)
        +}
        +
        +func (t *TriBandDense) at(i, j int) float64 {
        +	// TODO(btracey): Support Diag field, see #692.
        +	if uint(i) >= uint(t.mat.N) {
        +		panic(ErrRowAccess)
        +	}
        +	if uint(j) >= uint(t.mat.N) {
        +		panic(ErrColAccess)
        +	}
        +	isUpper := t.isUpper()
        +	if (isUpper && i > j) || (!isUpper && i < j) {
        +		return 0
        +	}
        +	kl, ku := t.mat.K, 0
        +	if isUpper {
        +		kl, ku = 0, t.mat.K
        +	}
        +	pj := j + kl - i
        +	if pj < 0 || kl+ku+1 <= pj {
        +		return 0
        +	}
        +	return t.mat.Data[i*t.mat.Stride+pj]
        +}
        +
        +func (t *TriBandDense) SetTriBand(i, j int, v float64) {
        +	t.setTriBand(i, j, v)
        +}
        +
        +func (t *TriBandDense) setTriBand(i, j int, v float64) {
        +	if uint(i) >= uint(t.mat.N) {
        +		panic(ErrRowAccess)
        +	}
        +	if uint(j) >= uint(t.mat.N) {
        +		panic(ErrColAccess)
        +	}
        +	isUpper := t.isUpper()
        +	if (isUpper && i > j) || (!isUpper && i < j) {
        +		panic(ErrTriangleSet)
        +	}
        +	kl, ku := t.mat.K, 0
        +	if isUpper {
        +		kl, ku = 0, t.mat.K
        +	}
        +	pj := j + kl - i
        +	if pj < 0 || kl+ku+1 <= pj {
        +		panic(ErrBandSet)
        +	}
        +	// TODO(btracey): Support Diag field, see #692.
        +	t.mat.Data[i*t.mat.Stride+pj] = v
        +}
        +
         // At returns the element at row i, column j.
         func (d *DiagDense) At(i, j int) float64 {
         	return d.at(i, j)
         }
         
         func (d *DiagDense) at(i, j int) float64 {
        -	if uint(i) >= uint(len(d.data)) {
        +	if uint(i) >= uint(d.mat.N) {
         		panic(ErrRowAccess)
         	}
        -	if uint(j) >= uint(len(d.data)) {
        +	if uint(j) >= uint(d.mat.N) {
         		panic(ErrColAccess)
         	}
         	if i != j {
         		return 0
         	}
        -	return d.data[i]
        +	return d.mat.Data[i*d.mat.Inc]
         }
         
         // SetDiag sets the element at row i, column i to the value v.
        @@ -257,8 +341,8 @@ func (d *DiagDense) SetDiag(i int, v float64) {
         }
         
         func (d *DiagDense) setDiag(i int, v float64) {
        -	if uint(i) >= uint(len(d.data)) {
        +	if uint(i) >= uint(d.mat.N) {
         		panic(ErrRowAccess)
         	}
        -	d.data[i] = v
        +	d.mat.Data[i*d.mat.Inc] = v
         }
        diff --git a/vendor/gonum.org/v1/gonum/mat/index_no_bound_checks.go b/vendor/gonum.org/v1/gonum/mat/index_no_bound_checks.go
        index 2848198bf..051f8437a 100644
        --- a/vendor/gonum.org/v1/gonum/mat/index_no_bound_checks.go
        +++ b/vendor/gonum.org/v1/gonum/mat/index_no_bound_checks.go
        @@ -38,10 +38,40 @@ func (m *Dense) set(i, j int, v float64) {
         	m.mat.Data[i*m.mat.Stride+j] = v
         }
         
        +// At returns the element at row i, column j.
        +func (m *CDense) At(i, j int) complex128 {
        +	if uint(i) >= uint(m.mat.Rows) {
        +		panic(ErrRowAccess)
        +	}
        +	if uint(j) >= uint(m.mat.Cols) {
        +		panic(ErrColAccess)
        +	}
        +	return m.at(i, j)
        +}
        +
        +func (m *CDense) at(i, j int) complex128 {
        +	return m.mat.Data[i*m.mat.Stride+j]
        +}
        +
        +// Set sets the element at row i, column j to the value v.
        +func (m *CDense) Set(i, j int, v complex128) {
        +	if uint(i) >= uint(m.mat.Rows) {
        +		panic(ErrRowAccess)
        +	}
        +	if uint(j) >= uint(m.mat.Cols) {
        +		panic(ErrColAccess)
        +	}
        +	m.set(i, j, v)
        +}
        +
        +func (m *CDense) set(i, j int, v complex128) {
        +	m.mat.Data[i*m.mat.Stride+j] = v
        +}
        +
         // At returns the element at row i.
         // It panics if i is out of bounds or if j is not zero.
         func (v *VecDense) At(i, j int) float64 {
        -	if uint(i) >= uint(v.n) {
        +	if uint(i) >= uint(v.mat.N) {
         		panic(ErrRowAccess)
         	}
         	if j != 0 {
        @@ -53,7 +83,7 @@ func (v *VecDense) At(i, j int) float64 {
         // AtVec returns the element at row i.
         // It panics if i is out of bounds.
         func (v *VecDense) AtVec(i int) float64 {
        -	if uint(i) >= uint(v.n) {
        +	if uint(i) >= uint(v.mat.N) {
         		panic(ErrRowAccess)
         	}
         	return v.at(i)
        @@ -66,7 +96,7 @@ func (v *VecDense) at(i int) float64 {
         // SetVec sets the element at row i to the value val.
         // It panics if i is out of bounds.
         func (v *VecDense) SetVec(i int, val float64) {
        -	if uint(i) >= uint(v.n) {
        +	if uint(i) >= uint(v.mat.N) {
         		panic(ErrVectorAccess)
         	}
         	v.setVec(i, val)
        @@ -236,12 +266,73 @@ func (s *SymBandDense) set(i, j int, v float64) {
         	s.mat.Data[i*s.mat.Stride+pj] = v
         }
         
        +func (t *TriBandDense) At(i, j int) float64 {
        +	if uint(i) >= uint(t.mat.N) {
        +		panic(ErrRowAccess)
        +	}
        +	if uint(j) >= uint(t.mat.N) {
        +		panic(ErrColAccess)
        +	}
        +	return t.at(i, j)
        +}
        +
        +func (t *TriBandDense) at(i, j int) float64 {
        +	// TODO(btracey): Support Diag field, see #692.
        +	isUpper := t.isUpper()
        +	if (isUpper && i > j) || (!isUpper && i < j) {
        +		return 0
        +	}
        +	kl := t.mat.K
        +	ku := 0
        +	if isUpper {
        +		ku = t.mat.K
        +		kl = 0
        +	}
        +	pj := j + kl - i
        +	if pj < 0 || kl+ku+1 <= pj {
        +		return 0
        +	}
        +	return t.mat.Data[i*t.mat.Stride+pj]
        +}
        +
        +func (t *TriBandDense) SetTriBand(i, j int, v float64) {
        +	if uint(i) >= uint(t.mat.N) {
        +		panic(ErrRowAccess)
        +	}
        +	if uint(j) >= uint(t.mat.N) {
        +		panic(ErrColAccess)
        +	}
        +	isUpper := t.isUpper()
        +	if (isUpper && i > j) || (!isUpper && i < j) {
        +		panic(ErrTriangleSet)
        +	}
        +	kl, ku := t.mat.K, 0
        +	if isUpper {
        +		kl, ku = 0, t.mat.K
        +	}
        +	pj := j + kl - i
        +	if pj < 0 || kl+ku+1 <= pj {
        +		panic(ErrBandSet)
        +	}
        +	// TODO(btracey): Support Diag field, see #692.
        +	t.mat.Data[i*t.mat.Stride+pj] = v
        +}
        +
        +func (t *TriBandDense) setTriBand(i, j int, v float64) {
        +	var kl int
        +	if !t.isUpper() {
        +		kl = t.mat.K
        +	}
        +	pj := j + kl - i
        +	t.mat.Data[i*t.mat.Stride+pj] = v
        +}
        +
         // At returns the element at row i, column j.
         func (d *DiagDense) At(i, j int) float64 {
        -	if uint(i) >= uint(len(d.data)) {
        +	if uint(i) >= uint(d.mat.N) {
         		panic(ErrRowAccess)
         	}
        -	if uint(j) >= uint(len(d.data)) {
        +	if uint(j) >= uint(d.mat.N) {
         		panic(ErrColAccess)
         	}
         	return d.at(i, j)
        @@ -251,18 +342,18 @@ func (d *DiagDense) at(i, j int) float64 {
         	if i != j {
         		return 0
         	}
        -	return d.data[i]
        +	return d.mat.Data[i*d.mat.Inc]
         }
         
         // SetDiag sets the element at row i, column i to the value v.
         // It panics if the location is outside the appropriate region of the matrix.
         func (d *DiagDense) SetDiag(i int, v float64) {
        -	if uint(i) >= uint(len(d.data)) {
        +	if uint(i) >= uint(d.mat.N) {
         		panic(ErrRowAccess)
         	}
         	d.setDiag(i, v)
         }
         
         func (d *DiagDense) setDiag(i int, v float64) {
        -	d.data[i] = v
        +	d.mat.Data[i*d.mat.Inc] = v
         }
        diff --git a/vendor/gonum.org/v1/gonum/mat/inner.go b/vendor/gonum.org/v1/gonum/mat/inner.go
        index fba3e0b04..7607cf9aa 100644
        --- a/vendor/gonum.org/v1/gonum/mat/inner.go
        +++ b/vendor/gonum.org/v1/gonum/mat/inner.go
        @@ -11,9 +11,12 @@ import (
         )
         
         // Inner computes the generalized inner product
        -//   x^T A y
        -// between column vectors x and y with matrix A. This is only a true inner product if
        -// A is symmetric positive definite, though the operation works for any matrix A.
        +//  xᵀ A y
        +// between the vectors x and y with matrix A, where x and y are treated as
        +// column vectors.
        +//
        +// This is only a true inner product if A is symmetric positive definite, though
        +// the operation works for any matrix A.
         //
         // Inner panics if x.Len != m or y.Len != n when A is an m x n matrix.
         func Inner(x Vector, a Matrix, y Vector) float64 {
        diff --git a/vendor/gonum.org/v1/gonum/mat/io.go b/vendor/gonum.org/v1/gonum/mat/io.go
        index 1111e4a4a..7e9b72aec 100644
        --- a/vendor/gonum.org/v1/gonum/mat/io.go
        +++ b/vendor/gonum.org/v1/gonum/mat/io.go
        @@ -21,7 +21,6 @@ const maxLen = int64(int(^uint(0) >> 1))
         
         var (
         	headerSize  = binary.Size(storage{})
        -	sizeInt64   = binary.Size(int64(0))
         	sizeFloat64 = binary.Size(float64(0))
         
         	errWrongType = errors.New("mat: wrong data type")
        @@ -128,7 +127,7 @@ func (m Dense) MarshalBinaryTo(w io.Writer) (int, error) {
         }
         
         // UnmarshalBinary decodes the binary form into the receiver.
        -// It panics if the receiver is a non-zero Dense matrix.
        +// It panics if the receiver is a non-empty Dense matrix.
         //
         // See MarshalBinary for the on-disk layout.
         //
        @@ -140,8 +139,8 @@ func (m Dense) MarshalBinaryTo(w io.Writer) (int, error) {
         // UnmarshalBinary does not limit the size of the unmarshaled matrix, and so
         // it should not be used on untrusted data.
         func (m *Dense) UnmarshalBinary(data []byte) error {
        -	if !m.IsZero() {
        -		panic("mat: unmarshal into non-zero matrix")
        +	if !m.IsEmpty() {
        +		panic("mat: unmarshal into non-empty matrix")
         	}
         
         	if len(data) < headerSize {
        @@ -176,7 +175,7 @@ func (m *Dense) UnmarshalBinary(data []byte) error {
         	}
         
         	p := headerSize
        -	m.reuseAs(int(rows), int(cols))
        +	m.reuseAsNonZeroed(int(rows), int(cols))
         	for i := range m.mat.Data {
         		m.mat.Data[i] = math.Float64frombits(binary.LittleEndian.Uint64(data[p : p+sizeFloat64]))
         		p += sizeFloat64
        @@ -187,7 +186,7 @@ func (m *Dense) UnmarshalBinary(data []byte) error {
         
         // UnmarshalBinaryFrom decodes the binary form into the receiver and returns
         // the number of bytes read and an error if any.
        -// It panics if the receiver is a non-zero Dense matrix.
        +// It panics if the receiver is a non-empty Dense matrix.
         //
         // See MarshalBinary for the on-disk layout.
         //
        @@ -199,8 +198,8 @@ func (m *Dense) UnmarshalBinary(data []byte) error {
         // UnmarshalBinary does not limit the size of the unmarshaled matrix, and so
         // it should not be used on untrusted data.
         func (m *Dense) UnmarshalBinaryFrom(r io.Reader) (int, error) {
        -	if !m.IsZero() {
        -		panic("mat: unmarshal into non-zero matrix")
        +	if !m.IsEmpty() {
        +		panic("mat: unmarshal into non-empty matrix")
         	}
         
         	var header storage
        @@ -227,7 +226,7 @@ func (m *Dense) UnmarshalBinaryFrom(r io.Reader) (int, error) {
         		return n, errTooBig
         	}
         
        -	m.reuseAs(int(rows), int(cols))
        +	m.reuseAsNonZeroed(int(rows), int(cols))
         	var b [8]byte
         	for i := range m.mat.Data {
         		nn, err := readFull(r, b[:])
        @@ -259,7 +258,7 @@ func (m *Dense) UnmarshalBinaryFrom(r io.Reader) (int, error) {
         //  32 - 39  0                      (int64)
         //  40 - ..  vector's data elements (float64)
         func (v VecDense) MarshalBinary() ([]byte, error) {
        -	bufLen := int64(headerSize) + int64(v.n)*int64(sizeFloat64)
        +	bufLen := int64(headerSize) + int64(v.mat.N)*int64(sizeFloat64)
         	if bufLen <= 0 {
         		// bufLen is too big and has wrapped around.
         		return nil, errTooBig
        @@ -267,7 +266,7 @@ func (v VecDense) MarshalBinary() ([]byte, error) {
         
         	header := storage{
         		Form: 'G', Packing: 'F', Uplo: 'A',
        -		Rows: int64(v.n), Cols: 1,
        +		Rows: int64(v.mat.N), Cols: 1,
         		Version: version,
         	}
         	buf := make([]byte, bufLen)
        @@ -277,7 +276,7 @@ func (v VecDense) MarshalBinary() ([]byte, error) {
         	}
         
         	p := headerSize
        -	for i := 0; i < v.n; i++ {
        +	for i := 0; i < v.mat.N; i++ {
         		binary.LittleEndian.PutUint64(buf[p:p+sizeFloat64], math.Float64bits(v.at(i)))
         		p += sizeFloat64
         	}
        @@ -292,7 +291,7 @@ func (v VecDense) MarshalBinary() ([]byte, error) {
         func (v VecDense) MarshalBinaryTo(w io.Writer) (int, error) {
         	header := storage{
         		Form: 'G', Packing: 'F', Uplo: 'A',
        -		Rows: int64(v.n), Cols: 1,
        +		Rows: int64(v.mat.N), Cols: 1,
         		Version: version,
         	}
         	n, err := header.marshalBinaryTo(w)
        @@ -301,7 +300,7 @@ func (v VecDense) MarshalBinaryTo(w io.Writer) (int, error) {
         	}
         
         	var buf [8]byte
        -	for i := 0; i < v.n; i++ {
        +	for i := 0; i < v.mat.N; i++ {
         		binary.LittleEndian.PutUint64(buf[:], math.Float64bits(v.at(i)))
         		nn, err := w.Write(buf[:])
         		n += nn
        @@ -314,7 +313,7 @@ func (v VecDense) MarshalBinaryTo(w io.Writer) (int, error) {
         }
         
         // UnmarshalBinary decodes the binary form into the receiver.
        -// It panics if the receiver is a non-zero VecDense.
        +// It panics if the receiver is a non-empty VecDense.
         //
         // See MarshalBinary for the on-disk layout.
         //
        @@ -326,8 +325,8 @@ func (v VecDense) MarshalBinaryTo(w io.Writer) (int, error) {
         // UnmarshalBinary does not limit the size of the unmarshaled vector, and so
         // it should not be used on untrusted data.
         func (v *VecDense) UnmarshalBinary(data []byte) error {
        -	if !v.IsZero() {
        -		panic("mat: unmarshal into non-zero vector")
        +	if !v.IsEmpty() {
        +		panic("mat: unmarshal into non-empty vector")
         	}
         
         	if len(data) < headerSize {
        @@ -363,7 +362,7 @@ func (v *VecDense) UnmarshalBinary(data []byte) error {
         	}
         
         	p := headerSize
        -	v.reuseAs(int(n))
        +	v.reuseAsNonZeroed(int(n))
         	for i := range v.mat.Data {
         		v.mat.Data[i] = math.Float64frombits(binary.LittleEndian.Uint64(data[p : p+sizeFloat64]))
         		p += sizeFloat64
        @@ -374,13 +373,13 @@ func (v *VecDense) UnmarshalBinary(data []byte) error {
         
         // UnmarshalBinaryFrom decodes the binary form into the receiver, from the
         // io.Reader and returns the number of bytes read and an error if any.
        -// It panics if the receiver is a non-zero VecDense.
        +// It panics if the receiver is a non-empty VecDense.
         //
         // See MarshalBinary for the on-disk layout.
         // See UnmarshalBinary for the list of sanity checks performed on the input.
         func (v *VecDense) UnmarshalBinaryFrom(r io.Reader) (int, error) {
        -	if !v.IsZero() {
        -		panic("mat: unmarshal into non-zero vector")
        +	if !v.IsEmpty() {
        +		panic("mat: unmarshal into non-empty vector")
         	}
         
         	var header storage
        @@ -408,7 +407,7 @@ func (v *VecDense) UnmarshalBinaryFrom(r io.Reader) (int, error) {
         		return n, errTooBig
         	}
         
        -	v.reuseAs(int(l))
        +	v.reuseAsNonZeroed(int(l))
         	var b [8]byte
         	for i := range v.mat.Data {
         		nn, err := readFull(r, b[:])
        diff --git a/vendor/gonum.org/v1/gonum/mat/lq.go b/vendor/gonum.org/v1/gonum/mat/lq.go
        index 741a16922..dfff65d03 100644
        --- a/vendor/gonum.org/v1/gonum/mat/lq.go
        +++ b/vendor/gonum.org/v1/gonum/mat/lq.go
        @@ -13,6 +13,8 @@ import (
         	"gonum.org/v1/gonum/lapack/lapack64"
         )
         
        +const badLQ = "mat: invalid LQ factorization"
        +
         // LQ is a type for creating and using the LQ factorization of a matrix.
         type LQ struct {
         	lq   *Dense
        @@ -22,9 +24,9 @@ type LQ struct {
         
         func (lq *LQ) updateCond(norm lapack.MatrixNorm) {
         	// Since A = L*Q, and Q is orthogonal, we get for the condition number κ
        -	//  κ(A) := |A| |A^-1| = |L*Q| |(L*Q)^-1| = |L| |Q^T * L^-1|
        +	//  κ(A) := |A| |A^-1| = |L*Q| |(L*Q)^-1| = |L| |Qᵀ * L^-1|
         	//        = |L| |L^-1| = κ(L),
        -	// where we used that fact that Q^-1 = Q^T. However, this assumes that
        +	// where we used that fact that Q^-1 = Qᵀ. However, this assumes that
         	// the matrix norm is invariant under orthogonal transformations which
         	// is not the case for CondNorm. Hopefully the error is negligible: κ
         	// is only a qualitative measure anyway.
        @@ -38,12 +40,12 @@ func (lq *LQ) updateCond(norm lapack.MatrixNorm) {
         	putInts(iwork)
         }
         
        -// Factorize computes the LQ factorization of an m×n matrix a where n <= m. The LQ
        +// Factorize computes the LQ factorization of an m×n matrix a where m <= n. The LQ
         // factorization always exists even if A is singular.
         //
         // The LQ decomposition is a factorization of the matrix A such that A = L * Q.
        -// The matrix Q is an orthonormal n×n matrix, and L is an m×n upper triangular matrix.
        -// L and Q can be extracted from the LTo and QTo methods.
        +// The matrix Q is an orthonormal n×n matrix, and L is an m×n lower triangular matrix.
        +// L and Q can be extracted using the LTo and QTo methods.
         func (lq *LQ) Factorize(a Matrix) {
         	lq.factorize(a, CondNorm)
         }
        @@ -57,7 +59,7 @@ func (lq *LQ) factorize(a Matrix, norm lapack.MatrixNorm) {
         	if lq.lq == nil {
         		lq.lq = &Dense{}
         	}
        -	lq.lq.Clone(a)
        +	lq.lq.CloneFrom(a)
         	work := []float64{0}
         	lq.tau = make([]float64, k)
         	lapack64.Gelqf(lq.lq.mat, lq.tau, work, -1)
        @@ -67,11 +69,16 @@ func (lq *LQ) factorize(a Matrix, norm lapack.MatrixNorm) {
         	lq.updateCond(norm)
         }
         
        +// isValid returns whether the receiver contains a factorization.
        +func (lq *LQ) isValid() bool {
        +	return lq.lq != nil && !lq.lq.IsEmpty()
        +}
        +
         // Cond returns the condition number for the factorized matrix.
        -// Cond will panic if the receiver does not contain a successful factorization.
        +// Cond will panic if the receiver does not contain a factorization.
         func (lq *LQ) Cond() float64 {
        -	if lq.lq == nil || lq.lq.IsZero() {
        -		panic("lq: no decomposition computed")
        +	if !lq.isValid() {
        +		panic(badLQ)
         	}
         	return lq.cond
         }
        @@ -80,13 +87,23 @@ func (lq *LQ) Cond() float64 {
         // and upper triangular matrices.
         
         // LTo extracts the m×n lower trapezoidal matrix from a LQ decomposition.
        -// If dst is nil, a new matrix is allocated. The resulting L matrix is returned.
        -func (lq *LQ) LTo(dst *Dense) *Dense {
        +//
        +// If dst is empty, LTo will resize dst to be r×c. When dst is
        +// non-empty, LTo will panic if dst is not r×c. LTo will also panic
        +// if the receiver does not contain a successful factorization.
        +func (lq *LQ) LTo(dst *Dense) {
        +	if !lq.isValid() {
        +		panic(badLQ)
        +	}
        +
         	r, c := lq.lq.Dims()
        -	if dst == nil {
        -		dst = NewDense(r, c, nil)
        +	if dst.IsEmpty() {
        +		dst.ReuseAs(r, c)
         	} else {
        -		dst.reuseAs(r, c)
        +		r2, c2 := dst.Dims()
        +		if r != r2 || c != c2 {
        +			panic(ErrShape)
        +		}
         	}
         
         	// Disguise the LQ as a lower triangular.
        @@ -103,24 +120,33 @@ func (lq *LQ) LTo(dst *Dense) *Dense {
         	dst.Copy(t)
         
         	if r == c {
        -		return dst
        +		return
         	}
         	// Zero right of the triangular.
         	for i := 0; i < r; i++ {
         		zero(dst.mat.Data[i*dst.mat.Stride+r : i*dst.mat.Stride+c])
         	}
        -
        -	return dst
         }
         
         // QTo extracts the n×n orthonormal matrix Q from an LQ decomposition.
        -// If dst is nil, a new matrix is allocated. The resulting Q matrix is returned.
        -func (lq *LQ) QTo(dst *Dense) *Dense {
        +//
        +// If dst is empty, QTo will resize dst to be c×c. When dst is
        +// non-empty, QTo will panic if dst is not c×c. QTo will also panic
        +// if the receiver does not contain a successful factorization.
        +func (lq *LQ) QTo(dst *Dense) {
        +	if !lq.isValid() {
        +		panic(badLQ)
        +	}
        +
         	_, c := lq.lq.Dims()
        -	if dst == nil {
        -		dst = NewDense(c, c, nil)
        +	if dst.IsEmpty() {
        +		dst.ReuseAs(c, c)
         	} else {
        -		dst.reuseAsZeroed(c, c)
        +		r2, c2 := dst.Dims()
        +		if c != r2 || c != c2 {
        +			panic(ErrShape)
        +		}
        +		dst.Zero()
         	}
         	q := dst.mat
         
        @@ -136,11 +162,9 @@ func (lq *LQ) QTo(dst *Dense) *Dense {
         	work = getFloats(int(work[0]), false)
         	lapack64.Ormlq(blas.Left, blas.NoTrans, lq.lq.mat, lq.tau, q, work, len(work))
         	putFloats(work)
        -
        -	return dst
         }
         
        -// Solve finds a minimum-norm solution to a system of linear equations defined
        +// SolveTo finds a minimum-norm solution to a system of linear equations defined
         // by the matrices A and b, where A is an m×n matrix represented in its LQ factorized
         // form. If A is singular or near-singular a Condition error is returned.
         // See the documentation for Condition for more information.
        @@ -148,8 +172,13 @@ func (lq *LQ) QTo(dst *Dense) *Dense {
         // The minimization problem solved depends on the input parameters.
         //  If trans == false, find the minimum norm solution of A * X = B.
         //  If trans == true, find X such that ||A*X - B||_2 is minimized.
        -// The solution matrix, X, is stored in place into x.
        -func (lq *LQ) Solve(x *Dense, trans bool, b Matrix) error {
        +// The solution matrix, X, is stored in place into dst.
        +// SolveTo will panic if the receiver does not contain a factorization.
        +func (lq *LQ) SolveTo(dst *Dense, trans bool, b Matrix) error {
        +	if !lq.isValid() {
        +		panic(badLQ)
        +	}
        +
         	r, c := lq.lq.Dims()
         	br, bc := b.Dims()
         
        @@ -161,12 +190,12 @@ func (lq *LQ) Solve(x *Dense, trans bool, b Matrix) error {
         		if c != br {
         			panic(ErrShape)
         		}
        -		x.reuseAs(r, bc)
        +		dst.reuseAsNonZeroed(r, bc)
         	} else {
         		if r != br {
         			panic(ErrShape)
         		}
        -		x.reuseAs(c, bc)
        +		dst.reuseAsNonZeroed(c, bc)
         	}
         	// Do not need to worry about overlap between x and b because w has its own
         	// independent storage.
        @@ -199,7 +228,7 @@ func (lq *LQ) Solve(x *Dense, trans bool, b Matrix) error {
         		putFloats(work)
         	}
         	// x was set above to be the correct size for the result.
        -	x.Copy(w)
        +	dst.Copy(w)
         	putWorkspace(w)
         	if lq.cond > ConditionTolerance {
         		return Condition(lq.cond)
        @@ -207,9 +236,14 @@ func (lq *LQ) Solve(x *Dense, trans bool, b Matrix) error {
         	return nil
         }
         
        -// SolveVec finds a minimum-norm solution to a system of linear equations.
        -// See LQ.Solve for the full documentation.
        -func (lq *LQ) SolveVec(x *VecDense, trans bool, b Vector) error {
        +// SolveVecTo finds a minimum-norm solution to a system of linear equations.
        +// See LQ.SolveTo for the full documentation.
        +// SolveToVec will panic if the receiver does not contain a factorization.
        +func (lq *LQ) SolveVecTo(dst *VecDense, trans bool, b Vector) error {
        +	if !lq.isValid() {
        +		panic(badLQ)
        +	}
        +
         	r, c := lq.lq.Dims()
         	if _, bc := b.Dims(); bc != 1 {
         		panic(ErrShape)
        @@ -220,16 +254,16 @@ func (lq *LQ) SolveVec(x *VecDense, trans bool, b Vector) error {
         	bm := Matrix(b)
         	if rv, ok := b.(RawVectorer); ok {
         		bmat := rv.RawVector()
        -		if x != b {
        -			x.checkOverlap(bmat)
        +		if dst != b {
        +			dst.checkOverlap(bmat)
         		}
        -		b := VecDense{mat: bmat, n: b.Len()}
        +		b := VecDense{mat: bmat}
         		bm = b.asDense()
         	}
         	if trans {
        -		x.reuseAs(r)
        +		dst.reuseAsNonZeroed(r)
         	} else {
        -		x.reuseAs(c)
        +		dst.reuseAsNonZeroed(c)
         	}
        -	return lq.Solve(x.asDense(), trans, bm)
        +	return lq.SolveTo(dst.asDense(), trans, bm)
         }
        diff --git a/vendor/gonum.org/v1/gonum/mat/lu.go b/vendor/gonum.org/v1/gonum/mat/lu.go
        index 055ae6cb4..073a4523e 100644
        --- a/vendor/gonum.org/v1/gonum/mat/lu.go
        +++ b/vendor/gonum.org/v1/gonum/mat/lu.go
        @@ -14,7 +14,10 @@ import (
         	"gonum.org/v1/gonum/lapack/lapack64"
         )
         
        -const badSliceLength = "mat: improper slice length"
        +const (
        +	badSliceLength = "mat: improper slice length"
        +	badLU          = "mat: invalid LU factorization"
        +)
         
         // LU is a type for creating and using the LU factorization of a matrix.
         type LU struct {
        @@ -55,7 +58,7 @@ func (lu *LU) updateCond(anorm float64, norm lapack.MatrixNorm) {
         // The LU factorization is computed with pivoting, and so really the decomposition
         // is a PLU decomposition where P is a permutation matrix. The individual matrix
         // factors can be extracted from the factorization using the Permutation method
        -// on Dense, and the LU LTo and UTo methods.
        +// on Dense, and the LU.LTo and LU.UTo methods.
         func (lu *LU) Factorize(a Matrix) {
         	lu.factorize(a, CondNorm)
         }
        @@ -69,7 +72,7 @@ func (lu *LU) factorize(a Matrix, norm lapack.MatrixNorm) {
         		lu.lu = NewDense(r, r, nil)
         	} else {
         		lu.lu.Reset()
        -		lu.lu.reuseAs(r, r)
        +		lu.lu.reuseAsNonZeroed(r, r)
         	}
         	lu.lu.Copy(a)
         	if cap(lu.pivot) < r {
        @@ -83,11 +86,16 @@ func (lu *LU) factorize(a Matrix, norm lapack.MatrixNorm) {
         	lu.updateCond(anorm, norm)
         }
         
        +// isValid returns whether the receiver contains a factorization.
        +func (lu *LU) isValid() bool {
        +	return lu.lu != nil && !lu.lu.IsEmpty()
        +}
        +
         // Cond returns the condition number for the factorized matrix.
        -// Cond will panic if the receiver does not contain a successful factorization.
        +// Cond will panic if the receiver does not contain a factorization.
         func (lu *LU) Cond() float64 {
        -	if lu.lu == nil || lu.lu.IsZero() {
        -		panic("lu: no decomposition computed")
        +	if !lu.isValid() {
        +		panic(badLU)
         	}
         	return lu.cond
         }
        @@ -107,6 +115,7 @@ func (lu *LU) isZero() bool {
         
         // Det returns the determinant of the matrix that has been factorized. In many
         // expressions, using LogDet will be more numerically stable.
        +// Det will panic if the receiver does not contain a factorization.
         func (lu *LU) Det() float64 {
         	det, sign := lu.LogDet()
         	return math.Exp(det) * sign
        @@ -115,7 +124,12 @@ func (lu *LU) Det() float64 {
         // LogDet returns the log of the determinant and the sign of the determinant
         // for the matrix that has been factorized. Numerical stability in product and
         // division expressions is generally improved by working in log space.
        +// LogDet will panic if the receiver does not contain a factorization.
         func (lu *LU) LogDet() (det float64, sign float64) {
        +	if !lu.isValid() {
        +		panic(badLU)
        +	}
        +
         	_, n := lu.lu.Dims()
         	logDiag := getFloats(n, false)
         	defer putFloats(logDiag)
        @@ -137,7 +151,12 @@ func (lu *LU) LogDet() (det float64, sign float64) {
         // matrix P (see Dense.Permutation). If swaps == nil, then new memory will be
         // allocated, otherwise the length of the input must be equal to the size of the
         // factorized matrix.
        +// Pivot will panic if the receiver does not contain a factorization.
         func (lu *LU) Pivot(swaps []int) []int {
        +	if !lu.isValid() {
        +		panic(badLU)
        +	}
        +
         	_, n := lu.lu.Dims()
         	if swaps == nil {
         		swaps = make([]int, n)
        @@ -160,8 +179,13 @@ func (lu *LU) Pivot(swaps []int) []int {
         // RankOne updates an LU factorization as if a rank-one update had been applied to
         // the original matrix A, storing the result into the receiver. That is, if in
         // the original LU decomposition P * L * U = A, in the updated decomposition
        -// P * L * U = A + alpha * x * y^T.
        +// P * L * U = A + alpha * x * yᵀ.
        +// RankOne will panic if orig does not contain a factorization.
         func (lu *LU) RankOne(orig *LU, alpha float64, x, y Vector) {
        +	if !orig.isValid() {
        +		panic(badLU)
        +	}
        +
         	// RankOne uses algorithm a1 on page 28 of "Multiple-Rank Updates to Matrix
         	// Factorizations for Nonlinear Analysis and Circuit Design" by Linzhong Deng.
         	// http://web.stanford.edu/group/SOL/dissertations/Linzhong-Deng-thesis.pdf
        @@ -181,7 +205,7 @@ func (lu *LU) RankOne(orig *LU, alpha float64, x, y Vector) {
         			if lu.lu == nil {
         				lu.lu = NewDense(n, n, nil)
         			} else {
        -				lu.lu.reuseAs(n, n)
        +				lu.lu.reuseAsNonZeroed(n, n)
         			}
         		} else if len(lu.pivot) != n {
         			panic(ErrShape)
        @@ -226,13 +250,27 @@ func (lu *LU) RankOne(orig *LU, alpha float64, x, y Vector) {
         }
         
         // LTo extracts the lower triangular matrix from an LU factorization.
        -// If dst is nil, a new matrix is allocated. The resulting L matrix is returned.
        +//
        +// If dst is empty, LTo will resize dst to be a lower-triangular n×n matrix.
        +// When dst is non-empty, LTo will panic if dst is not n×n or not Lower.
        +// LTo will also panic if the receiver does not contain a successful
        +// factorization.
         func (lu *LU) LTo(dst *TriDense) *TriDense {
        +	if !lu.isValid() {
        +		panic(badLU)
        +	}
        +
         	_, n := lu.lu.Dims()
        -	if dst == nil {
        -		dst = NewTriDense(n, Lower, nil)
        +	if dst.IsEmpty() {
        +		dst.ReuseAsTri(n, Lower)
         	} else {
        -		dst.reuseAs(n, Lower)
        +		n2, kind := dst.Triangle()
        +		if n != n2 {
        +			panic(ErrShape)
        +		}
        +		if kind != Lower {
        +			panic(ErrTriangle)
        +		}
         	}
         	// Extract the lower triangular elements.
         	for i := 0; i < n; i++ {
        @@ -248,13 +286,27 @@ func (lu *LU) LTo(dst *TriDense) *TriDense {
         }
         
         // UTo extracts the upper triangular matrix from an LU factorization.
        -// If dst is nil, a new matrix is allocated. The resulting U matrix is returned.
        -func (lu *LU) UTo(dst *TriDense) *TriDense {
        +//
        +// If dst is empty, UTo will resize dst to be an upper-triangular n×n matrix.
        +// When dst is non-empty, UTo will panic if dst is not n×n or not Upper.
        +// UTo will also panic if the receiver does not contain a successful
        +// factorization.
        +func (lu *LU) UTo(dst *TriDense) {
        +	if !lu.isValid() {
        +		panic(badLU)
        +	}
        +
         	_, n := lu.lu.Dims()
        -	if dst == nil {
        -		dst = NewTriDense(n, Upper, nil)
        +	if dst.IsEmpty() {
        +		dst.ReuseAsTri(n, Upper)
         	} else {
        -		dst.reuseAs(n, Upper)
        +		n2, kind := dst.Triangle()
        +		if n != n2 {
        +			panic(ErrShape)
        +		}
        +		if kind != Upper {
        +			panic(ErrTriangle)
        +		}
         	}
         	// Extract the upper triangular elements.
         	for i := 0; i < n; i++ {
        @@ -262,7 +314,6 @@ func (lu *LU) UTo(dst *TriDense) *TriDense {
         			dst.mat.Data[i*dst.mat.Stride+j] = lu.lu.mat.Data[i*lu.lu.mat.Stride+j]
         		}
         	}
        -	return dst
         }
         
         // Permutation constructs an r×r permutation matrix with the given row swaps.
        @@ -270,7 +321,7 @@ func (lu *LU) UTo(dst *TriDense) *TriDense {
         // and all other elements equal to zero. swaps[i] specifies the row with which
         // i will be swapped, which is equivalent to the non-zero column of row i.
         func (m *Dense) Permutation(r int, swaps []int) {
        -	m.reuseAs(r, r)
        +	m.reuseAsNonZeroed(r, r)
         	for i := 0; i < r; i++ {
         		zero(m.mat.Data[i*m.mat.Stride : i*m.mat.Stride+r])
         		v := swaps[i]
        @@ -281,16 +332,21 @@ func (m *Dense) Permutation(r int, swaps []int) {
         	}
         }
         
        -// Solve solves a system of linear equations using the LU decomposition of a matrix.
        +// SolveTo solves a system of linear equations using the LU decomposition of a matrix.
         // It computes
         //  A * X = B if trans == false
        -//  A^T * X = B if trans == true
        +//  Aᵀ * X = B if trans == true
         // In both cases, A is represented in LU factorized form, and the matrix X is
        -// stored into x.
        +// stored into dst.
         //
         // If A is singular or near-singular a Condition error is returned. See
         // the documentation for Condition for more information.
        -func (lu *LU) Solve(x *Dense, trans bool, b Matrix) error {
        +// SolveTo will panic if the receiver does not contain a factorization.
        +func (lu *LU) SolveTo(dst *Dense, trans bool, b Matrix) error {
        +	if !lu.isValid() {
        +		panic(badLU)
        +	}
        +
         	_, n := lu.lu.Dims()
         	br, bc := b.Dims()
         	if br != n {
        @@ -302,49 +358,54 @@ func (lu *LU) Solve(x *Dense, trans bool, b Matrix) error {
         		return Condition(math.Inf(1))
         	}
         
        -	x.reuseAs(n, bc)
        +	dst.reuseAsNonZeroed(n, bc)
         	bU, _ := untranspose(b)
         	var restore func()
        -	if x == bU {
        -		x, restore = x.isolatedWorkspace(bU)
        +	if dst == bU {
        +		dst, restore = dst.isolatedWorkspace(bU)
         		defer restore()
         	} else if rm, ok := bU.(RawMatrixer); ok {
        -		x.checkOverlap(rm.RawMatrix())
        +		dst.checkOverlap(rm.RawMatrix())
         	}
         
        -	x.Copy(b)
        +	dst.Copy(b)
         	t := blas.NoTrans
         	if trans {
         		t = blas.Trans
         	}
        -	lapack64.Getrs(t, lu.lu.mat, x.mat, lu.pivot)
        +	lapack64.Getrs(t, lu.lu.mat, dst.mat, lu.pivot)
         	if lu.cond > ConditionTolerance {
         		return Condition(lu.cond)
         	}
         	return nil
         }
         
        -// SolveVec solves a system of linear equations using the LU decomposition of a matrix.
        +// SolveVecTo solves a system of linear equations using the LU decomposition of a matrix.
         // It computes
         //  A * x = b if trans == false
        -//  A^T * x = b if trans == true
        +//  Aᵀ * x = b if trans == true
         // In both cases, A is represented in LU factorized form, and the vector x is
        -// stored into x.
        +// stored into dst.
         //
         // If A is singular or near-singular a Condition error is returned. See
         // the documentation for Condition for more information.
        -func (lu *LU) SolveVec(x *VecDense, trans bool, b Vector) error {
        +// SolveVecTo will panic if the receiver does not contain a factorization.
        +func (lu *LU) SolveVecTo(dst *VecDense, trans bool, b Vector) error {
        +	if !lu.isValid() {
        +		panic(badLU)
        +	}
        +
         	_, n := lu.lu.Dims()
         	if br, bc := b.Dims(); br != n || bc != 1 {
         		panic(ErrShape)
         	}
         	switch rv := b.(type) {
         	default:
        -		x.reuseAs(n)
        -		return lu.Solve(x.asDense(), trans, b)
        +		dst.reuseAsNonZeroed(n)
        +		return lu.SolveTo(dst.asDense(), trans, b)
         	case RawVectorer:
        -		if x != b {
        -			x.checkOverlap(rv.RawVector())
        +		if dst != b {
        +			dst.checkOverlap(rv.RawVector())
         		}
         		// TODO(btracey): Should test the condition number instead of testing that
         		// the determinant is exactly zero.
        @@ -352,18 +413,18 @@ func (lu *LU) SolveVec(x *VecDense, trans bool, b Vector) error {
         			return Condition(math.Inf(1))
         		}
         
        -		x.reuseAs(n)
        +		dst.reuseAsNonZeroed(n)
         		var restore func()
        -		if x == b {
        -			x, restore = x.isolatedWorkspace(b)
        +		if dst == b {
        +			dst, restore = dst.isolatedWorkspace(b)
         			defer restore()
         		}
        -		x.CopyVec(b)
        +		dst.CopyVec(b)
         		vMat := blas64.General{
         			Rows:   n,
         			Cols:   1,
        -			Stride: x.mat.Inc,
        -			Data:   x.mat.Data,
        +			Stride: dst.mat.Inc,
        +			Data:   dst.mat.Data,
         		}
         		t := blas.NoTrans
         		if trans {
        diff --git a/vendor/gonum.org/v1/gonum/mat/matrix.go b/vendor/gonum.org/v1/gonum/mat/matrix.go
        index 36015e0e1..efcf7da00 100644
        --- a/vendor/gonum.org/v1/gonum/mat/matrix.go
        +++ b/vendor/gonum.org/v1/gonum/mat/matrix.go
        @@ -30,6 +30,23 @@ type Matrix interface {
         	T() Matrix
         }
         
        +// allMatrix represents the extra set of methods that all mat Matrix types
        +// should satisfy. This is used to enforce compile-time consistency between the
        +// Dense types, especially helpful when adding new features.
        +type allMatrix interface {
        +	Reseter
        +	IsEmpty() bool
        +	Zero()
        +}
        +
        +// denseMatrix represents the extra set of methods that all Dense Matrix types
        +// should satisfy. This is used to enforce compile-time consistency between the
        +// Dense types, especially helpful when adding new features.
        +type denseMatrix interface {
        +	DiagView() Diagonal
        +	Tracer
        +}
        +
         var (
         	_ Matrix       = Transpose{}
         	_ Untransposer = Transpose{}
        @@ -89,6 +106,13 @@ type UntransposeTrier interface {
         	UntransposeTri() Triangular
         }
         
        +// UntransposeTriBander is a type that can undo an implicit triangular banded
        +// transpose.
        +type UntransposeTriBander interface {
        +	// Untranspose returns the underlying Triangular stored for the implicit transpose.
        +	UntransposeTriBand() TriBanded
        +}
        +
         // Mutable is a matrix interface type that allows elements to be altered.
         type Mutable interface {
         	// Set alters the matrix element at row i, column j to v.
        @@ -122,19 +146,20 @@ type RawColViewer interface {
         	RawColView(j int) []float64
         }
         
        -// A Cloner can make a copy of a into the receiver, overwriting the previous value of the
        +// A ClonerFrom can make a copy of a into the receiver, overwriting the previous value of the
         // receiver. The clone operation does not make any restriction on shape and will not cause
         // shadowing.
        -type Cloner interface {
        -	Clone(a Matrix)
        +type ClonerFrom interface {
        +	CloneFrom(a Matrix)
         }
         
         // A Reseter can reset the matrix so that it can be reused as the receiver of a dimensionally
         // restricted operation. This is commonly used when the matrix is being used as a workspace
         // or temporary matrix.
         //
        -// If the matrix is a view, using the reset matrix may result in data corruption in elements
        -// outside the view.
        +// If the matrix is a view, using Reset may result in data corruption in elements outside
        +// the view. Similarly, if the matrix shares backing data with another variable, using
        +// Reset may lead to unexpected changes in data values.
         type Reseter interface {
         	Reset()
         }
        @@ -200,6 +225,77 @@ type ColNonZeroDoer interface {
         	DoColNonZero(j int, fn func(i, j int, v float64))
         }
         
        +// untranspose untransposes a matrix if applicable. If a is an Untransposer, then
        +// untranspose returns the underlying matrix and true. If it is not, then it returns
        +// the input matrix and false.
        +func untranspose(a Matrix) (Matrix, bool) {
        +	if ut, ok := a.(Untransposer); ok {
        +		return ut.Untranspose(), true
        +	}
        +	return a, false
        +}
        +
        +// untransposeExtract returns an untransposed matrix in a built-in matrix type.
        +//
        +// The untransposed matrix is returned unaltered if it is a built-in matrix type.
        +// Otherwise, if it implements a Raw method, an appropriate built-in type value
        +// is returned holding the raw matrix value of the input. If neither of these
        +// is possible, the untransposed matrix is returned.
        +func untransposeExtract(a Matrix) (Matrix, bool) {
        +	ut, trans := untranspose(a)
        +	switch m := ut.(type) {
        +	case *DiagDense, *SymBandDense, *TriBandDense, *BandDense, *TriDense, *SymDense, *Dense, *VecDense:
        +		return m, trans
        +	// TODO(btracey): Add here if we ever have an equivalent of RawDiagDense.
        +	case RawSymBander:
        +		rsb := m.RawSymBand()
        +		if rsb.Uplo != blas.Upper {
        +			return ut, trans
        +		}
        +		var sb SymBandDense
        +		sb.SetRawSymBand(rsb)
        +		return &sb, trans
        +	case RawTriBander:
        +		rtb := m.RawTriBand()
        +		if rtb.Diag == blas.Unit {
        +			return ut, trans
        +		}
        +		var tb TriBandDense
        +		tb.SetRawTriBand(rtb)
        +		return &tb, trans
        +	case RawBander:
        +		var b BandDense
        +		b.SetRawBand(m.RawBand())
        +		return &b, trans
        +	case RawTriangular:
        +		rt := m.RawTriangular()
        +		if rt.Diag == blas.Unit {
        +			return ut, trans
        +		}
        +		var t TriDense
        +		t.SetRawTriangular(rt)
        +		return &t, trans
        +	case RawSymmetricer:
        +		rs := m.RawSymmetric()
        +		if rs.Uplo != blas.Upper {
        +			return ut, trans
        +		}
        +		var s SymDense
        +		s.SetRawSymmetric(rs)
        +		return &s, trans
        +	case RawMatrixer:
        +		var d Dense
        +		d.SetRawMatrix(m.RawMatrix())
        +		return &d, trans
        +	case RawVectorer:
        +		var v VecDense
        +		v.SetRawVector(m.RawVector())
        +		return &v, trans
        +	default:
        +		return ut, trans
        +	}
        +}
        +
         // TODO(btracey): Consider adding CopyCol/CopyRow if the behavior seems useful.
         // TODO(btracey): Add in fast paths to Row/Col for the other concrete types
         // (TriDense, etc.) as well as relevant interfaces (RowColer, RawRowViewer, etc.)
        @@ -226,9 +322,8 @@ func Col(dst []float64, j int, a Matrix) []float64 {
         			copy(dst, m.Data[j*m.Stride:j*m.Stride+m.Cols])
         			return dst
         		}
        -		blas64.Copy(r,
        -			blas64.Vector{Inc: m.Stride, Data: m.Data[j:]},
        -			blas64.Vector{Inc: 1, Data: dst},
        +		blas64.Copy(blas64.Vector{N: r, Inc: m.Stride, Data: m.Data[j:]},
        +			blas64.Vector{N: r, Inc: 1, Data: dst},
         		)
         		return dst
         	}
        @@ -257,9 +352,8 @@ func Row(dst []float64, i int, a Matrix) []float64 {
         	if rm, ok := aU.(RawMatrixer); ok {
         		m := rm.RawMatrix()
         		if aTrans {
        -			blas64.Copy(c,
        -				blas64.Vector{Inc: m.Stride, Data: m.Data[i:]},
        -				blas64.Vector{Inc: 1, Data: dst},
        +			blas64.Copy(blas64.Vector{N: c, Inc: m.Stride, Data: m.Data[i:]},
        +				blas64.Vector{N: c, Inc: 1, Data: dst},
         			)
         			return dst
         		}
        @@ -338,7 +432,7 @@ func Dot(a, b Vector) float64 {
         	}
         	if arv, ok := a.(RawVectorer); ok {
         		if brv, ok := b.(RawVectorer); ok {
        -			return blas64.Dot(la, arv.RawVector(), brv.RawVector())
        +			return blas64.Dot(arv.RawVector(), brv.RawVector())
         		}
         	}
         	var sum float64
        @@ -401,7 +495,7 @@ func Equal(a, b Matrix) bool {
         		if rb, ok := bU.(*VecDense); ok {
         			// If the raw vectors are the same length they must either both be
         			// transposed or both not transposed (or have length 1).
        -			for i := 0; i < ra.n; i++ {
        +			for i := 0; i < ra.mat.N; i++ {
         				if ra.mat.Data[i*ra.mat.Inc] != rb.mat.Data[i*rb.mat.Inc] {
         					return false
         				}
        @@ -473,7 +567,7 @@ func EqualApprox(a, b Matrix, epsilon float64) bool {
         		if rb, ok := bU.(*VecDense); ok {
         			// If the raw vectors are the same length they must either both be
         			// transposed or both not transposed (or have length 1).
        -			for i := 0; i < ra.n; i++ {
        +			for i := 0; i < ra.mat.N; i++ {
         				if !floats.EqualWithinAbsOrRel(ra.mat.Data[i*ra.mat.Inc], rb.mat.Data[i*rb.mat.Inc], epsilon, epsilon) {
         					return false
         				}
        @@ -508,7 +602,7 @@ func Max(a Matrix) float64 {
         	if r == 0 || c == 0 {
         		panic(ErrShape)
         	}
        -	// Max(A) = Max(A^T)
        +	// Max(A) = Max(Aᵀ)
         	aU, _ := untranspose(a)
         	switch m := aU.(type) {
         	case RawMatrixer:
        @@ -583,7 +677,7 @@ func Min(a Matrix) float64 {
         	if r == 0 || c == 0 {
         		panic(ErrShape)
         	}
        -	// Min(A) = Min(A^T)
        +	// Min(A) = Min(Aᵀ)
         	aU, _ := untranspose(a)
         	switch m := aU.(type) {
         	case RawMatrixer:
        @@ -696,26 +790,26 @@ func Norm(a Matrix, norm float64) float64 {
         		rv := rma.RawVector()
         		switch norm {
         		default:
        -			panic("unreachable")
        +			panic(ErrNormOrder)
         		case 1:
         			if aTrans {
        -				imax := blas64.Iamax(rma.n, rv)
        +				imax := blas64.Iamax(rv)
         				return math.Abs(rma.At(imax, 0))
         			}
        -			return blas64.Asum(rma.n, rv)
        +			return blas64.Asum(rv)
         		case 2:
        -			return blas64.Nrm2(rma.n, rv)
        +			return blas64.Nrm2(rv)
         		case math.Inf(1):
         			if aTrans {
        -				return blas64.Asum(rma.n, rv)
        +				return blas64.Asum(rv)
         			}
        -			imax := blas64.Iamax(rma.n, rv)
        +			imax := blas64.Iamax(rv)
         			return math.Abs(rma.At(imax, 0))
         		}
         	}
         	switch norm {
         	default:
        -		panic("unreachable")
        +		panic(ErrNormOrder)
         	case 1:
         		var max float64
         		for j := 0; j < c; j++ {
        @@ -776,12 +870,43 @@ func normLapack(norm float64, aTrans bool) lapack.MatrixNorm {
         
         // Sum returns the sum of the elements of the matrix.
         func Sum(a Matrix) float64 {
        -	// TODO(btracey): Add a fast path for the other supported matrix types.
         
        -	r, c := a.Dims()
         	var sum float64
         	aU, _ := untranspose(a)
        -	if rma, ok := aU.(RawMatrixer); ok {
        +	switch rma := aU.(type) {
        +	case RawSymmetricer:
        +		rm := rma.RawSymmetric()
        +		for i := 0; i < rm.N; i++ {
        +			// Diagonals count once while off-diagonals count twice.
        +			sum += rm.Data[i*rm.Stride+i]
        +			var s float64
        +			for _, v := range rm.Data[i*rm.Stride+i+1 : i*rm.Stride+rm.N] {
        +				s += v
        +			}
        +			sum += 2 * s
        +		}
        +		return sum
        +	case RawTriangular:
        +		rm := rma.RawTriangular()
        +		var startIdx, endIdx int
        +		for i := 0; i < rm.N; i++ {
        +			// Start and end index for this triangle-row.
        +			switch rm.Uplo {
        +			case blas.Upper:
        +				startIdx = i
        +				endIdx = rm.N
        +			case blas.Lower:
        +				startIdx = 0
        +				endIdx = i + 1
        +			default:
        +				panic(badTriangle)
        +			}
        +			for _, v := range rm.Data[i*rm.Stride+startIdx : i*rm.Stride+endIdx] {
        +				sum += v
        +			}
        +		}
        +		return sum
        +	case RawMatrixer:
         		rm := rma.RawMatrix()
         		for i := 0; i < rm.Rows; i++ {
         			for _, v := range rm.Data[i*rm.Stride : i*rm.Stride+rm.Cols] {
        @@ -789,53 +914,46 @@ func Sum(a Matrix) float64 {
         			}
         		}
         		return sum
        -	}
        -	for i := 0; i < r; i++ {
        -		for j := 0; j < c; j++ {
        -			sum += a.At(i, j)
        +	case *VecDense:
        +		rm := rma.RawVector()
        +		for i := 0; i < rm.N; i++ {
        +			sum += rm.Data[i*rm.Inc]
         		}
        +		return sum
        +	default:
        +		r, c := a.Dims()
        +		for i := 0; i < r; i++ {
        +			for j := 0; j < c; j++ {
        +				sum += a.At(i, j)
        +			}
        +		}
        +		return sum
         	}
        -	return sum
         }
         
        -// Trace returns the trace of the matrix. Trace will panic if the
        +// A Tracer can compute the trace of the matrix. Trace must panic if the
         // matrix is not square.
        +type Tracer interface {
        +	Trace() float64
        +}
        +
        +// Trace returns the trace of the matrix. Trace will panic if the
        +// matrix is not square. If a is a Tracer, its Trace method will be
        +// used to calculate the matrix trace.
         func Trace(a Matrix) float64 {
        +	m, _ := untransposeExtract(a)
        +	if t, ok := m.(Tracer); ok {
        +		return t.Trace()
        +	}
         	r, c := a.Dims()
         	if r != c {
         		panic(ErrSquare)
         	}
        -
        -	aU, _ := untranspose(a)
        -	switch m := aU.(type) {
        -	case RawMatrixer:
        -		rm := m.RawMatrix()
        -		var t float64
        -		for i := 0; i < r; i++ {
        -			t += rm.Data[i*rm.Stride+i]
        -		}
        -		return t
        -	case RawTriangular:
        -		rm := m.RawTriangular()
        -		var t float64
        -		for i := 0; i < r; i++ {
        -			t += rm.Data[i*rm.Stride+i]
        -		}
        -		return t
        -	case RawSymmetricer:
        -		rm := m.RawSymmetric()
        -		var t float64
        -		for i := 0; i < r; i++ {
        -			t += rm.Data[i*rm.Stride+i]
        -		}
        -		return t
        -	default:
        -		var t float64
        -		for i := 0; i < r; i++ {
        -			t += a.At(i, i)
        -		}
        -		return t
        +	var v float64
        +	for i := 0; i < r; i++ {
        +		v += a.At(i, i)
         	}
        +	return v
         }
         
         func min(a, b int) int {
        diff --git a/vendor/gonum.org/v1/gonum/mat/offset.go b/vendor/gonum.org/v1/gonum/mat/offset.go
        index af2c03b64..830589dc9 100644
        --- a/vendor/gonum.org/v1/gonum/mat/offset.go
        +++ b/vendor/gonum.org/v1/gonum/mat/offset.go
        @@ -18,3 +18,14 @@ func offset(a, b []float64) int {
         	// move. See https://golang.org/issue/12445.
         	return int(uintptr(unsafe.Pointer(&b[0]))-uintptr(unsafe.Pointer(&a[0]))) / int(unsafe.Sizeof(float64(0)))
         }
        +
        +// offsetComplex returns the number of complex128 values b[0] is after a[0].
        +func offsetComplex(a, b []complex128) int {
        +	if &a[0] == &b[0] {
        +		return 0
        +	}
        +	// This expression must be atomic with respect to GC moves.
        +	// At this stage this is true, because the GC does not
        +	// move. See https://golang.org/issue/12445.
        +	return int(uintptr(unsafe.Pointer(&b[0]))-uintptr(unsafe.Pointer(&a[0]))) / int(unsafe.Sizeof(complex128(0)))
        +}
        diff --git a/vendor/gonum.org/v1/gonum/mat/offset_appengine.go b/vendor/gonum.org/v1/gonum/mat/offset_appengine.go
        index df617478c..3204d182f 100644
        --- a/vendor/gonum.org/v1/gonum/mat/offset_appengine.go
        +++ b/vendor/gonum.org/v1/gonum/mat/offset_appengine.go
        @@ -22,3 +22,18 @@ func offset(a, b []float64) int {
         	// move. See https://golang.org/issue/12445.
         	return int(vb0.UnsafeAddr()-va0.UnsafeAddr()) / sizeOfFloat64
         }
        +
        +var sizeOfComplex128 = int(reflect.TypeOf(complex128(0)).Size())
        +
        +// offsetComplex returns the number of complex128 values b[0] is after a[0].
        +func offsetComplex(a, b []complex128) int {
        +	va0 := reflect.ValueOf(a).Index(0)
        +	vb0 := reflect.ValueOf(b).Index(0)
        +	if va0.Addr() == vb0.Addr() {
        +		return 0
        +	}
        +	// This expression must be atomic with respect to GC moves.
        +	// At this stage this is true, because the GC does not
        +	// move. See https://golang.org/issue/12445.
        +	return int(vb0.UnsafeAddr()-va0.UnsafeAddr()) / sizeOfComplex128
        +}
        diff --git a/vendor/gonum.org/v1/gonum/mat/pool.go b/vendor/gonum.org/v1/gonum/mat/pool.go
        index 065fd5422..f51215ce3 100644
        --- a/vendor/gonum.org/v1/gonum/mat/pool.go
        +++ b/vendor/gonum.org/v1/gonum/mat/pool.go
        @@ -87,10 +87,12 @@ func init() {
         			}}
         		}
         		poolFloats[i].New = func() interface{} {
        -			return make([]float64, l)
        +			s := make([]float64, l)
        +			return &s
         		}
         		poolInts[i].New = func() interface{} {
        -			return make([]int, l)
        +			s := make([]int, l)
        +			return &s
         		}
         	}
         }
        @@ -186,7 +188,7 @@ func getWorkspaceVec(n int, clear bool) *VecDense {
         	if clear {
         		zero(v.mat.Data)
         	}
        -	v.n = n
        +	v.mat.N = n
         	return v
         }
         
        @@ -200,7 +202,7 @@ func putWorkspaceVec(v *VecDense) {
         // getFloats returns a []float64 of length l and a cap that is
         // less than 2*l. If clear is true, the slice visible is zeroed.
         func getFloats(l int, clear bool) []float64 {
        -	w := poolFloats[bits(uint64(l))].Get().([]float64)
        +	w := *poolFloats[bits(uint64(l))].Get().(*[]float64)
         	w = w[:l]
         	if clear {
         		zero(w)
        @@ -212,13 +214,13 @@ func getFloats(l int, clear bool) []float64 {
         // workspace pool. putFloats must not be called with a slice
         // where references to the underlying data have been kept.
         func putFloats(w []float64) {
        -	poolFloats[bits(uint64(cap(w)))].Put(w)
        +	poolFloats[bits(uint64(cap(w)))].Put(&w)
         }
         
         // getInts returns a []ints of length l and a cap that is
         // less than 2*l. If clear is true, the slice visible is zeroed.
         func getInts(l int, clear bool) []int {
        -	w := poolInts[bits(uint64(l))].Get().([]int)
        +	w := *poolInts[bits(uint64(l))].Get().(*[]int)
         	w = w[:l]
         	if clear {
         		for i := range w {
        @@ -232,5 +234,5 @@ func getInts(l int, clear bool) []int {
         // workspace pool. putInts must not be called with a slice
         // where references to the underlying data have been kept.
         func putInts(w []int) {
        -	poolInts[bits(uint64(cap(w)))].Put(w)
        +	poolInts[bits(uint64(cap(w)))].Put(&w)
         }
        diff --git a/vendor/gonum.org/v1/gonum/mat/product.go b/vendor/gonum.org/v1/gonum/mat/product.go
        index 08424ab3c..d8e030275 100644
        --- a/vendor/gonum.org/v1/gonum/mat/product.go
        +++ b/vendor/gonum.org/v1/gonum/mat/product.go
        @@ -31,7 +31,7 @@ func (m *Dense) Product(factors ...Matrix) {
         		}
         		return
         	case 1:
        -		m.reuseAs(factors[0].Dims())
        +		m.reuseAsNonZeroed(factors[0].Dims())
         		m.Copy(factors[0])
         		return
         	case 2:
        @@ -43,7 +43,7 @@ func (m *Dense) Product(factors ...Matrix) {
         	p := newMultiplier(m, factors)
         	p.optimize()
         	result := p.multiply()
        -	m.reuseAs(result.Dims())
        +	m.reuseAsNonZeroed(result.Dims())
         	m.Copy(result)
         	putWorkspace(result)
         }
        @@ -71,7 +71,7 @@ func newMultiplier(m *Dense, factors []Matrix) *multiplier {
         	// allocate data for m.
         	r, c := m.Dims()
         	fr, fc := factors[0].Dims() // newMultiplier is only called with len(factors) > 2.
        -	if !m.IsZero() {
        +	if !m.IsEmpty() {
         		if fr != r {
         			panic(ErrShape)
         		}
        diff --git a/vendor/gonum.org/v1/gonum/mat/qr.go b/vendor/gonum.org/v1/gonum/mat/qr.go
        index c56845c77..78e9f3e8b 100644
        --- a/vendor/gonum.org/v1/gonum/mat/qr.go
        +++ b/vendor/gonum.org/v1/gonum/mat/qr.go
        @@ -13,6 +13,8 @@ import (
         	"gonum.org/v1/gonum/lapack/lapack64"
         )
         
        +const badQR = "mat: invalid QR factorization"
        +
         // QR is a type for creating and using the QR factorization of a matrix.
         type QR struct {
         	qr   *Dense
        @@ -22,9 +24,9 @@ type QR struct {
         
         func (qr *QR) updateCond(norm lapack.MatrixNorm) {
         	// Since A = Q*R, and Q is orthogonal, we get for the condition number κ
        -	//  κ(A) := |A| |A^-1| = |Q*R| |(Q*R)^-1| = |R| |R^-1 * Q^T|
        +	//  κ(A) := |A| |A^-1| = |Q*R| |(Q*R)^-1| = |R| |R^-1 * Qᵀ|
         	//        = |R| |R^-1| = κ(R),
        -	// where we used that fact that Q^-1 = Q^T. However, this assumes that
        +	// where we used that fact that Q^-1 = Qᵀ. However, this assumes that
         	// the matrix norm is invariant under orthogonal transformations which
         	// is not the case for CondNorm. Hopefully the error is negligible: κ
         	// is only a qualitative measure anyway.
        @@ -57,22 +59,26 @@ func (qr *QR) factorize(a Matrix, norm lapack.MatrixNorm) {
         	if qr.qr == nil {
         		qr.qr = &Dense{}
         	}
        -	qr.qr.Clone(a)
        +	qr.qr.CloneFrom(a)
         	work := []float64{0}
         	qr.tau = make([]float64, k)
         	lapack64.Geqrf(qr.qr.mat, qr.tau, work, -1)
        -
         	work = getFloats(int(work[0]), false)
         	lapack64.Geqrf(qr.qr.mat, qr.tau, work, len(work))
         	putFloats(work)
         	qr.updateCond(norm)
         }
         
        +// isValid returns whether the receiver contains a factorization.
        +func (qr *QR) isValid() bool {
        +	return qr.qr != nil && !qr.qr.IsEmpty()
        +}
        +
         // Cond returns the condition number for the factorized matrix.
        -// Cond will panic if the receiver does not contain a successful factorization.
        +// Cond will panic if the receiver does not contain a factorization.
         func (qr *QR) Cond() float64 {
        -	if qr.qr == nil || qr.qr.IsZero() {
        -		panic("qr: no decomposition computed")
        +	if !qr.isValid() {
        +		panic(badQR)
         	}
         	return qr.cond
         }
        @@ -81,13 +87,23 @@ func (qr *QR) Cond() float64 {
         // and upper triangular matrices.
         
         // RTo extracts the m×n upper trapezoidal matrix from a QR decomposition.
        -// If dst is nil, a new matrix is allocated. The resulting dst matrix is returned.
        -func (qr *QR) RTo(dst *Dense) *Dense {
        +//
        +// If dst is empty, RTo will resize dst to be r×c. When dst is non-empty,
        +// RTo will panic if dst is not r×c. RTo will also panic if the receiver
        +// does not contain a successful factorization.
        +func (qr *QR) RTo(dst *Dense) {
        +	if !qr.isValid() {
        +		panic(badQR)
        +	}
        +
         	r, c := qr.qr.Dims()
        -	if dst == nil {
        -		dst = NewDense(r, c, nil)
        +	if dst.IsEmpty() {
        +		dst.ReuseAs(r, c)
         	} else {
        -		dst.reuseAs(r, c)
        +		r2, c2 := dst.Dims()
        +		if c != r2 || c != c2 {
        +			panic(ErrShape)
        +		}
         	}
         
         	// Disguise the QR as an upper triangular
        @@ -107,18 +123,27 @@ func (qr *QR) RTo(dst *Dense) *Dense {
         	for i := r; i < c; i++ {
         		zero(dst.mat.Data[i*dst.mat.Stride : i*dst.mat.Stride+c])
         	}
        -
        -	return dst
         }
         
        -// QTo extracts the m×m orthonormal matrix Q from a QR decomposition.
        -// If dst is nil, a new matrix is allocated. The resulting Q matrix is returned.
        -func (qr *QR) QTo(dst *Dense) *Dense {
        +// QTo extracts the r×r orthonormal matrix Q from a QR decomposition.
        +//
        +// If dst is empty, QTo will resize dst to be r×r. When dst is non-empty,
        +// QTo will panic if dst is not r×r. QTo will also panic if the receiver
        +// does not contain a successful factorization.
        +func (qr *QR) QTo(dst *Dense) {
        +	if !qr.isValid() {
        +		panic(badQR)
        +	}
        +
         	r, _ := qr.qr.Dims()
        -	if dst == nil {
        -		dst = NewDense(r, r, nil)
        +	if dst.IsEmpty() {
        +		dst.ReuseAs(r, r)
         	} else {
        -		dst.reuseAsZeroed(r, r)
        +		r2, c2 := dst.Dims()
        +		if r != r2 || r != c2 {
        +			panic(ErrShape)
        +		}
        +		dst.Zero()
         	}
         
         	// Set Q = I.
        @@ -132,20 +157,23 @@ func (qr *QR) QTo(dst *Dense) *Dense {
         	work = getFloats(int(work[0]), false)
         	lapack64.Ormqr(blas.Left, blas.NoTrans, qr.qr.mat, qr.tau, dst.mat, work, len(work))
         	putFloats(work)
        -
        -	return dst
         }
         
        -// Solve finds a minimum-norm solution to a system of linear equations defined
        +// SolveTo finds a minimum-norm solution to a system of linear equations defined
         // by the matrices A and b, where A is an m×n matrix represented in its QR factorized
         // form. If A is singular or near-singular a Condition error is returned.
         // See the documentation for Condition for more information.
         //
         // The minimization problem solved depends on the input parameters.
         //  If trans == false, find X such that ||A*X - B||_2 is minimized.
        -//  If trans == true, find the minimum norm solution of A^T * X = B.
        -// The solution matrix, X, is stored in place into m.
        -func (qr *QR) Solve(x *Dense, trans bool, b Matrix) error {
        +//  If trans == true, find the minimum norm solution of Aᵀ * X = B.
        +// The solution matrix, X, is stored in place into dst.
        +// SolveTo will panic if the receiver does not contain a factorization.
        +func (qr *QR) SolveTo(dst *Dense, trans bool, b Matrix) error {
        +	if !qr.isValid() {
        +		panic(badQR)
        +	}
        +
         	r, c := qr.qr.Dims()
         	br, bc := b.Dims()
         
        @@ -157,12 +185,12 @@ func (qr *QR) Solve(x *Dense, trans bool, b Matrix) error {
         		if c != br {
         			panic(ErrShape)
         		}
        -		x.reuseAs(r, bc)
        +		dst.reuseAsNonZeroed(r, bc)
         	} else {
         		if r != br {
         			panic(ErrShape)
         		}
        -		x.reuseAs(c, bc)
        +		dst.reuseAsNonZeroed(c, bc)
         	}
         	// Do not need to worry about overlap between m and b because x has its own
         	// independent storage.
        @@ -195,7 +223,7 @@ func (qr *QR) Solve(x *Dense, trans bool, b Matrix) error {
         		}
         	}
         	// X was set above to be the correct size for the result.
        -	x.Copy(w)
        +	dst.Copy(w)
         	putWorkspace(w)
         	if qr.cond > ConditionTolerance {
         		return Condition(qr.cond)
        @@ -203,10 +231,15 @@ func (qr *QR) Solve(x *Dense, trans bool, b Matrix) error {
         	return nil
         }
         
        -// SolveVec finds a minimum-norm solution to a system of linear equations,
        +// SolveVecTo finds a minimum-norm solution to a system of linear equations,
         //  Ax = b.
        -// See QR.Solve for the full documentation.
        -func (qr *QR) SolveVec(x *VecDense, trans bool, b Vector) error {
        +// See QR.SolveTo for the full documentation.
        +// SolveVecTo will panic if the receiver does not contain a factorization.
        +func (qr *QR) SolveVecTo(dst *VecDense, trans bool, b Vector) error {
        +	if !qr.isValid() {
        +		panic(badQR)
        +	}
        +
         	r, c := qr.qr.Dims()
         	if _, bc := b.Dims(); bc != 1 {
         		panic(ErrShape)
        @@ -217,17 +250,17 @@ func (qr *QR) SolveVec(x *VecDense, trans bool, b Vector) error {
         	bm := Matrix(b)
         	if rv, ok := b.(RawVectorer); ok {
         		bmat := rv.RawVector()
        -		if x != b {
        -			x.checkOverlap(bmat)
        +		if dst != b {
        +			dst.checkOverlap(bmat)
         		}
        -		b := VecDense{mat: bmat, n: b.Len()}
        +		b := VecDense{mat: bmat}
         		bm = b.asDense()
         	}
         	if trans {
        -		x.reuseAs(r)
        +		dst.reuseAsNonZeroed(r)
         	} else {
        -		x.reuseAs(c)
        +		dst.reuseAsNonZeroed(c)
         	}
        -	return qr.Solve(x.asDense(), trans, bm)
        +	return qr.SolveTo(dst.asDense(), trans, bm)
         
         }
        diff --git a/vendor/gonum.org/v1/gonum/mat/shadow.go b/vendor/gonum.org/v1/gonum/mat/shadow.go
        index cc62e44f0..8a941c7fc 100644
        --- a/vendor/gonum.org/v1/gonum/mat/shadow.go
        +++ b/vendor/gonum.org/v1/gonum/mat/shadow.go
        @@ -4,23 +4,7 @@
         
         package mat
         
        -import (
        -	"gonum.org/v1/gonum/blas/blas64"
        -)
        -
        -const (
        -	// regionOverlap is the panic string used for the general case
        -	// of a matrix region overlap between a source and destination.
        -	regionOverlap = "mat: bad region: overlap"
        -
        -	// regionIdentity is the panic string used for the specific
        -	// case of complete agreement between a source and a destination.
        -	regionIdentity = "mat: bad region: identical"
        -
        -	// mismatchedStrides is the panic string used for overlapping
        -	// data slices with differing strides.
        -	mismatchedStrides = "mat: bad region: different strides"
        -)
        +import "gonum.org/v1/gonum/blas/blas64"
         
         // checkOverlap returns false if the receiver does not overlap data elements
         // referenced by the parameter and panics otherwise.
        @@ -51,8 +35,9 @@ func checkOverlap(a, b blas64.General) bool {
         		return false
         	}
         
        -	if a.Stride != b.Stride {
        -		// Too hard, so assume the worst.
        +	if a.Stride != b.Stride && a.Stride != 1 && b.Stride != 1 {
        +		// Too hard, so assume the worst; if either stride
        +		// is one it will be caught in rectanglesOverlap.
         		panic(mismatchedStrides)
         	}
         
        @@ -60,7 +45,7 @@ func checkOverlap(a, b blas64.General) bool {
         		off = -off
         		a.Cols, b.Cols = b.Cols, a.Cols
         	}
        -	if rectanglesOverlap(off, a.Cols, b.Cols, a.Stride) {
        +	if rectanglesOverlap(off, a.Cols, b.Cols, min(a.Stride, b.Stride)) {
         		panic(regionOverlap)
         	}
         	return false
        @@ -75,15 +60,20 @@ func (m *Dense) checkOverlapMatrix(a Matrix) bool {
         		return false
         	}
         	var amat blas64.General
        -	switch a := a.(type) {
        +	switch ar := a.(type) {
         	default:
         		return false
         	case RawMatrixer:
        -		amat = a.RawMatrix()
        +		amat = ar.RawMatrix()
         	case RawSymmetricer:
        -		amat = generalFromSymmetric(a.RawSymmetric())
        +		amat = generalFromSymmetric(ar.RawSymmetric())
        +	case RawSymBander:
        +		amat = generalFromSymmetricBand(ar.RawSymBand())
         	case RawTriangular:
        -		amat = generalFromTriangular(a.RawTriangular())
        +		amat = generalFromTriangular(ar.RawTriangular())
        +	case RawVectorer:
        +		r, c := a.Dims()
        +		amat = generalFromVector(ar.RawVector(), r, c)
         	}
         	return m.checkOverlap(amat)
         }
        @@ -97,15 +87,20 @@ func (s *SymDense) checkOverlapMatrix(a Matrix) bool {
         		return false
         	}
         	var amat blas64.General
        -	switch a := a.(type) {
        +	switch ar := a.(type) {
         	default:
         		return false
         	case RawMatrixer:
        -		amat = a.RawMatrix()
        +		amat = ar.RawMatrix()
         	case RawSymmetricer:
        -		amat = generalFromSymmetric(a.RawSymmetric())
        +		amat = generalFromSymmetric(ar.RawSymmetric())
        +	case RawSymBander:
        +		amat = generalFromSymmetricBand(ar.RawSymBand())
         	case RawTriangular:
        -		amat = generalFromTriangular(a.RawTriangular())
        +		amat = generalFromTriangular(ar.RawTriangular())
        +	case RawVectorer:
        +		r, c := a.Dims()
        +		amat = generalFromVector(ar.RawVector(), r, c)
         	}
         	return s.checkOverlap(amat)
         }
        @@ -130,15 +125,20 @@ func (t *TriDense) checkOverlapMatrix(a Matrix) bool {
         		return false
         	}
         	var amat blas64.General
        -	switch a := a.(type) {
        +	switch ar := a.(type) {
         	default:
         		return false
         	case RawMatrixer:
        -		amat = a.RawMatrix()
        +		amat = ar.RawMatrix()
         	case RawSymmetricer:
        -		amat = generalFromSymmetric(a.RawSymmetric())
        +		amat = generalFromSymmetric(ar.RawSymmetric())
        +	case RawSymBander:
        +		amat = generalFromSymmetricBand(ar.RawSymBand())
         	case RawTriangular:
        -		amat = generalFromTriangular(a.RawTriangular())
        +		amat = generalFromTriangular(ar.RawTriangular())
        +	case RawVectorer:
        +		r, c := a.Dims()
        +		amat = generalFromVector(ar.RawVector(), r, c)
         	}
         	return t.checkOverlap(amat)
         }
        @@ -179,48 +179,64 @@ func (v *VecDense) checkOverlap(a blas64.Vector) bool {
         		return false
         	}
         
        -	if mat.Inc != a.Inc {
        -		// Too hard, so assume the worst.
        +	if mat.Inc != a.Inc && mat.Inc != 1 && a.Inc != 1 {
        +		// Too hard, so assume the worst; if either
        +		// increment is one it will be caught below.
         		panic(mismatchedStrides)
         	}
        +	inc := min(mat.Inc, a.Inc)
         
        -	if mat.Inc == 1 || off&mat.Inc == 0 {
        +	if inc == 1 || off&inc == 0 {
         		panic(regionOverlap)
         	}
         	return false
         }
         
        -// rectanglesOverlap returns whether the strided rectangles a and b overlap
        -// when b is offset by off elements after a but has at least one element before
        -// the end of a. off must be positive. a and b have aCols and bCols respectively.
        -//
        -// rectanglesOverlap works by shifting both matrices left such that the left
        -// column of a is at 0. The column indexes are flattened by obtaining the shifted
        -// relative left and right column positions modulo the common stride. This allows
        -// direct comparison of the column offsets when the matrix backing data slices
        -// are known to overlap.
        -func rectanglesOverlap(off, aCols, bCols, stride int) bool {
        -	if stride == 1 {
        -		// Unit stride means overlapping data
        -		// slices must overlap as matrices.
        -		return true
        -	}
        -
        -	// Flatten the shifted matrix column positions
        -	// so a starts at 0, modulo the common stride.
        -	aTo := aCols
        -	// The mod stride operations here make the from
        -	// and to indexes comparable between a and b when
        -	// the data slices of a and b overlap.
        -	bFrom := off % stride
        -	bTo := (bFrom + bCols) % stride
        -
        -	if bTo == 0 || bFrom < bTo {
        -		// b matrix is not wrapped: compare for
        -		// simple overlap.
        -		return bFrom < aTo
        -	}
        -
        -	// b strictly wraps and so must overlap with a.
        -	return true
        +// generalFromVector returns a blas64.General with the backing
        +// data and dimensions of a.
        +func generalFromVector(a blas64.Vector, r, c int) blas64.General {
        +	return blas64.General{
        +		Rows:   r,
        +		Cols:   c,
        +		Stride: a.Inc,
        +		Data:   a.Data,
        +	}
        +}
        +
        +func (s *SymBandDense) checkOverlap(a blas64.General) bool {
        +	return checkOverlap(generalFromSymmetricBand(s.RawSymBand()), a)
        +}
        +
        +func (s *SymBandDense) checkOverlapMatrix(a Matrix) bool {
        +	if s == a {
        +		return false
        +	}
        +	var amat blas64.General
        +	switch ar := a.(type) {
        +	default:
        +		return false
        +	case RawMatrixer:
        +		amat = ar.RawMatrix()
        +	case RawSymmetricer:
        +		amat = generalFromSymmetric(ar.RawSymmetric())
        +	case RawSymBander:
        +		amat = generalFromSymmetricBand(ar.RawSymBand())
        +	case RawTriangular:
        +		amat = generalFromTriangular(ar.RawTriangular())
        +	case RawVectorer:
        +		r, c := a.Dims()
        +		amat = generalFromVector(ar.RawVector(), r, c)
        +	}
        +	return s.checkOverlap(amat)
        +}
        +
        +// generalFromSymmetricBand returns a blas64.General with the backing
        +// data and dimensions of a.
        +func generalFromSymmetricBand(a blas64.SymmetricBand) blas64.General {
        +	return blas64.General{
        +		Rows:   a.N,
        +		Cols:   a.K + 1,
        +		Data:   a.Data,
        +		Stride: a.Stride,
        +	}
         }
        diff --git a/vendor/gonum.org/v1/gonum/mat/shadow_common.go b/vendor/gonum.org/v1/gonum/mat/shadow_common.go
        new file mode 100644
        index 000000000..e4cdf4dde
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/mat/shadow_common.go
        @@ -0,0 +1,54 @@
        +// Copyright ©2015 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package mat
        +
        +const (
        +	// regionOverlap is the panic string used for the general case
        +	// of a matrix region overlap between a source and destination.
        +	regionOverlap = "mat: bad region: overlap"
        +
        +	// regionIdentity is the panic string used for the specific
        +	// case of complete agreement between a source and a destination.
        +	regionIdentity = "mat: bad region: identical"
        +
        +	// mismatchedStrides is the panic string used for overlapping
        +	// data slices with differing strides.
        +	mismatchedStrides = "mat: bad region: different strides"
        +)
        +
        +// rectanglesOverlap returns whether the strided rectangles a and b overlap
        +// when b is offset by off elements after a but has at least one element before
        +// the end of a. off must be positive. a and b have aCols and bCols respectively.
        +//
        +// rectanglesOverlap works by shifting both matrices left such that the left
        +// column of a is at 0. The column indexes are flattened by obtaining the shifted
        +// relative left and right column positions modulo the common stride. This allows
        +// direct comparison of the column offsets when the matrix backing data slices
        +// are known to overlap.
        +func rectanglesOverlap(off, aCols, bCols, stride int) bool {
        +	if stride == 1 {
        +		// Unit stride means overlapping data
        +		// slices must overlap as matrices.
        +		return true
        +	}
        +
        +	// Flatten the shifted matrix column positions
        +	// so a starts at 0, modulo the common stride.
        +	aTo := aCols
        +	// The mod stride operations here make the from
        +	// and to indexes comparable between a and b when
        +	// the data slices of a and b overlap.
        +	bFrom := off % stride
        +	bTo := (bFrom + bCols) % stride
        +
        +	if bTo == 0 || bFrom < bTo {
        +		// b matrix is not wrapped: compare for
        +		// simple overlap.
        +		return bFrom < aTo
        +	}
        +
        +	// b strictly wraps and so must overlap with a.
        +	return true
        +}
        diff --git a/vendor/gonum.org/v1/gonum/mat/shadow_complex.go b/vendor/gonum.org/v1/gonum/mat/shadow_complex.go
        new file mode 100644
        index 000000000..7bf1cefd8
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/mat/shadow_complex.go
        @@ -0,0 +1,72 @@
        +// Copyright ©2015 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// TODO(kortschak): Generate this file from shadow.go when all complex type are available.
        +
        +package mat
        +
        +import "gonum.org/v1/gonum/blas/cblas128"
        +
        +// checkOverlapComplex returns false if the receiver does not overlap data elements
        +// referenced by the parameter and panics otherwise.
        +//
        +// checkOverlapComplex methods return a boolean to allow the check call to be added to a
        +// boolean expression, making use of short-circuit operators.
        +func checkOverlapComplex(a, b cblas128.General) bool {
        +	if cap(a.Data) == 0 || cap(b.Data) == 0 {
        +		return false
        +	}
        +
        +	off := offsetComplex(a.Data[:1], b.Data[:1])
        +
        +	if off == 0 {
        +		// At least one element overlaps.
        +		if a.Cols == b.Cols && a.Rows == b.Rows && a.Stride == b.Stride {
        +			panic(regionIdentity)
        +		}
        +		panic(regionOverlap)
        +	}
        +
        +	if off > 0 && len(a.Data) <= off {
        +		// We know a is completely before b.
        +		return false
        +	}
        +	if off < 0 && len(b.Data) <= -off {
        +		// We know a is completely after b.
        +		return false
        +	}
        +
        +	if a.Stride != b.Stride && a.Stride != 1 && b.Stride != 1 {
        +		// Too hard, so assume the worst; if either stride
        +		// is one it will be caught in rectanglesOverlap.
        +		panic(mismatchedStrides)
        +	}
        +
        +	if off < 0 {
        +		off = -off
        +		a.Cols, b.Cols = b.Cols, a.Cols
        +	}
        +	if rectanglesOverlap(off, a.Cols, b.Cols, min(a.Stride, b.Stride)) {
        +		panic(regionOverlap)
        +	}
        +	return false
        +}
        +
        +func (m *CDense) checkOverlapComplex(a cblas128.General) bool {
        +	return checkOverlapComplex(m.RawCMatrix(), a)
        +}
        +
        +func (m *CDense) checkOverlapMatrix(a CMatrix) bool {
        +	if m == a {
        +		return false
        +	}
        +	var amat cblas128.General
        +	switch ar := a.(type) {
        +	default:
        +		return false
        +	case RawCMatrixer:
        +		amat = ar.RawCMatrix()
        +	}
        +	return m.checkOverlapComplex(amat)
        +}
        diff --git a/vendor/gonum.org/v1/gonum/mat/solve.go b/vendor/gonum.org/v1/gonum/mat/solve.go
        index cbf0ed9d9..df62cedcd 100644
        --- a/vendor/gonum.org/v1/gonum/mat/solve.go
        +++ b/vendor/gonum.org/v1/gonum/mat/solve.go
        @@ -24,7 +24,7 @@ func (m *Dense) Solve(a, b Matrix) error {
         	if ar != br {
         		panic(ErrShape)
         	}
        -	m.reuseAs(ac, bc)
        +	m.reuseAsNonZeroed(ac, bc)
         
         	// TODO(btracey): Add special cases for SymDense, etc.
         	aU, aTrans := untranspose(a)
        @@ -91,15 +91,15 @@ func (m *Dense) Solve(a, b Matrix) error {
         		}
         		var lu LU
         		lu.Factorize(a)
        -		return lu.Solve(m, false, b)
        +		return lu.SolveTo(m, false, b)
         	case ar > ac:
         		var qr QR
         		qr.Factorize(a)
        -		return qr.Solve(m, false, b)
        +		return qr.SolveTo(m, false, b)
         	default:
         		var lq LQ
         		lq.Factorize(a)
        -		return lq.Solve(m, false, b)
        +		return lq.SolveTo(m, false, b)
         	}
         }
         
        @@ -121,20 +121,20 @@ func (v *VecDense) SolveVec(a Matrix, b Vector) error {
         		if v != b {
         			v.checkOverlap(bmat)
         		}
        -		v.reuseAs(c)
        +		v.reuseAsNonZeroed(c)
         		m := v.asDense()
         		// We conditionally create bm as m when b and v are identical
         		// to prevent the overlap detection code from identifying m
         		// and bm as overlapping but not identical.
         		bm := m
         		if v != b {
        -			b := VecDense{mat: bmat, n: b.Len()}
        +			b := VecDense{mat: bmat}
         			bm = b.asDense()
         		}
         		return m.Solve(a, bm)
         	}
         
        -	v.reuseAs(c)
        +	v.reuseAsNonZeroed(c)
         	m := v.asDense()
         	return m.Solve(a, b)
         }
        diff --git a/vendor/gonum.org/v1/gonum/mat/svd.go b/vendor/gonum.org/v1/gonum/mat/svd.go
        index 4600f3499..77fd042a8 100644
        --- a/vendor/gonum.org/v1/gonum/mat/svd.go
        +++ b/vendor/gonum.org/v1/gonum/mat/svd.go
        @@ -20,68 +20,106 @@ type SVD struct {
         	vt blas64.General
         }
         
        -// Factorize computes the singular value decomposition (SVD) of the input matrix
        -// A. The singular values of A are computed in all cases, while the singular
        +// SVDKind specifies the treatment of singular vectors during an SVD
        +// factorization.
        +type SVDKind int
        +
        +const (
        +	// SVDNone specifies that no singular vectors should be computed during
        +	// the decomposition.
        +	SVDNone SVDKind = 0
        +
        +	// SVDThinU specifies the thin decomposition for U should be computed.
        +	SVDThinU SVDKind = 1 << (iota - 1)
        +	// SVDFullU specifies the full decomposition for U should be computed.
        +	SVDFullU
        +	// SVDThinV specifies the thin decomposition for V should be computed.
        +	SVDThinV
        +	// SVDFullV specifies the full decomposition for V should be computed.
        +	SVDFullV
        +
        +	// SVDThin is a convenience value for computing both thin vectors.
        +	SVDThin SVDKind = SVDThinU | SVDThinV
        +	// SVDFull is a convenience value for computing both full vectors.
        +	SVDFull SVDKind = SVDFullU | SVDFullV
        +)
        +
        +// succFact returns whether the receiver contains a successful factorization.
        +func (svd *SVD) succFact() bool {
        +	return len(svd.s) != 0
        +}
        +
        +// Factorize computes the singular value decomposition (SVD) of the input matrix A.
        +// The singular values of A are computed in all cases, while the singular
         // vectors are optionally computed depending on the input kind.
         //
        -// The full singular value decomposition (kind == SVDFull) deconstructs A as
        -//  A = U * Σ * V^T
        -// where Σ is an m×n diagonal matrix of singular values, U is an m×m unitary
        -// matrix of left singular vectors, and V is an n×n matrix of right singular vectors.
        +// The full singular value decomposition (kind == SVDFull) is a factorization
        +// of an m×n matrix A of the form
        +//  A = U * Σ * Vᵀ
        +// where Σ is an m×n diagonal matrix, U is an m×m orthogonal matrix, and V is an
        +// n×n orthogonal matrix. The diagonal elements of Σ are the singular values of A.
        +// The first min(m,n) columns of U and V are, respectively, the left and right
        +// singular vectors of A.
         //
        -// It is frequently not necessary to compute the full SVD. Computation time and
        -// storage costs can be reduced using the appropriate kind. Only the singular
        -// values can be computed (kind == SVDNone), or a "thin" representation of the
        -// singular vectors (kind = SVDThin). The thin representation can save a significant
        -// amount of memory if m >> n.
        +// Significant storage space can be saved by using the thin representation of
        +// the SVD (kind == SVDThin) instead of the full SVD, especially if
        +// m >> n or m << n. The thin SVD finds
        +//  A = U~ * Σ * V~ᵀ
        +// where U~ is of size m×min(m,n), Σ is a diagonal matrix of size min(m,n)×min(m,n)
        +// and V~ is of size n×min(m,n).
         //
         // Factorize returns whether the decomposition succeeded. If the decomposition
         // failed, routines that require a successful factorization will panic.
         func (svd *SVD) Factorize(a Matrix, kind SVDKind) (ok bool) {
        +	// kill previous factorization
        +	svd.s = svd.s[:0]
        +	svd.kind = kind
        +
         	m, n := a.Dims()
         	var jobU, jobVT lapack.SVDJob
        -	switch kind {
        -	default:
        -		panic("svd: bad input kind")
        -	case SVDNone:
        -		jobU = lapack.SVDNone
        -		jobVT = lapack.SVDNone
        -	case SVDFull:
        -		// TODO(btracey): This code should be modified to have the smaller
        -		// matrix written in-place into aCopy when the lapack/native/dgesvd
        -		// implementation is complete.
        +
        +	// TODO(btracey): This code should be modified to have the smaller
        +	// matrix written in-place into aCopy when the lapack/native/dgesvd
        +	// implementation is complete.
        +	switch {
        +	case kind&SVDFullU != 0:
        +		jobU = lapack.SVDAll
         		svd.u = blas64.General{
         			Rows:   m,
         			Cols:   m,
         			Stride: m,
         			Data:   use(svd.u.Data, m*m),
         		}
        +	case kind&SVDThinU != 0:
        +		jobU = lapack.SVDStore
        +		svd.u = blas64.General{
        +			Rows:   m,
        +			Cols:   min(m, n),
        +			Stride: min(m, n),
        +			Data:   use(svd.u.Data, m*min(m, n)),
        +		}
        +	default:
        +		jobU = lapack.SVDNone
        +	}
        +	switch {
        +	case kind&SVDFullV != 0:
         		svd.vt = blas64.General{
         			Rows:   n,
         			Cols:   n,
         			Stride: n,
         			Data:   use(svd.vt.Data, n*n),
         		}
        -		jobU = lapack.SVDAll
         		jobVT = lapack.SVDAll
        -	case SVDThin:
        -		// TODO(btracey): This code should be modified to have the larger
        -		// matrix written in-place into aCopy when the lapack/native/dgesvd
        -		// implementation is complete.
        -		svd.u = blas64.General{
        -			Rows:   m,
        -			Cols:   min(m, n),
        -			Stride: min(m, n),
        -			Data:   use(svd.u.Data, m*min(m, n)),
        -		}
        +	case kind&SVDThinV != 0:
         		svd.vt = blas64.General{
         			Rows:   min(m, n),
         			Cols:   n,
         			Stride: n,
         			Data:   use(svd.vt.Data, min(m, n)*n),
         		}
        -		jobU = lapack.SVDStore
         		jobVT = lapack.SVDStore
        +	default:
        +		jobVT = lapack.SVDNone
         	}
         
         	// A is destroyed on call, so copy the matrix.
        @@ -100,31 +138,35 @@ func (svd *SVD) Factorize(a Matrix, kind SVDKind) (ok bool) {
         	return ok
         }
         
        -// Kind returns the matrix.SVDKind of the decomposition. If no decomposition has been
        -// computed, Kind returns 0.
        +// Kind returns the SVDKind of the decomposition. If no decomposition has been
        +// computed, Kind returns -1.
         func (svd *SVD) Kind() SVDKind {
        +	if !svd.succFact() {
        +		return -1
        +	}
         	return svd.kind
         }
         
         // Cond returns the 2-norm condition number for the factorized matrix. Cond will
         // panic if the receiver does not contain a successful factorization.
         func (svd *SVD) Cond() float64 {
        -	if svd.kind == 0 {
        -		panic("svd: no decomposition computed")
        +	if !svd.succFact() {
        +		panic(badFact)
         	}
         	return svd.s[0] / svd.s[len(svd.s)-1]
         }
         
        -// Values returns the singular values of the factorized matrix in decreasing order.
        -// If the input slice is non-nil, the values will be stored in-place into the slice.
        -// In this case, the slice must have length min(m,n), and Values will panic with
        -// ErrSliceLengthMismatch otherwise. If the input slice is nil,
        -// a new slice of the appropriate length will be allocated and returned.
        +// Values returns the singular values of the factorized matrix in descending order.
        +//
        +// If the input slice is non-nil, the values will be stored in-place into
        +// the slice. In this case, the slice must have length min(m,n), and Values will
        +// panic with ErrSliceLengthMismatch otherwise. If the input slice is nil, a new
        +// slice of the appropriate length will be allocated and returned.
         //
         // Values will panic if the receiver does not contain a successful factorization.
         func (svd *SVD) Values(s []float64) []float64 {
        -	if svd.kind == 0 {
        -		panic("svd: no decomposition computed")
        +	if !svd.succFact() {
        +		panic(badFact)
         	}
         	if s == nil {
         		s = make([]float64, len(svd.s))
        @@ -136,20 +178,32 @@ func (svd *SVD) Values(s []float64) []float64 {
         	return s
         }
         
        -// UTo extracts the matrix U from the singular value decomposition, storing
        -// the result in-place into dst. U is size m×m if svd.Kind() == SVDFull,
        -// of size m×min(m,n) if svd.Kind() == SVDThin, and UTo panics otherwise.
        -func (svd *SVD) UTo(dst *Dense) *Dense {
        +// UTo extracts the matrix U from the singular value decomposition. The first
        +// min(m,n) columns are the left singular vectors and correspond to the singular
        +// values as returned from SVD.Values.
        +//
        +// If dst is empty, UTo will resize dst to be m×m if the full U was computed
        +// and size m×min(m,n) if the thin U was computed. When dst is non-empty, then
        +// UTo will panic if dst is not the appropriate size. UTo will also panic if
        +// the receiver does not contain a successful factorization, or if U was
        +// not computed during factorization.
        +func (svd *SVD) UTo(dst *Dense) {
        +	if !svd.succFact() {
        +		panic(badFact)
        +	}
         	kind := svd.kind
        -	if kind != SVDFull && kind != SVDThin {
        -		panic("mat: improper SVD kind")
        +	if kind&SVDThinU == 0 && kind&SVDFullU == 0 {
        +		panic("svd: u not computed during factorization")
         	}
         	r := svd.u.Rows
         	c := svd.u.Cols
        -	if dst == nil {
        -		dst = NewDense(r, c, nil)
        +	if dst.IsEmpty() {
        +		dst.ReuseAs(r, c)
         	} else {
        -		dst.reuseAs(r, c)
        +		r2, c2 := dst.Dims()
        +		if r != r2 || c != c2 {
        +			panic(ErrShape)
        +		}
         	}
         
         	tmp := &Dense{
        @@ -158,24 +212,34 @@ func (svd *SVD) UTo(dst *Dense) *Dense {
         		capCols: c,
         	}
         	dst.Copy(tmp)
        -
        -	return dst
         }
         
        -// VTo extracts the matrix V from the singular value decomposition, storing
        -// the result in-place into dst. V is size n×n if svd.Kind() == SVDFull,
        -// of size n×min(m,n) if svd.Kind() == SVDThin, and VTo panics otherwise.
        -func (svd *SVD) VTo(dst *Dense) *Dense {
        +// VTo extracts the matrix V from the singular value decomposition. The first
        +// min(m,n) columns are the right singular vectors and correspond to the singular
        +// values as returned from SVD.Values.
        +//
        +// If dst is empty, VTo will resize dst to be n×n if the full V was computed
        +// and size n×min(m,n) if the thin V was computed. When dst is non-empty, then
        +// VTo will panic if dst is not the appropriate size. VTo will also panic if
        +// the receiver does not contain a successful factorization, or if V was
        +// not computed during factorization.
        +func (svd *SVD) VTo(dst *Dense) {
        +	if !svd.succFact() {
        +		panic(badFact)
        +	}
         	kind := svd.kind
        -	if kind != SVDFull && kind != SVDThin {
        -		panic("mat: improper SVD kind")
        +	if kind&SVDThinU == 0 && kind&SVDFullV == 0 {
        +		panic("svd: v not computed during factorization")
         	}
         	r := svd.vt.Rows
         	c := svd.vt.Cols
        -	if dst == nil {
        -		dst = NewDense(c, r, nil)
        +	if dst.IsEmpty() {
        +		dst.ReuseAs(c, r)
         	} else {
        -		dst.reuseAs(c, r)
        +		r2, c2 := dst.Dims()
        +		if c != r2 || r != c2 {
        +			panic(ErrShape)
        +		}
         	}
         
         	tmp := &Dense{
        @@ -184,6 +248,4 @@ func (svd *SVD) VTo(dst *Dense) *Dense {
         		capCols: c,
         	}
         	dst.Copy(tmp.T())
        -
        -	return dst
         }
        diff --git a/vendor/gonum.org/v1/gonum/mat/symband.go b/vendor/gonum.org/v1/gonum/mat/symband.go
        index 8763a1bcd..ceefb0916 100644
        --- a/vendor/gonum.org/v1/gonum/mat/symband.go
        +++ b/vendor/gonum.org/v1/gonum/mat/symband.go
        @@ -12,8 +12,11 @@ import (
         var (
         	symBandDense *SymBandDense
         	_            Matrix           = symBandDense
        +	_            allMatrix        = symBandDense
        +	_            denseMatrix      = symBandDense
         	_            Symmetric        = symBandDense
         	_            Banded           = symBandDense
        +	_            SymBanded        = symBandDense
         	_            RawSymBander     = symBandDense
         	_            MutableSymBanded = symBandDense
         
        @@ -27,11 +30,22 @@ type SymBandDense struct {
         	mat blas64.SymmetricBand
         }
         
        +// SymBanded is a symmetric band matrix interface type.
        +type SymBanded interface {
        +	Banded
        +
        +	// Symmetric returns the number of rows/columns in the matrix.
        +	Symmetric() int
        +
        +	// SymBand returns the number of rows/columns in the matrix, and the size of
        +	// the bandwidth.
        +	SymBand() (n, k int)
        +}
        +
         // MutableSymBanded is a symmetric band matrix interface type that allows elements
         // to be altered.
         type MutableSymBanded interface {
        -	Symmetric
        -	Bandwidth() (kl, ku int)
        +	SymBanded
         	SetSymBand(i, j int, v float64)
         }
         
        @@ -46,7 +60,7 @@ type RawSymBander interface {
         // a new slice is allocated for the backing slice. If len(data) == n*(k+1),
         // data is used as the backing slice, and changes to the elements of the returned
         // SymBandDense will be reflected in data. If neither of these is true, NewSymBandDense
        -// will panic. k must be at least zero and less than n, otherwise NewBandDense will panic.
        +// will panic. k must be at least zero and less than n, otherwise NewSymBandDense will panic.
         //
         // The data must be arranged in row-major order constructed by removing the zeros
         // from the rows outside the band and aligning the diagonals. SymBandDense matrices
        @@ -64,10 +78,13 @@ type RawSymBander interface {
         //    10 11 12
         //    13 14  *
         //    15  *  *
        -// which is passed to NewBandDense as []float64{1, 2, 3, 4, ...} with k=2.
        +// which is passed to NewSymBandDense as []float64{1, 2, ..., 15, *, *, *} with k=2.
         // Only the values in the band portion of the matrix are used.
         func NewSymBandDense(n, k int, data []float64) *SymBandDense {
        -	if n < 0 || k < 0 {
        +	if n <= 0 || k < 0 {
        +		if n == 0 {
        +			panic(ErrZeroLength)
        +		}
         		panic("mat: negative dimension")
         	}
         	if k+1 > n {
        @@ -106,6 +123,12 @@ func (s *SymBandDense) Bandwidth() (kl, ku int) {
         	return s.mat.K, s.mat.K
         }
         
        +// SymBand returns the number of rows/columns in the matrix, and the size of
        +// the bandwidth.
        +func (s *SymBandDense) SymBand() (n, k int) {
        +	return s.mat.N, s.mat.K
        +}
        +
         // T implements the Matrix interface. Symmetric matrices, by definition, are
         // equal to their transpose, and this is a no-op.
         func (s *SymBandDense) T() Matrix {
        @@ -124,6 +147,58 @@ func (s *SymBandDense) RawSymBand() blas64.SymmetricBand {
         	return s.mat
         }
         
        +// SetRawSymBand sets the underlying blas64.SymmetricBand used by the receiver.
        +// Changes to elements in the receiver following the call will be reflected
        +// in the input.
        +//
        +// The supplied SymmetricBand must use blas.Upper storage format.
        +func (s *SymBandDense) SetRawSymBand(mat blas64.SymmetricBand) {
        +	if mat.Uplo != blas.Upper {
        +		panic("mat: blas64.SymmetricBand does not have blas.Upper storage")
        +	}
        +	s.mat = mat
        +}
        +
        +// IsEmpty returns whether the receiver is empty. Empty matrices can be the
        +// receiver for size-restricted operations. The receiver can be emptied using
        +// Reset.
        +func (s *SymBandDense) IsEmpty() bool {
        +	return s.mat.Stride == 0
        +}
        +
        +// Reset empties the matrix so that it can be reused as the
        +// receiver of a dimensionally restricted operation.
        +//
        +// Reset should not be used when the matrix shares backing data.
        +// See the Reseter interface for more information.
        +func (s *SymBandDense) Reset() {
        +	s.mat.N = 0
        +	s.mat.K = 0
        +	s.mat.Stride = 0
        +	s.mat.Uplo = 0
        +	s.mat.Data = s.mat.Data[:0:0]
        +}
        +
        +// Zero sets all of the matrix elements to zero.
        +func (s *SymBandDense) Zero() {
        +	for i := 0; i < s.mat.N; i++ {
        +		u := min(1+s.mat.K, s.mat.N-i)
        +		zero(s.mat.Data[i*s.mat.Stride : i*s.mat.Stride+u])
        +	}
        +}
        +
        +// DiagView returns the diagonal as a matrix backed by the original data.
        +func (s *SymBandDense) DiagView() Diagonal {
        +	n := s.mat.N
        +	return &DiagDense{
        +		mat: blas64.Vector{
        +			N:    n,
        +			Inc:  s.mat.Stride,
        +			Data: s.mat.Data[:(n-1)*s.mat.Stride+1],
        +		},
        +	}
        +}
        +
         // DoNonZero calls the function fn for each of the non-zero elements of s. The function fn
         // takes a row/column index and the element value of s at (i, j).
         func (s *SymBandDense) DoNonZero(fn func(i, j int, v float64)) {
        @@ -166,3 +241,40 @@ func (s *SymBandDense) DoColNonZero(j int, fn func(i, j int, v float64)) {
         		}
         	}
         }
        +
        +// Trace returns the trace.
        +func (s *SymBandDense) Trace() float64 {
        +	rb := s.RawSymBand()
        +	var tr float64
        +	for i := 0; i < rb.N; i++ {
        +		tr += rb.Data[i*rb.Stride]
        +	}
        +	return tr
        +}
        +
        +// MulVecTo computes S⋅x storing the result into dst.
        +func (s *SymBandDense) MulVecTo(dst *VecDense, _ bool, x Vector) {
        +	n := s.mat.N
        +	if x.Len() != n {
        +		panic(ErrShape)
        +	}
        +	dst.reuseAsNonZeroed(n)
        +
        +	xMat, _ := untransposeExtract(x)
        +	if xVec, ok := xMat.(*VecDense); ok {
        +		if dst != xVec {
        +			dst.checkOverlap(xVec.mat)
        +			blas64.Sbmv(1, s.mat, xVec.mat, 0, dst.mat)
        +		} else {
        +			xCopy := getWorkspaceVec(n, false)
        +			xCopy.CloneVec(xVec)
        +			blas64.Sbmv(1, s.mat, xCopy.mat, 0, dst.mat)
        +			putWorkspaceVec(xCopy)
        +		}
        +	} else {
        +		xCopy := getWorkspaceVec(n, false)
        +		xCopy.CloneVec(x)
        +		blas64.Sbmv(1, s.mat, xCopy.mat, 0, dst.mat)
        +		putWorkspaceVec(xCopy)
        +	}
        +}
        diff --git a/vendor/gonum.org/v1/gonum/mat/symmetric.go b/vendor/gonum.org/v1/gonum/mat/symmetric.go
        index d3ac26177..6707fd57c 100644
        --- a/vendor/gonum.org/v1/gonum/mat/symmetric.go
        +++ b/vendor/gonum.org/v1/gonum/mat/symmetric.go
        @@ -15,6 +15,8 @@ var (
         	symDense *SymDense
         
         	_ Matrix           = symDense
        +	_ allMatrix        = symDense
        +	_ denseMatrix      = symDense
         	_ Symmetric        = symDense
         	_ RawSymmetricer   = symDense
         	_ MutableSymmetric = symDense
        @@ -55,12 +57,16 @@ type MutableSymmetric interface {
         // a new slice is allocated for the backing slice. If len(data) == n*n, data is
         // used as the backing slice, and changes to the elements of the returned SymDense
         // will be reflected in data. If neither of these is true, NewSymDense will panic.
        +// NewSymDense will panic if n is zero.
         //
         // The data must be arranged in row-major order, i.e. the (i*c + j)-th
         // element in the data slice is the {i, j}-th element in the matrix.
         // Only the values in the upper triangular portion of the matrix are used.
         func NewSymDense(n int, data []float64) *SymDense {
        -	if n < 0 {
        +	if n <= 0 {
        +		if n == 0 {
        +			panic(ErrZeroLength)
        +		}
         		panic("mat: negative dimension")
         	}
         	if data != nil && n*n != len(data) {
        @@ -90,12 +96,13 @@ func (s *SymDense) Caps() (r, c int) {
         	return s.cap, s.cap
         }
         
        -// T implements the Matrix interface. Symmetric matrices, by definition, are
        -// equal to their transpose, and this is a no-op.
        +// T returns the receiver, the transpose of a symmetric matrix.
         func (s *SymDense) T() Matrix {
         	return s
         }
         
        +// Symmetric implements the Symmetric interface and returns the number of rows
        +// and columns in the matrix.
         func (s *SymDense) Symmetric() int {
         	return s.mat.N
         }
        @@ -108,18 +115,21 @@ func (s *SymDense) RawSymmetric() blas64.Symmetric {
         
         // SetRawSymmetric sets the underlying blas64.Symmetric used by the receiver.
         // Changes to elements in the receiver following the call will be reflected
        -// in b. SetRawSymmetric will panic if b is not an upper-encoded symmetric
        -// matrix.
        -func (s *SymDense) SetRawSymmetric(b blas64.Symmetric) {
        -	if b.Uplo != blas.Upper {
        +// in the input.
        +//
        +// The supplied Symmetric must use blas.Upper storage format.
        +func (s *SymDense) SetRawSymmetric(mat blas64.Symmetric) {
        +	if mat.Uplo != blas.Upper {
         		panic(badSymTriangle)
         	}
        -	s.mat = b
        +	s.cap = mat.N
        +	s.mat = mat
         }
         
        -// Reset zeros the dimensions of the matrix so that it can be reused as the
        +// Reset empties the matrix so that it can be reused as the
         // receiver of a dimensionally restricted operation.
         //
        +// Reset should not be used when the matrix shares backing data.
         // See the Reseter interface for more information.
         func (s *SymDense) Reset() {
         	// N and Stride must be zeroed in unison.
        @@ -127,24 +137,54 @@ func (s *SymDense) Reset() {
         	s.mat.Data = s.mat.Data[:0]
         }
         
        -// IsZero returns whether the receiver is zero-sized. Zero-sized matrices can be the
        -// receiver for size-restricted operations. SymDense matrices can be zeroed using Reset.
        -func (s *SymDense) IsZero() bool {
        +// ReuseAsSym changes the receiver if it IsEmpty() to be of size n×n.
        +//
        +// ReuseAsSym re-uses the backing data slice if it has sufficient capacity,
        +// otherwise a new slice is allocated. The backing data is zero on return.
        +//
        +// ReuseAsSym panics if the receiver is not empty, and panics if
        +// the input size is less than one. To empty the receiver for re-use,
        +// Reset should be used.
        +func (s *SymDense) ReuseAsSym(n int) {
        +	if n <= 0 {
        +		if n == 0 {
        +			panic(ErrZeroLength)
        +		}
        +		panic(ErrNegativeDimension)
        +	}
        +	if !s.IsEmpty() {
        +		panic(ErrReuseNonEmpty)
        +	}
        +	s.reuseAsZeroed(n)
        +}
        +
        +// Zero sets all of the matrix elements to zero.
        +func (s *SymDense) Zero() {
        +	for i := 0; i < s.mat.N; i++ {
        +		zero(s.mat.Data[i*s.mat.Stride+i : i*s.mat.Stride+s.mat.N])
        +	}
        +}
        +
        +// IsEmpty returns whether the receiver is empty. Empty matrices can be the
        +// receiver for size-restricted operations. The receiver can be emptied using
        +// Reset.
        +func (s *SymDense) IsEmpty() bool {
         	// It must be the case that m.Dims() returns
         	// zeros in this case. See comment in Reset().
         	return s.mat.N == 0
         }
         
        -// reuseAs resizes an empty matrix to a n×n matrix,
        +// reuseAsNonZeroed resizes an empty matrix to a n×n matrix,
         // or checks that a non-empty matrix is n×n.
        -func (s *SymDense) reuseAs(n int) {
        +func (s *SymDense) reuseAsNonZeroed(n int) {
        +	// reuseAsNonZeroed must be kept in sync with reuseAsZeroed.
         	if n == 0 {
         		panic(ErrZeroLength)
         	}
         	if s.mat.N > s.cap {
         		panic(badSymCap)
         	}
        -	if s.IsZero() {
        +	if s.IsEmpty() {
         		s.mat = blas64.Symmetric{
         			N:      n,
         			Stride: n,
        @@ -162,6 +202,36 @@ func (s *SymDense) reuseAs(n int) {
         	}
         }
         
        +// reuseAsNonZeroed resizes an empty matrix to a n×n matrix,
        +// or checks that a non-empty matrix is n×n. It then zeros the
        +// elements of the matrix.
        +func (s *SymDense) reuseAsZeroed(n int) {
        +	// reuseAsZeroed must be kept in sync with reuseAsNonZeroed.
        +	if n == 0 {
        +		panic(ErrZeroLength)
        +	}
        +	if s.mat.N > s.cap {
        +		panic(badSymCap)
        +	}
        +	if s.IsEmpty() {
        +		s.mat = blas64.Symmetric{
        +			N:      n,
        +			Stride: n,
        +			Data:   useZeroed(s.mat.Data, n*n),
        +			Uplo:   blas.Upper,
        +		}
        +		s.cap = n
        +		return
        +	}
        +	if s.mat.Uplo != blas.Upper {
        +		panic(badSymTriangle)
        +	}
        +	if s.mat.N != n {
        +		panic(ErrShape)
        +	}
        +	s.Zero()
        +}
        +
         func (s *SymDense) isolatedWorkspace(a Symmetric) (w *SymDense, restore func()) {
         	n := a.Symmetric()
         	if n == 0 {
        @@ -174,12 +244,24 @@ func (s *SymDense) isolatedWorkspace(a Symmetric) (w *SymDense, restore func())
         	}
         }
         
        +// DiagView returns the diagonal as a matrix backed by the original data.
        +func (s *SymDense) DiagView() Diagonal {
        +	n := s.mat.N
        +	return &DiagDense{
        +		mat: blas64.Vector{
        +			N:    n,
        +			Inc:  s.mat.Stride + 1,
        +			Data: s.mat.Data[:(n-1)*s.mat.Stride+n],
        +		},
        +	}
        +}
        +
         func (s *SymDense) AddSym(a, b Symmetric) {
         	n := a.Symmetric()
         	if n != b.Symmetric() {
         		panic(ErrShape)
         	}
        -	s.reuseAs(n)
        +	s.reuseAsNonZeroed(n)
         
         	if a, ok := a.(RawSymmetricer); ok {
         		if b, ok := b.(RawSymmetricer); ok {
        @@ -237,15 +319,15 @@ func (s *SymDense) CopySym(a Symmetric) int {
         	return n
         }
         
        -// SymRankOne performs a symetric rank-one update to the matrix a and stores
        -// the result in the receiver
        -//  s = a + alpha * x * x'
        +// SymRankOne performs a symmetric rank-one update to the matrix a with x,
        +// which is treated as a column vector, and stores the result in the receiver
        +//  s = a + alpha * x * xᵀ
         func (s *SymDense) SymRankOne(a Symmetric, alpha float64, x Vector) {
        -	n, c := x.Dims()
        -	if a.Symmetric() != n || c != 1 {
        +	n := x.Len()
        +	if a.Symmetric() != n {
         		panic(ErrShape)
         	}
        -	s.reuseAs(n)
        +	s.reuseAsNonZeroed(n)
         
         	if s != a {
         		if rs, ok := a.(RawSymmetricer); ok {
        @@ -254,10 +336,11 @@ func (s *SymDense) SymRankOne(a Symmetric, alpha float64, x Vector) {
         		s.CopySym(a)
         	}
         
        -	xU, _ := untranspose(x)
        -	if rv, ok := xU.(RawVectorer); ok {
        -		xmat := rv.RawVector()
        -		s.checkOverlap((&VecDense{mat: xmat, n: n}).asGeneral())
        +	xU, _ := untransposeExtract(x)
        +	if rv, ok := xU.(*VecDense); ok {
        +		r, c := xU.Dims()
        +		xmat := rv.mat
        +		s.checkOverlap(generalFromVector(xmat, r, c))
         		blas64.Syr(alpha, xmat, s.mat)
         		return
         	}
        @@ -278,10 +361,10 @@ func (s *SymDense) SymRankK(a Symmetric, alpha float64, x Matrix) {
         	if r != n {
         		panic(ErrShape)
         	}
        -	xMat, aTrans := untranspose(x)
        +	xMat, aTrans := untransposeExtract(x)
         	var g blas64.General
        -	if rm, ok := xMat.(RawMatrixer); ok {
        -		g = rm.RawMatrix()
        +	if rm, ok := xMat.(*Dense); ok {
        +		g = rm.mat
         	} else {
         		g = DenseCopyOf(x).mat
         		aTrans = false
        @@ -290,7 +373,7 @@ func (s *SymDense) SymRankK(a Symmetric, alpha float64, x Matrix) {
         		if rs, ok := a.(RawSymmetricer); ok {
         			s.checkOverlap(generalFromSymmetric(rs.RawSymmetric()))
         		}
        -		s.reuseAs(n)
        +		s.reuseAsNonZeroed(n)
         		s.CopySym(a)
         	}
         	t := blas.NoTrans
        @@ -308,7 +391,7 @@ func (s *SymDense) SymRankK(a Symmetric, alpha float64, x Matrix) {
         func (s *SymDense) SymOuterK(alpha float64, x Matrix) {
         	n, _ := x.Dims()
         	switch {
        -	case s.IsZero():
        +	case s.IsEmpty():
         		s.mat = blas64.Symmetric{
         			N:      n,
         			Stride: n,
        @@ -346,17 +429,16 @@ func (s *SymDense) SymOuterK(alpha float64, x Matrix) {
         	}
         }
         
        -// RankTwo performs a symmmetric rank-two update to the matrix a and stores
        -// the result in the receiver
        -//  m = a + alpha * (x * y' + y * x')
        +// RankTwo performs a symmetric rank-two update to the matrix a with the
        +// vectors x and y, which are treated as column vectors, and stores the
        +// result in the receiver
        +//  m = a + alpha * (x * yᵀ + y * xᵀ)
         func (s *SymDense) RankTwo(a Symmetric, alpha float64, x, y Vector) {
         	n := s.mat.N
        -	xr, xc := x.Dims()
        -	if xr != n || xc != 1 {
        +	if x.Len() != n {
         		panic(ErrShape)
         	}
        -	yr, yc := y.Dims()
        -	if yr != n || yc != 1 {
        +	if y.Len() != n {
         		panic(ErrShape)
         	}
         
        @@ -368,17 +450,19 @@ func (s *SymDense) RankTwo(a Symmetric, alpha float64, x, y Vector) {
         
         	var xmat, ymat blas64.Vector
         	fast := true
        -	xU, _ := untranspose(x)
        -	if rv, ok := xU.(RawVectorer); ok {
        -		xmat = rv.RawVector()
        -		s.checkOverlap((&VecDense{mat: xmat, n: x.Len()}).asGeneral())
        +	xU, _ := untransposeExtract(x)
        +	if rv, ok := xU.(*VecDense); ok {
        +		r, c := xU.Dims()
        +		xmat = rv.mat
        +		s.checkOverlap(generalFromVector(xmat, r, c))
         	} else {
         		fast = false
         	}
        -	yU, _ := untranspose(y)
        -	if rv, ok := yU.(RawVectorer); ok {
        -		ymat = rv.RawVector()
        -		s.checkOverlap((&VecDense{mat: ymat, n: y.Len()}).asGeneral())
        +	yU, _ := untransposeExtract(y)
        +	if rv, ok := yU.(*VecDense); ok {
        +		r, c := yU.Dims()
        +		ymat = rv.mat
        +		s.checkOverlap(generalFromVector(ymat, r, c))
         	} else {
         		fast = false
         	}
        @@ -387,13 +471,13 @@ func (s *SymDense) RankTwo(a Symmetric, alpha float64, x, y Vector) {
         		if rs, ok := a.(RawSymmetricer); ok {
         			s.checkOverlap(generalFromSymmetric(rs.RawSymmetric()))
         		}
        -		s.reuseAs(n)
        +		s.reuseAsNonZeroed(n)
         		s.CopySym(a)
         	}
         
         	if fast {
         		if s != a {
        -			s.reuseAs(n)
        +			s.reuseAsNonZeroed(n)
         			s.CopySym(a)
         		}
         		blas64.Syr2(alpha, xmat, ymat, s.mat)
        @@ -401,7 +485,7 @@ func (s *SymDense) RankTwo(a Symmetric, alpha float64, x, y Vector) {
         	}
         
         	for i := 0; i < n; i++ {
        -		s.reuseAs(n)
        +		s.reuseAsNonZeroed(n)
         		for j := i; j < n; j++ {
         			s.set(i, j, a.At(i, j)+alpha*(x.AtVec(i)*y.AtVec(j)+y.AtVec(i)*x.AtVec(j)))
         		}
        @@ -411,7 +495,7 @@ func (s *SymDense) RankTwo(a Symmetric, alpha float64, x, y Vector) {
         // ScaleSym multiplies the elements of a by f, placing the result in the receiver.
         func (s *SymDense) ScaleSym(f float64, a Symmetric) {
         	n := a.Symmetric()
        -	s.reuseAs(n)
        +	s.reuseAsNonZeroed(n)
         	if a, ok := a.(RawSymmetricer); ok {
         		amat := a.RawSymmetric()
         		if s != a {
        @@ -439,7 +523,7 @@ func (s *SymDense) ScaleSym(f float64, a Symmetric) {
         func (s *SymDense) SubsetSym(a Symmetric, set []int) {
         	n := len(set)
         	na := a.Symmetric()
        -	s.reuseAs(n)
        +	s.reuseAsNonZeroed(n)
         	var restore func()
         	if a == s {
         		s, restore = s.isolatedWorkspace(a)
        @@ -473,12 +557,16 @@ func (s *SymDense) SubsetSym(a Symmetric, set []int) {
         	}
         }
         
        -// SliceSquare returns a new Matrix that shares backing data with the receiver.
        +// SliceSym returns a new Matrix that shares backing data with the receiver.
         // The returned matrix starts at {i,i} of the receiver and extends k-i rows
         // and columns. The final row and column in the resulting matrix is k-1.
        -// SliceSquare panics with ErrIndexOutOfRange if the slice is outside the capacity
        -// of the receiver.
        -func (s *SymDense) SliceSquare(i, k int) Matrix {
        +// SliceSym panics with ErrIndexOutOfRange if the slice is outside the
        +// capacity of the receiver.
        +func (s *SymDense) SliceSym(i, k int) Symmetric {
        +	return s.sliceSym(i, k)
        +}
        +
        +func (s *SymDense) sliceSym(i, k int) *SymDense {
         	sz := s.cap
         	if i < 0 || sz < i || k < i || sz < k {
         		panic(ErrIndexOutOfRange)
        @@ -490,11 +578,21 @@ func (s *SymDense) SliceSquare(i, k int) Matrix {
         	return &v
         }
         
        -// GrowSquare returns the receiver expanded by n rows and n columns. If the
        +// Trace returns the trace of the matrix.
        +func (s *SymDense) Trace() float64 {
        +	// TODO(btracey): could use internal asm sum routine.
        +	var v float64
        +	for i := 0; i < s.mat.N; i++ {
        +		v += s.mat.Data[i*s.mat.Stride+i]
        +	}
        +	return v
        +}
        +
        +// GrowSym returns the receiver expanded by n rows and n columns. If the
         // dimensions of the expanded matrix are outside the capacity of the receiver
         // a new allocation is made, otherwise not. Note that the receiver itself is
         // not modified during the call to GrowSquare.
        -func (s *SymDense) GrowSquare(n int) Matrix {
        +func (s *SymDense) GrowSym(n int) Symmetric {
         	if n < 0 {
         		panic(ErrIndexOutOfRange)
         	}
        @@ -536,11 +634,11 @@ func (s *SymDense) GrowSquare(n int) Matrix {
         
         // PowPSD computes a^pow where a is a positive symmetric definite matrix.
         //
        -// PowPSD returns an error if the matrix is not  not positive symmetric definite
        -// or the Eigendecomposition is not successful.
        +// PowPSD returns an error if the matrix is not not positive symmetric definite
        +// or the Eigen decomposition is not successful.
         func (s *SymDense) PowPSD(a Symmetric, pow float64) error {
         	dim := a.Symmetric()
        -	s.reuseAs(dim)
        +	s.reuseAsNonZeroed(dim)
         
         	var eigen EigenSym
         	ok := eigen.Factorize(a, true)
        @@ -555,7 +653,7 @@ func (s *SymDense) PowPSD(a Symmetric, pow float64) error {
         		values[i] = math.Pow(v, pow)
         	}
         	var u Dense
        -	u.EigenvectorsSym(&eigen)
        +	eigen.VectorsTo(&u)
         
         	s.SymOuterK(values[0], u.ColView(0))
         
        diff --git a/vendor/gonum.org/v1/gonum/mat/triangular.go b/vendor/gonum.org/v1/gonum/mat/triangular.go
        index c4446b559..89c4e9d06 100644
        --- a/vendor/gonum.org/v1/gonum/mat/triangular.go
        +++ b/vendor/gonum.org/v1/gonum/mat/triangular.go
        @@ -15,6 +15,8 @@ import (
         var (
         	triDense *TriDense
         	_        Matrix            = triDense
        +	_        allMatrix         = triDense
        +	_        denseMatrix       = triDense
         	_        Triangular        = triDense
         	_        RawTriangular     = triDense
         	_        MutableTriangular = triDense
        @@ -36,7 +38,7 @@ type TriDense struct {
         // Triangular represents a triangular matrix. Triangular matrices are always square.
         type Triangular interface {
         	Matrix
        -	// Triangular returns the number of rows/columns in the matrix and its
        +	// Triangle returns the number of rows/columns in the matrix and its
         	// orientation.
         	Triangle() (n int, kind TriKind)
         
        @@ -45,7 +47,9 @@ type Triangular interface {
         	TTri() Triangular
         }
         
        -// A RawTriangular can return a view of itself as a BLAS Triangular matrix.
        +// A RawTriangular can return a blas64.Triangular representation of the receiver.
        +// Changes to the blas64.Triangular.Data slice will be reflected in the original
        +// matrix, changes to the N, Stride, Uplo and Diag fields will not.
         type RawTriangular interface {
         	RawTriangular() blas64.Triangular
         }
        @@ -111,12 +115,16 @@ func (t TransposeTri) UntransposeTri() Triangular {
         // a new slice is allocated for the backing slice. If len(data) == n*n, data is
         // used as the backing slice, and changes to the elements of the returned TriDense
         // will be reflected in data. If neither of these is true, NewTriDense will panic.
        +// NewTriDense will panic if n is zero.
         //
         // The data must be arranged in row-major order, i.e. the (i*c + j)-th
         // element in the data slice is the {i, j}-th element in the matrix.
         // Only the values in the triangular portion corresponding to kind are used.
         func NewTriDense(n int, kind TriKind, data []float64) *TriDense {
        -	if n < 0 {
        +	if n <= 0 {
        +		if n == 0 {
        +			panic(ErrZeroLength)
        +		}
         		panic("mat: negative dimension")
         	}
         	if data != nil && len(data) != n*n {
        @@ -146,9 +154,9 @@ func (t *TriDense) Dims() (r, c int) {
         }
         
         // Triangle returns the dimension of t and its orientation. The returned
        -// orientation is only valid when n is not zero.
        +// orientation is only valid when n is not empty.
         func (t *TriDense) Triangle() (n int, kind TriKind) {
        -	return t.mat.N, TriKind(!t.IsZero()) && t.triKind()
        +	return t.mat.N, t.triKind()
         }
         
         func (t *TriDense) isUpper() bool {
        @@ -200,9 +208,23 @@ func (t *TriDense) RawTriangular() blas64.Triangular {
         	return t.mat
         }
         
        -// Reset zeros the dimensions of the matrix so that it can be reused as the
        +// SetRawTriangular sets the underlying blas64.Triangular used by the receiver.
        +// Changes to elements in the receiver following the call will be reflected
        +// in the input.
        +//
        +// The supplied Triangular must not use blas.Unit storage format.
        +func (t *TriDense) SetRawTriangular(mat blas64.Triangular) {
        +	if mat.Diag == blas.Unit {
        +		panic("mat: cannot set TriDense with Unit storage format")
        +	}
        +	t.cap = mat.N
        +	t.mat = mat
        +}
        +
        +// Reset empties the matrix so that it can be reused as the
         // receiver of a dimensionally restricted operation.
         //
        +// Reset should not be used when the matrix shares backing data.
         // See the Reseter interface for more information.
         func (t *TriDense) Reset() {
         	// N and Stride must be zeroed in unison.
        @@ -213,9 +235,23 @@ func (t *TriDense) Reset() {
         	t.mat.Data = t.mat.Data[:0]
         }
         
        -// IsZero returns whether the receiver is zero-sized. Zero-sized matrices can be the
        -// receiver for size-restricted operations. TriDense matrices can be zeroed using Reset.
        -func (t *TriDense) IsZero() bool {
        +// Zero sets all of the matrix elements to zero.
        +func (t *TriDense) Zero() {
        +	if t.isUpper() {
        +		for i := 0; i < t.mat.N; i++ {
        +			zero(t.mat.Data[i*t.mat.Stride+i : i*t.mat.Stride+t.mat.N])
        +		}
        +		return
        +	}
        +	for i := 0; i < t.mat.N; i++ {
        +		zero(t.mat.Data[i*t.mat.Stride : i*t.mat.Stride+i+1])
        +	}
        +}
        +
        +// IsEmpty returns whether the receiver is empty. Empty matrices can be the
        +// receiver for size-restricted operations. The receiver can be emptied using
        +// Reset.
        +func (t *TriDense) IsEmpty() bool {
         	// It must be the case that t.Dims() returns
         	// zeros in this case. See comment in Reset().
         	return t.mat.Stride == 0
        @@ -231,10 +267,32 @@ func untransposeTri(a Triangular) (Triangular, bool) {
         	return a, false
         }
         
        -// reuseAs resizes a zero receiver to an n×n triangular matrix with the given
        -// orientation. If the receiver is non-zero, reuseAs checks that the receiver
        +// ReuseAsTri changes the receiver if it IsEmpty() to be of size n×n.
        +//
        +// ReuseAsTri re-uses the backing data slice if it has sufficient capacity,
        +// otherwise a new slice is allocated. The backing data is zero on return.
        +//
        +// ReuseAsTri panics if the receiver is not empty, and panics if
        +// the input size is less than one. To empty the receiver for re-use,
        +// Reset should be used.
        +func (t *TriDense) ReuseAsTri(n int, kind TriKind) {
        +	if n <= 0 {
        +		if n == 0 {
        +			panic(ErrZeroLength)
        +		}
        +		panic(ErrNegativeDimension)
        +	}
        +	if !t.IsEmpty() {
        +		panic(ErrReuseNonEmpty)
        +	}
        +	t.reuseAsZeroed(n, kind)
        +}
        +
        +// reuseAsNonZeroed resizes a zero receiver to an n×n triangular matrix with the given
        +// orientation. If the receiver is non-zero, reuseAsNonZeroed checks that the receiver
         // is the correct size and orientation.
        -func (t *TriDense) reuseAs(n int, kind TriKind) {
        +func (t *TriDense) reuseAsNonZeroed(n int, kind TriKind) {
        +	// reuseAsNonZeroed must be kept in sync with reuseAsZeroed.
         	if n == 0 {
         		panic(ErrZeroLength)
         	}
        @@ -245,7 +303,7 @@ func (t *TriDense) reuseAs(n int, kind TriKind) {
         	if t.mat.N > t.cap {
         		panic(badTriCap)
         	}
        -	if t.IsZero() {
        +	if t.IsEmpty() {
         		t.mat = blas64.Triangular{
         			N:      n,
         			Stride: n,
        @@ -264,6 +322,41 @@ func (t *TriDense) reuseAs(n int, kind TriKind) {
         	}
         }
         
        +// reuseAsZeroed resizes a zero receiver to an n×n triangular matrix with the given
        +// orientation. If the receiver is non-zero, reuseAsZeroed checks that the receiver
        +// is the correct size and orientation. It then zeros out the matrix data.
        +func (t *TriDense) reuseAsZeroed(n int, kind TriKind) {
        +	// reuseAsZeroed must be kept in sync with reuseAsNonZeroed.
        +	if n == 0 {
        +		panic(ErrZeroLength)
        +	}
        +	ul := blas.Lower
        +	if kind == Upper {
        +		ul = blas.Upper
        +	}
        +	if t.mat.N > t.cap {
        +		panic(badTriCap)
        +	}
        +	if t.IsEmpty() {
        +		t.mat = blas64.Triangular{
        +			N:      n,
        +			Stride: n,
        +			Diag:   blas.NonUnit,
        +			Data:   useZeroed(t.mat.Data, n*n),
        +			Uplo:   ul,
        +		}
        +		t.cap = n
        +		return
        +	}
        +	if t.mat.N != n {
        +		panic(ErrShape)
        +	}
        +	if t.mat.Uplo != ul {
        +		panic(ErrTriangle)
        +	}
        +	t.Zero()
        +}
        +
         // isolatedWorkspace returns a new TriDense matrix w with the size of a and
         // returns a callback to defer which performs cleanup at the return of the call.
         // This should be used when a method receiver is the same pointer as an input argument.
        @@ -279,6 +372,21 @@ func (t *TriDense) isolatedWorkspace(a Triangular) (w *TriDense, restore func())
         	}
         }
         
        +// DiagView returns the diagonal as a matrix backed by the original data.
        +func (t *TriDense) DiagView() Diagonal {
        +	if t.mat.Diag == blas.Unit {
        +		panic("mat: cannot take view of Unit diagonal")
        +	}
        +	n := t.mat.N
        +	return &DiagDense{
        +		mat: blas64.Vector{
        +			N:    n,
        +			Inc:  t.mat.Stride + 1,
        +			Data: t.mat.Data[:(n-1)*t.mat.Stride+n],
        +		},
        +	}
        +}
        +
         // Copy makes a copy of elements of a into the receiver. It is similar to the
         // built-in copy; it copies as much as the overlap between the two matrices and
         // returns the number of rows and columns it copied. Only elements within the
        @@ -348,7 +456,7 @@ func (t *TriDense) Copy(a Matrix) (r, c int) {
         func (t *TriDense) InverseTri(a Triangular) error {
         	t.checkOverlapMatrix(a)
         	n, _ := a.Triangle()
        -	t.reuseAs(a.Triangle())
        +	t.reuseAsNonZeroed(a.Triangle())
         	t.Copy(a)
         	work := getFloats(3*n, false)
         	iwork := getInts(n, false)
        @@ -385,7 +493,7 @@ func (t *TriDense) MulTri(a, b Triangular) {
         	bU, _ := untransposeTri(b)
         	t.checkOverlapMatrix(bU)
         	t.checkOverlapMatrix(aU)
        -	t.reuseAs(n, kind)
        +	t.reuseAsNonZeroed(n, kind)
         	var restore func()
         	if t == aU {
         		t, restore = t.isolatedWorkspace(aU)
        @@ -395,15 +503,39 @@ func (t *TriDense) MulTri(a, b Triangular) {
         		defer restore()
         	}
         
        -	// TODO(btracey): Improve the set of fast-paths.
        +	// Inspect types here, helps keep the loops later clean(er).
        +	_, aDiag := aU.(Diagonal)
        +	_, bDiag := bU.(Diagonal)
        +	// If they are both diagonal only need 1 loop.
        +	// All diagonal matrices are Upper.
        +	// TODO: Add fast paths for DiagDense.
        +	if aDiag && bDiag {
        +		t.Zero()
        +		for i := 0; i < n; i++ {
        +			t.SetTri(i, i, a.At(i, i)*b.At(i, i))
        +		}
        +		return
        +	}
        +
        +	// Now we know at least one matrix is non-diagonal.
        +	// And all diagonal matrices are all Upper.
        +	// The both-diagonal case is handled above.
        +	// TODO: Add fast paths for Dense variants.
         	if kind == Upper {
         		for i := 0; i < n; i++ {
         			for j := i; j < n; j++ {
        -				var v float64
        -				for k := i; k <= j; k++ {
        -					v += a.At(i, k) * b.At(k, j)
        +				switch {
        +				case aDiag:
        +					t.SetTri(i, j, a.At(i, i)*b.At(i, j))
        +				case bDiag:
        +					t.SetTri(i, j, a.At(i, j)*b.At(j, j))
        +				default:
        +					var v float64
        +					for k := i; k <= j; k++ {
        +						v += a.At(i, k) * b.At(k, j)
        +					}
        +					t.SetTri(i, j, v)
         				}
        -				t.SetTri(i, j, v)
         			}
         		}
         		return
        @@ -424,7 +556,7 @@ func (t *TriDense) MulTri(a, b Triangular) {
         // the input, or ScaleTri will panic.
         func (t *TriDense) ScaleTri(f float64, a Triangular) {
         	n, kind := a.Triangle()
        -	t.reuseAs(n, kind)
        +	t.reuseAsNonZeroed(n, kind)
         
         	// TODO(btracey): Improve the set of fast-paths.
         	switch a := a.(type) {
        @@ -468,6 +600,16 @@ func (t *TriDense) ScaleTri(f float64, a Triangular) {
         	}
         }
         
        +// Trace returns the trace of the matrix.
        +func (t *TriDense) Trace() float64 {
        +	// TODO(btracey): could use internal asm sum routine.
        +	var v float64
        +	for i := 0; i < t.mat.N; i++ {
        +		v += t.mat.Data[i*t.mat.Stride+i]
        +	}
        +	return v
        +}
        +
         // copySymIntoTriangle copies a symmetric matrix into a TriDense
         func copySymIntoTriangle(t *TriDense, s Symmetric) {
         	n, upper := t.Triangle()
        diff --git a/vendor/gonum.org/v1/gonum/mat/triband.go b/vendor/gonum.org/v1/gonum/mat/triband.go
        new file mode 100644
        index 000000000..9c26f1964
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/mat/triband.go
        @@ -0,0 +1,371 @@
        +// Copyright ©2018 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package mat
        +
        +import (
        +	"gonum.org/v1/gonum/blas"
        +	"gonum.org/v1/gonum/blas/blas64"
        +)
        +
        +var (
        +	triBand TriBanded
        +	_       Banded     = triBand
        +	_       Triangular = triBand
        +
        +	triBandDense *TriBandDense
        +	_            Matrix           = triBandDense
        +	_            allMatrix        = triBandDense
        +	_            denseMatrix      = triBandDense
        +	_            Triangular       = triBandDense
        +	_            Banded           = triBandDense
        +	_            TriBanded        = triBandDense
        +	_            RawTriBander     = triBandDense
        +	_            MutableTriBanded = triBandDense
        +)
        +
        +// TriBanded is a triangular band matrix interface type.
        +type TriBanded interface {
        +	Banded
        +
        +	// Triangle returns the number of rows/columns in the matrix and its
        +	// orientation.
        +	Triangle() (n int, kind TriKind)
        +
        +	// TTri is the equivalent of the T() method in the Matrix interface but
        +	// guarantees the transpose is of triangular type.
        +	TTri() Triangular
        +
        +	// TriBand returns the number of rows/columns in the matrix, the
        +	// size of the bandwidth, and the orientation.
        +	TriBand() (n, k int, kind TriKind)
        +
        +	// TTriBand is the equivalent of the T() method in the Matrix interface but
        +	// guarantees the transpose is of banded triangular type.
        +	TTriBand() TriBanded
        +}
        +
        +// A RawTriBander can return a blas64.TriangularBand representation of the receiver.
        +// Changes to the blas64.TriangularBand.Data slice will be reflected in the original
        +// matrix, changes to the N, K, Stride, Uplo and Diag fields will not.
        +type RawTriBander interface {
        +	RawTriBand() blas64.TriangularBand
        +}
        +
        +// MutableTriBanded is a triangular band matrix interface type that allows
        +// elements to be altered.
        +type MutableTriBanded interface {
        +	TriBanded
        +	SetTriBand(i, j int, v float64)
        +}
        +
        +var (
        +	tTriBand TransposeTriBand
        +	_        Matrix               = tTriBand
        +	_        TriBanded            = tTriBand
        +	_        Untransposer         = tTriBand
        +	_        UntransposeTrier     = tTriBand
        +	_        UntransposeBander    = tTriBand
        +	_        UntransposeTriBander = tTriBand
        +)
        +
        +// TransposeTriBand is a type for performing an implicit transpose of a TriBanded
        +// matrix. It implements the TriBanded interface, returning values from the
        +// transpose of the matrix within.
        +type TransposeTriBand struct {
        +	TriBanded TriBanded
        +}
        +
        +// At returns the value of the element at row i and column j of the transposed
        +// matrix, that is, row j and column i of the TriBanded field.
        +func (t TransposeTriBand) At(i, j int) float64 {
        +	return t.TriBanded.At(j, i)
        +}
        +
        +// Dims returns the dimensions of the transposed matrix. TriBanded matrices are
        +// square and thus this is the same size as the original TriBanded.
        +func (t TransposeTriBand) Dims() (r, c int) {
        +	c, r = t.TriBanded.Dims()
        +	return r, c
        +}
        +
        +// T performs an implicit transpose by returning the TriBand field.
        +func (t TransposeTriBand) T() Matrix {
        +	return t.TriBanded
        +}
        +
        +// Triangle returns the number of rows/columns in the matrix and its orientation.
        +func (t TransposeTriBand) Triangle() (int, TriKind) {
        +	n, upper := t.TriBanded.Triangle()
        +	return n, !upper
        +}
        +
        +// TTri performs an implicit transpose by returning the TriBand field.
        +func (t TransposeTriBand) TTri() Triangular {
        +	return t.TriBanded
        +}
        +
        +// Bandwidth returns the upper and lower bandwidths of the matrix.
        +func (t TransposeTriBand) Bandwidth() (kl, ku int) {
        +	kl, ku = t.TriBanded.Bandwidth()
        +	return ku, kl
        +}
        +
        +// TBand performs an implicit transpose by returning the TriBand field.
        +func (t TransposeTriBand) TBand() Banded {
        +	return t.TriBanded
        +}
        +
        +// TriBand returns the number of rows/columns in the matrix, the
        +// size of the bandwidth, and the orientation.
        +func (t TransposeTriBand) TriBand() (n, k int, kind TriKind) {
        +	n, k, kind = t.TriBanded.TriBand()
        +	return n, k, !kind
        +}
        +
        +// TTriBand performs an implicit transpose by returning the TriBand field.
        +func (t TransposeTriBand) TTriBand() TriBanded {
        +	return t.TriBanded
        +}
        +
        +// Untranspose returns the Triangular field.
        +func (t TransposeTriBand) Untranspose() Matrix {
        +	return t.TriBanded
        +}
        +
        +// UntransposeTri returns the underlying Triangular matrix.
        +func (t TransposeTriBand) UntransposeTri() Triangular {
        +	return t.TriBanded
        +}
        +
        +// UntransposeBand returns the underlying Banded matrix.
        +func (t TransposeTriBand) UntransposeBand() Banded {
        +	return t.TriBanded
        +}
        +
        +// UntransposeTriBand returns the underlying TriBanded matrix.
        +func (t TransposeTriBand) UntransposeTriBand() TriBanded {
        +	return t.TriBanded
        +}
        +
        +// TriBandDense represents a triangular band matrix in dense storage format.
        +type TriBandDense struct {
        +	mat blas64.TriangularBand
        +}
        +
        +// NewTriBandDense creates a new triangular banded matrix with n rows and columns,
        +// k bands in the direction of the specified kind. If data == nil,
        +// a new slice is allocated for the backing slice. If len(data) == n*(k+1),
        +// data is used as the backing slice, and changes to the elements of the returned
        +// TriBandDense will be reflected in data. If neither of these is true, NewTriBandDense
        +// will panic. k must be at least zero and less than n, otherwise NewTriBandDense will panic.
        +//
        +// The data must be arranged in row-major order constructed by removing the zeros
        +// from the rows outside the band and aligning the diagonals. For example, if
        +// the upper-triangular banded matrix
        +//    1  2  3  0  0  0
        +//    0  4  5  6  0  0
        +//    0  0  7  8  9  0
        +//    0  0  0 10 11 12
        +//    0  0  0 0  13 14
        +//    0  0  0 0  0  15
        +// becomes (* entries are never accessed)
        +//     1  2  3
        +//     4  5  6
        +//     7  8  9
        +//    10 11 12
        +//    13 14  *
        +//    15  *  *
        +// which is passed to NewTriBandDense as []float64{1, 2, ..., 15, *, *, *}
        +// with k=2 and kind = mat.Upper.
        +// The lower triangular banded matrix
        +//    1  0  0  0  0  0
        +//    2  3  0  0  0  0
        +//    4  5  6  0  0  0
        +//    0  7  8  9  0  0
        +//    0  0 10 11 12  0
        +//    0  0  0 13 14 15
        +// becomes (* entries are never accessed)
        +//     *  *  1
        +//     *  2  3
        +//     4  5  6
        +//     7  8  9
        +//    10 11 12
        +//    13 14 15
        +// which is passed to NewTriBandDense as []float64{*, *, *, 1, 2, ..., 15}
        +// with k=2 and kind = mat.Lower.
        +// Only the values in the band portion of the matrix are used.
        +func NewTriBandDense(n, k int, kind TriKind, data []float64) *TriBandDense {
        +	if n <= 0 || k < 0 {
        +		if n == 0 {
        +			panic(ErrZeroLength)
        +		}
        +		panic("mat: negative dimension")
        +	}
        +	if k+1 > n {
        +		panic("mat: band out of range")
        +	}
        +	bc := k + 1
        +	if data != nil && len(data) != n*bc {
        +		panic(ErrShape)
        +	}
        +	if data == nil {
        +		data = make([]float64, n*bc)
        +	}
        +	uplo := blas.Lower
        +	if kind {
        +		uplo = blas.Upper
        +	}
        +	return &TriBandDense{
        +		mat: blas64.TriangularBand{
        +			Uplo:   uplo,
        +			Diag:   blas.NonUnit,
        +			N:      n,
        +			K:      k,
        +			Data:   data,
        +			Stride: bc,
        +		},
        +	}
        +}
        +
        +// Dims returns the number of rows and columns in the matrix.
        +func (t *TriBandDense) Dims() (r, c int) {
        +	return t.mat.N, t.mat.N
        +}
        +
        +// T performs an implicit transpose by returning the receiver inside a Transpose.
        +func (t *TriBandDense) T() Matrix {
        +	return Transpose{t}
        +}
        +
        +// IsEmpty returns whether the receiver is empty. Empty matrices can be the
        +// receiver for size-restricted operations. The receiver can be emptied using
        +// Reset.
        +func (t *TriBandDense) IsEmpty() bool {
        +	// It must be the case that t.Dims() returns
        +	// zeros in this case. See comment in Reset().
        +	return t.mat.Stride == 0
        +}
        +
        +// Reset empties the matrix so that it can be reused as the
        +// receiver of a dimensionally restricted operation.
        +//
        +// Reset should not be used when the matrix shares backing data.
        +// See the Reseter interface for more information.
        +func (t *TriBandDense) Reset() {
        +	t.mat.N = 0
        +	t.mat.Stride = 0
        +	t.mat.K = 0
        +	t.mat.Data = t.mat.Data[:0]
        +}
        +
        +// Zero sets all of the matrix elements to zero.
        +func (t *TriBandDense) Zero() {
        +	if t.isUpper() {
        +		for i := 0; i < t.mat.N; i++ {
        +			u := min(1+t.mat.K, t.mat.N-i)
        +			zero(t.mat.Data[i*t.mat.Stride : i*t.mat.Stride+u])
        +		}
        +		return
        +	}
        +	for i := 0; i < t.mat.N; i++ {
        +		l := max(0, t.mat.K-i)
        +		zero(t.mat.Data[i*t.mat.Stride+l : i*t.mat.Stride+t.mat.K+1])
        +	}
        +}
        +
        +func (t *TriBandDense) isUpper() bool {
        +	return isUpperUplo(t.mat.Uplo)
        +}
        +
        +func (t *TriBandDense) triKind() TriKind {
        +	return TriKind(isUpperUplo(t.mat.Uplo))
        +}
        +
        +// Triangle returns the dimension of t and its orientation. The returned
        +// orientation is only valid when n is not zero.
        +func (t *TriBandDense) Triangle() (n int, kind TriKind) {
        +	return t.mat.N, t.triKind()
        +}
        +
        +// TTri performs an implicit transpose by returning the receiver inside a TransposeTri.
        +func (t *TriBandDense) TTri() Triangular {
        +	return TransposeTri{t}
        +}
        +
        +// Bandwidth returns the upper and lower bandwidths of the matrix.
        +func (t *TriBandDense) Bandwidth() (kl, ku int) {
        +	if t.isUpper() {
        +		return 0, t.mat.K
        +	}
        +	return t.mat.K, 0
        +}
        +
        +// TBand performs an implicit transpose by returning the receiver inside a TransposeBand.
        +func (t *TriBandDense) TBand() Banded {
        +	return TransposeBand{t}
        +}
        +
        +// TriBand returns the number of rows/columns in the matrix, the
        +// size of the bandwidth, and the orientation.
        +func (t *TriBandDense) TriBand() (n, k int, kind TriKind) {
        +	return t.mat.N, t.mat.K, TriKind(!t.IsEmpty()) && t.triKind()
        +}
        +
        +// TTriBand performs an implicit transpose by returning the receiver inside a TransposeTriBand.
        +func (t *TriBandDense) TTriBand() TriBanded {
        +	return TransposeTriBand{t}
        +}
        +
        +// RawTriBand returns the underlying blas64.TriangularBand used by the receiver.
        +// Changes to the blas64.TriangularBand.Data slice will be reflected in the original
        +// matrix, changes to the N, K, Stride, Uplo and Diag fields will not.
        +func (t *TriBandDense) RawTriBand() blas64.TriangularBand {
        +	return t.mat
        +}
        +
        +// SetRawTriBand sets the underlying blas64.TriangularBand used by the receiver.
        +// Changes to elements in the receiver following the call will be reflected
        +// in the input.
        +//
        +// The supplied TriangularBand must not use blas.Unit storage format.
        +func (t *TriBandDense) SetRawTriBand(mat blas64.TriangularBand) {
        +	if mat.Diag == blas.Unit {
        +		panic("mat: cannot set TriBand with Unit storage")
        +	}
        +	t.mat = mat
        +}
        +
        +// DiagView returns the diagonal as a matrix backed by the original data.
        +func (t *TriBandDense) DiagView() Diagonal {
        +	if t.mat.Diag == blas.Unit {
        +		panic("mat: cannot take view of Unit diagonal")
        +	}
        +	n := t.mat.N
        +	data := t.mat.Data
        +	if !t.isUpper() {
        +		data = data[t.mat.K:]
        +	}
        +	return &DiagDense{
        +		mat: blas64.Vector{
        +			N:    n,
        +			Inc:  t.mat.Stride,
        +			Data: data[:(n-1)*t.mat.Stride+1],
        +		},
        +	}
        +}
        +
        +// Trace returns the trace.
        +func (t *TriBandDense) Trace() float64 {
        +	rb := t.RawTriBand()
        +	var tr float64
        +	var offsetIndex int
        +	if rb.Uplo == blas.Lower {
        +		offsetIndex = rb.K
        +	}
        +	for i := 0; i < rb.N; i++ {
        +		tr += rb.Data[offsetIndex+i*rb.Stride]
        +	}
        +	return tr
        +}
        diff --git a/vendor/gonum.org/v1/gonum/mat/vector.go b/vendor/gonum.org/v1/gonum/mat/vector.go
        index ca29e5035..884e5658e 100644
        --- a/vendor/gonum.org/v1/gonum/mat/vector.go
        +++ b/vendor/gonum.org/v1/gonum/mat/vector.go
        @@ -13,9 +13,10 @@ import (
         var (
         	vector *VecDense
         
        -	_ Matrix  = vector
        -	_ Vector  = vector
        -	_ Reseter = vector
        +	_ Matrix    = vector
        +	_ allMatrix = vector
        +	_ Vector    = vector
        +	_ Reseter   = vector
         )
         
         // Vector is a vector.
        @@ -76,7 +77,6 @@ func (t TransposeVec) UntransposeVec() Vector {
         // VecDense represents a column vector.
         type VecDense struct {
         	mat blas64.Vector
        -	n   int
         	// A BLAS vector can have a negative increment, but allowing this
         	// in the mat type complicates a lot of code, and doesn't gain anything.
         	// VecDense must have positive increment in this package.
        @@ -86,8 +86,12 @@ type VecDense struct {
         // a new slice is allocated for the backing slice. If len(data) == n, data is
         // used as the backing slice, and changes to the elements of the returned VecDense
         // will be reflected in data. If neither of these is true, NewVecDense will panic.
        +// NewVecDense will panic if n is zero.
         func NewVecDense(n int, data []float64) *VecDense {
        -	if n < 0 {
        +	if n <= 0 {
        +		if n == 0 {
        +			panic(ErrZeroLength)
        +		}
         		panic("mat: negative dimension")
         	}
         	if len(data) != n && data != nil {
        @@ -98,10 +102,10 @@ func NewVecDense(n int, data []float64) *VecDense {
         	}
         	return &VecDense{
         		mat: blas64.Vector{
        +			N:    n,
         			Inc:  1,
         			Data: data,
         		},
        -		n: n,
         	}
         }
         
        @@ -114,8 +118,8 @@ func (v *VecDense) SliceVec(i, k int) Vector {
         		panic(ErrIndexOutOfRange)
         	}
         	return &VecDense{
        -		n: k - i,
         		mat: blas64.Vector{
        +			N:    k - i,
         			Inc:  v.mat.Inc,
         			Data: v.mat.Data[i*v.mat.Inc : (k-1)*v.mat.Inc+1],
         		},
        @@ -125,16 +129,16 @@ func (v *VecDense) SliceVec(i, k int) Vector {
         // Dims returns the number of rows and columns in the matrix. Columns is always 1
         // for a non-Reset vector.
         func (v *VecDense) Dims() (r, c int) {
        -	if v.IsZero() {
        +	if v.IsEmpty() {
         		return 0, 0
         	}
        -	return v.n, 1
        +	return v.mat.N, 1
         }
         
         // Caps returns the number of rows and columns in the backing matrix. Columns is always 1
         // for a non-Reset vector.
         func (v *VecDense) Caps() (r, c int) {
        -	if v.IsZero() {
        +	if v.IsEmpty() {
         		return 0, 0
         	}
         	return v.Cap(), 1
        @@ -142,12 +146,12 @@ func (v *VecDense) Caps() (r, c int) {
         
         // Len returns the length of the vector.
         func (v *VecDense) Len() int {
        -	return v.n
        +	return v.mat.N
         }
         
         // Cap returns the capacity of the vector.
         func (v *VecDense) Cap() int {
        -	if v.IsZero() {
        +	if v.IsEmpty() {
         		return 0
         	}
         	return (cap(v.mat.Data)-1)/v.mat.Inc + 1
        @@ -163,31 +167,40 @@ func (v *VecDense) TVec() Vector {
         	return TransposeVec{v}
         }
         
        -// Reset zeros the length of the vector so that it can be reused as the
        +// Reset empties the matrix so that it can be reused as the
         // receiver of a dimensionally restricted operation.
         //
        +// Reset should not be used when the matrix shares backing data.
         // See the Reseter interface for more information.
         func (v *VecDense) Reset() {
        -	// No change of Inc or n to 0 may be
        +	// No change of Inc or N to 0 may be
         	// made unless both are set to 0.
         	v.mat.Inc = 0
        -	v.n = 0
        +	v.mat.N = 0
         	v.mat.Data = v.mat.Data[:0]
         }
         
        +// Zero sets all of the matrix elements to zero.
        +func (v *VecDense) Zero() {
        +	for i := 0; i < v.mat.N; i++ {
        +		v.mat.Data[v.mat.Inc*i] = 0
        +	}
        +}
        +
         // CloneVec makes a copy of a into the receiver, overwriting the previous value
         // of the receiver.
         func (v *VecDense) CloneVec(a Vector) {
         	if v == a {
         		return
         	}
        -	v.n = a.Len()
        +	n := a.Len()
         	v.mat = blas64.Vector{
        +		N:    n,
         		Inc:  1,
        -		Data: use(v.mat.Data, v.n),
        +		Data: use(v.mat.Data, n),
         	}
         	if r, ok := a.(RawVectorer); ok {
        -		blas64.Copy(v.n, r.RawVector(), v.mat)
        +		blas64.Copy(r.RawVector(), v.mat)
         		return
         	}
         	for i := 0; i < a.Len(); i++ {
        @@ -202,10 +215,20 @@ func VecDenseCopyOf(a Vector) *VecDense {
         	return v
         }
         
        +// RawVector returns the underlying blas64.Vector used by the receiver.
        +// Changes to elements in the receiver following the call will be reflected
        +// in returned blas64.Vector.
         func (v *VecDense) RawVector() blas64.Vector {
         	return v.mat
         }
         
        +// SetRawVector sets the underlying blas64.Vector used by the receiver.
        +// Changes to elements in the receiver following the call will be reflected
        +// in the input.
        +func (v *VecDense) SetRawVector(a blas64.Vector) {
        +	v.mat = a
        +}
        +
         // CopyVec makes a copy of elements of a into the receiver. It is similar to the
         // built-in copy; it copies as much as the overlap between the two vectors and
         // returns the number of elements it copied.
        @@ -215,7 +238,11 @@ func (v *VecDense) CopyVec(a Vector) int {
         		return n
         	}
         	if r, ok := a.(RawVectorer); ok {
        -		blas64.Copy(n, r.RawVector(), v.mat)
        +		src := r.RawVector()
        +		src.N = n
        +		dst := v.mat
        +		dst.N = n
        +		blas64.Copy(src, dst)
         		return n
         	}
         	for i := 0; i < n; i++ {
        @@ -237,7 +264,7 @@ func (v *VecDense) ScaleVec(alpha float64, a Vector) {
         		return
         	}
         
        -	v.reuseAs(n)
        +	v.reuseAsNonZeroed(n)
         
         	if rv, ok := a.(RawVectorer); ok {
         		mat := rv.RawVector()
        @@ -276,18 +303,18 @@ func (v *VecDense) AddScaledVec(a Vector, alpha float64, b Vector) {
         
         	var amat, bmat blas64.Vector
         	fast := true
        -	aU, _ := untranspose(a)
        -	if rv, ok := aU.(RawVectorer); ok {
        -		amat = rv.RawVector()
        +	aU, _ := untransposeExtract(a)
        +	if rv, ok := aU.(*VecDense); ok {
        +		amat = rv.mat
         		if v != a {
         			v.checkOverlap(amat)
         		}
         	} else {
         		fast = false
         	}
        -	bU, _ := untranspose(b)
        -	if rv, ok := bU.(RawVectorer); ok {
        -		bmat = rv.RawVector()
        +	bU, _ := untransposeExtract(b)
        +	if rv, ok := bU.(*VecDense); ok {
        +		bmat = rv.mat
         		if v != b {
         			v.checkOverlap(bmat)
         		}
        @@ -295,7 +322,7 @@ func (v *VecDense) AddScaledVec(a Vector, alpha float64, b Vector) {
         		fast = false
         	}
         
        -	v.reuseAs(ar)
        +	v.reuseAsNonZeroed(ar)
         
         	switch {
         	case alpha == 0: // v <- a
        @@ -304,7 +331,7 @@ func (v *VecDense) AddScaledVec(a Vector, alpha float64, b Vector) {
         		}
         		v.CopyVec(a)
         	case v == a && v == b: // v <- v + alpha * v = (alpha + 1) * v
        -		blas64.Scal(ar, alpha+1, v.mat)
        +		blas64.Scal(alpha+1, v.mat)
         	case !fast: // v <- a + alpha * b without blas64 support.
         		for i := 0; i < ar; i++ {
         			v.setVec(i, a.AtVec(i)+alpha*b.AtVec(i))
        @@ -338,15 +365,15 @@ func (v *VecDense) AddVec(a, b Vector) {
         		panic(ErrShape)
         	}
         
        -	v.reuseAs(ar)
        +	v.reuseAsNonZeroed(ar)
         
        -	aU, _ := untranspose(a)
        -	bU, _ := untranspose(b)
        +	aU, _ := untransposeExtract(a)
        +	bU, _ := untransposeExtract(b)
         
        -	if arv, ok := aU.(RawVectorer); ok {
        -		if brv, ok := bU.(RawVectorer); ok {
        -			amat := arv.RawVector()
        -			bmat := brv.RawVector()
        +	if arv, ok := aU.(*VecDense); ok {
        +		if brv, ok := bU.(*VecDense); ok {
        +			amat := arv.mat
        +			bmat := brv.mat
         
         			if v != a {
         				v.checkOverlap(amat)
        @@ -381,15 +408,15 @@ func (v *VecDense) SubVec(a, b Vector) {
         		panic(ErrShape)
         	}
         
        -	v.reuseAs(ar)
        +	v.reuseAsNonZeroed(ar)
         
        -	aU, _ := untranspose(a)
        -	bU, _ := untranspose(b)
        +	aU, _ := untransposeExtract(a)
        +	bU, _ := untransposeExtract(b)
         
        -	if arv, ok := aU.(RawVectorer); ok {
        -		if brv, ok := bU.(RawVectorer); ok {
        -			amat := arv.RawVector()
        -			bmat := brv.RawVector()
        +	if arv, ok := aU.(*VecDense); ok {
        +		if brv, ok := bU.(*VecDense); ok {
        +			amat := arv.mat
        +			bmat := brv.mat
         
         			if v != a {
         				v.checkOverlap(amat)
        @@ -425,15 +452,15 @@ func (v *VecDense) MulElemVec(a, b Vector) {
         		panic(ErrShape)
         	}
         
        -	v.reuseAs(ar)
        +	v.reuseAsNonZeroed(ar)
         
        -	aU, _ := untranspose(a)
        -	bU, _ := untranspose(b)
        +	aU, _ := untransposeExtract(a)
        +	bU, _ := untransposeExtract(b)
         
        -	if arv, ok := aU.(RawVectorer); ok {
        -		if brv, ok := bU.(RawVectorer); ok {
        -			amat := arv.RawVector()
        -			bmat := brv.RawVector()
        +	if arv, ok := aU.(*VecDense); ok {
        +		if brv, ok := bU.(*VecDense); ok {
        +			amat := arv.mat
        +			bmat := brv.mat
         
         			if v != a {
         				v.checkOverlap(amat)
        @@ -474,15 +501,15 @@ func (v *VecDense) DivElemVec(a, b Vector) {
         		panic(ErrShape)
         	}
         
        -	v.reuseAs(ar)
        +	v.reuseAsNonZeroed(ar)
         
        -	aU, _ := untranspose(a)
        -	bU, _ := untranspose(b)
        +	aU, _ := untransposeExtract(a)
        +	bU, _ := untransposeExtract(b)
         
        -	if arv, ok := aU.(RawVectorer); ok {
        -		if brv, ok := bU.(RawVectorer); ok {
        -			amat := arv.RawVector()
        -			bmat := brv.RawVector()
        +	if arv, ok := aU.(*VecDense); ok {
        +		if brv, ok := bU.(*VecDense); ok {
        +			amat := arv.mat
        +			bmat := brv.mat
         
         			if v != a {
         				v.checkOverlap(amat)
        @@ -522,12 +549,12 @@ func (v *VecDense) MulVec(a Matrix, b Vector) {
         		panic(ErrShape)
         	}
         
        -	aU, trans := untranspose(a)
        +	aU, trans := untransposeExtract(a)
         	var bmat blas64.Vector
         	fast := true
        -	bU, _ := untranspose(b)
        -	if rv, ok := bU.(RawVectorer); ok {
        -		bmat = rv.RawVector()
        +	bU, _ := untransposeExtract(b)
        +	if rv, ok := bU.(*VecDense); ok {
        +		bmat = rv.mat
         		if v != b {
         			v.checkOverlap(bmat)
         		}
        @@ -535,7 +562,7 @@ func (v *VecDense) MulVec(a Matrix, b Vector) {
         		fast = false
         	}
         
        -	v.reuseAs(r)
        +	v.reuseAsNonZeroed(r)
         	var restore func()
         	if v == aU {
         		v, restore = v.isolatedWorkspace(aU.(*VecDense))
        @@ -556,8 +583,8 @@ func (v *VecDense) MulVec(a Matrix, b Vector) {
         
         		// {1,n} x {n,1}
         		if fast {
        -			if rv, ok := aU.(RawVectorer); ok {
        -				amat := rv.RawVector()
        +			if rv, ok := aU.(*VecDense); ok {
        +				amat := rv.mat
         				if v != aU {
         					v.checkOverlap(amat)
         				}
        @@ -578,37 +605,34 @@ func (v *VecDense) MulVec(a Matrix, b Vector) {
         		}
         		v.setVec(0, sum)
         		return
        -	case RawSymmetricer:
        +	case *SymBandDense:
         		if fast {
        -			amat := aU.RawSymmetric()
        -			// We don't know that a is a *SymDense, so make
        -			// a temporary SymDense to check overlap.
        -			(&SymDense{mat: amat}).checkOverlap(v.asGeneral())
        -			blas64.Symv(1, amat, bmat, 0, v.mat)
        +			aU.checkOverlap(v.asGeneral())
        +			blas64.Sbmv(1, aU.mat, bmat, 0, v.mat)
         			return
         		}
        -	case RawTriangular:
        +	case *SymDense:
        +		if fast {
        +			aU.checkOverlap(v.asGeneral())
        +			blas64.Symv(1, aU.mat, bmat, 0, v.mat)
        +			return
        +		}
        +	case *TriDense:
         		v.CopyVec(b)
        -		amat := aU.RawTriangular()
        -		// We don't know that a is a *TriDense, so make
        -		// a temporary TriDense to check overlap.
        -		(&TriDense{mat: amat}).checkOverlap(v.asGeneral())
        +		aU.checkOverlap(v.asGeneral())
         		ta := blas.NoTrans
         		if trans {
         			ta = blas.Trans
         		}
        -		blas64.Trmv(ta, amat, v.mat)
        -	case RawMatrixer:
        +		blas64.Trmv(ta, aU.mat, v.mat)
        +	case *Dense:
         		if fast {
        -			amat := aU.RawMatrix()
        -			// We don't know that a is a *Dense, so make
        -			// a temporary Dense to check overlap.
        -			(&Dense{mat: amat}).checkOverlap(v.asGeneral())
        +			aU.checkOverlap(v.asGeneral())
         			t := blas.NoTrans
         			if trans {
         				t = blas.Trans
         			}
        -			blas64.Gemv(t, 1, amat, bmat, 0, v.mat)
        +			blas64.Gemv(t, 1, aU.mat, bmat, 0, v.mat)
         			return
         		}
         	default:
        @@ -633,28 +657,72 @@ func (v *VecDense) MulVec(a Matrix, b Vector) {
         	}
         }
         
        -// reuseAs resizes an empty vector to a r×1 vector,
        +// ReuseAsVec changes the receiver if it IsEmpty() to be of size n×1.
        +//
        +// ReuseAsVec re-uses the backing data slice if it has sufficient capacity,
        +// otherwise a new slice is allocated. The backing data is zero on return.
        +//
        +// ReuseAsVec panics if the receiver is not empty, and panics if
        +// the input size is less than one. To empty the receiver for re-use,
        +// Reset should be used.
        +func (v *VecDense) ReuseAsVec(n int) {
        +	if n <= 0 {
        +		if n == 0 {
        +			panic(ErrZeroLength)
        +		}
        +		panic(ErrNegativeDimension)
        +	}
        +	if !v.IsEmpty() {
        +		panic(ErrReuseNonEmpty)
        +	}
        +	v.reuseAsZeroed(n)
        +}
        +
        +// reuseAsNonZeroed resizes an empty vector to a r×1 vector,
         // or checks that a non-empty matrix is r×1.
        -func (v *VecDense) reuseAs(r int) {
        +func (v *VecDense) reuseAsNonZeroed(r int) {
        +	// reuseAsNonZeroed must be kept in sync with reuseAsZeroed.
         	if r == 0 {
         		panic(ErrZeroLength)
         	}
        -	if v.IsZero() {
        +	if v.IsEmpty() {
         		v.mat = blas64.Vector{
        +			N:    r,
         			Inc:  1,
         			Data: use(v.mat.Data, r),
         		}
        -		v.n = r
         		return
         	}
        -	if r != v.n {
        +	if r != v.mat.N {
        +		panic(ErrShape)
        +	}
        +}
        +
        +// reuseAsZeroed resizes an empty vector to a r×1 vector,
        +// or checks that a non-empty matrix is r×1.
        +func (v *VecDense) reuseAsZeroed(r int) {
        +	// reuseAsZeroed must be kept in sync with reuseAsNonZeroed.
        +	if r == 0 {
        +		panic(ErrZeroLength)
        +	}
        +	if v.IsEmpty() {
        +		v.mat = blas64.Vector{
        +			N:    r,
        +			Inc:  1,
        +			Data: useZeroed(v.mat.Data, r),
        +		}
        +		return
        +	}
        +	if r != v.mat.N {
         		panic(ErrShape)
         	}
        +	v.Zero()
         }
         
        -// IsZero returns whether the receiver is zero-sized. Zero-sized vectors can be the
        -// receiver for size-restricted operations. VecDenses can be zeroed using Reset.
        -func (v *VecDense) IsZero() bool {
        +// IsEmpty returns whether the receiver is empty. Empty matrices can be the
        +// receiver for size-restricted operations. The receiver can be emptied using
        +// Reset.
        +func (v *VecDense) IsEmpty() bool {
         	// It must be the case that v.Dims() returns
         	// zeros in this case. See comment in Reset().
         	return v.mat.Inc == 0
        @@ -677,7 +745,7 @@ func (v *VecDense) isolatedWorkspace(a Vector) (n *VecDense, restore func()) {
         func (v *VecDense) asDense() *Dense {
         	return &Dense{
         		mat:     v.asGeneral(),
        -		capRows: v.n,
        +		capRows: v.mat.N,
         		capCols: 1,
         	}
         }
        @@ -686,7 +754,7 @@ func (v *VecDense) asDense() *Dense {
         // same underlying data.
         func (v *VecDense) asGeneral() blas64.General {
         	return blas64.General{
        -		Rows:   v.n,
        +		Rows:   v.mat.N,
         		Cols:   1,
         		Stride: v.mat.Inc,
         		Data:   v.mat.Data,
        @@ -694,37 +762,37 @@ func (v *VecDense) asGeneral() blas64.General {
         }
         
         // ColViewOf reflects the column j of the RawMatrixer m, into the receiver
        -// backed by the same underlying data. The length of the receiver must either be
        -// zero or match the number of rows in m.
        +// backed by the same underlying data. The receiver must either be empty
        +// have length equal to the number of rows of m.
         func (v *VecDense) ColViewOf(m RawMatrixer, j int) {
         	rm := m.RawMatrix()
         
         	if j >= rm.Cols || j < 0 {
         		panic(ErrColAccess)
         	}
        -	if !v.IsZero() && v.n != rm.Rows {
        +	if !v.IsEmpty() && v.mat.N != rm.Rows {
         		panic(ErrShape)
         	}
         
         	v.mat.Inc = rm.Stride
         	v.mat.Data = rm.Data[j : (rm.Rows-1)*rm.Stride+j+1]
        -	v.n = rm.Rows
        +	v.mat.N = rm.Rows
         }
         
         // RowViewOf reflects the row i of the RawMatrixer m, into the receiver
        -// backed by the same underlying data. The length of the receiver must either be
        -// zero or match the number of columns in m.
        +// backed by the same underlying data. The receiver must either be
        +// empty or have length equal to the number of columns of m.
         func (v *VecDense) RowViewOf(m RawMatrixer, i int) {
         	rm := m.RawMatrix()
         
         	if i >= rm.Rows || i < 0 {
         		panic(ErrRowAccess)
         	}
        -	if !v.IsZero() && v.n != rm.Cols {
        +	if !v.IsEmpty() && v.mat.N != rm.Cols {
         		panic(ErrShape)
         	}
         
         	v.mat.Inc = 1
         	v.mat.Data = rm.Data[i*rm.Stride : i*rm.Stride+rm.Cols]
        -	v.n = rm.Cols
        +	v.mat.N = rm.Cols
         }
        diff --git a/vendor/gonum.org/v1/gonum/mathext/airy.go b/vendor/gonum.org/v1/gonum/mathext/airy.go
        index c94c5d84c..7b8865f13 100644
        --- a/vendor/gonum.org/v1/gonum/mathext/airy.go
        +++ b/vendor/gonum.org/v1/gonum/mathext/airy.go
        @@ -17,7 +17,7 @@ func AiryAi(z complex128) complex128 {
         	// documentation for the exact behavior.
         	id := 0
         	kode := 1
        -	air, aii, _ := amos.Zairy(real(z), imag(z), id, kode)
        +	air, aii, _, _ := amos.Zairy(real(z), imag(z), id, kode)
         	return complex(air, aii)
         }
         
        @@ -32,6 +32,6 @@ func AiryAiDeriv(z complex128) complex128 {
         	// documentation for the exact behavior.
         	id := 1
         	kode := 1
        -	air, aii, _ := amos.Zairy(real(z), imag(z), id, kode)
        +	air, aii, _, _ := amos.Zairy(real(z), imag(z), id, kode)
         	return complex(air, aii)
         }
        diff --git a/vendor/gonum.org/v1/gonum/mathext/gamma_inc.go b/vendor/gonum.org/v1/gonum/mathext/gamma_inc.go
        index 24e3fd5b4..491d84388 100644
        --- a/vendor/gonum.org/v1/gonum/mathext/gamma_inc.go
        +++ b/vendor/gonum.org/v1/gonum/mathext/gamma_inc.go
        @@ -8,43 +8,43 @@ import (
         	"gonum.org/v1/gonum/mathext/internal/cephes"
         )
         
        -// GammaInc computes the incomplete Gamma integral.
        -//  GammaInc(a,x) = (1/ Γ(a)) \int_0^x e^{-t} t^{a-1} dt
        -// The input argument a must be positive and x must be non-negative or GammaInc
        +// GammaIncReg computes the regularized incomplete Gamma integral.
        +//  GammaIncReg(a,x) = (1/ Γ(a)) \int_0^x e^{-t} t^{a-1} dt
        +// The input argument a must be positive and x must be non-negative or GammaIncReg
         // will panic.
         //
         // See http://mathworld.wolfram.com/IncompleteGammaFunction.html
         // or https://en.wikipedia.org/wiki/Incomplete_gamma_function for more detailed
         // information.
        -func GammaInc(a, x float64) float64 {
        +func GammaIncReg(a, x float64) float64 {
         	return cephes.Igam(a, x)
         }
         
        -// GammaIncComp computes the complemented incomplete Gamma integral.
        -//  GammaIncComp(a,x) = 1 - GammaInc(a,x)
        +// GammaIncRegComp computes the complemented regularized incomplete Gamma integral.
        +//  GammaIncRegComp(a,x) = 1 - GammaIncReg(a,x)
         //                    = (1/ Γ(a)) \int_0^\infty e^{-t} t^{a-1} dt
         // The input argument a must be positive and x must be non-negative or
        -// GammaIncComp will panic.
        -func GammaIncComp(a, x float64) float64 {
        +// GammaIncRegComp will panic.
        +func GammaIncRegComp(a, x float64) float64 {
         	return cephes.IgamC(a, x)
         }
         
        -// GammaIncInv computes the inverse of the incomplete Gamma integral. That is,
        +// GammaIncRegInv computes the inverse of the regularized incomplete Gamma integral. That is,
         // it returns the x such that:
        -//  GammaInc(a, x) = y
        +//  GammaIncReg(a, x) = y
         // The input argument a must be positive and y must be between 0 and 1
        -// inclusive or GammaIncInv will panic. GammaIncInv should return a positive
        +// inclusive or GammaIncRegInv will panic. GammaIncRegInv should return a positive
         // number, but can return NaN if there is a failure to converge.
        -func GammaIncInv(a, y float64) float64 {
        -	return gammaIncInv(a, y)
        +func GammaIncRegInv(a, y float64) float64 {
        +	return gammaIncRegInv(a, y)
         }
         
        -// GammaIncCompInv computes the inverse of the complemented incomplete Gamma
        +// GammaIncRegCompInv computes the inverse of the complemented regularized incomplete Gamma
         // integral. That is, it returns the x such that:
        -//  GammaIncComp(a, x) = y
        +//  GammaIncRegComp(a, x) = y
         // The input argument a must be positive and y must be between 0 and 1
        -// inclusive or GammaIncCompInv will panic. GammaIncCompInv should return a
        +// inclusive or GammaIncRegCompInv will panic. GammaIncRegCompInv should return a
         // positive number, but can return 0 even with non-zero y due to underflow.
        -func GammaIncCompInv(a, y float64) float64 {
        +func GammaIncRegCompInv(a, y float64) float64 {
         	return cephes.IgamI(a, y)
         }
        diff --git a/vendor/gonum.org/v1/gonum/mathext/gamma_inc_inv.go b/vendor/gonum.org/v1/gonum/mathext/gamma_inc_inv.go
        index 105bd8e2b..24a0e6f69 100644
        --- a/vendor/gonum.org/v1/gonum/mathext/gamma_inc_inv.go
        +++ b/vendor/gonum.org/v1/gonum/mathext/gamma_inc_inv.go
        @@ -18,17 +18,17 @@ const (
         	allowedRTol = 1e-6
         )
         
        -func gammaInc(x float64, params []float64) float64 {
        +func gammaIncReg(x float64, params []float64) float64 {
         	return cephes.Igam(params[0], x) - params[1]
         }
         
        -// gammaIncInv is the inverse of the incomplete Gamma integral. That is, it
        +// gammaIncRegInv is the inverse of the regularized incomplete Gamma integral. That is, it
         // returns x such that:
         //  Igam(a, x) = y
         // The input argument a must be positive and y must be between 0 and 1
        -// inclusive or gammaIncInv will panic. gammaIncInv should return a
        +// inclusive or gammaIncRegInv will panic. gammaIncRegInv should return a
         // positive number, but can return NaN if there is a failure to converge.
        -func gammaIncInv(a, y float64) float64 {
        +func gammaIncRegInv(a, y float64) float64 {
         	// For y not small, we just use
         	//  IgamI(a, 1-y)
         	// (inverse of the complemented incomplete Gamma integral). For y small,
        @@ -47,7 +47,7 @@ func gammaIncInv(a, y float64) float64 {
         	// Also, after we generate a small interval by bisection above, false
         	// position will do a large step from an interval of width ~1e-4 to ~1e-14
         	// in one step (a=10, x=0.05, but similar for other values).
        -	result, bestX, _, errEst := falsePosition(lo, hi, flo, fhi, 2*machEp, 2*machEp, 1e-2*a, gammaInc, params)
        +	result, bestX, _, errEst := falsePosition(lo, hi, flo, fhi, 2*machEp, 2*machEp, 1e-2*a, gammaIncReg, params)
         	if result == fSolveMaxIterations && errEst > allowedATol+allowedRTol*math.Abs(bestX) {
         		bestX = math.NaN()
         	}
        diff --git a/vendor/gonum.org/v1/gonum/mathext/internal/amos/amos.go b/vendor/gonum.org/v1/gonum/mathext/internal/amos/amos.go
        index 8b0d669ba..57f2bdecd 100644
        --- a/vendor/gonum.org/v1/gonum/mathext/internal/amos/amos.go
        +++ b/vendor/gonum.org/v1/gonum/mathext/internal/amos/amos.go
        @@ -19,7 +19,7 @@ Mention of AMOS's inclusion in SLATEC goes back at least to this 1985 technical
         // math.NaN() are for padding to keep indexing easy.
         var imach = []int{-0, 5, 6, 0, 0, 32, 4, 2, 31, 2147483647, 2, 24, -125, 127, 53, -1021, 1023}
         
        -var dmach = []float64{math.NaN(), 2.23E-308, 1.79E-308, 1.11E-16, 2.22E-16, 0.30103000998497009}
        +var dmach = []float64{math.NaN(), 2.23e-308, 1.79e-308, 1.11e-16, 2.22e-16, 0.30103000998497009}
         
         func abs(a int) int {
         	if a >= 0 {
        @@ -42,7 +42,7 @@ func max(a, b int) int {
         	return b
         }
         
        -func Zairy(ZR, ZI float64, ID, KODE int) (AIR, AII float64, NZ int) {
        +func Zairy(ZR, ZI float64, ID, KODE int) (AIR, AII float64, NZ, IERR int) {
         	// zairy is adapted from the original Netlib code by Donald Amos.
         	// http://www.netlib.no/netlib/amos/zairy.f
         
        @@ -179,7 +179,7 @@ func Zairy(ZR, ZI float64, ID, KODE int) (AIR, AII float64, NZ int) {
         		DK, D1, D2, ELIM, FID, FNU, PTR, RL, R1M5, SFAC, STI, STR,
         		S1I, S1R, S2I, S2R, TOL, TRM1I, TRM1R, TRM2I, TRM2R, TTH, ZEROI,
         		ZEROR, ZTAI, ZTAR, Z3I, Z3R, ALAZ, BB float64
        -	var IERR, IFLAG, K, K1, K2, MR, NN int
        +	var IFLAG, K, K1, K2, MR, NN int
         	var tmp complex128
         
         	// Extra element for padding.
        @@ -198,10 +198,10 @@ func Zairy(ZR, ZI float64, ID, KODE int) (AIR, AII float64, NZ int) {
         	_ = ZTA
         	_ = Z3
         
        -	TTH = 6.66666666666666667E-01
        -	C1 = 3.55028053887817240E-01
        -	C2 = 2.58819403792806799E-01
        -	COEF = 1.83776298473930683E-01
        +	TTH = 6.66666666666666667e-01
        +	C1 = 3.55028053887817240e-01
        +	C2 = 2.58819403792806799e-01
        +	COEF = 1.83776298473930683e-01
         	ZEROR = 0
         	ZEROI = 0
         	CONER = 1
        @@ -218,9 +218,9 @@ func Zairy(ZR, ZI float64, ID, KODE int) (AIR, AII float64, NZ int) {
         		return
         	}
         	AZ = cmplx.Abs(complex(ZR, ZI))
        -	TOL = math.Max(dmach[4], 1.0E-18)
        +	TOL = math.Max(dmach[4], 1.0e-18)
         	FID = float64(ID)
        -	if AZ > 1.0E0 {
        +	if AZ > 1.0e0 {
         		goto Seventy
         	}
         
        @@ -240,21 +240,21 @@ func Zairy(ZR, ZI float64, ID, KODE int) (AIR, AII float64, NZ int) {
         	TRM1I = CONEI
         	TRM2R = CONER
         	TRM2I = CONEI
        -	ATRM = 1.0E0
        +	ATRM = 1.0e0
         	STR = ZR*ZR - ZI*ZI
         	STI = ZR*ZI + ZI*ZR
         	Z3R = STR*ZR - STI*ZI
         	Z3I = STR*ZI + STI*ZR
         	AZ3 = AZ * AA
        -	AK = 2.0E0 + FID
        -	BK = 3.0E0 - FID - FID
        -	CK = 4.0E0 - FID
        -	DK = 3.0E0 + FID + FID
        +	AK = 2.0e0 + FID
        +	BK = 3.0e0 - FID - FID
        +	CK = 4.0e0 - FID
        +	DK = 3.0e0 + FID + FID
         	D1 = AK * DK
         	D2 = BK * CK
         	AD = math.Min(D1, D2)
        -	AK = 24.0E0 + 9.0E0*FID
        -	BK = 30.0E0 - 9.0E0*FID
        +	AK = 24.0e0 + 9.0e0*FID
        +	BK = 30.0e0 - 9.0e0*FID
         	for K = 1; K <= 25; K++ {
         		STR = (TRM1R*Z3R - TRM1I*Z3I) / D1
         		TRM1I = (TRM1R*Z3I + TRM1I*Z3R) / D1
        @@ -273,8 +273,8 @@ func Zairy(ZR, ZI float64, ID, KODE int) (AIR, AII float64, NZ int) {
         		if ATRM < TOL*AD {
         			goto Forty
         		}
        -		AK = AK + 18.0E0
        -		BK = BK + 18.0E0
        +		AK = AK + 18.0e0
        +		BK = BK + 18.0e0
         	}
         Forty:
         	if ID == 1 {
        @@ -306,7 +306,7 @@ Fifty:
         	}
         	STR = ZR*S1R - ZI*S1I
         	STI = ZR*S1I + ZI*S1R
        -	CC = C1 / (1.0E0 + FID)
        +	CC = C1 / (1.0e0 + FID)
         	AIR = AIR + CC*(STR*ZR-STI*ZI)
         	AII = AII + CC*(STR*ZI+STI*ZR)
         
        @@ -329,7 +329,7 @@ Sixty:
         
         	// CASE FOR CABS(Z)>1.0.
         Seventy:
        -	FNU = (1.0E0 + FID) / 3.0E0
        +	FNU = (1.0e0 + FID) / 3.0e0
         
         	/*
         	   SET PARAMETERS RELATED TO MACHINE CONSTANTS.
        @@ -346,18 +346,18 @@ Seventy:
         	R1M5 = dmach[5]
         
         	K = min(abs(K1), abs(K2))
        -	ELIM = 2.303E0 * (float64(K)*R1M5 - 3.0E0)
        +	ELIM = 2.303e0 * (float64(K)*R1M5 - 3.0e0)
         	K1 = imach[14] - 1
         	AA = R1M5 * float64(K1)
        -	DIG = math.Min(AA, 18.0E0)
        -	AA = AA * 2.303E0
        -	ALIM = ELIM + math.Max(-AA, -41.45E0)
        -	RL = 1.2E0*DIG + 3.0E0
        +	DIG = math.Min(AA, 18.0e0)
        +	AA = AA * 2.303e0
        +	ALIM = ELIM + math.Max(-AA, -41.45e0)
        +	RL = 1.2e0*DIG + 3.0e0
         	ALAZ = math.Log(AZ)
         
         	// TEST FOR PROPER RANGE.
        -	AA = 0.5E0 / TOL
        -	BB = float64(float32(imach[9])) * 0.5E0
        +	AA = 0.5e0 / TOL
        +	BB = float64(float32(imach[9])) * 0.5e0
         	AA = math.Min(AA, BB)
         	AA = math.Pow(AA, TTH)
         	if AZ > AA {
        @@ -375,9 +375,9 @@ Seventy:
         
         	//  RE(ZTA)<=0 WHEN RE(Z)<0, ESPECIALLY WHEN IM(Z) IS SMALL.
         	IFLAG = 0
        -	SFAC = 1.0E0
        +	SFAC = 1.0e0
         	AK = ZTAI
        -	if ZR >= 0.0E0 {
        +	if ZR >= 0.0e0 {
         		goto Eighty
         	}
         	BK = ZTAR
        @@ -386,17 +386,17 @@ Seventy:
         	ZTAI = AK
         
         Eighty:
        -	if ZI != 0.0E0 {
        +	if ZI != 0.0e0 {
         		goto Ninety
         	}
        -	if ZR > 0.0E0 {
        +	if ZR > 0.0e0 {
         		goto Ninety
         	}
        -	ZTAR = 0.0E0
        +	ZTAR = 0.0e0
         	ZTAI = AK
         Ninety:
         	AA = ZTAR
        -	if AA >= 0.0E0 && ZR > 0.0E0 {
        +	if AA >= 0.0e0 && ZR > 0.0e0 {
         		goto OneTen
         	}
         	if KODE == 2 {
        @@ -407,7 +407,7 @@ Ninety:
         	if AA > (-ALIM) {
         		goto OneHundred
         	}
        -	AA = -AA + 0.25E0*ALAZ
        +	AA = -AA + 0.25e0*ALAZ
         	IFLAG = 1
         	SFAC = TOL
         	if AA > ELIM {
        @@ -417,10 +417,10 @@ Ninety:
         OneHundred:
         	// CBKNU AND CACON return EXP(ZTA)*K(FNU,ZTA) ON KODE=2.
         	MR = 1
        -	if ZI < 0.0E0 {
        +	if ZI < 0.0e0 {
         		MR = -1
         	}
        -	ZTAR, ZTAI, FNU, KODE, MR, _, CYR, CYI, NN, RL, TOL, ELIM, ALIM = Zacai(ZTAR, ZTAI, FNU, KODE, MR, 1, CYR, CYI, NN, RL, TOL, ELIM, ALIM)
        +	_, _, _, _, _, _, CYR, CYI, NN, _, _, _, _ = Zacai(ZTAR, ZTAI, FNU, KODE, MR, 1, CYR, CYI, RL, TOL, ELIM, ALIM)
         	if NN < 0 {
         		goto TwoEighty
         	}
        @@ -436,14 +436,14 @@ OneTen:
         	if AA < ALIM {
         		goto OneTwenty
         	}
        -	AA = -AA - 0.25E0*ALAZ
        +	AA = -AA - 0.25e0*ALAZ
         	IFLAG = 2
        -	SFAC = 1.0E0 / TOL
        +	SFAC = 1.0e0 / TOL
         	if AA < (-ELIM) {
         		goto TwoTen
         	}
         OneTwenty:
        -	ZTAR, ZTAI, FNU, KODE, _, CYR, CYI, NZ, TOL, ELIM, ALIM = Zbknu(ZTAR, ZTAI, FNU, KODE, 1, CYR, CYI, NZ, TOL, ELIM, ALIM)
        +	_, _, _, _, _, CYR, CYI, NZ, _, _, _ = Zbknu(ZTAR, ZTAI, FNU, KODE, 1, CYR, CYI, TOL, ELIM, ALIM)
         
         OneThirty:
         	S1R = CYR[1] * COEF
        @@ -481,7 +481,7 @@ OneSixty:
         	AII = S1I / SFAC
         	return
         OneSeventy:
        -	AA = 1.0E+3 * dmach[1]
        +	AA = 1.0e+3 * dmach[1]
         	S1R = ZEROR
         	S1I = ZEROI
         	if ID == 1 {
        @@ -498,12 +498,12 @@ OneEighty:
         	return
         OneNinety:
         	AIR = -C2
        -	AII = 0.0E0
        +	AII = 0.0e0
         	AA = math.Sqrt(AA)
         	if AZ <= AA {
         		goto TwoHundred
         	}
        -	S1R = 0.5E0 * (ZR*ZR - ZI*ZI)
        +	S1R = 0.5e0 * (ZR*ZR - ZI*ZI)
         	S1I = ZR * ZI
         TwoHundred:
         	AIR = AIR + C1*S1R
        @@ -532,7 +532,7 @@ TwoSixty:
         }
         
         // sbknu computes the k bessel function in the right half z plane.
        -func Zbknu(ZR, ZI, FNU float64, KODE, N int, YR, YI []float64, NZ int, TOL, ELIM, ALIM float64) (ZRout, ZIout, FNUout float64, KODEout, Nout int, YRout, YIout []float64, NZout int, TOLout, ELIMout, ALIMout float64) {
        +func Zbknu(ZR, ZI, FNU float64, KODE, N int, YR, YI []float64, TOL, ELIM, ALIM float64) (ZRout, ZIout, FNUout float64, KODEout, Nout int, YRout, YIout []float64, NZ int, TOLout, ELIMout, ALIMout float64) {
         	/* Old dimension comment.
         		DIMENSION YR(N), YI(N), CC(8), CSSR(3), CSRR(3), BRY(3), CYR(2),
         	     * CYI(2)
        @@ -567,44 +567,43 @@ func Zbknu(ZR, ZI, FNU float64, KODE, N int, YR, YI []float64, NZ int, TOL, ELIM
         	CTWOR = 2
         	R1 = 2
         
        -	DPI = 3.14159265358979324E0
        -	RTHPI = 1.25331413731550025E0
        -	SPI = 1.90985931710274403E0
        -	HPI = 1.57079632679489662E0
        -	FPI = 1.89769999331517738E0
        -	TTH = 6.66666666666666666E-01
        +	DPI = 3.14159265358979324e0
        +	RTHPI = 1.25331413731550025e0
        +	SPI = 1.90985931710274403e0
        +	HPI = 1.57079632679489662e0
        +	FPI = 1.89769999331517738e0
        +	TTH = 6.66666666666666666e-01
         
        -	CC := [9]float64{math.NaN(), 5.77215664901532861E-01, -4.20026350340952355E-02,
        -		-4.21977345555443367E-02, 7.21894324666309954E-03,
        -		-2.15241674114950973E-04, -2.01348547807882387E-05,
        -		1.13302723198169588E-06, 6.11609510448141582E-09}
        +	CC := [9]float64{math.NaN(), 5.77215664901532861e-01, -4.20026350340952355e-02,
        +		-4.21977345555443367e-02, 7.21894324666309954e-03,
        +		-2.15241674114950973e-04, -2.01348547807882387e-05,
        +		1.13302723198169588e-06, 6.11609510448141582e-09}
         
         	CAZ = cmplx.Abs(complex(ZR, ZI))
        -	CSCLR = 1.0E0 / TOL
        +	CSCLR = 1.0e0 / TOL
         	CRSCR = TOL
         	CSSR[1] = CSCLR
        -	CSSR[2] = 1.0E0
        +	CSSR[2] = 1.0e0
         	CSSR[3] = CRSCR
         	CSRR[1] = CRSCR
        -	CSRR[2] = 1.0E0
        +	CSRR[2] = 1.0e0
         	CSRR[3] = CSCLR
        -	BRY[1] = 1.0E+3 * dmach[1] / TOL
        -	BRY[2] = 1.0E0 / BRY[1]
        +	BRY[1] = 1.0e+3 * dmach[1] / TOL
        +	BRY[2] = 1.0e0 / BRY[1]
         	BRY[3] = dmach[2]
        -	NZ = 0
         	IFLAG = 0
         	KODED = KODE
        -	RCAZ = 1.0E0 / CAZ
        +	RCAZ = 1.0e0 / CAZ
         	STR = ZR * RCAZ
         	STI = -ZI * RCAZ
         	RZR = (STR + STR) * RCAZ
         	RZI = (STI + STI) * RCAZ
         	INU = int(float32(FNU + 0.5))
         	DNU = FNU - float64(INU)
        -	if math.Abs(DNU) == 0.5E0 {
        +	if math.Abs(DNU) == 0.5e0 {
         		goto OneTen
         	}
        -	DNU2 = 0.0E0
        +	DNU2 = 0.0e0
         	if math.Abs(DNU) > TOL {
         		DNU2 = DNU * DNU
         	}
        @@ -613,7 +612,7 @@ func Zbknu(ZR, ZI, FNU float64, KODE, N int, YR, YI []float64, NZ int, TOL, ELIM
         	}
         
         	// SERIES FOR CABS(Z)<=R1.
        -	FC = 1.0E0
        +	FC = 1.0e0
         	tmp = cmplx.Log(complex(RZR, RZI))
         	SMUR = real(tmp)
         	SMUI = imag(tmp)
        @@ -626,7 +625,7 @@ func Zbknu(ZR, ZI, FNU float64, KODE, N int, YR, YI []float64, NZ int, TOL, ELIM
         	CSHI = imag(sinh)
         	CCHR = real(cosh)
         	CCHI = imag(cosh)
        -	if DNU == 0.0E0 {
        +	if DNU == 0.0e0 {
         		goto Ten
         	}
         	FC = DNU * DPI
        @@ -634,17 +633,17 @@ func Zbknu(ZR, ZI, FNU float64, KODE, N int, YR, YI []float64, NZ int, TOL, ELIM
         	SMUR = CSHR / DNU
         	SMUI = CSHI / DNU
         Ten:
        -	A2 = 1.0E0 + DNU
        +	A2 = 1.0e0 + DNU
         
         	// GAM(1-Z)*GAM(1+Z)=PI*Z/SIN(PI*Z), T1=1/GAM(1-DNU), T2=1/GAM(1+DNU).
         	T2 = math.Exp(-dgamln(A2, IDUM))
        -	T1 = 1.0E0 / (T2 * FC)
        -	if math.Abs(DNU) > 0.1E0 {
        +	T1 = 1.0e0 / (T2 * FC)
        +	if math.Abs(DNU) > 0.1e0 {
         		goto Forty
         	}
         
         	// SERIES FOR F0 TO RESOLVE INDETERMINACY FOR SMALL ABS(DNU).
        -	AK = 1.0E0
        +	AK = 1.0e0
         	S = CC[1]
         	for K = 2; K <= 8; K++ {
         		AK = AK * DNU2
        @@ -660,14 +659,14 @@ Thirty:
         Forty:
         	G1 = (T1 - T2) / (DNU + DNU)
         Fifty:
        -	G2 = (T1 + T2) * 0.5E0
        +	G2 = (T1 + T2) * 0.5e0
         	FR = FC * (CCHR*G1 + SMUR*G2)
         	FI = FC * (CCHI*G1 + SMUI*G2)
         	tmp = cmplx.Exp(complex(FMUR, FMUI))
         	STR = real(tmp)
         	STI = imag(tmp)
        -	PR = 0.5E0 * STR / T2
        -	PI = 0.5E0 * STI / T2
        +	PR = 0.5e0 * STR / T2
        +	PI = 0.5e0 * STI / T2
         	tmp = complex(0.5, 0) / complex(STR, STI)
         	PTR = real(tmp)
         	PTI = imag(tmp)
        @@ -677,11 +676,11 @@ Fifty:
         	S1I = FI
         	S2R = PR
         	S2I = PI
        -	AK = 1.0E0
        -	A1 = 1.0E0
        +	AK = 1.0e0
        +	A1 = 1.0e0
         	CKR = CONER
         	CKI = CONEI
        -	BK = 1.0E0 - DNU2
        +	BK = 1.0e0 - DNU2
         	if INU > 0 || N > 1 {
         		goto Eighty
         	}
        @@ -693,27 +692,27 @@ Fifty:
         	tmp = complex(ZR, ZI) * complex(ZR, ZI)
         	CZR = real(tmp)
         	CZI = imag(tmp)
        -	CZR = 0.25E0 * CZR
        -	CZI = 0.25E0 * CZI
        -	T1 = 0.25E0 * CAZ * CAZ
        +	CZR = 0.25e0 * CZR
        +	CZI = 0.25e0 * CZI
        +	T1 = 0.25e0 * CAZ * CAZ
         Sixty:
         	FR = (FR*AK + PR + QR) / BK
         	FI = (FI*AK + PI + QI) / BK
        -	STR = 1.0E0 / (AK - DNU)
        +	STR = 1.0e0 / (AK - DNU)
         	PR = PR * STR
         	PI = PI * STR
        -	STR = 1.0E0 / (AK + DNU)
        +	STR = 1.0e0 / (AK + DNU)
         	QR = QR * STR
         	QI = QI * STR
         	STR = CKR*CZR - CKI*CZI
        -	RAK = 1.0E0 / AK
        +	RAK = 1.0e0 / AK
         	CKI = (CKR*CZI + CKI*CZR) * RAK
         	CKR = STR * RAK
         	S1R = CKR*FR - CKI*FI + S1R
         	S1I = CKR*FI + CKI*FR + S1I
         	A1 = A1 * T1 * RAK
        -	BK = BK + AK + AK + 1.0E0
        -	AK = AK + 1.0E0
        +	BK = BK + AK + AK + 1.0e0
        +	AK = AK + 1.0e0
         	if A1 > TOL {
         		goto Sixty
         	}
        @@ -739,20 +738,20 @@ Eighty:
         	tmp = complex(ZR, ZI) * complex(ZR, ZI)
         	CZR = real(tmp)
         	CZI = imag(tmp)
        -	CZR = 0.25E0 * CZR
        -	CZI = 0.25E0 * CZI
        -	T1 = 0.25E0 * CAZ * CAZ
        +	CZR = 0.25e0 * CZR
        +	CZI = 0.25e0 * CZI
        +	T1 = 0.25e0 * CAZ * CAZ
         Ninety:
         	FR = (FR*AK + PR + QR) / BK
         	FI = (FI*AK + PI + QI) / BK
        -	STR = 1.0E0 / (AK - DNU)
        +	STR = 1.0e0 / (AK - DNU)
         	PR = PR * STR
         	PI = PI * STR
        -	STR = 1.0E0 / (AK + DNU)
        +	STR = 1.0e0 / (AK + DNU)
         	QR = QR * STR
         	QI = QI * STR
         	STR = CKR*CZR - CKI*CZI
        -	RAK = 1.0E0 / AK
        +	RAK = 1.0e0 / AK
         	CKI = (CKR*CZI + CKI*CZR) * RAK
         	CKR = STR * RAK
         	S1R = CKR*FR - CKI*FI + S1R
        @@ -762,14 +761,14 @@ Ninety:
         	S2R = CKR*STR - CKI*STI + S2R
         	S2I = CKR*STI + CKI*STR + S2I
         	A1 = A1 * T1 * RAK
        -	BK = BK + AK + AK + 1.0E0
        -	AK = AK + 1.0E0
        +	BK = BK + AK + AK + 1.0e0
        +	AK = AK + 1.0e0
         	if A1 > TOL {
         		goto Ninety
         	}
         OneHundred:
         	KFLAG = 2
        -	A1 = FNU + 1.0E0
        +	A1 = FNU + 1.0e0
         	AK = A1 * math.Abs(SMUR)
         	if AK > ALIM {
         		KFLAG = 3
        @@ -822,7 +821,7 @@ OneTen:
         	COEFR = real(tmp)
         	COEFI = imag(tmp)
         OneTwenty:
        -	if math.Abs(DNU) == 0.5E0 {
        +	if math.Abs(DNU) == 0.5e0 {
         		goto ThreeHundred
         	}
         	// MILLER ALGORITHM FOR CABS(Z)>R1.
        @@ -831,7 +830,7 @@ OneTwenty:
         	if AK == CZEROR {
         		goto ThreeHundred
         	}
        -	FHS = math.Abs(0.25E0 - DNU2)
        +	FHS = math.Abs(0.25e0 - DNU2)
         	if FHS == CZEROR {
         		goto ThreeHundred
         	}
        @@ -841,11 +840,11 @@ OneTwenty:
         	// 12<=E<=60. E IS COMPUTED FROM 2**(-E)=B**(1-I1MACH(14))=
         	// TOL WHERE B IS THE BASE OF THE ARITHMETIC.
         	T1 = float64(imach[14] - 1)
        -	T1 = T1 * dmach[5] * 3.321928094E0
        -	T1 = math.Max(T1, 12.0E0)
        -	T1 = math.Min(T1, 60.0E0)
        -	T2 = TTH*T1 - 6.0E0
        -	if ZR != 0.0E0 {
        +	T1 = T1 * dmach[5] * 3.321928094e0
        +	T1 = math.Max(T1, 12.0e0)
        +	T1 = math.Min(T1, 60.0e0)
        +	T2 = TTH*T1 - 6.0e0
        +	if ZR != 0.0e0 {
         		goto OneThirty
         	}
         	T1 = HPI
        @@ -891,10 +890,10 @@ OneSeventy:
         	// COMPUTE BACKWARD INDEX K FOR CABS(Z) DFNU+1.0E0 {
        +	if AZ*AZ*0.25 > DFNU+1.0e0 {
         		goto Twenty
         	}
         Ten:
        @@ -1446,7 +1442,7 @@ Ten:
         	for i, v := range YR {
         		y[i] = complex(v, YI[i])
         	}
        -	NW = Zseri(z, FNU, KODE, NN, y[1:], TOL, ELIM, ALIM)
        +	Zseri(z, FNU, KODE, NN, y[1:], TOL, ELIM, ALIM)
         	for i, v := range y {
         		YR[i] = real(v)
         		YI[i] = imag(v)
        @@ -1457,26 +1453,26 @@ Twenty:
         		goto Thirty
         	}
         	// ASYMPTOTIC EXPANSION FOR LARGE Z FOR THE I FUNCTION.
        -	ZNR, ZNI, FNU, KODE, NN, YR, YI, NW, RL, TOL, ELIM, ALIM = Zasyi(ZNR, ZNI, FNU, KODE, NN, YR, YI, NW, RL, TOL, ELIM, ALIM)
        +	ZNR, ZNI, FNU, KODE, _, YR, YI, NW, RL, TOL, ELIM, ALIM = Zasyi(ZNR, ZNI, FNU, KODE, NN, YR, YI, RL, TOL, ELIM, ALIM)
         	if NW < 0 {
         		goto Eighty
         	}
         	goto Forty
         Thirty:
         	// MILLER ALGORITHM NORMALIZED BY THE SERIES FOR THE I FUNCTION
        -	ZNR, ZNI, FNU, KODE, NN, YR, YI, NW, TOL = Zmlri(ZNR, ZNI, FNU, KODE, NN, YR, YI, NW, TOL)
        +	ZNR, ZNI, FNU, KODE, _, YR, YI, NW, TOL = Zmlri(ZNR, ZNI, FNU, KODE, NN, YR, YI, TOL)
         	if NW < 0 {
         		goto Eighty
         	}
         Forty:
         	// ANALYTIC CONTINUATION TO THE LEFT HALF PLANE FOR THE K FUNCTION.
        -	ZNR, ZNI, FNU, KODE, _, CYR, CYI, NW, TOL, ELIM, ALIM = Zbknu(ZNR, ZNI, FNU, KODE, 1, CYR, CYI, NW, TOL, ELIM, ALIM)
        +	ZNR, ZNI, FNU, KODE, _, CYR, CYI, NW, TOL, ELIM, ALIM = Zbknu(ZNR, ZNI, FNU, KODE, 1, CYR, CYI, TOL, ELIM, ALIM)
         	if NW != 0 {
         		goto Eighty
         	}
         	FMR = float64(float32(MR))
         	SGN = -math.Copysign(PI, FMR)
        -	CSGNR = 0.0E0
        +	CSGNR = 0.0e0
         	CSGNI = SGN
         	if KODE == 1 {
         		goto Fifty
        @@ -1507,11 +1503,11 @@ Sixty:
         		goto Seventy
         	}
         	IUF = 0
        -	ASCLE = 1.0E+3 * dmach[1] / TOL
        +	ASCLE = 1.0e+3 * dmach[1] / TOL
         	zn = complex(ZNR, ZNI)
         	c1 = complex(C1R, C1I)
         	c2 = complex(C2R, C2I)
        -	c1, c2, NW, IUF = Zs1s2(zn, c1, c2, ASCLE, ALIM, IUF)
        +	c1, c2, NW, _ = Zs1s2(zn, c1, c2, ASCLE, ALIM, IUF)
         	C1R = real(c1)
         	C1I = imag(c1)
         	C2R = real(c2)
        @@ -1533,8 +1529,8 @@ Eighty:
         // MEANS OF THE ASYMPTOTIC EXPANSION FOR LARGE CABS(Z) IN THE
         // REGION CABS(Z)>MAX(RL,FNU*FNU/2). NZ=0 IS A NORMAL return.
         // NZ<0 INDICATES AN OVERFLOW ON KODE=1.
        -func Zasyi(ZR, ZI, FNU float64, KODE, N int, YR, YI []float64, NZ int, RL, TOL, ELIM, ALIM float64) (
        -	ZRout, ZIout, FNUout float64, KODEout, Nout int, YRout, YIout []float64, NZout int, RLout, TOLout, ELIMout, ALIMout float64) {
        +func Zasyi(ZR, ZI, FNU float64, KODE, N int, YR, YI []float64, RL, TOL, ELIM, ALIM float64) (
        +	ZRout, ZIout, FNUout float64, KODEout, Nout int, YRout, YIout []float64, NZ int, RLout, TOLout, ELIMout, ALIMout float64) {
         	var AA, AEZ, AK, AK1I, AK1R, ARG, ARM, ATOL,
         		AZ, BB, BK, CKI, CKR, CONEI, CONER, CS1I, CS1R, CS2I, CS2R, CZI,
         		CZR, DFNU, DKI, DKR, DNU2, EZI, EZR, FDN, PI, P1I,
        @@ -1546,21 +1542,20 @@ func Zasyi(ZR, ZI, FNU float64, KODE, N int, YR, YI []float64, NZ int, RL, TOL,
         	// var sin, cos float64
         
         	PI = math.Pi
        -	RTPI = 0.159154943091895336E0
        +	RTPI = 0.159154943091895336e0
         	ZEROR = 0
         	ZEROI = 0
         	CONER = 1
         	CONEI = 0
         
        -	NZ = 0
         	AZ = cmplx.Abs(complex(ZR, ZI))
        -	ARM = 1.0E3 * dmach[1]
        +	ARM = 1.0e3 * dmach[1]
         	RTR1 = math.Sqrt(ARM)
         	IL = min(2, N)
         	DFNU = FNU + float64(float32(N-IL))
         
         	// OVERFLOW TEST
        -	RAZ = 1.0E0 / AZ
        +	RAZ = 1.0e0 / AZ
         	STR = ZR * RAZ
         	STI = -ZI * RAZ
         	AK1R = RTPI * STR * RAZ
        @@ -1592,22 +1587,22 @@ Ten:
         	AK1R = real(tmp)
         	AK1I = imag(tmp)
         Twenty:
        -	FDN = 0.0E0
        +	FDN = 0.0e0
         	if DNU2 > RTR1 {
         		FDN = DNU2 * DNU2
         	}
        -	EZR = ZR * 8.0E0
        -	EZI = ZI * 8.0E0
        +	EZR = ZR * 8.0e0
        +	EZI = ZI * 8.0e0
         
         	// WHEN Z IS IMAGINARY, THE ERROR TEST MUST BE MADE RELATIVE TO THE
         	// FIRST RECIPROCAL POWER SINCE THIS IS THE LEADING TERM OF THE
         	// EXPANSION FOR THE IMAGINARY PART.
        -	AEZ = 8.0E0 * AZ
        +	AEZ = 8.0e0 * AZ
         	S = TOL / AEZ
         	JL = int(float32(RL+RL)) + 2
         	P1R = ZEROR
         	P1I = ZEROI
        -	if ZI == 0.0E0 {
        +	if ZI == 0.0e0 {
         		goto Thirty
         	}
         
        @@ -1619,7 +1614,7 @@ Twenty:
         	//sin, cos = math.Sincos(ARG)
         	AK = -math.Sin(ARG)
         	BK = math.Cos(ARG)
        -	if ZI < 0.0E0 {
        +	if ZI < 0.0e0 {
         		BK = -BK
         	}
         	P1R = AK
        @@ -1631,17 +1626,17 @@ Twenty:
         	P1I = -P1I
         Thirty:
         	for K = 1; K <= IL; K++ {
        -		SQK = FDN - 1.0E0
        +		SQK = FDN - 1.0e0
         		ATOL = S * math.Abs(SQK)
        -		SGN = 1.0E0
        +		SGN = 1.0e0
         		CS1R = CONER
         		CS1I = CONEI
         		CS2R = CONER
         		CS2I = CONEI
         		CKR = CONER
         		CKI = CONEI
        -		AK = 0.0E0
        -		AA = 1.0E0
        +		AK = 0.0e0
        +		AA = 1.0e0
         		BB = AEZ
         		DKR = EZR
         		DKI = EZI
        @@ -1662,7 +1657,7 @@ Thirty:
         			DKI = DKI + EZI
         			AA = AA * math.Abs(SQK) / BB
         			BB = BB + AEZ
        -			AK = AK + 8.0E0
        +			AK = AK + 8.0e0
         			SQK = SQK - AK
         			if AA <= ATOL {
         				goto Fifty
        @@ -1689,7 +1684,7 @@ Thirty:
         		S2R = S2R + STR
         		S2I = S2I + STI
         	Sixty:
        -		FDN = FDN + 8.0E0*DFNU + 4.0E0
        +		FDN = FDN + 8.0e0*DFNU + 4.0e0
         		P1R = -P1R
         		P1I = -P1I
         		M = N - IL + K
        @@ -1710,7 +1705,7 @@ Thirty:
         	for I = IB; I <= NN; I++ {
         		YR[K] = (AK+FNU)*(RZR*YR[K+1]-RZI*YI[K+1]) + YR[K+2]
         		YI[K] = (AK+FNU)*(RZR*YI[K+1]+RZI*YR[K+1]) + YI[K+2]
        -		AK = AK - 1.0E0
        +		AK = AK - 1.0e0
         		K = K - 1
         	}
         	if KODED == 0 {
        @@ -1735,8 +1730,8 @@ OneTen:
         
         // ZMLRI COMPUTES THE I BESSEL FUNCTION FOR RE(Z)>=0.0 BY THE
         // MILLER ALGORITHM NORMALIZED BY A NEUMANN SERIES.
        -func Zmlri(ZR, ZI, FNU float64, KODE, N int, YR, YI []float64, NZ int, TOL float64) (
        -	ZRout, ZIout, FNUout float64, KODEout, Nout int, YRout, YIout []float64, NZout int, TOLout float64) {
        +func Zmlri(ZR, ZI, FNU float64, KODE, N int, YR, YI []float64, TOL float64) (
        +	ZRout, ZIout, FNUout float64, KODEout, Nout int, YRout, YIout []float64, NZ int, TOLout float64) {
         	var ACK, AK, AP, AT, AZ, BK, CKI, CKR, CNORMI,
         		CNORMR, CONEI, CONER, FKAP, FKK, FLAM, FNF, PTI, PTR, P1I,
         		P1R, P2I, P2R, RAZ, RHO, RHO2, RZI, RZR, SCLE, STI, STR, SUMI,
        @@ -1749,13 +1744,12 @@ func Zmlri(ZR, ZI, FNU float64, KODE, N int, YR, YI []float64, NZ int, TOL float
         	CONEI = 0
         
         	SCLE = dmach[1] / TOL
        -	NZ = 0
         	AZ = cmplx.Abs(complex(ZR, ZI))
         	IAZ = int(float32(AZ))
         	IFNU = int(float32(FNU))
         	INU = IFNU + N - 1
        -	AT = float64(float32(IAZ)) + 1.0E0
        -	RAZ = 1.0E0 / AZ
        +	AT = float64(float32(IAZ)) + 1.0e0
        +	RAZ = 1.0e0 / AZ
         	STR = ZR * RAZ
         	STI = -ZI * RAZ
         	CKR = STR * AT * RAZ
        @@ -1766,10 +1760,10 @@ func Zmlri(ZR, ZI, FNU float64, KODE, N int, YR, YI []float64, NZ int, TOL float
         	P1I = ZEROI
         	P2R = CONER
         	P2I = CONEI
        -	ACK = (AT + 1.0E0) * RAZ
        -	RHO = ACK + math.Sqrt(ACK*ACK-1.0E0)
        +	ACK = (AT + 1.0e0) * RAZ
        +	RHO = ACK + math.Sqrt(ACK*ACK-1.0e0)
         	RHO2 = RHO * RHO
        -	TST = (RHO2 + RHO2) / ((RHO2 - 1.0E0) * (RHO - 1.0E0))
        +	TST = (RHO2 + RHO2) / ((RHO2 - 1.0e0) * (RHO - 1.0e0))
         	TST = TST / TOL
         
         	// COMPUTE RELATIVE TRUNCATION ERROR INDEX FOR SERIES.
        @@ -1788,7 +1782,7 @@ func Zmlri(ZR, ZI, FNU float64, KODE, N int, YR, YI []float64, NZ int, TOL float
         		if AP > TST*AK*AK {
         			goto Twenty
         		}
        -		AK = AK + 1.0E0
        +		AK = AK + 1.0e0
         	}
         	goto OneTen
         Twenty:
        @@ -1802,7 +1796,7 @@ Twenty:
         	P1I = ZEROI
         	P2R = CONER
         	P2I = CONEI
        -	AT = float64(float32(INU)) + 1.0E0
        +	AT = float64(float32(INU)) + 1.0e0
         	STR = ZR * RAZ
         	STI = -ZI * RAZ
         	CKR = STR * AT * RAZ
        @@ -1827,10 +1821,10 @@ Twenty:
         			goto Forty
         		}
         		ACK = cmplx.Abs(complex(CKR, CKI))
        -		FLAM = ACK + math.Sqrt(ACK*ACK-1.0E0)
        +		FLAM = ACK + math.Sqrt(ACK*ACK-1.0e0)
         		FKAP = AP / cmplx.Abs(complex(P1R, P1I))
         		RHO = math.Min(FLAM, FKAP)
        -		TST = TST * math.Sqrt(RHO/(RHO*RHO-1.0E0))
        +		TST = TST * math.Sqrt(RHO/(RHO*RHO-1.0e0))
         		ITIME = 2
         	}
         	goto OneTen
        @@ -1847,7 +1841,7 @@ Forty:
         	P2I = ZEROI
         	FNF = FNU - float64(float32(IFNU))
         	TFNF = FNF + FNF
        -	BK = dgamln(FKK+TFNF+1.0E0, IDUM) - dgamln(FKK+1.0E0, IDUM) - dgamln(TFNF+1.0E0, IDUM)
        +	BK = dgamln(FKK+TFNF+1.0e0, IDUM) - dgamln(FKK+1.0e0, IDUM) - dgamln(TFNF+1.0e0, IDUM)
         	BK = math.Exp(BK)
         	SUMR = ZEROR
         	SUMI = ZEROI
        @@ -1859,12 +1853,12 @@ Forty:
         		P2I = P1I + (FKK+FNF)*(RZI*PTR+RZR*PTI)
         		P1R = PTR
         		P1I = PTI
        -		AK = 1.0E0 - TFNF/(FKK+TFNF)
        +		AK = 1.0e0 - TFNF/(FKK+TFNF)
         		ACK = BK * AK
         		SUMR = SUMR + (ACK+BK)*P1R
         		SUMI = SUMI + (ACK+BK)*P1I
         		BK = ACK
        -		FKK = FKK - 1.0E0
        +		FKK = FKK - 1.0e0
         	}
         	YR[N] = P2R
         	YI[N] = P2I
        @@ -1878,12 +1872,12 @@ Forty:
         		P2I = P1I + (FKK+FNF)*(RZI*PTR+RZR*PTI)
         		P1R = PTR
         		P1I = PTI
        -		AK = 1.0E0 - TFNF/(FKK+TFNF)
        +		AK = 1.0e0 - TFNF/(FKK+TFNF)
         		ACK = BK * AK
         		SUMR = SUMR + (ACK+BK)*P1R
         		SUMI = SUMI + (ACK+BK)*P1I
         		BK = ACK
        -		FKK = FKK - 1.0E0
        +		FKK = FKK - 1.0e0
         		M = N - I + 1
         		YR[M] = P2R
         		YI[M] = P2I
        @@ -1899,12 +1893,12 @@ Seventy:
         		P2I = P1I + (FKK+FNF)*(RZR*PTI+RZI*PTR)
         		P1R = PTR
         		P1I = PTI
        -		AK = 1.0E0 - TFNF/(FKK+TFNF)
        +		AK = 1.0e0 - TFNF/(FKK+TFNF)
         		ACK = BK * AK
         		SUMR = SUMR + (ACK+BK)*P1R
         		SUMI = SUMI + (ACK+BK)*P1I
         		BK = ACK
        -		FKK = FKK - 1.0E0
        +		FKK = FKK - 1.0e0
         	}
         Ninety:
         	PTR = ZR
        @@ -1917,7 +1911,7 @@ Ninety:
         	STI = imag(tmp)
         	P1R = -FNF*STR + PTR
         	P1I = -FNF*STI + PTI
        -	AP = dgamln(1.0E0+FNF, IDUM)
        +	AP = dgamln(1.0e0+FNF, IDUM)
         	PTR = P1R - AP
         	PTI = P1I
         
        @@ -1926,7 +1920,7 @@ Ninety:
         	P2R = P2R + SUMR
         	P2I = P2I + SUMI
         	AP = cmplx.Abs(complex(P2R, P2I))
        -	P1R = 1.0E0 / AP
        +	P1R = 1.0e0 / AP
         	tmp = cmplx.Exp(complex(PTR, PTI))
         	STR = real(tmp)
         	STI = imag(tmp)
        diff --git a/vendor/gonum.org/v1/gonum/mathext/internal/cephes/cephes.go b/vendor/gonum.org/v1/gonum/mathext/internal/cephes/cephes.go
        index d01552ac7..20cac067e 100644
        --- a/vendor/gonum.org/v1/gonum/mathext/internal/cephes/cephes.go
        +++ b/vendor/gonum.org/v1/gonum/mathext/internal/cephes/cephes.go
        @@ -15,9 +15,9 @@ See https://github.com/deepmind/torch-cephes/blob/master/LICENSE.txt and
         https://lists.debian.org/debian-legal/2004/12/msg00295.html
         */
         
        -var (
        -	badParamOutOfBounds         = "cephes: parameter out of bounds"
        -	badParamFunctionSingularity = "cephes: function singularity"
        +const (
        +	paramOutOfBounds            = "cephes: parameter out of bounds"
        +	errParamFunctionSingularity = "cephes: function singularity"
         )
         
         const (
        diff --git a/vendor/gonum.org/v1/gonum/mathext/internal/cephes/igam.go b/vendor/gonum.org/v1/gonum/mathext/internal/cephes/igam.go
        index 9bd044549..fcd2a1833 100644
        --- a/vendor/gonum.org/v1/gonum/mathext/internal/cephes/igam.go
        +++ b/vendor/gonum.org/v1/gonum/mathext/internal/cephes/igam.go
        @@ -69,7 +69,7 @@ func Igam(a, x float64) float64 {
         	}
         
         	if x < 0 || a <= 0 {
        -		panic(badParamOutOfBounds)
        +		panic(paramOutOfBounds)
         	}
         
         	// Asymptotic regime where a ~ x; see [2].
        @@ -101,7 +101,7 @@ func IgamC(a, x float64) float64 {
         
         	switch {
         	case x < 0, a <= 0:
        -		panic(badParamOutOfBounds)
        +		panic(paramOutOfBounds)
         	case x == 0:
         		return 1
         	case math.IsInf(x, 0):
        diff --git a/vendor/gonum.org/v1/gonum/mathext/internal/cephes/igami.go b/vendor/gonum.org/v1/gonum/mathext/internal/cephes/igami.go
        index 446e8ccfb..697582e43 100644
        --- a/vendor/gonum.org/v1/gonum/mathext/internal/cephes/igami.go
        +++ b/vendor/gonum.org/v1/gonum/mathext/internal/cephes/igami.go
        @@ -26,7 +26,7 @@ func IgamI(a, p float64) float64 {
         	dithresh := 5.0 * machEp
         
         	if p < 0 || p > 1 || a <= 0 {
        -		panic(badParamOutOfBounds)
        +		panic(paramOutOfBounds)
         	}
         
         	if p == 0 {
        diff --git a/vendor/gonum.org/v1/gonum/mathext/internal/cephes/incbeta.go b/vendor/gonum.org/v1/gonum/mathext/internal/cephes/incbeta.go
        index 661846f8f..6a818154f 100644
        --- a/vendor/gonum.org/v1/gonum/mathext/internal/cephes/incbeta.go
        +++ b/vendor/gonum.org/v1/gonum/mathext/internal/cephes/incbeta.go
        @@ -24,7 +24,7 @@ const (
         // Incbet computes the regularized incomplete beta function.
         func Incbet(aa, bb, xx float64) float64 {
         	if aa <= 0 || bb <= 0 {
        -		panic(badParamOutOfBounds)
        +		panic(paramOutOfBounds)
         	}
         	if xx <= 0 || xx >= 1 {
         		if xx == 0 {
        @@ -33,7 +33,7 @@ func Incbet(aa, bb, xx float64) float64 {
         		if xx == 1 {
         			return 1
         		}
        -		panic(badParamOutOfBounds)
        +		panic(paramOutOfBounds)
         	}
         
         	var flag int
        diff --git a/vendor/gonum.org/v1/gonum/mathext/internal/cephes/incbi.go b/vendor/gonum.org/v1/gonum/mathext/internal/cephes/incbi.go
        index b878af098..2b612d83f 100644
        --- a/vendor/gonum.org/v1/gonum/mathext/internal/cephes/incbi.go
        +++ b/vendor/gonum.org/v1/gonum/mathext/internal/cephes/incbi.go
        @@ -16,7 +16,6 @@ func Incbi(aa, bb, yy0 float64) float64 {
         	var a, b, y0, d, y, x, x0, x1, lgm, yp, di, dithresh, yl, yh, xt float64
         	var i, rflg, dir, nflg int
         
        -	i = 0
         	if yy0 <= 0 {
         		return (0.0)
         	}
        diff --git a/vendor/gonum.org/v1/gonum/mathext/internal/cephes/ndtri.go b/vendor/gonum.org/v1/gonum/mathext/internal/cephes/ndtri.go
        index efaec7f76..03910ff8f 100644
        --- a/vendor/gonum.org/v1/gonum/mathext/internal/cephes/ndtri.go
        +++ b/vendor/gonum.org/v1/gonum/mathext/internal/cephes/ndtri.go
        @@ -18,79 +18,79 @@ import "math"
         // gonum/mathext/internal/gonum.
         
         // math.Sqrt(2*pi)
        -const s2pi = 2.50662827463100050242E0
        +const s2pi = 2.50662827463100050242e0
         
         // approximation for 0 <= |y - 0.5| <= 3/8
         var P0 = [5]float64{
        -	-5.99633501014107895267E1,
        -	9.80010754185999661536E1,
        -	-5.66762857469070293439E1,
        -	1.39312609387279679503E1,
        -	-1.23916583867381258016E0,
        +	-5.99633501014107895267e1,
        +	9.80010754185999661536e1,
        +	-5.66762857469070293439e1,
        +	1.39312609387279679503e1,
        +	-1.23916583867381258016e0,
         }
         
         var Q0 = [8]float64{
         	/* 1.00000000000000000000E0, */
        -	1.95448858338141759834E0,
        -	4.67627912898881538453E0,
        -	8.63602421390890590575E1,
        -	-2.25462687854119370527E2,
        -	2.00260212380060660359E2,
        -	-8.20372256168333339912E1,
        -	1.59056225126211695515E1,
        -	-1.18331621121330003142E0,
        +	1.95448858338141759834e0,
        +	4.67627912898881538453e0,
        +	8.63602421390890590575e1,
        +	-2.25462687854119370527e2,
        +	2.00260212380060660359e2,
        +	-8.20372256168333339912e1,
        +	1.59056225126211695515e1,
        +	-1.18331621121330003142e0,
         }
         
         // Approximation for interval z = math.Sqrt(-2 log y ) between 2 and 8
         // i.e., y between exp(-2) = .135 and exp(-32) = 1.27e-14.
         var P1 = [9]float64{
        -	4.05544892305962419923E0,
        -	3.15251094599893866154E1,
        -	5.71628192246421288162E1,
        -	4.40805073893200834700E1,
        -	1.46849561928858024014E1,
        -	2.18663306850790267539E0,
        -	-1.40256079171354495875E-1,
        -	-3.50424626827848203418E-2,
        -	-8.57456785154685413611E-4,
        +	4.05544892305962419923e0,
        +	3.15251094599893866154e1,
        +	5.71628192246421288162e1,
        +	4.40805073893200834700e1,
        +	1.46849561928858024014e1,
        +	2.18663306850790267539e0,
        +	-1.40256079171354495875e-1,
        +	-3.50424626827848203418e-2,
        +	-8.57456785154685413611e-4,
         }
         
         var Q1 = [8]float64{
         	/*  1.00000000000000000000E0, */
        -	1.57799883256466749731E1,
        -	4.53907635128879210584E1,
        -	4.13172038254672030440E1,
        -	1.50425385692907503408E1,
        -	2.50464946208309415979E0,
        -	-1.42182922854787788574E-1,
        -	-3.80806407691578277194E-2,
        -	-9.33259480895457427372E-4,
        +	1.57799883256466749731e1,
        +	4.53907635128879210584e1,
        +	4.13172038254672030440e1,
        +	1.50425385692907503408e1,
        +	2.50464946208309415979e0,
        +	-1.42182922854787788574e-1,
        +	-3.80806407691578277194e-2,
        +	-9.33259480895457427372e-4,
         }
         
         // Approximation for interval z = math.Sqrt(-2 log y ) between 8 and 64
         // i.e., y between exp(-32) = 1.27e-14 and exp(-2048) = 3.67e-890.
         var P2 = [9]float64{
        -	3.23774891776946035970E0,
        -	6.91522889068984211695E0,
        -	3.93881025292474443415E0,
        -	1.33303460815807542389E0,
        -	2.01485389549179081538E-1,
        -	1.23716634817820021358E-2,
        -	3.01581553508235416007E-4,
        -	2.65806974686737550832E-6,
        -	6.23974539184983293730E-9,
        +	3.23774891776946035970e0,
        +	6.91522889068984211695e0,
        +	3.93881025292474443415e0,
        +	1.33303460815807542389e0,
        +	2.01485389549179081538e-1,
        +	1.23716634817820021358e-2,
        +	3.01581553508235416007e-4,
        +	2.65806974686737550832e-6,
        +	6.23974539184983293730e-9,
         }
         
         var Q2 = [8]float64{
         	/*  1.00000000000000000000E0, */
        -	6.02427039364742014255E0,
        -	3.67983563856160859403E0,
        -	1.37702099489081330271E0,
        -	2.16236993594496635890E-1,
        -	1.34204006088543189037E-2,
        -	3.28014464682127739104E-4,
        -	2.89247864745380683936E-6,
        -	6.79019408009981274425E-9,
        +	6.02427039364742014255e0,
        +	3.67983563856160859403e0,
        +	1.37702099489081330271e0,
        +	2.16236993594496635890e-1,
        +	1.34204006088543189037e-2,
        +	3.28014464682127739104e-4,
        +	2.89247864745380683936e-6,
        +	6.79019408009981274425e-9,
         }
         
         // Ndtri returns the argument, x, for which the area under the
        @@ -108,13 +108,13 @@ func Ndtri(y0 float64) float64 {
         
         	if y0 <= 0.0 {
         		if y0 < 0 {
        -			panic(badParamOutOfBounds)
        +			panic(paramOutOfBounds)
         		}
         		return math.Inf(-1)
         	}
         	if y0 >= 1.0 {
         		if y0 > 1 {
        -			panic(badParamOutOfBounds)
        +			panic(paramOutOfBounds)
         		}
         		return math.Inf(1)
         	}
        diff --git a/vendor/gonum.org/v1/gonum/mathext/internal/cephes/unity.go b/vendor/gonum.org/v1/gonum/mathext/internal/cephes/unity.go
        index 38e8c631f..cb1695fa8 100644
        --- a/vendor/gonum.org/v1/gonum/mathext/internal/cephes/unity.go
        +++ b/vendor/gonum.org/v1/gonum/mathext/internal/cephes/unity.go
        @@ -29,22 +29,22 @@ const (
         //  \frac{1}{\sqrt{2}} <= x < \sqrt{2}
         // Theoretical peak relative error = 2.32e-20
         var lP = [...]float64{
        -	4.5270000862445199635215E-5,
        -	4.9854102823193375972212E-1,
        -	6.5787325942061044846969E0,
        -	2.9911919328553073277375E1,
        -	6.0949667980987787057556E1,
        -	5.7112963590585538103336E1,
        -	2.0039553499201281259648E1,
        +	4.5270000862445199635215e-5,
        +	4.9854102823193375972212e-1,
        +	6.5787325942061044846969e0,
        +	2.9911919328553073277375e1,
        +	6.0949667980987787057556e1,
        +	5.7112963590585538103336e1,
        +	2.0039553499201281259648e1,
         }
         
         var lQ = [...]float64{
        -	1.5062909083469192043167E1,
        -	8.3047565967967209469434E1,
        -	2.2176239823732856465394E2,
        -	3.0909872225312059774938E2,
        -	2.1642788614495947685003E2,
        -	6.0118660497603843919306E1,
        +	1.5062909083469192043167e1,
        +	8.3047565967967209469434e1,
        +	2.2176239823732856465394e2,
        +	3.0909872225312059774938e2,
        +	2.1642788614495947685003e2,
        +	6.0118660497603843919306e1,
         }
         
         // log1p computes
        @@ -85,16 +85,16 @@ func log1pmx(x float64) float64 {
         // for
         //  -0.5 <= x <= 0.5
         var eP = [...]float64{
        -	1.2617719307481059087798E-4,
        -	3.0299440770744196129956E-2,
        -	9.9999999999999999991025E-1,
        +	1.2617719307481059087798e-4,
        +	3.0299440770744196129956e-2,
        +	9.9999999999999999991025e-1,
         }
         
         var eQ = [...]float64{
        -	3.0019850513866445504159E-6,
        -	2.5244834034968410419224E-3,
        -	2.2726554820815502876593E-1,
        -	2.0000000000000000000897E0,
        +	3.0019850513866445504159e-6,
        +	2.5244834034968410419224e-3,
        +	2.2726554820815502876593e-1,
        +	2.0000000000000000000897e0,
         }
         
         // expm1 computes
        @@ -116,13 +116,13 @@ func expm1(x float64) float64 {
         }
         
         var coscof = [...]float64{
        -	4.7377507964246204691685E-14,
        -	-1.1470284843425359765671E-11,
        -	2.0876754287081521758361E-9,
        -	-2.7557319214999787979814E-7,
        -	2.4801587301570552304991E-5,
        -	-1.3888888888888872993737E-3,
        -	4.1666666666666666609054E-2,
        +	4.7377507964246204691685e-14,
        +	-1.1470284843425359765671e-11,
        +	2.0876754287081521758361e-9,
        +	-2.7557319214999787979814e-7,
        +	2.4801587301570552304991e-5,
        +	-1.3888888888888872993737e-3,
        +	4.1666666666666666609054e-2,
         }
         
         // cosm1 computes
        diff --git a/vendor/gonum.org/v1/gonum/mathext/internal/cephes/zeta.go b/vendor/gonum.org/v1/gonum/mathext/internal/cephes/zeta.go
        index 746c0a5f5..f87b552e2 100644
        --- a/vendor/gonum.org/v1/gonum/mathext/internal/cephes/zeta.go
        +++ b/vendor/gonum.org/v1/gonum/mathext/internal/cephes/zeta.go
        @@ -48,15 +48,15 @@ func Zeta(x, q float64) float64 {
         	}
         
         	if x < 1 {
        -		panic(badParamOutOfBounds)
        +		panic(paramOutOfBounds)
         	}
         
         	if q <= 0 {
         		if q == math.Floor(q) {
        -			panic(badParamFunctionSingularity)
        +			panic(errParamFunctionSingularity)
         		}
         		if x != math.Floor(x) {
        -			panic(badParamOutOfBounds) // Because q^-x not defined
        +			panic(paramOutOfBounds) // Because q^-x not defined
         		}
         	}
         
        diff --git a/vendor/gonum.org/v1/gonum/stat/combin/combin.go b/vendor/gonum.org/v1/gonum/stat/combin/combin.go
        new file mode 100644
        index 000000000..c50b9492a
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/stat/combin/combin.go
        @@ -0,0 +1,677 @@
        +// Copyright ©2016 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package combin
        +
        +import (
        +	"math"
        +	"sort"
        +)
        +
        +const (
        +	errNegInput             = "combin: negative input"
        +	badSetSize              = "combin: n < k"
        +	badInput                = "combin: wrong input slice length"
        +	errNonpositiveDimension = "combin: non-positive dimension"
        +)
        +
        +// Binomial returns the binomial coefficient of (n,k), also commonly referred to
        +// as "n choose k".
        +//
        +// The binomial coefficient, C(n,k), is the number of unordered combinations of
        +// k elements in a set that is n elements big, and is defined as
        +//
        +//  C(n,k) = n!/((n-k)!k!)
        +//
        +// n and k must be non-negative with n >= k, otherwise Binomial will panic.
        +// No check is made for overflow.
        +func Binomial(n, k int) int {
        +	if n < 0 || k < 0 {
        +		panic(errNegInput)
        +	}
        +	if n < k {
        +		panic(badSetSize)
        +	}
        +	// (n,k) = (n, n-k)
        +	if k > n/2 {
        +		k = n - k
        +	}
        +	b := 1
        +	for i := 1; i <= k; i++ {
        +		b = (n - k + i) * b / i
        +	}
        +	return b
        +}
        +
        +// GeneralizedBinomial returns the generalized binomial coefficient of (n, k),
        +// defined as
        +//  Γ(n+1) / (Γ(k+1) Γ(n-k+1))
        +// where Γ is the Gamma function. GeneralizedBinomial is useful for continuous
        +// relaxations of the binomial coefficient, or when the binomial coefficient value
        +// may overflow int. In the latter case, one may use math/big for an exact
        +// computation.
        +//
        +// n and k must be non-negative with n >= k, otherwise GeneralizedBinomial will panic.
        +func GeneralizedBinomial(n, k float64) float64 {
        +	return math.Exp(LogGeneralizedBinomial(n, k))
        +}
        +
        +// LogGeneralizedBinomial returns the log of the generalized binomial coefficient.
        +// See GeneralizedBinomial for more information.
        +func LogGeneralizedBinomial(n, k float64) float64 {
        +	if n < 0 || k < 0 {
        +		panic(errNegInput)
        +	}
        +	if n < k {
        +		panic(badSetSize)
        +	}
        +	a, _ := math.Lgamma(n + 1)
        +	b, _ := math.Lgamma(k + 1)
        +	c, _ := math.Lgamma(n - k + 1)
        +	return a - b - c
        +}
        +
        +// CombinationGenerator generates combinations iteratively. The Combinations
        +// function may be called to generate all combinations collectively.
        +type CombinationGenerator struct {
        +	n         int
        +	k         int
        +	previous  []int
        +	remaining int
        +}
        +
        +// NewCombinationGenerator returns a CombinationGenerator for generating the
        +// combinations of k elements from a set of size n.
        +//
        +// n and k must be non-negative with n >= k, otherwise NewCombinationGenerator
        +// will panic.
        +func NewCombinationGenerator(n, k int) *CombinationGenerator {
        +	return &CombinationGenerator{
        +		n:         n,
        +		k:         k,
        +		remaining: Binomial(n, k),
        +	}
        +}
        +
        +// Next advances the iterator if there are combinations remaining to be generated,
        +// and returns false if all combinations have been generated. Next must be called
        +// to initialize the first value before calling Combination or Combination will
        +// panic. The value returned by Combination is only changed during calls to Next.
        +func (c *CombinationGenerator) Next() bool {
        +	if c.remaining <= 0 {
        +		// Next is called before combination, so c.remaining is set to zero before
        +		// Combination is called. Thus, Combination cannot panic on zero, and a
        +		// second sentinel value is needed.
        +		c.remaining = -1
        +		return false
        +	}
        +	if c.previous == nil {
        +		c.previous = make([]int, c.k)
        +		for i := range c.previous {
        +			c.previous[i] = i
        +		}
        +	} else {
        +		nextCombination(c.previous, c.n, c.k)
        +	}
        +	c.remaining--
        +	return true
        +}
        +
        +// Combination returns the current combination. If dst is non-nil, it must have
        +// length k and the result will be stored in-place into dst. If dst
        +// is nil a new slice will be allocated and returned. If all of the combinations
        +// have already been constructed (Next() returns false), Combination will panic.
        +//
        +// Next must be called to initialize the first value before calling Combination
        +// or Combination will panic. The value returned by Combination is only changed
        +// during calls to Next.
        +func (c *CombinationGenerator) Combination(dst []int) []int {
        +	if c.remaining == -1 {
        +		panic("combin: all combinations have been generated")
        +	}
        +	if c.previous == nil {
        +		panic("combin: Combination called before Next")
        +	}
        +	if dst == nil {
        +		dst = make([]int, c.k)
        +	} else if len(dst) != c.k {
        +		panic(badInput)
        +	}
        +	copy(dst, c.previous)
        +	return dst
        +}
        +
        +// Combinations generates all of the combinations of k elements from a
        +// set of size n. The returned slice has length Binomial(n,k) and each inner slice
        +// has length k.
        +//
        +// n and k must be non-negative with n >= k, otherwise Combinations will panic.
        +//
        +// CombinationGenerator may alternatively be used to generate the combinations
        +// iteratively instead of collectively, or IndexToCombination for random access.
        +func Combinations(n, k int) [][]int {
        +	combins := Binomial(n, k)
        +	data := make([][]int, combins)
        +	if len(data) == 0 {
        +		return data
        +	}
        +	data[0] = make([]int, k)
        +	for i := range data[0] {
        +		data[0][i] = i
        +	}
        +	for i := 1; i < combins; i++ {
        +		next := make([]int, k)
        +		copy(next, data[i-1])
        +		nextCombination(next, n, k)
        +		data[i] = next
        +	}
        +	return data
        +}
        +
        +// nextCombination generates the combination after s, overwriting the input value.
        +func nextCombination(s []int, n, k int) {
        +	for j := k - 1; j >= 0; j-- {
        +		if s[j] == n+j-k {
        +			continue
        +		}
        +		s[j]++
        +		for l := j + 1; l < k; l++ {
        +			s[l] = s[j] + l - j
        +		}
        +		break
        +	}
        +}
        +
        +// CombinationIndex returns the index of the given combination.
        +//
        +// The functions CombinationIndex and IndexToCombination define a bijection
        +// between the integers and the Binomial(n, k) number of possible combinations.
        +// CombinationIndex returns the inverse of IndexToCombination.
        +//
        +// CombinationIndex panics if comb is not a sorted combination of the first
        +// [0,n) integers, if n or k are non-negative, or if k is greater than n.
        +func CombinationIndex(comb []int, n, k int) int {
        +	if n < 0 || k < 0 {
        +		panic(errNegInput)
        +	}
        +	if n < k {
        +		panic(badSetSize)
        +	}
        +	if len(comb) != k {
        +		panic("combin: bad length combination")
        +	}
        +	if !sort.IntsAreSorted(comb) {
        +		panic("combin: input combination is not sorted")
        +	}
        +	contains := make(map[int]struct{}, k)
        +	for _, v := range comb {
        +		contains[v] = struct{}{}
        +	}
        +	if len(contains) != k {
        +		panic("combin: comb contains non-unique elements")
        +	}
        +	// This algorithm iterates in reverse lexicograhpic order.
        +	// Flip the index and values to swap the order.
        +	rev := make([]int, k)
        +	for i, v := range comb {
        +		rev[len(comb)-i-1] = n - v - 1
        +	}
        +	idx := 0
        +	for i, v := range rev {
        +		if v >= i+1 {
        +			idx += Binomial(v, i+1)
        +		}
        +	}
        +	return Binomial(n, k) - 1 - idx
        +}
        +
        +// IndexToCombination returns the combination corresponding to the given index.
        +//
        +// The functions CombinationIndex and IndexToCombination define a bijection
        +// between the integers and the Binomial(n, k) number of possible combinations.
        +// IndexToCombination returns the inverse of CombinationIndex (up to the order
        +// of the elements).
        +//
        +// The combination is stored in-place into dst if dst is non-nil, otherwise
        +// a new slice is allocated and returned.
        +//
        +// IndexToCombination panics if n or k are non-negative, if k is greater than n,
        +// or if idx is not in [0, Binomial(n,k)-1]. IndexToCombination will also panic
        +// if dst is non-nil and len(dst) is not k.
        +func IndexToCombination(dst []int, idx, n, k int) []int {
        +	if idx < 0 || idx >= Binomial(n, k) {
        +		panic("combin: invalid index")
        +	}
        +	if dst == nil {
        +		dst = make([]int, k)
        +	} else if len(dst) != k {
        +		panic(badInput)
        +	}
        +	// The base algorithm indexes in reverse lexicographic order
        +	// flip the values and the index.
        +	idx = Binomial(n, k) - 1 - idx
        +	for i := range dst {
        +		// Find the largest number m such that Binomial(m, k-i) <= idx.
        +		// This is one less than the first number such that it is larger.
        +		m := sort.Search(n, func(m int) bool {
        +			if m < k-i {
        +				return false
        +			}
        +			return Binomial(m, k-i) > idx
        +		})
        +		m--
        +		// Normally this is put m into the last free spot, but we
        +		// reverse the index and the value.
        +		dst[i] = n - m - 1
        +		if m >= k-i {
        +			idx -= Binomial(m, k-i)
        +		}
        +	}
        +	return dst
        +}
        +
        +// Cartesian returns the Cartesian product of the slices in data. The Cartesian
        +// product of two sets is the set of all combinations of the items. For example,
        +// given the input
        +//  []int{2, 3, 1}
        +// the returned matrix will be
        +//  [ 0 0 0 ]
        +//  [ 0 1 0 ]
        +//  [ 0 2 0 ]
        +//  [ 1 0 0 ]
        +//  [ 1 1 0 ]
        +//  [ 1 2 0 ]
        +// Cartesian panics if any of the provided lengths are less than 1.
        +func Cartesian(lens []int) [][]int {
        +	rows := Card(lens)
        +	if rows == 0 {
        +		panic("combin: empty lengths")
        +	}
        +	out := make([][]int, rows)
        +	for i := 0; i < rows; i++ {
        +		out[i] = SubFor(nil, i, lens)
        +	}
        +	return out
        +}
        +
        +// Card computes the cardinality of the multi-dimensional space whose dimensions have size specified by dims
        +// All length values must be positive, otherwise this will panic.
        +func Card(dims []int) int {
        +	if len(dims) == 0 {
        +		return 0
        +	}
        +	card := 1
        +	for _, v := range dims {
        +		if v < 0 {
        +			panic("combin: length less than zero")
        +		}
        +		card *= v
        +	}
        +	return card
        +}
        +
        +// NewCartesianGenerator returns a CartesianGenerator for iterating over Cartesian products which are generated on the fly.
        +// All values in lens must be positive, otherwise this will panic.
        +func NewCartesianGenerator(lens []int) *CartesianGenerator {
        +	return &CartesianGenerator{
        +		lens: lens,
        +		rows: Card(lens),
        +		idx:  -1,
        +	}
        +}
        +
        +// CartesianGenerator iterates over a Cartesian product set.
        +type CartesianGenerator struct {
        +	lens []int
        +	rows int
        +	idx  int
        +}
        +
        +// Next moves to the next product of the Cartesian set.
        +// It returns false if the generator reached the end of the Cartesian set end.
        +func (g *CartesianGenerator) Next() bool {
        +	if g.idx+1 < g.rows {
        +		g.idx++
        +		return true
        +	}
        +	g.idx = g.rows
        +	return false
        +}
        +
        +// Product generates one product of the Cartesian set according to the current index which is increased by Next().
        +// Next needs to be called at least one time before this method, otherwise it will panic.
        +func (g *CartesianGenerator) Product(dst []int) []int {
        +	return SubFor(dst, g.idx, g.lens)
        +}
        +
        +// IdxFor converts a multi-dimensional index into a linear index for a
        +// multi-dimensional space. sub specifies the index for each dimension, and dims
        +// specifies the size of each dimension. IdxFor is the inverse of SubFor.
        +// IdxFor panics if any of the entries of sub are negative, any of the entries
        +// of dim are non-positive, or if sub[i] >= dims[i] for any i.
        +func IdxFor(sub, dims []int) int {
        +	// The index returned is "row-major", that is the last index of sub is
        +	// continuous.
        +	var idx int
        +	stride := 1
        +	for i := len(dims) - 1; i >= 0; i-- {
        +		v := sub[i]
        +		d := dims[i]
        +		if d <= 0 {
        +			panic(errNonpositiveDimension)
        +		}
        +		if v < 0 || v >= d {
        +			panic("combin: invalid subscript")
        +		}
        +		idx += v * stride
        +		stride *= d
        +	}
        +	return idx
        +}
        +
        +// SubFor returns the multi-dimensional subscript for the input linear index to
        +// the multi-dimensional space. dims specifies the size of each dimension, and
        +// idx specifies the linear index. SubFor is the inverse of IdxFor.
        +//
        +// If sub is non-nil the result is stored in-place into sub, and SubFor will panic
        +// if len(sub) != len(dims). If sub is nil a new slice of the appropriate length
        +// is allocated. SubFor panics if idx < 0 or if idx is greater than or equal to
        +// the product of the dimensions.
        +func SubFor(sub []int, idx int, dims []int) []int {
        +	if sub == nil {
        +		sub = make([]int, len(dims))
        +	}
        +	if len(sub) != len(dims) {
        +		panic(badInput)
        +	}
        +	if idx < 0 {
        +		panic(errNegInput)
        +	}
        +	stride := 1
        +	for i := len(dims) - 1; i >= 1; i-- {
        +		stride *= dims[i]
        +	}
        +	for i := 0; i < len(dims)-1; i++ {
        +		v := idx / stride
        +		d := dims[i]
        +		if d < 0 {
        +			panic(errNonpositiveDimension)
        +		}
        +		if v >= dims[i] {
        +			panic("combin: index too large")
        +		}
        +		sub[i] = v
        +		idx -= v * stride
        +		stride /= dims[i+1]
        +	}
        +	if idx > dims[len(sub)-1] {
        +		panic("combin: index too large")
        +	}
        +	sub[len(sub)-1] = idx
        +	return sub
        +}
        +
        +// NumPermutations returns the number of permutations when selecting k
        +// objects from a set of n objects when the selection order matters.
        +// No check is made for overflow.
        +//
        +// NumPermutations panics if either n or k is negative, or if k is
        +// greater than n.
        +func NumPermutations(n, k int) int {
        +	if n < 0 {
        +		panic("combin: n is negative")
        +	}
        +	if k < 0 {
        +		panic("combin: k is negative")
        +	}
        +	if k > n {
        +		panic("combin: k is greater than n")
        +	}
        +	p := 1
        +	for i := n - k + 1; i <= n; i++ {
        +		p *= i
        +	}
        +	return p
        +}
        +
        +// Permutations generates all of the permutations of k elements from a
        +// set of size n. The returned slice has length NumPermutations(n, k)
        +// and each inner slice has length k.
        +//
        +// n and k must be non-negative with n >= k, otherwise Permutations will panic.
        +//
        +// PermutationGenerator may alternatively be used to generate the permutations
        +// iteratively instead of collectively, or IndexToPermutation for random access.
        +func Permutations(n, k int) [][]int {
        +	nPerms := NumPermutations(n, k)
        +	data := make([][]int, nPerms)
        +	if len(data) == 0 {
        +		return data
        +	}
        +	for i := 0; i < nPerms; i++ {
        +		data[i] = IndexToPermutation(nil, i, n, k)
        +	}
        +	return data
        +}
        +
        +// PermutationGenerator generates permutations iteratively. The Permutations
        +// function may be called to generate all permutations collectively.
        +type PermutationGenerator struct {
        +	n           int
        +	k           int
        +	nPerm       int
        +	idx         int
        +	permutation []int
        +}
        +
        +// NewPermutationGenerator returns a PermutationGenerator for generating the
        +// permutations of k elements from a set of size n.
        +//
        +// n and k must be non-negative with n >= k, otherwise NewPermutationGenerator
        +// will panic.
        +func NewPermutationGenerator(n, k int) *PermutationGenerator {
        +	return &PermutationGenerator{
        +		n:           n,
        +		k:           k,
        +		nPerm:       NumPermutations(n, k),
        +		idx:         -1,
        +		permutation: make([]int, k),
        +	}
        +}
        +
        +// Next advances the iterator if there are permutations remaining to be generated,
        +// and returns false if all permutations have been generated. Next must be called
        +// to initialize the first value before calling Permutation or Permutation will
        +// panic. The value returned by Permutation is only changed during calls to Next.
        +func (p *PermutationGenerator) Next() bool {
        +	if p.idx >= p.nPerm-1 {
        +		p.idx = p.nPerm // so Permutation can panic.
        +		return false
        +	}
        +	p.idx++
        +	IndexToPermutation(p.permutation, p.idx, p.n, p.k)
        +	return true
        +}
        +
        +// Permutation returns the current permutation. If dst is non-nil, it must have
        +// length k and the result will be stored in-place into dst. If dst
        +// is nil a new slice will be allocated and returned. If all of the permutations
        +// have already been constructed (Next() returns false), Permutation will panic.
        +//
        +// Next must be called to initialize the first value before calling Permutation
        +// or Permutation will panic. The value returned by Permutation is only changed
        +// during calls to Next.
        +func (p *PermutationGenerator) Permutation(dst []int) []int {
        +	if p.idx == p.nPerm {
        +		panic("combin: all permutations have been generated")
        +	}
        +	if p.idx == -1 {
        +		panic("combin: Permutation called before Next")
        +	}
        +	if dst == nil {
        +		dst = make([]int, p.k)
        +	} else if len(dst) != p.k {
        +		panic(badInput)
        +	}
        +	copy(dst, p.permutation)
        +	return dst
        +}
        +
        +// PermutationIndex returns the index of the given permutation.
        +//
        +// The functions PermutationIndex and IndexToPermutation define a bijection
        +// between the integers and the NumPermutations(n, k) number of possible permutations.
        +// PermutationIndex returns the inverse of IndexToPermutation.
        +//
        +// PermutationIndex panics if perm is not a permutation of k of the first
        +// [0,n) integers, if n or k are non-negative, or if k is greater than n.
        +func PermutationIndex(perm []int, n, k int) int {
        +	if n < 0 || k < 0 {
        +		panic(errNegInput)
        +	}
        +	if n < k {
        +		panic(badSetSize)
        +	}
        +	if len(perm) != k {
        +		panic("combin: bad length permutation")
        +	}
        +	contains := make(map[int]struct{}, k)
        +	for _, v := range perm {
        +		if v < 0 || v >= n {
        +			panic("combin: bad element")
        +		}
        +		contains[v] = struct{}{}
        +	}
        +	if len(contains) != k {
        +		panic("combin: perm contains non-unique elements")
        +	}
        +	if n == k {
        +		// The permutation is the ordering of the elements.
        +		return equalPermutationIndex(perm)
        +	}
        +
        +	// The permutation index is found by finding the combination index and the
        +	// equalPermutation index. The combination index is found by just sorting
        +	// the elements, and the the permutation index is the ordering of the size
        +	// of the elements.
        +	tmp := make([]int, len(perm))
        +	copy(tmp, perm)
        +	idx := make([]int, len(perm))
        +	for i := range idx {
        +		idx[i] = i
        +	}
        +	s := sortInts{tmp, idx}
        +	sort.Sort(s)
        +	order := make([]int, len(perm))
        +	for i, v := range idx {
        +		order[v] = i
        +	}
        +	combIdx := CombinationIndex(tmp, n, k)
        +	permIdx := equalPermutationIndex(order)
        +	return combIdx*NumPermutations(k, k) + permIdx
        +}
        +
        +type sortInts struct {
        +	data []int
        +	idx  []int
        +}
        +
        +func (s sortInts) Len() int {
        +	return len(s.data)
        +}
        +
        +func (s sortInts) Less(i, j int) bool {
        +	return s.data[i] < s.data[j]
        +}
        +
        +func (s sortInts) Swap(i, j int) {
        +	s.data[i], s.data[j] = s.data[j], s.data[i]
        +	s.idx[i], s.idx[j] = s.idx[j], s.idx[i]
        +}
        +
        +// IndexToPermutation returns the permutation corresponding to the given index.
        +//
        +// The functions PermutationIndex and IndexToPermutation define a bijection
        +// between the integers and the NumPermutations(n, k) number of possible permutations.
        +// IndexToPermutation returns the inverse of PermutationIndex.
        +//
        +// The permutation is stored in-place into dst if dst is non-nil, otherwise
        +// a new slice is allocated and returned.
        +//
        +// IndexToPermutation panics if n or k are non-negative, if k is greater than n,
        +// or if idx is not in [0, NumPermutations(n,k)-1]. IndexToPermutation will also panic
        +// if dst is non-nil and len(dst) is not k.
        +func IndexToPermutation(dst []int, idx, n, k int) []int {
        +	nPerm := NumPermutations(n, k)
        +	if idx < 0 || idx >= nPerm {
        +		panic("combin: invalid index")
        +	}
        +	if dst == nil {
        +		dst = make([]int, k)
        +	} else if len(dst) != k {
        +		panic(badInput)
        +	}
        +	if n == k {
        +		indexToEqualPermutation(dst, idx)
        +		return dst
        +	}
        +
        +	// First, we index into the combination (which of the k items to choose)
        +	// and then we index into the n == k permutation of those k items. The
        +	// indexing acts like a matrix with nComb rows and factorial(k) columns.
        +	kPerm := NumPermutations(k, k)
        +	combIdx := idx / kPerm
        +	permIdx := idx % kPerm
        +	comb := IndexToCombination(nil, combIdx, n, k) // Gives us the set of integers.
        +	perm := make([]int, len(dst))
        +	indexToEqualPermutation(perm, permIdx) // Gives their order.
        +	for i, v := range perm {
        +		dst[i] = comb[v]
        +	}
        +	return dst
        +}
        +
        +// equalPermutationIndex returns the index of the given permutation of the
        +// first k integers.
        +func equalPermutationIndex(perm []int) int {
        +	// Note(btracey): This is an n^2 algorithm, but factorial increases
        +	// very quickly (25! overflows int64) so this is not a problem in
        +	// practice.
        +	idx := 0
        +	for i, u := range perm {
        +		less := 0
        +		for _, v := range perm[i:] {
        +			if v < u {
        +				less++
        +			}
        +		}
        +		idx += less * factorial(len(perm)-i-1)
        +	}
        +	return idx
        +}
        +
        +// indexToEqualPermutation returns the permutation for the first len(dst)
        +// integers for the given index.
        +func indexToEqualPermutation(dst []int, idx int) {
        +	for i := range dst {
        +		dst[i] = i
        +	}
        +	for i := range dst {
        +		f := factorial(len(dst) - i - 1)
        +		r := idx / f
        +		v := dst[i+r]
        +		copy(dst[i+1:i+r+1], dst[i:i+r])
        +		dst[i] = v
        +		idx %= f
        +	}
        +}
        +
        +// factorial returns a!.
        +func factorial(a int) int {
        +	f := 1
        +	for i := 2; i <= a; i++ {
        +		f *= i
        +	}
        +	return f
        +}
        diff --git a/vendor/gonum.org/v1/gonum/stat/combin/doc.go b/vendor/gonum.org/v1/gonum/stat/combin/doc.go
        new file mode 100644
        index 000000000..496045cdd
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/stat/combin/doc.go
        @@ -0,0 +1,7 @@
        +// Copyright ©2017 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// Package combin implements routines involving combinatorics (permutations,
        +// combinations, etc.).
        +package combin // import "gonum.org/v1/gonum/stat/combin"
        diff --git a/vendor/gonum.org/v1/gonum/stat/distuv/binomial.go b/vendor/gonum.org/v1/gonum/stat/distuv/binomial.go
        new file mode 100644
        index 000000000..4fb7072aa
        --- /dev/null
        +++ b/vendor/gonum.org/v1/gonum/stat/distuv/binomial.go
        @@ -0,0 +1,188 @@
        +// Copyright ©2018 The Gonum Authors. All rights reserved.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +package distuv
        +
        +import (
        +	"math"
        +
        +	"golang.org/x/exp/rand"
        +
        +	"gonum.org/v1/gonum/mathext"
        +	"gonum.org/v1/gonum/stat/combin"
        +)
        +
        +// Binomial implements the binomial distribution, a discrete probability distribution
        +// that expresses the probability of a given number of successful Bernoulli trials
        +// out of a total of n, each with success probability p.
        +// The binomial distribution has the density function:
        +//  f(k) = (n choose k) p^k (1-p)^(n-k)
        +// For more information, see https://en.wikipedia.org/wiki/Binomial_distribution.
        +type Binomial struct {
        +	// N is the total number of Bernoulli trials. N must be greater than 0.
        +	N float64
        +	// P is the probablity of success in any given trial. P must be in [0, 1].
        +	P float64
        +
        +	Src rand.Source
        +}
        +
        +// CDF computes the value of the cumulative distribution function at x.
        +func (b Binomial) CDF(x float64) float64 {
        +	if x < 0 {
        +		return 0
        +	}
        +	if x >= b.N {
        +		return 1
        +	}
        +	x = math.Floor(x)
        +	return mathext.RegIncBeta(b.N-x, x+1, 1-b.P)
        +}
        +
        +// ExKurtosis returns the excess kurtosis of the distribution.
        +func (b Binomial) ExKurtosis() float64 {
        +	v := b.P * (1 - b.P)
        +	return (1 - 6*v) / (b.N * v)
        +}
        +
        +// LogProb computes the natural logarithm of the value of the probability
        +// density function at x.
        +func (b Binomial) LogProb(x float64) float64 {
        +	if x < 0 || x > b.N || math.Floor(x) != x {
        +		return math.Inf(-1)
        +	}
        +	lb := combin.LogGeneralizedBinomial(b.N, x)
        +	return lb + x*math.Log(b.P) + (b.N-x)*math.Log(1-b.P)
        +}
        +
        +// Mean returns the mean of the probability distribution.
        +func (b Binomial) Mean() float64 {
        +	return b.N * b.P
        +}
        +
        +// NumParameters returns the number of parameters in the distribution.
        +func (Binomial) NumParameters() int {
        +	return 2
        +}
        +
        +// Prob computes the value of the probability density function at x.
        +func (b Binomial) Prob(x float64) float64 {
        +	return math.Exp(b.LogProb(x))
        +}
        +
        +// Rand returns a random sample drawn from the distribution.
        +func (b Binomial) Rand() float64 {
        +	// NUMERICAL RECIPES IN C: THE ART OF SCIENTIFIC COMPUTING (ISBN 0-521-43108-5)
        +	// p. 295-6
        +	// http://www.aip.de/groups/soe/local/numres/bookcpdf/c7-3.pdf
        +
        +	runif := rand.Float64
        +	rexp := rand.ExpFloat64
        +	if b.Src != nil {
        +		rnd := rand.New(b.Src)
        +		runif = rnd.Float64
        +		rexp = rnd.ExpFloat64
        +	}
        +
        +	p := b.P
        +	if p > 0.5 {
        +		p = 1 - p
        +	}
        +	am := b.N * p
        +
        +	if b.N < 25 {
        +		// Use direct method.
        +		bnl := 0.0
        +		for i := 0; i < int(b.N); i++ {
        +			if runif() < p {
        +				bnl++
        +			}
        +		}
        +		if p != b.P {
        +			return b.N - bnl
        +		}
        +		return bnl
        +	}
        +
        +	if am < 1 {
        +		// Use rejection method with Poisson proposal.
        +		const logM = 2.6e-2 // constant for rejection sampling (https://en.wikipedia.org/wiki/Rejection_sampling)
        +		var bnl float64
        +		z := -p
        +		pclog := (1 + 0.5*z) * z / (1 + (1+1.0/6*z)*z) // Padé approximant of log(1 + x)
        +		for {
        +			bnl = 0.0
        +			t := 0.0
        +			for i := 0; i < int(b.N); i++ {
        +				t += rexp()
        +				if t >= am {
        +					break
        +				}
        +				bnl++
        +			}
        +			bnlc := b.N - bnl
        +			z = -bnl / b.N
        +			log1p := (1 + 0.5*z) * z / (1 + (1+1.0/6*z)*z)
        +			t = (bnlc+0.5)*log1p + bnl - bnlc*pclog + 1/(12*bnlc) - am + logM // Uses Stirling's expansion of log(n!)
        +			if rexp() >= t {
        +				break
        +			}
        +		}
        +		if p != b.P {
        +			return b.N - bnl
        +		}
        +		return bnl
        +	}
        +	// Original algorithm samples from a Poisson distribution with the
        +	// appropriate expected value. However, the Poisson approximation is
        +	// asymptotic such that the absolute deviation in probability is O(1/n).
        +	// Rejection sampling produces exact variates with at worst less than 3%
        +	// rejection with miminal additional computation.
        +
        +	// Use rejection method with Cauchy proposal.
        +	g, _ := math.Lgamma(b.N + 1)
        +	plog := math.Log(p)
        +	pclog := math.Log1p(-p)
        +	sq := math.Sqrt(2 * am * (1 - p))
        +	for {
        +		var em, y float64
        +		for {
        +			y = math.Tan(math.Pi * runif())
        +			em = sq*y + am
        +			if em >= 0 && em < b.N+1 {
        +				break
        +			}
        +		}
        +		em = math.Floor(em)
        +		lg1, _ := math.Lgamma(em + 1)
        +		lg2, _ := math.Lgamma(b.N - em + 1)
        +		t := 1.2 * sq * (1 + y*y) * math.Exp(g-lg1-lg2+em*plog+(b.N-em)*pclog)
        +		if runif() <= t {
        +			if p != b.P {
        +				return b.N - em
        +			}
        +			return em
        +		}
        +	}
        +}
        +
        +// Skewness returns the skewness of the distribution.
        +func (b Binomial) Skewness() float64 {
        +	return (1 - 2*b.P) / b.StdDev()
        +}
        +
        +// StdDev returns the standard deviation of the probability distribution.
        +func (b Binomial) StdDev() float64 {
        +	return math.Sqrt(b.Variance())
        +}
        +
        +// Survival returns the survival function (complementary CDF) at x.
        +func (b Binomial) Survival(x float64) float64 {
        +	return 1 - b.CDF(x)
        +}
        +
        +// Variance returns the variance of the probability distribution.
        +func (b Binomial) Variance() float64 {
        +	return b.N * b.P * (1 - b.P)
        +}
        diff --git a/vendor/gonum.org/v1/gonum/stat/distuv/categorical.go b/vendor/gonum.org/v1/gonum/stat/distuv/categorical.go
        index 98269fa9f..13a26b8e8 100644
        --- a/vendor/gonum.org/v1/gonum/stat/distuv/categorical.go
        +++ b/vendor/gonum.org/v1/gonum/stat/distuv/categorical.go
        @@ -24,8 +24,8 @@ type Categorical struct {
         	//
         	// Each element holds the sum of weights for
         	// the corresponding index, plus the sum of
        -	// of its children's weights; the children
        -	// of an element i can be found at positions
        +	// its children's weights; the children of
        +	// an element i can be found at positions
         	// 2*(i+1)-1 and 2*(i+1). The root of the
         	// weight heap is at element 0.
         	//
        diff --git a/vendor/gonum.org/v1/gonum/stat/distuv/chisquared.go b/vendor/gonum.org/v1/gonum/stat/distuv/chisquared.go
        index 19d015265..868a5fb54 100644
        --- a/vendor/gonum.org/v1/gonum/stat/distuv/chisquared.go
        +++ b/vendor/gonum.org/v1/gonum/stat/distuv/chisquared.go
        @@ -30,7 +30,7 @@ type ChiSquared struct {
         
         // CDF computes the value of the cumulative density function at x.
         func (c ChiSquared) CDF(x float64) float64 {
        -	return mathext.GammaInc(c.K/2, x/2)
        +	return mathext.GammaIncReg(c.K/2, x/2)
         }
         
         // ExKurtosis returns the excess kurtosis of the distribution.
        @@ -78,7 +78,7 @@ func (c ChiSquared) Quantile(p float64) float64 {
         	if p < 0 || p > 1 {
         		panic(badPercentile)
         	}
        -	return mathext.GammaIncInv(0.5*c.K, p) * 2
        +	return mathext.GammaIncRegInv(0.5*c.K, p) * 2
         }
         
         // StdDev returns the standard deviation of the probability distribution.
        @@ -91,7 +91,7 @@ func (c ChiSquared) Survival(x float64) float64 {
         	if x < 0 {
         		return 1
         	}
        -	return mathext.GammaIncComp(0.5*c.K, 0.5*x)
        +	return mathext.GammaIncRegComp(0.5*c.K, 0.5*x)
         }
         
         // Variance returns the variance of the probability distribution.
        diff --git a/vendor/gonum.org/v1/gonum/stat/distuv/gamma.go b/vendor/gonum.org/v1/gonum/stat/distuv/gamma.go
        index aaa5e21f2..8aadee7c6 100644
        --- a/vendor/gonum.org/v1/gonum/stat/distuv/gamma.go
        +++ b/vendor/gonum.org/v1/gonum/stat/distuv/gamma.go
        @@ -35,7 +35,7 @@ func (g Gamma) CDF(x float64) float64 {
         	if x < 0 {
         		return 0
         	}
        -	return mathext.GammaInc(g.Alpha, g.Beta*x)
        +	return mathext.GammaIncReg(g.Alpha, g.Beta*x)
         }
         
         // ExKurtosis returns the excess kurtosis of the distribution.
        @@ -86,7 +86,7 @@ func (g Gamma) Quantile(p float64) float64 {
         	if p < 0 || p > 1 {
         		panic(badPercentile)
         	}
        -	return mathext.GammaIncInv(g.Alpha, p) / g.Beta
        +	return mathext.GammaIncRegInv(g.Alpha, p) / g.Beta
         }
         
         // Rand returns a random sample drawn from the distribution.
        @@ -232,7 +232,7 @@ func (g Gamma) Survival(x float64) float64 {
         	if x < 0 {
         		return 1
         	}
        -	return mathext.GammaIncComp(g.Alpha, g.Beta*x)
        +	return mathext.GammaIncRegComp(g.Alpha, g.Beta*x)
         }
         
         // StdDev returns the standard deviation of the probability distribution.
        diff --git a/vendor/gonum.org/v1/gonum/stat/distuv/general.go b/vendor/gonum.org/v1/gonum/stat/distuv/general.go
        index 5db299d73..5b7899194 100644
        --- a/vendor/gonum.org/v1/gonum/stat/distuv/general.go
        +++ b/vendor/gonum.org/v1/gonum/stat/distuv/general.go
        @@ -10,11 +10,11 @@ type Parameter struct {
         	Value float64
         }
         
        -var (
        +const (
         	badPercentile = "distuv: percentile out of bounds"
         	badLength     = "distuv: slice length mismatch"
         	badSuffStat   = "distuv: wrong suffStat length"
        -	badNoSamples  = "distuv: must have at least one sample"
        +	errNoSamples  = "distuv: must have at least one sample"
         )
         
         const (
        diff --git a/vendor/gonum.org/v1/gonum/stat/distuv/inversegamma.go b/vendor/gonum.org/v1/gonum/stat/distuv/inversegamma.go
        index 36bbddc1b..a1089411e 100644
        --- a/vendor/gonum.org/v1/gonum/stat/distuv/inversegamma.go
        +++ b/vendor/gonum.org/v1/gonum/stat/distuv/inversegamma.go
        @@ -38,7 +38,7 @@ func (g InverseGamma) CDF(x float64) float64 {
         	// TODO(btracey): Replace this with a direct call to the upper regularized
         	// gamma function if mathext gets it.
         	//return 1 - mathext.GammaInc(g.Alpha, g.Beta/x)
        -	return mathext.GammaIncComp(g.Alpha, g.Beta/x)
        +	return mathext.GammaIncRegComp(g.Alpha, g.Beta/x)
         }
         
         // ExKurtosis returns the excess kurtosis of the distribution.
        @@ -89,7 +89,7 @@ func (g InverseGamma) Quantile(p float64) float64 {
         	if p < 0 || 1 < p {
         		panic(badPercentile)
         	}
        -	return (1 / (mathext.GammaIncCompInv(g.Alpha, p))) * g.Beta
        +	return (1 / (mathext.GammaIncRegCompInv(g.Alpha, p))) * g.Beta
         }
         
         // Rand returns a random sample drawn from the distribution.
        @@ -97,7 +97,7 @@ func (g InverseGamma) Quantile(p float64) float64 {
         // Rand panics if either alpha or beta is <= 0.
         func (g InverseGamma) Rand() float64 {
         	// TODO(btracey): See if there is a more direct way to sample.
        -	return 1 / Gamma{Alpha: g.Alpha, Beta: g.Beta, Src: g.Src}.Rand()
        +	return 1 / Gamma(g).Rand()
         }
         
         // Survival returns the survival function (complementary CDF) at x.
        @@ -105,7 +105,7 @@ func (g InverseGamma) Survival(x float64) float64 {
         	if x < 0 {
         		return 1
         	}
        -	return mathext.GammaInc(g.Alpha, g.Beta/x)
        +	return mathext.GammaIncReg(g.Alpha, g.Beta/x)
         }
         
         // StdDev returns the standard deviation of the probability distribution.
        diff --git a/vendor/gonum.org/v1/gonum/stat/distuv/laplace.go b/vendor/gonum.org/v1/gonum/stat/distuv/laplace.go
        index d51d76830..727a6aa75 100644
        --- a/vendor/gonum.org/v1/gonum/stat/distuv/laplace.go
        +++ b/vendor/gonum.org/v1/gonum/stat/distuv/laplace.go
        @@ -9,8 +9,6 @@ import (
         	"sort"
         
         	"golang.org/x/exp/rand"
        -
        -	"gonum.org/v1/gonum/floats"
         	"gonum.org/v1/gonum/stat"
         )
         
        @@ -47,12 +45,12 @@ func (l Laplace) ExKurtosis() float64 {
         // Note: Laplace distribution has no FitPrior because it has no sufficient
         // statistics.
         func (l *Laplace) Fit(samples, weights []float64) {
        -	if len(samples) != len(weights) {
        +	if weights != nil && len(samples) != len(weights) {
         		panic(badLength)
         	}
         
         	if len(samples) == 0 {
        -		panic(badNoSamples)
        +		panic(errNoSamples)
         	}
         	if len(samples) == 1 {
         		l.Mu = samples[0]
        @@ -82,13 +80,22 @@ func (l *Laplace) Fit(samples, weights []float64) {
         	// TODO: Rethink quantile type when stat has more options
         	l.Mu = stat.Quantile(0.5, stat.Empirical, sortedSamples, sortedWeights)
         
        -	sumWeights := floats.Sum(weights)
        -
         	// The scale parameter is the average absolute distance
         	// between the sample and the mean
        -	absError := stat.MomentAbout(1, samples, l.Mu, weights)
        -
        -	l.Scale = absError / sumWeights
        +	var absError float64
        +	var sumWeights float64
        +	if weights != nil {
        +		for i, v := range samples {
        +			absError += weights[i] * math.Abs(l.Mu-v)
        +			sumWeights += weights[i]
        +		}
        +		l.Scale = absError / sumWeights
        +	} else {
        +		for _, v := range samples {
        +			absError += math.Abs(l.Mu - v)
        +		}
        +		l.Scale = absError / float64(len(samples))
        +	}
         }
         
         // LogProb computes the natural logarithm of the value of the probability density
        diff --git a/vendor/gonum.org/v1/gonum/stat/distuv/poisson.go b/vendor/gonum.org/v1/gonum/stat/distuv/poisson.go
        index 479179514..9a90b2e1f 100644
        --- a/vendor/gonum.org/v1/gonum/stat/distuv/poisson.go
        +++ b/vendor/gonum.org/v1/gonum/stat/distuv/poisson.go
        @@ -31,7 +31,7 @@ func (p Poisson) CDF(x float64) float64 {
         	if x < 0 {
         		return 0
         	}
        -	return mathext.GammaIncComp(math.Floor(x+1), p.Lambda)
        +	return mathext.GammaIncRegComp(math.Floor(x+1), p.Lambda)
         }
         
         // ExKurtosis returns the excess kurtosis of the distribution.
        diff --git a/vendor/gonum.org/v1/gonum/stat/distuv/triangle.go b/vendor/gonum.org/v1/gonum/stat/distuv/triangle.go
        index 647b55443..65afd1650 100644
        --- a/vendor/gonum.org/v1/gonum/stat/distuv/triangle.go
        +++ b/vendor/gonum.org/v1/gonum/stat/distuv/triangle.go
        @@ -13,15 +13,15 @@ import (
         // Triangle represents a triangle distribution (https://en.wikipedia.org/wiki/Triangular_distribution).
         type Triangle struct {
         	a, b, c float64
        -	Src     rand.Source
        +	src     rand.Source
         }
         
         // NewTriangle constructs a new triangle distribution with lower limit a, upper limit b, and mode c.
         // Constraints are a < b and a ≤ c ≤ b.
         // This distribution is uncommon in nature, but may be useful for simulation.
        -func NewTriangle(a, b, c float64) Triangle {
        +func NewTriangle(a, b, c float64, src rand.Source) Triangle {
         	checkTriangleParameters(a, b, c)
        -	return Triangle{a, b, c, nil}
        +	return Triangle{a: a, b: b, c: c, src: src}
         }
         
         func checkTriangleParameters(a, b, c float64) {
        @@ -125,10 +125,10 @@ func (t Triangle) Quantile(p float64) float64 {
         // Rand returns a random sample drawn from the distribution.
         func (t Triangle) Rand() float64 {
         	var rnd float64
        -	if t.Src == nil {
        +	if t.src == nil {
         		rnd = rand.Float64()
         	} else {
        -		rnd = rand.New(t.Src).Float64()
        +		rnd = rand.New(t.src).Float64()
         	}
         
         	return t.Quantile(rnd)
        diff --git a/vendor/gonum.org/v1/gonum/stat/distuv/weibull.go b/vendor/gonum.org/v1/gonum/stat/distuv/weibull.go
        index d44029470..8368db17d 100644
        --- a/vendor/gonum.org/v1/gonum/stat/distuv/weibull.go
        +++ b/vendor/gonum.org/v1/gonum/stat/distuv/weibull.go
        @@ -165,7 +165,7 @@ func (w Weibull) Score(deriv []float64, x float64) []float64 {
         		return deriv
         	}
         	deriv[0] = math.NaN()
        -	deriv[0] = math.NaN()
        +	deriv[1] = math.NaN()
         	return deriv
         }
         
        diff --git a/vendor/gonum.org/v1/gonum/stat/pca_cca.go b/vendor/gonum.org/v1/gonum/stat/pca_cca.go
        index 4149e23fd..25158ceaf 100644
        --- a/vendor/gonum.org/v1/gonum/stat/pca_cca.go
        +++ b/vendor/gonum.org/v1/gonum/stat/pca_cca.go
        @@ -48,20 +48,23 @@ func (c *PC) PrincipalComponents(a mat.Matrix, weights []float64) (ok bool) {
         
         // VectorsTo returns the component direction vectors of a principal components
         // analysis. The vectors are returned in the columns of a d×min(n, d) matrix.
        -// If dst is not nil it must either be zero-sized or be a d×min(n, d) matrix.
        -// dst will  be used as the destination for the direction vector data. If dst
        -// is nil, a new mat.Dense is allocated for the destination.
        -func (c *PC) VectorsTo(dst *mat.Dense) *mat.Dense {
        +//
        +// If dst is empty, VectorsTo will resize dst to be d×min(n, d). When dst is
        +// non-empty, VectorsTo will panic if dst is not d×min(n, d). VectorsTo will also
        +// panic if the receiver does not contain a successful PC.
        +func (c *PC) VectorsTo(dst *mat.Dense) {
         	if !c.ok {
         		panic("stat: use of unsuccessful principal components analysis")
         	}
         
        -	if dst != nil {
        -		if d, n := dst.Dims(); !dst.IsZero() && (d != c.d || n != min(c.n, c.d)) {
        +	if dst.IsEmpty() {
        +		dst.ReuseAs(c.d, min(c.n, c.d))
        +	} else {
        +		if d, n := dst.Dims(); d != c.d || n != min(c.n, c.d) {
         			panic(mat.ErrShape)
         		}
         	}
        -	return c.svd.VTo(dst)
        +	c.svd.VTo(dst)
         }
         
         // VarsTo returns the column variances of the principal component scores,
        @@ -113,10 +116,11 @@ type CC struct {
         	ok      bool
         }
         
        -// CanonicalCorrelations returns a CC which can provide the results of canonical
        -// correlation analysis of the input data x and y, columns of which should be
        -// interpretable as two sets of measurements on the same observations (rows).
        -// These observations are optionally weighted by weights.
        +// CanonicalCorrelations performs a canonical correlation analysis of the
        +// input data x and y, columns of which should be interpretable as two sets
        +// of measurements on the same observations (rows). These observations are
        +// optionally weighted by weights. The result of the analysis is stored in
        +// the receiver if the analysis is successful.
         //
         // Canonical correlation analysis finds associations between two sets of
         // variables on the same observations by finding linear combinations of the two
        @@ -129,8 +133,8 @@ type CC struct {
         // as Xc * Sx^{-1/2} and Yc * Sy^{-1/2} respectively, and the correlation matrix
         // between the sphered data is called the canonical correlation matrix,
         // Sx^{-1/2} * Sxy * Sy^{-1/2}. In cases where S^{-1/2} is ambiguous for some
        -// covariance matrix S, S^{-1/2} is taken to be E * D^{-1/2} * E^T where S can
        -// be eigendecomposed as S = E * D * E^T.
        +// covariance matrix S, S^{-1/2} is taken to be E * D^{-1/2} * Eᵀ where S can
        +// be eigendecomposed as S = E * D * Eᵀ.
         //
         // The canonical correlations are the correlations between the corresponding
         // pairs of canonical variables and can be obtained with c.Corrs(). Canonical
        @@ -181,14 +185,15 @@ func (c *CC) CanonicalCorrelations(x, y mat.Matrix, weights []float64) error {
         	if !c.ok {
         		return errors.New("stat: failed to factorize y")
         	}
        -	xu := c.x.UTo(nil)
        -	xv := c.x.VTo(nil)
        -	yu := c.y.UTo(nil)
        -	yv := c.y.VTo(nil)
        +	var xu, xv, yu, yv mat.Dense
        +	c.x.UTo(&xu)
        +	c.x.VTo(&xv)
        +	c.y.UTo(&yu)
        +	c.y.VTo(&yv)
         
         	// Calculate and factorise the canonical correlation matrix.
         	var ccor mat.Dense
        -	ccor.Product(xv, xu.T(), yu, yv.T())
        +	ccor.Product(&xv, xu.T(), &yu, yv.T())
         	if c.c == nil {
         		c.c = &mat.SVD{}
         	}
        @@ -216,65 +221,69 @@ func (c *CC) CorrsTo(dst []float64) []float64 {
         // LeftTo returns the left eigenvectors of the canonical correlation matrix if
         // spheredSpace is true. If spheredSpace is false it returns these eigenvectors
         // back-transformed to the original data space.
        -// If dst is not nil it must either be zero-sized or be an xd×yd matrix where xd
        -// and yd are the number of variables in the input x and y matrices. dst will
        -// be used as the destination for the vector data. If dst is nil, a new
        -// mat.Dense is allocated for the destination.
        -func (c *CC) LeftTo(dst *mat.Dense, spheredSpace bool) *mat.Dense {
        +//
        +// If dst is empty, LeftTo will resize dst to be xd×yd. When dst is
        +// non-empty, LeftTo will panic if dst is not xd×yd. LeftTo will also
        +// panic if the receiver does not contain a successful CC.
        +func (c *CC) LeftTo(dst *mat.Dense, spheredSpace bool) {
         	if !c.ok || c.n < 2 {
         		panic("stat: canonical correlations missing or invalid")
         	}
         
        -	if dst != nil {
        -		if d, n := dst.Dims(); !dst.IsZero() && (n != c.yd || d != c.xd) {
        +	if dst.IsEmpty() {
        +		dst.ReuseAs(c.xd, c.yd)
        +	} else {
        +		if d, n := dst.Dims(); d != c.xd || n != c.yd {
         			panic(mat.ErrShape)
         		}
         	}
        -	dst = c.c.UTo(dst)
        +	c.c.UTo(dst)
         	if spheredSpace {
        -		return dst
        +		return
         	}
         
         	xs := c.x.Values(nil)
        -	xv := c.x.VTo(nil)
        +	xv := &mat.Dense{}
        +	c.x.VTo(xv)
         
         	scaleColsReciSqrt(xv, xs)
         
         	dst.Product(xv, xv.T(), dst)
         	dst.Scale(math.Sqrt(float64(c.n-1)), dst)
        -	return dst
         }
         
         // RightTo returns the right eigenvectors of the canonical correlation matrix if
         // spheredSpace is true. If spheredSpace is false it returns these eigenvectors
         // back-transformed to the original data space.
        -// If dst is not nil it must either be zero-sized or be an yd×yd matrix where yd
        -// is the number of variables in the input y matrix. dst will
        -// be used as the destination for the vector data. If dst is nil, a new
        -// mat.Dense is allocated for the destination.
        -func (c *CC) RightTo(dst *mat.Dense, spheredSpace bool) *mat.Dense {
        +//
        +// If dst is empty, RightTo will resize dst to be yd×yd. When dst is
        +// non-empty, RightTo will panic if dst is not yd×yd. RightTo will also
        +// panic if the receiver does not contain a successful CC.
        +func (c *CC) RightTo(dst *mat.Dense, spheredSpace bool) {
         	if !c.ok || c.n < 2 {
         		panic("stat: canonical correlations missing or invalid")
         	}
         
        -	if dst != nil {
        -		if d, n := dst.Dims(); (n != 0 || d != 0) && (n != c.yd || d != c.yd) {
        +	if dst.IsEmpty() {
        +		dst.ReuseAs(c.yd, c.yd)
        +	} else {
        +		if d, n := dst.Dims(); d != c.yd || n != c.yd {
         			panic(mat.ErrShape)
         		}
         	}
        -	dst = c.c.VTo(dst)
        +	c.c.VTo(dst)
         	if spheredSpace {
        -		return dst
        +		return
         	}
         
         	ys := c.y.Values(nil)
        -	yv := c.y.VTo(nil)
        +	yv := &mat.Dense{}
        +	c.y.VTo(yv)
         
         	scaleColsReciSqrt(yv, ys)
         
         	dst.Product(yv, yv.T(), dst)
         	dst.Scale(math.Sqrt(float64(c.n-1)), dst)
        -	return dst
         }
         
         func svdFactorizeCentered(work *mat.SVD, m mat.Matrix, weights []float64) (svd *mat.SVD, ok bool) {
        diff --git a/vendor/gonum.org/v1/gonum/stat/roc.go b/vendor/gonum.org/v1/gonum/stat/roc.go
        index 3605c8f9a..fa8d0f653 100644
        --- a/vendor/gonum.org/v1/gonum/stat/roc.go
        +++ b/vendor/gonum.org/v1/gonum/stat/roc.go
        @@ -4,36 +4,39 @@
         
         package stat
         
        -import "sort"
        +import (
        +	"math"
        +	"sort"
        +)
         
         // ROC returns paired false positive rate (FPR) and true positive rate
        -// (TPR) values corresponding to n cutoffs spanning the relative
        -// (or receiver) operator characteristic (ROC) curve obtained when y is
        -// treated as a binary classifier for classes with weights.
        +// (TPR) values corresponding to cutoff points on the receiver operator
        +// characteristic (ROC) curve obtained when y is treated as a binary
        +// classifier for classes with weights. The cutoff thresholds used to
        +// calculate the ROC are returned in thresh such that tpr[i] and fpr[i]
        +// are the true and false positive rates for y >= thresh[i].
         //
        -// Cutoffs are equally spaced from eps less than the minimum value of y
        -// to the maximum value of y, including both endpoints meaning that the
        -// resulting ROC curve will always begin at (0,0) and end at (1,1).
        -//
        -// The input y must be sorted, and SortWeightedLabeled can be used in
        -// order to sort y together with classes and weights.
        +// The input y and cutoffs must be sorted, and values in y must correspond
        +// to values in classes and weights. SortWeightedLabeled can be used to
        +// sort y together with classes and weights.
         //
         // For a given cutoff value, observations corresponding to entries in y
         // greater than the cutoff value are classified as false, while those
        -// below (or equal to) the cutoff value are classified as true. These
        +// less than or equal to the cutoff value are classified as true. These
         // assigned class labels are compared with the true values in the classes
         // slice and used to calculate the FPR and TPR.
         //
         // If weights is nil, all weights are treated as 1.
         //
        -// When n is zero all possible cutoffs are calculated, resulting
        -// in fpr and tpr having length one greater than the number of unique
        -// values in y. When n is greater than one fpr and tpr will be returned
        -// with length n. ROC will panic if n is equal to one or less than 0.
        +// If cutoffs is nil or empty, all possible cutoffs are calculated,
        +// resulting in fpr and tpr having length one greater than the number of
        +// unique values in y. Otherwise fpr and tpr will be returned with the
        +// same length as cutoffs. floats.Span can be used to generate equally
        +// spaced cutoffs.
         //
         // More details about ROC curves are available at
         // https://en.wikipedia.org/wiki/Receiver_operating_characteristic
        -func ROC(n int, y []float64, classes []bool, weights []float64) (tpr, fpr []float64) {
        +func ROC(cutoffs, y []float64, classes []bool, weights []float64) (tpr, fpr, thresh []float64) {
         	if len(y) != len(classes) {
         		panic("stat: slice length mismatch")
         	}
        @@ -41,86 +44,82 @@ func ROC(n int, y []float64, classes []bool, weights []float64) (tpr, fpr []floa
         		panic("stat: slice length mismatch")
         	}
         	if !sort.Float64sAreSorted(y) {
        -		panic("stat: input must be sorted")
        +		panic("stat: input must be sorted ascending")
         	}
        -
        -	var incWidth, tol float64
        -	if n == 0 {
        -		if len(y) == 0 {
        -			return nil, nil
        -		}
        -		tpr = make([]float64, len(y)+1)
        -		fpr = make([]float64, len(y)+1)
        -	} else {
        -		if n < 2 {
        -			panic("stat: cannot calculate fewer than 2 points on a ROC curve")
        -		}
        -		if len(y) == 0 {
        -			return nil, nil
        +	if !sort.Float64sAreSorted(cutoffs) {
        +		panic("stat: cutoff values must be sorted ascending")
        +	}
        +	if len(y) == 0 {
        +		return nil, nil, nil
        +	}
        +	if len(cutoffs) == 0 {
        +		if cutoffs == nil || cap(cutoffs) < len(y)+1 {
        +			cutoffs = make([]float64, len(y)+1)
        +		} else {
        +			cutoffs = cutoffs[:len(y)+1]
         		}
        -		tpr = make([]float64, n)
        -		fpr = make([]float64, n)
        -		incWidth = (y[len(y)-1] - y[0]) / float64(n-1)
        -		tol = y[0] + incWidth
        -		if incWidth == 0 {
        -			tpr[n-1] = 1
        -			fpr[n-1] = 1
        -			return
        +		cutoffs[0] = math.Inf(-1)
        +		// Choose all possible cutoffs for unique values in y.
        +		bin := 1
        +		cutoffs[bin] = y[0]
        +		for i, u := range y[1:] {
        +			if u == y[i] {
        +				continue
        +			}
        +			bin++
        +			cutoffs[bin] = u
         		}
        +		cutoffs = cutoffs[:bin+1]
        +	} else {
        +		// Don't mutate the provided cutoffs.
        +		tmp := cutoffs
        +		cutoffs = make([]float64, len(cutoffs))
        +		copy(cutoffs, tmp)
         	}
         
        -	bin := 1 // the initial bin is known to have 0 fpr and 0 tpr
        +	tpr = make([]float64, len(cutoffs))
        +	fpr = make([]float64, len(cutoffs))
        +	var bin int
         	var nPos, nNeg float64
         	for i, u := range classes {
        -		var posWeight, negWeight float64 = 0, 1
        +		// Update the bin until it matches the next y value
        +		// skipping empty bins.
        +		for bin < len(cutoffs)-1 && y[i] > cutoffs[bin] {
        +			bin++
        +			tpr[bin] = tpr[bin-1]
        +			fpr[bin] = fpr[bin-1]
        +		}
        +		posWeight, negWeight := 1.0, 0.0
         		if weights != nil {
        -			negWeight = weights[i]
        +			posWeight = weights[i]
         		}
        -		if u {
        +		if !u {
         			posWeight, negWeight = negWeight, posWeight
         		}
         		nPos += posWeight
         		nNeg += negWeight
        -		tpr[bin] += posWeight
        -		fpr[bin] += negWeight
        -
        -		// Assess if the bin needs to be updated. If n is zero,
        -		// the bin is always updated, unless consecutive y values
        -		// are equal. Otherwise, the bin must be updated until it
        -		// matches the next y value (skipping empty bins).
        -		if n == 0 {
        -			if i != (len(y)-1) && y[i] != y[i+1] {
        -				bin++
        -				tpr[bin] = tpr[bin-1]
        -				fpr[bin] = fpr[bin-1]
        -			}
        -		} else {
        -			for i != (len(y)-1) && y[i+1] > tol {
        -				tol += incWidth
        -				bin++
        -				tpr[bin] = tpr[bin-1]
        -				fpr[bin] = fpr[bin-1]
        -			}
        +		if y[i] <= cutoffs[bin] {
        +			tpr[bin] += posWeight
        +			fpr[bin] += negWeight
         		}
         	}
        -	if n == 0 {
        -		tpr = tpr[:(bin + 1)]
        -		fpr = fpr[:(bin + 1)]
        -	}
         
        -	var invNeg, invPos float64
        -	if nNeg != 0 {
        -		invNeg = 1 / nNeg
        +	invNeg := 1 / nNeg
        +	invPos := 1 / nPos
        +	for i := range tpr {
        +		// Prevent fused float operations by
        +		// making explicit float64 conversions.
        +		tpr[i] = 1 - float64(tpr[i]*invPos)
        +		fpr[i] = 1 - float64(fpr[i]*invNeg)
         	}
        -	if nPos != 0 {
        -		invPos = 1 / nPos
        +	for i, j := 0, len(tpr)-1; i < j; i, j = i+1, j-1 {
        +		tpr[i], tpr[j] = tpr[j], tpr[i]
        +		fpr[i], fpr[j] = fpr[j], fpr[i]
         	}
        -	for i := range tpr {
        -		tpr[i] *= invPos
        -		fpr[i] *= invNeg
        +	for i, j := 1, len(cutoffs)-1; i < j; i, j = i+1, j-1 {
        +		cutoffs[i], cutoffs[j] = cutoffs[j], cutoffs[i]
         	}
        -	tpr[len(tpr)-1] = 1
        -	fpr[len(fpr)-1] = 1
        +	cutoffs[0] = math.Inf(1)
         
        -	return tpr, fpr
        +	return tpr, fpr, cutoffs
         }
        diff --git a/vendor/gonum.org/v1/gonum/stat/stat.go b/vendor/gonum.org/v1/gonum/stat/stat.go
        index 0780552f0..e33188e59 100644
        --- a/vendor/gonum.org/v1/gonum/stat/stat.go
        +++ b/vendor/gonum.org/v1/gonum/stat/stat.go
        @@ -20,6 +20,8 @@ type CumulantKind int
         const (
         	// Empirical treats the distribution as the actual empirical distribution.
         	Empirical CumulantKind = 1
        +	// LinInterp linearly interpolates the empirical distribution between sample values, with a flat extrapolation.
        +	LinInterp CumulantKind = 4
         )
         
         // bhattacharyyaCoeff computes the Bhattacharyya Coefficient for probability distributions given by:
        @@ -104,8 +106,8 @@ func CDF(q float64, c CumulantKind, x, weights []float64) float64 {
         	}
         }
         
        -// ChiSquare computes the chi-square distance between the observed frequences 'obs' and
        -// expected frequences 'exp' given by:
        +// ChiSquare computes the chi-square distance between the observed frequencies 'obs' and
        +// expected frequencies 'exp' given by:
         //  \sum_i (obs_i-exp_i)^2 / exp_i
         //
         // The lengths of obs and exp must be equal.
        @@ -155,7 +157,7 @@ func CircularMean(x, weights []float64) float64 {
         // The lengths of x and y must be equal. If weights is nil then all of the
         // weights are 1. If weights is not nil, then len(x) must equal len(weights).
         func Correlation(x, y, weights []float64) float64 {
        -	// This is a two-pass corrected implementation.  It is an adaptation of the
        +	// This is a two-pass corrected implementation. It is an adaptation of the
         	// algorithm used in the MeanVariance function, which applies a correction
         	// to the typical two pass approach.
         
        @@ -183,7 +185,7 @@ func Correlation(x, y, weights []float64) float64 {
         			ycompensation += yd
         		}
         		// xcompensation and ycompensation are from Chan, et. al.
        -		// referenced in the MeanVariance function.  They are analogous
        +		// referenced in the MeanVariance function. They are analogous
         		// to the second term in (1.7) in that paper.
         		sxx -= xcompensation * xcompensation / float64(len(x))
         		syy -= ycompensation * ycompensation / float64(len(x))
        @@ -208,7 +210,7 @@ func Correlation(x, y, weights []float64) float64 {
         		sumWeights += w
         	}
         	// xcompensation and ycompensation are from Chan, et. al.
        -	// referenced in the MeanVariance function.  They are analogous
        +	// referenced in the MeanVariance function. They are analogous
         	// to the second term in (1.7) in that paper, except they use
         	// the sumWeights instead of the sample count.
         	sxx -= xcompensation * xcompensation / sumWeights
        @@ -275,7 +277,7 @@ func Kendall(x, y, weights []float64) float64 {
         // The lengths of x and y must be equal. If weights is nil then all of the
         // weights are 1. If weights is not nil, then len(x) must equal len(weights).
         func Covariance(x, y, weights []float64) float64 {
        -	// This is a two-pass corrected implementation.  It is an adaptation of the
        +	// This is a two-pass corrected implementation. It is an adaptation of the
         	// algorithm used in the MeanVariance function, which applies a correction
         	// to the typical two pass approach.
         
        @@ -306,7 +308,7 @@ func covarianceMeans(x, y, weights []float64, xu, yu float64) float64 {
         			ycompensation += yd
         		}
         		// xcompensation and ycompensation are from Chan, et. al.
        -		// referenced in the MeanVariance function.  They are analogous
        +		// referenced in the MeanVariance function. They are analogous
         		// to the second term in (1.7) in that paper.
         		return (ss - xcompensation*ycompensation/float64(len(x))) / float64(len(x)-1)
         	}
        @@ -324,7 +326,7 @@ func covarianceMeans(x, y, weights []float64, xu, yu float64) float64 {
         		sumWeights += w
         	}
         	// xcompensation and ycompensation are from Chan, et. al.
        -	// referenced in the MeanVariance function.  They are analogous
        +	// referenced in the MeanVariance function. They are analogous
         	// to the second term in (1.7) in that paper, except they use
         	// the sumWeights instead of the sample count.
         	return (ss - xcompensation*ycompensation/sumWeights) / (sumWeights - 1)
        @@ -351,7 +353,7 @@ func CrossEntropy(p, q []float64) float64 {
         func Entropy(p []float64) float64 {
         	var e float64
         	for _, v := range p {
        -		if v != 0 { // Entropy needs 0 * log(0) == 0
        +		if v != 0 { // Entropy needs 0 * log(0) == 0.
         			e -= v * math.Log(v)
         		}
         	}
        @@ -433,9 +435,9 @@ func HarmonicMean(x, weights []float64) float64 {
         	if weights != nil && len(x) != len(weights) {
         		panic("stat: slice length mismatch")
         	}
        -	// TODO: Fix this to make it more efficient and avoid allocation
        +	// TODO(btracey): Fix this to make it more efficient and avoid allocation.
         
        -	// This can be numerically unstable (for example if x is very small)
        +	// This can be numerically unstable (for example if x is very small).
         	// W = \sum_i {w_i}
         	// hm = exp(log(W) - log(\sum_i w_i / x_i))
         
        @@ -452,7 +454,7 @@ func HarmonicMean(x, weights []float64) float64 {
         	}
         
         	// Sum all of the logs
        -	v := floats.LogSumExp(logs) // this computes log(\sum_i { w_i / x_i})
        +	v := floats.LogSumExp(logs) // This computes log(\sum_i { w_i / x_i}).
         	return math.Exp(math.Log(W) - v)
         }
         
        @@ -516,11 +518,11 @@ func Histogram(count, dividers, x, weights []float64) []float64 {
         	if weights == nil {
         		for _, v := range x {
         			if v < comp {
        -				// Still in the current bucket
        +				// Still in the current bucket.
         				count[idx]++
         				continue
         			}
        -			// Find the next divider where v is less than the divider
        +			// Find the next divider where v is less than the divider.
         			for j := idx + 1; j < len(dividers); j++ {
         				if v < dividers[j+1] {
         					idx = j
        @@ -535,7 +537,7 @@ func Histogram(count, dividers, x, weights []float64) []float64 {
         
         	for i, v := range x {
         		if v < comp {
        -			// Still in the current bucket
        +			// Still in the current bucket.
         			count[idx] += weights[i]
         			continue
         		}
        @@ -583,7 +585,7 @@ func JensenShannon(p, q []float64) float64 {
         // yWeights, respectively.
         //
         // x and y may have different lengths, though len(x) must equal len(xWeights), and
        -// len(y) must equal len(yWeights).  Both x and y must be sorted.
        +// len(y) must equal len(yWeights). Both x and y must be sorted.
         //
         // Special cases are:
         //  = 0 if len(x) == len(y) == 0
        @@ -665,7 +667,7 @@ func KolmogorovSmirnov(x, xWeights, y, yWeights []float64) float64 {
         				yVal, yCdf, yIdx = updateKS(yIdx, yCdf, ySum, y, yWeights, yWeightsNil)
         			} else {
         				// Update them both, they'll be equal next time and the right
        -				// thing will happen
        +				// thing will happen.
         				xVal, xCdf, xIdx = updateKS(xIdx, xCdf, xSum, x, xWeights, xWeightsNil)
         				yVal, yCdf, yIdx = updateKS(yIdx, yCdf, ySum, y, yWeights, yWeightsNil)
         			}
        @@ -691,7 +693,7 @@ func KolmogorovSmirnov(x, xWeights, y, yWeights []float64) float64 {
         // value of the data set, newCdf is the total combined CDF up until this point,
         // and newIdx is the index of the next location in that sample to examine.
         func updateKS(idx int, cdf, sum float64, values, weights []float64, isNil bool) (val, newCdf float64, newIdx int) {
        -	// Sum up all the weights of consecutive values that are equal
        +	// Sum up all the weights of consecutive values that are equal.
         	if isNil {
         		newCdf = cdf + 1/sum
         	} else {
        @@ -725,7 +727,7 @@ func KullbackLeibler(p, q []float64) float64 {
         	}
         	var kl float64
         	for i, v := range p {
        -		if v != 0 { // Entropy needs 0 * log(0) == 0
        +		if v != 0 { // Entropy needs 0 * log(0) == 0.
         			kl += v * (math.Log(v) - math.Log(q[i]))
         		}
         	}
        @@ -1028,6 +1030,7 @@ func MomentAbout(moment float64, x []float64, mean float64, weights []float64) f
         // CumulantKind behaviors:
         //  - Empirical: Returns the lowest value q for which q is greater than or equal
         //  to the fraction p of samples
        +//  - LinInterp: Returns the linearly interpolated value
         func Quantile(p float64, c CumulantKind, x, weights []float64) float64 {
         	if !(p >= 0 && p <= 1) {
         		panic("stat: percentile out of bounds")
        @@ -1037,7 +1040,7 @@ func Quantile(p float64, c CumulantKind, x, weights []float64) float64 {
         		panic("stat: slice length mismatch")
         	}
         	if floats.HasNaN(x) {
        -		return math.NaN() // This is needed because the algorithm breaks otherwise
        +		return math.NaN() // This is needed because the algorithm breaks otherwise.
         	}
         	if !sort.Float64sAreSorted(x) {
         		panic("x data are not sorted")
        @@ -1052,6 +1055,8 @@ func Quantile(p float64, c CumulantKind, x, weights []float64) float64 {
         	switch c {
         	case Empirical:
         		return empiricalQuantile(p, x, weights, sumWeights)
        +	case LinInterp:
        +		return linInterpQuantile(p, x, weights, sumWeights)
         	default:
         		panic("stat: bad cumulant kind")
         	}
        @@ -1073,6 +1078,29 @@ func empiricalQuantile(p float64, x, weights []float64, sumWeights float64) floa
         	panic("impossible")
         }
         
        +func linInterpQuantile(p float64, x, weights []float64, sumWeights float64) float64 {
        +	var cumsum float64
        +	fidx := p * sumWeights
        +	for i := range x {
        +		if weights == nil {
        +			cumsum++
        +		} else {
        +			cumsum += weights[i]
        +		}
        +		if cumsum >= fidx {
        +			if i == 0 {
        +				return x[0]
        +			}
        +			t := cumsum - fidx
        +			if weights != nil {
        +				t /= weights[i]
        +			}
        +			return t*x[i-1] + (1-t)*x[i]
        +		}
        +	}
        +	panic("impossible")
        +}
        +
         // Skew computes the skewness of the sample data.
         // If weights is nil then all of the weights are 1. If weights is not nil, then
         // len(x) must equal len(weights).
        @@ -1209,7 +1237,7 @@ func StdErr(std, sampleSize float64) float64 {
         }
         
         // StdScore returns the standard score (a.k.a. z-score, z-value) for the value x
        -// with the givem mean and standard deviation, i.e.
        +// with the given mean and standard deviation, i.e.
         //  (x - mean) / std
         func StdScore(x, mean, std float64) float64 {
         	return (x - mean) / std
        @@ -1237,7 +1265,7 @@ func MeanVariance(x, weights []float64) (mean, variance float64) {
         	// the sample variance: Analysis and recommendations" by Chan, Tony F., Gene H. Golub,
         	// and Randall J. LeVeque.
         
        -	// note that this will panic if the slice lengths do not match
        +	// Note that this will panic if the slice lengths do not match.
         	mean = Mean(x, weights)
         	var (
         		ss           float64
        @@ -1250,7 +1278,7 @@ func MeanVariance(x, weights []float64) (mean, variance float64) {
         			compensation += d
         		}
         		variance = (ss - compensation*compensation/float64(len(x))) / float64(len(x)-1)
        -		return
        +		return mean, variance
         	}
         
         	var sumWeights float64
        @@ -1263,5 +1291,5 @@ func MeanVariance(x, weights []float64) (mean, variance float64) {
         		sumWeights += w
         	}
         	variance = (ss - compensation*compensation/sumWeights) / (sumWeights - 1)
        -	return
        +	return mean, variance
         }
        diff --git a/vendor/gonum.org/v1/gonum/stat/statmat.go b/vendor/gonum.org/v1/gonum/stat/statmat.go
        index 1e597d4cc..3dbcd1d2a 100644
        --- a/vendor/gonum.org/v1/gonum/stat/statmat.go
        +++ b/vendor/gonum.org/v1/gonum/stat/statmat.go
        @@ -11,32 +11,30 @@ import (
         	"gonum.org/v1/gonum/mat"
         )
         
        -// CovarianceMatrix returns the covariance matrix (also known as the
        +// CovarianceMatrix calculates the covariance matrix (also known as the
         // variance-covariance matrix) calculated from a matrix of data, x, using
        -// a two-pass algorithm.
        +// a two-pass algorithm. The result is stored in dst.
         //
         // If weights is not nil the weighted covariance of x is calculated. weights
         // must have length equal to the number of rows in input data matrix and
         // must not contain negative elements.
        -// If cov is not nil it must either be zero-sized or have the same number of
        -// columns as the input data matrix. cov will be used as the destination for
        -// the covariance data. If cov is nil, a new mat.SymDense is allocated for
        -// the destination.
        -func CovarianceMatrix(cov *mat.SymDense, x mat.Matrix, weights []float64) *mat.SymDense {
        +// The dst matrix must either be empty or have the same number of
        +// columns as the input data matrix.
        +func CovarianceMatrix(dst *mat.SymDense, x mat.Matrix, weights []float64) {
         	// This is the matrix version of the two-pass algorithm. It doesn't use the
         	// additional floating point error correction that the Covariance function uses
         	// to reduce the impact of rounding during centering.
         
         	r, c := x.Dims()
         
        -	if cov == nil {
        -		cov = mat.NewSymDense(c, nil)
        -	} else if n := cov.Symmetric(); n != c && n != 0 {
        +	if dst.IsEmpty() {
        +		*dst = *(dst.GrowSym(c).(*mat.SymDense))
        +	} else if n := dst.Symmetric(); n != c {
         		panic(mat.ErrShape)
         	}
         
         	var xt mat.Dense
        -	xt.Clone(x.T())
        +	xt.CloneFrom(x.T())
         	// Subtract the mean of each of the columns.
         	for i := 0; i < c; i++ {
         		v := xt.RawRowView(i)
        @@ -49,8 +47,8 @@ func CovarianceMatrix(cov *mat.SymDense, x mat.Matrix, weights []float64) *mat.S
         	if weights == nil {
         		// Calculate the normalization factor
         		// scaled by the sample size.
        -		cov.SymOuterK(1/(float64(r)-1), &xt)
        -		return cov
        +		dst.SymOuterK(1/(float64(r)-1), &xt)
        +		return
         	}
         
         	// Multiply by the sqrt of the weights, so that multiplication is symmetric.
        @@ -69,25 +67,21 @@ func CovarianceMatrix(cov *mat.SymDense, x mat.Matrix, weights []float64) *mat.S
         
         	// Calculate the normalization factor
         	// scaled by the weighted sample size.
        -	cov.SymOuterK(1/(floats.Sum(weights)-1), &xt)
        -	return cov
        +	dst.SymOuterK(1/(floats.Sum(weights)-1), &xt)
         }
         
         // CorrelationMatrix returns the correlation matrix calculated from a matrix
        -// of data, x, using a two-pass algorithm.
        +// of data, x, using a two-pass algorithm. The result is stored in dst.
         //
         // If weights is not nil the weighted correlation of x is calculated. weights
         // must have length equal to the number of rows in input data matrix and
         // must not contain negative elements.
        -// If corr is not nil it must either be zero-sized or have the same number of
        -// columns as the input data matrix. corr will be used as the destination for
        -// the correlation data. If corr is nil, a new mat.SymDense is allocated for
        -// the destination.
        -func CorrelationMatrix(corr *mat.SymDense, x mat.Matrix, weights []float64) *mat.SymDense {
        +// The dst matrix must either be empty or have the same number of
        +// columns as the input data matrix.
        +func CorrelationMatrix(dst *mat.SymDense, x mat.Matrix, weights []float64) {
         	// This will panic if the sizes don't match, or if weights is the wrong size.
        -	corr = CovarianceMatrix(corr, x, weights)
        -	covToCorr(corr)
        -	return corr
        +	CovarianceMatrix(dst, x, weights)
        +	covToCorr(dst)
         }
         
         // covToCorr converts a covariance matrix to a correlation matrix.
        @@ -129,7 +123,7 @@ func corrToCov(c *mat.SymDense, sigma []float64) {
         }
         
         // Mahalanobis computes the Mahalanobis distance
        -//  D = sqrt((x-y)^T * Σ^-1 * (x-y))
        +//  D = sqrt((x-y)ᵀ * Σ^-1 * (x-y))
         // between the column vectors x and y given the cholesky decomposition of Σ.
         // Mahalanobis returns NaN if the linear solve fails.
         //
        @@ -138,7 +132,7 @@ func Mahalanobis(x, y mat.Vector, chol *mat.Cholesky) float64 {
         	var diff mat.VecDense
         	diff.SubVec(x, y)
         	var tmp mat.VecDense
        -	err := chol.SolveVec(&tmp, &diff)
        +	err := chol.SolveVecTo(&tmp, &diff)
         	if err != nil {
         		return math.NaN()
         	}
        diff --git a/vendor/google.golang.org/api/CONTRIBUTORS b/vendor/google.golang.org/api/CONTRIBUTORS
        index b8928e616..fe55ebff0 100644
        --- a/vendor/google.golang.org/api/CONTRIBUTORS
        +++ b/vendor/google.golang.org/api/CONTRIBUTORS
        @@ -48,6 +48,7 @@ Kunpei Sakai 
         Matthew Whisenhunt 
         Michael McGreevy 
         Nick Craig-Wood 
        +Robbie Trencheny 
         Ross Light 
         Sarah Adams 
         Scott Van Woudenberg 
        diff --git a/vendor/google.golang.org/api/gensupport/backoff.go b/vendor/google.golang.org/api/gensupport/backoff.go
        index 135614047..94b7789ee 100644
        --- a/vendor/google.golang.org/api/gensupport/backoff.go
        +++ b/vendor/google.golang.org/api/gensupport/backoff.go
        @@ -9,6 +9,8 @@ import (
         	"time"
         )
         
        +// BackoffStrategy defines the set of functions that a backoff-er must
        +// implement.
         type BackoffStrategy interface {
         	// Pause returns the duration of the next pause and true if the operation should be
         	// retried, or false if no further retries should be attempted.
        @@ -28,6 +30,7 @@ type ExponentialBackoff struct {
         	n     uint
         }
         
        +// Pause returns the amount of time the caller should wait.
         func (eb *ExponentialBackoff) Pause() (time.Duration, bool) {
         	if eb.total > eb.Max {
         		return 0, false
        @@ -40,6 +43,8 @@ func (eb *ExponentialBackoff) Pause() (time.Duration, bool) {
         	return d, true
         }
         
        +// Reset resets the backoff strategy such that the next Pause call will begin
        +// counting from the start. It is not safe to call concurrently with Pause.
         func (eb *ExponentialBackoff) Reset() {
         	eb.n = 0
         	eb.total = 0
        diff --git a/vendor/google.golang.org/api/gensupport/buffer.go b/vendor/google.golang.org/api/gensupport/buffer.go
        index 992104911..3d0817ede 100644
        --- a/vendor/google.golang.org/api/gensupport/buffer.go
        +++ b/vendor/google.golang.org/api/gensupport/buffer.go
        @@ -11,7 +11,8 @@ import (
         	"google.golang.org/api/googleapi"
         )
         
        -// MediaBuffer buffers data from an io.Reader to support uploading media in retryable chunks.
        +// MediaBuffer buffers data from an io.Reader to support uploading media in
        +// retryable chunks. It should be created with NewMediaBuffer.
         type MediaBuffer struct {
         	media io.Reader
         
        @@ -22,6 +23,7 @@ type MediaBuffer struct {
         	off int64
         }
         
        +// NewMediaBuffer initializes a MediaBuffer.
         func NewMediaBuffer(media io.Reader, chunkSize int) *MediaBuffer {
         	return &MediaBuffer{media: media, chunk: make([]byte, 0, chunkSize)}
         }
        diff --git a/vendor/google.golang.org/api/gensupport/go18.go b/vendor/google.golang.org/api/gensupport/go18.go
        deleted file mode 100644
        index c76cb8f20..000000000
        --- a/vendor/google.golang.org/api/gensupport/go18.go
        +++ /dev/null
        @@ -1,17 +0,0 @@
        -// Copyright 2018 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -// +build go1.8
        -
        -package gensupport
        -
        -import (
        -	"io"
        -	"net/http"
        -)
        -
        -// SetGetBody sets the GetBody field of req to f.
        -func SetGetBody(req *http.Request, f func() (io.ReadCloser, error)) {
        -	req.GetBody = f
        -}
        diff --git a/vendor/google.golang.org/api/gensupport/jsonfloat.go b/vendor/google.golang.org/api/gensupport/jsonfloat.go
        index cb02335d2..837785081 100644
        --- a/vendor/google.golang.org/api/gensupport/jsonfloat.go
        +++ b/vendor/google.golang.org/api/gensupport/jsonfloat.go
        @@ -1,4 +1,4 @@
        -// Copyright 2016 Google Inc. All Rights Reserved.
        +// Copyright 2016 Google LLC
         //
         // Licensed under the Apache License, Version 2.0 (the "License");
         // you may not use this file except in compliance with the License.
        diff --git a/vendor/google.golang.org/api/gensupport/media.go b/vendor/google.golang.org/api/gensupport/media.go
        index 5a2674104..0ef96b3f1 100644
        --- a/vendor/google.golang.org/api/gensupport/media.go
        +++ b/vendor/google.golang.org/api/gensupport/media.go
        @@ -9,10 +9,12 @@ import (
         	"fmt"
         	"io"
         	"io/ioutil"
        +	"mime"
         	"mime/multipart"
         	"net/http"
         	"net/textproto"
         	"strings"
        +	"sync"
         
         	"google.golang.org/api/googleapi"
         )
        @@ -105,19 +107,24 @@ type typeReader struct {
         	typ string
         }
         
        -// multipartReader combines the contents of multiple readers to creat a multipart/related HTTP body.
        +// multipartReader combines the contents of multiple readers to create a multipart/related HTTP body.
         // Close must be called if reads from the multipartReader are abandoned before reaching EOF.
         type multipartReader struct {
         	pr       *io.PipeReader
        -	pipeOpen bool
         	ctype    string
        +	mu       sync.Mutex
        +	pipeOpen bool
         }
         
        -func newMultipartReader(parts []typeReader) *multipartReader {
        +// boundary optionally specifies the MIME boundary
        +func newMultipartReader(parts []typeReader, boundary string) *multipartReader {
         	mp := &multipartReader{pipeOpen: true}
         	var pw *io.PipeWriter
         	mp.pr, pw = io.Pipe()
         	mpw := multipart.NewWriter(pw)
        +	if boundary != "" {
        +		mpw.SetBoundary(boundary)
        +	}
         	mp.ctype = "multipart/related; boundary=" + mpw.Boundary()
         	go func() {
         		for _, part := range parts {
        @@ -146,10 +153,13 @@ func (mp *multipartReader) Read(data []byte) (n int, err error) {
         }
         
         func (mp *multipartReader) Close() error {
        +	mp.mu.Lock()
         	if !mp.pipeOpen {
        +		mp.mu.Unlock()
         		return nil
         	}
         	mp.pipeOpen = false
        +	mp.mu.Unlock()
         	return mp.pr.Close()
         }
         
        @@ -158,10 +168,15 @@ func (mp *multipartReader) Close() error {
         //
         // The caller must call Close on the returned ReadCloser if reads are abandoned before reaching EOF.
         func CombineBodyMedia(body io.Reader, bodyContentType string, media io.Reader, mediaContentType string) (io.ReadCloser, string) {
        +	return combineBodyMedia(body, bodyContentType, media, mediaContentType, "")
        +}
        +
        +// combineBodyMedia is CombineBodyMedia but with an optional mimeBoundary field.
        +func combineBodyMedia(body io.Reader, bodyContentType string, media io.Reader, mediaContentType, mimeBoundary string) (io.ReadCloser, string) {
         	mp := newMultipartReader([]typeReader{
         		{body, bodyContentType},
         		{media, mediaContentType},
        -	})
        +	}, mimeBoundary)
         	return mp, mp.ctype
         }
         
        @@ -237,6 +252,7 @@ func NewInfoFromResumableMedia(r io.ReaderAt, size int64, mediaType string) *Med
         	}
         }
         
        +// SetProgressUpdater sets the progress updater for the media info.
         func (mi *MediaInfo) SetProgressUpdater(pu googleapi.ProgressUpdater) {
         	if mi != nil {
         		mi.progressUpdater = pu
        @@ -278,7 +294,11 @@ func (mi *MediaInfo) UploadRequest(reqHeaders http.Header, body io.Reader) (newB
         			getBody = func() (io.ReadCloser, error) {
         				rb := ioutil.NopCloser(fb())
         				rm := ioutil.NopCloser(fm())
        -				r, _ := CombineBodyMedia(rb, "application/json", rm, mi.mType)
        +				var mimeBoundary string
        +				if _, params, err := mime.ParseMediaType(ctype); err == nil {
        +					mimeBoundary = params["boundary"]
        +				}
        +				r, _ := combineBodyMedia(rb, "application/json", rm, mi.mType, mimeBoundary)
         				return r, nil
         			}
         		}
        @@ -329,3 +349,15 @@ func (mi *MediaInfo) ResumableUpload(locURI string) *ResumableUpload {
         		},
         	}
         }
        +
        +// SetGetBody sets the GetBody field of req to f. This was once needed
        +// to gracefully support Go 1.7 and earlier which didn't have that
        +// field.
        +//
        +// Deprecated: the code generator no longer uses this as of
        +// 2019-02-19. Nothing else should be calling this anyway, but we
        +// won't delete this immediately; it will be deleted in as early as 6
        +// months.
        +func SetGetBody(req *http.Request, f func() (io.ReadCloser, error)) {
        +	req.GetBody = f
        +}
        diff --git a/vendor/google.golang.org/api/gensupport/not_go18.go b/vendor/google.golang.org/api/gensupport/not_go18.go
        deleted file mode 100644
        index 2536501ce..000000000
        --- a/vendor/google.golang.org/api/gensupport/not_go18.go
        +++ /dev/null
        @@ -1,14 +0,0 @@
        -// Copyright 2018 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -// +build !go1.8
        -
        -package gensupport
        -
        -import (
        -	"io"
        -	"net/http"
        -)
        -
        -func SetGetBody(req *http.Request, f func() (io.ReadCloser, error)) {}
        diff --git a/vendor/google.golang.org/api/gensupport/params.go b/vendor/google.golang.org/api/gensupport/params.go
        index 3b3c74396..0e878a425 100644
        --- a/vendor/google.golang.org/api/gensupport/params.go
        +++ b/vendor/google.golang.org/api/gensupport/params.go
        @@ -43,6 +43,7 @@ func (u URLParams) Encode() string {
         	return url.Values(u).Encode()
         }
         
        +// SetOptions sets the URL params and any additional call options.
         func SetOptions(u URLParams, opts ...googleapi.CallOption) {
         	for _, o := range opts {
         		u.Set(o.Get())
        diff --git a/vendor/google.golang.org/api/gensupport/resumable.go b/vendor/google.golang.org/api/gensupport/resumable.go
        index dcd591f7f..2552a6aca 100644
        --- a/vendor/google.golang.org/api/gensupport/resumable.go
        +++ b/vendor/google.golang.org/api/gensupport/resumable.go
        @@ -5,14 +5,13 @@
         package gensupport
         
         import (
        +	"context"
         	"errors"
         	"fmt"
         	"io"
         	"net/http"
         	"sync"
         	"time"
        -
        -	"golang.org/x/net/context"
         )
         
         const (
        diff --git a/vendor/google.golang.org/api/gensupport/retry.go b/vendor/google.golang.org/api/gensupport/retry.go
        index c60b3c394..fdde3f42c 100644
        --- a/vendor/google.golang.org/api/gensupport/retry.go
        +++ b/vendor/google.golang.org/api/gensupport/retry.go
        @@ -1,4 +1,4 @@
        -// Copyright 2017 Google Inc. All Rights Reserved.
        +// Copyright 2017 Google LLC
         //
         // Licensed under the Apache License, Version 2.0 (the "License");
         // you may not use this file except in compliance with the License.
        @@ -15,12 +15,11 @@
         package gensupport
         
         import (
        +	"context"
         	"io"
         	"net"
         	"net/http"
         	"time"
        -
        -	"golang.org/x/net/context"
         )
         
         // Retry invokes the given function, retrying it multiple times if the connection failed or
        diff --git a/vendor/google.golang.org/api/gensupport/send.go b/vendor/google.golang.org/api/gensupport/send.go
        index 0f75aa867..579939309 100644
        --- a/vendor/google.golang.org/api/gensupport/send.go
        +++ b/vendor/google.golang.org/api/gensupport/send.go
        @@ -5,12 +5,10 @@
         package gensupport
         
         import (
        +	"context"
         	"encoding/json"
         	"errors"
         	"net/http"
        -
        -	"golang.org/x/net/context"
        -	"golang.org/x/net/context/ctxhttp"
         )
         
         // Hook is the type of a function that is called once before each HTTP request
        @@ -32,7 +30,8 @@ func RegisterHook(h Hook) {
         
         // SendRequest sends a single HTTP request using the given client.
         // If ctx is non-nil, it calls all hooks, then sends the request with
        -// ctxhttp.Do, then calls any functions returned by the hooks in reverse order.
        +// req.WithContext, then calls any functions returned by the hooks in
        +// reverse order.
         func SendRequest(ctx context.Context, client *http.Client, req *http.Request) (*http.Response, error) {
         	// Disallow Accept-Encoding because it interferes with the automatic gzip handling
         	// done by the default http.Transport. See https://github.com/google/google-api-go-client/issues/219.
        @@ -50,7 +49,7 @@ func SendRequest(ctx context.Context, client *http.Client, req *http.Request) (*
         	}
         
         	// Send request.
        -	resp, err := ctxhttp.Do(ctx, client, req)
        +	resp, err := send(ctx, client, req)
         
         	// Call returned funcs in reverse order.
         	for i := len(post) - 1; i >= 0; i-- {
        @@ -61,6 +60,23 @@ func SendRequest(ctx context.Context, client *http.Client, req *http.Request) (*
         	return resp, err
         }
         
        +func send(ctx context.Context, client *http.Client, req *http.Request) (*http.Response, error) {
        +	if client == nil {
        +		client = http.DefaultClient
        +	}
        +	resp, err := client.Do(req.WithContext(ctx))
        +	// If we got an error, and the context has been canceled,
        +	// the context's error is probably more useful.
        +	if err != nil {
        +		select {
        +		case <-ctx.Done():
        +			err = ctx.Err()
        +		default:
        +		}
        +	}
        +	return resp, err
        +}
        +
         // DecodeResponse decodes the body of res into target. If there is no body,
         // target is unchanged.
         func DecodeResponse(target interface{}, res *http.Response) error {
        diff --git a/vendor/google.golang.org/api/googleapi/googleapi.go b/vendor/google.golang.org/api/googleapi/googleapi.go
        index f6e15be35..ab5376762 100644
        --- a/vendor/google.golang.org/api/googleapi/googleapi.go
        +++ b/vendor/google.golang.org/api/googleapi/googleapi.go
        @@ -37,24 +37,28 @@ type SizeReaderAt interface {
         // ServerResponse is embedded in each Do response and
         // provides the HTTP status code and header sent by the server.
         type ServerResponse struct {
        -	// HTTPStatusCode is the server's response status code.
        -	// When using a resource method's Do call, this will always be in the 2xx range.
        +	// HTTPStatusCode is the server's response status code. When using a
        +	// resource method's Do call, this will always be in the 2xx range.
         	HTTPStatusCode int
         	// Header contains the response header fields from the server.
         	Header http.Header
         }
         
         const (
        +	// Version defines the gax version being used. This is typically sent
        +	// in an HTTP header to services.
         	Version = "0.5"
         
         	// UserAgent is the header string used to identify this package.
         	UserAgent = "google-api-go-client/" + Version
         
        -	// The default chunk size to use for resumable uploads if not specified by the user.
        +	// DefaultUploadChunkSize is the default chunk size to use for resumable
        +	// uploads if not specified by the user.
         	DefaultUploadChunkSize = 8 * 1024 * 1024
         
        -	// The minimum chunk size that can be used for resumable uploads.  All
        -	// user-specified chunk sizes must be multiple of this value.
        +	// MinUploadChunkSize is the minimum chunk size that can be used for
        +	// resumable uploads.  All user-specified chunk sizes must be multiple of
        +	// this value.
         	MinUploadChunkSize = 256 * 1024
         )
         
        @@ -161,9 +165,13 @@ func CheckMediaResponse(res *http.Response) error {
         	}
         }
         
        +// MarshalStyle defines whether to marshal JSON with a {"data": ...} wrapper.
         type MarshalStyle bool
         
        +// WithDataWrapper marshals JSON with a {"data": ...} wrapper.
         var WithDataWrapper = MarshalStyle(true)
        +
        +// WithoutDataWrapper marshals JSON without a {"data": ...} wrapper.
         var WithoutDataWrapper = MarshalStyle(false)
         
         func (wrap MarshalStyle) JSONReader(v interface{}) (io.Reader, error) {
        @@ -181,37 +189,12 @@ func (wrap MarshalStyle) JSONReader(v interface{}) (io.Reader, error) {
         	return buf, nil
         }
         
        -// endingWithErrorReader from r until it returns an error.  If the
        -// final error from r is io.EOF and e is non-nil, e is used instead.
        -type endingWithErrorReader struct {
        -	r io.Reader
        -	e error
        -}
        -
        -func (er endingWithErrorReader) Read(p []byte) (n int, err error) {
        -	n, err = er.r.Read(p)
        -	if err == io.EOF && er.e != nil {
        -		err = er.e
        -	}
        -	return
        -}
        -
        -// countingWriter counts the number of bytes it receives to write, but
        -// discards them.
        -type countingWriter struct {
        -	n *int64
        -}
        -
        -func (w countingWriter) Write(p []byte) (int, error) {
        -	*w.n += int64(len(p))
        -	return len(p), nil
        -}
        -
         // ProgressUpdater is a function that is called upon every progress update of a resumable upload.
         // This is the only part of a resumable upload (from googleapi) that is usable by the developer.
         // The remaining usable pieces of resumable uploads is exposed in each auto-generated API.
         type ProgressUpdater func(current, total int64)
         
        +// MediaOption defines the interface for setting media options.
         type MediaOption interface {
         	setOptions(o *MediaOptions)
         }
        @@ -268,13 +251,27 @@ func ProcessMediaOptions(opts []MediaOption) *MediaOptions {
         	return mo
         }
         
        +// ResolveRelative resolves relatives such as "http://www.golang.org/" and
        +// "topics/myproject/mytopic" into a single string, such as
        +// "http://www.golang.org/topics/myproject/mytopic". It strips all parent
        +// references (e.g. ../..) as well as anything after the host
        +// (e.g. /bar/gaz gets stripped out of foo.com/bar/gaz).
         func ResolveRelative(basestr, relstr string) string {
         	u, _ := url.Parse(basestr)
        +	afterColonPath := ""
        +	if i := strings.IndexRune(relstr, ':'); i > 0 {
        +		afterColonPath = relstr[i+1:]
        +		relstr = relstr[:i]
        +	}
         	rel, _ := url.Parse(relstr)
         	u = u.ResolveReference(rel)
         	us := u.String()
        +	if afterColonPath != "" {
        +		us = fmt.Sprintf("%s:%s", us, afterColonPath)
        +	}
         	us = strings.Replace(us, "%7B", "{", -1)
         	us = strings.Replace(us, "%7D", "}", -1)
        +	us = strings.Replace(us, "%2A", "*", -1)
         	return us
         }
         
        diff --git a/vendor/google.golang.org/api/googleapi/types.go b/vendor/google.golang.org/api/googleapi/types.go
        index c8fdd5416..a280e3021 100644
        --- a/vendor/google.golang.org/api/googleapi/types.go
        +++ b/vendor/google.golang.org/api/googleapi/types.go
        @@ -120,33 +120,33 @@ func quotedList(n int, fn func(dst []byte, i int) []byte) ([]byte, error) {
         	return dst, nil
         }
         
        -func (s Int64s) MarshalJSON() ([]byte, error) {
        -	return quotedList(len(s), func(dst []byte, i int) []byte {
        -		return strconv.AppendInt(dst, s[i], 10)
        +func (q Int64s) MarshalJSON() ([]byte, error) {
        +	return quotedList(len(q), func(dst []byte, i int) []byte {
        +		return strconv.AppendInt(dst, q[i], 10)
         	})
         }
         
        -func (s Int32s) MarshalJSON() ([]byte, error) {
        -	return quotedList(len(s), func(dst []byte, i int) []byte {
        -		return strconv.AppendInt(dst, int64(s[i]), 10)
        +func (q Int32s) MarshalJSON() ([]byte, error) {
        +	return quotedList(len(q), func(dst []byte, i int) []byte {
        +		return strconv.AppendInt(dst, int64(q[i]), 10)
         	})
         }
         
        -func (s Uint64s) MarshalJSON() ([]byte, error) {
        -	return quotedList(len(s), func(dst []byte, i int) []byte {
        -		return strconv.AppendUint(dst, s[i], 10)
        +func (q Uint64s) MarshalJSON() ([]byte, error) {
        +	return quotedList(len(q), func(dst []byte, i int) []byte {
        +		return strconv.AppendUint(dst, q[i], 10)
         	})
         }
         
        -func (s Uint32s) MarshalJSON() ([]byte, error) {
        -	return quotedList(len(s), func(dst []byte, i int) []byte {
        -		return strconv.AppendUint(dst, uint64(s[i]), 10)
        +func (q Uint32s) MarshalJSON() ([]byte, error) {
        +	return quotedList(len(q), func(dst []byte, i int) []byte {
        +		return strconv.AppendUint(dst, uint64(q[i]), 10)
         	})
         }
         
        -func (s Float64s) MarshalJSON() ([]byte, error) {
        -	return quotedList(len(s), func(dst []byte, i int) []byte {
        -		return strconv.AppendFloat(dst, s[i], 'g', -1, 64)
        +func (q Float64s) MarshalJSON() ([]byte, error) {
        +	return quotedList(len(q), func(dst []byte, i int) []byte {
        +		return strconv.AppendFloat(dst, q[i], 'g', -1, 64)
         	})
         }
         
        diff --git a/vendor/google.golang.org/api/internal/creds.go b/vendor/google.golang.org/api/internal/creds.go
        index c16b7b629..69b8659fd 100644
        --- a/vendor/google.golang.org/api/internal/creds.go
        +++ b/vendor/google.golang.org/api/internal/creds.go
        @@ -1,4 +1,4 @@
        -// Copyright 2017 Google Inc. All Rights Reserved.
        +// Copyright 2017 Google LLC
         //
         // Licensed under the Apache License, Version 2.0 (the "License");
         // you may not use this file except in compliance with the License.
        @@ -15,28 +15,88 @@
         package internal
         
         import (
        +	"context"
        +	"encoding/json"
         	"fmt"
         	"io/ioutil"
         
        -	"golang.org/x/net/context"
        +	"golang.org/x/oauth2"
        +
         	"golang.org/x/oauth2/google"
         )
         
         // Creds returns credential information obtained from DialSettings, or if none, then
         // it returns default credential information.
        -func Creds(ctx context.Context, ds *DialSettings) (*google.DefaultCredentials, error) {
        +func Creds(ctx context.Context, ds *DialSettings) (*google.Credentials, error) {
         	if ds.Credentials != nil {
         		return ds.Credentials, nil
         	}
        +	if ds.CredentialsJSON != nil {
        +		return credentialsFromJSON(ctx, ds.CredentialsJSON, ds.Endpoint, ds.Scopes, ds.Audiences)
        +	}
         	if ds.CredentialsFile != "" {
         		data, err := ioutil.ReadFile(ds.CredentialsFile)
         		if err != nil {
         			return nil, fmt.Errorf("cannot read credentials file: %v", err)
         		}
        -		return google.CredentialsFromJSON(ctx, data, ds.Scopes...)
        +		return credentialsFromJSON(ctx, data, ds.Endpoint, ds.Scopes, ds.Audiences)
         	}
         	if ds.TokenSource != nil {
        -		return &google.DefaultCredentials{TokenSource: ds.TokenSource}, nil
        +		return &google.Credentials{TokenSource: ds.TokenSource}, nil
        +	}
        +	cred, err := google.FindDefaultCredentials(ctx, ds.Scopes...)
        +	if err != nil {
        +		return nil, err
        +	}
        +	if len(cred.JSON) > 0 {
        +		return credentialsFromJSON(ctx, cred.JSON, ds.Endpoint, ds.Scopes, ds.Audiences)
        +	}
        +	// For GAE and GCE, the JSON is empty so return the default credentials directly.
        +	return cred, nil
        +}
        +
        +// JSON key file type.
        +const (
        +	serviceAccountKey = "service_account"
        +)
        +
        +// credentialsFromJSON returns a google.Credentials based on the input.
        +//
        +// - If the JSON is a service account and no scopes provided, returns self-signed JWT auth flow
        +// - Otherwise, returns OAuth 2.0 flow.
        +func credentialsFromJSON(ctx context.Context, data []byte, endpoint string, scopes []string, audiences []string) (*google.Credentials, error) {
        +	cred, err := google.CredentialsFromJSON(ctx, data, scopes...)
        +	if err != nil {
        +		return nil, err
        +	}
        +	if len(data) > 0 && len(scopes) == 0 {
        +		var f struct {
        +			Type string `json:"type"`
        +			// The rest JSON fields are omitted because they are not used.
        +		}
        +		if err := json.Unmarshal(cred.JSON, &f); err != nil {
        +			return nil, err
        +		}
        +		if f.Type == serviceAccountKey {
        +			ts, err := selfSignedJWTTokenSource(data, endpoint, audiences)
        +			if err != nil {
        +				return nil, err
        +			}
        +			cred.TokenSource = ts
        +		}
        +	}
        +	return cred, err
        +}
        +
        +func selfSignedJWTTokenSource(data []byte, endpoint string, audiences []string) (oauth2.TokenSource, error) {
        +	// Use the API endpoint as the default audience
        +	audience := endpoint
        +	if len(audiences) > 0 {
        +		// TODO(shinfan): Update golang oauth to support multiple audiences.
        +		if len(audiences) > 1 {
        +			return nil, fmt.Errorf("multiple audiences support is not implemented")
        +		}
        +		audience = audiences[0]
         	}
        -	return google.FindDefaultCredentials(ctx, ds.Scopes...)
        +	return google.JWTAccessTokenSourceFromJSON(data, audience)
         }
        diff --git a/vendor/google.golang.org/api/internal/pool.go b/vendor/google.golang.org/api/internal/pool.go
        index 4150feb6b..a4426dcb7 100644
        --- a/vendor/google.golang.org/api/internal/pool.go
        +++ b/vendor/google.golang.org/api/internal/pool.go
        @@ -1,4 +1,4 @@
        -// Copyright 2016 Google Inc. All Rights Reserved.
        +// Copyright 2016 Google LLC
         //
         // Licensed under the Apache License, Version 2.0 (the "License");
         // you may not use this file except in compliance with the License.
        @@ -16,6 +16,7 @@ package internal
         
         import (
         	"errors"
        +
         	"google.golang.org/grpc/naming"
         )
         
        @@ -37,7 +38,7 @@ func NewPoolResolver(size int, o *DialSettings) *PoolResolver {
         // provided to NewPoolResolver.
         func (r *PoolResolver) Resolve(target string) (naming.Watcher, error) {
         	if r.dialOpt.Endpoint == "" {
        -		return nil, errors.New("No endpoint configured")
        +		return nil, errors.New("no endpoint configured")
         	}
         	addrs := make([]*naming.Update, 0, r.poolSize)
         	for i := 0; i < r.poolSize; i++ {
        @@ -54,6 +55,7 @@ func (r *PoolResolver) Next() ([]*naming.Update, error) {
         	return <-r.ch, nil
         }
         
        +// Close releases resources associated with the pool and causes Next to unblock.
         func (r *PoolResolver) Close() {
         	close(r.ch)
         }
        diff --git a/vendor/google.golang.org/api/internal/service-account.json b/vendor/google.golang.org/api/internal/service-account.json
        index 2cb54c292..6b36a9296 100644
        --- a/vendor/google.golang.org/api/internal/service-account.json
        +++ b/vendor/google.golang.org/api/internal/service-account.json
        @@ -2,7 +2,7 @@
           "type": "service_account",
           "project_id": "project_id",
           "private_key_id": "private_key_id",
        -  "private_key": "private_key",
        +  "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCzd9ZdbPLAR4/g\nj+Rodu15kEasMpxf/Mz+gKRb2fmgR2Y18Y/iRBYZ4SkmF2pBSfzvwE/aTCzSPBGl\njHhPzohXnSN029eWoItmxVONlqCbR29pD07aLzv08LGeIGdHIEdhVjhvRwTkYZIF\ndXmlHNDRUU/EbJN9D+3ahw22BNnC4PaDgfIWTs3xIlTCSf2rL39I4DSNLTS/LzxK\n/XrQfBMtfwMWwyQaemXbc7gRgzOy8L56wa1W1zyXx99th97j1bLnoAXBGplhB4Co\n25ohyDAuhxRm+XGMEaO0Mzo7u97kvhj48a569RH1QRhOf7EBf60jO4h5eOmfi5P5\nPV3l7041AgMBAAECggEAEZ0RTNoEeRqM5F067YW+iM/AH+ZXspP9Cn1VpC4gcbqQ\nLXsnw+0qvh97CmIB66Z3TJBzRdl0DK4YjUbcB/kdKHwjnrR01DOtesijCqJd4N+B\n762w73jzSXbV9872U+S3HLZ5k3JE6KUqz55X8fyCAgkY6w4862lEzs2yasrPFHEV\nRoQp3PM0Miif8R3hGDhOWcHxcobullthG6JHAQFfc1ctwEjZI4TK0iWqlzfWGyKN\nT9UgvjUDud5cGvS9el0AiLN6keAf77tcPn1zetUVhxN1KN4bVAm1Q+6O8esl63Rj\n7JXpHzxaRnit9S6/aH/twHsGGtLg5Puw6jey6xs4AQKBgQD2JNy1wzewCRkD+jug\n8CHbJ+LIJVRNIaWa/RK1QD8/UjmFPkIzRQSF3AKC5mRAWSa2FL3yVK3N/DD7hazW\n85XSBB7IDcnoJnA9SkUeWwqQGkDx3EntlU3gX8Kn/+ofF8O9jLXxAa901MAVXVuf\n5YDzrl4PNE3bFnPCdiNmSdRfhQKBgQC6p4DsCpwqbeTu9f5ak9VW/fQP47Fgt+Mf\nwGjBnKP5PbbNJpHCfamF7jqSRH83Xy0KNssH7jD/NZ2oT594sMmiQPUC5ni9VYY6\nsuYB0JbD5Mq+EjKIVhYtxaQJ76LzHreEI+G4z6k3H7/hRpr3/C48n9G/uVkT9DbJ\noplxxEx68QKBgQCdJ23vcwO0Firtmi/GEmtbVHz70rGfSXNFoHz4UlvPXv0wsE5u\nE4vOt2i3EMhDOWh46odYGG6bzH+tp2xyFTW70Dui+QLHgPs6dpfoyLHWzZxXj5F3\n6lK9hgZvYvqk/XRRKmzjwnK2wjsdqOyeC1covlR5mqh20D/6kZkKbur0TQKBgAwy\nCZBimRWEnKKoW/gbFKNccGfhXqONID/g2Hdd/rC4QYth68AjacIgcJ9B7nX1uAGk\n1tsryvPB0w0+NpMyKdp6GAgaeuUUA3MuYSzZLiCagEyu77JMvaI7+Z3UlHcCGMd/\neK4Uk1/QqT7U2Cc/yN2ZK6E1QQa2vCWshA4U31JhAoGAbtbSSSsul1c+PsJ13Cfk\n6qVnqYzPqt23QTyOZmGAvUHH/M4xRiQpOE0cDF4t/r5PwenAQPQzTvMmWRzj6uAY\n3eaU0eAK7ZfoweCoOIAPnpFbbRLrXfoY46H7MYh7euWGXOKEpxz5yzuEkd9ByNUE\n86vSEidqbMIiXVgEgnu/k08=\n-----END PRIVATE KEY-----\n",
           "client_email": "xyz@developer.gserviceaccount.com",
           "client_id": "123",
           "auth_uri": "https://accounts.google.com/o/oauth2/auth",
        diff --git a/vendor/google.golang.org/api/internal/settings.go b/vendor/google.golang.org/api/internal/settings.go
        index 34dfa5a82..062301c65 100644
        --- a/vendor/google.golang.org/api/internal/settings.go
        +++ b/vendor/google.golang.org/api/internal/settings.go
        @@ -1,4 +1,4 @@
        -// Copyright 2017 Google Inc. All Rights Reserved.
        +// Copyright 2017 Google LLC
         //
         // Licensed under the Apache License, Version 2.0 (the "License");
         // you may not use this file except in compliance with the License.
        @@ -30,14 +30,21 @@ type DialSettings struct {
         	Endpoint        string
         	Scopes          []string
         	TokenSource     oauth2.TokenSource
        -	Credentials     *google.DefaultCredentials
        +	Credentials     *google.Credentials
         	CredentialsFile string // if set, Token Source is ignored.
        +	CredentialsJSON []byte
         	UserAgent       string
         	APIKey          string
        +	Audiences       []string
         	HTTPClient      *http.Client
         	GRPCDialOpts    []grpc.DialOption
         	GRPCConn        *grpc.ClientConn
         	NoAuth          bool
        +
        +	// Google API system parameters. For more information please read:
        +	// https://cloud.google.com/apis/docs/system-parameters
        +	QuotaProject  string
        +	RequestReason string
         }
         
         // Validate reports an error if ds is invalid.
        @@ -49,7 +56,27 @@ func (ds *DialSettings) Validate() error {
         	// Credentials should not appear with other options.
         	// We currently allow TokenSource and CredentialsFile to coexist.
         	// TODO(jba): make TokenSource & CredentialsFile an error (breaking change).
        -	if ds.Credentials != nil && (ds.APIKey != "" || ds.TokenSource != nil || ds.CredentialsFile != "") {
        +	nCreds := 0
        +	if ds.Credentials != nil {
        +		nCreds++
        +	}
        +	if ds.CredentialsJSON != nil {
        +		nCreds++
        +	}
        +	if ds.CredentialsFile != "" {
        +		nCreds++
        +	}
        +	if ds.APIKey != "" {
        +		nCreds++
        +	}
        +	if ds.TokenSource != nil {
        +		nCreds++
        +	}
        +	if len(ds.Scopes) > 0 && len(ds.Audiences) > 0 {
        +		return errors.New("WithScopes is incompatible with WithAudience")
        +	}
        +	// Accept only one form of credentials, except we allow TokenSource and CredentialsFile for backwards compatibility.
        +	if nCreds > 1 && !(nCreds == 2 && ds.TokenSource != nil && ds.CredentialsFile != "") {
         		return errors.New("multiple credential options provided")
         	}
         	if ds.HTTPClient != nil && ds.GRPCConn != nil {
        @@ -58,5 +85,12 @@ func (ds *DialSettings) Validate() error {
         	if ds.HTTPClient != nil && ds.GRPCDialOpts != nil {
         		return errors.New("WithHTTPClient is incompatible with gRPC dial options")
         	}
        +	if ds.HTTPClient != nil && ds.QuotaProject != "" {
        +		return errors.New("WithHTTPClient is incompatible with QuotaProject")
        +	}
        +	if ds.HTTPClient != nil && ds.RequestReason != "" {
        +		return errors.New("WithHTTPClient is incompatible with RequestReason")
        +	}
        +
         	return nil
         }
        diff --git a/vendor/google.golang.org/api/iterator/iterator.go b/vendor/google.golang.org/api/iterator/iterator.go
        index e34e52073..3c8ea7732 100644
        --- a/vendor/google.golang.org/api/iterator/iterator.go
        +++ b/vendor/google.golang.org/api/iterator/iterator.go
        @@ -1,4 +1,4 @@
        -// Copyright 2016 Google Inc. All Rights Reserved.
        +// Copyright 2016 Google LLC
         //
         // Licensed under the Apache License, Version 2.0 (the "License");
         // you may not use this file except in compliance with the License.
        diff --git a/vendor/google.golang.org/api/option/credentials_go19.go b/vendor/google.golang.org/api/option/credentials_go19.go
        index c08c1149d..0636a8294 100644
        --- a/vendor/google.golang.org/api/option/credentials_go19.go
        +++ b/vendor/google.golang.org/api/option/credentials_go19.go
        @@ -1,4 +1,4 @@
        -// Copyright 2018 Google Inc. All Rights Reserved.
        +// Copyright 2018 Google LLC
         //
         // Licensed under the Apache License, Version 2.0 (the "License");
         // you may not use this file except in compliance with the License.
        @@ -27,6 +27,7 @@ func (w *withCreds) Apply(o *internal.DialSettings) {
         	o.Credentials = (*google.Credentials)(w)
         }
         
        +// WithCredentials returns a ClientOption that authenticates API calls.
         func WithCredentials(creds *google.Credentials) ClientOption {
         	return (*withCreds)(creds)
         }
        diff --git a/vendor/google.golang.org/api/option/credentials_notgo19.go b/vendor/google.golang.org/api/option/credentials_notgo19.go
        index 90d229001..74d3a4b5b 100644
        --- a/vendor/google.golang.org/api/option/credentials_notgo19.go
        +++ b/vendor/google.golang.org/api/option/credentials_notgo19.go
        @@ -1,4 +1,4 @@
        -// Copyright 2018 Google Inc. All Rights Reserved.
        +// Copyright 2018 Google LLC
         //
         // Licensed under the Apache License, Version 2.0 (the "License");
         // you may not use this file except in compliance with the License.
        diff --git a/vendor/google.golang.org/api/option/option.go b/vendor/google.golang.org/api/option/option.go
        index ffbee3295..0a1c2dba9 100644
        --- a/vendor/google.golang.org/api/option/option.go
        +++ b/vendor/google.golang.org/api/option/option.go
        @@ -1,4 +1,4 @@
        -// Copyright 2017 Google Inc. All Rights Reserved.
        +// Copyright 2017 Google LLC
         //
         // Licensed under the Apache License, Version 2.0 (the "License");
         // you may not use this file except in compliance with the License.
        @@ -61,6 +61,20 @@ func WithServiceAccountFile(filename string) ClientOption {
         	return WithCredentialsFile(filename)
         }
         
        +// WithCredentialsJSON returns a ClientOption that authenticates
        +// API calls with the given service account or refresh token JSON
        +// credentials.
        +func WithCredentialsJSON(p []byte) ClientOption {
        +	return withCredentialsJSON(p)
        +}
        +
        +type withCredentialsJSON []byte
        +
        +func (w withCredentialsJSON) Apply(o *internal.DialSettings) {
        +	o.CredentialsJSON = make([]byte, len(w))
        +	copy(o.CredentialsJSON, w)
        +}
        +
         // WithEndpoint returns a ClientOption that overrides the default endpoint
         // to be used for a service.
         func WithEndpoint(url string) ClientOption {
        @@ -82,9 +96,8 @@ func WithScopes(scope ...string) ClientOption {
         type withScopes []string
         
         func (w withScopes) Apply(o *internal.DialSettings) {
        -	s := make([]string, len(w))
        -	copy(s, w)
        -	o.Scopes = s
        +	o.Scopes = make([]string, len(w))
        +	copy(o.Scopes, w)
         }
         
         // WithUserAgent returns a ClientOption that sets the User-Agent.
        @@ -153,6 +166,9 @@ func (w withGRPCConnectionPool) Apply(o *internal.DialSettings) {
         
         // WithAPIKey returns a ClientOption that specifies an API key to be used
         // as the basis for authentication.
        +//
        +// API Keys can only be used for JSON-over-HTTP APIs, including those under
        +// the import path google.golang.org/api/....
         func WithAPIKey(apiKey string) ClientOption {
         	return withAPIKey(apiKey)
         }
        @@ -161,6 +177,19 @@ type withAPIKey string
         
         func (w withAPIKey) Apply(o *internal.DialSettings) { o.APIKey = string(w) }
         
        +// WithAudiences returns a ClientOption that specifies an audience to be used
        +// as the audience field ("aud") for the JWT token authentication.
        +func WithAudiences(audience ...string) ClientOption {
        +	return withAudiences(audience)
        +}
        +
        +type withAudiences []string
        +
        +func (w withAudiences) Apply(o *internal.DialSettings) {
        +	o.Audiences = make([]string, len(w))
        +	copy(o.Audiences, w)
        +}
        +
         // WithoutAuthentication returns a ClientOption that specifies that no
         // authentication should be used. It is suitable only for testing and for
         // accessing public resources, like public Google Cloud Storage buckets.
        @@ -173,3 +202,34 @@ func WithoutAuthentication() ClientOption {
         type withoutAuthentication struct{}
         
         func (w withoutAuthentication) Apply(o *internal.DialSettings) { o.NoAuth = true }
        +
        +// WithQuotaProject returns a ClientOption that specifies the project used
        +// for quota and billing purposes.
        +//
        +// For more information please read:
        +// https://cloud.google.com/apis/docs/system-parameters
        +func WithQuotaProject(quotaProject string) ClientOption {
        +	return withQuotaProject(quotaProject)
        +}
        +
        +type withQuotaProject string
        +
        +func (w withQuotaProject) Apply(o *internal.DialSettings) {
        +	o.QuotaProject = string(w)
        +}
        +
        +// WithRequestReason returns a ClientOption that specifies a reason for
        +// making the request, which is intended to be recorded in audit logging.
        +// An example reason would be a support-case ticket number.
        +//
        +// For more information please read:
        +// https://cloud.google.com/apis/docs/system-parameters
        +func WithRequestReason(requestReason string) ClientOption {
        +	return withRequestReason(requestReason)
        +}
        +
        +type withRequestReason string
        +
        +func (w withRequestReason) Apply(o *internal.DialSettings) {
        +	o.RequestReason = string(w)
        +}
        diff --git a/vendor/google.golang.org/api/storage/v1/storage-api.json b/vendor/google.golang.org/api/storage/v1/storage-api.json
        index 2d23f028b..20b9699e9 100644
        --- a/vendor/google.golang.org/api/storage/v1/storage-api.json
        +++ b/vendor/google.golang.org/api/storage/v1/storage-api.json
        @@ -26,7 +26,7 @@
           "description": "Stores and retrieves potentially large, immutable data objects.",
           "discoveryVersion": "v1",
           "documentationLink": "https://developers.google.com/storage/docs/json_api/",
        -  "etag": "\"-iA1DTNe4s-I6JZXPt1t1Ypy8IU/nD7tyZqYOGFELa4QRBOZJ8raFKA\"",
        +  "etag": "\"VPK3KBfpaEgZ16pozGOoMYfKc0U/p_spPkWHsRi33PRBHlYtU2G_uKg\"",
           "icons": {
             "x16": "https://www.google.com/images/icons/product/cloud_storage-16.png",
             "x32": "https://www.google.com/images/icons/product/cloud_storage-32.png"
        @@ -74,12 +74,12 @@
               "type": "boolean"
             },
             "quotaUser": {
        -      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.",
        +      "description": "An opaque string that represents a user for quota purposes. Must not exceed 40 characters.",
               "location": "query",
               "type": "string"
             },
             "userIp": {
        -      "description": "IP address of the site where the request originates. Use this if you want to enforce per-user limits.",
        +      "description": "Deprecated. Please use quotaUser instead.",
               "location": "query",
               "type": "string"
             }
        @@ -109,6 +109,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -142,6 +147,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -171,6 +181,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -203,6 +218,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -239,6 +259,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -278,6 +303,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -326,6 +356,11 @@
                       "location": "query",
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -378,6 +413,11 @@
                       "location": "query",
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -410,6 +450,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -422,10 +467,7 @@
                   },
                   "scopes": [
                     "https://www.googleapis.com/auth/cloud-platform",
        -            "https://www.googleapis.com/auth/cloud-platform.read-only",
        -            "https://www.googleapis.com/auth/devstorage.full_control",
        -            "https://www.googleapis.com/auth/devstorage.read_only",
        -            "https://www.googleapis.com/auth/devstorage.read_write"
        +            "https://www.googleapis.com/auth/devstorage.full_control"
                   ]
                 },
                 "insert": {
        @@ -495,6 +537,11 @@
                       "location": "query",
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request.",
                       "location": "query",
        @@ -559,6 +606,11 @@
                       "location": "query",
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request.",
                       "location": "query",
        @@ -599,6 +651,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -616,7 +673,7 @@
                   ]
                 },
                 "patch": {
        -          "description": "Updates a bucket. Changes to the bucket will be readable immediately after writing, but configuration changes may take time to propagate. This method supports patch semantics.",
        +          "description": "Patches a bucket. Changes to the bucket will be readable immediately after writing, but configuration changes may take time to propagate.",
                   "httpMethod": "PATCH",
                   "id": "storage.buckets.patch",
                   "parameterOrder": [
        @@ -694,6 +751,11 @@
                       "location": "query",
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -726,6 +788,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -741,8 +808,7 @@
                   },
                   "scopes": [
                     "https://www.googleapis.com/auth/cloud-platform",
        -            "https://www.googleapis.com/auth/devstorage.full_control",
        -            "https://www.googleapis.com/auth/devstorage.read_write"
        +            "https://www.googleapis.com/auth/devstorage.full_control"
                   ]
                 },
                 "testIamPermissions": {
        @@ -767,6 +833,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -864,6 +935,11 @@
                       "location": "query",
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -928,6 +1004,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -961,6 +1042,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -990,6 +1076,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -1034,6 +1125,11 @@
                       "location": "query",
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -1070,6 +1166,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -1109,6 +1210,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -1152,6 +1258,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -1186,6 +1297,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -1218,6 +1334,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -1251,6 +1372,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -1307,6 +1433,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -1353,6 +1484,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -1395,6 +1531,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -1440,6 +1581,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -1489,6 +1635,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -1541,6 +1692,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -1573,7 +1729,7 @@
                   ],
                   "parameters": {
                     "destinationBucket": {
        -              "description": "Name of the bucket in which to store the new object.",
        +              "description": "Name of the bucket containing the source objects. The destination object is stored in this bucket.",
                       "location": "path",
                       "required": true,
                       "type": "string"
        @@ -1622,6 +1778,11 @@
                       "location": "query",
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -1746,6 +1907,11 @@
                       "location": "query",
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "sourceBucket": {
                       "description": "Name of the bucket in which to find the source object.",
                       "location": "path",
        @@ -1834,6 +2000,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -1911,6 +2082,11 @@
                       "location": "query",
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -1958,6 +2134,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -2035,7 +2216,7 @@
                       "type": "string"
                     },
                     "kmsKeyName": {
        -              "description": "Resource name of the Cloud KMS key, of the form projects/my-project/locations/global/keyRings/my-kr/cryptoKeys/my-key, that will be used to encrypt the object. Overrides the object metadata's kms_key_name value, if any. Limited availability; usable only by enabled projects.",
        +              "description": "Resource name of the Cloud KMS key, of the form projects/my-project/locations/global/keyRings/my-kr/cryptoKeys/my-key, that will be used to encrypt the object. Overrides the object metadata's kms_key_name value, if any.",
                       "location": "query",
                       "type": "string"
                     },
        @@ -2078,6 +2259,11 @@
                       "location": "query",
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -2117,6 +2303,11 @@
                       "location": "query",
                       "type": "string"
                     },
        +            "includeTrailingDelimiter": {
        +              "description": "If true, objects that end in exactly one instance of delimiter will have their metadata included in items in addition to prefixes.",
        +              "location": "query",
        +              "type": "boolean"
        +            },
                     "maxResults": {
                       "default": "1000",
                       "description": "Maximum number of items plus prefixes to return in a single page of responses. As duplicate prefixes are omitted, fewer total results may be returned than requested. The service will use this parameter or 1,000 items, whichever is smaller.",
        @@ -2148,6 +2339,11 @@
                       "location": "query",
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -2257,6 +2453,11 @@
                       "location": "query",
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request, for Requester Pays buckets.",
                       "location": "query",
        @@ -2391,6 +2592,11 @@
                       "location": "query",
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "rewriteToken": {
                       "description": "Include this field (from the previous rewrite response) on each rewrite request after the first one, until the rewrite response 'done' flag is true. Calls that provide a rewriteToken can omit all other request fields, but if included those fields must match the values provided in the first rewrite request.",
                       "location": "query",
        @@ -2460,6 +2666,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -2514,6 +2725,11 @@
                       "required": true,
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -2617,6 +2833,11 @@
                       "location": "query",
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -2654,6 +2875,11 @@
                       "location": "query",
                       "type": "string"
                     },
        +            "includeTrailingDelimiter": {
        +              "description": "If true, objects that end in exactly one instance of delimiter will have their metadata included in items in addition to prefixes.",
        +              "location": "query",
        +              "type": "boolean"
        +            },
                     "maxResults": {
                       "default": "1000",
                       "description": "Maximum number of items plus prefixes to return in a single page of responses. As duplicate prefixes are omitted, fewer total results may be returned than requested. The service will use this parameter or 1,000 items, whichever is smaller.",
        @@ -2685,6 +2911,11 @@
                       "location": "query",
                       "type": "string"
                     },
        +            "provisionalUserProject": {
        +              "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +              "location": "query",
        +              "type": "string"
        +            },
                     "userProject": {
                       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
                       "location": "query",
        @@ -2717,6 +2948,210 @@
             },
             "projects": {
               "resources": {
        +        "hmacKeys": {
        +          "methods": {
        +            "create": {
        +              "description": "Creates a new HMAC key for the specified service account.",
        +              "httpMethod": "POST",
        +              "id": "storage.projects.hmacKeys.create",
        +              "parameterOrder": [
        +                "projectId",
        +                "serviceAccountEmail"
        +              ],
        +              "parameters": {
        +                "projectId": {
        +                  "description": "Project ID owning the service account.",
        +                  "location": "path",
        +                  "required": true,
        +                  "type": "string"
        +                },
        +                "serviceAccountEmail": {
        +                  "description": "Email address of the service account.",
        +                  "location": "query",
        +                  "required": true,
        +                  "type": "string"
        +                },
        +                "userProject": {
        +                  "description": "The project to be billed for this request.",
        +                  "location": "query",
        +                  "type": "string"
        +                }
        +              },
        +              "path": "projects/{projectId}/hmacKeys",
        +              "response": {
        +                "$ref": "HmacKey"
        +              },
        +              "scopes": [
        +                "https://www.googleapis.com/auth/cloud-platform",
        +                "https://www.googleapis.com/auth/devstorage.full_control"
        +              ]
        +            },
        +            "delete": {
        +              "description": "Deletes an HMAC key.",
        +              "httpMethod": "DELETE",
        +              "id": "storage.projects.hmacKeys.delete",
        +              "parameterOrder": [
        +                "projectId",
        +                "accessId"
        +              ],
        +              "parameters": {
        +                "accessId": {
        +                  "description": "Name of the HMAC key to be deleted.",
        +                  "location": "path",
        +                  "required": true,
        +                  "type": "string"
        +                },
        +                "projectId": {
        +                  "description": "Project ID owning the requested key",
        +                  "location": "path",
        +                  "required": true,
        +                  "type": "string"
        +                },
        +                "userProject": {
        +                  "description": "The project to be billed for this request.",
        +                  "location": "query",
        +                  "type": "string"
        +                }
        +              },
        +              "path": "projects/{projectId}/hmacKeys/{accessId}",
        +              "scopes": [
        +                "https://www.googleapis.com/auth/cloud-platform",
        +                "https://www.googleapis.com/auth/devstorage.full_control",
        +                "https://www.googleapis.com/auth/devstorage.read_write"
        +              ]
        +            },
        +            "get": {
        +              "description": "Retrieves an HMAC key's metadata",
        +              "httpMethod": "GET",
        +              "id": "storage.projects.hmacKeys.get",
        +              "parameterOrder": [
        +                "projectId",
        +                "accessId"
        +              ],
        +              "parameters": {
        +                "accessId": {
        +                  "description": "Name of the HMAC key.",
        +                  "location": "path",
        +                  "required": true,
        +                  "type": "string"
        +                },
        +                "projectId": {
        +                  "description": "Project ID owning the service account of the requested key.",
        +                  "location": "path",
        +                  "required": true,
        +                  "type": "string"
        +                },
        +                "userProject": {
        +                  "description": "The project to be billed for this request.",
        +                  "location": "query",
        +                  "type": "string"
        +                }
        +              },
        +              "path": "projects/{projectId}/hmacKeys/{accessId}",
        +              "response": {
        +                "$ref": "HmacKeyMetadata"
        +              },
        +              "scopes": [
        +                "https://www.googleapis.com/auth/cloud-platform",
        +                "https://www.googleapis.com/auth/cloud-platform.read-only",
        +                "https://www.googleapis.com/auth/devstorage.read_only"
        +              ]
        +            },
        +            "list": {
        +              "description": "Retrieves a list of HMAC keys matching the criteria.",
        +              "httpMethod": "GET",
        +              "id": "storage.projects.hmacKeys.list",
        +              "parameterOrder": [
        +                "projectId"
        +              ],
        +              "parameters": {
        +                "maxResults": {
        +                  "default": "250",
        +                  "description": "Maximum number of items to return in a single page of responses. The service uses this parameter or 250 items, whichever is smaller. The max number of items per page will also be limited by the number of distinct service accounts in the response. If the number of service accounts in a single response is too high, the page will truncated and a next page token will be returned.",
        +                  "format": "uint32",
        +                  "location": "query",
        +                  "minimum": "0",
        +                  "type": "integer"
        +                },
        +                "pageToken": {
        +                  "description": "A previously-returned page token representing part of the larger set of results to view.",
        +                  "location": "query",
        +                  "type": "string"
        +                },
        +                "projectId": {
        +                  "description": "Name of the project in which to look for HMAC keys.",
        +                  "location": "path",
        +                  "required": true,
        +                  "type": "string"
        +                },
        +                "serviceAccountEmail": {
        +                  "description": "If present, only keys for the given service account are returned.",
        +                  "location": "query",
        +                  "type": "string"
        +                },
        +                "showDeletedKeys": {
        +                  "description": "Whether or not to show keys in the DELETED state.",
        +                  "location": "query",
        +                  "type": "boolean"
        +                },
        +                "userProject": {
        +                  "description": "The project to be billed for this request.",
        +                  "location": "query",
        +                  "type": "string"
        +                }
        +              },
        +              "path": "projects/{projectId}/hmacKeys",
        +              "response": {
        +                "$ref": "HmacKeysMetadata"
        +              },
        +              "scopes": [
        +                "https://www.googleapis.com/auth/cloud-platform",
        +                "https://www.googleapis.com/auth/cloud-platform.read-only",
        +                "https://www.googleapis.com/auth/devstorage.full_control",
        +                "https://www.googleapis.com/auth/devstorage.read_only"
        +              ]
        +            },
        +            "update": {
        +              "description": "Updates the state of an HMAC key. See the HMAC Key resource descriptor for valid states.",
        +              "httpMethod": "PUT",
        +              "id": "storage.projects.hmacKeys.update",
        +              "parameterOrder": [
        +                "projectId",
        +                "accessId"
        +              ],
        +              "parameters": {
        +                "accessId": {
        +                  "description": "Name of the HMAC key being updated.",
        +                  "location": "path",
        +                  "required": true,
        +                  "type": "string"
        +                },
        +                "projectId": {
        +                  "description": "Project ID owning the service account of the updated key.",
        +                  "location": "path",
        +                  "required": true,
        +                  "type": "string"
        +                },
        +                "userProject": {
        +                  "description": "The project to be billed for this request.",
        +                  "location": "query",
        +                  "type": "string"
        +                }
        +              },
        +              "path": "projects/{projectId}/hmacKeys/{accessId}",
        +              "request": {
        +                "$ref": "HmacKeyMetadata"
        +              },
        +              "response": {
        +                "$ref": "HmacKeyMetadata"
        +              },
        +              "scopes": [
        +                "https://www.googleapis.com/auth/cloud-platform",
        +                "https://www.googleapis.com/auth/devstorage.full_control"
        +              ]
        +            }
        +          }
        +        },
                 "serviceAccount": {
                   "methods": {
                     "get": {
        @@ -2733,6 +3168,11 @@
                           "required": true,
                           "type": "string"
                         },
        +                "provisionalUserProject": {
        +                  "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +                  "location": "query",
        +                  "type": "string"
        +                },
                         "userProject": {
                           "description": "The project to be billed for this request.",
                           "location": "query",
        @@ -2756,7 +3196,7 @@
               }
             }
           },
        -  "revision": "20180305",
        +  "revision": "20190426",
           "rootUrl": "https://www.googleapis.com/",
           "schemas": {
             "Bucket": {
        @@ -2821,7 +3261,7 @@
                   "type": "array"
                 },
                 "defaultEventBasedHold": {
        -          "description": "Defines the default value for Event-Based hold on newly created objects in this bucket. Event-Based hold is a way to retain objects indefinitely until an event occurs, signified by the hold's release. After being released, such objects will be subject to bucket-level retention (if any). One sample use case of this flag is for banks to hold loan documents for at least 3 years after loan is paid in full. Here bucket-level retention is 3 years and the event is loan being paid in full. In this example these objects will be held intact for any number of years until the event has occurred (hold is released) and then 3 more years after that. Objects under Event-Based hold cannot be deleted, overwritten or archived until the hold is removed.",
        +          "description": "The default value for event-based hold on newly created objects in this bucket. Event-based hold is a way to retain objects indefinitely until an event occurs, signified by the hold's release. After being released, such objects will be subject to bucket-level retention (if any). One sample use case of this flag is for banks to hold loan documents for at least 3 years after loan is paid in full. Here, bucket-level retention is 3 years and the event is loan being paid in full. In this example, these objects will be held intact for any number of years until the event has occurred (event-based hold on the object is released) and then 3 more years after that. That means retention duration of the objects begins from the moment event-based hold transitioned from true to false. Objects under event-based hold cannot be deleted, overwritten or archived until the hold is removed.",
                   "type": "boolean"
                 },
                 "defaultObjectAcl": {
        @@ -2832,10 +3272,10 @@
                   "type": "array"
                 },
                 "encryption": {
        -          "description": "Encryption configuration used by default for newly inserted objects, when no encryption config is specified.",
        +          "description": "Encryption configuration for a bucket.",
                   "properties": {
                     "defaultKmsKeyName": {
        -              "description": "A Cloud KMS key that will be used to encrypt objects inserted into this bucket, if no encryption method is specified. Limited availability; usable only by enabled projects.",
        +              "description": "A Cloud KMS key that will be used to encrypt objects inserted into this bucket, if no encryption method is specified.",
                       "type": "string"
                     }
                   },
        @@ -2845,6 +3285,27 @@
                   "description": "HTTP 1.1 Entity tag for the bucket.",
                   "type": "string"
                 },
        +        "iamConfiguration": {
        +          "description": "The bucket's IAM configuration.",
        +          "properties": {
        +            "bucketPolicyOnly": {
        +              "description": "The bucket's Bucket Policy Only configuration.",
        +              "properties": {
        +                "enabled": {
        +                  "description": "If set, access checks only use bucket-level IAM policies or above.",
        +                  "type": "boolean"
        +                },
        +                "lockedTime": {
        +                  "description": "The deadline time for changing iamConfiguration.bucketPolicyOnly.enabled from true to false in RFC 3339 format. iamConfiguration.bucketPolicyOnly.enabled may be changed from true to false until the locked time, after which the field is immutable.",
        +                  "format": "date-time",
        +                  "type": "string"
        +                }
        +              },
        +              "type": "object"
        +            }
        +          },
        +          "type": "object"
        +        },
                 "id": {
                   "description": "The ID of the bucket. For buckets, the id and name properties are the same.",
                   "type": "string"
        @@ -2900,6 +3361,10 @@
                                 "description": "Relevant only for versioned objects. If the value is true, this condition matches live objects; if the value is false, it matches archived objects.",
                                 "type": "boolean"
                               },
        +                      "matchesPattern": {
        +                        "description": "A regular expression that satisfies the RE2 syntax. This condition is satisfied when the name of the object matches the RE2 pattern. Note: This feature is currently in the \"Early Access\" launch stage and is only available to a whitelisted set of users; that means that this feature may be changed in backward-incompatible ways and that it is not guaranteed to be released.",
        +                        "type": "string"
        +                      },
                               "matchesStorageClass": {
                                 "description": "Objects having any of the storage classes specified by this condition will be matched. Values include MULTI_REGIONAL, REGIONAL, NEARLINE, COLDLINE, STANDARD, and DURABLE_REDUCED_AVAILABILITY.",
                                 "items": {
        @@ -2927,6 +3392,10 @@
                   "description": "The location of the bucket. Object data for objects in the bucket resides in physical storage within this region. Defaults to US. See the developer's guide for the authoritative list.",
                   "type": "string"
                 },
        +        "locationType": {
        +          "description": "The type of the bucket location.",
        +          "type": "string"
        +        },
                 "logging": {
                   "description": "The bucket's logging configuration, which defines the destination bucket and optional name prefix for the current bucket's logs.",
                   "properties": {
        @@ -2975,10 +3444,10 @@
                   "type": "string"
                 },
                 "retentionPolicy": {
        -          "description": "Defines the retention policy for a bucket. The Retention policy enforces a minimum retention time for all objects contained in the bucket, based on their creation time. Any attempt to overwrite or delete objects younger than the retention period will result in a PERMISSION_DENIED error. An unlocked retention policy can be modified or removed from the bucket via the UpdateBucketMetadata RPC. A locked retention policy cannot be removed or shortened in duration for the lifetime of the bucket. Attempting to remove or decrease period of a locked retention policy will result in a PERMISSION_DENIED error.",
        +          "description": "The bucket's retention policy. The retention policy enforces a minimum retention time for all objects contained in the bucket, based on their creation time. Any attempt to overwrite or delete objects younger than the retention period will result in a PERMISSION_DENIED error. An unlocked retention policy can be modified or removed from the bucket via a storage.buckets.update operation. A locked retention policy cannot be removed or shortened in duration for the lifetime of the bucket. Attempting to remove or decrease period of a locked retention policy will result in a PERMISSION_DENIED error.",
                   "properties": {
                     "effectiveTime": {
        -              "description": "The time from which policy was enforced and effective. RFC 3339 format.",
        +              "description": "Server-determined value that indicates the time from which policy was enforced and effective. This value is in RFC 3339 format.",
                       "format": "date-time",
                       "type": "string"
                     },
        @@ -2987,7 +3456,7 @@
                       "type": "boolean"
                     },
                     "retentionPeriod": {
        -              "description": "Specifies the duration that objects need to be retained. Retention duration must be greater than zero and less than 100 years. Note that enforcement of retention periods less than a day is not guaranteed. Such periods should only be used for testing purposes.",
        +              "description": "The duration in seconds that objects need to be retained. Retention duration must be greater than zero and less than 100 years. Note that enforcement of retention periods less than a day is not guaranteed. Such periods should only be used for testing purposes.",
                       "format": "int64",
                       "type": "string"
                     }
        @@ -3239,7 +3708,7 @@
                             "storage.objects.compose"
                           ]
                         },
        -                "description": "The source object's name. The source object's bucket is implicitly the destination bucket.",
        +                "description": "The source object's name. All source objects must reside in the same bucket.",
                         "type": "string"
                       },
                       "objectPreconditions": {
        @@ -3261,6 +3730,127 @@
               },
               "type": "object"
             },
        +    "Expr": {
        +      "description": "Represents an expression text. Example: title: \"User account presence\" description: \"Determines whether the request has a user account\" expression: \"size(request.user) \u003e 0\"",
        +      "id": "Expr",
        +      "properties": {
        +        "description": {
        +          "description": "An optional description of the expression. This is a longer text which describes the expression, e.g. when hovered over it in a UI.",
        +          "type": "string"
        +        },
        +        "expression": {
        +          "description": "Textual representation of an expression in Common Expression Language syntax. The application context of the containing message determines which well-known feature set of CEL is supported.",
        +          "type": "string"
        +        },
        +        "kind": {
        +          "default": "storage#expr",
        +          "description": "The kind of item this is. For storage, this is always storage#expr. This field is ignored on input.",
        +          "type": "string"
        +        },
        +        "location": {
        +          "description": "An optional string indicating the location of the expression for error reporting, e.g. a file name and a position in the file.",
        +          "type": "string"
        +        },
        +        "title": {
        +          "description": "An optional title for the expression, i.e. a short string describing its purpose. This can be used e.g. in UIs which allow to enter the expression.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "HmacKey": {
        +      "description": "JSON template to produce a JSON-style HMAC Key resource for Create responses.",
        +      "id": "HmacKey",
        +      "properties": {
        +        "kind": {
        +          "default": "storage#hmacKey",
        +          "description": "The kind of item this is. For HMAC keys, this is always storage#hmacKey.",
        +          "type": "string"
        +        },
        +        "metadata": {
        +          "$ref": "HmacKeyMetadata",
        +          "description": "Key metadata."
        +        },
        +        "secret": {
        +          "description": "HMAC secret key material.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "HmacKeyMetadata": {
        +      "description": "JSON template to produce a JSON-style HMAC Key metadata resource.",
        +      "id": "HmacKeyMetadata",
        +      "properties": {
        +        "accessId": {
        +          "description": "The ID of the HMAC Key.",
        +          "type": "string"
        +        },
        +        "etag": {
        +          "description": "HTTP 1.1 Entity tag for the HMAC key.",
        +          "type": "string"
        +        },
        +        "id": {
        +          "description": "The ID of the HMAC key, including the Project ID and the Access ID.",
        +          "type": "string"
        +        },
        +        "kind": {
        +          "default": "storage#hmacKeyMetadata",
        +          "description": "The kind of item this is. For HMAC Key metadata, this is always storage#hmacKeyMetadata.",
        +          "type": "string"
        +        },
        +        "projectId": {
        +          "description": "Project ID owning the service account to which the key authenticates.",
        +          "type": "string"
        +        },
        +        "selfLink": {
        +          "description": "The link to this resource.",
        +          "type": "string"
        +        },
        +        "serviceAccountEmail": {
        +          "description": "The email address of the key's associated service account.",
        +          "type": "string"
        +        },
        +        "state": {
        +          "description": "The state of the key. Can be one of ACTIVE, INACTIVE, or DELETED.",
        +          "type": "string"
        +        },
        +        "timeCreated": {
        +          "description": "The creation time of the HMAC key in RFC 3339 format.",
        +          "format": "date-time",
        +          "type": "string"
        +        },
        +        "updated": {
        +          "description": "The last modification time of the HMAC key metadata in RFC 3339 format.",
        +          "format": "date-time",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "HmacKeysMetadata": {
        +      "description": "A list of hmacKeys.",
        +      "id": "HmacKeysMetadata",
        +      "properties": {
        +        "items": {
        +          "description": "The list of items.",
        +          "items": {
        +            "$ref": "HmacKeyMetadata"
        +          },
        +          "type": "array"
        +        },
        +        "kind": {
        +          "default": "storage#hmacKeysMetadata",
        +          "description": "The kind of item this is. For lists of hmacKeys, this is always storage#hmacKeysMetadata.",
        +          "type": "string"
        +        },
        +        "nextPageToken": {
        +          "description": "The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
             "Notification": {
               "description": "A subscription to receive Google PubSub notifications.",
               "id": "Notification",
        @@ -3409,7 +3999,7 @@
                   "type": "string"
                 },
                 "eventBasedHold": {
        -          "description": "Defines the Event-Based hold for an object. Event-Based hold is a way to retain objects indefinitely until an event occurs, signified by the hold's release. After being released, such objects will be subject to bucket-level retention (if any). One sample use case of this flag is for banks to hold loan documents for at least 3 years after loan is paid in full. Here bucket-level retention is 3 years and the event is loan being paid in full. In this example these objects will be held intact for any number of years until the event has occurred (hold is released) and then 3 more years after that.",
        +          "description": "Whether an object is under event-based hold. Event-based hold is a way to retain objects until an event occurs, which is signified by the hold's release (i.e. this value is set to false). After being released (set to false), such objects will be subject to bucket-level retention (if any). One sample use case of this flag is for banks to hold loan documents for at least 3 years after loan is paid in full. Here, bucket-level retention is 3 years and the event is the loan being paid in full. In this example, these objects will be held intact for any number of years until the event has occurred (event-based hold on the object is released) and then 3 more years after that. That means retention duration of the objects begins from the moment event-based hold transitioned from true to false.",
                   "type": "boolean"
                 },
                 "generation": {
        @@ -3427,7 +4017,7 @@
                   "type": "string"
                 },
                 "kmsKeyName": {
        -          "description": "Cloud KMS Key used to encrypt this object, if the object is encrypted by such a key. Limited availability; usable only by enabled projects.",
        +          "description": "Cloud KMS Key used to encrypt this object, if the object is encrypted by such a key.",
                   "type": "string"
                 },
                 "md5Hash": {
        @@ -3470,7 +4060,7 @@
                   "type": "object"
                 },
                 "retentionExpirationTime": {
        -          "description": "Specifies the earliest time that the object's retention period expires. This value is server-determined and is in RFC 3339 format. Note 1: This field is not provided for objects with an active Event-Based hold, since retention expiration is unknown until the hold is removed. Note 2: This value can be provided even when TemporaryHold is set (so that the user can reason about policy without having to first unset the TemporaryHold).",
        +          "description": "A server-determined value that specifies the earliest time that the object's retention period expires. This value is in RFC 3339 format. Note 1: This field is not provided for objects with an active event-based hold, since retention expiration is unknown until the hold is removed. Note 2: This value can be provided even when temporary hold is set (so that the user can reason about policy without having to first unset the temporary hold).",
                   "format": "date-time",
                   "type": "string"
                 },
        @@ -3488,7 +4078,7 @@
                   "type": "string"
                 },
                 "temporaryHold": {
        -          "description": "Defines the temporary hold for an object. This flag is used to enforce a temporary hold on an object. While it is set to true, the object is protected against deletion and overwrites. A common use case of this flag is regulatory investigations where objects need to be retained while the investigation is ongoing.",
        +          "description": "Whether an object is under temporary hold. While this flag is set to true, the object is protected against deletion and overwrites. A common use case of this flag is regulatory investigations where objects need to be retained while the investigation is ongoing. Note that unlike event-based hold, temporary hold does not impact retention expiration time of an object.",
                   "type": "boolean"
                 },
                 "timeCreated": {
        @@ -3661,7 +4251,8 @@
                   "items": {
                     "properties": {
                       "condition": {
        -                "type": "any"
        +                "$ref": "Expr",
        +                "description": "The condition that is associated with this binding. NOTE: an unsatisfied condition will not allow user access via current binding. Different bindings, including their conditions, are examined independently."
                       },
                       "members": {
                         "annotations": {
        diff --git a/vendor/google.golang.org/api/storage/v1/storage-gen.go b/vendor/google.golang.org/api/storage/v1/storage-gen.go
        index 36846eb54..9924efb86 100644
        --- a/vendor/google.golang.org/api/storage/v1/storage-gen.go
        +++ b/vendor/google.golang.org/api/storage/v1/storage-gen.go
        @@ -1,28 +1,64 @@
        +// Copyright 2019 Google LLC.
        +// Use of this source code is governed by a BSD-style
        +// license that can be found in the LICENSE file.
        +
        +// Code generated file. DO NOT EDIT.
        +
         // Package storage provides access to the Cloud Storage JSON API.
         //
        -// See https://developers.google.com/storage/docs/json_api/
        +// This package is DEPRECATED. Use package cloud.google.com/go/storage instead.
        +//
        +// For product documentation, see: https://developers.google.com/storage/docs/json_api/
        +//
        +// Creating a client
         //
         // Usage example:
         //
         //   import "google.golang.org/api/storage/v1"
         //   ...
        -//   storageService, err := storage.New(oauthHttpClient)
        +//   ctx := context.Background()
        +//   storageService, err := storage.NewService(ctx)
        +//
        +// In this example, Google Application Default Credentials are used for authentication.
        +//
        +// For information on how to create and obtain Application Default Credentials, see https://developers.google.com/identity/protocols/application-default-credentials.
        +//
        +// Other authentication options
        +//
        +// By default, all available scopes (see "Constants") are used to authenticate. To restrict scopes, use option.WithScopes:
        +//
        +//   storageService, err := storage.NewService(ctx, option.WithScopes(storage.DevstorageReadWriteScope))
        +//
        +// To use an API key for authentication (note: some APIs do not support API keys), use option.WithAPIKey:
        +//
        +//   storageService, err := storage.NewService(ctx, option.WithAPIKey("AIza..."))
        +//
        +// To use an OAuth token (e.g., a user token obtained via a three-legged OAuth flow), use option.WithTokenSource:
        +//
        +//   config := &oauth2.Config{...}
        +//   // ...
        +//   token, err := config.Exchange(ctx, ...)
        +//   storageService, err := storage.NewService(ctx, option.WithTokenSource(config.TokenSource(ctx, token)))
        +//
        +// See https://godoc.org/google.golang.org/api/option/ for details on options.
         package storage // import "google.golang.org/api/storage/v1"
         
         import (
         	"bytes"
        +	"context"
         	"encoding/json"
         	"errors"
         	"fmt"
        -	context "golang.org/x/net/context"
        -	ctxhttp "golang.org/x/net/context/ctxhttp"
        -	gensupport "google.golang.org/api/gensupport"
        -	googleapi "google.golang.org/api/googleapi"
         	"io"
         	"net/http"
         	"net/url"
         	"strconv"
         	"strings"
        +
        +	gensupport "google.golang.org/api/gensupport"
        +	googleapi "google.golang.org/api/googleapi"
        +	option "google.golang.org/api/option"
        +	htransport "google.golang.org/api/transport/http"
         )
         
         // Always reference these packages, just in case the auto-generated code
        @@ -38,7 +74,6 @@ var _ = googleapi.Version
         var _ = errors.New
         var _ = strings.Replace
         var _ = context.Canceled
        -var _ = ctxhttp.Do
         
         const apiId = "storage:v1"
         const apiName = "storage"
        @@ -63,6 +98,36 @@ const (
         	DevstorageReadWriteScope = "https://www.googleapis.com/auth/devstorage.read_write"
         )
         
        +// NewService creates a new Service.
        +func NewService(ctx context.Context, opts ...option.ClientOption) (*Service, error) {
        +	scopesOption := option.WithScopes(
        +		"https://www.googleapis.com/auth/cloud-platform",
        +		"https://www.googleapis.com/auth/cloud-platform.read-only",
        +		"https://www.googleapis.com/auth/devstorage.full_control",
        +		"https://www.googleapis.com/auth/devstorage.read_only",
        +		"https://www.googleapis.com/auth/devstorage.read_write",
        +	)
        +	// NOTE: prepend, so we don't override user-specified scopes.
        +	opts = append([]option.ClientOption{scopesOption}, opts...)
        +	client, endpoint, err := htransport.NewClient(ctx, opts...)
        +	if err != nil {
        +		return nil, err
        +	}
        +	s, err := New(client)
        +	if err != nil {
        +		return nil, err
        +	}
        +	if endpoint != "" {
        +		s.BasePath = endpoint
        +	}
        +	return s, nil
        +}
        +
        +// New creates a new Service. It uses the provided http.Client for requests.
        +//
        +// Deprecated: please use NewService instead.
        +// To provide a custom HTTP client, use option.WithHTTPClient.
        +// If you are using google.golang.org/api/googleapis/transport.APIKey, use option.WithAPIKey with NewService instead.
         func New(client *http.Client) (*Service, error) {
         	if client == nil {
         		return nil, errors.New("client is nil")
        @@ -173,6 +238,7 @@ type ObjectsService struct {
         
         func NewProjectsService(s *Service) *ProjectsService {
         	rs := &ProjectsService{s: s}
        +	rs.HmacKeys = NewProjectsHmacKeysService(s)
         	rs.ServiceAccount = NewProjectsServiceAccountService(s)
         	return rs
         }
        @@ -180,9 +246,20 @@ func NewProjectsService(s *Service) *ProjectsService {
         type ProjectsService struct {
         	s *Service
         
        +	HmacKeys *ProjectsHmacKeysService
        +
         	ServiceAccount *ProjectsServiceAccountService
         }
         
        +func NewProjectsHmacKeysService(s *Service) *ProjectsHmacKeysService {
        +	rs := &ProjectsHmacKeysService{s: s}
        +	return rs
        +}
        +
        +type ProjectsHmacKeysService struct {
        +	s *Service
        +}
        +
         func NewProjectsServiceAccountService(s *Service) *ProjectsServiceAccountService {
         	rs := &ProjectsServiceAccountService{s: s}
         	return rs
        @@ -204,31 +281,35 @@ type Bucket struct {
         	// configuration.
         	Cors []*BucketCors `json:"cors,omitempty"`
         
        -	// DefaultEventBasedHold: Defines the default value for Event-Based hold
        -	// on newly created objects in this bucket. Event-Based hold is a way to
        +	// DefaultEventBasedHold: The default value for event-based hold on
        +	// newly created objects in this bucket. Event-based hold is a way to
         	// retain objects indefinitely until an event occurs, signified by the
         	// hold's release. After being released, such objects will be subject to
         	// bucket-level retention (if any). One sample use case of this flag is
         	// for banks to hold loan documents for at least 3 years after loan is
        -	// paid in full. Here bucket-level retention is 3 years and the event is
        -	// loan being paid in full. In this example these objects will be held
        -	// intact for any number of years until the event has occurred (hold is
        -	// released) and then 3 more years after that. Objects under Event-Based
        -	// hold cannot be deleted, overwritten or archived until the hold is
        -	// removed.
        +	// paid in full. Here, bucket-level retention is 3 years and the event
        +	// is loan being paid in full. In this example, these objects will be
        +	// held intact for any number of years until the event has occurred
        +	// (event-based hold on the object is released) and then 3 more years
        +	// after that. That means retention duration of the objects begins from
        +	// the moment event-based hold transitioned from true to false. Objects
        +	// under event-based hold cannot be deleted, overwritten or archived
        +	// until the hold is removed.
         	DefaultEventBasedHold bool `json:"defaultEventBasedHold,omitempty"`
         
         	// DefaultObjectAcl: Default access controls to apply to new objects
         	// when no ACL is provided.
         	DefaultObjectAcl []*ObjectAccessControl `json:"defaultObjectAcl,omitempty"`
         
        -	// Encryption: Encryption configuration used by default for newly
        -	// inserted objects, when no encryption config is specified.
        +	// Encryption: Encryption configuration for a bucket.
         	Encryption *BucketEncryption `json:"encryption,omitempty"`
         
         	// Etag: HTTP 1.1 Entity tag for the bucket.
         	Etag string `json:"etag,omitempty"`
         
        +	// IamConfiguration: The bucket's IAM configuration.
        +	IamConfiguration *BucketIamConfiguration `json:"iamConfiguration,omitempty"`
        +
         	// Id: The ID of the bucket. For buckets, the id and name properties are
         	// the same.
         	Id string `json:"id,omitempty"`
        @@ -249,6 +330,9 @@ type Bucket struct {
         	// US. See the developer's guide for the authoritative list.
         	Location string `json:"location,omitempty"`
         
        +	// LocationType: The type of the bucket location.
        +	LocationType string `json:"locationType,omitempty"`
        +
         	// Logging: The bucket's logging configuration, which defines the
         	// destination bucket and optional name prefix for the current bucket's
         	// logs.
        @@ -268,15 +352,15 @@ type Bucket struct {
         	// to.
         	ProjectNumber uint64 `json:"projectNumber,omitempty,string"`
         
        -	// RetentionPolicy: Defines the retention policy for a bucket. The
        -	// Retention policy enforces a minimum retention time for all objects
        -	// contained in the bucket, based on their creation time. Any attempt to
        -	// overwrite or delete objects younger than the retention period will
        -	// result in a PERMISSION_DENIED error. An unlocked retention policy can
        -	// be modified or removed from the bucket via the UpdateBucketMetadata
        -	// RPC. A locked retention policy cannot be removed or shortened in
        -	// duration for the lifetime of the bucket. Attempting to remove or
        -	// decrease period of a locked retention policy will result in a
        +	// RetentionPolicy: The bucket's retention policy. The retention policy
        +	// enforces a minimum retention time for all objects contained in the
        +	// bucket, based on their creation time. Any attempt to overwrite or
        +	// delete objects younger than the retention period will result in a
        +	// PERMISSION_DENIED error. An unlocked retention policy can be modified
        +	// or removed from the bucket via a storage.buckets.update operation. A
        +	// locked retention policy cannot be removed or shortened in duration
        +	// for the lifetime of the bucket. Attempting to remove or decrease
        +	// period of a locked retention policy will result in a
         	// PERMISSION_DENIED error.
         	RetentionPolicy *BucketRetentionPolicy `json:"retentionPolicy,omitempty"`
         
        @@ -405,12 +489,11 @@ func (s *BucketCors) MarshalJSON() ([]byte, error) {
         	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
         }
         
        -// BucketEncryption: Encryption configuration used by default for newly
        -// inserted objects, when no encryption config is specified.
        +// BucketEncryption: Encryption configuration for a bucket.
         type BucketEncryption struct {
         	// DefaultKmsKeyName: A Cloud KMS key that will be used to encrypt
         	// objects inserted into this bucket, if no encryption method is
        -	// specified. Limited availability; usable only by enabled projects.
        +	// specified.
         	DefaultKmsKeyName string `json:"defaultKmsKeyName,omitempty"`
         
         	// ForceSendFields is a list of field names (e.g. "DefaultKmsKeyName")
        @@ -437,6 +520,72 @@ func (s *BucketEncryption) MarshalJSON() ([]byte, error) {
         	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
         }
         
        +// BucketIamConfiguration: The bucket's IAM configuration.
        +type BucketIamConfiguration struct {
        +	// BucketPolicyOnly: The bucket's Bucket Policy Only configuration.
        +	BucketPolicyOnly *BucketIamConfigurationBucketPolicyOnly `json:"bucketPolicyOnly,omitempty"`
        +
        +	// ForceSendFields is a list of field names (e.g. "BucketPolicyOnly") to
        +	// unconditionally include in API requests. By default, fields with
        +	// empty values are omitted from API requests. However, any non-pointer,
        +	// non-interface field appearing in ForceSendFields will be sent to the
        +	// server regardless of whether the field is empty or not. This may be
        +	// used to include empty fields in Patch requests.
        +	ForceSendFields []string `json:"-"`
        +
        +	// NullFields is a list of field names (e.g. "BucketPolicyOnly") to
        +	// include in API requests with the JSON null value. By default, fields
        +	// with empty values are omitted from API requests. However, any field
        +	// with an empty value appearing in NullFields will be sent to the
        +	// server as null. It is an error if a field in this list has a
        +	// non-empty value. This may be used to include null fields in Patch
        +	// requests.
        +	NullFields []string `json:"-"`
        +}
        +
        +func (s *BucketIamConfiguration) MarshalJSON() ([]byte, error) {
        +	type NoMethod BucketIamConfiguration
        +	raw := NoMethod(*s)
        +	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
        +}
        +
        +// BucketIamConfigurationBucketPolicyOnly: The bucket's Bucket Policy
        +// Only configuration.
        +type BucketIamConfigurationBucketPolicyOnly struct {
        +	// Enabled: If set, access checks only use bucket-level IAM policies or
        +	// above.
        +	Enabled bool `json:"enabled,omitempty"`
        +
        +	// LockedTime: The deadline time for changing
        +	// iamConfiguration.bucketPolicyOnly.enabled from true to false in RFC
        +	// 3339 format. iamConfiguration.bucketPolicyOnly.enabled may be changed
        +	// from true to false until the locked time, after which the field is
        +	// immutable.
        +	LockedTime string `json:"lockedTime,omitempty"`
        +
        +	// ForceSendFields is a list of field names (e.g. "Enabled") to
        +	// unconditionally include in API requests. By default, fields with
        +	// empty values are omitted from API requests. However, any non-pointer,
        +	// non-interface field appearing in ForceSendFields will be sent to the
        +	// server regardless of whether the field is empty or not. This may be
        +	// used to include empty fields in Patch requests.
        +	ForceSendFields []string `json:"-"`
        +
        +	// NullFields is a list of field names (e.g. "Enabled") to include in
        +	// API requests with the JSON null value. By default, fields with empty
        +	// values are omitted from API requests. However, any field with an
        +	// empty value appearing in NullFields will be sent to the server as
        +	// null. It is an error if a field in this list has a non-empty value.
        +	// This may be used to include null fields in Patch requests.
        +	NullFields []string `json:"-"`
        +}
        +
        +func (s *BucketIamConfigurationBucketPolicyOnly) MarshalJSON() ([]byte, error) {
        +	type NoMethod BucketIamConfigurationBucketPolicyOnly
        +	raw := NoMethod(*s)
        +	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
        +}
        +
         // BucketLifecycle: The bucket's lifecycle configuration. See lifecycle
         // management for more information.
         type BucketLifecycle struct {
        @@ -547,6 +696,14 @@ type BucketLifecycleRuleCondition struct {
         	// matches archived objects.
         	IsLive *bool `json:"isLive,omitempty"`
         
        +	// MatchesPattern: A regular expression that satisfies the RE2 syntax.
        +	// This condition is satisfied when the name of the object matches the
        +	// RE2 pattern. Note: This feature is currently in the "Early Access"
        +	// launch stage and is only available to a whitelisted set of users;
        +	// that means that this feature may be changed in backward-incompatible
        +	// ways and that it is not guaranteed to be released.
        +	MatchesPattern string `json:"matchesPattern,omitempty"`
        +
         	// MatchesStorageClass: Objects having any of the storage classes
         	// specified by this condition will be matched. Values include
         	// MULTI_REGIONAL, REGIONAL, NEARLINE, COLDLINE, STANDARD, and
        @@ -647,25 +804,26 @@ func (s *BucketOwner) MarshalJSON() ([]byte, error) {
         	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
         }
         
        -// BucketRetentionPolicy: Defines the retention policy for a bucket. The
        -// Retention policy enforces a minimum retention time for all objects
        -// contained in the bucket, based on their creation time. Any attempt to
        -// overwrite or delete objects younger than the retention period will
        -// result in a PERMISSION_DENIED error. An unlocked retention policy can
        -// be modified or removed from the bucket via the UpdateBucketMetadata
        -// RPC. A locked retention policy cannot be removed or shortened in
        -// duration for the lifetime of the bucket. Attempting to remove or
        -// decrease period of a locked retention policy will result in a
        +// BucketRetentionPolicy: The bucket's retention policy. The retention
        +// policy enforces a minimum retention time for all objects contained in
        +// the bucket, based on their creation time. Any attempt to overwrite or
        +// delete objects younger than the retention period will result in a
        +// PERMISSION_DENIED error. An unlocked retention policy can be modified
        +// or removed from the bucket via a storage.buckets.update operation. A
        +// locked retention policy cannot be removed or shortened in duration
        +// for the lifetime of the bucket. Attempting to remove or decrease
        +// period of a locked retention policy will result in a
         // PERMISSION_DENIED error.
         type BucketRetentionPolicy struct {
        -	// EffectiveTime: The time from which policy was enforced and effective.
        -	// RFC 3339 format.
        +	// EffectiveTime: Server-determined value that indicates the time from
        +	// which policy was enforced and effective. This value is in RFC 3339
        +	// format.
         	EffectiveTime string `json:"effectiveTime,omitempty"`
         
         	// IsLocked: Once locked, an object retention policy cannot be modified.
         	IsLocked bool `json:"isLocked,omitempty"`
         
        -	// RetentionPeriod: Specifies the duration that objects need to be
        +	// RetentionPeriod: The duration in seconds that objects need to be
         	// retained. Retention duration must be greater than zero and less than
         	// 100 years. Note that enforcement of retention periods less than a day
         	// is not guaranteed. Such periods should only be used for testing
        @@ -1055,8 +1213,8 @@ type ComposeRequestSourceObjects struct {
         	// Generation: The generation of this object to use as the source.
         	Generation int64 `json:"generation,omitempty,string"`
         
        -	// Name: The source object's name. The source object's bucket is
        -	// implicitly the destination bucket.
        +	// Name: The source object's name. All source objects must reside in the
        +	// same bucket.
         	Name string `json:"name,omitempty"`
         
         	// ObjectPreconditions: Conditions that must be met for this operation
        @@ -1119,6 +1277,204 @@ func (s *ComposeRequestSourceObjectsObjectPreconditions) MarshalJSON() ([]byte,
         	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
         }
         
        +// Expr: Represents an expression text. Example: title: "User account
        +// presence" description: "Determines whether the request has a user
        +// account" expression: "size(request.user) > 0"
        +type Expr struct {
        +	// Description: An optional description of the expression. This is a
        +	// longer text which describes the expression, e.g. when hovered over it
        +	// in a UI.
        +	Description string `json:"description,omitempty"`
        +
        +	// Expression: Textual representation of an expression in Common
        +	// Expression Language syntax. The application context of the containing
        +	// message determines which well-known feature set of CEL is supported.
        +	Expression string `json:"expression,omitempty"`
        +
        +	// Kind: The kind of item this is. For storage, this is always
        +	// storage#expr. This field is ignored on input.
        +	Kind string `json:"kind,omitempty"`
        +
        +	// Location: An optional string indicating the location of the
        +	// expression for error reporting, e.g. a file name and a position in
        +	// the file.
        +	Location string `json:"location,omitempty"`
        +
        +	// Title: An optional title for the expression, i.e. a short string
        +	// describing its purpose. This can be used e.g. in UIs which allow to
        +	// enter the expression.
        +	Title string `json:"title,omitempty"`
        +
        +	// ForceSendFields is a list of field names (e.g. "Description") to
        +	// unconditionally include in API requests. By default, fields with
        +	// empty values are omitted from API requests. However, any non-pointer,
        +	// non-interface field appearing in ForceSendFields will be sent to the
        +	// server regardless of whether the field is empty or not. This may be
        +	// used to include empty fields in Patch requests.
        +	ForceSendFields []string `json:"-"`
        +
        +	// NullFields is a list of field names (e.g. "Description") to include
        +	// in API requests with the JSON null value. By default, fields with
        +	// empty values are omitted from API requests. However, any field with
        +	// an empty value appearing in NullFields will be sent to the server as
        +	// null. It is an error if a field in this list has a non-empty value.
        +	// This may be used to include null fields in Patch requests.
        +	NullFields []string `json:"-"`
        +}
        +
        +func (s *Expr) MarshalJSON() ([]byte, error) {
        +	type NoMethod Expr
        +	raw := NoMethod(*s)
        +	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
        +}
        +
        +// HmacKey: JSON template to produce a JSON-style HMAC Key resource for
        +// Create responses.
        +type HmacKey struct {
        +	// Kind: The kind of item this is. For HMAC keys, this is always
        +	// storage#hmacKey.
        +	Kind string `json:"kind,omitempty"`
        +
        +	// Metadata: Key metadata.
        +	Metadata *HmacKeyMetadata `json:"metadata,omitempty"`
        +
        +	// Secret: HMAC secret key material.
        +	Secret string `json:"secret,omitempty"`
        +
        +	// ServerResponse contains the HTTP response code and headers from the
        +	// server.
        +	googleapi.ServerResponse `json:"-"`
        +
        +	// ForceSendFields is a list of field names (e.g. "Kind") to
        +	// unconditionally include in API requests. By default, fields with
        +	// empty values are omitted from API requests. However, any non-pointer,
        +	// non-interface field appearing in ForceSendFields will be sent to the
        +	// server regardless of whether the field is empty or not. This may be
        +	// used to include empty fields in Patch requests.
        +	ForceSendFields []string `json:"-"`
        +
        +	// NullFields is a list of field names (e.g. "Kind") to include in API
        +	// requests with the JSON null value. By default, fields with empty
        +	// values are omitted from API requests. However, any field with an
        +	// empty value appearing in NullFields will be sent to the server as
        +	// null. It is an error if a field in this list has a non-empty value.
        +	// This may be used to include null fields in Patch requests.
        +	NullFields []string `json:"-"`
        +}
        +
        +func (s *HmacKey) MarshalJSON() ([]byte, error) {
        +	type NoMethod HmacKey
        +	raw := NoMethod(*s)
        +	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
        +}
        +
        +// HmacKeyMetadata: JSON template to produce a JSON-style HMAC Key
        +// metadata resource.
        +type HmacKeyMetadata struct {
        +	// AccessId: The ID of the HMAC Key.
        +	AccessId string `json:"accessId,omitempty"`
        +
        +	// Etag: HTTP 1.1 Entity tag for the HMAC key.
        +	Etag string `json:"etag,omitempty"`
        +
        +	// Id: The ID of the HMAC key, including the Project ID and the Access
        +	// ID.
        +	Id string `json:"id,omitempty"`
        +
        +	// Kind: The kind of item this is. For HMAC Key metadata, this is always
        +	// storage#hmacKeyMetadata.
        +	Kind string `json:"kind,omitempty"`
        +
        +	// ProjectId: Project ID owning the service account to which the key
        +	// authenticates.
        +	ProjectId string `json:"projectId,omitempty"`
        +
        +	// SelfLink: The link to this resource.
        +	SelfLink string `json:"selfLink,omitempty"`
        +
        +	// ServiceAccountEmail: The email address of the key's associated
        +	// service account.
        +	ServiceAccountEmail string `json:"serviceAccountEmail,omitempty"`
        +
        +	// State: The state of the key. Can be one of ACTIVE, INACTIVE, or
        +	// DELETED.
        +	State string `json:"state,omitempty"`
        +
        +	// TimeCreated: The creation time of the HMAC key in RFC 3339 format.
        +	TimeCreated string `json:"timeCreated,omitempty"`
        +
        +	// Updated: The last modification time of the HMAC key metadata in RFC
        +	// 3339 format.
        +	Updated string `json:"updated,omitempty"`
        +
        +	// ServerResponse contains the HTTP response code and headers from the
        +	// server.
        +	googleapi.ServerResponse `json:"-"`
        +
        +	// ForceSendFields is a list of field names (e.g. "AccessId") to
        +	// unconditionally include in API requests. By default, fields with
        +	// empty values are omitted from API requests. However, any non-pointer,
        +	// non-interface field appearing in ForceSendFields will be sent to the
        +	// server regardless of whether the field is empty or not. This may be
        +	// used to include empty fields in Patch requests.
        +	ForceSendFields []string `json:"-"`
        +
        +	// NullFields is a list of field names (e.g. "AccessId") to include in
        +	// API requests with the JSON null value. By default, fields with empty
        +	// values are omitted from API requests. However, any field with an
        +	// empty value appearing in NullFields will be sent to the server as
        +	// null. It is an error if a field in this list has a non-empty value.
        +	// This may be used to include null fields in Patch requests.
        +	NullFields []string `json:"-"`
        +}
        +
        +func (s *HmacKeyMetadata) MarshalJSON() ([]byte, error) {
        +	type NoMethod HmacKeyMetadata
        +	raw := NoMethod(*s)
        +	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
        +}
        +
        +// HmacKeysMetadata: A list of hmacKeys.
        +type HmacKeysMetadata struct {
        +	// Items: The list of items.
        +	Items []*HmacKeyMetadata `json:"items,omitempty"`
        +
        +	// Kind: The kind of item this is. For lists of hmacKeys, this is always
        +	// storage#hmacKeysMetadata.
        +	Kind string `json:"kind,omitempty"`
        +
        +	// NextPageToken: The continuation token, used to page through large
        +	// result sets. Provide this value in a subsequent request to return the
        +	// next page of results.
        +	NextPageToken string `json:"nextPageToken,omitempty"`
        +
        +	// ServerResponse contains the HTTP response code and headers from the
        +	// server.
        +	googleapi.ServerResponse `json:"-"`
        +
        +	// ForceSendFields is a list of field names (e.g. "Items") to
        +	// unconditionally include in API requests. By default, fields with
        +	// empty values are omitted from API requests. However, any non-pointer,
        +	// non-interface field appearing in ForceSendFields will be sent to the
        +	// server regardless of whether the field is empty or not. This may be
        +	// used to include empty fields in Patch requests.
        +	ForceSendFields []string `json:"-"`
        +
        +	// NullFields is a list of field names (e.g. "Items") to include in API
        +	// requests with the JSON null value. By default, fields with empty
        +	// values are omitted from API requests. However, any field with an
        +	// empty value appearing in NullFields will be sent to the server as
        +	// null. It is an error if a field in this list has a non-empty value.
        +	// This may be used to include null fields in Patch requests.
        +	NullFields []string `json:"-"`
        +}
        +
        +func (s *HmacKeysMetadata) MarshalJSON() ([]byte, error) {
        +	type NoMethod HmacKeysMetadata
        +	raw := NoMethod(*s)
        +	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
        +}
        +
         // Notification: A subscription to receive Google PubSub notifications.
         type Notification struct {
         	// CustomAttributes: An optional list of additional attributes to attach
        @@ -1263,16 +1619,19 @@ type Object struct {
         	// Etag: HTTP 1.1 Entity tag for the object.
         	Etag string `json:"etag,omitempty"`
         
        -	// EventBasedHold: Defines the Event-Based hold for an object.
        -	// Event-Based hold is a way to retain objects indefinitely until an
        -	// event occurs, signified by the hold's release. After being released,
        -	// such objects will be subject to bucket-level retention (if any). One
        -	// sample use case of this flag is for banks to hold loan documents for
        -	// at least 3 years after loan is paid in full. Here bucket-level
        -	// retention is 3 years and the event is loan being paid in full. In
        -	// this example these objects will be held intact for any number of
        -	// years until the event has occurred (hold is released) and then 3 more
        -	// years after that.
        +	// EventBasedHold: Whether an object is under event-based hold.
        +	// Event-based hold is a way to retain objects until an event occurs,
        +	// which is signified by the hold's release (i.e. this value is set to
        +	// false). After being released (set to false), such objects will be
        +	// subject to bucket-level retention (if any). One sample use case of
        +	// this flag is for banks to hold loan documents for at least 3 years
        +	// after loan is paid in full. Here, bucket-level retention is 3 years
        +	// and the event is the loan being paid in full. In this example, these
        +	// objects will be held intact for any number of years until the event
        +	// has occurred (event-based hold on the object is released) and then 3
        +	// more years after that. That means retention duration of the objects
        +	// begins from the moment event-based hold transitioned from true to
        +	// false.
         	EventBasedHold bool `json:"eventBasedHold,omitempty"`
         
         	// Generation: The content generation of this object. Used for object
        @@ -1288,8 +1647,7 @@ type Object struct {
         	Kind string `json:"kind,omitempty"`
         
         	// KmsKeyName: Cloud KMS Key used to encrypt this object, if the object
        -	// is encrypted by such a key. Limited availability; usable only by
        -	// enabled projects.
        +	// is encrypted by such a key.
         	KmsKeyName string `json:"kmsKeyName,omitempty"`
         
         	// Md5Hash: MD5 hash of the data; encoded using base64. For more
        @@ -1317,13 +1675,13 @@ type Object struct {
         	// the object.
         	Owner *ObjectOwner `json:"owner,omitempty"`
         
        -	// RetentionExpirationTime: Specifies the earliest time that the
        -	// object's retention period expires. This value is server-determined
        -	// and is in RFC 3339 format. Note 1: This field is not provided for
        -	// objects with an active Event-Based hold, since retention expiration
        -	// is unknown until the hold is removed. Note 2: This value can be
        -	// provided even when TemporaryHold is set (so that the user can reason
        -	// about policy without having to first unset the TemporaryHold).
        +	// RetentionExpirationTime: A server-determined value that specifies the
        +	// earliest time that the object's retention period expires. This value
        +	// is in RFC 3339 format. Note 1: This field is not provided for objects
        +	// with an active event-based hold, since retention expiration is
        +	// unknown until the hold is removed. Note 2: This value can be provided
        +	// even when temporary hold is set (so that the user can reason about
        +	// policy without having to first unset the temporary hold).
         	RetentionExpirationTime string `json:"retentionExpirationTime,omitempty"`
         
         	// SelfLink: The link to this object.
        @@ -1335,11 +1693,13 @@ type Object struct {
         	// StorageClass: Storage class of the object.
         	StorageClass string `json:"storageClass,omitempty"`
         
        -	// TemporaryHold: Defines the temporary hold for an object. This flag is
        -	// used to enforce a temporary hold on an object. While it is set to
        -	// true, the object is protected against deletion and overwrites. A
        -	// common use case of this flag is regulatory investigations where
        -	// objects need to be retained while the investigation is ongoing.
        +	// TemporaryHold: Whether an object is under temporary hold. While this
        +	// flag is set to true, the object is protected against deletion and
        +	// overwrites. A common use case of this flag is regulatory
        +	// investigations where objects need to be retained while the
        +	// investigation is ongoing. Note that unlike event-based hold,
        +	// temporary hold does not impact retention expiration time of an
        +	// object.
         	TemporaryHold bool `json:"temporaryHold,omitempty"`
         
         	// TimeCreated: The creation time of the object in RFC 3339 format.
        @@ -1698,7 +2058,11 @@ func (s *Policy) MarshalJSON() ([]byte, error) {
         }
         
         type PolicyBindings struct {
        -	Condition interface{} `json:"condition,omitempty"`
        +	// Condition: The condition that is associated with this binding. NOTE:
        +	// an unsatisfied condition will not allow user access via current
        +	// binding. Different bindings, including their conditions, are examined
        +	// independently.
        +	Condition *Expr `json:"condition,omitempty"`
         
         	// Members: A collection of identifiers for members who may assume the
         	// provided role. Recognized identifiers are as follows:
        @@ -1945,6 +2309,14 @@ func (r *BucketAccessControlsService) Delete(bucket string, entity string) *Buck
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *BucketAccessControlsDeleteCall) ProvisionalUserProject(provisionalUserProject string) *BucketAccessControlsDeleteCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *BucketAccessControlsDeleteCall) UserProject(userProject string) *BucketAccessControlsDeleteCall {
        @@ -1985,9 +2357,13 @@ func (c *BucketAccessControlsDeleteCall) doRequest(alt string) (*http.Response,
         	reqHeaders.Set("User-Agent", c.s.userAgent())
         	var body io.Reader = nil
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/acl/{entity}")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("DELETE", urls, body)
        +	req, err := http.NewRequest("DELETE", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -2029,6 +2405,11 @@ func (c *BucketAccessControlsDeleteCall) Do(opts ...googleapi.CallOption) error
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -2065,6 +2446,14 @@ func (r *BucketAccessControlsService) Get(bucket string, entity string) *BucketA
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *BucketAccessControlsGetCall) ProvisionalUserProject(provisionalUserProject string) *BucketAccessControlsGetCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *BucketAccessControlsGetCall) UserProject(userProject string) *BucketAccessControlsGetCall {
        @@ -2118,9 +2507,13 @@ func (c *BucketAccessControlsGetCall) doRequest(alt string) (*http.Response, err
         	}
         	var body io.Reader = nil
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/acl/{entity}")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("GET", urls, body)
        +	req, err := http.NewRequest("GET", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -2187,6 +2580,11 @@ func (c *BucketAccessControlsGetCall) Do(opts ...googleapi.CallOption) (*BucketA
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -2224,6 +2622,14 @@ func (r *BucketAccessControlsService) Insert(bucket string, bucketaccesscontrol
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *BucketAccessControlsInsertCall) ProvisionalUserProject(provisionalUserProject string) *BucketAccessControlsInsertCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *BucketAccessControlsInsertCall) UserProject(userProject string) *BucketAccessControlsInsertCall {
        @@ -2269,9 +2675,13 @@ func (c *BucketAccessControlsInsertCall) doRequest(alt string) (*http.Response,
         	}
         	reqHeaders.Set("Content-Type", "application/json")
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/acl")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("POST", urls, body)
        +	req, err := http.NewRequest("POST", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -2330,6 +2740,11 @@ func (c *BucketAccessControlsInsertCall) Do(opts ...googleapi.CallOption) (*Buck
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -2369,6 +2784,14 @@ func (r *BucketAccessControlsService) List(bucket string) *BucketAccessControlsL
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *BucketAccessControlsListCall) ProvisionalUserProject(provisionalUserProject string) *BucketAccessControlsListCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *BucketAccessControlsListCall) UserProject(userProject string) *BucketAccessControlsListCall {
        @@ -2422,9 +2845,13 @@ func (c *BucketAccessControlsListCall) doRequest(alt string) (*http.Response, er
         	}
         	var body io.Reader = nil
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/acl")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("GET", urls, body)
        +	req, err := http.NewRequest("GET", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -2483,6 +2910,11 @@ func (c *BucketAccessControlsListCall) Do(opts ...googleapi.CallOption) (*Bucket
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -2522,6 +2954,14 @@ func (r *BucketAccessControlsService) Patch(bucket string, entity string, bucket
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *BucketAccessControlsPatchCall) ProvisionalUserProject(provisionalUserProject string) *BucketAccessControlsPatchCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *BucketAccessControlsPatchCall) UserProject(userProject string) *BucketAccessControlsPatchCall {
        @@ -2567,11 +3007,15 @@ func (c *BucketAccessControlsPatchCall) doRequest(alt string) (*http.Response, e
         	}
         	reqHeaders.Set("Content-Type", "application/json")
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/acl/{entity}")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("PATCH", urls, body)
        -	req.Header = reqHeaders
        -	googleapi.Expand(req.URL, map[string]string{
        +	req, err := http.NewRequest("PATCH", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
        +	req.Header = reqHeaders
        +	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
         		"entity": c.entity,
         	})
        @@ -2636,6 +3080,11 @@ func (c *BucketAccessControlsPatchCall) Do(opts ...googleapi.CallOption) (*Bucke
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -2678,6 +3127,14 @@ func (r *BucketAccessControlsService) Update(bucket string, entity string, bucke
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *BucketAccessControlsUpdateCall) ProvisionalUserProject(provisionalUserProject string) *BucketAccessControlsUpdateCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *BucketAccessControlsUpdateCall) UserProject(userProject string) *BucketAccessControlsUpdateCall {
        @@ -2723,9 +3180,13 @@ func (c *BucketAccessControlsUpdateCall) doRequest(alt string) (*http.Response,
         	}
         	reqHeaders.Set("Content-Type", "application/json")
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/acl/{entity}")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("PUT", urls, body)
        +	req, err := http.NewRequest("PUT", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -2792,6 +3253,11 @@ func (c *BucketAccessControlsUpdateCall) Do(opts ...googleapi.CallOption) (*Buck
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -2846,6 +3312,14 @@ func (c *BucketsDeleteCall) IfMetagenerationNotMatch(ifMetagenerationNotMatch in
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *BucketsDeleteCall) ProvisionalUserProject(provisionalUserProject string) *BucketsDeleteCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *BucketsDeleteCall) UserProject(userProject string) *BucketsDeleteCall {
        @@ -2886,9 +3360,13 @@ func (c *BucketsDeleteCall) doRequest(alt string) (*http.Response, error) {
         	reqHeaders.Set("User-Agent", c.s.userAgent())
         	var body io.Reader = nil
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("DELETE", urls, body)
        +	req, err := http.NewRequest("DELETE", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -2934,6 +3412,11 @@ func (c *BucketsDeleteCall) Do(opts ...googleapi.CallOption) error {
         	//       "location": "query",
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -2997,6 +3480,14 @@ func (c *BucketsGetCall) Projection(projection string) *BucketsGetCall {
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *BucketsGetCall) ProvisionalUserProject(provisionalUserProject string) *BucketsGetCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *BucketsGetCall) UserProject(userProject string) *BucketsGetCall {
        @@ -3050,9 +3541,13 @@ func (c *BucketsGetCall) doRequest(alt string) (*http.Response, error) {
         	}
         	var body io.Reader = nil
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("GET", urls, body)
        +	req, err := http.NewRequest("GET", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -3136,6 +3631,11 @@ func (c *BucketsGetCall) Do(opts ...googleapi.CallOption) (*Bucket, error) {
         	//       "location": "query",
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -3175,6 +3675,14 @@ func (r *BucketsService) GetIamPolicy(bucket string) *BucketsGetIamPolicyCall {
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *BucketsGetIamPolicyCall) ProvisionalUserProject(provisionalUserProject string) *BucketsGetIamPolicyCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *BucketsGetIamPolicyCall) UserProject(userProject string) *BucketsGetIamPolicyCall {
        @@ -3228,9 +3736,13 @@ func (c *BucketsGetIamPolicyCall) doRequest(alt string) (*http.Response, error)
         	}
         	var body io.Reader = nil
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/iam")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("GET", urls, body)
        +	req, err := http.NewRequest("GET", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -3289,6 +3801,11 @@ func (c *BucketsGetIamPolicyCall) Do(opts ...googleapi.CallOption) (*Policy, err
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -3301,10 +3818,7 @@ func (c *BucketsGetIamPolicyCall) Do(opts ...googleapi.CallOption) (*Policy, err
         	//   },
         	//   "scopes": [
         	//     "https://www.googleapis.com/auth/cloud-platform",
        -	//     "https://www.googleapis.com/auth/cloud-platform.read-only",
        -	//     "https://www.googleapis.com/auth/devstorage.full_control",
        -	//     "https://www.googleapis.com/auth/devstorage.read_only",
        -	//     "https://www.googleapis.com/auth/devstorage.read_write"
        +	//     "https://www.googleapis.com/auth/devstorage.full_control"
         	//   ]
         	// }
         
        @@ -3380,6 +3894,14 @@ func (c *BucketsInsertCall) Projection(projection string) *BucketsInsertCall {
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *BucketsInsertCall) ProvisionalUserProject(provisionalUserProject string) *BucketsInsertCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request.
         func (c *BucketsInsertCall) UserProject(userProject string) *BucketsInsertCall {
        @@ -3425,9 +3947,13 @@ func (c *BucketsInsertCall) doRequest(alt string) (*http.Response, error) {
         	}
         	reqHeaders.Set("Content-Type", "application/json")
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("POST", urls, body)
        +	req, err := http.NewRequest("POST", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	return gensupport.SendRequest(c.ctx_, c.s.client, req)
         }
        @@ -3536,6 +4062,11 @@ func (c *BucketsInsertCall) Do(opts ...googleapi.CallOption) (*Bucket, error) {
         	//       "location": "query",
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request.",
         	//       "location": "query",
        @@ -3609,6 +4140,14 @@ func (c *BucketsListCall) Projection(projection string) *BucketsListCall {
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *BucketsListCall) ProvisionalUserProject(provisionalUserProject string) *BucketsListCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request.
         func (c *BucketsListCall) UserProject(userProject string) *BucketsListCall {
        @@ -3662,9 +4201,13 @@ func (c *BucketsListCall) doRequest(alt string) (*http.Response, error) {
         	}
         	var body io.Reader = nil
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("GET", urls, body)
        +	req, err := http.NewRequest("GET", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	return gensupport.SendRequest(c.ctx_, c.s.client, req)
         }
        @@ -3751,6 +4294,11 @@ func (c *BucketsListCall) Do(opts ...googleapi.CallOption) (*Buckets, error) {
         	//       "location": "query",
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request.",
         	//       "location": "query",
        @@ -3811,6 +4359,14 @@ func (r *BucketsService) LockRetentionPolicy(bucket string, ifMetagenerationMatc
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *BucketsLockRetentionPolicyCall) ProvisionalUserProject(provisionalUserProject string) *BucketsLockRetentionPolicyCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *BucketsLockRetentionPolicyCall) UserProject(userProject string) *BucketsLockRetentionPolicyCall {
        @@ -3851,9 +4407,13 @@ func (c *BucketsLockRetentionPolicyCall) doRequest(alt string) (*http.Response,
         	reqHeaders.Set("User-Agent", c.s.userAgent())
         	var body io.Reader = nil
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/lockRetentionPolicy")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("POST", urls, body)
        +	req, err := http.NewRequest("POST", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -3920,6 +4480,11 @@ func (c *BucketsLockRetentionPolicyCall) Do(opts ...googleapi.CallOption) (*Buck
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -3950,9 +4515,9 @@ type BucketsPatchCall struct {
         	header_    http.Header
         }
         
        -// Patch: Updates a bucket. Changes to the bucket will be readable
        +// Patch: Patches a bucket. Changes to the bucket will be readable
         // immediately after writing, but configuration changes may take time to
        -// propagate. This method supports patch semantics.
        +// propagate.
         func (r *BucketsService) Patch(bucket string, bucket2 *Bucket) *BucketsPatchCall {
         	c := &BucketsPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)}
         	c.bucket = bucket
        @@ -4028,6 +4593,14 @@ func (c *BucketsPatchCall) Projection(projection string) *BucketsPatchCall {
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *BucketsPatchCall) ProvisionalUserProject(provisionalUserProject string) *BucketsPatchCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *BucketsPatchCall) UserProject(userProject string) *BucketsPatchCall {
        @@ -4073,9 +4646,13 @@ func (c *BucketsPatchCall) doRequest(alt string) (*http.Response, error) {
         	}
         	reqHeaders.Set("Content-Type", "application/json")
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("PATCH", urls, body)
        +	req, err := http.NewRequest("PATCH", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -4121,7 +4698,7 @@ func (c *BucketsPatchCall) Do(opts ...googleapi.CallOption) (*Bucket, error) {
         	}
         	return ret, nil
         	// {
        -	//   "description": "Updates a bucket. Changes to the bucket will be readable immediately after writing, but configuration changes may take time to propagate. This method supports patch semantics.",
        +	//   "description": "Patches a bucket. Changes to the bucket will be readable immediately after writing, but configuration changes may take time to propagate.",
         	//   "httpMethod": "PATCH",
         	//   "id": "storage.buckets.patch",
         	//   "parameterOrder": [
        @@ -4199,6 +4776,11 @@ func (c *BucketsPatchCall) Do(opts ...googleapi.CallOption) (*Bucket, error) {
         	//       "location": "query",
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -4239,6 +4821,14 @@ func (r *BucketsService) SetIamPolicy(bucket string, policy *Policy) *BucketsSet
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *BucketsSetIamPolicyCall) ProvisionalUserProject(provisionalUserProject string) *BucketsSetIamPolicyCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *BucketsSetIamPolicyCall) UserProject(userProject string) *BucketsSetIamPolicyCall {
        @@ -4284,9 +4874,13 @@ func (c *BucketsSetIamPolicyCall) doRequest(alt string) (*http.Response, error)
         	}
         	reqHeaders.Set("Content-Type", "application/json")
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/iam")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("PUT", urls, body)
        +	req, err := http.NewRequest("PUT", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -4345,6 +4939,11 @@ func (c *BucketsSetIamPolicyCall) Do(opts ...googleapi.CallOption) (*Policy, err
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -4360,8 +4959,7 @@ func (c *BucketsSetIamPolicyCall) Do(opts ...googleapi.CallOption) (*Policy, err
         	//   },
         	//   "scopes": [
         	//     "https://www.googleapis.com/auth/cloud-platform",
        -	//     "https://www.googleapis.com/auth/devstorage.full_control",
        -	//     "https://www.googleapis.com/auth/devstorage.read_write"
        +	//     "https://www.googleapis.com/auth/devstorage.full_control"
         	//   ]
         	// }
         
        @@ -4387,6 +4985,14 @@ func (r *BucketsService) TestIamPermissions(bucket string, permissions []string)
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *BucketsTestIamPermissionsCall) ProvisionalUserProject(provisionalUserProject string) *BucketsTestIamPermissionsCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *BucketsTestIamPermissionsCall) UserProject(userProject string) *BucketsTestIamPermissionsCall {
        @@ -4440,9 +5046,13 @@ func (c *BucketsTestIamPermissionsCall) doRequest(alt string) (*http.Response, e
         	}
         	var body io.Reader = nil
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/iam/testPermissions")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("GET", urls, body)
        +	req, err := http.NewRequest("GET", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -4509,6 +5119,11 @@ func (c *BucketsTestIamPermissionsCall) Do(opts ...googleapi.CallOption) (*TestI
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -4619,6 +5234,14 @@ func (c *BucketsUpdateCall) Projection(projection string) *BucketsUpdateCall {
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *BucketsUpdateCall) ProvisionalUserProject(provisionalUserProject string) *BucketsUpdateCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *BucketsUpdateCall) UserProject(userProject string) *BucketsUpdateCall {
        @@ -4664,9 +5287,13 @@ func (c *BucketsUpdateCall) doRequest(alt string) (*http.Response, error) {
         	}
         	reqHeaders.Set("Content-Type", "application/json")
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("PUT", urls, body)
        +	req, err := http.NewRequest("PUT", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -4790,6 +5417,11 @@ func (c *BucketsUpdateCall) Do(opts ...googleapi.CallOption) (*Bucket, error) {
         	//       "location": "query",
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -4866,9 +5498,13 @@ func (c *ChannelsStopCall) doRequest(alt string) (*http.Response, error) {
         	}
         	reqHeaders.Set("Content-Type", "application/json")
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "channels/stop")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("POST", urls, body)
        +	req, err := http.NewRequest("POST", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	return gensupport.SendRequest(c.ctx_, c.s.client, req)
         }
        @@ -4925,6 +5561,14 @@ func (r *DefaultObjectAccessControlsService) Delete(bucket string, entity string
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *DefaultObjectAccessControlsDeleteCall) ProvisionalUserProject(provisionalUserProject string) *DefaultObjectAccessControlsDeleteCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *DefaultObjectAccessControlsDeleteCall) UserProject(userProject string) *DefaultObjectAccessControlsDeleteCall {
        @@ -4965,9 +5609,13 @@ func (c *DefaultObjectAccessControlsDeleteCall) doRequest(alt string) (*http.Res
         	reqHeaders.Set("User-Agent", c.s.userAgent())
         	var body io.Reader = nil
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/defaultObjectAcl/{entity}")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("DELETE", urls, body)
        +	req, err := http.NewRequest("DELETE", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -5009,6 +5657,11 @@ func (c *DefaultObjectAccessControlsDeleteCall) Do(opts ...googleapi.CallOption)
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -5045,6 +5698,14 @@ func (r *DefaultObjectAccessControlsService) Get(bucket string, entity string) *
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *DefaultObjectAccessControlsGetCall) ProvisionalUserProject(provisionalUserProject string) *DefaultObjectAccessControlsGetCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *DefaultObjectAccessControlsGetCall) UserProject(userProject string) *DefaultObjectAccessControlsGetCall {
        @@ -5098,9 +5759,13 @@ func (c *DefaultObjectAccessControlsGetCall) doRequest(alt string) (*http.Respon
         	}
         	var body io.Reader = nil
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/defaultObjectAcl/{entity}")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("GET", urls, body)
        +	req, err := http.NewRequest("GET", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -5167,6 +5832,11 @@ func (c *DefaultObjectAccessControlsGetCall) Do(opts ...googleapi.CallOption) (*
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -5205,6 +5875,14 @@ func (r *DefaultObjectAccessControlsService) Insert(bucket string, objectaccessc
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *DefaultObjectAccessControlsInsertCall) ProvisionalUserProject(provisionalUserProject string) *DefaultObjectAccessControlsInsertCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *DefaultObjectAccessControlsInsertCall) UserProject(userProject string) *DefaultObjectAccessControlsInsertCall {
        @@ -5250,9 +5928,13 @@ func (c *DefaultObjectAccessControlsInsertCall) doRequest(alt string) (*http.Res
         	}
         	reqHeaders.Set("Content-Type", "application/json")
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/defaultObjectAcl")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("POST", urls, body)
        +	req, err := http.NewRequest("POST", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -5311,6 +5993,11 @@ func (c *DefaultObjectAccessControlsInsertCall) Do(opts ...googleapi.CallOption)
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -5367,6 +6054,14 @@ func (c *DefaultObjectAccessControlsListCall) IfMetagenerationNotMatch(ifMetagen
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *DefaultObjectAccessControlsListCall) ProvisionalUserProject(provisionalUserProject string) *DefaultObjectAccessControlsListCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *DefaultObjectAccessControlsListCall) UserProject(userProject string) *DefaultObjectAccessControlsListCall {
        @@ -5420,9 +6115,13 @@ func (c *DefaultObjectAccessControlsListCall) doRequest(alt string) (*http.Respo
         	}
         	var body io.Reader = nil
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/defaultObjectAcl")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("GET", urls, body)
        +	req, err := http.NewRequest("GET", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -5493,6 +6192,11 @@ func (c *DefaultObjectAccessControlsListCall) Do(opts ...googleapi.CallOption) (
         	//       "location": "query",
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -5532,6 +6236,14 @@ func (r *DefaultObjectAccessControlsService) Patch(bucket string, entity string,
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *DefaultObjectAccessControlsPatchCall) ProvisionalUserProject(provisionalUserProject string) *DefaultObjectAccessControlsPatchCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *DefaultObjectAccessControlsPatchCall) UserProject(userProject string) *DefaultObjectAccessControlsPatchCall {
        @@ -5577,9 +6289,13 @@ func (c *DefaultObjectAccessControlsPatchCall) doRequest(alt string) (*http.Resp
         	}
         	reqHeaders.Set("Content-Type", "application/json")
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/defaultObjectAcl/{entity}")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("PATCH", urls, body)
        +	req, err := http.NewRequest("PATCH", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -5646,6 +6362,11 @@ func (c *DefaultObjectAccessControlsPatchCall) Do(opts ...googleapi.CallOption)
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -5688,6 +6409,14 @@ func (r *DefaultObjectAccessControlsService) Update(bucket string, entity string
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *DefaultObjectAccessControlsUpdateCall) ProvisionalUserProject(provisionalUserProject string) *DefaultObjectAccessControlsUpdateCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *DefaultObjectAccessControlsUpdateCall) UserProject(userProject string) *DefaultObjectAccessControlsUpdateCall {
        @@ -5733,9 +6462,13 @@ func (c *DefaultObjectAccessControlsUpdateCall) doRequest(alt string) (*http.Res
         	}
         	reqHeaders.Set("Content-Type", "application/json")
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/defaultObjectAcl/{entity}")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("PUT", urls, body)
        +	req, err := http.NewRequest("PUT", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -5802,6 +6535,11 @@ func (c *DefaultObjectAccessControlsUpdateCall) Do(opts ...googleapi.CallOption)
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -5842,6 +6580,14 @@ func (r *NotificationsService) Delete(bucket string, notification string) *Notif
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *NotificationsDeleteCall) ProvisionalUserProject(provisionalUserProject string) *NotificationsDeleteCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *NotificationsDeleteCall) UserProject(userProject string) *NotificationsDeleteCall {
        @@ -5882,9 +6628,13 @@ func (c *NotificationsDeleteCall) doRequest(alt string) (*http.Response, error)
         	reqHeaders.Set("User-Agent", c.s.userAgent())
         	var body io.Reader = nil
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/notificationConfigs/{notification}")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("DELETE", urls, body)
        +	req, err := http.NewRequest("DELETE", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket":       c.bucket,
        @@ -5926,6 +6676,11 @@ func (c *NotificationsDeleteCall) Do(opts ...googleapi.CallOption) error {
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -5962,6 +6717,14 @@ func (r *NotificationsService) Get(bucket string, notification string) *Notifica
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *NotificationsGetCall) ProvisionalUserProject(provisionalUserProject string) *NotificationsGetCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *NotificationsGetCall) UserProject(userProject string) *NotificationsGetCall {
        @@ -6015,9 +6778,13 @@ func (c *NotificationsGetCall) doRequest(alt string) (*http.Response, error) {
         	}
         	var body io.Reader = nil
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/notificationConfigs/{notification}")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("GET", urls, body)
        +	req, err := http.NewRequest("GET", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket":       c.bucket,
        @@ -6084,6 +6851,11 @@ func (c *NotificationsGetCall) Do(opts ...googleapi.CallOption) (*Notification,
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -6124,6 +6896,14 @@ func (r *NotificationsService) Insert(bucket string, notification *Notification)
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *NotificationsInsertCall) ProvisionalUserProject(provisionalUserProject string) *NotificationsInsertCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *NotificationsInsertCall) UserProject(userProject string) *NotificationsInsertCall {
        @@ -6169,9 +6949,13 @@ func (c *NotificationsInsertCall) doRequest(alt string) (*http.Response, error)
         	}
         	reqHeaders.Set("Content-Type", "application/json")
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/notificationConfigs")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("POST", urls, body)
        +	req, err := http.NewRequest("POST", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -6230,6 +7014,11 @@ func (c *NotificationsInsertCall) Do(opts ...googleapi.CallOption) (*Notificatio
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -6271,6 +7060,14 @@ func (r *NotificationsService) List(bucket string) *NotificationsListCall {
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *NotificationsListCall) ProvisionalUserProject(provisionalUserProject string) *NotificationsListCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *NotificationsListCall) UserProject(userProject string) *NotificationsListCall {
        @@ -6324,9 +7121,13 @@ func (c *NotificationsListCall) doRequest(alt string) (*http.Response, error) {
         	}
         	var body io.Reader = nil
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/notificationConfigs")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("GET", urls, body)
        +	req, err := http.NewRequest("GET", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -6385,6 +7186,11 @@ func (c *NotificationsListCall) Do(opts ...googleapi.CallOption) (*Notifications
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -6436,6 +7242,14 @@ func (c *ObjectAccessControlsDeleteCall) Generation(generation int64) *ObjectAcc
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *ObjectAccessControlsDeleteCall) ProvisionalUserProject(provisionalUserProject string) *ObjectAccessControlsDeleteCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *ObjectAccessControlsDeleteCall) UserProject(userProject string) *ObjectAccessControlsDeleteCall {
        @@ -6476,9 +7290,13 @@ func (c *ObjectAccessControlsDeleteCall) doRequest(alt string) (*http.Response,
         	reqHeaders.Set("User-Agent", c.s.userAgent())
         	var body io.Reader = nil
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/o/{object}/acl/{entity}")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("DELETE", urls, body)
        +	req, err := http.NewRequest("DELETE", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -6534,6 +7352,11 @@ func (c *ObjectAccessControlsDeleteCall) Do(opts ...googleapi.CallOption) error
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -6580,6 +7403,14 @@ func (c *ObjectAccessControlsGetCall) Generation(generation int64) *ObjectAccess
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *ObjectAccessControlsGetCall) ProvisionalUserProject(provisionalUserProject string) *ObjectAccessControlsGetCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *ObjectAccessControlsGetCall) UserProject(userProject string) *ObjectAccessControlsGetCall {
        @@ -6633,9 +7464,13 @@ func (c *ObjectAccessControlsGetCall) doRequest(alt string) (*http.Response, err
         	}
         	var body io.Reader = nil
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/o/{object}/acl/{entity}")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("GET", urls, body)
        +	req, err := http.NewRequest("GET", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -6716,6 +7551,11 @@ func (c *ObjectAccessControlsGetCall) Do(opts ...googleapi.CallOption) (*ObjectA
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -6763,6 +7603,14 @@ func (c *ObjectAccessControlsInsertCall) Generation(generation int64) *ObjectAcc
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *ObjectAccessControlsInsertCall) ProvisionalUserProject(provisionalUserProject string) *ObjectAccessControlsInsertCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *ObjectAccessControlsInsertCall) UserProject(userProject string) *ObjectAccessControlsInsertCall {
        @@ -6808,9 +7656,13 @@ func (c *ObjectAccessControlsInsertCall) doRequest(alt string) (*http.Response,
         	}
         	reqHeaders.Set("Content-Type", "application/json")
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/o/{object}/acl")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("POST", urls, body)
        +	req, err := http.NewRequest("POST", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -6883,6 +7735,11 @@ func (c *ObjectAccessControlsInsertCall) Do(opts ...googleapi.CallOption) (*Obje
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -6932,6 +7789,14 @@ func (c *ObjectAccessControlsListCall) Generation(generation int64) *ObjectAcces
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *ObjectAccessControlsListCall) ProvisionalUserProject(provisionalUserProject string) *ObjectAccessControlsListCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *ObjectAccessControlsListCall) UserProject(userProject string) *ObjectAccessControlsListCall {
        @@ -6985,9 +7850,13 @@ func (c *ObjectAccessControlsListCall) doRequest(alt string) (*http.Response, er
         	}
         	var body io.Reader = nil
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/o/{object}/acl")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("GET", urls, body)
        +	req, err := http.NewRequest("GET", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -7060,6 +7929,11 @@ func (c *ObjectAccessControlsListCall) Do(opts ...googleapi.CallOption) (*Object
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -7109,6 +7983,14 @@ func (c *ObjectAccessControlsPatchCall) Generation(generation int64) *ObjectAcce
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *ObjectAccessControlsPatchCall) ProvisionalUserProject(provisionalUserProject string) *ObjectAccessControlsPatchCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *ObjectAccessControlsPatchCall) UserProject(userProject string) *ObjectAccessControlsPatchCall {
        @@ -7154,9 +8036,13 @@ func (c *ObjectAccessControlsPatchCall) doRequest(alt string) (*http.Response, e
         	}
         	reqHeaders.Set("Content-Type", "application/json")
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/o/{object}/acl/{entity}")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("PATCH", urls, body)
        +	req, err := http.NewRequest("PATCH", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -7237,6 +8123,11 @@ func (c *ObjectAccessControlsPatchCall) Do(opts ...googleapi.CallOption) (*Objec
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -7289,8 +8180,16 @@ func (c *ObjectAccessControlsUpdateCall) Generation(generation int64) *ObjectAcc
         	return c
         }
         
        -// UserProject sets the optional parameter "userProject": The project to
        -// be billed for this request. Required for Requester Pays buckets.
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *ObjectAccessControlsUpdateCall) ProvisionalUserProject(provisionalUserProject string) *ObjectAccessControlsUpdateCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
        +// UserProject sets the optional parameter "userProject": The project to
        +// be billed for this request. Required for Requester Pays buckets.
         func (c *ObjectAccessControlsUpdateCall) UserProject(userProject string) *ObjectAccessControlsUpdateCall {
         	c.urlParams_.Set("userProject", userProject)
         	return c
        @@ -7334,9 +8233,13 @@ func (c *ObjectAccessControlsUpdateCall) doRequest(alt string) (*http.Response,
         	}
         	reqHeaders.Set("Content-Type", "application/json")
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/o/{object}/acl/{entity}")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("PUT", urls, body)
        +	req, err := http.NewRequest("PUT", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -7417,6 +8320,11 @@ func (c *ObjectAccessControlsUpdateCall) Do(opts ...googleapi.CallOption) (*Obje
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -7508,6 +8416,14 @@ func (c *ObjectsComposeCall) KmsKeyName(kmsKeyName string) *ObjectsComposeCall {
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *ObjectsComposeCall) ProvisionalUserProject(provisionalUserProject string) *ObjectsComposeCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *ObjectsComposeCall) UserProject(userProject string) *ObjectsComposeCall {
        @@ -7553,9 +8469,13 @@ func (c *ObjectsComposeCall) doRequest(alt string) (*http.Response, error) {
         	}
         	reqHeaders.Set("Content-Type", "application/json")
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{destinationBucket}/o/{destinationObject}/compose")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("POST", urls, body)
        +	req, err := http.NewRequest("POST", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"destinationBucket": c.destinationBucket,
        @@ -7611,7 +8531,7 @@ func (c *ObjectsComposeCall) Do(opts ...googleapi.CallOption) (*Object, error) {
         	//   ],
         	//   "parameters": {
         	//     "destinationBucket": {
        -	//       "description": "Name of the bucket in which to store the new object.",
        +	//       "description": "Name of the bucket containing the source objects. The destination object is stored in this bucket.",
         	//       "location": "path",
         	//       "required": true,
         	//       "type": "string"
        @@ -7660,6 +8580,11 @@ func (c *ObjectsComposeCall) Do(opts ...googleapi.CallOption) (*Object, error) {
         	//       "location": "query",
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -7814,6 +8739,14 @@ func (c *ObjectsCopyCall) Projection(projection string) *ObjectsCopyCall {
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *ObjectsCopyCall) ProvisionalUserProject(provisionalUserProject string) *ObjectsCopyCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // SourceGeneration sets the optional parameter "sourceGeneration": If
         // present, selects a specific revision of the source object (as opposed
         // to the latest version, the default).
        @@ -7867,9 +8800,13 @@ func (c *ObjectsCopyCall) doRequest(alt string) (*http.Response, error) {
         	}
         	reqHeaders.Set("Content-Type", "application/json")
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{sourceBucket}/o/{sourceObject}/copyTo/b/{destinationBucket}/o/{destinationObject}")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("POST", urls, body)
        +	req, err := http.NewRequest("POST", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"sourceBucket":      c.sourceBucket,
        @@ -8022,6 +8959,11 @@ func (c *ObjectsCopyCall) Do(opts ...googleapi.CallOption) (*Object, error) {
         	//       "location": "query",
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "sourceBucket": {
         	//       "description": "Name of the bucket in which to find the source object.",
         	//       "location": "path",
        @@ -8127,6 +9069,14 @@ func (c *ObjectsDeleteCall) IfMetagenerationNotMatch(ifMetagenerationNotMatch in
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *ObjectsDeleteCall) ProvisionalUserProject(provisionalUserProject string) *ObjectsDeleteCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *ObjectsDeleteCall) UserProject(userProject string) *ObjectsDeleteCall {
        @@ -8167,9 +9117,13 @@ func (c *ObjectsDeleteCall) doRequest(alt string) (*http.Response, error) {
         	reqHeaders.Set("User-Agent", c.s.userAgent())
         	var body io.Reader = nil
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/o/{object}")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("DELETE", urls, body)
        +	req, err := http.NewRequest("DELETE", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -8241,6 +9195,11 @@ func (c *ObjectsDeleteCall) Do(opts ...googleapi.CallOption) error {
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -8332,6 +9291,14 @@ func (c *ObjectsGetCall) Projection(projection string) *ObjectsGetCall {
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *ObjectsGetCall) ProvisionalUserProject(provisionalUserProject string) *ObjectsGetCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *ObjectsGetCall) UserProject(userProject string) *ObjectsGetCall {
        @@ -8385,9 +9352,13 @@ func (c *ObjectsGetCall) doRequest(alt string) (*http.Response, error) {
         	}
         	var body io.Reader = nil
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/o/{object}")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("GET", urls, body)
        +	req, err := http.NewRequest("GET", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -8513,6 +9484,11 @@ func (c *ObjectsGetCall) Do(opts ...googleapi.CallOption) (*Object, error) {
         	//       "location": "query",
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -8564,6 +9540,14 @@ func (c *ObjectsGetIamPolicyCall) Generation(generation int64) *ObjectsGetIamPol
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *ObjectsGetIamPolicyCall) ProvisionalUserProject(provisionalUserProject string) *ObjectsGetIamPolicyCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *ObjectsGetIamPolicyCall) UserProject(userProject string) *ObjectsGetIamPolicyCall {
        @@ -8617,9 +9601,13 @@ func (c *ObjectsGetIamPolicyCall) doRequest(alt string) (*http.Response, error)
         	}
         	var body io.Reader = nil
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/o/{object}/iam")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("GET", urls, body)
        +	req, err := http.NewRequest("GET", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -8692,6 +9680,11 @@ func (c *ObjectsGetIamPolicyCall) Do(opts ...googleapi.CallOption) (*Policy, err
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -8784,8 +9777,7 @@ func (c *ObjectsInsertCall) IfMetagenerationNotMatch(ifMetagenerationNotMatch in
         // the Cloud KMS key, of the form
         // projects/my-project/locations/global/keyRings/my-kr/cryptoKeys/my-key,
         //  that will be used to encrypt the object. Overrides the object
        -// metadata's kms_key_name value, if any. Limited availability; usable
        -// only by enabled projects.
        +// metadata's kms_key_name value, if any.
         func (c *ObjectsInsertCall) KmsKeyName(kmsKeyName string) *ObjectsInsertCall {
         	c.urlParams_.Set("kmsKeyName", kmsKeyName)
         	return c
        @@ -8832,6 +9824,14 @@ func (c *ObjectsInsertCall) Projection(projection string) *ObjectsInsertCall {
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *ObjectsInsertCall) ProvisionalUserProject(provisionalUserProject string) *ObjectsInsertCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *ObjectsInsertCall) UserProject(userProject string) *ObjectsInsertCall {
        @@ -8919,6 +9919,7 @@ func (c *ObjectsInsertCall) doRequest(alt string) (*http.Response, error) {
         	}
         	reqHeaders.Set("Content-Type", "application/json")
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/o")
         	if c.mediaInfo_ != nil {
         		urls = strings.Replace(urls, "https://www.googleapis.com/", "https://www.googleapis.com/upload/", 1)
        @@ -8931,9 +9932,12 @@ func (c *ObjectsInsertCall) doRequest(alt string) (*http.Response, error) {
         	body, getBody, cleanup := c.mediaInfo_.UploadRequest(reqHeaders, body)
         	defer cleanup()
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("POST", urls, body)
        +	req, err := http.NewRequest("POST", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
        -	gensupport.SetGetBody(req, getBody)
        +	req.GetBody = getBody
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
         	})
        @@ -9053,7 +10057,7 @@ func (c *ObjectsInsertCall) Do(opts ...googleapi.CallOption) (*Object, error) {
         	//       "type": "string"
         	//     },
         	//     "kmsKeyName": {
        -	//       "description": "Resource name of the Cloud KMS key, of the form projects/my-project/locations/global/keyRings/my-kr/cryptoKeys/my-key, that will be used to encrypt the object. Overrides the object metadata's kms_key_name value, if any. Limited availability; usable only by enabled projects.",
        +	//       "description": "Resource name of the Cloud KMS key, of the form projects/my-project/locations/global/keyRings/my-kr/cryptoKeys/my-key, that will be used to encrypt the object. Overrides the object metadata's kms_key_name value, if any.",
         	//       "location": "query",
         	//       "type": "string"
         	//     },
        @@ -9096,6 +10100,11 @@ func (c *ObjectsInsertCall) Do(opts ...googleapi.CallOption) (*Object, error) {
         	//       "location": "query",
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -9148,6 +10157,15 @@ func (c *ObjectsListCall) Delimiter(delimiter string) *ObjectsListCall {
         	return c
         }
         
        +// IncludeTrailingDelimiter sets the optional parameter
        +// "includeTrailingDelimiter": If true, objects that end in exactly one
        +// instance of delimiter will have their metadata included in items in
        +// addition to prefixes.
        +func (c *ObjectsListCall) IncludeTrailingDelimiter(includeTrailingDelimiter bool) *ObjectsListCall {
        +	c.urlParams_.Set("includeTrailingDelimiter", fmt.Sprint(includeTrailingDelimiter))
        +	return c
        +}
        +
         // MaxResults sets the optional parameter "maxResults": Maximum number
         // of items plus prefixes to return in a single page of responses. As
         // duplicate prefixes are omitted, fewer total results may be returned
        @@ -9184,6 +10202,14 @@ func (c *ObjectsListCall) Projection(projection string) *ObjectsListCall {
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *ObjectsListCall) ProvisionalUserProject(provisionalUserProject string) *ObjectsListCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *ObjectsListCall) UserProject(userProject string) *ObjectsListCall {
        @@ -9245,9 +10271,13 @@ func (c *ObjectsListCall) doRequest(alt string) (*http.Response, error) {
         	}
         	var body io.Reader = nil
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/o")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("GET", urls, body)
        +	req, err := http.NewRequest("GET", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -9311,6 +10341,11 @@ func (c *ObjectsListCall) Do(opts ...googleapi.CallOption) (*Objects, error) {
         	//       "location": "query",
         	//       "type": "string"
         	//     },
        +	//     "includeTrailingDelimiter": {
        +	//       "description": "If true, objects that end in exactly one instance of delimiter will have their metadata included in items in addition to prefixes.",
        +	//       "location": "query",
        +	//       "type": "boolean"
        +	//     },
         	//     "maxResults": {
         	//       "default": "1000",
         	//       "description": "Maximum number of items plus prefixes to return in a single page of responses. As duplicate prefixes are omitted, fewer total results may be returned than requested. The service will use this parameter or 1,000 items, whichever is smaller.",
        @@ -9342,6 +10377,11 @@ func (c *ObjectsListCall) Do(opts ...googleapi.CallOption) (*Objects, error) {
         	//       "location": "query",
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -9486,6 +10526,14 @@ func (c *ObjectsPatchCall) Projection(projection string) *ObjectsPatchCall {
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *ObjectsPatchCall) ProvisionalUserProject(provisionalUserProject string) *ObjectsPatchCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request, for Requester Pays buckets.
         func (c *ObjectsPatchCall) UserProject(userProject string) *ObjectsPatchCall {
        @@ -9531,9 +10579,13 @@ func (c *ObjectsPatchCall) doRequest(alt string) (*http.Response, error) {
         	}
         	reqHeaders.Set("Content-Type", "application/json")
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/o/{object}")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("PATCH", urls, body)
        +	req, err := http.NewRequest("PATCH", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -9664,6 +10716,11 @@ func (c *ObjectsPatchCall) Do(opts ...googleapi.CallOption) (*Object, error) {
         	//       "location": "query",
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request, for Requester Pays buckets.",
         	//       "location": "query",
        @@ -9841,6 +10898,14 @@ func (c *ObjectsRewriteCall) Projection(projection string) *ObjectsRewriteCall {
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *ObjectsRewriteCall) ProvisionalUserProject(provisionalUserProject string) *ObjectsRewriteCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // RewriteToken sets the optional parameter "rewriteToken": Include this
         // field (from the previous rewrite response) on each rewrite request
         // after the first one, until the rewrite response 'done' flag is true.
        @@ -9905,9 +10970,13 @@ func (c *ObjectsRewriteCall) doRequest(alt string) (*http.Response, error) {
         	}
         	reqHeaders.Set("Content-Type", "application/json")
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{sourceBucket}/o/{sourceObject}/rewriteTo/b/{destinationBucket}/o/{destinationObject}")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("POST", urls, body)
        +	req, err := http.NewRequest("POST", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"sourceBucket":      c.sourceBucket,
        @@ -10071,6 +11140,11 @@ func (c *ObjectsRewriteCall) Do(opts ...googleapi.CallOption) (*RewriteResponse,
         	//       "location": "query",
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "rewriteToken": {
         	//       "description": "Include this field (from the previous rewrite response) on each rewrite request after the first one, until the rewrite response 'done' flag is true. Calls that provide a rewriteToken can omit all other request fields, but if included those fields must match the values provided in the first rewrite request.",
         	//       "location": "query",
        @@ -10145,6 +11219,14 @@ func (c *ObjectsSetIamPolicyCall) Generation(generation int64) *ObjectsSetIamPol
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *ObjectsSetIamPolicyCall) ProvisionalUserProject(provisionalUserProject string) *ObjectsSetIamPolicyCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *ObjectsSetIamPolicyCall) UserProject(userProject string) *ObjectsSetIamPolicyCall {
        @@ -10190,9 +11272,13 @@ func (c *ObjectsSetIamPolicyCall) doRequest(alt string) (*http.Response, error)
         	}
         	reqHeaders.Set("Content-Type", "application/json")
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/o/{object}/iam")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("PUT", urls, body)
        +	req, err := http.NewRequest("PUT", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -10265,6 +11351,11 @@ func (c *ObjectsSetIamPolicyCall) Do(opts ...googleapi.CallOption) (*Policy, err
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -10317,6 +11408,14 @@ func (c *ObjectsTestIamPermissionsCall) Generation(generation int64) *ObjectsTes
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *ObjectsTestIamPermissionsCall) ProvisionalUserProject(provisionalUserProject string) *ObjectsTestIamPermissionsCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *ObjectsTestIamPermissionsCall) UserProject(userProject string) *ObjectsTestIamPermissionsCall {
        @@ -10370,9 +11469,13 @@ func (c *ObjectsTestIamPermissionsCall) doRequest(alt string) (*http.Response, e
         	}
         	var body io.Reader = nil
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/o/{object}/iam/testPermissions")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("GET", urls, body)
        +	req, err := http.NewRequest("GET", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -10453,6 +11556,11 @@ func (c *ObjectsTestIamPermissionsCall) Do(opts ...googleapi.CallOption) (*TestI
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -10570,6 +11678,14 @@ func (c *ObjectsUpdateCall) Projection(projection string) *ObjectsUpdateCall {
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *ObjectsUpdateCall) ProvisionalUserProject(provisionalUserProject string) *ObjectsUpdateCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *ObjectsUpdateCall) UserProject(userProject string) *ObjectsUpdateCall {
        @@ -10615,9 +11731,13 @@ func (c *ObjectsUpdateCall) doRequest(alt string) (*http.Response, error) {
         	}
         	reqHeaders.Set("Content-Type", "application/json")
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/o/{object}")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("PUT", urls, body)
        +	req, err := http.NewRequest("PUT", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -10748,6 +11868,11 @@ func (c *ObjectsUpdateCall) Do(opts ...googleapi.CallOption) (*Object, error) {
         	//       "location": "query",
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -10799,6 +11924,15 @@ func (c *ObjectsWatchAllCall) Delimiter(delimiter string) *ObjectsWatchAllCall {
         	return c
         }
         
        +// IncludeTrailingDelimiter sets the optional parameter
        +// "includeTrailingDelimiter": If true, objects that end in exactly one
        +// instance of delimiter will have their metadata included in items in
        +// addition to prefixes.
        +func (c *ObjectsWatchAllCall) IncludeTrailingDelimiter(includeTrailingDelimiter bool) *ObjectsWatchAllCall {
        +	c.urlParams_.Set("includeTrailingDelimiter", fmt.Sprint(includeTrailingDelimiter))
        +	return c
        +}
        +
         // MaxResults sets the optional parameter "maxResults": Maximum number
         // of items plus prefixes to return in a single page of responses. As
         // duplicate prefixes are omitted, fewer total results may be returned
        @@ -10835,6 +11969,14 @@ func (c *ObjectsWatchAllCall) Projection(projection string) *ObjectsWatchAllCall
         	return c
         }
         
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *ObjectsWatchAllCall) ProvisionalUserProject(provisionalUserProject string) *ObjectsWatchAllCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request. Required for Requester Pays buckets.
         func (c *ObjectsWatchAllCall) UserProject(userProject string) *ObjectsWatchAllCall {
        @@ -10888,9 +12030,13 @@ func (c *ObjectsWatchAllCall) doRequest(alt string) (*http.Response, error) {
         	}
         	reqHeaders.Set("Content-Type", "application/json")
         	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
         	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/o/watch")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("POST", urls, body)
        +	req, err := http.NewRequest("POST", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"bucket": c.bucket,
        @@ -10954,6 +12100,11 @@ func (c *ObjectsWatchAllCall) Do(opts ...googleapi.CallOption) (*Channel, error)
         	//       "location": "query",
         	//       "type": "string"
         	//     },
        +	//     "includeTrailingDelimiter": {
        +	//       "description": "If true, objects that end in exactly one instance of delimiter will have their metadata included in items in addition to prefixes.",
        +	//       "location": "query",
        +	//       "type": "boolean"
        +	//     },
         	//     "maxResults": {
         	//       "default": "1000",
         	//       "description": "Maximum number of items plus prefixes to return in a single page of responses. As duplicate prefixes are omitted, fewer total results may be returned than requested. The service will use this parameter or 1,000 items, whichever is smaller.",
        @@ -10985,6 +12136,11 @@ func (c *ObjectsWatchAllCall) Do(opts ...googleapi.CallOption) (*Channel, error)
         	//       "location": "query",
         	//       "type": "string"
         	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request. Required for Requester Pays buckets.",
         	//       "location": "query",
        @@ -11016,28 +12172,27 @@ func (c *ObjectsWatchAllCall) Do(opts ...googleapi.CallOption) (*Channel, error)
         
         }
         
        -// method id "storage.projects.serviceAccount.get":
        +// method id "storage.projects.hmacKeys.create":
         
        -type ProjectsServiceAccountGetCall struct {
        -	s            *Service
        -	projectId    string
        -	urlParams_   gensupport.URLParams
        -	ifNoneMatch_ string
        -	ctx_         context.Context
        -	header_      http.Header
        +type ProjectsHmacKeysCreateCall struct {
        +	s          *Service
        +	projectId  string
        +	urlParams_ gensupport.URLParams
        +	ctx_       context.Context
        +	header_    http.Header
         }
         
        -// Get: Get the email address of this project's Google Cloud Storage
        -// service account.
        -func (r *ProjectsServiceAccountService) Get(projectId string) *ProjectsServiceAccountGetCall {
        -	c := &ProjectsServiceAccountGetCall{s: r.s, urlParams_: make(gensupport.URLParams)}
        +// Create: Creates a new HMAC key for the specified service account.
        +func (r *ProjectsHmacKeysService) Create(projectId string, serviceAccountEmail string) *ProjectsHmacKeysCreateCall {
        +	c := &ProjectsHmacKeysCreateCall{s: r.s, urlParams_: make(gensupport.URLParams)}
         	c.projectId = projectId
        +	c.urlParams_.Set("serviceAccountEmail", serviceAccountEmail)
         	return c
         }
         
         // UserProject sets the optional parameter "userProject": The project to
         // be billed for this request.
        -func (c *ProjectsServiceAccountGetCall) UserProject(userProject string) *ProjectsServiceAccountGetCall {
        +func (c *ProjectsHmacKeysCreateCall) UserProject(userProject string) *ProjectsHmacKeysCreateCall {
         	c.urlParams_.Set("userProject", userProject)
         	return c
         }
        @@ -11045,52 +12200,43 @@ func (c *ProjectsServiceAccountGetCall) UserProject(userProject string) *Project
         // Fields allows partial responses to be retrieved. See
         // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
         // for more information.
        -func (c *ProjectsServiceAccountGetCall) Fields(s ...googleapi.Field) *ProjectsServiceAccountGetCall {
        +func (c *ProjectsHmacKeysCreateCall) Fields(s ...googleapi.Field) *ProjectsHmacKeysCreateCall {
         	c.urlParams_.Set("fields", googleapi.CombineFields(s))
         	return c
         }
         
        -// IfNoneMatch sets the optional parameter which makes the operation
        -// fail if the object's ETag matches the given value. This is useful for
        -// getting updates only after the object has changed since the last
        -// request. Use googleapi.IsNotModified to check whether the response
        -// error from Do is the result of In-None-Match.
        -func (c *ProjectsServiceAccountGetCall) IfNoneMatch(entityTag string) *ProjectsServiceAccountGetCall {
        -	c.ifNoneMatch_ = entityTag
        -	return c
        -}
        -
         // Context sets the context to be used in this call's Do method. Any
         // pending HTTP request will be aborted if the provided context is
         // canceled.
        -func (c *ProjectsServiceAccountGetCall) Context(ctx context.Context) *ProjectsServiceAccountGetCall {
        +func (c *ProjectsHmacKeysCreateCall) Context(ctx context.Context) *ProjectsHmacKeysCreateCall {
         	c.ctx_ = ctx
         	return c
         }
         
         // Header returns an http.Header that can be modified by the caller to
         // add HTTP headers to the request.
        -func (c *ProjectsServiceAccountGetCall) Header() http.Header {
        +func (c *ProjectsHmacKeysCreateCall) Header() http.Header {
         	if c.header_ == nil {
         		c.header_ = make(http.Header)
         	}
         	return c.header_
         }
         
        -func (c *ProjectsServiceAccountGetCall) doRequest(alt string) (*http.Response, error) {
        +func (c *ProjectsHmacKeysCreateCall) doRequest(alt string) (*http.Response, error) {
         	reqHeaders := make(http.Header)
         	for k, v := range c.header_ {
         		reqHeaders[k] = v
         	}
         	reqHeaders.Set("User-Agent", c.s.userAgent())
        -	if c.ifNoneMatch_ != "" {
        -		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
        -	}
         	var body io.Reader = nil
         	c.urlParams_.Set("alt", alt)
        -	urls := googleapi.ResolveRelative(c.s.BasePath, "projects/{projectId}/serviceAccount")
        +	c.urlParams_.Set("prettyPrint", "false")
        +	urls := googleapi.ResolveRelative(c.s.BasePath, "projects/{projectId}/hmacKeys")
         	urls += "?" + c.urlParams_.Encode()
        -	req, _ := http.NewRequest("GET", urls, body)
        +	req, err := http.NewRequest("POST", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
         	req.Header = reqHeaders
         	googleapi.Expand(req.URL, map[string]string{
         		"projectId": c.projectId,
        @@ -11098,14 +12244,14 @@ func (c *ProjectsServiceAccountGetCall) doRequest(alt string) (*http.Response, e
         	return gensupport.SendRequest(c.ctx_, c.s.client, req)
         }
         
        -// Do executes the "storage.projects.serviceAccount.get" call.
        -// Exactly one of *ServiceAccount or error will be non-nil. Any non-2xx
        -// status code is an error. Response headers are in either
        -// *ServiceAccount.ServerResponse.Header or (if a response was returned
        -// at all) in error.(*googleapi.Error).Header. Use
        -// googleapi.IsNotModified to check whether the returned error was
        -// because http.StatusNotModified was returned.
        -func (c *ProjectsServiceAccountGetCall) Do(opts ...googleapi.CallOption) (*ServiceAccount, error) {
        +// Do executes the "storage.projects.hmacKeys.create" call.
        +// Exactly one of *HmacKey or error will be non-nil. Any non-2xx status
        +// code is an error. Response headers are in either
        +// *HmacKey.ServerResponse.Header or (if a response was returned at all)
        +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to
        +// check whether the returned error was because http.StatusNotModified
        +// was returned.
        +func (c *ProjectsHmacKeysCreateCall) Do(opts ...googleapi.CallOption) (*HmacKey, error) {
         	gensupport.SetOptions(c.urlParams_, opts...)
         	res, err := c.doRequest("json")
         	if res != nil && res.StatusCode == http.StatusNotModified {
        @@ -11124,7 +12270,7 @@ func (c *ProjectsServiceAccountGetCall) Do(opts ...googleapi.CallOption) (*Servi
         	if err := googleapi.CheckResponse(res); err != nil {
         		return nil, err
         	}
        -	ret := &ServiceAccount{
        +	ret := &HmacKey{
         		ServerResponse: googleapi.ServerResponse{
         			Header:         res.Header,
         			HTTPStatusCode: res.StatusCode,
        @@ -11136,19 +12282,878 @@ func (c *ProjectsServiceAccountGetCall) Do(opts ...googleapi.CallOption) (*Servi
         	}
         	return ret, nil
         	// {
        -	//   "description": "Get the email address of this project's Google Cloud Storage service account.",
        -	//   "httpMethod": "GET",
        -	//   "id": "storage.projects.serviceAccount.get",
        +	//   "description": "Creates a new HMAC key for the specified service account.",
        +	//   "httpMethod": "POST",
        +	//   "id": "storage.projects.hmacKeys.create",
         	//   "parameterOrder": [
        -	//     "projectId"
        +	//     "projectId",
        +	//     "serviceAccountEmail"
         	//   ],
         	//   "parameters": {
         	//     "projectId": {
        -	//       "description": "Project ID",
        +	//       "description": "Project ID owning the service account.",
         	//       "location": "path",
         	//       "required": true,
         	//       "type": "string"
         	//     },
        +	//     "serviceAccountEmail": {
        +	//       "description": "Email address of the service account.",
        +	//       "location": "query",
        +	//       "required": true,
        +	//       "type": "string"
        +	//     },
        +	//     "userProject": {
        +	//       "description": "The project to be billed for this request.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     }
        +	//   },
        +	//   "path": "projects/{projectId}/hmacKeys",
        +	//   "response": {
        +	//     "$ref": "HmacKey"
        +	//   },
        +	//   "scopes": [
        +	//     "https://www.googleapis.com/auth/cloud-platform",
        +	//     "https://www.googleapis.com/auth/devstorage.full_control"
        +	//   ]
        +	// }
        +
        +}
        +
        +// method id "storage.projects.hmacKeys.delete":
        +
        +type ProjectsHmacKeysDeleteCall struct {
        +	s          *Service
        +	projectId  string
        +	accessId   string
        +	urlParams_ gensupport.URLParams
        +	ctx_       context.Context
        +	header_    http.Header
        +}
        +
        +// Delete: Deletes an HMAC key.
        +func (r *ProjectsHmacKeysService) Delete(projectId string, accessId string) *ProjectsHmacKeysDeleteCall {
        +	c := &ProjectsHmacKeysDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)}
        +	c.projectId = projectId
        +	c.accessId = accessId
        +	return c
        +}
        +
        +// UserProject sets the optional parameter "userProject": The project to
        +// be billed for this request.
        +func (c *ProjectsHmacKeysDeleteCall) UserProject(userProject string) *ProjectsHmacKeysDeleteCall {
        +	c.urlParams_.Set("userProject", userProject)
        +	return c
        +}
        +
        +// Fields allows partial responses to be retrieved. See
        +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
        +// for more information.
        +func (c *ProjectsHmacKeysDeleteCall) Fields(s ...googleapi.Field) *ProjectsHmacKeysDeleteCall {
        +	c.urlParams_.Set("fields", googleapi.CombineFields(s))
        +	return c
        +}
        +
        +// Context sets the context to be used in this call's Do method. Any
        +// pending HTTP request will be aborted if the provided context is
        +// canceled.
        +func (c *ProjectsHmacKeysDeleteCall) Context(ctx context.Context) *ProjectsHmacKeysDeleteCall {
        +	c.ctx_ = ctx
        +	return c
        +}
        +
        +// Header returns an http.Header that can be modified by the caller to
        +// add HTTP headers to the request.
        +func (c *ProjectsHmacKeysDeleteCall) Header() http.Header {
        +	if c.header_ == nil {
        +		c.header_ = make(http.Header)
        +	}
        +	return c.header_
        +}
        +
        +func (c *ProjectsHmacKeysDeleteCall) doRequest(alt string) (*http.Response, error) {
        +	reqHeaders := make(http.Header)
        +	for k, v := range c.header_ {
        +		reqHeaders[k] = v
        +	}
        +	reqHeaders.Set("User-Agent", c.s.userAgent())
        +	var body io.Reader = nil
        +	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
        +	urls := googleapi.ResolveRelative(c.s.BasePath, "projects/{projectId}/hmacKeys/{accessId}")
        +	urls += "?" + c.urlParams_.Encode()
        +	req, err := http.NewRequest("DELETE", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
        +	req.Header = reqHeaders
        +	googleapi.Expand(req.URL, map[string]string{
        +		"projectId": c.projectId,
        +		"accessId":  c.accessId,
        +	})
        +	return gensupport.SendRequest(c.ctx_, c.s.client, req)
        +}
        +
        +// Do executes the "storage.projects.hmacKeys.delete" call.
        +func (c *ProjectsHmacKeysDeleteCall) Do(opts ...googleapi.CallOption) error {
        +	gensupport.SetOptions(c.urlParams_, opts...)
        +	res, err := c.doRequest("json")
        +	if err != nil {
        +		return err
        +	}
        +	defer googleapi.CloseBody(res)
        +	if err := googleapi.CheckResponse(res); err != nil {
        +		return err
        +	}
        +	return nil
        +	// {
        +	//   "description": "Deletes an HMAC key.",
        +	//   "httpMethod": "DELETE",
        +	//   "id": "storage.projects.hmacKeys.delete",
        +	//   "parameterOrder": [
        +	//     "projectId",
        +	//     "accessId"
        +	//   ],
        +	//   "parameters": {
        +	//     "accessId": {
        +	//       "description": "Name of the HMAC key to be deleted.",
        +	//       "location": "path",
        +	//       "required": true,
        +	//       "type": "string"
        +	//     },
        +	//     "projectId": {
        +	//       "description": "Project ID owning the requested key",
        +	//       "location": "path",
        +	//       "required": true,
        +	//       "type": "string"
        +	//     },
        +	//     "userProject": {
        +	//       "description": "The project to be billed for this request.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     }
        +	//   },
        +	//   "path": "projects/{projectId}/hmacKeys/{accessId}",
        +	//   "scopes": [
        +	//     "https://www.googleapis.com/auth/cloud-platform",
        +	//     "https://www.googleapis.com/auth/devstorage.full_control",
        +	//     "https://www.googleapis.com/auth/devstorage.read_write"
        +	//   ]
        +	// }
        +
        +}
        +
        +// method id "storage.projects.hmacKeys.get":
        +
        +type ProjectsHmacKeysGetCall struct {
        +	s            *Service
        +	projectId    string
        +	accessId     string
        +	urlParams_   gensupport.URLParams
        +	ifNoneMatch_ string
        +	ctx_         context.Context
        +	header_      http.Header
        +}
        +
        +// Get: Retrieves an HMAC key's metadata
        +func (r *ProjectsHmacKeysService) Get(projectId string, accessId string) *ProjectsHmacKeysGetCall {
        +	c := &ProjectsHmacKeysGetCall{s: r.s, urlParams_: make(gensupport.URLParams)}
        +	c.projectId = projectId
        +	c.accessId = accessId
        +	return c
        +}
        +
        +// UserProject sets the optional parameter "userProject": The project to
        +// be billed for this request.
        +func (c *ProjectsHmacKeysGetCall) UserProject(userProject string) *ProjectsHmacKeysGetCall {
        +	c.urlParams_.Set("userProject", userProject)
        +	return c
        +}
        +
        +// Fields allows partial responses to be retrieved. See
        +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
        +// for more information.
        +func (c *ProjectsHmacKeysGetCall) Fields(s ...googleapi.Field) *ProjectsHmacKeysGetCall {
        +	c.urlParams_.Set("fields", googleapi.CombineFields(s))
        +	return c
        +}
        +
        +// IfNoneMatch sets the optional parameter which makes the operation
        +// fail if the object's ETag matches the given value. This is useful for
        +// getting updates only after the object has changed since the last
        +// request. Use googleapi.IsNotModified to check whether the response
        +// error from Do is the result of In-None-Match.
        +func (c *ProjectsHmacKeysGetCall) IfNoneMatch(entityTag string) *ProjectsHmacKeysGetCall {
        +	c.ifNoneMatch_ = entityTag
        +	return c
        +}
        +
        +// Context sets the context to be used in this call's Do method. Any
        +// pending HTTP request will be aborted if the provided context is
        +// canceled.
        +func (c *ProjectsHmacKeysGetCall) Context(ctx context.Context) *ProjectsHmacKeysGetCall {
        +	c.ctx_ = ctx
        +	return c
        +}
        +
        +// Header returns an http.Header that can be modified by the caller to
        +// add HTTP headers to the request.
        +func (c *ProjectsHmacKeysGetCall) Header() http.Header {
        +	if c.header_ == nil {
        +		c.header_ = make(http.Header)
        +	}
        +	return c.header_
        +}
        +
        +func (c *ProjectsHmacKeysGetCall) doRequest(alt string) (*http.Response, error) {
        +	reqHeaders := make(http.Header)
        +	for k, v := range c.header_ {
        +		reqHeaders[k] = v
        +	}
        +	reqHeaders.Set("User-Agent", c.s.userAgent())
        +	if c.ifNoneMatch_ != "" {
        +		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
        +	}
        +	var body io.Reader = nil
        +	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
        +	urls := googleapi.ResolveRelative(c.s.BasePath, "projects/{projectId}/hmacKeys/{accessId}")
        +	urls += "?" + c.urlParams_.Encode()
        +	req, err := http.NewRequest("GET", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
        +	req.Header = reqHeaders
        +	googleapi.Expand(req.URL, map[string]string{
        +		"projectId": c.projectId,
        +		"accessId":  c.accessId,
        +	})
        +	return gensupport.SendRequest(c.ctx_, c.s.client, req)
        +}
        +
        +// Do executes the "storage.projects.hmacKeys.get" call.
        +// Exactly one of *HmacKeyMetadata or error will be non-nil. Any non-2xx
        +// status code is an error. Response headers are in either
        +// *HmacKeyMetadata.ServerResponse.Header or (if a response was returned
        +// at all) in error.(*googleapi.Error).Header. Use
        +// googleapi.IsNotModified to check whether the returned error was
        +// because http.StatusNotModified was returned.
        +func (c *ProjectsHmacKeysGetCall) Do(opts ...googleapi.CallOption) (*HmacKeyMetadata, error) {
        +	gensupport.SetOptions(c.urlParams_, opts...)
        +	res, err := c.doRequest("json")
        +	if res != nil && res.StatusCode == http.StatusNotModified {
        +		if res.Body != nil {
        +			res.Body.Close()
        +		}
        +		return nil, &googleapi.Error{
        +			Code:   res.StatusCode,
        +			Header: res.Header,
        +		}
        +	}
        +	if err != nil {
        +		return nil, err
        +	}
        +	defer googleapi.CloseBody(res)
        +	if err := googleapi.CheckResponse(res); err != nil {
        +		return nil, err
        +	}
        +	ret := &HmacKeyMetadata{
        +		ServerResponse: googleapi.ServerResponse{
        +			Header:         res.Header,
        +			HTTPStatusCode: res.StatusCode,
        +		},
        +	}
        +	target := &ret
        +	if err := gensupport.DecodeResponse(target, res); err != nil {
        +		return nil, err
        +	}
        +	return ret, nil
        +	// {
        +	//   "description": "Retrieves an HMAC key's metadata",
        +	//   "httpMethod": "GET",
        +	//   "id": "storage.projects.hmacKeys.get",
        +	//   "parameterOrder": [
        +	//     "projectId",
        +	//     "accessId"
        +	//   ],
        +	//   "parameters": {
        +	//     "accessId": {
        +	//       "description": "Name of the HMAC key.",
        +	//       "location": "path",
        +	//       "required": true,
        +	//       "type": "string"
        +	//     },
        +	//     "projectId": {
        +	//       "description": "Project ID owning the service account of the requested key.",
        +	//       "location": "path",
        +	//       "required": true,
        +	//       "type": "string"
        +	//     },
        +	//     "userProject": {
        +	//       "description": "The project to be billed for this request.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     }
        +	//   },
        +	//   "path": "projects/{projectId}/hmacKeys/{accessId}",
        +	//   "response": {
        +	//     "$ref": "HmacKeyMetadata"
        +	//   },
        +	//   "scopes": [
        +	//     "https://www.googleapis.com/auth/cloud-platform",
        +	//     "https://www.googleapis.com/auth/cloud-platform.read-only",
        +	//     "https://www.googleapis.com/auth/devstorage.read_only"
        +	//   ]
        +	// }
        +
        +}
        +
        +// method id "storage.projects.hmacKeys.list":
        +
        +type ProjectsHmacKeysListCall struct {
        +	s            *Service
        +	projectId    string
        +	urlParams_   gensupport.URLParams
        +	ifNoneMatch_ string
        +	ctx_         context.Context
        +	header_      http.Header
        +}
        +
        +// List: Retrieves a list of HMAC keys matching the criteria.
        +func (r *ProjectsHmacKeysService) List(projectId string) *ProjectsHmacKeysListCall {
        +	c := &ProjectsHmacKeysListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
        +	c.projectId = projectId
        +	return c
        +}
        +
        +// MaxResults sets the optional parameter "maxResults": Maximum number
        +// of items to return in a single page of responses. The service uses
        +// this parameter or 250 items, whichever is smaller. The max number of
        +// items per page will also be limited by the number of distinct service
        +// accounts in the response. If the number of service accounts in a
        +// single response is too high, the page will truncated and a next page
        +// token will be returned.
        +func (c *ProjectsHmacKeysListCall) MaxResults(maxResults int64) *ProjectsHmacKeysListCall {
        +	c.urlParams_.Set("maxResults", fmt.Sprint(maxResults))
        +	return c
        +}
        +
        +// PageToken sets the optional parameter "pageToken": A
        +// previously-returned page token representing part of the larger set of
        +// results to view.
        +func (c *ProjectsHmacKeysListCall) PageToken(pageToken string) *ProjectsHmacKeysListCall {
        +	c.urlParams_.Set("pageToken", pageToken)
        +	return c
        +}
        +
        +// ServiceAccountEmail sets the optional parameter
        +// "serviceAccountEmail": If present, only keys for the given service
        +// account are returned.
        +func (c *ProjectsHmacKeysListCall) ServiceAccountEmail(serviceAccountEmail string) *ProjectsHmacKeysListCall {
        +	c.urlParams_.Set("serviceAccountEmail", serviceAccountEmail)
        +	return c
        +}
        +
        +// ShowDeletedKeys sets the optional parameter "showDeletedKeys":
        +// Whether or not to show keys in the DELETED state.
        +func (c *ProjectsHmacKeysListCall) ShowDeletedKeys(showDeletedKeys bool) *ProjectsHmacKeysListCall {
        +	c.urlParams_.Set("showDeletedKeys", fmt.Sprint(showDeletedKeys))
        +	return c
        +}
        +
        +// UserProject sets the optional parameter "userProject": The project to
        +// be billed for this request.
        +func (c *ProjectsHmacKeysListCall) UserProject(userProject string) *ProjectsHmacKeysListCall {
        +	c.urlParams_.Set("userProject", userProject)
        +	return c
        +}
        +
        +// Fields allows partial responses to be retrieved. See
        +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
        +// for more information.
        +func (c *ProjectsHmacKeysListCall) Fields(s ...googleapi.Field) *ProjectsHmacKeysListCall {
        +	c.urlParams_.Set("fields", googleapi.CombineFields(s))
        +	return c
        +}
        +
        +// IfNoneMatch sets the optional parameter which makes the operation
        +// fail if the object's ETag matches the given value. This is useful for
        +// getting updates only after the object has changed since the last
        +// request. Use googleapi.IsNotModified to check whether the response
        +// error from Do is the result of In-None-Match.
        +func (c *ProjectsHmacKeysListCall) IfNoneMatch(entityTag string) *ProjectsHmacKeysListCall {
        +	c.ifNoneMatch_ = entityTag
        +	return c
        +}
        +
        +// Context sets the context to be used in this call's Do method. Any
        +// pending HTTP request will be aborted if the provided context is
        +// canceled.
        +func (c *ProjectsHmacKeysListCall) Context(ctx context.Context) *ProjectsHmacKeysListCall {
        +	c.ctx_ = ctx
        +	return c
        +}
        +
        +// Header returns an http.Header that can be modified by the caller to
        +// add HTTP headers to the request.
        +func (c *ProjectsHmacKeysListCall) Header() http.Header {
        +	if c.header_ == nil {
        +		c.header_ = make(http.Header)
        +	}
        +	return c.header_
        +}
        +
        +func (c *ProjectsHmacKeysListCall) doRequest(alt string) (*http.Response, error) {
        +	reqHeaders := make(http.Header)
        +	for k, v := range c.header_ {
        +		reqHeaders[k] = v
        +	}
        +	reqHeaders.Set("User-Agent", c.s.userAgent())
        +	if c.ifNoneMatch_ != "" {
        +		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
        +	}
        +	var body io.Reader = nil
        +	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
        +	urls := googleapi.ResolveRelative(c.s.BasePath, "projects/{projectId}/hmacKeys")
        +	urls += "?" + c.urlParams_.Encode()
        +	req, err := http.NewRequest("GET", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
        +	req.Header = reqHeaders
        +	googleapi.Expand(req.URL, map[string]string{
        +		"projectId": c.projectId,
        +	})
        +	return gensupport.SendRequest(c.ctx_, c.s.client, req)
        +}
        +
        +// Do executes the "storage.projects.hmacKeys.list" call.
        +// Exactly one of *HmacKeysMetadata or error will be non-nil. Any
        +// non-2xx status code is an error. Response headers are in either
        +// *HmacKeysMetadata.ServerResponse.Header or (if a response was
        +// returned at all) in error.(*googleapi.Error).Header. Use
        +// googleapi.IsNotModified to check whether the returned error was
        +// because http.StatusNotModified was returned.
        +func (c *ProjectsHmacKeysListCall) Do(opts ...googleapi.CallOption) (*HmacKeysMetadata, error) {
        +	gensupport.SetOptions(c.urlParams_, opts...)
        +	res, err := c.doRequest("json")
        +	if res != nil && res.StatusCode == http.StatusNotModified {
        +		if res.Body != nil {
        +			res.Body.Close()
        +		}
        +		return nil, &googleapi.Error{
        +			Code:   res.StatusCode,
        +			Header: res.Header,
        +		}
        +	}
        +	if err != nil {
        +		return nil, err
        +	}
        +	defer googleapi.CloseBody(res)
        +	if err := googleapi.CheckResponse(res); err != nil {
        +		return nil, err
        +	}
        +	ret := &HmacKeysMetadata{
        +		ServerResponse: googleapi.ServerResponse{
        +			Header:         res.Header,
        +			HTTPStatusCode: res.StatusCode,
        +		},
        +	}
        +	target := &ret
        +	if err := gensupport.DecodeResponse(target, res); err != nil {
        +		return nil, err
        +	}
        +	return ret, nil
        +	// {
        +	//   "description": "Retrieves a list of HMAC keys matching the criteria.",
        +	//   "httpMethod": "GET",
        +	//   "id": "storage.projects.hmacKeys.list",
        +	//   "parameterOrder": [
        +	//     "projectId"
        +	//   ],
        +	//   "parameters": {
        +	//     "maxResults": {
        +	//       "default": "250",
        +	//       "description": "Maximum number of items to return in a single page of responses. The service uses this parameter or 250 items, whichever is smaller. The max number of items per page will also be limited by the number of distinct service accounts in the response. If the number of service accounts in a single response is too high, the page will truncated and a next page token will be returned.",
        +	//       "format": "uint32",
        +	//       "location": "query",
        +	//       "minimum": "0",
        +	//       "type": "integer"
        +	//     },
        +	//     "pageToken": {
        +	//       "description": "A previously-returned page token representing part of the larger set of results to view.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
        +	//     "projectId": {
        +	//       "description": "Name of the project in which to look for HMAC keys.",
        +	//       "location": "path",
        +	//       "required": true,
        +	//       "type": "string"
        +	//     },
        +	//     "serviceAccountEmail": {
        +	//       "description": "If present, only keys for the given service account are returned.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
        +	//     "showDeletedKeys": {
        +	//       "description": "Whether or not to show keys in the DELETED state.",
        +	//       "location": "query",
        +	//       "type": "boolean"
        +	//     },
        +	//     "userProject": {
        +	//       "description": "The project to be billed for this request.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     }
        +	//   },
        +	//   "path": "projects/{projectId}/hmacKeys",
        +	//   "response": {
        +	//     "$ref": "HmacKeysMetadata"
        +	//   },
        +	//   "scopes": [
        +	//     "https://www.googleapis.com/auth/cloud-platform",
        +	//     "https://www.googleapis.com/auth/cloud-platform.read-only",
        +	//     "https://www.googleapis.com/auth/devstorage.full_control",
        +	//     "https://www.googleapis.com/auth/devstorage.read_only"
        +	//   ]
        +	// }
        +
        +}
        +
        +// Pages invokes f for each page of results.
        +// A non-nil error returned from f will halt the iteration.
        +// The provided context supersedes any context provided to the Context method.
        +func (c *ProjectsHmacKeysListCall) Pages(ctx context.Context, f func(*HmacKeysMetadata) error) error {
        +	c.ctx_ = ctx
        +	defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point
        +	for {
        +		x, err := c.Do()
        +		if err != nil {
        +			return err
        +		}
        +		if err := f(x); err != nil {
        +			return err
        +		}
        +		if x.NextPageToken == "" {
        +			return nil
        +		}
        +		c.PageToken(x.NextPageToken)
        +	}
        +}
        +
        +// method id "storage.projects.hmacKeys.update":
        +
        +type ProjectsHmacKeysUpdateCall struct {
        +	s               *Service
        +	projectId       string
        +	accessId        string
        +	hmackeymetadata *HmacKeyMetadata
        +	urlParams_      gensupport.URLParams
        +	ctx_            context.Context
        +	header_         http.Header
        +}
        +
        +// Update: Updates the state of an HMAC key. See the HMAC Key resource
        +// descriptor for valid states.
        +func (r *ProjectsHmacKeysService) Update(projectId string, accessId string, hmackeymetadata *HmacKeyMetadata) *ProjectsHmacKeysUpdateCall {
        +	c := &ProjectsHmacKeysUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)}
        +	c.projectId = projectId
        +	c.accessId = accessId
        +	c.hmackeymetadata = hmackeymetadata
        +	return c
        +}
        +
        +// UserProject sets the optional parameter "userProject": The project to
        +// be billed for this request.
        +func (c *ProjectsHmacKeysUpdateCall) UserProject(userProject string) *ProjectsHmacKeysUpdateCall {
        +	c.urlParams_.Set("userProject", userProject)
        +	return c
        +}
        +
        +// Fields allows partial responses to be retrieved. See
        +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
        +// for more information.
        +func (c *ProjectsHmacKeysUpdateCall) Fields(s ...googleapi.Field) *ProjectsHmacKeysUpdateCall {
        +	c.urlParams_.Set("fields", googleapi.CombineFields(s))
        +	return c
        +}
        +
        +// Context sets the context to be used in this call's Do method. Any
        +// pending HTTP request will be aborted if the provided context is
        +// canceled.
        +func (c *ProjectsHmacKeysUpdateCall) Context(ctx context.Context) *ProjectsHmacKeysUpdateCall {
        +	c.ctx_ = ctx
        +	return c
        +}
        +
        +// Header returns an http.Header that can be modified by the caller to
        +// add HTTP headers to the request.
        +func (c *ProjectsHmacKeysUpdateCall) Header() http.Header {
        +	if c.header_ == nil {
        +		c.header_ = make(http.Header)
        +	}
        +	return c.header_
        +}
        +
        +func (c *ProjectsHmacKeysUpdateCall) doRequest(alt string) (*http.Response, error) {
        +	reqHeaders := make(http.Header)
        +	for k, v := range c.header_ {
        +		reqHeaders[k] = v
        +	}
        +	reqHeaders.Set("User-Agent", c.s.userAgent())
        +	var body io.Reader = nil
        +	body, err := googleapi.WithoutDataWrapper.JSONReader(c.hmackeymetadata)
        +	if err != nil {
        +		return nil, err
        +	}
        +	reqHeaders.Set("Content-Type", "application/json")
        +	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
        +	urls := googleapi.ResolveRelative(c.s.BasePath, "projects/{projectId}/hmacKeys/{accessId}")
        +	urls += "?" + c.urlParams_.Encode()
        +	req, err := http.NewRequest("PUT", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
        +	req.Header = reqHeaders
        +	googleapi.Expand(req.URL, map[string]string{
        +		"projectId": c.projectId,
        +		"accessId":  c.accessId,
        +	})
        +	return gensupport.SendRequest(c.ctx_, c.s.client, req)
        +}
        +
        +// Do executes the "storage.projects.hmacKeys.update" call.
        +// Exactly one of *HmacKeyMetadata or error will be non-nil. Any non-2xx
        +// status code is an error. Response headers are in either
        +// *HmacKeyMetadata.ServerResponse.Header or (if a response was returned
        +// at all) in error.(*googleapi.Error).Header. Use
        +// googleapi.IsNotModified to check whether the returned error was
        +// because http.StatusNotModified was returned.
        +func (c *ProjectsHmacKeysUpdateCall) Do(opts ...googleapi.CallOption) (*HmacKeyMetadata, error) {
        +	gensupport.SetOptions(c.urlParams_, opts...)
        +	res, err := c.doRequest("json")
        +	if res != nil && res.StatusCode == http.StatusNotModified {
        +		if res.Body != nil {
        +			res.Body.Close()
        +		}
        +		return nil, &googleapi.Error{
        +			Code:   res.StatusCode,
        +			Header: res.Header,
        +		}
        +	}
        +	if err != nil {
        +		return nil, err
        +	}
        +	defer googleapi.CloseBody(res)
        +	if err := googleapi.CheckResponse(res); err != nil {
        +		return nil, err
        +	}
        +	ret := &HmacKeyMetadata{
        +		ServerResponse: googleapi.ServerResponse{
        +			Header:         res.Header,
        +			HTTPStatusCode: res.StatusCode,
        +		},
        +	}
        +	target := &ret
        +	if err := gensupport.DecodeResponse(target, res); err != nil {
        +		return nil, err
        +	}
        +	return ret, nil
        +	// {
        +	//   "description": "Updates the state of an HMAC key. See the HMAC Key resource descriptor for valid states.",
        +	//   "httpMethod": "PUT",
        +	//   "id": "storage.projects.hmacKeys.update",
        +	//   "parameterOrder": [
        +	//     "projectId",
        +	//     "accessId"
        +	//   ],
        +	//   "parameters": {
        +	//     "accessId": {
        +	//       "description": "Name of the HMAC key being updated.",
        +	//       "location": "path",
        +	//       "required": true,
        +	//       "type": "string"
        +	//     },
        +	//     "projectId": {
        +	//       "description": "Project ID owning the service account of the updated key.",
        +	//       "location": "path",
        +	//       "required": true,
        +	//       "type": "string"
        +	//     },
        +	//     "userProject": {
        +	//       "description": "The project to be billed for this request.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     }
        +	//   },
        +	//   "path": "projects/{projectId}/hmacKeys/{accessId}",
        +	//   "request": {
        +	//     "$ref": "HmacKeyMetadata"
        +	//   },
        +	//   "response": {
        +	//     "$ref": "HmacKeyMetadata"
        +	//   },
        +	//   "scopes": [
        +	//     "https://www.googleapis.com/auth/cloud-platform",
        +	//     "https://www.googleapis.com/auth/devstorage.full_control"
        +	//   ]
        +	// }
        +
        +}
        +
        +// method id "storage.projects.serviceAccount.get":
        +
        +type ProjectsServiceAccountGetCall struct {
        +	s            *Service
        +	projectId    string
        +	urlParams_   gensupport.URLParams
        +	ifNoneMatch_ string
        +	ctx_         context.Context
        +	header_      http.Header
        +}
        +
        +// Get: Get the email address of this project's Google Cloud Storage
        +// service account.
        +func (r *ProjectsServiceAccountService) Get(projectId string) *ProjectsServiceAccountGetCall {
        +	c := &ProjectsServiceAccountGetCall{s: r.s, urlParams_: make(gensupport.URLParams)}
        +	c.projectId = projectId
        +	return c
        +}
        +
        +// ProvisionalUserProject sets the optional parameter
        +// "provisionalUserProject": The project to be billed for this request
        +// if the target bucket is requester-pays bucket.
        +func (c *ProjectsServiceAccountGetCall) ProvisionalUserProject(provisionalUserProject string) *ProjectsServiceAccountGetCall {
        +	c.urlParams_.Set("provisionalUserProject", provisionalUserProject)
        +	return c
        +}
        +
        +// UserProject sets the optional parameter "userProject": The project to
        +// be billed for this request.
        +func (c *ProjectsServiceAccountGetCall) UserProject(userProject string) *ProjectsServiceAccountGetCall {
        +	c.urlParams_.Set("userProject", userProject)
        +	return c
        +}
        +
        +// Fields allows partial responses to be retrieved. See
        +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
        +// for more information.
        +func (c *ProjectsServiceAccountGetCall) Fields(s ...googleapi.Field) *ProjectsServiceAccountGetCall {
        +	c.urlParams_.Set("fields", googleapi.CombineFields(s))
        +	return c
        +}
        +
        +// IfNoneMatch sets the optional parameter which makes the operation
        +// fail if the object's ETag matches the given value. This is useful for
        +// getting updates only after the object has changed since the last
        +// request. Use googleapi.IsNotModified to check whether the response
        +// error from Do is the result of In-None-Match.
        +func (c *ProjectsServiceAccountGetCall) IfNoneMatch(entityTag string) *ProjectsServiceAccountGetCall {
        +	c.ifNoneMatch_ = entityTag
        +	return c
        +}
        +
        +// Context sets the context to be used in this call's Do method. Any
        +// pending HTTP request will be aborted if the provided context is
        +// canceled.
        +func (c *ProjectsServiceAccountGetCall) Context(ctx context.Context) *ProjectsServiceAccountGetCall {
        +	c.ctx_ = ctx
        +	return c
        +}
        +
        +// Header returns an http.Header that can be modified by the caller to
        +// add HTTP headers to the request.
        +func (c *ProjectsServiceAccountGetCall) Header() http.Header {
        +	if c.header_ == nil {
        +		c.header_ = make(http.Header)
        +	}
        +	return c.header_
        +}
        +
        +func (c *ProjectsServiceAccountGetCall) doRequest(alt string) (*http.Response, error) {
        +	reqHeaders := make(http.Header)
        +	for k, v := range c.header_ {
        +		reqHeaders[k] = v
        +	}
        +	reqHeaders.Set("User-Agent", c.s.userAgent())
        +	if c.ifNoneMatch_ != "" {
        +		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
        +	}
        +	var body io.Reader = nil
        +	c.urlParams_.Set("alt", alt)
        +	c.urlParams_.Set("prettyPrint", "false")
        +	urls := googleapi.ResolveRelative(c.s.BasePath, "projects/{projectId}/serviceAccount")
        +	urls += "?" + c.urlParams_.Encode()
        +	req, err := http.NewRequest("GET", urls, body)
        +	if err != nil {
        +		return nil, err
        +	}
        +	req.Header = reqHeaders
        +	googleapi.Expand(req.URL, map[string]string{
        +		"projectId": c.projectId,
        +	})
        +	return gensupport.SendRequest(c.ctx_, c.s.client, req)
        +}
        +
        +// Do executes the "storage.projects.serviceAccount.get" call.
        +// Exactly one of *ServiceAccount or error will be non-nil. Any non-2xx
        +// status code is an error. Response headers are in either
        +// *ServiceAccount.ServerResponse.Header or (if a response was returned
        +// at all) in error.(*googleapi.Error).Header. Use
        +// googleapi.IsNotModified to check whether the returned error was
        +// because http.StatusNotModified was returned.
        +func (c *ProjectsServiceAccountGetCall) Do(opts ...googleapi.CallOption) (*ServiceAccount, error) {
        +	gensupport.SetOptions(c.urlParams_, opts...)
        +	res, err := c.doRequest("json")
        +	if res != nil && res.StatusCode == http.StatusNotModified {
        +		if res.Body != nil {
        +			res.Body.Close()
        +		}
        +		return nil, &googleapi.Error{
        +			Code:   res.StatusCode,
        +			Header: res.Header,
        +		}
        +	}
        +	if err != nil {
        +		return nil, err
        +	}
        +	defer googleapi.CloseBody(res)
        +	if err := googleapi.CheckResponse(res); err != nil {
        +		return nil, err
        +	}
        +	ret := &ServiceAccount{
        +		ServerResponse: googleapi.ServerResponse{
        +			Header:         res.Header,
        +			HTTPStatusCode: res.StatusCode,
        +		},
        +	}
        +	target := &ret
        +	if err := gensupport.DecodeResponse(target, res); err != nil {
        +		return nil, err
        +	}
        +	return ret, nil
        +	// {
        +	//   "description": "Get the email address of this project's Google Cloud Storage service account.",
        +	//   "httpMethod": "GET",
        +	//   "id": "storage.projects.serviceAccount.get",
        +	//   "parameterOrder": [
        +	//     "projectId"
        +	//   ],
        +	//   "parameters": {
        +	//     "projectId": {
        +	//       "description": "Project ID",
        +	//       "location": "path",
        +	//       "required": true,
        +	//       "type": "string"
        +	//     },
        +	//     "provisionalUserProject": {
        +	//       "description": "The project to be billed for this request if the target bucket is requester-pays bucket.",
        +	//       "location": "query",
        +	//       "type": "string"
        +	//     },
         	//     "userProject": {
         	//       "description": "The project to be billed for this request.",
         	//       "location": "query",
        diff --git a/vendor/google.golang.org/api/transport/http/dial.go b/vendor/google.golang.org/api/transport/http/dial.go
        index df34c6810..c0d8bf20b 100644
        --- a/vendor/google.golang.org/api/transport/http/dial.go
        +++ b/vendor/google.golang.org/api/transport/http/dial.go
        @@ -1,4 +1,4 @@
        -// Copyright 2015 Google Inc. All Rights Reserved.
        +// Copyright 2015 Google LLC
         //
         // Licensed under the Apache License, Version 2.0 (the "License");
         // you may not use this file except in compliance with the License.
        @@ -12,73 +12,109 @@
         // See the License for the specific language governing permissions and
         // limitations under the License.
         
        -// Package transport/http supports network connections to HTTP servers.
        +// Package http supports network connections to HTTP servers.
         // This package is not intended for use by end developers. Use the
         // google.golang.org/api/option package to configure API clients.
         package http
         
         import (
        +	"context"
         	"errors"
         	"net/http"
         
        -	"golang.org/x/net/context"
        +	"go.opencensus.io/plugin/ochttp"
         	"golang.org/x/oauth2"
         	"google.golang.org/api/googleapi/transport"
         	"google.golang.org/api/internal"
         	"google.golang.org/api/option"
        +	"google.golang.org/api/transport/http/internal/propagation"
         )
         
         // NewClient returns an HTTP client for use communicating with a Google cloud
         // service, configured with the given ClientOptions. It also returns the endpoint
         // for the service as specified in the options.
         func NewClient(ctx context.Context, opts ...option.ClientOption) (*http.Client, string, error) {
        -	var o internal.DialSettings
        -	for _, opt := range opts {
        -		opt.Apply(&o)
        +	settings, err := newSettings(opts)
        +	if err != nil {
        +		return nil, "", err
         	}
        -	if err := o.Validate(); err != nil {
        +	// TODO(cbro): consider injecting the User-Agent even if an explicit HTTP client is provided?
        +	if settings.HTTPClient != nil {
        +		return settings.HTTPClient, settings.Endpoint, nil
        +	}
        +	trans, err := newTransport(ctx, defaultBaseTransport(ctx), settings)
        +	if err != nil {
         		return nil, "", err
         	}
        -	if o.GRPCConn != nil {
        -		return nil, "", errors.New("unsupported gRPC connection specified")
        +	return &http.Client{Transport: trans}, settings.Endpoint, nil
        +}
        +
        +// NewTransport creates an http.RoundTripper for use communicating with a Google
        +// cloud service, configured with the given ClientOptions. Its RoundTrip method delegates to base.
        +func NewTransport(ctx context.Context, base http.RoundTripper, opts ...option.ClientOption) (http.RoundTripper, error) {
        +	settings, err := newSettings(opts)
        +	if err != nil {
        +		return nil, err
         	}
        -	// TODO(cbro): consider injecting the User-Agent even if an explicit HTTP client is provided?
        -	if o.HTTPClient != nil {
        -		return o.HTTPClient, o.Endpoint, nil
        +	if settings.HTTPClient != nil {
        +		return nil, errors.New("transport/http: WithHTTPClient passed to NewTransport")
         	}
        -	trans := baseTransport(ctx)
        -	trans = userAgentTransport{
        -		base:      trans,
        -		userAgent: o.UserAgent,
        +	return newTransport(ctx, base, settings)
        +}
        +
        +func newTransport(ctx context.Context, base http.RoundTripper, settings *internal.DialSettings) (http.RoundTripper, error) {
        +	trans := base
        +	trans = parameterTransport{
        +		base:          trans,
        +		userAgent:     settings.UserAgent,
        +		quotaProject:  settings.QuotaProject,
        +		requestReason: settings.RequestReason,
         	}
         	trans = addOCTransport(trans)
         	switch {
        -	case o.NoAuth:
        +	case settings.NoAuth:
         		// Do nothing.
        -	case o.APIKey != "":
        +	case settings.APIKey != "":
         		trans = &transport.APIKey{
         			Transport: trans,
        -			Key:       o.APIKey,
        +			Key:       settings.APIKey,
         		}
         	default:
        -		creds, err := internal.Creds(ctx, &o)
        +		creds, err := internal.Creds(ctx, settings)
         		if err != nil {
        -			return nil, "", err
        +			return nil, err
         		}
         		trans = &oauth2.Transport{
         			Base:   trans,
         			Source: creds.TokenSource,
         		}
         	}
        -	return &http.Client{Transport: trans}, o.Endpoint, nil
        +	return trans, nil
         }
         
        -type userAgentTransport struct {
        -	userAgent string
        -	base      http.RoundTripper
        +func newSettings(opts []option.ClientOption) (*internal.DialSettings, error) {
        +	var o internal.DialSettings
        +	for _, opt := range opts {
        +		opt.Apply(&o)
        +	}
        +	if err := o.Validate(); err != nil {
        +		return nil, err
        +	}
        +	if o.GRPCConn != nil {
        +		return nil, errors.New("unsupported gRPC connection specified")
        +	}
        +	return &o, nil
        +}
        +
        +type parameterTransport struct {
        +	userAgent     string
        +	quotaProject  string
        +	requestReason string
        +
        +	base http.RoundTripper
         }
         
        -func (t userAgentTransport) RoundTrip(req *http.Request) (*http.Response, error) {
        +func (t parameterTransport) RoundTrip(req *http.Request) (*http.Response, error) {
         	rt := t.base
         	if rt == nil {
         		return nil, errors.New("transport: no Transport specified")
        @@ -92,18 +128,34 @@ func (t userAgentTransport) RoundTrip(req *http.Request) (*http.Response, error)
         		newReq.Header[k] = vv
         	}
         	// TODO(cbro): append to existing User-Agent header?
        -	newReq.Header["User-Agent"] = []string{t.userAgent}
        +	newReq.Header.Set("User-Agent", t.userAgent)
        +
        +	// Attach system parameters into the header
        +	if t.quotaProject != "" {
        +		newReq.Header.Set("X-Goog-User-Project", t.quotaProject)
        +	}
        +	if t.requestReason != "" {
        +		newReq.Header.Set("X-Goog-Request-Reason", t.requestReason)
        +	}
        +
         	return rt.RoundTrip(&newReq)
         }
         
         // Set at init time by dial_appengine.go. If nil, we're not on App Engine.
         var appengineUrlfetchHook func(context.Context) http.RoundTripper
         
        -// baseTransport returns the base HTTP transport.
        +// defaultBaseTransport returns the base HTTP transport.
         // On App Engine, this is urlfetch.Transport, otherwise it's http.DefaultTransport.
        -func baseTransport(ctx context.Context) http.RoundTripper {
        +func defaultBaseTransport(ctx context.Context) http.RoundTripper {
         	if appengineUrlfetchHook != nil {
         		return appengineUrlfetchHook(ctx)
         	}
         	return http.DefaultTransport
         }
        +
        +func addOCTransport(trans http.RoundTripper) http.RoundTripper {
        +	return &ochttp.Transport{
        +		Base:        trans,
        +		Propagation: &propagation.HTTPFormat{},
        +	}
        +}
        diff --git a/vendor/google.golang.org/api/transport/http/dial_appengine.go b/vendor/google.golang.org/api/transport/http/dial_appengine.go
        index 0cdef74ac..04c81413c 100644
        --- a/vendor/google.golang.org/api/transport/http/dial_appengine.go
        +++ b/vendor/google.golang.org/api/transport/http/dial_appengine.go
        @@ -1,4 +1,4 @@
        -// Copyright 2016 Google Inc. All Rights Reserved.
        +// Copyright 2016 Google LLC
         //
         // Licensed under the Apache License, Version 2.0 (the "License");
         // you may not use this file except in compliance with the License.
        @@ -17,9 +17,9 @@
         package http
         
         import (
        +	"context"
         	"net/http"
         
        -	"golang.org/x/net/context"
         	"google.golang.org/appengine/urlfetch"
         )
         
        diff --git a/vendor/google.golang.org/api/transport/http/go18.go b/vendor/google.golang.org/api/transport/http/go18.go
        deleted file mode 100644
        index 1d4bb8e7f..000000000
        --- a/vendor/google.golang.org/api/transport/http/go18.go
        +++ /dev/null
        @@ -1,31 +0,0 @@
        -// Copyright 2018 Google Inc. All Rights Reserved.
        -//
        -// Licensed under the Apache License, Version 2.0 (the "License");
        -// you may not use this file except in compliance with the License.
        -// You may obtain a copy of the License at
        -//
        -//      http://www.apache.org/licenses/LICENSE-2.0
        -//
        -// Unless required by applicable law or agreed to in writing, software
        -// distributed under the License is distributed on an "AS IS" BASIS,
        -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        -// See the License for the specific language governing permissions and
        -// limitations under the License.
        -
        -// +build go1.8
        -
        -package http
        -
        -import (
        -	"net/http"
        -
        -	"go.opencensus.io/exporter/stackdriver/propagation"
        -	"go.opencensus.io/plugin/ochttp"
        -)
        -
        -func addOCTransport(trans http.RoundTripper) http.RoundTripper {
        -	return &ochttp.Transport{
        -		Base:        trans,
        -		Propagation: &propagation.HTTPFormat{},
        -	}
        -}
        diff --git a/vendor/google.golang.org/api/transport/http/internal/propagation/http.go b/vendor/google.golang.org/api/transport/http/internal/propagation/http.go
        new file mode 100644
        index 000000000..24b4f0d29
        --- /dev/null
        +++ b/vendor/google.golang.org/api/transport/http/internal/propagation/http.go
        @@ -0,0 +1,96 @@
        +// Copyright 2018 Google LLC
        +//
        +// Licensed under the Apache License, Version 2.0 (the "License");
        +// you may not use this file except in compliance with the License.
        +// You may obtain a copy of the License at
        +//
        +//      http://www.apache.org/licenses/LICENSE-2.0
        +//
        +// Unless required by applicable law or agreed to in writing, software
        +// distributed under the License is distributed on an "AS IS" BASIS,
        +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        +// See the License for the specific language governing permissions and
        +// limitations under the License.
        +
        +// +build go1.8
        +
        +// Package propagation implements X-Cloud-Trace-Context header propagation used
        +// by Google Cloud products.
        +package propagation
        +
        +import (
        +	"encoding/binary"
        +	"encoding/hex"
        +	"fmt"
        +	"net/http"
        +	"strconv"
        +	"strings"
        +
        +	"go.opencensus.io/trace"
        +	"go.opencensus.io/trace/propagation"
        +)
        +
        +const (
        +	httpHeaderMaxSize = 200
        +	httpHeader        = `X-Cloud-Trace-Context`
        +)
        +
        +var _ propagation.HTTPFormat = (*HTTPFormat)(nil)
        +
        +// HTTPFormat implements propagation.HTTPFormat to propagate
        +// traces in HTTP headers for Google Cloud Platform and Stackdriver Trace.
        +type HTTPFormat struct{}
        +
        +// SpanContextFromRequest extracts a Stackdriver Trace span context from incoming requests.
        +func (f *HTTPFormat) SpanContextFromRequest(req *http.Request) (sc trace.SpanContext, ok bool) {
        +	h := req.Header.Get(httpHeader)
        +	// See https://cloud.google.com/trace/docs/faq for the header HTTPFormat.
        +	// Return if the header is empty or missing, or if the header is unreasonably
        +	// large, to avoid making unnecessary copies of a large string.
        +	if h == "" || len(h) > httpHeaderMaxSize {
        +		return trace.SpanContext{}, false
        +	}
        +
        +	// Parse the trace id field.
        +	slash := strings.Index(h, `/`)
        +	if slash == -1 {
        +		return trace.SpanContext{}, false
        +	}
        +	tid, h := h[:slash], h[slash+1:]
        +
        +	buf, err := hex.DecodeString(tid)
        +	if err != nil {
        +		return trace.SpanContext{}, false
        +	}
        +	copy(sc.TraceID[:], buf)
        +
        +	// Parse the span id field.
        +	spanstr := h
        +	semicolon := strings.Index(h, `;`)
        +	if semicolon != -1 {
        +		spanstr, h = h[:semicolon], h[semicolon+1:]
        +	}
        +	sid, err := strconv.ParseUint(spanstr, 10, 64)
        +	if err != nil {
        +		return trace.SpanContext{}, false
        +	}
        +	binary.BigEndian.PutUint64(sc.SpanID[:], sid)
        +
        +	// Parse the options field, options field is optional.
        +	if !strings.HasPrefix(h, "o=") {
        +		return sc, true
        +	}
        +	o, err := strconv.ParseUint(h[2:], 10, 64)
        +	if err != nil {
        +		return trace.SpanContext{}, false
        +	}
        +	sc.TraceOptions = trace.TraceOptions(o)
        +	return sc, true
        +}
        +
        +// SpanContextToRequest modifies the given request to include a Stackdriver Trace header.
        +func (f *HTTPFormat) SpanContextToRequest(sc trace.SpanContext, req *http.Request) {
        +	sid := binary.BigEndian.Uint64(sc.SpanID[:])
        +	header := fmt.Sprintf("%s/%d;o=%d", hex.EncodeToString(sc.TraceID[:]), sid, int64(sc.TraceOptions))
        +	req.Header.Set(httpHeader, header)
        +}
        diff --git a/vendor/google.golang.org/api/transport/http/not_go18.go b/vendor/google.golang.org/api/transport/http/not_go18.go
        deleted file mode 100644
        index 628a21a84..000000000
        --- a/vendor/google.golang.org/api/transport/http/not_go18.go
        +++ /dev/null
        @@ -1,21 +0,0 @@
        -// Copyright 2018 Google Inc. All Rights Reserved.
        -//
        -// Licensed under the Apache License, Version 2.0 (the "License");
        -// you may not use this file except in compliance with the License.
        -// You may obtain a copy of the License at
        -//
        -//      http://www.apache.org/licenses/LICENSE-2.0
        -//
        -// Unless required by applicable law or agreed to in writing, software
        -// distributed under the License is distributed on an "AS IS" BASIS,
        -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        -// See the License for the specific language governing permissions and
        -// limitations under the License.
        -
        -// +build !go1.8
        -
        -package http
        -
        -import "net/http"
        -
        -func addOCTransport(trans http.RoundTripper) http.RoundTripper { return trans }
        diff --git a/vendor/google.golang.org/appengine/.travis.yml b/vendor/google.golang.org/appengine/.travis.yml
        index 0762cb91b..70ffe89d5 100644
        --- a/vendor/google.golang.org/appengine/.travis.yml
        +++ b/vendor/google.golang.org/appengine/.travis.yml
        @@ -1,18 +1,20 @@
         language: go
         
        -go:
        -  - 1.6.3
        -  - 1.7.1
        +go_import_path: google.golang.org/appengine
         
         install:
        -  - go get -v -t -d google.golang.org/appengine/...
        -  - mkdir sdk
        -  - curl -o sdk.zip "https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-1.9.40.zip"
        -  - unzip -q sdk.zip -d sdk
        -  - export APPENGINE_DEV_APPSERVER=$(pwd)/sdk/go_appengine/dev_appserver.py
        +  - ./travis_install.sh
         
         script:
        -  - go version
        -  - go test -v google.golang.org/appengine/...
        -  - go test -v -race google.golang.org/appengine/...
        -  - sdk/go_appengine/goapp test -v google.golang.org/appengine/...
        +  - ./travis_test.sh
        +
        +matrix:
        +  include:
        +    - go: 1.8.x
        +      env: GOAPP=true
        +    - go: 1.9.x
        +      env: GOAPP=true
        +    - go: 1.10.x
        +      env: GOAPP=false
        +    - go: 1.11.x
        +      env: GO111MODULE=on
        diff --git a/vendor/google.golang.org/appengine/CONTRIBUTING.md b/vendor/google.golang.org/appengine/CONTRIBUTING.md
        new file mode 100644
        index 000000000..ffc298520
        --- /dev/null
        +++ b/vendor/google.golang.org/appengine/CONTRIBUTING.md
        @@ -0,0 +1,90 @@
        +# Contributing
        +
        +1. Sign one of the contributor license agreements below.
        +1. Get the package:
        +
        +    `go get -d google.golang.org/appengine`
        +1. Change into the checked out source:
        +
        +    `cd $GOPATH/src/google.golang.org/appengine`
        +1. Fork the repo.
        +1. Set your fork as a remote:
        +
        +    `git remote add fork git@github.com:GITHUB_USERNAME/appengine.git`
        +1. Make changes, commit to your fork.
        +1. Send a pull request with your changes. 
        +   The first line of your commit message is conventionally a one-line summary of the change, prefixed by the primary affected package, and is used as the title of your pull request.
        +
        +# Testing
        +
        +## Running system tests
        +
        +Download and install the [Go App Engine SDK](https://cloud.google.com/appengine/docs/go/download). Make sure the `go_appengine` dir is in your `PATH`.
        +
        +Set the `APPENGINE_DEV_APPSERVER` environment variable to `/path/to/go_appengine/dev_appserver.py`.
        +
        +Run tests with `goapp test`:
        +
        +```
        +goapp test -v google.golang.org/appengine/...
        +```
        +
        +## Contributor License Agreements
        +
        +Before we can accept your pull requests you'll need to sign a Contributor
        +License Agreement (CLA):
        +
        +- **If you are an individual writing original source code** and **you own the
        +intellectual property**, then you'll need to sign an [individual CLA][indvcla].
        +- **If you work for a company that wants to allow you to contribute your work**,
        +then you'll need to sign a [corporate CLA][corpcla].
        +
        +You can sign these electronically (just scroll to the bottom). After that,
        +we'll be able to accept your pull requests.
        +
        +## Contributor Code of Conduct
        +
        +As contributors and maintainers of this project,
        +and in the interest of fostering an open and welcoming community,
        +we pledge to respect all people who contribute through reporting issues,
        +posting feature requests, updating documentation,
        +submitting pull requests or patches, and other activities.
        +
        +We are committed to making participation in this project
        +a harassment-free experience for everyone,
        +regardless of level of experience, gender, gender identity and expression,
        +sexual orientation, disability, personal appearance,
        +body size, race, ethnicity, age, religion, or nationality.
        +
        +Examples of unacceptable behavior by participants include:
        +
        +* The use of sexualized language or imagery
        +* Personal attacks
        +* Trolling or insulting/derogatory comments
        +* Public or private harassment
        +* Publishing other's private information,
        +such as physical or electronic
        +addresses, without explicit permission
        +* Other unethical or unprofessional conduct.
        +
        +Project maintainers have the right and responsibility to remove, edit, or reject
        +comments, commits, code, wiki edits, issues, and other contributions
        +that are not aligned to this Code of Conduct.
        +By adopting this Code of Conduct,
        +project maintainers commit themselves to fairly and consistently
        +applying these principles to every aspect of managing this project.
        +Project maintainers who do not follow or enforce the Code of Conduct
        +may be permanently removed from the project team.
        +
        +This code of conduct applies both within project spaces and in public spaces
        +when an individual is representing the project or its community.
        +
        +Instances of abusive, harassing, or otherwise unacceptable behavior
        +may be reported by opening an issue
        +or contacting one or more of the project maintainers.
        +
        +This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.2.0,
        +available at [http://contributor-covenant.org/version/1/2/0/](http://contributor-covenant.org/version/1/2/0/)
        +
        +[indvcla]: https://developers.google.com/open-source/cla/individual
        +[corpcla]: https://developers.google.com/open-source/cla/corporate
        diff --git a/vendor/google.golang.org/appengine/README.md b/vendor/google.golang.org/appengine/README.md
        index b6b11d958..d86768a2c 100644
        --- a/vendor/google.golang.org/appengine/README.md
        +++ b/vendor/google.golang.org/appengine/README.md
        @@ -2,19 +2,27 @@
         
         [![Build Status](https://travis-ci.org/golang/appengine.svg)](https://travis-ci.org/golang/appengine)
         
        -This repository supports the Go runtime on App Engine,
        -including both the standard App Engine and the
        -"App Engine flexible environment" (formerly known as "Managed VMs").
        +This repository supports the Go runtime on *App Engine standard*.
         It provides APIs for interacting with App Engine services.
         Its canonical import path is `google.golang.org/appengine`.
         
         See https://cloud.google.com/appengine/docs/go/
         for more information.
         
        -File issue reports and feature requests on the [Google App Engine issue
        -tracker](https://code.google.com/p/googleappengine/issues/entry?template=Go%20defect).
        +File issue reports and feature requests on the [GitHub's issue
        +tracker](https://github.com/golang/appengine/issues).
        +
        +## Upgrading an App Engine app to the flexible environment
        +
        +This package does not work on *App Engine flexible*.
        +
        +There are many differences between the App Engine standard environment and
        +the flexible environment.
        +
        +See the [documentation on upgrading to the flexible environment](https://cloud.google.com/appengine/docs/flexible/go/upgrading).
         
         ## Directory structure
        +
         The top level directory of this repository is the `appengine` package. It
         contains the
         basic APIs (e.g. `appengine.NewContext`) that apply across APIs. Specific API
        @@ -24,32 +32,24 @@ There is an `internal` subdirectory that contains service protocol buffers,
         plus packages required for connectivity to make API calls. App Engine apps
         should not directly import any package under `internal`.
         
        -## Updating a Go App Engine app
        -
        -This section describes how to update an older Go App Engine app to use
        -these packages. A provided tool, `aefix`, can help automate steps 2 and 3
        -(run `go get google.golang.org/appengine/cmd/aefix` to install it), but
        -read the details below since `aefix` can't perform all the changes.
        +## Updating from legacy (`import "appengine"`) packages
         
        -### 1. Update YAML files (App Engine flexible environment / Managed VMs only)
        +If you're currently using the bare `appengine` packages
        +(that is, not these ones, imported via `google.golang.org/appengine`),
        +then you can use the `aefix` tool to help automate an upgrade to these packages.
         
        -The `app.yaml` file (and YAML files for modules) should have these new lines added:
        -```
        -vm: true
        -```
        -See https://cloud.google.com/appengine/docs/go/modules/#Go_Instance_scaling_and_class for details.
        +Run `go get google.golang.org/appengine/cmd/aefix` to install it.
         
        -### 2. Update import paths
        +### 1. Update import paths
         
         The import paths for App Engine packages are now fully qualified, based at `google.golang.org/appengine`.
         You will need to update your code to use import paths starting with that; for instance,
         code importing `appengine/datastore` will now need to import `google.golang.org/appengine/datastore`.
         
        -### 3. Update code using deprecated, removed or modified APIs
        +### 2. Update code using deprecated, removed or modified APIs
         
         Most App Engine services are available with exactly the same API.
        -A few APIs were cleaned up, and some are not available yet.
        -This list summarises the differences:
        +A few APIs were cleaned up, and there are some differences:
         
         * `appengine.Context` has been replaced with the `Context` type from `golang.org/x/net/context`.
         * Logging methods that were on `appengine.Context` are now functions in `google.golang.org/appengine/log`.
        diff --git a/vendor/google.golang.org/appengine/appengine.go b/vendor/google.golang.org/appengine/appengine.go
        index 475cf2e32..0cca033d3 100644
        --- a/vendor/google.golang.org/appengine/appengine.go
        +++ b/vendor/google.golang.org/appengine/appengine.go
        @@ -28,7 +28,8 @@ import (
         // See https://cloud.google.com/appengine/docs/flexible/custom-runtimes#health_check_requests
         // for details on how to do your own health checking.
         //
        -// Main is not yet supported on App Engine Standard.
        +// On App Engine Standard it ensures the server has started and is prepared to
        +// receive requests.
         //
         // Main never returns.
         //
        @@ -59,10 +60,34 @@ func IsDevAppServer() bool {
         	return internal.IsDevAppServer()
         }
         
        +// IsStandard reports whether the App Engine app is running in the standard
        +// environment. This includes both the first generation runtimes (<= Go 1.9)
        +// and the second generation runtimes (>= Go 1.11).
        +func IsStandard() bool {
        +	return internal.IsStandard()
        +}
        +
        +// IsFlex reports whether the App Engine app is running in the flexible environment.
        +func IsFlex() bool {
        +	return internal.IsFlex()
        +}
        +
        +// IsAppEngine reports whether the App Engine app is running on App Engine, in either
        +// the standard or flexible environment.
        +func IsAppEngine() bool {
        +	return internal.IsAppEngine()
        +}
        +
        +// IsSecondGen reports whether the App Engine app is running on the second generation
        +// runtimes (>= Go 1.11).
        +func IsSecondGen() bool {
        +	return internal.IsSecondGen()
        +}
        +
         // NewContext returns a context for an in-flight HTTP request.
         // This function is cheap.
         func NewContext(req *http.Request) context.Context {
        -	return WithContext(context.Background(), req)
        +	return internal.ReqContext(req)
         }
         
         // WithContext returns a copy of the parent context
        diff --git a/vendor/google.golang.org/appengine/go.mod b/vendor/google.golang.org/appengine/go.mod
        new file mode 100644
        index 000000000..f449359d2
        --- /dev/null
        +++ b/vendor/google.golang.org/appengine/go.mod
        @@ -0,0 +1,7 @@
        +module google.golang.org/appengine
        +
        +require (
        +	github.com/golang/protobuf v1.2.0
        +	golang.org/x/net v0.0.0-20180724234803-3673e40ba225
        +	golang.org/x/text v0.3.0
        +)
        diff --git a/vendor/google.golang.org/appengine/go.sum b/vendor/google.golang.org/appengine/go.sum
        new file mode 100644
        index 000000000..1a221c089
        --- /dev/null
        +++ b/vendor/google.golang.org/appengine/go.sum
        @@ -0,0 +1,6 @@
        +github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
        +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
        +golang.org/x/net v0.0.0-20180724234803-3673e40ba225 h1:kNX+jCowfMYzvlSvJu5pQWEmyWFrBXJ3PBy10xKMXK8=
        +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
        +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
        +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
        diff --git a/vendor/google.golang.org/appengine/internal/api.go b/vendor/google.golang.org/appengine/internal/api.go
        index ec5aa59b3..bbc1cb9c3 100644
        --- a/vendor/google.golang.org/appengine/internal/api.go
        +++ b/vendor/google.golang.org/appengine/internal/api.go
        @@ -32,7 +32,8 @@ import (
         )
         
         const (
        -	apiPath = "/rpc_http"
        +	apiPath             = "/rpc_http"
        +	defaultTicketSuffix = "/default.20150612t184001.0"
         )
         
         var (
        @@ -60,6 +61,11 @@ var (
         			Dial:  limitDial,
         		},
         	}
        +
        +	defaultTicketOnce     sync.Once
        +	defaultTicket         string
        +	backgroundContextOnce sync.Once
        +	backgroundContext     netcontext.Context
         )
         
         func apiURL() *url.URL {
        @@ -83,16 +89,10 @@ func handleHTTP(w http.ResponseWriter, r *http.Request) {
         		outHeader: w.Header(),
         		apiURL:    apiURL(),
         	}
        -	stopFlushing := make(chan int)
        +	r = r.WithContext(withContext(r.Context(), c))
        +	c.req = r
         
        -	ctxs.Lock()
        -	ctxs.m[r] = c
        -	ctxs.Unlock()
        -	defer func() {
        -		ctxs.Lock()
        -		delete(ctxs.m, r)
        -		ctxs.Unlock()
        -	}()
        +	stopFlushing := make(chan int)
         
         	// Patch up RemoteAddr so it looks reasonable.
         	if addr := r.Header.Get(userIPHeader); addr != "" {
        @@ -129,7 +129,13 @@ func handleHTTP(w http.ResponseWriter, r *http.Request) {
         		flushes++
         	}
         	c.pendingLogs.Unlock()
        -	go c.flushLog(false)
        +	flushed := make(chan struct{})
        +	go func() {
        +		defer close(flushed)
        +		// Force a log flush, because with very short requests we
        +		// may not ever flush logs.
        +		c.flushLog(true)
        +	}()
         	w.Header().Set(logFlushHeader, strconv.Itoa(flushes))
         
         	// Avoid nil Write call if c.Write is never called.
        @@ -139,6 +145,9 @@ func handleHTTP(w http.ResponseWriter, r *http.Request) {
         	if c.outBody != nil {
         		w.Write(c.outBody)
         	}
        +	// Wait for the last flush to complete before returning,
        +	// otherwise the security ticket will not be valid.
        +	<-flushed
         }
         
         func executeRequestSafely(c *context, r *http.Request) {
        @@ -191,18 +200,6 @@ func renderPanic(x interface{}) string {
         	return string(buf)
         }
         
        -var ctxs = struct {
        -	sync.Mutex
        -	m  map[*http.Request]*context
        -	bg *context // background context, lazily initialized
        -	// dec is used by tests to decorate the netcontext.Context returned
        -	// for a given request. This allows tests to add overrides (such as
        -	// WithAppIDOverride) to the context. The map is nil outside tests.
        -	dec map[*http.Request]func(netcontext.Context) netcontext.Context
        -}{
        -	m: make(map[*http.Request]*context),
        -}
        -
         // context represents the context of an in-flight HTTP request.
         // It implements the appengine.Context and http.ResponseWriter interfaces.
         type context struct {
        @@ -223,6 +220,34 @@ type context struct {
         
         var contextKey = "holds a *context"
         
        +// jointContext joins two contexts in a superficial way.
        +// It takes values and timeouts from a base context, and only values from another context.
        +type jointContext struct {
        +	base       netcontext.Context
        +	valuesOnly netcontext.Context
        +}
        +
        +func (c jointContext) Deadline() (time.Time, bool) {
        +	return c.base.Deadline()
        +}
        +
        +func (c jointContext) Done() <-chan struct{} {
        +	return c.base.Done()
        +}
        +
        +func (c jointContext) Err() error {
        +	return c.base.Err()
        +}
        +
        +func (c jointContext) Value(key interface{}) interface{} {
        +	if val := c.base.Value(key); val != nil {
        +		return val
        +	}
        +	return c.valuesOnly.Value(key)
        +}
        +
        +// fromContext returns the App Engine context or nil if ctx is not
        +// derived from an App Engine context.
         func fromContext(ctx netcontext.Context) *context {
         	c, _ := ctx.Value(&contextKey).(*context)
         	return c
        @@ -247,86 +272,70 @@ func IncomingHeaders(ctx netcontext.Context) http.Header {
         	return nil
         }
         
        -func WithContext(parent netcontext.Context, req *http.Request) netcontext.Context {
        -	ctxs.Lock()
        -	c := ctxs.m[req]
        -	d := ctxs.dec[req]
        -	ctxs.Unlock()
        +func ReqContext(req *http.Request) netcontext.Context {
        +	return req.Context()
        +}
         
        -	if d != nil {
        -		parent = d(parent)
        +func WithContext(parent netcontext.Context, req *http.Request) netcontext.Context {
        +	return jointContext{
        +		base:       parent,
        +		valuesOnly: req.Context(),
         	}
        +}
         
        -	if c == nil {
        -		// Someone passed in an http.Request that is not in-flight.
        -		// We panic here rather than panicking at a later point
        -		// so that stack traces will be more sensible.
        -		log.Panic("appengine: NewContext passed an unknown http.Request")
        -	}
        -	return withContext(parent, c)
        +// DefaultTicket returns a ticket used for background context or dev_appserver.
        +func DefaultTicket() string {
        +	defaultTicketOnce.Do(func() {
        +		if IsDevAppServer() {
        +			defaultTicket = "testapp" + defaultTicketSuffix
        +			return
        +		}
        +		appID := partitionlessAppID()
        +		escAppID := strings.Replace(strings.Replace(appID, ":", "_", -1), ".", "_", -1)
        +		majVersion := VersionID(nil)
        +		if i := strings.Index(majVersion, "."); i > 0 {
        +			majVersion = majVersion[:i]
        +		}
        +		defaultTicket = fmt.Sprintf("%s/%s.%s.%s", escAppID, ModuleName(nil), majVersion, InstanceID())
        +	})
        +	return defaultTicket
         }
         
         func BackgroundContext() netcontext.Context {
        -	ctxs.Lock()
        -	defer ctxs.Unlock()
        -
        -	if ctxs.bg != nil {
        -		return toContext(ctxs.bg)
        -	}
        -
        -	// Compute background security ticket.
        -	appID := partitionlessAppID()
        -	escAppID := strings.Replace(strings.Replace(appID, ":", "_", -1), ".", "_", -1)
        -	majVersion := VersionID(nil)
        -	if i := strings.Index(majVersion, "."); i > 0 {
        -		majVersion = majVersion[:i]
        -	}
        -	ticket := fmt.Sprintf("%s/%s.%s.%s", escAppID, ModuleName(nil), majVersion, InstanceID())
        -
        -	ctxs.bg = &context{
        -		req: &http.Request{
        -			Header: http.Header{
        -				ticketHeader: []string{ticket},
        +	backgroundContextOnce.Do(func() {
        +		// Compute background security ticket.
        +		ticket := DefaultTicket()
        +
        +		c := &context{
        +			req: &http.Request{
        +				Header: http.Header{
        +					ticketHeader: []string{ticket},
        +				},
         			},
        -		},
        -		apiURL: apiURL(),
        -	}
        +			apiURL: apiURL(),
        +		}
        +		backgroundContext = toContext(c)
         
        -	// TODO(dsymonds): Wire up the shutdown handler to do a final flush.
        -	go ctxs.bg.logFlusher(make(chan int))
        +		// TODO(dsymonds): Wire up the shutdown handler to do a final flush.
        +		go c.logFlusher(make(chan int))
        +	})
         
        -	return toContext(ctxs.bg)
        +	return backgroundContext
         }
         
         // RegisterTestRequest registers the HTTP request req for testing, such that
         // any API calls are sent to the provided URL. It returns a closure to delete
         // the registration.
         // It should only be used by aetest package.
        -func RegisterTestRequest(req *http.Request, apiURL *url.URL, decorate func(netcontext.Context) netcontext.Context) func() {
        +func RegisterTestRequest(req *http.Request, apiURL *url.URL, decorate func(netcontext.Context) netcontext.Context) (*http.Request, func()) {
         	c := &context{
         		req:    req,
         		apiURL: apiURL,
         	}
        -	ctxs.Lock()
        -	defer ctxs.Unlock()
        -	if _, ok := ctxs.m[req]; ok {
        -		log.Panic("req already associated with context")
        -	}
        -	if _, ok := ctxs.dec[req]; ok {
        -		log.Panic("req already associated with context")
        -	}
        -	if ctxs.dec == nil {
        -		ctxs.dec = make(map[*http.Request]func(netcontext.Context) netcontext.Context)
        -	}
        -	ctxs.m[req] = c
        -	ctxs.dec[req] = decorate
        -
        -	return func() {
        -		ctxs.Lock()
        -		delete(ctxs.m, req)
        -		delete(ctxs.dec, req)
        -		ctxs.Unlock()
        -	}
        +	ctx := withContext(decorate(req.Context()), c)
        +	req = req.WithContext(ctx)
        +	c.req = req
        +	return req, func() {}
         }
         
         var errTimeout = &CallError{
        @@ -452,7 +461,7 @@ func Call(ctx netcontext.Context, service, method string, in, out proto.Message)
         	c := fromContext(ctx)
         	if c == nil {
         		// Give a good error message rather than a panic lower down.
        -		return errors.New("not an App Engine context")
        +		return errNotAppEngineContext
         	}
         
         	// Apply transaction modifications if we're in a transaction.
        @@ -475,6 +484,16 @@ func Call(ctx netcontext.Context, service, method string, in, out proto.Message)
         	}
         
         	ticket := c.req.Header.Get(ticketHeader)
        +	// Use a test ticket under test environment.
        +	if ticket == "" {
        +		if appid := ctx.Value(&appIDOverrideKey); appid != nil {
        +			ticket = appid.(string) + defaultTicketSuffix
        +		}
        +	}
        +	// Fall back to use background ticket when the request ticket is not available in Flex or dev_appserver.
        +	if ticket == "" {
        +		ticket = DefaultTicket()
        +	}
         	req := &remotepb.Request{
         		ServiceName: &service,
         		Method:      &method,
        @@ -550,6 +569,9 @@ var logLevelName = map[int64]string{
         }
         
         func logf(c *context, level int64, format string, args ...interface{}) {
        +	if c == nil {
        +		panic("not an App Engine context")
        +	}
         	s := fmt.Sprintf(format, args...)
         	s = strings.TrimRight(s, "\n") // Remove any trailing newline characters.
         	c.addLogLine(&logpb.UserAppLogLine{
        @@ -557,7 +579,10 @@ func logf(c *context, level int64, format string, args ...interface{}) {
         		Level:         &level,
         		Message:       &s,
         	})
        -	log.Print(logLevelName[level] + ": " + s)
        +	// Only duplicate log to stderr if not running on App Engine second generation
        +	if !IsSecondGen() {
        +		log.Print(logLevelName[level] + ": " + s)
        +	}
         }
         
         // flushLog attempts to flush any pending logs to the appserver.
        diff --git a/vendor/google.golang.org/appengine/internal/api_classic.go b/vendor/google.golang.org/appengine/internal/api_classic.go
        index 597f66e6e..f0f40b2e3 100644
        --- a/vendor/google.golang.org/appengine/internal/api_classic.go
        +++ b/vendor/google.golang.org/appengine/internal/api_classic.go
        @@ -22,14 +22,20 @@ import (
         
         var contextKey = "holds an appengine.Context"
         
        +// fromContext returns the App Engine context or nil if ctx is not
        +// derived from an App Engine context.
         func fromContext(ctx netcontext.Context) appengine.Context {
         	c, _ := ctx.Value(&contextKey).(appengine.Context)
         	return c
         }
         
         // This is only for classic App Engine adapters.
        -func ClassicContextFromContext(ctx netcontext.Context) appengine.Context {
        -	return fromContext(ctx)
        +func ClassicContextFromContext(ctx netcontext.Context) (appengine.Context, error) {
        +	c := fromContext(ctx)
        +	if c == nil {
        +		return nil, errNotAppEngineContext
        +	}
        +	return c, nil
         }
         
         func withContext(parent netcontext.Context, c appengine.Context) netcontext.Context {
        @@ -53,6 +59,10 @@ func IncomingHeaders(ctx netcontext.Context) http.Header {
         	return nil
         }
         
        +func ReqContext(req *http.Request) netcontext.Context {
        +	return WithContext(netcontext.Background(), req)
        +}
        +
         func WithContext(parent netcontext.Context, req *http.Request) netcontext.Context {
         	c := appengine.NewContext(req)
         	return withContext(parent, c)
        @@ -98,7 +108,7 @@ func Call(ctx netcontext.Context, service, method string, in, out proto.Message)
         	c := fromContext(ctx)
         	if c == nil {
         		// Give a good error message rather than a panic lower down.
        -		return errors.New("not an App Engine context")
        +		return errNotAppEngineContext
         	}
         
         	// Apply transaction modifications if we're in a transaction.
        diff --git a/vendor/google.golang.org/appengine/internal/api_common.go b/vendor/google.golang.org/appengine/internal/api_common.go
        index 2db33a774..e0c0b214b 100644
        --- a/vendor/google.golang.org/appengine/internal/api_common.go
        +++ b/vendor/google.golang.org/appengine/internal/api_common.go
        @@ -5,10 +5,15 @@
         package internal
         
         import (
        +	"errors"
        +	"os"
        +
         	"github.com/golang/protobuf/proto"
         	netcontext "golang.org/x/net/context"
         )
         
        +var errNotAppEngineContext = errors.New("not an App Engine context")
        +
         type CallOverrideFunc func(ctx netcontext.Context, service, method string, in, out proto.Message) error
         
         var callOverrideKey = "holds []CallOverrideFunc"
        @@ -77,10 +82,42 @@ func Logf(ctx netcontext.Context, level int64, format string, args ...interface{
         		f(level, format, args...)
         		return
         	}
        -	logf(fromContext(ctx), level, format, args...)
        +	c := fromContext(ctx)
        +	if c == nil {
        +		panic(errNotAppEngineContext)
        +	}
        +	logf(c, level, format, args...)
         }
         
         // NamespacedContext wraps a Context to support namespaces.
         func NamespacedContext(ctx netcontext.Context, namespace string) netcontext.Context {
         	return withNamespace(ctx, namespace)
         }
        +
        +// SetTestEnv sets the env variables for testing background ticket in Flex.
        +func SetTestEnv() func() {
        +	var environ = []struct {
        +		key, value string
        +	}{
        +		{"GAE_LONG_APP_ID", "my-app-id"},
        +		{"GAE_MINOR_VERSION", "067924799508853122"},
        +		{"GAE_MODULE_INSTANCE", "0"},
        +		{"GAE_MODULE_NAME", "default"},
        +		{"GAE_MODULE_VERSION", "20150612t184001"},
        +	}
        +
        +	for _, v := range environ {
        +		old := os.Getenv(v.key)
        +		os.Setenv(v.key, v.value)
        +		v.value = old
        +	}
        +	return func() { // Restore old environment after the test completes.
        +		for _, v := range environ {
        +			if v.value == "" {
        +				os.Unsetenv(v.key)
        +				continue
        +			}
        +			os.Setenv(v.key, v.value)
        +		}
        +	}
        +}
        diff --git a/vendor/google.golang.org/appengine/internal/app_identity/app_identity_service.pb.go b/vendor/google.golang.org/appengine/internal/app_identity/app_identity_service.pb.go
        index 87d9701b8..9a2ff77ab 100644
        --- a/vendor/google.golang.org/appengine/internal/app_identity/app_identity_service.pb.go
        +++ b/vendor/google.golang.org/appengine/internal/app_identity/app_identity_service.pb.go
        @@ -1,27 +1,6 @@
        -// Code generated by protoc-gen-go.
        +// Code generated by protoc-gen-go. DO NOT EDIT.
         // source: google.golang.org/appengine/internal/app_identity/app_identity_service.proto
        -// DO NOT EDIT!
        -
        -/*
        -Package app_identity is a generated protocol buffer package.
        -
        -It is generated from these files:
        -	google.golang.org/appengine/internal/app_identity/app_identity_service.proto
        -
        -It has these top-level messages:
        -	AppIdentityServiceError
        -	SignForAppRequest
        -	SignForAppResponse
        -	GetPublicCertificateForAppRequest
        -	PublicCertificate
        -	GetPublicCertificateForAppResponse
        -	GetServiceAccountNameRequest
        -	GetServiceAccountNameResponse
        -	GetAccessTokenRequest
        -	GetAccessTokenResponse
        -	GetDefaultGcsBucketNameRequest
        -	GetDefaultGcsBucketNameResponse
        -*/
        +
         package app_identity
         
         import proto "github.com/golang/protobuf/proto"
        @@ -33,6 +12,12 @@ var _ = proto.Marshal
         var _ = fmt.Errorf
         var _ = math.Inf
         
        +// This is a compile-time assertion to ensure that this generated file
        +// is compatible with the proto package it is being compiled against.
        +// A compilation error at this line likely means your copy of the
        +// proto package needs to be updated.
        +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
        +
         type AppIdentityServiceError_ErrorCode int32
         
         const (
        @@ -83,23 +68,70 @@ func (x *AppIdentityServiceError_ErrorCode) UnmarshalJSON(data []byte) error {
         	*x = AppIdentityServiceError_ErrorCode(value)
         	return nil
         }
        +func (AppIdentityServiceError_ErrorCode) EnumDescriptor() ([]byte, []int) {
        +	return fileDescriptor_app_identity_service_08a6e3f74b04cfa4, []int{0, 0}
        +}
         
         type AppIdentityServiceError struct {
        -	XXX_unrecognized []byte `json:"-"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *AppIdentityServiceError) Reset()         { *m = AppIdentityServiceError{} }
         func (m *AppIdentityServiceError) String() string { return proto.CompactTextString(m) }
         func (*AppIdentityServiceError) ProtoMessage()    {}
        +func (*AppIdentityServiceError) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_app_identity_service_08a6e3f74b04cfa4, []int{0}
        +}
        +func (m *AppIdentityServiceError) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_AppIdentityServiceError.Unmarshal(m, b)
        +}
        +func (m *AppIdentityServiceError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_AppIdentityServiceError.Marshal(b, m, deterministic)
        +}
        +func (dst *AppIdentityServiceError) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_AppIdentityServiceError.Merge(dst, src)
        +}
        +func (m *AppIdentityServiceError) XXX_Size() int {
        +	return xxx_messageInfo_AppIdentityServiceError.Size(m)
        +}
        +func (m *AppIdentityServiceError) XXX_DiscardUnknown() {
        +	xxx_messageInfo_AppIdentityServiceError.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_AppIdentityServiceError proto.InternalMessageInfo
         
         type SignForAppRequest struct {
        -	BytesToSign      []byte `protobuf:"bytes,1,opt,name=bytes_to_sign" json:"bytes_to_sign,omitempty"`
        -	XXX_unrecognized []byte `json:"-"`
        +	BytesToSign          []byte   `protobuf:"bytes,1,opt,name=bytes_to_sign,json=bytesToSign" json:"bytes_to_sign,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *SignForAppRequest) Reset()         { *m = SignForAppRequest{} }
         func (m *SignForAppRequest) String() string { return proto.CompactTextString(m) }
         func (*SignForAppRequest) ProtoMessage()    {}
        +func (*SignForAppRequest) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_app_identity_service_08a6e3f74b04cfa4, []int{1}
        +}
        +func (m *SignForAppRequest) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_SignForAppRequest.Unmarshal(m, b)
        +}
        +func (m *SignForAppRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_SignForAppRequest.Marshal(b, m, deterministic)
        +}
        +func (dst *SignForAppRequest) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_SignForAppRequest.Merge(dst, src)
        +}
        +func (m *SignForAppRequest) XXX_Size() int {
        +	return xxx_messageInfo_SignForAppRequest.Size(m)
        +}
        +func (m *SignForAppRequest) XXX_DiscardUnknown() {
        +	xxx_messageInfo_SignForAppRequest.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_SignForAppRequest proto.InternalMessageInfo
         
         func (m *SignForAppRequest) GetBytesToSign() []byte {
         	if m != nil {
        @@ -109,14 +141,36 @@ func (m *SignForAppRequest) GetBytesToSign() []byte {
         }
         
         type SignForAppResponse struct {
        -	KeyName          *string `protobuf:"bytes,1,opt,name=key_name" json:"key_name,omitempty"`
        -	SignatureBytes   []byte  `protobuf:"bytes,2,opt,name=signature_bytes" json:"signature_bytes,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	KeyName              *string  `protobuf:"bytes,1,opt,name=key_name,json=keyName" json:"key_name,omitempty"`
        +	SignatureBytes       []byte   `protobuf:"bytes,2,opt,name=signature_bytes,json=signatureBytes" json:"signature_bytes,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *SignForAppResponse) Reset()         { *m = SignForAppResponse{} }
         func (m *SignForAppResponse) String() string { return proto.CompactTextString(m) }
         func (*SignForAppResponse) ProtoMessage()    {}
        +func (*SignForAppResponse) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_app_identity_service_08a6e3f74b04cfa4, []int{2}
        +}
        +func (m *SignForAppResponse) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_SignForAppResponse.Unmarshal(m, b)
        +}
        +func (m *SignForAppResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_SignForAppResponse.Marshal(b, m, deterministic)
        +}
        +func (dst *SignForAppResponse) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_SignForAppResponse.Merge(dst, src)
        +}
        +func (m *SignForAppResponse) XXX_Size() int {
        +	return xxx_messageInfo_SignForAppResponse.Size(m)
        +}
        +func (m *SignForAppResponse) XXX_DiscardUnknown() {
        +	xxx_messageInfo_SignForAppResponse.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_SignForAppResponse proto.InternalMessageInfo
         
         func (m *SignForAppResponse) GetKeyName() string {
         	if m != nil && m.KeyName != nil {
        @@ -133,22 +187,66 @@ func (m *SignForAppResponse) GetSignatureBytes() []byte {
         }
         
         type GetPublicCertificateForAppRequest struct {
        -	XXX_unrecognized []byte `json:"-"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *GetPublicCertificateForAppRequest) Reset()         { *m = GetPublicCertificateForAppRequest{} }
         func (m *GetPublicCertificateForAppRequest) String() string { return proto.CompactTextString(m) }
         func (*GetPublicCertificateForAppRequest) ProtoMessage()    {}
        +func (*GetPublicCertificateForAppRequest) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_app_identity_service_08a6e3f74b04cfa4, []int{3}
        +}
        +func (m *GetPublicCertificateForAppRequest) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_GetPublicCertificateForAppRequest.Unmarshal(m, b)
        +}
        +func (m *GetPublicCertificateForAppRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_GetPublicCertificateForAppRequest.Marshal(b, m, deterministic)
        +}
        +func (dst *GetPublicCertificateForAppRequest) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_GetPublicCertificateForAppRequest.Merge(dst, src)
        +}
        +func (m *GetPublicCertificateForAppRequest) XXX_Size() int {
        +	return xxx_messageInfo_GetPublicCertificateForAppRequest.Size(m)
        +}
        +func (m *GetPublicCertificateForAppRequest) XXX_DiscardUnknown() {
        +	xxx_messageInfo_GetPublicCertificateForAppRequest.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_GetPublicCertificateForAppRequest proto.InternalMessageInfo
         
         type PublicCertificate struct {
        -	KeyName            *string `protobuf:"bytes,1,opt,name=key_name" json:"key_name,omitempty"`
        -	X509CertificatePem *string `protobuf:"bytes,2,opt,name=x509_certificate_pem" json:"x509_certificate_pem,omitempty"`
        -	XXX_unrecognized   []byte  `json:"-"`
        +	KeyName              *string  `protobuf:"bytes,1,opt,name=key_name,json=keyName" json:"key_name,omitempty"`
        +	X509CertificatePem   *string  `protobuf:"bytes,2,opt,name=x509_certificate_pem,json=x509CertificatePem" json:"x509_certificate_pem,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *PublicCertificate) Reset()         { *m = PublicCertificate{} }
         func (m *PublicCertificate) String() string { return proto.CompactTextString(m) }
         func (*PublicCertificate) ProtoMessage()    {}
        +func (*PublicCertificate) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_app_identity_service_08a6e3f74b04cfa4, []int{4}
        +}
        +func (m *PublicCertificate) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_PublicCertificate.Unmarshal(m, b)
        +}
        +func (m *PublicCertificate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_PublicCertificate.Marshal(b, m, deterministic)
        +}
        +func (dst *PublicCertificate) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_PublicCertificate.Merge(dst, src)
        +}
        +func (m *PublicCertificate) XXX_Size() int {
        +	return xxx_messageInfo_PublicCertificate.Size(m)
        +}
        +func (m *PublicCertificate) XXX_DiscardUnknown() {
        +	xxx_messageInfo_PublicCertificate.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_PublicCertificate proto.InternalMessageInfo
         
         func (m *PublicCertificate) GetKeyName() string {
         	if m != nil && m.KeyName != nil {
        @@ -165,14 +263,36 @@ func (m *PublicCertificate) GetX509CertificatePem() string {
         }
         
         type GetPublicCertificateForAppResponse struct {
        -	PublicCertificateList      []*PublicCertificate `protobuf:"bytes,1,rep,name=public_certificate_list" json:"public_certificate_list,omitempty"`
        -	MaxClientCacheTimeInSecond *int64               `protobuf:"varint,2,opt,name=max_client_cache_time_in_second" json:"max_client_cache_time_in_second,omitempty"`
        +	PublicCertificateList      []*PublicCertificate `protobuf:"bytes,1,rep,name=public_certificate_list,json=publicCertificateList" json:"public_certificate_list,omitempty"`
        +	MaxClientCacheTimeInSecond *int64               `protobuf:"varint,2,opt,name=max_client_cache_time_in_second,json=maxClientCacheTimeInSecond" json:"max_client_cache_time_in_second,omitempty"`
        +	XXX_NoUnkeyedLiteral       struct{}             `json:"-"`
         	XXX_unrecognized           []byte               `json:"-"`
        +	XXX_sizecache              int32                `json:"-"`
         }
         
         func (m *GetPublicCertificateForAppResponse) Reset()         { *m = GetPublicCertificateForAppResponse{} }
         func (m *GetPublicCertificateForAppResponse) String() string { return proto.CompactTextString(m) }
         func (*GetPublicCertificateForAppResponse) ProtoMessage()    {}
        +func (*GetPublicCertificateForAppResponse) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_app_identity_service_08a6e3f74b04cfa4, []int{5}
        +}
        +func (m *GetPublicCertificateForAppResponse) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_GetPublicCertificateForAppResponse.Unmarshal(m, b)
        +}
        +func (m *GetPublicCertificateForAppResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_GetPublicCertificateForAppResponse.Marshal(b, m, deterministic)
        +}
        +func (dst *GetPublicCertificateForAppResponse) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_GetPublicCertificateForAppResponse.Merge(dst, src)
        +}
        +func (m *GetPublicCertificateForAppResponse) XXX_Size() int {
        +	return xxx_messageInfo_GetPublicCertificateForAppResponse.Size(m)
        +}
        +func (m *GetPublicCertificateForAppResponse) XXX_DiscardUnknown() {
        +	xxx_messageInfo_GetPublicCertificateForAppResponse.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_GetPublicCertificateForAppResponse proto.InternalMessageInfo
         
         func (m *GetPublicCertificateForAppResponse) GetPublicCertificateList() []*PublicCertificate {
         	if m != nil {
        @@ -189,21 +309,65 @@ func (m *GetPublicCertificateForAppResponse) GetMaxClientCacheTimeInSecond() int
         }
         
         type GetServiceAccountNameRequest struct {
        -	XXX_unrecognized []byte `json:"-"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *GetServiceAccountNameRequest) Reset()         { *m = GetServiceAccountNameRequest{} }
         func (m *GetServiceAccountNameRequest) String() string { return proto.CompactTextString(m) }
         func (*GetServiceAccountNameRequest) ProtoMessage()    {}
        +func (*GetServiceAccountNameRequest) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_app_identity_service_08a6e3f74b04cfa4, []int{6}
        +}
        +func (m *GetServiceAccountNameRequest) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_GetServiceAccountNameRequest.Unmarshal(m, b)
        +}
        +func (m *GetServiceAccountNameRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_GetServiceAccountNameRequest.Marshal(b, m, deterministic)
        +}
        +func (dst *GetServiceAccountNameRequest) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_GetServiceAccountNameRequest.Merge(dst, src)
        +}
        +func (m *GetServiceAccountNameRequest) XXX_Size() int {
        +	return xxx_messageInfo_GetServiceAccountNameRequest.Size(m)
        +}
        +func (m *GetServiceAccountNameRequest) XXX_DiscardUnknown() {
        +	xxx_messageInfo_GetServiceAccountNameRequest.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_GetServiceAccountNameRequest proto.InternalMessageInfo
         
         type GetServiceAccountNameResponse struct {
        -	ServiceAccountName *string `protobuf:"bytes,1,opt,name=service_account_name" json:"service_account_name,omitempty"`
        -	XXX_unrecognized   []byte  `json:"-"`
        +	ServiceAccountName   *string  `protobuf:"bytes,1,opt,name=service_account_name,json=serviceAccountName" json:"service_account_name,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *GetServiceAccountNameResponse) Reset()         { *m = GetServiceAccountNameResponse{} }
         func (m *GetServiceAccountNameResponse) String() string { return proto.CompactTextString(m) }
         func (*GetServiceAccountNameResponse) ProtoMessage()    {}
        +func (*GetServiceAccountNameResponse) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_app_identity_service_08a6e3f74b04cfa4, []int{7}
        +}
        +func (m *GetServiceAccountNameResponse) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_GetServiceAccountNameResponse.Unmarshal(m, b)
        +}
        +func (m *GetServiceAccountNameResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_GetServiceAccountNameResponse.Marshal(b, m, deterministic)
        +}
        +func (dst *GetServiceAccountNameResponse) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_GetServiceAccountNameResponse.Merge(dst, src)
        +}
        +func (m *GetServiceAccountNameResponse) XXX_Size() int {
        +	return xxx_messageInfo_GetServiceAccountNameResponse.Size(m)
        +}
        +func (m *GetServiceAccountNameResponse) XXX_DiscardUnknown() {
        +	xxx_messageInfo_GetServiceAccountNameResponse.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_GetServiceAccountNameResponse proto.InternalMessageInfo
         
         func (m *GetServiceAccountNameResponse) GetServiceAccountName() string {
         	if m != nil && m.ServiceAccountName != nil {
        @@ -213,15 +377,37 @@ func (m *GetServiceAccountNameResponse) GetServiceAccountName() string {
         }
         
         type GetAccessTokenRequest struct {
        -	Scope              []string `protobuf:"bytes,1,rep,name=scope" json:"scope,omitempty"`
        -	ServiceAccountId   *int64   `protobuf:"varint,2,opt,name=service_account_id" json:"service_account_id,omitempty"`
        -	ServiceAccountName *string  `protobuf:"bytes,3,opt,name=service_account_name" json:"service_account_name,omitempty"`
        -	XXX_unrecognized   []byte   `json:"-"`
        +	Scope                []string `protobuf:"bytes,1,rep,name=scope" json:"scope,omitempty"`
        +	ServiceAccountId     *int64   `protobuf:"varint,2,opt,name=service_account_id,json=serviceAccountId" json:"service_account_id,omitempty"`
        +	ServiceAccountName   *string  `protobuf:"bytes,3,opt,name=service_account_name,json=serviceAccountName" json:"service_account_name,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *GetAccessTokenRequest) Reset()         { *m = GetAccessTokenRequest{} }
         func (m *GetAccessTokenRequest) String() string { return proto.CompactTextString(m) }
         func (*GetAccessTokenRequest) ProtoMessage()    {}
        +func (*GetAccessTokenRequest) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_app_identity_service_08a6e3f74b04cfa4, []int{8}
        +}
        +func (m *GetAccessTokenRequest) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_GetAccessTokenRequest.Unmarshal(m, b)
        +}
        +func (m *GetAccessTokenRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_GetAccessTokenRequest.Marshal(b, m, deterministic)
        +}
        +func (dst *GetAccessTokenRequest) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_GetAccessTokenRequest.Merge(dst, src)
        +}
        +func (m *GetAccessTokenRequest) XXX_Size() int {
        +	return xxx_messageInfo_GetAccessTokenRequest.Size(m)
        +}
        +func (m *GetAccessTokenRequest) XXX_DiscardUnknown() {
        +	xxx_messageInfo_GetAccessTokenRequest.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_GetAccessTokenRequest proto.InternalMessageInfo
         
         func (m *GetAccessTokenRequest) GetScope() []string {
         	if m != nil {
        @@ -245,14 +431,36 @@ func (m *GetAccessTokenRequest) GetServiceAccountName() string {
         }
         
         type GetAccessTokenResponse struct {
        -	AccessToken      *string `protobuf:"bytes,1,opt,name=access_token" json:"access_token,omitempty"`
        -	ExpirationTime   *int64  `protobuf:"varint,2,opt,name=expiration_time" json:"expiration_time,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	AccessToken          *string  `protobuf:"bytes,1,opt,name=access_token,json=accessToken" json:"access_token,omitempty"`
        +	ExpirationTime       *int64   `protobuf:"varint,2,opt,name=expiration_time,json=expirationTime" json:"expiration_time,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *GetAccessTokenResponse) Reset()         { *m = GetAccessTokenResponse{} }
         func (m *GetAccessTokenResponse) String() string { return proto.CompactTextString(m) }
         func (*GetAccessTokenResponse) ProtoMessage()    {}
        +func (*GetAccessTokenResponse) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_app_identity_service_08a6e3f74b04cfa4, []int{9}
        +}
        +func (m *GetAccessTokenResponse) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_GetAccessTokenResponse.Unmarshal(m, b)
        +}
        +func (m *GetAccessTokenResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_GetAccessTokenResponse.Marshal(b, m, deterministic)
        +}
        +func (dst *GetAccessTokenResponse) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_GetAccessTokenResponse.Merge(dst, src)
        +}
        +func (m *GetAccessTokenResponse) XXX_Size() int {
        +	return xxx_messageInfo_GetAccessTokenResponse.Size(m)
        +}
        +func (m *GetAccessTokenResponse) XXX_DiscardUnknown() {
        +	xxx_messageInfo_GetAccessTokenResponse.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_GetAccessTokenResponse proto.InternalMessageInfo
         
         func (m *GetAccessTokenResponse) GetAccessToken() string {
         	if m != nil && m.AccessToken != nil {
        @@ -269,21 +477,65 @@ func (m *GetAccessTokenResponse) GetExpirationTime() int64 {
         }
         
         type GetDefaultGcsBucketNameRequest struct {
        -	XXX_unrecognized []byte `json:"-"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *GetDefaultGcsBucketNameRequest) Reset()         { *m = GetDefaultGcsBucketNameRequest{} }
         func (m *GetDefaultGcsBucketNameRequest) String() string { return proto.CompactTextString(m) }
         func (*GetDefaultGcsBucketNameRequest) ProtoMessage()    {}
        +func (*GetDefaultGcsBucketNameRequest) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_app_identity_service_08a6e3f74b04cfa4, []int{10}
        +}
        +func (m *GetDefaultGcsBucketNameRequest) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_GetDefaultGcsBucketNameRequest.Unmarshal(m, b)
        +}
        +func (m *GetDefaultGcsBucketNameRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_GetDefaultGcsBucketNameRequest.Marshal(b, m, deterministic)
        +}
        +func (dst *GetDefaultGcsBucketNameRequest) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_GetDefaultGcsBucketNameRequest.Merge(dst, src)
        +}
        +func (m *GetDefaultGcsBucketNameRequest) XXX_Size() int {
        +	return xxx_messageInfo_GetDefaultGcsBucketNameRequest.Size(m)
        +}
        +func (m *GetDefaultGcsBucketNameRequest) XXX_DiscardUnknown() {
        +	xxx_messageInfo_GetDefaultGcsBucketNameRequest.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_GetDefaultGcsBucketNameRequest proto.InternalMessageInfo
         
         type GetDefaultGcsBucketNameResponse struct {
        -	DefaultGcsBucketName *string `protobuf:"bytes,1,opt,name=default_gcs_bucket_name" json:"default_gcs_bucket_name,omitempty"`
        -	XXX_unrecognized     []byte  `json:"-"`
        +	DefaultGcsBucketName *string  `protobuf:"bytes,1,opt,name=default_gcs_bucket_name,json=defaultGcsBucketName" json:"default_gcs_bucket_name,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *GetDefaultGcsBucketNameResponse) Reset()         { *m = GetDefaultGcsBucketNameResponse{} }
         func (m *GetDefaultGcsBucketNameResponse) String() string { return proto.CompactTextString(m) }
         func (*GetDefaultGcsBucketNameResponse) ProtoMessage()    {}
        +func (*GetDefaultGcsBucketNameResponse) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_app_identity_service_08a6e3f74b04cfa4, []int{11}
        +}
        +func (m *GetDefaultGcsBucketNameResponse) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_GetDefaultGcsBucketNameResponse.Unmarshal(m, b)
        +}
        +func (m *GetDefaultGcsBucketNameResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_GetDefaultGcsBucketNameResponse.Marshal(b, m, deterministic)
        +}
        +func (dst *GetDefaultGcsBucketNameResponse) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_GetDefaultGcsBucketNameResponse.Merge(dst, src)
        +}
        +func (m *GetDefaultGcsBucketNameResponse) XXX_Size() int {
        +	return xxx_messageInfo_GetDefaultGcsBucketNameResponse.Size(m)
        +}
        +func (m *GetDefaultGcsBucketNameResponse) XXX_DiscardUnknown() {
        +	xxx_messageInfo_GetDefaultGcsBucketNameResponse.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_GetDefaultGcsBucketNameResponse proto.InternalMessageInfo
         
         func (m *GetDefaultGcsBucketNameResponse) GetDefaultGcsBucketName() string {
         	if m != nil && m.DefaultGcsBucketName != nil {
        @@ -293,4 +545,67 @@ func (m *GetDefaultGcsBucketNameResponse) GetDefaultGcsBucketName() string {
         }
         
         func init() {
        +	proto.RegisterType((*AppIdentityServiceError)(nil), "appengine.AppIdentityServiceError")
        +	proto.RegisterType((*SignForAppRequest)(nil), "appengine.SignForAppRequest")
        +	proto.RegisterType((*SignForAppResponse)(nil), "appengine.SignForAppResponse")
        +	proto.RegisterType((*GetPublicCertificateForAppRequest)(nil), "appengine.GetPublicCertificateForAppRequest")
        +	proto.RegisterType((*PublicCertificate)(nil), "appengine.PublicCertificate")
        +	proto.RegisterType((*GetPublicCertificateForAppResponse)(nil), "appengine.GetPublicCertificateForAppResponse")
        +	proto.RegisterType((*GetServiceAccountNameRequest)(nil), "appengine.GetServiceAccountNameRequest")
        +	proto.RegisterType((*GetServiceAccountNameResponse)(nil), "appengine.GetServiceAccountNameResponse")
        +	proto.RegisterType((*GetAccessTokenRequest)(nil), "appengine.GetAccessTokenRequest")
        +	proto.RegisterType((*GetAccessTokenResponse)(nil), "appengine.GetAccessTokenResponse")
        +	proto.RegisterType((*GetDefaultGcsBucketNameRequest)(nil), "appengine.GetDefaultGcsBucketNameRequest")
        +	proto.RegisterType((*GetDefaultGcsBucketNameResponse)(nil), "appengine.GetDefaultGcsBucketNameResponse")
        +}
        +
        +func init() {
        +	proto.RegisterFile("google.golang.org/appengine/internal/app_identity/app_identity_service.proto", fileDescriptor_app_identity_service_08a6e3f74b04cfa4)
        +}
        +
        +var fileDescriptor_app_identity_service_08a6e3f74b04cfa4 = []byte{
        +	// 676 bytes of a gzipped FileDescriptorProto
        +	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x54, 0xdb, 0x6e, 0xda, 0x58,
        +	0x14, 0x1d, 0x26, 0x1a, 0x31, 0x6c, 0x12, 0x62, 0xce, 0x90, 0xcb, 0x8c, 0x32, 0xb9, 0x78, 0x1e,
        +	0x26, 0x0f, 0x15, 0x89, 0x2a, 0x45, 0x55, 0x1f, 0x8d, 0xed, 0x22, 0x54, 0x07, 0x53, 0x43, 0x9a,
        +	0xa8, 0x2f, 0xa7, 0xce, 0x61, 0xc7, 0x3d, 0x02, 0x9f, 0xe3, 0xda, 0x87, 0x0a, 0x3e, 0xa2, 0x3f,
        +	0xd2, 0x9f, 0xe8, 0x5b, 0xbf, 0xa5, 0x17, 0xb5, 0xdf, 0x50, 0xd9, 0x38, 0x5c, 0x92, 0x92, 0x37,
        +	0xbc, 0xf6, 0x5a, 0xcb, 0x6b, 0x2f, 0x6d, 0x0c, 0x4e, 0x20, 0x65, 0x30, 0xc4, 0x7a, 0x20, 0x87,
        +	0xbe, 0x08, 0xea, 0x32, 0x0e, 0x4e, 0xfc, 0x28, 0x42, 0x11, 0x70, 0x81, 0x27, 0x5c, 0x28, 0x8c,
        +	0x85, 0x3f, 0x4c, 0x21, 0xca, 0xfb, 0x28, 0x14, 0x57, 0x93, 0xa5, 0x07, 0x9a, 0x60, 0xfc, 0x8e,
        +	0x33, 0xac, 0x47, 0xb1, 0x54, 0x92, 0x94, 0x66, 0x5a, 0xfd, 0x53, 0x01, 0x76, 0x8c, 0x28, 0x6a,
        +	0xe5, 0xc4, 0xee, 0x94, 0x67, 0xc7, 0xb1, 0x8c, 0xf5, 0x0f, 0x05, 0x28, 0x65, 0xbf, 0x4c, 0xd9,
        +	0x47, 0x52, 0x86, 0x62, 0xf7, 0xc2, 0x34, 0xed, 0x6e, 0x57, 0xfb, 0x8d, 0x54, 0x61, 0xe3, 0xa2,
        +	0xfd, 0xbc, 0xed, 0x5e, 0xb6, 0x69, 0xd7, 0x74, 0x3b, 0xb6, 0x56, 0x22, 0x7f, 0x41, 0xa5, 0xe1,
        +	0xb8, 0x0d, 0xda, 0x73, 0x5d, 0xea, 0x18, 0x5e, 0xd3, 0xd6, 0x3e, 0x17, 0xc9, 0x36, 0x54, 0x2d,
        +	0xdb, 0xb0, 0x9c, 0x56, 0xdb, 0xa6, 0xf6, 0x95, 0x69, 0xdb, 0x96, 0x6d, 0x69, 0x5f, 0x8a, 0xa4,
        +	0x06, 0x9b, 0x6d, 0xb7, 0x47, 0x0d, 0xfa, 0xd2, 0x70, 0x5a, 0x16, 0x35, 0x3a, 0x1d, 0xed, 0x6b,
        +	0x91, 0x90, 0xb9, 0xab, 0xed, 0x79, 0xae, 0xa7, 0x7d, 0x2b, 0x12, 0x0d, 0xca, 0x19, 0xd3, 0x71,
        +	0xdc, 0x4b, 0xdb, 0xd2, 0xbe, 0xcf, 0xb4, 0xad, 0xf3, 0x8e, 0x63, 0x9f, 0xdb, 0xed, 0x9e, 0x6d,
        +	0x69, 0x3f, 0x8a, 0xfa, 0x13, 0xa8, 0x76, 0x79, 0x20, 0x9e, 0xc9, 0xd8, 0x88, 0x22, 0x0f, 0xdf,
        +	0x8e, 0x30, 0x51, 0x44, 0x87, 0x8d, 0xeb, 0x89, 0xc2, 0x84, 0x2a, 0x49, 0x13, 0x1e, 0x88, 0xdd,
        +	0xc2, 0x61, 0xe1, 0x78, 0xdd, 0x2b, 0x67, 0x60, 0x4f, 0xa6, 0x02, 0xfd, 0x0a, 0xc8, 0xa2, 0x30,
        +	0x89, 0xa4, 0x48, 0x90, 0xfc, 0x0d, 0x7f, 0x0e, 0x70, 0x42, 0x85, 0x1f, 0x62, 0x26, 0x2a, 0x79,
        +	0xc5, 0x01, 0x4e, 0xda, 0x7e, 0x88, 0xe4, 0x7f, 0xd8, 0x4c, 0xbd, 0x7c, 0x35, 0x8a, 0x91, 0x66,
        +	0x4e, 0xbb, 0xbf, 0x67, 0xb6, 0x95, 0x19, 0xdc, 0x48, 0x51, 0xfd, 0x3f, 0x38, 0x6a, 0xa2, 0xea,
        +	0x8c, 0xae, 0x87, 0x9c, 0x99, 0x18, 0x2b, 0x7e, 0xc3, 0x99, 0xaf, 0x70, 0x29, 0xa2, 0xfe, 0x1a,
        +	0xaa, 0xf7, 0x18, 0x0f, 0xbd, 0xfd, 0x14, 0x6a, 0xe3, 0xb3, 0xd3, 0xa7, 0x94, 0xcd, 0xe9, 0x34,
        +	0xc2, 0x30, 0x8b, 0x50, 0xf2, 0x48, 0x3a, 0x5b, 0x70, 0xea, 0x60, 0xa8, 0x7f, 0x2c, 0x80, 0xfe,
        +	0x50, 0x8e, 0x7c, 0xe3, 0x1e, 0xec, 0x44, 0x19, 0x65, 0xc9, 0x7a, 0xc8, 0x13, 0xb5, 0x5b, 0x38,
        +	0x5c, 0x3b, 0x2e, 0x3f, 0xde, 0xab, 0xcf, 0xce, 0xa6, 0x7e, 0xcf, 0xcc, 0xdb, 0x8a, 0xee, 0x42,
        +	0x0e, 0x4f, 0x14, 0x31, 0xe1, 0x20, 0xf4, 0xc7, 0x94, 0x0d, 0x39, 0x0a, 0x45, 0x99, 0xcf, 0xde,
        +	0x20, 0x55, 0x3c, 0x44, 0xca, 0x05, 0x4d, 0x90, 0x49, 0xd1, 0xcf, 0x92, 0xaf, 0x79, 0xff, 0x84,
        +	0xfe, 0xd8, 0xcc, 0x58, 0x66, 0x4a, 0xea, 0xf1, 0x10, 0x5b, 0xa2, 0x9b, 0x31, 0xf4, 0x7d, 0xd8,
        +	0x6b, 0xa2, 0xca, 0x6f, 0xd3, 0x60, 0x4c, 0x8e, 0x84, 0x4a, 0xcb, 0xb8, 0xed, 0xf0, 0x05, 0xfc,
        +	0xbb, 0x62, 0x9e, 0xef, 0x76, 0x0a, 0xb5, 0xfc, 0x1f, 0x40, 0xfd, 0xe9, 0x78, 0xb1, 0x5b, 0x92,
        +	0xdc, 0x53, 0xea, 0xef, 0x0b, 0xb0, 0xd5, 0x44, 0x65, 0x30, 0x86, 0x49, 0xd2, 0x93, 0x03, 0x14,
        +	0xb7, 0x37, 0x55, 0x83, 0x3f, 0x12, 0x26, 0x23, 0xcc, 0x5a, 0x29, 0x79, 0xd3, 0x07, 0xf2, 0x08,
        +	0xc8, 0xdd, 0x37, 0xf0, 0xdb, 0xd5, 0xb4, 0x65, 0xff, 0x56, 0x7f, 0x65, 0x9e, 0xb5, 0x95, 0x79,
        +	0xfa, 0xb0, 0x7d, 0x37, 0x4e, 0xbe, 0xdb, 0x11, 0xac, 0xfb, 0x19, 0x4c, 0x55, 0x8a, 0xe7, 0x3b,
        +	0x95, 0xfd, 0x39, 0x35, 0xbd, 0x58, 0x1c, 0x47, 0x3c, 0xf6, 0x15, 0x97, 0x22, 0xab, 0x3f, 0x4f,
        +	0x56, 0x99, 0xc3, 0x69, 0xe1, 0xfa, 0x21, 0xec, 0x37, 0x51, 0x59, 0x78, 0xe3, 0x8f, 0x86, 0xaa,
        +	0xc9, 0x92, 0xc6, 0x88, 0x0d, 0x70, 0xa9, 0xea, 0x2b, 0x38, 0x58, 0xc9, 0xc8, 0x03, 0x9d, 0xc1,
        +	0x4e, 0x7f, 0x3a, 0xa7, 0x01, 0x4b, 0xe8, 0x75, 0xc6, 0x58, 0xec, 0xbb, 0xd6, 0xff, 0x85, 0xbc,
        +	0x51, 0x79, 0xb5, 0xbe, 0xf8, 0xc9, 0xfa, 0x19, 0x00, 0x00, 0xff, 0xff, 0x37, 0x4c, 0x56, 0x38,
        +	0xf3, 0x04, 0x00, 0x00,
         }
        diff --git a/vendor/google.golang.org/appengine/internal/base/api_base.pb.go b/vendor/google.golang.org/appengine/internal/base/api_base.pb.go
        index 36a195650..db4777e68 100644
        --- a/vendor/google.golang.org/appengine/internal/base/api_base.pb.go
        +++ b/vendor/google.golang.org/appengine/internal/base/api_base.pb.go
        @@ -1,22 +1,6 @@
        -// Code generated by protoc-gen-go.
        +// Code generated by protoc-gen-go. DO NOT EDIT.
         // source: google.golang.org/appengine/internal/base/api_base.proto
        -// DO NOT EDIT!
        -
        -/*
        -Package base is a generated protocol buffer package.
        -
        -It is generated from these files:
        -	google.golang.org/appengine/internal/base/api_base.proto
        -
        -It has these top-level messages:
        -	StringProto
        -	Integer32Proto
        -	Integer64Proto
        -	BoolProto
        -	DoubleProto
        -	BytesProto
        -	VoidProto
        -*/
        +
         package base
         
         import proto "github.com/golang/protobuf/proto"
        @@ -28,14 +12,42 @@ var _ = proto.Marshal
         var _ = fmt.Errorf
         var _ = math.Inf
         
        +// This is a compile-time assertion to ensure that this generated file
        +// is compatible with the proto package it is being compiled against.
        +// A compilation error at this line likely means your copy of the
        +// proto package needs to be updated.
        +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
        +
         type StringProto struct {
        -	Value            *string `protobuf:"bytes,1,req,name=value" json:"value,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	Value                *string  `protobuf:"bytes,1,req,name=value" json:"value,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *StringProto) Reset()         { *m = StringProto{} }
         func (m *StringProto) String() string { return proto.CompactTextString(m) }
         func (*StringProto) ProtoMessage()    {}
        +func (*StringProto) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_api_base_9d49f8792e0c1140, []int{0}
        +}
        +func (m *StringProto) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_StringProto.Unmarshal(m, b)
        +}
        +func (m *StringProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_StringProto.Marshal(b, m, deterministic)
        +}
        +func (dst *StringProto) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_StringProto.Merge(dst, src)
        +}
        +func (m *StringProto) XXX_Size() int {
        +	return xxx_messageInfo_StringProto.Size(m)
        +}
        +func (m *StringProto) XXX_DiscardUnknown() {
        +	xxx_messageInfo_StringProto.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_StringProto proto.InternalMessageInfo
         
         func (m *StringProto) GetValue() string {
         	if m != nil && m.Value != nil {
        @@ -45,13 +57,35 @@ func (m *StringProto) GetValue() string {
         }
         
         type Integer32Proto struct {
        -	Value            *int32 `protobuf:"varint,1,req,name=value" json:"value,omitempty"`
        -	XXX_unrecognized []byte `json:"-"`
        +	Value                *int32   `protobuf:"varint,1,req,name=value" json:"value,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *Integer32Proto) Reset()         { *m = Integer32Proto{} }
         func (m *Integer32Proto) String() string { return proto.CompactTextString(m) }
         func (*Integer32Proto) ProtoMessage()    {}
        +func (*Integer32Proto) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_api_base_9d49f8792e0c1140, []int{1}
        +}
        +func (m *Integer32Proto) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_Integer32Proto.Unmarshal(m, b)
        +}
        +func (m *Integer32Proto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_Integer32Proto.Marshal(b, m, deterministic)
        +}
        +func (dst *Integer32Proto) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_Integer32Proto.Merge(dst, src)
        +}
        +func (m *Integer32Proto) XXX_Size() int {
        +	return xxx_messageInfo_Integer32Proto.Size(m)
        +}
        +func (m *Integer32Proto) XXX_DiscardUnknown() {
        +	xxx_messageInfo_Integer32Proto.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_Integer32Proto proto.InternalMessageInfo
         
         func (m *Integer32Proto) GetValue() int32 {
         	if m != nil && m.Value != nil {
        @@ -61,13 +95,35 @@ func (m *Integer32Proto) GetValue() int32 {
         }
         
         type Integer64Proto struct {
        -	Value            *int64 `protobuf:"varint,1,req,name=value" json:"value,omitempty"`
        -	XXX_unrecognized []byte `json:"-"`
        +	Value                *int64   `protobuf:"varint,1,req,name=value" json:"value,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *Integer64Proto) Reset()         { *m = Integer64Proto{} }
         func (m *Integer64Proto) String() string { return proto.CompactTextString(m) }
         func (*Integer64Proto) ProtoMessage()    {}
        +func (*Integer64Proto) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_api_base_9d49f8792e0c1140, []int{2}
        +}
        +func (m *Integer64Proto) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_Integer64Proto.Unmarshal(m, b)
        +}
        +func (m *Integer64Proto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_Integer64Proto.Marshal(b, m, deterministic)
        +}
        +func (dst *Integer64Proto) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_Integer64Proto.Merge(dst, src)
        +}
        +func (m *Integer64Proto) XXX_Size() int {
        +	return xxx_messageInfo_Integer64Proto.Size(m)
        +}
        +func (m *Integer64Proto) XXX_DiscardUnknown() {
        +	xxx_messageInfo_Integer64Proto.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_Integer64Proto proto.InternalMessageInfo
         
         func (m *Integer64Proto) GetValue() int64 {
         	if m != nil && m.Value != nil {
        @@ -77,13 +133,35 @@ func (m *Integer64Proto) GetValue() int64 {
         }
         
         type BoolProto struct {
        -	Value            *bool  `protobuf:"varint,1,req,name=value" json:"value,omitempty"`
        -	XXX_unrecognized []byte `json:"-"`
        +	Value                *bool    `protobuf:"varint,1,req,name=value" json:"value,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *BoolProto) Reset()         { *m = BoolProto{} }
         func (m *BoolProto) String() string { return proto.CompactTextString(m) }
         func (*BoolProto) ProtoMessage()    {}
        +func (*BoolProto) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_api_base_9d49f8792e0c1140, []int{3}
        +}
        +func (m *BoolProto) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_BoolProto.Unmarshal(m, b)
        +}
        +func (m *BoolProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_BoolProto.Marshal(b, m, deterministic)
        +}
        +func (dst *BoolProto) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_BoolProto.Merge(dst, src)
        +}
        +func (m *BoolProto) XXX_Size() int {
        +	return xxx_messageInfo_BoolProto.Size(m)
        +}
        +func (m *BoolProto) XXX_DiscardUnknown() {
        +	xxx_messageInfo_BoolProto.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_BoolProto proto.InternalMessageInfo
         
         func (m *BoolProto) GetValue() bool {
         	if m != nil && m.Value != nil {
        @@ -93,13 +171,35 @@ func (m *BoolProto) GetValue() bool {
         }
         
         type DoubleProto struct {
        -	Value            *float64 `protobuf:"fixed64,1,req,name=value" json:"value,omitempty"`
        -	XXX_unrecognized []byte   `json:"-"`
        +	Value                *float64 `protobuf:"fixed64,1,req,name=value" json:"value,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *DoubleProto) Reset()         { *m = DoubleProto{} }
         func (m *DoubleProto) String() string { return proto.CompactTextString(m) }
         func (*DoubleProto) ProtoMessage()    {}
        +func (*DoubleProto) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_api_base_9d49f8792e0c1140, []int{4}
        +}
        +func (m *DoubleProto) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_DoubleProto.Unmarshal(m, b)
        +}
        +func (m *DoubleProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_DoubleProto.Marshal(b, m, deterministic)
        +}
        +func (dst *DoubleProto) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_DoubleProto.Merge(dst, src)
        +}
        +func (m *DoubleProto) XXX_Size() int {
        +	return xxx_messageInfo_DoubleProto.Size(m)
        +}
        +func (m *DoubleProto) XXX_DiscardUnknown() {
        +	xxx_messageInfo_DoubleProto.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_DoubleProto proto.InternalMessageInfo
         
         func (m *DoubleProto) GetValue() float64 {
         	if m != nil && m.Value != nil {
        @@ -109,13 +209,35 @@ func (m *DoubleProto) GetValue() float64 {
         }
         
         type BytesProto struct {
        -	Value            []byte `protobuf:"bytes,1,req,name=value" json:"value,omitempty"`
        -	XXX_unrecognized []byte `json:"-"`
        +	Value                []byte   `protobuf:"bytes,1,req,name=value" json:"value,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *BytesProto) Reset()         { *m = BytesProto{} }
         func (m *BytesProto) String() string { return proto.CompactTextString(m) }
         func (*BytesProto) ProtoMessage()    {}
        +func (*BytesProto) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_api_base_9d49f8792e0c1140, []int{5}
        +}
        +func (m *BytesProto) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_BytesProto.Unmarshal(m, b)
        +}
        +func (m *BytesProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_BytesProto.Marshal(b, m, deterministic)
        +}
        +func (dst *BytesProto) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_BytesProto.Merge(dst, src)
        +}
        +func (m *BytesProto) XXX_Size() int {
        +	return xxx_messageInfo_BytesProto.Size(m)
        +}
        +func (m *BytesProto) XXX_DiscardUnknown() {
        +	xxx_messageInfo_BytesProto.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_BytesProto proto.InternalMessageInfo
         
         func (m *BytesProto) GetValue() []byte {
         	if m != nil {
        @@ -125,9 +247,62 @@ func (m *BytesProto) GetValue() []byte {
         }
         
         type VoidProto struct {
        -	XXX_unrecognized []byte `json:"-"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *VoidProto) Reset()         { *m = VoidProto{} }
         func (m *VoidProto) String() string { return proto.CompactTextString(m) }
         func (*VoidProto) ProtoMessage()    {}
        +func (*VoidProto) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_api_base_9d49f8792e0c1140, []int{6}
        +}
        +func (m *VoidProto) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_VoidProto.Unmarshal(m, b)
        +}
        +func (m *VoidProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_VoidProto.Marshal(b, m, deterministic)
        +}
        +func (dst *VoidProto) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_VoidProto.Merge(dst, src)
        +}
        +func (m *VoidProto) XXX_Size() int {
        +	return xxx_messageInfo_VoidProto.Size(m)
        +}
        +func (m *VoidProto) XXX_DiscardUnknown() {
        +	xxx_messageInfo_VoidProto.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_VoidProto proto.InternalMessageInfo
        +
        +func init() {
        +	proto.RegisterType((*StringProto)(nil), "appengine.base.StringProto")
        +	proto.RegisterType((*Integer32Proto)(nil), "appengine.base.Integer32Proto")
        +	proto.RegisterType((*Integer64Proto)(nil), "appengine.base.Integer64Proto")
        +	proto.RegisterType((*BoolProto)(nil), "appengine.base.BoolProto")
        +	proto.RegisterType((*DoubleProto)(nil), "appengine.base.DoubleProto")
        +	proto.RegisterType((*BytesProto)(nil), "appengine.base.BytesProto")
        +	proto.RegisterType((*VoidProto)(nil), "appengine.base.VoidProto")
        +}
        +
        +func init() {
        +	proto.RegisterFile("google.golang.org/appengine/internal/base/api_base.proto", fileDescriptor_api_base_9d49f8792e0c1140)
        +}
        +
        +var fileDescriptor_api_base_9d49f8792e0c1140 = []byte{
        +	// 199 bytes of a gzipped FileDescriptorProto
        +	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0xcf, 0x3f, 0x4b, 0xc6, 0x30,
        +	0x10, 0x06, 0x70, 0x5a, 0xad, 0xb4, 0x57, 0xe9, 0x20, 0x0e, 0x1d, 0xb5, 0x05, 0x71, 0x4a, 0x40,
        +	0x45, 0x9c, 0x83, 0x8b, 0x9b, 0x28, 0x38, 0xb8, 0x48, 0x8a, 0xc7, 0x11, 0x08, 0xb9, 0x90, 0xa6,
        +	0x82, 0xdf, 0x5e, 0xda, 0xd2, 0xfa, 0xc2, 0x9b, 0xed, 0xfe, 0xfc, 0xe0, 0xe1, 0x81, 0x27, 0x62,
        +	0x26, 0x8b, 0x82, 0xd8, 0x6a, 0x47, 0x82, 0x03, 0x49, 0xed, 0x3d, 0x3a, 0x32, 0x0e, 0xa5, 0x71,
        +	0x11, 0x83, 0xd3, 0x56, 0x0e, 0x7a, 0x44, 0xa9, 0xbd, 0xf9, 0x9a, 0x07, 0xe1, 0x03, 0x47, 0xbe,
        +	0x68, 0x76, 0x27, 0xe6, 0x6b, 0xd7, 0x43, 0xfd, 0x1e, 0x83, 0x71, 0xf4, 0xba, 0xbc, 0x2f, 0xa1,
        +	0xf8, 0xd1, 0x76, 0xc2, 0x36, 0xbb, 0xca, 0x6f, 0xab, 0xb7, 0x75, 0xe9, 0x6e, 0xa0, 0x79, 0x71,
        +	0x11, 0x09, 0xc3, 0xfd, 0x5d, 0xc2, 0x15, 0xc7, 0xee, 0xf1, 0x21, 0xe1, 0x4e, 0x36, 0x77, 0x0d,
        +	0x95, 0x62, 0xb6, 0x09, 0x52, 0x6e, 0xa4, 0x87, 0xfa, 0x99, 0xa7, 0xc1, 0x62, 0x02, 0x65, 0xff,
        +	0x79, 0xa0, 0x7e, 0x23, 0x8e, 0xab, 0x69, 0x0f, 0xcd, 0xb9, 0xca, 0xcb, 0xdd, 0xd5, 0x50, 0x7d,
        +	0xb0, 0xf9, 0x5e, 0x98, 0x3a, 0xfb, 0x3c, 0x9d, 0x9b, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xba,
        +	0x37, 0x25, 0xea, 0x44, 0x01, 0x00, 0x00,
        +}
        diff --git a/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.pb.go b/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.pb.go
        index 8613cb731..2fb748289 100644
        --- a/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.pb.go
        +++ b/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.pb.go
        @@ -1,53 +1,6 @@
        -// Code generated by protoc-gen-go.
        +// Code generated by protoc-gen-go. DO NOT EDIT.
         // source: google.golang.org/appengine/internal/datastore/datastore_v3.proto
        -// DO NOT EDIT!
        -
        -/*
        -Package datastore is a generated protocol buffer package.
        -
        -It is generated from these files:
        -	google.golang.org/appengine/internal/datastore/datastore_v3.proto
        -
        -It has these top-level messages:
        -	Action
        -	PropertyValue
        -	Property
        -	Path
        -	Reference
        -	User
        -	EntityProto
        -	CompositeProperty
        -	Index
        -	CompositeIndex
        -	IndexPostfix
        -	IndexPosition
        -	Snapshot
        -	InternalHeader
        -	Transaction
        -	Query
        -	CompiledQuery
        -	CompiledCursor
        -	Cursor
        -	Error
        -	Cost
        -	GetRequest
        -	GetResponse
        -	PutRequest
        -	PutResponse
        -	TouchRequest
        -	TouchResponse
        -	DeleteRequest
        -	DeleteResponse
        -	NextRequest
        -	QueryResult
        -	AllocateIdsRequest
        -	AllocateIdsResponse
        -	CompositeIndices
        -	AddActionsRequest
        -	AddActionsResponse
        -	BeginTransactionRequest
        -	CommitResponse
        -*/
        +
         package datastore
         
         import proto "github.com/golang/protobuf/proto"
        @@ -59,6 +12,12 @@ var _ = proto.Marshal
         var _ = fmt.Errorf
         var _ = math.Inf
         
        +// This is a compile-time assertion to ensure that this generated file
        +// is compatible with the proto package it is being compiled against.
        +// A compilation error at this line likely means your copy of the
        +// proto package needs to be updated.
        +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
        +
         type Property_Meaning int32
         
         const (
        @@ -145,6 +104,9 @@ func (x *Property_Meaning) UnmarshalJSON(data []byte) error {
         	*x = Property_Meaning(value)
         	return nil
         }
        +func (Property_Meaning) EnumDescriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{2, 0}
        +}
         
         type Property_FtsTokenizationOption int32
         
        @@ -178,6 +140,9 @@ func (x *Property_FtsTokenizationOption) UnmarshalJSON(data []byte) error {
         	*x = Property_FtsTokenizationOption(value)
         	return nil
         }
        +func (Property_FtsTokenizationOption) EnumDescriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{2, 1}
        +}
         
         type EntityProto_Kind int32
         
        @@ -214,6 +179,9 @@ func (x *EntityProto_Kind) UnmarshalJSON(data []byte) error {
         	*x = EntityProto_Kind(value)
         	return nil
         }
        +func (EntityProto_Kind) EnumDescriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{6, 0}
        +}
         
         type Index_Property_Direction int32
         
        @@ -247,6 +215,9 @@ func (x *Index_Property_Direction) UnmarshalJSON(data []byte) error {
         	*x = Index_Property_Direction(value)
         	return nil
         }
        +func (Index_Property_Direction) EnumDescriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{8, 0, 0}
        +}
         
         type CompositeIndex_State int32
         
        @@ -286,6 +257,9 @@ func (x *CompositeIndex_State) UnmarshalJSON(data []byte) error {
         	*x = CompositeIndex_State(value)
         	return nil
         }
        +func (CompositeIndex_State) EnumDescriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{9, 0}
        +}
         
         type Snapshot_Status int32
         
        @@ -319,6 +293,9 @@ func (x *Snapshot_Status) UnmarshalJSON(data []byte) error {
         	*x = Snapshot_Status(value)
         	return nil
         }
        +func (Snapshot_Status) EnumDescriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{12, 0}
        +}
         
         type Query_Hint int32
         
        @@ -355,6 +332,9 @@ func (x *Query_Hint) UnmarshalJSON(data []byte) error {
         	*x = Query_Hint(value)
         	return nil
         }
        +func (Query_Hint) EnumDescriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{15, 0}
        +}
         
         type Query_Filter_Operator int32
         
        @@ -403,6 +383,9 @@ func (x *Query_Filter_Operator) UnmarshalJSON(data []byte) error {
         	*x = Query_Filter_Operator(value)
         	return nil
         }
        +func (Query_Filter_Operator) EnumDescriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{15, 0, 0}
        +}
         
         type Query_Order_Direction int32
         
        @@ -436,6 +419,9 @@ func (x *Query_Order_Direction) UnmarshalJSON(data []byte) error {
         	*x = Query_Order_Direction(value)
         	return nil
         }
        +func (Query_Order_Direction) EnumDescriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{15, 1, 0}
        +}
         
         type Error_ErrorCode int32
         
        @@ -496,6 +482,9 @@ func (x *Error_ErrorCode) UnmarshalJSON(data []byte) error {
         	*x = Error_ErrorCode(value)
         	return nil
         }
        +func (Error_ErrorCode) EnumDescriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{19, 0}
        +}
         
         type PutRequest_AutoIdPolicy int32
         
        @@ -529,29 +518,115 @@ func (x *PutRequest_AutoIdPolicy) UnmarshalJSON(data []byte) error {
         	*x = PutRequest_AutoIdPolicy(value)
         	return nil
         }
        +func (PutRequest_AutoIdPolicy) EnumDescriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{23, 0}
        +}
        +
        +type BeginTransactionRequest_TransactionMode int32
        +
        +const (
        +	BeginTransactionRequest_UNKNOWN    BeginTransactionRequest_TransactionMode = 0
        +	BeginTransactionRequest_READ_ONLY  BeginTransactionRequest_TransactionMode = 1
        +	BeginTransactionRequest_READ_WRITE BeginTransactionRequest_TransactionMode = 2
        +)
        +
        +var BeginTransactionRequest_TransactionMode_name = map[int32]string{
        +	0: "UNKNOWN",
        +	1: "READ_ONLY",
        +	2: "READ_WRITE",
        +}
        +var BeginTransactionRequest_TransactionMode_value = map[string]int32{
        +	"UNKNOWN":    0,
        +	"READ_ONLY":  1,
        +	"READ_WRITE": 2,
        +}
        +
        +func (x BeginTransactionRequest_TransactionMode) Enum() *BeginTransactionRequest_TransactionMode {
        +	p := new(BeginTransactionRequest_TransactionMode)
        +	*p = x
        +	return p
        +}
        +func (x BeginTransactionRequest_TransactionMode) String() string {
        +	return proto.EnumName(BeginTransactionRequest_TransactionMode_name, int32(x))
        +}
        +func (x *BeginTransactionRequest_TransactionMode) UnmarshalJSON(data []byte) error {
        +	value, err := proto.UnmarshalJSONEnum(BeginTransactionRequest_TransactionMode_value, data, "BeginTransactionRequest_TransactionMode")
        +	if err != nil {
        +		return err
        +	}
        +	*x = BeginTransactionRequest_TransactionMode(value)
        +	return nil
        +}
        +func (BeginTransactionRequest_TransactionMode) EnumDescriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{36, 0}
        +}
         
         type Action struct {
        -	XXX_unrecognized []byte `json:"-"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *Action) Reset()         { *m = Action{} }
         func (m *Action) String() string { return proto.CompactTextString(m) }
         func (*Action) ProtoMessage()    {}
        +func (*Action) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{0}
        +}
        +func (m *Action) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_Action.Unmarshal(m, b)
        +}
        +func (m *Action) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_Action.Marshal(b, m, deterministic)
        +}
        +func (dst *Action) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_Action.Merge(dst, src)
        +}
        +func (m *Action) XXX_Size() int {
        +	return xxx_messageInfo_Action.Size(m)
        +}
        +func (m *Action) XXX_DiscardUnknown() {
        +	xxx_messageInfo_Action.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_Action proto.InternalMessageInfo
         
         type PropertyValue struct {
        -	Int64Value       *int64                        `protobuf:"varint,1,opt,name=int64Value" json:"int64Value,omitempty"`
        -	BooleanValue     *bool                         `protobuf:"varint,2,opt,name=booleanValue" json:"booleanValue,omitempty"`
        -	StringValue      *string                       `protobuf:"bytes,3,opt,name=stringValue" json:"stringValue,omitempty"`
        -	DoubleValue      *float64                      `protobuf:"fixed64,4,opt,name=doubleValue" json:"doubleValue,omitempty"`
        -	Pointvalue       *PropertyValue_PointValue     `protobuf:"group,5,opt,name=PointValue" json:"pointvalue,omitempty"`
        -	Uservalue        *PropertyValue_UserValue      `protobuf:"group,8,opt,name=UserValue" json:"uservalue,omitempty"`
        -	Referencevalue   *PropertyValue_ReferenceValue `protobuf:"group,12,opt,name=ReferenceValue" json:"referencevalue,omitempty"`
        -	XXX_unrecognized []byte                        `json:"-"`
        +	Int64Value           *int64                        `protobuf:"varint,1,opt,name=int64Value" json:"int64Value,omitempty"`
        +	BooleanValue         *bool                         `protobuf:"varint,2,opt,name=booleanValue" json:"booleanValue,omitempty"`
        +	StringValue          *string                       `protobuf:"bytes,3,opt,name=stringValue" json:"stringValue,omitempty"`
        +	DoubleValue          *float64                      `protobuf:"fixed64,4,opt,name=doubleValue" json:"doubleValue,omitempty"`
        +	Pointvalue           *PropertyValue_PointValue     `protobuf:"group,5,opt,name=PointValue,json=pointvalue" json:"pointvalue,omitempty"`
        +	Uservalue            *PropertyValue_UserValue      `protobuf:"group,8,opt,name=UserValue,json=uservalue" json:"uservalue,omitempty"`
        +	Referencevalue       *PropertyValue_ReferenceValue `protobuf:"group,12,opt,name=ReferenceValue,json=referencevalue" json:"referencevalue,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
        +	XXX_unrecognized     []byte                        `json:"-"`
        +	XXX_sizecache        int32                         `json:"-"`
         }
         
         func (m *PropertyValue) Reset()         { *m = PropertyValue{} }
         func (m *PropertyValue) String() string { return proto.CompactTextString(m) }
         func (*PropertyValue) ProtoMessage()    {}
        +func (*PropertyValue) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{1}
        +}
        +func (m *PropertyValue) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_PropertyValue.Unmarshal(m, b)
        +}
        +func (m *PropertyValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_PropertyValue.Marshal(b, m, deterministic)
        +}
        +func (dst *PropertyValue) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_PropertyValue.Merge(dst, src)
        +}
        +func (m *PropertyValue) XXX_Size() int {
        +	return xxx_messageInfo_PropertyValue.Size(m)
        +}
        +func (m *PropertyValue) XXX_DiscardUnknown() {
        +	xxx_messageInfo_PropertyValue.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_PropertyValue proto.InternalMessageInfo
         
         func (m *PropertyValue) GetInt64Value() int64 {
         	if m != nil && m.Int64Value != nil {
        @@ -603,14 +678,36 @@ func (m *PropertyValue) GetReferencevalue() *PropertyValue_ReferenceValue {
         }
         
         type PropertyValue_PointValue struct {
        -	X                *float64 `protobuf:"fixed64,6,req,name=x" json:"x,omitempty"`
        -	Y                *float64 `protobuf:"fixed64,7,req,name=y" json:"y,omitempty"`
        -	XXX_unrecognized []byte   `json:"-"`
        +	X                    *float64 `protobuf:"fixed64,6,req,name=x" json:"x,omitempty"`
        +	Y                    *float64 `protobuf:"fixed64,7,req,name=y" json:"y,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *PropertyValue_PointValue) Reset()         { *m = PropertyValue_PointValue{} }
         func (m *PropertyValue_PointValue) String() string { return proto.CompactTextString(m) }
         func (*PropertyValue_PointValue) ProtoMessage()    {}
        +func (*PropertyValue_PointValue) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{1, 0}
        +}
        +func (m *PropertyValue_PointValue) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_PropertyValue_PointValue.Unmarshal(m, b)
        +}
        +func (m *PropertyValue_PointValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_PropertyValue_PointValue.Marshal(b, m, deterministic)
        +}
        +func (dst *PropertyValue_PointValue) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_PropertyValue_PointValue.Merge(dst, src)
        +}
        +func (m *PropertyValue_PointValue) XXX_Size() int {
        +	return xxx_messageInfo_PropertyValue_PointValue.Size(m)
        +}
        +func (m *PropertyValue_PointValue) XXX_DiscardUnknown() {
        +	xxx_messageInfo_PropertyValue_PointValue.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_PropertyValue_PointValue proto.InternalMessageInfo
         
         func (m *PropertyValue_PointValue) GetX() float64 {
         	if m != nil && m.X != nil {
        @@ -627,17 +724,39 @@ func (m *PropertyValue_PointValue) GetY() float64 {
         }
         
         type PropertyValue_UserValue struct {
        -	Email             *string `protobuf:"bytes,9,req,name=email" json:"email,omitempty"`
        -	AuthDomain        *string `protobuf:"bytes,10,req,name=auth_domain" json:"auth_domain,omitempty"`
        -	Nickname          *string `protobuf:"bytes,11,opt,name=nickname" json:"nickname,omitempty"`
        -	FederatedIdentity *string `protobuf:"bytes,21,opt,name=federated_identity" json:"federated_identity,omitempty"`
        -	FederatedProvider *string `protobuf:"bytes,22,opt,name=federated_provider" json:"federated_provider,omitempty"`
        -	XXX_unrecognized  []byte  `json:"-"`
        +	Email                *string  `protobuf:"bytes,9,req,name=email" json:"email,omitempty"`
        +	AuthDomain           *string  `protobuf:"bytes,10,req,name=auth_domain,json=authDomain" json:"auth_domain,omitempty"`
        +	Nickname             *string  `protobuf:"bytes,11,opt,name=nickname" json:"nickname,omitempty"`
        +	FederatedIdentity    *string  `protobuf:"bytes,21,opt,name=federated_identity,json=federatedIdentity" json:"federated_identity,omitempty"`
        +	FederatedProvider    *string  `protobuf:"bytes,22,opt,name=federated_provider,json=federatedProvider" json:"federated_provider,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *PropertyValue_UserValue) Reset()         { *m = PropertyValue_UserValue{} }
         func (m *PropertyValue_UserValue) String() string { return proto.CompactTextString(m) }
         func (*PropertyValue_UserValue) ProtoMessage()    {}
        +func (*PropertyValue_UserValue) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{1, 1}
        +}
        +func (m *PropertyValue_UserValue) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_PropertyValue_UserValue.Unmarshal(m, b)
        +}
        +func (m *PropertyValue_UserValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_PropertyValue_UserValue.Marshal(b, m, deterministic)
        +}
        +func (dst *PropertyValue_UserValue) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_PropertyValue_UserValue.Merge(dst, src)
        +}
        +func (m *PropertyValue_UserValue) XXX_Size() int {
        +	return xxx_messageInfo_PropertyValue_UserValue.Size(m)
        +}
        +func (m *PropertyValue_UserValue) XXX_DiscardUnknown() {
        +	xxx_messageInfo_PropertyValue_UserValue.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_PropertyValue_UserValue proto.InternalMessageInfo
         
         func (m *PropertyValue_UserValue) GetEmail() string {
         	if m != nil && m.Email != nil {
        @@ -675,15 +794,37 @@ func (m *PropertyValue_UserValue) GetFederatedProvider() string {
         }
         
         type PropertyValue_ReferenceValue struct {
        -	App              *string                                     `protobuf:"bytes,13,req,name=app" json:"app,omitempty"`
        -	NameSpace        *string                                     `protobuf:"bytes,20,opt,name=name_space" json:"name_space,omitempty"`
        -	Pathelement      []*PropertyValue_ReferenceValue_PathElement `protobuf:"group,14,rep,name=PathElement" json:"pathelement,omitempty"`
        -	XXX_unrecognized []byte                                      `json:"-"`
        +	App                  *string                                     `protobuf:"bytes,13,req,name=app" json:"app,omitempty"`
        +	NameSpace            *string                                     `protobuf:"bytes,20,opt,name=name_space,json=nameSpace" json:"name_space,omitempty"`
        +	Pathelement          []*PropertyValue_ReferenceValue_PathElement `protobuf:"group,14,rep,name=PathElement,json=pathelement" json:"pathelement,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}                                    `json:"-"`
        +	XXX_unrecognized     []byte                                      `json:"-"`
        +	XXX_sizecache        int32                                       `json:"-"`
         }
         
         func (m *PropertyValue_ReferenceValue) Reset()         { *m = PropertyValue_ReferenceValue{} }
         func (m *PropertyValue_ReferenceValue) String() string { return proto.CompactTextString(m) }
         func (*PropertyValue_ReferenceValue) ProtoMessage()    {}
        +func (*PropertyValue_ReferenceValue) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{1, 2}
        +}
        +func (m *PropertyValue_ReferenceValue) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_PropertyValue_ReferenceValue.Unmarshal(m, b)
        +}
        +func (m *PropertyValue_ReferenceValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_PropertyValue_ReferenceValue.Marshal(b, m, deterministic)
        +}
        +func (dst *PropertyValue_ReferenceValue) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_PropertyValue_ReferenceValue.Merge(dst, src)
        +}
        +func (m *PropertyValue_ReferenceValue) XXX_Size() int {
        +	return xxx_messageInfo_PropertyValue_ReferenceValue.Size(m)
        +}
        +func (m *PropertyValue_ReferenceValue) XXX_DiscardUnknown() {
        +	xxx_messageInfo_PropertyValue_ReferenceValue.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_PropertyValue_ReferenceValue proto.InternalMessageInfo
         
         func (m *PropertyValue_ReferenceValue) GetApp() string {
         	if m != nil && m.App != nil {
        @@ -707,10 +848,12 @@ func (m *PropertyValue_ReferenceValue) GetPathelement() []*PropertyValue_Referen
         }
         
         type PropertyValue_ReferenceValue_PathElement struct {
        -	Type             *string `protobuf:"bytes,15,req,name=type" json:"type,omitempty"`
        -	Id               *int64  `protobuf:"varint,16,opt,name=id" json:"id,omitempty"`
        -	Name             *string `protobuf:"bytes,17,opt,name=name" json:"name,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	Type                 *string  `protobuf:"bytes,15,req,name=type" json:"type,omitempty"`
        +	Id                   *int64   `protobuf:"varint,16,opt,name=id" json:"id,omitempty"`
        +	Name                 *string  `protobuf:"bytes,17,opt,name=name" json:"name,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *PropertyValue_ReferenceValue_PathElement) Reset() {
        @@ -718,6 +861,26 @@ func (m *PropertyValue_ReferenceValue_PathElement) Reset() {
         }
         func (m *PropertyValue_ReferenceValue_PathElement) String() string { return proto.CompactTextString(m) }
         func (*PropertyValue_ReferenceValue_PathElement) ProtoMessage()    {}
        +func (*PropertyValue_ReferenceValue_PathElement) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{1, 2, 0}
        +}
        +func (m *PropertyValue_ReferenceValue_PathElement) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_PropertyValue_ReferenceValue_PathElement.Unmarshal(m, b)
        +}
        +func (m *PropertyValue_ReferenceValue_PathElement) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_PropertyValue_ReferenceValue_PathElement.Marshal(b, m, deterministic)
        +}
        +func (dst *PropertyValue_ReferenceValue_PathElement) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_PropertyValue_ReferenceValue_PathElement.Merge(dst, src)
        +}
        +func (m *PropertyValue_ReferenceValue_PathElement) XXX_Size() int {
        +	return xxx_messageInfo_PropertyValue_ReferenceValue_PathElement.Size(m)
        +}
        +func (m *PropertyValue_ReferenceValue_PathElement) XXX_DiscardUnknown() {
        +	xxx_messageInfo_PropertyValue_ReferenceValue_PathElement.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_PropertyValue_ReferenceValue_PathElement proto.InternalMessageInfo
         
         func (m *PropertyValue_ReferenceValue_PathElement) GetType() string {
         	if m != nil && m.Type != nil {
        @@ -742,19 +905,41 @@ func (m *PropertyValue_ReferenceValue_PathElement) GetName() string {
         
         type Property struct {
         	Meaning               *Property_Meaning               `protobuf:"varint,1,opt,name=meaning,enum=appengine.Property_Meaning,def=0" json:"meaning,omitempty"`
        -	MeaningUri            *string                         `protobuf:"bytes,2,opt,name=meaning_uri" json:"meaning_uri,omitempty"`
        +	MeaningUri            *string                         `protobuf:"bytes,2,opt,name=meaning_uri,json=meaningUri" json:"meaning_uri,omitempty"`
         	Name                  *string                         `protobuf:"bytes,3,req,name=name" json:"name,omitempty"`
         	Value                 *PropertyValue                  `protobuf:"bytes,5,req,name=value" json:"value,omitempty"`
         	Multiple              *bool                           `protobuf:"varint,4,req,name=multiple" json:"multiple,omitempty"`
         	Searchable            *bool                           `protobuf:"varint,6,opt,name=searchable,def=0" json:"searchable,omitempty"`
        -	FtsTokenizationOption *Property_FtsTokenizationOption `protobuf:"varint,8,opt,name=fts_tokenization_option,enum=appengine.Property_FtsTokenizationOption" json:"fts_tokenization_option,omitempty"`
        +	FtsTokenizationOption *Property_FtsTokenizationOption `protobuf:"varint,8,opt,name=fts_tokenization_option,json=ftsTokenizationOption,enum=appengine.Property_FtsTokenizationOption" json:"fts_tokenization_option,omitempty"`
         	Locale                *string                         `protobuf:"bytes,9,opt,name=locale,def=en" json:"locale,omitempty"`
        +	XXX_NoUnkeyedLiteral  struct{}                        `json:"-"`
         	XXX_unrecognized      []byte                          `json:"-"`
        +	XXX_sizecache         int32                           `json:"-"`
         }
         
         func (m *Property) Reset()         { *m = Property{} }
         func (m *Property) String() string { return proto.CompactTextString(m) }
         func (*Property) ProtoMessage()    {}
        +func (*Property) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{2}
        +}
        +func (m *Property) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_Property.Unmarshal(m, b)
        +}
        +func (m *Property) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_Property.Marshal(b, m, deterministic)
        +}
        +func (dst *Property) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_Property.Merge(dst, src)
        +}
        +func (m *Property) XXX_Size() int {
        +	return xxx_messageInfo_Property.Size(m)
        +}
        +func (m *Property) XXX_DiscardUnknown() {
        +	xxx_messageInfo_Property.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_Property proto.InternalMessageInfo
         
         const Default_Property_Meaning Property_Meaning = Property_NO_MEANING
         const Default_Property_Searchable bool = false
        @@ -817,13 +1002,35 @@ func (m *Property) GetLocale() string {
         }
         
         type Path struct {
        -	Element          []*Path_Element `protobuf:"group,1,rep,name=Element" json:"element,omitempty"`
        -	XXX_unrecognized []byte          `json:"-"`
        +	Element              []*Path_Element `protobuf:"group,1,rep,name=Element,json=element" json:"element,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
        +	XXX_unrecognized     []byte          `json:"-"`
        +	XXX_sizecache        int32           `json:"-"`
         }
         
         func (m *Path) Reset()         { *m = Path{} }
         func (m *Path) String() string { return proto.CompactTextString(m) }
         func (*Path) ProtoMessage()    {}
        +func (*Path) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{3}
        +}
        +func (m *Path) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_Path.Unmarshal(m, b)
        +}
        +func (m *Path) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_Path.Marshal(b, m, deterministic)
        +}
        +func (dst *Path) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_Path.Merge(dst, src)
        +}
        +func (m *Path) XXX_Size() int {
        +	return xxx_messageInfo_Path.Size(m)
        +}
        +func (m *Path) XXX_DiscardUnknown() {
        +	xxx_messageInfo_Path.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_Path proto.InternalMessageInfo
         
         func (m *Path) GetElement() []*Path_Element {
         	if m != nil {
        @@ -833,15 +1040,37 @@ func (m *Path) GetElement() []*Path_Element {
         }
         
         type Path_Element struct {
        -	Type             *string `protobuf:"bytes,2,req,name=type" json:"type,omitempty"`
        -	Id               *int64  `protobuf:"varint,3,opt,name=id" json:"id,omitempty"`
        -	Name             *string `protobuf:"bytes,4,opt,name=name" json:"name,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	Type                 *string  `protobuf:"bytes,2,req,name=type" json:"type,omitempty"`
        +	Id                   *int64   `protobuf:"varint,3,opt,name=id" json:"id,omitempty"`
        +	Name                 *string  `protobuf:"bytes,4,opt,name=name" json:"name,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *Path_Element) Reset()         { *m = Path_Element{} }
         func (m *Path_Element) String() string { return proto.CompactTextString(m) }
         func (*Path_Element) ProtoMessage()    {}
        +func (*Path_Element) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{3, 0}
        +}
        +func (m *Path_Element) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_Path_Element.Unmarshal(m, b)
        +}
        +func (m *Path_Element) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_Path_Element.Marshal(b, m, deterministic)
        +}
        +func (dst *Path_Element) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_Path_Element.Merge(dst, src)
        +}
        +func (m *Path_Element) XXX_Size() int {
        +	return xxx_messageInfo_Path_Element.Size(m)
        +}
        +func (m *Path_Element) XXX_DiscardUnknown() {
        +	xxx_messageInfo_Path_Element.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_Path_Element proto.InternalMessageInfo
         
         func (m *Path_Element) GetType() string {
         	if m != nil && m.Type != nil {
        @@ -865,15 +1094,37 @@ func (m *Path_Element) GetName() string {
         }
         
         type Reference struct {
        -	App              *string `protobuf:"bytes,13,req,name=app" json:"app,omitempty"`
        -	NameSpace        *string `protobuf:"bytes,20,opt,name=name_space" json:"name_space,omitempty"`
        -	Path             *Path   `protobuf:"bytes,14,req,name=path" json:"path,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	App                  *string  `protobuf:"bytes,13,req,name=app" json:"app,omitempty"`
        +	NameSpace            *string  `protobuf:"bytes,20,opt,name=name_space,json=nameSpace" json:"name_space,omitempty"`
        +	Path                 *Path    `protobuf:"bytes,14,req,name=path" json:"path,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *Reference) Reset()         { *m = Reference{} }
         func (m *Reference) String() string { return proto.CompactTextString(m) }
         func (*Reference) ProtoMessage()    {}
        +func (*Reference) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{4}
        +}
        +func (m *Reference) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_Reference.Unmarshal(m, b)
        +}
        +func (m *Reference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_Reference.Marshal(b, m, deterministic)
        +}
        +func (dst *Reference) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_Reference.Merge(dst, src)
        +}
        +func (m *Reference) XXX_Size() int {
        +	return xxx_messageInfo_Reference.Size(m)
        +}
        +func (m *Reference) XXX_DiscardUnknown() {
        +	xxx_messageInfo_Reference.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_Reference proto.InternalMessageInfo
         
         func (m *Reference) GetApp() string {
         	if m != nil && m.App != nil {
        @@ -897,17 +1148,39 @@ func (m *Reference) GetPath() *Path {
         }
         
         type User struct {
        -	Email             *string `protobuf:"bytes,1,req,name=email" json:"email,omitempty"`
        -	AuthDomain        *string `protobuf:"bytes,2,req,name=auth_domain" json:"auth_domain,omitempty"`
        -	Nickname          *string `protobuf:"bytes,3,opt,name=nickname" json:"nickname,omitempty"`
        -	FederatedIdentity *string `protobuf:"bytes,6,opt,name=federated_identity" json:"federated_identity,omitempty"`
        -	FederatedProvider *string `protobuf:"bytes,7,opt,name=federated_provider" json:"federated_provider,omitempty"`
        -	XXX_unrecognized  []byte  `json:"-"`
        +	Email                *string  `protobuf:"bytes,1,req,name=email" json:"email,omitempty"`
        +	AuthDomain           *string  `protobuf:"bytes,2,req,name=auth_domain,json=authDomain" json:"auth_domain,omitempty"`
        +	Nickname             *string  `protobuf:"bytes,3,opt,name=nickname" json:"nickname,omitempty"`
        +	FederatedIdentity    *string  `protobuf:"bytes,6,opt,name=federated_identity,json=federatedIdentity" json:"federated_identity,omitempty"`
        +	FederatedProvider    *string  `protobuf:"bytes,7,opt,name=federated_provider,json=federatedProvider" json:"federated_provider,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *User) Reset()         { *m = User{} }
         func (m *User) String() string { return proto.CompactTextString(m) }
         func (*User) ProtoMessage()    {}
        +func (*User) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{5}
        +}
        +func (m *User) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_User.Unmarshal(m, b)
        +}
        +func (m *User) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_User.Marshal(b, m, deterministic)
        +}
        +func (dst *User) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_User.Merge(dst, src)
        +}
        +func (m *User) XXX_Size() int {
        +	return xxx_messageInfo_User.Size(m)
        +}
        +func (m *User) XXX_DiscardUnknown() {
        +	xxx_messageInfo_User.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_User proto.InternalMessageInfo
         
         func (m *User) GetEmail() string {
         	if m != nil && m.Email != nil {
        @@ -945,20 +1218,42 @@ func (m *User) GetFederatedProvider() string {
         }
         
         type EntityProto struct {
        -	Key              *Reference        `protobuf:"bytes,13,req,name=key" json:"key,omitempty"`
        -	EntityGroup      *Path             `protobuf:"bytes,16,req,name=entity_group" json:"entity_group,omitempty"`
        -	Owner            *User             `protobuf:"bytes,17,opt,name=owner" json:"owner,omitempty"`
        -	Kind             *EntityProto_Kind `protobuf:"varint,4,opt,name=kind,enum=appengine.EntityProto_Kind" json:"kind,omitempty"`
        -	KindUri          *string           `protobuf:"bytes,5,opt,name=kind_uri" json:"kind_uri,omitempty"`
        -	Property         []*Property       `protobuf:"bytes,14,rep,name=property" json:"property,omitempty"`
        -	RawProperty      []*Property       `protobuf:"bytes,15,rep,name=raw_property" json:"raw_property,omitempty"`
        -	Rank             *int32            `protobuf:"varint,18,opt,name=rank" json:"rank,omitempty"`
        -	XXX_unrecognized []byte            `json:"-"`
        +	Key                  *Reference        `protobuf:"bytes,13,req,name=key" json:"key,omitempty"`
        +	EntityGroup          *Path             `protobuf:"bytes,16,req,name=entity_group,json=entityGroup" json:"entity_group,omitempty"`
        +	Owner                *User             `protobuf:"bytes,17,opt,name=owner" json:"owner,omitempty"`
        +	Kind                 *EntityProto_Kind `protobuf:"varint,4,opt,name=kind,enum=appengine.EntityProto_Kind" json:"kind,omitempty"`
        +	KindUri              *string           `protobuf:"bytes,5,opt,name=kind_uri,json=kindUri" json:"kind_uri,omitempty"`
        +	Property             []*Property       `protobuf:"bytes,14,rep,name=property" json:"property,omitempty"`
        +	RawProperty          []*Property       `protobuf:"bytes,15,rep,name=raw_property,json=rawProperty" json:"raw_property,omitempty"`
        +	Rank                 *int32            `protobuf:"varint,18,opt,name=rank" json:"rank,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
        +	XXX_unrecognized     []byte            `json:"-"`
        +	XXX_sizecache        int32             `json:"-"`
         }
         
         func (m *EntityProto) Reset()         { *m = EntityProto{} }
         func (m *EntityProto) String() string { return proto.CompactTextString(m) }
         func (*EntityProto) ProtoMessage()    {}
        +func (*EntityProto) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{6}
        +}
        +func (m *EntityProto) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_EntityProto.Unmarshal(m, b)
        +}
        +func (m *EntityProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_EntityProto.Marshal(b, m, deterministic)
        +}
        +func (dst *EntityProto) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_EntityProto.Merge(dst, src)
        +}
        +func (m *EntityProto) XXX_Size() int {
        +	return xxx_messageInfo_EntityProto.Size(m)
        +}
        +func (m *EntityProto) XXX_DiscardUnknown() {
        +	xxx_messageInfo_EntityProto.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_EntityProto proto.InternalMessageInfo
         
         func (m *EntityProto) GetKey() *Reference {
         	if m != nil {
        @@ -1017,14 +1312,36 @@ func (m *EntityProto) GetRank() int32 {
         }
         
         type CompositeProperty struct {
        -	IndexId          *int64   `protobuf:"varint,1,req,name=index_id" json:"index_id,omitempty"`
        -	Value            []string `protobuf:"bytes,2,rep,name=value" json:"value,omitempty"`
        -	XXX_unrecognized []byte   `json:"-"`
        +	IndexId              *int64   `protobuf:"varint,1,req,name=index_id,json=indexId" json:"index_id,omitempty"`
        +	Value                []string `protobuf:"bytes,2,rep,name=value" json:"value,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *CompositeProperty) Reset()         { *m = CompositeProperty{} }
         func (m *CompositeProperty) String() string { return proto.CompactTextString(m) }
         func (*CompositeProperty) ProtoMessage()    {}
        +func (*CompositeProperty) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{7}
        +}
        +func (m *CompositeProperty) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_CompositeProperty.Unmarshal(m, b)
        +}
        +func (m *CompositeProperty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_CompositeProperty.Marshal(b, m, deterministic)
        +}
        +func (dst *CompositeProperty) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_CompositeProperty.Merge(dst, src)
        +}
        +func (m *CompositeProperty) XXX_Size() int {
        +	return xxx_messageInfo_CompositeProperty.Size(m)
        +}
        +func (m *CompositeProperty) XXX_DiscardUnknown() {
        +	xxx_messageInfo_CompositeProperty.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_CompositeProperty proto.InternalMessageInfo
         
         func (m *CompositeProperty) GetIndexId() int64 {
         	if m != nil && m.IndexId != nil {
        @@ -1041,15 +1358,37 @@ func (m *CompositeProperty) GetValue() []string {
         }
         
         type Index struct {
        -	EntityType       *string           `protobuf:"bytes,1,req,name=entity_type" json:"entity_type,omitempty"`
        -	Ancestor         *bool             `protobuf:"varint,5,req,name=ancestor" json:"ancestor,omitempty"`
        -	Property         []*Index_Property `protobuf:"group,2,rep,name=Property" json:"property,omitempty"`
        -	XXX_unrecognized []byte            `json:"-"`
        +	EntityType           *string           `protobuf:"bytes,1,req,name=entity_type,json=entityType" json:"entity_type,omitempty"`
        +	Ancestor             *bool             `protobuf:"varint,5,req,name=ancestor" json:"ancestor,omitempty"`
        +	Property             []*Index_Property `protobuf:"group,2,rep,name=Property,json=property" json:"property,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
        +	XXX_unrecognized     []byte            `json:"-"`
        +	XXX_sizecache        int32             `json:"-"`
         }
         
         func (m *Index) Reset()         { *m = Index{} }
         func (m *Index) String() string { return proto.CompactTextString(m) }
         func (*Index) ProtoMessage()    {}
        +func (*Index) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{8}
        +}
        +func (m *Index) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_Index.Unmarshal(m, b)
        +}
        +func (m *Index) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_Index.Marshal(b, m, deterministic)
        +}
        +func (dst *Index) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_Index.Merge(dst, src)
        +}
        +func (m *Index) XXX_Size() int {
        +	return xxx_messageInfo_Index.Size(m)
        +}
        +func (m *Index) XXX_DiscardUnknown() {
        +	xxx_messageInfo_Index.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_Index proto.InternalMessageInfo
         
         func (m *Index) GetEntityType() string {
         	if m != nil && m.EntityType != nil {
        @@ -1073,14 +1412,36 @@ func (m *Index) GetProperty() []*Index_Property {
         }
         
         type Index_Property struct {
        -	Name             *string                   `protobuf:"bytes,3,req,name=name" json:"name,omitempty"`
        -	Direction        *Index_Property_Direction `protobuf:"varint,4,opt,name=direction,enum=appengine.Index_Property_Direction,def=1" json:"direction,omitempty"`
        -	XXX_unrecognized []byte                    `json:"-"`
        +	Name                 *string                   `protobuf:"bytes,3,req,name=name" json:"name,omitempty"`
        +	Direction            *Index_Property_Direction `protobuf:"varint,4,opt,name=direction,enum=appengine.Index_Property_Direction,def=1" json:"direction,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
        +	XXX_unrecognized     []byte                    `json:"-"`
        +	XXX_sizecache        int32                     `json:"-"`
         }
         
         func (m *Index_Property) Reset()         { *m = Index_Property{} }
         func (m *Index_Property) String() string { return proto.CompactTextString(m) }
         func (*Index_Property) ProtoMessage()    {}
        +func (*Index_Property) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{8, 0}
        +}
        +func (m *Index_Property) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_Index_Property.Unmarshal(m, b)
        +}
        +func (m *Index_Property) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_Index_Property.Marshal(b, m, deterministic)
        +}
        +func (dst *Index_Property) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_Index_Property.Merge(dst, src)
        +}
        +func (m *Index_Property) XXX_Size() int {
        +	return xxx_messageInfo_Index_Property.Size(m)
        +}
        +func (m *Index_Property) XXX_DiscardUnknown() {
        +	xxx_messageInfo_Index_Property.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_Index_Property proto.InternalMessageInfo
         
         const Default_Index_Property_Direction Index_Property_Direction = Index_Property_ASCENDING
         
        @@ -1099,17 +1460,39 @@ func (m *Index_Property) GetDirection() Index_Property_Direction {
         }
         
         type CompositeIndex struct {
        -	AppId             *string               `protobuf:"bytes,1,req,name=app_id" json:"app_id,omitempty"`
        -	Id                *int64                `protobuf:"varint,2,req,name=id" json:"id,omitempty"`
        -	Definition        *Index                `protobuf:"bytes,3,req,name=definition" json:"definition,omitempty"`
        -	State             *CompositeIndex_State `protobuf:"varint,4,req,name=state,enum=appengine.CompositeIndex_State" json:"state,omitempty"`
        -	OnlyUseIfRequired *bool                 `protobuf:"varint,6,opt,name=only_use_if_required,def=0" json:"only_use_if_required,omitempty"`
        -	XXX_unrecognized  []byte                `json:"-"`
        +	AppId                *string               `protobuf:"bytes,1,req,name=app_id,json=appId" json:"app_id,omitempty"`
        +	Id                   *int64                `protobuf:"varint,2,req,name=id" json:"id,omitempty"`
        +	Definition           *Index                `protobuf:"bytes,3,req,name=definition" json:"definition,omitempty"`
        +	State                *CompositeIndex_State `protobuf:"varint,4,req,name=state,enum=appengine.CompositeIndex_State" json:"state,omitempty"`
        +	OnlyUseIfRequired    *bool                 `protobuf:"varint,6,opt,name=only_use_if_required,json=onlyUseIfRequired,def=0" json:"only_use_if_required,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
        +	XXX_unrecognized     []byte                `json:"-"`
        +	XXX_sizecache        int32                 `json:"-"`
         }
         
         func (m *CompositeIndex) Reset()         { *m = CompositeIndex{} }
         func (m *CompositeIndex) String() string { return proto.CompactTextString(m) }
         func (*CompositeIndex) ProtoMessage()    {}
        +func (*CompositeIndex) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{9}
        +}
        +func (m *CompositeIndex) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_CompositeIndex.Unmarshal(m, b)
        +}
        +func (m *CompositeIndex) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_CompositeIndex.Marshal(b, m, deterministic)
        +}
        +func (dst *CompositeIndex) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_CompositeIndex.Merge(dst, src)
        +}
        +func (m *CompositeIndex) XXX_Size() int {
        +	return xxx_messageInfo_CompositeIndex.Size(m)
        +}
        +func (m *CompositeIndex) XXX_DiscardUnknown() {
        +	xxx_messageInfo_CompositeIndex.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_CompositeIndex proto.InternalMessageInfo
         
         const Default_CompositeIndex_OnlyUseIfRequired bool = false
         
        @@ -1149,15 +1532,37 @@ func (m *CompositeIndex) GetOnlyUseIfRequired() bool {
         }
         
         type IndexPostfix struct {
        -	IndexValue       []*IndexPostfix_IndexValue `protobuf:"bytes,1,rep,name=index_value" json:"index_value,omitempty"`
        -	Key              *Reference                 `protobuf:"bytes,2,opt,name=key" json:"key,omitempty"`
        -	Before           *bool                      `protobuf:"varint,3,opt,name=before,def=1" json:"before,omitempty"`
        -	XXX_unrecognized []byte                     `json:"-"`
        +	IndexValue           []*IndexPostfix_IndexValue `protobuf:"bytes,1,rep,name=index_value,json=indexValue" json:"index_value,omitempty"`
        +	Key                  *Reference                 `protobuf:"bytes,2,opt,name=key" json:"key,omitempty"`
        +	Before               *bool                      `protobuf:"varint,3,opt,name=before,def=1" json:"before,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
        +	XXX_unrecognized     []byte                     `json:"-"`
        +	XXX_sizecache        int32                      `json:"-"`
         }
         
         func (m *IndexPostfix) Reset()         { *m = IndexPostfix{} }
         func (m *IndexPostfix) String() string { return proto.CompactTextString(m) }
         func (*IndexPostfix) ProtoMessage()    {}
        +func (*IndexPostfix) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{10}
        +}
        +func (m *IndexPostfix) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_IndexPostfix.Unmarshal(m, b)
        +}
        +func (m *IndexPostfix) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_IndexPostfix.Marshal(b, m, deterministic)
        +}
        +func (dst *IndexPostfix) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_IndexPostfix.Merge(dst, src)
        +}
        +func (m *IndexPostfix) XXX_Size() int {
        +	return xxx_messageInfo_IndexPostfix.Size(m)
        +}
        +func (m *IndexPostfix) XXX_DiscardUnknown() {
        +	xxx_messageInfo_IndexPostfix.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_IndexPostfix proto.InternalMessageInfo
         
         const Default_IndexPostfix_Before bool = true
         
        @@ -1183,14 +1588,36 @@ func (m *IndexPostfix) GetBefore() bool {
         }
         
         type IndexPostfix_IndexValue struct {
        -	PropertyName     *string        `protobuf:"bytes,1,req,name=property_name" json:"property_name,omitempty"`
        -	Value            *PropertyValue `protobuf:"bytes,2,req,name=value" json:"value,omitempty"`
        -	XXX_unrecognized []byte         `json:"-"`
        +	PropertyName         *string        `protobuf:"bytes,1,req,name=property_name,json=propertyName" json:"property_name,omitempty"`
        +	Value                *PropertyValue `protobuf:"bytes,2,req,name=value" json:"value,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
        +	XXX_unrecognized     []byte         `json:"-"`
        +	XXX_sizecache        int32          `json:"-"`
         }
         
         func (m *IndexPostfix_IndexValue) Reset()         { *m = IndexPostfix_IndexValue{} }
         func (m *IndexPostfix_IndexValue) String() string { return proto.CompactTextString(m) }
         func (*IndexPostfix_IndexValue) ProtoMessage()    {}
        +func (*IndexPostfix_IndexValue) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{10, 0}
        +}
        +func (m *IndexPostfix_IndexValue) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_IndexPostfix_IndexValue.Unmarshal(m, b)
        +}
        +func (m *IndexPostfix_IndexValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_IndexPostfix_IndexValue.Marshal(b, m, deterministic)
        +}
        +func (dst *IndexPostfix_IndexValue) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_IndexPostfix_IndexValue.Merge(dst, src)
        +}
        +func (m *IndexPostfix_IndexValue) XXX_Size() int {
        +	return xxx_messageInfo_IndexPostfix_IndexValue.Size(m)
        +}
        +func (m *IndexPostfix_IndexValue) XXX_DiscardUnknown() {
        +	xxx_messageInfo_IndexPostfix_IndexValue.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_IndexPostfix_IndexValue proto.InternalMessageInfo
         
         func (m *IndexPostfix_IndexValue) GetPropertyName() string {
         	if m != nil && m.PropertyName != nil {
        @@ -1207,14 +1634,36 @@ func (m *IndexPostfix_IndexValue) GetValue() *PropertyValue {
         }
         
         type IndexPosition struct {
        -	Key              *string `protobuf:"bytes,1,opt,name=key" json:"key,omitempty"`
        -	Before           *bool   `protobuf:"varint,2,opt,name=before,def=1" json:"before,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	Key                  *string  `protobuf:"bytes,1,opt,name=key" json:"key,omitempty"`
        +	Before               *bool    `protobuf:"varint,2,opt,name=before,def=1" json:"before,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *IndexPosition) Reset()         { *m = IndexPosition{} }
         func (m *IndexPosition) String() string { return proto.CompactTextString(m) }
         func (*IndexPosition) ProtoMessage()    {}
        +func (*IndexPosition) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{11}
        +}
        +func (m *IndexPosition) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_IndexPosition.Unmarshal(m, b)
        +}
        +func (m *IndexPosition) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_IndexPosition.Marshal(b, m, deterministic)
        +}
        +func (dst *IndexPosition) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_IndexPosition.Merge(dst, src)
        +}
        +func (m *IndexPosition) XXX_Size() int {
        +	return xxx_messageInfo_IndexPosition.Size(m)
        +}
        +func (m *IndexPosition) XXX_DiscardUnknown() {
        +	xxx_messageInfo_IndexPosition.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_IndexPosition proto.InternalMessageInfo
         
         const Default_IndexPosition_Before bool = true
         
        @@ -1233,13 +1682,35 @@ func (m *IndexPosition) GetBefore() bool {
         }
         
         type Snapshot struct {
        -	Ts               *int64 `protobuf:"varint,1,req,name=ts" json:"ts,omitempty"`
        -	XXX_unrecognized []byte `json:"-"`
        +	Ts                   *int64   `protobuf:"varint,1,req,name=ts" json:"ts,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *Snapshot) Reset()         { *m = Snapshot{} }
         func (m *Snapshot) String() string { return proto.CompactTextString(m) }
         func (*Snapshot) ProtoMessage()    {}
        +func (*Snapshot) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{12}
        +}
        +func (m *Snapshot) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_Snapshot.Unmarshal(m, b)
        +}
        +func (m *Snapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_Snapshot.Marshal(b, m, deterministic)
        +}
        +func (dst *Snapshot) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_Snapshot.Merge(dst, src)
        +}
        +func (m *Snapshot) XXX_Size() int {
        +	return xxx_messageInfo_Snapshot.Size(m)
        +}
        +func (m *Snapshot) XXX_DiscardUnknown() {
        +	xxx_messageInfo_Snapshot.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_Snapshot proto.InternalMessageInfo
         
         func (m *Snapshot) GetTs() int64 {
         	if m != nil && m.Ts != nil {
        @@ -1249,13 +1720,35 @@ func (m *Snapshot) GetTs() int64 {
         }
         
         type InternalHeader struct {
        -	Qos              *string `protobuf:"bytes,1,opt,name=qos" json:"qos,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	Qos                  *string  `protobuf:"bytes,1,opt,name=qos" json:"qos,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *InternalHeader) Reset()         { *m = InternalHeader{} }
         func (m *InternalHeader) String() string { return proto.CompactTextString(m) }
         func (*InternalHeader) ProtoMessage()    {}
        +func (*InternalHeader) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{13}
        +}
        +func (m *InternalHeader) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_InternalHeader.Unmarshal(m, b)
        +}
        +func (m *InternalHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_InternalHeader.Marshal(b, m, deterministic)
        +}
        +func (dst *InternalHeader) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_InternalHeader.Merge(dst, src)
        +}
        +func (m *InternalHeader) XXX_Size() int {
        +	return xxx_messageInfo_InternalHeader.Size(m)
        +}
        +func (m *InternalHeader) XXX_DiscardUnknown() {
        +	xxx_messageInfo_InternalHeader.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_InternalHeader proto.InternalMessageInfo
         
         func (m *InternalHeader) GetQos() string {
         	if m != nil && m.Qos != nil {
        @@ -1265,16 +1758,38 @@ func (m *InternalHeader) GetQos() string {
         }
         
         type Transaction struct {
        -	Header           *InternalHeader `protobuf:"bytes,4,opt,name=header" json:"header,omitempty"`
        -	Handle           *uint64         `protobuf:"fixed64,1,req,name=handle" json:"handle,omitempty"`
        -	App              *string         `protobuf:"bytes,2,req,name=app" json:"app,omitempty"`
        -	MarkChanges      *bool           `protobuf:"varint,3,opt,name=mark_changes,def=0" json:"mark_changes,omitempty"`
        -	XXX_unrecognized []byte          `json:"-"`
        +	Header               *InternalHeader `protobuf:"bytes,4,opt,name=header" json:"header,omitempty"`
        +	Handle               *uint64         `protobuf:"fixed64,1,req,name=handle" json:"handle,omitempty"`
        +	App                  *string         `protobuf:"bytes,2,req,name=app" json:"app,omitempty"`
        +	MarkChanges          *bool           `protobuf:"varint,3,opt,name=mark_changes,json=markChanges,def=0" json:"mark_changes,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
        +	XXX_unrecognized     []byte          `json:"-"`
        +	XXX_sizecache        int32           `json:"-"`
         }
         
         func (m *Transaction) Reset()         { *m = Transaction{} }
         func (m *Transaction) String() string { return proto.CompactTextString(m) }
         func (*Transaction) ProtoMessage()    {}
        +func (*Transaction) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{14}
        +}
        +func (m *Transaction) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_Transaction.Unmarshal(m, b)
        +}
        +func (m *Transaction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_Transaction.Marshal(b, m, deterministic)
        +}
        +func (dst *Transaction) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_Transaction.Merge(dst, src)
        +}
        +func (m *Transaction) XXX_Size() int {
        +	return xxx_messageInfo_Transaction.Size(m)
        +}
        +func (m *Transaction) XXX_DiscardUnknown() {
        +	xxx_messageInfo_Transaction.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_Transaction proto.InternalMessageInfo
         
         const Default_Transaction_MarkChanges bool = false
         
        @@ -1307,39 +1822,61 @@ func (m *Transaction) GetMarkChanges() bool {
         }
         
         type Query struct {
        -	Header              *InternalHeader   `protobuf:"bytes,39,opt,name=header" json:"header,omitempty"`
        -	App                 *string           `protobuf:"bytes,1,req,name=app" json:"app,omitempty"`
        -	NameSpace           *string           `protobuf:"bytes,29,opt,name=name_space" json:"name_space,omitempty"`
        -	Kind                *string           `protobuf:"bytes,3,opt,name=kind" json:"kind,omitempty"`
        -	Ancestor            *Reference        `protobuf:"bytes,17,opt,name=ancestor" json:"ancestor,omitempty"`
        -	Filter              []*Query_Filter   `protobuf:"group,4,rep,name=Filter" json:"filter,omitempty"`
        -	SearchQuery         *string           `protobuf:"bytes,8,opt,name=search_query" json:"search_query,omitempty"`
        -	Order               []*Query_Order    `protobuf:"group,9,rep,name=Order" json:"order,omitempty"`
        -	Hint                *Query_Hint       `protobuf:"varint,18,opt,name=hint,enum=appengine.Query_Hint" json:"hint,omitempty"`
        -	Count               *int32            `protobuf:"varint,23,opt,name=count" json:"count,omitempty"`
        -	Offset              *int32            `protobuf:"varint,12,opt,name=offset,def=0" json:"offset,omitempty"`
        -	Limit               *int32            `protobuf:"varint,16,opt,name=limit" json:"limit,omitempty"`
        -	CompiledCursor      *CompiledCursor   `protobuf:"bytes,30,opt,name=compiled_cursor" json:"compiled_cursor,omitempty"`
        -	EndCompiledCursor   *CompiledCursor   `protobuf:"bytes,31,opt,name=end_compiled_cursor" json:"end_compiled_cursor,omitempty"`
        -	CompositeIndex      []*CompositeIndex `protobuf:"bytes,19,rep,name=composite_index" json:"composite_index,omitempty"`
        -	RequirePerfectPlan  *bool             `protobuf:"varint,20,opt,name=require_perfect_plan,def=0" json:"require_perfect_plan,omitempty"`
        -	KeysOnly            *bool             `protobuf:"varint,21,opt,name=keys_only,def=0" json:"keys_only,omitempty"`
        -	Transaction         *Transaction      `protobuf:"bytes,22,opt,name=transaction" json:"transaction,omitempty"`
        -	Compile             *bool             `protobuf:"varint,25,opt,name=compile,def=0" json:"compile,omitempty"`
        -	FailoverMs          *int64            `protobuf:"varint,26,opt,name=failover_ms" json:"failover_ms,omitempty"`
        -	Strong              *bool             `protobuf:"varint,32,opt,name=strong" json:"strong,omitempty"`
        -	PropertyName        []string          `protobuf:"bytes,33,rep,name=property_name" json:"property_name,omitempty"`
        -	GroupByPropertyName []string          `protobuf:"bytes,34,rep,name=group_by_property_name" json:"group_by_property_name,omitempty"`
        -	Distinct            *bool             `protobuf:"varint,24,opt,name=distinct" json:"distinct,omitempty"`
        -	MinSafeTimeSeconds  *int64            `protobuf:"varint,35,opt,name=min_safe_time_seconds" json:"min_safe_time_seconds,omitempty"`
        -	SafeReplicaName     []string          `protobuf:"bytes,36,rep,name=safe_replica_name" json:"safe_replica_name,omitempty"`
        -	PersistOffset       *bool             `protobuf:"varint,37,opt,name=persist_offset,def=0" json:"persist_offset,omitempty"`
        -	XXX_unrecognized    []byte            `json:"-"`
        +	Header               *InternalHeader   `protobuf:"bytes,39,opt,name=header" json:"header,omitempty"`
        +	App                  *string           `protobuf:"bytes,1,req,name=app" json:"app,omitempty"`
        +	NameSpace            *string           `protobuf:"bytes,29,opt,name=name_space,json=nameSpace" json:"name_space,omitempty"`
        +	Kind                 *string           `protobuf:"bytes,3,opt,name=kind" json:"kind,omitempty"`
        +	Ancestor             *Reference        `protobuf:"bytes,17,opt,name=ancestor" json:"ancestor,omitempty"`
        +	Filter               []*Query_Filter   `protobuf:"group,4,rep,name=Filter,json=filter" json:"filter,omitempty"`
        +	SearchQuery          *string           `protobuf:"bytes,8,opt,name=search_query,json=searchQuery" json:"search_query,omitempty"`
        +	Order                []*Query_Order    `protobuf:"group,9,rep,name=Order,json=order" json:"order,omitempty"`
        +	Hint                 *Query_Hint       `protobuf:"varint,18,opt,name=hint,enum=appengine.Query_Hint" json:"hint,omitempty"`
        +	Count                *int32            `protobuf:"varint,23,opt,name=count" json:"count,omitempty"`
        +	Offset               *int32            `protobuf:"varint,12,opt,name=offset,def=0" json:"offset,omitempty"`
        +	Limit                *int32            `protobuf:"varint,16,opt,name=limit" json:"limit,omitempty"`
        +	CompiledCursor       *CompiledCursor   `protobuf:"bytes,30,opt,name=compiled_cursor,json=compiledCursor" json:"compiled_cursor,omitempty"`
        +	EndCompiledCursor    *CompiledCursor   `protobuf:"bytes,31,opt,name=end_compiled_cursor,json=endCompiledCursor" json:"end_compiled_cursor,omitempty"`
        +	CompositeIndex       []*CompositeIndex `protobuf:"bytes,19,rep,name=composite_index,json=compositeIndex" json:"composite_index,omitempty"`
        +	RequirePerfectPlan   *bool             `protobuf:"varint,20,opt,name=require_perfect_plan,json=requirePerfectPlan,def=0" json:"require_perfect_plan,omitempty"`
        +	KeysOnly             *bool             `protobuf:"varint,21,opt,name=keys_only,json=keysOnly,def=0" json:"keys_only,omitempty"`
        +	Transaction          *Transaction      `protobuf:"bytes,22,opt,name=transaction" json:"transaction,omitempty"`
        +	Compile              *bool             `protobuf:"varint,25,opt,name=compile,def=0" json:"compile,omitempty"`
        +	FailoverMs           *int64            `protobuf:"varint,26,opt,name=failover_ms,json=failoverMs" json:"failover_ms,omitempty"`
        +	Strong               *bool             `protobuf:"varint,32,opt,name=strong" json:"strong,omitempty"`
        +	PropertyName         []string          `protobuf:"bytes,33,rep,name=property_name,json=propertyName" json:"property_name,omitempty"`
        +	GroupByPropertyName  []string          `protobuf:"bytes,34,rep,name=group_by_property_name,json=groupByPropertyName" json:"group_by_property_name,omitempty"`
        +	Distinct             *bool             `protobuf:"varint,24,opt,name=distinct" json:"distinct,omitempty"`
        +	MinSafeTimeSeconds   *int64            `protobuf:"varint,35,opt,name=min_safe_time_seconds,json=minSafeTimeSeconds" json:"min_safe_time_seconds,omitempty"`
        +	SafeReplicaName      []string          `protobuf:"bytes,36,rep,name=safe_replica_name,json=safeReplicaName" json:"safe_replica_name,omitempty"`
        +	PersistOffset        *bool             `protobuf:"varint,37,opt,name=persist_offset,json=persistOffset,def=0" json:"persist_offset,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
        +	XXX_unrecognized     []byte            `json:"-"`
        +	XXX_sizecache        int32             `json:"-"`
         }
         
         func (m *Query) Reset()         { *m = Query{} }
         func (m *Query) String() string { return proto.CompactTextString(m) }
         func (*Query) ProtoMessage()    {}
        +func (*Query) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{15}
        +}
        +func (m *Query) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_Query.Unmarshal(m, b)
        +}
        +func (m *Query) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_Query.Marshal(b, m, deterministic)
        +}
        +func (dst *Query) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_Query.Merge(dst, src)
        +}
        +func (m *Query) XXX_Size() int {
        +	return xxx_messageInfo_Query.Size(m)
        +}
        +func (m *Query) XXX_DiscardUnknown() {
        +	xxx_messageInfo_Query.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_Query proto.InternalMessageInfo
         
         const Default_Query_Offset int32 = 0
         const Default_Query_RequirePerfectPlan bool = false
        @@ -1537,14 +2074,36 @@ func (m *Query) GetPersistOffset() bool {
         }
         
         type Query_Filter struct {
        -	Op               *Query_Filter_Operator `protobuf:"varint,6,req,name=op,enum=appengine.Query_Filter_Operator" json:"op,omitempty"`
        -	Property         []*Property            `protobuf:"bytes,14,rep,name=property" json:"property,omitempty"`
        -	XXX_unrecognized []byte                 `json:"-"`
        +	Op                   *Query_Filter_Operator `protobuf:"varint,6,req,name=op,enum=appengine.Query_Filter_Operator" json:"op,omitempty"`
        +	Property             []*Property            `protobuf:"bytes,14,rep,name=property" json:"property,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
        +	XXX_unrecognized     []byte                 `json:"-"`
        +	XXX_sizecache        int32                  `json:"-"`
         }
         
         func (m *Query_Filter) Reset()         { *m = Query_Filter{} }
         func (m *Query_Filter) String() string { return proto.CompactTextString(m) }
         func (*Query_Filter) ProtoMessage()    {}
        +func (*Query_Filter) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{15, 0}
        +}
        +func (m *Query_Filter) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_Query_Filter.Unmarshal(m, b)
        +}
        +func (m *Query_Filter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_Query_Filter.Marshal(b, m, deterministic)
        +}
        +func (dst *Query_Filter) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_Query_Filter.Merge(dst, src)
        +}
        +func (m *Query_Filter) XXX_Size() int {
        +	return xxx_messageInfo_Query_Filter.Size(m)
        +}
        +func (m *Query_Filter) XXX_DiscardUnknown() {
        +	xxx_messageInfo_Query_Filter.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_Query_Filter proto.InternalMessageInfo
         
         func (m *Query_Filter) GetOp() Query_Filter_Operator {
         	if m != nil && m.Op != nil {
        @@ -1561,14 +2120,36 @@ func (m *Query_Filter) GetProperty() []*Property {
         }
         
         type Query_Order struct {
        -	Property         *string                `protobuf:"bytes,10,req,name=property" json:"property,omitempty"`
        -	Direction        *Query_Order_Direction `protobuf:"varint,11,opt,name=direction,enum=appengine.Query_Order_Direction,def=1" json:"direction,omitempty"`
        -	XXX_unrecognized []byte                 `json:"-"`
        +	Property             *string                `protobuf:"bytes,10,req,name=property" json:"property,omitempty"`
        +	Direction            *Query_Order_Direction `protobuf:"varint,11,opt,name=direction,enum=appengine.Query_Order_Direction,def=1" json:"direction,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
        +	XXX_unrecognized     []byte                 `json:"-"`
        +	XXX_sizecache        int32                  `json:"-"`
         }
         
         func (m *Query_Order) Reset()         { *m = Query_Order{} }
         func (m *Query_Order) String() string { return proto.CompactTextString(m) }
         func (*Query_Order) ProtoMessage()    {}
        +func (*Query_Order) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{15, 1}
        +}
        +func (m *Query_Order) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_Query_Order.Unmarshal(m, b)
        +}
        +func (m *Query_Order) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_Query_Order.Marshal(b, m, deterministic)
        +}
        +func (dst *Query_Order) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_Query_Order.Merge(dst, src)
        +}
        +func (m *Query_Order) XXX_Size() int {
        +	return xxx_messageInfo_Query_Order.Size(m)
        +}
        +func (m *Query_Order) XXX_DiscardUnknown() {
        +	xxx_messageInfo_Query_Order.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_Query_Order proto.InternalMessageInfo
         
         const Default_Query_Order_Direction Query_Order_Direction = Query_Order_ASCENDING
         
        @@ -1587,21 +2168,43 @@ func (m *Query_Order) GetDirection() Query_Order_Direction {
         }
         
         type CompiledQuery struct {
        -	Primaryscan       *CompiledQuery_PrimaryScan     `protobuf:"group,1,req,name=PrimaryScan" json:"primaryscan,omitempty"`
        -	Mergejoinscan     []*CompiledQuery_MergeJoinScan `protobuf:"group,7,rep,name=MergeJoinScan" json:"mergejoinscan,omitempty"`
        -	IndexDef          *Index                         `protobuf:"bytes,21,opt,name=index_def" json:"index_def,omitempty"`
        -	Offset            *int32                         `protobuf:"varint,10,opt,name=offset,def=0" json:"offset,omitempty"`
        -	Limit             *int32                         `protobuf:"varint,11,opt,name=limit" json:"limit,omitempty"`
        -	KeysOnly          *bool                          `protobuf:"varint,12,req,name=keys_only" json:"keys_only,omitempty"`
        -	PropertyName      []string                       `protobuf:"bytes,24,rep,name=property_name" json:"property_name,omitempty"`
        -	DistinctInfixSize *int32                         `protobuf:"varint,25,opt,name=distinct_infix_size" json:"distinct_infix_size,omitempty"`
        -	Entityfilter      *CompiledQuery_EntityFilter    `protobuf:"group,13,opt,name=EntityFilter" json:"entityfilter,omitempty"`
        -	XXX_unrecognized  []byte                         `json:"-"`
        +	Primaryscan          *CompiledQuery_PrimaryScan     `protobuf:"group,1,req,name=PrimaryScan,json=primaryscan" json:"primaryscan,omitempty"`
        +	Mergejoinscan        []*CompiledQuery_MergeJoinScan `protobuf:"group,7,rep,name=MergeJoinScan,json=mergejoinscan" json:"mergejoinscan,omitempty"`
        +	IndexDef             *Index                         `protobuf:"bytes,21,opt,name=index_def,json=indexDef" json:"index_def,omitempty"`
        +	Offset               *int32                         `protobuf:"varint,10,opt,name=offset,def=0" json:"offset,omitempty"`
        +	Limit                *int32                         `protobuf:"varint,11,opt,name=limit" json:"limit,omitempty"`
        +	KeysOnly             *bool                          `protobuf:"varint,12,req,name=keys_only,json=keysOnly" json:"keys_only,omitempty"`
        +	PropertyName         []string                       `protobuf:"bytes,24,rep,name=property_name,json=propertyName" json:"property_name,omitempty"`
        +	DistinctInfixSize    *int32                         `protobuf:"varint,25,opt,name=distinct_infix_size,json=distinctInfixSize" json:"distinct_infix_size,omitempty"`
        +	Entityfilter         *CompiledQuery_EntityFilter    `protobuf:"group,13,opt,name=EntityFilter,json=entityfilter" json:"entityfilter,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}                       `json:"-"`
        +	XXX_unrecognized     []byte                         `json:"-"`
        +	XXX_sizecache        int32                          `json:"-"`
         }
         
         func (m *CompiledQuery) Reset()         { *m = CompiledQuery{} }
         func (m *CompiledQuery) String() string { return proto.CompactTextString(m) }
         func (*CompiledQuery) ProtoMessage()    {}
        +func (*CompiledQuery) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{16}
        +}
        +func (m *CompiledQuery) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_CompiledQuery.Unmarshal(m, b)
        +}
        +func (m *CompiledQuery) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_CompiledQuery.Marshal(b, m, deterministic)
        +}
        +func (dst *CompiledQuery) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_CompiledQuery.Merge(dst, src)
        +}
        +func (m *CompiledQuery) XXX_Size() int {
        +	return xxx_messageInfo_CompiledQuery.Size(m)
        +}
        +func (m *CompiledQuery) XXX_DiscardUnknown() {
        +	xxx_messageInfo_CompiledQuery.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_CompiledQuery proto.InternalMessageInfo
         
         const Default_CompiledQuery_Offset int32 = 0
         
        @@ -1669,20 +2272,42 @@ func (m *CompiledQuery) GetEntityfilter() *CompiledQuery_EntityFilter {
         }
         
         type CompiledQuery_PrimaryScan struct {
        -	IndexName                  *string  `protobuf:"bytes,2,opt,name=index_name" json:"index_name,omitempty"`
        -	StartKey                   *string  `protobuf:"bytes,3,opt,name=start_key" json:"start_key,omitempty"`
        -	StartInclusive             *bool    `protobuf:"varint,4,opt,name=start_inclusive" json:"start_inclusive,omitempty"`
        -	EndKey                     *string  `protobuf:"bytes,5,opt,name=end_key" json:"end_key,omitempty"`
        -	EndInclusive               *bool    `protobuf:"varint,6,opt,name=end_inclusive" json:"end_inclusive,omitempty"`
        -	StartPostfixValue          []string `protobuf:"bytes,22,rep,name=start_postfix_value" json:"start_postfix_value,omitempty"`
        -	EndPostfixValue            []string `protobuf:"bytes,23,rep,name=end_postfix_value" json:"end_postfix_value,omitempty"`
        -	EndUnappliedLogTimestampUs *int64   `protobuf:"varint,19,opt,name=end_unapplied_log_timestamp_us" json:"end_unapplied_log_timestamp_us,omitempty"`
        +	IndexName                  *string  `protobuf:"bytes,2,opt,name=index_name,json=indexName" json:"index_name,omitempty"`
        +	StartKey                   *string  `protobuf:"bytes,3,opt,name=start_key,json=startKey" json:"start_key,omitempty"`
        +	StartInclusive             *bool    `protobuf:"varint,4,opt,name=start_inclusive,json=startInclusive" json:"start_inclusive,omitempty"`
        +	EndKey                     *string  `protobuf:"bytes,5,opt,name=end_key,json=endKey" json:"end_key,omitempty"`
        +	EndInclusive               *bool    `protobuf:"varint,6,opt,name=end_inclusive,json=endInclusive" json:"end_inclusive,omitempty"`
        +	StartPostfixValue          []string `protobuf:"bytes,22,rep,name=start_postfix_value,json=startPostfixValue" json:"start_postfix_value,omitempty"`
        +	EndPostfixValue            []string `protobuf:"bytes,23,rep,name=end_postfix_value,json=endPostfixValue" json:"end_postfix_value,omitempty"`
        +	EndUnappliedLogTimestampUs *int64   `protobuf:"varint,19,opt,name=end_unapplied_log_timestamp_us,json=endUnappliedLogTimestampUs" json:"end_unapplied_log_timestamp_us,omitempty"`
        +	XXX_NoUnkeyedLiteral       struct{} `json:"-"`
         	XXX_unrecognized           []byte   `json:"-"`
        +	XXX_sizecache              int32    `json:"-"`
         }
         
         func (m *CompiledQuery_PrimaryScan) Reset()         { *m = CompiledQuery_PrimaryScan{} }
         func (m *CompiledQuery_PrimaryScan) String() string { return proto.CompactTextString(m) }
         func (*CompiledQuery_PrimaryScan) ProtoMessage()    {}
        +func (*CompiledQuery_PrimaryScan) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{16, 0}
        +}
        +func (m *CompiledQuery_PrimaryScan) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_CompiledQuery_PrimaryScan.Unmarshal(m, b)
        +}
        +func (m *CompiledQuery_PrimaryScan) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_CompiledQuery_PrimaryScan.Marshal(b, m, deterministic)
        +}
        +func (dst *CompiledQuery_PrimaryScan) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_CompiledQuery_PrimaryScan.Merge(dst, src)
        +}
        +func (m *CompiledQuery_PrimaryScan) XXX_Size() int {
        +	return xxx_messageInfo_CompiledQuery_PrimaryScan.Size(m)
        +}
        +func (m *CompiledQuery_PrimaryScan) XXX_DiscardUnknown() {
        +	xxx_messageInfo_CompiledQuery_PrimaryScan.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_CompiledQuery_PrimaryScan proto.InternalMessageInfo
         
         func (m *CompiledQuery_PrimaryScan) GetIndexName() string {
         	if m != nil && m.IndexName != nil {
        @@ -1741,15 +2366,37 @@ func (m *CompiledQuery_PrimaryScan) GetEndUnappliedLogTimestampUs() int64 {
         }
         
         type CompiledQuery_MergeJoinScan struct {
        -	IndexName        *string  `protobuf:"bytes,8,req,name=index_name" json:"index_name,omitempty"`
        -	PrefixValue      []string `protobuf:"bytes,9,rep,name=prefix_value" json:"prefix_value,omitempty"`
        -	ValuePrefix      *bool    `protobuf:"varint,20,opt,name=value_prefix,def=0" json:"value_prefix,omitempty"`
        -	XXX_unrecognized []byte   `json:"-"`
        +	IndexName            *string  `protobuf:"bytes,8,req,name=index_name,json=indexName" json:"index_name,omitempty"`
        +	PrefixValue          []string `protobuf:"bytes,9,rep,name=prefix_value,json=prefixValue" json:"prefix_value,omitempty"`
        +	ValuePrefix          *bool    `protobuf:"varint,20,opt,name=value_prefix,json=valuePrefix,def=0" json:"value_prefix,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *CompiledQuery_MergeJoinScan) Reset()         { *m = CompiledQuery_MergeJoinScan{} }
         func (m *CompiledQuery_MergeJoinScan) String() string { return proto.CompactTextString(m) }
         func (*CompiledQuery_MergeJoinScan) ProtoMessage()    {}
        +func (*CompiledQuery_MergeJoinScan) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{16, 1}
        +}
        +func (m *CompiledQuery_MergeJoinScan) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_CompiledQuery_MergeJoinScan.Unmarshal(m, b)
        +}
        +func (m *CompiledQuery_MergeJoinScan) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_CompiledQuery_MergeJoinScan.Marshal(b, m, deterministic)
        +}
        +func (dst *CompiledQuery_MergeJoinScan) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_CompiledQuery_MergeJoinScan.Merge(dst, src)
        +}
        +func (m *CompiledQuery_MergeJoinScan) XXX_Size() int {
        +	return xxx_messageInfo_CompiledQuery_MergeJoinScan.Size(m)
        +}
        +func (m *CompiledQuery_MergeJoinScan) XXX_DiscardUnknown() {
        +	xxx_messageInfo_CompiledQuery_MergeJoinScan.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_CompiledQuery_MergeJoinScan proto.InternalMessageInfo
         
         const Default_CompiledQuery_MergeJoinScan_ValuePrefix bool = false
         
        @@ -1775,15 +2422,37 @@ func (m *CompiledQuery_MergeJoinScan) GetValuePrefix() bool {
         }
         
         type CompiledQuery_EntityFilter struct {
        -	Distinct         *bool      `protobuf:"varint,14,opt,name=distinct,def=0" json:"distinct,omitempty"`
        -	Kind             *string    `protobuf:"bytes,17,opt,name=kind" json:"kind,omitempty"`
        -	Ancestor         *Reference `protobuf:"bytes,18,opt,name=ancestor" json:"ancestor,omitempty"`
        -	XXX_unrecognized []byte     `json:"-"`
        +	Distinct             *bool      `protobuf:"varint,14,opt,name=distinct,def=0" json:"distinct,omitempty"`
        +	Kind                 *string    `protobuf:"bytes,17,opt,name=kind" json:"kind,omitempty"`
        +	Ancestor             *Reference `protobuf:"bytes,18,opt,name=ancestor" json:"ancestor,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
        +	XXX_unrecognized     []byte     `json:"-"`
        +	XXX_sizecache        int32      `json:"-"`
         }
         
         func (m *CompiledQuery_EntityFilter) Reset()         { *m = CompiledQuery_EntityFilter{} }
         func (m *CompiledQuery_EntityFilter) String() string { return proto.CompactTextString(m) }
         func (*CompiledQuery_EntityFilter) ProtoMessage()    {}
        +func (*CompiledQuery_EntityFilter) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{16, 2}
        +}
        +func (m *CompiledQuery_EntityFilter) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_CompiledQuery_EntityFilter.Unmarshal(m, b)
        +}
        +func (m *CompiledQuery_EntityFilter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_CompiledQuery_EntityFilter.Marshal(b, m, deterministic)
        +}
        +func (dst *CompiledQuery_EntityFilter) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_CompiledQuery_EntityFilter.Merge(dst, src)
        +}
        +func (m *CompiledQuery_EntityFilter) XXX_Size() int {
        +	return xxx_messageInfo_CompiledQuery_EntityFilter.Size(m)
        +}
        +func (m *CompiledQuery_EntityFilter) XXX_DiscardUnknown() {
        +	xxx_messageInfo_CompiledQuery_EntityFilter.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_CompiledQuery_EntityFilter proto.InternalMessageInfo
         
         const Default_CompiledQuery_EntityFilter_Distinct bool = false
         
        @@ -1809,13 +2478,35 @@ func (m *CompiledQuery_EntityFilter) GetAncestor() *Reference {
         }
         
         type CompiledCursor struct {
        -	Position         *CompiledCursor_Position `protobuf:"group,2,opt,name=Position" json:"position,omitempty"`
        -	XXX_unrecognized []byte                   `json:"-"`
        +	Position             *CompiledCursor_Position `protobuf:"group,2,opt,name=Position,json=position" json:"position,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
        +	XXX_unrecognized     []byte                   `json:"-"`
        +	XXX_sizecache        int32                    `json:"-"`
         }
         
         func (m *CompiledCursor) Reset()         { *m = CompiledCursor{} }
         func (m *CompiledCursor) String() string { return proto.CompactTextString(m) }
         func (*CompiledCursor) ProtoMessage()    {}
        +func (*CompiledCursor) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{17}
        +}
        +func (m *CompiledCursor) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_CompiledCursor.Unmarshal(m, b)
        +}
        +func (m *CompiledCursor) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_CompiledCursor.Marshal(b, m, deterministic)
        +}
        +func (dst *CompiledCursor) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_CompiledCursor.Merge(dst, src)
        +}
        +func (m *CompiledCursor) XXX_Size() int {
        +	return xxx_messageInfo_CompiledCursor.Size(m)
        +}
        +func (m *CompiledCursor) XXX_DiscardUnknown() {
        +	xxx_messageInfo_CompiledCursor.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_CompiledCursor proto.InternalMessageInfo
         
         func (m *CompiledCursor) GetPosition() *CompiledCursor_Position {
         	if m != nil {
        @@ -1825,16 +2516,38 @@ func (m *CompiledCursor) GetPosition() *CompiledCursor_Position {
         }
         
         type CompiledCursor_Position struct {
        -	StartKey         *string                               `protobuf:"bytes,27,opt,name=start_key" json:"start_key,omitempty"`
        -	Indexvalue       []*CompiledCursor_Position_IndexValue `protobuf:"group,29,rep,name=IndexValue" json:"indexvalue,omitempty"`
        -	Key              *Reference                            `protobuf:"bytes,32,opt,name=key" json:"key,omitempty"`
        -	StartInclusive   *bool                                 `protobuf:"varint,28,opt,name=start_inclusive,def=1" json:"start_inclusive,omitempty"`
        -	XXX_unrecognized []byte                                `json:"-"`
        +	StartKey             *string                               `protobuf:"bytes,27,opt,name=start_key,json=startKey" json:"start_key,omitempty"`
        +	Indexvalue           []*CompiledCursor_Position_IndexValue `protobuf:"group,29,rep,name=IndexValue,json=indexvalue" json:"indexvalue,omitempty"`
        +	Key                  *Reference                            `protobuf:"bytes,32,opt,name=key" json:"key,omitempty"`
        +	StartInclusive       *bool                                 `protobuf:"varint,28,opt,name=start_inclusive,json=startInclusive,def=1" json:"start_inclusive,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}                              `json:"-"`
        +	XXX_unrecognized     []byte                                `json:"-"`
        +	XXX_sizecache        int32                                 `json:"-"`
         }
         
         func (m *CompiledCursor_Position) Reset()         { *m = CompiledCursor_Position{} }
         func (m *CompiledCursor_Position) String() string { return proto.CompactTextString(m) }
         func (*CompiledCursor_Position) ProtoMessage()    {}
        +func (*CompiledCursor_Position) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{17, 0}
        +}
        +func (m *CompiledCursor_Position) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_CompiledCursor_Position.Unmarshal(m, b)
        +}
        +func (m *CompiledCursor_Position) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_CompiledCursor_Position.Marshal(b, m, deterministic)
        +}
        +func (dst *CompiledCursor_Position) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_CompiledCursor_Position.Merge(dst, src)
        +}
        +func (m *CompiledCursor_Position) XXX_Size() int {
        +	return xxx_messageInfo_CompiledCursor_Position.Size(m)
        +}
        +func (m *CompiledCursor_Position) XXX_DiscardUnknown() {
        +	xxx_messageInfo_CompiledCursor_Position.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_CompiledCursor_Position proto.InternalMessageInfo
         
         const Default_CompiledCursor_Position_StartInclusive bool = true
         
        @@ -1867,14 +2580,36 @@ func (m *CompiledCursor_Position) GetStartInclusive() bool {
         }
         
         type CompiledCursor_Position_IndexValue struct {
        -	Property         *string        `protobuf:"bytes,30,opt,name=property" json:"property,omitempty"`
        -	Value            *PropertyValue `protobuf:"bytes,31,req,name=value" json:"value,omitempty"`
        -	XXX_unrecognized []byte         `json:"-"`
        +	Property             *string        `protobuf:"bytes,30,opt,name=property" json:"property,omitempty"`
        +	Value                *PropertyValue `protobuf:"bytes,31,req,name=value" json:"value,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
        +	XXX_unrecognized     []byte         `json:"-"`
        +	XXX_sizecache        int32          `json:"-"`
         }
         
         func (m *CompiledCursor_Position_IndexValue) Reset()         { *m = CompiledCursor_Position_IndexValue{} }
         func (m *CompiledCursor_Position_IndexValue) String() string { return proto.CompactTextString(m) }
         func (*CompiledCursor_Position_IndexValue) ProtoMessage()    {}
        +func (*CompiledCursor_Position_IndexValue) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{17, 0, 0}
        +}
        +func (m *CompiledCursor_Position_IndexValue) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_CompiledCursor_Position_IndexValue.Unmarshal(m, b)
        +}
        +func (m *CompiledCursor_Position_IndexValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_CompiledCursor_Position_IndexValue.Marshal(b, m, deterministic)
        +}
        +func (dst *CompiledCursor_Position_IndexValue) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_CompiledCursor_Position_IndexValue.Merge(dst, src)
        +}
        +func (m *CompiledCursor_Position_IndexValue) XXX_Size() int {
        +	return xxx_messageInfo_CompiledCursor_Position_IndexValue.Size(m)
        +}
        +func (m *CompiledCursor_Position_IndexValue) XXX_DiscardUnknown() {
        +	xxx_messageInfo_CompiledCursor_Position_IndexValue.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_CompiledCursor_Position_IndexValue proto.InternalMessageInfo
         
         func (m *CompiledCursor_Position_IndexValue) GetProperty() string {
         	if m != nil && m.Property != nil {
        @@ -1891,14 +2626,36 @@ func (m *CompiledCursor_Position_IndexValue) GetValue() *PropertyValue {
         }
         
         type Cursor struct {
        -	Cursor           *uint64 `protobuf:"fixed64,1,req,name=cursor" json:"cursor,omitempty"`
        -	App              *string `protobuf:"bytes,2,opt,name=app" json:"app,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	Cursor               *uint64  `protobuf:"fixed64,1,req,name=cursor" json:"cursor,omitempty"`
        +	App                  *string  `protobuf:"bytes,2,opt,name=app" json:"app,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *Cursor) Reset()         { *m = Cursor{} }
         func (m *Cursor) String() string { return proto.CompactTextString(m) }
         func (*Cursor) ProtoMessage()    {}
        +func (*Cursor) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{18}
        +}
        +func (m *Cursor) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_Cursor.Unmarshal(m, b)
        +}
        +func (m *Cursor) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_Cursor.Marshal(b, m, deterministic)
        +}
        +func (dst *Cursor) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_Cursor.Merge(dst, src)
        +}
        +func (m *Cursor) XXX_Size() int {
        +	return xxx_messageInfo_Cursor.Size(m)
        +}
        +func (m *Cursor) XXX_DiscardUnknown() {
        +	xxx_messageInfo_Cursor.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_Cursor proto.InternalMessageInfo
         
         func (m *Cursor) GetCursor() uint64 {
         	if m != nil && m.Cursor != nil {
        @@ -1915,27 +2672,71 @@ func (m *Cursor) GetApp() string {
         }
         
         type Error struct {
        -	XXX_unrecognized []byte `json:"-"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *Error) Reset()         { *m = Error{} }
         func (m *Error) String() string { return proto.CompactTextString(m) }
         func (*Error) ProtoMessage()    {}
        +func (*Error) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{19}
        +}
        +func (m *Error) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_Error.Unmarshal(m, b)
        +}
        +func (m *Error) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_Error.Marshal(b, m, deterministic)
        +}
        +func (dst *Error) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_Error.Merge(dst, src)
        +}
        +func (m *Error) XXX_Size() int {
        +	return xxx_messageInfo_Error.Size(m)
        +}
        +func (m *Error) XXX_DiscardUnknown() {
        +	xxx_messageInfo_Error.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_Error proto.InternalMessageInfo
         
         type Cost struct {
        -	IndexWrites             *int32           `protobuf:"varint,1,opt,name=index_writes" json:"index_writes,omitempty"`
        -	IndexWriteBytes         *int32           `protobuf:"varint,2,opt,name=index_write_bytes" json:"index_write_bytes,omitempty"`
        -	EntityWrites            *int32           `protobuf:"varint,3,opt,name=entity_writes" json:"entity_writes,omitempty"`
        -	EntityWriteBytes        *int32           `protobuf:"varint,4,opt,name=entity_write_bytes" json:"entity_write_bytes,omitempty"`
        -	Commitcost              *Cost_CommitCost `protobuf:"group,5,opt,name=CommitCost" json:"commitcost,omitempty"`
        -	ApproximateStorageDelta *int32           `protobuf:"varint,8,opt,name=approximate_storage_delta" json:"approximate_storage_delta,omitempty"`
        -	IdSequenceUpdates       *int32           `protobuf:"varint,9,opt,name=id_sequence_updates" json:"id_sequence_updates,omitempty"`
        +	IndexWrites             *int32           `protobuf:"varint,1,opt,name=index_writes,json=indexWrites" json:"index_writes,omitempty"`
        +	IndexWriteBytes         *int32           `protobuf:"varint,2,opt,name=index_write_bytes,json=indexWriteBytes" json:"index_write_bytes,omitempty"`
        +	EntityWrites            *int32           `protobuf:"varint,3,opt,name=entity_writes,json=entityWrites" json:"entity_writes,omitempty"`
        +	EntityWriteBytes        *int32           `protobuf:"varint,4,opt,name=entity_write_bytes,json=entityWriteBytes" json:"entity_write_bytes,omitempty"`
        +	Commitcost              *Cost_CommitCost `protobuf:"group,5,opt,name=CommitCost,json=commitcost" json:"commitcost,omitempty"`
        +	ApproximateStorageDelta *int32           `protobuf:"varint,8,opt,name=approximate_storage_delta,json=approximateStorageDelta" json:"approximate_storage_delta,omitempty"`
        +	IdSequenceUpdates       *int32           `protobuf:"varint,9,opt,name=id_sequence_updates,json=idSequenceUpdates" json:"id_sequence_updates,omitempty"`
        +	XXX_NoUnkeyedLiteral    struct{}         `json:"-"`
         	XXX_unrecognized        []byte           `json:"-"`
        +	XXX_sizecache           int32            `json:"-"`
         }
         
         func (m *Cost) Reset()         { *m = Cost{} }
         func (m *Cost) String() string { return proto.CompactTextString(m) }
         func (*Cost) ProtoMessage()    {}
        +func (*Cost) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{20}
        +}
        +func (m *Cost) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_Cost.Unmarshal(m, b)
        +}
        +func (m *Cost) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_Cost.Marshal(b, m, deterministic)
        +}
        +func (dst *Cost) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_Cost.Merge(dst, src)
        +}
        +func (m *Cost) XXX_Size() int {
        +	return xxx_messageInfo_Cost.Size(m)
        +}
        +func (m *Cost) XXX_DiscardUnknown() {
        +	xxx_messageInfo_Cost.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_Cost proto.InternalMessageInfo
         
         func (m *Cost) GetIndexWrites() int32 {
         	if m != nil && m.IndexWrites != nil {
        @@ -1987,14 +2788,36 @@ func (m *Cost) GetIdSequenceUpdates() int32 {
         }
         
         type Cost_CommitCost struct {
        -	RequestedEntityPuts    *int32 `protobuf:"varint,6,opt,name=requested_entity_puts" json:"requested_entity_puts,omitempty"`
        -	RequestedEntityDeletes *int32 `protobuf:"varint,7,opt,name=requested_entity_deletes" json:"requested_entity_deletes,omitempty"`
        -	XXX_unrecognized       []byte `json:"-"`
        +	RequestedEntityPuts    *int32   `protobuf:"varint,6,opt,name=requested_entity_puts,json=requestedEntityPuts" json:"requested_entity_puts,omitempty"`
        +	RequestedEntityDeletes *int32   `protobuf:"varint,7,opt,name=requested_entity_deletes,json=requestedEntityDeletes" json:"requested_entity_deletes,omitempty"`
        +	XXX_NoUnkeyedLiteral   struct{} `json:"-"`
        +	XXX_unrecognized       []byte   `json:"-"`
        +	XXX_sizecache          int32    `json:"-"`
         }
         
         func (m *Cost_CommitCost) Reset()         { *m = Cost_CommitCost{} }
         func (m *Cost_CommitCost) String() string { return proto.CompactTextString(m) }
         func (*Cost_CommitCost) ProtoMessage()    {}
        +func (*Cost_CommitCost) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{20, 0}
        +}
        +func (m *Cost_CommitCost) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_Cost_CommitCost.Unmarshal(m, b)
        +}
        +func (m *Cost_CommitCost) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_Cost_CommitCost.Marshal(b, m, deterministic)
        +}
        +func (dst *Cost_CommitCost) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_Cost_CommitCost.Merge(dst, src)
        +}
        +func (m *Cost_CommitCost) XXX_Size() int {
        +	return xxx_messageInfo_Cost_CommitCost.Size(m)
        +}
        +func (m *Cost_CommitCost) XXX_DiscardUnknown() {
        +	xxx_messageInfo_Cost_CommitCost.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_Cost_CommitCost proto.InternalMessageInfo
         
         func (m *Cost_CommitCost) GetRequestedEntityPuts() int32 {
         	if m != nil && m.RequestedEntityPuts != nil {
        @@ -2011,18 +2834,40 @@ func (m *Cost_CommitCost) GetRequestedEntityDeletes() int32 {
         }
         
         type GetRequest struct {
        -	Header           *InternalHeader `protobuf:"bytes,6,opt,name=header" json:"header,omitempty"`
        -	Key              []*Reference    `protobuf:"bytes,1,rep,name=key" json:"key,omitempty"`
        -	Transaction      *Transaction    `protobuf:"bytes,2,opt,name=transaction" json:"transaction,omitempty"`
        -	FailoverMs       *int64          `protobuf:"varint,3,opt,name=failover_ms" json:"failover_ms,omitempty"`
        -	Strong           *bool           `protobuf:"varint,4,opt,name=strong" json:"strong,omitempty"`
        -	AllowDeferred    *bool           `protobuf:"varint,5,opt,name=allow_deferred,def=0" json:"allow_deferred,omitempty"`
        -	XXX_unrecognized []byte          `json:"-"`
        +	Header               *InternalHeader `protobuf:"bytes,6,opt,name=header" json:"header,omitempty"`
        +	Key                  []*Reference    `protobuf:"bytes,1,rep,name=key" json:"key,omitempty"`
        +	Transaction          *Transaction    `protobuf:"bytes,2,opt,name=transaction" json:"transaction,omitempty"`
        +	FailoverMs           *int64          `protobuf:"varint,3,opt,name=failover_ms,json=failoverMs" json:"failover_ms,omitempty"`
        +	Strong               *bool           `protobuf:"varint,4,opt,name=strong" json:"strong,omitempty"`
        +	AllowDeferred        *bool           `protobuf:"varint,5,opt,name=allow_deferred,json=allowDeferred,def=0" json:"allow_deferred,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
        +	XXX_unrecognized     []byte          `json:"-"`
        +	XXX_sizecache        int32           `json:"-"`
         }
         
         func (m *GetRequest) Reset()         { *m = GetRequest{} }
         func (m *GetRequest) String() string { return proto.CompactTextString(m) }
         func (*GetRequest) ProtoMessage()    {}
        +func (*GetRequest) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{21}
        +}
        +func (m *GetRequest) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_GetRequest.Unmarshal(m, b)
        +}
        +func (m *GetRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_GetRequest.Marshal(b, m, deterministic)
        +}
        +func (dst *GetRequest) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_GetRequest.Merge(dst, src)
        +}
        +func (m *GetRequest) XXX_Size() int {
        +	return xxx_messageInfo_GetRequest.Size(m)
        +}
        +func (m *GetRequest) XXX_DiscardUnknown() {
        +	xxx_messageInfo_GetRequest.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_GetRequest proto.InternalMessageInfo
         
         const Default_GetRequest_AllowDeferred bool = false
         
        @@ -2069,15 +2914,37 @@ func (m *GetRequest) GetAllowDeferred() bool {
         }
         
         type GetResponse struct {
        -	Entity           []*GetResponse_Entity `protobuf:"group,1,rep,name=Entity" json:"entity,omitempty"`
        -	Deferred         []*Reference          `protobuf:"bytes,5,rep,name=deferred" json:"deferred,omitempty"`
        -	InOrder          *bool                 `protobuf:"varint,6,opt,name=in_order,def=1" json:"in_order,omitempty"`
        -	XXX_unrecognized []byte                `json:"-"`
        +	Entity               []*GetResponse_Entity `protobuf:"group,1,rep,name=Entity,json=entity" json:"entity,omitempty"`
        +	Deferred             []*Reference          `protobuf:"bytes,5,rep,name=deferred" json:"deferred,omitempty"`
        +	InOrder              *bool                 `protobuf:"varint,6,opt,name=in_order,json=inOrder,def=1" json:"in_order,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
        +	XXX_unrecognized     []byte                `json:"-"`
        +	XXX_sizecache        int32                 `json:"-"`
         }
         
         func (m *GetResponse) Reset()         { *m = GetResponse{} }
         func (m *GetResponse) String() string { return proto.CompactTextString(m) }
         func (*GetResponse) ProtoMessage()    {}
        +func (*GetResponse) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{22}
        +}
        +func (m *GetResponse) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_GetResponse.Unmarshal(m, b)
        +}
        +func (m *GetResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_GetResponse.Marshal(b, m, deterministic)
        +}
        +func (dst *GetResponse) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_GetResponse.Merge(dst, src)
        +}
        +func (m *GetResponse) XXX_Size() int {
        +	return xxx_messageInfo_GetResponse.Size(m)
        +}
        +func (m *GetResponse) XXX_DiscardUnknown() {
        +	xxx_messageInfo_GetResponse.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_GetResponse proto.InternalMessageInfo
         
         const Default_GetResponse_InOrder bool = true
         
        @@ -2103,15 +2970,37 @@ func (m *GetResponse) GetInOrder() bool {
         }
         
         type GetResponse_Entity struct {
        -	Entity           *EntityProto `protobuf:"bytes,2,opt,name=entity" json:"entity,omitempty"`
        -	Key              *Reference   `protobuf:"bytes,4,opt,name=key" json:"key,omitempty"`
        -	Version          *int64       `protobuf:"varint,3,opt,name=version" json:"version,omitempty"`
        -	XXX_unrecognized []byte       `json:"-"`
        +	Entity               *EntityProto `protobuf:"bytes,2,opt,name=entity" json:"entity,omitempty"`
        +	Key                  *Reference   `protobuf:"bytes,4,opt,name=key" json:"key,omitempty"`
        +	Version              *int64       `protobuf:"varint,3,opt,name=version" json:"version,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
        +	XXX_unrecognized     []byte       `json:"-"`
        +	XXX_sizecache        int32        `json:"-"`
         }
         
         func (m *GetResponse_Entity) Reset()         { *m = GetResponse_Entity{} }
         func (m *GetResponse_Entity) String() string { return proto.CompactTextString(m) }
         func (*GetResponse_Entity) ProtoMessage()    {}
        +func (*GetResponse_Entity) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{22, 0}
        +}
        +func (m *GetResponse_Entity) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_GetResponse_Entity.Unmarshal(m, b)
        +}
        +func (m *GetResponse_Entity) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_GetResponse_Entity.Marshal(b, m, deterministic)
        +}
        +func (dst *GetResponse_Entity) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_GetResponse_Entity.Merge(dst, src)
        +}
        +func (m *GetResponse_Entity) XXX_Size() int {
        +	return xxx_messageInfo_GetResponse_Entity.Size(m)
        +}
        +func (m *GetResponse_Entity) XXX_DiscardUnknown() {
        +	xxx_messageInfo_GetResponse_Entity.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_GetResponse_Entity proto.InternalMessageInfo
         
         func (m *GetResponse_Entity) GetEntity() *EntityProto {
         	if m != nil {
        @@ -2135,21 +3024,43 @@ func (m *GetResponse_Entity) GetVersion() int64 {
         }
         
         type PutRequest struct {
        -	Header           *InternalHeader          `protobuf:"bytes,11,opt,name=header" json:"header,omitempty"`
        -	Entity           []*EntityProto           `protobuf:"bytes,1,rep,name=entity" json:"entity,omitempty"`
        -	Transaction      *Transaction             `protobuf:"bytes,2,opt,name=transaction" json:"transaction,omitempty"`
        -	CompositeIndex   []*CompositeIndex        `protobuf:"bytes,3,rep,name=composite_index" json:"composite_index,omitempty"`
        -	Trusted          *bool                    `protobuf:"varint,4,opt,name=trusted,def=0" json:"trusted,omitempty"`
        -	Force            *bool                    `protobuf:"varint,7,opt,name=force,def=0" json:"force,omitempty"`
        -	MarkChanges      *bool                    `protobuf:"varint,8,opt,name=mark_changes,def=0" json:"mark_changes,omitempty"`
        -	Snapshot         []*Snapshot              `protobuf:"bytes,9,rep,name=snapshot" json:"snapshot,omitempty"`
        -	AutoIdPolicy     *PutRequest_AutoIdPolicy `protobuf:"varint,10,opt,name=auto_id_policy,enum=appengine.PutRequest_AutoIdPolicy,def=0" json:"auto_id_policy,omitempty"`
        -	XXX_unrecognized []byte                   `json:"-"`
        +	Header               *InternalHeader          `protobuf:"bytes,11,opt,name=header" json:"header,omitempty"`
        +	Entity               []*EntityProto           `protobuf:"bytes,1,rep,name=entity" json:"entity,omitempty"`
        +	Transaction          *Transaction             `protobuf:"bytes,2,opt,name=transaction" json:"transaction,omitempty"`
        +	CompositeIndex       []*CompositeIndex        `protobuf:"bytes,3,rep,name=composite_index,json=compositeIndex" json:"composite_index,omitempty"`
        +	Trusted              *bool                    `protobuf:"varint,4,opt,name=trusted,def=0" json:"trusted,omitempty"`
        +	Force                *bool                    `protobuf:"varint,7,opt,name=force,def=0" json:"force,omitempty"`
        +	MarkChanges          *bool                    `protobuf:"varint,8,opt,name=mark_changes,json=markChanges,def=0" json:"mark_changes,omitempty"`
        +	Snapshot             []*Snapshot              `protobuf:"bytes,9,rep,name=snapshot" json:"snapshot,omitempty"`
        +	AutoIdPolicy         *PutRequest_AutoIdPolicy `protobuf:"varint,10,opt,name=auto_id_policy,json=autoIdPolicy,enum=appengine.PutRequest_AutoIdPolicy,def=0" json:"auto_id_policy,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
        +	XXX_unrecognized     []byte                   `json:"-"`
        +	XXX_sizecache        int32                    `json:"-"`
         }
         
         func (m *PutRequest) Reset()         { *m = PutRequest{} }
         func (m *PutRequest) String() string { return proto.CompactTextString(m) }
         func (*PutRequest) ProtoMessage()    {}
        +func (*PutRequest) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{23}
        +}
        +func (m *PutRequest) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_PutRequest.Unmarshal(m, b)
        +}
        +func (m *PutRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_PutRequest.Marshal(b, m, deterministic)
        +}
        +func (dst *PutRequest) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_PutRequest.Merge(dst, src)
        +}
        +func (m *PutRequest) XXX_Size() int {
        +	return xxx_messageInfo_PutRequest.Size(m)
        +}
        +func (m *PutRequest) XXX_DiscardUnknown() {
        +	xxx_messageInfo_PutRequest.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_PutRequest proto.InternalMessageInfo
         
         const Default_PutRequest_Trusted bool = false
         const Default_PutRequest_Force bool = false
        @@ -2220,15 +3131,37 @@ func (m *PutRequest) GetAutoIdPolicy() PutRequest_AutoIdPolicy {
         }
         
         type PutResponse struct {
        -	Key              []*Reference `protobuf:"bytes,1,rep,name=key" json:"key,omitempty"`
        -	Cost             *Cost        `protobuf:"bytes,2,opt,name=cost" json:"cost,omitempty"`
        -	Version          []int64      `protobuf:"varint,3,rep,name=version" json:"version,omitempty"`
        -	XXX_unrecognized []byte       `json:"-"`
        +	Key                  []*Reference `protobuf:"bytes,1,rep,name=key" json:"key,omitempty"`
        +	Cost                 *Cost        `protobuf:"bytes,2,opt,name=cost" json:"cost,omitempty"`
        +	Version              []int64      `protobuf:"varint,3,rep,name=version" json:"version,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
        +	XXX_unrecognized     []byte       `json:"-"`
        +	XXX_sizecache        int32        `json:"-"`
         }
         
         func (m *PutResponse) Reset()         { *m = PutResponse{} }
         func (m *PutResponse) String() string { return proto.CompactTextString(m) }
         func (*PutResponse) ProtoMessage()    {}
        +func (*PutResponse) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{24}
        +}
        +func (m *PutResponse) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_PutResponse.Unmarshal(m, b)
        +}
        +func (m *PutResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_PutResponse.Marshal(b, m, deterministic)
        +}
        +func (dst *PutResponse) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_PutResponse.Merge(dst, src)
        +}
        +func (m *PutResponse) XXX_Size() int {
        +	return xxx_messageInfo_PutResponse.Size(m)
        +}
        +func (m *PutResponse) XXX_DiscardUnknown() {
        +	xxx_messageInfo_PutResponse.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_PutResponse proto.InternalMessageInfo
         
         func (m *PutResponse) GetKey() []*Reference {
         	if m != nil {
        @@ -2252,17 +3185,39 @@ func (m *PutResponse) GetVersion() []int64 {
         }
         
         type TouchRequest struct {
        -	Header           *InternalHeader   `protobuf:"bytes,10,opt,name=header" json:"header,omitempty"`
        -	Key              []*Reference      `protobuf:"bytes,1,rep,name=key" json:"key,omitempty"`
        -	CompositeIndex   []*CompositeIndex `protobuf:"bytes,2,rep,name=composite_index" json:"composite_index,omitempty"`
        -	Force            *bool             `protobuf:"varint,3,opt,name=force,def=0" json:"force,omitempty"`
        -	Snapshot         []*Snapshot       `protobuf:"bytes,9,rep,name=snapshot" json:"snapshot,omitempty"`
        -	XXX_unrecognized []byte            `json:"-"`
        +	Header               *InternalHeader   `protobuf:"bytes,10,opt,name=header" json:"header,omitempty"`
        +	Key                  []*Reference      `protobuf:"bytes,1,rep,name=key" json:"key,omitempty"`
        +	CompositeIndex       []*CompositeIndex `protobuf:"bytes,2,rep,name=composite_index,json=compositeIndex" json:"composite_index,omitempty"`
        +	Force                *bool             `protobuf:"varint,3,opt,name=force,def=0" json:"force,omitempty"`
        +	Snapshot             []*Snapshot       `protobuf:"bytes,9,rep,name=snapshot" json:"snapshot,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
        +	XXX_unrecognized     []byte            `json:"-"`
        +	XXX_sizecache        int32             `json:"-"`
         }
         
         func (m *TouchRequest) Reset()         { *m = TouchRequest{} }
         func (m *TouchRequest) String() string { return proto.CompactTextString(m) }
         func (*TouchRequest) ProtoMessage()    {}
        +func (*TouchRequest) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{25}
        +}
        +func (m *TouchRequest) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_TouchRequest.Unmarshal(m, b)
        +}
        +func (m *TouchRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_TouchRequest.Marshal(b, m, deterministic)
        +}
        +func (dst *TouchRequest) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_TouchRequest.Merge(dst, src)
        +}
        +func (m *TouchRequest) XXX_Size() int {
        +	return xxx_messageInfo_TouchRequest.Size(m)
        +}
        +func (m *TouchRequest) XXX_DiscardUnknown() {
        +	xxx_messageInfo_TouchRequest.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_TouchRequest proto.InternalMessageInfo
         
         const Default_TouchRequest_Force bool = false
         
        @@ -2302,13 +3257,35 @@ func (m *TouchRequest) GetSnapshot() []*Snapshot {
         }
         
         type TouchResponse struct {
        -	Cost             *Cost  `protobuf:"bytes,1,opt,name=cost" json:"cost,omitempty"`
        -	XXX_unrecognized []byte `json:"-"`
        +	Cost                 *Cost    `protobuf:"bytes,1,opt,name=cost" json:"cost,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *TouchResponse) Reset()         { *m = TouchResponse{} }
         func (m *TouchResponse) String() string { return proto.CompactTextString(m) }
         func (*TouchResponse) ProtoMessage()    {}
        +func (*TouchResponse) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{26}
        +}
        +func (m *TouchResponse) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_TouchResponse.Unmarshal(m, b)
        +}
        +func (m *TouchResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_TouchResponse.Marshal(b, m, deterministic)
        +}
        +func (dst *TouchResponse) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_TouchResponse.Merge(dst, src)
        +}
        +func (m *TouchResponse) XXX_Size() int {
        +	return xxx_messageInfo_TouchResponse.Size(m)
        +}
        +func (m *TouchResponse) XXX_DiscardUnknown() {
        +	xxx_messageInfo_TouchResponse.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_TouchResponse proto.InternalMessageInfo
         
         func (m *TouchResponse) GetCost() *Cost {
         	if m != nil {
        @@ -2318,19 +3295,41 @@ func (m *TouchResponse) GetCost() *Cost {
         }
         
         type DeleteRequest struct {
        -	Header           *InternalHeader `protobuf:"bytes,10,opt,name=header" json:"header,omitempty"`
        -	Key              []*Reference    `protobuf:"bytes,6,rep,name=key" json:"key,omitempty"`
        -	Transaction      *Transaction    `protobuf:"bytes,5,opt,name=transaction" json:"transaction,omitempty"`
        -	Trusted          *bool           `protobuf:"varint,4,opt,name=trusted,def=0" json:"trusted,omitempty"`
        -	Force            *bool           `protobuf:"varint,7,opt,name=force,def=0" json:"force,omitempty"`
        -	MarkChanges      *bool           `protobuf:"varint,8,opt,name=mark_changes,def=0" json:"mark_changes,omitempty"`
        -	Snapshot         []*Snapshot     `protobuf:"bytes,9,rep,name=snapshot" json:"snapshot,omitempty"`
        -	XXX_unrecognized []byte          `json:"-"`
        +	Header               *InternalHeader `protobuf:"bytes,10,opt,name=header" json:"header,omitempty"`
        +	Key                  []*Reference    `protobuf:"bytes,6,rep,name=key" json:"key,omitempty"`
        +	Transaction          *Transaction    `protobuf:"bytes,5,opt,name=transaction" json:"transaction,omitempty"`
        +	Trusted              *bool           `protobuf:"varint,4,opt,name=trusted,def=0" json:"trusted,omitempty"`
        +	Force                *bool           `protobuf:"varint,7,opt,name=force,def=0" json:"force,omitempty"`
        +	MarkChanges          *bool           `protobuf:"varint,8,opt,name=mark_changes,json=markChanges,def=0" json:"mark_changes,omitempty"`
        +	Snapshot             []*Snapshot     `protobuf:"bytes,9,rep,name=snapshot" json:"snapshot,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
        +	XXX_unrecognized     []byte          `json:"-"`
        +	XXX_sizecache        int32           `json:"-"`
         }
         
         func (m *DeleteRequest) Reset()         { *m = DeleteRequest{} }
         func (m *DeleteRequest) String() string { return proto.CompactTextString(m) }
         func (*DeleteRequest) ProtoMessage()    {}
        +func (*DeleteRequest) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{27}
        +}
        +func (m *DeleteRequest) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_DeleteRequest.Unmarshal(m, b)
        +}
        +func (m *DeleteRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_DeleteRequest.Marshal(b, m, deterministic)
        +}
        +func (dst *DeleteRequest) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_DeleteRequest.Merge(dst, src)
        +}
        +func (m *DeleteRequest) XXX_Size() int {
        +	return xxx_messageInfo_DeleteRequest.Size(m)
        +}
        +func (m *DeleteRequest) XXX_DiscardUnknown() {
        +	xxx_messageInfo_DeleteRequest.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_DeleteRequest proto.InternalMessageInfo
         
         const Default_DeleteRequest_Trusted bool = false
         const Default_DeleteRequest_Force bool = false
        @@ -2386,14 +3385,36 @@ func (m *DeleteRequest) GetSnapshot() []*Snapshot {
         }
         
         type DeleteResponse struct {
        -	Cost             *Cost   `protobuf:"bytes,1,opt,name=cost" json:"cost,omitempty"`
        -	Version          []int64 `protobuf:"varint,3,rep,name=version" json:"version,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	Cost                 *Cost    `protobuf:"bytes,1,opt,name=cost" json:"cost,omitempty"`
        +	Version              []int64  `protobuf:"varint,3,rep,name=version" json:"version,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *DeleteResponse) Reset()         { *m = DeleteResponse{} }
         func (m *DeleteResponse) String() string { return proto.CompactTextString(m) }
         func (*DeleteResponse) ProtoMessage()    {}
        +func (*DeleteResponse) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{28}
        +}
        +func (m *DeleteResponse) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_DeleteResponse.Unmarshal(m, b)
        +}
        +func (m *DeleteResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_DeleteResponse.Marshal(b, m, deterministic)
        +}
        +func (dst *DeleteResponse) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_DeleteResponse.Merge(dst, src)
        +}
        +func (m *DeleteResponse) XXX_Size() int {
        +	return xxx_messageInfo_DeleteResponse.Size(m)
        +}
        +func (m *DeleteResponse) XXX_DiscardUnknown() {
        +	xxx_messageInfo_DeleteResponse.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_DeleteResponse proto.InternalMessageInfo
         
         func (m *DeleteResponse) GetCost() *Cost {
         	if m != nil {
        @@ -2410,17 +3431,39 @@ func (m *DeleteResponse) GetVersion() []int64 {
         }
         
         type NextRequest struct {
        -	Header           *InternalHeader `protobuf:"bytes,5,opt,name=header" json:"header,omitempty"`
        -	Cursor           *Cursor         `protobuf:"bytes,1,req,name=cursor" json:"cursor,omitempty"`
        -	Count            *int32          `protobuf:"varint,2,opt,name=count" json:"count,omitempty"`
        -	Offset           *int32          `protobuf:"varint,4,opt,name=offset,def=0" json:"offset,omitempty"`
        -	Compile          *bool           `protobuf:"varint,3,opt,name=compile,def=0" json:"compile,omitempty"`
        -	XXX_unrecognized []byte          `json:"-"`
        +	Header               *InternalHeader `protobuf:"bytes,5,opt,name=header" json:"header,omitempty"`
        +	Cursor               *Cursor         `protobuf:"bytes,1,req,name=cursor" json:"cursor,omitempty"`
        +	Count                *int32          `protobuf:"varint,2,opt,name=count" json:"count,omitempty"`
        +	Offset               *int32          `protobuf:"varint,4,opt,name=offset,def=0" json:"offset,omitempty"`
        +	Compile              *bool           `protobuf:"varint,3,opt,name=compile,def=0" json:"compile,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
        +	XXX_unrecognized     []byte          `json:"-"`
        +	XXX_sizecache        int32           `json:"-"`
         }
         
         func (m *NextRequest) Reset()         { *m = NextRequest{} }
         func (m *NextRequest) String() string { return proto.CompactTextString(m) }
         func (*NextRequest) ProtoMessage()    {}
        +func (*NextRequest) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{29}
        +}
        +func (m *NextRequest) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_NextRequest.Unmarshal(m, b)
        +}
        +func (m *NextRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_NextRequest.Marshal(b, m, deterministic)
        +}
        +func (dst *NextRequest) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_NextRequest.Merge(dst, src)
        +}
        +func (m *NextRequest) XXX_Size() int {
        +	return xxx_messageInfo_NextRequest.Size(m)
        +}
        +func (m *NextRequest) XXX_DiscardUnknown() {
        +	xxx_messageInfo_NextRequest.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_NextRequest proto.InternalMessageInfo
         
         const Default_NextRequest_Offset int32 = 0
         const Default_NextRequest_Compile bool = false
        @@ -2461,23 +3504,45 @@ func (m *NextRequest) GetCompile() bool {
         }
         
         type QueryResult struct {
        -	Cursor           *Cursor           `protobuf:"bytes,1,opt,name=cursor" json:"cursor,omitempty"`
        -	Result           []*EntityProto    `protobuf:"bytes,2,rep,name=result" json:"result,omitempty"`
        -	SkippedResults   *int32            `protobuf:"varint,7,opt,name=skipped_results" json:"skipped_results,omitempty"`
        -	MoreResults      *bool             `protobuf:"varint,3,req,name=more_results" json:"more_results,omitempty"`
        -	KeysOnly         *bool             `protobuf:"varint,4,opt,name=keys_only" json:"keys_only,omitempty"`
        -	IndexOnly        *bool             `protobuf:"varint,9,opt,name=index_only" json:"index_only,omitempty"`
        -	SmallOps         *bool             `protobuf:"varint,10,opt,name=small_ops" json:"small_ops,omitempty"`
        -	CompiledQuery    *CompiledQuery    `protobuf:"bytes,5,opt,name=compiled_query" json:"compiled_query,omitempty"`
        -	CompiledCursor   *CompiledCursor   `protobuf:"bytes,6,opt,name=compiled_cursor" json:"compiled_cursor,omitempty"`
        -	Index            []*CompositeIndex `protobuf:"bytes,8,rep,name=index" json:"index,omitempty"`
        -	Version          []int64           `protobuf:"varint,11,rep,name=version" json:"version,omitempty"`
        -	XXX_unrecognized []byte            `json:"-"`
        +	Cursor               *Cursor           `protobuf:"bytes,1,opt,name=cursor" json:"cursor,omitempty"`
        +	Result               []*EntityProto    `protobuf:"bytes,2,rep,name=result" json:"result,omitempty"`
        +	SkippedResults       *int32            `protobuf:"varint,7,opt,name=skipped_results,json=skippedResults" json:"skipped_results,omitempty"`
        +	MoreResults          *bool             `protobuf:"varint,3,req,name=more_results,json=moreResults" json:"more_results,omitempty"`
        +	KeysOnly             *bool             `protobuf:"varint,4,opt,name=keys_only,json=keysOnly" json:"keys_only,omitempty"`
        +	IndexOnly            *bool             `protobuf:"varint,9,opt,name=index_only,json=indexOnly" json:"index_only,omitempty"`
        +	SmallOps             *bool             `protobuf:"varint,10,opt,name=small_ops,json=smallOps" json:"small_ops,omitempty"`
        +	CompiledQuery        *CompiledQuery    `protobuf:"bytes,5,opt,name=compiled_query,json=compiledQuery" json:"compiled_query,omitempty"`
        +	CompiledCursor       *CompiledCursor   `protobuf:"bytes,6,opt,name=compiled_cursor,json=compiledCursor" json:"compiled_cursor,omitempty"`
        +	Index                []*CompositeIndex `protobuf:"bytes,8,rep,name=index" json:"index,omitempty"`
        +	Version              []int64           `protobuf:"varint,11,rep,name=version" json:"version,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
        +	XXX_unrecognized     []byte            `json:"-"`
        +	XXX_sizecache        int32             `json:"-"`
         }
         
         func (m *QueryResult) Reset()         { *m = QueryResult{} }
         func (m *QueryResult) String() string { return proto.CompactTextString(m) }
         func (*QueryResult) ProtoMessage()    {}
        +func (*QueryResult) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{30}
        +}
        +func (m *QueryResult) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_QueryResult.Unmarshal(m, b)
        +}
        +func (m *QueryResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_QueryResult.Marshal(b, m, deterministic)
        +}
        +func (dst *QueryResult) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_QueryResult.Merge(dst, src)
        +}
        +func (m *QueryResult) XXX_Size() int {
        +	return xxx_messageInfo_QueryResult.Size(m)
        +}
        +func (m *QueryResult) XXX_DiscardUnknown() {
        +	xxx_messageInfo_QueryResult.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_QueryResult proto.InternalMessageInfo
         
         func (m *QueryResult) GetCursor() *Cursor {
         	if m != nil {
        @@ -2557,17 +3622,39 @@ func (m *QueryResult) GetVersion() []int64 {
         }
         
         type AllocateIdsRequest struct {
        -	Header           *InternalHeader `protobuf:"bytes,4,opt,name=header" json:"header,omitempty"`
        -	ModelKey         *Reference      `protobuf:"bytes,1,opt,name=model_key" json:"model_key,omitempty"`
        -	Size             *int64          `protobuf:"varint,2,opt,name=size" json:"size,omitempty"`
        -	Max              *int64          `protobuf:"varint,3,opt,name=max" json:"max,omitempty"`
        -	Reserve          []*Reference    `protobuf:"bytes,5,rep,name=reserve" json:"reserve,omitempty"`
        -	XXX_unrecognized []byte          `json:"-"`
        +	Header               *InternalHeader `protobuf:"bytes,4,opt,name=header" json:"header,omitempty"`
        +	ModelKey             *Reference      `protobuf:"bytes,1,opt,name=model_key,json=modelKey" json:"model_key,omitempty"`
        +	Size                 *int64          `protobuf:"varint,2,opt,name=size" json:"size,omitempty"`
        +	Max                  *int64          `protobuf:"varint,3,opt,name=max" json:"max,omitempty"`
        +	Reserve              []*Reference    `protobuf:"bytes,5,rep,name=reserve" json:"reserve,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
        +	XXX_unrecognized     []byte          `json:"-"`
        +	XXX_sizecache        int32           `json:"-"`
         }
         
         func (m *AllocateIdsRequest) Reset()         { *m = AllocateIdsRequest{} }
         func (m *AllocateIdsRequest) String() string { return proto.CompactTextString(m) }
         func (*AllocateIdsRequest) ProtoMessage()    {}
        +func (*AllocateIdsRequest) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{31}
        +}
        +func (m *AllocateIdsRequest) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_AllocateIdsRequest.Unmarshal(m, b)
        +}
        +func (m *AllocateIdsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_AllocateIdsRequest.Marshal(b, m, deterministic)
        +}
        +func (dst *AllocateIdsRequest) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_AllocateIdsRequest.Merge(dst, src)
        +}
        +func (m *AllocateIdsRequest) XXX_Size() int {
        +	return xxx_messageInfo_AllocateIdsRequest.Size(m)
        +}
        +func (m *AllocateIdsRequest) XXX_DiscardUnknown() {
        +	xxx_messageInfo_AllocateIdsRequest.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_AllocateIdsRequest proto.InternalMessageInfo
         
         func (m *AllocateIdsRequest) GetHeader() *InternalHeader {
         	if m != nil {
        @@ -2605,15 +3692,37 @@ func (m *AllocateIdsRequest) GetReserve() []*Reference {
         }
         
         type AllocateIdsResponse struct {
        -	Start            *int64 `protobuf:"varint,1,req,name=start" json:"start,omitempty"`
        -	End              *int64 `protobuf:"varint,2,req,name=end" json:"end,omitempty"`
        -	Cost             *Cost  `protobuf:"bytes,3,opt,name=cost" json:"cost,omitempty"`
        -	XXX_unrecognized []byte `json:"-"`
        +	Start                *int64   `protobuf:"varint,1,req,name=start" json:"start,omitempty"`
        +	End                  *int64   `protobuf:"varint,2,req,name=end" json:"end,omitempty"`
        +	Cost                 *Cost    `protobuf:"bytes,3,opt,name=cost" json:"cost,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *AllocateIdsResponse) Reset()         { *m = AllocateIdsResponse{} }
         func (m *AllocateIdsResponse) String() string { return proto.CompactTextString(m) }
         func (*AllocateIdsResponse) ProtoMessage()    {}
        +func (*AllocateIdsResponse) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{32}
        +}
        +func (m *AllocateIdsResponse) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_AllocateIdsResponse.Unmarshal(m, b)
        +}
        +func (m *AllocateIdsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_AllocateIdsResponse.Marshal(b, m, deterministic)
        +}
        +func (dst *AllocateIdsResponse) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_AllocateIdsResponse.Merge(dst, src)
        +}
        +func (m *AllocateIdsResponse) XXX_Size() int {
        +	return xxx_messageInfo_AllocateIdsResponse.Size(m)
        +}
        +func (m *AllocateIdsResponse) XXX_DiscardUnknown() {
        +	xxx_messageInfo_AllocateIdsResponse.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_AllocateIdsResponse proto.InternalMessageInfo
         
         func (m *AllocateIdsResponse) GetStart() int64 {
         	if m != nil && m.Start != nil {
        @@ -2637,13 +3746,35 @@ func (m *AllocateIdsResponse) GetCost() *Cost {
         }
         
         type CompositeIndices struct {
        -	Index            []*CompositeIndex `protobuf:"bytes,1,rep,name=index" json:"index,omitempty"`
        -	XXX_unrecognized []byte            `json:"-"`
        +	Index                []*CompositeIndex `protobuf:"bytes,1,rep,name=index" json:"index,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
        +	XXX_unrecognized     []byte            `json:"-"`
        +	XXX_sizecache        int32             `json:"-"`
         }
         
         func (m *CompositeIndices) Reset()         { *m = CompositeIndices{} }
         func (m *CompositeIndices) String() string { return proto.CompactTextString(m) }
         func (*CompositeIndices) ProtoMessage()    {}
        +func (*CompositeIndices) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{33}
        +}
        +func (m *CompositeIndices) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_CompositeIndices.Unmarshal(m, b)
        +}
        +func (m *CompositeIndices) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_CompositeIndices.Marshal(b, m, deterministic)
        +}
        +func (dst *CompositeIndices) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_CompositeIndices.Merge(dst, src)
        +}
        +func (m *CompositeIndices) XXX_Size() int {
        +	return xxx_messageInfo_CompositeIndices.Size(m)
        +}
        +func (m *CompositeIndices) XXX_DiscardUnknown() {
        +	xxx_messageInfo_CompositeIndices.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_CompositeIndices proto.InternalMessageInfo
         
         func (m *CompositeIndices) GetIndex() []*CompositeIndex {
         	if m != nil {
        @@ -2653,15 +3784,37 @@ func (m *CompositeIndices) GetIndex() []*CompositeIndex {
         }
         
         type AddActionsRequest struct {
        -	Header           *InternalHeader `protobuf:"bytes,3,opt,name=header" json:"header,omitempty"`
        -	Transaction      *Transaction    `protobuf:"bytes,1,req,name=transaction" json:"transaction,omitempty"`
        -	Action           []*Action       `protobuf:"bytes,2,rep,name=action" json:"action,omitempty"`
        -	XXX_unrecognized []byte          `json:"-"`
        +	Header               *InternalHeader `protobuf:"bytes,3,opt,name=header" json:"header,omitempty"`
        +	Transaction          *Transaction    `protobuf:"bytes,1,req,name=transaction" json:"transaction,omitempty"`
        +	Action               []*Action       `protobuf:"bytes,2,rep,name=action" json:"action,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
        +	XXX_unrecognized     []byte          `json:"-"`
        +	XXX_sizecache        int32           `json:"-"`
         }
         
         func (m *AddActionsRequest) Reset()         { *m = AddActionsRequest{} }
         func (m *AddActionsRequest) String() string { return proto.CompactTextString(m) }
         func (*AddActionsRequest) ProtoMessage()    {}
        +func (*AddActionsRequest) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{34}
        +}
        +func (m *AddActionsRequest) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_AddActionsRequest.Unmarshal(m, b)
        +}
        +func (m *AddActionsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_AddActionsRequest.Marshal(b, m, deterministic)
        +}
        +func (dst *AddActionsRequest) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_AddActionsRequest.Merge(dst, src)
        +}
        +func (m *AddActionsRequest) XXX_Size() int {
        +	return xxx_messageInfo_AddActionsRequest.Size(m)
        +}
        +func (m *AddActionsRequest) XXX_DiscardUnknown() {
        +	xxx_messageInfo_AddActionsRequest.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_AddActionsRequest proto.InternalMessageInfo
         
         func (m *AddActionsRequest) GetHeader() *InternalHeader {
         	if m != nil {
        @@ -2685,25 +3838,73 @@ func (m *AddActionsRequest) GetAction() []*Action {
         }
         
         type AddActionsResponse struct {
        -	XXX_unrecognized []byte `json:"-"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *AddActionsResponse) Reset()         { *m = AddActionsResponse{} }
         func (m *AddActionsResponse) String() string { return proto.CompactTextString(m) }
         func (*AddActionsResponse) ProtoMessage()    {}
        +func (*AddActionsResponse) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{35}
        +}
        +func (m *AddActionsResponse) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_AddActionsResponse.Unmarshal(m, b)
        +}
        +func (m *AddActionsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_AddActionsResponse.Marshal(b, m, deterministic)
        +}
        +func (dst *AddActionsResponse) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_AddActionsResponse.Merge(dst, src)
        +}
        +func (m *AddActionsResponse) XXX_Size() int {
        +	return xxx_messageInfo_AddActionsResponse.Size(m)
        +}
        +func (m *AddActionsResponse) XXX_DiscardUnknown() {
        +	xxx_messageInfo_AddActionsResponse.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_AddActionsResponse proto.InternalMessageInfo
         
         type BeginTransactionRequest struct {
        -	Header           *InternalHeader `protobuf:"bytes,3,opt,name=header" json:"header,omitempty"`
        -	App              *string         `protobuf:"bytes,1,req,name=app" json:"app,omitempty"`
        -	AllowMultipleEg  *bool           `protobuf:"varint,2,opt,name=allow_multiple_eg,def=0" json:"allow_multiple_eg,omitempty"`
        -	XXX_unrecognized []byte          `json:"-"`
        +	Header               *InternalHeader                          `protobuf:"bytes,3,opt,name=header" json:"header,omitempty"`
        +	App                  *string                                  `protobuf:"bytes,1,req,name=app" json:"app,omitempty"`
        +	AllowMultipleEg      *bool                                    `protobuf:"varint,2,opt,name=allow_multiple_eg,json=allowMultipleEg,def=0" json:"allow_multiple_eg,omitempty"`
        +	DatabaseId           *string                                  `protobuf:"bytes,4,opt,name=database_id,json=databaseId" json:"database_id,omitempty"`
        +	Mode                 *BeginTransactionRequest_TransactionMode `protobuf:"varint,5,opt,name=mode,enum=appengine.BeginTransactionRequest_TransactionMode,def=0" json:"mode,omitempty"`
        +	PreviousTransaction  *Transaction                             `protobuf:"bytes,7,opt,name=previous_transaction,json=previousTransaction" json:"previous_transaction,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}                                 `json:"-"`
        +	XXX_unrecognized     []byte                                   `json:"-"`
        +	XXX_sizecache        int32                                    `json:"-"`
         }
         
         func (m *BeginTransactionRequest) Reset()         { *m = BeginTransactionRequest{} }
         func (m *BeginTransactionRequest) String() string { return proto.CompactTextString(m) }
         func (*BeginTransactionRequest) ProtoMessage()    {}
        +func (*BeginTransactionRequest) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{36}
        +}
        +func (m *BeginTransactionRequest) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_BeginTransactionRequest.Unmarshal(m, b)
        +}
        +func (m *BeginTransactionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_BeginTransactionRequest.Marshal(b, m, deterministic)
        +}
        +func (dst *BeginTransactionRequest) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_BeginTransactionRequest.Merge(dst, src)
        +}
        +func (m *BeginTransactionRequest) XXX_Size() int {
        +	return xxx_messageInfo_BeginTransactionRequest.Size(m)
        +}
        +func (m *BeginTransactionRequest) XXX_DiscardUnknown() {
        +	xxx_messageInfo_BeginTransactionRequest.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_BeginTransactionRequest proto.InternalMessageInfo
         
         const Default_BeginTransactionRequest_AllowMultipleEg bool = false
        +const Default_BeginTransactionRequest_Mode BeginTransactionRequest_TransactionMode = BeginTransactionRequest_UNKNOWN
         
         func (m *BeginTransactionRequest) GetHeader() *InternalHeader {
         	if m != nil {
        @@ -2726,15 +3927,58 @@ func (m *BeginTransactionRequest) GetAllowMultipleEg() bool {
         	return Default_BeginTransactionRequest_AllowMultipleEg
         }
         
        +func (m *BeginTransactionRequest) GetDatabaseId() string {
        +	if m != nil && m.DatabaseId != nil {
        +		return *m.DatabaseId
        +	}
        +	return ""
        +}
        +
        +func (m *BeginTransactionRequest) GetMode() BeginTransactionRequest_TransactionMode {
        +	if m != nil && m.Mode != nil {
        +		return *m.Mode
        +	}
        +	return Default_BeginTransactionRequest_Mode
        +}
        +
        +func (m *BeginTransactionRequest) GetPreviousTransaction() *Transaction {
        +	if m != nil {
        +		return m.PreviousTransaction
        +	}
        +	return nil
        +}
        +
         type CommitResponse struct {
        -	Cost             *Cost                     `protobuf:"bytes,1,opt,name=cost" json:"cost,omitempty"`
        -	Version          []*CommitResponse_Version `protobuf:"group,3,rep,name=Version" json:"version,omitempty"`
        -	XXX_unrecognized []byte                    `json:"-"`
        +	Cost                 *Cost                     `protobuf:"bytes,1,opt,name=cost" json:"cost,omitempty"`
        +	Version              []*CommitResponse_Version `protobuf:"group,3,rep,name=Version,json=version" json:"version,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
        +	XXX_unrecognized     []byte                    `json:"-"`
        +	XXX_sizecache        int32                     `json:"-"`
         }
         
         func (m *CommitResponse) Reset()         { *m = CommitResponse{} }
         func (m *CommitResponse) String() string { return proto.CompactTextString(m) }
         func (*CommitResponse) ProtoMessage()    {}
        +func (*CommitResponse) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{37}
        +}
        +func (m *CommitResponse) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_CommitResponse.Unmarshal(m, b)
        +}
        +func (m *CommitResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_CommitResponse.Marshal(b, m, deterministic)
        +}
        +func (dst *CommitResponse) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_CommitResponse.Merge(dst, src)
        +}
        +func (m *CommitResponse) XXX_Size() int {
        +	return xxx_messageInfo_CommitResponse.Size(m)
        +}
        +func (m *CommitResponse) XXX_DiscardUnknown() {
        +	xxx_messageInfo_CommitResponse.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_CommitResponse proto.InternalMessageInfo
         
         func (m *CommitResponse) GetCost() *Cost {
         	if m != nil {
        @@ -2751,14 +3995,36 @@ func (m *CommitResponse) GetVersion() []*CommitResponse_Version {
         }
         
         type CommitResponse_Version struct {
        -	RootEntityKey    *Reference `protobuf:"bytes,4,req,name=root_entity_key" json:"root_entity_key,omitempty"`
        -	Version          *int64     `protobuf:"varint,5,req,name=version" json:"version,omitempty"`
        -	XXX_unrecognized []byte     `json:"-"`
        +	RootEntityKey        *Reference `protobuf:"bytes,4,req,name=root_entity_key,json=rootEntityKey" json:"root_entity_key,omitempty"`
        +	Version              *int64     `protobuf:"varint,5,req,name=version" json:"version,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
        +	XXX_unrecognized     []byte     `json:"-"`
        +	XXX_sizecache        int32      `json:"-"`
         }
         
         func (m *CommitResponse_Version) Reset()         { *m = CommitResponse_Version{} }
         func (m *CommitResponse_Version) String() string { return proto.CompactTextString(m) }
         func (*CommitResponse_Version) ProtoMessage()    {}
        +func (*CommitResponse_Version) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{37, 0}
        +}
        +func (m *CommitResponse_Version) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_CommitResponse_Version.Unmarshal(m, b)
        +}
        +func (m *CommitResponse_Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_CommitResponse_Version.Marshal(b, m, deterministic)
        +}
        +func (dst *CommitResponse_Version) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_CommitResponse_Version.Merge(dst, src)
        +}
        +func (m *CommitResponse_Version) XXX_Size() int {
        +	return xxx_messageInfo_CommitResponse_Version.Size(m)
        +}
        +func (m *CommitResponse_Version) XXX_DiscardUnknown() {
        +	xxx_messageInfo_CommitResponse_Version.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_CommitResponse_Version proto.InternalMessageInfo
         
         func (m *CommitResponse_Version) GetRootEntityKey() *Reference {
         	if m != nil {
        @@ -2775,4 +4041,327 @@ func (m *CommitResponse_Version) GetVersion() int64 {
         }
         
         func init() {
        +	proto.RegisterType((*Action)(nil), "appengine.Action")
        +	proto.RegisterType((*PropertyValue)(nil), "appengine.PropertyValue")
        +	proto.RegisterType((*PropertyValue_PointValue)(nil), "appengine.PropertyValue.PointValue")
        +	proto.RegisterType((*PropertyValue_UserValue)(nil), "appengine.PropertyValue.UserValue")
        +	proto.RegisterType((*PropertyValue_ReferenceValue)(nil), "appengine.PropertyValue.ReferenceValue")
        +	proto.RegisterType((*PropertyValue_ReferenceValue_PathElement)(nil), "appengine.PropertyValue.ReferenceValue.PathElement")
        +	proto.RegisterType((*Property)(nil), "appengine.Property")
        +	proto.RegisterType((*Path)(nil), "appengine.Path")
        +	proto.RegisterType((*Path_Element)(nil), "appengine.Path.Element")
        +	proto.RegisterType((*Reference)(nil), "appengine.Reference")
        +	proto.RegisterType((*User)(nil), "appengine.User")
        +	proto.RegisterType((*EntityProto)(nil), "appengine.EntityProto")
        +	proto.RegisterType((*CompositeProperty)(nil), "appengine.CompositeProperty")
        +	proto.RegisterType((*Index)(nil), "appengine.Index")
        +	proto.RegisterType((*Index_Property)(nil), "appengine.Index.Property")
        +	proto.RegisterType((*CompositeIndex)(nil), "appengine.CompositeIndex")
        +	proto.RegisterType((*IndexPostfix)(nil), "appengine.IndexPostfix")
        +	proto.RegisterType((*IndexPostfix_IndexValue)(nil), "appengine.IndexPostfix.IndexValue")
        +	proto.RegisterType((*IndexPosition)(nil), "appengine.IndexPosition")
        +	proto.RegisterType((*Snapshot)(nil), "appengine.Snapshot")
        +	proto.RegisterType((*InternalHeader)(nil), "appengine.InternalHeader")
        +	proto.RegisterType((*Transaction)(nil), "appengine.Transaction")
        +	proto.RegisterType((*Query)(nil), "appengine.Query")
        +	proto.RegisterType((*Query_Filter)(nil), "appengine.Query.Filter")
        +	proto.RegisterType((*Query_Order)(nil), "appengine.Query.Order")
        +	proto.RegisterType((*CompiledQuery)(nil), "appengine.CompiledQuery")
        +	proto.RegisterType((*CompiledQuery_PrimaryScan)(nil), "appengine.CompiledQuery.PrimaryScan")
        +	proto.RegisterType((*CompiledQuery_MergeJoinScan)(nil), "appengine.CompiledQuery.MergeJoinScan")
        +	proto.RegisterType((*CompiledQuery_EntityFilter)(nil), "appengine.CompiledQuery.EntityFilter")
        +	proto.RegisterType((*CompiledCursor)(nil), "appengine.CompiledCursor")
        +	proto.RegisterType((*CompiledCursor_Position)(nil), "appengine.CompiledCursor.Position")
        +	proto.RegisterType((*CompiledCursor_Position_IndexValue)(nil), "appengine.CompiledCursor.Position.IndexValue")
        +	proto.RegisterType((*Cursor)(nil), "appengine.Cursor")
        +	proto.RegisterType((*Error)(nil), "appengine.Error")
        +	proto.RegisterType((*Cost)(nil), "appengine.Cost")
        +	proto.RegisterType((*Cost_CommitCost)(nil), "appengine.Cost.CommitCost")
        +	proto.RegisterType((*GetRequest)(nil), "appengine.GetRequest")
        +	proto.RegisterType((*GetResponse)(nil), "appengine.GetResponse")
        +	proto.RegisterType((*GetResponse_Entity)(nil), "appengine.GetResponse.Entity")
        +	proto.RegisterType((*PutRequest)(nil), "appengine.PutRequest")
        +	proto.RegisterType((*PutResponse)(nil), "appengine.PutResponse")
        +	proto.RegisterType((*TouchRequest)(nil), "appengine.TouchRequest")
        +	proto.RegisterType((*TouchResponse)(nil), "appengine.TouchResponse")
        +	proto.RegisterType((*DeleteRequest)(nil), "appengine.DeleteRequest")
        +	proto.RegisterType((*DeleteResponse)(nil), "appengine.DeleteResponse")
        +	proto.RegisterType((*NextRequest)(nil), "appengine.NextRequest")
        +	proto.RegisterType((*QueryResult)(nil), "appengine.QueryResult")
        +	proto.RegisterType((*AllocateIdsRequest)(nil), "appengine.AllocateIdsRequest")
        +	proto.RegisterType((*AllocateIdsResponse)(nil), "appengine.AllocateIdsResponse")
        +	proto.RegisterType((*CompositeIndices)(nil), "appengine.CompositeIndices")
        +	proto.RegisterType((*AddActionsRequest)(nil), "appengine.AddActionsRequest")
        +	proto.RegisterType((*AddActionsResponse)(nil), "appengine.AddActionsResponse")
        +	proto.RegisterType((*BeginTransactionRequest)(nil), "appengine.BeginTransactionRequest")
        +	proto.RegisterType((*CommitResponse)(nil), "appengine.CommitResponse")
        +	proto.RegisterType((*CommitResponse_Version)(nil), "appengine.CommitResponse.Version")
        +}
        +
        +func init() {
        +	proto.RegisterFile("google.golang.org/appengine/internal/datastore/datastore_v3.proto", fileDescriptor_datastore_v3_83b17b80c34f6179)
        +}
        +
        +var fileDescriptor_datastore_v3_83b17b80c34f6179 = []byte{
        +	// 4156 bytes of a gzipped FileDescriptorProto
        +	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5a, 0xcd, 0x73, 0xe3, 0x46,
        +	0x76, 0x37, 0xc1, 0xef, 0x47, 0x89, 0x82, 0x5a, 0xf3, 0xc1, 0xa1, 0x3f, 0x46, 0xc6, 0xac, 0x6d,
        +	0xd9, 0x6b, 0x73, 0x6c, 0xf9, 0x23, 0x5b, 0x4a, 0x76, 0x1d, 0x4a, 0xc4, 0x68, 0x90, 0xa1, 0x48,
        +	0xb9, 0x09, 0xd9, 0x9e, 0x5c, 0x50, 0x18, 0xa2, 0x29, 0x21, 0x43, 0x02, 0x30, 0x00, 0x6a, 0x46,
        +	0x93, 0xe4, 0x90, 0x4b, 0x2a, 0x55, 0x5b, 0xa9, 0x1c, 0x92, 0x4a, 0x25, 0xf9, 0x07, 0x72, 0xc8,
        +	0x39, 0x95, 0xaa, 0x54, 0xf6, 0x98, 0x5b, 0x0e, 0x7b, 0xc9, 0x31, 0x95, 0x73, 0xf2, 0x27, 0x24,
        +	0x39, 0xa4, 0xfa, 0x75, 0x03, 0x02, 0x28, 0x4a, 0x23, 0x6d, 0xf6, 0x90, 0x13, 0xd1, 0xef, 0xfd,
        +	0xba, 0xf1, 0xfa, 0xf5, 0xfb, 0x6c, 0x10, 0xba, 0xc7, 0xbe, 0x7f, 0x3c, 0x65, 0x9d, 0x63, 0x7f,
        +	0x6a, 0x7b, 0xc7, 0x1d, 0x3f, 0x3c, 0x7e, 0x68, 0x07, 0x01, 0xf3, 0x8e, 0x5d, 0x8f, 0x3d, 0x74,
        +	0xbd, 0x98, 0x85, 0x9e, 0x3d, 0x7d, 0xe8, 0xd8, 0xb1, 0x1d, 0xc5, 0x7e, 0xc8, 0xce, 0x9f, 0xac,
        +	0xd3, 0xcf, 0x3b, 0x41, 0xe8, 0xc7, 0x3e, 0xa9, 0xa7, 0x13, 0xb4, 0x1a, 0x54, 0xba, 0xe3, 0xd8,
        +	0xf5, 0x3d, 0xed, 0x1f, 0x2b, 0xb0, 0x7a, 0x18, 0xfa, 0x01, 0x0b, 0xe3, 0xb3, 0x6f, 0xed, 0xe9,
        +	0x9c, 0x91, 0x77, 0x00, 0x5c, 0x2f, 0xfe, 0xea, 0x0b, 0x1c, 0xb5, 0x0a, 0x9b, 0x85, 0xad, 0x22,
        +	0xcd, 0x50, 0x88, 0x06, 0x2b, 0xcf, 0x7c, 0x7f, 0xca, 0x6c, 0x4f, 0x20, 0x94, 0xcd, 0xc2, 0x56,
        +	0x8d, 0xe6, 0x68, 0x64, 0x13, 0x1a, 0x51, 0x1c, 0xba, 0xde, 0xb1, 0x80, 0x14, 0x37, 0x0b, 0x5b,
        +	0x75, 0x9a, 0x25, 0x71, 0x84, 0xe3, 0xcf, 0x9f, 0x4d, 0x99, 0x40, 0x94, 0x36, 0x0b, 0x5b, 0x05,
        +	0x9a, 0x25, 0x91, 0x3d, 0x80, 0xc0, 0x77, 0xbd, 0xf8, 0x14, 0x01, 0xe5, 0xcd, 0xc2, 0x16, 0x6c,
        +	0x3f, 0xe8, 0xa4, 0x7b, 0xe8, 0xe4, 0xa4, 0xee, 0x1c, 0x72, 0x28, 0x3e, 0xd2, 0xcc, 0x34, 0xf2,
        +	0xdb, 0x50, 0x9f, 0x47, 0x2c, 0x14, 0x6b, 0xd4, 0x70, 0x0d, 0xed, 0xd2, 0x35, 0x8e, 0x22, 0x16,
        +	0x8a, 0x25, 0xce, 0x27, 0x91, 0x21, 0x34, 0x43, 0x36, 0x61, 0x21, 0xf3, 0xc6, 0x4c, 0x2c, 0xb3,
        +	0x82, 0xcb, 0x7c, 0x70, 0xe9, 0x32, 0x34, 0x81, 0x8b, 0xb5, 0x16, 0xa6, 0xb7, 0xb7, 0x00, 0xce,
        +	0x85, 0x25, 0x2b, 0x50, 0x78, 0xd9, 0xaa, 0x6c, 0x2a, 0x5b, 0x05, 0x5a, 0x78, 0xc9, 0x47, 0x67,
        +	0xad, 0xaa, 0x18, 0x9d, 0xb5, 0xff, 0xa9, 0x00, 0xf5, 0x54, 0x26, 0x72, 0x0b, 0xca, 0x6c, 0x66,
        +	0xbb, 0xd3, 0x56, 0x7d, 0x53, 0xd9, 0xaa, 0x53, 0x31, 0x20, 0xf7, 0xa1, 0x61, 0xcf, 0xe3, 0x13,
        +	0xcb, 0xf1, 0x67, 0xb6, 0xeb, 0xb5, 0x00, 0x79, 0xc0, 0x49, 0x3d, 0xa4, 0x90, 0x36, 0xd4, 0x3c,
        +	0x77, 0xfc, 0xdc, 0xb3, 0x67, 0xac, 0xd5, 0xc0, 0x73, 0x48, 0xc7, 0xe4, 0x13, 0x20, 0x13, 0xe6,
        +	0xb0, 0xd0, 0x8e, 0x99, 0x63, 0xb9, 0x0e, 0xf3, 0x62, 0x37, 0x3e, 0x6b, 0xdd, 0x46, 0xd4, 0x7a,
        +	0xca, 0x31, 0x24, 0x23, 0x0f, 0x0f, 0x42, 0xff, 0xd4, 0x75, 0x58, 0xd8, 0xba, 0xb3, 0x00, 0x3f,
        +	0x94, 0x8c, 0xf6, 0xbf, 0x17, 0xa0, 0x99, 0xd7, 0x05, 0x51, 0xa1, 0x68, 0x07, 0x41, 0x6b, 0x15,
        +	0xa5, 0xe4, 0x8f, 0xe4, 0x6d, 0x00, 0x2e, 0x8a, 0x15, 0x05, 0xf6, 0x98, 0xb5, 0x6e, 0xe1, 0x5a,
        +	0x75, 0x4e, 0x19, 0x71, 0x02, 0x39, 0x82, 0x46, 0x60, 0xc7, 0x27, 0x6c, 0xca, 0x66, 0xcc, 0x8b,
        +	0x5b, 0xcd, 0xcd, 0xe2, 0x16, 0x6c, 0x7f, 0x7e, 0x4d, 0xd5, 0x77, 0x0e, 0xed, 0xf8, 0x44, 0x17,
        +	0x53, 0x69, 0x76, 0x9d, 0xb6, 0x0e, 0x8d, 0x0c, 0x8f, 0x10, 0x28, 0xc5, 0x67, 0x01, 0x6b, 0xad,
        +	0xa1, 0x5c, 0xf8, 0x4c, 0x9a, 0xa0, 0xb8, 0x4e, 0x4b, 0x45, 0xf3, 0x57, 0x5c, 0x87, 0x63, 0x50,
        +	0x87, 0xeb, 0x28, 0x22, 0x3e, 0x6b, 0xff, 0x51, 0x86, 0x5a, 0x22, 0x00, 0xe9, 0x42, 0x75, 0xc6,
        +	0x6c, 0xcf, 0xf5, 0x8e, 0xd1, 0x69, 0x9a, 0xdb, 0x6f, 0x2e, 0x11, 0xb3, 0x73, 0x20, 0x20, 0x3b,
        +	0x30, 0x18, 0x5a, 0x07, 0x7a, 0x77, 0x60, 0x0c, 0xf6, 0x69, 0x32, 0x8f, 0x1f, 0xa6, 0x7c, 0xb4,
        +	0xe6, 0xa1, 0x8b, 0x9e, 0x55, 0xa7, 0x20, 0x49, 0x47, 0xa1, 0x9b, 0x0a, 0x51, 0x14, 0x82, 0xe2,
        +	0x21, 0x76, 0xa0, 0x9c, 0xb8, 0x88, 0xb2, 0xd5, 0xd8, 0x6e, 0x5d, 0xa6, 0x1c, 0x2a, 0x60, 0xdc,
        +	0x20, 0x66, 0xf3, 0x69, 0xec, 0x06, 0x53, 0xee, 0x76, 0xca, 0x56, 0x8d, 0xa6, 0x63, 0xf2, 0x1e,
        +	0x40, 0xc4, 0xec, 0x70, 0x7c, 0x62, 0x3f, 0x9b, 0xb2, 0x56, 0x85, 0x7b, 0xf6, 0x4e, 0x79, 0x62,
        +	0x4f, 0x23, 0x46, 0x33, 0x0c, 0x62, 0xc3, 0xdd, 0x49, 0x1c, 0x59, 0xb1, 0xff, 0x9c, 0x79, 0xee,
        +	0x2b, 0x9b, 0x07, 0x12, 0xcb, 0x0f, 0xf8, 0x0f, 0xfa, 0x58, 0x73, 0xfb, 0xc3, 0x65, 0x5b, 0x7f,
        +	0x14, 0x47, 0x66, 0x66, 0xc6, 0x10, 0x27, 0xd0, 0xdb, 0x93, 0x65, 0x64, 0xd2, 0x86, 0xca, 0xd4,
        +	0x1f, 0xdb, 0x53, 0xd6, 0xaa, 0x73, 0x2d, 0xec, 0x28, 0xcc, 0xa3, 0x92, 0xa2, 0xfd, 0xb3, 0x02,
        +	0x55, 0xa9, 0x47, 0xd2, 0x84, 0x8c, 0x26, 0xd5, 0x37, 0x48, 0x0d, 0x4a, 0xbb, 0xfd, 0xe1, 0xae,
        +	0xda, 0xe4, 0x4f, 0xa6, 0xfe, 0xbd, 0xa9, 0xae, 0x71, 0xcc, 0xee, 0x53, 0x53, 0x1f, 0x99, 0x94,
        +	0x63, 0x54, 0xb2, 0x0e, 0xab, 0x5d, 0x73, 0x78, 0x60, 0xed, 0x75, 0x4d, 0x7d, 0x7f, 0x48, 0x9f,
        +	0xaa, 0x05, 0xb2, 0x0a, 0x75, 0x24, 0xf5, 0x8d, 0xc1, 0x13, 0x55, 0xe1, 0x33, 0x70, 0x68, 0x1a,
        +	0x66, 0x5f, 0x57, 0x8b, 0x44, 0x85, 0x15, 0x31, 0x63, 0x38, 0x30, 0xf5, 0x81, 0xa9, 0x96, 0x52,
        +	0xca, 0xe8, 0xe8, 0xe0, 0xa0, 0x4b, 0x9f, 0xaa, 0x65, 0xb2, 0x06, 0x0d, 0xa4, 0x74, 0x8f, 0xcc,
        +	0xc7, 0x43, 0xaa, 0x56, 0x48, 0x03, 0xaa, 0xfb, 0x3d, 0xeb, 0xbb, 0xc7, 0xfa, 0x40, 0xad, 0x92,
        +	0x15, 0xa8, 0xed, 0xf7, 0x2c, 0xfd, 0xa0, 0x6b, 0xf4, 0xd5, 0x1a, 0x9f, 0xbd, 0xaf, 0x0f, 0xe9,
        +	0x68, 0x64, 0x1d, 0x0e, 0x8d, 0x81, 0xa9, 0xd6, 0x49, 0x1d, 0xca, 0xfb, 0x3d, 0xcb, 0x38, 0x50,
        +	0x81, 0x10, 0x68, 0xee, 0xf7, 0xac, 0xc3, 0xc7, 0xc3, 0x81, 0x3e, 0x38, 0x3a, 0xd8, 0xd5, 0xa9,
        +	0xda, 0x20, 0xb7, 0x40, 0xe5, 0xb4, 0xe1, 0xc8, 0xec, 0xf6, 0xbb, 0xbd, 0x1e, 0xd5, 0x47, 0x23,
        +	0x75, 0x85, 0x4b, 0xbd, 0xdf, 0xb3, 0x68, 0xd7, 0xe4, 0xfb, 0x5a, 0xe5, 0x2f, 0xe4, 0x7b, 0x7f,
        +	0xa2, 0x3f, 0x55, 0xd7, 0xf9, 0x2b, 0xf4, 0x81, 0x69, 0x98, 0x4f, 0xad, 0x43, 0x3a, 0x34, 0x87,
        +	0xea, 0x06, 0x17, 0xd0, 0x18, 0xf4, 0xf4, 0xef, 0xad, 0x6f, 0xbb, 0xfd, 0x23, 0x5d, 0x25, 0xda,
        +	0x8f, 0xe1, 0xf6, 0xd2, 0x33, 0xe1, 0xaa, 0x7b, 0x6c, 0x1e, 0xf4, 0xd5, 0x02, 0x7f, 0xe2, 0x9b,
        +	0x52, 0x15, 0xed, 0x0f, 0xa0, 0xc4, 0x5d, 0x86, 0x7c, 0x06, 0xd5, 0xc4, 0x1b, 0x0b, 0xe8, 0x8d,
        +	0x77, 0xb3, 0x67, 0x6d, 0xc7, 0x27, 0x9d, 0xc4, 0xe3, 0x12, 0x5c, 0xbb, 0x0b, 0xd5, 0x45, 0x4f,
        +	0x53, 0x2e, 0x78, 0x5a, 0xf1, 0x82, 0xa7, 0x95, 0x32, 0x9e, 0x66, 0x43, 0x3d, 0xf5, 0xed, 0x9b,
        +	0x47, 0x91, 0x07, 0x50, 0xe2, 0xde, 0xdf, 0x6a, 0xa2, 0x87, 0xac, 0x2d, 0x08, 0x4c, 0x91, 0xa9,
        +	0xfd, 0x43, 0x01, 0x4a, 0x3c, 0xda, 0x9e, 0x07, 0xda, 0xc2, 0x15, 0x81, 0x56, 0xb9, 0x32, 0xd0,
        +	0x16, 0xaf, 0x15, 0x68, 0x2b, 0x37, 0x0b, 0xb4, 0xd5, 0x4b, 0x02, 0xad, 0xf6, 0x67, 0x45, 0x68,
        +	0xe8, 0x38, 0xf3, 0x10, 0x13, 0xfd, 0xfb, 0x50, 0x7c, 0xce, 0xce, 0x50, 0x3f, 0x8d, 0xed, 0x5b,
        +	0x99, 0xdd, 0xa6, 0x2a, 0xa4, 0x1c, 0x40, 0xb6, 0x61, 0x45, 0xbc, 0xd0, 0x3a, 0x0e, 0xfd, 0x79,
        +	0xd0, 0x52, 0x97, 0xab, 0xa7, 0x21, 0x40, 0xfb, 0x1c, 0x43, 0xde, 0x83, 0xb2, 0xff, 0xc2, 0x63,
        +	0x21, 0xc6, 0xc1, 0x3c, 0x98, 0x2b, 0x8f, 0x0a, 0x2e, 0x79, 0x08, 0xa5, 0xe7, 0xae, 0xe7, 0xe0,
        +	0x19, 0xe6, 0x23, 0x61, 0x46, 0xd0, 0xce, 0x13, 0xd7, 0x73, 0x28, 0x02, 0xc9, 0x3d, 0xa8, 0xf1,
        +	0x5f, 0x8c, 0x7b, 0x65, 0xdc, 0x68, 0x95, 0x8f, 0x79, 0xd0, 0x7b, 0x08, 0xb5, 0x40, 0xc6, 0x10,
        +	0x4c, 0x00, 0x8d, 0xed, 0x8d, 0x25, 0xe1, 0x85, 0xa6, 0x20, 0xf2, 0x15, 0xac, 0x84, 0xf6, 0x0b,
        +	0x2b, 0x9d, 0xb4, 0x76, 0xf9, 0xa4, 0x46, 0x68, 0xbf, 0x48, 0x23, 0x38, 0x81, 0x52, 0x68, 0x7b,
        +	0xcf, 0x5b, 0x64, 0xb3, 0xb0, 0x55, 0xa6, 0xf8, 0xac, 0x7d, 0x01, 0x25, 0x2e, 0x25, 0x8f, 0x08,
        +	0xfb, 0x3d, 0xf4, 0xff, 0xee, 0x9e, 0xa9, 0x16, 0x12, 0x7f, 0xfe, 0x96, 0x47, 0x03, 0x45, 0x72,
        +	0x0f, 0xf4, 0xd1, 0xa8, 0xbb, 0xaf, 0xab, 0x45, 0xad, 0x07, 0xeb, 0x7b, 0xfe, 0x2c, 0xf0, 0x23,
        +	0x37, 0x66, 0xe9, 0xf2, 0xf7, 0xa0, 0xe6, 0x7a, 0x0e, 0x7b, 0x69, 0xb9, 0x0e, 0x9a, 0x56, 0x91,
        +	0x56, 0x71, 0x6c, 0x38, 0xdc, 0xe4, 0x4e, 0x65, 0x31, 0x55, 0xe4, 0x26, 0x87, 0x03, 0xed, 0x2f,
        +	0x15, 0x28, 0x1b, 0x1c, 0xc1, 0x8d, 0x4f, 0x9e, 0x14, 0x7a, 0x8f, 0x30, 0x4c, 0x10, 0x24, 0x93,
        +	0xfb, 0x50, 0x1b, 0x6a, 0xb6, 0x37, 0x66, 0xbc, 0xe2, 0xc3, 0x3c, 0x50, 0xa3, 0xe9, 0x98, 0x7c,
        +	0x99, 0xd1, 0x9f, 0x82, 0x2e, 0x7b, 0x2f, 0xa3, 0x0a, 0x7c, 0xc1, 0x12, 0x2d, 0xb6, 0xff, 0xaa,
        +	0x90, 0x49, 0x6e, 0xcb, 0x12, 0x4f, 0x1f, 0xea, 0x8e, 0x1b, 0x32, 0xac, 0x23, 0xe5, 0x41, 0x3f,
        +	0xb8, 0x74, 0xe1, 0x4e, 0x2f, 0x81, 0xee, 0xd4, 0xbb, 0xa3, 0x3d, 0x7d, 0xd0, 0xe3, 0x99, 0xef,
        +	0x7c, 0x01, 0xed, 0x23, 0xa8, 0xa7, 0x10, 0x0c, 0xc7, 0x09, 0x48, 0x2d, 0x70, 0xf5, 0xf6, 0xf4,
        +	0x74, 0xac, 0x68, 0x7f, 0xad, 0x40, 0x33, 0xd5, 0xaf, 0xd0, 0xd0, 0x6d, 0xa8, 0xd8, 0x41, 0x90,
        +	0xa8, 0xb6, 0x4e, 0xcb, 0x76, 0x10, 0x18, 0x8e, 0x8c, 0x2d, 0x0a, 0x6a, 0x9b, 0xc7, 0x96, 0x4f,
        +	0x01, 0x1c, 0x36, 0x71, 0x3d, 0x17, 0x85, 0x2e, 0xa2, 0xc1, 0xab, 0x8b, 0x42, 0xd3, 0x0c, 0x86,
        +	0x7c, 0x09, 0xe5, 0x28, 0xb6, 0x63, 0x91, 0x2b, 0x9b, 0xdb, 0xf7, 0x33, 0xe0, 0xbc, 0x08, 0x9d,
        +	0x11, 0x87, 0x51, 0x81, 0x26, 0x5f, 0xc1, 0x2d, 0xdf, 0x9b, 0x9e, 0x59, 0xf3, 0x88, 0x59, 0xee,
        +	0xc4, 0x0a, 0xd9, 0x0f, 0x73, 0x37, 0x64, 0x4e, 0x3e, 0xa7, 0xae, 0x73, 0xc8, 0x51, 0xc4, 0x8c,
        +	0x09, 0x95, 0x7c, 0xed, 0x6b, 0x28, 0xe3, 0x3a, 0x7c, 0xcf, 0xdf, 0x51, 0xc3, 0xd4, 0xad, 0xe1,
        +	0xa0, 0xff, 0x54, 0xe8, 0x80, 0xea, 0xdd, 0x9e, 0x85, 0x44, 0x55, 0xe1, 0xc1, 0xbe, 0xa7, 0xf7,
        +	0x75, 0x53, 0xef, 0xa9, 0x45, 0x9e, 0x3d, 0x74, 0x4a, 0x87, 0x54, 0x2d, 0x69, 0xff, 0x53, 0x80,
        +	0x15, 0x94, 0xe7, 0xd0, 0x8f, 0xe2, 0x89, 0xfb, 0x92, 0xec, 0x41, 0x43, 0x98, 0xdd, 0xa9, 0x2c,
        +	0xe8, 0xb9, 0x33, 0x68, 0x8b, 0x7b, 0x96, 0x68, 0x31, 0x90, 0x75, 0xb4, 0x9b, 0x3e, 0x27, 0x21,
        +	0x45, 0x41, 0xa7, 0xbf, 0x22, 0xa4, 0xbc, 0x05, 0x95, 0x67, 0x6c, 0xe2, 0x87, 0x22, 0x04, 0xd6,
        +	0x76, 0x4a, 0x71, 0x38, 0x67, 0x54, 0xd2, 0xda, 0x36, 0xc0, 0xf9, 0xfa, 0xe4, 0x01, 0xac, 0x26,
        +	0xc6, 0x66, 0xa1, 0x71, 0x89, 0x93, 0x5b, 0x49, 0x88, 0x83, 0x5c, 0x75, 0xa3, 0x5c, 0xab, 0xba,
        +	0xd1, 0xbe, 0x86, 0xd5, 0x64, 0x3f, 0xe2, 0xfc, 0x54, 0x21, 0x79, 0x01, 0x63, 0xca, 0x82, 0x8c,
        +	0xca, 0x45, 0x19, 0xb5, 0x9f, 0x41, 0x6d, 0xe4, 0xd9, 0x41, 0x74, 0xe2, 0xc7, 0xdc, 0x7a, 0xe2,
        +	0x48, 0xfa, 0xaa, 0x12, 0x47, 0x9a, 0x06, 0x15, 0x7e, 0x38, 0xf3, 0x88, 0xbb, 0xbf, 0x31, 0xe8,
        +	0xee, 0x99, 0xc6, 0xb7, 0xba, 0xfa, 0x06, 0x01, 0xa8, 0xc8, 0xe7, 0x82, 0xa6, 0x41, 0xd3, 0x90,
        +	0xed, 0xd8, 0x63, 0x66, 0x3b, 0x2c, 0xe4, 0x12, 0xfc, 0xe0, 0x47, 0x89, 0x04, 0x3f, 0xf8, 0x91,
        +	0xf6, 0x17, 0x05, 0x68, 0x98, 0xa1, 0xed, 0x45, 0xb6, 0x30, 0xf7, 0xcf, 0xa0, 0x72, 0x82, 0x58,
        +	0x74, 0xa3, 0xc6, 0x82, 0x7f, 0x66, 0x17, 0xa3, 0x12, 0x48, 0xee, 0x40, 0xe5, 0xc4, 0xf6, 0x9c,
        +	0xa9, 0xd0, 0x5a, 0x85, 0xca, 0x51, 0x92, 0x1b, 0x95, 0xf3, 0xdc, 0xb8, 0x05, 0x2b, 0x33, 0x3b,
        +	0x7c, 0x6e, 0x8d, 0x4f, 0x6c, 0xef, 0x98, 0x45, 0xf2, 0x60, 0xa4, 0x05, 0x36, 0x38, 0x6b, 0x4f,
        +	0x70, 0xb4, 0xbf, 0x5f, 0x81, 0xf2, 0x37, 0x73, 0x16, 0x9e, 0x65, 0x04, 0xfa, 0xe0, 0xba, 0x02,
        +	0xc9, 0x17, 0x17, 0x2e, 0x4b, 0xca, 0x6f, 0x2f, 0x26, 0x65, 0x22, 0x53, 0x84, 0xc8, 0x95, 0x22,
        +	0x0b, 0x7c, 0x9a, 0x09, 0x63, 0xeb, 0x57, 0xd8, 0xda, 0x79, 0x70, 0x7b, 0x08, 0x95, 0x89, 0x3b,
        +	0x8d, 0x51, 0x75, 0x8b, 0xd5, 0x08, 0xee, 0xa5, 0xf3, 0x08, 0xd9, 0x54, 0xc2, 0xc8, 0xbb, 0xb0,
        +	0x22, 0x2a, 0x59, 0xeb, 0x07, 0xce, 0xc6, 0x82, 0x95, 0xf7, 0xa6, 0x48, 0x13, 0xbb, 0xff, 0x18,
        +	0xca, 0x7e, 0xc8, 0x37, 0x5f, 0xc7, 0x25, 0xef, 0x5c, 0x58, 0x72, 0xc8, 0xb9, 0x54, 0x80, 0xc8,
        +	0x87, 0x50, 0x3a, 0x71, 0xbd, 0x18, 0xb3, 0x46, 0x73, 0xfb, 0xf6, 0x05, 0xf0, 0x63, 0xd7, 0x8b,
        +	0x29, 0x42, 0x78, 0x98, 0x1f, 0xfb, 0x73, 0x2f, 0x6e, 0xdd, 0xc5, 0x0c, 0x23, 0x06, 0xe4, 0x1e,
        +	0x54, 0xfc, 0xc9, 0x24, 0x62, 0x31, 0x76, 0x96, 0xe5, 0x9d, 0xc2, 0xa7, 0x54, 0x12, 0xf8, 0x84,
        +	0xa9, 0x3b, 0x73, 0x63, 0xec, 0x43, 0xca, 0x54, 0x0c, 0xc8, 0x2e, 0xac, 0x8d, 0xfd, 0x59, 0xe0,
        +	0x4e, 0x99, 0x63, 0x8d, 0xe7, 0x61, 0xe4, 0x87, 0xad, 0x77, 0x2e, 0x1c, 0xd3, 0x9e, 0x44, 0xec,
        +	0x21, 0x80, 0x36, 0xc7, 0xb9, 0x31, 0x31, 0x60, 0x83, 0x79, 0x8e, 0xb5, 0xb8, 0xce, 0xfd, 0xd7,
        +	0xad, 0xb3, 0xce, 0x3c, 0x27, 0x4f, 0x4a, 0xc4, 0xc1, 0x48, 0x68, 0x61, 0xcc, 0x68, 0x6d, 0x60,
        +	0x90, 0xb9, 0x77, 0x69, 0xac, 0x14, 0xe2, 0x64, 0xc2, 0xf7, 0x6f, 0xc0, 0x2d, 0x19, 0x22, 0xad,
        +	0x80, 0x85, 0x13, 0x36, 0x8e, 0xad, 0x60, 0x6a, 0x7b, 0x58, 0xca, 0xa5, 0xc6, 0x4a, 0x24, 0xe4,
        +	0x50, 0x20, 0x0e, 0xa7, 0xb6, 0x47, 0x34, 0xa8, 0x3f, 0x67, 0x67, 0x91, 0xc5, 0x23, 0x29, 0x76,
        +	0xae, 0x29, 0xba, 0xc6, 0xe9, 0x43, 0x6f, 0x7a, 0x46, 0x7e, 0x02, 0x8d, 0xf8, 0xdc, 0xdb, 0xb0,
        +	0x61, 0x6d, 0xe4, 0x4e, 0x35, 0xe3, 0x8b, 0x34, 0x0b, 0x25, 0xf7, 0xa1, 0x2a, 0x35, 0xd4, 0xba,
        +	0x97, 0x5d, 0x3b, 0xa1, 0xf2, 0xc4, 0x3c, 0xb1, 0xdd, 0xa9, 0x7f, 0xca, 0x42, 0x6b, 0x16, 0xb5,
        +	0xda, 0xe2, 0xb6, 0x24, 0x21, 0x1d, 0x44, 0xdc, 0x4f, 0xa3, 0x38, 0xf4, 0xbd, 0xe3, 0xd6, 0x26,
        +	0xde, 0x93, 0xc8, 0xd1, 0xc5, 0xe0, 0xf7, 0x2e, 0x66, 0xfe, 0x7c, 0xf0, 0xfb, 0x1c, 0xee, 0x60,
        +	0x65, 0x66, 0x3d, 0x3b, 0xb3, 0xf2, 0x68, 0x0d, 0xd1, 0x1b, 0xc8, 0xdd, 0x3d, 0x3b, 0xcc, 0x4e,
        +	0x6a, 0x43, 0xcd, 0x71, 0xa3, 0xd8, 0xf5, 0xc6, 0x71, 0xab, 0x85, 0xef, 0x4c, 0xc7, 0xe4, 0x33,
        +	0xb8, 0x3d, 0x73, 0x3d, 0x2b, 0xb2, 0x27, 0xcc, 0x8a, 0x5d, 0xee, 0x9b, 0x6c, 0xec, 0x7b, 0x4e,
        +	0xd4, 0x7a, 0x80, 0x82, 0x93, 0x99, 0xeb, 0x8d, 0xec, 0x09, 0x33, 0xdd, 0x19, 0x1b, 0x09, 0x0e,
        +	0xf9, 0x08, 0xd6, 0x11, 0x1e, 0xb2, 0x60, 0xea, 0x8e, 0x6d, 0xf1, 0xfa, 0x1f, 0xe1, 0xeb, 0xd7,
        +	0x38, 0x83, 0x0a, 0x3a, 0xbe, 0xfa, 0x63, 0x68, 0x06, 0x2c, 0x8c, 0xdc, 0x28, 0xb6, 0xa4, 0x45,
        +	0xbf, 0x97, 0xd5, 0xda, 0xaa, 0x64, 0x0e, 0x91, 0xd7, 0xfe, 0xcf, 0x02, 0x54, 0x84, 0x73, 0x92,
        +	0x4f, 0x41, 0xf1, 0x03, 0xbc, 0x06, 0x69, 0x6e, 0x6f, 0x5e, 0xe2, 0xc1, 0x9d, 0x61, 0xc0, 0xeb,
        +	0x5e, 0x3f, 0xa4, 0x8a, 0x1f, 0xdc, 0xb8, 0x28, 0xd4, 0xfe, 0x10, 0x6a, 0xc9, 0x02, 0xbc, 0xbc,
        +	0xe8, 0xeb, 0xa3, 0x91, 0x65, 0x3e, 0xee, 0x0e, 0xd4, 0x02, 0xb9, 0x03, 0x24, 0x1d, 0x5a, 0x43,
        +	0x6a, 0xe9, 0xdf, 0x1c, 0x75, 0xfb, 0xaa, 0x82, 0x5d, 0x1a, 0xd5, 0xbb, 0xa6, 0x4e, 0x05, 0xb2,
        +	0x48, 0xee, 0xc1, 0xed, 0x2c, 0xe5, 0x1c, 0x5c, 0xc2, 0x14, 0x8c, 0x8f, 0x65, 0x52, 0x01, 0xc5,
        +	0x18, 0xa8, 0x15, 0x9e, 0x16, 0xf4, 0xef, 0x8d, 0x91, 0x39, 0x52, 0xab, 0xed, 0xbf, 0x29, 0x40,
        +	0x19, 0xc3, 0x06, 0x3f, 0x9f, 0x54, 0x72, 0x71, 0x5d, 0x73, 0x5e, 0xb9, 0x1a, 0xd9, 0x92, 0xaa,
        +	0x81, 0x01, 0x65, 0x73, 0x79, 0xf4, 0xf9, 0xb5, 0xd6, 0x53, 0x3f, 0x85, 0x12, 0x8f, 0x52, 0xbc,
        +	0x43, 0x1c, 0xd2, 0x9e, 0x4e, 0xad, 0x47, 0x06, 0x1d, 0xf1, 0x2a, 0x97, 0x40, 0xb3, 0x3b, 0xd8,
        +	0xd3, 0x47, 0xe6, 0x30, 0xa1, 0xa1, 0x56, 0x1e, 0x19, 0x7d, 0x33, 0x45, 0x15, 0xb5, 0x9f, 0xd7,
        +	0x60, 0x35, 0x89, 0x09, 0x22, 0x82, 0x3e, 0x82, 0x46, 0x10, 0xba, 0x33, 0x3b, 0x3c, 0x8b, 0xc6,
        +	0xb6, 0x87, 0x49, 0x01, 0xb6, 0x7f, 0xb4, 0x24, 0xaa, 0x88, 0x1d, 0x1d, 0x0a, 0xec, 0x68, 0x6c,
        +	0x7b, 0x34, 0x3b, 0x91, 0xf4, 0x61, 0x75, 0xc6, 0xc2, 0x63, 0xf6, 0x7b, 0xbe, 0xeb, 0xe1, 0x4a,
        +	0x55, 0x8c, 0xc8, 0xef, 0x5f, 0xba, 0xd2, 0x01, 0x47, 0xff, 0x8e, 0xef, 0x7a, 0xb8, 0x56, 0x7e,
        +	0x32, 0xf9, 0x04, 0xea, 0xa2, 0x12, 0x72, 0xd8, 0x04, 0x63, 0xc5, 0xb2, 0xda, 0x4f, 0xd4, 0xe8,
        +	0x3d, 0x36, 0xc9, 0xc4, 0x65, 0xb8, 0x34, 0x2e, 0x37, 0xb2, 0x71, 0xf9, 0xcd, 0x6c, 0x2c, 0x5a,
        +	0x11, 0x55, 0x78, 0x1a, 0x84, 0x2e, 0x38, 0x7c, 0x6b, 0x89, 0xc3, 0x77, 0x60, 0x23, 0xf1, 0x55,
        +	0xcb, 0xf5, 0x26, 0xee, 0x4b, 0x2b, 0x72, 0x5f, 0x89, 0xd8, 0x53, 0xa6, 0xeb, 0x09, 0xcb, 0xe0,
        +	0x9c, 0x91, 0xfb, 0x8a, 0x11, 0x23, 0xe9, 0xe0, 0x64, 0x0e, 0x5c, 0xc5, 0xab, 0xc9, 0xf7, 0x2e,
        +	0x55, 0x8f, 0x68, 0xbe, 0x64, 0x46, 0xcc, 0x4d, 0x6d, 0xff, 0x52, 0x81, 0x46, 0xe6, 0x1c, 0x78,
        +	0xf6, 0x16, 0xca, 0x42, 0x61, 0xc5, 0x55, 0x94, 0x50, 0x1f, 0x4a, 0xfa, 0x26, 0xd4, 0xa3, 0xd8,
        +	0x0e, 0x63, 0x8b, 0x17, 0x57, 0xb2, 0xdd, 0x45, 0xc2, 0x13, 0x76, 0x46, 0x3e, 0x80, 0x35, 0xc1,
        +	0x74, 0xbd, 0xf1, 0x74, 0x1e, 0xb9, 0xa7, 0xa2, 0x99, 0xaf, 0xd1, 0x26, 0x92, 0x8d, 0x84, 0x4a,
        +	0xee, 0x42, 0x95, 0x67, 0x21, 0xbe, 0x86, 0x68, 0xfa, 0x2a, 0xcc, 0x73, 0xf8, 0x0a, 0x0f, 0x60,
        +	0x95, 0x33, 0xce, 0xe7, 0x57, 0xc4, 0x2d, 0x33, 0xf3, 0x9c, 0xf3, 0xd9, 0x1d, 0xd8, 0x10, 0xaf,
        +	0x09, 0x44, 0xf1, 0x2a, 0x2b, 0xdc, 0x3b, 0xa8, 0xd8, 0x75, 0x64, 0xc9, 0xb2, 0x56, 0x14, 0x9c,
        +	0x1f, 0x01, 0xcf, 0x5e, 0x0b, 0xe8, 0xbb, 0x22, 0x94, 0x31, 0xcf, 0xc9, 0x61, 0x77, 0xe1, 0x1d,
        +	0x8e, 0x9d, 0x7b, 0x76, 0x10, 0x4c, 0x5d, 0xe6, 0x58, 0x53, 0xff, 0x18, 0x43, 0x66, 0x14, 0xdb,
        +	0xb3, 0xc0, 0x9a, 0x47, 0xad, 0x0d, 0x0c, 0x99, 0x6d, 0xe6, 0x39, 0x47, 0x09, 0xa8, 0xef, 0x1f,
        +	0x9b, 0x09, 0xe4, 0x28, 0x6a, 0xff, 0x3e, 0xac, 0xe6, 0xec, 0x71, 0x41, 0xa7, 0x35, 0x74, 0xfe,
        +	0x8c, 0x4e, 0xdf, 0x85, 0x95, 0x20, 0x64, 0xe7, 0xa2, 0xd5, 0x51, 0xb4, 0x86, 0xa0, 0x09, 0xb1,
        +	0xb6, 0x60, 0x05, 0x79, 0x96, 0x20, 0xe6, 0xf3, 0x63, 0x03, 0x59, 0x87, 0xc8, 0x69, 0xbf, 0x80,
        +	0x95, 0xec, 0x69, 0x93, 0x77, 0x33, 0x69, 0xa1, 0x99, 0xcb, 0x93, 0x69, 0x76, 0x48, 0x2a, 0xb2,
        +	0xf5, 0x4b, 0x2a, 0x32, 0x72, 0x9d, 0x8a, 0x4c, 0xfb, 0x2f, 0xd9, 0x9c, 0x65, 0x2a, 0x84, 0x9f,
        +	0x41, 0x2d, 0x90, 0xf5, 0x38, 0x5a, 0x52, 0xfe, 0x12, 0x3e, 0x0f, 0xee, 0x24, 0x95, 0x3b, 0x4d,
        +	0xe7, 0xb4, 0xff, 0x56, 0x81, 0x5a, 0x5a, 0xd0, 0xe7, 0x2c, 0xef, 0xcd, 0x05, 0xcb, 0x3b, 0x90,
        +	0x1a, 0x16, 0x0a, 0x7c, 0x1b, 0xa3, 0xc5, 0x27, 0xaf, 0x7f, 0xd7, 0xc5, 0xb6, 0xe7, 0x34, 0xdb,
        +	0xf6, 0x6c, 0xbe, 0xae, 0xed, 0xf9, 0xe4, 0xa2, 0xc1, 0xbf, 0x95, 0xe9, 0x2d, 0x16, 0xcc, 0xbe,
        +	0xfd, 0x7d, 0xae, 0x0f, 0xca, 0x26, 0x84, 0x77, 0xc4, 0x7e, 0xd2, 0x84, 0x90, 0xb6, 0x3f, 0xf7,
        +	0xaf, 0xd7, 0xfe, 0x6c, 0x43, 0x45, 0xea, 0xfc, 0x0e, 0x54, 0x64, 0x4d, 0x27, 0x1b, 0x04, 0x31,
        +	0x3a, 0x6f, 0x10, 0x0a, 0xb2, 0x4e, 0xd7, 0x7e, 0xae, 0x40, 0x59, 0x0f, 0x43, 0x3f, 0xd4, 0xfe,
        +	0x48, 0x81, 0x3a, 0x3e, 0xed, 0xf9, 0x0e, 0xe3, 0xd9, 0x60, 0xb7, 0xdb, 0xb3, 0xa8, 0xfe, 0xcd,
        +	0x91, 0x8e, 0xd9, 0xa0, 0x0d, 0x77, 0xf6, 0x86, 0x83, 0xbd, 0x23, 0x4a, 0xf5, 0x81, 0x69, 0x99,
        +	0xb4, 0x3b, 0x18, 0xf1, 0xb6, 0x67, 0x38, 0x50, 0x15, 0x9e, 0x29, 0x8c, 0x81, 0xa9, 0xd3, 0x41,
        +	0xb7, 0x6f, 0x89, 0x56, 0xb4, 0x88, 0x77, 0xb3, 0xba, 0xde, 0xb3, 0xf0, 0xd6, 0x51, 0x2d, 0xf1,
        +	0x96, 0xd5, 0x34, 0x0e, 0xf4, 0xe1, 0x91, 0xa9, 0x96, 0xc9, 0x6d, 0x58, 0x3f, 0xd4, 0xe9, 0x81,
        +	0x31, 0x1a, 0x19, 0xc3, 0x81, 0xd5, 0xd3, 0x07, 0x86, 0xde, 0x53, 0x2b, 0x7c, 0x9d, 0x5d, 0x63,
        +	0xdf, 0xec, 0xee, 0xf6, 0x75, 0xb9, 0x4e, 0x95, 0x6c, 0xc2, 0x5b, 0x7b, 0xc3, 0x83, 0x03, 0xc3,
        +	0x34, 0xf5, 0x9e, 0xb5, 0x7b, 0x64, 0x5a, 0x23, 0xd3, 0xe8, 0xf7, 0xad, 0xee, 0xe1, 0x61, 0xff,
        +	0x29, 0x4f, 0x60, 0x35, 0x72, 0x17, 0x36, 0xf6, 0xba, 0x87, 0xdd, 0x5d, 0xa3, 0x6f, 0x98, 0x4f,
        +	0xad, 0x9e, 0x31, 0xe2, 0xf3, 0x7b, 0x6a, 0x9d, 0x27, 0x6c, 0x93, 0x3e, 0xb5, 0xba, 0x7d, 0x14,
        +	0xcd, 0xd4, 0xad, 0xdd, 0xee, 0xde, 0x13, 0x7d, 0xd0, 0x53, 0x81, 0x0b, 0x30, 0xea, 0x3e, 0xd2,
        +	0x2d, 0x2e, 0x92, 0x65, 0x0e, 0x87, 0xd6, 0xb0, 0xdf, 0x53, 0x1b, 0xda, 0xbf, 0x14, 0xa1, 0xb4,
        +	0xe7, 0x47, 0x31, 0xf7, 0x46, 0xe1, 0xac, 0x2f, 0x42, 0x37, 0x66, 0xa2, 0x7f, 0x2b, 0x53, 0xd1,
        +	0x4b, 0x7f, 0x87, 0x24, 0x1e, 0x50, 0x32, 0x10, 0xeb, 0xd9, 0x19, 0xc7, 0x29, 0x88, 0x5b, 0x3b,
        +	0xc7, 0xed, 0x72, 0xb2, 0x88, 0x68, 0x78, 0x85, 0x23, 0xd7, 0x2b, 0x22, 0x4e, 0x06, 0x61, 0xb9,
        +	0xe0, 0xc7, 0x40, 0xb2, 0x20, 0xb9, 0x62, 0x09, 0x91, 0x6a, 0x06, 0x29, 0x96, 0xdc, 0x01, 0x18,
        +	0xfb, 0xb3, 0x99, 0x1b, 0x8f, 0xfd, 0x28, 0x96, 0x5f, 0xc8, 0xda, 0x39, 0x63, 0x8f, 0x62, 0x6e,
        +	0xf1, 0x33, 0x37, 0xe6, 0x8f, 0x34, 0x83, 0x26, 0x3b, 0x70, 0xcf, 0x0e, 0x82, 0xd0, 0x7f, 0xe9,
        +	0xce, 0xec, 0x98, 0x59, 0xdc, 0x73, 0xed, 0x63, 0x66, 0x39, 0x6c, 0x1a, 0xdb, 0xd8, 0x13, 0x95,
        +	0xe9, 0xdd, 0x0c, 0x60, 0x24, 0xf8, 0x3d, 0xce, 0xe6, 0x71, 0xd7, 0x75, 0xac, 0x88, 0xfd, 0x30,
        +	0xe7, 0x1e, 0x60, 0xcd, 0x03, 0xc7, 0xe6, 0x62, 0xd6, 0x45, 0x96, 0x72, 0x9d, 0x91, 0xe4, 0x1c,
        +	0x09, 0x46, 0xfb, 0x15, 0xc0, 0xb9, 0x14, 0x64, 0x1b, 0x6e, 0xf3, 0x3a, 0x9e, 0x45, 0x31, 0x73,
        +	0x2c, 0xb9, 0xdb, 0x60, 0x1e, 0x47, 0x18, 0xe2, 0xcb, 0x74, 0x23, 0x65, 0xca, 0x9b, 0xc2, 0x79,
        +	0x1c, 0x91, 0x9f, 0x40, 0xeb, 0xc2, 0x1c, 0x87, 0x4d, 0x19, 0x7f, 0x6d, 0x15, 0xa7, 0xdd, 0x59,
        +	0x98, 0xd6, 0x13, 0x5c, 0xed, 0x4f, 0x14, 0x80, 0x7d, 0x16, 0x53, 0xc1, 0xcd, 0x34, 0xb6, 0x95,
        +	0xeb, 0x36, 0xb6, 0xef, 0x27, 0x17, 0x08, 0xc5, 0xab, 0x63, 0xc0, 0x42, 0x97, 0xa1, 0xdc, 0xa4,
        +	0xcb, 0xc8, 0x35, 0x11, 0xc5, 0x2b, 0x9a, 0x88, 0x52, 0xae, 0x89, 0xf8, 0x18, 0x9a, 0xf6, 0x74,
        +	0xea, 0xbf, 0xe0, 0x05, 0x0d, 0x0b, 0x43, 0xe6, 0xa0, 0x11, 0x9c, 0xd7, 0xdb, 0xc8, 0xec, 0x49,
        +	0x9e, 0xf6, 0xe7, 0x0a, 0x34, 0x50, 0x15, 0x51, 0xe0, 0x7b, 0x11, 0x23, 0x5f, 0x42, 0x45, 0x5e,
        +	0x44, 0x8b, 0x8b, 0xfc, 0xb7, 0x33, 0xb2, 0x66, 0x70, 0xb2, 0x68, 0xa0, 0x12, 0xcc, 0x33, 0x42,
        +	0xe6, 0x75, 0x97, 0x2b, 0x25, 0x45, 0x91, 0xfb, 0x50, 0x73, 0x3d, 0x4b, 0xb4, 0xd4, 0x95, 0x4c,
        +	0x58, 0xac, 0xba, 0x1e, 0xd6, 0xb2, 0xed, 0x57, 0x50, 0x11, 0x2f, 0x21, 0x9d, 0x54, 0xa6, 0x8b,
        +	0xfa, 0xcb, 0xdc, 0x1c, 0xa7, 0xc2, 0xc8, 0xc3, 0x29, 0xbd, 0x2e, 0x40, 0xb7, 0xa0, 0x7a, 0xca,
        +	0x9b, 0x0f, 0xbc, 0xf4, 0xe3, 0xea, 0x4d, 0x86, 0xda, 0x1f, 0x97, 0x00, 0x0e, 0xe7, 0x4b, 0x0c,
        +	0xa4, 0x71, 0x5d, 0x03, 0xe9, 0xe4, 0xf4, 0xf8, 0x7a, 0x99, 0x7f, 0x75, 0x43, 0x59, 0xd2, 0x69,
        +	0x17, 0x6f, 0xda, 0x69, 0xdf, 0x87, 0x6a, 0x1c, 0xce, 0xb9, 0xa3, 0x08, 0x63, 0x4a, 0x5b, 0x5a,
        +	0x49, 0x25, 0x6f, 0x42, 0x79, 0xe2, 0x87, 0x63, 0x86, 0x8e, 0x95, 0xb2, 0x05, 0xed, 0xc2, 0x65,
        +	0x52, 0xed, 0xb2, 0xcb, 0x24, 0xde, 0xa0, 0x45, 0xf2, 0x1e, 0x0d, 0x0b, 0x99, 0x7c, 0x83, 0x96,
        +	0x5c, 0xb1, 0xd1, 0x14, 0x44, 0xbe, 0x81, 0xa6, 0x3d, 0x8f, 0x7d, 0xcb, 0xe5, 0x15, 0xda, 0xd4,
        +	0x1d, 0x9f, 0x61, 0xd9, 0xdd, 0xcc, 0x7f, 0xaf, 0x4f, 0x0f, 0xaa, 0xd3, 0x9d, 0xc7, 0xbe, 0xe1,
        +	0x1c, 0x22, 0x72, 0xa7, 0x2a, 0x93, 0x12, 0x5d, 0xb1, 0x33, 0x64, 0xed, 0xc7, 0xb0, 0x92, 0x85,
        +	0xf1, 0x04, 0x24, 0x81, 0xea, 0x1b, 0x3c, 0x3b, 0x8d, 0x78, 0x6a, 0x1b, 0x98, 0x46, 0xb7, 0xaf,
        +	0x16, 0xb4, 0x18, 0x1a, 0xb8, 0xbc, 0xf4, 0x8e, 0xeb, 0xba, 0xfd, 0x03, 0x28, 0x61, 0xf8, 0x55,
        +	0x2e, 0x7c, 0x0f, 0xc1, 0x98, 0x8b, 0xcc, 0xbc, 0xf9, 0x15, 0xb3, 0xe6, 0xf7, 0xdf, 0x05, 0x58,
        +	0x31, 0xfd, 0xf9, 0xf8, 0xe4, 0xa2, 0x01, 0xc2, 0xaf, 0x3b, 0x42, 0x2d, 0x31, 0x1f, 0xe5, 0xa6,
        +	0xe6, 0x93, 0x5a, 0x47, 0x71, 0x89, 0x75, 0xdc, 0xf4, 0xcc, 0xb5, 0x2f, 0x60, 0x55, 0x6e, 0x5e,
        +	0x6a, 0x3d, 0xd1, 0x66, 0xe1, 0x0a, 0x6d, 0x6a, 0xbf, 0x50, 0x60, 0x55, 0xc4, 0xf7, 0xff, 0xbb,
        +	0xd2, 0x2a, 0x37, 0x0c, 0xeb, 0xe5, 0x1b, 0x5d, 0x1e, 0xfd, 0xbf, 0xf4, 0x34, 0x6d, 0x08, 0xcd,
        +	0x44, 0x7d, 0x37, 0x50, 0xfb, 0x15, 0x46, 0xfc, 0x8b, 0x02, 0x34, 0x06, 0xec, 0xe5, 0x92, 0x20,
        +	0x5a, 0xbe, 0xee, 0x71, 0x7c, 0x98, 0x2b, 0x57, 0x1b, 0xdb, 0xeb, 0x59, 0x19, 0xc4, 0xd5, 0x63,
        +	0x52, 0xc1, 0xa6, 0xb7, 0xa8, 0xca, 0xf2, 0x5b, 0xd4, 0xd2, 0x62, 0xb7, 0x9e, 0xb9, 0xc5, 0x2b,
        +	0x2e, 0xbb, 0xc5, 0xd3, 0xfe, 0xad, 0x08, 0x0d, 0x6c, 0x90, 0x29, 0x8b, 0xe6, 0xd3, 0x38, 0x27,
        +	0x4c, 0xe1, 0x6a, 0x61, 0x3a, 0x50, 0x09, 0x71, 0x92, 0x74, 0xa5, 0x4b, 0x83, 0xbf, 0x40, 0x61,
        +	0x6b, 0xfc, 0xdc, 0x0d, 0x02, 0xe6, 0x58, 0x82, 0x92, 0x14, 0x30, 0x4d, 0x49, 0x16, 0x22, 0x44,
        +	0xbc, 0xfc, 0x9c, 0xf9, 0x21, 0x4b, 0x51, 0x45, 0xbc, 0x4f, 0x68, 0x70, 0x5a, 0x02, 0xc9, 0xdd,
        +	0x37, 0x88, 0xca, 0xe0, 0xfc, 0xbe, 0x21, 0xed, 0x35, 0x91, 0x5b, 0x47, 0xae, 0xe8, 0x35, 0x91,
        +	0xcd, 0xbb, 0xa8, 0x99, 0x3d, 0x9d, 0x5a, 0x7e, 0x10, 0xa1, 0xd3, 0xd4, 0x68, 0x0d, 0x09, 0xc3,
        +	0x20, 0x22, 0x5f, 0x43, 0x7a, 0x5d, 0x2c, 0x6f, 0xc9, 0xc5, 0x39, 0xb6, 0x2e, 0xbb, 0x58, 0xa0,
        +	0xab, 0xe3, 0xdc, 0xfd, 0xcf, 0x92, 0x1b, 0xea, 0xca, 0x4d, 0x6f, 0xa8, 0x1f, 0x42, 0x59, 0xc4,
        +	0xa8, 0xda, 0xeb, 0x62, 0x94, 0xc0, 0x65, 0xed, 0xb3, 0x91, 0xb7, 0xcf, 0x5f, 0x16, 0x80, 0x74,
        +	0xa7, 0x53, 0x7f, 0x6c, 0xc7, 0xcc, 0x70, 0xa2, 0x8b, 0x66, 0x7a, 0xed, 0xcf, 0x2e, 0x9f, 0x41,
        +	0x7d, 0xe6, 0x3b, 0x6c, 0x6a, 0x25, 0xdf, 0x94, 0x2e, 0xad, 0x7e, 0x10, 0xc6, 0x5b, 0x52, 0x02,
        +	0x25, 0xbc, 0xc4, 0x51, 0xb0, 0xee, 0xc0, 0x67, 0xde, 0x84, 0xcd, 0xec, 0x97, 0xb2, 0x14, 0xe1,
        +	0x8f, 0xa4, 0x03, 0xd5, 0x90, 0x45, 0x2c, 0x3c, 0x65, 0x57, 0x16, 0x55, 0x09, 0x48, 0x7b, 0x06,
        +	0x1b, 0xb9, 0x1d, 0x49, 0x47, 0xbe, 0x85, 0x5f, 0x2b, 0xc3, 0x58, 0x7e, 0xb4, 0x12, 0x03, 0xfe,
        +	0x3a, 0xe6, 0x25, 0x9f, 0x41, 0xf9, 0x63, 0xea, 0xf0, 0xc5, 0xab, 0xe2, 0xec, 0x1e, 0xa8, 0x59,
        +	0x4d, 0xbb, 0x63, 0x0c, 0x36, 0xf2, 0x54, 0x0a, 0xd7, 0x3b, 0x15, 0xed, 0xef, 0x0a, 0xb0, 0xde,
        +	0x75, 0x1c, 0xf1, 0x77, 0xc3, 0x25, 0xaa, 0x2f, 0x5e, 0x57, 0xf5, 0x0b, 0x81, 0x58, 0x84, 0x89,
        +	0x6b, 0x05, 0xe2, 0x0f, 0xa1, 0x92, 0xd6, 0x5a, 0xc5, 0x05, 0x77, 0x16, 0x72, 0x51, 0x09, 0xd0,
        +	0x6e, 0x01, 0xc9, 0x0a, 0x2b, 0xb4, 0xaa, 0xfd, 0x69, 0x11, 0xee, 0xee, 0xb2, 0x63, 0xd7, 0xcb,
        +	0xbe, 0xe2, 0x57, 0xdf, 0xc9, 0xc5, 0x4f, 0x65, 0x9f, 0xc1, 0xba, 0x28, 0xe4, 0x93, 0x7f, 0x62,
        +	0x59, 0xec, 0x58, 0x7e, 0x9d, 0x94, 0xb1, 0x6a, 0x0d, 0xf9, 0x07, 0x92, 0xad, 0xe3, 0x7f, 0xc5,
        +	0x1c, 0x3b, 0xb6, 0x9f, 0xd9, 0x11, 0xb3, 0x5c, 0x47, 0xfe, 0x59, 0x06, 0x12, 0x92, 0xe1, 0x90,
        +	0x21, 0x94, 0xb8, 0x0d, 0xa2, 0xeb, 0x36, 0xb7, 0xb7, 0x33, 0x62, 0x5d, 0xb2, 0x95, 0xac, 0x02,
        +	0x0f, 0x7c, 0x87, 0xed, 0x54, 0x8f, 0x06, 0x4f, 0x06, 0xc3, 0xef, 0x06, 0x14, 0x17, 0x22, 0x06,
        +	0xdc, 0x0a, 0x42, 0x76, 0xea, 0xfa, 0xf3, 0xc8, 0xca, 0x9e, 0x44, 0xf5, 0xca, 0x94, 0xb8, 0x91,
        +	0xcc, 0xc9, 0x10, 0xb5, 0x9f, 0xc2, 0xda, 0xc2, 0xcb, 0x78, 0x6d, 0x26, 0x5f, 0xa7, 0xbe, 0x41,
        +	0x56, 0xa1, 0x8e, 0x1f, 0xbb, 0x97, 0x7f, 0xfb, 0xd6, 0xfe, 0xb5, 0x80, 0x57, 0x4c, 0x33, 0x37,
        +	0xbe, 0x59, 0x06, 0xfb, 0xcd, 0x7c, 0x06, 0x83, 0xed, 0x77, 0xf3, 0xe6, 0x9b, 0x59, 0xb0, 0xf3,
        +	0xad, 0x00, 0xa6, 0x41, 0xa4, 0x6d, 0x43, 0x55, 0xd2, 0xc8, 0x6f, 0xc1, 0x5a, 0xe8, 0xfb, 0x71,
        +	0xd2, 0x89, 0x8a, 0x0e, 0xe4, 0xf2, 0x3f, 0xdb, 0xac, 0x72, 0xb0, 0x48, 0x06, 0x4f, 0xf2, 0xbd,
        +	0x48, 0x59, 0xfc, 0x0d, 0x44, 0x0e, 0x77, 0x1b, 0xbf, 0x5b, 0x4f, 0xff, 0xb7, 0xfb, 0xbf, 0x01,
        +	0x00, 0x00, 0xff, 0xff, 0x35, 0x9f, 0x30, 0x98, 0xf2, 0x2b, 0x00, 0x00,
         }
        diff --git a/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto b/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto
        old mode 100755
        new mode 100644
        index e76f126ff..497b4d9a9
        --- a/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto
        +++ b/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto
        @@ -529,6 +529,16 @@ message BeginTransactionRequest {
         
           required string app = 1;
           optional bool allow_multiple_eg = 2 [default = false];
        +  optional string database_id = 4;
        +
        +  enum TransactionMode {
        +    UNKNOWN = 0;
        +    READ_ONLY = 1;
        +    READ_WRITE = 2;
        +  }
        +  optional TransactionMode mode = 5 [default = UNKNOWN];
        +
        +  optional Transaction previous_transaction = 7;
         }
         
         message CommitResponse {
        diff --git a/vendor/google.golang.org/appengine/internal/identity.go b/vendor/google.golang.org/appengine/internal/identity.go
        index d538701ab..9b4134e42 100644
        --- a/vendor/google.golang.org/appengine/internal/identity.go
        +++ b/vendor/google.golang.org/appengine/internal/identity.go
        @@ -4,11 +4,52 @@
         
         package internal
         
        -import netcontext "golang.org/x/net/context"
        +import (
        +	"os"
         
        -// These functions are implementations of the wrapper functions
        -// in ../appengine/identity.go. See that file for commentary.
        +	netcontext "golang.org/x/net/context"
        +)
         
        +var (
        +	// This is set to true in identity_classic.go, which is behind the appengine build tag.
        +	// The appengine build tag is set for the first generation runtimes (<= Go 1.9) but not
        +	// the second generation runtimes (>= Go 1.11), so this indicates whether we're on a
        +	// first-gen runtime. See IsStandard below for the second-gen check.
        +	appengineStandard bool
        +
        +	// This is set to true in identity_flex.go, which is behind the appenginevm build tag.
        +	appengineFlex bool
        +)
        +
        +// AppID is the implementation of the wrapper function of the same name in
        +// ../identity.go. See that file for commentary.
         func AppID(c netcontext.Context) string {
         	return appID(FullyQualifiedAppID(c))
         }
        +
        +// IsStandard is the implementation of the wrapper function of the same name in
        +// ../appengine.go. See that file for commentary.
        +func IsStandard() bool {
        +	// appengineStandard will be true for first-gen runtimes (<= Go 1.9) but not
        +	// second-gen (>= Go 1.11).
        +	return appengineStandard || IsSecondGen()
        +}
        +
        +// IsStandard is the implementation of the wrapper function of the same name in
        +// ../appengine.go. See that file for commentary.
        +func IsSecondGen() bool {
        +	// Second-gen runtimes set $GAE_ENV so we use that to check if we're on a second-gen runtime.
        +	return os.Getenv("GAE_ENV") == "standard"
        +}
        +
        +// IsFlex is the implementation of the wrapper function of the same name in
        +// ../appengine.go. See that file for commentary.
        +func IsFlex() bool {
        +	return appengineFlex
        +}
        +
        +// IsAppEngine is the implementation of the wrapper function of the same name in
        +// ../appengine.go. See that file for commentary.
        +func IsAppEngine() bool {
        +	return IsStandard() || IsFlex()
        +}
        diff --git a/vendor/google.golang.org/appengine/internal/identity_classic.go b/vendor/google.golang.org/appengine/internal/identity_classic.go
        index e6b9227c5..4e979f45e 100644
        --- a/vendor/google.golang.org/appengine/internal/identity_classic.go
        +++ b/vendor/google.golang.org/appengine/internal/identity_classic.go
        @@ -12,16 +12,50 @@ import (
         	netcontext "golang.org/x/net/context"
         )
         
        +func init() {
        +	appengineStandard = true
        +}
        +
         func DefaultVersionHostname(ctx netcontext.Context) string {
        -	return appengine.DefaultVersionHostname(fromContext(ctx))
        +	c := fromContext(ctx)
        +	if c == nil {
        +		panic(errNotAppEngineContext)
        +	}
        +	return appengine.DefaultVersionHostname(c)
        +}
        +
        +func Datacenter(_ netcontext.Context) string { return appengine.Datacenter() }
        +func ServerSoftware() string                 { return appengine.ServerSoftware() }
        +func InstanceID() string                     { return appengine.InstanceID() }
        +func IsDevAppServer() bool                   { return appengine.IsDevAppServer() }
        +
        +func RequestID(ctx netcontext.Context) string {
        +	c := fromContext(ctx)
        +	if c == nil {
        +		panic(errNotAppEngineContext)
        +	}
        +	return appengine.RequestID(c)
         }
         
        -func RequestID(ctx netcontext.Context) string  { return appengine.RequestID(fromContext(ctx)) }
        -func Datacenter(_ netcontext.Context) string   { return appengine.Datacenter() }
        -func ServerSoftware() string                   { return appengine.ServerSoftware() }
        -func ModuleName(ctx netcontext.Context) string { return appengine.ModuleName(fromContext(ctx)) }
        -func VersionID(ctx netcontext.Context) string  { return appengine.VersionID(fromContext(ctx)) }
        -func InstanceID() string                       { return appengine.InstanceID() }
        -func IsDevAppServer() bool                     { return appengine.IsDevAppServer() }
        +func ModuleName(ctx netcontext.Context) string {
        +	c := fromContext(ctx)
        +	if c == nil {
        +		panic(errNotAppEngineContext)
        +	}
        +	return appengine.ModuleName(c)
        +}
        +func VersionID(ctx netcontext.Context) string {
        +	c := fromContext(ctx)
        +	if c == nil {
        +		panic(errNotAppEngineContext)
        +	}
        +	return appengine.VersionID(c)
        +}
         
        -func fullyQualifiedAppID(ctx netcontext.Context) string { return fromContext(ctx).FullyQualifiedAppID() }
        +func fullyQualifiedAppID(ctx netcontext.Context) string {
        +	c := fromContext(ctx)
        +	if c == nil {
        +		panic(errNotAppEngineContext)
        +	}
        +	return c.FullyQualifiedAppID()
        +}
        diff --git a/vendor/google.golang.org/appengine/internal/identity_flex.go b/vendor/google.golang.org/appengine/internal/identity_flex.go
        new file mode 100644
        index 000000000..d5e2e7b5e
        --- /dev/null
        +++ b/vendor/google.golang.org/appengine/internal/identity_flex.go
        @@ -0,0 +1,11 @@
        +// Copyright 2018 Google LLC. All rights reserved.
        +// Use of this source code is governed by the Apache 2.0
        +// license that can be found in the LICENSE file.
        +
        +// +build appenginevm
        +
        +package internal
        +
        +func init() {
        +	appengineFlex = true
        +}
        diff --git a/vendor/google.golang.org/appengine/internal/identity_vm.go b/vendor/google.golang.org/appengine/internal/identity_vm.go
        index ebe68b785..5d8067263 100644
        --- a/vendor/google.golang.org/appengine/internal/identity_vm.go
        +++ b/vendor/google.golang.org/appengine/internal/identity_vm.go
        @@ -7,8 +7,10 @@
         package internal
         
         import (
        +	"log"
         	"net/http"
         	"os"
        +	"strings"
         
         	netcontext "golang.org/x/net/context"
         )
        @@ -23,7 +25,11 @@ const (
         )
         
         func ctxHeaders(ctx netcontext.Context) http.Header {
        -	return fromContext(ctx).Request().Header
        +	c := fromContext(ctx)
        +	if c == nil {
        +		return nil
        +	}
        +	return c.Request().Header
         }
         
         func DefaultVersionHostname(ctx netcontext.Context) string {
        @@ -35,7 +41,21 @@ func RequestID(ctx netcontext.Context) string {
         }
         
         func Datacenter(ctx netcontext.Context) string {
        -	return ctxHeaders(ctx).Get(hDatacenter)
        +	if dc := ctxHeaders(ctx).Get(hDatacenter); dc != "" {
        +		return dc
        +	}
        +	// If the header isn't set, read zone from the metadata service.
        +	// It has the format projects/[NUMERIC_PROJECT_ID]/zones/[ZONE]
        +	zone, err := getMetadata("instance/zone")
        +	if err != nil {
        +		log.Printf("Datacenter: %v", err)
        +		return ""
        +	}
        +	parts := strings.Split(string(zone), "/")
        +	if len(parts) == 0 {
        +		return ""
        +	}
        +	return parts[len(parts)-1]
         }
         
         func ServerSoftware() string {
        @@ -43,6 +63,9 @@ func ServerSoftware() string {
         	if s := os.Getenv("SERVER_SOFTWARE"); s != "" {
         		return s
         	}
        +	if s := os.Getenv("GAE_ENV"); s != "" {
        +		return s
        +	}
         	return "Google App Engine/1.x.x"
         }
         
        @@ -52,6 +75,9 @@ func ModuleName(_ netcontext.Context) string {
         	if s := os.Getenv("GAE_MODULE_NAME"); s != "" {
         		return s
         	}
        +	if s := os.Getenv("GAE_SERVICE"); s != "" {
        +		return s
        +	}
         	return string(mustGetMetadata("instance/attributes/gae_backend_name"))
         }
         
        @@ -59,6 +85,9 @@ func VersionID(_ netcontext.Context) string {
         	if s1, s2 := os.Getenv("GAE_MODULE_VERSION"), os.Getenv("GAE_MINOR_VERSION"); s1 != "" && s2 != "" {
         		return s1 + "." + s2
         	}
        +	if s1, s2 := os.Getenv("GAE_VERSION"), os.Getenv("GAE_DEPLOYMENT_ID"); s1 != "" && s2 != "" {
        +		return s1 + "." + s2
        +	}
         	return string(mustGetMetadata("instance/attributes/gae_backend_version")) + "." + string(mustGetMetadata("instance/attributes/gae_backend_minor_version"))
         }
         
        @@ -66,19 +95,27 @@ func InstanceID() string {
         	if s := os.Getenv("GAE_MODULE_INSTANCE"); s != "" {
         		return s
         	}
        +	if s := os.Getenv("GAE_INSTANCE"); s != "" {
        +		return s
        +	}
         	return string(mustGetMetadata("instance/attributes/gae_backend_instance"))
         }
         
         func partitionlessAppID() string {
         	// gae_project has everything except the partition prefix.
        -	appID := os.Getenv("GAE_LONG_APP_ID")
        -	if appID == "" {
        -		appID = string(mustGetMetadata("instance/attributes/gae_project"))
        +	if appID := os.Getenv("GAE_LONG_APP_ID"); appID != "" {
        +		return appID
         	}
        -	return appID
        +	if project := os.Getenv("GOOGLE_CLOUD_PROJECT"); project != "" {
        +		return project
        +	}
        +	return string(mustGetMetadata("instance/attributes/gae_project"))
         }
         
         func fullyQualifiedAppID(_ netcontext.Context) string {
        +	if s := os.Getenv("GAE_APPLICATION"); s != "" {
        +		return s
        +	}
         	appID := partitionlessAppID()
         
         	part := os.Getenv("GAE_PARTITION")
        diff --git a/vendor/google.golang.org/appengine/internal/log/log_service.pb.go b/vendor/google.golang.org/appengine/internal/log/log_service.pb.go
        index 20c595be3..8545ac4ad 100644
        --- a/vendor/google.golang.org/appengine/internal/log/log_service.pb.go
        +++ b/vendor/google.golang.org/appengine/internal/log/log_service.pb.go
        @@ -1,29 +1,6 @@
        -// Code generated by protoc-gen-go.
        +// Code generated by protoc-gen-go. DO NOT EDIT.
         // source: google.golang.org/appengine/internal/log/log_service.proto
        -// DO NOT EDIT!
        -
        -/*
        -Package log is a generated protocol buffer package.
        -
        -It is generated from these files:
        -	google.golang.org/appengine/internal/log/log_service.proto
        -
        -It has these top-level messages:
        -	LogServiceError
        -	UserAppLogLine
        -	UserAppLogGroup
        -	FlushRequest
        -	SetStatusRequest
        -	LogOffset
        -	LogLine
        -	RequestLog
        -	LogModuleVersion
        -	LogReadRequest
        -	LogReadResponse
        -	LogUsageRecord
        -	LogUsageRequest
        -	LogUsageResponse
        -*/
        +
         package log
         
         import proto "github.com/golang/protobuf/proto"
        @@ -35,6 +12,12 @@ var _ = proto.Marshal
         var _ = fmt.Errorf
         var _ = math.Inf
         
        +// This is a compile-time assertion to ensure that this generated file
        +// is compatible with the proto package it is being compiled against.
        +// A compilation error at this line likely means your copy of the
        +// proto package needs to be updated.
        +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
        +
         type LogServiceError_ErrorCode int32
         
         const (
        @@ -70,25 +53,72 @@ func (x *LogServiceError_ErrorCode) UnmarshalJSON(data []byte) error {
         	*x = LogServiceError_ErrorCode(value)
         	return nil
         }
        +func (LogServiceError_ErrorCode) EnumDescriptor() ([]byte, []int) {
        +	return fileDescriptor_log_service_f054fd4b5012319d, []int{0, 0}
        +}
         
         type LogServiceError struct {
        -	XXX_unrecognized []byte `json:"-"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *LogServiceError) Reset()         { *m = LogServiceError{} }
         func (m *LogServiceError) String() string { return proto.CompactTextString(m) }
         func (*LogServiceError) ProtoMessage()    {}
        +func (*LogServiceError) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_log_service_f054fd4b5012319d, []int{0}
        +}
        +func (m *LogServiceError) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_LogServiceError.Unmarshal(m, b)
        +}
        +func (m *LogServiceError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_LogServiceError.Marshal(b, m, deterministic)
        +}
        +func (dst *LogServiceError) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_LogServiceError.Merge(dst, src)
        +}
        +func (m *LogServiceError) XXX_Size() int {
        +	return xxx_messageInfo_LogServiceError.Size(m)
        +}
        +func (m *LogServiceError) XXX_DiscardUnknown() {
        +	xxx_messageInfo_LogServiceError.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_LogServiceError proto.InternalMessageInfo
         
         type UserAppLogLine struct {
        -	TimestampUsec    *int64  `protobuf:"varint,1,req,name=timestamp_usec" json:"timestamp_usec,omitempty"`
        -	Level            *int64  `protobuf:"varint,2,req,name=level" json:"level,omitempty"`
        -	Message          *string `protobuf:"bytes,3,req,name=message" json:"message,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	TimestampUsec        *int64   `protobuf:"varint,1,req,name=timestamp_usec,json=timestampUsec" json:"timestamp_usec,omitempty"`
        +	Level                *int64   `protobuf:"varint,2,req,name=level" json:"level,omitempty"`
        +	Message              *string  `protobuf:"bytes,3,req,name=message" json:"message,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *UserAppLogLine) Reset()         { *m = UserAppLogLine{} }
         func (m *UserAppLogLine) String() string { return proto.CompactTextString(m) }
         func (*UserAppLogLine) ProtoMessage()    {}
        +func (*UserAppLogLine) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_log_service_f054fd4b5012319d, []int{1}
        +}
        +func (m *UserAppLogLine) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_UserAppLogLine.Unmarshal(m, b)
        +}
        +func (m *UserAppLogLine) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_UserAppLogLine.Marshal(b, m, deterministic)
        +}
        +func (dst *UserAppLogLine) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_UserAppLogLine.Merge(dst, src)
        +}
        +func (m *UserAppLogLine) XXX_Size() int {
        +	return xxx_messageInfo_UserAppLogLine.Size(m)
        +}
        +func (m *UserAppLogLine) XXX_DiscardUnknown() {
        +	xxx_messageInfo_UserAppLogLine.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_UserAppLogLine proto.InternalMessageInfo
         
         func (m *UserAppLogLine) GetTimestampUsec() int64 {
         	if m != nil && m.TimestampUsec != nil {
        @@ -112,13 +142,35 @@ func (m *UserAppLogLine) GetMessage() string {
         }
         
         type UserAppLogGroup struct {
        -	LogLine          []*UserAppLogLine `protobuf:"bytes,2,rep,name=log_line" json:"log_line,omitempty"`
        -	XXX_unrecognized []byte            `json:"-"`
        +	LogLine              []*UserAppLogLine `protobuf:"bytes,2,rep,name=log_line,json=logLine" json:"log_line,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
        +	XXX_unrecognized     []byte            `json:"-"`
        +	XXX_sizecache        int32             `json:"-"`
         }
         
         func (m *UserAppLogGroup) Reset()         { *m = UserAppLogGroup{} }
         func (m *UserAppLogGroup) String() string { return proto.CompactTextString(m) }
         func (*UserAppLogGroup) ProtoMessage()    {}
        +func (*UserAppLogGroup) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_log_service_f054fd4b5012319d, []int{2}
        +}
        +func (m *UserAppLogGroup) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_UserAppLogGroup.Unmarshal(m, b)
        +}
        +func (m *UserAppLogGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_UserAppLogGroup.Marshal(b, m, deterministic)
        +}
        +func (dst *UserAppLogGroup) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_UserAppLogGroup.Merge(dst, src)
        +}
        +func (m *UserAppLogGroup) XXX_Size() int {
        +	return xxx_messageInfo_UserAppLogGroup.Size(m)
        +}
        +func (m *UserAppLogGroup) XXX_DiscardUnknown() {
        +	xxx_messageInfo_UserAppLogGroup.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_UserAppLogGroup proto.InternalMessageInfo
         
         func (m *UserAppLogGroup) GetLogLine() []*UserAppLogLine {
         	if m != nil {
        @@ -128,13 +180,35 @@ func (m *UserAppLogGroup) GetLogLine() []*UserAppLogLine {
         }
         
         type FlushRequest struct {
        -	Logs             []byte `protobuf:"bytes,1,opt,name=logs" json:"logs,omitempty"`
        -	XXX_unrecognized []byte `json:"-"`
        +	Logs                 []byte   `protobuf:"bytes,1,opt,name=logs" json:"logs,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *FlushRequest) Reset()         { *m = FlushRequest{} }
         func (m *FlushRequest) String() string { return proto.CompactTextString(m) }
         func (*FlushRequest) ProtoMessage()    {}
        +func (*FlushRequest) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_log_service_f054fd4b5012319d, []int{3}
        +}
        +func (m *FlushRequest) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_FlushRequest.Unmarshal(m, b)
        +}
        +func (m *FlushRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_FlushRequest.Marshal(b, m, deterministic)
        +}
        +func (dst *FlushRequest) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_FlushRequest.Merge(dst, src)
        +}
        +func (m *FlushRequest) XXX_Size() int {
        +	return xxx_messageInfo_FlushRequest.Size(m)
        +}
        +func (m *FlushRequest) XXX_DiscardUnknown() {
        +	xxx_messageInfo_FlushRequest.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_FlushRequest proto.InternalMessageInfo
         
         func (m *FlushRequest) GetLogs() []byte {
         	if m != nil {
        @@ -144,13 +218,35 @@ func (m *FlushRequest) GetLogs() []byte {
         }
         
         type SetStatusRequest struct {
        -	Status           *string `protobuf:"bytes,1,req,name=status" json:"status,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	Status               *string  `protobuf:"bytes,1,req,name=status" json:"status,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *SetStatusRequest) Reset()         { *m = SetStatusRequest{} }
         func (m *SetStatusRequest) String() string { return proto.CompactTextString(m) }
         func (*SetStatusRequest) ProtoMessage()    {}
        +func (*SetStatusRequest) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_log_service_f054fd4b5012319d, []int{4}
        +}
        +func (m *SetStatusRequest) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_SetStatusRequest.Unmarshal(m, b)
        +}
        +func (m *SetStatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_SetStatusRequest.Marshal(b, m, deterministic)
        +}
        +func (dst *SetStatusRequest) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_SetStatusRequest.Merge(dst, src)
        +}
        +func (m *SetStatusRequest) XXX_Size() int {
        +	return xxx_messageInfo_SetStatusRequest.Size(m)
        +}
        +func (m *SetStatusRequest) XXX_DiscardUnknown() {
        +	xxx_messageInfo_SetStatusRequest.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_SetStatusRequest proto.InternalMessageInfo
         
         func (m *SetStatusRequest) GetStatus() string {
         	if m != nil && m.Status != nil {
        @@ -160,13 +256,35 @@ func (m *SetStatusRequest) GetStatus() string {
         }
         
         type LogOffset struct {
        -	RequestId        []byte `protobuf:"bytes,1,opt,name=request_id" json:"request_id,omitempty"`
        -	XXX_unrecognized []byte `json:"-"`
        +	RequestId            []byte   `protobuf:"bytes,1,opt,name=request_id,json=requestId" json:"request_id,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *LogOffset) Reset()         { *m = LogOffset{} }
         func (m *LogOffset) String() string { return proto.CompactTextString(m) }
         func (*LogOffset) ProtoMessage()    {}
        +func (*LogOffset) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_log_service_f054fd4b5012319d, []int{5}
        +}
        +func (m *LogOffset) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_LogOffset.Unmarshal(m, b)
        +}
        +func (m *LogOffset) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_LogOffset.Marshal(b, m, deterministic)
        +}
        +func (dst *LogOffset) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_LogOffset.Merge(dst, src)
        +}
        +func (m *LogOffset) XXX_Size() int {
        +	return xxx_messageInfo_LogOffset.Size(m)
        +}
        +func (m *LogOffset) XXX_DiscardUnknown() {
        +	xxx_messageInfo_LogOffset.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_LogOffset proto.InternalMessageInfo
         
         func (m *LogOffset) GetRequestId() []byte {
         	if m != nil {
        @@ -176,15 +294,37 @@ func (m *LogOffset) GetRequestId() []byte {
         }
         
         type LogLine struct {
        -	Time             *int64  `protobuf:"varint,1,req,name=time" json:"time,omitempty"`
        -	Level            *int32  `protobuf:"varint,2,req,name=level" json:"level,omitempty"`
        -	LogMessage       *string `protobuf:"bytes,3,req,name=log_message" json:"log_message,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	Time                 *int64   `protobuf:"varint,1,req,name=time" json:"time,omitempty"`
        +	Level                *int32   `protobuf:"varint,2,req,name=level" json:"level,omitempty"`
        +	LogMessage           *string  `protobuf:"bytes,3,req,name=log_message,json=logMessage" json:"log_message,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *LogLine) Reset()         { *m = LogLine{} }
         func (m *LogLine) String() string { return proto.CompactTextString(m) }
         func (*LogLine) ProtoMessage()    {}
        +func (*LogLine) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_log_service_f054fd4b5012319d, []int{6}
        +}
        +func (m *LogLine) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_LogLine.Unmarshal(m, b)
        +}
        +func (m *LogLine) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_LogLine.Marshal(b, m, deterministic)
        +}
        +func (dst *LogLine) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_LogLine.Merge(dst, src)
        +}
        +func (m *LogLine) XXX_Size() int {
        +	return xxx_messageInfo_LogLine.Size(m)
        +}
        +func (m *LogLine) XXX_DiscardUnknown() {
        +	xxx_messageInfo_LogLine.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_LogLine proto.InternalMessageInfo
         
         func (m *LogLine) GetTime() int64 {
         	if m != nil && m.Time != nil {
        @@ -208,50 +348,72 @@ func (m *LogLine) GetLogMessage() string {
         }
         
         type RequestLog struct {
        -	AppId                   *string    `protobuf:"bytes,1,req,name=app_id" json:"app_id,omitempty"`
        -	ModuleId                *string    `protobuf:"bytes,37,opt,name=module_id,def=default" json:"module_id,omitempty"`
        -	VersionId               *string    `protobuf:"bytes,2,req,name=version_id" json:"version_id,omitempty"`
        -	RequestId               []byte     `protobuf:"bytes,3,req,name=request_id" json:"request_id,omitempty"`
        +	AppId                   *string    `protobuf:"bytes,1,req,name=app_id,json=appId" json:"app_id,omitempty"`
        +	ModuleId                *string    `protobuf:"bytes,37,opt,name=module_id,json=moduleId,def=default" json:"module_id,omitempty"`
        +	VersionId               *string    `protobuf:"bytes,2,req,name=version_id,json=versionId" json:"version_id,omitempty"`
        +	RequestId               []byte     `protobuf:"bytes,3,req,name=request_id,json=requestId" json:"request_id,omitempty"`
         	Offset                  *LogOffset `protobuf:"bytes,35,opt,name=offset" json:"offset,omitempty"`
         	Ip                      *string    `protobuf:"bytes,4,req,name=ip" json:"ip,omitempty"`
         	Nickname                *string    `protobuf:"bytes,5,opt,name=nickname" json:"nickname,omitempty"`
        -	StartTime               *int64     `protobuf:"varint,6,req,name=start_time" json:"start_time,omitempty"`
        -	EndTime                 *int64     `protobuf:"varint,7,req,name=end_time" json:"end_time,omitempty"`
        +	StartTime               *int64     `protobuf:"varint,6,req,name=start_time,json=startTime" json:"start_time,omitempty"`
        +	EndTime                 *int64     `protobuf:"varint,7,req,name=end_time,json=endTime" json:"end_time,omitempty"`
         	Latency                 *int64     `protobuf:"varint,8,req,name=latency" json:"latency,omitempty"`
         	Mcycles                 *int64     `protobuf:"varint,9,req,name=mcycles" json:"mcycles,omitempty"`
         	Method                  *string    `protobuf:"bytes,10,req,name=method" json:"method,omitempty"`
         	Resource                *string    `protobuf:"bytes,11,req,name=resource" json:"resource,omitempty"`
        -	HttpVersion             *string    `protobuf:"bytes,12,req,name=http_version" json:"http_version,omitempty"`
        +	HttpVersion             *string    `protobuf:"bytes,12,req,name=http_version,json=httpVersion" json:"http_version,omitempty"`
         	Status                  *int32     `protobuf:"varint,13,req,name=status" json:"status,omitempty"`
        -	ResponseSize            *int64     `protobuf:"varint,14,req,name=response_size" json:"response_size,omitempty"`
        +	ResponseSize            *int64     `protobuf:"varint,14,req,name=response_size,json=responseSize" json:"response_size,omitempty"`
         	Referrer                *string    `protobuf:"bytes,15,opt,name=referrer" json:"referrer,omitempty"`
        -	UserAgent               *string    `protobuf:"bytes,16,opt,name=user_agent" json:"user_agent,omitempty"`
        -	UrlMapEntry             *string    `protobuf:"bytes,17,req,name=url_map_entry" json:"url_map_entry,omitempty"`
        +	UserAgent               *string    `protobuf:"bytes,16,opt,name=user_agent,json=userAgent" json:"user_agent,omitempty"`
        +	UrlMapEntry             *string    `protobuf:"bytes,17,req,name=url_map_entry,json=urlMapEntry" json:"url_map_entry,omitempty"`
         	Combined                *string    `protobuf:"bytes,18,req,name=combined" json:"combined,omitempty"`
        -	ApiMcycles              *int64     `protobuf:"varint,19,opt,name=api_mcycles" json:"api_mcycles,omitempty"`
        +	ApiMcycles              *int64     `protobuf:"varint,19,opt,name=api_mcycles,json=apiMcycles" json:"api_mcycles,omitempty"`
         	Host                    *string    `protobuf:"bytes,20,opt,name=host" json:"host,omitempty"`
         	Cost                    *float64   `protobuf:"fixed64,21,opt,name=cost" json:"cost,omitempty"`
        -	TaskQueueName           *string    `protobuf:"bytes,22,opt,name=task_queue_name" json:"task_queue_name,omitempty"`
        -	TaskName                *string    `protobuf:"bytes,23,opt,name=task_name" json:"task_name,omitempty"`
        -	WasLoadingRequest       *bool      `protobuf:"varint,24,opt,name=was_loading_request" json:"was_loading_request,omitempty"`
        -	PendingTime             *int64     `protobuf:"varint,25,opt,name=pending_time" json:"pending_time,omitempty"`
        -	ReplicaIndex            *int32     `protobuf:"varint,26,opt,name=replica_index,def=-1" json:"replica_index,omitempty"`
        +	TaskQueueName           *string    `protobuf:"bytes,22,opt,name=task_queue_name,json=taskQueueName" json:"task_queue_name,omitempty"`
        +	TaskName                *string    `protobuf:"bytes,23,opt,name=task_name,json=taskName" json:"task_name,omitempty"`
        +	WasLoadingRequest       *bool      `protobuf:"varint,24,opt,name=was_loading_request,json=wasLoadingRequest" json:"was_loading_request,omitempty"`
        +	PendingTime             *int64     `protobuf:"varint,25,opt,name=pending_time,json=pendingTime" json:"pending_time,omitempty"`
        +	ReplicaIndex            *int32     `protobuf:"varint,26,opt,name=replica_index,json=replicaIndex,def=-1" json:"replica_index,omitempty"`
         	Finished                *bool      `protobuf:"varint,27,opt,name=finished,def=1" json:"finished,omitempty"`
        -	CloneKey                []byte     `protobuf:"bytes,28,opt,name=clone_key" json:"clone_key,omitempty"`
        +	CloneKey                []byte     `protobuf:"bytes,28,opt,name=clone_key,json=cloneKey" json:"clone_key,omitempty"`
         	Line                    []*LogLine `protobuf:"bytes,29,rep,name=line" json:"line,omitempty"`
        -	LinesIncomplete         *bool      `protobuf:"varint,36,opt,name=lines_incomplete" json:"lines_incomplete,omitempty"`
        -	AppEngineRelease        []byte     `protobuf:"bytes,38,opt,name=app_engine_release" json:"app_engine_release,omitempty"`
        -	ExitReason              *int32     `protobuf:"varint,30,opt,name=exit_reason" json:"exit_reason,omitempty"`
        -	WasThrottledForTime     *bool      `protobuf:"varint,31,opt,name=was_throttled_for_time" json:"was_throttled_for_time,omitempty"`
        -	WasThrottledForRequests *bool      `protobuf:"varint,32,opt,name=was_throttled_for_requests" json:"was_throttled_for_requests,omitempty"`
        -	ThrottledTime           *int64     `protobuf:"varint,33,opt,name=throttled_time" json:"throttled_time,omitempty"`
        -	ServerName              []byte     `protobuf:"bytes,34,opt,name=server_name" json:"server_name,omitempty"`
        +	LinesIncomplete         *bool      `protobuf:"varint,36,opt,name=lines_incomplete,json=linesIncomplete" json:"lines_incomplete,omitempty"`
        +	AppEngineRelease        []byte     `protobuf:"bytes,38,opt,name=app_engine_release,json=appEngineRelease" json:"app_engine_release,omitempty"`
        +	ExitReason              *int32     `protobuf:"varint,30,opt,name=exit_reason,json=exitReason" json:"exit_reason,omitempty"`
        +	WasThrottledForTime     *bool      `protobuf:"varint,31,opt,name=was_throttled_for_time,json=wasThrottledForTime" json:"was_throttled_for_time,omitempty"`
        +	WasThrottledForRequests *bool      `protobuf:"varint,32,opt,name=was_throttled_for_requests,json=wasThrottledForRequests" json:"was_throttled_for_requests,omitempty"`
        +	ThrottledTime           *int64     `protobuf:"varint,33,opt,name=throttled_time,json=throttledTime" json:"throttled_time,omitempty"`
        +	ServerName              []byte     `protobuf:"bytes,34,opt,name=server_name,json=serverName" json:"server_name,omitempty"`
        +	XXX_NoUnkeyedLiteral    struct{}   `json:"-"`
         	XXX_unrecognized        []byte     `json:"-"`
        +	XXX_sizecache           int32      `json:"-"`
         }
         
         func (m *RequestLog) Reset()         { *m = RequestLog{} }
         func (m *RequestLog) String() string { return proto.CompactTextString(m) }
         func (*RequestLog) ProtoMessage()    {}
        +func (*RequestLog) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_log_service_f054fd4b5012319d, []int{7}
        +}
        +func (m *RequestLog) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_RequestLog.Unmarshal(m, b)
        +}
        +func (m *RequestLog) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_RequestLog.Marshal(b, m, deterministic)
        +}
        +func (dst *RequestLog) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_RequestLog.Merge(dst, src)
        +}
        +func (m *RequestLog) XXX_Size() int {
        +	return xxx_messageInfo_RequestLog.Size(m)
        +}
        +func (m *RequestLog) XXX_DiscardUnknown() {
        +	xxx_messageInfo_RequestLog.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_RequestLog proto.InternalMessageInfo
         
         const Default_RequestLog_ModuleId string = "default"
         const Default_RequestLog_ReplicaIndex int32 = -1
        @@ -524,14 +686,36 @@ func (m *RequestLog) GetServerName() []byte {
         }
         
         type LogModuleVersion struct {
        -	ModuleId         *string `protobuf:"bytes,1,opt,name=module_id,def=default" json:"module_id,omitempty"`
        -	VersionId        *string `protobuf:"bytes,2,opt,name=version_id" json:"version_id,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	ModuleId             *string  `protobuf:"bytes,1,opt,name=module_id,json=moduleId,def=default" json:"module_id,omitempty"`
        +	VersionId            *string  `protobuf:"bytes,2,opt,name=version_id,json=versionId" json:"version_id,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *LogModuleVersion) Reset()         { *m = LogModuleVersion{} }
         func (m *LogModuleVersion) String() string { return proto.CompactTextString(m) }
         func (*LogModuleVersion) ProtoMessage()    {}
        +func (*LogModuleVersion) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_log_service_f054fd4b5012319d, []int{8}
        +}
        +func (m *LogModuleVersion) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_LogModuleVersion.Unmarshal(m, b)
        +}
        +func (m *LogModuleVersion) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_LogModuleVersion.Marshal(b, m, deterministic)
        +}
        +func (dst *LogModuleVersion) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_LogModuleVersion.Merge(dst, src)
        +}
        +func (m *LogModuleVersion) XXX_Size() int {
        +	return xxx_messageInfo_LogModuleVersion.Size(m)
        +}
        +func (m *LogModuleVersion) XXX_DiscardUnknown() {
        +	xxx_messageInfo_LogModuleVersion.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_LogModuleVersion proto.InternalMessageInfo
         
         const Default_LogModuleVersion_ModuleId string = "default"
         
        @@ -550,31 +734,53 @@ func (m *LogModuleVersion) GetVersionId() string {
         }
         
         type LogReadRequest struct {
        -	AppId             *string             `protobuf:"bytes,1,req,name=app_id" json:"app_id,omitempty"`
        -	VersionId         []string            `protobuf:"bytes,2,rep,name=version_id" json:"version_id,omitempty"`
        -	ModuleVersion     []*LogModuleVersion `protobuf:"bytes,19,rep,name=module_version" json:"module_version,omitempty"`
        -	StartTime         *int64              `protobuf:"varint,3,opt,name=start_time" json:"start_time,omitempty"`
        -	EndTime           *int64              `protobuf:"varint,4,opt,name=end_time" json:"end_time,omitempty"`
        -	Offset            *LogOffset          `protobuf:"bytes,5,opt,name=offset" json:"offset,omitempty"`
        -	RequestId         [][]byte            `protobuf:"bytes,6,rep,name=request_id" json:"request_id,omitempty"`
        -	MinimumLogLevel   *int32              `protobuf:"varint,7,opt,name=minimum_log_level" json:"minimum_log_level,omitempty"`
        -	IncludeIncomplete *bool               `protobuf:"varint,8,opt,name=include_incomplete" json:"include_incomplete,omitempty"`
        -	Count             *int64              `protobuf:"varint,9,opt,name=count" json:"count,omitempty"`
        -	CombinedLogRegex  *string             `protobuf:"bytes,14,opt,name=combined_log_regex" json:"combined_log_regex,omitempty"`
        -	HostRegex         *string             `protobuf:"bytes,15,opt,name=host_regex" json:"host_regex,omitempty"`
        -	ReplicaIndex      *int32              `protobuf:"varint,16,opt,name=replica_index" json:"replica_index,omitempty"`
        -	IncludeAppLogs    *bool               `protobuf:"varint,10,opt,name=include_app_logs" json:"include_app_logs,omitempty"`
        -	AppLogsPerRequest *int32              `protobuf:"varint,17,opt,name=app_logs_per_request" json:"app_logs_per_request,omitempty"`
        -	IncludeHost       *bool               `protobuf:"varint,11,opt,name=include_host" json:"include_host,omitempty"`
        -	IncludeAll        *bool               `protobuf:"varint,12,opt,name=include_all" json:"include_all,omitempty"`
        -	CacheIterator     *bool               `protobuf:"varint,13,opt,name=cache_iterator" json:"cache_iterator,omitempty"`
        -	NumShards         *int32              `protobuf:"varint,18,opt,name=num_shards" json:"num_shards,omitempty"`
        -	XXX_unrecognized  []byte              `json:"-"`
        +	AppId                *string             `protobuf:"bytes,1,req,name=app_id,json=appId" json:"app_id,omitempty"`
        +	VersionId            []string            `protobuf:"bytes,2,rep,name=version_id,json=versionId" json:"version_id,omitempty"`
        +	ModuleVersion        []*LogModuleVersion `protobuf:"bytes,19,rep,name=module_version,json=moduleVersion" json:"module_version,omitempty"`
        +	StartTime            *int64              `protobuf:"varint,3,opt,name=start_time,json=startTime" json:"start_time,omitempty"`
        +	EndTime              *int64              `protobuf:"varint,4,opt,name=end_time,json=endTime" json:"end_time,omitempty"`
        +	Offset               *LogOffset          `protobuf:"bytes,5,opt,name=offset" json:"offset,omitempty"`
        +	RequestId            [][]byte            `protobuf:"bytes,6,rep,name=request_id,json=requestId" json:"request_id,omitempty"`
        +	MinimumLogLevel      *int32              `protobuf:"varint,7,opt,name=minimum_log_level,json=minimumLogLevel" json:"minimum_log_level,omitempty"`
        +	IncludeIncomplete    *bool               `protobuf:"varint,8,opt,name=include_incomplete,json=includeIncomplete" json:"include_incomplete,omitempty"`
        +	Count                *int64              `protobuf:"varint,9,opt,name=count" json:"count,omitempty"`
        +	CombinedLogRegex     *string             `protobuf:"bytes,14,opt,name=combined_log_regex,json=combinedLogRegex" json:"combined_log_regex,omitempty"`
        +	HostRegex            *string             `protobuf:"bytes,15,opt,name=host_regex,json=hostRegex" json:"host_regex,omitempty"`
        +	ReplicaIndex         *int32              `protobuf:"varint,16,opt,name=replica_index,json=replicaIndex" json:"replica_index,omitempty"`
        +	IncludeAppLogs       *bool               `protobuf:"varint,10,opt,name=include_app_logs,json=includeAppLogs" json:"include_app_logs,omitempty"`
        +	AppLogsPerRequest    *int32              `protobuf:"varint,17,opt,name=app_logs_per_request,json=appLogsPerRequest" json:"app_logs_per_request,omitempty"`
        +	IncludeHost          *bool               `protobuf:"varint,11,opt,name=include_host,json=includeHost" json:"include_host,omitempty"`
        +	IncludeAll           *bool               `protobuf:"varint,12,opt,name=include_all,json=includeAll" json:"include_all,omitempty"`
        +	CacheIterator        *bool               `protobuf:"varint,13,opt,name=cache_iterator,json=cacheIterator" json:"cache_iterator,omitempty"`
        +	NumShards            *int32              `protobuf:"varint,18,opt,name=num_shards,json=numShards" json:"num_shards,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
        +	XXX_unrecognized     []byte              `json:"-"`
        +	XXX_sizecache        int32               `json:"-"`
         }
         
         func (m *LogReadRequest) Reset()         { *m = LogReadRequest{} }
         func (m *LogReadRequest) String() string { return proto.CompactTextString(m) }
         func (*LogReadRequest) ProtoMessage()    {}
        +func (*LogReadRequest) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_log_service_f054fd4b5012319d, []int{9}
        +}
        +func (m *LogReadRequest) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_LogReadRequest.Unmarshal(m, b)
        +}
        +func (m *LogReadRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_LogReadRequest.Marshal(b, m, deterministic)
        +}
        +func (dst *LogReadRequest) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_LogReadRequest.Merge(dst, src)
        +}
        +func (m *LogReadRequest) XXX_Size() int {
        +	return xxx_messageInfo_LogReadRequest.Size(m)
        +}
        +func (m *LogReadRequest) XXX_DiscardUnknown() {
        +	xxx_messageInfo_LogReadRequest.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_LogReadRequest proto.InternalMessageInfo
         
         func (m *LogReadRequest) GetAppId() string {
         	if m != nil && m.AppId != nil {
        @@ -710,15 +916,37 @@ func (m *LogReadRequest) GetNumShards() int32 {
         }
         
         type LogReadResponse struct {
        -	Log              []*RequestLog `protobuf:"bytes,1,rep,name=log" json:"log,omitempty"`
        -	Offset           *LogOffset    `protobuf:"bytes,2,opt,name=offset" json:"offset,omitempty"`
        -	LastEndTime      *int64        `protobuf:"varint,3,opt,name=last_end_time" json:"last_end_time,omitempty"`
        -	XXX_unrecognized []byte        `json:"-"`
        +	Log                  []*RequestLog `protobuf:"bytes,1,rep,name=log" json:"log,omitempty"`
        +	Offset               *LogOffset    `protobuf:"bytes,2,opt,name=offset" json:"offset,omitempty"`
        +	LastEndTime          *int64        `protobuf:"varint,3,opt,name=last_end_time,json=lastEndTime" json:"last_end_time,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
        +	XXX_unrecognized     []byte        `json:"-"`
        +	XXX_sizecache        int32         `json:"-"`
         }
         
         func (m *LogReadResponse) Reset()         { *m = LogReadResponse{} }
         func (m *LogReadResponse) String() string { return proto.CompactTextString(m) }
         func (*LogReadResponse) ProtoMessage()    {}
        +func (*LogReadResponse) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_log_service_f054fd4b5012319d, []int{10}
        +}
        +func (m *LogReadResponse) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_LogReadResponse.Unmarshal(m, b)
        +}
        +func (m *LogReadResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_LogReadResponse.Marshal(b, m, deterministic)
        +}
        +func (dst *LogReadResponse) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_LogReadResponse.Merge(dst, src)
        +}
        +func (m *LogReadResponse) XXX_Size() int {
        +	return xxx_messageInfo_LogReadResponse.Size(m)
        +}
        +func (m *LogReadResponse) XXX_DiscardUnknown() {
        +	xxx_messageInfo_LogReadResponse.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_LogReadResponse proto.InternalMessageInfo
         
         func (m *LogReadResponse) GetLog() []*RequestLog {
         	if m != nil {
        @@ -742,18 +970,40 @@ func (m *LogReadResponse) GetLastEndTime() int64 {
         }
         
         type LogUsageRecord struct {
        -	VersionId        *string `protobuf:"bytes,1,opt,name=version_id" json:"version_id,omitempty"`
        -	StartTime        *int32  `protobuf:"varint,2,opt,name=start_time" json:"start_time,omitempty"`
        -	EndTime          *int32  `protobuf:"varint,3,opt,name=end_time" json:"end_time,omitempty"`
        -	Count            *int64  `protobuf:"varint,4,opt,name=count" json:"count,omitempty"`
        -	TotalSize        *int64  `protobuf:"varint,5,opt,name=total_size" json:"total_size,omitempty"`
        -	Records          *int32  `protobuf:"varint,6,opt,name=records" json:"records,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	VersionId            *string  `protobuf:"bytes,1,opt,name=version_id,json=versionId" json:"version_id,omitempty"`
        +	StartTime            *int32   `protobuf:"varint,2,opt,name=start_time,json=startTime" json:"start_time,omitempty"`
        +	EndTime              *int32   `protobuf:"varint,3,opt,name=end_time,json=endTime" json:"end_time,omitempty"`
        +	Count                *int64   `protobuf:"varint,4,opt,name=count" json:"count,omitempty"`
        +	TotalSize            *int64   `protobuf:"varint,5,opt,name=total_size,json=totalSize" json:"total_size,omitempty"`
        +	Records              *int32   `protobuf:"varint,6,opt,name=records" json:"records,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *LogUsageRecord) Reset()         { *m = LogUsageRecord{} }
         func (m *LogUsageRecord) String() string { return proto.CompactTextString(m) }
         func (*LogUsageRecord) ProtoMessage()    {}
        +func (*LogUsageRecord) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_log_service_f054fd4b5012319d, []int{11}
        +}
        +func (m *LogUsageRecord) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_LogUsageRecord.Unmarshal(m, b)
        +}
        +func (m *LogUsageRecord) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_LogUsageRecord.Marshal(b, m, deterministic)
        +}
        +func (dst *LogUsageRecord) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_LogUsageRecord.Merge(dst, src)
        +}
        +func (m *LogUsageRecord) XXX_Size() int {
        +	return xxx_messageInfo_LogUsageRecord.Size(m)
        +}
        +func (m *LogUsageRecord) XXX_DiscardUnknown() {
        +	xxx_messageInfo_LogUsageRecord.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_LogUsageRecord proto.InternalMessageInfo
         
         func (m *LogUsageRecord) GetVersionId() string {
         	if m != nil && m.VersionId != nil {
        @@ -798,20 +1048,42 @@ func (m *LogUsageRecord) GetRecords() int32 {
         }
         
         type LogUsageRequest struct {
        -	AppId            *string  `protobuf:"bytes,1,req,name=app_id" json:"app_id,omitempty"`
        -	VersionId        []string `protobuf:"bytes,2,rep,name=version_id" json:"version_id,omitempty"`
        -	StartTime        *int32   `protobuf:"varint,3,opt,name=start_time" json:"start_time,omitempty"`
        -	EndTime          *int32   `protobuf:"varint,4,opt,name=end_time" json:"end_time,omitempty"`
        -	ResolutionHours  *uint32  `protobuf:"varint,5,opt,name=resolution_hours,def=1" json:"resolution_hours,omitempty"`
        -	CombineVersions  *bool    `protobuf:"varint,6,opt,name=combine_versions" json:"combine_versions,omitempty"`
        -	UsageVersion     *int32   `protobuf:"varint,7,opt,name=usage_version" json:"usage_version,omitempty"`
        -	VersionsOnly     *bool    `protobuf:"varint,8,opt,name=versions_only" json:"versions_only,omitempty"`
        -	XXX_unrecognized []byte   `json:"-"`
        +	AppId                *string  `protobuf:"bytes,1,req,name=app_id,json=appId" json:"app_id,omitempty"`
        +	VersionId            []string `protobuf:"bytes,2,rep,name=version_id,json=versionId" json:"version_id,omitempty"`
        +	StartTime            *int32   `protobuf:"varint,3,opt,name=start_time,json=startTime" json:"start_time,omitempty"`
        +	EndTime              *int32   `protobuf:"varint,4,opt,name=end_time,json=endTime" json:"end_time,omitempty"`
        +	ResolutionHours      *uint32  `protobuf:"varint,5,opt,name=resolution_hours,json=resolutionHours,def=1" json:"resolution_hours,omitempty"`
        +	CombineVersions      *bool    `protobuf:"varint,6,opt,name=combine_versions,json=combineVersions" json:"combine_versions,omitempty"`
        +	UsageVersion         *int32   `protobuf:"varint,7,opt,name=usage_version,json=usageVersion" json:"usage_version,omitempty"`
        +	VersionsOnly         *bool    `protobuf:"varint,8,opt,name=versions_only,json=versionsOnly" json:"versions_only,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *LogUsageRequest) Reset()         { *m = LogUsageRequest{} }
         func (m *LogUsageRequest) String() string { return proto.CompactTextString(m) }
         func (*LogUsageRequest) ProtoMessage()    {}
        +func (*LogUsageRequest) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_log_service_f054fd4b5012319d, []int{12}
        +}
        +func (m *LogUsageRequest) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_LogUsageRequest.Unmarshal(m, b)
        +}
        +func (m *LogUsageRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_LogUsageRequest.Marshal(b, m, deterministic)
        +}
        +func (dst *LogUsageRequest) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_LogUsageRequest.Merge(dst, src)
        +}
        +func (m *LogUsageRequest) XXX_Size() int {
        +	return xxx_messageInfo_LogUsageRequest.Size(m)
        +}
        +func (m *LogUsageRequest) XXX_DiscardUnknown() {
        +	xxx_messageInfo_LogUsageRequest.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_LogUsageRequest proto.InternalMessageInfo
         
         const Default_LogUsageRequest_ResolutionHours uint32 = 1
         
        @@ -872,14 +1144,36 @@ func (m *LogUsageRequest) GetVersionsOnly() bool {
         }
         
         type LogUsageResponse struct {
        -	Usage            []*LogUsageRecord `protobuf:"bytes,1,rep,name=usage" json:"usage,omitempty"`
        -	Summary          *LogUsageRecord   `protobuf:"bytes,2,opt,name=summary" json:"summary,omitempty"`
        -	XXX_unrecognized []byte            `json:"-"`
        +	Usage                []*LogUsageRecord `protobuf:"bytes,1,rep,name=usage" json:"usage,omitempty"`
        +	Summary              *LogUsageRecord   `protobuf:"bytes,2,opt,name=summary" json:"summary,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
        +	XXX_unrecognized     []byte            `json:"-"`
        +	XXX_sizecache        int32             `json:"-"`
         }
         
         func (m *LogUsageResponse) Reset()         { *m = LogUsageResponse{} }
         func (m *LogUsageResponse) String() string { return proto.CompactTextString(m) }
         func (*LogUsageResponse) ProtoMessage()    {}
        +func (*LogUsageResponse) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_log_service_f054fd4b5012319d, []int{13}
        +}
        +func (m *LogUsageResponse) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_LogUsageResponse.Unmarshal(m, b)
        +}
        +func (m *LogUsageResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_LogUsageResponse.Marshal(b, m, deterministic)
        +}
        +func (dst *LogUsageResponse) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_LogUsageResponse.Merge(dst, src)
        +}
        +func (m *LogUsageResponse) XXX_Size() int {
        +	return xxx_messageInfo_LogUsageResponse.Size(m)
        +}
        +func (m *LogUsageResponse) XXX_DiscardUnknown() {
        +	xxx_messageInfo_LogUsageResponse.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_LogUsageResponse proto.InternalMessageInfo
         
         func (m *LogUsageResponse) GetUsage() []*LogUsageRecord {
         	if m != nil {
        @@ -896,4 +1190,124 @@ func (m *LogUsageResponse) GetSummary() *LogUsageRecord {
         }
         
         func init() {
        +	proto.RegisterType((*LogServiceError)(nil), "appengine.LogServiceError")
        +	proto.RegisterType((*UserAppLogLine)(nil), "appengine.UserAppLogLine")
        +	proto.RegisterType((*UserAppLogGroup)(nil), "appengine.UserAppLogGroup")
        +	proto.RegisterType((*FlushRequest)(nil), "appengine.FlushRequest")
        +	proto.RegisterType((*SetStatusRequest)(nil), "appengine.SetStatusRequest")
        +	proto.RegisterType((*LogOffset)(nil), "appengine.LogOffset")
        +	proto.RegisterType((*LogLine)(nil), "appengine.LogLine")
        +	proto.RegisterType((*RequestLog)(nil), "appengine.RequestLog")
        +	proto.RegisterType((*LogModuleVersion)(nil), "appengine.LogModuleVersion")
        +	proto.RegisterType((*LogReadRequest)(nil), "appengine.LogReadRequest")
        +	proto.RegisterType((*LogReadResponse)(nil), "appengine.LogReadResponse")
        +	proto.RegisterType((*LogUsageRecord)(nil), "appengine.LogUsageRecord")
        +	proto.RegisterType((*LogUsageRequest)(nil), "appengine.LogUsageRequest")
        +	proto.RegisterType((*LogUsageResponse)(nil), "appengine.LogUsageResponse")
        +}
        +
        +func init() {
        +	proto.RegisterFile("google.golang.org/appengine/internal/log/log_service.proto", fileDescriptor_log_service_f054fd4b5012319d)
        +}
        +
        +var fileDescriptor_log_service_f054fd4b5012319d = []byte{
        +	// 1553 bytes of a gzipped FileDescriptorProto
        +	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0xdd, 0x72, 0xdb, 0xc6,
        +	0x15, 0x2e, 0x48, 0x51, 0x24, 0x0f, 0x49, 0x91, 0x5a, 0xcb, 0xce, 0xda, 0xae, 0x6b, 0x1a, 0x4e,
        +	0x1c, 0xd6, 0x93, 0x48, 0x93, 0xa4, 0x57, 0xca, 0x95, 0xd3, 0x2a, 0x8e, 0x26, 0xb4, 0xd5, 0x40,
        +	0x72, 0x3a, 0xd3, 0x1b, 0x0c, 0x0a, 0x1c, 0x81, 0x18, 0x2f, 0xb1, 0xc8, 0xee, 0xc2, 0x91, 0x72,
        +	0xdb, 0xdb, 0x3e, 0x46, 0x1f, 0xa2, 0xaf, 0xd2, 0xb7, 0xe9, 0xec, 0xd9, 0x05, 0x44, 0x2a, 0x4d,
        +	0xc6, 0x33, 0xb9, 0xe0, 0x10, 0xfb, 0x9d, 0x83, 0xdd, 0xf3, 0xf3, 0x9d, 0x6f, 0x01, 0xc7, 0xb9,
        +	0x94, 0xb9, 0xc0, 0xc3, 0x5c, 0x8a, 0xa4, 0xcc, 0x0f, 0xa5, 0xca, 0x8f, 0x92, 0xaa, 0xc2, 0x32,
        +	0x2f, 0x4a, 0x3c, 0x2a, 0x4a, 0x83, 0xaa, 0x4c, 0xc4, 0x91, 0x90, 0xb9, 0xfd, 0xc5, 0x1a, 0xd5,
        +	0xbb, 0x22, 0xc5, 0xc3, 0x4a, 0x49, 0x23, 0xd9, 0xb0, 0xf5, 0x0c, 0x5f, 0xc3, 0x74, 0x29, 0xf3,
        +	0x73, 0x67, 0x3e, 0x51, 0x4a, 0xaa, 0xf0, 0x4b, 0x18, 0xd2, 0xc3, 0x9f, 0x65, 0x86, 0x6c, 0x17,
        +	0x3a, 0x67, 0xdf, 0xce, 0x7e, 0xc7, 0xee, 0xc0, 0xf4, 0xf4, 0xf5, 0xf7, 0x2f, 0x96, 0xa7, 0x7f,
        +	0x89, 0xa3, 0x93, 0xef, 0xde, 0x9c, 0x9c, 0x5f, 0xcc, 0x02, 0xb6, 0x0f, 0x93, 0xf3, 0x8b, 0xb3,
        +	0xe8, 0xc5, 0xcb, 0x93, 0xf8, 0x24, 0x8a, 0xce, 0xa2, 0x59, 0x27, 0xcc, 0x61, 0xef, 0x8d, 0x46,
        +	0xf5, 0xa2, 0xaa, 0x96, 0x32, 0x5f, 0x16, 0x25, 0xb2, 0x8f, 0x60, 0xcf, 0x14, 0x6b, 0xd4, 0x26,
        +	0x59, 0x57, 0x71, 0xad, 0x31, 0xe5, 0xc1, 0xbc, 0xb3, 0xe8, 0x46, 0x93, 0x16, 0x7d, 0xa3, 0x31,
        +	0x65, 0x07, 0xd0, 0x13, 0xf8, 0x0e, 0x05, 0xef, 0x90, 0xd5, 0x2d, 0x18, 0x87, 0xfe, 0x1a, 0xb5,
        +	0x4e, 0x72, 0xe4, 0xdd, 0x79, 0x67, 0x31, 0x8c, 0x9a, 0x65, 0xf8, 0x12, 0xa6, 0x37, 0x07, 0xbd,
        +	0x54, 0xb2, 0xae, 0xd8, 0x9f, 0x60, 0x60, 0x73, 0x15, 0x45, 0x89, 0xbc, 0x33, 0xef, 0x2e, 0x46,
        +	0x9f, 0xdf, 0x3f, 0x6c, 0x33, 0x3d, 0xdc, 0x0e, 0x2b, 0xea, 0x0b, 0xf7, 0x10, 0x86, 0x30, 0xfe,
        +	0x5a, 0xd4, 0x7a, 0x15, 0xe1, 0x0f, 0x35, 0x6a, 0xc3, 0x18, 0xec, 0x08, 0x99, 0x6b, 0x1e, 0xcc,
        +	0x83, 0xc5, 0x38, 0xa2, 0xe7, 0xf0, 0x39, 0xcc, 0xce, 0xd1, 0x9c, 0x9b, 0xc4, 0xd4, 0xba, 0xf1,
        +	0xbb, 0x07, 0xbb, 0x9a, 0x00, 0xca, 0x67, 0x18, 0xf9, 0x55, 0xf8, 0x1c, 0x86, 0x4b, 0x99, 0x9f,
        +	0x5d, 0x5e, 0x6a, 0x34, 0xec, 0x11, 0x80, 0x72, 0xfe, 0x71, 0x91, 0xf9, 0x2d, 0x87, 0x1e, 0x39,
        +	0xcd, 0xc2, 0x0b, 0xe8, 0x37, 0x65, 0x62, 0xb0, 0x63, 0x0b, 0xe2, 0x8b, 0x43, 0xcf, 0xdb, 0x35,
        +	0xe9, 0x35, 0x35, 0x79, 0x0c, 0x23, 0x9b, 0xe6, 0x76, 0x5d, 0x40, 0xc8, 0xfc, 0x95, 0x2f, 0xcd,
        +	0x3f, 0x01, 0xc0, 0x47, 0xb9, 0x94, 0x39, 0xbb, 0x0b, 0xbb, 0x49, 0x55, 0xb9, 0xf3, 0xad, 0x6b,
        +	0x2f, 0xa9, 0xaa, 0xd3, 0x8c, 0x7d, 0x08, 0xc3, 0xb5, 0xcc, 0x6a, 0x81, 0xd6, 0xf2, 0xd1, 0x3c,
        +	0x58, 0x0c, 0x8f, 0xfb, 0x19, 0x5e, 0x26, 0xb5, 0x30, 0xd1, 0xc0, 0x59, 0x4e, 0x33, 0x9b, 0xc0,
        +	0x3b, 0x54, 0xba, 0x90, 0xa5, 0x75, 0xeb, 0xd0, 0x06, 0x43, 0x8f, 0x38, 0xf3, 0x46, 0x7e, 0x36,
        +	0x94, 0xcd, 0xfc, 0xd8, 0x27, 0xb0, 0x2b, 0xa9, 0x10, 0xfc, 0xe9, 0x3c, 0x58, 0x8c, 0x3e, 0x3f,
        +	0xd8, 0xe8, 0x47, 0x5b, 0xa4, 0xc8, 0xfb, 0xb0, 0x3d, 0xe8, 0x14, 0x15, 0xdf, 0xa1, 0x33, 0x3a,
        +	0x45, 0xc5, 0x1e, 0xc0, 0xa0, 0x2c, 0xd2, 0xb7, 0x65, 0xb2, 0x46, 0xde, 0xb3, 0x01, 0x46, 0xed,
        +	0xda, 0x1e, 0xac, 0x4d, 0xa2, 0x4c, 0x4c, 0x45, 0xdb, 0xa5, 0xa2, 0x0d, 0x09, 0xb9, 0xb0, 0x95,
        +	0xbb, 0x0f, 0x03, 0x2c, 0x33, 0x67, 0xec, 0x93, 0xb1, 0x8f, 0x65, 0x46, 0x26, 0x0e, 0x7d, 0x91,
        +	0x18, 0x2c, 0xd3, 0x6b, 0x3e, 0x70, 0x16, 0xbf, 0x24, 0xb2, 0xa5, 0xd7, 0xa9, 0x40, 0xcd, 0x87,
        +	0xce, 0xe2, 0x97, 0xb6, 0xd7, 0x6b, 0x34, 0x2b, 0x99, 0x71, 0x70, 0xbd, 0x76, 0x2b, 0x1b, 0xa1,
        +	0x42, 0x2d, 0x6b, 0x95, 0x22, 0x1f, 0x91, 0xa5, 0x5d, 0xb3, 0x27, 0x30, 0x5e, 0x19, 0x53, 0xc5,
        +	0xbe, 0x58, 0x7c, 0x4c, 0xf6, 0x91, 0xc5, 0xbe, 0x77, 0xd0, 0x06, 0x85, 0x26, 0xd4, 0x60, 0xbf,
        +	0x62, 0x4f, 0x61, 0xa2, 0x50, 0x57, 0xb2, 0xd4, 0x18, 0xeb, 0xe2, 0x27, 0xe4, 0x7b, 0x14, 0xce,
        +	0xb8, 0x01, 0xcf, 0x8b, 0x9f, 0xd0, 0x9d, 0x7d, 0x89, 0x4a, 0xa1, 0xe2, 0x53, 0x57, 0x9d, 0x66,
        +	0x6d, 0xab, 0x53, 0x6b, 0x54, 0x71, 0x92, 0x63, 0x69, 0xf8, 0x8c, 0xac, 0x43, 0x8b, 0xbc, 0xb0,
        +	0x00, 0x0b, 0x61, 0x52, 0x2b, 0x11, 0xaf, 0x93, 0x2a, 0xc6, 0xd2, 0xa8, 0x6b, 0xbe, 0xef, 0x62,
        +	0xab, 0x95, 0x78, 0x95, 0x54, 0x27, 0x16, 0xb2, 0xdb, 0xa7, 0x72, 0xfd, 0x8f, 0xa2, 0xc4, 0x8c,
        +	0x33, 0x97, 0x5a, 0xb3, 0xb6, 0x0c, 0x4c, 0xaa, 0x22, 0x6e, 0x8a, 0x75, 0x67, 0x1e, 0x2c, 0xba,
        +	0x11, 0x24, 0x55, 0xf1, 0xca, 0xd7, 0x8b, 0xc1, 0xce, 0x4a, 0x6a, 0xc3, 0x0f, 0xe8, 0x64, 0x7a,
        +	0xb6, 0x58, 0x6a, 0xb1, 0xbb, 0xf3, 0x60, 0x11, 0x44, 0xf4, 0xcc, 0x9e, 0xc1, 0xd4, 0x24, 0xfa,
        +	0x6d, 0xfc, 0x43, 0x8d, 0x35, 0xc6, 0xd4, 0xe8, 0x7b, 0xf4, 0xca, 0xc4, 0xc2, 0xdf, 0x59, 0xf4,
        +	0xb5, 0xed, 0xf6, 0x43, 0x18, 0x92, 0x1f, 0x79, 0x7c, 0xe0, 0x92, 0xb5, 0x00, 0x19, 0x0f, 0xe1,
        +	0xce, 0x8f, 0x89, 0x8e, 0x85, 0x4c, 0xb2, 0xa2, 0xcc, 0x63, 0xcf, 0x3e, 0xce, 0xe7, 0xc1, 0x62,
        +	0x10, 0xed, 0xff, 0x98, 0xe8, 0xa5, 0xb3, 0x34, 0x83, 0xfb, 0x04, 0xc6, 0x15, 0x96, 0xe4, 0x4b,
        +	0xfc, 0xb8, 0x4f, 0xe1, 0x8f, 0x3c, 0x46, 0x1c, 0xf9, 0xd8, 0x36, 0xa0, 0x12, 0x45, 0x9a, 0xc4,
        +	0x45, 0x99, 0xe1, 0x15, 0x7f, 0x30, 0x0f, 0x16, 0xbd, 0xe3, 0xce, 0xa7, 0x9f, 0xd9, 0x26, 0x90,
        +	0xe1, 0xd4, 0xe2, 0x6c, 0x0e, 0x83, 0xcb, 0xa2, 0x2c, 0xf4, 0x0a, 0x33, 0xfe, 0xd0, 0x1e, 0x78,
        +	0xbc, 0x63, 0x54, 0x8d, 0x51, 0x8b, 0xda, 0xd0, 0x53, 0x21, 0x4b, 0x8c, 0xdf, 0xe2, 0x35, 0xff,
        +	0x3d, 0x09, 0xc0, 0x80, 0x80, 0x6f, 0xf1, 0x9a, 0x3d, 0x83, 0x1d, 0x52, 0xab, 0x47, 0xa4, 0x56,
        +	0x6c, 0x7b, 0x3a, 0x48, 0xa6, 0xc8, 0xce, 0xfe, 0x08, 0x33, 0xfb, 0xaf, 0xe3, 0xa2, 0x4c, 0xe5,
        +	0xba, 0x12, 0x68, 0x90, 0x7f, 0x48, 0xf9, 0x4d, 0x09, 0x3f, 0x6d, 0x61, 0xf6, 0x09, 0x30, 0x3b,
        +	0xed, 0x6e, 0x9b, 0x58, 0xa1, 0xc0, 0x44, 0x23, 0x7f, 0x46, 0x07, 0xcf, 0x92, 0xaa, 0x3a, 0x21,
        +	0x43, 0xe4, 0x70, 0xdb, 0x49, 0xbc, 0x2a, 0x4c, 0xac, 0x30, 0xd1, 0xb2, 0xe4, 0x7f, 0xb0, 0x69,
        +	0x46, 0x60, 0xa1, 0x88, 0x10, 0xf6, 0x05, 0xdc, 0xb3, 0xc5, 0x35, 0x2b, 0x25, 0x8d, 0x11, 0x98,
        +	0xc5, 0x97, 0x52, 0xb9, 0xb2, 0x3d, 0xa6, 0xf3, 0x6d, 0xe9, 0x2f, 0x1a, 0xe3, 0xd7, 0x52, 0x51,
        +	0xf9, 0xbe, 0x84, 0x07, 0x3f, 0x7f, 0xc9, 0xf7, 0x45, 0xf3, 0x39, 0xbd, 0xf8, 0xc1, 0xad, 0x17,
        +	0x7d, 0x77, 0x34, 0xdd, 0x17, 0xed, 0x8b, 0x74, 0xd2, 0x13, 0x6a, 0xd0, 0xa4, 0x45, 0xe9, 0x8c,
        +	0xc7, 0x30, 0xb2, 0x97, 0x1a, 0x2a, 0x47, 0x8a, 0x90, 0x12, 0x04, 0x07, 0x59, 0x5a, 0x84, 0x7f,
        +	0x83, 0xd9, 0x52, 0xe6, 0xaf, 0x48, 0xc8, 0x9a, 0x81, 0xdb, 0xd2, 0xbc, 0xe0, 0x7d, 0x35, 0x2f,
        +	0xd8, 0xd2, 0xbc, 0xf0, 0xbf, 0x3d, 0xd8, 0x5b, 0xca, 0x3c, 0xc2, 0x24, 0x6b, 0x28, 0xf5, 0x0b,
        +	0x12, 0x7b, 0x7b, 0xa3, 0xee, 0xb6, 0x78, 0x7e, 0x05, 0x7b, 0x3e, 0x9a, 0x46, 0x23, 0xee, 0x10,
        +	0x0f, 0x1e, 0x6e, 0xf3, 0x60, 0x2b, 0x85, 0x68, 0xb2, 0xde, 0xca, 0x68, 0x5b, 0x07, 0xbb, 0x54,
        +	0xa9, 0x5f, 0xd0, 0xc1, 0x1d, 0x32, 0xb6, 0x3a, 0x78, 0xa3, 0xcd, 0xbd, 0xf7, 0xd0, 0xe6, 0x6d,
        +	0xa1, 0xdf, 0x9d, 0x77, 0xb7, 0x85, 0xfe, 0x39, 0xec, 0xaf, 0x8b, 0xb2, 0x58, 0xd7, 0xeb, 0x98,
        +	0xae, 0x60, 0xba, 0xb5, 0xfa, 0xc4, 0xa6, 0xa9, 0x37, 0x58, 0x46, 0xd3, 0xfd, 0xf5, 0x29, 0xb0,
        +	0xa2, 0x4c, 0x45, 0x9d, 0xe1, 0x26, 0x9d, 0x07, 0x6e, 0x5c, 0xbd, 0x65, 0x83, 0xd0, 0x07, 0xd0,
        +	0x4b, 0x65, 0x5d, 0x1a, 0x3e, 0xa4, 0xf8, 0xdd, 0xc2, 0xd2, 0xbc, 0x91, 0x23, 0x3a, 0x51, 0x61,
        +	0x8e, 0x57, 0x7c, 0x8f, 0x7a, 0x35, 0x6b, 0x2c, 0xd4, 0xa5, 0x1c, 0xaf, 0x6c, 0xf4, 0x56, 0x83,
        +	0xbc, 0x97, 0x53, 0xcb, 0xa1, 0x45, 0x9c, 0xf9, 0xe9, 0xed, 0x71, 0x9f, 0x51, 0xe4, 0xdb, 0xa3,
        +	0xbe, 0x80, 0x59, 0x13, 0xb6, 0xed, 0x35, 0x7d, 0x23, 0x00, 0x05, 0xbd, 0xe7, 0x71, 0xf7, 0x75,
        +	0xa1, 0xd9, 0x11, 0x1c, 0x34, 0x1e, 0x71, 0x85, 0x2d, 0xf3, 0xf9, 0x3e, 0xed, 0xba, 0x9f, 0x38,
        +	0xb7, 0xbf, 0xa2, 0xda, 0x50, 0xa4, 0x66, 0x6b, 0x92, 0xcd, 0x11, 0x6d, 0x3b, 0xf2, 0xd8, 0x37,
        +	0x56, 0x29, 0x1f, 0xc3, 0xa8, 0x3d, 0x5d, 0x08, 0x3e, 0x26, 0x0f, 0x68, 0x0e, 0x16, 0xc2, 0x8e,
        +	0x4d, 0x9a, 0xa4, 0x2b, 0x8c, 0x0b, 0x83, 0x2a, 0x31, 0x52, 0xf1, 0x09, 0xf9, 0x4c, 0x08, 0x3d,
        +	0xf5, 0xa0, 0xad, 0x44, 0x59, 0xaf, 0x63, 0xbd, 0x4a, 0x54, 0xa6, 0x39, 0xa3, 0x88, 0x86, 0x65,
        +	0xbd, 0x3e, 0x27, 0x20, 0xfc, 0x57, 0x40, 0xdf, 0x83, 0x8e, 0xdb, 0xee, 0xb2, 0x61, 0x1f, 0x43,
        +	0x57, 0xc8, 0x9c, 0x07, 0xc4, 0xcd, 0xbb, 0x1b, 0x2c, 0xb9, 0xf9, 0xc6, 0x88, 0xac, 0xc7, 0x06,
        +	0xa3, 0x3a, 0xef, 0xc1, 0xa8, 0x10, 0x26, 0x22, 0xd1, 0x26, 0x6e, 0xf9, 0xe9, 0xc8, 0x3b, 0xb2,
        +	0xe0, 0x89, 0xe3, 0x68, 0xf8, 0x9f, 0x80, 0x46, 0xed, 0x8d, 0xfd, 0xac, 0x89, 0x30, 0x95, 0xea,
        +	0xf6, 0x4c, 0x05, 0xb7, 0x86, 0xf3, 0xd6, 0x3c, 0x74, 0x5c, 0x7e, 0xff, 0x7f, 0x1e, 0xba, 0x64,
        +	0x6c, 0xe7, 0xa1, 0xe5, 0xd9, 0xce, 0x26, 0xcf, 0x1e, 0x01, 0x18, 0x69, 0x12, 0xe1, 0xee, 0xe1,
        +	0x9e, 0x9b, 0x2f, 0x42, 0xe8, 0x12, 0xe6, 0xd0, 0x57, 0x14, 0x97, 0xe6, 0xbb, 0x6e, 0x3b, 0xbf,
        +	0x0c, 0xff, 0xdd, 0xa1, 0x4a, 0xfa, 0xd0, 0x7f, 0x8b, 0x4c, 0xfc, 0x7c, 0xc4, 0x7b, 0xbf, 0x36,
        +	0xe2, 0xbd, 0xcd, 0x11, 0x9f, 0xd9, 0xcf, 0x11, 0x51, 0x1b, 0xbb, 0xf7, 0x4a, 0xd6, 0x4a, 0x53,
        +	0x0a, 0x93, 0xe3, 0xe0, 0xb3, 0x68, 0x7a, 0x63, 0xfa, 0xc6, 0x5a, 0xec, 0x25, 0xe3, 0x07, 0xa7,
        +	0xd1, 0x23, 0x97, 0xd4, 0x20, 0x9a, 0x7a, 0xdc, 0x8b, 0x0e, 0x7d, 0xa0, 0xd4, 0x36, 0xb1, 0x56,
        +	0xb8, 0xdc, 0xa8, 0x8f, 0x09, 0x6c, 0xa4, 0xe9, 0x29, 0x4c, 0x9a, 0x7d, 0x62, 0x59, 0x8a, 0x6b,
        +	0x3f, 0xe2, 0xe3, 0x06, 0x3c, 0x2b, 0xc5, 0x75, 0x78, 0x45, 0x2a, 0xed, 0xab, 0xe4, 0x09, 0x77,
        +	0x04, 0x3d, 0xda, 0xc8, 0x53, 0xee, 0xfe, 0x36, 0x8d, 0x36, 0xc8, 0x10, 0x39, 0x3f, 0xf6, 0x05,
        +	0xf4, 0x75, 0xbd, 0x5e, 0x27, 0xea, 0xda, 0x33, 0xef, 0x57, 0x5e, 0x69, 0x3c, 0xbf, 0xea, 0xfd,
        +	0xdd, 0x92, 0xf6, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x70, 0xd9, 0xa0, 0xf8, 0x48, 0x0d, 0x00,
        +	0x00,
         }
        diff --git a/vendor/google.golang.org/appengine/internal/main.go b/vendor/google.golang.org/appengine/internal/main.go
        index 49036163c..1e765312f 100644
        --- a/vendor/google.golang.org/appengine/internal/main.go
        +++ b/vendor/google.golang.org/appengine/internal/main.go
        @@ -11,5 +11,6 @@ import (
         )
         
         func Main() {
        +	MainPath = ""
         	appengine_internal.Main()
         }
        diff --git a/vendor/google.golang.org/appengine/internal/main_common.go b/vendor/google.golang.org/appengine/internal/main_common.go
        new file mode 100644
        index 000000000..357dce4dd
        --- /dev/null
        +++ b/vendor/google.golang.org/appengine/internal/main_common.go
        @@ -0,0 +1,7 @@
        +package internal
        +
        +// MainPath stores the file path of the main package. On App Engine Standard
        +// using Go version 1.9 and below, this will be unset. On App Engine Flex and
        +// App Engine Standard second-gen (Go 1.11 and above), this will be the
        +// filepath to package main.
        +var MainPath string
        diff --git a/vendor/google.golang.org/appengine/internal/main_vm.go b/vendor/google.golang.org/appengine/internal/main_vm.go
        index 57331ad17..ddb79a333 100644
        --- a/vendor/google.golang.org/appengine/internal/main_vm.go
        +++ b/vendor/google.golang.org/appengine/internal/main_vm.go
        @@ -12,9 +12,12 @@ import (
         	"net/http"
         	"net/url"
         	"os"
        +	"path/filepath"
        +	"runtime"
         )
         
         func Main() {
        +	MainPath = filepath.Dir(findMainPath())
         	installHealthChecker(http.DefaultServeMux)
         
         	port := "8080"
        @@ -22,11 +25,33 @@ func Main() {
         		port = s
         	}
         
        -	if err := http.ListenAndServe(":"+port, http.HandlerFunc(handleHTTP)); err != nil {
        +	host := ""
        +	if IsDevAppServer() {
        +		host = "127.0.0.1"
        +	}
        +	if err := http.ListenAndServe(host+":"+port, http.HandlerFunc(handleHTTP)); err != nil {
         		log.Fatalf("http.ListenAndServe: %v", err)
         	}
         }
         
        +// Find the path to package main by looking at the root Caller.
        +func findMainPath() string {
        +	pc := make([]uintptr, 100)
        +	n := runtime.Callers(2, pc)
        +	frames := runtime.CallersFrames(pc[:n])
        +	for {
        +		frame, more := frames.Next()
        +		// Tests won't have package main, instead they have testing.tRunner
        +		if frame.Function == "main.main" || frame.Function == "testing.tRunner" {
        +			return frame.File
        +		}
        +		if !more {
        +			break
        +		}
        +	}
        +	return ""
        +}
        +
         func installHealthChecker(mux *http.ServeMux) {
         	// If no health check handler has been installed by this point, add a trivial one.
         	const healthPath = "/_ah/health"
        diff --git a/vendor/google.golang.org/appengine/internal/metadata.go b/vendor/google.golang.org/appengine/internal/metadata.go
        index 9cc1f71d1..c4ba63bb4 100644
        --- a/vendor/google.golang.org/appengine/internal/metadata.go
        +++ b/vendor/google.golang.org/appengine/internal/metadata.go
        @@ -12,7 +12,6 @@ package internal
         import (
         	"fmt"
         	"io/ioutil"
        -	"log"
         	"net/http"
         	"net/url"
         )
        @@ -32,7 +31,7 @@ var (
         func mustGetMetadata(key string) []byte {
         	b, err := getMetadata(key)
         	if err != nil {
        -		log.Fatalf("Metadata fetch failed: %v", err)
        +		panic(fmt.Sprintf("Metadata fetch failed for '%s': %v", key, err))
         	}
         	return b
         }
        diff --git a/vendor/google.golang.org/appengine/internal/modules/modules_service.pb.go b/vendor/google.golang.org/appengine/internal/modules/modules_service.pb.go
        index a0145ed31..ddfc0c04a 100644
        --- a/vendor/google.golang.org/appengine/internal/modules/modules_service.pb.go
        +++ b/vendor/google.golang.org/appengine/internal/modules/modules_service.pb.go
        @@ -1,32 +1,6 @@
        -// Code generated by protoc-gen-go.
        +// Code generated by protoc-gen-go. DO NOT EDIT.
         // source: google.golang.org/appengine/internal/modules/modules_service.proto
        -// DO NOT EDIT!
        -
        -/*
        -Package modules is a generated protocol buffer package.
        -
        -It is generated from these files:
        -	google.golang.org/appengine/internal/modules/modules_service.proto
        -
        -It has these top-level messages:
        -	ModulesServiceError
        -	GetModulesRequest
        -	GetModulesResponse
        -	GetVersionsRequest
        -	GetVersionsResponse
        -	GetDefaultVersionRequest
        -	GetDefaultVersionResponse
        -	GetNumInstancesRequest
        -	GetNumInstancesResponse
        -	SetNumInstancesRequest
        -	SetNumInstancesResponse
        -	StartModuleRequest
        -	StartModuleResponse
        -	StopModuleRequest
        -	StopModuleResponse
        -	GetHostnameRequest
        -	GetHostnameResponse
        -*/
        +
         package modules
         
         import proto "github.com/golang/protobuf/proto"
        @@ -38,6 +12,12 @@ var _ = proto.Marshal
         var _ = fmt.Errorf
         var _ = math.Inf
         
        +// This is a compile-time assertion to ensure that this generated file
        +// is compatible with the proto package it is being compiled against.
        +// A compilation error at this line likely means your copy of the
        +// proto package needs to be updated.
        +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
        +
         type ModulesServiceError_ErrorCode int32
         
         const (
        @@ -82,31 +62,100 @@ func (x *ModulesServiceError_ErrorCode) UnmarshalJSON(data []byte) error {
         	*x = ModulesServiceError_ErrorCode(value)
         	return nil
         }
        +func (ModulesServiceError_ErrorCode) EnumDescriptor() ([]byte, []int) {
        +	return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{0, 0}
        +}
         
         type ModulesServiceError struct {
        -	XXX_unrecognized []byte `json:"-"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *ModulesServiceError) Reset()         { *m = ModulesServiceError{} }
         func (m *ModulesServiceError) String() string { return proto.CompactTextString(m) }
         func (*ModulesServiceError) ProtoMessage()    {}
        +func (*ModulesServiceError) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{0}
        +}
        +func (m *ModulesServiceError) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_ModulesServiceError.Unmarshal(m, b)
        +}
        +func (m *ModulesServiceError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_ModulesServiceError.Marshal(b, m, deterministic)
        +}
        +func (dst *ModulesServiceError) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_ModulesServiceError.Merge(dst, src)
        +}
        +func (m *ModulesServiceError) XXX_Size() int {
        +	return xxx_messageInfo_ModulesServiceError.Size(m)
        +}
        +func (m *ModulesServiceError) XXX_DiscardUnknown() {
        +	xxx_messageInfo_ModulesServiceError.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_ModulesServiceError proto.InternalMessageInfo
         
         type GetModulesRequest struct {
        -	XXX_unrecognized []byte `json:"-"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *GetModulesRequest) Reset()         { *m = GetModulesRequest{} }
         func (m *GetModulesRequest) String() string { return proto.CompactTextString(m) }
         func (*GetModulesRequest) ProtoMessage()    {}
        +func (*GetModulesRequest) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{1}
        +}
        +func (m *GetModulesRequest) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_GetModulesRequest.Unmarshal(m, b)
        +}
        +func (m *GetModulesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_GetModulesRequest.Marshal(b, m, deterministic)
        +}
        +func (dst *GetModulesRequest) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_GetModulesRequest.Merge(dst, src)
        +}
        +func (m *GetModulesRequest) XXX_Size() int {
        +	return xxx_messageInfo_GetModulesRequest.Size(m)
        +}
        +func (m *GetModulesRequest) XXX_DiscardUnknown() {
        +	xxx_messageInfo_GetModulesRequest.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_GetModulesRequest proto.InternalMessageInfo
         
         type GetModulesResponse struct {
        -	Module           []string `protobuf:"bytes,1,rep,name=module" json:"module,omitempty"`
        -	XXX_unrecognized []byte   `json:"-"`
        +	Module               []string `protobuf:"bytes,1,rep,name=module" json:"module,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *GetModulesResponse) Reset()         { *m = GetModulesResponse{} }
         func (m *GetModulesResponse) String() string { return proto.CompactTextString(m) }
         func (*GetModulesResponse) ProtoMessage()    {}
        +func (*GetModulesResponse) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{2}
        +}
        +func (m *GetModulesResponse) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_GetModulesResponse.Unmarshal(m, b)
        +}
        +func (m *GetModulesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_GetModulesResponse.Marshal(b, m, deterministic)
        +}
        +func (dst *GetModulesResponse) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_GetModulesResponse.Merge(dst, src)
        +}
        +func (m *GetModulesResponse) XXX_Size() int {
        +	return xxx_messageInfo_GetModulesResponse.Size(m)
        +}
        +func (m *GetModulesResponse) XXX_DiscardUnknown() {
        +	xxx_messageInfo_GetModulesResponse.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_GetModulesResponse proto.InternalMessageInfo
         
         func (m *GetModulesResponse) GetModule() []string {
         	if m != nil {
        @@ -116,13 +165,35 @@ func (m *GetModulesResponse) GetModule() []string {
         }
         
         type GetVersionsRequest struct {
        -	Module           *string `protobuf:"bytes,1,opt,name=module" json:"module,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	Module               *string  `protobuf:"bytes,1,opt,name=module" json:"module,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *GetVersionsRequest) Reset()         { *m = GetVersionsRequest{} }
         func (m *GetVersionsRequest) String() string { return proto.CompactTextString(m) }
         func (*GetVersionsRequest) ProtoMessage()    {}
        +func (*GetVersionsRequest) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{3}
        +}
        +func (m *GetVersionsRequest) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_GetVersionsRequest.Unmarshal(m, b)
        +}
        +func (m *GetVersionsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_GetVersionsRequest.Marshal(b, m, deterministic)
        +}
        +func (dst *GetVersionsRequest) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_GetVersionsRequest.Merge(dst, src)
        +}
        +func (m *GetVersionsRequest) XXX_Size() int {
        +	return xxx_messageInfo_GetVersionsRequest.Size(m)
        +}
        +func (m *GetVersionsRequest) XXX_DiscardUnknown() {
        +	xxx_messageInfo_GetVersionsRequest.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_GetVersionsRequest proto.InternalMessageInfo
         
         func (m *GetVersionsRequest) GetModule() string {
         	if m != nil && m.Module != nil {
        @@ -132,13 +203,35 @@ func (m *GetVersionsRequest) GetModule() string {
         }
         
         type GetVersionsResponse struct {
        -	Version          []string `protobuf:"bytes,1,rep,name=version" json:"version,omitempty"`
        -	XXX_unrecognized []byte   `json:"-"`
        +	Version              []string `protobuf:"bytes,1,rep,name=version" json:"version,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *GetVersionsResponse) Reset()         { *m = GetVersionsResponse{} }
         func (m *GetVersionsResponse) String() string { return proto.CompactTextString(m) }
         func (*GetVersionsResponse) ProtoMessage()    {}
        +func (*GetVersionsResponse) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{4}
        +}
        +func (m *GetVersionsResponse) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_GetVersionsResponse.Unmarshal(m, b)
        +}
        +func (m *GetVersionsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_GetVersionsResponse.Marshal(b, m, deterministic)
        +}
        +func (dst *GetVersionsResponse) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_GetVersionsResponse.Merge(dst, src)
        +}
        +func (m *GetVersionsResponse) XXX_Size() int {
        +	return xxx_messageInfo_GetVersionsResponse.Size(m)
        +}
        +func (m *GetVersionsResponse) XXX_DiscardUnknown() {
        +	xxx_messageInfo_GetVersionsResponse.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_GetVersionsResponse proto.InternalMessageInfo
         
         func (m *GetVersionsResponse) GetVersion() []string {
         	if m != nil {
        @@ -148,13 +241,35 @@ func (m *GetVersionsResponse) GetVersion() []string {
         }
         
         type GetDefaultVersionRequest struct {
        -	Module           *string `protobuf:"bytes,1,opt,name=module" json:"module,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	Module               *string  `protobuf:"bytes,1,opt,name=module" json:"module,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *GetDefaultVersionRequest) Reset()         { *m = GetDefaultVersionRequest{} }
         func (m *GetDefaultVersionRequest) String() string { return proto.CompactTextString(m) }
         func (*GetDefaultVersionRequest) ProtoMessage()    {}
        +func (*GetDefaultVersionRequest) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{5}
        +}
        +func (m *GetDefaultVersionRequest) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_GetDefaultVersionRequest.Unmarshal(m, b)
        +}
        +func (m *GetDefaultVersionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_GetDefaultVersionRequest.Marshal(b, m, deterministic)
        +}
        +func (dst *GetDefaultVersionRequest) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_GetDefaultVersionRequest.Merge(dst, src)
        +}
        +func (m *GetDefaultVersionRequest) XXX_Size() int {
        +	return xxx_messageInfo_GetDefaultVersionRequest.Size(m)
        +}
        +func (m *GetDefaultVersionRequest) XXX_DiscardUnknown() {
        +	xxx_messageInfo_GetDefaultVersionRequest.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_GetDefaultVersionRequest proto.InternalMessageInfo
         
         func (m *GetDefaultVersionRequest) GetModule() string {
         	if m != nil && m.Module != nil {
        @@ -164,13 +279,35 @@ func (m *GetDefaultVersionRequest) GetModule() string {
         }
         
         type GetDefaultVersionResponse struct {
        -	Version          *string `protobuf:"bytes,1,req,name=version" json:"version,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	Version              *string  `protobuf:"bytes,1,req,name=version" json:"version,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *GetDefaultVersionResponse) Reset()         { *m = GetDefaultVersionResponse{} }
         func (m *GetDefaultVersionResponse) String() string { return proto.CompactTextString(m) }
         func (*GetDefaultVersionResponse) ProtoMessage()    {}
        +func (*GetDefaultVersionResponse) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{6}
        +}
        +func (m *GetDefaultVersionResponse) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_GetDefaultVersionResponse.Unmarshal(m, b)
        +}
        +func (m *GetDefaultVersionResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_GetDefaultVersionResponse.Marshal(b, m, deterministic)
        +}
        +func (dst *GetDefaultVersionResponse) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_GetDefaultVersionResponse.Merge(dst, src)
        +}
        +func (m *GetDefaultVersionResponse) XXX_Size() int {
        +	return xxx_messageInfo_GetDefaultVersionResponse.Size(m)
        +}
        +func (m *GetDefaultVersionResponse) XXX_DiscardUnknown() {
        +	xxx_messageInfo_GetDefaultVersionResponse.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_GetDefaultVersionResponse proto.InternalMessageInfo
         
         func (m *GetDefaultVersionResponse) GetVersion() string {
         	if m != nil && m.Version != nil {
        @@ -180,14 +317,36 @@ func (m *GetDefaultVersionResponse) GetVersion() string {
         }
         
         type GetNumInstancesRequest struct {
        -	Module           *string `protobuf:"bytes,1,opt,name=module" json:"module,omitempty"`
        -	Version          *string `protobuf:"bytes,2,opt,name=version" json:"version,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	Module               *string  `protobuf:"bytes,1,opt,name=module" json:"module,omitempty"`
        +	Version              *string  `protobuf:"bytes,2,opt,name=version" json:"version,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *GetNumInstancesRequest) Reset()         { *m = GetNumInstancesRequest{} }
         func (m *GetNumInstancesRequest) String() string { return proto.CompactTextString(m) }
         func (*GetNumInstancesRequest) ProtoMessage()    {}
        +func (*GetNumInstancesRequest) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{7}
        +}
        +func (m *GetNumInstancesRequest) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_GetNumInstancesRequest.Unmarshal(m, b)
        +}
        +func (m *GetNumInstancesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_GetNumInstancesRequest.Marshal(b, m, deterministic)
        +}
        +func (dst *GetNumInstancesRequest) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_GetNumInstancesRequest.Merge(dst, src)
        +}
        +func (m *GetNumInstancesRequest) XXX_Size() int {
        +	return xxx_messageInfo_GetNumInstancesRequest.Size(m)
        +}
        +func (m *GetNumInstancesRequest) XXX_DiscardUnknown() {
        +	xxx_messageInfo_GetNumInstancesRequest.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_GetNumInstancesRequest proto.InternalMessageInfo
         
         func (m *GetNumInstancesRequest) GetModule() string {
         	if m != nil && m.Module != nil {
        @@ -204,13 +363,35 @@ func (m *GetNumInstancesRequest) GetVersion() string {
         }
         
         type GetNumInstancesResponse struct {
        -	Instances        *int64 `protobuf:"varint,1,req,name=instances" json:"instances,omitempty"`
        -	XXX_unrecognized []byte `json:"-"`
        +	Instances            *int64   `protobuf:"varint,1,req,name=instances" json:"instances,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *GetNumInstancesResponse) Reset()         { *m = GetNumInstancesResponse{} }
         func (m *GetNumInstancesResponse) String() string { return proto.CompactTextString(m) }
         func (*GetNumInstancesResponse) ProtoMessage()    {}
        +func (*GetNumInstancesResponse) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{8}
        +}
        +func (m *GetNumInstancesResponse) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_GetNumInstancesResponse.Unmarshal(m, b)
        +}
        +func (m *GetNumInstancesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_GetNumInstancesResponse.Marshal(b, m, deterministic)
        +}
        +func (dst *GetNumInstancesResponse) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_GetNumInstancesResponse.Merge(dst, src)
        +}
        +func (m *GetNumInstancesResponse) XXX_Size() int {
        +	return xxx_messageInfo_GetNumInstancesResponse.Size(m)
        +}
        +func (m *GetNumInstancesResponse) XXX_DiscardUnknown() {
        +	xxx_messageInfo_GetNumInstancesResponse.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_GetNumInstancesResponse proto.InternalMessageInfo
         
         func (m *GetNumInstancesResponse) GetInstances() int64 {
         	if m != nil && m.Instances != nil {
        @@ -220,15 +401,37 @@ func (m *GetNumInstancesResponse) GetInstances() int64 {
         }
         
         type SetNumInstancesRequest struct {
        -	Module           *string `protobuf:"bytes,1,opt,name=module" json:"module,omitempty"`
        -	Version          *string `protobuf:"bytes,2,opt,name=version" json:"version,omitempty"`
        -	Instances        *int64  `protobuf:"varint,3,req,name=instances" json:"instances,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	Module               *string  `protobuf:"bytes,1,opt,name=module" json:"module,omitempty"`
        +	Version              *string  `protobuf:"bytes,2,opt,name=version" json:"version,omitempty"`
        +	Instances            *int64   `protobuf:"varint,3,req,name=instances" json:"instances,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *SetNumInstancesRequest) Reset()         { *m = SetNumInstancesRequest{} }
         func (m *SetNumInstancesRequest) String() string { return proto.CompactTextString(m) }
         func (*SetNumInstancesRequest) ProtoMessage()    {}
        +func (*SetNumInstancesRequest) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{9}
        +}
        +func (m *SetNumInstancesRequest) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_SetNumInstancesRequest.Unmarshal(m, b)
        +}
        +func (m *SetNumInstancesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_SetNumInstancesRequest.Marshal(b, m, deterministic)
        +}
        +func (dst *SetNumInstancesRequest) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_SetNumInstancesRequest.Merge(dst, src)
        +}
        +func (m *SetNumInstancesRequest) XXX_Size() int {
        +	return xxx_messageInfo_SetNumInstancesRequest.Size(m)
        +}
        +func (m *SetNumInstancesRequest) XXX_DiscardUnknown() {
        +	xxx_messageInfo_SetNumInstancesRequest.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_SetNumInstancesRequest proto.InternalMessageInfo
         
         func (m *SetNumInstancesRequest) GetModule() string {
         	if m != nil && m.Module != nil {
        @@ -252,22 +455,66 @@ func (m *SetNumInstancesRequest) GetInstances() int64 {
         }
         
         type SetNumInstancesResponse struct {
        -	XXX_unrecognized []byte `json:"-"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *SetNumInstancesResponse) Reset()         { *m = SetNumInstancesResponse{} }
         func (m *SetNumInstancesResponse) String() string { return proto.CompactTextString(m) }
         func (*SetNumInstancesResponse) ProtoMessage()    {}
        +func (*SetNumInstancesResponse) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{10}
        +}
        +func (m *SetNumInstancesResponse) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_SetNumInstancesResponse.Unmarshal(m, b)
        +}
        +func (m *SetNumInstancesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_SetNumInstancesResponse.Marshal(b, m, deterministic)
        +}
        +func (dst *SetNumInstancesResponse) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_SetNumInstancesResponse.Merge(dst, src)
        +}
        +func (m *SetNumInstancesResponse) XXX_Size() int {
        +	return xxx_messageInfo_SetNumInstancesResponse.Size(m)
        +}
        +func (m *SetNumInstancesResponse) XXX_DiscardUnknown() {
        +	xxx_messageInfo_SetNumInstancesResponse.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_SetNumInstancesResponse proto.InternalMessageInfo
         
         type StartModuleRequest struct {
        -	Module           *string `protobuf:"bytes,1,req,name=module" json:"module,omitempty"`
        -	Version          *string `protobuf:"bytes,2,req,name=version" json:"version,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	Module               *string  `protobuf:"bytes,1,req,name=module" json:"module,omitempty"`
        +	Version              *string  `protobuf:"bytes,2,req,name=version" json:"version,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *StartModuleRequest) Reset()         { *m = StartModuleRequest{} }
         func (m *StartModuleRequest) String() string { return proto.CompactTextString(m) }
         func (*StartModuleRequest) ProtoMessage()    {}
        +func (*StartModuleRequest) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{11}
        +}
        +func (m *StartModuleRequest) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_StartModuleRequest.Unmarshal(m, b)
        +}
        +func (m *StartModuleRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_StartModuleRequest.Marshal(b, m, deterministic)
        +}
        +func (dst *StartModuleRequest) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_StartModuleRequest.Merge(dst, src)
        +}
        +func (m *StartModuleRequest) XXX_Size() int {
        +	return xxx_messageInfo_StartModuleRequest.Size(m)
        +}
        +func (m *StartModuleRequest) XXX_DiscardUnknown() {
        +	xxx_messageInfo_StartModuleRequest.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_StartModuleRequest proto.InternalMessageInfo
         
         func (m *StartModuleRequest) GetModule() string {
         	if m != nil && m.Module != nil {
        @@ -284,22 +531,66 @@ func (m *StartModuleRequest) GetVersion() string {
         }
         
         type StartModuleResponse struct {
        -	XXX_unrecognized []byte `json:"-"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *StartModuleResponse) Reset()         { *m = StartModuleResponse{} }
         func (m *StartModuleResponse) String() string { return proto.CompactTextString(m) }
         func (*StartModuleResponse) ProtoMessage()    {}
        +func (*StartModuleResponse) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{12}
        +}
        +func (m *StartModuleResponse) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_StartModuleResponse.Unmarshal(m, b)
        +}
        +func (m *StartModuleResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_StartModuleResponse.Marshal(b, m, deterministic)
        +}
        +func (dst *StartModuleResponse) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_StartModuleResponse.Merge(dst, src)
        +}
        +func (m *StartModuleResponse) XXX_Size() int {
        +	return xxx_messageInfo_StartModuleResponse.Size(m)
        +}
        +func (m *StartModuleResponse) XXX_DiscardUnknown() {
        +	xxx_messageInfo_StartModuleResponse.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_StartModuleResponse proto.InternalMessageInfo
         
         type StopModuleRequest struct {
        -	Module           *string `protobuf:"bytes,1,opt,name=module" json:"module,omitempty"`
        -	Version          *string `protobuf:"bytes,2,opt,name=version" json:"version,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	Module               *string  `protobuf:"bytes,1,opt,name=module" json:"module,omitempty"`
        +	Version              *string  `protobuf:"bytes,2,opt,name=version" json:"version,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *StopModuleRequest) Reset()         { *m = StopModuleRequest{} }
         func (m *StopModuleRequest) String() string { return proto.CompactTextString(m) }
         func (*StopModuleRequest) ProtoMessage()    {}
        +func (*StopModuleRequest) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{13}
        +}
        +func (m *StopModuleRequest) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_StopModuleRequest.Unmarshal(m, b)
        +}
        +func (m *StopModuleRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_StopModuleRequest.Marshal(b, m, deterministic)
        +}
        +func (dst *StopModuleRequest) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_StopModuleRequest.Merge(dst, src)
        +}
        +func (m *StopModuleRequest) XXX_Size() int {
        +	return xxx_messageInfo_StopModuleRequest.Size(m)
        +}
        +func (m *StopModuleRequest) XXX_DiscardUnknown() {
        +	xxx_messageInfo_StopModuleRequest.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_StopModuleRequest proto.InternalMessageInfo
         
         func (m *StopModuleRequest) GetModule() string {
         	if m != nil && m.Module != nil {
        @@ -316,23 +607,67 @@ func (m *StopModuleRequest) GetVersion() string {
         }
         
         type StopModuleResponse struct {
        -	XXX_unrecognized []byte `json:"-"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *StopModuleResponse) Reset()         { *m = StopModuleResponse{} }
         func (m *StopModuleResponse) String() string { return proto.CompactTextString(m) }
         func (*StopModuleResponse) ProtoMessage()    {}
        +func (*StopModuleResponse) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{14}
        +}
        +func (m *StopModuleResponse) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_StopModuleResponse.Unmarshal(m, b)
        +}
        +func (m *StopModuleResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_StopModuleResponse.Marshal(b, m, deterministic)
        +}
        +func (dst *StopModuleResponse) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_StopModuleResponse.Merge(dst, src)
        +}
        +func (m *StopModuleResponse) XXX_Size() int {
        +	return xxx_messageInfo_StopModuleResponse.Size(m)
        +}
        +func (m *StopModuleResponse) XXX_DiscardUnknown() {
        +	xxx_messageInfo_StopModuleResponse.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_StopModuleResponse proto.InternalMessageInfo
         
         type GetHostnameRequest struct {
        -	Module           *string `protobuf:"bytes,1,opt,name=module" json:"module,omitempty"`
        -	Version          *string `protobuf:"bytes,2,opt,name=version" json:"version,omitempty"`
        -	Instance         *string `protobuf:"bytes,3,opt,name=instance" json:"instance,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	Module               *string  `protobuf:"bytes,1,opt,name=module" json:"module,omitempty"`
        +	Version              *string  `protobuf:"bytes,2,opt,name=version" json:"version,omitempty"`
        +	Instance             *string  `protobuf:"bytes,3,opt,name=instance" json:"instance,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *GetHostnameRequest) Reset()         { *m = GetHostnameRequest{} }
         func (m *GetHostnameRequest) String() string { return proto.CompactTextString(m) }
         func (*GetHostnameRequest) ProtoMessage()    {}
        +func (*GetHostnameRequest) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{15}
        +}
        +func (m *GetHostnameRequest) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_GetHostnameRequest.Unmarshal(m, b)
        +}
        +func (m *GetHostnameRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_GetHostnameRequest.Marshal(b, m, deterministic)
        +}
        +func (dst *GetHostnameRequest) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_GetHostnameRequest.Merge(dst, src)
        +}
        +func (m *GetHostnameRequest) XXX_Size() int {
        +	return xxx_messageInfo_GetHostnameRequest.Size(m)
        +}
        +func (m *GetHostnameRequest) XXX_DiscardUnknown() {
        +	xxx_messageInfo_GetHostnameRequest.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_GetHostnameRequest proto.InternalMessageInfo
         
         func (m *GetHostnameRequest) GetModule() string {
         	if m != nil && m.Module != nil {
        @@ -356,13 +691,35 @@ func (m *GetHostnameRequest) GetInstance() string {
         }
         
         type GetHostnameResponse struct {
        -	Hostname         *string `protobuf:"bytes,1,req,name=hostname" json:"hostname,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	Hostname             *string  `protobuf:"bytes,1,req,name=hostname" json:"hostname,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *GetHostnameResponse) Reset()         { *m = GetHostnameResponse{} }
         func (m *GetHostnameResponse) String() string { return proto.CompactTextString(m) }
         func (*GetHostnameResponse) ProtoMessage()    {}
        +func (*GetHostnameResponse) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{16}
        +}
        +func (m *GetHostnameResponse) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_GetHostnameResponse.Unmarshal(m, b)
        +}
        +func (m *GetHostnameResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_GetHostnameResponse.Marshal(b, m, deterministic)
        +}
        +func (dst *GetHostnameResponse) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_GetHostnameResponse.Merge(dst, src)
        +}
        +func (m *GetHostnameResponse) XXX_Size() int {
        +	return xxx_messageInfo_GetHostnameResponse.Size(m)
        +}
        +func (m *GetHostnameResponse) XXX_DiscardUnknown() {
        +	xxx_messageInfo_GetHostnameResponse.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_GetHostnameResponse proto.InternalMessageInfo
         
         func (m *GetHostnameResponse) GetHostname() string {
         	if m != nil && m.Hostname != nil {
        @@ -372,4 +729,58 @@ func (m *GetHostnameResponse) GetHostname() string {
         }
         
         func init() {
        +	proto.RegisterType((*ModulesServiceError)(nil), "appengine.ModulesServiceError")
        +	proto.RegisterType((*GetModulesRequest)(nil), "appengine.GetModulesRequest")
        +	proto.RegisterType((*GetModulesResponse)(nil), "appengine.GetModulesResponse")
        +	proto.RegisterType((*GetVersionsRequest)(nil), "appengine.GetVersionsRequest")
        +	proto.RegisterType((*GetVersionsResponse)(nil), "appengine.GetVersionsResponse")
        +	proto.RegisterType((*GetDefaultVersionRequest)(nil), "appengine.GetDefaultVersionRequest")
        +	proto.RegisterType((*GetDefaultVersionResponse)(nil), "appengine.GetDefaultVersionResponse")
        +	proto.RegisterType((*GetNumInstancesRequest)(nil), "appengine.GetNumInstancesRequest")
        +	proto.RegisterType((*GetNumInstancesResponse)(nil), "appengine.GetNumInstancesResponse")
        +	proto.RegisterType((*SetNumInstancesRequest)(nil), "appengine.SetNumInstancesRequest")
        +	proto.RegisterType((*SetNumInstancesResponse)(nil), "appengine.SetNumInstancesResponse")
        +	proto.RegisterType((*StartModuleRequest)(nil), "appengine.StartModuleRequest")
        +	proto.RegisterType((*StartModuleResponse)(nil), "appengine.StartModuleResponse")
        +	proto.RegisterType((*StopModuleRequest)(nil), "appengine.StopModuleRequest")
        +	proto.RegisterType((*StopModuleResponse)(nil), "appengine.StopModuleResponse")
        +	proto.RegisterType((*GetHostnameRequest)(nil), "appengine.GetHostnameRequest")
        +	proto.RegisterType((*GetHostnameResponse)(nil), "appengine.GetHostnameResponse")
        +}
        +
        +func init() {
        +	proto.RegisterFile("google.golang.org/appengine/internal/modules/modules_service.proto", fileDescriptor_modules_service_9cd3bffe4e91c59a)
        +}
        +
        +var fileDescriptor_modules_service_9cd3bffe4e91c59a = []byte{
        +	// 457 bytes of a gzipped FileDescriptorProto
        +	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x94, 0xc1, 0x6f, 0xd3, 0x30,
        +	0x14, 0xc6, 0x69, 0x02, 0xdb, 0xf2, 0x0e, 0x90, 0x3a, 0x5b, 0xd7, 0x4d, 0x1c, 0x50, 0x4e, 0x1c,
        +	0x50, 0x2b, 0x90, 0x10, 0xe7, 0xae, 0x35, 0x25, 0xb0, 0xa5, 0x28, 0xce, 0x2a, 0xc4, 0xa5, 0x0a,
        +	0xdb, 0x23, 0x8b, 0x94, 0xda, 0xc1, 0x76, 0x77, 0xe4, 0xbf, 0xe0, 0xff, 0x45, 0x4b, 0xed, 0xb6,
        +	0x81, 0x4e, 0x45, 0x68, 0xa7, 0xe4, 0x7d, 0xfe, 0xfc, 0x7b, 0x9f, 0x5f, 0xac, 0xc0, 0x59, 0x2e,
        +	0x44, 0x5e, 0x62, 0x2f, 0x17, 0x65, 0xc6, 0xf3, 0x9e, 0x90, 0x79, 0x3f, 0xab, 0x2a, 0xe4, 0x79,
        +	0xc1, 0xb1, 0x5f, 0x70, 0x8d, 0x92, 0x67, 0x65, 0x7f, 0x2e, 0xae, 0x17, 0x25, 0x2a, 0xfb, 0x9c,
        +	0x29, 0x94, 0xb7, 0xc5, 0x15, 0xf6, 0x2a, 0x29, 0xb4, 0x20, 0xde, 0x6a, 0x47, 0xf8, 0xab, 0x05,
        +	0xc1, 0xc5, 0xd2, 0xc4, 0x96, 0x1e, 0x2a, 0xa5, 0x90, 0xe1, 0x4f, 0xf0, 0xea, 0x97, 0xa1, 0xb8,
        +	0x46, 0xb2, 0x07, 0xce, 0xe4, 0x93, 0xff, 0x88, 0x10, 0x78, 0x1a, 0xc5, 0xd3, 0xc1, 0x79, 0x34,
        +	0x9a, 0x5d, 0x4c, 0x46, 0x97, 0xe7, 0xd4, 0x6f, 0x91, 0x00, 0x9e, 0x59, 0x6d, 0x4a, 0x13, 0x16,
        +	0x4d, 0x62, 0xdf, 0x21, 0x47, 0xd0, 0xb6, 0x62, 0x14, 0xb3, 0x74, 0x10, 0x0f, 0x29, 0xf3, 0xdd,
        +	0x3b, 0x6f, 0x9a, 0x0c, 0x62, 0x16, 0xd1, 0x38, 0x9d, 0xd1, 0x24, 0x99, 0x24, 0xfe, 0x63, 0x72,
        +	0x08, 0xfe, 0x65, 0x4c, 0xbf, 0x7c, 0xa6, 0xc3, 0x94, 0x8e, 0x66, 0x2c, 0x1d, 0xa4, 0xd4, 0x7f,
        +	0x12, 0x06, 0xd0, 0x1e, 0xa3, 0x36, 0xc9, 0x12, 0xfc, 0xb1, 0x40, 0xa5, 0xc3, 0x57, 0x40, 0x36,
        +	0x45, 0x55, 0x09, 0xae, 0x90, 0x74, 0x60, 0x6f, 0x79, 0xcc, 0x6e, 0xeb, 0x85, 0xfb, 0xd2, 0x4b,
        +	0x4c, 0x65, 0xdc, 0x53, 0x94, 0xaa, 0x10, 0xdc, 0x32, 0x1a, 0xee, 0xd6, 0x86, 0xbb, 0x0f, 0x41,
        +	0xc3, 0x6d, 0xe0, 0x5d, 0xd8, 0xbf, 0x5d, 0x6a, 0x86, 0x6e, 0xcb, 0xf0, 0x0d, 0x74, 0xc7, 0xa8,
        +	0x47, 0xf8, 0x3d, 0x5b, 0x94, 0x76, 0xdf, 0xae, 0x26, 0x6f, 0xe1, 0x64, 0xcb, 0x9e, 0x6d, 0xad,
        +	0x9c, 0xcd, 0x56, 0x1f, 0xa1, 0x33, 0x46, 0x1d, 0x2f, 0xe6, 0x11, 0x57, 0x3a, 0xe3, 0x57, 0xb8,
        +	0xeb, 0x34, 0x9b, 0x2c, 0xa7, 0x5e, 0x58, 0xb1, 0xde, 0xc1, 0xf1, 0x5f, 0x2c, 0x13, 0xe0, 0x39,
        +	0x78, 0x85, 0x15, 0xeb, 0x08, 0x6e, 0xb2, 0x16, 0xc2, 0x1b, 0xe8, 0xb0, 0x07, 0x0a, 0xd1, 0xec,
        +	0xe4, 0xfe, 0xd9, 0xe9, 0x04, 0x8e, 0xd9, 0xf6, 0x88, 0xe1, 0x7b, 0x20, 0x4c, 0x67, 0xd2, 0xdc,
        +	0x81, 0x6d, 0x01, 0x9c, 0xfb, 0x02, 0x34, 0x26, 0x7a, 0x04, 0x41, 0x83, 0x63, 0xf0, 0x14, 0xda,
        +	0x4c, 0x8b, 0xea, 0x7e, 0xfa, 0xbf, 0xcd, 0xf8, 0xf0, 0x2e, 0xe5, 0x1a, 0x63, 0xe0, 0xdf, 0xea,
        +	0xfb, 0xf8, 0x41, 0x28, 0xcd, 0xb3, 0xf9, 0xff, 0xd3, 0xc9, 0x29, 0x1c, 0xd8, 0x59, 0x75, 0xdd,
        +	0x7a, 0x69, 0x55, 0x87, 0xaf, 0xeb, 0x5b, 0xbc, 0xee, 0x61, 0xbe, 0xec, 0x29, 0x1c, 0xdc, 0x18,
        +	0xcd, 0x8c, 0x68, 0x55, 0x9f, 0x79, 0x5f, 0xf7, 0xcd, 0x5f, 0xe2, 0x77, 0x00, 0x00, 0x00, 0xff,
        +	0xff, 0x6e, 0xbc, 0xe0, 0x61, 0x5c, 0x04, 0x00, 0x00,
         }
        diff --git a/vendor/google.golang.org/appengine/internal/regen.sh b/vendor/google.golang.org/appengine/internal/regen.sh
        old mode 100755
        new mode 100644
        diff --git a/vendor/google.golang.org/appengine/internal/remote_api/remote_api.pb.go b/vendor/google.golang.org/appengine/internal/remote_api/remote_api.pb.go
        index 526bd39e6..8d782a38e 100644
        --- a/vendor/google.golang.org/appengine/internal/remote_api/remote_api.pb.go
        +++ b/vendor/google.golang.org/appengine/internal/remote_api/remote_api.pb.go
        @@ -1,19 +1,6 @@
        -// Code generated by protoc-gen-go.
        +// Code generated by protoc-gen-go. DO NOT EDIT.
         // source: google.golang.org/appengine/internal/remote_api/remote_api.proto
        -// DO NOT EDIT!
         
        -/*
        -Package remote_api is a generated protocol buffer package.
        -
        -It is generated from these files:
        -	google.golang.org/appengine/internal/remote_api/remote_api.proto
        -
        -It has these top-level messages:
        -	Request
        -	ApplicationError
        -	RpcError
        -	Response
        -*/
         package remote_api
         
         import proto "github.com/golang/protobuf/proto"
        @@ -25,6 +12,12 @@ var _ = proto.Marshal
         var _ = fmt.Errorf
         var _ = math.Inf
         
        +// This is a compile-time assertion to ensure that this generated file
        +// is compatible with the proto package it is being compiled against.
        +// A compilation error at this line likely means your copy of the
        +// proto package needs to be updated.
        +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
        +
         type RpcError_ErrorCode int32
         
         const (
        @@ -90,18 +83,43 @@ func (x *RpcError_ErrorCode) UnmarshalJSON(data []byte) error {
         	*x = RpcError_ErrorCode(value)
         	return nil
         }
        +func (RpcError_ErrorCode) EnumDescriptor() ([]byte, []int) {
        +	return fileDescriptor_remote_api_1978114ec33a273d, []int{2, 0}
        +}
         
         type Request struct {
        -	ServiceName      *string `protobuf:"bytes,2,req,name=service_name" json:"service_name,omitempty"`
        -	Method           *string `protobuf:"bytes,3,req,name=method" json:"method,omitempty"`
        -	Request          []byte  `protobuf:"bytes,4,req,name=request" json:"request,omitempty"`
        -	RequestId        *string `protobuf:"bytes,5,opt,name=request_id" json:"request_id,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	ServiceName          *string  `protobuf:"bytes,2,req,name=service_name,json=serviceName" json:"service_name,omitempty"`
        +	Method               *string  `protobuf:"bytes,3,req,name=method" json:"method,omitempty"`
        +	Request              []byte   `protobuf:"bytes,4,req,name=request" json:"request,omitempty"`
        +	RequestId            *string  `protobuf:"bytes,5,opt,name=request_id,json=requestId" json:"request_id,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *Request) Reset()         { *m = Request{} }
         func (m *Request) String() string { return proto.CompactTextString(m) }
         func (*Request) ProtoMessage()    {}
        +func (*Request) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_remote_api_1978114ec33a273d, []int{0}
        +}
        +func (m *Request) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_Request.Unmarshal(m, b)
        +}
        +func (m *Request) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_Request.Marshal(b, m, deterministic)
        +}
        +func (dst *Request) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_Request.Merge(dst, src)
        +}
        +func (m *Request) XXX_Size() int {
        +	return xxx_messageInfo_Request.Size(m)
        +}
        +func (m *Request) XXX_DiscardUnknown() {
        +	xxx_messageInfo_Request.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_Request proto.InternalMessageInfo
         
         func (m *Request) GetServiceName() string {
         	if m != nil && m.ServiceName != nil {
        @@ -132,14 +150,36 @@ func (m *Request) GetRequestId() string {
         }
         
         type ApplicationError struct {
        -	Code             *int32  `protobuf:"varint,1,req,name=code" json:"code,omitempty"`
        -	Detail           *string `protobuf:"bytes,2,req,name=detail" json:"detail,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	Code                 *int32   `protobuf:"varint,1,req,name=code" json:"code,omitempty"`
        +	Detail               *string  `protobuf:"bytes,2,req,name=detail" json:"detail,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *ApplicationError) Reset()         { *m = ApplicationError{} }
         func (m *ApplicationError) String() string { return proto.CompactTextString(m) }
         func (*ApplicationError) ProtoMessage()    {}
        +func (*ApplicationError) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_remote_api_1978114ec33a273d, []int{1}
        +}
        +func (m *ApplicationError) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_ApplicationError.Unmarshal(m, b)
        +}
        +func (m *ApplicationError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_ApplicationError.Marshal(b, m, deterministic)
        +}
        +func (dst *ApplicationError) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_ApplicationError.Merge(dst, src)
        +}
        +func (m *ApplicationError) XXX_Size() int {
        +	return xxx_messageInfo_ApplicationError.Size(m)
        +}
        +func (m *ApplicationError) XXX_DiscardUnknown() {
        +	xxx_messageInfo_ApplicationError.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_ApplicationError proto.InternalMessageInfo
         
         func (m *ApplicationError) GetCode() int32 {
         	if m != nil && m.Code != nil {
        @@ -156,14 +196,36 @@ func (m *ApplicationError) GetDetail() string {
         }
         
         type RpcError struct {
        -	Code             *int32  `protobuf:"varint,1,req,name=code" json:"code,omitempty"`
        -	Detail           *string `protobuf:"bytes,2,opt,name=detail" json:"detail,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	Code                 *int32   `protobuf:"varint,1,req,name=code" json:"code,omitempty"`
        +	Detail               *string  `protobuf:"bytes,2,opt,name=detail" json:"detail,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *RpcError) Reset()         { *m = RpcError{} }
         func (m *RpcError) String() string { return proto.CompactTextString(m) }
         func (*RpcError) ProtoMessage()    {}
        +func (*RpcError) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_remote_api_1978114ec33a273d, []int{2}
        +}
        +func (m *RpcError) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_RpcError.Unmarshal(m, b)
        +}
        +func (m *RpcError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_RpcError.Marshal(b, m, deterministic)
        +}
        +func (dst *RpcError) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_RpcError.Merge(dst, src)
        +}
        +func (m *RpcError) XXX_Size() int {
        +	return xxx_messageInfo_RpcError.Size(m)
        +}
        +func (m *RpcError) XXX_DiscardUnknown() {
        +	xxx_messageInfo_RpcError.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_RpcError proto.InternalMessageInfo
         
         func (m *RpcError) GetCode() int32 {
         	if m != nil && m.Code != nil {
        @@ -180,17 +242,39 @@ func (m *RpcError) GetDetail() string {
         }
         
         type Response struct {
        -	Response         []byte            `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
        -	Exception        []byte            `protobuf:"bytes,2,opt,name=exception" json:"exception,omitempty"`
        -	ApplicationError *ApplicationError `protobuf:"bytes,3,opt,name=application_error" json:"application_error,omitempty"`
        -	JavaException    []byte            `protobuf:"bytes,4,opt,name=java_exception" json:"java_exception,omitempty"`
        -	RpcError         *RpcError         `protobuf:"bytes,5,opt,name=rpc_error" json:"rpc_error,omitempty"`
        -	XXX_unrecognized []byte            `json:"-"`
        +	Response             []byte            `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
        +	Exception            []byte            `protobuf:"bytes,2,opt,name=exception" json:"exception,omitempty"`
        +	ApplicationError     *ApplicationError `protobuf:"bytes,3,opt,name=application_error,json=applicationError" json:"application_error,omitempty"`
        +	JavaException        []byte            `protobuf:"bytes,4,opt,name=java_exception,json=javaException" json:"java_exception,omitempty"`
        +	RpcError             *RpcError         `protobuf:"bytes,5,opt,name=rpc_error,json=rpcError" json:"rpc_error,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
        +	XXX_unrecognized     []byte            `json:"-"`
        +	XXX_sizecache        int32             `json:"-"`
         }
         
         func (m *Response) Reset()         { *m = Response{} }
         func (m *Response) String() string { return proto.CompactTextString(m) }
         func (*Response) ProtoMessage()    {}
        +func (*Response) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_remote_api_1978114ec33a273d, []int{3}
        +}
        +func (m *Response) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_Response.Unmarshal(m, b)
        +}
        +func (m *Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_Response.Marshal(b, m, deterministic)
        +}
        +func (dst *Response) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_Response.Merge(dst, src)
        +}
        +func (m *Response) XXX_Size() int {
        +	return xxx_messageInfo_Response.Size(m)
        +}
        +func (m *Response) XXX_DiscardUnknown() {
        +	xxx_messageInfo_Response.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_Response proto.InternalMessageInfo
         
         func (m *Response) GetResponse() []byte {
         	if m != nil {
        @@ -228,4 +312,50 @@ func (m *Response) GetRpcError() *RpcError {
         }
         
         func init() {
        +	proto.RegisterType((*Request)(nil), "remote_api.Request")
        +	proto.RegisterType((*ApplicationError)(nil), "remote_api.ApplicationError")
        +	proto.RegisterType((*RpcError)(nil), "remote_api.RpcError")
        +	proto.RegisterType((*Response)(nil), "remote_api.Response")
        +}
        +
        +func init() {
        +	proto.RegisterFile("google.golang.org/appengine/internal/remote_api/remote_api.proto", fileDescriptor_remote_api_1978114ec33a273d)
        +}
        +
        +var fileDescriptor_remote_api_1978114ec33a273d = []byte{
        +	// 531 bytes of a gzipped FileDescriptorProto
        +	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0x51, 0x6e, 0xd3, 0x40,
        +	0x10, 0x86, 0xb1, 0x9b, 0x34, 0xf1, 0xc4, 0x2d, 0xdb, 0xa5, 0x14, 0x0b, 0x15, 0x29, 0x44, 0x42,
        +	0xca, 0x53, 0x2a, 0x38, 0x00, 0x62, 0x63, 0x6f, 0x91, 0x85, 0x65, 0xa7, 0x6b, 0xbb, 0x50, 0x5e,
        +	0x56, 0x2b, 0x67, 0x65, 0x8c, 0x12, 0xaf, 0xd9, 0x98, 0x8a, 0x17, 0x6e, 0xc0, 0xb5, 0x38, 0x0c,
        +	0xb7, 0x40, 0x36, 0x6e, 0x63, 0xf5, 0x89, 0xb7, 0x7f, 0x7e, 0x7b, 0xe6, 0x1b, 0xcd, 0xcc, 0xc2,
        +	0xbb, 0x5c, 0xa9, 0x7c, 0x23, 0x17, 0xb9, 0xda, 0x88, 0x32, 0x5f, 0x28, 0x9d, 0x5f, 0x88, 0xaa,
        +	0x92, 0x65, 0x5e, 0x94, 0xf2, 0xa2, 0x28, 0x6b, 0xa9, 0x4b, 0xb1, 0xb9, 0xd0, 0x72, 0xab, 0x6a,
        +	0xc9, 0x45, 0x55, 0xf4, 0xe4, 0xa2, 0xd2, 0xaa, 0x56, 0x18, 0xf6, 0xce, 0xec, 0x27, 0x8c, 0x98,
        +	0xfc, 0xf6, 0x5d, 0xee, 0x6a, 0xfc, 0x12, 0xec, 0x9d, 0xd4, 0xb7, 0x45, 0x26, 0x79, 0x29, 0xb6,
        +	0xd2, 0x31, 0xa7, 0xe6, 0xdc, 0x62, 0x93, 0xce, 0x0b, 0xc5, 0x56, 0xe2, 0x33, 0x38, 0xdc, 0xca,
        +	0xfa, 0x8b, 0x5a, 0x3b, 0x07, 0xed, 0xc7, 0x2e, 0xc2, 0x0e, 0x8c, 0xf4, 0xbf, 0x2a, 0xce, 0x60,
        +	0x6a, 0xce, 0x6d, 0x76, 0x17, 0xe2, 0x17, 0x00, 0x9d, 0xe4, 0xc5, 0xda, 0x19, 0x4e, 0x8d, 0xb9,
        +	0xc5, 0xac, 0xce, 0xf1, 0xd7, 0xb3, 0xb7, 0x80, 0x48, 0x55, 0x6d, 0x8a, 0x4c, 0xd4, 0x85, 0x2a,
        +	0xa9, 0xd6, 0x4a, 0x63, 0x0c, 0x83, 0x4c, 0xad, 0xa5, 0x63, 0x4c, 0xcd, 0xf9, 0x90, 0xb5, 0xba,
        +	0x01, 0xaf, 0x65, 0x2d, 0x8a, 0x4d, 0xd7, 0x55, 0x17, 0xcd, 0x7e, 0x9b, 0x30, 0x66, 0x55, 0xf6,
        +	0x7f, 0x89, 0x46, 0x2f, 0xf1, 0x97, 0x09, 0x56, 0x9b, 0xe5, 0x36, 0x7f, 0x4d, 0x60, 0x94, 0x86,
        +	0x1f, 0xc2, 0xe8, 0x63, 0x88, 0x1e, 0x61, 0x0c, 0xc7, 0x2e, 0x09, 0x02, 0x1e, 0x46, 0x09, 0xbf,
        +	0x8c, 0xd2, 0xd0, 0x43, 0x06, 0x7e, 0x0c, 0x93, 0x15, 0x61, 0x31, 0xe5, 0x94, 0xb1, 0x88, 0x21,
        +	0x13, 0x9f, 0x01, 0x8e, 0xa9, 0x9b, 0x32, 0x3f, 0xb9, 0xe1, 0xd7, 0x7e, 0x14, 0x90, 0xc4, 0x8f,
        +	0x42, 0x74, 0x80, 0x8f, 0x01, 0xa2, 0x6b, 0xca, 0xf8, 0x55, 0x1a, 0x25, 0x04, 0x0d, 0xf0, 0x53,
        +	0x38, 0x61, 0xf4, 0x2a, 0xa5, 0x71, 0xc2, 0x93, 0x28, 0xe2, 0x01, 0x61, 0xef, 0x29, 0x1a, 0xe2,
        +	0x67, 0xf0, 0xc4, 0x25, 0x2b, 0xb2, 0xf4, 0x83, 0xa6, 0x80, 0xe7, 0xc7, 0x64, 0x19, 0x50, 0x0f,
        +	0x1d, 0xe2, 0x53, 0x40, 0x97, 0x94, 0x24, 0x29, 0xa3, 0x7b, 0x77, 0xd4, 0xe0, 0x97, 0xc4, 0xe3,
        +	0x5d, 0x25, 0x34, 0x6e, 0xf0, 0x8c, 0xc6, 0xab, 0x28, 0x8c, 0x69, 0xaf, 0xae, 0x85, 0x8f, 0xc0,
        +	0x72, 0x49, 0xe8, 0xd2, 0xa0, 0xc9, 0x03, 0x8c, 0xc0, 0x66, 0x74, 0x15, 0x90, 0x9b, 0xae, 0xef,
        +	0x49, 0xd3, 0x8f, 0x47, 0x89, 0x17, 0xf8, 0x21, 0xe5, 0xf4, 0x93, 0x4b, 0xa9, 0x47, 0x3d, 0x64,
        +	0xcf, 0xfe, 0x18, 0x30, 0x66, 0x72, 0x57, 0xa9, 0x72, 0x27, 0xf1, 0x73, 0x18, 0xeb, 0x4e, 0x3b,
        +	0xc6, 0xd4, 0x98, 0xdb, 0xec, 0x3e, 0xc6, 0xe7, 0x60, 0xc9, 0x1f, 0x99, 0xac, 0x9a, 0x75, 0xb5,
        +	0x23, 0xb5, 0xd9, 0xde, 0xc0, 0x3e, 0x9c, 0x88, 0xfd, 0x3a, 0xb9, 0x6c, 0x06, 0xec, 0x1c, 0x4c,
        +	0x8d, 0xf9, 0xe4, 0xcd, 0xf9, 0xa2, 0x77, 0x87, 0x0f, 0x77, 0xce, 0x90, 0x78, 0x78, 0x05, 0xaf,
        +	0xe0, 0xf8, 0xab, 0xb8, 0x15, 0x7c, 0x4f, 0x1b, 0xb4, 0xb4, 0xa3, 0xc6, 0xa5, 0xf7, 0xc4, 0xd7,
        +	0x60, 0xe9, 0x2a, 0xeb, 0x48, 0xc3, 0x96, 0x74, 0xda, 0x27, 0xdd, 0x1d, 0x07, 0x1b, 0xeb, 0x4e,
        +	0x2d, 0xed, 0xcf, 0xbd, 0x07, 0xf0, 0x37, 0x00, 0x00, 0xff, 0xff, 0x38, 0xd1, 0x0f, 0x22, 0x4f,
        +	0x03, 0x00, 0x00,
         }
        diff --git a/vendor/google.golang.org/appengine/internal/transaction.go b/vendor/google.golang.org/appengine/internal/transaction.go
        index 28a6d1812..9006ae653 100644
        --- a/vendor/google.golang.org/appengine/internal/transaction.go
        +++ b/vendor/google.golang.org/appengine/internal/transaction.go
        @@ -54,9 +54,9 @@ type transaction struct {
         
         var ErrConcurrentTransaction = errors.New("internal: concurrent transaction")
         
        -func RunTransactionOnce(c netcontext.Context, f func(netcontext.Context) error, xg bool) error {
        +func RunTransactionOnce(c netcontext.Context, f func(netcontext.Context) error, xg bool, readOnly bool, previousTransaction *pb.Transaction) (*pb.Transaction, error) {
         	if transactionFromContext(c) != nil {
        -		return errors.New("nested transactions are not supported")
        +		return nil, errors.New("nested transactions are not supported")
         	}
         
         	// Begin the transaction.
        @@ -67,8 +67,16 @@ func RunTransactionOnce(c netcontext.Context, f func(netcontext.Context) error,
         	if xg {
         		req.AllowMultipleEg = proto.Bool(true)
         	}
        +	if previousTransaction != nil {
        +		req.PreviousTransaction = previousTransaction
        +	}
        +	if readOnly {
        +		req.Mode = pb.BeginTransactionRequest_READ_ONLY.Enum()
        +	} else {
        +		req.Mode = pb.BeginTransactionRequest_READ_WRITE.Enum()
        +	}
         	if err := Call(c, "datastore_v3", "BeginTransaction", req, &t.transaction); err != nil {
        -		return err
        +		return nil, err
         	}
         
         	// Call f, rolling back the transaction if f returns a non-nil error, or panics.
        @@ -83,7 +91,7 @@ func RunTransactionOnce(c netcontext.Context, f func(netcontext.Context) error,
         		Call(c, "datastore_v3", "Rollback", &t.transaction, &basepb.VoidProto{})
         	}()
         	if err := f(withTransaction(c, t)); err != nil {
        -		return err
        +		return &t.transaction, err
         	}
         	t.finished = true
         
        @@ -97,11 +105,11 @@ func RunTransactionOnce(c netcontext.Context, f func(netcontext.Context) error,
         		// The Python Dev AppServer raises an ApplicationError with error code 2 (which is
         		// Error.CONCURRENT_TRANSACTION) and message "Concurrency exception.".
         		if ae.Code == int32(pb.Error_BAD_REQUEST) && ae.Detail == "ApplicationError: 2 Concurrency exception." {
        -			return ErrConcurrentTransaction
        +			return &t.transaction, ErrConcurrentTransaction
         		}
         		if ae.Code == int32(pb.Error_CONCURRENT_TRANSACTION) {
        -			return ErrConcurrentTransaction
        +			return &t.transaction, ErrConcurrentTransaction
         		}
         	}
        -	return err
        +	return &t.transaction, err
         }
        diff --git a/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.pb.go b/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.pb.go
        index af463fbb2..5f727750a 100644
        --- a/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.pb.go
        +++ b/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.pb.go
        @@ -1,18 +1,6 @@
        -// Code generated by protoc-gen-go.
        +// Code generated by protoc-gen-go. DO NOT EDIT.
         // source: google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto
        -// DO NOT EDIT!
         
        -/*
        -Package urlfetch is a generated protocol buffer package.
        -
        -It is generated from these files:
        -	google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto
        -
        -It has these top-level messages:
        -	URLFetchServiceError
        -	URLFetchRequest
        -	URLFetchResponse
        -*/
         package urlfetch
         
         import proto "github.com/golang/protobuf/proto"
        @@ -24,6 +12,12 @@ var _ = proto.Marshal
         var _ = fmt.Errorf
         var _ = math.Inf
         
        +// This is a compile-time assertion to ensure that this generated file
        +// is compatible with the proto package it is being compiled against.
        +// A compilation error at this line likely means your copy of the
        +// proto package needs to be updated.
        +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
        +
         type URLFetchServiceError_ErrorCode int32
         
         const (
        @@ -89,6 +83,9 @@ func (x *URLFetchServiceError_ErrorCode) UnmarshalJSON(data []byte) error {
         	*x = URLFetchServiceError_ErrorCode(value)
         	return nil
         }
        +func (URLFetchServiceError_ErrorCode) EnumDescriptor() ([]byte, []int) {
        +	return fileDescriptor_urlfetch_service_b245a7065f33bced, []int{0, 0}
        +}
         
         type URLFetchRequest_RequestMethod int32
         
        @@ -134,29 +131,76 @@ func (x *URLFetchRequest_RequestMethod) UnmarshalJSON(data []byte) error {
         	*x = URLFetchRequest_RequestMethod(value)
         	return nil
         }
        +func (URLFetchRequest_RequestMethod) EnumDescriptor() ([]byte, []int) {
        +	return fileDescriptor_urlfetch_service_b245a7065f33bced, []int{1, 0}
        +}
         
         type URLFetchServiceError struct {
        -	XXX_unrecognized []byte `json:"-"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *URLFetchServiceError) Reset()         { *m = URLFetchServiceError{} }
         func (m *URLFetchServiceError) String() string { return proto.CompactTextString(m) }
         func (*URLFetchServiceError) ProtoMessage()    {}
        +func (*URLFetchServiceError) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_urlfetch_service_b245a7065f33bced, []int{0}
        +}
        +func (m *URLFetchServiceError) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_URLFetchServiceError.Unmarshal(m, b)
        +}
        +func (m *URLFetchServiceError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_URLFetchServiceError.Marshal(b, m, deterministic)
        +}
        +func (dst *URLFetchServiceError) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_URLFetchServiceError.Merge(dst, src)
        +}
        +func (m *URLFetchServiceError) XXX_Size() int {
        +	return xxx_messageInfo_URLFetchServiceError.Size(m)
        +}
        +func (m *URLFetchServiceError) XXX_DiscardUnknown() {
        +	xxx_messageInfo_URLFetchServiceError.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_URLFetchServiceError proto.InternalMessageInfo
         
         type URLFetchRequest struct {
         	Method                        *URLFetchRequest_RequestMethod `protobuf:"varint,1,req,name=Method,enum=appengine.URLFetchRequest_RequestMethod" json:"Method,omitempty"`
         	Url                           *string                        `protobuf:"bytes,2,req,name=Url" json:"Url,omitempty"`
        -	Header                        []*URLFetchRequest_Header      `protobuf:"group,3,rep,name=Header" json:"header,omitempty"`
        +	Header                        []*URLFetchRequest_Header      `protobuf:"group,3,rep,name=Header,json=header" json:"header,omitempty"`
         	Payload                       []byte                         `protobuf:"bytes,6,opt,name=Payload" json:"Payload,omitempty"`
         	FollowRedirects               *bool                          `protobuf:"varint,7,opt,name=FollowRedirects,def=1" json:"FollowRedirects,omitempty"`
         	Deadline                      *float64                       `protobuf:"fixed64,8,opt,name=Deadline" json:"Deadline,omitempty"`
         	MustValidateServerCertificate *bool                          `protobuf:"varint,9,opt,name=MustValidateServerCertificate,def=1" json:"MustValidateServerCertificate,omitempty"`
        +	XXX_NoUnkeyedLiteral          struct{}                       `json:"-"`
         	XXX_unrecognized              []byte                         `json:"-"`
        +	XXX_sizecache                 int32                          `json:"-"`
         }
         
         func (m *URLFetchRequest) Reset()         { *m = URLFetchRequest{} }
         func (m *URLFetchRequest) String() string { return proto.CompactTextString(m) }
         func (*URLFetchRequest) ProtoMessage()    {}
        +func (*URLFetchRequest) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_urlfetch_service_b245a7065f33bced, []int{1}
        +}
        +func (m *URLFetchRequest) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_URLFetchRequest.Unmarshal(m, b)
        +}
        +func (m *URLFetchRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_URLFetchRequest.Marshal(b, m, deterministic)
        +}
        +func (dst *URLFetchRequest) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_URLFetchRequest.Merge(dst, src)
        +}
        +func (m *URLFetchRequest) XXX_Size() int {
        +	return xxx_messageInfo_URLFetchRequest.Size(m)
        +}
        +func (m *URLFetchRequest) XXX_DiscardUnknown() {
        +	xxx_messageInfo_URLFetchRequest.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_URLFetchRequest proto.InternalMessageInfo
         
         const Default_URLFetchRequest_FollowRedirects bool = true
         const Default_URLFetchRequest_MustValidateServerCertificate bool = true
        @@ -211,14 +255,36 @@ func (m *URLFetchRequest) GetMustValidateServerCertificate() bool {
         }
         
         type URLFetchRequest_Header struct {
        -	Key              *string `protobuf:"bytes,4,req,name=Key" json:"Key,omitempty"`
        -	Value            *string `protobuf:"bytes,5,req,name=Value" json:"Value,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	Key                  *string  `protobuf:"bytes,4,req,name=Key" json:"Key,omitempty"`
        +	Value                *string  `protobuf:"bytes,5,req,name=Value" json:"Value,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *URLFetchRequest_Header) Reset()         { *m = URLFetchRequest_Header{} }
         func (m *URLFetchRequest_Header) String() string { return proto.CompactTextString(m) }
         func (*URLFetchRequest_Header) ProtoMessage()    {}
        +func (*URLFetchRequest_Header) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_urlfetch_service_b245a7065f33bced, []int{1, 0}
        +}
        +func (m *URLFetchRequest_Header) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_URLFetchRequest_Header.Unmarshal(m, b)
        +}
        +func (m *URLFetchRequest_Header) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_URLFetchRequest_Header.Marshal(b, m, deterministic)
        +}
        +func (dst *URLFetchRequest_Header) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_URLFetchRequest_Header.Merge(dst, src)
        +}
        +func (m *URLFetchRequest_Header) XXX_Size() int {
        +	return xxx_messageInfo_URLFetchRequest_Header.Size(m)
        +}
        +func (m *URLFetchRequest_Header) XXX_DiscardUnknown() {
        +	xxx_messageInfo_URLFetchRequest_Header.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_URLFetchRequest_Header proto.InternalMessageInfo
         
         func (m *URLFetchRequest_Header) GetKey() string {
         	if m != nil && m.Key != nil {
        @@ -237,7 +303,7 @@ func (m *URLFetchRequest_Header) GetValue() string {
         type URLFetchResponse struct {
         	Content               []byte                     `protobuf:"bytes,1,opt,name=Content" json:"Content,omitempty"`
         	StatusCode            *int32                     `protobuf:"varint,2,req,name=StatusCode" json:"StatusCode,omitempty"`
        -	Header                []*URLFetchResponse_Header `protobuf:"group,3,rep,name=Header" json:"header,omitempty"`
        +	Header                []*URLFetchResponse_Header `protobuf:"group,3,rep,name=Header,json=header" json:"header,omitempty"`
         	ContentWasTruncated   *bool                      `protobuf:"varint,6,opt,name=ContentWasTruncated,def=0" json:"ContentWasTruncated,omitempty"`
         	ExternalBytesSent     *int64                     `protobuf:"varint,7,opt,name=ExternalBytesSent" json:"ExternalBytesSent,omitempty"`
         	ExternalBytesReceived *int64                     `protobuf:"varint,8,opt,name=ExternalBytesReceived" json:"ExternalBytesReceived,omitempty"`
        @@ -245,12 +311,34 @@ type URLFetchResponse struct {
         	ApiCpuMilliseconds    *int64                     `protobuf:"varint,10,opt,name=ApiCpuMilliseconds,def=0" json:"ApiCpuMilliseconds,omitempty"`
         	ApiBytesSent          *int64                     `protobuf:"varint,11,opt,name=ApiBytesSent,def=0" json:"ApiBytesSent,omitempty"`
         	ApiBytesReceived      *int64                     `protobuf:"varint,12,opt,name=ApiBytesReceived,def=0" json:"ApiBytesReceived,omitempty"`
        +	XXX_NoUnkeyedLiteral  struct{}                   `json:"-"`
         	XXX_unrecognized      []byte                     `json:"-"`
        +	XXX_sizecache         int32                      `json:"-"`
         }
         
         func (m *URLFetchResponse) Reset()         { *m = URLFetchResponse{} }
         func (m *URLFetchResponse) String() string { return proto.CompactTextString(m) }
         func (*URLFetchResponse) ProtoMessage()    {}
        +func (*URLFetchResponse) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_urlfetch_service_b245a7065f33bced, []int{2}
        +}
        +func (m *URLFetchResponse) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_URLFetchResponse.Unmarshal(m, b)
        +}
        +func (m *URLFetchResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_URLFetchResponse.Marshal(b, m, deterministic)
        +}
        +func (dst *URLFetchResponse) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_URLFetchResponse.Merge(dst, src)
        +}
        +func (m *URLFetchResponse) XXX_Size() int {
        +	return xxx_messageInfo_URLFetchResponse.Size(m)
        +}
        +func (m *URLFetchResponse) XXX_DiscardUnknown() {
        +	xxx_messageInfo_URLFetchResponse.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_URLFetchResponse proto.InternalMessageInfo
         
         const Default_URLFetchResponse_ContentWasTruncated bool = false
         const Default_URLFetchResponse_ApiCpuMilliseconds int64 = 0
        @@ -328,14 +416,36 @@ func (m *URLFetchResponse) GetApiBytesReceived() int64 {
         }
         
         type URLFetchResponse_Header struct {
        -	Key              *string `protobuf:"bytes,4,req,name=Key" json:"Key,omitempty"`
        -	Value            *string `protobuf:"bytes,5,req,name=Value" json:"Value,omitempty"`
        -	XXX_unrecognized []byte  `json:"-"`
        +	Key                  *string  `protobuf:"bytes,4,req,name=Key" json:"Key,omitempty"`
        +	Value                *string  `protobuf:"bytes,5,req,name=Value" json:"Value,omitempty"`
        +	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        +	XXX_unrecognized     []byte   `json:"-"`
        +	XXX_sizecache        int32    `json:"-"`
         }
         
         func (m *URLFetchResponse_Header) Reset()         { *m = URLFetchResponse_Header{} }
         func (m *URLFetchResponse_Header) String() string { return proto.CompactTextString(m) }
         func (*URLFetchResponse_Header) ProtoMessage()    {}
        +func (*URLFetchResponse_Header) Descriptor() ([]byte, []int) {
        +	return fileDescriptor_urlfetch_service_b245a7065f33bced, []int{2, 0}
        +}
        +func (m *URLFetchResponse_Header) XXX_Unmarshal(b []byte) error {
        +	return xxx_messageInfo_URLFetchResponse_Header.Unmarshal(m, b)
        +}
        +func (m *URLFetchResponse_Header) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        +	return xxx_messageInfo_URLFetchResponse_Header.Marshal(b, m, deterministic)
        +}
        +func (dst *URLFetchResponse_Header) XXX_Merge(src proto.Message) {
        +	xxx_messageInfo_URLFetchResponse_Header.Merge(dst, src)
        +}
        +func (m *URLFetchResponse_Header) XXX_Size() int {
        +	return xxx_messageInfo_URLFetchResponse_Header.Size(m)
        +}
        +func (m *URLFetchResponse_Header) XXX_DiscardUnknown() {
        +	xxx_messageInfo_URLFetchResponse_Header.DiscardUnknown(m)
        +}
        +
        +var xxx_messageInfo_URLFetchResponse_Header proto.InternalMessageInfo
         
         func (m *URLFetchResponse_Header) GetKey() string {
         	if m != nil && m.Key != nil {
        @@ -352,4 +462,66 @@ func (m *URLFetchResponse_Header) GetValue() string {
         }
         
         func init() {
        +	proto.RegisterType((*URLFetchServiceError)(nil), "appengine.URLFetchServiceError")
        +	proto.RegisterType((*URLFetchRequest)(nil), "appengine.URLFetchRequest")
        +	proto.RegisterType((*URLFetchRequest_Header)(nil), "appengine.URLFetchRequest.Header")
        +	proto.RegisterType((*URLFetchResponse)(nil), "appengine.URLFetchResponse")
        +	proto.RegisterType((*URLFetchResponse_Header)(nil), "appengine.URLFetchResponse.Header")
        +}
        +
        +func init() {
        +	proto.RegisterFile("google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto", fileDescriptor_urlfetch_service_b245a7065f33bced)
        +}
        +
        +var fileDescriptor_urlfetch_service_b245a7065f33bced = []byte{
        +	// 770 bytes of a gzipped FileDescriptorProto
        +	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0xdd, 0x6e, 0xe3, 0x54,
        +	0x10, 0xc6, 0x76, 0x7e, 0xa7, 0x5d, 0x7a, 0x76, 0xb6, 0x45, 0x66, 0xb5, 0xa0, 0x10, 0x09, 0x29,
        +	0x17, 0x90, 0x2e, 0x2b, 0x24, 0x44, 0xaf, 0x70, 0xed, 0x93, 0xad, 0xa9, 0x63, 0x47, 0xc7, 0x4e,
        +	0x61, 0xb9, 0xb1, 0xac, 0x78, 0x9a, 0x5a, 0xb2, 0xec, 0x60, 0x9f, 0x2c, 0xf4, 0x35, 0x78, 0x0d,
        +	0xde, 0x87, 0xa7, 0xe1, 0x02, 0x9d, 0xc4, 0xc9, 0x6e, 0xbb, 0xd1, 0x4a, 0x5c, 0x65, 0xe6, 0x9b,
        +	0xef, 0xcc, 0x99, 0x7c, 0xdf, 0xf8, 0x80, 0xb3, 0x2c, 0xcb, 0x65, 0x4e, 0xe3, 0x65, 0x99, 0x27,
        +	0xc5, 0x72, 0x5c, 0x56, 0xcb, 0xf3, 0x64, 0xb5, 0xa2, 0x62, 0x99, 0x15, 0x74, 0x9e, 0x15, 0x92,
        +	0xaa, 0x22, 0xc9, 0xcf, 0xd7, 0x55, 0x7e, 0x4b, 0x72, 0x71, 0xb7, 0x0f, 0xe2, 0x9a, 0xaa, 0xb7,
        +	0xd9, 0x82, 0xc6, 0xab, 0xaa, 0x94, 0x25, 0xf6, 0xf7, 0x67, 0x86, 0x7f, 0xeb, 0x70, 0x3a, 0x17,
        +	0xde, 0x44, 0xb1, 0xc2, 0x2d, 0x89, 0x57, 0x55, 0x59, 0x0d, 0xff, 0xd2, 0xa1, 0xbf, 0x89, 0xec,
        +	0x32, 0x25, 0xec, 0x80, 0x1e, 0x5c, 0xb3, 0x4f, 0xf0, 0x04, 0x8e, 0x5c, 0xff, 0xc6, 0xf2, 0x5c,
        +	0x27, 0x9e, 0x0b, 0x8f, 0x69, 0x0a, 0x98, 0xf0, 0xc8, 0xbe, 0x8a, 0xb9, 0x10, 0x81, 0x60, 0x3a,
        +	0x9e, 0xc1, 0xd3, 0xb9, 0x1f, 0xce, 0xb8, 0xed, 0x4e, 0x5c, 0xee, 0x34, 0xb0, 0x81, 0x9f, 0x01,
        +	0x0a, 0x1e, 0xce, 0x02, 0x3f, 0xe4, 0x71, 0x14, 0x04, 0xb1, 0x67, 0x89, 0xd7, 0x9c, 0xb5, 0x14,
        +	0xdd, 0xe1, 0x96, 0xe3, 0xb9, 0x3e, 0x8f, 0xf9, 0xaf, 0x36, 0xe7, 0x0e, 0x77, 0x58, 0x1b, 0x3f,
        +	0x87, 0xb3, 0x30, 0xf4, 0x62, 0x9b, 0x8b, 0xc8, 0x9d, 0xb8, 0xb6, 0x15, 0xf1, 0xa6, 0x53, 0x07,
        +	0x9f, 0x40, 0xdf, 0xf1, 0xc3, 0x26, 0xed, 0x22, 0x40, 0xc7, 0xf6, 0x82, 0x90, 0x3b, 0xac, 0x87,
        +	0x2f, 0xc0, 0x74, 0xfd, 0x88, 0x0b, 0xdf, 0xf2, 0xe2, 0x48, 0x58, 0x7e, 0xe8, 0x72, 0x3f, 0x6a,
        +	0x98, 0x7d, 0x35, 0x82, 0xba, 0x79, 0x6a, 0xf9, 0x6f, 0x62, 0xc1, 0x1d, 0x57, 0x70, 0x3b, 0x0a,
        +	0x19, 0xe0, 0x33, 0x38, 0x99, 0x5a, 0xde, 0x24, 0x10, 0x53, 0xee, 0xc4, 0x82, 0xcf, 0xbc, 0x37,
        +	0xec, 0x08, 0x4f, 0x81, 0xd9, 0x81, 0xef, 0x73, 0x3b, 0x72, 0x03, 0xbf, 0x69, 0x71, 0x3c, 0xfc,
        +	0xc7, 0x80, 0x93, 0x9d, 0x5a, 0x82, 0x7e, 0x5f, 0x53, 0x2d, 0xf1, 0x27, 0xe8, 0x4c, 0x49, 0xde,
        +	0x95, 0xa9, 0xa9, 0x0d, 0xf4, 0xd1, 0xa7, 0xaf, 0x46, 0xe3, 0xbd, 0xba, 0xe3, 0x47, 0xdc, 0x71,
        +	0xf3, 0xbb, 0xe5, 0x8b, 0xe6, 0x1c, 0x32, 0x30, 0xe6, 0x55, 0x6e, 0xea, 0x03, 0x7d, 0xd4, 0x17,
        +	0x2a, 0xc4, 0x1f, 0xa1, 0x73, 0x47, 0x49, 0x4a, 0x95, 0x69, 0x0c, 0x8c, 0x11, 0xbc, 0xfa, 0xea,
        +	0x23, 0x3d, 0xaf, 0x36, 0x44, 0xd1, 0x1c, 0xc0, 0x17, 0xd0, 0x9d, 0x25, 0xf7, 0x79, 0x99, 0xa4,
        +	0x66, 0x67, 0xa0, 0x8d, 0x8e, 0x2f, 0xf5, 0x9e, 0x26, 0x76, 0x10, 0x8e, 0xe1, 0x64, 0x52, 0xe6,
        +	0x79, 0xf9, 0x87, 0xa0, 0x34, 0xab, 0x68, 0x21, 0x6b, 0xb3, 0x3b, 0xd0, 0x46, 0xbd, 0x8b, 0x96,
        +	0xac, 0xd6, 0x24, 0x1e, 0x17, 0xf1, 0x39, 0xf4, 0x1c, 0x4a, 0xd2, 0x3c, 0x2b, 0xc8, 0xec, 0x0d,
        +	0xb4, 0x91, 0x26, 0xf6, 0x39, 0xfe, 0x0c, 0x5f, 0x4c, 0xd7, 0xb5, 0xbc, 0x49, 0xf2, 0x2c, 0x4d,
        +	0x24, 0xa9, 0xed, 0xa1, 0xca, 0xa6, 0x4a, 0x66, 0xb7, 0xd9, 0x22, 0x91, 0x64, 0xf6, 0xdf, 0xeb,
        +	0xfc, 0x71, 0xea, 0xf3, 0x97, 0xd0, 0xd9, 0xfe, 0x0f, 0x25, 0xc6, 0x35, 0xdd, 0x9b, 0xad, 0xad,
        +	0x18, 0xd7, 0x74, 0x8f, 0xa7, 0xd0, 0xbe, 0x49, 0xf2, 0x35, 0x99, 0xed, 0x0d, 0xb6, 0x4d, 0x86,
        +	0x1e, 0x3c, 0x79, 0xa0, 0x26, 0x76, 0xc1, 0x78, 0xcd, 0x23, 0xa6, 0x61, 0x0f, 0x5a, 0xb3, 0x20,
        +	0x8c, 0x98, 0xae, 0xa2, 0x2b, 0x6e, 0x39, 0xcc, 0x50, 0xc5, 0xd9, 0x3c, 0x62, 0x2d, 0xb5, 0x2e,
        +	0x0e, 0xf7, 0x78, 0xc4, 0x59, 0x1b, 0xfb, 0xd0, 0x9e, 0x59, 0x91, 0x7d, 0xc5, 0x3a, 0xc3, 0x7f,
        +	0x0d, 0x60, 0xef, 0x84, 0xad, 0x57, 0x65, 0x51, 0x13, 0x9a, 0xd0, 0xb5, 0xcb, 0x42, 0x52, 0x21,
        +	0x4d, 0x4d, 0x49, 0x29, 0x76, 0x29, 0x7e, 0x09, 0x10, 0xca, 0x44, 0xae, 0x6b, 0xf5, 0x71, 0x6c,
        +	0x8c, 0x6b, 0x8b, 0xf7, 0x10, 0xbc, 0x78, 0xe4, 0xdf, 0xf0, 0xa0, 0x7f, 0xdb, 0x6b, 0x1e, 0x1b,
        +	0xf8, 0x03, 0x3c, 0x6b, 0xae, 0xf9, 0x25, 0xa9, 0xa3, 0x6a, 0x5d, 0x28, 0x81, 0xb6, 0x66, 0xf6,
        +	0x2e, 0xda, 0xb7, 0x49, 0x5e, 0x93, 0x38, 0xc4, 0xc0, 0x6f, 0xe0, 0x29, 0xff, 0x73, 0xfb, 0x02,
        +	0x5c, 0xde, 0x4b, 0xaa, 0x43, 0x35, 0xb8, 0x72, 0xd7, 0x10, 0x1f, 0x16, 0xf0, 0x7b, 0x38, 0x7b,
        +	0x00, 0x0a, 0x5a, 0x50, 0xf6, 0x96, 0xd2, 0x8d, 0xcd, 0x86, 0x38, 0x5c, 0x54, 0xfb, 0x30, 0xc9,
        +	0x8a, 0x24, 0x57, 0xfb, 0xaa, 0xec, 0xed, 0x8b, 0x7d, 0x8e, 0xdf, 0x01, 0x5a, 0xab, 0xcc, 0x5e,
        +	0xad, 0xa7, 0x59, 0x9e, 0x67, 0x35, 0x2d, 0xca, 0x22, 0xad, 0x4d, 0x50, 0xed, 0x2e, 0xb4, 0x97,
        +	0xe2, 0x40, 0x11, 0xbf, 0x86, 0x63, 0x6b, 0x95, 0xbd, 0x9b, 0xf6, 0x68, 0x47, 0x7e, 0x00, 0xe3,
        +	0xb7, 0xc0, 0x76, 0xf9, 0x7e, 0xcc, 0xe3, 0x1d, 0xf5, 0x83, 0xd2, 0xff, 0x5f, 0xa6, 0x4b, 0xf8,
        +	0xad, 0xb7, 0x7b, 0x2a, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x1d, 0x9f, 0x6d, 0x24, 0x63, 0x05,
        +	0x00, 0x00,
         }
        diff --git a/vendor/google.golang.org/appengine/travis_install.sh b/vendor/google.golang.org/appengine/travis_install.sh
        new file mode 100644
        index 000000000..785b62f46
        --- /dev/null
        +++ b/vendor/google.golang.org/appengine/travis_install.sh
        @@ -0,0 +1,18 @@
        +#!/bin/bash
        +set -e
        +
        +if [[ $GO111MODULE == "on" ]]; then
        +  go get .
        +else
        +  go get -u -v $(go list -f '{{join .Imports "\n"}}{{"\n"}}{{join .TestImports "\n"}}' ./... | sort | uniq | grep -v appengine)
        +fi
        +
        +if [[ $GOAPP == "true" ]]; then
        +  mkdir /tmp/sdk
        +  curl -o /tmp/sdk.zip "https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-1.9.68.zip"
        +  unzip -q /tmp/sdk.zip -d /tmp/sdk
        +  # NOTE: Set the following env vars in the test script:
        +  # export PATH="$PATH:/tmp/sdk/go_appengine"
        +  # export APPENGINE_DEV_APPSERVER=/tmp/sdk/go_appengine/dev_appserver.py
        +fi
        +
        diff --git a/vendor/google.golang.org/appengine/travis_test.sh b/vendor/google.golang.org/appengine/travis_test.sh
        new file mode 100644
        index 000000000..d4390f045
        --- /dev/null
        +++ b/vendor/google.golang.org/appengine/travis_test.sh
        @@ -0,0 +1,12 @@
        +#!/bin/bash
        +set -e
        +
        +go version
        +go test -v google.golang.org/appengine/...
        +go test -v -race google.golang.org/appengine/...
        +if [[ $GOAPP == "true" ]]; then
        +  export PATH="$PATH:/tmp/sdk/go_appengine"
        +  export APPENGINE_DEV_APPSERVER=/tmp/sdk/go_appengine/dev_appserver.py
        +  goapp version
        +  goapp test -v google.golang.org/appengine/...
        +fi
        diff --git a/vendor/google.golang.org/genproto/googleapis/api/annotations/annotations.pb.go b/vendor/google.golang.org/genproto/googleapis/api/annotations/annotations.pb.go
        index 7e9e63c42..e7d043d91 100644
        --- a/vendor/google.golang.org/genproto/googleapis/api/annotations/annotations.pb.go
        +++ b/vendor/google.golang.org/genproto/googleapis/api/annotations/annotations.pb.go
        @@ -1,54 +1,124 @@
        +// Copyright (c) 2015, Google Inc.
        +//
        +// Licensed under the Apache License, Version 2.0 (the "License");
        +// you may not use this file except in compliance with the License.
        +// You may obtain a copy of the License at
        +//
        +//     http://www.apache.org/licenses/LICENSE-2.0
        +//
        +// Unless required by applicable law or agreed to in writing, software
        +// distributed under the License is distributed on an "AS IS" BASIS,
        +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        +// See the License for the specific language governing permissions and
        +// limitations under the License.
        +
         // Code generated by protoc-gen-go. DO NOT EDIT.
        +// versions:
        +// 	protoc-gen-go v1.22.0
        +// 	protoc        v3.11.2
         // source: google/api/annotations.proto
         
         package annotations
         
         import (
        -	fmt "fmt"
        +	reflect "reflect"
        +
         	proto "github.com/golang/protobuf/proto"
         	descriptor "github.com/golang/protobuf/protoc-gen-go/descriptor"
        -	math "math"
        +	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
        +	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
        +)
        +
        +const (
        +	// Verify that this generated code is sufficiently up-to-date.
        +	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
        +	// Verify that runtime/protoimpl is sufficiently up-to-date.
        +	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
         )
         
        -// Reference imports to suppress errors if they are not otherwise used.
        -var _ = proto.Marshal
        -var _ = fmt.Errorf
        -var _ = math.Inf
        -
        -// This is a compile-time assertion to ensure that this generated file
        -// is compatible with the proto package it is being compiled against.
        -// A compilation error at this line likely means your copy of the
        -// proto package needs to be updated.
        -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
        -
        -var E_Http = &proto.ExtensionDesc{
        -	ExtendedType:  (*descriptor.MethodOptions)(nil),
        -	ExtensionType: (*HttpRule)(nil),
        -	Field:         72295728,
        -	Name:          "google.api.http",
        -	Tag:           "bytes,72295728,opt,name=http",
        -	Filename:      "google/api/annotations.proto",
        +// This is a compile-time assertion that a sufficiently up-to-date version
        +// of the legacy proto package is being used.
        +const _ = proto.ProtoPackageIsVersion4
        +
        +var file_google_api_annotations_proto_extTypes = []protoimpl.ExtensionInfo{
        +	{
        +		ExtendedType:  (*descriptor.MethodOptions)(nil),
        +		ExtensionType: (*HttpRule)(nil),
        +		Field:         72295728,
        +		Name:          "google.api.http",
        +		Tag:           "bytes,72295728,opt,name=http",
        +		Filename:      "google/api/annotations.proto",
        +	},
         }
         
        -func init() {
        -	proto.RegisterExtension(E_Http)
        +// Extension fields to descriptor.MethodOptions.
        +var (
        +	// See `HttpRule`.
        +	//
        +	// optional google.api.HttpRule http = 72295728;
        +	E_Http = &file_google_api_annotations_proto_extTypes[0]
        +)
        +
        +var File_google_api_annotations_proto protoreflect.FileDescriptor
        +
        +var file_google_api_annotations_proto_rawDesc = []byte{
        +	0x0a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e,
        +	0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a,
        +	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x1a, 0x15, 0x67, 0x6f, 0x6f, 0x67,
        +	0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74,
        +	0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
        +	0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72,
        +	0x6f, 0x74, 0x6f, 0x3a, 0x4b, 0x0a, 0x04, 0x68, 0x74, 0x74, 0x70, 0x12, 0x1e, 0x2e, 0x67, 0x6f,
        +	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65,
        +	0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb0, 0xca, 0xbc, 0x22,
        +	0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70,
        +	0x69, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x68, 0x74, 0x74, 0x70,
        +	0x42, 0x6e, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61,
        +	0x70, 0x69, 0x42, 0x10, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x50,
        +	0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67,
        +	0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f,
        +	0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x61, 0x70,
        +	0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x61, 0x6e,
        +	0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xa2, 0x02, 0x04, 0x47, 0x41, 0x50, 0x49,
        +	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
        +}
        +
        +var file_google_api_annotations_proto_goTypes = []interface{}{
        +	(*descriptor.MethodOptions)(nil), // 0: google.protobuf.MethodOptions
        +	(*HttpRule)(nil),                 // 1: google.api.HttpRule
        +}
        +var file_google_api_annotations_proto_depIdxs = []int32{
        +	0, // 0: google.api.http:extendee -> google.protobuf.MethodOptions
        +	1, // 1: google.api.http:type_name -> google.api.HttpRule
        +	2, // [2:2] is the sub-list for method output_type
        +	2, // [2:2] is the sub-list for method input_type
        +	1, // [1:2] is the sub-list for extension type_name
        +	0, // [0:1] is the sub-list for extension extendee
        +	0, // [0:0] is the sub-list for field type_name
         }
         
        -func init() { proto.RegisterFile("google/api/annotations.proto", fileDescriptor_c591c5aa9fb79aab) }
        -
        -var fileDescriptor_c591c5aa9fb79aab = []byte{
        -	// 208 bytes of a gzipped FileDescriptorProto
        -	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x49, 0xcf, 0xcf, 0x4f,
        -	0xcf, 0x49, 0xd5, 0x4f, 0x2c, 0xc8, 0xd4, 0x4f, 0xcc, 0xcb, 0xcb, 0x2f, 0x49, 0x2c, 0xc9, 0xcc,
        -	0xcf, 0x2b, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x82, 0xc8, 0xea, 0x25, 0x16, 0x64,
        -	0x4a, 0x89, 0x22, 0xa9, 0xcc, 0x28, 0x29, 0x29, 0x80, 0x28, 0x91, 0x52, 0x80, 0x0a, 0x83, 0x79,
        -	0x49, 0xa5, 0x69, 0xfa, 0x29, 0xa9, 0xc5, 0xc9, 0x45, 0x99, 0x05, 0x25, 0xf9, 0x45, 0x10, 0x15,
        -	0x56, 0xde, 0x5c, 0x2c, 0x20, 0xf5, 0x42, 0x72, 0x7a, 0x50, 0xd3, 0x60, 0x4a, 0xf5, 0x7c, 0x53,
        -	0x4b, 0x32, 0xf2, 0x53, 0xfc, 0x0b, 0xc0, 0x56, 0x4a, 0x6c, 0x38, 0xb5, 0x47, 0x49, 0x81, 0x51,
        -	0x83, 0xdb, 0x48, 0x44, 0x0f, 0x61, 0xad, 0x9e, 0x47, 0x49, 0x49, 0x41, 0x50, 0x69, 0x4e, 0x6a,
        -	0x10, 0xd8, 0x10, 0xa7, 0x3c, 0x2e, 0xbe, 0xe4, 0xfc, 0x5c, 0x24, 0x05, 0x4e, 0x02, 0x8e, 0x08,
        -	0x67, 0x07, 0x80, 0x4c, 0x0e, 0x60, 0x8c, 0x72, 0x84, 0xca, 0xa7, 0xe7, 0xe7, 0x24, 0xe6, 0xa5,
        -	0xeb, 0xe5, 0x17, 0xa5, 0xeb, 0xa7, 0xa7, 0xe6, 0x81, 0xed, 0xd5, 0x87, 0x48, 0x25, 0x16, 0x64,
        -	0x16, 0xa3, 0x7b, 0xda, 0x1a, 0x89, 0xbd, 0x88, 0x89, 0xc5, 0xdd, 0x31, 0xc0, 0x33, 0x89, 0x0d,
        -	0xac, 0xc9, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0xe3, 0x29, 0x19, 0x62, 0x28, 0x01, 0x00, 0x00,
        +func init() { file_google_api_annotations_proto_init() }
        +func file_google_api_annotations_proto_init() {
        +	if File_google_api_annotations_proto != nil {
        +		return
        +	}
        +	file_google_api_http_proto_init()
        +	type x struct{}
        +	out := protoimpl.TypeBuilder{
        +		File: protoimpl.DescBuilder{
        +			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
        +			RawDescriptor: file_google_api_annotations_proto_rawDesc,
        +			NumEnums:      0,
        +			NumMessages:   0,
        +			NumExtensions: 1,
        +			NumServices:   0,
        +		},
        +		GoTypes:           file_google_api_annotations_proto_goTypes,
        +		DependencyIndexes: file_google_api_annotations_proto_depIdxs,
        +		ExtensionInfos:    file_google_api_annotations_proto_extTypes,
        +	}.Build()
        +	File_google_api_annotations_proto = out.File
        +	file_google_api_annotations_proto_rawDesc = nil
        +	file_google_api_annotations_proto_goTypes = nil
        +	file_google_api_annotations_proto_depIdxs = nil
         }
        diff --git a/vendor/google.golang.org/genproto/googleapis/api/annotations/client.pb.go b/vendor/google.golang.org/genproto/googleapis/api/annotations/client.pb.go
        new file mode 100644
        index 000000000..c4d7afd8f
        --- /dev/null
        +++ b/vendor/google.golang.org/genproto/googleapis/api/annotations/client.pb.go
        @@ -0,0 +1,220 @@
        +// Copyright 2019 Google LLC.
        +//
        +// Licensed under the Apache License, Version 2.0 (the "License");
        +// you may not use this file except in compliance with the License.
        +// You may obtain a copy of the License at
        +//
        +//     http://www.apache.org/licenses/LICENSE-2.0
        +//
        +// Unless required by applicable law or agreed to in writing, software
        +// distributed under the License is distributed on an "AS IS" BASIS,
        +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        +// See the License for the specific language governing permissions and
        +// limitations under the License.
        +//
        +
        +// Code generated by protoc-gen-go. DO NOT EDIT.
        +// versions:
        +// 	protoc-gen-go v1.22.0
        +// 	protoc        v3.11.2
        +// source: google/api/client.proto
        +
        +package annotations
        +
        +import (
        +	reflect "reflect"
        +
        +	proto "github.com/golang/protobuf/proto"
        +	descriptor "github.com/golang/protobuf/protoc-gen-go/descriptor"
        +	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
        +	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
        +)
        +
        +const (
        +	// Verify that this generated code is sufficiently up-to-date.
        +	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
        +	// Verify that runtime/protoimpl is sufficiently up-to-date.
        +	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
        +)
        +
        +// This is a compile-time assertion that a sufficiently up-to-date version
        +// of the legacy proto package is being used.
        +const _ = proto.ProtoPackageIsVersion4
        +
        +var file_google_api_client_proto_extTypes = []protoimpl.ExtensionInfo{
        +	{
        +		ExtendedType:  (*descriptor.MethodOptions)(nil),
        +		ExtensionType: ([]string)(nil),
        +		Field:         1051,
        +		Name:          "google.api.method_signature",
        +		Tag:           "bytes,1051,rep,name=method_signature",
        +		Filename:      "google/api/client.proto",
        +	},
        +	{
        +		ExtendedType:  (*descriptor.ServiceOptions)(nil),
        +		ExtensionType: (*string)(nil),
        +		Field:         1049,
        +		Name:          "google.api.default_host",
        +		Tag:           "bytes,1049,opt,name=default_host",
        +		Filename:      "google/api/client.proto",
        +	},
        +	{
        +		ExtendedType:  (*descriptor.ServiceOptions)(nil),
        +		ExtensionType: (*string)(nil),
        +		Field:         1050,
        +		Name:          "google.api.oauth_scopes",
        +		Tag:           "bytes,1050,opt,name=oauth_scopes",
        +		Filename:      "google/api/client.proto",
        +	},
        +}
        +
        +// Extension fields to descriptor.MethodOptions.
        +var (
        +	// A definition of a client library method signature.
        +	//
        +	// In client libraries, each proto RPC corresponds to one or more methods
        +	// which the end user is able to call, and calls the underlying RPC.
        +	// Normally, this method receives a single argument (a struct or instance
        +	// corresponding to the RPC request object). Defining this field will
        +	// add one or more overloads providing flattened or simpler method signatures
        +	// in some languages.
        +	//
        +	// The fields on the method signature are provided as a comma-separated
        +	// string.
        +	//
        +	// For example, the proto RPC and annotation:
        +	//
        +	//   rpc CreateSubscription(CreateSubscriptionRequest)
        +	//       returns (Subscription) {
        +	//     option (google.api.method_signature) = "name,topic";
        +	//   }
        +	//
        +	// Would add the following Java overload (in addition to the method accepting
        +	// the request object):
        +	//
        +	//   public final Subscription createSubscription(String name, String topic)
        +	//
        +	// The following backwards-compatibility guidelines apply:
        +	//
        +	//   * Adding this annotation to an unannotated method is backwards
        +	//     compatible.
        +	//   * Adding this annotation to a method which already has existing
        +	//     method signature annotations is backwards compatible if and only if
        +	//     the new method signature annotation is last in the sequence.
        +	//   * Modifying or removing an existing method signature annotation is
        +	//     a breaking change.
        +	//   * Re-ordering existing method signature annotations is a breaking
        +	//     change.
        +	//
        +	// repeated string method_signature = 1051;
        +	E_MethodSignature = &file_google_api_client_proto_extTypes[0]
        +)
        +
        +// Extension fields to descriptor.ServiceOptions.
        +var (
        +	// The hostname for this service.
        +	// This should be specified with no prefix or protocol.
        +	//
        +	// Example:
        +	//
        +	//   service Foo {
        +	//     option (google.api.default_host) = "foo.googleapi.com";
        +	//     ...
        +	//   }
        +	//
        +	// optional string default_host = 1049;
        +	E_DefaultHost = &file_google_api_client_proto_extTypes[1]
        +	// OAuth scopes needed for the client.
        +	//
        +	// Example:
        +	//
        +	//   service Foo {
        +	//     option (google.api.oauth_scopes) = \
        +	//       "https://www.googleapis.com/auth/cloud-platform";
        +	//     ...
        +	//   }
        +	//
        +	// If there is more than one scope, use a comma-separated string:
        +	//
        +	// Example:
        +	//
        +	//   service Foo {
        +	//     option (google.api.oauth_scopes) = \
        +	//       "https://www.googleapis.com/auth/cloud-platform,"
        +	//       "https://www.googleapis.com/auth/monitoring";
        +	//     ...
        +	//   }
        +	//
        +	// optional string oauth_scopes = 1050;
        +	E_OauthScopes = &file_google_api_client_proto_extTypes[2]
        +)
        +
        +var File_google_api_client_proto protoreflect.FileDescriptor
        +
        +var file_google_api_client_proto_rawDesc = []byte{
        +	0x0a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69,
        +	0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
        +	0x65, 0x2e, 0x61, 0x70, 0x69, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72,
        +	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f,
        +	0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x3a, 0x4a, 0x0a, 0x10, 0x6d, 0x65, 0x74, 0x68, 0x6f,
        +	0x64, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f,
        +	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65,
        +	0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9b, 0x08, 0x20, 0x03,
        +	0x28, 0x09, 0x52, 0x0f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74,
        +	0x75, 0x72, 0x65, 0x3a, 0x43, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x68,
        +	0x6f, 0x73, 0x74, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
        +	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74,
        +	0x69, 0x6f, 0x6e, 0x73, 0x18, 0x99, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x66,
        +	0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x3a, 0x43, 0x0a, 0x0c, 0x6f, 0x61, 0x75, 0x74,
        +	0x68, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
        +	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69,
        +	0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9a, 0x08, 0x20, 0x01, 0x28, 0x09,
        +	0x52, 0x0b, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x42, 0x69, 0x0a,
        +	0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x42,
        +	0x0b, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41,
        +	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72,
        +	0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
        +	0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61,
        +	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
        +	0x73, 0xa2, 0x02, 0x04, 0x47, 0x41, 0x50, 0x49, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
        +}
        +
        +var file_google_api_client_proto_goTypes = []interface{}{
        +	(*descriptor.MethodOptions)(nil),  // 0: google.protobuf.MethodOptions
        +	(*descriptor.ServiceOptions)(nil), // 1: google.protobuf.ServiceOptions
        +}
        +var file_google_api_client_proto_depIdxs = []int32{
        +	0, // 0: google.api.method_signature:extendee -> google.protobuf.MethodOptions
        +	1, // 1: google.api.default_host:extendee -> google.protobuf.ServiceOptions
        +	1, // 2: google.api.oauth_scopes:extendee -> google.protobuf.ServiceOptions
        +	3, // [3:3] is the sub-list for method output_type
        +	3, // [3:3] is the sub-list for method input_type
        +	3, // [3:3] is the sub-list for extension type_name
        +	0, // [0:3] is the sub-list for extension extendee
        +	0, // [0:0] is the sub-list for field type_name
        +}
        +
        +func init() { file_google_api_client_proto_init() }
        +func file_google_api_client_proto_init() {
        +	if File_google_api_client_proto != nil {
        +		return
        +	}
        +	type x struct{}
        +	out := protoimpl.TypeBuilder{
        +		File: protoimpl.DescBuilder{
        +			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
        +			RawDescriptor: file_google_api_client_proto_rawDesc,
        +			NumEnums:      0,
        +			NumMessages:   0,
        +			NumExtensions: 3,
        +			NumServices:   0,
        +		},
        +		GoTypes:           file_google_api_client_proto_goTypes,
        +		DependencyIndexes: file_google_api_client_proto_depIdxs,
        +		ExtensionInfos:    file_google_api_client_proto_extTypes,
        +	}.Build()
        +	File_google_api_client_proto = out.File
        +	file_google_api_client_proto_rawDesc = nil
        +	file_google_api_client_proto_goTypes = nil
        +	file_google_api_client_proto_depIdxs = nil
        +}
        diff --git a/vendor/google.golang.org/genproto/googleapis/api/annotations/field_behavior.pb.go b/vendor/google.golang.org/genproto/googleapis/api/annotations/field_behavior.pb.go
        new file mode 100644
        index 000000000..10db82e73
        --- /dev/null
        +++ b/vendor/google.golang.org/genproto/googleapis/api/annotations/field_behavior.pb.go
        @@ -0,0 +1,239 @@
        +// Copyright 2019 Google LLC.
        +//
        +// Licensed under the Apache License, Version 2.0 (the "License");
        +// you may not use this file except in compliance with the License.
        +// You may obtain a copy of the License at
        +//
        +//     http://www.apache.org/licenses/LICENSE-2.0
        +//
        +// Unless required by applicable law or agreed to in writing, software
        +// distributed under the License is distributed on an "AS IS" BASIS,
        +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        +// See the License for the specific language governing permissions and
        +// limitations under the License.
        +//
        +
        +// Code generated by protoc-gen-go. DO NOT EDIT.
        +// versions:
        +// 	protoc-gen-go v1.22.0
        +// 	protoc        v3.11.2
        +// source: google/api/field_behavior.proto
        +
        +package annotations
        +
        +import (
        +	reflect "reflect"
        +	sync "sync"
        +
        +	proto "github.com/golang/protobuf/proto"
        +	descriptor "github.com/golang/protobuf/protoc-gen-go/descriptor"
        +	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
        +	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
        +)
        +
        +const (
        +	// Verify that this generated code is sufficiently up-to-date.
        +	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
        +	// Verify that runtime/protoimpl is sufficiently up-to-date.
        +	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
        +)
        +
        +// This is a compile-time assertion that a sufficiently up-to-date version
        +// of the legacy proto package is being used.
        +const _ = proto.ProtoPackageIsVersion4
        +
        +// An indicator of the behavior of a given field (for example, that a field
        +// is required in requests, or given as output but ignored as input).
        +// This **does not** change the behavior in protocol buffers itself; it only
        +// denotes the behavior and may affect how API tooling handles the field.
        +//
        +// Note: This enum **may** receive new values in the future.
        +type FieldBehavior int32
        +
        +const (
        +	// Conventional default for enums. Do not use this.
        +	FieldBehavior_FIELD_BEHAVIOR_UNSPECIFIED FieldBehavior = 0
        +	// Specifically denotes a field as optional.
        +	// While all fields in protocol buffers are optional, this may be specified
        +	// for emphasis if appropriate.
        +	FieldBehavior_OPTIONAL FieldBehavior = 1
        +	// Denotes a field as required.
        +	// This indicates that the field **must** be provided as part of the request,
        +	// and failure to do so will cause an error (usually `INVALID_ARGUMENT`).
        +	FieldBehavior_REQUIRED FieldBehavior = 2
        +	// Denotes a field as output only.
        +	// This indicates that the field is provided in responses, but including the
        +	// field in a request does nothing (the server *must* ignore it and
        +	// *must not* throw an error as a result of the field's presence).
        +	FieldBehavior_OUTPUT_ONLY FieldBehavior = 3
        +	// Denotes a field as input only.
        +	// This indicates that the field is provided in requests, and the
        +	// corresponding field is not included in output.
        +	FieldBehavior_INPUT_ONLY FieldBehavior = 4
        +	// Denotes a field as immutable.
        +	// This indicates that the field may be set once in a request to create a
        +	// resource, but may not be changed thereafter.
        +	FieldBehavior_IMMUTABLE FieldBehavior = 5
        +)
        +
        +// Enum value maps for FieldBehavior.
        +var (
        +	FieldBehavior_name = map[int32]string{
        +		0: "FIELD_BEHAVIOR_UNSPECIFIED",
        +		1: "OPTIONAL",
        +		2: "REQUIRED",
        +		3: "OUTPUT_ONLY",
        +		4: "INPUT_ONLY",
        +		5: "IMMUTABLE",
        +	}
        +	FieldBehavior_value = map[string]int32{
        +		"FIELD_BEHAVIOR_UNSPECIFIED": 0,
        +		"OPTIONAL":                   1,
        +		"REQUIRED":                   2,
        +		"OUTPUT_ONLY":                3,
        +		"INPUT_ONLY":                 4,
        +		"IMMUTABLE":                  5,
        +	}
        +)
        +
        +func (x FieldBehavior) Enum() *FieldBehavior {
        +	p := new(FieldBehavior)
        +	*p = x
        +	return p
        +}
        +
        +func (x FieldBehavior) String() string {
        +	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
        +}
        +
        +func (FieldBehavior) Descriptor() protoreflect.EnumDescriptor {
        +	return file_google_api_field_behavior_proto_enumTypes[0].Descriptor()
        +}
        +
        +func (FieldBehavior) Type() protoreflect.EnumType {
        +	return &file_google_api_field_behavior_proto_enumTypes[0]
        +}
        +
        +func (x FieldBehavior) Number() protoreflect.EnumNumber {
        +	return protoreflect.EnumNumber(x)
        +}
        +
        +// Deprecated: Use FieldBehavior.Descriptor instead.
        +func (FieldBehavior) EnumDescriptor() ([]byte, []int) {
        +	return file_google_api_field_behavior_proto_rawDescGZIP(), []int{0}
        +}
        +
        +var file_google_api_field_behavior_proto_extTypes = []protoimpl.ExtensionInfo{
        +	{
        +		ExtendedType:  (*descriptor.FieldOptions)(nil),
        +		ExtensionType: ([]FieldBehavior)(nil),
        +		Field:         1052,
        +		Name:          "google.api.field_behavior",
        +		Tag:           "varint,1052,rep,name=field_behavior,enum=google.api.FieldBehavior",
        +		Filename:      "google/api/field_behavior.proto",
        +	},
        +}
        +
        +// Extension fields to descriptor.FieldOptions.
        +var (
        +	// A designation of a specific field behavior (required, output only, etc.)
        +	// in protobuf messages.
        +	//
        +	// Examples:
        +	//
        +	//   string name = 1 [(google.api.field_behavior) = REQUIRED];
        +	//   State state = 1 [(google.api.field_behavior) = OUTPUT_ONLY];
        +	//   google.protobuf.Duration ttl = 1
        +	//     [(google.api.field_behavior) = INPUT_ONLY];
        +	//   google.protobuf.Timestamp expire_time = 1
        +	//     [(google.api.field_behavior) = OUTPUT_ONLY,
        +	//      (google.api.field_behavior) = IMMUTABLE];
        +	//
        +	// repeated google.api.FieldBehavior field_behavior = 1052;
        +	E_FieldBehavior = &file_google_api_field_behavior_proto_extTypes[0]
        +)
        +
        +var File_google_api_field_behavior_proto protoreflect.FileDescriptor
        +
        +var file_google_api_field_behavior_proto_rawDesc = []byte{
        +	0x0a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65,
        +	0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74,
        +	0x6f, 0x12, 0x0a, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x1a, 0x20, 0x67,
        +	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64,
        +	0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2a,
        +	0x7b, 0x0a, 0x0d, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72,
        +	0x12, 0x1e, 0x0a, 0x1a, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x42, 0x45, 0x48, 0x41, 0x56, 0x49,
        +	0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00,
        +	0x12, 0x0c, 0x0a, 0x08, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x0c,
        +	0x0a, 0x08, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b,
        +	0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x03, 0x12, 0x0e, 0x0a,
        +	0x0a, 0x49, 0x4e, 0x50, 0x55, 0x54, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x04, 0x12, 0x0d, 0x0a,
        +	0x09, 0x49, 0x4d, 0x4d, 0x55, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x05, 0x3a, 0x60, 0x0a, 0x0e,
        +	0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x12, 0x1d,
        +	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
        +	0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9c, 0x08,
        +	0x20, 0x03, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70,
        +	0x69, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x52,
        +	0x0d, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x42, 0x70,
        +	0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69,
        +	0x42, 0x12, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x50,
        +	0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67,
        +	0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f,
        +	0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x61, 0x70,
        +	0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x61, 0x6e,
        +	0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xa2, 0x02, 0x04, 0x47, 0x41, 0x50, 0x49,
        +	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
        +}
        +
        +var (
        +	file_google_api_field_behavior_proto_rawDescOnce sync.Once
        +	file_google_api_field_behavior_proto_rawDescData = file_google_api_field_behavior_proto_rawDesc
        +)
        +
        +func file_google_api_field_behavior_proto_rawDescGZIP() []byte {
        +	file_google_api_field_behavior_proto_rawDescOnce.Do(func() {
        +		file_google_api_field_behavior_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_api_field_behavior_proto_rawDescData)
        +	})
        +	return file_google_api_field_behavior_proto_rawDescData
        +}
        +
        +var file_google_api_field_behavior_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
        +var file_google_api_field_behavior_proto_goTypes = []interface{}{
        +	(FieldBehavior)(0),              // 0: google.api.FieldBehavior
        +	(*descriptor.FieldOptions)(nil), // 1: google.protobuf.FieldOptions
        +}
        +var file_google_api_field_behavior_proto_depIdxs = []int32{
        +	1, // 0: google.api.field_behavior:extendee -> google.protobuf.FieldOptions
        +	0, // 1: google.api.field_behavior:type_name -> google.api.FieldBehavior
        +	2, // [2:2] is the sub-list for method output_type
        +	2, // [2:2] is the sub-list for method input_type
        +	1, // [1:2] is the sub-list for extension type_name
        +	0, // [0:1] is the sub-list for extension extendee
        +	0, // [0:0] is the sub-list for field type_name
        +}
        +
        +func init() { file_google_api_field_behavior_proto_init() }
        +func file_google_api_field_behavior_proto_init() {
        +	if File_google_api_field_behavior_proto != nil {
        +		return
        +	}
        +	type x struct{}
        +	out := protoimpl.TypeBuilder{
        +		File: protoimpl.DescBuilder{
        +			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
        +			RawDescriptor: file_google_api_field_behavior_proto_rawDesc,
        +			NumEnums:      1,
        +			NumMessages:   0,
        +			NumExtensions: 1,
        +			NumServices:   0,
        +		},
        +		GoTypes:           file_google_api_field_behavior_proto_goTypes,
        +		DependencyIndexes: file_google_api_field_behavior_proto_depIdxs,
        +		EnumInfos:         file_google_api_field_behavior_proto_enumTypes,
        +		ExtensionInfos:    file_google_api_field_behavior_proto_extTypes,
        +	}.Build()
        +	File_google_api_field_behavior_proto = out.File
        +	file_google_api_field_behavior_proto_rawDesc = nil
        +	file_google_api_field_behavior_proto_goTypes = nil
        +	file_google_api_field_behavior_proto_depIdxs = nil
        +}
        diff --git a/vendor/google.golang.org/genproto/googleapis/api/annotations/http.pb.go b/vendor/google.golang.org/genproto/googleapis/api/annotations/http.pb.go
        index abe688ec7..4bc7350d6 100644
        --- a/vendor/google.golang.org/genproto/googleapis/api/annotations/http.pb.go
        +++ b/vendor/google.golang.org/genproto/googleapis/api/annotations/http.pb.go
        @@ -1,172 +1,201 @@
        +// Copyright 2019 Google LLC.
        +//
        +// Licensed under the Apache License, Version 2.0 (the "License");
        +// you may not use this file except in compliance with the License.
        +// You may obtain a copy of the License at
        +//
        +//     http://www.apache.org/licenses/LICENSE-2.0
        +//
        +// Unless required by applicable law or agreed to in writing, software
        +// distributed under the License is distributed on an "AS IS" BASIS,
        +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        +// See the License for the specific language governing permissions and
        +// limitations under the License.
        +//
        +
         // Code generated by protoc-gen-go. DO NOT EDIT.
        +// versions:
        +// 	protoc-gen-go v1.22.0
        +// 	protoc        v3.11.2
         // source: google/api/http.proto
         
         package annotations
         
         import (
        -	fmt "fmt"
        +	reflect "reflect"
        +	sync "sync"
        +
         	proto "github.com/golang/protobuf/proto"
        -	math "math"
        +	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
        +	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
         )
         
        -// Reference imports to suppress errors if they are not otherwise used.
        -var _ = proto.Marshal
        -var _ = fmt.Errorf
        -var _ = math.Inf
        +const (
        +	// Verify that this generated code is sufficiently up-to-date.
        +	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
        +	// Verify that runtime/protoimpl is sufficiently up-to-date.
        +	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
        +)
         
        -// This is a compile-time assertion to ensure that this generated file
        -// is compatible with the proto package it is being compiled against.
        -// A compilation error at this line likely means your copy of the
        -// proto package needs to be updated.
        -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
        +// This is a compile-time assertion that a sufficiently up-to-date version
        +// of the legacy proto package is being used.
        +const _ = proto.ProtoPackageIsVersion4
         
         // Defines the HTTP configuration for an API service. It contains a list of
         // [HttpRule][google.api.HttpRule], each specifying the mapping of an RPC method
         // to one or more HTTP REST API methods.
         type Http struct {
        +	state         protoimpl.MessageState
        +	sizeCache     protoimpl.SizeCache
        +	unknownFields protoimpl.UnknownFields
        +
         	// A list of HTTP configuration rules that apply to individual API methods.
         	//
         	// **NOTE:** All service configuration rules follow "last one wins" order.
         	Rules []*HttpRule `protobuf:"bytes,1,rep,name=rules,proto3" json:"rules,omitempty"`
        -	// When set to true, URL path parmeters will be fully URI-decoded except in
        +	// When set to true, URL path parameters will be fully URI-decoded except in
         	// cases of single segment matches in reserved expansion, where "%2F" will be
         	// left encoded.
         	//
         	// The default behavior is to not decode RFC 6570 reserved characters in multi
         	// segment matches.
        -	FullyDecodeReservedExpansion bool     `protobuf:"varint,2,opt,name=fully_decode_reserved_expansion,json=fullyDecodeReservedExpansion,proto3" json:"fully_decode_reserved_expansion,omitempty"`
        -	XXX_NoUnkeyedLiteral         struct{} `json:"-"`
        -	XXX_unrecognized             []byte   `json:"-"`
        -	XXX_sizecache                int32    `json:"-"`
        +	FullyDecodeReservedExpansion bool `protobuf:"varint,2,opt,name=fully_decode_reserved_expansion,json=fullyDecodeReservedExpansion,proto3" json:"fully_decode_reserved_expansion,omitempty"`
         }
         
        -func (m *Http) Reset()         { *m = Http{} }
        -func (m *Http) String() string { return proto.CompactTextString(m) }
        -func (*Http) ProtoMessage()    {}
        -func (*Http) Descriptor() ([]byte, []int) {
        -	return fileDescriptor_ff9994be407cdcc9, []int{0}
        +func (x *Http) Reset() {
        +	*x = Http{}
        +	if protoimpl.UnsafeEnabled {
        +		mi := &file_google_api_http_proto_msgTypes[0]
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		ms.StoreMessageInfo(mi)
        +	}
         }
         
        -func (m *Http) XXX_Unmarshal(b []byte) error {
        -	return xxx_messageInfo_Http.Unmarshal(m, b)
        -}
        -func (m *Http) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        -	return xxx_messageInfo_Http.Marshal(b, m, deterministic)
        -}
        -func (m *Http) XXX_Merge(src proto.Message) {
        -	xxx_messageInfo_Http.Merge(m, src)
        +func (x *Http) String() string {
        +	return protoimpl.X.MessageStringOf(x)
         }
        -func (m *Http) XXX_Size() int {
        -	return xxx_messageInfo_Http.Size(m)
        -}
        -func (m *Http) XXX_DiscardUnknown() {
        -	xxx_messageInfo_Http.DiscardUnknown(m)
        +
        +func (*Http) ProtoMessage() {}
        +
        +func (x *Http) ProtoReflect() protoreflect.Message {
        +	mi := &file_google_api_http_proto_msgTypes[0]
        +	if protoimpl.UnsafeEnabled && x != nil {
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		if ms.LoadMessageInfo() == nil {
        +			ms.StoreMessageInfo(mi)
        +		}
        +		return ms
        +	}
        +	return mi.MessageOf(x)
         }
         
        -var xxx_messageInfo_Http proto.InternalMessageInfo
        +// Deprecated: Use Http.ProtoReflect.Descriptor instead.
        +func (*Http) Descriptor() ([]byte, []int) {
        +	return file_google_api_http_proto_rawDescGZIP(), []int{0}
        +}
         
        -func (m *Http) GetRules() []*HttpRule {
        -	if m != nil {
        -		return m.Rules
        +func (x *Http) GetRules() []*HttpRule {
        +	if x != nil {
        +		return x.Rules
         	}
         	return nil
         }
         
        -func (m *Http) GetFullyDecodeReservedExpansion() bool {
        -	if m != nil {
        -		return m.FullyDecodeReservedExpansion
        +func (x *Http) GetFullyDecodeReservedExpansion() bool {
        +	if x != nil {
        +		return x.FullyDecodeReservedExpansion
         	}
         	return false
         }
         
        -// `HttpRule` defines the mapping of an RPC method to one or more HTTP
        -// REST API methods. The mapping specifies how different portions of the RPC
        -// request message are mapped to URL path, URL query parameters, and
        -// HTTP request body. The mapping is typically specified as an
        -// `google.api.http` annotation on the RPC method,
        -// see "google/api/annotations.proto" for details.
        +// # gRPC Transcoding
         //
        -// The mapping consists of a field specifying the path template and
        -// method kind.  The path template can refer to fields in the request
        -// message, as in the example below which describes a REST GET
        -// operation on a resource collection of messages:
        +// gRPC Transcoding is a feature for mapping between a gRPC method and one or
        +// more HTTP REST endpoints. It allows developers to build a single API service
        +// that supports both gRPC APIs and REST APIs. Many systems, including [Google
        +// APIs](https://github.com/googleapis/googleapis),
        +// [Cloud Endpoints](https://cloud.google.com/endpoints), [gRPC
        +// Gateway](https://github.com/grpc-ecosystem/grpc-gateway),
        +// and [Envoy](https://github.com/envoyproxy/envoy) proxy support this feature
        +// and use it for large scale production services.
         //
        +// `HttpRule` defines the schema of the gRPC/REST mapping. The mapping specifies
        +// how different portions of the gRPC request message are mapped to the URL
        +// path, URL query parameters, and HTTP request body. It also controls how the
        +// gRPC response message is mapped to the HTTP response body. `HttpRule` is
        +// typically specified as an `google.api.http` annotation on the gRPC method.
        +//
        +// Each mapping specifies a URL path template and an HTTP method. The path
        +// template may refer to one or more fields in the gRPC request message, as long
        +// as each field is a non-repeated field with a primitive (non-message) type.
        +// The path template controls how fields of the request message are mapped to
        +// the URL path.
        +//
        +// Example:
         //
         //     service Messaging {
         //       rpc GetMessage(GetMessageRequest) returns (Message) {
        -//         option (google.api.http).get = "/v1/messages/{message_id}/{sub.subfield}";
        +//         option (google.api.http) = {
        +//             get: "/v1/{name=messages/*}"
        +//         };
         //       }
         //     }
         //     message GetMessageRequest {
        -//       message SubMessage {
        -//         string subfield = 1;
        -//       }
        -//       string message_id = 1; // mapped to the URL
        -//       SubMessage sub = 2;    // `sub.subfield` is url-mapped
        +//       string name = 1; // Mapped to URL path.
         //     }
         //     message Message {
        -//       string text = 1; // content of the resource
        +//       string text = 1; // The resource content.
         //     }
         //
        -// The same http annotation can alternatively be expressed inside the
        -// `GRPC API Configuration` YAML file.
        -//
        -//     http:
        -//       rules:
        -//         - selector: .Messaging.GetMessage
        -//           get: /v1/messages/{message_id}/{sub.subfield}
        +// This enables an HTTP REST to gRPC mapping as below:
         //
        -// This definition enables an automatic, bidrectional mapping of HTTP
        -// JSON to RPC. Example:
        -//
        -// HTTP | RPC
        +// HTTP | gRPC
         // -----|-----
        -// `GET /v1/messages/123456/foo`  | `GetMessage(message_id: "123456" sub: SubMessage(subfield: "foo"))`
        -//
        -// In general, not only fields but also field paths can be referenced
        -// from a path pattern. Fields mapped to the path pattern cannot be
        -// repeated and must have a primitive (non-message) type.
        -//
        -// Any fields in the request message which are not bound by the path
        -// pattern automatically become (optional) HTTP query
        -// parameters. Assume the following definition of the request message:
        +// `GET /v1/messages/123456`  | `GetMessage(name: "messages/123456")`
         //
        +// Any fields in the request message which are not bound by the path template
        +// automatically become HTTP query parameters if there is no HTTP request body.
        +// For example:
         //
         //     service Messaging {
         //       rpc GetMessage(GetMessageRequest) returns (Message) {
        -//         option (google.api.http).get = "/v1/messages/{message_id}";
        +//         option (google.api.http) = {
        +//             get:"/v1/messages/{message_id}"
        +//         };
         //       }
         //     }
         //     message GetMessageRequest {
         //       message SubMessage {
         //         string subfield = 1;
         //       }
        -//       string message_id = 1; // mapped to the URL
        -//       int64 revision = 2;    // becomes a parameter
        -//       SubMessage sub = 3;    // `sub.subfield` becomes a parameter
        +//       string message_id = 1; // Mapped to URL path.
        +//       int64 revision = 2;    // Mapped to URL query parameter `revision`.
        +//       SubMessage sub = 3;    // Mapped to URL query parameter `sub.subfield`.
         //     }
         //
        -//
         // This enables a HTTP JSON to RPC mapping as below:
         //
        -// HTTP | RPC
        +// HTTP | gRPC
         // -----|-----
        -// `GET /v1/messages/123456?revision=2&sub.subfield=foo` | `GetMessage(message_id: "123456" revision: 2 sub: SubMessage(subfield: "foo"))`
        -//
        -// Note that fields which are mapped to HTTP parameters must have a
        -// primitive type or a repeated primitive type. Message types are not
        -// allowed. In the case of a repeated type, the parameter can be
        -// repeated in the URL, as in `...?param=A¶m=B`.
        -//
        -// For HTTP method kinds which allow a request body, the `body` field
        +// `GET /v1/messages/123456?revision=2&sub.subfield=foo` |
        +// `GetMessage(message_id: "123456" revision: 2 sub: SubMessage(subfield:
        +// "foo"))`
        +//
        +// Note that fields which are mapped to URL query parameters must have a
        +// primitive type or a repeated primitive type or a non-repeated message type.
        +// In the case of a repeated type, the parameter can be repeated in the URL
        +// as `...?param=A¶m=B`. In the case of a message type, each field of the
        +// message is mapped to a separate parameter, such as
        +// `...?foo.a=A&foo.b=B&foo.c=C`.
        +//
        +// For HTTP methods that allow a request body, the `body` field
         // specifies the mapping. Consider a REST update method on the
         // message resource collection:
         //
        -//
         //     service Messaging {
         //       rpc UpdateMessage(UpdateMessageRequest) returns (Message) {
         //         option (google.api.http) = {
        -//           put: "/v1/messages/{message_id}"
        +//           patch: "/v1/messages/{message_id}"
         //           body: "message"
         //         };
         //       }
        @@ -176,14 +205,14 @@ func (m *Http) GetFullyDecodeReservedExpansion() bool {
         //       Message message = 2;   // mapped to the body
         //     }
         //
        -//
         // The following HTTP JSON to RPC mapping is enabled, where the
         // representation of the JSON in the request body is determined by
         // protos JSON encoding:
         //
        -// HTTP | RPC
        +// HTTP | gRPC
         // -----|-----
        -// `PUT /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: "123456" message { text: "Hi!" })`
        +// `PATCH /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id:
        +// "123456" message { text: "Hi!" })`
         //
         // The special name `*` can be used in the body mapping to define that
         // every field not bound by the path template should be mapped to the
        @@ -193,7 +222,7 @@ func (m *Http) GetFullyDecodeReservedExpansion() bool {
         //     service Messaging {
         //       rpc UpdateMessage(Message) returns (Message) {
         //         option (google.api.http) = {
        -//           put: "/v1/messages/{message_id}"
        +//           patch: "/v1/messages/{message_id}"
         //           body: "*"
         //         };
         //       }
        @@ -206,13 +235,14 @@ func (m *Http) GetFullyDecodeReservedExpansion() bool {
         //
         // The following HTTP JSON to RPC mapping is enabled:
         //
        -// HTTP | RPC
        +// HTTP | gRPC
         // -----|-----
        -// `PUT /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: "123456" text: "Hi!")`
        +// `PATCH /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id:
        +// "123456" text: "Hi!")`
         //
         // Note that when using `*` in the body mapping, it is not possible to
         // have HTTP parameters, as all fields not bound by the path end in
        -// the body. This makes this option more rarely used in practice of
        +// the body. This makes this option more rarely used in practice when
         // defining REST APIs. The common usage of `*` is in custom methods
         // which don't use the URL at all for transferring data.
         //
        @@ -234,32 +264,31 @@ func (m *Http) GetFullyDecodeReservedExpansion() bool {
         //       string user_id = 2;
         //     }
         //
        +// This enables the following two alternative HTTP JSON to RPC mappings:
         //
        -// This enables the following two alternative HTTP JSON to RPC
        -// mappings:
        -//
        -// HTTP | RPC
        +// HTTP | gRPC
         // -----|-----
         // `GET /v1/messages/123456` | `GetMessage(message_id: "123456")`
        -// `GET /v1/users/me/messages/123456` | `GetMessage(user_id: "me" message_id: "123456")`
        -//
        -// # Rules for HTTP mapping
        -//
        -// The rules for mapping HTTP path, query parameters, and body fields
        -// to the request message are as follows:
        -//
        -// 1. The `body` field specifies either `*` or a field path, or is
        -//    omitted. If omitted, it indicates there is no HTTP request body.
        -// 2. Leaf fields (recursive expansion of nested messages in the
        -//    request) can be classified into three types:
        -//     (a) Matched in the URL template.
        -//     (b) Covered by body (if body is `*`, everything except (a) fields;
        -//         else everything under the body field)
        -//     (c) All other fields.
        -// 3. URL query parameters found in the HTTP request are mapped to (c) fields.
        -// 4. Any body sent with an HTTP request can contain only (b) fields.
        -//
        -// The syntax of the path template is as follows:
        +// `GET /v1/users/me/messages/123456` | `GetMessage(user_id: "me" message_id:
        +// "123456")`
        +//
        +// ## Rules for HTTP mapping
        +//
        +// 1. Leaf request fields (recursive expansion nested messages in the request
        +//    message) are classified into three categories:
        +//    - Fields referred by the path template. They are passed via the URL path.
        +//    - Fields referred by the [HttpRule.body][google.api.HttpRule.body]. They are passed via the HTTP
        +//      request body.
        +//    - All other fields are passed via the URL query parameters, and the
        +//      parameter name is the field path in the request message. A repeated
        +//      field can be represented as multiple query parameters under the same
        +//      name.
        +//  2. If [HttpRule.body][google.api.HttpRule.body] is "*", there is no URL query parameter, all fields
        +//     are passed via URL path and HTTP request body.
        +//  3. If [HttpRule.body][google.api.HttpRule.body] is omitted, there is no HTTP request body, all
        +//     fields are passed via URL path and URL query parameters.
        +//
        +// ### Path template syntax
         //
         //     Template = "/" Segments [ Verb ] ;
         //     Segments = Segment { "/" Segment } ;
        @@ -268,36 +297,92 @@ func (m *Http) GetFullyDecodeReservedExpansion() bool {
         //     FieldPath = IDENT { "." IDENT } ;
         //     Verb     = ":" LITERAL ;
         //
        -// The syntax `*` matches a single path segment. The syntax `**` matches zero
        -// or more path segments, which must be the last part of the path except the
        -// `Verb`. The syntax `LITERAL` matches literal text in the path.
        +// The syntax `*` matches a single URL path segment. The syntax `**` matches
        +// zero or more URL path segments, which must be the last part of the URL path
        +// except the `Verb`.
         //
         // The syntax `Variable` matches part of the URL path as specified by its
         // template. A variable template must not contain other variables. If a variable
         // matches a single path segment, its template may be omitted, e.g. `{var}`
         // is equivalent to `{var=*}`.
         //
        +// The syntax `LITERAL` matches literal text in the URL path. If the `LITERAL`
        +// contains any reserved character, such characters should be percent-encoded
        +// before the matching.
        +//
         // If a variable contains exactly one path segment, such as `"{var}"` or
        -// `"{var=*}"`, when such a variable is expanded into a URL path, all characters
        -// except `[-_.~0-9a-zA-Z]` are percent-encoded. Such variables show up in the
        -// Discovery Document as `{var}`.
        -//
        -// If a variable contains one or more path segments, such as `"{var=foo/*}"`
        -// or `"{var=**}"`, when such a variable is expanded into a URL path, all
        -// characters except `[-_.~/0-9a-zA-Z]` are percent-encoded. Such variables
        -// show up in the Discovery Document as `{+var}`.
        -//
        -// NOTE: While the single segment variable matches the semantics of
        -// [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2
        -// Simple String Expansion, the multi segment variable **does not** match
        -// RFC 6570 Reserved Expansion. The reason is that the Reserved Expansion
        +// `"{var=*}"`, when such a variable is expanded into a URL path on the client
        +// side, all characters except `[-_.~0-9a-zA-Z]` are percent-encoded. The
        +// server side does the reverse decoding. Such variables show up in the
        +// [Discovery
        +// Document](https://developers.google.com/discovery/v1/reference/apis) as
        +// `{var}`.
        +//
        +// If a variable contains multiple path segments, such as `"{var=foo/*}"`
        +// or `"{var=**}"`, when such a variable is expanded into a URL path on the
        +// client side, all characters except `[-_.~/0-9a-zA-Z]` are percent-encoded.
        +// The server side does the reverse decoding, except "%2F" and "%2f" are left
        +// unchanged. Such variables show up in the
        +// [Discovery
        +// Document](https://developers.google.com/discovery/v1/reference/apis) as
        +// `{+var}`.
        +//
        +// ## Using gRPC API Service Configuration
        +//
        +// gRPC API Service Configuration (service config) is a configuration language
        +// for configuring a gRPC service to become a user-facing product. The
        +// service config is simply the YAML representation of the `google.api.Service`
        +// proto message.
        +//
        +// As an alternative to annotating your proto file, you can configure gRPC
        +// transcoding in your service config YAML files. You do this by specifying a
        +// `HttpRule` that maps the gRPC method to a REST endpoint, achieving the same
        +// effect as the proto annotation. This can be particularly useful if you
        +// have a proto that is reused in multiple services. Note that any transcoding
        +// specified in the service config will override any matching transcoding
        +// configuration in the proto.
        +//
        +// Example:
        +//
        +//     http:
        +//       rules:
        +//         # Selects a gRPC method and applies HttpRule to it.
        +//         - selector: example.v1.Messaging.GetMessage
        +//           get: /v1/messages/{message_id}/{sub.subfield}
        +//
        +// ## Special notes
        +//
        +// When gRPC Transcoding is used to map a gRPC to JSON REST endpoints, the
        +// proto to JSON conversion must follow the [proto3
        +// specification](https://developers.google.com/protocol-buffers/docs/proto3#json).
        +//
        +// While the single segment variable follows the semantics of
        +// [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2 Simple String
        +// Expansion, the multi segment variable **does not** follow RFC 6570 Section
        +// 3.2.3 Reserved Expansion. The reason is that the Reserved Expansion
         // does not expand special characters like `?` and `#`, which would lead
        -// to invalid URLs.
        +// to invalid URLs. As the result, gRPC Transcoding uses a custom encoding
        +// for multi segment variables.
        +//
        +// The path variables **must not** refer to any repeated or mapped field,
        +// because client libraries are not capable of handling such variable expansion.
        +//
        +// The path variables **must not** capture the leading "/" character. The reason
        +// is that the most common use case "{var}" does not capture the leading "/"
        +// character. For consistency, all path variables must share the same behavior.
        +//
        +// Repeated message fields must not be mapped to URL query parameters, because
        +// no client library can support such complicated mapping.
         //
        -// NOTE: the field paths in variables and in the `body` must not refer to
        -// repeated fields or map fields.
        +// If an API needs to use a JSON array for request or response body, it can map
        +// the request or response body to a repeated field. However, some gRPC
        +// Transcoding implementations may not support this feature.
         type HttpRule struct {
        -	// Selects methods to which this rule applies.
        +	state         protoimpl.MessageState
        +	sizeCache     protoimpl.SizeCache
        +	unknownFields protoimpl.UnknownFields
        +
        +	// Selects a method to which this rule applies.
         	//
         	// Refer to [selector][google.api.DocumentationRule.selector] for syntax details.
         	Selector string `protobuf:"bytes,1,opt,name=selector,proto3" json:"selector,omitempty"`
        @@ -305,7 +390,7 @@ type HttpRule struct {
         	// used with any of the {get|put|post|delete|patch} methods. A custom method
         	// can be defined using the 'custom' field.
         	//
        -	// Types that are valid to be assigned to Pattern:
        +	// Types that are assignable to Pattern:
         	//	*HttpRule_Get
         	//	*HttpRule_Put
         	//	*HttpRule_Post
        @@ -313,96 +398,65 @@ type HttpRule struct {
         	//	*HttpRule_Patch
         	//	*HttpRule_Custom
         	Pattern isHttpRule_Pattern `protobuf_oneof:"pattern"`
        -	// The name of the request field whose value is mapped to the HTTP body, or
        -	// `*` for mapping all fields not captured by the path pattern to the HTTP
        -	// body. NOTE: the referred field must not be a repeated field and must be
        -	// present at the top-level of request message type.
        +	// The name of the request field whose value is mapped to the HTTP request
        +	// body, or `*` for mapping all request fields not captured by the path
        +	// pattern to the HTTP body, or omitted for not having any HTTP request body.
        +	//
        +	// NOTE: the referred field must be present at the top-level of the request
        +	// message type.
         	Body string `protobuf:"bytes,7,opt,name=body,proto3" json:"body,omitempty"`
         	// Optional. The name of the response field whose value is mapped to the HTTP
        -	// body of response. Other response fields are ignored. When
        -	// not set, the response message will be used as HTTP body of response.
        +	// response body. When omitted, the entire response message will be used
        +	// as the HTTP response body.
        +	//
        +	// NOTE: The referred field must be present at the top-level of the response
        +	// message type.
         	ResponseBody string `protobuf:"bytes,12,opt,name=response_body,json=responseBody,proto3" json:"response_body,omitempty"`
         	// Additional HTTP bindings for the selector. Nested bindings must
         	// not contain an `additional_bindings` field themselves (that is,
         	// the nesting may only be one level deep).
        -	AdditionalBindings   []*HttpRule `protobuf:"bytes,11,rep,name=additional_bindings,json=additionalBindings,proto3" json:"additional_bindings,omitempty"`
        -	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
        -	XXX_unrecognized     []byte      `json:"-"`
        -	XXX_sizecache        int32       `json:"-"`
        -}
        -
        -func (m *HttpRule) Reset()         { *m = HttpRule{} }
        -func (m *HttpRule) String() string { return proto.CompactTextString(m) }
        -func (*HttpRule) ProtoMessage()    {}
        -func (*HttpRule) Descriptor() ([]byte, []int) {
        -	return fileDescriptor_ff9994be407cdcc9, []int{1}
        -}
        -
        -func (m *HttpRule) XXX_Unmarshal(b []byte) error {
        -	return xxx_messageInfo_HttpRule.Unmarshal(m, b)
        -}
        -func (m *HttpRule) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        -	return xxx_messageInfo_HttpRule.Marshal(b, m, deterministic)
        -}
        -func (m *HttpRule) XXX_Merge(src proto.Message) {
        -	xxx_messageInfo_HttpRule.Merge(m, src)
        -}
        -func (m *HttpRule) XXX_Size() int {
        -	return xxx_messageInfo_HttpRule.Size(m)
        -}
        -func (m *HttpRule) XXX_DiscardUnknown() {
        -	xxx_messageInfo_HttpRule.DiscardUnknown(m)
        +	AdditionalBindings []*HttpRule `protobuf:"bytes,11,rep,name=additional_bindings,json=additionalBindings,proto3" json:"additional_bindings,omitempty"`
         }
         
        -var xxx_messageInfo_HttpRule proto.InternalMessageInfo
        -
        -func (m *HttpRule) GetSelector() string {
        -	if m != nil {
        -		return m.Selector
        +func (x *HttpRule) Reset() {
        +	*x = HttpRule{}
        +	if protoimpl.UnsafeEnabled {
        +		mi := &file_google_api_http_proto_msgTypes[1]
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		ms.StoreMessageInfo(mi)
         	}
        -	return ""
        -}
        -
        -type isHttpRule_Pattern interface {
        -	isHttpRule_Pattern()
        -}
        -
        -type HttpRule_Get struct {
        -	Get string `protobuf:"bytes,2,opt,name=get,proto3,oneof"`
         }
         
        -type HttpRule_Put struct {
        -	Put string `protobuf:"bytes,3,opt,name=put,proto3,oneof"`
        +func (x *HttpRule) String() string {
        +	return protoimpl.X.MessageStringOf(x)
         }
         
        -type HttpRule_Post struct {
        -	Post string `protobuf:"bytes,4,opt,name=post,proto3,oneof"`
        -}
        +func (*HttpRule) ProtoMessage() {}
         
        -type HttpRule_Delete struct {
        -	Delete string `protobuf:"bytes,5,opt,name=delete,proto3,oneof"`
        +func (x *HttpRule) ProtoReflect() protoreflect.Message {
        +	mi := &file_google_api_http_proto_msgTypes[1]
        +	if protoimpl.UnsafeEnabled && x != nil {
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		if ms.LoadMessageInfo() == nil {
        +			ms.StoreMessageInfo(mi)
        +		}
        +		return ms
        +	}
        +	return mi.MessageOf(x)
         }
         
        -type HttpRule_Patch struct {
        -	Patch string `protobuf:"bytes,6,opt,name=patch,proto3,oneof"`
        +// Deprecated: Use HttpRule.ProtoReflect.Descriptor instead.
        +func (*HttpRule) Descriptor() ([]byte, []int) {
        +	return file_google_api_http_proto_rawDescGZIP(), []int{1}
         }
         
        -type HttpRule_Custom struct {
        -	Custom *CustomHttpPattern `protobuf:"bytes,8,opt,name=custom,proto3,oneof"`
        +func (x *HttpRule) GetSelector() string {
        +	if x != nil {
        +		return x.Selector
        +	}
        +	return ""
         }
         
        -func (*HttpRule_Get) isHttpRule_Pattern() {}
        -
        -func (*HttpRule_Put) isHttpRule_Pattern() {}
        -
        -func (*HttpRule_Post) isHttpRule_Pattern() {}
        -
        -func (*HttpRule_Delete) isHttpRule_Pattern() {}
        -
        -func (*HttpRule_Patch) isHttpRule_Pattern() {}
        -
        -func (*HttpRule_Custom) isHttpRule_Pattern() {}
        -
         func (m *HttpRule) GetPattern() isHttpRule_Pattern {
         	if m != nil {
         		return m.Pattern
        @@ -410,284 +464,321 @@ func (m *HttpRule) GetPattern() isHttpRule_Pattern {
         	return nil
         }
         
        -func (m *HttpRule) GetGet() string {
        -	if x, ok := m.GetPattern().(*HttpRule_Get); ok {
        +func (x *HttpRule) GetGet() string {
        +	if x, ok := x.GetPattern().(*HttpRule_Get); ok {
         		return x.Get
         	}
         	return ""
         }
         
        -func (m *HttpRule) GetPut() string {
        -	if x, ok := m.GetPattern().(*HttpRule_Put); ok {
        +func (x *HttpRule) GetPut() string {
        +	if x, ok := x.GetPattern().(*HttpRule_Put); ok {
         		return x.Put
         	}
         	return ""
         }
         
        -func (m *HttpRule) GetPost() string {
        -	if x, ok := m.GetPattern().(*HttpRule_Post); ok {
        +func (x *HttpRule) GetPost() string {
        +	if x, ok := x.GetPattern().(*HttpRule_Post); ok {
         		return x.Post
         	}
         	return ""
         }
         
        -func (m *HttpRule) GetDelete() string {
        -	if x, ok := m.GetPattern().(*HttpRule_Delete); ok {
        +func (x *HttpRule) GetDelete() string {
        +	if x, ok := x.GetPattern().(*HttpRule_Delete); ok {
         		return x.Delete
         	}
         	return ""
         }
         
        -func (m *HttpRule) GetPatch() string {
        -	if x, ok := m.GetPattern().(*HttpRule_Patch); ok {
        +func (x *HttpRule) GetPatch() string {
        +	if x, ok := x.GetPattern().(*HttpRule_Patch); ok {
         		return x.Patch
         	}
         	return ""
         }
         
        -func (m *HttpRule) GetCustom() *CustomHttpPattern {
        -	if x, ok := m.GetPattern().(*HttpRule_Custom); ok {
        +func (x *HttpRule) GetCustom() *CustomHttpPattern {
        +	if x, ok := x.GetPattern().(*HttpRule_Custom); ok {
         		return x.Custom
         	}
         	return nil
         }
         
        -func (m *HttpRule) GetBody() string {
        -	if m != nil {
        -		return m.Body
        +func (x *HttpRule) GetBody() string {
        +	if x != nil {
        +		return x.Body
         	}
         	return ""
         }
         
        -func (m *HttpRule) GetResponseBody() string {
        -	if m != nil {
        -		return m.ResponseBody
        +func (x *HttpRule) GetResponseBody() string {
        +	if x != nil {
        +		return x.ResponseBody
         	}
         	return ""
         }
         
        -func (m *HttpRule) GetAdditionalBindings() []*HttpRule {
        -	if m != nil {
        -		return m.AdditionalBindings
        +func (x *HttpRule) GetAdditionalBindings() []*HttpRule {
        +	if x != nil {
        +		return x.AdditionalBindings
         	}
         	return nil
         }
         
        -// XXX_OneofFuncs is for the internal use of the proto package.
        -func (*HttpRule) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
        -	return _HttpRule_OneofMarshaler, _HttpRule_OneofUnmarshaler, _HttpRule_OneofSizer, []interface{}{
        -		(*HttpRule_Get)(nil),
        -		(*HttpRule_Put)(nil),
        -		(*HttpRule_Post)(nil),
        -		(*HttpRule_Delete)(nil),
        -		(*HttpRule_Patch)(nil),
        -		(*HttpRule_Custom)(nil),
        -	}
        +type isHttpRule_Pattern interface {
        +	isHttpRule_Pattern()
         }
         
        -func _HttpRule_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
        -	m := msg.(*HttpRule)
        -	// pattern
        -	switch x := m.Pattern.(type) {
        -	case *HttpRule_Get:
        -		b.EncodeVarint(2<<3 | proto.WireBytes)
        -		b.EncodeStringBytes(x.Get)
        -	case *HttpRule_Put:
        -		b.EncodeVarint(3<<3 | proto.WireBytes)
        -		b.EncodeStringBytes(x.Put)
        -	case *HttpRule_Post:
        -		b.EncodeVarint(4<<3 | proto.WireBytes)
        -		b.EncodeStringBytes(x.Post)
        -	case *HttpRule_Delete:
        -		b.EncodeVarint(5<<3 | proto.WireBytes)
        -		b.EncodeStringBytes(x.Delete)
        -	case *HttpRule_Patch:
        -		b.EncodeVarint(6<<3 | proto.WireBytes)
        -		b.EncodeStringBytes(x.Patch)
        -	case *HttpRule_Custom:
        -		b.EncodeVarint(8<<3 | proto.WireBytes)
        -		if err := b.EncodeMessage(x.Custom); err != nil {
        -			return err
        -		}
        -	case nil:
        -	default:
        -		return fmt.Errorf("HttpRule.Pattern has unexpected type %T", x)
        -	}
        -	return nil
        +type HttpRule_Get struct {
        +	// Maps to HTTP GET. Used for listing and getting information about
        +	// resources.
        +	Get string `protobuf:"bytes,2,opt,name=get,proto3,oneof"`
         }
         
        -func _HttpRule_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
        -	m := msg.(*HttpRule)
        -	switch tag {
        -	case 2: // pattern.get
        -		if wire != proto.WireBytes {
        -			return true, proto.ErrInternalBadWireType
        -		}
        -		x, err := b.DecodeStringBytes()
        -		m.Pattern = &HttpRule_Get{x}
        -		return true, err
        -	case 3: // pattern.put
        -		if wire != proto.WireBytes {
        -			return true, proto.ErrInternalBadWireType
        -		}
        -		x, err := b.DecodeStringBytes()
        -		m.Pattern = &HttpRule_Put{x}
        -		return true, err
        -	case 4: // pattern.post
        -		if wire != proto.WireBytes {
        -			return true, proto.ErrInternalBadWireType
        -		}
        -		x, err := b.DecodeStringBytes()
        -		m.Pattern = &HttpRule_Post{x}
        -		return true, err
        -	case 5: // pattern.delete
        -		if wire != proto.WireBytes {
        -			return true, proto.ErrInternalBadWireType
        -		}
        -		x, err := b.DecodeStringBytes()
        -		m.Pattern = &HttpRule_Delete{x}
        -		return true, err
        -	case 6: // pattern.patch
        -		if wire != proto.WireBytes {
        -			return true, proto.ErrInternalBadWireType
        -		}
        -		x, err := b.DecodeStringBytes()
        -		m.Pattern = &HttpRule_Patch{x}
        -		return true, err
        -	case 8: // pattern.custom
        -		if wire != proto.WireBytes {
        -			return true, proto.ErrInternalBadWireType
        -		}
        -		msg := new(CustomHttpPattern)
        -		err := b.DecodeMessage(msg)
        -		m.Pattern = &HttpRule_Custom{msg}
        -		return true, err
        -	default:
        -		return false, nil
        -	}
        +type HttpRule_Put struct {
        +	// Maps to HTTP PUT. Used for replacing a resource.
        +	Put string `protobuf:"bytes,3,opt,name=put,proto3,oneof"`
         }
         
        -func _HttpRule_OneofSizer(msg proto.Message) (n int) {
        -	m := msg.(*HttpRule)
        -	// pattern
        -	switch x := m.Pattern.(type) {
        -	case *HttpRule_Get:
        -		n += 1 // tag and wire
        -		n += proto.SizeVarint(uint64(len(x.Get)))
        -		n += len(x.Get)
        -	case *HttpRule_Put:
        -		n += 1 // tag and wire
        -		n += proto.SizeVarint(uint64(len(x.Put)))
        -		n += len(x.Put)
        -	case *HttpRule_Post:
        -		n += 1 // tag and wire
        -		n += proto.SizeVarint(uint64(len(x.Post)))
        -		n += len(x.Post)
        -	case *HttpRule_Delete:
        -		n += 1 // tag and wire
        -		n += proto.SizeVarint(uint64(len(x.Delete)))
        -		n += len(x.Delete)
        -	case *HttpRule_Patch:
        -		n += 1 // tag and wire
        -		n += proto.SizeVarint(uint64(len(x.Patch)))
        -		n += len(x.Patch)
        -	case *HttpRule_Custom:
        -		s := proto.Size(x.Custom)
        -		n += 1 // tag and wire
        -		n += proto.SizeVarint(uint64(s))
        -		n += s
        -	case nil:
        -	default:
        -		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
        -	}
        -	return n
        +type HttpRule_Post struct {
        +	// Maps to HTTP POST. Used for creating a resource or performing an action.
        +	Post string `protobuf:"bytes,4,opt,name=post,proto3,oneof"`
        +}
        +
        +type HttpRule_Delete struct {
        +	// Maps to HTTP DELETE. Used for deleting a resource.
        +	Delete string `protobuf:"bytes,5,opt,name=delete,proto3,oneof"`
         }
         
        +type HttpRule_Patch struct {
        +	// Maps to HTTP PATCH. Used for updating a resource.
        +	Patch string `protobuf:"bytes,6,opt,name=patch,proto3,oneof"`
        +}
        +
        +type HttpRule_Custom struct {
        +	// The custom pattern is used for specifying an HTTP method that is not
        +	// included in the `pattern` field, such as HEAD, or "*" to leave the
        +	// HTTP method unspecified for this rule. The wild-card rule is useful
        +	// for services that provide content to Web (HTML) clients.
        +	Custom *CustomHttpPattern `protobuf:"bytes,8,opt,name=custom,proto3,oneof"`
        +}
        +
        +func (*HttpRule_Get) isHttpRule_Pattern() {}
        +
        +func (*HttpRule_Put) isHttpRule_Pattern() {}
        +
        +func (*HttpRule_Post) isHttpRule_Pattern() {}
        +
        +func (*HttpRule_Delete) isHttpRule_Pattern() {}
        +
        +func (*HttpRule_Patch) isHttpRule_Pattern() {}
        +
        +func (*HttpRule_Custom) isHttpRule_Pattern() {}
        +
         // A custom pattern is used for defining custom HTTP verb.
         type CustomHttpPattern struct {
        +	state         protoimpl.MessageState
        +	sizeCache     protoimpl.SizeCache
        +	unknownFields protoimpl.UnknownFields
        +
         	// The name of this custom HTTP verb.
         	Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"`
         	// The path matched by this custom verb.
        -	Path                 string   `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"`
        -	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        -	XXX_unrecognized     []byte   `json:"-"`
        -	XXX_sizecache        int32    `json:"-"`
        +	Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"`
         }
         
        -func (m *CustomHttpPattern) Reset()         { *m = CustomHttpPattern{} }
        -func (m *CustomHttpPattern) String() string { return proto.CompactTextString(m) }
        -func (*CustomHttpPattern) ProtoMessage()    {}
        -func (*CustomHttpPattern) Descriptor() ([]byte, []int) {
        -	return fileDescriptor_ff9994be407cdcc9, []int{2}
        +func (x *CustomHttpPattern) Reset() {
        +	*x = CustomHttpPattern{}
        +	if protoimpl.UnsafeEnabled {
        +		mi := &file_google_api_http_proto_msgTypes[2]
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		ms.StoreMessageInfo(mi)
        +	}
         }
         
        -func (m *CustomHttpPattern) XXX_Unmarshal(b []byte) error {
        -	return xxx_messageInfo_CustomHttpPattern.Unmarshal(m, b)
        -}
        -func (m *CustomHttpPattern) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        -	return xxx_messageInfo_CustomHttpPattern.Marshal(b, m, deterministic)
        +func (x *CustomHttpPattern) String() string {
        +	return protoimpl.X.MessageStringOf(x)
         }
        -func (m *CustomHttpPattern) XXX_Merge(src proto.Message) {
        -	xxx_messageInfo_CustomHttpPattern.Merge(m, src)
        -}
        -func (m *CustomHttpPattern) XXX_Size() int {
        -	return xxx_messageInfo_CustomHttpPattern.Size(m)
        -}
        -func (m *CustomHttpPattern) XXX_DiscardUnknown() {
        -	xxx_messageInfo_CustomHttpPattern.DiscardUnknown(m)
        +
        +func (*CustomHttpPattern) ProtoMessage() {}
        +
        +func (x *CustomHttpPattern) ProtoReflect() protoreflect.Message {
        +	mi := &file_google_api_http_proto_msgTypes[2]
        +	if protoimpl.UnsafeEnabled && x != nil {
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		if ms.LoadMessageInfo() == nil {
        +			ms.StoreMessageInfo(mi)
        +		}
        +		return ms
        +	}
        +	return mi.MessageOf(x)
         }
         
        -var xxx_messageInfo_CustomHttpPattern proto.InternalMessageInfo
        +// Deprecated: Use CustomHttpPattern.ProtoReflect.Descriptor instead.
        +func (*CustomHttpPattern) Descriptor() ([]byte, []int) {
        +	return file_google_api_http_proto_rawDescGZIP(), []int{2}
        +}
         
        -func (m *CustomHttpPattern) GetKind() string {
        -	if m != nil {
        -		return m.Kind
        +func (x *CustomHttpPattern) GetKind() string {
        +	if x != nil {
        +		return x.Kind
         	}
         	return ""
         }
         
        -func (m *CustomHttpPattern) GetPath() string {
        -	if m != nil {
        -		return m.Path
        +func (x *CustomHttpPattern) GetPath() string {
        +	if x != nil {
        +		return x.Path
         	}
         	return ""
         }
         
        -func init() {
        -	proto.RegisterType((*Http)(nil), "google.api.Http")
        -	proto.RegisterType((*HttpRule)(nil), "google.api.HttpRule")
        -	proto.RegisterType((*CustomHttpPattern)(nil), "google.api.CustomHttpPattern")
        -}
        -
        -func init() { proto.RegisterFile("google/api/http.proto", fileDescriptor_ff9994be407cdcc9) }
        -
        -var fileDescriptor_ff9994be407cdcc9 = []byte{
        -	// 419 bytes of a gzipped FileDescriptorProto
        -	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0xc1, 0x8e, 0xd3, 0x30,
        -	0x10, 0x86, 0x49, 0x9b, 0x76, 0xdb, 0xe9, 0x82, 0x84, 0x59, 0x90, 0x85, 0x40, 0x54, 0xe5, 0x52,
        -	0x71, 0x48, 0xa5, 0xe5, 0xc0, 0x61, 0x4f, 0x1b, 0xa8, 0x58, 0x6e, 0x55, 0x8e, 0x5c, 0x22, 0x37,
        -	0x1e, 0x52, 0x83, 0xd7, 0xb6, 0xe2, 0x09, 0xa2, 0xaf, 0xc3, 0x63, 0xf1, 0x24, 0x1c, 0x91, 0x9d,
        -	0x84, 0x56, 0x42, 0xe2, 0x36, 0xf3, 0xff, 0x9f, 0xa7, 0x7f, 0x27, 0x03, 0x4f, 0x6b, 0x6b, 0x6b,
        -	0x8d, 0x1b, 0xe1, 0xd4, 0xe6, 0x40, 0xe4, 0x32, 0xd7, 0x58, 0xb2, 0x0c, 0x3a, 0x39, 0x13, 0x4e,
        -	0xad, 0x8e, 0x90, 0xde, 0x11, 0x39, 0xf6, 0x06, 0x26, 0x4d, 0xab, 0xd1, 0xf3, 0x64, 0x39, 0x5e,
        -	0x2f, 0xae, 0xaf, 0xb2, 0x13, 0x93, 0x05, 0xa0, 0x68, 0x35, 0x16, 0x1d, 0xc2, 0xb6, 0xf0, 0xea,
        -	0x4b, 0xab, 0xf5, 0xb1, 0x94, 0x58, 0x59, 0x89, 0x65, 0x83, 0x1e, 0x9b, 0xef, 0x28, 0x4b, 0xfc,
        -	0xe1, 0x84, 0xf1, 0xca, 0x1a, 0x3e, 0x5a, 0x26, 0xeb, 0x59, 0xf1, 0x22, 0x62, 0x1f, 0x22, 0x55,
        -	0xf4, 0xd0, 0x76, 0x60, 0x56, 0xbf, 0x46, 0x30, 0x1b, 0x46, 0xb3, 0xe7, 0x30, 0xf3, 0xa8, 0xb1,
        -	0x22, 0xdb, 0xf0, 0x64, 0x99, 0xac, 0xe7, 0xc5, 0xdf, 0x9e, 0x31, 0x18, 0xd7, 0x48, 0x71, 0xe6,
        -	0xfc, 0xee, 0x41, 0x11, 0x9a, 0xa0, 0xb9, 0x96, 0xf8, 0x78, 0xd0, 0x5c, 0x4b, 0xec, 0x0a, 0x52,
        -	0x67, 0x3d, 0xf1, 0xb4, 0x17, 0x63, 0xc7, 0x38, 0x4c, 0x25, 0x6a, 0x24, 0xe4, 0x93, 0x5e, 0xef,
        -	0x7b, 0xf6, 0x0c, 0x26, 0x4e, 0x50, 0x75, 0xe0, 0xd3, 0xde, 0xe8, 0x5a, 0xf6, 0x0e, 0xa6, 0x55,
        -	0xeb, 0xc9, 0xde, 0xf3, 0xd9, 0x32, 0x59, 0x2f, 0xae, 0x5f, 0x9e, 0x2f, 0xe3, 0x7d, 0x74, 0x42,
        -	0xee, 0x9d, 0x20, 0xc2, 0xc6, 0x84, 0x81, 0x1d, 0xce, 0x18, 0xa4, 0x7b, 0x2b, 0x8f, 0xfc, 0x22,
        -	0xfe, 0x81, 0x58, 0xb3, 0xd7, 0xf0, 0xb0, 0x41, 0xef, 0xac, 0xf1, 0x58, 0x46, 0xf3, 0x32, 0x9a,
        -	0x97, 0x83, 0x98, 0x07, 0x68, 0x0b, 0x4f, 0x84, 0x94, 0x8a, 0x94, 0x35, 0x42, 0x97, 0x7b, 0x65,
        -	0xa4, 0x32, 0xb5, 0xe7, 0x8b, 0xff, 0x7c, 0x0b, 0x76, 0x7a, 0x90, 0xf7, 0x7c, 0x3e, 0x87, 0x0b,
        -	0xd7, 0x85, 0x5a, 0xdd, 0xc0, 0xe3, 0x7f, 0x92, 0x86, 0x7c, 0xdf, 0x94, 0x91, 0xfd, 0x82, 0x63,
        -	0x1d, 0x34, 0x27, 0xe8, 0xd0, 0x6d, 0xb7, 0x88, 0x75, 0xfe, 0x15, 0x1e, 0x55, 0xf6, 0xfe, 0xec,
        -	0x67, 0xf3, 0x79, 0x1c, 0x13, 0xae, 0x67, 0x97, 0x7c, 0xbe, 0xed, 0x8d, 0xda, 0x6a, 0x61, 0xea,
        -	0xcc, 0x36, 0xf5, 0xa6, 0x46, 0x13, 0x6f, 0x6b, 0xd3, 0x59, 0xc2, 0x29, 0x1f, 0xaf, 0x4e, 0x18,
        -	0x63, 0x49, 0x84, 0x98, 0xfe, 0xe6, 0xac, 0xfe, 0x9d, 0x24, 0x3f, 0x47, 0xe9, 0xc7, 0xdb, 0xdd,
        -	0xa7, 0xfd, 0x34, 0xbe, 0x7b, 0xfb, 0x27, 0x00, 0x00, 0xff, 0xff, 0xae, 0xde, 0xa1, 0xd0, 0xac,
        -	0x02, 0x00, 0x00,
        +var File_google_api_http_proto protoreflect.FileDescriptor
        +
        +var file_google_api_http_proto_rawDesc = []byte{
        +	0x0a, 0x15, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x68, 0x74, 0x74,
        +	0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
        +	0x61, 0x70, 0x69, 0x22, 0x79, 0x0a, 0x04, 0x48, 0x74, 0x74, 0x70, 0x12, 0x2a, 0x0a, 0x05, 0x72,
        +	0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f,
        +	0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x52, 0x75, 0x6c, 0x65,
        +	0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x1f, 0x66, 0x75, 0x6c, 0x6c, 0x79,
        +	0x5f, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64,
        +	0x5f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08,
        +	0x52, 0x1c, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73,
        +	0x65, 0x72, 0x76, 0x65, 0x64, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xda,
        +	0x02, 0x0a, 0x08, 0x48, 0x74, 0x74, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73,
        +	0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73,
        +	0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x03, 0x67, 0x65, 0x74, 0x18, 0x02,
        +	0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x67, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x03, 0x70,
        +	0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x70, 0x75, 0x74, 0x12,
        +	0x14, 0x0a, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,
        +	0x04, 0x70, 0x6f, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18,
        +	0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12,
        +	0x16, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00,
        +	0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x12, 0x37, 0x0a, 0x06, 0x63, 0x75, 0x73, 0x74, 0x6f,
        +	0x6d, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
        +	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x74, 0x74, 0x70, 0x50,
        +	0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x00, 0x52, 0x06, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d,
        +	0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
        +	0x62, 0x6f, 0x64, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
        +	0x5f, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73,
        +	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x45, 0x0a, 0x13, 0x61, 0x64, 0x64,
        +	0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73,
        +	0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
        +	0x61, 0x70, 0x69, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x12, 0x61, 0x64,
        +	0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73,
        +	0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x22, 0x3b, 0x0a, 0x11, 0x43,
        +	0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x74, 0x74, 0x70, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e,
        +	0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
        +	0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01,
        +	0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x42, 0x6a, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e,
        +	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x09, 0x48, 0x74, 0x74, 0x70,
        +	0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
        +	0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72,
        +	0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x61,
        +	0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x61,
        +	0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xf8, 0x01, 0x01, 0xa2, 0x02, 0x04,
        +	0x47, 0x41, 0x50, 0x49, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
        +}
        +
        +var (
        +	file_google_api_http_proto_rawDescOnce sync.Once
        +	file_google_api_http_proto_rawDescData = file_google_api_http_proto_rawDesc
        +)
        +
        +func file_google_api_http_proto_rawDescGZIP() []byte {
        +	file_google_api_http_proto_rawDescOnce.Do(func() {
        +		file_google_api_http_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_api_http_proto_rawDescData)
        +	})
        +	return file_google_api_http_proto_rawDescData
        +}
        +
        +var file_google_api_http_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
        +var file_google_api_http_proto_goTypes = []interface{}{
        +	(*Http)(nil),              // 0: google.api.Http
        +	(*HttpRule)(nil),          // 1: google.api.HttpRule
        +	(*CustomHttpPattern)(nil), // 2: google.api.CustomHttpPattern
        +}
        +var file_google_api_http_proto_depIdxs = []int32{
        +	1, // 0: google.api.Http.rules:type_name -> google.api.HttpRule
        +	2, // 1: google.api.HttpRule.custom:type_name -> google.api.CustomHttpPattern
        +	1, // 2: google.api.HttpRule.additional_bindings:type_name -> google.api.HttpRule
        +	3, // [3:3] is the sub-list for method output_type
        +	3, // [3:3] is the sub-list for method input_type
        +	3, // [3:3] is the sub-list for extension type_name
        +	3, // [3:3] is the sub-list for extension extendee
        +	0, // [0:3] is the sub-list for field type_name
        +}
        +
        +func init() { file_google_api_http_proto_init() }
        +func file_google_api_http_proto_init() {
        +	if File_google_api_http_proto != nil {
        +		return
        +	}
        +	if !protoimpl.UnsafeEnabled {
        +		file_google_api_http_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
        +			switch v := v.(*Http); i {
        +			case 0:
        +				return &v.state
        +			case 1:
        +				return &v.sizeCache
        +			case 2:
        +				return &v.unknownFields
        +			default:
        +				return nil
        +			}
        +		}
        +		file_google_api_http_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
        +			switch v := v.(*HttpRule); i {
        +			case 0:
        +				return &v.state
        +			case 1:
        +				return &v.sizeCache
        +			case 2:
        +				return &v.unknownFields
        +			default:
        +				return nil
        +			}
        +		}
        +		file_google_api_http_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
        +			switch v := v.(*CustomHttpPattern); i {
        +			case 0:
        +				return &v.state
        +			case 1:
        +				return &v.sizeCache
        +			case 2:
        +				return &v.unknownFields
        +			default:
        +				return nil
        +			}
        +		}
        +	}
        +	file_google_api_http_proto_msgTypes[1].OneofWrappers = []interface{}{
        +		(*HttpRule_Get)(nil),
        +		(*HttpRule_Put)(nil),
        +		(*HttpRule_Post)(nil),
        +		(*HttpRule_Delete)(nil),
        +		(*HttpRule_Patch)(nil),
        +		(*HttpRule_Custom)(nil),
        +	}
        +	type x struct{}
        +	out := protoimpl.TypeBuilder{
        +		File: protoimpl.DescBuilder{
        +			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
        +			RawDescriptor: file_google_api_http_proto_rawDesc,
        +			NumEnums:      0,
        +			NumMessages:   3,
        +			NumExtensions: 0,
        +			NumServices:   0,
        +		},
        +		GoTypes:           file_google_api_http_proto_goTypes,
        +		DependencyIndexes: file_google_api_http_proto_depIdxs,
        +		MessageInfos:      file_google_api_http_proto_msgTypes,
        +	}.Build()
        +	File_google_api_http_proto = out.File
        +	file_google_api_http_proto_rawDesc = nil
        +	file_google_api_http_proto_goTypes = nil
        +	file_google_api_http_proto_depIdxs = nil
         }
        diff --git a/vendor/google.golang.org/genproto/googleapis/api/annotations/resource.pb.go b/vendor/google.golang.org/genproto/googleapis/api/annotations/resource.pb.go
        new file mode 100644
        index 000000000..8da6ec291
        --- /dev/null
        +++ b/vendor/google.golang.org/genproto/googleapis/api/annotations/resource.pb.go
        @@ -0,0 +1,630 @@
        +// Copyright 2019 Google LLC.
        +//
        +// Licensed under the Apache License, Version 2.0 (the "License");
        +// you may not use this file except in compliance with the License.
        +// You may obtain a copy of the License at
        +//
        +//     http://www.apache.org/licenses/LICENSE-2.0
        +//
        +// Unless required by applicable law or agreed to in writing, software
        +// distributed under the License is distributed on an "AS IS" BASIS,
        +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        +// See the License for the specific language governing permissions and
        +// limitations under the License.
        +//
        +
        +// Code generated by protoc-gen-go. DO NOT EDIT.
        +// versions:
        +// 	protoc-gen-go v1.22.0
        +// 	protoc        v3.11.2
        +// source: google/api/resource.proto
        +
        +package annotations
        +
        +import (
        +	reflect "reflect"
        +	sync "sync"
        +
        +	proto "github.com/golang/protobuf/proto"
        +	descriptor "github.com/golang/protobuf/protoc-gen-go/descriptor"
        +	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
        +	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
        +)
        +
        +const (
        +	// Verify that this generated code is sufficiently up-to-date.
        +	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
        +	// Verify that runtime/protoimpl is sufficiently up-to-date.
        +	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
        +)
        +
        +// This is a compile-time assertion that a sufficiently up-to-date version
        +// of the legacy proto package is being used.
        +const _ = proto.ProtoPackageIsVersion4
        +
        +// A description of the historical or future-looking state of the
        +// resource pattern.
        +type ResourceDescriptor_History int32
        +
        +const (
        +	// The "unset" value.
        +	ResourceDescriptor_HISTORY_UNSPECIFIED ResourceDescriptor_History = 0
        +	// The resource originally had one pattern and launched as such, and
        +	// additional patterns were added later.
        +	ResourceDescriptor_ORIGINALLY_SINGLE_PATTERN ResourceDescriptor_History = 1
        +	// The resource has one pattern, but the API owner expects to add more
        +	// later. (This is the inverse of ORIGINALLY_SINGLE_PATTERN, and prevents
        +	// that from being necessary once there are multiple patterns.)
        +	ResourceDescriptor_FUTURE_MULTI_PATTERN ResourceDescriptor_History = 2
        +)
        +
        +// Enum value maps for ResourceDescriptor_History.
        +var (
        +	ResourceDescriptor_History_name = map[int32]string{
        +		0: "HISTORY_UNSPECIFIED",
        +		1: "ORIGINALLY_SINGLE_PATTERN",
        +		2: "FUTURE_MULTI_PATTERN",
        +	}
        +	ResourceDescriptor_History_value = map[string]int32{
        +		"HISTORY_UNSPECIFIED":       0,
        +		"ORIGINALLY_SINGLE_PATTERN": 1,
        +		"FUTURE_MULTI_PATTERN":      2,
        +	}
        +)
        +
        +func (x ResourceDescriptor_History) Enum() *ResourceDescriptor_History {
        +	p := new(ResourceDescriptor_History)
        +	*p = x
        +	return p
        +}
        +
        +func (x ResourceDescriptor_History) String() string {
        +	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
        +}
        +
        +func (ResourceDescriptor_History) Descriptor() protoreflect.EnumDescriptor {
        +	return file_google_api_resource_proto_enumTypes[0].Descriptor()
        +}
        +
        +func (ResourceDescriptor_History) Type() protoreflect.EnumType {
        +	return &file_google_api_resource_proto_enumTypes[0]
        +}
        +
        +func (x ResourceDescriptor_History) Number() protoreflect.EnumNumber {
        +	return protoreflect.EnumNumber(x)
        +}
        +
        +// Deprecated: Use ResourceDescriptor_History.Descriptor instead.
        +func (ResourceDescriptor_History) EnumDescriptor() ([]byte, []int) {
        +	return file_google_api_resource_proto_rawDescGZIP(), []int{0, 0}
        +}
        +
        +// A simple descriptor of a resource type.
        +//
        +// ResourceDescriptor annotates a resource message (either by means of a
        +// protobuf annotation or use in the service config), and associates the
        +// resource's schema, the resource type, and the pattern of the resource name.
        +//
        +// Example:
        +//
        +//     message Topic {
        +//       // Indicates this message defines a resource schema.
        +//       // Declares the resource type in the format of {service}/{kind}.
        +//       // For Kubernetes resources, the format is {api group}/{kind}.
        +//       option (google.api.resource) = {
        +//         type: "pubsub.googleapis.com/Topic"
        +//         name_descriptor: {
        +//           pattern: "projects/{project}/topics/{topic}"
        +//           parent_type: "cloudresourcemanager.googleapis.com/Project"
        +//           parent_name_extractor: "projects/{project}"
        +//         }
        +//       };
        +//     }
        +//
        +// The ResourceDescriptor Yaml config will look like:
        +//
        +//     resources:
        +//     - type: "pubsub.googleapis.com/Topic"
        +//       name_descriptor:
        +//         - pattern: "projects/{project}/topics/{topic}"
        +//           parent_type: "cloudresourcemanager.googleapis.com/Project"
        +//           parent_name_extractor: "projects/{project}"
        +//
        +// Sometimes, resources have multiple patterns, typically because they can
        +// live under multiple parents.
        +//
        +// Example:
        +//
        +//     message LogEntry {
        +//       option (google.api.resource) = {
        +//         type: "logging.googleapis.com/LogEntry"
        +//         name_descriptor: {
        +//           pattern: "projects/{project}/logs/{log}"
        +//           parent_type: "cloudresourcemanager.googleapis.com/Project"
        +//           parent_name_extractor: "projects/{project}"
        +//         }
        +//         name_descriptor: {
        +//           pattern: "folders/{folder}/logs/{log}"
        +//           parent_type: "cloudresourcemanager.googleapis.com/Folder"
        +//           parent_name_extractor: "folders/{folder}"
        +//         }
        +//         name_descriptor: {
        +//           pattern: "organizations/{organization}/logs/{log}"
        +//           parent_type: "cloudresourcemanager.googleapis.com/Organization"
        +//           parent_name_extractor: "organizations/{organization}"
        +//         }
        +//         name_descriptor: {
        +//           pattern: "billingAccounts/{billing_account}/logs/{log}"
        +//           parent_type: "billing.googleapis.com/BillingAccount"
        +//           parent_name_extractor: "billingAccounts/{billing_account}"
        +//         }
        +//       };
        +//     }
        +//
        +// The ResourceDescriptor Yaml config will look like:
        +//
        +//     resources:
        +//     - type: 'logging.googleapis.com/LogEntry'
        +//       name_descriptor:
        +//         - pattern: "projects/{project}/logs/{log}"
        +//           parent_type: "cloudresourcemanager.googleapis.com/Project"
        +//           parent_name_extractor: "projects/{project}"
        +//         - pattern: "folders/{folder}/logs/{log}"
        +//           parent_type: "cloudresourcemanager.googleapis.com/Folder"
        +//           parent_name_extractor: "folders/{folder}"
        +//         - pattern: "organizations/{organization}/logs/{log}"
        +//           parent_type: "cloudresourcemanager.googleapis.com/Organization"
        +//           parent_name_extractor: "organizations/{organization}"
        +//         - pattern: "billingAccounts/{billing_account}/logs/{log}"
        +//           parent_type: "billing.googleapis.com/BillingAccount"
        +//           parent_name_extractor: "billingAccounts/{billing_account}"
        +//
        +// For flexible resources, the resource name doesn't contain parent names, but
        +// the resource itself has parents for policy evaluation.
        +//
        +// Example:
        +//
        +//     message Shelf {
        +//       option (google.api.resource) = {
        +//         type: "library.googleapis.com/Shelf"
        +//         name_descriptor: {
        +//           pattern: "shelves/{shelf}"
        +//           parent_type: "cloudresourcemanager.googleapis.com/Project"
        +//         }
        +//         name_descriptor: {
        +//           pattern: "shelves/{shelf}"
        +//           parent_type: "cloudresourcemanager.googleapis.com/Folder"
        +//         }
        +//       };
        +//     }
        +//
        +// The ResourceDescriptor Yaml config will look like:
        +//
        +//     resources:
        +//     - type: 'library.googleapis.com/Shelf'
        +//       name_descriptor:
        +//         - pattern: "shelves/{shelf}"
        +//           parent_type: "cloudresourcemanager.googleapis.com/Project"
        +//         - pattern: "shelves/{shelf}"
        +//           parent_type: "cloudresourcemanager.googleapis.com/Folder"
        +type ResourceDescriptor struct {
        +	state         protoimpl.MessageState
        +	sizeCache     protoimpl.SizeCache
        +	unknownFields protoimpl.UnknownFields
        +
        +	// The resource type. It must be in the format of
        +	// {service_name}/{resource_type_kind}. The `resource_type_kind` must be
        +	// singular and must not include version numbers.
        +	//
        +	// Example: `storage.googleapis.com/Bucket`
        +	//
        +	// The value of the resource_type_kind must follow the regular expression
        +	// /[A-Za-z][a-zA-Z0-9]+/. It should start with an upper case character and
        +	// should use PascalCase (UpperCamelCase). The maximum number of
        +	// characters allowed for the `resource_type_kind` is 100.
        +	Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
        +	// Optional. The relative resource name pattern associated with this resource
        +	// type. The DNS prefix of the full resource name shouldn't be specified here.
        +	//
        +	// The path pattern must follow the syntax, which aligns with HTTP binding
        +	// syntax:
        +	//
        +	//     Template = Segment { "/" Segment } ;
        +	//     Segment = LITERAL | Variable ;
        +	//     Variable = "{" LITERAL "}" ;
        +	//
        +	// Examples:
        +	//
        +	//     - "projects/{project}/topics/{topic}"
        +	//     - "projects/{project}/knowledgeBases/{knowledge_base}"
        +	//
        +	// The components in braces correspond to the IDs for each resource in the
        +	// hierarchy. It is expected that, if multiple patterns are provided,
        +	// the same component name (e.g. "project") refers to IDs of the same
        +	// type of resource.
        +	Pattern []string `protobuf:"bytes,2,rep,name=pattern,proto3" json:"pattern,omitempty"`
        +	// Optional. The field on the resource that designates the resource name
        +	// field. If omitted, this is assumed to be "name".
        +	NameField string `protobuf:"bytes,3,opt,name=name_field,json=nameField,proto3" json:"name_field,omitempty"`
        +	// Optional. The historical or future-looking state of the resource pattern.
        +	//
        +	// Example:
        +	//
        +	//     // The InspectTemplate message originally only supported resource
        +	//     // names with organization, and project was added later.
        +	//     message InspectTemplate {
        +	//       option (google.api.resource) = {
        +	//         type: "dlp.googleapis.com/InspectTemplate"
        +	//         pattern:
        +	//         "organizations/{organization}/inspectTemplates/{inspect_template}"
        +	//         pattern: "projects/{project}/inspectTemplates/{inspect_template}"
        +	//         history: ORIGINALLY_SINGLE_PATTERN
        +	//       };
        +	//     }
        +	History ResourceDescriptor_History `protobuf:"varint,4,opt,name=history,proto3,enum=google.api.ResourceDescriptor_History" json:"history,omitempty"`
        +	// The plural name used in the resource name, such as 'projects' for
        +	// the name of 'projects/{project}'. It is the same concept of the `plural`
        +	// field in k8s CRD spec
        +	// https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/
        +	Plural string `protobuf:"bytes,5,opt,name=plural,proto3" json:"plural,omitempty"`
        +	// The same concept of the `singular` field in k8s CRD spec
        +	// https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/
        +	// Such as "project" for the `resourcemanager.googleapis.com/Project` type.
        +	Singular string `protobuf:"bytes,6,opt,name=singular,proto3" json:"singular,omitempty"`
        +}
        +
        +func (x *ResourceDescriptor) Reset() {
        +	*x = ResourceDescriptor{}
        +	if protoimpl.UnsafeEnabled {
        +		mi := &file_google_api_resource_proto_msgTypes[0]
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		ms.StoreMessageInfo(mi)
        +	}
        +}
        +
        +func (x *ResourceDescriptor) String() string {
        +	return protoimpl.X.MessageStringOf(x)
        +}
        +
        +func (*ResourceDescriptor) ProtoMessage() {}
        +
        +func (x *ResourceDescriptor) ProtoReflect() protoreflect.Message {
        +	mi := &file_google_api_resource_proto_msgTypes[0]
        +	if protoimpl.UnsafeEnabled && x != nil {
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		if ms.LoadMessageInfo() == nil {
        +			ms.StoreMessageInfo(mi)
        +		}
        +		return ms
        +	}
        +	return mi.MessageOf(x)
        +}
        +
        +// Deprecated: Use ResourceDescriptor.ProtoReflect.Descriptor instead.
        +func (*ResourceDescriptor) Descriptor() ([]byte, []int) {
        +	return file_google_api_resource_proto_rawDescGZIP(), []int{0}
        +}
        +
        +func (x *ResourceDescriptor) GetType() string {
        +	if x != nil {
        +		return x.Type
        +	}
        +	return ""
        +}
        +
        +func (x *ResourceDescriptor) GetPattern() []string {
        +	if x != nil {
        +		return x.Pattern
        +	}
        +	return nil
        +}
        +
        +func (x *ResourceDescriptor) GetNameField() string {
        +	if x != nil {
        +		return x.NameField
        +	}
        +	return ""
        +}
        +
        +func (x *ResourceDescriptor) GetHistory() ResourceDescriptor_History {
        +	if x != nil {
        +		return x.History
        +	}
        +	return ResourceDescriptor_HISTORY_UNSPECIFIED
        +}
        +
        +func (x *ResourceDescriptor) GetPlural() string {
        +	if x != nil {
        +		return x.Plural
        +	}
        +	return ""
        +}
        +
        +func (x *ResourceDescriptor) GetSingular() string {
        +	if x != nil {
        +		return x.Singular
        +	}
        +	return ""
        +}
        +
        +// Defines a proto annotation that describes a string field that refers to
        +// an API resource.
        +type ResourceReference struct {
        +	state         protoimpl.MessageState
        +	sizeCache     protoimpl.SizeCache
        +	unknownFields protoimpl.UnknownFields
        +
        +	// The resource type that the annotated field references.
        +	//
        +	// Example:
        +	//
        +	//     message Subscription {
        +	//       string topic = 2 [(google.api.resource_reference) = {
        +	//         type: "pubsub.googleapis.com/Topic"
        +	//       }];
        +	//     }
        +	Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
        +	// The resource type of a child collection that the annotated field
        +	// references. This is useful for annotating the `parent` field that
        +	// doesn't have a fixed resource type.
        +	//
        +	// Example:
        +	//
        +	//     message ListLogEntriesRequest {
        +	//       string parent = 1 [(google.api.resource_reference) = {
        +	//         child_type: "logging.googleapis.com/LogEntry"
        +	//       };
        +	//     }
        +	ChildType string `protobuf:"bytes,2,opt,name=child_type,json=childType,proto3" json:"child_type,omitempty"`
        +}
        +
        +func (x *ResourceReference) Reset() {
        +	*x = ResourceReference{}
        +	if protoimpl.UnsafeEnabled {
        +		mi := &file_google_api_resource_proto_msgTypes[1]
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		ms.StoreMessageInfo(mi)
        +	}
        +}
        +
        +func (x *ResourceReference) String() string {
        +	return protoimpl.X.MessageStringOf(x)
        +}
        +
        +func (*ResourceReference) ProtoMessage() {}
        +
        +func (x *ResourceReference) ProtoReflect() protoreflect.Message {
        +	mi := &file_google_api_resource_proto_msgTypes[1]
        +	if protoimpl.UnsafeEnabled && x != nil {
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		if ms.LoadMessageInfo() == nil {
        +			ms.StoreMessageInfo(mi)
        +		}
        +		return ms
        +	}
        +	return mi.MessageOf(x)
        +}
        +
        +// Deprecated: Use ResourceReference.ProtoReflect.Descriptor instead.
        +func (*ResourceReference) Descriptor() ([]byte, []int) {
        +	return file_google_api_resource_proto_rawDescGZIP(), []int{1}
        +}
        +
        +func (x *ResourceReference) GetType() string {
        +	if x != nil {
        +		return x.Type
        +	}
        +	return ""
        +}
        +
        +func (x *ResourceReference) GetChildType() string {
        +	if x != nil {
        +		return x.ChildType
        +	}
        +	return ""
        +}
        +
        +var file_google_api_resource_proto_extTypes = []protoimpl.ExtensionInfo{
        +	{
        +		ExtendedType:  (*descriptor.FieldOptions)(nil),
        +		ExtensionType: (*ResourceReference)(nil),
        +		Field:         1055,
        +		Name:          "google.api.resource_reference",
        +		Tag:           "bytes,1055,opt,name=resource_reference",
        +		Filename:      "google/api/resource.proto",
        +	},
        +	{
        +		ExtendedType:  (*descriptor.FileOptions)(nil),
        +		ExtensionType: ([]*ResourceDescriptor)(nil),
        +		Field:         1053,
        +		Name:          "google.api.resource_definition",
        +		Tag:           "bytes,1053,rep,name=resource_definition",
        +		Filename:      "google/api/resource.proto",
        +	},
        +	{
        +		ExtendedType:  (*descriptor.MessageOptions)(nil),
        +		ExtensionType: (*ResourceDescriptor)(nil),
        +		Field:         1053,
        +		Name:          "google.api.resource",
        +		Tag:           "bytes,1053,opt,name=resource",
        +		Filename:      "google/api/resource.proto",
        +	},
        +}
        +
        +// Extension fields to descriptor.FieldOptions.
        +var (
        +	// An annotation that describes a resource reference, see
        +	// [ResourceReference][].
        +	//
        +	// optional google.api.ResourceReference resource_reference = 1055;
        +	E_ResourceReference = &file_google_api_resource_proto_extTypes[0]
        +)
        +
        +// Extension fields to descriptor.FileOptions.
        +var (
        +	// An annotation that describes a resource definition without a corresponding
        +	// message; see [ResourceDescriptor][].
        +	//
        +	// repeated google.api.ResourceDescriptor resource_definition = 1053;
        +	E_ResourceDefinition = &file_google_api_resource_proto_extTypes[1]
        +)
        +
        +// Extension fields to descriptor.MessageOptions.
        +var (
        +	// An annotation that describes a resource definition, see
        +	// [ResourceDescriptor][].
        +	//
        +	// optional google.api.ResourceDescriptor resource = 1053;
        +	E_Resource = &file_google_api_resource_proto_extTypes[2]
        +)
        +
        +var File_google_api_resource_proto protoreflect.FileDescriptor
        +
        +var file_google_api_resource_proto_rawDesc = []byte{
        +	0x0a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73,
        +	0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x67, 0x6f, 0x6f,
        +	0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,
        +	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,
        +	0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb4, 0x02, 0x0a, 0x12, 0x52, 0x65,
        +	0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72,
        +	0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
        +	0x74, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18,
        +	0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x1d,
        +	0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01,
        +	0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x40, 0x0a,
        +	0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26,
        +	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x6f,
        +	0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x48,
        +	0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12,
        +	0x16, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x72, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52,
        +	0x06, 0x70, 0x6c, 0x75, 0x72, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x69, 0x6e, 0x67, 0x75,
        +	0x6c, 0x61, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x69, 0x6e, 0x67, 0x75,
        +	0x6c, 0x61, 0x72, 0x22, 0x5b, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17,
        +	0x0a, 0x13, 0x48, 0x49, 0x53, 0x54, 0x4f, 0x52, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43,
        +	0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19, 0x4f, 0x52, 0x49, 0x47, 0x49,
        +	0x4e, 0x41, 0x4c, 0x4c, 0x59, 0x5f, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x5f, 0x50, 0x41, 0x54,
        +	0x54, 0x45, 0x52, 0x4e, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x46, 0x55, 0x54, 0x55, 0x52, 0x45,
        +	0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x50, 0x41, 0x54, 0x54, 0x45, 0x52, 0x4e, 0x10, 0x02,
        +	0x22, 0x46, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65,
        +	0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20,
        +	0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x69,
        +	0x6c, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63,
        +	0x68, 0x69, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x6c, 0x0a, 0x12, 0x72, 0x65, 0x73, 0x6f,
        +	0x75, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1d,
        +	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
        +	0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9f, 0x08,
        +	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70,
        +	0x69, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65,
        +	0x6e, 0x63, 0x65, 0x52, 0x11, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66,
        +	0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x6e, 0x0a, 0x13, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72,
        +	0x63, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x2e,
        +	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
        +	0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9d, 0x08, 0x20, 0x03,
        +	0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e,
        +	0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
        +	0x6f, 0x72, 0x52, 0x12, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x66, 0x69,
        +	0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x5c, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72,
        +	0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
        +	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69,
        +	0x6f, 0x6e, 0x73, 0x18, 0x9d, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f,
        +	0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
        +	0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f,
        +	0x75, 0x72, 0x63, 0x65, 0x42, 0x6e, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
        +	0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x0d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
        +	0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
        +	0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72,
        +	0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x61,
        +	0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x61,
        +	0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xf8, 0x01, 0x01, 0xa2, 0x02, 0x04,
        +	0x47, 0x41, 0x50, 0x49, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
        +}
        +
        +var (
        +	file_google_api_resource_proto_rawDescOnce sync.Once
        +	file_google_api_resource_proto_rawDescData = file_google_api_resource_proto_rawDesc
        +)
        +
        +func file_google_api_resource_proto_rawDescGZIP() []byte {
        +	file_google_api_resource_proto_rawDescOnce.Do(func() {
        +		file_google_api_resource_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_api_resource_proto_rawDescData)
        +	})
        +	return file_google_api_resource_proto_rawDescData
        +}
        +
        +var file_google_api_resource_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
        +var file_google_api_resource_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
        +var file_google_api_resource_proto_goTypes = []interface{}{
        +	(ResourceDescriptor_History)(0),   // 0: google.api.ResourceDescriptor.History
        +	(*ResourceDescriptor)(nil),        // 1: google.api.ResourceDescriptor
        +	(*ResourceReference)(nil),         // 2: google.api.ResourceReference
        +	(*descriptor.FieldOptions)(nil),   // 3: google.protobuf.FieldOptions
        +	(*descriptor.FileOptions)(nil),    // 4: google.protobuf.FileOptions
        +	(*descriptor.MessageOptions)(nil), // 5: google.protobuf.MessageOptions
        +}
        +var file_google_api_resource_proto_depIdxs = []int32{
        +	0, // 0: google.api.ResourceDescriptor.history:type_name -> google.api.ResourceDescriptor.History
        +	3, // 1: google.api.resource_reference:extendee -> google.protobuf.FieldOptions
        +	4, // 2: google.api.resource_definition:extendee -> google.protobuf.FileOptions
        +	5, // 3: google.api.resource:extendee -> google.protobuf.MessageOptions
        +	2, // 4: google.api.resource_reference:type_name -> google.api.ResourceReference
        +	1, // 5: google.api.resource_definition:type_name -> google.api.ResourceDescriptor
        +	1, // 6: google.api.resource:type_name -> google.api.ResourceDescriptor
        +	7, // [7:7] is the sub-list for method output_type
        +	7, // [7:7] is the sub-list for method input_type
        +	4, // [4:7] is the sub-list for extension type_name
        +	1, // [1:4] is the sub-list for extension extendee
        +	0, // [0:1] is the sub-list for field type_name
        +}
        +
        +func init() { file_google_api_resource_proto_init() }
        +func file_google_api_resource_proto_init() {
        +	if File_google_api_resource_proto != nil {
        +		return
        +	}
        +	if !protoimpl.UnsafeEnabled {
        +		file_google_api_resource_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
        +			switch v := v.(*ResourceDescriptor); i {
        +			case 0:
        +				return &v.state
        +			case 1:
        +				return &v.sizeCache
        +			case 2:
        +				return &v.unknownFields
        +			default:
        +				return nil
        +			}
        +		}
        +		file_google_api_resource_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
        +			switch v := v.(*ResourceReference); i {
        +			case 0:
        +				return &v.state
        +			case 1:
        +				return &v.sizeCache
        +			case 2:
        +				return &v.unknownFields
        +			default:
        +				return nil
        +			}
        +		}
        +	}
        +	type x struct{}
        +	out := protoimpl.TypeBuilder{
        +		File: protoimpl.DescBuilder{
        +			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
        +			RawDescriptor: file_google_api_resource_proto_rawDesc,
        +			NumEnums:      1,
        +			NumMessages:   2,
        +			NumExtensions: 3,
        +			NumServices:   0,
        +		},
        +		GoTypes:           file_google_api_resource_proto_goTypes,
        +		DependencyIndexes: file_google_api_resource_proto_depIdxs,
        +		EnumInfos:         file_google_api_resource_proto_enumTypes,
        +		MessageInfos:      file_google_api_resource_proto_msgTypes,
        +		ExtensionInfos:    file_google_api_resource_proto_extTypes,
        +	}.Build()
        +	File_google_api_resource_proto = out.File
        +	file_google_api_resource_proto_rawDesc = nil
        +	file_google_api_resource_proto_goTypes = nil
        +	file_google_api_resource_proto_depIdxs = nil
        +}
        diff --git a/vendor/google.golang.org/genproto/googleapis/iam/v1/iam_policy.pb.go b/vendor/google.golang.org/genproto/googleapis/iam/v1/iam_policy.pb.go
        index 5e7893f3f..fd9e2a159 100644
        --- a/vendor/google.golang.org/genproto/googleapis/iam/v1/iam_policy.pb.go
        +++ b/vendor/google.golang.org/genproto/googleapis/iam/v1/iam_policy.pb.go
        @@ -1,269 +1,487 @@
        +// Copyright 2019 Google LLC.
        +//
        +// Licensed under the Apache License, Version 2.0 (the "License");
        +// you may not use this file except in compliance with the License.
        +// You may obtain a copy of the License at
        +//
        +//     http://www.apache.org/licenses/LICENSE-2.0
        +//
        +// Unless required by applicable law or agreed to in writing, software
        +// distributed under the License is distributed on an "AS IS" BASIS,
        +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        +// See the License for the specific language governing permissions and
        +// limitations under the License.
        +//
        +
         // Code generated by protoc-gen-go. DO NOT EDIT.
        +// versions:
        +// 	protoc-gen-go v1.22.0
        +// 	protoc        v3.11.2
         // source: google/iam/v1/iam_policy.proto
         
         package iam
         
         import (
         	context "context"
        -	fmt "fmt"
        +	reflect "reflect"
        +	sync "sync"
        +
         	proto "github.com/golang/protobuf/proto"
         	_ "google.golang.org/genproto/googleapis/api/annotations"
         	grpc "google.golang.org/grpc"
        -	math "math"
        +	codes "google.golang.org/grpc/codes"
        +	status "google.golang.org/grpc/status"
        +	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
        +	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
         )
         
        -// Reference imports to suppress errors if they are not otherwise used.
        -var _ = proto.Marshal
        -var _ = fmt.Errorf
        -var _ = math.Inf
        +const (
        +	// Verify that this generated code is sufficiently up-to-date.
        +	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
        +	// Verify that runtime/protoimpl is sufficiently up-to-date.
        +	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
        +)
         
        -// This is a compile-time assertion to ensure that this generated file
        -// is compatible with the proto package it is being compiled against.
        -// A compilation error at this line likely means your copy of the
        -// proto package needs to be updated.
        -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
        +// This is a compile-time assertion that a sufficiently up-to-date version
        +// of the legacy proto package is being used.
        +const _ = proto.ProtoPackageIsVersion4
         
         // Request message for `SetIamPolicy` method.
         type SetIamPolicyRequest struct {
        +	state         protoimpl.MessageState
        +	sizeCache     protoimpl.SizeCache
        +	unknownFields protoimpl.UnknownFields
        +
         	// REQUIRED: The resource for which the policy is being specified.
        -	// `resource` is usually specified as a path. For example, a Project
        -	// resource is specified as `projects/{project}`.
        +	// See the operation documentation for the appropriate value for this field.
         	Resource string `protobuf:"bytes,1,opt,name=resource,proto3" json:"resource,omitempty"`
         	// REQUIRED: The complete policy to be applied to the `resource`. The size of
         	// the policy is limited to a few 10s of KB. An empty policy is a
         	// valid policy but certain Cloud Platform services (such as Projects)
         	// might reject them.
        -	Policy               *Policy  `protobuf:"bytes,2,opt,name=policy,proto3" json:"policy,omitempty"`
        -	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        -	XXX_unrecognized     []byte   `json:"-"`
        -	XXX_sizecache        int32    `json:"-"`
        +	Policy *Policy `protobuf:"bytes,2,opt,name=policy,proto3" json:"policy,omitempty"`
         }
         
        -func (m *SetIamPolicyRequest) Reset()         { *m = SetIamPolicyRequest{} }
        -func (m *SetIamPolicyRequest) String() string { return proto.CompactTextString(m) }
        -func (*SetIamPolicyRequest) ProtoMessage()    {}
        -func (*SetIamPolicyRequest) Descriptor() ([]byte, []int) {
        -	return fileDescriptor_d2728eb97d748a32, []int{0}
        +func (x *SetIamPolicyRequest) Reset() {
        +	*x = SetIamPolicyRequest{}
        +	if protoimpl.UnsafeEnabled {
        +		mi := &file_google_iam_v1_iam_policy_proto_msgTypes[0]
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		ms.StoreMessageInfo(mi)
        +	}
         }
         
        -func (m *SetIamPolicyRequest) XXX_Unmarshal(b []byte) error {
        -	return xxx_messageInfo_SetIamPolicyRequest.Unmarshal(m, b)
        -}
        -func (m *SetIamPolicyRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        -	return xxx_messageInfo_SetIamPolicyRequest.Marshal(b, m, deterministic)
        -}
        -func (m *SetIamPolicyRequest) XXX_Merge(src proto.Message) {
        -	xxx_messageInfo_SetIamPolicyRequest.Merge(m, src)
        +func (x *SetIamPolicyRequest) String() string {
        +	return protoimpl.X.MessageStringOf(x)
         }
        -func (m *SetIamPolicyRequest) XXX_Size() int {
        -	return xxx_messageInfo_SetIamPolicyRequest.Size(m)
        -}
        -func (m *SetIamPolicyRequest) XXX_DiscardUnknown() {
        -	xxx_messageInfo_SetIamPolicyRequest.DiscardUnknown(m)
        +
        +func (*SetIamPolicyRequest) ProtoMessage() {}
        +
        +func (x *SetIamPolicyRequest) ProtoReflect() protoreflect.Message {
        +	mi := &file_google_iam_v1_iam_policy_proto_msgTypes[0]
        +	if protoimpl.UnsafeEnabled && x != nil {
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		if ms.LoadMessageInfo() == nil {
        +			ms.StoreMessageInfo(mi)
        +		}
        +		return ms
        +	}
        +	return mi.MessageOf(x)
         }
         
        -var xxx_messageInfo_SetIamPolicyRequest proto.InternalMessageInfo
        +// Deprecated: Use SetIamPolicyRequest.ProtoReflect.Descriptor instead.
        +func (*SetIamPolicyRequest) Descriptor() ([]byte, []int) {
        +	return file_google_iam_v1_iam_policy_proto_rawDescGZIP(), []int{0}
        +}
         
        -func (m *SetIamPolicyRequest) GetResource() string {
        -	if m != nil {
        -		return m.Resource
        +func (x *SetIamPolicyRequest) GetResource() string {
        +	if x != nil {
        +		return x.Resource
         	}
         	return ""
         }
         
        -func (m *SetIamPolicyRequest) GetPolicy() *Policy {
        -	if m != nil {
        -		return m.Policy
        +func (x *SetIamPolicyRequest) GetPolicy() *Policy {
        +	if x != nil {
        +		return x.Policy
         	}
         	return nil
         }
         
         // Request message for `GetIamPolicy` method.
         type GetIamPolicyRequest struct {
        +	state         protoimpl.MessageState
        +	sizeCache     protoimpl.SizeCache
        +	unknownFields protoimpl.UnknownFields
        +
         	// REQUIRED: The resource for which the policy is being requested.
        -	// `resource` is usually specified as a path. For example, a Project
        -	// resource is specified as `projects/{project}`.
        -	Resource             string   `protobuf:"bytes,1,opt,name=resource,proto3" json:"resource,omitempty"`
        -	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        -	XXX_unrecognized     []byte   `json:"-"`
        -	XXX_sizecache        int32    `json:"-"`
        +	// See the operation documentation for the appropriate value for this field.
        +	Resource string `protobuf:"bytes,1,opt,name=resource,proto3" json:"resource,omitempty"`
        +	// OPTIONAL: A `GetPolicyOptions` object for specifying options to
        +	// `GetIamPolicy`. This field is only used by Cloud IAM.
        +	Options *GetPolicyOptions `protobuf:"bytes,2,opt,name=options,proto3" json:"options,omitempty"`
         }
         
        -func (m *GetIamPolicyRequest) Reset()         { *m = GetIamPolicyRequest{} }
        -func (m *GetIamPolicyRequest) String() string { return proto.CompactTextString(m) }
        -func (*GetIamPolicyRequest) ProtoMessage()    {}
        -func (*GetIamPolicyRequest) Descriptor() ([]byte, []int) {
        -	return fileDescriptor_d2728eb97d748a32, []int{1}
        +func (x *GetIamPolicyRequest) Reset() {
        +	*x = GetIamPolicyRequest{}
        +	if protoimpl.UnsafeEnabled {
        +		mi := &file_google_iam_v1_iam_policy_proto_msgTypes[1]
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		ms.StoreMessageInfo(mi)
        +	}
         }
         
        -func (m *GetIamPolicyRequest) XXX_Unmarshal(b []byte) error {
        -	return xxx_messageInfo_GetIamPolicyRequest.Unmarshal(m, b)
        -}
        -func (m *GetIamPolicyRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        -	return xxx_messageInfo_GetIamPolicyRequest.Marshal(b, m, deterministic)
        -}
        -func (m *GetIamPolicyRequest) XXX_Merge(src proto.Message) {
        -	xxx_messageInfo_GetIamPolicyRequest.Merge(m, src)
        -}
        -func (m *GetIamPolicyRequest) XXX_Size() int {
        -	return xxx_messageInfo_GetIamPolicyRequest.Size(m)
        +func (x *GetIamPolicyRequest) String() string {
        +	return protoimpl.X.MessageStringOf(x)
         }
        -func (m *GetIamPolicyRequest) XXX_DiscardUnknown() {
        -	xxx_messageInfo_GetIamPolicyRequest.DiscardUnknown(m)
        +
        +func (*GetIamPolicyRequest) ProtoMessage() {}
        +
        +func (x *GetIamPolicyRequest) ProtoReflect() protoreflect.Message {
        +	mi := &file_google_iam_v1_iam_policy_proto_msgTypes[1]
        +	if protoimpl.UnsafeEnabled && x != nil {
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		if ms.LoadMessageInfo() == nil {
        +			ms.StoreMessageInfo(mi)
        +		}
        +		return ms
        +	}
        +	return mi.MessageOf(x)
         }
         
        -var xxx_messageInfo_GetIamPolicyRequest proto.InternalMessageInfo
        +// Deprecated: Use GetIamPolicyRequest.ProtoReflect.Descriptor instead.
        +func (*GetIamPolicyRequest) Descriptor() ([]byte, []int) {
        +	return file_google_iam_v1_iam_policy_proto_rawDescGZIP(), []int{1}
        +}
         
        -func (m *GetIamPolicyRequest) GetResource() string {
        -	if m != nil {
        -		return m.Resource
        +func (x *GetIamPolicyRequest) GetResource() string {
        +	if x != nil {
        +		return x.Resource
         	}
         	return ""
         }
         
        +func (x *GetIamPolicyRequest) GetOptions() *GetPolicyOptions {
        +	if x != nil {
        +		return x.Options
        +	}
        +	return nil
        +}
        +
         // Request message for `TestIamPermissions` method.
         type TestIamPermissionsRequest struct {
        +	state         protoimpl.MessageState
        +	sizeCache     protoimpl.SizeCache
        +	unknownFields protoimpl.UnknownFields
        +
         	// REQUIRED: The resource for which the policy detail is being requested.
        -	// `resource` is usually specified as a path. For example, a Project
        -	// resource is specified as `projects/{project}`.
        +	// See the operation documentation for the appropriate value for this field.
         	Resource string `protobuf:"bytes,1,opt,name=resource,proto3" json:"resource,omitempty"`
         	// The set of permissions to check for the `resource`. Permissions with
         	// wildcards (such as '*' or 'storage.*') are not allowed. For more
         	// information see
         	// [IAM Overview](https://cloud.google.com/iam/docs/overview#permissions).
        -	Permissions          []string `protobuf:"bytes,2,rep,name=permissions,proto3" json:"permissions,omitempty"`
        -	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        -	XXX_unrecognized     []byte   `json:"-"`
        -	XXX_sizecache        int32    `json:"-"`
        +	Permissions []string `protobuf:"bytes,2,rep,name=permissions,proto3" json:"permissions,omitempty"`
         }
         
        -func (m *TestIamPermissionsRequest) Reset()         { *m = TestIamPermissionsRequest{} }
        -func (m *TestIamPermissionsRequest) String() string { return proto.CompactTextString(m) }
        -func (*TestIamPermissionsRequest) ProtoMessage()    {}
        -func (*TestIamPermissionsRequest) Descriptor() ([]byte, []int) {
        -	return fileDescriptor_d2728eb97d748a32, []int{2}
        +func (x *TestIamPermissionsRequest) Reset() {
        +	*x = TestIamPermissionsRequest{}
        +	if protoimpl.UnsafeEnabled {
        +		mi := &file_google_iam_v1_iam_policy_proto_msgTypes[2]
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		ms.StoreMessageInfo(mi)
        +	}
         }
         
        -func (m *TestIamPermissionsRequest) XXX_Unmarshal(b []byte) error {
        -	return xxx_messageInfo_TestIamPermissionsRequest.Unmarshal(m, b)
        -}
        -func (m *TestIamPermissionsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        -	return xxx_messageInfo_TestIamPermissionsRequest.Marshal(b, m, deterministic)
        +func (x *TestIamPermissionsRequest) String() string {
        +	return protoimpl.X.MessageStringOf(x)
         }
        -func (m *TestIamPermissionsRequest) XXX_Merge(src proto.Message) {
        -	xxx_messageInfo_TestIamPermissionsRequest.Merge(m, src)
        -}
        -func (m *TestIamPermissionsRequest) XXX_Size() int {
        -	return xxx_messageInfo_TestIamPermissionsRequest.Size(m)
        -}
        -func (m *TestIamPermissionsRequest) XXX_DiscardUnknown() {
        -	xxx_messageInfo_TestIamPermissionsRequest.DiscardUnknown(m)
        +
        +func (*TestIamPermissionsRequest) ProtoMessage() {}
        +
        +func (x *TestIamPermissionsRequest) ProtoReflect() protoreflect.Message {
        +	mi := &file_google_iam_v1_iam_policy_proto_msgTypes[2]
        +	if protoimpl.UnsafeEnabled && x != nil {
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		if ms.LoadMessageInfo() == nil {
        +			ms.StoreMessageInfo(mi)
        +		}
        +		return ms
        +	}
        +	return mi.MessageOf(x)
         }
         
        -var xxx_messageInfo_TestIamPermissionsRequest proto.InternalMessageInfo
        +// Deprecated: Use TestIamPermissionsRequest.ProtoReflect.Descriptor instead.
        +func (*TestIamPermissionsRequest) Descriptor() ([]byte, []int) {
        +	return file_google_iam_v1_iam_policy_proto_rawDescGZIP(), []int{2}
        +}
         
        -func (m *TestIamPermissionsRequest) GetResource() string {
        -	if m != nil {
        -		return m.Resource
        +func (x *TestIamPermissionsRequest) GetResource() string {
        +	if x != nil {
        +		return x.Resource
         	}
         	return ""
         }
         
        -func (m *TestIamPermissionsRequest) GetPermissions() []string {
        -	if m != nil {
        -		return m.Permissions
        +func (x *TestIamPermissionsRequest) GetPermissions() []string {
        +	if x != nil {
        +		return x.Permissions
         	}
         	return nil
         }
         
         // Response message for `TestIamPermissions` method.
         type TestIamPermissionsResponse struct {
        +	state         protoimpl.MessageState
        +	sizeCache     protoimpl.SizeCache
        +	unknownFields protoimpl.UnknownFields
        +
         	// A subset of `TestPermissionsRequest.permissions` that the caller is
         	// allowed.
        -	Permissions          []string `protobuf:"bytes,1,rep,name=permissions,proto3" json:"permissions,omitempty"`
        -	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        -	XXX_unrecognized     []byte   `json:"-"`
        -	XXX_sizecache        int32    `json:"-"`
        +	Permissions []string `protobuf:"bytes,1,rep,name=permissions,proto3" json:"permissions,omitempty"`
         }
         
        -func (m *TestIamPermissionsResponse) Reset()         { *m = TestIamPermissionsResponse{} }
        -func (m *TestIamPermissionsResponse) String() string { return proto.CompactTextString(m) }
        -func (*TestIamPermissionsResponse) ProtoMessage()    {}
        -func (*TestIamPermissionsResponse) Descriptor() ([]byte, []int) {
        -	return fileDescriptor_d2728eb97d748a32, []int{3}
        +func (x *TestIamPermissionsResponse) Reset() {
        +	*x = TestIamPermissionsResponse{}
        +	if protoimpl.UnsafeEnabled {
        +		mi := &file_google_iam_v1_iam_policy_proto_msgTypes[3]
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		ms.StoreMessageInfo(mi)
        +	}
         }
         
        -func (m *TestIamPermissionsResponse) XXX_Unmarshal(b []byte) error {
        -	return xxx_messageInfo_TestIamPermissionsResponse.Unmarshal(m, b)
        -}
        -func (m *TestIamPermissionsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        -	return xxx_messageInfo_TestIamPermissionsResponse.Marshal(b, m, deterministic)
        -}
        -func (m *TestIamPermissionsResponse) XXX_Merge(src proto.Message) {
        -	xxx_messageInfo_TestIamPermissionsResponse.Merge(m, src)
        +func (x *TestIamPermissionsResponse) String() string {
        +	return protoimpl.X.MessageStringOf(x)
         }
        -func (m *TestIamPermissionsResponse) XXX_Size() int {
        -	return xxx_messageInfo_TestIamPermissionsResponse.Size(m)
        -}
        -func (m *TestIamPermissionsResponse) XXX_DiscardUnknown() {
        -	xxx_messageInfo_TestIamPermissionsResponse.DiscardUnknown(m)
        +
        +func (*TestIamPermissionsResponse) ProtoMessage() {}
        +
        +func (x *TestIamPermissionsResponse) ProtoReflect() protoreflect.Message {
        +	mi := &file_google_iam_v1_iam_policy_proto_msgTypes[3]
        +	if protoimpl.UnsafeEnabled && x != nil {
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		if ms.LoadMessageInfo() == nil {
        +			ms.StoreMessageInfo(mi)
        +		}
        +		return ms
        +	}
        +	return mi.MessageOf(x)
         }
         
        -var xxx_messageInfo_TestIamPermissionsResponse proto.InternalMessageInfo
        +// Deprecated: Use TestIamPermissionsResponse.ProtoReflect.Descriptor instead.
        +func (*TestIamPermissionsResponse) Descriptor() ([]byte, []int) {
        +	return file_google_iam_v1_iam_policy_proto_rawDescGZIP(), []int{3}
        +}
         
        -func (m *TestIamPermissionsResponse) GetPermissions() []string {
        -	if m != nil {
        -		return m.Permissions
        +func (x *TestIamPermissionsResponse) GetPermissions() []string {
        +	if x != nil {
        +		return x.Permissions
         	}
         	return nil
         }
         
        -func init() {
        -	proto.RegisterType((*SetIamPolicyRequest)(nil), "google.iam.v1.SetIamPolicyRequest")
        -	proto.RegisterType((*GetIamPolicyRequest)(nil), "google.iam.v1.GetIamPolicyRequest")
        -	proto.RegisterType((*TestIamPermissionsRequest)(nil), "google.iam.v1.TestIamPermissionsRequest")
        -	proto.RegisterType((*TestIamPermissionsResponse)(nil), "google.iam.v1.TestIamPermissionsResponse")
        -}
        -
        -func init() { proto.RegisterFile("google/iam/v1/iam_policy.proto", fileDescriptor_d2728eb97d748a32) }
        -
        -var fileDescriptor_d2728eb97d748a32 = []byte{
        -	// 411 bytes of a gzipped FileDescriptorProto
        -	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4b, 0xcf, 0xcf, 0x4f,
        -	0xcf, 0x49, 0xd5, 0xcf, 0x4c, 0xcc, 0xd5, 0x2f, 0x33, 0x04, 0x51, 0xf1, 0x05, 0xf9, 0x39, 0x99,
        -	0xc9, 0x95, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0xbc, 0x10, 0x79, 0xbd, 0xcc, 0xc4, 0x5c,
        -	0xbd, 0x32, 0x43, 0x29, 0x19, 0xa8, 0xf2, 0xc4, 0x82, 0x4c, 0xfd, 0xc4, 0xbc, 0xbc, 0xfc, 0x92,
        -	0xc4, 0x92, 0xcc, 0xfc, 0xbc, 0x62, 0x88, 0x62, 0x29, 0x29, 0x54, 0xc3, 0x90, 0x0d, 0x52, 0x4a,
        -	0xe0, 0x12, 0x0e, 0x4e, 0x2d, 0xf1, 0x4c, 0xcc, 0x0d, 0x00, 0x8b, 0x06, 0xa5, 0x16, 0x96, 0xa6,
        -	0x16, 0x97, 0x08, 0x49, 0x71, 0x71, 0x14, 0xa5, 0x16, 0xe7, 0x97, 0x16, 0x25, 0xa7, 0x4a, 0x30,
        -	0x2a, 0x30, 0x6a, 0x70, 0x06, 0xc1, 0xf9, 0x42, 0xba, 0x5c, 0x6c, 0x10, 0x23, 0x24, 0x98, 0x14,
        -	0x18, 0x35, 0xb8, 0x8d, 0x44, 0xf5, 0x50, 0x1c, 0xa3, 0x07, 0x35, 0x09, 0xaa, 0x48, 0xc9, 0x90,
        -	0x4b, 0xd8, 0x9d, 0x34, 0x1b, 0x94, 0x22, 0xb9, 0x24, 0x43, 0x52, 0x8b, 0xc1, 0x7a, 0x52, 0x8b,
        -	0x72, 0x33, 0x8b, 0x8b, 0x41, 0x9e, 0x21, 0xc6, 0x69, 0x0a, 0x5c, 0xdc, 0x05, 0x08, 0x1d, 0x12,
        -	0x4c, 0x0a, 0xcc, 0x1a, 0x9c, 0x41, 0xc8, 0x42, 0x4a, 0x76, 0x5c, 0x52, 0xd8, 0x8c, 0x2e, 0x2e,
        -	0xc8, 0xcf, 0x2b, 0xc6, 0xd0, 0xcf, 0x88, 0xa1, 0xdf, 0x68, 0x0a, 0x33, 0x17, 0xa7, 0xa7, 0xa3,
        -	0x2f, 0xc4, 0x2f, 0x42, 0x25, 0x5c, 0x3c, 0xc8, 0xa1, 0x27, 0xa4, 0x84, 0x16, 0x14, 0x58, 0x82,
        -	0x56, 0x0a, 0x7b, 0x70, 0x29, 0x69, 0x36, 0x5d, 0x7e, 0x32, 0x99, 0x49, 0x59, 0x49, 0x0e, 0x14,
        -	0x45, 0xd5, 0x30, 0x1f, 0xd9, 0x6a, 0x69, 0xd5, 0x5a, 0x15, 0x23, 0x99, 0x62, 0xc5, 0xa8, 0x05,
        -	0xb2, 0xd5, 0x1d, 0x9f, 0xad, 0xee, 0x54, 0xb1, 0x35, 0x1d, 0xcd, 0xd6, 0x59, 0x8c, 0x5c, 0x42,
        -	0x98, 0x41, 0x27, 0xa4, 0x81, 0x66, 0x30, 0xce, 0x88, 0x93, 0xd2, 0x24, 0x42, 0x25, 0x24, 0x1e,
        -	0x94, 0xf4, 0xc1, 0xce, 0xd2, 0x54, 0x52, 0xc1, 0x74, 0x56, 0x09, 0x86, 0x2e, 0x2b, 0x46, 0x2d,
        -	0xa7, 0x36, 0x46, 0x2e, 0xc1, 0xe4, 0xfc, 0x5c, 0x54, 0x1b, 0x9c, 0xf8, 0xe0, 0x1e, 0x08, 0x00,
        -	0x25, 0xf6, 0x00, 0xc6, 0x28, 0x03, 0xa8, 0x82, 0xf4, 0xfc, 0x9c, 0xc4, 0xbc, 0x74, 0xbd, 0xfc,
        -	0xa2, 0x74, 0xfd, 0xf4, 0xd4, 0x3c, 0x70, 0x56, 0xd0, 0x87, 0x48, 0x25, 0x16, 0x64, 0x16, 0x43,
        -	0x73, 0x8a, 0x75, 0x66, 0x62, 0xee, 0x0f, 0x46, 0xc6, 0x55, 0x4c, 0xc2, 0xee, 0x10, 0x5d, 0xce,
        -	0x39, 0xf9, 0xa5, 0x29, 0x7a, 0x9e, 0x89, 0xb9, 0x7a, 0x61, 0x86, 0xa7, 0x60, 0xa2, 0x31, 0x60,
        -	0xd1, 0x18, 0xcf, 0xc4, 0xdc, 0x98, 0x30, 0xc3, 0x24, 0x36, 0xb0, 0x59, 0xc6, 0x80, 0x00, 0x00,
        -	0x00, 0xff, 0xff, 0xea, 0x62, 0x8f, 0x22, 0xc1, 0x03, 0x00, 0x00,
        +var File_google_iam_v1_iam_policy_proto protoreflect.FileDescriptor
        +
        +var file_google_iam_v1_iam_policy_proto_rawDesc = []byte{
        +	0x0a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x76, 0x31, 0x2f,
        +	0x69, 0x61, 0x6d, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
        +	0x12, 0x0d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x1a,
        +	0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x6f,
        +	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x67, 0x6f,
        +	0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x6f, 0x6c, 0x69,
        +	0x63, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
        +	0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
        +	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61,
        +	0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,
        +	0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c,
        +	0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
        +	0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73,
        +	0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x70, 0x0a, 0x13, 0x53,
        +	0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65,
        +	0x73, 0x74, 0x12, 0x25, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01,
        +	0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x03, 0x0a, 0x01, 0x2a, 0x52,
        +	0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x70, 0x6f, 0x6c,
        +	0x69, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
        +	0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,
        +	0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x77, 0x0a,
        +	0x13, 0x47, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71,
        +	0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
        +	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x03, 0x0a, 0x01,
        +	0x2a, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x07, 0x6f,
        +	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67,
        +	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74,
        +	0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f,
        +	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x69, 0x0a, 0x19, 0x54, 0x65, 0x73, 0x74, 0x49, 0x61,
        +	0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75,
        +	0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18,
        +	0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x03, 0x0a, 0x01, 0x2a,
        +	0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x65,
        +	0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42,
        +	0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e,
        +	0x73, 0x22, 0x3e, 0x0a, 0x1a, 0x54, 0x65, 0x73, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d,
        +	0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
        +	0x20, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01,
        +	0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e,
        +	0x73, 0x32, 0xb4, 0x03, 0x0a, 0x09, 0x49, 0x41, 0x4d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12,
        +	0x74, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12,
        +	0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e,
        +	0x53, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75,
        +	0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d,
        +	0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93,
        +	0x02, 0x23, 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,
        +	0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x3a, 0x73, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69,
        +	0x63, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50,
        +	0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69,
        +	0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69,
        +	0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
        +	0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,
        +	0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x72,
        +	0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x3a, 0x67, 0x65, 0x74, 0x49,
        +	0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x9a, 0x01, 0x0a, 0x12,
        +	0x54, 0x65, 0x73, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f,
        +	0x6e, 0x73, 0x12, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e,
        +	0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73,
        +	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67,
        +	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73,
        +	0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52,
        +	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x22,
        +	0x24, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3d, 0x2a,
        +	0x2a, 0x7d, 0x3a, 0x74, 0x65, 0x73, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73,
        +	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x01, 0x2a, 0x1a, 0x1e, 0xca, 0x41, 0x1b, 0x69, 0x61, 0x6d,
        +	0x2d, 0x6d, 0x65, 0x74, 0x61, 0x2d, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
        +	0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x42, 0x86, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d,
        +	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x42, 0x0e,
        +	0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01,
        +	0x5a, 0x30, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e,
        +	0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f,
        +	0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x76, 0x31, 0x3b, 0x69,
        +	0x61, 0x6d, 0xf8, 0x01, 0x01, 0xaa, 0x02, 0x13, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43,
        +	0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x49, 0x61, 0x6d, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x13, 0x47, 0x6f,
        +	0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x49, 0x61, 0x6d, 0x5c, 0x56,
        +	0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
        +}
        +
        +var (
        +	file_google_iam_v1_iam_policy_proto_rawDescOnce sync.Once
        +	file_google_iam_v1_iam_policy_proto_rawDescData = file_google_iam_v1_iam_policy_proto_rawDesc
        +)
        +
        +func file_google_iam_v1_iam_policy_proto_rawDescGZIP() []byte {
        +	file_google_iam_v1_iam_policy_proto_rawDescOnce.Do(func() {
        +		file_google_iam_v1_iam_policy_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_iam_v1_iam_policy_proto_rawDescData)
        +	})
        +	return file_google_iam_v1_iam_policy_proto_rawDescData
        +}
        +
        +var file_google_iam_v1_iam_policy_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
        +var file_google_iam_v1_iam_policy_proto_goTypes = []interface{}{
        +	(*SetIamPolicyRequest)(nil),        // 0: google.iam.v1.SetIamPolicyRequest
        +	(*GetIamPolicyRequest)(nil),        // 1: google.iam.v1.GetIamPolicyRequest
        +	(*TestIamPermissionsRequest)(nil),  // 2: google.iam.v1.TestIamPermissionsRequest
        +	(*TestIamPermissionsResponse)(nil), // 3: google.iam.v1.TestIamPermissionsResponse
        +	(*Policy)(nil),                     // 4: google.iam.v1.Policy
        +	(*GetPolicyOptions)(nil),           // 5: google.iam.v1.GetPolicyOptions
        +}
        +var file_google_iam_v1_iam_policy_proto_depIdxs = []int32{
        +	4, // 0: google.iam.v1.SetIamPolicyRequest.policy:type_name -> google.iam.v1.Policy
        +	5, // 1: google.iam.v1.GetIamPolicyRequest.options:type_name -> google.iam.v1.GetPolicyOptions
        +	0, // 2: google.iam.v1.IAMPolicy.SetIamPolicy:input_type -> google.iam.v1.SetIamPolicyRequest
        +	1, // 3: google.iam.v1.IAMPolicy.GetIamPolicy:input_type -> google.iam.v1.GetIamPolicyRequest
        +	2, // 4: google.iam.v1.IAMPolicy.TestIamPermissions:input_type -> google.iam.v1.TestIamPermissionsRequest
        +	4, // 5: google.iam.v1.IAMPolicy.SetIamPolicy:output_type -> google.iam.v1.Policy
        +	4, // 6: google.iam.v1.IAMPolicy.GetIamPolicy:output_type -> google.iam.v1.Policy
        +	3, // 7: google.iam.v1.IAMPolicy.TestIamPermissions:output_type -> google.iam.v1.TestIamPermissionsResponse
        +	5, // [5:8] is the sub-list for method output_type
        +	2, // [2:5] is the sub-list for method input_type
        +	2, // [2:2] is the sub-list for extension type_name
        +	2, // [2:2] is the sub-list for extension extendee
        +	0, // [0:2] is the sub-list for field type_name
        +}
        +
        +func init() { file_google_iam_v1_iam_policy_proto_init() }
        +func file_google_iam_v1_iam_policy_proto_init() {
        +	if File_google_iam_v1_iam_policy_proto != nil {
        +		return
        +	}
        +	file_google_iam_v1_options_proto_init()
        +	file_google_iam_v1_policy_proto_init()
        +	if !protoimpl.UnsafeEnabled {
        +		file_google_iam_v1_iam_policy_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
        +			switch v := v.(*SetIamPolicyRequest); i {
        +			case 0:
        +				return &v.state
        +			case 1:
        +				return &v.sizeCache
        +			case 2:
        +				return &v.unknownFields
        +			default:
        +				return nil
        +			}
        +		}
        +		file_google_iam_v1_iam_policy_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
        +			switch v := v.(*GetIamPolicyRequest); i {
        +			case 0:
        +				return &v.state
        +			case 1:
        +				return &v.sizeCache
        +			case 2:
        +				return &v.unknownFields
        +			default:
        +				return nil
        +			}
        +		}
        +		file_google_iam_v1_iam_policy_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
        +			switch v := v.(*TestIamPermissionsRequest); i {
        +			case 0:
        +				return &v.state
        +			case 1:
        +				return &v.sizeCache
        +			case 2:
        +				return &v.unknownFields
        +			default:
        +				return nil
        +			}
        +		}
        +		file_google_iam_v1_iam_policy_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
        +			switch v := v.(*TestIamPermissionsResponse); i {
        +			case 0:
        +				return &v.state
        +			case 1:
        +				return &v.sizeCache
        +			case 2:
        +				return &v.unknownFields
        +			default:
        +				return nil
        +			}
        +		}
        +	}
        +	type x struct{}
        +	out := protoimpl.TypeBuilder{
        +		File: protoimpl.DescBuilder{
        +			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
        +			RawDescriptor: file_google_iam_v1_iam_policy_proto_rawDesc,
        +			NumEnums:      0,
        +			NumMessages:   4,
        +			NumExtensions: 0,
        +			NumServices:   1,
        +		},
        +		GoTypes:           file_google_iam_v1_iam_policy_proto_goTypes,
        +		DependencyIndexes: file_google_iam_v1_iam_policy_proto_depIdxs,
        +		MessageInfos:      file_google_iam_v1_iam_policy_proto_msgTypes,
        +	}.Build()
        +	File_google_iam_v1_iam_policy_proto = out.File
        +	file_google_iam_v1_iam_policy_proto_rawDesc = nil
        +	file_google_iam_v1_iam_policy_proto_goTypes = nil
        +	file_google_iam_v1_iam_policy_proto_depIdxs = nil
         }
         
         // Reference imports to suppress errors if they are not otherwise used.
         var _ context.Context
        -var _ grpc.ClientConn
        +var _ grpc.ClientConnInterface
         
         // This is a compile-time assertion to ensure that this generated file
         // is compatible with the grpc package it is being compiled against.
        -const _ = grpc.SupportPackageIsVersion4
        +const _ = grpc.SupportPackageIsVersion6
         
         // IAMPolicyClient is the client API for IAMPolicy service.
         //
        @@ -279,14 +497,18 @@ type IAMPolicyClient interface {
         	// Returns permissions that a caller has on the specified resource.
         	// If the resource does not exist, this will return an empty set of
         	// permissions, not a NOT_FOUND error.
        +	//
        +	// Note: This operation is designed to be used for building permission-aware
        +	// UIs and command-line tools, not for authorization checking. This operation
        +	// may "fail open" without warning.
         	TestIamPermissions(ctx context.Context, in *TestIamPermissionsRequest, opts ...grpc.CallOption) (*TestIamPermissionsResponse, error)
         }
         
         type iAMPolicyClient struct {
        -	cc *grpc.ClientConn
        +	cc grpc.ClientConnInterface
         }
         
        -func NewIAMPolicyClient(cc *grpc.ClientConn) IAMPolicyClient {
        +func NewIAMPolicyClient(cc grpc.ClientConnInterface) IAMPolicyClient {
         	return &iAMPolicyClient{cc}
         }
         
        @@ -329,9 +551,27 @@ type IAMPolicyServer interface {
         	// Returns permissions that a caller has on the specified resource.
         	// If the resource does not exist, this will return an empty set of
         	// permissions, not a NOT_FOUND error.
        +	//
        +	// Note: This operation is designed to be used for building permission-aware
        +	// UIs and command-line tools, not for authorization checking. This operation
        +	// may "fail open" without warning.
         	TestIamPermissions(context.Context, *TestIamPermissionsRequest) (*TestIamPermissionsResponse, error)
         }
         
        +// UnimplementedIAMPolicyServer can be embedded to have forward compatible implementations.
        +type UnimplementedIAMPolicyServer struct {
        +}
        +
        +func (*UnimplementedIAMPolicyServer) SetIamPolicy(context.Context, *SetIamPolicyRequest) (*Policy, error) {
        +	return nil, status.Errorf(codes.Unimplemented, "method SetIamPolicy not implemented")
        +}
        +func (*UnimplementedIAMPolicyServer) GetIamPolicy(context.Context, *GetIamPolicyRequest) (*Policy, error) {
        +	return nil, status.Errorf(codes.Unimplemented, "method GetIamPolicy not implemented")
        +}
        +func (*UnimplementedIAMPolicyServer) TestIamPermissions(context.Context, *TestIamPermissionsRequest) (*TestIamPermissionsResponse, error) {
        +	return nil, status.Errorf(codes.Unimplemented, "method TestIamPermissions not implemented")
        +}
        +
         func RegisterIAMPolicyServer(s *grpc.Server, srv IAMPolicyServer) {
         	s.RegisterService(&_IAMPolicy_serviceDesc, srv)
         }
        diff --git a/vendor/google.golang.org/genproto/googleapis/iam/v1/options.pb.go b/vendor/google.golang.org/genproto/googleapis/iam/v1/options.pb.go
        new file mode 100644
        index 000000000..36d8f5305
        --- /dev/null
        +++ b/vendor/google.golang.org/genproto/googleapis/iam/v1/options.pb.go
        @@ -0,0 +1,186 @@
        +// Copyright 2019 Google LLC.
        +//
        +// Licensed under the Apache License, Version 2.0 (the "License");
        +// you may not use this file except in compliance with the License.
        +// You may obtain a copy of the License at
        +//
        +//     http://www.apache.org/licenses/LICENSE-2.0
        +//
        +// Unless required by applicable law or agreed to in writing, software
        +// distributed under the License is distributed on an "AS IS" BASIS,
        +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        +// See the License for the specific language governing permissions and
        +// limitations under the License.
        +//
        +
        +// Code generated by protoc-gen-go. DO NOT EDIT.
        +// versions:
        +// 	protoc-gen-go v1.22.0
        +// 	protoc        v3.11.2
        +// source: google/iam/v1/options.proto
        +
        +package iam
        +
        +import (
        +	reflect "reflect"
        +	sync "sync"
        +
        +	proto "github.com/golang/protobuf/proto"
        +	_ "google.golang.org/genproto/googleapis/api/annotations"
        +	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
        +	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
        +)
        +
        +const (
        +	// Verify that this generated code is sufficiently up-to-date.
        +	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
        +	// Verify that runtime/protoimpl is sufficiently up-to-date.
        +	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
        +)
        +
        +// This is a compile-time assertion that a sufficiently up-to-date version
        +// of the legacy proto package is being used.
        +const _ = proto.ProtoPackageIsVersion4
        +
        +// Encapsulates settings provided to GetIamPolicy.
        +type GetPolicyOptions struct {
        +	state         protoimpl.MessageState
        +	sizeCache     protoimpl.SizeCache
        +	unknownFields protoimpl.UnknownFields
        +
        +	// Optional. The policy format version to be returned.
        +	//
        +	// Valid values are 0, 1, and 3. Requests specifying an invalid value will be
        +	// rejected.
        +	//
        +	// Requests for policies with any conditional bindings must specify version 3.
        +	// Policies without any conditional bindings may specify any valid value or
        +	// leave the field unset.
        +	RequestedPolicyVersion int32 `protobuf:"varint,1,opt,name=requested_policy_version,json=requestedPolicyVersion,proto3" json:"requested_policy_version,omitempty"`
        +}
        +
        +func (x *GetPolicyOptions) Reset() {
        +	*x = GetPolicyOptions{}
        +	if protoimpl.UnsafeEnabled {
        +		mi := &file_google_iam_v1_options_proto_msgTypes[0]
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		ms.StoreMessageInfo(mi)
        +	}
        +}
        +
        +func (x *GetPolicyOptions) String() string {
        +	return protoimpl.X.MessageStringOf(x)
        +}
        +
        +func (*GetPolicyOptions) ProtoMessage() {}
        +
        +func (x *GetPolicyOptions) ProtoReflect() protoreflect.Message {
        +	mi := &file_google_iam_v1_options_proto_msgTypes[0]
        +	if protoimpl.UnsafeEnabled && x != nil {
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		if ms.LoadMessageInfo() == nil {
        +			ms.StoreMessageInfo(mi)
        +		}
        +		return ms
        +	}
        +	return mi.MessageOf(x)
        +}
        +
        +// Deprecated: Use GetPolicyOptions.ProtoReflect.Descriptor instead.
        +func (*GetPolicyOptions) Descriptor() ([]byte, []int) {
        +	return file_google_iam_v1_options_proto_rawDescGZIP(), []int{0}
        +}
        +
        +func (x *GetPolicyOptions) GetRequestedPolicyVersion() int32 {
        +	if x != nil {
        +		return x.RequestedPolicyVersion
        +	}
        +	return 0
        +}
        +
        +var File_google_iam_v1_options_proto protoreflect.FileDescriptor
        +
        +var file_google_iam_v1_options_proto_rawDesc = []byte{
        +	0x0a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x76, 0x31, 0x2f,
        +	0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x67,
        +	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f,
        +	0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74,
        +	0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x4c, 0x0a, 0x10, 0x47, 0x65,
        +	0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x38,
        +	0x0a, 0x18, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6c, 0x69,
        +	0x63, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05,
        +	0x52, 0x16, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63,
        +	0x79, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x84, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d,
        +	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x42, 0x0c,
        +	0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x30,
        +	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72,
        +	0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
        +	0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x76, 0x31, 0x3b, 0x69, 0x61, 0x6d,
        +	0xf8, 0x01, 0x01, 0xaa, 0x02, 0x13, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f,
        +	0x75, 0x64, 0x2e, 0x49, 0x61, 0x6d, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x13, 0x47, 0x6f, 0x6f, 0x67,
        +	0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x49, 0x61, 0x6d, 0x5c, 0x56, 0x31, 0x62,
        +	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
        +}
        +
        +var (
        +	file_google_iam_v1_options_proto_rawDescOnce sync.Once
        +	file_google_iam_v1_options_proto_rawDescData = file_google_iam_v1_options_proto_rawDesc
        +)
        +
        +func file_google_iam_v1_options_proto_rawDescGZIP() []byte {
        +	file_google_iam_v1_options_proto_rawDescOnce.Do(func() {
        +		file_google_iam_v1_options_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_iam_v1_options_proto_rawDescData)
        +	})
        +	return file_google_iam_v1_options_proto_rawDescData
        +}
        +
        +var file_google_iam_v1_options_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
        +var file_google_iam_v1_options_proto_goTypes = []interface{}{
        +	(*GetPolicyOptions)(nil), // 0: google.iam.v1.GetPolicyOptions
        +}
        +var file_google_iam_v1_options_proto_depIdxs = []int32{
        +	0, // [0:0] is the sub-list for method output_type
        +	0, // [0:0] is the sub-list for method input_type
        +	0, // [0:0] is the sub-list for extension type_name
        +	0, // [0:0] is the sub-list for extension extendee
        +	0, // [0:0] is the sub-list for field type_name
        +}
        +
        +func init() { file_google_iam_v1_options_proto_init() }
        +func file_google_iam_v1_options_proto_init() {
        +	if File_google_iam_v1_options_proto != nil {
        +		return
        +	}
        +	if !protoimpl.UnsafeEnabled {
        +		file_google_iam_v1_options_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
        +			switch v := v.(*GetPolicyOptions); i {
        +			case 0:
        +				return &v.state
        +			case 1:
        +				return &v.sizeCache
        +			case 2:
        +				return &v.unknownFields
        +			default:
        +				return nil
        +			}
        +		}
        +	}
        +	type x struct{}
        +	out := protoimpl.TypeBuilder{
        +		File: protoimpl.DescBuilder{
        +			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
        +			RawDescriptor: file_google_iam_v1_options_proto_rawDesc,
        +			NumEnums:      0,
        +			NumMessages:   1,
        +			NumExtensions: 0,
        +			NumServices:   0,
        +		},
        +		GoTypes:           file_google_iam_v1_options_proto_goTypes,
        +		DependencyIndexes: file_google_iam_v1_options_proto_depIdxs,
        +		MessageInfos:      file_google_iam_v1_options_proto_msgTypes,
        +	}.Build()
        +	File_google_iam_v1_options_proto = out.File
        +	file_google_iam_v1_options_proto_rawDesc = nil
        +	file_google_iam_v1_options_proto_goTypes = nil
        +	file_google_iam_v1_options_proto_depIdxs = nil
        +}
        diff --git a/vendor/google.golang.org/genproto/googleapis/iam/v1/policy.pb.go b/vendor/google.golang.org/genproto/googleapis/iam/v1/policy.pb.go
        index 5d966b067..81cbb5d60 100644
        --- a/vendor/google.golang.org/genproto/googleapis/iam/v1/policy.pb.go
        +++ b/vendor/google.golang.org/genproto/googleapis/iam/v1/policy.pb.go
        @@ -1,25 +1,47 @@
        +// Copyright 2019 Google LLC.
        +//
        +// Licensed under the Apache License, Version 2.0 (the "License");
        +// you may not use this file except in compliance with the License.
        +// You may obtain a copy of the License at
        +//
        +//     http://www.apache.org/licenses/LICENSE-2.0
        +//
        +// Unless required by applicable law or agreed to in writing, software
        +// distributed under the License is distributed on an "AS IS" BASIS,
        +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        +// See the License for the specific language governing permissions and
        +// limitations under the License.
        +//
        +
         // Code generated by protoc-gen-go. DO NOT EDIT.
        +// versions:
        +// 	protoc-gen-go v1.22.0
        +// 	protoc        v3.11.2
         // source: google/iam/v1/policy.proto
         
         package iam
         
         import (
        -	fmt "fmt"
        +	reflect "reflect"
        +	sync "sync"
        +
         	proto "github.com/golang/protobuf/proto"
         	_ "google.golang.org/genproto/googleapis/api/annotations"
        -	math "math"
        +	expr "google.golang.org/genproto/googleapis/type/expr"
        +	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
        +	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
         )
         
        -// Reference imports to suppress errors if they are not otherwise used.
        -var _ = proto.Marshal
        -var _ = fmt.Errorf
        -var _ = math.Inf
        +const (
        +	// Verify that this generated code is sufficiently up-to-date.
        +	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
        +	// Verify that runtime/protoimpl is sufficiently up-to-date.
        +	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
        +)
         
        -// This is a compile-time assertion to ensure that this generated file
        -// is compatible with the proto package it is being compiled against.
        -// A compilation error at this line likely means your copy of the
        -// proto package needs to be updated.
        -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
        +// This is a compile-time assertion that a sufficiently up-to-date version
        +// of the legacy proto package is being used.
        +const _ = proto.ProtoPackageIsVersion4
         
         // The type of action performed on a Binding in a policy.
         type BindingDelta_Action int32
        @@ -33,62 +55,179 @@ const (
         	BindingDelta_REMOVE BindingDelta_Action = 2
         )
         
        -var BindingDelta_Action_name = map[int32]string{
        -	0: "ACTION_UNSPECIFIED",
        -	1: "ADD",
        -	2: "REMOVE",
        -}
        +// Enum value maps for BindingDelta_Action.
        +var (
        +	BindingDelta_Action_name = map[int32]string{
        +		0: "ACTION_UNSPECIFIED",
        +		1: "ADD",
        +		2: "REMOVE",
        +	}
        +	BindingDelta_Action_value = map[string]int32{
        +		"ACTION_UNSPECIFIED": 0,
        +		"ADD":                1,
        +		"REMOVE":             2,
        +	}
        +)
         
        -var BindingDelta_Action_value = map[string]int32{
        -	"ACTION_UNSPECIFIED": 0,
        -	"ADD":                1,
        -	"REMOVE":             2,
        +func (x BindingDelta_Action) Enum() *BindingDelta_Action {
        +	p := new(BindingDelta_Action)
        +	*p = x
        +	return p
         }
         
         func (x BindingDelta_Action) String() string {
        -	return proto.EnumName(BindingDelta_Action_name, int32(x))
        +	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
        +}
        +
        +func (BindingDelta_Action) Descriptor() protoreflect.EnumDescriptor {
        +	return file_google_iam_v1_policy_proto_enumTypes[0].Descriptor()
        +}
        +
        +func (BindingDelta_Action) Type() protoreflect.EnumType {
        +	return &file_google_iam_v1_policy_proto_enumTypes[0]
         }
         
        +func (x BindingDelta_Action) Number() protoreflect.EnumNumber {
        +	return protoreflect.EnumNumber(x)
        +}
        +
        +// Deprecated: Use BindingDelta_Action.Descriptor instead.
         func (BindingDelta_Action) EnumDescriptor() ([]byte, []int) {
        -	return fileDescriptor_a3cd40b8a66b2a99, []int{3, 0}
        +	return file_google_iam_v1_policy_proto_rawDescGZIP(), []int{3, 0}
        +}
        +
        +// The type of action performed on an audit configuration in a policy.
        +type AuditConfigDelta_Action int32
        +
        +const (
        +	// Unspecified.
        +	AuditConfigDelta_ACTION_UNSPECIFIED AuditConfigDelta_Action = 0
        +	// Addition of an audit configuration.
        +	AuditConfigDelta_ADD AuditConfigDelta_Action = 1
        +	// Removal of an audit configuration.
        +	AuditConfigDelta_REMOVE AuditConfigDelta_Action = 2
        +)
        +
        +// Enum value maps for AuditConfigDelta_Action.
        +var (
        +	AuditConfigDelta_Action_name = map[int32]string{
        +		0: "ACTION_UNSPECIFIED",
        +		1: "ADD",
        +		2: "REMOVE",
        +	}
        +	AuditConfigDelta_Action_value = map[string]int32{
        +		"ACTION_UNSPECIFIED": 0,
        +		"ADD":                1,
        +		"REMOVE":             2,
        +	}
        +)
        +
        +func (x AuditConfigDelta_Action) Enum() *AuditConfigDelta_Action {
        +	p := new(AuditConfigDelta_Action)
        +	*p = x
        +	return p
        +}
        +
        +func (x AuditConfigDelta_Action) String() string {
        +	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
        +}
        +
        +func (AuditConfigDelta_Action) Descriptor() protoreflect.EnumDescriptor {
        +	return file_google_iam_v1_policy_proto_enumTypes[1].Descriptor()
        +}
        +
        +func (AuditConfigDelta_Action) Type() protoreflect.EnumType {
        +	return &file_google_iam_v1_policy_proto_enumTypes[1]
        +}
        +
        +func (x AuditConfigDelta_Action) Number() protoreflect.EnumNumber {
        +	return protoreflect.EnumNumber(x)
        +}
        +
        +// Deprecated: Use AuditConfigDelta_Action.Descriptor instead.
        +func (AuditConfigDelta_Action) EnumDescriptor() ([]byte, []int) {
        +	return file_google_iam_v1_policy_proto_rawDescGZIP(), []int{4, 0}
         }
         
         // Defines an Identity and Access Management (IAM) policy. It is used to
         // specify access control policies for Cloud Platform resources.
         //
         //
        -// A `Policy` consists of a list of `bindings`. A `Binding` binds a list of
        -// `members` to a `role`, where the members can be user accounts, Google groups,
        -// Google domains, and service accounts. A `role` is a named list of permissions
        -// defined by IAM.
        +// A `Policy` is a collection of `bindings`. A `binding` binds one or more
        +// `members` to a single `role`. Members can be user accounts, service accounts,
        +// Google groups, and domains (such as G Suite). A `role` is a named list of
        +// permissions (defined by IAM or configured by users). A `binding` can
        +// optionally specify a `condition`, which is a logic expression that further
        +// constrains the role binding based on attributes about the request and/or
        +// target resource.
         //
        -// **Example**
        +// **JSON Example**
         //
         //     {
         //       "bindings": [
         //         {
        -//           "role": "roles/owner",
        +//           "role": "roles/resourcemanager.organizationAdmin",
         //           "members": [
         //             "user:mike@example.com",
         //             "group:admins@example.com",
         //             "domain:google.com",
        -//             "serviceAccount:my-other-app@appspot.gserviceaccount.com",
        +//             "serviceAccount:my-project-id@appspot.gserviceaccount.com"
         //           ]
         //         },
         //         {
        -//           "role": "roles/viewer",
        -//           "members": ["user:sean@example.com"]
        +//           "role": "roles/resourcemanager.organizationViewer",
        +//           "members": ["user:eve@example.com"],
        +//           "condition": {
        +//             "title": "expirable access",
        +//             "description": "Does not grant access after Sep 2020",
        +//             "expression": "request.time <
        +//             timestamp('2020-10-01T00:00:00.000Z')",
        +//           }
         //         }
         //       ]
         //     }
         //
        +// **YAML Example**
        +//
        +//     bindings:
        +//     - members:
        +//       - user:mike@example.com
        +//       - group:admins@example.com
        +//       - domain:google.com
        +//       - serviceAccount:my-project-id@appspot.gserviceaccount.com
        +//       role: roles/resourcemanager.organizationAdmin
        +//     - members:
        +//       - user:eve@example.com
        +//       role: roles/resourcemanager.organizationViewer
        +//       condition:
        +//         title: expirable access
        +//         description: Does not grant access after Sep 2020
        +//         expression: request.time < timestamp('2020-10-01T00:00:00.000Z')
        +//
         // For a description of IAM and its features, see the
        -// [IAM developer's guide](https://cloud.google.com/iam).
        +// [IAM developer's guide](https://cloud.google.com/iam/docs).
         type Policy struct {
        -	// Version of the `Policy`. The default version is 0.
        +	state         protoimpl.MessageState
        +	sizeCache     protoimpl.SizeCache
        +	unknownFields protoimpl.UnknownFields
        +
        +	// Specifies the format of the policy.
        +	//
        +	// Valid values are 0, 1, and 3. Requests specifying an invalid value will be
        +	// rejected.
        +	//
        +	// Operations affecting conditional bindings must specify version 3. This can
        +	// be either setting a conditional policy, modifying a conditional binding,
        +	// or removing a binding (conditional or unconditional) from the stored
        +	// conditional policy.
        +	// Operations on non-conditional policies may specify any valid value or
        +	// leave the field unset.
        +	//
        +	// If no etag is provided in the call to `setIamPolicy`, version compliance
        +	// checks against the stored policy is skipped.
         	Version int32 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"`
        -	// Associates a list of `members` to a `role`.
        -	// Multiple `bindings` must not be specified for the same `role`.
        +	// Associates a list of `members` to a `role`. Optionally may specify a
        +	// `condition` that determines when binding is in effect.
         	// `bindings` with no members will result in an error.
         	Bindings []*Binding `protobuf:"bytes,4,rep,name=bindings,proto3" json:"bindings,omitempty"`
         	// `etag` is used for optimistic concurrency control as a way to help
        @@ -100,64 +239,73 @@ type Policy struct {
         	// ensure that their change will be applied to the same version of the policy.
         	//
         	// If no `etag` is provided in the call to `setIamPolicy`, then the existing
        -	// policy is overwritten blindly.
        -	Etag                 []byte   `protobuf:"bytes,3,opt,name=etag,proto3" json:"etag,omitempty"`
        -	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        -	XXX_unrecognized     []byte   `json:"-"`
        -	XXX_sizecache        int32    `json:"-"`
        +	// policy is overwritten. Due to blind-set semantics of an etag-less policy,
        +	// 'setIamPolicy' will not fail even if the incoming policy version does not
        +	// meet the requirements for modifying the stored policy.
        +	Etag []byte `protobuf:"bytes,3,opt,name=etag,proto3" json:"etag,omitempty"`
        +}
        +
        +func (x *Policy) Reset() {
        +	*x = Policy{}
        +	if protoimpl.UnsafeEnabled {
        +		mi := &file_google_iam_v1_policy_proto_msgTypes[0]
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		ms.StoreMessageInfo(mi)
        +	}
         }
         
        -func (m *Policy) Reset()         { *m = Policy{} }
        -func (m *Policy) String() string { return proto.CompactTextString(m) }
        -func (*Policy) ProtoMessage()    {}
        -func (*Policy) Descriptor() ([]byte, []int) {
        -	return fileDescriptor_a3cd40b8a66b2a99, []int{0}
        +func (x *Policy) String() string {
        +	return protoimpl.X.MessageStringOf(x)
         }
         
        -func (m *Policy) XXX_Unmarshal(b []byte) error {
        -	return xxx_messageInfo_Policy.Unmarshal(m, b)
        -}
        -func (m *Policy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        -	return xxx_messageInfo_Policy.Marshal(b, m, deterministic)
        -}
        -func (m *Policy) XXX_Merge(src proto.Message) {
        -	xxx_messageInfo_Policy.Merge(m, src)
        -}
        -func (m *Policy) XXX_Size() int {
        -	return xxx_messageInfo_Policy.Size(m)
        -}
        -func (m *Policy) XXX_DiscardUnknown() {
        -	xxx_messageInfo_Policy.DiscardUnknown(m)
        +func (*Policy) ProtoMessage() {}
        +
        +func (x *Policy) ProtoReflect() protoreflect.Message {
        +	mi := &file_google_iam_v1_policy_proto_msgTypes[0]
        +	if protoimpl.UnsafeEnabled && x != nil {
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		if ms.LoadMessageInfo() == nil {
        +			ms.StoreMessageInfo(mi)
        +		}
        +		return ms
        +	}
        +	return mi.MessageOf(x)
         }
         
        -var xxx_messageInfo_Policy proto.InternalMessageInfo
        +// Deprecated: Use Policy.ProtoReflect.Descriptor instead.
        +func (*Policy) Descriptor() ([]byte, []int) {
        +	return file_google_iam_v1_policy_proto_rawDescGZIP(), []int{0}
        +}
         
        -func (m *Policy) GetVersion() int32 {
        -	if m != nil {
        -		return m.Version
        +func (x *Policy) GetVersion() int32 {
        +	if x != nil {
        +		return x.Version
         	}
         	return 0
         }
         
        -func (m *Policy) GetBindings() []*Binding {
        -	if m != nil {
        -		return m.Bindings
        +func (x *Policy) GetBindings() []*Binding {
        +	if x != nil {
        +		return x.Bindings
         	}
         	return nil
         }
         
        -func (m *Policy) GetEtag() []byte {
        -	if m != nil {
        -		return m.Etag
        +func (x *Policy) GetEtag() []byte {
        +	if x != nil {
        +		return x.Etag
         	}
         	return nil
         }
         
         // Associates `members` with a `role`.
         type Binding struct {
        +	state         protoimpl.MessageState
        +	sizeCache     protoimpl.SizeCache
        +	unknownFields protoimpl.UnknownFields
        +
         	// Role that is assigned to `members`.
         	// For example, `roles/viewer`, `roles/editor`, or `roles/owner`.
        -	// Required
         	Role string `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"`
         	// Specifies the identities requesting access for a Cloud Platform resource.
         	// `members` can have the following values:
        @@ -169,7 +317,7 @@ type Binding struct {
         	//    who is authenticated with a Google account or a service account.
         	//
         	// * `user:{emailid}`: An email address that represents a specific Google
        -	//    account. For example, `alice@gmail.com` or `joe@example.com`.
        +	//    account. For example, `alice@example.com` .
         	//
         	//
         	// * `serviceAccount:{emailid}`: An email address that represents a service
        @@ -178,92 +326,126 @@ type Binding struct {
         	// * `group:{emailid}`: An email address that represents a Google group.
         	//    For example, `admins@example.com`.
         	//
        -	// * `domain:{domain}`: A Google Apps domain name that represents all the
        +	//
        +	// * `domain:{domain}`: The G Suite domain (primary) that represents all the
         	//    users of that domain. For example, `google.com` or `example.com`.
         	//
         	//
        -	Members              []string `protobuf:"bytes,2,rep,name=members,proto3" json:"members,omitempty"`
        -	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        -	XXX_unrecognized     []byte   `json:"-"`
        -	XXX_sizecache        int32    `json:"-"`
        +	Members []string `protobuf:"bytes,2,rep,name=members,proto3" json:"members,omitempty"`
        +	// The condition that is associated with this binding.
        +	// NOTE: An unsatisfied condition will not allow user access via current
        +	// binding. Different bindings, including their conditions, are examined
        +	// independently.
        +	Condition *expr.Expr `protobuf:"bytes,3,opt,name=condition,proto3" json:"condition,omitempty"`
        +}
        +
        +func (x *Binding) Reset() {
        +	*x = Binding{}
        +	if protoimpl.UnsafeEnabled {
        +		mi := &file_google_iam_v1_policy_proto_msgTypes[1]
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		ms.StoreMessageInfo(mi)
        +	}
         }
         
        -func (m *Binding) Reset()         { *m = Binding{} }
        -func (m *Binding) String() string { return proto.CompactTextString(m) }
        -func (*Binding) ProtoMessage()    {}
        -func (*Binding) Descriptor() ([]byte, []int) {
        -	return fileDescriptor_a3cd40b8a66b2a99, []int{1}
        +func (x *Binding) String() string {
        +	return protoimpl.X.MessageStringOf(x)
         }
         
        -func (m *Binding) XXX_Unmarshal(b []byte) error {
        -	return xxx_messageInfo_Binding.Unmarshal(m, b)
        -}
        -func (m *Binding) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        -	return xxx_messageInfo_Binding.Marshal(b, m, deterministic)
        -}
        -func (m *Binding) XXX_Merge(src proto.Message) {
        -	xxx_messageInfo_Binding.Merge(m, src)
        -}
        -func (m *Binding) XXX_Size() int {
        -	return xxx_messageInfo_Binding.Size(m)
        -}
        -func (m *Binding) XXX_DiscardUnknown() {
        -	xxx_messageInfo_Binding.DiscardUnknown(m)
        +func (*Binding) ProtoMessage() {}
        +
        +func (x *Binding) ProtoReflect() protoreflect.Message {
        +	mi := &file_google_iam_v1_policy_proto_msgTypes[1]
        +	if protoimpl.UnsafeEnabled && x != nil {
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		if ms.LoadMessageInfo() == nil {
        +			ms.StoreMessageInfo(mi)
        +		}
        +		return ms
        +	}
        +	return mi.MessageOf(x)
         }
         
        -var xxx_messageInfo_Binding proto.InternalMessageInfo
        +// Deprecated: Use Binding.ProtoReflect.Descriptor instead.
        +func (*Binding) Descriptor() ([]byte, []int) {
        +	return file_google_iam_v1_policy_proto_rawDescGZIP(), []int{1}
        +}
         
        -func (m *Binding) GetRole() string {
        -	if m != nil {
        -		return m.Role
        +func (x *Binding) GetRole() string {
        +	if x != nil {
        +		return x.Role
         	}
         	return ""
         }
         
        -func (m *Binding) GetMembers() []string {
        -	if m != nil {
        -		return m.Members
        +func (x *Binding) GetMembers() []string {
        +	if x != nil {
        +		return x.Members
        +	}
        +	return nil
        +}
        +
        +func (x *Binding) GetCondition() *expr.Expr {
        +	if x != nil {
        +		return x.Condition
         	}
         	return nil
         }
         
         // The difference delta between two policies.
         type PolicyDelta struct {
        +	state         protoimpl.MessageState
        +	sizeCache     protoimpl.SizeCache
        +	unknownFields protoimpl.UnknownFields
        +
         	// The delta for Bindings between two policies.
        -	BindingDeltas        []*BindingDelta `protobuf:"bytes,1,rep,name=binding_deltas,json=bindingDeltas,proto3" json:"binding_deltas,omitempty"`
        -	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
        -	XXX_unrecognized     []byte          `json:"-"`
        -	XXX_sizecache        int32           `json:"-"`
        +	BindingDeltas []*BindingDelta `protobuf:"bytes,1,rep,name=binding_deltas,json=bindingDeltas,proto3" json:"binding_deltas,omitempty"`
        +	// The delta for AuditConfigs between two policies.
        +	AuditConfigDeltas []*AuditConfigDelta `protobuf:"bytes,2,rep,name=audit_config_deltas,json=auditConfigDeltas,proto3" json:"audit_config_deltas,omitempty"`
         }
         
        -func (m *PolicyDelta) Reset()         { *m = PolicyDelta{} }
        -func (m *PolicyDelta) String() string { return proto.CompactTextString(m) }
        -func (*PolicyDelta) ProtoMessage()    {}
        -func (*PolicyDelta) Descriptor() ([]byte, []int) {
        -	return fileDescriptor_a3cd40b8a66b2a99, []int{2}
        +func (x *PolicyDelta) Reset() {
        +	*x = PolicyDelta{}
        +	if protoimpl.UnsafeEnabled {
        +		mi := &file_google_iam_v1_policy_proto_msgTypes[2]
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		ms.StoreMessageInfo(mi)
        +	}
         }
         
        -func (m *PolicyDelta) XXX_Unmarshal(b []byte) error {
        -	return xxx_messageInfo_PolicyDelta.Unmarshal(m, b)
        +func (x *PolicyDelta) String() string {
        +	return protoimpl.X.MessageStringOf(x)
         }
        -func (m *PolicyDelta) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        -	return xxx_messageInfo_PolicyDelta.Marshal(b, m, deterministic)
        -}
        -func (m *PolicyDelta) XXX_Merge(src proto.Message) {
        -	xxx_messageInfo_PolicyDelta.Merge(m, src)
        -}
        -func (m *PolicyDelta) XXX_Size() int {
        -	return xxx_messageInfo_PolicyDelta.Size(m)
        +
        +func (*PolicyDelta) ProtoMessage() {}
        +
        +func (x *PolicyDelta) ProtoReflect() protoreflect.Message {
        +	mi := &file_google_iam_v1_policy_proto_msgTypes[2]
        +	if protoimpl.UnsafeEnabled && x != nil {
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		if ms.LoadMessageInfo() == nil {
        +			ms.StoreMessageInfo(mi)
        +		}
        +		return ms
        +	}
        +	return mi.MessageOf(x)
         }
        -func (m *PolicyDelta) XXX_DiscardUnknown() {
        -	xxx_messageInfo_PolicyDelta.DiscardUnknown(m)
        +
        +// Deprecated: Use PolicyDelta.ProtoReflect.Descriptor instead.
        +func (*PolicyDelta) Descriptor() ([]byte, []int) {
        +	return file_google_iam_v1_policy_proto_rawDescGZIP(), []int{2}
         }
         
        -var xxx_messageInfo_PolicyDelta proto.InternalMessageInfo
        +func (x *PolicyDelta) GetBindingDeltas() []*BindingDelta {
        +	if x != nil {
        +		return x.BindingDeltas
        +	}
        +	return nil
        +}
         
        -func (m *PolicyDelta) GetBindingDeltas() []*BindingDelta {
        -	if m != nil {
        -		return m.BindingDeltas
        +func (x *PolicyDelta) GetAuditConfigDeltas() []*AuditConfigDelta {
        +	if x != nil {
        +		return x.AuditConfigDeltas
         	}
         	return nil
         }
        @@ -271,6 +453,10 @@ func (m *PolicyDelta) GetBindingDeltas() []*BindingDelta {
         // One delta entry for Binding. Each individual change (only one member in each
         // entry) to a binding will be a separate entry.
         type BindingDelta struct {
        +	state         protoimpl.MessageState
        +	sizeCache     protoimpl.SizeCache
        +	unknownFields protoimpl.UnknownFields
        +
         	// The action that was performed on a Binding.
         	// Required
         	Action BindingDelta_Action `protobuf:"varint,1,opt,name=action,proto3,enum=google.iam.v1.BindingDelta_Action" json:"action,omitempty"`
        @@ -281,94 +467,352 @@ type BindingDelta struct {
         	// A single identity requesting access for a Cloud Platform resource.
         	// Follows the same format of Binding.members.
         	// Required
        -	Member               string   `protobuf:"bytes,3,opt,name=member,proto3" json:"member,omitempty"`
        -	XXX_NoUnkeyedLiteral struct{} `json:"-"`
        -	XXX_unrecognized     []byte   `json:"-"`
        -	XXX_sizecache        int32    `json:"-"`
        +	Member string `protobuf:"bytes,3,opt,name=member,proto3" json:"member,omitempty"`
        +	// The condition that is associated with this binding.
        +	Condition *expr.Expr `protobuf:"bytes,4,opt,name=condition,proto3" json:"condition,omitempty"`
        +}
        +
        +func (x *BindingDelta) Reset() {
        +	*x = BindingDelta{}
        +	if protoimpl.UnsafeEnabled {
        +		mi := &file_google_iam_v1_policy_proto_msgTypes[3]
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		ms.StoreMessageInfo(mi)
        +	}
        +}
        +
        +func (x *BindingDelta) String() string {
        +	return protoimpl.X.MessageStringOf(x)
         }
         
        -func (m *BindingDelta) Reset()         { *m = BindingDelta{} }
        -func (m *BindingDelta) String() string { return proto.CompactTextString(m) }
        -func (*BindingDelta) ProtoMessage()    {}
        +func (*BindingDelta) ProtoMessage() {}
        +
        +func (x *BindingDelta) ProtoReflect() protoreflect.Message {
        +	mi := &file_google_iam_v1_policy_proto_msgTypes[3]
        +	if protoimpl.UnsafeEnabled && x != nil {
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		if ms.LoadMessageInfo() == nil {
        +			ms.StoreMessageInfo(mi)
        +		}
        +		return ms
        +	}
        +	return mi.MessageOf(x)
        +}
        +
        +// Deprecated: Use BindingDelta.ProtoReflect.Descriptor instead.
         func (*BindingDelta) Descriptor() ([]byte, []int) {
        -	return fileDescriptor_a3cd40b8a66b2a99, []int{3}
        +	return file_google_iam_v1_policy_proto_rawDescGZIP(), []int{3}
         }
         
        -func (m *BindingDelta) XXX_Unmarshal(b []byte) error {
        -	return xxx_messageInfo_BindingDelta.Unmarshal(m, b)
        +func (x *BindingDelta) GetAction() BindingDelta_Action {
        +	if x != nil {
        +		return x.Action
        +	}
        +	return BindingDelta_ACTION_UNSPECIFIED
         }
        -func (m *BindingDelta) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        -	return xxx_messageInfo_BindingDelta.Marshal(b, m, deterministic)
        +
        +func (x *BindingDelta) GetRole() string {
        +	if x != nil {
        +		return x.Role
        +	}
        +	return ""
        +}
        +
        +func (x *BindingDelta) GetMember() string {
        +	if x != nil {
        +		return x.Member
        +	}
        +	return ""
        +}
        +
        +func (x *BindingDelta) GetCondition() *expr.Expr {
        +	if x != nil {
        +		return x.Condition
        +	}
        +	return nil
        +}
        +
        +// One delta entry for AuditConfig. Each individual change (only one
        +// exempted_member in each entry) to a AuditConfig will be a separate entry.
        +type AuditConfigDelta struct {
        +	state         protoimpl.MessageState
        +	sizeCache     protoimpl.SizeCache
        +	unknownFields protoimpl.UnknownFields
        +
        +	// The action that was performed on an audit configuration in a policy.
        +	// Required
        +	Action AuditConfigDelta_Action `protobuf:"varint,1,opt,name=action,proto3,enum=google.iam.v1.AuditConfigDelta_Action" json:"action,omitempty"`
        +	// Specifies a service that was configured for Cloud Audit Logging.
        +	// For example, `storage.googleapis.com`, `cloudsql.googleapis.com`.
        +	// `allServices` is a special value that covers all services.
        +	// Required
        +	Service string `protobuf:"bytes,2,opt,name=service,proto3" json:"service,omitempty"`
        +	// A single identity that is exempted from "data access" audit
        +	// logging for the `service` specified above.
        +	// Follows the same format of Binding.members.
        +	ExemptedMember string `protobuf:"bytes,3,opt,name=exempted_member,json=exemptedMember,proto3" json:"exempted_member,omitempty"`
        +	// Specifies the log_type that was be enabled. ADMIN_ACTIVITY is always
        +	// enabled, and cannot be configured.
        +	// Required
        +	LogType string `protobuf:"bytes,4,opt,name=log_type,json=logType,proto3" json:"log_type,omitempty"`
         }
        -func (m *BindingDelta) XXX_Merge(src proto.Message) {
        -	xxx_messageInfo_BindingDelta.Merge(m, src)
        +
        +func (x *AuditConfigDelta) Reset() {
        +	*x = AuditConfigDelta{}
        +	if protoimpl.UnsafeEnabled {
        +		mi := &file_google_iam_v1_policy_proto_msgTypes[4]
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		ms.StoreMessageInfo(mi)
        +	}
         }
        -func (m *BindingDelta) XXX_Size() int {
        -	return xxx_messageInfo_BindingDelta.Size(m)
        +
        +func (x *AuditConfigDelta) String() string {
        +	return protoimpl.X.MessageStringOf(x)
         }
        -func (m *BindingDelta) XXX_DiscardUnknown() {
        -	xxx_messageInfo_BindingDelta.DiscardUnknown(m)
        +
        +func (*AuditConfigDelta) ProtoMessage() {}
        +
        +func (x *AuditConfigDelta) ProtoReflect() protoreflect.Message {
        +	mi := &file_google_iam_v1_policy_proto_msgTypes[4]
        +	if protoimpl.UnsafeEnabled && x != nil {
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		if ms.LoadMessageInfo() == nil {
        +			ms.StoreMessageInfo(mi)
        +		}
        +		return ms
        +	}
        +	return mi.MessageOf(x)
         }
         
        -var xxx_messageInfo_BindingDelta proto.InternalMessageInfo
        +// Deprecated: Use AuditConfigDelta.ProtoReflect.Descriptor instead.
        +func (*AuditConfigDelta) Descriptor() ([]byte, []int) {
        +	return file_google_iam_v1_policy_proto_rawDescGZIP(), []int{4}
        +}
         
        -func (m *BindingDelta) GetAction() BindingDelta_Action {
        -	if m != nil {
        -		return m.Action
        +func (x *AuditConfigDelta) GetAction() AuditConfigDelta_Action {
        +	if x != nil {
        +		return x.Action
         	}
        -	return BindingDelta_ACTION_UNSPECIFIED
        +	return AuditConfigDelta_ACTION_UNSPECIFIED
         }
         
        -func (m *BindingDelta) GetRole() string {
        -	if m != nil {
        -		return m.Role
        +func (x *AuditConfigDelta) GetService() string {
        +	if x != nil {
        +		return x.Service
         	}
         	return ""
         }
         
        -func (m *BindingDelta) GetMember() string {
        -	if m != nil {
        -		return m.Member
        +func (x *AuditConfigDelta) GetExemptedMember() string {
        +	if x != nil {
        +		return x.ExemptedMember
         	}
         	return ""
         }
         
        -func init() {
        -	proto.RegisterEnum("google.iam.v1.BindingDelta_Action", BindingDelta_Action_name, BindingDelta_Action_value)
        -	proto.RegisterType((*Policy)(nil), "google.iam.v1.Policy")
        -	proto.RegisterType((*Binding)(nil), "google.iam.v1.Binding")
        -	proto.RegisterType((*PolicyDelta)(nil), "google.iam.v1.PolicyDelta")
        -	proto.RegisterType((*BindingDelta)(nil), "google.iam.v1.BindingDelta")
        -}
        -
        -func init() { proto.RegisterFile("google/iam/v1/policy.proto", fileDescriptor_a3cd40b8a66b2a99) }
        -
        -var fileDescriptor_a3cd40b8a66b2a99 = []byte{
        -	// 403 bytes of a gzipped FileDescriptorProto
        -	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x52, 0x4d, 0xab, 0x13, 0x31,
        -	0x14, 0x35, 0xed, 0x73, 0x6a, 0xef, 0xfb, 0xa0, 0x46, 0x28, 0xc3, 0xd3, 0x45, 0x99, 0x55, 0x57,
        -	0x19, 0x5b, 0x11, 0x41, 0x57, 0xfd, 0x18, 0x65, 0x16, 0xbe, 0x37, 0x46, 0xed, 0x42, 0x0a, 0x8f,
        -	0x4c, 0x1b, 0x42, 0x64, 0x92, 0x0c, 0x33, 0x63, 0xc1, 0xb5, 0xff, 0x46, 0xf0, 0x8f, 0xf8, 0x8b,
        -	0x5c, 0xca, 0x24, 0x99, 0x47, 0x0b, 0xe2, 0x2e, 0xe7, 0x9e, 0x73, 0x72, 0xcf, 0xcd, 0x0d, 0x5c,
        -	0x0b, 0x63, 0x44, 0xc1, 0x63, 0xc9, 0x54, 0x7c, 0x98, 0xc5, 0xa5, 0x29, 0xe4, 0xee, 0x3b, 0x29,
        -	0x2b, 0xd3, 0x18, 0x7c, 0xe9, 0x38, 0x22, 0x99, 0x22, 0x87, 0xd9, 0xf5, 0x33, 0x2f, 0x65, 0xa5,
        -	0x8c, 0x99, 0xd6, 0xa6, 0x61, 0x8d, 0x34, 0xba, 0x76, 0xe2, 0xe8, 0x2b, 0x04, 0x99, 0x35, 0xe3,
        -	0x10, 0x06, 0x07, 0x5e, 0xd5, 0xd2, 0xe8, 0x10, 0x4d, 0xd0, 0xf4, 0x21, 0xed, 0x20, 0x9e, 0xc3,
        -	0xa3, 0x5c, 0xea, 0xbd, 0xd4, 0xa2, 0x0e, 0xcf, 0x26, 0xfd, 0xe9, 0xf9, 0x7c, 0x4c, 0x4e, 0x7a,
        -	0x90, 0xa5, 0xa3, 0xe9, 0xbd, 0x0e, 0x63, 0x38, 0xe3, 0x0d, 0x13, 0x61, 0x7f, 0x82, 0xa6, 0x17,
        -	0xd4, 0x9e, 0xa3, 0x57, 0x30, 0xf0, 0xc2, 0x96, 0xae, 0x4c, 0xc1, 0x6d, 0xa7, 0x21, 0xb5, 0xe7,
        -	0x36, 0x80, 0xe2, 0x2a, 0xe7, 0x55, 0x1d, 0xf6, 0x26, 0xfd, 0xe9, 0x90, 0x76, 0x30, 0xfa, 0x00,
        -	0xe7, 0x2e, 0xe4, 0x9a, 0x17, 0x0d, 0xc3, 0x4b, 0xb8, 0xf2, 0x7d, 0xee, 0xf6, 0x6d, 0xa1, 0x0e,
        -	0x91, 0x4d, 0xf5, 0xf4, 0xdf, 0xa9, 0xac, 0x89, 0x5e, 0xe6, 0x47, 0xa8, 0x8e, 0x7e, 0x21, 0xb8,
        -	0x38, 0xe6, 0xf1, 0x6b, 0x08, 0xd8, 0xae, 0xe9, 0xa6, 0xbf, 0x9a, 0x47, 0xff, 0xb9, 0x8c, 0x2c,
        -	0xac, 0x92, 0x7a, 0xc7, 0xfd, 0x34, 0xbd, 0xa3, 0x69, 0xc6, 0x10, 0xb8, 0xf8, 0xf6, 0x09, 0x86,
        -	0xd4, 0xa3, 0xe8, 0x25, 0x04, 0xce, 0x8d, 0xc7, 0x80, 0x17, 0xab, 0x4f, 0xe9, 0xed, 0xcd, 0xdd,
        -	0xe7, 0x9b, 0x8f, 0x59, 0xb2, 0x4a, 0xdf, 0xa6, 0xc9, 0x7a, 0xf4, 0x00, 0x0f, 0xa0, 0xbf, 0x58,
        -	0xaf, 0x47, 0x08, 0x03, 0x04, 0x34, 0x79, 0x7f, 0xbb, 0x49, 0x46, 0xbd, 0xe5, 0x0f, 0x04, 0x8f,
        -	0x77, 0x46, 0x9d, 0x86, 0x5a, 0xfa, 0x67, 0xc9, 0xda, 0x55, 0x66, 0xe8, 0xcb, 0x73, 0xcf, 0x0a,
        -	0x53, 0x30, 0x2d, 0x88, 0xa9, 0x44, 0x2c, 0xb8, 0xb6, 0x8b, 0x8e, 0x1d, 0xc5, 0x4a, 0x59, 0xfb,
        -	0x4f, 0xf3, 0x46, 0x32, 0xf5, 0x07, 0xa1, 0x9f, 0xbd, 0x27, 0xef, 0x9c, 0x6b, 0x55, 0x98, 0x6f,
        -	0x7b, 0x92, 0x32, 0x45, 0x36, 0xb3, 0xdf, 0x5d, 0x75, 0x6b, 0xab, 0xdb, 0x94, 0xa9, 0xed, 0x66,
        -	0x96, 0x07, 0xf6, 0xae, 0x17, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x18, 0xca, 0xaa, 0x7f,
        -	0x02, 0x00, 0x00,
        +func (x *AuditConfigDelta) GetLogType() string {
        +	if x != nil {
        +		return x.LogType
        +	}
        +	return ""
        +}
        +
        +var File_google_iam_v1_policy_proto protoreflect.FileDescriptor
        +
        +var file_google_iam_v1_policy_proto_rawDesc = []byte{
        +	0x0a, 0x1a, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x76, 0x31, 0x2f,
        +	0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x67, 0x6f,
        +	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x1a, 0x16, 0x67, 0x6f, 0x6f,
        +	0x67, 0x6c, 0x65, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x70, 0x72,
        +	0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f,
        +	0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74,
        +	0x6f, 0x22, 0x6a, 0x0a, 0x06, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x76,
        +	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65,
        +	0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x08, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67,
        +	0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
        +	0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52,
        +	0x08, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61,
        +	0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x22, 0x68, 0x0a,
        +	0x07, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65,
        +	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07,
        +	0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6d,
        +	0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74,
        +	0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
        +	0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x09, 0x63, 0x6f,
        +	0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa2, 0x01, 0x0a, 0x0b, 0x50, 0x6f, 0x6c, 0x69,
        +	0x63, 0x79, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x42, 0x0a, 0x0e, 0x62, 0x69, 0x6e, 0x64, 0x69,
        +	0x6e, 0x67, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
        +	0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e,
        +	0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x52, 0x0d, 0x62, 0x69,
        +	0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x73, 0x12, 0x4f, 0x0a, 0x13, 0x61,
        +	0x75, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x64, 0x65, 0x6c, 0x74,
        +	0x61, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
        +	0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x43, 0x6f,
        +	0x6e, 0x66, 0x69, 0x67, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x52, 0x11, 0x61, 0x75, 0x64, 0x69, 0x74,
        +	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x73, 0x22, 0xde, 0x01, 0x0a,
        +	0x0c, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x3a, 0x0a,
        +	0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e,
        +	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x69,
        +	0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f,
        +	0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c,
        +	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x16, 0x0a,
        +	0x06, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d,
        +	0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69,
        +	0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
        +	0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x09, 0x63, 0x6f, 0x6e,
        +	0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x35, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e,
        +	0x12, 0x16, 0x0a, 0x12, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45,
        +	0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x44, 0x44, 0x10,
        +	0x01, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x10, 0x02, 0x22, 0xe7, 0x01,
        +	0x0a, 0x10, 0x41, 0x75, 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x44, 0x65, 0x6c,
        +	0x74, 0x61, 0x12, 0x3e, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01,
        +	0x28, 0x0e, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e,
        +	0x76, 0x31, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x44, 0x65,
        +	0x6c, 0x74, 0x61, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69,
        +	0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20,
        +	0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x0f,
        +	0x65, 0x78, 0x65, 0x6d, 0x70, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x18,
        +	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x65, 0x78, 0x65, 0x6d, 0x70, 0x74, 0x65, 0x64, 0x4d,
        +	0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x5f, 0x74, 0x79, 0x70,
        +	0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x54, 0x79, 0x70, 0x65,
        +	0x22, 0x35, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x43,
        +	0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44,
        +	0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x44, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x52,
        +	0x45, 0x4d, 0x4f, 0x56, 0x45, 0x10, 0x02, 0x42, 0x83, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e,
        +	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x50,
        +	0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x30, 0x67, 0x6f,
        +	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f,
        +	0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61,
        +	0x70, 0x69, 0x73, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x76, 0x31, 0x3b, 0x69, 0x61, 0x6d, 0xf8, 0x01,
        +	0x01, 0xaa, 0x02, 0x13, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64,
        +	0x2e, 0x49, 0x61, 0x6d, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x13, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
        +	0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x49, 0x61, 0x6d, 0x5c, 0x56, 0x31, 0x62, 0x06, 0x70,
        +	0x72, 0x6f, 0x74, 0x6f, 0x33,
        +}
        +
        +var (
        +	file_google_iam_v1_policy_proto_rawDescOnce sync.Once
        +	file_google_iam_v1_policy_proto_rawDescData = file_google_iam_v1_policy_proto_rawDesc
        +)
        +
        +func file_google_iam_v1_policy_proto_rawDescGZIP() []byte {
        +	file_google_iam_v1_policy_proto_rawDescOnce.Do(func() {
        +		file_google_iam_v1_policy_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_iam_v1_policy_proto_rawDescData)
        +	})
        +	return file_google_iam_v1_policy_proto_rawDescData
        +}
        +
        +var file_google_iam_v1_policy_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
        +var file_google_iam_v1_policy_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
        +var file_google_iam_v1_policy_proto_goTypes = []interface{}{
        +	(BindingDelta_Action)(0),     // 0: google.iam.v1.BindingDelta.Action
        +	(AuditConfigDelta_Action)(0), // 1: google.iam.v1.AuditConfigDelta.Action
        +	(*Policy)(nil),               // 2: google.iam.v1.Policy
        +	(*Binding)(nil),              // 3: google.iam.v1.Binding
        +	(*PolicyDelta)(nil),          // 4: google.iam.v1.PolicyDelta
        +	(*BindingDelta)(nil),         // 5: google.iam.v1.BindingDelta
        +	(*AuditConfigDelta)(nil),     // 6: google.iam.v1.AuditConfigDelta
        +	(*expr.Expr)(nil),            // 7: google.type.Expr
        +}
        +var file_google_iam_v1_policy_proto_depIdxs = []int32{
        +	3, // 0: google.iam.v1.Policy.bindings:type_name -> google.iam.v1.Binding
        +	7, // 1: google.iam.v1.Binding.condition:type_name -> google.type.Expr
        +	5, // 2: google.iam.v1.PolicyDelta.binding_deltas:type_name -> google.iam.v1.BindingDelta
        +	6, // 3: google.iam.v1.PolicyDelta.audit_config_deltas:type_name -> google.iam.v1.AuditConfigDelta
        +	0, // 4: google.iam.v1.BindingDelta.action:type_name -> google.iam.v1.BindingDelta.Action
        +	7, // 5: google.iam.v1.BindingDelta.condition:type_name -> google.type.Expr
        +	1, // 6: google.iam.v1.AuditConfigDelta.action:type_name -> google.iam.v1.AuditConfigDelta.Action
        +	7, // [7:7] is the sub-list for method output_type
        +	7, // [7:7] is the sub-list for method input_type
        +	7, // [7:7] is the sub-list for extension type_name
        +	7, // [7:7] is the sub-list for extension extendee
        +	0, // [0:7] is the sub-list for field type_name
        +}
        +
        +func init() { file_google_iam_v1_policy_proto_init() }
        +func file_google_iam_v1_policy_proto_init() {
        +	if File_google_iam_v1_policy_proto != nil {
        +		return
        +	}
        +	if !protoimpl.UnsafeEnabled {
        +		file_google_iam_v1_policy_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
        +			switch v := v.(*Policy); i {
        +			case 0:
        +				return &v.state
        +			case 1:
        +				return &v.sizeCache
        +			case 2:
        +				return &v.unknownFields
        +			default:
        +				return nil
        +			}
        +		}
        +		file_google_iam_v1_policy_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
        +			switch v := v.(*Binding); i {
        +			case 0:
        +				return &v.state
        +			case 1:
        +				return &v.sizeCache
        +			case 2:
        +				return &v.unknownFields
        +			default:
        +				return nil
        +			}
        +		}
        +		file_google_iam_v1_policy_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
        +			switch v := v.(*PolicyDelta); i {
        +			case 0:
        +				return &v.state
        +			case 1:
        +				return &v.sizeCache
        +			case 2:
        +				return &v.unknownFields
        +			default:
        +				return nil
        +			}
        +		}
        +		file_google_iam_v1_policy_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
        +			switch v := v.(*BindingDelta); i {
        +			case 0:
        +				return &v.state
        +			case 1:
        +				return &v.sizeCache
        +			case 2:
        +				return &v.unknownFields
        +			default:
        +				return nil
        +			}
        +		}
        +		file_google_iam_v1_policy_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
        +			switch v := v.(*AuditConfigDelta); i {
        +			case 0:
        +				return &v.state
        +			case 1:
        +				return &v.sizeCache
        +			case 2:
        +				return &v.unknownFields
        +			default:
        +				return nil
        +			}
        +		}
        +	}
        +	type x struct{}
        +	out := protoimpl.TypeBuilder{
        +		File: protoimpl.DescBuilder{
        +			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
        +			RawDescriptor: file_google_iam_v1_policy_proto_rawDesc,
        +			NumEnums:      2,
        +			NumMessages:   5,
        +			NumExtensions: 0,
        +			NumServices:   0,
        +		},
        +		GoTypes:           file_google_iam_v1_policy_proto_goTypes,
        +		DependencyIndexes: file_google_iam_v1_policy_proto_depIdxs,
        +		EnumInfos:         file_google_iam_v1_policy_proto_enumTypes,
        +		MessageInfos:      file_google_iam_v1_policy_proto_msgTypes,
        +	}.Build()
        +	File_google_iam_v1_policy_proto = out.File
        +	file_google_iam_v1_policy_proto_rawDesc = nil
        +	file_google_iam_v1_policy_proto_goTypes = nil
        +	file_google_iam_v1_policy_proto_depIdxs = nil
         }
        diff --git a/vendor/google.golang.org/genproto/googleapis/rpc/code/code.pb.go b/vendor/google.golang.org/genproto/googleapis/rpc/code/code.pb.go
        index 40ea63ab1..2bf62796a 100644
        --- a/vendor/google.golang.org/genproto/googleapis/rpc/code/code.pb.go
        +++ b/vendor/google.golang.org/genproto/googleapis/rpc/code/code.pb.go
        @@ -1,26 +1,46 @@
        +// Copyright 2020 Google LLC
        +//
        +// Licensed under the Apache License, Version 2.0 (the "License");
        +// you may not use this file except in compliance with the License.
        +// You may obtain a copy of the License at
        +//
        +//     http://www.apache.org/licenses/LICENSE-2.0
        +//
        +// Unless required by applicable law or agreed to in writing, software
        +// distributed under the License is distributed on an "AS IS" BASIS,
        +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        +// See the License for the specific language governing permissions and
        +// limitations under the License.
        +
         // Code generated by protoc-gen-go. DO NOT EDIT.
        +// versions:
        +// 	protoc-gen-go v1.22.0
        +// 	protoc        v3.11.2
         // source: google/rpc/code.proto
         
         package code
         
         import (
        -	fmt "fmt"
        +	reflect "reflect"
        +	sync "sync"
        +
         	proto "github.com/golang/protobuf/proto"
        -	math "math"
        +	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
        +	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
         )
         
        -// Reference imports to suppress errors if they are not otherwise used.
        -var _ = proto.Marshal
        -var _ = fmt.Errorf
        -var _ = math.Inf
        +const (
        +	// Verify that this generated code is sufficiently up-to-date.
        +	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
        +	// Verify that runtime/protoimpl is sufficiently up-to-date.
        +	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
        +)
         
        -// This is a compile-time assertion to ensure that this generated file
        -// is compatible with the proto package it is being compiled against.
        -// A compilation error at this line likely means your copy of the
        -// proto package needs to be updated.
        -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
        +// This is a compile-time assertion that a sufficiently up-to-date version
        +// of the legacy proto package is being used.
        +const _ = proto.ProtoPackageIsVersion4
         
        -// The canonical error codes for Google APIs.
        +// The canonical error codes for gRPC APIs.
         //
         //
         // Sometimes multiple error codes may apply.  Services should return
        @@ -155,7 +175,8 @@ const (
         	Code_INTERNAL Code = 13
         	// The service is currently unavailable.  This is most likely a
         	// transient condition, which can be corrected by retrying with
        -	// a backoff.
        +	// a backoff. Note that it is not always safe to retry
        +	// non-idempotent operations.
         	//
         	// See the guidelines above for deciding between `FAILED_PRECONDITION`,
         	// `ABORTED`, and `UNAVAILABLE`.
        @@ -168,83 +189,153 @@ const (
         	Code_DATA_LOSS Code = 15
         )
         
        -var Code_name = map[int32]string{
        -	0:  "OK",
        -	1:  "CANCELLED",
        -	2:  "UNKNOWN",
        -	3:  "INVALID_ARGUMENT",
        -	4:  "DEADLINE_EXCEEDED",
        -	5:  "NOT_FOUND",
        -	6:  "ALREADY_EXISTS",
        -	7:  "PERMISSION_DENIED",
        -	16: "UNAUTHENTICATED",
        -	8:  "RESOURCE_EXHAUSTED",
        -	9:  "FAILED_PRECONDITION",
        -	10: "ABORTED",
        -	11: "OUT_OF_RANGE",
        -	12: "UNIMPLEMENTED",
        -	13: "INTERNAL",
        -	14: "UNAVAILABLE",
        -	15: "DATA_LOSS",
        -}
        +// Enum value maps for Code.
        +var (
        +	Code_name = map[int32]string{
        +		0:  "OK",
        +		1:  "CANCELLED",
        +		2:  "UNKNOWN",
        +		3:  "INVALID_ARGUMENT",
        +		4:  "DEADLINE_EXCEEDED",
        +		5:  "NOT_FOUND",
        +		6:  "ALREADY_EXISTS",
        +		7:  "PERMISSION_DENIED",
        +		16: "UNAUTHENTICATED",
        +		8:  "RESOURCE_EXHAUSTED",
        +		9:  "FAILED_PRECONDITION",
        +		10: "ABORTED",
        +		11: "OUT_OF_RANGE",
        +		12: "UNIMPLEMENTED",
        +		13: "INTERNAL",
        +		14: "UNAVAILABLE",
        +		15: "DATA_LOSS",
        +	}
        +	Code_value = map[string]int32{
        +		"OK":                  0,
        +		"CANCELLED":           1,
        +		"UNKNOWN":             2,
        +		"INVALID_ARGUMENT":    3,
        +		"DEADLINE_EXCEEDED":   4,
        +		"NOT_FOUND":           5,
        +		"ALREADY_EXISTS":      6,
        +		"PERMISSION_DENIED":   7,
        +		"UNAUTHENTICATED":     16,
        +		"RESOURCE_EXHAUSTED":  8,
        +		"FAILED_PRECONDITION": 9,
        +		"ABORTED":             10,
        +		"OUT_OF_RANGE":        11,
        +		"UNIMPLEMENTED":       12,
        +		"INTERNAL":            13,
        +		"UNAVAILABLE":         14,
        +		"DATA_LOSS":           15,
        +	}
        +)
         
        -var Code_value = map[string]int32{
        -	"OK":                  0,
        -	"CANCELLED":           1,
        -	"UNKNOWN":             2,
        -	"INVALID_ARGUMENT":    3,
        -	"DEADLINE_EXCEEDED":   4,
        -	"NOT_FOUND":           5,
        -	"ALREADY_EXISTS":      6,
        -	"PERMISSION_DENIED":   7,
        -	"UNAUTHENTICATED":     16,
        -	"RESOURCE_EXHAUSTED":  8,
        -	"FAILED_PRECONDITION": 9,
        -	"ABORTED":             10,
        -	"OUT_OF_RANGE":        11,
        -	"UNIMPLEMENTED":       12,
        -	"INTERNAL":            13,
        -	"UNAVAILABLE":         14,
        -	"DATA_LOSS":           15,
        +func (x Code) Enum() *Code {
        +	p := new(Code)
        +	*p = x
        +	return p
         }
         
         func (x Code) String() string {
        -	return proto.EnumName(Code_name, int32(x))
        +	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
         }
         
        +func (Code) Descriptor() protoreflect.EnumDescriptor {
        +	return file_google_rpc_code_proto_enumTypes[0].Descriptor()
        +}
        +
        +func (Code) Type() protoreflect.EnumType {
        +	return &file_google_rpc_code_proto_enumTypes[0]
        +}
        +
        +func (x Code) Number() protoreflect.EnumNumber {
        +	return protoreflect.EnumNumber(x)
        +}
        +
        +// Deprecated: Use Code.Descriptor instead.
         func (Code) EnumDescriptor() ([]byte, []int) {
        -	return fileDescriptor_fe593a732623ccf0, []int{0}
        +	return file_google_rpc_code_proto_rawDescGZIP(), []int{0}
        +}
        +
        +var File_google_rpc_code_proto protoreflect.FileDescriptor
        +
        +var file_google_rpc_code_proto_rawDesc = []byte{
        +	0x0a, 0x15, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x63, 0x6f, 0x64,
        +	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
        +	0x72, 0x70, 0x63, 0x2a, 0xb7, 0x02, 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x06, 0x0a, 0x02,
        +	0x4f, 0x4b, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x45,
        +	0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x02,
        +	0x12, 0x14, 0x0a, 0x10, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x41, 0x52, 0x47, 0x55,
        +	0x4d, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x44, 0x45, 0x41, 0x44, 0x4c, 0x49,
        +	0x4e, 0x45, 0x5f, 0x45, 0x58, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, 0x10, 0x04, 0x12, 0x0d, 0x0a,
        +	0x09, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e,
        +	0x41, 0x4c, 0x52, 0x45, 0x41, 0x44, 0x59, 0x5f, 0x45, 0x58, 0x49, 0x53, 0x54, 0x53, 0x10, 0x06,
        +	0x12, 0x15, 0x0a, 0x11, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x44,
        +	0x45, 0x4e, 0x49, 0x45, 0x44, 0x10, 0x07, 0x12, 0x13, 0x0a, 0x0f, 0x55, 0x4e, 0x41, 0x55, 0x54,
        +	0x48, 0x45, 0x4e, 0x54, 0x49, 0x43, 0x41, 0x54, 0x45, 0x44, 0x10, 0x10, 0x12, 0x16, 0x0a, 0x12,
        +	0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x45, 0x58, 0x48, 0x41, 0x55, 0x53, 0x54,
        +	0x45, 0x44, 0x10, 0x08, 0x12, 0x17, 0x0a, 0x13, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x5f, 0x50,
        +	0x52, 0x45, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, 0x12, 0x0b, 0x0a,
        +	0x07, 0x41, 0x42, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x55,
        +	0x54, 0x5f, 0x4f, 0x46, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x0b, 0x12, 0x11, 0x0a, 0x0d,
        +	0x55, 0x4e, 0x49, 0x4d, 0x50, 0x4c, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x45, 0x44, 0x10, 0x0c, 0x12,
        +	0x0c, 0x0a, 0x08, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x0d, 0x12, 0x0f, 0x0a,
        +	0x0b, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0e, 0x12, 0x0d,
        +	0x0a, 0x09, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x4c, 0x4f, 0x53, 0x53, 0x10, 0x0f, 0x42, 0x58, 0x0a,
        +	0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x42,
        +	0x09, 0x43, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x33, 0x67, 0x6f,
        +	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f,
        +	0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61,
        +	0x70, 0x69, 0x73, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3b, 0x63, 0x6f, 0x64,
        +	0x65, 0xa2, 0x02, 0x03, 0x52, 0x50, 0x43, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
         }
         
        -func init() {
        -	proto.RegisterEnum("google.rpc.Code", Code_name, Code_value)
        +var (
        +	file_google_rpc_code_proto_rawDescOnce sync.Once
        +	file_google_rpc_code_proto_rawDescData = file_google_rpc_code_proto_rawDesc
        +)
        +
        +func file_google_rpc_code_proto_rawDescGZIP() []byte {
        +	file_google_rpc_code_proto_rawDescOnce.Do(func() {
        +		file_google_rpc_code_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_rpc_code_proto_rawDescData)
        +	})
        +	return file_google_rpc_code_proto_rawDescData
        +}
        +
        +var file_google_rpc_code_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
        +var file_google_rpc_code_proto_goTypes = []interface{}{
        +	(Code)(0), // 0: google.rpc.Code
        +}
        +var file_google_rpc_code_proto_depIdxs = []int32{
        +	0, // [0:0] is the sub-list for method output_type
        +	0, // [0:0] is the sub-list for method input_type
        +	0, // [0:0] is the sub-list for extension type_name
        +	0, // [0:0] is the sub-list for extension extendee
        +	0, // [0:0] is the sub-list for field type_name
         }
         
        -func init() { proto.RegisterFile("google/rpc/code.proto", fileDescriptor_fe593a732623ccf0) }
        -
        -var fileDescriptor_fe593a732623ccf0 = []byte{
        -	// 362 bytes of a gzipped FileDescriptorProto
        -	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x44, 0x51, 0xcd, 0x6e, 0x93, 0x31,
        -	0x10, 0xa4, 0x69, 0x49, 0x9b, 0xcd, 0xdf, 0xd6, 0xa5, 0xf0, 0x0e, 0x1c, 0x92, 0x43, 0x8f, 0x9c,
        -	0x36, 0x9f, 0x37, 0xad, 0x55, 0x67, 0xfd, 0xc9, 0x3f, 0x25, 0x70, 0xb1, 0x4a, 0x1a, 0x7d, 0x42,
        -	0x2a, 0x75, 0xf4, 0xc1, 0x13, 0xf1, 0x12, 0xbc, 0x1e, 0x72, 0x8b, 0xe8, 0xc5, 0x87, 0x99, 0xf1,
        -	0xee, 0xce, 0x0c, 0x5c, 0x76, 0xa5, 0x74, 0x8f, 0xfb, 0x65, 0x7f, 0xd8, 0x2d, 0x77, 0xe5, 0x61,
        -	0xbf, 0x38, 0xf4, 0xe5, 0x57, 0x51, 0xf0, 0x02, 0x2f, 0xfa, 0xc3, 0xee, 0xe3, 0x9f, 0x01, 0x9c,
        -	0x34, 0xe5, 0x61, 0xaf, 0x86, 0x30, 0x70, 0xb7, 0xf8, 0x46, 0x4d, 0x61, 0xd4, 0x90, 0x34, 0x6c,
        -	0x2d, 0x6b, 0x3c, 0x52, 0x63, 0x38, 0x4d, 0x72, 0x2b, 0xee, 0xb3, 0xe0, 0x40, 0xbd, 0x03, 0x34,
        -	0x72, 0x47, 0xd6, 0xe8, 0x4c, 0xfe, 0x3a, 0x6d, 0x58, 0x22, 0x1e, 0xab, 0x4b, 0x38, 0xd7, 0x4c,
        -	0xda, 0x1a, 0xe1, 0xcc, 0xdb, 0x86, 0x59, 0xb3, 0xc6, 0x93, 0x3a, 0x48, 0x5c, 0xcc, 0x6b, 0x97,
        -	0x44, 0xe3, 0x5b, 0xa5, 0x60, 0x46, 0xd6, 0x33, 0xe9, 0x2f, 0x99, 0xb7, 0x26, 0xc4, 0x80, 0xc3,
        -	0xfa, 0xb3, 0x65, 0xbf, 0x31, 0x21, 0x18, 0x27, 0x59, 0xb3, 0x18, 0xd6, 0x78, 0xaa, 0x2e, 0x60,
        -	0x9e, 0x84, 0x52, 0xbc, 0x61, 0x89, 0xa6, 0xa1, 0xc8, 0x1a, 0x51, 0xbd, 0x07, 0xe5, 0x39, 0xb8,
        -	0xe4, 0x9b, 0xba, 0xe5, 0x86, 0x52, 0xa8, 0xf8, 0x99, 0xfa, 0x00, 0x17, 0x6b, 0x32, 0x96, 0x75,
        -	0x6e, 0x3d, 0x37, 0x4e, 0xb4, 0x89, 0xc6, 0x09, 0x8e, 0xea, 0xe5, 0xb4, 0x72, 0xbe, 0xaa, 0x40,
        -	0x21, 0x4c, 0x5c, 0x8a, 0xd9, 0xad, 0xb3, 0x27, 0xb9, 0x66, 0x1c, 0xab, 0x73, 0x98, 0x26, 0x31,
        -	0x9b, 0xd6, 0x72, 0xb5, 0xc1, 0x1a, 0x27, 0x6a, 0x02, 0x67, 0x46, 0x22, 0x7b, 0x21, 0x8b, 0x53,
        -	0x35, 0x87, 0x71, 0x12, 0xba, 0x23, 0x63, 0x69, 0x65, 0x19, 0x67, 0xd5, 0x90, 0xa6, 0x48, 0xd9,
        -	0xba, 0x10, 0x70, 0xbe, 0xda, 0xc2, 0x6c, 0x57, 0x7e, 0x2c, 0x5e, 0xb3, 0x5c, 0x8d, 0x6a, 0x90,
        -	0x6d, 0x8d, 0xb8, 0x3d, 0xfa, 0x7a, 0xf5, 0x8f, 0xe8, 0xca, 0xe3, 0xfd, 0x53, 0xb7, 0x28, 0x7d,
        -	0xb7, 0xec, 0xf6, 0x4f, 0xcf, 0x05, 0x2c, 0x5f, 0xa8, 0xfb, 0xc3, 0xf7, 0x9f, 0xff, 0xab, 0xf9,
        -	0x54, 0x9f, 0xdf, 0x83, 0x63, 0xdf, 0x36, 0xdf, 0x86, 0xcf, 0xaa, 0xab, 0xbf, 0x01, 0x00, 0x00,
        -	0xff, 0xff, 0x8e, 0x97, 0x77, 0xc2, 0xbf, 0x01, 0x00, 0x00,
        +func init() { file_google_rpc_code_proto_init() }
        +func file_google_rpc_code_proto_init() {
        +	if File_google_rpc_code_proto != nil {
        +		return
        +	}
        +	type x struct{}
        +	out := protoimpl.TypeBuilder{
        +		File: protoimpl.DescBuilder{
        +			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
        +			RawDescriptor: file_google_rpc_code_proto_rawDesc,
        +			NumEnums:      1,
        +			NumMessages:   0,
        +			NumExtensions: 0,
        +			NumServices:   0,
        +		},
        +		GoTypes:           file_google_rpc_code_proto_goTypes,
        +		DependencyIndexes: file_google_rpc_code_proto_depIdxs,
        +		EnumInfos:         file_google_rpc_code_proto_enumTypes,
        +	}.Build()
        +	File_google_rpc_code_proto = out.File
        +	file_google_rpc_code_proto_rawDesc = nil
        +	file_google_rpc_code_proto_goTypes = nil
        +	file_google_rpc_code_proto_depIdxs = nil
         }
        diff --git a/vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go b/vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go
        index d13bcbaf4..063d724cb 100644
        --- a/vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go
        +++ b/vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go
        @@ -1,79 +1,58 @@
        +// Copyright 2020 Google LLC
        +//
        +// Licensed under the Apache License, Version 2.0 (the "License");
        +// you may not use this file except in compliance with the License.
        +// You may obtain a copy of the License at
        +//
        +//     http://www.apache.org/licenses/LICENSE-2.0
        +//
        +// Unless required by applicable law or agreed to in writing, software
        +// distributed under the License is distributed on an "AS IS" BASIS,
        +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        +// See the License for the specific language governing permissions and
        +// limitations under the License.
        +
         // Code generated by protoc-gen-go. DO NOT EDIT.
        +// versions:
        +// 	protoc-gen-go v1.22.0
        +// 	protoc        v3.11.2
         // source: google/rpc/status.proto
         
         package status
         
         import (
        -	fmt "fmt"
        +	reflect "reflect"
        +	sync "sync"
        +
         	proto "github.com/golang/protobuf/proto"
         	any "github.com/golang/protobuf/ptypes/any"
        -	math "math"
        +	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
        +	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
         )
         
        -// Reference imports to suppress errors if they are not otherwise used.
        -var _ = proto.Marshal
        -var _ = fmt.Errorf
        -var _ = math.Inf
        +const (
        +	// Verify that this generated code is sufficiently up-to-date.
        +	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
        +	// Verify that runtime/protoimpl is sufficiently up-to-date.
        +	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
        +)
         
        -// This is a compile-time assertion to ensure that this generated file
        -// is compatible with the proto package it is being compiled against.
        -// A compilation error at this line likely means your copy of the
        -// proto package needs to be updated.
        -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
        +// This is a compile-time assertion that a sufficiently up-to-date version
        +// of the legacy proto package is being used.
        +const _ = proto.ProtoPackageIsVersion4
         
        -// The `Status` type defines a logical error model that is suitable for different
        -// programming environments, including REST APIs and RPC APIs. It is used by
        -// [gRPC](https://github.com/grpc). The error model is designed to be:
        -//
        -// - Simple to use and understand for most users
        -// - Flexible enough to meet unexpected needs
        -//
        -// # Overview
        -//
        -// The `Status` message contains three pieces of data: error code, error message,
        -// and error details. The error code should be an enum value of
        -// [google.rpc.Code][google.rpc.Code], but it may accept additional error codes if needed.  The
        -// error message should be a developer-facing English message that helps
        -// developers *understand* and *resolve* the error. If a localized user-facing
        -// error message is needed, put the localized message in the error details or
        -// localize it in the client. The optional error details may contain arbitrary
        -// information about the error. There is a predefined set of error detail types
        -// in the package `google.rpc` that can be used for common error conditions.
        -//
        -// # Language mapping
        +// The `Status` type defines a logical error model that is suitable for
        +// different programming environments, including REST APIs and RPC APIs. It is
        +// used by [gRPC](https://github.com/grpc). Each `Status` message contains
        +// three pieces of data: error code, error message, and error details.
         //
        -// The `Status` message is the logical representation of the error model, but it
        -// is not necessarily the actual wire format. When the `Status` message is
        -// exposed in different client libraries and different wire protocols, it can be
        -// mapped differently. For example, it will likely be mapped to some exceptions
        -// in Java, but more likely mapped to some error codes in C.
        -//
        -// # Other uses
        -//
        -// The error model and the `Status` message can be used in a variety of
        -// environments, either with or without APIs, to provide a
        -// consistent developer experience across different environments.
        -//
        -// Example uses of this error model include:
        -//
        -// - Partial errors. If a service needs to return partial errors to the client,
        -//     it may embed the `Status` in the normal response to indicate the partial
        -//     errors.
        -//
        -// - Workflow errors. A typical workflow has multiple steps. Each step may
        -//     have a `Status` message for error reporting.
        -//
        -// - Batch operations. If a client uses batch request and batch response, the
        -//     `Status` message should be used directly inside batch response, one for
        -//     each error sub-response.
        -//
        -// - Asynchronous operations. If an API call embeds asynchronous operation
        -//     results in its response, the status of those operations should be
        -//     represented directly using the `Status` message.
        -//
        -// - Logging. If some API errors are stored in logs, the message `Status` could
        -//     be used directly after any stripping needed for security/privacy reasons.
        +// You can find out more about this error model and how to work with it in the
        +// [API Design Guide](https://cloud.google.com/apis/design/errors).
         type Status struct {
        +	state         protoimpl.MessageState
        +	sizeCache     protoimpl.SizeCache
        +	unknownFields protoimpl.UnknownFields
        +
         	// The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code].
         	Code int32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"`
         	// A developer-facing error message, which should be in English. Any
        @@ -82,78 +61,146 @@ type Status struct {
         	Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"`
         	// A list of messages that carry the error details.  There is a common set of
         	// message types for APIs to use.
        -	Details              []*any.Any `protobuf:"bytes,3,rep,name=details,proto3" json:"details,omitempty"`
        -	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
        -	XXX_unrecognized     []byte     `json:"-"`
        -	XXX_sizecache        int32      `json:"-"`
        +	Details []*any.Any `protobuf:"bytes,3,rep,name=details,proto3" json:"details,omitempty"`
         }
         
        -func (m *Status) Reset()         { *m = Status{} }
        -func (m *Status) String() string { return proto.CompactTextString(m) }
        -func (*Status) ProtoMessage()    {}
        -func (*Status) Descriptor() ([]byte, []int) {
        -	return fileDescriptor_24d244abaf643bfe, []int{0}
        +func (x *Status) Reset() {
        +	*x = Status{}
        +	if protoimpl.UnsafeEnabled {
        +		mi := &file_google_rpc_status_proto_msgTypes[0]
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		ms.StoreMessageInfo(mi)
        +	}
         }
         
        -func (m *Status) XXX_Unmarshal(b []byte) error {
        -	return xxx_messageInfo_Status.Unmarshal(m, b)
        -}
        -func (m *Status) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
        -	return xxx_messageInfo_Status.Marshal(b, m, deterministic)
        -}
        -func (m *Status) XXX_Merge(src proto.Message) {
        -	xxx_messageInfo_Status.Merge(m, src)
        +func (x *Status) String() string {
        +	return protoimpl.X.MessageStringOf(x)
         }
        -func (m *Status) XXX_Size() int {
        -	return xxx_messageInfo_Status.Size(m)
        -}
        -func (m *Status) XXX_DiscardUnknown() {
        -	xxx_messageInfo_Status.DiscardUnknown(m)
        +
        +func (*Status) ProtoMessage() {}
        +
        +func (x *Status) ProtoReflect() protoreflect.Message {
        +	mi := &file_google_rpc_status_proto_msgTypes[0]
        +	if protoimpl.UnsafeEnabled && x != nil {
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		if ms.LoadMessageInfo() == nil {
        +			ms.StoreMessageInfo(mi)
        +		}
        +		return ms
        +	}
        +	return mi.MessageOf(x)
         }
         
        -var xxx_messageInfo_Status proto.InternalMessageInfo
        +// Deprecated: Use Status.ProtoReflect.Descriptor instead.
        +func (*Status) Descriptor() ([]byte, []int) {
        +	return file_google_rpc_status_proto_rawDescGZIP(), []int{0}
        +}
         
        -func (m *Status) GetCode() int32 {
        -	if m != nil {
        -		return m.Code
        +func (x *Status) GetCode() int32 {
        +	if x != nil {
        +		return x.Code
         	}
         	return 0
         }
         
        -func (m *Status) GetMessage() string {
        -	if m != nil {
        -		return m.Message
        +func (x *Status) GetMessage() string {
        +	if x != nil {
        +		return x.Message
         	}
         	return ""
         }
         
        -func (m *Status) GetDetails() []*any.Any {
        -	if m != nil {
        -		return m.Details
        +func (x *Status) GetDetails() []*any.Any {
        +	if x != nil {
        +		return x.Details
         	}
         	return nil
         }
         
        -func init() {
        -	proto.RegisterType((*Status)(nil), "google.rpc.Status")
        +var File_google_rpc_status_proto protoreflect.FileDescriptor
        +
        +var file_google_rpc_status_proto_rawDesc = []byte{
        +	0x0a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x73, 0x74, 0x61,
        +	0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
        +	0x65, 0x2e, 0x72, 0x70, 0x63, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72,
        +	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
        +	0x22, 0x66, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f,
        +	0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18,
        +	0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
        +	0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61,
        +	0x69, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
        +	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52,
        +	0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x42, 0x61, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e,
        +	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x42, 0x0b, 0x53, 0x74, 0x61, 0x74,
        +	0x75, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x37, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
        +	0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e,
        +	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73,
        +	0x2f, 0x72, 0x70, 0x63, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3b, 0x73, 0x74, 0x61, 0x74,
        +	0x75, 0x73, 0xf8, 0x01, 0x01, 0xa2, 0x02, 0x03, 0x52, 0x50, 0x43, 0x62, 0x06, 0x70, 0x72, 0x6f,
        +	0x74, 0x6f, 0x33,
         }
         
        -func init() { proto.RegisterFile("google/rpc/status.proto", fileDescriptor_24d244abaf643bfe) }
        -
        -var fileDescriptor_24d244abaf643bfe = []byte{
        -	// 209 bytes of a gzipped FileDescriptorProto
        -	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4f, 0xcf, 0xcf, 0x4f,
        -	0xcf, 0x49, 0xd5, 0x2f, 0x2a, 0x48, 0xd6, 0x2f, 0x2e, 0x49, 0x2c, 0x29, 0x2d, 0xd6, 0x2b, 0x28,
        -	0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x82, 0x48, 0xe8, 0x15, 0x15, 0x24, 0x4b, 0x49, 0x42, 0x15, 0x81,
        -	0x65, 0x92, 0x4a, 0xd3, 0xf4, 0x13, 0xf3, 0x2a, 0x21, 0xca, 0x94, 0xd2, 0xb8, 0xd8, 0x82, 0xc1,
        -	0xda, 0x84, 0x84, 0xb8, 0x58, 0x92, 0xf3, 0x53, 0x52, 0x25, 0x18, 0x15, 0x18, 0x35, 0x58, 0x83,
        -	0xc0, 0x6c, 0x21, 0x09, 0x2e, 0xf6, 0xdc, 0xd4, 0xe2, 0xe2, 0xc4, 0xf4, 0x54, 0x09, 0x26, 0x05,
        -	0x46, 0x0d, 0xce, 0x20, 0x18, 0x57, 0x48, 0x8f, 0x8b, 0x3d, 0x25, 0xb5, 0x24, 0x31, 0x33, 0xa7,
        -	0x58, 0x82, 0x59, 0x81, 0x59, 0x83, 0xdb, 0x48, 0x44, 0x0f, 0x6a, 0x21, 0xcc, 0x12, 0x3d, 0xc7,
        -	0xbc, 0xca, 0x20, 0x98, 0x22, 0xa7, 0x38, 0x2e, 0xbe, 0xe4, 0xfc, 0x5c, 0x3d, 0x84, 0xa3, 0x9c,
        -	0xb8, 0x21, 0xf6, 0x06, 0x80, 0x94, 0x07, 0x30, 0x46, 0x99, 0x43, 0xa5, 0xd2, 0xf3, 0x73, 0x12,
        -	0xf3, 0xd2, 0xf5, 0xf2, 0x8b, 0xd2, 0xf5, 0xd3, 0x53, 0xf3, 0xc0, 0x86, 0xe9, 0x43, 0xa4, 0x12,
        -	0x0b, 0x32, 0x8b, 0x91, 0xfc, 0x69, 0x0d, 0xa1, 0x16, 0x31, 0x31, 0x07, 0x05, 0x38, 0x27, 0xb1,
        -	0x81, 0x55, 0x1a, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0xa4, 0x53, 0xf0, 0x7c, 0x10, 0x01, 0x00,
        -	0x00,
        +var (
        +	file_google_rpc_status_proto_rawDescOnce sync.Once
        +	file_google_rpc_status_proto_rawDescData = file_google_rpc_status_proto_rawDesc
        +)
        +
        +func file_google_rpc_status_proto_rawDescGZIP() []byte {
        +	file_google_rpc_status_proto_rawDescOnce.Do(func() {
        +		file_google_rpc_status_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_rpc_status_proto_rawDescData)
        +	})
        +	return file_google_rpc_status_proto_rawDescData
        +}
        +
        +var file_google_rpc_status_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
        +var file_google_rpc_status_proto_goTypes = []interface{}{
        +	(*Status)(nil),  // 0: google.rpc.Status
        +	(*any.Any)(nil), // 1: google.protobuf.Any
        +}
        +var file_google_rpc_status_proto_depIdxs = []int32{
        +	1, // 0: google.rpc.Status.details:type_name -> google.protobuf.Any
        +	1, // [1:1] is the sub-list for method output_type
        +	1, // [1:1] is the sub-list for method input_type
        +	1, // [1:1] is the sub-list for extension type_name
        +	1, // [1:1] is the sub-list for extension extendee
        +	0, // [0:1] is the sub-list for field type_name
        +}
        +
        +func init() { file_google_rpc_status_proto_init() }
        +func file_google_rpc_status_proto_init() {
        +	if File_google_rpc_status_proto != nil {
        +		return
        +	}
        +	if !protoimpl.UnsafeEnabled {
        +		file_google_rpc_status_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
        +			switch v := v.(*Status); i {
        +			case 0:
        +				return &v.state
        +			case 1:
        +				return &v.sizeCache
        +			case 2:
        +				return &v.unknownFields
        +			default:
        +				return nil
        +			}
        +		}
        +	}
        +	type x struct{}
        +	out := protoimpl.TypeBuilder{
        +		File: protoimpl.DescBuilder{
        +			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
        +			RawDescriptor: file_google_rpc_status_proto_rawDesc,
        +			NumEnums:      0,
        +			NumMessages:   1,
        +			NumExtensions: 0,
        +			NumServices:   0,
        +		},
        +		GoTypes:           file_google_rpc_status_proto_goTypes,
        +		DependencyIndexes: file_google_rpc_status_proto_depIdxs,
        +		MessageInfos:      file_google_rpc_status_proto_msgTypes,
        +	}.Build()
        +	File_google_rpc_status_proto = out.File
        +	file_google_rpc_status_proto_rawDesc = nil
        +	file_google_rpc_status_proto_goTypes = nil
        +	file_google_rpc_status_proto_depIdxs = nil
         }
        diff --git a/vendor/google.golang.org/genproto/googleapis/type/expr/expr.pb.go b/vendor/google.golang.org/genproto/googleapis/type/expr/expr.pb.go
        new file mode 100644
        index 000000000..6f0566eda
        --- /dev/null
        +++ b/vendor/google.golang.org/genproto/googleapis/type/expr/expr.pb.go
        @@ -0,0 +1,215 @@
        +// Copyright 2019 Google LLC.
        +//
        +// Licensed under the Apache License, Version 2.0 (the "License");
        +// you may not use this file except in compliance with the License.
        +// You may obtain a copy of the License at
        +//
        +//     http://www.apache.org/licenses/LICENSE-2.0
        +//
        +// Unless required by applicable law or agreed to in writing, software
        +// distributed under the License is distributed on an "AS IS" BASIS,
        +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        +// See the License for the specific language governing permissions and
        +// limitations under the License.
        +//
        +
        +// Code generated by protoc-gen-go. DO NOT EDIT.
        +// versions:
        +// 	protoc-gen-go v1.22.0
        +// 	protoc        v3.11.2
        +// source: google/type/expr.proto
        +
        +package expr
        +
        +import (
        +	reflect "reflect"
        +	sync "sync"
        +
        +	proto "github.com/golang/protobuf/proto"
        +	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
        +	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
        +)
        +
        +const (
        +	// Verify that this generated code is sufficiently up-to-date.
        +	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
        +	// Verify that runtime/protoimpl is sufficiently up-to-date.
        +	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
        +)
        +
        +// This is a compile-time assertion that a sufficiently up-to-date version
        +// of the legacy proto package is being used.
        +const _ = proto.ProtoPackageIsVersion4
        +
        +// Represents an expression text. Example:
        +//
        +//     title: "User account presence"
        +//     description: "Determines whether the request has a user account"
        +//     expression: "size(request.user) > 0"
        +type Expr struct {
        +	state         protoimpl.MessageState
        +	sizeCache     protoimpl.SizeCache
        +	unknownFields protoimpl.UnknownFields
        +
        +	// Textual representation of an expression in
        +	// Common Expression Language syntax.
        +	//
        +	// The application context of the containing message determines which
        +	// well-known feature set of CEL is supported.
        +	Expression string `protobuf:"bytes,1,opt,name=expression,proto3" json:"expression,omitempty"`
        +	// An optional title for the expression, i.e. a short string describing
        +	// its purpose. This can be used e.g. in UIs which allow to enter the
        +	// expression.
        +	Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"`
        +	// An optional description of the expression. This is a longer text which
        +	// describes the expression, e.g. when hovered over it in a UI.
        +	Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
        +	// An optional string indicating the location of the expression for error
        +	// reporting, e.g. a file name and a position in the file.
        +	Location string `protobuf:"bytes,4,opt,name=location,proto3" json:"location,omitempty"`
        +}
        +
        +func (x *Expr) Reset() {
        +	*x = Expr{}
        +	if protoimpl.UnsafeEnabled {
        +		mi := &file_google_type_expr_proto_msgTypes[0]
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		ms.StoreMessageInfo(mi)
        +	}
        +}
        +
        +func (x *Expr) String() string {
        +	return protoimpl.X.MessageStringOf(x)
        +}
        +
        +func (*Expr) ProtoMessage() {}
        +
        +func (x *Expr) ProtoReflect() protoreflect.Message {
        +	mi := &file_google_type_expr_proto_msgTypes[0]
        +	if protoimpl.UnsafeEnabled && x != nil {
        +		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
        +		if ms.LoadMessageInfo() == nil {
        +			ms.StoreMessageInfo(mi)
        +		}
        +		return ms
        +	}
        +	return mi.MessageOf(x)
        +}
        +
        +// Deprecated: Use Expr.ProtoReflect.Descriptor instead.
        +func (*Expr) Descriptor() ([]byte, []int) {
        +	return file_google_type_expr_proto_rawDescGZIP(), []int{0}
        +}
        +
        +func (x *Expr) GetExpression() string {
        +	if x != nil {
        +		return x.Expression
        +	}
        +	return ""
        +}
        +
        +func (x *Expr) GetTitle() string {
        +	if x != nil {
        +		return x.Title
        +	}
        +	return ""
        +}
        +
        +func (x *Expr) GetDescription() string {
        +	if x != nil {
        +		return x.Description
        +	}
        +	return ""
        +}
        +
        +func (x *Expr) GetLocation() string {
        +	if x != nil {
        +		return x.Location
        +	}
        +	return ""
        +}
        +
        +var File_google_type_expr_proto protoreflect.FileDescriptor
        +
        +var file_google_type_expr_proto_rawDesc = []byte{
        +	0x0a, 0x16, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x65, 0x78,
        +	0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
        +	0x2e, 0x74, 0x79, 0x70, 0x65, 0x22, 0x7a, 0x0a, 0x04, 0x45, 0x78, 0x70, 0x72, 0x12, 0x1e, 0x0a,
        +	0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
        +	0x09, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a,
        +	0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69,
        +	0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
        +	0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,
        +	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f,
        +	0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f,
        +	0x6e, 0x42, 0x5a, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
        +	0x74, 0x79, 0x70, 0x65, 0x42, 0x09, 0x45, 0x78, 0x70, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50,
        +	0x01, 0x5a, 0x34, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67,
        +	0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f,
        +	0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x65, 0x78,
        +	0x70, 0x72, 0x3b, 0x65, 0x78, 0x70, 0x72, 0xa2, 0x02, 0x03, 0x47, 0x54, 0x50, 0x62, 0x06, 0x70,
        +	0x72, 0x6f, 0x74, 0x6f, 0x33,
        +}
        +
        +var (
        +	file_google_type_expr_proto_rawDescOnce sync.Once
        +	file_google_type_expr_proto_rawDescData = file_google_type_expr_proto_rawDesc
        +)
        +
        +func file_google_type_expr_proto_rawDescGZIP() []byte {
        +	file_google_type_expr_proto_rawDescOnce.Do(func() {
        +		file_google_type_expr_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_type_expr_proto_rawDescData)
        +	})
        +	return file_google_type_expr_proto_rawDescData
        +}
        +
        +var file_google_type_expr_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
        +var file_google_type_expr_proto_goTypes = []interface{}{
        +	(*Expr)(nil), // 0: google.type.Expr
        +}
        +var file_google_type_expr_proto_depIdxs = []int32{
        +	0, // [0:0] is the sub-list for method output_type
        +	0, // [0:0] is the sub-list for method input_type
        +	0, // [0:0] is the sub-list for extension type_name
        +	0, // [0:0] is the sub-list for extension extendee
        +	0, // [0:0] is the sub-list for field type_name
        +}
        +
        +func init() { file_google_type_expr_proto_init() }
        +func file_google_type_expr_proto_init() {
        +	if File_google_type_expr_proto != nil {
        +		return
        +	}
        +	if !protoimpl.UnsafeEnabled {
        +		file_google_type_expr_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
        +			switch v := v.(*Expr); i {
        +			case 0:
        +				return &v.state
        +			case 1:
        +				return &v.sizeCache
        +			case 2:
        +				return &v.unknownFields
        +			default:
        +				return nil
        +			}
        +		}
        +	}
        +	type x struct{}
        +	out := protoimpl.TypeBuilder{
        +		File: protoimpl.DescBuilder{
        +			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
        +			RawDescriptor: file_google_type_expr_proto_rawDesc,
        +			NumEnums:      0,
        +			NumMessages:   1,
        +			NumExtensions: 0,
        +			NumServices:   0,
        +		},
        +		GoTypes:           file_google_type_expr_proto_goTypes,
        +		DependencyIndexes: file_google_type_expr_proto_depIdxs,
        +		MessageInfos:      file_google_type_expr_proto_msgTypes,
        +	}.Build()
        +	File_google_type_expr_proto = out.File
        +	file_google_type_expr_proto_rawDesc = nil
        +	file_google_type_expr_proto_goTypes = nil
        +	file_google_type_expr_proto_depIdxs = nil
        +}
        diff --git a/vendor/google.golang.org/grpc/codegen.sh b/vendor/google.golang.org/grpc/codegen.sh
        old mode 100755
        new mode 100644
        diff --git a/vendor/google.golang.org/grpc/install_gae.sh b/vendor/google.golang.org/grpc/install_gae.sh
        old mode 100755
        new mode 100644
        diff --git a/vendor/google.golang.org/grpc/internal/binarylog/regenerate.sh b/vendor/google.golang.org/grpc/internal/binarylog/regenerate.sh
        old mode 100755
        new mode 100644
        diff --git a/vendor/google.golang.org/grpc/vet.sh b/vendor/google.golang.org/grpc/vet.sh
        old mode 100755
        new mode 100644
        diff --git a/vendor/gopkg.in/check.v1/.gitignore b/vendor/gopkg.in/check.v1/.gitignore
        deleted file mode 100644
        index 191a5360b..000000000
        --- a/vendor/gopkg.in/check.v1/.gitignore
        +++ /dev/null
        @@ -1,4 +0,0 @@
        -_*
        -*.swp
        -*.[568]
        -[568].out
        diff --git a/vendor/gopkg.in/check.v1/.travis.yml b/vendor/gopkg.in/check.v1/.travis.yml
        deleted file mode 100644
        index ead6735fc..000000000
        --- a/vendor/gopkg.in/check.v1/.travis.yml
        +++ /dev/null
        @@ -1,3 +0,0 @@
        -language: go
        -
        -go_import_path: gopkg.in/check.v1
        diff --git a/vendor/gopkg.in/check.v1/LICENSE b/vendor/gopkg.in/check.v1/LICENSE
        deleted file mode 100644
        index 545cf2d33..000000000
        --- a/vendor/gopkg.in/check.v1/LICENSE
        +++ /dev/null
        @@ -1,25 +0,0 @@
        -Gocheck - A rich testing framework for Go
        - 
        -Copyright (c) 2010-2013 Gustavo Niemeyer 
        -
        -All rights reserved.
        -
        -Redistribution and use in source and binary forms, with or without
        -modification, are permitted provided that the following conditions are met: 
        -
        -1. Redistributions of source code must retain the above copyright notice, this
        -   list of conditions and the following disclaimer. 
        -2. Redistributions in binary form must reproduce the above copyright notice,
        -   this list of conditions and the following disclaimer in the documentation
        -   and/or other materials provided with the distribution. 
        -
        -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
        -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
        -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
        -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
        -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
        -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
        -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
        -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
        -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        diff --git a/vendor/gopkg.in/check.v1/README.md b/vendor/gopkg.in/check.v1/README.md
        deleted file mode 100644
        index 0ca9e5726..000000000
        --- a/vendor/gopkg.in/check.v1/README.md
        +++ /dev/null
        @@ -1,20 +0,0 @@
        -Instructions
        -============
        -
        -Install the package with:
        -
        -    go get gopkg.in/check.v1
        -    
        -Import it with:
        -
        -    import "gopkg.in/check.v1"
        -
        -and use _check_ as the package name inside the code.
        -
        -For more details, visit the project page:
        -
        -* http://labix.org/gocheck
        -
        -and the API documentation:
        -
        -* https://gopkg.in/check.v1
        diff --git a/vendor/gopkg.in/check.v1/TODO b/vendor/gopkg.in/check.v1/TODO
        deleted file mode 100644
        index 33498270e..000000000
        --- a/vendor/gopkg.in/check.v1/TODO
        +++ /dev/null
        @@ -1,2 +0,0 @@
        -- Assert(slice, Contains, item)
        -- Parallel test support
        diff --git a/vendor/gopkg.in/check.v1/benchmark.go b/vendor/gopkg.in/check.v1/benchmark.go
        deleted file mode 100644
        index 46ea9dc6d..000000000
        --- a/vendor/gopkg.in/check.v1/benchmark.go
        +++ /dev/null
        @@ -1,187 +0,0 @@
        -// Copyright (c) 2012 The Go Authors. All rights reserved.
        -// 
        -// Redistribution and use in source and binary forms, with or without
        -// modification, are permitted provided that the following conditions are
        -// met:
        -// 
        -//    * Redistributions of source code must retain the above copyright
        -// notice, this list of conditions and the following disclaimer.
        -//    * Redistributions in binary form must reproduce the above
        -// copyright notice, this list of conditions and the following disclaimer
        -// in the documentation and/or other materials provided with the
        -// distribution.
        -//    * Neither the name of Google Inc. nor the names of its
        -// contributors may be used to endorse or promote products derived from
        -// this software without specific prior written permission.
        -// 
        -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
        -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
        -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
        -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
        -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
        -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
        -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
        -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
        -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
        -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        -
        -package check
        -
        -import (
        -	"fmt"
        -	"runtime"
        -	"time"
        -)
        -
        -var memStats runtime.MemStats
        -
        -// testingB is a type passed to Benchmark functions to manage benchmark
        -// timing and to specify the number of iterations to run.
        -type timer struct {
        -	start     time.Time // Time test or benchmark started
        -	duration  time.Duration
        -	N         int
        -	bytes     int64
        -	timerOn   bool
        -	benchTime time.Duration
        -	// The initial states of memStats.Mallocs and memStats.TotalAlloc.
        -	startAllocs uint64
        -	startBytes  uint64
        -	// The net total of this test after being run.
        -	netAllocs uint64
        -	netBytes  uint64
        -}
        -
        -// StartTimer starts timing a test. This function is called automatically
        -// before a benchmark starts, but it can also used to resume timing after
        -// a call to StopTimer.
        -func (c *C) StartTimer() {
        -	if !c.timerOn {
        -		c.start = time.Now()
        -		c.timerOn = true
        -
        -		runtime.ReadMemStats(&memStats)
        -		c.startAllocs = memStats.Mallocs
        -		c.startBytes = memStats.TotalAlloc
        -	}
        -}
        -
        -// StopTimer stops timing a test. This can be used to pause the timer
        -// while performing complex initialization that you don't
        -// want to measure.
        -func (c *C) StopTimer() {
        -	if c.timerOn {
        -		c.duration += time.Now().Sub(c.start)
        -		c.timerOn = false
        -		runtime.ReadMemStats(&memStats)
        -		c.netAllocs += memStats.Mallocs - c.startAllocs
        -		c.netBytes += memStats.TotalAlloc - c.startBytes
        -	}
        -}
        -
        -// ResetTimer sets the elapsed benchmark time to zero.
        -// It does not affect whether the timer is running.
        -func (c *C) ResetTimer() {
        -	if c.timerOn {
        -		c.start = time.Now()
        -		runtime.ReadMemStats(&memStats)
        -		c.startAllocs = memStats.Mallocs
        -		c.startBytes = memStats.TotalAlloc
        -	}
        -	c.duration = 0
        -	c.netAllocs = 0
        -	c.netBytes = 0
        -}
        -
        -// SetBytes informs the number of bytes that the benchmark processes
        -// on each iteration. If this is called in a benchmark it will also
        -// report MB/s.
        -func (c *C) SetBytes(n int64) {
        -	c.bytes = n
        -}
        -
        -func (c *C) nsPerOp() int64 {
        -	if c.N <= 0 {
        -		return 0
        -	}
        -	return c.duration.Nanoseconds() / int64(c.N)
        -}
        -
        -func (c *C) mbPerSec() float64 {
        -	if c.bytes <= 0 || c.duration <= 0 || c.N <= 0 {
        -		return 0
        -	}
        -	return (float64(c.bytes) * float64(c.N) / 1e6) / c.duration.Seconds()
        -}
        -
        -func (c *C) timerString() string {
        -	if c.N <= 0 {
        -		return fmt.Sprintf("%3.3fs", float64(c.duration.Nanoseconds())/1e9)
        -	}
        -	mbs := c.mbPerSec()
        -	mb := ""
        -	if mbs != 0 {
        -		mb = fmt.Sprintf("\t%7.2f MB/s", mbs)
        -	}
        -	nsop := c.nsPerOp()
        -	ns := fmt.Sprintf("%10d ns/op", nsop)
        -	if c.N > 0 && nsop < 100 {
        -		// The format specifiers here make sure that
        -		// the ones digits line up for all three possible formats.
        -		if nsop < 10 {
        -			ns = fmt.Sprintf("%13.2f ns/op", float64(c.duration.Nanoseconds())/float64(c.N))
        -		} else {
        -			ns = fmt.Sprintf("%12.1f ns/op", float64(c.duration.Nanoseconds())/float64(c.N))
        -		}
        -	}
        -	memStats := ""
        -	if c.benchMem {
        -		allocedBytes := fmt.Sprintf("%8d B/op", int64(c.netBytes)/int64(c.N))
        -		allocs := fmt.Sprintf("%8d allocs/op", int64(c.netAllocs)/int64(c.N))
        -		memStats = fmt.Sprintf("\t%s\t%s", allocedBytes, allocs)
        -	}
        -	return fmt.Sprintf("%8d\t%s%s%s", c.N, ns, mb, memStats)
        -}
        -
        -func min(x, y int) int {
        -	if x > y {
        -		return y
        -	}
        -	return x
        -}
        -
        -func max(x, y int) int {
        -	if x < y {
        -		return y
        -	}
        -	return x
        -}
        -
        -// roundDown10 rounds a number down to the nearest power of 10.
        -func roundDown10(n int) int {
        -	var tens = 0
        -	// tens = floor(log_10(n))
        -	for n > 10 {
        -		n = n / 10
        -		tens++
        -	}
        -	// result = 10^tens
        -	result := 1
        -	for i := 0; i < tens; i++ {
        -		result *= 10
        -	}
        -	return result
        -}
        -
        -// roundUp rounds x up to a number of the form [1eX, 2eX, 5eX].
        -func roundUp(n int) int {
        -	base := roundDown10(n)
        -	if n < (2 * base) {
        -		return 2 * base
        -	}
        -	if n < (5 * base) {
        -		return 5 * base
        -	}
        -	return 10 * base
        -}
        diff --git a/vendor/gopkg.in/check.v1/check.go b/vendor/gopkg.in/check.v1/check.go
        deleted file mode 100644
        index de714c271..000000000
        --- a/vendor/gopkg.in/check.v1/check.go
        +++ /dev/null
        @@ -1,882 +0,0 @@
        -// Package check is a rich testing extension for Go's testing package.
        -//
        -// For details about the project, see:
        -//
        -//     http://labix.org/gocheck
        -//
        -package check
        -
        -import (
        -	"bytes"
        -	"errors"
        -	"fmt"
        -	"io"
        -	"math/rand"
        -	"os"
        -	"path"
        -	"path/filepath"
        -	"reflect"
        -	"regexp"
        -	"runtime"
        -	"strconv"
        -	"strings"
        -	"sync"
        -	"sync/atomic"
        -	"time"
        -)
        -
        -// -----------------------------------------------------------------------
        -// Internal type which deals with suite method calling.
        -
        -const (
        -	fixtureKd = iota
        -	testKd
        -)
        -
        -type funcKind int
        -
        -const (
        -	succeededSt = iota
        -	failedSt
        -	skippedSt
        -	panickedSt
        -	fixturePanickedSt
        -	missedSt
        -)
        -
        -type funcStatus uint32
        -
        -// A method value can't reach its own Method structure.
        -type methodType struct {
        -	reflect.Value
        -	Info reflect.Method
        -}
        -
        -func newMethod(receiver reflect.Value, i int) *methodType {
        -	return &methodType{receiver.Method(i), receiver.Type().Method(i)}
        -}
        -
        -func (method *methodType) PC() uintptr {
        -	return method.Info.Func.Pointer()
        -}
        -
        -func (method *methodType) suiteName() string {
        -	t := method.Info.Type.In(0)
        -	if t.Kind() == reflect.Ptr {
        -		t = t.Elem()
        -	}
        -	return t.Name()
        -}
        -
        -func (method *methodType) String() string {
        -	return method.suiteName() + "." + method.Info.Name
        -}
        -
        -func (method *methodType) matches(re *regexp.Regexp) bool {
        -	return (re.MatchString(method.Info.Name) ||
        -		re.MatchString(method.suiteName()) ||
        -		re.MatchString(method.String()))
        -}
        -
        -type C struct {
        -	method    *methodType
        -	kind      funcKind
        -	testName  string
        -	_status   funcStatus
        -	logb      *logger
        -	logw      io.Writer
        -	done      chan *C
        -	reason    string
        -	mustFail  bool
        -	tempDir   *tempDir
        -	benchMem  bool
        -	startTime time.Time
        -	timer
        -}
        -
        -func (c *C) status() funcStatus {
        -	return funcStatus(atomic.LoadUint32((*uint32)(&c._status)))
        -}
        -
        -func (c *C) setStatus(s funcStatus) {
        -	atomic.StoreUint32((*uint32)(&c._status), uint32(s))
        -}
        -
        -func (c *C) stopNow() {
        -	runtime.Goexit()
        -}
        -
        -// logger is a concurrency safe byte.Buffer
        -type logger struct {
        -	sync.Mutex
        -	writer bytes.Buffer
        -}
        -
        -func (l *logger) Write(buf []byte) (int, error) {
        -	l.Lock()
        -	defer l.Unlock()
        -	return l.writer.Write(buf)
        -}
        -
        -func (l *logger) WriteTo(w io.Writer) (int64, error) {
        -	l.Lock()
        -	defer l.Unlock()
        -	return l.writer.WriteTo(w)
        -}
        -
        -func (l *logger) String() string {
        -	l.Lock()
        -	defer l.Unlock()
        -	return l.writer.String()
        -}
        -
        -// -----------------------------------------------------------------------
        -// Handling of temporary files and directories.
        -
        -type tempDir struct {
        -	sync.Mutex
        -	path    string
        -	counter int
        -}
        -
        -func (td *tempDir) newPath() string {
        -	td.Lock()
        -	defer td.Unlock()
        -	if td.path == "" {
        -		var err error
        -		for i := 0; i != 100; i++ {
        -			path := fmt.Sprintf("%s%ccheck-%d", os.TempDir(), os.PathSeparator, rand.Int())
        -			if err = os.Mkdir(path, 0700); err == nil {
        -				td.path = path
        -				break
        -			}
        -		}
        -		if td.path == "" {
        -			panic("Couldn't create temporary directory: " + err.Error())
        -		}
        -	}
        -	result := filepath.Join(td.path, strconv.Itoa(td.counter))
        -	td.counter++
        -	return result
        -}
        -
        -func (td *tempDir) removeAll() {
        -	td.Lock()
        -	defer td.Unlock()
        -	if td.path != "" {
        -		err := os.RemoveAll(td.path)
        -		if err != nil {
        -			fmt.Fprintf(os.Stderr, "WARNING: Error cleaning up temporaries: "+err.Error())
        -		}
        -	}
        -}
        -
        -// Create a new temporary directory which is automatically removed after
        -// the suite finishes running.
        -func (c *C) MkDir() string {
        -	path := c.tempDir.newPath()
        -	if err := os.Mkdir(path, 0700); err != nil {
        -		panic(fmt.Sprintf("Couldn't create temporary directory %s: %s", path, err.Error()))
        -	}
        -	return path
        -}
        -
        -// -----------------------------------------------------------------------
        -// Low-level logging functions.
        -
        -func (c *C) log(args ...interface{}) {
        -	c.writeLog([]byte(fmt.Sprint(args...) + "\n"))
        -}
        -
        -func (c *C) logf(format string, args ...interface{}) {
        -	c.writeLog([]byte(fmt.Sprintf(format+"\n", args...)))
        -}
        -
        -func (c *C) logNewLine() {
        -	c.writeLog([]byte{'\n'})
        -}
        -
        -func (c *C) writeLog(buf []byte) {
        -	c.logb.Write(buf)
        -	if c.logw != nil {
        -		c.logw.Write(buf)
        -	}
        -}
        -
        -func hasStringOrError(x interface{}) (ok bool) {
        -	_, ok = x.(fmt.Stringer)
        -	if ok {
        -		return
        -	}
        -	_, ok = x.(error)
        -	return
        -}
        -
        -func (c *C) logValue(label string, value interface{}) {
        -	if label == "" {
        -		if hasStringOrError(value) {
        -			c.logf("... %#v (%q)", value, value)
        -		} else {
        -			c.logf("... %#v", value)
        -		}
        -	} else if value == nil {
        -		c.logf("... %s = nil", label)
        -	} else {
        -		if hasStringOrError(value) {
        -			fv := fmt.Sprintf("%#v", value)
        -			qv := fmt.Sprintf("%q", value)
        -			if fv != qv {
        -				c.logf("... %s %s = %s (%s)", label, reflect.TypeOf(value), fv, qv)
        -				return
        -			}
        -		}
        -		if s, ok := value.(string); ok && isMultiLine(s) {
        -			c.logf(`... %s %s = "" +`, label, reflect.TypeOf(value))
        -			c.logMultiLine(s)
        -		} else {
        -			c.logf("... %s %s = %#v", label, reflect.TypeOf(value), value)
        -		}
        -	}
        -}
        -
        -func formatMultiLine(s string, quote bool) []byte {
        -	b := make([]byte, 0, len(s)*2)
        -	i := 0
        -	n := len(s)
        -	for i < n {
        -		j := i + 1
        -		for j < n && s[j-1] != '\n' {
        -			j++
        -		}
        -		b = append(b, "...     "...)
        -		if quote {
        -			b = strconv.AppendQuote(b, s[i:j])
        -		} else {
        -			b = append(b, s[i:j]...)
        -			b = bytes.TrimSpace(b)
        -		}
        -		if quote && j < n {
        -			b = append(b, " +"...)
        -		}
        -		b = append(b, '\n')
        -		i = j
        -	}
        -	return b
        -}
        -
        -func (c *C) logMultiLine(s string) {
        -	c.writeLog(formatMultiLine(s, true))
        -}
        -
        -func isMultiLine(s string) bool {
        -	for i := 0; i+1 < len(s); i++ {
        -		if s[i] == '\n' {
        -			return true
        -		}
        -	}
        -	return false
        -}
        -
        -func (c *C) logString(issue string) {
        -	c.log("... ", issue)
        -}
        -
        -func (c *C) logCaller(skip int) {
        -	// This is a bit heavier than it ought to be.
        -	skip++ // Our own frame.
        -	pc, callerFile, callerLine, ok := runtime.Caller(skip)
        -	if !ok {
        -		return
        -	}
        -	var testFile string
        -	var testLine int
        -	testFunc := runtime.FuncForPC(c.method.PC())
        -	if runtime.FuncForPC(pc) != testFunc {
        -		for {
        -			skip++
        -			if pc, file, line, ok := runtime.Caller(skip); ok {
        -				// Note that the test line may be different on
        -				// distinct calls for the same test.  Showing
        -				// the "internal" line is helpful when debugging.
        -				if runtime.FuncForPC(pc) == testFunc {
        -					testFile, testLine = file, line
        -					break
        -				}
        -			} else {
        -				break
        -			}
        -		}
        -	}
        -	if testFile != "" && (testFile != callerFile || testLine != callerLine) {
        -		c.logCode(testFile, testLine)
        -	}
        -	c.logCode(callerFile, callerLine)
        -}
        -
        -func (c *C) logCode(path string, line int) {
        -	c.logf("%s:%d:", nicePath(path), line)
        -	code, err := printLine(path, line)
        -	if code == "" {
        -		code = "..." // XXX Open the file and take the raw line.
        -		if err != nil {
        -			code += err.Error()
        -		}
        -	}
        -	c.log(indent(code, "    "))
        -}
        -
        -var valueGo = filepath.Join("reflect", "value.go")
        -var asmGo = filepath.Join("runtime", "asm_")
        -
        -func (c *C) logPanic(skip int, value interface{}) {
        -	skip++ // Our own frame.
        -	initialSkip := skip
        -	for ; ; skip++ {
        -		if pc, file, line, ok := runtime.Caller(skip); ok {
        -			if skip == initialSkip {
        -				c.logf("... Panic: %s (PC=0x%X)\n", value, pc)
        -			}
        -			name := niceFuncName(pc)
        -			path := nicePath(file)
        -			if strings.Contains(path, "/gopkg.in/check.v") {
        -				continue
        -			}
        -			if name == "Value.call" && strings.HasSuffix(path, valueGo) {
        -				continue
        -			}
        -			if (name == "call16" || name == "call32") && strings.Contains(path, asmGo) {
        -				continue
        -			}
        -			c.logf("%s:%d\n  in %s", nicePath(file), line, name)
        -		} else {
        -			break
        -		}
        -	}
        -}
        -
        -func (c *C) logSoftPanic(issue string) {
        -	c.log("... Panic: ", issue)
        -}
        -
        -func (c *C) logArgPanic(method *methodType, expectedType string) {
        -	c.logf("... Panic: %s argument should be %s",
        -		niceFuncName(method.PC()), expectedType)
        -}
        -
        -// -----------------------------------------------------------------------
        -// Some simple formatting helpers.
        -
        -var initWD, initWDErr = os.Getwd()
        -
        -func init() {
        -	if initWDErr == nil {
        -		initWD = strings.Replace(initWD, "\\", "/", -1) + "/"
        -	}
        -}
        -
        -func nicePath(path string) string {
        -	if initWDErr == nil {
        -		if strings.HasPrefix(path, initWD) {
        -			return path[len(initWD):]
        -		}
        -	}
        -	return path
        -}
        -
        -func niceFuncPath(pc uintptr) string {
        -	function := runtime.FuncForPC(pc)
        -	if function != nil {
        -		filename, line := function.FileLine(pc)
        -		return fmt.Sprintf("%s:%d", nicePath(filename), line)
        -	}
        -	return ""
        -}
        -
        -func niceFuncName(pc uintptr) string {
        -	function := runtime.FuncForPC(pc)
        -	if function != nil {
        -		name := path.Base(function.Name())
        -		if i := strings.Index(name, "."); i > 0 {
        -			name = name[i+1:]
        -		}
        -		if strings.HasPrefix(name, "(*") {
        -			if i := strings.Index(name, ")"); i > 0 {
        -				name = name[2:i] + name[i+1:]
        -			}
        -		}
        -		if i := strings.LastIndex(name, ".*"); i != -1 {
        -			name = name[:i] + "." + name[i+2:]
        -		}
        -		if i := strings.LastIndex(name, "·"); i != -1 {
        -			name = name[:i] + "." + name[i+2:]
        -		}
        -		return name
        -	}
        -	return ""
        -}
        -
        -// -----------------------------------------------------------------------
        -// Result tracker to aggregate call results.
        -
        -type Result struct {
        -	Succeeded        int
        -	Failed           int
        -	Skipped          int
        -	Panicked         int
        -	FixturePanicked  int
        -	ExpectedFailures int
        -	Missed           int    // Not even tried to run, related to a panic in the fixture.
        -	RunError         error  // Houston, we've got a problem.
        -	WorkDir          string // If KeepWorkDir is true
        -}
        -
        -type resultTracker struct {
        -	result          Result
        -	_lastWasProblem bool
        -	_waiting        int
        -	_missed         int
        -	_expectChan     chan *C
        -	_doneChan       chan *C
        -	_stopChan       chan bool
        -}
        -
        -func newResultTracker() *resultTracker {
        -	return &resultTracker{_expectChan: make(chan *C), // Synchronous
        -		_doneChan: make(chan *C, 32), // Asynchronous
        -		_stopChan: make(chan bool)}   // Synchronous
        -}
        -
        -func (tracker *resultTracker) start() {
        -	go tracker._loopRoutine()
        -}
        -
        -func (tracker *resultTracker) waitAndStop() {
        -	<-tracker._stopChan
        -}
        -
        -func (tracker *resultTracker) expectCall(c *C) {
        -	tracker._expectChan <- c
        -}
        -
        -func (tracker *resultTracker) callDone(c *C) {
        -	tracker._doneChan <- c
        -}
        -
        -func (tracker *resultTracker) _loopRoutine() {
        -	for {
        -		var c *C
        -		if tracker._waiting > 0 {
        -			// Calls still running. Can't stop.
        -			select {
        -			// XXX Reindent this (not now to make diff clear)
        -			case <-tracker._expectChan:
        -				tracker._waiting++
        -			case c = <-tracker._doneChan:
        -				tracker._waiting--
        -				switch c.status() {
        -				case succeededSt:
        -					if c.kind == testKd {
        -						if c.mustFail {
        -							tracker.result.ExpectedFailures++
        -						} else {
        -							tracker.result.Succeeded++
        -						}
        -					}
        -				case failedSt:
        -					tracker.result.Failed++
        -				case panickedSt:
        -					if c.kind == fixtureKd {
        -						tracker.result.FixturePanicked++
        -					} else {
        -						tracker.result.Panicked++
        -					}
        -				case fixturePanickedSt:
        -					// Track it as missed, since the panic
        -					// was on the fixture, not on the test.
        -					tracker.result.Missed++
        -				case missedSt:
        -					tracker.result.Missed++
        -				case skippedSt:
        -					if c.kind == testKd {
        -						tracker.result.Skipped++
        -					}
        -				}
        -			}
        -		} else {
        -			// No calls.  Can stop, but no done calls here.
        -			select {
        -			case tracker._stopChan <- true:
        -				return
        -			case <-tracker._expectChan:
        -				tracker._waiting++
        -			case <-tracker._doneChan:
        -				panic("Tracker got an unexpected done call.")
        -			}
        -		}
        -	}
        -}
        -
        -// -----------------------------------------------------------------------
        -// The underlying suite runner.
        -
        -type suiteRunner struct {
        -	suite                     interface{}
        -	setUpSuite, tearDownSuite *methodType
        -	setUpTest, tearDownTest   *methodType
        -	tests                     []*methodType
        -	tracker                   *resultTracker
        -	tempDir                   *tempDir
        -	keepDir                   bool
        -	output                    *outputWriter
        -	reportedProblemLast       bool
        -	benchTime                 time.Duration
        -	benchMem                  bool
        -}
        -
        -type RunConf struct {
        -	Output        io.Writer
        -	Stream        bool
        -	Verbose       bool
        -	Filter        string
        -	Benchmark     bool
        -	BenchmarkTime time.Duration // Defaults to 1 second
        -	BenchmarkMem  bool
        -	KeepWorkDir   bool
        -}
        -
        -// Create a new suiteRunner able to run all methods in the given suite.
        -func newSuiteRunner(suite interface{}, runConf *RunConf) *suiteRunner {
        -	var conf RunConf
        -	if runConf != nil {
        -		conf = *runConf
        -	}
        -	if conf.Output == nil {
        -		conf.Output = os.Stdout
        -	}
        -	if conf.Benchmark {
        -		conf.Verbose = true
        -	}
        -
        -	suiteType := reflect.TypeOf(suite)
        -	suiteNumMethods := suiteType.NumMethod()
        -	suiteValue := reflect.ValueOf(suite)
        -
        -	runner := &suiteRunner{
        -		suite:     suite,
        -		output:    newOutputWriter(conf.Output, conf.Stream, conf.Verbose),
        -		tracker:   newResultTracker(),
        -		benchTime: conf.BenchmarkTime,
        -		benchMem:  conf.BenchmarkMem,
        -		tempDir:   &tempDir{},
        -		keepDir:   conf.KeepWorkDir,
        -		tests:     make([]*methodType, 0, suiteNumMethods),
        -	}
        -	if runner.benchTime == 0 {
        -		runner.benchTime = 1 * time.Second
        -	}
        -
        -	var filterRegexp *regexp.Regexp
        -	if conf.Filter != "" {
        -		regexp, err := regexp.Compile(conf.Filter)
        -		if err != nil {
        -			msg := "Bad filter expression: " + err.Error()
        -			runner.tracker.result.RunError = errors.New(msg)
        -			return runner
        -		}
        -		filterRegexp = regexp
        -	}
        -
        -	for i := 0; i != suiteNumMethods; i++ {
        -		method := newMethod(suiteValue, i)
        -		switch method.Info.Name {
        -		case "SetUpSuite":
        -			runner.setUpSuite = method
        -		case "TearDownSuite":
        -			runner.tearDownSuite = method
        -		case "SetUpTest":
        -			runner.setUpTest = method
        -		case "TearDownTest":
        -			runner.tearDownTest = method
        -		default:
        -			prefix := "Test"
        -			if conf.Benchmark {
        -				prefix = "Benchmark"
        -			}
        -			if !strings.HasPrefix(method.Info.Name, prefix) {
        -				continue
        -			}
        -			if filterRegexp == nil || method.matches(filterRegexp) {
        -				runner.tests = append(runner.tests, method)
        -			}
        -		}
        -	}
        -	return runner
        -}
        -
        -// Run all methods in the given suite.
        -func (runner *suiteRunner) run() *Result {
        -	if runner.tracker.result.RunError == nil && len(runner.tests) > 0 {
        -		runner.tracker.start()
        -		if runner.checkFixtureArgs() {
        -			c := runner.runFixture(runner.setUpSuite, "", nil)
        -			if c == nil || c.status() == succeededSt {
        -				for i := 0; i != len(runner.tests); i++ {
        -					c := runner.runTest(runner.tests[i])
        -					if c.status() == fixturePanickedSt {
        -						runner.skipTests(missedSt, runner.tests[i+1:])
        -						break
        -					}
        -				}
        -			} else if c != nil && c.status() == skippedSt {
        -				runner.skipTests(skippedSt, runner.tests)
        -			} else {
        -				runner.skipTests(missedSt, runner.tests)
        -			}
        -			runner.runFixture(runner.tearDownSuite, "", nil)
        -		} else {
        -			runner.skipTests(missedSt, runner.tests)
        -		}
        -		runner.tracker.waitAndStop()
        -		if runner.keepDir {
        -			runner.tracker.result.WorkDir = runner.tempDir.path
        -		} else {
        -			runner.tempDir.removeAll()
        -		}
        -	}
        -	return &runner.tracker.result
        -}
        -
        -// Create a call object with the given suite method, and fork a
        -// goroutine with the provided dispatcher for running it.
        -func (runner *suiteRunner) forkCall(method *methodType, kind funcKind, testName string, logb *logger, dispatcher func(c *C)) *C {
        -	var logw io.Writer
        -	if runner.output.Stream {
        -		logw = runner.output
        -	}
        -	if logb == nil {
        -		logb = new(logger)
        -	}
        -	c := &C{
        -		method:    method,
        -		kind:      kind,
        -		testName:  testName,
        -		logb:      logb,
        -		logw:      logw,
        -		tempDir:   runner.tempDir,
        -		done:      make(chan *C, 1),
        -		timer:     timer{benchTime: runner.benchTime},
        -		startTime: time.Now(),
        -		benchMem:  runner.benchMem,
        -	}
        -	runner.tracker.expectCall(c)
        -	go (func() {
        -		runner.reportCallStarted(c)
        -		defer runner.callDone(c)
        -		dispatcher(c)
        -	})()
        -	return c
        -}
        -
        -// Same as forkCall(), but wait for call to finish before returning.
        -func (runner *suiteRunner) runFunc(method *methodType, kind funcKind, testName string, logb *logger, dispatcher func(c *C)) *C {
        -	c := runner.forkCall(method, kind, testName, logb, dispatcher)
        -	<-c.done
        -	return c
        -}
        -
        -// Handle a finished call.  If there were any panics, update the call status
        -// accordingly.  Then, mark the call as done and report to the tracker.
        -func (runner *suiteRunner) callDone(c *C) {
        -	value := recover()
        -	if value != nil {
        -		switch v := value.(type) {
        -		case *fixturePanic:
        -			if v.status == skippedSt {
        -				c.setStatus(skippedSt)
        -			} else {
        -				c.logSoftPanic("Fixture has panicked (see related PANIC)")
        -				c.setStatus(fixturePanickedSt)
        -			}
        -		default:
        -			c.logPanic(1, value)
        -			c.setStatus(panickedSt)
        -		}
        -	}
        -	if c.mustFail {
        -		switch c.status() {
        -		case failedSt:
        -			c.setStatus(succeededSt)
        -		case succeededSt:
        -			c.setStatus(failedSt)
        -			c.logString("Error: Test succeeded, but was expected to fail")
        -			c.logString("Reason: " + c.reason)
        -		}
        -	}
        -
        -	runner.reportCallDone(c)
        -	c.done <- c
        -}
        -
        -// Runs a fixture call synchronously.  The fixture will still be run in a
        -// goroutine like all suite methods, but this method will not return
        -// while the fixture goroutine is not done, because the fixture must be
        -// run in a desired order.
        -func (runner *suiteRunner) runFixture(method *methodType, testName string, logb *logger) *C {
        -	if method != nil {
        -		c := runner.runFunc(method, fixtureKd, testName, logb, func(c *C) {
        -			c.ResetTimer()
        -			c.StartTimer()
        -			defer c.StopTimer()
        -			c.method.Call([]reflect.Value{reflect.ValueOf(c)})
        -		})
        -		return c
        -	}
        -	return nil
        -}
        -
        -// Run the fixture method with runFixture(), but panic with a fixturePanic{}
        -// in case the fixture method panics.  This makes it easier to track the
        -// fixture panic together with other call panics within forkTest().
        -func (runner *suiteRunner) runFixtureWithPanic(method *methodType, testName string, logb *logger, skipped *bool) *C {
        -	if skipped != nil && *skipped {
        -		return nil
        -	}
        -	c := runner.runFixture(method, testName, logb)
        -	if c != nil && c.status() != succeededSt {
        -		if skipped != nil {
        -			*skipped = c.status() == skippedSt
        -		}
        -		panic(&fixturePanic{c.status(), method})
        -	}
        -	return c
        -}
        -
        -type fixturePanic struct {
        -	status funcStatus
        -	method *methodType
        -}
        -
        -// Run the suite test method, together with the test-specific fixture,
        -// asynchronously.
        -func (runner *suiteRunner) forkTest(method *methodType) *C {
        -	testName := method.String()
        -	return runner.forkCall(method, testKd, testName, nil, func(c *C) {
        -		var skipped bool
        -		defer runner.runFixtureWithPanic(runner.tearDownTest, testName, nil, &skipped)
        -		defer c.StopTimer()
        -		benchN := 1
        -		for {
        -			runner.runFixtureWithPanic(runner.setUpTest, testName, c.logb, &skipped)
        -			mt := c.method.Type()
        -			if mt.NumIn() != 1 || mt.In(0) != reflect.TypeOf(c) {
        -				// Rather than a plain panic, provide a more helpful message when
        -				// the argument type is incorrect.
        -				c.setStatus(panickedSt)
        -				c.logArgPanic(c.method, "*check.C")
        -				return
        -			}
        -			if strings.HasPrefix(c.method.Info.Name, "Test") {
        -				c.ResetTimer()
        -				c.StartTimer()
        -				c.method.Call([]reflect.Value{reflect.ValueOf(c)})
        -				return
        -			}
        -			if !strings.HasPrefix(c.method.Info.Name, "Benchmark") {
        -				panic("unexpected method prefix: " + c.method.Info.Name)
        -			}
        -
        -			runtime.GC()
        -			c.N = benchN
        -			c.ResetTimer()
        -			c.StartTimer()
        -			c.method.Call([]reflect.Value{reflect.ValueOf(c)})
        -			c.StopTimer()
        -			if c.status() != succeededSt || c.duration >= c.benchTime || benchN >= 1e9 {
        -				return
        -			}
        -			perOpN := int(1e9)
        -			if c.nsPerOp() != 0 {
        -				perOpN = int(c.benchTime.Nanoseconds() / c.nsPerOp())
        -			}
        -
        -			// Logic taken from the stock testing package:
        -			// - Run more iterations than we think we'll need for a second (1.5x).
        -			// - Don't grow too fast in case we had timing errors previously.
        -			// - Be sure to run at least one more than last time.
        -			benchN = max(min(perOpN+perOpN/2, 100*benchN), benchN+1)
        -			benchN = roundUp(benchN)
        -
        -			skipped = true // Don't run the deferred one if this panics.
        -			runner.runFixtureWithPanic(runner.tearDownTest, testName, nil, nil)
        -			skipped = false
        -		}
        -	})
        -}
        -
        -// Same as forkTest(), but wait for the test to finish before returning.
        -func (runner *suiteRunner) runTest(method *methodType) *C {
        -	c := runner.forkTest(method)
        -	<-c.done
        -	return c
        -}
        -
        -// Helper to mark tests as skipped or missed.  A bit heavy for what
        -// it does, but it enables homogeneous handling of tracking, including
        -// nice verbose output.
        -func (runner *suiteRunner) skipTests(status funcStatus, methods []*methodType) {
        -	for _, method := range methods {
        -		runner.runFunc(method, testKd, "", nil, func(c *C) {
        -			c.setStatus(status)
        -		})
        -	}
        -}
        -
        -// Verify if the fixture arguments are *check.C.  In case of errors,
        -// log the error as a panic in the fixture method call, and return false.
        -func (runner *suiteRunner) checkFixtureArgs() bool {
        -	succeeded := true
        -	argType := reflect.TypeOf(&C{})
        -	for _, method := range []*methodType{runner.setUpSuite, runner.tearDownSuite, runner.setUpTest, runner.tearDownTest} {
        -		if method != nil {
        -			mt := method.Type()
        -			if mt.NumIn() != 1 || mt.In(0) != argType {
        -				succeeded = false
        -				runner.runFunc(method, fixtureKd, "", nil, func(c *C) {
        -					c.logArgPanic(method, "*check.C")
        -					c.setStatus(panickedSt)
        -				})
        -			}
        -		}
        -	}
        -	return succeeded
        -}
        -
        -func (runner *suiteRunner) reportCallStarted(c *C) {
        -	runner.output.WriteCallStarted("START", c)
        -}
        -
        -func (runner *suiteRunner) reportCallDone(c *C) {
        -	runner.tracker.callDone(c)
        -	switch c.status() {
        -	case succeededSt:
        -		if c.mustFail {
        -			runner.output.WriteCallSuccess("FAIL EXPECTED", c)
        -		} else {
        -			runner.output.WriteCallSuccess("PASS", c)
        -		}
        -	case skippedSt:
        -		runner.output.WriteCallSuccess("SKIP", c)
        -	case failedSt:
        -		runner.output.WriteCallProblem("FAIL", c)
        -	case panickedSt:
        -		runner.output.WriteCallProblem("PANIC", c)
        -	case fixturePanickedSt:
        -		// That's a testKd call reporting that its fixture
        -		// has panicked. The fixture call which caused the
        -		// panic itself was tracked above. We'll report to
        -		// aid debugging.
        -		runner.output.WriteCallProblem("PANIC", c)
        -	case missedSt:
        -		runner.output.WriteCallSuccess("MISS", c)
        -	}
        -}
        diff --git a/vendor/gopkg.in/check.v1/checkers.go b/vendor/gopkg.in/check.v1/checkers.go
        deleted file mode 100644
        index 032619792..000000000
        --- a/vendor/gopkg.in/check.v1/checkers.go
        +++ /dev/null
        @@ -1,528 +0,0 @@
        -package check
        -
        -import (
        -	"fmt"
        -	"reflect"
        -	"regexp"
        -	"strings"
        -
        -	"github.com/kr/pretty"
        -)
        -
        -// -----------------------------------------------------------------------
        -// CommentInterface and Commentf helper, to attach extra information to checks.
        -
        -type comment struct {
        -	format string
        -	args   []interface{}
        -}
        -
        -// Commentf returns an infomational value to use with Assert or Check calls.
        -// If the checker test fails, the provided arguments will be passed to
        -// fmt.Sprintf, and will be presented next to the logged failure.
        -//
        -// For example:
        -//
        -//     c.Assert(v, Equals, 42, Commentf("Iteration #%d failed.", i))
        -//
        -// Note that if the comment is constant, a better option is to
        -// simply use a normal comment right above or next to the line, as
        -// it will also get printed with any errors:
        -//
        -//     c.Assert(l, Equals, 8192) // Ensure buffer size is correct (bug #123)
        -//
        -func Commentf(format string, args ...interface{}) CommentInterface {
        -	return &comment{format, args}
        -}
        -
        -// CommentInterface must be implemented by types that attach extra
        -// information to failed checks. See the Commentf function for details.
        -type CommentInterface interface {
        -	CheckCommentString() string
        -}
        -
        -func (c *comment) CheckCommentString() string {
        -	return fmt.Sprintf(c.format, c.args...)
        -}
        -
        -// -----------------------------------------------------------------------
        -// The Checker interface.
        -
        -// The Checker interface must be provided by checkers used with
        -// the Assert and Check verification methods.
        -type Checker interface {
        -	Info() *CheckerInfo
        -	Check(params []interface{}, names []string) (result bool, error string)
        -}
        -
        -// See the Checker interface.
        -type CheckerInfo struct {
        -	Name   string
        -	Params []string
        -}
        -
        -func (info *CheckerInfo) Info() *CheckerInfo {
        -	return info
        -}
        -
        -// -----------------------------------------------------------------------
        -// Not checker logic inverter.
        -
        -// The Not checker inverts the logic of the provided checker.  The
        -// resulting checker will succeed where the original one failed, and
        -// vice-versa.
        -//
        -// For example:
        -//
        -//     c.Assert(a, Not(Equals), b)
        -//
        -func Not(checker Checker) Checker {
        -	return ¬Checker{checker}
        -}
        -
        -type notChecker struct {
        -	sub Checker
        -}
        -
        -func (checker *notChecker) Info() *CheckerInfo {
        -	info := *checker.sub.Info()
        -	info.Name = "Not(" + info.Name + ")"
        -	return &info
        -}
        -
        -func (checker *notChecker) Check(params []interface{}, names []string) (result bool, error string) {
        -	result, error = checker.sub.Check(params, names)
        -	result = !result
        -	if result {
        -		// clear error message if the new result is true
        -		error = ""
        -	}
        -	return
        -}
        -
        -// -----------------------------------------------------------------------
        -// IsNil checker.
        -
        -type isNilChecker struct {
        -	*CheckerInfo
        -}
        -
        -// The IsNil checker tests whether the obtained value is nil.
        -//
        -// For example:
        -//
        -//    c.Assert(err, IsNil)
        -//
        -var IsNil Checker = &isNilChecker{
        -	&CheckerInfo{Name: "IsNil", Params: []string{"value"}},
        -}
        -
        -func (checker *isNilChecker) Check(params []interface{}, names []string) (result bool, error string) {
        -	return isNil(params[0]), ""
        -}
        -
        -func isNil(obtained interface{}) (result bool) {
        -	if obtained == nil {
        -		result = true
        -	} else {
        -		switch v := reflect.ValueOf(obtained); v.Kind() {
        -		case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:
        -			return v.IsNil()
        -		}
        -	}
        -	return
        -}
        -
        -// -----------------------------------------------------------------------
        -// NotNil checker. Alias for Not(IsNil), since it's so common.
        -
        -type notNilChecker struct {
        -	*CheckerInfo
        -}
        -
        -// The NotNil checker verifies that the obtained value is not nil.
        -//
        -// For example:
        -//
        -//     c.Assert(iface, NotNil)
        -//
        -// This is an alias for Not(IsNil), made available since it's a
        -// fairly common check.
        -//
        -var NotNil Checker = ¬NilChecker{
        -	&CheckerInfo{Name: "NotNil", Params: []string{"value"}},
        -}
        -
        -func (checker *notNilChecker) Check(params []interface{}, names []string) (result bool, error string) {
        -	return !isNil(params[0]), ""
        -}
        -
        -// -----------------------------------------------------------------------
        -// Equals checker.
        -
        -func diffworthy(a interface{}) bool {
        -	if a == nil {
        -		return false
        -	}
        -
        -	t := reflect.TypeOf(a)
        -	switch t.Kind() {
        -	case reflect.Array, reflect.Map, reflect.Slice, reflect.Struct, reflect.String, reflect.Ptr:
        -		return true
        -	}
        -	return false
        -}
        -
        -// formatUnequal will dump the actual and expected values into a textual
        -// representation and return an error message containing a diff.
        -func formatUnequal(obtained interface{}, expected interface{}) string {
        -	// We do not do diffs for basic types because go-check already
        -	// shows them very cleanly.
        -	if !diffworthy(obtained) || !diffworthy(expected) {
        -		return ""
        -	}
        -
        -	// Handle strings, short strings are ignored (go-check formats
        -	// them very nicely already). We do multi-line strings by
        -	// generating two string slices and using kr.Diff to compare
        -	// those (kr.Diff does not do string diffs by itself).
        -	aStr, aOK := obtained.(string)
        -	bStr, bOK := expected.(string)
        -	if aOK && bOK {
        -		l1 := strings.Split(aStr, "\n")
        -		l2 := strings.Split(bStr, "\n")
        -		// the "2" here is a bit arbitrary
        -		if len(l1) > 2 && len(l2) > 2 {
        -			diff := pretty.Diff(l1, l2)
        -			return fmt.Sprintf(`String difference:
        -%s`, formatMultiLine(strings.Join(diff, "\n"), false))
        -		}
        -		// string too short
        -		return ""
        -	}
        -
        -	// generic diff
        -	diff := pretty.Diff(obtained, expected)
        -	if len(diff) == 0 {
        -		// No diff, this happens when e.g. just struct
        -		// pointers are different but the structs have
        -		// identical values.
        -		return ""
        -	}
        -
        -	return fmt.Sprintf(`Difference:
        -%s`, formatMultiLine(strings.Join(diff, "\n"), false))
        -}
        -
        -type equalsChecker struct {
        -	*CheckerInfo
        -}
        -
        -// The Equals checker verifies that the obtained value is equal to
        -// the expected value, according to usual Go semantics for ==.
        -//
        -// For example:
        -//
        -//     c.Assert(value, Equals, 42)
        -//
        -var Equals Checker = &equalsChecker{
        -	&CheckerInfo{Name: "Equals", Params: []string{"obtained", "expected"}},
        -}
        -
        -func (checker *equalsChecker) Check(params []interface{}, names []string) (result bool, error string) {
        -	defer func() {
        -		if v := recover(); v != nil {
        -			result = false
        -			error = fmt.Sprint(v)
        -		}
        -	}()
        -
        -	result = params[0] == params[1]
        -	if !result {
        -		error = formatUnequal(params[0], params[1])
        -	}
        -	return
        -}
        -
        -// -----------------------------------------------------------------------
        -// DeepEquals checker.
        -
        -type deepEqualsChecker struct {
        -	*CheckerInfo
        -}
        -
        -// The DeepEquals checker verifies that the obtained value is deep-equal to
        -// the expected value.  The check will work correctly even when facing
        -// slices, interfaces, and values of different types (which always fail
        -// the test).
        -//
        -// For example:
        -//
        -//     c.Assert(value, DeepEquals, 42)
        -//     c.Assert(array, DeepEquals, []string{"hi", "there"})
        -//
        -var DeepEquals Checker = &deepEqualsChecker{
        -	&CheckerInfo{Name: "DeepEquals", Params: []string{"obtained", "expected"}},
        -}
        -
        -func (checker *deepEqualsChecker) Check(params []interface{}, names []string) (result bool, error string) {
        -	result = reflect.DeepEqual(params[0], params[1])
        -	if !result {
        -		error = formatUnequal(params[0], params[1])
        -	}
        -	return
        -}
        -
        -// -----------------------------------------------------------------------
        -// HasLen checker.
        -
        -type hasLenChecker struct {
        -	*CheckerInfo
        -}
        -
        -// The HasLen checker verifies that the obtained value has the
        -// provided length. In many cases this is superior to using Equals
        -// in conjunction with the len function because in case the check
        -// fails the value itself will be printed, instead of its length,
        -// providing more details for figuring the problem.
        -//
        -// For example:
        -//
        -//     c.Assert(list, HasLen, 5)
        -//
        -var HasLen Checker = &hasLenChecker{
        -	&CheckerInfo{Name: "HasLen", Params: []string{"obtained", "n"}},
        -}
        -
        -func (checker *hasLenChecker) Check(params []interface{}, names []string) (result bool, error string) {
        -	n, ok := params[1].(int)
        -	if !ok {
        -		return false, "n must be an int"
        -	}
        -	value := reflect.ValueOf(params[0])
        -	switch value.Kind() {
        -	case reflect.Map, reflect.Array, reflect.Slice, reflect.Chan, reflect.String:
        -	default:
        -		return false, "obtained value type has no length"
        -	}
        -	return value.Len() == n, ""
        -}
        -
        -// -----------------------------------------------------------------------
        -// ErrorMatches checker.
        -
        -type errorMatchesChecker struct {
        -	*CheckerInfo
        -}
        -
        -// The ErrorMatches checker verifies that the error value
        -// is non nil and matches the regular expression provided.
        -//
        -// For example:
        -//
        -//     c.Assert(err, ErrorMatches, "perm.*denied")
        -//
        -var ErrorMatches Checker = errorMatchesChecker{
        -	&CheckerInfo{Name: "ErrorMatches", Params: []string{"value", "regex"}},
        -}
        -
        -func (checker errorMatchesChecker) Check(params []interface{}, names []string) (result bool, errStr string) {
        -	if params[0] == nil {
        -		return false, "Error value is nil"
        -	}
        -	err, ok := params[0].(error)
        -	if !ok {
        -		return false, "Value is not an error"
        -	}
        -	params[0] = err.Error()
        -	names[0] = "error"
        -	return matches(params[0], params[1])
        -}
        -
        -// -----------------------------------------------------------------------
        -// Matches checker.
        -
        -type matchesChecker struct {
        -	*CheckerInfo
        -}
        -
        -// The Matches checker verifies that the string provided as the obtained
        -// value (or the string resulting from obtained.String()) matches the
        -// regular expression provided.
        -//
        -// For example:
        -//
        -//     c.Assert(err, Matches, "perm.*denied")
        -//
        -var Matches Checker = &matchesChecker{
        -	&CheckerInfo{Name: "Matches", Params: []string{"value", "regex"}},
        -}
        -
        -func (checker *matchesChecker) Check(params []interface{}, names []string) (result bool, error string) {
        -	return matches(params[0], params[1])
        -}
        -
        -func matches(value, regex interface{}) (result bool, error string) {
        -	reStr, ok := regex.(string)
        -	if !ok {
        -		return false, "Regex must be a string"
        -	}
        -	valueStr, valueIsStr := value.(string)
        -	if !valueIsStr {
        -		if valueWithStr, valueHasStr := value.(fmt.Stringer); valueHasStr {
        -			valueStr, valueIsStr = valueWithStr.String(), true
        -		}
        -	}
        -	if valueIsStr {
        -		matches, err := regexp.MatchString("^"+reStr+"$", valueStr)
        -		if err != nil {
        -			return false, "Can't compile regex: " + err.Error()
        -		}
        -		return matches, ""
        -	}
        -	return false, "Obtained value is not a string and has no .String()"
        -}
        -
        -// -----------------------------------------------------------------------
        -// Panics checker.
        -
        -type panicsChecker struct {
        -	*CheckerInfo
        -}
        -
        -// The Panics checker verifies that calling the provided zero-argument
        -// function will cause a panic which is deep-equal to the provided value.
        -//
        -// For example:
        -//
        -//     c.Assert(func() { f(1, 2) }, Panics, &SomeErrorType{"BOOM"}).
        -//
        -//
        -var Panics Checker = &panicsChecker{
        -	&CheckerInfo{Name: "Panics", Params: []string{"function", "expected"}},
        -}
        -
        -func (checker *panicsChecker) Check(params []interface{}, names []string) (result bool, error string) {
        -	f := reflect.ValueOf(params[0])
        -	if f.Kind() != reflect.Func || f.Type().NumIn() != 0 {
        -		return false, "Function must take zero arguments"
        -	}
        -	defer func() {
        -		// If the function has not panicked, then don't do the check.
        -		if error != "" {
        -			return
        -		}
        -		params[0] = recover()
        -		names[0] = "panic"
        -		result = reflect.DeepEqual(params[0], params[1])
        -	}()
        -	f.Call(nil)
        -	return false, "Function has not panicked"
        -}
        -
        -type panicMatchesChecker struct {
        -	*CheckerInfo
        -}
        -
        -// The PanicMatches checker verifies that calling the provided zero-argument
        -// function will cause a panic with an error value matching
        -// the regular expression provided.
        -//
        -// For example:
        -//
        -//     c.Assert(func() { f(1, 2) }, PanicMatches, `open.*: no such file or directory`).
        -//
        -//
        -var PanicMatches Checker = &panicMatchesChecker{
        -	&CheckerInfo{Name: "PanicMatches", Params: []string{"function", "expected"}},
        -}
        -
        -func (checker *panicMatchesChecker) Check(params []interface{}, names []string) (result bool, errmsg string) {
        -	f := reflect.ValueOf(params[0])
        -	if f.Kind() != reflect.Func || f.Type().NumIn() != 0 {
        -		return false, "Function must take zero arguments"
        -	}
        -	defer func() {
        -		// If the function has not panicked, then don't do the check.
        -		if errmsg != "" {
        -			return
        -		}
        -		obtained := recover()
        -		names[0] = "panic"
        -		if e, ok := obtained.(error); ok {
        -			params[0] = e.Error()
        -		} else if _, ok := obtained.(string); ok {
        -			params[0] = obtained
        -		} else {
        -			errmsg = "Panic value is not a string or an error"
        -			return
        -		}
        -		result, errmsg = matches(params[0], params[1])
        -	}()
        -	f.Call(nil)
        -	return false, "Function has not panicked"
        -}
        -
        -// -----------------------------------------------------------------------
        -// FitsTypeOf checker.
        -
        -type fitsTypeChecker struct {
        -	*CheckerInfo
        -}
        -
        -// The FitsTypeOf checker verifies that the obtained value is
        -// assignable to a variable with the same type as the provided
        -// sample value.
        -//
        -// For example:
        -//
        -//     c.Assert(value, FitsTypeOf, int64(0))
        -//     c.Assert(value, FitsTypeOf, os.Error(nil))
        -//
        -var FitsTypeOf Checker = &fitsTypeChecker{
        -	&CheckerInfo{Name: "FitsTypeOf", Params: []string{"obtained", "sample"}},
        -}
        -
        -func (checker *fitsTypeChecker) Check(params []interface{}, names []string) (result bool, error string) {
        -	obtained := reflect.ValueOf(params[0])
        -	sample := reflect.ValueOf(params[1])
        -	if !obtained.IsValid() {
        -		return false, ""
        -	}
        -	if !sample.IsValid() {
        -		return false, "Invalid sample value"
        -	}
        -	return obtained.Type().AssignableTo(sample.Type()), ""
        -}
        -
        -// -----------------------------------------------------------------------
        -// Implements checker.
        -
        -type implementsChecker struct {
        -	*CheckerInfo
        -}
        -
        -// The Implements checker verifies that the obtained value
        -// implements the interface specified via a pointer to an interface
        -// variable.
        -//
        -// For example:
        -//
        -//     var e os.Error
        -//     c.Assert(err, Implements, &e)
        -//
        -var Implements Checker = &implementsChecker{
        -	&CheckerInfo{Name: "Implements", Params: []string{"obtained", "ifaceptr"}},
        -}
        -
        -func (checker *implementsChecker) Check(params []interface{}, names []string) (result bool, error string) {
        -	obtained := reflect.ValueOf(params[0])
        -	ifaceptr := reflect.ValueOf(params[1])
        -	if !obtained.IsValid() {
        -		return false, ""
        -	}
        -	if !ifaceptr.IsValid() || ifaceptr.Kind() != reflect.Ptr || ifaceptr.Elem().Kind() != reflect.Interface {
        -		return false, "ifaceptr should be a pointer to an interface variable"
        -	}
        -	return obtained.Type().Implements(ifaceptr.Elem().Type()), ""
        -}
        diff --git a/vendor/gopkg.in/check.v1/helpers.go b/vendor/gopkg.in/check.v1/helpers.go
        deleted file mode 100644
        index 58a733b50..000000000
        --- a/vendor/gopkg.in/check.v1/helpers.go
        +++ /dev/null
        @@ -1,231 +0,0 @@
        -package check
        -
        -import (
        -	"fmt"
        -	"strings"
        -	"time"
        -)
        -
        -// TestName returns the current test name in the form "SuiteName.TestName"
        -func (c *C) TestName() string {
        -	return c.testName
        -}
        -
        -// -----------------------------------------------------------------------
        -// Basic succeeding/failing logic.
        -
        -// Failed returns whether the currently running test has already failed.
        -func (c *C) Failed() bool {
        -	return c.status() == failedSt
        -}
        -
        -// Fail marks the currently running test as failed.
        -//
        -// Something ought to have been previously logged so the developer can tell
        -// what went wrong. The higher level helper functions will fail the test
        -// and do the logging properly.
        -func (c *C) Fail() {
        -	c.setStatus(failedSt)
        -}
        -
        -// FailNow marks the currently running test as failed and stops running it.
        -// Something ought to have been previously logged so the developer can tell
        -// what went wrong. The higher level helper functions will fail the test
        -// and do the logging properly.
        -func (c *C) FailNow() {
        -	c.Fail()
        -	c.stopNow()
        -}
        -
        -// Succeed marks the currently running test as succeeded, undoing any
        -// previous failures.
        -func (c *C) Succeed() {
        -	c.setStatus(succeededSt)
        -}
        -
        -// SucceedNow marks the currently running test as succeeded, undoing any
        -// previous failures, and stops running the test.
        -func (c *C) SucceedNow() {
        -	c.Succeed()
        -	c.stopNow()
        -}
        -
        -// ExpectFailure informs that the running test is knowingly broken for
        -// the provided reason. If the test does not fail, an error will be reported
        -// to raise attention to this fact. This method is useful to temporarily
        -// disable tests which cover well known problems until a better time to
        -// fix the problem is found, without forgetting about the fact that a
        -// failure still exists.
        -func (c *C) ExpectFailure(reason string) {
        -	if reason == "" {
        -		panic("Missing reason why the test is expected to fail")
        -	}
        -	c.mustFail = true
        -	c.reason = reason
        -}
        -
        -// Skip skips the running test for the provided reason. If run from within
        -// SetUpTest, the individual test being set up will be skipped, and if run
        -// from within SetUpSuite, the whole suite is skipped.
        -func (c *C) Skip(reason string) {
        -	if reason == "" {
        -		panic("Missing reason why the test is being skipped")
        -	}
        -	c.reason = reason
        -	c.setStatus(skippedSt)
        -	c.stopNow()
        -}
        -
        -// -----------------------------------------------------------------------
        -// Basic logging.
        -
        -// GetTestLog returns the current test error output.
        -func (c *C) GetTestLog() string {
        -	return c.logb.String()
        -}
        -
        -// Log logs some information into the test error output.
        -// The provided arguments are assembled together into a string with fmt.Sprint.
        -func (c *C) Log(args ...interface{}) {
        -	c.log(args...)
        -}
        -
        -// Log logs some information into the test error output.
        -// The provided arguments are assembled together into a string with fmt.Sprintf.
        -func (c *C) Logf(format string, args ...interface{}) {
        -	c.logf(format, args...)
        -}
        -
        -// Output enables *C to be used as a logger in functions that require only
        -// the minimum interface of *log.Logger.
        -func (c *C) Output(calldepth int, s string) error {
        -	d := time.Now().Sub(c.startTime)
        -	msec := d / time.Millisecond
        -	sec := d / time.Second
        -	min := d / time.Minute
        -
        -	c.Logf("[LOG] %d:%02d.%03d %s", min, sec%60, msec%1000, s)
        -	return nil
        -}
        -
        -// Error logs an error into the test error output and marks the test as failed.
        -// The provided arguments are assembled together into a string with fmt.Sprint.
        -func (c *C) Error(args ...interface{}) {
        -	c.logCaller(1)
        -	c.logString(fmt.Sprint("Error: ", fmt.Sprint(args...)))
        -	c.logNewLine()
        -	c.Fail()
        -}
        -
        -// Errorf logs an error into the test error output and marks the test as failed.
        -// The provided arguments are assembled together into a string with fmt.Sprintf.
        -func (c *C) Errorf(format string, args ...interface{}) {
        -	c.logCaller(1)
        -	c.logString(fmt.Sprintf("Error: "+format, args...))
        -	c.logNewLine()
        -	c.Fail()
        -}
        -
        -// Fatal logs an error into the test error output, marks the test as failed, and
        -// stops the test execution. The provided arguments are assembled together into
        -// a string with fmt.Sprint.
        -func (c *C) Fatal(args ...interface{}) {
        -	c.logCaller(1)
        -	c.logString(fmt.Sprint("Error: ", fmt.Sprint(args...)))
        -	c.logNewLine()
        -	c.FailNow()
        -}
        -
        -// Fatlaf logs an error into the test error output, marks the test as failed, and
        -// stops the test execution. The provided arguments are assembled together into
        -// a string with fmt.Sprintf.
        -func (c *C) Fatalf(format string, args ...interface{}) {
        -	c.logCaller(1)
        -	c.logString(fmt.Sprint("Error: ", fmt.Sprintf(format, args...)))
        -	c.logNewLine()
        -	c.FailNow()
        -}
        -
        -// -----------------------------------------------------------------------
        -// Generic checks and assertions based on checkers.
        -
        -// Check verifies if the first value matches the expected value according
        -// to the provided checker. If they do not match, an error is logged, the
        -// test is marked as failed, and the test execution continues.
        -//
        -// Some checkers may not need the expected argument (e.g. IsNil).
        -//
        -// Extra arguments provided to the function are logged next to the reported
        -// problem when the matching fails.
        -func (c *C) Check(obtained interface{}, checker Checker, args ...interface{}) bool {
        -	return c.internalCheck("Check", obtained, checker, args...)
        -}
        -
        -// Assert ensures that the first value matches the expected value according
        -// to the provided checker. If they do not match, an error is logged, the
        -// test is marked as failed, and the test execution stops.
        -//
        -// Some checkers may not need the expected argument (e.g. IsNil).
        -//
        -// Extra arguments provided to the function are logged next to the reported
        -// problem when the matching fails.
        -func (c *C) Assert(obtained interface{}, checker Checker, args ...interface{}) {
        -	if !c.internalCheck("Assert", obtained, checker, args...) {
        -		c.stopNow()
        -	}
        -}
        -
        -func (c *C) internalCheck(funcName string, obtained interface{}, checker Checker, args ...interface{}) bool {
        -	if checker == nil {
        -		c.logCaller(2)
        -		c.logString(fmt.Sprintf("%s(obtained, nil!?, ...):", funcName))
        -		c.logString("Oops.. you've provided a nil checker!")
        -		c.logNewLine()
        -		c.Fail()
        -		return false
        -	}
        -
        -	// If the last argument is a bug info, extract it out.
        -	var comment CommentInterface
        -	if len(args) > 0 {
        -		if c, ok := args[len(args)-1].(CommentInterface); ok {
        -			comment = c
        -			args = args[:len(args)-1]
        -		}
        -	}
        -
        -	params := append([]interface{}{obtained}, args...)
        -	info := checker.Info()
        -
        -	if len(params) != len(info.Params) {
        -		names := append([]string{info.Params[0], info.Name}, info.Params[1:]...)
        -		c.logCaller(2)
        -		c.logString(fmt.Sprintf("%s(%s):", funcName, strings.Join(names, ", ")))
        -		c.logString(fmt.Sprintf("Wrong number of parameters for %s: want %d, got %d", info.Name, len(names), len(params)+1))
        -		c.logNewLine()
        -		c.Fail()
        -		return false
        -	}
        -
        -	// Copy since it may be mutated by Check.
        -	names := append([]string{}, info.Params...)
        -
        -	// Do the actual check.
        -	result, error := checker.Check(params, names)
        -	if !result || error != "" {
        -		c.logCaller(2)
        -		for i := 0; i != len(params); i++ {
        -			c.logValue(names[i], params[i])
        -		}
        -		if comment != nil {
        -			c.logString(comment.CheckCommentString())
        -		}
        -		if error != "" {
        -			c.logString(error)
        -		}
        -		c.logNewLine()
        -		c.Fail()
        -		return false
        -	}
        -	return true
        -}
        diff --git a/vendor/gopkg.in/check.v1/printer.go b/vendor/gopkg.in/check.v1/printer.go
        deleted file mode 100644
        index e0f7557b5..000000000
        --- a/vendor/gopkg.in/check.v1/printer.go
        +++ /dev/null
        @@ -1,168 +0,0 @@
        -package check
        -
        -import (
        -	"bytes"
        -	"go/ast"
        -	"go/parser"
        -	"go/printer"
        -	"go/token"
        -	"os"
        -)
        -
        -func indent(s, with string) (r string) {
        -	eol := true
        -	for i := 0; i != len(s); i++ {
        -		c := s[i]
        -		switch {
        -		case eol && c == '\n' || c == '\r':
        -		case c == '\n' || c == '\r':
        -			eol = true
        -		case eol:
        -			eol = false
        -			s = s[:i] + with + s[i:]
        -			i += len(with)
        -		}
        -	}
        -	return s
        -}
        -
        -func printLine(filename string, line int) (string, error) {
        -	fset := token.NewFileSet()
        -	file, err := os.Open(filename)
        -	if err != nil {
        -		return "", err
        -	}
        -	fnode, err := parser.ParseFile(fset, filename, file, parser.ParseComments)
        -	if err != nil {
        -		return "", err
        -	}
        -	config := &printer.Config{Mode: printer.UseSpaces, Tabwidth: 4}
        -	lp := &linePrinter{fset: fset, fnode: fnode, line: line, config: config}
        -	ast.Walk(lp, fnode)
        -	result := lp.output.Bytes()
        -	// Comments leave \n at the end.
        -	n := len(result)
        -	for n > 0 && result[n-1] == '\n' {
        -		n--
        -	}
        -	return string(result[:n]), nil
        -}
        -
        -type linePrinter struct {
        -	config *printer.Config
        -	fset   *token.FileSet
        -	fnode  *ast.File
        -	line   int
        -	output bytes.Buffer
        -	stmt   ast.Stmt
        -}
        -
        -func (lp *linePrinter) emit() bool {
        -	if lp.stmt != nil {
        -		lp.trim(lp.stmt)
        -		lp.printWithComments(lp.stmt)
        -		lp.stmt = nil
        -		return true
        -	}
        -	return false
        -}
        -
        -func (lp *linePrinter) printWithComments(n ast.Node) {
        -	nfirst := lp.fset.Position(n.Pos()).Line
        -	nlast := lp.fset.Position(n.End()).Line
        -	for _, g := range lp.fnode.Comments {
        -		cfirst := lp.fset.Position(g.Pos()).Line
        -		clast := lp.fset.Position(g.End()).Line
        -		if clast == nfirst-1 && lp.fset.Position(n.Pos()).Column == lp.fset.Position(g.Pos()).Column {
        -			for _, c := range g.List {
        -				lp.output.WriteString(c.Text)
        -				lp.output.WriteByte('\n')
        -			}
        -		}
        -		if cfirst >= nfirst && cfirst <= nlast && n.End() <= g.List[0].Slash {
        -			// The printer will not include the comment if it starts past
        -			// the node itself. Trick it into printing by overlapping the
        -			// slash with the end of the statement.
        -			g.List[0].Slash = n.End() - 1
        -		}
        -	}
        -	node := &printer.CommentedNode{n, lp.fnode.Comments}
        -	lp.config.Fprint(&lp.output, lp.fset, node)
        -}
        -
        -func (lp *linePrinter) Visit(n ast.Node) (w ast.Visitor) {
        -	if n == nil {
        -		if lp.output.Len() == 0 {
        -			lp.emit()
        -		}
        -		return nil
        -	}
        -	first := lp.fset.Position(n.Pos()).Line
        -	last := lp.fset.Position(n.End()).Line
        -	if first <= lp.line && last >= lp.line {
        -		// Print the innermost statement containing the line.
        -		if stmt, ok := n.(ast.Stmt); ok {
        -			if _, ok := n.(*ast.BlockStmt); !ok {
        -				lp.stmt = stmt
        -			}
        -		}
        -		if first == lp.line && lp.emit() {
        -			return nil
        -		}
        -		return lp
        -	}
        -	return nil
        -}
        -
        -func (lp *linePrinter) trim(n ast.Node) bool {
        -	stmt, ok := n.(ast.Stmt)
        -	if !ok {
        -		return true
        -	}
        -	line := lp.fset.Position(n.Pos()).Line
        -	if line != lp.line {
        -		return false
        -	}
        -	switch stmt := stmt.(type) {
        -	case *ast.IfStmt:
        -		stmt.Body = lp.trimBlock(stmt.Body)
        -	case *ast.SwitchStmt:
        -		stmt.Body = lp.trimBlock(stmt.Body)
        -	case *ast.TypeSwitchStmt:
        -		stmt.Body = lp.trimBlock(stmt.Body)
        -	case *ast.CaseClause:
        -		stmt.Body = lp.trimList(stmt.Body)
        -	case *ast.CommClause:
        -		stmt.Body = lp.trimList(stmt.Body)
        -	case *ast.BlockStmt:
        -		stmt.List = lp.trimList(stmt.List)
        -	}
        -	return true
        -}
        -
        -func (lp *linePrinter) trimBlock(stmt *ast.BlockStmt) *ast.BlockStmt {
        -	if !lp.trim(stmt) {
        -		return lp.emptyBlock(stmt)
        -	}
        -	stmt.Rbrace = stmt.Lbrace
        -	return stmt
        -}
        -
        -func (lp *linePrinter) trimList(stmts []ast.Stmt) []ast.Stmt {
        -	for i := 0; i != len(stmts); i++ {
        -		if !lp.trim(stmts[i]) {
        -			stmts[i] = lp.emptyStmt(stmts[i])
        -			break
        -		}
        -	}
        -	return stmts
        -}
        -
        -func (lp *linePrinter) emptyStmt(n ast.Node) *ast.ExprStmt {
        -	return &ast.ExprStmt{&ast.Ellipsis{n.Pos(), nil}}
        -}
        -
        -func (lp *linePrinter) emptyBlock(n ast.Node) *ast.BlockStmt {
        -	p := n.Pos()
        -	return &ast.BlockStmt{p, []ast.Stmt{lp.emptyStmt(n)}, p}
        -}
        diff --git a/vendor/gopkg.in/check.v1/reporter.go b/vendor/gopkg.in/check.v1/reporter.go
        deleted file mode 100644
        index fb04f76f6..000000000
        --- a/vendor/gopkg.in/check.v1/reporter.go
        +++ /dev/null
        @@ -1,88 +0,0 @@
        -package check
        -
        -import (
        -	"fmt"
        -	"io"
        -	"sync"
        -)
        -
        -// -----------------------------------------------------------------------
        -// Output writer manages atomic output writing according to settings.
        -
        -type outputWriter struct {
        -	m                    sync.Mutex
        -	writer               io.Writer
        -	wroteCallProblemLast bool
        -	Stream               bool
        -	Verbose              bool
        -}
        -
        -func newOutputWriter(writer io.Writer, stream, verbose bool) *outputWriter {
        -	return &outputWriter{writer: writer, Stream: stream, Verbose: verbose}
        -}
        -
        -func (ow *outputWriter) Write(content []byte) (n int, err error) {
        -	ow.m.Lock()
        -	n, err = ow.writer.Write(content)
        -	ow.m.Unlock()
        -	return
        -}
        -
        -func (ow *outputWriter) WriteCallStarted(label string, c *C) {
        -	if ow.Stream {
        -		header := renderCallHeader(label, c, "", "\n")
        -		ow.m.Lock()
        -		ow.writer.Write([]byte(header))
        -		ow.m.Unlock()
        -	}
        -}
        -
        -func (ow *outputWriter) WriteCallProblem(label string, c *C) {
        -	var prefix string
        -	if !ow.Stream {
        -		prefix = "\n-----------------------------------" +
        -			"-----------------------------------\n"
        -	}
        -	header := renderCallHeader(label, c, prefix, "\n\n")
        -	ow.m.Lock()
        -	ow.wroteCallProblemLast = true
        -	ow.writer.Write([]byte(header))
        -	if !ow.Stream {
        -		c.logb.WriteTo(ow.writer)
        -	}
        -	ow.m.Unlock()
        -}
        -
        -func (ow *outputWriter) WriteCallSuccess(label string, c *C) {
        -	if ow.Stream || (ow.Verbose && c.kind == testKd) {
        -		// TODO Use a buffer here.
        -		var suffix string
        -		if c.reason != "" {
        -			suffix = " (" + c.reason + ")"
        -		}
        -		if c.status() == succeededSt {
        -			suffix += "\t" + c.timerString()
        -		}
        -		suffix += "\n"
        -		if ow.Stream {
        -			suffix += "\n"
        -		}
        -		header := renderCallHeader(label, c, "", suffix)
        -		ow.m.Lock()
        -		// Resist temptation of using line as prefix above due to race.
        -		if !ow.Stream && ow.wroteCallProblemLast {
        -			header = "\n-----------------------------------" +
        -				"-----------------------------------\n" +
        -				header
        -		}
        -		ow.wroteCallProblemLast = false
        -		ow.writer.Write([]byte(header))
        -		ow.m.Unlock()
        -	}
        -}
        -
        -func renderCallHeader(label string, c *C, prefix, suffix string) string {
        -	pc := c.method.PC()
        -	return fmt.Sprintf("%s%s: %s: %s%s", prefix, label, niceFuncPath(pc),
        -		niceFuncName(pc), suffix)
        -}
        diff --git a/vendor/gopkg.in/check.v1/run.go b/vendor/gopkg.in/check.v1/run.go
        deleted file mode 100644
        index da8fd7987..000000000
        --- a/vendor/gopkg.in/check.v1/run.go
        +++ /dev/null
        @@ -1,175 +0,0 @@
        -package check
        -
        -import (
        -	"bufio"
        -	"flag"
        -	"fmt"
        -	"os"
        -	"testing"
        -	"time"
        -)
        -
        -// -----------------------------------------------------------------------
        -// Test suite registry.
        -
        -var allSuites []interface{}
        -
        -// Suite registers the given value as a test suite to be run. Any methods
        -// starting with the Test prefix in the given value will be considered as
        -// a test method.
        -func Suite(suite interface{}) interface{} {
        -	allSuites = append(allSuites, suite)
        -	return suite
        -}
        -
        -// -----------------------------------------------------------------------
        -// Public running interface.
        -
        -var (
        -	oldFilterFlag  = flag.String("gocheck.f", "", "Regular expression selecting which tests and/or suites to run")
        -	oldVerboseFlag = flag.Bool("gocheck.v", false, "Verbose mode")
        -	oldStreamFlag  = flag.Bool("gocheck.vv", false, "Super verbose mode (disables output caching)")
        -	oldBenchFlag   = flag.Bool("gocheck.b", false, "Run benchmarks")
        -	oldBenchTime   = flag.Duration("gocheck.btime", 1*time.Second, "approximate run time for each benchmark")
        -	oldListFlag    = flag.Bool("gocheck.list", false, "List the names of all tests that will be run")
        -	oldWorkFlag    = flag.Bool("gocheck.work", false, "Display and do not remove the test working directory")
        -
        -	newFilterFlag  = flag.String("check.f", "", "Regular expression selecting which tests and/or suites to run")
        -	newVerboseFlag = flag.Bool("check.v", false, "Verbose mode")
        -	newStreamFlag  = flag.Bool("check.vv", false, "Super verbose mode (disables output caching)")
        -	newBenchFlag   = flag.Bool("check.b", false, "Run benchmarks")
        -	newBenchTime   = flag.Duration("check.btime", 1*time.Second, "approximate run time for each benchmark")
        -	newBenchMem    = flag.Bool("check.bmem", false, "Report memory benchmarks")
        -	newListFlag    = flag.Bool("check.list", false, "List the names of all tests that will be run")
        -	newWorkFlag    = flag.Bool("check.work", false, "Display and do not remove the test working directory")
        -)
        -
        -// TestingT runs all test suites registered with the Suite function,
        -// printing results to stdout, and reporting any failures back to
        -// the "testing" package.
        -func TestingT(testingT *testing.T) {
        -	benchTime := *newBenchTime
        -	if benchTime == 1*time.Second {
        -		benchTime = *oldBenchTime
        -	}
        -	conf := &RunConf{
        -		Filter:        *oldFilterFlag + *newFilterFlag,
        -		Verbose:       *oldVerboseFlag || *newVerboseFlag,
        -		Stream:        *oldStreamFlag || *newStreamFlag,
        -		Benchmark:     *oldBenchFlag || *newBenchFlag,
        -		BenchmarkTime: benchTime,
        -		BenchmarkMem:  *newBenchMem,
        -		KeepWorkDir:   *oldWorkFlag || *newWorkFlag,
        -	}
        -	if *oldListFlag || *newListFlag {
        -		w := bufio.NewWriter(os.Stdout)
        -		for _, name := range ListAll(conf) {
        -			fmt.Fprintln(w, name)
        -		}
        -		w.Flush()
        -		return
        -	}
        -	result := RunAll(conf)
        -	println(result.String())
        -	if !result.Passed() {
        -		testingT.Fail()
        -	}
        -}
        -
        -// RunAll runs all test suites registered with the Suite function, using the
        -// provided run configuration.
        -func RunAll(runConf *RunConf) *Result {
        -	result := Result{}
        -	for _, suite := range allSuites {
        -		result.Add(Run(suite, runConf))
        -	}
        -	return &result
        -}
        -
        -// Run runs the provided test suite using the provided run configuration.
        -func Run(suite interface{}, runConf *RunConf) *Result {
        -	runner := newSuiteRunner(suite, runConf)
        -	return runner.run()
        -}
        -
        -// ListAll returns the names of all the test functions registered with the
        -// Suite function that will be run with the provided run configuration.
        -func ListAll(runConf *RunConf) []string {
        -	var names []string
        -	for _, suite := range allSuites {
        -		names = append(names, List(suite, runConf)...)
        -	}
        -	return names
        -}
        -
        -// List returns the names of the test functions in the given
        -// suite that will be run with the provided run configuration.
        -func List(suite interface{}, runConf *RunConf) []string {
        -	var names []string
        -	runner := newSuiteRunner(suite, runConf)
        -	for _, t := range runner.tests {
        -		names = append(names, t.String())
        -	}
        -	return names
        -}
        -
        -// -----------------------------------------------------------------------
        -// Result methods.
        -
        -func (r *Result) Add(other *Result) {
        -	r.Succeeded += other.Succeeded
        -	r.Skipped += other.Skipped
        -	r.Failed += other.Failed
        -	r.Panicked += other.Panicked
        -	r.FixturePanicked += other.FixturePanicked
        -	r.ExpectedFailures += other.ExpectedFailures
        -	r.Missed += other.Missed
        -	if r.WorkDir != "" && other.WorkDir != "" {
        -		r.WorkDir += ":" + other.WorkDir
        -	} else if other.WorkDir != "" {
        -		r.WorkDir = other.WorkDir
        -	}
        -}
        -
        -func (r *Result) Passed() bool {
        -	return (r.Failed == 0 && r.Panicked == 0 &&
        -		r.FixturePanicked == 0 && r.Missed == 0 &&
        -		r.RunError == nil)
        -}
        -
        -func (r *Result) String() string {
        -	if r.RunError != nil {
        -		return "ERROR: " + r.RunError.Error()
        -	}
        -
        -	var value string
        -	if r.Failed == 0 && r.Panicked == 0 && r.FixturePanicked == 0 &&
        -		r.Missed == 0 {
        -		value = "OK: "
        -	} else {
        -		value = "OOPS: "
        -	}
        -	value += fmt.Sprintf("%d passed", r.Succeeded)
        -	if r.Skipped != 0 {
        -		value += fmt.Sprintf(", %d skipped", r.Skipped)
        -	}
        -	if r.ExpectedFailures != 0 {
        -		value += fmt.Sprintf(", %d expected failures", r.ExpectedFailures)
        -	}
        -	if r.Failed != 0 {
        -		value += fmt.Sprintf(", %d FAILED", r.Failed)
        -	}
        -	if r.Panicked != 0 {
        -		value += fmt.Sprintf(", %d PANICKED", r.Panicked)
        -	}
        -	if r.FixturePanicked != 0 {
        -		value += fmt.Sprintf(", %d FIXTURE-PANICKED", r.FixturePanicked)
        -	}
        -	if r.Missed != 0 {
        -		value += fmt.Sprintf(", %d MISSED", r.Missed)
        -	}
        -	if r.WorkDir != "" {
        -		value += "\nWORK=" + r.WorkDir
        -	}
        -	return value
        -}
        diff --git a/vendor/gopkg.in/fsnotify.v1/.editorconfig b/vendor/gopkg.in/fsnotify.v1/.editorconfig
        deleted file mode 100644
        index ba49e3c23..000000000
        --- a/vendor/gopkg.in/fsnotify.v1/.editorconfig
        +++ /dev/null
        @@ -1,5 +0,0 @@
        -root = true
        -
        -[*]
        -indent_style = tab
        -indent_size = 4
        diff --git a/vendor/gopkg.in/fsnotify.v1/.gitignore b/vendor/gopkg.in/fsnotify.v1/.gitignore
        deleted file mode 100644
        index 4cd0cbaf4..000000000
        --- a/vendor/gopkg.in/fsnotify.v1/.gitignore
        +++ /dev/null
        @@ -1,6 +0,0 @@
        -# Setup a Global .gitignore for OS and editor generated files:
        -# https://help.github.com/articles/ignoring-files
        -# git config --global core.excludesfile ~/.gitignore_global
        -
        -.vagrant
        -*.sublime-project
        diff --git a/vendor/gopkg.in/fsnotify.v1/.travis.yml b/vendor/gopkg.in/fsnotify.v1/.travis.yml
        deleted file mode 100644
        index 981d1bb81..000000000
        --- a/vendor/gopkg.in/fsnotify.v1/.travis.yml
        +++ /dev/null
        @@ -1,30 +0,0 @@
        -sudo: false
        -language: go
        -
        -go:
        -  - 1.8.x
        -  - 1.9.x
        -  - tip
        -
        -matrix:
        -  allow_failures:
        -    - go: tip
        -  fast_finish: true
        -
        -before_script:
        -  - go get -u github.com/golang/lint/golint
        -
        -script:
        -  - go test -v --race ./...
        -
        -after_script:
        -  - test -z "$(gofmt -s -l -w . | tee /dev/stderr)"
        -  - test -z "$(golint ./...     | tee /dev/stderr)"
        -  - go vet ./...
        -
        -os:
        -  - linux
        -  - osx
        -
        -notifications:
        -  email: false
        diff --git a/vendor/gopkg.in/fsnotify.v1/AUTHORS b/vendor/gopkg.in/fsnotify.v1/AUTHORS
        deleted file mode 100644
        index 5ab5d41c5..000000000
        --- a/vendor/gopkg.in/fsnotify.v1/AUTHORS
        +++ /dev/null
        @@ -1,52 +0,0 @@
        -# Names should be added to this file as
        -#	Name or Organization 
        -# The email address is not required for organizations.
        -
        -# You can update this list using the following command:
        -#
        -#   $ git shortlog -se | awk '{print $2 " " $3 " " $4}'
        -
        -# Please keep the list sorted.
        -
        -Aaron L 
        -Adrien Bustany 
        -Amit Krishnan 
        -Anmol Sethi 
        -Bjørn Erik Pedersen 
        -Bruno Bigras 
        -Caleb Spare 
        -Case Nelson 
        -Chris Howey  
        -Christoffer Buchholz 
        -Daniel Wagner-Hall 
        -Dave Cheney 
        -Evan Phoenix 
        -Francisco Souza 
        -Hari haran 
        -John C Barstow
        -Kelvin Fo 
        -Ken-ichirou MATSUZAWA 
        -Matt Layher 
        -Nathan Youngman 
        -Nickolai Zeldovich 
        -Patrick 
        -Paul Hammond 
        -Pawel Knap 
        -Pieter Droogendijk 
        -Pursuit92 
        -Riku Voipio 
        -Rob Figueiredo 
        -Rodrigo Chiossi 
        -Slawek Ligus 
        -Soge Zhang 
        -Tiffany Jernigan 
        -Tilak Sharma 
        -Tom Payne 
        -Travis Cline 
        -Tudor Golubenco 
        -Vahe Khachikyan 
        -Yukang 
        -bronze1man 
        -debrando 
        -henrikedwards 
        -铁哥 
        diff --git a/vendor/gopkg.in/fsnotify.v1/CHANGELOG.md b/vendor/gopkg.in/fsnotify.v1/CHANGELOG.md
        deleted file mode 100644
        index be4d7ea2c..000000000
        --- a/vendor/gopkg.in/fsnotify.v1/CHANGELOG.md
        +++ /dev/null
        @@ -1,317 +0,0 @@
        -# Changelog
        -
        -## v1.4.7 / 2018-01-09
        -
        -* BSD/macOS: Fix possible deadlock on closing the watcher on kqueue (thanks @nhooyr and @glycerine)
        -* Tests: Fix missing verb on format string (thanks @rchiossi)
        -* Linux: Fix deadlock in Remove (thanks @aarondl)
        -* Linux: Watch.Add improvements (avoid race, fix consistency, reduce garbage) (thanks @twpayne)
        -* Docs: Moved FAQ into the README (thanks @vahe)
        -* Linux: Properly handle inotify's IN_Q_OVERFLOW event (thanks @zeldovich)
        -* Docs: replace references to OS X with macOS
        -
        -## v1.4.2 / 2016-10-10
        -
        -* Linux: use InotifyInit1 with IN_CLOEXEC to stop leaking a file descriptor to a child process when using fork/exec [#178](https://github.com/fsnotify/fsnotify/pull/178) (thanks @pattyshack)
        -
        -## v1.4.1 / 2016-10-04
        -
        -* Fix flaky inotify stress test on Linux [#177](https://github.com/fsnotify/fsnotify/pull/177) (thanks @pattyshack)
        -
        -## v1.4.0 / 2016-10-01
        -
        -* add a String() method to Event.Op [#165](https://github.com/fsnotify/fsnotify/pull/165) (thanks @oozie)
        -
        -## v1.3.1 / 2016-06-28
        -
        -* Windows: fix for double backslash when watching the root of a drive [#151](https://github.com/fsnotify/fsnotify/issues/151) (thanks @brunoqc)
        -
        -## v1.3.0 / 2016-04-19
        -
        -* Support linux/arm64 by [patching](https://go-review.googlesource.com/#/c/21971/) x/sys/unix and switching to to it from syscall (thanks @suihkulokki) [#135](https://github.com/fsnotify/fsnotify/pull/135)
        -
        -## v1.2.10 / 2016-03-02
        -
        -* Fix golint errors in windows.go [#121](https://github.com/fsnotify/fsnotify/pull/121) (thanks @tiffanyfj)
        -
        -## v1.2.9 / 2016-01-13
        -
        -kqueue: Fix logic for CREATE after REMOVE [#111](https://github.com/fsnotify/fsnotify/pull/111) (thanks @bep)
        -
        -## v1.2.8 / 2015-12-17
        -
        -* kqueue: fix race condition in Close [#105](https://github.com/fsnotify/fsnotify/pull/105) (thanks @djui for reporting the issue and @ppknap for writing a failing test)
        -* inotify: fix race in test
        -* enable race detection for continuous integration (Linux, Mac, Windows)
        -
        -## v1.2.5 / 2015-10-17
        -
        -* inotify: use epoll_create1 for arm64 support (requires Linux 2.6.27 or later) [#100](https://github.com/fsnotify/fsnotify/pull/100) (thanks @suihkulokki)
        -* inotify: fix path leaks [#73](https://github.com/fsnotify/fsnotify/pull/73) (thanks @chamaken)
        -* kqueue: watch for rename events on subdirectories [#83](https://github.com/fsnotify/fsnotify/pull/83) (thanks @guotie)
        -* kqueue: avoid infinite loops from symlinks cycles [#101](https://github.com/fsnotify/fsnotify/pull/101) (thanks @illicitonion)
        -
        -## v1.2.1 / 2015-10-14
        -
        -* kqueue: don't watch named pipes [#98](https://github.com/fsnotify/fsnotify/pull/98) (thanks @evanphx)
        -
        -## v1.2.0 / 2015-02-08
        -
        -* inotify: use epoll to wake up readEvents [#66](https://github.com/fsnotify/fsnotify/pull/66) (thanks @PieterD)
        -* inotify: closing watcher should now always shut down goroutine [#63](https://github.com/fsnotify/fsnotify/pull/63) (thanks @PieterD)
        -* kqueue: close kqueue after removing watches, fixes [#59](https://github.com/fsnotify/fsnotify/issues/59)
        -
        -## v1.1.1 / 2015-02-05
        -
        -* inotify: Retry read on EINTR [#61](https://github.com/fsnotify/fsnotify/issues/61) (thanks @PieterD)
        -
        -## v1.1.0 / 2014-12-12
        -
        -* kqueue: rework internals [#43](https://github.com/fsnotify/fsnotify/pull/43)
        -    * add low-level functions
        -    * only need to store flags on directories
        -    * less mutexes [#13](https://github.com/fsnotify/fsnotify/issues/13)
        -    * done can be an unbuffered channel
        -    * remove calls to os.NewSyscallError
        -* More efficient string concatenation for Event.String() [#52](https://github.com/fsnotify/fsnotify/pull/52) (thanks @mdlayher)
        -* kqueue: fix regression in  rework causing subdirectories to be watched [#48](https://github.com/fsnotify/fsnotify/issues/48)
        -* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51)
        -
        -## v1.0.4 / 2014-09-07
        -
        -* kqueue: add dragonfly to the build tags.
        -* Rename source code files, rearrange code so exported APIs are at the top.
        -* Add done channel to example code. [#37](https://github.com/fsnotify/fsnotify/pull/37) (thanks @chenyukang)
        -
        -## v1.0.3 / 2014-08-19
        -
        -* [Fix] Windows MOVED_TO now translates to Create like on BSD and Linux. [#36](https://github.com/fsnotify/fsnotify/issues/36)
        -
        -## v1.0.2 / 2014-08-17
        -
        -* [Fix] Missing create events on macOS. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso)
        -* [Fix] Make ./path and path equivalent. (thanks @zhsso)
        -
        -## v1.0.0 / 2014-08-15
        -
        -* [API] Remove AddWatch on Windows, use Add.
        -* Improve documentation for exported identifiers. [#30](https://github.com/fsnotify/fsnotify/issues/30)
        -* Minor updates based on feedback from golint.
        -
        -## dev / 2014-07-09
        -
        -* Moved to [github.com/fsnotify/fsnotify](https://github.com/fsnotify/fsnotify).
        -* Use os.NewSyscallError instead of returning errno (thanks @hariharan-uno)
        -
        -## dev / 2014-07-04
        -
        -* kqueue: fix incorrect mutex used in Close()
        -* Update example to demonstrate usage of Op.
        -
        -## dev / 2014-06-28
        -
        -* [API] Don't set the Write Op for attribute notifications [#4](https://github.com/fsnotify/fsnotify/issues/4)
        -* Fix for String() method on Event (thanks Alex Brainman)
        -* Don't build on Plan 9 or Solaris (thanks @4ad)
        -
        -## dev / 2014-06-21
        -
        -* Events channel of type Event rather than *Event.
        -* [internal] use syscall constants directly for inotify and kqueue.
        -* [internal] kqueue: rename events to kevents and fileEvent to event.
        -
        -## dev / 2014-06-19
        -
        -* Go 1.3+ required on Windows (uses syscall.ERROR_MORE_DATA internally).
        -* [internal] remove cookie from Event struct (unused).
        -* [internal] Event struct has the same definition across every OS.
        -* [internal] remove internal watch and removeWatch methods.
        -
        -## dev / 2014-06-12
        -
        -* [API] Renamed Watch() to Add() and RemoveWatch() to Remove().
        -* [API] Pluralized channel names: Events and Errors.
        -* [API] Renamed FileEvent struct to Event.
        -* [API] Op constants replace methods like IsCreate().
        -
        -## dev / 2014-06-12
        -
        -* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98)
        -
        -## dev / 2014-05-23
        -
        -* [API] Remove current implementation of WatchFlags.
        -    * current implementation doesn't take advantage of OS for efficiency
        -    * provides little benefit over filtering events as they are received, but has  extra bookkeeping and mutexes
        -    * no tests for the current implementation
        -    * not fully implemented on Windows [#93](https://github.com/howeyc/fsnotify/issues/93#issuecomment-39285195)
        -
        -## v0.9.3 / 2014-12-31
        -
        -* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51)
        -
        -## v0.9.2 / 2014-08-17
        -
        -* [Backport] Fix missing create events on macOS. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso)
        -
        -## v0.9.1 / 2014-06-12
        -
        -* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98)
        -
        -## v0.9.0 / 2014-01-17
        -
        -* IsAttrib() for events that only concern a file's metadata [#79][] (thanks @abustany)
        -* [Fix] kqueue: fix deadlock [#77][] (thanks @cespare)
        -* [NOTICE] Development has moved to `code.google.com/p/go.exp/fsnotify` in preparation for inclusion in the Go standard library.
        -
        -## v0.8.12 / 2013-11-13
        -
        -* [API] Remove FD_SET and friends from Linux adapter
        -
        -## v0.8.11 / 2013-11-02
        -
        -* [Doc] Add Changelog [#72][] (thanks @nathany)
        -* [Doc] Spotlight and double modify events on macOS [#62][] (reported by @paulhammond)
        -
        -## v0.8.10 / 2013-10-19
        -
        -* [Fix] kqueue: remove file watches when parent directory is removed [#71][] (reported by @mdwhatcott)
        -* [Fix] kqueue: race between Close and readEvents [#70][] (reported by @bernerdschaefer)
        -* [Doc] specify OS-specific limits in README (thanks @debrando)
        -
        -## v0.8.9 / 2013-09-08
        -
        -* [Doc] Contributing (thanks @nathany)
        -* [Doc] update package path in example code [#63][] (thanks @paulhammond)
        -* [Doc] GoCI badge in README (Linux only) [#60][]
        -* [Doc] Cross-platform testing with Vagrant  [#59][] (thanks @nathany)
        -
        -## v0.8.8 / 2013-06-17
        -
        -* [Fix] Windows: handle `ERROR_MORE_DATA` on Windows [#49][] (thanks @jbowtie)
        -
        -## v0.8.7 / 2013-06-03
        -
        -* [API] Make syscall flags internal
        -* [Fix] inotify: ignore event changes
        -* [Fix] race in symlink test [#45][] (reported by @srid)
        -* [Fix] tests on Windows
        -* lower case error messages
        -
        -## v0.8.6 / 2013-05-23
        -
        -* kqueue: Use EVT_ONLY flag on Darwin
        -* [Doc] Update README with full example
        -
        -## v0.8.5 / 2013-05-09
        -
        -* [Fix] inotify: allow monitoring of "broken" symlinks (thanks @tsg)
        -
        -## v0.8.4 / 2013-04-07
        -
        -* [Fix] kqueue: watch all file events [#40][] (thanks @ChrisBuchholz)
        -
        -## v0.8.3 / 2013-03-13
        -
        -* [Fix] inoitfy/kqueue memory leak [#36][] (reported by @nbkolchin)
        -* [Fix] kqueue: use fsnFlags for watching a directory [#33][] (reported by @nbkolchin)
        -
        -## v0.8.2 / 2013-02-07
        -
        -* [Doc] add Authors
        -* [Fix] fix data races for map access [#29][] (thanks @fsouza)
        -
        -## v0.8.1 / 2013-01-09
        -
        -* [Fix] Windows path separators
        -* [Doc] BSD License
        -
        -## v0.8.0 / 2012-11-09
        -
        -* kqueue: directory watching improvements (thanks @vmirage)
        -* inotify: add `IN_MOVED_TO` [#25][] (requested by @cpisto)
        -* [Fix] kqueue: deleting watched directory [#24][] (reported by @jakerr)
        -
        -## v0.7.4 / 2012-10-09
        -
        -* [Fix] inotify: fixes from https://codereview.appspot.com/5418045/ (ugorji)
        -* [Fix] kqueue: preserve watch flags when watching for delete [#21][] (reported by @robfig)
        -* [Fix] kqueue: watch the directory even if it isn't a new watch (thanks @robfig)
        -* [Fix] kqueue: modify after recreation of file
        -
        -## v0.7.3 / 2012-09-27
        -
        -* [Fix] kqueue: watch with an existing folder inside the watched folder (thanks @vmirage)
        -* [Fix] kqueue: no longer get duplicate CREATE events
        -
        -## v0.7.2 / 2012-09-01
        -
        -* kqueue: events for created directories
        -
        -## v0.7.1 / 2012-07-14
        -
        -* [Fix] for renaming files
        -
        -## v0.7.0 / 2012-07-02
        -
        -* [Feature] FSNotify flags
        -* [Fix] inotify: Added file name back to event path
        -
        -## v0.6.0 / 2012-06-06
        -
        -* kqueue: watch files after directory created (thanks @tmc)
        -
        -## v0.5.1 / 2012-05-22
        -
        -* [Fix] inotify: remove all watches before Close()
        -
        -## v0.5.0 / 2012-05-03
        -
        -* [API] kqueue: return errors during watch instead of sending over channel
        -* kqueue: match symlink behavior on Linux
        -* inotify: add `DELETE_SELF` (requested by @taralx)
        -* [Fix] kqueue: handle EINTR (reported by @robfig)
        -* [Doc] Godoc example [#1][] (thanks @davecheney)
        -
        -## v0.4.0 / 2012-03-30
        -
        -* Go 1 released: build with go tool
        -* [Feature] Windows support using winfsnotify
        -* Windows does not have attribute change notifications
        -* Roll attribute notifications into IsModify
        -
        -## v0.3.0 / 2012-02-19
        -
        -* kqueue: add files when watch directory
        -
        -## v0.2.0 / 2011-12-30
        -
        -* update to latest Go weekly code
        -
        -## v0.1.0 / 2011-10-19
        -
        -* kqueue: add watch on file creation to match inotify
        -* kqueue: create file event
        -* inotify: ignore `IN_IGNORED` events
        -* event String()
        -* linux: common FileEvent functions
        -* initial commit
        -
        -[#79]: https://github.com/howeyc/fsnotify/pull/79
        -[#77]: https://github.com/howeyc/fsnotify/pull/77
        -[#72]: https://github.com/howeyc/fsnotify/issues/72
        -[#71]: https://github.com/howeyc/fsnotify/issues/71
        -[#70]: https://github.com/howeyc/fsnotify/issues/70
        -[#63]: https://github.com/howeyc/fsnotify/issues/63
        -[#62]: https://github.com/howeyc/fsnotify/issues/62
        -[#60]: https://github.com/howeyc/fsnotify/issues/60
        -[#59]: https://github.com/howeyc/fsnotify/issues/59
        -[#49]: https://github.com/howeyc/fsnotify/issues/49
        -[#45]: https://github.com/howeyc/fsnotify/issues/45
        -[#40]: https://github.com/howeyc/fsnotify/issues/40
        -[#36]: https://github.com/howeyc/fsnotify/issues/36
        -[#33]: https://github.com/howeyc/fsnotify/issues/33
        -[#29]: https://github.com/howeyc/fsnotify/issues/29
        -[#25]: https://github.com/howeyc/fsnotify/issues/25
        -[#24]: https://github.com/howeyc/fsnotify/issues/24
        -[#21]: https://github.com/howeyc/fsnotify/issues/21
        diff --git a/vendor/gopkg.in/fsnotify.v1/CONTRIBUTING.md b/vendor/gopkg.in/fsnotify.v1/CONTRIBUTING.md
        deleted file mode 100644
        index 828a60b24..000000000
        --- a/vendor/gopkg.in/fsnotify.v1/CONTRIBUTING.md
        +++ /dev/null
        @@ -1,77 +0,0 @@
        -# Contributing
        -
        -## Issues
        -
        -* Request features and report bugs using the [GitHub Issue Tracker](https://github.com/fsnotify/fsnotify/issues).
        -* Please indicate the platform you are using fsnotify on.
        -* A code example to reproduce the problem is appreciated.
        -
        -## Pull Requests
        -
        -### Contributor License Agreement
        -
        -fsnotify is derived from code in the [golang.org/x/exp](https://godoc.org/golang.org/x/exp) package and it may be included [in the standard library](https://github.com/fsnotify/fsnotify/issues/1) in the future. Therefore fsnotify carries the same [LICENSE](https://github.com/fsnotify/fsnotify/blob/master/LICENSE) as Go. Contributors retain their copyright, so you need to fill out a short form before we can accept your contribution: [Google Individual Contributor License Agreement](https://developers.google.com/open-source/cla/individual).
        -
        -Please indicate that you have signed the CLA in your pull request.
        -
        -### How fsnotify is Developed
        -
        -* Development is done on feature branches.
        -* Tests are run on BSD, Linux, macOS and Windows.
        -* Pull requests are reviewed and [applied to master][am] using [hub][].
        -  * Maintainers may modify or squash commits rather than asking contributors to.
        -* To issue a new release, the maintainers will:
        -  * Update the CHANGELOG
        -  * Tag a version, which will become available through gopkg.in.
        - 
        -### How to Fork
        -
        -For smooth sailing, always use the original import path. Installing with `go get` makes this easy. 
        -
        -1. Install from GitHub (`go get -u github.com/fsnotify/fsnotify`)
        -2. Create your feature branch (`git checkout -b my-new-feature`)
        -3. Ensure everything works and the tests pass (see below)
        -4. Commit your changes (`git commit -am 'Add some feature'`)
        -
        -Contribute upstream:
        -
        -1. Fork fsnotify on GitHub
        -2. Add your remote (`git remote add fork git@github.com:mycompany/repo.git`)
        -3. Push to the branch (`git push fork my-new-feature`)
        -4. Create a new Pull Request on GitHub
        -
        -This workflow is [thoroughly explained by Katrina Owen](https://splice.com/blog/contributing-open-source-git-repositories-go/).
        -
        -### Testing
        -
        -fsnotify uses build tags to compile different code on Linux, BSD, macOS, and Windows.
        -
        -Before doing a pull request, please do your best to test your changes on multiple platforms, and list which platforms you were able/unable to test on.
        -
        -To aid in cross-platform testing there is a Vagrantfile for Linux and BSD.
        -
        -* Install [Vagrant](http://www.vagrantup.com/) and [VirtualBox](https://www.virtualbox.org/)
        -* Setup [Vagrant Gopher](https://github.com/nathany/vagrant-gopher) in your `src` folder.
        -* Run `vagrant up` from the project folder. You can also setup just one box with `vagrant up linux` or `vagrant up bsd` (note: the BSD box doesn't support Windows hosts at this time, and NFS may prompt for your host OS password)
        -* Once setup, you can run the test suite on a given OS with a single command `vagrant ssh linux -c 'cd fsnotify/fsnotify; go test'`.
        -* When you're done, you will want to halt or destroy the Vagrant boxes.
        -
        -Notice: fsnotify file system events won't trigger in shared folders. The tests get around this limitation by using the /tmp directory.
        -
        -Right now there is no equivalent solution for Windows and macOS, but there are Windows VMs [freely available from Microsoft](http://www.modern.ie/en-us/virtualization-tools#downloads).
        -
        -### Maintainers
        -
        -Help maintaining fsnotify is welcome. To be a maintainer:
        -
        -* Submit a pull request and sign the CLA as above.
        -* You must be able to run the test suite on Mac, Windows, Linux and BSD.
        -
        -To keep master clean, the fsnotify project uses the "apply mail" workflow outlined in Nathaniel Talbott's post ["Merge pull request" Considered Harmful][am]. This requires installing [hub][].
        -
        -All code changes should be internal pull requests.
        -
        -Releases are tagged using [Semantic Versioning](http://semver.org/).
        -
        -[hub]: https://github.com/github/hub
        -[am]: http://blog.spreedly.com/2014/06/24/merge-pull-request-considered-harmful/#.VGa5yZPF_Zs
        diff --git a/vendor/gopkg.in/fsnotify.v1/LICENSE b/vendor/gopkg.in/fsnotify.v1/LICENSE
        deleted file mode 100644
        index f21e54080..000000000
        --- a/vendor/gopkg.in/fsnotify.v1/LICENSE
        +++ /dev/null
        @@ -1,28 +0,0 @@
        -Copyright (c) 2012 The Go Authors. All rights reserved.
        -Copyright (c) 2012 fsnotify Authors. All rights reserved.
        -
        -Redistribution and use in source and binary forms, with or without
        -modification, are permitted provided that the following conditions are
        -met:
        -
        -   * Redistributions of source code must retain the above copyright
        -notice, this list of conditions and the following disclaimer.
        -   * Redistributions in binary form must reproduce the above
        -copyright notice, this list of conditions and the following disclaimer
        -in the documentation and/or other materials provided with the
        -distribution.
        -   * Neither the name of Google Inc. nor the names of its
        -contributors may be used to endorse or promote products derived from
        -this software without specific prior written permission.
        -
        -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
        -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
        -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
        -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
        -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
        -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
        -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
        -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
        -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
        -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        diff --git a/vendor/gopkg.in/fsnotify.v1/README.md b/vendor/gopkg.in/fsnotify.v1/README.md
        deleted file mode 100644
        index 399320741..000000000
        --- a/vendor/gopkg.in/fsnotify.v1/README.md
        +++ /dev/null
        @@ -1,79 +0,0 @@
        -# File system notifications for Go
        -
        -[![GoDoc](https://godoc.org/github.com/fsnotify/fsnotify?status.svg)](https://godoc.org/github.com/fsnotify/fsnotify) [![Go Report Card](https://goreportcard.com/badge/github.com/fsnotify/fsnotify)](https://goreportcard.com/report/github.com/fsnotify/fsnotify)
        -
        -fsnotify utilizes [golang.org/x/sys](https://godoc.org/golang.org/x/sys) rather than `syscall` from the standard library. Ensure you have the latest version installed by running:
        -
        -```console
        -go get -u golang.org/x/sys/...
        -```
        -
        -Cross platform: Windows, Linux, BSD and macOS.
        -
        -|Adapter   |OS        |Status    |
        -|----------|----------|----------|
        -|inotify   |Linux 2.6.27 or later, Android\*|Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify)|
        -|kqueue    |BSD, macOS, iOS\*|Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify)|
        -|ReadDirectoryChangesW|Windows|Supported [![Build status](https://ci.appveyor.com/api/projects/status/ivwjubaih4r0udeh/branch/master?svg=true)](https://ci.appveyor.com/project/NathanYoungman/fsnotify/branch/master)|
        -|FSEvents  |macOS         |[Planned](https://github.com/fsnotify/fsnotify/issues/11)|
        -|FEN       |Solaris 11    |[In Progress](https://github.com/fsnotify/fsnotify/issues/12)|
        -|fanotify  |Linux 2.6.37+ | |
        -|USN Journals |Windows    |[Maybe](https://github.com/fsnotify/fsnotify/issues/53)|
        -|Polling   |*All*         |[Maybe](https://github.com/fsnotify/fsnotify/issues/9)|
        -
        -\* Android and iOS are untested.
        -
        -Please see [the documentation](https://godoc.org/github.com/fsnotify/fsnotify) and consult the [FAQ](#faq) for usage information.
        -
        -## API stability
        -
        -fsnotify is a fork of [howeyc/fsnotify](https://godoc.org/github.com/howeyc/fsnotify) with a new API as of v1.0. The API is based on [this design document](http://goo.gl/MrYxyA). 
        -
        -All [releases](https://github.com/fsnotify/fsnotify/releases) are tagged based on [Semantic Versioning](http://semver.org/). Further API changes are [planned](https://github.com/fsnotify/fsnotify/milestones), and will be tagged with a new major revision number.
        -
        -Go 1.6 supports dependencies located in the `vendor/` folder. Unless you are creating a library, it is recommended that you copy fsnotify into `vendor/github.com/fsnotify/fsnotify` within your project, and likewise for `golang.org/x/sys`.
        -
        -## Contributing
        -
        -Please refer to [CONTRIBUTING][] before opening an issue or pull request.
        -
        -## Example
        -
        -See [example_test.go](https://github.com/fsnotify/fsnotify/blob/master/example_test.go).
        -
        -## FAQ
        -
        -**When a file is moved to another directory is it still being watched?**
        -
        -No (it shouldn't be, unless you are watching where it was moved to).
        -
        -**When I watch a directory, are all subdirectories watched as well?**
        -
        -No, you must add watches for any directory you want to watch (a recursive watcher is on the roadmap [#18][]).
        -
        -**Do I have to watch the Error and Event channels in a separate goroutine?**
        -
        -As of now, yes. Looking into making this single-thread friendly (see [howeyc #7][#7])
        -
        -**Why am I receiving multiple events for the same file on OS X?**
        -
        -Spotlight indexing on OS X can result in multiple events (see [howeyc #62][#62]). A temporary workaround is to add your folder(s) to the *Spotlight Privacy settings* until we have a native FSEvents implementation (see [#11][]).
        -
        -**How many files can be watched at once?**
        -
        -There are OS-specific limits as to how many watches can be created:
        -* Linux: /proc/sys/fs/inotify/max_user_watches contains the limit, reaching this limit results in a "no space left on device" error.
        -* BSD / OSX: sysctl variables "kern.maxfiles" and "kern.maxfilesperproc", reaching these limits results in a "too many open files" error.
        -
        -[#62]: https://github.com/howeyc/fsnotify/issues/62
        -[#18]: https://github.com/fsnotify/fsnotify/issues/18
        -[#11]: https://github.com/fsnotify/fsnotify/issues/11
        -[#7]: https://github.com/howeyc/fsnotify/issues/7
        -
        -[contributing]: https://github.com/fsnotify/fsnotify/blob/master/CONTRIBUTING.md
        -
        -## Related Projects
        -
        -* [notify](https://github.com/rjeczalik/notify)
        -* [fsevents](https://github.com/fsnotify/fsevents)
        -
        diff --git a/vendor/gopkg.in/fsnotify.v1/fen.go b/vendor/gopkg.in/fsnotify.v1/fen.go
        deleted file mode 100644
        index ced39cb88..000000000
        --- a/vendor/gopkg.in/fsnotify.v1/fen.go
        +++ /dev/null
        @@ -1,37 +0,0 @@
        -// Copyright 2010 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -// +build solaris
        -
        -package fsnotify
        -
        -import (
        -	"errors"
        -)
        -
        -// Watcher watches a set of files, delivering events to a channel.
        -type Watcher struct {
        -	Events chan Event
        -	Errors chan error
        -}
        -
        -// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events.
        -func NewWatcher() (*Watcher, error) {
        -	return nil, errors.New("FEN based watcher not yet supported for fsnotify\n")
        -}
        -
        -// Close removes all watches and closes the events channel.
        -func (w *Watcher) Close() error {
        -	return nil
        -}
        -
        -// Add starts watching the named file or directory (non-recursively).
        -func (w *Watcher) Add(name string) error {
        -	return nil
        -}
        -
        -// Remove stops watching the the named file or directory (non-recursively).
        -func (w *Watcher) Remove(name string) error {
        -	return nil
        -}
        diff --git a/vendor/gopkg.in/fsnotify.v1/fsnotify.go b/vendor/gopkg.in/fsnotify.v1/fsnotify.go
        deleted file mode 100644
        index 190bf0de5..000000000
        --- a/vendor/gopkg.in/fsnotify.v1/fsnotify.go
        +++ /dev/null
        @@ -1,66 +0,0 @@
        -// Copyright 2012 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -// +build !plan9
        -
        -// Package fsnotify provides a platform-independent interface for file system notifications.
        -package fsnotify
        -
        -import (
        -	"bytes"
        -	"errors"
        -	"fmt"
        -)
        -
        -// Event represents a single file system notification.
        -type Event struct {
        -	Name string // Relative path to the file or directory.
        -	Op   Op     // File operation that triggered the event.
        -}
        -
        -// Op describes a set of file operations.
        -type Op uint32
        -
        -// These are the generalized file operations that can trigger a notification.
        -const (
        -	Create Op = 1 << iota
        -	Write
        -	Remove
        -	Rename
        -	Chmod
        -)
        -
        -func (op Op) String() string {
        -	// Use a buffer for efficient string concatenation
        -	var buffer bytes.Buffer
        -
        -	if op&Create == Create {
        -		buffer.WriteString("|CREATE")
        -	}
        -	if op&Remove == Remove {
        -		buffer.WriteString("|REMOVE")
        -	}
        -	if op&Write == Write {
        -		buffer.WriteString("|WRITE")
        -	}
        -	if op&Rename == Rename {
        -		buffer.WriteString("|RENAME")
        -	}
        -	if op&Chmod == Chmod {
        -		buffer.WriteString("|CHMOD")
        -	}
        -	if buffer.Len() == 0 {
        -		return ""
        -	}
        -	return buffer.String()[1:] // Strip leading pipe
        -}
        -
        -// String returns a string representation of the event in the form
        -// "file: REMOVE|WRITE|..."
        -func (e Event) String() string {
        -	return fmt.Sprintf("%q: %s", e.Name, e.Op.String())
        -}
        -
        -// Common errors that can be reported by a watcher
        -var ErrEventOverflow = errors.New("fsnotify queue overflow")
        diff --git a/vendor/gopkg.in/fsnotify.v1/inotify.go b/vendor/gopkg.in/fsnotify.v1/inotify.go
        deleted file mode 100644
        index d9fd1b88a..000000000
        --- a/vendor/gopkg.in/fsnotify.v1/inotify.go
        +++ /dev/null
        @@ -1,337 +0,0 @@
        -// Copyright 2010 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -// +build linux
        -
        -package fsnotify
        -
        -import (
        -	"errors"
        -	"fmt"
        -	"io"
        -	"os"
        -	"path/filepath"
        -	"strings"
        -	"sync"
        -	"unsafe"
        -
        -	"golang.org/x/sys/unix"
        -)
        -
        -// Watcher watches a set of files, delivering events to a channel.
        -type Watcher struct {
        -	Events   chan Event
        -	Errors   chan error
        -	mu       sync.Mutex // Map access
        -	fd       int
        -	poller   *fdPoller
        -	watches  map[string]*watch // Map of inotify watches (key: path)
        -	paths    map[int]string    // Map of watched paths (key: watch descriptor)
        -	done     chan struct{}     // Channel for sending a "quit message" to the reader goroutine
        -	doneResp chan struct{}     // Channel to respond to Close
        -}
        -
        -// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events.
        -func NewWatcher() (*Watcher, error) {
        -	// Create inotify fd
        -	fd, errno := unix.InotifyInit1(unix.IN_CLOEXEC)
        -	if fd == -1 {
        -		return nil, errno
        -	}
        -	// Create epoll
        -	poller, err := newFdPoller(fd)
        -	if err != nil {
        -		unix.Close(fd)
        -		return nil, err
        -	}
        -	w := &Watcher{
        -		fd:       fd,
        -		poller:   poller,
        -		watches:  make(map[string]*watch),
        -		paths:    make(map[int]string),
        -		Events:   make(chan Event),
        -		Errors:   make(chan error),
        -		done:     make(chan struct{}),
        -		doneResp: make(chan struct{}),
        -	}
        -
        -	go w.readEvents()
        -	return w, nil
        -}
        -
        -func (w *Watcher) isClosed() bool {
        -	select {
        -	case <-w.done:
        -		return true
        -	default:
        -		return false
        -	}
        -}
        -
        -// Close removes all watches and closes the events channel.
        -func (w *Watcher) Close() error {
        -	if w.isClosed() {
        -		return nil
        -	}
        -
        -	// Send 'close' signal to goroutine, and set the Watcher to closed.
        -	close(w.done)
        -
        -	// Wake up goroutine
        -	w.poller.wake()
        -
        -	// Wait for goroutine to close
        -	<-w.doneResp
        -
        -	return nil
        -}
        -
        -// Add starts watching the named file or directory (non-recursively).
        -func (w *Watcher) Add(name string) error {
        -	name = filepath.Clean(name)
        -	if w.isClosed() {
        -		return errors.New("inotify instance already closed")
        -	}
        -
        -	const agnosticEvents = unix.IN_MOVED_TO | unix.IN_MOVED_FROM |
        -		unix.IN_CREATE | unix.IN_ATTRIB | unix.IN_MODIFY |
        -		unix.IN_MOVE_SELF | unix.IN_DELETE | unix.IN_DELETE_SELF
        -
        -	var flags uint32 = agnosticEvents
        -
        -	w.mu.Lock()
        -	defer w.mu.Unlock()
        -	watchEntry := w.watches[name]
        -	if watchEntry != nil {
        -		flags |= watchEntry.flags | unix.IN_MASK_ADD
        -	}
        -	wd, errno := unix.InotifyAddWatch(w.fd, name, flags)
        -	if wd == -1 {
        -		return errno
        -	}
        -
        -	if watchEntry == nil {
        -		w.watches[name] = &watch{wd: uint32(wd), flags: flags}
        -		w.paths[wd] = name
        -	} else {
        -		watchEntry.wd = uint32(wd)
        -		watchEntry.flags = flags
        -	}
        -
        -	return nil
        -}
        -
        -// Remove stops watching the named file or directory (non-recursively).
        -func (w *Watcher) Remove(name string) error {
        -	name = filepath.Clean(name)
        -
        -	// Fetch the watch.
        -	w.mu.Lock()
        -	defer w.mu.Unlock()
        -	watch, ok := w.watches[name]
        -
        -	// Remove it from inotify.
        -	if !ok {
        -		return fmt.Errorf("can't remove non-existent inotify watch for: %s", name)
        -	}
        -
        -	// We successfully removed the watch if InotifyRmWatch doesn't return an
        -	// error, we need to clean up our internal state to ensure it matches
        -	// inotify's kernel state.
        -	delete(w.paths, int(watch.wd))
        -	delete(w.watches, name)
        -
        -	// inotify_rm_watch will return EINVAL if the file has been deleted;
        -	// the inotify will already have been removed.
        -	// watches and pathes are deleted in ignoreLinux() implicitly and asynchronously
        -	// by calling inotify_rm_watch() below. e.g. readEvents() goroutine receives IN_IGNORE
        -	// so that EINVAL means that the wd is being rm_watch()ed or its file removed
        -	// by another thread and we have not received IN_IGNORE event.
        -	success, errno := unix.InotifyRmWatch(w.fd, watch.wd)
        -	if success == -1 {
        -		// TODO: Perhaps it's not helpful to return an error here in every case.
        -		// the only two possible errors are:
        -		// EBADF, which happens when w.fd is not a valid file descriptor of any kind.
        -		// EINVAL, which is when fd is not an inotify descriptor or wd is not a valid watch descriptor.
        -		// Watch descriptors are invalidated when they are removed explicitly or implicitly;
        -		// explicitly by inotify_rm_watch, implicitly when the file they are watching is deleted.
        -		return errno
        -	}
        -
        -	return nil
        -}
        -
        -type watch struct {
        -	wd    uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall)
        -	flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags)
        -}
        -
        -// readEvents reads from the inotify file descriptor, converts the
        -// received events into Event objects and sends them via the Events channel
        -func (w *Watcher) readEvents() {
        -	var (
        -		buf   [unix.SizeofInotifyEvent * 4096]byte // Buffer for a maximum of 4096 raw events
        -		n     int                                  // Number of bytes read with read()
        -		errno error                                // Syscall errno
        -		ok    bool                                 // For poller.wait
        -	)
        -
        -	defer close(w.doneResp)
        -	defer close(w.Errors)
        -	defer close(w.Events)
        -	defer unix.Close(w.fd)
        -	defer w.poller.close()
        -
        -	for {
        -		// See if we have been closed.
        -		if w.isClosed() {
        -			return
        -		}
        -
        -		ok, errno = w.poller.wait()
        -		if errno != nil {
        -			select {
        -			case w.Errors <- errno:
        -			case <-w.done:
        -				return
        -			}
        -			continue
        -		}
        -
        -		if !ok {
        -			continue
        -		}
        -
        -		n, errno = unix.Read(w.fd, buf[:])
        -		// If a signal interrupted execution, see if we've been asked to close, and try again.
        -		// http://man7.org/linux/man-pages/man7/signal.7.html :
        -		// "Before Linux 3.8, reads from an inotify(7) file descriptor were not restartable"
        -		if errno == unix.EINTR {
        -			continue
        -		}
        -
        -		// unix.Read might have been woken up by Close. If so, we're done.
        -		if w.isClosed() {
        -			return
        -		}
        -
        -		if n < unix.SizeofInotifyEvent {
        -			var err error
        -			if n == 0 {
        -				// If EOF is received. This should really never happen.
        -				err = io.EOF
        -			} else if n < 0 {
        -				// If an error occurred while reading.
        -				err = errno
        -			} else {
        -				// Read was too short.
        -				err = errors.New("notify: short read in readEvents()")
        -			}
        -			select {
        -			case w.Errors <- err:
        -			case <-w.done:
        -				return
        -			}
        -			continue
        -		}
        -
        -		var offset uint32
        -		// We don't know how many events we just read into the buffer
        -		// While the offset points to at least one whole event...
        -		for offset <= uint32(n-unix.SizeofInotifyEvent) {
        -			// Point "raw" to the event in the buffer
        -			raw := (*unix.InotifyEvent)(unsafe.Pointer(&buf[offset]))
        -
        -			mask := uint32(raw.Mask)
        -			nameLen := uint32(raw.Len)
        -
        -			if mask&unix.IN_Q_OVERFLOW != 0 {
        -				select {
        -				case w.Errors <- ErrEventOverflow:
        -				case <-w.done:
        -					return
        -				}
        -			}
        -
        -			// If the event happened to the watched directory or the watched file, the kernel
        -			// doesn't append the filename to the event, but we would like to always fill the
        -			// the "Name" field with a valid filename. We retrieve the path of the watch from
        -			// the "paths" map.
        -			w.mu.Lock()
        -			name, ok := w.paths[int(raw.Wd)]
        -			// IN_DELETE_SELF occurs when the file/directory being watched is removed.
        -			// This is a sign to clean up the maps, otherwise we are no longer in sync
        -			// with the inotify kernel state which has already deleted the watch
        -			// automatically.
        -			if ok && mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF {
        -				delete(w.paths, int(raw.Wd))
        -				delete(w.watches, name)
        -			}
        -			w.mu.Unlock()
        -
        -			if nameLen > 0 {
        -				// Point "bytes" at the first byte of the filename
        -				bytes := (*[unix.PathMax]byte)(unsafe.Pointer(&buf[offset+unix.SizeofInotifyEvent]))
        -				// The filename is padded with NULL bytes. TrimRight() gets rid of those.
        -				name += "/" + strings.TrimRight(string(bytes[0:nameLen]), "\000")
        -			}
        -
        -			event := newEvent(name, mask)
        -
        -			// Send the events that are not ignored on the events channel
        -			if !event.ignoreLinux(mask) {
        -				select {
        -				case w.Events <- event:
        -				case <-w.done:
        -					return
        -				}
        -			}
        -
        -			// Move to the next event in the buffer
        -			offset += unix.SizeofInotifyEvent + nameLen
        -		}
        -	}
        -}
        -
        -// Certain types of events can be "ignored" and not sent over the Events
        -// channel. Such as events marked ignore by the kernel, or MODIFY events
        -// against files that do not exist.
        -func (e *Event) ignoreLinux(mask uint32) bool {
        -	// Ignore anything the inotify API says to ignore
        -	if mask&unix.IN_IGNORED == unix.IN_IGNORED {
        -		return true
        -	}
        -
        -	// If the event is not a DELETE or RENAME, the file must exist.
        -	// Otherwise the event is ignored.
        -	// *Note*: this was put in place because it was seen that a MODIFY
        -	// event was sent after the DELETE. This ignores that MODIFY and
        -	// assumes a DELETE will come or has come if the file doesn't exist.
        -	if !(e.Op&Remove == Remove || e.Op&Rename == Rename) {
        -		_, statErr := os.Lstat(e.Name)
        -		return os.IsNotExist(statErr)
        -	}
        -	return false
        -}
        -
        -// newEvent returns an platform-independent Event based on an inotify mask.
        -func newEvent(name string, mask uint32) Event {
        -	e := Event{Name: name}
        -	if mask&unix.IN_CREATE == unix.IN_CREATE || mask&unix.IN_MOVED_TO == unix.IN_MOVED_TO {
        -		e.Op |= Create
        -	}
        -	if mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF || mask&unix.IN_DELETE == unix.IN_DELETE {
        -		e.Op |= Remove
        -	}
        -	if mask&unix.IN_MODIFY == unix.IN_MODIFY {
        -		e.Op |= Write
        -	}
        -	if mask&unix.IN_MOVE_SELF == unix.IN_MOVE_SELF || mask&unix.IN_MOVED_FROM == unix.IN_MOVED_FROM {
        -		e.Op |= Rename
        -	}
        -	if mask&unix.IN_ATTRIB == unix.IN_ATTRIB {
        -		e.Op |= Chmod
        -	}
        -	return e
        -}
        diff --git a/vendor/gopkg.in/fsnotify.v1/inotify_poller.go b/vendor/gopkg.in/fsnotify.v1/inotify_poller.go
        deleted file mode 100644
        index cc7db4b22..000000000
        --- a/vendor/gopkg.in/fsnotify.v1/inotify_poller.go
        +++ /dev/null
        @@ -1,187 +0,0 @@
        -// Copyright 2015 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -// +build linux
        -
        -package fsnotify
        -
        -import (
        -	"errors"
        -
        -	"golang.org/x/sys/unix"
        -)
        -
        -type fdPoller struct {
        -	fd   int    // File descriptor (as returned by the inotify_init() syscall)
        -	epfd int    // Epoll file descriptor
        -	pipe [2]int // Pipe for waking up
        -}
        -
        -func emptyPoller(fd int) *fdPoller {
        -	poller := new(fdPoller)
        -	poller.fd = fd
        -	poller.epfd = -1
        -	poller.pipe[0] = -1
        -	poller.pipe[1] = -1
        -	return poller
        -}
        -
        -// Create a new inotify poller.
        -// This creates an inotify handler, and an epoll handler.
        -func newFdPoller(fd int) (*fdPoller, error) {
        -	var errno error
        -	poller := emptyPoller(fd)
        -	defer func() {
        -		if errno != nil {
        -			poller.close()
        -		}
        -	}()
        -	poller.fd = fd
        -
        -	// Create epoll fd
        -	poller.epfd, errno = unix.EpollCreate1(0)
        -	if poller.epfd == -1 {
        -		return nil, errno
        -	}
        -	// Create pipe; pipe[0] is the read end, pipe[1] the write end.
        -	errno = unix.Pipe2(poller.pipe[:], unix.O_NONBLOCK)
        -	if errno != nil {
        -		return nil, errno
        -	}
        -
        -	// Register inotify fd with epoll
        -	event := unix.EpollEvent{
        -		Fd:     int32(poller.fd),
        -		Events: unix.EPOLLIN,
        -	}
        -	errno = unix.EpollCtl(poller.epfd, unix.EPOLL_CTL_ADD, poller.fd, &event)
        -	if errno != nil {
        -		return nil, errno
        -	}
        -
        -	// Register pipe fd with epoll
        -	event = unix.EpollEvent{
        -		Fd:     int32(poller.pipe[0]),
        -		Events: unix.EPOLLIN,
        -	}
        -	errno = unix.EpollCtl(poller.epfd, unix.EPOLL_CTL_ADD, poller.pipe[0], &event)
        -	if errno != nil {
        -		return nil, errno
        -	}
        -
        -	return poller, nil
        -}
        -
        -// Wait using epoll.
        -// Returns true if something is ready to be read,
        -// false if there is not.
        -func (poller *fdPoller) wait() (bool, error) {
        -	// 3 possible events per fd, and 2 fds, makes a maximum of 6 events.
        -	// I don't know whether epoll_wait returns the number of events returned,
        -	// or the total number of events ready.
        -	// I decided to catch both by making the buffer one larger than the maximum.
        -	events := make([]unix.EpollEvent, 7)
        -	for {
        -		n, errno := unix.EpollWait(poller.epfd, events, -1)
        -		if n == -1 {
        -			if errno == unix.EINTR {
        -				continue
        -			}
        -			return false, errno
        -		}
        -		if n == 0 {
        -			// If there are no events, try again.
        -			continue
        -		}
        -		if n > 6 {
        -			// This should never happen. More events were returned than should be possible.
        -			return false, errors.New("epoll_wait returned more events than I know what to do with")
        -		}
        -		ready := events[:n]
        -		epollhup := false
        -		epollerr := false
        -		epollin := false
        -		for _, event := range ready {
        -			if event.Fd == int32(poller.fd) {
        -				if event.Events&unix.EPOLLHUP != 0 {
        -					// This should not happen, but if it does, treat it as a wakeup.
        -					epollhup = true
        -				}
        -				if event.Events&unix.EPOLLERR != 0 {
        -					// If an error is waiting on the file descriptor, we should pretend
        -					// something is ready to read, and let unix.Read pick up the error.
        -					epollerr = true
        -				}
        -				if event.Events&unix.EPOLLIN != 0 {
        -					// There is data to read.
        -					epollin = true
        -				}
        -			}
        -			if event.Fd == int32(poller.pipe[0]) {
        -				if event.Events&unix.EPOLLHUP != 0 {
        -					// Write pipe descriptor was closed, by us. This means we're closing down the
        -					// watcher, and we should wake up.
        -				}
        -				if event.Events&unix.EPOLLERR != 0 {
        -					// If an error is waiting on the pipe file descriptor.
        -					// This is an absolute mystery, and should never ever happen.
        -					return false, errors.New("Error on the pipe descriptor.")
        -				}
        -				if event.Events&unix.EPOLLIN != 0 {
        -					// This is a regular wakeup, so we have to clear the buffer.
        -					err := poller.clearWake()
        -					if err != nil {
        -						return false, err
        -					}
        -				}
        -			}
        -		}
        -
        -		if epollhup || epollerr || epollin {
        -			return true, nil
        -		}
        -		return false, nil
        -	}
        -}
        -
        -// Close the write end of the poller.
        -func (poller *fdPoller) wake() error {
        -	buf := make([]byte, 1)
        -	n, errno := unix.Write(poller.pipe[1], buf)
        -	if n == -1 {
        -		if errno == unix.EAGAIN {
        -			// Buffer is full, poller will wake.
        -			return nil
        -		}
        -		return errno
        -	}
        -	return nil
        -}
        -
        -func (poller *fdPoller) clearWake() error {
        -	// You have to be woken up a LOT in order to get to 100!
        -	buf := make([]byte, 100)
        -	n, errno := unix.Read(poller.pipe[0], buf)
        -	if n == -1 {
        -		if errno == unix.EAGAIN {
        -			// Buffer is empty, someone else cleared our wake.
        -			return nil
        -		}
        -		return errno
        -	}
        -	return nil
        -}
        -
        -// Close all poller file descriptors, but not the one passed to it.
        -func (poller *fdPoller) close() {
        -	if poller.pipe[1] != -1 {
        -		unix.Close(poller.pipe[1])
        -	}
        -	if poller.pipe[0] != -1 {
        -		unix.Close(poller.pipe[0])
        -	}
        -	if poller.epfd != -1 {
        -		unix.Close(poller.epfd)
        -	}
        -}
        diff --git a/vendor/gopkg.in/fsnotify.v1/kqueue.go b/vendor/gopkg.in/fsnotify.v1/kqueue.go
        deleted file mode 100644
        index 86e76a3d6..000000000
        --- a/vendor/gopkg.in/fsnotify.v1/kqueue.go
        +++ /dev/null
        @@ -1,521 +0,0 @@
        -// Copyright 2010 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -// +build freebsd openbsd netbsd dragonfly darwin
        -
        -package fsnotify
        -
        -import (
        -	"errors"
        -	"fmt"
        -	"io/ioutil"
        -	"os"
        -	"path/filepath"
        -	"sync"
        -	"time"
        -
        -	"golang.org/x/sys/unix"
        -)
        -
        -// Watcher watches a set of files, delivering events to a channel.
        -type Watcher struct {
        -	Events chan Event
        -	Errors chan error
        -	done   chan struct{} // Channel for sending a "quit message" to the reader goroutine
        -
        -	kq int // File descriptor (as returned by the kqueue() syscall).
        -
        -	mu              sync.Mutex        // Protects access to watcher data
        -	watches         map[string]int    // Map of watched file descriptors (key: path).
        -	externalWatches map[string]bool   // Map of watches added by user of the library.
        -	dirFlags        map[string]uint32 // Map of watched directories to fflags used in kqueue.
        -	paths           map[int]pathInfo  // Map file descriptors to path names for processing kqueue events.
        -	fileExists      map[string]bool   // Keep track of if we know this file exists (to stop duplicate create events).
        -	isClosed        bool              // Set to true when Close() is first called
        -}
        -
        -type pathInfo struct {
        -	name  string
        -	isDir bool
        -}
        -
        -// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events.
        -func NewWatcher() (*Watcher, error) {
        -	kq, err := kqueue()
        -	if err != nil {
        -		return nil, err
        -	}
        -
        -	w := &Watcher{
        -		kq:              kq,
        -		watches:         make(map[string]int),
        -		dirFlags:        make(map[string]uint32),
        -		paths:           make(map[int]pathInfo),
        -		fileExists:      make(map[string]bool),
        -		externalWatches: make(map[string]bool),
        -		Events:          make(chan Event),
        -		Errors:          make(chan error),
        -		done:            make(chan struct{}),
        -	}
        -
        -	go w.readEvents()
        -	return w, nil
        -}
        -
        -// Close removes all watches and closes the events channel.
        -func (w *Watcher) Close() error {
        -	w.mu.Lock()
        -	if w.isClosed {
        -		w.mu.Unlock()
        -		return nil
        -	}
        -	w.isClosed = true
        -
        -	// copy paths to remove while locked
        -	var pathsToRemove = make([]string, 0, len(w.watches))
        -	for name := range w.watches {
        -		pathsToRemove = append(pathsToRemove, name)
        -	}
        -	w.mu.Unlock()
        -	// unlock before calling Remove, which also locks
        -
        -	for _, name := range pathsToRemove {
        -		w.Remove(name)
        -	}
        -
        -	// send a "quit" message to the reader goroutine
        -	close(w.done)
        -
        -	return nil
        -}
        -
        -// Add starts watching the named file or directory (non-recursively).
        -func (w *Watcher) Add(name string) error {
        -	w.mu.Lock()
        -	w.externalWatches[name] = true
        -	w.mu.Unlock()
        -	_, err := w.addWatch(name, noteAllEvents)
        -	return err
        -}
        -
        -// Remove stops watching the the named file or directory (non-recursively).
        -func (w *Watcher) Remove(name string) error {
        -	name = filepath.Clean(name)
        -	w.mu.Lock()
        -	watchfd, ok := w.watches[name]
        -	w.mu.Unlock()
        -	if !ok {
        -		return fmt.Errorf("can't remove non-existent kevent watch for: %s", name)
        -	}
        -
        -	const registerRemove = unix.EV_DELETE
        -	if err := register(w.kq, []int{watchfd}, registerRemove, 0); err != nil {
        -		return err
        -	}
        -
        -	unix.Close(watchfd)
        -
        -	w.mu.Lock()
        -	isDir := w.paths[watchfd].isDir
        -	delete(w.watches, name)
        -	delete(w.paths, watchfd)
        -	delete(w.dirFlags, name)
        -	w.mu.Unlock()
        -
        -	// Find all watched paths that are in this directory that are not external.
        -	if isDir {
        -		var pathsToRemove []string
        -		w.mu.Lock()
        -		for _, path := range w.paths {
        -			wdir, _ := filepath.Split(path.name)
        -			if filepath.Clean(wdir) == name {
        -				if !w.externalWatches[path.name] {
        -					pathsToRemove = append(pathsToRemove, path.name)
        -				}
        -			}
        -		}
        -		w.mu.Unlock()
        -		for _, name := range pathsToRemove {
        -			// Since these are internal, not much sense in propagating error
        -			// to the user, as that will just confuse them with an error about
        -			// a path they did not explicitly watch themselves.
        -			w.Remove(name)
        -		}
        -	}
        -
        -	return nil
        -}
        -
        -// Watch all events (except NOTE_EXTEND, NOTE_LINK, NOTE_REVOKE)
        -const noteAllEvents = unix.NOTE_DELETE | unix.NOTE_WRITE | unix.NOTE_ATTRIB | unix.NOTE_RENAME
        -
        -// keventWaitTime to block on each read from kevent
        -var keventWaitTime = durationToTimespec(100 * time.Millisecond)
        -
        -// addWatch adds name to the watched file set.
        -// The flags are interpreted as described in kevent(2).
        -// Returns the real path to the file which was added, if any, which may be different from the one passed in the case of symlinks.
        -func (w *Watcher) addWatch(name string, flags uint32) (string, error) {
        -	var isDir bool
        -	// Make ./name and name equivalent
        -	name = filepath.Clean(name)
        -
        -	w.mu.Lock()
        -	if w.isClosed {
        -		w.mu.Unlock()
        -		return "", errors.New("kevent instance already closed")
        -	}
        -	watchfd, alreadyWatching := w.watches[name]
        -	// We already have a watch, but we can still override flags.
        -	if alreadyWatching {
        -		isDir = w.paths[watchfd].isDir
        -	}
        -	w.mu.Unlock()
        -
        -	if !alreadyWatching {
        -		fi, err := os.Lstat(name)
        -		if err != nil {
        -			return "", err
        -		}
        -
        -		// Don't watch sockets.
        -		if fi.Mode()&os.ModeSocket == os.ModeSocket {
        -			return "", nil
        -		}
        -
        -		// Don't watch named pipes.
        -		if fi.Mode()&os.ModeNamedPipe == os.ModeNamedPipe {
        -			return "", nil
        -		}
        -
        -		// Follow Symlinks
        -		// Unfortunately, Linux can add bogus symlinks to watch list without
        -		// issue, and Windows can't do symlinks period (AFAIK). To  maintain
        -		// consistency, we will act like everything is fine. There will simply
        -		// be no file events for broken symlinks.
        -		// Hence the returns of nil on errors.
        -		if fi.Mode()&os.ModeSymlink == os.ModeSymlink {
        -			name, err = filepath.EvalSymlinks(name)
        -			if err != nil {
        -				return "", nil
        -			}
        -
        -			w.mu.Lock()
        -			_, alreadyWatching = w.watches[name]
        -			w.mu.Unlock()
        -
        -			if alreadyWatching {
        -				return name, nil
        -			}
        -
        -			fi, err = os.Lstat(name)
        -			if err != nil {
        -				return "", nil
        -			}
        -		}
        -
        -		watchfd, err = unix.Open(name, openMode, 0700)
        -		if watchfd == -1 {
        -			return "", err
        -		}
        -
        -		isDir = fi.IsDir()
        -	}
        -
        -	const registerAdd = unix.EV_ADD | unix.EV_CLEAR | unix.EV_ENABLE
        -	if err := register(w.kq, []int{watchfd}, registerAdd, flags); err != nil {
        -		unix.Close(watchfd)
        -		return "", err
        -	}
        -
        -	if !alreadyWatching {
        -		w.mu.Lock()
        -		w.watches[name] = watchfd
        -		w.paths[watchfd] = pathInfo{name: name, isDir: isDir}
        -		w.mu.Unlock()
        -	}
        -
        -	if isDir {
        -		// Watch the directory if it has not been watched before,
        -		// or if it was watched before, but perhaps only a NOTE_DELETE (watchDirectoryFiles)
        -		w.mu.Lock()
        -
        -		watchDir := (flags&unix.NOTE_WRITE) == unix.NOTE_WRITE &&
        -			(!alreadyWatching || (w.dirFlags[name]&unix.NOTE_WRITE) != unix.NOTE_WRITE)
        -		// Store flags so this watch can be updated later
        -		w.dirFlags[name] = flags
        -		w.mu.Unlock()
        -
        -		if watchDir {
        -			if err := w.watchDirectoryFiles(name); err != nil {
        -				return "", err
        -			}
        -		}
        -	}
        -	return name, nil
        -}
        -
        -// readEvents reads from kqueue and converts the received kevents into
        -// Event values that it sends down the Events channel.
        -func (w *Watcher) readEvents() {
        -	eventBuffer := make([]unix.Kevent_t, 10)
        -
        -loop:
        -	for {
        -		// See if there is a message on the "done" channel
        -		select {
        -		case <-w.done:
        -			break loop
        -		default:
        -		}
        -
        -		// Get new events
        -		kevents, err := read(w.kq, eventBuffer, &keventWaitTime)
        -		// EINTR is okay, the syscall was interrupted before timeout expired.
        -		if err != nil && err != unix.EINTR {
        -			select {
        -			case w.Errors <- err:
        -			case <-w.done:
        -				break loop
        -			}
        -			continue
        -		}
        -
        -		// Flush the events we received to the Events channel
        -		for len(kevents) > 0 {
        -			kevent := &kevents[0]
        -			watchfd := int(kevent.Ident)
        -			mask := uint32(kevent.Fflags)
        -			w.mu.Lock()
        -			path := w.paths[watchfd]
        -			w.mu.Unlock()
        -			event := newEvent(path.name, mask)
        -
        -			if path.isDir && !(event.Op&Remove == Remove) {
        -				// Double check to make sure the directory exists. This can happen when
        -				// we do a rm -fr on a recursively watched folders and we receive a
        -				// modification event first but the folder has been deleted and later
        -				// receive the delete event
        -				if _, err := os.Lstat(event.Name); os.IsNotExist(err) {
        -					// mark is as delete event
        -					event.Op |= Remove
        -				}
        -			}
        -
        -			if event.Op&Rename == Rename || event.Op&Remove == Remove {
        -				w.Remove(event.Name)
        -				w.mu.Lock()
        -				delete(w.fileExists, event.Name)
        -				w.mu.Unlock()
        -			}
        -
        -			if path.isDir && event.Op&Write == Write && !(event.Op&Remove == Remove) {
        -				w.sendDirectoryChangeEvents(event.Name)
        -			} else {
        -				// Send the event on the Events channel.
        -				select {
        -				case w.Events <- event:
        -				case <-w.done:
        -					break loop
        -				}
        -			}
        -
        -			if event.Op&Remove == Remove {
        -				// Look for a file that may have overwritten this.
        -				// For example, mv f1 f2 will delete f2, then create f2.
        -				if path.isDir {
        -					fileDir := filepath.Clean(event.Name)
        -					w.mu.Lock()
        -					_, found := w.watches[fileDir]
        -					w.mu.Unlock()
        -					if found {
        -						// make sure the directory exists before we watch for changes. When we
        -						// do a recursive watch and perform rm -fr, the parent directory might
        -						// have gone missing, ignore the missing directory and let the
        -						// upcoming delete event remove the watch from the parent directory.
        -						if _, err := os.Lstat(fileDir); err == nil {
        -							w.sendDirectoryChangeEvents(fileDir)
        -						}
        -					}
        -				} else {
        -					filePath := filepath.Clean(event.Name)
        -					if fileInfo, err := os.Lstat(filePath); err == nil {
        -						w.sendFileCreatedEventIfNew(filePath, fileInfo)
        -					}
        -				}
        -			}
        -
        -			// Move to next event
        -			kevents = kevents[1:]
        -		}
        -	}
        -
        -	// cleanup
        -	err := unix.Close(w.kq)
        -	if err != nil {
        -		// only way the previous loop breaks is if w.done was closed so we need to async send to w.Errors.
        -		select {
        -		case w.Errors <- err:
        -		default:
        -		}
        -	}
        -	close(w.Events)
        -	close(w.Errors)
        -}
        -
        -// newEvent returns an platform-independent Event based on kqueue Fflags.
        -func newEvent(name string, mask uint32) Event {
        -	e := Event{Name: name}
        -	if mask&unix.NOTE_DELETE == unix.NOTE_DELETE {
        -		e.Op |= Remove
        -	}
        -	if mask&unix.NOTE_WRITE == unix.NOTE_WRITE {
        -		e.Op |= Write
        -	}
        -	if mask&unix.NOTE_RENAME == unix.NOTE_RENAME {
        -		e.Op |= Rename
        -	}
        -	if mask&unix.NOTE_ATTRIB == unix.NOTE_ATTRIB {
        -		e.Op |= Chmod
        -	}
        -	return e
        -}
        -
        -func newCreateEvent(name string) Event {
        -	return Event{Name: name, Op: Create}
        -}
        -
        -// watchDirectoryFiles to mimic inotify when adding a watch on a directory
        -func (w *Watcher) watchDirectoryFiles(dirPath string) error {
        -	// Get all files
        -	files, err := ioutil.ReadDir(dirPath)
        -	if err != nil {
        -		return err
        -	}
        -
        -	for _, fileInfo := range files {
        -		filePath := filepath.Join(dirPath, fileInfo.Name())
        -		filePath, err = w.internalWatch(filePath, fileInfo)
        -		if err != nil {
        -			return err
        -		}
        -
        -		w.mu.Lock()
        -		w.fileExists[filePath] = true
        -		w.mu.Unlock()
        -	}
        -
        -	return nil
        -}
        -
        -// sendDirectoryEvents searches the directory for newly created files
        -// and sends them over the event channel. This functionality is to have
        -// the BSD version of fsnotify match Linux inotify which provides a
        -// create event for files created in a watched directory.
        -func (w *Watcher) sendDirectoryChangeEvents(dirPath string) {
        -	// Get all files
        -	files, err := ioutil.ReadDir(dirPath)
        -	if err != nil {
        -		select {
        -		case w.Errors <- err:
        -		case <-w.done:
        -			return
        -		}
        -	}
        -
        -	// Search for new files
        -	for _, fileInfo := range files {
        -		filePath := filepath.Join(dirPath, fileInfo.Name())
        -		err := w.sendFileCreatedEventIfNew(filePath, fileInfo)
        -
        -		if err != nil {
        -			return
        -		}
        -	}
        -}
        -
        -// sendFileCreatedEvent sends a create event if the file isn't already being tracked.
        -func (w *Watcher) sendFileCreatedEventIfNew(filePath string, fileInfo os.FileInfo) (err error) {
        -	w.mu.Lock()
        -	_, doesExist := w.fileExists[filePath]
        -	w.mu.Unlock()
        -	if !doesExist {
        -		// Send create event
        -		select {
        -		case w.Events <- newCreateEvent(filePath):
        -		case <-w.done:
        -			return
        -		}
        -	}
        -
        -	// like watchDirectoryFiles (but without doing another ReadDir)
        -	filePath, err = w.internalWatch(filePath, fileInfo)
        -	if err != nil {
        -		return err
        -	}
        -
        -	w.mu.Lock()
        -	w.fileExists[filePath] = true
        -	w.mu.Unlock()
        -
        -	return nil
        -}
        -
        -func (w *Watcher) internalWatch(name string, fileInfo os.FileInfo) (string, error) {
        -	if fileInfo.IsDir() {
        -		// mimic Linux providing delete events for subdirectories
        -		// but preserve the flags used if currently watching subdirectory
        -		w.mu.Lock()
        -		flags := w.dirFlags[name]
        -		w.mu.Unlock()
        -
        -		flags |= unix.NOTE_DELETE | unix.NOTE_RENAME
        -		return w.addWatch(name, flags)
        -	}
        -
        -	// watch file to mimic Linux inotify
        -	return w.addWatch(name, noteAllEvents)
        -}
        -
        -// kqueue creates a new kernel event queue and returns a descriptor.
        -func kqueue() (kq int, err error) {
        -	kq, err = unix.Kqueue()
        -	if kq == -1 {
        -		return kq, err
        -	}
        -	return kq, nil
        -}
        -
        -// register events with the queue
        -func register(kq int, fds []int, flags int, fflags uint32) error {
        -	changes := make([]unix.Kevent_t, len(fds))
        -
        -	for i, fd := range fds {
        -		// SetKevent converts int to the platform-specific types:
        -		unix.SetKevent(&changes[i], fd, unix.EVFILT_VNODE, flags)
        -		changes[i].Fflags = fflags
        -	}
        -
        -	// register the events
        -	success, err := unix.Kevent(kq, changes, nil, nil)
        -	if success == -1 {
        -		return err
        -	}
        -	return nil
        -}
        -
        -// read retrieves pending events, or waits until an event occurs.
        -// A timeout of nil blocks indefinitely, while 0 polls the queue.
        -func read(kq int, events []unix.Kevent_t, timeout *unix.Timespec) ([]unix.Kevent_t, error) {
        -	n, err := unix.Kevent(kq, nil, events, timeout)
        -	if err != nil {
        -		return nil, err
        -	}
        -	return events[0:n], nil
        -}
        -
        -// durationToTimespec prepares a timeout value
        -func durationToTimespec(d time.Duration) unix.Timespec {
        -	return unix.NsecToTimespec(d.Nanoseconds())
        -}
        diff --git a/vendor/gopkg.in/fsnotify.v1/open_mode_bsd.go b/vendor/gopkg.in/fsnotify.v1/open_mode_bsd.go
        deleted file mode 100644
        index 7d8de1451..000000000
        --- a/vendor/gopkg.in/fsnotify.v1/open_mode_bsd.go
        +++ /dev/null
        @@ -1,11 +0,0 @@
        -// Copyright 2013 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -// +build freebsd openbsd netbsd dragonfly
        -
        -package fsnotify
        -
        -import "golang.org/x/sys/unix"
        -
        -const openMode = unix.O_NONBLOCK | unix.O_RDONLY
        diff --git a/vendor/gopkg.in/fsnotify.v1/open_mode_darwin.go b/vendor/gopkg.in/fsnotify.v1/open_mode_darwin.go
        deleted file mode 100644
        index 9139e1716..000000000
        --- a/vendor/gopkg.in/fsnotify.v1/open_mode_darwin.go
        +++ /dev/null
        @@ -1,12 +0,0 @@
        -// Copyright 2013 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -// +build darwin
        -
        -package fsnotify
        -
        -import "golang.org/x/sys/unix"
        -
        -// note: this constant is not defined on BSD
        -const openMode = unix.O_EVTONLY
        diff --git a/vendor/gopkg.in/fsnotify.v1/windows.go b/vendor/gopkg.in/fsnotify.v1/windows.go
        deleted file mode 100644
        index 09436f31d..000000000
        --- a/vendor/gopkg.in/fsnotify.v1/windows.go
        +++ /dev/null
        @@ -1,561 +0,0 @@
        -// Copyright 2011 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -// +build windows
        -
        -package fsnotify
        -
        -import (
        -	"errors"
        -	"fmt"
        -	"os"
        -	"path/filepath"
        -	"runtime"
        -	"sync"
        -	"syscall"
        -	"unsafe"
        -)
        -
        -// Watcher watches a set of files, delivering events to a channel.
        -type Watcher struct {
        -	Events   chan Event
        -	Errors   chan error
        -	isClosed bool           // Set to true when Close() is first called
        -	mu       sync.Mutex     // Map access
        -	port     syscall.Handle // Handle to completion port
        -	watches  watchMap       // Map of watches (key: i-number)
        -	input    chan *input    // Inputs to the reader are sent on this channel
        -	quit     chan chan<- error
        -}
        -
        -// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events.
        -func NewWatcher() (*Watcher, error) {
        -	port, e := syscall.CreateIoCompletionPort(syscall.InvalidHandle, 0, 0, 0)
        -	if e != nil {
        -		return nil, os.NewSyscallError("CreateIoCompletionPort", e)
        -	}
        -	w := &Watcher{
        -		port:    port,
        -		watches: make(watchMap),
        -		input:   make(chan *input, 1),
        -		Events:  make(chan Event, 50),
        -		Errors:  make(chan error),
        -		quit:    make(chan chan<- error, 1),
        -	}
        -	go w.readEvents()
        -	return w, nil
        -}
        -
        -// Close removes all watches and closes the events channel.
        -func (w *Watcher) Close() error {
        -	if w.isClosed {
        -		return nil
        -	}
        -	w.isClosed = true
        -
        -	// Send "quit" message to the reader goroutine
        -	ch := make(chan error)
        -	w.quit <- ch
        -	if err := w.wakeupReader(); err != nil {
        -		return err
        -	}
        -	return <-ch
        -}
        -
        -// Add starts watching the named file or directory (non-recursively).
        -func (w *Watcher) Add(name string) error {
        -	if w.isClosed {
        -		return errors.New("watcher already closed")
        -	}
        -	in := &input{
        -		op:    opAddWatch,
        -		path:  filepath.Clean(name),
        -		flags: sysFSALLEVENTS,
        -		reply: make(chan error),
        -	}
        -	w.input <- in
        -	if err := w.wakeupReader(); err != nil {
        -		return err
        -	}
        -	return <-in.reply
        -}
        -
        -// Remove stops watching the the named file or directory (non-recursively).
        -func (w *Watcher) Remove(name string) error {
        -	in := &input{
        -		op:    opRemoveWatch,
        -		path:  filepath.Clean(name),
        -		reply: make(chan error),
        -	}
        -	w.input <- in
        -	if err := w.wakeupReader(); err != nil {
        -		return err
        -	}
        -	return <-in.reply
        -}
        -
        -const (
        -	// Options for AddWatch
        -	sysFSONESHOT = 0x80000000
        -	sysFSONLYDIR = 0x1000000
        -
        -	// Events
        -	sysFSACCESS     = 0x1
        -	sysFSALLEVENTS  = 0xfff
        -	sysFSATTRIB     = 0x4
        -	sysFSCLOSE      = 0x18
        -	sysFSCREATE     = 0x100
        -	sysFSDELETE     = 0x200
        -	sysFSDELETESELF = 0x400
        -	sysFSMODIFY     = 0x2
        -	sysFSMOVE       = 0xc0
        -	sysFSMOVEDFROM  = 0x40
        -	sysFSMOVEDTO    = 0x80
        -	sysFSMOVESELF   = 0x800
        -
        -	// Special events
        -	sysFSIGNORED   = 0x8000
        -	sysFSQOVERFLOW = 0x4000
        -)
        -
        -func newEvent(name string, mask uint32) Event {
        -	e := Event{Name: name}
        -	if mask&sysFSCREATE == sysFSCREATE || mask&sysFSMOVEDTO == sysFSMOVEDTO {
        -		e.Op |= Create
        -	}
        -	if mask&sysFSDELETE == sysFSDELETE || mask&sysFSDELETESELF == sysFSDELETESELF {
        -		e.Op |= Remove
        -	}
        -	if mask&sysFSMODIFY == sysFSMODIFY {
        -		e.Op |= Write
        -	}
        -	if mask&sysFSMOVE == sysFSMOVE || mask&sysFSMOVESELF == sysFSMOVESELF || mask&sysFSMOVEDFROM == sysFSMOVEDFROM {
        -		e.Op |= Rename
        -	}
        -	if mask&sysFSATTRIB == sysFSATTRIB {
        -		e.Op |= Chmod
        -	}
        -	return e
        -}
        -
        -const (
        -	opAddWatch = iota
        -	opRemoveWatch
        -)
        -
        -const (
        -	provisional uint64 = 1 << (32 + iota)
        -)
        -
        -type input struct {
        -	op    int
        -	path  string
        -	flags uint32
        -	reply chan error
        -}
        -
        -type inode struct {
        -	handle syscall.Handle
        -	volume uint32
        -	index  uint64
        -}
        -
        -type watch struct {
        -	ov     syscall.Overlapped
        -	ino    *inode            // i-number
        -	path   string            // Directory path
        -	mask   uint64            // Directory itself is being watched with these notify flags
        -	names  map[string]uint64 // Map of names being watched and their notify flags
        -	rename string            // Remembers the old name while renaming a file
        -	buf    [4096]byte
        -}
        -
        -type indexMap map[uint64]*watch
        -type watchMap map[uint32]indexMap
        -
        -func (w *Watcher) wakeupReader() error {
        -	e := syscall.PostQueuedCompletionStatus(w.port, 0, 0, nil)
        -	if e != nil {
        -		return os.NewSyscallError("PostQueuedCompletionStatus", e)
        -	}
        -	return nil
        -}
        -
        -func getDir(pathname string) (dir string, err error) {
        -	attr, e := syscall.GetFileAttributes(syscall.StringToUTF16Ptr(pathname))
        -	if e != nil {
        -		return "", os.NewSyscallError("GetFileAttributes", e)
        -	}
        -	if attr&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 {
        -		dir = pathname
        -	} else {
        -		dir, _ = filepath.Split(pathname)
        -		dir = filepath.Clean(dir)
        -	}
        -	return
        -}
        -
        -func getIno(path string) (ino *inode, err error) {
        -	h, e := syscall.CreateFile(syscall.StringToUTF16Ptr(path),
        -		syscall.FILE_LIST_DIRECTORY,
        -		syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,
        -		nil, syscall.OPEN_EXISTING,
        -		syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OVERLAPPED, 0)
        -	if e != nil {
        -		return nil, os.NewSyscallError("CreateFile", e)
        -	}
        -	var fi syscall.ByHandleFileInformation
        -	if e = syscall.GetFileInformationByHandle(h, &fi); e != nil {
        -		syscall.CloseHandle(h)
        -		return nil, os.NewSyscallError("GetFileInformationByHandle", e)
        -	}
        -	ino = &inode{
        -		handle: h,
        -		volume: fi.VolumeSerialNumber,
        -		index:  uint64(fi.FileIndexHigh)<<32 | uint64(fi.FileIndexLow),
        -	}
        -	return ino, nil
        -}
        -
        -// Must run within the I/O thread.
        -func (m watchMap) get(ino *inode) *watch {
        -	if i := m[ino.volume]; i != nil {
        -		return i[ino.index]
        -	}
        -	return nil
        -}
        -
        -// Must run within the I/O thread.
        -func (m watchMap) set(ino *inode, watch *watch) {
        -	i := m[ino.volume]
        -	if i == nil {
        -		i = make(indexMap)
        -		m[ino.volume] = i
        -	}
        -	i[ino.index] = watch
        -}
        -
        -// Must run within the I/O thread.
        -func (w *Watcher) addWatch(pathname string, flags uint64) error {
        -	dir, err := getDir(pathname)
        -	if err != nil {
        -		return err
        -	}
        -	if flags&sysFSONLYDIR != 0 && pathname != dir {
        -		return nil
        -	}
        -	ino, err := getIno(dir)
        -	if err != nil {
        -		return err
        -	}
        -	w.mu.Lock()
        -	watchEntry := w.watches.get(ino)
        -	w.mu.Unlock()
        -	if watchEntry == nil {
        -		if _, e := syscall.CreateIoCompletionPort(ino.handle, w.port, 0, 0); e != nil {
        -			syscall.CloseHandle(ino.handle)
        -			return os.NewSyscallError("CreateIoCompletionPort", e)
        -		}
        -		watchEntry = &watch{
        -			ino:   ino,
        -			path:  dir,
        -			names: make(map[string]uint64),
        -		}
        -		w.mu.Lock()
        -		w.watches.set(ino, watchEntry)
        -		w.mu.Unlock()
        -		flags |= provisional
        -	} else {
        -		syscall.CloseHandle(ino.handle)
        -	}
        -	if pathname == dir {
        -		watchEntry.mask |= flags
        -	} else {
        -		watchEntry.names[filepath.Base(pathname)] |= flags
        -	}
        -	if err = w.startRead(watchEntry); err != nil {
        -		return err
        -	}
        -	if pathname == dir {
        -		watchEntry.mask &= ^provisional
        -	} else {
        -		watchEntry.names[filepath.Base(pathname)] &= ^provisional
        -	}
        -	return nil
        -}
        -
        -// Must run within the I/O thread.
        -func (w *Watcher) remWatch(pathname string) error {
        -	dir, err := getDir(pathname)
        -	if err != nil {
        -		return err
        -	}
        -	ino, err := getIno(dir)
        -	if err != nil {
        -		return err
        -	}
        -	w.mu.Lock()
        -	watch := w.watches.get(ino)
        -	w.mu.Unlock()
        -	if watch == nil {
        -		return fmt.Errorf("can't remove non-existent watch for: %s", pathname)
        -	}
        -	if pathname == dir {
        -		w.sendEvent(watch.path, watch.mask&sysFSIGNORED)
        -		watch.mask = 0
        -	} else {
        -		name := filepath.Base(pathname)
        -		w.sendEvent(filepath.Join(watch.path, name), watch.names[name]&sysFSIGNORED)
        -		delete(watch.names, name)
        -	}
        -	return w.startRead(watch)
        -}
        -
        -// Must run within the I/O thread.
        -func (w *Watcher) deleteWatch(watch *watch) {
        -	for name, mask := range watch.names {
        -		if mask&provisional == 0 {
        -			w.sendEvent(filepath.Join(watch.path, name), mask&sysFSIGNORED)
        -		}
        -		delete(watch.names, name)
        -	}
        -	if watch.mask != 0 {
        -		if watch.mask&provisional == 0 {
        -			w.sendEvent(watch.path, watch.mask&sysFSIGNORED)
        -		}
        -		watch.mask = 0
        -	}
        -}
        -
        -// Must run within the I/O thread.
        -func (w *Watcher) startRead(watch *watch) error {
        -	if e := syscall.CancelIo(watch.ino.handle); e != nil {
        -		w.Errors <- os.NewSyscallError("CancelIo", e)
        -		w.deleteWatch(watch)
        -	}
        -	mask := toWindowsFlags(watch.mask)
        -	for _, m := range watch.names {
        -		mask |= toWindowsFlags(m)
        -	}
        -	if mask == 0 {
        -		if e := syscall.CloseHandle(watch.ino.handle); e != nil {
        -			w.Errors <- os.NewSyscallError("CloseHandle", e)
        -		}
        -		w.mu.Lock()
        -		delete(w.watches[watch.ino.volume], watch.ino.index)
        -		w.mu.Unlock()
        -		return nil
        -	}
        -	e := syscall.ReadDirectoryChanges(watch.ino.handle, &watch.buf[0],
        -		uint32(unsafe.Sizeof(watch.buf)), false, mask, nil, &watch.ov, 0)
        -	if e != nil {
        -		err := os.NewSyscallError("ReadDirectoryChanges", e)
        -		if e == syscall.ERROR_ACCESS_DENIED && watch.mask&provisional == 0 {
        -			// Watched directory was probably removed
        -			if w.sendEvent(watch.path, watch.mask&sysFSDELETESELF) {
        -				if watch.mask&sysFSONESHOT != 0 {
        -					watch.mask = 0
        -				}
        -			}
        -			err = nil
        -		}
        -		w.deleteWatch(watch)
        -		w.startRead(watch)
        -		return err
        -	}
        -	return nil
        -}
        -
        -// readEvents reads from the I/O completion port, converts the
        -// received events into Event objects and sends them via the Events channel.
        -// Entry point to the I/O thread.
        -func (w *Watcher) readEvents() {
        -	var (
        -		n, key uint32
        -		ov     *syscall.Overlapped
        -	)
        -	runtime.LockOSThread()
        -
        -	for {
        -		e := syscall.GetQueuedCompletionStatus(w.port, &n, &key, &ov, syscall.INFINITE)
        -		watch := (*watch)(unsafe.Pointer(ov))
        -
        -		if watch == nil {
        -			select {
        -			case ch := <-w.quit:
        -				w.mu.Lock()
        -				var indexes []indexMap
        -				for _, index := range w.watches {
        -					indexes = append(indexes, index)
        -				}
        -				w.mu.Unlock()
        -				for _, index := range indexes {
        -					for _, watch := range index {
        -						w.deleteWatch(watch)
        -						w.startRead(watch)
        -					}
        -				}
        -				var err error
        -				if e := syscall.CloseHandle(w.port); e != nil {
        -					err = os.NewSyscallError("CloseHandle", e)
        -				}
        -				close(w.Events)
        -				close(w.Errors)
        -				ch <- err
        -				return
        -			case in := <-w.input:
        -				switch in.op {
        -				case opAddWatch:
        -					in.reply <- w.addWatch(in.path, uint64(in.flags))
        -				case opRemoveWatch:
        -					in.reply <- w.remWatch(in.path)
        -				}
        -			default:
        -			}
        -			continue
        -		}
        -
        -		switch e {
        -		case syscall.ERROR_MORE_DATA:
        -			if watch == nil {
        -				w.Errors <- errors.New("ERROR_MORE_DATA has unexpectedly null lpOverlapped buffer")
        -			} else {
        -				// The i/o succeeded but the buffer is full.
        -				// In theory we should be building up a full packet.
        -				// In practice we can get away with just carrying on.
        -				n = uint32(unsafe.Sizeof(watch.buf))
        -			}
        -		case syscall.ERROR_ACCESS_DENIED:
        -			// Watched directory was probably removed
        -			w.sendEvent(watch.path, watch.mask&sysFSDELETESELF)
        -			w.deleteWatch(watch)
        -			w.startRead(watch)
        -			continue
        -		case syscall.ERROR_OPERATION_ABORTED:
        -			// CancelIo was called on this handle
        -			continue
        -		default:
        -			w.Errors <- os.NewSyscallError("GetQueuedCompletionPort", e)
        -			continue
        -		case nil:
        -		}
        -
        -		var offset uint32
        -		for {
        -			if n == 0 {
        -				w.Events <- newEvent("", sysFSQOVERFLOW)
        -				w.Errors <- errors.New("short read in readEvents()")
        -				break
        -			}
        -
        -			// Point "raw" to the event in the buffer
        -			raw := (*syscall.FileNotifyInformation)(unsafe.Pointer(&watch.buf[offset]))
        -			buf := (*[syscall.MAX_PATH]uint16)(unsafe.Pointer(&raw.FileName))
        -			name := syscall.UTF16ToString(buf[:raw.FileNameLength/2])
        -			fullname := filepath.Join(watch.path, name)
        -
        -			var mask uint64
        -			switch raw.Action {
        -			case syscall.FILE_ACTION_REMOVED:
        -				mask = sysFSDELETESELF
        -			case syscall.FILE_ACTION_MODIFIED:
        -				mask = sysFSMODIFY
        -			case syscall.FILE_ACTION_RENAMED_OLD_NAME:
        -				watch.rename = name
        -			case syscall.FILE_ACTION_RENAMED_NEW_NAME:
        -				if watch.names[watch.rename] != 0 {
        -					watch.names[name] |= watch.names[watch.rename]
        -					delete(watch.names, watch.rename)
        -					mask = sysFSMOVESELF
        -				}
        -			}
        -
        -			sendNameEvent := func() {
        -				if w.sendEvent(fullname, watch.names[name]&mask) {
        -					if watch.names[name]&sysFSONESHOT != 0 {
        -						delete(watch.names, name)
        -					}
        -				}
        -			}
        -			if raw.Action != syscall.FILE_ACTION_RENAMED_NEW_NAME {
        -				sendNameEvent()
        -			}
        -			if raw.Action == syscall.FILE_ACTION_REMOVED {
        -				w.sendEvent(fullname, watch.names[name]&sysFSIGNORED)
        -				delete(watch.names, name)
        -			}
        -			if w.sendEvent(fullname, watch.mask&toFSnotifyFlags(raw.Action)) {
        -				if watch.mask&sysFSONESHOT != 0 {
        -					watch.mask = 0
        -				}
        -			}
        -			if raw.Action == syscall.FILE_ACTION_RENAMED_NEW_NAME {
        -				fullname = filepath.Join(watch.path, watch.rename)
        -				sendNameEvent()
        -			}
        -
        -			// Move to the next event in the buffer
        -			if raw.NextEntryOffset == 0 {
        -				break
        -			}
        -			offset += raw.NextEntryOffset
        -
        -			// Error!
        -			if offset >= n {
        -				w.Errors <- errors.New("Windows system assumed buffer larger than it is, events have likely been missed.")
        -				break
        -			}
        -		}
        -
        -		if err := w.startRead(watch); err != nil {
        -			w.Errors <- err
        -		}
        -	}
        -}
        -
        -func (w *Watcher) sendEvent(name string, mask uint64) bool {
        -	if mask == 0 {
        -		return false
        -	}
        -	event := newEvent(name, uint32(mask))
        -	select {
        -	case ch := <-w.quit:
        -		w.quit <- ch
        -	case w.Events <- event:
        -	}
        -	return true
        -}
        -
        -func toWindowsFlags(mask uint64) uint32 {
        -	var m uint32
        -	if mask&sysFSACCESS != 0 {
        -		m |= syscall.FILE_NOTIFY_CHANGE_LAST_ACCESS
        -	}
        -	if mask&sysFSMODIFY != 0 {
        -		m |= syscall.FILE_NOTIFY_CHANGE_LAST_WRITE
        -	}
        -	if mask&sysFSATTRIB != 0 {
        -		m |= syscall.FILE_NOTIFY_CHANGE_ATTRIBUTES
        -	}
        -	if mask&(sysFSMOVE|sysFSCREATE|sysFSDELETE) != 0 {
        -		m |= syscall.FILE_NOTIFY_CHANGE_FILE_NAME | syscall.FILE_NOTIFY_CHANGE_DIR_NAME
        -	}
        -	return m
        -}
        -
        -func toFSnotifyFlags(action uint32) uint64 {
        -	switch action {
        -	case syscall.FILE_ACTION_ADDED:
        -		return sysFSCREATE
        -	case syscall.FILE_ACTION_REMOVED:
        -		return sysFSDELETE
        -	case syscall.FILE_ACTION_MODIFIED:
        -		return sysFSMODIFY
        -	case syscall.FILE_ACTION_RENAMED_OLD_NAME:
        -		return sysFSMOVEDFROM
        -	case syscall.FILE_ACTION_RENAMED_NEW_NAME:
        -		return sysFSMOVEDTO
        -	}
        -	return 0
        -}
        diff --git a/vendor/github.com/go-ini/ini/.gitignore b/vendor/gopkg.in/ini.v1/.gitignore
        similarity index 100%
        rename from vendor/github.com/go-ini/ini/.gitignore
        rename to vendor/gopkg.in/ini.v1/.gitignore
        diff --git a/vendor/github.com/go-ini/ini/LICENSE b/vendor/gopkg.in/ini.v1/LICENSE
        similarity index 100%
        rename from vendor/github.com/go-ini/ini/LICENSE
        rename to vendor/gopkg.in/ini.v1/LICENSE
        diff --git a/vendor/gopkg.in/ini.v1/Makefile b/vendor/gopkg.in/ini.v1/Makefile
        new file mode 100644
        index 000000000..f3b0dae2d
        --- /dev/null
        +++ b/vendor/gopkg.in/ini.v1/Makefile
        @@ -0,0 +1,15 @@
        +.PHONY: build test bench vet coverage
        +
        +build: vet bench
        +
        +test:
        +	go test -v -cover -race
        +
        +bench:
        +	go test -v -cover -test.bench=. -test.benchmem
        +
        +vet:
        +	go vet
        +
        +coverage:
        +	go test -coverprofile=c.out && go tool cover -html=c.out && rm c.out
        diff --git a/vendor/gopkg.in/ini.v1/README.md b/vendor/gopkg.in/ini.v1/README.md
        new file mode 100644
        index 000000000..5d65658b2
        --- /dev/null
        +++ b/vendor/gopkg.in/ini.v1/README.md
        @@ -0,0 +1,43 @@
        +# INI
        +
        +[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/go-ini/ini/Go?logo=github&style=for-the-badge)](https://github.com/go-ini/ini/actions?query=workflow%3AGo)
        +[![codecov](https://img.shields.io/codecov/c/github/go-ini/ini/master?logo=codecov&style=for-the-badge)](https://codecov.io/gh/go-ini/ini)
        +[![GoDoc](https://img.shields.io/badge/GoDoc-Reference-blue?style=for-the-badge&logo=go)](https://pkg.go.dev/github.com/go-ini/ini?tab=doc)
        +[![Sourcegraph](https://img.shields.io/badge/view%20on-Sourcegraph-brightgreen.svg?style=for-the-badge&logo=sourcegraph)](https://sourcegraph.com/github.com/go-ini/ini)
        +
        +![](https://avatars0.githubusercontent.com/u/10216035?v=3&s=200)
        +
        +Package ini provides INI file read and write functionality in Go.
        +
        +## Features
        +
        +- Load from multiple data sources(file, `[]byte`, `io.Reader` and `io.ReadCloser`) with overwrites.
        +- Read with recursion values.
        +- Read with parent-child sections.
        +- Read with auto-increment key names.
        +- Read with multiple-line values.
        +- Read with tons of helper methods.
        +- Read and convert values to Go types.
        +- Read and **WRITE** comments of sections and keys.
        +- Manipulate sections, keys and comments with ease.
        +- Keep sections and keys in order as you parse and save.
        +
        +## Installation
        +
        +The minimum requirement of Go is **1.6**.
        +
        +```sh
        +$ go get gopkg.in/ini.v1
        +```
        +
        +Please add `-u` flag to update in the future.
        +
        +## Getting Help
        +
        +- [Getting Started](https://ini.unknwon.io/docs/intro/getting_started)
        +- [API Documentation](https://gowalker.org/gopkg.in/ini.v1)
        +- 中国大陆镜像:https://ini.unknwon.cn
        +
        +## License
        +
        +This project is under Apache v2 License. See the [LICENSE](LICENSE) file for the full license text.
        diff --git a/vendor/gopkg.in/ini.v1/codecov.yml b/vendor/gopkg.in/ini.v1/codecov.yml
        new file mode 100644
        index 000000000..fc947f230
        --- /dev/null
        +++ b/vendor/gopkg.in/ini.v1/codecov.yml
        @@ -0,0 +1,9 @@
        +coverage:
        +  range: "60...95"
        +  status:
        +    project:
        +      default:
        +        threshold: 1%
        +
        +comment:
        +  layout: 'diff, files'
        diff --git a/vendor/gopkg.in/ini.v1/data_source.go b/vendor/gopkg.in/ini.v1/data_source.go
        new file mode 100644
        index 000000000..c3a541f1d
        --- /dev/null
        +++ b/vendor/gopkg.in/ini.v1/data_source.go
        @@ -0,0 +1,76 @@
        +// Copyright 2019 Unknwon
        +//
        +// Licensed under the Apache License, Version 2.0 (the "License"): you may
        +// not use this file except in compliance with the License. You may obtain
        +// a copy of the License at
        +//
        +//     http://www.apache.org/licenses/LICENSE-2.0
        +//
        +// Unless required by applicable law or agreed to in writing, software
        +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
        +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
        +// License for the specific language governing permissions and limitations
        +// under the License.
        +
        +package ini
        +
        +import (
        +	"bytes"
        +	"fmt"
        +	"io"
        +	"io/ioutil"
        +	"os"
        +)
        +
        +var (
        +	_ dataSource = (*sourceFile)(nil)
        +	_ dataSource = (*sourceData)(nil)
        +	_ dataSource = (*sourceReadCloser)(nil)
        +)
        +
        +// dataSource is an interface that returns object which can be read and closed.
        +type dataSource interface {
        +	ReadCloser() (io.ReadCloser, error)
        +}
        +
        +// sourceFile represents an object that contains content on the local file system.
        +type sourceFile struct {
        +	name string
        +}
        +
        +func (s sourceFile) ReadCloser() (_ io.ReadCloser, err error) {
        +	return os.Open(s.name)
        +}
        +
        +// sourceData represents an object that contains content in memory.
        +type sourceData struct {
        +	data []byte
        +}
        +
        +func (s *sourceData) ReadCloser() (io.ReadCloser, error) {
        +	return ioutil.NopCloser(bytes.NewReader(s.data)), nil
        +}
        +
        +// sourceReadCloser represents an input stream with Close method.
        +type sourceReadCloser struct {
        +	reader io.ReadCloser
        +}
        +
        +func (s *sourceReadCloser) ReadCloser() (io.ReadCloser, error) {
        +	return s.reader, nil
        +}
        +
        +func parseDataSource(source interface{}) (dataSource, error) {
        +	switch s := source.(type) {
        +	case string:
        +		return sourceFile{s}, nil
        +	case []byte:
        +		return &sourceData{s}, nil
        +	case io.ReadCloser:
        +		return &sourceReadCloser{s}, nil
        +	case io.Reader:
        +		return &sourceReadCloser{ioutil.NopCloser(s)}, nil
        +	default:
        +		return nil, fmt.Errorf("error parsing data source: unknown type %q", s)
        +	}
        +}
        diff --git a/vendor/gopkg.in/ini.v1/deprecated.go b/vendor/gopkg.in/ini.v1/deprecated.go
        new file mode 100644
        index 000000000..e8bda06e6
        --- /dev/null
        +++ b/vendor/gopkg.in/ini.v1/deprecated.go
        @@ -0,0 +1,25 @@
        +// Copyright 2019 Unknwon
        +//
        +// Licensed under the Apache License, Version 2.0 (the "License"): you may
        +// not use this file except in compliance with the License. You may obtain
        +// a copy of the License at
        +//
        +//     http://www.apache.org/licenses/LICENSE-2.0
        +//
        +// Unless required by applicable law or agreed to in writing, software
        +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
        +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
        +// License for the specific language governing permissions and limitations
        +// under the License.
        +
        +package ini
        +
        +const (
        +	// Deprecated: Use "DefaultSection" instead.
        +	DEFAULT_SECTION = DefaultSection
        +)
        +
        +var (
        +	// Deprecated: AllCapsUnderscore converts to format ALL_CAPS_UNDERSCORE.
        +	AllCapsUnderscore = SnackCase
        +)
        diff --git a/vendor/gopkg.in/ini.v1/error.go b/vendor/gopkg.in/ini.v1/error.go
        new file mode 100644
        index 000000000..d88347c54
        --- /dev/null
        +++ b/vendor/gopkg.in/ini.v1/error.go
        @@ -0,0 +1,34 @@
        +// Copyright 2016 Unknwon
        +//
        +// Licensed under the Apache License, Version 2.0 (the "License"): you may
        +// not use this file except in compliance with the License. You may obtain
        +// a copy of the License at
        +//
        +//     http://www.apache.org/licenses/LICENSE-2.0
        +//
        +// Unless required by applicable law or agreed to in writing, software
        +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
        +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
        +// License for the specific language governing permissions and limitations
        +// under the License.
        +
        +package ini
        +
        +import (
        +	"fmt"
        +)
        +
        +// ErrDelimiterNotFound indicates the error type of no delimiter is found which there should be one.
        +type ErrDelimiterNotFound struct {
        +	Line string
        +}
        +
        +// IsErrDelimiterNotFound returns true if the given error is an instance of ErrDelimiterNotFound.
        +func IsErrDelimiterNotFound(err error) bool {
        +	_, ok := err.(ErrDelimiterNotFound)
        +	return ok
        +}
        +
        +func (err ErrDelimiterNotFound) Error() string {
        +	return fmt.Sprintf("key-value delimiter not found: %s", err.Line)
        +}
        diff --git a/vendor/gopkg.in/ini.v1/file.go b/vendor/gopkg.in/ini.v1/file.go
        new file mode 100644
        index 000000000..f95606f90
        --- /dev/null
        +++ b/vendor/gopkg.in/ini.v1/file.go
        @@ -0,0 +1,509 @@
        +// Copyright 2017 Unknwon
        +//
        +// Licensed under the Apache License, Version 2.0 (the "License"): you may
        +// not use this file except in compliance with the License. You may obtain
        +// a copy of the License at
        +//
        +//     http://www.apache.org/licenses/LICENSE-2.0
        +//
        +// Unless required by applicable law or agreed to in writing, software
        +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
        +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
        +// License for the specific language governing permissions and limitations
        +// under the License.
        +
        +package ini
        +
        +import (
        +	"bytes"
        +	"errors"
        +	"fmt"
        +	"io"
        +	"io/ioutil"
        +	"os"
        +	"strings"
        +	"sync"
        +)
        +
        +// File represents a combination of one or more INI files in memory.
        +type File struct {
        +	options     LoadOptions
        +	dataSources []dataSource
        +
        +	// Should make things safe, but sometimes doesn't matter.
        +	BlockMode bool
        +	lock      sync.RWMutex
        +
        +	// To keep data in order.
        +	sectionList []string
        +	// To keep track of the index of a section with same name.
        +	// This meta list is only used with non-unique section names are allowed.
        +	sectionIndexes []int
        +
        +	// Actual data is stored here.
        +	sections map[string][]*Section
        +
        +	NameMapper
        +	ValueMapper
        +}
        +
        +// newFile initializes File object with given data sources.
        +func newFile(dataSources []dataSource, opts LoadOptions) *File {
        +	if len(opts.KeyValueDelimiters) == 0 {
        +		opts.KeyValueDelimiters = "=:"
        +	}
        +	if len(opts.KeyValueDelimiterOnWrite) == 0 {
        +		opts.KeyValueDelimiterOnWrite = "="
        +	}
        +
        +	return &File{
        +		BlockMode:   true,
        +		dataSources: dataSources,
        +		sections:    make(map[string][]*Section),
        +		options:     opts,
        +	}
        +}
        +
        +// Empty returns an empty file object.
        +func Empty(opts ...LoadOptions) *File {
        +	var opt LoadOptions
        +	if len(opts) > 0 {
        +		opt = opts[0]
        +	}
        +
        +	// Ignore error here, we are sure our data is good.
        +	f, _ := LoadSources(opt, []byte(""))
        +	return f
        +}
        +
        +// NewSection creates a new section.
        +func (f *File) NewSection(name string) (*Section, error) {
        +	if len(name) == 0 {
        +		return nil, errors.New("empty section name")
        +	}
        +
        +	if f.options.Insensitive && name != DefaultSection {
        +		name = strings.ToLower(name)
        +	}
        +
        +	if f.BlockMode {
        +		f.lock.Lock()
        +		defer f.lock.Unlock()
        +	}
        +
        +	if !f.options.AllowNonUniqueSections && inSlice(name, f.sectionList) {
        +		return f.sections[name][0], nil
        +	}
        +
        +	f.sectionList = append(f.sectionList, name)
        +
        +	// NOTE: Append to indexes must happen before appending to sections,
        +	// otherwise index will have off-by-one problem.
        +	f.sectionIndexes = append(f.sectionIndexes, len(f.sections[name]))
        +
        +	sec := newSection(f, name)
        +	f.sections[name] = append(f.sections[name], sec)
        +
        +	return sec, nil
        +}
        +
        +// NewRawSection creates a new section with an unparseable body.
        +func (f *File) NewRawSection(name, body string) (*Section, error) {
        +	section, err := f.NewSection(name)
        +	if err != nil {
        +		return nil, err
        +	}
        +
        +	section.isRawSection = true
        +	section.rawBody = body
        +	return section, nil
        +}
        +
        +// NewSections creates a list of sections.
        +func (f *File) NewSections(names ...string) (err error) {
        +	for _, name := range names {
        +		if _, err = f.NewSection(name); err != nil {
        +			return err
        +		}
        +	}
        +	return nil
        +}
        +
        +// GetSection returns section by given name.
        +func (f *File) GetSection(name string) (*Section, error) {
        +	secs, err := f.SectionsByName(name)
        +	if err != nil {
        +		return nil, err
        +	}
        +
        +	return secs[0], err
        +}
        +
        +// SectionsByName returns all sections with given name.
        +func (f *File) SectionsByName(name string) ([]*Section, error) {
        +	if len(name) == 0 {
        +		name = DefaultSection
        +	}
        +	if f.options.Insensitive {
        +		name = strings.ToLower(name)
        +	}
        +
        +	if f.BlockMode {
        +		f.lock.RLock()
        +		defer f.lock.RUnlock()
        +	}
        +
        +	secs := f.sections[name]
        +	if len(secs) == 0 {
        +		return nil, fmt.Errorf("section %q does not exist", name)
        +	}
        +
        +	return secs, nil
        +}
        +
        +// Section assumes named section exists and returns a zero-value when not.
        +func (f *File) Section(name string) *Section {
        +	sec, err := f.GetSection(name)
        +	if err != nil {
        +		// Note: It's OK here because the only possible error is empty section name,
        +		// but if it's empty, this piece of code won't be executed.
        +		sec, _ = f.NewSection(name)
        +		return sec
        +	}
        +	return sec
        +}
        +
        +// SectionWithIndex assumes named section exists and returns a new section when not.
        +func (f *File) SectionWithIndex(name string, index int) *Section {
        +	secs, err := f.SectionsByName(name)
        +	if err != nil || len(secs) <= index {
        +		// NOTE: It's OK here because the only possible error is empty section name,
        +		// but if it's empty, this piece of code won't be executed.
        +		newSec, _ := f.NewSection(name)
        +		return newSec
        +	}
        +
        +	return secs[index]
        +}
        +
        +// Sections returns a list of Section stored in the current instance.
        +func (f *File) Sections() []*Section {
        +	if f.BlockMode {
        +		f.lock.RLock()
        +		defer f.lock.RUnlock()
        +	}
        +
        +	sections := make([]*Section, len(f.sectionList))
        +	for i, name := range f.sectionList {
        +		sections[i] = f.sections[name][f.sectionIndexes[i]]
        +	}
        +	return sections
        +}
        +
        +// ChildSections returns a list of child sections of given section name.
        +func (f *File) ChildSections(name string) []*Section {
        +	return f.Section(name).ChildSections()
        +}
        +
        +// SectionStrings returns list of section names.
        +func (f *File) SectionStrings() []string {
        +	list := make([]string, len(f.sectionList))
        +	copy(list, f.sectionList)
        +	return list
        +}
        +
        +// DeleteSection deletes a section or all sections with given name.
        +func (f *File) DeleteSection(name string) {
        +	secs, err := f.SectionsByName(name)
        +	if err != nil {
        +		return
        +	}
        +
        +	for i := 0; i < len(secs); i++ {
        +		// For non-unique sections, it is always needed to remove the first one so
        +		// in the next iteration, the subsequent section continue having index 0.
        +		// Ignoring the error as index 0 never returns an error.
        +		_ = f.DeleteSectionWithIndex(name, 0)
        +	}
        +}
        +
        +// DeleteSectionWithIndex deletes a section with given name and index.
        +func (f *File) DeleteSectionWithIndex(name string, index int) error {
        +	if !f.options.AllowNonUniqueSections && index != 0 {
        +		return fmt.Errorf("delete section with non-zero index is only allowed when non-unique sections is enabled")
        +	}
        +
        +	if len(name) == 0 {
        +		name = DefaultSection
        +	}
        +	if f.options.Insensitive {
        +		name = strings.ToLower(name)
        +	}
        +
        +	if f.BlockMode {
        +		f.lock.Lock()
        +		defer f.lock.Unlock()
        +	}
        +
        +	// Count occurrences of the sections
        +	occurrences := 0
        +
        +	sectionListCopy := make([]string, len(f.sectionList))
        +	copy(sectionListCopy, f.sectionList)
        +
        +	for i, s := range sectionListCopy {
        +		if s != name {
        +			continue
        +		}
        +
        +		if occurrences == index {
        +			if len(f.sections[name]) <= 1 {
        +				delete(f.sections, name) // The last one in the map
        +			} else {
        +				f.sections[name] = append(f.sections[name][:index], f.sections[name][index+1:]...)
        +			}
        +
        +			// Fix section lists
        +			f.sectionList = append(f.sectionList[:i], f.sectionList[i+1:]...)
        +			f.sectionIndexes = append(f.sectionIndexes[:i], f.sectionIndexes[i+1:]...)
        +
        +		} else if occurrences > index {
        +			// Fix the indices of all following sections with this name.
        +			f.sectionIndexes[i-1]--
        +		}
        +
        +		occurrences++
        +	}
        +
        +	return nil
        +}
        +
        +func (f *File) reload(s dataSource) error {
        +	r, err := s.ReadCloser()
        +	if err != nil {
        +		return err
        +	}
        +	defer r.Close()
        +
        +	return f.parse(r)
        +}
        +
        +// Reload reloads and parses all data sources.
        +func (f *File) Reload() (err error) {
        +	for _, s := range f.dataSources {
        +		if err = f.reload(s); err != nil {
        +			// In loose mode, we create an empty default section for nonexistent files.
        +			if os.IsNotExist(err) && f.options.Loose {
        +				_ = f.parse(bytes.NewBuffer(nil))
        +				continue
        +			}
        +			return err
        +		}
        +	}
        +	return nil
        +}
        +
        +// Append appends one or more data sources and reloads automatically.
        +func (f *File) Append(source interface{}, others ...interface{}) error {
        +	ds, err := parseDataSource(source)
        +	if err != nil {
        +		return err
        +	}
        +	f.dataSources = append(f.dataSources, ds)
        +	for _, s := range others {
        +		ds, err = parseDataSource(s)
        +		if err != nil {
        +			return err
        +		}
        +		f.dataSources = append(f.dataSources, ds)
        +	}
        +	return f.Reload()
        +}
        +
        +func (f *File) writeToBuffer(indent string) (*bytes.Buffer, error) {
        +	equalSign := DefaultFormatLeft + f.options.KeyValueDelimiterOnWrite + DefaultFormatRight
        +
        +	if PrettyFormat || PrettyEqual {
        +		equalSign = fmt.Sprintf(" %s ", f.options.KeyValueDelimiterOnWrite)
        +	}
        +
        +	// Use buffer to make sure target is safe until finish encoding.
        +	buf := bytes.NewBuffer(nil)
        +	for i, sname := range f.sectionList {
        +		sec := f.SectionWithIndex(sname, f.sectionIndexes[i])
        +		if len(sec.Comment) > 0 {
        +			// Support multiline comments
        +			lines := strings.Split(sec.Comment, LineBreak)
        +			for i := range lines {
        +				if lines[i][0] != '#' && lines[i][0] != ';' {
        +					lines[i] = "; " + lines[i]
        +				} else {
        +					lines[i] = lines[i][:1] + " " + strings.TrimSpace(lines[i][1:])
        +				}
        +
        +				if _, err := buf.WriteString(lines[i] + LineBreak); err != nil {
        +					return nil, err
        +				}
        +			}
        +		}
        +
        +		if i > 0 || DefaultHeader {
        +			if _, err := buf.WriteString("[" + sname + "]" + LineBreak); err != nil {
        +				return nil, err
        +			}
        +		} else {
        +			// Write nothing if default section is empty
        +			if len(sec.keyList) == 0 {
        +				continue
        +			}
        +		}
        +
        +		if sec.isRawSection {
        +			if _, err := buf.WriteString(sec.rawBody); err != nil {
        +				return nil, err
        +			}
        +
        +			if PrettySection {
        +				// Put a line between sections
        +				if _, err := buf.WriteString(LineBreak); err != nil {
        +					return nil, err
        +				}
        +			}
        +			continue
        +		}
        +
        +		// Count and generate alignment length and buffer spaces using the
        +		// longest key. Keys may be modified if they contain certain characters so
        +		// we need to take that into account in our calculation.
        +		alignLength := 0
        +		if PrettyFormat {
        +			for _, kname := range sec.keyList {
        +				keyLength := len(kname)
        +				// First case will surround key by ` and second by """
        +				if strings.Contains(kname, "\"") || strings.ContainsAny(kname, f.options.KeyValueDelimiters) {
        +					keyLength += 2
        +				} else if strings.Contains(kname, "`") {
        +					keyLength += 6
        +				}
        +
        +				if keyLength > alignLength {
        +					alignLength = keyLength
        +				}
        +			}
        +		}
        +		alignSpaces := bytes.Repeat([]byte(" "), alignLength)
        +
        +	KeyList:
        +		for _, kname := range sec.keyList {
        +			key := sec.Key(kname)
        +			if len(key.Comment) > 0 {
        +				if len(indent) > 0 && sname != DefaultSection {
        +					buf.WriteString(indent)
        +				}
        +
        +				// Support multiline comments
        +				lines := strings.Split(key.Comment, LineBreak)
        +				for i := range lines {
        +					if lines[i][0] != '#' && lines[i][0] != ';' {
        +						lines[i] = "; " + strings.TrimSpace(lines[i])
        +					} else {
        +						lines[i] = lines[i][:1] + " " + strings.TrimSpace(lines[i][1:])
        +					}
        +
        +					if _, err := buf.WriteString(lines[i] + LineBreak); err != nil {
        +						return nil, err
        +					}
        +				}
        +			}
        +
        +			if len(indent) > 0 && sname != DefaultSection {
        +				buf.WriteString(indent)
        +			}
        +
        +			switch {
        +			case key.isAutoIncrement:
        +				kname = "-"
        +			case strings.Contains(kname, "\"") || strings.ContainsAny(kname, f.options.KeyValueDelimiters):
        +				kname = "`" + kname + "`"
        +			case strings.Contains(kname, "`"):
        +				kname = `"""` + kname + `"""`
        +			}
        +
        +			for _, val := range key.ValueWithShadows() {
        +				if _, err := buf.WriteString(kname); err != nil {
        +					return nil, err
        +				}
        +
        +				if key.isBooleanType {
        +					if kname != sec.keyList[len(sec.keyList)-1] {
        +						buf.WriteString(LineBreak)
        +					}
        +					continue KeyList
        +				}
        +
        +				// Write out alignment spaces before "=" sign
        +				if PrettyFormat {
        +					buf.Write(alignSpaces[:alignLength-len(kname)])
        +				}
        +
        +				// In case key value contains "\n", "`", "\"", "#" or ";"
        +				if strings.ContainsAny(val, "\n`") {
        +					val = `"""` + val + `"""`
        +				} else if !f.options.IgnoreInlineComment && strings.ContainsAny(val, "#;") {
        +					val = "`" + val + "`"
        +				}
        +				if _, err := buf.WriteString(equalSign + val + LineBreak); err != nil {
        +					return nil, err
        +				}
        +			}
        +
        +			for _, val := range key.nestedValues {
        +				if _, err := buf.WriteString(indent + "  " + val + LineBreak); err != nil {
        +					return nil, err
        +				}
        +			}
        +		}
        +
        +		if PrettySection {
        +			// Put a line between sections
        +			if _, err := buf.WriteString(LineBreak); err != nil {
        +				return nil, err
        +			}
        +		}
        +	}
        +
        +	return buf, nil
        +}
        +
        +// WriteToIndent writes content into io.Writer with given indention.
        +// If PrettyFormat has been set to be true,
        +// it will align "=" sign with spaces under each section.
        +func (f *File) WriteToIndent(w io.Writer, indent string) (int64, error) {
        +	buf, err := f.writeToBuffer(indent)
        +	if err != nil {
        +		return 0, err
        +	}
        +	return buf.WriteTo(w)
        +}
        +
        +// WriteTo writes file content into io.Writer.
        +func (f *File) WriteTo(w io.Writer) (int64, error) {
        +	return f.WriteToIndent(w, "")
        +}
        +
        +// SaveToIndent writes content to file system with given value indention.
        +func (f *File) SaveToIndent(filename, indent string) error {
        +	// Note: Because we are truncating with os.Create,
        +	// 	so it's safer to save to a temporary file location and rename afte done.
        +	buf, err := f.writeToBuffer(indent)
        +	if err != nil {
        +		return err
        +	}
        +
        +	return ioutil.WriteFile(filename, buf.Bytes(), 0666)
        +}
        +
        +// SaveTo writes content to file system.
        +func (f *File) SaveTo(filename string) error {
        +	return f.SaveToIndent(filename, "")
        +}
        diff --git a/vendor/gopkg.in/ini.v1/helper.go b/vendor/gopkg.in/ini.v1/helper.go
        new file mode 100644
        index 000000000..f9d80a682
        --- /dev/null
        +++ b/vendor/gopkg.in/ini.v1/helper.go
        @@ -0,0 +1,24 @@
        +// Copyright 2019 Unknwon
        +//
        +// Licensed under the Apache License, Version 2.0 (the "License"): you may
        +// not use this file except in compliance with the License. You may obtain
        +// a copy of the License at
        +//
        +//     http://www.apache.org/licenses/LICENSE-2.0
        +//
        +// Unless required by applicable law or agreed to in writing, software
        +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
        +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
        +// License for the specific language governing permissions and limitations
        +// under the License.
        +
        +package ini
        +
        +func inSlice(str string, s []string) bool {
        +	for _, v := range s {
        +		if str == v {
        +			return true
        +		}
        +	}
        +	return false
        +}
        diff --git a/vendor/gopkg.in/ini.v1/ini.go b/vendor/gopkg.in/ini.v1/ini.go
        new file mode 100644
        index 000000000..2961543f9
        --- /dev/null
        +++ b/vendor/gopkg.in/ini.v1/ini.go
        @@ -0,0 +1,168 @@
        +// +build go1.6
        +
        +// Copyright 2014 Unknwon
        +//
        +// Licensed under the Apache License, Version 2.0 (the "License"): you may
        +// not use this file except in compliance with the License. You may obtain
        +// a copy of the License at
        +//
        +//     http://www.apache.org/licenses/LICENSE-2.0
        +//
        +// Unless required by applicable law or agreed to in writing, software
        +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
        +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
        +// License for the specific language governing permissions and limitations
        +// under the License.
        +
        +// Package ini provides INI file read and write functionality in Go.
        +package ini
        +
        +import (
        +	"os"
        +	"regexp"
        +	"runtime"
        +	"strings"
        +)
        +
        +const (
        +	// DefaultSection is the name of default section. You can use this constant or the string literal.
        +	// In most of cases, an empty string is all you need to access the section.
        +	DefaultSection = "DEFAULT"
        +
        +	// Maximum allowed depth when recursively substituing variable names.
        +	depthValues = 99
        +)
        +
        +var (
        +	// LineBreak is the delimiter to determine or compose a new line.
        +	// This variable will be changed to "\r\n" automatically on Windows at package init time.
        +	LineBreak = "\n"
        +
        +	// Variable regexp pattern: %(variable)s
        +	varPattern = regexp.MustCompile(`%\(([^)]+)\)s`)
        +
        +	// DefaultHeader explicitly writes default section header.
        +	DefaultHeader = false
        +
        +	// PrettySection indicates whether to put a line between sections.
        +	PrettySection = true
        +	// PrettyFormat indicates whether to align "=" sign with spaces to produce pretty output
        +	// or reduce all possible spaces for compact format.
        +	PrettyFormat = true
        +	// PrettyEqual places spaces around "=" sign even when PrettyFormat is false.
        +	PrettyEqual = false
        +	// DefaultFormatLeft places custom spaces on the left when PrettyFormat and PrettyEqual are both disabled.
        +	DefaultFormatLeft = ""
        +	// DefaultFormatRight places custom spaces on the right when PrettyFormat and PrettyEqual are both disabled.
        +	DefaultFormatRight = ""
        +)
        +
        +var inTest = len(os.Args) > 0 && strings.HasSuffix(strings.TrimSuffix(os.Args[0], ".exe"), ".test")
        +
        +func init() {
        +	if runtime.GOOS == "windows" && !inTest {
        +		LineBreak = "\r\n"
        +	}
        +}
        +
        +// LoadOptions contains all customized options used for load data source(s).
        +type LoadOptions struct {
        +	// Loose indicates whether the parser should ignore nonexistent files or return error.
        +	Loose bool
        +	// Insensitive indicates whether the parser forces all section and key names to lowercase.
        +	Insensitive bool
        +	// IgnoreContinuation indicates whether to ignore continuation lines while parsing.
        +	IgnoreContinuation bool
        +	// IgnoreInlineComment indicates whether to ignore comments at the end of value and treat it as part of value.
        +	IgnoreInlineComment bool
        +	// SkipUnrecognizableLines indicates whether to skip unrecognizable lines that do not conform to key/value pairs.
        +	SkipUnrecognizableLines bool
        +	// AllowBooleanKeys indicates whether to allow boolean type keys or treat as value is missing.
        +	// This type of keys are mostly used in my.cnf.
        +	AllowBooleanKeys bool
        +	// AllowShadows indicates whether to keep track of keys with same name under same section.
        +	AllowShadows bool
        +	// AllowNestedValues indicates whether to allow AWS-like nested values.
        +	// Docs: http://docs.aws.amazon.com/cli/latest/topic/config-vars.html#nested-values
        +	AllowNestedValues bool
        +	// AllowPythonMultilineValues indicates whether to allow Python-like multi-line values.
        +	// Docs: https://docs.python.org/3/library/configparser.html#supported-ini-file-structure
        +	// Relevant quote:  Values can also span multiple lines, as long as they are indented deeper
        +	// than the first line of the value.
        +	AllowPythonMultilineValues bool
        +	// SpaceBeforeInlineComment indicates whether to allow comment symbols (\# and \;) inside value.
        +	// Docs: https://docs.python.org/2/library/configparser.html
        +	// Quote: Comments may appear on their own in an otherwise empty line, or may be entered in lines holding values or section names.
        +	// In the latter case, they need to be preceded by a whitespace character to be recognized as a comment.
        +	SpaceBeforeInlineComment bool
        +	// UnescapeValueDoubleQuotes indicates whether to unescape double quotes inside value to regular format
        +	// when value is surrounded by double quotes, e.g. key="a \"value\"" => key=a "value"
        +	UnescapeValueDoubleQuotes bool
        +	// UnescapeValueCommentSymbols indicates to unescape comment symbols (\# and \;) inside value to regular format
        +	// when value is NOT surrounded by any quotes.
        +	// Note: UNSTABLE, behavior might change to only unescape inside double quotes but may noy necessary at all.
        +	UnescapeValueCommentSymbols bool
        +	// UnparseableSections stores a list of blocks that are allowed with raw content which do not otherwise
        +	// conform to key/value pairs. Specify the names of those blocks here.
        +	UnparseableSections []string
        +	// KeyValueDelimiters is the sequence of delimiters that are used to separate key and value. By default, it is "=:".
        +	KeyValueDelimiters string
        +	// KeyValueDelimiters is the delimiter that are used to separate key and value output. By default, it is "=".
        +	KeyValueDelimiterOnWrite string
        +	// PreserveSurroundedQuote indicates whether to preserve surrounded quote (single and double quotes).
        +	PreserveSurroundedQuote bool
        +	// DebugFunc is called to collect debug information (currently only useful to debug parsing Python-style multiline values).
        +	DebugFunc DebugFunc
        +	// ReaderBufferSize is the buffer size of the reader in bytes.
        +	ReaderBufferSize int
        +	// AllowNonUniqueSections indicates whether to allow sections with the same name multiple times.
        +	AllowNonUniqueSections bool
        +}
        +
        +// DebugFunc is the type of function called to log parse events.
        +type DebugFunc func(message string)
        +
        +// LoadSources allows caller to apply customized options for loading from data source(s).
        +func LoadSources(opts LoadOptions, source interface{}, others ...interface{}) (_ *File, err error) {
        +	sources := make([]dataSource, len(others)+1)
        +	sources[0], err = parseDataSource(source)
        +	if err != nil {
        +		return nil, err
        +	}
        +	for i := range others {
        +		sources[i+1], err = parseDataSource(others[i])
        +		if err != nil {
        +			return nil, err
        +		}
        +	}
        +	f := newFile(sources, opts)
        +	if err = f.Reload(); err != nil {
        +		return nil, err
        +	}
        +	return f, nil
        +}
        +
        +// Load loads and parses from INI data sources.
        +// Arguments can be mixed of file name with string type, or raw data in []byte.
        +// It will return error if list contains nonexistent files.
        +func Load(source interface{}, others ...interface{}) (*File, error) {
        +	return LoadSources(LoadOptions{}, source, others...)
        +}
        +
        +// LooseLoad has exactly same functionality as Load function
        +// except it ignores nonexistent files instead of returning error.
        +func LooseLoad(source interface{}, others ...interface{}) (*File, error) {
        +	return LoadSources(LoadOptions{Loose: true}, source, others...)
        +}
        +
        +// InsensitiveLoad has exactly same functionality as Load function
        +// except it forces all section and key names to be lowercased.
        +func InsensitiveLoad(source interface{}, others ...interface{}) (*File, error) {
        +	return LoadSources(LoadOptions{Insensitive: true}, source, others...)
        +}
        +
        +// ShadowLoad has exactly same functionality as Load function
        +// except it allows have shadow keys.
        +func ShadowLoad(source interface{}, others ...interface{}) (*File, error) {
        +	return LoadSources(LoadOptions{AllowShadows: true}, source, others...)
        +}
        diff --git a/vendor/gopkg.in/ini.v1/key.go b/vendor/gopkg.in/ini.v1/key.go
        new file mode 100644
        index 000000000..8baafd9ea
        --- /dev/null
        +++ b/vendor/gopkg.in/ini.v1/key.go
        @@ -0,0 +1,829 @@
        +// Copyright 2014 Unknwon
        +//
        +// Licensed under the Apache License, Version 2.0 (the "License"): you may
        +// not use this file except in compliance with the License. You may obtain
        +// a copy of the License at
        +//
        +//     http://www.apache.org/licenses/LICENSE-2.0
        +//
        +// Unless required by applicable law or agreed to in writing, software
        +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
        +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
        +// License for the specific language governing permissions and limitations
        +// under the License.
        +
        +package ini
        +
        +import (
        +	"bytes"
        +	"errors"
        +	"fmt"
        +	"strconv"
        +	"strings"
        +	"time"
        +)
        +
        +// Key represents a key under a section.
        +type Key struct {
        +	s               *Section
        +	Comment         string
        +	name            string
        +	value           string
        +	isAutoIncrement bool
        +	isBooleanType   bool
        +
        +	isShadow bool
        +	shadows  []*Key
        +
        +	nestedValues []string
        +}
        +
        +// newKey simply return a key object with given values.
        +func newKey(s *Section, name, val string) *Key {
        +	return &Key{
        +		s:     s,
        +		name:  name,
        +		value: val,
        +	}
        +}
        +
        +func (k *Key) addShadow(val string) error {
        +	if k.isShadow {
        +		return errors.New("cannot add shadow to another shadow key")
        +	} else if k.isAutoIncrement || k.isBooleanType {
        +		return errors.New("cannot add shadow to auto-increment or boolean key")
        +	}
        +
        +	// Deduplicate shadows based on their values.
        +	if k.value == val {
        +		return nil
        +	}
        +	for i := range k.shadows {
        +		if k.shadows[i].value == val {
        +			return nil
        +		}
        +	}
        +
        +	shadow := newKey(k.s, k.name, val)
        +	shadow.isShadow = true
        +	k.shadows = append(k.shadows, shadow)
        +	return nil
        +}
        +
        +// AddShadow adds a new shadow key to itself.
        +func (k *Key) AddShadow(val string) error {
        +	if !k.s.f.options.AllowShadows {
        +		return errors.New("shadow key is not allowed")
        +	}
        +	return k.addShadow(val)
        +}
        +
        +func (k *Key) addNestedValue(val string) error {
        +	if k.isAutoIncrement || k.isBooleanType {
        +		return errors.New("cannot add nested value to auto-increment or boolean key")
        +	}
        +
        +	k.nestedValues = append(k.nestedValues, val)
        +	return nil
        +}
        +
        +// AddNestedValue adds a nested value to the key.
        +func (k *Key) AddNestedValue(val string) error {
        +	if !k.s.f.options.AllowNestedValues {
        +		return errors.New("nested value is not allowed")
        +	}
        +	return k.addNestedValue(val)
        +}
        +
        +// ValueMapper represents a mapping function for values, e.g. os.ExpandEnv
        +type ValueMapper func(string) string
        +
        +// Name returns name of key.
        +func (k *Key) Name() string {
        +	return k.name
        +}
        +
        +// Value returns raw value of key for performance purpose.
        +func (k *Key) Value() string {
        +	return k.value
        +}
        +
        +// ValueWithShadows returns raw values of key and its shadows if any.
        +func (k *Key) ValueWithShadows() []string {
        +	if len(k.shadows) == 0 {
        +		return []string{k.value}
        +	}
        +	vals := make([]string, len(k.shadows)+1)
        +	vals[0] = k.value
        +	for i := range k.shadows {
        +		vals[i+1] = k.shadows[i].value
        +	}
        +	return vals
        +}
        +
        +// NestedValues returns nested values stored in the key.
        +// It is possible returned value is nil if no nested values stored in the key.
        +func (k *Key) NestedValues() []string {
        +	return k.nestedValues
        +}
        +
        +// transformValue takes a raw value and transforms to its final string.
        +func (k *Key) transformValue(val string) string {
        +	if k.s.f.ValueMapper != nil {
        +		val = k.s.f.ValueMapper(val)
        +	}
        +
        +	// Fail-fast if no indicate char found for recursive value
        +	if !strings.Contains(val, "%") {
        +		return val
        +	}
        +	for i := 0; i < depthValues; i++ {
        +		vr := varPattern.FindString(val)
        +		if len(vr) == 0 {
        +			break
        +		}
        +
        +		// Take off leading '%(' and trailing ')s'.
        +		noption := vr[2 : len(vr)-2]
        +
        +		// Search in the same section.
        +		// If not found or found the key itself, then search again in default section.
        +		nk, err := k.s.GetKey(noption)
        +		if err != nil || k == nk {
        +			nk, _ = k.s.f.Section("").GetKey(noption)
        +			if nk == nil {
        +				// Stop when no results found in the default section,
        +				// and returns the value as-is.
        +				break
        +			}
        +		}
        +
        +		// Substitute by new value and take off leading '%(' and trailing ')s'.
        +		val = strings.Replace(val, vr, nk.value, -1)
        +	}
        +	return val
        +}
        +
        +// String returns string representation of value.
        +func (k *Key) String() string {
        +	return k.transformValue(k.value)
        +}
        +
        +// Validate accepts a validate function which can
        +// return modifed result as key value.
        +func (k *Key) Validate(fn func(string) string) string {
        +	return fn(k.String())
        +}
        +
        +// parseBool returns the boolean value represented by the string.
        +//
        +// It accepts 1, t, T, TRUE, true, True, YES, yes, Yes, y, ON, on, On,
        +// 0, f, F, FALSE, false, False, NO, no, No, n, OFF, off, Off.
        +// Any other value returns an error.
        +func parseBool(str string) (value bool, err error) {
        +	switch str {
        +	case "1", "t", "T", "true", "TRUE", "True", "YES", "yes", "Yes", "y", "ON", "on", "On":
        +		return true, nil
        +	case "0", "f", "F", "false", "FALSE", "False", "NO", "no", "No", "n", "OFF", "off", "Off":
        +		return false, nil
        +	}
        +	return false, fmt.Errorf("parsing \"%s\": invalid syntax", str)
        +}
        +
        +// Bool returns bool type value.
        +func (k *Key) Bool() (bool, error) {
        +	return parseBool(k.String())
        +}
        +
        +// Float64 returns float64 type value.
        +func (k *Key) Float64() (float64, error) {
        +	return strconv.ParseFloat(k.String(), 64)
        +}
        +
        +// Int returns int type value.
        +func (k *Key) Int() (int, error) {
        +	v, err := strconv.ParseInt(k.String(), 0, 64)
        +	return int(v), err
        +}
        +
        +// Int64 returns int64 type value.
        +func (k *Key) Int64() (int64, error) {
        +	return strconv.ParseInt(k.String(), 0, 64)
        +}
        +
        +// Uint returns uint type valued.
        +func (k *Key) Uint() (uint, error) {
        +	u, e := strconv.ParseUint(k.String(), 0, 64)
        +	return uint(u), e
        +}
        +
        +// Uint64 returns uint64 type value.
        +func (k *Key) Uint64() (uint64, error) {
        +	return strconv.ParseUint(k.String(), 0, 64)
        +}
        +
        +// Duration returns time.Duration type value.
        +func (k *Key) Duration() (time.Duration, error) {
        +	return time.ParseDuration(k.String())
        +}
        +
        +// TimeFormat parses with given format and returns time.Time type value.
        +func (k *Key) TimeFormat(format string) (time.Time, error) {
        +	return time.Parse(format, k.String())
        +}
        +
        +// Time parses with RFC3339 format and returns time.Time type value.
        +func (k *Key) Time() (time.Time, error) {
        +	return k.TimeFormat(time.RFC3339)
        +}
        +
        +// MustString returns default value if key value is empty.
        +func (k *Key) MustString(defaultVal string) string {
        +	val := k.String()
        +	if len(val) == 0 {
        +		k.value = defaultVal
        +		return defaultVal
        +	}
        +	return val
        +}
        +
        +// MustBool always returns value without error,
        +// it returns false if error occurs.
        +func (k *Key) MustBool(defaultVal ...bool) bool {
        +	val, err := k.Bool()
        +	if len(defaultVal) > 0 && err != nil {
        +		k.value = strconv.FormatBool(defaultVal[0])
        +		return defaultVal[0]
        +	}
        +	return val
        +}
        +
        +// MustFloat64 always returns value without error,
        +// it returns 0.0 if error occurs.
        +func (k *Key) MustFloat64(defaultVal ...float64) float64 {
        +	val, err := k.Float64()
        +	if len(defaultVal) > 0 && err != nil {
        +		k.value = strconv.FormatFloat(defaultVal[0], 'f', -1, 64)
        +		return defaultVal[0]
        +	}
        +	return val
        +}
        +
        +// MustInt always returns value without error,
        +// it returns 0 if error occurs.
        +func (k *Key) MustInt(defaultVal ...int) int {
        +	val, err := k.Int()
        +	if len(defaultVal) > 0 && err != nil {
        +		k.value = strconv.FormatInt(int64(defaultVal[0]), 10)
        +		return defaultVal[0]
        +	}
        +	return val
        +}
        +
        +// MustInt64 always returns value without error,
        +// it returns 0 if error occurs.
        +func (k *Key) MustInt64(defaultVal ...int64) int64 {
        +	val, err := k.Int64()
        +	if len(defaultVal) > 0 && err != nil {
        +		k.value = strconv.FormatInt(defaultVal[0], 10)
        +		return defaultVal[0]
        +	}
        +	return val
        +}
        +
        +// MustUint always returns value without error,
        +// it returns 0 if error occurs.
        +func (k *Key) MustUint(defaultVal ...uint) uint {
        +	val, err := k.Uint()
        +	if len(defaultVal) > 0 && err != nil {
        +		k.value = strconv.FormatUint(uint64(defaultVal[0]), 10)
        +		return defaultVal[0]
        +	}
        +	return val
        +}
        +
        +// MustUint64 always returns value without error,
        +// it returns 0 if error occurs.
        +func (k *Key) MustUint64(defaultVal ...uint64) uint64 {
        +	val, err := k.Uint64()
        +	if len(defaultVal) > 0 && err != nil {
        +		k.value = strconv.FormatUint(defaultVal[0], 10)
        +		return defaultVal[0]
        +	}
        +	return val
        +}
        +
        +// MustDuration always returns value without error,
        +// it returns zero value if error occurs.
        +func (k *Key) MustDuration(defaultVal ...time.Duration) time.Duration {
        +	val, err := k.Duration()
        +	if len(defaultVal) > 0 && err != nil {
        +		k.value = defaultVal[0].String()
        +		return defaultVal[0]
        +	}
        +	return val
        +}
        +
        +// MustTimeFormat always parses with given format and returns value without error,
        +// it returns zero value if error occurs.
        +func (k *Key) MustTimeFormat(format string, defaultVal ...time.Time) time.Time {
        +	val, err := k.TimeFormat(format)
        +	if len(defaultVal) > 0 && err != nil {
        +		k.value = defaultVal[0].Format(format)
        +		return defaultVal[0]
        +	}
        +	return val
        +}
        +
        +// MustTime always parses with RFC3339 format and returns value without error,
        +// it returns zero value if error occurs.
        +func (k *Key) MustTime(defaultVal ...time.Time) time.Time {
        +	return k.MustTimeFormat(time.RFC3339, defaultVal...)
        +}
        +
        +// In always returns value without error,
        +// it returns default value if error occurs or doesn't fit into candidates.
        +func (k *Key) In(defaultVal string, candidates []string) string {
        +	val := k.String()
        +	for _, cand := range candidates {
        +		if val == cand {
        +			return val
        +		}
        +	}
        +	return defaultVal
        +}
        +
        +// InFloat64 always returns value without error,
        +// it returns default value if error occurs or doesn't fit into candidates.
        +func (k *Key) InFloat64(defaultVal float64, candidates []float64) float64 {
        +	val := k.MustFloat64()
        +	for _, cand := range candidates {
        +		if val == cand {
        +			return val
        +		}
        +	}
        +	return defaultVal
        +}
        +
        +// InInt always returns value without error,
        +// it returns default value if error occurs or doesn't fit into candidates.
        +func (k *Key) InInt(defaultVal int, candidates []int) int {
        +	val := k.MustInt()
        +	for _, cand := range candidates {
        +		if val == cand {
        +			return val
        +		}
        +	}
        +	return defaultVal
        +}
        +
        +// InInt64 always returns value without error,
        +// it returns default value if error occurs or doesn't fit into candidates.
        +func (k *Key) InInt64(defaultVal int64, candidates []int64) int64 {
        +	val := k.MustInt64()
        +	for _, cand := range candidates {
        +		if val == cand {
        +			return val
        +		}
        +	}
        +	return defaultVal
        +}
        +
        +// InUint always returns value without error,
        +// it returns default value if error occurs or doesn't fit into candidates.
        +func (k *Key) InUint(defaultVal uint, candidates []uint) uint {
        +	val := k.MustUint()
        +	for _, cand := range candidates {
        +		if val == cand {
        +			return val
        +		}
        +	}
        +	return defaultVal
        +}
        +
        +// InUint64 always returns value without error,
        +// it returns default value if error occurs or doesn't fit into candidates.
        +func (k *Key) InUint64(defaultVal uint64, candidates []uint64) uint64 {
        +	val := k.MustUint64()
        +	for _, cand := range candidates {
        +		if val == cand {
        +			return val
        +		}
        +	}
        +	return defaultVal
        +}
        +
        +// InTimeFormat always parses with given format and returns value without error,
        +// it returns default value if error occurs or doesn't fit into candidates.
        +func (k *Key) InTimeFormat(format string, defaultVal time.Time, candidates []time.Time) time.Time {
        +	val := k.MustTimeFormat(format)
        +	for _, cand := range candidates {
        +		if val == cand {
        +			return val
        +		}
        +	}
        +	return defaultVal
        +}
        +
        +// InTime always parses with RFC3339 format and returns value without error,
        +// it returns default value if error occurs or doesn't fit into candidates.
        +func (k *Key) InTime(defaultVal time.Time, candidates []time.Time) time.Time {
        +	return k.InTimeFormat(time.RFC3339, defaultVal, candidates)
        +}
        +
        +// RangeFloat64 checks if value is in given range inclusively,
        +// and returns default value if it's not.
        +func (k *Key) RangeFloat64(defaultVal, min, max float64) float64 {
        +	val := k.MustFloat64()
        +	if val < min || val > max {
        +		return defaultVal
        +	}
        +	return val
        +}
        +
        +// RangeInt checks if value is in given range inclusively,
        +// and returns default value if it's not.
        +func (k *Key) RangeInt(defaultVal, min, max int) int {
        +	val := k.MustInt()
        +	if val < min || val > max {
        +		return defaultVal
        +	}
        +	return val
        +}
        +
        +// RangeInt64 checks if value is in given range inclusively,
        +// and returns default value if it's not.
        +func (k *Key) RangeInt64(defaultVal, min, max int64) int64 {
        +	val := k.MustInt64()
        +	if val < min || val > max {
        +		return defaultVal
        +	}
        +	return val
        +}
        +
        +// RangeTimeFormat checks if value with given format is in given range inclusively,
        +// and returns default value if it's not.
        +func (k *Key) RangeTimeFormat(format string, defaultVal, min, max time.Time) time.Time {
        +	val := k.MustTimeFormat(format)
        +	if val.Unix() < min.Unix() || val.Unix() > max.Unix() {
        +		return defaultVal
        +	}
        +	return val
        +}
        +
        +// RangeTime checks if value with RFC3339 format is in given range inclusively,
        +// and returns default value if it's not.
        +func (k *Key) RangeTime(defaultVal, min, max time.Time) time.Time {
        +	return k.RangeTimeFormat(time.RFC3339, defaultVal, min, max)
        +}
        +
        +// Strings returns list of string divided by given delimiter.
        +func (k *Key) Strings(delim string) []string {
        +	str := k.String()
        +	if len(str) == 0 {
        +		return []string{}
        +	}
        +
        +	runes := []rune(str)
        +	vals := make([]string, 0, 2)
        +	var buf bytes.Buffer
        +	escape := false
        +	idx := 0
        +	for {
        +		if escape {
        +			escape = false
        +			if runes[idx] != '\\' && !strings.HasPrefix(string(runes[idx:]), delim) {
        +				buf.WriteRune('\\')
        +			}
        +			buf.WriteRune(runes[idx])
        +		} else {
        +			if runes[idx] == '\\' {
        +				escape = true
        +			} else if strings.HasPrefix(string(runes[idx:]), delim) {
        +				idx += len(delim) - 1
        +				vals = append(vals, strings.TrimSpace(buf.String()))
        +				buf.Reset()
        +			} else {
        +				buf.WriteRune(runes[idx])
        +			}
        +		}
        +		idx++
        +		if idx == len(runes) {
        +			break
        +		}
        +	}
        +
        +	if buf.Len() > 0 {
        +		vals = append(vals, strings.TrimSpace(buf.String()))
        +	}
        +
        +	return vals
        +}
        +
        +// StringsWithShadows returns list of string divided by given delimiter.
        +// Shadows will also be appended if any.
        +func (k *Key) StringsWithShadows(delim string) []string {
        +	vals := k.ValueWithShadows()
        +	results := make([]string, 0, len(vals)*2)
        +	for i := range vals {
        +		if len(vals) == 0 {
        +			continue
        +		}
        +
        +		results = append(results, strings.Split(vals[i], delim)...)
        +	}
        +
        +	for i := range results {
        +		results[i] = k.transformValue(strings.TrimSpace(results[i]))
        +	}
        +	return results
        +}
        +
        +// Float64s returns list of float64 divided by given delimiter. Any invalid input will be treated as zero value.
        +func (k *Key) Float64s(delim string) []float64 {
        +	vals, _ := k.parseFloat64s(k.Strings(delim), true, false)
        +	return vals
        +}
        +
        +// Ints returns list of int divided by given delimiter. Any invalid input will be treated as zero value.
        +func (k *Key) Ints(delim string) []int {
        +	vals, _ := k.parseInts(k.Strings(delim), true, false)
        +	return vals
        +}
        +
        +// Int64s returns list of int64 divided by given delimiter. Any invalid input will be treated as zero value.
        +func (k *Key) Int64s(delim string) []int64 {
        +	vals, _ := k.parseInt64s(k.Strings(delim), true, false)
        +	return vals
        +}
        +
        +// Uints returns list of uint divided by given delimiter. Any invalid input will be treated as zero value.
        +func (k *Key) Uints(delim string) []uint {
        +	vals, _ := k.parseUints(k.Strings(delim), true, false)
        +	return vals
        +}
        +
        +// Uint64s returns list of uint64 divided by given delimiter. Any invalid input will be treated as zero value.
        +func (k *Key) Uint64s(delim string) []uint64 {
        +	vals, _ := k.parseUint64s(k.Strings(delim), true, false)
        +	return vals
        +}
        +
        +// Bools returns list of bool divided by given delimiter. Any invalid input will be treated as zero value.
        +func (k *Key) Bools(delim string) []bool {
        +	vals, _ := k.parseBools(k.Strings(delim), true, false)
        +	return vals
        +}
        +
        +// TimesFormat parses with given format and returns list of time.Time divided by given delimiter.
        +// Any invalid input will be treated as zero value (0001-01-01 00:00:00 +0000 UTC).
        +func (k *Key) TimesFormat(format, delim string) []time.Time {
        +	vals, _ := k.parseTimesFormat(format, k.Strings(delim), true, false)
        +	return vals
        +}
        +
        +// Times parses with RFC3339 format and returns list of time.Time divided by given delimiter.
        +// Any invalid input will be treated as zero value (0001-01-01 00:00:00 +0000 UTC).
        +func (k *Key) Times(delim string) []time.Time {
        +	return k.TimesFormat(time.RFC3339, delim)
        +}
        +
        +// ValidFloat64s returns list of float64 divided by given delimiter. If some value is not float, then
        +// it will not be included to result list.
        +func (k *Key) ValidFloat64s(delim string) []float64 {
        +	vals, _ := k.parseFloat64s(k.Strings(delim), false, false)
        +	return vals
        +}
        +
        +// ValidInts returns list of int divided by given delimiter. If some value is not integer, then it will
        +// not be included to result list.
        +func (k *Key) ValidInts(delim string) []int {
        +	vals, _ := k.parseInts(k.Strings(delim), false, false)
        +	return vals
        +}
        +
        +// ValidInt64s returns list of int64 divided by given delimiter. If some value is not 64-bit integer,
        +// then it will not be included to result list.
        +func (k *Key) ValidInt64s(delim string) []int64 {
        +	vals, _ := k.parseInt64s(k.Strings(delim), false, false)
        +	return vals
        +}
        +
        +// ValidUints returns list of uint divided by given delimiter. If some value is not unsigned integer,
        +// then it will not be included to result list.
        +func (k *Key) ValidUints(delim string) []uint {
        +	vals, _ := k.parseUints(k.Strings(delim), false, false)
        +	return vals
        +}
        +
        +// ValidUint64s returns list of uint64 divided by given delimiter. If some value is not 64-bit unsigned
        +// integer, then it will not be included to result list.
        +func (k *Key) ValidUint64s(delim string) []uint64 {
        +	vals, _ := k.parseUint64s(k.Strings(delim), false, false)
        +	return vals
        +}
        +
        +// ValidBools returns list of bool divided by given delimiter. If some value is not 64-bit unsigned
        +// integer, then it will not be included to result list.
        +func (k *Key) ValidBools(delim string) []bool {
        +	vals, _ := k.parseBools(k.Strings(delim), false, false)
        +	return vals
        +}
        +
        +// ValidTimesFormat parses with given format and returns list of time.Time divided by given delimiter.
        +func (k *Key) ValidTimesFormat(format, delim string) []time.Time {
        +	vals, _ := k.parseTimesFormat(format, k.Strings(delim), false, false)
        +	return vals
        +}
        +
        +// ValidTimes parses with RFC3339 format and returns list of time.Time divided by given delimiter.
        +func (k *Key) ValidTimes(delim string) []time.Time {
        +	return k.ValidTimesFormat(time.RFC3339, delim)
        +}
        +
        +// StrictFloat64s returns list of float64 divided by given delimiter or error on first invalid input.
        +func (k *Key) StrictFloat64s(delim string) ([]float64, error) {
        +	return k.parseFloat64s(k.Strings(delim), false, true)
        +}
        +
        +// StrictInts returns list of int divided by given delimiter or error on first invalid input.
        +func (k *Key) StrictInts(delim string) ([]int, error) {
        +	return k.parseInts(k.Strings(delim), false, true)
        +}
        +
        +// StrictInt64s returns list of int64 divided by given delimiter or error on first invalid input.
        +func (k *Key) StrictInt64s(delim string) ([]int64, error) {
        +	return k.parseInt64s(k.Strings(delim), false, true)
        +}
        +
        +// StrictUints returns list of uint divided by given delimiter or error on first invalid input.
        +func (k *Key) StrictUints(delim string) ([]uint, error) {
        +	return k.parseUints(k.Strings(delim), false, true)
        +}
        +
        +// StrictUint64s returns list of uint64 divided by given delimiter or error on first invalid input.
        +func (k *Key) StrictUint64s(delim string) ([]uint64, error) {
        +	return k.parseUint64s(k.Strings(delim), false, true)
        +}
        +
        +// StrictBools returns list of bool divided by given delimiter or error on first invalid input.
        +func (k *Key) StrictBools(delim string) ([]bool, error) {
        +	return k.parseBools(k.Strings(delim), false, true)
        +}
        +
        +// StrictTimesFormat parses with given format and returns list of time.Time divided by given delimiter
        +// or error on first invalid input.
        +func (k *Key) StrictTimesFormat(format, delim string) ([]time.Time, error) {
        +	return k.parseTimesFormat(format, k.Strings(delim), false, true)
        +}
        +
        +// StrictTimes parses with RFC3339 format and returns list of time.Time divided by given delimiter
        +// or error on first invalid input.
        +func (k *Key) StrictTimes(delim string) ([]time.Time, error) {
        +	return k.StrictTimesFormat(time.RFC3339, delim)
        +}
        +
        +// parseBools transforms strings to bools.
        +func (k *Key) parseBools(strs []string, addInvalid, returnOnInvalid bool) ([]bool, error) {
        +	vals := make([]bool, 0, len(strs))
        +	parser := func(str string) (interface{}, error) {
        +		val, err := parseBool(str)
        +		return val, err
        +	}
        +	rawVals, err := k.doParse(strs, addInvalid, returnOnInvalid, parser)
        +	if err == nil {
        +		for _, val := range rawVals {
        +			vals = append(vals, val.(bool))
        +		}
        +	}
        +	return vals, err
        +}
        +
        +// parseFloat64s transforms strings to float64s.
        +func (k *Key) parseFloat64s(strs []string, addInvalid, returnOnInvalid bool) ([]float64, error) {
        +	vals := make([]float64, 0, len(strs))
        +	parser := func(str string) (interface{}, error) {
        +		val, err := strconv.ParseFloat(str, 64)
        +		return val, err
        +	}
        +	rawVals, err := k.doParse(strs, addInvalid, returnOnInvalid, parser)
        +	if err == nil {
        +		for _, val := range rawVals {
        +			vals = append(vals, val.(float64))
        +		}
        +	}
        +	return vals, err
        +}
        +
        +// parseInts transforms strings to ints.
        +func (k *Key) parseInts(strs []string, addInvalid, returnOnInvalid bool) ([]int, error) {
        +	vals := make([]int, 0, len(strs))
        +	parser := func(str string) (interface{}, error) {
        +		val, err := strconv.ParseInt(str, 0, 64)
        +		return val, err
        +	}
        +	rawVals, err := k.doParse(strs, addInvalid, returnOnInvalid, parser)
        +	if err == nil {
        +		for _, val := range rawVals {
        +			vals = append(vals, int(val.(int64)))
        +		}
        +	}
        +	return vals, err
        +}
        +
        +// parseInt64s transforms strings to int64s.
        +func (k *Key) parseInt64s(strs []string, addInvalid, returnOnInvalid bool) ([]int64, error) {
        +	vals := make([]int64, 0, len(strs))
        +	parser := func(str string) (interface{}, error) {
        +		val, err := strconv.ParseInt(str, 0, 64)
        +		return val, err
        +	}
        +
        +	rawVals, err := k.doParse(strs, addInvalid, returnOnInvalid, parser)
        +	if err == nil {
        +		for _, val := range rawVals {
        +			vals = append(vals, val.(int64))
        +		}
        +	}
        +	return vals, err
        +}
        +
        +// parseUints transforms strings to uints.
        +func (k *Key) parseUints(strs []string, addInvalid, returnOnInvalid bool) ([]uint, error) {
        +	vals := make([]uint, 0, len(strs))
        +	parser := func(str string) (interface{}, error) {
        +		val, err := strconv.ParseUint(str, 0, 64)
        +		return val, err
        +	}
        +
        +	rawVals, err := k.doParse(strs, addInvalid, returnOnInvalid, parser)
        +	if err == nil {
        +		for _, val := range rawVals {
        +			vals = append(vals, uint(val.(uint64)))
        +		}
        +	}
        +	return vals, err
        +}
        +
        +// parseUint64s transforms strings to uint64s.
        +func (k *Key) parseUint64s(strs []string, addInvalid, returnOnInvalid bool) ([]uint64, error) {
        +	vals := make([]uint64, 0, len(strs))
        +	parser := func(str string) (interface{}, error) {
        +		val, err := strconv.ParseUint(str, 0, 64)
        +		return val, err
        +	}
        +	rawVals, err := k.doParse(strs, addInvalid, returnOnInvalid, parser)
        +	if err == nil {
        +		for _, val := range rawVals {
        +			vals = append(vals, val.(uint64))
        +		}
        +	}
        +	return vals, err
        +}
        +
        +
        +type Parser func(str string) (interface{}, error)
        +
        +
        +// parseTimesFormat transforms strings to times in given format.
        +func (k *Key) parseTimesFormat(format string, strs []string, addInvalid, returnOnInvalid bool) ([]time.Time, error) {
        +	vals := make([]time.Time, 0, len(strs))
        +	parser := func(str string) (interface{}, error) {
        +		val, err := time.Parse(format, str)
        +		return val, err
        +	}
        +	rawVals, err := k.doParse(strs, addInvalid, returnOnInvalid, parser)
        +	if err == nil {
        +		for _, val := range rawVals {
        +			vals = append(vals, val.(time.Time))
        +		}
        +	}
        +	return vals, err
        +}
        +
        +
        +// doParse transforms strings to different types
        +func (k *Key) doParse(strs []string, addInvalid, returnOnInvalid bool, parser Parser) ([]interface{}, error) {
        +	vals := make([]interface{}, 0, len(strs))
        +	for _, str := range strs {
        +		val, err := parser(str)
        +		if err != nil && returnOnInvalid {
        +			return nil, err
        +		}
        +		if err == nil || addInvalid {
        +			vals = append(vals, val)
        +		}
        +	}
        +	return vals, nil
        +}
        +
        +// SetValue changes key value.
        +func (k *Key) SetValue(v string) {
        +	if k.s.f.BlockMode {
        +		k.s.f.lock.Lock()
        +		defer k.s.f.lock.Unlock()
        +	}
        +
        +	k.value = v
        +	k.s.keysHash[k.name] = v
        +}
        diff --git a/vendor/gopkg.in/ini.v1/parser.go b/vendor/gopkg.in/ini.v1/parser.go
        new file mode 100644
        index 000000000..ea6c08b02
        --- /dev/null
        +++ b/vendor/gopkg.in/ini.v1/parser.go
        @@ -0,0 +1,535 @@
        +// Copyright 2015 Unknwon
        +//
        +// Licensed under the Apache License, Version 2.0 (the "License"): you may
        +// not use this file except in compliance with the License. You may obtain
        +// a copy of the License at
        +//
        +//     http://www.apache.org/licenses/LICENSE-2.0
        +//
        +// Unless required by applicable law or agreed to in writing, software
        +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
        +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
        +// License for the specific language governing permissions and limitations
        +// under the License.
        +
        +package ini
        +
        +import (
        +	"bufio"
        +	"bytes"
        +	"fmt"
        +	"io"
        +	"regexp"
        +	"strconv"
        +	"strings"
        +	"unicode"
        +)
        +
        +const minReaderBufferSize = 4096
        +
        +var pythonMultiline = regexp.MustCompile(`^([\t\f ]+)(.*)`)
        +
        +type parserOptions struct {
        +	IgnoreContinuation          bool
        +	IgnoreInlineComment         bool
        +	AllowPythonMultilineValues  bool
        +	SpaceBeforeInlineComment    bool
        +	UnescapeValueDoubleQuotes   bool
        +	UnescapeValueCommentSymbols bool
        +	PreserveSurroundedQuote     bool
        +	DebugFunc                   DebugFunc
        +	ReaderBufferSize            int
        +}
        +
        +type parser struct {
        +	buf     *bufio.Reader
        +	options parserOptions
        +
        +	isEOF   bool
        +	count   int
        +	comment *bytes.Buffer
        +}
        +
        +func (p *parser) debug(format string, args ...interface{}) {
        +	if p.options.DebugFunc != nil {
        +		p.options.DebugFunc(fmt.Sprintf(format, args...))
        +	}
        +}
        +
        +func newParser(r io.Reader, opts parserOptions) *parser {
        +	size := opts.ReaderBufferSize
        +	if size < minReaderBufferSize {
        +		size = minReaderBufferSize
        +	}
        +
        +	return &parser{
        +		buf:     bufio.NewReaderSize(r, size),
        +		options: opts,
        +		count:   1,
        +		comment: &bytes.Buffer{},
        +	}
        +}
        +
        +// BOM handles header of UTF-8, UTF-16 LE and UTF-16 BE's BOM format.
        +// http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding
        +func (p *parser) BOM() error {
        +	mask, err := p.buf.Peek(2)
        +	if err != nil && err != io.EOF {
        +		return err
        +	} else if len(mask) < 2 {
        +		return nil
        +	}
        +
        +	switch {
        +	case mask[0] == 254 && mask[1] == 255:
        +		fallthrough
        +	case mask[0] == 255 && mask[1] == 254:
        +		_, err = p.buf.Read(mask)
        +		if err != nil {
        +			return err
        +		}
        +	case mask[0] == 239 && mask[1] == 187:
        +		mask, err := p.buf.Peek(3)
        +		if err != nil && err != io.EOF {
        +			return err
        +		} else if len(mask) < 3 {
        +			return nil
        +		}
        +		if mask[2] == 191 {
        +			_, err = p.buf.Read(mask)
        +			if err != nil {
        +				return err
        +			}
        +		}
        +	}
        +	return nil
        +}
        +
        +func (p *parser) readUntil(delim byte) ([]byte, error) {
        +	data, err := p.buf.ReadBytes(delim)
        +	if err != nil {
        +		if err == io.EOF {
        +			p.isEOF = true
        +		} else {
        +			return nil, err
        +		}
        +	}
        +	return data, nil
        +}
        +
        +func cleanComment(in []byte) ([]byte, bool) {
        +	i := bytes.IndexAny(in, "#;")
        +	if i == -1 {
        +		return nil, false
        +	}
        +	return in[i:], true
        +}
        +
        +func readKeyName(delimiters string, in []byte) (string, int, error) {
        +	line := string(in)
        +
        +	// Check if key name surrounded by quotes.
        +	var keyQuote string
        +	if line[0] == '"' {
        +		if len(line) > 6 && string(line[0:3]) == `"""` {
        +			keyQuote = `"""`
        +		} else {
        +			keyQuote = `"`
        +		}
        +	} else if line[0] == '`' {
        +		keyQuote = "`"
        +	}
        +
        +	// Get out key name
        +	var endIdx int
        +	if len(keyQuote) > 0 {
        +		startIdx := len(keyQuote)
        +		// FIXME: fail case -> """"""name"""=value
        +		pos := strings.Index(line[startIdx:], keyQuote)
        +		if pos == -1 {
        +			return "", -1, fmt.Errorf("missing closing key quote: %s", line)
        +		}
        +		pos += startIdx
        +
        +		// Find key-value delimiter
        +		i := strings.IndexAny(line[pos+startIdx:], delimiters)
        +		if i < 0 {
        +			return "", -1, ErrDelimiterNotFound{line}
        +		}
        +		endIdx = pos + i
        +		return strings.TrimSpace(line[startIdx:pos]), endIdx + startIdx + 1, nil
        +	}
        +
        +	endIdx = strings.IndexAny(line, delimiters)
        +	if endIdx < 0 {
        +		return "", -1, ErrDelimiterNotFound{line}
        +	}
        +	return strings.TrimSpace(line[0:endIdx]), endIdx + 1, nil
        +}
        +
        +func (p *parser) readMultilines(line, val, valQuote string) (string, error) {
        +	for {
        +		data, err := p.readUntil('\n')
        +		if err != nil {
        +			return "", err
        +		}
        +		next := string(data)
        +
        +		pos := strings.LastIndex(next, valQuote)
        +		if pos > -1 {
        +			val += next[:pos]
        +
        +			comment, has := cleanComment([]byte(next[pos:]))
        +			if has {
        +				p.comment.Write(bytes.TrimSpace(comment))
        +			}
        +			break
        +		}
        +		val += next
        +		if p.isEOF {
        +			return "", fmt.Errorf("missing closing key quote from %q to %q", line, next)
        +		}
        +	}
        +	return val, nil
        +}
        +
        +func (p *parser) readContinuationLines(val string) (string, error) {
        +	for {
        +		data, err := p.readUntil('\n')
        +		if err != nil {
        +			return "", err
        +		}
        +		next := strings.TrimSpace(string(data))
        +
        +		if len(next) == 0 {
        +			break
        +		}
        +		val += next
        +		if val[len(val)-1] != '\\' {
        +			break
        +		}
        +		val = val[:len(val)-1]
        +	}
        +	return val, nil
        +}
        +
        +// hasSurroundedQuote check if and only if the first and last characters
        +// are quotes \" or \'.
        +// It returns false if any other parts also contain same kind of quotes.
        +func hasSurroundedQuote(in string, quote byte) bool {
        +	return len(in) >= 2 && in[0] == quote && in[len(in)-1] == quote &&
        +		strings.IndexByte(in[1:], quote) == len(in)-2
        +}
        +
        +func (p *parser) readValue(in []byte, bufferSize int) (string, error) {
        +
        +	line := strings.TrimLeftFunc(string(in), unicode.IsSpace)
        +	if len(line) == 0 {
        +		if p.options.AllowPythonMultilineValues && len(in) > 0 && in[len(in)-1] == '\n' {
        +			return p.readPythonMultilines(line, bufferSize)
        +		}
        +		return "", nil
        +	}
        +
        +	var valQuote string
        +	if len(line) > 3 && string(line[0:3]) == `"""` {
        +		valQuote = `"""`
        +	} else if line[0] == '`' {
        +		valQuote = "`"
        +	} else if p.options.UnescapeValueDoubleQuotes && line[0] == '"' {
        +		valQuote = `"`
        +	}
        +
        +	if len(valQuote) > 0 {
        +		startIdx := len(valQuote)
        +		pos := strings.LastIndex(line[startIdx:], valQuote)
        +		// Check for multi-line value
        +		if pos == -1 {
        +			return p.readMultilines(line, line[startIdx:], valQuote)
        +		}
        +
        +		if p.options.UnescapeValueDoubleQuotes && valQuote == `"` {
        +			return strings.Replace(line[startIdx:pos+startIdx], `\"`, `"`, -1), nil
        +		}
        +		return line[startIdx : pos+startIdx], nil
        +	}
        +
        +	lastChar := line[len(line)-1]
        +	// Won't be able to reach here if value only contains whitespace
        +	line = strings.TrimSpace(line)
        +	trimmedLastChar := line[len(line)-1]
        +
        +	// Check continuation lines when desired
        +	if !p.options.IgnoreContinuation && trimmedLastChar == '\\' {
        +		return p.readContinuationLines(line[:len(line)-1])
        +	}
        +
        +	// Check if ignore inline comment
        +	if !p.options.IgnoreInlineComment {
        +		var i int
        +		if p.options.SpaceBeforeInlineComment {
        +			i = strings.Index(line, " #")
        +			if i == -1 {
        +				i = strings.Index(line, " ;")
        +			}
        +
        +		} else {
        +			i = strings.IndexAny(line, "#;")
        +		}
        +
        +		if i > -1 {
        +			p.comment.WriteString(line[i:])
        +			line = strings.TrimSpace(line[:i])
        +		}
        +
        +	}
        +
        +	// Trim single and double quotes
        +	if (hasSurroundedQuote(line, '\'') ||
        +		hasSurroundedQuote(line, '"')) && !p.options.PreserveSurroundedQuote {
        +		line = line[1 : len(line)-1]
        +	} else if len(valQuote) == 0 && p.options.UnescapeValueCommentSymbols {
        +		if strings.Contains(line, `\;`) {
        +			line = strings.Replace(line, `\;`, ";", -1)
        +		}
        +		if strings.Contains(line, `\#`) {
        +			line = strings.Replace(line, `\#`, "#", -1)
        +		}
        +	} else if p.options.AllowPythonMultilineValues && lastChar == '\n' {
        +		return p.readPythonMultilines(line, bufferSize)
        +	}
        +
        +	return line, nil
        +}
        +
        +func (p *parser) readPythonMultilines(line string, bufferSize int) (string, error) {
        +	parserBufferPeekResult, _ := p.buf.Peek(bufferSize)
        +	peekBuffer := bytes.NewBuffer(parserBufferPeekResult)
        +
        +	indentSize := 0
        +	for {
        +		peekData, peekErr := peekBuffer.ReadBytes('\n')
        +		if peekErr != nil {
        +			if peekErr == io.EOF {
        +				p.debug("readPythonMultilines: io.EOF, peekData: %q, line: %q", string(peekData), line)
        +				return line, nil
        +			}
        +
        +			p.debug("readPythonMultilines: failed to peek with error: %v", peekErr)
        +			return "", peekErr
        +		}
        +
        +		p.debug("readPythonMultilines: parsing %q", string(peekData))
        +
        +		peekMatches := pythonMultiline.FindStringSubmatch(string(peekData))
        +		p.debug("readPythonMultilines: matched %d parts", len(peekMatches))
        +		for n, v := range peekMatches {
        +			p.debug("   %d: %q", n, v)
        +		}
        +
        +		// Return if not a Python multiline value.
        +		if len(peekMatches) != 3 {
        +			p.debug("readPythonMultilines: end of value, got: %q", line)
        +			return line, nil
        +		}
        +
        +		// Determine indent size and line prefix.
        +		currentIndentSize := len(peekMatches[1])
        +		if indentSize < 1 {
        +			indentSize = currentIndentSize
        +			p.debug("readPythonMultilines: indent size is %d", indentSize)
        +		}
        +
        +		// Make sure each line is indented at least as far as first line.
        +		if currentIndentSize < indentSize {
        +			p.debug("readPythonMultilines: end of value, current indent: %d, expected indent: %d, line: %q", currentIndentSize, indentSize, line)
        +			return line, nil
        +		}
        +
        +		// Advance the parser reader (buffer) in-sync with the peek buffer.
        +		_, err := p.buf.Discard(len(peekData))
        +		if err != nil {
        +			p.debug("readPythonMultilines: failed to skip to the end, returning error")
        +			return "", err
        +		}
        +
        +		// Handle indented empty line.
        +		line += "\n" + peekMatches[1][indentSize:] + peekMatches[2]
        +	}
        +}
        +
        +// parse parses data through an io.Reader.
        +func (f *File) parse(reader io.Reader) (err error) {
        +	p := newParser(reader, parserOptions{
        +		IgnoreContinuation:          f.options.IgnoreContinuation,
        +		IgnoreInlineComment:         f.options.IgnoreInlineComment,
        +		AllowPythonMultilineValues:  f.options.AllowPythonMultilineValues,
        +		SpaceBeforeInlineComment:    f.options.SpaceBeforeInlineComment,
        +		UnescapeValueDoubleQuotes:   f.options.UnescapeValueDoubleQuotes,
        +		UnescapeValueCommentSymbols: f.options.UnescapeValueCommentSymbols,
        +		PreserveSurroundedQuote:     f.options.PreserveSurroundedQuote,
        +		DebugFunc:                   f.options.DebugFunc,
        +		ReaderBufferSize:            f.options.ReaderBufferSize,
        +	})
        +	if err = p.BOM(); err != nil {
        +		return fmt.Errorf("BOM: %v", err)
        +	}
        +
        +	// Ignore error because default section name is never empty string.
        +	name := DefaultSection
        +	if f.options.Insensitive {
        +		name = strings.ToLower(DefaultSection)
        +	}
        +	section, _ := f.NewSection(name)
        +
        +	// This "last" is not strictly equivalent to "previous one" if current key is not the first nested key
        +	var isLastValueEmpty bool
        +	var lastRegularKey *Key
        +
        +	var line []byte
        +	var inUnparseableSection bool
        +
        +	// NOTE: Iterate and increase `currentPeekSize` until
        +	// the size of the parser buffer is found.
        +	// TODO(unknwon): When Golang 1.10 is the lowest version supported, replace with `parserBufferSize := p.buf.Size()`.
        +	parserBufferSize := 0
        +	// NOTE: Peek 4kb at a time.
        +	currentPeekSize := minReaderBufferSize
        +
        +	if f.options.AllowPythonMultilineValues {
        +		for {
        +			peekBytes, _ := p.buf.Peek(currentPeekSize)
        +			peekBytesLength := len(peekBytes)
        +
        +			if parserBufferSize >= peekBytesLength {
        +				break
        +			}
        +
        +			currentPeekSize *= 2
        +			parserBufferSize = peekBytesLength
        +		}
        +	}
        +
        +	for !p.isEOF {
        +		line, err = p.readUntil('\n')
        +		if err != nil {
        +			return err
        +		}
        +
        +		if f.options.AllowNestedValues &&
        +			isLastValueEmpty && len(line) > 0 {
        +			if line[0] == ' ' || line[0] == '\t' {
        +				err = lastRegularKey.addNestedValue(string(bytes.TrimSpace(line)))
        +				if err != nil {
        +					return err
        +				}
        +				continue
        +			}
        +		}
        +
        +		line = bytes.TrimLeftFunc(line, unicode.IsSpace)
        +		if len(line) == 0 {
        +			continue
        +		}
        +
        +		// Comments
        +		if line[0] == '#' || line[0] == ';' {
        +			// Note: we do not care ending line break,
        +			// it is needed for adding second line,
        +			// so just clean it once at the end when set to value.
        +			p.comment.Write(line)
        +			continue
        +		}
        +
        +		// Section
        +		if line[0] == '[' {
        +			// Read to the next ']' (TODO: support quoted strings)
        +			closeIdx := bytes.LastIndexByte(line, ']')
        +			if closeIdx == -1 {
        +				return fmt.Errorf("unclosed section: %s", line)
        +			}
        +
        +			name := string(line[1:closeIdx])
        +			section, err = f.NewSection(name)
        +			if err != nil {
        +				return err
        +			}
        +
        +			comment, has := cleanComment(line[closeIdx+1:])
        +			if has {
        +				p.comment.Write(comment)
        +			}
        +
        +			section.Comment = strings.TrimSpace(p.comment.String())
        +
        +			// Reset auto-counter and comments
        +			p.comment.Reset()
        +			p.count = 1
        +
        +			inUnparseableSection = false
        +			for i := range f.options.UnparseableSections {
        +				if f.options.UnparseableSections[i] == name ||
        +					(f.options.Insensitive && strings.EqualFold(f.options.UnparseableSections[i], name)) {
        +					inUnparseableSection = true
        +					continue
        +				}
        +			}
        +			continue
        +		}
        +
        +		if inUnparseableSection {
        +			section.isRawSection = true
        +			section.rawBody += string(line)
        +			continue
        +		}
        +
        +		kname, offset, err := readKeyName(f.options.KeyValueDelimiters, line)
        +		if err != nil {
        +			// Treat as boolean key when desired, and whole line is key name.
        +			if IsErrDelimiterNotFound(err) {
        +				switch {
        +				case f.options.AllowBooleanKeys:
        +					kname, err := p.readValue(line, parserBufferSize)
        +					if err != nil {
        +						return err
        +					}
        +					key, err := section.NewBooleanKey(kname)
        +					if err != nil {
        +						return err
        +					}
        +					key.Comment = strings.TrimSpace(p.comment.String())
        +					p.comment.Reset()
        +					continue
        +
        +				case f.options.SkipUnrecognizableLines:
        +					continue
        +				}
        +			}
        +			return err
        +		}
        +
        +		// Auto increment.
        +		isAutoIncr := false
        +		if kname == "-" {
        +			isAutoIncr = true
        +			kname = "#" + strconv.Itoa(p.count)
        +			p.count++
        +		}
        +
        +		value, err := p.readValue(line[offset:], parserBufferSize)
        +		if err != nil {
        +			return err
        +		}
        +		isLastValueEmpty = len(value) == 0
        +
        +		key, err := section.NewKey(kname, value)
        +		if err != nil {
        +			return err
        +		}
        +		key.isAutoIncrement = isAutoIncr
        +		key.Comment = strings.TrimSpace(p.comment.String())
        +		p.comment.Reset()
        +		lastRegularKey = key
        +	}
        +	return nil
        +}
        diff --git a/vendor/gopkg.in/ini.v1/section.go b/vendor/gopkg.in/ini.v1/section.go
        new file mode 100644
        index 000000000..6ba5ac290
        --- /dev/null
        +++ b/vendor/gopkg.in/ini.v1/section.go
        @@ -0,0 +1,256 @@
        +// Copyright 2014 Unknwon
        +//
        +// Licensed under the Apache License, Version 2.0 (the "License"): you may
        +// not use this file except in compliance with the License. You may obtain
        +// a copy of the License at
        +//
        +//     http://www.apache.org/licenses/LICENSE-2.0
        +//
        +// Unless required by applicable law or agreed to in writing, software
        +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
        +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
        +// License for the specific language governing permissions and limitations
        +// under the License.
        +
        +package ini
        +
        +import (
        +	"errors"
        +	"fmt"
        +	"strings"
        +)
        +
        +// Section represents a config section.
        +type Section struct {
        +	f        *File
        +	Comment  string
        +	name     string
        +	keys     map[string]*Key
        +	keyList  []string
        +	keysHash map[string]string
        +
        +	isRawSection bool
        +	rawBody      string
        +}
        +
        +func newSection(f *File, name string) *Section {
        +	return &Section{
        +		f:        f,
        +		name:     name,
        +		keys:     make(map[string]*Key),
        +		keyList:  make([]string, 0, 10),
        +		keysHash: make(map[string]string),
        +	}
        +}
        +
        +// Name returns name of Section.
        +func (s *Section) Name() string {
        +	return s.name
        +}
        +
        +// Body returns rawBody of Section if the section was marked as unparseable.
        +// It still follows the other rules of the INI format surrounding leading/trailing whitespace.
        +func (s *Section) Body() string {
        +	return strings.TrimSpace(s.rawBody)
        +}
        +
        +// SetBody updates body content only if section is raw.
        +func (s *Section) SetBody(body string) {
        +	if !s.isRawSection {
        +		return
        +	}
        +	s.rawBody = body
        +}
        +
        +// NewKey creates a new key to given section.
        +func (s *Section) NewKey(name, val string) (*Key, error) {
        +	if len(name) == 0 {
        +		return nil, errors.New("error creating new key: empty key name")
        +	} else if s.f.options.Insensitive {
        +		name = strings.ToLower(name)
        +	}
        +
        +	if s.f.BlockMode {
        +		s.f.lock.Lock()
        +		defer s.f.lock.Unlock()
        +	}
        +
        +	if inSlice(name, s.keyList) {
        +		if s.f.options.AllowShadows {
        +			if err := s.keys[name].addShadow(val); err != nil {
        +				return nil, err
        +			}
        +		} else {
        +			s.keys[name].value = val
        +			s.keysHash[name] = val
        +		}
        +		return s.keys[name], nil
        +	}
        +
        +	s.keyList = append(s.keyList, name)
        +	s.keys[name] = newKey(s, name, val)
        +	s.keysHash[name] = val
        +	return s.keys[name], nil
        +}
        +
        +// NewBooleanKey creates a new boolean type key to given section.
        +func (s *Section) NewBooleanKey(name string) (*Key, error) {
        +	key, err := s.NewKey(name, "true")
        +	if err != nil {
        +		return nil, err
        +	}
        +
        +	key.isBooleanType = true
        +	return key, nil
        +}
        +
        +// GetKey returns key in section by given name.
        +func (s *Section) GetKey(name string) (*Key, error) {
        +	if s.f.BlockMode {
        +		s.f.lock.RLock()
        +	}
        +	if s.f.options.Insensitive {
        +		name = strings.ToLower(name)
        +	}
        +	key := s.keys[name]
        +	if s.f.BlockMode {
        +		s.f.lock.RUnlock()
        +	}
        +
        +	if key == nil {
        +		// Check if it is a child-section.
        +		sname := s.name
        +		for {
        +			if i := strings.LastIndex(sname, "."); i > -1 {
        +				sname = sname[:i]
        +				sec, err := s.f.GetSection(sname)
        +				if err != nil {
        +					continue
        +				}
        +				return sec.GetKey(name)
        +			}
        +			break
        +		}
        +		return nil, fmt.Errorf("error when getting key of section %q: key %q not exists", s.name, name)
        +	}
        +	return key, nil
        +}
        +
        +// HasKey returns true if section contains a key with given name.
        +func (s *Section) HasKey(name string) bool {
        +	key, _ := s.GetKey(name)
        +	return key != nil
        +}
        +
        +// Deprecated: Use "HasKey" instead.
        +func (s *Section) Haskey(name string) bool {
        +	return s.HasKey(name)
        +}
        +
        +// HasValue returns true if section contains given raw value.
        +func (s *Section) HasValue(value string) bool {
        +	if s.f.BlockMode {
        +		s.f.lock.RLock()
        +		defer s.f.lock.RUnlock()
        +	}
        +
        +	for _, k := range s.keys {
        +		if value == k.value {
        +			return true
        +		}
        +	}
        +	return false
        +}
        +
        +// Key assumes named Key exists in section and returns a zero-value when not.
        +func (s *Section) Key(name string) *Key {
        +	key, err := s.GetKey(name)
        +	if err != nil {
        +		// It's OK here because the only possible error is empty key name,
        +		// but if it's empty, this piece of code won't be executed.
        +		key, _ = s.NewKey(name, "")
        +		return key
        +	}
        +	return key
        +}
        +
        +// Keys returns list of keys of section.
        +func (s *Section) Keys() []*Key {
        +	keys := make([]*Key, len(s.keyList))
        +	for i := range s.keyList {
        +		keys[i] = s.Key(s.keyList[i])
        +	}
        +	return keys
        +}
        +
        +// ParentKeys returns list of keys of parent section.
        +func (s *Section) ParentKeys() []*Key {
        +	var parentKeys []*Key
        +	sname := s.name
        +	for {
        +		if i := strings.LastIndex(sname, "."); i > -1 {
        +			sname = sname[:i]
        +			sec, err := s.f.GetSection(sname)
        +			if err != nil {
        +				continue
        +			}
        +			parentKeys = append(parentKeys, sec.Keys()...)
        +		} else {
        +			break
        +		}
        +
        +	}
        +	return parentKeys
        +}
        +
        +// KeyStrings returns list of key names of section.
        +func (s *Section) KeyStrings() []string {
        +	list := make([]string, len(s.keyList))
        +	copy(list, s.keyList)
        +	return list
        +}
        +
        +// KeysHash returns keys hash consisting of names and values.
        +func (s *Section) KeysHash() map[string]string {
        +	if s.f.BlockMode {
        +		s.f.lock.RLock()
        +		defer s.f.lock.RUnlock()
        +	}
        +
        +	hash := map[string]string{}
        +	for key, value := range s.keysHash {
        +		hash[key] = value
        +	}
        +	return hash
        +}
        +
        +// DeleteKey deletes a key from section.
        +func (s *Section) DeleteKey(name string) {
        +	if s.f.BlockMode {
        +		s.f.lock.Lock()
        +		defer s.f.lock.Unlock()
        +	}
        +
        +	for i, k := range s.keyList {
        +		if k == name {
        +			s.keyList = append(s.keyList[:i], s.keyList[i+1:]...)
        +			delete(s.keys, name)
        +			delete(s.keysHash, name)
        +			return
        +		}
        +	}
        +}
        +
        +// ChildSections returns a list of child sections of current section.
        +// For example, "[parent.child1]" and "[parent.child12]" are child sections
        +// of section "[parent]".
        +func (s *Section) ChildSections() []*Section {
        +	prefix := s.name + "."
        +	children := make([]*Section, 0, 3)
        +	for _, name := range s.f.sectionList {
        +		if strings.HasPrefix(name, prefix) {
        +			children = append(children, s.f.sections[name]...)
        +		}
        +	}
        +	return children
        +}
        diff --git a/vendor/gopkg.in/ini.v1/struct.go b/vendor/gopkg.in/ini.v1/struct.go
        new file mode 100644
        index 000000000..9be40a920
        --- /dev/null
        +++ b/vendor/gopkg.in/ini.v1/struct.go
        @@ -0,0 +1,729 @@
        +// Copyright 2014 Unknwon
        +//
        +// Licensed under the Apache License, Version 2.0 (the "License"): you may
        +// not use this file except in compliance with the License. You may obtain
        +// a copy of the License at
        +//
        +//     http://www.apache.org/licenses/LICENSE-2.0
        +//
        +// Unless required by applicable law or agreed to in writing, software
        +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
        +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
        +// License for the specific language governing permissions and limitations
        +// under the License.
        +
        +package ini
        +
        +import (
        +	"bytes"
        +	"errors"
        +	"fmt"
        +	"reflect"
        +	"strings"
        +	"time"
        +	"unicode"
        +)
        +
        +// NameMapper represents a ini tag name mapper.
        +type NameMapper func(string) string
        +
        +// Built-in name getters.
        +var (
        +	// SnackCase converts to format SNACK_CASE.
        +	SnackCase NameMapper = func(raw string) string {
        +		newstr := make([]rune, 0, len(raw))
        +		for i, chr := range raw {
        +			if isUpper := 'A' <= chr && chr <= 'Z'; isUpper {
        +				if i > 0 {
        +					newstr = append(newstr, '_')
        +				}
        +			}
        +			newstr = append(newstr, unicode.ToUpper(chr))
        +		}
        +		return string(newstr)
        +	}
        +	// TitleUnderscore converts to format title_underscore.
        +	TitleUnderscore NameMapper = func(raw string) string {
        +		newstr := make([]rune, 0, len(raw))
        +		for i, chr := range raw {
        +			if isUpper := 'A' <= chr && chr <= 'Z'; isUpper {
        +				if i > 0 {
        +					newstr = append(newstr, '_')
        +				}
        +				chr -= 'A' - 'a'
        +			}
        +			newstr = append(newstr, chr)
        +		}
        +		return string(newstr)
        +	}
        +)
        +
        +func (s *Section) parseFieldName(raw, actual string) string {
        +	if len(actual) > 0 {
        +		return actual
        +	}
        +	if s.f.NameMapper != nil {
        +		return s.f.NameMapper(raw)
        +	}
        +	return raw
        +}
        +
        +func parseDelim(actual string) string {
        +	if len(actual) > 0 {
        +		return actual
        +	}
        +	return ","
        +}
        +
        +var reflectTime = reflect.TypeOf(time.Now()).Kind()
        +
        +// setSliceWithProperType sets proper values to slice based on its type.
        +func setSliceWithProperType(key *Key, field reflect.Value, delim string, allowShadow, isStrict bool) error {
        +	var strs []string
        +	if allowShadow {
        +		strs = key.StringsWithShadows(delim)
        +	} else {
        +		strs = key.Strings(delim)
        +	}
        +
        +	numVals := len(strs)
        +	if numVals == 0 {
        +		return nil
        +	}
        +
        +	var vals interface{}
        +	var err error
        +
        +	sliceOf := field.Type().Elem().Kind()
        +	switch sliceOf {
        +	case reflect.String:
        +		vals = strs
        +	case reflect.Int:
        +		vals, err = key.parseInts(strs, true, false)
        +	case reflect.Int64:
        +		vals, err = key.parseInt64s(strs, true, false)
        +	case reflect.Uint:
        +		vals, err = key.parseUints(strs, true, false)
        +	case reflect.Uint64:
        +		vals, err = key.parseUint64s(strs, true, false)
        +	case reflect.Float64:
        +		vals, err = key.parseFloat64s(strs, true, false)
        +	case reflect.Bool:
        +		vals, err = key.parseBools(strs, true, false)
        +	case reflectTime:
        +		vals, err = key.parseTimesFormat(time.RFC3339, strs, true, false)
        +	default:
        +		return fmt.Errorf("unsupported type '[]%s'", sliceOf)
        +	}
        +	if err != nil && isStrict {
        +		return err
        +	}
        +
        +	slice := reflect.MakeSlice(field.Type(), numVals, numVals)
        +	for i := 0; i < numVals; i++ {
        +		switch sliceOf {
        +		case reflect.String:
        +			slice.Index(i).Set(reflect.ValueOf(vals.([]string)[i]))
        +		case reflect.Int:
        +			slice.Index(i).Set(reflect.ValueOf(vals.([]int)[i]))
        +		case reflect.Int64:
        +			slice.Index(i).Set(reflect.ValueOf(vals.([]int64)[i]))
        +		case reflect.Uint:
        +			slice.Index(i).Set(reflect.ValueOf(vals.([]uint)[i]))
        +		case reflect.Uint64:
        +			slice.Index(i).Set(reflect.ValueOf(vals.([]uint64)[i]))
        +		case reflect.Float64:
        +			slice.Index(i).Set(reflect.ValueOf(vals.([]float64)[i]))
        +		case reflect.Bool:
        +			slice.Index(i).Set(reflect.ValueOf(vals.([]bool)[i]))
        +		case reflectTime:
        +			slice.Index(i).Set(reflect.ValueOf(vals.([]time.Time)[i]))
        +		}
        +	}
        +	field.Set(slice)
        +	return nil
        +}
        +
        +func wrapStrictError(err error, isStrict bool) error {
        +	if isStrict {
        +		return err
        +	}
        +	return nil
        +}
        +
        +// setWithProperType sets proper value to field based on its type,
        +// but it does not return error for failing parsing,
        +// because we want to use default value that is already assigned to struct.
        +func setWithProperType(t reflect.Type, key *Key, field reflect.Value, delim string, allowShadow, isStrict bool) error {
        +	vt := t
        +	isPtr := t.Kind() == reflect.Ptr
        +	if isPtr {
        +		vt = t.Elem()
        +	}
        +	switch vt.Kind() {
        +	case reflect.String:
        +		stringVal := key.String()
        +		if isPtr {
        +			field.Set(reflect.ValueOf(&stringVal))
        +		} else if len(stringVal) > 0 {
        +			field.SetString(key.String())
        +		}
        +	case reflect.Bool:
        +		boolVal, err := key.Bool()
        +		if err != nil {
        +			return wrapStrictError(err, isStrict)
        +		}
        +		if isPtr {
        +			field.Set(reflect.ValueOf(&boolVal))
        +		} else {
        +			field.SetBool(boolVal)
        +		}
        +	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
        +		// ParseDuration will not return err for `0`, so check the type name
        +		if vt.Name() == "Duration" {
        +			durationVal, err := key.Duration()
        +			if err != nil {
        +				if intVal, err := key.Int64(); err == nil {
        +					field.SetInt(intVal)
        +					return nil
        +				}
        +				return wrapStrictError(err, isStrict)
        +			}
        +			if isPtr {
        +				field.Set(reflect.ValueOf(&durationVal))
        +			} else if int64(durationVal) > 0 {
        +				field.Set(reflect.ValueOf(durationVal))
        +			}
        +			return nil
        +		}
        +
        +		intVal, err := key.Int64()
        +		if err != nil {
        +			return wrapStrictError(err, isStrict)
        +		}
        +		if isPtr {
        +			pv := reflect.New(t.Elem())
        +			pv.Elem().SetInt(intVal)
        +			field.Set(pv)
        +		} else {
        +			field.SetInt(intVal)
        +		}
        +	//	byte is an alias for uint8, so supporting uint8 breaks support for byte
        +	case reflect.Uint, reflect.Uint16, reflect.Uint32, reflect.Uint64:
        +		durationVal, err := key.Duration()
        +		// Skip zero value
        +		if err == nil && uint64(durationVal) > 0 {
        +			if isPtr {
        +				field.Set(reflect.ValueOf(&durationVal))
        +			} else {
        +				field.Set(reflect.ValueOf(durationVal))
        +			}
        +			return nil
        +		}
        +
        +		uintVal, err := key.Uint64()
        +		if err != nil {
        +			return wrapStrictError(err, isStrict)
        +		}
        +		if isPtr {
        +			pv := reflect.New(t.Elem())
        +			pv.Elem().SetUint(uintVal)
        +			field.Set(pv)
        +		} else {
        +			field.SetUint(uintVal)
        +		}
        +
        +	case reflect.Float32, reflect.Float64:
        +		floatVal, err := key.Float64()
        +		if err != nil {
        +			return wrapStrictError(err, isStrict)
        +		}
        +		if isPtr {
        +			pv := reflect.New(t.Elem())
        +			pv.Elem().SetFloat(floatVal)
        +			field.Set(pv)
        +		} else {
        +			field.SetFloat(floatVal)
        +		}
        +	case reflectTime:
        +		timeVal, err := key.Time()
        +		if err != nil {
        +			return wrapStrictError(err, isStrict)
        +		}
        +		if isPtr {
        +			field.Set(reflect.ValueOf(&timeVal))
        +		} else {
        +			field.Set(reflect.ValueOf(timeVal))
        +		}
        +	case reflect.Slice:
        +		return setSliceWithProperType(key, field, delim, allowShadow, isStrict)
        +	default:
        +		return fmt.Errorf("unsupported type %q", t)
        +	}
        +	return nil
        +}
        +
        +func parseTagOptions(tag string) (rawName string, omitEmpty bool, allowShadow bool, allowNonUnique bool) {
        +	opts := strings.SplitN(tag, ",", 4)
        +	rawName = opts[0]
        +	if len(opts) > 1 {
        +		omitEmpty = opts[1] == "omitempty"
        +	}
        +	if len(opts) > 2 {
        +		allowShadow = opts[2] == "allowshadow"
        +	}
        +	if len(opts) > 3 {
        +		allowNonUnique = opts[3] == "nonunique"
        +	}
        +	return rawName, omitEmpty, allowShadow, allowNonUnique
        +}
        +
        +// mapToField maps the given value to the matching field of the given section.
        +// The sectionIndex is the index (if non unique sections are enabled) to which the value should be added.
        +func (s *Section) mapToField(val reflect.Value, isStrict bool, sectionIndex int) error {
        +	if val.Kind() == reflect.Ptr {
        +		val = val.Elem()
        +	}
        +	typ := val.Type()
        +
        +	for i := 0; i < typ.NumField(); i++ {
        +		field := val.Field(i)
        +		tpField := typ.Field(i)
        +
        +		tag := tpField.Tag.Get("ini")
        +		if tag == "-" {
        +			continue
        +		}
        +
        +		rawName, _, allowShadow, allowNonUnique := parseTagOptions(tag)
        +		fieldName := s.parseFieldName(tpField.Name, rawName)
        +		if len(fieldName) == 0 || !field.CanSet() {
        +			continue
        +		}
        +
        +		isStruct := tpField.Type.Kind() == reflect.Struct
        +		isStructPtr := tpField.Type.Kind() == reflect.Ptr && tpField.Type.Elem().Kind() == reflect.Struct
        +		isAnonymous := tpField.Type.Kind() == reflect.Ptr && tpField.Anonymous
        +		if isAnonymous {
        +			field.Set(reflect.New(tpField.Type.Elem()))
        +		}
        +
        +		if isAnonymous || isStruct || isStructPtr {
        +			if secs, err := s.f.SectionsByName(fieldName); err == nil {
        +				if len(secs) <= sectionIndex {
        +					return fmt.Errorf("there are not enough sections (%d <= %d) for the field %q", len(secs), sectionIndex, fieldName)
        +				}
        +				// Only set the field to non-nil struct value if we have a section for it.
        +				// Otherwise, we end up with a non-nil struct ptr even though there is no data.
        +				if isStructPtr && field.IsNil() {
        +					field.Set(reflect.New(tpField.Type.Elem()))
        +				}
        +				if err = secs[sectionIndex].mapToField(field, isStrict, sectionIndex); err != nil {
        +					return fmt.Errorf("map to field %q: %v", fieldName, err)
        +				}
        +				continue
        +			}
        +		}
        +
        +		// Map non-unique sections
        +		if allowNonUnique && tpField.Type.Kind() == reflect.Slice {
        +			newField, err := s.mapToSlice(fieldName, field, isStrict)
        +			if err != nil {
        +				return fmt.Errorf("map to slice %q: %v", fieldName, err)
        +			}
        +
        +			field.Set(newField)
        +			continue
        +		}
        +
        +		if key, err := s.GetKey(fieldName); err == nil {
        +			delim := parseDelim(tpField.Tag.Get("delim"))
        +			if err = setWithProperType(tpField.Type, key, field, delim, allowShadow, isStrict); err != nil {
        +				return fmt.Errorf("set field %q: %v", fieldName, err)
        +			}
        +		}
        +	}
        +	return nil
        +}
        +
        +// mapToSlice maps all sections with the same name and returns the new value.
        +// The type of the Value must be a slice.
        +func (s *Section) mapToSlice(secName string, val reflect.Value, isStrict bool) (reflect.Value, error) {
        +	secs, err := s.f.SectionsByName(secName)
        +	if err != nil {
        +		return reflect.Value{}, err
        +	}
        +
        +	typ := val.Type().Elem()
        +	for i, sec := range secs {
        +		elem := reflect.New(typ)
        +		if err = sec.mapToField(elem, isStrict, i); err != nil {
        +			return reflect.Value{}, fmt.Errorf("map to field from section %q: %v", secName, err)
        +		}
        +
        +		val = reflect.Append(val, elem.Elem())
        +	}
        +	return val, nil
        +}
        +
        +// mapTo maps a section to object v.
        +func (s *Section) mapTo(v interface{}, isStrict bool) error {
        +	typ := reflect.TypeOf(v)
        +	val := reflect.ValueOf(v)
        +	if typ.Kind() == reflect.Ptr {
        +		typ = typ.Elem()
        +		val = val.Elem()
        +	} else {
        +		return errors.New("not a pointer to a struct")
        +	}
        +
        +	if typ.Kind() == reflect.Slice {
        +		newField, err := s.mapToSlice(s.name, val, isStrict)
        +		if err != nil {
        +			return err
        +		}
        +
        +		val.Set(newField)
        +		return nil
        +	}
        +
        +	return s.mapToField(val, isStrict, 0)
        +}
        +
        +// MapTo maps section to given struct.
        +func (s *Section) MapTo(v interface{}) error {
        +	return s.mapTo(v, false)
        +}
        +
        +// StrictMapTo maps section to given struct in strict mode,
        +// which returns all possible error including value parsing error.
        +func (s *Section) StrictMapTo(v interface{}) error {
        +	return s.mapTo(v, true)
        +}
        +
        +// MapTo maps file to given struct.
        +func (f *File) MapTo(v interface{}) error {
        +	return f.Section("").MapTo(v)
        +}
        +
        +// StrictMapTo maps file to given struct in strict mode,
        +// which returns all possible error including value parsing error.
        +func (f *File) StrictMapTo(v interface{}) error {
        +	return f.Section("").StrictMapTo(v)
        +}
        +
        +// MapToWithMapper maps data sources to given struct with name mapper.
        +func MapToWithMapper(v interface{}, mapper NameMapper, source interface{}, others ...interface{}) error {
        +	cfg, err := Load(source, others...)
        +	if err != nil {
        +		return err
        +	}
        +	cfg.NameMapper = mapper
        +	return cfg.MapTo(v)
        +}
        +
        +// StrictMapToWithMapper maps data sources to given struct with name mapper in strict mode,
        +// which returns all possible error including value parsing error.
        +func StrictMapToWithMapper(v interface{}, mapper NameMapper, source interface{}, others ...interface{}) error {
        +	cfg, err := Load(source, others...)
        +	if err != nil {
        +		return err
        +	}
        +	cfg.NameMapper = mapper
        +	return cfg.StrictMapTo(v)
        +}
        +
        +// MapTo maps data sources to given struct.
        +func MapTo(v, source interface{}, others ...interface{}) error {
        +	return MapToWithMapper(v, nil, source, others...)
        +}
        +
        +// StrictMapTo maps data sources to given struct in strict mode,
        +// which returns all possible error including value parsing error.
        +func StrictMapTo(v, source interface{}, others ...interface{}) error {
        +	return StrictMapToWithMapper(v, nil, source, others...)
        +}
        +
        +// reflectSliceWithProperType does the opposite thing as setSliceWithProperType.
        +func reflectSliceWithProperType(key *Key, field reflect.Value, delim string, allowShadow bool) error {
        +	slice := field.Slice(0, field.Len())
        +	if field.Len() == 0 {
        +		return nil
        +	}
        +	sliceOf := field.Type().Elem().Kind()
        +
        +	if allowShadow {
        +		var keyWithShadows *Key
        +		for i := 0; i < field.Len(); i++ {
        +			var val string
        +			switch sliceOf {
        +			case reflect.String:
        +				val = slice.Index(i).String()
        +			case reflect.Int, reflect.Int64:
        +				val = fmt.Sprint(slice.Index(i).Int())
        +			case reflect.Uint, reflect.Uint64:
        +				val = fmt.Sprint(slice.Index(i).Uint())
        +			case reflect.Float64:
        +				val = fmt.Sprint(slice.Index(i).Float())
        +			case reflect.Bool:
        +				val = fmt.Sprint(slice.Index(i).Bool())
        +			case reflectTime:
        +				val = slice.Index(i).Interface().(time.Time).Format(time.RFC3339)
        +			default:
        +				return fmt.Errorf("unsupported type '[]%s'", sliceOf)
        +			}
        +
        +			if i == 0 {
        +				keyWithShadows = newKey(key.s, key.name, val)
        +			} else {
        +				_ = keyWithShadows.AddShadow(val)
        +			}
        +		}
        +		key = keyWithShadows
        +		return nil
        +	}
        +
        +	var buf bytes.Buffer
        +	for i := 0; i < field.Len(); i++ {
        +		switch sliceOf {
        +		case reflect.String:
        +			buf.WriteString(slice.Index(i).String())
        +		case reflect.Int, reflect.Int64:
        +			buf.WriteString(fmt.Sprint(slice.Index(i).Int()))
        +		case reflect.Uint, reflect.Uint64:
        +			buf.WriteString(fmt.Sprint(slice.Index(i).Uint()))
        +		case reflect.Float64:
        +			buf.WriteString(fmt.Sprint(slice.Index(i).Float()))
        +		case reflect.Bool:
        +			buf.WriteString(fmt.Sprint(slice.Index(i).Bool()))
        +		case reflectTime:
        +			buf.WriteString(slice.Index(i).Interface().(time.Time).Format(time.RFC3339))
        +		default:
        +			return fmt.Errorf("unsupported type '[]%s'", sliceOf)
        +		}
        +		buf.WriteString(delim)
        +	}
        +	key.SetValue(buf.String()[:buf.Len()-len(delim)])
        +	return nil
        +}
        +
        +// reflectWithProperType does the opposite thing as setWithProperType.
        +func reflectWithProperType(t reflect.Type, key *Key, field reflect.Value, delim string, allowShadow bool) error {
        +	switch t.Kind() {
        +	case reflect.String:
        +		key.SetValue(field.String())
        +	case reflect.Bool:
        +		key.SetValue(fmt.Sprint(field.Bool()))
        +	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
        +		key.SetValue(fmt.Sprint(field.Int()))
        +	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
        +		key.SetValue(fmt.Sprint(field.Uint()))
        +	case reflect.Float32, reflect.Float64:
        +		key.SetValue(fmt.Sprint(field.Float()))
        +	case reflectTime:
        +		key.SetValue(fmt.Sprint(field.Interface().(time.Time).Format(time.RFC3339)))
        +	case reflect.Slice:
        +		return reflectSliceWithProperType(key, field, delim, allowShadow)
        +	case reflect.Ptr:
        +		if !field.IsNil() {
        +			return reflectWithProperType(t.Elem(), key, field.Elem(), delim, allowShadow)
        +		}
        +	default:
        +		return fmt.Errorf("unsupported type %q", t)
        +	}
        +	return nil
        +}
        +
        +// CR: copied from encoding/json/encode.go with modifications of time.Time support.
        +// TODO: add more test coverage.
        +func isEmptyValue(v reflect.Value) bool {
        +	switch v.Kind() {
        +	case reflect.Array, reflect.Map, reflect.Slice, reflect.String:
        +		return v.Len() == 0
        +	case reflect.Bool:
        +		return !v.Bool()
        +	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
        +		return v.Int() == 0
        +	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
        +		return v.Uint() == 0
        +	case reflect.Float32, reflect.Float64:
        +		return v.Float() == 0
        +	case reflect.Interface, reflect.Ptr:
        +		return v.IsNil()
        +	case reflectTime:
        +		t, ok := v.Interface().(time.Time)
        +		return ok && t.IsZero()
        +	}
        +	return false
        +}
        +
        +// StructReflector is the interface implemented by struct types that can extract themselves into INI objects.
        +type StructReflector interface {
        +	ReflectINIStruct(*File) error
        +}
        +
        +func (s *Section) reflectFrom(val reflect.Value) error {
        +	if val.Kind() == reflect.Ptr {
        +		val = val.Elem()
        +	}
        +	typ := val.Type()
        +
        +	for i := 0; i < typ.NumField(); i++ {
        +		if !val.Field(i).CanInterface() {
        +			continue
        +		}
        +
        +		field := val.Field(i)
        +		tpField := typ.Field(i)
        +
        +		tag := tpField.Tag.Get("ini")
        +		if tag == "-" {
        +			continue
        +		}
        +
        +		rawName, omitEmpty, allowShadow, allowNonUnique := parseTagOptions(tag)
        +		if omitEmpty && isEmptyValue(field) {
        +			continue
        +		}
        +
        +		if r, ok := field.Interface().(StructReflector); ok {
        +			return r.ReflectINIStruct(s.f)
        +		}
        +
        +		fieldName := s.parseFieldName(tpField.Name, rawName)
        +		if len(fieldName) == 0 || !field.CanSet() {
        +			continue
        +		}
        +
        +		if (tpField.Type.Kind() == reflect.Ptr && tpField.Anonymous) ||
        +			(tpField.Type.Kind() == reflect.Struct && tpField.Type.Name() != "Time") {
        +			// Note: The only error here is section doesn't exist.
        +			sec, err := s.f.GetSection(fieldName)
        +			if err != nil {
        +				// Note: fieldName can never be empty here, ignore error.
        +				sec, _ = s.f.NewSection(fieldName)
        +			}
        +
        +			// Add comment from comment tag
        +			if len(sec.Comment) == 0 {
        +				sec.Comment = tpField.Tag.Get("comment")
        +			}
        +
        +			if err = sec.reflectFrom(field); err != nil {
        +				return fmt.Errorf("reflect from field %q: %v", fieldName, err)
        +			}
        +			continue
        +		}
        +
        +		if allowNonUnique && tpField.Type.Kind() == reflect.Slice {
        +			slice := field.Slice(0, field.Len())
        +			if field.Len() == 0 {
        +				return nil
        +			}
        +			sliceOf := field.Type().Elem().Kind()
        +
        +			for i := 0; i < field.Len(); i++ {
        +				if sliceOf != reflect.Struct && sliceOf != reflect.Ptr {
        +					return fmt.Errorf("field %q is not a slice of pointer or struct", fieldName)
        +				}
        +
        +				sec, err := s.f.NewSection(fieldName)
        +				if err != nil {
        +					return err
        +				}
        +
        +				// Add comment from comment tag
        +				if len(sec.Comment) == 0 {
        +					sec.Comment = tpField.Tag.Get("comment")
        +				}
        +
        +				if err := sec.reflectFrom(slice.Index(i)); err != nil {
        +					return fmt.Errorf("reflect from field %q: %v", fieldName, err)
        +				}
        +			}
        +			continue
        +		}
        +
        +		// Note: Same reason as section.
        +		key, err := s.GetKey(fieldName)
        +		if err != nil {
        +			key, _ = s.NewKey(fieldName, "")
        +		}
        +
        +		// Add comment from comment tag
        +		if len(key.Comment) == 0 {
        +			key.Comment = tpField.Tag.Get("comment")
        +		}
        +
        +		delim := parseDelim(tpField.Tag.Get("delim"))
        +		if err = reflectWithProperType(tpField.Type, key, field, delim, allowShadow); err != nil {
        +			return fmt.Errorf("reflect field %q: %v", fieldName, err)
        +		}
        +
        +	}
        +	return nil
        +}
        +
        +// ReflectFrom reflects section from given struct. It overwrites existing ones.
        +func (s *Section) ReflectFrom(v interface{}) error {
        +	typ := reflect.TypeOf(v)
        +	val := reflect.ValueOf(v)
        +
        +	if s.name != DefaultSection && s.f.options.AllowNonUniqueSections &&
        +		(typ.Kind() == reflect.Slice || typ.Kind() == reflect.Ptr) {
        +		// Clear sections to make sure none exists before adding the new ones
        +		s.f.DeleteSection(s.name)
        +
        +		if typ.Kind() == reflect.Ptr {
        +			sec, err := s.f.NewSection(s.name)
        +			if err != nil {
        +				return err
        +			}
        +			return sec.reflectFrom(val.Elem())
        +		}
        +
        +		slice := val.Slice(0, val.Len())
        +		sliceOf := val.Type().Elem().Kind()
        +		if sliceOf != reflect.Ptr {
        +			return fmt.Errorf("not a slice of pointers")
        +		}
        +
        +		for i := 0; i < slice.Len(); i++ {
        +			sec, err := s.f.NewSection(s.name)
        +			if err != nil {
        +				return err
        +			}
        +
        +			err = sec.reflectFrom(slice.Index(i))
        +			if err != nil {
        +				return fmt.Errorf("reflect from %dth field: %v", i, err)
        +			}
        +		}
        +
        +		return nil
        +	}
        +
        +	if typ.Kind() == reflect.Ptr {
        +		val = val.Elem()
        +	} else {
        +		return errors.New("not a pointer to a struct")
        +	}
        +
        +	return s.reflectFrom(val)
        +}
        +
        +// ReflectFrom reflects file from given struct.
        +func (f *File) ReflectFrom(v interface{}) error {
        +	return f.Section("").ReflectFrom(v)
        +}
        +
        +// ReflectFromWithMapper reflects data sources from given struct with name mapper.
        +func ReflectFromWithMapper(cfg *File, v interface{}, mapper NameMapper) error {
        +	cfg.NameMapper = mapper
        +	return cfg.ReflectFrom(v)
        +}
        +
        +// ReflectFrom reflects data sources from given struct.
        +func ReflectFrom(cfg *File, v interface{}) error {
        +	return ReflectFromWithMapper(cfg, v, nil)
        +}
        diff --git a/vendor/gopkg.in/src-d/go-billy-siva.v4/.travis.yml b/vendor/gopkg.in/src-d/go-billy-siva.v4/.travis.yml
        deleted file mode 100644
        index 3921f41a6..000000000
        --- a/vendor/gopkg.in/src-d/go-billy-siva.v4/.travis.yml
        +++ /dev/null
        @@ -1,25 +0,0 @@
        -language: go
        -
        -go:
        -    - 1.11.x
        -    - 1.10.x
        -
        -matrix:
        -    fast_finish: true
        -    allow_failures:
        -        - go: tip
        -
        -install:
        -  - rm -rf $GOPATH/src/gopkg.in/src-d
        -  - mkdir -p $GOPATH/src/gopkg.in/src-d
        -  - ln -s $PWD $GOPATH/src/gopkg.in/src-d/go-billy-siva.v4
        -  - cd $GOPATH/src/gopkg.in/src-d/go-billy-siva.v4
        -  - go get -v -t ./...
        -
        -script:
        -  - cd $GOPATH/src/gopkg.in/src-d/go-billy-siva.v4
        -  - go test -v ./...
        -  - make test-coverage
        -
        -after_success:
        -  - bash <(curl -s https://codecov.io/bash)
        diff --git a/vendor/gopkg.in/src-d/go-billy-siva.v4/DCO b/vendor/gopkg.in/src-d/go-billy-siva.v4/DCO
        deleted file mode 100644
        index 3aca339de..000000000
        --- a/vendor/gopkg.in/src-d/go-billy-siva.v4/DCO
        +++ /dev/null
        @@ -1,36 +0,0 @@
        -Developer Certificate of Origin
        -Version 1.1
        -
        -Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
        -660 York Street, Suite 102,
        -San Francisco, CA 94110 USA
        -
        -Everyone is permitted to copy and distribute verbatim copies of this
        -license document, but changing it is not allowed.
        -
        -
        -Developer's Certificate of Origin 1.1
        -
        -By making a contribution to this project, I certify that:
        -
        -(a) The contribution was created in whole or in part by me and I
        -    have the right to submit it under the open source license
        -    indicated in the file; or
        -
        -(b) The contribution is based upon previous work that, to the best
        -    of my knowledge, is covered under an appropriate open source
        -    license and I have the right under that license to submit that
        -    work with modifications, whether created in whole or in part
        -    by me, under the same open source license (unless I am
        -    permitted to submit under a different license), as indicated
        -    in the file; or
        -
        -(c) The contribution was provided directly to me by some other
        -    person who certified (a), (b) or (c) and I have not modified
        -    it.
        -
        -(d) I understand and agree that this project and the contribution
        -    are public and that a record of the contribution (including all
        -    personal information I submit with it, including my sign-off) is
        -    maintained indefinitely and may be redistributed consistent with
        -    this project or the open source license(s) involved.
        \ No newline at end of file
        diff --git a/vendor/gopkg.in/src-d/go-billy-siva.v4/LICENSE b/vendor/gopkg.in/src-d/go-billy-siva.v4/LICENSE
        deleted file mode 100644
        index 6d972e26b..000000000
        --- a/vendor/gopkg.in/src-d/go-billy-siva.v4/LICENSE
        +++ /dev/null
        @@ -1,201 +0,0 @@
        -                                 Apache License
        -                           Version 2.0, January 2004
        -                        http://www.apache.org/licenses/
        -
        -   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
        -
        -   1. Definitions.
        -
        -      "License" shall mean the terms and conditions for use, reproduction,
        -      and distribution as defined by Sections 1 through 9 of this document.
        -
        -      "Licensor" shall mean the copyright owner or entity authorized by
        -      the copyright owner that is granting the License.
        -
        -      "Legal Entity" shall mean the union of the acting entity and all
        -      other entities that control, are controlled by, or are under common
        -      control with that entity. For the purposes of this definition,
        -      "control" means (i) the power, direct or indirect, to cause the
        -      direction or management of such entity, whether by contract or
        -      otherwise, or (ii) ownership of fifty percent (50%) or more of the
        -      outstanding shares, or (iii) beneficial ownership of such entity.
        -
        -      "You" (or "Your") shall mean an individual or Legal Entity
        -      exercising permissions granted by this License.
        -
        -      "Source" form shall mean the preferred form for making modifications,
        -      including but not limited to software source code, documentation
        -      source, and configuration files.
        -
        -      "Object" form shall mean any form resulting from mechanical
        -      transformation or translation of a Source form, including but
        -      not limited to compiled object code, generated documentation,
        -      and conversions to other media types.
        -
        -      "Work" shall mean the work of authorship, whether in Source or
        -      Object form, made available under the License, as indicated by a
        -      copyright notice that is included in or attached to the work
        -      (an example is provided in the Appendix below).
        -
        -      "Derivative Works" shall mean any work, whether in Source or Object
        -      form, that is based on (or derived from) the Work and for which the
        -      editorial revisions, annotations, elaborations, or other modifications
        -      represent, as a whole, an original work of authorship. For the purposes
        -      of this License, Derivative Works shall not include works that remain
        -      separable from, or merely link (or bind by name) to the interfaces of,
        -      the Work and Derivative Works thereof.
        -
        -      "Contribution" shall mean any work of authorship, including
        -      the original version of the Work and any modifications or additions
        -      to that Work or Derivative Works thereof, that is intentionally
        -      submitted to Licensor for inclusion in the Work by the copyright owner
        -      or by an individual or Legal Entity authorized to submit on behalf of
        -      the copyright owner. For the purposes of this definition, "submitted"
        -      means any form of electronic, verbal, or written communication sent
        -      to the Licensor or its representatives, including but not limited to
        -      communication on electronic mailing lists, source code control systems,
        -      and issue tracking systems that are managed by, or on behalf of, the
        -      Licensor for the purpose of discussing and improving the Work, but
        -      excluding communication that is conspicuously marked or otherwise
        -      designated in writing by the copyright owner as "Not a Contribution."
        -
        -      "Contributor" shall mean Licensor and any individual or Legal Entity
        -      on behalf of whom a Contribution has been received by Licensor and
        -      subsequently incorporated within the Work.
        -
        -   2. Grant of Copyright License. Subject to the terms and conditions of
        -      this License, each Contributor hereby grants to You a perpetual,
        -      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
        -      copyright license to reproduce, prepare Derivative Works of,
        -      publicly display, publicly perform, sublicense, and distribute the
        -      Work and such Derivative Works in Source or Object form.
        -
        -   3. Grant of Patent License. Subject to the terms and conditions of
        -      this License, each Contributor hereby grants to You a perpetual,
        -      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
        -      (except as stated in this section) patent license to make, have made,
        -      use, offer to sell, sell, import, and otherwise transfer the Work,
        -      where such license applies only to those patent claims licensable
        -      by such Contributor that are necessarily infringed by their
        -      Contribution(s) alone or by combination of their Contribution(s)
        -      with the Work to which such Contribution(s) was submitted. If You
        -      institute patent litigation against any entity (including a
        -      cross-claim or counterclaim in a lawsuit) alleging that the Work
        -      or a Contribution incorporated within the Work constitutes direct
        -      or contributory patent infringement, then any patent licenses
        -      granted to You under this License for that Work shall terminate
        -      as of the date such litigation is filed.
        -
        -   4. Redistribution. You may reproduce and distribute copies of the
        -      Work or Derivative Works thereof in any medium, with or without
        -      modifications, and in Source or Object form, provided that You
        -      meet the following conditions:
        -
        -      (a) You must give any other recipients of the Work or
        -          Derivative Works a copy of this License; and
        -
        -      (b) You must cause any modified files to carry prominent notices
        -          stating that You changed the files; and
        -
        -      (c) You must retain, in the Source form of any Derivative Works
        -          that You distribute, all copyright, patent, trademark, and
        -          attribution notices from the Source form of the Work,
        -          excluding those notices that do not pertain to any part of
        -          the Derivative Works; and
        -
        -      (d) If the Work includes a "NOTICE" text file as part of its
        -          distribution, then any Derivative Works that You distribute must
        -          include a readable copy of the attribution notices contained
        -          within such NOTICE file, excluding those notices that do not
        -          pertain to any part of the Derivative Works, in at least one
        -          of the following places: within a NOTICE text file distributed
        -          as part of the Derivative Works; within the Source form or
        -          documentation, if provided along with the Derivative Works; or,
        -          within a display generated by the Derivative Works, if and
        -          wherever such third-party notices normally appear. The contents
        -          of the NOTICE file are for informational purposes only and
        -          do not modify the License. You may add Your own attribution
        -          notices within Derivative Works that You distribute, alongside
        -          or as an addendum to the NOTICE text from the Work, provided
        -          that such additional attribution notices cannot be construed
        -          as modifying the License.
        -
        -      You may add Your own copyright statement to Your modifications and
        -      may provide additional or different license terms and conditions
        -      for use, reproduction, or distribution of Your modifications, or
        -      for any such Derivative Works as a whole, provided Your use,
        -      reproduction, and distribution of the Work otherwise complies with
        -      the conditions stated in this License.
        -
        -   5. Submission of Contributions. Unless You explicitly state otherwise,
        -      any Contribution intentionally submitted for inclusion in the Work
        -      by You to the Licensor shall be under the terms and conditions of
        -      this License, without any additional terms or conditions.
        -      Notwithstanding the above, nothing herein shall supersede or modify
        -      the terms of any separate license agreement you may have executed
        -      with Licensor regarding such Contributions.
        -
        -   6. Trademarks. This License does not grant permission to use the trade
        -      names, trademarks, service marks, or product names of the Licensor,
        -      except as required for reasonable and customary use in describing the
        -      origin of the Work and reproducing the content of the NOTICE file.
        -
        -   7. Disclaimer of Warranty. Unless required by applicable law or
        -      agreed to in writing, Licensor provides the Work (and each
        -      Contributor provides its Contributions) on an "AS IS" BASIS,
        -      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
        -      implied, including, without limitation, any warranties or conditions
        -      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
        -      PARTICULAR PURPOSE. You are solely responsible for determining the
        -      appropriateness of using or redistributing the Work and assume any
        -      risks associated with Your exercise of permissions under this License.
        -
        -   8. Limitation of Liability. In no event and under no legal theory,
        -      whether in tort (including negligence), contract, or otherwise,
        -      unless required by applicable law (such as deliberate and grossly
        -      negligent acts) or agreed to in writing, shall any Contributor be
        -      liable to You for damages, including any direct, indirect, special,
        -      incidental, or consequential damages of any character arising as a
        -      result of this License or out of the use or inability to use the
        -      Work (including but not limited to damages for loss of goodwill,
        -      work stoppage, computer failure or malfunction, or any and all
        -      other commercial damages or losses), even if such Contributor
        -      has been advised of the possibility of such damages.
        -
        -   9. Accepting Warranty or Additional Liability. While redistributing
        -      the Work or Derivative Works thereof, You may choose to offer,
        -      and charge a fee for, acceptance of support, warranty, indemnity,
        -      or other liability obligations and/or rights consistent with this
        -      License. However, in accepting such obligations, You may act only
        -      on Your own behalf and on Your sole responsibility, not on behalf
        -      of any other Contributor, and only if You agree to indemnify,
        -      defend, and hold each Contributor harmless for any liability
        -      incurred by, or claims asserted against, such Contributor by reason
        -      of your accepting any such warranty or additional liability.
        -
        -   END OF TERMS AND CONDITIONS
        -
        -   APPENDIX: How to apply the Apache License to your work.
        -
        -      To apply the Apache License to your work, attach the following
        -      boilerplate notice, with the fields enclosed by brackets "{}"
        -      replaced with your own identifying information. (Don't include
        -      the brackets!)  The text should be enclosed in the appropriate
        -      comment syntax for the file format. We also recommend that a
        -      file or class name and description of purpose be included on the
        -      same "printed page" as the copyright notice for easier
        -      identification within third-party archives.
        -
        -   Copyright 2017 Sourced Technologies, S.L.
        -
        -   Licensed under the Apache License, Version 2.0 (the "License");
        -   you may not use this file except in compliance with the License.
        -   You may obtain a copy of the License at
        -
        -       http://www.apache.org/licenses/LICENSE-2.0
        -
        -   Unless required by applicable law or agreed to in writing, software
        -   distributed under the License is distributed on an "AS IS" BASIS,
        -   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        -   See the License for the specific language governing permissions and
        -   limitations under the License.
        \ No newline at end of file
        diff --git a/vendor/gopkg.in/src-d/go-billy-siva.v4/MAINTAINERS b/vendor/gopkg.in/src-d/go-billy-siva.v4/MAINTAINERS
        deleted file mode 100644
        index d4dbd612c..000000000
        --- a/vendor/gopkg.in/src-d/go-billy-siva.v4/MAINTAINERS
        +++ /dev/null
        @@ -1 +0,0 @@
        -Javier Fontan  (@jfontan)
        diff --git a/vendor/gopkg.in/src-d/go-billy-siva.v4/Makefile b/vendor/gopkg.in/src-d/go-billy-siva.v4/Makefile
        deleted file mode 100644
        index 939a8bbb6..000000000
        --- a/vendor/gopkg.in/src-d/go-billy-siva.v4/Makefile
        +++ /dev/null
        @@ -1,25 +0,0 @@
        -# General
        -WORKDIR = $(PWD)
        -
        -# Go parameters
        -GOCMD = go
        -GOTEST = $(GOCMD) test -v
        -
        -# Coverage
        -COVERAGE_REPORT = coverage.txt
        -COVERAGE_PROFILE = profile.out
        -COVERAGE_MODE = atomic
        -
        -test-coverage:
        -	cd $(WORKDIR); \
        -	echo "" > $(COVERAGE_REPORT); \
        -	for dir in `find . -name "*.go" | grep -o '.*/' | sort | uniq`; do \
        -		$(GOTEST) $$dir -coverprofile=$(COVERAGE_PROFILE) -covermode=$(COVERAGE_MODE); \
        -		if [ $$? != 0 ]; then \
        -			exit 2; \
        -		fi; \
        -		if [ -f $(COVERAGE_PROFILE) ]; then \
        -			cat $(COVERAGE_PROFILE) >> $(COVERAGE_REPORT); \
        -			rm $(COVERAGE_PROFILE); \
        -		fi; \
        -	done; \
        \ No newline at end of file
        diff --git a/vendor/gopkg.in/src-d/go-billy-siva.v4/README.md b/vendor/gopkg.in/src-d/go-billy-siva.v4/README.md
        deleted file mode 100644
        index 721dbff71..000000000
        --- a/vendor/gopkg.in/src-d/go-billy-siva.v4/README.md
        +++ /dev/null
        @@ -1,18 +0,0 @@
        -# go-billy-siva [![GoDoc](https://godoc.org/gopkg.in/src-d/go-billy-siva.v4?status.svg)](https://godoc.org/gopkg.in/src-d/go-billy-siva.v4) [![Build Status](https://travis-ci.org/src-d/go-billy-siva.svg?branch=master)](https://travis-ci.org/src-d/go-billy-siva)
        -
        -
        -`go-billy-siva` is a limit [billy](https://github.com/src-d/go-billy) filesystem implementation based on [`siva`](https://github.com/src-d/go-siva). The implementation is limited to `billy.Basic` and `billy.Dir`, the usage of the [billy.helpers](https://github.com/src-d/go-billy/tree/master/helper) is required to be able of use as a full `billy.Filesystem`
        -
        -Installation
        -------------
        -
        -The recommended way to install go-billy-siva
        -
        -```
        -go get -u gopkg.in/src-d/go-billy-siva.v4/...
        -```
        -
        -License
        --------
        -
        -Apache License 2.0, see [LICENSE](LICENSE)
        diff --git a/vendor/gopkg.in/src-d/go-billy-siva.v4/file.go b/vendor/gopkg.in/src-d/go-billy-siva.v4/file.go
        deleted file mode 100644
        index cbb4172d2..000000000
        --- a/vendor/gopkg.in/src-d/go-billy-siva.v4/file.go
        +++ /dev/null
        @@ -1,114 +0,0 @@
        -package sivafs
        -
        -import (
        -	"io"
        -	"os"
        -
        -	"gopkg.in/src-d/go-billy.v4"
        -	"gopkg.in/src-d/go-siva.v1"
        -)
        -
        -type file struct {
        -	name        string
        -	closeNotify func() error
        -	isClosed    bool
        -
        -	w siva.Writer
        -	r *io.SectionReader
        -}
        -
        -func newFile(filename string, w siva.Writer, closeNotify func() error) billy.File {
        -	return &file{
        -		name:        filename,
        -		closeNotify: closeNotify,
        -		w:           w,
        -	}
        -}
        -
        -func openFile(filename string, r *io.SectionReader) billy.File {
        -	return &file{
        -		name: filename,
        -		r:    r,
        -	}
        -}
        -
        -func (f *file) Name() string {
        -	return f.name
        -}
        -
        -func (f *file) Read(p []byte) (int, error) {
        -	if f.isClosed {
        -		return 0, os.ErrClosed
        -	}
        -
        -	if f.r == nil {
        -		return 0, ErrWriteOnlyFile
        -	}
        -
        -	return f.r.Read(p)
        -}
        -
        -func (f *file) ReadAt(b []byte, off int64) (int, error) {
        -	if f.isClosed {
        -		return 0, os.ErrClosed
        -	}
        -
        -	if f.r == nil {
        -		return 0, ErrWriteOnlyFile
        -	}
        -
        -	return f.r.ReadAt(b, off)
        -}
        -
        -func (f *file) Seek(offset int64, whence int) (int64, error) {
        -	if f.isClosed {
        -		return 0, os.ErrClosed
        -	}
        -
        -	if f.r == nil {
        -		return 0, ErrNonSeekableFile
        -	}
        -
        -	return f.r.Seek(offset, whence)
        -}
        -
        -func (f *file) Write(p []byte) (int, error) {
        -	if f.isClosed {
        -		return 0, os.ErrClosed
        -	}
        -
        -	if f.w == nil {
        -		return 0, ErrReadOnlyFile
        -	}
        -
        -	return f.w.Write(p)
        -}
        -
        -func (f *file) Close() error {
        -	if f.isClosed {
        -		return os.ErrClosed
        -	}
        -
        -	defer func() { f.isClosed = true }()
        -
        -	if f.closeNotify == nil {
        -		return nil
        -	}
        -
        -	return f.closeNotify()
        -}
        -
        -// Lock is a no-op. It's not implemented in the underlying siva library.
        -func (f *file) Lock() error {
        -	return nil
        -}
        -
        -// Unlock is a no-op. It's not implemented in the underlying siva library.
        -func (f *file) Unlock() error {
        -	return nil
        -}
        -
        -// Truncate is not supported by siva files.
        -func (f *file) Truncate(size int64) error {
        -	return billy.ErrNotSupported
        -}
        diff --git a/vendor/gopkg.in/src-d/go-billy-siva.v4/fileinfo.go b/vendor/gopkg.in/src-d/go-billy-siva.v4/fileinfo.go
        deleted file mode 100644
        index 7eeda5157..000000000
        --- a/vendor/gopkg.in/src-d/go-billy-siva.v4/fileinfo.go
        +++ /dev/null
        @@ -1,74 +0,0 @@
        -package sivafs
        -
        -import (
        -	"os"
        -	"path/filepath"
        -	"time"
        -
        -	"gopkg.in/src-d/go-siva.v1"
        -)
        -
        -type fileInfo struct {
        -	e *siva.IndexEntry
        -}
        -
        -func newFileInfo(e *siva.IndexEntry) os.FileInfo {
        -	return &fileInfo{e}
        -}
        -
        -func (f *fileInfo) Name() string {
        -	return filepath.Base(f.e.Name)
        -}
        -
        -func (f *fileInfo) Size() int64 {
        -	return int64(f.e.Size)
        -}
        -
        -func (f *fileInfo) Mode() os.FileMode {
        -	return f.e.Mode
        -}
        -
        -func (f *fileInfo) ModTime() time.Time {
        -	return f.e.ModTime
        -}
        -
        -func (f *fileInfo) IsDir() bool {
        -	return f.e.Mode&os.ModeDir != 0
        -}
        -
        -func (f *fileInfo) Sys() interface{} {
        -	return nil
        -}
        -
        -type dirFileInfo struct {
        -	path    string
        -	modtime time.Time
        -}
        -
        -func newDirFileInfo(path string, modtime time.Time) os.FileInfo {
        -	return &dirFileInfo{path, modtime}
        -}
        -
        -func (f *dirFileInfo) Name() string {
        -	return filepath.Base(f.path)
        -}
        -
        -func (f *dirFileInfo) Size() int64 {
        -	return 0
        -}
        -
        -func (f *dirFileInfo) Mode() os.FileMode {
        -	return os.ModeDir
        -}
        -
        -func (f *dirFileInfo) ModTime() time.Time {
        -	return f.modtime
        -}
        -
        -func (f *dirFileInfo) IsDir() bool {
        -	return true
        -}
        -
        -func (f *dirFileInfo) Sys() interface{} {
        -	return nil
        -}
        diff --git a/vendor/gopkg.in/src-d/go-billy-siva.v4/filesystem.go b/vendor/gopkg.in/src-d/go-billy-siva.v4/filesystem.go
        deleted file mode 100644
        index ed86bc621..000000000
        --- a/vendor/gopkg.in/src-d/go-billy-siva.v4/filesystem.go
        +++ /dev/null
        @@ -1,493 +0,0 @@
        -package sivafs
        -
        -import (
        -	"errors"
        -	"fmt"
        -	"os"
        -	"path"
        -	"path/filepath"
        -	"strings"
        -	"syscall"
        -	"time"
        -
        -	"gopkg.in/src-d/go-billy.v4"
        -	"gopkg.in/src-d/go-billy.v4/helper/chroot"
        -	"gopkg.in/src-d/go-billy.v4/helper/mount"
        -	"gopkg.in/src-d/go-billy.v4/util"
        -	"gopkg.in/src-d/go-siva.v1"
        -)
        -
        -var (
        -	ErrNonSeekableFile          = errors.New("file non-seekable")
        -	ErrFileWriteModeAlreadyOpen = errors.New("previous file in write mode already open")
        -	ErrReadOnlyFile             = errors.New("file is read-only")
        -	ErrWriteOnlyFile            = errors.New("file is write-only")
        -)
        -
        -const sivaCapabilities = billy.ReadCapability |
        -	billy.WriteCapability |
        -	billy.SeekCapability
        -
        -type SivaSync interface {
        -	// Sync closes any open files, this method should be called at the end of
        -	// program to ensure that all the files are properly closed, otherwise the
        -	// siva file will be corrupted.
        -	Sync() error
        -}
        -
        -type SivaBasicFS interface {
        -	billy.Basic
        -	billy.Dir
        -
        -	SivaSync
        -}
        -
        -type SivaFS interface {
        -	billy.Filesystem
        -	SivaSync
        -}
        -
        -type sivaFS struct {
        -	underlying billy.Filesystem
        -	path       string
        -	f          billy.File
        -	rw         *siva.ReadWriter
        -	index      siva.Index
        -
        -	fileWriteModeOpen bool
        -}
        -
        -// New creates a new filesystem backed by a siva file with the given path in
        -// the given filesystem. The siva file will be opened or created lazily with
        -// the first operation.
        -//
        -// All files opened in write mode must be closed, otherwise the siva file will
        -// be corrupted.
        -func New(fs billy.Filesystem, path string) SivaBasicFS {
        -	return &sivaFS{
        -		underlying: fs,
        -		path:       path,
        -	}
        -}
        -
        -// NewFilesystem creates an entire filesystem using siva as the main backend,
        -// but supplying unsupported functionality using as a temporal files backend
        -// the main filesystem. It needs an additional parameter `tmpFs` where temporary
        -// files will be stored. Note that `tmpFs` will be mounted as /tmp.
        -func NewFilesystem(fs billy.Filesystem, path string, tmpFs billy.Filesystem) (SivaFS, error) {
        -	tempdir := "/tmp"
        -
        -	root := New(fs, path)
        -	m := mount.New(root, tempdir, tmpFs)
        -
        -	t := &temp{
        -		defaultDir: tempdir,
        -		SivaSync:   root,
        -		Filesystem: chroot.New(m, "/"),
        -	}
        -
        -	return t, nil
        -}
        -
        -// Create creates a new file. This file is created using CREATE, TRUNCATE and
        -// WRITE ONLY flags due to limitations working on siva files.
        -func (fs *sivaFS) Create(path string) (billy.File, error) {
        -	return fs.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, os.FileMode(0666))
        -}
        -
        -func (fs *sivaFS) Open(path string) (billy.File, error) {
        -	return fs.OpenFile(path, os.O_RDONLY, 0)
        -}
        -
        -func (fs *sivaFS) OpenFile(path string, flag int, mode os.FileMode) (billy.File, error) {
        -	path = normalizePath(path)
        -	if flag&os.O_CREATE != 0 && flag&os.O_TRUNC == 0 {
        -		return nil, billy.ErrNotSupported
        -	}
        -
        -	if err := fs.ensureOpen(); err != nil {
        -		return nil, err
        -	}
        -
        -	if flag&os.O_CREATE != 0 {
        -		if fs.fileWriteModeOpen {
        -			return nil, ErrFileWriteModeAlreadyOpen
        -		}
        -
        -		return fs.createFile(path, flag, mode)
        -	}
        -
        -	return fs.openFile(path, flag, mode)
        -}
        -
        -func (fs *sivaFS) Stat(p string) (os.FileInfo, error) {
        -	p = normalizePath(p)
        -
        -	if err := fs.ensureOpen(); err != nil {
        -		return nil, err
        -	}
        -
        -	index, err := fs.getIndex()
        -	if err != nil {
        -		return nil, err
        -	}
        -
        -	e := index.Find(p)
        -	if e != nil {
        -		return newFileInfo(e), nil
        -	}
        -
        -	stat, err := getDir(index, p)
        -	if err != nil {
        -		return nil, err
        -	}
        -
        -	if stat == nil {
        -		return nil, os.ErrNotExist
        -	}
        -
        -	return stat, nil
        -}
        -
        -func (fs *sivaFS) ReadDir(path string) ([]os.FileInfo, error) {
        -	path = normalizePath(path)
        -
        -	if err := fs.ensureOpen(); err != nil {
        -		return nil, err
        -	}
        -
        -	index, err := fs.getIndex()
        -	if err != nil {
        -		return nil, err
        -	}
        -
        -	files, err := listFiles(index, path)
        -	if err != nil {
        -		return nil, err
        -	}
        -
        -	dirs, err := listDirs(index, path)
        -	if err != nil {
        -		return nil, err
        -	}
        -
        -	return append(dirs, files...), nil
        -}
        -
        -func (fs *sivaFS) MkdirAll(filename string, perm os.FileMode) error {
        -	if err := fs.ensureOpen(); err != nil {
        -		return err
        -	}
        -
        -	index, err := fs.getIndex()
        -	if err != nil {
        -		return err
        -	}
        -	e := index.Find(filename)
        -	if e != nil {
        -		return &os.PathError{
        -			Op:   "mkdir",
        -			Path: filename,
        -			Err:  syscall.ENOTDIR,
        -		}
        -	}
        -
        -	return nil
        -}
        -
        -// Join joins the specified elements using the filesystem separator.
        -func (fs *sivaFS) Join(elem ...string) string {
        -	return filepath.Join(elem...)
        -}
        -
        -func (fs *sivaFS) Remove(path string) error {
        -	path = normalizePath(path)
        -
        -	if err := fs.ensureOpen(); err != nil {
        -		return err
        -	}
        -
        -	index, err := fs.getIndex()
        -	if err != nil {
        -		return err
        -	}
        -
        -	e := index.Find(path)
        -
        -	if e != nil {
        -		// delete index cache on modification
        -		fs.index = nil
        -
        -		return fs.rw.WriteHeader(&siva.Header{
        -			Name:    path,
        -			ModTime: time.Now(),
        -			Mode:    0,
        -			Flags:   siva.FlagDeleted,
        -		})
        -	}
        -
        -	dir, err := getDir(index, path)
        -	if err != nil {
        -		return err
        -	}
        -
        -	if dir != nil {
        -		return &os.PathError{
        -			Op:   "remove",
        -			Path: path,
        -			Err:  syscall.ENOTEMPTY,
        -		}
        -	}
        -
        -	// there are no file and no directory with this path
        -	return os.ErrNotExist
        -}
        -
        -func (fs *sivaFS) Rename(from, to string) error {
        -	return billy.ErrNotSupported
        -}
        -
        -func (fs *sivaFS) Sync() error {
        -	return fs.ensureClosed()
        -}
        -
        -// Capability implements billy.Capable interface.
        -func (fs *sivaFS) Capabilities() billy.Capability {
        -	return sivaCapabilities
        -}
        -
        -func (fs *sivaFS) ensureOpen() error {
        -	if fs.rw != nil {
        -		return nil
        -	}
        -
        -	f, err := fs.underlying.OpenFile(fs.path, os.O_CREATE|os.O_RDWR, 0666)
        -	if err != nil {
        -		return err
        -	}
        -
        -	rw, err := siva.NewReaderWriter(f)
        -	if err != nil {
        -		f.Close()
        -		return err
        -	}
        -
        -	fs.rw = rw
        -	fs.f = f
        -	return nil
        -}
        -
        -func (fs *sivaFS) ensureClosed() error {
        -	if fs.rw == nil {
        -		return nil
        -	}
        -
        -	if err := fs.rw.Close(); err != nil {
        -		return err
        -	}
        -
        -	fs.rw = nil
        -
        -	f := fs.f
        -	fs.f = nil
        -	return f.Close()
        -}
        -
        -func (fs *sivaFS) createFile(path string, flag int, mode os.FileMode) (billy.File, error) {
        -	if flag&os.O_RDWR != 0 || flag&os.O_RDONLY != 0 {
        -		return nil, billy.ErrNotSupported
        -	}
        -
        -	header := &siva.Header{
        -		Name:    path,
        -		Mode:    mode,
        -		ModTime: time.Now(),
        -	}
        -
        -	// delete index cache on modification
        -	fs.index = nil
        -
        -	if err := fs.rw.WriteHeader(header); err != nil {
        -		return nil, err
        -	}
        -
        -	closeFunc := func() error {
        -		if fs.rw == nil {
        -			return nil
        -		}
        -
        -		if flag&os.O_WRONLY != 0 || flag&os.O_RDWR != 0 {
        -			fs.fileWriteModeOpen = false
        -		}
        -
        -		return fs.rw.Flush()
        -	}
        -
        -	defer func() { fs.fileWriteModeOpen = true }()
        -	return newFile(path, fs.rw, closeFunc), nil
        -}
        -
        -func (fs *sivaFS) openFile(path string, flag int, mode os.FileMode) (billy.File, error) {
        -	if flag&os.O_RDWR != 0 || flag&os.O_WRONLY != 0 {
        -		return nil, billy.ErrNotSupported
        -	}
        -
        -	index, err := fs.getIndex()
        -	if err != nil {
        -		return nil, err
        -	}
        -
        -	e := index.Find(path)
        -	if e == nil {
        -		return nil, os.ErrNotExist
        -	}
        -
        -	sr, err := fs.rw.Get(e)
        -	if err != nil {
        -		return nil, err
        -	}
        -
        -	return openFile(path, sr), nil
        -}
        -
        -func (fs *sivaFS) getIndex() (siva.Index, error) {
        -	// return cached index
        -	if fs.index != nil {
        -		return fs.index, nil
        -	}
        -
        -	index, err := fs.rw.Index()
        -	if err != nil {
        -		return nil, err
        -	}
        -
        -	fs.index = index.ToSafePaths()
        -	fs.index = fs.index.Filter()
        -
        -	return fs.index, nil
        -}
        -
        -func listFiles(index siva.Index, dir string) ([]os.FileInfo, error) {
        -	dir = addTrailingSlash(dir)
        -
        -	entries, err := index.Glob(fmt.Sprintf("%s*", dir))
        -	if err != nil {
        -		return nil, err
        -	}
        -
        -	contents := []os.FileInfo{}
        -	for _, e := range entries {
        -		contents = append(contents, newFileInfo(e))
        -	}
        -
        -	return contents, nil
        -}
        -
        -func getDir(index siva.Index, dir string) (os.FileInfo, error) {
        -	dir = addTrailingSlash(dir)
        -	lenDir := len(dir)
        -
        -	entries := make([]*siva.IndexEntry, 0)
        -
        -	for _, e := range index {
        -		if len(e.Name) > lenDir {
        -			if e.Name[:lenDir] == dir {
        -				entries = append(entries, e)
        -			}
        -		}
        -	}
        -
        -	if len(entries) == 0 {
        -		return nil, nil
        -	}
        -
        -	var oldDir time.Time
        -	for _, e := range entries {
        -		if oldDir.Before(e.ModTime) {
        -			oldDir = e.ModTime
        -		}
        -	}
        -
        -	return newDirFileInfo(path.Clean(dir), oldDir), nil
        -}
        -
        -func listDirs(index siva.Index, dir string) ([]os.FileInfo, error) {
        -	dir = addTrailingSlash(dir)
        -
        -	depth := strings.Count(dir, "/")
        -	dirs := map[string]time.Time{}
        -	dirOrder := make([]string, 0)
        -	for _, e := range index {
        -		if !strings.HasPrefix(e.Name, dir) {
        -			continue
        -		}
        -
        -		targetParts := strings.Split(e.Name, "/")
        -		if len(targetParts) <= depth+1 {
        -			continue
        -		}
        -
        -		dir := strings.Join(targetParts[:depth+1], "/")
        -		oldDir, ok := dirs[dir]
        -		if !ok || oldDir.Before(e.ModTime) {
        -			dirs[dir] = e.ModTime
        -			if !ok {
        -				dirOrder = append(dirOrder, dir)
        -			}
        -		}
        -	}
        -
        -	contents := []os.FileInfo{}
        -	for _, dir := range dirOrder {
        -		contents = append(contents, newDirFileInfo(dir, dirs[dir]))
        -	}
        -
        -	return contents, nil
        -}
        -
        -// addTrailingSlash adds trailing slash to the path if it does not have one.
        -func addTrailingSlash(path string) string {
        -	if path == "" {
        -		return path
        -	}
        -
        -	if !strings.HasSuffix(path, "/") {
        -		path = path + "/"
        -	}
        -
        -	return path
        -}
        -
        -// normalizePath returns a path relative to '/'.
        -// It assumes UNIX-style slash-delimited paths.
        -func normalizePath(path string) string {
        -	path = filepath.Join("/", path)
        -	return removeLeadingSlash(path)
        -}
        -
        -// removeLeadingSlash removes leading slash of the path, if any.
        -func removeLeadingSlash(path string) string {
        -	if strings.HasPrefix(path, "/") {
        -		return path[1:]
        -	}
        -
        -	return path
        -}
        -
        -type temp struct {
        -	billy.Filesystem
        -	SivaSync
        -
        -	defaultDir string
        -}
        -
        -// Capability implements billy.Capable interface.
        -func (h *temp) Capabilities() billy.Capability {
        -	return sivaCapabilities
        -}
        -
        -func (h *temp) TempFile(dir, prefix string) (billy.File, error) {
        -	dir = h.Join(h.defaultDir, dir)
        -
        -	return util.TempFile(h.Filesystem, dir, prefix)
        -}
        diff --git a/vendor/gopkg.in/src-d/go-billy.v4/.gitignore b/vendor/gopkg.in/src-d/go-billy.v4/.gitignore
        index 62cdb53bc..7aeb46699 100644
        --- a/vendor/gopkg.in/src-d/go-billy.v4/.gitignore
        +++ b/vendor/gopkg.in/src-d/go-billy.v4/.gitignore
        @@ -2,4 +2,3 @@
         /vendor
         Gopkg.lock
         Gopkg.toml
        -go.sum
        diff --git a/vendor/gopkg.in/src-d/go-billy.v4/.travis.yml b/vendor/gopkg.in/src-d/go-billy.v4/.travis.yml
        index 759e2fba8..a70b470d4 100644
        --- a/vendor/gopkg.in/src-d/go-billy.v4/.travis.yml
        +++ b/vendor/gopkg.in/src-d/go-billy.v4/.travis.yml
        @@ -11,6 +11,7 @@ install:
         
         script:
           - make test-coverage
        +  - ./.ci/test-building-binaries-for-supported-os.sh
         
         after_success:
           - bash <(curl -s https://codecov.io/bash)
        diff --git a/vendor/gopkg.in/src-d/go-billy.v4/README.md b/vendor/gopkg.in/src-d/go-billy.v4/README.md
        index ef243cca5..ae4a3f869 100644
        --- a/vendor/gopkg.in/src-d/go-billy.v4/README.md
        +++ b/vendor/gopkg.in/src-d/go-billy.v4/README.md
        @@ -1,4 +1,4 @@
        -# go-billy [![GoDoc](https://godoc.org/gopkg.in/src-d/go-billy.v4?status.svg)](https://godoc.org/gopkg.in/src-d/go-billy.v4) [![Build Status](https://travis-ci.org/src-d/go-billy.svg)](https://travis-ci.org/src-d/go-billy) [![Build status](https://ci.appveyor.com/api/projects/status/vx2qn6vlakbi724t?svg=true)](https://ci.appveyor.com/project/mcuadros/go-billy) [![codecov](https://codecov.io/gh/src-d/go-billy/branch/master/graph/badge.svg)](https://codecov.io/gh/src-d/go-billy)
        +# go-billy [![GoDoc](https://godoc.org/gopkg.in/src-d/go-billy.v4?status.svg)](https://godoc.org/gopkg.in/src-d/go-billy.v4) [![Build Status](https://travis-ci.com/src-d/go-billy.svg)](https://travis-ci.com/src-d/go-billy) [![Build status](https://ci.appveyor.com/api/projects/status/vx2qn6vlakbi724t?svg=true)](https://ci.appveyor.com/project/mcuadros/go-billy) [![codecov](https://codecov.io/gh/src-d/go-billy/branch/master/graph/badge.svg)](https://codecov.io/gh/src-d/go-billy)
         
         The missing interface filesystem abstraction for Go.
         Billy implements an interface based on the `os` standard library, allowing to develop applications without dependency on the underlying storage. Makes it virtually free to implement mocks and testing over filesystem operations.
        diff --git a/vendor/gopkg.in/src-d/go-billy.v4/go.mod b/vendor/gopkg.in/src-d/go-billy.v4/go.mod
        index eec158111..e5227de0a 100644
        --- a/vendor/gopkg.in/src-d/go-billy.v4/go.mod
        +++ b/vendor/gopkg.in/src-d/go-billy.v4/go.mod
        @@ -2,6 +2,7 @@ module gopkg.in/src-d/go-billy.v4
         
         require (
         	github.com/kr/pretty v0.1.0 // indirect
        -	golang.org/x/sys v0.0.0-20180903190138-2b024373dcd9
        +	github.com/kr/pty v1.1.8 // indirect
        +	golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e
         	gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127
         )
        diff --git a/vendor/gopkg.in/src-d/go-billy.v4/go.sum b/vendor/gopkg.in/src-d/go-billy.v4/go.sum
        new file mode 100644
        index 000000000..5e9ed217e
        --- /dev/null
        +++ b/vendor/gopkg.in/src-d/go-billy.v4/go.sum
        @@ -0,0 +1,12 @@
        +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
        +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
        +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
        +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
        +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
        +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
        +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
        +golang.org/x/sys v0.0.0-20180903190138-2b024373dcd9 h1:lkiLiLBHGoH3XnqSLUIaBsilGMUjI+Uy2Xu2JLUtTas=
        +golang.org/x/sys v0.0.0-20180903190138-2b024373dcd9/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
        +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
        +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
        +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
        diff --git a/vendor/gopkg.in/src-d/go-billy.v4/helper/mount/mount.go b/vendor/gopkg.in/src-d/go-billy.v4/helper/mount/mount.go
        deleted file mode 100644
        index 83f7dd515..000000000
        --- a/vendor/gopkg.in/src-d/go-billy.v4/helper/mount/mount.go
        +++ /dev/null
        @@ -1,271 +0,0 @@
        -package mount
        -
        -import (
        -	"io"
        -	"os"
        -	"path/filepath"
        -	"strings"
        -
        -	"fmt"
        -
        -	"gopkg.in/src-d/go-billy.v4"
        -	"gopkg.in/src-d/go-billy.v4/helper/polyfill"
        -)
        -
        -var separator = string(filepath.Separator)
        -
        -// Mount is a helper that allows to emulate the behavior of mount in memory.
        -// Very usufull to create a temporal dir, on filesystem where is a performance
        -// penalty in doing so.
        -type Mount struct {
        -	underlying billy.Filesystem
        -	source     billy.Filesystem
        -	mountpoint string
        -}
        -
        -// New creates a new filesystem wrapping up 'fs' the intercepts all the calls
        -// made to `mountpoint` path and redirecting it to `source` filesystem.
        -func New(fs billy.Basic, mountpoint string, source billy.Basic) *Mount {
        -	return &Mount{
        -		underlying: polyfill.New(fs),
        -		source:     polyfill.New(source),
        -		mountpoint: cleanPath(mountpoint),
        -	}
        -}
        -
        -func (h *Mount) Create(path string) (billy.File, error) {
        -	fs, fullpath := h.getBasicAndPath(path)
        -	if fullpath == "." {
        -		return nil, os.ErrInvalid
        -	}
        -
        -	f, err := fs.Create(fullpath)
        -	return wrapFile(f, path), err
        -}
        -
        -func (h *Mount) Open(path string) (billy.File, error) {
        -	fs, fullpath := h.getBasicAndPath(path)
        -	if fullpath == "." {
        -		return nil, os.ErrInvalid
        -	}
        -
        -	f, err := fs.Open(fullpath)
        -	return wrapFile(f, path), err
        -}
        -
        -func (h *Mount) OpenFile(path string, flag int, mode os.FileMode) (billy.File, error) {
        -	fs, fullpath := h.getBasicAndPath(path)
        -	if fullpath == "." {
        -		return nil, os.ErrInvalid
        -	}
        -
        -	f, err := fs.OpenFile(fullpath, flag, mode)
        -	return wrapFile(f, path), err
        -}
        -
        -func (h *Mount) Rename(from, to string) error {
        -	fromInSource := h.isMountpoint(from)
        -	toInSource := h.isMountpoint(to)
        -
        -	var fromFS, toFS billy.Basic
        -
        -	switch {
        -	case fromInSource && toInSource:
        -		from = h.mustRelToMountpoint(from)
        -		to = h.mustRelToMountpoint(to)
        -		return h.source.Rename(from, to)
        -	case !fromInSource && !toInSource:
        -		return h.underlying.Rename(from, to)
        -	case fromInSource && !toInSource:
        -		fromFS = h.source
        -		from = h.mustRelToMountpoint(from)
        -		toFS = h.underlying
        -		to = cleanPath(to)
        -	case !fromInSource && toInSource:
        -		fromFS = h.underlying
        -		from = cleanPath(from)
        -		toFS = h.source
        -		to = h.mustRelToMountpoint(to)
        -	}
        -
        -	if err := copyPath(fromFS, toFS, from, to); err != nil {
        -		return err
        -	}
        -
        -	return fromFS.Remove(from)
        -}
        -
        -func (h *Mount) Stat(path string) (os.FileInfo, error) {
        -	fs, fullpath := h.getBasicAndPath(path)
        -	return fs.Stat(fullpath)
        -}
        -
        -func (h *Mount) Remove(path string) error {
        -	fs, fullpath := h.getBasicAndPath(path)
        -	if fullpath == "." {
        -		return os.ErrInvalid
        -	}
        -
        -	return fs.Remove(fullpath)
        -}
        -
        -func (h *Mount) ReadDir(path string) ([]os.FileInfo, error) {
        -	fs, fullpath, err := h.getDirAndPath(path)
        -	if err != nil {
        -		return nil, err
        -	}
        -
        -	return fs.ReadDir(fullpath)
        -}
        -
        -func (h *Mount) MkdirAll(filename string, perm os.FileMode) error {
        -	fs, fullpath, err := h.getDirAndPath(filename)
        -	if err != nil {
        -		return err
        -	}
        -
        -	return fs.MkdirAll(fullpath, perm)
        -}
        -
        -func (h *Mount) Symlink(target, link string) error {
        -	fs, fullpath, err := h.getSymlinkAndPath(link)
        -	if err != nil {
        -		return err
        -	}
        -
        -	resolved := filepath.Join(filepath.Dir(link), target)
        -	if h.isMountpoint(resolved) != h.isMountpoint(link) {
        -		return fmt.Errorf("invalid symlink, target is crossing filesystems")
        -	}
        -
        -	return fs.Symlink(target, fullpath)
        -}
        -
        -func (h *Mount) Join(elem ...string) string {
        -	return h.underlying.Join(elem...)
        -}
        -
        -func (h *Mount) Readlink(link string) (string, error) {
        -	fs, fullpath, err := h.getSymlinkAndPath(link)
        -	if err != nil {
        -		return "", err
        -	}
        -
        -	return fs.Readlink(fullpath)
        -}
        -
        -func (h *Mount) Lstat(path string) (os.FileInfo, error) {
        -	fs, fullpath, err := h.getSymlinkAndPath(path)
        -	if err != nil {
        -		return nil, err
        -	}
        -
        -	return fs.Lstat(fullpath)
        -}
        -
        -func (h *Mount) Underlying() billy.Basic {
        -	return h.underlying
        -}
        -
        -// Capabilities implements the Capable interface.
        -func (fs *Mount) Capabilities() billy.Capability {
        -	return billy.Capabilities(fs.underlying) & billy.Capabilities(fs.source)
        -}
        -
        -func (fs *Mount) getBasicAndPath(path string) (billy.Basic, string) {
        -	path = cleanPath(path)
        -	if !fs.isMountpoint(path) {
        -		return fs.underlying, path
        -	}
        -
        -	return fs.source, fs.mustRelToMountpoint(path)
        -}
        -
        -func (fs *Mount) getDirAndPath(path string) (billy.Dir, string, error) {
        -	path = cleanPath(path)
        -	if !fs.isMountpoint(path) {
        -		return fs.underlying.(billy.Dir), path, nil
        -	}
        -
        -	return fs.source.(billy.Dir), fs.mustRelToMountpoint(path), nil
        -}
        -
        -func (fs *Mount) getSymlinkAndPath(path string) (billy.Symlink, string, error) {
        -	path = cleanPath(path)
        -	if !fs.isMountpoint(path) {
        -		return fs.underlying.(billy.Symlink), path, nil
        -	}
        -
        -	return fs.source.(billy.Symlink), fs.mustRelToMountpoint(path), nil
        -}
        -
        -func (fs *Mount) mustRelToMountpoint(path string) string {
        -	path = cleanPath(path)
        -	fullpath, err := filepath.Rel(fs.mountpoint, path)
        -	if err != nil {
        -		panic(err)
        -	}
        -
        -	return fullpath
        -}
        -
        -func (fs *Mount) isMountpoint(path string) bool {
        -	path = cleanPath(path)
        -	return strings.HasPrefix(path, fs.mountpoint)
        -}
        -
        -func cleanPath(path string) string {
        -	path = filepath.FromSlash(path)
        -	rel, err := filepath.Rel(separator, path)
        -	if err == nil {
        -		path = rel
        -	}
        -
        -	return filepath.Clean(path)
        -}
        -
        -// copyPath copies a file across filesystems.
        -func copyPath(src, dst billy.Basic, srcPath, dstPath string) error {
        -	dstFile, err := dst.Create(dstPath)
        -	if err != nil {
        -		return err
        -	}
        -
        -	srcFile, err := src.Open(srcPath)
        -	if err != nil {
        -		return err
        -	}
        -
        -	_, err = io.Copy(dstFile, srcFile)
        -	if err != nil {
        -		return err
        -	}
        -
        -	err = dstFile.Close()
        -	if err != nil {
        -		_ = srcFile.Close()
        -		return err
        -	}
        -
        -	return srcFile.Close()
        -}
        -
        -type file struct {
        -	billy.File
        -	name string
        -}
        -
        -func wrapFile(f billy.File, filename string) billy.File {
        -	if f == nil {
        -		return nil
        -	}
        -
        -	return &file{
        -		File: f,
        -		name: cleanPath(filename),
        -	}
        -}
        -
        -func (f *file) Name() string {
        -	return f.name
        -}
        diff --git a/vendor/gopkg.in/src-d/go-billy.v4/memfs/memory.go b/vendor/gopkg.in/src-d/go-billy.v4/memfs/memory.go
        deleted file mode 100644
        index 7eab69925..000000000
        --- a/vendor/gopkg.in/src-d/go-billy.v4/memfs/memory.go
        +++ /dev/null
        @@ -1,393 +0,0 @@
        -// Package memfs provides a billy filesystem base on memory.
        -package memfs // import "gopkg.in/src-d/go-billy.v4/memfs"
        -
        -import (
        -	"errors"
        -	"fmt"
        -	"io"
        -	"os"
        -	"path/filepath"
        -	"strings"
        -	"time"
        -
        -	"gopkg.in/src-d/go-billy.v4"
        -	"gopkg.in/src-d/go-billy.v4/helper/chroot"
        -	"gopkg.in/src-d/go-billy.v4/util"
        -)
        -
        -const separator = filepath.Separator
        -
        -// Memory a very convenient filesystem based on memory files
        -type Memory struct {
        -	s *storage
        -
        -	tempCount int
        -}
        -
        -//New returns a new Memory filesystem.
        -func New() billy.Filesystem {
        -	fs := &Memory{s: newStorage()}
        -	return chroot.New(fs, string(separator))
        -}
        -
        -func (fs *Memory) Create(filename string) (billy.File, error) {
        -	return fs.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666)
        -}
        -
        -func (fs *Memory) Open(filename string) (billy.File, error) {
        -	return fs.OpenFile(filename, os.O_RDONLY, 0)
        -}
        -
        -func (fs *Memory) OpenFile(filename string, flag int, perm os.FileMode) (billy.File, error) {
        -	f, has := fs.s.Get(filename)
        -	if !has {
        -		if !isCreate(flag) {
        -			return nil, os.ErrNotExist
        -		}
        -
        -		var err error
        -		f, err = fs.s.New(filename, perm, flag)
        -		if err != nil {
        -			return nil, err
        -		}
        -	} else {
        -		if target, isLink := fs.resolveLink(filename, f); isLink {
        -			return fs.OpenFile(target, flag, perm)
        -		}
        -	}
        -
        -	if f.mode.IsDir() {
        -		return nil, fmt.Errorf("cannot open directory: %s", filename)
        -	}
        -
        -	return f.Duplicate(filename, perm, flag), nil
        -}
        -
        -var errNotLink = errors.New("not a link")
        -
        -func (fs *Memory) resolveLink(fullpath string, f *file) (target string, isLink bool) {
        -	if !isSymlink(f.mode) {
        -		return fullpath, false
        -	}
        -
        -	target = string(f.content.bytes)
        -	if !isAbs(target) {
        -		target = fs.Join(filepath.Dir(fullpath), target)
        -	}
        -
        -	return target, true
        -}
        -
        -// On Windows OS, IsAbs validates if a path is valid based on if stars with a
        -// unit (eg.: `C:\`)  to assert that is absolute, but in this mem implementation
        -// any path starting by `separator` is also considered absolute.
        -func isAbs(path string) bool {
        -	return filepath.IsAbs(path) || strings.HasPrefix(path, string(separator))
        -}
        -
        -func (fs *Memory) Stat(filename string) (os.FileInfo, error) {
        -	f, has := fs.s.Get(filename)
        -	if !has {
        -		return nil, os.ErrNotExist
        -	}
        -
        -	fi, _ := f.Stat()
        -
        -	var err error
        -	if target, isLink := fs.resolveLink(filename, f); isLink {
        -		fi, err = fs.Stat(target)
        -		if err != nil {
        -			return nil, err
        -		}
        -	}
        -
        -	// the name of the file should always the name of the stated file, so we
        -	// overwrite the Stat returned from the storage with it, since the
        -	// filename may belong to a link.
        -	fi.(*fileInfo).name = filepath.Base(filename)
        -	return fi, nil
        -}
        -
        -func (fs *Memory) Lstat(filename string) (os.FileInfo, error) {
        -	f, has := fs.s.Get(filename)
        -	if !has {
        -		return nil, os.ErrNotExist
        -	}
        -
        -	return f.Stat()
        -}
        -
        -func (fs *Memory) ReadDir(path string) ([]os.FileInfo, error) {
        -	if f, has := fs.s.Get(path); has {
        -		if target, isLink := fs.resolveLink(path, f); isLink {
        -			return fs.ReadDir(target)
        -		}
        -	}
        -
        -	var entries []os.FileInfo
        -	for _, f := range fs.s.Children(path) {
        -		fi, _ := f.Stat()
        -		entries = append(entries, fi)
        -	}
        -
        -	return entries, nil
        -}
        -
        -func (fs *Memory) MkdirAll(path string, perm os.FileMode) error {
        -	_, err := fs.s.New(path, perm|os.ModeDir, 0)
        -	return err
        -}
        -
        -func (fs *Memory) TempFile(dir, prefix string) (billy.File, error) {
        -	return util.TempFile(fs, dir, prefix)
        -}
        -
        -func (fs *Memory) getTempFilename(dir, prefix string) string {
        -	fs.tempCount++
        -	filename := fmt.Sprintf("%s_%d_%d", prefix, fs.tempCount, time.Now().UnixNano())
        -	return fs.Join(dir, filename)
        -}
        -
        -func (fs *Memory) Rename(from, to string) error {
        -	return fs.s.Rename(from, to)
        -}
        -
        -func (fs *Memory) Remove(filename string) error {
        -	return fs.s.Remove(filename)
        -}
        -
        -func (fs *Memory) Join(elem ...string) string {
        -	return filepath.Join(elem...)
        -}
        -
        -func (fs *Memory) Symlink(target, link string) error {
        -	_, err := fs.Stat(link)
        -	if err == nil {
        -		return os.ErrExist
        -	}
        -
        -	if !os.IsNotExist(err) {
        -		return err
        -	}
        -
        -	return util.WriteFile(fs, link, []byte(target), 0777|os.ModeSymlink)
        -}
        -
        -func (fs *Memory) Readlink(link string) (string, error) {
        -	f, has := fs.s.Get(link)
        -	if !has {
        -		return "", os.ErrNotExist
        -	}
        -
        -	if !isSymlink(f.mode) {
        -		return "", &os.PathError{
        -			Op:   "readlink",
        -			Path: link,
        -			Err:  fmt.Errorf("not a symlink"),
        -		}
        -	}
        -
        -	return string(f.content.bytes), nil
        -}
        -
        -// Capabilities implements the Capable interface.
        -func (fs *Memory) Capabilities() billy.Capability {
        -	return billy.WriteCapability |
        -		billy.ReadCapability |
        -		billy.ReadAndWriteCapability |
        -		billy.SeekCapability |
        -		billy.TruncateCapability
        -}
        -
        -type file struct {
        -	name     string
        -	content  *content
        -	position int64
        -	flag     int
        -	mode     os.FileMode
        -
        -	isClosed bool
        -}
        -
        -func (f *file) Name() string {
        -	return f.name
        -}
        -
        -func (f *file) Read(b []byte) (int, error) {
        -	n, err := f.ReadAt(b, f.position)
        -	f.position += int64(n)
        -
        -	if err == io.EOF && n != 0 {
        -		err = nil
        -	}
        -
        -	return n, err
        -}
        -
        -func (f *file) ReadAt(b []byte, off int64) (int, error) {
        -	if f.isClosed {
        -		return 0, os.ErrClosed
        -	}
        -
        -	if !isReadAndWrite(f.flag) && !isReadOnly(f.flag) {
        -		return 0, errors.New("read not supported")
        -	}
        -
        -	n, err := f.content.ReadAt(b, off)
        -
        -	return n, err
        -}
        -
        -func (f *file) Seek(offset int64, whence int) (int64, error) {
        -	if f.isClosed {
        -		return 0, os.ErrClosed
        -	}
        -
        -	switch whence {
        -	case io.SeekCurrent:
        -		f.position += offset
        -	case io.SeekStart:
        -		f.position = offset
        -	case io.SeekEnd:
        -		f.position = int64(f.content.Len()) + offset
        -	}
        -
        -	return f.position, nil
        -}
        -
        -func (f *file) Write(p []byte) (int, error) {
        -	if f.isClosed {
        -		return 0, os.ErrClosed
        -	}
        -
        -	if !isReadAndWrite(f.flag) && !isWriteOnly(f.flag) {
        -		return 0, errors.New("write not supported")
        -	}
        -
        -	n, err := f.content.WriteAt(p, f.position)
        -	f.position += int64(n)
        -
        -	return n, err
        -}
        -
        -func (f *file) Close() error {
        -	if f.isClosed {
        -		return os.ErrClosed
        -	}
        -
        -	f.isClosed = true
        -	return nil
        -}
        -
        -func (f *file) Truncate(size int64) error {
        -	if size < int64(len(f.content.bytes)) {
        -		f.content.bytes = f.content.bytes[:size]
        -	} else if more := int(size) - len(f.content.bytes); more > 0 {
        -		f.content.bytes = append(f.content.bytes, make([]byte, more)...)
        -	}
        -
        -	return nil
        -}
        -
        -func (f *file) Duplicate(filename string, mode os.FileMode, flag int) billy.File {
        -	new := &file{
        -		name:    filename,
        -		content: f.content,
        -		mode:    mode,
        -		flag:    flag,
        -	}
        -
        -	if isAppend(flag) {
        -		new.position = int64(new.content.Len())
        -	}
        -
        -	if isTruncate(flag) {
        -		new.content.Truncate()
        -	}
        -
        -	return new
        -}
        -
        -func (f *file) Stat() (os.FileInfo, error) {
        -	return &fileInfo{
        -		name: f.Name(),
        -		mode: f.mode,
        -		size: f.content.Len(),
        -	}, nil
        -}
        -
        -// Lock is a no-op in memfs.
        -func (f *file) Lock() error {
        -	return nil
        -}
        -
        -// Unlock is a no-op in memfs.
        -func (f *file) Unlock() error {
        -	return nil
        -}
        -
        -type fileInfo struct {
        -	name string
        -	size int
        -	mode os.FileMode
        -}
        -
        -func (fi *fileInfo) Name() string {
        -	return fi.name
        -}
        -
        -func (fi *fileInfo) Size() int64 {
        -	return int64(fi.size)
        -}
        -
        -func (fi *fileInfo) Mode() os.FileMode {
        -	return fi.mode
        -}
        -
        -func (*fileInfo) ModTime() time.Time {
        -	return time.Now()
        -}
        -
        -func (fi *fileInfo) IsDir() bool {
        -	return fi.mode.IsDir()
        -}
        -
        -func (*fileInfo) Sys() interface{} {
        -	return nil
        -}
        -
        -func (c *content) Truncate() {
        -	c.bytes = make([]byte, 0)
        -}
        -
        -func (c *content) Len() int {
        -	return len(c.bytes)
        -}
        -
        -func isCreate(flag int) bool {
        -	return flag&os.O_CREATE != 0
        -}
        -
        -func isAppend(flag int) bool {
        -	return flag&os.O_APPEND != 0
        -}
        -
        -func isTruncate(flag int) bool {
        -	return flag&os.O_TRUNC != 0
        -}
        -
        -func isReadAndWrite(flag int) bool {
        -	return flag&os.O_RDWR != 0
        -}
        -
        -func isReadOnly(flag int) bool {
        -	return flag == os.O_RDONLY
        -}
        -
        -func isWriteOnly(flag int) bool {
        -	return flag&os.O_WRONLY != 0
        -}
        -
        -func isSymlink(m os.FileMode) bool {
        -	return m&os.ModeSymlink != 0
        -}
        diff --git a/vendor/gopkg.in/src-d/go-billy.v4/memfs/storage.go b/vendor/gopkg.in/src-d/go-billy.v4/memfs/storage.go
        deleted file mode 100644
        index 354c5123e..000000000
        --- a/vendor/gopkg.in/src-d/go-billy.v4/memfs/storage.go
        +++ /dev/null
        @@ -1,209 +0,0 @@
        -package memfs
        -
        -import (
        -	"fmt"
        -	"io"
        -	"os"
        -	"path/filepath"
        -)
        -
        -type storage struct {
        -	files    map[string]*file
        -	children map[string]map[string]*file
        -}
        -
        -func newStorage() *storage {
        -	return &storage{
        -		files:    make(map[string]*file, 0),
        -		children: make(map[string]map[string]*file, 0),
        -	}
        -}
        -
        -func (s *storage) Has(path string) bool {
        -	path = clean(path)
        -
        -	_, ok := s.files[path]
        -	return ok
        -}
        -
        -func (s *storage) New(path string, mode os.FileMode, flag int) (*file, error) {
        -	path = clean(path)
        -	if s.Has(path) {
        -		if !s.MustGet(path).mode.IsDir() {
        -			return nil, fmt.Errorf("file already exists %q", path)
        -		}
        -
        -		return nil, nil
        -	}
        -
        -	f := &file{
        -		name:    filepath.Base(path),
        -		content: &content{},
        -		mode:    mode,
        -		flag:    flag,
        -	}
        -
        -	s.files[path] = f
        -	s.createParent(path, mode, f)
        -	return f, nil
        -}
        -
        -func (s *storage) createParent(path string, mode os.FileMode, f *file) error {
        -	base := filepath.Dir(path)
        -	base = clean(base)
        -	if f.Name() == string(separator) {
        -		return nil
        -	}
        -
        -	if _, err := s.New(base, mode.Perm()|os.ModeDir, 0); err != nil {
        -		return err
        -	}
        -
        -	if _, ok := s.children[base]; !ok {
        -		s.children[base] = make(map[string]*file, 0)
        -	}
        -
        -	s.children[base][f.Name()] = f
        -	return nil
        -}
        -
        -func (s *storage) Children(path string) []*file {
        -	path = clean(path)
        -
        -	l := make([]*file, 0)
        -	for _, f := range s.children[path] {
        -		l = append(l, f)
        -	}
        -
        -	return l
        -}
        -
        -func (s *storage) MustGet(path string) *file {
        -	f, ok := s.Get(path)
        -	if !ok {
        -		panic(fmt.Errorf("couldn't find %q", path))
        -	}
        -
        -	return f
        -}
        -
        -func (s *storage) Get(path string) (*file, bool) {
        -	path = clean(path)
        -	if !s.Has(path) {
        -		return nil, false
        -	}
        -
        -	file, ok := s.files[path]
        -	return file, ok
        -}
        -
        -func (s *storage) Rename(from, to string) error {
        -	from = clean(from)
        -	to = clean(to)
        -
        -	if !s.Has(from) {
        -		return os.ErrNotExist
        -	}
        -
        -	move := [][2]string{{from, to}}
        -
        -	for pathFrom := range s.files {
        -		if pathFrom == from || !filepath.HasPrefix(pathFrom, from) {
        -			continue
        -		}
        -
        -		rel, _ := filepath.Rel(from, pathFrom)
        -		pathTo := filepath.Join(to, rel)
        -
        -		move = append(move, [2]string{pathFrom, pathTo})
        -	}
        -
        -	for _, ops := range move {
        -		from := ops[0]
        -		to := ops[1]
        -
        -		if err := s.move(from, to); err != nil {
        -			return err
        -		}
        -	}
        -
        -	return nil
        -}
        -
        -func (s *storage) move(from, to string) error {
        -	s.files[to] = s.files[from]
        -	s.files[to].name = filepath.Base(to)
        -	s.children[to] = s.children[from]
        -
        -	defer func() {
        -		delete(s.children, from)
        -		delete(s.files, from)
        -		delete(s.children[filepath.Dir(from)], filepath.Base(from))
        -	}()
        -
        -	return s.createParent(to, 0644, s.files[to])
        -}
        -
        -func (s *storage) Remove(path string) error {
        -	path = clean(path)
        -
        -	f, has := s.Get(path)
        -	if !has {
        -		return os.ErrNotExist
        -	}
        -
        -	if f.mode.IsDir() && len(s.children[path]) != 0 {
        -		return fmt.Errorf("dir: %s contains files", path)
        -	}
        -
        -	base, file := filepath.Split(path)
        -	base = filepath.Clean(base)
        -
        -	delete(s.children[base], file)
        -	delete(s.files, path)
        -	return nil
        -}
        -
        -func clean(path string) string {
        -	return filepath.Clean(filepath.FromSlash(path))
        -}
        -
        -type content struct {
        -	bytes []byte
        -}
        -
        -func (c *content) WriteAt(p []byte, off int64) (int, error) {
        -	prev := len(c.bytes)
        -
        -	diff := int(off) - prev
        -	if diff > 0 {
        -		c.bytes = append(c.bytes, make([]byte, diff)...)
        -	}
        -
        -	c.bytes = append(c.bytes[:off], p...)
        -	if len(c.bytes) < prev {
        -		c.bytes = c.bytes[:prev]
        -	}
        -
        -	return len(p), nil
        -}
        -
        -func (c *content) ReadAt(b []byte, off int64) (n int, err error) {
        -	size := int64(len(c.bytes))
        -	if off >= size {
        -		return 0, io.EOF
        -	}
        -
        -	l := int64(len(b))
        -	if off+l > size {
        -		l = size - off
        -	}
        -
        -	btr := c.bytes[off : off+l]
        -	if len(btr) < len(b) {
        -		err = io.EOF
        -	}
        -	n = copy(b, btr)
        -
        -	return
        -}
        diff --git a/vendor/gopkg.in/src-d/go-billy.v4/osfs/os_posix.go b/vendor/gopkg.in/src-d/go-billy.v4/osfs/os_posix.go
        index 0eda3bd30..144cde1c1 100644
        --- a/vendor/gopkg.in/src-d/go-billy.v4/osfs/os_posix.go
        +++ b/vendor/gopkg.in/src-d/go-billy.v4/osfs/os_posix.go
        @@ -3,19 +3,19 @@
         package osfs
         
         import (
        -	"syscall"
        +	"golang.org/x/sys/unix"
         )
         
         func (f *file) Lock() error {
         	f.m.Lock()
         	defer f.m.Unlock()
         
        -	return syscall.Flock(int(f.File.Fd()), syscall.LOCK_EX)
        +	return unix.Flock(int(f.File.Fd()), unix.LOCK_EX)
         }
         
         func (f *file) Unlock() error {
         	f.m.Lock()
         	defer f.m.Unlock()
         
        -	return syscall.Flock(int(f.File.Fd()), syscall.LOCK_UN)
        +	return unix.Flock(int(f.File.Fd()), unix.LOCK_UN)
         }
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/.travis.yml b/vendor/gopkg.in/src-d/go-git.v4/.travis.yml
        index 6484425e3..3a65f3e08 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/.travis.yml
        +++ b/vendor/gopkg.in/src-d/go-git.v4/.travis.yml
        @@ -1,8 +1,8 @@
         language: go
         
         go:
        -  - 1.9.x
        -  - "1.10"
        +  - "1.11"
        +  - "1.12"
         
         go_import_path: gopkg.in/src-d/go-git.v4
         
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/COMPATIBILITY.md b/vendor/gopkg.in/src-d/go-git.v4/COMPATIBILITY.md
        index e07e79915..4a3da62fc 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/COMPATIBILITY.md
        +++ b/vendor/gopkg.in/src-d/go-git.v4/COMPATIBILITY.md
        @@ -86,7 +86,7 @@ is supported by go-git.
         | for-each-ref                          | ✔ |
         | hash-object                           | ✔ |
         | ls-files                              | ✔ |
        -| merge-base                            | |
        +| merge-base                            | ✔ | Calculates the merge-base only between two commits, and supports `--independent` and `--is-ancestor` modifiers; Does not support `--fork-point` nor `--octopus` modifiers. |
         | read-tree                             | |
         | rev-list                              | ✔ |
         | rev-parse                             | |
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/CONTRIBUTING.md b/vendor/gopkg.in/src-d/go-git.v4/CONTRIBUTING.md
        index 92b7b8cb5..bdb5f7334 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/CONTRIBUTING.md
        +++ b/vendor/gopkg.in/src-d/go-git.v4/CONTRIBUTING.md
        @@ -21,7 +21,8 @@ This can be done easily using the [`-s`](https://github.com/git/git/blob/b2c150d
         
         The official support channels, for both users and contributors, are:
         
        -- GitHub [issues](https://github.com/src-d/go-git/issues)*
        +- [StackOverflow go-git tag](https://stackoverflow.com/questions/tagged/go-git) for user questions.
        +- GitHub [Issues](https://github.com/src-d/go-git/issues)* for bug reports and feature requests.
         - Slack: #go-git room in the [source{d} Slack](https://join.slack.com/t/sourced-community/shared_invite/enQtMjc4Njk5MzEyNzM2LTFjNzY4NjEwZGEwMzRiNTM4MzRlMzQ4MmIzZjkwZmZlM2NjODUxZmJjNDI1OTcxNDAyMmZlNmFjODZlNTg0YWM)
         
         *Before opening a new issue or submitting a new pull request, it's helpful to
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/LICENSE b/vendor/gopkg.in/src-d/go-git.v4/LICENSE
        index 6d972e26b..8aa3d854c 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/LICENSE
        +++ b/vendor/gopkg.in/src-d/go-git.v4/LICENSE
        @@ -186,7 +186,7 @@
               same "printed page" as the copyright notice for easier
               identification within third-party archives.
         
        -   Copyright 2017 Sourced Technologies, S.L.
        +   Copyright 2018 Sourced Technologies, S.L.
         
            Licensed under the Apache License, Version 2.0 (the "License");
            you may not use this file except in compliance with the License.
        @@ -198,4 +198,4 @@
            distributed under the License is distributed on an "AS IS" BASIS,
            WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
            See the License for the specific language governing permissions and
        -   limitations under the License.
        \ No newline at end of file
        +   limitations under the License.
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/README.md b/vendor/gopkg.in/src-d/go-git.v4/README.md
        index 8cdfef84e..ed9306c83 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/README.md
        +++ b/vendor/gopkg.in/src-d/go-git.v4/README.md
        @@ -3,16 +3,16 @@
         
         *go-git* is a highly extensible git implementation library written in **pure Go**.
         
        -It can be used to manipulate git repositories at low level *(plumbing)* or high level *(porcelain)*, through an idiomatic Go API. It also supports several type of storage, such as in-memory filesystems, or custom implementations thanks to the [`Storer`](https://godoc.org/gopkg.in/src-d/go-git.v4/plumbing/storer) interface.
        +It can be used to manipulate git repositories at low level *(plumbing)* or high level *(porcelain)*, through an idiomatic Go API. It also supports several types of storage, such as in-memory filesystems, or custom implementations thanks to the [`Storer`](https://godoc.org/gopkg.in/src-d/go-git.v4/plumbing/storer) interface.
         
        -It's being actively develop since 2015 and is being use extensively by [source{d}](https://sourced.tech/) and [Keybase](https://keybase.io/blog/encrypted-git-for-everyone), and by many other libraries and tools.
        +It's being actively developed since 2015 and is being used extensively by [source{d}](https://sourced.tech/) and [Keybase](https://keybase.io/blog/encrypted-git-for-everyone), and by many other libraries and tools.
         
         Comparison with git
         -------------------
         
         *go-git* aims to be fully compatible with [git](https://github.com/git/git), all the *porcelain* operations are implemented to work exactly as *git* does.
         
        -*git* is a humongous project with years of development by thousands of contributors, making it challenging for *go-git* implement all the features. You can find a comparison of *go-git* vs *git* in the [compatibility documentation](COMPATIBILITY.md).
        +*git* is a humongous project with years of development by thousands of contributors, making it challenging for *go-git* to implement all the features. You can find a comparison of *go-git* vs *git* in the [compatibility documentation](COMPATIBILITY.md).
         
         
         Installation
        @@ -24,12 +24,12 @@ The recommended way to install *go-git* is:
         go get -u gopkg.in/src-d/go-git.v4/...
         ```
         
        -> We use [gopkg.in](http://labix.org/gopkg.in) for having a versioned API, this means that when `go get` clones the package, is the latest tag matching `v4.*` cloned and not the master branch.
        +> We use [gopkg.in](http://labix.org/gopkg.in) to version the API, this means that when `go get` clones the package, it's the latest tag matching `v4.*` that is cloned and not the master branch.
         
         Examples
         --------
         
        -> Please note that the functions `CheckIfError` and `Info` used in the examples are from the [examples package](https://github.com/src-d/go-git/blob/master/_examples/common.go#L17) just to be used in the examples.
        +> Please note that the `CheckIfError` and `Info` functions  used in the examples are from the [examples package](https://github.com/src-d/go-git/blob/master/_examples/common.go#L17) just to be used in the examples.
         
         
         ### Basic example
        @@ -71,7 +71,7 @@ r, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{
         
         CheckIfError(err)
         
        -// Gets the HEAD history from HEAD, just like does:
        +// Gets the HEAD history from HEAD, just like this command:
         Info("git log")
         
         // ... retrieves the branch pointed by HEAD
        @@ -110,7 +110,7 @@ Date:   Fri Nov 11 13:23:22 2016 +0100
         ...
         ```
         
        -You can find this [example](_examples/log/main.go) and many others at the [examples](_examples) folder
        +You can find this [example](_examples/log/main.go) and many others in the [examples](_examples) folder.
         
         Contribute
         ----------
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/blame.go b/vendor/gopkg.in/src-d/go-git.v4/blame.go
        index 349cdd9b6..f6108519a 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/blame.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/blame.go
        @@ -123,14 +123,25 @@ func newLine(author, text string, date time.Time, hash plumbing.Hash) *Line {
         }
         
         func newLines(contents []string, commits []*object.Commit) ([]*Line, error) {
        -	if len(contents) != len(commits) {
        -		return nil, errors.New("contents and commits have different length")
        +	lcontents := len(contents)
        +	lcommits := len(commits)
        +
        +	if lcontents != lcommits {
        +		if lcontents == lcommits-1 && contents[lcontents-1] != "\n" {
        +			contents = append(contents, "\n")
        +		} else {
        +			return nil, errors.New("contents and commits have different length")
        +		}
         	}
        -	result := make([]*Line, 0, len(contents))
        +
        +	result := make([]*Line, 0, lcontents)
         	for i := range contents {
        -		l := newLine(commits[i].Author.Email, contents[i], commits[i].Author.When, commits[i].Hash)
        -		result = append(result, l)
        +		result = append(result, newLine(
        +			commits[i].Author.Email, contents[i],
        +			commits[i].Author.When, commits[i].Hash,
        +		))
         	}
        +
         	return result, nil
         }
         
        @@ -182,7 +193,7 @@ func (b *blame) fillGraphAndData() error {
         		// this first commit.
         		if i == 0 {
         			for j := 0; j < nLines; j++ {
        -				b.graph[i][j] = (*object.Commit)(b.revs[i])
        +				b.graph[i][j] = b.revs[i]
         			}
         		} else {
         			// if this is not the first commit, then assign to the old
        @@ -200,7 +211,7 @@ func (b *blame) sliceGraph(i int) []*object.Commit {
         	fVs := b.graph[i]
         	result := make([]*object.Commit, 0, len(fVs))
         	for _, v := range fVs {
        -		c := object.Commit(*v)
        +		c := *v
         		result = append(result, &c)
         	}
         	return result
        @@ -223,7 +234,7 @@ func (b *blame) assignOrigin(c, p int) {
         				b.graph[c][dl] = b.graph[p][sl]
         			case hunks[h].Type == 1:
         				dl++
        -				b.graph[c][dl] = (*object.Commit)(b.revs[c])
        +				b.graph[c][dl] = b.revs[c]
         			case hunks[h].Type == -1:
         				sl++
         			default:
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/config/branch.go b/vendor/gopkg.in/src-d/go-git.v4/config/branch.go
        index e18073c96..20dde6e03 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/config/branch.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/config/branch.go
        @@ -8,8 +8,9 @@ import (
         )
         
         var (
        -	errBranchEmptyName    = errors.New("branch config: empty name")
        -	errBranchInvalidMerge = errors.New("branch config: invalid merge")
        +	errBranchEmptyName     = errors.New("branch config: empty name")
        +	errBranchInvalidMerge  = errors.New("branch config: invalid merge")
        +	errBranchInvalidRebase = errors.New("branch config: rebase must be one of 'true' or 'interactive'")
         )
         
         // Branch contains information on the
        @@ -21,6 +22,10 @@ type Branch struct {
         	Remote string
         	// Merge is the local refspec for the branch
         	Merge plumbing.ReferenceName
        +	// Rebase instead of merge when pulling. Valid values are
        +	// "true" and "interactive".  "false" is undocumented and
        +	// typically represented by the non-existence of this field
        +	Rebase string
         
         	raw *format.Subsection
         }
        @@ -35,6 +40,13 @@ func (b *Branch) Validate() error {
         		return errBranchInvalidMerge
         	}
         
        +	if b.Rebase != "" &&
        +		b.Rebase != "true" &&
        +		b.Rebase != "interactive" &&
        +		b.Rebase != "false" {
        +		return errBranchInvalidRebase
        +	}
        +
         	return nil
         }
         
        @@ -57,6 +69,12 @@ func (b *Branch) marshal() *format.Subsection {
         		b.raw.SetOption(mergeKey, string(b.Merge))
         	}
         
        +	if b.Rebase == "" {
        +		b.raw.RemoveOption(rebaseKey)
        +	} else {
        +		b.raw.SetOption(rebaseKey, b.Rebase)
        +	}
        +
         	return b.raw
         }
         
        @@ -66,6 +84,7 @@ func (b *Branch) unmarshal(s *format.Subsection) error {
         	b.Name = b.raw.Name
         	b.Remote = b.raw.Options.Get(remoteSection)
         	b.Merge = plumbing.ReferenceName(b.raw.Options.Get(mergeKey))
        +	b.Rebase = b.raw.Options.Get(rebaseKey)
         
         	return b.Validate()
         }
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/config/config.go b/vendor/gopkg.in/src-d/go-git.v4/config/config.go
        index a637f6d70..ea614e96d 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/config/config.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/config/config.go
        @@ -8,6 +8,7 @@ import (
         	"sort"
         	"strconv"
         
        +	"gopkg.in/src-d/go-git.v4/internal/url"
         	format "gopkg.in/src-d/go-git.v4/plumbing/format/config"
         )
         
        @@ -119,6 +120,7 @@ const (
         	commentCharKey   = "commentChar"
         	windowKey        = "window"
         	mergeKey         = "merge"
        +	rebaseKey        = "rebase"
         
         	// DefaultPackWindow holds the number of previous objects used to
         	// generate deltas. The value 10 is the same used by git command.
        @@ -399,3 +401,7 @@ func (c *RemoteConfig) marshal() *format.Subsection {
         
         	return c.raw
         }
        +
        +func (c *RemoteConfig) IsFirstURLLocal() bool {
        +	return url.IsLocalEndpoint(c.URLs[0])
        +}
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/config/refspec.go b/vendor/gopkg.in/src-d/go-git.v4/config/refspec.go
        index c9b9d524f..14bb40069 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/config/refspec.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/config/refspec.go
        @@ -15,10 +15,10 @@ const (
         
         var (
         	ErrRefSpecMalformedSeparator = errors.New("malformed refspec, separators are wrong")
        -	ErrRefSpecMalformedWildcard  = errors.New("malformed refspec, missmatched number of wildcards")
        +	ErrRefSpecMalformedWildcard  = errors.New("malformed refspec, mismatched number of wildcards")
         )
         
        -// RefSpec is a mapping from local branches to remote references
        +// RefSpec is a mapping from local branches to remote references.
         // The format of the refspec is an optional +, followed by :, where
         //  is the pattern for references on the remote side and  is where
         // those references will be written locally. The + tells Git to update the
        @@ -99,11 +99,11 @@ func (s RefSpec) matchGlob(n plumbing.ReferenceName) bool {
         
         	var prefix, suffix string
         	prefix = src[0:wildcard]
        -	if len(src) < wildcard {
        -		suffix = src[wildcard+1 : len(suffix)]
        +	if len(src) > wildcard+1 {
        +		suffix = src[wildcard+1:]
         	}
         
        -	return len(name) > len(prefix)+len(suffix) &&
        +	return len(name) >= len(prefix)+len(suffix) &&
         		strings.HasPrefix(name, prefix) &&
         		strings.HasSuffix(name, suffix)
         }
        @@ -127,6 +127,13 @@ func (s RefSpec) Dst(n plumbing.ReferenceName) plumbing.ReferenceName {
         	return plumbing.ReferenceName(dst[0:wd] + match + dst[wd+1:])
         }
         
        +func (s RefSpec) Reverse() RefSpec {
        +	spec := string(s)
        +	separator := strings.Index(spec, refSpecSeparator)
        +
        +	return RefSpec(spec[separator+1:] + refSpecSeparator + spec[:separator])
        +}
        +
         func (s RefSpec) String() string {
         	return string(s)
         }
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/go.mod b/vendor/gopkg.in/src-d/go-git.v4/go.mod
        new file mode 100644
        index 000000000..6f8b3d2e6
        --- /dev/null
        +++ b/vendor/gopkg.in/src-d/go-git.v4/go.mod
        @@ -0,0 +1,29 @@
        +module gopkg.in/src-d/go-git.v4
        +
        +require (
        +	github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 // indirect
        +	github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 // indirect
        +	github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5
        +	github.com/emirpasic/gods v1.12.0
        +	github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 // indirect
        +	github.com/gliderlabs/ssh v0.2.2
        +	github.com/google/go-cmp v0.3.0
        +	github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99
        +	github.com/jessevdk/go-flags v1.4.0
        +	github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd
        +	github.com/mitchellh/go-homedir v1.1.0
        +	github.com/pelletier/go-buffruneio v0.2.0 // indirect
        +	github.com/pkg/errors v0.8.1 // indirect
        +	github.com/sergi/go-diff v1.0.0
        +	github.com/src-d/gcfg v1.4.0
        +	github.com/stretchr/objx v0.2.0 // indirect
        +	github.com/xanzy/ssh-agent v0.2.1
        +	golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4
        +	golang.org/x/net v0.0.0-20190724013045-ca1201d0de80
        +	golang.org/x/text v0.3.2
        +	golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a // indirect
        +	gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127
        +	gopkg.in/src-d/go-billy.v4 v4.3.2
        +	gopkg.in/src-d/go-git-fixtures.v3 v3.5.0
        +	gopkg.in/warnings.v0 v0.1.2 // indirect
        +)
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/go.sum b/vendor/gopkg.in/src-d/go-git.v4/go.sum
        new file mode 100644
        index 000000000..65551c165
        --- /dev/null
        +++ b/vendor/gopkg.in/src-d/go-git.v4/go.sum
        @@ -0,0 +1,92 @@
        +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs=
        +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
        +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA=
        +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
        +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
        +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
        +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
        +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
        +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
        +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
        +github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg=
        +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
        +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ=
        +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
        +github.com/gliderlabs/ssh v0.1.3 h1:cBU46h1lYQk5f2Z+jZbewFKy+1zzE2aUX/ilcPDAm9M=
        +github.com/gliderlabs/ssh v0.1.3/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
        +github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0=
        +github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
        +github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
        +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
        +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
        +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
        +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
        +github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA=
        +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
        +github.com/kevinburke/ssh_config v0.0.0-20180830205328-81db2a75821e h1:RgQk53JHp/Cjunrr1WlsXSZpqXn+uREuHvUVcK82CV8=
        +github.com/kevinburke/ssh_config v0.0.0-20180830205328-81db2a75821e/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
        +github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY=
        +github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
        +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
        +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
        +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
        +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
        +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
        +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
        +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
        +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
        +github.com/pelletier/go-buffruneio v0.2.0 h1:U4t4R6YkofJ5xHm3dJzuRpPZ0mr5MMCoAWooScCR7aA=
        +github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo=
        +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
        +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
        +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
        +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
        +github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
        +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
        +github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4=
        +github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI=
        +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
        +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
        +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
        +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
        +github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70=
        +github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4=
        +golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
        +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
        +golang.org/x/crypto v0.0.0-20190422183909-d864b10871cd h1:sMHc2rZHuzQmrbVoSpt9HgerkXPyIeCSO6k0zUMGfFk=
        +golang.org/x/crypto v0.0.0-20190422183909-d864b10871cd/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
        +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc=
        +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
        +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
        +golang.org/x/net v0.0.0-20190420063019-afa5a82059c6 h1:HdqqaWmYAUI7/dmByKKEw+yxDksGSo+9GjkUc9Zp34E=
        +golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
        +golang.org/x/net v0.0.0-20190502183928-7f726cade0ab h1:9RfW3ktsOZxgo9YNbBAjq1FWzc/igwEcUzZz8IXgSbk=
        +golang.org/x/net v0.0.0-20190502183928-7f726cade0ab/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
        +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
        +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 h1:Ao/3l156eZf2AW5wK8a7/smtodRU+gha3+BeqJ69lRk=
        +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
        +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
        +golang.org/x/sys v0.0.0-20180903190138-2b024373dcd9 h1:lkiLiLBHGoH3XnqSLUIaBsilGMUjI+Uy2Xu2JLUtTas=
        +golang.org/x/sys v0.0.0-20180903190138-2b024373dcd9/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
        +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
        +golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
        +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
        +golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc=
        +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
        +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e h1:D5TXcfTk7xF7hvieo4QErS3qqCB4teTffacDWr7CI+0=
        +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
        +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
        +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
        +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
        +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
        +golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI=
        +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
        +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
        +gopkg.in/src-d/go-billy.v4 v4.3.0 h1:KtlZ4c1OWbIs4jCv5ZXrTqG8EQocr0g/d4DjNg70aek=
        +gopkg.in/src-d/go-billy.v4 v4.3.0/go.mod h1:tm33zBoOwxjYHZIE+OV8bxTWFMJLrconzFMd38aARFk=
        +gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg=
        +gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98=
        +gopkg.in/src-d/go-git-fixtures.v3 v3.5.0 h1:ivZFOIltbce2Mo8IjzUHAFoq/IylO9WHhNOAJK+LsJg=
        +gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g=
        +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
        +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/internal/url/url.go b/vendor/gopkg.in/src-d/go-git.v4/internal/url/url.go
        new file mode 100644
        index 000000000..0f0d709d9
        --- /dev/null
        +++ b/vendor/gopkg.in/src-d/go-git.v4/internal/url/url.go
        @@ -0,0 +1,37 @@
        +package url
        +
        +import (
        +	"regexp"
        +)
        +
        +var (
        +	isSchemeRegExp   = regexp.MustCompile(`^[^:]+://`)
        +	scpLikeUrlRegExp = regexp.MustCompile(`^(?:(?P[^@]+)@)?(?P[^:\s]+):(?:(?P[0-9]{1,5})/)?(?P[^\\].*)$`)
        +)
        +
        +// MatchesScheme returns true if the given string matches a URL-like
        +// format scheme.
        +func MatchesScheme(url string) bool {
        +	return isSchemeRegExp.MatchString(url)
        +}
        +
        +// MatchesScpLike returns true if the given string matches an SCP-like
        +// format scheme.
        +func MatchesScpLike(url string) bool {
        +	return scpLikeUrlRegExp.MatchString(url)
        +}
        +
        +// FindScpLikeComponents returns the user, host, port and path of the
        +// given SCP-like URL.
        +func FindScpLikeComponents(url string) (user, host, port, path string) {
        +	m := scpLikeUrlRegExp.FindStringSubmatch(url)
        +	return m[1], m[2], m[3], m[4]
        +}
        +
        +// IsLocalEndpoint returns true if the given URL string specifies a
        +// local file endpoint.  For example, on a Linux machine,
        +// `/home/user/src/go-git` would match as a local endpoint, but
        +// `https://github.com/src-d/go-git` would not.
        +func IsLocalEndpoint(url string) bool {
        +	return !MatchesScheme(url) && !MatchesScpLike(url)
        +}
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/object_walker.go b/vendor/gopkg.in/src-d/go-git.v4/object_walker.go
        index 4cbbcca65..f8b19cdb0 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/object_walker.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/object_walker.go
        @@ -94,6 +94,8 @@ func (p *objectWalker) walkObjectTree(hash plumbing.Hash) error {
         				return err
         			}
         		}
        +	case *object.Tag:
        +		return p.walkObjectTree(obj.Target)
         	default:
         		// Error out on unhandled object types.
         		return fmt.Errorf("Unknown object %X %s %T\n", obj.ID(), obj.Type(), obj)
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/options.go b/vendor/gopkg.in/src-d/go-git.v4/options.go
        index 7b1570f7b..0f728e7c2 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/options.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/options.go
        @@ -3,6 +3,7 @@ package git
         import (
         	"errors"
         	"regexp"
        +	"strings"
         
         	"golang.org/x/crypto/openpgp"
         	"gopkg.in/src-d/go-git.v4/config"
        @@ -185,6 +186,9 @@ type PushOptions struct {
         	// Progress is where the human readable information sent by the server is
         	// stored, if nil nothing is stored.
         	Progress sideband.Progress
        +	// Prune specify that remote refs that match given RefSpecs and that do
        +	// not exist locally will be removed.
        +	Prune bool
         }
         
         // Validate validates the fields and sets the default values.
        @@ -228,10 +232,11 @@ var (
         	ErrCreateRequiresBranch = errors.New("Branch is mandatory when Create is used")
         )
         
        -// CheckoutOptions describes how a checkout 31operation should be performed.
        +// CheckoutOptions describes how a checkout operation should be performed.
         type CheckoutOptions struct {
        -	// Hash to be checked out, if used HEAD will in detached mode. Branch and
        -	// Hash are mutually exclusive, if Create is not used.
        +	// Hash is the hash of the commit to be checked out. If used, HEAD will be
        +	// in detached mode. If Create is not used, Branch and Hash are mutually
        +	// exclusive.
         	Hash plumbing.Hash
         	// Branch to be checked out, if Branch and Hash are empty is set to `master`.
         	Branch plumbing.ReferenceName
        @@ -240,6 +245,11 @@ type CheckoutOptions struct {
         	// Force, if true when switching branches, proceed even if the index or the
         	// working tree differs from HEAD. This is used to throw away local changes
         	Force bool
        +	// Keep, if true when switching branches, local changes (the index or the
        +	// working tree changes) will be kept so that they can be committed to the
        +	// target branch. Force and Keep are mutually exclusive, should not be both
        +	// set to true.
        +	Keep bool
         }
         
         // Validate validates the fields and sets the default values.
        @@ -286,7 +296,7 @@ const (
         
         // ResetOptions describes how a reset operation should be performed.
         type ResetOptions struct {
        -	// Commit, if commit is pressent set the current branch head (HEAD) to it.
        +	// Commit, if commit is present set the current branch head (HEAD) to it.
         	Commit plumbing.Hash
         	// Mode, form resets the current branch head to Commit and possibly updates
         	// the index (resetting it to the tree of Commit) and the working tree
        @@ -329,6 +339,15 @@ type LogOptions struct {
         	// set Order=LogOrderCommitterTime for ordering by committer time (more compatible with `git log`)
         	// set Order=LogOrderBSF for Breadth-first search
         	Order LogOrder
        +
        +	// Show only those commits in which the specified file was inserted/updated.
        +	// It is equivalent to running `git log -- `.
        +	FileName *string
        +
        +	// Pretend as if all the refs in refs/, along with HEAD, are listed on the command line as .
        +	// It is equivalent to running `git log --all`.
        +	// If set on true, the From option will be ignored.
        +	All bool
         }
         
         var (
        @@ -348,8 +367,9 @@ type CommitOptions struct {
         	// Parents are the parents commits for the new commit, by default when
         	// len(Parents) is zero, the hash of HEAD reference is used.
         	Parents []plumbing.Hash
        -	// A key to sign the commit with. A nil value here means the commit will not
        -	// be signed. The private key must be present and already decrypted.
        +	// SignKey denotes a key to sign the commit with. A nil value here means the
        +	// commit will not be signed. The private key must be present and already
        +	// decrypted.
         	SignKey *openpgp.Entity
         }
         
        @@ -377,6 +397,41 @@ func (o *CommitOptions) Validate(r *Repository) error {
         	return nil
         }
         
        +var (
        +	ErrMissingName    = errors.New("name field is required")
        +	ErrMissingTagger  = errors.New("tagger field is required")
        +	ErrMissingMessage = errors.New("message field is required")
        +)
        +
        +// CreateTagOptions describes how a tag object should be created.
        +type CreateTagOptions struct {
        +	// Tagger defines the signature of the tag creator.
        +	Tagger *object.Signature
        +	// Message defines the annotation of the tag. It is canonicalized during
        +	// validation into the format expected by git - no leading whitespace and
        +	// ending in a newline.
        +	Message string
        +	// SignKey denotes a key to sign the tag with. A nil value here means the tag
        +	// will not be signed. The private key must be present and already decrypted.
        +	SignKey *openpgp.Entity
        +}
        +
        +// Validate validates the fields and sets the default values.
        +func (o *CreateTagOptions) Validate(r *Repository, hash plumbing.Hash) error {
        +	if o.Tagger == nil {
        +		return ErrMissingTagger
        +	}
        +
        +	if o.Message == "" {
        +		return ErrMissingMessage
        +	}
        +
        +	// Canonicalize the message into the expected message format.
        +	o.Message = strings.TrimSpace(o.Message) + "\n"
        +
        +	return nil
        +}
        +
         // ListOptions describes how a remote list should be performed.
         type ListOptions struct {
         	// Auth credentials, if required, to use with the remote repository.
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/cache/buffer_lru.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/cache/buffer_lru.go
        index f2c0f907f..acaf19520 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/cache/buffer_lru.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/cache/buffer_lru.go
        @@ -45,19 +45,23 @@ func (c *BufferLRU) Put(key int64, slice []byte) {
         		c.ll = list.New()
         	}
         
        +	bufSize := FileSize(len(slice))
         	if ee, ok := c.cache[key]; ok {
        +		oldBuf := ee.Value.(buffer)
        +		// in this case bufSize is a delta: new size - old size
        +		bufSize -= FileSize(len(oldBuf.Slice))
         		c.ll.MoveToFront(ee)
         		ee.Value = buffer{key, slice}
        -		return
        +	} else {
        +		if bufSize > c.MaxSize {
        +			return
        +		}
        +		ee := c.ll.PushFront(buffer{key, slice})
        +		c.cache[key] = ee
         	}
         
        -	objSize := FileSize(len(slice))
        -
        -	if objSize > c.MaxSize {
        -		return
        -	}
        -
        -	for c.actualSize+objSize > c.MaxSize {
        +	c.actualSize += bufSize
        +	for c.actualSize > c.MaxSize {
         		last := c.ll.Back()
         		lastObj := last.Value.(buffer)
         		lastSize := FileSize(len(lastObj.Slice))
        @@ -66,10 +70,6 @@ func (c *BufferLRU) Put(key int64, slice []byte) {
         		delete(c.cache, lastObj.Key)
         		c.actualSize -= lastSize
         	}
        -
        -	ee := c.ll.PushFront(buffer{key, slice})
        -	c.cache[key] = ee
        -	c.actualSize += objSize
         }
         
         // Get returns a buffer by its key. It marks the buffer as used. If the buffer
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/cache/object_lru.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/cache/object_lru.go
        index 049453950..cd3712b7d 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/cache/object_lru.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/cache/object_lru.go
        @@ -42,21 +42,30 @@ func (c *ObjectLRU) Put(obj plumbing.EncodedObject) {
         		c.ll = list.New()
         	}
         
        +	objSize := FileSize(obj.Size())
         	key := obj.Hash()
         	if ee, ok := c.cache[key]; ok {
        +		oldObj := ee.Value.(plumbing.EncodedObject)
        +		// in this case objSize is a delta: new size - old size
        +		objSize -= FileSize(oldObj.Size())
         		c.ll.MoveToFront(ee)
         		ee.Value = obj
        -		return
        -	}
        -
        -	objSize := FileSize(obj.Size())
        -
        -	if objSize > c.MaxSize {
        -		return
        +	} else {
        +		if objSize > c.MaxSize {
        +			return
        +		}
        +		ee := c.ll.PushFront(obj)
        +		c.cache[key] = ee
         	}
         
        -	for c.actualSize+objSize > c.MaxSize {
        +	c.actualSize += objSize
        +	for c.actualSize > c.MaxSize {
         		last := c.ll.Back()
        +		if last == nil {
        +			c.actualSize = 0
        +			break
        +		}
        +
         		lastObj := last.Value.(plumbing.EncodedObject)
         		lastSize := FileSize(lastObj.Size())
         
        @@ -64,10 +73,6 @@ func (c *ObjectLRU) Put(obj plumbing.EncodedObject) {
         		delete(c.cache, lastObj.Hash())
         		c.actualSize -= lastSize
         	}
        -
        -	ee := c.ll.PushFront(obj)
        -	c.cache[key] = ee
        -	c.actualSize += objSize
         }
         
         // Get returns an object by its hash. It marks the object as used. If the object
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/diff/unified_encoder.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/diff/unified_encoder.go
        index 58edd9516..169242dc5 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/diff/unified_encoder.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/diff/unified_encoder.go
        @@ -94,7 +94,7 @@ func (e *UnifiedEncoder) printMessage(message string) {
         	isEmpty := message == ""
         	hasSuffix := strings.HasSuffix(message, "\n")
         	if !isEmpty && !hasSuffix {
        -		message = message + "\n"
        +		message += "\n"
         	}
         
         	e.buf.WriteString(message)
        @@ -237,9 +237,13 @@ func (c *hunksGenerator) addLineNumbers(la, lb int, linesBefore int, i int, op O
         	// we need to search for a reference for the next diff
         	switch {
         	case linesBefore != 0 && c.ctxLines != 0:
        -		clb = lb - c.ctxLines + 1
        +		if lb > c.ctxLines {
        +			clb = lb - c.ctxLines + 1
        +		} else {
        +			clb = 1
        +		}
         	case c.ctxLines == 0:
        -		clb = lb - c.ctxLines
        +		clb = lb
         	case i != len(c.chunks)-1:
         		next := c.chunks[i+1]
         		if next.Type() == op || next.Type() == Equal {
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/idxfile/decoder.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/idxfile/decoder.go
        index 5b927826a..9e9c1769a 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/idxfile/decoder.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/idxfile/decoder.go
        @@ -110,10 +110,6 @@ func readObjectNames(idx *MemoryIndex, r io.Reader) error {
         			continue
         		}
         
        -		if buckets < 0 {
        -			return ErrMalformedIdxFile
        -		}
        -
         		idx.FanoutMapping[k] = len(idx.Names)
         
         		nameLen := int(buckets * objectIDLength)
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/idxfile/idxfile.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/idxfile/idxfile.go
        index 5fed278b1..14b58603f 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/idxfile/idxfile.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/idxfile/idxfile.go
        @@ -5,8 +5,9 @@ import (
         	"io"
         	"sort"
         
        +	encbin "encoding/binary"
        +
         	"gopkg.in/src-d/go-git.v4/plumbing"
        -	"gopkg.in/src-d/go-git.v4/utils/binary"
         )
         
         const (
        @@ -55,7 +56,8 @@ type MemoryIndex struct {
         	PackfileChecksum [20]byte
         	IdxChecksum      [20]byte
         
        -	offsetHash map[int64]plumbing.Hash
        +	offsetHash       map[int64]plumbing.Hash
        +	offsetHashIsFull bool
         }
         
         var _ Index = (*MemoryIndex)(nil)
        @@ -121,31 +123,32 @@ func (idx *MemoryIndex) FindOffset(h plumbing.Hash) (int64, error) {
         		return 0, plumbing.ErrObjectNotFound
         	}
         
        -	return idx.getOffset(k, i)
        +	offset := idx.getOffset(k, i)
        +
        +	if !idx.offsetHashIsFull {
        +		// Save the offset for reverse lookup
        +		if idx.offsetHash == nil {
        +			idx.offsetHash = make(map[int64]plumbing.Hash)
        +		}
        +		idx.offsetHash[int64(offset)] = h
        +	}
        +
        +	return int64(offset), nil
         }
         
         const isO64Mask = uint64(1) << 31
         
        -func (idx *MemoryIndex) getOffset(firstLevel, secondLevel int) (int64, error) {
        +func (idx *MemoryIndex) getOffset(firstLevel, secondLevel int) uint64 {
         	offset := secondLevel << 2
        -	buf := bytes.NewBuffer(idx.Offset32[firstLevel][offset : offset+4])
        -	ofs, err := binary.ReadUint32(buf)
        -	if err != nil {
        -		return -1, err
        -	}
        +	ofs := encbin.BigEndian.Uint32(idx.Offset32[firstLevel][offset : offset+4])
         
         	if (uint64(ofs) & isO64Mask) != 0 {
         		offset := 8 * (uint64(ofs) & ^isO64Mask)
        -		buf := bytes.NewBuffer(idx.Offset64[offset : offset+8])
        -		n, err := binary.ReadUint64(buf)
        -		if err != nil {
        -			return -1, err
        -		}
        -
        -		return int64(n), nil
        +		n := encbin.BigEndian.Uint64(idx.Offset64[offset : offset+8])
        +		return n
         	}
         
        -	return int64(ofs), nil
        +	return uint64(ofs)
         }
         
         // FindCRC32 implements the Index interface.
        @@ -156,25 +159,34 @@ func (idx *MemoryIndex) FindCRC32(h plumbing.Hash) (uint32, error) {
         		return 0, plumbing.ErrObjectNotFound
         	}
         
        -	return idx.getCRC32(k, i)
        +	return idx.getCRC32(k, i), nil
         }
         
        -func (idx *MemoryIndex) getCRC32(firstLevel, secondLevel int) (uint32, error) {
        +func (idx *MemoryIndex) getCRC32(firstLevel, secondLevel int) uint32 {
         	offset := secondLevel << 2
        -	buf := bytes.NewBuffer(idx.CRC32[firstLevel][offset : offset+4])
        -	return binary.ReadUint32(buf)
        +	return encbin.BigEndian.Uint32(idx.CRC32[firstLevel][offset : offset+4])
         }
         
         // FindHash implements the Index interface.
         func (idx *MemoryIndex) FindHash(o int64) (plumbing.Hash, error) {
        +	var hash plumbing.Hash
        +	var ok bool
        +
        +	if idx.offsetHash != nil {
        +		if hash, ok = idx.offsetHash[o]; ok {
        +			return hash, nil
        +		}
        +	}
        +
         	// Lazily generate the reverse offset/hash map if required.
        -	if idx.offsetHash == nil {
        +	if !idx.offsetHashIsFull || idx.offsetHash == nil {
         		if err := idx.genOffsetHash(); err != nil {
         			return plumbing.ZeroHash, err
         		}
        +
        +		hash, ok = idx.offsetHash[o]
         	}
         
        -	hash, ok := idx.offsetHash[o]
         	if !ok {
         		return plumbing.ZeroHash, plumbing.ErrObjectNotFound
         	}
        @@ -190,23 +202,21 @@ func (idx *MemoryIndex) genOffsetHash() error {
         	}
         
         	idx.offsetHash = make(map[int64]plumbing.Hash, count)
        -
        -	iter, err := idx.Entries()
        -	if err != nil {
        -		return err
        -	}
        -
        -	for {
        -		entry, err := iter.Next()
        -		if err != nil {
        -			if err == io.EOF {
        -				return nil
        -			}
        -			return err
        +	idx.offsetHashIsFull = true
        +
        +	var hash plumbing.Hash
        +	i := uint32(0)
        +	for firstLevel, fanoutValue := range idx.Fanout {
        +		mappedFirstLevel := idx.FanoutMapping[firstLevel]
        +		for secondLevel := uint32(0); i < fanoutValue; i++ {
        +			copy(hash[:], idx.Names[mappedFirstLevel][secondLevel*objectIDLength:])
        +			offset := int64(idx.getOffset(mappedFirstLevel, int(secondLevel)))
        +			idx.offsetHash[offset] = hash
        +			secondLevel++
         		}
        -
        -		idx.offsetHash[int64(entry.Offset)] = entry.Hash
         	}
        +
        +	return nil
         }
         
         // Count implements the Index interface.
        @@ -275,22 +285,11 @@ func (i *idxfileEntryIter) Next() (*Entry, error) {
         			continue
         		}
         
        +		mappedFirstLevel := i.idx.FanoutMapping[i.firstLevel]
         		entry := new(Entry)
        -		ofs := i.secondLevel * objectIDLength
        -		copy(entry.Hash[:], i.idx.Names[i.idx.FanoutMapping[i.firstLevel]][ofs:])
        -
        -		pos := i.idx.FanoutMapping[entry.Hash[0]]
        -
        -		offset, err := i.idx.getOffset(pos, i.secondLevel)
        -		if err != nil {
        -			return nil, err
        -		}
        -		entry.Offset = uint64(offset)
        -
        -		entry.CRC32, err = i.idx.getCRC32(pos, i.secondLevel)
        -		if err != nil {
        -			return nil, err
        -		}
        +		copy(entry.Hash[:], i.idx.Names[mappedFirstLevel][i.secondLevel*objectIDLength:])
        +		entry.Offset = i.idx.getOffset(mappedFirstLevel, i.secondLevel)
        +		entry.CRC32 = i.idx.getCRC32(mappedFirstLevel, i.secondLevel)
         
         		i.secondLevel++
         		i.total++
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/idxfile/writer.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/idxfile/writer.go
        index aa919e783..fcc78c56d 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/idxfile/writer.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/idxfile/writer.go
        @@ -147,7 +147,7 @@ func (w *Writer) createIndex() (*MemoryIndex, error) {
         		idx.Offset32[bucket] = append(idx.Offset32[bucket], buf.Bytes()...)
         
         		buf.Truncate(0)
        -		binary.WriteUint32(buf, uint32(o.CRC32))
        +		binary.WriteUint32(buf, o.CRC32)
         		idx.CRC32[bucket] = append(idx.CRC32[bucket], buf.Bytes()...)
         	}
         
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/index/decoder.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/index/decoder.go
        index 1a58128f4..98f92fda6 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/index/decoder.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/index/decoder.go
        @@ -1,6 +1,7 @@
         package index
         
         import (
        +	"bufio"
         	"bytes"
         	"crypto/sha1"
         	"errors"
        @@ -21,7 +22,7 @@ var (
         	// ErrMalformedSignature is returned by Decode when the index header file is
         	// malformed
         	ErrMalformedSignature = errors.New("malformed index signature file")
        -	// ErrInvalidChecksum is returned by Decode if the SHA1 hash missmatch with
        +	// ErrInvalidChecksum is returned by Decode if the SHA1 hash mismatch with
         	// the read content
         	ErrInvalidChecksum = errors.New("invalid checksum")
         
        @@ -42,14 +43,17 @@ type Decoder struct {
         	r         io.Reader
         	hash      hash.Hash
         	lastEntry *Entry
        +
        +	extReader *bufio.Reader
         }
         
         // NewDecoder returns a new decoder that reads from r.
         func NewDecoder(r io.Reader) *Decoder {
         	h := sha1.New()
         	return &Decoder{
        -		r:    io.TeeReader(r, h),
        -		hash: h,
        +		r:         io.TeeReader(r, h),
        +		hash:      h,
        +		extReader: bufio.NewReader(nil),
         	}
         }
         
        @@ -184,11 +188,9 @@ func (d *Decoder) doReadEntryNameV4() (string, error) {
         
         func (d *Decoder) doReadEntryName(len uint16) (string, error) {
         	name := make([]byte, len)
        -	if err := binary.Read(d.r, &name); err != nil {
        -		return "", err
        -	}
        +	_, err := io.ReadFull(d.r, name[:])
         
        -	return string(name), nil
        +	return string(name), err
         }
         
         // Index entries are padded out to the next 8 byte alignment
        @@ -261,6 +263,17 @@ func (d *Decoder) readExtension(idx *Index, header []byte) error {
         		if err := d.Decode(idx.ResolveUndo); err != nil {
         			return err
         		}
        +	case bytes.Equal(header, endOfIndexEntryExtSignature):
        +		r, err := d.getExtensionReader()
        +		if err != nil {
        +			return err
        +		}
        +
        +		idx.EndOfIndexEntry = &EndOfIndexEntry{}
        +		d := &endOfIndexEntryDecoder{r}
        +		if err := d.Decode(idx.EndOfIndexEntry); err != nil {
        +			return err
        +		}
         	default:
         		return errUnknownExtension
         	}
        @@ -268,20 +281,21 @@ func (d *Decoder) readExtension(idx *Index, header []byte) error {
         	return nil
         }
         
        -func (d *Decoder) getExtensionReader() (io.Reader, error) {
        +func (d *Decoder) getExtensionReader() (*bufio.Reader, error) {
         	len, err := binary.ReadUint32(d.r)
         	if err != nil {
         		return nil, err
         	}
         
        -	return &io.LimitedReader{R: d.r, N: int64(len)}, nil
        +	d.extReader.Reset(&io.LimitedReader{R: d.r, N: int64(len)})
        +	return d.extReader, nil
         }
         
         func (d *Decoder) readChecksum(expected []byte, alreadyRead [4]byte) error {
         	var h plumbing.Hash
         	copy(h[:4], alreadyRead[:])
         
        -	if err := binary.Read(d.r, h[4:]); err != nil {
        +	if _, err := io.ReadFull(d.r, h[4:]); err != nil {
         		return err
         	}
         
        @@ -315,7 +329,7 @@ func validateHeader(r io.Reader) (version uint32, err error) {
         }
         
         type treeExtensionDecoder struct {
        -	r io.Reader
        +	r *bufio.Reader
         }
         
         func (d *treeExtensionDecoder) Decode(t *Tree) error {
        @@ -375,16 +389,13 @@ func (d *treeExtensionDecoder) readEntry() (*TreeEntry, error) {
         	}
         
         	e.Trees = i
        -
        -	if err := binary.Read(d.r, &e.Hash); err != nil {
        -		return nil, err
        -	}
        +	_, err = io.ReadFull(d.r, e.Hash[:])
         
         	return e, nil
         }
         
         type resolveUndoDecoder struct {
        -	r io.Reader
        +	r *bufio.Reader
         }
         
         func (d *resolveUndoDecoder) Decode(ru *ResolveUndo) error {
        @@ -422,7 +433,7 @@ func (d *resolveUndoDecoder) readEntry() (*ResolveUndoEntry, error) {
         
         	for s := range e.Stages {
         		var hash plumbing.Hash
        -		if err := binary.Read(d.r, hash[:]); err != nil {
        +		if _, err := io.ReadFull(d.r, hash[:]); err != nil {
         			return nil, err
         		}
         
        @@ -449,3 +460,18 @@ func (d *resolveUndoDecoder) readStage(e *ResolveUndoEntry, s Stage) error {
         
         	return nil
         }
        +
        +type endOfIndexEntryDecoder struct {
        +	r *bufio.Reader
        +}
        +
        +func (d *endOfIndexEntryDecoder) Decode(e *EndOfIndexEntry) error {
        +	var err error
        +	e.Offset, err = binary.ReadUint32(d.r)
        +	if err != nil {
        +		return err
        +	}
        +
        +	_, err = io.ReadFull(d.r, e.Hash[:])
        +	return err
        +}
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/index/doc.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/index/doc.go
        index d1e7b335b..39ae6ad5f 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/index/doc.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/index/doc.go
        @@ -297,5 +297,64 @@
         //        in the previous ewah bitmap.
         //
         //      - One NUL.
        -// Source https://www.kernel.org/pub/software/scm/git/docs/technical/index-format.txt
        +//
        +//   == File System Monitor cache
        +//
        +//     The file system monitor cache tracks files for which the core.fsmonitor
        +//     hook has told us about changes.  The signature for this extension is
        +//     { 'F', 'S', 'M', 'N' }.
        +//
        +//     The extension starts with
        +//
        +//     - 32-bit version number: the current supported version is 1.
        +//
        +//     - 64-bit time: the extension data reflects all changes through the given
        +//       time which is stored as the nanoseconds elapsed since midnight,
        +//       January 1, 1970.
        +//
        +//    - 32-bit bitmap size: the size of the CE_FSMONITOR_VALID bitmap.
        +//
        +//    - An ewah bitmap, the n-th bit indicates whether the n-th index entry
        +//      is not CE_FSMONITOR_VALID.
        +//
        +//  == End of Index Entry
        +//
        +//    The End of Index Entry (EOIE) is used to locate the end of the variable
        +//    length index entries and the beginning of the extensions. Code can take
        +//    advantage of this to quickly locate the index extensions without having
        +//    to parse through all of the index entries.
        +//
        +//    Because it must be able to be loaded before the variable length cache
        +//    entries and other index extensions, this extension must be written last.
        +//    The signature for this extension is { 'E', 'O', 'I', 'E' }.
        +//
        +//    The extension consists of:
        +//
        +//    - 32-bit offset to the end of the index entries
        +//
        +//    - 160-bit SHA-1 over the extension types and their sizes (but not
        +//      their contents).  E.g. if we have "TREE" extension that is N-bytes
        +//      long, "REUC" extension that is M-bytes long, followed by "EOIE",
        +//      then the hash would be:
        +//
        +//      SHA-1("TREE" +  +
        +//        "REUC" + )
        +//
        +//  == Index Entry Offset Table
        +//
        +//    The Index Entry Offset Table (IEOT) is used to help address the CPU
        +//    cost of loading the index by enabling multi-threading the process of
        +//    converting cache entries from the on-disk format to the in-memory format.
        +//    The signature for this extension is { 'I', 'E', 'O', 'T' }.
        +//
        +//    The extension consists of:
        +//
        +//    - 32-bit version (currently 1)
        +//
        +//    - A number of index offset entries each consisting of:
        +//
        +//    - 32-bit offset from the beginning of the file to the first cache entry
        +//      in this block of entries.
        +//
        +//    - 32-bit count of cache entries in this blockpackage index
         package index
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/index/index.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/index/index.go
        index fc7b8cd11..6653c91d2 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/index/index.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/index/index.go
        @@ -18,9 +18,10 @@ var (
         	// ErrEntryNotFound is returned by Index.Entry, if an entry is not found.
         	ErrEntryNotFound = errors.New("entry not found")
         
        -	indexSignature          = []byte{'D', 'I', 'R', 'C'}
        -	treeExtSignature        = []byte{'T', 'R', 'E', 'E'}
        -	resolveUndoExtSignature = []byte{'R', 'E', 'U', 'C'}
        +	indexSignature              = []byte{'D', 'I', 'R', 'C'}
        +	treeExtSignature            = []byte{'T', 'R', 'E', 'E'}
        +	resolveUndoExtSignature     = []byte{'R', 'E', 'U', 'C'}
        +	endOfIndexEntryExtSignature = []byte{'E', 'O', 'I', 'E'}
         )
         
         // Stage during merge
        @@ -50,6 +51,8 @@ type Index struct {
         	Cache *Tree
         	// ResolveUndo represents the 'Resolve undo' extension
         	ResolveUndo *ResolveUndo
        +	// EndOfIndexEntry represents the 'End of Index Entry' extension
        +	EndOfIndexEntry *EndOfIndexEntry
         }
         
         // Add creates a new Entry and returns it. The caller should first check that
        @@ -193,3 +196,18 @@ type ResolveUndoEntry struct {
         	Path   string
         	Stages map[Stage]plumbing.Hash
         }
        +
        +// EndOfIndexEntry is the End of Index Entry (EOIE) is used to locate the end of
        +// the variable length index entries and the beginning of the extensions. Code
        +// can take advantage of this to quickly locate the index extensions without
        +// having to parse through all of the index entries.
        +//
        +//  Because it must be able to be loaded before the variable length cache
        +//  entries and other index extensions, this extension must be written last.
        +type EndOfIndexEntry struct {
        +	// Offset to the end of the index entries
        +	Offset uint32
        +	// Hash is a SHA-1 over the extension types and their sizes (but not
        +	//	their contents).
        +	Hash plumbing.Hash
        +}
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/common.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/common.go
        index 2b4acebde..f82c1abe5 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/common.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/common.go
        @@ -2,6 +2,7 @@ package packfile
         
         import (
         	"bytes"
        +	"compress/zlib"
         	"io"
         	"sync"
         
        @@ -51,7 +52,13 @@ func WritePackfileToObjectStorage(
         	}
         
         	defer ioutil.CheckClose(w, &err)
        -	_, err = io.Copy(w, packfile)
        +
        +	var n int64
        +	n, err = io.Copy(w, packfile)
        +	if err == nil && n == 0 {
        +		return ErrEmptyPackfile
        +	}
        +
         	return err
         }
         
        @@ -60,3 +67,12 @@ var bufPool = sync.Pool{
         		return bytes.NewBuffer(nil)
         	},
         }
        +
        +var zlibInitBytes = []byte{0x78, 0x9c, 0x01, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01}
        +
        +var zlibReaderPool = sync.Pool{
        +	New: func() interface{} {
        +		r, _ := zlib.NewReader(bytes.NewReader(zlibInitBytes))
        +		return r
        +	},
        +}
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/diff_delta.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/diff_delta.go
        index d35e78aea..43f87a0b1 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/diff_delta.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/diff_delta.go
        @@ -40,8 +40,8 @@ func getDelta(index *deltaIndex, base, target plumbing.EncodedObject) (plumbing.
         	defer tr.Close()
         
         	bb := bufPool.Get().(*bytes.Buffer)
        -	bb.Reset()
         	defer bufPool.Put(bb)
        +	bb.Reset()
         
         	_, err = bb.ReadFrom(br)
         	if err != nil {
        @@ -49,8 +49,8 @@ func getDelta(index *deltaIndex, base, target plumbing.EncodedObject) (plumbing.
         	}
         
         	tb := bufPool.Get().(*bytes.Buffer)
        -	tb.Reset()
         	defer bufPool.Put(tb)
        +	tb.Reset()
         
         	_, err = tb.ReadFrom(tr)
         	if err != nil {
        @@ -77,6 +77,7 @@ func DiffDelta(src, tgt []byte) []byte {
         
         func diffDelta(index *deltaIndex, src []byte, tgt []byte) []byte {
         	buf := bufPool.Get().(*bytes.Buffer)
        +	defer bufPool.Put(buf)
         	buf.Reset()
         	buf.Write(deltaEncodeSize(len(src)))
         	buf.Write(deltaEncodeSize(len(tgt)))
        @@ -86,6 +87,7 @@ func diffDelta(index *deltaIndex, src []byte, tgt []byte) []byte {
         	}
         
         	ibuf := bufPool.Get().(*bytes.Buffer)
        +	defer bufPool.Put(ibuf)
         	ibuf.Reset()
         	for i := 0; i < len(tgt); i++ {
         		offset, l := index.findMatch(src, tgt, i)
        @@ -127,12 +129,9 @@ func diffDelta(index *deltaIndex, src []byte, tgt []byte) []byte {
         	}
         
         	encodeInsertOperation(ibuf, buf)
        -	bytes := buf.Bytes()
        -
        -	bufPool.Put(buf)
        -	bufPool.Put(ibuf)
         
        -	return bytes
        +	// buf.Bytes() is only valid until the next modifying operation on the buffer. Copy it.
        +	return append([]byte{}, buf.Bytes()...)
         }
         
         func encodeInsertOperation(ibuf, buf *bytes.Buffer) {
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/fsobject.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/fsobject.go
        index 330cb73c9..a268bce7e 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/fsobject.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/fsobject.go
        @@ -48,7 +48,7 @@ func NewFSObject(
         // Reader implements the plumbing.EncodedObject interface.
         func (o *FSObject) Reader() (io.ReadCloser, error) {
         	obj, ok := o.cache.Get(o.hash)
        -	if ok {
        +	if ok && obj != o {
         		reader, err := obj.Reader()
         		if err != nil {
         			return nil, err
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/packfile.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/packfile.go
        index 852a8344b..21a15de0c 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/packfile.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/packfile.go
        @@ -21,6 +21,16 @@ var (
         	ErrZLib = NewError("zlib reading error")
         )
         
        +// When reading small objects from packfile it is beneficial to do so at
        +// once to exploit the buffered I/O. In many cases the objects are so small
        +// that they were already loaded to memory when the object header was
        +// loaded from the packfile. Wrapping in FSObject would cause this buffered
        +// data to be thrown away and then re-read later, with the additional
        +// seeking causing reloads from disk. Objects smaller than this threshold
        +// are now always read into memory and stored in cache instead of being
        +// wrapped in FSObject.
        +const smallObjectThreshold = 16 * 1024
        +
         // Packfile allows retrieving information from inside a packfile.
         type Packfile struct {
         	idxfile.Index
        @@ -66,28 +76,42 @@ func (p *Packfile) Get(h plumbing.Hash) (plumbing.EncodedObject, error) {
         		return nil, err
         	}
         
        -	return p.GetByOffset(offset)
        +	return p.objectAtOffset(offset, h)
         }
         
        -// GetByOffset retrieves the encoded object from the packfile with the given
        +// GetByOffset retrieves the encoded object from the packfile at the given
         // offset.
         func (p *Packfile) GetByOffset(o int64) (plumbing.EncodedObject, error) {
         	hash, err := p.FindHash(o)
        -	if err == nil {
        -		if obj, ok := p.deltaBaseCache.Get(hash); ok {
        -			return obj, nil
        -		}
        +	if err != nil {
        +		return nil, err
         	}
         
        +	return p.objectAtOffset(o, hash)
        +}
        +
        +// GetSizeByOffset retrieves the size of the encoded object from the
        +// packfile with the given offset.
        +func (p *Packfile) GetSizeByOffset(o int64) (size int64, err error) {
         	if _, err := p.s.SeekFromStart(o); err != nil {
         		if err == io.EOF || isInvalid(err) {
        -			return nil, plumbing.ErrObjectNotFound
        +			return 0, plumbing.ErrObjectNotFound
         		}
         
        -		return nil, err
        +		return 0, err
         	}
         
        -	return p.nextObject()
        +	h, err := p.nextObjectHeader()
        +	if err != nil {
        +		return 0, err
        +	}
        +	return p.getObjectSize(h)
        +}
        +
        +func (p *Packfile) objectHeaderAtOffset(offset int64) (*ObjectHeader, error) {
        +	h, err := p.s.SeekObjectHeader(offset)
        +	p.s.pendingObject = nil
        +	return h, err
         }
         
         func (p *Packfile) nextObjectHeader() (*ObjectHeader, error) {
        @@ -96,60 +120,11 @@ func (p *Packfile) nextObjectHeader() (*ObjectHeader, error) {
         	return h, err
         }
         
        -func (p *Packfile) getObjectData(
        -	h *ObjectHeader,
        -) (typ plumbing.ObjectType, size int64, err error) {
        -	switch h.Type {
        -	case plumbing.CommitObject, plumbing.TreeObject, plumbing.BlobObject, plumbing.TagObject:
        -		typ = h.Type
        -		size = h.Length
        -	case plumbing.REFDeltaObject, plumbing.OFSDeltaObject:
        -		buf := bufPool.Get().(*bytes.Buffer)
        -		buf.Reset()
        -		defer bufPool.Put(buf)
        -
        -		_, _, err = p.s.NextObject(buf)
        -		if err != nil {
        -			return
        -		}
        -
        -		delta := buf.Bytes()
        -		_, delta = decodeLEB128(delta) // skip src size
        -		sz, _ := decodeLEB128(delta)
        -		size = int64(sz)
        -
        -		var offset int64
        -		if h.Type == plumbing.REFDeltaObject {
        -			offset, err = p.FindOffset(h.Reference)
        -			if err != nil {
        -				return
        -			}
        -		} else {
        -			offset = h.OffsetReference
        -		}
        -
        -		if baseType, ok := p.offsetToType[offset]; ok {
        -			typ = baseType
        -		} else {
        -			if _, err = p.s.SeekFromStart(offset); err != nil {
        -				return
        -			}
        -
        -			h, err = p.nextObjectHeader()
        -			if err != nil {
        -				return
        -			}
        -
        -			typ, _, err = p.getObjectData(h)
        -			if err != nil {
        -				return
        -			}
        -		}
        -	default:
        -		err = ErrInvalidObject.AddDetails("type %q", h.Type)
        -	}
        -
        -	return
        +func (p *Packfile) getDeltaObjectSize(buf *bytes.Buffer) int64 {
        +	delta := buf.Bytes()
        +	_, delta = decodeLEB128(delta) // skip src size
        +	sz, _ := decodeLEB128(delta)
        +	return int64(sz)
         }
         
         func (p *Packfile) getObjectSize(h *ObjectHeader) (int64, error) {
        @@ -158,17 +133,14 @@ func (p *Packfile) getObjectSize(h *ObjectHeader) (int64, error) {
         		return h.Length, nil
         	case plumbing.REFDeltaObject, plumbing.OFSDeltaObject:
         		buf := bufPool.Get().(*bytes.Buffer)
        -		buf.Reset()
         		defer bufPool.Put(buf)
        +		buf.Reset()
         
         		if _, _, err := p.s.NextObject(buf); err != nil {
         			return 0, err
         		}
         
        -		delta := buf.Bytes()
        -		_, delta = decodeLEB128(delta) // skip src size
        -		sz, _ := decodeLEB128(delta)
        -		return int64(sz), nil
        +		return p.getDeltaObjectSize(buf), nil
         	default:
         		return 0, ErrInvalidObject.AddDetails("type %q", h.Type)
         	}
        @@ -192,11 +164,7 @@ func (p *Packfile) getObjectType(h *ObjectHeader) (typ plumbing.ObjectType, err
         		if baseType, ok := p.offsetToType[offset]; ok {
         			typ = baseType
         		} else {
        -			if _, err = p.s.SeekFromStart(offset); err != nil {
        -				return
        -			}
        -
        -			h, err = p.nextObjectHeader()
        +			h, err = p.objectHeaderAtOffset(offset)
         			if err != nil {
         				return
         			}
        @@ -210,11 +178,17 @@ func (p *Packfile) getObjectType(h *ObjectHeader) (typ plumbing.ObjectType, err
         		err = ErrInvalidObject.AddDetails("type %q", h.Type)
         	}
         
        +	p.offsetToType[h.Offset] = typ
        +
         	return
         }
         
        -func (p *Packfile) nextObject() (plumbing.EncodedObject, error) {
        -	h, err := p.nextObjectHeader()
        +func (p *Packfile) objectAtOffset(offset int64, hash plumbing.Hash) (plumbing.EncodedObject, error) {
        +	if obj, ok := p.cacheGet(hash); ok {
        +		return obj, nil
        +	}
        +
        +	h, err := p.objectHeaderAtOffset(offset)
         	if err != nil {
         		if err == io.EOF || isInvalid(err) {
         			return nil, plumbing.ErrObjectNotFound
        @@ -222,20 +196,54 @@ func (p *Packfile) nextObject() (plumbing.EncodedObject, error) {
         		return nil, err
         	}
         
        +	return p.getNextObject(h, hash)
        +}
        +
        +func (p *Packfile) getNextObject(h *ObjectHeader, hash plumbing.Hash) (plumbing.EncodedObject, error) {
        +	var err error
        +
         	// If we have no filesystem, we will return a MemoryObject instead
         	// of an FSObject.
         	if p.fs == nil {
        -		return p.getNextObject(h)
        +		return p.getNextMemoryObject(h)
         	}
         
        -	hash, err := p.FindHash(h.Offset)
        -	if err != nil {
        -		return nil, err
        -	}
        +	// If the object is small enough then read it completely into memory now since
        +	// it is already read from disk into buffer anyway. For delta objects we want
        +	// to perform the optimization too, but we have to be careful about applying
        +	// small deltas on big objects.
        +	var size int64
        +	if h.Length <= smallObjectThreshold {
        +		if h.Type != plumbing.OFSDeltaObject && h.Type != plumbing.REFDeltaObject {
        +			return p.getNextMemoryObject(h)
        +		}
         
        -	size, err := p.getObjectSize(h)
        -	if err != nil {
        -		return nil, err
        +		// For delta objects we read the delta data and apply the small object
        +		// optimization only if the expanded version of the object still meets
        +		// the small object threshold condition.
        +		buf := bufPool.Get().(*bytes.Buffer)
        +		defer bufPool.Put(buf)
        +		buf.Reset()
        +		if _, _, err := p.s.NextObject(buf); err != nil {
        +			return nil, err
        +		}
        +
        +		size = p.getDeltaObjectSize(buf)
        +		if size <= smallObjectThreshold {
        +			var obj = new(plumbing.MemoryObject)
        +			obj.SetSize(size)
        +			if h.Type == plumbing.REFDeltaObject {
        +				err = p.fillREFDeltaObjectContentWithBuffer(obj, h.Reference, buf)
        +			} else {
        +				err = p.fillOFSDeltaObjectContentWithBuffer(obj, h.OffsetReference, buf)
        +			}
        +			return obj, err
        +		}
        +	} else {
        +		size, err = p.getObjectSize(h)
        +		if err != nil {
        +			return nil, err
        +		}
         	}
         
         	typ, err := p.getObjectType(h)
        @@ -258,29 +266,14 @@ func (p *Packfile) nextObject() (plumbing.EncodedObject, error) {
         }
         
         func (p *Packfile) getObjectContent(offset int64) (io.ReadCloser, error) {
        -	ref, err := p.FindHash(offset)
        -	if err == nil {
        -		obj, ok := p.cacheGet(ref)
        -		if ok {
        -			reader, err := obj.Reader()
        -			if err != nil {
        -				return nil, err
        -			}
        -
        -			return reader, nil
        -		}
        -	}
        -
        -	if _, err := p.s.SeekFromStart(offset); err != nil {
        -		return nil, err
        -	}
        -
        -	h, err := p.nextObjectHeader()
        +	h, err := p.objectHeaderAtOffset(offset)
         	if err != nil {
         		return nil, err
         	}
         
        -	obj, err := p.getNextObject(h)
        +	// getObjectContent is called from FSObject, so we have to explicitly
        +	// get memory object here to avoid recursive cycle
        +	obj, err := p.getNextMemoryObject(h)
         	if err != nil {
         		return nil, err
         	}
        @@ -288,7 +281,7 @@ func (p *Packfile) getObjectContent(offset int64) (io.ReadCloser, error) {
         	return obj.Reader()
         }
         
        -func (p *Packfile) getNextObject(h *ObjectHeader) (plumbing.EncodedObject, error) {
        +func (p *Packfile) getNextMemoryObject(h *ObjectHeader) (plumbing.EncodedObject, error) {
         	var obj = new(plumbing.MemoryObject)
         	obj.SetSize(h.Length)
         	obj.SetType(h.Type)
        @@ -309,6 +302,8 @@ func (p *Packfile) getNextObject(h *ObjectHeader) (plumbing.EncodedObject, error
         		return nil, err
         	}
         
        +	p.offsetToType[h.Offset] = obj.Type()
        +
         	return obj, nil
         }
         
        @@ -326,12 +321,19 @@ func (p *Packfile) fillRegularObjectContent(obj plumbing.EncodedObject) error {
         
         func (p *Packfile) fillREFDeltaObjectContent(obj plumbing.EncodedObject, ref plumbing.Hash) error {
         	buf := bufPool.Get().(*bytes.Buffer)
        +	defer bufPool.Put(buf)
         	buf.Reset()
         	_, _, err := p.s.NextObject(buf)
         	if err != nil {
         		return err
         	}
         
        +	return p.fillREFDeltaObjectContentWithBuffer(obj, ref, buf)
        +}
        +
        +func (p *Packfile) fillREFDeltaObjectContentWithBuffer(obj plumbing.EncodedObject, ref plumbing.Hash, buf *bytes.Buffer) error {
        +	var err error
        +
         	base, ok := p.cacheGet(ref)
         	if !ok {
         		base, err = p.Get(ref)
        @@ -343,32 +345,31 @@ func (p *Packfile) fillREFDeltaObjectContent(obj plumbing.EncodedObject, ref plu
         	obj.SetType(base.Type())
         	err = ApplyDelta(obj, base, buf.Bytes())
         	p.cachePut(obj)
        -	bufPool.Put(buf)
         
         	return err
         }
         
         func (p *Packfile) fillOFSDeltaObjectContent(obj plumbing.EncodedObject, offset int64) error {
        -	buf := bytes.NewBuffer(nil)
        +	buf := bufPool.Get().(*bytes.Buffer)
        +	defer bufPool.Put(buf)
        +	buf.Reset()
         	_, _, err := p.s.NextObject(buf)
         	if err != nil {
         		return err
         	}
         
        -	var base plumbing.EncodedObject
        -	var ok bool
        +	return p.fillOFSDeltaObjectContentWithBuffer(obj, offset, buf)
        +}
        +
        +func (p *Packfile) fillOFSDeltaObjectContentWithBuffer(obj plumbing.EncodedObject, offset int64, buf *bytes.Buffer) error {
         	hash, err := p.FindHash(offset)
        -	if err == nil {
        -		base, ok = p.cacheGet(hash)
        +	if err != nil {
        +		return err
         	}
         
        -	if !ok {
        -		base, err = p.GetByOffset(offset)
        -		if err != nil {
        -			return err
        -		}
        -
        -		p.cachePut(base)
        +	base, err := p.objectAtOffset(offset, hash)
        +	if err != nil {
        +		return err
         	}
         
         	obj.SetType(base.Type())
        @@ -447,6 +448,11 @@ func (p *Packfile) ID() (plumbing.Hash, error) {
         	return hash, nil
         }
         
        +// Scanner returns the packfile's Scanner
        +func (p *Packfile) Scanner() *Scanner {
        +	return p.s
        +}
        +
         // Close the packfile and its resources.
         func (p *Packfile) Close() error {
         	closer, ok := p.file.(io.Closer)
        @@ -470,14 +476,50 @@ func (i *objectIter) Next() (plumbing.EncodedObject, error) {
         			return nil, err
         		}
         
        -		obj, err := i.p.GetByOffset(int64(e.Offset))
        +		if i.typ != plumbing.AnyObject {
        +			if typ, ok := i.p.offsetToType[int64(e.Offset)]; ok {
        +				if typ != i.typ {
        +					continue
        +				}
        +			} else if obj, ok := i.p.cacheGet(e.Hash); ok {
        +				if obj.Type() != i.typ {
        +					i.p.offsetToType[int64(e.Offset)] = obj.Type()
        +					continue
        +				}
        +				return obj, nil
        +			} else {
        +				h, err := i.p.objectHeaderAtOffset(int64(e.Offset))
        +				if err != nil {
        +					return nil, err
        +				}
        +
        +				if h.Type == plumbing.REFDeltaObject || h.Type == plumbing.OFSDeltaObject {
        +					typ, err := i.p.getObjectType(h)
        +					if err != nil {
        +						return nil, err
        +					}
        +					if typ != i.typ {
        +						i.p.offsetToType[int64(e.Offset)] = typ
        +						continue
        +					}
        +					// getObjectType will seek in the file so we cannot use getNextObject safely
        +					return i.p.objectAtOffset(int64(e.Offset), e.Hash)
        +				} else {
        +					if h.Type != i.typ {
        +						i.p.offsetToType[int64(e.Offset)] = h.Type
        +						continue
        +					}
        +					return i.p.getNextObject(h, e.Hash)
        +				}
        +			}
        +		}
        +
        +		obj, err := i.p.objectAtOffset(int64(e.Offset), e.Hash)
         		if err != nil {
         			return nil, err
         		}
         
        -		if i.typ == plumbing.AnyObject || obj.Type() == i.typ {
        -			return obj, nil
        -		}
        +		return obj, nil
         	}
         }
         
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/parser.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/parser.go
        index 28582b5fa..71cbba983 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/parser.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/parser.go
        @@ -38,15 +38,14 @@ type Observer interface {
         // Parser decodes a packfile and calls any observer associated to it. Is used
         // to generate indexes.
         type Parser struct {
        -	storage          storer.EncodedObjectStorer
        -	scanner          *Scanner
        -	count            uint32
        -	oi               []*objectInfo
        -	oiByHash         map[plumbing.Hash]*objectInfo
        -	oiByOffset       map[int64]*objectInfo
        -	hashOffset       map[plumbing.Hash]int64
        -	pendingRefDeltas map[plumbing.Hash][]*objectInfo
        -	checksum         plumbing.Hash
        +	storage    storer.EncodedObjectStorer
        +	scanner    *Scanner
        +	count      uint32
        +	oi         []*objectInfo
        +	oiByHash   map[plumbing.Hash]*objectInfo
        +	oiByOffset map[int64]*objectInfo
        +	hashOffset map[plumbing.Hash]int64
        +	checksum   plumbing.Hash
         
         	cache *cache.BufferLRU
         	// delta content by offset, only used if source is not seekable
        @@ -78,13 +77,12 @@ func NewParserWithStorage(
         	}
         
         	return &Parser{
        -		storage:          storage,
        -		scanner:          scanner,
        -		ob:               ob,
        -		count:            0,
        -		cache:            cache.NewBufferLRUDefault(),
        -		pendingRefDeltas: make(map[plumbing.Hash][]*objectInfo),
        -		deltas:           deltas,
        +		storage: storage,
        +		scanner: scanner,
        +		ob:      ob,
        +		count:   0,
        +		cache:   cache.NewBufferLRUDefault(),
        +		deltas:  deltas,
         	}, nil
         }
         
        @@ -150,10 +148,6 @@ func (p *Parser) Parse() (plumbing.Hash, error) {
         		return plumbing.ZeroHash, err
         	}
         
        -	if len(p.pendingRefDeltas) > 0 {
        -		return plumbing.ZeroHash, ErrReferenceDeltaNotFound
        -	}
        -
         	if err := p.onFooter(p.checksum); err != nil {
         		return plumbing.ZeroHash, err
         	}
        @@ -205,18 +199,21 @@ func (p *Parser) indexObjects() error {
         			parent.Children = append(parent.Children, ota)
         		case plumbing.REFDeltaObject:
         			delta = true
        -
         			parent, ok := p.oiByHash[oh.Reference]
        -			if ok {
        -				ota = newDeltaObject(oh.Offset, oh.Length, t, parent)
        -				parent.Children = append(parent.Children, ota)
        -			} else {
        -				ota = newBaseObject(oh.Offset, oh.Length, t)
        -				p.pendingRefDeltas[oh.Reference] = append(
        -					p.pendingRefDeltas[oh.Reference],
        -					ota,
        -				)
        +			if !ok {
        +				// can't find referenced object in this pack file
        +				// this must be a "thin" pack.
        +				parent = &objectInfo{ //Placeholder parent
        +					SHA1:        oh.Reference,
        +					ExternalRef: true, // mark as an external reference that must be resolved
        +					Type:        plumbing.AnyObject,
        +					DiskType:    plumbing.AnyObject,
        +				}
        +				p.oiByHash[oh.Reference] = parent
         			}
        +			ota = newDeltaObject(oh.Offset, oh.Length, t, parent)
        +			parent.Children = append(parent.Children, ota)
        +
         		default:
         			ota = newBaseObject(oh.Offset, oh.Length, t)
         		}
        @@ -297,16 +294,20 @@ func (p *Parser) resolveDeltas() error {
         	return nil
         }
         
        -func (p *Parser) get(o *objectInfo) ([]byte, error) {
        -	b, ok := p.cache.Get(o.Offset)
        +func (p *Parser) get(o *objectInfo) (b []byte, err error) {
        +	var ok bool
        +	if !o.ExternalRef { // skip cache check for placeholder parents
        +		b, ok = p.cache.Get(o.Offset)
        +	}
        +
         	// If it's not on the cache and is not a delta we can try to find it in the
        -	// storage, if there's one.
        +	// storage, if there's one. External refs must enter here.
         	if !ok && p.storage != nil && !o.Type.IsDelta() {
        -		var err error
         		e, err := p.storage.EncodedObject(plumbing.AnyObject, o.SHA1)
         		if err != nil {
         			return nil, err
         		}
        +		o.Type = e.Type()
         
         		r, err := e.Reader()
         		if err != nil {
        @@ -323,6 +324,11 @@ func (p *Parser) get(o *objectInfo) ([]byte, error) {
         		return b, nil
         	}
         
        +	if o.ExternalRef {
        +		// we were not able to resolve a ref in a thin pack
        +		return nil, ErrReferenceDeltaNotFound
        +	}
        +
         	var data []byte
         	if o.DiskType.IsDelta() {
         		base, err := p.get(o.Parent)
        @@ -335,7 +341,6 @@ func (p *Parser) get(o *objectInfo) ([]byte, error) {
         			return nil, err
         		}
         	} else {
        -		var err error
         		data, err = p.readData(o)
         		if err != nil {
         			return nil, err
        @@ -367,14 +372,6 @@ func (p *Parser) resolveObject(
         		return nil, err
         	}
         
        -	if pending, ok := p.pendingRefDeltas[o.SHA1]; ok {
        -		for _, po := range pending {
        -			po.Parent = o
        -			o.Children = append(o.Children, po)
        -		}
        -		delete(p.pendingRefDeltas, o.SHA1)
        -	}
        -
         	if p.storage != nil {
         		obj := new(plumbing.MemoryObject)
         		obj.SetSize(o.Size())
        @@ -401,11 +398,7 @@ func (p *Parser) readData(o *objectInfo) ([]byte, error) {
         		return data, nil
         	}
         
        -	if _, err := p.scanner.SeekFromStart(o.Offset); err != nil {
        -		return nil, err
        -	}
        -
        -	if _, err := p.scanner.NextObjectHeader(); err != nil {
        +	if _, err := p.scanner.SeekObjectHeader(o.Offset); err != nil {
         		return nil, err
         	}
         
        @@ -447,10 +440,11 @@ func getSHA1(t plumbing.ObjectType, data []byte) (plumbing.Hash, error) {
         }
         
         type objectInfo struct {
        -	Offset   int64
        -	Length   int64
        -	Type     plumbing.ObjectType
        -	DiskType plumbing.ObjectType
        +	Offset      int64
        +	Length      int64
        +	Type        plumbing.ObjectType
        +	DiskType    plumbing.ObjectType
        +	ExternalRef bool // indicates this is an external reference in a thin pack file
         
         	Crc32 uint32
         
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/scanner.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/scanner.go
        index 6fc183b94..7b44192a9 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/scanner.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/scanner.go
        @@ -39,8 +39,7 @@ type ObjectHeader struct {
         }
         
         type Scanner struct {
        -	r   reader
        -	zr  readerResetter
        +	r   *scannerReader
         	crc hash.Hash32
         
         	// pendingObject is used to detect if an object has been read, or still
        @@ -56,19 +55,27 @@ type Scanner struct {
         // NewScanner returns a new Scanner based on a reader, if the given reader
         // implements io.ReadSeeker the Scanner will be also Seekable
         func NewScanner(r io.Reader) *Scanner {
        -	seeker, ok := r.(io.ReadSeeker)
        -	if !ok {
        -		seeker = &trackableReader{Reader: r}
        -	}
        +	_, ok := r.(io.ReadSeeker)
         
         	crc := crc32.NewIEEE()
         	return &Scanner{
        -		r:          newTeeReader(newByteReadSeeker(seeker), crc),
        +		r:          newScannerReader(r, crc),
         		crc:        crc,
         		IsSeekable: ok,
         	}
         }
         
        +func (s *Scanner) Reset(r io.Reader) {
        +	_, ok := r.(io.ReadSeeker)
        +
        +	s.r.Reset(r)
        +	s.crc.Reset()
        +	s.IsSeekable = ok
        +	s.pendingObject = nil
        +	s.version = 0
        +	s.objects = 0
        +}
        +
         // Header reads the whole packfile header (signature, version and object count).
         // It returns the version and the object count and performs checks on the
         // validity of the signature and the version fields.
        @@ -138,14 +145,51 @@ func (s *Scanner) readCount() (uint32, error) {
         	return binary.ReadUint32(s.r)
         }
         
        +// SeekObjectHeader seeks to specified offset and returns the ObjectHeader
        +// for the next object in the reader
        +func (s *Scanner) SeekObjectHeader(offset int64) (*ObjectHeader, error) {
        +	// if seeking we assume that you are not interested in the header
        +	if s.version == 0 {
        +		s.version = VersionSupported
        +	}
        +
        +	if _, err := s.r.Seek(offset, io.SeekStart); err != nil {
        +		return nil, err
        +	}
        +
        +	h, err := s.nextObjectHeader()
        +	if err != nil {
        +		return nil, err
        +	}
        +
        +	h.Offset = offset
        +	return h, nil
        +}
        +
         // NextObjectHeader returns the ObjectHeader for the next object in the reader
         func (s *Scanner) NextObjectHeader() (*ObjectHeader, error) {
        -	defer s.Flush()
        -
         	if err := s.doPending(); err != nil {
         		return nil, err
         	}
         
        +	offset, err := s.r.Seek(0, io.SeekCurrent)
        +	if err != nil {
        +		return nil, err
        +	}
        +
        +	h, err := s.nextObjectHeader()
        +	if err != nil {
        +		return nil, err
        +	}
        +
        +	h.Offset = offset
        +	return h, nil
        +}
        +
        +// nextObjectHeader returns the ObjectHeader for the next object in the reader
        +// without the Offset field
        +func (s *Scanner) nextObjectHeader() (*ObjectHeader, error) {
        +	s.r.Flush()
         	s.crc.Reset()
         
         	h := &ObjectHeader{}
        @@ -266,35 +310,29 @@ func (s *Scanner) readLength(first byte) (int64, error) {
         // NextObject writes the content of the next object into the reader, returns
         // the number of bytes written, the CRC32 of the content and an error, if any
         func (s *Scanner) NextObject(w io.Writer) (written int64, crc32 uint32, err error) {
        -	defer s.crc.Reset()
        -
         	s.pendingObject = nil
         	written, err = s.copyObject(w)
        -	s.Flush()
        +
        +	s.r.Flush()
         	crc32 = s.crc.Sum32()
        +	s.crc.Reset()
        +
         	return
         }
         
         // ReadRegularObject reads and write a non-deltified object
         // from it zlib stream in an object entry in the packfile.
         func (s *Scanner) copyObject(w io.Writer) (n int64, err error) {
        -	if s.zr == nil {
        -		var zr io.ReadCloser
        -		zr, err = zlib.NewReader(s.r)
        -		if err != nil {
        -			return 0, fmt.Errorf("zlib initialization error: %s", err)
        -		}
        +	zr := zlibReaderPool.Get().(io.ReadCloser)
        +	defer zlibReaderPool.Put(zr)
         
        -		s.zr = zr.(readerResetter)
        -	} else {
        -		if err = s.zr.Reset(s.r, nil); err != nil {
        -			return 0, fmt.Errorf("zlib reset error: %s", err)
        -		}
        +	if err = zr.(zlib.Resetter).Reset(s.r, nil); err != nil {
        +		return 0, fmt.Errorf("zlib reset error: %s", err)
         	}
         
        -	defer ioutil.CheckClose(s.zr, &err)
        +	defer ioutil.CheckClose(zr, &err)
         	buf := byteSlicePool.Get().([]byte)
        -	n, err = io.CopyBuffer(w, s.zr, buf)
        +	n, err = io.CopyBuffer(w, zr, buf)
         	byteSlicePool.Put(buf)
         	return
         }
        @@ -308,7 +346,7 @@ var byteSlicePool = sync.Pool{
         // SeekFromStart sets a new offset from start, returns the old position before
         // the change.
         func (s *Scanner) SeekFromStart(offset int64) (previous int64, err error) {
        -	// if seeking we assume that you are not interested on the header
        +	// if seeking we assume that you are not interested in the header
         	if s.version == 0 {
         		s.version = VersionSupported
         	}
        @@ -340,110 +378,89 @@ func (s *Scanner) Close() error {
         	return err
         }
         
        -// Flush finishes writing the buffer to crc hasher in case we are using
        -// a teeReader. Otherwise it is a no-op.
        +// Flush is a no-op (deprecated)
         func (s *Scanner) Flush() error {
        -	tee, ok := s.r.(*teeReader)
        -	if ok {
        -		return tee.Flush()
        -	}
         	return nil
         }
         
        -type trackableReader struct {
        -	count int64
        -	io.Reader
        -}
        -
        -// Read reads up to len(p) bytes into p.
        -func (r *trackableReader) Read(p []byte) (n int, err error) {
        -	n, err = r.Reader.Read(p)
        -	r.count += int64(n)
        -
        -	return
        -}
        -
        -// Seek only supports io.SeekCurrent, any other operation fails
        -func (r *trackableReader) Seek(offset int64, whence int) (int64, error) {
        -	if whence != io.SeekCurrent {
        -		return -1, ErrSeekNotSupported
        +// scannerReader has the following characteristics:
        +// - Provides an io.SeekReader impl for bufio.Reader, when the underlying
        +//   reader supports it.
        +// - Keeps track of the current read position, for when the underlying reader
        +//   isn't an io.SeekReader, but we still want to know the current offset.
        +// - Writes to the hash writer what it reads, with the aid of a smaller buffer.
        +//   The buffer helps avoid a performance penality for performing small writes
        +//   to the crc32 hash writer.
        +type scannerReader struct {
        +	reader io.Reader
        +	crc    io.Writer
        +	rbuf   *bufio.Reader
        +	wbuf   *bufio.Writer
        +	offset int64
        +}
        +
        +func newScannerReader(r io.Reader, h io.Writer) *scannerReader {
        +	sr := &scannerReader{
        +		rbuf: bufio.NewReader(nil),
        +		wbuf: bufio.NewWriterSize(nil, 64),
        +		crc:  h,
         	}
        +	sr.Reset(r)
         
        -	return r.count, nil
        -}
        -
        -func newByteReadSeeker(r io.ReadSeeker) *bufferedSeeker {
        -	return &bufferedSeeker{
        -		r:      r,
        -		Reader: *bufio.NewReader(r),
        -	}
        +	return sr
         }
         
        -type bufferedSeeker struct {
        -	r io.ReadSeeker
        -	bufio.Reader
        -}
        -
        -func (r *bufferedSeeker) Seek(offset int64, whence int) (int64, error) {
        -	if whence == io.SeekCurrent {
        -		current, err := r.r.Seek(offset, whence)
        -		if err != nil {
        -			return current, err
        -		}
        +func (r *scannerReader) Reset(reader io.Reader) {
        +	r.reader = reader
        +	r.rbuf.Reset(r.reader)
        +	r.wbuf.Reset(r.crc)
         
        -		return current - int64(r.Buffered()), nil
        +	r.offset = 0
        +	if seeker, ok := r.reader.(io.ReadSeeker); ok {
        +		r.offset, _ = seeker.Seek(0, io.SeekCurrent)
         	}
        -
        -	defer r.Reader.Reset(r.r)
        -	return r.r.Seek(offset, whence)
         }
         
        -type readerResetter interface {
        -	io.ReadCloser
        -	zlib.Resetter
        -}
        +func (r *scannerReader) Read(p []byte) (n int, err error) {
        +	n, err = r.rbuf.Read(p)
         
        -type reader interface {
        -	io.Reader
        -	io.ByteReader
        -	io.Seeker
        +	r.offset += int64(n)
        +	if _, err := r.wbuf.Write(p[:n]); err != nil {
        +		return n, err
        +	}
        +	return
         }
         
        -type teeReader struct {
        -	reader
        -	w         hash.Hash32
        -	bufWriter *bufio.Writer
        +func (r *scannerReader) ReadByte() (b byte, err error) {
        +	b, err = r.rbuf.ReadByte()
        +	if err == nil {
        +		r.offset++
        +		return b, r.wbuf.WriteByte(b)
        +	}
        +	return
         }
         
        -func newTeeReader(r reader, h hash.Hash32) *teeReader {
        -	return &teeReader{
        -		reader:    r,
        -		w:         h,
        -		bufWriter: bufio.NewWriter(h),
        -	}
        +func (r *scannerReader) Flush() error {
        +	return r.wbuf.Flush()
         }
         
        -func (r *teeReader) Read(p []byte) (n int, err error) {
        -	r.Flush()
        +// Seek seeks to a location. If the underlying reader is not an io.ReadSeeker,
        +// then only whence=io.SeekCurrent is supported, any other operation fails.
        +func (r *scannerReader) Seek(offset int64, whence int) (int64, error) {
        +	var err error
         
        -	n, err = r.reader.Read(p)
        -	if n > 0 {
        -		if n, err := r.w.Write(p[:n]); err != nil {
        -			return n, err
        +	if seeker, ok := r.reader.(io.ReadSeeker); !ok {
        +		if whence != io.SeekCurrent || offset != 0 {
        +			return -1, ErrSeekNotSupported
        +		}
        +	} else {
        +		if whence == io.SeekCurrent && offset == 0 {
        +			return r.offset, nil
         		}
        -	}
        -	return
        -}
         
        -func (r *teeReader) ReadByte() (b byte, err error) {
        -	b, err = r.reader.ReadByte()
        -	if err == nil {
        -		return b, r.bufWriter.WriteByte(b)
        +		r.offset, err = seeker.Seek(offset, whence)
        +		r.rbuf.Reset(r.reader)
         	}
         
        -	return
        -}
        -
        -func (r *teeReader) Flush() (err error) {
        -	return r.bufWriter.Flush()
        +	return r.offset, err
         }
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/commit.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/commit.go
        index e2543426a..6b5093405 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/commit.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/commit.go
        @@ -76,8 +76,8 @@ func (c *Commit) Tree() (*Tree, error) {
         	return GetTree(c.s, c.TreeHash)
         }
         
        -// Patch returns the Patch between the actual commit and the provided one.
        -// Error will be return if context expires. Provided context must be non-nil
        +// PatchContext returns the Patch between the actual commit and the provided one.
        +// Error will be return if context expires. Provided context must be non-nil.
         func (c *Commit) PatchContext(ctx context.Context, to *Commit) (*Patch, error) {
         	fromTree, err := c.Tree()
         	if err != nil {
        @@ -171,7 +171,9 @@ func (c *Commit) Decode(o plumbing.EncodedObject) (err error) {
         	}
         	defer ioutil.CheckClose(reader, &err)
         
        -	r := bufio.NewReader(reader)
        +	r := bufPool.Get().(*bufio.Reader)
        +	defer bufPool.Put(r)
        +	r.Reset(reader)
         
         	var message bool
         	var pgpsig bool
        @@ -233,6 +235,11 @@ func (b *Commit) Encode(o plumbing.EncodedObject) error {
         	return b.encode(o, true)
         }
         
        +// EncodeWithoutSignature export a Commit into a plumbing.EncodedObject without the signature (correspond to the payload of the PGP signature).
        +func (b *Commit) EncodeWithoutSignature(o plumbing.EncodedObject) error {
        +	return b.encode(o, false)
        +}
        +
         func (b *Commit) encode(o plumbing.EncodedObject, includeSig bool) (err error) {
         	o.SetType(plumbing.CommitObject)
         	w, err := o.Writer()
        @@ -291,25 +298,33 @@ func (b *Commit) encode(o plumbing.EncodedObject, includeSig bool) (err error) {
         	return err
         }
         
        -// Stats shows the status of commit.
        +// Stats returns the stats of a commit.
         func (c *Commit) Stats() (FileStats, error) {
        -	// Get the previous commit.
        -	ci := c.Parents()
        -	parentCommit, err := ci.Next()
        +	return c.StatsContext(context.Background())
        +}
        +
        +// StatsContext returns the stats of a commit. Error will be return if context
        +// expires. Provided context must be non-nil.
        +func (c *Commit) StatsContext(ctx context.Context) (FileStats, error) {
        +	fromTree, err := c.Tree()
         	if err != nil {
        -		if err == io.EOF {
        -			emptyNoder := treeNoder{}
        -			parentCommit = &Commit{
        -				Hash: emptyNoder.hash,
        -				// TreeHash: emptyNoder.parent.Hash,
        -				s: c.s,
        -			}
        -		} else {
        +		return nil, err
        +	}
        +
        +	toTree := &Tree{}
        +	if c.NumParents() != 0 {
        +		firstParent, err := c.Parents().Next()
        +		if err != nil {
        +			return nil, err
        +		}
        +
        +		toTree, err = firstParent.Tree()
        +		if err != nil {
         			return nil, err
         		}
         	}
         
        -	patch, err := parentCommit.Patch(c)
        +	patch, err := toTree.PatchContext(ctx, fromTree)
         	if err != nil {
         		return nil, err
         	}
        @@ -339,7 +354,7 @@ func (c *Commit) Verify(armoredKeyRing string) (*openpgp.Entity, error) {
         
         	encoded := &plumbing.MemoryObject{}
         	// Encode commit components, excluding signature and get a reader object.
        -	if err := c.encode(encoded, false); err != nil {
        +	if err := c.EncodeWithoutSignature(encoded); err != nil {
         		return nil, err
         	}
         	er, err := encoded.Reader()
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/commit_walker.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/commit_walker.go
        index 40ad2582b..0eff05912 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/commit_walker.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/commit_walker.go
        @@ -1,10 +1,12 @@
         package object
         
         import (
        +	"container/list"
         	"io"
         
         	"gopkg.in/src-d/go-git.v4/plumbing"
         	"gopkg.in/src-d/go-git.v4/plumbing/storer"
        +	"gopkg.in/src-d/go-git.v4/storage"
         )
         
         type commitPreIterator struct {
        @@ -181,3 +183,145 @@ func (w *commitPostIterator) ForEach(cb func(*Commit) error) error {
         }
         
         func (w *commitPostIterator) Close() {}
        +
        +// commitAllIterator stands for commit iterator for all refs.
        +type commitAllIterator struct {
        +	// currCommit points to the current commit.
        +	currCommit *list.Element
        +}
        +
        +// NewCommitAllIter returns a new commit iterator for all refs.
        +// repoStorer is a repo Storer used to get commits and references.
        +// commitIterFunc is a commit iterator function, used to iterate through ref commits in chosen order
        +func NewCommitAllIter(repoStorer storage.Storer, commitIterFunc func(*Commit) CommitIter) (CommitIter, error) {
        +	commitsPath := list.New()
        +	commitsLookup := make(map[plumbing.Hash]*list.Element)
        +	head, err := storer.ResolveReference(repoStorer, plumbing.HEAD)
        +	if err == nil {
        +		err = addReference(repoStorer, commitIterFunc, head, commitsPath, commitsLookup)
        +	}
        +
        +	if err != nil && err != plumbing.ErrReferenceNotFound {
        +		return nil, err
        +	}
        +
        +	// add all references along with the HEAD
        +	refIter, err := repoStorer.IterReferences()
        +	if err != nil {
        +		return nil, err
        +	}
        +	defer refIter.Close()
        +
        +	for {
        +		ref, err := refIter.Next()
        +		if err == io.EOF {
        +			break
        +		}
        +
        +		if err == plumbing.ErrReferenceNotFound {
        +			continue
        +		}
        +
        +		if err != nil {
        +			return nil, err
        +		}
        +
        +		if err = addReference(repoStorer, commitIterFunc, ref, commitsPath, commitsLookup); err != nil {
        +			return nil, err
        +		}
        +	}
        +
        +	return &commitAllIterator{commitsPath.Front()}, nil
        +}
        +
        +func addReference(
        +	repoStorer storage.Storer,
        +	commitIterFunc func(*Commit) CommitIter,
        +	ref *plumbing.Reference,
        +	commitsPath *list.List,
        +	commitsLookup map[plumbing.Hash]*list.Element) error {
        +
        +	_, exists := commitsLookup[ref.Hash()]
        +	if exists {
        +		// we already have it - skip the reference.
        +		return nil
        +	}
        +
        +	refCommit, _ := GetCommit(repoStorer, ref.Hash())
        +	if refCommit == nil {
        +		// if it's not a commit - skip it.
        +		return nil
        +	}
        +
        +	var (
        +		refCommits []*Commit
        +		parent     *list.Element
        +	)
        +	// collect all ref commits to add
        +	commitIter := commitIterFunc(refCommit)
        +	for c, e := commitIter.Next(); e == nil; {
        +		parent, exists = commitsLookup[c.Hash]
        +		if exists {
        +			break
        +		}
        +		refCommits = append(refCommits, c)
        +		c, e = commitIter.Next()
        +	}
        +	commitIter.Close()
        +
        +	if parent == nil {
        +		// common parent - not found
        +		// add all commits to the path from this ref (maybe it's a HEAD and we don't have anything, yet)
        +		for _, c := range refCommits {
        +			parent = commitsPath.PushBack(c)
        +			commitsLookup[c.Hash] = parent
        +		}
        +	} else {
        +		// add ref's commits to the path in reverse order (from the latest)
        +		for i := len(refCommits) - 1; i >= 0; i-- {
        +			c := refCommits[i]
        +			// insert before found common parent
        +			parent = commitsPath.InsertBefore(c, parent)
        +			commitsLookup[c.Hash] = parent
        +		}
        +	}
        +
        +	return nil
        +}
        +
        +func (it *commitAllIterator) Next() (*Commit, error) {
        +	if it.currCommit == nil {
        +		return nil, io.EOF
        +	}
        +
        +	c := it.currCommit.Value.(*Commit)
        +	it.currCommit = it.currCommit.Next()
        +
        +	return c, nil
        +}
        +
        +func (it *commitAllIterator) ForEach(cb func(*Commit) error) error {
        +	for {
        +		c, err := it.Next()
        +		if err == io.EOF {
        +			break
        +		}
        +		if err != nil {
        +			return err
        +		}
        +
        +		err = cb(c)
        +		if err == storer.ErrStop {
        +			break
        +		}
        +		if err != nil {
        +			return err
        +		}
        +	}
        +
        +	return nil
        +}
        +
        +func (it *commitAllIterator) Close() {
        +	it.currCommit = nil
        +}
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/commit_walker_bfs.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/commit_walker_bfs.go
        index aef1cf24c..dabfe75c2 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/commit_walker_bfs.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/commit_walker_bfs.go
        @@ -67,7 +67,7 @@ func (w *bfsCommitIterator) Next() (*Commit, error) {
         		for _, h := range c.ParentHashes {
         			err := w.appendHash(c.s, h)
         			if err != nil {
        -				return nil, nil
        +				return nil, err
         			}
         		}
         
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/commit_walker_bfs_filtered.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/commit_walker_bfs_filtered.go
        new file mode 100644
        index 000000000..b12523d48
        --- /dev/null
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/commit_walker_bfs_filtered.go
        @@ -0,0 +1,176 @@
        +package object
        +
        +import (
        +	"io"
        +
        +	"gopkg.in/src-d/go-git.v4/plumbing"
        +	"gopkg.in/src-d/go-git.v4/plumbing/storer"
        +)
        +
        +// NewFilterCommitIter returns a CommitIter that walks the commit history,
        +// starting at the passed commit and visiting its parents in Breadth-first order.
        +// The commits returned by the CommitIter will validate the passed CommitFilter.
        +// The history won't be transversed beyond a commit if isLimit is true for it.
        +// Each commit will be visited only once.
        +// If the commit history can not be traversed, or the Close() method is called,
        +// the CommitIter won't return more commits.
        +// If no isValid is passed, all ancestors of from commit will be valid.
        +// If no isLimit is limmit, all ancestors of all commits will be visited.
        +func NewFilterCommitIter(
        +	from *Commit,
        +	isValid *CommitFilter,
        +	isLimit *CommitFilter,
        +) CommitIter {
        +	var validFilter CommitFilter
        +	if isValid == nil {
        +		validFilter = func(_ *Commit) bool {
        +			return true
        +		}
        +	} else {
        +		validFilter = *isValid
        +	}
        +
        +	var limitFilter CommitFilter
        +	if isLimit == nil {
        +		limitFilter = func(_ *Commit) bool {
        +			return false
        +		}
        +	} else {
        +		limitFilter = *isLimit
        +	}
        +
        +	return &filterCommitIter{
        +		isValid: validFilter,
        +		isLimit: limitFilter,
        +		visited: map[plumbing.Hash]struct{}{},
        +		queue:   []*Commit{from},
        +	}
        +}
        +
        +// CommitFilter returns a boolean for the passed Commit
        +type CommitFilter func(*Commit) bool
        +
        +// filterCommitIter implments CommitIter
        +type filterCommitIter struct {
        +	isValid CommitFilter
        +	isLimit CommitFilter
        +	visited map[plumbing.Hash]struct{}
        +	queue   []*Commit
        +	lastErr error
        +}
        +
        +// Next returns the next commit of the CommitIter.
        +// It will return io.EOF if there are no more commits to visit,
        +// or an error if the history could not be traversed.
        +func (w *filterCommitIter) Next() (*Commit, error) {
        +	var commit *Commit
        +	var err error
        +	for {
        +		commit, err = w.popNewFromQueue()
        +		if err != nil {
        +			return nil, w.close(err)
        +		}
        +
        +		w.visited[commit.Hash] = struct{}{}
        +
        +		if !w.isLimit(commit) {
        +			err = w.addToQueue(commit.s, commit.ParentHashes...)
        +			if err != nil {
        +				return nil, w.close(err)
        +			}
        +		}
        +
        +		if w.isValid(commit) {
        +			return commit, nil
        +		}
        +	}
        +}
        +
        +// ForEach runs the passed callback over each Commit returned by the CommitIter
        +// until the callback returns an error or there is no more commits to traverse.
        +func (w *filterCommitIter) ForEach(cb func(*Commit) error) error {
        +	for {
        +		commit, err := w.Next()
        +		if err == io.EOF {
        +			break
        +		}
        +
        +		if err != nil {
        +			return err
        +		}
        +
        +		if err := cb(commit); err == storer.ErrStop {
        +			break
        +		} else if err != nil {
        +			return err
        +		}
        +	}
        +
        +	return nil
        +}
        +
        +// Error returns the error that caused that the CommitIter is no longer returning commits
        +func (w *filterCommitIter) Error() error {
        +	return w.lastErr
        +}
        +
        +// Close closes the CommitIter
        +func (w *filterCommitIter) Close() {
        +	w.visited = map[plumbing.Hash]struct{}{}
        +	w.queue = []*Commit{}
        +	w.isLimit = nil
        +	w.isValid = nil
        +}
        +
        +// close closes the CommitIter with an error
        +func (w *filterCommitIter) close(err error) error {
        +	w.Close()
        +	w.lastErr = err
        +	return err
        +}
        +
        +// popNewFromQueue returns the first new commit from the internal fifo queue,
        +// or an io.EOF error if the queue is empty
        +func (w *filterCommitIter) popNewFromQueue() (*Commit, error) {
        +	var first *Commit
        +	for {
        +		if len(w.queue) == 0 {
        +			if w.lastErr != nil {
        +				return nil, w.lastErr
        +			}
        +
        +			return nil, io.EOF
        +		}
        +
        +		first = w.queue[0]
        +		w.queue = w.queue[1:]
        +		if _, ok := w.visited[first.Hash]; ok {
        +			continue
        +		}
        +
        +		return first, nil
        +	}
        +}
        +
        +// addToQueue adds the passed commits to the internal fifo queue if they weren't seen
        +// or returns an error if the passed hashes could not be used to get valid commits
        +func (w *filterCommitIter) addToQueue(
        +	store storer.EncodedObjectStorer,
        +	hashes ...plumbing.Hash,
        +) error {
        +	for _, hash := range hashes {
        +		if _, ok := w.visited[hash]; ok {
        +			continue
        +		}
        +
        +		commit, err := GetCommit(store, hash)
        +		if err != nil {
        +			return err
        +		}
        +
        +		w.queue = append(w.queue, commit)
        +	}
        +
        +	return nil
        +}
        +
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/commit_walker_file.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/commit_walker_file.go
        new file mode 100644
        index 000000000..6f16e611f
        --- /dev/null
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/commit_walker_file.go
        @@ -0,0 +1,145 @@
        +package object
        +
        +import (
        +	"io"
        +
        +	"gopkg.in/src-d/go-git.v4/plumbing"
        +
        +	"gopkg.in/src-d/go-git.v4/plumbing/storer"
        +)
        +
        +type commitFileIter struct {
        +	fileName      string
        +	sourceIter    CommitIter
        +	currentCommit *Commit
        +	checkParent   bool
        +}
        +
        +// NewCommitFileIterFromIter returns a commit iterator which performs diffTree between
        +// successive trees returned from the commit iterator from the argument. The purpose of this is
        +// to find the commits that explain how the files that match the path came to be.
        +// If checkParent is true then the function double checks if potential parent (next commit in a path)
        +// is one of the parents in the tree (it's used by `git log --all`).
        +func NewCommitFileIterFromIter(fileName string, commitIter CommitIter, checkParent bool) CommitIter {
        +	iterator := new(commitFileIter)
        +	iterator.sourceIter = commitIter
        +	iterator.fileName = fileName
        +	iterator.checkParent = checkParent
        +	return iterator
        +}
        +
        +func (c *commitFileIter) Next() (*Commit, error) {
        +	if c.currentCommit == nil {
        +		var err error
        +		c.currentCommit, err = c.sourceIter.Next()
        +		if err != nil {
        +			return nil, err
        +		}
        +	}
        +	commit, commitErr := c.getNextFileCommit()
        +
        +	// Setting current-commit to nil to prevent unwanted states when errors are raised
        +	if commitErr != nil {
        +		c.currentCommit = nil
        +	}
        +	return commit, commitErr
        +}
        +
        +func (c *commitFileIter) getNextFileCommit() (*Commit, error) {
        +	for {
        +		// Parent-commit can be nil if the current-commit is the initial commit
        +		parentCommit, parentCommitErr := c.sourceIter.Next()
        +		if parentCommitErr != nil {
        +			// If the parent-commit is beyond the initial commit, keep it nil
        +			if parentCommitErr != io.EOF {
        +				return nil, parentCommitErr
        +			}
        +			parentCommit = nil
        +		}
        +
        +		// Fetch the trees of the current and parent commits
        +		currentTree, currTreeErr := c.currentCommit.Tree()
        +		if currTreeErr != nil {
        +			return nil, currTreeErr
        +		}
        +
        +		var parentTree *Tree
        +		if parentCommit != nil {
        +			var parentTreeErr error
        +			parentTree, parentTreeErr = parentCommit.Tree()
        +			if parentTreeErr != nil {
        +				return nil, parentTreeErr
        +			}
        +		}
        +
        +		// Find diff between current and parent trees
        +		changes, diffErr := DiffTree(currentTree, parentTree)
        +		if diffErr != nil {
        +			return nil, diffErr
        +		}
        +
        +		found := c.hasFileChange(changes, parentCommit)
        +
        +		// Storing the current-commit in-case a change is found, and
        +		// Updating the current-commit for the next-iteration
        +		prevCommit := c.currentCommit
        +		c.currentCommit = parentCommit
        +
        +		if found {
        +			return prevCommit, nil
        +		}
        +
        +		// If not matches found and if parent-commit is beyond the initial commit, then return with EOF
        +		if parentCommit == nil {
        +			return nil, io.EOF
        +		}
        +	}
        +}
        +
        +func (c *commitFileIter) hasFileChange(changes Changes, parent *Commit) bool {
        +	for _, change := range changes {
        +		if change.name() != c.fileName {
        +			continue
        +		}
        +
        +		// filename matches, now check if source iterator contains all commits (from all refs)
        +		if c.checkParent {
        +			if parent != nil && isParentHash(parent.Hash, c.currentCommit) {
        +				return true
        +			}
        +			continue
        +		}
        +
        +		return true
        +	}
        +
        +	return false
        +}
        +
        +func isParentHash(hash plumbing.Hash, commit *Commit) bool {
        +	for _, h := range commit.ParentHashes {
        +		if h == hash {
        +			return true
        +		}
        +	}
        +	return false
        +}
        +
        +func (c *commitFileIter) ForEach(cb func(*Commit) error) error {
        +	for {
        +		commit, nextErr := c.Next()
        +		if nextErr != nil {
        +			return nextErr
        +		}
        +		err := cb(commit)
        +		if err == storer.ErrStop {
        +			return nil
        +		} else if err != nil {
        +			return err
        +		}
        +	}
        +}
        +
        +func (c *commitFileIter) Close() {
        +	c.sourceIter.Close()
        +}
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/common.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/common.go
        new file mode 100644
        index 000000000..3591f5f0a
        --- /dev/null
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/common.go
        @@ -0,0 +1,12 @@
        +package object
        +
        +import (
        +	"bufio"
        +	"sync"
        +)
        +
        +var bufPool = sync.Pool{
        +	New: func() interface{} {
        +		return bufio.NewReader(nil)
        +	},
        +}
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/merge_base.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/merge_base.go
        new file mode 100644
        index 000000000..6f2568dbc
        --- /dev/null
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/merge_base.go
        @@ -0,0 +1,210 @@
        +package object
        +
        +import (
        +	"fmt"
        +	"sort"
        +
        +	"gopkg.in/src-d/go-git.v4/plumbing"
        +	"gopkg.in/src-d/go-git.v4/plumbing/storer"
        +)
        +
        +// errIsReachable is thrown when first commit is an ancestor of the second
        +var errIsReachable = fmt.Errorf("first is reachable from second")
        +
        +// MergeBase mimics the behavior of `git merge-base actual other`, returning the
        +// best common ancestor between the actual and the passed one.
        +// The best common ancestors can not be reached from other common ancestors.
        +func (c *Commit) MergeBase(other *Commit) ([]*Commit, error) {
        +	// use sortedByCommitDateDesc strategy
        +	sorted := sortByCommitDateDesc(c, other)
        +	newer := sorted[0]
        +	older := sorted[1]
        +
        +	newerHistory, err := ancestorsIndex(older, newer)
        +	if err == errIsReachable {
        +		return []*Commit{older}, nil
        +	}
        +
        +	if err != nil {
        +		return nil, err
        +	}
        +
        +	var res []*Commit
        +	inNewerHistory := isInIndexCommitFilter(newerHistory)
        +	resIter := NewFilterCommitIter(older, &inNewerHistory, &inNewerHistory)
        +	_ = resIter.ForEach(func(commit *Commit) error {
        +		res = append(res, commit)
        +		return nil
        +	})
        +
        +	return Independents(res)
        +}
        +
        +// IsAncestor returns true if the actual commit is ancestor of the passed one.
        +// It returns an error if the history is not transversable
        +// It mimics the behavior of `git merge --is-ancestor actual other`
        +func (c *Commit) IsAncestor(other *Commit) (bool, error) {
        +	found := false
        +	iter := NewCommitPreorderIter(other, nil, nil)
        +	err := iter.ForEach(func(comm *Commit) error {
        +		if comm.Hash != c.Hash {
        +			return nil
        +		}
        +
        +		found = true
        +		return storer.ErrStop
        +	})
        +
        +	return found, err
        +}
        +
        +// ancestorsIndex returns a map with the ancestors of the starting commit if the
        +// excluded one is not one of them. It returns errIsReachable if the excluded commit
        +// is ancestor of the starting, or another error if the history is not traversable.
        +func ancestorsIndex(excluded, starting *Commit) (map[plumbing.Hash]struct{}, error) {
        +	if excluded.Hash.String() == starting.Hash.String() {
        +		return nil, errIsReachable
        +	}
        +
        +	startingHistory := map[plumbing.Hash]struct{}{}
        +	startingIter := NewCommitIterBSF(starting, nil, nil)
        +	err := startingIter.ForEach(func(commit *Commit) error {
        +		if commit.Hash == excluded.Hash {
        +			return errIsReachable
        +		}
        +
        +		startingHistory[commit.Hash] = struct{}{}
        +		return nil
        +	})
        +
        +	if err != nil {
        +		return nil, err
        +	}
        +
        +	return startingHistory, nil
        +}
        +
        +// Independents returns a subset of the passed commits, that are not reachable the others
        +// It mimics the behavior of `git merge-base --independent commit...`.
        +func Independents(commits []*Commit) ([]*Commit, error) {
        +	// use sortedByCommitDateDesc strategy
        +	candidates := sortByCommitDateDesc(commits...)
        +	candidates = removeDuplicated(candidates)
        +
        +	seen := map[plumbing.Hash]struct{}{}
        +	var isLimit CommitFilter = func(commit *Commit) bool {
        +		_, ok := seen[commit.Hash]
        +		return ok
        +	}
        +
        +	if len(candidates) < 2 {
        +		return candidates, nil
        +	}
        +
        +	pos := 0
        +	for {
        +		from := candidates[pos]
        +		others := remove(candidates, from)
        +		fromHistoryIter := NewFilterCommitIter(from, nil, &isLimit)
        +		err := fromHistoryIter.ForEach(func(fromAncestor *Commit) error {
        +			for _, other := range others {
        +				if fromAncestor.Hash == other.Hash {
        +					candidates = remove(candidates, other)
        +					others = remove(others, other)
        +				}
        +			}
        +
        +			if len(candidates) == 1 {
        +				return storer.ErrStop
        +			}
        +
        +			seen[fromAncestor.Hash] = struct{}{}
        +			return nil
        +		})
        +
        +		if err != nil {
        +			return nil, err
        +		}
        +
        +		nextPos := indexOf(candidates, from) + 1
        +		if nextPos >= len(candidates) {
        +			break
        +		}
        +
        +		pos = nextPos
        +	}
        +
        +	return candidates, nil
        +}
        +
        +// sortByCommitDateDesc returns the passed commits, sorted by `committer.When desc`
        +//
        +// Following this strategy, it is tried to reduce the time needed when walking
        +// the history from one commit to reach the others. It is assumed that ancestors
        +// use to be committed before its descendant;
        +// That way `Independents(A^, A)` will be processed as being `Independents(A, A^)`;
        +// so starting by `A` it will be reached `A^` way sooner than walking from `A^`
        +// to the initial commit, and then from `A` to `A^`.
        +func sortByCommitDateDesc(commits ...*Commit) []*Commit {
        +	sorted := make([]*Commit, len(commits))
        +	copy(sorted, commits)
        +	sort.Slice(sorted, func(i, j int) bool {
        +		return sorted[i].Committer.When.After(sorted[j].Committer.When)
        +	})
        +
        +	return sorted
        +}
        +
        +// indexOf returns the first position where target was found in the passed commits
        +func indexOf(commits []*Commit, target *Commit) int {
        +	for i, commit := range commits {
        +		if target.Hash == commit.Hash {
        +			return i
        +		}
        +	}
        +
        +	return -1
        +}
        +
        +// remove returns the passed commits excluding the commit toDelete
        +func remove(commits []*Commit, toDelete *Commit) []*Commit {
        +	res := make([]*Commit, len(commits))
        +	j := 0
        +	for _, commit := range commits {
        +		if commit.Hash == toDelete.Hash {
        +			continue
        +		}
        +
        +		res[j] = commit
        +		j++
        +	}
        +
        +	return res[:j]
        +}
        +
        +// removeDuplicated removes duplicated commits from the passed slice of commits
        +func removeDuplicated(commits []*Commit) []*Commit {
        +	seen := make(map[plumbing.Hash]struct{}, len(commits))
        +	res := make([]*Commit, len(commits))
        +	j := 0
        +	for _, commit := range commits {
        +		if _, ok := seen[commit.Hash]; ok {
        +			continue
        +		}
        +
        +		seen[commit.Hash] = struct{}{}
        +		res[j] = commit
        +		j++
        +	}
        +
        +	return res[:j]
        +}
        +
        +// isInIndexCommitFilter returns a commitFilter that returns true
        +// if the commit is in the passed index.
        +func isInIndexCommitFilter(index map[plumbing.Hash]struct{}) CommitFilter {
        +	return func(c *Commit) bool {
        +		_, ok := index[c.Hash]
        +		return ok
        +	}
        +}
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/patch.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/patch.go
        index adeaccb0a..32454ac48 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/patch.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/patch.go
        @@ -278,7 +278,7 @@ func printStat(fileStats []FileStat) string {
         	var scaleFactor float64
         	if longestTotalChange > heightOfHistogram {
         		// Scale down to heightOfHistogram.
        -		scaleFactor = float64(longestTotalChange / heightOfHistogram)
        +		scaleFactor = longestTotalChange / heightOfHistogram
         	} else {
         		scaleFactor = 1.0
         	}
        @@ -320,11 +320,22 @@ func getFileStatsFromFilePatches(filePatches []fdiff.FilePatch) FileStats {
         		}
         
         		for _, chunk := range fp.Chunks() {
        +			s := chunk.Content()
        +			if len(s) == 0 {
        +				continue
        +			}
        +
         			switch chunk.Type() {
         			case fdiff.Add:
        -				cs.Addition += strings.Count(chunk.Content(), "\n")
        +				cs.Addition += strings.Count(s, "\n")
        +				if s[len(s)-1] != '\n' {
        +					cs.Addition++
        +				}
         			case fdiff.Delete:
        -				cs.Deletion += strings.Count(chunk.Content(), "\n")
        +				cs.Deletion += strings.Count(s, "\n")
        +				if s[len(s)-1] != '\n' {
        +					cs.Deletion++
        +				}
         			}
         		}
         
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/tag.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/tag.go
        index 905206bda..9ee550925 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/tag.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/tag.go
        @@ -93,7 +93,9 @@ func (t *Tag) Decode(o plumbing.EncodedObject) (err error) {
         	}
         	defer ioutil.CheckClose(reader, &err)
         
        -	r := bufio.NewReader(reader)
        +	r := bufPool.Get().(*bufio.Reader)
        +	defer bufPool.Put(r)
        +	r.Reset(reader)
         	for {
         		var line []byte
         		line, err = r.ReadBytes('\n')
        @@ -141,7 +143,7 @@ func (t *Tag) Decode(o plumbing.EncodedObject) (err error) {
         			if pgpsig {
         				if bytes.Contains(l, []byte(endpgp)) {
         					t.PGPSignature += endpgp + "\n"
        -					pgpsig = false
        +					break
         				} else {
         					t.PGPSignature += string(l) + "\n"
         				}
        @@ -169,6 +171,11 @@ func (t *Tag) Encode(o plumbing.EncodedObject) error {
         	return t.encode(o, true)
         }
         
        +// EncodeWithoutSignature export a Tag into a plumbing.EncodedObject without the signature (correspond to the payload of the PGP signature).
        +func (t *Tag) EncodeWithoutSignature(o plumbing.EncodedObject) error {
        +	return t.encode(o, false)
        +}
        +
         func (t *Tag) encode(o plumbing.EncodedObject, includeSig bool) (err error) {
         	o.SetType(plumbing.TagObject)
         	w, err := o.Writer()
        @@ -195,13 +202,14 @@ func (t *Tag) encode(o plumbing.EncodedObject, includeSig bool) (err error) {
         		return err
         	}
         
        -	if t.PGPSignature != "" && includeSig {
        -		// Split all the signature lines and write with a newline at the end.
        -		lines := strings.Split(t.PGPSignature, "\n")
        -		for _, line := range lines {
        -			if _, err = fmt.Fprintf(w, "%s\n", line); err != nil {
        -				return err
        -			}
        +	// Note that this is highly sensitive to what it sent along in the message.
        +	// Message *always* needs to end with a newline, or else the message and the
        +	// signature will be concatenated into a corrupt object. Since this is a
        +	// lower-level method, we assume you know what you are doing and have already
        +	// done the needful on the message in the caller.
        +	if includeSig {
        +		if _, err = fmt.Fprint(w, t.PGPSignature); err != nil {
        +			return err
         		}
         	}
         
        @@ -288,7 +296,7 @@ func (t *Tag) Verify(armoredKeyRing string) (*openpgp.Entity, error) {
         
         	encoded := &plumbing.MemoryObject{}
         	// Encode tag components, excluding signature and get a reader object.
        -	if err := t.encode(encoded, false); err != nil {
        +	if err := t.EncodeWithoutSignature(encoded); err != nil {
         		return nil, err
         	}
         	er, err := encoded.Reader()
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/tree.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/tree.go
        index c36a1370f..d0b4fff15 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/tree.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/object/tree.go
        @@ -87,6 +87,17 @@ func (t *Tree) File(path string) (*File, error) {
         	return NewFile(path, e.Mode, blob), nil
         }
         
        +// Size returns the plaintext size of an object, without reading it
        +// into memory.
        +func (t *Tree) Size(path string) (int64, error) {
        +	e, err := t.FindEntry(path)
        +	if err != nil {
        +		return 0, ErrEntryNotFound
        +	}
        +
        +	return t.s.EncodedObjectSize(e.Hash)
        +}
        +
         // Tree returns the tree identified by the `path` argument.
         // The path is interpreted as relative to the tree receiver.
         func (t *Tree) Tree(path string) (*Tree, error) {
        @@ -124,7 +135,7 @@ func (t *Tree) FindEntry(path string) (*TreeEntry, error) {
         	pathCurrent := ""
         
         	// search for the longest path in the tree path cache
        -	for i := len(pathParts); i > 1; i-- {
        +	for i := len(pathParts) - 1; i > 1; i-- {
         		path := filepath.Join(pathParts[:i]...)
         
         		tree, ok := t.t[path]
        @@ -219,7 +230,9 @@ func (t *Tree) Decode(o plumbing.EncodedObject) (err error) {
         	}
         	defer ioutil.CheckClose(reader, &err)
         
        -	r := bufio.NewReader(reader)
        +	r := bufPool.Get().(*bufio.Reader)
        +	defer bufPool.Put(r)
        +	r.Reset(reader)
         	for {
         		str, err := r.ReadString(' ')
         		if err != nil {
        @@ -275,7 +288,7 @@ func (t *Tree) Encode(o plumbing.EncodedObject) (err error) {
         			return err
         		}
         
        -		if _, err = w.Write([]byte(entry.Hash[:])); err != nil {
        +		if _, err = w.Write(entry.Hash[:]); err != nil {
         			return err
         		}
         	}
        @@ -372,7 +385,7 @@ func NewTreeWalker(t *Tree, recursive bool, seen map[plumbing.Hash]bool) *TreeWa
         // underlying repository will be skipped automatically. It is possible that this
         // may change in future versions.
         func (w *TreeWalker) Next() (name string, entry TreeEntry, err error) {
        -	var obj Object
        +	var obj *Tree
         	for {
         		current := len(w.stack) - 1
         		if current < 0 {
        @@ -392,7 +405,7 @@ func (w *TreeWalker) Next() (name string, entry TreeEntry, err error) {
         			// Finished with the current tree, move back up to the parent
         			w.stack = w.stack[:current]
         			w.base, _ = path.Split(w.base)
        -			w.base = path.Clean(w.base) // Remove trailing slash
        +			w.base = strings.TrimSuffix(w.base, "/")
         			continue
         		}
         
        @@ -408,7 +421,7 @@ func (w *TreeWalker) Next() (name string, entry TreeEntry, err error) {
         			obj, err = GetTree(w.s, entry.Hash)
         		}
         
        -		name = path.Join(w.base, entry.Name)
        +		name = simpleJoin(w.base, entry.Name)
         
         		if err != nil {
         			err = io.EOF
        @@ -422,9 +435,9 @@ func (w *TreeWalker) Next() (name string, entry TreeEntry, err error) {
         		return
         	}
         
        -	if t, ok := obj.(*Tree); ok {
        -		w.stack = append(w.stack, &treeEntryIter{t, 0})
        -		w.base = path.Join(w.base, entry.Name)
        +	if obj != nil {
        +		w.stack = append(w.stack, &treeEntryIter{obj, 0})
        +		w.base = simpleJoin(w.base, entry.Name)
         	}
         
         	return
        @@ -498,3 +511,10 @@ func (iter *TreeIter) ForEach(cb func(*Tree) error) error {
         		return cb(t)
         	})
         }
        +
        +func simpleJoin(parent, child string) string {
        +	if len(parent) > 0 {
        +		return parent + "/" + child
        +	}
        +	return child
        +}
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/advrefs.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/advrefs.go
        index 684e76a56..487ee19bd 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/advrefs.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/advrefs.go
        @@ -107,7 +107,7 @@ func (a *AdvRefs) resolveHead(s storer.ReferenceStorer) error {
         		return nil
         	}
         
        -	ref, err := s.Reference(plumbing.ReferenceName(plumbing.Master))
        +	ref, err := s.Reference(plumbing.Master)
         
         	// check first if HEAD is pointing to master
         	if err == nil {
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/updreq_decode.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/updreq_decode.go
        index c15d49cfb..51e8183d1 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/updreq_decode.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/updreq_decode.go
        @@ -225,7 +225,7 @@ func parseCommand(b []byte) (*Command, error) {
         		return nil, errInvalidNewObjId(err)
         	}
         
        -	return &Command{Old: oh, New: nh, Name: plumbing.ReferenceName(n)}, nil
        +	return &Command{Old: oh, New: nh, Name: n}, nil
         }
         
         func parseHash(s string) (plumbing.Hash, error) {
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/reference.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/reference.go
        index 2f53d4e6c..08e908f1f 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/reference.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/reference.go
        @@ -55,6 +55,36 @@ func (r ReferenceType) String() string {
         // ReferenceName reference name's
         type ReferenceName string
         
        +// NewBranchReferenceName returns a reference name describing a branch based on
        +// his short name.
        +func NewBranchReferenceName(name string) ReferenceName {
        +	return ReferenceName(refHeadPrefix + name)
        +}
        +
        +// NewNoteReferenceName returns a reference name describing a note based on his
        +// short name.
        +func NewNoteReferenceName(name string) ReferenceName {
        +	return ReferenceName(refNotePrefix + name)
        +}
        +
        +// NewRemoteReferenceName returns a reference name describing a remote branch
        +// based on his short name and the remote name.
        +func NewRemoteReferenceName(remote, name string) ReferenceName {
        +	return ReferenceName(refRemotePrefix + fmt.Sprintf("%s/%s", remote, name))
        +}
        +
        +// NewRemoteHEADReferenceName returns a reference name describing a the HEAD
        +// branch of a remote.
        +func NewRemoteHEADReferenceName(remote string) ReferenceName {
        +	return ReferenceName(refRemotePrefix + fmt.Sprintf("%s/%s", remote, HEAD))
        +}
        +
        +// NewTagReferenceName returns a reference name describing a tag based on short
        +// his name.
        +func NewTagReferenceName(name string) ReferenceName {
        +	return ReferenceName(refTagPrefix + name)
        +}
        +
         // IsBranch check if a reference is a branch
         func (r ReferenceName) IsBranch() bool {
         	return strings.HasPrefix(string(r), refHeadPrefix)
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/revlist/revlist.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/revlist/revlist.go
        index 0a9d1e812..7ad71ac04 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/revlist/revlist.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/revlist/revlist.go
        @@ -21,7 +21,20 @@ func Objects(
         	objs,
         	ignore []plumbing.Hash,
         ) ([]plumbing.Hash, error) {
        -	ignore, err := objects(s, ignore, nil, true)
        +	return ObjectsWithStorageForIgnores(s, s, objs, ignore)
        +}
        +
        +// ObjectsWithStorageForIgnores is the same as Objects, but a
        +// secondary storage layer can be provided, to be used to finding the
        +// full set of objects to be ignored while finding the reachable
        +// objects.  This is useful when the main `s` storage layer is slow
        +// and/or remote, while the ignore list is available somewhere local.
        +func ObjectsWithStorageForIgnores(
        +	s, ignoreStore storer.EncodedObjectStorer,
        +	objs,
        +	ignore []plumbing.Hash,
        +) ([]plumbing.Hash, error) {
        +	ignore, err := objects(ignoreStore, ignore, nil, true)
         	if err != nil {
         		return nil, err
         	}
        @@ -114,7 +127,6 @@ func reachableObjects(
         	i := object.NewCommitPreorderIter(commit, seen, ignore)
         	pending := make(map[plumbing.Hash]bool)
         	addPendingParents(pending, visited, commit)
        -
         	for {
         		commit, err := i.Next()
         		if err == io.EOF {
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/storer/object.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/storer/object.go
        index 92aa62918..98d1ec3fe 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/storer/object.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/storer/object.go
        @@ -40,6 +40,8 @@ type EncodedObjectStorer interface {
         	// HasEncodedObject returns ErrObjNotFound if the object doesn't
         	// exist.  If the object does exist, it returns nil.
         	HasEncodedObject(plumbing.Hash) error
        +	// EncodedObjectSize returns the plaintext size of the encoded object.
        +	EncodedObjectSize(plumbing.Hash) (int64, error)
         }
         
         // DeltaObjectStorer is an EncodedObjectStorer that can return delta
        @@ -220,7 +222,7 @@ type MultiEncodedObjectIter struct {
         }
         
         // NewMultiEncodedObjectIter returns an object iterator for the given slice of
        -// objects.
        +// EncodedObjectIters.
         func NewMultiEncodedObjectIter(iters []EncodedObjectIter) EncodedObjectIter {
         	return &MultiEncodedObjectIter{iters: iters}
         }
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/storer/reference.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/storer/reference.go
        index 5e85a3be4..cce72b4aa 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/storer/reference.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/storer/reference.go
        @@ -131,9 +131,27 @@ func (iter *ReferenceSliceIter) Next() (*plumbing.Reference, error) {
         // an error happens or the end of the iter is reached. If ErrStop is sent
         // the iteration is stop but no error is returned. The iterator is closed.
         func (iter *ReferenceSliceIter) ForEach(cb func(*plumbing.Reference) error) error {
        +	return forEachReferenceIter(iter, cb)
        +}
        +
        +type bareReferenceIterator interface {
        +	Next() (*plumbing.Reference, error)
        +	Close()
        +}
        +
        +func forEachReferenceIter(iter bareReferenceIterator, cb func(*plumbing.Reference) error) error {
         	defer iter.Close()
        -	for _, r := range iter.series {
        -		if err := cb(r); err != nil {
        +	for {
        +		obj, err := iter.Next()
        +		if err != nil {
        +			if err == io.EOF {
        +				return nil
        +			}
        +
        +			return err
        +		}
        +
        +		if err := cb(obj); err != nil {
         			if err == ErrStop {
         				return nil
         			}
        @@ -141,8 +159,6 @@ func (iter *ReferenceSliceIter) ForEach(cb func(*plumbing.Reference) error) erro
         			return err
         		}
         	}
        -
        -	return nil
         }
         
         // Close releases any resources used by the iterator.
        @@ -150,6 +166,52 @@ func (iter *ReferenceSliceIter) Close() {
         	iter.pos = len(iter.series)
         }
         
        +// MultiReferenceIter implements ReferenceIter. It iterates over several
        +// ReferenceIter,
        +//
        +// The MultiReferenceIter must be closed with a call to Close() when it is no
        +// longer needed.
        +type MultiReferenceIter struct {
        +	iters []ReferenceIter
        +}
        +
        +// NewMultiReferenceIter returns an reference iterator for the given slice of
        +// EncodedObjectIters.
        +func NewMultiReferenceIter(iters []ReferenceIter) ReferenceIter {
        +	return &MultiReferenceIter{iters: iters}
        +}
        +
        +// Next returns the next reference from the iterator, if one iterator reach
        +// io.EOF is removed and the next one is used.
        +func (iter *MultiReferenceIter) Next() (*plumbing.Reference, error) {
        +	if len(iter.iters) == 0 {
        +		return nil, io.EOF
        +	}
        +
        +	obj, err := iter.iters[0].Next()
        +	if err == io.EOF {
        +		iter.iters[0].Close()
        +		iter.iters = iter.iters[1:]
        +		return iter.Next()
        +	}
        +
        +	return obj, err
        +}
        +
        +// ForEach call the cb function for each reference contained on this iter until
        +// an error happens or the end of the iter is reached. If ErrStop is sent
        +// the iteration is stop but no error is returned. The iterator is closed.
        +func (iter *MultiReferenceIter) ForEach(cb func(*plumbing.Reference) error) error {
        +	return forEachReferenceIter(iter, cb)
        +}
        +
        +// Close releases any resources used by the iterator.
        +func (iter *MultiReferenceIter) Close() {
        +	for _, i := range iter.iters {
        +		i.Close()
        +	}
        +}
        +
         // ResolveReference resolves a SymbolicReference to a HashReference.
         func ResolveReference(s ReferenceStorer, n plumbing.ReferenceName) (*plumbing.Reference, error) {
         	r, err := s.Reference(n)
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/common.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/common.go
        index f7b882b8b..dcf9391d5 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/common.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/common.go
        @@ -19,10 +19,10 @@ import (
         	"fmt"
         	"io"
         	"net/url"
        -	"regexp"
         	"strconv"
         	"strings"
         
        +	giturl "gopkg.in/src-d/go-git.v4/internal/url"
         	"gopkg.in/src-d/go-git.v4/plumbing"
         	"gopkg.in/src-d/go-git.v4/plumbing/protocol/packp"
         	"gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/capability"
        @@ -224,34 +224,28 @@ func getPath(u *url.URL) string {
         	return res
         }
         
        -var (
        -	isSchemeRegExp   = regexp.MustCompile(`^[^:]+://`)
        -	scpLikeUrlRegExp = regexp.MustCompile(`^(?:(?P[^@]+)@)?(?P[^:\s]+):(?:(?P[0-9]{1,5})/)?(?P[^\\].*)$`)
        -)
        -
         func parseSCPLike(endpoint string) (*Endpoint, bool) {
        -	if isSchemeRegExp.MatchString(endpoint) || !scpLikeUrlRegExp.MatchString(endpoint) {
        +	if giturl.MatchesScheme(endpoint) || !giturl.MatchesScpLike(endpoint) {
         		return nil, false
         	}
         
        -	m := scpLikeUrlRegExp.FindStringSubmatch(endpoint)
        -
        -	port, err := strconv.Atoi(m[3])
        +	user, host, portStr, path := giturl.FindScpLikeComponents(endpoint)
        +	port, err := strconv.Atoi(portStr)
         	if err != nil {
         		port = 22
         	}
         
         	return &Endpoint{
         		Protocol: "ssh",
        -		User:     m[1],
        -		Host:     m[2],
        +		User:     user,
        +		Host:     host,
         		Port:     port,
        -		Path:     m[4],
        +		Path:     path,
         	}, true
         }
         
         func parseFile(endpoint string) (*Endpoint, bool) {
        -	if isSchemeRegExp.MatchString(endpoint) {
        +	if giturl.MatchesScheme(endpoint) {
         		return nil, false
         	}
         
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/http/common.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/http/common.go
        index c03484646..38e903d45 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/http/common.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/http/common.go
        @@ -4,6 +4,7 @@ package http
         import (
         	"bytes"
         	"fmt"
        +	"net"
         	"net/http"
         	"strconv"
         	"strings"
        @@ -138,7 +139,7 @@ func (s *session) ApplyAuthToRequest(req *http.Request) {
         		return
         	}
         
        -	s.auth.setAuth(req)
        +	s.auth.SetAuth(req)
         }
         
         func (s *session) ModifyEndpointIfRedirect(res *http.Response) {
        @@ -151,6 +152,18 @@ func (s *session) ModifyEndpointIfRedirect(res *http.Response) {
         		return
         	}
         
        +	h, p, err := net.SplitHostPort(r.URL.Host)
        +	if err != nil {
        +		h = r.URL.Host
        +	}
        +	if p != "" {
        +		port, err := strconv.Atoi(p)
        +		if err == nil {
        +			s.endpoint.Port = port
        +		}
        +	}
        +	s.endpoint.Host = h
        +
         	s.endpoint.Protocol = r.URL.Scheme
         	s.endpoint.Path = r.URL.Path[:len(r.URL.Path)-len(infoRefsPath)]
         }
        @@ -162,7 +175,7 @@ func (*session) Close() error {
         // AuthMethod is concrete implementation of common.AuthMethod for HTTP services
         type AuthMethod interface {
         	transport.AuthMethod
        -	setAuth(r *http.Request)
        +	SetAuth(r *http.Request)
         }
         
         func basicAuthFromEndpoint(ep *transport.Endpoint) *BasicAuth {
        @@ -179,7 +192,7 @@ type BasicAuth struct {
         	Username, Password string
         }
         
        -func (a *BasicAuth) setAuth(r *http.Request) {
        +func (a *BasicAuth) SetAuth(r *http.Request) {
         	if a == nil {
         		return
         	}
        @@ -201,12 +214,19 @@ func (a *BasicAuth) String() string {
         	return fmt.Sprintf("%s - %s:%s", a.Name(), a.Username, masked)
         }
         
        -// TokenAuth implements the go-git http.AuthMethod and transport.AuthMethod interfaces
        +// TokenAuth implements an http.AuthMethod that can be used with http transport
        +// to authenticate with HTTP token authentication (also known as bearer
        +// authentication).
        +//
        +// IMPORTANT: If you are looking to use OAuth tokens with popular servers (e.g.
        +// GitHub, Bitbucket, GitLab) you should use BasicAuth instead. These servers
        +// use basic HTTP authentication, with the OAuth token as user or password.
        +// Check the documentation of your git server for details.
         type TokenAuth struct {
         	Token string
         }
         
        -func (a *TokenAuth) setAuth(r *http.Request) {
        +func (a *TokenAuth) SetAuth(r *http.Request) {
         	if a == nil {
         		return
         	}
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/server/loader.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/server/loader.go
        index c83752c25..13b35262d 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/server/loader.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/server/loader.go
        @@ -1,6 +1,7 @@
         package server
         
         import (
        +	"gopkg.in/src-d/go-git.v4/plumbing/cache"
         	"gopkg.in/src-d/go-git.v4/plumbing/storer"
         	"gopkg.in/src-d/go-git.v4/plumbing/transport"
         	"gopkg.in/src-d/go-git.v4/storage/filesystem"
        @@ -43,7 +44,7 @@ func (l *fsLoader) Load(ep *transport.Endpoint) (storer.Storer, error) {
         		return nil, transport.ErrRepositoryNotFound
         	}
         
        -	return filesystem.NewStorage(fs)
        +	return filesystem.NewStorage(fs, cache.NewObjectLRUDefault()), nil
         }
         
         // MapLoader is a Loader that uses a lookup map of storer.Storer by
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/server/server.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/server/server.go
        index 20bd12e21..8e0dcc119 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/server/server.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/server/server.go
        @@ -286,11 +286,6 @@ func (s *rpSession) updateReferences(req *packp.ReferenceUpdateRequest) {
         				continue
         			}
         
        -			if err != nil {
        -				s.setStatus(cmd.Name, err)
        -				continue
        -			}
        -
         			ref := plumbing.NewHashReference(cmd.Name, cmd.New)
         			err := s.storer.SetReference(ref)
         			s.setStatus(cmd.Name, err)
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/ssh/auth_method.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/ssh/auth_method.go
        index 84cfab2a6..1e5c38375 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/ssh/auth_method.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/ssh/auth_method.go
        @@ -61,7 +61,7 @@ func (a *KeyboardInteractive) ClientConfig() (*ssh.ClientConfig, error) {
         	return a.SetHostKeyCallback(&ssh.ClientConfig{
         		User: a.User,
         		Auth: []ssh.AuthMethod{
        -			ssh.KeyboardInteractiveChallenge(a.Challenge),
        +			a.Challenge,
         		},
         	})
         }
        @@ -236,7 +236,7 @@ func (a *PublicKeysCallback) ClientConfig() (*ssh.ClientConfig, error) {
         // NewKnownHostsCallback returns ssh.HostKeyCallback based on a file based on a
         // known_hosts file. http://man.openbsd.org/sshd#SSH_KNOWN_HOSTS_FILE_FORMAT
         //
        -// If files is empty, the list of files will be read from the SSH_KNOWN_HOSTS
        +// If list of files is empty, then it will be read from the SSH_KNOWN_HOSTS
         // environment variable, example:
         //   /home/foo/custom_known_hosts_file:/etc/custom_known/hosts_file
         //
        @@ -244,13 +244,15 @@ func (a *PublicKeysCallback) ClientConfig() (*ssh.ClientConfig, error) {
         //   ~/.ssh/known_hosts
         //   /etc/ssh/ssh_known_hosts
         func NewKnownHostsCallback(files ...string) (ssh.HostKeyCallback, error) {
        -	files, err := getDefaultKnownHostsFiles()
        -	if err != nil {
        -		return nil, err
        +	var err error
        +
        +	if len(files) == 0 {
        +		if files, err = getDefaultKnownHostsFiles(); err != nil {
        +			return nil, err
        +		}
         	}
         
        -	files, err = filterKnownHostsFiles(files...)
        -	if err != nil {
        +	if files, err = filterKnownHostsFiles(files...); err != nil {
         		return nil, err
         	}
         
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/ssh/common.go b/vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/ssh/common.go
        index e4a3d18fd..d320d4338 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/ssh/common.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/ssh/common.go
        @@ -2,6 +2,7 @@
         package ssh
         
         import (
        +	"context"
         	"fmt"
         	"reflect"
         	"strconv"
        @@ -11,6 +12,7 @@ import (
         
         	"github.com/kevinburke/ssh_config"
         	"golang.org/x/crypto/ssh"
        +	"golang.org/x/net/proxy"
         )
         
         // DefaultClient is the default SSH client.
        @@ -115,7 +117,7 @@ func (c *command) connect() error {
         
         	overrideConfig(c.config, config)
         
        -	c.client, err = ssh.Dial("tcp", c.getHostWithPort(), config)
        +	c.client, err = dial("tcp", c.getHostWithPort(), config)
         	if err != nil {
         		return err
         	}
        @@ -130,6 +132,29 @@ func (c *command) connect() error {
         	return nil
         }
         
        +func dial(network, addr string, config *ssh.ClientConfig) (*ssh.Client, error) {
        +	var (
        +		ctx    = context.Background()
        +		cancel context.CancelFunc
        +	)
        +	if config.Timeout > 0 {
        +		ctx, cancel = context.WithTimeout(ctx, config.Timeout)
        +	} else {
        +		ctx, cancel = context.WithCancel(ctx)
        +	}
        +	defer cancel()
        +
        +	conn, err := proxy.Dial(ctx, network, addr)
        +	if err != nil {
        +		return nil, err
        +	}
        +	c, chans, reqs, err := ssh.NewClientConn(conn, addr, config)
        +	if err != nil {
        +		return nil, err
        +	}
        +	return ssh.NewClient(c, chans, reqs), nil
        +}
        +
         func (c *command) getHostWithPort() string {
         	if addr, found := c.doGetHostWithPortFromSSHConfig(); found {
         		return addr
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/prune.go b/vendor/gopkg.in/src-d/go-git.v4/prune.go
        index 04913d656..c840325f1 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/prune.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/prune.go
        @@ -49,7 +49,7 @@ func (r *Repository) Prune(opt PruneOptions) error {
         		}
         		// Otherwise it is a candidate for pruning.
         		// Check out for too new objects next.
        -		if opt.OnlyObjectsOlderThan != (time.Time{}) {
        +		if !opt.OnlyObjectsOlderThan.IsZero() {
         			// Errors here are non-fatal. The object may be e.g. packed.
         			// Or concurrently deleted. Skip such objects.
         			t, err := los.LooseObjectTime(hash)
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/references.go b/vendor/gopkg.in/src-d/go-git.v4/references.go
        index a1872a5a1..5673ac135 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/references.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/references.go
        @@ -47,7 +47,9 @@ func (s commitSorterer) Len() int {
         }
         
         func (s commitSorterer) Less(i, j int) bool {
        -	return s.l[i].Committer.When.Before(s.l[j].Committer.When)
        +	return s.l[i].Committer.When.Before(s.l[j].Committer.When) ||
        +		s.l[i].Committer.When.Equal(s.l[j].Committer.When) &&
        +			s.l[i].Author.When.Before(s.l[j].Author.When)
         }
         
         func (s commitSorterer) Swap(i, j int) {
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/remote.go b/vendor/gopkg.in/src-d/go-git.v4/remote.go
        index 0556b9894..baee7a082 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/remote.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/remote.go
        @@ -6,8 +6,10 @@ import (
         	"fmt"
         	"io"
         
        +	"gopkg.in/src-d/go-billy.v4/osfs"
         	"gopkg.in/src-d/go-git.v4/config"
         	"gopkg.in/src-d/go-git.v4/plumbing"
        +	"gopkg.in/src-d/go-git.v4/plumbing/cache"
         	"gopkg.in/src-d/go-git.v4/plumbing/format/packfile"
         	"gopkg.in/src-d/go-git.v4/plumbing/object"
         	"gopkg.in/src-d/go-git.v4/plumbing/protocol/packp"
        @@ -18,6 +20,7 @@ import (
         	"gopkg.in/src-d/go-git.v4/plumbing/transport"
         	"gopkg.in/src-d/go-git.v4/plumbing/transport/client"
         	"gopkg.in/src-d/go-git.v4/storage"
        +	"gopkg.in/src-d/go-git.v4/storage/filesystem"
         	"gopkg.in/src-d/go-git.v4/storage/memory"
         	"gopkg.in/src-d/go-git.v4/utils/ioutil"
         )
        @@ -42,7 +45,10 @@ type Remote struct {
         	s storage.Storer
         }
         
        -func newRemote(s storage.Storer, c *config.RemoteConfig) *Remote {
        +// NewRemote creates a new Remote.
        +// The intended purpose is to use the Remote for tasks such as listing remote references (like using git ls-remote).
        +// Otherwise Remotes should be created via the use of a Repository.
        +func NewRemote(s storage.Storer, c *config.RemoteConfig) *Remote {
         	return &Remote{s: s, c: c}
         }
         
        @@ -149,13 +155,33 @@ func (r *Remote) PushContext(ctx context.Context, o *PushOptions) (err error) {
         	var hashesToPush []plumbing.Hash
         	// Avoid the expensive revlist operation if we're only doing deletes.
         	if !allDelete {
        -		hashesToPush, err = revlist.Objects(r.s, objects, haves)
        +		if r.c.IsFirstURLLocal() {
        +			// If we're are pushing to a local repo, it might be much
        +			// faster to use a local storage layer to get the commits
        +			// to ignore, when calculating the object revlist.
        +			localStorer := filesystem.NewStorage(
        +				osfs.New(r.c.URLs[0]), cache.NewObjectLRUDefault())
        +			hashesToPush, err = revlist.ObjectsWithStorageForIgnores(
        +				r.s, localStorer, objects, haves)
        +		} else {
        +			hashesToPush, err = revlist.Objects(r.s, objects, haves)
        +		}
         		if err != nil {
         			return err
         		}
         	}
         
        -	rs, err := pushHashes(ctx, s, r.s, req, hashesToPush)
        +	if len(hashesToPush) == 0 {
        +		allDelete = true
        +		for _, command := range req.Commands {
        +			if command.Action() != packp.Delete {
        +				allDelete = false
        +				break
        +			}
        +		}
        +	}
        +
        +	rs, err := pushHashes(ctx, s, r.s, req, hashesToPush, r.useRefDeltas(ar), allDelete)
         	if err != nil {
         		return err
         	}
        @@ -167,6 +193,10 @@ func (r *Remote) PushContext(ctx context.Context, o *PushOptions) (err error) {
         	return r.updateRemoteReferenceStorage(req, rs)
         }
         
        +func (r *Remote) useRefDeltas(ar *packp.AdvRefs) bool {
        +	return !ar.Capabilities.Supports(capability.OFSDelta)
        +}
        +
         func (r *Remote) newReferenceUpdateRequest(
         	o *PushOptions,
         	localRefs []*plumbing.Reference,
        @@ -184,7 +214,7 @@ func (r *Remote) newReferenceUpdateRequest(
         		}
         	}
         
        -	if err := r.addReferencesToUpdate(o.RefSpecs, localRefs, remoteRefs, req); err != nil {
        +	if err := r.addReferencesToUpdate(o.RefSpecs, localRefs, remoteRefs, req, o.Prune); err != nil {
         		return nil, err
         	}
         
        @@ -372,6 +402,7 @@ func (r *Remote) addReferencesToUpdate(
         	localRefs []*plumbing.Reference,
         	remoteRefs storer.ReferenceStorer,
         	req *packp.ReferenceUpdateRequest,
        +	prune bool,
         ) error {
         	// This references dictionary will be used to search references by name.
         	refsDict := make(map[string]*plumbing.Reference)
        @@ -381,7 +412,7 @@ func (r *Remote) addReferencesToUpdate(
         
         	for _, rs := range refspecs {
         		if rs.IsDelete() {
        -			if err := r.deleteReferences(rs, remoteRefs, req); err != nil {
        +			if err := r.deleteReferences(rs, remoteRefs, refsDict, req, false); err != nil {
         				return err
         			}
         		} else {
        @@ -389,6 +420,12 @@ func (r *Remote) addReferencesToUpdate(
         			if err != nil {
         				return err
         			}
        +
        +			if prune {
        +				if err := r.deleteReferences(rs, remoteRefs, refsDict, req, true); err != nil {
        +					return err
        +				}
        +			}
         		}
         	}
         
        @@ -424,7 +461,10 @@ func (r *Remote) addOrUpdateReferences(
         }
         
         func (r *Remote) deleteReferences(rs config.RefSpec,
        -	remoteRefs storer.ReferenceStorer, req *packp.ReferenceUpdateRequest) error {
        +	remoteRefs storer.ReferenceStorer,
        +	refsDict map[string]*plumbing.Reference,
        +	req *packp.ReferenceUpdateRequest,
        +	prune bool) error {
         	iter, err := remoteRefs.IterReferences()
         	if err != nil {
         		return err
        @@ -435,8 +475,19 @@ func (r *Remote) deleteReferences(rs config.RefSpec,
         			return nil
         		}
         
        -		if rs.Dst("") != ref.Name() {
        -			return nil
        +		if prune {
        +			rs := rs.Reverse()
        +			if !rs.Match(ref.Name()) {
        +				return nil
        +			}
        +
        +			if _, ok := refsDict[rs.Dst(ref.Name()).String()]; ok {
        +				return nil
        +			}
        +		} else {
        +			if rs.Dst("") != ref.Name() {
        +				return nil
        +			}
         		}
         
         		cmd := &packp.Command{
        @@ -886,7 +937,7 @@ func (r *Remote) updateLocalReferenceStorage(
         		updated = true
         	}
         
        -	if err == nil && forceNeeded {
        +	if forceNeeded {
         		err = ErrForceNeeded
         	}
         
        @@ -994,27 +1045,41 @@ func pushHashes(
         	s storage.Storer,
         	req *packp.ReferenceUpdateRequest,
         	hs []plumbing.Hash,
        +	useRefDeltas bool,
        +	allDelete bool,
         ) (*packp.ReportStatus, error) {
         
         	rd, wr := io.Pipe()
        -	req.Packfile = rd
        +
         	config, err := s.Config()
         	if err != nil {
         		return nil, err
         	}
        -	done := make(chan error)
        -	go func() {
        -		e := packfile.NewEncoder(wr, s, false)
        -		if _, err := e.Encode(hs, config.Pack.Window); err != nil {
        -			done <- wr.CloseWithError(err)
        -			return
        -		}
         
        -		done <- wr.Close()
        -	}()
        +	// Set buffer size to 1 so the error message can be written when
        +	// ReceivePack fails. Otherwise the goroutine will be blocked writing
        +	// to the channel.
        +	done := make(chan error, 1)
        +
        +	if !allDelete {
        +		req.Packfile = rd
        +		go func() {
        +			e := packfile.NewEncoder(wr, s, useRefDeltas)
        +			if _, err := e.Encode(hs, config.Pack.Window); err != nil {
        +				done <- wr.CloseWithError(err)
        +				return
        +			}
        +
        +			done <- wr.Close()
        +		}()
        +	} else {
        +		close(done)
        +	}
         
         	rs, err := sess.ReceivePack(ctx, req)
         	if err != nil {
        +		// close the pipe to unlock encode write
        +		_ = rd.Close()
         		return nil, err
         	}
         
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/repository.go b/vendor/gopkg.in/src-d/go-git.v4/repository.go
        index f619934a4..2251d6cfe 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/repository.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/repository.go
        @@ -1,18 +1,23 @@
         package git
         
         import (
        +	"bytes"
         	"context"
         	"errors"
         	"fmt"
        +	"io"
         	stdioutil "io/ioutil"
         	"os"
        +	"path"
         	"path/filepath"
         	"strings"
         	"time"
         
        +	"golang.org/x/crypto/openpgp"
         	"gopkg.in/src-d/go-git.v4/config"
         	"gopkg.in/src-d/go-git.v4/internal/revision"
         	"gopkg.in/src-d/go-git.v4/plumbing"
        +	"gopkg.in/src-d/go-git.v4/plumbing/cache"
         	"gopkg.in/src-d/go-git.v4/plumbing/format/packfile"
         	"gopkg.in/src-d/go-git.v4/plumbing/object"
         	"gopkg.in/src-d/go-git.v4/plumbing/storer"
        @@ -31,12 +36,20 @@ var (
         	// ErrBranchExists an error stating the specified branch already exists
         	ErrBranchExists = errors.New("branch already exists")
         	// ErrBranchNotFound an error stating the specified branch does not exist
        -	ErrBranchNotFound            = errors.New("branch not found")
        +	ErrBranchNotFound = errors.New("branch not found")
        +	// ErrTagExists an error stating the specified tag already exists
        +	ErrTagExists = errors.New("tag already exists")
        +	// ErrTagNotFound an error stating the specified tag does not exist
        +	ErrTagNotFound = errors.New("tag not found")
        +	// ErrFetching is returned when the packfile could not be downloaded
        +	ErrFetching = errors.New("unable to fetch packfile")
        +
         	ErrInvalidReference          = errors.New("invalid reference, should be a tag or a branch")
         	ErrRepositoryNotExists       = errors.New("repository does not exist")
         	ErrRepositoryAlreadyExists   = errors.New("repository already exists")
         	ErrRemoteNotFound            = errors.New("remote not found")
         	ErrRemoteExists              = errors.New("remote already exists")
        +	ErrAnonymousRemoteName       = errors.New("anonymous remote name must be 'anonymous'")
         	ErrWorktreeNotProvided       = errors.New("worktree should be provided")
         	ErrIsBareRepository          = errors.New("worktree not available in a bare repository")
         	ErrUnableToResolveCommit     = errors.New("unable to resolve commit")
        @@ -166,15 +179,6 @@ func Open(s storage.Storer, worktree billy.Filesystem) (*Repository, error) {
         		return nil, err
         	}
         
        -	cfg, err := s.Config()
        -	if err != nil {
        -		return nil, err
        -	}
        -
        -	if !cfg.Core.IsBare && worktree == nil {
        -		return nil, ErrWorktreeNotProvided
        -	}
        -
         	return newRepository(s, worktree), nil
         }
         
        @@ -220,10 +224,7 @@ func PlainInit(path string, isBare bool) (*Repository, error) {
         		dot, _ = wt.Chroot(GitDirName)
         	}
         
        -	s, err := filesystem.NewStorage(dot)
        -	if err != nil {
        -		return nil, err
        -	}
        +	s := filesystem.NewStorage(dot, cache.NewObjectLRUDefault())
         
         	return Init(s, wt)
         }
        @@ -251,10 +252,7 @@ func PlainOpenWithOptions(path string, o *PlainOpenOptions) (*Repository, error)
         		return nil, err
         	}
         
        -	s, err := filesystem.NewStorage(dot)
        -	if err != nil {
        -		return nil, err
        -	}
        +	s := filesystem.NewStorage(dot, cache.NewObjectLRUDefault())
         
         	return Open(s, wt)
         }
        @@ -332,6 +330,8 @@ func dotGitFileToOSFilesystem(path string, fs billy.Filesystem) (bfs billy.Files
         // PlainClone a repository into the path with the given options, isBare defines
         // if the new repository will be bare or normal. If the path is not empty
         // ErrRepositoryAlreadyExists is returned.
        +//
        +// TODO(mcuadros): move isBare to CloneOptions in v5
         func PlainClone(path string, isBare bool, o *CloneOptions) (*Repository, error) {
         	return PlainCloneContext(context.Background(), path, isBare, o)
         }
        @@ -343,13 +343,28 @@ func PlainClone(path string, isBare bool, o *CloneOptions) (*Repository, error)
         // The provided Context must be non-nil. If the context expires before the
         // operation is complete, an error is returned. The context only affects to the
         // transport operations.
        +//
        +// TODO(mcuadros): move isBare to CloneOptions in v5
        +// TODO(smola): refuse upfront to clone on a non-empty directory in v5, see #1027
         func PlainCloneContext(ctx context.Context, path string, isBare bool, o *CloneOptions) (*Repository, error) {
        +	cleanup, cleanupParent, err := checkIfCleanupIsNeeded(path)
        +	if err != nil {
        +		return nil, err
        +	}
        +
         	r, err := PlainInit(path, isBare)
         	if err != nil {
         		return nil, err
         	}
         
        -	return r, r.clone(ctx, o)
        +	err = r.clone(ctx, o)
        +	if err != nil && err != ErrRepositoryAlreadyExists {
        +		if cleanup {
        +			cleanUpDir(path, cleanupParent)
        +		}
        +	}
        +
        +	return r, err
         }
         
         func newRepository(s storage.Storer, worktree billy.Filesystem) *Repository {
        @@ -360,6 +375,65 @@ func newRepository(s storage.Storer, worktree billy.Filesystem) *Repository {
         	}
         }
         
        +func checkIfCleanupIsNeeded(path string) (cleanup bool, cleanParent bool, err error) {
        +	fi, err := os.Stat(path)
        +	if err != nil {
        +		if os.IsNotExist(err) {
        +			return true, true, nil
        +		}
        +
        +		return false, false, err
        +	}
        +
        +	if !fi.IsDir() {
        +		return false, false, fmt.Errorf("path is not a directory: %s", path)
        +	}
        +
        +	f, err := os.Open(path)
        +	if err != nil {
        +		return false, false, err
        +	}
        +
        +	defer ioutil.CheckClose(f, &err)
        +
        +	_, err = f.Readdirnames(1)
        +	if err == io.EOF {
        +		return true, false, nil
        +	}
        +
        +	if err != nil {
        +		return false, false, err
        +	}
        +
        +	return false, false, nil
        +}
        +
        +func cleanUpDir(path string, all bool) error {
        +	if all {
        +		return os.RemoveAll(path)
        +	}
        +
        +	f, err := os.Open(path)
        +	if err != nil {
        +		return err
        +	}
        +
        +	defer ioutil.CheckClose(f, &err)
        +
        +	names, err := f.Readdirnames(-1)
        +	if err != nil {
        +		return err
        +	}
        +
        +	for _, name := range names {
        +		if err := os.RemoveAll(filepath.Join(path, name)); err != nil {
        +			return err
        +		}
        +	}
        +
        +	return err
        +}
        +
         // Config return the repository config
         func (r *Repository) Config() (*config.Config, error) {
         	return r.Storer.Config()
        @@ -377,7 +451,7 @@ func (r *Repository) Remote(name string) (*Remote, error) {
         		return nil, ErrRemoteNotFound
         	}
         
        -	return newRemote(r.Storer, c), nil
        +	return NewRemote(r.Storer, c), nil
         }
         
         // Remotes returns a list with all the remotes
        @@ -391,7 +465,7 @@ func (r *Repository) Remotes() ([]*Remote, error) {
         
         	var i int
         	for _, c := range cfg.Remotes {
        -		remotes[i] = newRemote(r.Storer, c)
        +		remotes[i] = NewRemote(r.Storer, c)
         		i++
         	}
         
        @@ -404,7 +478,7 @@ func (r *Repository) CreateRemote(c *config.RemoteConfig) (*Remote, error) {
         		return nil, err
         	}
         
        -	remote := newRemote(r.Storer, c)
        +	remote := NewRemote(r.Storer, c)
         
         	cfg, err := r.Storer.Config()
         	if err != nil {
        @@ -419,6 +493,22 @@ func (r *Repository) CreateRemote(c *config.RemoteConfig) (*Remote, error) {
         	return remote, r.Storer.SetConfig(cfg)
         }
         
        +// CreateRemoteAnonymous creates a new anonymous remote. c.Name must be "anonymous".
        +// It's used like 'git fetch git@github.com:src-d/go-git.git master:master'.
        +func (r *Repository) CreateRemoteAnonymous(c *config.RemoteConfig) (*Remote, error) {
        +	if err := c.Validate(); err != nil {
        +		return nil, err
        +	}
        +
        +	if c.Name != "anonymous" {
        +		return nil, ErrAnonymousRemoteName
        +	}
        +
        +	remote := NewRemote(r.Storer, c)
        +
        +	return remote, nil
        +}
        +
         // DeleteRemote delete a remote from the repository and delete the config
         func (r *Repository) DeleteRemote(name string) error {
         	cfg, err := r.Storer.Config()
        @@ -483,6 +573,139 @@ func (r *Repository) DeleteBranch(name string) error {
         	return r.Storer.SetConfig(cfg)
         }
         
        +// CreateTag creates a tag. If opts is included, the tag is an annotated tag,
        +// otherwise a lightweight tag is created.
        +func (r *Repository) CreateTag(name string, hash plumbing.Hash, opts *CreateTagOptions) (*plumbing.Reference, error) {
        +	rname := plumbing.ReferenceName(path.Join("refs", "tags", name))
        +
        +	_, err := r.Storer.Reference(rname)
        +	switch err {
        +	case nil:
        +		// Tag exists, this is an error
        +		return nil, ErrTagExists
        +	case plumbing.ErrReferenceNotFound:
        +		// Tag missing, available for creation, pass this
        +	default:
        +		// Some other error
        +		return nil, err
        +	}
        +
        +	var target plumbing.Hash
        +	if opts != nil {
        +		target, err = r.createTagObject(name, hash, opts)
        +		if err != nil {
        +			return nil, err
        +		}
        +	} else {
        +		target = hash
        +	}
        +
        +	ref := plumbing.NewHashReference(rname, target)
        +	if err = r.Storer.SetReference(ref); err != nil {
        +		return nil, err
        +	}
        +
        +	return ref, nil
        +}
        +
        +func (r *Repository) createTagObject(name string, hash plumbing.Hash, opts *CreateTagOptions) (plumbing.Hash, error) {
        +	if err := opts.Validate(r, hash); err != nil {
        +		return plumbing.ZeroHash, err
        +	}
        +
        +	rawobj, err := object.GetObject(r.Storer, hash)
        +	if err != nil {
        +		return plumbing.ZeroHash, err
        +	}
        +
        +	tag := &object.Tag{
        +		Name:       name,
        +		Tagger:     *opts.Tagger,
        +		Message:    opts.Message,
        +		TargetType: rawobj.Type(),
        +		Target:     hash,
        +	}
        +
        +	if opts.SignKey != nil {
        +		sig, err := r.buildTagSignature(tag, opts.SignKey)
        +		if err != nil {
        +			return plumbing.ZeroHash, err
        +		}
        +
        +		tag.PGPSignature = sig
        +	}
        +
        +	obj := r.Storer.NewEncodedObject()
        +	if err := tag.Encode(obj); err != nil {
        +		return plumbing.ZeroHash, err
        +	}
        +
        +	return r.Storer.SetEncodedObject(obj)
        +}
        +
        +func (r *Repository) buildTagSignature(tag *object.Tag, signKey *openpgp.Entity) (string, error) {
        +	encoded := &plumbing.MemoryObject{}
        +	if err := tag.Encode(encoded); err != nil {
        +		return "", err
        +	}
        +
        +	rdr, err := encoded.Reader()
        +	if err != nil {
        +		return "", err
        +	}
        +
        +	var b bytes.Buffer
        +	if err := openpgp.ArmoredDetachSign(&b, signKey, rdr, nil); err != nil {
        +		return "", err
        +	}
        +
        +	return b.String(), nil
        +}
        +
        +// Tag returns a tag from the repository.
        +//
        +// If you want to check to see if the tag is an annotated tag, you can call
        +// TagObject on the hash of the reference in ForEach:
        +//
        +//   ref, err := r.Tag("v0.1.0")
        +//   if err != nil {
        +//     // Handle error
        +//   }
        +//
        +//   obj, err := r.TagObject(ref.Hash())
        +//   switch err {
        +//   case nil:
        +//     // Tag object present
        +//   case plumbing.ErrObjectNotFound:
        +//     // Not a tag object
        +//   default:
        +//     // Some other error
        +//   }
        +//
        +func (r *Repository) Tag(name string) (*plumbing.Reference, error) {
        +	ref, err := r.Reference(plumbing.ReferenceName(path.Join("refs", "tags", name)), false)
        +	if err != nil {
        +		if err == plumbing.ErrReferenceNotFound {
        +			// Return a friendly error for this one, versus just ReferenceNotFound.
        +			return nil, ErrTagNotFound
        +		}
        +
        +		return nil, err
        +	}
        +
        +	return ref, nil
        +}
        +
        +// DeleteTag deletes a tag from the repository.
        +func (r *Repository) DeleteTag(name string) error {
        +	_, err := r.Tag(name)
        +	if err != nil {
        +		return err
        +	}
        +
        +	return r.Storer.RemoveReference(plumbing.ReferenceName(path.Join("refs", "tags", name)))
        +}
        +
         func (r *Repository) resolveToCommitHash(h plumbing.Hash) (plumbing.Hash, error) {
         	obj, err := r.Storer.EncodedObject(plumbing.AnyObject, h)
         	if err != nil {
        @@ -509,8 +732,9 @@ func (r *Repository) clone(ctx context.Context, o *CloneOptions) error {
         	}
         
         	c := &config.RemoteConfig{
        -		Name: o.RemoteName,
        -		URLs: []string{o.URL},
        +		Name:  o.RemoteName,
        +		URLs:  []string{o.URL},
        +		Fetch: r.cloneRefSpec(o),
         	}
         
         	if _, err := r.CreateRemote(c); err != nil {
        @@ -518,11 +742,12 @@ func (r *Repository) clone(ctx context.Context, o *CloneOptions) error {
         	}
         
         	ref, err := r.fetchAndUpdateReferences(ctx, &FetchOptions{
        -		RefSpecs: r.cloneRefSpec(o, c),
        -		Depth:    o.Depth,
        -		Auth:     o.Auth,
        -		Progress: o.Progress,
        -		Tags:     o.Tags,
        +		RefSpecs:   c.Fetch,
        +		Depth:      o.Depth,
        +		Auth:       o.Auth,
        +		Progress:   o.Progress,
        +		Tags:       o.Tags,
        +		RemoteName: o.RemoteName,
         	}, o.ReferenceName)
         	if err != nil {
         		return err
        @@ -587,21 +812,26 @@ const (
         	refspecSingleBranchHEAD = "+HEAD:refs/remotes/%s/HEAD"
         )
         
        -func (r *Repository) cloneRefSpec(o *CloneOptions, c *config.RemoteConfig) []config.RefSpec {
        -	var rs string
        -
        +func (r *Repository) cloneRefSpec(o *CloneOptions) []config.RefSpec {
         	switch {
         	case o.ReferenceName.IsTag():
        -		rs = fmt.Sprintf(refspecTag, o.ReferenceName.Short())
        +		return []config.RefSpec{
        +			config.RefSpec(fmt.Sprintf(refspecTag, o.ReferenceName.Short())),
        +		}
         	case o.SingleBranch && o.ReferenceName == plumbing.HEAD:
        -		rs = fmt.Sprintf(refspecSingleBranchHEAD, c.Name)
        +		return []config.RefSpec{
        +			config.RefSpec(fmt.Sprintf(refspecSingleBranchHEAD, o.RemoteName)),
        +			config.RefSpec(fmt.Sprintf(refspecSingleBranch, plumbing.Master.Short(), o.RemoteName)),
        +		}
         	case o.SingleBranch:
        -		rs = fmt.Sprintf(refspecSingleBranch, o.ReferenceName.Short(), c.Name)
        +		return []config.RefSpec{
        +			config.RefSpec(fmt.Sprintf(refspecSingleBranch, o.ReferenceName.Short(), o.RemoteName)),
        +		}
         	default:
        -		return c.Fetch
        +		return []config.RefSpec{
        +			config.RefSpec(fmt.Sprintf(config.DefaultFetchRefSpec, o.RemoteName)),
        +		}
         	}
        -
        -	return []config.RefSpec{config.RefSpec(rs)}
         }
         
         func (r *Repository) setIsBare(isBare bool) error {
        @@ -619,9 +849,7 @@ func (r *Repository) updateRemoteConfigIfNeeded(o *CloneOptions, c *config.Remot
         		return nil
         	}
         
        -	c.Fetch = []config.RefSpec{config.RefSpec(fmt.Sprintf(
        -		refspecSingleBranch, head.Name().Short(), c.Name,
        -	))}
        +	c.Fetch = r.cloneRefSpec(o)
         
         	cfg, err := r.Storer.Config()
         	if err != nil {
        @@ -649,6 +877,8 @@ func (r *Repository) fetchAndUpdateReferences(
         	remoteRefs, err := remote.fetch(ctx, o)
         	if err == NoErrAlreadyUpToDate {
         		objsUpdated = false
        +	} else if err == packfile.ErrEmptyPackfile {
        +		return nil, ErrFetching
         	} else if err != nil {
         		return nil, err
         	}
        @@ -814,8 +1044,36 @@ func (r *Repository) PushContext(ctx context.Context, o *PushOptions) error {
         
         // Log returns the commit history from the given LogOptions.
         func (r *Repository) Log(o *LogOptions) (object.CommitIter, error) {
        -	h := o.From
        -	if o.From == plumbing.ZeroHash {
        +	fn := commitIterFunc(o.Order)
        +	if fn == nil {
        +		return nil, fmt.Errorf("invalid Order=%v", o.Order)
        +	}
        +
        +	var (
        +		it  object.CommitIter
        +		err error
        +	)
        +	if o.All {
        +		it, err = r.logAll(fn)
        +	} else {
        +		it, err = r.log(o.From, fn)
        +	}
        +
        +	if err != nil {
        +		return nil, err
        +	}
        +
        +	if o.FileName != nil {
        +		// for `git log --all` also check parent (if the next commit comes from the real parent)
        +		it = r.logWithFile(*o.FileName, it, o.All)
        +	}
        +
        +	return it, nil
        +}
        +
        +func (r *Repository) log(from plumbing.Hash, commitIterFunc func(*object.Commit) object.CommitIter) (object.CommitIter, error) {
        +	h := from
        +	if from == plumbing.ZeroHash {
         		head, err := r.Head()
         		if err != nil {
         			return nil, err
        @@ -828,25 +1086,68 @@ func (r *Repository) Log(o *LogOptions) (object.CommitIter, error) {
         	if err != nil {
         		return nil, err
         	}
        +	return commitIterFunc(commit), nil
        +}
        +
        +func (r *Repository) logAll(commitIterFunc func(*object.Commit) object.CommitIter) (object.CommitIter, error) {
        +	return object.NewCommitAllIter(r.Storer, commitIterFunc)
        +}
        +
        +func (*Repository) logWithFile(fileName string, commitIter object.CommitIter, checkParent bool) object.CommitIter {
        +	return object.NewCommitFileIterFromIter(fileName, commitIter, checkParent)
        +}
         
        -	switch o.Order {
        +func commitIterFunc(order LogOrder) func(c *object.Commit) object.CommitIter {
        +	switch order {
         	case LogOrderDefault:
        -		return object.NewCommitPreorderIter(commit, nil, nil), nil
        +		return func(c *object.Commit) object.CommitIter {
        +			return object.NewCommitPreorderIter(c, nil, nil)
        +		}
         	case LogOrderDFS:
        -		return object.NewCommitPreorderIter(commit, nil, nil), nil
        +		return func(c *object.Commit) object.CommitIter {
        +			return object.NewCommitPreorderIter(c, nil, nil)
        +		}
         	case LogOrderDFSPost:
        -		return object.NewCommitPostorderIter(commit, nil), nil
        +		return func(c *object.Commit) object.CommitIter {
        +			return object.NewCommitPostorderIter(c, nil)
        +		}
         	case LogOrderBSF:
        -		return object.NewCommitIterBSF(commit, nil, nil), nil
        +		return func(c *object.Commit) object.CommitIter {
        +			return object.NewCommitIterBSF(c, nil, nil)
        +		}
         	case LogOrderCommitterTime:
        -		return object.NewCommitIterCTime(commit, nil, nil), nil
        +		return func(c *object.Commit) object.CommitIter {
        +			return object.NewCommitIterCTime(c, nil, nil)
        +		}
         	}
        -	return nil, fmt.Errorf("invalid Order=%v", o.Order)
        +	return nil
         }
         
        -// Tags returns all the References from Tags. This method returns only lightweight
        -// tags. Note that not all the tags are lightweight ones. To return annotated tags
        -// too, you need to call TagObjects() method.
        +// Tags returns all the tag References in a repository.
        +//
        +// If you want to check to see if the tag is an annotated tag, you can call
        +// TagObject on the hash Reference passed in through ForEach:
        +//
        +//   iter, err := r.Tags()
        +//   if err != nil {
        +//     // Handle error
        +//   }
        +//
        +//   if err := iter.ForEach(func (ref *plumbing.Reference) error {
        +//     obj, err := r.TagObject(ref.Hash())
        +//     switch err {
        +//     case nil:
        +//       // Tag object present
        +//     case plumbing.ErrObjectNotFound:
        +//       // Not a tag object
        +//     default:
        +//       // Some other error
        +//       return err
        +//     }
        +//   }); err != nil {
        +//     // Handle outer iterator error
        +//   }
        +//
         func (r *Repository) Tags() (storer.ReferenceIter, error) {
         	refIter, err := r.Storer.IterReferences()
         	if err != nil {
        @@ -1005,7 +1306,8 @@ func (r *Repository) Worktree() (*Worktree, error) {
         	return &Worktree{r: r, Filesystem: r.wt}, nil
         }
         
        -// ResolveRevision resolves revision to corresponding hash.
        +// ResolveRevision resolves revision to corresponding hash. It will always
        +// resolve to a commit hash, not a tree or annotated tag.
         //
         // Implemented resolvers : HEAD, branch, tag, heads/branch, refs/heads/branch,
         // refs/tags/tag, refs/remotes/origin/branch, refs/remotes/origin/HEAD, tilde and caret (HEAD~1, master~^, tag~2, ref/heads/master~1, ...), selection by text (HEAD^{/fix nasty bug})
        @@ -1024,40 +1326,57 @@ func (r *Repository) ResolveRevision(rev plumbing.Revision) (*plumbing.Hash, err
         		switch item.(type) {
         		case revision.Ref:
         			revisionRef := item.(revision.Ref)
        -			var ref *plumbing.Reference
        -			var hashCommit, refCommit *object.Commit
        -			var rErr, hErr error
        +
        +			var tryHashes []plumbing.Hash
        +
        +			maybeHash := plumbing.NewHash(string(revisionRef))
        +
        +			if !maybeHash.IsZero() {
        +				tryHashes = append(tryHashes, maybeHash)
        +			}
         
         			for _, rule := range append([]string{"%s"}, plumbing.RefRevParseRules...) {
        -				ref, err = storer.ResolveReference(r.Storer, plumbing.ReferenceName(fmt.Sprintf(rule, revisionRef)))
        +				ref, err := storer.ResolveReference(r.Storer, plumbing.ReferenceName(fmt.Sprintf(rule, revisionRef)))
         
         				if err == nil {
        +					tryHashes = append(tryHashes, ref.Hash())
         					break
         				}
         			}
         
        -			if ref != nil {
        -				refCommit, rErr = r.CommitObject(ref.Hash())
        -			} else {
        -				rErr = plumbing.ErrReferenceNotFound
        -			}
        -
        -			isHash := plumbing.NewHash(string(revisionRef)).String() == string(revisionRef)
        +			// in ambiguous cases, `git rev-parse` will emit a warning, but
        +			// will always return the oid in preference to a ref; we don't have
        +			// the ability to emit a warning here, so (for speed purposes)
        +			// don't bother to detect the ambiguity either, just return in the
        +			// priority that git would.
        +			gotOne := false
        +			for _, hash := range tryHashes {
        +				commitObj, err := r.CommitObject(hash)
        +				if err == nil {
        +					commit = commitObj
        +					gotOne = true
        +					break
        +				}
         
        -			if isHash {
        -				hashCommit, hErr = r.CommitObject(plumbing.NewHash(string(revisionRef)))
        +				tagObj, err := r.TagObject(hash)
        +				if err == nil {
        +					// If the tag target lookup fails here, this most likely
        +					// represents some sort of repo corruption, so let the
        +					// error bubble up.
        +					tagCommit, err := tagObj.Commit()
        +					if err != nil {
        +						return &plumbing.ZeroHash, err
        +					}
        +					commit = tagCommit
        +					gotOne = true
        +					break
        +				}
         			}
         
        -			switch {
        -			case rErr == nil && !isHash:
        -				commit = refCommit
        -			case rErr != nil && isHash && hErr == nil:
        -				commit = hashCommit
        -			case rErr == nil && isHash && hErr == nil:
        -				return &plumbing.ZeroHash, fmt.Errorf(`refname "%s" is ambiguous`, revisionRef)
        -			default:
        +			if !gotOne {
         				return &plumbing.ZeroHash, plumbing.ErrReferenceNotFound
         			}
        +
         		case revision.CaretPath:
         			depth := item.(revision.CaretPath).Depth
         
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/status.go b/vendor/gopkg.in/src-d/go-git.v4/status.go
        index ecbf79350..7f18e0227 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/status.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/status.go
        @@ -26,7 +26,7 @@ func (s Status) IsUntracked(path string) bool {
         	return ok && stat.Worktree == Untracked
         }
         
        -// IsClean returns true if all the files aren't in Unmodified status.
        +// IsClean returns true if all the files are in Unmodified status.
         func (s Status) IsClean() bool {
         	for _, status := range s {
         		if status.Worktree != Unmodified || status.Staging != Unmodified {
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/dotgit/dotgit.go b/vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/dotgit/dotgit.go
        index df5cd10d7..111769bf2 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/dotgit/dotgit.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/dotgit/dotgit.go
        @@ -14,6 +14,7 @@ import (
         
         	"gopkg.in/src-d/go-billy.v4/osfs"
         	"gopkg.in/src-d/go-git.v4/plumbing"
        +	"gopkg.in/src-d/go-git.v4/storage"
         	"gopkg.in/src-d/go-git.v4/utils/ioutil"
         
         	"gopkg.in/src-d/go-billy.v4"
        @@ -82,7 +83,7 @@ type DotGit struct {
         	packList   []plumbing.Hash
         	packMap    map[plumbing.Hash]struct{}
         
        -	files map[string]billy.File
        +	files map[plumbing.Hash]billy.File
         }
         
         // New returns a DotGit value ready to be used. The path argument must
        @@ -92,8 +93,8 @@ func New(fs billy.Filesystem) *DotGit {
         	return NewWithOptions(fs, Options{})
         }
         
        -// NewWithOptions creates a new DotGit and sets non default configuration
        -// options. See New for complete help.
        +// NewWithOptions sets non default configuration options.
        +// See New for complete help.
         func NewWithOptions(fs billy.Filesystem, o Options) *DotGit {
         	return &DotGit{
         		options: o,
        @@ -244,8 +245,15 @@ func (d *DotGit) objectPackPath(hash plumbing.Hash, extension string) string {
         }
         
         func (d *DotGit) objectPackOpen(hash plumbing.Hash, extension string) (billy.File, error) {
        -	if d.files == nil {
        -		d.files = make(map[string]billy.File)
        +	if d.options.KeepDescriptors && extension == "pack" {
        +		if d.files == nil {
        +			d.files = make(map[plumbing.Hash]billy.File)
        +		}
        +
        +		f, ok := d.files[hash]
        +		if ok {
        +			return f, nil
        +		}
         	}
         
         	err := d.hasPack(hash)
        @@ -254,11 +262,6 @@ func (d *DotGit) objectPackOpen(hash plumbing.Hash, extension string) (billy.Fil
         	}
         
         	path := d.objectPackPath(hash, extension)
        -	f, ok := d.files[path]
        -	if ok {
        -		return f, nil
        -	}
        -
         	pack, err := d.fs.Open(path)
         	if err != nil {
         		if os.IsNotExist(err) {
        @@ -269,7 +272,7 @@ func (d *DotGit) objectPackOpen(hash plumbing.Hash, extension string) (billy.Fil
         	}
         
         	if d.options.KeepDescriptors && extension == "pack" {
        -		d.files[path] = pack
        +		d.files[hash] = pack
         	}
         
         	return pack, nil
        @@ -596,7 +599,7 @@ func (d *DotGit) checkReferenceAndTruncate(f billy.File, old *plumbing.Reference
         		return err
         	}
         	if ref.Hash() != old.Hash() {
        -		return fmt.Errorf("reference has changed concurrently")
        +		return storage.ErrReferenceHasChanged
         	}
         	_, err = f.Seek(0, io.SeekStart)
         	if err != nil {
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/dotgit/dotgit_setref.go b/vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/dotgit/dotgit_setref.go
        index d27c1a303..9da2f31e8 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/dotgit/dotgit_setref.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/dotgit/dotgit_setref.go
        @@ -1,15 +1,24 @@
        -// +build !norwfs
        -
         package dotgit
         
         import (
        +	"fmt"
         	"os"
         
         	"gopkg.in/src-d/go-git.v4/plumbing"
         	"gopkg.in/src-d/go-git.v4/utils/ioutil"
        +
        +	"gopkg.in/src-d/go-billy.v4"
         )
         
         func (d *DotGit) setRef(fileName, content string, old *plumbing.Reference) (err error) {
        +	if billy.CapabilityCheck(d.fs, billy.ReadAndWriteCapability) {
        +		return d.setRefRwfs(fileName, content, old)
        +	}
        +
        +	return d.setRefNorwfs(fileName, content, old)
        +}
        +
        +func (d *DotGit) setRefRwfs(fileName, content string, old *plumbing.Reference) (err error) {
         	// If we are not checking an old ref, just truncate the file.
         	mode := os.O_RDWR | os.O_CREATE
         	if old == nil {
        @@ -41,3 +50,41 @@ func (d *DotGit) setRef(fileName, content string, old *plumbing.Reference) (err
         	_, err = f.Write([]byte(content))
         	return err
         }
        +
        +// There are some filesystems that don't support opening files in RDWD mode.
        +// In these filesystems the standard SetRef function can not be used as it
        +// reads the reference file to check that it's not modified before updating it.
        +//
        +// This version of the function writes the reference without extra checks
        +// making it compatible with these simple filesystems. This is usually not
        +// a problem as they should be accessed by only one process at a time.
        +func (d *DotGit) setRefNorwfs(fileName, content string, old *plumbing.Reference) error {
        +	_, err := d.fs.Stat(fileName)
        +	if err == nil && old != nil {
        +		fRead, err := d.fs.Open(fileName)
        +		if err != nil {
        +			return err
        +		}
        +
        +		ref, err := d.readReferenceFrom(fRead, old.Name().String())
        +		fRead.Close()
        +
        +		if err != nil {
        +			return err
        +		}
        +
        +		if ref.Hash() != old.Hash() {
        +			return fmt.Errorf("reference has changed concurrently")
        +		}
        +	}
        +
        +	f, err := d.fs.Create(fileName)
        +	if err != nil {
        +		return err
        +	}
        +
        +	defer f.Close()
        +
        +	_, err = f.Write([]byte(content))
        +	return err
        +}
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/dotgit/dotgit_setref_norwfs.go b/vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/dotgit/dotgit_setref_norwfs.go
        deleted file mode 100644
        index 5695bd3b6..000000000
        --- a/vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/dotgit/dotgit_setref_norwfs.go
        +++ /dev/null
        @@ -1,47 +0,0 @@
        -// +build norwfs
        -
        -package dotgit
        -
        -import (
        -	"fmt"
        -
        -	"gopkg.in/src-d/go-git.v4/plumbing"
        -)
        -
        -// There are some filesystems that don't support opening files in RDWD mode.
        -// In these filesystems the standard SetRef function can not be used as i
        -// reads the reference file to check that it's not modified before updating it.
        -//
        -// This version of the function writes the reference without extra checks
        -// making it compatible with these simple filesystems. This is usually not
        -// a problem as they should be accessed by only one process at a time.
        -func (d *DotGit) setRef(fileName, content string, old *plumbing.Reference) error {
        -	_, err := d.fs.Stat(fileName)
        -	if err == nil && old != nil {
        -		fRead, err := d.fs.Open(fileName)
        -		if err != nil {
        -			return err
        -		}
        -
        -		ref, err := d.readReferenceFrom(fRead, old.Name().String())
        -		fRead.Close()
        -
        -		if err != nil {
        -			return err
        -		}
        -
        -		if ref.Hash() != old.Hash() {
        -			return fmt.Errorf("reference has changed concurrently")
        -		}
        -	}
        -
        -	f, err := d.fs.Create(fileName)
        -	if err != nil {
        -		return err
        -	}
        -
        -	defer f.Close()
        -
        -	_, err = f.Write([]byte(content))
        -	return err
        -}
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/index.go b/vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/index.go
        index 2ebf57e61..be800eff3 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/index.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/index.go
        @@ -1,6 +1,7 @@
         package filesystem
         
         import (
        +	"bufio"
         	"os"
         
         	"gopkg.in/src-d/go-git.v4/plumbing/format/index"
        @@ -19,8 +20,14 @@ func (s *IndexStorage) SetIndex(idx *index.Index) (err error) {
         	}
         
         	defer ioutil.CheckClose(f, &err)
        +	bw := bufio.NewWriter(f)
        +	defer func() {
        +		if e := bw.Flush(); err == nil && e != nil {
        +			err = e
        +		}
        +	}()
         
        -	e := index.NewEncoder(f)
        +	e := index.NewEncoder(bw)
         	err = e.Encode(idx)
         	return err
         }
        @@ -41,7 +48,7 @@ func (s *IndexStorage) Index() (i *index.Index, err error) {
         
         	defer ioutil.CheckClose(f, &err)
         
        -	d := index.NewDecoder(f)
        +	d := index.NewDecoder(bufio.NewReader(f))
         	err = d.Decode(idx)
         	return idx, err
         }
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/module.go b/vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/module.go
        index 7c8c8d866..927220674 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/module.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/module.go
        @@ -1,6 +1,7 @@
         package filesystem
         
         import (
        +	"gopkg.in/src-d/go-git.v4/plumbing/cache"
         	"gopkg.in/src-d/go-git.v4/storage"
         	"gopkg.in/src-d/go-git.v4/storage/filesystem/dotgit"
         )
        @@ -15,5 +16,5 @@ func (s *ModuleStorage) Module(name string) (storage.Storer, error) {
         		return nil, err
         	}
         
        -	return NewStorage(fs)
        +	return NewStorage(fs, cache.NewObjectLRUDefault()), nil
         }
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/object.go b/vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/object.go
        index 3545e2751..ad5d8d000 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/object.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/object.go
        @@ -20,31 +20,30 @@ import (
         type ObjectStorage struct {
         	options Options
         
        -	// deltaBaseCache is an object cache uses to cache delta's bases when
        -	deltaBaseCache cache.Object
        +	// objectCache is an object cache uses to cache delta's bases and also recently
        +	// loaded loose objects
        +	objectCache cache.Object
         
         	dir   *dotgit.DotGit
         	index map[plumbing.Hash]idxfile.Index
        +
        +	packList    []plumbing.Hash
        +	packListIdx int
        +	packfiles   map[plumbing.Hash]*packfile.Packfile
         }
         
        -// NewObjectStorage creates a new ObjectStorage with the given .git directory.
        -func NewObjectStorage(dir *dotgit.DotGit) (ObjectStorage, error) {
        -	return NewObjectStorageWithOptions(dir, Options{})
        +// NewObjectStorage creates a new ObjectStorage with the given .git directory and cache.
        +func NewObjectStorage(dir *dotgit.DotGit, objectCache cache.Object) *ObjectStorage {
        +	return NewObjectStorageWithOptions(dir, objectCache, Options{})
         }
         
        -// NewObjectStorageWithOptions creates a new ObjectStorage with the given .git
        -// directory and sets its options.
        -func NewObjectStorageWithOptions(
        -	dir *dotgit.DotGit,
        -	ops Options,
        -) (ObjectStorage, error) {
        -	s := ObjectStorage{
        -		options:        ops,
        -		deltaBaseCache: cache.NewObjectLRUDefault(),
        -		dir:            dir,
        +// NewObjectStorageWithOptions creates a new ObjectStorage with the given .git directory, cache and extra options
        +func NewObjectStorageWithOptions(dir *dotgit.DotGit, objectCache cache.Object, ops Options) *ObjectStorage {
        +	return &ObjectStorage{
        +		options:     ops,
        +		objectCache: objectCache,
        +		dir:         dir,
         	}
        -
        -	return s, nil
         }
         
         func (s *ObjectStorage) requireIndex() error {
        @@ -67,6 +66,11 @@ func (s *ObjectStorage) requireIndex() error {
         	return nil
         }
         
        +// Reindex indexes again all packfiles. Useful if git changed packfiles externally
        +func (s *ObjectStorage) Reindex() {
        +	s.index = nil
        +}
        +
         func (s *ObjectStorage) loadIdxFile(h plumbing.Hash) (err error) {
         	f, err := s.dir.ObjectPackIdx(h)
         	if err != nil {
        @@ -166,12 +170,158 @@ func (s *ObjectStorage) HasEncodedObject(h plumbing.Hash) (err error) {
         	return nil
         }
         
        +func (s *ObjectStorage) encodedObjectSizeFromUnpacked(h plumbing.Hash) (
        +	size int64, err error) {
        +	f, err := s.dir.Object(h)
        +	if err != nil {
        +		if os.IsNotExist(err) {
        +			return 0, plumbing.ErrObjectNotFound
        +		}
        +
        +		return 0, err
        +	}
        +
        +	r, err := objfile.NewReader(f)
        +	if err != nil {
        +		return 0, err
        +	}
        +	defer ioutil.CheckClose(r, &err)
        +
        +	_, size, err = r.Header()
        +	return size, err
        +}
        +
        +func (s *ObjectStorage) packfile(idx idxfile.Index, pack plumbing.Hash) (*packfile.Packfile, error) {
        +	if p := s.packfileFromCache(pack); p != nil {
        +		return p, nil
        +	}
        +
        +	f, err := s.dir.ObjectPack(pack)
        +	if err != nil {
        +		return nil, err
        +	}
        +
        +	var p *packfile.Packfile
        +	if s.objectCache != nil {
        +		p = packfile.NewPackfileWithCache(idx, s.dir.Fs(), f, s.objectCache)
        +	} else {
        +		p = packfile.NewPackfile(idx, s.dir.Fs(), f)
        +	}
        +
        +	return p, s.storePackfileInCache(pack, p)
        +}
        +
        +func (s *ObjectStorage) packfileFromCache(hash plumbing.Hash) *packfile.Packfile {
        +	if s.packfiles == nil {
        +		if s.options.KeepDescriptors {
        +			s.packfiles = make(map[plumbing.Hash]*packfile.Packfile)
        +		} else if s.options.MaxOpenDescriptors > 0 {
        +			s.packList = make([]plumbing.Hash, s.options.MaxOpenDescriptors)
        +			s.packfiles = make(map[plumbing.Hash]*packfile.Packfile, s.options.MaxOpenDescriptors)
        +		}
        +	}
        +
        +	return s.packfiles[hash]
        +}
        +
        +func (s *ObjectStorage) storePackfileInCache(hash plumbing.Hash, p *packfile.Packfile) error {
        +	if s.options.KeepDescriptors {
        +		s.packfiles[hash] = p
        +		return nil
        +	}
        +
        +	if s.options.MaxOpenDescriptors <= 0 {
        +		return nil
        +	}
        +
        +	// start over as the limit of packList is hit
        +	if s.packListIdx >= len(s.packList) {
        +		s.packListIdx = 0
        +	}
        +
        +	// close the existing packfile if open
        +	if next := s.packList[s.packListIdx]; !next.IsZero() {
        +		open := s.packfiles[next]
        +		delete(s.packfiles, next)
        +		if open != nil {
        +			if err := open.Close(); err != nil {
        +				return err
        +			}
        +		}
        +	}
        +
        +	// cache newly open packfile
        +	s.packList[s.packListIdx] = hash
        +	s.packfiles[hash] = p
        +	s.packListIdx++
        +
        +	return nil
        +}
        +
        +func (s *ObjectStorage) encodedObjectSizeFromPackfile(h plumbing.Hash) (
        +	size int64, err error) {
        +	if err := s.requireIndex(); err != nil {
        +		return 0, err
        +	}
        +
        +	pack, _, offset := s.findObjectInPackfile(h)
        +	if offset == -1 {
        +		return 0, plumbing.ErrObjectNotFound
        +	}
        +
        +	idx := s.index[pack]
        +	hash, err := idx.FindHash(offset)
        +	if err == nil {
        +		obj, ok := s.objectCache.Get(hash)
        +		if ok {
        +			return obj.Size(), nil
        +		}
        +	} else if err != nil && err != plumbing.ErrObjectNotFound {
        +		return 0, err
        +	}
        +
        +	p, err := s.packfile(idx, pack)
        +	if err != nil {
        +		return 0, err
        +	}
        +
        +	if !s.options.KeepDescriptors && s.options.MaxOpenDescriptors == 0 {
        +		defer ioutil.CheckClose(p, &err)
        +	}
        +
        +	return p.GetSizeByOffset(offset)
        +}
        +
        +// EncodedObjectSize returns the plaintext size of the given object,
        +// without actually reading the full object data from storage.
        +func (s *ObjectStorage) EncodedObjectSize(h plumbing.Hash) (
        +	size int64, err error) {
        +	size, err = s.encodedObjectSizeFromUnpacked(h)
        +	if err != nil && err != plumbing.ErrObjectNotFound {
        +		return 0, err
        +	} else if err == nil {
        +		return size, nil
        +	}
        +
        +	return s.encodedObjectSizeFromPackfile(h)
        +}
        +
         // EncodedObject returns the object with the given hash, by searching for it in
         // the packfile and the git object directories.
         func (s *ObjectStorage) EncodedObject(t plumbing.ObjectType, h plumbing.Hash) (plumbing.EncodedObject, error) {
        -	obj, err := s.getFromUnpacked(h)
        -	if err == plumbing.ErrObjectNotFound {
        +	var obj plumbing.EncodedObject
        +	var err error
        +
        +	if s.index != nil {
         		obj, err = s.getFromPackfile(h, false)
        +		if err == plumbing.ErrObjectNotFound {
        +			obj, err = s.getFromUnpacked(h)
        +		}
        +	} else {
        +		obj, err = s.getFromUnpacked(h)
        +		if err == plumbing.ErrObjectNotFound {
        +			obj, err = s.getFromPackfile(h, false)
        +		}
         	}
         
         	// If the error is still object not found, check if it's a shared object
        @@ -182,10 +332,7 @@ func (s *ObjectStorage) EncodedObject(t plumbing.ObjectType, h plumbing.Hash) (p
         			// Create a new object storage with the DotGit(s) and check for the
         			// required hash object. Skip when not found.
         			for _, dg := range dotgits {
        -				o, oe := NewObjectStorage(dg)
        -				if oe != nil {
        -					continue
        -				}
        +				o := NewObjectStorage(dg, s.objectCache)
         				enobj, enerr := o.EncodedObject(t, h)
         				if enerr != nil {
         					continue
        @@ -235,9 +382,12 @@ func (s *ObjectStorage) getFromUnpacked(h plumbing.Hash) (obj plumbing.EncodedOb
         
         		return nil, err
         	}
        -
         	defer ioutil.CheckClose(f, &err)
         
        +	if cacheObj, found := s.objectCache.Get(h); found {
        +		return cacheObj, nil
        +	}
        +
         	obj = s.NewEncodedObject()
         	r, err := objfile.NewReader(f)
         	if err != nil {
        @@ -258,6 +408,8 @@ func (s *ObjectStorage) getFromUnpacked(h plumbing.Hash) (obj plumbing.EncodedOb
         		return nil, err
         	}
         
        +	s.objectCache.Put(obj)
        +
         	_, err = io.Copy(w, r)
         	return obj, err
         }
        @@ -276,31 +428,30 @@ func (s *ObjectStorage) getFromPackfile(h plumbing.Hash, canBeDelta bool) (
         		return nil, plumbing.ErrObjectNotFound
         	}
         
        -	f, err := s.dir.ObjectPack(pack)
        +	idx := s.index[pack]
        +	p, err := s.packfile(idx, pack)
         	if err != nil {
         		return nil, err
         	}
         
        -	if !s.options.KeepDescriptors {
        -		defer ioutil.CheckClose(f, &err)
        +	if !s.options.KeepDescriptors && s.options.MaxOpenDescriptors == 0 {
        +		defer ioutil.CheckClose(p, &err)
         	}
         
        -	idx := s.index[pack]
         	if canBeDelta {
        -		return s.decodeDeltaObjectAt(f, idx, offset, hash)
        +		return s.decodeDeltaObjectAt(p, offset, hash)
         	}
         
        -	return s.decodeObjectAt(f, idx, offset)
        +	return s.decodeObjectAt(p, offset)
         }
         
         func (s *ObjectStorage) decodeObjectAt(
        -	f billy.File,
        -	idx idxfile.Index,
        +	p *packfile.Packfile,
         	offset int64,
         ) (plumbing.EncodedObject, error) {
        -	hash, err := idx.FindHash(offset)
        +	hash, err := p.FindHash(offset)
         	if err == nil {
        -		obj, ok := s.deltaBaseCache.Get(hash)
        +		obj, ok := s.objectCache.Get(hash)
         		if ok {
         			return obj, nil
         		}
        @@ -310,32 +461,16 @@ func (s *ObjectStorage) decodeObjectAt(
         		return nil, err
         	}
         
        -	var p *packfile.Packfile
        -	if s.deltaBaseCache != nil {
        -		p = packfile.NewPackfileWithCache(idx, s.dir.Fs(), f, s.deltaBaseCache)
        -	} else {
        -		p = packfile.NewPackfile(idx, s.dir.Fs(), f)
        -	}
        -
         	return p.GetByOffset(offset)
         }
         
         func (s *ObjectStorage) decodeDeltaObjectAt(
        -	f billy.File,
        -	idx idxfile.Index,
        +	p *packfile.Packfile,
         	offset int64,
         	hash plumbing.Hash,
         ) (plumbing.EncodedObject, error) {
        -	if _, err := f.Seek(0, io.SeekStart); err != nil {
        -		return nil, err
        -	}
        -
        -	p := packfile.NewScanner(f)
        -	if _, err := p.SeekFromStart(offset); err != nil {
        -		return nil, err
        -	}
        -
        -	header, err := p.NextObjectHeader()
        +	scan := p.Scanner()
        +	header, err := scan.SeekObjectHeader(offset)
         	if err != nil {
         		return nil, err
         	}
        @@ -348,12 +483,12 @@ func (s *ObjectStorage) decodeDeltaObjectAt(
         	case plumbing.REFDeltaObject:
         		base = header.Reference
         	case plumbing.OFSDeltaObject:
        -		base, err = idx.FindHash(header.OffsetReference)
        +		base, err = p.FindHash(header.OffsetReference)
         		if err != nil {
         			return nil, err
         		}
         	default:
        -		return s.decodeObjectAt(f, idx, offset)
        +		return s.decodeObjectAt(p, offset)
         	}
         
         	obj := &plumbing.MemoryObject{}
        @@ -363,7 +498,7 @@ func (s *ObjectStorage) decodeDeltaObjectAt(
         		return nil, err
         	}
         
        -	if _, _, err := p.NextObject(w); err != nil {
        +	if _, _, err := scan.NextObject(w); err != nil {
         		return nil, err
         	}
         
        @@ -405,7 +540,10 @@ func (s *ObjectStorage) IterEncodedObjects(t plumbing.ObjectType) (storer.Encode
         	return storer.NewMultiEncodedObjectIter(iters), nil
         }
         
        -func (s *ObjectStorage) buildPackfileIters(t plumbing.ObjectType, seen map[plumbing.Hash]struct{}) (storer.EncodedObjectIter, error) {
        +func (s *ObjectStorage) buildPackfileIters(
        +	t plumbing.ObjectType,
        +	seen map[plumbing.Hash]struct{},
        +) (storer.EncodedObjectIter, error) {
         	if err := s.requireIndex(); err != nil {
         		return nil, err
         	}
        @@ -421,14 +559,30 @@ func (s *ObjectStorage) buildPackfileIters(t plumbing.ObjectType, seen map[plumb
         			if err != nil {
         				return nil, err
         			}
        -			return newPackfileIter(s.dir.Fs(), pack, t, seen, s.index[h], s.deltaBaseCache)
        +			return newPackfileIter(
        +				s.dir.Fs(), pack, t, seen, s.index[h],
        +				s.objectCache, s.options.KeepDescriptors,
        +			)
         		},
         	}, nil
         }
         
         // Close closes all opened files.
         func (s *ObjectStorage) Close() error {
        -	return s.dir.Close()
        +	var firstError error
        +	if s.options.KeepDescriptors || s.options.MaxOpenDescriptors > 0 {
        +		for _, packfile := range s.packfiles {
        +			err := packfile.Close()
        +			if firstError == nil && err != nil {
        +				firstError = err
        +			}
        +		}
        +	}
        +
        +	s.packfiles = nil
        +	s.dir.Close()
        +
        +	return firstError
         }
         
         type lazyPackfilesIter struct {
        @@ -482,16 +636,21 @@ type packfileIter struct {
         	pack billy.File
         	iter storer.EncodedObjectIter
         	seen map[plumbing.Hash]struct{}
        +
        +	// tells whether the pack file should be left open after iteration or not
        +	keepPack bool
         }
         
         // NewPackfileIter returns a new EncodedObjectIter for the provided packfile
         // and object type. Packfile and index file will be closed after they're
        -// used.
        +// used. If keepPack is true the packfile won't be closed after the iteration
        +// finished.
         func NewPackfileIter(
         	fs billy.Filesystem,
         	f billy.File,
         	idxFile billy.File,
         	t plumbing.ObjectType,
        +	keepPack bool,
         ) (storer.EncodedObjectIter, error) {
         	idx := idxfile.NewMemoryIndex()
         	if err := idxfile.NewDecoder(idxFile).Decode(idx); err != nil {
        @@ -502,7 +661,8 @@ func NewPackfileIter(
         		return nil, err
         	}
         
        -	return newPackfileIter(fs, f, t, make(map[plumbing.Hash]struct{}), idx, nil)
        +	seen := make(map[plumbing.Hash]struct{})
        +	return newPackfileIter(fs, f, t, seen, idx, nil, keepPack)
         }
         
         func newPackfileIter(
        @@ -512,6 +672,7 @@ func newPackfileIter(
         	seen map[plumbing.Hash]struct{},
         	index idxfile.Index,
         	cache cache.Object,
        +	keepPack bool,
         ) (storer.EncodedObjectIter, error) {
         	var p *packfile.Packfile
         	if cache != nil {
        @@ -526,9 +687,10 @@ func newPackfileIter(
         	}
         
         	return &packfileIter{
        -		pack: f,
        -		iter: iter,
        -		seen: seen,
        +		pack:     f,
        +		iter:     iter,
        +		seen:     seen,
        +		keepPack: keepPack,
         	}, nil
         }
         
        @@ -566,7 +728,9 @@ func (iter *packfileIter) ForEach(cb func(plumbing.EncodedObject) error) error {
         
         func (iter *packfileIter) Close() {
         	iter.iter.Close()
        -	_ = iter.pack.Close()
        +	if !iter.keepPack {
        +		_ = iter.pack.Close()
        +	}
         }
         
         type objectsIter struct {
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/storage.go b/vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/storage.go
        index 7fae7897c..88d1ed483 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/storage.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/storage.go
        @@ -2,6 +2,7 @@
         package filesystem
         
         import (
        +	"gopkg.in/src-d/go-git.v4/plumbing/cache"
         	"gopkg.in/src-d/go-git.v4/storage/filesystem/dotgit"
         
         	"gopkg.in/src-d/go-billy.v4"
        @@ -30,40 +31,35 @@ type Options struct {
         	// KeepDescriptors makes the file descriptors to be reused but they will
         	// need to be manually closed calling Close().
         	KeepDescriptors bool
        +	// MaxOpenDescriptors is the max number of file descriptors to keep
        +	// open. If KeepDescriptors is true, all file descriptors will remain open.
        +	MaxOpenDescriptors int
         }
         
        -// NewStorage returns a new Storage backed by a given `fs.Filesystem`
        -func NewStorage(fs billy.Filesystem) (*Storage, error) {
        -	return NewStorageWithOptions(fs, Options{})
        +// NewStorage returns a new Storage backed by a given `fs.Filesystem` and cache.
        +func NewStorage(fs billy.Filesystem, cache cache.Object) *Storage {
        +	return NewStorageWithOptions(fs, cache, Options{})
         }
         
        -// NewStorageWithOptions returns a new Storage backed by a given `fs.Filesystem`
        -func NewStorageWithOptions(
        -	fs billy.Filesystem,
        -	ops Options,
        -) (*Storage, error) {
        +// NewStorageWithOptions returns a new Storage with extra options,
        +// backed by a given `fs.Filesystem` and cache.
        +func NewStorageWithOptions(fs billy.Filesystem, cache cache.Object, ops Options) *Storage {
         	dirOps := dotgit.Options{
         		ExclusiveAccess: ops.ExclusiveAccess,
        -		KeepDescriptors: ops.KeepDescriptors,
         	}
        -
         	dir := dotgit.NewWithOptions(fs, dirOps)
        -	o, err := NewObjectStorageWithOptions(dir, ops)
        -	if err != nil {
        -		return nil, err
        -	}
         
         	return &Storage{
         		fs:  fs,
         		dir: dir,
         
        -		ObjectStorage:    o,
        +		ObjectStorage:    *NewObjectStorageWithOptions(dir, cache, ops),
         		ReferenceStorage: ReferenceStorage{dir: dir},
         		IndexStorage:     IndexStorage{dir: dir},
         		ShallowStorage:   ShallowStorage{dir: dir},
         		ConfigStorage:    ConfigStorage{dir: dir},
         		ModuleStorage:    ModuleStorage{dir: dir},
        -	}, nil
        +	}
         }
         
         // Filesystem returns the underlying filesystem
        @@ -71,6 +67,7 @@ func (s *Storage) Filesystem() billy.Filesystem {
         	return s.fs
         }
         
        +// Init initializes .git directory
         func (s *Storage) Init() error {
         	return s.dir.Initialize()
         }
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/storage/memory/storage.go b/vendor/gopkg.in/src-d/go-git.v4/storage/memory/storage.go
        index 2e3250905..f240f2a1f 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/storage/memory/storage.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/storage/memory/storage.go
        @@ -13,7 +13,6 @@ import (
         )
         
         var ErrUnsupportedObjectType = fmt.Errorf("unsupported object type")
        -var ErrRefHasChanged = fmt.Errorf("reference has changed concurrently")
         
         // Storage is an implementation of git.Storer that stores data on memory, being
         // ephemeral. The use of this storage should be done in controlled envoriments,
        @@ -122,6 +121,16 @@ func (o *ObjectStorage) HasEncodedObject(h plumbing.Hash) (err error) {
         	return nil
         }
         
        +func (o *ObjectStorage) EncodedObjectSize(h plumbing.Hash) (
        +	size int64, err error) {
        +	obj, ok := o.Objects[h]
        +	if !ok {
        +		return 0, plumbing.ErrObjectNotFound
        +	}
        +
        +	return obj.Size(), nil
        +}
        +
         func (o *ObjectStorage) EncodedObject(t plumbing.ObjectType, h plumbing.Hash) (plumbing.EncodedObject, error) {
         	obj, ok := o.Objects[h]
         	if !ok || (plumbing.AnyObject != t && obj.Type() != t) {
        @@ -248,7 +257,7 @@ func (r ReferenceStorage) CheckAndSetReference(ref, old *plumbing.Reference) err
         	if old != nil {
         		tmp := r[ref.Name()]
         		if tmp != nil && tmp.Hash() != old.Hash() {
        -			return ErrRefHasChanged
        +			return storage.ErrReferenceHasChanged
         		}
         	}
         	r[ref.Name()] = ref
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/storage/storer.go b/vendor/gopkg.in/src-d/go-git.v4/storage/storer.go
        index d1a94f2a7..5de0cfb96 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/storage/storer.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/storage/storer.go
        @@ -1,10 +1,14 @@
         package storage
         
         import (
        +	"errors"
        +
         	"gopkg.in/src-d/go-git.v4/config"
         	"gopkg.in/src-d/go-git.v4/plumbing/storer"
         )
         
        +var ErrReferenceHasChanged = errors.New("reference has changed concurrently")
        +
         // Storer is a generic storage of objects, references and any information
         // related to a particular repository. The package gopkg.in/src-d/go-git.v4/storage
         // contains two implementation a filesystem base implementation (such as `.git`)
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/utils/binary/read.go b/vendor/gopkg.in/src-d/go-git.v4/utils/binary/read.go
        index 50da1ff3e..12e57c300 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/utils/binary/read.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/utils/binary/read.go
        @@ -25,6 +25,10 @@ func Read(r io.Reader, data ...interface{}) error {
         
         // ReadUntil reads from r untin delim is found
         func ReadUntil(r io.Reader, delim byte) ([]byte, error) {
        +	if bufr, ok := r.(*bufio.Reader); ok {
        +		return ReadUntilFromBufioReader(bufr, delim)
        +	}
        +
         	var buf [1]byte
         	value := make([]byte, 0, 16)
         	for {
        @@ -44,6 +48,17 @@ func ReadUntil(r io.Reader, delim byte) ([]byte, error) {
         	}
         }
         
        +// ReadUntilFromBufioReader is like bufio.ReadBytes but drops the delimiter
        +// from the result.
        +func ReadUntilFromBufioReader(r *bufio.Reader, delim byte) ([]byte, error) {
        +	value, err := r.ReadBytes(delim)
        +	if err != nil || len(value) == 0 {
        +		return nil, err
        +	}
        +
        +	return value[:len(value)-1], nil
        +}
        +
         // ReadVariableWidthInt reads and returns an int in Git VLQ special format:
         //
         // Ordinary VLQ has some redundancies, example:  the number 358 can be
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/utils/diff/diff.go b/vendor/gopkg.in/src-d/go-git.v4/utils/diff/diff.go
        index f49ae55ba..6142ed051 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/utils/diff/diff.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/utils/diff/diff.go
        @@ -8,14 +8,30 @@ package diff
         
         import (
         	"bytes"
        +	"time"
         
         	"github.com/sergi/go-diff/diffmatchpatch"
         )
         
         // Do computes the (line oriented) modifications needed to turn the src
        -// string into the dst string.
        +// string into the dst string. The underlying algorithm is Meyers,
        +// its complexity is O(N*d) where N is min(lines(src), lines(dst)) and d
        +// is the size of the diff.
         func Do(src, dst string) (diffs []diffmatchpatch.Diff) {
        +	// the default timeout is time.Second which may be too small under heavy load
        +	return DoWithTimeout(src, dst, time.Hour)
        +}
        +
        +// DoWithTimeout computes the (line oriented) modifications needed to turn the src
        +// string into the dst string. The `timeout` argument specifies the maximum
        +// amount of time it is allowed to spend in this function. If the timeout
        +// is exceeded, the parts of the strings which were not considered are turned into
        +// a bulk delete+insert and the half-baked suboptimal result is returned at once.
        +// The underlying algorithm is Meyers, its complexity is O(N*d) where N is
        +// min(lines(src), lines(dst)) and d is the size of the diff.
        +func DoWithTimeout (src, dst string, timeout time.Duration) (diffs []diffmatchpatch.Diff) {
         	dmp := diffmatchpatch.New()
        +	dmp.DiffTimeout = timeout
         	wSrc, wDst, warray := dmp.DiffLinesToRunes(src, dst)
         	diffs = dmp.DiffMainRunes(wSrc, wDst, false)
         	diffs = dmp.DiffCharsToLines(diffs, warray)
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/utils/merkletrie/noder/path.go b/vendor/gopkg.in/src-d/go-git.v4/utils/merkletrie/noder/path.go
        index e9c905c96..1c7ef54ee 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/utils/merkletrie/noder/path.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/utils/merkletrie/noder/path.go
        @@ -3,8 +3,6 @@ package noder
         import (
         	"bytes"
         	"strings"
        -
        -	"golang.org/x/text/unicode/norm"
         )
         
         // Path values represent a noder and its ancestors.  The root goes first
        @@ -80,11 +78,9 @@ func (p Path) Compare(other Path) int {
         		case i == len(p):
         			return -1
         		default:
        -			form := norm.Form(norm.NFC)
        -			this := form.String(p[i].Name())
        -			that := form.String(other[i].Name())
        -
        -			cmp := strings.Compare(this, that)
        +			// We do *not* normalize Unicode here. CGit doesn't.
        +			// https://github.com/src-d/go-git/issues/1057
        +			cmp := strings.Compare(p[i].Name(), other[i].Name())
         			if cmp != 0 {
         				return cmp
         			}
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/worktree.go b/vendor/gopkg.in/src-d/go-git.v4/worktree.go
        index e45d81548..4a609e9ea 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/worktree.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/worktree.go
        @@ -9,6 +9,7 @@ import (
         	"os"
         	"path/filepath"
         	"strings"
        +	"sync"
         
         	"gopkg.in/src-d/go-git.v4/config"
         	"gopkg.in/src-d/go-git.v4/plumbing"
        @@ -25,10 +26,11 @@ import (
         )
         
         var (
        -	ErrWorktreeNotClean  = errors.New("worktree is not clean")
        -	ErrSubmoduleNotFound = errors.New("submodule not found")
        -	ErrUnstagedChanges   = errors.New("worktree contains unstaged changes")
        -	ErrGitModulesSymlink = errors.New(gitmodulesFile + " is a symlink")
        +	ErrWorktreeNotClean     = errors.New("worktree is not clean")
        +	ErrSubmoduleNotFound    = errors.New("submodule not found")
        +	ErrUnstagedChanges      = errors.New("worktree contains unstaged changes")
        +	ErrGitModulesSymlink    = errors.New(gitmodulesFile + " is a symlink")
        +	ErrNonFastForwardUpdate = errors.New("non-fast-forward update")
         )
         
         // Worktree represents a git worktree.
        @@ -101,7 +103,7 @@ func (w *Worktree) PullContext(ctx context.Context, o *PullOptions) error {
         		}
         
         		if !ff {
        -			return fmt.Errorf("non-fast-forward update")
        +			return ErrNonFastForwardUpdate
         		}
         	}
         
        @@ -151,17 +153,6 @@ func (w *Worktree) Checkout(opts *CheckoutOptions) error {
         		}
         	}
         
        -	if !opts.Force {
        -		unstaged, err := w.containsUnstagedChanges()
        -		if err != nil {
        -			return err
        -		}
        -
        -		if unstaged {
        -			return ErrUnstagedChanges
        -		}
        -	}
        -
         	c, err := w.getCommitFromCheckoutOptions(opts)
         	if err != nil {
         		return err
        @@ -170,6 +161,8 @@ func (w *Worktree) Checkout(opts *CheckoutOptions) error {
         	ro := &ResetOptions{Commit: c, Mode: MergeReset}
         	if opts.Force {
         		ro.Mode = HardReset
        +	} else if opts.Keep {
        +		ro.Mode = SoftReset
         	}
         
         	if !opts.Hash.IsZero() && !opts.Create {
        @@ -312,6 +305,7 @@ func (w *Worktree) resetIndex(t *object.Tree) error {
         	if err != nil {
         		return err
         	}
        +	b := newIndexBuilder(idx)
         
         	changes, err := w.diffTreeWithStaging(t, true)
         	if err != nil {
        @@ -338,12 +332,12 @@ func (w *Worktree) resetIndex(t *object.Tree) error {
         			name = ch.From.String()
         		}
         
        -		_, _ = idx.Remove(name)
        +		b.Remove(name)
         		if e == nil {
         			continue
         		}
         
        -		idx.Entries = append(idx.Entries, &index.Entry{
        +		b.Add(&index.Entry{
         			Name: name,
         			Hash: e.Hash,
         			Mode: e.Mode,
        @@ -351,6 +345,7 @@ func (w *Worktree) resetIndex(t *object.Tree) error {
         
         	}
         
        +	b.Write(idx)
         	return w.r.Storer.SetIndex(idx)
         }
         
        @@ -364,17 +359,19 @@ func (w *Worktree) resetWorktree(t *object.Tree) error {
         	if err != nil {
         		return err
         	}
        +	b := newIndexBuilder(idx)
         
         	for _, ch := range changes {
        -		if err := w.checkoutChange(ch, t, idx); err != nil {
        +		if err := w.checkoutChange(ch, t, b); err != nil {
         			return err
         		}
         	}
         
        +	b.Write(idx)
         	return w.r.Storer.SetIndex(idx)
         }
         
        -func (w *Worktree) checkoutChange(ch merkletrie.Change, t *object.Tree, idx *index.Index) error {
        +func (w *Worktree) checkoutChange(ch merkletrie.Change, t *object.Tree, idx *indexBuilder) error {
         	a, err := ch.Action()
         	if err != nil {
         		return err
        @@ -453,7 +450,7 @@ func (w *Worktree) setHEADCommit(commit plumbing.Hash) error {
         func (w *Worktree) checkoutChangeSubmodule(name string,
         	a merkletrie.Action,
         	e *object.TreeEntry,
        -	idx *index.Index,
        +	idx *indexBuilder,
         ) error {
         	switch a {
         	case merkletrie.Modify:
        @@ -487,11 +484,11 @@ func (w *Worktree) checkoutChangeRegularFile(name string,
         	a merkletrie.Action,
         	t *object.Tree,
         	e *object.TreeEntry,
        -	idx *index.Index,
        +	idx *indexBuilder,
         ) error {
         	switch a {
         	case merkletrie.Modify:
        -		_, _ = idx.Remove(name)
        +		idx.Remove(name)
         
         		// to apply perm changes the file is deleted, billy doesn't implement
         		// chmod
        @@ -516,6 +513,12 @@ func (w *Worktree) checkoutChangeRegularFile(name string,
         	return nil
         }
         
        +var copyBufferPool = sync.Pool{
        +	New: func() interface{} {
        +		return make([]byte, 32*1024)
        +	},
        +}
        +
         func (w *Worktree) checkoutFile(f *object.File) (err error) {
         	mode, err := f.Mode.ToOSFileMode()
         	if err != nil {
        @@ -539,8 +542,9 @@ func (w *Worktree) checkoutFile(f *object.File) (err error) {
         	}
         
         	defer ioutil.CheckClose(to, &err)
        -
        -	_, err = io.Copy(to, from)
        +	buf := copyBufferPool.Get().([]byte)
        +	_, err = io.CopyBuffer(to, from, buf)
        +	copyBufferPool.Put(buf)
         	return
         }
         
        @@ -577,19 +581,18 @@ func (w *Worktree) checkoutFileSymlink(f *object.File) (err error) {
         	return
         }
         
        -func (w *Worktree) addIndexFromTreeEntry(name string, f *object.TreeEntry, idx *index.Index) error {
        -	_, _ = idx.Remove(name)
        -	idx.Entries = append(idx.Entries, &index.Entry{
        +func (w *Worktree) addIndexFromTreeEntry(name string, f *object.TreeEntry, idx *indexBuilder) error {
        +	idx.Remove(name)
        +	idx.Add(&index.Entry{
         		Hash: f.Hash,
         		Name: name,
         		Mode: filemode.Submodule,
         	})
        -
         	return nil
         }
         
        -func (w *Worktree) addIndexFromFile(name string, h plumbing.Hash, idx *index.Index) error {
        -	_, _ = idx.Remove(name)
        +func (w *Worktree) addIndexFromFile(name string, h plumbing.Hash, idx *indexBuilder) error {
        +	idx.Remove(name)
         	fi, err := w.Filesystem.Lstat(name)
         	if err != nil {
         		return err
        @@ -613,8 +616,7 @@ func (w *Worktree) addIndexFromFile(name string, h plumbing.Hash, idx *index.Ind
         	if fillSystemInfo != nil {
         		fillSystemInfo(e, fi.Sys())
         	}
        -
        -	idx.Entries = append(idx.Entries, e)
        +	idx.Add(e)
         	return nil
         }
         
        @@ -730,7 +732,7 @@ func (w *Worktree) Clean(opts *CleanOptions) error {
         
         func (w *Worktree) doClean(status Status, opts *CleanOptions, dir string, files []os.FileInfo) error {
         	for _, fi := range files {
        -		if fi.Name() == ".git" {
        +		if fi.Name() == GitDirName {
         			continue
         		}
         
        @@ -921,3 +923,32 @@ func doCleanDirectories(fs billy.Filesystem, dir string) error {
         	}
         	return nil
         }
        +
        +type indexBuilder struct {
        +	entries map[string]*index.Entry
        +}
        +
        +func newIndexBuilder(idx *index.Index) *indexBuilder {
        +	entries := make(map[string]*index.Entry, len(idx.Entries))
        +	for _, e := range idx.Entries {
        +		entries[e.Name] = e
        +	}
        +	return &indexBuilder{
        +		entries: entries,
        +	}
        +}
        +
        +func (b *indexBuilder) Write(idx *index.Index) {
        +	idx.Entries = idx.Entries[:0]
        +	for _, e := range b.entries {
        +		idx.Entries = append(idx.Entries, e)
        +	}
        +}
        +
        +func (b *indexBuilder) Add(e *index.Entry) {
        +	b.entries[e.Name] = e
        +}
        +
        +func (b *indexBuilder) Remove(name string) {
        +	delete(b.entries, filepath.ToSlash(name))
        +}
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/worktree_bsd.go b/vendor/gopkg.in/src-d/go-git.v4/worktree_bsd.go
        index 3b374c77b..9ff670e0f 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/worktree_bsd.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/worktree_bsd.go
        @@ -1,4 +1,4 @@
        -// +build darwin freebsd netbsd openbsd
        +// +build darwin freebsd netbsd
         
         package git
         
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/worktree_status.go b/vendor/gopkg.in/src-d/go-git.v4/worktree_status.go
        index 0e113d093..16ce93707 100644
        --- a/vendor/gopkg.in/src-d/go-git.v4/worktree_status.go
        +++ b/vendor/gopkg.in/src-d/go-git.v4/worktree_status.go
        @@ -142,12 +142,16 @@ func (w *Worktree) diffStagingWithWorktree(reverse bool) (merkletrie.Changes, er
         
         func (w *Worktree) excludeIgnoredChanges(changes merkletrie.Changes) merkletrie.Changes {
         	patterns, err := gitignore.ReadPatterns(w.Filesystem, nil)
        -	if err != nil || len(patterns) == 0 {
        +	if err != nil {
         		return changes
         	}
         
         	patterns = append(patterns, w.Excludes...)
         
        +	if len(patterns) == 0 {
        +		return changes
        +	}
        +
         	m := gitignore.NewMatcher(patterns)
         
         	var res merkletrie.Changes
        diff --git a/vendor/gopkg.in/src-d/go-git.v4/worktree_unix_other.go b/vendor/gopkg.in/src-d/go-git.v4/worktree_unix_other.go
        new file mode 100644
        index 000000000..d63276766
        --- /dev/null
        +++ b/vendor/gopkg.in/src-d/go-git.v4/worktree_unix_other.go
        @@ -0,0 +1,26 @@
        +// +build openbsd dragonfly solaris
        +
        +package git
        +
        +import (
        +	"syscall"
        +	"time"
        +
        +	"gopkg.in/src-d/go-git.v4/plumbing/format/index"
        +)
        +
        +func init() {
        +	fillSystemInfo = func(e *index.Entry, sys interface{}) {
        +		if os, ok := sys.(*syscall.Stat_t); ok {
        +			e.CreatedAt = time.Unix(int64(os.Atim.Sec), int64(os.Atim.Nsec))
        +			e.Dev = uint32(os.Dev)
        +			e.Inode = uint32(os.Ino)
        +			e.GID = os.Gid
        +			e.UID = os.Uid
        +		}
        +	}
        +}
        +
        +func isSymlinkWindowsNonAdmin(err error) bool {
        +	return false
        +}
        diff --git a/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/assets/bindata.go b/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/assets/bindata.go
        deleted file mode 100644
        index 7c3a4c9b1..000000000
        --- a/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/assets/bindata.go
        +++ /dev/null
        @@ -1,281 +0,0 @@
        -// Code generated by go-bindata.
        -// sources:
        -// licenses.tar
        -// urls.csv
        -// names.csv
        -// DO NOT EDIT!
        -
        -package assets
        -
        -import (
        -	"bytes"
        -	"compress/gzip"
        -	"fmt"
        -	"io"
        -	"io/ioutil"
        -	"os"
        -	"path/filepath"
        -	"strings"
        -	"time"
        -)
        -
        -func bindataRead(data []byte, name string) ([]byte, error) {
        -	gz, err := gzip.NewReader(bytes.NewBuffer(data))
        -	if err != nil {
        -		return nil, fmt.Errorf("Read %q: %v", name, err)
        -	}
        -
        -	var buf bytes.Buffer
        -	_, err = io.Copy(&buf, gz)
        -	clErr := gz.Close()
        -
        -	if err != nil {
        -		return nil, fmt.Errorf("Read %q: %v", name, err)
        -	}
        -	if clErr != nil {
        -		return nil, err
        -	}
        -
        -	return buf.Bytes(), nil
        -}
        -
        -type asset struct {
        -	bytes []byte
        -	info  os.FileInfo
        -}
        -
        -type bindataFileInfo struct {
        -	name    string
        -	size    int64
        -	mode    os.FileMode
        -	modTime time.Time
        -}
        -
        -func (fi bindataFileInfo) Name() string {
        -	return fi.name
        -}
        -func (fi bindataFileInfo) Size() int64 {
        -	return fi.size
        -}
        -func (fi bindataFileInfo) Mode() os.FileMode {
        -	return fi.mode
        -}
        -func (fi bindataFileInfo) ModTime() time.Time {
        -	return fi.modTime
        -}
        -func (fi bindataFileInfo) IsDir() bool {
        -	return false
        -}
        -func (fi bindataFileInfo) Sys() interface{} {
        -	return nil
        -}
        -
        -var _licensesTar = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7d\x73\xdb\x48\x92\x3f\x88\xcf\xdf\x7e\x15\x15\x8c\xdf\x2f\x5a\x8c\x80\xd8\x92\xec\xb6\xa7\xdb\x17\x17\x47\x4b\x94\xcd\x59\x89\xd4\x97\xa4\xec\xf1\x6d\x6c\xcc\x16\x81\x22\x59\x63\x10\xc5\x41\x01\x92\x39\xaf\xe7\xee\x8d\xdc\xbd\xb1\x8b\xca\xcc\x7a\x02\x40\x3d\xf4\xb8\x7b\x66\x77\xad\x88\x89\x71\x4b\x40\xa1\x2a\x2b\x2b\x2b\x1f\x3f\x39\xf8\xf1\x0f\xbf\xf9\xcf\xc9\xc9\xc9\xc9\x9b\x9f\x7e\x32\xff\x7f\xfa\xe6\xa7\x93\xf0\xff\xed\xcf\x1f\x4e\x5f\x9e\x9d\x9d\x9d\x9c\x9c\x9d\xfe\xf4\xe6\x0f\x27\xa7\x27\xa7\xaf\xdf\xfc\x81\xfd\xf4\xdb\x4f\xed\x0f\x7f\xa8\x75\xc5\x4b\xc6\xfe\x70\xc7\x33\xb9\x7d\xe0\xb9\xc7\xfe\xfe\x5f\xf4\x67\xf0\xe3\x74\x7e\x75\x7c\x3a\x38\x1d\x54\x5f\xab\xdf\xe8\x1b\x66\x83\x5f\xbf\x7a\x75\x60\xff\xcf\xce\xde\x9c\xfd\xd4\xd8\xff\xd3\xd7\x6f\xce\xfe\xc0\x4e\x7e\xa3\xf9\x44\x3f\xff\xc3\xf7\x7f\xb1\x11\x6c\xba\x13\x05\x9b\xab\x55\x75\xcf\x4b\xc1\xae\x64\x2a\x0a\x2d\xd8\xdd\x80\x9d\x0e\x4e\x5f\x2c\x36\x52\x1f\x78\xe2\xa8\xda\x08\xd6\xa3\xff\xea\xf5\x19\xdf\xed\x72\x29\x34\xab\x14\xe3\xc5\x9e\xa9\x52\xae\x65\xc1\x73\x76\xaf\xca\x2f\x4c\xad\x18\xaf\xab\x8d\x2a\xf5\x46\xee\xe8\xd5\xa9\x7d\xe2\x93\x2a\xbf\xf4\xfa\xec\x7e\xa3\xb4\x60\xea\xbe\x10\x65\x34\xb8\x2a\x7b\x7d\xb6\xe1\x9a\xed\x72\x9e\x8a\x8c\x99\x3f\xad\x54\x9e\xab\x7b\x59\xac\x59\xa1\x2a\x99\x0a\x26\xb7\x5b\x91\x49\x5e\x89\x7c\x1f\xfc\xd1\x3c\x9a\xaa\xdd\xbe\x94\xeb\x4d\x65\x1f\x5d\xa9\x12\xfe\x10\x7d\xff\x97\x17\xb4\x92\x8c\xd5\x45\x26\xe8\x89\x6e\xd2\x88\x52\x4b\x55\x00\x7d\x18\x63\xa7\x7d\xf6\xbe\xe4\x45\x65\xd6\x78\xee\xbe\x45\x0f\x0f\x98\x5d\x03\xdb\x88\x52\x2c\xf7\x6c\x6d\x9e\xd5\xec\xb3\xaa\x19\x37\xb4\xc9\xb3\xe3\x7b\x99\x89\x84\x95\x6a\xcf\xf3\x6a\x7f\xbc\x2a\x85\x48\x58\xa1\x8a\x63\xf1\x35\xcd\x6b\x2d\xef\x44\xc2\x76\xa2\xdc\x89\xaa\xe6\x39\xfe\x45\xd7\xcb\x1c\x3f\xc0\x97\xb9\x60\xf4\x6f\x43\xfa\x4c\xc5\xf4\xf9\xc5\x4c\x91\x31\xc6\xfb\xe6\xaf\xa5\xd8\x95\x2a\xab\x53\xd1\x26\x00\x93\x85\x21\x95\x14\xfa\x2d\xbd\xb2\x84\x57\x76\xa5\xd8\x99\xd5\x67\xa2\x94\x77\xbc\x92\x77\x02\x76\x54\xb3\xa3\xde\x85\xff\x95\x19\x41\xf7\xfa\x6c\xc9\x81\x82\x3b\x55\xb4\xbf\x60\xc7\x4d\x61\xdc\x4c\xea\xaa\x94\xcb\xba\x12\xf4\x59\x43\xbf\xf6\xac\x78\x91\xb1\xe6\x77\xcc\xeb\xe6\xc9\x1d\x50\x21\x61\xf7\xb2\xda\xe0\x2f\x4a\x75\x27\xb5\xf9\x23\xaf\x82\x51\xe3\x11\x55\xd9\x31\xa0\x79\xc1\x6c\x49\x30\x2b\xbd\xe1\x79\xce\x96\x8e\xba\x8f\x32\x86\x5d\x5f\x86\x74\x13\xe5\x4a\x95\xdb\x8e\x25\xe1\xb4\xf3\xfd\x5b\xb3\x38\x7a\x47\x58\x9a\xec\x72\xbe\x7f\xe0\x9d\x81\x79\xfe\x2c\xe0\xb8\x1b\x5e\x89\xe2\x9f\xc3\x6e\x09\x11\x64\x87\x53\x48\x73\x2e\xb7\x1a\xce\x6f\x66\x88\x9c\xaa\xa2\x2a\x55\x9e\x8b\x8c\x2d\x71\x49\x6e\x6e\x40\x6e\x43\x39\xb1\x5d\xaa\x4c\x8a\xcc\x30\x5f\xc7\xde\x6b\xb6\xaa\xcb\x42\xea\x4d\xc7\x18\x47\x3d\x77\x60\xcf\xe1\xcb\x3d\x20\xe1\x96\x7f\x31\x13\x33\xb3\xd3\x22\xcf\x81\x7f\xd4\x6a\x25\x4a\x38\xf6\x9a\xe7\x1d\xac\xff\xfb\x1e\x52\xcf\x45\x8d\x05\x3c\x71\xfa\x4d\xe6\x05\x96\x78\x19\xb0\xc4\x5c\xd5\x65\x2a\xd8\xb9\xca\x84\xe7\x0b\x23\xe9\x2b\x51\x6e\x59\x2f\xf8\x73\x8f\x6d\x05\x2f\x34\x9d\x1d\xb1\x12\x65\x29\x32\x06\x6c\xdb\x79\x18\xcd\x1c\xb6\xfc\x8b\x91\xac\x5b\x95\xc9\x95\x4c\x79\x25\x55\x01\x33\x97\x15\x4c\xd6\x9c\x19\x7e\xc7\x65\x0e\x6b\xce\x54\x5a\x6f\x45\x51\xc1\x63\x2c\x13\x3a\x2d\xe5\xd2\xbc\xbe\x51\xf7\xb0\x5c\x33\x4a\x07\xbf\xb7\x77\x84\xaf\x4b\x81\x97\x0b\x1c\xf2\x4c\x30\xce\xb6\x3c\xdd\xc8\x42\x1c\x97\x82\x67\xf0\x39\x23\xea\xed\xcc\x43\x2a\x74\x4b\x96\x5c\x15\x6b\x94\x1d\x82\xa7\x9b\xe8\xe5\xf8\x49\x60\x57\x37\x21\x2f\x22\x74\x30\xcd\x52\x68\x51\xde\x09\xa4\x25\x5e\x01\x95\x62\x9a\x57\x52\xc3\x02\xa5\x66\x6a\x99\xcb\x35\x52\x62\xb9\x87\xcb\xcc\x50\xe2\x19\xcb\x90\x05\xe3\x05\x93\x85\xd9\x20\x1c\xa7\x14\x3b\xa5\x65\xa5\xca\x3d\x2b\x05\xd7\xaa\xe0\xcb\x7c\xcf\x52\x9e\xa7\x75\xce\x2b\x73\x57\x82\x20\xda\xca\x8a\xc9\x42\x7c\xdd\x89\xc2\x70\x2a\x6c\x54\xaa\x8a\x3b\x51\x48\x73\x72\x79\x9a\x0a\xad\xcd\xa4\x0c\xc3\x9b\x4d\xe6\x9a\x01\x75\xb8\xf6\x2b\x34\xe7\x59\x16\x35\x6e\x42\x20\x27\x5b\xf4\x4a\x60\x7c\xb3\x44\x73\x00\xf4\xc6\x5e\xc4\x3c\xcb\x4a\xf3\x1d\x58\x19\xaf\x0e\x2d\xc4\xac\xf2\x57\xdc\xea\x28\x53\xbc\x0e\xd2\xe6\x29\x73\x4e\x5e\xf5\xd9\x08\x0f\xac\x61\xdb\xcb\x52\x6d\xdd\xb5\x0e\xe7\x67\xc0\x26\xaa\x82\x19\x83\x44\x92\xda\xfd\xd9\x5d\x07\x99\x10\x5b\xa4\x2c\x48\x09\x50\x76\x60\x26\xf8\xd9\x92\x67\x62\xcb\xcb\x2f\x3a\xf1\x73\xd4\x09\x09\x49\x9d\xe0\x03\x4c\x8b\xb4\x14\x95\x36\x72\x12\x94\xa5\x6a\x23\x4a\x26\x8b\x4a\xe4\xb9\x48\x8d\x08\x31\x6c\xbe\x13\x65\x05\x8c\xe0\xf6\x40\x7c\x4d\xc5\xae\x32\xdb\x22\xbe\xee\x0c\x31\xf3\x3d\xd3\x15\xec\xb4\x39\x27\xb2\x30\xf3\xb7\x02\xd9\x0a\x1c\xa9\x71\xa6\x38\xe9\xa6\x84\x51\x25\x09\x18\xc3\xae\xe6\x17\x28\x93\xcd\xa9\x85\xad\x32\xd3\x6b\x48\x78\x98\x6c\xb5\xe1\x45\xa7\x14\xcb\xc4\x4a\x16\x28\xd2\xe7\x22\x85\xdd\x3d\x83\x69\xe1\x76\xc5\xb3\x31\x03\x78\x92\xc5\x6b\xbd\x13\x05\x93\x2b\xa6\xeb\x74\xc3\xf0\xcf\xe6\xca\x90\x45\x9a\xd7\xd9\x81\x2b\xe3\x09\xdb\x67\x88\x5c\xee\x4a\x61\x4f\x47\xa9\x36\x72\x29\x83\xf3\xbd\x32\x4c\x81\xb4\x33\x03\xa1\xb8\xce\xa4\xa1\x91\x21\x82\x11\xa2\x1a\x1f\x8a\x3e\x60\xe8\xf4\x90\xd8\x00\xaa\xdd\x4b\x6d\xd4\xa7\x3a\xcf\xd8\x86\x9b\x83\xe8\x45\x05\xed\x16\x70\xe9\x4f\x86\x4b\x2b\x51\x9a\xa1\x2e\xc4\x2e\x57\x7b\xb3\x1d\xa1\x10\xef\xf8\x73\x28\xcc\x6b\xa3\x48\x07\xa2\xca\x6c\x42\xa7\x68\xeb\x52\x86\x40\xcc\xec\xd9\x3d\xdf\x23\xed\x61\x1d\x4f\x7b\x75\xcb\xf7\x86\xc6\xb5\xc6\x0b\x9b\x17\x7b\x55\x88\x90\x61\x3e\xab\x3a\x61\xf7\x1b\x41\xbf\x79\xca\x98\xa0\x7c\x3a\x71\x43\x5c\x63\x2c\x85\x9d\x28\xb5\x39\xc5\x70\x29\x99\x0b\xc1\x5d\x3b\x5c\x1b\x41\x09\xc2\x00\x6f\x28\xd8\xf5\x22\xc3\xcb\x0d\xa9\x73\x27\x4a\xc6\x59\xaa\xb6\xbb\xba\x12\x25\x2b\x44\x75\x0f\x0c\x34\x84\x77\xe9\x78\x19\xa1\x97\x49\x18\xc1\x5a\x0d\xa4\x1a\xa8\x95\x3b\x5f\xe6\xe4\x01\x97\x24\xa8\x30\x98\x9b\x8a\xc4\x51\xb1\xef\xda\x48\x2b\x69\xcd\xe9\x6a\xae\xb7\x25\x67\x78\xbc\x8b\x46\xb4\xb6\x35\x53\x63\x73\xe5\x79\xa0\x5a\x20\x97\xc2\x96\x7b\x1e\x4d\x0c\x61\xcc\xba\xcc\x2d\x8c\x27\x48\xd3\x09\x3d\x3d\x4a\xfb\x56\x84\x18\x0e\x7c\xdd\x67\xc3\xca\x7f\x75\x06\x52\x6c\x00\xb3\xde\xd6\xba\x62\xa5\xa8\xb8\x2c\x12\x7b\x08\x1b\x97\xad\x59\xf7\x61\x1d\x3b\x2d\x05\xaf\xcc\x64\xf2\xdc\x8b\x48\x2b\x21\xcd\x6e\x3a\x81\x40\xb2\xdd\x1d\xb7\xc7\x6f\x75\x58\xe2\x3d\x68\x4e\x1a\xa6\x61\x47\x70\xfb\x05\x77\xae\x51\x54\x8a\x3d\x29\x24\x3b\x98\x64\x25\xbe\x56\x4c\x66\xa2\xa8\xe4\x4a\xa2\x95\x69\xa8\x41\xbc\xd4\x0b\xa9\x31\x81\x31\x07\x3d\x4f\x8e\x94\x1b\x9e\x6a\x4e\x70\x45\xd2\xfd\x31\x52\x98\xed\x4b\x79\x59\xee\x19\x37\xf2\x68\x2b\x0b\x43\x88\xf6\x17\x0f\xdf\xf1\x78\x95\xb2\x52\xa4\x72\x27\x41\x72\xbb\x4f\x80\x9c\x41\x6d\x8d\x6c\xe7\xf6\xad\xf8\xa6\xcf\x3e\xf1\xd2\x30\xf6\x1e\x0d\x2e\xa9\x41\xd6\x0b\x73\x37\xb8\x3f\x05\xda\xce\x3d\xfe\x4a\x7b\xd9\xe0\xef\x63\x89\x4c\xda\x75\x05\x1b\xe1\x8f\xf6\x41\x53\x9b\xb7\x46\x41\xe7\x2b\xe1\xe9\x5f\xee\xfd\x4b\xc8\xee\x9c\xdd\xf1\x5c\x66\x2c\xad\xcb\x32\xbc\xf6\x1c\xcf\xf8\xa9\x81\x6f\x61\x60\x34\x80\x43\xb7\x28\xf1\x73\xa8\x77\xec\x4a\x95\x0a\x91\x19\xbe\xd1\xc2\x88\x91\x54\x24\xdd\xf3\x24\xcd\xd4\x1b\x8a\xc1\xf5\x00\x47\x97\xf5\x86\x73\x36\x9e\xf7\xd8\xbb\xe1\x7c\x3c\x07\x32\x7d\x1a\x2f\x3e\x4c\x6f\x17\xec\xd3\x70\x36\x1b\x4e\x16\x9f\x13\x26\x24\x08\x47\x2b\x81\x54\xc9\xe4\xd6\x68\x35\x59\x42\x77\x9f\x2c\xd6\x68\xf3\xaa\xda\xac\x76\x2b\x51\xbd\xc6\x49\xd1\xce\x90\xe5\x3b\x99\x4e\x8e\xc7\x93\xcb\xd9\x78\xf2\x7e\x74\x3d\x9a\x2c\x12\x76\x3d\x9a\x9d\x7f\x18\x4e\x16\xc3\x77\xe3\xab\xf1\xe2\xb3\x19\xfe\x72\xbc\x98\x8c\xe6\x73\x76\x39\x9d\xb1\x21\xbb\x19\xce\x16\xe3\xf3\xdb\xab\xe1\x8c\xdd\xdc\xce\x6e\xa6\xf3\xd1\x80\x2d\x3e\x8c\xd8\x68\xb2\x18\xcf\x46\x6c\x36\x9e\xff\x1b\x1b\xce\xd9\x62\x0a\xbf\xfd\x5f\xb7\x43\x18\x66\x7a\x09\xff\x39\x9d\x8d\xdf\x8f\x27\xc3\x2b\xf6\x69\x3a\xfb\x37\x36\x9e\xc3\xf2\xd8\xe7\xe9\xad\xb9\xbb\xa4\x66\x17\xe3\xf9\xf9\xd5\x70\x7c\x3d\x9a\x99\x37\xec\x9a\x8d\x94\xd5\x95\xac\x8c\x4a\x0d\xc2\x57\x1b\x42\x4b\xa3\x04\xf1\xb2\x6a\x4a\x31\xd0\x25\x02\x8f\x47\x6b\x1b\xac\x7a\xe1\xe4\xb2\x55\x9b\x82\x6d\xc9\x1c\x87\xc3\x01\xf8\x63\x9f\x5d\x39\x42\xa2\x16\xc2\x97\x32\x97\x86\xe9\x6f\xe1\xad\x42\xb1\x54\x96\x69\xbd\xd5\x15\x2f\x52\x98\xa7\xdd\xe7\x42\xb1\x5c\xac\x79\x6e\xe8\xaf\xca\xbd\xbf\xdf\x0c\x33\xa9\xb2\x62\x47\x6e\xdf\x58\x21\xd6\xb9\x5c\x1b\x1e\xea\x27\x68\x21\xf3\xb4\x4a\x58\xa8\x1f\x24\x24\xdf\xa3\xf3\x01\xc2\x1e\xee\x36\x72\xaf\xe1\xe5\xe7\x44\x4c\x26\x4b\x61\x06\x92\x85\xfd\x97\xde\x89\x54\x1a\x53\x54\x16\x29\x88\x35\xf3\x6f\x54\xe3\xb5\xf8\x5b\x4d\x04\xce\xf8\x96\xaf\x85\x53\xf4\xd2\x0d\x37\x13\x32\xa7\xaa\x94\x28\x2a\xb5\x51\x52\x84\xae\xf3\xd6\x46\x30\xba\x11\xe1\x3a\xed\x52\x2e\x1e\x61\x57\xfb\x6d\xb3\x86\x5c\xa1\x61\xb0\x56\x2a\xbb\x97\x79\x9e\xa0\xdb\x50\x57\x6a\xb7\xe3\x6b\x91\xf8\x8b\x7a\xc5\x65\x5e\x97\x02\x6f\xfd\x7c\x55\x17\x29\x8e\x46\x84\xb0\x36\x28\xea\x1c\xa9\xda\x6e\x45\x99\x46\x2b\xc5\x8f\x19\xe3\x0d\x58\x32\x8f\xf6\x3d\xb7\xfb\x4e\x9b\x50\x28\x34\x2a\xf6\xa8\xa2\xd9\x3f\x9a\x29\x67\x82\x57\x1b\x33\x1c\x6e\x05\xcf\x99\x2c\xfe\x5a\x83\x25\x66\xa8\x65\x88\xb7\xf2\xf6\x85\x2a\x7f\xd0\xc1\xee\x5b\xf1\x28\xbe\xc2\xa5\x47\xaa\x0a\xb8\x09\xf8\xbd\x53\x4a\x35\x2a\x60\x7e\x8a\x03\x36\x57\x5b\xc1\xfe\x5a\x97\x52\x67\x32\x45\xe3\x3b\x53\x38\x4d\x63\x1e\xd1\xa0\x64\xe1\xc0\x62\xa3\xf5\x79\x66\x38\xc8\x0b\x09\x03\x0f\x9a\xd4\xc1\x38\x86\xaa\xc1\x40\x46\xcd\x8b\x28\xf3\x59\xd5\x70\x8e\x7e\xee\xb3\x61\x6a\xce\x9a\x39\x23\xf0\xd6\xc2\x58\x9f\x05\x4d\x7e\xbc\x6a\x3a\xd9\x1e\x72\xfd\x99\x1d\x6d\xde\x9d\x89\xbf\x73\x8d\x21\x03\xbc\x49\x77\xa2\x60\x62\xb5\x32\xc7\xcd\x6b\x41\xf1\x89\xad\x14\x53\x4b\xa3\xb6\x10\x91\x50\xbe\x9a\x49\xde\xa9\x1c\x94\x3c\x6e\xd4\x06\x2d\xd0\x8d\x12\x5e\xa6\xea\xb0\x52\xe5\x4d\x0e\x91\x6b\xc1\x96\x75\x15\x1f\x92\x23\x60\x4c\x64\xc7\xfb\x52\x56\x95\x28\x50\x45\x44\x4d\x50\x54\xf7\x42\x14\xfe\xa0\x9b\xe9\x7c\x56\x75\x3f\x74\x41\x81\x05\xaf\x61\x23\x8c\xa6\x80\x3a\x43\x4b\xa9\x78\xc8\xf5\x0a\x47\x55\x31\xf1\xd5\x1c\x06\x32\x56\x88\xe6\x64\xba\x5a\xa1\xe9\xad\x36\xcd\x4e\x49\x23\x4c\x9c\xc2\xc4\xab\x4a\x6c\x77\x15\x39\x9a\xb5\x6a\x4a\xd6\x03\x34\xfa\xd5\x44\x90\xe1\x15\x6d\x4f\x05\x6a\x01\xb7\x83\xf9\x20\xb8\xda\x73\x7e\x8f\x17\xa0\xf8\x5b\x2d\xef\x78\x0e\x9a\x00\xbf\x87\xa9\x58\x59\x50\x17\x55\x29\x0d\x83\x93\x7f\x02\x4c\x41\xe4\x4d\x23\xbd\x0d\x5d\xf7\x60\x64\x95\x62\xa5\x4a\x91\x98\x67\x88\x64\xa8\x35\x1e\x22\x1a\x9e\x80\x03\xb4\xc3\xbf\x64\xc6\x12\x11\xe6\x3f\x4a\xf0\xb7\xd0\x11\x69\x12\xca\x89\xaf\x15\x33\xc7\x1f\xa9\x49\xee\x1a\x34\x44\xac\xdc\x8a\x0d\xdb\x8a\x8e\x59\xac\xba\x98\x17\xf7\xe6\xbc\xc0\x79\x05\x97\x0e\xdc\x86\x8f\x72\x01\x2d\x68\xb9\x8f\x67\x07\xcc\x05\x4b\xb0\x52\xb8\x52\x6c\xa3\x0a\xba\x08\xac\xfb\x3d\xb0\xfc\x9b\x76\xc5\xe9\x49\x9f\x5d\xd7\xe0\xe0\x08\x24\x03\xc8\x53\xf2\x64\x0f\x53\x94\x15\x0f\x2e\x92\xd7\x95\xda\xf2\x4a\xa6\x3c\xa7\x65\x7e\xfe\x86\xcb\x94\x28\xa6\x56\xd2\x98\x92\xc0\x45\xb5\xac\xac\x59\x9c\xaa\xba\x04\x61\x2b\xd6\xe8\x8b\x22\x3b\x6f\x3a\x1f\xb3\x73\x51\x92\xf5\xa0\x76\xa2\x60\x1a\x6d\x01\x6d\xe3\x04\xe8\xf5\xd2\xcd\x80\x82\x79\xdb\xea\x33\x46\x25\xe0\xb2\xc0\x91\xa5\x66\xbd\xa7\x10\xab\xc7\xd2\x1c\x0c\x10\x59\xac\x4a\x59\xac\x85\xee\xf0\xda\x78\x9f\xbb\xd3\xae\x2a\xc5\xd0\x6c\xe1\x95\x9b\x24\xee\xd2\x69\x9f\xfd\x29\xb8\x63\x12\xf6\x51\x14\x35\x72\xe7\x7b\x63\x39\xc3\x04\xaf\xf8\xfd\x80\x0d\x8d\x54\xc0\xbd\x56\x25\x03\x42\x95\x22\xe7\x70\xfd\x55\x2a\xa6\x2b\x79\x07\x96\xa5\xaa\x41\x1b\x2f\xf2\xbd\x55\xb8\x81\xaa\xa8\x86\x44\xb7\x9b\xd1\xa5\xc0\x0c\x8b\xb4\xa1\x52\x68\x99\xe1\x5d\x2e\xcd\x23\x32\xdd\x44\x7e\xca\xac\x4e\x2b\x0d\x07\x68\x57\xca\x2d\x2f\xf7\x6c\x59\x6b\x59\x08\x4d\x67\xdf\x8b\x2b\x2b\x22\x80\x06\xd1\x87\xe1\xf2\x03\x9d\xcd\x8c\x93\xaa\x62\x95\xcb\xb4\x3a\x56\xab\x63\xba\xa1\xef\xa4\xb6\xc7\x51\x44\xbe\x06\xe2\xb5\xdb\x02\x44\xd5\x84\x5c\xe4\xe7\xe0\x6f\xc5\x07\x0a\xf3\x5f\xa0\xfa\x69\xe7\x57\x18\x47\xc2\x68\xce\x73\x10\x0e\xef\x95\xca\x74\x2c\x06\x71\x62\x22\x43\xda\x1f\x54\xbe\x54\x5d\x19\x22\xc1\x5f\x74\xaa\x76\x6d\x59\x63\x04\xed\xca\xa8\x54\x56\xd2\x58\x06\x73\xfe\x05\x5d\x2f\xff\x2a\xd2\xca\xde\x7f\xa5\x91\xad\xa5\x40\xd7\xa0\xa1\xe3\x4e\x14\x3c\xaf\x82\x0b\x1c\x84\xb2\x0f\x82\x0e\x8d\x22\x7a\xfa\x06\x7e\x7d\x3e\x60\xff\xef\xff\xfd\xff\xfc\x5f\xec\xf4\xe4\x94\x89\x8a\x69\xf1\xb7\xc1\xf3\x04\xf6\x21\x69\x2d\xb5\xf3\x62\xe0\xc4\x75\x5d\xde\x81\x45\x4f\xd7\x91\x5d\x56\xf3\xe2\x06\x4e\x3f\x03\x47\x87\x2a\x0b\xb1\xd7\xec\x52\x18\xb5\x70\x8c\x07\x9d\xb8\xda\x5c\x9b\xc6\xba\x4e\xc5\x03\xf7\x9b\x61\x7d\x21\x20\x30\x62\xf5\x4c\x7f\x0a\x0c\x07\x57\x2a\xb1\x51\x96\x3b\x2e\x73\xf3\x7b\x63\xdb\xec\x3d\xad\x0d\x6f\x54\x39\x0a\xa5\x52\xa4\xe0\x9f\x42\xce\xd3\x44\x6d\xf4\xdf\x1b\x72\x3c\xa2\x58\x07\x2a\x11\xb7\x6b\xfb\x81\xad\x84\xb0\x57\x89\x19\x51\x16\x60\x30\x67\x18\xf7\x2d\x0a\x22\x21\xc4\x43\x40\xeb\xe4\x74\xf4\xbd\xf1\x02\x54\xd9\xed\x04\x87\xfb\x29\x78\xe8\x1f\xdf\x86\x97\x7d\x76\x2d\x75\x2a\xf2\x9c\x17\x42\xd5\xcd\x4b\xae\x14\x86\xfb\xc9\xb1\x21\xc0\x18\xc8\x85\xb9\x07\x9c\x0e\x91\xaa\x22\x25\xb9\x04\x1c\x4f\x9c\xbb\x35\x1a\x0b\x06\x91\xd4\x0a\x14\x50\x90\x8c\xf6\xf4\xb6\x36\x52\x6a\xb6\x11\x39\x6c\xc2\x52\xb0\xba\xa0\xad\x37\xb4\x4c\x70\xc5\xfe\x5d\xb7\x75\xa0\x2e\x6c\x8d\xd4\x2f\x50\x1d\x0e\x34\xfb\x42\xa4\x42\x6b\x23\x82\xc8\xf7\xce\x64\xc5\x82\x51\x71\xf9\xaf\xfa\xec\x42\xac\x64\x21\x2d\x85\x7a\x9f\x55\xdd\x33\x5b\xb3\x88\x54\x4d\xfc\x75\xb5\x01\x09\xaa\x1a\xaa\x66\x64\x78\xd6\xbb\x9d\x28\xd1\xd8\xb9\x37\x67\x89\x9b\xbf\xa3\x83\x18\x62\x48\x99\xbc\x93\x59\x8d\x66\x00\x27\xfb\x15\x58\x30\x52\x79\xe8\xbe\x24\xef\x26\x32\xcf\x76\x97\xef\xa5\x8d\x9c\x91\xae\x12\x9e\x8c\xa4\xa1\x1e\x5f\x9a\x49\xf8\xf1\xe1\x3c\xdb\xe5\x81\x24\xc3\xdb\x8a\x3e\x4e\xa1\x7b\x08\x1d\x1b\x4e\xd7\x71\x1c\x19\xec\x3c\x49\x33\x02\xf3\x4e\x15\xf6\x09\x9c\xd1\x5e\xd5\xf8\xcd\x5d\x5d\xee\x94\x16\xfe\xb0\x66\x8e\xc2\x09\xeb\xd1\x3b\xd6\x69\x7e\x24\xfb\x78\x3e\x0d\xb5\x12\x32\xa7\xf1\x7e\xb1\x06\x35\x38\xe9\xac\x9b\x0f\x7f\x49\xb7\xde\x96\x17\x7c\x8d\x6c\x68\xcf\x05\xae\xc6\xef\xc8\x72\xef\xac\xfd\x86\xb1\xaf\x4a\x76\x24\x65\x1f\x7d\x53\x90\x1d\xa3\x56\x6c\x25\x57\x15\xd8\xf8\xa9\x19\xf4\xe8\xa7\x93\xff\x7f\x1f\x3e\xa4\x4a\x27\xed\x8d\x7c\xaf\x78\x81\x7e\xa9\x0d\x2f\x0d\x59\x71\x2c\xd9\x67\x4b\x51\x88\x95\x04\xbb\x37\x1a\x37\x98\x1b\x32\xde\x4f\x7d\xf4\xed\x9a\xd5\xdd\x9a\xdd\xb2\x7a\x94\x5d\x68\x2b\x47\xc4\xec\xf8\x3d\xdf\x6b\x30\x00\x7d\x50\xa3\x14\xc6\xa6\x4b\x2b\x17\xfb\x47\x6d\xd5\xba\xfa\x62\x59\xb9\xdc\xa3\xbe\x6e\x18\xca\xdd\xdb\xe0\xf9\x34\xfb\x65\x06\x06\x9f\x66\x25\xca\x95\x28\x05\xee\x2b\x3a\x41\x4a\xa1\x77\xaa\xd0\xd2\xc8\x36\x88\x88\x9b\x05\xd5\xe6\x2d\xf4\xa9\x0f\x5e\x90\x51\xef\x8e\xb3\xbf\x8d\x8e\xce\xfb\xec\xec\xe4\xe4\xcc\x28\x2e\x25\x18\xe1\xa3\x01\x9b\x29\x2d\x8a\x01\x1b\xe6\xb9\x65\x76\x8a\xe4\x66\x03\x76\xe3\xed\x2e\x90\x0b\x3e\x35\x00\xc5\x34\xc4\x69\xcd\x1a\xa2\x68\x68\xf0\x79\x2b\x9c\xc3\x60\xb9\x73\x3b\x78\x9d\xc8\x2c\x78\x19\x38\x69\xed\x6b\xa1\x99\x6a\xad\xa6\xc0\x16\x24\x1b\xa1\xe9\xde\x7c\xf1\x8c\xfc\xaf\xc1\x8f\xd3\xab\x8b\xe1\xcd\xf1\xd9\xe0\xa7\xdf\x2c\x03\xf0\xe1\xfc\xbf\x93\x57\x67\x27\x2f\x1b\xf9\x7f\x67\x27\x6f\x4e\xbe\xe7\xff\xfd\x1e\x3f\x36\xff\xcf\x30\x01\xbb\x81\x7c\x15\x7b\x4e\x5f\x7c\xa4\x34\xb7\xb3\xc1\x4f\x09\x3b\x3d\x65\xd7\x7c\x6f\x8e\xcf\xe9\x8b\x99\x68\x45\xa4\x9c\x16\x6a\xb4\x00\x6b\xee\x80\x2d\xab\xb5\x4a\x25\xb8\xd6\xe3\x5c\x90\xa3\x9e\x4d\x9f\xea\xf5\x13\x77\xc2\xbb\x0e\x4c\x02\x56\x0b\x66\x31\x98\x71\x9c\x97\xdd\x05\x0c\x7c\x66\x80\xb7\x92\xe1\xa5\xad\xa8\x20\xff\xed\x74\xc0\xe2\x49\xc3\xa5\x40\xe6\x59\xaa\x32\x11\x06\xb5\x82\x03\x05\x41\x01\xaf\xee\x52\x2c\x09\x73\xb0\xda\x43\xca\x82\x2d\x65\x61\xae\x7a\x08\xc6\xd0\x90\x36\xe1\x2e\x70\xf1\x3d\xf6\x81\xc4\x4a\x11\x0d\x17\x8a\x5f\x14\x4a\xcc\x78\xc9\xde\x93\x6d\x6d\xa9\x98\xd0\xbc\xc8\x7e\xb4\x37\x8e\x51\x87\x44\x29\x79\x1e\xc4\x2a\x5c\xf2\x5c\xb8\x18\xcc\x29\x6a\x2f\x11\x83\x5d\x68\xa3\x32\xce\xee\x44\xb9\xe4\x95\xdc\x06\x19\x2b\xe6\x9e\xa5\xef\x63\xc2\x05\xda\x47\x05\xdf\x92\xf6\x19\x47\xfb\x21\x2f\x04\x13\x43\x49\xbd\xb0\xa4\xd9\xa8\x3c\x13\x25\x7d\x92\x24\x24\xc4\x95\xcd\x97\xb3\x3b\x63\x69\x83\x8a\x12\x85\xd6\x31\xa0\xbf\x55\x94\x96\xa2\x79\x8e\xb9\x0e\xee\x29\x96\x09\x9e\x87\xf9\x01\x2e\x89\xcf\xb2\x1e\xf8\xcd\x57\x90\x56\x68\x45\x6e\x29\xd1\xcb\x4b\x82\x17\x43\xf4\x03\x76\x51\x0b\x96\x96\x22\x93\x15\xd3\x1b\x88\xe9\x2f\x05\x5b\xcb\x3b\x51\x58\x1d\xd0\xae\xcc\xe5\xf2\x04\x36\xf6\x6b\x24\x8c\x3b\x7d\x97\xaa\x2e\x32\xef\x5e\x2d\xc5\x1d\x2c\x28\xbc\x2b\x30\xa2\x25\xb7\xe8\x3d\x96\x5b\x31\x60\x23\x9e\x6e\xf0\x59\xba\xa5\xcc\x7e\xc9\x62\x5d\xbb\xa4\x39\xee\xf2\x55\x8b\x7a\xbb\x14\x65\xfb\x8a\x77\x24\x20\xb3\x38\xb2\x70\x72\xa7\x81\x5b\x8d\xb9\xec\xf2\xf6\x19\x0d\x4e\xd7\x4b\xf2\x26\x07\x4f\xe3\xca\x5d\x72\xc3\xe2\xc3\x78\xce\xe6\xd3\xcb\xc5\xa7\xe1\x6c\xc4\xc6\x73\x76\x33\x9b\x7e\x1c\x5f\x8c\x2e\xd8\xbb\xcf\x18\x41\xba\x19\x4d\x90\x1e\xd3\xdb\xc9\xc5\x70\x31\x9e\x4e\xd8\x70\x72\xc1\xce\xa7\x93\xc5\x6c\xfc\xee\x76\x31\x9d\xcd\xd9\x7f\xfe\x27\xc4\xd1\x7e\xf8\x01\xfe\x34\x9c\x7c\x66\xa3\x3f\xdf\xcc\x46\xf3\xf9\xe8\x82\x4d\x67\x6c\x7c\x7d\x73\x35\x1e\x5d\xd8\xf8\xd2\x78\x34\x4f\xd8\x78\x72\x7e\x75\x7b\x31\x9e\xbc\x4f\xd8\xbb\xdb\x05\x9b\x4c\x17\xec\x6a\x7c\x3d\x5e\x8c\x2e\xd8\x62\x9a\xc0\xa7\xdb\xaf\xb1\xe9\x65\x2b\x60\x66\xbe\xf8\x58\xc4\x8c\x99\xc5\xb9\x58\xd7\xc5\x80\x8d\x27\x6c\x32\x65\xa3\x8f\xa3\xc9\x82\xcd\x3f\x0c\xaf\xae\x0e\xad\x35\x61\xe3\xc5\x3c\x5a\x6c\x62\x56\x64\x9e\x1e\xde\x2e\x3e\x4c\x67\x47\xf3\xbe\xf9\xc5\xf4\xd3\x64\x84\xff\xc6\xc0\x9b\x23\xe9\xbb\x11\xbb\x1a\x0f\xdf\x5d\x8d\x70\x72\x93\xcf\xec\x62\x3c\x1b\x9d\x2f\x0c\x05\xfc\xbf\xce\xc7\x17\xa3\xc9\x62\x78\x95\xb0\xf9\xcd\xe8\x7c\x6c\xfe\x31\xfa\xf3\xe8\xfa\xe6\x6a\x38\xfb\x0c\x1f\x3c\x9f\x4e\xe6\xa3\xff\x75\x3b\x9a\x2c\xc6\xc3\x2b\x76\x31\xbc\x1e\xbe\x1f\xcd\xd9\xd1\x23\x54\xbc\x99\x4d\xcf\x6f\x67\x10\x69\x34\x13\x9b\xdf\xbe\x9b\x2f\xc6\x8b\xdb\xc5\x88\xbd\x9f\x4e\x2f\xe6\x66\xe0\xf9\x68\xf6\x71\x7c\x3e\x9a\xbf\x65\x57\xd3\x39\x10\xf8\x76\x3e\x4a\xd8\xc5\x70\x31\x84\x0f\xdf\xcc\xa6\x97\xe3\xc5\xfc\xad\xf9\xf7\xbb\xdb\xf9\x18\xe8\x3c\x9e\x2c\x46\xb3\xd9\xed\x8d\xa1\x50\x9f\x7d\x98\x7e\x1a\x7d\x1c\xcd\xd8\xf9\xf0\xd6\x6c\xb8\xd9\x10\x60\x12\x60\xa0\xe9\x0c\x82\x91\x86\x06\xb0\x5f\x09\xfb\xf4\x61\xb4\xf8\x30\x9a\x99\x3d\x00\xba\x0e\x0d\x09\xe6\x8b\xd9\xf8\x7c\x11\x3e\x66\xa8\x3c\x9d\x2d\x82\x35\xb2\xc9\xe8\xfd\xd5\xf8\xfd\x68\x72\x3e\x02\x92\x9b\x51\x3e\x8d\xe7\xa3\x3e\x1b\xce\xc6\x73\xf3\xc0\x18\x3f\xfb\x69\xf8\x99\x4d\x6f\x17\x76\x2f\x6e\xe7\x23\xfc\x67\xc0\xea\x09\x6c\x3e\x1b\x5f\xb2\xe1\xc5\xc7\x31\xf0\x29\x3e\x7c\x33\x9d\xcf\xc7\xc4\x5a\x40\xb2\xf3\x0f\x44\xee\xc1\x0b\x27\x1b\xa4\x66\x3c\xc8\x8a\xb0\xfe\x9e\xb6\xe8\x18\xbc\xf0\xea\xee\xe9\xcf\x3f\xff\x7c\x6c\x2e\xec\x43\x72\x26\x31\xe2\xfd\x5e\xa9\x8c\x9d\x83\xad\x72\xce\x73\xb9\x52\x65\x21\x79\xc2\x6e\xe7\x43\x54\x8a\x31\xf3\x83\xcd\xba\x94\xe2\x6e\x15\x38\x8b\xae\x05\x19\x1a\x60\x74\x31\x04\x41\xda\x67\x69\xab\xdf\x7f\xbe\xf5\xcf\xe0\xc7\xf3\x9b\xe1\xd5\xf1\xe9\xe0\xe4\xb7\x2b\x00\x7a\x58\xff\x7f\xfd\xe6\xd5\xeb\xa6\xfe\x7f\xfa\xe6\xf5\xcb\xef\xfa\xff\xef\xf1\x73\x8e\x0e\x14\xd2\xfc\xc3\x8c\x23\x6b\xad\x7f\x74\xc5\x2e\x27\xec\xc8\x30\x4b\x9f\x14\xea\x9e\x77\x58\xe9\x1e\x55\x31\x18\x3e\x3a\x65\xbd\x73\x1f\x75\xbf\xd5\x2e\xc9\x3c\x4e\x46\x0c\xb5\x36\x4a\x29\x37\x32\xed\x5c\xdd\x89\x52\x64\x98\x3f\xe5\x13\xfa\x2a\x65\x04\xe0\x46\x96\x19\xba\x4d\x07\xee\x83\xf0\xb9\x02\x07\x56\xa5\xfd\x16\x24\x74\x47\x1e\x25\x08\x9a\x6a\x57\x97\x80\xf9\xdb\x56\x4f\x83\xbf\x92\xba\x72\x1d\x26\xb6\xfb\xef\x9c\x45\xdf\xb1\x64\x09\x73\x2e\x53\xb5\x5d\x46\x3e\xce\xc0\x79\x62\x96\x93\x90\x22\x19\x7d\xc0\xa7\x4a\xb2\x60\x78\xaf\xe7\xc7\x0f\x43\x9a\xe3\x92\x96\x64\x08\x21\xd3\x3a\xe7\x65\xf8\xaa\x9f\xf1\x4b\x33\x63\x4f\xcd\x70\xaa\xd1\xbc\x58\x6b\x4e\x14\x91\x78\x6c\x41\x30\xc9\xe8\x4d\xc8\x07\xc4\x64\x7a\xae\x45\xe0\x39\xde\xa9\x92\x0a\x05\xc8\x13\xeb\x66\xf9\x8a\xf5\x46\xb9\x48\xab\x52\x15\x32\x65\x17\x21\x8f\x5c\x8b\x74\xc3\x0b\xa9\xb7\x76\xea\x9c\x6d\xed\xaf\xd8\x5a\x14\xa2\xc4\xe8\x1f\x44\x53\x7d\xee\x96\xb3\x3f\x33\x71\x27\x72\xb5\x23\xf7\xf0\x76\x5b\x17\x36\x75\x03\x1c\x2b\xfe\xab\x55\xc9\x0b\xbd\xc2\x64\xb7\x8c\x57\xdc\xcf\xee\x27\xd6\x1b\x7d\x15\x69\x5d\x19\x2e\xb4\xd3\x88\x78\x94\xa2\x82\x58\x33\xe1\xf3\x5c\x83\x34\x40\x3f\xda\x6b\xd6\x1b\x9b\x13\x03\xc9\xa0\x30\x37\x51\x86\xdb\x12\x7b\x65\x89\x7d\x83\x94\x44\xae\x29\x52\xd4\x18\xa3\x2b\x0b\xb3\xb0\x19\x83\x10\xb2\x01\x16\x1b\x7d\xc5\x4c\xe7\xa1\x9f\xd1\x1b\xd6\xbb\xe2\xe5\x5a\x94\x58\x83\xe7\xe8\x0c\xc9\x37\x18\x57\x43\x2e\x10\x8d\x65\x1b\x83\xa8\xb1\xa7\x68\x49\xa6\xf4\x71\xb6\x86\x38\xa1\x4f\xf5\xeb\x4e\x9e\x70\x33\xf9\xa3\x2f\x25\x74\x14\x69\xda\x92\xf8\xa0\x39\xf2\xf8\x68\xb8\x29\x1b\x7e\x67\x65\x88\x4b\xa9\x06\x1d\x23\xb1\x87\x7c\xcb\xbf\xca\x6d\xbd\xb5\x8e\xf9\x9d\xd2\xe0\x46\xf4\x3e\x5a\xf2\x26\x80\x81\x45\xfc\x2e\x89\xd4\x98\xe9\x0f\xfe\x46\x6b\xe3\x00\xe7\x21\x71\x93\x38\xf3\x28\x0a\x35\x43\x99\xc5\xde\xe7\xe7\xbb\x75\xfc\xcc\x7a\xd1\xd9\x71\xc4\x37\x43\x65\x94\x74\x5c\x29\x48\xe3\x16\xb9\xc0\xc8\xaf\x4d\x69\x34\xd3\xa0\x04\x82\x92\xe9\xaa\xac\xd3\xaa\x46\xd7\x30\x65\x0f\x76\x9e\x72\x0c\x7d\x88\x3b\xa9\x6a\xdd\x90\x73\xec\xd3\x46\x14\x0d\xce\x86\x18\x96\x80\xac\x12\xc8\x02\xd3\xa2\x24\x6d\x6e\x25\x73\x88\xca\x45\x83\x30\xa9\x6d\xb1\x21\x63\x6c\x48\xa1\xe1\xc7\x56\x62\xa4\xb1\x2b\x35\xc0\x90\x7b\x10\x03\x6f\x2d\xe1\xc0\xf4\xfd\x77\xdf\xe1\x77\x0b\x71\x8f\x83\xb9\x78\x02\x97\x85\x0d\x8b\xdb\x9c\xc2\x0e\x12\x3d\x3c\xfe\xe9\xe0\xf4\x24\xa8\x5b\x0d\xc5\x6a\x23\x31\xd9\xa5\xab\x39\x69\x04\x07\x03\x8f\x14\xc4\x22\x82\x24\xec\xe7\x9c\x5d\xb3\x15\x8d\x6b\xc5\x30\x1e\x0c\x9c\x34\x59\x58\x56\x6e\x0f\xbb\x72\x52\xa5\xa6\xc4\xb1\x52\xf0\x6c\x1f\xef\x7e\x7c\x7c\xbb\x4e\xec\x29\xdc\xf5\x94\x88\x40\x25\x78\x01\x0f\x87\xd9\x07\x47\xba\x9f\xb0\x42\xdd\xfb\xe2\x40\x73\x1a\x30\xf8\xec\x0f\x91\xbf\x2e\xba\x82\x9a\x5b\x51\x6d\x54\x96\x60\x3a\xae\x0d\xe4\xf3\xdd\x8e\x97\xbc\xaa\x35\x65\x39\x24\x56\x1e\xef\xc2\xb2\x48\x50\x21\xac\xeb\x3e\xbc\x22\x4f\x4f\x9f\x59\x0e\x17\x91\xe8\xe1\x6a\xb8\x28\x70\x9a\xe7\xe6\x91\x3a\x17\x9a\x49\xcf\x8e\x09\xdb\xe5\x35\x9d\x78\xef\x27\xc5\xb8\x07\x4f\x45\x10\xb0\xb2\x27\x0e\xd3\xd5\x49\x6b\x00\xf3\x0b\x23\x5f\x86\xdd\x64\xee\x1c\x7e\x4c\x16\xba\xe2\x79\xee\xee\x6e\x5e\x30\x7f\x8f\x41\x9c\x28\x74\x7e\xba\xe2\x16\x23\xea\xcc\x50\xbc\x94\x50\x59\xc1\xd7\x66\x9a\xd5\x23\x42\x85\xd2\xba\x44\x9e\xb3\x2f\x85\xba\x2f\x92\x40\x71\x8b\x2f\x0d\x4b\x44\xa7\xad\xfc\xa0\x59\xba\x51\x32\xa5\x02\xc5\xf0\x10\xa4\xbc\xc0\x72\x1d\xaa\xd2\x28\x85\xd6\xc8\x3b\xbc\x4c\x37\xf2\x8e\xe7\xb0\x33\x49\xe8\x0f\x06\x2f\x6b\xa9\x76\xa5\xa1\x24\xcb\x84\x7d\x8f\x34\xce\x4c\x1c\xe3\xbb\x10\x33\xb3\x07\x53\x6a\x76\x2f\x33\x48\x97\x72\xd3\x36\x5b\x5b\x28\x48\x87\x5d\x87\x2c\x7f\x46\x91\xcb\x23\x55\xc2\xbf\xca\x5e\xff\x9f\x11\x54\xc5\xf1\x57\x35\x08\x7d\xeb\xde\x6b\x87\xb2\x75\xed\x72\x8c\x6c\x3e\xd6\xeb\xc1\xe9\x73\x23\xb2\x56\x0d\xf8\xf5\x21\xd9\xcf\xbf\x2e\x24\xcb\xff\x99\x21\xd9\x65\x23\x22\x0b\xa1\x57\x50\xed\x3a\x63\xb3\x87\x62\xb2\x18\xb6\x7c\x5a\x30\xf6\x6c\xd0\x59\xba\x4b\xdc\x77\x36\x40\x47\x4e\x5b\xfb\xc3\xc2\x45\x7a\xac\xfb\x91\x7f\xa0\xac\xd9\x57\x7b\x47\xd9\x40\xce\x14\x3b\x50\xb5\x88\xf2\x38\x50\x08\xcc\x76\x22\x8b\x74\xbf\x40\xa7\xe2\x28\x50\xa2\x3b\x2a\x82\xfa\x0d\x91\xde\x5e\x2a\x26\xb5\x25\x3e\xf2\x92\x50\x95\x71\x62\xcb\xeb\x13\x5b\x9b\x0f\x4b\xca\x83\xcc\xcb\x43\x55\xad\xb0\x1f\x47\x1d\x3a\x6f\xbf\x15\xb9\x6a\xd8\x43\x14\x7d\xe1\xda\xa9\x1d\x9c\x05\x1a\x77\x08\x01\x60\x68\xb4\xb4\x34\xc2\x6b\x55\xdb\x9a\x4a\x9b\xd8\xe7\xb4\x69\xbc\x77\x12\x56\xdb\x18\x88\x16\x39\xc4\x35\x42\xb8\x03\x54\x0f\x5c\xcd\x27\x56\x02\xf1\xcc\x96\x7f\xee\x0c\xeb\xcb\x94\x0a\x41\x93\x8e\x5a\xf3\x24\x8a\x1e\x81\xad\x6e\x68\xa8\x3a\x72\xce\x0e\x93\x28\x50\xce\x8e\xd2\x7e\x18\x0e\x88\xb2\x8e\x31\x1a\xe3\x0a\x46\x4f\x0d\xbf\x98\x19\x19\x9a\x40\xda\xe2\x6a\x65\xfe\x78\x07\xa5\x34\x70\xde\x8d\x8c\x6f\xef\xff\x4a\x96\xba\x0a\x8b\xb4\x1b\x73\x7c\x24\x55\x39\x9c\x6d\xd6\x67\x13\x55\x99\x9d\x75\xa7\x3a\x9c\xa0\x99\xd8\x52\xdd\xc1\x81\x39\x5c\x73\xfb\x0b\x3b\xed\x03\x41\xe1\xaa\xf5\x40\x13\x02\x12\x98\x9c\x1e\x1c\x4d\xf2\x2d\x3b\xeb\x33\x2d\x40\xb7\x39\xfc\x8c\x2a\xd9\x4b\x1c\xda\xb2\x07\x46\x12\x41\x24\x1a\x4e\xf9\x85\x51\x56\x4b\xa8\x9e\x1c\x54\x7d\x25\x3d\xfc\xa8\xd9\x8f\x2c\x0f\xc7\xd4\x5d\xa2\x70\xbb\xde\xb9\xe8\x28\xc8\xab\xb3\xf0\xa6\x8f\xa5\xd4\xfc\xf9\xa2\x24\x41\xc7\x42\x38\xe4\x37\x90\x6a\xbf\xb5\x7c\x8a\x9c\x3a\xdf\x50\x34\xc5\x0e\x1b\xf4\x6e\x81\x70\x80\x4b\x25\x24\x52\xb7\xd8\x22\x8d\x0e\xab\xd2\xea\xc2\xa5\x9e\x2c\xb9\x96\x3a\x09\xb7\xb8\x29\xd0\x1a\x8e\x80\x7f\x4c\xc0\x3d\x4d\xbe\x25\x0d\x01\xf7\x80\x53\x2c\x5c\x39\xad\x91\xe7\xaa\x70\xf3\x84\xf0\xbe\xe7\x6f\x58\xa7\xb1\x92\x3a\x7c\x7b\x31\xe5\xec\x7d\x1d\xbc\xdd\x4f\x3a\xea\xe9\x93\x96\x08\x0d\xc4\xee\x03\xd2\x14\xc4\xc4\x13\x17\xd6\xb9\xa5\x40\x69\x23\x37\x3a\xce\xf0\x13\xc7\xfd\xc7\xa8\xf1\x44\x39\xef\x2a\x24\xce\x06\x67\x56\xc6\x9b\x7f\x3e\x28\xe6\xc3\x09\xa1\x80\x37\x64\x37\x13\x0d\x3d\xcd\x5d\x56\xda\x93\xe5\xf9\xd9\x73\xe5\x39\x16\x03\x58\x99\x1e\xc9\x25\xae\x49\xbe\x67\x5e\x78\x77\xd0\xf4\x80\x98\xef\x7c\xf2\x49\x92\xde\x4b\xd2\xd8\x20\x05\x64\xaa\xf6\x96\x1e\x16\xfa\xcf\x61\x98\xc6\x4d\x70\xe4\x31\x2a\x42\x4f\x4b\xc7\xf7\xfb\x61\x56\x06\xdc\x1d\x70\xa7\xbd\x7a\x82\x88\x68\xba\x60\xc1\xf4\x5b\x6a\x41\x25\x35\x4f\x9b\xbe\x4d\x72\x89\x9c\xce\x53\x07\xd2\xe2\x6e\xb2\x97\x83\x53\x36\x8c\xf3\xfb\x1b\xca\xc2\xa2\x25\x91\xd1\x68\x0a\x4a\xbc\xb1\x00\x2b\xf8\xb5\x8b\x42\x00\xdb\x3f\xc9\x5b\xfa\xb0\x8b\x24\xe4\xe5\xb6\x39\x1d\x58\x89\x11\xf1\xa8\x26\x23\x0c\xdf\x42\x16\xf3\x63\x15\x5d\x4f\xb1\x40\x9d\xfb\xb0\x65\x83\x26\xbe\x66\xa7\xd6\x95\x35\x3b\xc1\xd2\x0f\x12\x89\xae\x82\x34\x4a\x26\xee\x44\xb9\x3f\x08\x8d\x13\x97\x15\x0e\x82\x72\xa0\x8a\x04\x32\xd6\x51\x2b\xaa\x07\xa2\x45\xa1\xb3\xa8\x8b\x4e\x58\x2e\x93\x57\xa2\x04\x1b\xce\xa6\xb7\x6a\xeb\x65\xb0\xb9\x5c\x87\xd6\x4e\x51\x06\x5f\x44\xf8\x83\xd5\x20\x5c\x59\xf2\x80\x7d\x50\xf7\x66\x59\x89\x9b\xae\x23\x44\xe1\x3c\xa7\x3c\xf7\x71\x73\x58\x49\x00\xa7\x63\x1f\xa0\x91\x23\xa7\xa2\xa5\xf6\xcb\xc1\x4f\x9e\x91\xcf\xd8\x10\x7d\x1c\x58\xc6\x1a\x83\x45\xd9\xc7\x86\xc5\x3e\x76\xec\x3e\x87\x99\x61\x3f\x97\xa2\x89\xc8\x21\x8b\x26\x32\xc2\xf6\x51\x16\xf3\x3a\x0a\xe6\x72\x6d\x05\x83\xd2\x36\x82\x64\xf0\x0e\x2d\xbf\x09\x25\xbb\x33\x7f\x2f\x7c\x50\xe8\xd1\xe0\x12\x15\x54\x1b\x1d\x01\xd6\xa4\xb6\x54\x32\x87\xdb\xd0\xf1\x15\xb7\x2a\xbc\x72\xe5\xaa\xb9\x58\x33\x87\x47\xbf\x9b\xd8\x04\xc1\x2d\xe4\xd2\x45\xae\x27\x5e\x31\x73\x72\x2a\x56\xdd\x8b\xfc\x4e\xb0\xa3\xd3\xb3\x3e\xdb\xaa\xa2\xda\x68\x2a\xd9\x71\x37\x23\x14\xa6\x81\x0d\x94\x9b\x83\x9c\x1a\x2a\xb9\xc1\xb0\x2a\xda\x0e\xa6\xe5\x57\x76\xf4\xba\x31\x10\x0f\xd3\xb6\x22\x66\x8e\x43\x8c\x11\x43\x98\x0b\x6e\x29\x44\xd1\x5c\x78\xa5\x50\x2d\xf0\x5c\x8f\x27\xd1\x48\xb8\x66\xe6\xb6\x28\x74\x5d\xba\x0a\xba\xe6\x79\xb6\x33\x41\xf2\xe8\xe0\x1b\x16\x16\xc8\xbc\xf1\xf8\xe6\x4a\x23\xfe\x25\xb8\x5b\x6d\x9c\xb5\x23\x8c\xfc\x72\xf0\x92\x5d\x58\x2c\x90\x07\xc2\xc0\x0d\xbc\x0f\x9e\xe7\xb1\x30\x3d\x74\x28\xc8\x53\x8b\x49\x93\x10\x96\xb0\x47\xda\xc1\x59\x6d\x38\xd4\xed\x7d\xb6\xac\xe7\x0b\x7d\xe9\xda\x8a\x75\x6e\xcf\x00\xbe\x72\xbf\x58\x8b\x41\x97\x4c\xf5\x90\x22\x2e\xdd\xd4\x13\xbd\x11\xc1\x41\x98\x47\x91\x59\x7f\x5b\xbe\x0f\x3d\x6e\xf9\x3e\x41\x35\x25\x36\x08\x9d\x07\x96\x2e\xaf\xb6\x51\x8e\x3e\x69\x7b\x77\x55\x94\x10\x6a\x05\x79\x67\x40\xd3\xba\xff\x02\xae\x48\x9c\x43\x80\xbc\xfc\x16\x25\xac\x38\x2c\x0f\xa0\x0c\xab\x95\x7d\x2c\x43\xa1\x66\xc5\x26\xba\xf0\x60\x65\xa0\x99\x84\xbe\xba\x43\x6a\xe5\xcb\xc1\x2b\xa8\xdc\x73\xf6\xe2\x8d\xb5\x17\xaf\xa1\xf2\x48\xc7\x06\xe6\x02\x78\xef\x06\x54\x34\xd4\x6b\xa0\x26\xa9\xa9\x3c\x7e\x29\xd4\x7d\x2e\xb2\xb5\x85\x11\x6a\x60\x07\x46\x3c\xfc\x83\x7e\xd8\x60\x85\x30\x1e\x05\x92\xc2\x12\xf0\x8e\x72\xd8\x2e\xf3\x31\xba\xba\x35\x78\x21\x55\x69\x54\x8c\x24\x7a\xac\xc1\x72\x00\xa6\x03\x8c\xee\xd2\x8b\xc3\xd3\x1d\xa5\x82\x50\xd9\x5b\xef\x6a\xf4\x7e\x78\xd5\xa3\x7d\xb1\x7b\x42\xa9\x15\x86\x54\x8e\xed\x49\xc3\xf5\x49\x23\xf8\x67\x59\x30\x5d\xaf\x56\x32\x05\x4c\xbb\x4c\x54\x5c\xe6\x96\x7e\x4e\x20\xb1\x7b\x49\x61\x0a\x14\xf5\xf6\x64\xa6\x55\x6b\x23\x10\x2b\x80\x20\x18\xfc\x8e\x78\xf9\xdb\x3c\x3a\x6d\x10\xaa\x03\x17\x72\x83\x76\x58\x47\x66\x4e\xe9\xce\x9c\xb7\x00\x13\x11\x48\x82\x74\xa4\xca\x1b\xca\xa8\x8b\x48\x0f\x96\x50\x20\x84\x83\xd8\x9a\x03\x8b\xaa\xf8\x17\x8b\xc3\xa5\x2b\xb1\xd3\xec\x08\xcb\xf7\x20\x02\x28\x57\x10\x7b\x08\x63\x27\x5b\x2a\x52\xcc\xa5\x46\x94\xba\x42\xdc\xeb\x75\xa9\xea\x9d\xee\x3f\x0a\x43\x84\xf0\x5c\xf7\x1b\x28\x64\x14\x46\x9c\xb4\x83\x67\xb0\x31\x85\xb8\x0f\x28\xeb\x6e\x15\xa4\xbc\xc8\x06\xb1\xe3\x20\x5c\xf4\xf0\x66\xdc\x3a\x3a\x3f\x34\xa2\xb6\x91\x36\x15\xe8\xef\xbb\x52\xad\x4b\xbe\xdd\x62\x1a\xb8\x0d\xb6\x19\x5a\x1d\x3e\x87\x6a\xd5\xb0\x08\xad\x8a\x8f\x57\x9b\xa3\x47\x54\xee\x27\xb7\xbb\x3c\x10\xb7\xc3\x9b\x71\xc7\xa1\xe1\x39\x54\xcc\xe3\x4c\x41\xff\x09\x71\x11\x6d\xe5\xb3\x63\x84\x86\x95\x3d\xb3\x85\x91\x36\x8e\x1f\x8e\x1f\x55\x4d\xf2\x2a\x09\xe0\x03\xa1\x6a\x40\x19\xdd\x7c\x57\x97\xba\xe6\x05\xf8\xe2\x3c\x8b\xbe\x02\xd3\x1c\xad\xe1\x70\xc8\xa5\xc8\xa5\x40\x98\xcb\xd8\x98\x6a\x11\xdf\x10\x26\xfe\xbb\x43\x84\xb6\xe9\x56\x47\xba\x6f\x5d\x22\x4d\xca\x07\x27\xd9\x63\x2b\x62\x16\x46\x57\x72\xc5\x81\x20\xf5\xcb\xc1\x4f\x6c\x66\x85\xdf\x24\xa8\xde\x08\xef\xf2\xac\x46\xd6\x40\x91\xe8\xaf\x14\x1f\x72\xb7\x49\x4d\x70\x10\xdb\xc6\x07\xf0\xa1\xac\x6c\x38\xdd\x26\x96\x40\x31\x42\x5d\xa1\xfc\x08\x6e\xaa\x50\xab\x8a\x74\x62\xd0\x0b\x6a\x81\xe1\x63\xed\xd3\x3a\xa0\x72\xb8\x68\xdf\xec\xad\x81\x73\x45\x1c\xee\x0e\x37\x07\x1b\xec\xce\x90\x0d\x6f\x70\x55\xee\xfb\x58\x53\xcf\x38\xab\xb5\x28\x09\x8d\x10\xf0\x85\xbe\x08\xc2\xb9\x51\xea\x8b\xaf\xae\xb3\x60\x9c\x0e\xbe\xc5\x7a\x1b\x01\xda\x8f\x8a\x12\xc3\xbd\x37\xdb\x6a\x0d\x1a\x9e\x01\x02\x45\x89\xf7\x3d\xcc\x28\xdc\x6a\x4a\xcd\xa1\x45\x44\xe2\xd2\x67\x2b\xf9\x95\xc3\x59\x09\xf7\x2b\x0c\x77\xa2\x4a\x10\xdf\xf3\x36\xd9\x2b\xa4\x33\xae\x3e\xba\xf8\x3b\xac\xb4\x48\x01\x70\x95\x81\x1e\xd8\x20\x52\x06\xdc\x72\xd3\x8d\x52\x58\x86\x02\xa6\x5a\x62\x91\xd0\x30\x90\x6c\x94\x3f\x01\xda\x6f\x62\x71\xba\xf6\x09\xd3\xf5\x6e\xa7\x4a\xc4\x6e\x12\x5b\xc8\x51\x03\xd8\x1e\x67\xa4\x79\x8f\x04\x0c\x1c\x50\x3d\x80\xa8\x69\xd8\xf5\x1d\xb6\x25\x02\xb6\x80\x71\x6f\x51\x3c\xd4\x7d\xc1\x96\x62\xc3\xf3\x55\x62\xeb\x8f\xcc\xdf\xf0\x57\x87\xb5\x33\x72\x7e\x85\xae\x94\x06\x2c\x8f\xac\x18\x5f\x6a\x95\xd7\x00\x43\x92\xe6\x82\x93\xcb\x1c\xeb\x44\xd2\xcd\xaf\x5a\x3f\xc0\xc7\x41\xaa\x42\x66\x21\x14\xc1\xb9\xeb\xbd\x09\x21\x58\x30\x5e\x48\x30\xe4\xea\x21\xbd\x14\x1d\x0b\x91\x87\x51\x59\x50\x0e\x3b\x07\x57\x2c\x7f\x50\xc3\xb5\xa7\x25\x1c\xa7\x81\x9d\xf5\xf4\x25\xa3\x3d\x8c\x10\x91\x2b\x51\x7a\x71\xf6\x3a\xb6\x73\xd4\x2a\xd4\x7a\xc9\xad\x16\x4b\x38\xb3\xf1\x3e\x74\xd0\xf4\x9b\x05\x6f\x63\x9a\x0b\x40\x72\x50\x02\x5b\x88\xf6\xa0\x56\xc1\xe5\x70\x7a\x6c\x04\x2b\xf8\xb5\xd1\x0a\x14\x15\x9d\xb4\x86\xa5\x92\x58\x03\x19\x31\x70\xac\x76\x48\xc7\xdd\x58\x23\x8f\x1a\x80\x5d\x89\x37\x32\x54\x77\x1e\xc5\xbc\x0c\xd2\x70\x3c\xe0\x23\x8e\xbc\x51\xf7\x94\x3d\x65\x45\x02\x2c\x6a\x55\xe7\x2b\x09\xd9\x0d\x60\x11\x04\xe7\x2f\x22\x03\x79\xd9\x68\x35\xd6\xf1\x91\xaa\x42\xef\x64\x5a\xab\x5a\xe7\xfb\x08\xad\xf6\x09\x16\x4b\x72\xc0\x5e\x81\xf0\x61\x6e\xfe\x52\x02\xce\x58\x97\xf5\xd2\x21\xc4\x62\x24\x16\x71\x40\x68\x35\x42\x4b\x5d\x76\xd4\xaa\x95\xfd\xd9\x12\x8e\xd6\x34\xb1\xa6\x8a\x5a\xa1\x8c\xc1\xfc\x9e\x84\x66\x0c\x42\x92\x4c\x61\xdc\x2f\x8f\xac\xdb\xc2\xd4\x4d\x1a\xb5\x9e\xd6\x95\x80\x41\x9c\x5d\x2e\x21\x03\xd2\x59\x18\xdd\x5e\x24\xb4\x1a\x88\xc3\x5c\x25\x1d\xdd\x0b\x1d\x6b\xcd\x14\x95\xa0\x07\x58\x57\xe0\x64\x05\xb1\x97\x5b\xe5\xdf\x51\xfb\x07\xed\x2c\xad\x76\x26\x9f\x1d\xd4\xf9\xf6\xe9\x51\x8d\x27\xa6\xda\x34\x71\x8a\xbb\x30\xd2\x0e\x4c\xd4\x12\xdc\x13\xd0\xae\xee\x49\xb2\xb8\x0a\xfc\xa0\x64\x73\x49\x8c\x5c\xb5\xa1\x8d\x21\xb5\xb4\x4b\xee\x42\x5d\xe6\x01\x91\x98\x78\x2f\xc1\xe3\x57\xc7\x33\x05\x77\xe7\xd8\xdf\x4c\x98\x1f\x9a\xf9\x63\x02\xde\x5d\x6e\x07\xe5\xf7\x9b\x30\x36\xda\x12\xd4\xe4\xf0\x89\x02\xa8\x98\xa6\xb4\x5d\x62\x3e\x6c\x74\x0a\x83\xe8\xcb\xf3\xb2\xae\xbb\x02\xca\xe1\x27\x31\xdb\x57\x16\xeb\x1c\x7c\x3b\x59\x0d\xd6\x71\x61\xd5\x41\xc4\x12\x89\x99\x4c\x03\x18\x58\xc7\xad\xd1\x62\x24\x2f\x5c\xed\x21\x6c\xf9\x55\x5e\x99\xaf\xb9\xbb\xd0\xe8\x5a\xdb\x5d\xbe\x87\x7a\x5b\x63\xa4\x54\xbc\xaa\xd1\x09\x3d\x13\xeb\x3a\xe7\xae\x60\xd9\xa9\xe1\xe0\xe8\xf7\xae\x46\x33\x55\x30\xf4\x61\x18\x4c\xb1\xf3\x98\x60\xdd\x24\x82\xa7\x4a\xa1\x77\x94\xa6\xa0\xd5\x16\x83\x1e\x3e\x37\x2f\xda\x0c\x52\xdc\x35\x4e\x2e\x61\x7f\xad\x33\x4a\xf9\x2a\x21\xcd\x0f\xcc\x31\x3b\xdb\x58\xa1\xff\x05\x5c\x43\xe1\xec\x0e\x4f\xeb\xe1\x5c\xf6\xb7\xce\x41\x16\xf9\xb4\x7c\x8c\x48\x3b\x27\x0a\x45\x2e\xc5\x9e\x71\x88\xb8\x0e\xd8\xbc\x76\x7e\x17\xbc\x20\xed\x8d\xd6\x44\x5c\x0f\xbc\x12\x07\x1c\x1c\xaf\xe0\x33\xad\xf7\x5d\x72\x63\xab\x14\xbf\x65\x51\x11\x44\x6f\x8c\xa5\x13\x03\x00\x6a\xcf\x07\x9e\xb2\x04\xd2\xd3\xb5\x0c\x6f\x52\xe6\x7b\x72\x0f\x11\x13\x86\xfe\x21\xb5\x32\x3b\x86\x65\xfc\xfa\x8b\xcc\x73\x82\x02\xb2\xfe\x6d\x90\xba\x10\x3e\x66\xb2\xb2\x95\xe0\xc3\x26\xfa\x57\xc3\x14\x8d\xb0\x8c\x82\x1e\x05\x69\xe4\x34\xee\x56\x2c\x8d\x35\xcc\xab\x8a\xa7\x1b\xd2\x47\xba\x2c\x54\x32\x33\xac\xf2\xd0\x3a\x51\xaf\x07\x4e\x3b\xb4\xe4\x6e\x98\xca\xaf\x07\xa7\x6c\x22\xee\x5b\x4a\xe4\x5c\x19\x2e\xae\xc4\xd7\x2a\x61\xe3\x22\x1d\x00\x70\x83\xfd\x55\xaf\x0f\x72\x8b\xfa\x3c\x50\xcd\x7a\x66\x6d\xfa\x42\xdc\xdb\xcb\xaa\xf9\xd5\x83\xa5\xec\xf6\x72\x03\x37\x9d\x2b\xa7\xe7\x61\x59\xbb\x91\x83\x8d\x92\x76\xb7\x86\x33\x36\x02\x6e\x36\x9f\xeb\x5a\xcd\xb4\x48\x1b\xe7\xd6\x39\x9d\x68\x11\x1e\x95\x2f\xb4\xd3\x1b\xda\xa8\xd3\x4f\x9c\x99\x9b\x03\x24\x8e\x6d\x91\x61\x91\xf5\xe4\x01\x64\x4c\xee\x42\x2d\x83\x60\x08\xad\x02\xfb\xd1\xbc\x4e\xf7\x4d\x30\xdb\xc7\x2b\xef\xbb\x67\x1a\xac\x6e\xb9\x0f\xf6\x14\xb0\x94\x1b\x10\xfd\xfe\xaf\x40\x9c\xa8\xa2\x26\xf0\x4d\x12\x34\xa5\x8f\x84\x36\x8c\x62\xe7\x26\x68\x17\x1e\xf8\xfd\x7a\xd9\xdd\xcd\x06\x65\x79\x1c\x70\x84\x80\x8b\xc7\xc8\x39\x14\x77\x3d\xc2\xb3\x64\x51\x2f\xc1\xa0\xc9\x00\x92\x12\x04\x31\x44\xfb\x00\xb5\x56\x56\xee\x04\xba\xaa\x8c\x67\x57\x43\xf4\x83\x7b\xd0\x08\xf1\x52\x80\x9f\x03\x14\x5f\xab\x8d\xd9\x7e\x54\xe0\xba\xde\x94\x5c\x0b\xcd\xc2\x33\x94\xb0\xde\xf9\xcd\xf0\xaa\xc7\x5c\x4e\x49\xb1\x82\xb4\xa7\x7c\xcf\xb4\xdc\x4a\xc3\x7f\xf8\x9e\x43\xfa\xdd\xed\x8c\x12\x27\x0b\x74\xad\xd8\x0f\xd9\xcc\x8b\x0a\x9e\x22\x17\x6b\xf4\x04\x6a\x78\x1d\xdd\x2b\x7c\xaa\x65\x54\x95\x09\x1c\x1c\x68\x8c\xb0\xae\x06\x87\x35\x90\x2b\xf5\x03\x2a\xa5\x60\x66\xa1\x03\x76\x74\x29\x73\x0f\xc2\xf1\x48\x2c\xa8\x4b\x19\x4b\xda\xd9\x8b\xa1\x5a\x66\x87\x7d\xc8\xab\x14\xe0\x3b\xe3\x97\xb7\x5a\xe4\x77\x42\xc7\x1d\x5e\x96\xa2\x9d\x49\x13\x71\x32\x54\xc3\xbe\x19\x1c\x00\x36\x07\x66\x3e\x9f\x7e\x1c\xcd\x46\x17\xec\x7c\x7a\x11\x23\x5e\xdc\x4e\x2e\x46\x33\x84\x09\xb8\x1a\x9f\x8f\x26\xf3\x11\xe2\x18\xc4\x28\xf1\x49\x0b\x22\xde\x7c\x61\x38\xf9\xcc\xfe\x6d\x3c\xb9\x48\xd8\x68\x0c\xe8\x06\x5d\x00\x18\x11\xea\x85\x1d\x05\xf0\x1a\x08\x6b\x22\x40\xba\x58\x7c\x18\x2e\x00\x90\xa0\x39\xdd\xcb\xd9\x08\xe0\x0c\x2e\x46\x97\xa3\xf3\xc5\x3c\x44\x90\xbf\x1a\x25\xec\x72\xbc\x38\x0c\x83\x31\x9d\x85\x08\xf4\xe3\xc9\xfb\xa7\x40\xc9\x0f\x27\x17\xec\x66\x34\xbb\x9c\xce\xae\x87\x00\xbd\x70\xd9\x39\x2f\x8f\x2c\x3f\xff\x30\xbd\xbd\x42\x18\x90\xe8\x21\x43\xe8\x11\xcd\x7b\xfc\x71\x64\xd1\x1a\x66\xa3\xf9\x0d\xc0\x60\x7c\x9e\xde\xb2\xa3\xc9\x14\x97\x3d\x9e\x8c\x11\xea\x62\xf4\x71\x74\x35\xbd\x19\xcd\x12\x0f\x66\xef\x7e\xc7\x08\x52\x03\xa0\x20\x42\x94\x8e\x3e\x1b\xce\xe7\xb7\xd7\x23\x9a\xe9\x7c\x61\xf7\x68\x32\x3a\x1f\xcd\xe7\xc3\xd9\x67\x02\xbe\x80\xad\x98\x8d\x6e\x86\xe3\x19\xc2\x6c\xcc\x66\x66\x76\xd3\xc9\x00\x19\xe1\x00\x40\xfe\xf9\x74\x42\x48\x1a\x73\xc3\x20\x66\xa3\x11\x99\xc3\x10\xdd\x81\x4d\x10\x17\x0d\xd8\x64\x6a\x41\x28\x5a\x44\x19\xcf\x09\x48\x64\xfc\x7f\x8e\x2e\xd8\x87\xd1\x6c\x84\x6c\x38\xfa\xf3\xf9\xe8\x66\x11\xf2\xa4\x9f\x0a\x42\xe4\x0f\xd8\x62\x34\xbb\x1e\x4f\x80\x77\xac\x98\xfe\x23\x54\x25\xb4\xcc\xed\x56\x68\xd1\x63\xf1\xc3\xcd\x7e\x08\xc9\xd7\x22\xef\x42\xe8\x2e\xd6\xd8\x51\xac\xd8\xa6\x1c\x45\xe6\x1f\x32\xa6\x07\x5c\x95\xcb\x12\xdc\xf4\xe6\x71\x59\xb0\x97\x27\x2c\x33\x97\xb2\x5a\xb1\xa5\x48\x15\x84\x7b\x38\x26\x2b\xa3\xa8\xc1\xc7\x11\xe6\xc2\x67\xdb\xea\x2e\x67\x49\x10\xec\xc1\xf8\x6a\xee\x81\xe0\x62\xb4\x4b\x6b\x54\x1f\x42\xbb\x64\x37\x0e\x39\xd6\x16\xed\xa1\xa9\x26\x4b\x56\x70\x74\xf7\x87\x89\x21\xb2\xa0\x94\x48\xb6\x14\x7b\x45\xc4\x7d\xe0\x03\xf1\x74\xfc\x36\x9d\xd9\x1b\x15\xb3\x45\x2a\x23\xb8\xab\xa0\x1d\x19\xd7\x5a\x94\x15\x7a\xc9\x28\xd2\x15\xe6\x1a\x52\x8c\xf5\xc8\xa3\xe2\x66\x22\xcd\x39\x34\xec\xfa\x6b\x9d\xad\xb7\xd8\x47\x0c\x84\x64\xdf\xd5\x8d\x3d\xdd\x27\x10\xe7\xb7\x3e\xcb\x2a\x8f\x0c\x72\xfa\x30\xc4\x76\x1d\x86\x73\x80\x54\x8a\xe1\x70\xaa\xec\x33\xba\x80\x66\xbd\x1b\xd0\xf3\xe4\x8e\x17\x46\xa1\x8d\x90\x9d\x1b\xf5\x2b\x30\x50\xf0\xf8\x0f\xdd\xa9\xb2\xdd\xa9\x13\x9d\xe8\xcc\x14\xdb\x09\xeb\x87\x0f\x04\xe5\x83\xcf\x5a\xdc\xea\x8e\xd8\x3c\xa9\xde\x67\x83\xb3\x6e\xc6\x48\x10\xc3\xfb\x35\x9d\x0d\xdb\x11\xd5\xdc\xcf\xd1\x07\xdc\xf9\xdc\x95\x0a\x6c\x60\x79\x27\xf2\x7d\xc2\xea\x22\x17\x5a\x9b\x73\x4a\xa7\xcc\x8e\x84\x01\x67\x88\xf7\xee\xe0\x4a\xa5\xa1\xcd\x3c\x31\x91\xeb\x17\x00\xd9\x44\x0f\x8f\x2c\x00\x5d\x8b\x5c\x93\x3b\xbe\x8f\xbe\xce\xd9\x16\x50\xaf\x73\x72\x08\x81\x7a\x19\x80\xda\x52\x5e\xbf\xb5\xed\x4b\xb6\xe3\x1a\xbb\x0f\x52\x42\x22\xc1\xd1\x75\xa7\x81\x36\xa9\xe9\x21\x38\xcd\x92\xb2\x92\xdf\x5b\xfd\xcd\x9d\x0f\x64\xfe\xa6\x4b\xe0\x40\x5a\xab\x63\xc2\xe6\x87\xc0\xb7\xd7\x20\x9b\x23\x54\x12\xb7\x32\xb0\x4b\x04\x94\x65\x8e\x5d\xa3\x20\x7c\x40\xc7\xd1\x48\x22\xa3\xbb\xc4\x84\x22\xf8\xff\x80\xba\xe4\x06\x02\x53\x46\x38\x64\x87\xd6\xd2\x48\xf7\xb5\x04\xa0\x5e\x32\x6d\x4e\x7c\x36\x13\xc6\xe2\x3d\x10\xfb\x0e\xdd\x52\x96\x51\xa9\x09\x12\xc6\x72\xcf\x4e\x94\x52\x65\x16\x93\xcd\x98\x96\x4b\x75\x27\x1a\x79\x01\x60\x01\x51\xfa\x71\xc2\x36\xbc\xcc\xf0\x5f\xae\x26\x25\x09\xcd\x9b\xa7\x9d\xe1\x43\xf9\x4f\x8f\x1d\xe2\x83\x00\xf3\xad\x33\xdc\xa6\x1b\xae\x25\xca\x86\x2f\xc5\x9d\xfa\x22\xb2\x20\x2b\x9e\x3b\x53\x3a\xa3\x7e\x02\x2e\x21\x9e\x0a\xbb\xb2\x84\x69\x95\x43\x06\x97\xcb\xe9\x05\x62\x6c\x78\x46\x4f\x3d\x90\x1f\x1d\xf2\xab\xbb\x3c\x5e\xda\xcb\x03\x6f\x89\x07\xaf\x08\xcb\xfd\xd1\x81\x8e\xd0\xf2\xbf\xbd\x14\xa5\x00\x0e\x96\x24\x58\x86\x2e\x85\x56\xf9\x9d\xc8\x7c\x34\x7c\xe9\x71\xf6\xa1\xa0\xa4\xaa\x30\x3d\xa3\x4f\xc8\x2c\x74\xa6\xe9\x86\x24\xa6\xec\x5a\xa9\x3f\x3f\xb4\xf5\xe8\xf9\x74\xa7\xf7\x8e\xe7\xb5\x68\x18\x48\x0f\x4b\xf4\x83\x69\x56\x1e\x65\xba\xe2\x5f\x04\x34\xb2\x53\x8c\xa7\x80\x8d\x6e\x0e\x7a\x26\xf0\x50\xb9\xac\xe0\x2d\xfc\x45\x95\x7e\x12\x48\x27\x94\x21\xaa\x8c\x1a\x0d\xc2\xee\xbe\x62\x63\x6a\x89\x72\x47\x1e\xb0\x50\xbf\x68\xcc\xec\x8f\x38\x33\xa3\x50\x50\x7a\x88\x99\x9e\x40\x0c\x50\x6f\x69\x3a\x60\x6e\x1d\xe9\x0c\x96\x23\x2d\xdc\x63\x29\xb4\xc8\x73\x51\xea\x3e\x69\x58\x3e\xa8\x08\x4d\xbd\x02\x35\xcb\xf6\xcc\xb3\xfd\x8e\x74\x54\x06\x46\x9d\x88\xdd\x36\xb6\xd0\xec\x1d\x1a\x79\xd0\x8f\x06\x3a\xd6\x0c\x02\x8b\x28\x42\x8e\x83\x3f\xa3\x3e\x3c\x99\xb2\xf3\xf1\xec\xfc\xf6\x7a\xbe\x30\x26\xc9\x1c\x6c\x14\xf7\x27\xf4\x87\x22\xf6\x9c\x87\x9b\x3b\x0c\x26\xd7\x4f\x02\x20\xba\x10\x58\x2e\x21\x6c\xc0\xcf\xd3\xdb\xe4\xe9\x46\x49\xd2\x6d\x92\x24\xcc\xe1\xff\xcd\xed\xef\xcc\xfa\x42\x6b\xc0\x3d\x33\xbf\xbd\x31\x16\xe3\xcc\x9a\x0c\x16\x89\x0e\x6c\xba\xd1\x3c\x09\x60\x05\x17\x53\x78\xe2\x66\x34\x9b\x4f\x27\x0e\x64\xd0\x83\x0b\x3a\x40\xc1\x10\x65\xf0\x20\xa2\xa0\x35\x51\x3e\x0c\x0d\x39\x00\xa5\xef\x41\x8b\xd5\xbe\x67\xbe\x6b\x01\x04\xdf\x4f\xa7\x17\x9f\xc6\x57\x57\x09\x76\x1d\x9b\x2f\xa6\x37\x37\xc3\xf7\x23\x43\xe5\xeb\x9b\x5b\x33\xe8\xe5\x70\x7c\x75\x3b\x03\x7b\xf4\x7a\x78\x75\x79\x3b\x39\xc7\xd1\x68\xf2\x00\x22\x79\x75\xe5\x68\x78\x6d\x4c\xdc\x68\x96\xf8\x31\x43\x08\x0b\xe3\xe7\xc8\xf3\x99\x36\xed\xc3\xf0\xe3\x88\xbd\x1b\x99\xbf\x4e\x8c\xed\xfa\x14\x88\xbf\xf9\xc0\x1a\x6e\x9d\x1c\x48\x23\x1b\x13\x75\x78\x73\x73\xf5\xd9\xd0\xde\xff\xd1\x90\xe0\x62\x34\x5c\x7c\x00\xd8\x44\xd8\x8e\xe1\x15\x1b\x4f\xfe\x74\x3b\x03\x23\xf7\xf6\x6a\x61\xf8\xee\x72\x36\xbd\x0e\x66\xfb\xc3\x3c\x84\x35\x24\xd3\x7b\xf4\xe7\xc5\x68\x82\x1f\x19\x9f\xc3\x2e\x5f\x0d\x3f\x19\xfb\xf9\xc3\xf8\xdd\x78\x31\xc7\xd7\xfd\x24\x07\x6c\x3e\xbd\x1e\xb1\x3f\xdd\xce\xc6\xf3\x8b\x31\xd0\x72\xce\x2e\xa6\x38\xd1\xab\xab\xe9\x27\x1a\xf4\xfc\xea\x76\x0e\x6b\x9a\x35\x56\xe8\x59\xe3\x20\x67\x24\x6c\x3e\x45\xe2\xf8\x71\xcc\x3e\x05\x03\x5d\x0f\x3f\xc7\xb4\xf9\x3c\xbd\xa5\x26\x33\x03\xec\x44\xf1\xde\xf0\xfa\x04\xe0\x28\x47\xe6\xc4\xce\x47\xb3\x39\x39\xe4\x3b\x52\x0a\x58\x2f\x68\x17\x26\x2b\xb1\x4d\x7a\x08\xb9\xc4\x51\x21\x66\x32\x6a\x6e\xfb\xea\x8f\xec\x7c\x70\x39\x98\x0d\x8c\xb4\x3e\x39\x65\x47\xd3\xb4\x1a\xb0\xd3\x9f\x7f\xfe\x09\x5b\xbb\x69\x74\x59\x03\x9a\x7f\x30\x70\x0b\x19\xa6\x07\x92\xf0\xc1\x47\xe2\x6c\x00\x9c\x56\x10\x68\xe4\xa5\x87\xc6\xf5\xb3\x3a\x3d\x1b\x9c\x9d\x9e\xb1\xa3\xb9\xd8\xd9\x79\x41\x7a\xa0\x99\x17\x66\xc2\x56\x9b\xf6\xe3\x66\x2e\xc1\xca\xce\xde\x0c\xde\x9c\x9d\x9c\x1d\x9f\xda\xa6\x03\xfe\x57\xaf\xd8\xd1\x9f\xea\x42\xd8\x15\x1b\x21\x8b\x44\x07\x5f\x29\xdc\x36\xa3\x22\x63\xb7\x5a\x18\x61\x8f\x28\x2f\x5d\x01\x4c\xe8\x99\x00\x19\xa3\xad\xe0\x78\xd8\x38\xe8\x74\xc0\xae\xc7\xf3\xf3\xd1\xd5\xd5\x70\x32\x9a\xde\xce\xdb\x81\x95\x67\x35\x89\xf8\xaf\xd3\x20\xa2\xab\x13\xd2\x32\x76\x49\x7b\xe4\x4e\x16\x37\xa7\x09\x7d\xc2\xd5\xa1\x76\x73\x89\x31\xe7\x78\xb1\x77\xe9\x16\xda\x7b\x81\xfb\xc9\x33\x1a\xe1\x7c\x6a\x18\x48\x99\xd4\x3b\xa8\xc0\x77\x09\x2b\xae\x16\x45\x15\x36\x8f\x1b\x4e\x5e\x2a\x2b\xf9\x77\x51\x00\xd0\x09\xdc\xf0\x16\x7c\x24\xdd\xf0\xb2\x02\x8e\xc1\x30\x9f\xe1\x5d\x32\xdd\x33\xe5\xba\xfa\x58\x8f\x2f\xb5\xdc\x99\x57\x88\xf5\xb7\x62\xc3\xad\x28\x65\xca\x13\xca\x00\x70\x56\xcf\xc1\x16\x45\x87\x5a\xdf\x44\xad\x81\x48\xb1\xbb\x14\x19\xa4\xe3\x9c\xbb\xde\x45\xe6\xb7\x13\xc3\xb9\xa2\x2c\x28\x53\x0b\x63\x51\x21\xb4\x2a\x70\xfd\x1d\xf4\x53\x42\xcc\x17\x59\xb0\x39\x2f\x2a\xce\xce\x73\x5e\x72\x33\x5c\xd1\x84\x63\x75\x51\xe1\x5c\x69\xdf\x3b\xa6\x59\x52\x03\x8d\x5d\x1e\xc3\x51\xc2\xfe\x55\xbe\xab\xcc\x23\xcd\x62\x6c\xd3\x99\x7f\x72\x9b\x23\xc3\x6a\x71\x08\x1d\x19\xca\x71\xac\x4f\xf1\xe1\xc5\xba\xe6\x98\xb2\xcd\x3d\xc2\x8b\xdb\x58\xe8\x35\x5a\xd6\xc6\x96\x24\x4b\x05\x8c\xa9\x12\x1d\x18\x1d\x5d\x1f\x3b\x7a\x06\x0d\xc0\x89\x3c\x9d\xb8\x6b\xdd\xdc\xc5\xe0\x2c\x45\xb1\x34\xd4\xae\xa7\xdd\xd3\x53\x57\x1a\xee\x04\x0b\x78\xe0\x4e\x49\x6b\xb7\xb1\x2e\x16\x72\x39\xa8\xe7\x10\x35\xed\x3c\x5c\xbc\x63\x98\x81\x70\xc1\xea\x4a\xe6\xf2\xef\x6e\x2b\xa3\x2c\xae\x56\xb2\x48\xd0\xd7\x5a\x11\x38\xa0\xe1\xc8\xa7\x2f\x2e\x5c\x18\x89\x06\x9b\x7d\x42\x15\x63\xb4\x38\xca\xf9\x84\xfc\x38\xf1\xb7\x5a\x62\xce\x13\xc0\x12\xf8\x4e\x8b\xe4\x05\x96\xda\xf7\xf5\x76\x75\x14\x51\xfc\xc6\x37\x96\x25\x5c\xbd\xa0\x77\x86\x4b\x08\xa2\x0e\x44\x03\x76\x6d\x54\xa6\x9b\xab\xd1\x31\x39\xd2\x51\x49\xc6\xd4\x92\x56\x5c\x1e\x32\xe7\x84\x96\x6b\x74\x93\x05\x95\xf1\x2d\xe7\x31\xd7\xec\xba\xce\x2b\xb9\xcb\xc5\xb1\xed\x96\x3f\x68\xff\xca\xa1\x8f\x11\x27\xb7\xbf\x89\x4d\x10\x34\x44\x37\x2b\x45\x5b\xf8\xc8\xc7\x71\x47\x83\x54\x3c\xf7\xd4\xcd\xf0\xca\x3a\x84\x20\xaf\xad\xc0\x30\xac\xb5\x57\xfd\xb5\xe0\xdd\x2f\x07\xd3\x5f\x49\x00\xb7\x93\x42\x62\xd0\xc9\xd3\x57\x03\x36\xbc\xb8\x18\x1b\xfd\xcd\xd8\x4c\xa3\xd9\xf5\x2f\x6c\xb8\x40\xfb\x64\x3c\x9d\xbc\xf0\xbe\xd6\xa1\xc6\x70\xaf\xd0\x90\x8a\xe7\xcb\x85\x14\xd5\x69\xad\x79\x21\xff\x8e\xa0\x9d\x70\x82\x03\xb4\xcf\x6e\x70\x9a\x5e\x9b\x37\x7b\x7d\xd7\xc2\x7c\xa3\x76\xb6\x43\x1f\xf4\x8d\x53\x5b\x45\x42\x0a\x0d\x69\xb3\xdf\x1b\x91\xef\xd8\x5f\x6b\x5d\xb9\x20\xb8\xdc\x02\x88\x47\x21\xd0\x55\x47\x1d\x48\x65\x71\x27\x34\xe1\x1d\x38\x3f\x67\x1b\x0f\x36\xfa\x55\xcc\x59\x36\x59\x36\xa0\xe0\x3b\x76\x14\x75\x21\x1f\xfb\x32\x91\x5e\x1f\xbc\x87\x2e\xf3\x0a\xd7\x01\xe2\x03\x72\x2c\xe2\x5c\x53\x33\xd1\x08\xae\xb0\x6c\xa4\x9c\x49\xcd\x72\x5e\x17\x90\x71\x02\x02\xc4\xd6\x97\x96\x75\x61\x03\xec\x0e\x29\xcc\x7a\x4b\x20\x72\xa0\x11\x6c\xcd\xa8\x83\x41\xd9\x21\x81\x9b\xb4\xb6\xc5\x2d\xf9\x07\xcd\x0e\xac\x8c\x1d\x71\xaf\x74\x2f\x45\xae\xee\xfb\x18\x1e\x51\x69\x5a\xbb\xda\xe0\x75\xc9\x77\x1b\x99\xa2\x0b\xc2\x97\xf4\x88\xed\x2e\x57\x7b\xcf\xb6\xce\x4b\x81\x2e\x14\xa3\x38\xb4\x53\x2c\x8e\x7c\xa2\xaa\xdd\x04\x37\xff\xc2\x2c\x71\x97\x73\xbd\x61\x3a\x2d\x85\x30\x0b\xc5\x43\x82\xd7\xa3\x36\xa7\x91\x56\x69\xe7\x24\x8d\x68\x0e\x1a\x44\xa4\x0d\x0d\xbc\x6a\xbc\x87\xae\x4a\x91\x87\x29\x74\xe2\x10\x79\x40\x61\x85\x03\x8c\xcb\xe9\x58\x68\x23\x7b\xb4\xb9\xf9\x2e\xdd\xd5\x25\x1f\x1e\x20\x26\x24\x4a\xe1\x57\x3a\x02\x64\x84\x4f\x17\xe4\xea\x37\x6e\x52\x37\xd3\xf8\x50\x12\x69\x69\x23\x0e\x31\x41\xb3\x6c\x06\x72\xd5\x9d\x5b\xcf\xca\x1e\xc2\x69\x6c\x6c\x51\x62\x7d\xc9\x46\xf7\x54\x6b\xec\x66\xcb\x7a\x7c\xa9\xea\xaa\xe7\x71\x77\xc0\x59\x8c\x4d\x5a\xb3\x48\xde\xf0\x52\x70\xb3\xf3\x0d\x72\xe0\xe0\x9a\xba\x78\xcb\x02\xa0\xf6\x30\xec\x00\xf3\x82\xd9\xb8\xa4\xf8\x83\x0b\xd3\xa0\x09\xdf\xe3\xe1\xd8\x0a\x51\xb9\xce\x9f\xe1\x71\x46\x38\x42\x28\xc2\x79\xe1\xfd\xde\xe1\xa0\x61\xcd\x98\xcb\x7b\x89\x61\x15\x30\x89\xc7\x47\x1b\x96\xa5\x14\x2b\xca\x2c\x49\x1a\xec\x0a\xb1\x28\x76\x3b\xbb\x7a\x58\xe6\x14\x99\x59\x41\x43\x55\x8e\x51\xc4\xe1\xbe\x6a\x9e\x61\x44\x03\xac\x36\x02\x32\x93\x10\x13\x30\x09\xeb\x94\x81\x77\xcc\x75\xe8\xce\x1e\x96\x23\xf9\xf2\xce\x9a\xc2\x06\x95\x82\x1c\xb1\x50\x8d\xa5\xfd\xa6\xe9\xc0\xbe\x59\x38\xdf\x8c\xcc\x8a\x83\x92\xc8\xa7\x8b\x37\xaa\x16\x0e\xed\xa0\x99\x16\x25\xe9\x84\x7b\xb0\x72\xd0\x26\x14\x7a\x09\x12\x85\xa0\xf2\x5d\xf8\x7b\xfe\xd0\xd0\x56\x65\xee\x98\xa5\x53\x75\xa0\xf7\xbc\xd6\x01\xed\x7c\x90\xe3\x57\x4c\xd9\x0b\x20\xac\x8f\x87\x7d\x5a\x83\x64\x28\x59\x2a\xca\x8a\x4b\xb0\x4d\x1e\xb8\xb9\x7c\x0a\x1b\xaa\x0d\xfb\xf8\x0e\x83\xfd\xf7\x6b\x07\x1f\x72\x74\xde\x42\xbe\x07\x2e\x0e\xf2\x25\x1f\xbe\xc7\x1a\x7d\xd7\xdb\xc2\x86\x7c\xc7\xd7\x51\x73\xa9\x65\x8d\xed\x85\xa2\x2b\x10\xc5\x39\x28\x97\x90\x50\x8c\x7d\x85\x8c\xa5\x01\x64\x0a\x0a\x3e\xdb\x1a\x0a\x50\x07\x3b\x48\x1f\xa2\x53\xca\x0b\xf3\x49\x5a\x6a\x00\x0a\x67\xa5\x91\xcd\xce\x27\xf5\xc2\x42\x4f\x56\x51\xe7\xa7\x70\xf3\xf8\xc1\x1b\x14\xb3\x8b\xdb\x22\xe0\x81\x7a\xfc\xf6\x8c\xdf\x62\xa0\xcd\xa8\xfe\xa0\x12\x80\xf9\x8e\x39\x69\x47\x66\x25\xe2\x6b\x2a\x04\x8c\x75\x7a\x02\x0f\xe9\xfe\x5b\xa8\x4f\x35\x0f\xc6\xa2\xa5\x09\x16\xd0\xf5\x31\x48\x46\xcb\xfa\x56\x04\xa5\x0a\xaa\xdb\x29\x04\x6d\x5e\xea\xb5\x85\x4c\xcf\x01\x50\x99\xef\x8e\x57\x01\xcf\xb9\x3b\xce\x17\x04\xef\x0f\x91\xcb\x07\x74\x4a\x41\x51\xd6\x38\xa7\x3d\x48\x28\xb7\xb2\xe9\x81\xe1\x0e\x93\xd4\xcd\x36\xc3\x6a\x49\x9e\x36\xab\xfe\xf3\x3c\x68\x96\x95\x30\x2d\xca\x3b\x28\x34\x82\xde\x59\x14\x63\x85\x07\xa8\xbb\x16\x65\xe0\x51\xa2\x35\xdd\x8a\x87\xe6\x15\x02\xfe\x38\x3d\x24\xb6\x5a\x88\x7f\x3d\x66\x9e\x83\x16\xc0\x45\x49\x5b\x05\x84\xd9\xde\xf6\xd6\xb1\x7d\xba\xdc\xa8\x71\xcb\xc2\xf0\xc5\xc4\x77\x93\x8a\x5b\xf5\xfb\x2c\x44\xdf\xf7\x6d\xe9\xbc\x00\x3c\xf4\x13\x68\x51\x81\x59\xdb\x2c\xa4\xc1\xf6\x96\x1d\xe6\xc6\x64\xb4\x80\x38\xc1\xed\x7c\xe4\x7c\xc1\xe0\xde\xed\x8d\xbe\x82\x15\x64\x36\xc9\x28\x8e\x66\xbf\x43\x48\x68\xc0\x78\x0b\x53\xd7\x13\xac\xcb\x82\xce\x02\x8f\x80\x2b\x36\x0b\xd3\x81\x67\xcc\xb5\x8f\x6e\x5c\x2b\x0e\x1f\x79\x8f\xc0\x9a\x5c\xcf\x08\x84\xad\x09\x82\xdb\x9f\x55\xed\x01\x6e\xa9\x0c\x5f\x01\xbb\x94\x0d\x8c\xa7\x70\xe2\x68\x2b\xe3\xe3\x3b\x51\x6a\xea\x01\xd1\xc6\x33\x68\x14\xd2\x3b\xe3\x7b\x45\xf9\xb9\xd0\xb4\x98\xb3\x42\x54\xf7\x20\x44\x87\xf0\x8a\x6d\x61\xe9\xfa\xd8\xb9\xab\x86\x90\x1b\xc1\x18\x47\x67\x83\x8b\xe5\x05\xf7\x25\xb4\x7a\x06\x82\x75\x6c\x90\x8b\x0b\x3e\x89\xf0\x50\xd9\x12\xa1\x4f\x20\xf7\x69\x5f\xdb\x48\xcc\xfc\x25\x2e\xe4\x6a\xd6\x1b\x46\x55\x80\xa3\x3f\x43\x9c\x84\x0d\x07\xec\x59\x0d\x55\x06\x2f\x7a\x8b\x06\x04\x3e\xb0\x30\x36\x9e\x2f\x5b\x4e\xc8\x67\x76\x6b\x01\x41\x69\x9b\x2a\xf4\xdf\xba\x9c\x68\x23\x09\x6b\xdb\x5b\x0e\xbe\x45\x4e\xe2\x03\x75\x75\x2e\x75\xcd\xa6\xaa\x23\x3e\x43\x84\xd6\xe5\x33\xcd\x79\xc5\xfe\x12\xfe\xe0\x55\x1a\xb8\xcf\x97\x00\x09\x46\x96\xdb\xb5\xfa\xbb\xcc\x73\xde\xe8\x3d\x19\xac\xe3\x14\x2e\x68\x17\x7e\x3e\xc5\xd2\x92\xd3\xb0\xfc\x94\x67\x99\xf5\xf6\x18\xfe\xb3\x5a\xb8\x83\x26\x45\xa6\x74\x41\x15\xe2\x4e\x4c\xad\x09\x2e\x75\x70\x92\x36\x94\xff\xc3\x2a\x18\xb6\x09\x27\x08\xae\x24\xc8\x2b\xf6\xd8\x48\x36\x55\x1d\x43\x05\x4d\xbb\xcf\x5d\x4f\x83\x17\xae\x01\x5f\x78\x42\x7d\xaa\x7f\x40\xbb\x18\xa6\x0d\x0c\x19\xca\x15\x26\xe0\xce\x87\x73\x85\x09\x51\xcb\x1e\x48\x84\x44\xcb\xa5\xc8\x06\x6c\x2e\x44\x5c\xa0\x41\x2b\xb7\xed\x10\xbd\x5f\x15\x03\x0f\x01\x90\xb9\x21\x64\x58\x62\xd4\x9a\xf9\xe0\xc5\xa2\x75\x34\xa5\xfe\x4b\xe7\x4f\xe3\xd9\xc0\xc3\x44\x8d\x81\x0f\xe3\x0b\x69\x16\x72\xdd\x78\xc5\x72\xb1\xaa\xd8\x32\xe7\xc5\x97\x83\x1a\xab\x3c\xd0\x52\x05\xa7\xd1\x51\xe6\xdd\x25\x66\xa2\x2f\x9b\x6f\x0f\xf3\xbc\xe5\x94\xc3\x4a\x03\x6a\x29\xb9\xdc\x87\x6f\x10\x56\x86\xeb\x53\x9c\xf6\x59\x30\x50\xb3\x03\xdb\x8b\x30\x59\xe6\x10\x11\x87\xde\xa1\x67\x75\xa6\x6e\x31\x13\x5e\x29\x9d\xb5\x2a\x02\xbf\xe1\xab\x0c\xcc\xaf\xfe\xfd\x2f\x7f\xf9\xcb\x7f\x04\x45\x10\x2e\xc0\x03\x7d\x7f\xe0\xd2\xf7\x31\x28\xb5\x82\xe7\xc3\x57\x60\xc5\x41\x14\x4a\x16\xba\x12\x3c\xc3\x2f\x02\x46\x1f\xe6\x79\x8d\x57\x20\xb5\xee\xa5\xde\x80\xfe\x6f\x54\x5f\x7b\xc0\xf7\xad\x62\x04\xbb\xa6\xc3\x00\x86\x38\xf3\x70\x1e\x84\x7a\xe0\x06\x87\xcb\x54\xdb\x0a\x9c\xc3\xdf\xf0\xc3\x9f\xdf\x0c\xaf\xa0\x92\x1f\x41\x29\xe0\x95\x4c\xa4\x18\x02\x5c\xee\xa9\xe7\x09\xa9\xd9\x01\x59\xc8\xf4\x81\x10\xcc\x2e\xe7\x29\xd0\x6d\xeb\xc5\xae\x75\x5b\x14\x99\x35\xc9\xfc\xbb\x61\x6b\x90\xd6\x7e\x00\xef\x1b\xb2\x51\xb9\x08\x41\x4d\x77\x7d\x3e\x89\x6a\xdf\x6c\x53\xd0\xc7\x56\x1d\xb4\x83\x08\x9d\xc8\xf1\x24\x7a\x2f\xfe\x7d\x32\x5d\x8c\x7e\x21\xfd\xea\x6b\xe5\x46\xf2\xb2\x12\xab\xcf\xa1\x44\x44\xe7\x86\xcd\xf3\xbd\xb7\xdd\xfc\x3b\x96\x16\x9d\x25\xd6\xd0\x19\xa3\xf3\x5c\xe2\x85\x45\x9e\x37\xdb\x25\xe0\xc0\x4c\x4a\xee\x95\x28\xf7\xd8\x4a\xd5\x85\xab\x7a\x8c\x8f\x7c\x03\xcc\x10\xfd\xeb\x31\x66\xdc\x7f\xbc\xb0\x7a\xc1\xbb\xc1\x21\x35\xfc\x45\xf8\x7b\x2f\x01\x10\xaa\xe6\x97\x03\xa7\xfb\x2f\xd1\x5b\x37\x0f\x9b\x61\x4f\x1b\xe4\x76\x76\x75\xf8\xc1\xf7\x64\xbf\x8d\xd1\x35\x14\xf4\x0e\x26\xd2\xc4\x8e\x40\x72\x88\xbe\xb8\xf0\x5e\xdf\x07\xdc\x5f\xff\x6e\x59\xf9\xc7\xc0\x22\xce\xfe\xc3\x0c\x1d\x96\x4a\x07\x09\xf8\x41\x0a\x86\xe3\x40\xfe\xdb\x37\xad\xa2\xe2\xa5\xff\x5e\xfd\x2a\x07\x3f\x9e\x9f\x1f\xbf\xfb\x7c\x3c\xb9\x38\x7e\xf9\x5b\xf5\x80\x7c\xb8\xff\xe3\xab\xd3\x93\x57\x6f\x9a\xfd\xdf\x5f\xbe\xfc\xde\xff\xfd\x77\xf9\x39\x07\x24\xae\x3b\x6b\x5a\x44\x4e\xa4\xe3\x89\x82\xe2\x4c\xcd\x5e\x0e\x4e\xd8\x6d\x61\x8e\x8e\x39\x49\xb3\xd1\x10\xca\xa9\xce\xa7\xd7\xd7\xd3\xc9\x9c\x9d\x4f\x67\x37\xd3\x19\xa6\x64\x8d\xe7\x98\x91\x05\xf9\x63\x97\xe3\xd9\x35\xe4\x6c\x5d\x4c\x47\xf8\x7b\x2a\x7d\xa3\x8c\x49\xdb\x0a\x78\xe0\x53\x14\x29\x3f\x2c\xaa\x89\x73\x6f\xc3\x97\x47\x6c\x38\x61\xc3\xc5\x62\x3a\x9b\x8c\x3e\x1f\x9f\x5f\x8d\x47\x93\x05\x9b\x8d\xae\xe0\xfb\xf3\x0f\xe3\x9b\x41\x7b\x86\xf4\xd9\x39\x8e\x8b\xe9\x79\x94\x8b\x66\xeb\xed\x8e\x5d\xbd\x5d\xc7\xfb\xd7\xc3\x7f\x83\x29\x84\xf5\x72\xb3\xd1\xfb\xe1\x0c\x12\x3b\x31\x51\xd3\x8f\x69\xeb\xfb\x12\x5c\x3b\x55\x51\xcd\x9b\x99\x7b\x94\x5a\xd8\x48\xd4\x1b\x2f\xe6\xe8\x98\xb0\x5d\xf8\xcd\xe8\xe0\xae\x38\x1a\xce\xd9\xc5\xe8\x72\x3c\x19\x5d\xb0\x77\xa3\xab\xe9\xa7\x7e\x67\x31\xe1\x08\xbc\x1c\x73\x47\xc5\x36\x31\x6e\xdf\x5d\x8d\xcf\x1d\x75\x8f\x7a\xe7\xe7\x37\x57\x3d\x36\x9d\xb1\x1e\xfd\xae\xd7\xc7\x32\x3d\xf8\x2c\x7e\x63\x31\x3a\x5f\x60\x8f\xee\xf3\xe9\xcd\xe7\xd9\xf8\xfd\x87\x85\x59\xdd\x8f\x36\x7b\xb5\x91\x3a\x38\x00\x9b\xc3\xf5\x41\xa6\xa1\xf0\xc9\xc5\x07\xb3\x81\x51\x15\x5a\x57\x21\xe4\x2c\xf8\x92\x61\x26\x9c\x07\xdc\xa7\xa3\x8b\xc1\x8b\x77\x9f\xd9\xe8\xcf\xa3\xd9\x39\xf6\x61\x86\xb2\x3e\xf3\xa8\x2b\x26\x84\x0f\x3a\xe2\x7c\x18\xcd\x46\x58\xef\x37\x3c\x87\x32\x37\xc8\xf8\x7c\x3f\x1b\x41\x06\xe4\xbb\x11\x7b\x37\xbd\x9d\xb8\x16\xe4\x31\x01\x5d\x51\x5d\x9c\x2b\x19\xcd\xf6\x7a\xf8\xd9\x8c\x72\x3e\x9d\xcc\xc7\x17\x90\x5d\x8b\xc3\x0e\x83\x44\x5f\xf3\x2e\x3e\x3f\x9d\xb1\xf7\x86\x8d\xe6\x30\x23\xf3\x7b\x9a\xbb\x79\x78\x08\x1b\x6c\x26\x4c\x0d\xab\x61\x44\x97\x39\xf9\x79\x7a\x3b\xa3\x45\xd8\xe2\x48\x48\xce\xc4\x39\x53\xa3\x74\x74\x78\x61\x2a\xca\xe9\x80\x05\x8d\x5a\xc9\xe7\xc8\x07\xac\x37\xcc\xf8\x0e\x2d\xb6\x46\xdb\x47\xb4\xcf\xa1\x90\xc4\xdc\x7a\xe6\xfa\x45\x3f\x5d\xf8\x9b\x48\x2d\x15\xc7\xe2\x2b\x25\x3b\x82\xb7\x89\x12\xe1\x38\x75\xad\x2e\xb4\xc5\x66\xe0\xee\x9b\x09\x02\xcd\xa2\xf0\xb9\x87\x4f\x84\xe5\x2d\x6a\xc5\xb6\xb5\x96\xa9\x47\x88\x87\x0c\x05\x5f\x84\xcb\x59\x2e\xcd\x2f\xca\x3d\x76\x04\xab\xcc\xf7\x53\x1a\xc9\xdc\xf3\x1b\x55\x00\xca\x23\xc3\xd6\xfd\xa0\x73\x14\xa4\x4e\xbb\xd8\x75\x2a\x0b\xb1\xe5\x95\xb2\x1e\x6a\x3f\x3f\x6d\x83\x05\xf8\x75\x88\xe6\x39\x23\xc7\x11\x81\x8c\xa7\x52\xa4\x5c\x57\x09\xf5\x11\x85\x4c\x3f\x4c\x63\x33\xc3\x89\x10\xf9\x36\xec\x16\x5a\x8a\x54\xad\x0b\xf9\x77\x08\x23\x10\xec\xae\xd7\x7e\x2d\x58\xa2\x03\x6d\x24\x24\x53\xd8\x22\xdb\xd4\x90\x72\x5b\x10\x55\x0f\x7d\xe4\x16\x3b\x01\x90\x79\xc8\xeb\x90\x81\x0a\xc4\x0b\xe6\xf7\xdc\xd9\xf7\x14\x7e\x6b\xd7\x29\x5e\xda\xd4\x90\x3b\x25\x33\x4e\xc0\xfa\x99\xaa\x97\x55\x42\xe5\x16\x8e\x0c\x90\xc2\x07\xfb\xc5\x73\xda\x82\x90\xe4\xe1\x76\xa0\x29\xaa\xf7\x45\xba\x29\x55\x11\xe4\x1f\xf9\xc1\x0a\x08\x7b\x64\xc7\x98\xa3\x67\x9b\x74\x70\xb6\x55\xd0\xb7\x0d\xa3\x08\x47\x3d\x18\x43\x16\xeb\x5e\xdf\x81\x45\xfc\xea\xc5\xd2\xb1\x58\x0e\x58\xcf\xd3\xd1\x1f\x8b\xd4\xd3\x16\x5c\x95\x07\x18\x2f\xe0\x7b\x51\xa4\xfb\x34\x57\x3b\x91\x49\x8e\x0e\x12\x5e\x54\x1b\x95\xab\x35\x84\x02\x63\x9e\xd4\x89\xa7\x0f\x36\x0c\x2b\x15\xcf\x0c\x4b\xe1\xa3\xd4\x5f\x0f\xd4\x60\x6c\x41\x1a\x66\xae\x06\xde\x5f\x7c\x24\x97\x3a\x6e\xb5\xc1\x4e\x8f\x56\x7d\x0c\xbc\x25\x41\xcd\x29\x06\xb1\x2c\xed\xb5\xb0\x4b\x84\xd9\xc6\x67\x11\x7d\xf6\xd6\x81\x90\x84\x69\x55\x11\xf6\xb0\x05\xf6\xd4\x49\xc7\x61\x91\x3a\x42\x92\x91\x95\x86\x24\xcf\x52\x00\x24\x53\xd8\x84\x06\x8e\x07\xcf\x95\xed\x87\x17\x42\x1e\x5a\xbc\xa3\xc2\x03\xc8\x50\xa2\x9c\x9b\x14\xa4\xf7\xda\xae\x1a\x78\xde\x33\xb1\x13\x45\x06\xbe\x37\xa0\x11\xda\x0e\x54\xf2\x6f\xb1\xc9\x2a\xb5\xa6\x46\xb0\xa5\x80\x4a\xa7\xed\x32\xc7\x7e\x8c\x2a\x60\x82\x3b\x40\xb6\xcd\xc5\x80\x0d\xbf\xd9\x61\x0c\x93\x5c\xc0\x2e\xef\x37\x59\xf6\x60\x9f\xaa\x74\xc0\x7a\x0e\x13\xd0\x77\xb0\xa4\x54\xe2\x08\x9a\x1d\x87\x03\x3f\x6b\x28\x61\xa8\x03\xa1\xef\xd4\x4f\xfb\x65\x13\xbe\x35\xe4\x68\x3a\x46\x0b\x7a\x25\x3b\x0c\x38\x3b\x99\x6c\x60\x1d\xce\xea\x40\x63\xe3\x24\xf8\xb7\xd9\x38\x0a\xc7\x97\xae\x13\x21\x92\x13\x60\xb3\x8e\x74\xdf\xcf\xe6\x89\x6d\xbb\xc4\x20\xe8\xcf\x3a\xac\xab\x8d\x9b\x88\x4b\xf4\x02\x17\xd5\x63\x57\xc8\x73\x67\x7d\xbf\x51\x0e\xf0\xc4\xcd\x59\x95\xc6\x18\x2e\x54\x77\x63\x67\xdb\xe0\xd2\xf5\x77\x4e\xfc\x0e\xe9\x8d\x0d\x83\x4a\xef\x65\x86\xfa\xd9\xd6\x22\x42\x49\x8b\x99\x40\x98\x3c\xaa\x65\xb1\x86\x10\x1b\x08\x66\x09\x14\x00\x39\x5e\x52\xef\x54\xba\xbd\x29\xde\x63\x16\xc0\xd3\x0a\xdf\x33\xb7\x73\x2e\x01\x3d\x14\xca\xbc\xe5\x36\x61\x60\xcb\xcb\x22\xc1\x1c\x98\x5d\x29\xe2\xae\x89\x76\x1e\x0f\x88\x47\x58\xfb\x57\xdb\x90\x13\x1b\x09\xab\xfc\x4b\xae\x4a\xf1\x16\x0b\x70\xdb\x8b\x73\xd7\x38\x79\xaf\xb2\x3a\x15\x25\x5b\x0a\xe7\x4f\x83\xe9\xb3\xb8\xa1\xe5\x1e\x56\x83\x65\x91\x2b\xf9\x95\x40\xc4\xb5\xaa\x8b\x4c\xb7\x89\xe6\x58\x1b\x1f\x00\xb2\x27\x66\x3e\xed\x09\x85\x82\x39\x48\x42\xb4\x98\x5e\xbc\xc2\xe3\x01\x39\x2f\x15\x20\x0c\xd0\xf3\x96\x3d\x57\x03\xd6\x0b\x3b\x6d\x57\x58\x8c\x8b\x04\xb3\xad\xb4\x42\xa2\x39\xdc\xbd\xc7\x9a\x65\x3c\xd8\x19\x86\x4a\x1a\xb2\x3a\xad\x02\x50\x69\xfb\xe1\x84\x69\x48\xaa\x01\x37\x3f\x4a\x7f\x9a\x41\xa6\xb6\xdc\x6c\xf9\xfd\x86\x57\xe2\x8e\x12\x3c\x08\x54\x6c\x4b\x1e\x15\x9b\x76\x05\xf2\xdc\xed\x6e\x30\x9f\x4c\xae\x65\xe5\xba\xb5\x7a\xcd\x70\xa9\x94\x51\x14\xf8\x76\xb7\xc9\x45\x15\xb0\x24\x65\x4c\xbe\x85\x16\xaa\x84\x80\xcc\xb3\xac\x84\xae\xbf\x5a\x94\x5b\xdc\x70\x7f\x2d\xba\x3b\x8c\x6f\x05\x81\x28\x98\x97\xb3\x92\x43\xe9\x31\xe4\x76\xd1\xbf\xd5\x71\xa8\xa7\x98\xa7\xd2\x8d\x2a\x85\xd3\x00\xef\xe9\xdc\x0a\xc3\xe4\x15\x97\x58\xc7\x22\x0b\x96\xd5\xdb\x25\xd3\x1b\x75\xff\x36\xd0\x75\x52\xb5\xdd\x29\x2d\xbd\x96\x12\x34\x82\x04\xf7\x1b\x7c\xa0\xa1\x64\xe2\xa5\xa1\x02\x8f\x16\xd7\x98\x8f\x03\xb1\x78\x38\x29\x44\x48\xdb\xb2\x82\x7a\x1e\x33\x5e\xf0\x5c\xad\x55\x8d\xe0\x61\xe1\xb8\xfb\xb7\x56\x37\x34\x5a\x5a\xc9\xef\xe1\x14\xef\xb8\x84\x16\x13\x09\xf6\xcc\xad\x2c\x35\x75\x5a\xe7\x3b\xfc\xa7\x28\xd6\x25\xb6\x4e\x87\x10\x58\xb5\x09\xc6\xdb\x6d\xd4\xb7\x9f\xb6\x1f\x34\x9a\x33\x66\xf9\x00\xef\xbd\x85\x66\xba\x79\x5e\xeb\xaa\xb4\xcd\x9f\xf9\x0e\x24\x50\x91\x30\xfd\x45\x54\xe9\x06\x7d\xce\xa5\x10\xc7\x99\xdc\x8a\x42\x63\xa6\x2e\x0c\x86\x7a\xe3\x1d\x5c\x79\x6b\xda\xd9\x7d\xc2\x2a\xb5\x73\xff\x0e\xa9\x01\x2a\x95\xe1\xff\x14\x98\x26\x90\x0c\x6f\x21\x49\x8e\x4e\xf0\xdb\x50\x1a\xbd\xa5\x78\xa2\xf4\x1d\x96\x33\x5e\xf1\x46\x95\x0d\x62\x11\xee\x4a\x65\xbe\x64\x9b\xa8\xbb\x34\x1c\xb8\x95\x91\x09\x21\x01\x17\xe6\x4e\x5f\xb7\x04\xbc\xe3\xa5\x14\x78\xd3\x40\x7e\x84\x76\x0f\x94\x9d\xdf\x02\x34\x23\x27\x91\x43\x75\xe3\xb0\x58\xb6\xa2\x69\x3d\xa0\x1e\xc0\x07\xfa\x19\x3f\xdc\xc7\xb8\x01\x9e\xb8\x51\x10\x07\x05\x38\x74\xea\xa8\x9e\xef\xd9\x9d\x54\xb9\xbb\x21\x9f\x06\xbb\x18\x59\xa0\x76\x58\xd7\x55\xc0\x06\x32\x83\x0c\x13\x67\x40\x59\x3d\x24\x6a\x7a\x71\x78\xca\x99\xd0\x3b\x59\x61\xbb\x14\x6a\x01\x8f\xd3\xb5\x85\xc2\x8c\xb1\xcd\x80\xf5\x30\x50\x9d\xef\xd9\x0d\xee\x44\xa0\x71\xd9\x1b\x90\x74\xac\x52\xa4\x2e\x24\x1a\xea\x55\x16\x12\xdc\xa7\x5f\xb4\x94\x33\xa5\x45\xc7\x28\x09\xe5\x7c\xd0\x17\xa1\x5b\x3d\xf5\x42\xf7\xd2\x76\xb9\x67\xf7\x12\xb9\xda\xfc\x3f\x24\x07\xfa\xe7\x71\x4c\x2b\x91\x43\x1b\xe4\xed\xa3\x3a\xe3\x27\xab\x39\x13\x0c\xe8\x3d\x27\xc8\x80\xad\xd8\x2e\xa1\x4d\xd6\x2a\x7c\x1c\x30\xed\x28\x5f\x18\x12\x3d\xf1\x7d\xd8\x1f\xce\x30\xe0\x05\x97\x4d\xe5\xfe\xd3\x33\x5c\x0e\x79\x84\x1a\x23\xa5\x46\x53\x7f\x1b\x12\xd8\xab\xa8\xd1\x04\x0f\x50\x27\x80\xbc\x0c\x33\x75\xe2\x77\xed\xdc\x03\x8a\x84\x9b\xd6\xa0\xf0\x61\x3a\xc2\x3c\x9d\xd0\xa0\xe8\x9e\xff\x6f\x37\xf3\x68\xae\x7e\x6c\x2d\xd7\x66\x9f\xad\xaa\x52\xa2\xb5\xeb\x40\xf1\xe4\x80\xf5\x66\xb6\x79\x68\x53\xd7\xef\x50\xe1\x0f\x7c\xa5\x43\x43\x58\xee\xf1\xa3\xd8\x42\x4b\x9b\x33\x5f\x8a\x14\x90\x30\xd7\x3a\x06\x75\x02\xbd\x4d\x7e\xf5\xcd\xe6\x6d\x3b\x53\xc8\xbc\xa4\x3f\x1c\xa4\x9e\xae\x54\xe9\xaa\xb3\xbc\x6c\x3c\xe4\x2f\x80\xab\x37\x50\x20\xfc\xc5\x2f\x7c\xef\xa7\xad\xc8\x64\xbd\xb5\x3d\xb4\x2f\xb9\x2c\xd9\x85\xe0\x80\x30\x87\xc1\x73\x5f\x39\xd4\xc8\x12\x8b\x4a\x88\x00\x40\x13\xdb\xb2\x02\x65\x92\xb0\xf1\x1b\x10\xb2\x36\x86\xd8\xaa\x14\x84\x98\xe3\x53\x2a\xcd\x83\x94\x0c\x81\x25\x58\xf8\x40\x98\x15\x01\xca\x6f\x2a\x76\x36\xfc\xc4\x2b\x0b\x27\x85\xb1\xb4\x95\xed\x4e\x5a\x14\xce\x74\xa4\x48\xb0\xff\x0e\x11\xcc\x27\x2e\xf9\x3f\x51\x6e\x1c\x79\xcb\xa2\x02\x4f\x6d\x3b\x1d\xda\x55\x63\x2f\xde\xb8\x0b\xaf\x43\x74\x04\x6b\x90\x32\xb5\x3a\xe0\xd4\x9d\x5c\x3d\xd8\x7d\xf7\xd1\xe6\xbb\xe0\x1e\xda\x09\x70\x19\x1c\x59\x43\xd7\x65\x74\x13\xe3\x04\x4b\x70\x8b\xec\xbb\x2c\x84\x03\x9d\x8c\x64\xe8\xa1\xd4\xd8\xef\x8a\x72\xce\x7f\xf1\xbe\xcf\x4a\x31\x77\x8a\x02\x26\x05\xd8\xe9\x54\x95\x3b\x55\xda\x6e\x20\xe4\x91\x6a\xb4\x5d\xf0\xe6\xbd\x76\x1d\x1e\xda\x03\x62\x69\x82\x1b\x2f\x88\x96\xba\xb7\xd1\xd6\xf0\xde\xa7\x4a\x79\x7c\x7f\x94\x8e\xcd\xeb\x26\x9c\x95\x83\xb5\x6f\x7f\x27\xf8\x46\xe0\x28\x38\xec\xd2\x0b\x70\xae\xa4\x39\x2c\xc5\xf1\x3d\x97\x77\x40\xfc\x73\xb5\xdd\xd5\xb9\x56\xe5\xde\xb1\xcf\x3c\xdd\x88\xad\xd0\x03\xc4\x0d\x31\x97\x55\x58\x1e\xab\x63\xdf\x8f\xc3\x0e\x25\x07\x0a\x31\x06\x9a\xfa\xe8\x61\x00\x00\x1f\x40\xf3\x55\xa8\xa0\xa4\xfe\x9b\xb8\xe1\x20\x39\xe0\xab\x36\x77\x7a\x29\x98\x99\xa2\xb5\x9a\x1d\x57\x96\x98\x26\xa3\x1b\xa9\xab\xad\x59\x60\xd5\xa1\x9b\x8a\x45\x09\x77\x4c\x15\xa7\x15\x36\x60\x7d\xda\xfa\xc3\xdb\x80\x80\x72\xc0\x3e\xfd\x0b\x53\xef\x20\xe9\xe0\x97\xbf\x3b\xe1\xc2\x23\x00\xd4\x93\x03\xf6\x51\xe5\x75\x51\xf1\x2e\xa2\x2d\x0e\xcc\xf8\x30\xa1\x7c\x42\x6c\xa4\x5f\xa8\xd2\x79\x84\x10\xf7\xc6\x25\xe1\xba\xe1\xd1\xaf\x0d\xda\x8d\xad\x26\xc6\x63\x65\xe8\xa9\x52\x50\xcd\x51\x90\x67\x5b\x59\x40\x69\xba\x66\x77\x6e\xee\x4d\xe2\xeb\x04\x3a\x43\x22\x06\x12\xbe\x4e\xed\xf4\xfe\x11\x02\xba\x1c\x66\xcc\x27\xa2\xe7\xc9\x50\xb7\x83\x66\xb6\x7f\x18\x35\xd0\x2c\xd0\xc9\xca\x2b\xed\x88\x53\x28\xec\xc5\x05\xb6\xb5\x6f\x21\x96\x21\xa6\xf3\xa0\xfd\x09\xdf\xb3\x2a\x04\x08\x46\x30\xf8\x74\xd3\xc0\x4d\xe5\x98\x82\x5c\x89\x74\x53\x10\x18\x58\x04\x7c\x70\x40\x98\xe3\x6d\xd6\x9a\x34\x56\x6d\x78\x4b\x67\x6f\x3b\x77\x14\x2a\x68\x17\x05\x73\xf1\x5e\x56\x1d\x5d\x78\xd6\x37\xfe\xc7\xa3\x15\x81\x57\xd0\x8b\x98\x47\x63\xb3\xcb\x03\xf4\x21\xc7\x16\x66\x21\x74\xf9\x95\x2e\x29\x0f\x61\xeb\x67\xa4\x2d\xe0\xe7\x16\x01\x3c\x6e\xbb\x03\x36\x7b\x49\xf4\x8c\xca\xde\x21\xe9\x3a\xc8\xfb\x75\xc9\x95\x3e\x29\xc5\x57\x80\x94\xc1\xe7\x82\xfb\xcd\xe6\xe9\x06\x77\x89\x2a\x1f\xb8\x4a\x9e\xd2\xf0\xb7\xb3\xb3\x24\xe5\xff\x26\x36\x03\xec\xb6\x90\x30\xf2\x4c\x68\xcc\x8f\x1a\x5b\xe7\x66\xc9\x8e\x6e\x67\xe3\x3e\xf6\x3e\x7a\x4a\x73\x5f\x98\x98\xf9\xe4\xc3\x8b\x78\x46\xa7\xdf\xc0\xb1\xcd\x2b\xaf\xd7\x1d\xb6\x45\xed\x6d\xe9\x9b\xe5\x56\x61\xe3\x8f\xd8\x59\xfe\x70\x67\xc5\x4a\xd9\xaf\xda\x97\x0f\xa4\x27\xb6\x72\xad\xcd\xb2\x3c\x38\xa9\xfb\x60\xb0\x1d\x5f\x84\xd8\x19\x1d\x85\xa7\x58\x33\x62\x73\xe5\xe8\x83\x2b\xeb\x2b\x68\x82\xb4\xa2\xd2\x07\x8d\xe0\xb8\xdc\xa2\x88\xa3\x16\x45\xe0\xd1\xfe\x07\xf7\xe5\x93\x6d\x71\xf0\x44\x2e\x4c\xa2\x25\x07\x1b\xe8\xb1\xef\x40\x7a\x40\x10\x2d\xe5\x50\x1e\xa8\xeb\x52\x3c\xb6\xb7\xc1\xf6\xf1\x03\x9b\x07\x32\x98\x6a\x7a\xbe\xed\x2e\x02\x74\x8b\x3d\xef\xd8\x53\xcf\x57\xb3\x3d\xa4\x28\x86\x31\x24\x94\x76\xb0\x81\xae\x92\xc9\x97\x8e\x85\x0a\x25\xe3\xd0\x72\xdd\xf9\x40\x50\x51\xac\xb4\xc8\x57\x16\xcd\xba\x21\x5e\x1e\x38\xef\x31\x02\x7b\x3c\x21\xc8\x05\x08\xc1\x43\xcd\x46\x39\x01\x69\x59\x33\x69\xf5\x6f\xe0\x69\x85\x3a\x7d\xc2\x4a\xb1\x35\xc2\x2f\xe8\x7a\xef\x57\x51\x40\x2f\x94\x4c\x42\xab\xc2\x30\xd7\xd5\x93\x72\x69\xa4\x36\xfe\x11\x4a\xed\x83\x18\x2e\x4d\xdc\xf3\x5d\xf2\x88\xf8\x2b\x63\x8d\xde\x4f\x9f\xd0\x4e\xb9\xfd\x4c\xa3\xf1\x71\x57\xeb\x44\xb3\xc9\x49\xeb\x4c\x36\x8b\xef\x3c\x1e\xca\xa7\x46\x29\x42\x12\x56\xb2\xda\x6e\x1f\x60\xdf\x82\xf9\x01\x96\xbc\xed\x83\x84\xf8\x0f\xb2\x58\x23\xb4\x6a\x75\xa8\x8c\x0f\xe3\x60\xec\xc8\x18\xd6\x5a\xd4\x99\x2a\xf6\x5b\xcc\xd3\x74\x36\x56\xdf\xfc\xa7\xae\xd1\x09\x9b\xd8\x50\x84\xec\x1e\x88\xfe\xea\xf6\xdb\xc3\x60\xf0\x22\xa8\x1e\x05\x43\x9e\x80\x47\x8f\xc4\x60\x3d\x48\xa0\x36\x5b\xa1\x6e\x65\xe3\xa5\x89\x8d\x78\x99\x0b\x0d\x9d\x8c\x09\xfb\xab\xaa\xcb\x82\xe7\x7d\xea\x86\xed\xb3\x47\xe3\x72\xe4\x1b\x1c\xbd\x07\x81\x1a\x3b\x9d\x1f\x74\x47\xb9\xb3\xe3\x71\x5b\x45\xa7\x4a\xc3\x4f\x38\xdb\x80\xe2\x14\x2a\x0c\x49\x89\xa0\x4e\x8d\x05\x51\xc0\x0a\x8e\x8f\xac\x7c\x5b\x48\x3c\x71\x9e\x94\x6f\x29\x90\x14\x1f\x84\xa0\x7e\x34\x3a\x13\x70\x87\xce\xc6\x1e\x79\x03\xc4\x8d\xa3\xb3\xc5\xe1\xd0\xb6\x27\x89\x36\x6a\x24\x8f\x4a\xf8\x50\x94\x12\xe3\xc2\xd4\x6f\x67\xe3\x50\x6e\xac\xbc\xef\xb8\x55\x12\xea\xd0\x21\x9b\xe5\xa5\x21\xb7\xa2\x5e\x43\xe7\x33\x4e\x44\x8f\x84\xdd\xb2\x6f\xb5\x50\xd7\x07\xd5\xf7\x41\x0b\x49\xce\x8b\x42\x94\x6f\x9d\x27\x24\x61\x1b\xdb\xba\x10\x0b\xb1\x9b\x41\xc1\x50\x10\x81\xf7\xd0\x28\xdf\xdb\x7a\x4b\xf8\x9f\x38\x31\x88\xbb\x63\xa3\x04\x24\xa7\xfd\xc3\x8a\x9a\xf8\xf8\x14\x02\x63\x42\x03\x63\x07\x00\x2a\x81\x44\x35\x43\x68\x0b\xf1\xaa\x81\x01\xe8\x39\x6d\xc9\xa0\x5d\xa8\x96\x56\xe3\x81\xae\x78\x58\x9b\x4d\xed\x34\xec\x4b\x71\xc5\x75\xd7\x84\x1e\x4e\xc3\xf9\x1c\x36\xb9\xb0\x09\xee\x8f\x6d\x4c\x47\x2e\x0c\x8f\x80\x04\x50\xe4\xe0\x32\x6c\x71\xa5\xab\x55\x00\x1f\x74\x10\x03\x80\xbc\xf7\x83\x5e\xf5\xd6\x9d\x9e\xcb\x54\x12\x2c\x91\xf8\xea\xfe\x8b\x50\x65\xa9\x1c\x69\x6f\xbb\x60\x84\x7e\xb0\xc4\x0a\x0e\x6c\xc8\x5d\x32\x51\x64\xaa\xd4\xc2\x96\x00\x76\x88\xa9\xc0\x55\x45\x02\xab\x43\x74\xc0\x25\x12\x34\x3e\x4e\x18\xf6\xad\x63\x36\xa7\xbf\xd6\x22\x76\x65\x5a\xe7\x29\x26\xcd\x60\x96\x49\xe2\x23\x11\x80\x40\x6a\xcb\x7c\x5a\x95\xaf\xbf\x6a\x8e\x81\x07\x67\xe4\x1a\xf8\x7a\xe3\x87\x90\x9f\xdb\xa0\xcf\x6e\x68\x2c\x99\xa5\xc3\x78\xa0\xb4\xb6\x03\x12\xce\x90\xc1\xb9\xb5\x92\x27\x5b\x13\x54\x1d\xb2\xdc\x5b\xcd\x03\x3f\x6f\xcf\x0d\xb6\x7f\xeb\xb8\x6e\xb1\x56\x45\xea\x0a\x3a\x63\x6e\xcd\xe5\x06\xa4\xa5\x9e\x33\x86\x6d\x7d\x13\xeb\x4c\x94\x6a\x8d\xf0\xf3\xdc\x05\xb5\x5d\xc6\x58\xa8\x5c\xa1\x2f\xc5\x75\xb9\xdd\x95\xc2\xb5\xe6\xa2\xc7\x1a\x7b\xf2\x83\x66\x1b\x55\x20\xd9\x4a\xb1\xab\x2b\x1f\x03\xfa\x69\xd0\x6c\xb8\x9c\xb0\x4f\x5e\x65\x36\x42\xe0\xc2\xe9\xd3\x08\x1f\x7b\x35\x9a\xcf\x3d\xc2\x2b\xbb\xbe\x5d\xdc\x0e\xaf\xae\x3e\x63\xf6\x29\xe6\x89\x62\xd6\x29\x41\xad\xb2\xf1\x84\x7d\x9a\x8d\x17\x80\x80\xea\xf2\x45\xa7\x97\x97\xa3\xd9\xdc\x67\xb6\x42\xc2\x32\xa4\x7b\xba\xdc\xe4\xd9\xe8\x66\x36\x9a\x8f\x26\x08\x8e\x09\x98\xa5\x41\xba\x72\x50\x06\xc8\xce\xa7\x93\xf3\xd1\x6c\x62\x73\x97\xcd\x80\x89\xed\x1f\x92\xf8\xde\x21\xf3\xc5\x70\x71\xbb\x98\xce\x3e\x37\x30\x6a\x9f\xde\x53\x64\x7a\xc9\x16\xe3\xc5\xd5\xc8\xf7\x0c\x21\xbc\x34\x68\x1b\x32\x31\x94\x39\xd4\x3a\x24\x61\x93\xe9\x84\xfa\x86\x8c\xae\x47\x13\x44\xca\x35\xd3\x1d\xbe\x9b\x8f\x28\xf3\xf5\x6a\x08\xa9\xb8\x2e\x09\xd9\xb5\x28\x19\x9e\x9f\xdf\xce\x86\xe7\x9f\xdd\x4b\x48\x1a\x7c\x2b\x18\x60\x34\x9b\x4d\x67\x73\x8f\xd9\x0b\xfd\x4a\x16\x90\xb3\x3d\xfd\x38\x9a\x0d\xdf\x5d\x8d\x9e\x8d\x75\x7a\x69\x29\x18\x50\x02\xc0\x4c\x21\x4f\xd7\x3f\x78\x10\xbd\xf4\xf5\x00\x11\x0d\xc8\x1b\x6e\x14\x1b\x0b\x54\x66\xbb\x74\xc4\xa9\xc8\xb3\xd1\xff\xba\x1d\xcf\x30\x3d\x3b\xce\xc3\x36\x9b\x65\x78\x63\xf4\xd1\x3c\xf7\x69\x7c\x75\xe5\x59\x2a\x42\xf4\xfd\x3c\xbd\xc5\x5c\xf8\xcf\x11\x9a\xb1\x83\xf7\xed\x04\xf5\x8d\x70\x5b\x13\x76\x73\x3b\x19\x43\xa6\xf9\x74\xc6\x46\x7f\x1e\x5d\xdf\x5c\x0d\x67\x9f\x5d\x9e\xfb\x70\x86\xa9\xda\x86\x5d\x9a\x19\xfe\xb4\x49\x8d\x7c\x71\x8f\xb5\xeb\xe6\xfc\x61\x38\x47\x88\xdd\xe1\xc5\xc7\xf1\xfc\x69\x08\xbb\xd4\xa0\x67\xe1\x71\x9f\xbd\xa3\xe4\x1b\x76\x2e\x01\x8b\xc8\xc8\x36\x6a\x42\x12\x7b\xf1\x0e\x99\x58\x3e\xab\xac\x95\x4d\x06\xfe\x2c\x17\xe9\x0e\x24\xa6\x37\x57\xbb\x2e\x5c\xa7\x3b\xb9\xc4\x43\x18\x08\x33\x38\x7d\x8b\x13\xbb\x8a\xcc\x07\xa0\x40\x7b\x92\x07\x66\xe4\xbb\x91\xac\xea\x3c\xef\x28\x13\x37\xaa\x84\x1d\x7e\x10\xd4\x6b\x27\xec\x2c\x61\x3f\x25\xec\x75\xc2\xde\x60\xb0\xe4\x8f\x38\xb5\xa7\x36\x4c\xf1\x76\x5d\x23\x5c\x85\x3a\x49\x57\xd0\x2a\xa1\xf4\xa6\xd8\xf3\x06\x39\xcb\x52\xff\xda\xd8\x53\x18\x5b\xea\x43\x40\xd1\xac\x1c\x3a\x01\x3a\xec\x75\x2c\xa9\xec\x8e\x45\x38\x17\x69\x29\x8c\x66\x18\xc4\x89\x70\x1b\xdb\x6d\x5c\x89\x69\x4a\xec\x2b\xa9\x76\x01\x70\x01\x7d\x10\x8d\x47\x8f\x15\xd3\xa1\x44\xfb\x56\xaf\xb0\xbf\xa2\x95\x97\x0a\x53\x84\xc4\x1e\xdb\xfd\x22\xee\xa7\x16\xe5\xc1\x7b\x37\x14\xf7\xc6\x30\x98\xd7\x32\x30\xd4\xc1\x3a\x49\x5a\x3e\xeb\x03\xc7\xa0\x4f\x31\xb4\xd8\x29\x48\x1a\x3a\x74\xd3\xb3\x5c\x07\x98\xb8\x16\x67\xcf\x70\x02\x99\x39\x01\x37\xfb\xa0\x9f\xef\x14\xf1\xc7\x01\xbb\x96\x3a\x15\x79\xce\x0b\xa1\xea\xa0\x08\x62\xe4\x10\xf2\x9e\xe1\xa8\xb2\xfd\x6a\xbc\x11\x12\x2b\x5b\xd8\x62\x8d\x98\xd4\xbb\x8a\x78\x18\xbb\x0c\x5c\xaf\x3e\x73\xad\x33\xfe\xca\x75\x27\x33\x47\xcd\x37\x0e\x9c\x97\xa7\x60\x19\xcb\x02\x70\xf6\x11\x87\x25\x40\x1d\xb6\x4d\x10\x9b\x5a\x61\x15\xe2\xba\xe1\x26\x98\xe9\xc1\x20\x2e\x27\x96\x46\x69\xb8\x4d\x8d\x00\xc9\x7c\x09\xfd\x81\x6e\xdd\xd0\x8e\x9b\x54\xec\x55\x5d\x62\x34\x3b\xb5\x39\x0a\x55\xd0\xcb\xc4\x3a\x35\x1d\xbc\xf3\x13\xf0\x97\xad\x43\x85\x0c\xc6\x83\x10\xcc\x8d\x81\x90\x46\xc0\x78\x01\x30\xb3\x57\xcb\x27\xd8\x71\x80\x92\x4e\x0e\x50\xbb\x09\x4f\x8a\x31\x38\xaa\x40\xb7\xd7\x46\xaa\x0a\x2d\xec\x0e\x87\x56\x3c\x3c\x5d\x62\x78\x0f\x1e\xf1\xe3\x05\x9a\xbf\x19\x4c\xcb\x75\x50\xc1\x8a\x8e\x0b\x82\xa0\xd8\xf0\x72\x6d\x9d\x05\xdd\xa3\x06\x99\xdc\xd1\xe5\x18\xe6\xb7\x83\x23\x03\x32\xf7\x03\x68\x6d\x8b\x77\x1b\xee\xd0\xa1\x64\x2e\xcb\xcd\x28\x93\xc1\x9f\xe0\xc1\x96\x7c\x83\x55\x59\xac\x8d\x7d\xe6\x3b\x49\xa0\x42\x1e\xaa\xdf\x87\x3f\x01\xa2\xcd\xe1\x96\xe2\x77\xbc\x23\xc5\xf1\xf0\x52\xb0\x25\xe4\xbd\x50\xaa\x8c\xcd\xb5\xe6\x79\x58\x2b\x8f\x69\x4e\x7c\x1f\x74\x5e\x44\x1b\x35\x4c\x28\xb2\xd7\x72\x83\x72\xd6\xfa\x75\xad\x04\x45\x16\xd9\x90\xd8\xc1\xc7\x99\x8c\x9e\xa2\x91\x2f\x19\x0d\x44\x18\xde\x67\xba\x2f\x0e\xc4\x07\x13\xa7\xcb\x34\x6a\x45\xc0\xfb\x23\x8a\xd4\xdc\x0f\xcd\x4c\x98\x7b\xb3\x07\x08\x83\x9c\x79\xcf\xa2\x3b\xaa\x12\x1c\xef\xee\x38\xbf\x13\x65\x21\x42\xb0\x67\x7b\x95\xde\xf8\x0c\x15\xb5\x62\x57\x41\x6e\x33\x1b\xda\xb4\x43\xcc\x04\x3b\x32\x96\xf7\x96\xd0\x7b\x0b\x36\x17\xbb\x0a\x43\xad\x67\x7f\x4c\xd8\xe9\xcf\x6f\x7e\xee\xa3\x64\x9d\xa9\x6d\xf4\x25\xb5\x62\xa7\x3f\xbf\x3e\xc5\x3f\x7e\x1a\xdf\x4c\x83\xc2\xf9\x45\x29\x38\xca\x9c\xd3\x9f\x7f\x7e\x1d\x3c\x72\x13\x26\x76\x41\x62\x85\xaf\xb8\x89\x5f\x72\xb4\xbb\x2d\xcc\xd9\xd0\x50\xf1\x6f\xc7\x0f\xa6\x71\x04\xde\x67\x6c\x78\xab\x0a\xf6\xa7\x3a\xdf\xb3\xb3\x57\x30\xf3\xd3\x3e\xec\x8d\xcf\x37\x84\x63\x19\x6f\x05\xd8\xb2\x74\x8d\x49\xdb\x40\x26\x17\x77\xbc\xa8\x62\xb0\xf1\x28\x1d\xe0\x2a\x52\x0d\x00\x22\x48\xd5\xa4\x57\x2c\x85\x95\x4e\x19\x34\x88\x29\xb3\xa0\xf3\x7f\xaa\x4a\x84\x58\x86\x5f\xc6\xe0\x1c\xe6\xef\xce\x45\x17\xe8\x41\x00\xe3\x87\xb4\x09\x5e\xa0\xc9\x06\x37\x83\x43\xf3\xce\xf9\xbd\x83\xf9\x84\x13\xcc\x4b\xb3\x6e\x59\x89\x00\x61\x3a\xd6\x0a\x3a\x35\xad\x9c\xdf\xfb\x1a\xbd\xe0\x44\x06\x11\xda\xc3\xf1\x70\x9b\x62\xde\x7a\x0d\xb1\x03\x82\xce\x9e\xad\xbe\xd6\x36\x23\xa1\x79\x49\x22\x74\x5c\x98\x25\x16\xc4\x97\x5c\x47\xa1\x55\xd8\x00\xaa\xeb\xfa\x1c\xbc\x68\x95\x5b\x23\xd0\x43\xfb\xf7\xb6\x17\xad\x17\xdf\xed\x5b\xd2\x5c\x54\xe6\x31\x1b\xb4\xdb\x43\x9a\xbe\x56\xa0\xf5\x1d\xc8\x24\x43\xff\x6d\xeb\x73\x61\x91\x52\x2e\x6d\xe8\x21\x68\xb7\x43\xee\x6f\x14\x7b\x58\x69\x51\x6d\x84\x2a\xf7\x2e\xff\xc3\x42\x90\xfb\x39\x3c\x0c\x44\x0f\x2f\xad\x45\x21\x4a\x9e\x13\xc2\x34\xd6\xd9\xa4\x50\x10\x83\x39\xc7\x70\x29\x41\x5f\x63\xc9\xf3\x26\xca\x79\x63\x8d\x96\x46\xb6\xbd\x51\xa7\x86\xbe\x52\xa5\x58\x2b\xf8\xaf\x7b\xc5\x8e\xce\xfa\x0c\x6e\x5b\x2c\xc2\x93\xab\x36\x65\x36\x11\xd6\x9c\xaf\xd5\xb1\xbe\x2d\x52\xcf\xa2\xa4\x38\x92\xc1\x4e\x57\x02\x03\x2c\xc8\x30\x80\x4a\x07\x07\x94\xab\x51\x4e\xe2\xfb\x83\x17\xe4\xe1\x5b\xb9\x4e\x6d\x18\xfa\x0f\xbc\xb5\x84\x34\x13\x1c\x6e\x97\x37\xcc\x83\x0c\x53\x4f\x8a\x50\x03\x3f\x3f\xbf\x31\x96\x7b\x73\x99\x2e\x3e\x80\x7e\x67\xf9\x77\x34\x4f\x6a\x4c\x47\x21\x8f\x1e\x31\x01\xa9\x6f\x16\x99\x90\xf5\x9a\xa3\xb9\x4e\xc6\xb6\x1d\xb9\x7f\x56\x95\x2c\x57\x6b\x65\x06\xe9\x60\x42\x7f\x29\xc6\x6e\x54\xab\xf1\x74\xbc\x85\xdd\x01\xbc\x27\xb3\xb6\xc6\x03\xea\x45\x4d\x3b\xb5\xf9\xfa\x0f\xe0\xd6\x3f\x4e\xeb\x12\x2c\x2f\x3f\xd1\x5a\x03\xd4\x55\x2d\x33\x91\xcb\x82\xfc\xc4\xe4\x41\xf5\xbd\xb4\x15\x96\x31\xde\x8b\xa5\x96\x95\x88\xeb\xa1\x1a\xe8\x79\xe0\x1f\xb0\x61\xc4\x8e\xee\xe7\x0f\xf9\xf9\x81\xaf\xfd\xdc\x82\xac\x0f\xbf\x71\x98\x79\xee\x62\x13\xa1\x41\xd0\xa2\x34\xad\x03\xf0\x22\xb1\x32\xa1\x62\x9b\xaa\xda\xfd\xf2\xe3\x8f\x29\x3d\x9b\x12\x79\x55\xb9\xfe\xf1\xbf\x19\xe6\xc9\xf7\x1f\xff\x63\xf1\x5f\xce\x7e\x2b\xf0\x97\x47\xf1\x5f\x5e\x9e\xbc\x7a\xf5\xaa\x89\xff\x72\x72\xf6\xe6\x3b\xfe\xcb\xef\xf1\xf3\x10\xfe\x0b\x3b\x1b\x9c\x7c\x47\x7b\xf9\x8e\xf6\xf2\x3f\x14\xed\xe5\x5f\x0c\xae\xe5\xdc\xc3\x0f\x84\x05\xc4\x9c\xea\xd5\x7d\x59\x2d\xb6\xcc\x85\x0c\x39\xa9\x75\x0d\xc6\x02\x42\x4f\x90\x77\xce\x23\x53\x74\xa2\x34\x3c\x8a\xcc\x90\x84\xd0\x0c\x9c\x15\xb5\xcd\x8f\xee\x84\x66\xf8\x07\x50\x19\xbe\x19\x0c\xc3\x9d\x0d\x05\x1f\xc0\x62\x60\x17\x1e\x8b\x06\x1e\xec\x68\x3a\xf2\x54\x3c\x86\xe5\x80\xf5\x1a\xc3\x3d\x8e\xaf\xf3\x8d\xe0\x75\x6c\x59\x72\x80\xde\x91\xd8\xca\xe7\xbf\xd3\x33\x2b\x54\x1c\x79\xee\x7e\x83\x7d\x6e\xd8\x4e\x62\x39\xec\x9d\x6d\x80\x8c\xf5\x60\xae\x0a\xcc\xec\x47\xe5\x6a\xbd\x28\xfb\x66\x59\x4a\xec\xfd\x0e\x1b\x9d\x89\x42\xd3\xa0\xdf\x0e\x3d\xe7\xb9\x00\x38\xcf\xde\xec\xdf\x0c\x09\x27\xac\x0e\x57\x65\x9b\x9e\xd5\xef\x83\x84\xf3\xec\x05\x07\xc8\x22\x0f\x83\x79\x04\x65\xc1\x1e\xb5\x43\x37\x03\x5b\x87\xe3\x9f\x01\x6a\x48\x37\x66\xc7\xe1\xef\x75\xe1\x6d\x84\x18\x20\x4d\x90\x85\x76\xd9\x35\x38\x6c\x30\xcb\x0a\x52\x8a\x9e\x86\xb3\x10\x02\x39\x7c\xaf\x96\x3e\x5c\x2d\x6d\xeb\x30\x6f\xb5\x38\x58\x83\x99\xff\xaa\x1a\xcc\xae\x3a\xcb\x95\xf9\x14\xc0\xf3\x23\xe8\x47\x0c\x59\x13\x55\x61\x52\xc5\x4f\x5c\xdf\x14\x80\x34\xbb\x8a\xce\xfb\x42\x94\xdf\x8b\x2c\xff\xa1\x22\xcb\xf2\x5b\x14\x59\x92\xd4\xf2\x95\x96\xed\x51\x1f\xab\xb4\xb4\x43\xbc\x8d\x2a\x2d\x6d\x62\x7b\x50\xc1\x2c\x9a\xb2\xd2\xbd\x92\x0e\x1a\x5d\x0b\x6d\xb5\x35\xd5\x2a\xa3\x58\xd7\x50\x0c\x63\xdb\x82\xec\x28\x82\x9c\x34\x90\x01\xcc\x6f\x20\xe3\xbb\xf1\x5b\xb6\x74\xc5\xeb\x2b\x68\x53\x80\x65\xcf\xbc\xce\xa4\xb2\xc0\x32\x78\x6c\xab\x67\x15\x81\x36\xd7\x92\xfd\x4b\xad\xa5\x49\xf1\x40\x8a\x3f\xed\xe2\xbd\x7f\xe8\xe2\x8d\x0b\x5b\x83\x28\x10\x9b\xb9\x12\xc6\x5b\x38\xe4\xef\x72\x5e\x7c\x11\x36\xdb\x5a\xe8\xc1\x33\x0b\x23\x0f\x96\x19\x42\xd1\x5f\x0c\x39\x64\x1b\x1d\x53\x0d\x21\x24\xc7\xb3\xe1\xfc\x7c\x78\x93\xb0\x77\xd7\xe3\x84\xcd\x47\xf3\xe1\x79\x3f\x69\xd4\x59\x06\xbe\xde\x66\xbd\xfc\x41\x40\x02\x1a\xfc\x5e\x2c\x8d\x96\xd5\x0f\x15\x8c\x41\x5c\xb3\x7a\x2d\xd2\x0d\x87\xe2\x3c\x0b\x39\x0f\x0d\x96\x5c\x65\xa9\x23\xd8\xb7\xa6\x0c\x22\x3d\x5a\xb9\xbe\x36\x16\x0a\x0b\xab\x0a\x32\xf8\x65\x45\x2b\xf9\xc0\xcb\x72\xcf\x2e\xd5\x57\x36\x84\x47\x5b\x54\x82\x78\x85\xe7\xe3\xb0\x88\x25\x2e\x8c\x39\xea\x61\xc3\x08\xd2\x78\xa9\xa1\x59\x16\x94\x8d\x34\x0a\x65\x5a\x85\xb5\xc2\xe9\x20\xcb\x3d\x3b\x7d\xc3\x6e\xe7\xe7\x1e\x74\xef\xf4\x27\x4b\xec\xdb\x79\x10\x42\x1c\xa6\x15\x24\xd5\x00\xcd\xfe\x56\xcb\x3b\x9e\x13\xc4\x10\xde\x2a\x51\x31\x70\x3f\xd0\x37\x3e\xe1\x16\x7a\x54\x83\xc3\xfb\xf3\x5c\x8d\xb5\xa5\x9a\xfe\x66\xac\x7f\xdc\xc9\xfa\x73\xf3\xfd\xd1\x57\xc3\x7f\x6b\xf1\x10\xdb\x3f\x8f\xc1\xff\xd1\x0d\x7c\xf5\xad\x36\xf0\x7f\x58\x79\x2e\xf6\xad\xf8\xef\x57\x4f\x1b\x8a\x06\x77\xd1\xb9\x9e\x6d\xee\x37\xc4\x9c\x89\x17\xcc\xf0\x18\x70\xae\xff\x73\x98\x03\xf6\x78\xf9\x6d\xe2\xda\x30\xff\x03\x25\xb8\x4f\x28\xbe\x8d\x54\x80\x56\xcd\xe7\x37\x25\xc0\xaf\x2e\xdd\x05\x28\xe0\xc8\x2e\x38\x6c\x21\x11\x55\x5c\x1a\x9e\xfe\xc1\xf3\x72\x77\x85\xbd\x8b\xe0\xfe\xf3\x6b\x70\xe3\x19\xfc\x46\xdc\x87\x3e\x05\xa0\x76\x67\x75\xad\x75\xb5\x54\xa5\xca\x2d\xa0\x93\x6a\xd5\xc5\x44\xc5\x4f\x46\x11\x6d\x37\xb9\xed\xde\xa0\xa1\xcd\x77\x0a\x45\xd8\xb3\x8b\x64\xef\xac\xc0\x7f\x5a\xa5\xac\xf5\x84\xfc\x1e\xe5\xb2\x6e\x6a\xbf\x61\xcd\xac\x5b\x0f\x04\xdd\x29\xc7\x0b\xd2\x86\x8d\xa8\x0f\xeb\x80\xaa\xae\x1a\xa4\xa8\x8e\xb6\xb5\x90\x86\x82\xfe\x9b\x2c\xa4\xe9\xa2\xfa\x16\x0b\x89\x12\x61\xf7\xdf\x5a\x7a\xc5\xe9\xc0\xc5\xbe\x65\xc7\x84\x65\xc5\xde\x86\x3d\x28\x31\x9e\x50\x21\x0c\x7d\x6e\x3b\xd6\xed\x4b\xfe\x9e\x5d\x38\x6c\xae\xc0\x54\x15\x77\x62\x1f\xf5\x01\x8d\x2a\x85\x9b\x85\xc2\x07\xaa\x8b\xa3\xa2\xd7\xea\xf1\xba\xd8\x67\x54\xc4\x1e\xbe\xd2\xfe\xb5\x2b\x65\x1d\x82\x6f\x15\xd5\xaf\xb6\x0e\x94\xab\x4d\xa5\xfc\x22\xb7\x19\x1d\x42\xb6\xeb\xb4\x50\x71\x75\xef\xd2\x1c\x97\x4d\x18\x13\x68\xa2\xc1\x35\x4f\x0c\xa4\xea\xf4\xe6\xd0\xcb\x1a\xec\x7c\xd7\x9c\xcf\xa1\x43\x1f\x78\xb5\xd7\x1f\xb0\x79\x50\x6f\xfb\xdb\x94\xfa\x36\x57\xda\x3e\x53\x4f\x2b\x01\x26\xab\xc7\x87\x24\x8c\x25\xc0\x4b\xec\x6b\xe9\x9d\xc0\x16\x74\x00\x6b\x7e\x9f\x5e\xd4\x0b\x5f\x7d\x7c\xe0\xef\x35\x84\xdf\x6b\x08\xbf\xd7\x10\x7e\xaf\x21\xfc\x27\xd5\x10\x3e\x45\x43\xf9\x5e\x5c\xf8\xbd\xb8\xf0\x7b\x71\xe1\x6f\x50\x5c\x98\x45\xc5\x85\x4f\xb5\x2b\xda\xda\x4e\xf5\xaf\x59\x6b\xf8\x2b\x17\xdb\xa1\x0c\x3f\x7f\x71\xb1\xaa\xfa\x9b\xad\x32\xfd\x5e\x51\xf9\x3b\x55\x54\x66\xff\x1d\x2b\x2a\xc5\xf7\x8a\xca\x7f\xd9\x8a\xca\xef\xf5\x57\xdf\xeb\xaf\x7e\xcf\xfa\xab\x22\xaa\xa8\x82\xdd\x77\xfd\xa9\xbf\xd7\x55\x7d\xcb\xba\xaa\xef\xc5\x4f\x0f\xfe\x0c\x7e\xfc\x38\xbf\x3a\x3e\xfd\x0d\xab\x7f\x1e\xab\xff\x39\x79\x75\x72\xf6\x53\xa3\xfe\xe7\xf4\xf5\x9b\xd3\xef\xf5\x3f\xbf\xc7\xcf\x47\x63\xd0\x71\x36\x57\xab\xea\xde\x68\x0b\xf6\x8a\xbd\x1b\xb0\xd3\xc1\x09\x5e\xbb\x56\x51\x0e\x82\x72\x46\x98\x6a\xfb\x4e\x57\xe6\x5d\x8f\x06\x9e\xee\x44\x01\x27\xcf\x5f\xea\x43\x54\x80\xe1\xdf\x57\x72\x59\xf2\x72\xdf\xb3\x29\xde\x28\x75\xa1\xfb\x8d\xed\xd3\xee\x47\xc7\x3b\x44\x96\x19\x89\x4d\x37\x01\x52\x4a\xd0\x87\x12\x5c\x11\x60\x41\x9a\xb7\x1a\x72\xd8\x55\x21\xe4\x1e\xa6\x57\xb0\x03\xa4\x48\xd8\x47\x4c\x0f\x32\x04\x79\xe1\xb3\x40\x8e\xd2\x3e\x3b\x3b\x39\x39\xb1\xef\x4d\x44\x45\xc9\xf9\xe3\x22\x8d\x12\x20\x7c\x4e\xc3\x4c\x78\x23\x9b\x7a\xa7\xd4\xd0\xba\x8d\x51\x60\xc3\xfc\x66\x29\x0b\x8e\xf7\xfa\x56\x27\xad\xae\x62\x61\xda\x06\x56\x48\x78\x19\xed\x9c\x2d\xee\x22\xf2\x99\x0d\xa1\xfd\x53\x0a\xb6\x15\xd8\xf2\xe1\x74\xc0\xe2\x49\x21\x46\x2a\xce\x06\xba\xe2\x43\xb0\xaa\x14\x15\xb7\x75\xff\xe0\x18\xe9\x00\x58\x45\x56\xd1\x70\x9b\x84\x5f\x23\x8f\x98\x9f\x8a\x8f\x76\xdb\x4c\xe1\xe6\x14\x64\x11\x52\xc1\x4e\x21\xcc\xfa\xfc\x96\xb3\xb0\x3c\x9b\xa9\xb4\xf6\x08\x08\x04\xc7\x48\x19\x2e\xbc\x12\xa5\xe4\xb9\xf6\x34\x76\x2a\x5d\x38\x75\x9b\x02\xbc\xa0\x40\x9a\x66\xbd\x8f\xd3\xf3\xe1\x55\x2f\x79\xee\x89\x40\x15\xf3\x79\x2f\xb1\x23\xf8\x58\xbf\xe7\xe1\x14\x97\x10\x43\x02\xd3\x87\x00\x33\xc9\xa2\xda\xaa\xca\xf6\x53\xac\x74\xb3\xfb\xb0\xd4\xfe\x70\x59\xc6\x3b\x04\x6c\x89\xc9\x66\xed\xdf\x27\x6c\x87\x9e\x28\xba\x68\xd9\x9d\x4a\x79\xfe\x7f\xdc\xc1\x82\xcc\xcd\x6a\x53\x7c\x6e\x9e\x30\x89\x40\xe3\x37\xa7\x5c\x64\x9e\xae\x85\xc2\xae\x84\xf4\x8b\xc0\x9e\x40\xaf\xa4\xd9\x86\xe4\xf1\x55\xbc\x00\x67\xf2\x7c\x7a\xb9\xf8\x34\x9c\x8d\xa2\x5a\xbb\xde\x70\xce\xc6\xf3\x1e\x56\x91\x4d\x3e\xdb\x28\xc7\xe8\x82\x4d\x67\x9d\x7e\xfa\x20\xb8\xf1\xee\x76\x01\x0e\x7a\x08\x6e\x40\xa8\x06\x1b\x81\xb7\x5f\x63\xd3\x4b\x17\xe1\x18\x3e\x3d\xc2\x01\xb1\x11\x98\xda\x64\x3a\x39\x0e\x83\x1d\xcc\xac\xc3\xd6\x23\x8e\x2e\x06\x91\x1b\x7f\xfe\x61\x78\x75\xc5\x3e\x9a\x15\x0e\xd9\x64\xb4\xf8\x34\x9d\xfd\x1b\xce\x7c\x00\xab\xa2\xea\x36\xa8\xd2\x9c\xce\xe6\x81\xa3\xdf\x7a\xf3\xad\x4f\x7e\x3c\x81\x80\xc2\x1c\x16\xf0\xff\x3b\x4d\x4e\x4e\x4e\x12\x36\x99\xce\xdc\x83\xe3\xc9\xc5\x78\x36\x3a\x5f\xc4\x7e\x7f\x17\x0c\x70\x5e\xfe\x04\xab\x00\x83\x70\x80\xfb\xc6\xd1\x23\x14\xbd\x99\x4d\xcf\x6f\x67\xb8\x6a\x70\xdd\xbf\x9b\x2f\xc6\x8b\xdb\xc5\x88\xbd\x9f\x4e\x2f\x20\x8c\x65\xab\x4f\xdf\xb2\xab\x29\xce\xf5\xd6\x90\xef\x62\xb8\x18\xc2\x87\x6f\x66\xd3\xcb\xf1\x62\xfe\xd6\xfc\xfb\xdd\xed\x7c\x0c\x64\x1f\x4f\x16\xa3\xd9\xec\xf6\x66\x31\x9e\x4e\xfa\xec\xc3\xf4\xd3\xe8\xe3\x68\xc6\xce\x87\xb7\x66\xf3\x0d\xcd\x29\xdc\x41\x81\x8e\xe9\xa5\xaf\xfa\xf4\xf1\x20\x2c\x0b\xa4\x26\xf0\xf3\xc5\x6c\x7c\xbe\x08\x1f\x9b\xce\xd8\x62\x3a\x5b\x04\x6b\x64\x93\xd1\xfb\xab\xf1\x7b\x8c\x2f\x05\x51\xb3\xbe\x8b\x7f\x8c\xf1\xb3\x9f\x86\x9f\x7d\x28\x24\x08\x7d\x04\x8c\xec\xe3\x1f\x4f\x8e\x76\xfc\xf7\x56\x78\xbf\xff\x44\x3f\x83\x1f\x33\xb1\x2b\x45\x6a\x74\xb7\xbf\x5c\xbd\xbf\xb9\x3a\x7e\xf9\xcd\x6d\x81\x87\xf5\xff\xd3\xd7\x3f\xbd\x7a\xd3\xd0\xff\x5f\x9d\xbe\xfe\xae\xff\xff\x2e\x3f\xef\x27\xb7\xec\xca\x5c\x66\x33\xf6\x7e\x34\x19\xcd\x86\x57\x8d\x8a\xf1\x17\x56\xfb\x7d\x99\xb0\xb3\x9f\xd9\x9f\xea\x42\x18\xb5\xf7\x4d\xa8\x09\x9f\x83\x26\xfc\x86\x5d\x96\x42\x78\xfd\xf9\x52\xd5\x45\x46\x7a\x2a\xa8\xc4\xff\x9b\xb1\xb2\x99\x66\xbf\xfc\xf8\xe3\x4a\xaf\xc0\xb8\xfe\xdf\x5f\x8c\xee\x44\xb9\x57\x85\x8d\x9d\x91\x26\x0b\xa9\xe5\xbb\x7d\x23\x1f\x9f\xdd\x89\x72\xc9\x2b\xb9\x8d\x5a\x1d\x06\x16\x8a\xd5\xe0\x30\x0d\x10\xb2\xc9\xc1\x4f\xe5\x7a\xa3\x72\xa3\xfd\x19\x4d\x1c\x0c\x1b\xca\xfb\xb7\x6e\x41\xa0\x85\xd0\x5a\x94\xec\x3d\xfa\xc5\x08\x03\x32\xec\xb1\x6c\x2d\x1d\xcd\x1e\x2a\xe6\xb2\x23\xbf\x0c\xc7\xee\x1e\x34\xc1\x94\x28\x9b\x33\x43\x3e\xe6\xd0\x69\xea\x94\x14\xd7\xda\x1f\x4a\xad\x40\x7f\x3a\x19\xb0\xa1\x7f\x34\xa8\x1c\xb7\x5e\x67\xfa\xbf\xa1\x46\x3d\x70\x23\x4a\x21\x8b\x84\xf5\x42\x77\x66\x0f\x73\x9d\xc0\xb2\xeb\x9c\xf9\x83\x54\xf1\x60\x73\x3d\x58\xe5\xcd\xd5\xa3\xe3\x75\x0f\xd4\x98\x72\x0f\x3b\x7d\x91\x81\xe8\x47\xe4\x0c\xaa\x36\xa8\xe7\x30\x5b\x9b\xff\x28\x02\x9c\x7b\x37\x2d\xea\x57\xbf\xe1\x05\x74\xdb\x0f\xf4\x65\x8a\xac\x6d\x97\x50\xe0\x6d\xb3\x4b\xa3\x82\xef\x26\xfd\x0a\xd6\x0b\x46\xe8\x41\xd9\x44\xb1\x0f\x8a\x91\xd1\x1b\x5c\x5b\x20\x30\xec\x92\xbe\xe2\x69\xd0\xe1\xd1\xc1\xb2\x2f\xb1\xeb\xb6\x61\x52\x2c\x89\x6e\xb5\xee\x75\x69\x58\xc1\x0b\x16\x19\xa0\x58\x33\xce\x74\xbd\x4c\x73\xae\xa9\xbc\x0a\xff\xe9\x16\x10\x7d\xc7\x0c\x4e\xf1\x11\x4e\x4d\xbb\x57\xac\xd6\x18\xdb\x78\x7c\x9a\x4d\x42\xb0\x5e\x44\x38\xa4\x04\x35\x2f\x46\x03\x2d\xc3\xa4\x42\xf3\x90\x6b\x2b\x5d\x7c\xa1\xef\x85\xdb\xe0\x4c\x28\xb7\xc0\x85\x0d\x75\xa4\x75\xce\xcb\xe6\x01\xb5\x0b\x82\xf7\x7c\x2d\x79\xbc\x91\xf7\xe0\x4f\xcc\x40\xa0\xf0\x5c\x2b\x6b\x30\x00\x83\x5e\xc9\xe2\x8b\xc8\xac\x45\xdf\x6b\xac\xcd\x7c\xbd\x77\x2d\x0b\xb9\x05\xcc\xbf\x10\x30\x6f\x0e\x16\x71\x0f\xbd\xed\x8d\x2f\xfa\x22\xe3\xae\x77\x9c\x27\x39\x7a\x29\xc1\x6a\x1a\xac\xdc\x2b\xf6\x91\xc5\x6d\x5e\x70\xee\x0f\xd7\x90\x22\xfc\xa2\x61\xb8\x24\xac\xf1\x96\x05\x93\x5a\xe5\x81\x57\x20\x62\xa0\x80\xe8\x09\x45\xc7\x2a\xcf\x5c\x21\x49\xba\x28\x12\xaf\x2a\xdc\xc0\x73\x95\x3d\x4a\x13\x85\x69\x15\xb0\x32\xb2\xa9\x9b\x8b\x6d\x4d\x31\xa8\x6a\x84\xc8\x46\x85\xd5\x25\x90\xb5\x8a\x60\x84\x08\xdc\x58\x08\x61\x3b\xa7\x86\x3d\x68\xdb\x04\x73\x79\xc6\xd1\x67\xcc\xf9\xf3\xdb\x60\xfe\x3c\xdf\xeb\x4a\x6c\x89\xd1\x82\x66\xba\xd1\x68\x16\xa7\x63\x64\xbb\xb9\x86\xed\x7f\x62\x39\x77\x73\x05\x0f\xdb\x2c\x7e\xcc\xb4\x6d\x4a\x30\xeb\x94\xa2\xa4\x96\x97\xb0\xd6\x57\x9d\xb5\xde\xc6\x84\x45\x97\x96\x0b\xb1\xe9\x87\x3e\x7c\x36\x40\xc4\x4a\x48\x28\xbd\xb6\xb1\x32\xda\x6b\xbc\x23\x28\x37\x9a\x9a\x2c\xf0\xa8\xd7\x97\x93\x54\xd0\xf8\x43\x16\xe6\xc9\x32\xae\x1c\x4a\x18\x67\x2b\x9e\xe2\xc6\x84\x42\x7a\x55\x17\xa9\x15\xb6\xb6\x37\xfa\x52\xb8\xfc\x5f\x8c\x0e\x46\xdc\x04\x62\x14\x3a\xec\x82\xa7\xc6\x0e\x7a\x14\xca\x71\xa8\xb4\xe7\xe5\x1a\xae\x79\xb6\xe3\xd0\x6b\xfe\x7e\x43\x51\x52\xf7\x0e\x86\xe1\xd5\x17\x91\xf5\xa9\x71\xcb\xbe\xbd\x05\x7e\x9d\x2e\x8a\x48\x02\xc7\x95\xfe\xf4\x3b\xb3\xa0\x62\x3f\x1b\x8e\xfc\x45\x30\xce\xd6\x4a\x65\x6c\xc5\xa1\xa6\x66\xb5\x52\x65\x85\x7e\x17\x5d\x97\x82\xce\x6c\xd4\x70\xb2\xb1\x7e\x97\x79\x0c\x34\xa2\xd2\xa4\x06\x15\x93\x78\x9d\xba\x92\x79\xce\xd4\x4e\x80\x4a\x12\x55\xe2\x62\x24\x10\x62\x91\x16\x15\x4e\x56\xda\xc5\xb1\x30\x79\x00\x5b\x83\xcb\x62\xbd\xaa\xf3\x84\xa9\xd2\xe6\x73\xf4\x83\x88\x15\xf1\x13\xb9\x22\x0b\x28\xd1\x5e\x3d\xa4\xa4\x34\x19\x37\xc8\x78\xb0\x0d\xd4\x0c\xf1\xad\xaf\x6c\x8a\x02\xc2\xc8\x12\xa3\x27\x06\xce\xde\x6b\xf2\xba\xe1\xf1\xb5\xd2\xff\x83\xe0\x66\x6a\x97\x32\xa7\xce\x28\x8b\x86\x94\xc1\x36\xd1\xab\x26\x79\xcd\xee\x87\x95\xe7\xdb\x68\x74\xce\x36\x38\xee\x4a\xe6\x94\x81\x24\xa3\x5e\x3f\xfe\x92\x6a\x9c\x66\xcc\xfd\x0d\xbe\x4f\xa4\xb3\xc9\x18\x70\x66\xd2\x8d\x02\xff\x64\xc4\x3a\x89\xed\xaf\x15\x79\xd0\xdd\xbc\x48\x29\xb0\x11\xc8\x4a\xb1\xa2\xde\x8a\x12\xaa\x73\x76\xbc\xe4\x5b\x51\x89\x52\x27\x78\xba\x74\x55\xd6\x88\xdf\x92\xf3\xbd\xaa\x29\xca\x89\xe5\x3a\xca\x3c\x65\xe4\xee\x16\x4a\x0c\x79\x5a\x2a\x68\x19\x9f\xcb\xc2\x73\x18\xf9\x48\xc5\x76\x97\x83\x7a\x7b\x54\x09\xe0\xba\x95\xb8\x87\xd4\xac\x42\x80\x5f\x36\x17\xc5\xba\xda\xf4\x13\x2c\xa8\x50\x6c\xa9\xaa\x8d\xa5\x90\x73\xae\x06\xe7\xe7\xbd\xbc\x13\x41\xae\x34\x65\xcf\x63\xd9\x19\x66\x67\xf8\x63\x18\x12\x31\x68\xc6\xea\xb4\x98\x9a\x0a\x25\x65\x45\x2a\x67\xe3\x11\x48\xd7\xae\x50\x09\x33\x77\xa0\x95\xb2\x0d\xcd\x70\xe0\xb9\x7c\x98\x42\xba\x76\xb1\x6f\x7d\x9f\x90\x56\xc2\xe9\xd1\x41\xf0\xf9\x64\x4d\xb3\xc3\x7a\x34\xa3\xdb\x42\x77\xdf\x00\xf1\xfd\x74\x98\x65\x88\x51\x2a\xfe\xc5\xc8\x38\xb5\x86\x62\xd0\xc4\xf7\x44\xcc\xf7\x66\x17\xb0\x5e\x81\x8a\xe1\x42\xf9\x6c\xe7\xde\xd4\x27\x2c\xc9\xc0\x39\x0b\xf3\x70\x90\x09\x91\x56\x0c\x55\xc1\x46\x2a\x0a\x26\x8c\x31\x25\x44\x09\xa0\x1b\x50\x9e\xbd\xac\xd7\x60\x5f\xb5\xeb\x49\x81\xb3\x0d\x87\x80\x06\x96\x29\xdc\xeb\x6f\xc4\x26\x6d\x5d\xe8\xf7\x66\x94\x86\xc6\xf9\x6b\x59\x85\x31\x96\xf6\xc1\x7d\xde\xe4\x07\x98\x31\x55\x26\xb5\xbb\xd9\x69\x96\xd5\xb0\x0d\xe2\xab\x48\xeb\x50\x65\x12\xdd\xc5\x2a\x56\xc9\x72\xeb\xdf\x2a\x54\x78\xb4\xb0\x43\x42\x1c\xfe\x5e\xe4\x39\xc2\x4a\xf9\xda\xab\x4c\x96\xd4\xf1\x98\x0a\x52\xc2\x9a\x98\x40\x45\x7a\xf2\x92\xb3\x3e\xbb\x20\xa4\x8f\x03\xfc\x60\xec\xda\x3e\x29\x2e\xf0\xc4\x43\x3a\xf9\xd3\x0a\x67\xdb\xda\x79\x53\x8f\xc5\x42\x0f\xb8\x3b\x74\x2d\x11\x26\x08\xea\x65\x41\xf3\x0c\xce\x27\xec\x0d\xba\x2a\x92\x88\x26\xa5\x40\xa3\x47\x60\x56\x95\x31\x7a\x9a\x3a\xa7\x07\x70\x8a\x15\x0e\x7f\x2c\x43\x65\xdc\x0c\x6a\x83\x5e\xc1\x3b\x0d\x43\xa2\xd1\xb0\xcd\x25\x68\x05\xba\xe1\xeb\xe6\x26\xad\x30\xb7\x87\x14\xc3\x2e\xb2\x06\xd8\x10\xa7\x7d\x40\xf1\xe1\x9e\x2e\x7a\xc3\xcd\x71\xc9\x89\x9d\xb6\x08\x1c\xa1\xb7\x30\xae\x35\xf6\xda\xd6\xdd\xd0\x8f\xe0\x5f\x91\x1a\x78\x01\xa8\x7a\x64\x14\x2e\xa3\x00\xf2\x8a\x95\x35\xa2\x5f\x75\xab\xa4\x8c\xe7\xa5\xe0\x99\xb1\x05\x04\xa6\xb0\x14\x6e\x2f\xa0\xff\xe3\x76\x57\x57\x86\x1c\xa0\xd0\xe3\x26\x1e\x2d\x09\x1f\x8b\xf4\x25\x43\xdb\x9d\x28\xf3\xfd\xe3\xbb\x82\xdf\xb4\x5a\x81\xb3\x99\x8f\x41\x28\x54\x12\x20\xa5\xfc\x72\xbb\x0c\x2a\xd1\x67\x37\x78\xf7\xb3\x71\xa1\x2b\x9e\x53\x7d\xd6\xd8\x97\x8e\x51\x53\xeb\x22\xdf\x5b\xe9\x89\x4d\xcb\x02\xaf\x80\x88\xd2\xa0\x49\x99\xb0\xb9\xf5\xbe\x06\x2d\xb2\x28\x5a\xbb\x8f\xd4\x80\xef\xc4\x35\x78\xd8\x98\xbc\x39\x98\x51\x43\xc2\x6c\x4e\x89\xd3\xc7\xdc\x4d\x10\x40\xe2\x01\xda\xc5\x72\x2d\xf4\x10\xd8\xe3\x42\x3e\x02\x3c\x30\x56\xce\xfc\xea\x33\x33\x60\x47\x64\xd1\x80\x2b\x06\xed\xb3\x57\xd9\x09\x1e\xd5\x43\xa4\xc7\x80\x29\x8f\x84\xfc\x83\x42\xc7\x2c\xfe\x61\x79\xe2\xaa\x4e\xa3\x79\x9c\xa2\xe2\x04\x9f\xb3\xdb\xf7\xe0\xc4\x7e\xa3\xd3\xdd\xa7\x4a\x34\xb7\x3d\xce\xe4\x8d\xd4\x95\x5d\xce\x53\xe1\xce\x39\x99\x1d\xd2\x16\x85\x03\x3e\x63\x88\x69\x18\xfb\xab\x98\x36\xab\x5b\xd2\xff\x83\x78\xd5\xb2\x58\xe7\x7e\x40\xab\xcf\x50\x96\x03\x15\x01\x1c\xfe\x98\x51\x73\x02\x3a\x93\x8e\x4b\x7f\x38\x70\x89\x27\xd6\x3d\xeb\x74\x75\x4e\xce\xa9\x40\x82\x3d\xa4\xb2\xd3\x59\x7c\x82\xae\x1b\x2b\x09\xad\x8f\x74\xe8\x09\x90\xa4\x7e\x90\x80\x09\xab\x0b\x37\x8a\x2b\xd3\x3f\x44\xa6\x84\x16\xf9\x74\x0c\xbb\xe5\x83\x7a\x57\xe7\x1a\xf0\xf2\x73\xf6\x64\xe0\xfc\xeb\x5e\x00\x0a\x89\x5d\xce\xf1\x9c\x13\xf6\x8c\x62\x2b\x49\x97\xb2\x3b\x73\xe6\xcf\xc1\x72\xad\x11\x17\x51\xc9\x96\xb6\xcd\xa8\xed\x86\x75\x64\x3c\xd9\x57\xed\xec\xc5\x43\xa1\x0a\xe4\x7a\xcc\x43\x74\xdd\x3d\xc8\x6d\x55\x88\x7b\x2b\x7b\x9e\xfe\xc5\x2e\xa8\x77\x28\x9b\x8d\x46\xb3\x99\x95\x5a\x6e\x65\x8e\xd9\x0b\x7a\x27\x4b\xe9\x12\xb0\xed\x35\xe7\xc0\x39\xcd\x55\x81\x90\x24\x80\x9b\x21\x0b\x96\x89\x8a\x4b\xe8\x69\xc9\xb3\x0c\x70\xfe\xcc\x27\x76\xa5\x5a\xe6\x02\x2b\x7d\x52\x55\xa4\xa2\x24\xbf\x0f\x14\x6c\x58\x51\x2a\x35\x14\x97\x17\x80\xd4\x05\x10\x43\x35\x35\x64\xb6\x4f\x20\xca\xab\xeb\xee\xe1\xae\x61\x0d\x87\xc3\x95\x98\xc9\x2a\x2c\xbd\x46\xc0\xce\x54\x94\x90\x3d\x84\x43\xb4\x05\xf8\xe3\x34\xec\x51\xde\xab\xb1\x4c\x3d\x5c\x53\x98\x90\x66\x74\x31\x33\x11\x5b\x8e\x66\x25\xae\x5a\x05\x29\x3f\x07\x23\x36\x94\x8d\x0b\xf3\x31\xfc\xed\xf2\x50\xdd\x4c\x4b\xdb\xde\x23\x9a\x42\xf0\x24\x39\xcd\x0f\xf1\xd5\x53\x08\xe7\xfd\x3f\x40\x41\x63\x25\xc6\xd4\x7f\x46\x48\xc6\xb9\xbb\x36\xca\x82\xa9\x3c\x9b\xea\xe8\x3b\x7a\xf2\x0a\xc9\x99\xf8\x5c\xee\xd8\x95\xea\xeb\x9e\xa5\xdc\x30\x70\x6a\x2e\x0a\x0b\x78\xb4\xaa\x43\x38\xda\x67\x9c\x38\x4c\xfa\x36\xcc\x61\x61\x01\xe0\x1b\x3f\x68\x9b\xa7\x0d\x35\x5c\xb6\x20\x80\xa7\xa9\xd8\x55\x16\x23\x2b\x24\x14\x45\x24\x39\x16\x79\x53\x5f\x0c\x5f\xe4\x6f\x56\x56\x29\x4b\x61\xf8\x8e\x7d\xb3\x61\x6f\xfd\x0b\x67\x54\x0c\x7e\x9c\x5e\x5d\x0c\x6f\x8e\xcf\x06\xaf\xfe\x49\xf8\xff\x27\xaf\x4e\xcf\xda\xf8\xff\xdf\xf3\x7f\x7f\x9f\x1f\x73\x17\x4e\x77\xa2\x30\x4c\xd0\x38\x47\x2e\xf2\x7f\x36\x78\x95\xb0\x3f\xb2\x0b\x91\x52\x7b\xae\x93\x93\x93\x43\xa9\xac\x56\xd3\x70\x99\x7b\xa0\xa1\x79\xf0\x8d\x38\xc7\xf2\xa8\x67\x05\x49\xaf\xff\x2f\x96\xea\xea\x7d\x28\x4e\x5a\x68\x1b\x3a\x93\x29\xa9\xc9\xcf\x4e\x5d\xed\x2c\xfd\xed\xfe\xc0\xc1\x5c\xd6\xe4\xf7\x4e\x66\x6d\x2e\x11\xd6\x44\x8e\x43\xbc\xa3\x5c\x52\xc6\xde\x31\x40\xd3\x27\xea\x33\x62\x61\xf6\xb6\x1e\xc4\x89\x75\xdb\x80\x1f\x6f\x66\x4b\x9a\x8d\xca\x33\x51\xea\x76\x3e\xab\xf9\x72\x76\x27\xca\x0a\x2b\x91\xa2\x02\x11\xb4\x8c\x21\xc1\x15\xb5\xc7\x5c\x24\xc8\x9c\xa5\x6b\x1e\xce\xf3\x10\x88\x78\xde\x4c\x76\xb5\x19\xe5\x89\x4f\x15\x85\xc4\xd1\x30\x61\x14\x0d\xa8\x8b\xda\x75\xdc\xd7\x1b\xdb\x63\x1c\x75\x29\xdb\x5d\xdc\x1d\xaf\x52\xfd\x55\xa4\x95\x55\x62\xa3\xa3\xd7\xd0\x40\x51\xf3\x8c\xfd\x68\x1d\x8a\x24\xe8\x70\xf0\x2c\xdd\x57\x81\xf2\x46\x21\xb6\x96\x02\x67\x4d\x3b\x5b\x6f\xe4\xd6\xde\xb0\x81\xa2\x6f\xbb\x6f\xa8\xb2\xcb\xb8\xc0\x02\xf0\x25\x95\x8a\x05\x4f\xe3\xde\xda\x34\xfb\x07\x72\x6c\x09\xbf\x64\x7a\x33\x9a\x20\x3d\xa6\xb7\x93\x0b\xec\xa2\x40\x4d\x12\x7c\x2e\xea\x7f\xfe\x27\x24\xe4\xfe\xf0\xc3\xef\x9f\x91\x0b\x5f\x7c\x2c\x29\xf7\x09\x89\xb7\x87\xd6\xfa\xc4\xd4\x5b\x97\x4f\xfb\x3d\xb3\xf6\xbf\x56\x66\xad\x3b\xef\x92\x7a\x37\xd8\xf2\xbd\x55\x2c\x2a\x42\xb5\xda\x27\xda\x9d\xfe\xfc\xf3\xcf\xc7\x50\x73\x72\x40\x76\x24\x46\x56\xdf\x2b\x95\xb1\x73\x59\xed\x13\x76\xce\x73\xb9\x52\x65\x21\x79\xc2\x6e\xe7\x43\xac\x4a\x21\xec\xd8\x99\xad\x4a\x61\x37\x1e\x0e\xbe\x3b\xef\x2e\x3b\x98\x78\x67\xa5\x3c\x18\x90\x58\x47\xff\x2f\xac\xec\x7e\xff\x69\xfd\x0c\x7e\xbc\x12\xbb\x4a\x15\x32\xe5\xff\x2c\xfd\xff\xf4\xe5\xab\xb3\xa6\xfe\xff\xfa\xd5\xeb\xef\xfa\xff\xef\xf1\xd3\xca\xe2\x3d\x65\x9e\x21\xba\x8b\xd8\x16\x91\x7e\x4f\x4a\x87\x15\x14\xa4\x7d\x6e\xd4\xce\x26\x51\x54\xce\xb9\x55\x6b\x01\x69\x26\x90\xf6\x68\x14\x4e\xdf\x62\xeb\x73\x88\x2d\x36\x78\x31\x51\xa4\x0f\x42\xda\x8b\x1d\x5e\x95\x64\xac\xc3\x6c\x76\xaa\xd0\x92\x00\x31\x00\xd6\x17\xb2\x88\xad\xe5\xed\x0a\xd7\x53\x94\x56\x98\xef\x18\x99\x26\x90\x12\xb1\x82\x3e\x19\x84\x5d\x4d\x70\x35\xda\x55\xdc\x53\x1a\xa2\xab\xfd\x2e\xa9\x4f\x11\x60\xd0\xe6\x0e\x3b\x10\x20\x48\x98\x06\x5d\x73\x6f\x3e\x10\xe0\x47\x0c\x58\x98\xe1\x6c\xb1\x46\x76\x2d\x91\x9b\xb8\x0c\x2c\x08\xb9\x07\x49\xcf\x34\x69\x67\xa6\x24\xe4\xdf\xdf\x6e\x45\x99\x4a\xac\xd3\x2f\x54\x71\x1c\xfc\xc6\xf6\x28\x4a\xbc\x62\xff\x00\xc6\xf1\xd1\x69\x1f\x5d\x66\x00\xa3\x12\x98\x70\x0d\xcb\xc8\x42\x2e\x48\xed\x20\x23\x44\x06\x3d\x05\x8e\xce\xfa\xad\xf0\x0c\x29\xed\x4b\xc1\xc0\xfb\x0b\x48\xcc\xe5\x17\x02\xd1\xa9\xd3\x0d\x60\x23\xc2\xcb\x2f\xfb\xf8\x41\x72\x3e\x07\xb5\x5e\x88\x12\x0a\x50\x2a\x80\xf9\x6b\x8b\xc3\x82\x8c\x49\x55\xfa\x2f\xd3\xaf\x62\x1b\xe6\x9f\x7d\xc2\xfe\xb5\x7f\x06\x3f\x42\xd1\xc7\xd9\xe0\xf4\x58\x95\xc7\xe0\xdc\xfc\xe6\xf7\xc0\xc3\xf2\xff\xf5\xd9\xeb\xb3\xa6\xfc\x7f\xf9\xd3\xe9\xf7\xfe\x8f\xbf\xcb\xcf\xd3\xeb\x3f\xce\x06\xa7\x09\xbb\x14\xcb\xb2\xe6\xe5\x1e\x54\xd1\x46\x09\xc8\xe9\xcf\x3f\x9f\x26\xf0\x87\x47\x0a\x41\x5e\xfc\x74\xca\x2e\x4b\x5e\x7c\xc9\x65\xc1\xe6\x55\x29\x44\x95\xb0\x4b\xb9\xaa\x36\xec\x32\x57\xaa\x4c\xd8\x3b\xa5\x2b\xf3\xf4\xf5\x90\x9d\x9c\x9d\x9e\x9e\x1c\x9f\xbe\x3c\x39\x35\x1a\xec\x3f\xab\x5c\xe4\xdf\xe1\xd2\x93\x94\x99\x0a\x2d\x86\x08\x68\xad\x1d\x8e\x26\xdf\xf4\xcd\xd5\x80\x8d\x2b\x4a\x41\x57\x35\x78\x77\xf0\x7d\x5d\x53\x56\x5e\xe4\xd2\x26\x97\x79\xd3\x91\x6f\x47\x3f\x4b\xd8\x06\xb1\x90\x37\xa2\x19\x16\x38\x1b\x9c\x0e\xfe\xe3\xc5\x4d\x29\xf8\x76\x99\x8b\x17\x01\x4a\x3e\x82\x08\x6f\x95\xae\x02\x8f\x1c\xb4\x41\x27\x48\xa3\x4a\x61\x23\x7a\x7e\xcf\xf7\x18\xf6\x5c\x95\x42\x64\x6a\x0b\xb0\x70\x1b\xeb\xc1\xc3\xc6\x0c\x4c\x56\x03\xf6\x0e\x93\xc6\x4a\x6c\xd9\xf6\x60\x41\x07\xfa\xdf\xc2\xd6\x4e\xeb\x9a\xc3\x0d\x28\x1e\xff\x96\xf9\x9b\x9b\xf4\xf1\xb1\x87\x91\x22\x28\xef\x50\x03\x81\x67\x21\x0d\x3d\xcf\x6d\x62\x57\xa9\x49\x55\xc9\x2d\x29\xc3\xdd\x39\x54\xc9\xe2\x23\x4a\x5a\x6d\x85\x85\xc5\xc9\xf7\x61\x33\x12\xf7\xe5\x1d\x4f\xbf\xf0\xb5\xd0\xc7\xc7\xd5\x7e\x47\xf0\x03\xb9\x8d\xa3\x1f\x1f\xd3\xee\x1e\x0c\x35\xfa\x16\x7f\xd6\xf9\x75\xbf\x51\x36\x0a\x52\x29\x84\x06\xa8\xd0\x63\x93\xf2\x82\xfe\x9b\x55\x4a\x91\x0e\x65\xa8\xb1\x5e\x0b\x8d\x39\xc8\xc8\x96\xd5\x46\x16\x5f\x58\xca\x4b\xa3\x6b\xe5\x7b\xc6\x97\x0a\xaa\x4c\x04\x25\x51\x07\xec\x4f\xaa\x12\xb4\xfc\x30\xac\x77\xa8\xe8\x09\xb9\x76\x29\x2a\x48\xa8\xa9\x4a\x5e\x89\xf5\xde\x4d\xb0\x68\x6a\x4b\x29\x37\x94\x8c\xc2\xc1\x10\x01\x2e\x28\x66\x4f\xe5\x35\x9f\x36\xa2\x80\x25\xec\x04\x07\x03\x38\xda\xf0\xc4\xfc\xc9\xd0\x0b\x12\xd1\x4a\xc2\xda\xb1\xfc\x02\x0a\x1d\xf4\xbb\x82\x8a\xee\x54\x0c\xd8\xb4\x3e\xb4\xab\xba\xc5\xf1\x21\x23\x51\x02\xb7\x8b\x1b\x06\x2c\xd9\xd1\x20\xa9\x31\x4b\x76\x44\x0c\x5b\xae\xad\xea\x69\x14\x27\x51\xde\x19\x45\xc6\x26\xf1\x48\xbd\xe9\xbf\xf5\x9f\xa2\x68\x58\xa4\x5f\x19\x85\x8e\x17\x6c\x2d\x40\x61\xb6\x2f\x72\x63\x58\x57\xc1\xab\xe6\x19\x3a\x1e\xd1\x11\xb0\xde\xf7\x9d\x14\xa4\xef\x4a\x40\x94\x2c\xc4\x3d\x4e\xd8\x56\x4c\xbc\xf5\xf9\x90\x7b\x82\x02\xc7\x54\x9f\x30\x99\x1d\x62\x71\x8a\xd2\x03\xa1\x63\x9b\x39\x4a\xe0\x54\xad\x44\x5a\xe1\xd1\x45\xb3\x00\xb6\xa9\x10\x01\x59\x43\xed\x12\x87\x5c\xa9\x72\x29\xb3\x50\x8d\x87\xf3\x95\x89\x62\x8f\x31\x34\xf8\x8e\x6d\xc3\x06\x99\x74\x5c\x7f\xb1\xe1\x35\x0d\x08\x42\xe4\x71\x74\xcf\x81\xf7\x54\x37\xbf\x46\xb0\xd7\x70\x78\x6c\xd0\x39\xb2\x14\x6c\x43\x19\x33\xb6\x6c\x62\xc2\x37\xf2\x19\x6d\xc6\x03\x22\x9b\x07\x25\x12\xb2\x1a\xbc\xb8\x54\x25\x13\x5f\xf9\x76\x97\x07\x09\x22\x8f\x8c\xe4\x9b\xe4\xac\x4b\x5e\x49\x6d\xcd\x0f\xce\x56\x42\x04\x69\x41\x0e\xe5\xdd\xf7\xac\x00\xb9\x56\x79\x58\x59\xa0\xeb\xbd\x60\x6b\xc3\xb5\x7b\x55\x07\x8d\x28\x1a\xbc\x5d\x6d\xc4\x3e\x41\x91\x61\xf9\x2e\xe0\x35\x64\x22\xc7\x86\x2e\x65\x09\x52\x17\x2d\x9c\x75\x16\xe4\x83\xb8\xa5\xb4\x92\x98\x00\x10\x4a\x54\x2e\x89\x7a\x25\x73\xd1\xc6\x6e\xd4\x89\xb1\x8e\xdc\xcc\x60\x22\x3e\x53\x72\xdb\xfa\x10\xc3\x26\x37\x5b\x0e\x89\x61\xc8\xfa\x6e\xd4\x3c\xc8\xe6\x85\x64\xb2\x9d\x44\xaf\x7e\x35\x60\xc3\x22\xf3\x73\xd4\x1b\x75\x8f\xe3\x13\x4f\x83\xdf\x1a\x26\x22\xf6\xd0\x54\x87\x21\x56\x04\x31\xd7\x8b\x4f\xa2\x8b\xd9\x6d\x02\x4f\x75\xaf\x8e\x75\x25\x76\x6c\x2b\xaa\x8d\xca\x7e\x01\x03\xea\x3e\x8c\xe8\x44\xa4\x82\xd4\xc3\x33\x78\x02\x7b\x9c\x20\xd3\x87\x37\x13\xd6\xb2\xad\xa1\xd3\x12\xd0\x1f\x00\xde\xba\x8c\xc4\x80\xc9\x28\xa6\x43\x5c\x19\x7c\x32\x3a\xac\x90\x3d\x1d\x9c\x3d\x38\xb1\x20\x59\xec\x89\x95\x10\xb7\xde\xb3\x34\x17\xbc\x74\x7b\x83\x17\x6b\x08\x6e\x67\x4d\x6b\x10\x28\xb9\xcb\xe9\xcc\xb5\x72\x75\x0c\xb9\x4f\xc1\x76\x46\xd9\x72\x0f\x57\xa9\xd1\xd9\x44\x4e\x08\xc9\x54\xb7\x63\x54\xbc\x06\xa3\x53\x0c\x85\xf6\xc4\x70\xb9\xe3\x15\x10\xd1\xa4\x98\x55\x21\xea\x67\xd0\xb0\xd6\x87\x03\xdd\x5f\xf1\x6e\xfd\x41\xb3\x52\xec\xea\x8a\xc7\xf0\xb4\x4b\x41\x90\x9b\x38\x51\x97\x2c\x83\x15\x9d\xb0\x97\x80\x77\x56\x05\x79\x8b\x70\x2e\xf4\xe0\xc5\xa5\x19\x3e\xdf\x27\xa1\x3e\x50\xc1\x22\xb0\x7f\x0d\x02\x3c\x02\xa5\x37\xa5\xe0\x95\x4f\xb6\x84\xc6\x28\x3e\xdf\x20\x94\xd0\x03\xf6\x49\xc0\x8d\xd1\x71\x4f\x71\x66\xd3\xcb\x52\x5e\x40\x57\xa5\xa0\x08\x20\x6a\x85\x03\xea\x0f\x56\x86\x86\x83\xc3\xec\x97\x15\xb7\x35\xa4\x4e\x7a\xde\x89\x38\xca\xc4\x69\x29\x14\x7f\x23\x38\xc9\x95\xa2\x7b\x59\x42\x6f\x17\x8f\xfd\x4b\x0f\x3b\xbd\x62\x49\x25\x05\x28\xdd\x1a\xfa\xb1\x4b\x1a\x26\xef\x40\x57\xa7\x18\xc4\xe3\x8d\x2e\xfb\x20\xf5\xb1\xd1\x3e\x74\xf0\xe2\xda\xe8\xb7\x46\x0d\xf5\xda\x83\xaf\x20\x04\x3d\xce\x69\x65\x89\xe1\xa0\x28\x53\x30\x54\x80\x0e\x97\x26\xb3\xb6\x2a\xf9\x94\xc2\x68\xaf\x4e\xda\xfb\x28\xd0\x23\x83\x49\x41\x41\x82\x66\x7f\xab\x65\x25\x02\xac\x66\x57\xb6\xf8\x88\x8e\x06\x5c\x53\xb7\x02\x86\x46\xd2\xd3\x67\xdd\xb7\xa0\x6b\x57\x99\x61\xc6\x3a\x5a\x50\xcc\x27\xde\x22\xce\xb6\x7f\xb4\x52\xe0\x5a\x8a\x74\x08\x52\xdd\xb8\xe3\x2a\xf8\x24\xe4\xe0\x92\x80\x6c\x5d\x78\xba\x72\x10\xe7\xd0\x39\x88\x4a\x98\xa3\x2c\xf2\x24\x48\x38\x8c\x4a\x57\xaa\x7b\x05\x9f\x30\x32\x31\xdf\xa3\xbe\x88\x03\xf8\xdc\x48\xea\xa2\x91\x79\x2c\x61\x5b\x52\x64\xc5\x40\x1e\x96\x18\x3f\xa6\xf2\x56\x96\xdd\x89\x42\x04\x18\x6b\xe9\x64\x53\xb4\x2b\x8f\xda\x1a\xce\x7b\x65\x5e\x30\xff\x4b\x4b\x09\x91\x76\xab\x37\x66\x6a\x8b\xdf\x7f\x38\x7f\xc9\x7e\x13\xba\xa0\xe6\xfc\xab\x1f\x27\x4c\xaf\x7f\xe0\x7a\x86\x0b\x2c\x45\x9d\x21\xe0\x87\x0a\x2a\xa0\xe1\xd3\xbd\x43\xdf\x5e\x8a\x94\x93\x9d\x01\xe9\x68\x57\x80\x80\xed\xaf\x93\x20\xc7\xde\x69\xca\x1b\x5e\x3c\x8d\x49\xad\x39\x4c\x3a\x83\xb6\xdd\xc1\x23\x95\x3a\x13\x77\x22\x57\x3b\x23\xc0\xe0\xe3\x58\xc8\xc7\xb3\x3b\x5e\x54\x7c\x2d\x18\x74\x6c\x34\x82\x50\x40\x51\x4a\x9b\x3d\x49\x35\xcc\xa4\x76\x2f\x51\x73\x3b\xb8\x6a\xb8\x56\x60\x77\xd8\xf8\xf7\x63\xbc\x00\x06\x34\x64\xfe\xb9\x0c\x69\xf6\xc1\x37\x2d\x71\x9b\x69\xa9\xec\x16\x17\x7c\x5d\x16\xee\x20\x92\x45\xc9\x52\x59\xa6\xf5\x56\x43\xe2\x99\x6e\x28\x94\xaa\x60\xa5\x99\xb0\x4a\x53\xae\x1d\xe4\x3c\xc1\x60\x2d\xa1\x12\x83\x46\xb1\xaa\xb7\x28\x52\x55\x97\x9c\xec\x82\x7b\xf3\xfd\xca\x5c\x43\x1a\x4a\x13\x2c\x28\x41\x43\x1a\xec\xfd\x8d\x29\x8d\x28\x4e\x15\xa4\x67\xb0\x4c\x1c\xaf\x78\x0a\xb0\xf0\xbc\xc8\x78\x99\x0d\xd8\x42\x31\x9e\x6e\xa4\xb8\x43\x11\x93\xb4\xc9\xee\xe4\x39\xf9\x4c\xac\x7d\x18\xb2\x25\x1b\x22\x4f\xaf\x4a\x4a\x14\x80\x3e\x2f\xd2\xa5\x02\x86\x9a\x05\xb2\x9f\xcb\xfe\xfd\xab\x5a\x42\x81\x92\xcc\xcc\x65\x07\x29\x20\x6e\x0a\xc1\xc6\x8c\xe9\x6a\x40\x1b\xd4\xa9\x31\xb9\xac\x2a\xac\x3e\x5d\x9b\xe5\x2f\xf7\x58\x54\xe9\x40\x69\xc3\xef\x92\x99\xe9\x19\xd2\x9c\x76\xa0\x54\xc0\x34\x8f\x24\x19\x8f\x6d\x67\x44\x33\x0f\x9d\x34\x34\x39\xa8\x3a\x0b\x2d\x66\xa7\x36\x15\x1d\x74\x15\xd0\x39\xc7\xec\xcb\x1a\x1a\x72\x95\x41\x32\xe8\x4e\xa8\x5d\x2e\xfc\x98\x39\x18\xa2\x4b\x95\xed\x5b\xa6\x2a\xc2\xb4\x39\x16\x6b\xcf\xc8\x5e\x69\xe7\xbe\x90\xee\xa1\xe9\xc0\x91\xd8\xa2\x88\x0c\x27\x01\xfc\xb7\x51\x39\x0e\x86\x95\x36\x70\x0d\xdb\x42\x1c\x5f\x65\x66\x64\xdc\x1d\x2f\x25\x2f\xbc\x27\xe9\xc7\x2b\x59\xd4\x5f\x5b\xef\x0d\x5e\x0c\xf3\x6a\xa3\xea\xf5\xe6\x71\xf2\x9b\x0d\x07\xc9\x41\x32\x2b\xb8\x0d\x40\x2f\xfa\xc1\x4a\xae\xc4\x49\xb9\xa0\x44\xdb\x3d\x87\x27\xc6\xde\x71\xb6\xf4\x27\xbc\xe8\xc2\x4c\xd7\x0d\xf9\xf6\xac\x50\xb4\x29\x5a\x90\xf0\x6e\x9e\xe6\x90\x99\x0d\x45\x4d\x94\x91\x0a\xe3\xda\xbb\xf0\x91\xd2\xa3\x01\x38\xf5\x76\x46\x51\xd6\x07\x72\x98\x31\x28\xb4\xdb\x43\xfb\xd6\x56\x6e\x5e\x54\x13\x8a\xb1\xa0\x01\xbb\xe1\x46\xeb\x07\x65\xb5\x32\x0a\x98\x43\x71\xf6\x3a\x48\x2a\x1c\x0c\x39\x67\xbd\x76\xa2\x7f\x6e\xf1\x59\x20\xcf\x8f\x9e\x88\x0b\xf9\xed\x23\x78\xf5\x81\xb3\xa1\xb4\xe9\x63\x1a\x2f\xb0\x06\xf2\x5f\x6c\x32\x1b\x91\x8d\xbf\xe4\xe0\x81\xf2\x8a\x63\x58\x19\x11\x99\x1f\x81\x8a\x53\xd6\xc5\xe0\xc5\x62\x34\xbb\x9e\xdb\x44\xa2\x8b\x31\xf6\xdf\xb9\x84\xa4\x98\x9b\xcf\x90\xfb\x72\x31\x9e\x63\xc6\x8d\xcd\x38\xba\x9e\x5e\x8c\x2f\xc7\xe7\x90\x96\x43\x40\x3b\x8b\xce\xb6\x85\x11\x2c\x6a\x11\xa0\x92\x06\x0e\x04\x14\x06\x76\xcf\xd1\xda\x73\x14\xe0\x36\xf0\x05\xc5\x36\x4e\x2b\x6d\x26\xc1\x05\x6d\xe7\x29\x15\x59\x38\x20\x54\xbe\x27\xbf\x35\x5d\x10\x61\x44\xf6\x60\x2d\xc8\x83\x67\xe8\x28\x84\x4e\x89\xc1\x82\xfa\x94\x77\x46\x17\x1e\x02\xad\x60\xc5\x01\x46\xf7\x7a\x7b\x55\x23\xb4\xca\x90\xf5\x1c\x83\x20\x22\x08\xb7\x2d\x83\x89\xc7\x1d\xb5\xa2\x32\xf4\x1f\x2d\x66\xc4\xae\x14\x3b\x50\x12\xb5\x02\xef\xb9\x22\x8b\xe1\x4e\x14\xc6\x5e\x04\x7f\x6b\xa0\x79\x06\x25\x58\x4e\x60\x1d\x21\xb9\xc1\x84\x30\xa6\x00\xac\xdf\xf0\x7c\x5c\xf8\x6e\x3e\xd7\x07\xe1\xaf\xca\x2d\xd5\xb5\x81\xa4\x73\x25\x23\x3d\x0f\xcd\x09\x2e\xcc\x24\x84\xbb\xb0\x1d\x50\xba\x76\x1f\xce\x04\xce\xc2\x36\x35\xe9\xde\x21\x7b\xb4\xcd\x45\xd9\x71\xd6\xae\x62\x52\x52\xd1\x42\x28\x85\x2c\x14\xbc\x57\x83\x03\x80\x11\xcf\x50\x39\xbf\xff\xc5\x49\x34\x73\xcf\xf3\x7d\x62\xcb\x78\x88\x2d\xed\xd5\x18\x8e\x6c\x8b\xc8\xd1\xbf\x98\xd8\x09\xb8\x28\x0b\xa5\xee\x36\x3b\x0b\xe3\x76\x3a\xe7\x5c\x06\x2e\x64\x33\x8f\x95\x2a\xef\x79\x99\x19\x5d\xba\x00\x1a\x52\x65\x13\x2f\xd6\x35\x5f\x8b\x01\x3b\xfa\x00\x68\x55\xe0\x03\x4a\xa2\xae\x76\xd2\xb5\x37\xce\xba\xa0\xed\x29\x0b\x01\x1a\x48\xf4\xc2\xe9\xf4\xb0\xf0\xad\x37\xf7\x4e\x2f\x8b\x5f\x73\x1f\xc3\xd6\xec\xd0\xf1\xdc\xa8\x44\x82\x87\x50\x23\x04\x25\x3c\x5e\x2a\xd4\xa1\x0c\xa8\xa0\xdb\x89\x30\xe7\x19\x8b\x02\xea\x78\x1a\xc8\xad\xd7\x04\xc4\x01\x98\x06\x95\xd5\xe6\xa2\x95\x2e\xd7\xd6\x28\x12\x79\x8d\xd9\x09\x41\x4a\xb5\x47\x70\xca\x1c\xfc\x17\xba\xdf\xe8\x79\xf8\x42\x5a\xca\x5d\xa5\x1d\x18\xac\xed\xe7\x8a\x5e\x33\x1f\x8f\x90\x61\x1d\x62\x6c\xb1\xe3\x89\x36\xf7\x29\x3a\x52\x03\x58\x96\x27\xde\x3b\x8f\x54\xea\xbd\x45\x3f\x0f\xe8\x5c\x75\x85\x45\x83\xc6\xf4\x4a\xd5\x8e\x20\x9a\x79\x0a\xb9\xd0\x65\x5d\x90\x07\x23\xbe\x46\xab\x18\x05\x20\x04\x45\x10\x19\x55\xbd\xd6\xd5\xae\x26\xc3\x9a\x8a\x01\x03\x33\xd6\x4e\xcc\x1a\x78\x60\xc4\xa9\x02\xbd\x3a\xbe\x5f\xc7\x83\x45\x8f\x47\xb2\xc8\xc4\x4e\x14\x59\xd0\x70\x22\x68\xe3\x18\x28\x57\x9c\x55\x4a\xe5\x98\x82\x42\xcd\x46\x64\xd5\x1f\xb0\x4f\x2e\x58\x43\x27\xb4\xac\xcd\xde\x9a\x31\xa1\x19\xf2\x7d\x13\xce\x00\x74\x18\xe8\xf2\x62\xff\x12\xa9\x2d\xee\x26\x0e\x9f\xb7\x20\x46\x1e\x98\xe2\x89\xf1\x53\x37\x0c\x95\x59\xb7\x58\x3b\x2e\xfa\x01\x49\x41\x41\x22\xec\x46\xda\x85\x9f\x63\x68\xbb\x93\x69\xad\x6a\x9d\xe3\x34\xf8\x6e\x57\xaa\x5d\x69\x58\x3c\xf7\x15\x79\xaa\x08\xe0\x20\x8c\x59\xe8\x9f\x6a\xa3\x1e\xd0\x6a\xda\x9d\x95\xf7\x6f\x5b\xdd\x57\xcd\xba\x9e\xd7\xb3\x99\x2f\x75\xe8\xc4\xf3\x43\x37\x88\xc8\xe3\xbc\x78\x37\x52\xae\xba\x6a\xe4\x23\xac\x10\x8c\x2b\x41\x7c\xc0\xf7\xc1\xdf\xec\x35\x20\xc0\xd0\x59\x00\xa9\x68\x43\x64\x9c\xbc\xc4\xdc\x7a\xbf\xf9\x9e\x71\xf2\x61\xbb\x82\x38\xb3\x2e\xe7\xd4\xb5\x3a\x32\x0a\x4d\xf1\xd5\x06\x5f\x6d\x5c\xc2\x96\x39\xd8\x39\x91\xb7\x19\x0b\x64\xa9\x61\x78\x27\x77\xb8\xc6\x25\xf1\x9d\x51\x6d\x6a\x50\x55\xb7\x38\xdd\x47\x2a\x47\xbb\x98\xb2\xa3\x79\xbd\xbd\x63\x3b\x54\x1d\xd7\xcb\xdf\xb6\x4f\x6b\xf3\x1e\x68\x3a\x5b\x21\x90\x11\x70\x15\x08\x5b\x4d\xaa\x75\x50\xe1\xbb\x08\xc1\xa2\xf0\xc6\x80\x6e\xec\xd8\x8b\x04\x4d\xf3\x86\x06\x10\x14\xdb\xba\x20\x0d\xfa\x58\x30\x97\x00\x8c\x29\x3b\xa4\x91\xcc\xbc\x2c\xf7\xad\x92\x5c\x6c\x3c\x86\x42\xce\x9e\x19\xd8\xaa\x2c\x18\xc6\x1a\x1d\x99\x39\x0e\xc4\x97\xf8\x54\x00\x37\xd2\x31\x09\xb4\xd7\xc2\x2b\x0e\x15\x2d\x07\x9b\xcf\xcd\x34\x2c\x3f\x12\xfc\xbf\x47\xe2\x37\x9b\xff\xc4\x8a\xe3\xac\x0f\x2d\xb4\x02\xa0\x2e\x2a\x6f\xb7\x04\xb0\xdc\x73\x08\x49\x8c\x33\xc4\x8f\x50\xab\x07\x40\xc5\x3a\xf4\xc0\x03\xe0\x62\x31\x48\xe4\xb3\xc1\xc5\x42\x6c\x31\x17\x7c\xfb\x35\x30\x60\xfc\x01\x18\x30\x60\xf8\x90\x06\x95\xef\x8c\xfc\x9b\x00\x81\xc1\x66\x1d\x45\xee\x82\x60\x13\xe0\xe2\x0a\x9c\x25\x04\xb5\xc1\xf4\xdf\x6a\x88\xd7\x2b\x55\x61\xd7\x1e\xee\x3e\x61\x2f\x32\xf4\x95\xe6\x7b\xf0\x00\x1c\x5b\xb4\xca\x8e\xfb\x32\x20\x47\x14\x7b\x98\xd7\x4b\x0b\x7a\x70\x96\x59\x28\x0c\xed\x03\x11\xc1\x7b\xc7\x8e\x27\x5a\xa4\x43\x25\xc8\x2a\x1f\xee\xcf\xd6\xae\x44\x41\xc9\xf3\x5f\xac\x8b\xf7\xa1\xcd\xb1\x18\x30\xc1\xea\x1b\x23\xe2\xce\x74\x51\x09\x75\x51\x1b\xc8\x86\xb5\x50\x15\x18\xc2\xbf\xa9\xf8\x68\xdc\x13\x4c\x29\xc7\xf3\x0a\xc1\x5a\xdb\xec\x02\x51\x59\x2c\x82\xa0\xad\x63\xc6\x37\x48\xe9\x6a\xd9\xd8\xb1\xa4\xe5\x05\x26\x5c\xba\x2e\xdc\x11\xba\xa4\xdf\x21\x68\x87\x66\xfb\x67\x60\x36\x2c\x32\xf3\x56\x8b\xfc\x0e\xcb\xd6\x44\xd1\x81\xc0\x60\x78\x0e\x64\x43\x62\x01\xab\x82\x65\x1a\x2e\x71\xd3\xbf\xb7\x67\x2a\x4a\x82\x15\x5b\xc8\x1c\x8d\x3e\x3d\x60\xef\x30\xb9\xa5\xeb\x79\x74\x1c\xba\x51\xb9\x47\x73\x23\x0a\x7a\xec\xd5\x07\x2f\xa2\x66\x59\x9c\x13\x94\x30\x86\xe3\x9a\xe2\xb0\xf4\x4b\xcc\xb3\xd6\xb1\x4f\x20\x79\x2b\x67\xce\x5b\x3b\x5a\x23\x0c\x8b\x53\x30\x28\xb2\x00\x9f\xb1\x35\x7f\x35\x88\x44\x50\x81\x00\x59\x01\x02\xb7\xb0\xac\x52\xac\x8d\x2d\x45\x1e\xf3\xfb\x8d\x62\xf7\xe6\x6a\x67\xd4\x74\x7a\xb1\xa9\x75\x12\x64\xb6\x55\x1b\x4a\xcc\xaa\x7c\xbe\xaf\xef\xe3\x05\x2a\x53\x90\x92\x01\x3a\xb0\x8e\x83\xe1\x95\x22\xc3\x96\x0a\xe4\xdc\xe1\x5e\x82\x7a\xf0\x96\x95\x1c\xa1\xca\x82\x4f\xa1\xb9\x29\xbe\x8a\x12\xfd\x58\x61\xe3\x52\x6b\x91\x74\x91\x3b\x8c\xeb\x94\xce\x83\x70\x67\x19\xb0\x13\x2c\x17\xca\xd1\x0b\x87\x51\x98\xb0\x2d\x74\xc4\x5b\xaf\x0d\xa5\xec\xc0\xd6\xe6\xbc\xb7\xfd\xed\x3a\x55\xfa\x96\xb7\xef\xc8\x9a\xba\x0f\x30\x4e\x1f\xba\xb5\xb1\x3b\x95\xd7\x5b\x72\xbf\xeb\x4a\x81\x8f\x3e\x4c\x6a\x07\x39\x81\x5d\xfa\x9d\x6c\x59\x96\xd6\x9a\x09\x66\xe7\x6f\x58\x30\x88\x3a\x6f\xd8\x97\x5e\x51\x53\x3b\xa0\x2a\x77\x48\x92\x01\x67\x3e\x29\xe4\x09\xa6\xa0\xe0\x59\x4b\x73\x85\x3b\x19\x2b\x1c\x3b\x80\x99\x20\x56\x90\x29\x0a\x13\xb8\x9b\x11\xd2\xb7\x9f\xa1\x69\x37\xf2\x44\xa2\x5e\xfc\x4f\x98\x7c\x94\x37\x19\x2e\x44\x35\x9a\x27\x1f\x81\x3a\x52\x00\xc6\xa1\x7d\x05\x94\x01\xf7\xfe\x73\x48\x06\xd7\x1e\xf4\x1f\x89\x74\x03\x23\x5c\x2d\xa6\x43\x84\x13\x60\x67\x16\x64\x8a\x0d\x00\x1d\xcd\x70\x01\x2a\x13\xbe\x61\x3d\xa5\x60\x16\x2c\xc2\x6d\x83\x7d\x9f\x62\x62\xa8\xb1\x60\xe9\x29\x8b\x81\x5c\x44\x7b\x65\x25\x80\x2c\x11\xd4\x4f\x12\xc8\x99\x07\xe5\x24\xba\x3f\x6d\xb9\xcd\x86\x50\xbe\x02\x94\x4c\x02\x50\xdd\x63\x67\x14\x4d\x8c\x6e\xa1\x10\x0a\x14\xdc\xab\x64\xa5\x20\x86\xdf\xaa\xce\xbd\x70\xb7\x49\x11\xc0\x73\x21\x2e\x67\x4a\x90\xd6\xb1\x75\x0d\x5c\xda\xf4\xde\x63\x4b\xc7\x50\x31\x7f\xf5\xb0\x05\xdc\x3c\xf4\x81\x0f\xac\x6c\x44\x9b\x8d\x26\x80\x67\xd4\xda\x1c\x67\x7d\xf0\x44\x07\xa0\x92\xa0\x52\xfd\x7f\xec\xbd\x4b\x73\x1b\x49\xb6\x26\x78\xd7\xfc\x15\xde\xb4\xee\x16\x69\x16\x0c\x91\xd4\x2b\xa5\x6c\xbb\xd6\x10\x18\x94\x50\x05\x02\xbc\x00\x28\xa5\x6e\x5b\x5b\xa5\x03\xe1\x20\x23\x15\x88\x40\xc5\x83\x14\x6a\x35\xdb\x5a\xcf\x1f\xa8\xdd\x5c\xdd\x31\x9b\xfd\xd8\xec\x2e\xff\xc9\xfc\x92\x31\x3f\x0f\x7f\x44\x04\x48\x4a\xa9\xcc\xac\x9a\x4e\x2e\xaa\x52\x64\x84\x87\x3f\x8e\x1f\x3f\xe7\xf8\x39\xdf\xc7\x91\x45\x0c\x2c\x6d\xf7\x59\x4a\xed\xb4\x64\xb1\x38\x26\xb2\xa3\x0e\xcf\xc5\xe0\x0d\x25\x95\x87\xd9\x83\x4e\xf9\xc2\x03\x7e\x5a\xc9\xc5\x55\x92\xa9\x83\x42\xc9\x18\xcd\x05\xb7\xa4\x04\x8f\x42\x3e\xcc\xee\x89\x1f\x6f\xe9\x20\xe8\x3b\xd2\x65\x8b\xba\xac\xf2\x95\x2c\x12\xbe\xad\x5b\x02\xee\xb3\x61\x0c\xab\x54\xe1\x78\x26\x83\x65\x4b\xe5\xbb\xd3\xc6\xd2\x3c\xdf\xa0\xfb\x0a\xbe\x23\xe4\x50\x1b\x81\xa0\xb4\x15\x27\xbb\x02\xa2\xe9\xb4\x09\xcd\x5b\xda\xca\xba\x96\x29\x18\x32\x7e\x03\xad\x30\x1c\x9b\x49\x60\x45\x20\x0e\x56\x29\xab\xa4\x24\xec\x12\xcf\x64\x6b\x64\x8b\x36\xda\x0a\xc0\xce\x17\xe6\xfe\xca\xf5\x9b\x6c\x48\x6c\xb5\x56\x88\x53\xde\xee\x50\x23\x56\xe0\x4c\x0d\x57\xa1\xf7\x7c\x51\x37\x77\x0b\x59\xde\x90\xd2\x86\x4b\x5e\x35\xe1\xe8\x01\x2b\xde\x66\xca\xde\x18\x7c\x4b\x77\x27\xcc\x37\x04\x42\x8d\xd1\x43\x2c\xd0\x71\x03\xf1\x10\xf3\x29\xf9\xfa\xa0\xfb\x5a\x68\x68\xae\x85\xa6\x18\x87\xbb\x61\x34\x43\x07\xc9\xdc\xec\xd9\x66\x48\xbb\x03\xa0\xda\xc9\xda\x58\xca\x34\x2d\x4d\x10\xf1\xee\x33\xd3\xdc\xe5\x1b\x90\xfa\x3b\xbb\xdb\x9e\x0d\x20\x8d\x04\x65\xe7\x6e\x6e\x56\x39\x5d\x49\x29\x46\xa3\x38\xd9\x16\x66\xc9\xb6\x20\xb5\xee\x07\x64\x50\x91\xaf\xfa\x80\xab\x36\xa7\x37\x98\xc3\x4d\xb3\xb3\x0d\xed\xd4\x28\xae\xe7\x08\x49\x41\xf6\x3a\x82\xbd\x36\xb6\x27\xd2\xbd\x37\x6e\x49\x28\x2f\xe8\xce\xe9\x83\xdf\x7c\x25\xf4\x72\xd0\x14\x7f\x13\x15\xc3\x50\x0c\x67\x47\xdc\x2d\x2c\x8d\xdd\xe8\x6f\x7b\x14\x38\x37\x06\x4b\x75\x1f\x45\x0d\x7f\x54\xb6\x22\x40\xef\x12\x08\x42\x65\x15\x7b\x8a\x78\x83\x82\xae\x94\xb3\x1f\x98\x7c\xd5\x0c\x03\x73\x8a\xcd\x1b\x49\x69\xd8\x6c\xfd\x3c\xa5\xea\xaa\x50\xe5\x55\x9e\xc6\x36\xb9\x1c\x03\x1e\xdc\x1d\x4c\x80\x87\x5b\x61\xa8\x51\x30\xfc\x0f\xa9\xbc\x61\xcd\x8a\x61\xee\xcc\x4d\xcc\xc5\x55\x80\x28\xf7\xcf\x81\x94\x06\x5f\xd0\xc1\x94\x76\x7e\xd1\x02\x97\x06\x38\x69\x44\x91\xd6\xca\x42\xab\x5e\x17\x4d\xba\xe2\x28\x8b\x13\x2a\x77\x3b\xac\x0d\x82\xcc\x0d\xe6\x37\xfd\x1d\x53\xc2\xe9\xa4\x8a\xb5\x24\x21\x14\x7b\x91\x95\x59\xff\xae\x4b\x1b\x1f\x8e\x64\xc1\xcd\xc9\x36\xd4\x64\xc8\x1f\x45\xc7\x5e\xab\x9a\xc6\xb9\xff\x1c\x1d\xfb\x31\x03\x92\x04\xcd\xc5\xbe\x43\x27\x58\xe4\xae\xc6\x79\xb2\x55\xea\xef\x08\x7a\x3e\x47\x12\x5f\xb5\x6d\xc8\x26\x44\x90\x96\x79\xe7\x40\x6c\x06\x1f\xd4\x98\x56\xf6\x82\x86\xa4\x1b\xc1\x81\xd3\x0e\x17\x09\x05\x9a\xb1\x4e\x7a\xa4\x1e\x1d\xc2\x04\xfd\xb0\x31\x24\x28\x38\x6b\x62\xd6\x58\x34\x65\xc0\x74\x21\x41\xfc\x4b\xf5\xb2\x07\x9e\xdb\xbc\xdb\xdc\xb2\xb2\x41\xdb\x00\xe4\x49\x7a\x30\xaa\xbb\xb3\x16\x94\x5f\xd9\x05\xc8\x6d\x6e\x12\xc1\x64\x03\x6b\x09\xb2\xea\xf2\x1b\x2c\xf4\xf9\x5a\xe4\x6d\x7b\x83\x60\x6a\x09\x1e\x08\xab\x7d\xf3\x4b\xa3\x69\xdb\x6e\x51\xf0\xac\xfb\x6a\xc4\x40\xe5\x41\x87\x9a\x48\xd7\x77\xa0\x62\x3b\xee\xe6\xd7\xa1\x61\xaf\xbe\x0e\x04\xbb\x63\x04\x98\x15\x6f\xba\x13\xbb\x78\xd7\xa6\xa8\x66\x2b\x72\xa8\x6f\x75\x7d\x85\x3d\xdf\x1a\xa2\x43\x04\xcf\xb1\x60\x2e\xa6\xb8\x51\x85\xc5\x54\x32\x5f\xdf\xbb\xcf\x21\xe8\xf6\x01\xf6\xbf\x27\xaa\x90\x86\xc2\xf3\x4c\xa3\x2d\x39\x54\x41\xc7\x90\x5b\x83\xbc\x4b\x05\xc0\xea\xdd\x4d\x37\xe3\xd7\x08\xc0\x3a\xea\xe3\xda\xa9\xa1\x70\x85\x1a\x0e\x25\x2e\x4f\xe9\x84\xe2\x76\x46\xd5\x48\x9c\x68\xde\x68\x84\x62\x6f\x50\xe1\x31\x16\xab\xa2\xac\xf2\x3c\x6e\x74\xe4\xe6\x2a\xb7\x15\x2e\x08\x61\x80\x17\xcf\x10\x00\x33\xc4\x5e\x74\xd7\x93\x34\x43\x54\x54\xd1\xc0\x50\xcd\xda\xf1\xd2\xc6\x10\xb1\x6e\x70\x7d\x8c\x6a\x45\xb4\x9d\xbc\x3d\xd3\x67\xe7\x73\x78\x96\xe1\xfd\xd5\xaf\x85\x02\x7e\x74\x2f\x0a\x78\xfa\x75\x28\xe0\xae\x05\x4d\x39\x0b\x16\x48\xd7\x98\x2a\x10\x3c\xa8\x3c\x03\xda\xa9\xe2\xf9\x1a\x00\x71\x93\x0b\x92\xd8\x3c\x44\x4e\xb5\x80\x81\x83\xe8\x82\x97\x47\xb9\x6e\xad\x96\xee\x85\x1d\x77\xa2\x57\x95\xa3\x45\x98\x0d\x4b\x3f\xe7\xdc\x02\x6e\x53\x38\xd2\xc4\x73\xc1\x67\x0e\xc4\xb5\x4c\x13\xaa\xe4\xa8\x44\xaa\x64\x89\xe5\x2c\x4a\x6c\x94\xd4\x36\x60\x95\xdb\x82\x35\x70\x95\x51\x39\x5e\x29\x07\x66\xce\x2b\xdd\x70\xee\x70\x9e\xcb\x80\x4f\x7e\xbc\x70\xa6\x1b\xc6\x2c\xc7\xcc\x52\x93\x59\xbe\xc8\x11\x04\x8f\x6e\xb4\x8c\xc1\xd6\x42\xab\x33\x57\x8c\x9d\x01\x7b\xd2\x46\x5f\x1d\x4b\xc0\xbb\xf3\xbb\x63\x08\x18\x0a\xb1\x23\xb6\xb3\xd0\x11\x51\x70\xc0\xe1\xdf\xa9\xc2\x84\x07\x8d\x88\x40\x3c\x91\x44\xdc\x80\xa8\x7a\x3b\xa1\x74\xe7\x99\x03\x79\xa6\xa0\x95\xdf\x2d\x11\xdd\x1d\xcf\xf2\x82\x5a\x80\x8f\x43\xae\x52\xe6\x49\xba\x13\xdb\xf0\x93\x9f\xee\x34\xbf\xbc\x63\xf7\xab\x59\xbb\xdc\xe8\x98\x9e\xae\xa4\x72\x92\xed\xe1\x4c\xe6\xcc\x77\x63\x4b\x06\x0d\x61\x43\x07\xc9\x3d\xb0\x20\x49\x5e\xeb\x46\xa7\x7b\x70\x02\x3b\x71\xc1\x62\x85\x55\xde\xce\x6b\x7b\x49\xc6\x29\x6e\x16\x6b\xc4\xc1\x76\xdc\xb7\x7b\x6f\x25\x7f\x42\x48\x96\x75\x9e\x81\xca\xde\x23\x6d\x5b\x04\xe2\xa3\x2a\x32\x95\x92\xb3\xa4\xed\x80\x7d\xe3\xdf\x34\x92\x9c\x31\xb7\x87\x59\xed\x9c\xa9\x28\xea\xac\x34\x60\x33\x14\xe0\xa1\x4f\x19\xc7\x91\xf6\x33\x07\xa7\xec\xdb\xe8\x06\x62\x6a\xe8\x95\x5c\xaf\x95\x51\x11\x49\xe9\xc5\xb0\xb0\xaa\x3f\x4e\x16\x15\x07\x13\x18\xfb\xcf\xa9\xb1\xcd\x97\x36\x99\x75\x5d\x24\xaa\xd2\xb3\x61\x2b\x86\x90\xb7\x04\xe3\xd7\x66\x52\x7d\x58\xfd\x56\x6a\x37\xc7\x7f\xec\xf7\xf1\x4e\x44\x66\x25\x47\xcf\x75\x73\xfa\x90\x02\x00\x76\xbc\x0a\xa4\x54\x87\x61\x13\x49\x1e\x52\x8d\x5a\x81\x18\xff\x76\x10\xa6\xe4\x45\xf8\x0d\x51\xee\x0f\xe6\x9b\x83\x9f\x8b\x72\x7f\x2f\x86\x7d\x33\x09\xa6\x8d\x63\xdf\xe5\x89\x98\x1b\xd3\xad\x2a\xb1\x73\x54\x90\x2c\xb7\x74\x2e\xa1\x3a\x7a\x9c\x94\x0e\xea\xa6\x41\xe3\xa0\xe4\x83\x56\xb4\xda\x96\x94\xdf\xe4\xf7\x59\xc0\xbf\x36\x76\x3e\x25\x77\x3f\x30\xfe\xdd\x76\x5d\x7f\x06\xa2\x3e\xf3\x09\xc8\x45\xf5\xf7\x80\xae\xff\x9d\xdd\x16\x28\x90\x16\x9a\x2a\x10\x25\xdc\xff\xa0\x44\x82\x55\xac\x87\x15\x78\xf7\x99\xfe\x9d\x09\x6a\x69\xad\xb9\xd5\x27\x6d\xa3\x95\xe9\xc6\x4a\x46\x9b\x5a\x0f\xe3\x15\xb2\xaa\xd4\x6a\x5d\xf9\x88\xae\x3f\xb3\x23\x49\x29\xae\xf3\x84\x64\x13\x6c\x38\x59\x57\xf9\xca\x94\x25\xea\xb5\x4d\xf4\x61\xef\xdd\x71\x77\xf5\xd0\x1c\x47\x1c\xc2\xd7\x76\x3b\x9c\xb6\xe6\x84\xc6\xdb\x2f\xe8\x0e\xc3\x24\xc0\x69\x06\x6c\x20\xad\x26\xad\xed\xce\x20\x14\x49\x61\xf1\x5b\x4c\xc7\xe0\xf4\x60\x13\x11\xf6\x3f\x77\x00\x33\x78\xb4\xea\x81\xba\x59\x70\x9e\x12\x99\x91\x79\xf1\x12\x17\x94\x2f\x1a\x5c\xfe\x18\x44\x53\x6b\xde\xbb\x26\xda\xe1\x35\x26\x04\xe4\xba\xe0\x7d\x80\x77\x18\x67\x39\x1e\xa1\x50\xd3\x0d\xb0\x66\xa8\xad\xfd\xc2\x22\x72\xac\xb6\xaf\x4b\x5e\x40\xe8\xa0\x79\x49\xc8\x45\x7c\x72\x61\x71\x9c\xd7\x45\x7e\x95\xcc\x93\xca\x04\x38\x1d\x66\x0e\xb8\x24\x68\x8f\xc6\x4b\x1e\x9a\x73\xf6\x22\x01\x06\x5b\x7d\xd8\x48\x1d\xde\xa3\xd4\xc5\xed\x57\xfb\xe8\xda\x27\x59\xac\x9d\x28\x12\x19\x1f\x47\xbe\x79\x63\x1e\xe7\xa2\xcc\x51\xfa\x18\xa3\xe6\x4b\xaa\x78\xb0\xc7\xb6\xfb\x8d\x29\x6c\xa4\x41\x50\xce\xc7\xd1\x21\x55\x6a\x80\x03\x85\x39\xb9\x77\xdd\x6d\xde\x33\xe4\xca\xad\xd4\x6f\x6c\x1f\x12\xfd\x12\x02\xd8\x2e\x5c\xb1\x5f\x82\xab\xff\x82\x08\x1f\x4d\x34\x03\x67\x1b\x0b\x1f\xd4\xc0\x1c\xb3\x35\x7a\xf6\x95\x39\x46\x3a\xe6\xcf\x57\x5e\xc9\x6a\xcd\xe4\x07\xcb\xba\x00\xd5\xef\x1b\x33\x99\x3f\xa8\xf2\x91\xcd\x4d\x21\xe5\x48\x8a\x80\x71\xfb\x90\x3e\xbb\xb9\xa3\x08\x61\x84\xee\xd2\x55\xb6\xcc\x8b\x05\x5f\x8f\xe1\x4e\xa4\x03\xdd\xb9\xf8\xa3\x03\xa1\x71\x19\x75\x74\x14\x8a\xc1\x92\x4c\x5d\x07\xc3\x90\xca\x37\xf3\xba\xa8\xc4\x4f\x75\x7c\x89\xe4\x05\x90\x50\xe1\x64\xb3\x50\x1d\x7e\x92\x2d\xb5\x5b\xa3\xf8\xa1\x25\x2d\x6e\x4e\x33\x00\x15\xb0\x7b\x0d\x6a\x49\x7e\xb7\x2c\x6b\x55\xee\x07\x4d\x10\x75\x9c\x4a\x90\x0a\x2d\x48\x7b\x1c\x17\x06\xa6\x67\xdd\x2b\x28\xb8\x0a\x84\x34\x65\x51\x2e\x24\xf7\xbe\xbd\x96\x44\x0b\x8f\x03\x1c\x0e\x65\xba\xaf\x85\x20\xd0\x4c\x1b\x5b\x7d\x5a\x68\xe3\x0f\x30\x8e\x58\xa8\xb6\xbf\x6b\x40\x4c\xc8\x6e\x74\xad\x26\x2e\x22\xc2\x8b\x5c\x6d\xba\xad\xea\xb4\x92\x99\xc2\xbc\x73\xcc\x93\x9e\xa7\xc9\x25\x25\x16\x77\x28\x6b\xd8\xc1\x66\x32\xd7\xaa\xa8\xf0\x9c\x77\x5e\xa3\xdb\x8c\xd6\x1a\x6e\x1c\xd1\xdc\xb2\x0f\x11\x58\xb2\x51\xab\x99\x2c\x2d\x20\x03\xef\x2e\x64\x06\x83\xeb\x1f\x8c\x31\x17\xf9\x46\xa6\xd5\x06\xab\x35\x0b\xd5\x65\xec\x39\xd7\xb7\x98\x88\xa3\x37\x87\x3e\xbd\x38\x55\x9f\xb2\x36\x4c\x50\x5f\x2b\xe7\xcc\xfc\xab\xba\x2a\xe0\xca\x6c\x93\xd7\xce\x7d\x0d\x5c\x22\x11\x78\x98\x16\x85\x34\x36\xb3\x0b\xd6\xba\x09\x1a\xbb\x07\x1e\xe3\xa4\x43\x60\x6a\x59\xe8\xd3\xcb\xa4\x8f\xc1\x12\xdf\xd1\x7d\xbe\xd6\x6a\xdd\x64\x3b\x29\x6c\x49\x29\xae\x54\x1a\x8b\x24\xc3\xf0\x05\xa0\x96\xe3\xbe\x54\x98\x01\x0a\x0b\xdb\x04\xae\x72\x4a\xb2\x51\xdd\xcd\x65\x6a\x15\xba\x72\x9b\x77\x41\xcd\x88\x69\x84\x5d\x12\x7e\xca\xa6\x6a\x76\xbe\x00\xb9\x21\x98\xd9\xe3\x97\x82\xa3\xbb\xe6\xe4\xe9\x19\xf8\xd1\x76\xa2\x5e\x92\x41\x44\x92\xb0\x92\x78\xe3\x3b\xa0\x1c\xa5\x57\x7e\xa8\xc5\x75\x43\x29\x77\x90\xe3\xc7\x80\x4b\x9c\xe0\x07\xd3\xa5\x9d\x75\x03\xea\xbe\xb8\xa2\x27\xbf\xf7\x3f\xce\x05\xaf\xa5\x1e\x9f\xd3\x43\x2e\x28\xa0\x43\x4a\x0f\xfb\xb2\xa0\x16\xab\x2b\xd5\x2c\xf6\x77\xd7\x99\xbc\x60\x93\x95\x99\x68\xf1\x5f\x01\xca\x28\x80\xb3\x60\xf2\x91\xad\xb3\xd7\xc6\x81\x9e\x31\x71\x06\xe3\xc5\x32\x64\x30\x5a\x20\xc2\x73\xa9\x32\x55\xe4\x35\xde\x79\x59\xf6\x02\x8a\xed\xdd\x68\x6f\xad\x80\x64\x29\xb7\x0c\xd1\xb5\xfc\x59\xe0\x91\x16\x0f\x3b\x97\x60\x40\x18\xa5\x22\x73\xc1\x4b\xdc\x98\x2a\x27\xe0\xe2\x4b\xdf\x93\x29\x5f\xaf\x4d\xed\x08\x54\x70\x3e\x8e\xf3\x0c\xa7\x9f\x30\xdf\x92\xa5\x03\x25\x9b\x20\x2b\x14\x21\x9f\x79\x5a\x8c\xfa\xca\xfd\xb3\xea\x88\x3a\x89\xb5\xb8\xa6\x3e\x93\x14\x21\x9d\x86\xa8\x89\xe1\xe2\xca\xa6\x5d\x6d\x91\x6c\x48\x41\xd3\x5d\xd5\xdf\x49\x19\x22\xe8\x86\xa2\x26\x73\x95\x26\xea\x1a\x9f\x9c\xab\xf6\x81\x85\x67\x6b\x59\x75\xa6\x5d\x1c\x1d\x9b\x7b\x9e\x66\xd1\xd8\x63\xc0\x08\x69\xe7\x74\x95\x4e\x35\x97\x0b\xa9\x00\xe8\x8a\x10\x7e\xa0\x70\xcd\xdc\x93\xfe\xf9\xc6\x5e\x01\xb9\xe5\x72\x65\xe0\x9b\x27\xad\x82\x5b\xad\x1a\x21\x34\xe0\x57\x4f\x75\x1c\x0a\x70\x67\x19\xc7\x18\x79\xd0\x62\x90\x54\xe2\x52\xe5\x97\x85\x5c\x5f\xc1\xdd\xba\x37\x44\xa7\x50\xd1\x65\x9f\xcf\xa1\xe8\x84\x86\x62\x2f\x2a\xbc\x57\x3d\xd4\x4b\xac\x52\xc3\xb2\x08\xb8\xc2\xb2\x13\x81\xaa\xa3\x2e\xe9\x03\x2a\x06\x68\x04\xdc\xcd\x04\x8d\xe0\x74\xdf\xa1\x9f\xe6\xd0\x8f\xe9\xa1\x2c\xb5\x58\x72\x50\x98\x6e\x1d\x18\x61\xa0\xbd\xaa\x4f\xc2\x6f\x4a\xaf\xf6\xbf\x32\xb5\x9a\x65\xca\xea\xe6\x01\x73\x0f\x54\x50\x99\x1e\x1d\x1a\x28\x81\xdd\x36\x69\xda\x37\xa4\x49\xfb\xe5\xc8\xd1\x3a\x98\xd0\x58\xed\xfb\x33\x71\x27\xd1\xd9\x57\xf0\x97\x1d\x3d\x35\xe6\x23\xe7\x9b\xba\x94\xf1\xda\x58\x68\x25\x83\xc0\x75\x91\x83\x64\x63\xe2\xdc\x98\xf4\xef\xed\xdf\xa6\x55\x9d\x75\xdc\xe4\x40\xbd\x40\x91\x54\xca\x3f\x2d\x18\x17\x71\xe9\xd3\xd0\x80\xa9\x68\x8e\x04\x73\x76\xba\x1a\xef\x9e\x81\x37\xbe\xb6\xed\xb1\xef\x01\xac\x33\x5f\x29\xbd\xd1\x4a\x3c\x1a\x4c\x10\xbe\x34\x09\x4a\x88\xc4\xa9\x0f\xb4\xd2\x20\xad\xcd\x95\xb8\xac\x21\xe4\x43\x5d\xa9\x6e\x72\x71\x99\xc3\x95\xc5\x12\xf7\x5f\x71\xed\x81\xb1\x94\x95\xac\x6a\xc4\xfe\x49\x53\x27\x3a\x80\x01\xe8\xba\x89\x19\x44\xc1\x4a\x64\xfd\xe1\x86\xca\x2b\x89\xb7\x3b\x90\x49\x41\x07\x8a\x79\xe5\x12\x55\x4a\x8a\xf6\xa4\x83\x44\x0f\x62\xf0\x2c\x14\xaf\x23\x60\x23\x01\x4a\x8f\xe1\xe0\xf5\xa4\x37\xf9\x20\x06\x53\x86\x45\x3e\x11\xa7\x93\x08\x48\x41\xfa\x6f\x7b\x93\x37\x11\x70\xc8\x20\xa7\x8d\x8b\x6a\x7f\x3a\x9e\xb8\x0d\x04\x62\x36\x86\x7f\x47\x3f\xcc\xa2\xd1\x4c\x9c\x47\x93\xb3\xc1\x6c\x86\xfc\x37\xbd\xf3\xf3\xe1\xa0\x0f\x44\x2f\xc3\xde\xfb\x50\x44\x3f\xf4\xa3\xf3\x99\x78\xff\x36\x1a\x59\xa6\x12\x31\x9d\xf5\xf4\xf3\x83\x91\x78\x3f\x19\xcc\x06\xa3\x37\xd0\x5e\x7f\x7c\xfe\x61\x32\x78\xf3\x76\x26\xde\x8e\x87\x27\xd1\x04\xc0\x2e\x1e\x33\xc5\x09\x72\xd4\x44\x86\x6e\xc7\x1b\xd3\x2e\x90\xe9\xec\x8a\xf7\x83\xd9\xdb\xf1\xc5\xac\x13\x91\x3f\x10\xd1\x00\x1a\xea\x22\xda\xf9\x95\xd9\x75\x42\x9c\xc0\xd1\x6c\x30\x89\xc4\x64\x30\xfd\xa3\xe8\x4d\x79\x5a\xff\xe5\xa2\x67\xda\x39\x8f\x26\xa7\xe3\xc9\x59\x0f\xb8\x5e\x4e\x9b\xcb\xa8\x47\x2b\x3e\x8c\x2f\x42\x31\x7d\x3b\xbe\x18\x9e\x78\x7f\xd7\xd3\x14\x89\x93\xe8\x34\xea\xcf\x06\xef\xa2\x40\x3f\x28\x7a\xd3\xe9\xc5\x59\x44\xb3\x3d\x05\x6a\x98\xde\x70\x28\x46\x51\x3f\x9a\x4e\xf5\x5b\xc8\x83\x03\xb3\x30\x89\xce\x7b\x83\x09\xb2\xee\x4c\x26\xba\x95\xf1\x08\xf5\xcb\x73\x9f\x0d\xe8\x62\x34\xd4\x63\x9d\x44\xff\x72\x31\x98\x74\x89\x81\x6e\xa3\xf7\x66\x12\xc1\x54\xba\xab\xfe\x7e\x30\x1c\xc2\xfa\x34\x97\x1e\x78\x6f\xf4\x1f\xec\xd2\x7f\x10\xef\xdf\x8e\xc5\x59\xef\x03\xa2\x9a\x7c\x60\xe1\x98\x44\x06\xf6\xc4\x97\x89\xde\xd4\x11\xcd\xde\xeb\xb1\x9e\x03\x4b\x43\x34\x1b\xc3\x84\xe8\x05\x22\x1a\x21\x47\x04\xe0\xd3\x04\x25\xee\x70\x11\x59\x82\xa2\xed\x5c\x44\xcc\xc1\xd3\x24\xde\x99\x88\xc1\x88\x25\x64\x36\x16\xcd\x4d\xe9\xd0\xfb\xb4\xa5\xcf\x70\x12\x9d\xf4\x66\x3d\x01\x3d\x9e\xf5\xc4\xeb\x48\x3f\x3d\x89\x46\x27\xd1\x04\x36\x53\xaf\xdf\xbf\x98\xf4\x66\xf0\x31\xfd\x46\x34\x15\xd3\x8b\xe9\xac\x37\x18\xe1\xa2\xe8\xf1\xc2\x56\x1e\x4c\x4e\xcc\x6e\x02\x01\x3d\xed\x0d\x86\x17\x93\x96\x88\xcd\xc6\x62\x7c\x1e\x41\x93\x20\x6a\x76\x41\x98\x3f\x68\xdf\x12\x08\x01\x45\x10\xae\x9e\xf0\xf6\xec\x07\xf1\xb6\x37\x15\xaf\xa3\x68\xf4\x70\x92\xa1\x69\x28\xa2\x11\x3e\xd7\x81\x7a\xb3\xf3\x36\xbf\xd1\x9a\xbe\x07\x2e\x28\x06\x59\x67\x48\x6b\x9f\x8b\x0f\x5a\xb3\x8e\xd4\x8d\x25\x83\xde\xa1\xc3\x90\x40\xd9\xb0\x54\xc6\x87\x36\x75\x90\x8a\xc9\x11\xa0\xf3\x11\xe1\xaa\x9a\x38\x64\x6c\x74\x81\x25\x07\x68\x92\x90\x9a\xb2\x52\x59\xcc\xa0\x1a\x49\xd5\x50\xef\x60\x6d\x28\x46\x7e\x47\xcc\x58\x1f\x08\x95\xcb\x9c\x0d\x56\x36\xc4\x5b\xc1\x11\x40\x73\x19\x89\x2f\xbc\xb3\xb8\x05\xbb\x22\xf6\x80\xee\x3f\xad\x54\x91\x49\x84\xd5\x0c\xb6\x5d\xff\xdc\x83\x1a\xb7\x0f\x18\xac\xa6\xf8\x8a\xbf\x10\x08\x59\x55\x72\xd1\x64\xe4\x30\xe5\x50\x1e\xae\x6d\x48\x61\x80\x52\x2e\xf5\x2c\xea\xe3\xdf\xbc\xbc\xe2\x67\xcb\x8a\x6e\x8b\x20\x9d\x8f\xee\xa9\x31\x8f\x3a\x47\xdc\x77\x17\x24\x94\x58\xb0\xf1\x82\x78\x91\xd6\x9c\xa3\xe2\x83\x17\x40\x53\xd0\x06\xa1\xb1\x62\x2e\x81\x4d\xff\x50\x62\xd7\xd8\x17\xbb\x90\xd4\x4b\x2e\xe7\x3a\x07\xef\x0a\x2a\x07\xf0\x2e\x8a\xc1\x3c\xe9\x1a\x2c\xd1\x86\x42\x9d\xc5\xe1\xce\x7f\x83\x7c\x1f\x78\xd7\x4d\x21\x49\x0d\xb6\x44\x26\x57\x1c\x6d\x13\x49\xac\x24\xa6\xf9\x22\x56\x1d\x00\x58\x88\x7f\x6e\x10\x10\xfc\x37\xc8\x49\x11\xff\x2c\xfe\x1b\xbe\xac\xad\x07\x34\x9d\xfe\x99\x91\xe0\x8d\x27\xe9\x09\xd8\xf7\xa6\x4a\xcb\x93\x2b\x34\xa2\x1d\x8c\xdd\xa4\xda\x26\x0e\xf7\x93\xd2\xca\xf2\xe1\xa6\xe8\xf7\x0e\xb4\x0e\x73\x2f\x58\xab\x93\x22\xa4\x79\x21\xf6\x7c\x6c\x87\xfd\xb6\x0d\x1e\xb6\x06\xfe\x35\x64\x3d\x6c\x1a\x20\x33\x1a\x9a\x07\xdf\x9b\xcc\x76\x4a\xa7\x87\x18\x31\x14\x5c\x1b\x70\x89\x7c\xd9\x3a\xe1\xf3\xe2\x01\x07\xfc\x54\xa9\x07\xce\x2a\xb2\x1b\x00\x6a\xa4\xf6\xd0\xca\x70\x47\x2b\x00\x57\x6c\xbb\xd3\x66\x1e\xb2\x60\x6e\xd1\x8d\x9d\xc3\xef\xb5\x3b\x9c\xe5\xd5\x03\xad\x66\x64\xbc\x08\xc4\xd7\x53\x5e\x40\x2e\x29\x44\x17\x10\xa9\x9d\x22\x4c\x99\xb8\x42\x4d\x0e\x79\x87\x08\x54\xad\xe5\x4a\xa5\x6a\x51\x15\x79\x96\x2c\x08\x69\x79\x0d\xf8\xd9\x49\xea\x4d\x0d\x24\x58\x5f\x2a\x12\x1f\xb5\x5a\xa7\xf9\x46\x15\x62\x8f\x0b\x11\x4d\xa9\x39\x39\x33\x2b\x55\xec\x0b\x04\x4e\x2f\x44\xa9\x7d\xad\x14\xe3\xd2\x19\xa0\x8b\xc3\x0d\xa1\x90\x8e\x5a\x70\x80\x57\x76\x4d\x36\xaa\x9b\x06\xc7\x79\x8a\x9b\x50\xbc\x25\x94\x46\x29\x4a\x88\x78\x7f\x4f\xd5\xa2\x15\x53\x86\xbe\xda\xf9\x90\x6f\xf2\x78\x93\x29\x9e\x4e\xad\x5c\xe6\x1b\xf3\x11\x44\x52\xb2\x1f\x07\x2d\xa4\x20\x21\x69\xc7\x4d\x17\xfc\xf1\xb4\xc8\xe7\x8f\xc4\x9e\x05\x30\x80\xae\xdd\x10\xa2\xec\xc7\x2c\x9f\x97\xfb\x1c\xec\xd8\x99\x6f\xc4\x1f\x80\xb1\x74\x22\xb3\x38\x5f\x89\xb7\x72\xf1\x51\x15\x5a\x75\x61\x62\x58\x5d\x80\x8e\x99\x6d\x44\x3f\xcf\x33\xf1\xcf\x22\x10\x47\xa2\xb7\x2e\x92\x54\x1c\xbd\x7c\x79\xb8\x43\x7f\x08\xc4\x79\xa1\xca\x84\xf1\x0d\xde\x25\x0b\xb5\x33\xbb\x92\xd5\x23\x83\xff\x84\xc3\x07\xb7\xfd\x3f\xfd\xca\x7c\x45\xe1\xe3\x61\x6f\x78\x70\x14\x1e\xff\x62\xec\x6f\xf7\xf1\xff\x1c\x3d\x3b\x7e\xf1\xa4\xc1\xff\x73\xf4\x3b\xff\xdb\xaf\xf4\x03\xda\x6e\xa1\x44\xaf\xa8\xc0\xea\x53\x3b\xff\x43\xe8\x53\x35\x55\xcb\x4a\xf4\xaa\x2a\xa9\xea\x58\x89\xff\x69\x58\x80\x8e\xc2\xe3\x9d\xf3\xe2\xf6\xb3\x5c\xcd\xeb\x54\x89\x57\x3b\xbd\x6b\xb5\x10\x0b\x55\x55\x74\x34\xb9\x6d\x05\x22\x7d\x24\xeb\x2a\x2f\x92\x92\xc2\x9d\x90\x0b\x9f\x65\xb7\x9f\xb5\xc6\xc6\xfb\xa6\x22\xd0\xff\x19\x27\xcb\x25\xe4\x26\xaa\x4a\xff\x13\x51\x8d\x10\x2a\x52\x6f\x55\xbc\x52\x4c\xb5\xff\xaf\xea\xeb\x42\x95\x22\x96\x59\x29\x52\x08\x30\xaf\xd5\x42\xbf\x54\x8a\xb8\xc8\x31\x99\x00\xbf\xab\xea\x22\xdc\x19\xe6\x49\x26\xe2\x47\xc9\x65\x96\x17\x0a\x0a\x8f\x3a\x1e\x0b\x68\x04\x29\x8d\x20\x85\xac\x8a\x45\x9e\x65\xf2\xf6\xff\xaa\x74\x9f\xf4\x6f\xd6\x45\x5e\xdd\xfe\x9b\xb6\x32\xa3\x34\x55\x02\x72\xc3\x75\x1f\xf5\x44\xa4\x4a\xac\x8b\x24\x5b\x24\x6b\xf8\x83\xb6\x3a\x55\x05\xe0\xef\xb2\xe6\x9b\x8b\x58\x89\xa5\x4c\x80\x69\x57\xd4\xa5\xbc\x54\x62\xa1\x67\xb2\x4a\x96\xd0\x7b\x33\xb2\x47\xb2\xa8\xc2\x9d\x5e\x9a\x17\xa5\xf8\x73\xad\x7b\x89\x4f\x2f\xa5\x36\x7d\x6a\xec\x3f\x74\x5f\x52\x1a\xde\xed\xe7\xea\xf6\x33\xa0\xdc\xde\x7e\x2e\xe0\x13\xaa\x12\xb2\xa8\x92\xb2\x4a\x74\x0b\x8b\x3c\x8b\xeb\xa4\x12\xb7\x7f\xc3\x10\xba\x4a\xb2\xb8\x80\xe1\x2f\x16\xb7\xff\x56\xea\x46\xa9\x8f\xb7\x7f\x13\xe9\x23\xec\x49\xa0\xdb\x6f\xad\x29\x58\x79\x75\x01\x76\x41\x0c\xe3\x5e\xca\x6b\xbd\xc2\x5a\x33\x0e\x1f\x21\xd0\x83\x59\xeb\x47\x79\x7d\x5d\x24\x85\xfd\x92\x5e\x5e\x96\x09\xbd\x1c\x8f\x20\x3b\x94\xc4\x23\x86\x69\x2f\xd1\x8a\xd5\x13\x51\x67\x8a\xa6\x45\xac\x65\x01\x93\x9c\xd6\x78\x1b\x1f\x8b\x2c\x5f\xcd\x0b\xbd\x18\x99\x90\xd7\x79\x52\x88\x9f\xf2\x3a\x29\x4b\xb8\x9a\x81\x2e\xaa\x4c\xac\xea\xb4\x4a\xb4\x55\x82\x2b\x5f\xdc\x7e\xb6\x0f\x95\x01\xcc\x3f\xd0\x41\x8b\x2c\xaf\xaf\x55\x4a\x15\x52\x1c\xa2\x8b\xcd\x0a\xe5\x19\x36\xa9\xcf\xa7\x64\xc9\xcd\xa1\x63\x93\xa4\x49\x75\xfb\xd9\x7f\x3a\x14\x27\x1d\xf2\x89\xc2\x56\x0a\xa9\xf7\x4c\x2a\x59\xc4\xb8\xd3\x5a\xcc\xa4\x88\x6f\x3f\x2f\x91\x9d\x4a\xcf\x6e\x5d\xd0\x72\xaf\xf2\x42\xa6\xe1\x4e\x94\x81\x41\x5f\x05\xa6\x91\x6b\x95\xd5\x4a\xaf\x60\x56\xaf\x6e\x3f\x17\x7a\xbd\xf5\xbe\x4b\xb2\x6b\x5a\x08\x90\x73\x38\x11\x33\x55\xe1\xfe\x2a\x45\x9a\x5f\x26\x8b\x44\xa5\x68\xd7\x28\x48\x2f\xc5\x49\x90\x40\x74\xa2\xfc\xc1\xe3\xae\xc4\x5c\x5d\xb3\xba\x72\xbd\x96\x45\x1d\x8a\x41\x8a\xff\xac\xcb\x32\xd1\x2b\x8d\x73\xc4\x80\x39\x4a\x2c\x94\xf8\x73\x9d\x08\x29\x50\x4c\xd5\xa7\xb5\xee\xa7\xde\xd1\xb7\x9f\x61\x5d\x71\x25\x51\xf0\x93\xb2\xa2\x32\x35\xb5\x5a\xe7\x85\x4c\xb2\x32\xdc\x19\x2a\x51\xe2\x1a\xe3\x1c\xd9\x8e\x95\x79\x56\x35\xe5\x46\x7f\x2c\xce\x13\xc0\x56\x8a\xd5\x4a\xd5\x05\x6b\x91\x12\x57\xf1\xf6\xdf\x2b\xbd\x45\xb2\x85\xb6\x1c\xaf\x75\x67\x20\x55\x14\x74\x4c\x5c\x3b\x9f\xc2\x3d\xe6\xac\x6a\xff\x91\x1e\xe9\xed\xdf\xe0\x8e\x1c\xf6\x92\x82\xab\x65\xbd\x94\x57\xaa\x58\x80\x5b\x97\xc5\x12\x98\xd7\x53\x1c\x77\xa6\x1d\x8d\x04\xf0\xa4\xe8\x6a\x9d\xb4\x59\xa2\xd5\xe0\xed\xdf\xe0\x7d\xf7\xf6\x70\x91\x67\x8b\xe2\xf6\xdf\x2a\x15\x8a\x3e\x0a\xe8\x02\x3e\x1b\xdf\x7e\x5e\x98\xfd\x94\x64\x5a\x76\xea\x80\xfe\x86\xcb\x0d\x72\xa9\xa5\x5c\xa5\x42\x5e\x23\xc9\x47\x5d\x69\xb7\x70\x91\xe8\xc1\xe8\x81\xa4\x49\xb9\x52\xe1\x4e\x2f\xc9\xca\x44\x0b\x4a\x3e\xff\x89\x46\xaa\xa7\x5f\x64\xd0\x9c\xee\xeb\x22\xcf\xf4\x58\x6a\x92\x34\x7e\x10\x9e\x5a\x26\x59\x02\x13\x74\xfb\x19\xfe\x13\x3c\x78\x51\xa9\x34\xdc\xc1\x29\xd2\xd2\x2d\x93\x12\x24\xa5\xd4\x82\xa8\x37\x17\x0a\x43\xe7\x51\x21\x5e\x61\xf4\xb6\xe6\xa9\x07\x65\xfb\xf9\x12\x76\xa7\x56\xbd\x12\x34\x59\xe9\x68\x35\x10\xdd\xdb\xcf\x7a\xb4\x50\xb4\x2e\x4a\x55\xe3\x26\xff\xb7\x4b\x50\xf3\x7a\x48\x7a\xca\xb2\x7c\x95\xc0\xb7\x57\xb2\x58\x5c\xdd\x7e\x0e\x77\x4e\x6e\xff\x7a\x3a\x18\x51\x44\xe4\xff\xfd\xdf\xfe\x77\x31\x24\x9d\x27\x5e\xed\x24\xa9\x28\x1f\xc9\x4b\xad\x61\x5d\xfd\xa3\x47\xa8\xff\xa9\x57\x74\x91\xaf\xd6\x85\xca\x62\xa3\x2a\xe9\x12\x11\xc6\xa8\x25\x36\x01\xbd\xad\xe7\x5e\xf7\x52\x35\xaf\xa0\xd7\x79\xa9\x15\x75\xa2\x25\xb3\x14\x7b\x70\xac\xe1\x2d\x64\xfd\x09\x2e\x51\x6f\x3f\x03\x8c\x46\xc9\x27\x0f\x26\x66\xec\xf3\xc1\x53\x56\x20\x93\x24\x3e\x5a\x16\x92\x2a\xc1\xec\x39\xe7\x50\x33\x9d\x82\x3e\xeb\x7d\xe6\x1f\x72\xb4\x76\xfc\x05\xa3\xf5\x4a\x95\xe6\x99\xfe\xe5\x9f\x6b\xd4\x88\xed\x01\xc0\xae\xd3\xc7\x91\x2a\x43\x7f\xfe\x9c\x89\x78\xb5\x03\xa2\x79\x70\xfb\xb7\x03\xd8\x2d\x66\xb2\xb8\xef\xa0\xd2\xb9\xf3\xa0\xe9\xdc\x87\x68\xbe\xe3\x3c\x73\xe7\x40\x5c\xeb\x7f\xe3\x06\xc6\x1a\x19\x58\x7e\xdd\x94\x1e\x25\x96\xc1\x5d\xe9\x9e\x51\xc7\x9c\x83\xd5\x99\x59\x55\xb6\xbb\x87\x27\xfc\x3a\x2f\x8d\xf6\xb7\x1a\x1b\x57\x1d\xa7\x40\xef\x5d\x3d\xed\x40\xc7\xb0\x92\x56\xc7\x52\xcf\x55\xa6\xa7\xa6\xd4\xbb\x0f\xcf\x6d\xdf\x34\xe1\x92\x07\xf4\x0e\x8d\xe9\x63\xb5\xac\x57\x2d\x0a\xe7\xbf\x02\xb0\xc5\x6c\x79\xfb\x6f\x50\x8b\xcd\x2b\x88\x23\x1c\xf3\xfd\xf5\x1e\x57\x29\xd4\x56\x19\xba\x1d\xdb\x17\xaf\x76\xd4\x27\xed\xeb\x81\x85\x10\x4b\xad\x7e\x9d\xbf\x43\x67\x4a\x69\xe4\x82\xfb\x57\x12\x56\x3d\xfa\x9d\x35\xfc\xca\x02\xeb\xad\x14\xd9\x28\x24\x74\xeb\xe2\xf6\x33\x30\xc3\x92\x4e\x28\x6e\x3f\x2f\x6f\x3f\x63\x15\x25\x28\x5f\xda\x15\x72\x51\xd5\x92\x4f\xfe\x32\x40\x97\x4d\xbf\x5c\xf1\x6f\x18\x56\xb2\xf6\xa6\xac\x14\x75\x6a\x37\x0f\x4e\x41\x5f\x3f\x29\x5e\xed\x40\xd3\xde\xd3\xb0\x87\x5d\x2e\x20\x51\x2a\x3a\xd8\xdd\xbd\x80\xcd\xf4\xea\x96\x14\xb6\xc5\x19\x8c\x2e\x55\x94\x79\x96\xf1\xb1\x86\xf2\x6c\x5f\x42\x1b\x0a\xdf\x24\x25\x22\x8b\x79\x5e\xa8\x92\x36\x1e\x7f\x9d\x9e\x37\x72\x1c\x8a\xf3\xe6\x2e\x0d\xec\xcc\xc6\xb7\x9f\x31\x19\x58\x35\x77\x2c\xd9\xc2\x66\xc3\x2e\xc0\x80\xbe\x96\x5a\x95\xa1\xd9\xc8\xf3\x44\x9b\x58\x37\xc7\xd3\xe5\x0d\xc6\xc8\x38\x49\xb8\x3d\x68\x9d\x59\x31\x27\xbe\xed\x9a\xab\x29\x79\xb6\x61\xed\x4b\xc8\xaf\xe3\x93\xd4\x13\x6d\x7c\x09\x56\x79\xdb\x9c\xa3\xb4\xdd\xf9\xa2\xaf\xa3\xed\x06\x67\x7c\xdb\xf1\xeb\x3f\x44\x33\xfd\xdf\x7d\x4f\xf9\x91\x15\x6b\x0e\x3f\x12\xfa\xe2\x5e\x65\x78\x9d\x03\x2e\x40\x7d\xad\xfe\x02\x06\xa7\xeb\x9f\x34\x16\x96\xb1\x53\x87\x8f\x6e\xff\x3a\x8b\x46\x27\x17\x91\x38\x89\xc4\xb0\x27\xfe\x30\xbe\x18\x4c\xa7\xbd\x51\x3f\xb2\x1d\x63\xe5\x01\x4c\x9d\xf5\x2a\x29\x95\x96\x56\x32\xf5\x8d\x9b\xa2\x9c\x49\x6f\x6b\x74\xe8\x5b\x92\xc5\x60\xf3\x73\x87\x41\x57\x5f\xe7\x70\x5a\xaa\x02\x2c\x55\x18\x7a\x2a\x8d\xff\xa5\xad\x4e\xc7\xff\x32\xf3\xad\x8a\x57\x38\x84\x23\xdd\xeb\xe1\xe0\x75\x34\x99\xdd\xfe\x55\x0f\xa2\x3f\x3e\x1f\x44\x13\xb1\x37\xbe\xd0\xff\x9a\x44\xe7\x93\xf1\xc9\x05\x5c\x73\x41\xb9\xe8\x3b\xdd\x11\xa9\xa7\x08\xb4\x15\x7e\xd7\x7a\x7c\xbe\xf8\x43\x6f\x8c\x4b\xc4\xe2\x98\x06\xf8\x07\xdd\x73\xb9\x4a\xca\x40\x40\x8e\x1b\xc4\xfb\xeb\xaa\x70\xe4\x56\x55\x30\x56\x3d\x66\xb0\xb3\x52\x29\x2a\xb5\xb8\xca\x60\x16\x30\xb4\xa5\xf7\x16\x8e\xe4\xb8\x39\x92\x93\xc1\xe9\xe9\xc5\x34\x9a\x04\xe2\xe4\xd1\x60\x34\x8b\x26\xe7\x13\xbd\x5a\xde\xd8\x6e\xff\x3a\x8d\x46\xb3\x9e\x3f\x3c\x92\x01\x33\x71\xbe\x9b\xca\xa9\x94\x5a\x22\xcc\x09\x14\xb8\x47\x56\x5e\x8b\x4c\x6b\x58\xdd\x77\x61\x3b\x8f\x60\xa6\x79\x51\x75\xfc\x25\x4d\x54\x1d\xe8\x9d\x59\x25\x15\x10\x93\x68\xc5\x5a\x7f\xd2\x4d\x5d\x16\xb2\xd2\x1e\x5e\x99\xa0\x14\x90\xdb\xa1\xfe\xd2\xb0\x42\x8c\x5c\xd7\x89\xb6\x0f\x15\x96\xe0\x68\xe5\xf0\x53\x8e\x4e\x21\xda\x20\x58\xc0\xe0\x8b\x17\xda\x1a\x80\x38\x09\x4e\x06\xa5\xc0\xff\xb9\x56\xa8\xf6\x17\x49\x79\xfb\x19\x73\x7f\x6f\xff\x6f\xad\x79\xaa\x42\xcf\x91\x73\x62\x05\xfc\x31\xf3\x9e\x96\x71\x55\x56\x49\x26\x2b\x89\xa7\xb0\xf6\x06\x3c\x33\x26\x76\xcd\xa3\xfb\x5b\xd0\xdf\x4e\x52\x10\x9e\x42\x92\x67\x48\xce\xa7\x1e\x9a\x69\x09\x40\x4e\x59\xd7\x68\x4b\xeb\x31\xe1\x50\xb3\xf1\xb5\xaf\x77\xae\x74\xcf\x04\x3e\x46\xb0\xed\x40\x94\x8f\x92\xd4\x35\x39\x02\x9c\x7b\xeb\xde\x82\xa3\xc0\xf2\x61\xdf\x67\x7d\x2d\x56\xb7\xff\xbe\xf2\xd7\x05\xcf\x7b\x96\x1f\x12\xda\x27\x4d\xa1\x45\x72\x8a\x68\x72\xe7\x5e\xe3\x3d\xec\xcb\xa3\x6b\x6a\x7a\xc3\xf7\xc7\x1e\xa0\xd1\xa8\x6a\xf0\xa2\xd0\xde\xc2\xd4\x75\x50\x2a\x2c\xbc\x5d\x51\x18\x67\x34\x5a\x2a\xae\xb5\xa5\x0e\xa2\x03\x99\xb6\xa9\x82\x5d\xa8\x32\xb1\x90\xa5\x6f\xfe\xec\xd1\x51\x8f\x06\x84\xc4\x2b\x0d\x72\xc1\x40\xd9\x3b\x07\xe5\x37\x58\x19\x3b\x3f\x5f\xbb\x32\x4f\x74\x3f\x06\xa3\xfe\x78\x72\x3e\x9e\x80\x7a\x00\x05\xff\x68\x1c\x5d\xbc\x9b\x80\x6e\x9f\xe9\xaf\xea\xb7\x6e\x3f\xa7\xb8\x37\xca\xd6\xf1\xbf\xc5\x55\x65\xcf\x4e\x0f\xe9\xcf\x75\x9e\x68\xa1\xce\x48\xc7\xb3\x8b\x86\x79\x40\x22\xd6\xee\xfd\xed\xe7\x4b\x0e\x70\x3d\x68\x85\x71\xac\x60\x9c\x80\x3e\xa5\xde\xb0\xc7\xaa\x0a\x49\x3e\x2b\x1f\x47\xb7\x7f\x6b\x1a\x4d\x88\x9f\xf7\x6e\x3c\x15\x27\x93\xf1\x60\x36\x15\x27\x8f\x7a\x17\xb3\xe8\x62\xd2\x3e\x6f\xb3\x47\x12\x7b\xec\x9d\xba\x99\x9e\x7e\xad\xe1\xd9\x3c\xe6\x55\x2d\x41\xf3\x57\x78\xa6\xdb\x12\x6f\x11\x65\x90\xba\x5a\x42\xc8\x04\x0f\x5c\xb6\x58\x0a\x14\xb2\xdb\xcf\xd7\x79\x5a\xdb\xd0\x83\x9d\x68\x96\x01\xa8\xd3\x51\x7f\x41\x77\x11\xcf\xed\x47\xf9\x72\xa9\xdd\x6a\x3d\x65\x30\x1b\x9e\x10\x50\xe7\xba\xfb\x04\x72\xb1\xd0\x5a\x58\xcf\x1c\x7c\x01\x3c\x14\x08\x75\xc8\xc5\x22\x2f\x62\x38\x72\x9b\x87\x35\x23\xb7\x0d\x7b\xe2\xe4\x62\x72\xfb\x57\xb6\x0d\x20\xbf\xc8\x35\x0c\x78\x06\xd1\xe3\x84\xe0\x8f\x88\xb5\x36\xc3\xbe\x50\xd9\x11\x0f\xb8\x84\xfc\xfd\xd2\x78\x31\xa1\x18\x72\xe0\xb0\x33\xde\x1a\x90\x8d\xe5\x6e\x06\x6b\x4c\x55\x49\x55\x2b\x94\x91\x85\x81\xee\x91\x8b\x84\xcc\xab\x4e\x93\x2a\xae\xb5\x47\x0e\x36\x05\xfe\x97\xeb\xfe\xf0\xfa\xe2\x4d\xb6\x9e\x18\x27\xe0\x08\x6d\x4e\x69\x12\x33\xe5\x9c\x61\x5a\x72\x52\x2a\x86\x53\x6d\xf3\x9d\x56\x76\xad\x8a\x58\xfd\xc5\x54\x26\xfd\xb9\xb6\xc7\x31\x7d\xff\xcf\xf5\x23\xb0\x2b\xaf\x29\x2d\x1c\x3c\x2a\xfe\x2c\x1a\xac\x97\xc9\x4a\x89\x9f\xea\x22\x41\x2b\x4a\xd6\x70\x0a\xc3\x0b\xb7\xff\x5e\x29\xde\x0e\x66\x2b\x62\xa4\x17\x83\x3b\xb6\xcb\xc5\x03\xba\x9b\x29\xb6\x21\xf4\xcb\xd8\x98\xd6\x97\x32\xd5\x47\x56\xac\x5c\x8b\x8d\x3b\xee\xf5\xf9\x79\x28\x86\xd1\x14\x2c\x98\xdb\xbf\x4e\xa2\xd1\x2c\x9a\x8a\x77\xd1\x64\x0a\xec\x46\xf7\x49\x13\x1e\x8f\x0d\x47\x1a\x26\xa0\x4e\x13\xfd\x09\x24\xc6\x57\x99\xb8\x06\xf6\x09\xf0\xf9\xe4\xea\xf6\x73\x9a\xe4\x05\x5d\x6d\x6a\xa1\x2e\x1d\x2f\x19\x22\x19\x72\x81\xff\x88\x6b\xb1\xd2\xc3\x83\x35\xf8\x8f\xff\xf3\x3f\xfe\xb6\xe0\x6b\x05\x49\xd7\x0a\xff\xf1\xb7\xff\xf8\x7f\xf6\xf5\x7c\x96\xec\x4c\x2b\x3f\x14\x6b\x72\x78\x31\xb4\x99\x57\xda\x70\x0a\xfd\x43\xaf\xca\xeb\x9f\x72\xfd\x3d\x3d\x3b\x57\x79\xf2\x49\xa8\x4c\x8f\x89\x97\xb8\xc2\xb0\x58\xdc\xd8\x17\xf4\xa7\xda\xdc\x24\xd8\x1c\x5b\xea\x10\xda\xcf\xf6\xf0\x41\xe5\x41\x1b\x1b\xa3\x13\xc9\x9f\x6b\x3d\x69\xc0\x21\x00\x80\x68\x5d\x8b\xe8\x7d\x15\xdd\x95\xd8\x1d\x9b\xef\xce\x62\x61\xba\x5e\xd6\xe9\xf8\x62\x7a\x40\xeb\x37\xd5\xbf\x1f\xa2\xf0\x95\xbc\x86\x25\x46\x16\x11\xa9\x9e\x8f\x36\x13\x0d\x81\xbb\x01\x72\xc5\x43\x7d\x0e\x35\x5d\x3d\x3e\x1a\xc5\xfc\xf6\x73\xa6\xbd\x9f\x45\xa2\xee\x13\x3b\x38\x16\x28\x70\xe9\x86\x32\xf1\x78\xbf\xcb\x7d\xe6\xda\x62\x2d\x93\xe3\x81\x9b\xe4\xd6\xbb\x10\xfd\xf1\x68\x36\xe9\xcd\x76\x7c\x11\xed\x74\x85\x96\x85\xcc\x6e\xff\x0f\x99\x94\xe1\xaf\x7c\x51\xfa\xff\xd3\x9f\xf0\xf1\xeb\xbc\xd0\xc7\xd7\x6f\x76\xff\x7b\x78\x74\x7c\xd8\xbc\xff\x3d\x7e\xf2\xe4\xc9\xef\xf7\xbf\xbf\xc6\x8f\xcd\xa0\x3a\x7a\xf9\xf2\x09\xe4\xa8\x2c\x92\x52\x90\x50\xec\x70\x35\xed\xb2\x50\xc4\xbb\x69\x6b\xf0\x99\xa7\xcd\x26\x4c\x41\xe2\x18\xd7\x79\x59\x94\x2a\x00\xf3\x5c\x7c\xd4\xde\x7d\x9b\xab\x0b\xeb\x45\xf8\xef\x54\x4f\x65\xf2\xaa\x6c\x8e\x1c\xb4\xf7\x6a\x67\x12\xf5\x4e\xce\xa2\x1d\x4e\x9b\x07\x64\x99\xc7\xe3\x34\x3e\x49\xe4\x65\x21\x57\xed\x3f\x9c\xc9\x4f\xc9\xf6\x3f\x26\x8b\x22\xbf\xe3\xaf\xd9\x1d\xaf\xe2\xcd\xa2\xea\x15\x45\x7e\x53\xee\xc4\xf8\xdc\x63\x7e\x9e\xff\xed\x7e\xde\xfc\xce\xfd\xaa\xfd\x65\xd6\x7e\xd0\xff\x86\xb6\xd7\x0e\x20\x91\xbe\xe4\xef\xfc\xe9\x2c\x8f\xd5\x9f\xe2\x3f\x45\xab\x75\x9a\x27\x9d\x4f\x4c\x94\x8c\xff\x74\xa6\x76\xc6\x4b\xa8\xd4\x05\xe4\x70\x8e\x31\x40\x71\x4a\x2d\xa1\xb8\x59\xc5\x98\xec\xe5\x54\x1c\x20\x4e\x02\xa1\x31\x40\xf9\x01\xf0\x7e\x43\x4e\x14\x17\xbf\x84\xa2\x5f\x17\x40\x56\xad\x56\x32\x49\xb9\x40\xe6\xd5\xce\x92\x44\x29\xce\x2b\x31\x47\x71\x12\xb2\x12\xf5\x22\xcd\xeb\x6b\x60\xc2\x06\xfe\xf5\xdf\xf5\xf8\x6f\xfa\x13\x3e\x8e\xd5\xba\x50\x0b\x59\xa9\xf8\x4f\x6f\xce\x87\x07\xc7\xe1\xe1\x81\x5e\xe0\x83\x37\xfd\xfe\x81\xa9\xef\xf8\x59\xa7\xc3\x7d\xfa\xff\xf0\xf8\x45\x43\xff\xbf\x78\xf2\xfc\xf7\xfc\x9f\x5f\xe5\x27\xc9\x4a\x55\x54\xe2\xcd\xf9\x50\x5c\x1f\x5b\xa6\x70\xf5\xa9\x82\x1c\xbb\x9d\x37\xfd\xbe\x18\x12\x94\x5f\xc4\xd2\xb0\xe3\xf0\x6a\x98\x84\x6e\x87\xdb\x84\xf2\x4a\xef\xa2\x67\xb8\x2b\x67\x12\xb2\x81\x4b\x42\x4b\x61\x88\x02\x1f\x57\x04\x21\x19\x09\x29\x12\x10\xc8\x3d\xc4\xbd\xa4\x24\xd4\xe0\xac\xca\x5d\x6a\xf6\xd2\x85\x60\xe2\x3a\xad\x80\x59\xdd\xbc\x9a\x7c\xac\xc6\x6c\xbc\xa9\x8f\x2e\x99\x6d\x5c\x14\x09\xfd\x10\x9c\x4f\x8c\x4c\x50\x3b\x95\xda\xba\x13\xa1\xd8\xd3\x27\xdc\x96\x2c\x53\x0f\x8f\x22\x6e\x95\x86\x93\x3f\x59\x7e\x8f\xc8\x12\x8c\x08\x00\xe8\x08\x80\x15\xd5\x89\x2d\xab\x3f\xdb\x80\x8c\x82\x5a\xac\x2b\x95\x09\x84\x7d\x00\x00\x4e\x22\x49\x60\x9c\x5d\x17\x32\xec\xb7\x16\xcb\xdf\x7f\x7e\xa5\x9f\xf0\xf1\xb4\xf7\xc3\xc1\xf9\xc9\x2f\x68\xfe\xdf\xa7\xff\x9f\x3e\x79\xf1\xac\x95\xff\xf9\xe2\xd9\xef\xfa\xff\xd7\xf8\xb1\xf6\xff\x14\x4a\x2e\x77\xa6\xbd\x1f\xb8\x3e\xe2\x3f\x69\x3d\xbf\x94\x8b\x2a\x10\x49\xf5\x88\xc0\xe6\xb9\x96\xa7\xca\x01\xaa\xda\x16\xe6\x56\xb9\x98\xf6\x7e\x60\xfc\x28\x78\x01\x98\x8e\x89\xd5\x9a\xce\x04\x4e\x85\xcc\x57\x32\xc9\xc2\x9d\x51\x2e\xde\x53\xb5\xc0\xce\x6b\x22\x43\xa0\x1e\x14\x2a\x55\x92\xd8\x6a\x5b\x6f\x3a\xdc\xfe\x59\x6e\x0b\x0e\x38\xd1\x1c\xa1\x3b\x19\xfb\x06\x61\x2a\x98\x7a\x84\x41\x25\x28\x86\x65\xa0\x5e\x01\xc4\xc1\x16\xd7\xcf\x0d\x9b\x1c\x40\x16\xcb\x9b\x90\xce\x3f\x54\xa3\x16\x9b\x0c\xa8\x12\x60\x7c\x4c\xe2\x5a\x75\xb0\x77\x1b\x1e\x64\x3a\x7b\x08\x05\x88\xb0\xd0\x60\xcc\xbb\xb2\x14\x49\xb9\x6b\x0e\x1a\xb7\x8c\x42\x1f\x3a\x1f\x93\x2c\x36\xa4\xcb\x04\xa7\x86\xd4\x1b\x54\x78\x11\x58\x98\x67\x34\xe5\x7d\x88\x9f\xa0\xab\x48\x83\x88\x3b\x57\x48\xc7\x52\x49\x74\x70\xe0\xec\x58\x26\x55\xa6\xca\x92\xa0\x59\x1d\x9c\x14\x42\xfb\x20\x92\x09\x64\x29\x2b\x92\xf2\x23\x81\xeb\xe8\xaf\xfc\xb9\x96\xa6\x1d\x02\x6d\x65\x20\x15\x5a\x5e\x38\x88\x37\x79\x1d\x8a\x29\x96\x24\xe8\xdf\xeb\xe9\x00\x1a\x63\xac\x58\xc2\xea\x6e\x59\x96\xf5\x8a\xa1\xbc\x11\x4d\x42\xa6\xa9\x2d\x20\x10\x50\x3d\xbc\x80\x51\x17\x6a\x2d\x93\x02\x0b\xf2\x8b\x02\x41\x2d\x42\x2d\xc6\x59\x4e\x64\x8b\x84\xa2\x69\x60\xd0\x5a\xeb\x0c\x70\x0a\x97\x85\x42\xc9\x73\x96\x15\xbd\xa1\x6c\xd3\x5a\xdb\x40\x78\x00\x4b\xc8\xc9\x7e\x73\x95\xbb\x84\xa9\xb4\xfa\x5e\x7d\x11\x6c\x17\x60\x8a\x60\x94\x66\x80\x38\x02\xee\xf3\x95\xbc\x54\xa5\xb3\xa0\xd0\x3e\xd5\x2c\x07\x0c\x82\x0a\x7f\x87\x0b\x59\x99\x12\x08\x01\x11\x30\x25\x70\x97\x05\x8d\x08\x59\x24\xc0\x8e\xac\x65\xca\xe5\x23\x2e\x44\x92\xf1\x7a\x13\x08\xb4\x5e\x83\x3d\xfb\xcd\xb6\x0c\x89\x34\x47\xc2\x05\x40\x77\x65\x96\x76\x24\x83\x29\x54\xc6\x74\x81\x72\xb1\xa8\xa1\x60\x3e\x2f\xe0\x0d\x55\x8a\x52\x2b\x5a\x66\xa7\xd0\xe3\xc4\x7a\x71\x07\x11\x0b\x29\x67\x65\x92\x52\x5d\x05\xa0\x2c\xf6\x7e\x00\x4d\x43\x78\xcb\x0d\x1c\x47\xb6\xe0\xf6\x89\x61\x27\x21\xb2\x8b\x26\x61\x3e\xae\x88\xe1\x5e\x97\x31\xe2\x4e\xd0\x37\x6c\x16\xef\xc6\x30\x9b\xd0\xdc\x85\x4e\x85\xd9\x89\x29\x68\x29\xb1\xa8\x6a\x2d\x81\x8e\x0b\xf0\x35\x90\x9e\x95\xe8\x1b\x2b\x42\xee\xc0\xca\x3b\x3d\xde\x13\x79\x9d\xc4\xe2\x4c\x5d\x5e\x26\x59\x09\x15\xf7\x57\x39\xa1\x20\x41\x91\x12\x76\x8b\x84\x00\xc9\xf7\xac\x90\xb1\x0a\x33\x97\x94\x88\xd5\xa8\xa7\xe6\x28\x3c\x74\x32\xf3\x0f\xcd\xac\x81\x92\x13\xbd\xf3\x01\xbc\xfc\xc3\xd9\x50\xec\x4d\x7b\x3f\xec\x07\xc4\x55\x13\x3b\x14\x7a\x48\xd8\x07\x20\xb6\x6a\x35\x57\x45\x79\x95\xac\xb9\x9d\x1f\xce\x86\x07\x27\xd1\x3b\x28\x1f\x42\xa8\xec\x12\x89\x7d\xa8\xfc\xc6\xa8\x68\x83\x98\xdd\x56\xef\x80\x7b\x7f\x93\x95\x7a\x29\x5f\x19\xb4\x06\x22\xbd\xa1\xb0\x52\x92\x21\x56\x14\x64\x8c\x15\x00\xef\x8b\x09\xde\xd9\x81\xfb\x2b\x9b\x22\x5b\x6a\xfd\x96\xc5\xa9\x32\xc4\x57\x58\x98\xd4\x05\x2b\x14\x18\xd8\xdf\xa4\x42\x8a\xaa\xfe\xc9\xc1\x64\x7c\x16\xc0\x70\xe8\x70\x70\x08\x60\xf4\x13\xf3\x3c\xff\x18\x88\x55\x52\x14\x7c\xa0\xe4\x8b\xda\x1c\x1a\x96\x52\xf9\x26\x13\x37\x6a\x2e\x4a\xb8\x61\x26\xd4\x9a\xa4\x62\xba\x6b\x22\xef\x23\x6c\xac\x52\x69\xc3\xbc\x0a\x77\x5a\xc2\x60\xfe\x53\xcc\xd4\xe2\x2a\xcb\xd3\xfc\x52\xef\x87\x61\x15\x87\x3b\x47\x2f\x5f\x7e\x77\x70\xf8\xec\xe0\xe8\x08\x16\xfc\x38\x3c\xdc\x19\xf0\xf4\xcb\xb9\xcc\xe2\x1c\xbf\xe5\x83\x3b\x95\x74\x1a\xeb\xe7\xc5\x5e\xb7\x48\xec\x07\x84\x8c\x00\x6b\xe8\x70\x1f\x9b\x17\x3d\xdc\x7c\xe3\x68\xe1\x3f\xc1\xb9\xf0\x26\x85\xf0\xef\xf9\xa8\x6f\xa0\x73\x5b\x11\x21\x07\xe8\x04\x45\x04\x3e\xb6\xc8\x57\x8c\x88\xe7\x82\x27\xe4\x85\x0d\x4e\x01\x42\x89\x7b\x20\xe9\x31\xd3\x39\xf4\x65\x33\x7a\x7c\x78\x78\xa8\x67\xf4\xf0\xd9\xef\x5e\x8e\xb6\xff\xc7\xc3\x93\xde\xf9\xc1\x71\x78\xf4\x8b\xb9\x00\xf7\xd9\xff\xc7\xcf\x9b\xf6\xff\xf1\xe1\x8b\xa7\xbf\xdb\xff\xbf\xc6\x8f\x36\xe1\xc6\x6b\x95\x69\x21\x68\xc4\x26\xcc\xc9\x72\x1c\x1e\x05\xe2\xf8\xa5\x38\x55\xf3\xa2\xd6\x06\x97\xde\x42\x3b\xde\xcd\xc1\xcb\x03\xfd\xbb\x40\x78\xcd\xb9\x55\xb0\x13\x15\xdf\xe4\x79\x2c\xfa\x40\xba\xdd\x97\x69\xb2\xcc\x8b\x2c\x91\x81\xb8\x98\xf6\x42\xd1\x4b\x53\x31\x41\xcd\x35\x01\x34\x18\x15\x87\x3b\x13\xd5\x44\x06\xf3\x82\x2b\x1e\xfa\x8b\x2c\xcb\x7c\x91\xc0\xd9\xe6\xab\xa5\xbd\x5d\x8e\x30\xed\xee\x07\x06\x5f\x94\x6d\x6c\x37\x7a\x12\x20\xca\xac\xf1\x00\xda\x50\xda\xf6\x36\xa2\x81\xe3\xb3\x52\xd5\x2b\xca\x37\xf5\x3b\x5d\x22\xe6\x8c\x3d\x5e\x00\x61\xba\x50\x84\x5b\xc6\x33\xe8\x18\x0f\x78\xf0\x11\xb0\x5d\xb3\x31\xa2\x52\x2d\x73\xd6\xb6\x4d\x0a\x1d\x1e\x3b\xa7\x9e\x36\x1b\xd0\x27\xad\x45\xb0\xe7\xde\x30\xb1\x49\x65\xf8\x0b\x9a\x9c\x39\x01\xd7\x40\xa3\xfd\xed\x0e\x9f\x50\x0f\xed\xdc\xd8\xca\x5f\x76\xfa\x1a\xa7\xa7\xeb\x08\x59\xdc\x7e\x33\xdd\x06\x2a\xbb\xc5\xee\x40\xe0\x62\x50\xdc\xbf\xcb\x62\x46\xd4\x03\xc0\x9b\x4b\x44\x36\xc0\xb6\x1e\xe7\x05\x5a\xb9\x88\x0a\x64\xaa\x97\xca\x26\x13\x76\x52\xda\x20\x24\xcb\xc5\xba\x48\xb4\x94\x10\xea\x99\x13\x7b\xa4\x23\xb2\x43\xc6\x11\x89\xa9\xfd\x4a\x20\xd6\x78\xc2\x72\xa1\xf6\xd2\xbc\xf2\xdf\xf3\xb5\xca\xd2\x58\xae\xc3\xbc\xb8\xe4\x74\xaa\xf3\x07\x74\x93\x51\x44\xe7\x8a\x39\x16\x9d\xe9\xc8\xf2\x02\x1e\x70\x7e\x85\x9c\xb4\xb4\x1c\x49\x81\x55\xd5\x3f\x6f\xb0\xe6\x97\x50\xb8\x5d\x15\x32\x56\x2b\x69\xb9\xf6\xba\xde\xa1\x8c\xa7\x93\x5a\x69\x3b\x34\x4e\x2a\xae\x46\x9f\x2b\x82\x48\x23\x13\xc1\x2a\xa4\x22\x07\xcc\xdf\xbd\xab\xaa\x5a\xbf\x7a\xfc\xf8\xe6\xe6\x26\x74\xe7\xec\xf1\x3e\x27\xc2\x6c\x51\x3c\x30\x11\x88\x33\xc7\x12\xbc\x15\x3a\x0e\x50\xdb\xe0\x59\x82\x6d\x73\xe0\xda\xc8\x51\x6c\x41\xb6\x7d\x70\xec\x59\x30\x9d\x78\x85\x1a\x6c\x61\xde\xb7\xcd\x37\x00\x96\xb4\x85\x27\x81\xb8\x9b\x86\x4a\xb7\xf9\x56\xb8\x33\x7b\x3b\x98\x1a\x18\x19\x31\x30\xb0\x4e\x80\x54\x33\x7b\x1b\x89\xf1\x79\x34\xc2\x89\x18\x5f\x8c\x4e\x30\x31\x91\x60\x60\x10\xed\x67\x3c\x99\x8a\x1f\x7f\x04\xe0\xa7\x47\x8f\xe0\x4f\xbd\xd1\x87\x4e\x70\x27\x07\xb0\xe9\x57\xc6\x79\x12\x7a\x70\x27\x83\x69\x7f\xd8\x1b\x9c\x45\x27\x3e\x6e\xd2\xf4\x6d\x6f\x38\xdc\x3a\x56\xdd\xfd\xd9\xd4\x1f\xae\x85\x2f\x3a\x25\x7c\xa4\x93\xc1\x24\xea\xcf\xf4\xa8\xec\x7f\x31\x48\x91\x83\x5c\x14\xfd\x10\x9d\x9d\x0f\x01\xbc\x6b\x2b\x72\xd1\xde\x3d\x33\x73\x3e\x19\xf7\x2f\x26\xd1\x99\xee\x3a\xa0\xf5\xbc\x9e\xce\x06\xb3\x8b\x59\x24\xde\x8c\xc7\x27\x80\x24\x84\xe8\x51\xd1\xf4\x7b\x83\x58\x74\x31\x8d\x02\x80\x2b\x82\x0f\x9f\x4f\xc6\xa7\x83\xd9\xf4\x7b\xfd\xdf\xaf\x2f\xa6\x03\x98\x3b\x48\x58\x9f\x5c\x9c\x43\x66\xba\x78\x3b\x7e\x1f\xbd\x8b\x26\x02\x70\xcb\x4e\x60\x92\x61\xe1\x41\x28\xc6\x13\x00\x0a\xd2\x73\x00\x6b\x10\x88\xf7\x6f\x23\x00\x1a\x1a\x8c\x28\x01\x47\x4f\xc1\x74\x36\x19\xf4\x67\xee\x63\xe3\x89\x98\x8d\x27\x33\x17\x66\x69\x14\xbd\x19\x0e\xde\x44\x80\xac\x35\xb1\xd8\x64\xfb\x06\xc1\x69\x30\x22\xac\x90\x0f\x2d\x30\x27\xfd\x9f\x8e\xf8\x5a\x10\xa4\x07\x03\x1c\xfd\x7e\x3b\xf1\x0d\x7f\xc2\xc7\x93\xf3\xe1\xc1\xd1\x2f\x68\xfd\xdf\x63\xff\x1f\x1d\x1e\x1f\x3f\x3b\x6a\xc5\xff\x9f\xff\x9e\xff\xf3\xab\xfc\x4c\xd4\x22\x59\x17\xf9\xe2\x0e\x06\xfd\xa3\xf0\xa8\x01\xb4\x74\x7c\x78\x78\xa4\x0d\xfe\x63\x74\xaf\x13\x7c\xbb\x28\xeb\xa4\x22\x7c\x96\x2e\x7b\x5e\x9c\x4f\xa2\xde\xd9\xeb\x61\x84\xe1\xb3\xf3\x42\xc9\xd5\xbc\x0d\x8e\x1d\xab\x72\x51\x24\x73\x05\x54\xd0\x40\x6d\x22\xa2\xec\x32\x4d\xca\xab\x80\x10\x61\xaa\xba\x50\x58\x30\x98\x55\xc4\xab\xd4\xc9\xee\x6c\xc9\x2a\xaa\xe6\x07\x91\x54\xda\x52\x0c\x37\x28\x23\x90\x41\x96\x03\x78\x4d\xb4\x55\xe0\xc8\x5e\xeb\x0e\x03\xe3\x5c\xba\x11\xf5\x9a\xa8\x04\x3c\x50\x28\x17\x32\x1e\x01\x79\x9d\x5e\x10\x32\x93\xd3\xa6\x47\xbb\x00\x78\xb2\x6b\xf8\x76\x41\x4b\x94\x54\x1b\x40\xf1\x55\x9f\x88\xe4\x7f\x99\x17\x14\x7a\x65\x7a\x02\x46\x44\x6e\xd0\x97\xa8\x86\x21\xe2\xf0\x52\x0c\x89\x93\xe1\x91\xb5\x2e\x03\x02\x2e\x9d\xa2\xdb\xd2\xd7\x6e\xcb\x07\xc3\x28\xc6\x8c\x67\x81\xe1\x40\x70\x19\x45\xb8\xaf\xb2\x02\xca\x03\xb4\xe9\x89\x78\x5d\xa6\xfc\x36\xc4\x9d\x4c\x9c\x0a\x41\x70\xdc\x48\x30\xb3\xc3\x3a\x1d\x20\xbb\xe8\xcc\xa5\x3a\x0d\xc4\x89\xa5\x0d\x79\x9f\x17\x1f\xe9\x2a\x7f\xc2\x1d\xea\x5b\x42\xae\xa5\xa1\xde\x67\x02\x6b\xed\x44\xec\x79\x71\x50\xa6\x4f\x96\xa5\x88\x3e\x55\x2a\x83\x64\x06\xa2\x2e\xd0\x83\x3d\x51\xeb\x34\x87\x70\x29\xfe\x97\x1e\x17\x40\xe6\xd9\xa7\xef\x9b\x72\x58\x40\x4c\x0d\x90\xe5\x55\x42\x8b\x0d\xa5\x9a\x10\xfe\x75\x87\x5c\xa8\x54\x56\xf6\xfe\xcb\x84\x7f\xa9\xa9\xd8\x1a\x9b\x49\x29\x54\x96\xca\xe2\x52\xc5\x26\x5a\x3c\x57\x99\x5a\x26\x08\x0d\x47\xc8\x79\xe1\xce\xc5\x3d\x02\x41\xe6\x2c\xf8\xb2\x32\x14\x27\x4d\x92\x82\xe6\x87\xd5\x27\x09\xd4\x00\xb2\x84\x57\x0d\xd6\xd6\x36\xa0\x34\xe7\x53\x74\x8f\x25\xd3\x1c\x29\x7e\x89\x2d\x81\x69\xcd\x60\xbd\x85\xbc\xbc\x2c\xd4\xa5\xac\xb6\x21\xc6\xbb\x84\xbe\x8c\xba\x0b\x96\x7d\xa9\xc7\x0c\xb8\xdb\x4b\xa0\x70\xad\x04\x83\x43\x18\xa7\x47\x6e\x56\xfc\x21\x26\x4f\xb0\x37\x06\x4b\x85\x19\xcb\xf3\x10\x48\x2f\xbb\x47\xdf\x88\x43\xba\x60\xf0\xc6\x87\x6d\xf0\x87\xb4\x78\xbd\xe6\x86\x1a\x9c\xb8\x51\x0c\xa9\x37\xef\x1c\xd8\x66\xd9\xc6\x5e\x07\xde\x5c\xc9\xaa\xcc\x99\x85\xa7\x20\x6e\x77\xdb\x02\x95\x6a\xd0\x9d\x51\x9a\xf0\x1d\x0f\x39\xe3\x78\x0d\xe6\x90\xf8\x36\x87\x15\xe7\xaa\xcc\x1e\x11\xeb\xb1\x61\xb8\xcc\x0b\x01\xd7\xb3\xa5\xe9\x50\x92\xfd\x54\x23\xfd\x8c\xb9\x2d\x11\x42\x2c\x42\xd1\x87\x4b\x06\x77\x57\x90\x08\xb7\xbf\xf5\x35\x53\xe6\xc7\x65\x50\x64\x3f\xaa\x96\xc6\xd0\x9a\x25\xdb\xb8\xbd\x70\xf6\xb0\xdd\x71\x9d\x0a\xe8\x1e\xe1\x0d\x4c\x44\x03\xf7\xbf\xa7\x95\x10\x24\xdf\x10\x42\x24\x55\x8a\xc1\x75\xa7\x23\xe8\x58\xc2\xce\x31\x69\x43\xad\xb9\x81\xd9\x8c\x43\xd1\x47\x4e\x4c\xa9\x65\x12\x44\xce\xde\x0b\x17\xb6\x56\x94\x69\x5e\xcc\xda\x27\x59\xac\x56\x59\x82\x8f\x59\x21\x70\xd9\x4d\xf4\x0b\xd0\x7f\xa6\x9f\x2e\x1f\xac\x21\xb4\x8c\xb2\x96\xa0\x0e\xb2\xe2\x69\xac\x41\xe7\xd8\xa0\xbf\x0d\xd5\x19\xd0\xd6\x03\xd2\x4f\x29\xb2\x7c\x05\xda\x4e\x8f\x1a\x0e\xcf\x1c\xd0\xa6\x55\x4c\x5d\xce\xcb\xca\x63\x90\x34\x21\xc2\x66\xca\x53\x41\x6c\x79\x77\x3f\x98\x64\xd7\x79\x7a\xad\xc4\xfa\x6a\x53\x82\x3d\xb3\x52\x71\x22\x59\x07\x9c\x59\x1a\x2b\x05\xbc\xc4\x78\xe5\xa2\x0e\xd4\x27\x8c\x11\x74\x91\x51\xd3\x29\x6d\xfe\x9d\x17\xf6\xe0\x55\x9f\x2a\xcb\xe0\xdb\xb5\xf0\x8b\x50\xf4\x4a\x48\xcd\xb3\x5c\x1e\x4c\xd9\x21\x2f\x65\x92\x95\x0d\xbd\x91\x17\xb6\xbc\x1f\x6a\x51\xb4\xa4\x00\x1a\x38\xde\x33\xd2\x9d\xd4\x8d\xb4\xd9\x6b\x14\xef\x33\x37\x9f\x48\xbe\xc7\xfb\x60\xe3\x32\x03\xb7\x77\x6e\x5e\x58\x0e\x75\xc8\xc5\xc8\x97\xfc\x0d\x08\x2d\xde\xbb\x85\x58\x02\xac\x21\xd0\xfd\xa1\x2e\x0e\x9e\x6e\xea\x36\xde\x31\x13\xc5\x90\xfe\x7e\xb2\x04\x6a\xb1\xf9\x06\x73\x20\x4c\xd0\x17\x62\x63\xc8\xf9\xe2\x72\x16\x59\xf5\x52\x98\xf6\x9c\xd9\x86\x92\x2a\x67\xc2\x79\xf0\x0b\xb9\x96\x0b\xda\x76\xa6\x05\x34\x9d\x78\x6a\xf2\x25\xd9\x97\x1c\xb4\xd6\x02\x38\xdf\x88\xeb\xa4\xa8\xea\xb6\x19\xfb\xb0\x3d\x59\x97\x66\x43\x9e\xb0\x72\x6a\x59\x4c\x8e\xb6\xdc\x36\xdd\xf6\xf6\xdf\x1a\xdb\x6c\xd0\xa2\x44\x07\x4e\x8a\x78\xd9\xfc\x13\x87\x83\x63\xb8\xfd\x77\xff\x46\x14\x8b\x7e\x2c\x18\x03\xda\x18\x9d\x44\xba\xa0\xac\xa5\x44\x80\x5e\x5e\xab\x04\xd8\x35\x88\x6d\xab\xb5\x6a\x2c\x76\xfb\x6f\x7b\xa3\x37\xd1\x74\xd7\x43\x35\x75\x18\xa7\x9b\x83\xd3\x4d\x35\xd4\x8e\xd9\xe2\x5d\x67\x08\x9f\xf0\xf7\x1d\x22\xd8\xbd\x64\x05\xfc\x45\x64\xd8\x5d\x27\x52\x9b\x30\x91\xc5\xe3\x3c\x71\x15\xce\x99\xa1\xbe\x46\x2e\xcf\x52\x9c\xce\xce\xb5\xd0\xbc\x9d\xcd\xce\x45\x9c\xdf\x64\x69\x2e\x63\xd6\x05\xa3\xbc\xb2\x7c\x68\x2c\x83\x4b\xd7\x78\x34\xbb\xb8\xa1\x7f\x9b\x06\x6a\x57\x57\x71\x86\xe9\x92\x9c\x68\x42\x08\xb0\x57\x8a\x79\x91\xa8\x25\x79\x65\x6b\x37\xcb\xd4\x55\xdd\x1c\xae\xd7\xa7\x1a\x40\xf9\xc2\xb1\x57\x97\xcc\x06\xaa\xf5\x55\x51\x5b\xda\x35\xc2\x2e\x95\x0b\xb0\xd4\x3b\x97\x7c\x59\x83\xe8\xd5\x6b\x2d\x4a\x25\xef\xed\x37\xfa\xe8\x73\x6c\x1d\xe2\xd3\xf3\x8f\x6f\xe0\xcc\x4c\xe3\x83\x9b\x24\x56\x01\xa4\x11\x10\xda\xf1\xb5\x0a\x7c\xa2\x2c\x0e\xae\x5a\x3e\x28\xed\x56\x82\x4f\xa0\xfd\x95\xe6\xad\x7a\x7e\x93\x61\xc6\x15\x54\x00\xe7\x10\x79\x9f\x6f\x40\x26\x50\x59\x06\xf6\x36\x05\xd8\xed\xd6\xa9\xdc\x04\x9c\x01\xd5\x4d\x5f\xd9\x60\x76\x6d\x9d\x8a\x8e\x52\xdd\x82\x46\xed\xea\x0a\xa2\x27\x40\xec\x6f\xbc\x92\x3a\xe4\xdc\xe3\xef\x01\xf5\x3b\x59\xb0\xb0\xfc\x57\x71\xe2\xf0\xbc\xe3\xf6\xdc\x1a\x0f\x10\x36\xcf\xe4\x48\xec\xed\xd2\x6f\x77\xf7\x5d\xd6\x11\x4a\x44\x40\x3b\xdc\xd8\xd2\x48\x4e\x28\x4b\x71\xa3\xd2\x14\xec\xfc\x6c\x63\x16\x8e\x96\x17\x38\xff\x24\xb8\xf4\x90\x27\x46\x59\x09\x78\x7d\x26\x93\xd8\x6b\x16\x1b\x74\x2f\xf6\xd0\x9f\x27\xb2\xeb\x2d\x1c\xba\x0e\xb5\xb2\x63\x7e\x36\x28\x7f\x78\x60\x79\xb1\xbb\x0f\x8a\x92\x50\x9b\x17\xa9\xbb\xdd\x1d\xb7\x43\xc2\xd6\x5c\x28\xb1\x87\xd4\x80\x72\x89\xd5\xa6\xe0\x49\xee\x37\xcd\x3b\x6d\xb1\x21\xa3\x09\x31\x3a\x4a\xbe\x34\xa3\x8c\xac\x6e\x80\xf2\x6d\xbe\x64\xaf\xc4\xfb\x2e\x4e\xb8\x70\x03\x0e\x1c\x67\x60\x8a\x5d\xbd\x6c\xbb\xce\x81\xb5\x4b\x0c\xcb\x48\x9d\x55\x94\x78\x1d\xa1\xb2\x2a\xa1\xe4\x35\x4e\x15\x62\x69\x67\x52\x2c\x3c\x38\xe0\xaf\xa4\x0c\xb4\x96\x63\x81\x0d\xcd\xe7\x8e\xc5\x2e\xea\x49\xfe\x12\xef\x90\xa9\x2a\xf4\x3e\xb4\x7b\xa0\x41\x0f\xda\x61\x6b\x58\xc3\xd0\xd8\xac\x08\x68\x28\x53\x88\x2f\xc9\x42\xab\x50\xbc\x57\x3c\x87\xc1\xc8\x54\x3b\x6e\x81\xab\xda\xca\x8e\xea\xb3\xc0\x13\x46\xd3\x66\xd7\x6a\xe4\xcb\x8e\x9e\xe9\x16\x93\x0c\x7b\x34\xaf\xcb\x04\xf2\x53\xc0\x3e\xb8\x94\x59\xf2\x17\x9a\x22\xbf\xfb\xf7\x74\xd8\xee\x13\xac\xb0\x75\x59\xf8\xec\xa4\xb5\x38\x4c\xb7\xf5\xd0\xaa\xa7\xa6\x79\xe7\x5a\x6b\xb0\xfd\xb2\x4c\x15\x76\xfd\x9e\xe8\xf5\xf3\xc3\x2b\xbb\xba\x57\x9d\x12\x07\x21\x31\x8c\x9e\xa0\xd4\x5e\x84\xd3\xd0\xd9\x5e\xa9\xbc\xb1\x2d\x3f\x15\xbb\xf7\x9e\x8a\x46\x3c\xc5\xca\x1c\x94\x86\xb2\x85\x31\x1c\x4c\x56\xb1\x8d\x0e\x20\x4f\x01\xf1\x99\x43\x8d\xb6\x93\x16\xec\x60\x63\x23\xc0\x2c\x92\x19\x41\x0e\x23\x9f\xc2\x7c\xf2\xe2\xd6\x95\x19\x1f\xcb\x36\xcf\xcb\xf1\x29\x6c\xdf\x12\x57\x51\x40\x94\x2b\x61\xee\x75\x18\xf3\x33\xb1\x6b\x95\xba\xbb\xf7\xee\x8d\x68\x81\xc4\xb4\x03\x5a\x40\xbf\x97\x5b\x1a\x54\x18\xfc\xd2\xcb\xbf\x72\x89\xb9\xa0\x13\xcf\x85\xd1\xdb\xbc\x27\xef\xd4\xf9\xf6\xcd\x17\xe6\x4d\x2b\x5a\xee\x28\x8c\xb8\xa5\xfc\xd4\xba\x2e\xca\x1a\x11\x28\x1b\x5a\xab\xc3\x2c\x4b\xcb\xdc\xee\x52\xbd\x13\xd7\x85\xba\x4e\xf2\xda\x0d\xc4\xf1\x82\x6c\x5c\xb3\xdb\x35\xd2\x21\xf6\x64\xbb\xfc\x9d\xb0\xba\xdc\x8c\xb6\x43\xe5\x93\xe3\x63\x3a\xc3\x9f\x4e\x37\x40\x98\xbd\xed\x2c\xc9\xed\x19\xd5\x75\xf1\xbb\xfd\x84\xe6\xfe\xbd\x14\xbb\xde\xda\xbb\xd3\xc9\xc5\x55\xa0\x34\xd9\xeb\xb4\x93\x00\x22\x5f\xcf\x4b\x62\x1b\x2e\x04\x1a\x57\x64\xa9\xef\x25\xfb\x42\xa2\x9d\x6c\xce\xe0\xb2\xca\x0b\xaa\xaf\xe5\x93\xab\xdb\x29\xdf\x4b\x12\xa4\x11\xc8\xd4\x8d\x69\x83\xdf\x36\x24\xae\xda\xff\x34\xec\x99\x9d\x7a\x87\x1b\xa3\xd6\x9a\x2d\xe1\x59\x5c\x28\xa2\xd7\xf3\xfc\x2e\x00\x7f\x2f\xfd\x98\xe7\xb2\xce\xc0\x78\x94\x6c\xe5\x76\x08\x51\x25\x8a\x3a\x83\xab\x7c\x7b\xe4\x1d\x8a\x5d\x3c\x9f\x5d\x11\x20\xd3\xd6\x4b\x58\x8c\x7e\x78\x3b\x78\x3d\x98\x89\x9e\xf3\xf2\x91\xd8\x75\x75\x33\x37\x41\x39\x48\x9d\xaa\x56\x66\xa0\xab\xaf\x93\x58\x9b\x8f\x65\x9e\x82\x99\x9d\x17\x42\x8b\x80\xfe\x3f\xe4\x8c\x85\x36\x03\xb1\x86\xbd\xae\xba\x92\x5d\x29\xa6\x58\x86\xa2\xe7\x36\xf9\xe8\x8e\xcf\x27\x99\xfb\x15\xe3\x87\x82\xc1\x25\xf2\xe5\x32\x59\xa8\x22\x60\xac\x7f\x15\x50\xbe\x6f\x00\x91\x22\xbe\xcd\x40\x86\xde\x45\x85\x01\x05\x79\x69\x22\xa4\xcc\x81\x46\x04\x79\x5b\x4e\xba\x3d\x67\x04\x79\xd1\x18\xd3\xbe\xa5\x75\x83\xf2\x80\x25\xf4\xcd\x9d\x61\x67\xee\x8f\xc5\x6e\x87\xd6\x73\xf7\x88\xf6\x06\x03\xa7\x88\x0f\xfd\x13\xf8\x8f\x2b\xb5\x92\x81\x25\x7a\x44\xc5\x98\x18\x58\x49\x30\xdd\xb1\xa0\x3c\x68\x9a\xa9\x6c\xf5\xd0\xb1\x49\xc4\x7a\xee\x2d\x07\xe4\x81\xb8\xe7\xa8\x9e\x9f\x6b\x05\x62\x5d\x7e\x4c\x52\xa0\x09\x2c\x6b\x38\x03\x96\x75\x0a\xe9\xcd\x65\x25\x53\xcc\x69\x2e\xea\xac\x3b\x0c\xca\xdb\xb2\x1d\x50\x0c\x88\xa3\xb5\xd9\x0c\x3c\xd9\x3c\x2f\x9c\x29\x7c\xa2\xa7\x10\x4d\x0d\x9e\xb7\x24\xbb\x56\x65\x95\x30\x63\x34\x44\x46\x14\x42\x31\xe3\xaf\xf8\xa4\x74\x08\x5d\x41\xa1\x69\x55\xd3\x0c\x0a\xe8\x7e\x80\x25\xd5\xbc\xf0\x6a\x38\xdc\xfa\x81\x75\x5e\x51\x55\x42\x5d\x2a\xb7\x93\x4f\xc5\x2e\xd8\x83\x8e\x91\x18\xab\x34\xb9\x56\x45\x77\x6b\x8f\xdb\x81\x43\x20\x76\x87\x97\x49\x52\x57\xeb\x5a\x1b\xe1\x99\xaa\x20\x84\x5d\x51\x12\x3a\x31\x85\xf0\xdf\x31\xfe\xc9\xfb\x0c\xee\x49\xdc\xfb\xa1\x87\x7e\xdd\x19\xcb\x33\xb1\xdb\x75\x36\x9a\x0e\x3d\xd0\x35\x7a\x80\x4b\x84\x27\x7f\xdb\x27\xb2\xe2\xea\x06\x44\x8c\x61\x32\xdf\x18\x3f\xc4\xe9\xf6\x73\xdd\x6d\xe3\x7b\xbb\x8a\x72\x5d\xa8\xa5\x2a\x0a\xbc\x55\x5a\x21\xd9\x0a\x32\x65\xac\xbc\xa8\xd2\xd6\x60\x52\xf7\x94\x79\x65\x2d\x69\xaa\x1b\xab\x19\x63\x18\x15\x72\x85\xce\x54\x80\x70\xef\x70\x22\xda\xfc\x4e\xdc\xf8\x5d\xbb\x9b\xf7\x34\xa9\x02\x93\x0c\xc8\x5b\x1e\x73\xd8\x4d\x16\x22\xef\x28\xd7\x91\xb1\x45\xb0\x3c\xbd\x76\xb5\x16\xd6\xfa\xfa\x32\x6d\x30\xaf\x93\x34\x16\x52\xef\xda\xcc\x25\xfe\xdc\xba\x6d\xee\x14\xb3\x17\x62\xf7\x43\x5e\xef\xea\x87\xf4\x7f\x38\x9e\x9c\x7b\xf6\x40\x35\x0d\x5d\x63\xa3\x53\x47\xd4\xf6\x50\xaa\xe3\xdf\x0f\xbb\xd6\xd9\x69\x5e\xb8\xaf\x01\x0c\x64\xf3\x7b\xd6\x54\xcb\x36\xd6\x65\xd4\xa2\x47\x33\x5d\x06\xc8\x41\xe9\x04\x49\x40\x8b\x25\xfc\x4d\x7d\x2a\xd0\xfd\x9d\x5e\x18\xed\x46\xc1\x85\x32\x5b\xd7\xbb\xf4\x17\x1e\xdb\x9e\xdc\xa7\x5a\x9d\x1b\x00\x30\x6b\x79\x46\x50\xc8\x87\xf5\x83\x18\x8b\xa2\xe2\x2f\xf2\x6c\x24\xb3\xe1\x53\x7d\x0f\x76\x1a\xbe\x66\x69\xec\xf1\xe8\xf3\x8c\x11\x34\x63\xe6\xfb\x10\xf9\x31\xb5\x31\xcb\x64\x59\x81\xd7\xbc\xd0\x6d\xee\x3d\x3b\xfc\x2f\xfb\x46\xbd\x30\x3f\x58\x5d\x19\x9d\x59\x5e\xc9\x02\xf7\x33\x5e\xca\xe2\xf1\xe8\x36\xe8\xf4\x89\x32\x77\x0f\x45\x0f\x81\xdd\xf4\xd6\x1f\x2f\xed\xfa\xf0\xad\xbb\x3e\x46\xdd\x9b\x77\x74\x89\x7c\x2b\x15\x4b\x31\x0d\xdf\x2b\x10\xaa\x26\x97\x60\xf1\x54\x81\xb8\xc2\xec\x08\xfd\x6b\xa0\xa3\x55\x69\xa9\xf0\xd6\x0d\x6b\xef\xfd\x8a\x7b\x70\xdd\xb5\xf1\x1c\x38\xba\xc5\x46\xb4\xf2\x82\x8e\xce\x26\x59\x27\x85\xe0\x3d\x1b\xb9\x1d\x55\x75\x8e\x5d\xe9\xda\xf7\x21\x51\xd4\xc9\x85\x4d\xb6\x5e\x17\xf9\x55\x32\x4f\xe8\xf1\x54\xde\x08\x62\x2d\x8a\x73\x8c\x03\xb5\x67\x02\x9a\x01\xb2\x0e\x15\x10\x29\x9c\xd6\x68\x7c\x47\x8a\x6b\xe6\x7c\xe6\x03\x41\x9b\x42\x1e\x03\xec\x44\x69\x57\xa3\x19\x7e\x37\x41\x65\xa8\x1a\x04\x31\x43\x1e\xbc\x79\x5e\x67\x31\xb3\xed\xeb\x53\xb0\x8b\x54\x37\x14\x83\x53\xa0\x17\x3c\x19\x43\xda\x20\x90\x3d\x12\x67\x20\xa5\x38\x76\xf1\xf8\x99\x44\x3a\x0e\xf8\xd1\xeb\x90\x34\x88\x2c\x8f\x81\xe8\x4f\xa2\xde\x2c\x12\x27\xd1\x64\xf0\xae\x37\x1b\xbc\x8b\xa6\x90\xce\xd7\x20\x7d\xe4\x54\x3c\xe8\xc9\x60\x26\x06\x53\x31\x38\xc3\xf4\x3b\xca\x96\xd4\xdd\x9b\x8d\x45\x7f\x7c\x76\x3e\xfc\xf0\x15\x7d\x9b\xbd\x8d\x46\xd0\x48\xbf\x37\xfa\xd9\xbd\xc4\x44\xf0\x43\x8a\x04\xdb\x93\x5a\x9c\x6a\xd7\xc8\x9c\x6f\x62\x5a\xcf\x21\x77\x98\x0e\xa7\x4e\x42\xe3\xd6\xa5\x94\x09\xd3\x51\x89\x15\x6d\x07\xd8\x74\x5e\x50\xd9\x8d\x22\x37\x42\xcc\xc2\x84\x76\x4b\xdb\x05\x27\xcf\xe6\xae\x08\x73\x40\x8c\x77\xcd\x48\x4d\xd7\x1b\x74\x1b\xd8\x48\x13\x7f\xd8\x15\x1a\xa8\xcb\x38\xf7\x33\xf7\x39\x54\xf8\x24\x3c\xc2\x58\x94\x13\xcb\xe6\x7d\xde\x8e\x69\x3b\x71\xbc\x46\x28\xfb\x41\xf7\x2f\xa6\xf8\xaf\x71\xef\xb2\xe2\xa4\x90\xae\x33\x39\x34\x3d\x3d\xe6\x6c\x83\xa6\x21\x2c\xf6\x20\x42\x22\x2b\x58\xf9\x87\x04\xa8\xf6\xb7\x7b\x75\x71\x4c\x34\xfc\xc6\x17\x77\x11\x3f\xb6\xbb\xe2\x10\xba\xee\xbe\xe0\x85\xde\x3f\x11\x78\xb7\x47\x4b\x99\x2f\x0d\x6f\x7d\x96\xdf\x90\x27\xa7\x30\xa4\xbc\xe5\xea\x81\xe5\x2a\x60\xba\xfe\x00\x35\x35\x28\xfc\x95\xa4\x52\xbd\xc7\x9e\x83\x8d\x88\x84\x5b\xbc\xc8\x8e\x7b\x5d\xcc\x52\x21\x67\xd6\xaf\x97\x87\x09\xc6\x84\x75\x7d\xfa\x43\xe5\x2a\x80\x63\x72\x6d\x36\x94\x62\xc0\xd2\x51\x14\xf2\x17\xea\xa3\x9d\xd3\xa7\x76\x13\x23\xb1\x34\x45\x68\x70\x9d\x2b\x13\xb7\xe9\xe4\x9b\xf7\x02\xbb\x4e\xf6\xd0\x52\x81\xcf\x53\x06\xcc\xca\x6e\x7c\x33\xed\x67\xc3\x7d\x0a\x58\x4a\x1c\xa7\x28\x03\x61\xe3\xb4\x44\xfd\x49\xe1\xcb\xc6\x85\x9d\x31\x2e\xaf\xa4\xb6\x3e\x54\x91\x94\x55\xb2\x28\x43\x31\x4b\xaa\x54\xdb\x1f\xc6\x4e\x70\x35\xc4\x9d\xb7\x54\x49\xc6\x88\x36\xdd\xea\xa0\xbc\xd2\x07\x52\xa1\xb4\x77\xa1\x1f\x76\x6f\xd3\xf4\x2a\xe8\xa3\xca\xbd\xda\xa6\xca\x94\x6d\x2a\xd7\x3b\xae\x5f\x6f\x3c\x2a\x1b\x2e\xb1\x2e\x72\x2c\x5e\x80\xce\x4d\xc9\x34\x7b\x2e\xe6\x2a\xcd\x6f\x02\xc4\x8d\x73\xa3\x7a\xdf\x5a\xfb\xc2\x3e\x74\x3e\xf0\x8f\xa0\x85\x9f\x7e\x23\x2d\xdc\xb0\xb4\xf0\x4e\x06\x95\x07\x6c\x5a\x77\xde\x3b\x37\xff\xd7\x28\x68\x83\x53\x01\x9e\x96\xa8\x33\xc2\x17\x8e\xc5\x5c\x96\x18\xa4\x92\xa5\x89\x1e\x6e\x0b\x62\x3c\x0d\x8f\x7f\xb6\x82\x74\x86\xf7\x95\x3a\xd2\x99\xbc\xbf\x3f\xe5\xe8\x0b\xf5\xdd\x5d\xa5\x02\xac\x43\x11\x31\xf7\x6f\xe9\x1a\x4d\x0a\xf7\x37\x24\x1b\x5c\x61\x0a\x59\xc3\x9d\x00\xbd\x31\xd7\x26\xbe\x5a\xa1\xd7\x01\x3b\x14\x21\xb1\x6c\x1a\x0f\xd7\x82\x21\x87\xcb\x86\xf7\x14\xad\x5c\x80\x0f\x88\x52\x2d\x0a\x55\x95\x3e\x76\x46\xf7\x1e\x33\x1a\x87\xc2\x92\x8d\x3b\x00\x44\xa9\xd3\x02\x65\x13\x7d\x08\x95\x05\xe3\x08\x06\xba\xa5\xeb\x11\xab\x90\x4a\xf1\x04\x36\xcf\x53\xad\x52\x0c\x74\x04\x2c\x25\x8f\x81\xde\xf6\x40\x57\xf4\xde\xe6\x64\x45\xfe\x5e\xd3\xc8\xc1\x32\x34\x4c\x76\xe0\xe0\xbe\x1e\x21\xb6\x4e\x3b\x97\xa2\xfb\xdb\x52\xba\xc8\xc5\x06\x65\xa9\xdb\xc3\xb9\xd7\x2a\xbc\x2a\x41\x00\xa1\xf2\xb2\x50\x58\x9f\x37\xca\xe9\xc4\x4b\x6c\x2a\x25\x9b\xc2\x66\x81\xee\x9d\x59\x17\x55\x03\xdf\xb0\x39\x42\xf6\xfa\xad\x6d\xe1\xdc\x2f\x43\xc4\xf7\xa3\xa8\x5f\xec\xd4\xd9\xee\xc0\x5c\xd8\x43\x14\xb5\xa7\x3d\x91\xd1\x9e\xb7\xb5\x91\xd6\x1b\xdb\x60\xa5\x2d\xec\x3e\x3b\x38\xb3\x79\x1c\xd8\x0d\x69\x8d\x82\xd4\xbf\x9e\x79\x16\x1e\xc1\x9e\xb4\xd2\x22\x17\x1f\xb3\xfc\x26\x55\xf1\x25\x15\x1c\x6b\x67\x8f\xb6\x78\x5a\x5d\xe5\xf5\xe5\x95\x9f\x96\xd2\x3a\xd4\xe8\x34\xab\xae\x94\x5d\x70\x5c\x91\xc4\x00\xbd\x69\x15\x68\xb6\xed\xd6\xf0\x50\xa9\x20\xf7\xb1\xba\x12\x1c\x27\xcb\x00\x9c\xb3\x86\x34\x36\xe3\x25\x63\x96\xac\x63\x24\x76\x2d\xf1\x3d\x89\xc0\xe0\x51\x27\xd9\xb2\x48\xb2\x4b\x0c\xad\x90\xcc\x1a\xc3\xe5\xee\x84\x99\xa5\xb3\xb9\x29\xc0\x71\xcf\x34\x71\xf9\x70\x23\x7b\x19\x53\x99\x20\x06\x49\x87\xc1\xbc\xd0\x93\x5e\xe1\xb5\x8b\xff\x0d\x5b\x4b\xc1\x5d\xe7\xe8\xcf\xdd\xbd\x75\xe4\x04\xb2\x2b\xa4\x75\x16\x31\x01\xd5\x44\xd0\x9c\x44\x65\x8c\x83\xd3\x82\xba\x8a\x00\x44\x16\xeb\x24\x18\xb1\x03\xa1\x8c\x60\xb3\xea\x15\xcf\x33\x83\x3c\xa3\xad\x14\xb5\xc0\xb8\xfa\xdd\xda\x90\x3e\x9b\x29\x15\x03\xe6\x13\x4c\x31\x06\xee\x0c\x40\xa0\xfe\xa5\x67\xbc\xf8\x9a\x06\xf1\xb5\x9c\xe0\x91\xb6\x3d\xf8\x10\x8a\xef\xc9\xfa\x0f\x00\xe2\xa4\xa4\xec\xcd\xd6\x28\x6c\x4e\x97\xb4\xdf\x9b\x43\xec\xc5\x49\x57\xa0\x29\xec\xf6\x8d\x9e\x87\x87\xd8\xfa\xd8\xc9\x56\xee\x65\x31\x1e\x50\x25\x14\x51\x40\xe6\x78\xac\x0a\xb6\x33\xc9\x66\x23\x7b\x04\xb5\xb4\xbb\x78\x81\xbf\xf1\x1c\x95\xf8\x01\x70\x26\x5b\x49\xa6\xee\xb2\x39\x7b\xfd\x67\x5c\xd9\xfb\xd5\x26\x9d\x25\x26\x14\x43\xcb\x89\x42\x5f\xeb\xfb\x0f\x48\x4b\x63\xcc\x39\x7d\xda\xe4\xd7\xaa\xc8\x2c\x8f\x7c\x77\x5a\xa8\x03\x06\xd6\x95\xf8\xc2\x56\xf8\xd3\x50\xf4\x7c\x13\xf1\x0b\x7a\x03\xf9\x9b\x73\x65\xad\xca\xfb\xca\x3e\x10\xe4\x09\x53\xfb\x9a\x90\x9d\x16\x13\x93\x60\x85\xb0\x31\xee\xe8\x8b\xd0\x5d\x13\x3c\xfd\x9c\xc8\xca\x37\xce\x05\xc4\x2b\x96\x3b\x77\xa0\xee\x4d\x7e\x93\x39\x36\xe7\x97\x65\x01\xb6\x03\xa6\x5f\x9d\x19\xd8\x5a\x43\x93\xe8\xab\x1b\xa1\x7c\x55\x58\x2c\x3a\xf8\x38\x59\x93\x32\x35\xcb\x9c\xc0\xdb\x0a\x25\xe3\x04\x92\xaa\x09\xec\xcc\xa9\x44\x07\x1a\x23\xdf\x28\xb1\xc7\x87\xf3\x6d\x9b\x76\x14\x9a\xdc\x64\x93\x5f\xda\x00\xac\x30\x09\x15\xda\xdf\x86\x42\x25\x8f\xa6\xbf\x31\x22\x3b\x1b\x14\x08\x87\x8d\x49\xe5\x01\xf9\x72\x89\xfd\x4b\x56\x60\x1d\xe3\x25\x31\x08\x61\x46\x29\x1e\x4e\x3d\x59\xe1\x7a\x2d\xf7\x5d\xc8\xe0\xe5\x45\x55\xb6\x76\x09\x12\xd5\x63\xa8\xc1\xc9\xa9\xb7\x80\x72\xdb\x64\x9c\xee\x59\xa1\x5e\x2e\xd1\xda\xe1\x11\x4b\x95\x39\x39\xd8\x16\x79\x1e\x1e\x89\xde\xf6\x24\x5f\x67\x8e\x71\xc1\x39\x4d\xf1\xde\x6c\xd1\xa0\xab\xca\x6e\xfb\x3d\xae\xdc\xa2\x25\x50\xba\x5c\x8f\x0f\x82\x62\x72\xa5\xb0\x88\x82\xab\xc3\x1a\x3e\xa9\x33\xfd\xb6\xec\x8a\xd2\xe3\xb7\x2f\xc2\x43\xb3\xaa\xb1\x8c\xb3\x2b\x97\xdb\x59\x91\x87\xaf\xb3\x93\xf5\xcd\x2a\x4f\xfb\x66\x4e\x4e\x28\x6d\x03\x80\x94\x00\x97\x56\x3f\x4c\x59\xf8\x31\x03\xad\x40\xc4\xc5\xbe\xb3\x44\x37\x38\xcd\xb3\x4b\x9e\x24\xfa\x48\x43\xf6\xf5\x73\x95\xd0\x5a\xb1\x12\xd5\x8d\x4a\xaf\x95\xd8\x3b\x3a\xde\x17\xab\x3c\xab\xae\x4a\x81\x0e\xb0\x49\xbb\x77\x17\x05\xb4\x36\x5c\xf3\x24\xf8\x21\x46\xad\xc0\x9c\x06\x3a\xbc\xa9\x2f\x2a\x2b\xeb\x02\x8f\x66\x1a\x8e\x3b\x81\x3c\x71\x38\x8c\xd2\x19\x07\xbb\x09\xd0\xeb\x7b\xf3\xdd\x93\x12\xef\xb5\x0d\x1a\xa0\x67\xa9\x84\x6e\x89\x11\x44\xc5\xbc\xe2\xa7\x66\xa7\xdc\x7b\x6e\xe7\x10\xe7\x33\x23\x81\x72\x59\x85\x98\x85\x74\x91\x03\xba\x9c\x91\x24\xe3\xda\x06\xab\xee\xaa\x1e\xba\xf3\xb9\x3b\x8a\x87\x60\xff\x1e\x8b\x13\x3f\x7d\xde\xb3\x20\x9c\x0d\x8c\x17\x98\xed\xb2\x8d\x87\x9f\xc8\x10\xe3\xc0\x0c\x02\x0c\x2b\x3d\xac\x5c\xa2\xcb\xf8\xc7\x3a\x0d\xb6\xd4\x4c\x4a\x1a\x17\x36\x95\x7e\x62\x1a\xae\x5a\xdc\xae\x0e\x81\xe9\x6b\x98\x4c\x6e\x95\x88\x83\x79\xb2\xb8\xba\xef\x33\xce\x5c\x21\x0c\x12\x4e\x98\x58\x14\x79\x59\x1e\x40\xba\x02\x70\xc7\x54\xb9\x8f\x79\xe3\x57\x17\xa0\x6c\xa7\xb9\x0d\x52\x82\x17\xc2\x75\x2a\x1d\x67\xd6\xba\xc8\x57\x09\x14\xa6\x1a\xa8\x26\xbb\x49\xfc\xb5\xc2\x4c\x4c\x88\x06\xf2\x45\x35\x16\x1e\xf1\x55\x75\xba\x09\xee\x0a\x13\xba\xc5\x18\x15\xa1\x1d\x35\x7c\x41\x36\x76\x9a\xae\xdc\xf6\x9a\x1e\x48\x0a\xec\xaa\xb2\x80\x7c\x3f\x32\x24\x28\x2f\x8e\x0c\x16\x6b\x5e\xb6\x1b\x6c\xa8\x73\x18\x9c\xa9\x57\xf6\x2b\x7c\x92\xcc\x91\x53\xae\xed\x77\x92\xfb\x40\xf9\xbb\x77\xe1\x5b\x02\x0a\xae\x56\x58\xfd\xfc\x72\xbc\x2f\xab\xc6\x83\x5d\xfc\x44\x0c\x5c\x6b\xf0\x9c\xad\xc1\x33\x59\x55\xaa\x30\x41\x4b\xac\xc1\x9a\x81\x46\x3b\x07\xdf\xab\x0f\xfe\x6a\x28\x06\x4b\x5b\x0c\x66\x83\x09\x68\x47\xb8\x30\xca\x9e\x3e\xbc\x3b\x54\xdd\x74\xe4\xc8\x43\x55\x0f\x2a\xa4\xed\x90\x73\x5b\x62\x65\xaa\xa8\x3a\xb5\x2d\xf8\x54\xa4\x55\x86\xd1\x9b\xde\x70\x17\xc7\xc1\x0b\x4c\xb9\xb6\xe4\xc7\xc7\x14\x38\xd0\xdd\xa6\x04\x22\xfb\x67\x28\x38\x5a\x02\xfd\x14\x30\xfa\x55\x32\x49\x79\x52\x8c\x79\x84\xe0\xbb\x7a\xd2\xc4\xcd\x95\xde\x3a\x39\xc3\x69\x99\x69\xcd\xe7\x00\x7d\x00\x5a\xc4\x09\xd5\xc0\xd1\xe8\x58\xc3\x9e\x0d\xe3\x1c\xdf\xa5\xe9\x7b\xec\xdd\x51\x84\x47\x38\x51\x18\xb8\xd2\x7a\x60\xad\xf7\x33\x89\x20\x88\x8c\x1e\x3f\xf3\x0d\x80\x07\x42\x64\x9b\xf6\xab\xb6\xda\xd8\xc6\xab\x01\xb7\x02\x1a\xad\xf4\x33\x9c\xa7\xab\xd6\xa5\xd8\xe3\x64\xf4\x0c\xca\xbe\x20\x4d\x61\xad\x17\xbe\x48\xb4\x5e\x77\xe1\x58\x41\x90\x33\x75\x53\x5e\x16\x79\xbd\x2e\xf7\xb5\x01\x5f\xe6\x99\x9c\xa7\x1b\xb1\x90\xe9\xa2\x36\x18\x02\x49\x06\xd6\x15\xfa\x35\x98\xbf\x4c\xd5\xfa\x5b\xaa\xdb\xb5\x8a\x82\x90\x80\x5e\x8b\x4c\xdd\x38\xb3\x6a\xa0\x74\x71\xd2\x55\xec\x08\xff\x3c\xf4\x94\x52\xef\x7c\x60\x44\xbf\x71\xef\x4b\x42\x97\x79\x37\x46\x4c\x2b\x8e\xc1\x43\xce\xf1\xda\xdb\xed\x9d\x0f\x76\xf7\xf9\x02\xb9\xb9\x87\xcc\xbd\x80\x13\x59\x03\x09\x02\x23\xc7\x4c\x88\x17\x79\x37\x40\xe0\xf8\x68\xef\x7c\x10\x34\x0e\x17\xab\x85\x01\xa2\xc4\xb2\xbd\xb3\xae\x30\x0b\xef\x0c\x7f\xe1\xd4\x9f\xba\xe7\xbb\x2d\x22\xd5\x9f\x0b\x9c\xa0\x35\x04\xbc\xf2\x66\xce\xfc\xf3\xf0\xc9\x9e\xdc\x47\x38\x3e\xec\xd8\x5c\xa5\x89\xba\x76\xe2\x10\x5b\x9d\x23\x41\x3a\xba\xb0\x09\xd4\x5c\xaf\xc3\x80\x7d\x6e\x61\xaa\xb3\xfd\x6c\x14\x9f\xfc\x6b\xab\x46\x16\x79\x76\xad\x36\x6d\x3d\x62\x15\xe4\x53\x1b\xf5\x18\x11\x82\xa1\xa7\x13\x59\xdf\xce\xd4\xa7\xca\x39\x65\xd9\xb4\x52\xcd\xf0\x05\x0c\xd2\x3f\x4d\xf4\x4b\x8c\x99\x2e\xc1\x6e\xee\xd4\x53\x64\x51\x34\x26\xe8\x01\xc6\x13\x58\x7c\xd7\xa4\x31\xcc\x69\xd5\xe1\xa5\xc1\x61\x47\x49\x01\xdb\x4e\xab\xe6\xe0\xee\xc9\x3c\x47\xa0\x5e\xce\x57\x87\x53\x19\xcc\x12\xcc\x9d\x5f\x6e\x1b\x24\xb8\xcb\xcd\x03\xf9\x2e\x3f\xae\x99\x59\xc8\x0a\x94\xa6\xc7\xad\xe6\x0a\xcc\xb1\x2b\x63\x7a\x11\xc0\x17\x01\xac\xa3\xc3\xf4\xe8\xa8\xd0\x45\x0c\xb6\x87\x57\xe8\xda\x45\x95\x5d\x45\xa7\x3e\x1d\xec\x60\x49\xb1\xc8\x26\x35\xc1\x9a\x60\x35\xa8\x38\x0f\x8a\x5e\x1d\x04\x7b\xcf\x2f\xd4\xdd\x8d\x6b\x78\x0d\x6e\x52\x38\x81\x03\x2c\xd9\xac\x7d\x4a\x82\x72\x76\x1b\x36\x86\xa4\xd1\xdb\x12\x62\x58\xd7\x40\x51\x0b\x36\x5f\x5e\x60\x0d\xc4\x3e\xf9\x14\x12\x83\x29\x37\x0c\x7f\x98\x26\x1f\xe9\xfe\x30\xcd\xf3\x8f\xe0\xe9\x60\x5b\x24\x32\xbe\x7e\x75\xbb\xef\x46\x06\x1c\xb9\xc3\x93\xc3\xda\x8b\x54\xa8\x96\x67\xda\x73\x24\xc7\x91\xe7\xd4\x38\x8d\x90\x46\x0b\x05\x56\xe4\x86\x7e\x5d\x89\xf1\xb6\x72\x62\x43\x53\xc3\x66\x2d\x79\x6c\xb8\x15\x37\xc6\x6b\x55\x2d\x19\x0d\xba\x85\xc1\x7b\xe0\x8b\xab\x8c\xdd\x34\xe4\x7b\xde\x34\x29\xd9\x5a\x35\x20\x5a\x24\xb1\x16\xc0\xe0\xbc\xb7\xc9\xce\xdc\xf0\x4a\xb0\xba\xf2\x96\x82\x30\x29\x1b\x5d\xbe\x77\x91\xf2\xa5\x71\x52\xe8\xfb\x1b\x38\x18\x44\x9d\x31\x98\x49\x73\xe1\xad\xcf\xd1\xea\x91\xb7\x26\xf3\x8d\xde\x40\xac\xd2\x5c\x73\x43\x5b\x17\x02\xcd\x8b\xc0\xb7\x3d\x02\xb7\x30\xae\x34\xa2\x4d\xe5\x8d\x2a\xbb\x4c\x32\xbe\x6f\x73\x4e\xe1\xb9\x82\xb2\x83\x85\xb1\x4b\x62\xf5\x49\x0f\x71\x65\x4f\x92\x67\xa2\x67\x2f\x49\x67\xaa\x58\x95\xd6\x01\x58\x5c\xe5\x39\xda\xc9\x10\xf0\xc3\x95\x6f\xc6\x09\x02\x83\x92\x12\x58\x8c\x94\x07\x40\xa2\x34\x6a\x05\xac\xe2\xef\x0c\x17\x39\x08\x63\xdc\xbb\x38\x17\x65\x8e\xa0\x60\x39\x95\x68\xe4\x37\x99\x98\xab\x2b\x99\xd2\x1d\x85\xd6\x55\x39\xff\xaa\xe5\xd8\xb5\xaf\xe8\x9a\x01\xbe\xa4\x42\x88\x99\x46\x7e\xc1\xd7\x0c\x58\xab\x4e\x98\x45\x5b\xf1\x02\x80\x4c\x81\x35\xb4\xbc\x1b\x90\x9c\x9b\x6c\x62\x11\xc0\x4d\x1e\x44\x6f\xdd\x53\x81\x43\x6e\xf6\xd3\x98\xcf\x5f\x55\x79\x91\xa9\x8d\x5e\x2c\xc8\x11\x28\x39\xe5\x86\x5d\x48\x2d\x1f\x60\xc5\x91\x5e\xb6\xe1\x01\x93\xd4\xcd\xce\xc3\xa2\x2e\x8a\xa6\xab\x8a\xd3\xd8\xca\x6e\x21\xc5\x5c\xd6\x29\x84\x7e\x1e\x3e\x61\x18\x3d\x05\x27\x43\x4f\x96\x95\xd3\xe7\xba\xfd\x65\x9a\x2c\xaa\x52\xbc\xd7\xdb\x7a\x0c\x56\x3c\x09\x4a\x19\x8a\xf7\xb8\x25\xb4\x7b\x8a\xb7\xba\x26\x0e\xe5\xea\x2e\x0f\xfb\x03\x11\xdd\x5a\xe9\x8c\x70\xda\x1b\xda\x8b\xb8\xc6\x44\xf5\x32\x59\x25\xfa\x40\x5b\x24\xc5\xa2\x5e\x61\x16\x62\x20\x96\x50\x59\xdf\x85\x2c\x8b\x0d\xa4\x6e\xfc\xd7\x09\x0d\x3b\x17\x76\x16\x99\xf7\x2a\xcf\x72\x3d\xc3\x9c\x2e\xee\xdb\xc8\x20\x91\xad\x03\xc0\xf8\x3b\x5d\x15\x06\x83\xe5\x1d\xf7\x43\xfa\x7c\x4f\x32\x5c\xf5\x05\xcd\xad\xb5\x17\x3c\x78\x3d\x6f\x2c\x86\x59\xe2\xa6\x48\xbc\x8b\x4b\x12\x43\x3f\x99\xbd\x50\x25\x04\xec\xc8\xa2\xc0\xaf\xc0\x59\x6e\x61\xd9\x64\x65\x22\x9d\x5d\x28\x55\x08\x3f\xd8\xae\xc9\x9f\x6a\xa9\x73\xbe\x06\x8e\xeb\xdc\x66\x88\x48\xa6\x9c\xf0\xf2\x35\x9a\x6a\x80\x88\xa0\x0f\x19\x75\x01\x06\x3d\xeb\x28\xa3\x25\xac\x67\x28\xf1\x29\xaf\xda\xb0\xc6\xe6\xa0\xa1\x24\xa2\xae\xa4\x47\xd3\xe4\x38\x5b\x74\xd9\x64\xc6\xdb\xa3\xaf\x98\x50\xab\x67\x53\x75\xdf\xa1\x38\x16\x64\x7a\x23\x37\xa5\xb7\xc0\x44\x97\xd1\x79\x4d\x21\x2b\x6e\x31\x74\x9a\x28\x73\x47\xff\xeb\xd7\x61\x93\x6f\xcf\xb5\xdb\x0e\xab\xdc\xdd\x5d\x67\x88\x6e\xb1\x94\x60\x22\x13\x5b\xc9\x6f\x33\xc5\x65\x23\xbf\xd4\x09\x0d\x50\xd2\xb9\xbd\x0e\xea\xf2\x16\x4c\xf1\x43\xc7\x66\x21\x4d\xf3\x22\x3c\x6a\x58\xe9\x44\x36\x22\x85\x49\xac\xdb\x72\xd3\x14\x38\x9e\x0e\x1d\x50\x70\x3a\x41\xe4\x0d\xbe\x67\x48\x07\x31\x55\x92\x7b\x05\x4b\xc0\x50\x99\x04\xad\xf1\xb0\xa4\x46\xa3\x21\x0a\x05\x56\x1e\xa8\x07\xa3\x58\x88\x1c\xc7\xda\xed\x7a\x03\xd6\x65\x92\x5d\xa6\x1b\xa3\xcf\x1a\x45\xe3\x81\xbd\x44\xe9\x38\x02\xbd\xf6\x4d\x79\x32\xce\x3d\x46\xa5\x20\x6b\xa8\x9d\x2c\x04\x89\x04\x65\xae\x6d\x51\x53\x7a\x99\x36\xe5\x56\x77\x91\xa3\xf2\x1e\xcc\xb9\x7b\xd6\x90\x7c\x79\xa7\x36\x59\x68\xd0\x6a\x47\xbd\x9c\xa3\xf4\xc0\x01\x30\x14\x4b\x70\xa7\x68\x22\xd3\xd6\x3d\x5c\xd7\x05\x57\x13\xbb\x55\x8b\x32\xfe\xa9\x2e\x4d\x98\x9e\xfc\x12\x8c\x38\xa0\xf1\x9a\x2f\x79\x50\xfa\xb4\x35\x66\x94\xb3\x0f\x21\x6e\x6e\x2c\x79\x93\x49\x85\x72\xbd\x1d\x11\x06\xcf\x1f\x2d\x3a\xf0\xdc\xf9\x90\x48\xde\x0f\x1d\xae\x24\xfd\x75\x66\x78\x0b\xb9\x20\xe4\xa4\x1b\xbd\xfc\x62\x74\x12\x4d\xfc\xca\x11\xc0\xaf\x16\xbb\x80\x54\xbe\x2b\x5e\xf7\xa6\x83\x69\x00\x05\x28\xe3\x8b\x99\x25\x8a\x19\x9f\x02\xdc\xf4\x1f\x07\xa3\x93\x40\x44\x03\x40\xb5\x26\x30\x73\x07\xca\xdc\xc3\x2f\xe7\x36\x00\xa5\x1b\x50\xc3\x03\x17\xb3\x7c\xf6\xb6\x37\x83\xb2\x93\xce\x1e\x9f\x4e\x22\x40\xb2\x3e\x89\x4e\xa3\xfe\x6c\x1a\x38\xf8\xe6\xc3\x28\x10\xa7\x83\xd9\x76\x54\xf3\xf1\x44\x8c\xc6\xa3\x83\xc1\xe8\x74\x32\x18\xbd\x19\x8c\xde\x84\xe2\xf4\x62\x02\x5d\xd6\xff\x03\xed\xbb\x24\x38\x67\xbd\x93\x08\x11\xda\x87\xc3\x2e\x74\x75\x1f\x25\xfd\xae\x8e\x9f\x45\xd1\x6c\x8a\x18\xe6\xd0\xcc\x94\x2a\x79\x46\x1f\xc4\x49\x34\xed\x4f\x06\xe7\x08\x9e\x7e\x2a\xce\xa3\xc9\xe9\x78\x72\xd6\x63\x80\xef\xf3\x68\x42\x53\x34\xed\x0d\x4e\xe0\xfd\xde\x6c\xe0\x60\xb9\x4f\x2f\x06\x06\xdb\xfd\x75\x34\x18\xbd\x11\x1f\xc6\x17\x13\x31\x89\xa6\xe7\xe3\x11\xc3\x78\xf3\xf2\x63\x6d\x0f\x74\x78\x4a\x30\xe1\x38\xd6\xc0\x8c\x6f\x3c\xb1\x60\xf4\x01\x8e\x49\x3f\xe8\x00\xba\x3f\x9a\x8a\xe8\x87\x59\x34\x9a\x42\xc1\x91\x1e\x1a\x3c\x31\x9d\xf5\x46\x27\xbd\x09\xa0\x88\xfb\xdd\xd4\x5f\xdd\x3a\xca\x10\xa6\x2c\x1a\xcd\x06\x93\x48\x4c\x06\xd3\x3f\x8a\xde\x54\xcc\xc6\xf0\xdb\x7f\xb9\xe8\x99\x71\x7a\x13\x73\xba\x5d\x40\x60\x62\x3f\x8c\x2f\x42\x31\x7d\x3b\xbe\x18\x9e\x74\x3c\xa5\xa5\x3e\x22\x09\x1a\xbc\x8b\x18\x32\x5d\x4f\x19\x60\xd1\x7f\x18\x5f\x88\x3d\xfd\xcd\xd1\xd8\x5d\x50\xbd\x1c\x08\x5f\x0f\xb0\xeb\xee\x94\xec\x8b\xde\x74\x7a\x71\x86\xe5\x52\xfd\xf1\x74\xc6\xfb\x62\x14\xf5\xa3\xe9\xb4\x37\xf9\x40\x20\xf3\xb0\x01\x26\xd1\x79\x6f\x30\x41\x71\x98\x4c\x74\x27\xc6\xa3\xd0\x6c\x41\x2e\xec\xf2\x2b\xb9\xc6\x13\xf1\x7e\x30\x1c\x42\x97\xa6\x17\xe7\xe7\xe3\xc9\xcc\x47\x73\x87\x49\x1a\x4c\xa9\x99\xd1\x58\x8c\x5f\x0f\x07\x6f\x10\x94\x7f\x36\x16\x83\xe9\xf4\x22\x12\x17\xe7\x27\xbd\x59\x44\xf3\xeb\xbc\xec\xc8\xc7\xdb\x1e\x6c\x82\x3f\x8e\xc6\xef\x87\xd1\xc9\x1b\x98\xec\x08\x84\x44\xf4\xc7\x27\x20\x94\xef\x06\x93\x8b\xa9\x9e\xb5\x06\x9c\xfc\xeb\x8b\x99\x38\x19\x47\x53\xe8\x24\x49\x96\xdd\x15\xad\x5d\x7c\x3a\x19\x9f\x21\xb8\x7c\x34\x99\x8c\x27\x53\xd3\x74\x34\x0d\xb1\x69\xb3\xb9\x26\xba\x17\x66\x5f\xf6\xc7\x23\xc2\xf0\xd7\x42\x2c\xb4\xa8\x22\x27\x80\xde\xf3\xcd\x0a\xb8\x50\x8f\x86\xe0\xef\x3b\x05\xa6\x77\x31\x7b\x3b\x9e\x0c\xfe\x35\x3a\x11\x5a\x09\xe0\xfc\x45\x3f\xf4\xa3\xf3\x99\xab\x16\x6d\x5f\x40\xd5\xbe\x0c\x0f\xc5\xd0\xa4\x74\xe1\x99\x64\x42\x41\x66\x0d\xfa\x83\x49\xff\xe2\x4c\xef\x8c\x7e\x84\xa5\x7a\xe6\x4f\x18\xc1\x46\x76\x00\x4b\x08\xb0\x1d\xee\x7f\x3f\x70\xa8\x02\x5c\xe8\xff\xc0\x61\x64\xe0\x55\x0c\x9a\x7b\x36\x10\x86\x79\x61\xca\xbf\xeb\x9c\x11\xf3\xa0\x16\xb2\xe1\x00\x67\x1e\x64\x9e\x88\x00\x40\xaf\x46\xd3\xc0\x61\x75\x98\x8d\xe1\x89\xf3\x68\x32\x1d\x8f\x0c\xc7\x83\xe5\x76\x30\x7c\x0e\x2e\xc9\xc3\x56\x42\x07\xfa\x5e\xff\x6d\x4f\x8f\x15\x48\x12\xee\x3c\x3a\xf8\x3d\xfd\x5d\xe6\x6f\x78\x33\x1e\x9f\xe8\xed\x12\x88\xf7\xe3\xc9\x1f\xc5\x74\x36\x3e\x3f\xef\xbd\x89\x02\x50\x4c\x17\xba\xd1\xd3\xde\x60\x78\x31\x01\x71\x3e\xeb\x0d\x4f\x2f\x46\x7d\x6c\x8d\x3a\xcf\x5a\x9f\x77\xfa\x99\x3e\x66\xbc\x5e\xe2\xc7\xf4\x44\x30\x8b\x82\x99\x9e\x0f\xb4\x22\x6f\x7b\xef\x22\xf1\x3a\xd2\x7f\x1d\x69\xdd\xf5\x10\x86\x05\x16\x7d\x3b\x42\x8f\x3a\x82\x5a\x86\x6a\xd5\xf3\xf3\xe1\x07\x3d\xf7\xf6\x8f\xa7\xa0\x69\x7b\xb3\xb7\xc0\x5a\x01\xcb\xd1\x1b\x8a\xc1\xe8\x0f\x17\x13\x50\x6f\x17\xc3\x99\x16\x2a\xbb\xf1\xa0\xb7\x8f\xa6\x2e\xab\x04\xa9\x5e\xd0\xf0\xf8\x91\x41\x1f\x56\x79\xd8\x7b\xaf\x35\x27\x98\x44\x53\x7c\xdd\x76\x32\x14\xd3\xf1\x59\x24\xfe\x70\x31\x19\x4c\x4f\x06\x7d\xac\x45\xe5\xb2\xda\xe1\x70\xfc\x9e\x1a\xed\x0f\x2f\xa6\x44\x13\xe2\x8f\xd0\x8a\xc6\x56\xc9\x08\xc4\x94\xd4\x96\x6d\x47\xaf\x93\xd3\xd0\x59\xef\x83\x3f\x37\xfa\x20\x00\x28\xbe\xc3\xf0\x50\xbc\x4d\x2e\xaf\xc4\x24\x29\x3f\x8a\xde\xa2\x4a\xae\xa1\x6e\x2c\xdc\x7e\x92\xe8\x86\x4e\x7b\x17\xc3\xd9\xc1\x6c\x3c\x8c\x40\x99\x91\x8e\xd5\x7f\x39\x89\xa6\x83\x37\x23\x7d\x46\x9e\xf5\x46\x17\xa7\xbd\xfe\xec\x62\xa2\xff\xa5\x8d\x9e\xd1\x2c\x1a\x69\xab\x4a\xaf\xc7\x05\x1a\x1e\x66\xdf\x41\xaf\xa7\x62\x3c\x3a\x18\x0e\x46\x11\xee\xd1\xf1\x50\x44\xff\x72\x31\x38\x07\x92\x92\xc1\x48\xbc\xed\xfd\x6b\x6f\x72\x32\xbe\x98\x8a\x68\xf4\x6e\x30\x19\x8f\xf4\x1f\xa6\x62\xa2\x1f\x9a\xc0\x0a\xf6\x06\xc3\x83\x69\xef\x34\x72\x8f\xc5\x00\x17\xa5\x47\xaa\x39\xb2\xc6\x83\x9e\xe0\xd1\x45\x7f\x18\xf5\xb4\xe0\xf7\xb5\xb0\xc0\x16\xee\x0d\x26\xfd\x49\xef\x74\x26\x46\xbd\x77\x7c\x56\xa0\x91\x72\x76\x31\x1a\xf4\x7b\xb8\x8c\xd3\x0f\xd3\x59\x74\x86\x8f\x8b\xd9\xa4\x77\x7a\x3a\xe8\x73\xbf\x03\xa2\x72\x11\xc3\xc1\x69\x64\x0e\xa6\xb3\x5e\xff\xed\x60\x44\xc5\xc4\xef\xa3\xde\xb9\xd7\xcc\x60\x24\xde\xbf\x1d\xf4\xdf\x42\x1f\xcd\x3e\xdc\x76\xa4\xf7\xf1\x10\x8f\x7a\x27\xf4\x29\x5c\x58\x10\xf3\xa0\x29\xe4\x01\xd2\xb9\xbc\xd3\xc6\xdc\xf9\xdb\x0f\xd3\x41\x1f\xe5\xc9\x99\x46\x23\x4f\x62\x6f\xf7\xed\xe0\xcd\x5b\xb2\x39\xb4\x25\x00\xb3\xb2\xbb\xef\x1c\x86\x2d\xe6\x1e\x50\x65\xa7\xba\xd9\xe1\x07\x73\x24\xb8\x0c\x3e\x1d\xfc\x3d\xb0\xc5\x5d\xca\x9d\xae\xcf\xa2\x94\x1e\x85\x87\x62\xe2\xa7\x75\x6b\x9f\x83\xb3\x18\x7a\xa5\x98\xab\xea\x46\x29\xbf\x70\xb0\x81\x3e\x0c\x37\x57\x54\x37\x57\xb6\x12\xcd\x18\xc8\x38\x8b\x9b\x2c\xb5\xdb\x53\x66\x88\xbe\x36\xa9\x4a\x51\x57\x49\x6a\xc0\xf5\x96\xdb\xd1\x2c\xc8\xf5\x35\x25\x9b\x69\xba\x31\xe5\x05\xa5\xcb\x80\xec\x40\xd9\xf8\xf1\xca\x66\x58\x46\x10\xf3\x6b\x21\x2f\x0b\xb9\xbe\x02\xec\xf5\xdc\xf0\x8e\x01\xa7\x5b\xf6\x13\xd5\x80\x32\x5b\x6d\xdc\xa8\x48\xd3\x0d\x3a\x0e\xd2\xd8\x38\x48\xc4\xc5\xcc\xa9\x07\xdf\x05\xf4\x6d\x73\xc0\x8f\x97\xe2\x84\xa6\xcb\x49\x51\x78\xe9\xe4\x53\xd9\x66\x19\x24\x5a\xbb\xae\x7a\xca\xbb\xf4\x8e\xdb\xca\xd1\x21\xa6\x4c\x36\xe3\x1a\x10\xfe\x35\xed\x62\x86\x75\xd7\xcc\x29\xcc\x47\xe2\xe5\x74\x7c\x7c\x0a\x51\x59\xa2\xe3\x25\xc7\xb4\x4d\x54\x19\x70\x7a\x9c\x44\xb4\x0e\x91\x6a\x54\x26\x10\xa4\xb7\x27\xa5\x58\x6b\xa8\xbd\x5e\x4c\x2b\xc5\x52\xc3\xae\xe0\xdd\x3d\x09\xf3\xb6\x20\xec\xbb\x80\xa7\x57\xcf\x0f\x17\x35\x61\xd5\x8d\x47\x5c\xa2\x7d\xe1\x76\x79\x9c\xfe\x76\x95\x54\x9c\xf2\x2a\x63\x87\x59\xcd\x08\x19\xee\xba\xe3\xf0\x10\x6e\x3a\x92\x8c\x08\xd6\x66\x4d\x8c\x09\x28\xda\xf5\x53\x7a\x4c\xae\x30\x86\x19\x0d\x12\xb6\x48\x56\x90\x82\x58\x11\xbb\x6e\x65\x70\xff\xf9\x1a\xd5\x89\x17\x6f\xc9\x7c\x39\x7a\x12\x3e\x87\x3d\xb8\x6c\x12\x64\x73\xad\x56\xe9\x26\x3e\x63\x7c\x1c\x42\x2c\x88\x7a\xa5\xbb\x6c\xf0\x4e\x69\xf3\x2d\xf2\xd5\x3a\xdd\x24\x7c\xc3\x6b\xeb\xee\x02\xf1\x94\x23\x94\xcf\xe1\x56\x69\x5d\x40\x7f\x31\x04\xa1\xb2\x65\x5e\x2c\x54\x03\xaa\xdc\xe0\x20\x71\x33\xf6\xd6\x02\xef\x6b\x9d\x39\xd0\x02\xcc\x01\x0f\xc0\x58\xda\x52\x5a\x6e\x60\x76\x8e\xc3\x23\xd1\x63\x98\x71\x77\x61\xc4\xc5\x3a\xcf\xc4\xeb\x42\x2b\xb8\x8e\x45\xea\xc8\xbb\xda\xba\x48\x3e\x8c\x79\x82\xf1\xbd\x25\xa4\x3f\xe5\x34\x55\x4d\x91\x25\xc9\x03\x7c\x64\x7e\xb0\xe6\x1c\xd5\x39\x74\x8a\x6f\x11\xab\xab\x44\x6b\xdf\xbd\x27\x87\xfb\x22\x96\x9b\x12\xef\x16\x16\x39\xa2\x9e\x60\x1d\x3d\x0a\xc3\x9c\x06\xd3\x4b\x53\xa7\xfe\xe0\x0e\x58\x27\x93\x5b\x63\xd8\x21\x78\xac\xb8\x07\xca\xba\xb8\x4e\xae\x6d\x06\x3e\x4f\x5d\x2b\x58\x7e\x6e\xeb\xc2\x31\x2b\x06\xd5\x23\x30\x14\xe2\x15\xbc\x9b\x38\x9d\x64\x86\x52\x5b\x6d\x72\x9a\xec\x3b\xda\x0f\xfc\xee\x38\x6b\x7b\xdc\x5e\x51\x44\xdb\xa7\x56\xce\x31\x99\x68\xe0\x14\x8f\x99\x34\x09\xbc\x24\xaf\xb4\x36\x33\x48\x6a\x58\xda\xa5\xdf\x07\x48\x60\xca\x45\xf2\x6a\xcf\xf0\xbe\x6a\x0f\x8a\x4f\x40\xc7\xc4\x6a\x91\xca\x42\x42\x6a\xc0\x4f\x75\x7c\x89\xb9\xe2\x28\xc9\xfb\x46\x7d\x7b\xf7\x82\xde\x6d\xd6\xde\x96\x3a\x51\xf3\x2a\x24\xca\x81\x48\x25\x29\x49\x88\xcc\xf8\x06\x0d\x0e\x65\x02\xf7\xaa\x72\x23\x57\x25\x60\xc6\xad\x73\x40\x03\xdc\xdd\xd7\x3a\x47\x5d\x9a\x8c\xf0\x8e\x2c\xe1\xce\xc3\xda\x8c\xbc\x74\xd8\x0b\x28\x9d\xc2\xc5\xdb\x6d\x27\x28\x42\x2f\x6d\x0f\xfc\xf2\x2c\xa7\x4c\x37\x2f\xc4\xd3\x96\xfe\xa6\x6c\x3a\xb3\xbf\xd6\x45\xce\x45\x95\xcc\xd1\x54\x26\x9f\xf4\x9e\x78\xce\x7b\x82\x12\x72\x40\x6d\x39\x9f\x75\x33\x71\xc4\xb9\x2a\x92\x3c\xde\xdd\x17\x75\x96\xaa\xb2\xb4\xfb\x4b\x56\xc2\x7b\x04\x2b\x46\x89\xd7\x06\x8e\xb6\x24\x83\xfb\x28\x3d\x81\x90\x80\x9b\x8b\xb5\xdc\xb8\x1f\x92\x62\x55\x57\x35\x62\xda\xea\x37\x40\xc7\x3a\x77\xe5\x4c\x4c\x63\x60\x8f\xd7\xb2\x84\x8b\x3f\x46\x47\xdf\x06\x91\x01\xd5\x09\xed\x09\xb5\x18\x9f\x7a\x14\x71\x21\x6f\x38\xea\x6d\x64\x19\x05\x95\x92\x14\x60\xfe\xba\x6f\x2d\x58\xcc\x1a\x5f\x80\x7d\x42\x53\x04\xb0\x0b\xfe\x14\x49\x3b\x3a\x65\x46\xa7\xe5\x81\xf9\x78\xc0\xb4\xa0\x3d\xc3\x38\x57\xfe\x1c\xc5\xb8\x94\xce\xdc\x92\x51\xc5\x25\x5f\x54\x26\xd0\x1a\x13\xdd\x37\xf0\xc8\xb3\x60\x4b\x96\xac\xd9\x58\xdb\xa4\x0f\x8a\xc4\xb7\xb1\x50\xf0\x0d\x9f\xfa\xb4\x4e\x6c\x18\xbf\x3d\x15\x8e\x3a\x7a\x22\x26\x76\x52\xde\xc9\x14\x2f\x82\x67\xcd\x5b\x53\x30\x99\x88\x14\xe4\x0e\x1d\xc3\x0b\xe3\x8a\xd9\xb7\xdb\xc6\x6e\x51\x84\x99\x56\xba\x4f\x8d\x6d\x06\xd4\x7c\x23\x1c\x74\xef\x52\x55\x15\x26\x5b\xee\x13\xdb\x2c\x9d\x2d\xa4\x4c\x69\x92\xba\xc6\x64\x57\x91\x14\x08\x96\x4d\x99\xe9\xba\xe6\xe9\xea\x2c\xef\xd4\x3b\x40\xcf\xbc\x33\x17\x5b\x56\xd3\x58\x6f\x95\xfc\xa8\x88\xae\x5e\x2e\x16\x79\x8d\x35\xf6\xb1\xc2\x05\x36\xe5\x10\x2b\xf8\x4b\x5e\xd8\x0e\xe0\x1c\x11\xab\x54\xd1\xac\x28\x3f\x3a\x0e\x9f\x8a\x51\x2e\x26\xaa\x2a\x72\x89\x95\xde\x91\xe1\x97\xf3\x2c\xbf\x41\xd3\x60\x73\xce\xaa\x8e\x1a\x17\xdd\x6f\x85\xdc\xd8\xf6\x1a\xcc\x60\x91\x95\xee\x99\xe3\x1e\xed\xc6\x98\xd6\xc6\x35\x26\x5f\x94\x2a\x4d\x55\xc1\xf5\xa8\x90\x1b\x0a\xf7\xbe\xd7\x32\x4d\x62\xe7\x94\xa7\x54\x11\xca\xee\x70\x1a\x72\x6c\x1d\xbb\xcc\x4e\xef\x7d\xf3\xc0\xf9\x0b\xda\xc0\x4f\xc2\x43\x71\x96\x94\x0b\x95\xa6\x32\x53\x79\x6d\x51\x0f\x01\x92\x2a\x9c\x86\xe2\x0d\x94\xbe\xc2\x1c\x47\x59\x2c\x2e\x4a\x55\x94\xae\xe3\xd2\xa0\x45\x93\x62\xd7\x81\xa4\x4d\x2a\xb5\x0a\x76\xc5\x36\x60\xa8\x24\x13\x4f\xbf\x13\xfd\xf0\x34\x9c\x84\xe2\x38\x3c\x3a\x3c\x12\x7b\xe3\x45\x15\x8a\xa3\x97\x2f\x9f\xed\x07\xec\x49\x00\xf4\xfa\xd2\x6b\xd8\x40\x7c\x96\x06\xff\x53\xcf\xe8\x9d\x8f\xf8\x99\xad\xd8\x2d\xd8\x3d\x16\xd0\x9b\x9d\x4a\xdb\x2b\x6d\xbb\x1c\x1d\x8b\xbd\xa9\x5a\x73\xbf\x20\xdd\xda\xf3\x70\x5a\x8f\x83\x84\xdb\x91\x1d\xbf\x08\x5f\x1c\x1f\x1e\x1f\x1c\x89\xea\x0a\x6a\xe8\xed\xaf\x9e\x8a\xbd\x3f\xd4\x99\xe2\x11\xeb\xd5\xda\x3a\xed\x26\x3b\xae\x3d\xf3\x48\xb3\x9e\xc1\xcd\xa0\xb6\xd0\x49\xc7\x36\x71\x0b\x9c\xe5\x3d\x16\x13\x85\x40\x9c\x5c\x07\x72\x8e\xda\xbc\x61\x63\x83\x09\xcd\xd4\xd7\x39\x24\xcf\x21\x63\x1f\x26\x38\x03\xa0\x1f\xe0\x16\x2f\x36\x01\x1c\x08\x54\x59\x12\x88\x9f\xf2\x04\xae\xfd\x33\x34\x2c\x3d\xd8\x91\x3b\x68\x79\x28\xd4\xa1\x1f\x5f\xe5\x78\x49\x1c\x38\xa8\x5b\xed\x74\x2d\xeb\x85\x98\xbe\x3a\xb9\xdf\xb9\xcd\x62\x95\x85\x03\x40\x69\x80\x26\x82\x07\x13\x14\x39\xb3\xf7\x44\x0c\x1c\x10\xe7\x13\x0b\x82\xbf\x1d\x88\x03\x3a\x97\xac\xd6\x32\x29\x5c\x70\x3a\x93\xc5\x40\x8b\x1b\xd8\x0b\x71\xc2\xd6\x87\x1a\x65\x06\xcb\x0c\x00\x15\x44\xa1\x5d\xe1\x02\x07\xa8\xc5\x55\x96\xa7\xf9\xe5\x06\x9d\x39\xa2\x34\x87\x6d\x47\x75\xd0\xb6\x4a\xd4\xc9\x63\x32\xf8\x59\x42\x96\x0d\x3a\x26\xbd\x81\x54\xa5\x08\x2b\xb4\xab\x40\x13\xd2\x1b\xb8\x93\x16\x33\xa9\xab\x83\xce\xdc\x3d\x85\xfd\xa3\xe7\x6d\x96\x93\x5f\xa7\x27\x4d\xbc\x97\xc9\xb5\x2a\x42\x71\x2a\x93\xb4\xc6\x8a\xe6\x6d\x16\x37\xe0\xf8\x80\x8b\xca\x14\x28\x4c\xf0\xdd\xaa\x72\xb6\xd2\x4b\x51\x02\x29\x6e\xe0\x43\x80\x2b\x8a\x46\x1d\xb5\xb5\x32\xfe\xba\xac\x7c\x71\x35\x1f\x70\x86\xf1\x4c\x4c\x81\xf3\x90\xaf\x7f\x66\x7e\x45\x3d\x09\x20\x63\xe0\xaf\xd6\x58\x37\x65\x10\x2b\x81\x6f\xb4\x30\xc7\x1b\x63\x67\xad\xa0\xb6\x49\x10\x7e\x90\x36\x42\xee\x1e\x60\xa2\x5d\xd4\x34\xe6\xa0\x58\x66\x3c\xf7\x14\x00\xb9\x16\x57\xce\xbb\xe6\xc4\x05\x60\xce\x15\xe0\x75\xb4\x30\x94\xbc\x92\x0d\xce\xfd\x70\x5a\x75\x66\xe0\xb9\x18\x64\x0e\x5a\x48\x1f\x1d\xe8\x13\x4c\x71\x98\x56\xb2\xa2\x52\xb5\x89\xba\xac\x53\xd9\x48\x20\x87\x9a\x71\x1b\xa0\x24\x28\x0c\xd7\x09\xb7\x40\xa1\x5b\xc2\x47\x4d\x93\xb9\xcc\x51\xb6\xf5\x28\xb7\x26\xe4\x53\x82\x63\x89\xdd\x0b\xb4\x27\x48\xf8\xb0\x05\x80\x87\x40\x84\x85\xfb\xeb\x64\xa4\x2f\x64\x46\x89\x29\x1e\x06\x6b\x03\xbb\xa3\x6c\x86\x35\x9e\x84\x2f\x44\xf4\x69\x9d\x17\x60\x1e\x42\xe0\xc6\x29\xab\xc4\x28\x1d\x47\x74\x38\x51\xdf\x19\x12\x93\x63\x10\xfb\x88\x83\xd9\x0f\xda\x02\xe2\xb7\x0a\x9a\x87\xff\x84\xce\x9b\x7f\x6f\x99\x01\x92\x6c\xb0\x1a\x30\x36\xe4\x96\xda\xe8\xdd\x65\x75\xc9\x7c\x23\x2e\x32\x88\x35\xea\xf5\xa4\xf0\x23\xee\x09\x3f\x46\xc5\x16\x0d\xcf\x5c\x09\xc8\x74\x8d\xee\xcf\x37\xce\x08\xb0\x92\x69\x6b\x37\x2d\xdd\x2d\xec\x19\x4a\x93\x9e\xb7\x6b\xa8\x41\x64\x12\x40\x83\x44\xb1\x49\xd3\x7b\xfb\x66\x57\xe7\x3b\xd1\x2b\xe6\x49\xc5\x40\xfb\x7f\xa8\x8b\xa4\x8c\x71\x91\xc4\x7f\x15\xef\x54\x56\xab\xc6\xd6\x36\xbb\xc8\x05\x05\xe9\xe7\x69\x5e\xc8\x38\xe7\x70\x1d\x07\x59\xf6\xa8\xea\xc8\xdf\x63\x7e\xf7\x18\x51\xc6\x10\x6d\x96\x76\x96\xf6\xa1\x6e\x89\x73\xe6\xb1\x28\x08\x92\x27\x0f\xf2\xe5\x81\xff\xad\xb0\x89\x9f\xe4\x63\xa8\xc4\x49\xa9\xcd\x21\xaf\x8e\xa6\x1b\x28\xaa\xac\xe7\xab\xa4\xa2\xdc\xa8\x79\x82\x90\xca\xd2\xce\x92\x93\xeb\x57\x00\x8c\x38\xec\x91\x75\xa1\xae\x29\x55\x9d\xf6\x5e\x6f\xa5\x8a\x64\x21\x33\x77\x86\x45\xcf\x1e\xf5\xd8\xe1\x65\x5d\x38\xfe\x3b\x56\x86\xc5\x72\x55\x8a\xbe\xb6\xf7\x37\x81\x9d\xda\x8b\x69\x0f\x58\x5f\x20\x04\xa6\xed\x8a\x1a\x23\x80\x58\x38\x85\x7e\x90\xf3\xa5\x75\x91\x2f\x94\x82\xce\xff\xe4\xae\xaa\x2c\x79\xdf\xb9\x39\xf7\xcd\x24\x2f\x74\xb0\x18\xaf\x98\x27\xaf\x2b\xbb\xf6\x0f\x75\x4c\x9e\x13\x78\xc9\x10\x6e\xb9\x91\x45\x8c\x11\x81\x24\xf3\x3a\x45\x5f\x56\x59\x05\x29\xe0\x90\xc5\x8d\xba\xd5\x10\x46\x2e\xf2\x1a\x41\xfa\xe8\xfc\xcd\x2a\xaf\xff\x68\x7b\x73\x9b\x26\x0a\x8e\x9f\xe4\x44\xef\x47\x25\xa4\x7a\xd3\x5d\x48\x49\xb8\x50\x4e\x3f\x48\x1e\x9d\x45\x23\x2c\x00\xca\xa1\xa3\xa0\x0a\xde\x27\x2d\x13\x20\x15\x68\xe2\xe8\xe1\xf9\x0b\x57\x38\x4e\xcb\xd8\x11\x70\x41\xd5\x47\x13\x8c\x66\x1b\x84\xf1\x9c\x71\xb5\xe0\x51\xc8\x02\x5e\x24\xd7\x49\x7a\xdf\xd0\x83\xce\x3e\x5b\xc1\x05\x28\xaa\x94\x79\xb1\x8d\xc3\xba\x75\x52\x68\x2a\xdb\xe8\x99\xa4\xf2\x46\x94\x3d\xd8\xcf\x33\x6d\xc5\xc2\x03\x19\xda\x21\x72\x41\x14\xd7\xfa\xf1\x01\xb2\x58\x51\xf5\xc4\x54\x62\xf5\xd8\x9b\x3c\x8f\x4b\x60\x8a\x36\x5b\x12\xb7\xb2\x8a\xe9\x32\x26\x8b\xad\x81\x63\x1f\x02\xeb\xa4\x81\xf0\x27\x05\x30\xff\x56\x05\x38\x55\x19\xdd\x99\xd9\x68\x8b\xb5\x25\x3a\xd5\x7d\x83\xc4\x2c\x43\x10\x6f\xef\xa4\x23\x4b\x91\x15\x90\x29\xb5\x4f\x65\x76\x59\x4b\xac\xf8\x94\x16\xb2\xdd\xcc\xb9\xe3\x12\x38\x24\xa9\x71\x81\x25\xb7\xf8\x18\x24\xb4\x42\xc6\x6b\x93\x9a\xc8\xea\xe1\x97\x22\xca\x2a\xed\xdb\xf4\xd8\x42\x6a\xa8\x5d\x7b\xb3\xc3\x57\x14\xf0\xb8\x35\xa8\xd8\x71\x70\x03\x53\xcd\xe3\xf4\x0e\x4b\xcb\xa4\x7d\xee\xcc\x6c\x56\x27\xc0\xa5\x7a\x9c\x99\xbf\x44\x8d\x60\x1b\x9d\x1d\xae\x01\xab\xdc\x2d\x5a\x25\xcd\x61\xb2\x8f\x65\x89\x20\x62\xdd\x10\x50\x16\xc2\xe9\x68\xa7\x6f\x4a\xf3\xf7\xfa\xfb\xda\xd1\x7c\x79\x70\x7c\x78\x78\x2c\x66\xfa\x98\x4f\x30\xcd\xb4\x28\xeb\xa4\x12\x83\x6c\x11\x06\x70\x2b\x31\x41\xd1\x9b\x20\x9e\x6f\x1c\x72\x80\xfe\x5c\x65\x08\x70\xd5\xfd\xf2\xce\x05\x46\x6c\xd5\x27\xbd\xa7\x12\x60\x2a\x5f\x50\x85\xaa\x83\xda\x16\x37\x70\x17\xed\x00\xda\xcd\xf2\xfa\xef\xed\xce\xce\x87\xbb\xfb\x0e\x2b\xe2\xa1\x00\x8c\x3f\x25\x2b\x6d\xb7\xb1\x97\xc7\xb5\x43\xc8\xf9\xae\x57\x09\x00\xfc\x7c\x6c\xf2\xed\x29\xb6\x7b\xbb\x93\xc6\x67\x8e\x02\xac\x6d\x69\x26\xb2\x97\xee\x12\xcc\x4d\x4a\xae\x73\x27\xc6\x90\x2a\x00\xaf\x54\x10\xb5\x2f\xf7\x4a\x0b\x12\x2a\x59\x24\x4a\x47\x0c\x45\x1f\x25\x09\xd1\xab\x48\x06\xe0\xae\xdb\x37\x75\xaa\x3b\x61\xd6\x29\x43\x98\xbb\x42\xe5\xfa\x16\x0e\x0a\x30\x66\x61\xd2\xcf\x87\xe6\x2a\x6d\x72\x3e\xa4\x60\x3c\xd7\xd4\xec\x12\xa9\x62\xf7\x8a\x0b\x59\x89\xab\xaa\x5a\xbf\x7a\xfc\xf8\xe6\xe6\x26\xac\xf8\xa1\x35\x3e\x13\x2e\xf2\x55\xb8\x03\xf7\x5c\x2d\x3e\x79\x4f\x72\xf9\x6b\x74\xc2\x23\x92\x22\x9a\xc5\x29\x5f\x34\x73\x56\x32\x5c\x33\xff\x8c\xac\xe4\xde\xe8\x44\xcc\xa2\xfe\xdb\x11\x24\x8a\x9c\x5f\x4c\xa6\x17\x83\x99\x18\x8c\xfa\x21\xe4\x02\xbe\xfe\xe0\xa6\xcb\x0e\x87\x98\x60\x63\x33\x80\x9d\xb4\xe6\xce\xd4\x34\x27\xc3\x76\x80\x99\x6d\x36\x5b\x19\x32\xb6\x02\x2f\x2f\xa4\x2b\x69\x39\x10\xff\x72\x31\x88\x66\x22\x1a\xfd\x61\xfc\xe1\x2c\x1a\x61\xf2\x9f\x93\xc6\x1c\xe9\x5f\x86\x62\xaa\x94\x3f\x7b\x4b\xe7\x02\xd8\xea\x6e\xb4\x54\x1d\x1e\x12\x93\x44\x40\x27\x5c\x7b\x1d\xc2\x9d\x7f\xfa\xfd\xe7\x97\xf8\x09\x1f\x8f\xde\x9c\x0f\xc3\xea\x53\xf5\xcb\x7d\xe3\xf0\xf0\xf0\xf0\xf9\xd3\xa7\xfa\xff\x8f\x5e\x3c\x3b\x74\xff\x5f\xff\xe7\xd1\xd1\x93\x17\xff\x74\xf4\xe4\xf8\x58\x1f\x03\x47\xcf\x5e\xfc\xd3\xe1\xd1\xd1\xd3\x17\x4f\xfe\x49\x1c\xfe\x72\x5d\xb2\x3f\x75\x59\xc9\x42\x88\x7f\xba\x96\x71\xb2\xba\xe3\xb9\xfb\xfe\xfe\x0f\xfa\x33\x8a\x66\x6f\x7b\xfd\x3f\x8a\x37\xd1\x28\x9a\x80\xfa\x79\x3d\x1c\xf4\x39\x05\x6e\x67\xcf\x9e\xd6\x47\x2f\xbf\x7b\x29\xce\x42\x31\xad\xd4\xfa\x4a\x1f\x94\xd9\xfe\xce\xde\x6b\xc6\x59\xd5\x9b\xf5\xf5\x60\x3a\x1e\x19\x98\x7b\x64\x9d\xb2\xe1\xc3\x85\xdb\xd2\x77\x62\x92\x2c\xae\xb4\xbd\x0d\x2d\xca\x34\x5d\xc9\x6c\x7f\x27\xba\x56\xc5\x26\xcf\x20\x8e\x04\x35\x74\xec\xf7\xc1\x21\xd1\xc0\x43\xbc\x56\xc5\x5c\x56\xc9\x8a\xe1\x56\xf8\x94\x35\x5f\x9c\xd7\x15\x96\x4b\xa3\xb7\x6a\x8b\x99\xe0\x90\x0c\x39\x8e\x82\x65\x65\xe6\x38\xbc\xc9\x0b\x66\x7b\x58\x31\x27\x38\x81\x0d\x1b\x9c\x3a\x66\xde\x0a\xc1\x3a\xeb\xb8\x73\xc9\x97\x62\x95\x97\x95\x3d\x66\xf4\x59\x29\x33\xdd\xcd\x8f\x4a\xad\xa1\x5a\x91\x4c\xda\x95\x2a\x16\x4e\x32\x8b\x79\x10\x22\x16\x68\xe1\x96\x55\x20\xf2\xba\xd8\x32\xb5\x5e\x1e\x52\x95\x8b\x4b\x6d\xb0\x2b\x9e\x49\xaf\x34\x0d\x98\x88\xc4\x48\x55\x6f\xe5\xe2\x63\x28\x66\x34\xc4\xb2\xe6\xa4\x0e\xdd\xaf\x4b\xe5\xe1\x7e\xdc\x28\x71\xa3\x3d\xda\x0d\x86\xc4\xae\xe4\xb5\x0a\xf4\x2f\x33\x85\x9f\x83\x16\x0a\x27\x98\x84\x2d\x2d\xf3\x62\x9e\x40\x4e\x18\xf4\x22\x17\xb1\xca\x36\xd8\x08\x50\xed\x58\xc8\x5d\xed\x50\x94\x1f\xb9\xfd\xb2\x2e\x0a\x65\x3d\x7a\x78\x2a\x14\x6f\x11\xd5\xcb\x59\x5e\x3b\xdb\xe1\xce\xd4\xc9\x31\x0a\x4c\x87\xab\xce\xd1\xc1\xad\x96\x37\x29\x30\x5f\xf2\x06\x6a\xa2\x58\x90\x68\x8a\x02\xfb\x1e\xa1\xe5\xb4\xcc\xa3\x54\xaf\x99\xcc\x60\xd6\xb4\x8c\x21\x15\x11\x74\x20\xa9\x9c\xf7\xf5\x33\x04\x0d\x40\x8d\xb3\x11\xb6\x4e\xd4\x02\xbf\x9a\x80\x59\x05\xcc\x9b\x85\x52\x0e\xb7\xa1\xc1\x6c\xd1\x2d\x01\x0a\x12\x37\x89\xec\x01\x28\xbb\xd9\xa5\x16\xc8\xd6\xa8\x8d\x28\x5c\xf1\x0d\x13\xa3\x99\xdf\x28\x9a\x8e\x9c\x97\x8b\x16\x21\x56\xeb\x82\xdc\x3e\xfd\x22\x0c\xd2\x90\x24\xf1\x9a\x34\x01\x87\x37\xbe\x7f\xd1\x31\x99\x06\x81\x00\xa6\xbc\xf2\xf0\x2f\x09\xba\xd5\x08\x86\xb7\x60\xcd\x12\x78\x3b\xb8\xea\x4a\x6d\x02\x51\xe5\x79\x60\x56\x28\x2f\xcc\x82\x60\x0c\xd4\x2c\x58\x08\x20\xc2\xa6\x17\x80\x71\x5a\x5d\xa9\x15\xe5\x1c\xd1\xc0\x76\x7a\x69\x99\x07\xb8\xdb\xa9\x7c\x7f\x5d\xe4\x95\x22\xa7\xff\x46\x39\x1d\x59\xa8\x02\xcc\x58\x7f\xa2\x97\x49\x16\x97\x90\xb0\xca\x7d\xc4\xdb\xc8\x2c\x37\x45\xe7\xd0\xbc\xd9\x88\x03\x33\x49\x80\x8e\x68\xb8\x12\x36\x10\x44\x36\x4b\x80\x79\x12\x25\xaa\x5c\x2b\xe8\x09\xe0\xd1\x98\x89\xac\x72\x14\x11\xf8\xf6\x0d\x4f\x12\xae\x34\xa7\x40\xc0\x9f\x3c\xe3\x17\x54\x19\x52\x64\xe9\xbf\xec\x9d\x25\x1f\x95\xa3\xeb\x9d\x48\x2b\xf2\xe6\xba\x2b\xeb\xc0\xfc\xef\x5b\xa5\x69\x18\x2d\x48\x7d\x52\x32\xae\xdc\xe0\xe7\xcd\x32\x68\x11\x86\x50\x2a\x7b\x2f\x7e\xa6\x67\x5e\x34\xf6\x4d\xb8\xd3\x1f\x9f\x7f\xd0\xe6\xee\xf9\x78\x38\xe8\x0f\x22\xe2\xb9\x77\x4a\x1b\x1f\x74\x58\x70\xe7\xdd\x1d\x2d\x4b\x6f\xb3\x27\x95\x41\xd9\x5d\xa9\x38\xa9\x57\x81\xf5\x06\xec\x7e\xd4\x0a\x3d\x01\x30\x32\x07\xe4\x07\x51\x67\x53\xe2\x19\xe5\x7a\x72\xaa\xb3\x74\x69\x11\x9a\x81\x4f\x13\x71\x08\x5c\x16\x17\x39\x2f\x15\x05\xab\x74\x6f\x58\x8c\xbe\xc7\x90\x23\x87\x68\x70\x81\x7c\xd4\x0a\xa8\x0a\xa5\xa1\x32\xa5\xe1\x16\x10\x5e\xf3\xe9\x26\xb6\x92\x4b\xbb\x74\x6c\x27\x9a\x2a\x9d\x37\x7a\x9b\xb0\x5b\xd9\x9e\x5f\x8a\x27\x38\x00\x08\x09\x8d\xad\x6b\xa1\x90\x6a\xc0\x2b\x97\xed\x08\x28\x9c\x9b\x0c\xec\x23\x84\xc8\x12\x7b\x36\x7b\xb7\x81\x32\xde\x35\xc0\xfd\xae\x85\x04\x3b\x60\x1b\x1d\x8b\xdc\x77\xe8\x05\xcd\x0e\xa5\xc5\xcd\xc5\x42\x16\xc5\xc6\x81\x89\x64\x21\x28\x2b\x0a\x6f\x9b\x73\x00\x64\x19\xbd\x5b\x7c\xdb\x05\xc3\x34\x01\x1b\x78\x0a\x56\x97\xbe\x3f\x77\xbf\x7f\x73\x95\xa7\x56\x16\x80\xe4\x94\xdb\xf7\x77\x0e\x95\xb3\xd3\x39\x04\x58\x8c\x79\xca\x80\x8d\x40\xbf\x62\xea\xa5\x91\x9e\x51\x3a\x70\xd4\x5d\x8b\xa8\x5f\x31\xcc\x27\xb8\x6d\x4d\x14\x45\xea\x61\x33\x14\x0b\xa2\xca\x37\xc0\xb8\xb5\xa1\x08\x4b\x98\xc4\x2a\x83\xcc\x29\x94\xef\xbc\x6c\x80\x62\x6d\x11\x4b\x73\x7f\x61\x14\x88\x07\x08\x83\xa1\x77\x40\x6e\x51\x18\xbd\xba\x56\x56\xe3\x5a\x25\xde\xbc\x9d\xf3\x3a\x19\x08\x6c\xbb\x10\x39\x80\x0d\xed\xd3\x02\x2c\xf6\x1d\x08\x1a\x42\x9b\xf1\xf0\x10\x5d\x88\x5a\x83\x04\x2b\x31\xbf\x87\xe9\xe6\x0b\x4c\x10\x45\x1e\x45\xc9\x87\x91\xdc\x34\xbe\x49\x58\xd6\x5d\x5d\x47\x44\x5b\x54\x88\x4b\x44\x53\x57\x8a\x48\xf1\xee\xd4\x80\xbc\x92\x7b\xf0\x92\xd9\x8d\x45\x63\xc1\xf5\xde\xc4\x0d\x67\xf7\xd8\x31\x80\x91\xe5\x18\xb3\xda\x12\x18\xba\x73\x97\x96\x7a\x9b\x66\xb1\x38\xa6\xcd\xba\x7d\xef\x01\xca\xc2\x72\xeb\x16\x94\x0b\xb4\x8f\x01\xad\xc0\xa8\x27\x73\x9f\xbd\x92\x8b\xab\x24\x53\x07\x85\x92\x31\xf4\xcc\xd1\xed\x0c\x84\xc0\xf8\xcd\xdd\x81\x9f\x7b\xfb\xfe\xbd\xc8\x8b\xc0\xee\xc9\x76\x87\x96\x75\x9a\x7a\x57\x98\x08\xac\x4e\x88\x52\x14\xf6\x7a\x70\xaf\x99\xf5\xde\xbb\x1d\x92\xc5\xe2\x0a\x6c\xd1\xa4\x52\xa1\xd8\x83\xc0\x34\xa0\x06\x64\xb8\x8c\x89\x8d\x04\xc2\x95\xfa\x12\xb9\xb8\x9d\x6c\x24\x57\x70\x43\x90\xf0\x53\x94\xdc\xd2\x70\x3f\x03\x32\x0f\xf5\xd0\xed\x10\x12\xb2\x3a\xb4\x9e\x30\x60\x7a\xc2\xdb\x10\xb2\x34\xf8\x83\xe9\xc6\xa2\xfa\x03\x88\xd6\x45\xa9\x32\x05\x69\x0d\x88\xad\x15\x7b\x5e\x1c\xab\x46\xd6\x04\x5e\xb3\x86\xd5\x17\x91\x30\x00\x0a\x66\x9b\x68\x12\x75\x59\x2b\x00\xea\x03\xed\xfb\x3a\x93\xf7\xaa\xd9\x31\x5d\xfc\x42\x46\x82\x3b\xaa\x8e\x9c\x3b\x83\x5e\xa6\xb7\x76\xa5\x56\xeb\xca\xb9\x6b\x26\x0b\xe0\x8b\x3a\x91\x94\xe2\x3a\x4f\x62\x56\x1a\x85\x73\x1d\xc3\xa7\x02\x9f\xee\x1d\x5d\xb2\xf7\x12\xe6\xaa\x64\x4b\xfa\x6a\xec\x80\x5a\x99\x7b\x8b\x2b\xf4\xfb\x2c\x64\x68\x3b\x9b\xcd\x90\x51\x83\xc0\x82\x0f\x84\xdb\xb3\x53\x91\x9b\x44\x18\x76\xc7\x92\xc2\x49\x4e\x34\x7d\x11\x65\x6e\xd0\xd1\x31\x7b\x84\x7a\x64\x2b\x02\x40\xfa\x6c\x24\x3a\xdc\x99\x22\xad\xd3\x3a\x95\x49\x96\x6e\x5e\x99\x7b\x7b\x2f\x9e\x40\x96\x8b\xf1\x4c\xbc\x64\x06\x70\xca\x64\x51\xf9\xce\x4b\x5b\x67\x35\x4b\x34\x9c\x88\x37\x05\x3d\xf5\xa1\x88\x4a\x83\x8e\x5b\xc4\xca\x09\x70\x05\x8d\x15\xe1\x1c\xb2\xbc\x86\x0e\x23\x7c\xb3\x2b\x5e\x4d\x84\x76\x14\xd3\x8d\x0f\x64\x6b\x7a\xba\xf5\x20\x85\x1c\x53\x43\x41\x1e\x97\x81\xb8\xcc\x85\xbc\x52\x32\x66\x58\x5a\x1b\x26\xc0\x38\x4a\x9c\x67\x8f\x2a\x51\xe1\x65\x6b\x59\xe5\x6b\xcf\x37\x84\x35\xd7\x6f\x51\xa4\x65\x29\xe1\x16\xfd\xf7\xa8\xed\xdf\xfd\x4f\xf8\x78\x74\x3e\x3c\x38\x0a\x0f\x7f\xc1\x10\xf0\xdd\xf1\xdf\x67\x47\x47\x47\x47\xcd\xf8\xef\xf3\x67\x4f\x7f\x8f\xff\xfe\x1a\x3f\xa3\x68\x36\xed\xf7\xce\xa3\x66\xe0\xd7\xb9\xd7\x24\xef\xfa\xc4\xd0\xec\xbb\x64\xf4\xa1\xf8\xf1\x47\x97\x83\xf0\x11\xdb\x07\xd2\x30\x9a\xa3\xc2\xc4\xd3\xba\x34\x64\x39\x70\xd2\x99\x1a\x33\x86\x27\x6e\x93\x23\x98\x4f\x1d\x37\x3e\xc5\x77\xa2\xe6\x93\x64\x53\xcd\xbd\x6a\x30\x25\xc6\x0c\x81\x8c\x98\x9f\x98\x97\xee\x43\xf6\x83\x45\xd1\xa4\x1e\xb7\x55\xb5\xfe\xc3\x5c\x59\x83\x19\x0a\x16\xff\xcc\xc5\x7e\x32\x9d\x7e\x82\x9d\xbe\x56\x48\x05\x15\x2b\xaf\xb7\x5e\xd7\x44\xab\x5b\xe4\x4b\xdc\x37\x26\xe8\x67\x83\x60\x81\xf3\x02\x16\xd2\xab\x6b\xdd\xc6\x9a\x7b\x14\x3e\xd5\x1d\xbd\x97\xbb\xc3\xf4\x5e\x8a\x95\xe1\xf3\xa0\xa8\x34\x5c\xae\x6b\x43\xc9\xf2\x02\xda\x4b\x56\x9b\x91\x0c\xd4\xff\x75\xc6\x55\xe5\x90\x3b\x61\x3f\x6b\xcc\x9e\x7c\xa9\xfd\x61\x69\x3b\xf8\x0c\x3a\x68\x0c\x3b\xd3\x13\x77\x72\x5d\x46\x24\x17\xab\xcd\x65\xcb\x31\x0d\x3e\xd7\x0d\x0e\x10\xf1\x96\x53\xa6\x55\xe1\xad\x4f\x92\xc5\xc9\x75\x12\xd7\x90\x8e\xc9\xd2\x8c\xae\x2b\x27\x3d\x60\xc2\x4d\xa3\x91\x2e\xd2\x09\xaa\x34\x33\x60\xfd\xf3\x4d\xf4\x09\x19\x0f\x7b\xb6\x4f\x2f\x74\x9f\x86\xda\xb9\x2c\x00\xf6\xd1\x99\x6f\x2c\x91\x06\x0f\x06\x05\x42\x35\xc6\xde\x41\xf8\x89\xa6\xc9\x82\x3e\xff\x30\xda\x30\xdb\x99\xef\xa0\x33\xf8\x5b\x67\x5a\xb4\x39\x4e\x95\x0b\xf6\xd9\x97\xfa\x59\x4f\x06\x6d\xd7\xb3\x8d\x61\xf5\x10\x2e\x85\xb6\x76\x99\xef\xa7\xd0\x76\x1c\x8d\xd6\x76\x21\xda\x87\xeb\x24\xaf\xcb\x26\xa7\xca\xfb\x2b\x95\x35\x84\xa3\xb4\x3e\x08\x40\x81\x96\xaa\x20\x8f\x03\xbc\x8d\x40\x48\xaf\x11\x91\x94\xaf\x2c\xec\x72\x8f\x8c\xf9\xfb\x46\xe2\x26\x7d\x48\xcc\xad\x70\x6c\xb9\xd6\x10\xb6\x74\xdf\x7e\xf7\x35\x7e\x17\x2e\x05\x00\x58\x1b\x94\x29\x07\x6d\x4c\x4c\xa6\x53\x31\xdc\xdb\xfe\x51\x78\x74\xa8\x57\xce\x7b\xcd\xac\x5c\x23\x91\xa8\x6d\xf3\x83\x64\xa1\x4c\x26\x8d\x2a\xf2\x2f\x10\x7f\xbd\x18\x0d\x25\xad\x35\x1a\xb4\x1b\x34\x79\x95\x30\xd6\x8d\x04\xde\x1d\x7e\x4e\x03\xaf\xd0\x5b\x7f\x5f\xfc\xbb\x24\xfe\x08\x8e\x33\xa7\xdb\x9e\x36\x58\x9b\x82\x59\x97\xa6\xca\xfb\xc4\x12\xb0\x0e\x80\xe0\xa2\x85\xf8\x87\xb1\x64\xd6\xc4\xda\x09\x5b\xe5\x31\x24\xac\x26\x76\x41\x03\x42\xc8\xcd\x36\xa6\x0a\x45\xc5\x0e\x0f\x42\x6c\x0e\x61\x96\x59\x04\xc5\x2e\xad\x57\x4c\x4c\x74\x7a\xb5\x92\xd4\x12\x16\x25\x59\x59\xc9\x34\x35\xc7\x08\xc0\xbc\xb3\x36\xc5\x3a\x16\x00\x75\x86\x74\x48\xc7\xdd\x37\x8c\xab\x5c\xc4\x24\x8b\xa4\x84\x74\x23\x4a\xb0\xbb\x7b\x83\x92\x93\xa1\x88\xbd\x23\x0b\x1c\x57\xc5\x57\x5f\x3c\x9d\x2e\x9f\xf1\xe2\x2a\x4f\x16\xaa\xcd\xe5\xb5\x90\x19\x72\xc8\x42\x2c\x6d\x05\x4e\x39\x82\x30\x60\x68\x44\xa6\x94\xac\xe4\x38\x6d\x7e\x82\x6d\xac\xf8\x3d\x13\x05\x3b\xc0\x77\xf5\xea\x94\x4e\x09\xd9\x4d\x12\xfb\x1e\x16\x46\x53\x28\x08\xe8\x08\x0f\x18\x28\x1f\xf2\xda\xd1\x7c\x8d\x13\x44\x52\x81\x11\x9d\x24\x0e\x9d\xa8\x0b\x61\xc2\xb1\x71\x0f\x2a\xc1\x29\x22\x60\xb5\x1d\x7c\x39\xb3\x62\x52\x96\x75\x8b\x57\xf1\xb9\xb6\xe2\x4e\xf3\xc2\xed\x1c\xc4\x41\x79\x34\x84\xe5\x8e\x62\x49\x7d\xe7\x93\x08\x84\x4d\x1b\x1c\xa5\x8f\x72\x12\x50\x3c\x19\x3f\xa5\xcf\x7c\x4c\x0c\x05\xd9\x84\x11\x01\x3d\xe0\x69\x23\xcf\x19\x8f\x17\x23\xe4\xba\x0f\xf4\x92\x99\xd5\x3d\x89\x4c\x46\xeb\xfc\x46\xcf\x15\x16\xab\xba\x85\xab\x01\xc6\xe3\x39\x2a\x82\xbf\xa4\x55\x5e\xc9\x4c\x5a\x32\x58\x08\x29\xe0\x80\x6c\x25\xd6\x7c\x63\xf3\x4a\xdd\xb0\x00\x96\x4e\xcf\xf7\x7d\xb6\xa2\x65\xb2\xac\x36\x62\xad\x8a\x05\xc4\xa7\x9f\x1d\xfe\x97\x7d\x83\x1e\xce\x38\xc5\x75\xa5\xcf\x36\xd8\xf6\xe0\x59\x83\x65\x37\x57\x99\x5a\x52\xa9\x87\xdb\xa0\xd3\x27\xbe\x6e\x71\x25\xbf\xa1\xb3\x8e\xf5\xda\xcd\x3a\x6d\x10\x22\xf3\xee\xfe\xe3\xb7\x26\xd8\x7f\x28\x4f\xbe\x73\xa0\xca\xfd\x2e\xb6\xcc\xaf\x61\xb8\x6f\xab\x9e\xbd\x0e\x63\x68\x9f\xaa\x12\x0b\xc3\x86\xda\xb0\x99\x7d\x4e\x7a\x29\x1c\x3b\xcc\xbd\x88\x11\x02\xa4\x80\xaa\x5c\xbf\x90\x8d\xbe\xb5\x12\x0e\x27\xbd\xc3\xf8\x5e\xd3\x20\x4b\xad\x37\xf7\x7e\xfc\xf1\x02\x00\x8f\xd4\xa3\x47\xfb\x0f\x1d\xec\x83\x69\xe9\xb9\xe6\xba\xdc\x4a\x94\xe3\x53\xd4\x53\x57\x1e\x3c\xe9\x8c\x78\x4f\x28\xee\x94\x20\xeb\xf5\x85\x72\x89\xbd\x8f\xf2\x67\xb8\x1e\xa3\xe5\x19\x39\x5e\x91\x31\x67\xcc\xa6\x38\xf6\x39\x88\x70\x2b\xd0\x5f\xa3\x26\xe1\xf4\xdf\xc1\x5e\xd8\xfb\xb6\x9b\xc1\x9f\x2c\x86\x97\x66\x34\x08\x0f\x44\xa4\x73\xcd\x2c\x93\xa7\xcc\x44\x9d\xd9\x7c\x04\xcc\x74\xc5\x7d\xd4\x5e\x96\x40\xef\x9f\xa6\x4f\xf2\x8b\x6f\x29\xcf\x65\x6f\x08\x68\x47\xb8\xe0\x37\xdc\x2e\x5f\xd0\x9b\x5f\x6d\xd7\x3c\x09\x7d\x57\xdf\x61\xdc\xe6\x0d\xf3\x44\x9f\x31\x3d\xbf\x2c\xc5\x54\x6f\xcc\x5a\xe2\xe6\x10\x2b\x7d\x3b\x32\x6b\xd7\x74\x6e\x93\x59\x1b\x53\x06\x76\x7e\xd3\x58\x74\x8c\x21\x4f\x38\x69\x02\xdd\x7b\x40\xb8\x2d\xfb\x05\x29\xac\x81\x4d\xce\x07\xa9\xfa\x2a\x5a\x64\x77\x78\x5d\xbc\xc8\x7c\xd5\xf5\x45\x94\xc8\x3c\x16\x4b\x6c\xdc\x00\xf8\xaa\xbe\x1d\xb5\x71\x9b\x38\xc5\xa5\x83\xb3\xdc\x2f\x1c\x69\xc0\x91\x34\xb9\x48\xa5\x81\x10\xea\x44\x30\x7b\x12\x3e\xb3\x32\x7c\x1c\xde\x4d\xa2\xdc\x6b\x90\xae\x7e\x91\x1c\x6f\xe1\x04\x4e\xb2\x26\x03\x71\xe7\x35\xb9\x37\x7b\x77\xb1\x28\x7b\x3e\x9b\x9d\x7f\xc3\x8a\x6c\xe2\x6f\xf7\x93\xf0\xa2\x62\xa1\xd4\x4c\x40\x8a\xda\x10\x81\xeb\x96\xaf\x98\x51\x61\xca\x51\xb2\x6c\x0e\x56\xf7\xe1\xde\xef\x06\x77\x31\x21\x3f\x9c\xe1\x18\x12\x25\x99\xab\x6a\xae\x16\xc0\x49\x66\x79\xaf\xdd\xc6\xca\xe4\x93\xd8\x7b\xde\x68\x48\x6e\x65\x82\xf0\x63\xba\x9e\x40\x18\x1a\x8c\xc6\xc0\x21\x69\x15\xd0\x08\x59\xe0\xff\xce\x19\x96\xcd\x9e\xd0\xca\xff\x8b\x88\x89\xd3\xd4\x57\xa1\x66\x3f\x6c\xfc\xfd\xc0\xf4\x9c\x48\xa9\x02\x04\x6b\x0d\x3a\x61\x26\xf7\x65\xda\x60\xef\x42\x5f\x56\xfe\x67\xb6\x67\x48\xfd\x3c\xb2\x5e\x8c\x5a\x3d\x84\xaa\xd7\xb7\x74\x4d\x54\x81\x8e\xac\xb6\x7f\x65\x29\xd0\x78\xc0\xc0\x84\x41\xea\xbb\x33\x60\xcc\x7e\xad\xc7\x50\x06\x14\xbd\xf3\x26\x43\x2f\xfc\x6b\x8b\x2a\xf8\x86\x2c\xbc\xee\x1a\x58\xa1\x79\x1a\xde\xcd\x83\xeb\x5b\xb5\x5f\xcc\x83\x8b\x76\xb3\x01\x88\xbd\x9b\xfc\xd6\xbd\x54\x37\xd8\x21\x32\x25\x02\xa7\x05\x7b\x25\x4d\xcc\xd8\x76\xe0\x70\xdf\x49\x4e\xbe\x93\x0d\xd7\x0f\x8d\xb5\xd9\x70\x7f\xfc\x11\x30\xd5\x1f\x3d\xa2\xf9\xfe\x8d\x08\x71\x37\x0f\x25\xc4\x05\xf4\x37\x6f\x4f\xdc\xcf\x89\xfb\x24\x3c\xfe\x5f\x82\x13\xd7\x57\x75\x5f\xc6\x82\xab\x37\xed\x76\x1a\xdc\xa6\x12\x7a\x10\x07\x2e\xdb\x8d\xf9\x4d\xe6\x78\x41\xc6\x5f\x42\x79\xfb\x52\xc6\xdb\xcd\xcf\x64\xbc\xd5\x36\x56\x9b\xf6\xf5\x1e\xfe\xd3\x44\x2b\x2f\x8e\xfe\xdf\x53\xc2\xcc\xd7\xb0\xf7\x31\xc3\xf2\x65\xa2\xf7\x2a\x62\xd5\x7d\x09\x97\xab\xa7\xf3\x7c\xce\xa5\xd8\xa3\x06\x74\x97\x70\xaf\xdc\xf7\x99\x52\x37\xf7\x32\xa5\x32\xd7\xba\xbb\xbf\xec\x85\xe0\xdd\xc4\xa6\x86\x50\xf3\x67\x32\x9b\xb6\x34\x5e\xab\xe1\x5f\x83\xd9\xf4\x6e\x62\xc7\x2a\xff\x75\xb8\x1d\xfd\x75\xff\x66\xb4\x8e\xed\x93\xfe\x41\xfc\x8e\x72\x5e\xe6\x69\x0d\xc8\xc5\x86\xe7\x2a\xfb\x6d\xa9\x1e\xbb\x6d\x9c\x87\x70\x3e\x36\x39\x1a\x3b\xe7\xe4\x17\x27\x6b\x7c\x12\x3e\x6f\x84\x3a\xf2\xa5\x6b\x42\x31\xd1\x9e\x95\x47\x27\xa8\xd6\x4c\x32\x88\x1a\xb9\xcf\xc8\xa8\xb6\x24\xbf\x17\x94\xa1\xa9\x03\xb4\xa7\xe6\xd1\xc1\x93\xf0\x99\x03\xab\xb8\x42\x38\xbc\xb6\xc1\x1b\xb0\x8b\x85\x78\xc3\x6c\x8e\xd0\xce\xf4\x4a\x0a\xb6\xb9\x10\x5d\xb7\x93\x49\x17\x33\xe3\x03\x02\x2e\x2d\xee\xdd\xab\xfc\x86\xae\x68\x59\xbd\xc2\xa0\x96\x75\xba\x4c\x20\x2c\x87\x39\xb9\x76\xeb\x79\xd3\x40\x21\x1a\x1a\x0d\xbb\xce\x8b\x3c\x2b\xd7\xc9\xa2\xce\xeb\x32\x35\xd1\x80\xf8\x81\x86\x6f\xb0\xc5\xec\x85\x63\x32\xd5\x7f\x29\x10\xa9\xa4\xc3\x08\xbe\xe7\x40\x68\x19\xc2\x5d\xf2\x01\x6e\x59\x87\x39\xde\x88\x38\x31\x6b\xa2\x41\x46\x25\x73\x00\xaf\x39\x4d\x82\x3a\xb1\xb3\x41\x9e\x38\xac\x8d\xb9\x83\x6d\x53\xd8\x35\xf3\x52\xd9\xf1\xbc\x13\x9e\xa1\x19\x73\x30\xe5\x85\x95\x53\xcd\xca\x07\x6a\xc7\xb8\xe2\x5c\xd1\x3d\x3b\xa5\x36\x6b\xed\x9e\xac\x12\x84\xa9\x4b\xd9\x55\x37\x33\xcb\xb8\x82\x65\x57\x66\x00\x37\x6a\x32\x28\x5a\x60\x91\x8d\x34\x56\x73\x2c\xdf\xbf\x00\x3c\xe1\x76\x02\x79\x74\x0f\x52\xb9\x95\x13\x30\x23\x73\x7e\x0b\x93\xa0\x40\x38\xf5\x2e\xf5\x0a\x70\x7f\x77\x68\xbe\xce\xd3\xe0\xef\x5a\x17\x9b\x73\x68\xab\xaa\x7d\x11\xba\xa1\x7e\x97\xbc\x99\x38\xe6\xdd\x3f\xe3\x8d\xeb\x6a\x8e\x19\x32\xde\x86\x71\x6e\x1a\xbe\x2c\x8b\xa9\xeb\x56\xc4\xfd\x24\xe6\xff\x24\xd9\x65\xaa\x18\x9d\x12\xc9\x20\xd1\x34\x59\x48\x8f\xc7\xd2\xad\x39\x6d\x2b\xf8\x96\x1c\x58\x3d\xc8\x7b\xa8\xe5\x49\x83\x13\xfd\x85\x60\x85\xfa\xbd\x5f\x19\xaf\xd0\x5b\x0c\x1f\xaa\xb0\x85\xd7\xe4\x50\xe5\xbf\x02\xd7\xbf\x9b\xc1\xa0\xd9\x0b\x52\xb1\x2b\xf9\x29\x59\xd5\x2b\xbe\xe1\xe0\xc1\x7d\x6f\x22\x20\x5e\xd0\xc2\x05\x0b\x61\x6f\x7a\x81\x5e\x9a\xda\x08\x09\xb0\xca\x44\xc5\xeb\x1e\x5d\x7c\xd6\xb8\xa7\x4b\xc3\x5b\xdd\xe2\xf0\x3e\xb5\x04\xa4\xee\xfb\x26\x35\xc3\x0d\x05\x94\x1d\x5e\x4c\x28\xa2\x2e\xe4\x3d\x66\xd2\xa0\xdb\xb9\xae\x99\x25\xd8\xcc\xae\x61\xd8\x28\x41\xba\xa1\x38\x01\xc9\x9c\x1b\x28\xc8\x97\x02\x10\x0d\xb4\x13\x58\x7e\x04\x06\x0a\xac\xb6\x25\x8f\x02\x74\x24\x24\x28\x88\x04\x2f\x49\x9f\xb5\xae\x7b\x5a\xe9\x52\x3e\xef\x85\x7e\x98\xca\x20\xbd\xa8\x60\xb7\x86\xd1\x6e\xb3\xac\x2a\xb9\xb8\x22\x4b\xa1\xc3\x2b\x34\xc6\x3f\x9f\xeb\xad\x1d\xf4\x3c\xf4\xb8\x91\xab\xab\x56\x6e\x04\xe4\xb5\x8c\xd4\x8d\x63\xda\x8d\x54\x55\x2e\xe4\x5a\xaf\x09\x24\xa1\x2e\x0c\xa4\x5a\xb1\xce\x09\x31\x6e\xef\xc7\x1f\xf9\xb1\x47\x8f\xf6\x3d\x76\xe5\x87\x73\x29\xb7\x89\x98\x43\xbc\x78\xe6\x93\xc9\xd0\x42\x27\xd7\x2a\xa3\x4a\xc2\x24\xbb\xac\x93\x12\xd0\x7a\xf9\xb1\xac\x5e\xcd\x5d\xc2\xf1\xe3\xd0\x01\x0d\xf7\xc7\x06\xe4\xcd\xde\x86\xfd\xbb\xe7\x6d\xee\x30\x8e\xaa\x9f\x49\xd9\xcc\x4b\xd7\x45\xd9\x6c\x56\xff\x4b\x29\x9b\xbd\x7e\xde\xcf\xd6\xfc\x1c\x03\xeb\x3e\x81\xbb\x09\xcb\x7d\x29\x81\xb3\xd8\xb3\x21\x76\x00\xce\xd2\xbe\x46\x9c\x6f\x25\x70\xf6\x93\x32\xbf\x38\x1b\xd2\x8d\x84\x6a\x2d\x7e\x17\x87\x33\x56\xba\x16\xb2\x54\x25\xa4\xff\xfe\x25\x49\x53\xf9\xe8\x51\xa0\xff\x31\xfe\xd7\xc1\x70\xd8\x3b\x1f\x9a\x7f\xf2\x7f\xda\xcd\x05\xff\xd2\xbf\x66\x33\xa8\x8b\x09\x1a\xdb\xd7\x03\x26\xdc\x3e\x6d\x9b\xc9\x6c\x83\xbe\x47\x92\x61\xac\xc5\x4d\x86\x80\x1c\x2d\x53\xcc\xd5\xc1\x17\x0d\x6f\x34\x84\x69\x0b\x7d\x74\x97\xd5\xa7\x04\x8d\xb4\x09\xd6\xa6\x3f\x6e\x64\xcc\xff\x5b\x28\xf6\x4e\x93\x34\x35\x40\xdc\xf7\xdc\x07\x04\xed\x54\x4a\xd7\x1e\xe3\x26\xee\x8a\x21\x39\x60\x87\xf8\x95\x55\xa9\xd2\x6b\x55\xfa\x04\x55\x06\xc2\x6f\x21\x9d\xa3\xcb\x11\xe9\x7d\x24\xa2\xdf\xc2\x82\x0a\x12\xdf\x1f\xbf\x8b\x26\xd1\x09\x32\xb3\x3e\x88\xcf\xf9\xc7\x1f\x01\x3a\xed\xd1\xa3\xaf\x61\x74\x46\x7a\xe0\x9f\xc3\xe9\xdc\xec\xf0\x37\xa6\x73\xfe\x6a\x2a\xe1\x66\xbf\x5a\x2c\xc2\xc8\xa7\xea\x3c\xf4\x20\x12\x61\x26\x10\x1e\x8c\x06\xc8\x64\x19\xbd\x8b\x86\xe3\xf3\xe8\x97\x65\x12\xfe\x45\xb8\x73\x5b\x13\xf0\xd5\xd4\xb9\xdf\x85\xc0\x70\x3c\x18\x21\x73\x68\xdb\xa6\xf9\xc5\xb8\xbc\xbe\x94\xc7\xeb\xc9\xe1\xcf\xa3\xef\xf2\x1d\x2a\x73\x49\xf0\x0d\xa9\xbb\x28\x53\xff\x9b\x72\x77\x75\x50\x77\xbd\x0c\xb7\x11\xd2\xc2\x9f\x7f\x33\xbe\xe3\xd6\xbe\x0a\xba\x77\xd5\x36\xfa\x63\x57\xa0\xbf\x92\xf9\x58\xef\x73\x6f\x33\xff\x4e\x83\xfc\x3b\x0d\xf2\xaf\x40\x83\xdc\x9b\x7d\x1d\x0d\x32\x91\xca\x68\xc1\x07\x3e\x5c\x11\xe9\x5d\x3a\x8d\x26\x53\xd2\xc4\x1d\x91\x6b\x28\x05\xf0\xa9\x7c\x1e\x3d\xfa\x46\x5c\x3e\x5e\xd3\xad\x3a\x27\xfd\x99\x2c\xbe\xe7\xa1\x06\x9d\x0f\x76\xed\x1f\x93\xcf\xa7\x23\x04\xf7\x30\x2a\x9f\xa3\xa3\x50\x9c\x0d\xa6\xfd\x68\x38\xec\x8d\xa2\xf1\xc5\xb4\x7d\xae\x7e\x11\x13\xc9\x3f\x0e\x0b\xc9\x43\x38\x19\x64\x9a\x2c\xf3\x22\x4b\xe4\x6f\xca\xca\xf0\xbe\x49\xe9\x81\x5c\x02\xa5\xbd\x1d\x31\xa9\x73\xda\x7d\x36\x14\xce\x52\x2c\x92\x2a\xf9\x8b\xca\xa0\xf2\x08\x1c\x36\xae\x05\x5a\x5c\xc9\x02\x09\x04\x30\x72\xa5\x65\x97\x78\x25\xe3\x5c\xcc\xb5\x47\xa7\x4a\xfd\x01\x84\xc5\xf6\x19\x3c\xf2\x25\x33\x33\x60\xd4\x90\x48\x16\x1d\x6a\x11\xe4\xfc\xb3\x74\x7f\x01\x47\xdc\xb0\xdf\x5b\x19\x24\x68\x5a\x9b\xa4\x09\xee\xf3\x77\x24\x17\x95\xfb\x1e\x05\x05\x27\xf7\x2f\xc1\x29\xd3\x1b\xb0\x83\x8a\x22\xb0\xc1\xce\x34\x2f\x2d\x25\xc0\x5a\x6e\xb8\xe6\xaf\x8b\xfe\xe0\x7b\x70\x59\xa1\xe6\xcf\x61\x2e\x68\x8d\xab\xd7\xc6\x70\x01\x29\x4f\x32\x31\x95\x59\x25\x45\x3f\x95\x85\xb4\x44\x15\x46\xde\x02\x27\xb6\x22\xeb\x72\x9d\x10\xdc\xe4\x1f\x7a\x67\xd3\xc7\x51\x16\x9f\xe0\xcc\x50\xac\x75\xb1\xdf\xc4\xf3\x7f\x48\x4f\x1a\x88\xe6\x1e\xc5\x05\xd9\xa9\xa7\x2a\x86\x6b\xb8\x7e\x5e\x17\x0e\x34\x5d\x0e\xa9\xea\x19\xdd\xcd\x62\x64\xcb\xed\x3b\x4c\x29\xd2\x6b\x30\x3d\xcc\xbd\xe3\xed\x5e\x86\x36\x55\x4b\x59\x95\x77\x67\x96\x07\x44\x02\x81\xcb\x86\xbc\x2d\x2d\x26\x07\x87\xc8\x41\x7d\x5a\x23\x5e\xf5\x6f\xc7\xe5\xd0\xcd\xa7\x80\x5b\xfb\xb7\x20\x54\x38\x3a\x0e\xc1\x21\x1d\x8f\x8c\x99\xa5\x6d\x23\x04\x34\x87\x27\x22\x8b\x28\x0f\xa1\x24\x4a\x24\xa1\xda\x51\xaf\x54\x47\x96\xe0\x2f\x71\xa9\xab\x75\xab\x9c\x50\x7d\xb0\x35\xfb\xf6\x4b\xb9\xe6\x21\xe8\xf5\x50\xb2\xf9\x40\xcc\x5d\x30\x64\x8c\xdc\x62\xdd\x34\x03\x5b\x79\x07\xab\xcd\xb7\xb6\x89\xcb\x78\xbd\x04\xc2\xee\x01\x51\x12\x43\x01\x76\x05\x4f\x46\x07\xc6\xd5\x42\x73\x9a\xdc\x9c\xa5\x5c\x54\x79\x51\x6e\xa5\x59\xc7\x2b\x12\x65\x91\xf9\x7c\xcc\xcd\x87\x10\xab\x87\x3b\xbd\xb3\x68\x74\xa2\xcd\xb7\xe9\x4e\xcf\x66\xe4\xcf\x3a\x02\xa8\x15\x62\x50\x76\x46\xc6\xe0\x5a\x8b\xc3\xda\x6c\xfe\x95\x5e\x92\x3f\xdd\x82\xfb\xf5\xe5\x49\xb9\xad\x49\x71\x70\xa0\xcf\x94\x2c\xc6\x2b\x3a\x62\xa4\xb1\x02\x6a\x03\x78\xf6\x1a\x40\xab\x83\x34\x41\xfb\x83\x33\x8e\xf3\x76\xc2\xf3\x96\xa0\xef\x60\x10\xba\x91\xcd\x52\xbc\x2e\x24\xc0\x31\x7b\x45\xe4\xed\x7c\x42\x33\x00\x3b\xf7\x25\xdf\x2e\x20\x5e\x15\x9d\x84\xcd\x05\xc2\x7e\xb8\xe9\x4c\x55\x21\x63\xb5\x92\xc5\xc7\xbd\x72\xdf\x71\xf3\xfd\x5a\x29\xf3\xbd\x79\x5d\x39\x0f\xe9\x0d\x6c\xb9\x30\x28\x32\xbd\x75\xa8\x03\xe7\x1e\x05\x90\xfb\xf3\xcb\xbc\x6d\xe8\x99\x1c\x01\x04\x65\xf4\x09\x64\xb8\x36\xd7\x74\xba\x11\x17\xd6\x7f\xb3\xbf\x11\x23\xf8\xce\x55\x5e\x24\x7f\x01\xbc\x17\xfd\x45\x2e\x33\x31\x0f\xa5\xba\xf5\xab\x5c\x37\xad\xff\x1e\x98\x9c\x79\x44\x14\x95\xc5\xc7\x92\x32\x23\xfc\xcb\x3f\x2f\xd2\x8a\x43\x7c\x77\xe7\xed\x2c\x6b\x69\x6d\x33\xd8\x72\x29\x78\xf3\x9c\x49\x4f\x71\x36\x39\xaf\xd7\x0f\xe6\x76\xa9\x0e\xef\x6a\xc2\x2c\x85\x5b\x49\xb8\x60\x7c\x81\x1a\x33\x20\xb7\x08\x1b\x80\x7a\x37\xab\xd7\x4c\xeb\x00\x9f\xbd\x4a\x10\x6e\xcf\x8c\x22\xdd\xa0\x7a\xa1\x4c\x64\x74\x5a\x9a\x9f\x6e\x67\x0e\x75\xf6\xdf\x4f\xe4\xd3\x9e\x41\xa5\x2e\x0b\xc9\xc0\xae\x0b\x4c\xa0\x6a\xde\xa9\xf0\xc1\x3b\x07\x62\x35\x03\x12\xe1\xcb\xbc\xdb\x40\xab\xae\xa6\xb1\xdc\x78\x09\x02\x39\x88\xd6\x92\xa4\xe3\x2c\x89\xe1\xc3\x6d\xbc\x92\x2d\x12\xff\x2e\xd4\xfe\x51\xab\x3a\x02\x64\xd2\x1b\x45\x57\x7d\x2f\xb5\x70\x04\xd9\x05\x6f\x10\x29\x07\x8d\x83\x6d\xf9\x51\x56\x53\xf1\xa4\x1a\xce\x15\xdf\x41\xb0\x18\x73\xac\x0f\x8d\xd2\x0b\x4c\x73\xef\x42\x74\x17\xdf\x85\x4f\xa8\x2b\xc7\xa1\x18\xc3\x61\x71\x4e\xac\x9c\xa1\xbf\x7a\x9c\x6f\xd6\xcc\x79\x33\x24\x9e\xce\x8d\x9a\xbb\x01\x1b\x82\xe8\xe5\x23\x53\x31\x9c\xab\x81\xe2\xda\x94\x73\x55\x37\xb9\xd8\x3b\xde\x17\x1b\x25\x8b\xd2\x85\x8d\xbe\x32\xef\x9a\xd2\x8f\xd6\x76\x0a\x8c\xf0\x60\xee\x86\x3d\x35\x4c\x87\x4d\xd8\xb4\x61\xa4\x6e\x49\x7c\x83\x9b\x7e\x69\xf9\xab\xb7\xb6\x9b\x67\x4e\x62\x11\x51\x04\xe0\x15\xd1\x9d\x78\xb6\x21\x2c\x86\xe8\x39\x80\x9d\x43\x56\x17\x8d\xb5\xe0\x2e\x34\x73\xa6\x10\x0c\xb0\x6b\xda\x5d\x73\xd6\x17\xd7\x24\x5b\xd0\x2d\x37\x5e\xbb\xeb\xbd\xf9\x0f\x38\x79\x20\xc4\x83\xd0\x63\xf1\x43\xea\xb2\xca\xd5\xc4\xa3\xbc\xd2\x43\x33\xc0\x0b\xcd\xac\x11\x67\xc7\x1d\x11\x84\x34\xf3\xb9\x19\xbf\xbc\x50\x97\xb2\x68\xd1\x0d\x22\x59\x8d\x71\x8e\x9c\x34\x91\xa3\xa3\x3d\xb9\x1f\x90\x33\x87\x9e\x54\xe3\xaa\xba\x61\x8a\x3c\xc8\x8f\x75\xb8\xc0\xc2\x9d\xdd\xd9\x97\xf0\x4a\x6d\xb3\x8f\x5c\xd2\x2a\x8f\x5d\x69\x77\xff\x7b\x73\xcf\x4c\xf4\xa2\xce\x17\xee\x66\x7e\x32\xdd\xdd\xca\xf0\xe4\xce\x84\xcf\xd3\xb4\x42\x7b\x2c\xcc\x8b\xcb\xc7\xa3\xf3\xe1\xe3\x9d\xe9\x83\xe8\x99\x84\x0b\x0d\x8b\xa6\xf7\x97\xf2\x32\x51\xb9\x25\x39\x52\x54\x2a\x9b\x26\xda\x91\x6a\xb0\x19\x19\x9f\xec\x5b\x10\x1a\x21\x71\x88\x6f\x17\x24\xe5\xbd\x76\x69\x60\x75\xe9\x99\x2c\x16\x57\xe2\xc9\x51\x20\x8e\x5e\xbe\xfc\x0e\xdb\xeb\xc8\xe6\xeb\x82\x85\x72\x2d\xe7\xed\x89\x30\xa1\x38\xe7\xba\x74\x07\x41\xc0\x5a\x7e\x10\x28\x6c\x50\xb9\x7d\xf7\xb0\x86\xbb\x28\xdd\x76\x1c\x3f\x6f\xaf\xdc\x7f\x25\xfe\xf4\xa0\x9f\x70\x77\xe7\x7f\x8c\xc6\xb3\xe8\x15\x9c\xa9\x50\xb0\xc5\xbb\xc2\x5e\x85\x63\xb6\x2e\xdc\xe1\x97\x60\x26\xb2\xc5\x53\x79\xef\x58\xe8\xfe\x8e\x34\x55\x04\x24\xee\x9a\x4f\x0a\xfe\x69\x59\xac\x4d\xba\x0f\x39\xce\x32\xd1\xfb\x54\x65\x8b\xbc\x26\x8e\xcd\x24\x13\x65\xb2\xaa\xd3\x0a\x19\xee\xd3\x0d\x86\x94\xd0\xad\xf3\x76\x08\x94\x10\x8a\x75\xa1\xd6\xb2\xe8\xb6\x24\x97\x58\xef\xa7\x05\x22\xa4\x82\x2c\x30\x79\x8c\x79\xdd\x3d\x1d\x85\xf4\x4f\x70\x2c\x73\xcb\xeb\xac\xdb\x26\x6e\xda\x5a\xed\x12\xa6\x32\xfc\x9f\xbf\x23\xbd\xfe\x63\xfe\x84\x8f\xa7\xda\x66\x94\x49\xfa\xcb\x01\xc0\xde\x8d\xff\x7a\xf8\xe2\xd9\x93\xa7\x0d\xfc\xd7\xe3\xa7\x2f\x9e\xfd\x8e\xff\xfa\x6b\xfc\x4c\xa3\xd1\xc9\x59\x6f\x30\x34\x19\x3a\x33\x8f\xb9\xc5\x18\xa0\x5d\xb4\x8e\x60\xc7\x04\x1c\xb1\x97\xa2\x50\x3e\xfc\xbb\x89\x12\x1b\xde\x2c\x87\xb1\x8a\x6b\x26\x51\x11\xb3\x10\x06\x44\xfa\xf9\xfc\xe9\x8b\x67\xa2\x7f\x55\x24\x65\x95\x28\xd1\xd3\xc6\x19\x56\x12\x9f\xa6\x79\x5e\x04\x22\x5a\xa9\x62\x73\x9d\xa4\xa9\x0a\x44\xbf\x27\x5e\x3e\x7d\x7e\xf8\x5d\x20\x2e\xa6\xbd\x80\x88\xbd\x1d\x4c\x51\xdd\x2e\x5c\x6a\xe0\xc7\xff\x7b\xc9\x02\x0f\x64\x90\xac\x6e\x21\x6c\xf5\x6a\xe7\x42\x1b\xb1\x7e\x3d\x6c\x16\x8b\x89\x3f\xb2\x4e\xae\x11\x86\xd5\xdb\xd8\x8c\x3e\x26\x57\x50\x31\x84\xde\xa0\x8c\x9b\x0a\x88\xe9\x06\x41\x16\x88\x56\x5a\xfa\x8c\x67\x5c\x4f\x04\x79\x20\x4d\x3a\x04\x77\x09\x92\x52\xac\x54\xf5\x8a\x20\x7a\xfd\x6e\x96\xe2\xcf\xb5\x4c\x93\xe5\x46\xc8\x52\xec\x2e\x0b\xa5\xb4\x45\xb5\xab\x7b\xb5\x3b\x5e\x2b\xe3\x43\xb3\xad\xb5\xeb\x46\x95\x9a\xdf\xac\x70\x7a\xa8\xaa\xbb\xf9\x21\x6d\x0c\x60\x2c\xd3\xa5\x00\x71\x32\x3d\x9c\xa8\xf9\x22\x47\x90\xc1\x95\xac\x54\x91\xc8\x14\xc5\x2a\x56\x69\x72\xad\x0a\x04\x27\xd0\x16\x74\xd7\x27\x98\x6c\x21\x61\x54\x83\x6d\x98\x28\x28\x03\x32\x13\x49\x51\xa8\xeb\x1c\xe3\x90\x08\x86\x52\xe5\x1c\x05\xbf\xe3\x7d\x88\xb3\xac\xd1\x8c\x2e\x94\x22\xcf\x94\x42\xe6\xf7\x0c\x00\xd3\xce\x8b\x46\xf7\xa9\xc6\x36\xcd\x6f\x0c\x38\x8f\xe5\xee\x27\x51\x0b\xe8\x82\xa1\x29\x53\xcd\xde\xe1\x32\x11\x64\x2a\x81\x60\x54\x0c\x16\x42\x3b\xb5\xf4\xc8\xd2\x42\xa6\x77\x68\x90\x8a\x7b\x5f\xda\x75\xbe\xb1\xeb\x63\x2a\xe3\x1d\x2d\x41\x4a\xc2\xd5\x07\x18\xb8\xd9\xc7\x16\x5d\x45\xbe\x14\xbc\xbf\xda\x68\x97\x0d\x00\xd2\xe3\xb6\xc4\xfa\xa8\x2c\x9c\x41\xe4\x50\x66\xb0\xc1\xc9\x96\x1a\x66\xf2\x6e\x9a\x7c\xc8\x4d\xcb\x0d\x7c\xbb\x52\xf9\xfa\xcc\x22\x3c\xc7\x49\x09\xb5\xf7\xaa\x78\xec\xa0\x0a\xe5\x4b\xa7\x72\xc6\x5e\x78\x23\xa2\x15\x51\xa3\x3c\x47\x52\x66\xc6\x52\x6a\x8e\x27\xc9\xdc\x5d\xce\xe3\x21\x80\x2f\x4a\xcf\xe2\x21\x61\xf1\xf4\x2f\xdd\xd3\x80\x6d\x3c\xbf\x52\x8e\x82\xce\xa8\xa6\xad\x64\x9b\xe2\x32\xe3\xe6\x79\xcc\x21\x9d\x62\x45\x03\xf6\xd1\x11\xb4\x93\xd9\x1c\xea\x2e\x12\x62\x99\x4c\x35\xe7\xd8\x21\xcf\x0a\x14\x8e\xf3\x9e\x76\xa9\xb5\x9b\x71\x70\x7c\x78\x74\xd8\x38\x34\xc0\xab\x30\x05\x7c\xe4\x55\xec\x52\xb1\xcd\xc8\x41\x29\xe5\xcc\xdb\xc6\xeb\x19\x0d\xe5\x22\x4b\x20\x37\x18\x31\x82\x9c\x5b\x7b\xfd\x80\x7e\x97\xbd\x80\xc4\x41\x32\xcf\x0b\x43\x89\xcd\x40\xac\x2a\x8b\xf3\xa2\x24\x10\xde\x7c\x95\x57\xca\x06\x3f\xf8\x54\xb0\x75\x64\x26\x8d\xc4\x04\x64\x0c\x55\x3d\xc4\x94\x6f\x0a\x7d\x32\x64\x78\x46\x94\xa5\x61\xde\x87\xc1\xec\xf2\x96\xdb\xc5\x9b\x7a\x1b\x56\x6f\x0d\x93\xeb\x3b\xf4\x5c\x75\xa9\xa8\x3b\x38\x2d\x10\x43\xca\xd4\x5d\x6d\x9d\xa7\x3c\x33\xb4\x78\x6a\x35\x57\x71\x0c\xd1\x66\x4b\xc0\xb3\x68\x88\x41\xd3\xac\x40\xaf\xc6\x37\x25\x0a\xa8\xa4\x47\x01\xb1\xc7\x50\x53\x30\xbe\xfb\x0e\xbc\xe1\x27\x30\x33\x13\x75\xe9\x52\xa0\x6d\xeb\x6e\xb7\xdc\x74\x9f\x42\xd0\x53\x8a\xbf\x6f\x39\xc7\x83\x16\xca\x64\x43\xc3\x7b\x4c\x24\x7e\xed\xe6\xd6\x53\x1e\x8e\x57\x3a\xe6\xf7\x92\xf6\xd9\xd8\x80\xec\x6d\x6a\x4d\xe4\x5c\x6a\xea\xce\x80\x4f\x08\x3c\xcd\xdc\xcf\x91\xae\xb1\x7d\xb1\x5a\x27\x14\x47\x4f\x5e\x7e\xf7\xf4\xbb\xf0\x08\x3b\xd3\xd1\x9b\xfb\x75\xde\xb7\xec\xd0\xb7\x54\x67\x34\xa4\x64\xbf\x53\x5f\x34\xa4\x88\xf5\x85\x51\x09\x94\x79\xf3\xdb\x29\x04\x2a\x8b\x3a\xb1\x47\xc4\xd0\x3b\x22\x86\x7c\x44\xbc\xc2\xbc\xc6\xe9\xf8\x74\xf6\xbe\x37\xf1\x93\xf6\x5f\x7f\x10\xec\x13\x04\x48\x42\xde\x1b\x9d\xb8\x69\xac\x53\x13\x60\x83\xc4\xcc\xd1\x87\x0e\x52\xf3\x6e\x7a\xf2\x40\xbc\xbe\x98\x41\x4e\x20\xa4\x09\x46\x27\x62\x36\x0e\x30\x85\xb6\xf5\x5a\x07\x4f\x39\x7c\xef\x3e\xaa\x72\xa1\xc7\x63\x72\xbd\x4f\x42\x31\x18\x89\xd1\x18\xf2\x42\x67\x94\xb0\xe9\x0f\x0f\x3b\x30\x89\xde\x44\xa3\xd9\x94\x73\x42\x2f\x46\x83\x77\xd1\x64\x4a\x29\xa1\xfd\xde\x70\x70\x3a\x9e\x8c\x06\x3d\xca\x87\xb4\x53\x61\xb3\x70\x4f\x4d\x72\x2f\x26\xda\xda\x94\x5b\x37\xd3\xd6\xa4\xdf\x46\x3f\x44\x67\xe7\xc3\xde\xe4\xc3\x1d\xd9\xb7\x7b\xf7\xcc\xdc\xf9\x64\xdc\xbf\x98\x00\xf7\x3a\x66\xae\xbe\xa6\xac\x7a\xc8\xb9\x85\xf5\xc0\x34\xfd\x68\xfa\xbd\x49\xc7\xbd\x98\x46\x81\x38\xe9\xcd\x7a\xf0\xe1\xf3\xc9\xf8\x74\x30\x9b\x7e\xaf\xff\xfb\xf5\xc5\x74\x00\x73\x3b\x18\xcd\xa2\xc9\xe4\xe2\x7c\x36\x18\x8f\xf6\xc5\xdb\xf1\xfb\xe8\x5d\x34\x11\xfd\xde\xc5\x34\x3a\x81\x45\x18\x63\x99\x01\xe6\x51\x7b\x39\xb1\x36\xa9\x7a\x30\x72\x52\xa7\xa7\xb3\xc9\xa0\x3f\x73\x1f\x1b\xdf\x95\x76\xed\xa5\x5a\xef\x8b\xde\x64\x30\xd5\x0f\x50\x75\xc3\xfb\xde\x07\x31\xbe\x98\x99\xb5\x9a\x46\xa6\x64\x80\x25\xda\x26\x02\xf7\x4e\xde\x0d\xa6\x0f\x4c\xf6\xfd\xcf\x13\x85\xa1\xff\x57\xe2\xbb\xf0\xe8\xb9\xf8\xcf\x81\x18\xca\xb2\x32\x0c\x65\xff\xf9\x44\x56\xea\x95\xd0\xb6\xc7\xe3\xa3\xc3\xc7\xc7\xcf\xc4\xf1\x93\x57\x47\x47\xaf\x8e\x5e\xea\x47\x4f\x18\xaa\xd0\x28\xc8\xdf\xda\xb7\x7f\xc8\x4f\xf8\xb8\xdf\x3f\x78\xfd\xe1\x60\xd4\x3f\x18\x9d\xfc\x42\x3c\x40\x77\xc7\x7f\x8e\x9f\x3d\x7d\x7a\xd8\x8c\xff\x3c\x3f\xfe\x9d\xff\xfd\x57\xf9\xe9\x03\xf1\xce\x35\xc6\xeb\xf5\x59\xdb\xab\xcc\x79\x78\x30\xca\xa1\x8a\xb1\x3c\x18\xe5\x59\xdf\xe6\x3e\x1f\x85\x87\xa2\x3f\x89\x7a\x50\x72\xd4\x1f\x9f\x9d\x8d\x47\x53\xd1\x1f\x4f\xce\xc7\x13\x4c\xfd\x1e\x4c\x31\xf3\x1b\xf2\xd4\x4f\x07\x93\x33\xd0\x1a\x27\xe3\x08\x7f\x4f\x67\x0d\x55\x63\xb0\x8a\x0a\x6d\x5d\x04\xe5\xa1\x63\xdd\xce\xa4\x77\x3a\x33\xd1\x29\xd3\x06\x7c\x3f\x12\xbd\x91\xe8\xcd\x66\xe3\xc9\x28\xfa\x70\xd0\x1f\x0e\xb4\x26\x9c\x44\x43\xe8\xc5\xf4\xed\xe0\x3c\x6c\xf7\x93\x3e\x3e\xc5\xd6\xb1\x18\x80\x32\xdf\xa1\x36\x6d\xb7\x37\x3d\xd0\x87\x1b\x54\xa6\x75\xbc\x7f\xd6\xfb\x23\x74\xc1\x3d\xab\x26\xd1\x9b\xde\x04\x74\x18\xd6\x83\xd8\x36\xf9\x58\x0d\x70\x06\xe8\x5c\x9a\x36\xeb\x04\x48\xe1\x37\xca\x02\x06\xb3\xa9\xd6\x6e\x26\x46\xb5\xa3\x5b\x87\x22\x8a\xbd\xde\x54\x9c\x44\xa7\x83\x91\x3e\xb0\xa3\xe1\xf8\xfd\x7e\x67\xe1\x5d\x04\x35\x4e\x53\x33\x97\xed\xc9\xf0\x48\x9f\xc4\xde\x6e\xbf\x7f\x3e\xdc\xd5\xea\x77\x97\x7e\xb7\xbb\x8f\x05\x6d\xf0\x59\xfc\xc6\x2c\xea\xcf\xd0\x50\xe8\x8f\xcf\x3f\x4c\x06\x6f\xde\xce\xf4\xe8\x1e\xb3\xd2\x6e\x14\x2a\x84\xa0\xb4\x8d\x96\xa6\xa6\xf0\xc9\xd9\x5b\xbd\x80\x5e\x0d\x57\x47\xd1\x20\x7e\x16\xee\x40\xa3\x93\x70\xe7\xb5\xb6\x38\xa2\x49\x1f\x0f\x05\xa8\x77\xd3\x7d\x30\x55\x76\xd0\xbe\x99\x8b\xb7\x91\x3e\x0e\x3e\x8c\x2f\x44\xaf\x0f\x35\x61\x60\xb5\xbc\x99\x44\x50\x5e\xf1\x3a\x12\xaf\xc7\x17\x23\x18\x4d\x7b\xbe\x4c\x05\x9a\xfe\x13\xfe\x63\x3c\x11\x6f\xf4\xb2\x4f\xa1\x49\x30\x1d\xf0\xe3\xfa\xb0\xeb\xc1\x82\xe8\x2f\xd2\xf1\x37\x1d\x9c\x44\x13\x53\x57\xf1\x61\x7c\x31\xa1\x5e\x70\xd9\x1f\x1c\x40\xf8\x51\x32\xb3\x4e\x06\x20\xbc\x61\x9b\x75\x8b\x59\x50\x43\xed\x11\x43\xd6\x32\x17\x17\xef\x7a\x2c\x41\x94\xe2\x0e\x10\x17\x6b\x55\x24\x79\x0c\x4c\xb4\xc0\xfd\x10\x08\x99\x55\x57\x79\x9a\x5f\x6e\x90\xd2\x68\xb1\x59\xa4\xf9\x5a\xc5\x89\x0c\x6c\x06\xb8\x36\x6b\x01\x26\x23\xc9\xc0\xaa\x55\x59\x95\x14\x0a\xe0\x43\x5c\x38\x70\xcc\xbb\x71\xa8\xa2\xa5\x93\xf5\xc8\xa8\x1d\x99\xf5\x0c\xb0\xea\xa2\x4a\x2a\x64\x66\x2e\xd5\x5a\x42\x66\x10\xde\x74\xc5\x6a\xad\xb2\x18\x8a\x1e\xf2\xe2\x23\xdf\xc1\x51\xd5\x6a\x40\x2e\x60\xa9\x56\xf3\x14\x19\x51\x72\x88\xdf\x99\x79\x00\x62\xe3\x50\xf4\x1c\x3a\x64\xf3\x35\x85\x20\x6c\xde\x9c\x59\x0a\x4a\x3f\x2d\x48\x36\x2b\xb7\xc5\x9e\xb4\x65\x25\x10\x42\xd9\xb7\x34\xbf\x4d\xea\x8a\x46\x25\xf8\x3c\x14\xbb\x8d\xe6\xfc\xb5\xa2\x9c\xd1\x7a\x4d\x31\x12\xf8\x20\x04\x1f\xdd\x5f\xd8\x04\xcf\x75\xa1\x0e\xd4\x27\x2a\x5c\x81\x79\x72\x57\x1b\xd8\xb3\x18\x36\x62\x55\x13\x03\x71\x51\xc8\xec\x92\x18\xc5\xe3\x42\xae\x64\x45\xe9\xac\x81\x58\x26\x8c\x98\xc9\xbf\x59\xe5\x88\x40\x98\x2c\x5c\x7c\xeb\x40\xfb\x97\x10\x9b\x5c\x00\x96\xc4\xa5\x5e\x0f\xeb\xd5\x91\x6b\x3b\x2f\x92\xf8\x12\xbf\xa3\x9d\x37\x95\x95\xd4\x28\x95\x77\xe3\x10\xc0\x29\x6c\x8b\x1a\x39\x4b\x85\x5a\xc8\xb2\x0a\x88\x08\x0c\x0a\x32\xf0\xfd\x58\xae\x2b\xfd\xdf\x2e\x03\xb4\xfc\xf6\x8b\xdd\x58\xd9\x6d\x0b\xbb\x08\x39\x67\x22\x2f\x76\xef\x63\x0c\x83\xfe\x41\xf4\xb9\xb4\xe3\xbd\x07\x7f\x8b\x3f\x14\x87\x62\xd7\xdc\xc6\xf6\xea\xea\xea\x01\xdf\xbb\xb9\xca\xcd\x95\x3d\x7f\x8f\xdb\x53\xa1\xd8\x75\xc5\xd0\x8b\xaa\x42\x34\x17\xa6\x34\x5f\x0a\x09\x1f\x23\x3c\x58\x04\x36\x7a\x60\x9f\x97\xa1\xd8\xfd\x90\xd7\xbb\xdb\x68\x70\xee\xa6\xbf\x69\x80\xd4\x00\xf5\x2c\xe1\x20\x12\x97\x55\xba\x11\xd7\x49\x9e\x9a\xf1\x3d\x0c\xde\x86\x67\x02\xc4\x89\x9b\x35\xf9\xd5\x9c\x00\x62\xdd\x69\x9b\x21\xc0\x0b\x0d\x4e\x3c\x76\x5a\xdd\xd1\xe5\x58\x95\xff\x1f\x7b\xef\xb6\xdc\x46\x92\xa6\x09\xee\xb5\x9e\xc2\x8d\x37\x22\x7b\x82\x90\x48\xa5\x32\x2b\x33\xd7\xd6\x06\x49\x41\x4a\x76\x53\x24\x9b\xa4\x2a\x2b\x2f\x1d\x80\x83\xf0\x52\x20\x02\x1d\x1e\x41\x0a\x7d\xb5\x0f\xb1\x0f\x30\xb7\xf3\x08\x7b\x3b\xf3\x26\xfb\x24\x6b\xfe\x9f\xfc\xf7\x88\x00\xa9\xac\xae\xc3\x4c\x5b\xca\xac\xbb\x92\x24\x10\xe1\x67\xff\x0f\xdf\xff\x7d\x5b\xdf\x22\x11\x31\x89\x6f\x61\x73\xd9\x47\x3f\x9d\x98\xf7\xd6\x83\x06\x32\xc1\x20\x26\xe6\xb2\x6e\xd7\xc2\x0e\x90\x02\xf7\x40\xf5\x53\xb5\x0e\xf0\x5d\x00\xa8\x44\x65\x08\x88\xfd\x16\x9a\x9e\x5d\x23\x6c\x09\xdf\x8e\x3d\x58\xc5\x57\x41\xae\x61\xe5\x9b\xd0\x9a\x60\x51\x00\x9e\x33\x72\x0a\x13\x55\x11\xbc\x90\xd5\x2d\xe8\x71\x14\xfb\x48\xf1\x1a\x60\x0a\x16\x69\x1f\xfe\x2d\x15\x1d\xe0\x73\xf3\xea\x25\xd1\x1a\xe0\x31\x22\x71\x9a\xdb\x31\x4c\x59\x2f\x1c\x38\x80\x98\xc9\x74\xec\x15\xee\x78\x56\xb7\x03\x94\x34\xb6\x0e\x20\xbc\x87\xbc\xe5\x97\x5d\x93\x95\x6a\xa8\x2e\x48\x27\x8f\x52\x5c\x5e\xad\x05\x55\x28\xee\xf5\xb1\x8d\xf2\xff\x7c\x6d\xfc\x90\x2e\x70\x98\x49\x1d\x11\xc3\x85\x09\x15\x49\x82\xd2\xd3\xd7\x70\x8f\xbb\xb2\x77\xbc\x05\x45\x97\xd3\x7f\x6a\x6c\x45\x06\xfd\xa3\x16\xf6\x1f\xf1\x63\xba\xb2\x72\xd8\x2d\x97\x2f\x34\x66\xbb\xae\xab\x1a\xaf\x00\xd4\x9f\x22\x5d\x12\x64\x60\x59\x94\x49\xa0\x44\xfd\x26\x36\xac\xff\x5b\x33\xdf\xd1\xd9\x00\x55\x27\x4b\x7f\xef\xdb\x78\x53\x75\x4b\x5f\xe3\xc9\xcf\x7b\x50\x0d\x81\xe4\x92\x86\xfd\xd9\xd7\x97\x3b\x89\x35\xd2\xec\xd0\x25\xc3\x13\xb7\x64\x72\x62\x62\xd8\xaf\xd0\xa6\xb1\xc0\xa6\x8b\x6a\x50\x55\x8d\x8c\xbf\x55\xae\x45\xb2\x44\x26\xa0\xc9\xf0\x15\x89\x42\x57\xf3\xcb\x20\x81\xd8\x62\xdd\x63\xdb\xb0\x18\xdb\x6d\xdd\x62\x5d\x11\x75\x40\xae\x25\x32\xbe\xc2\x28\xac\xd9\x6f\x74\x16\xca\x8e\x07\x66\x2a\x0f\xe2\x22\xff\xf9\x2e\x6d\x9f\xf8\x66\xda\x42\x59\xdc\xfb\x9b\x89\xb9\xa1\x43\x05\x4b\x06\xef\x14\x3f\x0a\x3f\x48\xb3\x63\xd1\x00\x64\xf5\x48\x90\x0d\x56\x70\x44\x41\xc4\xa5\x04\x42\x8a\xe6\x36\xea\x75\x6a\x97\x0c\x89\x16\x8b\xb4\x84\x92\x26\x0e\xff\x46\xc4\x71\x40\x53\x4c\x3e\x06\x6b\x2b\xfd\x59\x99\x59\x5f\x21\xf6\xf1\x9c\x5a\x47\x61\x52\xd6\x08\x9e\x7e\xe3\x28\x12\x7f\xce\x32\xa1\x0d\x72\xd6\x3e\x2d\xeb\x91\x6d\x2e\x3e\x80\xa0\x95\x39\xd1\xe1\x5f\x61\x00\x7e\x83\x42\x88\x34\x22\x49\x82\x64\x57\xce\xfe\xcb\x77\x44\x03\x44\xd6\x32\xf5\x6e\x1f\xb3\x46\xde\x3e\x25\x74\x24\xa6\x4c\x9a\x8f\xcf\xce\x6d\xe3\xe9\x68\x17\x90\x5c\x97\xac\x30\xb4\x17\x92\x8b\x83\xaa\x50\x3a\x28\xf3\x5c\xaa\x62\x98\xf5\x2e\xe4\x2d\xf8\x1b\xad\x3e\xe1\xe8\x83\xcd\x1f\x3d\x32\xb0\xd6\x37\xce\x86\xae\xe1\x2e\x30\xc7\xb7\x5d\x2c\x08\x9d\xda\xa5\x01\x64\x0f\xcd\x9a\x8d\xad\x2a\xc8\x84\x2c\x7a\x95\xe3\xfb\x27\x48\x49\xc1\xa7\x23\x4c\x11\xb9\x3d\x75\x7d\x0c\xcc\x6b\x54\x4f\x22\x69\x58\x2a\xfb\xa1\x22\x8e\xb1\xbb\xc6\x58\x50\x84\x12\xfb\x0a\x3b\xd2\x06\x57\xae\x98\x93\xa8\x77\x7a\xec\x37\x39\x73\x8a\xee\xb1\xa6\x81\x2b\x45\x54\x49\xf0\xca\x38\xe8\x72\x08\xf2\x52\x2a\x06\xcc\x7c\x76\xd1\xe2\xed\x5f\x98\xc6\x6d\xe2\xf0\x48\x83\x07\xfd\x89\xa6\x97\x03\x2c\xfb\x22\xe9\x81\xc8\x3b\xea\x9e\x3a\x26\x9a\xf1\xa0\x96\x15\x47\xc9\x85\x36\x51\xc7\xcf\xf3\xc5\x27\x9b\x46\xb1\x39\xf6\x36\x4e\x5b\x13\x4d\xf0\xf0\x40\x46\xee\x5c\x5a\x1d\xb0\xa0\x7c\x30\xdb\xc6\x6f\x6c\xe3\xcb\x5d\x32\x2c\x57\xd8\x48\xac\x7f\x84\x47\x3e\xda\x06\x24\x28\x39\xe4\x67\x97\x0f\xb6\x6a\xa1\x4e\x34\x3a\xa1\xd1\x65\x72\x66\x53\x57\xae\xb5\x70\x86\x6d\xb6\xec\xed\xe1\x7a\x72\x5f\x50\x9f\x23\x5b\xab\x2b\xb1\x0e\xc5\x9e\x22\x64\x54\xc8\x2c\x02\xb6\x07\x56\xbe\x74\xc7\x61\x8d\xe8\x57\x2d\xc5\xa8\xea\x4e\x73\x7f\x0e\x57\xcf\xdf\xa4\x5f\xb9\x96\x68\x43\x52\xb3\x66\x6b\x77\xac\x26\x89\xd0\xaf\x91\xaf\x22\x62\xbe\xaa\x68\x7a\x64\x67\xea\x41\x1a\x8c\x88\xf2\x34\x89\x38\xee\x6f\x75\x0d\x32\x05\x6d\xdf\xa4\xdc\x7b\xca\x0e\x51\x38\x6c\x42\x4b\xb4\xe2\x3e\x3e\x67\x64\xd1\xc7\x7d\xba\xf4\xad\xc6\x83\x31\x01\xa8\x5b\xfa\x6e\x03\x16\x2e\xac\x03\xae\xe1\x4d\x35\xaf\x28\xcc\xf9\xe0\x76\x99\xa4\x0a\x08\xa8\x05\xd7\x2d\xeb\x6a\xb7\x01\x92\x04\x31\xdb\x8f\x06\x70\x6d\x6a\x04\x54\x89\xc1\x59\xb7\xfc\x11\xcf\x16\xdf\x96\xbd\x73\x35\x7d\x84\x10\x5d\xd4\x72\x32\x21\x45\x4b\x21\x71\x54\xab\x3e\xe1\x96\xfb\x51\x96\x4c\x61\xd6\xcc\x28\x8f\xdb\x90\xe0\x4c\x36\x50\xe1\xf5\xe0\xd4\x82\xe8\xc6\xc6\x57\x40\x8a\x1a\xd4\xfb\x21\x92\x41\x68\x27\x2e\x94\xde\xc9\xb6\xda\x6c\x6d\x83\x00\xad\xe4\xbd\xd3\x17\xf1\x3b\x81\x71\xe5\x72\x6b\x08\xdd\x83\x0d\x4a\x39\x87\xc9\x4b\x9e\x7f\x30\x43\x4a\x6e\x98\xd9\x83\xc5\x00\x7f\x91\x0b\x15\xde\x99\xd2\xd2\xc9\xc2\xfb\x69\x97\x0b\x7b\xc9\x31\x81\x0b\xf7\x09\xa5\x67\xe5\x06\x2a\x4a\x11\x20\x25\xc7\xd7\xe2\x0d\x2a\xc7\xfa\xdc\x21\xaa\x80\xbf\xf5\x32\x0c\x34\x51\xd4\xfc\xf9\x2a\x5e\x5e\x3b\xa5\xd0\xe8\x27\xca\xef\x8c\x83\xe3\x16\x1d\x44\x90\x92\xc5\xad\x5d\xbf\xcc\x8a\xc7\x0a\xd8\x56\x59\xd1\x7d\x3d\x34\xb6\x4a\x10\x19\x82\x1f\xb5\x8f\xab\xae\xfc\x6a\xab\x49\x60\x02\xc4\xc6\xce\xac\x17\x4a\x00\xa0\x85\xd3\x0a\x97\x2a\xb8\xc6\x20\xf2\x0b\x44\x36\x65\xa8\x9b\x54\xb3\xb5\x72\xf1\x0f\x8d\x0b\x10\xb1\x09\x79\xf8\x8e\x0e\x3c\xf1\xb1\xe2\xd8\x78\x3c\xf4\xa1\xe7\x62\x00\xf8\x6a\x15\xe7\xd5\xe5\xb1\x83\x22\x81\x93\xf8\xcc\xf2\x42\xb9\x51\xb0\x50\x70\x69\x1f\x25\xf8\xa0\x5f\x4e\xe1\x07\x3c\x6b\x75\x89\x2a\xea\xa1\x50\x00\xd0\x2c\xdd\xca\x6e\xe8\xd4\xf6\xd5\x83\x65\x92\x18\x38\xe0\x17\xbb\x14\xa5\x68\xa1\xc2\xa5\x8b\x73\xf7\xe7\x0e\x27\xab\xf7\x64\x75\x2f\x13\xa7\xdc\xf4\x96\x01\x0f\x17\xbf\x9a\xdb\xbb\xe9\xdd\xec\x9d\x39\xbf\xec\xd1\x1c\xaa\xfc\x35\x26\x1b\xe0\x33\xbf\xdc\x9c\x43\x76\xe7\xea\xc6\xdc\xcc\xfe\xf5\xd3\xf9\x0d\xa6\x51\xf2\x7c\x49\x91\xe5\x5b\xe8\x89\xef\x52\x76\xca\x48\x76\x6a\x50\xdb\x74\x9e\x28\xbb\xc6\x98\x13\x35\x40\xe3\x19\x22\x2f\xcc\xb3\xef\x49\x70\x9d\x5d\x5d\xde\x21\x5a\x02\xd2\x19\x9f\x6e\xa6\x67\xbf\xea\xe4\x0e\x03\x51\x34\xfa\xa4\x4a\xe8\x13\x19\xc9\x9c\xde\xea\xa9\x11\x99\x5e\xbe\xe3\x2f\xe9\x7c\x19\x03\x03\x20\x5b\x96\x52\x6a\x77\x57\x66\x1a\xe7\xe3\xe6\x1d\x51\x80\xf5\xf2\x6a\x3f\xdd\xcc\xa6\x67\x3f\x4b\x8b\x53\x37\xcf\x2f\xcd\x2d\xf2\x17\x9a\xb7\x45\x86\x1c\xf9\xe5\xfc\xe2\x22\x65\x80\x86\xdc\x6b\x88\x4c\xd0\xf4\x72\x02\x08\x19\x65\x5c\xcb\x00\x1f\x85\xb9\xfe\x74\x79\x0e\x89\xb9\xab\x9b\x84\x0c\x19\x74\x53\x40\x0f\xf9\x4a\xcb\x40\x10\x38\x03\x09\xff\x20\x6d\xfe\x79\x7a\x8b\xfc\x67\xbf\x01\x11\x41\xdc\x9f\x77\x89\xa6\x2f\x1d\xdd\x7f\x45\xb6\x44\xb0\xd0\xe3\xbe\x23\xe2\x43\xe2\xcf\x7f\x8a\xbc\x7c\x62\xce\x25\xa4\x1c\x24\xa6\xec\x81\x3c\xa4\x46\x35\x0a\x09\xed\xf6\x2d\x1b\xb4\xe3\xe3\x1b\xc6\xae\x15\xb9\xa8\x25\x65\x00\x4f\x43\xbc\x67\xe2\x56\xe4\xae\x28\x0c\x1f\xdc\x97\x7e\x4f\xb3\x12\x0d\xe2\xaa\x2b\xcb\x91\x02\xca\x3a\x61\x7e\xc3\x84\x4d\xf9\x60\x4e\x0a\x73\x5a\xc4\xd5\xf8\x6d\x61\xbe\xc3\x68\xc4\x1f\xb0\x69\x5f\xcb\xd4\x98\x0e\xb0\x5e\xb4\x15\x9d\x84\xb1\x98\x6b\x91\x5d\x56\x7a\x36\xa9\x4c\xe1\x2f\x09\x9d\xea\xfb\xf1\x68\x32\x5a\xa0\x4b\x65\xb8\xea\x66\x87\xb0\x54\x8f\xac\x99\x8d\x82\x5e\x2a\x65\xa8\xf1\x40\x2b\xa7\x41\xd6\xfa\x7a\xab\xc0\x7e\xda\xde\x60\x99\x07\xbf\x71\x23\x16\x5b\x4f\xff\x17\xea\x4a\x84\xc0\x1b\x22\x14\xb1\x89\xc0\xae\xe2\xdb\xf5\xb2\xb1\x8f\x3d\x16\xaa\xec\x02\x4b\xb1\x0c\xdb\x0a\x3f\x37\x6b\xe5\x6b\xde\x83\xb9\x2b\x64\xe0\x9f\x89\x51\x1d\x8d\x48\x64\x41\xeb\x84\xb2\x9b\x57\x1d\xf0\x95\x21\x4f\x11\x72\x71\x52\xe9\x8e\x5a\xcd\x29\x66\x0d\x93\xc1\x5c\xa9\x1f\x7d\x58\xb8\xb2\xc4\x9a\xc5\x74\x08\x00\xa5\x39\x94\x3b\xf6\xf4\x38\x7e\x83\xef\x31\xb4\x7d\xb3\x9c\x0b\xe7\xcd\xea\x3c\xa0\xa4\x54\x54\x74\xb4\x42\xcb\xa6\x8e\xd7\x2c\x85\xd1\xb5\x4d\x4e\xf4\x7e\x4e\xef\xf9\xd7\xd1\xce\x45\x6b\xa3\xf4\x50\xf9\x93\xd1\xce\x31\xf1\x7a\x9f\xd3\xad\xd5\x14\x4a\x38\x27\xb1\x79\xf0\x10\x52\x36\x92\xa7\x88\x6e\x2d\x0e\x44\x3c\x4f\x96\xa9\xc4\xf7\x89\xf0\x25\x9b\x86\x5c\x78\x62\x71\x05\x53\x18\x56\x31\x00\xc1\x57\xa5\x6c\xeb\x2b\xa8\xf2\xd8\x77\x23\x3f\x65\x2f\x5b\x5e\xef\x41\x38\x46\xb0\x0e\x15\x87\x5e\x72\x78\x2f\x6b\xe4\x73\x44\xa4\xec\x9e\xd1\x96\xd6\x10\x9b\xf5\xa3\x85\xd3\x1e\xa5\xb8\xf8\x2a\x89\x46\xa1\xe3\x19\xa6\xd5\x4e\x12\x5a\xfe\x01\xa3\x99\xf4\x91\xf4\xbc\xc4\x34\x87\x7a\x84\xfe\x5e\xa9\x8d\xa0\xb9\x89\x71\x06\x2c\x73\x22\x30\xf1\xf8\x53\x55\x1a\x37\xbb\x30\x75\xb6\x1a\x42\x01\x80\xb0\x50\x25\x73\x73\xd7\x3e\x3a\x57\x65\x33\xb4\x2f\xa3\x99\x08\x63\xe2\x11\x0d\xb6\x78\xe3\x88\xd8\x47\xc9\x3b\xf8\xea\x3e\x14\xe9\x15\x24\xee\x9c\x39\x6d\xfb\x5f\x01\x27\x9d\x10\x8e\xe0\x7b\x64\x8f\x66\xe1\x98\x39\x20\x05\xe6\xe8\x68\xe4\xcc\x0f\x4c\xac\x20\xfa\xe5\xa9\x6a\x07\xe9\xdf\x55\xc9\xb8\xdc\xd2\xbd\x91\xe3\xc8\x98\x30\x97\xbb\xb4\xc0\x61\x2d\x76\x70\x35\x31\x3c\x5a\x15\x21\xae\xf2\x83\x85\x02\xfb\x93\x17\x03\x08\x1c\xd3\xe6\xa7\xc9\x1e\xe3\xb8\xf8\x0c\x7e\x8e\x08\x93\x99\xc7\xb5\x6d\x43\x0d\x57\xc6\x9e\x78\x0f\x06\xaf\x07\xaf\xd3\xd8\x84\xd2\x73\x4c\x04\x2c\x20\xbc\x3a\xc8\xc5\xc1\x41\x2a\xdd\xbd\x2d\xe3\xe3\x6a\x04\xd8\x23\xb7\x21\x11\x9b\xa5\x36\x3c\x23\x98\x0e\xa2\xf2\xc8\x46\x53\xe0\xbc\xc6\xff\xf0\xd5\xc2\x2f\xe3\x62\x28\x65\x09\x83\xf2\x82\xb7\x65\x9f\x3b\xad\xd7\x47\x1e\x23\xa9\x37\x1b\xbb\xde\x57\x75\xe3\xee\x6b\xf8\x89\x18\x5f\x60\x6f\x56\x8b\xe8\x6e\xfa\xd5\x70\x64\xe2\x05\x99\x52\x4a\x9e\x33\x2a\x4b\x0e\x16\xd3\x61\x9e\x25\x84\x61\xbd\xab\x93\x15\xac\x37\xe5\xa5\x03\x96\x26\xa7\xde\xe1\xef\x4f\x5e\x10\x13\x1d\x9b\x35\x9c\xb0\x52\x60\x90\x68\xdf\x2d\x32\x71\x30\x0a\x55\x48\x05\x07\x86\x8f\x14\x8b\x53\xba\xbe\xcf\xce\xae\x2f\x0a\x53\x51\x6d\x01\x4e\x2b\xcc\xfe\x90\x0f\xeb\xa0\x3f\x18\x07\xbc\x1a\x58\x11\x45\x15\xf9\x34\xc4\x88\x35\x32\x84\x7a\x6b\xe4\x85\x03\x7c\xee\x8d\x7c\x0b\x49\x04\x53\x99\x4a\xc7\x16\xc5\x7c\x54\x58\xac\xff\xf5\x97\xf1\x6d\xd5\x31\x28\x4d\x55\xad\x6a\x68\x17\x80\x2d\xa3\xf3\x4b\x57\xfa\x0a\x50\x5d\x92\x93\x4d\x2a\x1e\x35\x82\xce\x1e\xdd\x3c\xf8\xd6\xe5\x81\xdf\x9e\xf4\x36\x78\x0e\x14\x43\x1f\x91\x5c\x19\x6e\x6d\x7a\x19\x49\xe5\xc6\xeb\x42\x78\x48\x16\xf4\xd9\x05\x8d\x41\xdd\xdc\xbf\x9a\xfc\x6f\x81\xe1\xfe\x8f\xfc\x9b\xbc\x9a\x36\xad\x0f\xad\x5f\x1c\x9f\xfe\x4d\xc0\xdf\xcf\xe3\xbf\x4f\x4e\x4e\xfa\xf8\xef\x37\xaf\x5f\x9f\xfe\x8e\xff\xfe\x7b\xfc\xbb\x5b\x3b\xc3\x2b\x40\xee\xd8\xd3\xc9\xeb\x17\x79\x6d\xdd\xe9\xeb\xd7\xaf\x8f\x4f\x5f\xbf\xfe\xb6\x80\x48\xdf\xb5\x6b\x4a\xf3\x3e\x5e\xf4\x84\x6a\x9a\x3d\xb8\x66\x57\x57\x2e\x2f\x63\x07\x8e\xce\xed\xae\x2f\xc6\xf6\xe0\x9a\xb9\x6d\xfd\x46\x31\x63\x66\x98\x27\x2e\xe5\xc2\xb4\x22\xe4\x48\x90\xd9\x38\x09\xda\x94\xf5\xa3\x5b\x4e\x5e\x5c\x37\xce\x6e\xe6\xa5\x7b\x71\xa7\xbf\xef\x42\x6b\xf1\x30\x09\xca\x34\xa6\x40\x04\xb2\x92\x91\xee\xd2\xaa\x71\x2e\x55\x5a\x5d\xdb\xc5\xe7\x78\x40\xc9\x21\xb1\xf5\xd1\x11\x64\x33\xa3\xd0\x5c\x43\x05\x97\x98\xa9\x4a\x45\xc6\x83\x40\xfe\x09\x1a\x2b\x97\x42\x1a\xcd\x9f\xeb\x72\x09\x35\x69\x9e\x84\x66\x40\x76\xcd\xf2\x14\x70\xc6\xb7\x7e\xa0\x3b\x63\x89\x5c\x3e\xc9\x84\xb1\xad\x34\xf4\x71\xed\x4b\x67\x42\x0b\x52\xe0\xce\x6d\xf9\xa2\xe5\xbf\x67\x52\xde\xf5\xd6\x65\x55\x8b\x59\xdf\x27\x2f\x38\xdf\x42\x72\x4f\xd9\x24\xa2\x60\x77\xc2\x91\x42\x94\x25\x3a\x74\x75\xd7\x06\xbf\x74\xc3\x19\x64\x5e\x55\xb1\x7d\x06\x03\x00\x69\x0f\x9c\x05\x6a\x2e\x78\x58\x43\x57\x26\xad\x0a\x04\x01\xa6\x10\x39\xf8\xb4\x1d\x7b\xd3\xbb\xba\x03\x0a\x67\xa2\x1e\x84\x36\x93\xcd\x47\x2f\x40\x65\x23\xe2\xc8\xa1\x2b\x60\xbc\x71\x60\xf7\x3b\xf7\x79\x44\x3a\x12\xe9\xc0\x64\x28\x26\x2f\x7a\x08\xed\x5e\xc5\x32\x3e\x70\x1c\xb2\x79\x18\x8e\xe0\x76\x6b\xee\x6d\x45\x00\xdc\xf8\xab\xca\x6e\x12\x4c\xab\x9f\x6b\x13\xdb\x84\x3c\x06\x1e\x3b\xf5\x6a\xa9\x40\x4c\x00\x4c\xb6\x21\x25\xec\x20\xb8\x6c\xaa\xcd\x35\x83\x62\x49\x36\x6f\x64\xec\xa2\x91\xbe\x58\xd4\xcd\x32\xa7\xfd\xea\x77\xf5\x25\x64\x91\x16\x6e\xd9\x35\x2e\xa4\x66\x01\x1e\x34\x0e\xeb\xc1\xae\xee\xf2\x96\xb9\x26\x00\x41\x71\x4d\x84\x8d\xa5\xff\xec\xf8\xe8\x28\xb2\xac\x27\xc0\xdf\x44\xa9\x6b\xd0\x75\xfa\x45\x0e\x6d\x2d\x39\x60\x53\xaf\x88\xc3\x49\x33\x86\x91\x57\xd7\xef\x44\x41\x94\x0e\x8c\x0d\x4e\xda\x66\xea\x81\x5c\x63\xba\xa2\xe8\x1d\x3c\x7d\x62\xa6\xf9\xaa\x66\x39\xd7\x40\x65\xad\xaa\xb0\xf4\x36\x1a\xc7\xb6\x59\x32\x1f\x1b\x02\x9d\x89\x7d\xc4\xc9\xaf\x53\x07\x45\xbe\x58\xfa\x88\xe1\x2a\x14\xe9\xd5\x64\x16\xfc\xf2\x38\x62\xc8\xea\xe9\x5b\x42\x91\xb0\x92\xb8\xad\xe0\xc0\x76\x65\xc0\x91\x1d\xe4\x24\x91\x6b\x63\xd7\x5f\xa2\x90\x52\x23\x52\x5a\xb5\xff\x41\x54\x6b\xcf\x57\x46\x7a\x50\x37\xe6\xbd\x73\x7a\x1d\xac\x9c\xda\xc8\xc4\x20\x12\x17\xfb\xbb\x3c\x68\xe7\x83\xee\x5c\xea\x3f\xc9\x42\xd3\xfe\x50\x9f\x82\xae\xd6\xc9\xe2\x9e\x98\xf3\x36\x65\xa9\xe2\xfb\xd5\xce\x5e\x39\xbd\x68\xfb\x13\xd4\x27\x2c\xe0\x57\x78\x50\xe5\x64\x98\x32\x6a\x3b\xcb\xa5\x41\x09\xc3\xec\xb7\x44\xf0\x52\x19\x38\x6b\xdd\x97\x2d\xa4\xc1\xca\x5d\xc2\x83\xec\x5b\x99\xa9\x71\xfd\x65\xa2\x97\x7d\xda\xb4\xd2\x32\x78\x3f\xe2\x0d\xf0\xf2\xa2\xac\x32\xfc\x26\x5a\xdb\xc4\x03\xfc\x97\x35\x46\x32\xec\x4c\x24\x28\x8d\xf1\x61\x68\x5f\xd8\x90\x66\x55\x17\x63\xf7\xc7\x7b\x70\x7e\x53\x3d\x0a\x7b\x16\xa2\xe1\x06\x12\xb5\x29\x39\x2f\xc3\x3c\xdf\x8d\x99\x2b\xbc\xd4\x57\x5d\xdb\x35\xea\xfc\x40\xd2\x90\x03\x2a\x5b\x97\xc1\x54\xa5\xf5\x45\xaf\xcc\x1c\xff\x54\x70\x90\x71\xe5\xef\x39\x10\x8e\x47\x0d\x1f\xd6\x23\xa7\xf4\x66\xeb\x4b\xb7\x1c\xbc\x6c\x41\x7f\x30\xf3\x5d\xeb\xf0\x95\x35\x46\xed\xf1\x07\xac\xac\x1f\x2b\xa9\x40\x7d\x5e\x81\x7d\x6f\x5c\x9c\x5a\xc0\x94\x49\x2d\x85\x88\x62\xab\x42\x91\x1e\xc1\x0c\x20\x04\x5f\x5c\x2b\x14\x7c\x8d\x40\xf5\xd8\xc5\x8c\x17\xe9\x17\xf2\x2c\xb5\xa6\x3a\x14\xd0\x9f\x1c\x09\x78\x23\xb3\x22\xd8\xc9\x1d\xcc\x32\x8c\x1e\xe1\xb7\x88\x60\xa1\xbf\xb8\x83\x84\x3a\xd8\x17\x67\xc7\x56\x61\x47\xfb\x5a\xd8\x00\x9a\x41\xab\xe1\x5d\x2e\x05\x3c\x3c\x62\x53\x8f\xf1\x55\x37\xe3\x2c\x3c\xbd\xa6\x43\x7f\x4f\x8f\x04\xb2\xf5\xee\x19\x23\x37\x1b\xe6\x7d\x0f\x15\xcb\x47\x8e\x17\xc2\x71\x21\x42\x66\xb4\xe3\x74\xab\xdc\xc7\xd5\x07\x81\x3d\x54\x81\xed\x1d\xb7\xa3\x03\xd4\xa1\x46\x81\xd3\xba\xbf\x35\x6f\xe7\x11\xc2\x9d\x6a\x69\x6c\x08\xf5\xc2\xa3\xde\xba\xa0\x3a\xe2\xd5\x47\xda\x8a\xf1\x97\x8d\x6b\x93\x7a\x6d\x7f\x30\x80\x1e\xb4\x91\x58\x5e\x82\xd5\xf2\xbe\xc8\x06\x48\xef\x9e\xc3\x37\x69\xb4\x91\x47\x15\x12\x87\xdd\xbd\x59\xf9\x2f\x2e\x14\x26\x5e\x02\x1c\x2b\xa7\xc3\x4d\x33\xe4\xe7\xf8\xeb\x5e\x38\x41\x01\xfc\x7a\x07\x1d\x1c\x23\x69\x87\x89\x01\x0e\x89\xb8\xd6\x27\xad\x04\x06\xa2\x8d\x5e\xef\x38\x76\x14\x2a\xf6\xa3\xc2\x19\xfd\x83\x74\xf2\xe2\x5d\x6f\x1d\x0e\xb7\x46\xef\xce\xb7\x81\x56\x19\x8c\xd7\x37\xa3\xab\x73\x97\x28\x1c\x9d\xda\x88\xfc\x4d\x73\xf8\xb5\x0b\x8a\xf3\x0b\x9a\xf1\x64\xcf\x34\xf6\x5f\x77\x34\xb2\x1a\x41\xa5\x13\xf4\x4d\xa9\x98\x7e\x5d\x3f\xc6\x83\x1d\xad\xf0\x90\x66\x68\x38\xb8\x12\xef\x44\xb7\x11\x39\xed\x31\x7e\xd7\xd6\xe9\xe0\x66\x60\x4c\x55\x57\xc7\x81\x1f\xb2\x72\x20\x59\x17\x0a\xe3\x44\x44\x3e\xb0\xbd\xd9\x95\xbc\x84\x46\x8f\x17\xc1\x4f\x5d\x5d\xce\x06\xbc\x69\x8c\x20\x3a\xb4\x47\xe8\x91\x8c\x0d\x84\x5a\x81\xa2\xd9\x37\xf4\x96\xc6\x7b\x9d\x82\x8b\xfd\x95\x53\x64\x32\xad\x23\x0e\x68\xa2\xfa\x86\xd5\xb0\xe9\xb1\x45\x8f\xbe\x90\xf3\x19\x87\xf3\x23\xe3\x2a\x92\x44\x07\x40\x5b\x68\x6d\x99\x6e\x94\xf1\xf5\x25\x56\xd7\x16\x44\x2e\xb0\x65\x5d\x80\x88\x39\x7c\x9f\x80\x9e\x4d\x57\x55\xec\xcb\x0e\x5a\x60\xce\x2b\x49\x2b\x14\xe3\xe3\x49\x02\xd9\x36\xae\x58\x00\x09\x32\xf6\x35\x39\x73\xb2\x90\x34\xbb\xcb\xde\xde\x2e\x8e\x88\xbb\x8d\x8c\xe6\xe8\xac\x10\xbe\x20\xf4\x2c\xef\x41\x63\xd8\x17\xdd\x73\xfa\x3f\xbd\x18\xc8\xce\x86\x59\x4e\x80\xab\x43\x7f\x34\x3a\xe5\xa6\xce\x3e\xe4\x8f\x74\x96\x34\x0e\x01\x6b\x4a\xa8\x14\x28\xbc\x66\xd5\x38\x57\xee\xc8\xe3\x22\x17\xab\xc7\x45\xb7\x67\xe9\x76\x22\x72\x00\x39\x57\xa5\x7b\x00\x4e\x3c\x26\xcf\xb5\xf4\x06\x8c\x55\x92\x9f\xe1\x46\x30\x5a\x83\x39\xf0\x20\x13\xae\x02\x28\x5f\x31\x72\x74\xcc\x63\x96\x16\x51\xc5\x19\xad\x8e\x6f\x0b\xc1\x96\x53\x87\xd3\x58\xc3\x7a\x4f\x24\x91\xa4\xe8\x83\x3a\x99\x22\xd1\xae\xad\x1d\x3c\x00\x89\x97\x90\xe3\x51\xfd\xb3\x5a\xce\xc1\xf7\xb5\x84\x34\xc6\x2e\xfc\xe1\x5e\xc9\x23\xf7\xea\x3c\x7f\x3b\x7a\x9e\x67\x07\xee\xfe\x17\x0d\x9f\x39\x66\x12\xf0\xb1\x20\xc4\x7f\x1e\x34\x80\x16\x52\x25\x18\x0f\xe5\xb6\x36\xf7\x2e\x9b\x9b\x7d\x9b\x08\xe1\xb3\xd9\x33\x58\xc1\x9e\x12\xc1\x54\x49\xe2\x37\xc9\x93\xcc\x69\xe6\x30\x30\x14\xf2\x96\x14\x1a\xb9\x41\xb1\xb0\x1d\x19\x9e\x0b\xdb\x34\x80\x13\x16\x6e\x7b\xfd\xc0\x02\x59\xed\x1d\xa7\xeb\x95\xe4\x35\x73\x43\x56\xee\x71\xd0\xed\xa5\xdb\xc0\x0a\x6b\xcc\x02\x00\x28\x9c\x4f\x1f\xb4\x95\x42\x51\xf0\x20\xec\x62\xfe\x28\x7e\x40\x66\x62\x92\xdc\x6b\xbb\xf6\x4d\xbb\x43\xc9\x57\xc4\xa5\xc6\xa7\x51\x7b\x51\xf7\x55\x36\x45\xf6\x54\xd4\x36\xa1\xfe\xb4\x6b\x57\x69\xfb\x77\x55\x37\x2b\xe7\x5b\x2e\x23\x80\x21\x1e\x56\xb0\x96\x0a\xf3\x70\xf8\xed\xe8\x42\x1b\x86\x27\xb0\x00\x4f\xdf\xf7\x5f\xb7\xca\xc6\xd4\x9b\xbe\x19\x4d\x40\xe7\xeb\x6b\x68\xbb\x4f\xef\xef\x1b\x77\x8f\x49\xb9\xba\x31\x17\xbe\xfa\xdc\x8b\x84\x42\x87\xbe\x53\x96\x23\x7d\xc3\x65\x86\xd3\xe1\x13\xb1\x99\xb1\x3d\x7a\x44\x96\x0f\xc5\x16\xe0\x21\x82\x75\xd6\xa7\x66\x32\x1c\xf9\xc5\x50\x63\xbf\xcf\x59\xa1\xe0\x87\xcd\xe3\x12\x03\x67\x72\xfc\x2c\x12\x97\xab\xa0\x9a\x3b\x1d\xda\xc8\x4a\x30\x36\xdb\xba\x82\x60\x2e\xd3\xc4\xa9\xb6\x65\x4f\x9a\x10\xb7\xfa\x58\x54\x36\x3b\xdb\x3b\xf2\x13\xfb\xc7\x60\x36\xa0\xa3\x87\x9d\x0d\x03\x5d\x1e\xd5\x1c\x5c\x90\x7f\xd8\xe3\x57\x96\xbe\xfa\x9c\x1e\x19\xdf\xdf\x9f\xbc\xa0\x27\x8a\x58\x13\xda\x1a\xd9\x09\xf3\x40\x4e\x15\x47\x3d\x8e\x7e\x23\x75\xf0\xb0\x57\xea\x47\x8c\xce\xb5\xb5\x99\x77\xbe\x5c\x1a\x30\x1d\x8f\x6d\x19\xad\x01\x62\xbb\x03\xd2\x59\x74\xda\x39\x32\x81\x05\xae\x49\x05\x2e\xb0\xb5\x94\x6a\x44\x25\xb6\xb1\x77\xdd\x3c\xeb\xea\xca\x07\xc5\xbe\x72\x5f\xb0\x98\x8f\x02\xf1\x90\x91\x68\x56\x76\xe1\x7a\x91\xab\xc9\x8b\xf3\xd6\x6d\x82\xb9\x83\x6b\xba\x71\xe6\xb2\x6e\x51\x7e\x14\xdd\x98\x6b\xdb\x20\xdc\x7a\x30\x65\x30\x23\xdf\x1f\x11\xa2\xf2\xf0\x19\xe3\x9b\xac\x68\x0c\x3b\x2d\x1a\xbf\x6d\xc3\x11\xa1\x40\x5c\xe3\x40\xbe\xae\x75\x78\xb4\x82\xad\xa4\xaa\xdc\x64\x7c\x70\x73\xb0\xcc\xb4\xf0\x82\x2c\x2c\xc7\x15\x54\xc0\x6f\x3e\x76\x50\xf5\x2c\x47\xf4\xc2\x6a\x96\x85\x82\x8d\x97\x7a\xbe\xb5\x4a\xa3\x50\x96\x07\xc0\x0e\xc8\x8f\xa3\xef\x3c\x59\xa5\x26\x07\x2a\x29\xff\x28\xd5\x6c\x0c\x95\xbc\x3e\x82\x54\xfb\x1e\x2a\xe0\x27\x43\x10\xa3\xfb\xc8\x87\x4c\x73\x74\x34\xfc\x06\x65\x17\x1d\x0a\xe0\xa1\xad\x47\x07\xe7\x00\x1e\x99\xe5\x4d\xec\x82\x88\x37\x34\xcc\xe3\x5d\xcd\x3a\x21\xfc\xac\x22\x7b\x92\x1b\x84\x23\xd5\x39\x37\xf6\x44\x1c\x96\x93\x23\xba\x46\x47\x9c\x08\x09\x66\x66\xc6\xdd\xc8\xbd\x04\x86\xde\x7c\x07\x09\x36\x28\x9e\x4f\xaa\x07\xbb\xba\x2b\xc4\x56\xa8\xdc\x83\x8b\x17\x39\x80\xc3\x34\x06\x53\x3b\x38\xe3\x6d\x41\x24\x04\x43\xb3\x70\x27\xc2\xf7\x37\x99\x3e\x4b\xde\xb9\xd3\x23\x73\x97\x27\xb6\x32\xa5\xb4\xd8\xac\x56\xe3\x5d\x3b\x2e\xcb\x4d\x85\x13\xc1\x35\x0f\x7e\xe1\x0c\xfe\x04\x7f\x88\x7e\x4c\xa1\xa1\x20\x7b\x03\xb6\x87\x27\x6f\x7a\x2d\xa0\xf3\x08\xfd\x82\x1e\x51\x82\x22\x54\x88\x46\xf3\x71\xbd\x3a\xa6\xfb\x69\x6b\xdb\x0c\x6d\x8b\x7e\x4e\x81\x88\x9b\x38\xf8\x05\xae\x0b\xe1\xdd\x0e\xae\x2c\x0b\xfa\xff\x7e\x03\xd1\x7a\x09\xcc\x00\xba\x03\x03\x95\x2e\xbb\xe6\x06\x16\x01\x66\xb3\xe0\xd5\x10\x79\xe2\x6e\xa0\x32\xe1\x78\xa0\x9a\xfc\x10\x98\x6c\xc4\x26\x62\xfd\x23\x56\xa8\x48\x7c\x5b\x27\x22\xd1\x10\xe6\x8a\x12\xe9\xab\xe8\xfe\x28\x0e\x78\x6b\x16\x4d\x1d\xc2\x31\x34\x07\x91\x53\xa0\xf6\x01\x3f\x1f\x89\x70\x66\x4a\xc3\xd9\xb2\x74\xf7\xb8\xc9\xc8\x92\xe3\xce\x6a\x5c\x20\x9d\xdd\x75\x46\x33\x2c\x7d\xe7\xc6\x63\xa2\x1c\xec\xbd\xf1\x60\x7b\x5b\x53\xda\xd3\x66\x10\x7c\x42\xca\x2e\xd1\x08\xb2\x64\x25\x6b\x61\x23\x54\xfd\x21\x2e\xdc\x93\x6f\x8e\x54\x05\x57\x5c\x5f\x54\xde\x85\x45\x52\x50\x49\x30\x3d\xfb\x97\xe9\x87\x01\x9b\x28\x56\x8c\x30\x51\xd8\xcf\x57\x17\xef\x66\x37\x4f\x73\x8a\x72\x41\xca\xb3\xdc\xa2\x93\xaf\x27\x0f\x2d\x9e\x65\x0e\x05\x4e\xca\xcb\xab\xcb\xe3\xf3\xcb\xf7\x37\xe7\x97\x1f\x90\x57\x33\xa7\x13\xed\x95\xac\x5c\xcf\x6e\x3e\x9e\xdf\x11\x19\x1a\xb0\x7b\x5d\x5c\x9d\x4d\x2f\x90\xf5\xec\xd3\xe5\x45\x7c\x9d\x2e\x6b\x81\x5a\x96\xcb\xab\xe1\x70\xe4\xb4\xa2\x58\x6d\xf2\x5b\xa9\x45\xf7\xd2\x88\x7e\x25\x7d\xa6\x4c\xe0\x5f\x40\x9e\xf9\x9f\x1f\x27\xf5\x9f\xf5\xdf\xe4\xd5\xf9\xed\xd9\xdf\x4e\xfa\x05\xfe\x3d\xa3\xff\x72\xf2\xcd\xb7\x7d\xfd\x97\x93\x37\x6f\x7f\xe7\xff\xfc\xbb\xfc\x3b\xbf\x3d\xe3\x9b\x62\x08\xf9\xfa\x06\x79\xf6\x41\xd7\xb2\x8d\x46\x65\x6b\x6e\x77\x01\x3c\x86\xe8\x24\xd4\x4d\xeb\xbb\x0d\xd1\xe7\x1f\x1e\x9c\xdf\x9e\x1d\x1c\xbd\x18\x90\xf5\xbf\x3d\x3e\x7d\xfd\xfa\x4d\xfe\x10\x46\x5c\xa5\xa7\xe8\x94\x23\xda\x3c\x45\x16\x8e\x44\x83\xf8\x55\xdf\xb6\xd4\x44\xd9\x63\x19\x42\x9d\x96\x88\x3e\xb4\x0f\x19\x6b\x54\xf4\x92\x87\x1c\xec\xe3\xf4\xe4\xa9\xc8\x46\x71\x84\xf1\x9f\x12\x8e\x1d\xeb\xe3\xbd\x0b\x13\xa0\xeb\x1c\xe5\xd8\xd6\x97\x5d\x9c\x80\xc4\x0b\x3a\xbd\xb8\xd0\xf7\x58\xbc\x09\xa9\xf8\x12\xaf\x9e\x8c\xb5\x5b\x98\x93\xe3\xb7\x7e\x33\x85\xf6\x18\x35\x76\x6c\xcc\xf0\xde\x91\x0a\xc6\xe1\x05\xb4\xf7\xd2\xe1\x2b\x8b\x7e\xfc\xe5\xe7\xe9\xdd\xed\x15\xf0\x48\xf7\x8a\x31\x07\xbc\xd4\x8a\x96\x3a\x63\x93\x9e\x5e\x9a\xe9\x19\x53\x69\x26\x6a\xe9\x11\xd6\x68\x60\x96\x3e\xbf\xfa\x74\x4b\x5f\x28\xfa\x15\x94\x57\x4c\x4f\x7d\x49\xd5\x9e\x30\xce\x72\x1b\xde\xc4\x8b\x1d\x38\x5c\x89\xa5\x33\x1b\xf7\xff\x5c\x77\xdd\xe4\xd5\xf4\xc3\xf5\xc5\xdf\x88\xf8\x99\xfe\x3d\x7d\xfe\xbf\xf9\xee\xf5\xc9\xdb\xfe\xf9\xff\xdd\xdb\xdf\xf5\xbf\xfe\x2e\xff\xa6\xef\xdf\xcf\x6e\xae\xcc\x87\xd9\xe5\xec\x66\x7a\xd1\x23\x04\x7e\x21\x42\xa1\x05\xe9\x4d\xc6\x29\x52\xde\xd5\xff\xf8\xef\xf8\x9b\x69\x74\xf1\x6a\x14\x18\x79\x7b\xf2\x9a\xb4\xba\x6e\xdb\xc6\xb9\xd6\x1c\x9b\xdb\xce\xb7\xce\x9c\x9e\xbe\x2d\xcc\xad\xad\xcc\xfb\xc6\x56\x0b\x1f\x16\x35\x69\x77\x9d\xbc\xfe\x0e\xb4\xbb\x72\x14\x2f\x28\x99\x08\x92\xe7\x21\x47\x04\x7d\xb8\xfc\x64\x24\xa6\x92\x8b\x9b\x2e\x7a\xa2\x94\x7f\xf8\x1e\x44\x41\x4e\xcc\xfb\xc6\x25\xb1\x2b\x05\x07\xa2\x0b\x0c\xc2\x05\xec\xc7\xfb\x26\x53\x5a\xe1\xf8\xf4\xe9\xe1\xf2\x28\x05\x20\xec\x72\xc9\x20\xe7\x07\x27\xd4\x4c\x72\x1f\xc1\x2f\x11\x46\xd7\xb5\xae\x31\x95\x6b\x1f\x81\x89\xf3\x1f\x0f\x96\x4e\xa5\xc6\x70\x6b\x6e\xea\xd0\xa6\x76\x83\xec\xaa\xa3\xb2\xb7\xb6\x36\x2d\xa0\x7f\x1f\xed\x0e\x83\x20\xab\xc6\xb9\x65\xbd\x01\x87\x7e\x0d\x9f\xaf\x96\x84\xb4\x30\xbe\x85\xe0\x12\x6a\x8b\x07\xf4\x4b\x79\x71\xec\x99\xae\x1e\xc1\xe5\x7d\x67\xe1\x62\x76\xcf\xbf\x2c\x03\x30\x1f\x1f\xa7\x5a\x43\x62\x9d\x92\x0e\x45\x4f\xb6\xa1\x00\x7a\xbc\x9f\x7d\x1b\x20\xeb\x1c\xa8\xb4\xac\xd7\x22\xc5\x82\xb5\x21\xa9\x2f\xec\xc2\x4b\x65\x6c\x10\x61\x87\xe2\xc5\x68\xea\xfb\xc6\x6e\xcc\x23\x60\x41\x89\x25\x05\x4a\xda\x3c\x45\x71\x70\x5a\x26\xe6\xf0\xb6\xde\x70\x34\x8a\xc6\x46\x37\x75\x41\xba\xdb\x14\x93\x88\x2b\xfd\xc2\xcf\x1b\xdb\xec\xf6\x0e\x61\x15\x5a\x67\x97\x13\x8c\x8f\x2f\x6c\x45\x51\x79\x7c\x31\x8c\x23\xb5\x0e\xe2\xde\xf5\xe4\xc5\x2f\x6b\x57\x99\x47\x90\xb2\xb5\x10\xe4\xce\xc6\xb2\x88\x7f\x42\xe1\xee\x95\x6b\x1a\xaa\x75\xa2\xa9\x28\x28\x81\xef\x17\x2c\x7c\xba\x7f\x62\xf5\x2a\xd2\x73\x43\xe9\x0e\x2e\xac\xd7\xb3\x3c\x42\x3c\xd9\x6b\x9d\x39\xa4\x35\xc0\x00\x51\xb4\x02\x29\x22\x46\x11\xc6\x47\x1f\xd6\x47\x45\x7a\x15\xa5\x97\x73\xa9\xb2\x06\xc6\xea\xde\xb5\xb0\x5b\xe8\x8b\xb6\x6a\x21\x53\x9c\xf2\x54\x96\x71\x93\xf9\xaa\x22\x32\xb6\xad\x77\x0b\xd6\x7f\x89\x06\x60\xe5\x1e\xb1\xbd\x3c\xe4\x3f\x92\xe1\x48\x8f\xfb\x5c\xd5\x8f\xf2\xdc\x65\x4d\x79\x4d\x20\x7f\x8d\x26\x23\xa8\xd3\xb5\x6e\xd1\xea\x1c\x1d\x4c\x48\xe5\xd4\x40\x6a\xc6\x44\x7c\xf6\xaa\x6e\xe6\x50\x54\x0b\x27\x4b\x1c\x49\x57\xed\x38\x98\x98\x28\x67\x30\x87\x61\xc3\x67\xfc\x53\x1d\xa7\xa4\x71\x02\x22\x69\x88\x8e\xf6\x0e\xbf\x93\xbd\x85\x30\x83\x88\xcd\x26\x81\xa7\xc6\x85\x6d\x5d\x05\x0f\x80\x2b\x4f\xc7\x09\x84\xce\xfa\x9c\x55\x3d\x1c\x5c\x5a\x6b\xc8\xc7\x04\x09\x58\x04\x1e\xf8\x76\xf2\xe2\x7d\xdd\x18\xf7\xc5\x6e\xb6\xa5\x8a\x1a\x8f\x3d\x0b\xc9\xaf\x79\xb0\x0b\xe1\xed\xec\x03\x97\x56\xce\xa9\x2c\xaf\xd0\x53\x25\x82\x42\x38\x19\xd2\x10\xe4\xab\x54\x51\x0e\xf6\xd6\x71\xbb\x76\x3b\xd8\x54\x85\xac\x31\xb5\xae\x7a\xf0\xd1\x89\x99\x56\xcb\xd4\x8a\x00\x79\xf4\xb5\xdb\xf0\x22\x80\xdc\x01\xa0\x76\xdc\x0e\x17\x0a\x5e\x45\x34\x2b\x2f\x7e\x71\x63\xab\x83\x2e\xad\xc7\xda\x84\xd6\x6d\xc3\x0f\x80\xc0\x4c\xb7\x60\x3e\xda\x20\x4c\x7e\x7a\x44\x41\x59\x5c\x1e\xea\x36\xc1\xf2\x98\x7b\xc0\xb5\xc4\x3f\x62\xb5\xe9\x36\xf3\xcd\xfa\xb8\x7c\x06\xc2\x2b\x68\x7e\x2a\x2b\x99\x96\xa1\x2e\x60\x0e\xa0\x1e\x1b\xcf\x45\xac\x11\x68\x13\x8e\xde\xd4\x5d\x83\xab\x1c\xf6\x1f\xaf\x72\x5e\x65\x30\xd2\x8e\x6f\xcd\x54\xd1\x9c\xf0\x21\xc2\xc7\x26\xe5\xb8\x72\x32\xe4\x75\x2e\x5c\x63\xa2\x4f\x5c\x0d\x17\xe6\x64\x81\x2b\x29\x97\xb9\xb5\x21\x00\x60\x3b\x35\xcf\x83\x52\x98\x2c\x9c\xb6\xe6\xb9\xb2\x2d\x54\xe0\xe2\xfc\xc1\xe9\x46\x77\xb0\xc6\x54\x26\x5c\x16\xb1\x09\xcc\xcb\xe8\x50\xfb\xaa\x45\xe6\x5e\x68\x06\xe1\x7e\xa4\x34\xb8\x71\xab\x12\x82\xc1\x55\x8e\xcf\xa4\x7b\xe6\xa5\x69\xdc\xb6\x6b\x59\x5b\xf1\x7d\xfc\x1b\x92\xef\xee\xb2\xc3\x08\x6b\x92\x00\x6a\x5b\x41\xe5\x47\x05\x12\x92\xc8\xc8\x2b\x43\x82\x11\xe6\x30\x31\xbf\x38\x38\x48\xe1\xc4\x78\xa8\x3d\x29\x10\xc6\xa3\xb0\x61\x8a\xcd\x65\xca\x41\x13\x9b\x6f\xf6\x3e\xe8\x40\xaa\x78\x29\x45\x15\x3e\x4f\x1e\x04\x80\x76\x13\x29\x05\x15\x2c\x60\xc5\x2a\x3e\x66\xdb\xd4\xdb\xc6\x03\xb3\xde\xc4\xc0\x19\xc9\xf8\x31\x8f\xcb\x46\x72\x0e\xf1\x14\x06\x10\xa1\x1a\x62\x7c\x15\x63\x4e\xa4\x2e\x17\x16\x25\x2d\xaa\x97\xb4\x4e\x3a\xe4\x2e\xc5\xfc\x25\x7d\x0e\xa8\x4f\x4b\x54\x58\xdf\xc6\x79\xdf\xa7\x87\xbb\xaa\x91\xd9\x10\x32\x6b\x03\xdd\x38\x9d\xde\x23\x80\xe0\xe4\xc5\x98\xf4\x03\xf8\xdd\x67\x57\xd7\xbf\x02\x3b\x53\x26\x8a\x12\x3f\xf8\xf1\xea\xdd\xf9\xfb\xf3\x33\x20\x6a\x7a\x61\x8c\x79\xdd\xe7\xe2\x49\xe6\x0b\x2d\x30\x18\x42\x49\xfc\x43\x5e\x9b\x95\xf8\xa8\x06\xcd\x72\x20\x63\x5b\xda\x45\xb2\x3d\xd2\x21\xb2\xc6\x34\x4a\xb0\x3b\x32\x2e\x09\x69\x3f\x2e\xcf\x9f\x27\x41\x9f\xb4\xff\x10\x5b\x70\x70\x8d\xad\x3c\x28\x58\xa4\x32\x15\x5a\x08\xf5\x8a\xea\x09\xca\x5c\x40\x1a\xd6\x1c\x28\x1d\x05\xda\x1e\xfc\x34\xc2\xd5\x2b\x58\xc7\x75\x7a\x06\xd4\xcd\x27\xf6\xff\xc7\xc4\x24\x93\x51\x9a\xff\x20\xe0\xc1\x78\x59\xda\xb8\xa9\xf0\xb3\x34\x78\x92\x2b\x55\x4f\x06\x10\x32\x79\x2b\xd1\x96\xa0\x06\x88\x29\x4f\x41\xa9\x3e\x19\x34\x1e\xa3\x72\xcf\xb2\xca\x05\x15\xaf\xb0\x26\xe6\xc4\x1c\xfe\xec\x1a\xe7\x2b\x40\x07\x15\x19\x96\xdf\x2b\x18\xc5\x48\xd5\xbf\xaf\x64\x7a\xcc\x81\x7e\xf9\xc1\xe4\x08\xb9\x5c\x04\x8f\x17\xbd\xaf\xe5\xb2\x71\x70\xf8\xd9\x00\x65\x5b\x07\x90\x0a\x9a\x2e\x5a\xff\x80\x97\xbd\xca\xa8\x7e\xe5\xba\x4f\x99\x76\x65\xe4\xa6\xc5\xfb\x23\x1e\x9d\x60\x5e\x51\x69\x51\x3c\x6c\xc3\xa2\xde\xd2\x4a\xb1\x0b\x30\xc8\x35\x42\xf4\x3a\x9d\x6d\x78\x54\xa2\xd1\xc2\x08\x18\x38\x2f\xbb\x76\xdb\x29\xd0\xa7\xfa\x0a\xb7\x84\x25\x97\x59\xc5\x0f\x8e\x76\xc5\x29\x97\xe9\x75\xe4\xeb\xcc\x1c\x6a\xf5\x92\x7a\xc5\xfc\x7b\x58\xf2\x43\x59\xe8\x91\x16\x1f\x4d\xcc\x2f\x64\xae\xc8\x1a\x6b\xba\xe8\x7c\xc5\x67\x01\xe4\xec\x51\x12\x84\xf4\xaa\x65\x4d\x05\x4a\x27\x89\x28\xf6\xab\xdd\x46\x79\x0c\x78\x32\xc9\x12\xb6\x21\x33\x92\xe3\x92\xcd\x6a\x0e\xc6\xe1\x5b\x55\xd8\xfa\x45\x87\x7a\x0c\xb0\x15\xb7\x78\x4c\xdb\xd6\x95\x3b\xae\xe7\x8f\x9d\x20\x26\x16\x68\xa4\xfe\xd4\x78\x88\x75\x94\x95\x79\xf7\xe3\x80\x85\x14\x73\xd5\xbf\x85\xef\xd9\xce\x03\x10\xf4\x32\x44\x54\x1e\x2d\x8c\xa5\x8a\x69\x30\xdd\xef\xf9\xd0\x65\x70\x5f\xfd\x9e\x24\x83\xa3\x3e\x0d\x53\x25\xf3\xc4\xb8\x2e\x8d\xe6\xda\xae\x77\xa4\xd3\x82\x2b\x9b\x73\xe0\x4d\x2a\xea\xc3\x75\xbc\x63\xec\x1a\x19\x7f\xf5\x96\x8e\x98\xd8\x6b\x31\x7b\x94\x5d\x15\x6f\x54\x66\x98\x15\x23\x98\x05\x28\xb8\x4d\x64\xb4\x51\xf5\xde\x96\x98\x14\x47\x96\x8c\x90\x91\xe4\x47\x5b\xbb\xee\xe0\xe2\xdb\x60\x73\xf7\xee\x11\xae\x91\x1a\xae\xd4\x11\x5a\x7c\x3a\xe1\xc7\x6e\x14\x8e\xc4\x9c\x30\x59\xd8\x70\x65\xda\x32\xd4\x66\xe3\x5c\xab\x2a\x5a\x82\x56\xb2\x15\x8a\xf9\xa3\x64\xd6\x27\x18\x51\x92\x37\x82\x12\xae\x68\xf0\xda\xa6\xd9\x29\x6e\x54\x5e\x75\xa1\x25\x22\x10\x55\xb5\x08\x70\x02\xf0\x69\x3d\x03\x9e\x24\xcd\x4e\xeb\x0e\x3f\x25\xc4\x52\x83\x46\x30\x7c\x59\xe1\x02\x87\xc4\x5a\x61\x9d\xa8\x64\x41\xfa\x88\x4a\x38\x81\x59\x5b\xee\x75\xe4\x15\xeb\x89\x8b\x0e\xa7\x34\x7e\x07\x8c\xe8\x7a\x55\x10\x7c\x2a\x59\x3f\x20\x55\x04\x6f\xc8\xc4\xdd\xe3\xcd\x04\xbb\x90\xa9\x32\xe3\x92\xf9\x4a\x81\x98\xc5\x11\x9b\xe1\x32\xd8\x7c\xb9\x57\x75\xb3\x01\x3b\xb1\x71\x76\x89\xf1\x13\x30\xf4\x01\xc1\x66\x81\x25\xac\xdc\x45\x2f\xaf\x8a\x27\xaa\x72\xe9\x70\xec\xe2\x92\x84\x3f\x86\xd6\x36\xf1\x0a\xe5\x63\x37\x6e\x00\x22\xe8\x93\x07\xb1\x94\x2f\x36\x24\xb4\x06\xb4\x8d\x6c\x13\x8f\x06\x70\xea\xcc\xb6\xf1\x55\x4b\x80\x26\x50\xba\x88\x07\x58\x55\xd5\x5d\xb5\x40\x52\x21\x05\x02\xf9\x8a\xa3\x4d\xcc\xac\xfd\x6e\xcb\x61\x34\x4a\xa1\x24\x97\x6c\x2d\x5d\xdb\x4e\xaa\xf5\xfc\xe1\xa3\x14\x59\x80\x70\x16\x6c\xe8\x01\x64\x9f\x47\x56\xe6\x26\xdb\x0b\x74\x47\x3a\xac\xbd\x90\x7a\x0c\x42\x78\x3f\x78\xf7\xb8\xe7\xc0\x9b\x98\x43\x64\xcb\x01\xbd\x4c\x9f\x9f\x15\xc4\xcf\xe3\xb3\x79\x83\x00\xa5\x80\x9d\x64\xa2\x71\x8c\xd1\x8f\xcf\x47\xb7\xc0\x63\x69\xff\xbd\xeb\x33\xaa\xf9\x65\x9a\xb1\xde\x83\x26\x47\x4c\xc3\x25\x0b\x4f\x4e\xf3\xec\xea\x5b\x52\xdc\x54\x47\x24\xb9\x07\x78\xb6\xe3\x40\xb7\xeb\xa6\xee\xee\xd7\x23\xd1\x5d\xa4\x57\x5e\x89\xca\x3a\xc7\xad\xf5\x4b\xd0\x2f\xa3\xba\x17\x1a\x9e\x91\xbb\xc3\x3c\xda\x40\xb5\xe4\x60\xc3\x40\x7d\x73\x57\x79\xa4\xa4\x62\xd6\x9b\x5c\x2e\xa5\x4e\xcb\x61\x78\xe5\x0b\x9e\x3f\xab\x68\x95\x1d\x84\x43\x09\x4c\xf7\x18\x51\xb2\x0b\x2c\xa3\x83\x73\x43\xd5\x08\x0d\xc3\xf1\xd7\xb9\x69\xfe\xc4\x0d\x00\x6f\xc2\x3b\xcb\x56\x26\x4e\xdc\x83\x2d\xc1\x6c\x52\xdd\xe3\x40\x2d\x0e\xf6\x60\x8c\xa0\x29\xfc\xca\x27\xa6\x42\x8d\x92\xdf\x80\x5a\x4a\xeb\xf2\xf1\x9a\xef\xcc\xcf\x77\x77\xd7\x49\xe1\x68\x38\x40\x02\x01\x1e\xf6\x9d\x3d\xaa\x9e\x17\x01\xa7\x1c\x07\xd0\x14\x1a\x30\x83\x4a\x27\xee\x32\x12\x59\xb0\xac\x60\x77\xbe\x12\xa6\x2b\x80\xb4\x05\xa6\x02\x65\x0a\x02\xfc\x06\x19\xd2\xfb\xce\x76\xba\x6f\x6d\x85\x7c\x7d\xc4\x6c\xbd\xd3\x10\x57\x6d\xb4\x22\xe1\x05\xe9\xf1\x8d\xea\xef\x25\x84\x59\xc6\x83\x06\xd5\x44\x0e\x84\xcf\x19\xd5\x99\xba\x59\x07\xd5\xfc\x47\x29\x49\xc8\xce\x27\xd8\x82\xf9\xab\x27\xe6\xa7\xae\xdd\xf7\x79\xac\x33\x92\xa7\xda\x80\xd7\x17\x84\x1e\xf0\x9a\x42\xdf\xd6\x87\xa7\xcd\x91\xb6\x27\xfe\xcd\x6b\x00\x9f\xc1\xc1\x82\xba\xda\x7f\x9b\x15\x14\xeb\xdf\xf6\x4a\x87\x33\xa6\x4f\x17\x18\xdb\xcc\xfa\x12\xc8\xdb\x01\xaf\x61\x07\xa5\x03\x33\x03\x03\x64\xd5\x92\x84\x61\xb6\xa8\xb0\x77\x6f\x9b\x25\x20\x53\xa3\x31\xbc\xae\xcd\x63\x34\xf0\x0c\xd1\xae\xdf\xad\xbb\x50\xa8\x5c\x4f\x9b\xd8\x67\xb8\xb1\x21\x31\xb4\x21\x3e\x31\x05\x82\xc1\xcd\x09\x79\x2c\xb1\xad\x29\x40\x40\x2c\x61\xd8\x5c\x0c\x10\xed\xea\xee\x47\xd3\xd8\xd8\xbd\x42\xbf\x0a\x7d\xe3\xa1\x56\x11\x06\x0b\x91\xcf\x66\x6c\xb8\xd5\xbe\x81\xd6\x24\x2d\x47\x94\x84\x18\x99\x37\xe8\x75\x06\xe3\xde\x00\xd7\xa1\x2a\x5d\x00\x2b\x4b\x85\x3a\x80\x92\x61\xec\xf6\x18\x9c\xb7\x87\xec\x97\x3f\xb1\x70\x8e\x80\x87\xcf\x3c\xd4\x65\xb7\x21\x9e\x8c\xd0\xd6\x0d\xd1\x51\x64\x3d\xa4\x7a\x6d\xb9\xf1\xe6\x42\x73\xaf\x5a\x97\x2c\x26\x70\x72\x47\x2d\xa6\x37\x4f\xbb\x7a\xfd\x2e\xf4\x5b\x1f\x6d\x22\x7c\x8d\xa4\x31\x8f\x40\x45\x2a\xf1\x0a\x00\xcf\xa8\x54\xbe\x62\x15\xcf\x7e\xe3\x3b\x44\xeb\xbb\x5a\x9a\x53\x42\xca\xec\x31\xc1\x97\xa4\x59\xb6\xa7\x24\xd6\x1e\x99\xe9\x82\x09\x43\xbc\x12\xac\x91\x53\x78\x51\x37\x98\x5f\x00\x03\x6b\x63\x17\x6b\x5f\xb9\xe3\x68\x18\xe2\xc1\xa8\x6f\x31\xdc\xf4\xbc\x6d\x9f\x09\x4b\xed\xe9\x07\xcc\x2c\xcd\xda\xa2\x0b\x6d\x4d\x3a\x29\x1d\x47\x0b\x53\xd0\x18\xe0\xbd\x60\xc7\xff\x68\xea\xa6\x48\xb6\xfc\xb0\x4b\x56\xf6\x12\x5c\x7b\x05\x55\x84\xc1\x1d\xc7\xa5\xc3\xed\xba\x71\xce\xec\x9c\x6d\xb0\x32\x45\x9c\x51\xc5\x44\x5f\x90\x13\x47\xf6\x77\x55\xa3\x14\x1c\xe3\xd9\xe3\x06\xc2\x64\x25\x7b\x94\x89\x70\x17\xf8\x51\x70\xb4\xf2\x32\x38\x9b\x06\x7b\x30\xbc\xba\xa8\x35\x9f\x89\x6c\xe0\xd1\x5d\xf8\x07\x0d\xf8\x62\xdf\x1a\xf2\x55\xe2\xbb\xc8\xec\x3b\x2b\xe4\x2d\x02\x4b\xcf\xf2\x4a\x7b\xfa\x39\x31\x87\x10\x64\x05\x0d\xac\x0a\xcf\x2c\xf8\x11\x72\xeb\x18\x3c\x5a\x41\xe0\xb8\x52\xea\x32\x83\x58\x18\x07\x99\xb2\x26\x69\x23\xfd\xf9\x6d\x99\xc8\x66\xad\xac\x28\xa1\x66\xa2\x6a\xba\x6e\xce\xa7\xfe\x9c\x68\x9c\x8f\xc8\x26\xc9\x2c\x9b\x55\x3a\x2c\x12\x01\xc9\x16\x93\xbe\xbd\xda\xfd\x47\x16\xe6\xa0\xe0\x7c\xee\xaf\x47\x2b\xb9\x9d\x98\xf7\x35\x1a\x75\xa9\xc5\x18\xa7\x1d\x35\xab\x88\xf8\x87\x02\x39\x83\x66\x95\xa5\x14\x0d\xf9\xe4\xd0\x16\x66\x5b\x76\x48\x17\xa4\x38\x28\x52\x75\xd3\x52\xb8\xb8\xd0\xff\xa6\xcf\xe3\xf1\x0a\x65\x47\xb8\xb6\xd4\xc5\x84\x84\x2b\x56\xa6\xa8\x5f\xc9\x0e\x77\xb6\xf4\x68\x62\x7e\x66\x7e\x78\xb0\xd9\x88\x3a\x95\x54\x69\xa5\x22\x5d\x77\x47\x6f\x0d\xc8\xe1\x66\x8c\x17\xd5\x0e\x75\x3f\x39\x00\x28\x6e\x91\xfe\xda\xa1\xaf\x38\x86\x4c\x4f\xae\x1b\xae\x3a\x8b\xb3\x74\x94\x16\xfe\xc6\xfe\xb9\xce\x8a\xfb\x0e\x89\x51\xa6\x29\xcc\x67\xd7\x54\xae\x24\xf2\x9f\x78\x38\x8b\x40\x4e\xbd\x75\x0d\xc6\x32\x02\xe0\x3b\x31\xf4\xc8\xfa\xbc\x6a\x42\x9b\x2e\x4e\x02\xd3\x86\x23\x21\x16\xbd\x4a\x48\x59\x69\x43\x7a\xa6\x36\x4e\x83\x07\x97\xf7\x6a\x60\x07\xa8\xe7\x47\xf3\x49\xad\x7f\x1f\x24\x7e\x2a\x3a\x31\xa4\x85\xc6\x70\x19\xaa\xfe\x41\xa8\x01\x12\xf2\x97\x76\xe1\xc8\x60\x95\x6f\x29\x4f\xa3\xf7\x80\xc1\xf2\x63\x4b\x1a\x0c\x4d\x78\x18\x16\x74\x80\xb1\x39\x66\x32\x66\xe7\xa1\x43\x7f\x0d\x7c\x92\x3c\x38\x92\x62\xdf\x9b\xad\x2b\x4b\x05\xf9\x51\x0f\xe9\x85\x11\xd5\x60\xb0\x36\xa3\x96\x07\xcb\x11\xb2\x49\x2b\x6f\xb4\x08\x8b\x8e\x18\x12\x50\xce\xa8\x75\xe5\x06\x1f\x21\x40\x87\x02\x35\xdb\xb6\x6e\xb3\x6d\x75\xad\x4e\xbd\xf7\xed\x4f\xbc\xdc\x07\xf3\x50\xfb\x25\xf3\x86\x94\x65\x4f\x0a\x22\xd5\xa7\xec\x29\x51\x96\x56\xc9\x3e\x14\x76\xec\x81\xf0\x03\xc6\x31\x51\x25\x97\x70\x14\xec\xca\x8e\x4a\x0d\x7f\xa5\xe0\x43\xa8\x0d\x4c\x12\x33\xb9\x70\x03\xf6\x4a\x3c\xb0\x42\x12\x57\xaf\xf6\x63\x16\xba\x0e\x2e\x91\x77\xf8\x6a\xe1\x12\x4c\x06\x4a\x0d\x11\x4c\x13\x8f\x5a\xe9\x7d\x45\xba\xc1\x90\xaf\x26\x25\x5c\x88\x16\x65\x29\x7b\x8a\xf2\xee\x9f\x97\xba\x01\x4f\xae\xe7\xc9\x0a\x10\xc4\xaa\x1a\x73\x4d\x88\xb0\x03\xa5\x9e\xfd\x55\x7d\x3a\xc9\x07\xa4\xf1\x0e\xea\x37\x9f\xa9\x3a\xd4\xb6\x2c\xc7\x42\x47\x6d\xf1\x82\xaa\xb4\x96\x48\x60\x04\x4b\x06\x5f\x6f\xab\xc5\xc0\x96\x86\xbb\xbe\x36\xa1\xa6\xcc\x21\x21\xc1\x7e\x4b\x2a\x17\x5b\x9c\x9a\x3f\x12\xfb\x08\xda\xf0\x66\x25\x9c\xa4\x93\x80\x37\xff\x53\xd6\xfb\x33\x3d\x6e\x73\x15\x84\x6c\xf7\x28\x4a\x12\xe1\xb1\xe0\xd3\x4c\x20\x03\xa5\x52\xb3\x1e\x40\x39\x7a\x0c\x8b\xd4\xae\xbc\xc6\x75\x4f\xfa\x3b\x3f\x99\x94\x9c\x28\xd3\x24\x64\x68\x22\xea\xd7\x6f\x14\x08\xf5\x55\x7f\x17\x11\xfc\x08\xad\x23\x92\x13\x88\x33\xa3\x38\xaa\xe7\xbb\xde\x41\xdc\x4b\x11\xb1\xcc\xcd\xf9\x8a\x2e\x75\x21\x3e\x5f\x08\x13\x62\xd7\xb4\xe6\xcf\x1d\xaa\xdb\x1b\xb4\x4f\x94\xbf\x39\x52\x92\x27\xc8\x23\x95\x51\xb2\xa1\xae\xcc\x61\x5e\x1b\x2d\xdf\x0d\xa1\x73\xe1\xa8\xc8\xb4\x2a\x1a\x47\xe3\x08\xeb\x20\x2e\x9d\x43\xc6\x37\x81\x18\x5e\x6c\x55\xdd\x20\x5f\x65\xe2\xb9\x57\x7c\xd9\x47\x4a\x46\xd4\x2e\x59\xb2\xf5\x29\x71\x6d\xc8\xbf\xd2\x4e\x76\x5f\x16\x5d\xc0\x25\x2b\xcb\x68\xff\x77\xa5\x6a\x72\x61\xab\x5c\x37\x35\x9e\x98\x96\xf2\xe7\xad\x0f\xab\x9d\x09\x7e\xd3\x95\x2d\xaa\x89\x94\x94\x7d\xd2\xa4\xec\x23\xa7\x33\x6c\xd9\x84\xb6\x74\x4d\x8b\xc9\x18\xf5\x35\xba\xf3\x07\x73\xb8\x1b\x55\x73\xcd\xc3\xc0\x88\xf1\x30\x7d\xdc\x99\xed\x57\xb9\x22\x45\xa9\x22\xa2\xd5\x2a\xe3\x7a\x67\x8f\x44\x47\xe7\x3b\xb2\x77\xeb\x90\x51\x08\x71\xc2\x4d\x58\x73\x21\x95\x23\x3f\x71\x84\x13\x8a\x96\x29\x0c\xe7\xd0\x95\x20\x50\x6e\x5c\x0a\xe5\x52\x46\x77\x5e\xb7\x6b\xe0\xfb\x1c\xa8\xc2\xc0\xc7\xe6\x0e\x23\xa3\xab\x26\x5e\x57\x12\xe0\x81\x29\x7e\xa2\xf9\x6c\xbd\xf5\x92\x80\x59\x90\x09\xca\x6b\xca\xe5\xb3\x32\x28\x94\x74\xf2\x8b\xae\xb4\x8d\x59\xf8\x66\xd1\x6d\x02\x1c\xda\x78\xc0\xcd\x6d\x99\x4e\x70\xa7\x1f\xaf\x23\xf3\xcc\xff\xb6\xcc\x3e\xa4\x12\x56\xa3\x9f\x17\xfd\x6c\xfd\x5a\xcc\xa9\x9f\x67\x81\x34\xc5\xfa\xdf\x8f\xa4\xf9\x0a\x34\xd6\x09\x42\x29\x4a\x77\x09\x6d\x14\x52\x74\x78\xdb\x44\xeb\x9a\x35\xee\xb8\x66\x99\xcf\x5f\x8c\xc0\x25\xbd\x97\x55\xc2\xbb\xe0\x27\x7f\xcc\x5f\xbe\xb6\x4c\x4a\x59\x66\x2d\xe4\xbc\x2f\x5d\x4a\xb1\xdb\xf7\x8d\xd2\x8b\xc9\x21\xb4\xd9\x34\xa3\xc9\x5f\xa4\xb8\xa9\xd6\xb6\x9c\xb3\xba\xbb\xec\x00\x52\xc6\x75\x61\x62\x3e\x22\x7f\x6f\xbd\x2d\x35\x02\x0b\x74\x25\xea\x4e\x91\x0c\xb3\x93\x08\x9e\xa4\x5f\x3a\xd3\xb0\xec\xe9\xb0\x45\xe0\x10\x37\x64\x3e\xdb\x96\x1d\x12\xc0\x9a\xd2\x81\x5e\x57\x46\x09\x1d\x2b\x7a\x0d\x09\x91\xe3\x97\x7e\xa4\xc8\x68\xb7\x15\x04\x00\xc0\xe5\x5e\x2d\xeb\x0a\xc7\x7f\xe9\x16\x80\x31\x59\x19\xb8\x21\x4d\x58\xc3\xa2\x89\x96\x20\xa1\x9e\xb3\x53\x8c\xda\x2a\x29\x07\x39\x8e\xa8\x91\x98\xe3\x13\x0c\x0d\x1d\x84\x74\x15\xe2\x49\xbc\xae\x3d\x19\x84\x77\xbd\x8d\xa3\x57\x2a\x11\x86\xd5\xf0\x9e\x72\x47\x88\xb6\x47\xf2\x11\xe7\xae\xf4\xee\x41\xe4\x6e\x07\x17\x16\x5e\xac\xa1\x1d\x0d\x26\xfe\x41\x20\x90\xfd\xe8\xc4\xab\x5c\x5e\x5a\x99\xec\x09\x52\x03\xf2\x0f\x84\xca\x04\xa7\xa8\x89\x07\x17\xf9\xa6\xf3\x6c\xf5\xcf\x77\x99\xa8\xad\x38\xe9\xa4\x2e\x36\x42\x31\x49\x20\xb3\x78\x32\x82\xdb\x15\xb2\x76\x8c\xdc\x09\x00\x87\x58\x2e\x31\xe8\x80\xb4\xb5\xe6\xde\xc5\x8f\x6f\xd7\x80\xa9\xc8\xba\xa8\x80\x50\xc0\x6f\x40\xba\x24\x75\x70\xa9\x2b\x09\x9c\x99\x7d\x35\x2b\xd4\x60\xee\xde\x78\xbb\x6f\x6a\xb0\x35\x78\x20\xf0\xe8\xe8\x02\xbd\xc0\x2d\x81\x73\x04\x77\xb3\xc5\xeb\x55\xeb\x45\x25\x5d\x6d\xa6\x64\x4b\x02\x2d\x21\xae\x4a\x8e\x1c\x52\x32\x71\x5e\x2f\x87\x79\xd8\x38\xa9\xdf\x4f\x74\x09\x0e\x8c\x0b\xe3\x6f\x1a\xf7\xe0\x03\xf2\xe2\xc4\x09\xae\xdc\x63\x46\x4e\xd3\x3e\x5b\xa0\x31\x94\xd5\x40\x42\xaf\xec\x49\xc2\x66\xe9\x37\xbe\xc4\x4a\xc8\xb0\xf5\x8d\x17\x5e\x14\x92\x19\xe2\x6f\x60\xb5\x0a\x8a\xfb\x43\x1c\xce\x57\x66\xe9\x5a\xeb\x81\x77\x9c\x90\x67\xf0\x0a\x01\xc8\x62\xc2\x62\xe1\x9a\x0a\x0f\x6b\xb0\xa9\x39\x17\xe7\x39\x53\x6a\x61\xe2\x7c\x75\xdf\xf9\x00\x8e\x11\x7f\xa2\xea\x36\x73\xd7\x4c\xfa\xf9\x5f\xd6\x34\x8a\x97\x46\xfe\xd1\x81\xfb\x40\xd2\x01\x09\x5e\x49\x57\xec\x01\xc8\xf2\xd8\x16\x11\x7e\x40\xc5\x5c\xe4\xf5\x0d\x02\xd5\x49\x51\x70\x15\x1f\xed\xb9\x1e\xb4\x99\xf8\x28\xd3\xd9\x46\xbc\x1c\xb2\x57\x29\xdd\x94\xf9\x8e\x66\x92\x0a\x9a\x7a\x3d\x95\x3c\x04\x76\x79\xf7\x6c\x87\x0b\x31\x9c\x16\xeb\x9a\x8d\x79\xfe\x0a\xe8\x1c\xed\x7d\xb7\x46\x3d\x41\x2e\x80\x9e\x00\x76\x87\x3a\x52\xfb\x39\xd5\x64\x54\xe6\xa8\x05\xfd\x66\x5a\xb4\xfb\xaa\xb9\x5e\x86\xa7\x8a\xc3\xf8\x21\x6f\x80\x96\xdb\xdf\x43\x2a\x4b\x39\xf4\xf9\x90\xab\x5a\xb3\xeb\x0b\xc5\x92\x32\x36\x6d\xa1\x9b\x03\x96\xda\x83\x27\xa6\xc2\x4d\x92\x09\x1d\x63\x83\x39\x79\x2d\x66\x33\x23\xad\xd5\xa9\xd0\x63\x21\x92\x18\x31\x13\x43\xe6\x85\x26\x94\x8e\xcc\x0e\xae\x9e\x37\x21\xfc\x97\x05\x1c\x2d\x2e\xbf\x17\xb9\x32\x04\x04\x98\x55\xf5\xdb\x7b\x1d\x89\x17\x2b\x41\x1f\xee\xbd\xe9\x57\x4f\xef\xc2\x8f\x50\x68\x54\x6f\x5c\x3c\x3b\x02\x5e\x6d\x12\x2e\x0d\x82\xd3\x9f\x98\xab\xae\x81\x0b\x39\x88\xbc\xe2\x9c\xc4\x82\x04\x90\xdc\x3e\xd6\xe6\xbe\x06\x6d\xcd\x15\x1e\x29\xcd\x83\xa8\x4b\x81\x85\xd3\xda\xb6\x43\x20\x7a\x59\xf6\x09\xfc\xb9\xa0\x2c\xaf\xe2\x42\xe3\x69\x53\x8b\xed\xc4\x8a\xf3\x48\x44\xd9\xaf\xea\x23\xd5\xac\x12\x95\x81\x2f\xaf\xb8\xe0\xfa\x57\x98\xce\x93\x89\xf9\x69\x76\x36\xfd\x74\x3b\x43\xc6\x8c\x9b\xab\x0f\x37\xd3\x8f\x99\x90\xef\xfb\x9b\x19\x14\x15\x9f\xfd\x3c\xbd\xf9\x30\x03\xb5\x5f\x2c\x0f\x57\xcf\x02\x08\xb8\x7a\x40\xf1\x14\xf1\x48\x2e\x96\x2b\xea\xba\xbf\xfc\x3c\xbb\x54\x2a\xc4\x49\xa9\x98\x55\x88\xc7\x88\x59\x00\x8b\xfe\x4a\x0a\xa9\x81\x25\x65\x26\x95\xeb\x59\x9f\xb8\x88\xbd\xa7\x41\xfc\xeb\x53\x0a\xc4\xb3\x77\x8a\xc8\xa5\xd0\x22\xc4\x3f\x7d\xba\x33\x97\x57\x24\x42\x0c\x44\x2b\xc5\xd7\x93\xbb\xe8\xb2\xf6\xbd\xfc\x2e\x48\x16\x33\xbb\xbc\x3b\xbf\x99\x99\x9b\xf3\xdb\x7f\x31\xd3\x5b\x1e\xd6\x7f\xfd\x34\x95\xe7\x0c\x6a\xbf\xb3\x69\x84\x4a\xf1\x5f\xaf\x3e\x4d\xcc\xed\xcf\x57\x9f\x2e\xde\x65\x7f\x8f\xc3\x34\x33\xef\x66\xef\x67\x67\x77\xe7\x7f\x9c\x15\xa0\x0d\x3c\xbd\xbd\xfd\xf4\x71\x46\xa3\x7d\x0b\xf5\xe7\xd3\x8b\x0b\x73\x39\x3b\x9b\xdd\xde\x4e\x6f\x7e\x35\xb7\xb3\x9b\x3f\x9e\x9f\xc1\x28\xdc\xcc\xae\xa7\xe7\x44\x07\x73\x73\x83\xc5\xe9\x78\x4e\x9c\xe6\xe5\xfa\x23\xe4\x32\xf9\x32\x80\x02\x7c\x14\x9e\xbe\xbb\xd2\xb3\x0e\xdc\x32\x71\x7e\xfa\x53\x5f\x70\xcd\x7e\x9a\xfa\x5f\xcd\x2f\x3f\x5f\x99\x8f\xd3\x5f\xb1\xe8\xe0\x57\x5e\x1c\x37\x33\xa9\x4a\xc8\xd7\xc4\xf4\x56\x2d\xcd\xe9\x4f\x57\x71\x0c\x06\x62\xc9\x4a\xc1\xb9\xd0\x24\x06\x97\xbf\x72\x19\x72\x31\x26\x9a\xfc\x3c\xc1\x4d\x9f\xd5\xe6\xc6\x9c\x5f\x2a\x4d\xe8\xfe\xa6\x3c\x4c\xef\x1e\xae\x3e\xe1\x25\x60\x4a\x02\xf8\xdf\x9f\x66\xf1\xd3\x37\xb3\xcb\x77\xb3\x1b\xd8\x4c\x28\x7f\x7d\x07\x2f\x8b\xdf\x98\xdd\x9a\xdb\x4f\xb7\x77\xd3\xf3\x4b\x21\x05\x42\x89\x66\x16\xa3\x3e\x27\x6e\x04\xf3\x7e\x7a\x7e\xf1\xe9\x66\xb0\xc4\xee\xae\xcc\xd5\xf5\x0c\x1e\x09\x4b\x4d\x4d\x08\x7e\xe2\xf6\x28\xf1\xf3\x00\x03\x4f\xa2\x10\xd2\x13\xf7\x17\xc9\x3d\xff\xa3\x8b\xd1\x7f\xff\xf7\x77\xff\x37\x79\x75\x36\x3b\x3b\xbf\xb8\x38\xfe\xe9\x1f\xc5\xff\xf0\xf6\xf4\xcd\x49\x9f\xff\xe7\xf4\xf5\x37\xdf\xfd\xce\xff\xf0\xf7\xf8\x77\xe6\x70\xf6\xd1\x2c\x11\x6e\x19\x96\x97\x87\x2b\x04\x88\xd0\x2e\x01\xb9\x8c\x14\x0d\x53\x09\x36\x03\xca\x2e\x37\xc5\x85\x19\x56\x3e\x24\xc5\x2d\x89\xa9\xb4\x86\x2c\xf0\xa2\x23\xd8\x1c\xab\xdd\xfa\x36\x48\xe9\x3c\x78\xd8\x4b\x84\x68\x10\x13\xe3\x50\x35\x1d\x4d\x42\xc8\xbb\x6d\x1b\x5f\x2d\xfc\xb6\x74\x01\x8c\x46\xac\x53\x0b\x66\xd9\xd8\x55\xcb\xb0\xa3\x7f\x32\x2b\xdf\x84\xb6\xdc\x15\xa3\xcf\xd2\x8f\x00\x16\x4d\x36\x09\xfb\x61\xd1\xac\xc7\x3f\xa8\x8c\x72\x96\x0a\x9e\x37\xb5\x5d\xf6\xd3\x18\x48\x6e\xd4\x84\x02\xdb\x13\x5c\x34\xd1\x63\x83\x20\x57\xae\xc4\xaa\xac\x6a\x03\x88\x45\xbf\x6f\x5c\xb5\x58\xe3\x7f\x43\x93\xc9\x14\x6f\xd1\x1a\x47\xc4\x0b\x10\x41\xd4\xed\x3a\x3a\x33\x08\x1e\xa4\xd0\x82\x7d\x04\x3f\xa2\x6e\x48\x03\xd5\x57\xad\x03\xc0\x5d\x87\xda\xbc\x18\xa3\x84\x87\x73\x44\x55\xd5\x92\xe0\x14\xb6\x4a\x8d\x1b\x5f\x42\x73\x15\xbf\x81\xd1\x1b\xf1\x56\x62\xbf\xea\x8d\x5f\x08\xde\xf0\xc1\x35\xaa\x2e\xf8\x6e\x9d\x48\x12\x98\xac\x12\x96\xe2\xff\xf8\x7f\xd3\x0a\x6a\xdc\x0f\xac\x98\x73\x56\x6f\xa2\x3f\x62\x1b\x6f\x5b\xf3\x3f\xff\x9b\x29\x5f\xce\x2a\xd7\xdc\x7b\x67\xa6\x6d\xbd\xf1\xff\xd6\x39\x73\x6c\xce\x66\xd3\xc2\x58\x0e\x58\x86\x85\x47\x18\xed\xa2\x30\xad\x5b\xac\x51\x0c\x07\xfb\xbe\xec\xe2\x84\xda\x12\x24\xe6\x81\xd9\x44\x44\x03\x11\x79\x4e\x25\x5c\x71\x05\xd1\xaa\x88\xc3\x04\x60\x80\x7a\x65\xe6\x5d\xf0\x55\x9c\x72\xdb\x9a\xd3\xb7\xa6\xe9\x9c\xb9\x70\xf3\xd2\x56\x8b\x02\xa0\xc6\xdd\xbc\x8c\xbf\x31\xd7\x75\x65\xab\xd6\xbc\x2b\xcc\x77\x6f\x5f\x9f\xbc\x35\xd7\xb6\xf1\xa1\x40\x02\x94\xa4\x06\x74\xe6\xaa\xb6\x71\xe6\x12\xfc\x57\x1b\xdd\x16\x53\x5a\x73\xe3\x16\x6b\xd7\x2c\xd6\xce\xdc\x72\x47\xa8\x97\x97\x37\xb7\xa3\xdd\x24\x28\xff\x62\x5d\xd5\x65\x7d\x0f\xbd\xfd\x8b\x7b\xf5\x06\x3a\xf5\xd1\x2f\xd6\xae\x3c\x9e\x56\xf7\x2e\x76\xe1\xbb\xef\xbf\xc1\x2e\x98\x85\x5b\xba\x2f\xe6\xe4\xdb\x41\x5f\xce\xa9\x60\x2e\xeb\x4d\xea\x8a\xab\xcc\x39\x43\xb3\x62\x6f\x5c\x1b\x7f\x35\xa5\x2c\x26\xf6\xef\xfc\xf2\xe6\x7c\x7c\x1e\xff\x9a\x1d\x7c\x57\xc7\x53\xc3\xc5\xe6\xfd\xb1\x2e\xbb\x85\xb3\x5d\x61\x6e\xea\x05\x84\x51\xeb\xae\x69\x0b\xf3\xd3\xb5\x39\x79\xfd\xb6\x30\xdf\xfd\xe1\xe4\xed\x9b\x38\x9d\x67\x6b\x17\x2a\xbb\xc3\xde\x67\x5d\x67\x6e\x15\x33\x72\x3e\x56\x99\xf4\x62\xe8\x9f\x93\x19\xfb\x09\x55\xa5\x34\x01\x92\xfd\x00\xb1\x02\xb1\x0a\xe1\xc7\x78\x4a\x9c\xa1\xff\xe8\x65\x12\x44\x66\x4c\x3a\x27\x59\x21\x93\xbd\x4a\x05\xf2\xf1\xe9\x78\x8a\x88\x5e\x37\x68\xeb\x5a\x13\xda\xa6\x8e\x1f\x96\x34\x5b\xfc\xde\xbd\x87\x61\x5e\xc4\x26\xb4\x21\x55\x52\x43\x80\x32\x0f\x9f\x42\x64\x4d\xe1\xf8\x38\xb8\x81\xf5\x62\xf2\x87\xa6\x2b\x55\xdd\x31\xe9\x7b\xf1\x10\x61\xfe\x10\xa9\xd5\x7a\x29\x85\xb9\xa3\xc3\x2b\x17\x88\x86\x48\xfc\xe2\x73\x55\x3f\x96\x6e\x79\x4f\x24\xa6\xe7\x95\xc0\xdf\x13\x54\x58\x8e\xee\x3e\x0e\x88\x4f\xc1\x04\x8c\x7e\x5a\x1e\x83\x0f\x78\xea\x83\x20\x71\x70\x3a\x09\x39\x81\x28\x1b\xcc\xdd\x21\x38\x94\x53\xc1\x52\x01\x24\xf9\x2c\x1a\x9a\x97\x7c\x25\xe2\x15\xb1\xce\x04\x61\x7a\xa7\x6c\x3a\xbb\x43\x87\x62\x7f\x0f\x4e\x12\xfe\x01\xdf\x0b\x51\x49\x7e\x6b\xe9\x49\x2b\x89\x07\x08\x56\x04\xb1\xed\x12\xd8\xc0\x87\xcf\x41\xc3\xed\xa0\xe1\x65\x6d\x91\xee\x7b\x40\x24\x4d\x81\x66\xd2\x2d\x65\x45\x17\xb7\x05\x76\x03\x89\xb1\xf0\xbc\xd3\x68\x41\xc1\x0a\xfc\x0c\x29\x8f\x56\x31\xca\x37\x71\x00\xda\x36\x4e\x6d\x5d\x15\x14\xe6\x8d\xab\x2e\x37\x3b\x30\xf2\x23\x40\x60\xbb\xc3\x48\x93\x6f\xe9\xa6\x5f\xd8\x74\xfb\x16\x9a\xaf\x19\xec\x11\xba\xdf\x02\x96\x84\xc1\x08\xb8\xe6\x81\x50\xa8\xd4\x15\x47\x17\x9d\xfb\xb2\x75\x8d\x77\xd5\x02\xcb\xd6\x56\x0e\x8c\x18\x5b\x06\x39\x7d\xaa\xe3\xa5\xdb\xb6\xeb\x54\x91\x22\x0b\x71\x62\x3e\xc9\x72\x68\x19\x13\x63\xf0\xc4\xb1\xf7\xc4\x67\x1f\xad\x06\x3c\xe9\x02\xd1\x77\x74\x5e\x34\xad\x7a\xfc\x29\xbd\x7b\xde\x37\x79\xcd\x89\xcf\x42\x80\xae\x8a\x67\x25\x4f\x81\x5b\x74\x2a\x43\xe8\x39\x8b\x25\x85\xe8\x4b\xdb\x5a\xda\x62\x68\x7f\x41\xab\x0a\x84\x1d\x4b\x18\xac\x48\x14\xd5\x4b\xc2\x11\x3a\xa2\xc2\x11\x10\x5d\x0e\x1a\xe0\x17\x4f\xfa\x87\x25\x71\x0a\x90\x36\x0b\x2f\x19\xda\xcd\x12\x6b\x56\x25\x9f\x9a\xe4\xaa\x75\x4d\xaa\xf8\xc6\x4a\xc5\xad\x90\xad\xc3\x78\x53\x60\x1d\x59\xbb\x60\x4d\x6e\xea\x07\x3a\x24\x57\x4d\xbd\x49\x59\xb9\xbc\x49\x52\xd0\x42\xca\x96\xf1\x1c\xca\x48\x27\x13\x52\xf2\xc9\xcd\x49\xd9\x46\xb4\x13\xbb\x39\xab\xd8\x52\xdd\x69\xe3\xc0\x3c\xa3\xab\x8b\x1b\x8e\x15\xf7\x4d\xeb\x17\xa5\x33\x27\xe6\xd8\xbc\x9b\xbd\x3f\xbf\x44\x9e\x88\xf8\xa7\xf7\x5c\x45\xdc\xcb\x55\x4b\x0f\xa8\x1c\x32\x43\xe0\x33\xf0\x0f\x46\x06\xe0\xca\x62\x05\x5b\xb3\xb0\x5b\xdf\xda\xd2\x94\xae\x6d\xa9\xce\x63\xa7\xa5\xf4\xf3\x27\x6d\x9c\xad\x14\xa6\x9f\xfe\x47\xde\xfe\x83\x96\x81\x1c\x38\x06\xa9\x82\x68\x5b\x93\x2e\x69\xe8\xe6\x98\xc9\x6c\x53\x4a\x00\x91\x1f\x95\xfb\x42\x59\xfa\xf4\x9e\x64\x81\x6b\xb5\x46\xb9\x6a\xe0\xd1\x57\x08\x5d\x3a\xa3\x23\x3d\x2e\x6c\xd2\x13\x39\x23\xb0\xf1\x06\x97\xf5\x23\x94\x63\x52\x36\x79\x0e\xf8\x8f\x38\x67\x5a\xef\xb1\x30\x07\x36\x18\x1f\x0e\xd2\xa0\x5e\x70\xb2\x17\x71\x67\xd8\x06\xe9\x7f\xaf\xbd\xe7\x95\x6f\xa3\xd1\x39\xd6\xee\xdb\x5e\xbb\x75\x23\x61\xfd\xe3\x10\xed\x06\x9d\xfa\x8f\xf4\x00\x37\x10\xf8\x44\x4f\x42\xf8\x7b\xb9\x0e\xce\x1b\xee\xe9\xa6\xd0\xe4\x3f\xd9\x4f\xcd\xba\x23\x85\x10\x75\x05\xa4\xb0\x49\x4e\xa7\x3f\xe1\x32\x28\x3f\xf4\x10\xe4\xb7\xe9\xba\xcc\x65\x71\xaa\x54\x5c\x5c\x46\xeb\x0f\x4a\x9c\x30\x95\x87\x77\xbf\x57\xac\xff\x82\x54\x52\x28\xb8\x5b\x71\x5a\xb2\xb6\xa8\x39\xd0\xfd\x63\x58\x36\x94\x7f\x53\x92\x3b\xa9\x72\xb6\x22\xf1\x39\x26\xbe\x79\xc6\x30\xdf\xf4\x16\xe4\xaf\xd7\x2f\xc0\x33\x06\xb4\xa3\x9f\xf0\xb4\xe2\x1f\xfa\xcb\xad\xf7\x68\x5e\xba\xa3\xb3\x13\x2f\xde\xf8\x0e\xba\xd2\x70\x75\x53\xb1\xc2\xbe\x79\x57\xd2\xd3\x32\x3b\x69\x83\xd0\x93\x50\x72\xf1\x2b\xe7\xfb\x82\x4c\x17\xdd\x44\x56\x68\xce\xc0\x75\x89\x62\x08\x24\x10\x80\xb5\x2a\x5a\x0c\xed\x0e\xaa\xf4\x32\x73\x34\xef\xa7\xac\xf4\x67\x7b\x05\x85\xce\x49\xaf\x38\x55\x29\xa4\x4a\x88\x02\x2b\x48\x58\x9f\x4a\x51\xb3\x44\xd3\x6c\x69\xb7\x6d\xce\xf5\x02\x64\x71\x5d\x45\x4b\x15\x41\x3b\x89\xf9\x25\x6b\xe8\x7c\xa7\xdf\xaa\x86\x3a\x00\x6a\xf1\xd1\x95\x25\x18\xc9\xe9\x33\x48\xb7\x6c\xcb\xb8\x1f\xbb\x72\x70\x78\xe2\x6f\xd3\x44\x05\xd7\x62\xa2\x2b\x2e\xc5\x40\x0b\x38\xd5\xb7\xa3\x89\x90\xcb\xdf\x22\x2f\x57\x05\x6a\x89\x20\xc0\x8c\xb0\x21\x58\xff\xd2\xab\xba\x61\x72\x3e\x30\x47\xb8\x72\x4f\xe7\x45\x57\x9a\xf0\x70\xcf\x6a\x9d\x7d\xc9\x7a\x33\x32\x13\x1f\x59\xaa\x71\xb4\x2e\xf6\x56\x28\xd0\x92\x2c\xa2\x0f\xf4\x25\x31\x9b\x6f\x93\x3f\x02\xa8\x0b\x29\x4c\x65\x48\x42\xd8\x22\x84\x05\xc9\xa5\x2b\x67\x16\x36\x95\xce\x53\x5d\x1f\xdd\x0d\xc8\x63\xd3\x74\xfd\x45\xdd\x9b\x97\xbd\x3d\x01\x2c\x68\xe5\x16\x64\xb7\x66\xcd\x53\xd2\x8e\x84\xf7\xc3\x22\x0a\x97\xd9\x5d\x59\xa3\x7b\xad\xb8\x46\x30\x2c\xbe\x1d\x1f\x91\xdf\x67\x34\x22\xbc\x05\x55\x55\xb3\x36\x1f\xc8\x66\x83\xaa\x1a\xc4\x1d\x56\x26\x7a\x04\x00\xec\x83\xb3\xb7\xec\x1a\x5b\x92\xae\xb0\x32\x66\x4e\xcd\x31\x67\xe6\xd8\x37\xcd\x8c\x18\x97\x7b\xd1\xf1\x17\xa8\x8f\x42\xcb\xe4\x42\xc1\x98\xb3\x86\x43\xe8\xac\x27\x62\xc2\xa4\x2a\x80\x41\x84\xd2\x03\x56\x35\x49\x40\x69\xb2\xa4\x6e\x95\x61\x1d\xb7\xc4\xaa\x6e\xb0\x57\xdc\xf0\xb7\x84\x44\x46\x71\x36\xfe\x1a\x02\x0e\x81\x59\x89\x9a\xaf\xa2\x67\x3d\xd7\x30\x8b\x88\x59\xbf\xcc\x97\x3c\xbf\xe7\x8d\x39\x36\xd3\xb3\xb3\xd9\xf5\xdd\xf4\xf2\x6c\x46\xb3\xf6\x66\x72\x02\x43\x25\xbd\x45\xcb\x6c\xee\xcc\x32\x8e\x15\xd4\xb7\x8d\x1d\xd9\xfb\xaf\xf1\xcc\xdc\x05\x9f\x1f\x56\xf2\x02\x7d\xf0\x04\x28\x43\x23\xa1\x5f\xcc\x09\xe5\x2e\xad\x30\xaa\x90\x36\x25\x39\x87\x4f\x1d\x60\xb0\xe6\x61\xab\xda\x79\x74\x22\xe6\x3b\xb3\xac\x1f\x2b\xfe\x26\x55\xf5\x44\x13\xbd\x75\x70\x7e\xd0\x91\x3f\xdf\x99\xde\x67\x84\x40\x07\x0b\x09\x7f\xec\x29\x60\xa6\xb6\x23\x86\x49\x0f\x1e\x23\xce\x03\xeb\xe2\xed\x81\x9d\xa7\x10\x0a\x4c\xc1\xa9\xb9\xaa\xf2\xfa\x48\x65\x6e\x2b\x5a\x30\xa1\xfb\x68\x5c\x49\x4c\x31\xa4\x81\xb9\xb6\x8d\x5d\xb4\xae\x01\xa5\x16\xa5\x0d\xcd\x47\x14\x7d\xae\x1f\x1b\x28\x34\x9b\xd1\xca\x2e\x46\xfd\x56\x46\xea\x41\x49\x76\xf2\x54\x31\x0c\x21\xdc\xc5\xa9\x66\xb7\xb7\x7d\xb6\x8d\xc7\x4d\x05\xb1\xf8\x54\x4c\xb1\x6f\x3b\xc4\x15\x49\x1b\x02\x09\x79\xf2\x83\x23\x5e\xfc\x48\xb8\xaf\xc2\x31\x41\xe2\xc9\x6b\x70\x5f\xc9\xdf\x25\x62\xc7\xba\x5e\x72\xe9\x04\xbf\xe4\x1b\x73\x6c\x66\xef\x29\xad\x6e\xde\x4d\xef\x66\x90\xaa\xbf\x9b\xdd\x7c\xa4\x59\xf9\x66\x72\xd2\xfb\x04\xfd\xe1\x2e\x3b\x49\x78\xbb\x80\x9a\x22\xf2\x0d\xfa\x87\x5c\x0c\x47\x19\xc6\xb2\x85\xb2\x33\xc7\x3d\x39\x18\x13\x69\xd0\xa9\x6e\xdf\x58\x33\x54\xc1\x50\x4d\xe2\xa6\x68\xd0\x21\x45\x00\x5a\x31\x7c\xa4\xa8\xe3\xe4\x39\xbb\x6f\xf4\x38\x79\x6b\x8e\xcd\xed\xd9\xd5\x35\x64\x9c\x21\xef\x7f\x6b\x3e\xdc\x4c\x2f\xef\x66\xef\xf8\xfc\x95\x23\x55\x4b\x24\x84\xfe\x0a\x41\x83\x8a\xdc\x9d\xa2\x77\x1c\xec\x6b\x4a\xaa\x85\x10\x66\x0f\x5c\x29\xdc\x67\x7d\x72\xaa\xdd\x44\x13\x33\xb7\xc1\xcb\x36\x19\x87\x5f\xc9\x74\xa8\xd3\x19\x06\xe0\x27\x17\xa2\xd7\x5d\x30\x47\x8d\xf4\xb2\x7e\x24\x2d\xce\x7a\x83\x5e\x41\xfd\x58\x61\xc5\x7a\x83\x31\x0e\x06\xb3\x2a\x6c\x35\x30\x4a\x35\x42\x39\x01\x9d\x4f\x96\x4e\xbe\x8d\x09\xb2\x87\x84\x72\x5c\x8f\x59\xe4\x6d\x80\x25\xdf\xda\xcf\x8c\x1d\xad\xa9\x84\xc5\x8d\x1d\x45\xb8\x0a\x43\x6a\x18\x2b\x4b\xa9\x60\xdf\x85\xd0\x4e\x50\x60\xce\x7d\xd9\x96\xb5\x1f\x2f\x5d\xba\xed\xb1\xa2\xea\x47\x37\x49\x8e\x0b\x02\x2b\xfb\x9a\xdd\xd6\x29\x2e\xc0\x5f\x70\x0e\xf1\x70\x8b\xc6\xcf\x05\x63\xa6\xeb\x3b\xb2\xcd\x83\x78\x3f\xdb\x58\xc0\xed\xf2\xfe\x79\x3b\x39\xc1\x65\x4a\xe2\x10\x6a\x1f\x5d\x68\x92\x42\x08\x8d\xfa\x7f\x97\xd8\x5e\xef\x24\x15\x4d\xf2\x6a\xd7\x83\xd7\xd2\x11\xb7\xf2\xae\x5c\xf6\x75\x1a\xc9\xbe\xf3\xad\x99\xbb\x38\x58\xfa\xc6\x67\xc4\xe8\x52\x59\x91\x71\x7e\x9b\x78\x91\xa8\x8b\xf0\x64\x02\x20\x3a\x5b\x51\x51\x4e\xeb\x36\xdb\x1a\x68\xbc\x39\xb2\x25\x31\xe8\xe1\xa2\x7a\xea\xd6\xa4\x14\x96\xfe\xbd\x58\x57\xf8\xef\x74\x92\xe2\xb3\xc4\x5c\x05\xff\x4d\x64\x58\x70\x91\x86\xb6\x6e\x06\x77\x74\x5d\xe5\x6f\x8b\x17\xaa\x7a\xee\x9b\x09\x3a\x55\x25\xe5\x75\x6b\x53\xcf\xe1\x6e\x2e\x4c\x68\xbb\xe5\x0e\xbb\x19\xf0\x46\xa2\x9a\xe2\xba\x4a\x4e\xf5\xd2\x61\x19\x25\x4e\x92\x5f\x3a\xcb\xfe\xb9\xe4\x5d\xe7\x6e\xed\xb9\xd2\xa7\xe1\x90\x3f\xa4\x94\xe2\x1b\x5d\x99\x94\xf5\x72\xcb\x89\xe0\xf4\x70\xae\x62\xc0\x6e\x18\xa2\x59\xd8\x06\x50\xda\xbc\x1e\xe8\x05\x4f\x0f\x55\xc6\x17\x44\xe3\x06\x6c\x1f\xd2\xbd\x5e\xa6\x55\xdd\xe2\x74\xc9\xf9\xc0\xc3\xb6\x4c\x74\x72\xb1\x11\x03\xdb\xe2\xed\xe4\x14\x10\x6a\x77\x17\x98\x74\xbf\xbb\x32\x1f\xa7\xff\x32\x4b\xe2\x60\x1c\xf7\xa3\x9d\x20\x34\x2b\x10\xeb\x3e\xcb\x92\x23\x99\xa8\x9f\x7c\x50\xd8\x45\xc9\x1f\x2d\x0c\xd8\x16\xf7\x58\x32\x0c\x8f\xd9\xe7\xdc\xf6\x9d\x90\x22\x4f\x91\x20\xb8\x97\x62\xb6\x2a\xb6\x8e\x4c\x0a\xb9\x4f\xf7\xf4\x2e\xee\xb7\xe2\x6c\xac\x8e\x44\xd6\x6c\xce\x3e\xe2\xdb\xd4\x71\x5d\x16\xa0\x89\xd7\xbc\x78\x14\x84\x7b\xe5\xd5\xa4\x5f\xc4\x89\x62\x48\x1c\x84\x64\x1e\x30\x23\x46\xe3\xd8\x07\x86\xd0\x6d\x9a\xc1\x37\xe9\xd8\xd2\xdc\xbd\xe2\xfc\xa9\xca\xa7\x42\x8d\x5e\xdd\xab\x8b\x1f\x9f\xbe\xc4\xfd\x87\xcb\xb2\xa5\x7b\x70\xb3\xe9\x2a\x2c\x82\xcd\xc6\x86\xc6\x8a\x82\xf5\x9c\x50\x1d\xdb\xe5\x38\x99\xa3\x36\xfa\x60\x96\x37\xb6\xf9\xec\x12\xad\xad\x1f\x4b\xab\x21\xe1\x7a\x4d\x80\xdb\x7a\x45\xb4\x25\x45\x76\xc1\xe6\x44\x93\xfd\x33\x0f\x5e\xbf\x6f\xc5\x70\x51\x69\xbe\x72\xf6\xd2\xcd\x4b\xb0\x11\x2e\xaf\x4d\x3f\x40\x49\x25\xa1\xba\x58\x1f\xf8\x34\x94\xcd\xfe\x1b\xad\x0e\x59\x0d\x93\x93\x49\xce\xe1\x7c\xf5\x3e\xc1\x6c\x18\x3b\xdb\xe7\x74\xfe\x9a\x5d\xa2\x93\xbf\x4d\xb7\x77\x30\x7d\x95\x85\x92\xeb\x66\x10\x3c\xee\x73\x68\xc2\x56\xe8\xa1\xc8\xb5\xcc\x29\x47\x5c\x55\x7a\x65\xe0\xb1\xc3\xe6\x09\x8a\x0b\x22\xae\x2d\x75\x39\xe2\xfd\x68\xf7\x38\x51\xd9\xe7\x4e\x27\xfb\x1d\x29\x75\xa3\xd7\xab\x7e\x10\x03\x78\xe6\xb3\xb4\xaa\x64\x3b\xf7\x19\xf0\xc1\xfc\x01\x3e\xf8\xbd\x6a\x02\x67\x94\x84\xd2\x8f\xa9\xc7\x6d\x8b\x09\xd5\xf8\x3b\x3d\xa6\x83\x19\x08\x59\xa2\x38\xb3\xa5\xa2\x2f\x11\x6d\xe7\xa0\x9c\x91\x3c\x25\x0d\x5c\x02\xd9\x0c\xf6\x1e\x6f\x5b\x63\xcd\xc6\x57\x7e\xd3\x6d\xcc\xb2\x93\x4b\x9d\xbc\x88\xe8\x01\xd6\x4b\x36\x44\x47\x15\x85\xe5\x3c\x17\x7b\x47\x79\x62\x49\x15\x6d\x29\xd0\x00\x66\x1a\xb2\x8b\x7f\xeb\xbc\xb2\x22\x52\x23\xf1\x22\xa6\x22\x62\x47\x41\x08\xfe\x5a\x46\x71\x4b\x07\xab\xed\xed\x9a\xd3\xe1\xae\xc1\x4d\x32\x7b\x27\xdb\x27\x7d\xe3\x7c\x95\x8f\xe9\x06\x4c\xd3\x78\x88\x64\x47\xfa\xe0\x02\xcb\x6f\xa9\x41\xde\x62\x3f\xcb\xb9\x1d\x81\xb9\x29\x36\xec\x5e\x58\x45\xd5\xcf\x8f\xc3\xce\xf4\x46\x12\x87\x6d\xf2\x66\xf2\x4d\x6f\x54\xde\x0c\x47\x65\xf6\xa7\xbb\xd9\xcd\xe5\xf4\x22\x0e\xcf\xa7\x8b\xd9\x6d\xfa\xc2\x2f\x03\x03\x28\x7a\xdb\x9c\xcc\x86\xaa\xb9\x5e\x50\xb5\xf8\x2d\xb1\xa2\x3e\xdd\x1f\x1c\x1b\x23\x0f\xb4\x4f\x90\xc5\xdb\x14\x60\x1d\x8c\x67\xaf\xeb\xdf\x4c\xcc\xd9\xcd\xec\xdd\xf9\x9d\xea\xe1\xb4\xda\xa5\xce\x45\xaf\x14\x0b\xca\x92\x30\xc5\xc8\x94\x92\x6f\x9b\xb8\x4f\xe0\x85\x71\xbb\x0d\x8e\x27\x21\x96\xf0\x4c\x56\x80\xb4\xec\x23\x41\x70\x34\x29\x32\xca\x86\x3e\x20\x52\x85\x92\x0a\x42\x8f\x68\x63\x69\x1c\x8f\x47\xe7\x5e\x3f\x38\x39\x38\x21\xb5\x54\x75\x2a\x1a\x5c\x26\x46\xe5\xc1\xad\x40\xa0\x23\x70\xc4\x9f\x7c\x37\x1e\x9c\x38\x39\xd2\x03\x43\x60\x1e\x51\xec\x77\x36\xf8\x38\x98\xe8\x88\x32\x5b\x95\x55\x9c\xeb\xc3\xa9\x90\x92\xd0\xbc\x3b\x6f\x26\x66\xc3\x68\x0f\x80\x20\x11\x20\x40\x3d\xfb\xd1\xcd\x83\x6f\x41\xa6\x2a\xfa\x98\x7c\x8e\x0c\x5e\x51\x64\x14\x6b\x75\x77\x0f\xbe\x60\xdb\x47\x74\x42\xf0\x21\x11\x20\xff\x75\x26\x34\xeb\xe6\xbe\xd1\xcd\x7b\xfe\xcd\x84\x72\xb8\xf8\xf6\xac\x26\xba\x36\x56\xb3\xc1\xa5\x8d\xf5\xcc\x7a\x67\x07\x98\xa2\xc2\x6c\x5e\x03\xad\xbe\x46\x3b\x3d\x58\x5f\x62\xd2\x58\xfe\x3e\x8f\xae\x9c\x5b\xad\x00\x33\xda\xd3\x43\x87\xdd\xae\xdb\x23\xdb\x08\x8f\xb8\x9d\xe6\x30\x7a\xca\xf1\xe7\xe3\x6e\x32\x38\xcd\x95\x13\x4f\xa4\x17\xa4\xcc\xc1\xe6\x5b\xd1\x1f\x24\x34\x4f\x06\xc7\x5a\xd2\xa1\x5a\x51\x89\x33\x9a\xac\x15\xc5\xd3\xa4\xa5\xf9\xc5\xd0\x8b\xb1\x13\x64\x63\xec\x98\x93\xbb\xba\x6e\xdc\x7d\xed\x33\xb8\x5c\xe8\x9d\x63\x6f\x27\xe6\xec\xea\xe3\xf5\xf4\x8e\xab\x30\x44\x7b\x12\xf1\xaf\x28\x06\x82\xa8\x6c\x11\xe2\xcb\x4f\xf5\x66\x7c\xa6\x95\x9a\x47\x76\xeb\xe5\xec\x2d\xfc\x9a\x52\x31\x7e\xe8\x1b\x68\x3c\xe7\x11\x0f\xe0\x94\x6b\xc0\x7a\x56\x5b\xaa\xae\x4d\x7f\xcb\xed\x99\x9a\x71\x7c\x26\xe5\x90\x52\x29\x6d\xa1\x56\xfa\x3f\xdc\x2e\xfe\xcc\xb7\x00\x29\xbd\x9b\x5d\x5c\xcc\xce\xee\x3e\x4d\x2f\xcc\xf5\xcd\xd5\xf5\xec\x06\x0b\xf6\x80\x9e\xe7\xc4\x5c\xfd\x71\x86\xf5\x76\x80\xad\x99\x5e\xf4\x4d\x8c\x3b\xc9\x3b\x63\xd4\xf0\xb7\xa5\xdd\xe1\x9e\x4a\x81\x4f\x3e\x8c\xfb\x9f\x8b\xab\xf9\x19\x4b\x61\xf4\x6a\xc6\x31\x4d\x20\x24\x6a\x68\xbc\xec\x01\x4f\x3e\x70\x17\xe2\xde\x16\xae\xea\x0a\x59\x3a\x65\x0c\x75\xa4\x42\x81\x20\xf6\xb2\x24\x0d\x0e\x53\x76\xa6\xf7\xa1\x0f\xd4\x58\xea\x30\x22\x9b\x99\x83\x51\x81\x4a\x50\x0a\x95\x23\x4a\x54\xce\x74\x56\x0f\x51\x01\x63\x69\x52\xc7\xc1\xa7\xb1\x75\xf3\xcd\xe4\x74\x22\xd3\x7f\x9a\xa6\x7f\x5f\x9c\x25\x33\x32\xc8\x82\x1a\xec\x33\x8a\x29\xd4\x8f\x55\x82\x80\x8d\x9f\xfd\xf9\x8a\xf1\xa1\x17\x78\x08\xc8\x63\x48\xd0\x18\x81\xf3\x98\xd2\x3e\xa6\x56\xbf\x49\xad\xde\x63\x02\x3e\xd1\xf0\xe1\x11\xf9\x1f\x68\x7c\xff\x51\x4f\xb5\x9f\x1d\x43\x88\x0a\xb4\xa9\x2e\x3c\xae\xb0\x1d\xd2\xdf\xf6\xea\x46\x70\x61\x62\x29\xc4\xc0\x85\x49\xc3\xf1\x8d\xf9\xe7\xab\xf3\xcb\x3b\xac\x54\xbd\xdd\x37\x7d\xc9\xea\x4b\x4b\x2f\x0f\xd9\x52\x14\x1e\xb1\x81\x45\x0a\x99\x27\x45\x14\x5b\x55\x9a\xff\x78\xdf\xcd\x0e\xa0\x55\xbb\x58\x0f\x93\xf7\x3f\x66\x81\xda\x2c\x6a\x06\x1b\x87\xbe\x4f\x6f\x24\x54\x33\x24\x38\xe9\xd5\x64\x8e\xee\x71\xf8\x75\xa8\xa3\xaa\xdb\xd1\x00\xca\x30\xed\xb0\x87\x7b\x48\xa8\x6d\x9e\x5f\x0f\x2b\x7d\xf8\x10\xbe\x45\xc3\x54\x06\x66\x14\xe7\x32\xed\x67\x37\x86\x5d\x7b\xf0\xe1\xf8\x7f\xfe\xb7\xe3\x07\x1f\xd0\x58\x69\xed\x6a\x85\xcc\xf9\xcc\xde\xb6\x71\x36\x1a\x24\x21\x23\xd3\x23\x23\x85\x20\xcc\x72\x1a\xfd\xc7\xda\x9e\x5d\x28\xdf\x99\x63\x73\x33\xbb\x80\x72\x6a\xac\xdd\x95\x2d\xf7\xdd\xe4\xc4\x7c\x82\xe3\xb8\xaa\x73\x7e\x21\x5a\xc7\x79\x94\x04\xac\x04\x97\xa7\x56\xda\x5a\x94\x1e\x54\xd1\x4a\x08\x3e\x10\xa9\x5d\x03\xe5\x4e\xad\xab\xe0\x47\x81\xd6\xf4\x5d\x84\x89\x00\xc8\x88\x29\x30\x7b\x4b\x2f\x24\x4d\x5c\xb8\x71\x37\xf3\x36\xe4\x07\xa3\xec\xd2\x3e\x9f\x10\x2e\xec\xb1\x76\x16\x3c\x8c\x28\xef\x92\x5a\x5c\xa4\xab\x26\x3b\x9a\x95\x2b\x88\xf8\x3d\xf0\x01\xcd\x15\x47\x58\x52\xda\x8e\x29\x3d\x61\x5e\xf5\x58\xb0\x80\xd6\xd8\xb0\xc9\x38\xe1\xdb\x7d\xb5\xe8\x1a\x15\x0f\x62\x2c\xf6\x44\x26\xf2\xd4\xdc\x22\x97\x09\xeb\xe8\x3d\x33\x76\x98\x4d\x12\xd6\x77\xa6\xdc\x46\x3b\xbb\x74\xb9\x52\x26\xaa\x88\x49\x56\x5f\x1d\x74\x10\x51\x9a\x03\x8c\x10\xa2\x8f\x80\xc8\x40\x66\xd5\x74\xb9\x8d\xd3\x8c\xe9\x8d\xf5\x8a\x3e\x39\xe2\x11\x91\x09\x36\x36\xa1\xca\xf3\xe1\x03\x1a\x31\xcb\x13\x73\x1b\x07\xbb\x87\x43\x00\x64\x45\x1c\x7a\x4f\x79\xea\xb1\x15\xe2\x49\xf9\x40\x32\x6b\x69\xfa\xc9\xd6\x41\x12\xf5\xe1\xe4\x33\xa4\x69\x29\xe5\x81\xd9\x3a\xe8\xe3\x0c\xb2\x3d\xfa\x07\x73\x0c\x55\xe7\x60\x62\xd3\x9c\xfe\x61\x72\x62\x6e\x73\x5b\x78\x3c\xf2\xf2\x87\xc9\xe9\xa8\x07\xd0\xb3\x8e\x90\x4e\x1f\xd8\x5c\xab\xc0\xb2\x7e\xa4\x2b\x07\xe7\xa7\x29\xeb\x10\x58\x2c\x0f\x92\xa4\xa1\x23\xac\xdb\x00\x96\x86\xb4\x65\xa9\x3a\xd2\x9a\x95\x85\xff\xc4\x5e\xeb\xdc\x60\xe3\x4a\xf7\x60\xab\x56\x86\xa2\xd0\x66\x23\x1e\x1e\x08\xcd\x89\x57\xc7\xc2\xf5\x53\x14\x7f\x98\x9c\x66\xe9\xfe\x97\x41\x6d\x04\xc0\x69\x0b\x39\x21\x5e\x33\x9b\x8d\x6f\x31\xed\x06\xe0\x4d\x45\xc4\x94\x07\x7c\x53\xd0\x6f\xee\x70\x87\x35\x2c\x20\x94\x3a\xe6\x75\x02\xe4\x07\x82\x0b\x85\x60\x96\x5d\x0e\xce\x79\x19\x7d\xc9\xd6\x4a\x66\x34\xae\xb1\x95\xf5\x65\x87\xd1\xfa\x55\x57\xae\x3c\x31\x78\x66\x14\x80\x00\xfa\xa1\xf1\x47\xca\x20\x02\x94\xc7\x07\xc0\x9b\xb8\x1c\x55\x26\xa3\x8f\xee\x80\xa6\x48\xfd\x89\x41\x36\x14\xac\xae\x5c\x0c\xe2\xaf\x24\xa9\xea\xe3\x6b\xfb\x95\x11\xa0\xf6\x34\x68\xc0\x24\x4f\x02\xc1\xd3\x08\x8d\xd7\x0f\x4b\x25\x11\x4b\x72\x1f\xb6\x6e\xd1\x55\xde\x36\xf0\x0b\x29\x67\x83\x6e\x1d\xfa\x89\x9b\xe0\x7f\xd6\x2b\x08\xa9\x16\xf2\xd3\xb6\xa9\x57\xbe\x0d\x85\x22\x7a\x8e\x7f\x4a\x1f\x40\xf6\x75\x28\xdf\x6c\xb0\xec\x16\x3e\x9c\x24\x59\x16\x75\x68\x0b\x5a\xdb\xa1\xed\x9a\x39\x8c\x45\x5b\xab\x9a\x3a\xd1\x05\x3c\x32\x39\xd8\x83\x44\x64\x9b\x7a\xe1\x5c\x5c\x99\x88\xd0\x06\x59\xbd\xa5\x60\x18\xb2\x19\x88\x76\x63\xce\x7d\x8f\x6b\x4b\xe9\xf1\x8d\x4c\x6c\xbe\x06\xf9\x16\xed\x65\xac\xb3\xcc\xb2\xde\xba\xbc\x23\x33\xc0\x23\x1f\x09\xdf\x9b\xe3\x8c\xe8\x05\x38\xb7\x7a\x50\xbc\x21\xc0\xa9\x05\xde\xf1\x61\xf5\x22\x5c\x4e\xa1\xb5\xad\x3b\xae\x57\xc7\xed\xda\x1d\xc7\xed\x2d\x09\xeb\xe4\xfa\xd8\x3c\xbe\xb1\x44\xeb\x90\x20\xb7\xb8\x20\xb8\x72\xa2\x0b\x8e\x0b\xe2\x5a\x17\x5a\xaa\x9a\x79\x70\x0d\x85\x4a\xaa\x3a\x81\x15\x91\x8c\x0b\xd7\xb2\x3c\x60\xe9\x56\x6e\xd1\xf2\x33\x96\xae\x05\xd7\x71\x32\x5e\x14\xa6\x76\xa9\xd4\x66\x25\x70\xd9\xb2\xb1\x8f\x12\x6d\xff\x8f\xd7\x8f\xe9\xd8\xda\x00\xb2\x40\x50\x7e\x34\xf9\x52\xcd\xd6\x00\xfa\x36\x6a\x07\xcb\xb9\xde\x27\x92\x85\x71\x43\x24\xc0\x68\x4e\xb4\x1d\xaf\xca\x22\x5c\x07\x3c\x02\x55\x82\x53\x2d\x16\x56\x63\xdc\xd7\x35\x6a\xfe\x20\x20\x47\x62\x87\xc8\x5e\x1b\x38\x7d\x83\xf7\x70\x5a\xcc\xa8\x6e\xb6\xb4\x1b\x8b\xd2\x6b\x94\x7a\xdd\xba\x26\x10\xc6\x9a\x6c\x5a\x9f\x70\xde\xdf\xf7\xce\x79\x0e\x7d\xc7\xa1\x04\x32\x36\x74\x31\xa0\x45\x2b\xeb\xdb\xf5\x5e\xc4\x02\x02\x6f\x7b\x02\xd9\x43\x8c\xd7\x61\x42\x8b\xfb\xc1\x09\x47\xdf\x1a\x0f\xe3\x1c\xa5\x36\xbf\xf9\x9a\x4d\x95\x87\x4c\x80\x91\x6d\x29\x95\x2d\x7d\x80\xb0\x86\x00\x61\x8e\x86\x4e\x59\x80\xab\xd8\x85\x6f\x95\x61\x93\x25\x71\x6c\x9b\x52\xa3\x2b\xd4\xd7\x93\x03\x61\x72\x8a\x45\x37\x3e\x4f\xe8\xeb\x97\xa5\xdc\xa3\xa0\x8d\x94\x38\xc4\x83\x2d\x3b\x2a\xd1\x81\x8a\xb8\xb8\x49\x83\x5d\x41\x38\xbe\xaa\x93\x2e\x8e\x5c\xf7\x95\x6d\xbb\x64\xd7\xdf\x22\x0c\x69\x41\x35\x78\xba\xc3\xc2\xf4\x46\x0d\x18\x1f\x37\xb0\xf0\x10\x43\x5b\xed\x8c\x6b\x1a\xac\x30\xc5\x05\x00\x41\x17\xae\xe6\xe3\x3e\x41\xbc\xbe\xe9\x44\xe7\x40\x7d\x74\x8e\x65\x2d\xb6\xc5\xf0\xbc\xef\xa1\xc9\x5f\x06\x00\xd7\xc5\xdd\xb0\x4d\xe6\x82\x0a\x5c\xae\xfc\x3d\x05\x6c\xf0\xa4\xca\x1e\x0e\x5a\x8e\xbd\xc7\xe9\x9d\x95\x16\xcf\x37\xf9\x82\x97\x81\xa0\xed\x92\x6e\x57\x9e\xf9\x72\xf7\xc4\x20\xc9\xd7\x33\x82\x57\x1d\xf4\x7e\xc2\xab\xcc\x72\xd5\x4c\x23\x5c\xa4\x4e\x67\xe5\x2b\xf9\x57\x33\xba\xf4\x7c\x66\x49\x1b\x35\x64\x7e\xb0\x72\x63\xea\x47\xc1\x21\xa5\x2d\xd4\x50\xbd\x77\xd7\x32\x85\x20\x5b\x13\xea\x4a\xc6\xf5\xad\x08\xac\x75\xe6\x4e\xdd\xd7\x24\xfa\x4f\x86\x3b\xd9\x48\x45\x4f\xe5\x37\xaf\x8d\x1e\xf1\x51\x26\xe6\x32\x7a\xa5\xed\xda\x95\x2e\xda\x21\x61\x8d\x0c\xc6\xa4\xf3\x2c\xad\xca\xdf\x3d\x66\x2b\xf4\x46\x08\x8f\x4c\xbe\xfb\x45\x12\x26\xa3\x7f\x40\x7b\x44\x39\x87\x2b\xa1\xbf\x5f\x61\x28\xfa\xb6\xe7\xd6\x8e\x7d\x49\x21\xef\x17\x54\xd5\x4d\xa1\xeb\xe3\xf9\xee\x18\x42\xd8\x08\x5b\xd5\xde\xcb\xc0\x76\x1f\xc2\xa5\xb7\x5d\x13\x3a\x52\xc1\xb7\x66\xe3\x36\x75\x63\xab\x65\x07\xe8\xd8\x24\x7d\xef\xab\xfb\x49\x6f\xb1\x3f\xb3\x36\x7a\x30\x35\xb5\x97\x54\x4c\xba\xb2\x9b\x81\x85\x3b\x31\x97\x4a\xa0\x32\x31\x6d\xe6\xcf\x73\x5f\x80\x8f\x97\x8c\x0a\x00\x91\xf7\x2f\x8a\xb1\x87\xc3\x52\x7c\xe2\x49\xd6\xb4\x8d\x5d\xba\x8d\x25\x5d\x3d\xa9\x85\x7d\x6d\x8e\x01\x5f\x7d\x7e\xa9\x51\x33\x27\xaf\x27\x27\x68\xb1\x30\x4e\x03\x9e\x31\x6f\x40\x5c\xad\x6f\xe8\x93\x7b\xaa\x13\x54\x2a\xa5\x97\xad\x2b\x28\x04\xde\x23\x55\xd1\x73\x85\xe2\x01\xd1\xee\xcc\xe1\x9b\xd7\x47\x66\x69\x77\xc1\x20\x6e\x94\xd2\xa9\x62\x24\x05\x21\x87\xec\x55\xdd\x20\x26\x1e\xd8\x29\xe2\x76\x13\x60\xc8\x24\xf5\xf1\xd4\x4c\xb3\xd0\x6e\xe8\x57\xcb\x28\xb5\x0a\xb2\x21\x80\xe2\xd2\x35\x40\x18\xdc\xc7\xcc\x16\xfb\x05\x22\xd2\x22\x48\xc2\x37\x00\xa5\x65\x5d\x0c\x3a\xa8\xc5\xc5\x65\xb0\xb2\xd4\x11\x70\x5b\xd4\x29\xb0\x07\x08\x8f\x9c\xe1\x79\xba\xca\x37\x99\x9a\x36\x3f\xdd\x57\x5f\x9f\x1f\x51\xde\xaf\xac\x9e\x13\x73\x6c\x3e\x9e\xdf\x9e\xcd\x2e\x2e\xa6\x97\xb3\xab\x4f\x1c\xc0\x3b\x39\x99\x9c\x98\xd9\x9f\xce\x3e\xdd\x02\x63\x1d\x90\xed\xf1\xdf\x2e\xe9\x16\xb9\x86\xa3\x5f\xb6\x7f\xe9\x59\x9c\x49\x1f\xad\x4b\x57\xda\x1d\x02\xe0\x92\xd3\x4a\x6e\x64\x3e\x06\x39\x46\xc2\xb6\x38\xfa\xf0\x4c\x70\x57\xd2\x3a\x46\x60\xf8\xc6\xfe\xd9\x75\xe8\x77\xb2\x66\xf4\x87\x7a\x89\xf7\x89\xa8\xa6\x83\xbd\x58\x50\x3e\x2d\x90\x6d\x1f\x0d\x0a\x46\xab\x13\x1e\x5c\x5f\xe9\x89\xba\x27\xde\x68\x8d\x5f\x80\x61\xdb\x98\x36\xfe\x2c\x08\x43\xf8\x20\x29\x6c\x86\x42\xb4\x36\xb7\xb6\xb1\xe5\x2e\x1e\x77\xa9\x18\xc0\x9a\x07\xdf\x74\x14\x08\xff\x8c\x30\x83\xe6\x81\x9c\x85\xf9\x8e\x82\xfa\x1b\xd2\xb1\x88\x4b\xb2\x05\x0a\x66\x30\x74\x90\xbd\xd9\x86\x16\x5c\xd1\x47\xe0\xbc\x45\xfb\xb7\x30\xce\x36\xed\xfa\xdf\x3a\xfb\x39\x7e\x7a\xe5\xe3\x60\x00\xcc\x3d\x60\x08\x20\x2e\xe0\xcf\x24\xbe\x5c\xda\x39\x40\xfe\x1a\x17\xfd\xd7\xc7\x68\xa2\xb9\x76\x31\x49\xd3\x7d\x0a\xd9\x39\x9e\xa4\xf9\xce\xe8\x59\x06\x00\x82\x46\x2c\xd6\x8b\x85\xa5\xb7\x00\x55\xeb\x43\xfd\xd9\xe5\x1f\x58\xf5\x03\x4b\x0c\x2b\xc0\x05\xd3\x8d\x47\x87\xe7\x84\x86\xd8\x36\xae\xc5\x98\x09\x02\xb1\xac\x79\xb4\xfe\x01\xb9\xb5\x39\x04\xdf\xa0\x7b\x87\xcb\x90\x8e\x30\xc1\x66\x52\x93\x20\x36\x2a\x8d\x38\x0c\x47\xaa\xb2\x9e\xa8\x4b\xb1\xfb\x6f\x7a\x95\x29\x8b\xd8\x9e\x32\xb0\xcf\x85\x34\xdc\x99\xc9\xe0\x1e\x7c\x1d\x27\x95\xbf\x12\x52\x7e\x5e\x84\xee\x1a\x53\x37\xb6\x2c\xb2\xab\x8f\x43\x1c\x78\xc4\x09\x6d\x2b\xaa\x2c\x61\xe5\x1f\x8b\x84\xf3\x8d\x1f\x14\x90\x2d\x39\x59\x29\x41\xc4\x8f\x87\xde\xf2\xf3\x89\x24\x5a\x22\xc4\xf4\x6c\xb8\xc5\x52\x8d\xaa\x64\x76\xd8\x66\x79\x0a\xe6\x49\xec\x0c\x29\x0a\x98\xb0\x7a\x61\xb4\x8f\x24\x90\x85\x9e\x14\x04\xcd\x7c\x05\xa3\xc3\xee\x2c\xe1\x11\x70\x56\x7d\x63\x96\x5d\xb9\xd3\xe7\xb2\xf8\x68\xc8\x5e\xab\x26\xec\x9b\xfc\x7a\x23\x18\xe2\xf3\x0b\xd0\x3c\xba\x86\x54\x9b\xaa\x55\xe9\x17\xa2\x4e\xc8\x64\x3b\xf1\xa8\xea\xa2\x87\xa1\x53\x76\x16\xa3\x68\xa5\xbb\xf7\x50\xc8\xfc\x10\x47\xe8\x4b\xb4\x63\xe3\xd0\xee\xf9\xab\x18\x61\xee\xc1\xfa\x32\x05\x8b\x79\x74\xf0\xcf\xc4\x71\xef\x4c\xe5\x16\x2e\x04\xdb\xec\x8c\xdd\xb8\x6a\x89\x91\x46\xa9\x19\xd0\x68\x92\xa7\x5e\x3a\x31\xd3\xe8\xb2\xb0\x39\x2d\xb0\x01\x7d\xc1\xa4\xab\x54\x07\xf7\x49\xac\x82\xe5\x17\xd2\xb7\x47\xea\x91\xf8\x94\x27\x31\x97\xc7\xb5\x6d\x43\x8d\xd7\x62\xdf\x59\xcf\x2f\x3a\xa5\x4a\x81\x01\x16\x7a\xab\x9a\xd9\xb7\xe6\x62\x7a\xf9\xe1\xd3\xf4\xc3\x78\xe9\x9a\x27\x2e\x3b\xbc\xfd\x00\xeb\x4a\x8c\x70\x71\x7c\x67\xd5\x3d\xd0\xbd\x03\x8a\x3b\xfe\x2d\xd1\x67\x34\xa9\x38\xb4\x6b\xd7\x90\x4c\xcc\x2f\xc3\x53\x73\x6c\x2e\x67\xbf\x98\x3f\xce\x6e\x20\x73\xca\x5c\xa1\x42\xfe\xc7\x6d\x3c\x9d\x9c\xc0\x69\x89\x61\x87\x11\x48\x72\x47\x44\x3b\x7d\x89\x52\x9d\xaa\xd4\xb6\xd2\x24\x3d\xf9\xd4\xdc\xf2\x94\x0b\xdb\x5f\x5c\xb9\xa2\x09\xf2\x48\x78\xec\x21\x12\xd1\x4b\x89\x16\x45\xbd\xe2\x5d\xca\x89\x14\x4d\x33\xd1\x0e\x49\xe7\xb4\x96\x2f\x47\x90\x52\xbc\x82\x2e\x6d\x5f\x2f\x59\x50\x93\x58\xf5\xbb\xed\x12\xca\x02\xf6\x31\xea\xa7\x15\x03\x86\x27\x6d\x35\x49\x72\x30\x19\x3d\xd6\x53\x8f\x91\x9e\x90\xb4\x81\xd0\xe0\xa3\x3e\x10\x32\x05\xc1\x1d\x00\x1d\xca\x28\x90\xd4\x60\xbe\x81\x69\xba\x1d\x13\xd7\x60\xe0\x25\x1a\xf1\x3d\xaa\xf3\x9c\xf8\x86\x87\x50\x5f\x1d\x7b\xd0\x3c\x70\x8a\xef\x7d\x18\xe8\x4c\x0e\x7b\x99\xaf\xc2\x37\xe6\xd8\x7c\xb8\xfa\xe3\xec\xe6\xf2\xfc\xf2\x03\x50\x18\x4f\x2f\xdf\x99\x7f\xfe\x74\x73\x7e\xfb\xee\xfc\x4c\xdb\xf8\x5c\x04\x9d\xad\x00\x34\x26\x64\x58\x88\x29\x11\x7d\x24\xb9\x7a\xee\x29\xab\xe5\xaa\xa5\xb3\x0f\x68\x9f\x06\xe7\x3e\x83\x2d\xb5\xa1\x33\x2f\xd4\xa5\xc0\x85\x29\xe0\x9d\x2e\x3b\x32\x91\xb7\x74\x3b\x91\xe1\x16\x5d\x6c\xa7\xc1\xd7\x23\x09\x83\xe1\xa2\x7f\x33\x39\x35\xef\xad\x2f\xf1\x52\x18\x69\x40\x5c\x36\xbe\x02\x8a\xcb\xc3\xd3\x23\xb3\xa9\xab\x76\x0d\x2a\x84\x1c\xac\xf6\x8d\xaa\xd4\x2e\xa8\x88\x16\xae\x1e\xb7\x71\xcd\xbd\xab\x16\xbb\xcc\x9d\x06\xdd\x2c\x3e\x6e\x45\x03\x7b\x4f\xef\x54\x70\x94\x14\x41\xe9\x8e\x44\x0a\xc0\xb3\xba\x6b\x5a\xa9\x36\xff\x73\xd7\xf8\xb0\x44\x75\xaf\x82\xf7\x1a\x5c\x48\x4b\x5f\xfa\xfb\x38\x49\x60\xb0\x4c\x5e\xfc\x91\x56\xc9\xc9\xe4\x35\x54\xd4\x2c\xcd\xe9\xeb\xd7\xdf\x1e\xbf\xfe\xfe\xf8\xf5\xdb\x89\x39\x61\x7c\x1a\x78\xb9\x18\x96\x38\x73\x87\xf6\xc8\x9c\x1d\x56\x4d\x38\x32\xe7\x87\x55\xe3\xed\x91\xb9\x38\xac\xef\xfd\xc2\xbb\x32\xfe\xa7\x9f\x37\xee\xe8\x77\xfa\xe2\xbf\xe0\xdf\xe4\xd5\xec\xd3\x3b\xdb\xda\xfb\xc6\x2f\xff\x56\x0c\xc0\x4f\xf3\xff\xbe\xfe\xf6\xf4\xe4\xb4\xcf\xff\xfb\xdd\xeb\xd3\xdf\xf9\x7f\xff\x1e\xff\x66\x9f\x4c\x9c\xfe\x0f\x8d\x2a\xa6\xe4\x4b\xf1\xc5\x99\x48\xf3\x1c\x2e\x8e\xe2\x36\x3d\x31\xea\xf3\x68\x71\x51\x90\x87\x93\x2f\x13\x64\x08\xd6\x84\x8f\x58\xc6\xf6\x50\x97\x1d\x52\xc3\xe4\x1c\x8e\x60\x1d\xd3\xc1\x92\x3d\xfc\x3d\x5b\xb4\x5a\xcb\x99\xd2\xe1\xea\x83\x85\xd9\x96\xce\xc6\x5b\xd4\x39\xb3\x6e\xdb\xed\x0f\xaf\x5e\x3d\x3e\x3e\x4e\x5c\x77\xbc\xe4\x75\x5d\x37\xf7\xaf\x26\x2f\xce\x95\xb2\x6f\x81\x61\x0f\x5d\x89\x2b\xf5\x9f\x5f\x19\xcc\x54\xbd\x64\x3a\x98\x94\x6b\xd0\x4f\x80\x1c\x01\xcb\xbb\x46\xf3\x2c\x09\xf7\x86\x02\x89\x21\x59\x5b\x08\xa1\xa2\x5a\x08\x71\xa8\x80\xca\x58\x7c\x14\xe4\x8f\x2f\x05\xf9\xbc\xd0\xcd\x8f\x05\x7d\xd2\x83\x92\xb6\x59\x8d\x7e\x72\x6c\x00\xfa\x76\x32\x31\x37\x59\xf7\xc2\x6f\xee\x1f\xc8\xae\xe7\xe8\x77\x14\xf8\x4e\xda\x4e\xaa\x98\x20\xfd\x59\xf8\x3d\x5b\xdb\x8a\x99\xcc\x4c\x46\xd4\x59\x2c\x19\x4a\x6d\x16\xf8\x5b\xc8\xc0\xda\x40\x20\x99\x17\x66\xe4\x8a\x81\x1b\xdb\xba\xc6\xdb\x32\xa4\x94\x8e\x84\x8d\xb2\xf2\xd4\x53\xb4\x19\x86\x0f\x44\x41\xc0\x0a\x3c\x06\x2a\x7c\x20\xbb\x2e\x5f\x1e\x34\x1e\x2c\xf1\x9c\x0f\x3e\x8e\x03\x0c\xfc\xc1\x1d\x09\xdd\x40\xca\x50\x36\x4a\x92\x44\x93\x4a\x1d\xba\x4e\xf5\x5e\x3d\x7c\x62\xa9\x1f\x4d\x0e\xc0\xb2\x4a\x5a\xe5\xe0\xe6\xac\x04\xf9\x80\x60\x3b\x48\x64\x1c\x13\x7a\x5f\xd2\x6c\x68\x07\x88\x0c\xb5\xdd\x6e\x1d\x16\xaa\x42\x39\x9f\xfe\x94\xa8\xed\x2b\xa6\xc6\xde\xdc\x10\x72\x09\xc6\xf5\x0d\x8e\x6b\x65\x37\x2e\x98\x83\xd9\xbb\x0f\x07\x05\xfc\x8f\xb9\xab\xeb\xf2\xb3\x6f\xe1\xc7\xd4\xc3\x03\xd4\x56\xd2\x7d\xbe\x6e\xea\xb8\xa2\x0f\x44\xcc\x91\x89\x87\xd0\xa2\xab\x1b\x02\x6b\x80\x9a\x8b\x5e\x20\xf8\xcb\x38\xcc\x41\x88\xa1\x5a\xa6\x7d\x2c\x58\x11\x19\x26\x13\xc3\x96\x1c\xc8\x50\x2a\xba\xf3\x9d\x59\xbb\xed\xf1\x16\xdb\x70\x1c\x07\xfb\xd8\x2d\xef\x79\xcf\xfd\xd7\x85\x6b\xaa\xc9\x62\xad\x55\x9a\x13\xbf\x58\x55\x6b\x02\x5d\x05\xf1\xb3\xd5\x2e\x3a\xef\x54\xb8\xb0\x33\xf3\xee\xde\xac\xfc\x17\x50\x2e\xb7\xed\x62\x0d\x40\xb2\xed\x7d\x63\x97\x4e\x49\x0a\xf6\x38\xc7\x5c\xb5\x8e\x86\x66\xb2\xe0\x72\xd9\x1b\x58\x80\x0e\x92\x87\xa1\x90\x00\xa0\x2d\x29\xbc\x37\x30\x55\xf5\xf1\x0d\x2b\x86\x65\xa0\x68\x41\xaa\x50\x30\x29\xff\xb2\x57\x94\x87\x8f\xe1\x58\xfa\xea\xa6\x92\x78\x2e\x1f\x30\xa0\x8c\x08\x84\x09\x2c\x12\x8a\x19\x3f\xc0\xc4\x05\xe2\x20\x77\xd1\x13\x42\xae\x34\xe5\x5c\xf1\xe4\x8d\xf0\x4d\x82\x7a\xe6\x8e\xa6\x86\x9c\x62\x26\xb0\x90\xc0\x35\x64\x73\xfd\xd6\x12\x7f\x6a\x7f\xe7\xd9\x44\x1e\x55\xf4\x79\xa6\xb4\x18\x68\x11\x47\x76\xeb\x20\x35\x58\x26\x05\x62\xd2\x97\xef\x5d\x40\xae\x7f\xfb\xec\x8a\x9c\x5d\x18\x82\x46\xe9\x88\xff\x8b\x06\x37\x05\xea\x7c\xc5\xb7\x50\xdd\xf4\xb5\xf7\x37\x85\xf2\xeb\xf8\x75\xba\xe6\xb9\x25\x86\xba\x7d\x27\x34\xcb\x5d\xbf\x3b\xbf\x3d\xbb\x98\x9e\x7f\x9c\xdd\x00\xc1\xcc\xcf\xe7\xb7\xa9\xf0\xf9\x5c\x34\x85\x40\x26\x05\x50\xec\x9f\x40\x63\xe5\xc3\xcd\xf9\x3b\xac\x81\x61\x2c\xfe\xd5\xcd\xad\x88\x0d\xc5\x3f\x4c\x2f\x7f\x65\x3d\x21\xa5\x26\xa4\x14\x82\xfe\x7a\xc2\x42\x05\x54\x6b\x4f\xef\xce\x6f\xdf\x4f\xcf\xee\xae\x6e\x7e\x65\xa5\xa0\xe2\xab\x24\x87\x62\xf3\x3e\xdd\xce\x4c\xec\xb1\x8c\xc6\xbb\xc9\xf3\xdd\x05\xd2\x87\xcb\x2b\x73\x33\x8b\xdd\x9c\x5d\xde\x41\x8e\xcb\xdc\xfd\x3c\xbd\x83\x2f\xf3\x38\x16\x59\xe5\xf8\x6d\x61\x66\x97\x3f\x4f\x2f\xcf\x20\x68\x03\x83\xf3\x6e\x76\x73\xfe\xc7\x29\x70\x22\xfd\x72\x75\xf3\x2f\xb7\xa8\x36\x75\xf5\xbe\x40\x1d\xa0\x38\x30\xe7\x97\xef\x6f\xce\x2f\x3f\xcc\x60\x5c\xaf\xa7\x77\xb3\xcb\xbb\x22\x89\x03\x15\xe6\xee\x66\xfa\x6e\x66\x6e\x67\x67\x37\xb3\x3b\xa5\x32\x73\x73\x75\x7d\x73\x3e\xbb\x9b\xde\xfc\x8a\x7c\x07\x2c\x75\x0d\xe3\x3c\xe5\xea\xd4\x84\xc1\x7c\xb6\xcf\xb7\x3f\x4f\x2f\x2e\xcc\xcf\xd3\x3f\x42\xcf\xe5\x8b\xa0\xc5\x83\x55\x50\x33\xf5\xfa\xd9\xcd\xed\xd5\x25\x8e\xfc\xbb\xf3\x9b\xd9\xd9\x5d\x9c\x74\xfe\xaf\x11\xf5\xa0\x22\xd7\x0e\x2a\xcc\xec\x4f\xb3\x8f\xd7\x17\xd3\x9b\x5f\x41\xf7\xe8\xfa\xd3\xe5\x39\x31\x47\xa1\xa6\x10\x89\x58\x9d\xfd\x3c\xbd\x99\x9e\xdd\xcd\x6e\xf4\x92\xe2\xaa\xfd\xd4\xd5\x22\x8e\xc7\xd9\xa7\x1b\x64\xed\x00\x5d\x9d\x9f\x6e\xef\xce\xef\x3e\xdd\xcd\xcc\x87\xab\xab\x77\x30\x17\x8c\x15\x2f\x44\x5b\xe8\xd3\xed\xac\x10\x81\xa1\xeb\x9b\xab\xf7\xe7\x77\xb7\xd0\x9c\x9f\x3e\xdd\x9e\xc3\xca\x3a\xbf\xbc\x9b\xdd\xdc\x7c\xba\xc6\x97\xfc\x7c\xf5\xcb\xec\x8f\xb3\x1b\x03\x02\x63\x38\x84\x57\x97\xd0\xce\xbb\x9f\x67\x71\x75\x5e\xbd\xc7\x31\x9d\xc6\x51\x60\xbc\x5a\x61\xee\xae\x6e\xee\xb4\xdc\xd1\xe5\xec\xc3\xc5\xf9\x87\xd9\xe5\xd9\xec\x08\x5a\xfe\xee\xd3\xd9\x9d\x1a\x71\x1e\xe5\x5f\xce\x63\xfb\x58\x5d\xe9\x1c\xdf\xf4\xcb\xf4\xd7\x81\xd0\xd2\xfb\x7c\x77\x27\x81\xa2\xdf\xc5\x87\xfe\x57\xff\x37\x79\xd5\x1d\xcf\xeb\xba\x3d\x16\x49\xbe\xe3\xd3\xc9\xeb\xbf\x6e\x24\xe0\x19\xff\xff\xe4\xe4\xdb\x37\x3d\xff\xff\x9b\x6f\x4e\x7f\xd7\xff\xf9\xbb\xfc\x8b\x26\xf9\xa7\xe3\x9f\xea\xba\x15\x8d\xcc\x19\xaf\x84\x1f\x5e\xcc\x1e\x20\xb1\x05\x6a\xc7\xf4\x29\x5f\x09\x9d\x0c\x10\x5f\x3d\x68\x08\xf5\x87\xeb\x8b\xb8\x7c\x5e\xd1\xff\xfe\x17\xf2\x1b\x00\x48\xf5\x4f\x55\xdd\xfe\x13\x7e\x81\x7c\x84\xe3\x85\x2d\x4b\xb7\x34\x07\x10\xeb\xb3\x65\x5d\xb9\x03\x5d\x2b\x40\x01\xd6\x2e\x48\x13\xa5\x8a\x63\x4e\xf4\x30\x6c\xdf\xfe\xb9\xdb\x6c\x0d\x26\xcd\xc5\xbd\x9b\xef\xf8\x6b\xee\x8b\x85\x6a\x26\xd6\x9a\x14\xa6\xd1\x63\xfc\xd1\x07\xb3\x71\x20\x82\xce\x44\x36\x6e\x49\x2e\x10\x83\x63\xf0\x49\x18\x62\x55\xdd\x59\xa5\x9c\x6e\x6c\xc6\xda\x59\xce\x51\x1c\xb0\xa3\x11\x4d\xaf\x03\x14\xbc\x89\x7f\x76\x0d\x51\xeb\x1e\x90\xc7\xf7\xca\x6f\xec\xbd\x9b\xac\xc9\xe1\xb1\xcd\x62\xfd\xea\x9f\x5e\xf1\x1f\x6d\xd8\xd0\x0e\x8d\x9f\xc0\xba\x3a\xa5\xa5\x1c\x2d\x4a\x6c\xda\xc4\x9c\x6b\xae\xde\xe0\xcc\x61\x22\xba\x39\xca\x5f\x0d\x85\x65\xa4\x20\xea\xb1\xf8\xef\x6f\xd7\xf1\xe3\x63\xf3\x4b\x5d\xae\xee\x6d\x75\x6f\xde\xb9\xea\xf3\xef\x07\xfd\xff\x4a\xff\x26\xaf\x7e\xb2\x4d\xf3\xb7\xd3\x7e\xfb\x3f\xbe\xe6\xfc\x3f\xed\x9f\xff\x27\xdf\x9e\xbc\xf9\xfd\xfc\xff\x7b\xfc\xbb\xa3\xf3\xcf\x9a\xad\x5d\x7c\xb6\xa8\xca\x0f\x68\x1f\x84\x1e\x98\xa5\xb7\xc0\x9d\xbf\xb1\x8b\xa6\x0e\x66\xde\x79\xaa\x4a\xaa\xb7\xf1\xa3\x7f\xda\x1d\x6f\xfd\x22\x9e\xb5\x1f\xfd\x62\x6d\x5d\x69\xe2\x7a\x32\x87\x6e\x63\x7d\xf9\x83\x99\xdb\xa6\xf9\xaf\xf1\xff\x85\x49\xdd\xdc\x1f\x4d\xcc\x79\xe2\xaa\x45\x50\x0e\xb2\xd5\xc6\x3f\xf4\xf4\x3f\x32\xc6\xa4\xae\x5a\xac\x6d\x75\x1f\xff\x73\x05\x75\xad\xd5\xb1\x82\x52\x23\x89\x27\xff\xd4\x05\x24\xb4\x94\x6f\x78\x1d\xaa\xaa\xec\x06\xab\x1a\xc0\x69\x07\xa2\x35\xe0\xa1\x92\xaf\x4b\xec\x83\x07\x24\x8e\x4e\x19\xea\x14\xa5\x45\xf1\xf2\x73\xf3\x08\x98\x55\xbb\xdd\x36\x0e\x4a\x1b\x4c\xe3\x16\x0e\x95\x91\x90\xb4\x04\xe9\xad\x62\x83\x37\x9c\x34\xb7\x65\xbc\x8d\x04\x10\x07\x19\xbb\xe0\x08\xf1\x8b\xf9\xb9\xda\xdc\x77\x16\x82\x11\x09\xf2\x0e\x0c\x99\xd2\x1c\x84\xec\x23\x14\xa1\x5d\x03\x14\xf4\x9c\x58\x38\x11\x1b\xc4\xb8\xd7\x0b\x7b\xe7\xfe\x64\x4e\x5d\xc1\xff\x35\x79\xfd\x3d\xbc\xf3\xba\xb4\xbe\x32\x77\xee\x4f\x13\x33\x2d\xe9\x82\x3f\x07\x99\x9a\x38\xa9\x55\xcd\x00\x07\x86\x60\x03\x9a\xbc\x6e\x3e\xe3\x63\xa7\x1f\x6f\xef\xdc\x9f\x0a\x7e\x29\x94\x10\xf3\x8b\x7f\x37\xe4\xff\xb7\xfa\x37\x79\x35\xfb\x74\x7d\x71\x7c\x32\x39\xfd\x47\xe9\x7f\xbe\x79\x73\xf2\xdd\xc9\x40\xff\xf3\xf5\xeb\xdf\xcf\xff\xbf\xc7\xbf\x59\xd7\xd4\x5b\x67\x2b\xf3\xa9\x8a\xe7\x91\x96\xcb\x5f\x38\xf3\x30\x31\x27\x93\xd3\x17\x71\x89\x98\xff\xf1\xdf\x31\x14\x9a\x7f\xe1\xf4\xf5\xeb\xef\x0a\x73\xfa\xfa\xe4\x5b\x4c\xfc\x3d\xfd\xbc\xc3\xf8\x84\x97\xf1\x71\x2f\x8f\xd0\xd2\x77\x42\x74\xf7\x4b\x3c\x5e\x0e\x35\x79\x84\x2b\xeb\xc7\xa3\x24\x38\x2f\x86\x7d\x5f\x9d\x86\xa3\xd6\xf4\x16\x4c\xa2\x29\x50\x7b\x7c\x72\x56\xd9\x63\x05\xb8\x14\xd4\xe3\xd2\x13\xe8\x6d\x6b\x3f\x87\x42\xd8\x43\x6a\xa1\xfb\xd2\x22\x9b\xdb\x62\xcd\x77\x98\xf2\x7f\x6c\x22\xf2\x24\x76\x06\x4a\x7d\xe5\xa2\x50\xb1\x31\x47\xe8\x0e\x40\x8f\x7f\x43\xc7\xfa\x94\xb6\x75\x33\x36\x5e\x6b\x1b\x50\xf1\x70\x39\x9a\x7a\x02\x7d\xca\x65\xbc\xae\xc0\x21\xe2\x3f\xe6\x4d\xee\xd1\x8e\xc5\x86\x8a\x12\xe7\x05\xb3\x5f\xa5\xd6\xc6\x09\xe5\x3f\xd7\xc4\x3c\x83\xa5\x36\x2e\x71\x8a\x62\xe6\x02\x9c\xb6\xd8\xa7\x78\xad\xf8\xea\xbe\x22\xaa\x43\x0e\x34\xe7\x0f\x9d\x50\x82\xf2\x5d\xec\x22\x46\x97\x5f\x28\x9d\x3a\x1a\x97\x3e\x09\x39\x0e\xde\xf3\x6a\x55\xff\xdf\xff\xfd\xff\x98\x97\x52\x43\xb1\x70\x2f\x7f\xc8\xd7\x51\xff\x63\x57\xa8\xe6\x53\xc2\x78\xc0\x87\x31\xb0\x8e\x41\xf4\x11\xac\x15\xd9\x25\x44\xcd\xba\x1c\x54\xa6\x0d\x57\x5e\x91\x88\xb8\xe2\x2a\xed\x8b\x40\x81\x1d\x62\x83\x99\x41\x65\x3c\x7c\x0a\xff\x86\x48\x59\x28\x3a\x41\x2b\x2a\x6b\xfc\xbb\x94\x08\x88\x4d\x0f\xaa\xed\x21\x6b\x3c\x58\x1b\x0b\x30\x6b\xe6\xc4\x71\x3b\xac\x8f\x2e\x88\x16\x4d\xc4\x22\xb2\x71\xe9\x03\x6b\x83\x94\x9f\x23\x45\x33\xaf\x65\x29\xae\x22\x9f\x56\x6d\xb0\x7a\x95\x67\xe0\x21\x95\xb1\x75\x15\x56\xb3\x8f\xbe\x54\x18\x40\xb4\x6a\xf0\xa2\xb4\x21\x80\x56\x23\xd1\x1d\x45\x33\xb7\x37\x16\x3f\xe2\xf0\xd3\x9b\x7d\x48\x1c\xd5\xd0\xef\xb4\x25\x80\xbc\x26\x01\x63\x85\x83\xa5\xab\xda\x66\xc7\x84\x75\xd8\x00\x81\xb4\xbd\x1d\x2c\x21\xb5\x72\x06\xa3\xe6\xdb\xd0\x6f\x5d\x18\x3c\x40\xad\x08\x7a\xce\xba\xdb\xd8\xea\xb8\x71\x76\xc9\x75\x08\x1b\x7d\xd6\xa4\xf3\x13\x11\x59\x01\x72\x6b\x0f\xae\xf2\xb1\xc3\x2b\x48\x00\xd6\x5b\x84\xa5\x22\x89\x37\x20\x28\x21\x07\x35\x78\x7b\x6f\xdd\xbd\xfc\x81\x4a\xdc\x97\x5c\x87\x1b\xb7\xbe\x14\xc0\x63\xc9\x06\xca\x5d\x11\x32\x53\x1a\x13\xb7\x62\x2b\x50\xd8\x84\x7c\x87\x83\x54\x74\x13\x61\xc6\x48\xbd\x6b\xd0\x18\xe1\x2f\xf8\x81\xaa\x8b\xb0\x6a\x40\xf4\x9f\x08\xa5\x3a\x90\x23\xcd\x77\x65\x48\x23\x95\xce\x9e\xb1\x13\x40\xf1\xc1\x1c\x86\x23\xea\xfa\xbe\x97\x02\x19\x25\x06\x5f\x9e\x7a\x41\x21\x39\xdd\x47\x8f\x59\xb6\xa4\x52\x45\xec\x0b\xcc\x33\x0d\xd0\xe4\xde\xf2\xd8\x33\x24\xce\xbd\x8c\xcf\x7d\xf9\x6b\xdd\x7d\x4d\x33\x85\x2b\xb5\x0b\xe4\xff\x8d\x34\x58\x5d\x48\xe3\xc3\xf3\x4e\x21\x20\xf0\xf5\x67\xba\x66\x84\x1a\x42\x05\x2b\xc1\xc1\xe1\x5f\x90\x90\x6c\x61\x4a\x57\x61\x39\x78\x13\x37\x12\x91\xb1\xd3\xf3\xe2\x4f\xaa\xfe\x44\x91\xb2\xb7\x2d\xb3\xd9\xa7\x31\xdc\x58\x28\xad\x56\x7c\x86\x75\x55\xfa\x8a\xd4\x18\x56\xf1\x3f\x8b\x1e\x75\x12\x6f\xc0\x44\x9d\x91\x28\x78\xe3\xa6\x8c\xf7\x18\xd2\x0c\xe8\xe4\x39\x00\x4a\x85\x4c\x72\x5b\x87\x38\xbe\x2b\x75\xd7\xed\x19\x74\x06\x99\xdc\x2e\xea\xad\xdb\x23\x3a\xa3\x4f\xdc\x85\x7b\x46\x9f\x03\xa0\x06\x3a\x29\x9d\x67\xa1\x7b\x29\xea\x00\x16\x99\xab\x02\x52\x72\xd1\x69\xdc\xd6\x66\xd9\xc3\x09\x8d\x70\xa9\x41\x68\x80\x0f\xc4\x07\xf2\xf8\x46\x8e\x63\x7d\xc1\x32\x14\x1e\x8d\x1d\xe4\xd0\xd2\xb5\x2f\x52\xfd\x8e\xec\x78\xf6\x5e\x38\x31\xe3\xb7\x73\x50\x11\x18\x72\xea\xaf\x8a\x9f\x0e\x6d\x3c\x04\x7f\x7f\x76\x83\x73\xb4\x7f\x65\xf5\x9f\x94\x31\xa8\x13\x37\x0c\x0c\x54\x91\x4b\xa0\xf5\x18\xf7\xd3\x65\x4d\xc0\xd9\xd2\xee\xb2\x25\x45\x0b\x4d\xe9\x7b\xa6\x47\xa3\xf4\x01\x95\x84\xe1\xaf\x80\x34\x64\x70\x97\x17\xa3\x4d\xee\x15\xea\x8d\xbf\x51\x7f\x21\xee\x31\x42\xb3\x55\xed\x57\x7e\x47\x56\x8b\x2c\x51\x5f\x3d\xf1\x55\x12\x09\xab\xd3\xc7\x17\xb6\x82\x8a\x19\x82\xb4\x2d\x99\x7c\x1e\x6c\xd0\x02\x0a\x72\x44\x92\x1e\x61\x7e\x0a\xa6\x50\xd5\x8f\x10\x93\x00\x13\xa0\xb4\x08\xf6\x78\x70\x15\xc4\x60\x6c\x30\x2b\xdb\xf0\x70\xf5\x68\xe6\x30\x56\x13\x4c\xa8\x93\xb0\x31\xdf\xd6\x40\x64\x0e\xe1\x96\x4d\x1d\xf7\x27\xb5\x14\x88\x8c\x7b\x55\x9f\x50\x7c\x85\xf6\xaa\x4c\xbc\xa0\xf3\xe2\x6f\xd5\x13\x4c\xee\x25\x00\xad\x37\x6e\xe5\xd8\x20\x6d\x97\xc0\xd2\x49\x35\x44\x82\xb3\x48\x58\xf1\x3e\xb7\x24\x06\x87\x08\x33\x17\xb7\xdd\x64\x70\x26\x8c\x8b\xf5\x3c\x75\x16\xd0\x79\x9f\xf4\xad\xe3\xbc\xb0\xfe\xcb\xda\x95\x03\x7b\xb5\xe8\x75\x31\x15\xee\x70\xa7\x94\xd3\xd5\x3b\xd1\xd4\xbe\x1b\x31\x7b\x19\x20\x96\x5d\x19\x23\xe2\x98\x83\x5e\xc7\x0d\x22\x74\x69\xfc\xfc\xa4\x4b\xd0\x17\x52\x45\x78\x0b\x96\x1c\xf7\x6c\x19\xd6\xc0\x19\x7a\x65\xc3\xcf\xf6\x56\x09\x7d\x32\x97\x37\xb4\x66\x63\x17\x6b\x5f\xb9\x64\x9a\x69\xb2\xfb\x11\x46\x77\x78\xb1\x2d\xeb\xea\x1e\xa3\x6c\x50\x39\xa2\xbf\x03\x1f\x10\x9a\x02\x5d\xf8\xad\x6d\x1b\xd1\xac\x40\x02\xc1\xe4\xcb\x3d\xe9\xea\xf5\xc9\x0a\xe9\x3c\x8d\x07\x70\x1d\x7c\x5b\x37\x3b\x41\x0d\xe6\x8d\x8f\xc6\x33\x71\x3f\xc7\x2d\x3c\xa0\x6a\x5e\xe1\x68\x43\xb7\x6c\xc8\x5b\x1e\xed\x1d\x5f\x75\x68\xed\xa8\xf3\x2c\xb7\xd0\xa4\x3d\x8c\xad\xbb\x10\xd6\x7f\x20\x15\x94\xbe\xc4\x3f\x5f\xd6\x10\x10\x15\x78\x92\xf2\xe8\xb5\xd0\xfe\xd2\x6d\x1b\xde\x7b\xba\x1c\x3c\xfe\x3c\x77\x95\x5b\x81\x34\x90\x90\x63\x70\x46\x14\xce\xa1\xa4\x39\x20\xdb\x81\x77\x54\xce\x27\xc8\x3f\x3d\x56\xae\xc9\x0e\xce\x42\xf6\xf9\x97\xb5\xed\x42\x5a\xec\xea\xe0\x44\x59\x12\xb4\x24\xf4\xe1\xa6\xfa\x0e\x87\x6e\x5b\x33\xde\xea\x4a\x95\xb1\xe7\xd5\x4d\xb2\x6f\x90\xc8\x25\x6f\x5e\x72\x5d\xf0\x80\xc9\xa1\xc3\xa1\xde\x38\x51\x95\x13\x41\x5d\x5d\x31\xef\x37\xdb\x5a\xb1\x64\x0b\x1d\x1b\xdd\x03\xfa\xa3\xa4\x7a\x9e\xd6\x22\x18\x0a\xd3\x36\x21\xab\xa1\x4d\x3f\x8c\x91\xf4\x7c\x76\x6e\x1b\xa7\x30\x5a\x90\x48\xde\x44\xb3\x5e\xd0\x99\x05\xa5\xca\xcc\x15\x10\x12\x0b\x27\x11\x21\xf0\xcf\xb0\x7f\xa0\xa2\x25\x3b\x2b\x17\x4e\x6b\xeb\x31\x97\x02\x86\x6d\x88\xfb\xc0\x33\x19\x62\x92\x19\xd0\x38\xdf\x24\x66\x01\x01\xa2\xec\xfd\xd9\x36\x96\x68\x0e\x6c\xf2\x07\xd7\xec\x86\xbb\x7c\xed\x5e\x05\x4d\xac\x3b\x74\x5b\xc6\x9a\x82\x85\x87\x71\xc5\xf6\xec\x9f\x24\x3b\xb4\x6d\xea\xe8\xdc\x56\xad\x34\x30\xb4\x44\x53\xc2\x07\x0b\x36\x80\x69\x0a\xa4\x7e\x8e\xa1\xdb\xac\x82\xa3\x5d\x74\x58\x82\x67\xf5\x76\x57\xba\x55\x1b\xfd\xee\x2e\xb8\x1f\x06\xaa\x0c\x4f\x39\x61\xb9\x45\x9e\x59\x93\xf0\xe1\xbe\x41\x47\xc8\x82\x77\x19\x2c\xbf\xe9\x5d\x20\x4c\x4d\xb3\xac\x2b\xf7\x6c\x70\x0d\x37\x9c\x25\x3b\x23\xab\x65\x53\x9f\xa2\xf2\xaa\xa1\x03\xef\x35\x79\x5b\x16\x04\xaa\x98\x6e\x16\x9f\xd4\xab\x92\xe3\x07\x47\x6b\x0b\x89\xab\xec\x26\xba\xe3\x10\x7c\x50\x4e\x0f\x86\x4d\x29\x22\x0b\x0f\x7d\xd9\x5b\x02\x87\x20\x6b\x18\x3f\xca\x07\xec\x51\x34\xbf\xaa\xba\x25\x8e\xca\x78\x39\xc0\x66\x45\x57\x2c\xe9\x79\xd0\x80\x34\x19\x75\x63\x6e\xe7\x0d\x16\x14\x10\xd3\x95\x2d\x3e\x96\x0f\x88\xa7\x5d\xc5\x33\x62\x08\x42\x3e\x92\x7d\xab\xe4\x5d\xbe\x4a\xce\xf4\x2a\x19\x98\xf5\x43\x13\x5b\x19\xfa\xa2\x07\xf3\x0b\x93\x5d\x33\xea\x01\xc2\x41\x65\x1e\xc8\xb4\xd2\xbe\xd2\xe9\xc8\xe2\xb3\xab\x8c\x4c\xdc\x27\x17\xd9\xf0\xd1\x13\xd1\xee\x0f\xd1\x72\xe2\x0f\xe2\xa8\x14\xe0\x3d\xf7\xbe\xf1\x12\x8f\xad\x90\xc4\x6f\xe0\xd7\x81\x4c\x42\xbe\x60\xec\x76\x1b\x9d\xe9\x2f\xbd\x2b\x5d\xc7\xc7\x6f\x91\x6d\xa7\xed\x31\x34\xa9\x93\x5a\xf1\xb4\x0f\xda\xd1\xab\x20\x5f\xfb\xf0\x0a\xc8\xf9\x47\xbe\xde\x8f\xd1\xd6\xc3\x2b\x6a\xe4\xf9\x59\xf9\x38\xac\x9c\x6b\x5d\x92\x9d\x89\xc0\x83\xc8\x89\x8e\x15\xe4\x27\x0b\xd6\xbb\xf4\x9d\xfd\x1e\xbb\x27\x1c\x13\x82\xc8\xff\x0d\x76\x5b\x32\xb6\xc6\x2d\x25\x2f\xd6\x27\x9f\x44\x23\xa6\x92\xb8\x90\x7b\x2d\x25\xe7\xfe\x22\x4b\xe9\x02\x82\x0e\xd7\xa2\x1b\xfa\xc3\x9e\x00\x2c\x1a\x05\xaa\xd4\x41\x09\x29\xc2\x85\x8a\x35\x1b\x85\xba\x5d\x0b\x46\x62\x19\xfa\xb1\x6e\xa8\xb0\xa3\x5e\xf5\x5c\x06\x2a\xae\xb0\x8a\xa5\x79\x05\x27\x86\x0d\x75\x25\x7a\xcc\xc8\x3f\x19\x5d\x09\x92\x67\xe8\x29\x7b\xa0\x90\x7e\x6e\x29\x8f\xb0\x02\x42\xd5\x40\x35\x92\x83\xc1\xcb\x8e\x31\xca\x67\x6b\x8b\x0f\x9b\x62\x31\xf8\xda\x6f\xd9\x42\xaa\xf9\x50\x57\x3e\x60\x43\xae\x15\x5f\x90\xe9\xb1\x63\xc1\x8f\xa1\x72\x70\xbc\x1b\xa2\x11\x08\x0e\xd5\xda\x6f\x5e\x91\x96\x85\x1c\x40\x6d\x2d\xbf\x66\xb5\x29\xb6\x00\xd6\xb4\x12\xb6\xf5\x23\xfd\x95\xa9\x52\x76\x89\x99\xaf\x7f\xd0\xce\xa2\xe7\xa0\xe2\x95\x5f\xd3\x87\x3c\x66\x4f\x6f\x9f\x37\x50\x36\xac\x33\x74\xc0\xd9\xf4\x77\xef\x0c\x68\x37\x43\xa0\x0b\x74\x67\xf3\x18\x6a\x3b\x3a\x6f\x54\x31\xc1\x35\xe7\x19\x15\x39\xbe\x09\x03\x67\x2a\x04\x86\x15\xd5\x8b\x31\xb9\x41\x3c\x36\x9e\xcb\x3c\xbe\x00\xea\xe8\x78\x5f\x28\xf3\xf1\x17\xa2\xce\xe2\x25\xc6\xe6\x02\x65\x25\x7c\x85\x11\x6e\xe0\x41\x93\xf8\x38\x6d\x78\x2c\x7d\xf1\x9b\x78\x3a\xe1\x90\x57\xdd\xc6\x35\x75\x17\x72\x7e\x72\x73\x0e\xc9\x0b\x10\x64\x32\x2b\x5f\xf9\xb0\x26\x04\x9e\x10\x22\x30\xc5\xb5\x08\x85\x08\xe3\x67\xdd\x98\x97\xf3\xee\x3e\xbc\x34\xbe\x02\xca\x85\x56\xae\x0c\x66\x03\xa7\xd2\x1f\x29\x5f\xe7\xbb\x0b\x5d\x06\xdc\xcc\xc5\xb8\xfb\x3c\x08\x7a\x63\x08\xc8\xbc\x04\xba\xc6\x97\x44\x92\x06\xc9\x01\xaa\xfd\x49\xf6\x36\x07\x54\x3f\x7b\x24\x64\x61\x62\x97\x34\x23\x29\x3a\xc7\xdf\x56\xfe\xd9\xc6\x35\x8b\xb5\xad\x98\xa5\xb3\x30\x2b\xdf\x42\xc2\x11\x8e\x5a\xcd\x50\x99\x08\x68\xe6\xc2\x8c\xaa\x86\x07\xd8\x11\x43\x11\x57\x5f\xd7\xd8\xc5\x0e\x23\x29\x19\x5d\x1e\x50\x1b\x3f\xc5\x31\x9f\xd2\xcf\x69\xef\x59\x5d\x4e\x93\x04\x4b\xc6\x96\x15\x9c\xdd\xa3\x7e\x09\x70\xb2\xd9\x4a\x85\xa9\x35\x5b\xb4\xf6\x6e\x6c\x32\xf0\x24\xb8\x2b\x2e\x21\xd0\x9a\x48\x2c\x28\xbb\x49\xfe\xd0\x5f\xd2\x17\xcc\x2a\x07\x1b\x14\x4f\x78\xce\x88\xd9\x80\xf3\xf6\xe8\xcb\x55\x57\x9a\x8d\x0f\xf1\xa5\x1d\xb2\xb6\x20\x83\x53\x48\x72\x03\xe0\xb2\xc0\xa1\xc1\xe1\x72\xe2\x34\xed\x47\xe2\x80\xec\xb9\x32\x55\x4d\xc4\x37\x43\xe6\xad\x44\xfa\xcc\x02\x06\x85\x54\x7d\x12\x3d\x8e\x2d\x0b\x69\x82\x5a\x5a\x45\x9f\x23\x31\x5b\xad\x8d\x22\x3a\xcc\xad\x88\xa7\x16\x5f\x7a\x51\x6c\x1f\xf3\x2c\xdf\xd7\xf5\x32\x76\xa5\xc0\xbd\x19\xda\x7a\xbb\x05\x4a\x2b\x49\x79\x31\x13\x15\x04\xb7\x4a\x4e\x38\x14\x19\xb1\x33\x93\x47\x2a\xd4\x9a\x50\x63\x3d\xb8\x6a\xa0\x74\x2d\xce\x9c\x5d\x3e\x60\x10\x96\x48\x82\x80\xfb\x57\x18\x6c\xc1\x6f\xc5\x07\x4d\xf6\xe8\x06\xb0\x1d\x43\x43\x8f\x7b\x3b\x2e\xe1\x0e\x0c\x1f\x2e\x66\x4d\xac\x83\xa5\x7d\x0c\x1c\xaa\x85\xe7\xe3\x2f\x58\x34\x2e\x5b\x66\xdf\x4f\xcc\x34\x39\x25\x89\x95\xe2\x05\xc8\x1e\xf9\xd2\xe5\x86\x5e\x9a\x87\x5f\xa9\x40\x91\xd5\x44\x80\xe4\x88\xbc\xf2\x4a\x3b\x3a\xaa\x14\x10\xd2\xce\x3d\xa9\x26\xc8\x85\x33\xc4\x1c\x10\xd1\x01\xcc\x09\x2a\x14\xd6\x26\xb4\x2e\x81\xc4\x3b\xa9\xf7\xac\xd4\x2a\xc8\x79\x45\x27\xb0\xae\xb0\x6c\xaf\x7e\x8c\x0e\xc3\xda\x96\x2b\x0c\xa6\xd0\xaf\x47\x65\x02\xc0\x7b\x93\x8f\xd3\xbc\x0d\x2f\xbb\x8c\x4d\x54\xdd\x0c\x05\xbd\x21\x5e\x22\x2b\xbc\xf0\x98\x03\xc5\x57\x4b\xb7\xa9\xa0\xd2\x10\x78\x2f\x97\xf8\xd9\x75\x5d\x2e\x31\xf4\xa8\x0d\x88\xb5\x6d\x36\xa5\x9c\x9c\x40\x00\x28\x8c\xf1\x4c\xf4\x3e\x47\xbe\x3b\x26\xa1\x0c\xc1\x35\x9a\xb4\x13\x66\x5f\x3f\x93\xa2\xcb\xab\x38\x3e\xb1\x65\x00\xd8\x10\xc9\xfd\x8c\x40\x37\xbe\x34\xcd\xa2\xbc\x1b\xe1\x21\xaf\x27\x66\x0a\xdf\xd2\x6c\x2b\xbd\xd4\x59\x5f\xab\x54\xd9\xc1\xe4\xbe\x69\xad\xff\x45\xe9\x17\x48\xd0\x8c\x0a\x2c\x8b\xba\x32\x2f\xcf\x71\xe8\x5e\x32\xb8\x26\xdd\x6b\xf3\xba\x6d\xeb\x0d\x46\x0f\x1e\x7d\xb5\xac\x1f\x95\x94\x34\x59\x0b\x5f\xda\xb1\x80\xc3\x7c\x67\xec\x6a\xe5\x9b\x0d\xd5\xe5\x03\x27\x24\x4b\x7b\xc3\x5c\x06\xe4\xa9\x32\x8f\x96\x24\x68\x40\x97\x36\x67\x3d\x6c\xba\xd2\x69\x05\x73\xd6\x0a\x32\x67\xaa\x1f\x58\xfb\xbd\xa8\x2b\x25\x6a\x0c\xcb\x6e\x51\x3a\x8b\xd6\x92\x6f\x1a\xf7\x50\x33\xf1\x57\x3e\xa2\xaa\xdd\x1c\x51\x23\xea\xb9\x31\xc6\x34\x98\x18\x45\xb1\xb5\xab\x3b\xf5\xf4\x5d\xb2\xe2\x7e\xdb\x63\x81\x9e\x0f\xd3\x2f\xc8\x99\xb3\xeb\xa7\x19\xda\x1a\x96\xd2\x7c\x27\xb7\xe9\x69\xbf\xfd\x89\x15\x71\xf4\x4c\x6f\x75\xd2\x7d\xbe\x83\xc7\x8d\xe5\xde\x0d\xdd\x9f\x4f\xc7\x06\xd2\x03\x9e\x49\x9a\x9d\x9c\x4c\xcc\xb9\x22\xba\xc8\x32\x85\x94\xc2\x82\x94\x20\x5d\x5b\x4f\xbf\x56\xbf\x4f\x97\xca\x20\xb3\x63\x5d\xf9\x85\x59\x8c\xb5\xf3\x50\x45\xa0\x80\xc5\x47\xc4\x56\x20\x41\xfc\x58\x95\xb5\x5d\xa6\x47\x63\x80\x1c\xc4\x92\x5a\x67\xca\x1a\x1f\x76\xc4\x21\x54\x25\x20\xbc\xb6\x55\xe5\xf0\x16\x76\x4b\x6f\x7b\x2f\xb2\x2c\xe8\x78\x84\x71\x4c\x11\xf8\x92\xd4\x4e\x96\x37\x6d\xd7\x39\x29\x48\x74\x2c\x31\x19\xcd\x1c\x5f\x79\x32\x10\xc9\x65\x79\x2f\xaa\x6c\x56\x3f\xf8\xbb\x76\x71\x9f\x31\x9d\xe9\xdc\xa9\x3c\x46\x21\x57\xca\xb2\x00\x0d\x78\xb7\xcc\x35\x1f\x07\x30\x29\x9c\xd6\xd3\x89\xb9\x1b\x12\xa0\x8e\x25\xf6\x55\x23\x7a\x8b\x3a\x39\x92\x70\xfd\x26\xe2\xd9\x9c\x90\x16\x62\x5e\x40\x22\xb0\x97\xed\xf6\xc9\xf0\xdc\x2d\x8a\xef\x69\xbe\x56\xc1\x7e\x6b\xb2\x5b\x15\x79\xa2\xc5\xa8\xd0\x24\x48\x5e\xbb\x70\xcc\xb1\xa0\x16\x4a\x3b\x50\xa0\xca\xdd\x38\xf1\x18\x90\x05\x9a\xa8\xed\x89\xba\xcf\x57\xa8\x84\x3c\xc6\xfa\xaa\x3b\x71\xf2\x66\x62\x3e\xfa\xb0\x70\x65\x89\xcc\x01\x60\x3c\x90\x75\xb6\x6d\xdc\x9f\xbb\xa5\xc7\x33\x2d\x49\x3b\x80\x13\x93\x2f\x87\xc4\x91\x4f\xde\x72\x5c\xa8\xed\x18\xf7\x64\xab\xf9\xc5\x86\xa6\xf3\x39\x8d\x50\x9f\x53\x30\xcb\x4b\x21\xf1\x2d\x00\x02\x5d\x05\x2c\xaf\xca\xba\xca\x17\x33\x45\x24\x65\x62\x2c\xa4\x91\xe1\x91\x89\xc5\xb0\x31\xf2\x98\x4c\x9e\x40\xd6\x99\x90\x11\x12\xd5\x75\x6a\x5e\x62\x73\x07\x1d\x1e\x04\x31\x82\xdf\xb8\x89\x33\x03\xe8\xc3\x61\xde\xd7\xb7\x44\xde\x1b\x57\xb0\xea\x82\xa4\xa9\x05\x16\x1c\xcf\x29\x0a\x33\x41\xee\x96\x99\x23\xe0\xb2\x2b\x7d\x75\xdf\xf9\xd0\xfa\x85\x62\xd4\x1b\x63\xd8\xcb\x6f\x51\x24\xe3\x5b\x0e\x59\xf8\x28\x12\x5a\xc4\x76\xaf\x6c\x23\xc5\x7e\x12\x89\xc2\x1d\xcc\x91\xa8\xc4\xde\xdf\x38\x15\x54\x0a\x5f\x0d\xd4\x99\x98\xcb\x11\x32\xc0\x94\xef\xc1\xa1\xa5\x3e\x27\xfa\x98\xae\xf2\xff\xd6\x25\xfa\x3c\x22\x07\x44\x0a\x97\x72\x7c\x50\xfa\x57\x9a\xdd\xa6\x08\x41\x3b\x3e\xde\x05\x1a\x58\x49\x4e\x0e\x04\x08\x26\x89\x37\xd5\x56\xa0\xc5\x16\x9d\x84\xe8\x33\x27\x28\xd8\xb0\x05\xf4\x17\xdf\x44\x93\x9b\x03\x6b\x27\xdf\x4c\xcc\x3f\x2b\x1a\xb8\xf1\x9d\xd7\xd6\x26\x90\x74\xc1\xc8\x6e\x22\xf9\x7d\x0d\x41\x41\x6b\xb3\x65\xf2\x94\x24\xd7\x2d\x87\x8a\xe0\x07\x6d\x3b\x48\xd9\x80\x4f\x4f\xce\x9d\xde\xb2\x3d\x9c\x3a\x93\xcc\xa3\xe5\x3e\xaf\x97\x40\x44\x5c\xaf\x56\xe0\x0a\x44\xf3\xf3\xde\x55\x0b\xf8\x25\x6c\x9e\x74\x89\x30\xcb\x50\x42\xc7\xf2\x3c\xf7\x08\x98\x34\x43\x5e\x0a\x7e\x77\xe8\xa9\xff\x73\x17\x5a\x9f\xac\xd7\xbc\x75\xf0\xce\x12\x54\xf9\xa3\xeb\x10\xad\x40\x36\x6e\xbe\x3b\xe5\xaf\xdc\x45\x9b\x65\xc7\x69\x9b\xf7\x9a\xe6\x79\xf4\x99\xfb\x47\xb8\x3f\x5c\xc4\xa9\xaa\xe8\x7b\xff\x82\x39\xd8\x33\x28\x29\x75\x3e\x36\x3c\x20\xd0\x03\x1e\xd8\x02\x06\x2a\x21\x10\xc4\xf1\x69\x5c\xf0\x4b\x27\xc9\x2b\xa0\xf8\x89\xe6\xe3\xb6\xf1\x10\x4e\x66\x79\x22\x5c\xa1\x6f\x27\xf1\x50\xe0\xe3\xf4\xc2\x3e\xfe\x95\xd6\x68\x76\x22\x09\x6f\xa2\xa6\xa4\x84\x7d\x64\x1f\xc7\x27\xc3\x7c\x74\x71\xcb\x9b\xdb\x16\xf8\x6b\x86\xbd\x8c\xb7\x2a\xf0\xf2\x38\xdb\x16\xba\xcf\xfc\x87\xc6\xdd\x47\x5f\xb5\x01\xdf\x7e\xa5\x84\xa5\xa5\x75\xe5\x53\xad\xfb\xc9\x95\xf7\xde\x56\x88\x54\x1a\x09\x1e\x54\x75\xf6\x6a\x3a\x77\x07\x2f\x8d\xdb\x08\x73\x28\x4f\xf4\x6f\xf2\x82\xcf\xe5\x17\x23\x49\xae\xf0\x92\x5c\x1c\x32\x3a\x45\x22\x06\xea\x01\x8c\x6d\x90\x3b\x2b\x76\xeb\xc3\xe5\x27\xf3\x81\x4a\xd1\x75\x9d\x49\x70\xe6\xf0\xc3\xf5\xc5\x91\x79\x98\x98\xd3\x22\xfe\xff\x37\xfa\x2b\xd3\x68\xd2\xd6\x7b\xbf\x39\xe5\xaf\xca\x97\xae\xb6\xae\x1a\x70\xe3\x99\xc3\xab\x5b\x7a\xc5\xe4\x04\x5f\x32\x79\xcd\xdf\x98\x2d\x4a\xbf\x0d\x6e\xf0\xec\x19\x3d\xfa\x24\x7d\x94\xd8\x2e\xe1\x39\xaf\x0b\x7a\x1e\xff\xf1\x63\xfd\xef\xbe\x2c\xed\xa0\x8a\xe6\x23\xf7\x4e\xf7\xeb\xc2\x45\x8f\x7b\xb4\x5f\xf1\x3b\x17\x32\x24\xdc\x5e\x69\x02\x78\x3b\x0f\x90\x8a\xdb\xc4\xdb\x45\x01\x32\x8e\x6f\xd7\xb6\x71\xd3\xd2\x7f\x76\xd4\x47\xf3\xa9\xda\xd6\xe0\xd8\x1f\x9e\x9d\x99\x9f\x7e\x3d\xbe\x9d\xc6\x5f\x1f\x41\x64\x80\x2a\x0a\x52\xa8\x93\x2b\x0b\x64\x64\x9e\x2e\x0f\x8a\x73\x4c\x23\x84\x8d\x3c\x99\x48\x1f\xff\xb5\xfb\x9f\xff\x7d\xee\x16\xc8\x79\x1b\x4f\xa1\x38\x2f\xc7\x94\x5f\xd3\x59\xf4\x1b\xb7\xf0\xdb\xa6\x06\xfa\xfa\xc3\x0b\x7f\xe1\xff\xf5\xf8\x06\x24\xc9\x6e\xa3\xeb\x73\x3f\xfa\xf7\xff\x42\x25\x39\xfb\xec\x14\x34\x31\x88\x78\x98\x13\xac\x6d\x9d\x83\x05\xe4\xc6\x57\xec\x76\xf1\xfa\x78\x94\x03\x86\x73\x55\x56\xdb\x34\x72\x26\x7c\xba\xbe\x28\x7a\x19\xc0\x1c\xdd\xd6\x33\x3e\x54\xcc\x78\xe0\xe5\x22\xb8\x14\x73\x7f\x74\x96\x62\xa5\x52\x06\x87\x8b\xa7\x77\x3a\x82\xc1\x88\xd8\x36\x9e\x20\x1d\x89\x4f\x1b\x2b\x69\x83\x0e\xc3\x04\x49\x11\xc8\x70\x90\x55\x85\x9e\x9a\xd0\x2a\xa2\xf3\x1c\xbb\x8b\xf8\x05\xa6\xfe\xfd\x47\x17\xbe\xfd\xfe\x0f\xfe\x4d\x5e\xc5\x03\xef\xf8\xcd\xe4\xf5\x71\xdd\x1c\xc3\x72\xfe\xab\x17\x82\x3e\x59\xff\x79\xf2\xfa\xf4\xcd\xb7\x6f\x7b\xf5\x9f\x6f\xde\xbe\xfe\xbd\xfe\xff\xef\xf2\x0f\x6e\xc4\xf7\xef\x67\x37\x57\xe6\xc3\xec\x72\x76\x33\xbd\x30\xd7\x9f\x7e\xba\x38\x3f\x63\xd2\x2d\xe1\x6b\x7e\x53\x98\x93\xef\xcd\x65\xfd\x80\x77\xf9\xe9\xeb\xd7\xdf\x69\x82\xd8\x33\x20\x88\xfd\x2e\xa7\x24\x37\xef\xeb\xae\x5a\x52\x3e\xe4\xbc\x5a\x4c\xcc\xff\xb9\x6e\xdb\xad\x09\xe6\x87\x57\xaf\x56\x61\x05\x74\x95\xff\xd7\x8b\xd9\x83\x6b\x80\x07\xd1\x87\x54\x65\x8f\x61\xfc\xed\xae\xcf\x25\xff\xe0\x9a\xb9\x6d\x41\x79\x35\x23\x95\x67\x9c\x3a\x73\x76\x62\x95\x3e\x1c\x5d\x00\x08\x4d\x09\x52\x44\x66\x4f\x5e\x5c\x37\xce\x6e\xe6\xa5\x83\x93\xff\x79\xd3\x00\x52\xb6\x88\xa3\x5e\x30\xd4\x8d\x5f\xba\xd2\x55\x74\x10\x72\x87\x83\xf3\xb3\xaf\x96\x98\x0c\x43\xcc\x5a\x50\xa2\x6d\x66\xe9\x48\x05\x42\x53\xde\x93\x40\x27\x91\x7f\xb3\x15\xbc\x41\x11\x4e\x95\x62\x83\x32\x7d\xd2\x5e\x01\xe6\xdd\x46\xb1\x98\xde\x25\xe6\x3e\x8c\xd8\x43\xd9\xd7\x48\xfb\xb6\x8d\x5d\xa0\x33\x88\x37\x37\xd2\x22\xa6\x66\xa1\x3f\xf8\x68\x77\x18\x2a\x8e\x9d\x5f\x46\x83\xbf\x8e\x66\x24\x3d\x09\x2f\x07\x0c\x9e\x41\xc9\x9a\xf9\x89\x38\x7e\x6d\x68\x0b\x13\xbf\x37\x3e\xa0\xf8\x3a\x8d\xca\x15\xde\x83\xe7\x5f\x17\x8d\x58\x7d\xed\x4a\x99\xd8\xf1\x31\x07\x25\x60\x44\x7d\x4b\x11\x24\x12\xbc\x93\x41\xe0\x92\x13\x8f\x84\x14\x4d\x98\xbc\x00\x2c\xd1\xa3\x8b\xb3\x64\x3f\xc7\x87\x66\xdf\x28\xe2\x9f\x50\x67\x72\xe5\x1a\x0e\x8a\x52\x1b\x0b\x92\x1c\x8d\xbe\xb0\xb9\x7a\xa6\xcb\x7a\x84\x53\x4b\x85\x6a\x33\x15\xae\xa6\xfe\x8f\x6a\x29\xe4\x1d\x3a\xa4\xd1\x69\xee\xa5\x70\x77\xc3\x04\x9d\x8f\x3e\xac\x8f\x8a\xf4\x0a\x8a\xd0\x65\xd4\x8f\xd1\x83\xb2\x95\xb9\x77\xa8\x00\x49\x5f\xb4\x55\xfc\x51\x7d\x35\x7e\x46\x4d\xb9\xd6\xb3\xeb\x82\x33\x5b\xef\x28\x30\xe8\x21\x93\x11\x2f\x7e\x68\x27\x4d\x4f\x28\x12\x2a\x24\x3e\x0e\x28\x27\xf8\xb9\x58\x82\x04\xd0\x23\x5f\xdd\x87\xc9\x8b\x77\x44\x81\xdb\x28\x2a\xa8\xa7\x16\x14\x1b\x3c\xb0\x7c\xc8\x5a\xc2\x7d\xf4\x58\x9b\xd0\xba\x6d\xf8\xc1\x1c\x9e\x1c\x51\x72\x4a\x25\xe2\xeb\x3e\xa7\x30\x88\xfa\x9e\x1e\x11\x72\x32\x36\x50\xfb\xb3\x84\xd3\xb8\x87\xea\x90\xf8\x47\x29\xf0\x52\x18\xaa\xf8\xf4\xc2\xe4\x1c\x9e\xaf\xb8\x3a\x76\x97\xbd\x6f\xf2\x62\x6a\x82\x8b\x0e\x2c\xf8\xac\x08\x40\x67\x0c\x02\x0a\x81\x63\x79\x94\x6b\xc2\x4b\x59\x17\x9e\xe5\xb7\x10\x1e\xa2\x24\x9a\x7d\x85\xd8\x4c\x88\xd8\xf6\xad\x53\x9a\x09\x62\x04\x76\x3b\x59\x0d\x8f\xd1\xab\xdc\x36\xce\x2e\x91\x9c\x14\xf0\xa4\xae\x87\x50\xc3\x83\x63\xa9\x26\xa6\x36\xbe\x5a\xd4\xcd\xb6\x6e\xa2\x77\x67\x3e\x42\x2e\x3e\xfd\x7d\xb0\x50\xe3\xff\xad\x9d\x6d\x5a\x57\x39\x8e\x18\x46\xff\xde\xde\x27\x57\x39\x45\x18\xd4\x91\xa8\xb3\xae\xf9\x49\x28\xcf\xee\x08\x89\x9e\x1f\x8d\x8c\x16\x26\x15\xea\x68\xd0\xaf\xac\x2f\x49\x5e\x06\xec\xf5\x0e\x55\x17\x9f\x72\x2a\xb9\xa6\x88\x2b\x0c\x13\x34\x9a\x0d\x79\xd4\x09\x6c\x25\x3b\xcd\x75\x5e\x58\x4d\xe8\x5b\x94\x08\xa4\xe3\x9a\xbd\x82\xd8\x21\xd0\x05\xb4\x01\xef\xa9\x90\x6d\xcb\x2c\xf5\x31\xf9\xfa\xab\x4a\x0e\x99\xec\xce\x49\x57\x4d\x5c\x39\xc8\x4c\xde\x2d\xd6\x88\xda\x28\x14\x10\x0c\x82\xbd\xa9\x15\xb8\x14\x82\x5a\x0b\x4a\x1d\x1c\x2e\x27\x80\x20\x91\x0b\x80\x41\x73\x9c\x37\x86\x55\xf7\x2e\x2b\xc5\x81\x8c\x1b\x41\x1d\x44\xab\xbc\x1d\x3c\xba\x4d\x57\x31\xf8\xa7\xd1\x02\xdd\x2c\xe6\x62\x5b\x7a\x78\xa6\x9f\x49\x73\x40\x79\xbe\xe1\xa4\x15\x38\x29\x5c\x7f\xa7\x4b\x57\xf0\x69\x05\x6d\xf3\xe1\x84\x52\x13\xbe\xa2\xed\x93\x17\xd3\xca\x20\x0d\x44\xc9\x11\x31\x22\xbf\x83\x40\xf5\x93\x93\x09\x9e\x9c\xc4\x8c\xe7\x3b\xfa\x78\x81\xf2\xd0\xea\x2e\xb1\x0b\xcc\x8e\x84\xb5\xa4\x8d\xef\x6b\x5b\x06\xaa\xbc\x07\xfb\x65\xe9\x41\xf4\xbc\x6a\x53\x43\x10\x34\xd6\x17\x6f\xa1\x26\x45\x97\x34\xda\x51\xf4\x33\xa6\x77\x80\x70\x7f\x39\xee\xc5\xa6\x2f\xd2\x21\xc9\xdb\xa6\x71\xf8\x46\x60\x70\x1e\xd0\xd9\xe3\xca\x06\x26\xa5\xb0\x47\x85\x6b\x85\x99\xd3\x5d\xaf\x3c\x98\xf6\x5d\xc6\x18\x80\x05\x26\x93\x17\x77\xb3\x9b\x8f\xb7\x4c\x35\xfb\xee\x1c\x48\x72\x5f\x18\x63\x5e\x67\x94\x12\x93\xc4\xc6\x4e\x63\x7e\xa0\xa0\xd6\xdc\xbf\x37\xdc\xc3\x67\xb7\x1f\x3e\x4f\x6c\xe3\x03\xa4\x6d\xc0\x24\xac\x5c\x39\xc7\x10\x53\x01\x34\x0c\x62\xe9\x19\x12\xb3\xc7\x72\xa4\x9c\x75\x70\x1b\x4f\x81\x4e\x40\x08\x85\xcf\xd2\x7c\x67\xae\xf1\x64\xd7\xad\x47\x98\x10\xbd\x13\x36\xee\x18\xf6\x5d\xdf\x6d\x13\x44\x5c\xb2\x96\x00\x2c\x1b\x14\x22\xc2\x5a\xb8\x83\x5d\xdd\x1d\x4c\xcc\x01\x07\xbc\x03\x11\x17\xc6\xa9\xdb\xfa\x78\x07\x1d\x24\xd9\xd8\xa5\x7f\xf0\xcb\xce\x96\xa4\x2b\x7f\x6f\x2b\xff\xef\x36\x0d\xfa\x5d\x6d\x0e\xf0\x3a\x3c\x60\x38\x24\x0e\x13\xdb\xfe\x10\xa1\x80\xb0\x83\xdd\x62\xdd\x4f\xdd\x64\xf0\x36\x86\x50\x5a\xb3\xb2\x61\xcd\xd9\x60\xe4\x09\x4f\xd7\x7b\xba\x98\x7b\x0a\xcf\x52\x2f\x0e\x99\x4c\x24\x8a\x84\xef\xe1\x6d\x90\xae\xa1\x47\x82\x35\xd2\xae\xb5\xd4\x6e\xb5\xc7\x0f\xa4\xa8\xcb\x36\xa5\xe7\x22\x03\x00\x1a\xc2\x7f\x1d\x60\x65\x42\xfc\x60\xff\x53\x98\xeb\x31\x07\x1c\xa3\x01\xe6\x44\x1a\x09\x2a\x66\x84\xb3\x4e\xf8\x1c\x79\xa6\xd5\xe3\xf9\xe9\x98\x90\x54\x94\x09\x71\x8c\xb7\x4d\xbd\xb5\xf7\xb6\x75\xc3\x61\x5e\xd6\xc2\x22\x86\xa6\x92\x6f\xe9\x6e\x90\xb0\x95\x1a\x3c\xa4\x3c\x03\xa3\x35\x9a\x3d\x02\xe3\x03\xe0\x14\xda\x2f\xbe\xdc\x69\x64\x5e\x06\x92\x1c\x64\x34\x33\x7e\x0d\x01\x8b\x3b\x28\xb7\x24\xaf\xad\xae\x34\x23\x84\xd8\x4f\x78\x05\x6f\x01\x93\xe1\x68\xca\xae\xa9\x9b\x98\xd1\x21\x3d\x85\xf1\x23\xe3\xf0\x29\x45\x8b\xa3\x62\x40\x23\xd0\xaf\x0a\x07\xbc\x4c\x85\xe5\x71\xa9\xac\x98\xca\xf5\x16\xad\x7f\xf0\x9c\x11\x7e\x74\x65\x29\x13\x01\xd4\x1b\xfd\xc5\x2e\x08\x57\x50\xce\x4d\x5d\x80\x73\x01\xb5\xfe\x43\x2f\x0b\xc3\x9e\x03\x44\xe1\xd1\x7a\x43\xbf\x60\x62\x3e\x3a\xf2\xaa\xc0\xb7\x63\x47\xd2\xa2\xa0\x45\xbb\x6e\x80\xeb\x4d\x8d\x28\x5d\xcc\xa4\xf1\x51\xd5\x48\xae\xb0\x72\x74\x6f\xa3\x15\x4b\xae\x33\x36\xdf\x57\xf7\xb8\x62\xab\xf4\x9e\x07\x52\xcc\x10\x6a\x52\x86\x40\x05\x73\x30\x95\xb8\xa2\xa3\xa2\x84\x4b\xac\x3d\x3b\xe8\x15\x14\x8b\xfc\x3c\xcf\x9d\xd5\x5c\x25\x14\xd1\xc4\xf2\xb5\x72\x67\x1e\x3c\x55\x98\xa2\xb6\x01\x7e\x3b\x5a\xf7\xf2\x66\x5b\xa9\x98\xe6\xb0\x1c\x20\x59\xf9\xad\x2b\x4b\xc1\x03\x35\x82\x92\x47\xa1\xf4\x4a\xa9\x1f\x33\x6a\x16\x66\xef\x90\x96\xeb\x48\x27\x14\x84\x19\xa8\x04\x09\xda\xc0\x3e\x58\x12\x6a\x01\xd8\x22\x8c\x6a\x7a\xee\xf0\x4c\x66\x68\xde\x23\x5c\x48\xde\x3d\x66\x25\x85\xfa\xec\xa6\x6a\xaa\x34\x0d\x82\x63\xb0\x42\xd5\x0f\x7d\x8c\x86\x1b\x28\x6c\xc5\x83\x79\x4b\x89\x4f\xbe\x65\xac\xd9\xb8\xaa\x2b\xd0\xab\xa6\x7a\x41\xdf\x46\x7f\xb2\xa2\x8c\x70\x68\x41\x96\x9d\x64\x5a\x16\x8d\x6f\x5d\xc3\x85\x80\x27\x13\x1d\x65\x16\x0c\xc0\x81\x32\x94\x0e\x08\x82\xad\xcf\x22\xbc\xff\x49\x6a\x4c\xd3\xd8\xc0\x87\x20\x8c\x81\x9b\xb2\x47\x2f\x54\x1b\xdf\x4e\xcc\xc1\x15\x26\x16\xf1\xe9\x69\x63\x55\x75\x75\x4c\x2f\xe6\x67\xda\xec\xd0\xbd\x05\xf2\xe1\x66\x69\xce\x79\xcc\xd2\xd7\xd5\x38\xe2\x66\xa4\xca\x72\xf8\x1b\xe4\xbc\x80\x31\x92\x9f\x20\x4c\x5c\xc0\x06\xe6\x16\xf5\x7d\x05\xd2\x88\xfc\x81\x60\xe6\xf5\x12\x50\x92\x03\x0f\x46\x51\xfa\x92\xc1\x4e\x85\x32\x39\x4c\x1d\xcf\x75\x80\x0b\x96\xb6\xba\xef\x00\xf3\x5b\x57\x2e\x49\xbb\xf8\xa5\x2b\x77\xe8\x07\xd9\x4d\x5d\xdd\x6b\x57\x2c\x76\x5b\x8a\xa3\xe3\x32\xa4\x47\xa4\x29\xba\xdd\x85\x38\xcd\x17\x7e\xde\xd8\x78\xa2\x1d\xc8\xc5\x28\x05\xf0\x74\xe3\x32\xbc\x16\xaf\x8e\xc1\xb5\x9a\x08\x97\x00\x67\x42\xeb\xfe\xd0\x1e\x21\xe2\x85\xf4\x73\x68\x10\x88\x71\x98\xe7\x07\x99\x2e\xf1\x80\xff\x68\xff\x8c\xe8\xb6\x6d\x5d\x49\x50\x4f\xaa\x24\x20\xe8\x22\xd6\x80\x6d\x87\x1f\x87\x1d\x3e\x3f\x42\x5b\x3e\x20\x12\x16\x9c\x20\x44\xd8\x24\xf4\x5f\x62\xb7\x1c\x7f\x10\x8a\x05\xfa\x0d\xeb\xc7\x5a\x33\x5c\x38\x98\x03\x83\xc6\xc5\xb5\xc3\x9f\xa5\x0b\x69\xc4\x7b\x22\x7f\x22\xe9\x43\x89\x08\xc7\x24\x2e\xcd\x5e\x23\x0e\x0a\x29\x6b\x87\x42\xa7\x2f\x6d\xc1\x2b\xd5\x6c\xe0\xa3\xa9\x04\x60\xc1\x5f\x32\x87\x9f\x5d\x53\xb9\xb2\x60\x68\x6a\x80\x29\xc6\x91\x09\xb5\xa9\xab\x23\x1e\x02\xc9\x79\x93\xc7\x5d\xdd\xd3\x87\xcd\x21\x2a\x1f\x1d\x19\x40\x79\xc5\xfe\xe1\x81\x97\x2f\x8a\xa6\xab\xb0\x14\xcc\x32\xe9\x53\x23\xfa\x3c\x9a\xc6\x05\xaf\x1b\x12\xac\x4e\xbb\x56\xf1\x40\xa5\xef\x35\x5d\x05\xa4\xa2\xbc\x40\xcf\xea\x06\x21\xd2\x10\x14\xc1\x63\x26\x3b\x4c\x7c\xfe\x4c\x58\x53\x34\x48\x65\x39\xf0\xd7\x2a\xe7\x38\xf6\x08\xa6\x7c\xeb\x8a\xa4\xd0\x02\x6b\x07\x01\xcf\xfd\xbe\x1e\x41\xc3\xc0\xcb\x55\x2f\xa3\x0a\x72\x15\xe0\x79\xec\xd5\x09\x84\x45\xe3\xb7\x2d\xd9\xb7\x55\xdb\xd4\x25\x55\xfd\x27\x9b\x41\x47\x39\xda\x54\xa5\xa7\xe5\xa4\xe2\x53\x5f\x06\xd3\xdf\xac\x30\xa6\xc4\xbe\x75\xcc\x14\xe7\x6d\x5d\xa3\xf5\x9d\x68\xb9\x54\x40\x47\x47\xe6\x78\xe5\x72\x18\x45\x99\x9b\xbe\x62\xa2\x1a\x74\xc0\xf3\x16\xab\x3d\x89\x04\xb6\xed\xc0\x44\xc7\x6a\x57\x01\x7c\x8e\xcd\x62\xba\xf5\x95\x0d\x21\x4e\x1a\x31\x97\xdb\x10\x6a\xe0\xda\x25\xf0\x14\x9f\xec\xf0\x47\x7d\x39\x27\xd5\xe1\xde\xce\xc2\x50\xf2\xd2\x94\x3c\x6a\x98\x5f\xd8\x55\x20\xbf\x59\x82\xf1\x5a\x7d\x06\x14\xe2\x5c\x46\x46\xca\xe6\xd8\x0d\xd8\x1b\xc8\xa7\x08\x48\xba\x4a\xe7\xbb\xd8\x1f\xbf\x89\x06\x08\xd4\x6e\xe4\xc0\x5b\x62\xc1\x88\x0b\x61\x55\xd6\x8f\x0a\xa3\x54\x07\xc8\x9a\xeb\x66\xa8\xc0\xbd\x6d\x12\xcf\x84\xdc\x66\x77\x00\x29\x1a\x19\xda\xb8\xcc\xb3\x55\x24\x26\x3f\x87\x55\x1b\x04\x80\x35\x8e\xf7\x41\x0f\x5c\x8a\x8e\xd8\xf0\xdd\x63\xaf\x7b\xba\x2d\xf9\x5e\xed\x9f\x7b\x12\xd4\x04\x45\x59\xe9\xd9\xe9\xc4\xfc\x64\x83\x5f\x98\x6b\x71\x46\x82\x20\xe4\x7a\x69\xf1\xa1\xf9\x04\xcb\x92\xff\xcc\xab\xa4\x75\x78\xdb\x0c\x82\xc0\xd7\x1c\x1f\x05\x68\x57\xb4\x01\x15\x2e\x5e\x40\xaa\xb0\xb4\xb0\x76\x4b\xc5\x28\xe2\xc7\x37\xae\xd5\x5c\x87\xc1\x81\x38\xbd\x5f\xf8\x68\xb4\x22\xdc\x9f\xa0\xf7\x5d\x05\xf5\x42\x6e\xd9\x8b\x1c\xf3\xd9\x32\x74\xf8\xd0\x2d\xad\xbb\x76\xdb\xb5\x38\x27\x1c\x15\xb3\x46\x7b\x8f\x03\x6d\x06\xd5\x1a\xae\x06\x69\xe5\x49\x05\xa9\x01\xfb\x36\x70\x09\x6d\x91\xc9\xb0\xe7\x0f\xef\xf5\x2e\xa9\xc2\x71\x49\x41\xa2\x41\x59\x59\x8f\x79\x01\x89\x1c\xc7\xfd\xf1\x60\x4b\xbc\x9c\x43\xa6\xd6\x90\x39\x83\x30\xbb\x5c\x42\x13\x7d\x9d\x02\x86\x85\x9c\x00\xf4\x66\xb3\x56\x85\x94\x54\x58\xd6\xca\x5b\x29\xb4\xa6\x98\x88\x58\xd5\x82\xb2\x80\x16\x73\x1e\x2f\xf1\xc8\x71\xd6\xc8\x43\xa9\xdc\xc2\x4d\x52\x95\x11\x9a\xeb\xbd\x77\x53\xe0\x26\x9d\x42\x50\xce\xc3\xa7\x70\xbd\x52\x9a\xf7\x1b\xf4\xdd\x72\x33\x56\x60\x18\xa4\x53\xb1\xab\xbb\x22\x91\xd2\x39\x4a\xe3\xb4\x6b\xb3\xb2\x0b\x4f\xf4\x73\x50\x48\x2d\x51\xd1\xf8\x1e\x8a\x16\xa9\x55\xca\x69\x1b\x25\xa3\xde\x8e\xd7\xaf\x62\xe1\xb5\xb8\x78\x06\x45\xda\xa9\x7e\x2e\x59\x36\xf9\x00\xc3\xc9\x25\x13\xc7\xa4\x2f\xed\xba\x93\x38\x79\xd6\xc6\xfe\x94\x51\x4f\x11\xf6\xbf\xac\xe3\xbc\xe8\x81\xe0\xd2\x28\x2c\x7f\xe2\xfa\x5b\xf8\x15\x86\x1e\x38\xfa\x47\x2d\x81\x60\x2e\x76\x0d\x7a\xce\x24\xbe\x38\xea\xb0\x5f\xd8\xb1\xc7\xb8\x18\x65\xd2\xb0\x10\x86\x7b\xe1\x96\xaa\x6e\xb0\x6b\x03\x05\xa9\x3d\x84\xe9\x71\xba\xd6\x7e\x8b\x63\xb9\xab\x3b\xe2\xb6\xe0\x61\xa3\x18\x87\x54\xf0\x68\xb2\xbb\x90\x67\xb8\xe3\x12\x51\xe4\x20\x63\x32\x6b\x40\xea\x3b\x31\xb7\xcc\xc3\x06\xe6\x7b\x96\xc7\xfe\xd1\x04\x1a\x88\x93\xd7\x44\xe6\xe8\x5b\xd3\x55\x82\xd2\x66\x72\x2d\x66\x02\xa8\xee\xcd\x27\x4c\x24\xa1\x33\x7e\x83\xbb\xf5\x7d\x1c\x9d\x69\xd5\xfa\xe3\x33\x68\xf1\x03\xf2\x02\x99\x0b\xda\x8b\x97\x75\x7e\xc2\x08\x90\x90\x74\xf4\xf8\xca\xb7\x95\xe6\x36\x73\x8b\x75\x55\x97\xf5\x3d\x24\x99\x37\xce\x42\xee\x21\x0d\x51\xaf\x52\x63\xd5\x95\x2b\xe4\x05\x1e\xa1\x93\x60\xd0\xeb\xc9\x89\xd4\xb7\x9c\x5f\x5f\xa9\x53\xa3\x45\x08\xac\x5d\xd6\x5b\xa2\x1c\x3b\x7d\x6d\xde\xb9\x05\x02\x16\x4e\xbe\xff\xfe\x5b\xd8\x51\x1c\x1b\x87\xd8\x2b\xaf\x10\x5e\xa9\xcc\x74\x54\xdd\xd3\xc4\xf1\x30\x70\x7d\x24\xf5\x01\x6f\x9f\x5f\x58\x4f\x90\xce\x84\xfc\x9c\x2c\x28\x85\x0a\xd8\xaa\x6a\xc7\x49\x42\x28\x7e\x6f\xeb\xb8\xf6\xe7\x7e\x39\x7c\xcd\xe8\x98\x05\x33\x42\x42\x9d\x7f\xd5\x07\x1a\x78\x3c\x4d\x55\xa1\xd4\x50\x44\x56\xf2\x98\x71\x0d\xc7\x3b\x5a\x61\x72\xf3\x2e\xc4\xdd\x85\xa1\x3e\x2c\x00\x86\x9e\x40\xd2\x9e\xeb\x94\xe0\x0e\x33\x09\xb8\xd0\x23\x00\xce\x1c\x2c\x8a\x2d\x70\x39\x12\x54\x0a\x80\xfb\xc8\x55\x82\xca\xbc\x05\xab\xa4\xa0\x92\xc9\x06\xe5\x4a\x39\x00\xf6\x92\x06\x33\x15\x2c\xff\xb6\xd1\x64\x2a\xb1\xb4\x6d\xff\xc8\xb0\x92\x33\x8c\xa3\xe9\xeb\x87\x66\x77\x14\x79\x22\xf6\xc2\xcb\x3c\x6f\x87\x37\x8b\x44\xe7\x3c\x26\xdb\x98\xfa\xb0\xdb\x8c\x1f\xd2\x55\xd8\xfa\x05\x55\xfd\x83\xf9\x91\xc2\x57\xa5\xaa\x96\xa8\x14\x39\xdc\x33\x41\xae\x1f\x07\xcc\x59\x7b\x88\x9f\xf4\x8d\x4e\x98\xf6\xaa\xae\x8e\xd9\x32\x79\x90\xac\xcc\x92\x3c\x77\xc4\xe9\x92\x1d\x4e\x47\xd0\x77\x79\x69\x6f\x1c\x89\xfd\x0d\x10\xb4\xa4\x94\xdc\xeb\xa2\xcf\x1f\xa1\x19\xf7\xb0\x79\xa2\x91\x27\xe9\x85\x3d\xb1\x2f\x4d\x9d\xd7\x8f\x81\xa7\x02\x61\x80\x47\x60\x45\x8e\x47\x14\x73\x55\xd3\x7f\x43\x49\x9a\x0c\xab\x9e\x14\xb0\x22\x78\x23\xc4\xe7\x20\x2a\x80\xc8\x2b\x4d\x22\xd8\xd8\x31\x02\x81\x2b\xec\xad\x59\x51\x25\xd8\x5b\xbd\xd8\x3e\xb2\x59\x47\x36\x31\x61\xac\x46\x57\xdd\x13\xf1\xfd\x82\x8b\x10\x07\x11\x31\x76\xb7\x7d\x9b\x20\xfa\xf2\x25\x8a\xba\x70\xb8\x45\xaf\xda\x11\x82\x0b\x9e\xda\x6f\xc6\x56\x2c\x65\xb6\x5c\xcb\xa5\x9b\x88\xdf\xe8\x49\x4c\x1b\x63\xec\x11\x58\xae\x18\xef\x43\xae\xb2\xaf\xa0\x23\x83\xf1\x16\x27\x94\xc2\x39\xf7\x2c\xb1\xd2\xb8\xd2\x3d\xd8\xaa\x05\x4a\x32\x26\x23\x9e\xff\x45\x2f\x42\x74\x98\x64\x36\xc7\x5c\x08\xda\x13\xda\xd8\x5f\x26\x7e\x0b\xd9\x00\x64\x1c\x93\x1f\x88\x3a\xc9\x9a\x08\x5a\xff\x21\xfa\x3f\x3c\xba\x71\xd6\x0e\xf6\xec\x94\x03\xee\xdc\xe2\x08\x57\x47\xec\x97\x68\xca\xc6\x4b\xa1\x6a\x7d\x23\x8e\xaf\x8a\xba\x8d\x74\x04\x93\x82\xa0\x3a\xbc\x46\xfc\x43\x40\x09\xdd\x6d\x1d\x82\x0b\x41\x30\xbb\x9c\x06\xcb\xae\x0b\x8c\xa1\x10\x91\x08\x51\xa6\xaa\x8d\xd7\xbb\xd3\xd5\xb1\xd0\x63\x1b\x13\x2e\x51\x68\xa8\xbe\x23\x0a\xa9\x04\x86\x3a\x8e\xe8\x6c\x16\x54\xc2\x09\x15\xe8\xd1\x94\xae\x1f\x11\xb9\xa2\x64\x7a\x96\xbd\xa6\x62\xd2\xbe\xaa\x7b\xae\x95\x1e\xb5\x47\x45\x49\x4c\xbc\x60\x76\x87\x11\xc6\x3c\xf2\x02\xb5\x6d\xf1\x70\xe5\xca\x44\x7e\x20\xa1\xa4\x00\xb1\xc5\xfa\xc3\xe5\x2e\x15\x40\x52\xe4\xca\x18\xb3\x3c\xe2\xd0\xfc\x23\xd3\xeb\xed\xcf\x9d\x84\x02\x0f\x22\xb4\x8a\x89\x56\x78\x6f\x16\xe5\xc7\x38\x1e\x42\x46\xa0\x76\xfa\xe0\x2d\x5a\x37\x0e\x58\xd1\xd1\x8c\x7f\xf6\x0d\x74\x09\x43\xcb\x25\x94\x00\x3e\x0c\xd8\xd5\x60\xb7\x53\x38\x1d\x03\x7f\x8a\xb2\x3c\xb3\x19\x31\xe9\x86\x85\xed\x2c\xd7\x8c\x99\x34\x26\xf8\x6f\x93\x54\xb1\x8e\x27\x21\x2c\xc8\x13\xa9\x36\x59\x41\x19\xaa\x69\x68\xb5\xe4\x4f\x58\xd4\x9b\x39\x04\xe7\x39\xc9\x29\x55\xe0\x35\x9e\x84\xd6\x94\xf1\x72\x68\x14\x3e\x0a\x6c\x19\xc8\x3f\x3e\xd4\x65\xb7\x21\x04\x49\x68\xeb\x06\xaa\xe3\x9a\x3c\xa5\xc8\xf7\xba\xca\x12\x57\xe6\xc0\xde\xdf\xc7\xc5\xdb\xba\x03\x9e\x1d\x3d\x44\xd0\xf9\x36\x64\x78\x27\x21\x87\xa1\x96\x73\x28\x14\xed\x2c\xb8\x31\x11\x7f\x22\xc4\xe2\x39\xed\xa8\x7a\x3e\x5b\x51\x66\xee\x76\x35\x0c\x09\xc5\xb1\x52\x66\x9e\x1c\x31\x74\x4a\xb4\x2e\xd6\x70\xf6\x60\xab\x18\xe9\x50\xda\x21\xc8\x3b\x39\x38\x65\xb4\x25\x30\x12\x3a\x92\x07\x09\x2d\x97\xdc\x8f\x97\xb5\x54\x76\xbc\xaf\x9b\xcd\x9e\x7b\xb1\xdf\xb8\x41\xdc\x77\xff\x6d\x16\xcc\x37\x30\xf6\x6f\xf7\x5e\x6a\x2a\x29\x37\x20\x84\x1b\x8d\x6b\x3d\xc9\x0d\x15\x1c\x2e\xa7\xca\xa5\x4b\xf2\xd1\xee\xf4\xf5\x78\x96\x5e\x98\x07\xc5\xe1\x96\x77\x1b\x28\x4a\x5c\xc2\xcf\xd6\x6c\xd7\xbb\x00\x06\x2d\x33\xae\x1c\xa6\x18\xb3\xfa\xeb\xc8\xfa\x3c\x2a\x08\x27\x64\x2b\x9f\xf0\x76\xe3\x91\x3a\xff\x85\x08\xbb\x81\x02\x1e\xc2\x5f\xfc\x64\x7c\x98\xf0\xb6\x79\xce\x39\x65\x40\x68\x38\x6f\x10\x2c\xaa\xae\xe7\x7f\x58\x47\xad\x48\xc3\x83\xfd\x56\x50\xcd\x32\xd8\x69\xcc\x38\xd0\xae\x1b\xe7\xcc\xce\xd9\x06\xc3\xad\xea\x23\x41\x87\x8c\xd8\x04\xdc\xe2\x15\xd4\x20\x4f\x14\x0e\x87\x32\x0d\x31\x18\x64\x5b\x69\xfe\xa6\x5e\xba\x12\x2e\xbf\x7b\x72\x0b\xf9\x26\xa6\xeb\x97\xc1\x73\x6a\x64\x28\xeb\x08\xc0\xd5\x8c\x8c\x70\x7f\x7c\x55\x52\x1d\x32\x13\xba\x2c\x47\xb2\x85\x7b\x42\x84\xc5\x5f\x69\xd2\x0b\xce\x60\x82\x7d\x5d\xd5\x66\x53\x63\x9e\x9e\xc2\x3a\x8a\x04\x70\x51\x63\x6e\x9a\xdf\x55\xee\xf2\x8c\x03\xe6\xbc\xe8\x78\x10\xa3\x15\x56\xcc\xe1\xe9\x91\x42\xe4\x91\xf1\xbe\x6f\x70\x90\xb1\xa2\x07\x46\xb4\xd1\x2a\x24\xe7\x40\x99\x5a\xb4\x50\xd5\x59\x99\x3b\x7e\x7a\x8e\x08\x64\xa1\x67\x27\x5b\x6c\x7d\xc0\xe3\x68\xdc\x1c\x2d\x18\x46\xee\xfa\x07\xd2\x1e\x44\x22\x79\xa4\x10\x5a\x2c\x6c\x00\x33\x8a\x1c\xc4\xaa\xae\x12\x0b\x54\xb9\xcb\xf9\x7e\x94\x03\xba\x1c\x6f\x31\x5e\x82\xb2\x21\xfa\x5e\x5d\x37\x67\x0b\xee\xdb\xb9\xb2\x64\xf6\xec\x60\xcd\x17\x42\x13\x42\xe3\x8d\x19\x12\x08\x68\x01\x7b\x8e\x39\xbc\x6f\x6c\xeb\x61\xcf\xe0\x12\xc1\xc1\x3f\xa2\xf6\xc3\x88\xa5\x48\x71\x0f\x70\xb9\x27\x7b\x84\x2b\x1e\xd2\x06\x40\x77\x87\x48\x17\xf9\x25\xbe\x18\xa7\x7a\xd5\x35\x5c\xd8\x16\xa7\x1c\xae\x16\x31\x6c\xb8\x8e\x4d\x79\x9c\xcf\xae\xab\x9e\xef\xa9\x46\x45\x20\x19\xf8\x7e\xfd\xa4\xec\xf4\x0b\x83\x65\x59\xec\x7f\x1d\xe1\xeb\x70\x97\x0a\xa2\x93\x56\xf3\x21\x86\x62\x70\x5b\xc3\x51\x15\x07\x38\x85\x4f\x76\x47\x94\x61\x61\xed\x05\x35\xd0\x04\x96\x52\x41\x66\x75\x41\xa2\xf7\xeb\x91\x3c\x10\x69\x83\x24\x0a\x1b\x4c\xe5\xbe\x48\x08\x49\xf7\x2c\x20\x0d\xd2\x23\xa3\x76\x57\x9e\x12\x73\xe3\x5b\xe0\x26\xb3\xf4\x1f\x13\xaa\xd7\xac\xeb\x40\x74\x1c\x63\xdf\x2c\x68\xb5\x03\x5b\x08\x05\x0f\xb3\xda\x1a\xe5\xe7\xed\xe5\x5c\x4d\xe9\xe0\x10\x97\x27\x26\x71\x43\xe6\xb4\x89\x24\x93\xdb\xbb\x0f\x3a\x08\xba\x6d\x9d\x6b\x8e\xdb\xfa\x38\xfe\x2f\x0b\xd6\x10\x8a\x2e\x1b\x51\x64\xb2\x61\x03\xc9\x01\x4e\x43\x2a\xc0\xfb\xd9\xe5\xd1\xd5\x90\x05\xd8\x1a\x67\xe6\x0e\x0f\xc9\x15\x9c\xed\x34\x25\x2c\xda\xcd\x10\x66\x75\xe4\xb1\x0b\xab\x76\xfb\x92\xcc\x79\xb4\xd2\xe1\x12\xa8\x1b\x1d\xcd\x53\x0d\x8b\xb6\x7a\x1d\xf2\x44\xab\xa7\x84\x46\xec\xa4\x04\x20\xc6\x77\x4e\x5c\xf8\x59\x26\x7b\x57\xa4\xbd\x38\x77\x19\x58\x24\x5d\x01\x83\xd3\x4c\x21\x7a\x3e\x45\x67\xea\x1a\xaf\xba\x03\x68\x8a\xbe\x40\x0f\x16\x75\x15\xba\x0d\x1a\xfa\xf0\x11\x76\x36\x12\x68\xa8\xb5\xd5\x3d\x60\xcb\x44\xb4\x55\xe8\x1c\x15\xf6\xa4\xd9\x20\xef\x0e\x5f\x81\xfc\xe1\xc2\xac\xec\xc6\x97\x48\x87\xb6\xae\xbb\xe0\x80\x54\x8d\x72\x41\x21\x5d\x5a\x9c\x84\x95\x04\x32\xdc\xa3\xe5\x92\x80\x93\x5c\x54\x81\x70\xc6\x68\x51\x9b\xe5\x23\x2a\x27\x45\x43\x5d\xa4\xca\x68\x7b\x21\xf6\x50\xee\x78\x4f\xf0\xb9\xac\xaf\x85\x59\xd6\xdd\xbc\x5d\x75\x25\x11\x35\x4a\x14\xbf\x71\xa1\x2e\x1f\x70\x98\x57\xf6\x01\x61\xfb\x60\x1f\x00\x1d\xe0\xfb\x11\x28\x12\xbc\x46\xee\x17\x30\xb0\xd4\x07\xa2\xe3\x51\x98\x83\x6c\x98\x32\x64\xb2\x69\x77\x5b\x30\x2b\x88\xc4\xb8\xae\x12\x1e\xc7\xb6\xa8\xde\x46\x90\x48\x6c\x7a\x1e\x04\xe0\x04\x6c\x97\x0a\x5b\xf2\x97\x2b\xe6\x46\x60\x75\xd2\xd0\x95\xfe\x47\x2d\x90\x76\x62\x2b\x71\x82\xdc\x97\x2d\xb3\x7f\x22\xb5\x3b\x06\xd6\x91\x1b\xb9\xd0\xd6\xd4\xc4\x4c\x9f\x1e\xf4\x5e\xc3\x79\xaa\xb4\x41\x16\x3d\xf5\xb8\xff\x5a\x2b\xf0\x1d\xba\xd3\xe3\xa5\xbc\xec\xa2\x75\x8b\x23\x85\xd2\xc7\xf4\x02\x6c\x2d\x71\xd2\xb3\x2e\x65\x48\xec\x45\xb8\x4d\xa2\x35\x10\x17\x18\x84\x08\x31\x1e\xe5\x08\x07\xa8\x6a\x82\xa0\x2b\x00\x25\x3f\x47\x00\x0c\x2e\x3c\x45\x4a\xc6\x38\x1b\xbd\xbf\xd4\xa6\xd9\xb8\x76\x5d\x2f\xf1\xc2\x58\xb8\x65\xd7\x00\x5b\x0a\x12\xfc\x22\xe8\xdb\x7c\x76\xbb\x90\xf4\xba\x06\x24\x5e\x9e\xce\x2b\x42\xe0\x60\x6d\x10\x00\x6f\x86\x25\x15\x61\xdc\x41\x85\xa5\x93\x35\x90\x4c\x90\x41\x39\x09\xf1\xcc\xed\x33\xc4\x72\x8a\x31\x88\xc4\x84\x0e\x59\x2e\x7a\x77\x0a\x25\xee\x80\x9f\x7b\x29\x12\x61\x8a\x79\x45\x5e\xdd\xbb\xf0\x91\xce\x14\x10\x80\xdb\xc6\xa1\xae\x11\xd2\x97\xb6\xae\xc1\xc3\x9b\x40\x2e\x90\x26\x9c\x3b\xf4\xb3\xb3\xe4\x4a\xd2\x69\xb0\x04\xb5\x3c\x5f\x65\x19\xa9\x6a\x70\x4c\xea\xa0\x20\x1f\xf8\xe4\x7c\xc5\xd7\x61\x8e\x4c\xe3\x5b\x56\x54\xdb\x87\x1e\x99\x1e\xdc\x84\xb2\x51\xc6\xf9\x62\xd1\x35\x80\x7c\x96\x8c\x20\x5e\x7f\x96\x5f\xa5\xf6\xa1\x48\xa6\xaa\xe0\x23\x69\x62\xf3\xe8\x65\x93\xe9\x83\xc0\x93\xd5\xdd\x26\x96\x1a\x01\x95\xb6\xae\xed\x88\x08\x8b\x82\xf0\xe0\xc9\x02\xe2\xe3\x70\x34\x94\x98\xb7\x30\xc0\xc5\x68\x17\xad\x6b\xfc\xbf\x13\x6a\x77\xcf\xf5\x85\xfd\xce\x43\xc6\x3c\xa8\x2c\x3a\x3e\xe2\x6f\xef\xdb\x62\x13\xf3\x53\xd7\x72\xb1\x5a\x0a\x14\x4b\xa4\x05\x63\x2a\x7e\x65\x2a\xba\xd3\xe2\x54\x57\xc4\xc9\xa9\x4c\x3c\xd3\xb8\x16\xe0\x0b\x98\x60\x41\x16\x30\xb5\xb3\x46\x97\x24\x25\x17\xb2\x01\xcf\x89\xfa\xb2\xf8\x25\x2c\x3b\x7a\x20\xde\x1b\x37\x57\x1f\x8f\x04\xfc\xa3\xdb\xaf\x9c\x9f\x7d\x3d\x1f\x22\xdd\x6c\xff\x11\xbc\xc9\xf4\xe3\xd8\xd1\x26\xda\xd6\x42\x32\x31\x45\x62\x06\x0b\x1a\x73\x84\x7c\xe4\x03\x75\x13\xd8\x76\xdc\x15\x29\x42\xa4\x65\x55\xf0\x4a\x1a\xae\x47\x5e\xcc\xfe\xb9\x87\x22\x49\x69\xa0\xab\x8f\x2d\x7d\x32\xe4\x97\x0e\x16\x87\xe8\xfb\x66\x5b\xdc\xb7\xc1\x95\x2b\x81\x24\x70\x66\x70\x19\x0f\x32\x87\x90\x22\xb8\xa9\x5a\xa9\xb9\x53\x76\x1a\xbf\xa8\x6e\xcc\x83\xaf\x4b\x11\xbc\x44\xce\x50\x26\x09\xa9\x17\x75\xc9\x05\x56\x1a\x9d\x06\x9a\xff\x41\x3f\x88\xc0\x0e\x4f\xec\x04\x3c\x13\xf6\x4e\x33\xdb\xbe\x03\x67\x73\x74\xeb\x60\x65\x0f\x7c\x59\x82\x16\x52\xaa\xc7\x95\xfe\x6e\x89\xc5\xcf\x94\x81\xe8\x03\x6f\x7f\x03\xea\x96\xfc\x4f\x78\x3b\xbb\x81\x15\x91\x41\x01\xaf\x76\x08\x8f\xb1\xc1\x75\x13\xaf\x32\x3c\x18\xab\xad\x05\x92\xd5\x68\x9f\xd8\xa5\x28\x50\x6c\xa5\x4c\xe2\xbb\x8c\xd6\xf8\xce\x71\x3c\xf3\x40\xfd\x36\xe5\x14\xc2\x01\xca\x24\x25\x10\x4b\x5c\xe2\x04\x3a\xde\x8f\xdc\x99\xef\x18\xd9\x22\x62\x55\xe4\x7d\xd7\xa8\x7d\x09\xa1\x17\xba\xf3\x14\x51\xab\x19\x6f\x04\xd5\xa4\x35\x19\x97\x26\x23\x10\x30\xd9\xc4\x49\x06\xb1\x20\x5b\x92\x0b\x06\xe6\x1a\xf6\xbd\x77\xe6\x11\xeb\x51\x34\xe2\x5b\x47\x9a\x46\x8a\x27\x24\xb5\x83\xc1\xb7\x31\x1a\x44\xf0\xaa\xed\x78\xd3\xf1\x8c\x64\xa4\xb7\x46\xa2\x4a\x06\x14\x43\x72\xf1\x2f\xb4\x01\xc1\x86\x57\x19\x1c\x3e\xcd\x6b\xae\xfb\xc5\x67\x63\x72\x68\x64\x10\x18\x2d\x96\x53\x7e\xf5\x80\x16\xc8\x2c\x18\x6f\x1f\xee\xf5\x78\x0f\xf6\x42\x4b\x30\xb6\x34\x06\x32\x01\x9e\x69\xaa\x7b\xc7\x6a\x0e\x60\x65\x7d\x18\x48\xfd\xe8\x81\x22\xc7\xcc\xb6\x54\xe4\x13\x0f\x39\x96\x3c\xe3\x61\xf3\xed\xc4\x1c\xee\x59\x23\x34\x76\x1c\xe7\x4a\xe8\x57\xca\xd5\xd4\x8f\xd4\x0a\x0b\xd4\xed\x0b\xd7\x60\xe4\x00\x1c\x8f\x47\xee\x5f\x0f\x2d\x3d\x39\x92\x40\x3f\x45\x6c\xc6\x5f\x0e\xc4\x4c\x78\x22\x16\x94\x89\xa5\x70\x07\x1c\xb0\xf9\x10\xe5\xe8\x35\x48\xd7\x31\xdd\x41\x4e\x7c\xe4\x46\x8b\x06\x09\xff\xd4\xc6\x49\x84\x5a\x0e\x46\x90\xfd\xff\xec\xbd\xeb\x72\xe3\x48\x76\x2e\xea\xdf\x7a\x8a\x0c\x46\x4c\x94\xe8\x80\x50\x25\xd5\xa5\xa7\xbb\xbc\x1d\xc1\xa2\xa8\x2a\x7a\x24\x52\x9b\xa4\xba\x46\xe7\xcf\x6e\x90\x4c\x4a\x98\x02\x01\x1a\x09\x4a\x45\xff\x38\xe1\x77\xf0\x1b\xfa\x49\x4e\xe4\xba\x64\xae\x04\x40\x4a\xea\xe9\x1e\x6f\xfb\x8c\x1c\xe1\xe9\x92\xc8\x44\x22\xaf\xeb\xf2\xad\xef\x63\x16\x8d\x80\xdc\x53\xae\x6e\xac\x5a\x21\x2c\x19\xe4\x16\x96\xcb\xb6\x0e\xf2\x1c\x02\xd0\x9e\x4c\x66\x7f\x11\xd5\xb5\xe4\x7d\xc1\x33\xb7\xdd\x7d\xde\x29\x81\x07\xad\xfd\x93\x48\x3c\x30\xb5\x3f\xb8\x91\x82\x71\x1b\xf2\x4d\x50\x69\xe2\xb8\xbe\x5d\xac\x89\x11\xc1\xed\xb9\x95\xd3\xf7\x70\x8c\x9e\x7e\xa8\x77\xe0\xa3\x2a\x4a\x9f\x08\x98\xb8\x4a\x4d\x70\x57\xca\x07\x77\x73\xf9\x12\x18\x11\x22\xc6\x5c\x97\x03\x8f\x94\x34\x50\x2a\xa9\x84\x5c\x07\xbb\x00\x92\xf8\x9f\x42\x83\x7b\xd3\x9b\x9c\x00\xc5\x01\xc7\x7c\x18\x69\x64\x60\x0d\xa2\xe8\xf6\xa2\x6b\xf7\xbc\x83\x8c\xad\x53\xe3\x9c\xad\xe0\xde\x95\x82\x35\xa2\x3b\x11\x82\xcc\xf8\xbd\xf1\x6f\x6d\x9e\x0d\x62\xcd\xf8\x25\xe6\x28\xb4\x83\xe7\xa7\x18\x92\x47\xa8\x72\x33\x22\x06\xe8\x66\xc5\x71\xc4\x53\xab\xe2\x1d\x96\x5d\x94\x50\xe4\x38\xca\x96\x08\x6c\xf0\x5e\xb4\xf3\xcc\xa1\x0a\x60\x99\x61\x5d\x9f\x8c\x18\x01\xc5\xd8\x3b\xd7\x9b\x7b\x2a\x9e\xa2\xbb\xea\x5c\x2f\x32\x1c\x43\xa7\xee\x12\x42\xd1\x58\x50\x08\xc1\x7f\xe4\x66\x40\x74\x7f\x7d\x40\x7b\xc8\xb3\xf4\xa3\xfc\x90\x78\xe8\x4a\xae\x2a\x66\xb8\x17\x40\x34\xff\x0e\x5e\x7d\xa6\xb9\x9b\x20\x96\x21\x31\x12\xf6\x04\x36\xc1\x8b\xaa\x63\x07\x73\xab\xcd\x5c\x5a\x75\x71\x9f\x21\x07\x0e\xaa\x81\x24\xc6\x6c\xd7\x74\x2b\x43\x37\x84\x4d\x5e\x33\x35\x9b\x0c\xfb\x7c\x29\xb2\x42\x78\x4b\x9b\xae\x10\x97\x04\xde\x0a\xaa\x20\x68\x7f\x61\x87\x9c\x27\xa1\xea\x10\xe6\xd5\x10\x86\x4b\x50\x33\xc6\xa4\x4b\x38\xb1\x3a\x1c\x3d\x97\xb2\x90\x1d\x78\x67\xd6\x12\xd2\x09\xfb\xbf\x1e\x9b\xea\x02\xe1\x7c\x67\x86\x08\x39\xc4\xf7\xd0\xbb\xfb\xdb\x27\xe2\x9d\x68\xbc\x94\x69\x0b\x72\x67\xef\xbd\x2b\xb1\x29\xe8\x00\xb2\x19\x99\xa8\x96\xf7\xf0\x27\x31\x5d\x9f\x38\xf6\xba\x5c\xa3\xc5\xd1\x60\x99\x92\xdd\x6b\x69\x0f\xec\x85\x36\x06\x04\xac\xfb\x08\x20\xc3\xe1\xcd\xe1\x6e\xf5\xb6\x0b\xc3\x2f\xc3\x3a\xc7\xa8\x38\xf7\x7d\x9d\xa9\xe0\xc4\x0a\xb3\xdd\x00\x03\x6b\xe9\xb5\xf3\xc5\xcc\xb6\x7c\x00\xa2\x20\x7b\x1c\xed\xeb\xbf\x0c\x3b\x40\x77\xd1\x76\x6d\x74\xfa\x80\xc1\x1f\x79\x14\x38\xdc\xfa\x0e\xa4\xe6\x30\x5e\xb2\xd2\x27\x02\x14\x46\x52\x39\xe5\x9d\x9a\x2d\x25\x8c\x67\x01\x42\xb0\xdb\x81\xbe\x0e\xee\x20\xad\x26\x92\x43\x68\xcf\x51\x48\xeb\xd7\x19\xee\xbd\x06\x96\x49\xec\x9e\xa2\xbe\x9f\x22\xb6\x93\xbc\xd2\x8f\x44\xdf\x25\xd2\xec\x64\x53\xca\x71\x73\x14\x25\x7f\x2d\x31\xc2\xb2\xff\x48\x7e\x3d\x8a\x2f\xf9\xdc\x04\xbd\x2e\xc5\x06\x1e\x93\x1d\xcb\xf7\x08\x0e\xfa\x00\x4b\x81\xac\x55\x5c\x4e\xe1\xc9\x89\x6a\x33\xe7\x45\xdc\xbc\xc6\x65\x43\xe0\x49\x96\x21\xf7\xac\xd5\x59\x55\x7a\xbd\xa9\x44\x4d\x05\xfa\xed\x8d\x87\xe1\x16\x7e\x28\x52\xf2\x1d\x01\x65\x16\x96\x1f\x79\xfe\x79\x59\x60\xd2\x82\x6e\x93\xf0\x00\x27\x67\xed\xc9\xd0\xea\x35\x42\xda\x07\x4d\x92\xbb\x32\xd9\xdc\x07\x67\xd6\x29\x46\x33\xa4\xd6\x0b\x58\xe4\x3a\x31\xc4\x40\x06\x2e\x75\xab\xe5\x57\x91\x7d\xeb\x6b\x4b\x28\x10\x29\x42\xcf\x75\xbb\x0e\x31\x88\x10\x32\x40\xa7\xb6\xeb\x6d\x4b\xcc\xee\x52\xa8\x17\x42\x64\x79\x95\x66\xad\xe6\x61\x50\x6f\x94\x2f\xed\x6a\x0e\x07\x31\x2c\x7a\xf1\x45\xb2\x76\xd1\x26\x58\x5d\x1f\x79\xb4\x52\xad\xf1\x55\x92\x66\xb0\xbb\xed\xfe\x59\x51\x86\x11\x3f\xeb\x87\x63\xbe\x63\xe5\x60\x67\xab\x60\xa0\x78\x53\xa6\x58\x49\xfb\xe1\x8d\x5a\x82\xf5\xb2\xaa\xb8\xf8\x41\x1b\xe3\x57\xe8\x55\x51\xea\x02\x46\xfd\xaf\x1b\x44\xf1\x4e\x7b\x5f\x09\xde\x24\xd5\xe6\x65\xef\x12\x39\x3e\x79\xd8\xcf\x69\x69\x2a\xd4\xa9\x73\x3e\x86\xbb\xda\xe8\xa8\x29\x56\xfb\x57\x0c\x57\x9a\xee\xa8\xbe\x34\x74\xce\x64\x77\x3d\x14\x79\xb1\xa5\x34\xa1\x6f\xd5\x8d\xef\xdb\x60\x7c\x09\x6e\xb1\xd0\xe9\xc6\x1d\x98\x42\x13\xb1\x26\x51\xb1\x67\x8f\xf1\xbe\x70\xb7\x43\x8b\x2a\x04\x19\x8d\xcc\x53\x81\x92\x10\x72\x28\x18\x42\xe1\x1e\x00\x2f\x6a\xdf\xa6\xed\x1c\x19\x86\x9d\x81\xa6\x20\xc6\xe6\x1e\xbd\x24\x18\x44\x15\xcc\xb4\x5f\x00\x91\x2c\x58\xfa\xd7\x6d\x92\x81\xb3\x59\x38\x60\x7e\xae\x1f\x43\xae\x44\x07\x18\x70\x77\x6c\x88\xf0\x3d\x7d\xe3\xc4\xaa\xbc\x46\xce\xa8\xa8\xc8\xf0\xa4\x5c\xe0\x17\xac\xf6\xaa\x15\x13\x30\xa4\x4f\x26\x3b\x1a\x5a\x38\x58\x87\x55\x94\x4b\x44\x8d\x70\x47\xb1\x8e\xaa\x86\x31\x71\x65\x81\xbd\x7c\x91\x66\x59\x82\x48\x67\xc7\x20\xd2\x4c\x91\x40\x74\x1e\xac\x63\xca\x2a\x24\x9c\xb1\x02\x9d\xc4\x05\x25\x86\x0e\x26\xb0\x65\xaf\xa8\x3b\x59\xfa\x4d\xc3\x11\xef\xd6\x06\x87\x02\xbc\x90\x90\x28\x6c\xce\x49\xa5\x3d\x20\x0d\x90\xe0\x5d\x54\xab\xb4\x33\x17\xc2\x77\x5b\xef\xaa\x7c\xd7\x28\x4f\xd4\x54\xa0\x8c\x2e\x21\x32\xd0\x48\xcd\xcb\x95\x5c\x15\x2d\x33\x10\x50\x88\xcd\x77\x82\x73\x06\x4b\xf2\x70\x84\x1b\x65\x97\xa4\x74\xc4\xa2\xb0\xb0\x74\xf7\x29\x29\xe1\x7d\xe8\xb1\xb3\xa0\x63\xc5\x97\x1e\x7d\x84\x8c\xe8\xf3\xe2\x31\x37\x55\xa9\x93\x35\x92\x57\xa7\x0e\x87\xe0\xc5\x31\x0f\x54\x21\x85\x29\x92\xf0\x62\xa5\x79\x34\xc2\xb4\x6d\xba\x90\xce\x89\x88\xa8\x3a\x35\xf2\x63\x2f\xcb\x31\x91\xfa\x04\x9e\x19\xf0\xfc\xcb\x71\x0d\xb7\x01\x89\x9d\x11\x12\xc3\xd5\x03\x49\x99\x97\xf9\x2e\x2c\xfd\xa9\xab\xb1\x11\xdf\x56\x2f\x57\x1d\x9d\x57\xe0\x2f\xf9\x5c\x4e\x07\x2d\x7d\x99\xdd\x71\xf9\x23\xd2\xdc\x82\x0a\x46\xac\x5b\x93\x04\x55\x68\x7b\xf9\x94\xac\xdd\x2a\x19\x38\x5d\x1a\x21\xac\x45\xae\xf9\x33\x80\x0f\x43\x93\xa3\xd9\xc6\x5a\x97\x77\xb8\x70\x24\xfb\x95\x3d\xd9\x0e\xef\x54\x84\x04\x33\x84\x2a\x57\xcd\x97\x23\x94\x38\x26\x7c\x60\xa0\xad\x49\x2f\x5e\xd5\x9e\xbe\x62\x82\x03\x70\x1a\x80\x45\x32\x23\x3e\xf0\x78\x9f\x54\x40\x46\xe8\x8e\x43\x86\xe8\x63\xde\x04\xb3\xe6\xbb\x57\xf6\x12\xd7\x4b\xa8\x2e\xc4\xe0\x0a\xe4\x2b\xb5\xa9\xd4\x7d\xb2\x44\xc7\x60\x9b\x51\xe5\x8e\xb7\xb3\x36\xa5\x7e\x48\x8b\xad\xf1\xa6\x56\xa4\x36\xd9\xd6\xf6\x8b\xaa\xf7\xea\x15\x08\x7b\x73\x6e\x01\x2d\x0c\x2f\xd6\x3d\x7d\x72\x76\x8c\xfc\x3b\xe0\xe2\xab\x1a\xe3\x29\x95\xc2\xb9\x3b\x5e\xaf\x56\x45\x59\x99\x86\xb9\x2c\x24\xd4\xdb\x1c\x61\xce\xa2\x51\xf9\xdd\x3e\xe1\x18\x7b\xd7\x43\x29\xf8\x1e\x03\x3a\xa0\x4b\xd8\xb5\x3c\xde\x6f\x57\xad\x23\x55\x16\xbb\x24\xa3\xa4\x57\x21\xa0\x6d\x24\x29\xef\xbb\xf2\x64\xad\x7c\x58\xe8\x84\xf9\xb8\xb4\x82\xa0\x99\xd0\x08\x09\x50\xb8\x90\x24\x3a\xc1\xea\x40\x9c\x7e\x80\x80\xc2\xbf\x21\x81\x93\x25\x8f\x66\x9b\x56\x5d\xbb\x83\xf4\x9d\x73\xdd\x85\x81\x4e\x1f\xf6\x87\xf5\xd2\x67\x34\x22\xbc\x8f\x22\x65\x10\xfb\x12\x79\x94\x21\x00\x4f\x93\x0c\x37\xa2\x1d\x99\xd2\x05\xb5\x24\x43\x9a\x7d\x8e\x87\x2f\x51\x51\xc6\xe9\x69\xac\xae\xe1\xe9\xc6\xf3\xaf\x39\x75\xc2\x0e\x43\x39\x6a\xa6\xa2\xdd\x52\x2e\x40\x0b\xe8\xfa\x36\x2f\x24\xbc\x9d\x05\x4b\x5b\xc0\x9f\xc2\x7f\x4e\x0d\x56\x77\xc5\xbe\x72\x09\x0a\xa8\x1d\x49\x9f\xaf\x28\x60\xac\x01\xf5\xf2\x95\x09\x3a\xed\xa8\xe8\x5c\x31\x46\xf0\x49\x29\x10\xeb\x47\x9d\x12\x4e\x20\xb9\x2e\x7f\x4d\x2a\xcf\x9e\xa0\x22\x93\x01\x69\xa1\x30\xe9\xa0\x47\x59\xa9\x93\xe5\x4e\x25\x0b\x32\x6e\xec\x4e\xd3\xa5\x46\x0b\x94\x7f\x1b\xf1\x2d\x61\xcf\x08\xc8\xf0\x89\x09\x07\x3b\x7b\x9d\xe4\xb9\x35\x12\x7c\x9d\x74\x13\x9e\xbc\xaa\xaf\x0d\x88\x09\x62\xe5\x30\xb3\x18\xd4\x06\x05\x73\x37\x74\xe5\x73\x8e\x99\x5e\x75\x5f\x97\x20\x89\xd4\x66\x21\xf1\xce\x6f\x2b\x74\x6d\x79\x36\xee\x67\x19\x55\x85\xf7\xf1\xf4\x26\x11\xcd\x63\x91\x75\x3c\x0f\x8a\x07\x48\xb8\xf0\x29\xcd\x90\xe1\x72\x70\xa8\xdd\x02\xfa\x1f\x3b\x66\x2d\x9a\xa5\xb5\xf8\x40\x9d\x2f\xcc\xd9\x10\xb2\xd3\xc2\xfa\x4a\x20\x98\xe1\x4a\xf2\x41\xb6\x36\x5b\x3e\xa6\x4b\x7f\xe6\x9c\x20\x89\x4c\xe0\x68\x87\x25\xed\x62\x0d\xee\x59\x82\x11\x13\xda\x45\x88\xae\xb2\x53\x49\xdb\x5c\xec\x71\xdc\xe0\x9e\x05\x05\x79\x1a\x0e\x58\x23\x4e\x10\xde\x88\xcc\x67\x63\x6e\x48\x5d\x11\x83\x32\x59\x56\x3c\xe2\x11\x82\x6f\x45\x77\x15\x84\x9c\x3a\xe1\x4b\xe2\x11\x91\xef\x38\x26\x22\xa4\x82\x28\x91\x9e\x56\x18\x74\xa3\xfa\x2c\xb5\xd4\x79\x41\x5e\x0b\xd2\xae\x02\x92\x08\xe8\x25\xc0\xa7\x85\xd6\x8f\x1d\x09\x5b\xee\x5a\xae\x1b\xc1\xc0\xda\x2e\xbe\x03\xcf\x7b\xd0\x79\x82\xf5\x8d\x00\x60\x55\x5b\x8a\xea\xe3\x47\x24\x0f\x63\x37\x06\x32\x42\x98\xe7\x0e\x61\xc0\xeb\x33\x08\xe1\x3b\x34\x2d\x1c\x57\x24\x91\x95\x23\x64\x7c\xcf\xdb\xee\x7d\x2f\x59\xe1\x0d\xed\xb6\xa1\x95\x6a\x96\xeb\xb7\x1c\x66\x03\xec\xd4\x0c\xcd\xef\xbc\xd1\x55\x0f\x42\x7a\xd2\x5a\x60\xe6\x84\x10\xff\x8b\x91\x7e\xc7\xd8\x0d\xeb\xb9\x58\xf9\x62\xe1\xe5\xd3\xb5\x3d\x9e\x57\xd1\x13\x09\xbb\x87\xd4\xaa\x0d\xdc\x15\x0d\x78\x81\x90\x72\xd8\x05\x16\x38\x39\xba\x35\x95\x84\xaf\x72\xa5\xd5\x9e\x77\xad\x0a\x08\x34\x16\xfe\xe1\x1e\x6c\x5a\x96\x48\xda\x5e\xa8\xa5\xde\x94\xd6\x38\xb3\xee\x09\x40\x4b\x68\x88\x04\xef\x38\x4e\x52\xb0\x20\xd0\x37\x4e\x8d\x8c\xbd\x38\x26\xaf\xe3\xb7\xee\x09\xd1\x5f\x75\x22\xc1\x49\x00\x60\x80\xa5\xe8\x84\x5d\x29\x99\x74\x9a\x9c\x3f\xe4\x41\xfa\xb1\xea\xfc\xa9\xbe\x5c\x98\xc9\x6f\xe7\xe5\x85\x21\x75\xe2\x08\x6b\x88\xea\xd4\xde\x0c\xec\xfb\xd7\x17\x17\x71\x83\x48\xe0\x71\x23\xaa\x4d\x14\xa0\x68\x7f\x71\xac\x05\xfb\x85\x25\x78\x6d\x55\x8a\xb5\x6f\xe2\xf5\xe3\x9c\x55\x09\xdb\x40\xcd\xbe\x15\x92\xaa\x62\xff\x7c\xa6\x93\x1a\xa8\xe9\x07\xa0\x21\x8b\x0b\x22\x4b\xf5\x83\xf6\x80\x0a\xda\x77\x91\xbd\x8f\xcc\x36\x41\x6c\x15\x5a\xcd\x8b\x22\xcf\x75\xc0\x1a\x6a\x6f\xd7\x2c\x84\xc7\xd9\x2d\x83\x53\x8d\xa7\x9b\x2c\x92\x17\xde\x31\x78\x6e\x9b\xb2\x58\x6c\xd9\xd3\x7a\xd0\x3b\x72\x83\xa3\xc6\x4e\x87\xc2\x6e\xb8\xe2\xda\x4e\x22\xb0\x0b\x24\xca\x57\xb3\xca\x68\xeb\x94\xb0\x81\xe6\xf8\x76\x18\xb5\xeb\xfa\xe6\xae\x0c\x97\xc7\xb0\xef\xca\xfc\x77\xd2\x51\x6a\xb8\xd2\x79\xdb\xe6\xb0\x63\x80\xdd\xb7\x77\x42\xe0\x61\xe3\x62\xa6\x58\x4f\x48\x64\xd0\xb6\x28\x20\x00\x0e\x29\x68\x57\xf1\x4f\x06\x6b\xaf\xfe\xd0\xd4\xa8\xce\x32\x35\x8b\x32\x85\x4b\xa5\x28\x77\x50\x63\xda\xc6\x1a\x27\x92\x73\x4e\xce\x12\xef\x43\x04\x78\x47\x8e\x08\xc5\xd4\xbd\x97\x88\x20\xd0\x0e\x34\xe4\x69\x08\xd0\x36\xf0\xce\x45\x0d\x6a\x24\xdc\x1e\x07\x27\x0a\x80\xa5\xfb\xbd\x90\x38\x70\xb9\xf6\x54\x7c\x52\xc6\xa9\xd4\xee\xa6\x82\xda\x76\xb9\x3a\x5d\xe6\x4f\x40\x23\x39\x01\x48\xe3\xc1\x0a\x81\xb6\xc7\x81\xbe\xbc\x17\x83\x20\xf1\x5d\x07\x20\x81\x7b\x70\x93\xec\x18\x98\x18\xe4\x11\xaa\x5d\xc8\xd5\x40\xc8\x26\x0e\xab\x12\x6d\xde\x0e\xe1\xf5\xf2\x54\xf1\x1b\x41\x3e\xaf\xde\x36\x1a\x67\x11\x73\x7b\xd7\x36\x85\x75\x4f\xf0\x20\xe1\x00\x5d\x63\x81\x71\xbc\x35\x82\xda\x21\xb9\x7a\xea\xeb\x0b\xd8\x3a\x9b\x87\x42\x58\x04\x17\xb4\xed\xd0\xb0\x04\xc5\x39\xf6\x62\xd7\xa0\x4b\x41\xde\x7a\x61\x98\xae\xb8\x8b\xb7\xc7\xbc\x4b\x82\x8d\x29\xc1\x8d\x89\x5e\xb9\xfe\x68\xb7\x43\x09\xaf\x4e\xba\x8f\xae\xde\xd9\xf0\x91\x88\x35\x4a\xcd\xfd\x4b\xf9\x13\xdb\x37\x9d\xa3\x74\x21\x54\x56\xd0\xfa\x14\xa7\x9a\x2b\xdc\x0c\xc7\xe4\x31\x71\xce\x73\xe4\x83\xed\x67\x7f\x54\x57\x49\xb9\xb8\x07\x09\x24\x46\x0b\xdd\x3b\xaa\x55\xe1\x19\x3a\xb4\x9c\x17\xd8\x4d\xb8\x56\x86\xc2\x8b\x0e\x77\x03\x4c\x3b\xeb\x4d\x96\x02\x5d\x21\x79\x96\x5e\x81\x63\xe5\x82\x34\x01\xc7\x36\x21\x19\x76\xc2\x46\x9e\xeb\x10\x04\xe9\xa3\xed\x22\xbf\xc9\x2f\x4a\x74\x4f\xa7\x67\xb1\x1a\x15\x6a\xba\x2d\x4b\x0d\x1f\x2d\x56\x6a\x0c\x0c\x67\xaf\x40\xe3\x69\x59\xac\xd9\x80\xab\xf1\xdf\x61\x84\x62\x49\xe4\x5d\xea\x98\xfd\x43\x60\x78\x03\xbd\xd3\x12\xb3\x18\xd2\x80\x74\x9d\xed\xfa\x29\x2c\x93\x65\xea\xd4\xeb\xdc\x23\xda\x32\x6d\x3b\xf6\xeb\xf4\xf7\xc5\x96\x8e\x63\x17\x19\xda\xff\xdd\xd8\x99\x9f\x49\xbe\xff\x9c\x41\xd1\x63\x51\x13\x66\xd2\xf5\x36\xab\x50\x5e\x3a\x23\x69\xa4\x26\x5d\x55\x2b\x7b\x08\x57\x79\x95\x15\x92\x91\x88\xaf\xd1\xe5\xd2\xf0\x36\x29\x14\x63\xc7\x5a\xf4\x31\x05\x95\xf4\x24\xcb\x6a\xa1\x22\x3e\x14\xed\xd8\xc2\xd1\xe4\x53\xe1\x5c\x14\xc7\x20\xb9\x85\x75\xe9\x17\xf6\xc2\x25\x4f\x0e\x76\x9e\x2b\x8d\x74\x67\x93\xd8\xb4\x55\x61\x4f\x98\xb5\x34\xd9\x6b\xb8\x4a\x2a\x37\x21\xc9\x28\x0a\x05\xf2\xc0\xcd\x0b\xb0\x00\x8b\x40\xe1\x21\x04\xa8\xb1\x0f\x0e\x29\x86\x55\x69\x77\x31\x42\x2d\x19\x71\x16\x9e\x99\x92\xe4\xe7\xf4\x6d\xac\x26\x28\x45\x3f\x22\x8b\x7b\xe8\x69\xd0\x3f\xaa\x1b\x23\x34\xc3\xf7\xeb\xbc\xfc\x7a\xb0\x1f\x8d\xbd\x00\x34\xba\x81\x81\x35\xd2\x28\x41\x41\xbc\x83\xa0\x34\x47\x8f\xd7\x49\xfd\x78\xf2\x0e\x41\xce\x8f\x6a\xfb\xd9\xee\x00\x97\x3b\xc0\x08\xe1\x91\xfc\x24\x57\xeb\x09\xde\x9b\x60\x87\xef\x42\xcc\x1a\xfe\x88\x1a\x63\x22\xb7\x73\xc8\xa5\x0a\x5a\x9f\x33\x1a\x40\x54\xfe\x1e\xaa\xd5\x7d\xba\x0a\xdb\x7b\x54\x60\xfa\x39\x86\x6d\x57\x63\x9f\x94\x3b\xcf\x23\x46\xd5\xaa\x89\x23\xd0\x70\x45\xe2\x24\xaf\x84\x85\xd5\xad\x7d\xc1\x03\x59\xb2\xeb\xee\xaf\xaa\xa7\xe4\xac\x2c\x9b\x6f\x55\x07\xd9\x23\xe4\xe2\x0d\x0f\x27\x97\xb4\x0c\x8c\xf0\x30\x04\xe1\x82\x0f\xbf\x7e\x45\x3a\x77\xa0\x4e\x82\x93\x7f\xa3\x9b\x73\x9e\xe6\xba\x91\x41\x63\xab\xa9\x4d\x2a\xe4\x25\x2f\x4c\x45\x8b\xe4\x43\x78\x06\x16\xcf\xcf\x1b\xf0\x6c\x84\x6a\x1b\x18\x0d\xdd\x87\x63\xcd\xb2\xa0\x1c\x24\xe0\x1a\x01\xf4\x98\xab\xd3\x6c\x1a\x01\x8c\xe1\xf6\xaf\xea\x6a\x38\xc0\xce\x75\x44\x31\x60\xad\x43\x41\xb1\x84\x59\xbd\x60\x04\x9c\x2e\xfa\x44\x3f\xa4\x76\x0c\x7f\x6e\x55\x70\x37\x9e\x32\x77\x9f\x7c\x62\xa0\x96\x5f\x52\x6b\x24\x28\xd6\xd4\xc7\x7f\x8e\x46\x14\x1e\xeb\xe9\x1a\xaf\x89\x74\xad\x63\x35\xb5\x87\x43\xd0\x9a\x93\xed\x26\xce\xc4\x34\x57\x66\x93\x96\xa9\x5b\xae\x5c\x68\x18\x04\x59\x6d\x5f\x11\x92\x6a\xbf\xb0\xd4\x15\x89\x6d\x91\x8e\x0c\x3c\x62\x53\x16\xf3\x4c\xaf\x59\xb9\x7b\xa1\xcb\x5c\xa4\x34\x79\x8c\x53\x43\xd4\xb4\x60\xab\x56\x28\x44\x0f\x86\x55\x4d\x2d\xbf\x0e\x2e\x64\x04\x31\xbb\x1e\x0e\x7d\x8e\x9f\x0f\xeb\x00\x9f\x37\x60\x1d\x06\x66\x4a\xcd\xdf\x0e\x9a\x50\x64\x87\x55\x51\xa8\xe0\x47\x50\x7c\x7b\x44\x89\xc8\xe2\x1e\x7d\x23\x0a\xf3\x30\x76\xaf\xd9\x51\x54\xe4\xa8\xf7\x20\xd4\x86\xaa\x0e\xac\xa1\xc6\x20\x79\x98\x1f\x8c\xd6\x4e\xc8\x40\xe1\xd3\x9f\x3d\x38\x3e\x47\xb5\xb8\x2f\x38\x3d\xc6\x6d\x41\xec\xf3\xf9\xbd\x24\xab\xf2\xe0\x6c\x6e\xca\xe2\xfb\x0e\x35\x03\xf5\x22\x5d\xb2\x20\xdf\x6a\x0b\xec\x50\x2f\xdf\x0c\xb6\x25\x2a\x03\x89\x1c\x61\xcb\x77\xc8\x75\xe2\x07\x03\xb8\x61\x98\xd2\xf7\x83\x26\x11\x28\x22\x49\xc4\xf6\x16\x8e\x0c\xb4\xce\xdf\xe0\xa0\x93\xb4\x63\x2e\x61\x76\xd9\xe0\x77\xef\x62\x07\xf7\x8e\xc2\x76\x12\xec\x08\x34\x54\x0c\xff\x96\x55\x24\x12\x6e\x11\x7c\x41\x98\xaa\x35\x7b\x1d\x8a\x45\x10\x55\x5f\xb4\x20\xab\xc0\x36\x25\x11\x3d\xc7\x9a\x6b\xdf\x8a\x20\xde\xb8\xc8\x21\xe1\x27\x16\xa8\x93\xde\xe7\x42\x03\x5c\x57\x5f\xa9\xd4\x00\x8f\xbe\x2f\x83\xc9\x40\x0d\xa7\x6a\x34\x56\x5f\x7b\x93\x49\x6f\x34\xbb\x55\x17\xe3\x89\xfd\x83\xba\x9e\x8c\x3f\x4f\x7a\x57\x91\x9a\x8d\xe1\xdf\x83\x3f\xcf\x06\xa3\x99\xba\x1e\x4c\xae\x86\xb3\xd9\xe0\x5c\x7d\xba\x55\xbd\xeb\xeb\xcb\x61\xbf\xf7\xe9\x72\xa0\x2e\x7b\x5f\x63\x35\xf8\x73\x7f\x70\x3d\x53\x5f\xbf\x0c\x46\x6a\x6c\x5b\xff\x3a\x9c\x0e\xd4\x74\xd6\xb3\x9f\x1f\x8e\xd4\xd7\xc9\x70\x36\x1c\x7d\x86\xf6\xfa\xe3\xeb\xdb\xc9\xf0\xf3\x97\x99\xfa\x32\xbe\x3c\x1f\x4c\x40\x31\xec\xf5\x78\x82\x5f\x54\xd7\xbd\xc9\x6c\x38\x98\xda\x6e\xfc\x3c\x3c\x1f\xc8\x2e\xa9\x4e\x6f\xaa\x86\xd3\x8e\xfa\x3a\x9c\x7d\x19\xdf\xcc\x7c\xdf\xc7\x17\xaa\x37\xba\x55\x7f\x1a\x8e\xce\x23\x35\x18\x42\x43\x83\x3f\x5f\x4f\x06\xd3\xe9\xe0\x5c\x8d\x27\x6a\x78\x75\x7d\x39\x1c\x9c\x47\x6a\x38\xea\x5f\xde\x9c\x0f\x47\x9f\x23\xf5\xe9\x66\xa6\x46\xe3\x99\xba\x1c\x5e\x0d\x6d\x3f\x67\xe3\x08\x9e\x46\x9f\xe5\xd6\x6d\x67\xc6\x17\xea\x6a\x30\xe9\x7f\xe9\x8d\x66\xbd\x4f\xc3\xcb\xe1\xec\x16\x64\xce\x2e\x86\xb3\xd1\x60\x3a\x85\xa1\xeb\x61\xcf\xfb\x37\x97\xbd\x89\xba\xbe\x99\x5c\x8f\xa7\x83\x18\x07\x70\x34\x1b\x4e\x06\x6a\x32\x9c\xfe\x49\xf5\xa6\x3c\xac\xff\xfb\xa6\xe7\xda\xb9\x1e\x4c\x2e\xc6\x93\xab\xde\xa8\x3f\xb0\x8f\x92\xaf\x3c\x9c\xc2\xdb\xaa\xdb\xf1\x4d\xac\xa6\x5f\xc6\x37\x97\xe7\xc1\xdf\xed\x30\x0d\xd4\xf9\xe0\x62\xd0\x9f\x0d\x7f\x1e\x44\xf6\x83\xaa\x37\x9d\xde\x5c\x0d\x68\xb4\xa7\x33\x18\x9e\xcb\x4b\x35\x1a\xf4\x07\xd3\x69\x6f\x72\xab\xa6\x83\xc9\xcf\xc3\x3e\x8c\xc2\x64\x70\xdd\x1b\x4e\xec\x18\xf5\xc7\x93\x89\x6d\x65\x3c\xc2\x35\xf4\x21\xc6\xc2\x05\x97\x6e\xbb\x64\x8c\x3c\x1e\x1a\x23\xbb\x7c\x06\x3f\xdb\xc5\x71\x33\xba\xb4\xe3\x30\x19\xfc\xef\x9b\xe1\xa4\x6d\x89\xd8\xf6\x7b\x9f\x27\x03\x18\x66\xb9\x22\xbe\x0e\x2f\x2f\x61\xee\xea\xcb\x22\x82\xaf\x8c\x6e\xc5\xb2\xb8\x55\x5f\xbf\x8c\xd5\xd5\xf8\x7c\x78\x61\x27\x85\x96\x4d\x7f\x3c\xfa\x79\x70\x3b\x0d\x46\xa5\x37\x15\xeb\xb5\xf7\x69\x6c\x07\xe6\xd3\x40\x5d\x0e\xa1\x3f\xb3\x31\x8c\x92\x9d\xb5\xf3\xde\x55\xef\xf3\x60\x2a\xd6\x05\x3c\x93\xc4\x99\x23\x35\xbd\x1e\xf4\x87\xf6\x3f\x86\xa3\xfe\xf0\x7c\x30\x9a\xf5\x2e\x71\xa8\x46\xd3\xc1\xff\xbe\xb1\x33\xdb\xbb\xe4\x46\x54\x6f\x32\x9c\xda\x16\xec\xd2\xa4\x69\xbc\x99\x0e\x60\xf9\x8d\x78\xd9\xcc\xc6\xf0\x3b\xd9\xd9\x63\xff\xec\xe6\x92\x54\x97\xe3\x29\xac\xbf\xf3\xde\xac\xa7\xa0\xc7\xb3\x9e\xfa\x34\xb0\x9f\x9e\x0c\x46\xe7\x83\x09\xec\xb0\x5e\xbf\x7f\x33\xe9\xcd\xe0\x61\xf6\x1b\x83\xa9\x9a\xde\x4c\x67\xbd\xe1\x08\x67\xc3\xbe\x2f\xec\xef\xe1\xe4\xdc\x6d\x31\x58\xb5\x17\xbd\xe1\xe5\xcd\xa4\xb1\xee\x66\x63\x35\xbe\x1e\x40\x93\xb0\xfe\xc4\x4c\xe0\x27\xa6\xdd\x08\x26\x5f\x0d\x2f\xd4\xf4\xa6\xff\x85\xa6\x4d\x05\x1b\xf9\x56\x7d\xe9\x4d\xd5\xa7\xc1\x60\xa4\x7a\xe7\x3f\x0f\x61\x33\xd2\x73\xc6\xd3\xe9\x90\xc6\x64\x4c\x2d\xd0\x38\xe2\xea\xfb\x21\x46\x7f\x72\x53\x6a\xbf\x02\xa7\x8d\x9a\x27\x79\x7f\x2d\x83\x13\xcf\x15\x57\x81\x4e\x68\xb0\x90\x7d\xb1\x87\x83\x55\x23\xba\x9b\x22\x13\x73\x4d\x76\x50\x56\x2c\x92\x8c\x4a\xa1\x90\xed\x99\x30\xf5\x74\x04\x63\xe5\x1d\xc1\xd2\xad\x9d\xa8\x1f\xd1\x29\xda\x82\xf7\x07\xce\x0e\x1a\xcb\xd4\x52\xf2\xc8\x55\x48\xa6\x52\x8b\xac\xc0\x92\xe2\x8d\xbd\xfe\x40\xb4\x02\x55\xb4\xe6\xa6\xc8\xb6\x95\x46\x32\x6b\xb4\x43\xac\x05\x9e\x3e\xa4\x99\xe8\x7b\x4b\xc4\x2e\xf0\x82\x19\xbd\x1c\x94\x99\xf9\x32\x96\x70\x20\x7c\xd5\x7c\x1d\xbb\xe4\x70\x13\xb9\x2a\x75\xb5\x2d\x25\xd5\xae\x1a\x8c\x70\x46\xdb\x94\x1f\xbf\xa0\x80\x56\x0f\xde\x1f\x41\x82\x33\xae\x55\xb8\xb5\x97\xd9\x48\x3f\x72\xeb\xe6\x88\x62\x43\xa4\x9f\x44\x6a\x97\x1b\x29\x0e\x21\x14\x92\x29\xf5\x46\x3d\xbc\x83\x52\x58\xeb\xdc\x17\x94\xd8\xdb\x9a\x86\x84\x1c\xa6\xdc\x4c\x85\x74\x55\x85\x4a\x16\xf7\x90\xa8\x71\xa8\x62\x4a\xb8\x02\x87\xaf\x14\xd0\x45\x5b\x47\xb3\x68\x3a\xea\x76\x84\x3a\xc3\x2c\xd1\xec\x12\x97\xc6\x15\x30\xcc\x08\x74\x18\xa9\xa4\xaa\x12\x8a\x30\x7b\xf3\x94\xeb\xeb\x9c\x7d\x4f\x00\xd3\x21\x38\x47\x26\x59\xd9\x1e\xdb\xde\xba\x2f\xaf\xf9\xb3\xa6\xa2\xb2\x1d\x80\xa5\x89\x82\x0d\x14\xc5\x31\x95\x27\x86\xcf\x76\x68\x51\x51\x84\x5c\x70\x4e\x86\xf4\xcf\xd0\x12\x34\x61\xee\x21\x34\x84\x59\x3c\xcf\xd6\xa7\x55\x67\xe1\x85\x36\x33\xf4\x66\x97\xd6\x42\x2c\x20\xca\x81\x21\x2b\xa6\x53\x5a\x6d\x1d\xa9\xae\x7d\x9b\x95\x35\x3a\xe3\xa3\x7f\xb2\xa3\x08\x5f\x65\x5a\x3e\xf1\xe6\xaf\x0c\x94\xa0\x51\xab\xf3\x32\xd5\x2b\x95\x2e\x75\xa2\x98\x9d\x8a\xd2\x2d\xf1\x3f\xd7\xd4\xf0\xff\x69\xa7\x93\xf2\x9f\xd5\x3f\xc1\xb7\x0b\x2e\xeb\xfc\xe7\x23\x08\x45\x6c\x3c\xf4\x27\x98\xdb\x9f\x9c\x16\x76\x30\xa3\x69\x55\x13\x8f\x4e\xab\xf6\x9c\xf4\x73\x6c\xdd\xc4\x3c\xdf\x18\x8f\xd8\x2b\x69\x38\xbd\x97\xa2\x44\xe5\x38\x2c\x3d\xee\x36\x9d\x94\xb8\xf1\xda\xfe\xed\x5c\x49\xcc\x7d\xb1\xf1\x34\x5d\xec\x79\x6e\x8d\x5e\x6d\x33\xf4\x2b\xd9\xca\xb2\x47\x3f\x5b\x5a\x1f\xa5\x90\x32\xb6\xc3\x31\x73\x7f\xca\xac\x1a\xc6\x52\x51\x3e\xc3\x56\x9a\x6a\xfd\x5c\x67\x9a\xd3\x5e\xe8\xec\x9a\xf8\xe8\xb6\xd8\x06\x6b\xd6\x01\xe0\xc3\xb3\xec\x19\xd3\x25\xa9\xe5\xfc\x18\x82\x33\x97\x17\x55\xa4\x8c\xd6\xea\x9f\xee\xab\x6a\xa3\x8c\xfa\xe9\xf5\xeb\xc7\xc7\xc7\xf8\x2e\xdf\xc6\x45\x79\xf7\x9a\x41\x42\xaf\xff\x39\x3e\xea\x65\x06\xdc\x80\x80\xd7\xa6\xc8\x59\x55\x10\x72\x26\x28\x9d\x0e\xea\x01\x99\x5e\x54\x65\x91\xa7\x0b\x44\xd5\x24\x1b\x5d\xaa\x75\x92\x66\xf1\x11\x63\xf2\xdd\x79\xb4\x48\xbc\x10\x24\x76\x14\xa3\x97\xcf\x88\x54\xa2\xdf\x48\xe3\x84\x64\xe2\xa1\x20\x7e\x5a\xf1\x8d\x88\xf7\x86\x63\xa3\x41\x12\x29\xc4\x6e\x32\xf3\x7e\x6b\x2c\xbc\x94\xab\x2e\x51\x8f\x7a\xce\x59\x0f\x5c\xe0\x69\x25\x15\xa7\x30\x60\xcd\x8c\xc8\x89\xea\xb0\xc4\x18\xc4\xcc\xb0\xa8\x4e\x27\x4b\xe3\xbb\x00\x09\xc7\xc5\x3d\x40\xf4\x39\x25\xb6\x64\x00\x39\x0a\x02\x21\xad\xfd\xce\x88\x90\x38\xd1\x87\x12\x75\x1d\x48\x50\x79\x1e\x3f\x7b\xd7\x06\xe1\x97\xb9\xae\x2a\x82\x42\x09\x5f\x8f\x2e\xaa\x8f\xb0\x02\x5c\x79\xc2\x5b\x5f\xc5\xc0\xd9\xb2\x90\xbe\xee\xb6\x36\xe2\x76\x0c\x61\x9c\xf4\x7a\x93\x15\x3b\x5d\x72\xf8\x58\x48\x36\xb0\xf0\xa0\x2e\xbb\x00\xb5\xb3\x5e\x5f\x06\x23\x9c\xe4\x3b\x48\x46\x9a\xf4\x2e\x47\x76\x35\x3e\x04\xbd\xf1\xd3\xf1\xe0\x0a\xa1\x3d\xef\x05\x4a\x60\xda\x10\xe9\x10\xae\x4d\xbb\xe0\x03\xed\x4b\x34\x5d\xa0\xa8\x09\x7d\x4d\xb7\x87\x40\xa9\xfa\x99\x5b\xe1\x1f\xfe\xfe\xc3\x3f\xf1\xeb\x7e\xff\xe4\xd3\xed\xc9\xa8\x7f\x72\x16\xbf\x8f\xab\xef\xd5\x6f\xff\x8c\x37\x6f\xde\xbc\xf9\xf0\xee\x9d\xfd\xdf\xd3\x1f\xde\xbf\x91\xff\xfb\xe6\xcd\x9b\xb7\x67\x3f\xbc\x3f\xfd\x87\xd3\xb7\x67\x67\x67\x6f\xde\x9c\x9d\xbe\xff\xe1\x1f\xde\x9c\x9e\xbd\x7d\xfb\xfe\x1f\xd4\x9b\xdf\xbe\x2b\xcd\x9f\xad\xb5\x5a\x94\xfa\x87\x87\x64\x99\xae\x0f\x7c\xee\xa9\xbf\xff\x37\xfd\xe9\x5b\x4b\xd5\x9e\x5d\x7d\x60\xe0\x33\xaa\xe7\xd9\x14\x4e\x46\x45\xde\x77\x44\x74\xea\x2c\x7e\xaf\xfa\x93\x41\xcf\x7a\xf5\xaa\x3f\xbe\xba\x1a\x8f\xa6\xd6\x45\xbf\x1e\x4f\x7a\xd6\xbe\xc6\xf0\xcd\x4c\xf5\xc0\xbd\xbe\x18\x4e\xae\xc0\xfe\x3e\x1f\x0f\xf0\xf7\x1c\x3f\xb9\x1c\x7c\xee\x5d\x92\xc3\x3f\x98\xc6\xea\x7c\x38\x9d\x4d\x86\x9f\x6e\xa0\x0d\x70\xc6\x86\x53\x75\x39\xec\x0f\x46\xd3\x81\xff\x36\x3c\x79\xa0\x7a\x23\xd5\x9b\xcd\xc6\x93\xd1\xe0\xf6\xa4\x7f\x39\xb4\xae\xfe\x64\x70\x09\xcf\x9f\x7e\x19\x5e\xc7\xcd\x1e\xd2\x63\xa7\xd8\xee\x70\x04\x71\x0d\x7c\xd6\xc8\x36\xd7\xe9\x4d\x4f\x86\xd3\x8e\xfa\xd4\x9b\x0e\xa7\x2d\xdf\xbf\xea\xfd\x69\x20\xe3\x52\xd6\x4f\x9d\x0c\x3e\xf7\x26\xe7\x1c\x3f\x92\x6d\xd2\xd3\xce\x23\x7c\xf7\xe1\xb4\x7f\xd9\x1b\x5e\x4d\xc1\xd1\x47\xcb\x43\x38\xf9\x6a\x32\x98\xde\x5c\x42\xd4\xe1\x62\x32\xbe\x52\xc3\xd9\xd4\xfa\xe2\xf1\x11\xdd\xfd\x47\xb6\xf5\xaf\xe3\xc9\x9f\xd4\x71\x6f\xaa\xce\x07\x17\xe8\x3c\x0f\x2e\xc7\x5f\xbb\x76\xb4\xf9\x61\xea\xc6\xba\xdd\xd0\x17\xf4\x7b\x78\x14\x9b\x83\x71\xf3\xe9\x72\xd8\x77\xa3\x7b\xdc\xe9\xf7\xaf\x2f\x3b\xd6\x45\xee\xd0\xef\x3a\x5d\x8c\x11\xc1\x63\xf1\x19\xb3\x41\x9f\xa2\x6c\x3e\x24\x12\x44\xc8\xea\xc1\x37\x6b\x9f\x41\x9c\xe1\xc2\x37\x85\x9f\x9c\x7d\xb1\x13\x38\x55\xbd\x9b\xd9\x97\xf1\x64\xf8\xff\x88\xbe\x8b\x49\x87\x78\x06\x3f\xc9\x2e\x26\xec\xc7\x97\xe1\xa7\xe1\x6c\x70\x1e\x1f\x7d\xba\x55\x83\x3f\x0f\x26\x7d\x0c\x6e\xd8\xa7\xc1\x47\x5d\x24\x0b\x1e\xe8\x06\xe7\xcb\x60\xc2\x51\xa8\x3e\x04\x05\xed\xcc\x40\xe8\xc7\x7e\xfe\xd3\x40\x7d\x1a\xdf\x8c\xe0\xf5\x9a\x03\x48\x3d\xc2\x21\xc1\x7f\x8c\x27\xea\xb3\x5d\x07\x53\x68\xd2\xfe\x9e\x1e\xde\x1f\x8f\x28\xbc\x81\xc1\xcc\x11\x04\x65\x86\xe7\x03\xda\x1e\xe3\x0b\xfb\x8d\x09\xf5\x82\x43\x6b\x10\x67\x68\xf3\x56\x59\x4a\xf9\xdc\x81\xc4\x0d\x73\xb6\xc4\xaa\xd3\xc7\xe4\xbd\xdd\xb9\x5f\x85\x5a\x7c\xe2\xca\xaf\x58\xc8\x79\xa3\xcb\xb4\x58\x02\xcf\x66\x6a\xcc\x16\x8c\x8d\xea\xbe\xc8\x8a\x3b\xf0\xbe\x75\xbe\xd8\x2d\xb2\x62\xa3\x97\x69\x12\x85\xdc\x7c\x5f\x09\xa3\x68\x0d\x24\xcc\xc1\xa3\x8b\x2f\x54\x09\xed\x65\x1d\xea\x7f\x88\xc4\x41\xc1\x38\x02\x4f\xcf\x22\x54\x05\x01\x61\x75\x50\x03\x82\xdc\x82\xb5\xd1\xd9\x03\xd4\xfc\x5b\x73\xca\x18\xbd\x9e\x67\x0c\xdb\x49\x18\xc4\x60\xc7\x01\x94\x44\x62\xd5\x13\x3c\x6f\xa1\x86\x61\x6d\xcc\xd0\xba\xa2\xe8\x8a\xe0\xb7\x48\xd4\xb9\x06\x59\x79\xf7\xc1\xe3\xc4\x78\x6d\x67\x9d\x15\x8f\x5d\x6f\xd0\xd4\x31\xfd\x32\xa1\xa7\x94\x9a\xc7\xaa\x53\x6b\x2e\x9c\x2b\x02\x8b\x6d\x37\x04\x17\xfb\x4a\x6c\x6d\xe1\x2f\x84\xf2\x67\xa9\x4f\xf4\x77\xcc\x85\xb1\x56\x86\x9f\x6d\xc0\x69\x66\x64\xd9\xae\xb7\x48\xdb\x1e\xe0\x9a\x96\x65\x62\xed\x2b\x2e\x50\x5b\x61\xd9\x52\x92\xb9\xdf\xac\x0b\x2c\x24\x4e\x17\x32\x97\x12\x59\x5b\x35\x07\x58\x19\x06\x9b\xec\x7c\x54\xc0\x34\x0a\x48\x2c\xf8\x48\x32\x2f\xd3\xe5\xdd\x9a\xe5\x23\x97\x3a\x37\xbe\x0e\xce\x27\xac\x51\xe7\xb3\xb1\xd4\x88\x26\xa1\xd4\x8b\xc4\x54\x11\xd5\xe9\x15\xe5\x5a\x2f\xf1\xfb\xcb\x64\x03\xa8\x2b\x56\x5d\xc7\x4c\xd0\x6f\x3e\xd9\xb5\x99\x6d\x62\x86\x2e\xe8\x03\xc9\x43\x91\x2e\x39\x09\x04\xb4\xba\x91\x08\x35\x7c\x25\xbc\x79\xe2\xa6\x01\x24\x99\x4d\xca\x18\xda\xc6\x78\x82\xc9\xbe\xcb\x17\xf7\xd6\xed\xfa\xb7\xa0\xa4\x84\xb7\x62\x95\xae\xf5\xf2\x84\x55\x08\x79\xcb\xad\x0b\x80\xc1\xa6\xeb\xe4\x4e\xab\xe3\x0e\xb4\x91\xe6\x77\x9d\xae\xf3\x1f\xfe\xaa\x17\x66\xe6\xa3\x58\x75\x2e\xa9\x10\xb4\x23\x34\xdb\x05\x3d\x3e\x9c\x27\x95\xa3\xac\x01\x1f\xc7\xf8\x17\x78\x02\x45\x1f\xab\xce\x98\x2b\x4e\x7b\x10\x2c\x79\xf2\x31\xc0\xce\x43\xb4\x73\xfc\x18\xc7\x53\x1f\xab\x8e\xdc\x6e\x95\xac\xfc\xf7\xa2\xd5\x2e\x32\x03\x9a\x8e\x4c\x9a\xfd\x54\x57\x99\xe3\x28\x56\x9d\xdb\x62\x1b\x08\xc6\xb7\x74\xf3\x79\x52\x7c\x50\x2a\x4f\x9a\xe6\x54\x2c\x99\xed\x98\xb5\x71\xb9\xbf\x33\xad\x22\x7e\x5f\x19\x99\xcf\xcd\xba\xf8\x43\x4b\x4d\x89\x83\xca\xf1\xfc\x22\x08\x9f\x80\xbd\xfb\xbb\xbc\xd4\x66\x93\x56\x00\xbf\xe5\xea\x4e\xc7\x44\xc0\xb2\xbd\x17\x49\x5a\x02\xf4\x0a\x65\x26\xe3\x06\x32\x52\xa0\x99\x41\x56\x70\xc9\x42\xca\xcb\xad\x75\x8d\x21\x4e\x1e\x49\x6d\x46\x38\x49\xa8\x53\x49\x89\xc3\x0a\x6f\xc0\x62\xb3\x11\x91\x31\x98\x24\x13\x80\x49\x1f\x70\x17\x35\x9a\x54\xd7\xd4\x50\xd0\x71\x92\xc0\x8f\xb9\x2e\xe9\xd5\x03\x79\x5a\xdf\x6e\x48\x4c\x68\x58\x6d\x93\xc7\xe8\x73\x99\xe4\x15\x08\x78\xfe\x45\x4c\x4f\x2b\x00\xa0\x01\xdf\x71\xd3\x61\x4f\x95\x39\x63\x7f\xb1\x84\x7a\x5f\x25\x56\x54\xaf\xd8\x22\x3e\xdc\x24\x43\x86\x09\x48\x4b\x6c\x43\x92\x50\xf1\x0a\xee\x25\xbb\x12\x7f\xef\xd6\x82\x80\x74\xa7\xf2\x7a\x0a\xf5\x4a\x7f\xf2\x86\x0a\xcc\xa4\x14\x7f\xc7\x85\x09\xa0\x55\x87\x82\x92\x67\x5c\x55\x04\x30\xf2\xda\x31\x6e\x1c\x6e\xa8\xd9\xaa\x4a\x6a\xd0\x2a\xea\x61\xbd\x89\x8f\xfe\x6a\xae\xf8\xf8\x80\x56\x7d\x93\xb5\x23\xd2\x7d\x65\x01\x5f\x11\x81\x59\xcf\x66\xb1\xb9\x2f\xf2\x02\x4f\x73\x03\xa8\x79\x8e\x21\x71\x41\x50\xc4\x82\x26\xe2\x37\x10\x5a\xab\xfd\x16\x0a\x5f\x19\xd9\x96\xa8\x65\x7a\x97\x56\xf6\x12\xdf\x2e\xd3\xa2\x46\xc3\xe0\x47\xcd\x15\xe3\x36\x87\x60\xdf\xeb\x2f\xff\xaf\x7a\x97\x7d\x23\x3e\xf3\x3c\x47\xb8\xec\xc8\x4a\xe0\x15\x89\x4a\x94\x19\x6a\xd3\x24\x14\x19\x2a\xd7\x49\x65\x5c\x5d\x6a\x5e\x3c\x42\xc1\x4f\x1e\x16\xa4\x2e\x11\x44\x15\x37\x1f\x21\xc1\x80\xae\xfe\xd2\xd7\xbe\x85\x62\x8b\x89\x21\xbe\xd6\xc5\x7d\x4e\x65\x0d\x2e\xb0\x75\x60\xeb\xe0\xd9\xd1\xe8\x74\x2c\x05\xcd\x11\xd0\xcc\x7c\x4b\x5c\x2c\x31\xdf\xf9\x73\xc1\x3e\x99\xce\x06\x64\x50\x44\x5e\x5d\x5e\x0d\xf3\x2d\x96\xe3\xb1\xca\x38\x93\xcd\x61\xf3\x46\x43\xd1\x53\x75\x6f\xfb\xe3\xf2\x98\xef\x8e\x97\x5d\xe8\xd1\xbb\x63\xdd\x65\x99\xd4\x89\x28\x70\x8f\x67\x9e\xeb\xc5\x75\xca\xb7\xa0\xde\xd2\x60\xa6\x92\x2c\x0a\xd0\xff\x82\x13\xc2\x65\x40\x7d\x0a\xc2\xa7\xa0\x64\x39\xbd\x38\x4a\xb8\x22\xc4\x2f\xd9\x48\x70\x01\xe3\x0a\x15\xbf\xa1\xb5\x88\x35\x49\xfe\x63\xb0\x02\xfd\x9f\x85\xcd\x9d\x07\x52\xcc\x7b\x0a\xfd\x6c\xc7\x9d\x04\xa3\x67\xaa\xa6\x90\xbe\x13\xe4\xbc\xc9\x53\x68\x7d\xa2\x29\x0d\x36\xa4\x12\x2e\x34\x7f\xa3\x96\x0b\x1c\xf2\x79\xd4\x50\xb0\x05\x03\x23\xf0\x16\xa5\x78\x7f\xbb\x01\x08\x2b\x6d\x30\x2c\x4d\xc5\xf4\x04\xe3\xa2\x91\x10\xe7\x0d\x9a\xde\x59\x85\x1f\x75\xf7\xf2\x7e\x0b\x85\x46\xc5\x97\x3e\xbd\x7a\x8a\x1f\xc1\xae\x6a\x98\x0c\xe1\x48\xc9\x8e\xfa\x0a\x68\x6f\xf8\xf9\x89\xd9\xa7\x38\x0b\x1d\x07\x09\x8a\x3a\x31\x09\x5f\x2b\x7b\xb3\xf6\xa9\x36\x61\x0f\x7e\xa7\x65\xe8\x64\x34\xf7\xc9\x40\xbb\xea\x88\x22\x13\x42\x80\xa2\xc6\xf0\xab\xab\x2d\xa4\x1a\x4c\x7b\x23\x34\xab\x30\xdb\x67\xaa\xc7\x45\x19\xf2\x5c\x14\x10\xc7\x43\x97\x6d\xc3\xe9\x62\xa8\x6d\x6a\x9a\xbc\x40\x2d\x37\xb3\x4a\x00\xb9\xeb\xac\x51\x7c\x11\x64\x3f\xc7\xf4\x7a\xfd\x18\x39\xe0\x4b\x0c\x57\x30\x5b\x7c\xbd\x37\xbb\x06\x0e\x36\xe5\x82\x1d\xed\xb1\x3b\x59\x79\x29\xd5\x09\xaa\xa9\xf6\x1a\x4b\x6b\x89\x23\x52\x08\xdc\xd4\xde\x27\xdf\xd9\x0e\x2c\x53\xa0\xce\x73\xa4\x4f\xf3\x9d\x5a\x64\x50\xc8\xfb\xee\x78\xd1\x8d\xf8\x6f\xda\x54\xf6\x3a\xaa\x77\xbc\x76\x33\xfe\x2e\x1d\xaf\xbb\x84\xbf\xaa\xe3\x72\x73\xb8\xdd\x2d\x6a\xd4\x6a\x3b\x1c\x31\x17\xad\x37\x07\xe9\x64\xe3\xea\x75\xb4\xef\xae\x40\xcc\xb9\x09\x2b\xc4\x29\x22\xf9\x29\x34\xf9\x98\x94\x4b\x21\x9e\xa2\x92\xe5\x43\x92\x57\xa4\xd6\xb9\x81\x97\xd4\x6a\x5d\xe4\xba\x4a\xe0\xb0\x5d\x6f\x38\x46\x81\xeb\x5d\x7f\x27\xe0\x84\xdc\x4b\x2b\x4f\xaa\xc2\xd6\xb1\x76\x45\x9a\xc2\xc0\x61\xf3\x66\x95\x66\xfa\xc4\xdc\x27\x25\x15\x74\xf9\x42\x2c\xc4\xdf\x34\xa3\x10\xb8\xba\x7f\x97\xf7\x0a\x28\x3f\x81\x8a\x1d\x55\x71\xa9\x7a\x91\x10\xc5\xad\x5f\xdd\x87\xe7\x91\x83\xd4\x18\x11\x11\x2e\x60\x00\xcd\xef\x74\x5f\x63\x48\xa9\x6e\x38\xda\xdf\x37\x9d\x86\xbd\x37\x43\x5d\x2e\xdd\x73\xc0\xb9\xb8\x1b\x8d\x5f\x24\xc9\x81\x68\x6f\x91\x20\x22\xb0\x3c\xd9\x45\xc0\xe4\x56\xdb\x2a\xcd\xa0\xfc\xf8\x27\x75\x9c\x76\xe1\xa3\x0c\x03\xa9\x85\x38\xa0\x44\x72\x63\xf4\x76\x59\xe4\x3b\xcc\x8b\x7a\x6f\xac\x6b\xff\x09\xc4\xde\x29\xe9\x2a\xbc\xb6\xdf\x48\xd3\x2e\xb3\x1a\xd5\x5b\xa3\x8f\xb8\xd3\xc0\x09\xef\xa9\x24\xf7\x12\xac\x68\x61\x50\xc9\xe8\xb1\x8e\xef\x62\xa8\x7e\x2e\x72\x43\x8a\x15\x10\x45\x8b\x18\x26\x02\xaa\x02\x10\xc9\x88\xd4\x5f\x8a\x6d\x99\x27\x59\x97\x54\x33\xbd\xe8\x66\x9a\xbb\xa7\xbe\x32\x8d\x61\x8d\x24\x4b\x38\x52\x37\x17\x50\x11\xe8\x98\x10\x1a\xd4\x8a\x7e\xc8\x50\x75\xb9\xd6\x6f\xa4\x40\xad\xd2\x2a\xab\x5d\x7c\x7e\xc4\x3e\xd6\x8e\x40\xf7\x94\x5d\x78\x1a\x3e\x61\xb0\x89\x34\xb7\x3d\x8a\xdc\xd8\x0a\x50\x3a\x6c\xdf\xc4\x98\x62\x91\xc2\x65\xe8\xb6\xca\x57\x59\x75\x0a\xef\x71\x33\x19\xca\xcb\xd0\x99\x22\xba\x31\x66\x58\x0b\xca\x34\x70\x32\x33\x2e\x97\xe8\x47\xae\x95\x85\x26\x12\x43\x90\xf4\xc6\xad\x91\xf0\x81\x4e\x64\x02\x3b\xc9\xfe\x5d\x0f\x33\xb6\x5c\x09\xb0\x4c\x22\xd5\xb9\x28\x75\xbe\xb8\x97\x81\xe6\xe0\xdb\xf3\x5d\x7d\x4d\x46\x1d\xfb\x22\x9d\xe9\xa2\xd4\x3a\x07\x2f\xd2\x95\x47\x3b\x82\xb9\x3d\x5f\xed\x74\xa9\x26\x85\xba\x4e\xbe\x9f\xd3\xf7\x20\xb3\x23\xdf\x05\x0b\x08\xae\x8d\x8f\x42\x68\xc4\xc9\x63\xe3\x55\xf2\xc4\x50\xb5\x1c\x20\x11\xd4\x5a\xaa\x75\x9a\xa7\xeb\xed\x1a\xe7\x91\xba\x84\x5c\xb5\x9b\x8d\x4e\x4a\x0a\xfe\xfa\x38\x37\xe0\x17\x51\x3d\x4f\x84\x18\xf9\x5e\x85\xef\x18\x9e\x3d\x67\xac\x39\x6c\x5b\x62\x84\x68\x7d\x42\xab\xe7\xe9\x86\x45\xf8\xf3\x37\x08\x54\xb3\xfb\xa5\x94\x4a\x63\x75\x8d\x67\x30\x34\x35\x81\x98\x93\x5d\xfd\x37\xe0\x33\x7d\xca\x92\xfc\x9b\xe6\xed\x61\x8d\x65\xb7\x51\xc8\x35\x35\x6d\x31\x37\x51\x88\xea\x99\xa4\x7c\x10\x35\xdb\xa1\x72\x4d\x82\x99\x2c\xf7\x74\x76\x61\x8b\x45\xaa\xab\x1d\x9d\x61\xbd\x69\xbf\x77\x1d\xa9\x4f\x57\xc3\x48\x4d\x07\xd3\x5e\xbf\xcb\xa1\xb1\x54\x9c\xeb\x54\xd0\x21\x5b\x73\x37\x8e\xbb\xc2\xe5\x5f\xb1\xf1\x47\x3d\x5f\x24\xa6\xea\xd6\x0f\x1b\x2c\x16\x11\x1f\xff\x1b\x98\x2a\x62\x52\xd2\x58\x5d\x69\x7b\x1d\xc3\xcc\x4d\x28\x2a\x9a\x2f\xd5\xb4\x4a\xaa\x2d\x54\xf5\xbb\x99\xfa\xed\xa7\x04\x56\x8c\x8b\xc5\xde\xe9\x7c\x01\x7f\x14\x72\xaf\xf6\x97\x15\x0d\xe1\x97\xa4\x2c\x77\xea\xa2\xf8\xae\x7a\xf0\xd1\xc6\xf4\x00\x51\x9b\x70\x7c\x85\x1d\x1c\x3a\x05\xc7\x1d\xa8\xe8\x73\x45\x58\x5d\x42\x50\x79\x43\xa3\xe6\x24\x00\xee\x2c\x33\x76\x38\xd8\x6d\xe4\xbc\xc1\x7c\xa7\x4e\x7f\x50\x37\xd3\xbe\xb3\x43\x4f\x4f\xdf\xf3\x2c\xdf\x4c\x95\x47\x75\xf6\x16\x15\x5c\xd7\x30\x66\x5e\x33\xd5\x45\x73\xfe\xb2\x2d\x53\xb3\xa4\xc0\x45\x17\xae\x0d\x40\x15\x07\xe2\xd4\x7c\x9f\x05\x2f\xf0\x37\x5c\x34\x3a\x56\x5f\x71\x29\xdb\x0b\xe0\xa9\x05\xf3\xd2\x23\xa4\x91\xd4\xfa\x1d\x0f\x81\x93\xd6\x43\x60\x6a\x7b\x30\x20\x0b\xf5\xd0\x01\xf0\xb2\xad\xfe\xd7\xae\xa8\x77\xbf\xe9\x8a\x3a\xf0\x0a\x7f\xa3\x95\xf4\x3e\x56\x93\x40\xf8\xc4\x44\x5c\xd1\x95\x92\xb0\x98\x2f\xf7\xb2\x5f\xa0\x82\x1c\x5f\x8b\x75\x75\x33\xbb\xe9\x5d\x5e\xde\x8a\x2a\x1c\x82\x60\x70\x35\x88\x2f\xca\x89\x3c\xf6\x62\x7c\x71\x31\x98\x4c\x3d\xcc\x03\xd0\x3b\x00\x9d\x70\x40\x9d\xc9\xe0\x7a\x32\x98\x0e\x46\x33\x84\x05\xa9\xf1\xa4\x56\x39\xc5\x95\x59\xaa\x3f\x1e\xf5\x07\x93\x11\x03\x79\x6c\x83\x11\x97\x69\x45\xbe\x44\x6b\x3a\xeb\xcd\x6e\x66\xe3\xc9\xad\xab\x25\xb1\x6f\x10\x94\x6e\x31\x34\x19\xea\x64\xe0\xb9\x51\xed\xa1\xb3\xe1\xec\x72\x10\x39\x20\x32\x95\x9a\x44\x4f\xc2\x90\x23\x35\x1a\x8f\x86\xa3\x8b\xc9\x70\xf4\x79\x70\x35\x18\xcd\x22\x45\x75\x71\xbd\x4f\xd3\x01\xa1\x48\x2e\x7b\x50\x12\xe7\x10\x39\x58\x7e\x35\x8d\x14\x96\xe1\xf4\x6f\xdd\x97\x70\x68\xf0\x5b\xa2\x81\xc1\x64\x32\x9e\x4c\x23\xf5\xf5\xcb\x00\x1a\x18\x4f\x00\x75\x75\x3e\x9c\xf6\xc7\x3f\x0f\x26\xbd\x4f\x97\x83\x58\x4d\xc7\x57\x03\xf5\x2f\x37\x93\xe1\xf4\x7c\xd8\xc7\xb1\x3d\x1f\x23\xe6\xeb\xf2\x72\xfc\x95\x8a\xf3\xfa\x97\x37\x53\xc2\xbb\x34\x0b\xd7\x22\x35\x1d\x23\xe6\xc5\x7f\xf0\xaa\x77\x8b\x8d\x5c\x5f\x5f\xde\x52\x2d\x14\x2c\xb2\x5a\xbd\x57\x2e\xea\xbd\xb8\xc0\x2f\x2c\x09\xdc\x5f\xee\x15\x05\xd5\x61\x50\xe3\xe5\x96\x54\xa3\x0e\x0b\x80\x61\xb7\x04\x54\x9b\x7d\x19\xd8\x99\xbf\xa0\xe2\xaf\x96\xfa\xab\x28\xac\xbe\x8a\xd4\xf5\xcd\x68\x08\xb0\xab\xf1\x44\x0d\xfe\x3c\xb8\xba\xbe\xec\x4d\x6e\xf7\x17\x65\x85\xc8\x27\x57\xa4\x75\x21\xd7\x24\xd5\x35\xb9\x3e\xff\xda\x2a\xa6\x1f\x02\x2d\x08\x1f\x5c\x9f\x35\x62\xa1\x07\x62\xb2\x68\xf5\x7a\xf6\xf7\x90\xf0\x0a\xe2\x53\xf6\x2a\x9f\x97\x50\xbe\x31\xdf\xc1\x45\x4e\xe7\xdf\xbe\x70\x9d\x3b\xed\x8d\x4b\x9c\xb7\x13\xc8\x3f\xc7\xe1\x47\x73\xe1\xb6\x95\x54\x5e\xf8\x03\x0e\x13\xc2\x05\xdb\xa9\x24\x3f\xf6\x0c\xf3\x2e\x82\x42\xec\x19\xed\x5d\x25\xaa\x80\x34\xc7\x32\x13\x41\x61\x4d\xee\xa0\xd7\xe3\xb1\x57\xab\xaf\x1c\x8b\xd4\x59\xa4\xde\x47\xea\x43\xa4\x7e\xc0\x0c\xc3\x1f\xb1\x6b\xac\xbe\xc2\x51\x78\x41\xd1\xbf\x07\x6b\x54\x4b\x33\x63\x3c\xad\x2d\xd9\x8c\x5e\x6f\x3d\x8d\xc3\x01\xa2\x5f\x99\x33\x96\x39\xe1\x6e\xdc\xa0\xac\x70\x3d\xda\x67\x16\x38\x63\xa0\xd4\x19\x68\x6c\xd4\xa0\x23\x1e\xfb\xee\x62\xff\xb8\x9a\xc0\x87\x36\x55\xb1\x09\x19\xbc\x7c\x18\x07\x41\x03\x55\xba\xd6\x2d\x8e\xa1\x67\x23\x86\xf9\x85\xd2\x07\x0c\x78\xd1\xf2\x80\x2e\x42\x25\x51\x5a\xdd\x2f\x4b\x28\x99\x93\xca\x0d\x01\xba\x29\x93\x6c\x1f\xac\x09\xca\x24\x6a\x92\xf8\x7f\xae\xa3\x36\x3d\x92\xb6\xfd\xd1\x8d\x5a\xa8\x72\x02\x0e\x0c\x5e\x75\x44\xba\x99\x2f\xb9\x3a\x90\x62\x0f\x52\x2f\xc1\x25\xeb\x61\x32\x58\x22\xe6\x2a\x35\x0b\x9d\x65\x48\x6b\xe4\x0f\x06\xcf\x30\x1f\xa6\x9e\x5e\x12\xa6\x6b\xfa\xd3\x01\xd8\x84\x71\x42\x75\x31\xdf\x44\x42\x10\x44\x9e\x0e\x91\x52\xc9\x7a\x0f\x8c\x22\x31\xad\x6b\x9b\xe2\xcd\x2d\x5c\x73\x7e\xfb\xfc\xca\x97\x6d\x09\xb7\xbc\xfc\xe5\xc2\x60\xc8\xef\xf6\x96\x18\x97\x05\x4f\x6b\x1f\x6f\x0c\x42\x71\x50\x7c\x13\x14\x4e\x89\xcb\x15\x36\x7b\x9b\x1a\x67\xa4\xd2\x4a\xc4\xb6\x51\x90\x16\xba\x07\x8d\x90\x14\xb3\x6b\x05\xeb\x3b\x39\x2b\x00\xa7\xe6\xd2\x73\x4d\x1c\x48\xbc\x72\xa5\x17\x73\x54\x11\x21\x25\x25\x90\x39\xa0\xc9\x99\x3d\xc7\x2f\x46\x00\x49\xff\xbe\x42\xf4\x1e\x01\x86\x2e\x9e\x4b\x11\x1e\x0a\x18\x06\x89\x7c\x0f\x00\xf0\x0d\xe1\x18\xc1\x6e\xf3\x43\x24\x22\x30\x23\x24\xe0\x22\x5a\xcc\x3d\xa3\xed\x7a\xb3\xb4\xdd\x5d\x62\x8d\x2d\xcb\x9a\xf0\x25\x0a\x8c\x60\x3c\xc3\x32\x9e\xc8\x15\xb9\x25\x7f\xc4\xb7\x97\xe6\x20\x28\x85\x6c\x41\x4b\xa8\xd0\xf1\xe9\x76\x47\x98\x38\xd7\xc4\xb9\xc4\x6a\xe3\xad\xad\x0a\xf7\x31\x30\x15\x24\xe8\xb2\xf2\xba\xa8\x9e\xdb\x6d\xae\xab\x47\xed\x48\x33\x85\x82\x43\x0b\x60\xcd\x73\x0d\xd9\x8b\x48\x96\x50\xe5\x05\x2e\x3c\xbe\x4b\x8c\xa0\x8f\x43\x31\x99\xd0\x19\xd9\xff\x08\x4f\x77\x92\xba\xe7\xf8\x90\xae\xcc\xcf\xcc\xc1\x97\x45\x29\xc0\x40\x85\x94\x67\xd2\x78\xae\x3d\x8a\x00\x52\x34\x32\x14\x51\x66\x5b\xa4\x36\x72\x9c\x2a\x9b\x0b\x81\x78\x5e\xe0\xb0\x16\xb7\x70\x01\xb3\x24\x98\x60\xcb\x5b\x85\xc7\x27\x41\x12\xe2\xa3\x46\x2d\x07\xd3\x1d\x4b\x89\x88\xfa\x9e\xb2\xcb\x1a\x32\x42\xae\x5a\xf2\xf1\x3e\xa9\x4c\x01\x17\xe3\x9e\x04\x10\x66\xdb\x1b\x8f\x93\x10\xdb\x2c\xe5\x3c\x09\xd8\x7e\x5e\xd6\x6f\xc7\x3c\x23\x58\xc3\x5e\xdd\x6b\xeb\x42\x73\xf4\x67\x99\xac\x93\x3b\xd2\xa2\xc0\x3e\x48\x3c\x0b\x0f\x8f\xa8\x9d\xb7\x5f\xba\xc3\xc2\xc9\x88\x75\x9a\xe1\x2b\x10\xe6\x46\x14\xa6\x63\xd3\x03\xe2\x71\x7e\x04\x43\x07\xc3\x77\xe4\x31\xca\xd8\x30\x6d\x33\x62\x56\x45\xa9\xef\x0a\xf8\xd7\x63\x01\xec\xca\xb0\x37\xf3\x85\x36\xe0\xa3\x37\x46\xe6\x3e\x50\x4e\x63\x3a\x5f\xd0\x3c\x84\xec\x36\x1d\xe6\x01\xde\x0f\xd6\xbb\x38\x59\xb1\xf2\xd9\xa3\x83\x00\x12\x2e\xa8\x5c\x80\x0e\x03\xbf\x1f\x1f\x0d\x10\x23\xcd\xc6\x1b\x43\x6d\x04\xc4\x57\xc8\xde\x85\xb2\xd8\x4e\x18\x90\xa3\x3a\x35\x02\x30\x48\x74\xf7\xaf\x2f\x23\xa7\x41\x8f\xd3\x0a\xb3\xcf\xec\xd4\x5e\xd9\xb3\x53\x1f\x8c\x0e\xaf\x06\x80\x31\xdb\x03\xcd\x7d\xb6\x28\x55\x56\xdc\x15\xb6\x7b\x2d\x8b\xcb\x6f\x0d\xe4\xdd\xe4\x9d\xc1\xe7\x5e\xcb\xb7\x50\x88\xce\x0b\x09\x6c\xd9\x6e\xc2\xd3\xb1\x6e\xa2\xd7\xbf\xfe\xca\x3e\x2d\x3f\x59\x00\x07\x66\x25\x3a\xba\x35\xc9\x9d\x56\x77\xdb\x74\xa9\xb3\x34\x87\xe2\x04\x87\x4c\xf3\xb5\xd5\xa8\xdd\xae\x1e\xf5\xdc\xa4\x95\x0e\x33\xc1\x80\x64\xf0\xa4\x9c\xe0\x33\x51\x2e\xbd\x85\x99\xab\xb9\xb5\xe9\x61\x54\xb5\x6b\xaf\x8b\x4a\xdd\x57\xd5\xe6\xa7\xd7\xaf\x17\xf4\xd9\x05\x8d\x41\x51\xde\xbd\xde\x5b\xf3\x18\xbf\xbe\x28\xb5\x1e\xda\x2d\xf1\xfb\x14\xff\x3d\x59\xff\xf7\xee\xec\xdd\xfb\x77\xf5\xfa\xbf\xf7\x1f\xfe\x5e\xff\xf7\x37\xf9\x71\xb3\x5f\x2f\x3b\x3f\x61\xae\x3a\x75\x1a\xbf\x69\x96\x22\xb1\x3d\x70\x1a\x9f\x42\x35\x92\x10\x4e\xc1\x54\x38\x58\x2d\xb2\x1a\x00\xa3\xa3\xc6\x09\x8a\x80\x61\xed\x0c\x63\x5c\xb4\x68\x1d\x5d\x49\x80\xa5\x7f\xd0\x59\xf8\x20\xee\x5f\x88\xef\x5f\xcf\x03\x27\x59\x64\xc8\xfb\xc5\x52\x33\x65\x6f\xf0\x04\x14\x7f\xb7\xf7\xbc\xea\x4b\x5d\x13\x8e\x82\x84\x1f\x86\x8d\x3b\xdf\x79\x09\x79\xa2\xc2\x17\x5f\xf5\x5d\x7e\x0b\x5d\x46\xee\x41\xfb\x7c\xd9\xd7\xa0\x63\xaa\xd1\xa9\xa2\x7c\xd6\x1b\x41\x2f\x83\x6f\x42\x15\x17\xda\x8c\x89\xd1\xe2\xf6\x24\x09\x1c\x83\x38\x90\x62\xe5\xbb\xf9\x2e\x56\x9d\x81\x2f\xf8\x3f\x97\xf9\x0a\xca\x2e\x99\xb5\x2f\x5b\x5a\xf3\xaf\xf8\xe6\x25\x0d\x83\x8d\x00\x5d\x3b\x72\x00\xa2\x4f\x21\xad\x5c\xb0\x8b\x88\x69\x16\xcc\x45\xff\x54\xd6\xe5\x82\x0c\x43\x52\x25\xbe\x7b\xef\x6d\xf7\xbe\xeb\xc5\x16\xca\x36\xb8\x1f\x72\x5c\xd9\xf0\x42\x51\x55\x2f\x2a\x47\xe4\x9d\xf6\x23\xbe\xb9\x0f\xb1\xea\x0c\x41\xd3\x28\x53\xe7\xd8\x3b\xfd\x74\xa9\x89\xb8\xb4\xe9\xb6\x6e\xb4\xc1\xef\x2e\x9e\xca\xa9\x7c\x09\xa1\x1a\x7c\x07\xa2\x75\xd5\xf3\x5d\xfa\x21\x56\x9d\x4b\x6b\x83\x97\x6d\x15\x62\x58\x27\x45\xbc\x94\xb5\x17\xb7\x9e\x45\x6d\x5e\x99\xa5\x1b\x9f\x7e\x48\x21\xb8\xe9\x1d\x9e\xc6\x7f\x74\x65\x3e\x62\xb5\x02\x80\x0f\x25\x84\xfd\x27\x7f\x8c\x55\x27\x58\x79\xbe\x0c\xc6\xdb\xcb\xa4\x2d\xb0\xd4\x99\xae\x82\x52\x13\x92\x56\xc3\xec\xab\xa9\xca\x2d\x96\x9b\x15\x2b\x66\x1c\x69\xdd\x23\xe8\xb7\x52\xad\x49\x78\x4e\xa8\xaf\xf7\x3a\xaf\xad\x0a\xc3\x91\xa4\x25\x96\xc7\x19\x5d\x12\x75\x39\xeb\x08\xd3\xdb\xc8\xa6\x54\x6a\x44\xda\xbb\x47\x62\xb6\x4f\xbd\x8f\x54\x9a\x49\x90\xb2\x46\x68\xc8\x37\x5e\x64\xcf\x4b\xf8\xe7\x7e\xc2\xe7\xe6\xfa\x91\x28\x74\x04\xb1\xb9\x09\x44\xb2\x5b\x07\xea\x70\xfb\xa7\xf1\xe9\x1b\x59\x6e\x25\xcf\x26\xb9\x7a\x01\xe0\x45\x8c\x1d\x9e\xee\xa3\x70\x7c\x8b\xa0\x61\x64\x16\x65\x3a\xf7\x3b\xff\xb9\xab\xdf\xce\x48\xed\x70\x06\x1f\xdf\x36\x0c\x80\x0b\xc4\xf7\xac\x9d\x56\x01\x07\x05\x5b\x0a\x91\xd8\xd1\x21\x05\xaa\x60\x11\xec\x93\x06\x17\x63\x61\xaf\x30\xd1\x6d\x79\x16\x6c\x00\xa2\x43\xaa\x9e\x6b\xe5\x64\xe9\xc4\x03\x80\xfb\x05\xd4\xa8\x6a\xa5\x01\xc4\x08\x2a\xaa\x33\xb2\xcc\x7e\x64\x9b\x69\xd0\x9f\xe3\xd9\x64\x21\x3c\xbb\xcc\x3c\x86\xc8\x73\x92\x78\x99\x28\x5e\xb6\x76\xc8\x37\x15\xdd\x5c\x44\xde\x52\x16\x99\xa4\xc2\x27\x60\x89\xa9\x92\xcc\xc3\x74\x92\x5c\xf9\x83\x94\x64\xb0\xb3\xd4\x54\x48\x96\x0c\x03\x00\xb3\xeb\x02\xad\x29\xc1\x41\xac\xb3\x04\x51\x27\x12\xf1\x39\xbc\x47\xf1\x04\x7e\xd4\x19\x2a\xad\xe4\x91\xb0\x74\xc3\xd3\x8b\x87\x53\x6a\x44\x2d\xee\x8b\x74\x81\xde\x7f\xb0\x98\x88\xa3\x93\x54\x53\xd6\xe0\x4d\x91\x92\x1e\xf0\xaf\x24\x19\xd5\x23\x4b\xc0\x23\x52\x99\x6d\x4a\x10\xb0\x5b\x6a\xfe\x1e\xd5\x60\x2e\xf5\x09\x7e\x57\xea\x3d\xd8\xd5\xf4\x68\x2d\xfb\x5d\x4d\x28\xc8\xb1\x53\x8b\xa5\x73\xf6\x44\x05\x60\xc2\x5c\x6d\x07\x2b\x01\x23\x8a\xee\xad\x37\xa8\x72\x84\x20\xf0\x2c\xab\xc7\xc4\xa2\x06\xac\x3e\xa9\x71\x9e\xb6\xc4\xf2\xcc\xd6\xf9\x6e\x9c\x8f\xfe\x60\xad\xb6\x0b\xeb\x6e\xf9\xce\xa5\x76\x61\xe1\xbb\x38\x05\x32\x50\xb7\xe2\x52\xcb\x94\x65\xc2\x8a\xcc\x1a\x19\x26\xd4\x85\xe3\x08\x37\xd7\xca\x59\xdf\xc3\xad\x4b\x78\x1f\x08\x81\xbc\x40\x07\x0d\x47\xf4\x38\x41\xfc\xe4\xa6\x78\xb4\xe3\x84\x19\x6c\x94\xab\xc1\xff\x06\xa0\xb3\xd7\x45\xc2\x5f\xd2\xfc\xae\x93\x3c\xb9\x73\x51\x13\x8c\xee\x13\x90\x31\x50\x25\xc8\x2b\xe0\x2e\x92\x1e\x9a\x13\xa6\x80\x12\x40\x2a\x0e\x55\xab\x74\x55\x81\x43\xb9\x00\x58\xcb\xfb\x37\x7f\xe8\xd6\x15\x4f\x8a\x6d\xe5\x82\x05\xe6\x3e\x29\xd1\xe4\x45\x6d\x25\xc8\xb4\x07\x0d\x8a\x3e\x71\xc5\xa4\x5c\xf3\xb5\xb3\xea\xcc\xce\xdb\xac\xd5\xf6\xc0\x3a\x43\x51\x35\xd5\xfc\xc8\xde\x2a\xc2\x93\x27\xcb\x08\xbd\x1c\x52\x28\xec\xea\x64\x49\xec\x69\x05\x31\xfe\x2d\x46\xc8\x36\xda\xfe\x16\xd5\xdd\xc4\x6d\x0a\xb3\x49\x62\x3c\xae\xdc\x8e\xc5\x78\x22\x81\x0a\x66\x30\xb0\xa8\xf3\x08\x21\x3e\x2d\x67\xcf\x71\x8b\x31\xd4\xc5\xb5\x57\x94\x2e\x80\x50\x33\x96\x81\x81\xd0\xdd\xa5\x89\x12\x66\x18\x40\x2b\x45\xdf\xe7\x5d\x5a\xdd\x2c\xc1\x94\x17\x8f\x61\x4d\xd9\x1e\xc9\xc4\xc6\x54\x08\xbd\x3b\x08\xeb\x58\xa7\x02\xa4\xef\x30\x50\x6b\x0f\xce\xe3\xce\x0d\x80\x88\x75\xa7\xfb\xdc\x57\xc5\x72\x0b\xd2\x75\x0e\xa1\xaf\x61\x86\x8b\x25\xe1\x8c\x84\xc4\x86\x55\x6b\x88\xa5\xbc\x45\xe6\x62\xea\xc9\xb3\x87\x9c\x15\xb9\x49\xa3\x06\xd9\x10\xcb\xa0\x2f\x14\xbf\x08\x1e\xca\x8f\xe1\xf0\x7e\xc3\x21\x12\xce\x90\xf1\x5b\xe2\x2c\x96\x17\x48\xb8\x11\x20\xa1\x23\xff\xfa\x3f\x6f\x0f\x84\xa3\x24\x30\x48\x30\xd5\xf2\xdd\xdb\x27\x8b\x69\xc7\xad\xc5\x20\xb9\x3d\xe6\x89\x49\x4d\x44\xdb\xa7\x39\x1f\x10\xf2\xaa\xbb\x22\xbf\xfb\x4e\x0a\x1c\xf4\xda\xca\x6c\x89\x0d\xfc\x17\xee\x93\x17\xf4\xe6\x6f\xb6\x5d\xde\xc6\xa1\x6f\x3f\xf6\xe1\x63\xde\x30\x6f\xed\x0d\xd3\xf3\xfc\x78\x3e\xac\xac\xe5\xe5\x12\x3e\x0b\x6d\x03\x81\xd6\x2c\x88\x77\xd3\xfd\xda\x05\x7c\x20\x9b\xf3\x2c\x97\xf4\x89\xc0\x3f\x9b\x32\xb0\xff\xeb\xa6\xa2\x30\x86\x82\x25\x4a\xc3\x28\xb9\x27\x9f\x53\xf6\xf9\x2c\x43\xcb\x79\x9a\x0d\x53\xeb\xa9\xaa\xd1\x27\x8a\x41\x57\x0d\xb7\x2a\x4c\x4e\xbf\xa0\x82\xd3\xfe\xa3\x6d\x9c\x7c\x41\xa7\x91\x15\x9d\xa6\x8e\xf4\xd8\xf7\xee\x2d\xf5\x9d\x64\xde\xfa\x3a\x4e\x4f\x47\xcf\xdd\x75\x03\x91\xcb\xf4\x1a\x07\x1a\xbc\xca\x33\x74\xc2\x7f\x80\x5a\x0e\x1c\x4f\x57\x42\x16\xbf\xf7\x2b\xf9\x2c\x56\x3d\x34\xe0\x5d\xc6\xb9\x25\x20\x64\xbd\xec\xc0\xfd\x7f\xc9\x6a\x86\x09\x9d\x37\xc2\xf9\x69\x10\x7a\x42\xd7\xf1\xa9\x35\xe6\xcf\x61\x97\xf8\xa7\xf2\x70\x13\xfa\x6d\x52\x10\x02\x40\xb1\xb9\x8f\xbe\x3d\x19\xc5\xa3\x43\x86\x04\x4f\x9d\x98\x13\xf6\xbf\xf5\x29\xee\xad\xa8\xd2\x64\x55\x7f\x59\xdb\x87\x27\x9f\x1b\xe1\x50\x11\x46\xaa\x26\xc0\xea\xe8\x7c\x1f\x75\xf6\xa0\xd5\xf1\xe9\x59\x57\xad\x8b\xbc\xba\x37\x0a\x6f\x03\x30\xec\x13\x24\xc2\x45\x39\xf2\x2c\xb3\x3b\x79\x01\xcc\xbc\x81\xd6\xa9\x6b\xcc\xa4\xdf\xd5\xf1\x87\x5a\x43\x09\xc4\x9d\x30\x19\x18\xae\xe6\x30\x9a\x1b\x2c\x08\x06\xf1\xd4\x5f\xbc\x2a\xf0\x9a\x90\x1a\xa4\x5c\x01\x86\x0a\x42\xc8\xfd\x0c\x1a\xec\xb9\xd9\x96\x4e\xf9\xbc\xbe\xa1\xb9\x27\x38\x3c\x46\x3c\x03\x48\x6d\xa9\xd8\xeb\xe9\xc9\x4d\x8d\xb2\x0d\x54\x49\x9a\x73\x48\x5b\x18\x28\x7e\x67\xd8\x8b\x40\x63\x10\xe1\x50\xcc\xdd\x1d\x59\xe8\x5e\x59\x87\x34\x38\x4e\xdd\xae\xd8\x85\xbb\x82\xe9\x64\xc1\x55\x87\xe8\x15\x6f\x6a\x27\xd7\x09\xf0\x6c\x43\x47\x01\x36\x45\xbb\x0d\x06\x28\x78\x0c\x07\xe2\x61\x05\x50\xc1\x22\x36\x10\xb7\x9d\xaa\xbe\x6a\xc6\x8b\x76\xb8\x51\xaf\x05\xfa\xd4\x52\x97\x29\xb0\x26\xa0\xdf\x88\x50\x73\x76\x2d\x33\x50\x03\x2e\xd6\x35\xa3\xd7\xc5\x17\xe8\xfa\x6a\x7a\x5a\x18\x7b\xe1\xdb\x4b\xd6\xb2\xed\x0d\x1c\xb3\x9f\x2b\x96\x05\xde\x1b\xd6\x58\xa2\xf0\x36\x33\x57\xe7\xfb\x0f\x04\x4e\xaa\xf2\x80\xbb\x42\x4e\x7f\x7c\xf1\xc1\x29\x50\x47\xe0\xf9\x4a\xb7\xb4\x1e\xe4\xf2\x4b\xe7\x1d\xb2\xe0\x3b\x3b\xf7\x9a\xed\xdc\xab\xa4\xb2\xf7\x47\x68\xe7\xce\x60\xf5\x5d\x83\x79\xdc\x07\x43\x58\x84\x38\xa9\xd2\x19\x3c\xa0\x50\x91\xd7\x41\x16\x48\x9f\x9d\x08\x86\x9b\xc6\xb5\x83\x1d\x8a\xbd\xbb\xda\xe6\xcc\x69\x56\x91\xc0\x2b\x79\x2a\x69\x65\xa8\x34\x13\x87\xa5\x19\x49\xec\x46\x5e\x76\xd9\xaf\xa8\x4a\x7f\xaf\x70\x1d\x3b\x08\x44\x18\x2d\x13\x9b\x11\x2a\x12\x97\xaa\x03\xe0\xe1\x0e\x0d\x3b\x0f\x39\x65\xa9\xec\x4b\xb9\x55\x4d\x1a\xdb\x18\x40\xf4\x7f\x4e\x73\x65\xb6\xab\x55\xba\x00\xb4\x18\x6b\x28\xe1\xd8\x78\x14\x19\x24\xb3\xed\xd8\xe1\x51\xee\x79\x9c\x5d\xf5\x6d\x31\x87\x7d\x08\x07\x95\x1f\x64\x3c\x0d\x6f\x59\xcb\x14\x8a\x0a\x82\xad\xe1\x4f\xa0\x64\xef\x55\x7b\x86\x57\x39\xc2\x13\xec\xae\xdb\xd8\xfd\x23\xe4\xef\x10\x40\x0d\x03\x47\x2c\x2d\xc4\x31\xe3\x1e\x2c\x0e\x53\x6f\xfb\x83\x0f\x0c\x8d\x56\xf6\x33\xe8\x7c\x98\x4a\x6f\x8c\x17\x47\xb7\x5b\x01\x6b\x18\x65\x80\x6f\x9d\xa4\x99\xfd\x5d\x96\x1a\x84\x05\xe5\xfa\xd1\xdc\x95\xc5\x76\x63\xba\xd2\x86\x5f\x24\x99\x5d\x2b\x04\xa7\xc2\xd2\x4a\x02\xe8\x3e\xde\x17\x1e\x6b\xdc\x88\xf5\xa2\x32\x93\x7e\x14\x43\xe9\x6e\x07\x1c\x69\xbd\x8c\x43\x47\x47\x3a\x02\xbd\xeb\x61\x73\x03\x94\x8d\x43\xc9\xde\xe8\xc2\x04\x67\xf2\x65\x44\xab\x70\x54\x98\x6d\x4a\x22\xb6\xe1\x50\x1b\x7b\x54\xb8\xf0\xf0\x2a\x6a\xf7\x5d\x5c\x19\x25\xbe\x55\xef\x7a\x28\x16\x3f\x30\x43\x7b\x22\x1c\x40\x04\xfa\x02\x54\x0a\xf5\xfb\xf9\xf5\xe7\x03\x14\x86\x50\xb8\x7f\x84\x25\xd5\x8d\xeb\x64\xb9\xc5\x97\xc3\x23\xc8\x9f\x6a\x3e\x37\xc0\x29\x4c\x58\x3b\x4d\x0b\xb8\x05\x0e\x4b\x47\x64\x78\xee\x71\x9a\x31\xf8\x2a\xd6\x2d\x05\x27\x61\x8b\xe1\x8a\x24\x7b\x88\x8e\x09\x4e\xc2\x90\xa0\x61\x19\xb0\x55\xc9\x89\x3c\x36\x5d\x6f\xea\x26\xcb\x25\x72\x6c\xa3\x96\x80\x09\x73\xcd\xec\x84\xd2\x48\x04\xdb\xcd\x67\x0b\xed\x83\x51\xa2\x0e\x28\xe2\x58\x59\xa2\x2a\xd4\xc6\xba\xb3\xa0\xdd\xe6\x2f\x08\x79\x22\x06\xb6\x28\x5c\xc7\xa8\x9a\x07\xcc\xe9\x9c\x7a\xab\xab\xce\xf3\xe4\x37\x1a\xce\x0a\x5a\x97\xc7\x9e\x77\xd2\x3a\x3f\x0f\x89\x3d\xa8\xe0\xe2\x04\x48\x57\x9a\xe9\x2e\xd7\xc4\x02\x5d\xba\x57\xf7\xcc\xd2\x6f\xe4\x7b\x67\x45\x81\x04\x0b\xd8\x16\x3d\xc8\xbb\x34\x2c\x9a\x55\xa0\x3b\xe0\x65\x03\x49\x9c\x5f\xad\xb4\x46\x46\x1d\xc6\xaf\x45\x2c\x76\x19\x01\xa5\xe8\x3a\xa7\x5b\xc0\x2b\x8b\x48\xd4\x54\x8d\x6e\x2c\x14\xe7\x0e\xe7\xbd\xe1\xbf\x80\x8c\x06\x3a\x90\x45\x8e\x3b\xd9\x6e\xc6\xb9\xbe\x4f\xb2\x95\x77\xeb\x0b\xfe\xd5\xfe\xfb\x9f\x32\x9b\x12\x43\xe0\x77\x0b\x8b\x80\xb0\x08\x8b\x3d\xbf\x32\x9d\x50\x8a\xdb\x05\x2b\x7e\xcd\xfb\xdb\xc5\xc4\x94\x87\x54\xa6\x91\x64\x45\x2e\x78\x8e\x28\x5e\xe6\xf4\x64\xa9\xc9\xd5\x21\xcb\x07\x9d\x57\xb9\xbe\x19\xde\x27\xa5\x62\x00\x55\x75\xc0\x86\xe2\x35\x21\xdb\xa9\x09\x90\x3d\xff\x95\xd1\xe5\xc2\x32\x94\x95\x27\x15\x7a\x1b\x7f\xa8\x85\x44\x8a\x95\x34\xac\x58\xae\x31\x38\xc1\x02\x0a\xaa\x06\x0c\x41\x7c\x1b\x33\x86\x76\x79\xa4\x8c\x75\xf6\x3c\xfc\x42\x3c\x48\xbd\x8d\x4f\x4f\xde\xc6\xef\xd1\x12\x42\x4f\x43\x33\x78\xaf\x66\x0c\x47\xec\x84\x21\x77\x0a\x5b\x28\xb4\x3f\x0d\x69\xa0\x1e\x74\x32\xda\x72\x98\xa9\xf4\x39\x9e\x24\xc1\x12\x19\x4d\x3a\xac\x9c\x1f\x71\x5f\x3c\x52\x1a\x97\x0f\x59\x78\xa9\xd5\x36\x5b\xa5\x10\xc4\x03\xa3\x33\x84\x2d\x0a\x8b\x02\x43\x39\xf4\x36\xec\x5c\x2f\x8a\xdc\x6c\xd2\xc5\x16\x09\x31\xe9\xa5\x97\xcf\x34\x8a\xa3\x3d\x26\x31\x5c\x99\x19\x88\x94\x24\x59\x8b\x81\xac\x9e\x71\x2f\x34\xac\xe4\xb6\x05\x02\x9e\x5b\x8b\xad\x5e\x0b\x4d\x11\xae\xde\x0b\x7d\x93\x6d\x80\xd9\xd0\x88\xba\x07\x47\x22\xab\x9b\xc3\xe4\xf8\x9a\x18\x82\x22\xc8\x89\x12\x99\xd0\xa4\x72\xbe\x69\x0b\xf2\x71\x7f\x58\x02\x2f\x5a\x5a\x4e\x99\x90\x3b\xd9\xf3\x5e\x8e\xdb\xc2\xba\x03\xeb\x4d\x85\x7a\xb3\xeb\x14\xb2\x6b\xc8\x19\x16\x84\x8a\x5e\x99\x1a\xa1\x64\xdb\x92\x75\x28\x8b\x36\xea\xba\x56\xde\xa7\xa7\x27\x80\x07\xbc\x59\x54\xf4\xac\x93\xb7\x12\x91\x35\x32\xf2\x51\xf1\xb4\x31\x0d\x30\xe6\xed\xa7\x2c\x80\xa5\x0f\x1c\x80\xad\x97\xc2\xff\xd5\x47\xb2\xbb\x8e\xf6\x9e\xb8\x3f\xc4\x32\x33\xd0\x38\x5a\x1d\xef\x95\xf8\x10\x26\x69\xd7\x73\xc4\xd2\x04\xdb\x46\xa4\x27\x5e\x86\x78\x6a\x4b\xa5\xc8\x47\x22\x5e\x08\x95\x8b\x89\xe3\xda\x7a\xbe\x6c\xa7\x2c\x12\xbb\xbf\xc2\x95\x42\xaa\x35\xcd\x73\xbe\xb1\x1a\xfc\x71\xc8\x3b\xa9\xe1\x6c\x83\x9f\xed\xae\x2f\x6b\x83\xae\x37\xd9\x4e\x9d\xa3\xe5\x86\xc5\xfa\x60\xb7\x4c\xf4\xdd\x36\x0b\x94\x53\xd1\x48\x84\xf8\xaf\x0f\x40\xdd\xb2\xe8\x3b\x34\xe3\x58\xe6\x0e\x15\xdd\x34\x8a\x28\x40\x8b\xbb\x28\x25\x32\x21\x98\x0c\x32\x2b\x8d\xef\x5c\xe9\x3a\x87\xd6\x25\x0f\xd8\x4f\x10\x1d\x90\x9d\xd9\xdf\x0b\xae\xcd\x49\xbe\xcb\xda\x1c\x7e\xb9\x8f\x2e\x48\x12\xc4\x35\x24\xdb\x2f\x7b\xda\x0b\xf4\xe0\xf4\x8e\x2a\x94\x88\x5c\x46\xde\x60\x7c\xe5\xc8\x4b\xa6\xe6\xc9\xee\x71\x86\xdf\x61\x35\x45\xfd\xfb\x0e\xc9\x21\x83\x04\xa6\xc5\xa5\x89\x15\x61\xf6\xeb\xb4\x6d\x05\xd8\xff\x94\xd2\x6b\x1b\x59\x2a\x6f\x6a\x7b\x0d\x1f\x41\xc8\x76\x14\x43\xa0\x35\x27\x83\x08\xc5\x4a\x01\x5d\x83\xf5\x0b\xcd\x37\x28\xed\x45\x42\x23\x72\x2f\x7c\xe5\x8d\x22\x7e\x99\xf7\x8d\x1c\x51\x8b\x98\xb5\x5c\xf3\x9e\x40\x70\x11\x04\x0e\xdb\xcf\x19\xeb\x52\xa3\xbe\x1c\x19\x0c\x2d\x2e\xa2\x20\x02\xc6\xeb\xbd\xb1\x83\x3e\xc4\x35\xb9\xed\x06\x9c\x02\x60\x30\x23\xfd\xd8\xb0\xf3\x2e\xb2\xa2\x4c\x8d\x7a\x00\x7d\xe1\x5c\x7d\xd2\xe5\xdd\x4b\x05\xb8\x0f\xc8\x6c\x07\x0a\xd7\x5c\x8e\xf0\x3c\x99\x6b\xd7\xf1\xb3\x58\x0d\xb0\xcc\xae\x58\xb5\xbe\xc2\x38\x5f\xd4\x76\xa7\x0b\x54\xf8\x0a\x05\xbe\x03\x85\xaf\x58\xb3\x12\x9d\x29\xe1\x3c\xd9\x0c\x94\xac\xa4\xf8\xfa\xd6\xe8\xbd\x82\x74\x5e\xeb\x38\x16\x4d\x98\x42\x38\x76\xf6\xeb\x74\xad\x34\xec\xa1\xa0\x35\xbc\x5b\xda\xc3\xf7\x7e\xc0\x03\x6d\xbb\x96\x89\xa4\xf1\x19\x91\xe3\xe7\xc1\xc2\x6d\x93\x7e\x9f\xd4\x2a\x93\x45\x74\x8b\xca\x32\x7d\x76\xac\x16\x29\x70\x11\x82\xfd\xc5\x98\x1f\x30\x12\x1f\x16\xb4\xf3\x1f\x29\x80\xe7\x93\x50\x10\x83\xf7\xc5\x62\xfb\x92\x71\xc7\x3e\x26\x6f\x47\x1b\x1c\x90\x65\x01\xa4\x22\xe5\x12\xe9\xc6\x50\x46\x2b\xad\xdc\x86\x74\x70\xce\x17\xc3\x28\x65\xc4\xd4\x9e\xe9\xa5\x86\x10\x07\xd8\xae\x6c\x50\x99\xc2\x9b\x90\x9b\xfb\x32\x31\xda\x00\x91\x18\x56\x1e\x74\x22\xf5\xcb\xbe\x32\x84\x4e\xa4\x3a\x17\xc3\xeb\xcb\x8e\x93\x90\x58\x14\xf9\x6a\x0b\xf7\xf2\xce\xa9\xd2\x63\x9b\xf6\x25\xa1\xfb\x58\x8b\x97\xe4\x3b\x74\x42\xd2\x1c\x43\x2f\x12\x43\x01\xc0\x2e\x51\x8c\x83\x76\x9e\x30\xee\xe0\x1b\xb5\x15\x96\xf9\x9a\x47\x44\xe1\xee\xb7\xfe\x50\x51\xb1\xed\x8d\x62\x75\x7c\x91\x66\x99\x63\xc0\x7f\x22\x35\x10\x35\xf1\x95\xd2\xfa\xe2\x26\x0e\x05\x8e\x44\x55\x23\x3e\x85\x14\x55\x44\xc9\x29\xb1\xab\x86\x00\x82\xda\xa1\xde\x25\xfa\x08\xd6\x34\x1a\x4c\xd4\xf8\xc2\xc9\x30\xc2\xa2\x05\xaa\x90\xc1\xb9\xea\x8f\xcf\x07\xad\xfa\x44\x92\xe9\x82\xc5\x97\x94\x13\x5f\x8a\x7e\x23\x19\xed\x27\xb8\x58\x66\x5f\x7a\x33\x52\xa2\x0e\xbb\x7b\x31\x19\x00\xed\x86\x23\x4f\xf1\xa2\x91\x97\x03\x20\x6a\xd9\x4b\xd2\x82\x7c\x29\xa3\x13\xe2\x69\x19\x8e\x3e\xff\x15\x4a\xdb\xf5\x7e\x35\xe4\xb6\x51\x9d\x5a\x7c\xa8\xa6\xb9\xad\x86\x48\x60\x32\x19\x4c\xaf\x07\xfd\x19\x8a\x1f\x1d\x8f\xc6\x33\x92\xab\x1a\xa2\x48\xf4\xe0\xe7\xc1\xe5\xf8\x1a\xc9\x5e\xbc\x9a\x72\x7f\x3c\x42\x39\xae\xf1\xa4\xdb\xaa\xdb\x3d\xba\x7d\x81\x6e\x37\x4e\x7a\xfb\x9a\x01\xda\x94\xd9\x70\x76\x33\x03\xed\x6c\x65\x27\x15\xf5\xab\xed\x00\x37\x35\x98\x46\x63\x26\x46\x69\x0c\xc0\x30\x90\x94\xfa\x32\x98\x0c\x70\xc9\x11\x4b\x8c\x58\x7f\xbe\x2b\x4c\x7c\x30\x1b\x4c\xae\x86\xa3\x9e\x93\x19\xff\x0d\xa9\x50\x28\x4e\xb3\x82\xdc\x4d\x68\x7c\xe3\xd9\x61\xdb\x49\x11\xab\xed\x3e\x64\xbd\x08\xb8\x0f\xa9\xf4\xdb\x7e\x3c\xcd\xd5\xdb\x37\x6a\x69\x6f\xde\x62\xa5\xe6\x7a\x51\x40\x36\x20\x79\x4c\x3c\xf0\x14\x3f\x8e\x0c\xf2\x1e\x32\x66\xda\x02\x15\x22\x3b\x80\xa9\x34\xc1\x2f\x8f\xa7\xc5\x73\xa9\x47\xd4\xb5\xaf\x86\x26\xe8\x3e\x7a\x5d\x69\xa9\xf2\x04\xe3\xca\x32\xf3\x9f\xe6\x4c\x4c\x31\xd7\xbb\x22\xf7\xb2\x26\x7b\x1e\x10\x76\x07\xe6\xe7\xc7\x58\xec\x6c\x20\x3f\x62\x6d\xb5\x18\x89\xa6\xec\x5c\x8f\xc6\xaa\x3f\x9c\xf4\x6f\xae\xa6\xa0\xb4\x85\x0c\x51\xee\x4f\x92\xd9\xc7\x73\x1e\xcd\xc6\x93\x99\xd4\x3e\x1f\x0d\x3e\x5f\x0e\x3f\x0f\x46\xfd\x41\x37\xc2\x6d\xd1\xeb\x23\xfb\x92\xe0\x80\x9a\x7e\xe9\x5d\x5e\xb6\xef\xab\xa8\x7d\x57\x39\x1d\x79\x27\x7c\x07\xb4\x56\xc1\x82\x76\x9f\x99\xde\x5c\xdb\x03\x6e\xc2\xab\x9e\x39\x7d\x88\x23\xab\x45\x44\x3e\x14\xa9\x1f\x4c\xa6\xe3\x91\x23\x2f\x1a\x8e\xce\x87\x13\x38\x11\x5a\x69\x8c\xf6\xea\xc8\xf3\x96\xfb\xd2\xb3\x43\x30\x98\x3c\x75\xda\xf2\xf7\x2e\x48\xfc\xdd\x36\xf0\x79\x3c\x3e\xff\x3a\xbc\xbc\x8c\x90\xb7\x6b\x3a\x1b\x5f\x5f\xf7\x3e\x0f\xec\xc8\x5e\x5d\xdf\xd8\x46\x9d\xf0\xfb\x44\x5d\xf5\x2e\x2f\x6e\x46\x7d\x6c\x8d\x3a\x0f\xb2\x6d\x97\x97\x6e\x40\xaf\xec\xf1\x1c\xf4\x92\x95\xe6\x6b\x3a\xf0\xa8\xfb\x8e\x13\xf5\xa5\xf7\xf3\x00\x89\x93\x50\xb5\xef\x79\xcc\x49\x7c\x10\xb5\xae\x3a\x6a\x39\x60\xb0\xaa\xc9\xfd\x0d\x7a\xb3\x2f\xb6\x7b\x38\x1d\xbd\x4b\x35\x1c\xfd\xcb\xcd\xe4\xb6\xae\xff\xe7\x7b\xfb\x6a\x2a\x56\x5f\x8d\xe4\x2a\x24\xb6\x72\xc2\x78\x53\xfc\xba\xef\xe4\x8b\xf9\xba\x26\xb5\x37\xf4\x4b\x63\xef\xca\x00\x3a\x2f\xb8\x50\x7d\x3b\x76\x9e\x44\x43\x7b\xd9\xbd\x4e\xdf\xc4\xea\x26\x9e\xc6\xea\xb3\x5d\xf8\xa3\x2b\xfb\x6e\x03\xbb\x4b\xa7\x83\xc9\x94\x4e\xe2\x96\x30\xb5\xea\x08\xd6\xba\xb4\xd2\xeb\xa8\x83\x15\x79\xd6\xc0\xd4\x25\x8a\x4b\x93\x58\x5b\x9a\xab\x77\x7f\x54\xfd\xf8\x22\x9e\xc4\xea\x2c\x3e\x7d\x73\xaa\x8e\xc7\xd6\xf1\x3f\xfd\xf1\xc7\xf7\x5d\x54\xa3\x23\x29\xb5\x62\x15\x34\xdc\x28\x7b\xea\xc0\x21\x7d\xf0\x23\x61\x84\x19\xbb\x25\x62\x61\x40\x0c\x6d\xea\xbd\x3a\x3d\x8b\xcf\x4e\xcf\xd4\xf1\x54\x6f\xb8\x5f\x80\x67\x0e\xf8\xfa\x1b\x1f\x07\x81\x0e\xff\x66\x67\x3f\xc4\x3f\x9c\xbd\x39\x3b\x39\x75\x52\xcb\xee\x57\xef\xd4\xf1\xbf\x6c\x73\xcd\x6f\x6c\x0f\x53\x1c\x74\xb0\xe7\x21\xfd\x3b\xc8\x97\xea\x06\xe4\x8c\x93\x05\x92\xf3\xb7\x84\xd8\x72\xd0\x71\x2e\x4c\x4b\x0c\x16\x2f\x31\x9c\xd3\xd3\x58\x5d\x0d\xa7\xfd\xc1\xe5\x65\x6f\x34\x18\xdf\x4c\x9b\x37\xaa\x63\xea\x70\x25\xbb\x9b\x4c\x57\x92\x32\x64\x51\xe4\x0b\x5d\x42\xac\x8f\x91\xd6\x6b\x00\x97\x28\x2a\x5c\x7d\x16\x83\xcd\xbd\xce\xd8\xb0\x0d\x18\x6c\x9e\xc1\x06\x83\x2f\x1b\xc4\x61\x9a\x54\x30\x69\x15\x90\xbe\x84\x2f\xe9\xda\x94\x6e\xd3\xf9\xb6\x5a\xdc\x83\x78\x94\xa0\x10\x39\xd6\x6d\x61\x9f\x06\xbf\x0e\x31\x50\x3b\x2d\x6c\xe7\xbc\x74\x23\x64\xd3\x84\x74\x4c\x5a\x81\x67\xbe\xca\xd2\x45\x75\x52\xac\x4e\xc2\x67\xc5\xea\x6b\x2d\xa0\xb7\x4c\xcd\x06\xaa\xb0\x5d\xfe\xc3\xc1\xe7\xac\x73\x4c\xb0\x76\xbb\xe9\x16\x69\x95\xfe\x9b\xce\x59\xe3\x24\xc9\xb9\x2e\x68\x71\x9f\x94\x15\x2c\x16\x0c\x4a\xd9\x65\x4b\x04\x57\xcb\x42\xcd\xad\xab\xa6\x8d\x7d\x00\x92\x3e\xd9\x2d\x3d\x82\xca\x9b\x2c\xc9\x97\x06\xe3\x80\xc4\x67\xe3\x1d\x32\x58\x0b\x4b\x41\x60\x13\x71\x0c\x0d\xbb\x1b\x26\x61\xa4\xef\x8b\xa3\x89\x94\x37\x3b\xfe\x42\xf0\xf9\x03\x40\x22\xd3\xf5\x13\x27\x30\xfe\x2b\x70\xbf\xec\x96\x9b\xa7\x58\xd7\x93\x94\xf3\xb4\x2a\x29\xfa\xe6\xc2\x97\x59\x01\x85\x5d\x38\x6a\x9b\x64\xc7\x25\x7f\x8b\xc2\x50\x5d\xa8\xff\xda\x47\x70\x41\xa1\xe4\xcf\xff\xb2\xf9\x5e\x4e\x8e\xc3\x77\x0c\xd6\x75\x9a\xab\x5e\xb6\xd6\x59\x11\xd5\x47\x94\xe2\xa1\x0b\x12\xe1\x4f\x2b\x4e\xf5\x3e\xa7\xed\x1a\xc7\xa9\xa4\x1f\x55\x4e\x1b\x6d\x8b\x00\xff\x3d\xcf\xdf\x33\x1c\x75\x3c\x24\x8c\xc9\x61\x88\x77\x44\xcf\xc2\xe1\x43\x81\x2e\xc7\xf2\x9d\x54\x55\x51\xe6\x7a\x67\xd4\x4a\x13\xdf\xa8\xfe\xbe\x21\x6a\xbd\x9e\x7d\x73\xd4\x68\x13\x01\x68\x5c\xe0\x6e\x07\xf9\xa4\x56\x92\xdf\x6d\x93\x3b\x62\x03\x77\xc5\x60\x6e\x50\x80\xe2\xa8\xdc\x02\x99\x31\x56\x3f\x02\x18\xb1\x44\xb0\x92\xa0\xbd\x82\xa0\x4a\x6d\x45\xe2\xa9\x78\x16\x83\x2f\x36\x1e\x39\x0b\xc3\x9a\x05\x28\x0d\x0c\x9f\xa0\xd8\x6f\x9a\x43\x62\xc1\x38\x2a\x71\x0c\x4f\x05\x05\x2c\x89\x01\x57\x81\x0b\x3f\xbd\x47\x21\x62\xd1\xd1\x5e\x1c\x6a\x8d\xfd\x66\x3f\xee\xd1\xce\x05\xe7\x20\x25\x66\xae\x58\xed\x17\x04\x8c\x3c\xb5\x3b\x44\x25\x9c\x14\x2c\x4b\x8b\xd5\x72\x9e\x1e\x79\xec\x21\xbc\x98\x3f\x79\xd0\xf9\x56\xa3\x5e\xbe\x03\x63\x41\x68\xc5\x29\x2b\x10\xf4\x16\xba\x12\x09\x7d\x54\x87\x44\x59\x25\x8b\xaa\x28\x19\x92\xcb\xc9\xb2\x47\xaf\xb1\x03\x6e\x88\x5e\x4a\xde\x30\x91\x0f\x72\x03\x47\x98\x09\x48\x2f\xeb\x7f\xdd\xa6\x98\x45\x84\xea\x98\x58\x0d\xfe\x0c\xb6\x97\xea\xc5\x47\x9d\x59\xad\x0a\x1c\x46\x06\x52\x06\x49\xd9\xd8\x5a\x7b\x79\x37\x04\xeb\x86\x3a\xb6\x9f\x74\xd5\xf8\xdd\x8f\x2e\xa6\x67\x97\x1b\x16\x3c\xf2\x23\xb4\x5f\x40\x2d\xa9\x5d\xe7\xad\x71\x08\x96\x50\x81\x49\x50\x62\xe0\x7c\x5e\x47\x25\x73\x5f\xac\x75\xfc\xf8\xdd\xc4\x79\xf6\xfa\xff\x5d\x65\x0f\xcb\xb9\x2e\xef\x5e\xaf\x4a\xad\x41\x6c\xf4\x84\x59\x92\xaa\xef\xd5\xd1\xd4\x59\x41\xa2\xba\xc2\x47\x71\xc5\xcd\x1c\x96\x5f\xd8\x71\xe5\x30\x10\xd5\x1c\x1d\x0e\x03\x11\x50\x9e\x75\x2c\xb1\xd4\x21\x4b\xf5\x32\x56\x53\xad\xc3\xe0\x3b\x65\xd7\x88\xf0\x6b\xe1\xf7\x3a\xde\xcb\xa2\x0e\xd7\x29\x92\x31\x29\x48\xbd\xe7\x7b\x29\x74\xfe\x5b\xff\xc4\xaf\x2f\xaf\xaf\x2f\x4f\x4e\xe3\xb3\xdf\x8d\xfe\xe7\x29\xfd\xff\xb7\x67\x6f\xea\xfa\xff\xa7\x3f\xfc\xf0\xee\xef\xfc\x3f\x7f\x8b\x9f\x19\xa4\xbd\x67\xfa\xcf\xea\xba\x2c\xe0\x80\x0a\xcf\xa3\xa3\xff\x75\x72\xf8\xff\x8e\xec\xfa\x11\xa7\xd6\x99\xf5\x34\x7e\x3c\x79\xf3\xe3\xc9\x9b\xb7\x47\x9e\xe9\xdc\xfe\x12\x1f\xf4\x96\x9f\x74\x34\x78\xd0\x25\x54\xa2\x58\x0b\x33\xcb\x8a\x47\x32\x1b\xfd\x21\xfc\xa0\xcb\x79\x52\xa5\x6b\x71\x81\x04\x9a\xb1\xec\x70\x61\x45\x9f\x8c\x5f\x23\x69\x84\xcf\x68\x40\xeb\xf1\xd1\xf5\x64\xd0\xbb\xfa\x74\x39\x38\xfa\x5f\xf4\x73\xf4\xd4\x00\xa8\x63\xfb\x82\x5d\xdb\x92\xcc\x01\x50\xf0\xcf\x25\x31\xed\xc5\x47\xed\x04\x70\xf0\xf0\xb8\x8b\x8f\xf8\x00\x76\xa7\xb7\x84\xd4\x90\x4f\x73\x57\x26\x6b\x97\x85\x40\xfc\x94\x63\x01\x04\x16\x4c\x73\x1f\x8e\x13\x39\x1f\x99\x60\x16\x9c\x6b\x91\xd4\xcb\x76\xca\xf0\xc5\x95\xae\x30\xb7\xc1\xcf\x49\x8d\x9a\xe9\x3f\x9f\x70\x16\x55\x60\x3a\xf1\x6d\x36\xc9\xe2\x5b\x02\x4c\xfa\x76\x88\x77\xa2\xfb\xd6\x01\xa2\xea\x94\x7a\x8b\xdb\xdc\x91\xbb\x15\xb6\x79\x84\x75\x19\x32\x50\x7e\xe1\x80\x5b\x6f\x74\xae\xbe\x8c\xbf\xaa\xd9\xd8\xc7\xc2\x20\x98\xfd\x79\xd2\xbb\x9a\xb6\x64\x0d\x5e\x45\x28\x30\x1b\x41\xba\xd4\x00\xbf\x45\x89\xea\xe3\xc6\xfa\x41\x89\xf5\x25\xc9\x1c\x28\x81\x00\x4d\xe7\x4b\x3a\xd0\x61\x80\x51\x2d\x05\x40\xde\x48\x65\x82\x12\x5c\xf6\x1e\xa8\x33\x07\xa7\xee\x8d\x02\x53\x87\xaf\xbc\xa3\x61\xbe\x6f\x2d\xfe\x62\x5f\xf6\x1a\xbf\xfb\x0a\x35\x7e\x0c\x17\x77\xf2\x20\xb5\x5d\x92\xb2\xf5\x60\x42\xf1\x65\x05\xf9\xab\x5c\x7d\xe2\x61\x6d\xf5\x8d\x35\xda\x58\xf9\xcd\x7a\x26\x11\xf6\xd7\xe1\xe6\x24\x51\x37\x92\x91\xb4\x7f\x27\x29\x51\x85\x09\xfc\x0b\xeb\x35\x53\xa6\xdc\x6c\x37\xba\x34\x1a\x2c\x7e\xa9\x7c\x9c\x37\x36\xaf\xc8\x53\x81\x71\x87\x26\x65\x5d\x4a\xa3\xf5\x15\xfc\x57\x71\xd1\xfe\x63\x5e\xfc\xa3\x43\x92\x3f\xa3\xaf\x07\xfb\xd9\xd6\x8b\xb0\x70\x5a\x9a\x54\x80\x8d\x57\x3d\xff\x0d\x20\x22\xc0\xd4\x7e\x78\xd4\x25\x2e\x12\x12\xb5\x35\x26\xbb\x0d\xa5\x12\xab\xa2\xd4\x2a\xd7\x7a\x89\xa8\x8a\x7b\xbd\xf8\x46\xfe\x99\xe8\x2d\xc0\x25\xc3\x65\x8a\xa8\x64\xf4\x2f\x74\x66\x97\x5a\x6f\x51\xa5\x0f\x48\x61\x2e\xb2\xe1\xc1\x3b\xd2\xec\xd5\xe7\x48\x76\x0a\x59\x5a\x2b\xd4\x35\x11\x69\x62\x7a\xee\x47\x02\xde\x94\x48\x90\x91\x2e\x35\xa2\xcf\x17\xc5\x06\xd8\xdf\xc5\x69\x85\x3e\x40\x82\xd0\x86\x72\x9b\x83\x95\x26\x1f\x95\xb2\x78\x16\x56\xa9\xda\x63\xf5\x2b\x79\x0e\xe1\x0d\x03\xa7\x45\xaa\x1f\xb4\x77\xf6\xc4\xf0\xc0\x49\x02\x7b\x0b\x8e\x35\x98\xae\x52\xeb\x25\xd6\xd1\x60\x79\x4a\x88\x11\x7b\x72\xc3\x30\x49\x13\x20\x7f\xc1\xfa\x7e\xbc\x4f\x2a\xe4\x18\x67\x81\x60\x67\x8c\xd2\xb9\x64\x9f\x0d\x47\xfa\xe3\x7d\x0a\xf2\x55\xa9\x63\x8d\x82\x71\x10\x15\xac\x11\x04\x2f\xee\x4a\xf8\x4f\x3c\xe3\x04\xaa\x3b\xe8\x8a\x57\xdf\x2b\x88\xc2\x5c\x03\x36\xd7\x1e\x43\x8b\x7b\x18\x13\x38\xb4\xef\x8a\x24\xe3\x27\x6b\xcd\x67\x9f\xd1\x75\xaa\xf8\xdc\x3a\xdf\x54\x86\xc7\x05\xba\xbf\x2c\x56\x77\xc0\x81\x19\x57\xfa\xfb\x2b\xce\x45\xef\xbb\x09\x11\xe4\x7f\x77\xa7\x0d\xd5\x18\xf6\xc7\xa3\xf3\x21\x29\x74\x8c\xfc\x05\xc0\x21\xe4\xab\xf1\xf9\xf0\x62\xd8\x87\x20\xb2\xbb\xae\x9f\xf1\x73\xd4\x82\xc1\x7d\xfe\xe6\x6a\xc2\xc1\x61\x17\x31\xab\x41\xcb\x32\x74\xb6\x85\xac\xc2\x26\x98\x08\x41\x94\x1f\x93\x1d\x17\x42\xb6\x2d\x98\x39\x0a\x81\x11\x19\x0f\x2b\x7b\x16\xe5\x3c\x5d\x2e\xeb\xac\x52\x0e\x55\x83\x55\x37\xad\xef\xea\xde\xaf\xed\x89\x29\x55\x26\x10\x2e\x1d\xb7\x8d\xd7\x5e\xd6\x60\xad\x49\x9e\xf1\xd2\xae\x8c\xea\x27\xa2\x80\xf4\x88\x47\xad\xab\x3a\x33\xb2\xdc\x5c\x45\x99\x6b\x27\xed\x0c\xfd\xd8\x73\x76\xee\x01\xb4\xd0\xb7\x82\xea\x33\xdc\xb1\xcc\x30\xb8\x9d\x3b\x83\xa2\xe7\xfb\xd0\x0f\x4e\x6b\x71\x5b\x5d\xb4\xdc\x56\xaf\x98\x73\x67\x28\x1e\x99\x7a\xe3\xc7\x45\xf6\xed\x1f\xea\x05\x32\x7e\x04\x7c\xb0\xb6\x7d\x30\x7e\xdd\xab\x23\xc8\xb8\xd4\x7f\xd5\x00\xe0\x7b\x38\xdf\x1c\x06\xe1\x15\x93\x41\xb8\xc9\x0c\xf5\x8c\x11\x6e\x19\x2c\x22\x17\x49\xb0\xff\x92\x80\x15\xc7\x5a\xef\xaa\xc0\x00\xb8\xda\x6c\x42\xd6\x96\x2d\x64\xb5\x67\xa0\x61\x07\xb7\xd3\xbe\xe6\x3d\x25\x27\x7c\xe4\x18\x83\xe2\x4e\xa6\x89\x4d\x2b\xcf\x54\x05\x20\x1d\x0f\x59\xf4\xe5\xcc\x28\x5f\x6a\xe7\x8e\x69\x1d\x69\x77\xd9\x21\xf0\xc8\x1c\x9c\x86\x82\xb9\x92\x35\x02\x84\xb2\x9d\xbf\x4e\xc2\x51\xe2\xd2\xac\xe6\x61\xc1\x80\xc4\xb6\x2e\x24\xcb\x25\x50\x99\x39\x04\x7c\xd8\xe8\xca\x91\x2b\x00\x75\x08\xa6\xaa\x74\x59\x5a\x3b\x56\xf6\x13\xd1\x40\x72\xab\x7b\x76\x4e\x60\x2a\x21\x78\x32\x28\x60\xdb\xa6\xd0\x24\x46\x23\x2e\x2f\x54\x56\xe4\x77\xba\xac\xd5\x8f\x07\x73\xe0\xfe\x54\x1a\x07\x5b\x14\x8a\x52\x84\xd2\xf5\x9f\xa1\x79\x09\x5e\xc7\xb0\x0a\x8d\x2f\x06\x3c\xb4\xee\xea\x55\x11\x78\xf4\xc1\xd1\x68\xc2\xfd\x34\x2f\xaa\xfb\xd6\x27\xe2\x69\x87\x09\x23\x7c\x59\xaa\xf9\xf6\x58\xad\x5f\xbd\xd6\xff\x28\xdf\xa3\xe0\xc8\xd4\x71\x0f\x48\xc1\x8e\x3f\x75\x99\xf5\xc7\xfe\xa6\x76\x1d\x35\xcd\xba\x63\x52\x3a\x8e\x5e\x70\x5d\x75\x55\x55\xdc\x21\x91\x99\xeb\x76\xf0\x36\x1f\x9d\x7b\x56\x3f\x7d\x5a\x97\x2f\xb3\xdb\x3a\xee\x0d\x52\x18\x87\x50\xf3\x66\xd7\xb6\x3c\x41\x81\x5a\x4a\xfe\x6d\xb2\x64\xc1\x87\xa5\x6b\x47\xa8\x9b\xd5\x9a\x94\x43\xe0\xd9\x41\xed\xb0\x43\x43\x70\xcc\x12\x07\xa9\x3b\x52\x23\xf4\x3c\xab\x7b\xc8\x75\x7a\x8a\x03\x90\x1e\x73\x86\xe8\x7a\xa3\x33\x17\x27\xaf\x3d\x29\xb1\xcb\x7d\xdf\x98\xf1\xac\x7d\xea\x72\xba\x00\x97\x77\xad\x3e\xb8\x6d\x08\x45\x91\x2c\x0b\x57\x8b\x32\x6e\xda\xcb\x60\x60\x36\x42\xb0\xa2\x7b\x1f\x91\x33\x02\xfd\xd9\xc8\x79\xdd\xdc\x99\xa4\x29\x57\x7b\x59\x2c\x12\xe0\x78\xba\x99\x5c\x92\x38\xaf\x02\xd6\x71\x17\x47\xd0\xdf\x21\xeb\x07\x1b\xd7\xbd\x95\xed\x0b\x46\xc3\x5b\x97\xa4\xb5\x87\x21\x7e\x8f\xd5\x96\xc7\x82\xf6\x31\x28\xcd\x71\x88\xd3\x9a\x8f\x20\x09\x16\x8a\x52\x6d\x74\x79\x9f\x6c\xc0\xd4\x01\x86\x23\x6a\xa3\x1b\x1f\x8d\x0a\xee\x2a\x1d\x69\xa4\x13\xf4\x8b\x5c\xb5\xaf\x04\xb7\x2a\x92\x03\x8a\xaa\x79\xdc\xea\x92\x9b\x03\x9c\x19\xc3\x02\x0e\xf0\x05\x0a\x94\x30\xbf\x61\x04\x03\x05\x24\x99\xf9\x02\xea\xda\x80\x2e\x33\x68\xb2\x60\x31\xf2\xc5\x7d\x9a\x6b\x95\xba\x0a\x10\x6b\xd4\xb9\x7b\xc0\x19\x0e\xb0\xb6\x21\xdb\x32\x87\x28\x49\x19\x38\x55\x76\x84\x8c\xce\x56\xb1\xfa\x45\x96\x0a\x37\x5f\x8c\x42\x05\x0b\xbd\x74\x87\x36\x11\x85\x19\xd8\x6c\x0e\x31\x2c\x4f\xc9\xd0\x14\xc9\x92\x47\x75\x72\xa2\xc4\xa1\x52\x27\xa5\x6d\x9c\x69\x8a\x96\xcd\x5d\x0e\x5d\x83\x2a\x8b\xd2\x47\xd3\x5c\xe8\xdd\x85\xe5\x88\x56\xaf\x86\x1c\x25\x6f\x91\x25\x82\x91\xcb\xb4\x70\xd9\x2c\x8e\xc1\xc7\x47\x7d\x7b\x09\xd6\x19\x32\xa8\x9f\xc7\x62\xd8\x12\x43\xf9\xf7\xb4\x62\x72\x33\x37\xe8\x8b\x22\x7f\xb0\x57\xb8\x80\xde\x57\x76\xb1\x12\x61\x83\xd9\x99\x4a\xaf\x4d\x97\xf8\x2a\x43\xc1\xf5\xa4\x2d\xea\x40\xa7\xfb\xac\x6e\xb0\x09\x7b\xae\xee\x53\x93\x8f\x85\x2a\x62\xd8\x32\x2a\x50\x63\xf6\x38\xe3\x6c\xa3\xa8\xef\xe4\x53\x23\x05\xf2\x9e\xa2\x5c\x86\x09\x1b\x14\xee\xf2\x8f\x04\x1d\x0a\x5d\x97\x32\x76\xa6\x9e\xbd\x50\xa1\xf0\xce\xe5\x20\x5d\x1d\x56\x70\x3e\xe1\x6b\x49\xeb\x1e\x9e\xc3\x47\xa6\x93\x8b\xac\x0a\x57\x78\x82\x46\xd7\xbd\xb6\xdd\xf3\x00\x6b\x78\x08\xfa\x0e\xdb\xcd\x32\xc1\x14\xbd\xdb\x69\xd5\x7d\x61\x37\xbc\x9b\x4b\xc6\x7f\xa7\x15\x42\x17\xad\xa9\x03\x76\x97\x75\x87\xc9\x70\xb0\x0b\xc5\x34\x39\x79\x5a\x5c\x98\xf8\xa8\xa7\x26\x41\x70\xcf\x6e\xd2\x80\x43\xe1\x2b\x25\x93\x03\x5f\xee\xe4\xd7\xfc\x1c\x0d\x2b\xe4\x83\x35\x5a\xe5\xe8\xc8\xbb\x22\x80\x56\x97\x8e\xae\x26\x7b\xb0\xec\xb8\x22\x7c\xa3\x4b\x03\xb6\x39\x70\xfe\x71\xa6\x1b\xca\x20\x84\xd3\x4d\x93\xd1\xf0\xc0\x20\x6d\x5b\x97\x35\x0b\xa7\x55\x7d\x05\x0f\x1e\xee\x09\x62\x44\xb1\x33\x89\x43\xd8\x5c\x06\x2c\xd5\x02\xef\x13\x06\xf8\xec\xb4\x55\x9a\xd6\x37\x7c\xea\x3e\xd9\x6c\x34\x88\x2c\x25\x0b\x54\x55\xb1\xc7\x0a\x5f\x49\xab\x02\xf6\x5a\x18\xad\x76\x0f\xe3\xed\xf4\x11\xac\xd3\xca\x93\x94\x2d\x16\x5b\x18\x49\x08\x7e\x58\x43\x21\x61\x07\x94\x4e\x6d\x88\x53\xa0\x9d\xd0\xb8\x64\xdd\xc3\x12\x38\x1b\xb7\x26\x1c\x9e\xb4\x82\x25\xfb\x90\x16\x0c\x78\xa8\x85\xc5\x56\x35\x89\x17\x9c\xe2\xad\x41\xa9\x59\x2e\x17\x98\x6b\x83\xe3\x58\xda\xff\xa8\x0a\xf5\x4d\xeb\x0d\xfe\xa9\xed\xaa\xf4\x0b\xda\x6d\x62\x12\x54\x29\x72\x1d\xab\x2b\x11\xfc\x35\xee\xfe\x85\x52\x1a\xc1\xdf\x0c\xf1\x13\x7d\x9f\x3c\xa4\x45\xe9\x69\xa9\xd8\xaf\x71\xeb\xa6\x42\x9b\x2a\xad\x84\x38\x0b\x19\xd7\xbf\xd6\x13\xfe\x75\xbb\xc3\x6e\x90\x5e\x40\x79\x7c\x30\xcc\xda\xee\x1d\xd3\x22\xe5\x08\x6c\x3d\x54\xac\xeb\xf3\x57\x3f\x7d\x1b\x11\x0d\xbc\xa0\x5b\x9f\xe5\xc8\x3c\xb3\x1d\xc3\xcc\xf6\xde\x01\xaa\x68\x1a\xcd\x87\x5d\x76\x4c\x73\x84\x8e\x7f\xfa\x44\xbc\xdc\x07\x73\x31\x8e\x83\xf4\x7d\x39\x83\x3a\x6a\x12\x56\xdf\xd2\x9c\xf4\xc6\x10\x27\xe6\x42\xe0\xb2\xfb\xd6\x4c\x15\xb7\x8e\xcf\xae\x79\x15\xb5\x7a\xbb\xcf\x8c\xab\xbb\x96\x0f\x2c\xb4\xb6\x88\xc3\xd1\x0b\xcf\xdc\xd5\x9e\x70\x19\xd8\x6e\xfe\x8e\x9a\x13\xa0\x12\xde\x08\x9f\xeb\x9d\xa8\x94\x13\x80\xad\xc1\x9c\x2e\x39\x28\x61\xf4\xab\x75\xd1\x70\xed\xfd\x0b\x96\x28\x59\xaf\x02\x11\xc4\x06\xea\x82\x94\xb1\x99\x7e\xc5\xf9\x98\x30\xa1\x86\x25\xf7\x4f\x54\x4b\x34\x91\x3d\x58\x7c\xdf\xe6\x37\xd5\x2f\x71\x9a\x9b\x57\xca\xa4\xf6\xb2\xc6\x30\x2e\xd6\xfb\x0b\x16\x78\x5c\x18\x35\x2b\x50\x46\x1e\x8d\x0f\x3c\x81\x03\xb6\x94\x51\x06\x83\x61\x7c\x8c\x2c\x54\xe8\x04\x9f\xb4\xb1\x1e\xb4\x2e\x20\xbe\x7b\xf6\xf5\x7e\xb5\x7c\xa5\x8e\x71\xb2\x56\x05\xb0\x5e\x85\xc4\xf7\x5d\x81\xca\x80\x7a\x54\xd4\xb0\x0e\x4f\x76\xad\x20\x23\x1d\x04\x0e\x51\xe8\x32\x2c\x40\x14\x9d\x0d\x6f\xc8\x03\x1d\x70\x67\x7b\x5a\x7a\xcb\xd9\xbe\x86\x09\xa9\x16\x9c\xdf\x7f\x8a\xa4\x6e\xb0\x9f\x99\xf3\xae\xae\xf7\x88\x2d\x33\xaa\x05\xe1\x6d\x5b\x64\x80\x90\x3c\x89\x24\x74\xb7\x01\x70\x94\xa3\x57\x90\x37\xe5\x36\xaf\x7d\xde\x39\xb2\x67\x5d\xbc\x2f\x6b\xef\x2d\xbb\x11\x44\x1a\xb0\x4b\xc7\x76\x1c\xd2\x7c\xb3\xad\xd4\x26\xa9\xee\x0d\x33\xf0\xd7\x55\x07\x68\x7b\x68\x38\x8e\x0e\x8d\x1e\x38\x48\x15\x5e\xb3\x2c\xba\x33\xd3\x7f\xee\xfe\xc6\xcb\x68\xb1\xba\x7b\xa5\x8e\x17\x45\xbe\x4a\xef\x58\xb5\x96\xd6\xcf\xde\xf9\x8b\x1b\x37\xd6\xb1\x3d\x2b\xd9\x28\xb0\x96\x50\x97\x32\x37\xe8\x7c\x94\x10\xbf\x43\x81\x8c\x35\x00\x1f\xdd\xb6\x61\x2c\x43\x9d\x86\xa9\xd9\xa3\xf8\xe8\x93\x46\x6e\xc5\x62\x05\xbe\x16\x27\x73\xf0\x88\xc7\x15\xe3\xf8\x19\x8c\xd9\x62\x90\x30\x3c\xcf\x10\x82\x19\x66\xbe\xd4\x52\x6f\x4a\xbd\x48\x58\x96\xf1\x59\xe7\xfb\xa2\x58\x6f\x8a\x9c\xe1\x6b\xf8\x10\xb4\x43\x84\xce\x8f\x5b\x61\x9e\xef\x71\x89\x35\xa4\x1c\xdc\x20\x7a\x65\xa8\x49\x0f\x1c\xa8\x24\xc7\x98\xf9\x13\xf6\xd8\xd1\x68\xec\x90\x5f\x32\xf1\x73\x34\x63\x79\x62\xa9\x56\x68\x9f\x1a\xe4\x6f\x08\x4a\x09\x56\xa5\x47\x14\x93\xe2\xad\x44\x14\x63\x75\x01\x03\x54\xbe\x14\x19\x10\x52\x33\x3c\x54\x2e\x87\x5f\x12\xbb\x76\x5f\x79\xd3\xdd\x3d\x9d\xe2\x8a\xf6\x5a\xae\x03\xd3\x10\x11\x4d\xd0\x34\x81\x74\xc5\xe1\xb1\xc7\x3a\xab\xf2\xb1\x27\x45\x9f\xe5\xd6\x09\xf0\xb2\xd6\xa5\x5d\x07\xc1\xd2\x58\xa5\x15\xa0\xaa\x31\xce\x23\x96\x18\x49\x2b\xe0\x6a\x26\x2d\xce\x32\x35\x40\x67\x41\xe7\xce\xbf\x6e\x13\xd7\x0e\x51\x8c\xa3\x0c\x4f\xe3\xaa\x85\xcd\xb2\x2b\xb6\xb1\x9a\xde\x03\x73\x97\xfc\xbb\x1d\x28\x90\x26\x41\x5d\x5f\x0c\x52\x25\xc6\x6c\xd7\x7c\x1b\xa2\xac\x08\xa0\x63\x1d\x78\xde\xe8\xf2\x21\x5d\xc0\x28\x94\x7a\x93\xa4\x65\x84\x44\x3c\x25\x89\x36\x00\xac\x22\x2f\x14\x9e\x71\x84\x0b\x27\x34\x38\x04\xe2\x9d\xa2\x29\xf8\x26\x6d\x53\xe8\x2a\x85\x31\xad\x00\xdb\xbb\x76\x87\xd5\x3d\xb6\x40\xbf\x99\xd4\x0c\xef\x8b\x46\x62\x4d\x24\xc1\x6b\xc1\x44\x23\x34\x06\xe9\xee\x0f\x34\x30\xed\xd8\x08\xf4\x6d\xc0\xa0\xf4\x57\x0b\x58\x12\x52\xd7\x36\x44\x27\x89\xec\x9b\xdd\xc0\xf8\x81\x54\xd2\x89\xd8\x4f\x06\xc1\xe7\x27\xd6\x67\x56\x18\x18\xb7\x65\x52\x25\x11\xfc\x7f\x35\xd7\x00\x9f\xb4\xd6\x58\x09\x23\x9c\x58\xaf\x2e\xa9\x90\x87\xd7\x7e\x41\x1b\x65\xb6\x46\xb0\xd1\x22\xf1\x70\x0b\x65\xcc\x2a\x49\x33\x92\x7f\x0a\x8c\xe3\x42\x15\x1b\xb0\x34\x04\x63\x09\xce\x12\xb9\x52\xdd\xc8\x81\x90\x5a\xf7\xb3\xb5\xd2\x92\x74\xc9\x8b\x81\xff\x29\xa7\xda\xf1\x22\x24\x4b\x64\x75\xe0\x7c\x12\x30\x8c\xb8\xe4\x3a\x1e\x68\x38\xf6\xf1\xd1\xaf\x86\x30\xa9\x17\xa4\xb2\x6b\x89\x6d\x88\x5d\x72\xca\xcf\xe7\xb7\xd6\x70\x71\xe4\xd5\x7f\x25\x1a\xca\x0e\xbe\x71\x99\x3c\xbc\x05\x29\xad\x05\xd2\x5b\xbf\xec\x8a\xed\x2b\xe7\xb9\x19\xde\xec\xfd\xfb\x02\x8b\x04\x66\x35\x36\xf1\x1e\xc5\x0a\x19\x85\xf8\x12\xd7\x61\x25\xd4\x66\xed\xc4\x05\xe0\x34\x08\x38\xd8\xc1\x02\xda\x0e\x92\x53\x36\x5a\xfd\xa3\xbc\xaa\xfe\xb1\xe1\x9e\x86\xd5\xfd\x05\xf2\x4d\xca\x11\x20\x77\x82\x22\x64\x80\xf9\x52\x35\x2d\xd9\x26\x23\x01\x77\xca\x6e\x38\x3b\x79\x3a\x09\xe0\x26\xc1\x67\xf6\xd2\x55\x79\xb3\xd6\x89\xaf\xea\xef\x55\x03\x2a\x09\x9b\x6e\x5d\x2c\x75\x16\xc6\xa6\x5c\xff\x09\xde\x27\x58\x1b\xf0\xd0\xaf\xbd\x0f\x99\xd7\x81\x98\xe9\x1d\x27\x43\x52\xaf\xae\xe4\x59\x14\x04\x2e\x70\x0f\x34\xfc\xfa\xfa\x92\x02\xae\x0e\x5a\xb2\x2e\x96\xcf\x87\x96\xe8\xef\x9b\x0c\x09\x19\x20\x56\x54\x41\x70\x1c\x69\x17\x53\xc7\xfd\x73\x30\xfe\xc3\x2d\x44\x61\xe2\xe5\xf1\x7e\x17\xee\x04\x7c\xb8\xef\xfa\xe7\xd1\x8d\xfa\x8c\xa7\x77\x03\x37\xfa\xf9\xfa\xb2\xab\x1e\x93\x20\xee\x9c\xe6\x82\xae\x36\x56\x83\xe7\xe0\x27\xe1\x99\x11\x9b\x71\x8b\x2d\x8e\x6f\x9a\xd7\x07\xc9\x2e\x01\x53\xa5\x5c\xcb\x86\x65\x10\xb8\xfb\x79\x5f\xa2\xf3\xdc\x04\x9f\xb5\x6e\x70\xac\x1f\xf2\xa4\x55\x3a\x5f\x14\xdb\x32\xb9\xd3\x44\xbb\x93\x20\x1d\xd0\x17\x44\x15\xdd\xc0\x85\xe2\x77\xf1\xbe\x2d\x7b\x34\x2b\x1a\xe0\xd7\x88\x52\x7d\xcc\xfa\x2a\x42\x2a\xa6\xb1\x83\x21\xd1\x9b\xe0\xa4\xa7\x0b\x90\x51\xe3\x33\xdf\xd1\x04\xf1\xe5\x2a\x28\x57\x69\x1d\xec\x90\x1a\x64\x89\xbe\x50\xd2\x46\x11\xfe\x1c\xe4\x9b\xcc\xf9\x60\x7d\x50\x90\x32\xdf\x1f\xad\x8a\x8f\xbe\x90\x11\x0b\xaf\x00\xeb\xcc\xdd\x2e\x8e\xc7\x11\x18\x90\xb9\x67\x3f\x1d\xfd\xe1\x0f\x6a\x93\xde\xc5\xcb\xea\xbb\xfd\x4f\x7f\xc7\x9d\xbd\x79\x73\xaa\xae\x62\x75\x1b\xab\x51\xb2\xd6\x47\x7f\x38\xfa\x03\xce\xc1\xe6\x20\x1e\xd4\xbf\x90\xdc\x86\x47\x7f\x68\x73\xa5\x0f\x20\xa3\x65\x3a\x88\xc1\xdf\x47\x7f\x68\x1c\x3c\x45\xa9\x8e\xf9\x28\x28\x80\x9e\x8a\x4a\xd3\x64\x0a\x30\x86\x9e\xb7\x67\x01\x64\xa8\xcf\x8e\xe7\xd1\x1f\xb8\x3c\xe5\xf1\xf1\x31\xb6\xdf\xf8\x7e\xb2\xc1\x1e\x82\xd6\x71\xb6\xd9\x64\x50\x91\xf2\x07\x8c\x03\x0b\x68\xba\xb5\x4b\xe0\xb1\xa9\x10\xaa\x69\x23\xe7\x82\xf7\x3e\xfa\x83\xff\xf2\x8f\x3f\xfe\xf8\xfa\xf4\xec\xf5\x9b\x53\xd7\x46\xdc\x1c\x6e\x2a\x27\x36\xe1\x02\xa6\xa9\x43\x83\x3b\xbd\x8b\xd3\xdc\x1c\x7d\x06\xb6\xa7\x03\x93\xae\x1c\x77\x7e\x54\x5f\x51\xc8\x14\xd5\xcc\x41\xd1\xd1\x89\x24\xbb\x10\x7a\xa2\xda\xc4\x16\x3c\x72\x29\x18\x2c\xab\x47\x4e\x52\xfd\x42\x5d\x7d\x05\x7d\xf9\x85\x3a\xfb\x0a\xcf\x90\x5f\xda\xec\xab\x96\xe6\x30\xd9\xa1\x7e\xf1\xeb\xf2\x55\x7c\x34\x74\x46\x4a\x98\xb9\x39\x10\x19\x3c\x42\xb5\xe1\xfc\x4e\x7d\xa5\x5c\x97\xa9\xd2\x0a\xca\x3f\xc5\xfb\x20\x7e\xdf\xde\x48\x44\xba\xe7\x2e\xec\xda\x8c\x4a\xb3\xd2\x89\x13\x64\xd9\x5e\xaf\x80\xd3\x02\x3e\x3e\xeb\x0d\x2d\x97\x80\xf0\x09\xf9\xc7\x64\x27\xd4\xd6\x61\x4a\xc0\xf2\x5f\x6a\x24\xb7\x60\xca\x0d\x17\x7e\xa3\x97\x09\x1f\x39\x43\x94\xc3\x36\x5b\xd6\x2e\xa2\xb9\x66\xd8\x26\x9c\x31\x7c\xf6\x65\x3b\xa0\x3a\xe7\x42\xd3\x7d\xef\xa2\x72\xe4\x35\xd2\xcd\xb3\xb2\x58\x49\xa2\xed\x12\xb3\xd6\xc8\xec\x9a\xd9\x5e\x67\xe9\x37\x7d\x68\x99\xdb\xc7\xe2\x23\x6d\x47\xd0\xd1\x5a\x27\x79\xba\xd2\xa6\xb2\x9b\x30\x3e\x4a\xc9\x16\x80\x23\xde\x61\xc3\x92\xb9\xd1\xe4\x75\x02\x7a\x1a\xf0\x21\xc5\x22\xc9\x50\x8f\x32\xad\x28\x91\x35\xd7\x75\x22\xc3\x43\x23\x8c\xd1\x6e\x71\xdf\xce\x77\x88\xed\xc5\x4a\xc9\x32\x0d\xbd\x1e\xc0\x1d\xd8\x97\xc5\x98\x01\x06\x7e\x31\x3b\x32\x6c\x5d\x31\x46\xa0\x88\xe6\x3a\x29\xf7\xc6\x8c\xeb\x88\x76\x70\x89\x8a\xfc\xe9\x38\x4c\x54\x0f\xe1\xcb\x3c\x38\xfe\xde\x0f\xf4\x0b\x61\x7f\x1c\xf3\x4e\x49\xd2\x8a\x36\x22\xd3\xc3\xb6\xee\x10\xa1\xa6\xe1\x73\x6f\x48\xaf\x80\xe6\x96\x16\x43\x27\x63\xe6\x10\xc1\xc2\xfb\x01\xd9\xf8\xeb\x1f\xa6\x85\x5a\xba\xd6\x24\x0f\xf7\x22\xa9\xf4\x5d\xc1\x62\xbd\x8d\xaf\xc5\x47\x17\x6d\x61\x6c\x36\x7c\x3d\x5e\xcc\x95\xb3\xb8\x4a\xc9\x2e\xd1\xb1\x56\xda\xdd\xbf\x22\xa8\xc8\x93\x4a\x64\xe0\x08\x30\x4f\x1f\xea\x49\x1d\x39\xb5\x31\x0d\x76\x4b\xbc\x51\x1d\x1f\x0e\x52\x62\x5f\xf6\xf7\x02\xa2\x1f\xfb\x7b\xf1\x72\x4c\x29\xc6\x85\xf6\xae\xd8\x5a\x9e\x84\x28\x09\x1d\x44\x40\x76\x74\xa9\x17\x19\xad\x7f\x9e\xac\x5d\xf3\x05\xe4\xc4\xb5\x3e\xf5\x7f\x66\x51\xe5\x7f\xa3\x9f\xf8\xf5\xf0\xba\xf7\xfb\x95\x7e\xc2\xcf\xe1\xfa\xcf\xb3\xd3\x0f\xef\xce\xea\xf5\x9f\x6f\xdf\x7d\xf8\x7b\xfd\xe7\xdf\xe2\x67\x78\xdd\x53\x17\x45\x5e\x39\xb7\xd5\xb3\x42\x3c\x9c\xc6\x6f\xd0\xbc\x82\x3f\x15\xa5\xe4\x4e\x70\x65\xd1\x4b\x1f\x42\x4c\x02\xe2\x9d\x5e\x59\xa5\x8b\x4c\xab\x53\x44\xad\x77\xf7\xd2\xca\x3b\x1f\xd3\x3d\xf9\xb8\xe3\x7a\xd1\xe9\x22\x9d\x43\xa0\x96\x59\x11\x81\x7b\x1b\xa4\xb5\xde\x2d\x17\xdd\x25\xe9\x65\xdd\xce\x60\xe0\x5f\x1b\x54\xb3\x26\x8e\x1c\xf7\xa9\xb7\x5a\x08\xbb\xd4\x3e\x7f\x22\x88\xcd\x51\x96\x8d\xa3\xeb\xe1\x73\xe2\x23\xdf\xd4\xf1\xb9\xcb\x94\x99\x2e\x15\x5a\x74\xce\xd3\xbb\xb4\xb2\xf6\x88\x9d\x1d\x7a\x99\x0e\xd1\x4d\xac\x75\xc2\x2a\xd8\xc0\x40\xb4\x09\xaf\x6d\x88\xe2\x22\x61\x28\xf9\xea\x39\xc5\x42\x49\x5c\x14\xd3\x83\x5c\xfc\xd0\xa9\x8f\x59\xed\x31\x6d\x3d\xf1\xc0\x13\x72\x79\xdd\x22\x69\x1b\x54\x2e\x38\xe8\x9c\x13\xf4\xfa\x05\x0f\x62\x16\xd5\x7a\xd4\xb8\x66\x5f\xf1\xf5\x12\x39\x6d\x7e\x58\x2f\xd6\xe8\x44\x35\x41\x19\xe3\x4f\x96\xc9\x86\x74\x00\x50\xcf\x1f\x1a\x44\x8f\x30\xa0\xb7\x6e\xae\x26\x2f\xed\x05\x50\xcc\x45\x02\x98\x60\x14\x39\x69\xed\x7f\xae\x1f\xb3\x9d\xd4\x65\x2d\x75\x55\xa6\x1a\x24\xc7\x21\x4d\x2a\x31\xc3\x84\xa6\x7e\x46\x4f\xec\x9f\x07\xeb\xb9\x5e\x5a\xfb\xed\x02\xb2\xc3\xf4\x65\xee\xc5\x39\x7b\x84\x17\x0e\x33\x20\x64\x90\xdb\x22\x1a\xd4\x33\xa0\x88\x0e\x3b\xc6\x95\x1d\x6e\x55\xf6\x91\xe8\x22\x98\x40\xda\x9c\x32\x17\x5e\x28\x0d\x59\x54\x2d\x8a\x15\x48\x47\x7f\x49\x2d\x61\x46\xc1\xc7\x6c\xec\x37\x0b\x26\xd2\x88\x20\x9c\xe7\xe3\x30\x18\xdf\xda\xa4\xa0\x58\x63\x22\x35\xfb\xd9\x47\xad\x38\x24\xa9\xe6\x65\x91\x2c\x17\x09\xfa\x45\xd4\x10\x7a\xdf\xdc\xc1\x90\xf7\x6b\x71\x9f\x94\xc9\x02\x94\x09\xf4\xf7\x2a\x12\xcd\x6f\xee\x8b\xca\xb6\xbe\xb9\x4f\x17\x2a\xa5\xdc\x0d\xff\xdb\xec\xd6\xf3\x22\xf3\x70\xd7\x7b\xf4\x96\xb8\xda\xa4\xd3\x3a\x0f\xb5\x15\x7f\x7d\x7e\xe1\x5c\x2f\xec\x7c\x6d\x80\xe5\xc2\x79\x48\xca\xb4\xd8\x1a\x6f\xa0\xb9\x57\xf7\xf4\x4d\xcf\x5a\x3a\x0c\xc2\xd4\xbc\x7e\x48\x3f\x2a\xe1\x53\xce\x85\xb7\xd8\xe1\xe2\x73\x83\x6d\xc9\x02\x4e\xe9\x70\xfd\xd9\xa3\xba\xb6\x22\x1d\xe5\x99\x2f\x45\x0d\xda\x72\x23\xef\x56\x87\xc8\x65\xee\x5f\xc7\xee\x75\x5d\x4d\x29\xbf\x49\x24\xc4\xc3\x28\xf0\x45\x64\xda\xbe\xde\xa3\xf0\x6a\x51\x6d\x1b\x56\x4a\x6d\x30\xd8\x61\x25\x8e\xce\xb0\xdb\x5c\xcc\x5a\x17\x90\x6c\xed\x3c\x57\x01\x75\xfa\x74\x70\xf3\x6a\xf0\x42\x2e\x46\x97\x0f\xba\x74\xd1\x9d\xf0\x04\xfd\x21\x56\x9d\x89\xbc\x03\xed\xcb\x8e\x61\xd9\x0c\xbe\x6f\xb2\x82\xc8\x4b\x82\x35\x26\xef\xcc\x08\x31\xd9\x2b\x14\xd2\xf7\x77\x67\x04\x9c\x5f\x3a\x62\xc4\x22\x7c\x6a\x9d\x1a\xd4\x4f\x21\xba\x36\x3a\x67\x35\xd2\x0a\xd3\x99\xeb\x8e\x51\x08\xa9\xba\xf3\x55\x8b\xde\x70\xa1\x4c\xc7\xdd\x8c\xe1\x1e\xc0\x9c\xa0\x28\xab\xd8\x63\x5e\xb4\xdd\x2b\xf2\xdc\x00\x49\x53\xac\x6e\x3a\xd4\x0c\x1d\x92\xae\x33\xfe\x1e\x3e\x53\xc7\xa0\x1d\xae\xbc\xe4\x71\x37\xb4\x7f\x48\x35\x9c\x02\x5d\xde\x46\x10\xf5\x49\x85\xcb\xc2\x34\x9e\x4c\x6b\x0e\x83\xcf\xd6\x09\xda\xe6\x15\x78\xb8\x2d\x18\x70\x19\x06\x17\x64\x71\x4d\xdd\x13\xbf\x40\xbc\x3e\x95\x7c\x8a\xb4\x74\xb2\x9d\xa8\x6d\x6b\x74\x2f\x24\x18\xab\xdd\xea\x10\xb7\xc9\x0b\x65\x38\x0c\x5b\x33\x9a\x24\x2a\x8f\xd7\x18\xf4\x03\x83\x4d\x75\xd1\x9c\xc6\xc3\xdb\x9e\xc9\x9c\x46\x89\xf1\x25\xd3\x59\xb6\x6b\x10\x0f\xf2\xd5\xde\x7c\x14\x90\xd7\x96\xc9\x52\xaf\x93\xf2\x5b\x84\xff\x09\xe9\x00\xb0\x8e\x10\x8b\xa0\x95\xfd\x63\x63\x4e\x63\x32\xc3\x66\xc1\x44\xa3\x6a\x31\xa0\xe9\xf6\x5c\xca\xa4\x49\xe4\x98\xaf\x78\xa7\x23\x8b\x01\xaf\x0d\x28\x6f\xda\x03\xfd\x7f\xe6\x74\x93\xed\xd6\xec\xdf\xbe\xf5\x17\x1d\x36\x01\x52\x7b\x7f\xa7\xc0\x00\xbc\x4e\x2a\x5d\xa6\x49\x66\xa8\xa6\xb0\x7e\x25\x25\x94\xbc\x70\xb9\xbe\xc6\x1d\x6a\x54\xfd\x42\x7c\xdb\xd6\xd5\x45\x91\xdb\x93\x49\x3d\xe3\x4c\xf3\x9b\xa1\xde\x47\xfb\xf9\x7d\x97\xe6\xde\x21\xd6\x0b\xe4\x76\xb8\x4e\xca\x04\xee\xf3\x88\x58\xe9\x1c\xbb\x67\x51\x82\xfa\xbf\xf8\x0d\x61\x6b\x0c\x99\x80\x18\x0a\x24\x63\x06\x95\x9a\xfd\x61\xd4\x84\x50\x04\x56\x49\x04\x4f\xda\xe6\x4e\x6d\x33\x5f\xba\xdb\xbd\xd4\x0c\x11\x85\x46\x5d\x4d\x2d\x02\x25\xfc\x00\xea\xef\xc0\x53\x67\x5e\x64\x05\x7a\x99\xdd\x44\xd5\x6c\x71\xc2\x4d\xd7\x7e\xbb\x97\x1b\x30\xf4\xe1\x92\x60\x5d\xbe\x6f\xe9\x2e\x41\x8d\x4c\x38\xd9\x45\xb9\x67\xae\xf7\xbd\x80\xbb\xfa\x6b\x6f\xbd\xcf\xd4\x09\x2d\x90\x15\x30\x02\xe6\x4b\xaf\x2b\x5e\x5f\x39\x64\x5e\xe0\x50\xb4\x0f\xe1\x3d\x67\x6e\xfc\xcb\xe1\x20\x41\xed\x43\x5e\x38\x41\x7e\x29\x73\xd6\xea\x6a\xa6\xcc\xca\x88\x7e\x08\xc6\x2a\x17\x95\x93\xf1\xf8\xd0\xb6\x69\xf8\x42\xdf\x73\xcb\x00\x54\xad\x7d\x8b\x43\x0e\x94\x0f\x67\x78\x18\xd2\x2a\xf1\xbd\x9f\xed\xf8\xe6\xaf\xc2\xfc\x7e\xa9\xeb\x42\x49\xf5\xa7\xda\xc3\x56\x4a\x4d\xbf\x60\x37\x1d\x77\x26\xa2\xf9\x4e\x37\x7a\xe9\xc1\xc8\xf7\xf7\x5b\xbf\x9b\xd5\x19\xdb\x4b\x2d\x87\x0e\xac\xff\x28\x8c\x28\x38\x74\x97\xec\x4b\x73\x8f\x34\x62\x18\x04\x2b\xc4\x18\x29\x1b\xcb\xf5\xd1\xf9\xc9\x39\x44\x91\xcf\x32\xd7\x17\x0f\x82\xd0\x5f\xfc\xa2\xa7\x08\x74\x14\xdd\x76\x2b\x3b\xec\xba\xb7\x73\xde\xaa\xe3\x09\xc7\x94\x8b\x1c\x4d\x1c\xc7\x34\x44\x24\xf0\x6c\x8d\xbb\x83\x92\xbf\xbc\xef\x38\xf0\x18\xfa\xd2\xb7\x6d\x98\x35\x02\x00\xfd\xf5\xb1\x4c\x4d\x30\xda\x4b\xbb\x24\xcc\x16\xf2\x6b\x85\x78\x43\x14\x56\xfa\xc1\x5f\x00\xb5\x2e\xd5\x19\x2c\x44\x48\xdb\xa9\xf3\xeb\x4a\x49\x48\xf6\x2c\xf8\x02\x7f\x0a\x10\x01\x61\x8f\x9a\xc5\xd5\x8d\x43\xb3\x28\x5b\xf4\xff\x8b\x1c\x92\x67\x98\x4f\xc3\x8a\x4e\x7b\x49\x90\x3a\xf1\x9a\xf5\xda\xc1\xf4\x63\x98\x2f\x81\x39\x01\x37\x49\x92\x22\x2c\xa5\x67\x0d\x21\xaa\xa6\xaa\x8a\x2a\x11\x8c\xb2\x9b\xc2\x54\xc9\x9d\x8e\x94\xa9\x8a\x32\xb9\xd3\x70\x67\x6c\x51\x5c\xfa\x3e\xc9\x97\xf0\xbc\x95\xd6\xe6\xa7\x50\x97\x3b\x24\x7e\xac\xbd\x14\x50\xc8\x86\x22\xc6\x35\xa2\x0f\xac\xbc\xf4\x9e\xa9\xf3\x09\x97\xa8\x5b\x02\xbc\xaf\xde\xec\xad\x88\x37\x16\x83\x6f\xf0\xbd\x3d\xab\x94\x18\x74\x04\xce\x1c\x38\x0a\xe8\x40\x6d\x8b\x59\x34\x26\x04\x59\x21\x62\x01\x7d\x1f\x52\xbe\x8b\x54\x89\xed\x59\x55\x9f\x6a\x9a\x24\x88\x57\xc0\x0c\x86\x42\xb0\xad\x3d\x2d\x38\xbe\xd4\xfa\xe7\x3a\xf7\xa6\xf0\x40\xd2\x12\xf4\x10\xc0\xe7\x6a\x53\x07\x22\xde\x4f\x27\xfc\xc2\xc1\xb2\x2e\x09\x96\x71\xed\x33\xf8\xa7\x58\xaa\x49\x59\x68\x06\x87\x2d\xb4\x28\xce\xb7\x8d\xd5\xdb\x8a\x14\x15\x3e\x33\x5e\xd0\x9e\x34\x15\xa3\x49\x13\xaa\xe1\x7c\xf6\x3b\xd6\x9b\x77\xa3\xff\xb6\x5b\x3f\x81\xed\x66\xf3\x6c\x0e\xcd\x36\xeb\x27\x6c\x8d\xbf\xac\x25\x8e\x4a\x8f\x7a\xd7\x65\x4d\x27\xb6\x82\xe1\x15\x59\xc1\x3a\xd4\xd9\x69\xbb\x36\x13\xb7\x64\xd1\x45\x80\x05\x8d\x5f\x42\x9a\x8c\xa0\x85\xc6\xf1\x4a\xdd\x78\xdf\x85\x78\x35\xdb\xa7\x2c\xad\xf3\x92\xf3\x21\xe1\x5d\x6c\x6d\x82\xa4\x4a\x0d\x97\x1c\xb4\xc9\x0a\x6e\xdc\x41\xc9\xb4\x7f\xee\xae\xe1\x32\x6d\x57\x99\x4b\xd0\x66\xc1\x3f\x56\x28\x53\xd4\x38\x70\xfc\x5c\xc9\x0d\xb2\xc7\x9b\x6e\x3f\xb2\x3f\x3c\x71\x58\xd7\xef\x3e\x64\xd2\xf1\x01\xab\xb6\xc3\xbc\x7e\x7e\x87\x97\x3a\x10\x3e\xe0\x31\xfa\xd4\x54\xcb\x93\xa1\xbd\x21\x54\x29\x0d\x2c\x20\x29\x6a\xbf\xaf\xbd\xf6\xb5\x8e\x3a\x76\xc1\x81\x1b\xd8\x80\x7b\x3c\x62\xe7\x34\x09\xe8\xf0\x39\xe3\x8a\x03\x6d\xa5\x4f\xb7\xa0\xe3\x80\x9f\x19\x4f\x1c\x97\x2e\xc8\x65\x8c\x6e\x5b\xe5\x92\x3c\xb3\xae\x17\x25\x6a\x3c\x84\x55\x4a\x06\x93\xe1\xcf\xfe\xd7\x81\xd2\xd2\xa7\x9b\x19\x68\x3b\x80\xdc\xc3\xe0\x5c\xcd\xc6\x81\xd2\xd2\xf8\x42\xcd\x86\xb3\xcb\x41\x24\xb5\x91\x06\x57\x83\xd1\x4c\x6a\x2b\x01\x21\x36\xa8\x7c\x5c\x0c\x67\xa3\xc1\x74\xba\x57\x65\x29\x52\xbd\xc9\xc0\x2b\xf8\x9c\xc7\x6a\x38\x52\xa3\x31\xa8\x7d\xcc\x84\x12\x8b\x1b\x0b\x2f\x8e\x72\xe1\x34\x57\x50\xff\xc4\x2b\xa1\x48\x01\x14\xa7\x8a\x02\x52\x1b\xe7\x83\x73\xfb\x5f\x83\xab\xeb\xcb\xde\xe4\xf6\x80\x3c\xca\xf1\xc1\x21\xf9\x68\x87\xae\x7f\x33\x81\x17\x47\x69\x91\x4f\x24\x7b\x74\x0e\xaa\x28\xa0\x5c\x82\x42\x4a\x83\x8f\xae\xd1\xde\x64\x38\xf5\xca\x20\xb7\xd3\xd9\xe0\x8a\x15\x52\x3e\x92\xa8\x0a\x2a\x2d\xdd\x5c\xb3\x60\xc7\xe0\xcf\xc3\x29\xa8\x89\x9c\xf7\x66\x3d\xd0\x1b\xc1\x39\x83\xcf\xcf\xec\xbf\x2e\x86\xb3\x69\x37\x52\x5f\xc6\x5f\x07\x3f\x0f\x26\xaa\xdf\xbb\xb1\x33\x6e\x97\xca\x18\x25\xa3\x50\x13\x27\xd0\x37\xf1\x02\x39\xc3\x91\x90\xc1\x99\xce\x26\xc3\xfe\x4c\x28\x9d\x8c\x0f\x29\xe8\x04\xaa\x39\x5d\xf7\x72\x24\x54\xf5\xb5\x77\xab\xc6\x37\x33\x96\x62\x19\x8e\xa6\xb3\xde\xe5\x25\x89\xc9\xdc\xd8\x89\xb7\xbf\x9e\x0c\xae\x27\xe3\xf3\x9b\xfe\x8c\xd4\x4a\xc6\x2c\x07\x76\x39\x16\xaa\x25\x2f\x58\xcb\xd0\x65\xd0\x40\x19\x4c\xfa\x43\x2f\x2d\x35\x19\x7e\xfe\x32\x9b\xaa\xcf\x76\x1d\x4b\x39\x29\xaf\x2b\xd3\x3b\xff\x79\x38\x7d\x9e\x76\x0c\xf9\xef\x41\x20\x31\x65\x87\x30\x2f\xa4\x1a\x3b\x5c\xb7\x66\x53\xa0\xb0\x25\x4a\x2f\x31\x6b\xe0\xbf\x6e\x89\x38\x0f\xaf\x35\x7b\x13\x80\xeb\xe6\xd3\xb2\x22\xfe\x0a\x6a\xfb\xa4\x89\x8e\x9c\xe0\x79\x4e\x75\x03\xee\xce\x96\x55\xa1\x11\xdf\x97\x78\x3a\x3f\x3b\x1a\xd3\x96\x94\xaa\x5d\x8c\x84\xa0\x2b\x56\xde\x01\x79\xa7\x8e\x67\xa1\xe2\x93\x3b\x0e\xbb\x22\xec\x06\x62\x2e\xcd\x03\x93\x3d\x90\xbb\x54\xe8\x42\x83\xc0\x66\xb1\xc2\xd8\xef\xa6\xda\x9f\xf9\xd8\xd5\x43\xb7\x2e\x5d\xe0\x14\x2d\x13\x03\x5c\x58\x2a\xa9\x25\x74\x55\xa9\x3d\x06\x0c\xdc\xe7\x7d\x21\xde\xc7\x64\xc7\x97\xea\xa8\xa8\xec\x88\x43\xb5\x2a\xdb\xbc\x42\x7a\x24\x0c\xf0\xed\x89\x4c\xd1\xdf\xb0\x26\x2a\x10\xfb\xe2\xf2\x99\x17\x45\x8a\x1b\x83\x10\xb5\x0f\x71\x28\x65\xe6\x25\xce\x1c\x0f\x81\x13\x5f\x77\xa8\x3e\xc8\x86\x32\x9a\x59\xa8\x7a\xd5\xaf\x7d\xc9\x61\x8f\xb9\xa7\x97\xc6\x01\xdb\x56\x5e\xc3\xc5\xfc\xa9\x26\x80\x5e\xef\x96\x14\x6f\x40\x51\x32\x17\x47\x76\x82\xa3\xb8\xa1\xe4\x22\x58\xe8\xf4\x81\xa7\xb2\xad\x1b\x6d\x56\x2d\x2c\xd4\x5a\xd0\xe8\xf1\xbe\xa0\x69\x84\xfe\xb5\x83\x03\xde\xab\xe3\xcf\x8e\xaa\xfe\x32\x79\xe4\x0d\x32\xbc\xee\xbd\x4c\x91\x36\xd0\x48\x67\xe8\x71\x8e\x8b\xaa\x6d\x7a\x8c\xce\xec\x80\x38\xc6\xa7\x60\x81\x50\xc4\x7d\xbf\x18\x6b\x10\xe3\xda\x1a\x0a\x79\xc2\x2c\xf3\xd0\x3d\x6f\xb2\x23\x15\x06\x65\x0e\x0d\x7c\x63\xfe\x63\x6a\x13\xd5\x83\xd0\x97\xa6\x54\x82\x0b\xda\xec\x0b\x68\x78\xa4\xf3\x65\xf2\x68\x5f\xeb\x5f\x92\x4d\x92\x87\x42\x13\xe0\xfe\x66\xc9\x23\xab\x93\xb0\xd4\x88\x71\x9f\xf7\x61\xfa\x76\xc1\x15\xaf\x2d\xe2\xfd\x1e\x68\xd0\x37\xf0\xfb\xe2\x7f\xe2\xd7\xfd\xcb\xe1\xf4\xfa\xc4\x21\xf5\x4e\xce\xe2\x37\xbf\x31\x1e\xec\x30\xfe\xeb\xcd\xfb\xb3\x37\x6f\x6b\xf8\xaf\x77\x6f\x7e\x78\xfb\x77\xfc\xd7\xdf\xe2\x67\xba\x5d\xaf\x93\x72\xf7\xd3\x51\x80\xf0\x4e\x0d\x52\xbf\x31\xd2\x00\x95\x47\x16\x90\x4e\x16\x41\x93\xb4\xaa\x15\xc5\xee\x53\x81\x3e\x58\x28\xc5\x47\xc7\x19\xd4\xd1\x4a\xf5\xe6\x8a\x84\x52\x04\x90\xb9\xd8\x52\xe5\xc0\x47\xa0\x34\x06\xb7\xfc\xf3\xe8\xe6\xe4\x33\x96\x90\x85\xef\x20\x43\x79\x74\x89\xde\x17\x1b\xed\xc8\xa8\x98\xc4\x72\x6b\xf4\x6a\x9b\x61\x09\x1c\x6b\x8f\xa0\x59\x8a\x5e\xd2\x47\x77\xe7\x11\xed\x60\xa3\x56\x1b\xae\xe0\x9a\x4b\x63\x8f\xa4\xa7\x3c\x1a\x2f\x59\x72\x60\x80\x56\x8c\x8a\x46\x05\x77\x83\xb4\xbf\x54\x9e\x07\x49\x07\xa7\x91\x13\xc6\xf5\x0e\xb4\x19\xf0\x1f\xfa\x51\x03\xba\xc8\xbc\xa8\x22\xa8\xb3\xd6\x52\xad\xa6\x6d\x12\x22\x35\xcc\x17\x71\xa4\xde\x9f\xaa\x8b\x32\xc9\xbf\x65\x69\xae\xa6\x55\xa9\x75\x15\xa9\x8b\x74\x55\xdd\xab\x8b\xac\x28\xca\x48\x7d\x2a\x4c\x65\x3f\x7e\xd5\x53\x6f\xce\x4e\x4f\xdf\x9c\x9c\xbe\x7d\x73\x6a\x4d\xfb\x1e\x72\xff\xd1\xfa\xf3\xe5\x09\x10\xfb\xb4\x7e\x14\xf0\x89\xa3\x41\xbb\xf1\x16\x65\x52\xa9\x72\x0b\x49\x4b\x38\xbe\xa8\xbc\x2b\x2d\x97\x27\xac\xbe\x05\xaa\x05\x21\x1f\x2b\x7c\x14\x03\x84\xe0\xaa\x93\x36\x36\x54\xb0\x40\xcc\x4c\x7f\xaf\x74\x99\x27\x99\x83\xf6\x70\xfb\xaf\x0c\x43\x23\x5c\xc3\x02\x08\xaf\x7a\xd7\x43\x0c\x29\x3a\x73\x63\xbe\x53\x6b\x6f\x3d\xf4\x8b\xf5\xba\xc8\xd5\x65\x6a\x36\xb0\x70\xb4\x13\x09\x34\xea\x38\x4f\xd6\x3a\xdb\x11\xf8\x85\x1a\xef\x8f\xaf\xae\xc6\xa3\x13\xec\xaf\xf8\xc7\xc9\xcd\xd4\x7a\x21\x7f\x1a\xdc\x7e\x1d\x4f\xce\x23\xd5\xbf\x1c\x4f\x23\xeb\xa7\xdc\x82\xcb\xda\x8d\x54\x1a\xeb\xd8\xbe\x21\x20\x63\x96\x45\xfe\x0a\x22\x8d\xa0\x5f\x84\x23\x05\x8c\x56\x39\x27\x4e\xa9\x58\xc8\xa8\x47\x9d\x65\x3c\xa4\xcf\xe9\x78\xac\xc6\xa5\x9a\xff\x0f\x1d\x46\xf4\x0a\x8a\xb5\x7f\x95\x08\x16\x12\x8e\x20\x83\x11\x22\xf9\x7e\xad\x8b\xcf\x31\x82\xb8\x60\x2f\x6c\x38\xa2\xec\x5c\x78\x99\xfb\x44\x7d\xbe\xbe\x04\x38\x67\x52\x41\xa1\x4b\x16\xc8\x0f\xfb\xd5\x9e\xa8\xbb\x52\x27\x55\x08\x30\xd8\x37\x28\xb5\xd5\xb0\x6f\x1d\xb4\xaa\x1d\xea\x25\xc5\xde\xef\xa8\xbe\x02\x86\x63\xb5\xcd\x17\x98\x02\x00\x06\x09\x28\xa1\x74\x41\xcd\x97\x76\x8f\xa2\xd9\xe1\xd6\x6e\x95\x11\x20\x5f\xb0\xd3\xe9\x74\x98\xbb\xf7\xb1\x28\xbf\xd9\x7f\x3b\x45\x4d\x77\xde\x5d\x5f\xc6\x6a\x44\x66\x2b\xd6\x6f\xa5\x90\x8a\xdc\x80\x66\x9a\x1d\x74\x1a\x17\x0c\xa9\x32\x9e\x14\x3f\x41\xe6\xe5\x9a\xd8\x3b\x5d\x40\x92\xde\x1b\xb4\x6a\x87\x97\x83\x93\x8b\xe1\xe5\x20\x56\x5f\xb5\xaf\x8c\x36\x2d\xef\x62\xa0\xcb\x69\xbe\xd4\x1b\x9d\x2f\xb1\x38\x0f\xbb\xed\x99\xdb\xe1\xbc\xae\xeb\x0c\xe8\x75\x51\xee\x10\x70\x48\x15\x15\xcc\xb8\xe4\xd3\x2d\xdc\xa5\x69\xef\xe7\xc1\x70\x34\x9c\x5d\x0d\xae\x98\xf4\xea\x31\x91\x5f\xc0\xcc\xb7\x75\x40\xfc\x59\x59\xef\x53\xc4\xf8\x48\xe1\x2d\x01\xa1\xc7\x02\x16\x65\x0e\xcf\x5c\x3b\x57\x14\x61\x40\xd6\xd1\x63\xcd\xb9\xe0\xca\xb9\xbe\x14\xaa\x88\x72\xb5\xf3\x21\xac\x4e\xc0\xd3\x4d\x0d\x6f\x59\x00\xc4\xe0\x9f\xd8\x1c\x80\x3e\xd8\x37\x61\x14\xf3\x7c\x9b\x66\x98\x04\x0b\xc6\xe7\x24\x92\x8f\x29\x6a\x73\xcd\xfd\x0a\x67\x86\xd6\x37\xc4\x5b\xf6\x34\x7b\x2c\xfb\xbd\x22\x40\x25\x23\x14\xc5\xd6\x46\xde\xcc\xfa\x68\x5a\xdb\x04\xfc\x8b\x2e\x15\x60\xf3\xfb\x12\x29\x15\x98\xda\x2c\xc8\xb0\xb7\x0f\x1c\xde\x30\x3a\x3e\xba\x28\x4a\x9d\xde\xe5\x90\x46\x87\xdd\x04\x1d\x63\x82\xb7\x2c\xcd\xbf\xf1\xf1\x82\xc3\x08\x14\x1c\xc9\x92\xc9\x57\xf1\x97\xac\x0e\xbb\xdc\xe5\xc9\x3a\x5d\xc0\xd7\x00\x13\xc6\x79\x46\xbd\xde\x54\x1e\x29\x29\x6f\xe4\x58\x0d\xed\xa6\x21\xd8\xc0\x12\x8a\xe3\x75\x1e\x98\x58\x2b\x84\x9c\x8b\x5e\x44\x2e\xb9\xda\x5e\xf9\x0f\x56\xdb\x7f\xb5\x09\xfc\xff\xeb\x9f\xf8\xf5\xd5\xf4\xe4\xfa\xf2\x77\xad\x00\x7a\xca\xff\x3b\x7d\xff\xa1\x5e\xff\xf3\xfe\xc3\x0f\x7f\xf7\xff\xfe\x16\x3f\x57\xe9\xa2\x2c\xac\x9b\xd7\xa0\xaf\xb8\x32\x27\xd7\x97\xdd\x9a\x10\x15\x84\xa2\x8c\xbc\x1a\xdd\x0d\x81\x46\x02\xba\x08\x4e\x7d\xc6\x01\x1e\x1d\x57\x19\xdd\x2a\x20\x79\x1c\xb2\x70\x04\x7a\x35\xee\x23\xda\x93\x44\xd0\x9f\xea\x6d\x32\x54\x53\x14\xd1\xb0\x78\x38\xba\xa0\x1d\x87\xf2\x89\x3a\xfe\x1f\x15\x6a\x74\x77\x04\x99\xb6\x3d\xbb\x4d\x44\x4a\xdf\x12\x20\xdd\x21\x6e\x67\xbe\xa9\xd6\x3a\x01\xa3\x08\xeb\x3e\x38\x98\x0f\xba\xda\xde\x85\xc9\x92\xc7\x58\xf5\x54\xc7\x11\xa5\x41\x43\xa4\x23\xe7\xd8\xe7\xfc\xc8\x30\x6d\xd5\xd2\xe5\xba\xcb\x3a\x67\xa0\x1f\x5f\xd9\x6e\x51\x76\x90\x50\x62\xc7\xc5\xf7\x61\x09\xbc\x36\x2c\x0c\xed\xab\xa5\xda\x38\x7c\x7c\x1d\xd0\x26\x01\x15\xd3\x0e\x12\xf9\x28\xf1\x24\x6b\xc2\x27\x88\xb1\xcc\x92\xd4\xf9\x62\xc8\x5c\xc3\x4a\xb2\x79\xe3\x79\x1c\x07\x73\x00\xeb\x09\x04\x59\x85\x3c\x82\x8f\xb7\xc1\x67\x4e\xd4\xf4\x10\xde\xd0\xad\x09\x0f\xb9\x14\x4b\x25\xa0\xe2\xac\xe9\x7a\xa6\xb9\x37\x5a\x22\xc4\x59\x8b\xd7\x63\x88\x37\xac\x52\xb8\x6b\x1d\x63\x6c\x64\x97\x47\xb6\x7c\x4c\xed\xdd\x57\x16\xbb\x24\xab\x76\x27\x10\x25\x11\x53\xee\x61\xe0\x1e\x59\x56\x1f\x0b\x40\xd4\x6f\x50\xd8\x25\x5c\x7a\xc0\xd2\xd5\xf8\x74\xcd\x38\x6c\x4c\x25\xad\x9b\x46\x63\xce\x88\x43\xa0\x4e\x2c\x54\x0d\xae\x71\x0a\xff\xdb\x8d\x74\xa8\xbe\x18\xf0\x1f\xd3\x92\x65\xe9\xae\x88\x98\xa8\x93\x25\x43\xfd\x8c\xce\xb2\x08\x05\x29\x50\x8b\x2a\xc9\xec\x5b\x01\xa9\x43\xc4\x71\x2c\x9f\xf1\x5f\xa6\x66\x53\xe0\x31\xd7\x18\x71\xb6\x82\x39\x20\x02\x45\xec\xcd\xa9\xac\xee\xf5\xc1\xef\x71\x8e\xbf\x1f\x8e\xe1\xa5\x1f\x43\xb1\x3f\x46\x85\x9a\x31\x94\x9d\x0f\xe9\x93\x50\xf7\xd1\xe1\xc5\x60\x68\x51\x3c\x19\x73\x19\x54\x96\x60\x97\x89\x98\x02\xf3\x8a\x90\x2e\x59\x71\x57\xc0\xf9\xe3\xc0\xf2\x46\xae\x16\x3a\x99\xe7\x54\xee\x2d\xf7\xbf\x93\xc4\xae\x35\xad\x20\x6a\xe3\xe6\xc4\xad\x44\xfc\x0e\x50\x60\xad\x6c\x73\xde\x9f\x09\x6e\x08\xfe\xaa\x57\xc7\x74\xf9\x13\xf9\x90\xda\xa9\xa8\x74\xbe\x34\x61\xda\xca\xbd\x46\xdf\xbd\x46\xc0\xe8\xb7\x93\x0a\x07\xcd\x8b\x0a\xac\x57\x4c\xfb\x51\xcd\x06\xed\xf4\x88\x3a\x18\xc9\xfa\x02\x30\xf4\x2b\x3f\xdd\x4d\x3e\x5d\xac\xa4\x69\x5d\x07\xb6\x93\xe7\x2f\xec\x24\x6c\xb1\xd0\x4d\x59\x7b\xb5\x10\x00\xf7\xa0\xf7\xd7\x3c\xed\xed\xb0\x0b\x12\x42\x27\x38\x13\xc2\x54\xf8\xc3\xcc\x04\x19\x96\xdc\xc6\x2f\xef\xad\xf3\xcd\xec\x12\xc1\x53\xa7\xa5\xe7\xd0\x67\xec\x7e\xab\x00\x10\x4a\x5c\x7b\x3a\x5e\x49\xaf\x44\x43\x39\x40\x30\x8e\x7f\xb6\x38\x2a\x3a\x89\x39\x49\x4d\xdc\x01\xe2\xb4\x39\x53\xa3\x00\x4d\x66\xb1\x22\xfa\x93\xb4\x72\x64\xde\x6e\xbb\x20\xcf\x59\x5e\x38\xe9\x69\x4f\xd4\x19\xa9\xbb\x6d\x02\xd8\x59\xca\xc9\x4b\xe9\x06\x76\xf5\xe1\x44\x0a\x69\x10\xcc\x76\xad\xcb\xb0\x1c\x19\x39\xd8\x90\x0a\x25\x79\x34\xae\xd2\x4d\x4c\xc7\x22\xc9\x3d\xe0\x29\x56\xb3\x20\x76\xe3\x99\x28\x5b\xdb\x8b\xc2\x63\xc9\xbe\x16\x1c\xbc\x4b\xdd\x16\xd7\x6e\xe7\x20\x8d\x9e\x24\x20\x25\x99\xc9\xfc\x84\xf7\x39\x66\x35\xff\xab\xad\xdd\xbf\xff\xd4\x7f\xe2\xd7\xfd\xfe\xc9\xa7\xdb\x93\xd1\xf9\xc9\xbb\xdf\x3c\xf1\x47\x3f\x87\xfd\xbf\x77\x6f\x3e\x34\xf4\xbf\xcf\xde\x9e\xfd\x5d\xff\xfb\x6f\xf2\xd3\x07\x30\xf6\x83\xa6\x40\xad\x51\x3d\x7f\x81\x9d\x8c\x8a\x73\x67\xd6\x18\xf5\x2e\x7e\xa3\x86\x18\x35\x66\xce\xa1\xfa\x97\xfb\x45\xb9\x29\x88\x01\xe7\xb8\x53\xff\x73\xa7\xeb\x34\x33\x41\x9d\x68\x95\x96\x88\x54\x77\x86\x0b\x23\x99\x90\x8f\x9e\x0a\xf4\xc0\x11\xc2\xdf\x24\xcb\x07\x80\x9b\xd4\x35\x3a\x1b\x1d\xa1\x34\x03\x1d\x98\xc6\x3f\xc1\x55\x3f\x65\xc9\xe3\x4e\x97\x27\x8b\x2c\x25\x40\x83\xc8\xea\xdb\x63\xfb\x3e\xdd\xc4\xcd\x76\xad\x69\x69\xa4\xe1\xc9\xa9\x7f\xd6\x39\xf2\xa5\xfc\x12\xed\xab\x92\x9c\x6e\x9d\x8e\x9a\x27\x26\x35\x2d\x4d\xa3\xc8\xb3\xa7\xb6\xb6\x47\x6f\xa9\xef\x12\xac\x05\x93\x8f\x8c\x48\x91\x8a\x10\xc6\xee\x5e\x73\x71\xb5\xb4\x6c\x05\x4f\x3b\x17\xb3\xa5\xbb\x2d\x1d\x5a\xa6\x86\x7c\x3c\x6b\xfa\x78\xa1\x59\x41\x64\x4c\xf1\x73\x28\x32\xa0\x58\x65\x8a\x31\x40\x2e\x0b\xd9\x66\x99\x36\x95\xbb\x9b\x88\xc8\x2b\x3e\xba\x81\x5b\xb6\xf1\xcc\x30\x08\x61\x8e\x9e\x9c\x58\x8f\x7d\x77\x82\x00\x44\x44\xdf\x0a\x1f\x47\xf3\xc1\x36\x5a\x50\x49\x26\x4d\x3b\xde\xc0\xf7\x40\x6a\x67\x7c\x1d\x65\xa1\xcc\x3d\x5a\xf8\xe4\xae\x3b\xe3\xbe\x26\x5a\x59\x30\xd0\x04\xe7\x44\x80\x49\xbc\x77\x08\x7d\xd1\x25\x58\x93\xc1\x63\x3d\x26\x85\x61\x60\xc1\x5b\x22\xd5\x48\x5c\x2b\x5b\x61\x96\x33\x16\xdd\x2a\x35\xa9\x99\xb9\x39\x95\x55\x56\xd6\xa4\x8a\x5c\xc0\x5a\x7f\xbf\x4f\xb6\x06\x79\xbb\x71\x03\xc2\xaf\xa1\x9a\x91\xb3\xa5\x82\x0a\xd6\xc4\x47\xfd\xf0\x69\xf6\x49\x19\xa1\x19\xcd\x4f\x6a\x6c\x2d\xf6\xda\xcc\xa0\xc5\x47\x65\xc1\x1c\x1a\x06\x63\xbf\x70\x4c\xc1\xe9\xbf\x61\x14\xde\x11\xc8\x72\x7a\xd0\xda\x30\xc4\x23\x8b\xae\x8b\x1b\xd9\x34\x47\xd5\x1c\x59\x9d\xc6\x3a\xd0\xb6\xf9\xa7\x87\x3b\x86\xee\x86\xfd\x2c\x4b\xfd\x50\x80\x6e\x5a\xec\x50\x9a\x86\x53\xec\x10\xdd\x80\xf2\x5d\xbb\xc1\x60\x9d\x3d\x51\xa0\xa0\x65\x89\xc3\x4e\x2d\xee\x8b\x02\xa6\x11\x78\x04\x81\x9a\x91\x6d\xcc\xc6\xc3\x20\xa9\x66\xf4\x62\x8b\x42\x02\xbc\x44\x3c\x85\x7a\xbd\x15\x39\x4f\x4e\x69\x4b\x8c\x25\xa2\x36\x38\x68\xe6\xc6\x31\x31\xa4\x08\xa8\x97\x2d\xbd\x60\xa1\x53\xf0\x36\x83\xd3\x06\x30\x54\x61\xc0\x40\x90\x40\x0b\x71\x3d\x4e\xda\xf6\x4f\xdc\x01\xc5\x8d\xc0\x41\xe4\x5a\xdc\xfa\xb3\x0b\xca\x8a\x09\x88\x04\xa7\xbe\x73\x85\x83\x9d\x14\xab\xab\x42\xf0\x55\xb7\xad\x49\xf5\x93\x7a\x4c\xbf\xa5\xf1\x82\x0e\x90\x05\x9e\x1f\x40\x10\x1a\xae\xe5\xff\xb3\x2a\xca\xff\xe3\xbe\xd7\xb6\xd0\xfd\x60\xfe\xa4\x3e\x31\x3f\x22\xb0\xd5\xe1\x2e\xa9\xad\xfc\xc8\xb9\x2b\x82\x32\xe0\xd0\xda\x16\x63\xb8\x14\xc3\x02\x23\xe2\x8f\x86\xb6\xd5\xe6\x8a\x36\xf8\x79\xaf\x8c\x6c\x9f\x6e\x5b\xbf\x76\x56\xee\x02\x48\x4c\x91\xff\xe7\xbf\xff\x47\x8d\x64\xd2\x69\x51\xd4\xb4\x04\x9f\x33\x29\xff\xf9\xef\xff\x41\x8a\x3a\x09\xc6\x68\x9d\x4c\x3b\xc0\xe2\xbc\xa7\xef\x96\x4b\xb0\x0d\x31\x66\x81\x62\xdb\xee\x0d\xd8\x27\x7a\xc6\x19\x8a\x4e\xb6\x1f\xf8\xfb\xc4\xf0\x21\x83\x8c\xf7\xf0\x80\x18\x78\x8a\xc3\x3d\x2a\xc6\xbc\x46\xa1\xec\xce\x95\x95\xb0\x0f\xec\xc8\x05\x0c\xfe\x6e\xd8\x50\xb9\x0c\xbc\x3c\xdf\x61\xff\x4d\xec\x27\x6b\xfc\xd2\x23\x63\xd5\xf3\x7d\xb6\x8f\x07\xdd\x79\xd2\x01\x80\x8a\x1f\x6d\x2a\xc3\x9a\x56\x46\x25\x86\x14\x2f\x13\xac\x98\xe1\x00\xf1\x1c\x79\x0c\xd0\xb3\x76\xc2\x37\xb1\xea\x65\x24\x92\x8a\x53\x41\x25\x70\xf3\x5d\x70\x6c\x44\x4e\x4d\xad\xce\xf1\x4c\x22\x51\x70\x64\x73\x67\x88\xee\x08\x47\x02\x8f\xcc\x7d\xdb\x51\x2c\xfb\x5f\xb3\x1f\x75\x9b\x05\xf0\x12\x03\x35\x34\x27\x8e\x3e\x39\x16\xb0\x06\x8c\x14\xe3\xd1\xea\x98\xa9\xbe\x90\xdd\x2b\x02\xdf\x9d\x72\x11\x10\xde\xb9\x2b\x35\x6b\x3c\xce\x8b\x6d\x1e\x00\x14\xf6\x16\xab\xfd\x86\xef\xa0\x8e\x3b\xe1\x2f\x3a\xdd\x7a\x00\x00\x1e\x59\xfb\x16\xd5\x86\x01\xe8\x63\x53\x6a\xc7\xa7\x05\x71\x80\x64\x51\xd1\x8b\x96\xbe\x02\xb8\x6d\x74\xb0\x92\xc0\xcf\x95\x7d\xc1\x5b\xbb\x90\xea\x44\x67\xda\xb4\x8f\x88\x57\xf0\xae\x73\xaa\x00\xa2\xcd\xae\xf1\x72\xff\xa3\xe6\x3a\xd7\xab\xb4\x32\x61\x03\x8e\xee\x05\x2c\x50\xa1\x08\xeb\x7a\x7f\xe5\xee\x3c\x67\x92\x3b\x53\x79\x4f\x47\xe3\xa3\x29\x85\xae\x4f\xd5\x7f\xfe\xfb\x7f\xc8\xdc\x12\x84\x98\x92\x58\xf5\x96\x09\xe4\xca\x5d\xeb\x5c\x96\xd9\x34\x01\xfb\xc1\xf1\x35\x4d\xd7\x69\x96\x94\x3c\xa8\x9c\xc2\x0f\x54\xa9\x8b\x12\xc8\xee\x97\x6a\xbb\x29\xf2\x7d\x6f\x83\x34\x14\x8e\x09\xa9\xe5\x23\xa9\x11\x2a\xac\x11\x16\xb6\xc1\x7f\x94\x20\x5f\xb4\x64\x42\xa0\xa2\x5c\x93\x44\x6f\xad\xe4\x8d\x25\x4a\xd5\x3a\xc9\x73\x38\xfe\xa0\xf0\x24\xbf\x93\xd7\x8c\xcf\xe7\x1f\x7c\xd1\x76\x5e\x99\x8b\xa2\x14\x56\xea\xaa\x6d\xf5\x46\x74\xe2\xec\x7d\xc7\x44\xad\xb7\x06\xb5\x17\x01\x7d\x21\x64\x6d\x90\xe9\x05\x76\xaa\x23\xd6\x88\x9a\x73\x07\x1a\x79\x60\x57\x52\xd6\x66\xf9\xd4\x33\xcd\x2e\x07\xe0\xbe\x3d\xcf\xd3\xb5\x5e\x7a\x26\x07\xd2\x53\x5e\x17\x50\x25\x00\x48\x0e\x58\x33\xf3\xf8\xf0\xf8\xe0\xfa\x09\xae\x3a\xa0\x3c\xa3\x4f\xd1\xc6\x58\x64\x05\xa0\x66\x84\x40\x80\xff\x8a\x10\x71\x61\xc4\xaa\xbf\xad\x6b\xe3\xe2\xf8\x48\xa2\xe6\xf8\x40\xef\xb6\x29\x82\x47\x53\xa3\xce\x93\x2a\x01\xf1\x05\xec\xaa\x6f\x1d\x1d\x54\xdb\x89\x7b\x22\x2f\xa0\x6e\xda\xa3\x24\x4b\xe6\x9a\x62\xbd\xcc\xe7\xfb\x6f\xf6\x4e\x7a\xd6\x94\x8b\xb6\x02\xf7\x88\xf7\xe5\xd9\xf1\xbc\x7b\x7c\xda\x3d\x39\x3e\xeb\x3a\xb7\xe6\xd0\xf0\xc2\x14\x2c\x62\x35\x58\x91\x62\x91\x9a\xe9\xc5\x7d\x5e\x64\xc5\x1d\xac\x9c\x2b\x9d\x98\x6d\xa9\x79\x1a\xf0\xca\x5b\xf3\x2f\xed\x26\x8d\xbc\x36\xb5\xe3\xae\xde\x94\xc5\x46\x97\xde\xd0\x88\x5c\x69\xcb\x5c\xab\x45\x5a\x2e\xb6\xeb\x07\x9d\xfb\x60\x2c\x44\x74\x57\xdb\x6c\x95\xa2\xcc\x74\x93\x22\xc4\xb1\x42\x9e\xb2\x99\xf2\x75\x78\x3d\x16\xaf\x36\xb3\x97\xc9\x4e\x25\xcb\x62\x83\xe8\x2e\x75\xae\x17\x1a\xf0\x76\x67\x6f\x22\x75\xfa\xe3\x8f\x1f\xa2\xfa\xda\x49\x83\x1b\xc5\x91\xb5\xe0\xa0\x2c\x63\xcf\x7f\xdd\xc8\x40\xd1\x70\xac\x12\xf4\xeb\x23\xfc\xaf\xa5\x4e\x32\x5e\x28\xaf\x03\x66\xc5\x03\x96\xe2\xd3\xa7\x20\xaa\x26\x43\xba\x0a\xae\x15\x01\x33\x68\xec\x41\xe8\xba\xf3\xd6\x9a\xe7\x30\x4c\x54\x59\xa5\xa6\x4a\x17\xd8\x97\x4a\x97\xd6\x06\xc6\x23\x62\x49\x2b\xda\x1f\x7a\x41\xc9\x76\xfd\x50\xb5\xef\xc8\x92\xce\xcd\xd5\x0a\x7d\x59\xc5\x8d\xfb\xd2\xf7\x84\x56\xb2\xbb\x5c\x0b\xba\xf0\x5a\x12\xaf\x7b\x6c\x88\xe6\x91\x08\x7c\x7f\x76\x9b\x79\x8e\x21\x6b\x11\x3e\x6f\x98\x77\xcf\x1a\x64\x8f\x3f\x0d\x86\xa2\x61\x5b\xcb\xec\xcb\x9d\x77\x27\xc5\x00\x78\x19\xd4\x63\xd3\xb5\x63\xae\xf3\x2a\xad\x76\xc7\xa9\x36\x5d\x1c\x16\xe0\x0e\x69\xf0\xb2\xb6\x0c\xf4\x7d\xac\xa6\x10\x94\x71\x9c\x0d\x1c\x04\x92\x33\x28\x4c\x4f\xa9\x00\x4f\xf5\x92\xa4\x2c\x9c\x54\x5e\x36\xa0\xf5\x42\xab\xcd\xa8\xb7\xc3\x43\x5a\x3d\x7a\x10\x51\x04\x46\xc2\xd5\xf3\xe7\x6d\x48\xb8\xb7\x4c\x8d\xd1\xbe\x3c\x2e\xa0\x83\x8a\x48\x38\xae\x28\xf9\xe0\x4e\xb0\x22\x14\x7c\x83\x75\xd3\x9a\x09\x5f\xd7\x7b\x26\x1c\x2b\x81\x17\x5d\xc3\x19\xe1\x02\x14\xf4\x61\x90\xc3\x14\x42\xcb\xdc\x38\x13\x91\x02\xf7\x03\x26\x36\x55\x82\x65\x96\x7e\x2a\x41\xd4\xb2\x30\xa8\x0e\x5d\xdd\x6b\xac\x5a\x4f\xe3\x43\x77\x07\x4d\x03\x17\xd9\x79\x72\x7b\x7f\x8b\xd5\x82\x8a\xe7\x80\x2b\xb1\x27\xf6\x8f\x1f\x5e\xff\xf8\x7a\xd0\xe7\x57\x18\x6c\xed\xe9\x9b\xe4\xea\x3a\x29\xb3\x34\x61\x65\x56\xfe\x73\xbf\xd8\xe6\x8b\x14\x48\x05\x4e\x4f\xd5\x55\x52\x2e\xee\xe1\x74\x64\xea\x74\x0c\x29\x6f\xca\xa2\xa2\x2b\x85\xe4\xcd\x6c\x67\xad\xa5\x6a\x54\x42\xf4\xf8\x4e\xee\x75\xb1\x00\xe0\x68\xe4\x10\xf3\x09\xbf\x82\x36\x06\xe5\xd9\xb2\x9d\x02\x2d\x83\x24\x83\x6a\x41\xba\x0d\x85\xf2\x93\x7d\x34\xe0\x1b\x60\xb0\xfe\x42\xe9\xc1\x96\x8d\xe2\x77\xc9\x53\x5e\xcb\xfe\xfd\x82\x5b\xfc\x9e\x6c\xfd\x92\xaa\x8b\x91\x84\x06\x20\x4c\xde\xd0\x3d\x03\x43\x77\xba\x28\x36\x9a\x4d\xdc\x4b\xc9\x0a\xc4\xa9\xd5\xd3\xb8\x1d\x30\xf2\xcc\x73\x2b\x3c\x48\x74\xa9\xe7\x3b\xe9\x03\x24\xfb\xb0\x1f\x11\xa4\x13\x0d\xb4\xa6\x73\x63\xd7\x7d\x54\x87\x8d\x88\x30\x9e\x84\xe2\x38\xe6\xe7\x3d\x3e\x4d\xfb\xd1\x57\x15\x82\x33\xa7\x17\x87\x54\x51\x74\x02\xb5\x7e\x33\x42\xab\xbc\xc8\x88\x81\x04\x22\xaa\x35\x4e\x9d\x4f\xb1\x92\xad\x79\x80\x9a\x63\x8e\x83\x07\x34\x2d\x55\x9e\x85\xb3\x43\x97\x36\x9a\x58\x70\x03\x3e\x14\xe9\x92\xfd\xb2\x65\xb1\x9d\x57\x6c\x4c\x1f\xb8\xf2\x1b\xf7\x43\xd4\xea\x53\xba\x9c\x0a\x69\xcd\xd8\x66\x6e\x3d\x82\x8f\xd5\xd5\x20\x59\x4f\x6a\xd6\xe0\xbc\xb5\xba\x5b\xf8\x56\x6f\x63\x35\xd3\xe5\xba\xa5\xfe\xbb\xf6\xec\x74\x8f\x55\xf8\xe1\x38\xe9\x72\x63\xef\x62\x75\x05\xb4\x7c\xa0\x98\x09\x41\x71\xf3\x51\x54\xd4\x4b\x36\x21\x27\x91\x5d\x2b\xd4\x77\x61\x6a\x5c\x9d\xcf\x58\x4c\xc8\x67\x52\x7b\xac\x1d\x73\x38\x26\xf2\xe2\x51\x7d\xcb\x8b\x47\x30\x8f\xec\x3c\x24\xab\x4a\x97\x4c\xa5\x14\x1e\xf4\xfb\x7a\xea\xc3\x79\x8e\xc1\x25\xec\xf4\x63\x02\xfe\x30\xdb\x66\xd6\xda\xc3\x89\xb2\x16\x82\x31\xba\x14\x75\xce\xaa\x28\xc3\xab\x7c\x55\x94\xf3\x14\x27\x32\x70\xa8\x9f\xd3\x99\x43\x63\x13\x00\xc8\x9e\xd3\x98\xb7\x9e\x9f\xb4\xd9\x9f\xe9\x52\x98\x14\x56\x22\xbd\x51\x6d\xfa\x7d\x3e\x02\xee\xb2\xd4\x08\x4f\x23\xe9\x1e\xbf\xeb\xaa\x5c\x3f\x60\x0d\x81\xdd\xa8\x66\xef\xce\x7c\x1f\xab\xf3\xe2\x31\x37\x55\xa9\x93\xb5\xe0\x91\x8a\x83\xd3\x64\x2c\xf5\x04\xc5\xdc\xd9\x33\xb8\x69\xeb\xaa\xc1\x83\x2e\x77\xbe\xb1\x03\x06\x5b\x50\xb4\xef\x62\x23\x49\xce\xc8\xb7\xc6\x13\x9f\x5a\xd3\xcf\x24\x64\x6a\x31\xd4\xdc\x51\x37\xb2\xeb\x54\x0c\x89\x27\x88\x8b\x03\x9d\x73\xec\x22\x19\x3f\x84\x57\x13\x78\x19\x20\x61\x66\xf5\x43\x42\x29\x96\xa1\x84\x09\xa6\x38\xe1\xfc\xb2\x5f\x7e\xd2\xd9\x63\xe9\xdd\x16\x17\xdf\x9e\x97\x88\x69\x76\x3d\x36\x81\x88\x40\xdb\x60\x91\xa9\xf9\xf4\x44\xf1\x00\x7d\x80\xd1\xd1\xf9\xb2\x28\x0d\xf1\xf8\x8e\x8a\xea\xde\x11\xf5\x36\x8f\x3e\x29\x38\x40\x31\xe3\xa0\x90\x3c\x31\xb5\x14\x03\x6d\x79\x12\x23\xde\xa1\x35\x48\xe1\x3e\x44\xfd\xd1\x2f\x9e\xf0\x05\x52\x13\x31\x91\x08\x95\x9a\x60\x70\x65\x53\xd8\x75\x64\x4f\x2f\x7a\x0d\x8c\x24\xb1\xaf\x53\xac\x56\x29\x04\xb3\x4d\x95\x54\x5b\x3b\x44\x35\x23\x80\x1d\x30\x10\x6c\x4f\xef\x72\x0e\x6b\xd0\xe2\x0d\x20\x75\x89\x20\x97\x17\xc7\xfe\x5b\xbb\x45\x4f\xbb\xc7\xbd\xee\x71\xda\xe5\x60\xcb\x58\xe6\xfc\xbc\xf1\x72\x55\x94\x09\xa7\xd5\xbc\x3d\xef\x9c\x34\x00\x7c\xe6\x95\xbe\x43\x77\x9e\x43\x0b\x8d\x24\x7b\xcb\xf9\x92\xdb\xb5\x57\xb2\x69\x0d\x5f\xdf\x94\xe9\x43\xb2\xd8\x85\xf8\x52\xe7\x96\x23\x5a\x1b\x8b\xe9\xb0\x43\x1f\xd5\x3d\xb3\x38\x87\x15\x79\x9c\x39\xaf\x8d\xdd\x33\x8f\x7a\x19\x59\x6d\xa5\x5a\x76\x99\x3c\x74\x25\x5d\x19\xa0\x38\x8f\xe1\x82\x7c\xce\x2d\xe8\x6d\x18\x17\x4c\x14\x56\x0b\x41\x8f\x89\x8b\x94\xf0\xac\x22\x68\xf4\xbc\xc1\x96\x06\xc3\x8b\xc6\x89\xaf\x3d\x30\x4c\x32\xa0\xb8\x40\x2b\x33\xe5\x08\xf2\x2d\x69\x35\x63\xa3\x07\xb7\x7b\xe4\xee\x75\x8f\x7d\x2f\x5d\x91\x55\xc2\x4f\xc0\x53\x64\x91\xea\x6a\x27\xa4\x35\x1f\x8a\x6c\x9b\x57\x76\x70\xa9\x7f\x60\xb6\xc2\x26\xa9\x0a\xfc\x2d\xe8\x7b\x64\xc6\xfe\x0b\x87\x04\x5a\x5a\xdc\xeb\x35\x92\x78\x00\x65\x1a\x3c\x7f\x61\x7d\x96\xf0\x95\x09\xa4\x08\xb7\x00\xb0\xca\xef\x79\x7d\x5c\x1b\x3c\x06\xde\x1f\x78\x2b\xef\x22\x81\x51\x86\xd2\xc5\xf2\xc9\x93\x30\x35\xa2\x07\x40\x7f\xb7\x97\x31\xb4\x66\x07\x26\xb1\xcc\x8f\x88\x9d\x3b\x84\x6c\xc3\x61\xd3\xfb\x96\x50\xbb\x75\xdb\x1d\x12\x86\xe1\x63\xb1\x56\xd2\x5a\x92\x5b\x0a\xed\xd4\x77\x45\x93\xc3\x91\x1f\x24\x9a\x47\x8f\x17\xd4\xba\x1b\xe4\x94\x84\x34\x81\x90\xc7\xa1\x10\x8b\x8b\x9f\x3d\xe3\x0c\x8c\xb8\x44\xdb\x27\xe0\x64\x74\x5e\x9b\xaa\xe5\x4d\x8e\x45\xba\x72\xa7\x36\x46\x6f\x97\x45\xbe\x5b\xc3\x2d\xe7\x1e\xd8\xfd\x18\xbe\x55\x1a\x13\x9f\x80\x54\x0c\xac\x7f\x06\x3e\x44\x62\x82\x14\x50\x59\xd9\xf7\x60\xf1\xe3\x70\xdf\xd6\xbe\xfd\x70\xe8\xcb\xda\x21\x90\xb0\x94\xd8\xe3\xa2\xc2\x56\xa0\x91\x9b\xc9\x10\x4c\xea\xdd\x46\x97\x59\x9a\x7f\x6b\xf0\xea\x5d\xd5\x62\x43\x74\x5e\xb8\x41\xdc\xa9\x4d\x99\x2c\x2a\x4c\x78\x7f\x0c\xcc\x17\xeb\x92\x2f\x92\x4a\xdb\xd1\x82\xf5\xc5\x99\x91\xfd\x13\xca\x98\xf1\x9c\xbf\xcc\xb4\xd6\xb9\x7d\x8e\x7e\x00\xa6\xef\xc0\x02\xad\x39\x88\x7d\xf1\xd8\xbd\x39\x88\xe7\x5c\x4a\x42\xaf\x86\x8c\x38\xd0\xc8\x8b\x98\xa9\xa8\x65\xe0\x5a\xdd\x3d\x71\x84\x1f\x72\x2e\x85\x03\x08\x89\xf0\x96\xa8\x5a\xd3\xa4\xa9\x0a\xda\xd4\xfb\x6c\xea\xb7\xde\x4e\x94\x84\x98\xa1\xcc\x6e\xcd\x18\xd8\xbf\x4d\x30\xb3\x46\x51\x20\xa4\xda\x8c\x30\x02\x13\xb1\x75\x0b\xa3\xe4\x92\x6b\x4f\x9c\x3a\x38\x22\x0e\x46\x91\x56\x6c\x94\x89\x47\xd7\xa8\x3c\x45\xcf\xed\x7e\x04\x93\x06\x81\xf8\x6d\x0b\x19\x74\x8f\x10\xe7\x8f\xd9\x42\x86\xd8\x54\x9e\x15\x74\xd9\x90\xeb\x71\xbc\xf1\x7b\x8f\x05\x7f\x5c\xaa\x52\xaf\x41\xe6\xcf\x93\x89\x49\x2c\xa3\x04\x0e\x34\x6d\xae\x67\x6d\x29\x7f\xb1\xbc\xc3\x40\xd3\xfe\x10\x61\x7c\xf4\xb5\x99\x7b\x73\x1e\x36\x2e\xe5\x43\x11\xc6\x17\x06\xb9\x7f\xa2\x4b\x67\x75\x60\x59\x07\xbe\xe0\x69\x57\x46\xac\xbc\xe5\x08\x76\x11\xa5\xd3\x01\x71\x15\xc9\xc0\x8e\x8f\x1a\xc1\xb5\x5d\xaa\x04\xf8\xb3\xaa\x04\xc2\x86\xf5\xa2\x09\x92\x2d\x72\xe1\x5a\x9f\xaf\x70\xf6\xaf\xd8\x6a\xed\xbb\xe7\x23\x19\xc2\x74\x6c\x39\x91\x99\x67\x3c\x9e\x1f\xe7\xfb\x01\x59\x60\xf7\xeb\x60\x6b\xc0\x46\x3f\x98\x2e\x24\x60\x90\xfe\x95\x0d\xa8\x63\xb6\x28\x53\xe8\x89\x8b\x90\x72\xef\x00\x58\xdc\x78\x7d\x3e\x51\x17\xb1\x5f\xe7\x32\x1a\x75\xf8\x08\xe1\x61\xfb\xeb\xe7\x0c\x76\xe3\xa1\x43\x33\x08\x37\xbc\x43\x7b\x84\x68\x7e\x03\x78\x34\x73\x31\xc3\x92\xde\xa3\x2e\x50\x3b\x5a\x5b\xb2\xd8\xb5\x9d\xc4\xdc\x2a\x87\x52\xa7\xdc\xb7\xf7\x08\x86\x08\xae\xe5\xaf\x1e\xae\x1c\x06\x12\x51\x47\x87\x50\xc3\x6c\xd9\xdd\xe4\x20\x6a\xea\x61\x06\x46\x6f\x92\x32\xa9\x34\x57\x29\x55\xc9\x37\x97\x4f\x10\x07\xd5\xb3\xbc\x21\x88\x1f\x98\x7d\xd7\xb2\x39\x49\xb1\x8b\x89\x39\x71\xb9\x13\xdc\x97\x08\xeb\xce\xb1\x6a\xd3\xab\x1d\x19\x34\xcd\x65\x25\x8c\x3d\x20\xbf\xa5\x78\x49\x2c\x88\x96\x6f\x8f\x29\xca\xbe\x01\x99\xc1\x11\xd7\xd6\x44\xde\xc8\xf7\xd9\xc7\x1a\x78\xb2\x3d\x7f\x1f\x76\xa5\x4a\x2b\xdb\xff\x17\xd7\xe6\x44\x8d\xc2\x9c\x48\xa6\xb4\x33\x74\xd0\x9c\xb3\xba\xd4\x2b\xbd\xb0\x9b\x38\x59\x2c\xb6\x25\x38\xb3\x8c\xec\x82\xa1\x42\xd2\x0d\xd1\x80\x2e\xcb\xa2\x14\xbe\x11\x68\x3f\x54\x3e\xec\x69\xad\xba\xe2\x41\x97\x08\x1d\xc3\xa3\xde\x5b\x7a\x26\x34\xf5\x9c\x4f\x48\xf1\x59\xbb\x4b\x57\x5b\xdc\x8c\x14\x5a\xa7\xfd\x23\x8c\x45\x47\xe4\x2c\xee\x00\x8e\x0a\xec\x73\x17\x53\xd0\x37\x42\x8e\x4d\xe0\x05\x0b\x56\xd6\x5c\x03\x00\x1e\x2f\x72\x7b\x2a\x90\xd0\x0f\xe6\x90\xaa\x7b\x6d\x7d\xb4\xe3\x27\xe0\x17\xb9\xbe\xcb\xd2\x3b\x3b\x4c\xdd\x10\x6a\xc3\xb0\x4c\xf4\x22\x23\x86\xff\x45\x70\xd4\xe1\xaf\xd2\x7c\x01\x2e\x86\xfd\xed\xa2\xc8\x89\x76\x11\x3e\xb4\xd9\xe6\x29\x42\xb9\x81\xbf\x23\x4b\xe4\xba\x52\x59\x61\x20\x9d\x05\x92\x01\x11\x60\x7e\x11\xf2\x27\x50\xfc\x49\x89\xb9\x25\xdb\xe1\x3d\x01\xf7\xe2\xf0\x1d\x1a\x21\x33\x5a\xba\x6a\x26\x8a\xe7\x5a\xe7\x50\xb8\x01\x46\x17\x25\x1f\x61\xd8\xb1\x9c\x80\xe9\x42\x9f\xd1\x51\x5e\x2d\x89\x44\x16\xd8\x25\xeb\x6a\x13\xb8\xbe\xe4\xa9\xc5\x22\xbe\xbf\x77\xb1\x2c\x30\xac\xbe\xcf\x09\xa9\xd5\x3b\x87\xfd\x70\x97\x74\x8d\x64\x52\x02\xf0\x24\xae\x0a\xf1\x25\xfb\x0e\xb9\x75\x61\x6f\x2e\x02\xfe\x24\x9b\x4d\x59\x7c\x4f\xd7\x49\x85\x71\xdd\x64\x6e\x8a\x6c\x5b\x05\x1d\x05\x6a\xaf\x24\x7d\xc0\x3e\x07\xe5\x1b\xfe\x30\xff\x00\x87\xf9\x4c\x53\x11\x8e\xa0\xe4\xe5\xc3\x7a\xd6\xb2\x10\x18\xa3\xc1\xd6\x92\xcf\xd2\x3c\x01\xff\x72\xce\x8a\x9d\x42\xa1\x56\x46\xd7\xec\x2a\x49\xb3\x7a\xba\x68\x5f\x02\x31\xc7\x1b\xf0\x29\xb4\x80\xe0\xac\x6d\x16\x05\xcf\x79\x31\xf9\xa6\x5a\xd5\xdb\xdc\xfd\x61\xd7\xb2\x6b\x90\x5d\x2e\x99\x77\x02\xcb\xbf\xd4\xc0\xab\x5c\x79\xc5\x8d\xd3\xb8\x16\x94\x4f\xa4\x81\x80\x4f\x7b\x48\x0b\x02\x8f\xa5\x46\x2d\xb6\x10\x4c\xf5\x71\xce\xca\xfd\x96\xe5\x89\xde\xbe\x51\x4b\x28\x82\x20\xfc\x25\x1f\xa9\xce\x78\x77\x0d\x7e\x54\x45\xe9\x3d\x37\x40\x13\x72\xf5\xaa\xeb\xaa\x24\x05\x76\xc0\x3c\xda\x01\xcf\x36\x5b\x3e\x1c\xcf\xbb\x22\x25\x58\xa3\xd3\x0d\x8f\x05\x57\x0c\x6b\xbd\x22\xad\xbf\x59\xef\x43\x2f\x79\x55\xc1\x1b\xb9\x17\x38\x98\x61\x58\x3e\xd5\xc1\xda\x43\xa1\xb8\x02\xb3\x0c\xed\x93\x4c\xa0\x7b\xb2\x49\xda\x93\x0c\xa5\x32\x55\xb1\x51\xfb\x29\x69\xbd\xc9\x81\x23\x50\xa5\x6b\x2d\x02\xbb\x2e\xad\x00\xd7\x0c\x04\x6b\xdd\x3a\xdd\xf7\xa2\x3a\xe6\x81\x36\xea\x34\x52\xef\x23\xf5\x21\x52\x3f\xa0\xf1\xf2\x47\x65\xb6\xe5\x03\x54\xd0\x84\xac\xda\xad\x8d\xf1\x7c\xfd\x00\xbb\x1f\x63\xe4\x33\x97\xd8\xe9\x37\x42\x71\x41\x66\xd1\xf3\x25\x4b\xfc\xf3\x4b\xd3\x34\x1e\xec\x82\x1e\xa5\xdd\xfe\x5b\xb4\x0b\x7d\xc8\x10\x62\xd9\x4b\xde\xaa\x3d\xfb\x08\x04\xad\x82\x5d\x1c\x89\x5a\x9c\x34\xbf\xa3\xd2\x36\x87\x6b\x13\x85\x73\xed\x33\x03\x55\x2c\xa8\xdd\x44\x22\x82\xd6\xce\x70\xf3\x8e\xe8\x97\x1a\x4f\x1a\x6d\xad\x17\x65\xc1\x78\xb4\xff\x08\xa3\x3d\xe4\xd3\x3f\x38\x65\x9f\xdc\x62\x7b\xf2\xee\x52\xeb\x94\xa6\x44\x5e\x2f\x55\x61\xdd\x4f\xf4\x3d\xe1\x9a\x8a\x5c\x1e\x2b\x12\x39\xb6\x20\x7d\x06\x53\x79\x30\x09\x44\xf5\xf7\xdb\x0c\x88\x8f\xed\xe5\xba\x73\xfa\x26\x6c\xf3\x3c\x27\xe6\xf3\xa4\x39\xc6\xb1\x32\xa6\x4a\xdf\x0f\x04\x58\xda\x49\xb7\x07\xb2\xce\x57\x45\xb9\xd0\x68\xd6\xa7\x82\x65\xb9\x9e\x14\x45\xbc\x33\x5f\xb7\xeb\x34\x4f\xd7\xdb\x75\x6b\xd2\x03\x12\xf1\x69\xa5\x44\xd3\xae\xe6\xc6\xf7\x8d\xea\xf1\x21\xe2\xc3\x58\x6a\xf9\x7c\xa3\x91\xcc\xd0\xd3\xaa\xd5\xbd\x34\xa6\x54\xc7\x7c\x25\x2d\x5b\xf7\x50\x67\x28\x61\xbc\x67\x4d\x94\x8c\x7b\x91\x14\x0b\x48\x2a\xe2\xcd\x2c\x76\xde\xbe\x31\x64\x1a\x5c\xb0\x18\x96\x54\xba\x0f\x17\xf2\xb6\xd4\xe2\x4e\x06\xbb\x93\xf1\x8b\x7b\x36\x2c\xd4\x46\xb4\x5c\x25\xcb\x5f\x99\xd7\x6c\x54\x2c\x08\x8b\xcb\xde\x66\x11\x67\x4f\xc0\xd4\x89\x68\xd1\xa4\x0f\x69\xa6\xef\x58\xaa\x11\x4e\x1b\x30\xd9\xc2\xc8\x50\x3d\x0b\x79\x5b\x6c\x25\x4a\xc1\xa5\xca\x1d\x50\xcc\x2e\x0c\xef\x06\xfe\x65\x5b\xa6\x66\x99\x3a\x21\x43\x07\xa3\x88\x9b\x45\x2b\xae\xee\x19\x19\x42\xab\x02\x22\x19\xb5\xc2\xb1\x86\x5a\x40\xd4\x56\x80\xbc\x53\xc8\xcc\x5e\x15\xf4\x26\x54\x89\xd6\xd2\x20\xae\x60\x8e\x17\x57\x8e\x5c\xd9\x49\x58\xb2\x18\xb2\x81\xda\x0d\xe3\x56\x02\x97\x5e\x50\x8c\xbb\xe3\xa6\xb2\x43\xc8\x9c\xef\xee\x38\x7c\xb2\x42\x17\x76\xe8\x92\x4e\xfb\x10\xa9\xb8\x2c\xec\x52\x96\xf5\x03\xfd\x37\xbc\x2c\xce\xf1\x6f\xe7\x9a\xc3\xe7\x0c\x78\x72\x96\x27\x27\x2b\x99\x72\x02\x12\xb7\xf8\x69\xae\x90\x5a\x4b\xc0\xfe\x7d\x52\xfa\x42\xc3\xa7\xfa\x0d\x13\x2a\xe3\x14\x9e\x56\x83\x96\x77\xb3\x81\x22\x4b\x17\x76\x95\x79\x0e\x6b\x2e\x36\xae\x15\x3c\xf1\x27\x5b\xe6\xd7\x5b\x50\x0c\x48\x81\x87\x89\x33\xd9\x67\x4d\x9b\x05\xf6\xa1\xca\xbd\xff\x24\x90\x41\xde\x15\xad\xa5\xf2\x7c\xf6\xc0\xfa\x29\x53\xbb\x9d\x4a\xfb\xa2\x39\xef\xf7\xa7\xaa\x0a\x5a\xf4\x45\xe0\x1a\xc9\x05\xa6\x26\x04\xdb\x90\xb8\xc9\x9e\x45\x1b\x2a\xf5\xbf\xe0\xd2\x17\x21\x19\x1a\xaf\x46\x85\xdf\x33\x6e\x5b\x2f\xa8\xe5\xe6\x22\xa8\x8b\xae\x1a\xf5\xd9\xa6\x65\xc3\x7b\x58\x46\x95\x00\x5e\xa2\x7d\x29\xfc\x97\x53\xa2\xc4\xaf\xfb\x59\x8f\x60\xf2\xbf\x17\x09\xe4\x61\xfe\x8f\xd3\x77\x6f\x7f\x68\xf0\x7f\xfc\xf0\xc3\xdf\xf9\x1f\xff\x26\x3f\xf6\x38\xef\x67\x49\x89\x09\x4d\x5e\x09\xae\x62\xf2\xba\xd4\xc9\x7a\x9e\x69\x10\x09\x4d\x51\x22\x97\xad\x88\x25\xcb\xe2\xa6\xb0\xa3\xc1\x9c\xae\xc7\xd4\xf1\xb4\xa5\x5a\x05\x75\x8d\xc4\xd8\x7e\x73\x6c\x30\x1c\x0a\xb2\x2c\x5c\x65\xe0\x83\x08\x5f\x80\x8d\x41\xd9\x7b\x00\x85\x77\x80\x83\xda\xe8\xf5\x3c\xe3\x8d\xeb\x2a\x3c\xa0\x90\xb1\xc8\x90\x77\x0c\x7c\x6b\x54\xa2\x5c\x0b\xcb\x9d\x78\xb9\xa1\x76\x22\xd3\xea\xce\xcb\xb8\x6c\x8d\x44\xc6\x53\x2f\x83\xc4\xce\x96\x38\x8d\x6a\x42\xb8\xfc\x46\x18\xcb\x29\x4a\x7d\x52\x94\x27\x60\x18\x2d\xb6\xc6\x1a\x9d\xe5\x4e\xad\x12\x73\x8f\x55\x02\xd9\xd6\x84\xad\x82\x79\x29\x13\x94\xf2\x98\x8c\x8f\x44\xd5\xe1\x4f\x47\x1d\x7a\x56\xa7\x96\x24\x67\x90\x09\xda\x77\xc8\x16\x2d\xd9\x76\xf9\xba\xaa\x0d\x2b\x11\x3f\x88\xd2\x53\x78\x7d\xb0\xee\x9b\x0d\xb2\xd6\x27\x63\x5b\xac\x05\xb0\xad\xe1\x37\xe3\xa3\xce\x94\x39\x38\x7e\x46\x12\x67\xd9\x57\x44\x5a\xf9\x11\x03\xf4\xc5\x7d\x62\xc8\x77\xd1\xb9\xcb\xab\xc3\xb9\xee\x42\x87\x41\x1d\x62\x8b\x2c\xf0\x23\x5a\x34\x8d\x10\x14\xad\x9e\x44\x22\x85\x91\x48\xe3\xa8\x53\xff\x14\xf0\x67\x3e\xde\x17\x80\xf0\xb4\xb6\x5a\xb2\xf6\x64\x1c\x41\x2d\xb7\xfb\x87\x28\x70\xc6\x37\x8a\x8f\x3a\xb7\xc5\x16\x5a\xda\x81\x21\x09\xdc\x68\xaf\x20\xfb\x42\x34\xcb\xc9\xdc\xde\x9d\xb6\x09\x88\xb6\x96\xf5\x18\x82\x35\x8a\x5d\x63\x01\xc7\xcd\x4a\x6b\xe4\xf8\xb4\xff\x85\x54\x7a\xf7\x49\x49\xa2\xb1\x32\x7d\x1c\xd0\xb7\xf1\x58\xc3\x7d\x8b\xf7\x29\xd8\x9f\xf1\x51\xe7\xa2\xd4\x3a\xdb\xa9\x1e\xe7\x41\x3a\xae\x04\x21\xa9\xc0\xfa\xd7\xe0\x5b\xe1\x53\x96\xee\x5d\x1b\x71\xb2\xb4\xd2\x6b\x7b\x71\xe2\xaa\x80\x80\x1a\xed\xee\x95\xb6\xc6\x5f\xfe\x50\x64\x0f\x38\x96\x4e\x8f\x96\xbf\x17\xab\x61\x85\x21\x19\xf1\xec\xa6\xf0\xaa\xfd\x28\x29\x5f\x87\xda\x23\xde\x6e\x04\x52\xd6\x80\xe6\x45\xef\xbc\x28\x46\xea\xd4\xfc\x19\x44\x00\xfb\xce\xae\x7f\x20\x1e\x49\x1e\x93\x9d\x13\xcb\x24\x4d\x6c\x4f\x5e\x07\x69\x77\xd6\x79\xb7\xbf\xaa\x2f\xf2\xc6\x70\xfb\xe2\x48\x07\x74\x8d\x5a\xb8\xd5\x97\x5b\xe0\x57\xa8\xb4\x94\xbe\x74\x44\x33\x75\xdc\x0d\xa7\xae\x4c\xb1\x48\x61\x2b\x8a\x94\x09\xb3\xab\xf2\xeb\xa1\x5f\x30\xdf\xde\xa9\x55\xfa\x1d\xf4\xbd\x8b\xb2\x72\xf4\x3d\xf6\x57\x92\xb3\x26\x30\xcd\x82\x2a\x64\x38\xe1\xa4\x39\x4e\xa9\x1f\x28\x8d\xb4\x1e\x7f\x7d\x15\xc1\xdf\xdd\x57\xeb\xbb\x2c\x56\x3d\x7f\x05\x88\x5d\x4d\x27\x83\x9d\x05\x74\x99\x1d\x05\x43\xcd\x0f\xa9\x8f\x3c\x13\x68\xf2\x7b\x37\xf4\x3a\x81\xfb\xae\x75\x4b\x78\xa5\xb6\xb6\xa9\x49\x73\x84\x4e\xda\x3f\xad\xd3\x1c\xc2\x02\x88\x52\x4a\x73\x62\x32\x05\xde\x85\x25\x0a\xd0\xd8\xab\x0f\xe8\x80\x8b\x47\x0c\xbd\xdf\xeb\x9c\x37\x29\x7c\x0a\x1a\xb6\x1f\xdd\xc7\xb3\xbf\x2c\xac\x81\x98\xe9\xc4\x54\x6a\x3c\x1a\xa8\xba\x10\x2a\x07\x93\x93\x2e\x95\x64\xc1\x9b\x85\x53\x47\xc7\x55\xe8\x3f\x85\x25\xdd\x50\x56\x70\xaf\xd7\x2d\x13\xc7\x40\xd8\xf9\x0e\x44\xa5\x21\x44\x99\xa4\x2d\x96\xfb\x8d\xd1\xb9\x26\x09\x30\x59\xea\xc4\x40\x1a\x7b\x20\x65\xc9\x82\x37\x7a\xf8\xfd\x02\x73\x1e\x7f\x01\x89\xb2\xea\xb1\x28\xbf\xa9\xa4\x5c\xdc\xdb\x5d\x68\x52\xdc\x09\x08\xce\xdb\xe6\x82\x7e\x83\x0b\xd4\xe0\xc2\x23\xcd\xed\x9d\xff\x6c\xeb\xb9\x6f\x5d\x6c\xca\x70\xef\x1f\xab\xf6\xad\xac\xfd\x29\x8c\xa3\x3e\xef\xba\xf3\xce\xad\x5b\x5e\x48\xc0\x58\x42\x61\x79\x5a\x6e\x9e\x03\x0d\xe2\x0a\x77\x49\x9e\xfe\x5b\x00\xcb\x59\x74\x55\xa9\x41\xa3\x16\x35\xf4\xf2\x13\x47\x5e\xa5\xbf\xeb\xc5\xb6\xb2\x53\x42\x64\x3e\x28\x66\x6b\x18\xe9\xb1\x28\xf2\x55\x96\x2e\x2a\x52\x12\x69\xf9\x1a\x97\x86\xa2\xfa\xac\x3d\x5d\x03\x51\x60\xb1\xfe\x54\xe2\x23\x9e\xeb\x24\xb7\xf7\xf9\x26\xa1\x3b\x05\x16\xf9\x9e\x9e\x91\x99\x40\x14\x41\x6c\x06\x1a\x58\xfe\x69\x45\xc1\x5f\xe3\xcf\x81\xd6\x6d\xab\x94\x5a\x76\x71\x45\x52\x9e\x59\xde\x77\xd2\xed\xf3\x57\x7d\xe3\x40\xa1\x86\x74\x97\xdc\x73\x78\x3b\xe4\x30\xb9\x83\xc1\x2d\x72\x0d\x3a\x7b\xbe\x10\x22\x10\x48\x6a\xcc\x66\x88\x9c\x87\xde\xb5\xac\x9e\xfa\xee\x41\x1e\xd6\xb5\x76\xd2\x30\x4e\x01\xf2\x9d\x3f\x9c\x6a\x96\xa3\xd3\xa2\x68\x39\x99\x24\x33\x2a\x20\xcb\xdc\xc8\x23\x4f\xea\x5f\x75\x7e\x48\xb2\xd6\xbd\x1b\x40\x2e\x43\xcc\x73\xce\xa1\x78\x1a\xac\xc1\xa8\xa6\x8b\x1f\xe8\x88\x1f\x3b\x82\x1b\xbf\xa0\xec\x3b\xb8\x83\xa2\x6b\x0f\x01\x82\xa5\x14\xea\x4e\x57\x07\xd7\xc8\xbc\x1b\x6a\x90\x84\xcb\xc4\xad\x8c\x75\xb2\xb8\x4f\x73\x7d\x52\xea\x64\x89\x38\x6a\x92\x03\x09\xf6\xb3\xe0\xb1\xad\x59\xda\x6e\x5f\x12\xc5\xeb\x9e\x1d\x19\xfc\x01\xf6\x25\x21\x06\x6b\x7b\x81\x7a\xca\x62\xec\x70\xde\x88\x01\x31\xea\x38\x1c\x92\x83\x23\xfa\x92\xe1\xfa\x2d\xb7\x94\xcf\x93\x3d\x6f\x74\xa3\x7d\xc3\x1b\xa1\x8e\x53\x9a\xa9\xa2\xe4\x47\xbc\xf7\x1b\x83\x2c\xd9\x24\xec\xae\x35\x40\x3d\x2e\x22\xa4\x7b\x0c\x2c\x65\x26\x21\xc6\xee\xb2\xe8\x2d\x1a\xac\xfe\x63\x9e\x5c\x98\x1f\x97\xef\x84\x2d\x0d\xfc\x6c\x2b\xae\x85\xa1\x46\xc2\xe2\x24\xd7\x4d\xc7\x49\xad\xf5\x3e\xbb\x58\x6e\xe7\xca\xe8\x6c\xb5\xe7\x18\xa8\x19\x24\x77\x77\xa5\xbe\x63\x89\x55\x9a\xc3\x63\xca\x89\xec\x20\x6d\xa6\xcb\x05\x43\x8c\xdd\xef\xf3\x22\x5f\x95\xda\x9e\x81\x42\x78\x88\xa3\x55\x89\xca\x6c\xb7\x5f\xd4\x8e\x23\x4d\x0e\x4b\xd6\x61\xa1\xe3\x20\x88\x21\x30\x82\x1c\x0b\xa5\x71\xd8\x8f\xdc\xd3\x4c\xeb\xe1\x05\x11\xcf\xe5\x83\xb6\xee\x7c\x6d\x60\x58\x99\x1f\x14\x62\x8b\x15\xae\xaf\xe2\x31\x77\x79\x18\x3f\x82\x84\x8a\x05\xd4\x35\xa7\x0d\x18\xe4\x9a\xec\x94\x5e\xcf\x1d\x7f\x03\x7e\xe7\x95\x91\x9f\xe4\x6b\x1c\x58\xe8\xdc\x91\x4b\x8f\x34\xea\x78\xbe\x63\xc1\x9c\xee\x47\x6c\xa6\x45\xc7\x13\xba\xbb\xd6\xa5\xf7\x19\x78\x5a\x5b\xde\x1e\xdd\x4b\x62\xde\xde\x77\x16\xcb\x1e\xa6\x60\x15\xc0\x8b\x2c\x29\x3b\xfa\x01\x73\xb4\xa8\x2a\xd4\x72\x5a\xfb\xf2\x86\xc4\xbe\xed\x66\x0b\xeb\xb4\x28\x3d\xd3\x4d\x62\x54\xb1\xad\xec\x1f\xdc\x95\xbd\xf7\x76\xe2\xb9\x0a\x32\x6a\xff\x1f\x7b\x7f\xbb\xdc\xb6\x72\xfd\x0b\xc2\xdf\x75\x15\xfd\xa8\x2a\x65\x29\x0f\x04\x5b\xb2\xbd\x1d\xdb\x67\x4e\x1d\x9a\x82\x6c\x66\x53\xa4\x42\x52\x76\x7c\xa6\xa6\x2a\x4d\xa2\x29\x76\x0c\x02\xdc\x68\x40\xda\xcc\xa7\xb9\x87\x73\x03\xf9\xf8\xf7\x7f\xae\x60\xea\x7c\x8b\x6a\x6e\x64\xae\x64\xaa\xd7\x5a\xfd\x06\x80\x92\xbc\xf7\xb6\x93\x93\xb2\xaa\xb2\x63\x5b\x40\xa3\x5f\x57\xaf\xd7\xdf\x6f\xa9\x67\xc1\x59\x63\x9e\xc1\xbc\x6c\x1c\xc2\x79\x5d\x81\x11\xae\xb5\xb6\xc2\x5a\xdc\x8e\xab\x0a\xf5\x3b\x4c\xc9\x03\x2b\x52\x15\x59\xea\xed\x58\x53\x67\x4c\xbf\xb5\x27\x26\xf5\x13\x46\x3c\xc1\x00\x5a\xad\x99\x1a\x40\x01\xf1\x67\x06\x12\x3b\xef\x68\x82\x5d\x4b\x4e\x56\xe0\x91\x1e\xa9\x48\xd9\x7e\x9d\xa7\xf5\x7a\x03\x9e\xf6\xfd\x3a\xd7\xfb\x44\x9b\xce\xd5\xaa\x48\x15\x01\xc2\xa4\xf5\x02\x6d\xf1\xb9\xcc\xf5\xb7\xbc\xbd\x04\x60\x40\x94\xc2\xd2\x14\x6a\x86\x91\x17\xa9\x9f\x28\xac\x4b\x3c\x66\xed\x1d\x76\x97\x48\x84\x42\x34\x6c\x40\x56\xcd\xc5\xf1\xab\x2f\xf5\x8b\x96\x67\x5a\xb1\xa7\x30\xb5\xcf\xee\x38\xa2\x36\x3d\xd2\xf1\x07\x37\x06\x87\xbd\xbb\xcf\x44\x86\x8d\xfb\x22\x66\x7d\xa6\xea\x79\x59\xd4\x95\xcc\xe9\x52\x84\xab\xbe\xe4\x24\xa7\x10\x2b\xde\x7f\xc6\xc2\xfe\x65\x3c\xbf\xaa\xf5\x5d\x7a\x18\xd4\xef\x00\x90\x1d\x1c\x01\x20\xc4\x02\xee\xab\x96\x7a\x55\x92\x81\x20\xd6\x80\x4c\x18\x7c\x40\xbf\x7c\xcd\x4b\x89\x17\xbe\x41\x0a\xa4\x8f\x31\x0b\x0f\xb7\x0d\x5b\x0d\xa2\xf0\x9e\xd5\xea\x82\x06\xcd\x53\x60\xaa\x09\x3c\x0b\x0a\x02\x58\xfa\x18\xc2\x41\x75\x2b\xc3\x7e\x08\x96\x44\xa8\xb0\xc7\xc6\x32\x00\x5b\x33\xec\xae\xb3\x72\x89\x4e\x0d\xc1\x3d\x01\xae\x50\x82\x1c\xc0\xb4\x2b\xd8\x17\x57\xa5\x20\xcd\x17\x50\xfe\x6c\x98\x8d\x1a\x83\x35\xfb\x43\xcc\x7a\x4e\x9c\xdd\xed\x11\x69\xa8\x5d\xdc\xbf\x78\x82\xed\xeb\x81\x6f\xd9\x20\x5b\x5b\x4e\xda\x10\x98\xbf\x98\xca\xca\xc2\xd7\x06\x48\x8d\x88\xc9\xf2\x02\x7c\xc1\x15\xe3\x55\x25\xd6\x1b\xf0\x52\x83\xcf\xc2\x96\xd7\x77\xdc\x03\x4b\xae\x95\xb5\x6b\x09\x49\x08\x36\x1d\x2f\x4f\x91\x3e\xce\xa6\x79\x77\x0e\xc3\xd1\x19\xb6\x77\xc3\x03\x0f\x2e\x4c\xf1\x4b\x94\xe7\x60\x1e\xee\x72\x6a\x7a\x20\x53\x86\x1d\x8f\x6a\x6f\x49\xb0\xaf\x8b\x4a\x98\x4b\xb3\xe5\xd4\x81\x4b\x84\xee\x66\xe3\xab\xb2\x96\x4b\x18\x02\x74\xf6\x10\xba\xd0\x9e\xc4\x6c\xf6\x6e\x30\x65\x17\xbd\xfe\x8f\xbd\xb7\x09\xd3\x7f\x9c\x8c\xdf\x0f\x4e\x93\x53\xb6\xdf\x9b\xb2\xc1\x74\x9f\xf5\x46\xa7\x01\x8b\x6e\xf2\xe7\x8b\x49\x32\x9d\xb2\xf1\x84\x0d\xce\x2f\x86\x83\xe4\xd4\x10\xeb\x0e\x92\x69\xc4\x06\xa3\xfe\xf0\xf2\x74\x30\x7a\x1b\xd9\xb7\x86\x83\xf3\xc1\xac\x37\x1b\x8c\x47\x11\x9b\xbd\x4b\x3a\x5e\x63\xe3\x33\x4b\xb7\x3b\x20\xba\x5d\xfd\xdd\xfb\xf9\x76\xf5\xdc\x26\x79\xfa\xcf\x8e\xbb\xfd\xab\xfc\x58\xfc\xff\xfe\xd1\xd3\x7f\x12\xfe\xff\x0f\x27\x4f\x5f\xb4\xf0\xff\x9f\x3e\xff\x1e\xff\xfb\x16\x3f\xf7\x40\x93\xe6\x7d\x27\xec\x9e\xc6\x4f\xd8\x65\xae\x0d\x23\x91\xb2\xfe\x24\xe9\xcd\x06\xef\x13\xa2\xd5\x9d\xb2\xfe\x78\x72\x31\x9e\xc0\xa1\xd5\x52\x61\x34\x9e\xb1\x1e\x1b\xf6\x3e\xb0\xb3\xc1\xe4\x1c\xce\xe6\xe9\x38\xc1\x7f\x27\x89\xc1\x86\xc9\xdb\xde\x90\x4d\x93\xc9\xfb\x41\x3f\x99\xc6\xec\x74\x30\x9d\x4d\x06\x6f\x2e\xa1\x8d\xf1\x19\x4a\x9a\xe1\xa0\x9f\x8c\xa6\x89\x7b\x1b\xbe\x9c\xb0\xde\x88\xf5\x66\xb3\xf1\x64\x94\x7c\x3c\xea\x0f\x07\xc9\x68\xc6\x26\xc9\x10\xbe\x3f\x7d\x37\xb8\x88\xdb\x3d\xa4\xcf\x4e\xb1\xdd\xc1\xe8\x6c\x3c\x39\xc7\xfe\x8e\x47\xba\xb9\xfd\xde\xf4\x48\xcb\xaf\x37\xbd\xe9\x60\xda\xf1\xfe\x79\xef\x47\xe8\x82\x2f\x86\x26\xc9\xdb\xde\x44\x0b\x2f\x94\x53\x5e\x9b\x46\x2c\x46\x38\xf6\xc1\xb4\x3f\xec\x0d\xce\xf5\x78\x0c\x3d\xb8\x96\x51\xa7\xbd\xf3\xde\x5b\x68\x67\x7a\x39\x9c\xe9\x76\xce\x26\xe3\x73\x36\x98\x4d\xd9\xe5\x34\x89\xf7\x4c\x1c\x56\xb7\xfe\x61\x3c\xf9\x91\x1d\xf4\xa6\xec\x34\x39\x1b\x8c\x92\x53\xf6\x26\x19\x8e\x3f\x1c\x06\x32\xf8\x72\x74\x9a\x4c\xa0\x2f\xb3\x64\x72\x3e\xb5\xb3\xd8\x9e\x8c\xcb\x37\xc3\x41\xdf\xce\xee\xc1\x7e\xbf\x7f\x31\xdc\xd7\x32\x7a\x9f\xfe\x0d\x80\x65\xcd\x67\xf1\x1b\xb3\xa4\x3f\xd3\xdf\xfd\xc8\xfa\xe3\x8b\x8f\x93\xc1\xdb\x77\x5a\xc2\x9f\x3e\x1e\x4f\xd8\x78\xf6\x2e\x99\xb0\xde\xc5\xc5\x70\xd0\xef\xbd\x19\x26\x7a\xe9\x63\x10\xff\x97\xd3\x04\xbb\x41\x4d\xe1\x93\xb3\x77\x7a\x01\xa7\xac\x77\x39\x7b\x37\x9e\x0c\xfe\xbb\xd7\x77\x6f\xd1\xc7\x13\xef\x4b\x7a\x33\x61\x3f\xde\x0d\xde\x0c\x66\xc9\x69\xbc\xf7\x46\xdf\x2e\xc9\xa4\x3f\x98\xea\xa9\xd3\x5f\x83\x47\xa7\x6c\x36\x76\x1f\xb4\x93\xf3\x2e\x99\x24\x11\xfb\x38\xbe\x64\xbd\x7e\x3f\xb9\x80\xbe\xb3\xde\xdb\x49\x92\xe8\xe7\xdf\x24\xec\xcd\xf8\x72\x04\xc3\x6b\x4f\x20\xf5\x28\x36\x2d\x27\x7f\x9e\xe9\x2d\x17\xf4\xf6\xbc\xf7\x51\xb7\xd2\x1f\x8f\xa6\x83\xd3\x64\x92\x9c\x52\xb3\x3d\xfd\x4f\xb3\x49\xaf\x3f\xc3\xeb\x0c\x9f\x1f\x4f\xd8\x5b\xbd\x8d\xa6\xd0\x23\xfd\xef\xd4\x77\xfd\x70\x0f\x16\x58\x77\x98\x0d\x46\xb6\xc5\x9e\x39\x19\x1f\xc7\x97\x13\x1a\x44\x6f\xd4\x87\xf9\x9d\x5e\xf6\xdf\x51\x9f\xf5\xb0\xfa\xe3\xd1\xe9\x00\x0e\xc3\x0e\x7a\x44\xcc\x3d\xdd\x87\xa2\x39\x50\xe6\x4c\x04\x10\x10\xb8\x3e\x35\xe1\x67\x3f\x00\x6a\x62\x51\x86\xff\xe2\x85\x91\x36\xa5\x38\x12\x3f\x4b\x8c\x1c\x20\x91\xa2\x03\xad\xb6\x28\xb4\xe8\x48\xb0\xdf\x8c\x9a\xbc\x69\x91\xef\xa6\xd2\xea\x0f\x00\xbb\xba\x6a\x16\x40\xb0\x75\x79\xe1\xdc\xc1\x3a\x02\xf6\x06\x25\x03\xdc\x98\xce\x6e\x56\x45\x0e\x86\x2c\xfc\xc5\xa1\xf1\xf9\x55\xd1\x8a\x2d\x64\x2e\xd6\xbc\x2a\x40\xd9\x96\x0b\xaf\x7f\x8d\x64\x24\xb0\xe8\x03\xc8\x5d\x98\x04\x5b\xed\x8b\x68\xaa\x4d\x48\x5d\x4e\x75\x89\x01\x2e\x1f\xb8\x9f\x74\x73\xa5\x58\x14\x57\xb9\xfc\x1b\x98\x3c\xad\xe8\x9b\x09\x07\x46\x04\xac\x69\x60\xce\x61\x89\x28\x5a\xef\xd2\x26\x39\xeb\xbb\xd8\xbd\xcd\x2e\x0f\x2d\x12\x9e\x33\xb7\xe6\x1e\x48\xb7\xcd\xa1\x03\xfd\xd0\xe2\xc7\xdd\x0f\x24\x66\xa7\xe1\x6e\x20\xde\x60\x39\x88\xb2\x79\x9b\x2f\x56\x65\x61\xa2\x23\x16\xef\x14\x1a\x23\x58\xdd\xa3\xbb\x60\x75\xd9\xc1\x3e\xb4\x21\xf3\xab\xfd\xc3\xae\xe4\xc5\x2f\x1b\xac\x71\x39\xc7\x6c\xdf\xcd\xa3\x3b\x16\x61\x5e\xc4\xce\x8d\xe7\xed\x7b\x91\x2f\xb6\x8b\xac\xd8\x88\x54\x72\x8a\xdf\xe6\xd5\x0a\x50\x88\xa8\xb0\xc9\x9b\x20\x15\xb9\xf9\x81\x7d\x67\x01\x7a\x95\x57\xce\x45\xfc\x23\xa5\x45\xd3\x58\x6b\xfb\xa6\xf4\x81\x14\xf1\x91\x4c\xaa\x2a\x04\xc9\x39\x3e\x58\x1e\x62\x06\x04\x85\x88\xc0\x2f\x8b\xd9\x27\x36\xdc\x2d\xcc\x10\xa1\xb7\xe1\x59\x34\x54\xea\x58\xe5\x1a\x79\x5b\x0f\xac\x27\x98\x1d\xa8\xca\x05\x9d\x82\x50\xf2\x9b\x87\xc5\x15\x39\x42\xe7\x64\xa5\x00\xe4\xb0\x14\xd5\x96\x41\x2e\xa8\x8d\xc9\xc0\xf1\xe0\xe0\x2b\x42\x7f\x68\x0e\x9b\x68\x5d\x94\xc6\xbf\xed\x93\x2b\x2a\x47\x31\x89\x9d\x82\x08\xa6\x09\x6f\x75\x71\x9e\x9b\x28\xe0\x5a\x89\xec\xda\xc5\xcd\xac\x27\x1e\xbc\x43\x0a\xd2\x8d\x8c\x27\xc1\x6d\x82\x6b\x81\x10\x7f\x31\xeb\xfd\x66\x87\xf1\x80\x2b\xeb\x60\x40\xf2\xf0\xe6\x96\x55\xbb\xf6\xec\x22\x66\x2e\x61\xc4\x25\x73\x90\xa9\xbb\x0b\x29\x34\x48\x38\xc0\x3c\x72\x3f\xf7\x01\xd6\xab\x28\xbd\x2e\x22\x2a\xe6\x66\x53\x16\x9b\x52\xf2\x0a\x5c\x59\x98\x10\xa4\x38\xc2\x1d\xda\xcc\xd3\x5c\x2d\xd1\x64\x2e\x6e\x72\x01\x3c\x39\x36\x46\x11\xbb\x84\xe2\xfd\x4e\xe4\xcb\xc8\xfb\xb3\x5e\x57\x04\xc1\x34\x70\x98\x36\x91\x1b\x3c\xfe\x07\xea\xd0\x75\xb6\x89\x55\xb6\x63\xb6\x44\xcc\xf6\xc7\x66\xdc\x3d\xc8\x52\xdd\x37\x00\x10\x26\xe9\x87\x13\x11\xc6\x5d\x37\xcc\x97\xf6\xfa\x66\x55\x78\x99\x54\x6e\x82\xe5\x92\xe5\x45\x37\xf2\xe7\x82\xe7\x90\x06\x4f\xf0\x32\x00\xd9\x6e\x16\x50\xad\x44\xf9\xda\xa4\x72\x9b\x02\x1c\x76\x20\x0f\xdb\x83\xf0\x05\x31\x88\xf3\x45\x05\x35\xba\x4a\xe6\x57\x42\xff\x01\xe4\xb6\x84\x19\x00\x31\x5f\x52\x64\x8b\x2e\x77\x00\xaa\xc2\x01\x00\xbc\x81\x82\x6c\xe0\x54\x64\x12\x4b\x9a\x04\xa4\xa2\x44\x6c\x93\x71\x7d\x8c\x23\xe7\xb4\x0e\x33\x10\xa8\x1f\x77\x48\x4f\xe6\xa0\x8b\xcc\x2d\xbf\x2c\xb2\x4f\x59\x51\x8a\xd7\xec\x40\x76\x0e\xce\xde\xf2\xe4\xba\x4e\xeb\x05\x38\x4d\x4d\x72\x00\xb1\x22\x5b\x1a\x31\x9a\x5b\x3d\x9a\xa5\x2c\x55\x45\x39\x31\x94\xef\x93\xa7\xaa\x3d\x69\x0e\xbb\x0b\x1e\x80\x69\x8f\x74\x7f\xda\x1d\xf2\xe5\x36\x9e\x30\x97\x01\x40\xee\x2c\x7d\x3c\xd6\x86\xc9\xc0\x3e\x6f\xb6\xe7\x32\x66\xfb\x7a\x6b\xf8\x87\xc3\x4e\x98\x81\xfa\xf2\x27\x0d\x4f\x42\xc0\xac\xdf\xb9\xff\x3d\x15\xa4\x9d\xc8\x6d\xea\x6d\x08\xd4\xd8\x8c\xca\x7c\x38\x62\x6a\x21\x09\xe3\x88\x2e\x07\xea\x41\x4a\xa9\x41\x37\x2b\x5e\x81\x3b\x9f\xf4\x21\x0a\xb0\xc3\xdc\x99\x58\x08\x88\x7b\xbb\xba\x5e\x7f\x52\x79\x25\x2b\x9e\x51\x80\xdb\x29\x8e\xf3\xa2\xd0\x7a\x04\x5f\x6f\x56\x99\xa8\xbc\x2d\x79\x53\x4a\x2d\xe2\x5f\xeb\x13\xaa\xef\x9d\x52\x68\xc5\x32\xc5\x4a\x7b\x25\xca\x75\x91\x87\xb7\xa6\xbd\xe2\xf8\x5a\xb0\x9c\xeb\x37\xf4\xcb\x69\xc9\x21\x90\x01\xe9\x78\xf4\xe7\xe2\xc8\x57\x63\xf4\x53\x8b\x55\x51\x0a\xab\x20\xde\xd0\xb9\x15\x7a\x93\x57\x5c\xe6\x6b\x62\x75\x4d\xeb\xf5\x9c\xa9\x55\x71\xf3\xda\x53\x85\x16\xc5\x7a\x53\x28\xe9\x94\x18\x42\x96\xd2\xd3\x7f\x53\x94\xb0\x99\x5a\x3a\x28\xde\x29\x85\x07\xf3\xcd\x15\xc2\xc6\x41\xa4\x02\x4e\x0a\x4d\x24\xba\xa3\xb9\x85\xb5\xe6\x39\xcf\x8a\xab\xa2\x56\x88\xa2\xe9\xb5\xbb\x7d\x6d\x54\x47\xad\xc4\x95\xfc\x06\x4e\xf1\x86\x4b\x40\xdf\x8e\x30\x15\xa7\x32\xb3\xa9\x16\x75\xb6\xc1\x3f\x8a\xfc\xaa\xe4\xd7\x94\xb4\x98\xe9\xbe\xbb\xf6\x36\xab\xe2\xb7\xef\xb6\x6b\x34\xe8\xb3\xc1\x60\x27\x40\x5d\x26\xb3\xac\x56\x55\x49\x77\xd3\x9a\x6f\x40\x02\xe5\x11\x53\x9f\x44\xb5\x58\x11\x1a\x9b\x10\x47\xa9\x5c\x8b\x5c\x61\x7d\x22\x34\x86\x6a\xe5\x35\x05\xd5\xe9\x53\x11\xab\x8a\x8d\xfd\xb3\x3f\x1b\xa0\x71\xe9\xfd\xbf\x80\x4d\xe3\x49\x06\xfd\x57\x7b\x82\x5f\xfb\xd2\xe8\x35\xd1\xea\xca\xcc\xaa\xb7\x29\xaf\x78\xa3\xca\x1b\xab\x7b\x09\x85\xda\xd1\xb2\x90\xc3\x17\x2e\x6d\xdc\x84\x80\xe6\x00\x7d\xa7\xaf\x9b\x09\xbc\xe6\x25\x40\xcb\x15\x25\x62\xa6\x2a\xfb\x40\xd9\xf9\xad\x00\x99\x2f\xd0\x46\x76\x8b\x65\x23\x9a\xae\x62\x86\x59\xae\xa4\x14\xe7\xf7\xe2\x55\xb7\x8b\xb4\x1d\x34\x49\x61\xf3\x7f\x0d\x26\x56\xb6\xa5\xca\x5f\x91\xde\x21\xc6\xe0\x14\x59\x72\xa2\x22\x34\x50\x4d\xb3\x36\xfd\xd3\xd4\x3b\x7b\xb9\x3d\x77\xa3\xa0\xee\xee\x72\x2a\xd4\x06\xd2\xd4\x1c\x88\x97\x2d\x54\x36\x53\xb4\x8a\x19\x51\xf4\x64\x5b\x76\x81\x2b\xe1\x29\x64\xe6\x06\x24\x15\xac\x14\x0b\x8b\xbb\xec\xab\x5d\x04\x04\xec\x95\xca\xb6\x74\x37\x6d\xc2\xb4\x5b\x89\x76\xc1\xdd\x07\x94\x55\x5b\x76\x23\x71\x57\xeb\xff\x87\x84\x75\xf7\xbc\x01\xb3\x47\x89\xec\x9b\x28\xaf\xef\x55\x29\x3f\x18\xc5\xda\x4b\xea\x7c\x30\xfc\xbc\x12\xf4\x7e\x37\xfa\x3c\xfe\xf5\x0e\xf8\xf9\xd7\xfe\x04\xdb\xa9\x7c\x18\x19\x80\x21\x26\x0a\x90\xf8\x1b\xef\x9a\xbe\x7b\x33\xe2\x2f\x5a\x63\x86\x77\xcf\x23\xf4\xd3\x0a\x0d\x02\x8c\x73\x7f\xb7\x3d\x0f\xfa\xea\xda\x56\xf2\x4a\xaf\xb3\x51\x55\x4a\x34\x86\x6d\x16\x93\x8c\xd9\xfe\xc4\xe0\x4e\x35\x4d\x81\x0e\x0d\x7f\xc7\x57\x3a\x34\x84\xf9\x96\xa8\x62\x8a\x92\x5d\x4b\x55\x03\x43\x19\x91\xc6\xb8\x19\xb4\xa1\xff\xa5\xfc\x99\x5b\x5b\xd2\x20\x61\x41\x65\x25\xfd\x62\xe7\xec\xa9\xaa\x28\x21\x71\x6c\x89\x17\x04\xc9\xc6\x5d\xee\x04\xb8\x7a\x3d\x05\xc2\x5d\xfc\x60\xce\x96\x45\xae\xb7\x1a\xe4\xa7\x9a\x54\xe9\x33\x2e\x4b\x76\x8a\x34\x26\x06\xe6\xa8\x55\xa1\xea\x15\x19\x5b\x26\x4b\x00\x65\x0c\xaa\xaa\x81\x83\x0a\x83\xea\xa6\x7e\x5a\xef\x60\x41\x65\xe4\x41\xf9\x80\x05\x3a\x45\xe1\x08\x0f\x64\x1e\xf4\x7a\xe1\x31\xa8\x04\xc4\xf1\x14\x0d\x45\x86\xcf\x56\xbd\x5d\x98\x75\xe1\x51\x1a\x34\xe9\xf3\x32\x7e\xe3\x39\xd3\x1c\xc1\x5f\xc6\x6f\x94\xc9\xa6\x36\xa3\x7e\x8b\x84\x79\x5f\x02\xf6\x6f\x41\x3a\x7e\x39\xc2\xbf\x07\xe7\xbf\x11\xe5\x46\x80\x47\xe1\xc0\xd8\xc1\x69\x5d\x06\xbe\x22\x6f\x08\x76\x90\x87\x3b\xb1\xff\x43\x0a\x3e\x94\xb3\xca\xe0\x00\x80\x67\xe4\x95\x73\x8d\x56\x05\xb3\xa7\xc8\xdb\xa4\x98\x57\x4c\x39\xbe\xbe\xf7\x2b\xaf\x8a\xc0\x45\xe1\xac\x7f\x65\x71\xdd\xdb\x0d\x62\xac\xdf\xb6\x67\x8b\x4e\xbc\xb7\x5f\x3b\xbf\x54\x55\x58\x02\xe3\x3c\xf5\x5a\xeb\x79\x1e\xcb\x30\x72\x6e\xd1\x7f\x7d\x23\xde\x23\xfe\xcf\xb7\xbe\x6f\xd6\x78\x26\x4d\x2e\x77\x05\xb8\x58\x5e\x81\x92\xaa\xc4\x06\xf5\x4a\xca\x78\x04\x8e\x27\x6d\x00\xae\x79\x09\xb7\x54\x60\xee\x91\xd9\x4a\x57\x80\xe1\x2a\xbc\xc1\x2a\x91\xd4\xde\x1d\xd6\x07\xa1\x67\xa4\x81\xa6\x18\xf8\x8e\x09\x79\xc0\x91\x1d\xee\xcf\x56\x0d\x72\x5e\x76\xc3\x7d\xd2\x33\x3c\x62\x49\x7e\xa5\xcd\x65\x00\x9a\xdc\xf0\x5c\xaa\x55\x84\xb5\xb2\x41\xa2\x22\xb5\x6e\x71\x37\x3b\x1a\x6f\x55\x25\xc5\xfb\xaf\x9d\x0b\xa6\x2a\x1c\x33\x35\x2e\x51\x53\x11\xf0\xf7\x8b\x5d\x83\xf6\x0e\xf0\x57\x1f\x2c\x4d\xe7\x3a\x79\xc0\x37\xbc\xdd\x60\xee\x84\x19\xd0\x56\x15\xd7\xf6\x0c\x90\x8d\x66\x8e\x47\xfa\x8b\xa9\x0b\x52\x01\xc8\x4e\x71\xfb\x13\x3e\xea\x68\x58\xf1\x06\x1b\xb2\x81\xbf\x8f\xd9\x58\x96\x19\x20\xdb\xde\x41\x2d\xe0\xce\x31\x95\xb0\x34\x3b\x1d\x48\x2d\x8b\xc1\x71\xb0\x3c\x8c\x02\x4e\x5d\x60\x42\x36\xf8\x05\x06\xaf\x7c\xbe\xf5\xe8\x1f\x4a\x61\x24\x18\x81\x28\xa7\xc1\x25\x4f\xa8\x84\x1e\x03\x93\xd7\x3d\x25\x20\x0d\x15\xd2\x79\x1d\xba\xdf\x41\x7a\x68\x32\xc3\x27\x01\x10\xfe\xcc\x63\x0d\x36\x7d\xf1\x21\x09\x69\x72\xef\xc4\x55\xb6\x90\x54\xae\xee\xcf\xe1\x1d\xfb\x99\x5f\x9e\x9c\x33\xd9\x91\xde\xae\x2a\xca\x3b\x36\x2e\x14\x3c\xdc\xe7\x68\x73\x80\x8b\x16\x75\xd2\x24\xde\x3b\xe4\xd9\x5c\x42\xcb\x13\x83\x6d\x3a\x30\x4e\xae\x92\x1d\x5c\x4e\x06\xe0\xfd\x8c\x3a\x34\x7f\x01\x48\x47\x7e\x1e\x3f\x74\x4c\x7f\xf2\xee\x41\xdc\xcf\x36\x40\xa3\xf1\x2e\x08\x2a\x4a\xa3\xfb\x7d\xb7\x4d\x62\xe2\x24\x4d\xb0\x8e\x06\x11\x80\xd1\x48\xbb\xf6\xb3\xc7\x0e\x16\x96\xc2\x75\x4f\xb7\x68\xcc\x36\x0d\xcb\x52\xe4\xb8\x4b\xc6\x5b\x8e\x4f\x42\x6c\xf4\x5d\xc5\x17\xc8\x1f\x6b\x8a\xcb\x1c\xfa\xb2\x45\x6e\xb6\x88\x5f\x79\x7a\x1f\x20\xf3\xaf\x5e\x97\x0f\x04\xea\xf5\xd0\x5d\x18\x05\x43\xf6\x16\x50\x58\xc6\x87\x2a\x60\x7c\xb0\x4c\x7e\x77\xaf\xad\xb7\x7c\x7c\xc7\xe2\x59\x90\xf8\xdf\x7c\x15\x67\x01\x0c\xe8\x01\x3f\xf4\x09\xf1\xee\x52\x18\xfc\x50\x03\x66\x17\x52\x81\xb6\xc5\x0d\x05\xf8\xde\x86\x62\xc1\x38\x64\x27\x5a\x5b\x18\xaf\x25\x48\x57\x67\xc8\x70\xdb\x05\xdb\xbe\xe3\xbc\x13\x36\xbb\xd1\x4e\x82\x0e\x41\xc8\x98\xea\xe7\x08\x59\xc9\x93\xb1\x66\x6b\xb6\xe0\xef\x1c\x76\x70\x64\xe0\x89\xbd\xd2\x42\x37\x8a\x7c\xab\x3f\x9b\xca\x0a\x79\xd9\xda\x48\xc5\xcf\x0e\x16\x87\x91\xf9\x25\x00\x21\xb7\xfa\x9b\x07\xfa\xd1\x57\xe8\xb0\x17\xe6\xf9\x45\x1d\x76\x3a\xa0\xbf\xf1\xed\xfe\xf3\x70\x9b\xbb\xa9\x06\xbb\x6e\x12\xd2\xf5\x1c\x02\x21\x7a\xa2\xe4\x9a\x97\x32\xdb\x86\xe4\xfd\x85\xe1\x38\x80\x26\x6f\x78\x99\x06\x75\x04\xe9\x35\xcf\x2b\x2a\xf5\x01\xce\x8b\x4a\xb0\x75\x91\x0b\xe0\x37\x58\x14\xeb\x8d\xc8\x15\xa1\xb8\xcc\x60\xc6\x28\x5b\x35\x38\x58\xd6\x30\xb1\xaa\xbc\xf5\x19\xce\xad\xc5\xbe\x74\x96\x9e\xcc\xc4\x91\x5a\xf1\x92\xfc\x92\x1e\xa6\xec\x8e\x6c\x5c\xdc\xd5\x5f\x65\x5c\x61\x86\x6e\x49\xec\xe7\x6c\xc3\xb7\x26\x7a\x0a\x73\xdd\xf5\xea\x2e\x83\xce\x9f\xa4\xd6\x8c\x78\x81\x3f\xda\xca\x4e\x72\x46\xf7\x5c\xe0\x98\xd2\xd0\x0b\xb3\x1c\x02\x73\xc5\x6d\x71\x82\x79\xe2\x66\x2b\x7a\x1a\xb0\x16\x0e\x9b\xba\x54\x35\xcf\x03\x3d\xeb\x19\x60\x21\x36\x2f\x9a\x76\x3d\xb3\xb1\xe9\xac\xbf\x8b\x66\x30\x6a\xe0\xa6\x57\x16\xa5\x9d\x59\x4a\x49\xc3\x56\x5d\x57\x32\x93\x7f\x93\xf9\xd5\x2b\x88\x7b\x55\x8d\xc4\xd9\x46\x90\x0f\x32\xcc\x2d\xf9\x01\x82\x8c\x59\x03\x12\x00\x9f\x4d\x2a\xb9\x25\x6c\x91\xdd\x0d\xd1\x6f\xad\x4c\xb0\x24\x0a\x61\xa1\x3d\x6c\x1b\x5e\xc2\x15\x79\x20\xe2\xab\x58\xdb\x33\x44\x98\x03\x45\x5e\x10\x2b\x8e\x4c\x38\x4f\x6f\x64\xf4\xa0\x46\xec\xaf\x45\x5d\xe6\x3c\xc3\x10\xb0\x4f\x81\x73\xb0\xef\xa5\xe8\xb1\x0b\x6c\x7d\x1f\xa2\x50\xa6\x3b\x8f\x54\x6b\xba\x23\x27\xb8\xb5\x1e\x2b\xd1\x83\x32\xdf\x06\xb4\xf6\x88\x41\x81\x71\x50\x7f\x2a\x41\x5f\x6f\x0e\x88\xa2\x71\x70\x27\xc8\x2a\x0b\xcf\xb2\x37\x95\xaf\x29\x4a\xf6\x10\x90\x78\xfc\xec\xe5\x64\x60\x00\xe0\x22\x94\x4b\x0e\x80\x90\xa0\x1c\x14\x9d\x65\xaf\x1e\xde\x9e\x1b\xd4\x0f\x68\xe3\x42\xd7\x2f\x27\x03\xff\x32\x5c\x3a\xc7\x78\x73\x9a\x30\xbe\x61\xa8\x56\x7c\x08\x7c\x7f\xb7\xda\xe8\xdf\xf5\x21\x8a\x17\x55\x21\x6c\x70\xb5\xf2\x20\xc4\xe7\x87\xed\x68\x72\x78\xcf\x70\x73\x0f\x18\x3b\xd9\xc3\x23\x69\x65\xc3\x84\x97\x08\xed\xa6\xfd\xb3\x52\xe4\x8b\x55\x60\x23\x37\x7c\x7b\x8d\xad\x8b\x86\xef\xfe\x74\x51\x0a\x91\x43\xb8\xd6\xd2\x21\x04\x66\x78\xc7\xab\x90\x11\x88\xac\x26\xa9\xac\x82\x9b\x2b\x44\x30\x3f\x58\x1c\x5a\xfc\xb6\x35\x41\x99\x93\xa6\xd2\x45\xc8\xf0\xda\x2b\x4f\x76\xf4\x47\x48\x74\xd0\x08\xf5\x7a\x33\x10\xc8\xac\x08\x3d\xc4\x06\xca\x0f\x56\x9d\xba\x09\xa9\x17\x7c\xb3\x11\x1c\xc1\x66\xed\xa4\xc3\xc1\xca\x32\x2f\x8b\x44\x1b\xe3\x30\x52\xab\x9b\xed\xfa\x1e\x35\x68\xa0\xed\xbd\x82\x3b\x74\x63\xe3\x27\x2c\xce\x9a\xc5\xf9\xb5\x45\xba\x48\x64\x45\xd8\x02\xc4\x3f\x65\x5e\x32\x5b\xad\x99\xe4\xe2\xba\x77\x3f\x07\x07\xc0\x21\x80\xa5\x46\xda\xe9\x7d\x8b\xd6\x91\x1c\xe5\x4b\x1d\x57\xd5\x9b\x03\x40\x6a\x05\x60\xd1\xa8\x48\xc0\x61\x98\x07\x51\x9f\x1d\xf8\xbc\xd6\x3f\xd8\xd0\xde\x81\x2e\x0b\xd9\x93\xc4\xcf\xf6\x6f\x4d\xe2\x32\x50\x9c\xc2\x8b\x32\x32\xd2\x54\xad\xe4\x06\x03\x50\x96\x49\xcd\x58\xc0\xcd\x03\xe0\x99\xf7\x28\xc5\x3b\xe4\x69\x3b\xd1\x05\xa1\x76\x99\xc1\xa7\x6d\x9c\x50\x87\x8c\x86\x59\x54\x98\x76\x14\xb9\xd8\xd3\x8e\xaa\x8a\x1d\x17\xd5\x83\xfa\xe8\xe5\xd3\xec\xde\x0d\x1e\x51\x91\x8c\xd9\xa8\xc8\x8f\x2c\xd5\x54\xdf\xb1\x4b\x19\x53\x6f\x0a\xdc\x52\x0a\xc8\xa5\x30\xc0\xe4\x83\x1c\xaa\x30\x9d\xeb\x0e\x22\x2d\x4b\x81\x95\x6f\x1f\xcc\x68\xe5\xa1\x68\x22\x10\x65\x03\xbf\xd7\xb2\x58\x91\x6e\x84\x5e\xe2\xfb\xf8\xac\x6c\x0d\xb1\x55\x95\x09\x70\xb6\x5b\x5b\x6e\xef\x55\x8f\x0a\x48\xca\x98\x7d\xf8\x17\x9e\xbd\x7f\xb5\xa9\x23\x68\xef\x90\x2b\xcc\xa7\xa2\x93\x96\xa4\xc0\x08\x1d\x3c\x58\x38\x4b\xd2\x87\x5f\x84\xcc\xc6\xbc\xc8\x7d\xe5\xdc\xaf\x17\x0b\xe1\xb8\x9f\x1d\xcc\x0f\x5d\xae\x08\x34\x40\x0c\x70\x5f\x61\xea\x03\x0f\xad\xe1\xc4\x7a\x6f\xd9\xdd\x5a\xbb\x63\xb6\x73\x69\x76\x77\xcc\xb1\x29\x04\xe1\x4f\x2d\x29\x48\x32\x23\x73\x41\x9b\xab\x1d\xb3\x72\x21\xf8\x8a\x57\x68\x07\x29\x1d\x46\x0a\x52\x7d\x7b\xaa\x4a\x94\xca\xe3\xa6\x6b\x0e\x56\x45\x54\x14\x0b\x05\xde\xf0\x7a\xe4\x6c\xe4\x5f\xbc\x53\x8c\xf5\xf9\xb5\xb6\xc3\xe2\xd0\xcb\xfd\x23\x1c\xd1\x00\xde\x93\xd0\x6b\xf5\x11\xc5\xc4\xa2\x16\x85\x1a\x02\x82\x92\x5a\xb3\x03\x17\x34\x8c\xa8\x59\x6c\xfb\x89\x63\x01\x7a\xa8\x97\xd5\x14\xfe\x6e\x8d\x47\x06\x3f\x6f\xcb\xfa\x1f\x68\xc0\xc1\x05\x9b\x4a\x55\x15\x65\x15\xb1\xb5\x36\x97\xe0\x5e\x22\x7c\x24\x7d\x6d\x78\x70\x11\xa2\x2c\xae\x38\xec\x78\x6e\x73\xc0\x6c\xfe\xb5\xef\x83\xc2\x15\xb9\x31\xc1\x98\x4d\x29\xfe\x5a\xa7\xc8\xf2\x49\x8f\x35\x2e\xb4\x47\x8a\xad\x8a\x1c\x67\xb1\x14\x9b\x9a\x10\xb0\xbd\x6b\x0e\xa9\x2b\x9d\xd6\xd7\x16\x9f\xa0\xf2\xb2\x3f\xf2\x0d\xcf\x0f\xbd\xcc\xe2\x60\xdf\xf9\x1b\xae\xd3\x8b\xae\x05\x43\xd3\x75\x7b\xd0\x8e\x50\x78\x73\x7b\xe8\xc6\x49\x48\xd3\x64\x7a\x98\x79\xc5\xdc\x23\x9c\x5a\xfc\xb3\x1f\x53\xf2\x78\x54\x9a\xb3\xfb\x05\xd3\x46\x11\xf4\xda\x58\x0e\x55\x48\x53\x98\x65\x28\xdf\x18\x71\xad\xa0\xe6\xd4\x95\xad\xeb\x34\x3e\xeb\xbe\x5a\xd6\x59\xa6\x2d\x7b\xe3\xc6\x6a\x02\xdd\x7a\x9b\x1a\xb1\xe5\x79\x86\xbb\x1b\xaa\x4e\xe1\xdf\xc9\x1d\xea\x19\x75\x76\x45\x3c\x7a\x85\xf0\x50\x76\x2f\xc5\x1d\xcb\xd0\xcd\x2a\xfa\x3c\x86\xe3\xe5\x91\xf6\x44\x4d\x4a\x22\xc7\x57\xa4\x5f\xb8\x1c\x0d\xa1\x1a\x75\xf6\x2e\x99\x7c\x18\x4c\x13\x76\x7e\x39\xbb\xec\x0d\x87\x1f\xb1\x14\x08\x8b\x76\xb0\x04\x08\xea\x47\x93\x29\x1b\x8c\xd8\x87\xc9\x60\x06\x35\xaa\xb6\x78\x67\x7c\x76\x96\x4c\xa6\xae\xcc\x08\xaa\xc7\xa0\xf6\xc6\x16\x8a\x4d\x92\x8b\x49\x32\x4d\x46\x58\xcb\x0a\x15\xb0\x61\x09\x6b\x6f\xf4\x91\xfd\x38\xc0\x72\x9d\x7e\x32\x19\x99\x42\x32\xdd\x60\x64\x0a\x67\x23\x53\xff\x1a\xb1\xe9\xac\x37\xbb\x9c\x8d\x27\x1f\x99\x29\xb9\xd2\x23\xb8\xb7\x86\x36\xfc\xe8\x6c\x30\x1b\x26\x51\xb3\x7c\x36\xba\xb7\x76\x36\x62\xa3\xf1\x68\x30\x3a\x9b\x0c\x46\x6f\x93\xf3\x64\x34\x8b\x74\x2f\x74\x77\x7b\x6f\xa6\x09\x95\x21\x0d\x7b\x50\x17\x65\x2b\xc2\x4e\x93\xb3\xa4\x3f\x9b\x46\xac\xd7\xef\x5f\x4e\x7a\xfd\x8f\xf6\x25\x9c\x1a\x7c\xcb\x6b\x20\x99\x4c\xc6\x93\x69\xc4\x3e\xbc\x4b\xa0\x81\xf1\x04\xaa\xfe\x4e\x07\xd3\xfe\xf8\x7d\x32\xe9\xbd\x19\x26\x31\x9b\x8e\xcf\x13\xf6\xc7\xcb\xc9\x60\x7a\x3a\xe8\xe3\xdc\x9e\x8e\xb1\xe6\x70\x38\x1c\x7f\xa0\x0a\xad\xfe\xf0\x72\x4a\x05\x53\x5d\x85\xc7\xd3\x31\x16\x4d\xb9\x07\xcf\x7b\x1f\xb1\x91\x8b\x8b\xe1\x47\xbd\x0f\x3e\x8e\x2f\x0d\xc6\x86\xcf\x6b\x95\x7b\xbc\x56\xfa\xf5\xe4\x62\xd6\xa8\x0b\x9b\x24\x7f\xba\x1c\x4c\xb0\x56\x2e\x2c\x8a\xd3\x8b\xa5\xf7\x46\xf2\x5e\x3f\xf7\x61\x30\x1c\xba\x2d\xf5\x26\x81\xf2\xc0\x61\x42\xdf\xc6\xc2\xc4\x8f\x54\x28\x39\x7b\x97\xe8\x95\x87\xe5\x19\x7d\x64\xd3\x8b\xa4\x3f\xe8\x0d\x61\xf1\x07\xa7\x7a\x93\x0d\x23\xa8\x14\x4b\xfe\x74\x99\x8c\x66\xf0\xab\x8b\xcb\xd1\x00\xca\xfe\xc6\x13\x96\xfc\x39\x39\xbf\x18\xf6\x26\x1f\x6d\xd1\x61\x6f\x82\x75\x73\x7a\xbb\x34\xcb\x2d\x69\x91\x1a\xc5\x7b\x11\x74\x9b\x0d\xce\x5c\x9f\xdf\xf5\xa6\xec\x4d\x92\x8c\x58\xef\xf4\xfd\x60\x9a\x9c\x9a\xc7\x2f\xc6\xd3\xa9\xa9\xcc\x36\xe5\x69\xf4\x61\x83\xfe\xe0\x31\xce\xb8\x70\xe4\xac\x15\x7a\x6a\x2b\x10\x2b\x51\x0a\x42\x96\x05\xa6\xa6\x6e\x9a\x17\x74\xe3\xeb\xeb\x61\x5e\x42\x69\x48\xa8\x94\xec\x0a\x64\xb8\x1c\xfe\x56\xee\x3e\x70\x96\xd8\xbc\xc2\xdd\xf7\xaf\x8b\x11\x75\xd9\xbe\xd6\xc5\x61\x8b\x42\x90\x0b\x05\xaa\x6b\x1c\x74\xbb\xa3\x9a\xb1\x9e\x65\xd0\x9d\xe5\x8e\x0e\x22\x2f\x80\xa5\x3c\x02\x58\x19\xe9\x43\xa5\xea\x1b\xd5\x41\xcd\xfb\x74\x22\x27\x2d\x46\x11\xe8\x9a\xa1\x15\x31\x81\xd1\x26\xb5\x48\xbb\x6e\xaa\x91\x2b\x84\xee\x81\xae\x8c\x21\xbc\xc1\x9a\xe1\x6e\xe3\x38\xff\x85\x89\x3f\x7e\x62\xcf\x61\x0b\x4c\xdf\xf5\x28\xba\x4f\xfd\x2e\x45\x26\xb8\x17\x3f\xa5\x65\x74\xac\x26\x99\x47\x30\x04\xab\x00\xf8\xc7\x5d\xa4\x30\xe8\xdc\xf6\x79\x60\x5a\xbe\xae\x46\xa2\x8e\x68\xd5\x0c\x41\x17\x21\xab\x5a\x56\xab\xb4\xe4\x37\x8d\x3b\x33\xa8\x51\xcc\x7c\x8d\xda\x38\xeb\x91\xf0\xc3\x0b\x36\x81\x0a\x13\xb5\x34\xf2\x1d\xa7\xe2\x90\x12\x98\xc2\x48\x3c\xb9\xce\x64\x5e\x0b\xbb\xeb\x80\xb0\x02\x51\xf8\x90\x01\x88\xdc\xb0\xde\x6e\x76\x19\x57\xb0\x18\x06\x56\xe4\x5c\xaa\x85\xc8\x32\x9e\x8b\xa2\xf6\x0a\x54\x13\x7d\x70\xf5\xc4\x7d\x49\x74\x18\x53\x7b\x7c\xef\x60\xd5\x45\x13\x58\x34\x42\xf4\xdc\x4f\x1c\xf3\xf2\x1d\xd0\xa7\xc3\xd7\x3b\x92\xdf\xb8\xea\xdc\xcc\x14\x78\x6b\x4b\x00\xef\xbc\x7c\xd1\xe8\x1a\xce\xe3\x2f\x1f\x4e\xe8\xdf\xfd\x6a\xe3\xc2\x90\x54\x37\x7b\x4b\x90\x51\x79\xcd\x33\x09\xb9\xa4\x01\x75\x8b\x61\x68\x68\x9a\x52\x95\x17\xd6\x23\x7a\x29\xdd\x3d\x68\xc4\x16\x5a\xed\x26\x4c\x49\x1d\x80\x4b\xe7\x1e\xc7\x2d\x6e\xbc\x78\xcb\xba\xc4\x14\xc9\x85\x49\x7c\x05\xdf\x28\x85\x72\x4c\x86\x84\xe5\x1e\xa0\x8a\x15\x37\x5e\x0b\x0c\xf6\xc5\x64\x33\x8d\x86\x70\x8e\x10\xd6\xd2\x51\xd0\x38\xcf\x9f\xc7\xf3\xb2\x7b\xb6\x6d\x6f\xc8\x80\x09\x89\x5e\xe8\x76\xec\x62\x77\x81\xce\x18\x76\x95\xd2\x12\x42\x78\x74\x76\xd6\x5c\x06\x2e\x22\x79\x95\x3b\xbb\xc1\x52\x9d\xcc\x85\xc5\x91\x46\xd4\xd2\xce\x56\x3d\x03\x3d\xd0\x01\xfc\x9a\x4a\x70\x74\x40\xb5\xa8\x9b\x7b\x36\x17\xd5\x8d\x20\x7e\x59\xb3\x42\xbb\x2a\x04\x9a\x2c\x74\x33\xe4\x13\x04\x8e\xc9\x16\xbb\x84\x47\x2d\x81\x66\x6b\x40\x0d\xba\xf3\x13\x20\xb2\x2d\xe4\x38\x7e\xe7\xcb\x18\xb4\xec\x4a\x2a\x43\x63\xb2\xa5\x80\x83\x89\xa1\x84\x59\xea\x46\xdd\x68\xcc\x9c\x87\x12\x64\x8b\x6a\x7d\x37\xf5\xba\x86\x3b\xd6\x78\xa5\xdd\x8c\x16\x0d\x1a\x47\xbd\xb6\x86\x15\x11\xeb\xd3\x66\x3b\xbc\x3a\x91\x55\xd9\x1a\xf5\xc9\x10\x75\x13\xf9\x02\x13\xe8\x1a\x57\x09\x30\x80\x96\x7c\x09\xcd\x98\x88\xae\x3d\xaa\x12\xb2\x78\xec\x71\x7e\x23\xca\x5c\xb0\x7e\x91\x5f\xeb\x9d\xe0\x45\x2e\x2e\x5c\xda\x33\x30\xcf\xba\x82\x39\xc7\x6b\x80\xe5\x05\x07\xda\x2e\x5e\x63\x12\x40\x91\xb3\xa9\xd8\x54\xe8\x20\x3b\xf9\x43\xc4\x8e\x5f\xbe\x78\x79\x88\x37\xc6\xa4\x58\x07\x5f\x2a\x96\xec\xf8\xe5\x0f\xc7\xf8\xcb\x0f\x83\x8b\xb1\x87\xcc\x34\x2b\x05\x47\x99\x73\xfc\xf2\xe5\x0f\xde\x23\x17\x7e\xb5\x00\xe4\x6b\xba\x2a\xef\xf0\x25\x3b\x77\x97\xb9\x3e\x1b\x8a\x67\x5e\xfb\x5e\x37\x0e\x20\x33\x84\x08\x35\x73\xf6\xc7\x3a\xdb\xb2\x93\x67\xd0\xf3\x63\x0c\xd1\xb9\x22\x16\x38\x96\xe1\x52\x80\xc7\x87\xae\x67\xd2\x98\xb4\xc2\x73\xcd\xf3\x2a\xe4\x34\x0a\xfc\xd5\xc3\x40\xe5\x01\xb6\xb4\xa2\x26\x7d\x69\x6e\xb9\xaa\x52\x82\xe8\x97\x08\xf0\x87\x21\xd6\x52\x9f\x92\x02\x95\x30\x6f\x6b\x1b\x78\x43\x13\x21\xf4\xf4\x3b\xad\xaa\x56\x38\x37\xde\x0b\xd4\xd9\x1d\xfe\x08\x8b\x07\x69\x01\x5a\x55\x2d\x2b\x70\x09\x75\xfa\x1f\x3b\x35\xc8\x8c\xdf\x78\x38\x92\xee\x44\x7a\x19\xa3\xbb\xbd\x98\xa6\x6e\xb1\xf5\x1a\x80\x60\xfa\xbe\x23\xbf\x02\xde\x9b\xdc\xd7\xad\x4b\x12\xe2\x63\x41\xe9\x81\x97\xac\x66\xa9\x8a\x96\x8e\x68\x51\x75\x5e\x9f\x1d\x04\x35\x23\x88\x77\x3f\x84\xa9\xaa\x7d\x4b\x5a\xba\x64\xca\x00\xdc\x42\xed\xa7\x22\xfa\x84\xee\x6c\x16\xcc\x43\xec\x60\x1f\x72\xe2\xb0\xc1\xb0\x8b\x5a\x2d\xa5\x1d\x74\xd0\xed\x5a\x74\x58\x62\xb1\x75\x7d\x88\xee\x2f\x74\x45\xc8\xc9\x2c\xe0\xda\x35\x0c\xbb\xf6\x52\x32\x1c\xbb\x2d\xa2\xdc\x70\x8c\x66\x8e\x32\x63\x43\x76\x59\x1e\xcb\xa2\x14\x57\xc0\xfc\x58\xdd\x14\xec\xe0\xe4\x90\xc1\x6d\x8b\xc0\x0f\xb2\x83\x97\x49\xeb\xee\x2e\xd3\xd7\x15\x80\x1b\x87\x30\x57\xa1\x90\xb6\x46\xb1\xa7\x2b\x81\x61\xe9\x65\x3c\x43\x48\xc4\xe3\x0d\x07\x39\x69\x58\xda\xbe\x8c\x5e\xab\x51\x8c\xc6\xbd\xb2\x25\xe9\x91\xbd\xfa\xdc\x5e\x17\xc3\x2f\x23\xbc\x9a\x6f\x8d\x1b\x9c\x36\xc1\xc3\x09\xb0\xc0\x6b\xad\x8f\xcc\x17\x51\x60\xc1\x88\x3a\x29\xb0\x3a\xde\x42\x52\x4a\x2f\xe4\xe0\x31\xe9\xc1\xfe\x08\xed\xef\xe6\xeb\x8f\x20\x73\xe0\x68\x51\x97\xc8\x93\x69\x3b\x5a\x2b\x7e\x25\xd8\x55\x2d\x53\x91\xc9\x9c\x42\xd1\x14\x76\x70\xcc\x62\x05\x42\x67\xdc\x88\x39\xe0\xe6\x37\x60\xfe\x53\xbf\x40\x0f\xdc\x20\x26\x7d\x0b\x13\x12\xb5\xc5\xa1\x57\x50\xae\xef\x81\x78\x81\x7d\xed\xfa\xe6\xa5\x90\xdf\xc1\x8e\x65\xed\x81\x07\xb1\x62\xad\xaa\x6a\xf3\xea\xf1\xe3\x2e\x9e\xb4\x7f\x3a\x3b\xd6\xbf\xff\x4f\xfc\xf8\x6d\x26\x53\xf1\xb5\xa8\xbf\xe0\xe7\x6e\xfc\xbf\x93\x17\x3f\xfc\xf0\xb4\x81\xff\x77\xfc\xe2\xc5\xc9\x77\xfc\xbf\x6f\xf1\xf3\xf4\xf4\xec\xcf\xec\xed\x70\x70\x9a\xb0\x29\x56\x61\xf4\x8b\x54\xb0\xb7\x78\x3d\x36\x38\x3a\x09\x49\xec\x62\x92\xf4\xce\xdf\x0c\x93\x3d\x28\x2c\x72\xd2\xde\x04\x70\x2d\xb8\x28\x5c\x0b\xe4\xef\x52\x8c\xb3\xa7\xa7\x8c\x80\x02\x94\x51\x50\x28\x10\x66\xca\x38\x09\x83\x95\x1d\xf4\x2e\x06\x87\xb1\x5f\x12\xd3\xa8\xc1\x24\x70\x7a\x50\x46\x15\x11\x8d\x57\x05\xb1\x30\x18\x05\xb0\x7b\x14\x8a\xb2\x35\xb1\xa1\x65\xa1\x00\x3f\x69\x23\x72\xfb\x22\x5e\x94\x1d\x14\x24\x86\xb3\x1e\xbe\x04\xb3\xb5\x28\x52\x11\xb3\x69\x61\x73\x4e\x3d\x27\xab\x97\x77\xcf\x29\x18\xd7\x24\x63\x0d\x94\x38\x50\x5e\x69\xee\x90\xc9\xb4\x81\x8e\xa6\xd8\x81\x05\xb9\xcd\xc5\x8d\x87\xe2\x6a\x22\xe4\x84\x10\x00\x02\x96\x48\x62\x7d\xc7\x8f\x99\x68\x8c\xb2\x63\xec\x12\x61\x39\x0e\x31\x5c\x3c\xf7\x2f\x0e\xbd\x96\xa4\x27\xe9\xdb\x2d\xea\x22\x36\xf2\x81\xa7\x30\x78\xaf\xed\x35\x0f\x01\x68\x29\x84\x31\x0a\x49\x47\xf0\x66\x0e\xb7\x8b\x56\x9a\x5b\x23\x85\xee\x64\xf2\x93\x80\x2b\x6d\xde\xbc\xd5\xd0\x04\x85\x0c\x37\xbf\x37\x52\x19\x04\xff\x9d\x6d\xce\x5b\x25\x0d\xe0\x02\xeb\xde\x2b\xc6\xdc\x51\xe1\x3c\x5a\x48\x04\xd8\xfe\x4f\xd3\xe5\xcf\x0f\x3e\x43\x6d\x7a\x14\xbb\x5d\x1d\x03\x26\xf9\x6f\xaa\xed\x46\xa0\x89\xc0\x01\xbc\xa1\xb3\xa0\x83\xfc\x21\x8d\xc1\xfa\x15\x1c\x9e\x2a\xb0\xc3\xcf\x6b\x36\x61\x8e\x6e\xe2\xd0\x8f\xe8\x3b\x8d\x9b\xb5\xff\x1d\xcb\xb9\xbb\x4f\x31\x9b\x70\xbd\x5b\x42\xe7\x3f\x7c\xde\xd6\xcf\xc1\x8a\x82\x59\x48\x0a\x2f\x7c\xc7\xdb\xaa\x10\x0c\x68\x8e\x95\xb2\x47\x5a\xf0\x79\x56\x0d\x35\x27\x05\xb7\xcd\x46\x0f\x4e\xed\x70\x7b\x2e\x89\xe5\x0d\x11\x8e\x02\x06\x8d\x3c\xa4\x43\xa2\xda\x3a\x53\x52\x0e\xb0\x9c\x88\xb9\x68\x19\xf7\x8f\x1b\xf1\x2c\x57\xcf\x43\xfe\x51\x38\x8e\x07\x36\x49\x60\x5f\x8f\x67\xff\x90\x0e\x34\x1d\x63\x7d\xac\x29\x3d\x19\x20\x10\xac\x87\xcd\xd9\xad\x2b\xc4\x85\x56\x1c\x52\x88\x65\x65\x34\x2d\x9f\x08\x70\xd7\xe2\x7f\xd1\xf6\x8d\xed\xd0\x4e\x88\x0a\xb8\x5c\xb3\xfd\x0b\x1c\xc8\xbe\x3e\x28\xb5\x32\x76\xad\x54\xac\x67\x7d\x4a\x8e\x08\x50\x5f\x39\x8f\x14\x7d\xd1\xdf\x3d\x68\x9d\x38\xea\x1b\x04\xcc\xdb\xb2\x53\xb7\xdc\x1f\x3c\x2c\x92\x93\xf8\x29\xdb\x6f\xfc\xce\xc2\x78\x75\x62\xfd\x09\x67\xc6\xe2\xd5\xe4\xb6\x15\xc0\xa4\xfb\x38\x6e\x38\xf1\xe4\x57\x32\x42\xf3\xae\x8d\xc9\xef\xd9\x8b\xd4\x4c\x64\x6c\x1a\x4b\x38\x47\x70\x40\xcd\x82\x58\xcc\xfb\xf4\x2a\x99\x11\x81\x2e\x0f\xe1\xef\x3d\xd9\x4a\xe8\x08\x2a\xb8\x66\x7b\x17\x03\x7d\xb7\x11\x66\x26\x30\xee\x59\x29\x62\x4b\x33\x6d\xf0\x88\x86\xa3\xdc\x78\xdc\x64\x3f\x63\xfb\xe7\x21\x97\xd7\xd2\x1f\x97\x83\x84\xd9\x12\x3a\x1a\x5d\x4a\xd6\x9b\xd2\x5c\xc7\x28\x44\xe1\xd4\x6d\x01\xa4\x9e\xcd\x12\x0c\xbf\xff\xdc\xa0\xc6\x79\x5c\x85\xbf\x7c\xf7\xfe\x00\xbb\x77\xdf\x7b\x65\x9f\xee\x2f\x58\x45\x07\xbc\xb5\x81\x8d\x5b\x1a\x3c\x42\x1a\xf4\x8d\x29\x58\x5a\x73\x60\x76\x6c\xb1\xa4\xc9\x0a\x0d\xab\x90\x22\x01\x27\xc6\x32\x7e\xf8\x9b\x9f\x66\x2f\xcb\x3a\x85\x2a\x94\x66\x17\x69\x9d\x09\xa5\x4f\xb7\xd9\x9f\xa8\x25\x78\x45\x10\x4e\x83\x4a\x2d\xdc\xab\x21\x6d\xb2\x9e\x59\xa2\xc3\x30\xc8\xf1\x86\x3a\xd5\xc7\x2a\xc2\x95\x51\x15\xcf\xc2\xa2\x82\xc6\x58\xdc\x7c\xbe\x60\xfb\x7a\x25\xcc\xd2\xc0\xaa\x0c\x74\x67\x38\x54\x63\x46\x6c\x90\x2f\x2c\xc0\x04\xe6\x18\x9c\xb2\x5e\x7f\x36\x78\x3f\x98\x0d\x12\x23\x30\x9f\xc6\xc7\x00\xf8\x3b\x18\xbd\x65\x47\x8e\x20\xa8\xd8\x6c\x9b\xe4\xab\x3b\xe8\x1a\x69\x33\x3e\x52\xc1\x66\xe0\x40\xc9\x69\x22\xf7\x4c\x56\x51\x13\xe8\xa0\xa1\x11\x04\xa1\x14\x65\x12\x96\xe2\xa7\x21\x7b\x1f\x90\xab\xe9\xa3\xe7\x25\x59\x1f\xf0\x43\xa4\x14\x2a\x72\xb5\x91\x8b\x1a\x31\x8d\x40\x92\xb9\x44\xac\x6c\x6b\x2c\x79\x6d\xc7\x53\xf4\x05\xc6\xe8\x3f\xd5\x2e\x4e\x39\xe8\x9e\x56\x76\xfc\xf2\xe5\xcb\xc3\xc8\xdd\x12\x4d\x22\xcd\x9b\x55\x01\x34\xa9\xb8\xda\x9b\x6d\xe4\xcf\x64\x51\x9a\x6c\x40\x5f\xd8\x2d\x78\x8e\x77\x71\xaa\x55\xdd\x70\x7e\x9a\xee\x40\xde\x5d\x17\xbc\x85\x50\xaf\x5f\x04\x6f\x66\xf2\xb9\x97\x54\x7d\x30\x3f\x6c\xd5\x8a\xe9\x8e\x7c\x59\x61\x32\x9f\x2b\x61\x28\x81\x81\xf0\x02\x7b\x00\xa9\xb9\xde\xb7\x16\x87\x86\x2d\x83\x18\x40\xb7\x7e\x22\x3f\x4a\x11\xe7\xed\xd8\xed\x16\x0a\x13\xf8\xf5\xaa\x44\x8d\x2f\xa5\x44\x25\x06\xce\xb7\x16\xa5\xa9\x99\xe5\x06\x5f\xab\x1d\x98\x03\x3d\x6d\x5c\x40\x4d\x62\xb0\x55\x71\x03\x69\x78\x5c\xc9\xcc\x32\x9e\xee\x68\x36\xb6\x87\xec\x84\x9d\x8f\x4f\x07\x67\x83\x7e\xcf\x41\xad\x27\xec\x62\x32\x7e\x3b\xe9\x9d\x3f\x3e\x4d\x26\x83\xf7\x88\x16\xfe\x61\x3c\xf9\x71\xea\x9d\xc4\x36\xad\x66\xd9\x7d\x00\xad\xf7\xd6\xb7\x31\x22\x83\x31\xda\x3a\xcd\x1d\x80\x10\xbb\x4e\xa4\xba\xf3\x48\x5a\xc2\x1a\xa2\x95\x15\x95\x4f\xae\xea\xb0\x10\x9c\xbe\xf7\x5b\x9d\x5d\xb8\x31\x1b\x37\xdc\x7d\x07\xfa\xb7\x39\xb2\xcd\x8f\xfe\x1b\x1d\x5d\x38\xb1\x77\x9c\xa3\xd6\x7c\x3f\xe8\x3c\x35\xdf\xfa\x8d\xce\x15\x1d\x7b\x9b\x7a\x8d\x34\x3b\x95\x4f\x33\x89\xb4\x53\x3b\x3a\xaf\x57\x9a\x97\xe5\xb6\x45\x3a\xab\x2c\xc1\xac\xdd\xde\x8e\x58\x56\x18\x2e\x2b\xba\xdd\x53\x5e\xd9\xb9\xc4\xa7\xfc\xfe\x89\x56\xff\x3a\x14\x6c\x8f\xf6\x29\xd8\x73\x66\xdf\xa3\x69\x69\x6d\x2b\x24\x8c\x26\x66\x38\xad\xa2\xc2\x36\x90\x65\x6a\xa3\xf1\x0f\x84\xe5\xd5\x1d\x5c\x62\x07\xbf\x92\x94\xf6\xbf\x74\x75\x68\x02\x86\xcd\xe1\xe7\x45\xb9\x86\x04\xc2\x52\xf0\x54\x41\xac\x9d\xe7\x29\x51\x04\xe1\xc5\x9b\x6d\x91\x65\xa8\xac\x73\x62\x16\x74\x33\x2a\x2b\xa2\x20\x52\x15\x07\xae\x8c\xb2\xce\xc1\x15\x63\x9d\x1d\x5e\x43\xe8\x58\xa9\x0a\xdd\xf5\xbc\xc2\x72\x74\x05\x65\x99\x5a\x76\xe4\x79\x51\xe7\x0b\x34\xa0\xb8\x22\xf9\xe5\x8b\xac\x7d\x47\x8f\x00\x9e\xbc\xc1\x68\x96\x4c\x40\xad\xc2\xac\x60\xd4\x0d\x22\xd6\x1b\x0e\x0d\xbd\xc0\x24\x99\x26\x93\xf7\xc9\x29\xe6\x7b\x4e\xc7\x67\xb3\x0f\xbd\x09\x30\xf9\x9c\x4d\x92\x04\x12\x98\x1b\x94\x3e\xd1\xbe\xcd\x2a\xa6\xfc\xd9\x8f\x7e\xf2\x72\xc4\x92\x01\xa4\xea\x52\xbe\x72\x72\xea\x51\xfd\x00\x87\x04\x36\x3f\x1a\x63\x17\xd8\x6c\x0c\x79\xa5\xfa\xce\xc1\xc5\x9c\x4d\x7a\xa7\xc9\x79\x6f\xf2\xa3\xfd\xce\xc5\x64\x30\x9e\x40\xd2\xf5\x2c\x19\xb1\x8b\x64\x72\x3e\x98\x9a\x5c\xde\x1d\x03\x9d\x26\xd8\xa4\xe7\xd1\x7c\x9b\x8c\x92\x49\x6f\xd8\x24\xbb\xc0\x04\xe7\xb3\xcb\xe1\x90\xcd\x92\x3f\xcf\xcc\xfd\x17\xd0\x8f\xe8\x69\x18\x8d\x47\x47\x76\xc0\x30\x27\x53\x48\x35\x3e\x98\x24\x7f\xba\x4c\xa6\x33\x50\x55\x89\xb0\x63\x74\x36\xfe\x6f\xfa\xcb\x71\x7f\x7c\x7e\x18\xef\x7b\xfb\x6c\x75\x88\xd9\x12\xe8\x45\x59\x3b\xf1\x25\x95\x77\x8f\x9d\x58\x66\x3d\xe0\xee\x36\xd9\x42\x36\x6d\x83\x90\x3f\x38\x99\x48\xf3\xba\x22\x57\x49\xd1\xb5\x85\xc1\xce\xa3\x48\x6e\x45\x14\x82\x79\xd5\x92\x8b\x80\xe3\xc5\xe5\xda\x84\x07\x0b\x42\x77\x57\x15\x5e\xf1\xf4\xcf\x55\x41\xc8\x5a\x74\xae\xd0\xbb\x93\x6d\x89\x6f\xed\x35\x2b\x3d\xb7\x0e\x7d\x4a\xaa\x6e\x7c\x14\xdf\xe0\xa8\x9a\x74\xae\xc5\xb2\x39\x10\xe5\x94\x96\xa7\xc1\x02\x85\xb7\x76\x0f\x01\x06\xba\xf5\x90\x66\x93\x1e\x38\xad\xef\x1e\x09\xd0\x8a\x28\x2e\x0f\xec\xde\x2b\xc1\x53\x70\x5d\x04\x1a\x84\xe5\x58\x33\x96\x88\x7f\x2a\x5b\x47\x6b\x7a\xf9\xe6\x8f\x49\x1f\xb6\xbe\x3b\xb1\xc4\xa8\x62\xb6\xdb\x60\x8a\x35\x05\xfa\xfc\x8c\x86\x1f\xd9\xc5\xe5\x64\x7a\xd9\x1b\xd9\xd4\xf2\x7b\x37\xf6\xb7\x3b\x6b\x3d\xdc\xfa\xcd\xa4\x71\x22\x40\x19\xbf\x21\xfe\x12\x38\x1a\xc1\xd1\x1a\x43\x42\x3f\x10\xc8\x8c\x66\xba\xc9\xd1\xdb\xd6\x37\xf4\x27\xd8\x81\xcc\x97\xc5\x7f\x03\x99\xbd\x28\xd6\x87\x86\x76\x0c\x55\xd4\xb8\x93\x77\xec\x57\xc8\xa8\x5f\x2d\x3b\x76\x88\x0a\xef\xbe\xb9\x9c\x26\x11\x3b\xbd\x84\x52\x00\xd4\xba\x27\xc8\x0a\x34\x9e\x5e\x4e\x12\x53\x71\xf2\x76\xfc\x3e\x99\x8c\xce\x93\xd1\xac\xb1\x6b\x26\x89\x9e\x41\xaa\x75\xe8\x4d\xd9\x34\x99\xe9\xbe\xcc\xde\xb1\xc1\x48\x3f\x77\x3a\xc0\x4f\xb2\x83\xfe\xe1\xc1\xf1\xe1\xc1\x60\x70\x68\xfa\x46\x72\x7f\x30\x62\xb3\xa4\xff\x6e\x34\xe8\xf7\x86\xec\xb4\x37\xeb\x11\x4f\xcc\xf9\xc5\xe5\x2c\x99\xb8\xdd\xda\x1f\xf6\xf4\x8e\xe9\xcd\xd8\xe9\x59\x6f\x32\x65\x27\xcf\x4f\xe2\x93\x93\x17\x47\x2f\x9e\x1c\x3f\x8d\x0c\xdd\x8f\xfe\xe8\xe0\x7c\x30\xec\xc1\x7a\x4e\x2f\xfb\xfd\x64\x3a\x1d\x4f\xe8\x65\xfc\xd8\xbb\x84\x9d\xf5\x26\x11\x3b\x1d\xc3\x64\x8f\x7a\xd3\x9e\xfe\x07\x36\xbd\xbc\xb8\x18\x42\x01\x49\xcc\x2e\x47\x30\xbf\xd3\x77\xc9\x69\xeb\x7e\x72\x5c\x46\x01\x07\xd0\xd4\x8c\xeb\x72\x34\x98\x25\xa7\x50\x13\x93\xf8\x33\xfd\xcb\xaf\xc4\xfd\x50\xb7\xdd\xc1\xdc\xed\x9b\x38\x2d\xdd\xe1\x5e\xf6\xee\x2e\x65\xc8\xe6\xe2\x3f\x8d\x8f\x41\x91\xd3\xf7\xc1\x0e\x9b\x26\x25\x94\xc9\x1d\x04\xdf\xd4\xfb\xe3\x43\xd6\xb3\xb4\xd9\xb2\xf2\x51\x42\xc9\xf7\x14\xa6\x65\xed\x62\x78\xd6\x83\x08\x08\xe5\xef\xf7\x29\x77\x0d\xe6\x35\x2b\xca\x28\xec\xe1\x49\x57\x0f\xb9\xbd\x63\x20\xbe\x17\x51\xfa\x2b\x42\xa0\x10\x72\x02\x00\x7a\xb3\x2d\xa1\x2f\x14\x64\x1e\x00\x3b\xb8\xd1\x39\xb7\x11\xf9\xf2\x48\x29\xcd\x0b\x84\xe4\x84\x28\x15\x19\xaf\x0a\xae\xc3\xcd\x6a\xab\xa8\x5a\x84\xdc\xa7\x58\x17\x0b\x83\x6f\xd0\x1f\xbb\xb9\x6b\xcd\x96\x8f\x79\x16\x4e\x6c\x30\x8f\xa8\x38\xff\x82\xf9\x83\xfc\x27\x03\x82\xb3\xa8\x55\x55\x10\x46\x13\xf8\xf0\x82\x98\x2b\xe8\x96\xa8\xf8\x77\xcc\xfa\xd3\x5d\xfb\xc2\x87\x3a\xf1\x7c\x65\x90\xae\x6f\xd2\xc7\x97\x64\xc9\x79\xe7\x61\xe7\x60\x63\x76\x00\x91\x0f\x20\x6c\xca\xf1\x80\xc0\x5f\xb3\xe2\x06\xd2\x57\x32\x4c\xe0\x0a\x6b\x78\x5b\xe1\x16\x78\x4e\x2e\xc3\x2e\x55\x8e\xa0\xf8\x01\xe7\xcd\xa5\x1c\x73\xbb\xad\x64\x4e\x79\x8a\x84\xd9\x52\xcf\x3d\x8f\xc2\xc1\xfc\x50\xef\x4e\xac\x4e\x38\x0c\xbd\x47\xb3\x86\x6f\xd6\x5f\xcb\x5c\xe8\xff\x84\x7e\x75\xc4\x13\x36\x31\x01\x6b\x58\xf8\xaf\x1d\xc8\xdc\x84\x04\x0c\xad\x7a\x69\xa8\x83\xf5\x00\x0e\x7d\x96\xfb\xbf\x52\x29\x7a\x91\x83\x1e\x79\x40\x1c\xb9\x65\xc4\x3e\x89\x32\x17\x19\x5a\xf5\x4a\xcb\x88\x43\xb3\x21\xc9\xfd\xaf\xd7\x67\xab\x2a\xb1\x46\x42\x79\x93\xd7\xe9\x4d\x57\x59\xe7\xca\x02\xe7\x50\x1c\x84\x3e\x65\x93\xce\x68\xf3\x48\x0b\x26\x60\xdf\x86\x55\x0f\x4d\xe1\xc1\xb2\xa5\xdf\x35\x5e\x80\xc4\x25\x6f\xfd\x0c\x49\xeb\x7c\x8b\x4b\x05\x99\xe5\x84\x0f\x8e\x8e\x10\x83\x0d\x6e\x11\x97\x52\x0c\x8a\x11\x12\x8b\x7d\xcb\xe3\xd5\x6d\x34\xd0\xf2\xaf\xdb\x40\x2c\x5f\x53\x84\x8d\x2d\x8a\x5a\xcf\x2f\x57\x1d\x7c\xad\x0d\xe1\x28\xae\x21\xf7\x1c\x60\x03\x42\xb3\x17\xd3\xca\x71\x16\x05\xb0\x47\x77\x74\xa1\xe1\x9b\xf0\x26\xa3\x61\xb7\xbb\x5a\x11\x3c\x0c\x77\xdc\x4a\x6d\x93\x3e\x6a\xc4\x74\xc3\x42\x39\x3a\x59\xca\x27\xb7\xd7\x93\x02\xee\x66\xcc\x20\x86\x29\xb4\xe0\x48\x45\xa9\xbe\xc0\x97\x0c\x35\xb8\x4d\x25\xbc\x13\x56\xb0\x0b\x56\x7a\x07\xcc\xa5\x87\xf9\x68\x8a\x35\x42\x6a\xeb\x3c\x1c\xb2\x7a\xd4\x5d\x25\x1e\x56\x15\xca\x3c\xb6\xd8\x62\x18\x68\x07\x7c\x19\x69\xd2\x21\x30\xcd\x19\x3d\x88\x36\xbf\x6f\xbe\x6d\x2c\x7c\xc3\xdb\xd5\xe1\xdf\x30\xa3\xf8\xca\x0e\x0e\xff\x53\xb8\x58\xb8\x3c\x91\x87\x12\x1a\x91\xd3\xe1\xe1\x9b\x49\x19\x32\xba\x20\x43\xd5\xea\x2b\x1d\x95\x41\x90\x2a\x69\x88\x98\x3d\x14\x87\x62\x67\xaf\x7e\x41\xa7\xa4\x62\xd7\x85\x4c\x4d\x21\x4f\x96\x35\x76\xb9\x2b\x13\xdd\xde\x89\x4e\x14\xb3\x77\xa6\x42\xd3\x96\x93\xb4\x8a\x3f\xd1\xda\x8c\x1c\xa6\x3b\xa1\x60\x6c\x3b\x4b\xa3\x1e\x5c\xea\xa9\x0a\x06\xf2\x80\x2b\x07\xba\x76\x67\x71\xa7\xc1\x12\x3e\x1f\x4c\xfb\xc9\x70\xd8\x1b\x25\xe3\x4b\x13\x4d\x7b\x16\x1f\xeb\xdb\x5e\x6c\x2a\x93\xd5\xd9\x4c\x2f\xb7\x38\x1f\x31\x7b\xa3\xf7\x20\xe4\x3c\xe0\x62\x10\xa8\x62\xab\xa0\xf1\x3e\x39\xb3\x05\xb0\x49\x42\xd0\x86\x89\xe6\xbb\xbb\x50\x15\xe8\xa4\x26\x67\x34\x10\xd6\xab\x2f\x4a\xcb\xc0\x5e\xba\x2e\x37\xba\x48\xe8\x91\x06\xe1\x4c\x56\x0e\xe4\x5f\x64\xa6\xa8\x0d\xa3\x83\xde\x61\xaa\x0a\x0f\x20\x63\xf7\x2e\x6c\xed\x40\x88\x6a\x14\xa8\x09\xd9\x63\x7b\xc7\xf0\x21\xa7\xcd\x31\x88\x18\x01\x70\x19\x4f\x63\x8a\xc0\x92\xf2\x04\xc5\x04\x41\x95\x82\x75\x8c\x3c\x8b\x4f\x8c\x1f\xb3\xa9\x3d\x3d\x2e\x02\x9c\xaa\xbb\x7a\x0e\xb5\xa1\x36\xd9\x4d\xe6\x6c\x81\xc4\x46\x78\x11\x96\x7a\x0b\x3a\x44\x92\x0d\xaf\x4c\x51\xd4\x7c\x1b\x40\x53\x3a\x12\xf5\x28\x4c\x98\x6a\x65\xaa\xe8\x13\x05\x57\x6d\x98\x63\xd1\x71\x74\xa0\xf8\x29\x4d\x31\x92\x8e\xd8\x60\x96\xb1\x07\xa0\x7d\x83\x61\x7b\x69\xfe\x00\x74\x44\xf9\xf7\x85\x12\x6e\x28\x11\xa3\xb8\x6d\x8b\x86\xde\x65\x73\xa3\xe2\x09\xf0\x1d\x7c\x5d\x80\xbc\x37\x13\x81\x4e\xb5\x5a\xd1\x07\x00\x4d\x96\xf8\x4e\x16\x5c\x89\xa8\x45\xb9\x65\xb0\x7a\x95\xcb\xab\xa7\x28\xbb\xd2\xba\xad\x91\xe6\xe4\x73\x9a\x17\xe9\xce\x10\xc3\xb3\xf8\x69\x98\x50\x24\x0d\x10\xa2\xc7\x32\xdf\x2c\xc0\xd1\xbb\x85\x39\xa6\x7e\x0c\x0f\xf4\x79\x26\x97\x45\x99\x13\x6e\xba\x09\x7b\x09\x84\xf2\x44\xc2\x34\x9e\xb5\xea\x81\x76\xb5\x11\x80\x10\x11\xcd\x50\x00\xdf\x8e\xe5\x41\x1d\xa1\xbc\xd6\x30\x9f\xc7\x21\xc7\x32\x0d\xfd\x79\x7c\xdc\xc0\x58\x00\x4f\xd5\x6c\xd6\x0d\xb2\xe0\x7b\xc2\xac\x63\xe6\xcc\x42\x4f\x90\x1b\x69\x3c\x61\xad\x68\x67\xe8\x70\x78\x37\x1e\x9e\x26\x93\x69\x48\x73\x6c\x70\x41\x0c\x91\xb5\xd7\x26\x72\x0a\x8f\x3e\xb6\xda\xfd\xd5\x5e\xaa\x00\xe5\xe3\xcd\xe5\x0c\x90\x2a\x00\xe5\x03\x30\x4b\x1e\xc2\x94\xdf\xfb\x32\xa6\x7c\x3d\xd5\xa3\xd9\x60\x92\xb0\xc9\x60\xfa\x23\xeb\x59\x5a\xe5\x3f\x5d\xf6\x6c\x3b\x17\xc9\x04\x48\xaf\x09\xbe\xe3\x01\x53\xa1\x57\x45\xcf\x02\xa0\x6b\xb0\xe9\xbb\xf1\xe5\xf0\x34\x78\x8f\x00\x2e\x9a\xaf\xe9\xd9\x4e\x08\x50\x04\x9c\x39\xc0\xe4\x3c\x9d\x5e\x9e\x27\xb4\x68\x53\xf0\xc7\xf5\x86\x43\x36\x4a\xfa\xc9\x74\xda\x9b\x7c\x24\x7a\x71\x98\xb4\x49\x72\xd1\x1b\x4c\x90\x54\x7a\x32\x41\xcf\x6b\x6c\xb7\xd7\x49\x00\xcc\x41\x28\x31\xbb\x71\x3c\x10\xba\xa3\xdb\xc3\x14\x99\x21\xe0\x76\x69\xee\xa6\xc6\xaf\xf5\xdc\x7f\x64\x1f\xde\x8d\xc1\x7f\x0a\x91\xf9\x8f\x66\xbf\x4d\x12\xeb\x3a\x4d\x9a\x73\xd4\xda\xb9\xbd\xa9\x77\x26\x7a\x6f\xc6\xba\x3b\x2d\x48\x11\x8f\x75\xdc\xdb\x51\xd0\x1d\x72\x79\x46\x5d\xd0\x22\x38\x6b\x1e\xb8\xc8\x6e\x14\x11\x42\x0d\x99\xb0\xc1\xc8\x6c\x38\xcf\x0b\x7d\xd7\x00\x0e\x5c\x7f\xda\x1b\x9c\x0d\xc7\x53\xd8\xcd\xe0\xbb\x84\x51\xcc\x7a\xec\x4d\xa2\x9f\x9e\x24\x23\x24\xdc\x1e\x8c\x10\x67\x66\x06\x1d\xd0\x6f\x24\x53\x36\xbd\x9c\x92\x43\xfa\xcd\x47\x84\x55\x01\x9a\xf1\xc9\xa9\x3d\xc8\xe8\xd4\xed\x0d\x86\x97\x93\xd6\x2e\xee\x94\x11\x63\x36\xbe\x48\xe0\x33\xb0\x93\xbd\xc5\xc4\xb7\xa6\x87\x0e\x2a\x05\xa0\x4f\x70\xe5\x59\x20\x42\x3e\xfe\x32\xf0\x94\xdf\x34\xff\x3f\x7e\x3c\x94\x43\xf9\xa7\xa3\xc9\xd1\x71\x7c\xfc\x95\xaa\x40\xee\xa9\xff\x38\x3e\x7e\xfa\x43\xa3\xfe\xe3\xe4\xd9\x93\xe3\xef\xf5\x1f\xdf\xe2\x07\x6e\xde\x85\xb6\xb1\xe7\xa5\x60\x69\xcd\xfe\x54\xdf\x7e\x9e\x8b\x05\xfb\x7f\xff\xcf\xff\xc1\x26\xb7\x9f\x17\x72\x53\x16\x0b\x59\xdd\x7e\x66\x07\xb4\x53\x0e\xf7\xde\x8b\x12\xf4\xe4\xe3\xf8\xd8\x94\x84\x94\xb7\x9f\xf9\x7a\x5e\x67\x50\x23\xd2\x17\x55\x45\x09\x02\x0b\xc1\xd4\x23\x48\x7b\xfe\xa9\x16\xec\xf6\xef\xac\x82\x62\xcc\xe2\x4a\x2e\xa4\x70\xba\xdb\xed\x67\x96\x16\x79\xc5\x32\x00\x93\xae\x33\x2e\xb1\x37\x69\x59\xc8\x8a\xa5\x8f\x78\x5d\x89\xba\x64\x9b\x52\xf7\x48\x09\xf6\x53\xfd\x48\x66\x4c\xa8\x8a\xa9\xfa\xaf\xa2\x62\xbc\xfe\x19\xcc\x06\x28\xee\x60\x19\x67\xbf\x64\x5c\xec\x60\x21\x8f\xf8\xa6\xbc\xfd\x0f\x28\x4f\x11\xd9\xed\x67\x68\xeb\x1f\xff\xd7\x3f\xfe\x4e\x83\xf9\xc7\xdf\xff\xf1\x3f\x0f\x6d\xc2\xf7\xed\xe7\x80\x52\xff\x94\xe7\x4a\x3f\xaf\x7b\x09\xc5\x9d\x66\x0a\x22\x3d\xf0\x75\x21\x73\xc5\xf4\x2c\x64\x58\x01\x27\x7e\xae\x04\xcb\x1f\x69\x63\x49\xff\x6b\x9d\x33\x25\x72\x05\xf5\x01\xb7\x9f\x4b\x40\x95\x28\x20\xd8\x2a\x72\x70\x2d\x80\x8b\x5f\xf7\x65\x51\xe4\x8b\xdb\xcf\x29\xcf\x2b\xdd\x9d\x7f\xfc\xfd\xd5\x7d\xd3\xa6\xea\x52\x3f\x62\x66\x3d\x62\x00\xd7\xa6\x2d\x1a\x54\xf4\x72\xc1\xd2\xdb\xff\xb9\x36\x8e\xa1\x52\x2a\x3d\xf2\x0d\x2f\x19\x24\x92\x96\xb9\x14\xa5\x1e\x02\xaa\x96\x90\x7d\xdc\x1e\xe4\x6b\xaf\x7b\x64\x30\xd5\xe5\x03\x3b\xd8\xee\xcf\x9d\xfd\x50\x45\xbd\x16\x55\x55\xea\xc7\x98\x9b\x0d\x56\xe7\x22\xe0\x04\x8f\xd9\x65\xce\xfc\xee\xe0\x26\x53\x3c\x78\x0a\xb6\x91\x51\xd3\xf5\x07\x79\xed\x36\xa8\xfe\x1d\x32\x08\xdc\x7e\x2e\x6f\x3f\x23\x39\x80\x5e\x2b\xef\xb3\x22\x67\xa5\xb8\xe2\x65\xaa\xf7\x5e\xa3\xf1\xf6\xac\xc8\x22\x37\xb3\x12\x9e\x05\xc7\xf5\xaf\xad\x51\x30\xfc\x61\x33\x37\x7f\x0f\xc3\x97\x8a\x89\x8a\xa5\x42\x55\x32\xbf\xfd\xac\x27\xe5\xf6\x3f\xab\x52\x78\xe3\x60\x29\x6c\x47\xd7\x80\xed\x8a\x6f\xf5\x78\x0b\xb4\xe4\x7a\x49\xf4\x56\xf8\x9c\xc9\xeb\x52\x94\x34\x9f\x1b\x09\x4b\xd6\x6a\x06\xd7\x5d\xde\x7e\xf6\x87\xe3\x2d\xe1\x4f\xb5\x64\x9b\x42\xa9\xdb\xff\x48\x45\x77\x53\x7a\x08\xfa\x29\x70\xcc\xe9\x73\xa1\x70\x63\x28\x33\xbb\xb7\x9f\x01\xf2\x52\xef\xb7\xe6\x2e\x33\x6d\x98\x8f\xeb\x0f\xfc\x3f\xff\xa3\xbe\x46\xb6\xbc\xea\xf6\xf3\x95\xd9\x3b\x99\x68\x6c\xb7\x88\x01\x59\xbd\x16\x22\xb5\x2d\x3e\x5b\x0b\x96\x3e\x02\xc3\x89\xc3\x4e\x11\xb0\x4f\xd2\x62\x51\x5b\x6c\x82\x88\x6d\x0a\x7d\x92\xf8\x4f\x35\xbc\x7f\xcf\xa6\xe6\x46\x5c\xdd\x7e\xd6\x9f\x82\x57\xac\xc4\x02\xb0\xb2\x86\xcc\xda\x7d\xa4\x9c\xbc\xbc\xfd\x5c\xca\xeb\x70\xca\x3b\x76\x88\x96\xc6\x19\x7c\x58\x4f\x40\x9d\x33\xbb\x56\x91\x3e\x59\xa5\x30\x72\xc8\xbd\x5a\xc3\x63\xe6\xaf\x98\x78\xa2\x1f\x87\x55\x2c\x8b\xb4\x96\x15\x03\xbf\xb3\xf9\x4b\xc6\x59\x55\x54\x3c\x03\x19\x0a\xaf\x1b\xf8\x15\xf0\xcd\x96\x15\xd7\x23\xe9\xdc\x38\xcd\xaf\x84\x1b\x28\x28\xb1\x69\xf6\x1f\xa6\x4a\x2f\x5b\x2a\x14\x5b\xca\xc5\x4a\x8a\x52\xd9\x80\x5d\x1d\x0c\x48\xe8\xb3\x20\x70\x8e\xf2\xa2\xbe\x16\xbc\x36\xaf\x98\x37\xf4\xe8\xcc\x91\xe9\x98\x90\xce\x11\x09\x4f\x1a\x05\x9c\x89\xf0\xcf\x8d\x5d\xa0\x7f\x3f\x2d\x6a\xc5\x60\x6d\xcb\x6b\xe0\x90\x0d\x97\xdd\x5e\x12\x78\x2f\x18\xa9\x42\xc2\x16\xa4\x91\x1d\xbd\xee\x92\xb9\x57\x73\xe3\xe3\x00\x30\x67\x51\xb1\x0c\xef\x3a\xc1\x4a\x91\x8a\x6b\x04\x1c\xc9\xf4\xf2\xe9\xaf\x55\xba\xf7\x2c\x7d\x84\x67\xad\xf4\x0f\x9b\xaa\xe5\x35\xb8\xc1\x1a\xf7\xc4\x3f\xfe\x6e\xa2\xca\xc7\xff\xf8\x3b\xbb\x80\x75\x2f\x85\xbf\x0b\x4a\xf1\xb0\x6d\x60\x92\x46\x4f\xfe\xf1\x77\x96\xfc\x7c\xfb\x79\x51\x43\xcd\x25\x36\x44\x9b\xbe\x7c\xe0\x8e\x12\x39\xa1\x0e\x98\x46\x9f\xea\xce\xe9\x7f\x79\x68\x13\xb0\x68\x6d\x3d\x45\x9f\x4d\x9c\x74\x2d\x39\x14\x48\x4f\x28\x4c\xd3\xcb\x55\x4a\x7d\x1f\xf1\x4c\xa0\x60\x70\xbf\x4b\xf5\xaf\xd7\x1b\xf4\xc7\x0d\x71\x7a\xe5\xc2\x06\xda\x71\xbb\xd8\xa9\x76\x1a\xcb\xed\xdf\x75\x67\x03\x07\x14\x09\x2b\x6f\x0f\xa4\x35\x86\xa8\xda\xfb\x5b\xef\x16\x2d\x86\x58\xaa\x77\x1b\xca\x7e\xa5\xf7\x99\x1e\x31\x40\x4e\x85\xcb\x0e\x00\x42\x45\x89\x8c\x7d\x2a\xcc\xb5\x8e\xd9\x30\xf8\xea\x46\xd4\x5a\x11\x50\x4a\xda\xfe\x89\x60\x63\x98\x30\xe0\x95\xbe\x7a\xd2\x47\x35\xe4\x23\x2c\x71\xef\x85\x6f\xec\xec\x3d\x4c\xe1\xb2\xe4\x52\x21\x51\xc8\xed\x67\x10\xb3\xb2\x84\x4a\x15\x2d\xa2\x50\x57\x5a\x88\xfa\x67\xa6\x1f\x2b\x72\x80\x9a\x55\x8c\x2f\xa5\x3e\xfd\x66\x78\x25\x9d\xa1\x6b\x7c\xa8\x31\x65\x31\xad\x31\x75\xcf\xcd\x15\x24\x16\xe8\x46\x72\xab\x39\xa4\x35\xdc\xfe\xde\xc7\x8c\x73\xfd\xd4\x5b\x25\x58\x66\xe1\x1d\x49\x98\x2d\x6f\xd4\x7a\x7a\x29\x17\x2d\x18\xb1\x9e\xa7\xb6\x80\xd5\x9b\xd4\x08\xf5\x08\x57\xd0\x93\x14\x06\x5f\x8a\xce\xab\xe7\x0e\xa7\x33\x2b\x14\xf3\xcf\xe8\xd0\x5b\x23\x6f\xb0\xcd\xe5\xd2\x17\xee\x7a\x43\xf7\x96\x9e\xe3\xaa\x71\xe7\xd0\x51\x9d\xca\x70\xd5\xd9\xed\x67\x7d\xae\xdc\xe5\x90\xf9\x13\x01\x1f\x14\xb9\xd6\x23\x70\x51\xd6\x88\x57\x14\xc1\x6a\x95\xb7\x9f\x51\xad\xd5\x3b\x41\x2f\xfe\x62\xc5\x17\x4d\x39\x6e\x5a\x56\x64\x0d\x70\x22\xea\xa7\xc5\x86\x65\xc2\xbb\x9b\xda\xf6\x65\xc0\x50\x28\xdd\x41\xad\x4c\x57\x7a\x62\x8a\xda\x3c\xa5\x74\x9f\x94\x5e\xe7\xdb\xcf\x15\x07\xb5\xc9\x1c\x48\xa7\x13\xc0\xb1\xe0\xe5\x4f\x35\x0a\x66\xca\x4a\x10\xf8\x8b\x2b\x6e\x00\x85\xf5\x7a\xe1\x6d\xcd\x2b\x7d\x07\x54\xa0\x14\xe6\x0b\x51\xe6\x1c\x0d\x18\x3b\x5f\x39\xec\x38\x70\x89\x6e\xb8\xa2\xb5\x30\x43\xc4\xa6\xf4\xde\x2f\xe5\x5a\xff\xb5\x61\x24\x2c\xee\x18\x4d\xae\xb7\x37\xc4\x71\x65\xee\x80\x7e\x94\x6e\xe0\xbe\x3d\xa6\x27\x36\xbf\xfd\x4c\x3b\xfb\x38\x0e\x6d\x21\x10\x8a\x2b\xad\xdf\xb0\x65\x21\xad\xb5\xe2\xad\xb1\xd9\xe7\xa1\x3d\x11\x4a\x2d\x3c\x6c\xbc\x66\xa0\xfe\x6c\xa4\x3e\x63\x7a\x4b\x90\x7a\x0e\x85\xf4\x45\xde\xbc\x6d\x98\x12\x59\x91\xc3\x3e\xbf\x5b\x2b\x8a\xc3\xf3\x07\xdb\x4e\x7f\x52\x96\xad\x2f\x3c\xb0\x45\xd4\xeb\x42\x5d\xca\x4e\x1e\x9a\x9a\x76\xe0\xf1\x2f\x9b\xa3\xdd\x0a\x96\x67\xda\xc0\x50\xb8\x52\xf5\x5a\x1f\xf8\x47\x0e\xa9\x47\xdf\xdb\xf9\x6e\xd1\x1a\xd1\xc0\xd6\x3c\x97\xb7\xff\x51\xe2\x69\xbb\xae\x61\x0d\xaa\xb2\x90\x4a\xde\xfe\xc7\x5a\x30\x9e\x69\x5b\x81\xa3\x0a\xa5\x2f\xc5\x45\x26\xfe\xf1\xf7\xa7\xb4\x17\x4e\x62\xe0\xb4\xe0\x15\x82\x1c\xe0\x66\x30\x26\xed\x5a\x28\x7d\x0c\x8b\xdb\xff\x3b\x1c\xab\x2a\xea\x15\x87\x6b\xd0\xf5\xad\x73\x0b\x2e\x8a\xf5\xdc\x58\x2a\xfe\x03\x7a\xb4\x5a\x1d\x96\xf8\x0b\xb7\x24\x0b\xea\x4b\x26\x22\xb6\xe6\x92\x24\x82\x84\x53\xa5\x44\xa9\x6d\x15\x7d\xa8\xb4\x81\x01\xd1\x79\x98\xa1\x50\x5c\xe2\xa2\x77\xee\xce\x08\xd4\x88\xac\x6e\x6f\x09\xb7\x7d\xa2\x87\x6c\xa7\x40\x76\x7a\x9d\x86\x49\xbd\xf4\x15\x57\x30\x74\x54\xe5\x99\x0c\xa4\xbc\x2d\xef\xb7\xd8\x1f\x32\x4d\x7a\x62\xe0\x2e\xda\x40\xed\x0e\xee\x01\x9e\x15\xb2\x74\xfd\x84\xb1\xc7\x6c\x90\xe9\xe1\xeb\xce\xa4\x82\xad\x6f\xff\x73\xed\x9d\x00\x41\x06\xc2\x5d\x9e\x01\x34\xc1\xd5\x11\x0d\x0e\x01\x9a\x42\x73\xe8\xb7\x1d\x1b\xcc\x66\x12\x9a\xe2\xc2\xda\xe2\x9d\xb3\x81\x63\x31\xbf\x40\xd5\x18\x6a\xb1\xea\x6b\xfd\x6e\x51\x43\x88\x13\x45\xb1\xb1\x31\xcf\x4a\x21\xd8\xd4\x64\xd2\x9d\x15\x75\x9e\x52\x60\xb6\x66\xd9\xa3\xf1\x46\xe4\xa6\xac\x74\x90\xcb\x4a\x72\x2c\xc1\x34\x8e\xab\x5c\x82\x85\xa1\x6f\xed\xc0\xbf\x84\x2e\x84\xf5\x86\x97\x90\xf6\x84\x52\x5f\x8b\x63\x3d\x19\xb7\x7f\x67\x0b\xa1\x95\xf4\x1d\xa2\x89\x34\x25\x18\x0d\x88\x1b\x73\x8b\xc8\x3c\x2d\x81\x32\xbd\xd2\xb6\x6b\x5e\x85\xca\x3a\x02\x2e\xb1\x53\x71\x2d\xb2\x62\x83\xeb\x87\x48\xf8\x4e\xdd\xb4\xf8\xc1\xfd\xd3\xd3\xe1\xd1\x71\xfc\xe4\xd0\xbb\xfa\xa9\x81\x06\x76\x85\x73\xfc\x3d\x61\x07\xfd\x8b\xe0\xad\xa7\xf0\x56\x5e\x95\x70\xc1\xda\x99\xf7\x3d\x18\xb8\x0a\x7d\xd1\x1f\x0c\x87\x11\xbb\xa6\xc6\x4e\xe2\x63\x76\xd0\x4f\xf4\x3f\x1e\x9d\xc4\xc7\xa6\xbd\x67\x5f\xd6\xde\x51\xdf\x36\xd2\x37\x4d\x3c\xd7\xe6\xc6\x22\x93\x1b\x25\x9a\x23\x39\x62\xd7\x38\x8a\x24\x1c\xc5\x0f\xfa\x95\xba\x2c\x36\x82\xe7\xec\x32\x97\xad\x39\x70\xfd\x3e\xd6\xfd\x4e\x2e\x2f\x86\xec\x3a\xd6\x7f\x31\x4d\xbc\xd0\xba\xc8\xc3\xdd\x8f\x4b\xad\x95\x87\x8d\x92\x43\xf2\xff\xef\xb7\xfa\x87\x7f\xfc\x9d\xbd\x1d\x5d\xee\x42\x15\x31\x2b\x73\xc2\x0e\xe0\xa9\x8b\xe1\xf5\x89\x79\xf5\xe5\xc3\x5e\x7d\xea\x5e\x7d\x6a\x5e\x3d\x7e\x42\xef\x0e\x85\x52\xa2\xbc\xf7\xeb\xba\xf7\xf0\x38\x74\xc0\xf5\xfe\xf8\xf8\x8b\xda\x79\xea\xb5\xe2\xfa\xa2\xf7\xe5\x79\xf1\x37\x99\x65\x7c\x77\x07\x9e\xb0\x83\xf3\x0b\xbd\x91\x70\x49\x9f\xc7\xb8\x89\x68\xd3\xab\x0e\x7b\x1c\xec\x17\x70\xb3\xd2\x3d\x26\xf3\x05\x90\x65\x14\x98\xe1\xea\x79\x0a\xd1\xf3\x26\x8c\x57\x22\x70\x2d\x86\xae\x48\x90\xa7\x90\x08\x0a\xfd\x6a\xfa\xe2\xe0\x0a\xb3\xcd\x85\x9e\xa0\xe0\x4a\x31\xf4\x03\xe7\x6d\xcd\x14\x2c\x11\xee\xdc\x01\x8f\x9c\xc7\x60\x01\x76\xaf\x4b\x68\x01\x13\x78\x51\x67\xa8\x1d\xfc\xe4\x7c\x02\x70\x8f\xa6\x8f\x00\x74\x55\xd1\xb5\xd9\xa1\x04\xa3\x55\x65\x06\xe7\xfb\x90\x16\xa0\x8d\x43\x71\x93\x6a\x98\x9c\xd2\xd1\x79\x83\x64\x2b\xae\x45\x0e\x69\x30\x9e\x59\x64\xa8\x00\xde\x1a\xfd\x1a\xd6\x87\xd7\x4b\xa3\xec\xe2\x1c\xeb\x2b\xa5\x79\x8f\x77\xab\x59\x20\x2d\x69\x02\x8c\xd2\x1e\xc1\x04\x97\x52\xc1\xb0\x44\xc5\x40\xfa\x66\x8a\x14\xa1\xc5\x4f\xb5\x36\x4c\xea\x92\x64\x70\xcb\x4d\x19\xe9\x77\xac\x28\xd6\xd7\x55\x29\xca\x96\x07\x6d\x53\x4b\xa5\x40\xf6\x6f\x0a\x2d\x9b\x49\xd3\x99\x0b\x55\x48\x6f\x05\xd0\xef\x41\x0f\x6b\x65\x1c\x35\x26\xbd\x1d\xeb\x4c\x1b\x27\xda\xaa\x5f\x14\xf9\x4f\xa4\x6a\x4e\xd1\xd7\x20\x5a\xae\x01\xd8\xb6\xee\x61\xab\xfc\x45\xac\x94\x22\x67\xf9\x23\xb1\xde\xdc\xfe\xe7\x62\x25\x1a\xfe\xb3\x47\xa4\x2b\x6b\xa3\xe0\x11\x5c\xd3\xa5\xe8\xb0\x71\xd0\x36\x29\xca\xca\x00\xb4\x4f\x30\x15\x92\x7b\xda\x61\xa0\x87\xeb\x6b\xae\x34\xcf\x64\xe8\x18\xd1\x1a\xb5\xbe\xd2\x80\xe6\x46\xd8\x41\xe6\x28\xd1\x9d\xb3\xc4\x33\xc8\x8c\x07\xa6\xe9\xf8\x8d\xe9\x83\xde\x14\x68\x4d\x90\xd7\xb0\x85\xf1\x56\xac\x44\x5e\x87\x7d\xa8\xfd\xcf\xab\x7a\x2e\x8d\xa6\xe2\xfa\x8d\xce\x76\x74\xcb\x69\x23\x94\xbc\xbc\x7a\x66\x61\x83\x43\x4d\x27\x6e\x75\x6d\x75\x81\x89\x9b\xe9\x19\xe6\xd7\x62\xe1\x75\x10\x3c\x70\x6e\x1c\xfa\x90\x6d\x99\x2a\x72\xe7\x54\x42\x1f\xd1\x4b\xb0\xb9\x94\xcc\xa4\x65\xbe\x18\x76\xd9\x24\x30\x9f\xf8\xa0\x56\x51\xb4\x0d\x9d\x09\x99\x1b\x6d\xea\xf6\x3f\x8c\xe9\x71\xe7\x27\xd1\x56\x24\x0b\x14\xe6\x5b\xff\xe3\xa2\x80\x74\x7f\x74\xba\xf8\xe2\xc7\x6b\x42\x55\x72\x53\x67\xa6\xd7\x33\xa3\x80\x44\x4c\x81\x57\x20\xbd\xfd\xbc\xe4\x75\x45\xda\x4d\x59\xca\x2b\x13\x72\xd0\x46\xfd\xed\xe7\x8c\x83\x4e\xf3\xf4\x09\x30\xd9\x2a\x0a\x8d\x6c\x4a\x2d\x26\x40\xb2\xe4\x39\x97\x4a\x81\x40\xa0\x95\xb6\x2a\xa7\xc8\x4d\xf3\x11\x86\x08\xb4\x05\xa6\x1e\xf1\x2b\x59\xe1\x92\x8a\x35\x98\x4b\xe6\x19\x7f\x11\x02\x27\x5e\x2a\x8c\xe3\x17\x06\x71\x61\xcd\x3c\xd3\x7b\x55\xcf\xd5\xed\x67\xc0\x79\x35\xf2\x05\x56\x01\xe6\x45\xfc\x8c\xb1\xc0\x40\xf8\xc1\x17\xf2\xdb\xcf\x90\xdc\x04\x40\xe4\x4b\x99\xe3\x4a\xb8\x5e\xc0\x3e\xd9\xd9\x8d\xe3\x27\xb1\xbd\xb0\x02\x17\x30\x6d\xf1\xbe\xc8\x2b\xf4\xcc\x10\x55\x2f\xf2\x7e\xf1\x2b\x70\x8c\x58\x5d\x22\x62\x4a\x28\xc6\xb7\xe0\xba\xc5\x6d\xda\x8e\xa3\x91\xf5\xaa\xf7\xd1\x55\x2e\x22\x6d\x21\x80\x43\x22\x95\xcb\x65\xad\xc8\x5d\x45\xca\x07\x5c\x8a\xd7\xa0\xe2\xa3\xbf\xc1\xb9\x2a\x5a\xd7\x92\x31\x81\x8d\xde\x52\x8a\x85\xb8\x2e\xb9\x5e\xfc\xbc\x5e\xdf\x7e\x2e\x0b\x56\xe7\x52\x0b\x31\x36\x95\x81\xc5\x07\x66\xc7\xed\xe7\xbf\x52\x1c\x4f\xaa\xe0\xfa\x03\xa9\x66\x1a\x55\x1b\xad\x29\x2d\x75\x33\x11\x5b\x3c\x02\xe7\xa9\xa8\x11\x2d\x9a\xfa\x63\x1e\xd5\x1b\x57\x4b\x49\x0e\x07\xc2\xa4\xcd\xa2\x93\x75\xb7\x04\xf1\x3c\x9d\x8b\x95\xb6\x93\x4b\xda\x9b\xfa\x01\x51\x86\x4b\x5a\x83\x25\x6c\x3e\xc8\x17\x15\x46\x81\xec\x9c\x9b\xdf\xd4\x59\x45\xda\x3d\xdc\x3c\xe0\xa5\x5d\x70\x15\x4a\x1d\xf8\xb2\xf9\x26\xb4\x4d\x41\x25\xd3\x8a\xf7\xe9\x8c\x2c\x47\xbb\xa1\x70\x17\x1d\xc7\xec\x14\x70\xc2\x77\x1b\xea\x8d\x6d\x5b\xe7\x0c\x39\xfe\xf0\x9e\xa8\x73\x56\x94\x57\x3c\x97\x6a\x6d\x91\x7c\x8d\xcf\xdc\xec\x9f\x75\x51\xf2\xcc\x8b\x6b\xe0\x63\x11\x5b\x94\xb7\x9f\xf5\x76\x14\xb9\xee\x71\x55\xd3\xca\x65\x05\x5a\x32\x8f\x7a\x4a\x89\xf5\x1c\x22\xe8\x26\x81\x55\x04\x7b\xb7\x71\x66\xcb\xdb\xcf\x57\xb2\x11\xaf\xf3\x30\xac\xb9\xd3\xa0\x05\x48\x60\x3d\xa1\xa9\x30\xe5\xca\x14\x9e\x03\xd3\x5c\xeb\x04\xb9\xde\x52\x9e\xd6\xad\x44\x09\x22\x4d\xd4\x19\xd4\xf3\x6f\x6e\x3f\x43\x0a\x6b\xbc\x53\xfa\xc2\xfa\xe0\xad\xe2\x72\x14\x28\x2a\xe0\xb9\x61\x03\xc5\x4a\xc5\xbe\x98\xf4\x37\xb2\x3d\x49\xbe\x57\x36\x68\x17\x5d\xf7\x2c\x2f\xd6\x5e\x02\x00\xb5\xc7\x7c\xdf\x29\xaf\x1f\x2e\x1f\x04\x09\x35\xae\xd8\xed\xe7\xc5\xea\xf6\x33\x28\x6f\x56\x6a\xe0\x34\x47\x7e\x9f\x4a\x51\x49\x6d\x5b\xb7\x55\xbc\x07\xaa\x76\x22\x38\x70\xff\xec\xec\x96\xef\x3f\xf7\xfd\xc4\x8f\xc7\xc3\xd3\xde\xc5\xd1\x49\xfc\xe2\xab\x61\x00\xdf\x9d\xff\xf5\xe4\xd9\xc9\xc9\xf3\x66\xfe\xd7\x93\x17\x3f\x7c\xcf\xff\xfa\x16\x3f\xb3\x95\x60\xe3\x8d\xc8\xf5\x26\x68\xa2\xfd\x3a\xa3\xfa\x45\xc4\x5e\xf8\x34\x19\x4f\x9e\x1c\xef\x4d\x44\xab\x5a\xd3\x16\x1b\x48\xe5\x0a\x52\xa1\xb2\xc3\x21\xd4\x05\x19\x15\xec\x60\xdf\xb8\xdb\xf6\x0f\x11\x5f\xd6\xc0\x21\x6a\x2d\xcd\x8f\x52\x46\x50\x93\xe5\x12\xf4\xc3\xf2\xe8\x5d\xe8\x4e\xf0\xd2\x5a\x20\x42\xdb\xb1\x36\x62\xfc\x4e\x23\x96\x94\x0f\xc2\x57\x83\x11\x43\x95\x0f\xa6\x64\x01\xe8\xaa\x10\xb8\x03\x29\x73\x00\x94\x27\xa2\x2c\xb0\x66\x93\x32\xf7\xab\x37\x4d\x93\x44\x00\xdb\xcd\x3a\xb1\xe3\x03\x06\x9b\x15\x4b\x95\x7d\xf2\x34\x03\xf6\xe3\x86\xec\xc1\x38\x51\x2e\x7e\x38\xd1\x54\x0e\x82\x30\x8f\x6b\x5e\x89\x52\xf2\x4c\xb9\x59\xb4\x05\x88\x8d\xa2\x67\x04\x35\x7b\xda\x1e\x26\x02\xde\x20\x0e\x21\xe3\x01\x1e\x9f\x2b\x5f\x30\x7d\x88\xf7\x82\x7d\xe6\x79\x56\xd7\x7c\x4b\x5c\x26\x21\x12\x6d\x07\x4e\x3d\x14\x40\xc2\xb3\x54\xad\x81\xbe\x9a\xab\x1a\x11\xf1\xe7\x5b\xe6\xb4\xb3\xbc\xd6\x1b\xd5\x55\x0c\xd6\xa6\x7d\xeb\xdd\xa5\x4a\x93\x4e\x18\x5c\xfb\x11\xe0\xa6\x6a\x55\x68\x23\x55\xdb\x9c\xf8\x21\xbc\xa7\x03\x44\xe7\x78\xaf\x85\x02\x62\x21\x2b\x08\xed\x61\x7c\x91\x8c\x70\x42\xc6\x97\xa3\xd3\x9e\x43\x02\x99\x4d\x01\x20\x83\x20\x33\xa6\xec\x2f\x7f\x81\xea\x81\x47\x8f\x6c\x4e\x7d\x57\x85\x40\xc0\x6e\xf9\x4d\x8b\x05\x98\x1e\x20\xa0\x59\xf4\x06\xe7\xc9\x69\x1c\xa4\xd2\x4f\xdf\xf5\x86\xc3\x5d\xe3\x8d\x5a\x83\x75\xac\xa2\x97\xb3\x77\xe3\xc9\xc1\xf4\x10\xb2\xa6\x3f\x8c\x12\xfc\x33\x66\x48\xdb\x69\x75\x09\xee\x86\x18\xf3\x74\x30\x49\xfa\x33\x3d\x03\xee\x4f\x8e\x21\xd3\xe6\xb6\x5b\x3e\xcc\x68\x77\x6e\xfb\xc1\x3d\xb3\x78\x31\x19\xf7\x2f\x27\x80\x65\x81\x79\xda\x6f\xa6\xb3\xc1\xec\x72\x96\xb0\xb7\xe3\xf1\x29\xe4\x95\x63\xfd\x41\x32\x7d\x6d\xf3\xd7\x11\x09\xa4\x37\xeb\xc1\x87\x2f\x26\xe3\xb3\xc1\x6c\xfa\x1a\x70\x51\x2e\xa7\x03\x98\x67\xa8\x28\x98\x5c\x5e\xe8\x19\x3a\x64\xef\xc6\x1f\x92\xf7\xc9\x84\xf5\x7b\x97\x80\x9a\x39\x3a\x35\xc4\xa0\x44\x09\x3a\x3e\x83\x39\x20\x1e\x57\xc3\x9c\x3a\x18\xe1\xbc\xf6\xf4\x14\x20\x7a\x88\xff\x98\x9e\xe5\xf1\x64\xe6\x27\xdd\x8f\x92\xb7\xc3\xc1\x5b\x64\x62\xf5\xf8\x65\x0f\x6d\x8e\xff\x00\x3f\xfb\xa1\xf7\xb1\x95\xee\x7f\x16\xe2\x49\xb9\xf4\xf7\x07\xa7\xb6\xa3\x90\xc8\xf9\xda\xa1\xf8\x20\x27\x88\xb2\xb8\x81\x7e\x09\x99\x72\x04\xd7\x73\x61\x51\x87\x79\xaa\xcd\x11\x64\x69\x09\x48\x31\x00\x62\xab\x58\x17\x54\xc6\xa7\x78\xa6\x2d\x20\x25\x7c\x82\x66\x9e\x11\xb9\x4b\x28\x2a\xcc\x75\x44\xa4\x5e\x8b\xc8\x15\xe0\x42\x39\xae\x73\xb4\xc6\x6c\x26\xab\xcc\x16\xb6\x7a\xac\x94\x7e\x7b\xc8\xcd\xc2\x09\x30\x4f\xae\x5d\x7d\x27\x48\xe1\xd6\x40\xe3\x3d\x2b\x39\x01\xe2\xbd\x14\x57\xc0\xd3\x1e\xf2\x9b\xe0\x8c\x75\xc8\xd8\x78\xcf\xb1\x48\x1d\xbf\x7c\xf9\xf2\x48\x5f\xdf\x6c\x87\x40\x8e\xb4\xa0\xbf\x29\x8a\x94\xf5\x65\xb5\x8d\xbc\x1a\xaf\x88\x5d\x4e\x7b\x31\x40\x2d\x4d\xb0\x74\x76\x82\xe4\x99\x69\xcc\x2e\x82\xda\xc9\x07\xe3\xb5\x7a\x37\x84\x1e\x19\x15\x62\x7f\x37\x1b\xbe\xe1\x4f\xfc\x78\x24\x6e\x54\x26\xaa\xf2\xeb\x51\x80\xdc\xa3\xff\x3f\x79\xf1\xe2\x59\x53\xff\x7f\xfe\xec\xe9\x77\xfd\xff\x5b\xfc\xf8\xa2\xe1\x0f\x2f\x8f\xb4\x6c\x78\xa6\x55\xa9\x77\x35\xa4\x64\xbe\x2d\x78\x95\x89\x6d\xbc\xe7\x9d\x70\x77\x52\x09\xc7\xbe\xc8\x41\xe2\x59\x1d\xcb\xaa\xfe\x86\xa1\xcb\x82\xb0\x5b\xf2\xc2\x0d\x24\x80\x22\x1e\x49\x64\xd0\x40\x03\x4c\x0b\x59\xb1\x65\x29\x44\xb6\x6d\x81\x33\x3b\xa5\xd7\x07\x7c\x30\x1a\xfe\x2c\xe8\x81\x54\x01\xd6\x0a\xa9\xc6\xab\x62\x23\x2c\xa9\x82\xe1\x6c\xaa\x95\x58\xd6\x59\x04\xd0\x7a\xa6\x48\x13\x2f\x3b\x2c\xd4\x7c\x6d\xef\x01\x42\xfc\x40\xea\x3a\x40\xe7\x33\xa8\xa9\xc5\xb2\xa5\x3e\x15\xe5\xfd\xa5\x96\x64\x49\xf4\x32\x14\xea\xd6\x1d\x6b\x10\x97\x36\x19\x97\x79\xb6\x65\x5a\xd0\x13\x83\x6e\xbd\x58\x11\x17\x9b\x77\x09\xae\xa5\xb2\x2c\x95\xf8\xdc\x5c\xb4\x38\x40\x2c\x15\x02\x88\xd9\xf8\xf1\x9f\x6e\xaa\x23\xc4\x73\x90\x45\x7e\x74\x1c\x3f\xf9\xcd\x05\xc1\x3d\xe7\xff\xe4\xa4\xc5\xff\xf3\xf4\xc5\x77\xfb\xff\xdb\xfc\xfc\xe9\xa6\xea\xca\xee\x88\xf6\xfe\xc8\xf3\x5a\x1b\xb1\xc7\x91\x36\xf7\x9f\x82\x6e\xa6\x1f\xce\xe4\xdc\xd2\x6a\x5a\x1a\x43\xaa\xa1\x40\x73\xbb\x05\x04\x12\xc0\xbe\x0a\x4c\x03\xd0\xb6\xcb\x64\x17\xc8\xde\xc1\xf0\xed\xc5\xd0\xc3\x3d\x72\x27\xde\x6e\x54\x7b\xde\x3f\xc8\xf4\x4a\x54\x84\x57\x04\xda\x55\x3d\x5f\x64\x5c\x29\xc3\xbd\xa0\x3b\x7d\x43\x0f\x11\xc6\xa6\xa3\x94\x05\x20\xa1\x90\xa4\x84\x0e\xe3\x54\x1b\xce\x0b\x96\xc9\x1c\x00\xfe\xb5\xd9\xe7\x18\x8b\x14\x61\x8c\xd0\xa7\x51\x2e\xf9\xb3\x63\x39\x16\xee\xfa\x14\xe1\x45\x74\x70\xba\xa0\xde\x4b\x3a\xab\x9e\xcc\x4e\x96\x15\x9f\x42\x09\xbc\x26\xba\x3b\x11\x33\xa8\xc3\x6a\xc5\xb5\x34\x71\xdd\x32\x80\x25\x7a\x4c\x84\x41\x12\x8c\xc9\xb6\xa1\x18\xbf\xe2\x32\x57\x15\xe3\xba\xb5\xf2\x08\x52\xb4\xa5\x13\x4d\x7a\x3a\xfe\x74\x53\x01\xe5\xe6\xb6\xa8\x6d\x8b\xdd\x5d\x82\x6b\xc2\x61\x99\x86\x6d\x10\x6e\x13\x20\xa7\x01\x6a\x19\xcc\xa7\xee\xb4\x95\x7e\xf7\xec\x27\xbd\x59\x3c\x88\x6a\xc3\x68\xaf\x27\xf7\x99\xa9\xcf\xf0\x30\x85\x11\x81\xc5\xcd\x2c\x0f\xd0\xdb\x70\xb6\x0c\x68\x4b\xb5\x72\x5b\xdb\x6e\x30\x3d\x58\x47\xe8\xec\xad\x7a\x04\xfc\x39\x69\x01\x53\x62\x3e\x43\xae\xf2\x6d\xab\x75\x49\x50\x74\x1e\x27\x53\xc3\x65\xe3\xf1\xb5\xcf\xb7\x16\x2b\xf6\x07\x7f\xdc\xf1\x9e\xc3\xaa\x31\x1d\x85\x79\x53\x95\xbe\xd6\xfc\x8f\x4b\x0b\x06\x02\x2b\x37\x6b\x9c\x2b\xbe\xde\x64\xc2\x79\xa2\x00\x45\xbc\xc1\x54\x8a\xf1\xc2\xa0\x8f\x55\xc1\x14\xaf\xa4\x82\x4f\x38\x82\x79\xfd\xc0\x2b\xf6\xbf\x53\x97\x1e\xe3\x36\xf8\x3f\xf4\x6d\x8c\x50\x2c\x94\x10\x61\x40\x9a\xe0\x30\x78\x0b\xb0\x29\x0b\xb8\xf0\x0f\x88\x1b\xf0\xa7\x9b\x2a\x56\xcb\x38\x17\xd5\x61\xbc\xff\xdd\x3a\xf8\x2d\x7f\xe2\xc7\x6f\xa4\x2a\x72\x4f\x03\x38\x89\x4f\x7e\x63\x0d\xe0\x9e\xfb\xff\xf8\xe4\xe9\x8b\xc6\xfd\xff\xec\xe9\x93\x27\xdf\xef\xff\x6f\xf1\x03\xab\xcf\x12\xb3\xfa\x7b\x3d\xc5\xb8\xe1\xc4\x75\xb7\x2d\x61\x9c\xf3\x2d\x03\x9a\x4e\x2d\x34\x33\x5e\x5e\x89\xb2\x8b\x33\x09\x4f\x76\xe9\x13\x2f\xe0\x57\x36\xbc\xd4\x12\x44\x7d\x12\x99\xa8\x28\x64\x10\xa0\x2b\xf1\x0a\xdb\x6b\xf8\x66\x11\xb1\x73\x55\x00\x63\x82\x87\x90\xe5\x5e\x90\x2a\x7f\xe4\x30\x0a\xcd\x87\x90\xbb\xae\x02\x14\x24\xa3\x06\xdb\x8f\x23\x57\x5d\xf3\x4e\xaa\x56\xa2\x14\xc5\x12\xa1\xb6\x1b\xfd\x25\x05\x1d\xc1\x2c\xb5\x5d\x42\xb8\x94\x0e\x2a\xaa\x05\xca\xd7\x1c\x31\xf6\xd0\xcd\xe6\x01\x27\xa4\xed\x02\xa6\xf9\x90\x95\x62\x5d\x5c\x1b\x33\xaa\xbd\x0a\x08\xdb\x08\x16\x8b\x63\x17\x08\xe6\x13\x31\xef\x54\x9d\x01\x34\x16\xce\x7b\x51\x57\x9b\xba\x22\x9e\x80\x06\x78\xbf\xbb\x53\xef\xc8\x10\x75\x08\x74\x5d\xdd\x8a\xf7\x66\x9d\xff\xce\x6e\x38\x70\x68\x3b\xbe\xb2\x9d\xf9\xd5\x32\xf7\xb2\x81\x4f\xf4\x9a\x43\xcf\xbf\x7b\x82\xbe\xfa\x4f\xfc\xb8\x77\xd1\x3b\x3b\x1f\x7e\x4d\x02\xd8\xfb\xe4\xff\xf1\xf3\x27\x4d\xfe\xd7\x1f\x7e\x78\xfe\x5d\xfe\x7f\x8b\x1f\xe7\xff\x39\x58\x1c\xb2\xe3\x97\x7f\x78\x1e\xe9\xff\xbe\x80\xff\xbe\xd4\xff\x7d\xf9\x04\xfe\x7b\x0c\xff\x3d\x81\xff\x3e\x85\xff\xbe\x60\xbd\xb4\x98\x0b\x36\x05\x2f\x8e\x62\x03\x87\x74\x96\x76\xfb\x89\x51\x50\x00\xa8\xbe\x91\x55\xc7\xcf\xd8\x45\xa1\xaa\x29\x70\x92\x1d\x4c\x0e\x59\xef\xec\x9c\x24\x15\xa5\xd0\x19\xb8\x59\x62\x34\xac\x95\x48\x23\xf4\x22\x13\xd4\xa3\xef\xe0\x69\x7a\x9c\xd0\x4c\x43\xe9\x85\x60\xd0\xf7\x45\x99\xc3\xb8\x32\xcf\xb2\x16\x6b\x0f\x5a\xb9\x18\x25\x16\xe9\x6b\x17\x80\x76\x5d\x37\xf0\xa1\x7e\xd7\x02\x21\xaa\x1f\x7b\xed\x3e\xd1\xa2\x8f\xb3\x0f\x19\x9c\x45\xba\x48\xc3\x4f\x58\xa2\x98\x0c\x20\x3e\x9d\x83\x2b\x20\x9c\x39\x50\x87\xaf\x7d\x06\x56\x09\x57\x34\x07\x00\x3d\x43\x12\x61\x5e\x88\x1b\x6b\xba\xe2\xc0\xf3\x6f\x61\x50\x91\xfe\x16\x40\x7b\x6d\x6d\x9a\xb6\x01\x30\x55\x18\xbe\xed\x21\x0e\xda\xde\x7e\x17\xe4\xff\xaa\x3f\xf1\xe3\xa1\x9c\x57\x45\x91\x39\x0b\xe0\x5b\xfb\xff\x9e\x3c\x7d\xd1\xc4\x7f\x7a\xf6\xf4\xe9\x77\xff\xdf\x37\xf9\xe9\xd6\xf7\x8d\x73\x63\xb7\x4e\x68\xb5\xdf\x40\xe3\xb5\xd2\xdd\x58\x01\xa0\x8d\x3b\x07\x87\x71\x8f\x19\x40\xf4\x79\x2d\xb3\x8a\xb4\x73\x70\x0b\xe2\x5e\x74\x0a\xb2\x81\x52\x77\x4d\x3b\x85\x15\xe0\xba\x83\x1c\x24\xb4\x18\x2c\x5f\x82\x96\x44\xc6\x57\x56\x0a\x45\xfc\x37\x48\x49\xae\x7b\xf4\x5d\x2a\xe9\xf3\xff\xee\x62\x74\xfa\x55\xe9\xff\xef\xf7\xff\xb7\xf2\xff\x8e\x9f\xfd\xf0\x9d\xff\xff\x9b\xfc\xbc\x93\xaa\x2a\x4a\xc0\xd1\xf5\x42\x7c\x23\x24\x25\xa4\x92\x51\x4a\x2c\xdb\xfb\x2f\x4d\x4d\xe8\xbf\xee\x85\x81\x7f\xe0\x32\xf3\x11\xbd\xdb\x26\x7e\x33\x33\x10\x30\x18\x02\x97\xe2\x5d\x2a\xdc\x52\x40\x48\x4f\x1b\xe9\xf3\xad\x89\x42\x36\x75\x36\x24\x15\xd4\x66\x74\x8b\x40\x95\x6f\x36\x82\x43\x86\x1c\x77\x8c\x51\x1e\x85\xf2\xbc\x80\x88\x03\x35\xd2\x7e\x1d\x9e\x33\x38\xc1\x38\xec\x56\xcb\xa4\x0b\x41\x52\x5e\x30\xb0\x06\x0d\x7e\xae\xc5\x57\xb1\x64\xff\xa5\x99\xef\xf1\x5f\xd9\x7f\x01\x5f\x02\xb2\x3e\x8b\xbc\x92\x95\x14\xea\xbf\xde\x93\xe9\x82\x89\xf9\x5a\x3b\xdb\x20\x74\x33\x21\x00\x77\xf3\x17\x7c\x71\x66\x0b\x8b\xbb\x3a\xba\xe6\x9f\x04\x29\x88\x14\x76\x34\xe1\x91\xb9\x41\xac\x57\xb5\xac\xb8\xd1\x1b\x9b\xb9\xa1\x8d\xb5\x36\xb4\x65\x76\x3d\xf7\xb9\x62\x52\xed\xbb\xc8\x2b\xa2\xcd\x03\x63\x63\x23\xf6\xda\xd9\x3f\x93\x92\x36\x05\x50\x58\x2f\xcf\x0d\x50\x3b\x27\xc9\xdb\xde\xe4\x14\x41\x6d\x83\xd4\x25\x0f\x16\x75\x38\xfc\x05\x69\x72\x5d\xf9\x6f\x1d\xbd\x6b\xa7\xae\x79\xc0\xab\x98\xbb\xb6\x3b\x35\xcd\x24\xbb\xd1\x5f\x3f\xbc\xeb\xcd\xa6\x63\x48\x13\x9b\x24\xd3\xcb\x21\x30\x6b\x01\xff\x56\x2b\xed\xcc\xcb\x3a\x0b\x92\xc5\x7a\x23\x20\x64\x46\xe2\x2f\x97\x39\xd6\x91\x14\x06\x89\x63\x83\xf1\xe5\x94\x5e\x88\x9a\x20\xb0\x63\x93\x7d\x36\x22\x7e\x33\x98\x6f\x0f\x1a\xb6\x85\x1a\xec\xcd\xff\xf7\x6b\xf9\x1b\xfe\xc4\x8f\x67\xe3\xe9\x57\xf5\xfe\xdc\x9f\xff\xff\xe4\xe4\xb8\x79\xff\x3f\x7f\xf2\x5d\xff\xff\x26\x3f\xb3\xb2\x56\xaa\x12\x25\xf3\xd1\x2d\x8c\xdf\xd7\x81\x12\x3c\xe1\xec\x60\x36\xb9\x9c\xce\x0e\xbd\x5b\xf1\x60\x71\xc8\x4e\x9e\x3c\xf9\x81\x9d\xcb\x4f\x82\x9d\xcb\xbc\xfa\x1b\x5c\x71\x93\x62\x2e\xca\x8a\x25\x9f\x44\x9e\xf2\x55\x86\xbe\x20\xa2\xdb\x28\xad\x2f\x68\x47\xfd\x80\xcc\x2d\x33\x4e\x9e\xfa\x99\xf4\xea\xab\xd7\x07\xfc\xfe\x4b\xca\x03\x76\x6b\x19\x3b\xf3\xf6\xef\x4c\xdb\x8f\xbb\x7b\x70\x77\x35\xc1\x6f\xdd\x89\xdf\xb0\x76\x60\xf7\x78\x80\xb2\xc7\x0e\x66\x2e\x3c\x2f\x1f\x44\x0a\x7c\x2a\x32\x47\xc5\x5c\xcc\xa9\x2a\x83\x38\xd8\xda\x09\x11\xad\xa2\x93\x7c\x6b\x9b\xde\x22\x29\x07\xfd\x16\xb6\x44\x0d\xd4\x2b\xfe\x5b\x71\x8b\xde\x0b\x7a\x68\x88\x2f\xc2\x60\x78\x9b\xbc\x14\x1e\xe1\xd7\x5c\x66\x50\xde\x01\x65\x11\x95\x5c\x8b\x6c\xcb\x96\x5c\xad\x8c\x6e\x1b\x90\xd1\xa1\x9a\x89\x6b\x14\x62\x01\x66\xb5\x02\x76\xf0\x35\x24\x6d\x2d\x85\xf0\xd2\xbd\xe6\x82\x72\xe3\xfc\x88\x13\x7c\x14\xad\xe3\x52\x70\x55\xe4\x58\x38\x09\xf5\x24\xf8\x45\x9b\x2e\x07\xfb\xc5\x6c\x88\x98\x9d\x81\x16\x16\x10\xa7\xc9\x0c\x34\xf9\x8e\xb9\x5e\x0b\xc0\xa3\x69\x72\x68\x51\xbc\x6f\x5d\xa4\x35\xf9\x6e\x4d\x3c\x10\x94\x3a\x9b\xe5\x62\x0c\xfa\xe6\xcb\xe6\xc5\xa2\x34\x71\x2a\x38\xb6\xdb\x0d\x91\xf7\xd8\x85\xec\x26\x42\xfb\x52\xaa\x33\x70\x25\x94\x75\xae\xee\xa9\xd2\x38\x1f\xfc\x98\xb0\xf3\xc1\x68\xf6\xdf\x41\xc1\x9b\x8c\xdf\x24\x93\x19\x4b\x7e\x4c\x46\xa7\xbd\x77\xc3\xdd\x75\x19\x5f\xbb\x2a\x23\xba\x37\xa9\x10\x12\xfc\x47\xe3\xd1\xd1\x60\x74\x36\x19\x8c\xde\x42\x91\x42\xf4\x80\x42\x8d\x7b\x86\xac\x07\xd6\x2c\x4f\xf9\x5e\x83\xf1\xef\x53\x83\xf1\xcf\x56\x48\xbe\xff\x7c\xd3\x9f\xf8\xf1\x9b\xe9\xf0\xab\x64\xfd\xba\x9f\xfb\xfc\x7f\xcf\x7e\x68\xe6\xff\x1c\xff\xf0\xfc\x7b\xfc\xf7\x9b\xfc\xbc\x29\xb4\xf6\x61\x73\x32\x1c\x3c\x9a\x0f\xf5\x76\xc4\x7a\xf5\x95\x56\x3c\x8e\x5f\x54\x2b\xca\x07\x0e\x0b\x02\x9a\x1e\x39\xad\x9e\x80\xde\x49\x31\x57\x2c\x14\x20\x58\x09\x88\x1f\x02\xf0\xc4\xdf\x48\xcb\x9b\x1b\x87\x55\x98\x8c\x19\xaa\x73\xbe\x2a\x17\x2a\xa8\x8b\xe2\x5a\x94\x26\xcd\xc4\xab\xe3\x3c\xd0\x8d\x78\x15\xc6\xd6\x47\x69\x35\x68\xa0\x92\xdb\x64\x3c\xa0\xb1\x8c\x48\x53\x20\x95\xab\x2a\x79\xae\xd6\x12\x8d\x08\xd3\x98\x2d\x5a\xd8\x94\x62\x03\x54\xf2\x61\x6e\xaf\x63\xdc\x6a\xbd\x00\x26\x0a\x32\x46\x1e\x79\x8c\x91\x37\x2b\xa2\x21\x9d\x7a\xc5\x0b\xcb\xba\xcc\xb1\xbc\xd5\xa3\xca\xcb\xb2\x9d\x25\x11\xaf\x20\x4f\xbb\x1d\xb1\x36\xd4\x5d\xfe\x84\xc2\x54\x21\x97\xbf\xcb\xfb\x8c\x48\x43\x33\xf9\x52\x68\x5d\x98\x09\x85\xf5\x8d\x4c\xaa\xa7\x2d\xbe\xb8\xd3\xa6\x88\xac\xce\xea\xab\xcf\xbc\xc5\xd8\xef\x26\x4a\x6a\xa5\xad\xc0\xd8\x37\x65\x8a\x3a\x82\xc0\xfb\xe7\x99\x08\x6c\x91\x90\x8d\x3e\x51\xb6\xdf\x83\x5c\xf1\x22\x13\xc8\xf3\x86\xbd\x2f\xd7\xba\x39\x43\xef\xec\xe9\x8b\x3e\x47\x2d\xa5\x95\x99\x92\x63\xd2\x64\x33\x9e\x5f\xd5\xfc\x0a\x82\xf2\xc8\x95\xaa\x55\xcb\xa4\x5b\xb3\x24\x32\xb0\xe8\x3e\x36\xb0\x96\x32\xe9\xfb\x26\x3b\x28\x92\xf4\x07\x7f\xb5\xde\x38\x1b\xcc\x86\x09\x68\x38\x4d\xf5\x71\x57\x5d\x6f\x9b\x2e\x0d\xd5\xc0\xf1\xc8\xa3\xfe\xd7\x5d\xbe\xaf\x72\xd7\xf9\x36\xd1\xcf\x78\x9f\x46\x05\xca\x93\xaf\x26\x39\x4f\xe4\xd9\x64\x7c\x1e\xdd\xef\x8f\xb4\xbd\xa1\xa2\x63\xf2\x4f\xe2\xe7\x4f\x93\xde\x70\x30\x7a\x6b\xe9\xec\xff\x0d\x3d\x94\xf1\xe3\xe4\x12\x10\x30\xbf\x16\xf9\xd3\xbd\xf7\xff\xd3\x93\x27\x4f\x9a\xf5\x7f\xc7\x2f\x5e\x7c\xe7\x7f\xfa\x26\x3f\x77\x60\x9d\x2e\x04\x7b\x0f\xc0\xa6\x7b\x00\x72\x7a\xb0\x38\x04\x29\x69\xdf\xe8\x17\xeb\x75\x9d\xcb\x6a\xab\x15\x82\x17\x98\xdb\x75\x77\x73\x78\x1f\xeb\xd6\xf6\x0f\xb1\x54\x44\xd8\xea\x99\x0f\x50\x03\x50\xba\x2b\xea\x00\x10\x9e\x96\x32\xd7\x82\x56\x64\xc5\xcd\x21\x99\xf2\x7e\x80\xa8\xb3\x24\xc4\x10\x4a\x2e\x88\x78\xd8\xcb\x48\x42\x8e\x5a\xf4\x64\x81\x03\x86\x2b\x2a\xb6\x91\xaa\x83\xba\x78\x21\xe8\x6b\x2b\x39\x97\x40\xd6\x4e\xbd\x15\x3f\x57\x22\xaf\xf0\x8e\xa9\x91\x87\xd3\x53\x42\x38\x7a\x3b\xcd\x47\x5b\xe4\xa7\x5e\x67\x0e\x09\x1a\xc3\x54\xe7\x7d\xc0\x74\xe6\x07\x8f\x90\xdd\x98\xea\x99\x21\x31\x73\x77\x4d\xdc\x8a\x2b\x64\x5b\x6d\x5e\xd3\x14\xbd\x94\xeb\xb5\x48\x25\xaf\xc0\x57\x65\x7f\xd9\x19\x03\x35\x09\x15\x41\x8f\x5f\x19\x46\x8d\x61\x3b\xaf\x18\x36\xcf\xfb\x98\xb8\xc2\xf4\xff\x8a\x12\x3a\x44\xc1\x3c\x9a\xb2\x7c\x6b\x1c\x8c\x7a\xfb\xe8\x11\xde\xc8\x2c\x93\xf9\x55\x4e\xdc\xed\x46\x07\x09\x5b\x8e\xa9\x0c\xec\x54\x04\x54\x5c\x83\x3c\x98\xa5\xa8\x31\x6c\x9c\x4a\xc3\xc5\xec\xfd\x42\x7f\x1c\xd4\x28\x84\x9c\x3d\x02\x8f\x20\x35\xf2\x2a\xdc\x5a\xc1\x23\xe1\xfa\xd1\x14\x99\xad\xfc\x2a\x54\x66\xfd\xa4\x40\x72\xad\x2e\xf0\x28\x2d\x8c\x56\x11\xac\x67\x7b\x53\x46\x9e\x9b\x91\x2b\xe3\xb5\xef\x6b\xe5\x04\xd5\x24\x55\xe8\x7f\x4f\x9c\xfe\x82\xbf\x43\xbf\xdd\x82\x13\xab\xee\xdc\x1b\x44\x93\x11\xf8\x95\x2d\xcc\x01\xed\x29\x74\x9d\x2e\x8a\x3a\x4b\x81\x75\x16\xaa\x01\x1a\x5d\x16\x22\xa2\x32\x9f\x7a\x43\x05\x3e\xad\xe9\x69\x24\x3c\x62\xd6\x7d\xec\x71\xdb\x2e\x84\xf3\x19\xe2\x66\xf6\xcf\x9d\x56\xd2\x7c\x96\x20\xd0\xef\x36\x22\x4f\xe1\xc5\xce\x8f\xda\x52\x2a\x20\xf5\x85\x19\x2d\x18\x14\x0a\x42\x9e\x02\x15\xe4\x29\xc6\x9b\x53\xf1\x9a\x14\x65\xfc\xb2\xd4\x67\x0b\x09\xbb\x71\xdc\x01\x2b\xb3\x0f\xef\x23\x8d\x77\xb7\xce\xab\x72\x6b\xf0\x6c\xb1\x03\x3d\x04\xdf\x67\xc7\xcf\xc3\x6d\x04\x67\xa9\xa3\xf3\xb4\x4d\x64\xa5\x5a\x0b\x15\x36\xe0\x6d\x05\x6c\x67\x55\xaf\x79\x7e\x54\x0a\x9e\x72\xe2\xb0\x5f\xfb\xe2\xc7\x89\x54\x4c\x1b\x45\x4c\x9f\x6b\x91\x03\xbb\xc4\x12\x52\x00\x8a\x0d\x22\x5a\xa8\xaa\x4e\x31\xa3\x03\x93\x3b\xc2\x2f\x37\x36\xdb\x2b\xaa\xf4\x4e\x05\x7d\x42\x9f\x78\xd4\x9c\xb3\x4c\x6f\x3d\x81\xbe\x7c\x99\xe1\x29\x70\x1d\xd1\x47\xb0\xa2\x32\x05\xe0\x93\xde\x94\xc2\x2a\xdb\xb6\x74\x1c\x0b\x34\x4c\x1e\x57\xeb\xb4\xaa\xa2\x7c\x45\x59\x16\x55\x5d\xf2\x0c\x92\xcf\xc4\x15\xcf\x8c\x09\x1a\xd2\x3f\x0b\xd5\x71\x12\x95\x9b\x25\x27\x73\x5a\xa7\xdf\xa2\x4b\x17\xe5\x81\x3a\xc4\x61\xef\xfa\xe8\xcd\xaa\x30\x99\xb6\x77\x35\x1e\x85\xc8\x25\x0e\x65\xda\x5e\x96\x70\xee\x28\xa1\xa3\xb5\x61\xbb\xa6\x43\x80\x31\xb5\xff\xb1\xa8\xf7\x1f\xd0\x45\xc8\xea\xe0\x70\x73\x6a\x8b\xa6\x61\x61\xed\xac\xc3\x6c\x4e\xcd\x69\x07\x1f\x79\xdf\xce\xaf\x2c\xf2\x57\x14\xa3\x81\x03\xad\x04\x88\xfb\x88\x5d\xc9\x6b\xf8\xff\x4c\xe4\x29\xfc\xa1\xd4\x47\xa7\x49\xfb\x1e\x79\x4b\x05\x7f\x35\x66\x3a\xfe\x2d\x98\xc1\x35\x87\x1a\x5e\x2b\x34\x23\x56\xe4\x47\x99\x96\x29\xfa\xb1\xe5\x12\xfe\x1c\x35\xec\x51\x23\xaa\xf0\x26\x86\xf7\x17\x0b\xba\x8b\x90\xca\x49\xe9\x7e\xf1\x8c\x2d\xeb\x7c\x81\x10\x97\x90\xa9\xc3\x28\xde\x98\x4a\xb5\x29\x14\xcf\x0c\x64\x14\x5e\x6f\x3b\x26\xde\x96\x1d\x2f\x8a\x8d\x9d\x71\x8a\x99\x1a\xb4\x05\x5f\xca\x22\x58\xac\xbf\xdf\x03\x1f\x8c\x82\x8a\x57\x90\x6a\x59\x7a\x74\x23\x53\x11\xb1\xb2\xd8\xf2\xac\xda\x1e\x2d\x4b\x01\xc4\x01\x50\xf4\x87\xec\x61\x80\xb1\x80\x17\x2c\x9c\x60\x83\x82\x89\x4e\x87\xe0\x8a\x8c\xac\x06\x90\xd6\xa5\xdd\x84\x4e\x0a\x5e\x0b\xe5\x25\xa2\xb7\xb5\x04\xd8\x19\xa6\x74\x09\xb5\x1d\x42\x85\x90\xe5\xa2\x5e\x2b\x64\xca\xd7\x12\xc1\xc4\x94\x60\x13\x46\xf6\xdd\x30\xfa\x09\x0a\x9d\xfd\x1d\x65\x9d\xb5\xbe\x4c\xb1\x33\xfe\x49\xb4\xa9\xef\x1b\x57\x55\xd8\xa0\x27\x0e\xcc\xd9\x33\x08\xa8\xa1\x9f\x04\x07\x5f\xe1\xe1\xf1\xae\x67\x7d\x33\xa1\x87\x29\xd8\x54\xb4\xd5\x4c\xb9\x59\xd0\x34\xf4\x75\x23\x4a\x90\xd5\xf8\x4f\xd9\x36\xea\xb8\xbd\xa3\x8e\x0e\x37\x0a\xd0\xba\xbf\xe7\x1e\xd7\x67\x0c\xbe\x57\x02\xf3\xfb\x03\xde\x50\xf5\xfc\xc8\xe2\xa4\xe1\xfe\x94\xf9\x1d\x6f\x22\x7a\x34\x10\xf0\xd3\xe3\x54\x59\x8c\xe0\xdf\x0a\xb8\xf6\x61\x03\x80\x0a\x1a\x99\xfc\x39\x65\xf6\xc0\x9a\x57\x2a\xd2\x6a\x2e\x1e\x9f\xe2\x86\x7d\xca\x8b\x1b\xb8\xf3\x33\x5e\x41\xcc\xfa\x5a\xa0\xd7\x91\x2b\xb6\xe4\xa5\x99\x29\xef\x2e\xd6\x57\x33\xfa\xdd\x14\x53\x45\x6c\x35\x44\xe1\xd1\xfa\xdf\xe8\xfe\x22\xde\xad\xe9\xa9\x6e\x61\x1b\x85\xda\xd8\x0d\x97\xd7\x42\x81\x82\x6a\xd7\xdc\x0c\x05\xfe\xd5\x6b\x81\x85\xd6\x02\xd7\x47\x08\xcf\xb1\xee\x90\xaf\x88\xc0\xae\x11\xcb\xa5\xc0\xe8\x6c\xb5\x72\x67\x90\x64\x81\x58\x14\x79\xb1\x96\x0b\xd3\x37\xe8\xad\xf1\xce\x29\x80\x4d\x6a\x0a\x04\x92\x04\xd4\x09\x7b\x11\xb4\xe4\x80\xc7\x22\x88\x02\x9f\x3e\x61\x9c\xb6\x1c\xb0\x72\xd9\x4a\x64\x2d\xe5\x34\x6a\x0c\x31\x20\xfd\x87\x41\x79\xc6\x57\x43\x9c\x79\x07\xae\x43\xc7\x35\x95\xfb\xc1\x85\xe1\xae\x22\xab\xe6\xb4\x46\xad\xcf\x86\xa9\xed\xb7\xed\x53\x0c\x5f\x42\x09\x66\xa0\x30\xeb\x1d\x06\xd7\x45\x5b\x61\x06\x78\x03\x27\xa6\x3c\xa3\xac\xfd\x6c\x63\x97\xd0\x93\x98\xef\x90\x62\xa4\x9d\x71\xeb\x59\xb4\xfa\x98\xef\xed\xf6\x7b\xe5\xdf\x41\x1c\xea\x5d\x21\xc9\x42\x70\xf4\x69\x6e\x83\x07\x6c\x86\x8b\xfd\xbc\xaf\xd8\x80\x13\x35\x45\x8d\x26\xc2\xac\x04\x6b\xca\xdd\x69\xe9\xf1\xaa\xe2\x8b\x95\x43\x3a\x20\x41\xaa\x05\x70\xa1\x64\x55\x94\x5b\x3a\x33\xcd\xce\x6b\x6d\x99\x2b\x99\xa1\xb2\x48\x99\x0a\x78\x79\x4a\x52\x42\xf5\x0c\xba\x32\x5e\xaf\xe7\x5a\xd9\x91\x79\x8d\xaa\x8e\x27\xcc\xda\xea\x99\xed\x93\x61\xe9\x1b\xca\xb5\x34\xf9\xa7\x85\x87\xdf\xa9\x7f\x3d\x2a\xaa\x95\x8f\xed\xe6\x59\xf7\x12\x08\x96\xc9\xc3\x2e\x36\xa5\x39\x7f\x4e\x71\xc2\xa9\x9e\x8b\x5c\x2c\xf5\xee\x01\x54\x11\x7d\x30\x5c\xb9\x04\x94\x36\x98\xaf\xbb\x23\x61\x4e\x15\x6d\xfc\xf0\x18\x14\x37\xb9\x28\x55\xe7\x45\xe9\xfb\x41\x22\x2b\x00\x7e\x5e\xf1\x5a\xb9\x53\xe0\x49\x54\xd0\x62\x48\xbf\xf0\xa5\x9e\x37\x21\x20\x8d\x2b\x14\x7d\xcf\x63\x36\xb6\xe5\x5b\xa1\xfa\xa6\x84\x3d\x50\x70\x4c\x1b\x7d\x76\x46\x0c\x4a\x1e\x60\x6f\xb4\x91\x08\x55\xac\x45\x80\xc9\x04\xeb\x5f\x78\x9f\x92\xeb\x4d\xa1\xdc\xd1\x37\x9f\x8c\xe9\x82\xf0\x1f\xe5\xa5\x68\x86\x36\x18\x63\xbd\xca\x69\x94\xd0\xa7\x57\xe1\x5a\x21\xb4\xde\x27\x21\x36\x7a\x5d\xb5\x66\x19\x54\xf0\x45\x24\xcc\xc0\x42\x37\xd0\x79\xca\xd5\xf5\x51\x8c\xc1\xfc\x1d\x0e\x56\x29\x96\x28\xa3\x3d\xdd\xcb\xc4\x72\x48\xcd\x33\xd9\x53\xc5\xd2\xa4\x23\x4b\x00\x03\xf7\x7b\x06\x41\x10\x93\xfd\xe2\xc2\x5c\xe0\x41\x0a\xbe\x1f\x9c\x6f\xeb\xe5\x81\xd3\x7f\x2d\xca\x6d\xfb\xf8\xaf\xc4\x63\xe5\x27\x23\x75\x1b\x33\x5d\xdd\xc1\x1a\x72\xbd\x95\x1b\x5a\x11\xd8\xc6\xbc\x2c\xb7\xae\xc4\xd0\x76\x12\xd0\xd6\x41\x66\x70\x4f\x63\x58\x01\xd8\x94\xc8\x5d\xe9\xa1\x89\x09\xa5\x1c\x88\xc7\x02\x83\x1d\x49\xf4\x8a\xcd\x36\x13\xcb\x4a\x5b\xe1\xb5\x12\xaf\x8c\xb4\xb5\x7d\xbc\xcf\x3c\x0b\xf5\xf5\xe0\x04\xc1\x99\xb8\x4f\xd5\x6b\xa8\x88\x20\x18\xee\xb5\x59\x2c\x5e\x58\x5a\xe4\x3b\x4c\x21\x4f\xbe\xe0\xc9\xe4\xa4\xa9\x78\xc8\x37\xc1\x53\x14\xb1\x6a\xcb\x01\x69\xbd\x64\xd9\x36\xf0\x1b\x15\x79\xb6\xf5\x2f\xcd\xa0\x65\x67\x8a\x85\x6b\x7e\x30\x17\x0b\xbd\x9a\x57\x56\xdc\x1e\x6a\x65\x2c\x2f\x80\x14\x4f\xef\xdf\x92\x4e\x28\xda\x65\x74\x6f\xf1\xcc\x0c\xae\xf4\xf3\x08\x8b\x50\xeb\x6b\xed\x20\xac\x6d\xad\xb0\x59\x23\x15\xee\xb6\x1a\x7d\xfe\xc1\xed\xce\x6d\x71\xda\xde\x16\x7d\x7f\x5b\xb4\x96\xbd\xad\x6f\x7b\x1b\x81\x4a\x3e\x3a\x3c\x2e\x8c\xe7\x28\x52\xc1\x35\xd4\x40\x4c\xe0\xb6\xb3\x99\xf0\xbd\x8c\x0f\xda\x42\xa4\x01\xdf\xb9\x83\xda\xcd\x63\xa2\x1e\xb8\x12\xb5\x62\x65\x1e\xc4\x69\x8a\xd8\x7e\x47\x87\xf6\x51\x7a\x59\x1d\x90\x74\x4a\x45\x2a\xa3\xb9\x7c\xf8\x66\xa3\x6d\xed\x9f\x1b\x57\xbe\xef\x47\x9f\xae\xc0\xe7\xe7\x2f\xc4\x23\x15\x08\x6c\x37\x90\x76\x47\x80\x70\x26\xd3\xeb\x0f\x82\x6c\x25\xd5\x63\x3d\xb1\x5d\xaf\x37\x9d\xb6\x45\xfb\xa6\xea\x68\x1f\xe5\xfe\xa6\x14\xda\xf0\x42\xae\x17\xad\x81\x99\x33\x11\xb8\xc5\x3e\xac\x3c\x2e\x4d\x10\x65\x2d\xe1\x82\x49\xc2\x4d\x6f\x40\x14\xee\x43\x10\x04\x0e\x45\xea\xe1\xba\x9d\x53\xc8\xba\xb5\x29\x69\x35\x54\x23\x6b\x3a\xd4\x29\x6b\x61\xee\xd4\xa6\x84\xf8\xc5\xda\xd4\x10\x3c\x13\x17\x65\x51\x21\xe8\xd4\xab\x1d\x9e\x59\xd4\x11\x36\xcd\x22\x30\xdc\xce\xfa\x7e\x45\x38\xdf\xc8\xbb\x6c\x23\x43\x5a\xc1\xe8\xaf\x45\x19\x62\xfe\x3a\xd3\x02\xf5\xab\x00\x07\x6b\x59\xb4\xb2\x5b\x17\xb5\xaa\x8a\xb5\x36\x39\x28\x7d\x3c\x15\x6a\x51\xca\x79\x08\x7c\x18\x6a\xd4\x60\xf0\xa2\x1b\xc1\xa9\xbf\xb9\x71\x2d\x77\x69\xc3\x86\x87\xad\xbf\xe2\xd8\x58\x0f\xa1\x89\x57\x72\x63\x14\x26\x8b\xb0\xe8\xd9\x8a\x25\x99\x60\xed\x92\xb2\x4e\xbd\xcf\x98\x46\x7a\x23\xe0\x81\x90\xa8\x28\x82\xe1\xb5\x92\x6b\x3c\x36\xa5\x93\x46\x55\x61\xff\xd9\x56\x97\x91\x42\xb0\xa2\xdd\xb0\x29\x6e\xe8\xb7\x14\xe9\xaa\xc0\x3a\xc3\xb5\x6b\x8a\x60\x00\x59\xf7\x7c\x9a\x0f\x19\x43\xe8\xcc\xa7\xaf\xcf\x4b\x99\x5f\x85\xd1\x3d\xad\xd2\x7d\xfb\xc1\x00\x88\x3c\x78\xc3\x16\xb0\x9d\x02\x47\x6b\xd5\xb9\x6e\xba\x79\x0f\xe0\xdd\x9b\x0e\xb2\x5e\xc9\xbb\xe6\xb9\xc9\x10\x60\xcd\x27\x0b\x54\xa1\xdd\x74\x5f\xa4\x92\x88\xf0\x4e\x03\x6d\xf2\x03\x15\xb7\x99\x2d\x66\x94\x02\x0a\x57\xc8\x1c\x5d\xe0\x42\xa9\xc8\x39\xd0\xe9\xd0\x17\xb5\x56\x1a\xe4\x1a\xd8\x59\x60\xca\xf3\x7a\x2d\xca\xa2\x56\xae\x9b\x45\xa9\x4c\xcd\x9d\x3e\xce\x9c\x2d\x25\xa5\x1b\x59\x7c\xc2\x35\x7a\xae\x4a\xb1\x2c\x4a\x61\x01\xff\x53\xb1\x14\x0b\xb4\x3c\xf6\xe7\xf5\x95\xda\x67\x32\xd7\x0f\xe5\x95\xbd\x3a\xaa\x2d\x3a\x32\x5d\xdc\xcb\x91\x91\xc2\x68\xcd\x6d\x86\xa6\x04\x9e\xea\xa8\xdb\xde\x6e\xb9\xc8\xd1\x67\x64\xeb\x03\xe7\x5c\x49\x15\x54\x8a\x3a\x3d\xdc\xb8\x5f\x3f\x49\x00\x11\x07\xa6\x6e\x73\xe8\x71\x69\x9c\x27\xcf\xbc\xed\x19\x73\x6b\x51\x2e\x56\x3c\x37\x35\x8c\x11\x5b\xca\x0a\x42\x92\x20\x77\x2d\x01\x10\x2f\x4d\x11\x63\xc4\xf8\x5c\x19\xcf\x8d\x37\x4f\xa2\x2c\x8b\x52\x45\x7a\x1b\xd6\x25\x5f\x6c\xd1\x05\x2b\xf3\xa5\x3e\x28\x88\xb9\x57\x2c\xc1\x1a\xcd\x32\xb1\xa8\x6a\x0e\x97\xcb\x46\x94\xd5\xd6\xda\x79\x2e\x6e\xed\x0e\x21\x47\x95\x3c\x0c\x2c\xfd\xd0\xb9\xbf\x40\x88\x77\xda\x2b\x5b\xd8\x55\xb9\xe7\xd4\x36\xf5\xfb\x4d\xab\x87\x3b\x1d\xd0\x7a\x82\xad\xa9\xa8\xe7\xd9\x39\x8f\x82\x2b\xe5\x0f\xcd\xbd\x3d\x94\x34\xa5\x70\x52\x51\xd4\x9b\x98\x19\x57\xb8\x6e\x37\x32\x5b\xd6\x19\x5b\x4b\xa5\x3f\x5a\x2f\xc0\x70\x4b\xf9\x9a\x5f\x09\x3d\x90\x52\x2c\xaa\x6c\x8b\x66\x0c\x48\x0f\xe3\x5c\x47\x9f\xba\x6a\xba\xee\x00\x12\x31\x67\x79\x01\x10\xbe\x15\x02\x61\xb9\x4b\x34\xdf\x52\x9b\xe6\x8a\xd6\x7f\x8e\x6c\xc5\x0b\xc6\x2d\x4b\x9e\x45\xb6\x0b\xde\xd6\x8a\x18\x2f\xa9\x18\xb7\x6e\x4d\x5c\x61\x63\xfe\xad\x5c\x84\xbb\x36\x9f\xfb\x90\xee\x5f\x56\x28\xf8\xe2\x55\x51\xa4\x7a\x28\x11\x1e\x52\x55\x15\x9b\x0d\xbf\xa2\x7a\x0d\x08\x8e\x2d\xb9\x04\x56\x47\xf0\x86\x65\x26\x3c\x11\xd9\x16\x52\x5e\x71\x03\x2c\x43\x14\x9f\x7a\x7c\xf8\xb1\x08\xf1\x8d\x65\x78\x1b\x3b\x03\x8f\xa7\xd7\xe8\xb5\x5d\x92\x40\x56\x0e\x17\x86\xec\x59\x6c\x28\x66\x16\x9b\xb2\xbd\x0c\x6e\xea\xf1\x6c\xeb\x2d\x5c\x83\x16\x84\xd7\x72\x05\xbf\xc6\x66\x33\x7e\xa3\x8c\x6f\x17\xda\xc7\x7f\xd8\x6c\xb2\x6d\x6b\x9b\xbd\x8c\x59\xcf\xd9\x2d\xfc\xaa\x14\x48\xac\xa2\x7f\xf7\x61\x25\x33\x11\x6a\x7e\x9d\xae\x97\xa6\x01\x11\x59\x1a\x91\xc5\xaa\x28\x14\xc1\xfb\x1b\x53\x3e\xf7\x0d\x25\xfb\x41\x28\x59\xd2\x46\x15\x86\x1e\x30\x0f\x56\x0b\x58\x01\x9b\x2d\xa2\xdb\x88\x93\x9c\x20\xa7\x77\x64\xcf\xa3\xde\x18\xa9\x58\xe7\x20\x72\x6c\xf1\x95\x9b\x93\xc0\x55\x82\xda\x9c\x25\x03\x03\x92\x6c\x05\xda\x0c\x95\x66\xf9\x9a\xbc\x5d\x14\x99\x53\x27\xa0\x5e\x46\xcf\xab\xd7\xa8\x1b\x33\x84\xe7\xb4\xb9\x59\x10\x60\x69\x71\xa3\xad\x97\x15\xcf\x96\xe8\xdf\xa1\x7f\x56\x05\x10\xc1\xfa\x40\x41\x40\x4f\xad\x1f\xa0\xc7\x4d\x95\x4e\xeb\xc2\x35\x20\x47\x30\x48\xef\xba\x8d\xe8\x0b\xfa\x22\x5b\xe2\xa5\xab\x27\x18\x42\x70\x38\x3d\xcb\x6d\x04\x42\x36\x27\x30\xa8\x55\x91\xa5\xe8\x26\xf5\x95\x98\x15\x2f\xd7\x99\x15\xda\xf9\xd6\x9b\x48\x99\x2f\xea\x12\xf3\x76\x60\xa2\x41\x42\x01\xcb\xab\x28\x21\x43\x83\x90\x70\x61\x82\xfc\x36\xc9\x13\xbe\xd4\xf3\xf3\xd1\x00\xbe\xe2\x84\x8a\x94\x38\x62\x16\x2b\x0f\x1b\xbc\xf4\x37\x8a\xed\x80\x65\x84\xec\x05\x1b\xa2\x23\xd0\xb7\x31\x16\x4d\xdb\xcd\x40\x06\xa5\xfd\xfa\x5c\x5b\xcf\x72\x81\xc8\xc5\x70\x53\xca\x45\x91\xb3\xfd\x01\xce\xdf\xbe\x49\x06\x72\xf7\xea\xbc\xa8\xaa\x62\x8d\xce\x8a\x1b\x99\xa7\xc5\x8d\x89\x5b\x99\x63\x52\x89\x9f\xab\x2e\xff\xc6\x7c\xcb\xf8\x72\x29\xcb\x35\x55\x56\x2a\x48\x93\xc8\xbd\x05\x55\x72\x2d\xf5\x05\x79\xc3\xb7\x66\xd7\x15\x65\xca\xad\x5f\x0b\x1c\x8c\x58\xfd\xb5\x6c\x44\x6d\x62\xd6\xf7\xc6\x81\xb0\x31\x0b\x00\x0c\x24\x8f\x36\x81\x43\x66\x82\xa3\xda\x26\xcb\x52\x5c\x17\x44\x1a\xd8\x98\x51\xaf\xdf\xc6\xd3\xa7\x6f\xdc\x4a\x91\x4a\x86\x2c\x23\xb6\x2e\x0e\xd8\x77\xb1\xeb\xd9\x16\x21\x69\x5c\xeb\x5b\xa7\x4e\x7e\x59\xb3\x7a\xbe\x28\x5e\x84\xa6\xe7\xb6\x19\x17\xa9\x0a\xd8\x4f\xf3\xad\xbd\xcd\x4f\x9a\xfd\x8f\x70\x6f\x91\x4e\xdc\xba\x53\x2a\x3f\x45\x60\xbe\x85\xe6\xba\x32\x05\x4c\xa2\xd2\xfd\x1e\x0b\xd7\xc8\x3d\x91\xbe\xe3\xe3\x98\x0d\xbc\x02\xce\x20\xb2\x49\x71\x37\x08\x61\xd2\xd5\x79\xff\xa7\xfd\x6f\xce\xb7\x54\x7f\x58\x2c\x99\xd0\x5a\x52\x59\xe4\x72\xe1\x1b\xee\xae\xaf\x07\xfa\xac\x13\xae\x71\xa4\xff\x11\xc4\xb1\x41\xc5\x28\x6e\xf2\xac\xe0\xa9\x6b\x1a\xbd\xfa\x00\xc0\x59\x09\x96\x15\xd8\xd8\xa1\x71\xf1\xba\x4e\x6a\x6d\x30\x17\xa8\x0d\x88\x54\xf2\xc6\x87\x38\xbb\x11\x73\x25\x2b\x71\x88\x3e\x56\x5e\xb1\x4c\x70\x55\xb9\x98\x54\x10\xeb\xd5\x7f\xf4\x0b\x5e\xb5\xa5\x8b\x11\x74\x92\x2f\x8d\x28\x66\x29\xae\x78\x69\xa3\xce\x5e\x18\xae\xe9\x9c\x5e\x09\x7d\xde\x98\xac\x0c\x70\x9e\x0b\xc0\x44\xf6\xf6\x4a\x23\xad\x3e\x94\x22\x0d\x4c\xe2\x76\x42\x17\x2e\xed\x49\xcc\x66\x90\xf9\x14\x2c\x4c\x57\x3a\x82\xd7\x89\xc6\xe6\x76\x96\x2d\xa8\x01\x15\xb5\x07\x90\xe7\x85\x9e\x03\x2c\xf7\x04\xd7\x9c\xde\x1f\xf3\x12\x84\x79\xa3\x3f\xe6\xdb\x9d\x9e\x44\x36\x85\xb3\x61\xdb\xb6\x4e\x5b\x7d\x19\xb9\x0f\x06\xfe\x30\xda\x8d\x5e\x12\xcc\x0a\xdc\x0e\x0b\x21\xaf\x45\x73\x97\x04\x3d\xe9\xc8\xde\xb1\x66\x0b\x1c\x52\xd2\x45\x0d\xc5\x8f\xcc\xd9\xb2\x86\x98\xc4\x7a\x93\xc9\x50\x08\xfa\xba\xfa\xf1\xd3\x98\x9d\x4b\xb5\x10\x59\xc6\x73\x51\xd4\xa8\xc1\x90\x8a\xb8\x29\x05\x71\x5a\x17\x4b\x2b\x25\x5e\xa2\x25\x15\xee\x05\x0b\xcc\x42\xd9\x03\xa6\xa4\xd7\x29\x2a\x73\x51\xdd\x08\xca\x21\xbd\xa0\x72\x14\x1e\x1a\xee\xd6\x40\xb7\xab\x87\x21\x74\x9a\x34\xdf\xd3\xe6\x7f\x1b\x82\x6b\xd7\x3c\x93\x29\x12\xa9\x09\xbd\xcf\x17\xc2\xd3\xfa\xc2\xcd\x4d\xfe\x53\xbb\x56\x1c\xe2\xe1\xd0\x24\xb4\x42\xd0\x83\xb6\x19\x0f\x54\xc6\xdb\x77\x60\x1d\xaf\x8a\xcc\x6c\x04\xd7\x3d\xa3\x78\x02\x26\x7f\x59\xbb\xf4\x4b\x30\x6e\xd7\x7a\xc1\x20\x6f\xb2\x1d\xc4\x96\x15\xf6\x00\x76\xb5\x37\x0c\x1b\x73\x0f\x92\xa2\xc9\x17\x06\x81\x68\x7d\xca\xd5\xca\xaa\x6f\xc0\x56\x57\xc9\x85\xe3\xf8\xa0\x2e\xe4\xe2\xc6\xfd\x5b\x5b\xda\x17\xa0\xfc\xc2\x3f\x4a\xcf\x1d\x86\xa7\xd6\xb8\xc3\x22\x6b\x42\x94\xc2\xf3\x6c\xa9\x07\xa7\x14\xc5\x6c\xd4\xea\x86\x1f\x83\xc2\xe9\xa3\x31\x99\xc2\x7f\x4e\x44\xcf\x4d\xee\x3d\x08\xd7\x65\x59\xe7\xa0\x5b\x03\xe4\x1b\xe7\xa6\xa8\xba\xe7\x33\x42\x0d\x0b\x21\xed\x17\x3c\xd3\x2b\x52\x8b\xd8\xee\x59\xad\x03\x55\x90\x7c\x93\x5e\x6b\x7b\xdd\x25\xae\xb5\x7b\x40\xbf\x91\x06\x56\x1a\x4f\xdc\xb3\x98\xfd\xb1\x2e\xa5\x4a\x31\x7c\x09\x03\x00\x5d\xb1\x32\x50\x97\x0e\x59\xd9\x0a\x02\x9b\xa2\xe8\x09\x45\x33\x32\x70\x06\x90\x55\xe8\x1f\xb3\xce\xd1\xc1\xc6\x75\x02\xdd\x20\x18\xb8\x9c\x5a\x33\xff\x8d\xda\xaf\xbf\x7a\x5d\x76\x1e\xf2\x1a\xad\xf7\x3f\xd6\xaa\x92\x4e\xa3\x6c\xe5\xee\x03\x25\x04\x57\x2c\xe3\x32\x85\x4b\x11\xf4\x33\xa3\x76\x3c\xfd\x83\x79\x71\xa6\xb5\x89\x2d\x13\xaa\xe2\xb0\xf8\x66\x6f\xb5\x8b\x01\xe2\x8e\x69\x6b\xce\x01\x2d\x59\x90\x88\xbf\x7b\x5e\x60\x8f\x7f\xf1\xbc\xef\x98\x2d\x17\x94\xef\x9a\x37\x2d\x1e\x05\x18\x4e\x0b\x98\x41\x97\xdf\x60\x4d\x95\x52\x28\x48\xec\xa0\x60\x58\xbd\xa8\x14\xe8\x7a\x9b\x52\x82\x13\x7a\x5e\x2b\x99\x0b\x85\xea\xe3\xf1\xf3\x98\xf5\x9c\x8c\x1b\xf2\x1b\xeb\x86\x09\x23\x17\x73\xc1\xae\x8a\x6b\x51\xe6\xee\x08\xe8\xdb\xbe\xb9\x6c\x58\x55\x61\x52\x8a\xef\xee\x9d\xbe\xc0\xb0\x4e\xcf\xb2\xc5\x15\xcb\xa5\xf4\x5d\x41\xd9\x7d\x7d\x78\x23\xb2\x2b\xc9\x73\x4c\x57\x5a\xba\xfc\x3d\xde\x5c\x5d\xa1\x7e\xf5\x06\x7f\x6d\x5b\x0f\x35\x9b\x87\xec\x11\x07\x53\x2b\x53\x63\x97\xb4\xc6\xcd\x64\xae\x30\x54\xd3\x3d\x9f\xf1\x5e\x8f\xe2\x60\x7b\x1d\xb1\x34\xb5\x4f\x76\x0b\x69\x90\xe6\x90\x3c\xc7\x02\x07\x5e\x0a\x98\x9e\xa3\xbb\x70\xd4\x0f\xe0\x77\x17\xc3\x43\x76\x1d\xb3\x13\x7c\x9c\x70\x77\x1a\xf5\xb7\x07\xe3\x29\x3d\x15\x1f\x47\xfa\xff\x9f\xc6\x4f\xf6\x28\xdf\x78\xbd\x6e\x54\xd6\x28\xa1\x9f\x38\x36\x4f\x24\x8b\x4c\x6e\x94\xb8\xeb\x91\xbe\x58\xe8\xe3\x01\xed\x3f\xf9\xf7\x29\x66\xfb\xfe\xf3\xc5\x3f\xf1\xe3\xe1\xc5\xc5\x57\x06\x00\xb8\xbb\xfe\xef\xe4\xf8\xf8\xc5\x49\xbb\xfe\xef\x3b\xfe\xd7\x37\xf9\x19\xf2\x99\xf8\x33\xbb\x20\xc2\x9d\x06\x01\xb8\xde\x1a\x01\x10\x00\xd0\x87\x3e\x79\x7a\xf4\xe4\xb8\xc1\x29\xca\xa0\x9d\xa7\xa6\xa1\xbd\xe4\x5a\x94\xc0\x0b\x68\xc0\x32\x2b\xf2\x6c\x7c\x09\x37\xa8\x49\x33\x36\xc5\xfe\xc8\xcd\x17\x14\xfe\x98\xc0\x15\x66\xd6\xc6\x7b\x17\xa5\xe0\xeb\x79\x26\xa0\xa8\xee\xae\xb1\xb1\x03\x3d\xb8\x43\x53\xf9\x12\x16\x97\x39\xc8\xa0\x39\x57\xa6\x9d\xc0\x09\x10\xf2\x0a\xc6\xac\xa7\x4c\xd8\xd9\x14\xdd\x59\x08\xe3\x3a\xa0\xb6\x5e\xb8\x58\x43\x58\x53\xa5\x1f\xbf\xd1\xa6\x42\x10\xa9\x8f\xf7\x06\xd6\x80\x77\xa1\xa6\x6c\x4b\xb0\x9a\x99\x20\x18\xe6\x32\xa0\x3c\xd4\xdd\x35\xf8\xa1\x07\xc6\x53\xc4\x69\x1c\x1b\xbe\xf8\xa4\x95\xe3\xa5\xcc\xc4\x21\xcc\xa8\xf3\x11\x40\x1c\xa5\xd9\x3f\x17\x10\x90\x10\x29\xac\x73\xd3\x76\x55\xe8\x4f\xc5\x7b\xb3\xa2\x31\x4a\x65\x2a\xee\x24\x79\xf5\xa0\x8b\xc1\x0c\x2a\x4c\x28\x41\xaf\x69\xce\xc4\xcf\x1b\x80\x2f\x6d\xa7\xa1\x62\x39\x08\xb6\x00\x98\xa9\xc6\xb3\xb0\x15\x1c\xf2\x8f\xaf\x30\x33\x9c\x8c\x11\x48\x78\x71\x51\x59\xd7\xa3\x78\xaf\x67\xf0\xa4\x2c\xdd\xd5\x0d\x15\xb2\xed\xfd\xee\x77\x6c\x23\xaf\x62\x55\x6d\xd9\xef\x7e\xc7\xdc\xde\x06\xaa\xdc\xf3\x98\x7d\x8c\xd9\x88\xaf\xc5\xde\xef\x50\x71\x32\x90\xd6\xda\xe6\xf0\x49\x5f\xac\x45\x69\xb3\xe0\x1a\x61\xdf\xbd\xdf\x59\xab\xea\xae\xcd\x79\xea\x53\x1a\x68\x8d\xb7\x3f\xeb\x8d\xf6\x7e\xc7\x78\xb9\x58\x41\xfa\xb9\xcc\x29\x54\x55\x94\x5b\xb6\xe6\x8b\xb2\x50\x8f\xf5\x9a\xfc\xfc\x58\xef\xd8\xc7\xd9\x66\x93\x69\x79\xfe\x9a\x12\x9f\xf7\x7e\xe7\xb0\xfc\x1a\xf9\x9e\xe0\xf4\x6e\xf1\xd0\x80\x8f\xdc\xcf\x59\x8b\xf7\xde\x4a\xbd\x0b\x70\x37\xd9\xba\xd1\xdc\x2e\x73\x64\xb2\x28\x6c\x7e\x58\x93\xe1\x17\x27\x9b\x72\xea\xf5\x6a\xbd\xda\xfb\x8b\x3e\xa6\x17\x38\x99\x8f\x70\xe9\x8c\x87\xae\xf2\x4b\x26\xff\x42\x8b\xf3\x08\x16\x1f\xde\x72\x6b\xf4\x0e\x8a\x6a\x3b\x5e\x27\x6f\xce\x5f\xdc\xfa\x3d\x82\xbd\xaa\x04\x26\xde\xb8\x8d\x10\xc1\xbf\x99\xa1\x60\x61\x8e\x9e\x3f\x92\x04\x0b\x5e\x96\xa6\x64\x6b\x67\x41\x2c\x88\x0a\x58\x83\x06\x0e\xde\xcc\x97\x65\x57\xb0\x7c\xe8\xb7\xf2\x85\x8d\x3d\x29\xde\x8c\x98\x53\xd9\xd8\x5f\x1e\x59\xc3\x20\x4f\xe5\xb5\x4c\x6b\x9e\x51\x03\xfa\x0d\x38\x52\x06\xd1\x97\x2d\xeb\x12\x8e\x07\x3a\x3d\xb8\x04\xb4\xb4\xbc\x01\x9d\xa8\xa5\x40\x5e\xe0\xe0\xfd\x83\x19\x24\xf3\x16\x79\x03\xf0\xce\x57\xcc\x0b\x65\xbf\x69\x24\x20\x8d\x5c\x82\x2f\x49\xe4\xaa\x36\xa2\x8e\xbb\x76\x20\x1c\x48\xe6\x64\x98\xa1\xe4\x5c\x55\x75\x6e\x4f\x93\x49\xa9\xf2\x27\x29\x17\x26\x1f\x72\xb1\x12\x8b\x4f\xcd\x6d\x68\x32\xbe\x71\x8f\x06\x8c\x8b\xf0\xa6\xbe\x93\xe0\x3d\xcc\xae\x85\x29\x90\x79\xf0\x05\xf4\xef\x56\x25\x0f\xe6\xc3\x92\x1f\xa6\x85\x6d\xc9\xab\x3f\xea\x00\xa6\x87\x64\x88\x35\x49\xc5\xc8\xf0\x11\x7a\xf9\xc5\xbe\xf8\x94\xb9\xaa\x04\x0f\xee\x49\xbf\x4f\x26\x0b\x31\x95\xcb\x25\xe6\x5d\x18\x31\x67\x03\x77\x26\x11\x4b\xdf\x1b\xca\x79\x4c\x31\x8a\x03\x57\x3b\xdc\x0a\xeb\x22\x15\x19\x8c\xd1\x46\xf7\x6c\x27\xf4\xbe\x80\x7f\x35\xdb\x97\x36\x07\x72\x9b\x50\xf8\x3d\x4c\x90\xd6\xed\x06\xc5\x77\x57\x26\xa1\x5e\xae\x21\x93\x55\x9a\x40\x8e\x3f\x9c\x06\x4f\xaf\xe7\x54\xbd\xb8\x18\xc6\xf7\xde\xe6\x7b\xff\xdb\x3d\x3f\x7b\x33\x58\x81\x5e\x9e\xb2\xbe\xdb\x1b\x67\x10\x6c\xd8\x6c\xa1\xac\x2d\x88\x44\xe8\x07\xcf\xbd\x23\x72\xef\x07\xee\xfb\xbe\x01\x78\xd9\x73\x3d\x02\xeb\x1d\x14\x18\x17\x24\xd4\xcb\xe0\xcd\x4b\xb3\xbc\xc6\xa9\x52\xf3\x6d\x2b\x52\x46\x39\x14\x00\x08\xe0\xa6\xdf\xe5\x86\xdc\x94\x12\x6b\x23\xbb\xc4\xa7\xab\x58\xf1\x97\xe5\x2f\x90\x5f\xf3\xa8\x99\x55\xb3\x0d\x13\x1f\xa8\xb8\xc6\xd5\xf3\x3b\x78\x6e\x2f\xbf\xc1\x48\x19\x4a\x70\x80\x03\x13\x99\x8d\xe1\x43\x79\x93\x0a\xd8\x48\xbc\xc1\xe4\xc7\x7b\x72\x6f\x30\xe1\x99\x30\x8d\x4a\xa9\x3e\x79\x9e\xec\x9f\x6a\x6e\xdb\xa1\xea\x3a\x3f\xd8\xba\x71\x3b\x11\x34\x89\x6d\x51\xdb\xac\x57\x7f\x4a\xc0\x4f\x49\x79\x3d\x50\x39\xa9\x45\x00\x57\xaa\x5e\x0b\x12\x3d\x88\xe6\x09\x75\x04\xd6\x91\x8c\xb1\x79\xaa\x66\xdd\x70\x59\xa2\xff\xa8\x2c\x31\xbf\x32\xde\x1b\x78\x69\x29\x94\x0e\xee\x93\x7f\x36\xa2\x40\x7a\xf8\x57\x25\x09\x1d\xb7\xb4\xe8\xf4\xea\x5a\xde\xa8\xc1\x23\x24\xdd\xc5\x81\x79\x74\x0a\x74\x2b\x9b\x11\x4c\xa0\x46\xad\xed\xe8\xd2\x36\x2a\xa4\x39\x5d\xba\x84\x1c\x3f\x97\x45\x7f\x8a\xaa\xbd\x23\x43\x2f\x02\xbf\x07\xf7\x2d\xe6\xd2\x40\xac\x18\x32\xec\x5c\xf2\x89\x6a\x66\xd1\x70\x87\xdf\xe1\xaf\x82\x96\x30\x35\x25\x4c\x99\x0d\x42\xb9\xa7\xfe\x63\x07\xae\x47\xed\xcd\xd7\x4a\x87\x81\xff\x47\xc6\xec\x52\x68\x09\x04\xf3\x81\xf9\x5a\x15\xf8\x94\xf4\x1b\x42\x31\xa5\x8d\x46\x03\x00\xa0\x67\xc1\xa4\x03\xc8\x32\x65\x1b\x17\x43\xe1\xe4\xb8\xc4\xe0\xab\xcd\xca\x09\x87\x52\x15\x04\x5b\x4a\x81\x20\x17\x37\x37\x8c\xae\x87\x4e\x03\x07\xf5\xcb\xa0\x88\x98\xac\x10\xfd\xc5\xed\x2f\x48\xd0\x51\xf1\x9e\x43\x67\x1a\x8f\x02\x19\xd7\x84\x67\x2e\x96\xac\xce\x91\xa0\x37\x35\xfc\x5c\xca\x56\x34\xb6\x49\xb3\x3c\x10\x57\x2c\x03\xdc\xb4\x6f\xc5\xc6\x44\x34\xb0\x31\xb4\x76\xe3\x1f\x71\xb8\x1e\x0d\xfa\x6c\xe3\xfa\x58\x71\x43\x6c\x18\xb2\xbd\x9b\xc5\x6f\xb3\x4c\xc8\x65\xe3\x1f\x6e\x3c\xce\x9a\x20\x49\xa5\xa9\xcc\xdd\x3d\x08\xe4\x66\xa4\x2c\x49\xee\x95\xcf\xa0\x62\x29\x15\x26\x9c\x67\x99\x67\x1f\xed\x80\xaf\x8b\xf7\x48\xc1\xa0\x30\x24\x2a\x39\xa0\x41\x60\x1f\x95\x69\x00\x4c\x04\xfd\x8b\x22\x37\xb0\xbd\x5c\xe6\xff\xbf\xce\xce\x9a\x35\xf4\x63\x31\x0b\x64\x8c\x30\xeb\xda\x40\x39\x0e\x04\x80\xe3\x98\xa4\x53\x89\x08\xbe\xba\x03\xe1\x73\xa5\xb0\xbb\xc3\xdd\xe6\x77\x50\xf7\xff\x9e\xf2\x50\xcd\x4b\x26\xe9\x07\xac\x73\x48\x47\x6f\xdb\x1c\x4e\x95\x73\x55\x32\xcb\xa2\x9c\xcb\x94\xc9\x2a\x66\x53\x01\x2c\x6c\x02\xd5\x51\x93\x82\xbb\xdf\x0f\x6a\x58\x64\x43\x85\xde\x27\xe0\xea\x8f\x30\xf1\x60\x70\xda\xcf\xcd\x31\x09\x16\x2d\xfb\x4f\x58\x25\xe3\x91\x56\xcb\x2a\xf2\x4b\x79\xe0\x15\x63\xd7\xea\x95\xe3\x5b\x5b\x52\x96\x73\x48\x97\x91\x01\xf5\x77\x8a\x70\x45\x08\x5c\x17\x1c\x35\x83\xa0\xd7\xd6\x91\xb8\x55\xcd\xa0\x65\x1c\xbd\xea\x60\xfd\x28\x94\x55\x3c\x8d\xe7\x1d\xdb\x06\x60\x3c\x63\x67\x56\x2b\xb1\xf6\x73\x95\x31\x33\xbf\x56\x2e\x24\x60\xcf\x85\xd9\x2c\xf7\x9d\x6b\x6f\x3e\x71\x50\xf0\xed\xbf\x10\x35\xb5\x71\xe4\xe8\xd7\xf3\xab\x47\x4d\xd5\x1b\x30\x5a\x04\x78\x3c\x6c\xcd\x84\x03\x74\x07\x5d\x1d\xa7\xd0\x3f\xba\xaa\xe2\x79\xca\xcb\x94\x40\xa0\xa9\x03\x83\xf0\xa0\xd2\x2e\x87\xac\xd7\xbf\x40\x6e\x2e\x94\x62\x94\x15\xe3\x69\xaa\xf7\xd2\x23\xa6\x0a\xfc\x16\x66\xee\x1a\x6b\x0c\x9f\x22\xef\xc7\xae\xab\x96\x12\x9f\xac\x41\x44\x6d\x42\x29\x84\x3e\xe2\xf4\x77\xbb\xb0\x66\xb9\x29\x6f\xaa\xc9\x4b\xdb\xb4\x0c\x23\xdb\x37\xec\x0d\x6a\x44\xb8\x22\x40\xe7\xa7\xed\x3c\x7b\x43\x05\xcb\xb6\xb1\xb6\x25\x3d\x52\x2a\x92\xbc\x5a\x17\x71\xd5\xbe\xfe\xef\x4d\x74\xcc\xdf\x93\xde\xb2\xf2\xc5\xa7\xbc\xb8\xc9\x44\x7a\x25\x7c\xe5\xc1\x25\xe9\xab\x95\xdc\xb4\xe4\xaa\x71\x48\x74\x51\x16\xfa\x8d\x67\xaa\x68\xa2\x1a\x78\x16\x61\xa3\xf0\xcd\x52\x26\xfa\x4c\xbd\x8e\x44\xbf\x5e\x2e\xe5\x42\x62\x82\x9a\xcb\xb9\x31\x73\x49\xb9\x54\xa5\x75\x58\x05\x7d\x32\x49\x76\x36\xde\xbe\xd5\x87\xdb\xce\xd9\x5c\x30\xa3\x17\x11\x54\x3d\xcf\xed\x60\xa3\x7b\x8c\x58\x2c\xed\xb2\xce\x08\xe3\x3a\xc4\xfd\xb3\x65\x9c\x5d\x4e\x86\xc8\xa2\xaf\x64\xe5\x39\x0c\xb1\x03\x78\xe9\x50\x61\x90\x5f\xfa\x0e\x83\x21\xbf\x58\x97\xe9\x7c\x40\x9a\x3b\x64\x58\x98\x89\x34\x88\xe9\xde\x0c\x38\x67\x2b\x14\xce\xc1\x0e\xdf\x88\x72\xc5\x37\xaa\x59\xdb\x78\xb8\xe3\xb4\x85\x75\xd6\xc6\xd5\xa8\xfb\x06\xad\x59\x66\xf8\x22\x8f\xd0\xd2\x03\xd3\xc0\x5c\x49\x36\x43\xc6\x5d\x20\x24\x5d\x2b\x91\xe3\x01\x31\x28\x43\xc6\xf7\xc1\x33\x03\xe6\xa5\x77\x18\x1a\x8f\xae\xa6\x3a\x7c\xce\x1f\x24\x26\x22\x3a\x09\x48\xe2\xd5\xc5\x3e\xcf\x5c\x8f\xec\xe7\xd9\x5f\x62\x99\xab\x47\x5a\xdf\x54\x15\xcf\x32\x62\xb2\xd2\x4f\x1e\xbe\x0a\xae\x6a\xbd\xac\x44\xe4\xe4\x2a\x65\x51\x65\x9a\x0b\xcb\xe9\xbc\xb5\x2a\x44\xf3\xfa\xa3\x1b\x04\xb8\x2e\x30\x87\x93\x1e\x72\xa8\xa4\xee\x78\xde\xd5\xdf\x65\xfa\x88\x1d\xe0\xb4\x2c\x8b\x9c\x40\xb6\xe8\x5a\xec\xea\xb8\x7f\xa1\xe3\x0a\xda\xfe\x7b\x04\xab\xf9\x95\xc9\x0c\xd0\x37\x07\x9a\x7c\x70\x93\x83\x0b\x08\x33\x7f\x28\xf9\x2f\xcb\x82\x22\xb6\x9c\x10\x3f\x10\x52\x17\xec\x20\x5e\x55\x62\xbd\x21\x20\x0a\xc4\xde\xa9\xf3\xc6\x3b\x5e\x3e\x73\x70\x5a\x1d\x07\x6b\xd8\xe9\x50\x3f\xc4\x39\x84\xe2\xf9\xe0\x5a\xbb\x77\xf6\x16\xcb\xab\x47\xec\x60\x51\xe4\x4b\x79\x65\x60\x70\xba\x66\x8d\x64\x86\xc1\x49\xf3\x3d\xc3\x6e\x46\x04\x57\xb0\xe0\x5e\x5b\xe6\x26\xc3\x0b\x0c\x8e\x52\x43\x7f\xcd\xd9\x62\x79\x75\x55\xcb\x54\xc4\x95\xf8\xd9\xec\x82\x5d\xf1\x0a\x13\x9c\x50\xe8\x1e\x90\x15\x81\x3c\x29\x54\x1d\x0a\x8f\xc4\xdc\x6c\x24\xd4\x43\x68\x3a\x66\x5e\x9d\x8e\x5f\xdf\x4f\x73\xec\x9f\x6d\x83\x96\x48\xf9\xd8\x54\x30\x88\x4b\x41\x29\xfb\x68\xf6\xd7\x9b\x94\xa0\x9b\x08\xff\x6f\x2d\xaa\x55\x91\x46\x64\x2d\x81\x2f\x92\x24\xb3\xd4\x07\x66\x51\x68\x5d\xc4\xe5\xff\x98\x9a\x56\x5e\x09\x55\x85\x17\x01\xaf\xba\x1c\x79\xf1\xaf\xf5\xe2\x38\xeb\x68\x34\x9e\x25\xd3\x3d\x72\xed\x80\x82\x29\xc5\xb5\x53\x4d\x94\x30\x3a\x1d\x14\x1f\xa0\x0f\x4c\x0b\x6c\x90\x61\xda\x70\x2f\xd6\xf8\x77\x4a\x30\x6b\xe2\xe1\x21\x9f\x3e\x20\x00\xc1\xde\xbb\x59\xf1\x4a\xef\x72\x56\x89\xc5\x2a\x87\xe1\x1b\x0f\x2f\xbd\x63\xe2\x47\x50\x08\x96\x29\xa7\x03\x58\x24\x67\x3c\x38\x94\x98\xaf\x57\xec\xaa\x34\xfe\x90\x52\x78\x95\x05\x8d\x9b\xc9\xf3\x72\x16\x15\xf8\xc9\x89\x91\x85\x2f\x56\x30\x68\xb8\x28\xae\x0a\x9e\x99\x2f\xf3\x74\x25\x3c\x3f\x7c\x73\x32\x40\xae\x97\x82\x92\x6f\x6d\x78\xe0\x4b\xb6\xb3\xd6\x76\x54\x7d\x75\x25\x14\xa5\x6a\xbf\x21\xd9\x69\x6d\xde\x32\xf0\x1b\x89\x9f\x51\x77\xb1\xff\xa6\x27\x0f\x9d\xa2\x8a\x98\x8e\x33\xf9\x49\x98\x9b\xc7\xba\x1b\x6d\x40\x13\x90\x41\x84\x43\x85\x6b\xea\xbb\x79\x91\x1f\x59\xb5\x33\x30\xad\x02\x8e\x12\x1c\x0a\x56\x03\x39\x30\x3c\x27\xd2\x1c\xd4\x5b\xea\x33\xdb\x88\x35\x08\x52\x34\xdd\x03\x3a\x9d\x90\xf3\xc8\xdd\x5a\xed\xb3\x4a\xa6\xab\x99\xed\x75\x91\x7e\x81\xf0\xa8\xb8\xcc\x14\xd9\x7d\x1c\xb2\x59\x4d\xd4\x03\xef\xa6\x60\x7d\xf1\x71\x83\x11\x12\xb3\x84\x7c\x17\x0d\x7d\x20\x08\x23\xba\x2b\x9f\xf1\xf2\x0a\xbb\x28\xf3\xb0\x97\xa0\x11\x55\x5a\xd5\xa1\x18\x12\x94\x69\xae\x0c\x16\x25\xec\x28\xb2\xd0\x78\x4b\x83\x6e\xaa\x3e\x8d\x00\xee\xde\xdd\x46\xe1\x3d\x82\x03\xa6\xb6\xf9\x0e\xd9\x0b\x3c\x28\xfb\xf0\x02\x13\xa8\xb0\xa8\x7a\x23\x4a\x25\x48\x61\xa3\x3d\xd1\x80\x59\x68\xf1\x64\x05\x0a\x0b\x69\x0a\x46\x13\xa0\x50\x87\xc1\x2e\xd2\x93\x51\x0a\x57\x8e\x42\x26\xe0\x7d\xbe\x98\xbb\xdd\x18\x20\x9f\x32\xa9\x2a\x65\x3d\x19\x16\x0b\xc7\x5d\xa1\xb3\x30\xd8\x0a\x07\xc0\x53\xe7\x5a\x94\x44\xcd\x51\xd9\x89\x32\x2b\xec\xf9\x94\x7c\xf5\xc8\x84\x34\x5a\xa8\xf7\xa4\x8a\xce\x1a\x71\xc9\xf6\xf2\x52\x14\x85\x7c\x0e\xb9\xef\x71\x2f\x96\xec\xf7\x7e\xc7\x7e\x6f\xb9\x8b\x6d\xce\xc1\x8e\x8f\xfc\xde\x9f\xdf\xdf\x5b\x3c\x1b\x60\x2d\x36\xd0\x76\xd6\x07\xa4\xaf\x78\x20\x7c\x3a\x28\xc5\xa1\x1f\x1d\x83\xbb\xd0\x84\xc2\x22\xcf\x07\xb7\x33\x14\xb6\x16\xc2\xe8\x5c\xbb\x23\x61\xaf\x29\x96\x8f\x61\x30\x2f\xdd\xd9\xc5\xd0\x56\x82\x13\x56\x71\x18\x19\x6b\x07\xb7\xdc\x5b\x61\x70\x0f\xcb\x67\x05\x8a\xfc\xc6\x2d\xf0\x6f\x04\xa1\xfe\xbf\xf4\x4f\xfc\x78\xfc\x76\xf6\x95\x09\x20\xef\xce\xff\x3a\x3e\x39\x7e\xf1\xb4\xc5\xff\x72\xf2\xec\x7b\xfe\xd7\xb7\xf8\x01\xf0\xea\x8d\xc8\xd9\xdb\xb2\xa8\x37\x6c\xa6\x55\xe9\x69\x2d\x2b\x97\x8a\x1a\xa4\x54\x49\x0f\x24\xc3\xcf\xed\xc0\x20\x3f\xc4\x1a\x9b\x62\xc7\xcf\x72\xe0\xec\x82\xb2\x8f\xc8\x99\x06\x19\x5f\x29\x95\xb3\x59\x27\x4c\x2b\x38\x69\x74\x59\x85\xee\x6f\x25\xd6\xf3\xcc\x04\xef\x78\x59\x61\x6e\x3f\x28\x4f\x45\xc6\x8a\x6b\x52\x82\x3c\xc0\x01\xab\x18\xe2\xe7\x51\x49\xb6\xb9\x45\xc6\x57\xa2\x1a\x8f\xb1\xca\x47\xf6\xac\x89\x8c\xba\xe1\x8c\x32\x23\x82\x8b\x52\x5f\x6a\x47\x45\x79\x04\x4e\x60\x87\x4c\x42\xfc\x7f\x11\xd2\xfa\x55\x2d\xbc\x50\x0f\xd2\x24\xb0\x04\xe2\x3d\xbd\x20\xe4\x29\xf6\x00\x67\x11\x61\x70\x23\xca\x60\x8c\x08\xd7\x00\x4b\x64\xeb\x8a\x49\x27\x55\x47\xe8\x5e\xa1\xe2\x6a\x15\xef\x9d\x15\x25\x9b\xd7\x5b\x51\xaa\x57\x8c\xa7\xe2\xa7\x5a\x2f\x1d\xd9\x1c\xf0\x76\x45\x5f\xce\x04\x4f\x61\x75\xa1\xa8\x04\xd4\x0c\x6d\x3a\x98\x6b\x5a\x91\xdd\xbe\xb1\x60\x31\x18\x95\xbb\x16\xaa\x42\x7d\x50\x4f\x0c\x86\x2f\xa9\xb2\x38\xa0\xf5\x41\x7c\x69\xec\x4f\x13\x2a\x02\x3a\xd7\xd5\xa7\x62\xa9\x2d\xf7\x0a\x68\x41\x71\xd8\x32\x4d\x33\x01\xef\x5e\x69\x5b\x1b\xa9\x11\xeb\x85\x4d\xda\x21\x8a\x45\x6c\x97\x30\x7f\x02\x13\x69\x5d\x67\x95\x3c\x32\xad\xfa\x3d\x76\xfc\x90\xd8\xc9\x1a\x88\x0b\x74\xd7\x06\xf9\x51\x2a\x36\xd5\xca\xf6\x4b\xe6\xda\xd2\x57\xc2\xac\xbd\x28\x99\xe2\x95\x54\x4b\xee\x78\x72\x3e\x09\xb1\x51\xad\x75\xa3\x02\x70\x9a\x50\x6d\xdd\xeb\x2b\x35\x66\xbd\x8b\x41\x30\x03\x52\xb1\x95\xbc\x5a\x65\x50\x08\xa9\xea\xd2\xc2\xe0\xd8\x6e\x41\xf5\x1a\x54\x31\x83\x99\x6f\x38\x36\xc9\x37\xa9\xea\xb9\xde\x13\x95\xb4\x9e\x74\x78\x34\xde\xeb\x21\x63\x4e\xc4\x94\xcc\x11\x5b\x57\xa1\xea\x38\x17\xf9\x62\xb5\xe6\xe5\x27\xfa\xa2\x20\xbb\xc6\xf6\x29\x62\x37\x82\x2d\x85\xc8\x6c\x5d\x06\x1a\x96\xfa\x2c\x69\x71\x52\x15\x45\x06\xd1\x42\xbd\x2f\xd6\x60\x9a\x41\xad\xd1\xc0\xc3\x3f\xdd\x10\x2f\x6c\x47\x13\xa0\x8b\x51\xdc\xcc\x9f\x89\x75\x91\x7a\xb9\xa2\xf0\x25\x73\x6c\x43\xa6\xa5\x52\x2c\xe4\x46\x1a\x13\xac\xd3\xb5\x8e\xa4\xee\xe6\xd0\x17\xac\xac\xf3\xd0\x59\x0d\xcd\xc3\x17\xa3\x30\x37\x95\x74\x1a\x0f\x1e\xa7\xe3\x1d\xc8\xde\x74\xcc\xb7\x64\x51\x2f\x25\xc0\x69\xcc\x6b\xf0\x50\x16\xb9\x68\xc6\x2f\x14\xbc\x8d\xed\x00\x24\x86\x96\x1f\x02\xd2\xcc\x44\xc5\x6a\x05\x40\xb8\x4c\x15\x7a\xfe\x17\x3c\xd7\x6b\x40\xac\x4e\x73\xbe\xf8\xa4\xa7\xb1\x08\x7a\x14\x39\x76\x80\x92\x4b\x42\x79\x0b\xdc\x08\x4c\x2a\x55\xfb\xfe\x56\xa8\xcb\xda\x94\xb0\x5b\xe6\x45\x2a\x85\x0a\xca\x5d\x51\x00\x8e\xa7\x83\x3f\x43\x0d\xae\xb6\x42\x85\x3a\x8c\xf7\x3c\x36\x86\x57\x7b\xfb\x24\x21\x9b\x60\x64\x8b\x02\x80\x4e\x48\x62\x18\x45\xdc\xb9\xe7\x28\x72\xd1\x8e\xaf\x80\x10\xb6\x95\xcc\xca\xba\x7c\xba\x1a\x34\x9e\xb7\x6a\x55\x16\xf5\xd5\x0a\x8c\x85\xba\xe1\xf3\x8d\xf7\xf6\xa7\xc6\x76\xa7\x6c\x67\xbf\xaf\x94\xf2\x68\xe5\x3c\xe4\xc1\x62\xc5\x49\x15\x62\x1e\x46\xcc\x07\xca\xb0\x3b\x6d\x47\xc9\xfb\x8d\x54\x2b\xe1\x81\x9a\x85\xc3\x8c\xf7\xf6\x9b\xff\xb4\x0f\xc9\x29\xab\x02\x1c\x41\xb2\x91\xb1\xe1\xac\x1f\x2c\xcc\xde\x52\xa5\x9f\x31\xd4\x69\x77\xc7\x7b\x00\x02\xaf\x5f\xdf\x16\x75\x44\xe9\xc3\x8f\x10\x77\x2c\x47\x98\x74\xe0\xee\x5f\x60\x5e\x14\xf3\xd1\x64\xf1\xae\x94\xca\xcc\x45\xbc\xb7\x3f\x71\x37\x97\x79\x63\x29\x04\xf5\x94\x7c\x56\x7a\xb3\xeb\xfd\xf9\xd7\x5a\x55\xe0\x64\xb4\xee\x06\x49\x99\x3e\xa9\xe4\x20\xf9\x22\x96\xd6\x4e\xee\x22\x68\x86\x3e\x71\x12\x63\xde\xc4\x45\x20\xf3\xeb\x22\xbb\x16\x84\xf8\xa0\x0a\x56\xe4\x31\x3b\xf8\x08\x0e\x30\x2a\x1d\x9d\x0b\x97\x3e\x53\x15\xf6\xcb\xd2\xd6\x81\xb5\x77\x95\xef\xaa\x36\xb5\x60\x35\x49\x1d\x43\x74\xa3\xcd\x5e\x04\xf2\x80\xcc\x39\x5e\x7e\x12\x15\x25\x39\xa0\x9c\xe5\x14\xe7\x16\x22\x3e\xdc\xdb\x3f\xc3\x90\x4c\xcf\xf8\x77\xf6\xfd\xfc\x85\xbc\x00\x30\x10\xa9\x68\x9c\xa9\x5d\x2a\x59\x09\x2d\xbb\x95\xc8\x96\x5a\xda\xe0\xbe\x45\x74\x6a\xd4\x9a\x96\x02\x22\xaf\x38\x0b\x7a\x03\xac\x78\x9e\x66\x46\x93\x91\xe0\x32\x1e\x54\x78\xd2\xbd\x2f\x86\x82\xd0\x7e\x49\x37\xea\x27\x31\xeb\x59\x72\x9e\x24\xb0\x57\x3d\x75\x0e\xa2\x13\xb6\x30\x5a\x56\x86\x80\xc5\x64\x1d\x52\x60\x3c\x45\x9f\x27\xbf\xe1\xdb\xee\xfc\x7e\x3f\xc7\xc8\x52\x52\x34\x8f\xa1\x95\xcd\xe6\xf0\xb9\x02\x57\xeb\xd9\x8a\x1a\xd9\x27\xe0\xac\xa4\x5d\x24\x0c\x1a\x43\x20\x98\xdb\xf4\x78\x20\x17\x95\x2a\x16\x12\x84\x85\x83\x48\x52\x06\x97\xdf\xa2\xa1\x80\x0b\x5b\xcb\xec\xa5\xfc\x19\x24\xb2\xe7\x6a\x84\x7f\x42\xc8\x12\xa4\xb2\x09\xbc\xba\xcd\x40\xbb\xc9\x61\x3c\x2d\xa0\x30\xbc\x28\xdd\x6f\x5a\xc2\x80\xf5\x9c\xe6\xec\x89\x15\x12\x4d\x7a\x92\xb1\x86\x0f\xfd\x63\x54\xe3\x2c\x31\x85\xa9\x6b\x62\x0d\xba\xb6\x19\x96\xc7\x95\x80\x81\x00\x84\xd5\xb0\x08\x86\xde\x12\x50\x88\x1a\xc0\x3c\xda\x33\x2f\x73\x25\xca\x2a\x70\x19\xb9\xbc\x0d\x84\xaf\xf6\xa2\xc8\x16\x4c\x76\x55\xdc\x10\x0b\x88\xc8\x51\x5e\xd0\x53\xd6\x97\x1f\x19\x2d\xb3\xb9\xd4\x85\x83\x58\xa8\x5a\x78\xc1\x94\xc1\x01\x8c\x17\xbe\x8b\xd6\x51\xfb\x51\xd4\x49\xa8\x0a\x51\xa7\x54\xe1\x25\x3e\x90\xd3\x3b\x44\xaf\xbc\xbf\x11\x03\xc6\x86\x00\x10\xfa\x14\xce\x85\xed\x7a\x30\x10\xc6\x99\x12\x1b\x0e\xf1\x96\x35\xcf\x01\xf4\x0b\x8a\x33\xf4\x1d\xcb\x01\x1a\xb8\xb3\xd7\xc1\xf7\x8c\x1e\x87\x79\x12\xc6\x26\x53\x30\xa9\xb2\x22\xe7\x96\x72\xbb\xab\x73\x33\x3c\x73\x9b\xa1\x61\xe0\x98\x34\xb4\xae\x9d\xe0\xf3\x22\x82\x5a\xe0\x18\xb6\x01\x57\xfd\x4b\xd7\xcb\xd1\x7c\x7f\xc1\x92\x99\x1b\x55\x52\x4a\xa5\xda\x14\xc0\x1c\xd2\x16\x27\x77\xac\x98\x67\x0a\x3e\xf0\xb3\xc1\x63\x84\x73\x09\x58\x2f\x8d\x85\x30\xcd\x9a\x54\x6d\xe2\xe3\xf4\x96\x5b\xb1\x03\x3d\x79\x3f\xd5\xf2\x9a\x67\x22\xaf\x0e\x9b\x65\x2d\x12\x00\x0b\x5c\x1e\x3e\x55\xfe\x16\xec\x4a\x54\xbb\x97\xf4\x79\xec\x01\x57\x11\xfe\x54\xd9\x79\x5f\x7b\xf8\x67\xcd\xbc\x21\xef\xb6\x6f\xb5\x96\x6f\xe1\x65\x3c\xaf\x80\x8c\xb5\x24\x03\xa9\x28\xab\xdd\xaf\xc3\x91\x6a\x00\x62\x35\x76\x16\x5c\x7e\x5e\x6c\x77\xdb\xb5\x35\x1b\x42\xe9\xea\xaa\x14\x57\x36\x8d\x12\x25\xf0\x01\x66\x3f\x66\x3e\xce\xd9\xa1\xdb\xd1\x5e\xce\x1f\xc7\x9b\x7d\xd7\x2b\x6d\xf6\x2e\x60\xe9\xef\xda\xde\x10\xe9\x4c\xaf\x45\x59\x49\xd5\xe8\xa6\x61\x2d\x42\x28\xbb\xa5\xcd\xb8\x37\xe8\xa2\x33\x80\x6b\x28\xe5\x86\x8c\xea\x4c\xce\x4b\x5e\x9a\x4c\x2d\x32\xf1\x80\x7e\x40\xe6\x9b\x1a\x41\xc6\x4a\x66\x51\x5b\xb8\x62\x45\x5d\xe9\x5f\xd8\xb3\xbe\xf3\xf0\x9a\x8e\x06\xb0\x2b\x4b\xe0\x5b\xb1\x77\xbf\xa7\x53\x86\x6f\xa3\xb6\x34\x17\x00\x3a\x4b\xdc\xb5\xa0\xea\xb9\x2c\x04\xcc\x24\x33\x08\x92\x73\xe0\x5a\x4d\xbd\x29\x35\x01\x1c\x83\x4e\x63\x56\x2f\xf5\x30\xcb\xac\x9a\x09\xd8\x98\xd3\x7a\x5e\x16\x5a\x23\xf3\xa7\x82\x12\x70\x71\xb2\xf2\x4f\xe8\x9e\x28\xc2\xa1\xe2\xd5\x48\x6a\xa1\x77\x31\xba\x9c\xb1\xc6\xb7\xfe\x80\x2b\x01\x57\xc7\x0e\xf5\xdc\x4f\xe4\x30\xe8\x83\x22\x4f\x8b\x52\x09\x5a\x12\xc0\x11\x32\xfe\x96\xe6\xe5\x2f\x95\xdb\x51\x46\xa7\xb1\x25\x3b\x9b\x52\x16\x25\xe4\x74\x57\x22\xf7\xd0\x75\x0d\xc0\x1d\x90\xbc\x5f\xf4\xfa\x3f\xf6\xde\x76\xd2\xca\x02\x77\xab\x61\x96\xed\x8d\x3e\x76\xf0\xc8\x7a\x2c\xb1\x1e\xa5\xac\xe3\xa3\x05\x4e\xd9\xde\x6c\x30\x1e\x45\xc0\x7c\xda\x7e\xcd\x27\x97\x35\x5c\xf2\xfa\xbb\xf7\xf1\xcb\xe2\xd4\x26\x79\xfa\x3d\x00\xf0\xaf\xf0\x13\x3f\xbe\xd8\x56\xab\x22\x3f\x3a\xf9\x7a\x15\xe0\xf7\xd4\x7f\x9f\x1c\x3f\x6b\xf2\xbf\x9e\x3c\x3f\xfe\xce\xff\xfa\x4d\x7e\x2e\x3e\xce\xde\x8d\x47\x8e\x06\xf9\x6c\x7c\x39\x3a\x85\x83\xcf\x86\x83\x7e\x32\x9a\x26\xec\x7d\x32\x99\xea\xbf\x9f\x90\xa5\x87\xf0\x25\xf4\xcb\xde\xdb\x49\x02\xdc\xd0\x90\xc2\xe7\x43\x49\xc1\xb6\x72\xc8\x16\x67\x45\x9d\xa7\x68\xd7\x1f\xec\x5f\x4c\xcf\xf6\x0f\x5d\x32\xb9\x57\xc6\x58\x94\x6c\xec\x53\xc3\x1f\xec\x1b\x7c\x90\xfd\x43\x03\x61\x46\xde\x5b\x67\xb3\xd4\xca\x7a\x26\xac\x54\x3d\xd8\xc7\x1e\xec\x1f\x82\xa1\x84\xb6\x66\x51\xb2\xb9\xcc\xe1\x46\x05\x27\x6f\x9e\x42\x69\x80\x6f\xfa\xf9\x59\x56\x96\x94\x2d\xc4\x90\xe9\x84\xf5\x6b\x00\xd0\xb0\x9e\x01\xd8\x8a\xd8\xc5\xf4\xac\x41\xce\x66\xd1\xc3\xb8\xd6\x22\x3d\x1a\xb6\x90\x9b\xc9\xb1\xb7\xb9\x2c\xef\xc2\x27\xaf\xe7\x39\xcf\xb6\x7f\x13\x11\x68\xa5\x91\x25\x0d\xa3\x22\x64\x43\x3c\xe6\x38\xc4\x76\x91\xd5\x87\xec\xf7\xcd\xc9\xb5\x8b\xc9\xb3\x22\x37\xac\xec\xa0\x2d\xba\x66\xc8\x9b\x1a\x79\x66\xce\xca\xa1\xbf\xf2\x4a\x4f\xc2\xa3\x8e\xd9\x81\x8f\xe1\xef\xc8\x4e\xf4\x23\xf9\x11\x93\xb1\x88\x81\xdb\xc0\x5c\xbf\x07\x8b\x43\xa8\xca\x8e\xf4\x7f\x4f\xe0\xbf\x4f\xe1\xbf\xcf\xe0\xbf\xcf\xe1\xbf\x3f\xdc\xb1\xfd\x5e\x03\x2a\xd5\x04\xbd\x63\x13\x72\xca\xee\x83\xab\xbb\x14\x2e\x93\xe2\xc1\x43\x36\x93\x0a\xba\x48\x00\x98\xf7\x34\x36\x2c\x63\x98\xcf\x68\x57\x9d\xde\xd0\xca\x60\x63\x25\x6c\x76\x81\xc9\x86\xc5\x4f\x2f\x8a\x72\x53\x94\x90\x7d\x44\xfd\x22\x7d\x1d\x54\x18\xc3\xd1\x86\x16\xb4\xe1\xfc\x02\x47\x0c\x86\xc1\xc2\x4f\xb8\x74\x23\xad\x3e\xea\x97\x51\x11\x36\xba\xac\x6e\x4d\xe6\x94\x7f\x6b\xfb\x4c\x1b\x18\xca\xce\xb0\xda\x81\x00\x70\x69\x62\x10\xec\x14\xda\x67\xf3\x52\x8a\x25\x53\xf5\x1a\x82\x5f\x41\xf6\xb8\x62\x6b\x8e\x20\x88\x38\x10\x63\x7b\xea\x33\x22\x95\x61\x6a\x34\x93\xef\xf7\xd4\x61\xff\x21\xf4\x37\xe9\x3a\xe0\x45\xc4\xf7\xcf\x7b\x3f\x26\x53\x36\x1a\xb3\x49\xa2\xf5\x9d\x64\x84\x1a\x0c\xe8\x3d\xbe\xbe\xd3\x56\x87\x62\xf6\xe6\x23\xfb\xd0\x03\xfa\xfd\xe4\xcf\xbd\xf3\x8b\x61\x12\x85\xfc\xfa\xa4\x0b\x05\x9f\xd1\xea\xce\xe9\x60\xda\x1f\xf6\x06\xe7\x53\x50\xb4\xc2\x0f\x7b\xdf\xfd\xd8\xc1\xc5\xaf\x7f\x1d\x68\x4b\xa3\x8f\x1d\xfa\x12\x12\xd3\xf7\x66\x8e\x9d\xfe\x8c\x91\xd0\xfe\x30\x18\x0e\xa1\x87\x86\xa3\x1f\x9a\x98\xbd\x1b\x4c\x4e\xa1\xa1\x8f\x0c\x48\xf9\xa7\xc6\x18\xd4\x9d\x47\xd2\x7e\xfd\x92\xa3\xdf\x9f\x8d\x8d\x38\x4f\x88\xb8\x9f\xf8\xef\x2f\xa7\xc0\xe5\x6f\x3f\x68\x7a\x39\x18\xf5\x07\xa7\x7a\x94\xc3\x88\x4d\x2f\x92\xfe\x40\xff\x61\x3c\x61\xfd\xf1\x68\x9a\xfc\xe9\x32\x19\xcd\x06\xbd\xa1\xcf\xe6\x3f\x1c\x4f\xa7\xac\x37\x65\x3d\x36\x49\xa6\x97\x43\xe0\xe4\x3f\x1f\x9f\x0e\xce\x3e\x82\xd6\xe9\xaa\xd0\xf4\xdf\x7c\x3e\x7f\x76\x09\x64\xfe\xf8\xfd\xc8\xf4\xee\x34\x99\x0c\xde\xf7\x66\x83\xf7\x89\x9e\x95\x49\x32\x3e\x8b\x58\xf2\x3e\x19\xb1\xc1\x19\xeb\x9d\xbe\x1f\x4c\x93\x53\xfd\x05\x3d\x63\x17\xe3\xe9\xd4\xa8\xa7\xf4\xac\x33\xb6\xba\xc4\x35\xfa\x90\x43\xb3\xc8\x81\x46\x22\x2e\xa5\x83\x04\x27\x78\xca\xfb\x60\x64\x5f\xc4\xdd\x0c\x64\xc1\x87\x2d\x0a\x57\xaa\xff\x01\x2b\xd3\x21\x7a\x81\x20\xb1\x02\xb3\xca\x4d\x2d\x05\xbf\x12\xf9\x42\x8b\x74\x5e\x56\xb9\x80\x12\x0b\x08\x3f\xfc\xb5\x90\x79\xc5\xb4\xbc\xa9\x21\x78\x47\x88\x6b\xd3\x33\xe8\x97\xcf\xb8\xd5\xd9\x89\x7b\xa9\x3d\x74\x4b\x1e\x75\x96\x21\xd2\x42\x63\x09\x62\xe0\xf6\xb7\x2e\xbb\xf8\x2e\xcb\xc8\x47\xae\x06\x58\x78\x83\x77\x47\x22\xce\x55\x55\x6e\x8d\x71\xf6\x66\x6b\x9c\x17\x58\x27\xcf\x81\x39\x36\x2c\x3b\x47\x9d\x00\x05\x49\xe4\x5d\xb8\x56\x7e\xcd\x05\x9b\xeb\x4b\xc1\xc4\x99\xbe\xec\x56\x8f\xd9\x9b\x64\x7c\x91\x8c\xe2\xfe\xf8\xbc\x43\x19\xd2\x27\x85\x0e\xcd\x49\xfc\x64\x0f\x9f\x35\xff\x02\x7f\x9e\x8e\x2f\x27\xfd\xa4\xe3\x55\xa3\x6e\x1d\x3f\x58\xdd\x7a\x23\xc6\x1b\x91\xc7\x8b\x62\xcd\x0e\xf6\xf1\x2f\x5a\xbb\x5a\xf1\x6b\x54\x95\x0c\xfe\x19\xaf\xd8\xf1\x0f\x4f\xd8\x94\x97\xbc\x2a\xae\x38\xeb\x5d\x8b\xbc\x16\x11\x9b\xf2\xbc\xe2\xac\x9f\xf1\x92\x47\xac\xdf\x63\x2f\x9f\x3f\x79\x7e\xfc\x75\xb5\xb3\x5f\xac\x92\xb1\x83\xfd\xca\xe3\x22\xde\x3f\xfc\x25\x3a\x1a\xce\x91\xb9\x65\x3a\x34\x36\x7a\xe0\x2e\xa5\xed\xe8\x5f\x5f\x6b\xf3\x27\xea\x57\xe9\x6e\x15\x40\x01\x76\xcd\x19\xe0\x0b\xfa\xe9\xa7\xc2\x2b\xb2\xf9\x95\xba\x13\x7d\xd1\x69\x05\xe1\x78\x1e\xae\x1b\xd0\xe9\xfb\x06\xea\x41\xf3\x4b\xff\x34\x0d\x41\xff\xd1\xda\x74\x5f\xa4\x27\x3c\xb3\xf3\xf5\xcb\x54\x85\xe0\xcb\xbf\xa9\xc2\x00\xaa\x40\xe4\xf4\x06\xfd\x9c\xaf\x39\x04\x9f\xfe\x2d\x75\x85\xe7\xdf\x54\x57\xd8\xad\x99\x74\xc2\x74\x82\xc0\xf4\x68\xf2\xf5\x59\xcb\x32\x20\x62\x80\x12\x87\x36\x9a\xe8\xb4\x22\x46\xc6\x3e\xcf\xe4\xb2\x28\x73\xc9\x23\xc4\x45\x4d\x4d\x8e\x0d\x04\xbb\x8a\x25\xf2\x26\x5b\xda\x81\x7f\xb6\x12\x43\x02\xe1\xb7\xd1\x63\xa8\xb1\x5d\xaa\x8c\xfa\xea\xba\x0c\xeb\x21\xe3\x8e\x49\x9c\xc7\xa4\xfc\xfd\x40\xce\xee\xb3\xac\xb8\x2a\x94\x27\xec\x78\xc5\x56\x55\xb5\x79\xf5\xf8\xf1\xcd\xcd\x4d\xbc\x81\xa7\x32\x3e\x57\xfa\xf6\x7f\x0c\x0f\xc7\xab\x6a\x9d\x05\x80\x6e\x01\x6e\x69\xb5\x12\xde\x6c\x34\xd8\x98\x79\xc5\x6e\xc4\x1c\x62\x52\x46\x6f\x7d\xb8\xae\x55\x79\x88\x5d\x5f\x45\xe3\xea\x8f\x26\x83\x7b\x94\x27\x48\x4e\xa2\x3b\xea\x38\xfe\x61\x7e\x7c\xa8\x65\xf8\x78\x32\xeb\x8d\x66\xaf\xd8\xc5\x30\xe9\x4d\x13\x36\x49\x7a\xa7\x70\xe0\xcf\xc6\xc3\xe1\xf8\x83\x16\x1d\xae\x85\x7e\x6f\x92\x9c\x5d\x0e\x87\x1f\xe3\xbd\x37\x1f\x59\x7f\x38\xe8\xff\x08\xb2\x66\xc4\xf6\x7b\xfd\x7e\x72\x31\xdb\x67\x1f\xb4\x6c\x60\x83\xd1\xe9\xa0\xdf\x9b\x25\xa7\xec\x4d\x32\x1c\x7f\x00\x81\xa3\xdf\x18\x5f\xa0\x51\x33\x18\x4d\x67\xbd\xe1\x90\x04\x55\xb7\x45\xa3\xfb\x18\xe9\xfd\xcd\xd9\xb1\x27\xba\x3e\x8e\x2f\x99\x16\x9f\xa7\xba\x4f\xa7\x5a\xe8\xbe\xeb\xbd\xa7\x61\xc2\x5f\x75\xe7\x67\xc9\x04\xee\x94\x53\x2d\x45\x4f\x07\x74\x95\x9d\x61\x74\xa0\x35\x33\xf1\x17\x39\xef\xfa\xe4\x6f\x30\xb5\x56\x23\x4e\xa5\x1d\x13\xa1\x04\x2f\x17\x2b\x36\xc8\x65\x25\x31\xff\x6a\x87\xa6\xf9\x87\x97\xcf\xd9\x45\x29\x54\x55\xe4\xec\xc3\x4a\x56\x82\x9d\x96\xa0\x2d\x4d\xe0\xdf\x22\xf6\xbe\xc7\x4e\x9e\x1c\xbf\x3c\x66\x07\xfb\x7a\x65\x7f\x7b\x87\xa0\xdb\x07\x76\x8e\x7f\xbd\x02\x1a\x21\x1f\x21\xe4\xe1\x41\xe9\x2e\xa4\x72\xd9\xb3\x18\x17\xe5\x15\x1b\x68\x79\x9c\x8b\x0a\xab\xb5\x8b\x9c\xf5\xea\xab\x5a\x55\x0c\x5d\x54\x4f\xac\x6f\x12\xb7\xe8\x2f\xd3\x61\x3b\xb4\x56\x38\x1f\xff\x8b\xeb\xac\xfe\xc4\xfc\x2a\x9d\x55\x4f\x46\xd7\xc5\xd0\xd0\x58\xfd\xef\xfd\x3a\x8d\xb5\x47\x90\x03\x22\x43\x96\x9b\x4c\x0a\x20\x4c\xd9\xd1\x11\x4f\x42\x42\x61\x5b\x3d\x57\x95\xac\x4c\xce\x85\x47\xcd\x2e\x7e\xae\xd8\x41\xb1\x96\x95\x4d\x24\xf8\xa9\x2e\x2a\xa8\x34\xde\x6f\xef\xf0\x08\xf5\xe5\xd4\x57\x90\xd5\x03\xb6\x95\xcc\x77\x75\x94\x64\x86\x9b\x41\xba\x5a\x80\x22\xc5\x71\x79\xdb\x3d\xef\x2e\x03\x37\x08\x64\x08\x80\x6d\x63\x98\xa9\x0c\xfe\x87\x28\xd9\xc1\xa7\xbc\xb8\xc9\x31\x38\x0e\x99\x6c\xe2\xf0\x15\xc8\x8f\xf8\xe4\xe4\xf1\xf1\x93\xe3\xe3\xce\x2e\x98\xbc\x1a\x44\x5b\x30\xa1\x55\x08\xaf\xff\x8c\x80\x5b\x50\xd1\xb5\xab\x73\x97\x93\xe1\x2b\xba\x49\x57\x69\x16\xe3\x77\xe3\x5c\x54\x8f\xfd\x2f\xef\x7f\x75\x47\x2e\xee\xf4\xdf\xca\x9d\x5b\x39\x66\x99\x5f\xe4\xd2\x25\x88\x95\x96\x4f\x17\x53\xa2\x2a\x82\xaf\xaa\x5a\xa4\x9f\xa1\x53\x17\x07\x65\xcc\x89\xff\x8f\xbd\x77\x5d\x6e\x1b\xc9\xd2\x45\xff\xfb\x29\x32\x18\x71\x42\xe2\x09\x88\x96\x64\x97\xdd\x55\x35\x31\x3b\x68\x8a\xb6\x39\x2d\x91\x1a\x52\x2a\xb7\xf7\xc4\xc4\xde\x29\x22\x29\xa1\x0d\x22\x39\x00\x28\x99\xf3\x44\x67\x5e\x63\xcf\x8b\x9d\xc8\x75\xc9\x5c\x09\x80\x92\x5c\x5d\x5d\x3d\xbd\xc7\x8a\xe8\xe8\xb2\x44\x02\x79\xcf\x75\xf9\xd6\xf7\xc1\xb1\xd4\x8a\xed\xd2\x0e\x7f\xbe\x17\x07\x8f\xf9\x1d\x7c\xb8\xf8\x3d\x7f\xeb\x18\x2f\x0e\xd3\xb7\x46\x7a\xa1\x0f\x7f\x77\xfe\x9b\xec\xf2\xdf\x75\xac\xf7\x77\xf2\xdf\x7e\xc9\xca\xdb\xec\xef\xc6\x7b\x83\x35\xf9\xdb\xf8\x6e\xf0\xa8\xff\x0a\x41\xe8\x48\x9b\xce\x04\x0f\xe1\x66\x5b\xd7\x1e\xa6\xc7\xa7\x2a\x96\x07\xdc\x7c\x63\xec\x9a\xb7\xc3\x5f\xc1\x9f\xc2\xd6\xaa\xd1\xa7\xc9\xe3\x11\xec\xe3\xc1\x8f\x83\x63\x75\xf5\x71\x3e\xbb\xfe\xf0\x51\x9d\x0c\x4e\x5f\xc4\xe9\xd8\x93\x1f\x7f\x3c\x51\x47\xee\xff\x7e\x48\xd4\xa2\xce\x96\x77\x60\xaa\x5c\xe8\xfa\xce\xb8\x8d\x55\x2d\xef\xd4\xc8\x14\x75\xb9\x5d\xab\xe1\xba\xaa\x4d\x99\xea\x35\xb2\x2c\x4c\x01\xe4\x98\xeb\x22\xad\x06\x90\x97\xa5\xaa\x85\x50\x2c\x73\xd9\x9c\xfd\x04\xc6\x8f\xe8\x5e\x08\x44\xd6\x84\x05\x46\x15\x66\x6d\xf2\x3f\x46\x3b\x12\x6b\x68\x24\x1c\x4c\x98\x7c\x69\x46\xbb\x99\x8b\x91\x7e\x81\x62\xa1\x45\x07\xad\x37\x1b\xa3\x4b\xde\xc6\x84\x78\xf7\x6a\xd6\x37\xb6\xbe\xe3\x62\x95\xe6\x17\x0b\x2a\xde\x11\xeb\xbd\xf5\x4c\xc2\x56\xba\xe1\x6d\x7a\x25\x85\x68\x1b\x23\xd7\x9e\x98\x0c\x5b\xc2\xe4\x4b\x18\x5b\x56\x78\xec\x22\x2d\x4b\x34\x27\xb2\x1a\xd4\xd1\x3c\xa1\x88\xed\x80\x8a\x9a\xfd\x98\xb6\x24\xc0\xd9\x00\xdc\x26\x41\x6d\x8b\xab\xc9\xe8\x23\x5c\x00\x17\xc3\xab\x8f\xe3\x8b\xe1\xd5\x64\x31\xfa\xa8\x46\xe3\xe9\xd5\xfc\xfa\x42\xde\xbe\xe7\xe7\x12\x80\xf6\x69\x72\xf5\x51\xcd\xc7\x1f\x86\x73\xf2\x89\x27\x0b\xe1\x43\x7b\x50\x1b\x7c\xed\x71\xfc\xda\xb0\x8d\x5f\x73\x0f\x70\xf7\xbf\xbb\x6a\xae\xe8\x2a\x7d\xa2\xa1\xe1\x96\xe5\x6b\xd3\x5f\x95\x93\xe9\xd9\x64\x3e\x1e\x5d\x3d\x7a\x67\xc2\x6d\x47\xff\xfc\xf4\x71\x78\xb5\x98\x8d\x7f\x19\xcf\xe9\x02\x75\x6f\x7d\x3f\x9f\x5d\xe0\xcd\x0a\xb7\xe9\x38\x51\x67\xc3\xab\xa1\xfb\xea\xe5\x7c\xf6\x7e\x72\xb5\x48\xd4\xa7\x8f\x63\xb8\xce\x27\x53\x35\x9c\xaa\xe1\x08\x4d\x94\xf7\xee\xa5\x57\xf3\xe1\xe8\x2a\x51\xd3\xf1\x87\xf3\xc9\x87\xf1\x74\x34\xf6\x61\x09\x75\x35\x9b\x5f\x4d\x66\xd7\x0b\xfa\x42\xa2\x86\xf3\x09\x44\x29\x66\xd7\x70\x73\xcf\xe0\x81\xa3\xd9\x74\x3a\xc6\x27\xc2\xd0\x7b\x63\x65\xae\x2e\xc7\xf3\xf7\xb3\xf9\xc5\x10\x9e\xfa\x3e\x9e\x8a\xef\x95\xfe\xff\x95\x7f\x06\x2f\xe7\x69\x56\x2d\xff\x86\xf5\xff\xc7\xa7\x27\xc7\x6d\xfd\x97\x37\x6f\xbf\xe3\xff\x7e\x8f\x1f\x98\x7d\x75\x58\x0b\x55\x8b\x3e\x70\xe1\x72\x09\x36\x58\x17\x8b\x6d\xa1\x2e\xb2\x65\x69\x89\x2d\x29\x51\x93\x62\x39\xc0\xdb\x55\xb8\x99\x2b\x90\x79\xe4\xda\x2c\x93\x82\xb1\xd6\xbc\x39\xb3\x4a\xe5\xe6\xd6\xe0\x57\x3d\xd7\xac\xc5\xfb\xb2\xd6\x1b\x43\xf5\x80\x58\x93\x45\x34\xdf\xad\x0b\xc6\xd3\x75\x17\x28\xf6\x08\x37\x95\x2e\xeb\x81\xba\x86\x42\x7e\x28\x53\x80\xf2\xa5\x92\x4b\x9a\xb0\xab\x82\xac\xae\xbc\x35\x3e\xe4\xb8\x83\x6f\x10\x87\x62\x54\x0b\x37\x78\x31\x77\x57\x50\x04\xb4\x06\xcf\x14\x4f\xc1\xe9\xac\x71\xa9\xb8\x63\xfc\x8f\x93\xe9\x99\xb8\x81\xdc\x49\x19\x7f\xe8\x6c\xbc\x98\x7c\x98\x26\xbf\x0a\x41\x8d\xae\x11\x9d\xd0\x70\x27\x0c\xd5\x68\x76\x3d\x47\xbf\xf1\x6c\x3c\x3c\x07\x3f\xeb\x7a\x31\xfc\x80\x9e\xe5\x7c\x78\x36\x56\x97\xee\xf8\x9f\x8c\xc6\x83\x17\x38\x0e\x72\xde\x00\x71\x5f\x58\x5f\xb9\x21\xed\x21\xa0\xa3\xf6\xba\xe0\x6c\xe9\xf2\x9c\xec\x59\x18\xb5\x55\xba\xaa\xb2\x0a\x48\x9c\x9c\xfd\x45\x76\x1b\xf3\x9d\x27\x31\xd9\x0f\x88\x7a\xde\xe9\x62\x89\x86\xe9\x8b\xc5\xf5\x54\x5d\x4c\x46\xf3\xd9\xe2\xf3\xe2\x6a\x7c\x81\x10\xf5\x01\xdd\xc2\x10\x0a\x9f\xce\xe0\xae\xc5\x41\x23\x43\xc0\xdd\xb6\x57\x1c\x1d\x67\x47\x19\x6c\x59\xb8\x00\x2f\x3f\xa3\x8f\x9c\xd0\x80\x2c\xc6\xa3\xf9\xf8\xca\xdf\xbc\x97\xc3\xab\xf1\xf4\x6a\xa1\xde\x7d\x56\x38\xdf\xc2\x5b\x0f\xde\xa4\xa4\x69\x07\xe7\x71\xcf\x00\x04\x9e\x74\xaf\x38\x6e\xab\x5a\x01\xb1\xe1\x96\x5d\x90\x55\x86\x9e\x87\x20\x8b\x45\x96\x74\xe4\x62\x65\x4b\xbe\x4d\x92\x1e\xf8\xc0\xdd\xeb\x7f\x15\xf1\x77\x77\xbb\x5f\x9c\xfe\xf0\xc3\xb1\xfa\xa0\xcb\x65\xc6\xf0\x90\x17\x17\x76\x8b\x5c\x4b\xbf\x64\xe6\x21\x11\x49\x43\xf5\xe3\xeb\xe3\xd7\xaf\xbe\xdf\xee\x7f\xd7\x3f\x83\x97\xef\x16\x67\x47\xa7\x47\xa3\x5c\x6f\x2b\xf3\xd7\x31\x03\x9e\xba\xff\x5f\x9f\x34\xf9\x7f\x4e\xdf\x7e\xc7\xff\xff\x3e\x3f\xb1\x27\xff\x0f\x3b\xa3\xcb\x7f\x54\xff\x60\x1f\x0a\x53\xfe\xa3\xda\xe3\x92\x37\xa4\x01\xdc\x31\xe5\x2e\xfa\x90\x52\x73\xbf\x11\x39\xb5\x2a\xa1\x92\xbc\xd2\xdf\x2a\xb1\xfc\x50\xcc\x62\xd8\x76\xb5\x43\x22\x41\x04\x36\xdc\x97\xd6\xa6\xfe\x89\x12\x9b\x71\xa3\x48\x6c\x07\x5a\x03\xc5\xa9\x50\x8a\x8b\x89\x9f\x47\xbc\x77\x4f\xee\x51\x11\xa3\x5c\x78\x1b\x65\x26\x43\x53\x42\x91\x38\xa7\xef\x9a\x4d\xc8\x8a\x28\xb3\x48\x4d\xa0\x94\xda\x6f\xde\x0a\xcf\xcd\x16\x85\x3a\x28\x41\x47\xf5\xe8\x14\xca\x6c\x5e\xfd\x4d\x4a\xb7\xc1\x8b\xc8\x83\x8b\x4c\x9f\x77\x10\x5b\x0d\xf7\xa9\xfa\x38\x3b\x3f\x1b\xcf\x7d\x26\x1a\xc3\xb9\xb3\xf9\x22\xaa\x46\xfb\xb6\x2a\xb4\x28\x2c\x0f\x19\xef\xe7\x54\xa1\x75\x78\xf1\x7b\x6d\x28\x4c\xaf\x53\x64\x61\x7c\x36\xe8\xf0\xf6\xbb\x7a\x49\xfe\x7b\xe8\x63\xdb\xe7\x47\x47\x3f\xb8\xfc\x49\x77\xf0\x7c\xfc\xa7\xf1\xc5\xe5\xf9\x70\xfe\xf9\x91\x38\xfa\xe1\x13\x43\x72\x39\x9f\x8d\xae\xe7\xde\xc4\x59\x5c\xbf\x5b\x5c\x4d\xae\xae\xaf\xc6\xea\xc3\x6c\x76\x06\x03\xbd\x18\xcf\x7f\x99\x8c\xc6\x8b\x9f\xdb\x71\x83\x44\x04\x0e\x7e\x06\xf0\xc2\xf5\x62\x02\x83\x36\x99\x5e\x8d\xe7\xf3\xeb\x4b\xe7\xea\xf7\xd5\xc7\xd9\x27\x88\x43\x8c\x86\xd7\x0b\x67\xfa\x4e\xcf\xd4\x6c\x4a\xf9\x87\xf1\x6c\x0e\x59\x0f\x6f\x8b\x45\x11\x88\x10\x74\x58\x5c\xcd\x27\xa3\x2b\xf9\xb1\x19\x46\x1d\x44\x1f\xbb\x22\x13\x9f\x26\x8b\x71\xdf\xdb\xba\x13\x7c\x2d\x24\x71\x30\x30\x11\x21\xde\xa2\xf0\xcf\x33\x52\x04\x30\x64\xa3\x8f\x34\xdc\xff\x4d\xc3\x14\x83\x97\x90\x1b\xbd\xd1\x95\xf9\xab\x89\xc0\x3e\x7e\xff\xbf\x39\x3e\x7d\xfd\xa6\x71\xff\xbf\x3a\xf9\xe1\xf8\xfb\xfd\xff\x7b\xfc\xc0\x5e\x7f\x37\x5c\x8c\xd5\xe5\xf5\xbb\xf3\xc9\x88\x33\x01\x2f\x84\xec\x2b\xdd\xb0\x82\xd4\x89\xf9\xd1\xdd\x8a\x39\x19\xa8\xde\xc8\x97\x75\x3b\xf7\x9b\x69\x6e\xe2\x08\xb1\x4c\x70\x08\x40\xef\x88\xc4\x6f\x46\x36\x6d\x80\x7a\x75\x2b\xeb\x02\x6f\x3c\x19\xa8\x83\x83\x11\x13\x25\xdb\xf2\xe0\x80\x5e\x07\xd9\x39\xe7\x28\xd5\x3b\x0a\xb1\x43\xea\x8a\xa5\xda\xc9\xa3\x0f\xf4\x53\xee\xaf\x14\xbb\xbe\x88\x49\xf7\xf8\x55\xa7\x8d\x57\x31\xbb\x82\x7f\x25\xf1\x04\xb9\x5b\x5e\x86\xc1\x67\xcc\x34\xe3\x3a\x95\x50\xc8\x3b\x7a\x87\x97\x54\xd1\x4a\x3c\x3f\x00\xa0\x2e\xda\xd9\xf5\x1b\xea\x95\x90\x44\x12\x5f\x0d\x8d\x7e\x85\x8d\x0e\xa3\x1a\xb5\x36\x6a\x9a\x6a\x35\xcb\x96\xcf\xea\x13\xb4\x33\xfa\x66\x12\xf8\x5d\x34\xd8\x82\x9c\x90\x84\x74\x05\x11\x07\x95\xc6\xae\x42\x43\x5f\xbb\x86\x8e\x73\xb3\xac\x4b\x5b\x64\xcb\x58\x80\xef\xc2\x2c\xef\x74\x91\x55\x6b\xdf\x7a\xad\xd6\xfc\x3b\xc9\x9d\xbd\x5c\x9a\x4d\x2d\x85\xcb\x62\x0a\x41\xa4\x16\xf7\x04\x4e\x4c\xb1\x64\xc2\x6b\xeb\x52\x17\xd5\x0a\x99\x6e\x53\x5d\xeb\xd0\xc0\x1f\xa0\x81\x9e\xff\xc3\xb7\x24\x5a\xb2\x04\x95\x40\x16\xa3\xa0\x88\xb9\x40\xdb\xd3\x7d\x24\x3c\xf0\x8d\x7b\x20\x22\xe7\x72\x75\xc6\x1c\x87\xd1\xfc\x64\x11\xf2\x8d\x56\xb3\xc7\xca\x40\x44\x0c\x01\x2d\x8d\x87\x04\xf4\xbd\x7f\x2f\x67\x8f\xa4\x8e\xdc\xf8\x2b\x70\xf3\xab\x61\x68\xd4\x5b\xd7\xa8\x73\xe4\xbe\xf8\x64\xcb\x2f\x62\xc0\x01\xfa\x41\x12\xa8\xb0\x22\x4c\xa3\xf3\xb6\x6c\xcd\x2f\x5a\x94\x4b\x7a\x7f\x94\xea\x0e\x39\xca\x46\x52\x32\x34\xe6\x0f\xd0\x18\xfc\xad\x18\x17\x41\x35\x2a\x3f\xeb\x8e\x1e\xfc\xb0\x64\xd7\x22\x34\x62\xc4\xb2\x09\x79\xbc\x24\x68\xdb\x7c\xcd\xd6\xdb\xb5\x57\x55\x44\xc2\x0f\x60\x05\x45\xd2\x15\xf2\x3b\x98\x77\x0c\x27\x06\x47\x1c\x73\xd2\x40\x73\x72\x43\x91\x19\x58\x86\x38\xc6\x89\x42\xee\x9a\x54\x12\x4f\x91\x03\xb5\xb4\xc5\xbd\xd9\x79\x34\x4e\xe8\xc8\x8f\xae\xd3\xd1\x6e\x0a\x73\xe0\x9e\x46\xf4\xe1\xc4\xf6\x91\x9a\xdc\x60\x16\x93\x39\x3e\x88\xd3\x11\xb1\x8c\x48\x14\x43\x40\x1d\xa1\xef\xd2\xda\xf8\x90\x00\x2d\xcd\x7d\x66\xb7\x55\xe3\x00\x54\x9f\xee\x4c\xd1\x58\xe6\x12\xf4\x58\x01\x6d\x51\x99\x09\x4e\xef\x44\xe9\xe8\x21\x2a\xab\x58\x32\x45\x29\x35\x44\x65\xab\x27\x7b\xe2\x8e\x69\xe6\x27\x23\x09\x08\x62\xfa\x76\x33\xda\xea\xc2\x9e\xe6\x87\xf7\xbe\xc3\xf7\x16\xe6\x41\x10\x97\xd3\x13\xab\x80\xb8\xea\x3c\xe2\x9e\x7c\xfe\xc9\xe0\xe4\xd8\xcd\x5c\xf4\x35\x3f\x73\x72\x23\x92\x0e\xc0\xb6\x36\x82\xe3\x14\xb6\x08\x6e\xae\x4c\xaa\x87\x7f\xe3\x46\x76\xb3\xd1\xb8\x6f\x90\x48\x2b\x5b\xde\x25\xcd\x85\x9c\xd5\x7e\x1a\x3d\xcd\x8b\xc0\x06\x78\x35\xf5\xd2\xe8\x74\x17\x2f\x80\x78\x23\x77\xed\xdd\x13\xb4\x05\x2e\x35\x6c\xaa\x91\xf3\x4a\xab\x9e\x58\xc7\x1b\xfc\x03\xb8\xab\x87\x55\x3f\x51\x85\x7d\x50\xf6\xa1\x40\x5d\x14\xb7\x29\xf4\xca\x8d\x50\xd8\x4b\xe1\x16\xe1\xb8\x01\xa8\x37\x52\xd4\x80\xe5\x42\x36\xa5\x5d\x9a\x8a\x75\xcd\x36\xc0\xa6\xb5\xad\xf0\x3d\x78\x2f\x89\xb7\x87\xe3\x42\x71\x7a\x5f\x5e\x9e\x27\x60\x5d\x88\xb1\x8f\x0e\xe7\x0d\x4a\x4c\x63\xa6\x63\x1d\xa8\x61\xc4\x30\xb9\x0b\x86\xac\x9b\x86\xa6\x07\xea\xc3\x09\x89\xcc\x1c\x58\x28\x41\x6e\x28\x0b\xab\x92\x38\x82\x61\xe3\x07\x08\x32\x20\x84\x56\x7a\x69\x84\x4e\x0f\x6f\x3c\x26\x0c\x62\x1a\x1a\xe6\x41\x76\x4b\x2e\xcb\x7d\x18\x40\x45\xda\x44\x20\xad\xa9\xc2\xe5\x06\xd8\x14\x19\x30\xf1\xc2\xc2\x99\xc6\x47\xe9\x32\x03\xe5\x07\x7d\xeb\x9a\x59\x3f\x71\xb6\xe0\x55\xf8\x60\xf2\x1c\x58\x4a\x8b\x44\xd8\x76\xf1\x15\xc2\x83\x18\x0c\xba\x4a\x2d\xef\x6c\xb6\x24\x35\x57\xb9\x11\x48\x4e\x07\x10\x3e\xae\x4d\x41\x6f\x16\x95\xd1\x91\x1b\x39\xe6\x1d\x8b\x49\x4c\x53\xc3\xdf\x23\xa3\x34\x35\x47\xf8\x5d\x37\x27\x52\x44\xff\x21\x4b\x4d\x24\xce\xe1\xa6\xb6\xb0\x94\x38\x12\x4b\xe6\x74\xa0\x7a\x9f\xed\xf6\xe0\x00\x58\xbc\xdc\x7f\x96\xbd\xbe\x5f\xf7\x8d\x1b\x5d\x93\x62\x06\xdd\xec\xe6\xab\x33\x9b\x01\x6a\x41\xb7\x04\x6c\x4b\x22\x12\xb3\xeb\x4d\xbe\xe3\xe5\x2f\x6f\x14\xbe\x45\x93\x78\xff\xc2\xf3\x57\x5b\x38\xfd\xef\x1b\x0c\x8a\x61\x8f\x57\x5b\x2f\x15\xb2\x20\xba\xd4\x37\x6e\xe7\xbe\xb7\xa5\x6c\x5c\xe6\xd6\x16\x75\x4c\x88\xe5\xed\xb8\xe9\x6c\x17\xc0\x62\xab\x00\x77\x4c\xff\xc8\xe1\x94\x60\x5d\x2f\x7c\x93\x33\xc1\x48\xac\xc2\xad\x4d\xe8\xd0\x67\xbb\xc5\xb7\x12\x0e\x47\x68\xc6\xfb\x45\x9e\xa8\x1e\x7d\xc7\xef\xc4\x43\xdd\xa7\xfc\xc6\x83\x1b\x29\x4a\x96\x00\xbc\x16\xff\x1b\xee\x79\xaf\xa5\x45\x1f\xa0\xe9\x5e\xeb\x42\xdf\x1a\xa6\x04\x87\x9c\x08\xf6\x27\x5c\xfe\x37\xa8\xbe\x55\x6a\x7c\xaa\xf7\x5a\x50\x29\xff\xa6\x0f\x67\x96\xd7\xb4\x03\x19\x0b\x30\xf9\x56\xd9\x0a\x41\x32\x4b\xf7\xf4\xc3\x1f\x8e\xff\x9f\xbe\xa7\x9e\xdc\xd6\xc0\x14\x07\x6b\xec\x0e\x10\xc3\xb6\x54\x37\xa6\x30\xab\x0c\xbc\xa6\xe8\x91\xa2\x55\xbe\x32\x40\x6c\x82\xc6\xc1\x7b\x3a\x38\xc1\x8d\xd2\xb6\x09\x3f\xb8\xe3\x8d\x3f\xd7\xfd\x91\xb8\x5c\x00\x04\xf7\x44\x31\x40\xb3\x4c\x20\xaa\x21\x08\x32\xe1\x11\xc0\xdc\xbb\x6c\x70\x68\x01\x23\xef\x16\x75\x07\x37\xc6\xfd\x16\xcf\x65\x61\x1c\xb8\xf9\xc4\x45\xd2\xfd\x05\xda\x18\x87\xc2\xba\xa6\xc3\x9c\x71\x7f\x6b\x5d\x7e\xe9\x37\x8e\xf6\x76\x57\x19\x3e\x26\xaa\x1a\x18\x43\x46\xf5\x0b\xbe\xae\x01\xba\xc4\x85\x10\x1d\x9c\xef\xf1\x81\x77\xd8\x61\x06\xf7\x5b\x21\xef\x86\xbb\x44\x81\xd9\x88\x81\x4e\x58\xe1\x3f\xbb\x0f\x88\x31\xba\xe1\x31\xc2\xeb\xb5\xa2\xfb\x55\x65\xc5\xaa\xcc\x80\x29\x93\x0c\x6c\xbc\x7c\x12\xc2\x10\x02\xae\x91\x10\x86\xab\xa6\x9d\x40\xa8\x72\x52\xc3\x73\x4e\x66\x82\x23\xb4\x71\x6b\x1f\x02\xd1\xee\xcb\x54\xa6\x01\x0a\x29\xc0\xef\xa7\x89\x8d\xf3\x65\xe4\xd3\xbb\x31\xb4\x41\x82\xe9\x19\x43\x24\x0c\xb5\xc3\x25\xee\x69\x1a\xf3\x50\x96\xc6\x58\x55\x3e\xa9\x4e\x07\x27\x6e\xbd\xb8\x16\xb9\x31\x71\x67\xb5\x59\x91\x16\x37\x27\xa7\x53\x77\xd0\xb7\xe7\x7f\x95\x95\x55\x2d\x66\xb2\x61\x37\x09\xde\xbb\x47\x9d\x14\xd7\xda\xb4\xaf\xa6\xb6\x76\x33\xeb\xb7\xb5\x6c\xa0\x6b\xd8\x8d\xbd\x87\x0d\xc3\x6b\x35\x0f\x36\x16\xf5\xed\x27\x75\xd2\x87\x01\x85\xfb\x16\x4c\x53\xb7\xff\xc0\x2a\x36\xc1\x26\x8e\x1a\xf9\xb3\x3a\xed\x07\xc6\xd0\x7d\x9f\xb1\xa5\x7a\x85\x8f\xe6\xe5\x81\x84\xa0\x70\x26\xba\x95\xf2\x93\xca\xfa\x2d\x14\xff\x5e\x33\x38\xa3\x0f\x3f\x19\x15\x10\xc4\x8b\xfe\x26\x85\x2b\xf6\xde\xcb\xf1\xc0\x81\x75\x3a\x90\xf7\x7d\x7c\x4c\x2d\xbe\xfd\x2c\x49\x30\xf0\x20\x1f\xf9\x1b\x1c\x6b\x7f\xed\x03\x2a\x8a\xfb\xfc\x86\x67\x53\x1c\xd0\x61\xfe\xf3\x1b\xaa\xe6\x90\x83\xd4\x7d\x6e\x91\x5d\x87\x35\x18\x42\xb6\x14\xca\x30\x12\x39\xc7\xcd\x13\xad\x11\x1c\xf8\xcb\x4e\xb8\xe7\x1d\x70\x49\xe3\x84\x7b\x24\x6e\x26\x7b\x4e\x7d\xc4\x72\x2f\x6a\x67\x56\x44\x0b\x1c\x79\x57\xdd\x41\xdb\x8e\xff\xc5\x23\xc7\x37\xb6\xf8\x76\x5f\x1c\xae\x30\xaf\x78\x8e\x36\xcf\x50\x71\xee\x3e\x72\x9c\xc2\x39\xf1\xcc\x8e\x75\x4e\x29\x8c\xb4\x3b\x38\x3a\x36\xf1\x33\x9f\xfb\x97\x8d\xc6\x33\x0f\x7a\x3a\x42\x2b\x77\x42\xf0\x21\xef\xfe\xf3\xd1\x73\x5e\x36\x08\x4f\x78\x54\xb6\x8c\x43\xd2\x5d\xbe\xda\xb3\x0f\xf4\xd3\x6f\x3d\xd0\x41\x17\xdc\x1f\xea\xd1\xb9\x04\xc8\xba\x1c\x2a\x3d\x04\xdb\x77\x6b\x4c\xf7\x9c\xf3\x9d\x9f\x7c\xd6\x51\x1f\x4e\xd2\xd8\x2d\xb5\xab\xce\x29\xdd\x7f\xea\x7f\xcb\x82\x69\x5c\x05\x87\x58\xeb\xae\x1a\x4a\xfb\x1d\xef\xef\x07\x58\x14\x5d\x1e\x70\xa9\xbd\x7e\xc6\x11\xd1\x0c\xce\x62\x9a\xbd\x32\x24\x88\xf3\xbc\xe6\x73\xd5\x5f\x14\x92\x9e\x79\x14\x9c\xbf\xca\x5e\x39\xdb\x7b\x28\xa4\x62\x42\xed\x88\x34\xbb\xe3\x97\xa2\xe3\x04\x7a\xe8\x58\x5b\x63\x4b\xe4\xd0\xf5\xbf\xf6\xc9\x0a\x58\xf7\xcf\x0a\xa1\x3e\x1e\x2c\x91\x8b\xb9\xed\x55\x0b\x57\x31\x1a\x3d\x2a\xf4\x94\x9a\x1c\x20\x90\xf0\x84\xa1\xf4\x2c\x37\xd4\x07\x13\x5b\x8e\x28\x9a\x9b\xc0\x15\xbd\x05\x00\x21\xd2\xcc\xe9\x98\x8d\x9e\x9f\x83\xca\xbc\x20\x50\x17\xfe\x1e\x77\x0f\x8c\x2a\xdf\x87\x98\x86\x1a\x4f\x64\xb7\xda\xd7\x54\x09\xb2\xe3\x4e\x61\xd8\xa8\x6b\x9c\x50\xe7\x2e\xaf\x41\x30\xaa\xf4\x5a\x04\x15\x07\x1b\xdc\x6a\x70\x97\xfc\xbe\xbe\x53\x0e\x22\xc8\x31\x1c\xb0\x09\xe1\x0e\x6c\x18\x10\x41\x7d\xcd\xcd\xf5\x03\x51\x48\x41\x49\xaf\xc0\x05\x3d\xf1\x5a\xaf\xe1\x03\xf4\xe4\x28\xbe\xc8\xa3\xfd\x6a\xf0\x43\x58\xc9\xa7\x03\x16\xaa\xf0\x90\xc1\x8e\x24\xc6\xb0\xd8\xc5\x71\xde\x6f\x59\xcd\x2c\x46\xd4\xa8\x4f\xce\xa2\x74\x09\xc6\xd6\x9e\x5a\x63\xc1\x4a\xa9\x59\xa4\x82\x60\xc3\x55\x1c\xd8\x0a\xb3\x50\xaa\x7b\x80\x15\x87\x9c\xd1\x93\xc9\x27\x48\x43\x16\x3b\x67\x25\x10\xcb\x35\x31\x91\xe3\x3c\x74\xbc\xc5\xf7\x0a\x2f\xdd\x6c\xd5\xec\xac\x6b\xc3\x93\xef\x4d\x18\x2c\x04\xca\x10\x71\x08\x2a\xb0\xe7\x3f\x98\xfc\xde\xa8\xc3\x93\xd3\xbe\x5a\xdb\xa2\xbe\xab\x14\x06\x50\xfd\xdd\x98\xd5\x9c\xb6\xc8\x77\x20\x2f\xbe\x16\x2d\xc1\xda\x36\x7e\x58\x95\x7d\x55\x87\x6f\x1a\x0f\xd2\x22\xc9\xd1\x12\x58\x16\x79\xc8\x68\x41\x04\xfd\x1b\xdd\xcc\xe8\x82\x61\x10\x96\x3d\x6e\x45\x24\xde\xac\x36\xb6\x80\x24\x0c\x4a\x1f\x14\xd5\x96\x16\x33\x45\xb0\xbb\xf6\x21\x0e\x8f\x64\x47\x61\x58\xac\xfb\xc6\xd3\x93\x0b\x35\xc9\x19\xab\xa7\x42\x32\xb6\x23\xe3\xfc\x6a\xe0\x2e\x02\x83\x51\xd6\xc7\xf2\xc5\xfe\xc8\xc2\xd0\x93\xce\xf3\xf8\x38\xdd\xb7\x2b\x28\x64\x8b\x4a\xab\x90\xa6\x68\x2a\x07\x30\x75\xe6\x67\x5e\x7b\xa1\x2e\x93\x6e\xae\xd8\xec\x0e\x2b\x00\xc2\xbc\x3b\x7a\xc0\xa0\xeb\x54\x0d\x3a\x1d\xa0\xde\x07\x67\x89\x1f\xf5\x46\x46\x87\x59\xcc\x39\xe8\x96\xef\x64\xd8\x2d\xdf\x25\x68\xa9\xc4\x4e\xa1\x0f\xc5\xd2\xf5\xd5\x76\xcc\x31\x38\xcd\xb7\x57\xdd\x60\x5e\xef\x4c\x75\x72\x0c\x50\x2c\x8b\xc4\x07\x05\x28\xe2\x1f\x74\x47\xf6\x1e\x08\xac\x40\xdc\xd2\x56\x0f\x13\xc5\x07\x27\xc6\xf1\xa0\x67\x60\x9c\xc8\x80\xdd\x3e\xcb\xf2\xd5\xe0\xf5\x00\xb8\x07\xbc\xcf\x78\xc9\x3e\xe3\x85\xae\xdd\xfd\x11\x3b\x99\x57\xb0\xfa\x2e\xc1\x4c\x43\xdb\x46\xd8\xa8\x93\x55\xcb\x92\xfc\x52\xd8\x87\xdc\xa4\xb7\x86\xa5\x57\xd9\x26\xc5\xd3\x33\x5a\xce\x07\xd5\xe3\xde\x2b\x24\xf8\x82\x62\x12\x05\xa6\x8d\x4c\x60\xb2\xa9\xde\xe5\x4b\x46\xd7\xb8\xb3\xe0\x81\xd3\xe0\x74\x70\x9a\x44\x1f\x6b\x2c\x3e\x20\xb7\x80\x25\xef\x71\x88\x72\xa3\xc7\x32\xb3\x59\x9d\x9b\x54\xf5\xce\xc7\x1f\x86\xe7\x07\x07\x34\x45\x41\xd8\x1e\x36\x0a\xc8\xde\xf1\x0e\x20\x7b\x37\x60\x4d\x48\x15\xaf\x50\xd5\x76\xb5\xca\x96\x19\x14\x1b\x83\x5a\x35\x0f\xa0\x3f\x9c\x10\xdd\x0f\x02\x6b\x70\xec\xf3\x26\x5d\xd6\x83\xe6\x4c\x20\x01\x05\xca\xe7\x89\x29\x09\x67\x71\x73\x17\x35\x0e\x46\xbd\xf7\x76\x6e\x0c\x1e\x56\x67\xbb\x0d\xbb\x71\x5b\x8f\xca\x5a\xdc\x1b\x60\x4c\xbc\x42\xaf\x28\x3c\x8d\xc6\x1e\xfc\x22\x71\x20\x8b\x94\x1b\x28\x69\x63\x01\xce\x17\xc3\x76\x7b\x6d\x36\x95\x3a\x44\x8d\x21\xa4\x67\x5e\x41\x36\x42\xe6\x53\xd6\x3a\x03\xdf\x1b\xd5\xa0\x6d\xa9\x0a\xf3\x50\xdd\x96\x76\xbb\xa9\xfa\x41\x6c\x64\xa7\x96\x3a\x77\x77\x05\xc9\x7d\x67\x28\x6d\x5f\xdf\x39\x9b\xeb\xe1\xce\x06\x41\xa9\x56\x42\x0d\xb5\xb2\xcc\x83\x18\x59\x7f\xc3\x30\xf5\xc7\x20\x0e\x23\xc8\x4e\x0f\x2f\x27\xfb\x37\xd1\x41\x23\xb3\x1b\xd9\x58\xc2\xaa\xa7\x62\xa3\x35\x16\xcf\x73\x26\xce\x0d\xda\xfe\x1d\x69\x57\x0d\x47\x91\x0d\x7f\xbc\xef\xfc\xc0\x44\xea\xcb\xd9\x7a\x93\x8b\x23\x78\x78\x39\xe9\xd8\x3e\x40\x7c\xc2\x2d\x05\xa3\x08\x87\xd3\x1f\x5e\xf1\x8a\x68\x38\xdf\x73\x03\x4a\x84\x74\xd6\xc9\xb1\x91\x2f\x2a\xf9\x53\x28\x1d\x96\xa8\xe0\xba\x01\xe2\xd8\x82\x98\xe8\xb6\xac\xb6\xba\x80\x58\x5d\x58\xb4\xaf\xc1\x75\x47\x6f\x59\x3e\xf2\xc6\xe4\x99\xb9\x67\xa5\xc4\xc7\x66\xc1\x8d\x50\xfc\xf7\x20\xdd\x45\xa0\xad\xc3\xaa\xcf\x21\x93\xe6\x14\x88\xbd\x4d\xe7\x16\xe3\x3f\x3a\xc1\x18\x7b\xd2\xd9\xce\x34\x56\x73\x3e\x10\xa7\x42\x50\x5c\xde\xf4\x41\x67\x0c\x6e\x2d\x7f\xe1\x84\xec\x3c\xa3\xa2\x60\x6f\xb6\x9d\x13\x38\x4c\x82\x14\x37\x23\x51\x40\xbd\x92\x15\xff\xc5\x3d\x26\x8d\xae\xc8\x64\x06\xab\x61\x6b\x30\xcb\x5c\x05\x10\x08\x51\xbe\xb4\xee\xfd\xd6\x83\x81\xcd\x07\x82\x39\xbc\xdf\x35\xf8\x68\xf7\x6e\xdc\xf0\x7e\xb7\xe5\xae\x4f\x94\x06\x1a\xe4\x72\x83\x32\x7b\x9e\x7d\x31\xa8\x9c\x97\x5b\xfb\x85\x54\x80\x40\x9a\x0c\xdf\x01\xdd\x0c\x3e\x42\xaa\x88\x66\x09\x92\x67\x72\xf2\xdd\xbc\x7a\xa9\xb5\x34\x45\x81\x1c\x94\xf0\xaa\x62\xac\x1c\x63\x79\xa8\x13\xd1\x09\x1a\x50\x4e\xa1\xe7\xb0\x6b\xe4\x7c\xc9\x9c\x28\xb1\x3d\xb5\x48\x02\x9a\x17\x12\xf6\x3e\x32\x0b\x3a\xbc\xb8\xc8\x3c\xf0\xd5\x13\x39\x2a\x9d\xd5\x36\x36\x15\x84\xa8\x12\x28\x28\xd5\x16\x5d\xb9\x84\x55\x4c\x9b\x4a\x49\x89\x7a\xd0\xa5\x5b\xce\xbb\x84\x0b\xf6\xa0\x66\xcc\xac\x01\xe1\x66\x4b\xa8\x3c\x23\x1f\x2e\x84\x2c\xe0\xc1\x62\xd4\x63\x31\xc0\xb8\x49\x2d\xdf\x33\xb5\x28\xb3\x98\x83\x78\xe3\x67\x52\x2d\x52\x37\xe6\x4e\xe7\x44\x54\x04\xde\x34\xff\x6a\xbf\xed\x46\xd1\x31\x19\x6b\x09\x73\x04\x1c\x47\x59\xad\xf4\x4d\x65\xf3\x6d\xed\x96\x14\x88\x69\x61\x4c\x3d\x30\x12\xfd\x8a\xfe\xa3\xfe\xec\xca\x10\x7c\x06\x1c\x8f\xdc\x16\x26\x44\x1b\x24\x1b\x12\x91\x21\xb9\x47\xae\x1e\xb3\x5a\x31\xf0\x10\x85\x20\xb9\xdc\xcf\xb7\x21\x2b\x96\xdb\xb2\x7c\xcc\xfe\xe5\xdd\x22\x9f\x43\x1b\xb0\xda\xe6\x10\x27\x7b\x7e\x97\xd1\x5d\x76\x1d\x82\xee\x86\xf3\xec\x4d\x23\x9c\x65\x57\xd2\x28\xa6\xc0\x5b\x7c\xc4\xc5\x82\x5b\xcd\xc8\xda\x38\x16\x7b\xc3\xe5\x41\xce\x97\x94\xfa\x87\x48\x82\xbf\x1e\x4e\x8e\x5e\x0d\x7e\xc0\xc8\x37\x7a\x89\xa6\xa6\xad\xd6\x70\x64\x12\x76\xa0\x3f\x83\xac\x20\x9b\x8c\xb4\xdf\x59\x38\xf0\x51\x07\xb1\x0b\xa0\x93\x49\x13\xe8\x89\x28\x43\x04\xd7\xa1\x2d\xef\x7d\x40\x21\x59\x48\x67\x02\x74\x6a\xb5\xcd\x57\x19\x40\x20\xc0\x61\x10\x1b\x30\x1a\x06\x0a\xc3\x51\x6f\x38\x30\xb2\xb4\x45\xb5\xc9\x96\x5b\xbb\xad\xf2\x5d\x28\x8e\x7e\x9e\x43\x93\xec\x71\x67\x20\xc3\x98\xbb\xbf\x94\x3a\xdf\xe3\xdc\x74\x9c\x62\xf2\xc4\x6a\x39\x38\xfb\xb4\x02\xbb\xdc\xac\x55\x0b\x33\xda\x3a\x1d\xd9\x5f\x61\xff\xc5\xae\xf0\x90\x41\x1c\x90\x97\x53\xd4\x3b\xef\x29\xe3\x7c\x79\x90\x92\xd0\xd5\xf2\x73\x17\xd7\x91\x71\xa8\x01\xd3\x3c\x9b\x3c\x8b\xc5\x78\xbb\xa3\x4c\x11\xa9\x0a\x37\x8e\x2f\x86\x8e\xbe\x7a\xe6\x22\xe7\xdd\xad\x37\x60\x19\x41\x14\x16\xce\xbd\x9c\x1d\x02\x3f\xda\x07\x95\x77\xbf\xda\xa8\x3f\x7e\xa8\x8f\xfe\xd3\x47\x2b\xdc\x31\x20\x0b\x18\xdb\x2e\x7c\xcb\x3e\x3d\x29\x3c\xe0\x61\x00\xb9\x77\xcf\x3a\x8c\x6b\x11\x28\x25\x3f\x2c\xc3\xdc\x56\x73\x1a\x60\xcc\xbb\x0f\x5e\xa0\x9d\x79\xe4\x4c\xec\xbc\x27\xfe\x4b\x9f\xd2\xfe\x86\xda\x7b\x08\xbf\x1d\xc8\x14\x68\xeb\xb4\x65\xb2\x2d\xf9\x21\xc4\x23\xad\x6f\x10\x03\x1b\x6d\x25\x91\x64\xf9\x36\xc0\x75\x57\xde\x58\xbe\x12\x11\xbe\x59\x71\x9b\x7b\x8e\x2c\xa0\x40\x24\xa3\x6e\xa9\xdd\xfe\x8a\x57\x4a\xb5\x2d\x4d\xe7\xd1\xdf\x5a\x0d\xe1\x84\xe4\x9d\xd4\x8a\x9d\x40\xd8\xc4\xdf\x68\xce\x62\x5a\x6f\xf2\x9d\x3a\x43\x0b\x77\x51\x6b\x20\xca\xb4\xa5\x9a\x9b\xdb\x6d\x1e\xb4\x9a\xbc\x31\x0d\xe1\xfc\x10\x4f\x74\x4d\x05\x0f\x1e\x1e\x83\x68\xba\x62\xd7\x44\xd3\x75\x64\x16\x88\x86\x0d\x82\x97\x76\x8d\xa9\x8d\x00\xc3\x8b\x26\x83\xcc\xef\x0a\x1b\x97\xa8\x3f\x6f\x53\xc2\x76\x95\x80\xe8\x03\xaf\x8a\x5b\x1b\x9b\xe5\x3f\x41\xf4\x47\xb6\x6e\x7f\xb3\x1e\x87\xb0\xff\xec\x83\x60\x51\xdc\x2a\x64\x82\x42\x0d\x29\x25\x28\xcd\x4e\x69\x48\xac\x0e\xd4\x62\xeb\x03\x2a\x78\xcb\xf1\xb5\x24\x2f\xa2\x46\xb8\x61\x4f\xe4\xe2\x35\x6a\x3b\x36\xbf\xef\x71\x8c\xad\x5a\xdd\x96\x5f\x34\x46\x87\x93\xba\xcb\xdd\x2c\x2d\x58\xf6\x14\x84\x0a\xeb\x20\x8c\x6c\x42\x44\x07\x1d\xdd\x08\x9e\x61\xbe\xa3\xb8\x0f\x2d\x42\x19\xf8\xb1\x2b\x05\x6c\xd9\xce\x25\xaf\xbe\x64\x79\x4e\x54\x6b\x1c\xc4\x86\xa3\x13\xb2\xc4\xac\x7e\xfd\x43\x2b\x07\xd8\xf2\x28\x23\xa6\x3b\x08\x2d\x60\x21\xd2\x32\x0a\x0c\x77\x1f\x3c\xce\xa9\xd5\x75\xad\x97\x77\x64\x54\x74\xf9\x99\xe4\x2c\xb0\x05\xd0\xda\x51\x6f\x06\xde\xc4\xe3\xe1\x6e\x78\xbc\x80\x01\x9d\x9a\x87\x96\x29\xf8\xce\x02\x41\x5b\x90\x5e\x90\xec\xd0\x87\x07\x07\xbe\x80\xf0\xe0\xa0\x0f\xa7\x18\x30\x86\x55\x6e\xf3\x20\x1f\x05\x39\xea\x85\x79\xe0\xfb\xa7\xd9\x06\xba\x37\xb2\x35\xae\xef\x6c\xed\x16\x80\x73\x9b\xf9\xbe\x7a\x20\x59\xeb\xdb\xec\xde\x14\x70\x6f\x55\xce\x36\xd9\x66\x15\x30\x1a\xf2\xc7\x8a\xed\xfa\x26\x1c\xb7\x6f\x9c\x95\x35\x86\xc5\xed\xde\xd7\xd5\xb7\x59\xb1\x6c\x6c\x63\x1f\x5c\xa2\x5e\xf8\x14\x65\xe4\x7c\x37\x2c\x4c\x6f\x73\x78\xdf\x35\x7f\xd0\x3b\x04\xc4\x66\x05\x1e\x0c\x50\x22\x5f\x77\x9b\x9c\xda\xa7\x57\x84\xd2\xb8\x73\x58\x83\x53\xe8\xbe\x4e\xf7\x8f\x68\x6d\xc7\xd3\xf0\x12\xea\x4e\xdb\x84\x01\x0f\xbd\x03\xac\x24\xcd\xe0\x40\x4d\xc9\x4b\x0c\x50\x26\xff\x47\x18\x9a\xa8\xaa\x46\x44\x20\x89\x7b\x30\x24\x3f\x1b\x7e\xae\xf7\xfc\xdb\x65\x07\x61\xba\x20\xd1\xe2\xd9\x6d\xa3\x1b\x32\x8a\x1f\xb8\x1d\x0f\x29\x96\x20\x86\xbe\x2f\xd7\x7a\x88\x3b\x8b\xf5\x83\xc1\x47\x49\x2d\x48\x57\x97\x29\x82\x42\x51\xd2\x3d\xab\xfd\x7e\xf4\x45\x19\xdf\x5c\x0c\xd1\x17\xb7\xa2\x3b\xd2\x49\x7e\x1c\x6c\x59\x36\xb0\x40\x60\x9c\x4c\xca\xcd\x5d\x09\x52\xd2\x07\x07\x17\xf6\xdf\xb3\x3c\xd7\x07\x07\x89\xfb\xc7\xec\x7f\x4e\xce\xcf\x87\x97\xe7\xfe\x9f\xfc\x9f\x53\x53\x57\x4b\xbd\x31\xee\x5f\xbd\x8b\xcb\xf3\x1e\xfc\x12\xfe\xbf\xe7\x27\x0a\xfe\xb1\x18\xc1\xff\xbd\x3b\x38\x50\x1e\x91\x52\xac\x00\x34\x95\xef\x54\x95\xad\x33\xb7\x8e\xb1\x01\x5e\x0c\xd8\xf3\x0c\xee\x64\x8b\x19\xb7\x51\xc3\xa7\x8c\x17\x3b\x0e\x9f\x68\x48\x8c\x8b\x01\xf1\xf7\x51\x54\xfc\x09\x3b\x41\x58\x93\x30\x40\x8d\x95\xca\xcf\xf6\xe5\x3a\xfb\xcd\x4d\xa3\x68\xf8\x58\x52\x5f\x9a\x39\x3c\x64\x8d\xbf\x0d\xd4\xe1\xfb\x0c\x71\x63\x74\xab\x3d\x9a\x74\x4a\xda\xb0\x48\x69\x08\xf2\x23\x1e\x0b\x46\x09\x1d\x62\x7c\xcb\xba\x32\xf9\xbd\xa9\x62\xbe\xd5\x9b\x26\xb5\x72\xf3\x3a\xe9\xfb\xed\xf2\x9a\xda\x14\x1a\xcd\x3b\xb5\xd1\xd5\x08\x01\xce\x9f\x21\x9a\x68\x01\x63\xf2\x54\xd5\x8f\x8c\xe8\x2f\xea\x64\x70\x12\x6c\x14\xc1\xcc\x81\x39\xca\x9f\xc4\xbb\xc4\xa3\xa3\xe3\xe6\xb1\x0b\x65\xa0\x66\x6e\x8b\x3e\x7a\xe7\x2c\x75\xf1\x2d\x47\xcf\xa0\xa3\x49\x54\x48\xe2\x8f\x0f\x00\x4b\x79\x2c\x6e\xe7\x01\xd0\xda\xf3\x39\x2f\xa4\x8b\xc6\x21\x54\x35\x97\x30\x1b\x20\x78\x1c\xc0\x34\xeb\x7b\x9b\xa5\xbc\x25\x19\x6e\xc8\x4b\xf5\x7f\x40\x0c\x31\x4c\x15\x8f\xc2\xff\xf0\x2f\x0d\xe6\x55\x88\x8c\x34\xe2\x13\x9c\x34\xf6\x7b\xe4\x39\xcb\x43\xee\x81\x3c\x44\x47\x45\x3c\x1b\xaf\x80\xde\xbe\x87\xf5\xe4\xd3\xa0\x5c\x0a\x90\x57\x80\xa3\x40\x0f\xb8\xc0\xd3\xbd\xf3\xe9\xfe\xf2\x2d\xcd\xda\xde\x87\xc4\xce\x70\x6d\x8a\x14\x3d\x8a\x49\xa2\x26\xf0\xbf\x49\xa2\x7e\xc1\x18\xd1\x2f\x13\x11\x4f\x22\x74\x1d\x7f\xd3\x3f\x3b\xd9\x77\x10\x84\x97\xd2\x57\xf9\x9d\x60\xb0\x68\x7e\xb3\x3a\x9c\x4c\xfa\x92\x6b\x0b\x34\x07\x68\xa7\xfb\x7a\x53\x4e\x18\xb8\x66\x09\x1e\xbc\x90\x88\xe0\xa2\x14\xc9\x5e\xbc\x7a\x74\xb9\x13\xa7\xb4\x27\x2b\x99\xab\xd9\x7b\x4f\x39\x0e\xdd\x1c\xcd\x7e\x19\xcf\xc7\x67\x6a\x34\x3b\x8b\xb9\x5a\xae\xa7\x67\xe3\x79\x2c\x08\x02\xd4\x1d\x44\xcd\x72\x70\xa0\xde\x0d\x17\x93\x45\x90\xfd\x96\x4c\xe6\xcc\x63\x97\xa8\xf1\x04\x18\x3d\x88\xbf\x65\x7c\x26\x18\x5c\x9e\x14\x0f\x17\x54\x2d\x9e\xe1\xbc\xd9\xde\xf7\xf3\x31\x51\xd7\xbd\x1f\x8f\xae\x16\x89\x60\x74\x39\x1f\x27\xea\xfd\xe4\x6a\x3f\x8f\xcb\x6c\xae\xa6\xb3\xe9\x11\xd1\xbd\x4d\xa6\x1f\x06\xf0\x8a\xf1\xf4\x6a\x32\x1f\xab\xf9\x64\xf1\x47\x35\x5c\x30\x29\xdc\x3f\x5f\x0f\x3d\x43\x4c\x8b\xb2\xb4\xdd\x2e\xe0\x95\xfb\x3c\xbb\x1e\xa8\xc5\xc7\xd9\xf5\x39\xb2\xd8\x44\x1f\x72\x23\x3d\xa6\x76\x4f\x7e\x19\x33\x43\x09\x71\xd1\xa1\x90\xcb\xe1\x74\x76\x45\x94\x74\x13\xa4\x77\x19\xff\x32\x3e\x9f\x5d\x22\x9b\x4c\x60\x60\x17\xbc\x32\x7d\x35\x5c\x2c\xae\x2f\xc6\xd4\xaa\xc5\x15\xcf\xc7\x74\x3c\x1a\x2f\x16\xc3\xf9\x67\x22\x76\x81\x61\x9f\x8f\x2f\x87\x13\xa2\xa6\x99\xcf\x91\xa1\x95\x44\xe2\xbb\x17\x0d\xd0\xcd\x20\x53\xcc\xc2\xad\x06\x37\xa9\xc8\x3c\x03\x64\x77\x0d\x0d\x99\x81\x9a\xce\x98\x64\xa5\x35\x00\x93\x85\x1a\x5e\x5f\x7d\x9c\xcd\x27\xff\x73\x7c\xa6\x3e\x8e\xe7\x63\x5c\x73\xe3\x3f\x01\xb5\xb4\x58\x80\xa1\x29\x5e\x62\x7f\x3c\xbf\x98\x4c\x61\x9d\xf0\x6e\xfd\xc3\xe0\xa4\xc1\x0a\xce\xde\x6a\x03\x82\xe0\x81\x72\xe8\x19\x04\xd2\xf6\x98\xcc\x9d\xa2\xc7\x2b\xc8\xf0\xc7\xfe\x3f\xde\x1a\x58\x8a\x0d\x6f\xf1\x1f\xda\x96\x64\x69\x13\xe1\xbb\xfb\x78\x56\xa8\x57\xc7\x2a\x75\x36\xbd\x5d\xa9\x1b\xb3\xb4\x90\x0c\xd6\x58\xe2\x80\xe7\x25\x7e\x1c\x39\xb3\x02\x44\xbf\xea\x8a\x9f\x8a\x54\x30\xe2\x30\x72\x4f\x35\x4d\x56\x42\xb5\x2d\xef\xdd\x31\xc9\x71\xb6\xa8\xee\x42\x86\xfc\x2e\x3d\xc1\x3b\xd7\xfc\x62\xe0\x27\x2b\x49\xb0\x21\xc6\x92\x65\x05\xe1\xa8\xd5\x8d\xd9\x59\x1a\xdc\x47\x5e\x10\x37\x27\xcc\xd3\xa9\x0f\x36\x22\xc2\xac\x76\x27\x7a\xcd\xc9\x96\x1b\x28\x5e\x35\x48\x54\xad\x39\x11\x2e\x11\xca\x84\xc5\x38\x0c\xcc\xf5\xa9\x59\xe6\xba\xb6\xe5\x4e\xfd\x79\x9b\xde\xa2\x36\x34\xa2\x49\xfa\xbe\xe6\xb4\x3b\x4e\x18\x23\xe0\xf7\x46\xef\xa2\xc0\x1d\x3d\x10\xb0\x1d\xb0\x44\xb2\x9c\x66\x1d\x5f\x8a\x78\x18\xaa\xf6\x05\x3a\x4b\xd5\xbb\x04\xff\x2f\xdb\xe8\xa2\xee\xf5\x95\xce\x73\x73\xcb\x29\x88\x46\x39\x1b\x3c\x48\x7c\xfc\xa0\x1b\x38\xdf\x8d\xa2\xf2\xe3\x24\xcb\xa6\x29\x91\x2b\xd9\x05\xf6\xa0\x72\xc4\x6b\x5d\xc3\x5d\xe7\x3a\xc0\x39\xe4\x93\x9f\x0e\x4e\xbb\x67\x3c\x41\xf9\x83\x37\xb4\xe8\xc9\xb0\x05\x5b\x22\x7a\x81\xdf\x78\x9b\xd2\x42\xa8\x2c\xbb\x07\x01\x9c\x6d\x91\x9b\xaa\x72\x1b\x90\xb6\x0f\x3f\x09\x01\x27\x80\xf7\xd8\x80\x21\x4c\x8f\x76\xed\x44\x50\xe7\x4f\xea\x30\xeb\x53\x84\x37\x2b\x80\x38\x9c\xd2\x10\x1b\xbd\x8b\xde\xae\xd5\x7a\x5b\x6f\x91\x07\xc4\x7d\x1c\xac\x3f\x8f\xad\x30\x5c\xe5\xc3\x21\xc0\x52\x6d\x74\x85\xb4\x9a\x84\x4e\xde\x56\x8f\x80\xc2\x9b\xa3\x89\xf5\x9f\x59\x86\xa5\x7d\x69\xa9\x1f\xd8\xb1\xf3\xeb\x1e\x17\x75\x33\x72\xb8\x07\xe4\xee\x17\x61\xf3\x45\xb0\xb5\x1a\xc3\xe6\x07\x2a\x81\x60\x55\xab\x8b\xae\x53\x1b\xbd\xc3\x6d\x53\x96\x9a\xb7\x99\x3b\x62\x9c\x15\x1b\x0f\x54\x8a\xb3\x2b\x46\x97\xa2\xc5\x10\xe2\x30\x9e\x07\xa6\xd5\x35\xb2\x89\x79\x00\x48\xb4\xae\xbd\x12\xbf\x79\x11\xee\x13\xe1\x20\x47\xd9\x7c\xdd\x64\x65\x54\x79\x86\x03\xc3\xab\x67\x63\xca\xcc\xa6\x4c\x37\xef\x0c\xb0\x1b\x7b\x6f\x1a\xb8\x20\x88\x8c\x78\x81\xba\x3b\x5d\xa6\xf8\x5f\xbe\x44\x2d\x91\x71\x8f\xe7\xed\xe1\x7d\x50\xc8\xa7\x36\x71\x63\xc8\x68\x8c\xba\xf6\x70\x7b\xdc\xb0\x2f\x51\x6d\x4c\x69\xee\xed\x17\x93\x8a\x1a\x19\xed\xbd\x10\x00\x82\xe2\x19\x87\xe5\x31\x54\xe7\x99\x26\xaa\xb2\x79\x2a\x15\xb9\x50\xa2\xe2\x4e\xa7\xf4\xa9\x47\xaa\x25\xe4\x7a\xf5\xb7\xc2\x2b\x7f\x2b\xe0\xf1\xff\xe8\xd9\xcf\xcb\x3f\xda\xd1\xf2\x50\xfd\x2b\x1c\xa3\x94\xad\xc5\x0a\x25\x5e\xd1\xa5\xa9\x6c\x7e\x6f\xd2\x80\x7d\xb9\xd9\x85\x54\x64\xa9\x2a\x53\xd7\x08\xcb\xea\x13\x97\x13\x6d\x6a\xba\xfa\x68\x55\x76\xf5\x34\x6c\x20\x9a\x7b\xf4\x12\xfc\xf6\xbd\xd7\xf9\xb6\xe9\x70\x3d\x7e\xa4\xef\x05\x5a\x06\xf1\x96\x5a\x7f\x31\x6e\x73\xbb\x6b\x6b\xb9\xb4\x5b\x68\x94\x4a\x0d\xee\x2a\x5f\x23\xb0\x86\xbf\xd8\x32\x34\x02\xc7\x09\x0f\x11\xeb\xa3\x3b\x61\x7a\x5f\x37\x74\xb0\x5c\xbb\x85\xe9\xd0\x68\xda\x1f\xb0\x69\x7f\x70\xbb\x1b\xe1\x60\xae\x7d\x06\xd9\x42\x43\xec\x48\xb3\x20\x49\x15\x59\x03\xbc\x26\x6d\x59\xb1\x37\x65\xf2\xdc\x94\x55\x9f\x8c\xa7\xe0\xf2\xdd\xeb\x3c\x4b\x85\x05\x45\x69\x46\x0a\x7b\x89\x27\x09\xb3\x31\xcc\xa3\xe8\x40\x6c\x7a\x89\xbf\xc0\x10\xfc\x38\x10\x9e\x4d\xc4\x7a\x08\x7f\x46\x5b\x77\x3a\x53\xa3\xc9\x7c\x74\x7d\xb1\xb8\x72\xae\x05\xd2\x62\xfa\x3f\x61\xe2\x04\x79\x13\x03\x55\xe2\x7e\x22\xc4\x7e\x22\x48\x14\x25\x29\x62\x42\x24\x95\x9f\x67\xd7\x49\xb7\x73\x91\x74\xbb\x16\x41\x57\x89\x95\x97\x66\x73\xe4\xc7\x0e\x56\xbd\xff\xcc\xe2\xfa\xd2\x79\x79\x73\x36\xfd\x99\x31\x11\xfc\xb0\xf1\x22\x89\x85\xa5\x80\x2d\x7b\x3c\x5f\xcc\xa6\x42\x37\x8a\x49\x30\x85\x14\x46\x60\xc3\xdc\xaf\x86\x41\xae\xc6\xc7\xa1\xeb\x3a\xb0\x49\x3e\xea\x65\xf2\xf7\xde\xb3\xf4\xd4\xec\x3d\x70\x60\x7e\x9a\x9c\x9f\x27\xea\xd3\x6c\xfe\x47\xb5\xb8\x9a\x5d\x5e\x0e\x3f\x8c\xdd\x88\x5e\x5c\x5e\xbb\x87\xbe\x1f\x4e\xce\xaf\xe7\xe0\x43\x5e\x0c\xcf\xdf\x5f\x4f\x49\xfd\x82\x1a\x0f\xbc\xa5\xe7\xe7\x7e\x0c\x2f\x9c\x5b\xda\xa1\x73\x05\x7a\x63\x44\x37\xe9\x87\xe7\xb3\x64\x2b\x7f\x37\x76\x7f\x9d\x3a\x7f\xf3\x39\x54\x94\x8b\x01\x3b\x60\x9d\xab\x4d\x08\x7b\x0d\x2f\x2f\xcf\x3f\xa3\xa8\x17\xff\xd1\x0d\xc1\xd9\x78\x78\xf5\x91\x74\x39\x16\xb3\xe9\xf0\x5c\x4d\xa6\xff\x74\x3d\xff\xdc\xd4\x12\x09\xad\x3d\x58\x48\xfa\x4d\x72\x97\xc7\x7f\xba\x1a\x4f\xf1\x25\x93\x11\xcc\xf2\xf9\xf0\x93\xf3\x79\x3f\x4e\xde\x4d\xae\x16\xf8\xf5\xd0\xc8\x81\x5a\xcc\x2e\xc6\xea\x9f\xae\xe7\x93\xc5\xd9\x64\x84\xba\x6c\x67\x33\x6c\xe8\xf9\xf9\xec\x13\x3d\x74\x74\x7e\xbd\x20\xe5\xb4\xb8\x87\x61\x69\xec\x5d\x19\x89\x5a\x90\xd2\x4b\x78\x8e\x9b\x27\xf1\xa0\x8b\xe1\xe7\x78\x6c\x9c\x07\x0f\x14\x86\xc7\x03\x75\x3d\x58\x0c\xd4\x07\xb7\xd6\xa7\x40\x9b\x3a\x76\xbb\x73\x31\x9e\x2f\x28\x4b\xd7\x01\x16\x52\x07\x07\xcb\x50\x4b\x9a\xd5\x66\x9d\x1c\x1c\x20\x0f\x9b\x46\x03\x58\x31\x63\x09\x06\x7c\x5f\xff\x41\x8d\x06\xef\x07\xf3\x81\x3b\x9c\x8f\x4f\xd4\xe1\x6c\x59\x0f\x40\x1d\xa9\x9f\x00\xc2\x07\x73\x57\xee\xf4\x8c\x1e\xdd\xa2\x88\x72\xaf\x29\xd2\x27\x3e\xd4\xd0\x01\xc2\xa6\x09\x10\x82\x2e\x83\xb2\x4f\x68\xd9\xc9\xe9\xe0\xf4\xe4\x54\x1d\x2e\xcc\x86\xdb\x06\x35\xf9\xac\xce\x08\x26\x6c\xeb\xe3\xae\x35\xa2\x77\xa7\x6f\x07\x6f\x4f\x8f\x4f\x8f\x4e\x54\x7d\x57\xda\xed\xed\x5d\xf8\xd5\x6b\x75\xf8\x4f\xdb\xc2\x70\xaf\xdd\xb1\x8a\x43\x0f\x41\x54\xb8\x60\xc6\x45\x4a\x5a\x0d\x44\xf8\xd4\x85\x6d\x28\x9c\x31\x08\x28\xf1\x16\xf8\x45\xb0\xa8\x9d\x9c\x0c\xd4\xc5\x64\x31\x1a\x9f\x9f\x0f\xa7\xe3\xd9\xf5\xa2\x9d\x73\x8d\x00\xcd\x06\x23\x01\xa6\x16\xb7\x8f\x9b\x99\xa5\x29\xe1\x7a\x64\x3e\x93\x35\x14\x69\x28\x22\x2e\x74\xa6\x0d\x92\xa6\x91\xc7\xdd\xc1\xad\xa3\xee\x4c\xce\x61\xfc\x6d\x61\x8a\x95\x2d\x97\x06\xab\xad\x60\x4e\xc2\x77\xfd\x6d\x5d\x9a\x95\x2d\xd7\x5c\x5b\x19\xe7\xbb\x23\x70\x38\xe7\x4d\xc4\x53\x1b\xc1\x92\x4e\x81\x39\x41\xd8\x1f\x0b\xc2\xc9\xbc\x8e\x78\xa7\x08\xa4\xe7\xfa\x21\x71\x2e\x9c\x2e\x76\x1e\x4e\x55\x85\x4c\x4e\x5f\x0a\xcf\x65\x08\xaa\x06\xf1\xb9\x23\xbb\x3a\x6a\x8a\xcf\x7d\x6a\x38\x45\x69\x56\x6d\x80\x84\xc3\x03\xd2\x7c\x2d\x9a\x2d\xb8\x76\x03\xf6\xdf\x32\xab\xb3\x7f\x37\x05\xd0\x1d\xc1\x9d\xce\x0c\x44\xcb\x3b\x5d\xd6\xb0\x62\x10\x01\xe0\xd6\x2e\xb9\xeb\xa9\x55\x37\xdb\x2a\x2b\xc0\x07\x45\x93\xe5\xba\x00\xdc\x00\xa8\xe7\x81\x6d\x3c\x5c\x9b\x32\x5b\xea\x84\x90\x40\xde\xd3\x89\x81\x6f\x5d\xc3\xdb\x10\x54\xfd\xf3\xb6\xcc\xaa\x34\x5b\x4a\xf7\xe4\xbd\x49\x01\x6e\x37\xb2\xdb\xb2\xf6\xa6\xf8\xd4\xad\x5c\x53\x16\x84\xc4\xc4\xbc\xb4\x94\x61\x87\x55\x8f\x1a\x11\xc8\xfc\x94\x15\x6a\xa1\x8b\x5a\xab\x51\xae\x4b\xed\x1e\x07\x28\xd0\xd6\x77\xc0\x7e\xb4\xc0\xf9\x82\x43\xd7\x2c\xa9\x5b\xda\xaa\xae\x9e\xa2\x54\x5b\xba\xd6\xe2\x47\xc9\xe8\xf2\x96\xaa\xae\x6b\x5b\x16\x66\x57\x1d\xa8\x95\x21\x49\x33\xf3\x75\x03\x06\x2b\x62\x19\x75\x13\x03\xe1\xc7\x7c\x4a\x0e\xc4\xc8\x16\xce\x6e\x24\x1d\x91\x11\x91\x2c\x55\x1e\x07\x84\x32\xad\xac\x35\xbd\xd0\x08\x99\xff\x60\x6d\x0a\xf5\x49\xe6\x2b\x10\x77\xe5\x3b\x5a\x76\x26\x45\x7a\x3f\xd0\x46\x8c\xd0\x35\xb8\xa0\xfc\x8a\x0d\x10\x3e\x5d\xdc\x6e\x35\x56\x67\xe8\xc0\xf2\xe4\x27\xd6\x9d\xce\x75\xb9\x75\xfe\x23\x39\x27\xe0\x40\x95\x18\xb4\x08\xf9\x3b\x4c\x19\x37\xd6\x07\x1e\x45\xa7\x03\x08\xff\xce\xa6\xfe\x72\x77\x37\x32\x2a\x98\xa1\x4e\x70\x90\xda\xee\x86\xab\x35\xc2\x05\x4c\x6f\xe2\x77\x44\x6b\x66\xb1\x0a\x1e\x20\x5d\x28\xef\xa1\x74\x99\x21\x3b\xc6\xbe\x3a\x3d\x37\xf1\xc4\x07\xb8\xad\xb3\x9c\xc5\xb5\xed\x2a\x46\x64\xb6\x30\x63\xe0\xda\x31\xf6\x0e\xe9\x41\xdd\xea\xeb\xee\x88\xec\x44\xa4\x18\x67\xb8\x12\x94\x3a\x42\x60\x6d\xc0\xb5\x9a\x7f\xdb\x66\x88\x55\x24\xdd\x57\x56\xad\xa4\x50\x6d\x86\x75\x6c\x45\x8a\xdb\xbe\x4b\xb1\xd2\x4d\x22\x4a\x29\x23\x7d\x26\xab\xe9\xd9\x55\x00\xfc\xe1\x64\xbd\x1a\xa8\x0b\x67\x10\x5d\x9e\x8f\x8f\x28\xdc\x8d\x26\x30\xa2\xc9\x5a\xbd\x02\xc4\xab\xa9\xb2\x5b\x0c\x79\x09\xce\x8b\x56\x84\x57\x57\xaa\x77\xb1\xcd\xeb\x6c\x93\x9b\x23\x1a\xc2\xb4\x37\xe8\xfa\xa5\x67\x18\xa4\x55\xda\x7e\x2f\x8a\x23\x54\x00\x63\xa8\x2d\x4d\xd9\x13\x0d\xc0\x19\x14\x30\x5a\x7f\x08\x5d\x9e\x73\x7c\xa7\x23\x21\x57\x85\x13\x3f\x44\x53\xf6\x82\x22\xe9\x6c\x6d\x43\xc1\x62\xa2\xd9\xf1\x9f\xc0\x64\x54\x43\x75\x84\x9b\xfc\xdd\x9e\x34\xe4\xff\xfe\xdf\x57\x0d\x1a\x50\x58\x82\xf0\x7c\x5d\xb6\x4e\xde\x7d\x59\x48\x25\xd8\xab\x31\x22\xcc\xaa\xf1\xbd\xfe\xcf\x1e\x0c\xe2\x76\x32\xe6\xe3\xf8\x15\x74\x21\xee\xc1\x08\xfb\x98\x3b\x43\x74\xb0\xfe\x2c\xa2\x26\x08\x08\x1b\x5d\x2b\xd2\x97\x7e\x78\x78\x18\x04\x88\xcd\xd2\xae\x5f\x4e\x2e\xcf\x07\x77\xf5\x3a\x77\x5d\xf6\x39\x3f\xc9\xb3\x10\x70\x3d\xc2\xb6\x88\x89\x18\x5a\x12\xc9\x4f\xa5\xf1\xa8\x64\x9e\x4e\x51\x22\x3d\xc8\x33\x77\x8a\x2e\x8c\x89\xe1\x58\xb4\x3e\x58\xbe\x31\x1c\x9c\x68\x59\x08\xbe\x42\xb7\xd1\x25\xbc\xb0\xd5\x72\x6f\x59\x37\xb8\xa2\x74\x44\x4e\x14\x56\x45\x94\x03\xf5\x02\x9e\xd5\x16\xa4\xfe\x6d\x89\x88\xa0\x4b\x5e\xf9\xe2\x11\x94\x44\x7d\x39\x29\x36\x65\x46\x58\x53\x21\x6f\x32\xea\x37\x3f\x81\xa9\x9a\x39\xf6\x63\xee\xe5\x4d\xe2\x52\xb8\xc3\xaa\xff\x93\xfa\x5f\xcf\xfa\x19\xbc\x18\x5e\x8c\xa7\x67\xce\xb1\x58\xc0\xf9\x31\x10\xdd\x82\x71\xb2\xb7\xb6\x61\xb2\x35\xb4\x6e\x45\x68\xb0\x3b\x59\xdc\x13\x68\xbb\x44\xf5\xfe\x49\xdf\xeb\x9e\x9b\x4a\xf8\xaf\x05\xe4\xff\x7b\xbe\x0c\x1e\x4e\x59\xfc\x1e\x42\xdf\x63\x18\xe7\xe3\x5c\xe0\x78\x04\x4e\x06\xea\xca\x4b\xe9\x5e\x57\x3a\x30\x5f\x4e\x26\x40\x7e\x22\xc4\x42\x2f\x58\x5e\x04\x07\x56\xea\x88\x06\xe5\x91\x35\x1a\x00\xee\x97\x2b\x03\x09\xaa\x8a\xe1\x5c\xb4\x81\x96\x11\x07\xc9\x16\x39\xdb\x36\xb9\xde\x35\x10\x27\x7a\xe9\xab\x2d\xdd\x43\x7f\x52\xbd\x2b\x52\xb1\x4b\xb7\xcb\x3a\x70\x56\x36\x29\xc1\x1f\x01\xa1\x0c\x54\x2f\xf4\xee\x74\xe0\x7c\x14\x5b\x56\x18\x9d\x1a\x78\x80\x04\xcf\x82\x9b\xd7\xa4\x07\x58\xab\xa4\x07\x13\xdc\x9b\xbc\xeb\x61\x93\xa5\xa6\x6a\xb7\xf6\x70\x47\x24\x13\x46\x42\xe2\xc3\xbd\x91\x06\xb1\x79\x08\x59\x79\x1d\xd5\xa0\x12\x6b\x57\x02\xc1\x17\xda\xff\x0a\x92\x83\x30\x16\x53\xd7\xea\x41\xf7\x2b\x41\x92\x59\xbe\x93\x8f\x46\x67\x0f\x69\xc0\x69\x87\xee\xe2\x5a\x0b\x48\x33\x55\x58\xbc\x15\x5d\x03\x1f\x6c\x19\x7f\x36\xe0\xc9\x38\x21\xe9\x06\xef\x57\xf4\xe9\x6f\xad\x92\xf0\x7f\xef\xcf\xe0\xa5\x19\xd9\xea\x08\x2f\xbe\xcc\x16\x47\xa7\xbf\xbd\x08\xc8\x13\xfa\x5f\x27\xc7\x6f\x9b\xfa\x1f\xaf\x4f\x4e\xde\x7c\xd7\xff\xf8\x3d\x7e\x86\x50\xe9\x81\xd2\x83\xca\xaf\x02\xb0\x01\x31\x17\x06\x24\xd3\xc8\x1d\x5d\x60\x9e\xbf\x36\xeb\x4d\xce\xc2\x1a\x5b\x00\x74\x2e\x4b\x8b\x06\x45\x91\x67\x85\x51\xab\x6d\x41\x39\x80\x00\x08\x75\xcf\x01\xff\x7d\x07\xec\x27\xeb\x0d\xf2\xb1\x7b\xe3\x0e\xcc\x88\xe2\x8b\xca\x6a\x59\xd6\xf2\x00\x27\x52\x6d\x15\xab\x66\x91\x28\x81\x80\x2a\xfa\x67\x87\x87\xf9\x4b\xf5\x66\xe7\x8c\x07\x93\xaf\x04\x1d\x30\x96\xeb\x80\x07\xec\x9e\x84\xb1\x1a\xbe\x73\xc8\xd0\xfd\x30\xbd\x56\x1f\x50\x63\xa2\x05\x1b\xa5\xe2\x58\xb4\x8f\x04\x61\x36\xda\x4c\xdc\x04\xb8\x04\xaa\x9a\x60\xeb\x6d\xc2\x23\xbd\x5c\xda\x32\x0d\xf6\x65\x45\xa5\x13\x87\xaf\x3c\x69\xf0\x23\x8d\x78\x01\x37\x9d\x9f\xae\xd0\xe1\xac\x80\x64\x08\x2b\xf6\xe3\x20\xa2\x17\x5f\xa9\x87\xbb\xdd\xfe\xf1\x53\x6b\x30\x93\xbe\x69\x2c\xbe\x9f\xcb\x7f\xf7\x3f\xa8\xff\xf8\x9a\xf4\x1f\x8f\xae\x47\x7f\x05\x05\xa8\x27\xce\xff\x57\xaf\xde\x1c\x37\xf5\x9f\x4e\x4f\x4f\xbf\x9f\xff\xbf\xc7\x8f\x9c\x7d\x75\x78\x5d\x64\x80\x61\x46\xfa\xb7\x10\x64\x3c\x5a\x90\x23\xd8\x7f\x11\x3c\xaa\x7f\xb9\xd7\x25\xa8\x63\xec\x8c\x2e\xab\x7f\x05\xf3\x78\x6e\x6e\x83\xe3\x0e\xf1\xbf\xce\xe7\x7d\x17\x96\xfc\xef\x2a\x2c\x89\xbc\x9a\xbf\xde\x3d\xcc\x84\x3f\xf7\x2d\xbe\xe1\xb7\xb8\x86\x8f\xad\xdc\x44\xbd\x33\xe5\x17\x93\x9b\x9d\x0f\x4d\x2c\x45\x98\x93\xab\x57\xa7\x42\x1d\x43\x62\xea\xc5\x63\x0b\x1b\xfe\x5c\x71\x30\x56\x3e\x8b\xf9\x37\x1f\xf1\x21\xa9\x43\x9e\x98\x4d\xd8\x5b\xbe\x6b\xbc\x33\x7c\x2c\x67\x9f\xcf\xf5\x0c\xd5\xcf\xf9\xf8\x03\x88\x64\xb7\xb4\x3e\x0f\x0e\x18\x51\xfe\x77\xac\xf6\xc9\xbd\xfb\x2e\xf2\xf9\x5d\xe4\xf3\xbf\xcb\xcf\xe0\xe5\x78\x5b\xda\x6a\xb7\xfe\xeb\x48\x7f\xc3\xcf\x53\xfa\xdf\x3f\x1c\xbf\x6d\xea\x7f\xbf\x7a\xfb\xf6\xbb\xfd\xf7\x7b\xfc\xc4\xfa\xdf\x27\x3f\xfe\xf8\xe3\x91\x9b\x06\xf5\xd1\x14\x65\xf6\xc5\xd9\x74\xc8\xef\xf7\x02\x7c\xbe\x65\xc8\xac\x9c\xbe\x40\x27\x54\x4a\x26\xf9\xcb\xff\x40\x57\x47\x59\x75\x90\xf8\xcb\x87\xf9\x8b\x18\x65\xf8\x25\x2b\xd2\xa4\x33\x15\x31\x29\x54\x61\x09\x5f\x88\xb5\x1d\x77\x50\xd5\x71\x67\x4b\x52\xf2\xe4\x06\xdf\xd9\x3c\x35\x25\x94\x4f\x02\xea\x22\xcf\x02\x47\x6e\xb1\x6b\xe6\x42\x43\x1d\x5c\x97\x2d\x31\x78\x71\x19\x62\x8f\x59\x84\xcb\x0d\xfc\xbf\x3e\x57\xe4\xfb\xcc\xef\x22\x01\x23\x99\x5e\x17\x98\x1d\x91\x18\xaf\x3c\xad\x17\xb2\xc1\x64\x35\xe5\xd9\x45\x6e\x34\xab\xd5\xaa\x34\x80\xa2\x6f\xa4\xbb\x82\x7d\xc3\xb5\x65\xee\x91\x6c\xa8\x5e\x09\x82\xd2\x4e\x53\x89\x82\xba\xeb\xac\xf2\x68\x18\x93\x52\x3a\x8c\xff\x8e\xa0\x58\xae\xf0\x55\x0f\xa5\xad\x25\xf5\xa9\xce\xc3\x90\xa9\xc9\x0a\x3e\xd3\x1e\x16\xa4\xaa\x43\xdb\x24\x41\xc6\x65\x36\xc7\xd6\x08\x91\xa5\xe0\x2f\x9a\x63\xb1\x61\xe9\x49\xe5\xf4\x66\x53\x1a\xd4\x3f\x63\x43\x78\x98\x23\xc2\x83\x0c\x70\x5f\x6f\xc9\x05\x96\x9b\x5c\x67\x45\xbe\x83\x9c\x07\x0a\x15\x56\x5b\x90\xc1\xe3\x6a\xc9\xce\x21\x00\xc4\xaf\x61\x5c\x6c\xbb\xa3\x64\xb4\x7e\x96\xe3\xb4\x25\xb2\x70\xb2\xeb\xbc\x11\xf7\xe4\x6a\x65\x45\xa8\xe6\x5b\x70\x2d\x09\x9b\x18\x74\xb1\x6e\xf2\x6c\x99\xa1\xaa\x14\xab\x20\xca\x44\x3a\x57\x8e\x4a\xfb\x2e\x09\xa6\x1d\x18\x7a\xd2\xc0\x23\x6a\x15\x9c\x37\x2c\x10\x6d\x4c\x5d\x6b\x35\x6e\x74\x89\x94\x76\xc4\x7b\x02\x9c\xd2\x5e\xf2\x34\x09\xab\x07\xe0\x49\xcd\xa0\x18\x8f\x08\xcd\x5b\xb3\x4a\x3f\xbc\x96\x63\x63\x4c\xa8\x01\x67\x0b\xb3\x63\x85\x84\x04\xd5\x85\x7a\x3a\x25\x36\x79\x11\xda\x0f\xef\x6d\x08\xd9\xfb\x4a\xdd\x25\x4a\x35\x34\xe8\x71\xce\xf5\x03\xcc\xc9\x07\x53\xae\x75\xb1\x03\x8e\x34\xc4\x25\x05\xb4\x0f\xc0\xbf\xe1\x1b\x0b\xad\xcb\x9b\x72\x6b\x96\x5f\x4c\xa1\x46\x6e\x62\x00\xdf\xf3\x77\x6c\x56\x0c\x5e\xa6\x6e\x23\x2c\xdd\x2e\xfb\x5f\x1f\x2e\xcf\x8f\x4e\x07\xc7\x47\x6e\x49\x1d\x2d\x73\x5d\x55\x1b\x5d\xdf\x85\xe4\xc0\xaf\xb4\x11\x9e\x8a\xff\xbf\x3d\x79\x15\xdf\xff\xa7\xc7\x6f\x7f\xf8\x1e\xff\xff\x5d\x7e\xb2\x02\xea\x34\x3e\x5c\x9e\xab\xfb\x53\x8f\xc9\x07\x5e\xe6\x3b\x53\x9a\x17\x23\xb7\x0a\xd4\xa5\xae\xef\x88\x91\x27\xb3\xc5\x8b\xf3\xac\x20\x4e\x65\xd8\x5c\x37\x25\x70\xe5\xd4\xbe\x7c\xc7\x96\x2a\xdd\x15\x7a\x4d\xff\x14\xf1\x7c\x2f\x78\x59\x31\x2f\xb3\x66\x69\xe1\xb4\x2b\x32\x4d\x0f\x77\xe7\xc1\xb6\x4a\x64\xb9\x3f\xe8\x23\xfa\xf8\xc5\x93\x21\x73\x8c\x6a\x63\x9a\xf2\xce\xe6\x91\xac\xc9\xe0\xc5\xbe\x2c\x08\xa6\xa3\x3b\x8f\x70\xd1\xf3\xdb\xec\xde\xc0\x39\x28\xf2\x97\x40\xfc\x56\x7c\x89\x3f\x88\x2a\x3a\x45\x6a\x36\xa6\x48\xdd\x45\xc8\xc3\x21\x13\x1c\x85\x32\x42\x95\xb3\x34\xb7\xba\x4c\xa1\x96\xae\x51\x96\x2f\xe8\x63\x0c\x04\xc9\x5a\x8f\x0d\x14\xa2\x76\xb3\xeb\xa2\xfc\x0a\xa9\x90\xf0\x4a\x06\x70\xf0\xd3\x77\x92\x87\x2f\x8e\xa0\xed\x80\xcb\xad\xb2\x6a\x6d\x4c\x9d\x20\x71\xbf\x5e\xde\x41\xc7\x01\x65\xd0\x6c\xd1\xd3\x13\x28\x08\x00\xe1\x15\xf8\xbd\x81\x1a\x16\x1d\x8f\x43\x78\x28\xfd\x77\xc4\xd9\x10\x85\x43\x6c\xb9\x6f\x51\xd1\x45\xe8\xb9\x24\xc2\xdf\x12\x0f\x12\x02\x54\x6c\x8a\x7f\x0c\x09\x97\xda\xe2\xc0\xb4\x38\x4b\xe8\xdb\x37\x5b\x1a\x1e\x2a\xbf\x23\x1e\x48\x0f\x4e\xad\xac\x7f\x3b\x71\xaf\x3c\x64\xd5\x9d\xff\x63\xc2\x2a\x70\x8d\xd7\x06\x8a\x7e\xe8\x99\x6c\xc2\xaf\xbc\x83\x06\x2f\xaf\x2f\xcf\x8f\x4e\x7e\xfb\xa4\xaf\xf8\x79\x2a\xfe\xff\xc3\xab\xc6\xf9\x7f\x72\xf2\xe6\xed\xf1\xf7\xf3\xff\xf7\xf8\xb9\x0a\x41\x49\x77\x66\xd2\x01\x76\x1f\xa0\x60\x87\xd7\x97\xe7\xfd\x44\x02\xea\x5e\xc4\x3e\xe3\xbf\xec\x8c\x2e\xff\x55\xfd\x4b\xeb\x9c\xc4\x8c\xc0\xb7\x3e\x7c\x11\xbb\x3c\xfe\x88\x10\xc8\xff\x1b\x93\xdb\x87\x44\x9e\xb6\x59\x15\x29\xfe\x79\xc7\xcd\x7d\xa6\xb2\x4c\x14\xcf\xd7\x8d\x90\x11\x0a\xe5\xa0\x42\x6c\xb9\x33\xd0\x9d\xea\x5a\xab\xc3\xa5\x05\x01\x05\x28\x72\x46\x22\x14\xc6\x0f\xf5\xfa\x09\xb8\x6d\x44\xbd\x02\x94\xcd\x85\xe7\x0e\x13\x65\xdb\x61\x9c\x9a\xd4\x9f\xbe\x29\xee\x93\xe2\x1b\x54\x58\xc8\xec\xd2\xac\x98\x8d\x4e\x22\x1d\x99\xac\x2a\x48\x07\xb0\xfb\x55\x54\xef\x06\xd7\x1f\x9c\xf4\x18\x98\x3e\x24\x75\x2f\x21\xf0\xe7\x91\x50\x5a\xc4\xa1\x71\x28\x31\xe4\xec\x65\x3c\x00\x57\xc6\x2f\x09\x65\xd1\x75\xcc\x22\x59\xa9\x43\x1d\x0a\x63\x60\xd2\x50\x17\x2f\x35\xc8\x43\x7b\x63\xeb\xbb\x17\x54\x31\xdf\x1a\x81\x17\xa2\x68\x77\x93\x19\x84\xaf\x4a\x37\xe5\x25\x54\xaa\x62\x0d\x2f\xa4\x34\x02\xb0\x2d\x2f\x6f\xcb\x87\xf2\x4b\xe5\xce\x34\x52\x45\x58\x41\x55\x41\x56\x35\xb8\x08\xe5\x6b\xd5\x21\x0c\x9e\x56\x3d\xd1\x89\x5e\xcc\xce\xb7\x10\xd1\x0e\x39\x46\xcd\x41\xa9\xfa\xc9\x0b\x76\xcc\x84\xaf\xfe\x84\x4a\x97\xa8\xa5\xa6\x5b\x3b\x61\xc6\xb3\x34\xf0\xa2\x21\x26\xc2\xae\xba\xa4\x21\x3b\x2e\xf9\x85\x74\xed\x9e\x94\x24\xcc\xd6\xc8\x2e\x6d\xbe\xe2\xff\xc7\x12\x85\xf8\xcf\xca\xe6\x69\xfb\xd1\x8d\xd9\x07\x85\x77\xb2\x3f\x84\x60\x25\x86\x31\x4a\x73\x6b\x05\x86\xd4\x16\x42\x4d\x1c\x33\x1c\x54\x88\xed\x4c\x05\xe9\xc4\x21\x10\x76\x6f\x58\xc4\x9f\x16\x3f\xbd\xb8\xda\x9b\x05\xc3\xd2\x05\x7e\x1f\x4c\x24\x15\x03\x89\x13\x85\x3e\x8a\x12\x49\x5a\xad\xb3\x02\xe8\x36\x75\xcc\x69\x04\x29\x9d\xcb\xf3\x4e\xa2\x4c\xa1\xc2\x01\xd4\xb1\x37\x84\xa0\xc9\x5b\xb0\xed\x85\x0f\x34\x5c\x7d\x1c\x77\xe7\x5f\x08\xe8\xfb\x24\x53\x4f\x2b\xe9\x22\x32\x2d\x1d\xe9\x05\x08\x97\x3f\x9a\x5f\x49\x9e\x91\x5c\x99\x9e\xa9\xe9\x6c\x4a\x14\x3c\x90\xa9\xd8\x97\x61\x41\xae\x18\xca\xb0\x5c\x7e\x9e\x4f\x3e\x7c\xbc\x52\x1f\x67\xe7\x67\xe3\xce\x34\x0b\xe4\x6b\x12\x59\x6f\x89\xb5\x98\xdd\x99\x88\xe1\x54\x0d\x47\x5c\x4b\x18\xd2\x12\x90\x81\x88\x6b\x67\x39\xd7\xf0\x7e\x3e\xbb\x48\x38\xcd\x30\xe3\x74\xc6\x14\x29\x74\x90\xfe\x27\x9a\x91\xd9\x3c\x24\x23\xb8\x2d\x67\xe3\xe1\xf9\x64\xfa\x61\xe1\xbe\x2c\x3f\xfc\x77\x12\x13\x40\xfc\xc7\x2b\xc6\x7f\x8c\x72\xa3\xcb\xdf\x19\xff\xf7\xea\xf4\xe4\xa4\x89\xff\x78\xfb\xea\xd5\x77\xfb\xef\xf7\xf8\x81\x92\x57\x20\x62\x7c\xb7\x38\x63\xbb\xac\x69\xe1\x7d\xfd\xfa\xf5\xeb\xbf\x1e\xe1\xff\xa9\x7f\x99\x3d\x14\xa6\x54\xb3\xf2\x56\x17\x54\x37\xf4\xaf\x2f\xfe\x16\x70\x8e\xc3\xc6\x35\x20\xab\x10\x18\xb2\x10\x40\x0c\x68\x7f\xfc\x1a\x0c\x88\x52\xea\xff\xfd\x9b\xa3\x40\x3a\x1b\xf1\xf7\x8d\x03\x81\x2e\x75\x01\x25\xba\x56\xd8\x7f\x45\xb8\x84\xbb\xe0\xda\x28\x07\xaa\x23\x5b\x78\x4a\x04\xaa\xaf\xbf\x1c\x42\x35\x3d\xdc\x79\x0b\x40\x24\x7c\x70\xd7\x2e\x83\x2b\x24\xe1\xda\x93\x38\x8c\xf6\xe5\xd9\x42\x64\x70\x69\xd0\xdf\x31\x1e\xa3\xd9\xcb\xef\xc0\x8c\xef\xc0\x8c\xef\x3f\xbf\xed\xcf\xe0\xe5\x6c\x34\xba\x3a\xba\x3c\xff\x9b\xc5\xff\x5e\xbd\x7a\x75\xdc\xb4\xff\x4e\xde\xbe\x3d\xf9\x6e\xff\xfd\x1e\x3f\xb3\x8d\x29\xd4\x68\xb8\x18\x0d\xcf\xc6\xea\xca\x2c\xef\x0a\x9b\xdb\xdb\x5d\x23\x7b\xf2\x82\x23\x74\x6f\x06\x6f\x12\x35\xdc\x94\x59\xae\x4e\x8f\x4f\x5e\xbd\x98\x5d\x8e\xa7\xfe\xeb\xa4\xe9\x5d\xf9\x48\x03\xf1\x3e\x2f\xf3\x5d\x2c\x3b\xd9\x95\x22\xf6\x17\xf0\xbe\x16\xb1\xb3\x5f\x1a\xd3\xc2\x6d\x12\x81\xc7\x7a\xbd\x05\x41\xac\x26\x2b\x7e\x57\xae\x41\x10\x38\xbf\x98\x78\x01\x3e\x80\x25\x20\x98\xa3\xf9\x31\x52\x9b\x71\x96\x15\x95\x61\x33\xd3\x97\xe0\x17\xab\x42\xec\x22\x16\x58\xe5\x2a\x7d\x24\x9d\x82\x02\xe7\xaa\x46\xe6\xaa\x2c\xc0\x62\x02\x2f\x59\xf5\x73\xfc\x72\xe6\xde\xaf\x6c\x1e\xb5\x70\x53\xda\xda\x2c\xbd\x52\x70\x56\xd4\xe6\xb6\xa4\x27\x76\x0c\x97\xb4\xc7\xab\x5d\x55\x9b\x75\x12\x32\x27\x5e\x7d\x12\x03\x5a\x0d\x82\xf0\x4d\xa9\x97\xa8\x82\xa8\x2e\x30\xb4\x6a\x37\xb9\x09\x01\x22\x75\x6b\x0a\x53\xda\xad\xb0\xca\x58\x77\x0e\xb2\x6e\x59\x6a\x14\xf0\x12\x46\x81\x3c\x59\xd3\xcc\x2c\x32\xc8\xfd\x06\xad\x73\x36\x67\x69\xa8\x10\xdb\x16\x4c\x9f\x23\x78\x4a\x6a\xa9\x49\x8d\x5f\xfa\x99\x44\x60\xb6\x1b\x7e\x39\x22\x32\x5e\xa6\xb6\xc0\xf1\x4f\xcd\xd2\x35\x27\x5b\xa9\x3b\x64\x78\xbb\x83\xb8\xd2\x03\x11\xc2\x37\xb8\x0a\xb8\xad\xdc\xbe\x50\x59\x43\x8d\x84\x40\x2d\x0f\x14\x90\x8b\x43\x2d\x0e\x4a\xca\x43\xc3\x30\x81\x36\x78\x71\x09\x3b\x44\x95\x46\xa7\xf1\xfc\x2e\x75\x69\x56\x5b\x20\x68\x84\xc5\x8a\x11\x29\x90\xed\x5e\x59\x60\xf9\x79\x28\x72\xab\x53\x9f\x76\x0d\x30\x9c\x77\x3b\xf9\xd7\x44\x6d\x91\xfa\x01\xb3\x5a\xc4\x02\xc1\xd3\x5e\xdc\xa2\xd6\x2b\x07\xe4\x5a\x8f\xc3\xc4\x57\x56\xa4\x28\x93\x08\x19\x26\xd4\x4b\xd7\x14\xf3\xba\x31\xea\xc6\x6e\x8b\x86\xc0\xd0\x13\x5b\xac\x99\xec\x22\x5e\x48\x7c\x32\x00\x65\x70\xcc\xe8\x17\x8c\xab\xe2\xca\xa5\xe7\xbe\x27\x51\x1b\x1c\x60\x7a\x0f\x8f\x0b\x43\xc8\x09\xb9\xb2\xd6\x45\xc1\xc1\xbf\x08\xe5\x73\x32\x50\x67\x66\x05\xb4\x7e\xb6\x00\x71\xe6\x6b\xe4\x31\x05\xad\x5c\x08\x3d\xda\xb5\x41\x3e\x0a\xf2\x86\x1a\x5c\x41\x41\x0b\x00\xf6\xf8\x57\x00\x9b\x87\x45\x0b\xcf\x71\x2e\x06\xe5\x96\xf5\x26\xab\x75\x9e\xfd\xbb\x5b\xfd\xd0\x3f\xa6\x6a\xea\x20\x9e\x81\x9d\x16\x3b\x67\x6b\xa3\x8b\xac\xb8\x85\xb6\xf7\x86\x81\xb8\xa7\x5b\x73\x1a\x2b\xdd\x99\x6e\xe2\x50\xf7\x3b\x99\x4a\x3b\xa4\x0f\x44\x55\x3a\xb1\xe7\x85\xc3\x8e\xff\x53\x82\xdc\xc2\x21\xf8\xa8\xe4\x34\x0a\x89\x41\x86\x14\x08\x5c\x84\x1e\x31\x32\x42\xa5\x09\x65\x3b\x6e\x00\x53\xa0\xab\x2a\xbb\x2d\xd0\xbb\xeb\xa6\xa3\xf0\x7a\x6d\x98\xed\x6f\xcc\x0d\x29\x49\xec\x29\x80\xc7\xa4\xed\x53\x24\x4c\x10\x3a\xf7\x3e\x36\xef\x32\xc9\xa1\x49\xd1\x5e\x19\xf0\x6e\x30\x1f\x90\x87\x29\x89\x22\x83\x6e\x53\x73\x4a\x04\x93\xa1\x28\xdf\xfe\x2f\x39\x27\xd4\x54\x16\xfa\x8f\xf8\x96\x9f\x3f\x31\xc0\x58\x12\x13\x8f\xe2\xa6\x6a\x3e\xb4\xa9\x1b\x9c\x10\xf1\x25\xc8\xcb\xd1\x77\x04\xca\x03\x47\x36\x9a\x0a\xdc\x37\xe2\x91\xbc\x37\x20\x11\xe4\x0e\xc1\xfb\x2c\xdd\x82\x84\x97\xca\xcd\xad\xce\x99\x79\x0a\xbb\x02\x99\x19\x82\xf9\x71\x2a\xc8\xdf\x77\xac\x54\xcc\x57\xfb\x45\x14\xc9\x8a\xe5\xee\x5b\x0b\x19\x1b\x26\xb4\x70\x2e\x51\x81\xba\xf7\x13\x35\x50\x83\x38\x01\xe9\x52\x0b\x79\xb8\x28\x2b\xe3\x56\x02\xa7\x1a\x6a\x24\x31\x93\x58\x1c\x69\x84\x3d\x5b\x39\x0e\x5b\xd6\x6a\xb0\x6f\x98\x34\x08\x29\x9c\x07\xbc\xe3\x76\xb5\x72\xb6\x83\xd2\xb5\x3a\x71\xa7\xb4\x46\x99\x14\xf5\xbe\xfc\xcf\xff\xaf\x34\x6e\x26\x8b\xfa\xd6\xe6\xab\xcc\x9d\x37\x6f\xff\x70\xfa\x87\xe3\x44\x7d\xd8\xee\x74\x01\x94\x54\x89\x7a\x5f\xba\xfb\x07\xdf\x1e\xcd\x3a\xbd\x99\xa8\x7e\x28\x57\x5c\x33\x82\xc2\xeb\x27\xba\x49\x22\xbc\xa3\xe5\x73\xbb\xc2\x3b\x8d\xb9\x4e\x58\x33\xb9\x95\x96\x51\x9f\xee\x4c\xd1\x65\xb3\xca\x6c\x20\x19\xbf\x29\x69\xe7\x99\x32\xc3\x30\x15\xd4\x4f\x27\x4a\x37\x55\xe0\x51\xf3\xed\x5b\x5b\x2d\x99\x71\x34\xa6\x36\x69\xf3\x74\xcd\x3e\xe7\x4f\xdd\x5a\x41\x01\xea\xd2\x97\x04\x4b\x15\x70\x0c\x02\x12\xb1\x20\x2f\x2a\x8f\x35\xa9\x78\xe7\x92\x0e\x0f\x5a\xbb\x65\xdd\x1e\xa7\x77\x3b\xf5\xa0\xc1\xf4\x34\x5f\xb5\xb3\x60\x9a\x0c\xc2\x41\x5f\x7d\xa7\x52\x73\xb3\xbd\x65\x52\xb7\x6c\xbd\x29\xed\x3d\x49\x9f\xdb\xa4\x9b\x9e\x84\xf0\xb6\x18\xf8\x5b\x6f\x6c\xe1\xcf\x3b\x5e\xe5\xba\x52\x0f\x26\xcf\xdd\xff\xbb\x4f\x15\xee\xfe\xbd\x17\xdc\x1a\xde\x43\xa1\xed\x80\xeb\x29\x7a\x91\x5f\xc9\x9c\x95\xfe\x35\xbe\x0a\xa3\x7b\x01\x8a\x1c\x95\x7e\xef\x65\x52\x6a\x13\x6e\x35\x4f\x89\x46\x43\xdc\x68\x6c\x37\xa9\x2f\xc4\xdf\xdc\x96\x3a\x0d\x20\xe4\x78\xf4\xf8\x76\x01\xe8\x31\x9e\xbd\xf0\x1c\x2a\xc4\xa7\x48\x28\x9c\xb0\xf2\x35\xee\x6b\x8f\xf6\xe5\x39\xfd\xc0\x41\xf6\x38\x89\x9f\x3c\xdd\x55\xeb\x02\xae\xef\x4c\xeb\x48\xbf\x8b\xa0\x7a\xae\x77\xed\x9e\x35\xcf\xd7\x4a\x79\xfb\x91\x39\xe9\x5b\x27\x21\xb6\xea\xb3\xdd\x22\xa5\x89\xbb\x75\xc2\xe9\x5a\x34\x0e\x7f\x1d\x1f\xff\xe6\xab\x29\x97\x88\xd2\xde\x4b\x97\xc6\x88\xf5\x60\x3b\x03\xfd\x98\xff\xdb\xbb\x1d\x1b\xea\x6c\x4d\x3c\x6a\xb5\x4b\xa3\xa2\x6b\xab\xc3\xa6\xc4\x2e\x72\x0f\x51\x8b\x2c\x90\xe6\x79\xa3\xfe\x73\xc3\xa8\x8f\x64\x30\xf7\x18\xd8\x92\x04\x0e\x3a\x5b\x03\xdc\xdb\x99\xf0\x75\x17\x9f\x81\xa6\xca\x0d\x41\x37\xd9\x7a\x54\xa4\xd8\xf4\xd9\x6e\x19\x68\xbf\x58\xda\x0d\xbe\x89\x1c\xdd\xc7\x14\x14\x5b\x38\x84\xcf\x31\xbb\xd7\x13\xd6\x5a\x22\x6d\x35\x77\xdc\x66\xe5\x72\x9b\xeb\x06\x76\x22\xd9\x3b\xc4\xc4\x18\xa6\x25\x3b\xa1\xcf\x7d\x74\xec\x05\x20\x2c\x14\xea\xc0\x41\x16\xed\x57\x59\x96\xf2\x06\x02\x45\x29\x50\xa4\xce\xdc\x11\xb8\x87\x50\x1f\x26\x7f\xef\xaa\xe5\x12\x01\x69\xbb\x89\x45\xdb\x00\x67\x3d\x67\xc5\x24\x8f\x98\xea\x60\x66\x79\xee\x3a\x91\xca\x91\x60\x2e\xe4\x1c\x54\x0f\xb6\xcc\xd3\xa3\x87\xcc\x9d\x13\x24\x7a\x70\xb4\x2a\x8d\x3b\x25\xcb\xd2\xdc\x5b\x5c\x48\xa8\x44\x5f\x1c\x01\x41\x64\x25\x75\xa6\x42\x4c\xe8\x99\x7e\x92\x02\x6d\x54\xfb\x50\x78\x03\xcf\xe6\xc9\x33\x5d\x80\xc8\xc7\x6e\xcc\x54\x94\x81\x84\x04\xa3\xeb\x60\x48\xdb\x35\xa0\x23\x0d\x4b\x23\x46\x24\xc3\xf9\xec\xa3\x4d\x65\x66\x6a\xe7\xa6\x60\x92\xaf\x62\x30\x10\xa5\xef\xaa\xbd\xda\x76\x48\x66\x6c\x76\x31\x5f\x53\xd7\x39\xcb\x2a\xa4\x6e\x7e\x50\x14\x65\xe1\xfe\xbd\xcd\x8d\xea\x0d\x7b\xfe\x2c\xc6\x26\x71\x33\x6c\x19\xb5\x22\x48\x99\x76\x6c\xde\x2f\xc6\x6c\x9c\x83\xe2\x4e\x15\x22\xdb\x84\x67\x74\x36\x09\xcc\x12\xc0\xe3\xb4\xa8\x5a\x09\x78\x84\x29\xd0\xca\xd0\x29\xe7\xda\xc6\x95\x68\x3f\xf3\xc8\x07\x01\xb5\x08\x19\x18\xc9\x00\xa3\x82\xb4\x64\xf9\xf3\xad\x8e\xf5\xb6\x7f\x26\x15\xe2\x5d\xac\xc2\xfd\xc8\xc6\x3d\xd4\x55\x90\xa1\x0b\xcc\xf5\x96\x1c\xa1\x1b\x73\xa7\xf3\x15\xcd\x10\x08\x2f\x53\x9e\x93\xa4\x26\x91\xd7\x06\x2e\xee\xb0\x46\x20\x48\x43\x6f\x23\x83\x14\x40\xef\x89\x33\xbf\x0b\x4b\xf8\xc4\x04\xcb\xd0\xdc\x39\x9d\x95\x29\x4b\x7f\x24\xcf\x8a\x9e\x0a\xc9\x53\xc2\xf1\x67\x85\xd4\x47\x15\xe1\xde\x8e\x77\xec\xb3\xab\xb8\x07\x7e\x6e\x38\xd5\x0c\x8f\x68\x3b\x86\x49\xb8\xd3\x6a\x16\xba\x70\xc6\xa7\x3b\x56\x60\x48\x62\xa7\x2b\x30\x77\xba\x4f\x37\xa0\xdb\xd1\x84\xa2\x3a\xc6\xa6\xb4\xeb\xac\x40\xb9\xe0\xb0\x4a\xd0\xe8\xd6\x65\xb9\x43\xaa\x68\xf0\x14\x57\xb6\x5c\x0b\x2f\xb3\x11\x52\x89\x6d\x13\xd8\x96\x5b\xf4\xcc\xff\xb2\x0d\xfd\xe8\x7e\x7c\xd7\xf3\x36\xf3\xaf\xda\x8e\xd0\x91\x5d\x6b\xcc\xe1\x86\x78\x6f\x4b\x75\x0b\xee\x6f\xa9\x96\x58\x9a\x56\xef\x12\x0a\xbb\x86\x8b\x90\xa4\x92\xad\x15\x1a\xfc\x6e\xf5\x12\x72\x95\xa0\x8d\x6d\x37\xb7\x52\x87\x1c\x24\x81\xf6\x23\x78\x9e\x70\xf7\xac\x2e\x0c\x23\xdf\xfe\x6e\xbf\x89\x81\xac\xf4\xda\x3c\x2e\x68\xde\x90\x33\x37\x05\x69\x99\xeb\xda\x9b\x31\xbf\x42\xd4\xfc\x09\xeb\x8c\x0b\xdd\xa4\x36\x2c\x2f\xfb\xe8\xfa\x73\x4d\x88\x2e\x47\x3a\x65\x6d\x01\xa5\x2c\x28\x46\xe6\x16\x07\x31\x04\x77\x31\xf7\x46\xb7\x67\x74\x3f\xc6\x97\x29\x72\x5a\x88\xfb\xf4\xd7\xdf\x9e\x1e\xa6\x4c\x57\x67\xee\x8f\xb7\x5f\x79\x89\x76\x1f\x01\xcf\xcd\xf5\x48\xfb\xe6\xcd\x20\x4c\x8e\xc0\x10\xc5\x93\xd0\x7c\x4f\x27\xb7\xfa\xb3\x5f\x8b\x46\x0c\x15\x83\x60\x36\x02\x83\xbe\x96\xd3\x04\x61\xa3\x52\xdc\xa5\x94\xcf\x03\x45\x22\x24\xc2\xdf\x94\xc6\x1d\xae\xee\xf0\xe9\x98\xea\x07\xd6\x95\x8f\x07\xf2\xe5\xfe\x1b\x28\x51\x95\xbe\x27\x50\xac\x37\x66\x03\xca\x2a\x12\x75\x51\x6f\x95\x58\xbd\x6f\x07\x6a\x48\xb1\x0b\x8d\x1a\x7c\x15\xaf\x60\xb7\xcb\x83\x76\x35\x80\x8c\x13\xe0\xac\x6d\x58\x67\x44\x5c\xcb\x75\x4a\x84\x9b\x57\x2b\x13\x6a\xab\xf9\xc2\x76\x96\xfa\x06\x41\xc9\x6b\x0d\x14\xd0\xce\xdb\x48\x02\xa5\xb3\x38\x27\x44\xb4\x93\x4c\xdd\x65\x43\xdb\x00\x6e\x20\xf0\x33\x9e\xd2\xfd\x8f\x6f\x6b\xc0\xfc\x8b\x5e\x5f\xb9\x5e\xf7\xfa\xfc\x41\x2f\x23\xdf\x06\xf7\x32\x71\x5c\x10\x09\x87\x52\x1f\x8c\x38\xf3\x75\xef\xcc\x4d\xbe\xf2\x8b\xd4\xff\x1a\xb2\x7e\x34\x43\x34\x72\x31\x79\xb6\xa8\x4e\x26\x52\xe2\xa8\x35\x07\x95\x10\x3a\xc0\x83\x8d\xb3\x8d\xcd\xbe\x28\x54\x34\x5c\x31\x05\x1c\x2c\xdc\xdc\x16\x04\x00\x17\xc7\x93\xe7\x01\xcf\x8a\xd4\xac\x0b\xdc\xbe\x66\x65\x0a\xf4\x42\xee\x18\x25\xde\x6d\xfb\x37\x02\xda\xea\x4e\x97\x6b\x48\xb5\xf0\xbc\x87\x79\xcd\x8a\xe5\xb6\x2c\x7d\xc8\x99\xf9\xce\x41\x61\xaa\x41\xd5\xde\x2d\x10\x18\xbf\xaa\x6a\x4d\xf1\xde\xc1\x60\xa9\xca\xb3\x00\x82\xb3\x2b\xbf\x22\x99\xd8\x78\xd1\x45\x81\xd0\xb1\x37\x89\xb3\x59\x57\x2a\xab\x3c\x67\xf3\xe3\x0c\x09\x8f\xd3\xf5\xd3\x77\x32\x49\x71\x2f\x1b\xc3\xf5\x28\x6e\x56\x96\x75\x95\xa8\xb5\x29\x97\x77\xba\xa0\xda\xc2\x55\x46\x99\x36\x69\xb9\xf9\xdc\x72\x09\x5b\x95\x92\x14\x59\x71\x8b\x04\x03\xa6\xa8\xb3\xd2\xa8\x32\xab\xbe\x80\x51\x8a\xcb\xfe\xdf\xb6\x1a\x66\x0a\x7c\x76\xac\x45\x90\x91\x05\xd9\x26\x18\x7b\x76\xf6\x7f\x1c\xa8\x73\x9e\x66\xcc\xb6\xa5\x60\xa9\xa0\x1b\xbe\xc6\x00\x2d\x9f\xbd\x78\x75\x3c\x73\x92\xd1\x02\xf6\x16\x68\x28\x05\xf2\xf4\x10\xc0\x85\x2f\x79\xf1\x3d\x63\x84\x98\x81\x30\x01\x49\xe7\x0c\xf0\x57\xdc\x53\x73\x8b\x45\x9a\xb7\xd6\xa6\xce\x05\x4f\xfc\x6f\x52\x5d\xeb\x04\xcb\x5b\xab\xda\x6e\x36\xda\x19\xdf\x3e\xe0\xba\xd2\x59\xbe\x45\x3b\x61\xad\x73\xe6\xce\xe4\x3e\x71\x11\x10\x9e\x66\x82\x55\xc2\xb7\x16\xdf\x6c\x2a\x51\xce\xc9\xc1\xe3\xbd\x52\x16\xb1\x52\x1a\xcd\xa2\xe0\x60\x5e\x44\x59\xd1\x63\x41\x02\xdd\x8a\xc5\x7c\x23\x83\x75\x82\xff\x4d\x38\x4e\xb0\xd5\x2c\x64\x08\x88\x59\xf9\x62\x78\x35\x1f\xf6\x12\xd5\x1b\x0f\xcf\x16\xea\x42\xd7\xa5\x56\x67\xba\xd6\x18\x45\x72\x7f\x18\x0d\x17\x83\xd1\xf0\x6c\xec\xfe\x5b\x06\x60\xdd\xbf\xed\xc6\x14\x4b\x5d\x2d\x75\x0a\x44\xeb\xc4\xca\x2c\x7f\x6b\xcb\xdb\x86\x61\xbc\xaf\x6d\xce\x50\x96\x4d\x83\xd4\xac\x2d\x43\xfa\x6b\x7f\xea\xe6\xe4\x64\x10\xa8\xc7\x5f\x78\xe9\xf5\xe6\xb2\x45\xc0\x70\x25\xd4\x3c\x13\x55\x67\x35\x9d\xf5\xee\x8e\x2b\x4d\x45\x7c\x0b\xde\x40\x8f\x33\x58\x51\xb8\x0b\xd9\x11\x1a\x2e\xc5\xff\xf9\x0f\x2e\x66\x21\x99\x15\x70\xf2\x2b\x61\x29\x70\x92\xbc\x3d\xf1\xa7\x03\x38\x07\x5b\x73\x9e\xb5\x94\x0b\xf1\x1c\x01\x35\x24\xe3\x4e\x83\x70\x21\xae\x29\x39\x41\x12\x8d\x02\xb3\x02\x78\x8e\x88\x6b\xf4\xd1\xd4\x64\x1c\x2f\x6c\x0f\x05\x2b\x3a\x5c\x05\xdd\x36\x54\x71\x40\xb7\x39\x16\xab\x4b\xc0\xca\xe1\xc3\x3a\x2b\xbc\x85\xf3\x8a\xc5\xea\x22\xa9\x8b\x6c\xbd\x36\x69\xa6\x01\x91\xe1\xb6\x30\x12\x60\x6c\x41\xcd\x25\xb6\x65\xf1\xe1\x31\x6e\xbd\x05\x83\x8f\x42\xb9\xcd\x43\x92\xe6\x3a\x35\x55\x5d\xda\xdd\xe3\xc1\x20\x4a\xd6\x72\xda\x74\x03\x07\x41\x45\xc7\x07\x59\xde\x6d\x45\xe2\xe6\x73\x9a\x82\x7a\x2d\x4d\xe2\x67\xa8\xe5\x3d\x29\x54\x3c\x29\x7c\xa6\x2b\x09\x22\x81\x3f\x24\xea\x0f\xee\xc1\x27\x27\x89\x9b\x3c\xd4\x98\x3a\xf9\xa1\x2d\x4b\x9b\x20\x14\x48\x57\xde\x65\x17\x0a\xc7\x0d\xe1\xbe\x27\x24\x8d\xe9\xce\xf3\xeb\x71\x95\xad\x6a\xd7\xed\xc3\x93\x1f\xfa\x48\x66\x89\x6b\xe9\xf5\x40\x10\xb3\x47\xf5\xe9\xfb\xb7\xb4\xdb\x8a\xec\xa1\x16\xe6\x41\x64\x9f\x9a\x8d\x00\xe8\x79\xb6\xc6\xc5\x9c\xad\xcd\x40\xcd\xdc\x95\x19\x87\xb8\xbc\xde\x3c\x3d\xd3\x1b\x16\xd1\x9d\xdd\xa4\x55\xf1\x43\xd6\x36\xc5\xdd\x9a\xc8\x8a\xad\xe7\x33\xca\xea\x67\x79\x50\xba\x0e\x2f\x29\xfd\xa9\x1e\xb7\xb5\xf9\x1c\x8f\x69\xbb\xa9\xcc\xbf\x6d\x9d\xe5\xb9\xa7\x9d\xa2\x73\x8f\x9f\xaa\x3f\x0c\xd4\x45\x56\x2d\x4d\x9e\xeb\xc2\xd8\x6d\x45\x55\x04\x27\x3f\x0c\x4e\xd4\xdc\xa0\xf6\x4f\x75\x97\x6d\x78\xb6\x2e\x29\xdc\x74\x15\xdb\xf7\x24\xe2\x13\xeb\xfd\x90\x94\x04\x22\xa4\x94\xbe\x35\xc5\x72\x97\xc0\x20\x17\xa6\x74\x0f\x4d\xd4\x9f\x6d\x06\x9d\x28\xea\x6d\x70\xeb\x89\x25\xdb\x96\x6b\x48\xf0\x40\x9a\x88\x6b\x89\x41\x0a\x9b\xb4\x7e\xe0\x38\x29\xf6\x58\xc4\xc1\xb6\xf6\xad\xf3\x19\x5a\x99\xfa\x45\x72\x81\x87\x3b\x23\x95\x3c\xf2\x1d\x68\x7e\x03\x83\x16\xe3\xe1\xca\x90\x58\x18\x84\x51\x3a\x55\x13\x41\xa2\x70\x26\xb0\x93\x2c\xb2\xd3\x44\x1e\x41\x73\xb2\xf5\x46\x67\x65\x77\xcb\x0f\x2a\xc2\x37\x42\x2a\x08\x82\x24\x49\x40\x63\x11\x3c\x93\xca\x48\xa1\x49\x15\xff\x12\xb6\x61\x06\xde\x5c\xf9\xc5\xd4\x14\x97\xf2\x95\xab\x32\x99\x1a\x0a\x37\x60\x25\x92\x85\x89\x3e\x1c\xd4\x8c\x94\xaa\xca\xd6\x99\xdb\x0a\x81\x7a\x5c\x57\x49\x34\x0e\x60\x70\x99\x1a\x1d\xbc\xa4\x19\x48\xec\x08\x42\x25\x8f\x36\xc2\x3b\x71\xdc\xc5\x10\xca\xe8\xe8\x8f\x98\x84\x57\x6a\xe1\xdc\x40\x76\x6e\x26\xab\x06\xda\x0d\x02\xd1\xdb\xb2\xe6\xa4\xbc\x01\xa7\x35\xd2\x18\x5b\x65\x45\x5a\x3d\xae\x45\x97\x88\xbc\x78\xc8\x56\x75\x0a\xd3\xe1\x98\xc6\x0f\x32\xf1\x0a\xb8\x31\xac\x3a\xe7\xcd\x90\xb5\xfe\x0a\x15\xb1\x04\x92\xe2\xba\x18\x77\x3b\x57\x96\x5c\x03\x52\x9a\x07\x2c\xd5\xd2\x16\x76\x9d\x2d\xd5\x8d\x29\xcc\x2a\x23\xe1\x18\x70\xe3\x3d\x90\xc0\x47\xa0\xbd\xe8\x3f\x18\x0f\x29\x7a\x5d\xed\x75\xe9\xcf\xb2\xac\x50\xab\x6d\x9e\x2b\x68\x21\xf9\xc9\xee\xc1\x03\xd0\x77\xa4\xe2\x83\xab\xf1\xfc\xc2\xd7\xc9\x9c\x4d\x50\x9e\x92\x4b\x17\xa8\xf4\x26\xc6\x33\x03\xbd\xc8\xfb\xd2\x14\x90\x15\x5f\x66\xff\xf9\x1f\xf5\x7f\xfe\x87\x6b\x25\x0b\xd3\xbb\x55\xb7\xc9\xb3\x55\xf6\x9f\xff\x01\x40\x58\xd6\xc1\x13\x5a\x74\x77\x46\xa7\x04\x7e\xf9\x0b\xb1\x2f\x84\xaa\xfe\xed\xb0\x34\x6a\x52\x57\xea\xc1\xdc\xa8\x2a\xab\xc1\xa4\xcb\x2d\xd0\x40\xa9\x56\x61\x9c\x4e\x53\xe4\xe9\x8b\xad\xeb\x17\xcf\x04\x8f\xcb\x1c\xd1\x0b\xa1\xef\x14\xcb\x3b\xb5\xeb\xba\x9f\xf7\xf8\xa6\xbe\xd3\xa0\x99\x01\x96\xc0\x99\xf8\x95\xcf\x94\x7b\x22\xd0\xee\x53\x6a\x4f\x8d\xd1\x61\x01\xbd\xd4\xdd\xb1\x6d\x40\xef\x36\x60\x6f\x5d\x5b\x06\x2f\xba\xed\x89\x4e\x34\x47\xf6\x57\xc7\x59\x75\x08\x36\x41\xa1\xbc\x70\x2a\xa2\xad\xb2\x18\x2e\x12\x75\x7a\x7c\x7c\xd2\xcd\xec\xad\x7a\xed\xe7\xb1\x63\xdb\x09\x05\x6f\xeb\x5f\x35\x3f\xd1\x29\x80\xf5\x78\x30\x65\xef\xf5\xcb\x11\x2d\xce\x8b\xa0\x47\x06\x11\xa1\x10\x62\x79\x2a\x18\x23\x62\x95\x64\xab\x87\x68\x0b\x1c\xf5\x10\x70\x29\x7c\x88\xeb\xe9\xa0\x0b\x84\xeb\x3c\x66\xbc\x7a\x4a\xa3\xab\xd3\x7a\xfb\x76\xbd\xae\xde\xe0\xc5\xb8\x00\xbb\x38\xda\xb7\xdf\xbc\xd7\xdf\xf5\x5e\xf4\xbe\x6f\xf6\xff\x5b\x36\xbb\x9c\x9d\x27\x36\xfb\x8b\x38\x71\xd2\xe5\xab\x0b\x5f\x13\x30\x65\x37\xbb\xbd\x12\x6b\x83\x66\xf6\xb4\x6c\x04\x37\xfe\xe5\xb3\xd1\x25\x59\x36\xcc\xbf\xf1\xaf\x7b\x5a\x76\xf5\x1c\xf0\xde\xf7\x83\xe9\xbf\xe8\xc1\xd4\x3e\x97\xde\xf5\xbe\xd7\x8d\xfe\x65\x3f\x83\x97\x17\x8b\xa3\xf9\x5f\xb3\xfa\xf3\x49\xfe\x8f\x1f\xde\xbe\x6d\xf2\x7f\x9f\xbc\x39\xfe\xae\xff\xf2\xbb\xfc\x5c\x64\xcb\xd2\xba\x93\x4e\xcd\xcd\x32\xdb\x94\x76\xa9\xf3\x70\xd9\x5e\x54\x47\xf3\xf3\x7e\xcc\xbf\x84\x1b\xb7\x92\xd9\x02\xbd\x74\x57\x9e\x2e\x10\x11\xd3\xcd\x0f\x6d\x1a\x25\x66\x54\xe9\xf5\x58\x95\x98\xff\x88\x11\x11\x05\x1b\xdd\xf4\x4f\x54\x6f\x5d\xf9\x60\x54\x2f\x60\x0d\x7a\xe1\x1f\x70\x40\xf6\x54\xaf\xc9\xae\xc5\x72\x8e\x32\x70\xdb\x0b\x05\x58\x10\x74\xa0\xda\x2b\x38\xa2\x9d\xbf\x8b\xe7\x15\xa8\xdc\x87\xfb\x29\xd7\x0f\x28\xfa\xac\x7a\xb2\x2a\xb2\xe7\x2e\xd8\xba\x8b\x06\xda\x23\x4d\x39\x56\x5a\x85\x22\x00\x7f\x97\x46\xbd\x96\x8f\xb6\x25\x3c\x59\xa4\xbb\xc0\xb9\x0f\xd7\x53\x15\xd3\x66\x38\x7f\x5f\x24\x2a\x73\x09\xd8\x66\x79\x62\xae\x26\xea\xc1\x4d\xa7\x25\xe7\xc6\x41\xc5\xdc\x74\x74\x3b\x11\x22\x4f\xa7\x42\x78\xba\x68\xbd\x92\xd9\xbc\x3f\x40\xc2\xc8\xae\x08\x32\x42\x21\x92\xc3\x61\x5f\xc8\xb6\xc2\x67\x8e\xba\x81\xa7\xad\xe2\xbf\x18\x2f\xef\x4b\x2b\x63\x7a\x93\x06\x4d\x0c\x0b\xaf\xbd\x22\x99\x6d\xd1\x3d\x0c\x7f\xa3\xea\xb2\x6e\xc2\x66\x00\x51\xd3\x86\xa3\xca\xb9\x0f\x75\xc3\x02\xdd\xd9\x18\x8b\x44\x6d\x4a\xb3\xc1\x52\xe6\x16\xc3\x5b\xc7\xa7\x1b\xe0\xa6\xd6\x6c\x72\x76\xb3\xf9\x30\x4f\xd8\x8a\xa0\x2b\x8e\x47\x1d\xbe\xeb\xab\x4b\x9c\xc2\xbf\xbb\x91\x8e\xb1\x49\x6e\x24\xf2\xc6\x92\x75\x9d\x40\xc6\x3b\x41\x63\xf7\x0c\xf2\x3b\xc9\x69\x03\xa1\xc3\x34\xab\xb8\xe0\xba\x35\xe2\x5c\x07\x2a\xe0\x5e\x5d\x53\xe9\x43\xb8\x7b\xbe\xc7\xe0\xf7\x51\x3c\x86\xe7\x61\x0c\xc5\xfe\x10\x67\x35\x4c\x5b\x75\x04\x90\x3c\x48\x4a\x39\x5f\xa7\x01\x3f\x8d\xeb\x77\x50\xad\x90\xd5\x10\x7c\xbb\x0f\xb3\x46\x8d\x53\x29\xc9\x85\x74\xdd\x17\x5c\xef\x94\x38\x93\x70\x97\x26\xa4\x13\xd6\x8f\x26\xfa\x45\x9d\x5b\x32\x4e\x9b\x30\x5b\xbf\xa2\x30\x07\x95\xcb\xf8\x1e\xde\x34\xe1\x31\xc1\xd9\xf3\x80\x7d\x21\x51\xe9\x93\x61\x08\x51\xc8\x77\x08\x5e\xb4\x0f\x05\x66\xde\x31\xd5\x8c\x22\x07\x38\x14\xfb\x46\x22\x70\x76\xe2\xea\x47\xb2\x7c\x6b\xab\x68\xdb\x4c\xad\x50\x46\xa6\xc3\xf2\x48\x45\x57\x65\x23\x35\xee\x9e\x13\xa7\xc6\xdd\x3b\x24\x87\xd1\x01\xa4\x9a\x13\x10\x8a\x86\x9b\x20\xe4\xa6\xfd\xab\x47\x7d\xbe\x26\x6f\x4a\x64\x34\x95\x67\xb0\x47\xc3\x34\x1e\xad\xa0\xee\xd2\xef\x0b\x7f\x1a\xe0\x77\x20\x85\x88\xa6\xbd\xcf\xc1\x44\xd7\x35\x7f\xd5\x77\x2d\xd4\x0b\xc9\x97\x34\xee\x27\x65\x20\x4e\x2d\x2b\x11\x7c\x37\xce\xfa\x1d\x38\x69\x89\x93\x6c\xd4\x5a\x89\xd5\x47\x3c\x5b\x11\x99\x6a\x42\x0d\x4c\xc2\x90\x25\x8c\x59\xf7\x5b\x8e\x21\xb0\x7e\xa9\x70\x8a\xa5\x6b\x2f\xba\x46\x8e\xbf\xb1\x91\xaa\xb1\x87\x84\x44\x42\x8c\xf7\x6a\x5f\xba\x90\xc2\xf1\xa7\xaa\x0e\xa4\x94\x5d\xdb\x45\x80\x73\x23\x5a\xad\x6f\x6f\xad\x2f\x00\x73\x4b\x44\x14\x86\xc5\x2d\x87\x36\x63\xf3\x39\xfd\x18\xa0\x84\x9a\x22\x1e\x19\x69\x3b\xb7\x6d\x09\x37\x94\xef\xfb\x2a\xf2\xbe\x33\x71\x5c\xf7\x40\x2e\x66\xd0\x83\xfd\x7d\x03\xee\xfc\x1d\x61\x8c\xec\x8a\x82\x27\x59\x8d\x71\x8a\x88\xf2\x0b\x98\xd7\x0b\xeb\x85\x64\xa4\x53\x7c\xbb\xd5\x90\xbd\x36\x98\x07\x0a\x77\x53\x38\x46\xe0\x56\xd0\x01\xf3\xb5\xb4\x45\xb5\x5d\x9b\x46\x7d\x0c\x0c\x73\x0e\x87\x6d\xae\x1f\x2a\xcf\x06\x1b\xb1\x37\x00\x7b\x01\x9a\x69\x03\x75\x15\xd5\x8f\x37\xb1\x94\x8d\xe7\x25\xf1\xd5\xe0\xba\x05\x97\x5f\x8a\xb6\x26\x09\xe3\xfc\xc5\x1e\x3c\x57\xc6\xc4\x2e\x7c\x5b\xff\xe1\x15\xeb\x3f\xb8\x6d\xbb\xb4\xc5\xea\x2f\x96\x7f\x78\x92\xff\xf1\x75\x53\xff\xf9\xf4\xf8\xcd\xe9\x77\xfe\xc7\xdf\xe5\x47\xea\x3f\xbc\x12\xba\x0f\xc3\xeb\xab\xd9\x68\x36\x05\x22\xd5\xf7\x93\x0f\xd7\xf3\xb1\x5a\x8c\xe6\x93\xcb\x2b\x35\xfe\xd3\x68\x0c\xe4\x64\x9e\x14\xe8\xd5\xe0\x38\x51\x27\x7f\x50\xc3\xed\xad\x3b\x9e\x4f\x8f\x8f\x7f\x14\x0c\x92\xff\xe7\x3f\xe0\x37\xea\xbd\xb3\xd9\x3c\xe4\xe4\xbd\xdd\x16\x29\x05\xa8\x26\xc5\x72\xa0\xfe\xf1\xae\xae\x37\x3f\xbd\x7c\xb9\xaa\x56\x03\x5b\xde\xbe\xfc\x87\x17\xe3\x7b\x53\xee\x88\xb5\x39\xec\xa1\x3d\x72\x06\xf7\xa6\xbc\xd1\x75\xb6\x8e\xa0\x32\xd1\x55\x8c\x95\x24\xc8\xf2\x00\x1b\x15\x4f\x15\x66\xfe\xd1\x79\x6e\x1f\x30\x46\x98\x55\x41\xeb\x02\xdd\x29\x79\x48\x08\x92\x60\xdc\xcf\x95\xc7\x46\x3f\xa9\x42\x91\x78\x08\xc4\x2b\x75\xd8\xfb\x70\x79\x7e\xff\xaa\xd7\x1f\xa8\x49\x2d\x2b\x1a\x35\x1c\x6b\x05\x5a\x4e\x70\xbc\xde\x00\x60\x4b\x33\x8e\x0b\x02\xbd\xfe\x9e\x6e\xf2\xae\x7b\xe6\x1f\xf7\x75\x10\xe5\x00\x2b\x9d\x93\x7a\x14\x7d\x97\x28\x76\x68\x87\xb4\xd1\xea\x68\x08\x30\x6c\xda\x64\x45\x8a\x46\x08\x8b\x7c\xec\x43\x8c\x74\xb2\x2b\x35\xa4\x43\xe4\xa0\x52\xf5\x6e\xe3\x4c\x00\x65\xb7\xf5\x66\x5b\x37\x65\x26\x9a\x70\x65\x24\xcc\x71\x46\x29\x5f\x89\xa2\x20\xa6\x0f\xb7\xca\x71\xe4\xee\x33\x97\x03\xe2\xc9\xa0\x92\x9b\x9d\x6c\xba\x91\x1b\x37\x1c\x54\xd0\x0b\x44\x0a\x37\x15\xc7\x0a\x72\xbf\x8c\x4e\x03\xfb\x71\x5f\x61\xf3\xd4\x59\xc7\x79\xbe\x73\x4e\x6b\xe6\x5f\x8d\xe7\x70\xd7\xe3\xa9\xc4\x18\x78\xdd\xcb\xda\xbb\x79\xb2\xe5\xfe\x8a\x11\xb0\x9b\xa5\x2e\x70\xe1\x83\xe5\x85\x5e\x48\xea\x06\x68\x60\x06\x09\xac\x60\xff\x87\xac\x70\x03\xec\x66\xba\xaf\xb2\xa2\xb6\xf0\x4b\x60\xb0\x86\x76\xba\xad\x02\x62\x65\xee\x3a\x80\x2a\xfc\x5b\xe6\x05\x72\xbf\xa9\x4b\xbd\x04\x58\x1a\xcc\x13\xf3\x3d\x98\x3c\xbb\x85\xe4\xbe\x1f\xd9\xa8\xc1\x3c\x66\xae\x1d\x5d\x03\xc2\xf1\x19\xef\xf2\x0b\xa4\xf5\x65\x2c\x50\x05\x08\x73\x77\x31\xc7\x6a\x2a\x6e\xfa\xf5\x2d\x54\x78\xe1\x02\x12\x63\x9a\x80\x5e\x9c\xca\x56\x68\x91\xf2\x47\x83\x9a\x58\xf0\xe4\xee\x33\xeb\xab\x7b\xfd\xe2\x83\x0d\x20\x00\xfa\xd9\xca\x6d\x0b\x5f\x8a\x1d\xe6\x6e\xe7\x2b\xee\x9c\x59\xd5\x18\x15\x5e\xc6\x3c\x63\x60\xee\x9b\xa5\x01\xa6\xd1\x9a\x0b\x75\x3a\x87\x47\xb1\xd0\x8a\xaf\x04\xa4\x87\x80\x71\x80\x8f\x82\xf2\xde\xc6\xd6\xe3\x50\x7b\x40\xfe\xca\x25\x1b\x94\xbe\x6c\x71\x6f\x76\x1c\x9d\xe9\xfa\x68\x64\x5d\x13\x88\x34\xde\xe4\xed\x12\x6f\xd8\x5a\xc6\xd9\x55\x6e\x25\xeb\xdb\x52\x6f\xa0\x9a\x77\x21\xcf\x43\x1c\x5a\x0a\xf8\x4c\xad\xfa\x64\xf4\x17\x53\x10\xec\xd1\x8f\xab\xbb\x2d\x72\xb3\xc2\xd5\x06\xcc\xed\x58\x3f\x48\x75\x1d\xad\x23\x27\xe8\xdd\xaf\x37\x40\x99\xb5\x43\xf6\x31\x40\x8d\x9a\x6a\xbb\x26\x95\x16\x3c\xf5\xb2\x32\x3d\xc2\xda\x28\x69\x7d\x6e\x0b\x0d\xf0\x94\xf8\x24\x75\xad\xe8\xa8\xf6\x8a\x94\x69\xb8\xd9\xff\x37\x90\x56\x0e\x5e\x8e\x46\xc7\x7f\x53\xfd\x97\x93\x1f\x5e\xbf\xf9\xa1\x1d\xff\x7f\xfd\xdd\xfe\xfb\x3d\x7e\x46\x00\x7a\xbc\x77\x27\xd8\x7a\x6d\x8b\x4a\x9d\x03\x82\xd1\x1d\x4a\x2f\x46\xa3\x63\x75\x32\x38\x16\x12\x2e\xa3\xf9\x78\x78\x35\xf9\x65\xac\x46\xb3\x8b\x8b\xd9\x74\xa1\x46\xb3\xf9\xe5\x6c\x3e\x04\xbe\xfc\xc9\x02\x38\x72\x87\xea\x7c\xf8\x49\xbd\x9f\xcc\x2f\x00\x6c\x75\x36\x1b\xe3\xef\x89\xc3\x58\x9d\x8f\x3f\x0c\xcf\x3d\x35\xee\x40\x9d\x4d\x16\xc8\xe8\x4b\xcc\xfd\x80\xc7\x3a\x9b\x8d\xae\x81\x59\xd7\x7f\x1d\x5e\x3d\x06\x92\xff\xab\xab\xd9\x7c\x3a\xfe\x7c\x34\x3a\x9f\x00\xa3\xf2\xf8\x1c\x1a\xb0\xf8\x38\xb9\x1c\xb4\x9b\x48\xef\x5d\xe0\x83\x27\xd3\xf7\xb3\xf9\x05\x36\x18\x88\x74\x55\x6f\xb8\x38\x9a\x2c\x7a\xea\xdd\x70\x31\x59\x74\x7c\xff\x62\xf8\x47\x68\x82\xe4\x3d\x9e\x8f\x3f\x0c\xe7\x40\x9b\xdb\xe4\xc0\xf5\x0d\x27\xad\x80\xe8\x7d\x73\xf5\x69\x36\xff\xa3\xa0\x73\xfe\x38\x9e\x8f\xaf\xa7\x67\xe3\x79\x82\x63\x45\x94\xc8\x8b\xc0\xd5\x0b\xcc\xc6\x4c\x49\x3c\x1f\x2f\xae\xcf\xaf\x58\xb9\xe0\xb7\x7a\xf7\xe0\xc5\xc2\xcb\x4a\xd9\x95\xba\x24\xce\x0d\x77\x0c\xe7\xa4\x8e\xb8\xb6\x55\x0c\x41\xac\x98\x0c\xd1\x6e\xd1\xae\x84\x20\x6d\x83\x74\xc2\x9d\x91\x00\x53\xe5\x9a\xb5\x51\x54\xe7\x0c\x88\x5d\x93\x72\xc1\xe8\x61\xac\x14\xa3\xb6\x1b\x52\x44\x81\x88\x35\x71\x88\x09\x30\xb1\x7d\x28\x4c\x79\x58\xf5\x59\xb6\x05\xb3\xf6\x20\x37\xda\x83\xbf\xf5\xfa\x98\x65\x0f\x49\x16\xb0\xe3\xdc\xef\x50\xa0\xf3\x2e\xdb\x70\xa8\x57\x43\x8d\xce\x8d\xae\x48\x05\x26\x51\x5a\xf5\x40\xff\xa5\x3f\x78\x31\xc2\x0a\x67\x7c\x63\xe5\x95\xba\x36\x20\x19\x89\xe5\xe1\xa5\xc9\xb3\xe2\xdf\xb6\xf0\x17\xa8\xd2\x0c\x71\x3e\x0d\x72\x28\xfe\xaa\x16\x76\x74\x08\x07\x63\x85\x0e\x04\x7d\xd6\x84\xb9\x5e\xd2\xc6\x4c\xd4\x72\x9b\xd7\x5b\x77\xb5\xc1\x00\x2c\x9d\x81\x0c\x69\x75\x0c\x2d\x1f\xf6\x68\xe7\xf6\xfa\xc1\xca\x27\xea\x4e\x67\x33\x02\x7b\xe6\x0d\xf1\x4a\x32\x3c\x60\x65\x34\xf8\x09\x39\x56\x70\x13\x35\xe9\x2a\xa2\xa4\x53\x37\xdb\x2c\x4f\x61\x1a\x42\x79\x6e\x56\x2c\x6d\xb9\xb1\xa5\x33\xa1\xdc\x88\x40\xfc\x15\x53\x66\xaa\x34\xdb\xaa\x43\x40\x54\x57\x5c\xef\xad\x2b\x28\x50\x00\x83\x49\x68\x88\xaa\x87\x3b\x5d\x57\xd6\x99\x5e\xf0\xed\x86\xa8\xee\x13\xf8\x06\x59\x12\xc5\xdf\x80\x48\x91\x1b\x63\x9c\x30\x40\xc0\x7b\x86\x36\x0e\x52\xf2\x81\x87\xb6\xe5\x9a\x75\x6e\x33\x50\x27\x42\x7a\x2d\xc8\xe7\xc0\xe8\x07\x89\x1b\x2e\xfa\x08\x09\xc4\x6f\x98\xad\x84\xf8\xf1\x6e\x35\x14\x33\x6c\xb6\xb5\xc7\x6b\x73\x39\x7d\xe4\x41\xd1\xa2\xc9\x50\x52\x87\x39\x16\x04\x51\xaa\x51\x3c\xe6\x66\xb5\xb2\xe4\x4e\x20\xce\x7a\xf0\xe2\xbd\x65\x41\x9d\x88\xa4\x9f\x47\x09\x01\xa5\xb6\x86\x54\x85\x97\x26\x96\x85\xf7\xe6\xeb\xc6\x2c\x03\x45\x58\x23\x52\x96\xa5\xa6\xf4\xcd\x07\xa4\x72\x51\x91\x47\x0f\x6b\x10\x13\x90\x1e\x0b\x5f\xdc\x2a\x77\xa1\x50\x12\x00\xfa\x43\xd5\xb4\xab\x55\x56\xae\xdd\x7e\x4d\x1a\xcc\x8b\xb0\x9e\x23\x86\x56\x4d\xbb\xd0\x35\xe7\xd1\xd3\x84\x22\xba\x9f\xc0\xb6\xbd\xb7\xf9\xb6\xa8\x75\x99\xe5\x3b\x65\x72\xb3\xa4\x8d\xb9\x71\xb6\xa3\x6b\x13\xbd\xf5\x13\xa7\x09\x3c\x6b\x71\x43\x4a\xe9\x53\xf0\x03\x9d\x4b\x05\xfe\x03\xe1\xb1\x58\xdf\x18\x36\xb6\x33\x56\x91\x3b\xf1\xd9\x8d\xf4\xeb\x8b\xd3\xca\x1e\x1e\x9d\x9a\x94\xd9\xa7\x10\x4e\xed\xba\x3e\x3a\x46\x35\xc3\x70\xd4\xb0\x87\xf5\xd8\x0b\x07\x6a\x88\x2f\x6b\x10\x79\x61\x97\xdc\x43\x49\x43\x81\x2a\xb4\xd0\x34\x8e\xd9\x29\x4a\x7a\xa2\x2d\x55\x61\xb2\xdb\xbb\x1b\x5b\x0a\x10\x8f\x3b\x8d\xf6\xbf\xbf\xd7\x7f\xbc\x7d\x8c\xdf\xc2\x20\x0d\x97\xcb\xc3\x5e\x07\x17\x2a\x89\x71\xc9\xac\xce\x91\x0d\x28\x5e\x4c\x75\x08\x82\x56\x40\xa7\x7a\x53\xc7\x7c\x4f\x5e\x2b\xcb\xab\x67\x11\x71\xf4\x52\xd7\x54\xe4\x5c\x97\xba\xa8\xc0\x4d\xc4\x85\xfa\x33\xbf\x28\x1b\xa8\xb5\x75\x9b\xdb\x23\xcb\x88\xb7\x92\x3c\x08\x7f\xd3\xe0\x0d\xe3\x6e\x27\xda\x7a\xf4\x56\xb8\xb1\xc2\xe3\xb2\x81\xd0\x78\x86\x95\x57\x66\xf7\x7a\xe9\x4b\xde\x62\xd9\x67\x4d\x7b\xea\xa0\x52\xd9\x5a\xdf\xc2\xbe\xc8\xb3\x2f\x06\x02\xbf\xa9\xd9\x64\x4b\xd2\x40\x6b\xb4\xfa\x7e\xe0\x9f\x17\xd8\xa2\x39\x4f\xb4\x2d\x56\x3a\xa3\xfd\x5b\x67\xec\xeb\xa1\xec\xa8\xb8\xbf\x5a\x5a\xe4\x8d\xe4\x6e\xf0\x00\x5f\x1f\xea\x7e\x82\x97\x38\xb7\xa0\xb3\x01\xb4\xcf\x4b\xbd\xf4\x45\x72\x95\x09\xe5\x79\xe1\x2e\x21\xa0\x09\x08\xf0\xb5\x3a\x77\x9f\x0d\xc2\xd5\xcd\x8b\x10\xa2\x00\x40\x99\x03\x91\x6f\x12\x80\xc7\x55\x7e\x06\xc0\x04\x67\x8d\xfc\xf8\xe6\xe5\x8f\x2f\xc7\x23\x76\xf0\xc6\xdb\xd2\x6e\x8c\x2e\xd4\xa5\x2e\xf3\x4c\x23\xed\x0c\x02\xce\xf0\xba\xd8\x16\xcb\x0c\x6e\x86\x93\x13\x75\xa1\xcb\xe5\x9d\x3a\xf9\xf1\xc7\x37\x8a\xac\x14\xdc\xa2\xa2\xb4\x91\x9a\xec\x1a\x46\x47\x6b\xc8\x2b\x62\x27\x75\x1e\x28\xb7\x75\x5c\xa8\x21\x32\x41\xc5\x4e\xb9\xc6\xa4\xb8\xe7\xaa\xed\x72\x69\xaa\xca\x46\x45\x5f\xd0\xdf\x94\x3b\xd6\xff\x99\xf5\xf3\x60\x7c\xb2\x01\xf3\x7d\x62\x89\x4c\xa2\x9c\x77\x7b\xaf\x73\x30\xa2\xdc\xcc\x97\xc8\x25\x90\x8a\x7d\xdc\x69\xdd\x79\x15\x55\x51\x89\x99\xeb\x07\xcc\x53\x1a\x5d\xef\x82\x74\xe1\x9e\x0e\xc6\xec\x7b\xa7\x03\xf5\x49\x3b\xd7\xc2\x67\x4c\xf0\x12\xac\xea\x76\xea\xe4\x86\x44\x55\xc1\xe9\x2f\xa8\x18\xea\xde\x5d\xae\x30\x04\x49\xa3\x4d\x89\xe2\x5b\x85\x21\x94\xf6\xde\x94\x75\xbe\x4b\xa0\x52\x04\x25\xf3\xd8\x7a\x93\x14\x62\x3b\x9a\x29\x9f\x2e\x42\x05\x63\xd7\x4c\x37\x8b\x37\xba\x48\xfd\x55\x59\x6d\xcb\xd2\x00\xc5\x0d\x8b\xa3\xf3\x4b\x0f\xaa\xc7\xcf\x39\x18\xa6\x20\x38\xc9\xd8\xce\x22\xc5\xe8\x12\xd6\xce\xd1\xbe\xe0\x6a\xaf\xc2\x3e\xc0\x2d\x83\x15\x78\x05\xfe\xa7\x88\x8f\x9a\xaf\x59\x85\x3b\x3b\x90\x60\xae\xb6\x60\xbb\x3c\xf2\xfc\x7e\x12\xdd\x42\x87\x59\x9f\x09\xc8\x6a\x53\x96\x59\x6d\x81\xc7\x54\x40\x30\x40\xe9\x91\x8d\x59\x2e\x02\x4a\xb7\x64\x09\x48\x95\xc8\x7d\xab\x44\x36\x9a\x1a\x08\x75\x90\x30\xe7\x50\x2c\xd9\x87\xd7\x50\x53\x8a\x9d\x02\xfa\x07\x5c\xad\xf4\x85\xb5\x49\xb3\xed\x3a\x32\x17\x8b\xed\xfa\x06\x0d\x03\x4c\x01\xe0\x1c\x1d\x66\xf7\xfd\xa6\x45\x29\x0c\xce\x67\xdb\x96\x49\x4b\x9b\x1f\x6c\x46\x4a\x09\xb0\x45\x85\x06\x0d\x2e\x6a\x77\xd9\xf9\x45\x88\x6a\x08\x30\xcc\xf0\x47\x3f\x82\x54\x0e\xe5\x69\xab\xd6\x86\x7b\x21\xec\x78\x5d\xab\xdc\x2b\x8a\xd2\xf9\x9b\x9a\xba\xcc\xd8\x67\x13\xeb\xce\x59\x8b\x15\x2d\x4f\x3a\x2a\x2a\x5a\xf4\x64\x4f\xf8\x7c\x00\x1c\x1b\xd4\x1e\xac\xa0\xa5\xb2\x48\x71\xd4\xe3\xbe\xc0\x95\x58\x9a\x6a\x89\x01\xd9\xc4\xb9\x16\x50\x87\x49\xf6\x9e\x2c\xac\x8e\x0a\x23\xf1\x58\xb4\x25\x1c\x3a\x28\x30\x8d\x0b\x8f\x48\xf6\xcb\x2d\x21\xfc\xfe\x6d\x9b\x99\x5a\x99\xe2\xcf\x76\xb7\x16\x35\x61\xb0\x2a\xe9\x76\xe5\xd1\x40\x00\x8e\x59\x6f\x70\x4f\xdd\xec\x64\xff\x39\x15\xdc\xe5\xd3\x32\xc6\xa6\x51\x53\xf0\x5e\xe7\xf9\x8d\x5e\x7e\x19\xa8\xc5\x1d\x84\x8b\x9b\x0c\xb7\x62\xce\x44\x9d\xde\x8d\x51\x7f\xde\xa6\xb7\x6c\x9e\xc1\xf8\x82\xa0\x03\xb2\x2b\xa0\xb5\xe6\x2e\x1a\x3a\xf7\x1b\x07\x14\x04\x76\xc5\xd3\x3d\xc1\xd0\x86\xf1\xea\x8f\x95\xda\x61\x2e\x8c\xa9\xd7\x90\x4a\xdf\x6e\x8b\xfa\xd9\x43\x11\xd7\x63\x37\xed\x6e\xdf\x2a\xa0\xbc\xe7\x7e\x36\xcf\x54\x42\x6d\xd5\x16\xd7\xae\x8f\xa7\xb2\xe9\xdf\x20\x6a\x2c\xdc\xac\x3b\xd3\x6a\x65\x4a\x2c\x3d\x74\xbf\xf1\x85\xe9\xe1\x57\x02\xfc\xd5\x24\x77\x8c\x4e\x66\x09\xb1\x23\x4e\x56\xf3\xec\x33\xf8\xfb\xb1\xf7\x1b\x1f\x7b\xa2\x28\xe7\x4a\x94\x03\xf8\x75\x9d\x1a\xb3\x36\xa9\x0a\xfb\x42\xfb\xe0\x3a\x30\xf7\x81\x77\xa8\x89\xe7\x21\xde\xd7\xd2\x43\xdb\xbb\x4b\xa3\xf2\xfe\xdf\x6c\x9b\x62\x46\x49\x97\x50\x98\x41\xdf\x84\xa4\x44\xf4\x65\x30\xc1\xc3\x19\x4a\x9f\xd3\x5e\x67\x3f\xaa\x63\x15\xe4\x89\xe8\xe5\x05\x1a\xba\xd6\x16\xd3\xf0\xef\xaa\xe9\x0a\xfb\x32\x71\xb7\x72\xfd\xd2\x27\x82\x6c\xe1\x7e\x06\xfa\x8d\x67\xef\x05\x56\x73\x46\x7e\x25\xb4\x3f\x9f\x65\xaa\x74\x32\x67\xa1\xef\x90\x79\x81\x5f\xe8\x24\x97\xb2\xbb\x0f\x7d\xcb\xd1\xfd\x7a\x20\xf1\x90\xd0\x88\xc0\xcc\xe4\x11\x72\x1a\x12\x4d\x1e\x06\x16\x04\x11\xd8\xb8\xbd\x33\x79\xbc\xba\x80\x03\xc3\x9d\x77\xa9\x37\xf1\xdc\x7f\x7a\xfb\xce\xfd\xc3\x83\x95\x22\x60\x68\x9c\x42\xca\x2a\x8f\x33\xe0\xc6\xdc\x08\x23\x00\xe0\xa6\x95\x70\xf9\xab\xa3\x4c\x8a\x25\x15\xb6\xc1\xcb\x0e\xd3\x18\x03\x7f\x3c\x31\xd1\xd2\x16\x4b\x2a\xa0\x09\xe3\x4c\x23\x98\x30\x6a\x28\x01\x00\xc0\xb6\xb6\xe5\x2e\x6a\xf7\x13\xfb\x3f\x7e\x25\x30\xd2\x24\xdf\x0e\x39\xc2\xb3\x5c\x86\x14\x13\xe6\xda\x17\x9c\xac\x39\x4e\x8d\x8f\x4e\x79\xae\x2a\xbd\x5c\x6e\x4b\xbd\xdc\xf9\x2f\x31\x58\xcf\xbd\x2e\x7c\xdf\x94\x25\x58\x38\x6c\x26\x43\xa5\x12\x40\xde\x21\xbf\x89\x97\x0a\x1c\xec\x8f\xb8\x18\x14\x94\xec\x3a\x01\x78\x22\x97\x62\x22\x43\x39\x56\xcc\xc2\x06\x43\xb1\xcc\x8d\x96\x21\x11\x0e\xc8\xd1\xad\x48\x5b\x79\xad\x77\x14\x80\x92\xc1\x27\x3a\xb9\xa8\xba\xa1\xe9\x0a\x76\xcc\x54\x40\xfa\x7f\xc3\x75\x37\x50\xef\x31\x88\x99\x3c\xb3\x4b\x42\x3e\x1f\xd4\x04\x58\x0f\x65\x69\x0b\x37\x23\x95\xd4\xe2\x6f\x53\xef\x51\x36\x35\x5c\x59\xa2\x72\x04\x9a\x43\x23\x9c\x8a\x11\x26\xe6\x50\x8d\x3c\x07\xa9\xd2\x4b\x1f\x60\xa3\x01\x6c\x25\xae\x18\xc7\x43\x34\x98\xcc\x78\x15\x28\x64\x41\xbe\x1c\x76\x59\xba\xc5\x03\x5c\x10\x8b\xb6\xcf\xae\xac\xc2\x30\x5b\xd9\x6e\xef\xdf\x3a\x69\xf7\x1b\xfe\x0c\x5e\x32\xe8\xcf\x96\x47\x90\x0e\xf8\xed\x13\xc1\x8f\xe6\x7f\x4f\x8e\x5f\xbd\x7e\xfb\xba\xa9\xff\xfc\xfa\x7b\xfe\xf7\xf7\xf9\x01\xac\xda\x78\x3a\x9e\x0f\xcf\xd5\xe5\xf5\xbb\xf3\xc9\xc8\x73\x61\x78\x78\x5f\xa2\x4e\x7f\x54\xff\xb4\x2d\x8c\x3a\x3d\x3e\x7e\xdb\x82\xf6\xbd\x7d\x0a\xda\xf7\x0f\x77\x75\xbd\x51\x95\x12\xe8\xbe\x7f\xfc\x5b\xa1\xfb\x2e\x4b\xa3\xd7\x37\x39\xa6\x37\xf7\x03\xf5\x10\xff\x85\x6e\x8b\x87\x85\xe4\xc2\xc0\xac\x24\x5b\x17\x1e\x77\x5f\x80\x95\xc5\xae\x30\xd5\x83\xa8\x39\x4f\xb9\xe5\xbe\x03\x59\xd4\x8e\x2f\x92\xb2\x1e\x25\x28\xb1\xc4\x19\xb9\xaa\xc9\x07\xd4\x5f\x8c\xd2\x0f\x9a\x2a\x1a\x5c\xab\x52\xbb\x06\x9d\xa5\x3b\x7e\x12\xcb\xc4\xdc\x51\xc9\x09\x88\xb1\xa0\x9d\x55\xd5\xc9\x13\xb0\x44\x10\xff\xe3\x5c\x43\x6d\x03\x74\xfa\xe9\x17\xba\x9b\x55\x72\x5c\x69\xd6\x8f\x39\x3a\xa2\xe2\x1b\x05\x6c\xca\x59\x4d\xb6\x68\xd5\x90\x24\x84\x4b\x21\xcf\x21\xa1\xb2\xad\x9c\x19\xa7\x3e\x91\x68\xc0\xfe\x65\xc5\xe5\x7f\x8f\x74\xc9\x0f\xb8\xbb\x7f\xb7\x61\xc2\x40\x1c\x90\xd1\x96\x3a\xaf\x2c\xf3\x43\x86\x5c\x66\xd0\xf2\x81\x45\xe6\x06\xfe\x66\x07\x0d\xa4\xc4\xf1\x80\xa8\xd7\x0b\xba\xc2\x33\xb8\x32\xb0\x4c\x22\x90\x07\x59\x3b\x78\x01\xca\x41\x0f\x50\x0b\xad\x21\xf5\x1c\x75\x3e\x71\x7f\x72\x7d\x03\x12\xfb\x92\xc2\xfc\x34\xdc\x08\xea\xdb\x94\xd9\xd2\x0c\xd4\x6c\x5b\xee\xe9\x68\x7b\xb9\x84\x41\xf7\x65\x1e\x41\x3a\x2e\x4c\xa5\xd8\x5e\x61\x57\xc5\x73\x73\x48\x13\x5d\xde\xfa\xaa\xee\xb5\xca\x10\x53\xf6\x90\x55\x77\xfd\x24\xbc\x82\x90\x6e\xcd\x12\x22\x37\x48\xb7\xa6\x86\xad\x48\x5f\xd4\x45\x0d\xbc\x4f\xa1\x08\x45\x17\x72\xfd\xca\x4a\x2a\x37\xd1\x9b\xcc\x2c\x59\xf2\xdb\x99\x31\xa0\x66\xe4\xda\x19\xc6\xda\xcb\x8b\xb9\xc7\x39\x4b\xc1\x3f\x37\xb5\x94\x02\x05\x7e\x2b\xb7\x2b\x2d\x07\xe9\x71\xc2\x98\x77\xf1\xc1\xa8\xc2\xe0\x00\x6e\x4a\x73\x0f\x86\x26\xf2\x55\x01\xae\x32\x35\x58\xdd\x0a\xd2\x9f\xf0\x40\x36\xef\x4a\xa5\xab\x2f\xfe\x4f\x36\x78\x0d\x21\x29\x85\x09\xe9\x12\xb8\x20\x92\x30\x21\xc4\x9c\x1e\x5b\x5c\x6e\x22\xb2\x56\x15\x47\x4c\x00\x18\x15\x8b\xd2\x87\x31\x43\xaf\xb2\xfa\xa7\xf6\xf3\x20\x8e\x47\xa6\x8d\x58\x04\x8d\x54\xb1\xd7\x6c\x7a\xec\xf5\x98\x5a\xe1\xa1\x0f\x66\xf7\x6d\xa9\x6b\x74\x3b\xd1\x1d\x58\x19\x59\xb1\xb3\xd1\x55\xa5\x30\xe6\x57\xdf\xb5\xcb\xc6\xf4\xda\x37\xaa\x6a\xad\xa8\x54\x70\x1b\x37\x96\x76\x7d\x67\x76\xb0\xd1\x12\xbf\xfc\xc4\x92\x6b\x54\xa4\x0d\xd4\xb0\x48\x43\x93\xaa\x3b\xfb\x80\x0b\x9a\xd6\x07\x80\x41\x2b\x68\xe0\x0e\xd7\x10\x66\xde\x39\xbd\xea\x49\x19\xa8\x89\xd1\x19\x74\x79\xde\xb5\xaa\x08\x27\xf9\x60\x55\x55\x9b\x4d\xf5\x93\x3a\x3c\xf1\x7e\x75\xc8\xaa\xda\xa2\x31\xa9\x10\xc0\x39\xed\x53\x79\x22\xae\x38\xc1\x7d\x75\x9b\xdd\xf3\x72\xa3\xa4\x53\x04\x94\x75\x0f\x6e\xf2\xa8\xbf\xb4\x65\x58\x20\x1e\x18\xc0\xdc\x65\xa6\xac\x0e\xd0\xca\xc6\xe3\xed\x40\xa4\xb1\xe8\xea\xb8\x3c\x47\xbf\x26\x07\x50\x40\x0e\xe7\x38\x4f\x01\xc2\x29\x0b\x1b\xc8\x2d\xf0\xac\xc8\x1a\x47\xfd\x00\x6a\x14\x6f\x6c\x7d\x87\x07\x7d\xe3\x9d\x15\x14\x6a\xf2\xdb\xc8\x69\x60\x6f\xa9\x01\x8b\xad\xd4\x8d\x41\x9e\x35\x64\xee\x83\xc3\xc3\x79\xbb\xd6\xb7\x2a\x83\xb3\xf8\x26\x37\xeb\x2a\xa2\xfc\xe3\x7a\x30\x93\x82\xeb\x08\x3c\x82\xe8\x85\x51\x4b\x90\xa1\xd4\xdc\x67\x76\x5b\xf9\xf7\x0d\x5e\x2c\xec\x1a\x06\x0c\x09\x57\x1a\x47\xae\x3b\x1d\xb0\x53\x50\xb4\x5e\x55\x48\x8b\x5d\xd5\x90\x17\x2a\x55\xb9\x2d\x3a\xfa\xd0\x2e\xc7\xaa\x32\xac\xfa\x59\x3b\x97\xd5\x39\x7b\x04\xf2\x58\xeb\x62\xbb\xd2\xa0\x4e\x57\xf2\xb1\x56\xd9\x01\x56\x1b\xba\x71\x76\x57\x23\x64\xd9\x30\xbe\x05\xe5\xf8\x35\xf8\xb4\x1e\xaa\xab\xb3\xb5\x8a\x05\x83\x69\x16\xc4\x9d\xd0\x71\x0a\x63\x30\x0f\x85\x6e\x75\x9d\x2d\xd5\x06\x34\x1b\x43\xde\x51\xdf\x80\x7f\xe4\xbc\x75\xef\x65\xea\xd2\x68\x7a\x19\x52\xe6\xad\x88\x70\x18\x25\xb5\x2a\xaf\x00\xe0\xb5\x87\x37\xee\x4c\xa8\x4c\xbe\x73\x27\x0a\xda\x0b\x59\x85\x17\xf8\xb6\x20\xad\xaa\x9b\xdc\x44\x07\xe9\x03\xf1\xc8\x84\x99\x70\xc3\xd1\xd0\xf5\x70\x8b\x09\x21\x3e\x77\xd9\x4d\x46\xf0\x28\x92\x32\xa6\x85\x8a\xac\xfa\xd8\x52\xc0\x4c\x33\x8a\x1c\x57\x8f\x2e\xb3\xca\xeb\x05\xd6\x19\x0d\x31\x87\x2b\x80\x21\x18\xef\x0f\xf0\x57\xa1\xfc\x7d\x87\x11\x69\x67\x51\x61\xa3\x02\xbd\x1e\x1c\x81\x16\x6c\x56\x34\x87\x80\xbc\x0e\xa2\xbb\xcd\x85\xf1\xe1\xf2\x1c\x68\x6a\xdd\xbd\xc4\x37\x13\x9e\x31\x8d\x53\x1c\xed\xa6\x17\xef\x51\xa6\x2d\x21\xb9\x1a\x16\xf2\x83\x2a\x08\x88\x7a\xb8\x31\x02\xca\x4b\x0d\xa0\xb5\x1b\x01\x88\xa6\xca\xd0\x01\x06\xdf\x2a\x77\x3c\x6e\xf3\x34\xd8\xce\xb2\xa4\xba\x34\xee\x6c\x59\xd6\x91\xfa\x36\x04\xe7\xab\x58\xdc\xd9\x16\x0c\xcb\x3e\xe2\x18\x34\xb3\x5e\x57\x68\xaa\x67\x0c\x62\x41\x9e\x02\x0b\xe3\xc8\x00\x3b\x4d\x90\x77\xa2\x92\x01\xce\xeb\xe2\x16\x2e\x56\x5d\xc7\x22\xa7\x38\x3c\x3a\xb2\x0b\xd4\x12\xba\x00\x77\x46\x56\x87\xb8\x33\x2a\x74\x71\x2d\x09\xe4\x9e\xf9\xc6\x77\x73\x15\xce\x20\x5d\xb9\xab\xa6\x8a\x5f\x47\xa5\x7e\x37\x06\xf9\xa0\x61\x38\xfc\x6d\xcf\x6f\x2e\x6c\x01\x39\x0f\x2a\x9d\xc1\xb5\xdd\xcd\x83\x03\x21\x23\xbb\x69\x4a\xbe\x11\x51\xb0\xe4\x11\x26\xe0\xcb\xe0\x45\x17\x93\xe1\xbe\x82\x18\x49\x7d\xda\x43\x3b\x13\xe6\x30\xd4\x21\x3d\x59\xb4\xc4\x95\x35\x74\x5f\xf5\xd0\x6a\xc6\x32\x16\x7f\x8b\x1d\xe5\xd9\x17\xc2\x8b\x62\x75\x2d\xc7\xb6\xba\x7c\x23\x8a\xaa\xeb\x4a\x55\x66\x9d\xb9\xc1\xd8\x2e\x6b\xa0\x3f\xaf\xbe\xf8\x76\x07\xd1\x53\xd1\x6c\xac\x6a\xa6\x77\x42\x88\x0e\x0c\x76\x1f\x9c\xed\x52\x5c\x1b\xeb\x50\x58\x8e\x8e\x1d\xd2\x19\xe2\xdd\xd1\xdb\xd9\x6d\x6f\xe0\xb3\x17\xa6\x22\xea\x8f\x60\xa3\xf4\x18\x15\x25\x0f\x30\x5b\x2a\x5b\xde\xea\x22\xfb\x77\x21\x8b\x73\x65\x55\x0f\xaf\xd9\x1e\x6a\xae\x7c\x61\xad\x43\x2b\x6a\x77\x9c\x7d\x94\xea\x0d\x2a\xbb\x40\x70\x3a\xe4\x30\x1e\x08\xe6\xa7\xd5\x4a\x57\x77\x6e\x82\xf0\x22\xc4\x7a\x0d\xb6\x18\xc2\x85\x9f\x30\x87\x39\xea\x83\x18\x56\x63\x42\xe0\xab\xf9\xaa\x97\x68\x69\xe0\x29\x1e\x6a\x3f\xf0\x3d\x6e\x35\x83\x30\x8b\xa6\x76\x8b\xeb\xa9\xc7\x4d\x72\xb7\x7e\xc6\x9e\x11\xd8\x76\xf0\x5f\x3d\x46\x83\xf4\x5a\x9f\x0a\xb4\x24\xa1\xc0\xc4\x2b\xeb\x66\xd4\x5e\xa3\xb6\x85\x7f\x27\xcd\xb4\x78\xbc\xc7\x9a\xd4\x61\x21\xf8\x31\xf6\xb5\x40\xed\x61\x4e\x61\x8d\x20\x99\x2d\x5c\x7d\x19\xc2\x08\x03\x05\x97\x1c\xbc\x87\x70\x42\xa0\xc5\xcb\xa4\x25\x25\x55\xb6\x20\x66\x90\x84\x04\xf0\x12\x13\x08\xd9\x56\xbc\x38\x22\x7e\xf1\xe2\x80\xe6\xab\x59\x22\xc8\x37\xab\x15\x11\xbc\x12\xf7\xbf\xb7\xcb\xa8\x92\x1f\x78\x23\x0c\x4d\xd9\xa5\xa8\x63\x22\x64\x5c\xb5\xe7\xac\x38\x44\x5d\xdf\xd2\xf7\x52\x1e\x1c\x7d\x2f\xd2\x15\xc9\x72\x85\x94\x7a\xc8\x43\x39\x23\x07\xf2\xc8\x28\x5f\x0b\x73\xe5\xee\xca\x7b\x74\x24\x08\x5a\xe2\x27\x02\x0b\x8b\x1a\xb3\xe0\x53\x14\x68\x00\xf8\x2e\xc0\xb9\x60\x0a\xf7\x7a\x7e\xb4\xd7\x03\x23\xaf\x15\x24\x0b\xd0\x90\x47\x97\x63\xa0\x2e\xc0\x1a\x28\x6a\x53\xca\x2c\x93\x86\x3b\x2f\x28\xf2\x87\x11\x2d\x4c\x8d\x05\x4d\xf0\xb9\xc2\xfa\x8c\x33\x46\x27\xd0\x3a\xa6\xa8\x10\x36\x9f\x05\xd4\x87\x45\x78\xcf\xbd\xc1\x17\xc0\x2f\x56\xc0\xab\x87\x68\xc1\x0a\x74\xd6\xe1\xfa\x70\x13\x85\xd5\x12\x53\xe4\x15\xe8\x75\xc1\x57\xc1\x67\xa5\xb9\xd3\xf8\xc6\x22\xe3\x0b\x53\x2a\x8c\x39\xfb\x00\x56\x99\xd1\xb5\xf7\x70\x9c\xc3\xe0\xdf\x8c\xf1\x06\xff\xee\xb0\xd8\xb0\x2e\x34\x38\x0e\xb5\xc9\xf3\x8a\xd1\xc1\xe5\x93\x86\x3a\x1d\x3b\x87\xb4\x5c\x3b\x3a\x21\x12\x42\x52\xc2\x90\xfd\x7f\x3e\x5c\x3d\xd4\x1a\xab\xcd\xcc\xbe\xc2\xc9\x84\x04\x62\x1e\xe0\x26\xca\xcc\xc3\x1e\xf1\x3d\x30\xc6\x6a\xd2\x05\xc0\x69\xa0\x24\x50\x05\x0c\x04\x18\xdd\x81\x3e\x2e\xed\x7a\x0d\xd9\x02\x77\x30\x6f\x08\xcf\xcc\xb7\x8c\x56\x6b\x53\x6c\x13\xf4\x5b\x71\xc0\x55\x56\x9b\x35\x9b\xab\xf0\xa4\xb5\x31\xe0\x8f\xba\x53\xb1\xcc\x6a\x53\x72\x41\xe2\xc9\x40\x2d\xd0\x8d\xf4\x95\x8c\xee\x30\xed\x09\xdf\x92\xeb\x3d\xe5\x59\x84\x17\xff\xca\x94\x94\xfa\x58\x47\x67\x3c\x84\xa7\x70\x53\xae\x9b\x74\x89\x59\x3d\x50\xbd\x59\x28\x55\xed\x89\x8d\xe5\x2c\x0b\x7a\x31\x3f\x53\x47\x87\xee\xc2\x19\xa1\xba\x4c\x41\x9d\x0b\xc6\xac\x27\x55\x6d\x79\x1c\x71\x33\xe2\x61\x4c\xb8\xea\xd5\x2a\x03\x23\xab\xe2\x27\xf8\x82\x8c\x9d\xd2\x6e\x5f\xda\xdb\x02\x44\xab\xf8\x03\x95\xba\xb1\x29\xe4\xe7\x3c\x88\x8c\x95\x16\xfc\x8b\x2a\xa6\x01\xe4\xfc\x4f\x94\x28\xc4\x73\x7d\xed\x46\x21\xd7\xc5\xed\x16\x84\x51\x6c\x11\xea\x49\x1f\xb2\xd4\xd9\x6b\x60\x6a\xe9\xb5\x2d\x6e\x85\xcf\x0a\xdd\xf6\xa4\xe5\x80\x91\xc2\x47\x84\x29\x5a\x80\xdb\xa2\xce\xb3\x9b\x52\xbb\x13\xad\xe7\x2f\x46\x77\x22\x07\xfb\x41\xe8\x52\xc3\xd5\xd1\xba\x56\x91\x41\x46\x08\x29\xe2\xee\xd4\x7d\x0c\x9d\x22\xeb\x24\x0f\x42\x01\x15\x9e\x7e\x7e\x36\x7a\xf9\x45\x63\x89\xad\xba\xd0\x7f\xb6\xa5\x1a\xb1\x7a\x35\x1a\xc1\xde\x09\x82\x80\x9f\xb7\x06\x74\xdd\xfe\xb8\x26\x1d\x67\x00\x08\x55\xc8\xcb\xe1\x5c\x8d\x02\x71\xdc\x21\x51\x05\x0d\x26\xdf\xaf\xeb\x41\x58\x87\xe0\xd1\x99\x4a\xab\xf6\xc2\x81\x09\x23\xd1\x90\xa2\x09\x55\x75\x8b\xa6\xfb\x36\xe9\x22\x41\x19\xb8\xa5\xd9\x68\x44\x2f\xf1\x74\xf3\x80\xe7\xfa\x5a\x27\x5e\xdd\x7e\x0d\x1f\x75\x46\x1a\x78\x5c\x41\xef\x5b\x1d\x7e\x31\x65\x61\x72\x77\xbe\x17\xa9\x7d\x20\xcf\x94\x00\x99\x56\xd9\xa2\xef\xfd\x6a\xe6\x9f\x74\xab\x05\x0b\x10\xf0\xc3\xea\x30\x83\x44\x7a\xdf\x5d\xc6\x5c\x6a\x6d\x5a\x8b\xa2\xdc\x16\x58\xb0\xa1\x99\x25\xa5\xf4\x36\x3f\xd3\x79\xf1\x50\x13\xea\x2d\x2a\x30\x87\x3d\xb0\x29\x4d\x2d\xbe\x57\x6e\x0b\x88\xc0\xf0\x02\x1d\x45\xe0\x5b\x3c\x66\xa2\xc3\x24\x2b\x5a\xb4\x2c\xa2\x82\xbc\x11\xe2\x12\x9e\x22\xfa\x5d\x35\x64\xfa\x21\x0c\x41\x6b\x07\x73\xb0\xcd\xbe\xf6\xa1\x61\x75\x43\x1c\x9c\xd0\x86\x14\x38\x0a\x5d\x0d\x19\xe9\x6a\x59\x66\x9b\xba\x62\x61\x89\xd2\xe6\x8c\xb9\xf6\x36\x83\x2c\xab\xae\x45\xe1\x6e\x11\x28\x4e\xdc\x53\x0f\x2a\xd5\xdc\xac\x30\xa6\x4d\xff\xb1\xb6\x16\xad\x6f\xfa\x43\xbe\x13\xcb\x30\x8a\x0a\xf3\xca\x2d\xc9\x53\x13\xe6\x66\x56\x30\x1e\x1f\xe1\x13\x71\x8b\xc5\x9e\xe4\x12\x84\xa6\x89\x8e\xa1\x2c\x1f\x30\xed\x9a\xc5\x70\xeb\x0b\x1b\xc2\x7b\x67\xc4\x59\x25\x80\x35\xb0\x57\xf9\x64\x87\x3f\xca\xcb\x39\x70\xc4\x36\x76\x16\x66\x64\x52\x95\xf3\xa8\x61\xea\x6c\x57\xe8\x35\x55\xe1\xe5\x59\xf1\xc5\x40\xe5\x9c\x1f\x19\x5f\x27\xc6\x6e\x00\x6f\x15\xf8\x82\x0c\x6c\x51\x18\x2e\x5c\xa5\xc0\x52\x54\x67\x6b\x67\x80\x00\x22\x3f\x14\x4f\xc4\xaa\x33\x6a\x95\xdb\x07\xaf\x7e\x81\x63\x2c\xdb\x20\xd2\x5f\x4c\x83\xe0\x47\x97\xb7\x47\xe7\xb8\x42\x94\x5e\x2e\x21\x6f\xef\x73\x58\xb6\xac\xa8\xf2\x8d\x37\x41\xa3\x2e\x11\xbd\xb0\xf6\xbb\xbb\x5e\xf7\x78\x5b\xe2\x8d\xda\x3c\xf4\x30\xf2\xa2\x6b\x0c\x70\xfb\x9e\x9d\x0e\xd4\x3b\x5d\x65\x4b\x41\x7c\x80\xee\xa3\xa0\x2c\x66\xe1\x9d\x2e\x31\xcf\xd2\xf8\x3f\xf3\x12\x01\xdd\x25\x84\x00\xc6\x41\xe5\x4b\x8e\xd3\x43\xa8\xd5\x19\x80\x02\x4f\x29\x94\xa8\x91\x29\xc4\x44\x91\x09\x0d\x80\xc3\x7a\x10\xcb\xa7\x98\xaf\x1b\xa8\x57\xc9\x03\x36\x0d\x22\xde\xdb\x82\xeb\x74\xe2\x70\x34\x1f\x2c\x6d\x6f\x0f\x7d\x52\x62\x73\x80\x39\x29\xb7\x45\xc1\xec\x57\x82\x79\x03\x2e\x08\xa1\x13\x15\x49\xea\xe5\x3b\x95\xe1\xf4\xe1\x93\x12\x62\x4f\x61\x9e\x3e\xb8\xed\x20\xe8\x95\xd5\x40\x80\xa9\x1b\x1c\x09\xb1\xb0\xbc\xc4\x99\xc8\x48\xbe\x5d\x29\xa8\x93\xd9\x22\x19\x32\xae\x9e\x50\x48\x11\xcb\x49\x45\x45\x53\x8c\x21\x62\xd2\x29\x24\x24\x74\xc3\x42\x1e\x00\xd1\x5a\xc8\x56\x89\x2c\x48\xa0\xac\xbb\x37\xbb\xe0\xc5\x8a\x79\xaa\xac\x02\xea\x16\x4d\x2d\x8e\xc8\xf1\x00\xa5\xc6\x99\xd7\xac\x40\x89\x8c\xc0\x80\x45\xb6\x7a\xe3\xdd\xd6\xa7\xbe\x98\xca\xd9\xe6\x51\xe5\x2a\x69\x5d\x40\xfa\x04\x1c\xb7\xd8\x86\xf5\xf8\xdd\x1c\x5d\x8c\x9d\xdd\x26\x04\x1e\x05\xda\x40\xcc\x1f\xd6\x77\x6a\xa5\x97\x9c\xa3\x5a\x61\x98\xbc\x08\x27\x32\x85\x8a\x22\xbd\x74\xa2\xb3\x00\xd6\x07\x1f\xd9\x8e\x39\x2a\x7d\x4e\xbb\x08\xfe\x1d\x5c\x96\xee\xcc\x2a\x33\x34\xcc\xe8\x7c\x8f\x07\x18\x8e\x2d\x3f\x71\x6e\x65\x60\x64\x72\x5b\xf9\xb0\x8a\x6c\x63\x73\xca\xa8\xa7\x98\x5e\x42\xb2\x34\x39\x10\xc8\x08\xc2\x8a\xde\x89\x24\x03\xa3\xd2\x1d\x8a\xf9\x79\xad\x79\xb7\x81\x8c\x07\x7f\xca\x08\xf6\x1a\xf7\x0b\x7b\xf5\x18\x14\xa3\x0c\x1d\x3c\xd1\xf7\xc2\xa4\xa1\xdf\x76\x5b\x73\x82\x21\x63\x6d\x40\x12\x4c\x62\x3e\x39\x58\xa9\x23\x3f\x6c\xa1\x62\x89\xe4\x07\x23\x59\xc6\x08\xb9\xe1\x96\x88\x20\xb6\x8b\xc8\x40\xe9\x6c\x81\x9a\xb0\x81\x5a\x48\xf1\xb3\x18\x9f\xf1\xb3\x27\x53\x3a\x39\x26\x50\x24\x08\x54\x79\xc8\x99\x47\xf0\x87\x2c\xc6\x35\x66\x31\xd0\x13\x27\xb0\xdb\x7b\x37\x3a\xc3\xa2\xce\x8e\x46\xd0\x62\x2e\x14\x3a\xa7\xbd\x38\xb5\xf1\x09\xd3\xc4\x28\xf3\x7d\xef\x2c\x25\x8f\x0f\xf6\x6a\x40\x00\xd5\x58\x1b\x0d\x89\xc8\x30\x44\x0d\xe0\x37\x29\x42\xc3\xb2\x11\xc2\xb4\xf4\x79\xe7\x03\xe5\x46\x9d\x9c\x78\x64\xd9\xe4\x72\x26\x4e\x0d\xc2\x8c\xeb\xd4\x6e\x88\x54\xfe\xf4\x58\x9d\x99\x25\x96\x87\x9c\xfc\xf8\xe3\x9b\x44\xca\x1e\x41\xe0\x95\x57\x08\xaf\x54\x0a\xd3\x43\xec\x30\x1a\x06\x4e\xdd\x50\x1f\xf0\xf6\xf9\xc4\x44\x33\x74\x26\xe8\x0e\x82\x18\x00\xc9\xa2\x3a\x2b\x66\x1e\xed\x03\x82\xb3\x57\xb6\xbc\xc9\xd2\xf6\x6b\x3a\xc7\xac\x6a\x84\x18\x10\xfd\x1c\x7d\x35\xab\x68\xe0\xf1\x34\x25\x84\xb3\x40\x55\x76\x49\x1f\x77\xc0\x8f\xe3\x2e\x68\x4a\x00\x33\xd8\x11\x7a\x82\x1a\x44\x74\x5b\xc1\x1d\xc6\x0e\x03\xda\x33\x51\x08\x5e\x7a\x57\x14\x58\xd0\x98\xb0\x41\x7d\x24\xf0\x1d\xa5\x20\x2d\xd9\xb6\x60\x95\x10\x93\x26\x26\x47\x83\x1a\xfe\x01\x0d\x66\xa0\x0c\xf8\xb6\xd1\x64\x68\x74\xd8\xb6\xbf\x30\x5c\x6a\x84\x41\xb4\x48\x95\x19\x67\xb7\x13\x51\xe5\xed\x85\x83\x2a\x32\x66\xf0\x66\xf1\xa1\xb9\xac\x4e\xb8\x44\x01\x0b\x12\xba\x0f\xe9\xa2\xda\x64\xcb\x2d\xa6\x57\xc1\xfc\x08\xb1\xab\x3c\x88\xe4\xd9\x82\xd9\x80\x01\xf6\xf5\x68\x84\xeb\x67\xf5\xc5\x98\x8d\x9b\x31\xbd\xc4\xf0\x39\x33\x7a\x36\x78\xce\xe4\x8d\xce\x15\x89\xb6\x38\x62\xcb\xe4\xde\xe7\x62\x52\x72\xdb\x91\xdb\x88\x8c\x70\xcf\x5f\x14\x01\x74\xdd\x48\xec\x6f\x00\x33\xa1\x07\x60\xb2\xd4\xae\x86\x8a\x4c\x64\xab\x04\xad\xcf\x80\x7f\xe8\x0e\x7c\xc5\x64\x6c\x71\x00\x3c\x68\xfa\x51\x49\xd8\x0e\x41\x42\x88\x7c\xa6\xff\x76\x77\x51\x18\x56\x39\x29\x60\x45\xf0\x46\x00\x6e\x4f\x40\x19\x90\xb6\xb6\x00\x9c\xef\x64\x31\xab\x07\x75\xb0\x6c\x7d\x58\x6c\x17\x6c\xd6\x91\x4d\xfc\x8b\x4f\x99\xb7\x57\xdd\x23\xc1\x7d\x0f\xf3\x6e\x85\xc3\x02\x75\x76\xe0\xea\xf5\x5f\xa2\x90\x0b\xc7\x5a\xe4\xaa\xed\xd0\x23\xe4\xa9\x7d\xdd\xb5\x62\x29\xad\x65\x6a\xae\xe6\x44\x60\x48\xb8\xc7\xb8\xde\x5c\x23\x95\x29\x06\xfb\xdc\x65\xbf\xd4\x25\xe6\x5b\x29\xb6\xd8\xb9\x2a\x3d\x48\x07\x3c\x50\x8a\xe5\x10\x96\x43\x03\xe4\xec\x5e\x17\x35\x94\xc2\xf8\xe2\x81\x5f\xf5\x22\x4c\x9d\x7b\x0c\x5b\x97\x0b\x41\x7b\x42\x1a\xfb\x69\x10\xad\xf6\x1b\x80\x8c\x63\x41\x87\xc5\x3d\xa8\x08\xc7\x13\xfe\x20\x08\xbe\x5f\xbb\x59\xeb\xed\xd9\x29\x3d\x0f\xa8\xef\x07\x5c\x8f\xd4\xa5\x27\x85\x69\x3a\xb1\x45\xc8\xad\xa3\x23\x98\x11\xb4\x85\x71\x9f\x71\x76\x21\xba\xdb\x36\x12\x42\xe5\xb0\xff\xa0\x43\x07\xb2\x66\x34\x01\xee\xf5\x24\x62\xaa\x8e\xef\x74\x71\x2c\x34\x44\xef\x7d\xf9\x1c\x34\x54\xde\x11\x89\x17\x93\x71\xee\x08\x38\x9b\x09\xd5\xd6\x83\xd6\xb9\x33\xa5\x11\x68\xb4\xc3\xc0\x3a\x84\x0a\x4d\xda\x68\xaa\x3b\x38\x20\x70\x1f\xbb\x56\x72\xd4\x7c\xe2\x30\x20\x19\x35\x95\x4c\xc7\x61\x17\x5f\x98\x84\x20\x87\xf0\x40\x42\x7d\x01\xa2\xa2\x32\x1b\x5d\xe2\x39\xed\x19\xec\x32\x5f\xd3\x92\xf6\x39\x2e\x0f\x6f\xbd\xd3\xd5\x23\x89\x93\x8a\xd8\xde\xd1\x2a\xc6\x54\x86\xda\x9b\x42\xf9\xd9\x8d\x87\x27\xe1\x13\x3b\xbd\xf5\x16\x11\x61\x26\xec\x00\xd7\x7d\x3c\xfe\x06\xba\x84\xa1\xe5\x3e\x94\x00\x3e\x0c\xd8\xd5\x08\xac\xc1\x58\x3a\x46\xfd\x02\xfd\x49\x6c\x33\x62\xc6\x0d\x2b\xeb\x69\xb8\x28\x8d\x16\x24\x36\xc9\x85\x89\x83\x49\x58\xcd\xea\xd5\x6b\x45\x01\xa0\xf2\x3c\xf1\x4d\xab\x25\x7e\xc2\xd2\xae\x6f\x20\x32\xcf\x19\x4e\x4f\x78\x60\xf1\x24\xd4\x58\x2f\x5c\x06\x9c\x5e\x86\xa2\xa0\x85\xd2\xc0\x86\xb2\x26\xfe\xcb\xaa\xb6\x25\x31\x49\x44\xf9\x44\xbe\xd7\x45\x8a\xb8\x50\x3d\x7d\x7b\xeb\x16\x6f\x6d\x7a\x3c\x3b\x72\x88\xa0\xf3\x75\x15\x31\x0c\xfa\x82\x14\x6a\x39\xc7\x41\xd1\xce\xaa\x51\x3b\x04\x76\x42\x19\x5b\x41\xb6\xf5\x7c\xb6\xa2\xd4\x8d\xd9\x59\x18\x12\x0a\x62\x85\xb4\x3c\x39\x62\xe8\x94\x0c\xd4\xa4\x00\xef\xab\x73\xf6\x60\xab\x28\xdf\xa1\xb0\x43\x90\xde\xb1\x75\xca\x48\x4b\xa0\x23\x74\xe4\x1f\x04\x4b\xe7\x8d\xbc\x1f\xa7\xb6\x38\xa2\xab\xf1\xbd\x2d\xd7\x7b\xee\xc5\x66\xe3\x5a\x41\xdf\xfd\xb7\x59\xa5\x5e\xc3\xd8\xff\xb0\xf7\x52\x13\x19\xb9\xb5\x5e\xde\x65\x85\x39\x2a\x8d\x4e\x35\x32\x57\x76\xc4\xb5\x3a\x5e\xd6\xd2\x62\x76\xa7\xae\xbf\x24\x1f\xf4\x4e\x5e\x8f\xa3\xf0\xc2\x38\x22\x0e\xb7\xbc\x59\xdf\xd8\x14\xe3\xb0\x90\x93\xbb\xdb\x55\x60\xd0\x12\x06\x4b\x16\xca\x8a\xbf\x76\xac\xcf\x7e\xe2\xa5\x67\xb2\x40\xc2\xd2\x1d\xa9\xcb\xbe\x12\x77\x05\x54\xed\x42\xf8\x8b\x9f\x4c\x55\xb5\xcb\x6d\x55\xdb\x35\x66\xfc\x61\x9d\x46\x38\x7f\x38\x6f\x88\xe0\x3b\x5c\xcf\x7f\xb3\x8e\x6a\xf5\x50\x3a\xc7\xbb\x40\xfb\x2d\x51\x58\xd2\x0a\x76\x5a\xad\xdc\xd5\x0f\x34\x51\xc6\xa0\xa0\x35\x2c\x10\xf1\x91\x4a\x86\x8c\xd8\x04\xdc\xe0\x15\x54\x22\xaa\x19\x87\x43\x98\x86\x18\x0c\xc2\x48\x04\x34\x7f\x6d\x53\x93\xc3\xe5\x77\x4b\x6e\x21\xdf\xc4\x74\xfd\x92\x99\x20\x47\x86\x52\x8e\x00\x84\x8d\xb4\xf5\xf6\xc7\x57\x7d\x9e\x23\xb0\xd6\x13\xd6\x0a\x5a\xc1\xa9\xc2\x3d\x21\xc2\xe4\x37\x9a\xf4\x84\xd3\x97\x60\x5f\x17\x56\xad\x2d\x26\xe9\x29\xac\x83\xd5\xc6\x84\x02\xc1\xc4\x34\xbf\x2b\xdf\xc5\xe9\x06\x4c\x78\xd1\xf1\xe0\x8d\x56\x58\x31\x87\xa7\x7d\x81\x20\x25\xe3\x7d\xdf\xe0\x38\x63\x58\x33\xe0\x01\x53\x82\x30\xfb\x85\x25\xe7\x40\x98\x5a\xb4\x50\xc5\x59\x19\x3b\x7e\x72\x8e\x5a\x3a\x1d\x26\x5e\x6c\x64\x94\xdf\x53\x2c\xa9\x3b\x6e\x8e\x16\x8c\xce\x6b\x53\x16\x58\xa8\x07\xff\x84\x30\x0f\x86\x6d\xed\x72\xa9\x2b\x66\x58\x21\xf6\xe1\x50\x79\x9e\x93\x9b\xc2\x11\xde\x98\x4d\xb7\xab\xc5\x78\x09\xfa\x0d\xd1\xf4\xea\xb6\x37\x6c\xc1\xbd\xb9\x11\x96\xcc\x9e\x1d\x7c\x43\x8e\x11\xec\x4d\x9c\x10\x1a\x6f\x4c\x8f\x40\x40\x0b\x15\x17\x0f\x9b\xd8\x77\x1c\xfc\x3e\xb5\x1f\x46\x4c\x50\xee\x84\xe9\xdd\x3b\xb3\x2c\x47\x01\x69\x03\xbd\x8b\xf8\xde\xe0\x97\xf8\x62\x9c\x6a\x26\xa4\xa3\x29\x87\xab\xc5\x1b\x36\x64\xa1\x47\x88\xfb\xa7\xd6\x55\xc3\xf7\x14\xa3\xe2\xf1\x18\xf8\x7e\xf9\xa4\xe8\xf4\xab\x5a\xcb\x32\xd9\xff\x3a\x02\xd7\xe1\x2e\xcd\xdc\x68\x41\x4c\x08\x57\xf3\x21\x86\x62\x70\x5b\xc3\x51\xe5\x06\x38\x84\x4f\x76\x7d\xa6\x32\x81\x33\xaa\x92\x03\x4d\x48\x29\x11\x64\x16\x17\x24\x7a\xbf\x19\xe9\xc0\xe4\x46\x8b\x28\x6c\xa5\x0a\xf3\xd5\x87\x90\x64\xcf\x2a\x0d\x4f\x44\x88\xb2\x33\xb6\x32\xca\xca\x75\x6f\x81\x79\x64\xe9\x83\xc1\x42\xfd\xba\xb3\x15\x15\x3f\x74\x7d\x33\xa1\xd5\x8e\x22\x9f\x18\x3c\x44\xbb\xc9\x14\xa1\xfa\x01\xfd\x3c\x91\xfd\x8c\x0f\xf6\x90\x0b\xae\xdc\xf2\xc4\x0c\x6e\x15\x39\x6d\xbe\x64\xde\xec\xdd\x07\x28\xbe\xb1\x31\xa6\x3c\xaa\xed\x91\xfb\x7f\x04\x54\x79\x08\x5d\x34\xa2\x59\x81\x8e\x38\xd5\x3b\x03\x48\x03\xc7\xaa\x23\xb5\xdc\xb9\x1a\xa2\x00\x5b\x69\xd4\x8d\xc1\x43\x72\x05\x67\x3b\xd7\x70\x33\xd7\xb3\xa7\xc7\xf1\x47\x1e\xbb\xb0\x62\xb7\xa7\x64\xce\xa3\x95\x0e\x97\x40\xac\x87\x22\x1a\xe6\x6c\x75\xc8\x54\x8a\x38\x42\xe6\x05\x39\xd2\x10\x80\xe8\xde\x39\x6e\xe1\x47\x69\xec\x5d\x12\xf6\xa2\xd0\x27\x8d\x93\x13\xad\xd3\x4c\xc0\x79\xae\x9d\x33\x75\x89\x57\x1d\xd0\xae\x47\x17\x68\xcf\x2b\x96\xd0\x6d\xd8\x63\x67\x23\x20\x86\x6a\x5d\x20\x47\x39\xd6\x89\xa3\xf9\xb1\x31\x65\xbd\x93\xc0\x13\xe2\x24\xf7\x57\x20\x7f\x38\x51\x2b\xbd\xce\x72\xac\xc2\xbf\xb3\xdb\xca\xdc\xd9\x3c\x15\xdc\x9c\x7c\x69\x71\x12\xd6\x67\x8f\xe1\x1e\xcd\x53\x42\x4d\x32\x6d\x28\x62\x19\x01\xab\x9d\x3e\x18\x08\x8f\x03\x15\x4d\x6a\x90\x43\x88\xb6\x17\x02\x0f\xfd\x1d\x4f\x6c\xfc\x71\x5f\x13\x95\xda\xed\x4d\xbd\xda\xe6\x00\x3b\xaa\x42\x14\xbf\x34\x95\xcd\xef\x71\x98\x57\xfa\xde\x12\x3d\xca\xbd\x71\xbe\x0e\xe6\xee\x9b\x38\x24\x78\x8d\xbf\x5f\xc0\xc0\x12\x1f\x70\x8e\x47\xa2\x7a\xd1\x30\x45\xb0\xe4\xa0\x6e\x50\x12\x89\x6b\x00\xe3\x68\x90\x66\xaa\x2a\x51\x10\xd1\x0c\x02\x70\x02\x76\xeb\xff\xd5\x78\xb9\xb2\x9e\x3b\xc4\x5d\x08\x99\xc4\xad\x34\x3f\xaa\x97\xf5\x96\x5b\x89\x13\x84\x3c\x9e\x70\x43\xc1\x62\xde\x60\x60\x9d\x8b\x30\x84\x35\x35\x50\xc3\xc7\x07\xbd\xd1\x70\x9e\x2a\x69\x90\x39\x4f\x5d\x54\x4b\x44\x6c\x32\x59\x91\x6e\x9d\x75\x8b\x23\x55\xd8\xe2\xc8\xbf\x00\x5b\xbb\x2d\xe0\xd1\x70\x97\x03\xbd\x88\x67\xc4\xc0\x6d\xe2\xac\x01\xb7\xc0\x20\x44\x88\xf1\x28\x43\x20\x40\x3f\x74\xd4\x15\x52\x2e\x00\xf4\x0b\x2e\xbc\x49\x81\x52\x66\x00\x6f\xc6\xbb\x5a\xee\x2f\xb1\x69\xd6\xa6\xbe\xb3\x29\x5e\x18\x4b\x93\x6e\x4b\x20\xd6\x81\x02\x21\x42\x7c\xab\x2f\x66\x87\xa3\x8b\xa7\x5d\x16\x9e\x1d\x18\x0f\x44\x15\x10\x70\xb4\x02\xea\xc6\x74\x97\x02\xb5\x7d\x40\x58\x3a\x51\x03\xc9\x04\x69\x7e\x5f\x79\x0d\x89\x6e\x43\xcc\x44\xad\xc3\xf2\xb7\x2d\x68\x47\x37\xef\x14\x4a\xdc\xd5\x59\xb1\x75\x07\xc1\xb6\x80\x33\x94\xec\xd4\x10\x9d\x75\xdb\x3b\xbe\xf0\xb3\x02\xce\x60\x0d\xa5\x34\x50\x4c\x61\x88\x60\xa7\x36\x25\x1e\xde\x84\x70\xc9\x51\x17\x1b\xfd\xec\x28\xb9\xe2\x16\x8e\xd7\x84\x86\xe9\x8b\xf5\x0b\x1a\xf8\xaa\x26\xb8\x94\x0f\x7c\x72\xbe\xdc\xeb\x30\x47\x26\xc1\x2d\x2b\x2a\x2a\x45\x8f\x4c\x0e\x6e\x80\xd8\x08\xe3\x1c\xab\x9a\x74\x15\x32\x82\x78\xfd\x69\x7e\x95\xd8\x87\x04\xbc\x58\xc9\xe0\xa3\xa8\x8a\x71\x1f\x89\x26\x33\xab\x3c\x36\x59\xdc\x6d\xde\x52\x23\x94\xd2\xc6\xd4\x5b\xe2\x1b\xa2\x20\x3c\x78\xb2\x80\xf8\x38\xec\x0c\x25\xc6\x2d\x84\xea\xb8\x52\x2f\x6b\x53\x66\xff\x4e\x90\xdd\x3d\xd7\x17\xf6\x3b\x0e\x19\xf3\xa0\xc2\xa2\xb9\x31\x5d\xfe\xf6\xbe\x2d\x36\x50\xef\xb6\x94\x8c\x91\x81\x62\x1f\x69\xa1\xda\xe9\x95\x2a\xe8\x4e\x73\x53\x5d\x10\x47\x88\x30\xf1\x88\x65\xb5\xa2\x04\x0b\xd2\x92\x88\x9d\xd5\xb9\x24\x29\xb9\x10\x0d\x38\x80\xdf\x3c\x68\x2b\x8a\x5f\xc2\xb2\xa3\x07\xe2\xbd\x31\x9f\x5d\xf4\x3d\xf8\x47\xb6\x5f\x38\x3f\xfb\x7a\xde\x86\xb9\xe9\xe6\x23\x78\x93\xc9\xc7\xb1\xa3\xed\x6c\x44\xc0\x73\x73\x26\x06\x96\xf1\x76\x93\x42\x65\x96\xc0\x1c\x21\x29\x94\xdf\x35\x7e\x1c\x4a\xd1\x15\x9a\x24\xbf\xac\x12\x5e\x49\xed\xf5\xc8\x8b\x39\x7b\xea\xa1\x03\x35\xf4\x4e\x4c\xb0\xf4\xc9\x90\x4f\x0d\x2c\x8e\x07\xa6\xb7\x8b\xb6\x78\x56\x57\x26\x5f\x79\x48\x02\x67\x06\x53\x77\x90\x19\x84\x14\x21\x3d\xb3\x3b\xeb\x43\x16\x16\x77\x0f\xbf\xc8\x96\x2c\xe3\x42\x69\x88\x6d\x4e\xb8\xb7\x4d\x69\x6b\xbb\xb4\x39\x97\x55\x49\x68\x9a\x5e\x96\xb6\xaa\xe4\x83\x08\xec\xf0\xc8\x4e\xc0\x33\x61\xef\x34\xb3\xed\xdb\x72\x36\x3b\xb7\x0e\x96\xf5\xc0\x97\x7d\xd0\x22\x30\x4d\x13\x83\x85\x49\xb1\xea\x9e\x32\x10\x4d\xd4\xed\x37\x40\x6e\xc9\xff\x24\x4d\x17\x74\x03\x0b\xeb\x4b\xe9\x36\xba\xaa\x1e\x5c\x83\x6d\xe9\xae\x32\x3c\x18\x8b\x8d\x5e\x7e\x81\x1c\x76\x69\x74\x4a\x38\x02\xf2\xa3\x60\xb4\xde\x0e\xa4\x72\xcf\x95\xe1\x78\x66\x6f\xd8\x25\x90\x45\x9a\xc1\x02\xc4\xe2\x96\x38\x21\x8e\xf7\x23\x77\x6e\x76\x8c\x6c\xf1\xd2\x73\xe4\x7d\x43\xcc\xb1\xc4\xd0\x4b\xd0\x62\xf5\xba\x7e\xdd\x8d\x08\x72\x8f\x22\x9b\xc3\x08\x04\x4c\x36\x71\x92\xc1\x5b\x90\x00\xbf\xc0\x02\xb1\x50\x86\xbb\x53\x0f\x58\x8c\x22\xe1\xde\x32\xd2\xd4\x51\x39\xe1\x53\x3b\x18\x7c\xeb\x64\x98\x72\xd7\x5c\xa7\xc0\x58\x45\x67\x24\xc3\xbc\x25\x0c\xd5\x67\x40\xa9\x3a\xb1\xac\x79\x03\x82\x0d\x2f\x32\x38\x7c\x9a\x43\x99\x6b\x78\x36\x26\x87\x3a\x06\x81\xd1\x62\x52\x22\xac\x05\xb4\xb0\x5b\x36\x05\xb9\xd7\xdd\x3d\xd8\x0b\x2d\xc1\xd8\x52\x17\xc8\x04\xa8\xb1\xa8\x8e\x1e\x4b\x39\x58\x93\x48\xea\x62\x37\x06\x8a\x1c\x33\x5d\x53\x85\x8f\x3b\xe4\xc0\x58\x12\x24\x81\x59\x3d\x50\x87\x7b\xd6\x08\x8d\x1d\xc7\xb9\x02\xf4\x95\x72\x35\xf6\x81\x5a\x01\x2c\x80\x9e\xba\x01\x1d\x8f\x07\xee\x5f\x03\x2a\x3d\xe8\xfb\x40\x3f\x45\x6c\xba\x5f\xee\x0e\x09\x3a\x11\x13\xca\xc4\x52\xb8\x83\x54\x21\xe4\x10\xc5\xe8\x35\x48\xd7\x31\xe9\x01\x44\x61\x3b\xf1\x13\x9b\x58\x63\x6b\x6a\x6b\x37\x89\x50\xc8\xc1\x08\x32\xe6\xa2\xe1\x42\xe5\x56\xcc\x1f\x4b\x56\x08\x4b\x06\xb9\x85\x34\xed\x6a\x20\xcf\x21\xa0\xec\xc9\x64\xde\x2f\x57\x57\x79\x27\x89\x9f\xdd\x7f\xde\x29\x81\x07\xad\xfb\x93\x48\x3c\x30\x1d\x20\xb8\x91\x8c\x63\x00\x9a\xf4\x35\xe2\xa2\xf2\x8c\x2d\x08\x1f\x6b\x62\x44\x70\x77\x6e\xe5\xe4\x07\x38\x46\x4f\xde\x34\x1b\xf0\xb3\xb2\x65\x48\x04\xcc\x7d\x99\x26\xd1\xb7\xfa\x9b\x2b\xd4\xbf\x88\x10\x31\xe6\xba\x3c\x78\xa4\xa4\x81\x92\x6a\xb5\x95\x77\x01\x02\x80\xaf\xe4\xd0\xe0\xde\xf4\x26\x27\x40\x71\xc0\x31\x1f\x46\x72\xc7\x58\x80\x28\x9a\xbd\xec\xbb\x3d\xef\x21\x63\xeb\xac\x8a\xe9\x07\x7d\x7c\x04\x58\xed\x5b\xf3\x94\x20\xc8\x8c\xfb\xbd\x87\xa8\xc1\x63\xcd\xb8\x13\x81\xb9\x01\xa8\x4f\xfc\x90\x3c\x40\x89\x5b\x25\x62\x80\x7e\x56\x3c\xad\x3e\x3d\x55\xf4\x21\xed\x23\x25\x24\xc7\x51\xb6\x44\xfd\x13\x68\xf5\x3d\x4b\xa9\x5d\x81\xba\x32\xfc\x07\xa6\xce\x81\xed\xa1\x94\xc4\x0f\x98\x22\xc3\x96\x8a\xb7\x98\xbe\x3a\x33\xcb\xdc\x33\xf1\xa3\x9e\x73\x0c\x45\xf3\x7c\x93\x00\xfe\x0b\xb4\x71\x50\x53\x09\x7f\xc5\xd7\x0b\x85\x62\xf4\x1f\xc9\xdc\x83\x51\xa9\xc4\x4b\x57\x72\x55\x65\x45\x6a\xd6\x45\x04\x44\x0b\x7d\x10\x3c\x1a\xad\x59\x82\x58\x86\xc4\x48\xb8\x13\xb8\x8a\x3a\xaa\x0e\x6d\x5b\x79\x8e\x08\x77\xfa\xb8\xcf\x90\x49\x0a\x02\x0b\x50\x16\xbf\xa6\x5b\x19\x9a\x21\x6c\xf2\x86\xa9\xc9\x8c\x7f\xe2\x33\x74\x29\x7a\x16\xd0\xf6\x33\x7d\x15\x6e\xb6\x46\xbc\x31\x97\x0f\x74\x76\xd8\x23\xe7\x2d\xb1\xa4\x47\x30\xaf\x26\x54\x03\xae\x62\x16\x2f\x31\xa9\xea\x71\xf4\xdc\x83\x25\xc1\x6a\x71\x7d\xa6\x9d\xc6\x7a\x1c\x02\x3d\x74\x72\xec\x03\xe1\x7c\x67\xc6\x08\x39\xc4\xf7\x30\xfb\xae\xbf\x7d\x92\xa0\xc1\xee\xb5\x3c\x3b\x90\x3b\x7b\xef\xdd\x48\x45\x1d\x1c\xc0\x20\x55\xd9\xd1\x8f\x70\x12\x7b\x49\x3f\x37\xf6\xa6\x5c\xa3\xc5\xd1\x62\x4f\x93\xcd\xeb\x78\x1e\xd8\x0b\x98\x5b\x07\x78\x91\xc7\xf0\x62\xd1\x47\x04\x19\x8e\x6f\x0e\x7f\xab\x77\x5d\x18\x61\x19\xc6\x1d\x8f\xce\xfd\x50\x64\x2a\xb8\xde\xe2\x6c\x77\x2d\xc4\x79\x64\xab\xbd\x2f\x56\x6d\xcb\x7b\x60\xa8\x72\xc7\xd1\xbe\xf6\xcb\xb0\x03\x34\x17\x6d\xd7\x56\xa3\x1f\x31\xf8\x25\xef\x91\xbb\xf5\x3d\x48\xcd\x63\xbc\x64\x99\x4f\x02\x28\x0c\x41\x78\xdb\xb0\xa5\x84\xf1\x2c\x40\x08\x6e\x3b\xd0\xd7\xc1\x1d\xa4\xd5\x94\x15\x29\x1c\x10\x9d\x39\x0a\x69\xfd\x7a\xc3\x7d\xd8\xc2\x32\x89\xdd\x63\x9b\xfb\x29\x61\x3b\x89\x10\xdd\x0d\xf4\x9d\x96\x66\x27\x9b\x52\x5e\xe1\xdf\x1d\x75\x35\x5b\xd5\xc1\xb2\xff\x99\xfc\x7a\xb7\x42\x23\xe1\x45\xec\x2e\xc5\x06\x1e\x34\x62\xbf\xff\x30\x00\xaf\x83\xc8\xe6\x23\x2c\x05\xd2\xa5\x79\x95\x50\xcf\x78\xd4\x98\x39\xaa\x72\xd6\x9e\x6f\x18\xf9\x40\x70\x25\x75\xf1\x47\x0c\x9d\xd5\x59\xd7\x66\xbd\xa9\x45\x4d\x45\x2c\x49\x2a\xe8\x95\xdc\x7e\xbc\xb7\x59\xca\x72\x4a\x79\xde\x28\x3f\x62\xb2\x7c\x13\x15\x98\x74\xa0\xdb\x0e\x63\x15\x90\x58\x81\xbf\x5d\x23\x64\x42\xd0\x24\x88\x71\xfa\x33\xeb\x04\xa3\x19\x52\xe3\x14\x2c\x72\xa3\x2b\x62\xf1\x03\x97\xba\xd3\xf2\x63\x0d\xd2\x32\x96\xff\x8f\x42\xe4\x2d\x19\x62\x08\xfb\x40\xc8\x00\x9d\xda\x7e\xb0\x2d\x31\xbb\x4b\xa1\x5e\x64\x75\xaf\xb3\xbc\xd3\x3c\x8c\xea\x8d\x8a\xd4\xad\xe6\x78\x10\xe3\xa2\x97\x50\x21\x1b\xeb\x7b\xac\xba\x1f\xbe\xd2\x19\x92\x11\xb9\xfd\xb3\xa2\x0c\x23\xa9\xb8\xfa\xe1\x00\x9a\x9c\xb5\x91\xb6\x0a\x06\x8a\x37\x65\x86\x65\xb4\x6f\x8e\x55\x0a\xd6\xcb\xaa\xe6\xe2\x07\x53\x55\x61\x85\x5e\xd8\xd2\x58\x18\xf5\xbf\x6c\x10\xa5\xe2\xdc\xbe\x2e\x41\x4f\x32\x53\x7d\x5b\x5f\x12\x9c\x71\x12\x4c\x5e\x65\x65\x55\x23\x3b\xbd\xf7\x31\xfc\xd5\x46\x47\x8d\x5d\xed\x5f\x31\x5c\x66\xba\xa3\xe2\xd2\xd8\x39\x93\xcd\x0d\x50\xe4\xe5\x96\xd2\x84\xe1\xa9\x7e\x7c\x5f\x45\xe3\x4b\x70\x8b\xa5\xc9\x36\xfe\xc0\xc4\x46\x61\xbc\x2e\x1c\x0f\xbe\x1c\xa6\xbd\xc7\x78\x5f\xf8\xdb\x21\xec\xca\x5a\xf2\x76\x42\xfd\x36\x92\x54\x38\xf3\x29\x1e\x0a\x86\x50\xf8\x17\x40\x47\x5d\x6f\xba\xce\x91\x49\xdc\x18\x78\x14\xc4\xd8\xfc\xab\x53\x82\x41\xd4\x0d\x6d\x41\x5e\x00\x89\x2c\x58\xfa\xb7\xad\xce\xc1\xd9\xb4\x1e\x98\x5f\x98\x87\x98\x71\xd4\x03\x06\xfc\x1d\x1b\x23\x7c\x4f\x8e\x61\xc8\x7e\xc4\x80\xde\x06\xea\x7a\x9c\x27\x41\x86\x27\xe5\x02\x3f\x62\xb5\x57\xa3\x98\x80\x21\x7d\x32\xd9\x81\x44\x5d\xad\x3a\x2c\x5b\xa6\x88\x1a\x11\x2c\x7d\x50\x00\x17\x61\x4c\x7c\x59\xe0\xb0\x58\x66\x79\xae\x11\xe9\xec\xe9\x43\xda\x29\x12\x88\xce\x83\x75\x4c\x59\x05\xcd\x19\x2b\x90\x88\x5c\x52\x62\xe8\xd1\x04\xb6\x6c\x15\x35\x27\xcf\xbe\x18\x38\xe2\xfd\xda\xe0\x50\x80\xf6\x83\x24\xaa\x9a\x0b\x8b\x89\xcf\x88\x31\x40\x82\x77\x51\x24\xc3\xcd\xdc\x5e\x45\xeb\x70\x57\x15\xbb\x56\x79\xa2\xa9\x58\x33\xa5\xf2\xf4\x33\x62\x23\x31\x5b\x23\xae\x8a\x8e\x19\x88\x38\xd3\x22\x5d\x6b\x2c\xc9\xc3\x11\x6e\x95\x5d\x26\x94\xd1\x07\x8b\x82\xee\xaa\x30\x00\xad\x2d\x8f\xdc\x3b\x84\x9d\x75\x16\xf2\x90\x2f\x3d\xfa\x08\x19\xd1\x67\xf6\xa1\xa8\xea\xd2\xe8\xb5\x9a\x7b\x50\x0a\x7c\x09\x78\x9a\xfc\xa1\xb3\xa7\x0a\x29\x4e\x91\xc4\x17\x2b\xcd\x63\x25\x4c\xdb\xb6\x0b\xe9\x9d\x88\x84\xaa\x53\x93\x30\xf6\xb2\x1c\x13\x79\x4f\xda\xca\x67\x72\x5c\xe3\x6d\x40\xa4\x9b\x84\xc4\xf0\xf5\x40\x58\xae\x98\xc1\xa0\xdd\xec\xe2\xd2\x1f\x61\x3c\x4a\xb2\xad\x61\xa1\x7a\xa6\xa8\xc1\x5f\x0a\xb9\x9c\x1e\x5a\xfa\x32\xbb\xe3\xf3\x47\xf8\x1e\xac\x60\x64\xd1\xd3\xc0\x4e\x85\xb6\x57\x44\x60\x07\x29\xc9\xaa\x32\x44\x50\x5f\x18\xfe\x0c\xe0\xc3\xd0\xe4\x68\x3f\x63\x6d\xca\x5b\x5c\x38\x92\xfa\xca\x9d\x6c\x8f\xef\x54\x84\x04\x33\x84\xaa\x50\xed\xce\x11\x4a\x5c\x70\xb7\x3b\x93\x5e\x74\xd5\x9d\xbe\x62\x82\x23\x70\x1a\x80\x45\xf2\x4a\x7c\xe0\xe1\x4e\xd7\x20\x28\xea\x8f\x43\x86\xe8\x63\xde\x04\xb3\xe6\xbb\x03\x20\x1e\x4c\x0d\x49\xaa\x65\xc4\x90\x62\xaa\x5a\xdd\xe9\x14\x1d\x83\x6d\x4e\x95\x3b\x5b\x41\xf3\x46\xf4\x90\xde\xd4\x4a\xd4\x26\xdf\xba\x76\x79\x11\xc2\xb8\x02\x61\x6f\xce\x2d\xe2\x84\xe1\xc5\xba\xa7\x4d\xde\x8e\x91\x7f\x07\x5c\x7c\xdd\xa0\xda\xa5\x52\x38\x7f\xc7\x93\x38\x68\xcb\x5c\x26\x0f\x1b\x94\x58\x3b\x1c\x61\xce\xa2\x79\x81\x11\x6a\x6d\xa3\x48\xdd\xdd\xf5\x48\xdc\xdf\x6d\x40\x47\x5c\x09\xbb\x8e\xd7\x87\xed\x6a\x4c\xc2\xa2\x41\x22\xb7\x2e\x28\x88\x65\x53\x9e\xac\x95\x8f\x0b\x9d\x30\x1f\x97\xd5\x10\x34\xcb\xb3\x9a\xa9\xff\x23\x14\x2e\x24\x89\x8e\xb0\x3a\x10\xa7\x1f\x20\xa0\xf0\x6f\x48\xe0\xe4\xfa\xa1\xda\x66\x75\xdf\xed\x20\x73\xeb\x5d\x77\x61\xa0\xd3\x87\xc3\x61\x9d\x86\x8c\x46\x82\xf7\x51\xa2\x2a\xc4\xbe\x24\x01\x65\x08\xc0\x53\x9d\x13\xa9\xef\x1a\x30\x4a\x14\xd4\x92\xf4\x68\xee\x3d\x01\xbe\x44\x45\x19\x27\x27\x03\x75\x49\x0c\x8e\x9e\x7c\x8d\x04\x6f\x6d\xd9\x63\x28\x47\xc3\x54\x74\x5b\xca\x07\x68\x01\x5d\xdf\xe5\x85\xc4\xb7\xb3\xa0\x68\x8b\xc8\x53\x2e\x03\xd9\x24\x54\x77\x0d\x42\xe5\x12\x14\x50\x7b\x86\xbe\x50\x51\xc0\x58\x03\x6a\xe5\x41\x15\x35\xda\xf3\xd0\xf9\x62\x8c\xe8\x93\x81\x1a\x46\x8e\x3a\x25\x9c\xdc\xe1\x16\xfd\x1a\x44\x63\x53\xc1\x4e\x91\xcb\x80\xb4\x7f\x70\xa0\x33\xd6\x39\xd2\x78\xea\x25\x19\x37\xa8\xa7\x63\xd0\x02\xe5\xdf\x26\x7c\x4b\xb8\x33\x02\x32\x7c\x62\xc2\xc1\xce\x5e\xeb\xa2\x70\x46\x82\x14\x32\x6c\xc2\x93\x57\xcd\xb5\x01\x31\x41\xac\x1c\x66\x16\x83\xc6\xa0\x60\xee\x86\xae\x7c\xce\x31\x53\x57\xf7\x35\x09\x92\x48\x5d\x16\x12\xef\xfc\xae\x42\xd7\x8e\x77\xe3\x7e\x96\x51\x55\xd4\xd9\xf0\xdc\x26\x09\xcd\xa3\xcd\x7b\x81\x04\xa5\x96\x02\xad\x18\x3e\xa5\x19\xf2\xfa\x5f\x50\xbb\x05\xdc\x3f\x6e\xcc\x30\x4a\x57\xc1\x47\x3c\x16\x35\x8a\x0f\x34\xc9\xc2\xbc\x0d\x21\x1b\x2d\xac\x2f\x0d\xc1\x0c\xa1\x2d\x26\xe4\xbd\xa4\x50\x59\xc3\xd1\x8e\x4b\xda\xc5\x1a\xdc\xb3\x04\x13\x66\xb3\x4b\x10\x5d\xe5\xa6\x92\xb6\xb9\xd8\xe3\xb8\xc1\x03\x0b\x0a\xf2\x34\x3c\x62\x8d\x18\x66\xb3\xa8\x44\xe6\xb3\x35\x37\x10\xbd\xe2\xa0\x0c\xc9\xe4\x52\x1d\x80\xbf\xab\x20\xe4\xd4\x8b\x3b\x89\x47\x04\x4a\x3e\x83\x06\x93\xbe\x2d\x0d\x85\xa4\x30\x91\x9e\xd5\x18\x74\xa3\xfa\x2c\x95\x9a\xc2\x92\xd7\x82\x4c\xf5\x80\x24\x02\x7a\x09\xf0\x69\xe1\xe9\x5e\x89\x15\x28\x87\xf0\xc9\x4d\x23\x98\xa8\x78\xfd\x77\xe0\x7d\xf7\xa6\xd0\x58\xdf\x88\x94\xea\x14\xd4\xc7\x4f\x48\x0e\xc6\x3e\xf0\xb7\xf6\x60\x9a\x7b\x9e\x9d\x3c\x9e\x40\x94\xce\x05\xcb\xc2\xf3\x44\x12\x93\x38\x22\xc6\xf7\x74\x76\x6f\xb7\x64\x81\x37\x3c\xb7\x0b\xac\xd4\x30\x5c\xbf\x14\x30\x19\xa8\x15\x8f\xd6\x77\xd1\x6a\x6a\xc0\x20\x3d\x69\x2c\x30\x71\x42\x0c\xff\xc5\x40\xbf\x67\x01\x87\xe5\x6c\x57\xa1\x56\x38\x7d\xba\xb4\x27\x70\x2a\x7a\x70\x42\x78\x49\xa3\xd8\x20\x48\xfd\x18\x9d\x66\xee\x93\x80\x0b\xc9\xa2\xb8\x02\xe7\x46\xb7\x55\x2d\xd1\xab\x5c\x68\xb5\xa7\xaf\xb5\x85\x38\xa3\x0d\x2f\x0f\x58\xd3\xb2\x44\x9a\x6a\xab\x52\xb3\x29\x9d\x6d\xe6\xbc\x13\x40\x96\xd0\x10\x09\x59\x4d\x9c\xa4\x68\x41\x78\x7e\x72\x11\x7a\xf1\x2c\x5e\x87\xaf\xfc\x1b\x92\xbf\xe8\x40\x4a\x22\x12\xe8\x56\x23\xc0\x61\xf2\xbe\x50\x00\xe8\x0f\x54\xef\x8f\xcd\xb5\xc2\x14\x7e\x3e\x1a\x43\x69\x93\xa0\x3a\x8e\x1c\xa7\xee\x56\x60\xbf\xbf\xb9\xb2\x88\x17\x44\x82\x8e\x5b\x11\x6d\xe2\xfe\x44\xdb\x8b\xe3\x2c\xd8\x2e\x2c\xbf\xeb\xaa\x50\x6c\x7c\x13\xaf\x1e\xef\xa8\x4a\xc8\x46\x96\xa2\x1a\x3e\x82\xb0\x89\x50\x99\xb3\x9c\xf4\x80\x86\x68\x05\x89\xf8\xc1\x6a\xc8\x33\x73\x6f\x02\x98\x82\x36\x5d\xe2\xee\xa2\x6a\xab\x11\x57\x85\x16\xf3\xd2\x16\x85\x89\xe8\x42\xdd\xcd\x9a\xc7\xd0\x38\xb7\x5f\x70\x9e\xf1\x64\x93\x05\xf2\xc2\x33\x06\xaf\x6d\x53\xda\xe5\x96\xbd\xac\x7b\xb3\x23\x17\x38\x69\x6d\x73\x28\xea\x86\xeb\xad\xeb\x18\x02\x9b\x40\x22\x7c\x01\xe0\xea\x7c\x96\xce\x29\x61\xe3\xcc\x73\xed\x30\x62\xd7\xb7\xcd\x5f\x17\x3e\x87\xe1\xfa\xca\xc4\x77\xd2\x49\x6a\xb9\xd1\x45\xd7\xa2\x74\x63\x80\xcd\xcf\xaa\x86\x77\x8d\x2b\x99\xe2\x3c\x31\x89\x41\xd7\xa2\x80\xe0\x37\xa4\x9f\x7d\xb5\x3f\x19\xab\xc3\xe6\x4b\xb3\x4a\xf5\xd2\xac\x5a\x96\x19\x5c\x28\xb6\xdc\x41\x7d\x69\x17\x5d\x9c\x48\xcc\x55\x4b\xbb\x11\x28\x20\x04\x77\x27\x9e\x04\xa5\x6a\x7a\x2e\x09\xc1\x9f\x3d\x60\x28\x50\x10\xa0\x5d\x10\x1c\x8b\x06\xcc\x48\xb8\x3c\x1e\x4a\x14\x81\x4a\xf7\x7b\x20\x83\xc8\xdd\xda\x53\xed\x49\xd9\xa6\xd2\x48\xf1\x32\x77\x2d\x85\xd5\xe9\xb3\x7e\x02\x16\xc9\xc9\x3f\x1a\x8f\x1b\x67\x3d\x12\x12\x34\x94\x10\x42\x70\x8c\x85\x25\xb0\x7d\x01\x3c\x02\x97\xe0\x46\xef\x18\x94\x18\xe5\x10\xea\x5d\xcc\xd3\x40\xa8\x26\x0e\xa9\x12\x5f\xde\x0e\xa1\xf5\xf2\x54\x09\x1b\x41\xbe\xaf\xf9\x6c\x34\xcc\x12\x26\xf5\x6e\x6c\x0a\xe7\x9a\xe0\x41\xc2\xc1\xb9\xd6\x02\xe3\x58\x6b\x02\x75\x43\x72\xf5\x34\xd7\x17\xd0\x74\xb6\x0f\x85\xb8\x00\x2e\x7a\xb6\x47\xc2\x12\x0c\xe7\x10\x61\x70\x19\x30\xdc\xa6\x3e\xac\x84\x84\xf6\xee\xd7\x7d\xbc\x3a\x6e\xfa\x6a\x53\x66\x54\x4e\x88\x17\x72\xda\xf5\x6a\xbf\x43\xbd\x40\x02\x1a\x1e\x5c\xeb\x5c\xf1\x91\x88\xf5\x49\xed\xfd\x4b\xb9\x13\xd7\x36\x03\xd1\x81\x14\xab\x2a\x68\x7d\x8a\x53\xcd\x46\x74\xf9\x7e\x4c\x1e\xb4\x77\x9c\x93\x10\x68\x3f\xfd\x03\x29\xdb\x9f\x1e\x1f\xbf\x65\xa4\xd0\x9d\xe7\x58\x15\x5e\xa1\x47\xca\x01\xb5\x5a\xb9\xf5\x59\x3d\xf2\xa4\x25\xe6\x06\x58\x76\x50\x90\x32\x90\x93\x49\xbd\x47\x0e\xd0\x44\xe4\xda\x5e\x26\x31\xd8\xc7\x37\x26\x06\x40\x86\x48\xbb\xc8\x6d\x72\x47\x89\xea\xe9\xe4\x14\xe4\x40\x17\x5e\x95\xc7\xae\xd4\x0c\xd8\xcd\x0e\x40\x60\x2a\xb5\x6b\xb6\xde\x1a\xdc\x77\x18\x9d\x48\x89\xb8\x4b\x1d\xb2\x6f\x08\xec\x6e\x5b\xe0\x4a\xc1\x0c\x86\xb4\x1e\x7d\x63\xfb\x61\x0a\x4b\x9d\x66\x4b\x8f\xad\xe7\x57\x74\x65\xd9\x76\xec\xd3\x99\xaf\xcb\x2d\x1d\xc7\x3e\x2a\xb4\xff\xbb\x03\x6f\x7b\xa2\x38\x41\xf7\x39\xe3\x6c\xa9\x4a\xd6\x83\x55\xd9\x7a\x9b\xd7\x9a\x25\x50\x10\x70\xd7\xa2\xaa\xea\x64\x0e\xf1\x8a\x96\x35\x12\x91\x88\xaf\xd1\xe5\xd2\xf2\x34\x77\xed\x83\x30\xab\x95\x06\x72\x90\x46\x8c\x88\x4f\x44\x37\xb0\x70\x2e\x85\x1c\x38\x57\xc3\x31\x3a\x6e\xe9\x7c\xf9\x65\x1d\xb4\xa6\x61\xdb\xf9\x9a\x48\x7f\x30\x89\x1d\x5b\x5b\x77\xbc\xac\xa5\xb1\xde\x00\x54\x52\x9d\x09\x29\xae\x51\x0c\x90\x47\x0d\x04\x6c\xe8\x49\x5e\xd0\x21\x46\xa6\xb1\xf3\x0d\xb9\x85\x55\xe9\xb6\x30\x62\x2c\x19\x6a\x16\x1f\x98\x92\xdd\xe7\xe4\xd5\x40\x5d\x57\x42\xb6\xe5\xc3\xf4\x5a\x0d\x9d\xf3\x68\x1f\x93\x67\xf8\x55\x80\x3e\x6f\x64\x35\x69\x45\x8a\x2f\x74\x1e\xdd\x64\x85\x69\xe5\x24\xf8\x2e\xea\x52\x5e\xe8\x94\x95\x78\xb4\xf9\x5c\x0d\x46\x06\x5a\xa0\xb6\x08\xac\xa7\x11\x81\x41\xac\x61\x80\x61\xa6\x7d\x00\xc1\x3c\x8f\x70\xf6\x11\x89\x03\xc0\x72\x7c\x01\x5c\xfb\x84\x65\x70\x2c\xe3\xa5\xdb\x96\xfe\x33\x3a\x97\x84\x4c\xdb\xab\x44\x4a\xf6\x4a\x42\xfb\xe0\x70\xb1\x77\x85\xa0\x81\x98\x7c\xca\x0d\x0b\x61\xc0\xb1\x3c\x0a\x97\xcb\xeb\x81\x9a\x9b\xfb\xcc\xcd\xc0\x2f\x91\x7c\x4c\x23\x30\x72\xf5\x88\x9e\x1e\x02\x54\x89\x8f\xab\xa4\xa7\x91\x6a\x54\x61\x1e\xda\xba\x34\x8f\xa8\xee\xc1\x36\xcb\xd6\xb8\x6d\xb3\xb5\x19\xa8\x85\x73\xb2\xa3\xc7\x40\xf7\x9c\x73\x47\xe4\x75\x59\xa1\xaa\x4d\x56\x66\xde\x06\xe1\x8a\xaf\x28\xda\xe5\x1a\x89\xd8\x40\xf7\x85\xd4\xd4\x3a\x03\x51\x5f\x52\xf3\x80\x57\x78\xcd\x1e\x34\x87\xdd\x68\x8b\xdc\x12\x2f\xce\xac\x22\x8e\x50\x30\x1c\xdc\x5a\xda\x66\x15\xdc\x72\xfc\x09\x14\x55\x6f\xa1\xbc\x18\xca\xc9\x76\xa0\x87\x01\xe3\xe7\xe3\x82\xac\x27\x46\xaa\xc7\xd0\x38\x5d\x87\x7d\xd3\xf3\xca\x84\x40\x03\x9f\xc4\xe2\x7d\x04\x86\xb6\xab\x28\xb6\xb3\x47\x57\x86\x3c\x6d\x46\x4f\xb5\x5b\x88\x82\x08\xcd\x16\xf0\x3a\x08\xf1\xd1\x7d\xab\xa6\x35\x3a\x01\x68\x05\xc3\xe4\xee\x9f\x78\x3c\x9f\x1e\x95\x90\x1e\x58\xde\x59\xce\x4c\xf0\x43\x20\xec\xf4\xfc\xe6\xd1\xa5\xfe\xe8\xfc\x6d\x4a\xfb\x75\x87\x82\x5a\x66\x99\x39\xff\x02\x0e\x84\x7d\x7a\x4c\xfb\x67\xd3\x3d\x82\xa0\xf7\x89\x27\xc9\xf8\x0a\xf9\x25\xfc\x60\x04\xf1\x8a\xd3\xa8\x61\x98\x64\xd6\x5f\x04\xe6\xf9\xaa\xc3\x21\x81\xa7\xf3\x37\xd8\xd9\x97\x57\xc8\x39\xcc\x27\x1b\x5a\xbe\x13\x6e\x54\x6f\x29\x56\x22\x01\x66\x40\xfd\xc3\x90\x5b\x89\xdc\x97\x29\xee\xe8\x0b\xc2\x44\x68\xd8\x49\x00\xd0\x47\x24\xb3\xed\x40\xb3\x80\x4d\x80\x07\xb8\xf7\x23\xa0\x57\x04\xab\xc5\x65\x0d\x49\x16\xb1\x24\xf1\xa0\xfb\x61\x20\xb4\xde\xdd\xb7\x3f\x11\xbc\x1b\x8f\xb7\x8f\xe3\xf9\x58\x4d\x16\x6a\x3a\x53\x9f\x86\xf3\xf9\x70\x7a\xf5\x59\xbd\x9f\xcd\xdd\x1f\xd4\xe5\x7c\xf6\x61\x3e\xbc\x48\xd4\xd5\x0c\xfe\x3d\xfe\xd3\xd5\x78\x7a\xa5\x2e\xc7\xf3\x8b\xc9\xd5\xd5\xf8\x4c\xbd\xfb\xac\x86\x97\x97\xe7\x93\xd1\xf0\xdd\xf9\x58\x9d\x0f\x3f\x0d\xd4\xf8\x4f\xa3\xf1\xe5\x95\xfa\xf4\x71\x3c\x55\x33\xf7\xf4\x4f\x93\xc5\x58\x2d\xae\x86\xee\xf3\x93\xa9\xfa\x34\x9f\x5c\x4d\xa6\x1f\xe0\x79\xa3\xd9\xe5\xe7\xf9\xe4\xc3\xc7\x2b\xf5\x71\x76\x7e\x36\x9e\x83\x36\xd3\xcb\xd9\x1c\xbf\xa8\x2e\x87\xf3\xab\xc9\x78\xe1\x9a\xf1\xcb\xe4\x6c\x2c\x9b\xa4\x7a\xc3\x85\x9a\x2c\x7a\xea\xd3\xe4\xea\xe3\xec\xfa\x2a\xb4\x7d\xf6\x5e\x0d\xa7\x9f\xd5\x1f\x27\xd3\xb3\x44\x8d\x27\xf0\xa0\xf1\x9f\x2e\xe7\xe3\xc5\x62\x7c\xa6\x66\x73\x35\xb9\xb8\x3c\x9f\x8c\xcf\x12\x35\x99\x8e\xce\xaf\xcf\x26\xd3\x0f\x89\x7a\x77\x7d\xa5\xa6\xb3\x2b\x75\x3e\xb9\x98\xb8\x76\x5e\xcd\x12\x78\x1b\x7d\x96\x9f\xee\x1a\x33\x7b\xaf\x2e\xc6\xf3\xd1\xc7\xe1\xf4\x6a\xf8\x6e\x72\x3e\xb9\xfa\x0c\x82\x52\xef\x27\x57\xd3\xf1\x62\x01\x43\x37\xc4\x96\x8f\xae\xcf\x87\x73\x75\x79\x3d\xbf\x9c\x2d\xc6\x03\x1c\xc0\xe9\xd5\x64\x3e\x56\xf3\xc9\xe2\x8f\x6a\xb8\xe0\x61\xfd\xe7\xeb\xa1\x7f\xce\xe5\x78\xfe\x7e\x36\xbf\x18\x4e\x47\x63\xf7\x2a\xd9\xe5\xc9\x02\x7a\xab\x3e\xcf\xae\x07\x6a\xf1\x71\x76\x7d\x7e\x16\xfd\xdd\x0d\xd3\x58\x9d\x8d\xdf\x8f\x47\x57\x93\x5f\xc6\x89\xfb\xa0\x1a\x2e\x16\xd7\x17\x63\x1a\xed\xc5\x15\x0c\xcf\xf9\xb9\x9a\x8e\x47\xe3\xc5\x62\x38\xff\xac\x16\xe3\xf9\x2f\x93\x11\x8c\xc2\x7c\x7c\x39\x9c\xcc\xdd\x18\x8d\x66\xf3\xb9\x7b\xca\x6c\x8a\x6b\xe8\xcd\x00\xc1\xe2\x3e\xc5\x71\xce\xb8\x64\x3c\x2d\xa6\x6e\xf9\x8c\x7f\x71\x8b\xe3\x7a\x7a\xee\xc6\x61\x3e\xfe\xe7\xeb\xc9\xbc\x6b\x89\xb8\xe7\x0f\x3f\xcc\xc7\x30\xcc\x72\x45\x7c\x9a\x9c\x9f\xc3\xdc\x35\x97\x45\x02\x5f\x99\x7e\x16\xcb\xe2\xb3\xfa\xf4\x71\xa6\x2e\x66\x67\x93\xf7\x6e\x52\x68\xd9\x8c\x66\xd3\x5f\xc6\x9f\x17\xd1\xa8\x0c\x17\x62\xbd\x0e\xdf\xcd\xdc\xc0\xbc\x1b\xab\xf3\x09\xb4\xe7\x6a\x06\xa3\xe4\x66\xed\x6c\x78\x31\xfc\x30\x5e\x88\x75\x01\xef\x24\x8d\xe7\x44\x2d\x2e\xc7\xa3\x89\xfb\x8f\xc9\x74\x34\x39\x1b\x4f\xaf\x86\xe7\x38\x54\xd3\xc5\xf8\x9f\xaf\xdd\xcc\x0e\xcf\xf9\x21\x6a\x38\x9f\x2c\xdc\x13\xdc\xd2\xa4\x69\xbc\x5e\x8c\xff\x7f\xf6\xfe\xbe\xb9\x6d\xe4\x58\x1f\x86\xf7\x6f\x7f\x8a\x29\x56\x3d\xb5\x62\x0a\x82\xf5\xe2\x97\x5d\x3b\x95\xa7\x28\x0a\xb6\x79\x42\x91\xba\x49\x6a\x1d\xff\x4e\x9d\x3a\x37\x48\x0e\x25\x64\x41\x80\xc1\x80\x92\x79\x3e\xfd\x5d\xd3\xdd\x33\xd3\x33\x00\x29\xd9\x59\x3b\xd9\xf3\x5b\x57\x25\x6b\x4b\x24\x30\xaf\x3d\x3d\xdd\x57\x5f\x17\x2c\xbf\x91\x59\x36\xb3\x31\xfc\x8c\x37\xf6\xc8\xbd\xbb\xb9\x24\xc5\x70\x3c\x85\xf5\x77\xd9\x9b\xf5\x04\xb4\x78\xd6\x13\x17\x89\xfe\xf4\x24\x19\x5d\x26\x13\xd8\x61\xbd\x7e\xff\x66\xd2\x9b\xc1\xcb\xf4\x37\x92\xa9\x98\xde\x4c\x67\xbd\xc1\x08\x67\x43\xf7\x17\xf6\xf7\x60\x72\x69\xb7\x18\xac\xda\x77\xbd\xc1\xf0\x66\xd2\x58\x77\xb3\xb1\x18\x5f\x27\xf0\x48\x58\x7f\x6c\x26\xf0\x13\xd3\x6e\x04\x93\x2f\x06\xef\xc4\xf4\xa6\xff\x81\xa6\x4d\x78\x1b\xf9\x93\xf8\xd0\x9b\x8a\x8b\x24\x19\x89\xde\xe5\x2f\x03\xd8\x8c\xf4\x9e\xf1\x74\x3a\xa0\x31\x19\xd3\x13\x68\x1c\x71\xf5\xbd\x8e\x51\x5a\x63\x53\x49\xb7\x02\xa7\x8d\x3a\x13\x7e\x70\x2d\x3d\x8b\x67\x0b\x5a\xf4\x07\x73\x6f\x21\x3b\x80\xbd\x85\xb2\x22\xa2\xd6\xc9\xd5\xa1\xcb\x93\x97\x8b\x34\xa7\xf2\x13\x64\xd8\x25\x1c\x33\x99\x60\xac\x76\x22\x28\xb0\xf6\x05\xe5\x03\x46\x3d\xb7\x55\x6d\x18\x16\xd0\x33\xa5\x27\xa5\x0f\xa6\xf2\x43\xd5\x62\x91\x97\x58\xc6\xb9\xd1\xc7\x1f\xa8\x04\xa0\x6c\xd1\x5c\x95\xf9\xb6\x96\x48\x20\x8c\x9e\x87\x76\xce\xb3\xfb\x2c\x67\x6d\x6f\x89\x94\x78\x37\x33\x83\x18\xf5\x4a\x7b\x5c\xe9\x80\x3f\x10\xae\x52\x39\xc4\x8b\xd8\x5c\x75\x21\x2a\x59\x6f\x2b\x4e\x6f\x2a\x92\x11\xce\x68\x9b\xc6\xde\x07\x54\x2c\xea\x41\xff\x11\x98\x35\x33\xf8\xf0\x4f\xfa\x30\x1b\xc9\x07\xf3\x74\xf5\x8c\xee\xe4\x24\x58\x03\xee\xfd\x83\x23\xe4\x33\xc8\x04\x92\x43\xa6\x7c\x07\xb5\xf0\x16\xca\x0f\x55\x0d\x28\x92\xcc\x48\xbb\x04\x9a\x5d\x98\xe7\x50\x35\x52\x04\x95\x22\x5d\xdc\x41\x80\xdc\x22\x39\x4b\xab\x7d\xe8\xcb\x3a\xa3\x93\x23\x8d\x00\x3b\x6a\x25\xf8\x82\xb1\x46\x09\xd4\x66\x8b\x94\x05\x8d\xcf\x08\xe8\x15\x89\xb4\xae\x53\x8a\xec\x39\x87\xd4\xd4\x34\x59\x57\x9e\x40\x7d\x03\x88\x55\xaa\x74\xa5\x5b\xac\x5b\x6b\xbf\xbc\x36\x9f\x55\x35\x95\x4a\x00\x14\x88\x81\xe4\x51\x85\x44\xf9\x1a\x8e\xe0\x51\x51\x64\x92\xf1\xfc\xf9\x94\xbb\xf0\x24\x78\x04\x09\x5a\x62\xf6\xc4\x31\xa4\x49\xd1\x59\x38\x65\xc3\x1c\xef\xbb\x4b\xed\x1a\x96\x70\x47\xc3\x68\x81\xa1\xb0\x59\x6d\x2d\x91\x29\xc8\xae\x6a\x6f\x33\x7e\xf6\x67\x3d\x8a\xf0\x55\x43\x85\xc6\x7a\xfe\xa3\x82\xb2\x1f\x7a\xea\xbc\xca\xe4\x4a\x64\x4b\x94\x47\x7d\xa0\xa2\x0f\xed\x39\xc7\x7f\x61\xc2\xfa\x47\xfd\xae\xf8\xf3\x4e\xa6\xd5\x5f\xc4\x9f\xe1\xdb\xa5\x29\xa5\xfb\xcb\xb3\x19\xe9\x89\x1a\xb8\x85\x37\xb7\x6f\xac\xf0\xb5\x37\xa3\x59\xdd\x50\x01\x6e\x4f\x04\x1e\x74\x72\x53\xf5\x74\xf7\x3b\x32\x17\x90\x46\x44\x60\xc8\xea\x01\x8e\xfc\x3a\xcf\x6e\xf3\x3e\x12\x37\xfa\xeb\xba\x65\xeb\x0f\xee\xca\x8d\xe3\x44\x32\xb7\xcb\xad\x92\xab\x6d\x8e\x77\x47\xe3\x5e\x69\x9b\x6f\x5c\xac\xb7\xb6\x8e\x55\xde\x53\x32\xc4\x04\x29\x9d\x79\x59\x35\xbc\xa4\xb2\x7a\x82\x93\x34\x95\x4f\xd4\xa7\x07\x1d\x61\x7d\x93\x55\xf1\xb3\x4f\xe5\xd6\x5b\xa5\x16\x66\xec\x5b\xaf\x43\x13\xc4\x99\xbb\xdc\xa8\xc1\x4d\xad\x28\xeb\x48\x28\x29\xc5\x9f\xef\xea\x7a\x23\x94\x78\xf3\xfc\xf9\xc3\xc3\x43\x7c\x5b\x6c\xe3\xb2\xba\x7d\x6e\x30\x18\xcf\xff\x12\x3f\xeb\xe5\x0a\x3c\x7e\x8f\x36\xa4\x2c\x8c\x62\x1b\x84\xa5\x51\xe9\x1a\xc8\xd9\x73\xb9\xa8\xab\xb2\xc8\x16\x08\x5a\x48\x37\xb2\x12\xeb\x34\xcb\xe3\x67\x83\x15\xdf\x0a\x78\x43\x24\xb4\x73\xce\x63\x20\x91\xb5\x54\x24\x07\x92\xea\x91\xa8\x0c\xc1\x31\x40\x72\x49\x8c\xff\x0e\xb4\x3d\xd0\x56\x28\xa2\xf1\xe4\xbc\xb0\xeb\x72\x29\xdf\x3c\xfb\x33\xbd\xf2\x2f\xe2\x2b\x36\x15\xf2\x08\xc3\x30\xf6\x2e\xa6\xe3\xe1\xcd\x2c\x19\x7e\xe2\x37\x8b\xb7\x30\x7b\x34\x71\xa2\xde\x6d\xa4\xf8\x7f\x41\x4f\xfc\xe1\x47\x5a\xaf\xe1\xbe\x74\xf6\x1e\x0c\xb0\xcc\x17\xe5\x9a\xe2\x83\xfe\x36\xc5\x5d\x69\xcb\x8b\xed\x7d\xfe\x2d\x7f\xcd\xe2\x47\xde\x00\x14\x99\xbd\xdb\x6d\xca\xfa\x4e\x42\xb6\xce\xa9\xe1\x99\x66\xc1\xeb\xed\x97\x69\x95\x19\x09\x74\xaf\x66\xd8\xa3\x35\xdd\x13\x71\x14\xe3\x15\x78\x04\x36\xad\xec\x6c\x9d\x7d\xf3\x1a\xc6\x7c\x2e\xdd\xe5\xf2\x2d\x1d\xb3\xef\x6f\x06\x8e\xbd\x97\x74\x05\xa0\x3d\x5b\xb8\xf0\x8b\x4e\x3a\xd7\xbb\x72\x5e\x7e\xee\x78\x9b\x02\x10\x9e\xb7\x92\x2c\x86\x5c\x6f\xf2\x72\x27\x2b\x28\x33\xc6\x67\x18\x4e\x7e\x23\x2b\x27\xab\x2e\x60\xa9\xf4\x15\x33\x87\xa8\x72\x5a\x80\x5e\x3c\x30\x08\x21\x7d\x96\x59\x1c\xce\xd3\xea\xb8\x0c\xba\x25\xcf\x5d\x09\xa7\x40\x01\xa1\x6a\x4c\x67\xfb\xbb\x03\xc5\x83\x99\xb2\x21\xfa\x49\x50\xb5\x82\x17\xdb\xda\xc9\xc5\x3f\x79\x2f\xce\x0e\x6f\x79\x1b\x74\x41\x84\x19\x67\xda\x42\x8d\xf8\xca\xd9\xce\x82\x40\xe7\xa4\x7c\x6c\x95\xb2\x5c\x69\x02\x33\xb3\xa9\x50\xdb\x79\x55\x6e\xeb\x0c\x0e\x37\x22\x33\xdb\x39\xde\x5a\x28\xa1\xd4\x4b\x16\xc6\x02\xad\x2d\x20\x7a\xb0\x21\x79\x56\xfc\x8a\xe5\xd0\xee\x85\x94\xa5\xa9\x29\x0a\x48\xee\x1d\x3d\x9c\xe2\x49\xb8\x79\x1e\x0c\x08\xe0\x81\xf2\xfa\xcb\x32\xf2\x14\xf7\x87\x52\x29\x59\xed\x8f\x29\xab\x5a\xa6\xcb\x66\x9e\xe4\x62\x5b\x63\x75\x4b\x24\x36\xc0\x8f\x0e\xc8\x95\x7d\xf3\xb0\xb9\xcb\xf2\x52\x95\x9b\xbb\xdd\xf3\x87\xbb\xdd\x71\x51\xd6\xc7\xf9\xed\x26\x8f\xef\xea\x75\xfe\x97\xf8\xd9\x0f\xff\x0b\xfe\xc4\xcf\xff\x4f\xb6\x9e\x57\xe9\xf1\x69\x7c\x1e\xd7\x9f\xeb\x6f\xf1\x8e\x93\x93\x93\x93\x57\x2f\x5e\xe8\xff\x9e\xbe\x7e\x79\xc2\xff\x7b\x72\x72\x72\x76\xfa\xe2\xf5\xd9\x0f\xa7\xe7\x67\x67\x67\xfa\x1f\x2f\x5f\xff\x70\x72\x7a\xf6\xe2\xd5\xe9\x0f\xe2\xe4\x5b\x34\x26\xfc\xb3\xd5\x27\x89\x10\x3f\xdc\xa7\xcb\x6c\x7d\xe0\x73\x8f\xfd\xfe\x77\xfa\x07\x67\xbf\x11\x86\xa5\x5c\x82\x38\x8d\xcf\xc5\xd1\xff\xb9\x1e\x76\xf1\x58\x6b\xfd\xb4\x38\x82\x3d\xd6\xe9\x99\x3c\x68\xa7\x8b\x06\x04\x6f\x99\x2e\x3d\x8a\x3c\xed\x52\x2d\xaa\x6c\x4e\x90\x50\x74\x3d\x39\x4e\xe0\x97\x2b\x3c\x2f\x07\xc5\x22\x8e\x44\x2a\x2e\x65\x9e\x3e\x60\xd5\xb6\x63\x10\x24\xfd\x29\x20\xd5\xaf\xb2\x62\x91\x6d\xd2\x9c\x28\x36\xca\x95\x43\x42\xa4\xb5\x38\x7f\x71\x72\x2a\x3e\x64\x79\x0e\x32\xb3\xbd\x7b\x59\x6c\x65\x24\xae\xd3\xbc\x14\xbd\xbc\x2e\x23\xd1\x4f\xf3\x6c\x55\x56\x45\x96\x8a\x9f\x5f\x9c\x9f\xbc\x10\x47\x1d\x6c\x42\xa7\x8b\xae\xa4\x65\x67\x32\x4e\x2e\x25\x9e\xef\xb3\x14\x00\x5c\x79\x89\x95\x02\x2e\x4d\x7d\xd4\x31\x0e\x71\xa7\x1b\x8b\x8b\x1d\xd5\x20\xe9\xfe\x4e\xad\x3f\x80\xc8\x85\x82\x33\xf2\x92\x34\x23\xd6\x46\x1c\x75\x3e\x95\xdb\x4e\x97\x25\x41\x1b\x89\x2e\x3b\xe0\xf1\xb3\x41\x61\x4d\xb2\x87\xdf\x5d\x6f\x01\x27\x06\x8a\x11\x8a\x48\x92\xb6\x1b\x42\x74\xb4\xe6\x0d\x94\x04\x08\x59\x7d\x87\x72\x4d\x91\x07\xcb\xc0\xc6\xa4\x8a\x0e\x34\x64\xde\x38\x8d\xc5\x7b\x80\x0c\x95\x2b\xe6\x6d\xd1\xe2\x20\x2e\x83\xd3\xf8\x54\x1c\x8b\x29\x2f\xa4\xd9\xf3\xfe\x46\xe7\x22\x5a\x12\x80\xbf\x9e\x1b\xe0\x08\x5d\xb9\x23\xae\xbf\x44\x52\x0b\x16\x12\x64\x2b\xa4\x4c\x4d\x47\x56\x98\x84\xa2\x3f\x17\xa9\x87\xff\x8d\x42\x9c\xb0\xfe\xa7\xa9\xb4\x41\xf6\x0e\x87\xe8\x42\x9c\x25\xde\xaa\x22\xa3\x13\x1a\x19\xa6\x3f\x74\x07\x98\x87\xc7\xdf\x0b\xbf\xbb\xe2\x6a\x27\xe8\x5b\xe0\x1d\x3f\x80\x57\xb3\xe1\x80\x7c\xec\x1d\x21\x20\x23\x1b\x99\x87\x7f\xe8\x25\x34\xaf\xb2\xe5\xad\x57\x4e\x6e\xdf\x08\xe0\x95\xf9\x0e\x40\x49\xb0\x45\x3b\xfc\xfd\x6f\x3b\x4e\x7d\x01\x4a\x42\xf4\xbd\xf9\x93\x23\x7a\xf1\x1e\x45\xa2\x0b\xd2\x2a\x69\x83\xc3\xca\x09\x0f\xbc\x8f\x1b\xb8\xaa\xff\xc6\xb8\x63\xd7\xc7\x99\x38\xd6\x0e\x80\x29\xa9\xf2\x77\x46\x8a\x2a\x56\x65\x41\xea\x69\xa6\xc4\xc8\x59\x04\xa7\xc9\x07\xdb\x27\xc2\x78\x0c\x43\x2c\xda\x96\x50\xde\xed\xca\xa3\x25\x53\xbc\xc8\x0b\xbe\xea\x24\xee\x4c\x2a\x06\x71\x59\xf3\xac\x58\x92\x62\x95\xff\x7a\x53\xd3\x54\x86\x9b\x53\x5c\x83\x05\x21\x41\x04\x4a\xee\x21\xbf\xaa\x32\x80\xb6\x03\x0f\x74\x5a\xe5\x86\xb4\xc2\x23\x88\x5f\xb5\x81\xf1\x99\x65\x30\xe3\x7b\x2e\x8e\xed\xea\x3a\x38\x16\x9f\x50\x20\xcb\xde\x49\x9a\xcc\x62\x69\x1d\x39\xe9\x16\x14\xba\x03\xbc\xc4\x3e\x68\xb1\xb7\x76\x97\xee\xab\x8e\x1c\x0f\x4a\xe4\x24\x31\x16\x35\xbf\x87\xbe\xe2\x27\x94\xca\x73\x7d\x8f\xc5\xc7\x40\xf2\xeb\x2b\x3b\x73\xa0\xc9\x41\x2e\x1e\x36\x4e\x83\x9d\x9b\x61\x41\xcc\x07\xc9\x66\xb5\x69\x92\x99\xd1\x07\xde\x5b\xd2\x6a\x29\xab\x25\xe8\x84\xc8\xc2\xee\x00\x0f\xc3\xe7\x99\x09\x0e\xcc\x61\x63\xab\xbf\xd8\x01\x04\x88\x6d\xe2\x5d\x49\x9a\xd7\xd4\x9c\xac\xf0\x83\x3d\x84\x6a\xfc\x64\x51\x9f\xf6\xf6\xb2\xcf\x3c\x7b\x23\x61\xc0\xea\x4e\xff\xbd\x5c\xe1\x34\x05\x66\x2d\x84\xa7\x60\xc8\xb0\x92\xb7\x25\x14\xbc\xd8\x7e\x1f\x6e\x7e\xe4\x15\x5c\x2a\xff\x30\xf9\xfb\xb6\xca\xd4\x92\x38\x3f\x1c\xe8\x05\x87\x6a\x6a\xb4\x7b\x0c\x3d\x32\xa1\x39\x50\x45\x79\x99\xa9\x0d\x48\x83\xb6\x8d\xab\x01\xa2\x1f\x78\x5b\xb9\x12\x2b\xb9\x84\x7b\x88\xe1\xb8\x30\x01\xf3\x72\x25\x8a\x12\xb0\x48\x05\xf3\x34\xdc\xae\x7c\xf1\xf5\xbb\x92\xce\x1a\xf4\x3d\x02\xb5\x10\x6f\x87\xc2\xbd\xd9\x78\x31\x0c\xb5\x8b\x30\x1e\x8f\x8d\x9e\x37\xc1\x37\x90\x6d\x1b\xc7\x27\xa4\x79\x64\x0f\x23\x52\xc7\x33\x5d\x2d\x96\xd9\x5f\xe7\x8f\xf6\xd2\x52\xde\xa1\x13\xe0\xd0\x85\xb4\x0c\x17\x77\x25\x10\x69\xfa\x4c\x31\x66\x15\xd1\xe3\xa9\x36\x77\x8f\x9c\x28\xeb\xc0\xa0\xb0\x87\x2d\x1b\x5e\x88\x5c\x99\x04\x47\xbe\x23\x32\x79\x5b\x14\x68\x7d\x05\x67\x1f\x28\xd5\x02\x36\x7f\xef\x88\xe3\xf9\x8a\x78\x17\x02\xaf\x79\xcb\x12\xbe\x43\xb4\xe8\x74\xa2\xeb\xe9\x90\x96\x42\x60\xbe\xb3\xdb\x06\xf7\x69\x4a\x3a\x41\x79\x18\x3a\x30\x25\x9f\x7c\x71\xc0\x2b\x9b\xb2\x8b\x66\x67\xb2\xb5\x10\x2e\x1d\x03\x86\xb6\xef\x6f\xdf\x56\x8e\x34\xa1\xfd\x99\x8d\x1d\xc0\x9e\x0b\x9d\x55\xf6\x2a\x01\x06\xc3\x6c\x71\x7d\x8f\xb5\xdb\xeb\xa5\x38\x46\x1d\x0a\xf7\x5e\xdb\x6b\x94\x20\xfa\x64\x19\x19\x20\xca\xe0\x76\x18\x6a\x70\x5b\xbc\xb7\xc5\xef\xc1\x17\xca\x87\x02\xe3\x4d\x47\x59\x2c\x63\x63\x54\x5c\x3d\x1e\x1d\xe4\x32\x2c\xd7\x6c\xb8\x7f\xc6\x98\x79\xeb\xbe\xcb\x9c\x5a\x5c\x36\xba\xc3\x08\xff\x30\x0a\xd2\x53\xe4\x8a\xd5\xff\x32\xee\x71\x0a\x12\x61\x0e\x9d\xc1\xa9\x65\x41\x39\x12\x42\x83\x4c\xe8\xcf\x30\xca\xa2\x35\x8f\x1b\x58\x5f\x37\x68\xd6\x5c\xd2\xbb\xa0\x28\xaa\x46\x99\xaf\xd2\x5b\xe6\xe6\xa4\xb6\xd4\x5f\xe4\x95\x91\x8f\x1a\x8c\x81\x91\x73\x1d\x14\xb5\x04\x1c\xa7\x76\xf6\xae\x0d\x3d\x3d\x8a\xb9\xd2\x64\x9e\xc3\x0d\x22\x41\xf2\x1e\x13\xa1\xcb\x9d\x28\x35\x31\xf9\xf8\x50\x7c\x7e\x07\x60\x2b\xe4\x14\x20\x2d\xb8\xfc\x22\xc6\xf5\x01\x05\x7a\x73\x99\x56\xa8\x6f\xcb\x57\x33\x70\x1f\xee\x44\x5a\x65\x48\x69\x61\xd4\x73\x9b\xfe\x9e\xad\x21\xb5\x8d\x02\xd6\x05\xc8\x2d\x2c\x4c\x6e\xe4\xf3\x5d\xba\x55\xf4\x77\x55\x97\x9b\x8d\xcc\xbd\x3b\x64\xcc\xc4\xc0\xb9\xe0\x3e\x48\xc9\xf1\xc1\xb2\x5c\xfe\xe6\xb3\x76\xc5\x22\x8c\xb8\x7d\x5c\x5a\x6c\x09\xdd\xae\x90\xbc\x50\x2e\x63\x3b\xec\xe0\x98\x17\x46\x64\x78\xd7\x66\xb5\xc9\xf1\xf7\xb6\x2b\xe4\xa1\x20\x8d\xc9\x6c\x25\x32\x39\xc3\xca\xaf\x24\xe9\x3a\x46\xde\xe5\xcd\xce\x58\x44\x40\x6e\x46\x97\x47\x6a\x7a\x8e\x22\xd1\x25\x1b\x4d\xa7\x7d\x6e\x56\x7e\xff\x60\x4e\x1b\x4a\xa4\x29\x04\x5c\xa7\x9b\x8d\x4c\xab\xf0\xf3\x24\x5f\xe3\x95\xaf\x86\xc4\x8e\x6d\x0d\x09\x08\xb1\x1c\xd3\x1f\x00\xe2\xcb\xdb\x92\xda\x2a\x3f\x67\xaa\x36\xce\x7f\x1a\x48\xe6\xb5\xee\x12\x98\x8b\x73\x63\xcf\x1a\x36\x1c\xdd\x37\x3d\xd0\x4e\x46\x76\x4b\x00\x3a\x43\x75\x50\xa4\x6b\x19\x41\x2b\xb0\x2c\x80\xd1\x10\x12\x29\x96\xe3\x51\xb1\xf1\x6e\xbc\xe4\x3a\xc1\x6d\xb3\x8b\xce\xe3\x33\x23\x3c\xdb\x8a\xcb\xca\xa4\x22\x60\x96\x98\x8e\xdf\xcd\x3e\xf6\x10\x9f\x45\x20\xa8\x4b\x8b\x7c\xea\x8d\x2e\x0f\xa2\x9f\x62\xf1\xcb\x15\x7c\xf9\xaa\xf7\xd7\x84\xe3\xbb\x06\xc9\x34\x12\x1f\x3f\x24\x1c\x1a\x15\x39\x58\xd4\x78\x02\x68\xad\x9b\xd9\x78\xf2\x49\x4c\x92\xf7\xbd\x09\xe0\x51\xc6\x13\x31\x49\x86\x3d\xc4\x6e\x8d\xbd\xe6\xc5\x88\x8d\x79\x37\xe8\xf7\x86\xc3\x4f\x91\x79\xef\xe5\x18\x5e\x6b\x5b\x27\x66\x1f\x7a\x33\xbf\x5f\x00\xf9\xb9\x48\x44\x32\x99\x8c\x27\xe2\xdd\x24\x01\xd4\x0a\xfc\x94\x80\x50\x62\x30\x12\xbd\x91\xb8\x19\x0d\x46\xb3\x64\x32\xb9\xb9\x9e\x25\x97\xe2\xaa\x37\x1a\x25\x93\xd8\xb4\xe3\xfd\x24\xe9\xcd\x92\xe9\xcc\xe0\xd3\x7a\xc3\xe1\xf8\x23\x82\x5d\x86\xbd\x8f\xb6\x3d\xbc\x91\xe2\x72\x30\xed\x0f\x7b\x83\xab\x29\xc0\xa1\x9e\x84\xf3\x8a\x1e\xcd\x5f\x8a\x23\x03\x83\xa1\x57\x7e\xe8\x5d\x22\xe4\x65\x30\xd2\x9d\x41\xcc\x0b\x00\x5c\xe8\x1b\xdd\x08\xe6\x71\x34\x1e\x0d\x46\xef\x26\x83\xd1\xfb\xe4\x4a\xf7\x00\x70\x36\x93\x44\xb7\x78\x16\x8e\x76\x04\x33\x8c\xd0\xa7\x7e\x0f\xf0\x15\x88\xe2\x9b\x8d\xed\x9a\x08\xbf\x0b\xd8\x23\x44\xdb\xbc\x1b\x4f\x92\xf7\xe3\xc1\xe8\xbd\x11\xa4\xdd\x03\xec\x0a\x71\x5d\x30\x29\xd4\x2d\x87\x9f\x7a\x47\xc8\xac\xcb\xc1\x24\xe9\xcf\x22\x31\x18\xb9\xbf\x19\x94\x14\x83\x4e\x25\x7f\x4b\xae\xae\x87\xbd\xc9\xa7\x68\x3f\x74\x8a\x2d\x61\x8e\x87\x32\x4b\x1d\xf0\x50\xd0\x6d\x8b\x87\xba\x9e\x8c\xdf\x0d\x66\xd3\xc8\xfe\xe0\x66\x9a\x44\xe2\xe2\x66\x3a\x80\xd9\xb2\x2b\x67\x30\x1e\x45\x1e\x88\x2a\xb2\x98\xb8\xfe\xf8\x97\x64\xd2\xd5\x1d\xee\x8f\x47\x23\x84\xbe\xe1\x48\xea\x0e\xfa\x60\xae\x96\x9d\xf0\xee\x66\x32\x1a\x4c\x3f\x00\x8a\xce\x43\xf0\x4d\xf8\xd0\xdb\x65\xef\xc1\xd9\x00\xe9\x36\x15\xef\xf5\xc2\x4b\x2e\x85\x9e\xc9\x9b\x11\xa0\xde\xcc\x1e\xed\x0d\x87\xc9\xfb\xe4\x52\xf4\xa6\xa2\x27\x2e\x26\x49\xaf\xff\x01\xdb\x3c\x9a\x4d\x7a\xfd\x19\xa0\xb9\xc6\x93\xd9\x60\x7c\x33\x05\xd0\xcd\x0d\x8d\x3f\x8d\xdc\x28\x79\x3f\x1c\xbc\x4f\x46\xfd\x04\x17\x5b\x63\x8d\x7e\x1d\x2c\xeb\x15\x12\x0a\xc2\xd1\xc2\xa8\xc3\xc8\xe4\xbe\x02\xaf\x63\xd6\x12\x12\xb0\x85\x05\x99\xd1\x88\x6f\x21\xb4\x73\xc4\x5e\x32\xad\xf2\x0c\xf0\xcb\xae\x56\x15\x4e\x61\x63\x4f\x5f\xc5\xf6\x95\x74\xe2\x02\xb4\xe5\x5e\x92\x59\x27\xc6\xfb\xc3\xe1\x15\x72\xcf\xb4\xa7\xc2\xf9\xcc\xda\x22\x42\xaf\xe0\x30\xd1\x5e\x46\x83\x50\x50\xbb\x02\xc4\x13\x06\x78\x2f\xf7\x28\x2f\x74\xcc\x48\xd6\x1a\x57\x3d\xf6\x6b\x83\xc7\xc8\x0a\x1e\xaa\x84\x83\x89\x8e\x2a\x74\x07\xd6\x72\x09\x21\x66\x5e\xe0\x45\xfd\x49\xa1\x9c\x0b\x62\x62\xff\x30\x62\x18\x6d\x8e\x8c\xeb\x9b\xbe\x57\xcf\x0e\xb5\x11\x9b\x05\x21\x49\x9c\x3c\x4a\xf8\x62\xd8\x40\x11\xb7\x39\xdc\x7c\xfc\x53\x9f\xda\x7c\xe4\xce\xc1\xd3\x6e\xc4\xbf\xb9\x64\x14\xd4\xbc\x0a\x0e\xfb\xf2\xa3\x62\x10\xb5\xa3\x69\xa0\xe0\xd9\x8d\xbc\x56\xdb\x97\xbc\x82\x44\xf6\x55\xa6\x16\x32\xcf\xb1\x60\xcb\xfd\xf2\x75\xd7\x5c\x40\x58\x2b\xa0\x7b\x86\xf1\xf4\xf0\x6c\x11\xaf\xbf\xf7\x74\x2c\x19\xf1\x06\xcc\x92\xc3\xd6\x8e\x32\x9e\x95\xbe\x05\xf5\x9b\x2d\x71\x2f\x13\x42\x59\xa7\x75\x6d\x8a\x01\x7c\x37\x14\x22\xab\x1b\x59\x29\xb9\xa4\xd0\x8c\x65\x5a\xf2\xb4\x1c\x00\x9a\xc8\x99\xaa\x15\xe5\x01\x4c\x80\x89\x18\x82\xcd\x93\x95\x45\x23\x95\x14\xa4\x21\x72\xd2\x48\xcc\x65\xfd\x20\x6d\x2d\x74\x7b\xe3\x55\x9a\x2d\x83\xd6\xc7\x24\x0b\x42\xe5\x9a\x77\xd9\x26\x1c\x01\xb7\x89\x32\x53\xba\xb6\xf2\xb4\x81\x0d\xfd\x31\x50\x91\xd9\x1a\xb2\x96\x05\x1a\x16\x59\x82\x57\x4d\x0c\x5d\xe9\xad\x2c\x16\xbb\x08\xde\x5a\xc8\x4a\x37\x24\x12\x7f\x2f\x33\x28\x9e\x29\xa0\x8a\xc1\xbb\x87\x19\xc7\x94\x52\x73\x4a\x95\x8b\x8c\x98\x21\x9b\x03\x81\x34\xc1\x74\x09\x8d\x5c\x14\xd0\x94\xc7\x53\x88\xad\x79\x5d\x34\xd0\x38\x8a\x9d\x91\xe8\x34\xe0\x37\xd3\x87\xd5\x36\xc7\xfd\x4b\xb4\x1a\x66\xaf\x23\xfb\x08\xb9\xfc\x2d\x43\xe1\x0d\x03\xe7\x65\x68\xc2\x4f\xd1\x1e\x6f\xad\x40\x48\x56\xd4\x76\x8d\xfa\x86\x0a\x8a\x93\xa8\x7d\x61\x37\xfd\x5e\xda\xa2\x25\x89\x55\x62\xb6\x2c\x13\xe5\x12\x20\xa6\x83\xa8\x59\x1e\x2d\x45\x12\x17\xda\x94\x66\x9b\x36\x0a\xd3\xe6\x46\x1e\x02\x20\x8b\xfe\xb0\x18\xd8\xa1\x54\xb5\x29\xc1\xf6\xc8\x84\x40\x40\xa2\xed\x80\x9a\x93\x7c\xe9\xa6\x92\x86\x59\xd2\x1f\x3f\x80\xfd\xfa\xa1\xaf\x3c\x7d\xb0\xb1\xe1\x29\xc4\x31\xcb\x15\xcf\x90\x9a\x80\xef\x4d\x91\xe9\x67\xc2\x47\xe0\x0b\xbd\xb5\xac\xb2\x45\x1a\xb5\x68\x43\x2c\xca\x62\x95\x67\x0b\x18\x7e\x6d\xc5\x29\x61\x9b\xeb\xf5\xa5\x37\xd1\x4d\x3c\x22\xb9\xe4\xc2\x20\x69\xfa\xb4\x35\x1c\x89\x25\x00\xa7\xd1\x82\xa5\xb9\x98\xa6\x28\xb3\xfe\xbe\x2c\x97\x06\x94\xec\x14\x85\x5a\x32\x30\x3d\x1e\xe5\xd5\x77\x78\x30\xce\xdb\x96\x25\xa1\x17\x43\x99\xdf\x3b\x83\x6d\xf7\x0f\x66\x15\xd5\x76\xae\xb2\x65\x96\x56\x19\x17\x9c\x7b\x24\x3a\x0c\x73\xf8\x45\x11\x62\x1c\x48\x01\xe9\x6a\x81\x11\xc3\xac\x10\xd3\xb4\xa8\x53\xd1\xcf\xd3\x2a\x15\xfd\x72\x0b\xca\x40\x2c\xaa\x2c\x46\x26\xa8\x61\xe2\xa2\xa9\x42\x31\xbe\xc8\x8f\x0c\x29\xa7\xd5\x93\x83\x6a\xf5\xb2\xd5\x02\x99\x6a\xdd\xb9\xf4\x84\xaa\x30\x00\x17\xa1\x5e\x10\x08\xde\xc3\xf5\x59\x1b\x0d\x47\xa0\x75\x5f\xe6\xdb\x02\x40\x3f\x25\x54\x4c\x7b\x62\x3e\x79\xfa\xc0\x83\x1a\x73\x2c\xb5\x2d\x57\xc0\x8d\x04\x57\x6b\x60\x26\x8c\x80\x6f\x50\x52\x2d\x51\xa1\x4a\x50\xae\x07\x03\x64\x96\x19\x9e\xda\x99\xb3\xe8\x58\x72\x8c\x9b\x9d\x87\x3f\xe1\x1e\xbc\xad\x36\x65\x85\x04\xd4\x7a\x5c\xd0\x67\xa2\x31\xa0\x0d\x6f\x3a\x6a\xdf\x40\x99\x39\x7c\xa8\x9d\xf0\xfb\x52\xef\xd6\x39\xf2\xc9\x95\xc8\x11\xed\xb0\xed\x81\x2f\xd1\x5c\x64\x54\x7c\x67\x6f\xe6\x46\xf4\xbc\x72\x7e\x50\x6b\xa0\x86\x49\x09\xe9\xfe\x52\x20\x79\x2e\x1d\x30\x3a\x16\xef\xd2\x2c\xdf\xea\x6e\x17\xf2\x16\x4a\xa3\x01\x29\x98\xeb\x09\xdf\x71\x82\x09\xc3\x6a\xf4\x94\xc6\x02\xe3\x7b\xb3\x8d\x14\xe2\xae\xb3\xb5\x8c\xf6\x9c\x57\x7a\xf6\xf5\x3a\xd3\x5f\xa1\xb6\xa6\x6c\xa4\x60\x74\x83\x51\x68\x0f\x51\x19\x2e\x6d\x8c\xb0\x22\xb9\x70\xba\xe3\xde\x1b\x98\x50\x62\xa4\x00\x1e\x0a\xb3\x38\xfd\xa4\x74\xd8\xb7\x4d\x25\xff\xbe\x5d\x02\x17\x7f\xa3\x31\xb0\xa1\x91\x29\x6a\x8e\x85\xec\x35\x51\xb1\xfe\xef\x40\x7f\xfd\xf0\x43\xfc\xfc\xa2\x2c\xeb\xbc\x4c\x97\xb2\x3a\xb6\xa4\xec\xbf\x2d\x12\xec\x30\xfe\xeb\xe4\xe4\xf5\xab\xd7\x01\xfe\xeb\xe5\xc9\xf9\xc9\x1f\xf8\xaf\xef\xf1\xc7\xcd\x3e\xc5\xd6\xb5\x1d\x7c\x36\xf0\xef\x6a\x60\x22\x98\x5e\x11\x45\x39\x0f\xd5\xf1\x3a\xdc\x84\x72\x55\xa7\xdb\x02\x6e\x43\xc4\x64\xde\x64\x1c\x90\xeb\x39\xb0\x6a\x53\xca\x6f\xee\xda\x86\x57\xc4\x1c\xae\xd2\x98\x99\x81\xcc\x03\x2b\x8b\x27\xb7\xdd\x92\x1e\x00\xb2\xd5\x12\x08\x78\x10\x1c\xa4\x6d\x09\xbe\xa9\x6d\x3d\xdc\x49\x99\x74\xc4\xa2\x5c\x33\xee\x08\xe9\xe0\x24\x56\x7e\x21\x16\x47\xb3\xbd\x38\x69\x9f\x4b\x75\x69\x00\xc1\x59\x61\x49\xd3\xe0\x8a\xa1\xde\x8a\x50\x98\x90\x08\x17\x5a\x29\x19\x8d\x6a\x44\x11\x00\x41\x20\x89\x8e\x89\xad\xe2\x57\xc3\x07\x93\x3a\x42\x05\x84\x24\x69\xb7\x32\xee\x3a\xe3\x15\x3f\x1f\xa6\xb5\xfc\x7c\x26\xbf\x15\xf8\xf3\xf1\xfd\x7f\x7a\xf6\xfa\x65\x88\xff\x3c\x7b\xf1\x07\xfe\xf3\xbb\xfc\xf1\xcb\x23\xce\x4e\x4e\x5e\x47\xfa\xff\x7f\x82\xff\xff\x59\xff\xff\xe9\x89\xf8\x6b\x5a\xe5\xe2\x42\x56\xd5\x2e\x0e\x8a\x94\x4e\x7f\xfe\xe9\xa7\x48\x9c\xfe\xfc\xf3\x0b\xf8\xc2\x6b\x31\xad\xe5\x46\x2f\xc4\xf7\x59\xbe\x2e\x2b\xd9\xfc\xbc\xfe\xe4\xe9\xcf\x3f\xbf\x84\xff\x7f\x25\x66\x65\xa5\xb4\xdb\x76\xa5\xaf\x9c\xda\xc9\x8a\x9f\x5d\x3b\xdb\x90\xb9\xa0\x94\xa9\x66\x0b\x00\x75\xf7\xb2\x9a\xa7\x75\xb6\xf6\xd8\x9c\x32\xed\xe0\x16\x94\x1e\x33\x89\x7f\xce\x99\x4e\x65\x25\xd6\xe7\x65\xe6\xc8\xfc\xaa\xb2\x09\x1f\x2a\x6d\xc7\xe4\x14\x30\xe0\xef\x6d\x21\x24\xc8\x82\x16\xb6\x0a\x2b\xf1\x36\x7a\xfc\xa2\xe6\xe6\xb8\x42\x52\x4f\xdb\xb7\x1d\x00\x65\x9a\x8a\x37\x14\x88\x71\xac\x28\x4b\x59\x41\xd1\x90\x21\x89\xe4\xe5\x52\x2d\x00\xad\xb4\xa5\xef\x48\xd3\xb7\x48\x73\x7b\x95\x2a\x0b\xf9\x85\xbd\x06\x3f\xda\x90\x59\x05\x1d\xa6\xa4\x31\x1a\xc1\x3c\x2d\x6e\xb7\xc0\xdc\xe6\x5a\x47\xa5\xab\xfe\x68\x34\xc6\xf1\x7f\x8b\x0b\xf6\x2f\xfd\x13\x3f\xbf\x1a\xcc\x8e\xfb\x57\x37\xff\x3a\xfb\x7f\x76\xf6\xf2\x3c\xb4\xff\x27\x27\x2f\xff\xb0\xff\xdf\xe3\x8f\x33\xcf\xa7\x3f\xff\xf4\x33\x18\xe5\x53\xf8\xff\x33\x7d\x5d\xec\xa7\x55\x21\x6f\x33\x29\xae\x64\x9e\x97\x85\xb8\x29\x32\xd8\x7d\xf5\xee\xd9\xa5\xb6\x33\x29\x94\xdc\x7d\xd4\xa6\xe6\x18\xec\x39\x7c\xf5\xa7\xe3\xb3\x93\x93\x13\xc1\x1f\xed\xff\x46\xbb\x4c\x13\x79\xcb\xa9\x94\xdc\x93\xfd\x90\xd3\xb3\x5e\x9e\x13\x10\x44\x4c\xc8\x1c\x73\x4b\x64\x18\x31\x39\x0e\xbb\x09\xba\xce\x94\x83\xef\x03\xc0\xb0\x56\x56\x47\x2c\xb5\x30\x5a\x1b\x23\x20\xa2\x33\xe3\x16\xae\x24\xe0\x97\x39\xfe\x1c\x59\xf3\x42\x63\x6c\xec\x56\x78\xcc\x00\xc4\x00\x8b\x15\xed\x29\xe2\x40\x59\x44\x28\xe6\xa9\xe3\x3c\xe1\x80\xb2\xb8\x05\x42\xf4\x80\xf1\xe7\x7d\x62\xb8\x2f\xdd\x38\x53\xf2\xd8\xbf\xba\xc1\x64\xd7\xd3\x27\xc1\x5c\xeb\x41\x59\x16\xf2\x38\xf7\xb2\xaa\x33\x23\x9e\xc6\xb4\x16\xb1\x6e\x91\xe2\x12\x6d\x60\x3f\x57\x84\x6e\xe2\x2b\x86\x0a\xd1\x04\x70\xb8\x54\xa9\x6e\x6b\x6f\x84\xfc\x20\x93\xe4\x7d\x32\x9a\x4d\x2d\x0f\xc5\x68\xf0\x4b\x32\x99\x52\x5a\xaf\xdf\x1b\x0e\xde\x8d\x27\xa3\x41\xcf\xa6\xc4\x21\x23\xce\x32\xe1\x94\x50\x7e\xdf\x9b\x5c\x62\xbe\x73\x30\x65\xc9\x68\xc6\x96\xf1\xd4\x44\x3a\x27\x4c\x89\xbd\x24\xf3\xf4\x83\x7e\x88\x6e\x3c\x31\xd0\x3c\xb5\xed\xcd\x8c\x34\xa3\xeb\xc0\x94\xf4\x81\x8c\x33\xe5\xb0\xe9\x9f\x1f\x3f\xf4\x66\xd3\x71\xf2\x4b\x32\x11\x93\x64\x7a\x33\x84\x44\xef\xbb\xc9\xf8\x0a\x9a\xe0\xe5\x98\x0d\x13\x87\xcd\x40\x9b\x94\x2d\xa2\x16\x7a\x98\x47\x66\xb9\xda\x88\x65\x63\x1d\x3f\x86\xcd\xde\xe2\x17\xa2\x96\x8c\x73\x4b\x66\x9a\x91\x8a\x34\x58\x63\xd8\x14\xfd\x71\xda\x7f\x93\x3f\xf1\xf3\x7e\xff\xf8\xe2\xd3\xf1\xa8\x7f\x3c\xed\x1d\x9f\xc5\x27\xdf\xc0\x0f\x38\x7c\xfe\x9f\xbf\x7c\x79\xf6\x22\x3c\xff\x5f\x9d\x9f\xfd\x71\xfe\x7f\x8f\x3f\x7d\x48\x26\xde\x4b\xd1\x2f\xd7\x6b\xed\x6a\xf7\x1c\xaa\xed\x78\x54\x16\xfa\xc7\xb2\x5a\x64\x69\x7e\x3c\xbd\x4b\x2b\xd9\x83\x52\xfc\xb3\xf8\x44\xf4\x27\x49\x6f\x36\xf8\x25\x11\xfd\xf1\xd5\xd5\x78\x34\x15\xfd\xf1\xe4\x7a\x3c\x41\x4c\xcb\x00\x21\x53\x3d\x60\x4a\x7a\x37\x98\x5c\x81\xb1\xb4\x50\x2a\x43\x85\x35\x4c\xde\xf7\x86\xc4\xdd\x94\x4c\x63\x6d\xbb\x67\x93\xc1\xc5\x8d\xb1\x37\x60\x01\x86\x83\x7e\x32\x9a\x32\x20\x16\xbc\x39\x01\xcb\x34\x9b\x8d\x27\xa3\xe4\xd3\x71\x7f\x38\xd0\x86\x17\x01\x2d\xe3\xd1\xf4\xc3\xe0\x3a\x6e\xb6\x90\x5e\x3b\xc5\xe7\x22\x98\x09\xdb\x3b\x06\x43\xd7\xe9\x4d\x8f\x07\xd3\x8e\xb8\xe8\x4d\x07\xd3\x96\xef\xb7\x40\xd0\x18\xb4\x0c\x98\xb6\xd8\x33\x0d\xd4\x0d\xe1\x2a\x0e\xa9\xa5\x2d\x3c\x1e\x20\x8c\xaf\x29\xb4\xd1\x83\xd9\x54\x5b\xc5\xf8\x99\xa9\xa3\xd3\x4f\xff\x38\x9e\xfc\x55\x1c\xf5\xa6\xe2\x32\x79\x87\x3c\x48\xc9\x70\xfc\xb1\xeb\xe1\xea\x00\x74\x03\x6d\x41\x0a\x1b\x33\x8a\xcd\xc1\xb8\xb9\x18\x0e\xfa\x76\x74\x8f\x3a\xfd\xfe\xf5\xb0\xa3\xcd\x70\x87\x7e\xd6\xe9\x22\xdd\x17\xbc\x16\xdf\x31\x4b\xfa\x44\x98\xe6\xd8\xad\x3c\xb2\xb3\x90\x47\x4d\x9f\x48\x0c\x3b\x04\x8f\xa2\xd3\xe2\x83\x9e\xc0\xa9\xe8\xdd\xcc\x3e\x8c\x27\x83\xff\xc3\xda\xce\x26\x1d\x4e\x3b\xf3\x26\xbd\x98\xb0\x1d\x1f\x06\x17\x83\x59\x72\x19\x3f\xbb\xf8\x24\x92\xbf\x25\x93\x3e\x1e\x34\xfa\x6d\x04\x44\x22\x48\x13\xbc\xd0\x0e\xce\x87\x64\x62\x08\xc5\xfa\xc0\xef\xa6\x67\x06\x58\xbc\xf4\xe7\x2f\x12\x71\x31\xbe\x19\x41\xf7\x9a\x03\x48\x2d\xc2\x21\xc1\x7f\x8c\x27\x88\x77\x9a\xc2\x23\xe1\xa0\xc7\x97\xeb\x73\x12\x99\xaa\x90\x97\x0e\x4e\xbd\xe9\xe0\x32\xa1\xed\x31\x7e\xa7\xbf\x31\xa1\x56\x98\xf3\x0e\xb0\x49\x6d\xc4\x43\x31\x95\x59\x5e\x5a\x8d\x15\x83\x8a\x4e\x63\xd1\xe9\x23\x05\xae\xf1\xc4\x8d\x56\x40\x6a\xd5\xcb\x48\x82\x43\x7b\x56\x59\xb9\x84\x8b\x7d\xa6\xd4\x16\x32\x63\xf5\x5d\x99\x97\xb7\x3b\xac\x37\x5b\xec\x16\x79\xb9\x91\xcb\x2c\xa5\xec\x9e\x21\xee\xfe\x48\x34\xff\xda\x6f\xc6\x88\x03\xb2\x35\x6d\x0b\x7b\x2b\x5f\x95\xd5\x3a\xf2\x2b\x42\x1c\xeb\x63\x69\xd8\x78\x9d\xba\x79\x84\x49\xa2\xac\x26\x92\x72\x12\x8e\x25\xc6\x6c\x07\x93\x40\x0e\x79\x8c\x38\xaf\x95\xcc\xef\x21\xf8\x59\x41\x6e\x53\xae\xe7\x39\x8f\x74\xda\x71\x80\xd4\x4f\x2c\x7a\x46\x80\x08\x89\x98\xf1\x6d\x40\x07\x15\x8c\x59\x23\x79\x45\x95\x76\xa9\x08\xaf\x39\x47\x29\x49\xdd\xc8\x25\x16\xc8\x76\x1d\x5d\x44\x58\x85\xc7\xf9\x57\x85\x10\xf3\x58\x74\x82\xc7\xf9\x73\x45\x7c\xeb\x16\x64\x05\x2f\x04\x9c\x3e\xff\x81\x95\x8c\x11\x9b\x4a\x1e\x03\x90\xd8\xb0\xe1\x2a\x3e\xdb\x2c\x02\x13\x89\xf5\x56\xc1\xbc\x7b\xd4\xe0\xcb\x2a\x5d\xa7\xb5\xd5\x77\x5b\x61\xa4\x3a\xcd\xed\x4f\xd6\x25\x56\x53\x65\x0b\xce\x87\x19\x09\x05\xe0\x8e\x4a\x12\x6f\x98\x9e\x8f\xda\x02\xba\xe9\xea\x01\x55\xa8\xf8\x9e\x45\xa9\xa7\x52\x39\x19\xb9\x00\x8f\xd2\x5c\x6a\x94\x9e\xae\xe4\x22\x55\x88\x00\x2f\x94\xfe\xa8\xbe\x76\xe9\xef\x2f\xd3\x0d\x5c\xc1\x08\xb6\x4c\x6c\x9e\xbf\xf9\x64\x07\x33\xdb\xa4\x93\x30\xa5\x5b\xe9\x7d\x99\x2d\x0d\x9f\xe7\xb2\xdc\xce\x31\x13\x4e\xac\x51\x1f\x29\x14\x97\xda\x69\x58\x94\xeb\x4d\xa9\x2c\xca\xa4\x31\x9e\x70\x53\xda\x15\x8b\xbb\xaa\x34\x32\x7b\xe6\x02\x65\xb6\x62\x9d\xad\xe5\xf2\xd8\x96\x21\xd0\x96\x5b\x97\x58\x18\xbf\x4e\x6f\xa5\x38\xea\xc0\x33\xb2\xe2\xd6\xd4\xb2\xff\xb3\x1d\xa6\x95\xbc\x88\x45\x67\x48\x3a\x8a\x66\x09\x23\xce\x86\xd7\xb2\x9b\x82\x58\xc4\x3e\xad\x64\xa5\x5c\x07\x1e\x51\xa1\x31\x2f\x5a\xc6\xa2\x33\x36\xca\x8d\x3d\x48\x27\x3d\xfa\x3e\x50\xb9\x87\xc2\x83\xa5\x7d\x9f\x79\x9e\x8c\x45\x87\xef\x3b\x2f\x2a\x0c\x88\x1b\x54\x36\x33\xc4\x40\x04\xec\xc2\x2a\xab\x27\xb6\x79\x15\x0b\x28\xdd\x37\x5b\x3b\x2c\xf1\xa7\x66\x36\x6b\xab\x5a\xe8\xd6\x51\x72\x96\x08\x5e\x08\x0a\x97\xef\x0c\x16\x74\xb9\xbf\x31\xad\x00\xbc\x8f\x46\xe2\xc6\x3c\xd6\x32\x4c\xb5\x68\x33\xd9\xa4\x97\x99\x68\x54\xb3\x21\x91\x8c\xfd\x4d\x5e\x4a\xb5\xc9\x6a\x90\xb2\x30\xd8\x3d\xab\xe8\x6b\x86\xe8\xd6\xae\x1f\x29\x92\x1c\x21\x7a\x7c\x4a\x1c\x9b\xdc\x5d\x76\x7b\x77\x9c\xcb\x7b\x69\x61\xaa\xb6\xec\x42\x6f\x6d\x25\x14\xb0\x4f\x21\x2a\xc5\xb6\x94\xce\x10\x10\x2e\xb5\xa5\x20\x75\x56\xe7\x8d\x15\xfd\x86\xfb\xbb\x91\x18\x95\xc5\xc2\x3a\xbc\x91\x70\x1e\xaf\x29\xbb\x7a\x97\x66\x15\xf0\xb3\x63\x48\xaa\x59\x33\xc5\x34\x4d\x00\x75\x46\x82\x29\x95\xc4\x52\x17\xc8\x7f\x46\x08\xa2\xa0\xa2\x3b\x0e\x84\x25\x64\x12\x8c\xfd\x4a\xbf\x0a\x62\x5b\x28\xc7\x8c\xd8\x18\x53\xe6\xee\xe8\x1f\x99\x4a\x23\x31\x16\x58\xa8\x46\x28\x11\x5d\x3e\x14\xb2\x6a\x94\x46\x11\xb4\x16\x9f\xcb\x84\x14\xf2\xf4\x41\x99\x02\x2d\x33\x5b\x40\xf4\x10\x7f\x11\x91\x83\x4d\x09\xdb\xe9\xf1\x89\x1c\xa0\x98\x6f\x9f\x16\x5b\x83\x8b\x61\x23\xab\x8d\x84\xca\xa7\x23\x63\xac\x96\x5b\x9f\xf3\x82\x75\xc1\x76\xb2\xcb\x39\x1b\xec\x2a\x66\x25\xd0\x19\x3f\x61\x95\x11\xaa\x87\x13\xfe\x8d\xf3\xb5\x60\x26\xa9\x6e\x89\x6d\x29\x90\xae\x70\x45\x7f\xcc\x4c\xd7\xa5\x27\x26\x13\x9c\x44\x2e\x3f\xdd\x7c\xaa\x6e\x05\x7b\xa8\x5d\xc6\xe1\x23\xde\x3a\xef\xa2\x36\x86\xcf\x2f\xb0\x0a\xad\xbc\xfd\xca\x22\x0e\x52\xe3\x4e\xcf\x7a\x73\x57\x16\x25\x1e\x48\x0a\xb4\x73\x96\x99\xda\xe4\x86\x26\x7e\x91\xef\x60\x26\xe0\xf4\x76\x3f\x01\xb4\x63\xf0\x53\x90\xbe\x84\x8d\x0d\xc9\xa6\x65\x76\x9b\xd5\xda\x0f\xd9\x2e\xb3\x32\x10\x62\x76\xa3\x66\xab\xdd\x9a\x43\xb0\xaf\xfb\xcb\x7f\xab\xbe\xec\x1b\xf1\x99\x0d\x12\xfb\x38\x3d\xb3\x22\x97\x26\x46\xbc\xd6\x4e\x38\x51\x87\x55\xeb\xb4\x56\x16\x58\x57\x94\x0f\x20\xfb\x55\xf8\x92\x94\x4b\xa4\xed\x8f\x9b\xaf\x30\x2c\x0b\x35\x57\x60\x74\xf2\x77\x6b\xaf\xe2\x3a\xc5\xaa\x47\x5b\x2e\x9a\xef\xfc\x4a\xb0\x3d\x5b\x07\x6d\x47\xa3\xd1\xbc\x8a\x71\x4f\x3d\xa2\x67\xb6\x9b\x65\x88\x1e\x4c\x70\x5b\xbb\xc2\x5d\x69\x19\x49\xe8\xf1\x8e\xb7\xc6\x95\x7a\x2a\xf1\xe2\x48\x76\xa1\x45\x2f\x8e\x56\x5d\x53\xaf\x36\x61\xb0\x0c\x1c\xb0\x9c\x6b\x75\xfb\xf5\xc4\xe7\x34\x9a\x99\x62\xad\x07\x1e\x15\x06\xfa\xb4\x84\xbc\x8e\x18\xd3\x9d\x61\x1c\x05\xc2\x6c\x89\x11\x86\x72\x6b\x36\x72\x2b\x8d\x96\x28\xfb\x09\x2d\xc6\xc8\x05\xdc\xe1\x63\xb0\x04\xdd\xaf\xd9\xbd\xe1\x10\x23\x87\xa7\x8f\xdb\xca\xc7\x01\x85\x9e\xa4\x1e\x04\x89\x01\x78\xfa\x44\x52\x95\xf6\x80\x94\xdc\xd0\x85\x8f\x5a\x7c\x0f\xa0\x97\xa5\x07\x79\x7b\xd0\x73\x64\x7d\x5a\x83\xdf\x60\x00\x7c\xc1\x2d\x54\xdd\x24\x3d\x5d\xaa\x86\xa4\x91\x60\x06\x07\xaf\x0f\x79\x8d\x1f\xb5\x07\xf3\x7e\xe7\x8a\x46\xc5\x95\xcb\xff\xf8\x98\x44\xb2\xad\x06\xf0\xdb\xe7\xb4\x4f\x9d\xab\xea\xe6\xe3\x57\x29\x37\xfa\x0c\x49\x17\x20\x92\xe3\x57\xbb\x56\x72\x85\xec\xb4\x0d\x7d\x1e\xda\x17\xad\xdc\xd1\x80\xea\xe7\x2d\xf8\x46\xab\x0f\xaf\x23\x30\xda\x8b\xbb\xa2\xcc\xcb\x5b\xb8\xf7\xac\x65\xaa\xb6\x95\x64\xf2\x56\x55\x99\x1b\x0e\x8a\xd2\xe3\xeb\xf9\x68\x95\x05\x09\xe6\xaf\x4f\x82\xa6\x00\x63\xfb\x04\x05\xac\x13\xb8\x83\x99\xb4\xc6\xa1\x43\xb6\x71\x5f\x34\x5a\x30\x99\xe2\x94\x09\x50\x10\xdf\x76\x22\x8b\x14\xb0\xa6\xd6\x7f\xc6\x8e\xd4\xa0\x4e\x89\x00\xd8\xd0\x7a\xec\xbf\x52\x18\x46\x24\x73\xac\x37\x9b\x06\xb1\x01\x4a\x09\x92\xba\x3a\xb3\xa8\x66\x29\x45\xe6\x35\xa6\x82\x00\x55\x57\x51\x55\xb3\x92\x6b\x3d\x3c\xb6\xc1\x8d\xfe\x00\x2a\x0e\x38\x3c\x51\x97\x13\xce\x0d\xfb\x0e\xda\x0c\xc1\x35\x2d\x12\x70\xbf\xf8\xc7\x56\xaa\x5a\x1f\x4b\x61\x47\x82\x13\xf2\x9b\x74\x24\xbc\xdd\xfe\x16\x1d\x71\xde\xd6\xb7\xb1\xdf\xcd\x3b\xf9\x13\x0d\x79\x20\xe3\xd2\x7a\x1f\xb4\x15\xf0\xe1\xe5\x0b\xab\xe1\x3d\x55\xea\x4a\xaf\xb6\x30\x39\x90\x99\xbf\x38\xab\x95\x06\x95\x61\x4f\x7a\xbe\x38\x92\xf1\x6d\xfc\xf4\x5c\xc3\x7f\xa4\x9b\xb4\xe8\xc6\xbf\xfd\x51\xc5\xee\x53\xa4\x6b\x47\x12\x31\xd6\xdf\xb6\xb7\x58\x25\xf5\x7d\x6e\xf1\x94\xe3\x0d\x58\xc7\xc3\x79\xfc\x57\x1f\x75\xa1\x4f\xfa\x5d\x8f\xbd\xc0\xd3\xf8\x7d\x9e\x6c\xe1\x8c\xfe\x0e\x0e\xb9\x86\x09\xfc\xf6\xe7\x5d\xf8\xca\xaf\x3c\xfa\xdc\x1d\x95\x4f\xaa\x5d\x6f\x4c\x33\x34\x58\x73\x8e\xa5\xad\xe1\xc2\x63\xd9\x08\x2f\x1b\x04\xd6\x6f\x23\xd8\x69\x03\x36\x2b\x3c\x0d\x96\x59\x85\xb1\xa5\xba\x7c\x48\x2b\x00\xa6\x93\x7d\x12\xe9\xf2\x3e\x2d\xea\xf4\x56\x62\x05\x89\xee\xb0\x14\xeb\xb2\x40\x9e\xe3\x45\xb9\xde\x98\x80\x37\x4e\x8e\xfc\x4c\x8c\x8d\x7c\xe2\x57\xd6\xfa\xd8\x38\x85\xb4\xa2\xb9\xec\xaa\x69\x2e\x9a\xab\x2c\x97\xc7\xea\x2e\xad\x08\x77\xe3\x18\x47\x5d\x09\x9c\x1f\xe1\x35\xf5\x97\xdf\xa0\x5f\x1e\xfe\x49\x1a\x86\x47\xab\x26\x4b\xda\x62\xad\x5f\xdd\xa7\xf3\xc1\x07\xa9\x31\x22\x2c\x24\x6c\x84\x35\xbe\xd1\xc5\x09\xf3\x13\x0d\x73\x59\x56\x2d\xe1\x9b\xbd\x16\x2d\x84\x72\xb9\x52\x46\x9b\xc4\xb1\x4a\x11\x81\xc7\xa1\x9d\xa4\x65\x56\x93\xf4\x35\xaf\x03\xd5\x17\xec\xed\x1a\xa2\x49\xb0\x36\x0c\x91\xd9\xb6\xce\x72\x54\x89\x06\x6d\x52\xae\x2d\x09\xa8\xaf\x23\xdd\x75\x25\xb7\xcb\xb2\xd8\xad\x81\x07\xdd\x86\xc8\xba\x66\x45\x86\x8d\xc8\x56\x00\x2c\xcb\x33\xb9\x7c\x1b\xc6\x4f\xcd\xce\xf6\x3e\xe2\xf9\x65\xb6\xed\x3b\xdf\x45\x7b\xe4\x84\x66\x24\xed\x7a\x77\x5a\xd7\x8c\x09\xb7\x95\x54\xd7\x08\x85\xcb\x72\xe9\x56\xcf\x47\x2e\x8c\x0b\x9e\xdd\xcd\x64\xc0\x2d\x98\x3d\x55\x5a\x20\x7a\xa5\xf1\x00\x30\x96\xeb\x78\xdd\xf9\xac\xbd\x15\x8c\x9c\x70\x91\x2a\x52\x6f\x6b\xb8\xb2\xa9\x99\x41\xd2\x3b\xb7\x93\xd1\x62\xf9\xdb\x2c\x26\x38\x47\x91\xe8\xbc\xd3\x8e\xea\x1d\x4f\xe4\x79\xdf\x9e\xef\x1a\xbe\x6a\x47\x77\xa4\x33\x5d\x54\x52\x16\x10\xe2\xb2\x0a\xce\xa5\xf9\xe4\x9e\xaf\x76\xba\x54\x0c\x4d\x4d\xa7\xc0\x54\xb6\xde\xa0\x0b\x47\x67\x05\x78\xd0\x76\x59\xa2\x25\x7d\x6b\x2d\x41\xe4\xf8\x63\xd1\xba\x3e\x32\x54\x2d\x7b\x2a\x82\xa2\x42\xb1\xce\x8a\x6c\xbd\x5d\x53\xf5\x25\x36\xc9\x30\x71\xca\xb4\xa2\xe4\x9a\xcb\x23\x82\xd4\x0f\x92\xf3\xb2\xcc\x0d\x7d\xd1\xe0\x2f\x69\xf6\xec\x61\x6b\x65\x60\x52\x85\x0c\xc9\x20\x65\x4b\xf2\x9a\x4f\x78\x30\xcb\x2a\xfd\x06\x89\x40\x13\x1a\x12\x42\x64\xb1\xb8\x46\xb3\x04\x8f\x9a\x40\x40\x5c\xaf\xfe\x1b\xb8\x06\x5c\xe4\x69\xf1\xab\xb4\x14\xcb\x2a\x76\x1b\x85\xe2\x66\xaa\x2d\x21\xc0\xe4\x72\x5d\x9d\xae\xcb\x4d\xe5\xe0\xc9\xde\x67\x29\x22\x05\xec\xdb\x4d\x7c\xad\x5c\x64\xb2\xde\x19\xcf\x7d\xda\xef\x5d\x47\xe2\xe2\x6a\x10\x89\x69\x32\xed\xf5\xbb\x26\x6e\x9f\x31\x53\x47\xda\x87\xfc\x69\xd6\x08\xdb\x53\x8d\xff\x16\x1f\xfe\x20\xe7\x8b\x54\xd5\xdd\xd0\xd8\xa0\xae\x22\xfb\xf8\x77\x38\xbd\xd9\xa4\x64\xb1\xb8\x92\xfa\x84\x82\x99\x9b\x38\xee\x92\x69\x9d\xd6\x5b\x10\x1e\xb7\x33\xf5\xdb\x4f\x09\xac\x18\x9b\x28\x02\xda\x07\xac\xec\x55\xd9\x2d\x52\xcc\xe8\x1f\xd6\x34\x84\x1f\xd2\xaa\xda\x89\x77\xe5\x67\xd1\x83\x8f\x36\xa6\x07\xb0\xce\xec\xd6\xc2\x2e\xe7\x7e\xe4\xe2\xa8\x83\xa5\x68\x46\xa1\xb4\x1b\xa0\xab\xa3\xd0\x9d\xd3\xc3\xb7\xcd\x95\x1e\x0e\x73\xa9\x32\xe9\xd8\xf9\x4e\x9c\xbe\x16\x37\xd3\xbe\xe3\xe2\x3b\x7d\x69\xc1\xc7\x53\x86\x18\xef\x2d\x6a\x38\xb5\x60\xcc\xfe\xb1\xcd\xee\xd3\x1c\x8b\xf3\x69\x5b\xf2\x0a\x7b\xd5\x85\x63\xa3\x41\x0f\x6c\xeb\x8b\xbd\x0e\x7c\xc7\x45\xb3\x8a\xc5\x47\x5c\xca\xfa\x00\x78\x6c\xc1\x7c\xa9\x09\x69\x80\x06\xbe\xa1\x11\x38\x6e\x35\x02\x53\xdd\x82\x84\x9c\xb6\x43\x06\xe0\xcb\xb6\xfa\x3f\xbb\xa2\x5e\xfc\xa6\x2b\xea\x40\x17\xbe\xd3\x4a\x7a\x19\x8b\x49\xc8\x76\xe3\x48\xf6\x60\x41\x39\x06\x3e\xfd\x05\xd2\xae\x74\xb2\xa5\x57\x37\xb3\x1b\xa0\x8b\x73\x82\x95\x04\x71\x33\xc2\x89\x4e\xbf\x32\x72\xd8\xb6\xf1\xbb\x77\xc9\x64\xea\x60\x74\x80\x8e\x04\x68\x9a\x05\x42\x4e\x92\xeb\x49\x32\x4d\x46\x33\x62\x70\x1b\x4f\x02\xcc\xbc\xe5\x40\xeb\x8f\x47\xfd\x64\x32\x32\x40\x49\xfd\xc0\xa8\x85\xb6\xcf\x71\xf6\x19\x48\xa1\xee\x81\xa7\x72\xda\xa4\x50\x8b\x82\x97\xce\x06\xb3\x61\x12\x59\xbc\xfe\xe0\xa9\xc4\x77\x51\xc8\x60\x17\x19\x00\x7f\xef\x62\x9a\x10\x4a\x6f\xd8\x03\x76\x3e\x8b\x78\x44\xa5\xd2\x69\x24\x50\xb1\xb2\xff\xc9\x7e\x09\x87\x06\xbf\xc5\x1e\x00\x2c\x81\x0c\x64\x3f\x9e\x00\xaa\xf5\x72\x30\x05\xfa\xb6\xde\xc5\x30\x89\xc5\x74\x7c\x95\x88\xff\xb8\x99\x0c\xa6\x97\x83\x3e\x8e\xed\xe5\x18\x31\xb5\xc3\xe1\xf8\x23\xe9\xd8\xf6\x87\x37\x53\xc2\x13\x36\x4b\x16\x22\x31\x1d\x23\xa6\xd0\x7d\xf0\xaa\xf7\x09\x1f\x72\x7d\x3d\xfc\x44\xb2\xa1\x86\x06\x8d\x33\xe8\x15\x4c\x1a\xd5\x68\xe1\xfa\xea\xb9\xfb\x95\x51\xa3\x26\xe1\x9e\x5d\x52\x0d\xc9\x52\x00\xde\x7e\x22\x20\xf0\xec\x43\xa2\x67\xbe\xa5\xf6\xc1\x91\xf0\x79\xb5\x0f\x91\xb8\xbe\x19\x0d\x00\xd6\x3a\x9e\x38\x5a\xbe\xfd\xfa\xa5\x3e\xb2\x34\xe0\x14\xa4\x35\x49\xbc\x72\xb6\xcd\x5f\xcb\x2c\xf7\x3a\x6e\x21\x94\x4b\x89\xac\xc7\x0b\x6b\x1d\x08\x9c\xa1\xd7\xeb\x18\xd8\xd2\x6d\x5d\xea\xab\x09\xe6\x66\x21\x68\xae\x8f\xf2\x79\x05\x31\x47\xe2\x46\x26\xfb\xb7\x2f\xa7\x60\xad\xbd\xb2\x78\x24\xa0\xbd\x02\x54\x10\x17\x9e\x7b\xca\x1d\x18\xdd\x85\x4f\x50\xdd\x1f\x82\x81\xd8\x7d\xc0\x62\xee\x8c\x9a\x79\x56\x39\xe2\x39\xc6\x93\x67\x83\x0a\x0a\x99\x99\xda\x9b\x8a\x9c\x4b\xda\x78\x83\x22\x63\x93\xc5\xbb\x54\x36\xa9\xab\x62\x26\xb2\x1a\x89\xb3\x48\xbc\x8c\xc4\xab\x48\xbc\xc6\x98\xe4\x4f\x3e\x55\x9a\x09\x9b\x86\x74\x69\x4d\x2c\x67\x80\x81\xc1\x10\x53\x1b\x12\x06\x6f\xbd\x61\x8a\xd9\xc4\x4c\xbe\x12\xd0\xc2\x01\x2b\xdd\x76\x82\x7d\x68\xd1\x3e\xb7\xc0\x3a\x03\x95\x44\x1d\xac\x00\x9a\xe7\x24\xc1\x7d\x02\x73\xc4\x81\xa9\xba\xdc\xf8\x02\x05\x2e\xb2\xe1\x38\x61\x5a\x2e\x86\x8e\x17\x1d\xe6\x17\xc0\x5b\x96\x5d\x0b\x32\xa2\xba\x89\x20\xba\x99\xd5\x77\xcb\x0a\xd4\x65\x79\xde\xc0\x43\x8f\x7a\x59\x88\xbb\x54\x89\xb9\x94\x88\x30\xcd\x94\x09\x59\x52\x10\x2c\x6a\x30\x20\xef\xd9\x1f\x5d\x46\x85\xe4\x92\x27\x01\xe1\x23\xac\x3a\xa4\xcf\x01\xca\x2e\x8f\xff\x91\xad\x66\x87\x24\x82\xc9\x80\xd5\xf3\x53\x0b\xd5\x1e\x1a\x86\x04\x04\x51\xb3\xb5\x0c\xd9\xfe\xbf\x20\x72\xd5\xbc\x4f\x7b\x18\x3e\x83\xc3\x2c\xfd\x48\x3e\xa3\xce\xe7\xd9\xd1\x92\x91\x26\xb7\xab\x41\xa8\xd6\xb5\x4d\x21\xd8\xa6\x41\x60\xdb\xe7\x2b\x3b\xdb\x12\x6e\xf9\xf2\xce\xf9\xc1\x90\x6f\xd6\xcb\x85\x25\xd0\x73\x34\x72\x61\x10\x1f\x70\x82\x48\xfe\xd6\x20\xc5\x23\x16\x78\x0f\x91\x17\x81\xf8\xa5\x63\x3c\x6b\xa3\x3f\xaa\x1c\x87\x1c\xf2\x4c\x9a\x40\x39\x58\xcd\xa5\xe3\xa8\x3a\x00\x0a\xb1\xb5\xaf\xdb\x0a\x71\x81\xb8\x4f\x09\xdc\x62\x48\x0e\x4d\x92\x26\x75\x14\xa4\x48\xa2\x64\xfb\x6b\x19\xb3\x2a\x89\x00\x6e\x1b\xcb\xa4\x08\x0f\x05\x0c\x3d\x94\x91\x43\x27\xb9\x07\xb5\x12\xe4\xb1\xa0\xf0\xa8\x84\xee\xf8\xa4\x7d\xe1\x68\xdb\xd6\x10\x21\x15\x10\x51\x2d\x49\x32\xc1\x1c\xa2\x44\xf6\x85\x4d\xe5\xf1\x44\x43\x5b\x55\x35\xf9\xc0\x18\x21\x17\xb0\x58\x02\xeb\x1a\x1f\xad\x1d\x45\x2e\x17\x77\x69\x75\x6b\xc2\x96\xed\x4f\x65\x61\x25\xcf\x55\xe0\xa0\xf6\xba\x8d\x83\xf3\x29\x5c\x96\x76\x6f\xd3\x6a\xc6\x83\x08\x92\x14\x95\x24\xde\xf8\x80\x4b\x33\x62\x44\x9a\x98\x29\xf4\x2e\x23\xfb\x5f\x01\xf6\xdc\xe6\x53\xf1\x3d\x2e\xa4\xcb\x53\x16\x73\xb8\xcb\xce\x77\x48\x05\x4f\xcc\x43\x86\xbe\x03\x49\x33\x90\xe5\x31\xe5\x84\xed\x48\x49\xcf\x78\x41\xad\x2f\x12\x8c\x1c\x23\xb2\xb3\xf5\x2a\x9c\x41\x8e\x54\xd2\x4c\x05\x72\x83\xd5\xd4\x03\x16\xeb\xc7\x3f\x6b\x66\xc6\x8d\xbe\x95\x9d\xec\xe6\x9e\xd2\xcb\x1a\x92\x24\x56\x5f\xf8\xe1\x2e\xad\x55\x09\x07\xe3\x9e\x9c\x08\x42\x82\x1a\xaf\xe3\x25\x0c\x79\x66\x72\x04\xe0\xfb\x39\xbe\xb3\x9d\x20\xef\x10\xd9\x3e\xeb\x3b\xa9\xaf\xd0\x26\xfa\xb3\x4c\xd7\xe9\xad\x54\xac\x0d\x1c\x6c\x67\x86\x87\xc9\xcc\xeb\x2f\xdd\x22\xd1\x51\x84\xf3\xaa\xff\x92\x15\x0b\x08\x73\x23\xb8\x1d\x96\x30\xf0\xa4\xe9\x8b\xae\x79\x85\xc1\x35\xfb\x7d\x34\x63\x94\x1b\xc7\xf4\xa0\x4a\x90\xa8\x1f\x4a\x71\x74\xd6\xb5\x79\x78\x05\x77\xf4\xc6\xc8\x68\x37\xc0\x01\xf5\x32\x93\x5a\x58\x9a\x3c\x24\x19\x73\x0f\x8c\x4c\x29\x6a\x6b\x59\x51\x24\xdc\x41\x17\xa1\xe4\x86\xb1\x27\x02\xc1\x38\x7e\x3f\x7e\xd6\x90\xa4\x20\x86\x2b\x57\x42\x41\x50\x74\xa7\xb0\x6f\x82\x0a\xb6\x36\xdf\x44\x75\xec\xa6\x74\x4e\x4a\xbf\x7f\x3d\x8c\x44\x41\xfc\xb5\x38\xad\x30\xfb\x46\x0d\xd5\xd2\xf8\x8b\x4e\x38\x18\x1d\xb3\x1a\x0c\x75\x96\xfb\x2c\xc9\x11\x40\x9d\x7f\x73\x71\x3d\x81\x5c\x31\xfc\x16\x72\x20\x3a\x6a\xd2\xad\xf1\x9b\xe6\xad\x42\x3b\xe1\xd7\x7f\xd4\x6f\x2b\x8e\x17\xdb\x0a\x9c\x4e\xd7\xd0\xad\x4a\x6f\xa5\xb8\xdd\x66\x4b\x99\x67\x05\x14\x7f\x59\xd8\xac\x53\x23\x2f\xb1\x36\xed\x41\xce\x55\x56\x4b\x3f\x39\x0a\x39\x67\x47\x2b\x0d\x77\x26\x02\xf4\x50\xac\x33\x43\x2d\x66\xfd\xdf\x96\xad\x4d\x2f\x23\xd5\x6b\x7d\x5c\xd4\xe2\xae\xae\x37\x6f\x9e\x3f\x5f\xd0\x67\x17\x34\x06\x65\x75\xfb\xfc\xf7\x55\xa8\x1e\x3f\xef\xf5\x86\xdf\x90\xfb\xe5\x87\xc7\xf9\x5f\x5e\xbc\x7e\xf1\x2a\xa8\xff\x3e\x3d\x7f\xf1\x07\xff\xdf\x77\xf9\xc3\x20\x58\xa2\xa7\xd4\x16\xa4\x6f\xac\x78\x27\x23\xef\x5a\x00\x3b\x18\xb0\xc2\x60\xc5\x2e\xb0\x45\x24\xd3\xe9\x60\x3c\xea\x0d\x05\xc4\x67\xac\x94\x83\xf8\x93\xb8\x99\x0c\x45\xe7\x7a\x32\xbe\x1a\xcf\xf0\x13\xd3\xe1\xf8\x7d\x6f\x84\xc1\x1d\x78\xc0\x8f\x53\xff\x11\xd7\x93\x5e\x7f\x36\xe8\x27\x9d\x36\xce\x17\xd1\x9b\xb9\xca\xf0\xde\x74\x7a\x33\x81\xaa\x59\x5b\xbd\x4c\x25\x81\x2e\x79\x61\x7d\xfc\x8b\xe9\xa5\xb1\xab\xdd\x67\x13\xe9\x65\x08\x80\xaa\x5f\x71\x5d\x40\xfd\x93\x79\x56\xa4\x78\x50\xae\x15\x11\xf1\x96\x8e\x10\x96\x03\xe6\xb1\x12\xd5\x19\xbd\x26\x25\x0c\xbb\x46\x40\x31\x09\x7c\x61\x2d\x11\xb3\xa3\xbc\xdf\x1b\x8c\x4d\x0a\x1a\xf6\xaa\xf6\x04\x66\xea\x52\xfc\x19\x87\xed\x2f\xe2\x48\x3f\xb8\x63\xf2\xb6\x11\x06\x6e\xca\x8d\x41\x1c\xa1\x2a\x6e\x89\xc5\x9b\x69\xae\x3d\xe7\x2d\xfa\x40\x77\x32\xdf\x88\xbf\x6f\x55\x9d\xad\xd0\x33\xd5\x3d\x52\x20\xd7\x0e\xb9\x86\x3c\x27\x9a\x1a\x67\x3c\xe7\x59\x4e\x6c\xfc\xda\x48\x66\xc5\x3d\xc0\x20\x3d\x02\x5a\xb8\x00\xd8\xa2\xd4\x55\x25\x41\x42\xc6\xd8\xdb\x48\x94\x1b\x59\x1c\xd3\xf0\x2a\x2e\x69\x73\x1a\x0b\x7f\x3e\xa0\x19\x4c\x07\xcc\xe7\x18\x06\x98\x91\xb9\x9b\xec\x9b\x11\x1a\x9c\x7e\xb9\x94\x7a\x68\x00\x9b\x61\x73\xbb\x0e\x1f\x82\xad\x7e\x7f\xfd\xfe\x98\x5c\xf5\x5a\x7e\x86\x98\xca\xbd\xac\xb2\x15\x3a\x54\x80\xb1\xa3\xba\xaf\x96\x76\x22\x14\x6a\x09\x8b\x87\xad\x18\xcb\xd1\x9b\x2e\x20\x77\x5c\x64\xe6\x22\xd0\xfe\x42\x70\xc5\x3c\x2a\xa2\xb4\x58\x46\x08\x21\xc4\x83\xe9\x8e\xd3\xbb\x39\x16\x47\x2b\xd6\x0e\xd7\x7e\xf3\x0f\x57\x38\x0d\xa8\x1c\xcc\x77\xe5\xe9\xb6\x58\xdc\x01\xcb\x33\x4b\x74\x9b\xa1\x20\xb8\x81\xfe\x87\xba\x13\x0a\xc0\x03\xc0\xdb\x4b\x38\x29\xf9\xd9\xe5\x67\x70\xd1\xfd\xa8\xbc\xb5\xc9\xf0\x12\x86\xe2\xdc\x08\x27\x99\xa4\xf6\x51\xda\x15\x23\x80\xa2\x74\x70\x15\x77\xba\x91\xf9\xd5\xbc\x2b\xae\xab\x72\x25\xa1\x74\x26\xcd\xad\xcf\x66\x26\xb4\x73\xc0\xd0\x74\x30\x5c\x63\x1e\xb5\xe8\x82\xdd\x39\xea\xdc\x4c\x86\x9d\xae\x29\x5e\x1b\x91\xf3\x64\xf1\x30\x05\xb9\x45\xcc\x1d\xe2\xdd\xb3\xaa\x82\x0a\xef\x80\xb2\x58\x96\x95\xa2\x6c\x8d\xde\x57\x30\xf6\xcb\xed\xa2\x56\x96\x6e\xcf\x49\xf4\xed\x67\x38\xf2\x7d\x29\xce\x73\x84\x75\x29\x37\x4a\x56\xca\x57\x9b\xd3\xd7\xaa\xb2\x50\x19\x82\x67\x4a\x9e\xd1\x73\xf1\x41\x6a\xb5\xa1\xb9\xa6\xe2\x70\x14\x98\x8d\xc0\x31\x0d\xbd\xaf\xa3\xd3\xae\xa8\xe4\xed\xd6\x10\xf4\x29\x09\x7a\x81\x50\x1f\xa8\xb0\xc2\x5a\xdf\xcf\x55\x5d\xa5\x75\x59\xc1\x72\x97\xeb\x4d\x5e\xee\xe4\x12\x92\x67\x1b\xbc\xeb\x6b\x77\xdc\xc1\x66\x1c\xa7\xa0\x6d\x84\x72\x12\xcb\xc5\x52\x1c\x9d\x77\x45\x5e\x2e\xd2\xdc\x7b\xb7\x53\xda\x80\x62\x47\x77\x05\xc1\x28\xae\xfb\x75\xb6\xde\x94\x55\x1d\x69\xef\x1e\xfe\x6b\x8c\xb7\x6e\x5c\xb1\xa8\x76\xc8\x5d\xeb\x2c\x0c\x44\xfb\x41\x8c\xa9\x55\x80\x8a\x32\x60\x74\x98\x71\x39\xaa\xde\xe8\x93\xc9\x4c\x01\x67\x51\x4b\x66\x85\xa5\xa3\x2e\x6e\x66\x90\x52\x81\x74\x14\x24\xd7\x22\xa4\x02\xf9\x52\x0e\xa9\xfd\x7a\x4c\x20\x43\x45\xfc\x21\xc9\x65\x1b\xd7\x14\xeb\x09\x25\x4f\x80\xaa\x49\x1f\x98\x5e\xd6\xe5\x1b\x08\x1d\x1d\x3d\x32\x16\xc9\x3b\xc8\x8f\x01\xd9\xd4\x88\x91\x7d\x8c\x27\xe2\xaa\x37\x1c\xf4\x81\x31\x6a\x94\xcc\x30\xc5\xd8\xef\x27\xd3\xe9\x5b\x3d\x4b\xfd\x9b\x09\xaa\x48\x41\x6e\xe5\x62\x3a\x1b\xcc\x6e\x66\x89\x78\x3f\x1e\x5f\xc2\xb4\x18\xd6\x98\xb7\x4d\x2e\xab\x88\x91\x59\xbd\xd5\x7f\x6f\x15\x51\xea\x8a\x0f\xe3\x8f\xc0\x8f\xd5\xef\xdd\x4c\x93\x4b\x98\x0b\xca\x47\x51\x26\x6a\xfc\xce\xb1\xb5\x78\xac\x58\x8e\x08\x6b\x3a\x9b\x0c\xfa\x33\xfe\x31\xd2\x31\xe2\xaa\x4f\x2d\x6c\x59\x1f\x07\xd3\xa4\x6b\x13\x54\x03\x7c\xed\xc7\xde\x27\x97\xab\x62\xb9\x29\x8f\xaa\xcc\x24\xa8\x9e\x9c\x8e\x3a\x74\x23\x89\x9f\x5f\x4c\x2f\x8f\x4f\x8f\xfb\x79\xba\x55\xdf\x88\x04\xf8\x31\xfe\xc7\x93\x97\x67\x21\xff\xd3\xeb\x93\xd7\x7f\xf8\xff\xdf\xe3\x8f\xef\xe1\xff\x79\x27\xd3\xea\x2f\xe2\xcf\x70\x10\xfc\x85\x57\x6f\x3a\x5d\xc8\xef\xee\x42\xbb\x4a\x4a\x1e\x93\x47\x37\xfa\xcd\x93\xfc\x48\x4f\x7c\xb2\xde\x4b\xd4\x18\x99\x78\x94\xaa\x11\x82\xec\xe9\xb8\xf8\x4d\x71\x35\x08\x74\xd0\xec\x3b\x63\x2e\x64\xf5\xab\xcc\xe5\xce\x49\x51\x5e\x02\x64\x2b\x12\x83\x62\x11\xff\xde\xcf\x9d\x47\x7a\xf7\x2f\x3d\x78\xfe\x38\x43\xbe\xd3\x19\xf2\xc7\x9f\xdf\xef\x9f\xf8\x79\xef\x7a\x78\x7c\xfa\x4d\x78\x1f\xcd\x9f\x83\xe7\xff\xe9\xf9\xf9\xd9\xab\xf0\xfc\x3f\x7d\xf5\xe2\x8f\xf3\xff\xbb\xfc\xe9\x5d\xf6\xae\x01\x3f\xe5\xd3\x01\x3e\xfb\x85\xd0\xb2\xa7\xf1\xc9\x33\x47\x78\xa7\x8f\x15\x47\x06\x78\x98\x70\x70\xcf\x93\xc5\x11\xa7\x17\x24\x7a\xc0\x08\x80\x84\xe3\xcb\x1b\x62\x9a\x9d\xb4\x30\x41\x86\x6d\xd0\x87\x02\xda\xf3\xa9\x98\x24\xfd\xc1\xf5\x20\x19\xcd\x7e\x9c\x06\x9c\x7a\x1e\xe4\x4b\x1b\xe7\xc1\x6c\x8a\x0d\x6d\x00\xf0\xc0\xda\xd9\x27\x89\x49\xd2\xbb\x9c\x1e\xe2\x01\xec\x78\xed\xc1\x23\xbc\x63\xbf\xdf\xc1\xd3\x93\x13\x35\xc6\xcf\x06\x57\xd7\xe3\xc9\xac\x37\x82\xc3\x2a\x79\xe3\x67\x29\x33\x25\x3a\x10\xc6\xcc\xee\x65\x27\xb2\x3e\x07\xa4\xdc\xb2\x85\xab\xec\xad\x2c\x77\x3e\x2b\xf6\x4d\x0b\xd1\xa3\xef\x86\x2a\x24\xea\xae\xdc\xe6\x4b\x93\x2d\xac\x64\x9e\x59\x92\xb9\x52\x2c\x25\xc2\x55\x40\xa0\xa5\xda\x97\xf0\x6a\xc1\x38\x70\x51\xef\x14\x5b\x6a\x03\x1d\xfb\x5a\x02\x2e\xdd\xae\xdc\x1a\x84\x99\x4b\x73\x0e\x4d\xe2\x8b\x6a\x40\x94\x58\x20\x95\xb4\x41\x64\x54\xd2\xd2\xee\x91\x5b\x58\x6e\x6b\x0a\x5b\xd4\x20\x10\x97\x41\xca\xb1\x6f\x38\x06\xcb\x2a\x7e\x36\x95\xd2\xe2\x82\xcf\xe2\x33\x8c\xc0\x46\x22\xf9\x7c\x97\xcd\xb3\x5a\xf4\x44\x5a\xd7\x29\x05\xc6\x28\x78\x32\xdd\x6e\x36\xab\x2c\x87\x9b\x90\x0d\xe1\xed\x6c\x9c\x73\xe8\x80\x24\x6e\xe4\xbc\xbe\x9b\x19\x14\x2b\x99\xd6\x50\x06\xca\x00\x1c\x41\x5a\x18\x41\xdf\x56\xf8\xc5\xcb\xb9\x36\x12\xa0\x11\x04\xd1\x56\x65\xe5\x38\xaf\x16\x77\x65\x86\x38\xf1\x3c\x7d\x80\x2e\x78\xca\x73\x4a\x4a\x71\x9d\x56\xb5\x38\xd7\x1f\xb1\xbd\x7e\x0b\x21\x37\x93\xaf\xb4\x0f\x5b\x5a\x72\x49\xfd\xe9\xd9\x5d\x56\x2d\xe1\xdb\x3b\xf7\x9c\x17\xc1\x73\x20\xa8\xb3\x08\x1a\x85\xb2\xed\x8d\xb8\xd0\x11\x56\x76\x75\xe1\x69\x8d\x49\x81\x47\xc1\x3b\x5e\x79\xef\xb0\xcc\x97\x7a\x1f\x31\x32\x4c\xf8\xe9\x69\x2c\x3a\x36\xcc\x31\x18\x8f\x88\x42\x8c\x15\xd2\xe8\x11\x1b\xf8\x45\x48\x7b\x16\x4b\xe4\xfd\x02\xf2\xb1\x6d\xca\x19\x6c\x09\xec\x5f\x78\x6f\x59\x48\x92\x02\x9c\x41\x23\x20\xba\x3b\x75\x9a\x62\x8d\x86\xb0\xdf\x11\xb4\x0b\xb2\x19\xb5\x65\x07\xf3\x8b\x30\x20\xc2\x0c\x68\x92\xf6\x87\xba\x31\x3b\x8b\x45\xe7\x32\x99\x0e\xde\x8f\x7a\xda\x4f\xfe\x98\x5c\x88\xe9\x60\x96\x70\xf6\xb5\x07\x39\x17\x90\x45\xbd\x4b\xef\xcd\x2a\xbc\x99\x0c\xbd\x5c\x7a\x81\x93\x75\xea\x4d\x96\x09\xfe\xea\x0f\x9b\xa4\x29\xd4\x06\x2c\x0f\x0c\x96\xfe\xd5\xa6\xc4\x12\x09\x42\x62\x99\x24\xf0\xa5\xab\x6d\xf9\x28\xe7\x62\x9a\x11\xb7\x56\x21\x1f\xe0\x1d\x80\x64\x30\x35\x5c\x2a\xfb\x5c\xef\xc4\xd1\xab\x93\xae\x58\xa6\x3b\xe5\x7a\x7c\xae\x7b\x6c\x4e\x93\xf1\xc4\xf1\xf2\xed\xc4\x35\xc4\x48\xd1\x2c\xb9\xc1\x54\x4d\x8b\x64\x51\x15\x65\x55\x13\x57\x55\x25\x4b\x28\x6a\xb6\x0d\x28\x0b\xc9\x77\x8d\x6b\xc0\x8b\x58\x74\x92\x61\xd2\x9f\x4d\xc6\xa3\x41\xdf\x3f\xd9\xae\x12\x7d\x2b\x1b\x4c\xaf\x78\xb3\xd6\x58\x65\xa4\xd6\x06\x6e\x91\xef\xa0\x7c\x7c\xc3\x68\xc0\x6c\x94\x79\x29\xef\x65\x5e\x6e\x48\xa2\x17\xc0\x30\xf5\xce\xee\x6e\xd8\x94\x55\x59\x64\x0b\xa7\x6c\x58\xae\xc4\x32\xad\x53\xd7\xc0\x97\xba\x81\x7f\x4b\xfa\x37\x33\x7d\x55\xe3\x4b\xc1\x1f\x04\xca\x56\xa0\x86\x2c\x45\xd4\xd3\x42\x4c\xf1\xa2\xdd\x2f\x97\xd2\x3d\xf3\x55\x2c\x3a\xef\xc7\xbf\x10\xe2\x9f\x03\xd9\xf9\xf3\x01\x1c\x49\x95\xc4\x54\x1d\x46\xc8\x4e\x40\xac\x78\xd6\xac\x65\xf9\x9d\x37\x6d\x05\xbc\xfc\x75\x2c\x3a\x83\xd1\x65\x72\x9d\x8c\xf4\xcd\x52\x5c\x8d\x2f\x6f\x5c\xc7\x52\x47\x36\xbb\x2e\x97\x5b\x2c\x6a\xe5\xf2\x10\xcf\xcb\x0a\x46\xc8\x96\x88\x23\xb2\x67\xe9\x80\x87\x86\x25\x12\x42\xeb\x9b\x8c\xe7\x1d\x9f\xb2\x6e\x62\xc1\x04\xd6\x22\x4c\xf8\xe9\x76\xd8\x62\xd5\x7f\x6c\xd3\x1c\x84\x2c\x80\x3f\x72\xc0\xe8\x70\xaf\xf0\x93\xf3\x6d\x2d\xb2\x42\xd5\xfa\xe8\x85\x20\x0b\x13\x38\x6c\x4c\x1b\xfe\x10\xdf\xf1\x06\x6c\x62\xa6\x50\x6b\x6d\xe9\x16\x94\xf7\x1d\x3c\x22\x32\x4b\x1e\x06\x1b\xd8\x51\xa7\xb4\x7d\x85\xaf\x08\x10\x9a\x5c\x6d\x0b\x52\x51\x4b\xf3\x1c\x93\x54\x8b\x3c\x55\xca\x3d\xe7\xad\xfe\xa9\x3e\x3f\x9c\xac\x25\xbd\x0d\x91\x44\xfa\xfc\x47\x0a\xb0\x36\xa1\xd1\xac\xbe\x83\x62\x4e\x7d\x5a\x53\xb5\x4d\x89\x72\xa3\x6a\x3b\x77\xff\x4e\x17\x35\xd6\x35\xd1\x03\xc1\x82\x82\x82\xdc\x3a\xfd\x15\xb2\x0e\x9b\x66\x67\xdc\x52\xfa\x09\x96\xd2\x00\x02\x0f\x2c\xa4\xce\x17\x31\x59\x11\x47\xed\xc9\x56\x2a\xa1\x8d\xda\xec\x1e\x0d\x22\x15\x20\x5b\xb4\xf2\x7c\xd7\x66\x5a\x5d\x83\x7e\x66\x0d\x42\xbf\x93\xf3\xa1\xe2\x6b\xd8\x8e\x8c\x44\x89\x30\x75\x88\x83\xd9\x43\x18\x8e\x8f\x86\x00\x8a\x2d\xb6\xaa\x9d\x86\x5e\xdb\xbe\x3b\x0b\xcc\xbe\x29\x99\xdd\xfb\xde\xe6\xeb\xf6\x28\x53\x3d\xe9\x7c\x65\x1e\xc0\x89\x76\xc3\x7b\x93\xf7\xc9\xc4\x1b\x0c\x9f\x0b\x18\x04\xf0\xf6\x58\x75\xda\x99\xca\x9a\x74\x70\x49\xa1\xd1\x7a\x23\xde\x96\xf7\xb2\x2a\x58\x06\x37\x80\xf8\x9e\xc6\xa7\xa7\xcd\x9b\x80\x9b\x11\xcf\xa1\x20\xd3\x82\x6e\xa6\x77\xbe\xc3\x1a\x47\xf0\x69\xaa\x24\xcb\x81\x85\xcd\x63\xef\x3d\x73\xef\xd5\xb7\x89\x41\x3f\xe9\x00\xf8\x0d\xf6\xba\x4c\x0b\x24\x50\xa4\x6c\xb3\x99\xb9\x97\x7b\x56\xd5\xa9\x3e\x25\xaf\xc6\x97\x2e\xb1\x0a\x95\xe4\xfc\x27\x53\x7e\x44\x11\x51\x03\x52\xdf\x41\xa7\x02\xb9\xc8\x3d\xdb\xe9\x54\x1f\x86\xd7\xc9\x64\xea\xce\x81\x06\x41\x2e\x3f\x01\x70\x47\xf1\xac\x60\x2a\x0c\x7d\x09\x92\x50\x38\xe1\x73\xf7\xdd\x79\xb9\x64\xe7\xef\xa9\x3e\xdf\xd8\xbd\xac\x71\xfe\x3f\xdc\x95\xe6\x46\x02\xc9\xcf\x72\xee\xe8\x8c\xfc\x05\xd3\xb2\x4c\x8f\x9c\x7a\xf1\x93\x1d\xf9\x60\x05\x70\xab\x50\x56\xe2\xd2\xec\x8b\xb2\xea\xb2\x5e\xe8\x13\x75\x3a\xbe\x99\xf4\x13\xd1\x1f\x5f\x7a\xc7\x34\x0f\x75\xaf\xd0\xd2\x06\xbb\xd8\xcf\xab\xb6\x7c\x23\xcf\xe9\x80\x30\xe8\xf7\xf5\xa6\x2c\xb8\x36\x50\xf3\x89\x9b\x7c\x8b\xc3\xc8\xd8\x18\x40\x71\x7c\x95\x2e\x24\xbf\x4e\x30\xc5\x4a\xb5\xa8\xb2\x4d\xad\x6c\x6a\xdd\xb0\xe3\xa0\xe6\xa7\xc5\x3f\xc0\xd9\x96\xe6\x8e\xf4\x20\x2d\xb8\x7e\xa5\x1b\x14\x7d\xd2\x4f\x6f\x2e\x28\x3a\xdc\x66\xa1\x43\x3f\x0f\x41\xb8\x25\x63\xa3\x77\x6c\x39\x74\x22\x50\x0a\x3b\xf4\xc1\xad\x9a\x92\xef\x2a\xa6\x75\xe3\x93\x4f\x72\x0b\x4f\x7f\xf2\xdb\xbe\xcf\x7e\x21\x51\xb3\xda\xe6\x35\x1e\x8c\x69\x95\x29\x49\x65\x57\xb8\x0d\x55\xcb\x3e\xd4\x3f\x0b\x2e\x42\xa1\x3d\x7a\xeb\x5f\x51\x5c\xd6\x3e\xe8\x8e\x3e\xa6\xd9\x47\x17\x5d\xa3\xd6\xcf\x34\x54\xc3\x9b\x95\x1d\x30\x5b\xea\xd3\xfe\x68\xf7\x5c\x2c\x71\xc6\x7a\x6d\xea\x55\xa3\x4b\xe6\x16\x64\x18\xe2\xf6\xdd\x76\x44\xaf\x31\x25\x00\x45\xed\xd8\x07\x74\x0e\x3f\xc1\xf8\x4c\x8d\xa7\x00\xb3\x3e\xce\x06\xec\xf8\xd5\xaa\xac\x6a\xf5\xc8\xed\xcb\x54\x2d\xe9\xa5\x90\x2e\xcc\x4d\xe7\xc0\x17\x7e\x54\x62\x2e\xef\xd2\x7c\x65\xf9\xfc\x81\x54\x84\x54\xf1\xd1\x4a\xe0\x78\x72\x8e\x75\xed\xd4\x15\xb7\x29\x5d\xb7\xca\x8a\x81\x88\xd1\x1d\x62\xf3\xd4\xfe\xde\x2e\x06\x24\x6e\xa1\xb8\xba\x32\x21\x18\x6d\x7f\xd3\xc6\x50\x38\x8c\x35\xe0\x51\x96\x64\x38\x1c\xac\x7f\x91\x6e\x40\x35\x80\x1c\xb5\xac\x56\xee\x58\x2a\x76\x2d\x4e\x2d\xdb\x1a\x3f\xc3\xd6\xb8\xbe\x1e\x62\xf6\xe6\xdd\x80\x7b\xef\xe4\xf0\x39\xe7\xa1\x3d\x8a\x64\xae\xaf\xf4\x05\x00\xfe\x74\x14\x0b\xef\x74\xd8\xad\x58\xfb\x11\xb3\x0f\x83\xc9\x25\xa4\xc1\x3e\x3d\xe1\x24\x7d\xd1\x3c\x49\xcf\x62\x1b\x1c\xa4\x27\x9f\xc5\xa7\x31\xd7\x2f\xa1\xe3\x1a\x15\x5e\xc8\x89\xeb\x8d\x2e\x45\xbb\x09\x9b\xc6\xfe\x06\x6e\x65\xdd\x6e\x54\xef\xec\xf3\x37\x7d\xd6\x6d\x70\x36\x26\xac\x44\x0a\x08\xb8\x8f\x1f\x65\xe0\xe6\xbc\xe1\x36\x16\xc6\x0c\x8d\x6e\x6a\xd6\x75\xe4\xd3\xfa\x72\xa7\x6f\x5b\x32\xbc\x3e\x21\x15\xf3\x53\x78\x9b\x58\x6d\x18\xac\x30\x9f\x33\xd5\xb3\x68\x7e\xe0\x05\xda\x12\x34\xe6\x8b\xde\x17\x85\x2f\x04\xb0\x5e\xd8\x0f\xeb\x54\x53\x4f\x61\xfb\xd9\xa1\x7d\xeb\xb5\x27\xf3\xae\xcb\xf0\xf8\xc4\x21\xfa\xf0\xfd\x84\x56\x63\x72\xd6\x57\x9c\xa3\x39\xc2\xaa\x0e\xae\xbd\x32\x4f\x55\xa6\x90\xb3\xd1\x5d\x04\x53\x31\x4c\xab\x5b\x59\x79\x1e\x18\xd9\xfa\xa7\xad\xa4\x03\x51\xaa\xff\xad\xab\xa9\x11\x77\x5b\x1d\xb2\xd3\x7f\xac\xb7\xc7\xd6\xdb\x59\x7c\x16\x8b\x6b\x64\x4c\xf8\x27\xad\x9f\x97\x2b\xb1\x91\x12\x43\x04\x0a\xc7\x56\x5a\xd4\x54\xfc\x54\xf3\xca\x65\x56\x65\x65\xc3\x34\xad\x21\xe0\x7d\x11\x59\x43\x09\xe7\x1c\x73\xaa\x0b\x8c\x4c\x32\xc2\x22\x75\x3d\x07\x28\x53\xa4\xdd\xc0\x4f\x2b\xc0\x97\xfa\x15\x29\x2d\xb7\x0a\x3a\x7e\xe0\x3a\x88\xb1\xd4\xee\x01\xd3\xce\x85\x30\x36\xdb\x4a\x6d\xf5\x48\xd4\x65\x5b\x44\x9d\xaa\x03\x61\x80\x70\xdf\x63\x48\x25\xbd\xad\xd2\xcd\x9d\xd2\xd7\xf9\x8b\x48\xf4\x23\x71\x89\xab\x05\x87\xac\x2d\x34\x2f\x06\x64\x30\x28\x42\xb6\x2c\x31\x17\x52\xec\xf7\x04\x5b\x9d\x40\x01\xca\xd0\xad\x23\x22\x3d\xfe\x5a\x23\xd1\x1f\x4c\x2f\x22\xbe\x71\x91\x4d\x8f\x81\xeb\xe2\x32\xb9\x14\x2e\xcb\xe8\xdb\xbe\x0f\x8e\xa2\xac\x7d\x34\xf5\x70\x2b\xdb\xc4\x7c\x17\x14\x27\xa3\x0a\xb9\x6d\x6a\xdb\x4c\x89\xd5\x16\x5c\x1f\xab\x49\xfe\x06\x10\xb7\xcd\xe3\x4a\xfb\x86\x67\x5d\x46\x75\x6c\x7c\x97\x20\xb4\xbf\xaf\xa9\x3e\xd8\xba\x39\xee\x47\xed\xf1\xc7\x2e\x0f\x45\xf0\xcd\x8e\xf3\x70\x30\xb3\x11\xcc\x51\xca\xb4\x6a\xbc\xb6\xa4\x87\xa7\x09\x71\x2d\x7c\x9a\xc0\x89\x46\x42\x80\xe2\xf6\xbb\xad\x62\x20\x41\x2a\xf6\x0e\x30\xbf\xea\xd1\xdc\xab\xc7\x26\x1f\x0e\x0c\x7f\x05\xec\xaf\x11\xa7\x1b\x15\xd5\x89\xbb\x23\xb4\x2d\x1e\xc1\x95\x44\xb8\xdc\x7d\x30\xe9\x1e\x45\x82\x99\xf9\xd6\xc8\xb0\xdb\x66\xd7\x30\x94\xea\x78\x60\x22\xb0\xdc\x9d\x44\x49\x0a\x97\xd0\x73\xbc\x5a\x7b\x3a\x47\xb7\x00\xae\x3c\xf1\x4f\x4d\x92\xbb\x7a\xbb\x01\xf2\xea\x87\x4d\x72\x15\x30\xf3\x56\x2e\xcd\x74\x2a\xf9\xec\x77\xca\x96\xc0\xb2\x5e\xc4\xce\x2e\xe8\xe7\xda\xf7\x58\x4e\x62\x4c\x58\x7f\xa3\x29\xb0\x34\xd6\xbe\xcd\x6b\xee\xee\xbd\x5d\x62\x85\xab\xc0\xc2\xea\x1f\x80\x41\x85\x36\x9f\x3d\x4b\xf6\xd2\x5c\x0c\x8d\x97\x80\x19\xc7\xc5\x8f\xc4\x02\x5e\x16\xd2\xa7\x5c\xd3\x0f\xe7\x51\x27\xcf\xa7\xb0\x76\x06\x3e\xec\x26\xd5\x6f\x5b\xe4\xea\xeb\x0f\x0e\xd3\xde\xa3\x81\x6f\xb2\x65\x57\x7c\xc4\x1a\x77\xf6\xbe\xad\x92\x8a\xaa\x53\x5d\x24\xa3\x72\x21\x63\x8c\x72\x34\x5e\xb9\x74\xd6\xb5\x61\x59\x83\x12\xde\xf6\x26\xdb\xab\xe9\xde\xa1\xb6\xdc\xd2\xdf\xe5\xf5\xad\xdb\xde\x1b\x95\x23\x73\x84\x37\xde\x08\x73\x14\x39\xcf\x0a\x3d\x1e\x70\x88\x82\xd9\xd5\xa3\x1d\x35\x6c\x68\x60\x65\x9b\x2f\x6e\xf3\x84\xe6\x1e\x8b\x34\x50\xe4\x07\x17\x99\x46\x6f\x0f\x99\x39\xda\x6a\xbf\xb1\xd9\x72\x4e\xf0\x79\x2c\x7a\xfd\xbf\x8e\xc6\x1f\x87\xc9\x25\x32\x8b\x79\x9a\xb0\xc9\xc4\x7c\x94\x0d\x96\xe5\x60\xc0\xc0\x0a\x90\x12\x38\xd2\xf6\xbb\x72\x7b\x7b\xd7\x7a\x64\x01\x45\xc6\x81\x9b\x1b\x5d\xd9\x6a\xc7\x68\x02\xf1\xc3\xac\x56\xee\x63\xb6\x28\x08\x15\x75\xf4\x54\x67\x85\xbe\xbb\x05\xe4\x0f\x91\xa5\x32\x88\xc4\xed\x36\x05\x62\x14\x89\xf7\x02\x53\x4a\x0a\x24\x79\x04\xe9\x26\x82\x87\x2f\xf5\xbd\xb9\xdf\x6d\x51\xe1\x81\xbf\xe4\xee\x03\xab\x2a\x83\xd4\x84\x73\x10\x6c\xb4\x2c\x2b\x6a\x09\xec\x38\x5b\xe4\x96\xd8\xc8\xaa\xde\x31\xb5\x34\x67\xb3\x31\xae\x16\x7f\x59\x53\xed\xc8\xf3\x06\x1b\xa0\x38\x1a\x93\xdc\xb0\xaa\xe9\x21\x77\x93\x0d\x35\x5a\xf8\xa9\x79\xa5\x67\xb6\x36\x63\xe5\x85\xf9\x2c\x9b\xaf\xe9\xa5\x21\xa9\x38\xdc\x31\x56\x0c\x0f\x89\x26\x2b\x1a\xd9\x96\xab\x51\xb1\xe8\x29\x8c\x36\xba\x8c\x0e\x13\x2b\xac\x1d\x59\x19\xaa\x1e\xd1\x12\x6a\xa1\xfc\x0f\xa2\x02\x14\x32\xd0\x4b\x63\x2d\x95\x50\x65\x2e\x5d\x7d\x9b\x1d\x14\x25\x17\x5b\x8f\xda\xf7\x60\xdf\x0a\x29\x81\x5e\x0a\xaf\xc4\x5f\x84\xa7\x62\x10\x7e\xa4\x92\x48\xb5\x0f\x53\x2d\x89\x63\x21\x38\x42\x03\x42\xa9\x34\xcf\xcb\x07\xff\xe0\x62\xb7\x84\x16\x44\x5b\x06\xf1\x59\xfb\x85\x1f\x55\x4b\xd7\xd3\x85\x21\xd9\x4f\xdd\x8b\xe7\x52\xb7\xb8\x49\xb6\xd5\x9a\x60\x3b\x8b\x5f\xc4\x62\x92\x4c\x93\xc9\x2f\x90\xb3\x33\x3f\x0f\x55\x0a\xf7\xf1\xe1\xd4\x25\xbb\x45\xd3\x10\xd7\xa5\xab\x93\x04\xd5\x5e\x8a\xd8\xa8\x88\xc6\x48\x45\xf8\x01\x3d\x75\x95\xc4\x05\xf7\xd8\xf4\x95\xab\x7f\xca\x0a\x90\xee\xab\x47\xf5\x41\x44\x5b\x68\xab\x4c\xe9\xa7\x0f\x23\xbd\x18\x0e\xde\xf7\x3c\x10\xd9\x79\x7c\x1a\x7c\xe8\x7d\x32\x4a\x26\xbd\xe1\xf0\x53\x10\x7e\xe8\xed\xb3\xa7\x38\x86\x70\x2b\x0c\x93\x41\x7e\x48\x3f\xb8\xf6\x1e\xa9\x2e\x3b\x05\x7d\x62\x10\x20\x60\x2d\x44\xe2\xd0\x3b\x97\xdc\xcb\xba\xb2\x00\x21\xcc\xf6\xa1\xb0\x33\x58\x30\x93\x76\xaa\x1f\x64\x7e\x2f\xc5\xd1\xe9\x59\x57\xac\xcb\xa2\xbe\x23\xa5\xb3\x54\xaf\x26\x95\x66\xcb\xe6\x27\xcc\x63\xcc\xa2\xb8\xcd\x0a\x87\xb2\xe0\x64\xf4\xfa\x68\x47\xd5\x39\x38\x98\x81\x03\xa3\x35\xb5\x60\xef\xfe\x45\x49\xf2\x34\x00\x0f\x09\xa0\x5a\xf4\xac\x20\x52\x62\x9f\xf8\x05\x43\x1a\xdc\xf4\x7b\x79\xce\x57\x8d\x42\x9c\xc9\xa1\x7d\x0a\x10\xa7\xc5\xa2\xac\x96\x9c\x4c\xb0\xdd\xaf\x20\x4e\x9f\x56\x35\x9a\x20\x98\x73\x90\x56\x27\xbc\xe5\x48\x1f\x76\x3a\xdd\x6e\x88\x82\x5d\xbc\xcb\x72\xd9\x25\xf9\x19\x24\xaa\xda\xe7\x1a\xb2\xf0\x01\x60\x8d\x80\x0d\x6a\xb1\xcd\xd3\x50\xff\xc6\x20\x6f\x82\x12\xf9\xc7\x52\x2b\x0e\x78\xb3\x48\xf3\x5c\x2e\x45\xc7\x78\xdc\xf5\xe7\x3a\xee\xf8\xf0\x26\xee\x8b\x8d\x10\xed\xd2\x0e\x47\x68\xe2\x80\xe8\xac\x87\xb5\x58\x98\xd4\x6c\xee\x01\x5c\x78\x76\xf9\x3e\x93\x0f\x66\x37\xa5\xda\xdd\xb4\x34\x51\xac\x6c\x1e\x9c\xd2\xd0\x8d\xb0\x0d\x53\x5c\xba\xc0\x9c\xc5\x86\xe2\xb1\xd6\xe6\xce\x66\xa4\x0d\xc9\xd2\x56\x1d\xb4\xc9\xe7\xf1\x59\x2c\x1c\xbc\xce\xb3\x36\xd3\x56\x68\xbb\xf9\x66\xcf\xb3\x79\xda\xf7\x5d\xdc\x95\x25\xa1\x8f\x0f\x9e\x36\xed\x61\x1f\x38\xfc\x83\xf0\xaf\x76\xec\x39\xfa\xcf\x6b\x5e\xc7\xa6\x7a\xd9\xc9\x18\xb5\x31\x28\x5a\x40\x6f\x33\x8b\xc0\x65\x42\xf8\xdb\x3d\x8b\xb6\x2f\x04\x08\x9e\xaf\x4f\xa4\xd0\xbe\xc9\x22\x70\xa8\xed\xbb\xac\x1d\x1c\x8f\x12\xb3\x45\x5a\xeb\x08\x33\x25\x56\xdb\x7c\x95\xe9\x55\xfc\x26\x0c\x38\xef\x6f\xef\x5e\x92\x07\xe9\xaf\xcd\xb2\x6a\xd9\x3d\x3e\xf0\x6c\xcf\x2b\x5c\x01\x00\x7f\xa0\x79\xaf\x17\x50\x66\xfc\x85\x24\xc1\xa9\x0e\x0e\x36\x68\x10\x61\x1e\xf6\xf1\x23\x26\xc8\xfe\xcf\xbf\x7c\x5c\x48\x9a\xdc\xf0\x1e\x00\x4b\x63\x44\x7c\x7e\x1e\x84\x57\x2f\xb2\x7a\xa7\x8f\x07\x71\x74\xfe\xca\x9c\x5b\xc0\x7b\x70\x6b\xb9\x59\x99\x8b\xf6\xa8\x28\x1a\x61\x61\x80\x72\x4f\x9f\x41\x10\xb6\x81\x23\x08\x6f\x99\x58\xe7\xb9\xb9\xdb\x29\xe2\xd3\xa5\x9c\x8c\x1e\x1b\x42\xc8\x2c\xfd\x29\x41\x26\x05\x59\xeb\xab\xe8\xe2\x2e\x2b\xe4\x71\x25\xd3\xa5\xa5\x66\xb5\x67\xe0\x6f\xb5\x06\x48\xee\xc4\xee\x8a\x10\xf6\xfd\xf4\x79\x34\xb9\xa5\xc5\xdd\xe1\xc9\x23\x6a\x5d\xf7\xca\x20\x85\x84\x94\xa3\x0d\xab\x00\x2e\x0b\x74\xe5\x51\x9f\xe5\xc8\x92\x92\x6d\xf2\x74\x81\x47\xdb\xe3\xdf\xaa\x0d\xa9\x21\x1c\x63\x0d\xcb\xc8\xac\xb6\xbe\x13\x80\xc9\xde\x56\x70\x79\x01\xcc\x86\xda\xce\x89\x3c\x91\xca\x15\xb4\x0b\xf4\xc8\xca\x33\x76\x78\x0f\x26\xa2\x36\x85\xc4\xc7\x45\xa9\xe7\x82\xee\x07\x24\x78\xb7\xd9\xe4\x3b\x33\x4e\xfb\x50\x87\x16\x74\xc8\xa7\xb4\x65\x6c\x9b\x66\xdb\x71\xf7\xc3\x8c\x2e\x5b\x6d\x69\x5e\x16\x78\xe1\xe3\xf1\x14\xda\x8d\x2c\x57\xa7\x1b\xd4\x44\x63\x60\x7e\x0f\xaa\xba\xd7\xd2\x89\xa1\x98\xe7\xb8\xd3\xed\x3c\x16\x0c\x96\xe6\x1f\x6f\xe6\x53\x1f\x21\x88\x1c\x4c\xda\xaf\x6d\x98\xcc\xfd\x67\x97\xe7\x2b\x33\x54\x57\xcb\xfa\x84\xeb\x96\x31\x45\x8f\x27\xdb\xe0\x90\x69\x77\xdd\x1a\x1e\x49\xbb\xf7\xe5\x01\x5f\x55\x56\x6f\xe1\x2a\xa2\x4a\xce\x03\xd5\x0c\xc3\x65\x0a\x08\xf5\x36\xd9\x62\x8b\xba\xfe\x87\xfc\x0d\x78\x12\x76\x39\x40\xe9\xe4\x69\xc5\xaa\xe9\xa1\xf9\x56\xf9\x2c\x3e\xe7\x8a\x70\xda\x75\x6a\x3a\xd8\x7b\x60\xfe\xe1\xa0\xc6\xad\xfe\x08\x98\xd6\x54\xac\xa4\x33\x74\xc6\x9e\x8a\x74\x81\x88\x74\x2a\x3c\xa8\x0c\x7c\x73\xb3\x33\x95\x22\xf4\x7d\x7b\x0d\xfd\xe7\x6d\xb4\x5b\x97\x70\x13\x26\x8e\x7a\xc4\xc7\x82\xcc\x01\x5b\xab\xe6\xb3\xc9\x81\x68\x19\x2c\x00\x59\xa8\xad\xb9\x97\x33\xcc\xb6\x92\xb5\x28\x01\x88\xdf\xea\xcd\x72\xf8\xbc\x81\xf7\x82\xcf\xbc\xe7\x90\x08\x83\x76\xed\x85\x3f\x28\x82\xe3\x0c\xe1\xbe\x1b\x73\x46\x91\xf8\xc2\x3a\xb6\x50\xc5\x90\xeb\xf3\x6a\xd7\x6c\x18\x26\xad\xb2\x1c\x35\x67\x33\x5b\xf6\xb0\x29\x15\xb0\x0f\xe9\xe5\xb3\xd9\xd6\xfe\x33\x0b\xe2\x3b\x35\x4d\x09\xbc\x72\xb1\xdc\x4a\x13\x5a\x54\x75\xb5\x5d\xd4\xdb\xca\x64\x94\xf6\x83\xd0\xfc\x2b\x55\xe3\x7d\x79\x69\x78\xa1\x08\x1a\x07\x97\xd3\x5c\xde\xa7\x40\x69\x65\x60\xff\x50\x33\x90\x2d\xee\x28\x24\x9d\xc3\x08\xa8\xba\xac\xe4\xb2\x6b\xd4\xa3\xf0\x86\xf0\x00\xd5\x91\xc0\xa3\xfa\xab\x44\x9b\x9d\x97\x25\xaa\xf3\xe1\x2b\xe8\xfd\x6e\x69\xbd\x8c\xc5\x68\xec\x87\x0d\x68\xa9\x5d\x25\xa3\x19\x12\x2a\x00\x4b\xc0\x08\x54\x37\x80\x18\xc0\x83\x52\xb3\xb8\x8c\xc7\x78\x6a\x89\xea\xcf\xe3\xb3\x08\x77\x6f\xb1\xd4\x6b\x39\x62\xb1\xa6\x75\x0a\x80\xe8\x5a\x56\x05\x6c\x08\x06\xb0\x2b\x1f\x0a\x0e\x8f\x86\xd0\x5f\x75\x9b\x16\xd9\xff\xe0\xbf\x0d\x67\x68\x18\x9c\xf2\xb0\xc1\x8d\xcc\x7d\xb0\x26\x95\x63\xb3\x0d\xb2\x3a\xab\xb2\xb2\x0d\x23\x02\x50\x68\x1a\x0f\x7b\x3d\xd6\xc4\xa3\x85\x25\x30\xcf\x77\x91\xe8\x98\x71\x04\x22\x03\x1f\x8f\xde\xc5\x90\x46\x98\x13\x34\x49\x30\x57\xc0\xea\x5f\x98\x10\x6c\x8f\xa0\x17\xbe\x64\xcb\xaa\x79\xca\xda\x2c\xe1\xc0\x74\xeb\x46\x85\xbd\x36\xb9\x2c\xd7\x0e\xa3\x7b\x56\x6e\x2b\xac\xf7\x23\x31\x03\x37\x32\x91\x09\x61\xe1\x52\x74\xd5\x1f\x50\x0c\x69\xc2\x74\xce\x8c\xbf\x44\x29\xfd\x03\xad\x68\x71\x21\xf0\xb4\x70\xae\x42\x59\x51\x25\x13\xc3\x23\xb3\x1c\x1b\x7f\x02\x4f\xbf\x03\x9f\x4b\xeb\x55\x67\xbf\x68\x75\xed\xcd\x0b\x5e\x5b\x55\x70\x6f\x7d\xca\xd8\x52\x4f\xbc\x06\x5b\xfb\x11\x4e\xbc\x8b\x63\xee\xc3\xf5\x46\x3e\x26\xf9\xcb\x86\xd3\x2b\x89\x3d\xf4\xc2\x03\x86\xfb\x50\xb3\xf0\x99\x41\x1e\x8d\x56\x8e\xb6\x10\x0b\x29\xe6\x72\xa1\xbd\xb1\xfd\xb5\x5e\x08\x71\xdf\x2a\xa2\xff\xc3\xc8\x5a\x30\xb7\xb8\x79\x3d\xa7\x08\xeb\x92\xc9\xdf\xcc\x30\x27\x7a\x30\x0e\xc6\x0c\xd5\xa9\xfe\xf6\x79\xfc\x02\xad\x88\xca\xee\x99\xa1\x7c\x15\x8b\x66\x1d\x9e\xb5\x7e\xb3\x66\x28\x1a\xd6\xa7\x71\x9d\x5b\x9c\x52\x13\x79\xf9\xa2\xe0\x31\xf7\x5a\xc8\xbb\xb4\x4b\x87\x5d\x8b\xda\x5e\x47\x65\xac\x36\xab\xba\x0f\xbc\xc5\x71\x01\xb6\xba\xd0\xa2\xf8\x2c\x7d\xba\x1b\x99\xd7\xb1\x60\x75\x4b\x76\x48\x7a\x01\xcc\xac\xac\x7c\xc3\x6f\x34\xda\xbc\xfa\x05\x0c\x77\x71\x8f\x7e\x6e\xc0\xf9\x06\x6d\xdd\xba\x58\x18\xe2\x6f\x4f\xc1\xd3\x41\x89\x00\x5f\xfc\x1c\x9f\xcf\xda\x90\xfa\x80\x15\xc3\x98\xc8\x80\x16\xe4\x68\x62\xc6\x3f\xd5\x8f\xdd\xdb\xf5\x56\xa0\x0d\xac\x73\xd2\x0a\xe0\xee\x99\x77\x11\x0b\x3d\xfa\xb4\x92\x2e\xe2\xb3\xe7\x72\x1e\x22\x36\x9a\xb8\xc6\xf3\xf8\xa7\x58\x5c\x26\xd3\xfe\x64\x70\x6d\x28\x2a\xac\x3f\xb0\xef\xb4\xa7\xb8\xd2\x21\x77\xf3\xa8\xfd\x28\xf6\x31\x5f\x46\x0b\xae\x35\xfb\x9b\xab\x92\xca\x47\x41\x1c\x4c\xed\xb5\x85\x34\x7e\x8b\x54\x1f\xd4\xad\xbe\xa7\x11\x59\xf3\x16\x1b\xea\xa9\xec\x0e\x99\x33\x53\xd8\x93\xb2\xfa\x4c\x2a\xfe\x33\x1d\xa3\x12\x8f\x68\x9f\xa1\x09\xa7\xd0\x95\x44\xa2\xe3\xe8\xc5\xc4\x49\x6d\xf4\x50\x05\x06\x6c\x5a\x73\x2c\xdb\x84\x05\xeb\x97\x4d\x87\x36\xcb\x79\xe0\x40\x2b\xca\xf0\xad\x42\x7e\xce\x14\x66\xbb\x20\x2f\xce\x2f\xff\x55\xf3\x72\x70\xa8\xf1\x92\xae\xb9\x46\x7f\xc1\x7b\x98\x5e\xa2\xed\xbd\xc2\x03\x95\x46\xd6\xd5\x02\xd1\x36\xd8\xe1\xd6\x70\xd4\xb1\xfa\xa2\x1c\x78\x72\x71\x33\xb2\xb7\x0f\x11\xc9\x74\x7d\xb4\x27\x83\x00\xe7\x60\x9e\xa0\x56\x07\x00\x19\x95\xa9\x10\x94\x69\x95\x67\xb2\xf2\x3f\x78\xc4\xab\x1d\x31\x90\xd2\x49\x7a\x93\xe1\x00\xe4\xd4\xdc\xa6\xe2\x4e\x75\x07\xe3\x36\x7c\x21\x99\x1e\x1f\xec\x22\x56\x2e\xdf\x63\xf2\xda\xcd\x44\xf3\x0a\x1f\xcc\xee\x53\x11\x98\x7a\xc5\x86\x70\xcf\x16\x93\x62\x62\x01\xd4\x02\x98\x73\xda\x23\x0a\x08\x0d\xfc\x01\x82\x21\x19\x25\x1f\xbf\x64\x38\x78\xed\x54\x00\x2f\xec\xb5\x60\x0b\xe1\x68\x60\x93\xca\xc1\x46\x50\x74\xde\xc4\xb3\x85\x06\xa2\x89\x31\xf2\xb3\x5e\x7c\x92\x21\xcd\x40\x8b\xc1\x66\x3b\xfa\xe3\xeb\x4f\x9d\x2e\x47\xe8\x98\x8f\x5c\x4a\x2c\x15\xd4\xfb\x72\xc2\x87\xc6\xa5\x41\xa2\x06\xae\xcd\xdd\x64\xed\x9b\xcc\x24\xf4\x21\xea\x00\x86\x69\xbd\xa1\x4b\xd3\xd3\x5e\x48\x27\xc4\x48\x3e\xec\xfd\x4c\xdc\x02\x2d\x63\x3e\x6f\xf8\xca\x43\x8f\x8a\x42\x9c\xe3\x43\x96\xe7\x0e\xa4\x6a\x5c\x3a\x0f\x0e\x40\x33\x97\x39\xf7\xe8\xd0\x18\xb8\x64\x65\xb8\xe4\x2d\x2c\x4c\xd1\xbd\x03\x60\x27\xfa\x98\xb4\xab\x16\xea\xa9\x69\xd5\xfa\xd8\xb2\x83\xe3\xe3\xe3\xf0\x0e\xc4\x53\x41\x45\xb3\x7e\xd4\xe2\xeb\xcb\x7c\x5d\x9a\x74\x8f\x48\x19\x65\x86\xad\x8e\x98\xef\x28\x02\xb0\xcf\x78\x62\x36\xf8\x11\xf3\xd9\x06\x91\x79\xc4\xa6\xb2\xa6\x1b\x46\x21\xde\x74\x0f\xb8\x6a\xea\x60\xb3\x42\x9f\x4a\xc8\x31\x5d\x49\x30\xad\x90\xd3\x59\x94\x1b\x1b\x2f\x0a\xf5\xa7\xb2\x42\xf4\xaa\x3a\x5b\xe4\xb2\x99\x76\xa3\xd8\xad\x83\x61\x3c\xa4\x3b\xef\x25\x4b\x49\x7f\x0f\xf0\x3c\x81\xcc\x49\x9b\xaf\x0c\xed\x4f\x6b\x7d\x50\x21\xca\x0f\x24\xdb\xc8\x41\x83\xd2\x10\x74\xab\x8c\x8a\x9e\x9f\x1c\x8d\xc5\x3b\x94\x94\x8a\xfc\xed\x92\x16\xc8\x4e\xe5\x30\x36\x8b\xb2\xaa\xf4\xc6\x86\x7a\x64\x3c\x4d\xb2\x5a\x05\x3c\x02\x9b\xaa\x5c\xc8\x25\xf0\x2c\x05\x3b\xed\x91\x53\x77\xbe\x85\x97\xd2\x3c\x6c\x64\x91\xe6\x99\x32\x01\x5e\x12\xae\x79\x6c\x2a\x33\x85\xd0\xc3\x79\x86\xe1\x9b\xb2\x08\x31\x4f\xf4\xc5\xe0\x92\xe6\x49\xe5\xd3\x2b\x14\x20\x67\xb6\x2d\x1e\xec\xbe\x63\x8f\x1e\xf3\x04\x43\xcd\xf7\x9f\xd4\xa7\x81\xc1\x48\x61\xdd\x0e\xb8\x2a\xab\xa7\xbd\x94\xa4\xd1\x18\x4c\xd0\x84\x3f\xf6\x55\xd2\xaa\x86\x2b\xf4\xda\x8f\x93\x36\xe2\x07\xf4\x21\x54\x39\xa6\x76\xea\x61\x86\xc2\x70\x0c\x4b\xb2\x11\x77\x50\x6d\xab\xfe\x7f\x14\x08\x08\x1b\x27\x84\x81\x38\xcd\x4b\x5d\x88\xe5\xa7\x2e\x31\x8e\xa7\x95\x6c\x4e\x82\xbd\x5c\xb4\x53\x79\x10\x44\xfb\x31\x67\xcf\x9d\x01\x07\xc0\xe3\x87\x79\x31\xdc\x0d\xe4\xe7\xd8\x90\x7b\x32\x7a\x23\x31\xea\x5d\x25\xee\x82\x4d\x75\xaf\x28\xbe\x1f\x04\xef\xb9\x09\xf2\xd0\x86\x1e\xde\xb2\x95\xfe\xbe\x69\x12\xf1\x97\xad\x9c\xf8\x8d\x70\xa3\x01\xc1\x1c\xe4\xc3\x47\x70\xd6\x49\x6c\x29\x5d\x27\x49\x7f\xfc\x1e\x39\xc0\x40\xef\xb6\x49\xca\x12\x22\xb6\xd4\x5e\x29\x8d\x3d\x13\x19\x99\x2b\xc2\x9d\x36\xbb\x5f\x2c\xa6\x91\xad\x65\x04\x3a\xce\x3b\xa3\x0a\x59\x56\xf5\x1e\xcd\x0c\x7f\xce\x0f\x17\x23\x99\x13\xdb\xa3\x5f\x69\x5b\x5d\x29\x5f\xb3\xd8\x7e\xa7\x23\xe1\x51\x28\x58\x76\x17\x77\x94\x35\x4a\xe3\x0e\x18\x94\xe8\x11\xd1\x89\x88\xab\x4e\xc0\x99\xb6\x2d\xda\xc5\x27\xf6\x33\xb2\xed\x17\x99\xc0\x93\xbb\x5c\x2c\xb6\x95\xd1\x42\x61\xe2\x30\x83\xd1\xbb\xf1\xe4\x8a\xd4\x21\x30\x42\xcc\x45\x6e\x06\xe1\x73\x1e\xc3\x1b\xe1\xd5\x38\x48\x6d\xec\x2d\x94\x3f\x34\x8f\xc8\x11\xb8\x33\x8b\x2c\x9c\x3d\x6b\x62\x90\x9d\x9a\x77\x9e\x4f\x2b\x9a\x42\x96\xd4\xfb\x4d\xe7\x55\x1f\x8b\x24\x64\xb7\x6f\x72\x71\x4c\xc9\x53\xf3\x1d\xb1\x15\xb8\x2f\x36\x13\xdf\xdc\x7c\x11\x3e\x64\x55\x1e\x08\x61\x18\xdb\x64\xf4\x70\x78\x2d\x4e\xe9\x0a\x69\xd9\xdd\x25\x0a\xb2\x86\x0e\xe9\xb3\x67\xe6\x91\x05\x2b\x6d\x30\x80\x07\x99\x10\x63\x3b\xf7\xb4\x14\x59\xb2\xa0\xd8\x19\x16\x79\x59\x48\xb1\xb9\xab\xb4\x57\x75\xa4\x3b\x20\x3f\x2f\xa4\x84\x87\x9d\x9e\xc0\x87\x54\xf7\x2d\x5c\xc7\xf4\x07\x8d\xa0\x7c\xb6\x26\x21\x78\x38\x98\x40\x25\x84\x30\x4c\xf6\xac\x68\x94\xb8\x83\x17\x9d\xa2\xd4\x89\x9f\x2e\x69\xec\x06\xb0\x9e\xd3\x46\x11\xe4\xa1\x88\x46\x44\x21\x8d\x7d\xbb\xa6\xe5\x44\xdf\x67\x91\x9e\x14\xdc\x68\x9d\x5f\x98\xdb\x7d\x2d\xd8\x3f\x25\xc1\xbd\x37\x09\xea\xd2\x17\xbf\x16\xe5\x43\x2e\x97\xb7\xae\x92\x22\xf7\xd0\xcd\xda\x97\xd5\xeb\x00\xfe\x69\xaa\x24\x11\xdd\xac\x17\x83\x72\xb4\x64\x26\xb7\x75\xd8\x22\x3f\x01\x4b\x69\xdc\x0d\x57\x14\xcf\x51\xd2\x7b\xe3\x7c\x14\x80\x45\xff\x93\x4e\x71\xfb\x06\x77\x96\x1e\xa4\xbc\xb4\x1c\x21\x8b\xac\x5a\x6c\xd7\x98\x64\x50\x4c\xfd\xc9\xd1\xf2\xcf\x77\xa8\x3e\x8b\x35\xdf\x0c\x75\xed\x56\x42\xbb\x97\x72\x7a\xba\x9f\x54\x04\xaa\xdb\xdd\x95\x11\xb0\x60\x6e\xc6\x99\xf8\x67\x63\xd4\x9b\x97\xd7\xc6\x60\xd4\xa5\x35\xb8\xb8\x97\x21\x46\x43\xc3\x71\xe0\xb5\x95\x77\x1b\x6f\xc6\x9d\x49\xe8\xd0\x6a\xcc\xb6\xb6\x06\x16\x17\x1b\xc7\x6d\xb5\x01\xa2\x98\xba\x44\xf1\x83\x5d\x24\xee\xd3\x6a\x17\x89\x62\x9b\x03\xd3\x9f\x6e\xc4\x5a\x52\x72\x0a\x4c\x52\xc4\x13\x98\x0d\xd9\x55\x36\x24\x88\x78\x6f\xa4\xa4\xee\xcb\x6c\x69\x43\x9a\x78\xd7\xe0\x17\xb8\x39\x8c\x45\x51\x92\x8c\x75\x59\x91\x8a\xb5\x11\x23\xea\x8f\xaf\xae\x92\x49\x7f\x40\x99\x57\xa0\x4e\x1e\x5d\x26\x57\xa3\xc1\xcc\x42\xe3\x5f\x20\xbd\x89\xfd\xa0\xa1\xd3\x77\x00\x56\x16\xc1\xef\xb0\x0f\x3a\x36\xae\x6e\x80\x6b\x25\x74\x20\x60\x1f\xcb\x06\xbe\x84\xd7\x1b\xa9\xed\x06\x75\x80\xb2\x62\x29\xd7\x05\x29\x1f\xbb\x02\x1b\x7e\x93\x0d\x93\xca\xa6\xa1\x08\x70\xe5\x69\x0a\xf4\x80\x99\x49\xf2\x2b\x0f\x78\xfa\x02\x82\x2c\xfd\x72\xbd\x96\xd5\x42\x6f\x2d\x3f\x51\xb3\x2c\x85\xa2\xca\x34\x43\x3d\xd5\xf6\x59\xca\x88\x1b\xba\x1f\x04\xcb\xeb\x43\x9e\x7e\xe4\x97\x25\xed\xcb\x8f\xe0\x17\xdb\xdb\x62\x93\x24\x59\x2d\x16\xb9\x4c\x09\x84\x6f\xc3\x44\x5f\x33\xa2\x47\xaa\x2b\x32\xf5\x3c\x85\x0d\xb5\x92\xc4\x41\xd1\xfa\x7e\x40\xa1\xc5\xa2\xe7\xe2\x05\x7a\x74\x5a\x3f\xba\x25\xc6\x8b\x29\x1a\x61\x3c\x0e\x64\xb1\x63\x58\xeb\x56\xb4\xd2\xe1\x24\x3e\xc6\xce\x54\xe9\x62\x0b\x06\x5a\x6c\x0d\x2c\x51\x57\xb6\x67\xb3\xf7\x3a\x7a\xec\xf6\xf8\x22\x3e\x75\x25\x68\xcb\x0c\xb4\xb3\xee\x9e\xf8\x86\x47\x54\x77\xe1\xdb\xcc\x10\x18\xe1\xb9\xb6\xa1\x56\xfe\x2d\x8f\xc2\x86\x8d\x58\xe1\x3e\xd4\xd7\x63\x60\x08\x4f\x99\xdb\xc3\x91\x71\x8a\x97\xc6\xed\x1b\x1d\xac\x70\x37\xa3\xf1\xf9\x12\xb4\xd7\xfe\xe6\x79\x6d\x69\x4b\x15\x76\x9d\xc5\x3a\x8b\x9b\x76\x8c\x8d\xe6\x92\xd7\x8b\x70\x5e\x58\xc8\x81\x00\x09\xaf\xa5\x26\xf7\x2a\xb8\xda\xc4\xb6\x25\x6a\xe3\x54\x4a\xfb\xd5\x2a\x2b\xa4\x52\x96\xb0\xd0\xc2\xbb\xf3\xec\x57\x19\x8b\x8f\x77\x78\x6c\x84\xd2\xf0\xb5\xf6\xbd\xc1\x16\xae\xd2\x85\x7e\x4f\x4a\xd7\xef\x85\x6b\xf3\xd6\x31\x5b\x07\x37\x6d\xfd\x23\x6e\x33\x1e\xee\x4a\xc6\xd0\x70\x60\x29\xa4\xfc\xf9\x74\xb1\xc7\xad\x0e\x99\x06\x64\x94\x47\x13\x07\x9f\x5e\xa3\x56\x20\x06\x5c\xed\x4e\xa0\x64\xf5\xa6\xac\x49\x10\xda\xd9\x92\x95\x2d\xca\xf4\xad\xeb\xcc\x5c\x0f\xa8\x24\x8f\xb7\xde\xab\x84\xff\xc2\x26\xeb\xd7\xe9\xbf\x2b\xcf\xc2\x90\x11\xe7\x2f\xf1\xce\x29\xce\x1b\xdd\xb5\x05\x8c\x54\x89\xab\x8d\xd3\x0a\x8f\xec\xa5\x31\x99\xab\x9d\xd0\x87\xc3\x1e\x7b\xbd\x3f\xe9\xcb\xc8\x3f\xd3\x02\xc9\x8b\xaf\x46\x83\x77\x83\xc4\x10\x92\x75\x45\x7a\x9b\x66\x85\xc2\x4b\x4f\x5e\x2a\xa8\xa5\xb6\x02\xdb\x10\x95\x53\x75\x70\xd2\x89\xce\x70\x3c\x9d\xc2\x31\x67\x24\xb8\x91\x36\x10\x4a\x4d\x23\xed\xd1\xa9\x6d\x56\x73\xf9\x4e\xa4\xdd\x4c\x09\xdd\xc1\x8b\x51\x3d\x44\xb2\x69\x0c\xba\x96\xd8\xf5\x4c\x1a\x74\x8c\x1f\xe0\x84\x0c\xb3\x4d\xa2\xa5\x0b\x2a\x49\x25\x07\x55\x59\x7c\x14\xdb\x85\xfe\xac\x37\x84\xd1\x21\x0c\x1c\xe0\x58\xbf\x7e\x35\xb7\xbf\x83\x2f\x13\xbc\xf1\x72\x87\xc2\xb8\xbb\x26\x53\xb2\x2c\x7d\xe8\x0a\xa4\x64\xb0\xa0\xb7\xac\xc4\x10\xa6\x8b\xea\x6e\x51\x05\x1c\x78\x33\xb1\x28\x12\xe9\x37\xe5\x2d\xd1\x67\x36\x8b\x25\x79\xb5\x2f\x94\x73\x95\x15\x44\x05\x4d\xa2\x1f\x5c\xe9\x96\x69\xd0\x47\x3f\xde\x74\x37\x55\xb9\xde\xd4\x39\xdc\xab\x8d\x43\xbc\x7f\xb8\x4d\x94\xca\x92\x39\xe8\x8e\xd0\xc5\x53\x5f\x78\xa1\xf6\xf5\xc0\x23\x1c\xaf\x67\x44\x2b\xf3\x58\xf7\x44\x9b\x02\x7b\x43\xd9\xfb\xf6\x88\xfc\xf3\x95\x83\x66\x33\x01\x73\x25\xeb\x9a\xfc\xec\x42\xde\x96\x75\x86\xf3\x11\x53\xea\xba\x31\x02\xe9\x8e\x00\xaa\xd9\x46\xbf\xde\x43\x9c\xe8\x5e\x09\x0a\xf1\x69\x1f\x4c\x7e\xde\xd8\xab\xcb\xcb\x58\xfc\x92\x4c\xa6\x2d\x25\x5a\xe6\xcc\x78\xa9\x7d\xdf\x51\xf2\xd1\x7e\x8e\x07\x5d\xf7\x85\x35\x48\xb0\x1c\x13\xd2\x08\xc5\xd2\x17\xcc\x42\x3e\x18\x2d\x8f\x06\x7b\x41\x53\xa1\x1c\x6f\xb5\x46\xfb\xc3\x68\xac\xdf\x66\xf7\x80\xb1\xd7\xfb\x22\x2b\x6e\xb7\x99\x82\x8a\x5f\xf3\xb1\x62\xbb\x9e\xcb\xca\x35\xfe\x2c\x26\x61\x46\xdd\xbd\xb6\x6e\x8c\x8b\xc5\x9e\x38\x6f\x1b\x11\xfe\x5d\xaa\xc4\x5c\xca\x82\x49\xb2\xcf\x5b\x51\x5a\x36\x67\xcc\x70\xc3\x4c\xc6\xa4\xe6\xf5\x95\x01\xf2\xc9\xde\x11\xf4\xe2\xca\x0a\xc4\x16\x83\xf4\x5c\xdd\x5e\x0a\x94\xd6\xe6\xd1\x1c\x74\xb4\xda\x97\xa6\x6d\x05\xc7\xb6\x3d\x19\x97\x90\x35\xe5\xed\xcd\xf7\x47\x62\xef\x15\x1c\xe2\x23\x36\x44\xb7\x04\x6c\xd7\xca\x54\x07\x81\x89\x41\x91\x8f\x28\x40\x3c\x22\x76\x27\x48\x2c\xfb\x7d\x6f\x69\x62\xe8\xa0\x00\xe0\x10\xd3\x71\x96\xb5\x8e\x78\x95\x2b\x44\xb1\x51\xc7\x42\x12\x3a\xc3\x63\xc7\xe2\xb8\xf6\x47\xe4\xb2\x01\xa0\x47\xff\xb8\x21\x17\x68\x09\xee\x74\x1f\x69\x70\x3c\xf0\x6c\x68\x8b\x1b\xb3\x12\x8b\x11\x5d\xdb\x1c\xe9\xfc\xbe\x48\x89\x61\xf2\xb4\x6e\x28\x5e\xc0\xd9\x80\x85\x02\x2d\xc1\xcb\xf4\x86\x78\x15\x33\xb2\x0e\xbd\x65\x48\x5d\xcf\xba\x90\xaf\xb4\x39\xa0\xda\xf1\x16\x5e\x8f\xe4\x6f\xfd\xe4\x7a\x26\x7a\x53\x23\xf0\x37\xfc\x24\xa6\xc9\x4c\xbc\x1b\x4f\x66\x1f\xc4\x60\xe4\x49\x0b\x45\x2d\x6a\x47\x6d\x8a\x4b\x4c\xd9\x08\x24\xe7\xac\x98\xe0\x45\x6f\x3a\x98\x46\xe2\xe3\x60\xf6\x61\x7c\x33\x03\x91\xa5\x49\xa2\x5f\x9b\x8c\x66\x10\x18\x8f\x6c\xfb\x23\xf1\xfe\xa6\xa7\xff\x96\x24\x11\xd3\x55\x47\xd1\xbd\x4b\x9b\x6d\xd1\x8f\xf8\xeb\x60\x74\x19\x89\x64\x00\x9a\x49\xd4\x0d\xd4\x71\x25\xc9\x41\x4f\x9e\xd0\xbc\x1c\x02\x90\xfe\x4b\x41\x92\x90\xbd\x00\x4d\xec\x60\x36\x4c\x22\x31\x1a\x8f\x8e\x07\xa3\x77\x93\xc1\x08\x79\x52\xa2\x86\x72\xe1\x78\xf2\xa8\x70\x61\x0c\x03\x98\x8c\x66\x83\x49\x22\x26\x83\xe9\x5f\xf5\xc0\xcf\xc6\xf0\xd3\xff\xe7\xa6\x67\x05\x10\xaf\x93\x09\xe4\x0a\xac\x56\x54\xcb\xa8\xeb\x7e\xb8\x78\x45\x2c\xa6\x1f\xc6\x37\x43\xd4\x6a\xf4\x3f\xab\xa7\x07\x04\x9f\x92\x3e\xc8\x5e\x91\x1c\xdf\x24\x99\x5e\x83\xce\xa1\x53\x96\x3a\x1a\x8d\x67\x28\xd5\xd8\xcc\x61\x19\xf9\xde\x76\x4e\xc4\x2e\x4c\xd1\x55\x82\xba\x54\xfd\xf1\x74\x66\x26\x67\x94\xf4\x93\xe9\xb4\x37\xf9\x44\x41\x18\x98\x83\x49\x72\xdd\x1b\x4c\x70\xac\x27\x93\x04\xe4\x37\x62\x5c\x38\xfd\x61\xef\x66\x9a\x78\x22\x5a\xbd\x91\xd0\x33\x8a\x22\x8b\x7a\x50\x9b\x92\x57\xa3\xb1\x49\x39\x36\xfb\x3f\x98\x0a\xa6\xee\xfb\x21\x99\x24\xb8\x4e\x69\xe9\xb7\x2c\x5a\xa7\x6d\xd8\x5c\x2c\xf8\xc9\xe6\x46\x7a\xa5\x4f\x2e\x3d\xa6\xe3\x11\x57\x2a\xb4\x83\x3b\xf5\x8a\x7a\x98\x55\x41\xc2\x11\x5f\x52\x1b\xb3\xdc\xa4\xe3\x64\x82\xfe\xe9\x46\x3b\x5e\x55\x96\xd6\x12\x2e\x6c\xe5\xca\x56\x59\x2e\x1f\xa1\xe1\x40\x77\x85\xf8\x4d\x52\x10\x4f\x55\xbf\x2a\xce\x8f\x6e\xdd\x57\x62\x54\x01\x6b\x4f\xf0\x8b\x66\xae\x97\x87\x06\x4c\x62\x06\x42\x03\x54\xe0\x08\x56\x4d\xfd\xca\xfd\x7f\x7d\x7b\xa6\xc4\x8d\xac\xaa\xb2\x02\xc6\x0e\x5f\xfc\x9b\x99\x3b\x7d\x01\x30\xb7\x08\xc2\xed\xe9\xab\x85\x20\x89\x98\xc8\x3c\x0b\xbc\x58\x26\xfc\x0d\xa2\xaf\x85\x47\x05\x66\x4a\x3f\xaa\xed\xc6\x1c\x1a\xe8\xf4\x81\x7f\xa6\x27\xe5\x75\x0c\x4a\x6a\x83\x91\x47\x4d\xf2\x5a\x1b\xce\x16\x24\xb8\x3d\xe4\xb7\x45\x9d\xe5\x16\x4d\x82\x79\xd4\x36\xc8\x28\xc5\xa4\xc9\xa6\x33\x1a\x10\x78\x09\x68\xf8\xb7\xbb\x13\xf6\xd1\x01\x50\x78\x5b\x97\xeb\xb4\xa6\x38\x04\xcb\x36\xb9\x87\x9e\xfb\x2d\x7f\x42\x24\x87\xa6\xba\x41\x96\x83\x10\x6e\xe6\x13\xb1\xd0\x1e\x78\x78\xae\x91\x7e\xbb\x4c\x99\x97\xb7\xd2\xb3\x42\xac\xd3\x5a\x56\xfa\x28\x9c\x57\x70\xb5\xf4\x6f\x48\xad\x81\x28\x98\xd5\x55\x9a\xe5\x08\xa5\xd9\x1a\x3a\x76\x7a\x02\x45\xde\x43\xf2\x8e\x72\x85\x55\x09\xb0\x43\x1e\x52\x17\x62\xc7\xaf\xc5\xe2\xe3\x13\xc4\x10\xc2\xd6\x36\x99\xe1\xa8\xfd\xba\xe1\x7e\x48\xd4\x34\x1e\x87\x91\x78\xbc\x1a\x23\x62\x06\x3c\xe0\xb5\x69\xc2\x34\xcd\xda\xa3\x62\x61\x08\x6d\x34\x46\xb2\x2d\xd3\xf1\x3a\x7e\x11\x8b\x1b\xa0\x1e\x34\xc0\x27\xe3\x13\xfa\xa2\x26\x06\x34\xca\xdd\xb0\xd6\x99\xb7\x34\x85\x98\x51\x8d\xc8\xa2\xec\x59\x40\xb8\x25\x6d\x60\xd3\x1b\x1b\x93\x05\x08\x0b\x66\xec\xa2\x0a\xd8\x0f\x1d\x03\xf1\x9e\x61\xc2\x61\x7e\x90\x80\xeb\x97\xf7\x19\x96\xaf\xe2\x85\x35\xdf\xd9\xd6\x35\xa7\xf1\x4b\x11\xa3\x63\xde\x8f\x0e\x45\x5a\xc4\x26\xdf\x56\x69\x1e\x05\xbf\x56\x1d\x22\xa3\x13\x6a\x5b\xdd\x1b\xc2\x00\xa4\xfb\xd8\x3f\x25\x4f\xdf\xb4\xed\xa2\x88\xf0\x7c\xbf\x1d\xa0\x87\xc3\xf3\x62\x32\xab\xcc\x74\xeb\x66\xd9\xe2\x99\xb3\x48\x9c\x47\xe2\x45\x24\x5e\x46\xe2\x55\x24\x5e\xc3\x2b\x7e\x8a\xc4\x7a\xab\xdf\xae\xe0\xbf\xc5\x32\x53\xc8\x64\xa0\x4a\x91\x97\x40\x45\x4f\xf0\x24\xfb\x40\x37\x5f\x52\x89\xa3\x2c\x96\x71\x23\x8f\xd1\x35\x85\xfd\x58\x0e\xee\x1d\x08\x75\xc8\x70\xd3\x3a\x3b\x8d\x0d\xe6\xbd\xd5\xd2\x48\x1e\xd8\x5d\x98\x39\x0b\xe6\xa2\x6d\xfc\x6c\x86\x8a\x97\xa1\xed\x1b\x46\xf1\xba\x39\x60\xb1\xb8\x76\xc9\x43\x68\x72\x44\x17\x8d\xac\xa2\x4c\x60\xe4\xd1\x1d\xe8\x95\x07\xe9\x2f\x31\x97\xbb\x92\x22\xb3\x87\x36\xb2\xb7\xd0\x9c\x0d\x78\x49\x36\x20\x6d\x76\xf4\xab\xed\x40\xe4\x16\xcc\x8b\xf8\x34\x12\x2f\xe2\xb3\x48\xdf\x37\xf4\xff\x9d\x45\xda\xf0\xe8\xff\x7b\x19\x89\x9f\xf4\xcf\x60\x09\xe9\x9f\xd7\xe5\xad\x74\xc4\xde\xba\xb5\x2c\xa1\x1a\xb6\xa7\x90\x0b\xa9\x14\x49\xb6\x5b\x24\x6e\xb5\xa9\x64\xed\x44\x59\x64\x01\xb9\x42\x43\x3a\xa7\xd2\xb5\x34\xe5\x83\x2c\x21\x4c\x7b\x2f\xdc\x77\x30\x46\x3f\xc5\xdc\xc5\xe3\xca\xd8\x66\x08\x7f\xd2\xee\x40\x53\x67\x5c\xbb\x9b\xed\xa0\xaf\x08\x14\x5d\xb5\xbb\x3c\xb8\x1c\xf4\x26\xa0\x92\xae\x7d\xe8\x77\xef\x06\xc3\x41\x6f\x66\xfe\x49\xdf\x9f\xc1\xcd\x63\xf6\x21\x19\x4c\x8c\x67\xae\x7d\xf5\xf1\xbb\x77\x83\x7e\x32\x99\x46\xa4\x4f\x3e\xd6\x7f\x4d\xae\xae\x87\xe3\x4f\x89\x7e\x42\x6f\x74\xf9\x5c\x3f\xe5\x3d\x94\xf7\x1e\xf5\xc8\xff\xee\x4d\x13\x71\xd5\xfb\x24\x2e\x92\x6e\x24\x3e\xf4\x7e\x49\xc8\x2d\x36\x57\x15\x5f\xf4\xdc\x08\x97\x3b\xf1\x73\xf7\x93\xeb\x1b\xdd\x33\x7d\x7f\x70\x9f\x31\xb2\xe8\xee\x67\x24\x8f\xee\x7e\x60\x65\xd2\xdd\x8f\xda\xb5\xd2\xcd\x10\xc0\xdd\xcd\xfc\xf0\xe3\x87\xde\x6c\x3a\x06\xf5\xf2\xa3\x83\xbe\x78\x43\x1c\x9d\x69\xa3\x47\xfe\xb3\xe1\xa3\x46\x91\x9c\x64\xc8\xa1\x1a\xda\x6a\x93\x4f\x92\x61\x0f\x25\xda\x8d\x3e\xb9\xee\xac\x19\xb2\xd9\x18\x7f\x72\x33\x62\x97\x09\xf8\x09\xbb\xac\x45\x28\xd9\x3b\x3a\x7e\xf4\x02\x47\x6d\x83\xdb\x8c\x6e\x5f\x82\xcd\x01\xad\x73\x7d\x9d\x9e\xd2\x3a\xd4\x97\xca\xde\x60\x78\x33\x49\x74\x0b\xe8\xa6\x2d\xa6\x37\xd7\xd7\xe3\xc9\xcc\xe6\xb5\x51\x97\xfd\x43\x6f\xa6\xd7\xce\xcd\x70\x86\x54\xf6\xc9\x64\x02\xeb\x05\xaf\x7e\xfa\x43\x57\x83\x29\xc4\xd2\xf4\xcf\x86\xbd\x4f\xc0\x3b\x30\xbe\x4e\x26\x3d\xa3\x6e\x3c\x9b\xf4\x46\x53\xfa\x54\x30\x80\xa6\x19\xe3\x77\xbc\xc7\x7a\x7d\xfd\xcb\x85\xe6\x07\x23\x9c\x3c\xb8\x9e\x8d\xa1\xd9\x07\xa4\xe7\x79\x74\x62\xe2\xa4\xe8\x9f\x22\xed\x4c\x9f\x4f\xfe\x96\x4c\xfa\x03\x77\xdf\x04\x11\x95\xa9\x78\x0f\xe1\x0a\x76\xc5\xfc\x0a\x39\xfb\x69\x6c\x5a\xd8\x6a\x8d\xc8\xea\xe8\x7b\x7a\xef\xfa\x7a\x08\xcb\xd2\xdf\xd6\x97\x49\x6f\xf6\x01\xb6\x01\x88\x99\xf5\x86\x62\x30\xfa\x8f\x9b\xc9\x27\x5a\x19\x7a\x50\x60\x71\xc0\x3b\x21\x85\xf3\xe3\x94\x8f\x2c\xad\xfe\xe4\x6f\x20\x8d\xa0\x5f\x32\xe8\x03\xff\xd6\xb0\xf7\x51\xaf\xbf\x0f\x83\x0b\xb4\x6b\xfd\x0f\xac\x91\xbf\x9f\xcb\x7b\xc2\xfe\x39\x6d\x09\x75\x4d\x31\x1a\x01\xf6\xde\x9a\x7e\x20\x4a\xfb\xa2\x40\x59\xd2\xf3\x34\xbb\xdd\xb4\x1d\xb0\xc6\xd6\x68\x46\x14\x85\x6a\xb1\x97\x8f\xda\xc3\x99\xb1\x7f\xff\x16\x3b\xf3\xd0\x3e\xfc\x63\xdf\xfd\x06\xfb\x4e\x2f\xd1\x9f\x63\xe1\x14\x6d\xf5\xc7\xf5\x44\x0f\x93\xf7\xbd\xa1\xe8\xf5\x79\x48\xe3\xe7\x3d\x21\x8d\xb9\xf4\xca\xab\xa9\x94\x42\xd5\xd5\x76\x7f\x54\x23\x4f\x1f\xac\x5b\xfe\x1e\xbe\xac\x2f\x2a\xff\xc1\x85\x71\x1b\xd2\x54\xbe\x2c\xae\xc3\xdb\x57\xf2\x36\xad\x96\x86\x91\x65\x51\x16\xab\x3c\x43\x8a\x9e\x3c\x7d\x60\xde\x21\x44\xd7\x37\x36\x81\x36\x27\xe2\x1e\x9e\x1a\x6e\xa3\x51\x72\x58\x8e\xb2\x90\x62\x27\xd3\x8a\xb3\x84\xa6\x0c\xa5\x40\xcf\x48\xab\x52\x99\x74\x16\xbe\xee\x21\x05\xcd\x03\xdd\x3c\xba\x47\xd8\x72\x2e\x70\x8f\xff\xbe\xad\x76\xa2\x86\xdb\x38\xa5\xf2\xf2\xac\x36\xd0\x18\x93\xe2\x6e\x13\xab\x1f\x61\xd5\x42\x5a\x1b\x65\xb7\x3d\x63\x69\x68\x72\x1e\x1b\x52\xcb\x41\xb1\xe7\x39\x76\xc2\x01\x14\x5a\x53\x5a\x67\x24\x1f\xc4\x27\x56\x8f\xf3\xb3\xb6\x78\x33\x62\x0a\xa9\x1f\x9b\x67\xc6\x6e\xc2\x85\x91\x1d\x66\xdb\x21\x48\xfd\xdf\x03\x12\xa5\x26\xd0\x0a\x44\x31\xad\x74\x3d\x31\x42\x6d\x80\x7a\x1d\x16\x24\x41\x03\x0c\x67\x08\x5c\x3c\x8d\xb6\x3d\xcb\xec\xe8\x6b\xf3\xdf\x49\xe1\xd7\xe1\x10\x7c\xaa\xe9\x79\xa9\x2f\x1e\xb5\x15\xa7\xd7\x97\xac\x7f\x6c\x41\xcf\xd3\xcc\x95\x5e\x96\xa8\xa3\x4c\xf3\xf9\x90\xee\xbc\x3c\xf9\xd3\xaf\xea\x98\x21\x83\x45\x0a\xaf\x00\x82\x41\xf8\x1b\xc0\x9a\x41\xb8\x98\xdd\x62\x6c\xdc\x32\xc4\x7b\xb1\xe5\x18\xbc\xdf\x00\x40\xb2\xaa\x92\xf7\xe5\x02\x20\xee\x69\x5d\x97\x95\x21\x2a\x59\x12\x42\x08\x2f\xe8\x9e\x7a\xb5\xbd\x59\x3f\x61\xa2\x2d\xf3\x10\xc0\x46\x95\xab\xe6\xfd\x39\x3e\x8f\x45\xd2\xc6\x7d\x6c\xa9\xda\x65\xae\x24\x32\x04\x18\xd2\x76\xaa\x36\x90\xf7\x2c\x8c\x46\x1b\x10\x8b\x76\x0c\x48\x3d\x60\x1e\xf7\x81\x1e\x69\x81\x11\x85\x96\x7d\x0f\x80\xe3\x4a\xde\xa7\x59\x0e\xca\x2d\x3e\x41\x8a\xad\x21\x05\x79\x8e\x85\xee\xb1\xc0\x18\x9b\xa2\x98\x0a\xe5\xdd\x55\x00\xbe\x5f\x49\xac\x8f\x02\x7c\x0a\x8c\xb2\xdc\x41\x68\x13\x49\x99\xda\x7a\x60\x7f\xb9\x2e\xb7\x88\x87\xb3\x63\x8e\xf8\xad\xe5\xdf\xb7\xcb\x5b\xc9\xc8\x8c\x61\x64\x4f\x4f\x62\x71\x35\x98\xf6\x93\xe1\xb0\x37\x4a\xc6\x37\x36\x87\x70\x7a\x82\x96\x3c\xc0\x7e\xac\xf5\xa4\x34\x24\x81\x91\x59\x82\x6e\xcf\x73\x59\xc8\x55\x56\x3f\x86\xe0\x6e\x29\xaf\x0c\xa5\xd4\x38\x64\x3d\xd4\x01\x38\xf0\xe8\xe7\x1e\x09\xb7\x1f\xfa\xa6\x1d\xc0\x33\xa0\x78\x14\x59\x9d\xcd\x30\x30\xcc\xa0\x47\xf6\x51\x6c\x90\xce\x82\xe3\xce\x42\x95\xad\x9c\x03\x72\x66\x5a\x22\x14\xfd\xb2\x05\x2d\x7d\x83\x16\x5c\xa7\xb5\x3e\x2c\x2c\xdd\x1f\x24\x8a\x37\xb2\x52\xd2\x68\x4b\x2e\xb4\xe1\xc9\x15\xc5\x32\x30\xec\x28\xca\x4a\x1f\x4a\xc5\xd2\xd6\x91\x91\x08\xbe\x55\x2f\xf3\x71\xd3\x2a\x62\x74\x2c\x2e\x68\x6a\x18\xb8\x94\x98\xcb\xfa\x41\x92\x71\x37\x6c\x38\x61\x9c\x06\x4a\x73\xdb\x9a\xcd\xc6\xe4\x9c\xf8\xb6\x31\xd9\xc2\x6d\xc0\x4d\x01\x09\x9c\x11\x2d\xa7\x7e\x59\xdc\x1b\x9a\xbf\x02\xa7\x11\x30\x52\x66\x29\x11\x49\x11\xd5\x9f\x4d\x53\xac\xda\x7c\x5f\x96\x4b\x60\xaf\x6d\xe8\x70\x2e\x59\x23\x5e\x60\x23\xf2\xb4\xb8\xdd\xa6\xb7\x88\x7f\xd1\x83\x97\x56\x2d\xcc\x28\x76\xcb\xd2\xa7\x16\xa9\xc2\x82\x07\xf2\x50\x54\x06\x68\x03\xf4\x52\xc8\x3c\xeb\xcd\xb9\x4a\xb3\xca\xe8\x64\x3a\x04\xb3\xaa\xab\x6c\x51\xe7\x84\xf4\xab\xbc\x35\x44\x03\x61\x86\x57\x8f\x5d\x5d\x62\x74\x50\x9f\x15\x00\x76\xbf\xdd\x92\x48\x01\x46\x1c\xa9\x2a\x86\x2d\x7c\xdb\x29\x28\x6e\x34\xe2\xa8\xae\x17\xae\xe1\x1c\xac\xb6\xac\xd0\x27\x69\xa1\x1b\x6a\xd5\xf7\x3e\x89\x5f\xc6\x46\x9d\xc9\x61\xfe\xc3\xa1\x83\x9c\x0b\x32\xda\x02\xc4\xc5\x9e\x31\x9e\x96\xd9\xe3\xbe\x1c\x10\x57\xb2\xa6\x61\x48\x52\x7f\xde\x9c\x66\x28\x33\xdf\x3c\xc1\x24\x45\x32\x81\x8c\xe8\x40\x92\x07\x27\xc8\x9c\x9e\x06\xfb\x41\xd6\x94\xb0\x18\xfe\xbc\x10\x46\xd2\x75\xde\x8e\x30\x00\x35\xd7\x2e\x17\xb9\xce\x8a\x6c\xbd\x5d\x1b\xdc\x9f\x8b\x29\x7a\xc0\x61\xf7\x20\x1c\x30\xef\x4c\xce\xf9\xc8\xbf\xc2\xd5\x6b\xab\x76\xc5\x9d\x4c\x71\x93\xb6\x92\xfa\xc0\xb2\x59\xc9\xca\x9e\xf4\x0b\xd8\x59\x19\xfc\xdb\x16\x10\x63\x15\x52\x4d\xb1\xd6\xf6\xe1\x81\xf2\x7f\x9f\x4c\x8e\xa2\xc3\x56\x5b\x8a\x56\x97\x3d\x85\x82\x70\x29\x23\x08\x6f\x9a\x86\xd7\xe4\x64\x78\xf3\xd4\xb1\xa7\x5f\x27\x32\xff\xa0\x8c\x87\xf9\x97\xea\x10\xa2\x1b\xf0\x94\x41\xc5\x4d\x64\x7c\x57\x9b\x67\x0b\x68\xdf\x8a\xb2\x38\xb6\xbf\xb3\x9b\xc7\xb2\x28\x76\x9a\x1e\x15\x6a\xc0\x37\x13\xcf\xf0\x73\xa8\x67\x83\x30\x70\xb6\xce\xf2\xb4\x82\x63\xb1\xaa\xbb\xba\x19\xae\x18\xc9\x4d\x48\x4d\xbb\xdc\x0d\xc3\x4f\x76\x7a\xd9\x6a\xe3\x07\x1e\xce\x03\xcc\x80\xb3\x72\x8e\x21\x00\x0d\x41\x90\xbf\xc4\x3a\x3e\x8e\xb5\xa4\xe7\xce\xcd\xde\x5f\x1a\x8f\x28\x29\x6e\x01\x8c\x67\xc6\x22\x16\xcf\x9f\xff\xe9\x4f\x7f\x62\xd7\x62\xc8\x57\x4f\x45\x32\xc2\x4b\xaf\x38\xc2\x10\xdd\xec\x43\x6f\x24\x7a\x18\xd5\xd0\xd7\xec\xc1\x48\x24\x7f\x83\x8b\xa3\xe8\x75\xe3\x3f\xfd\xe9\x4f\xcf\x9f\x3f\xb3\x3f\x10\x47\xb4\x3b\x7a\xcb\x74\x03\x79\x8b\x6b\x84\x49\x51\xab\xbb\x7a\x40\x20\x60\x73\xfa\xa6\x15\x10\x02\x42\x41\xc9\x74\xf0\x7e\x04\x61\xd3\x8f\xc9\x85\x98\x0e\x66\xc9\xb3\x03\x50\xc3\x4c\x01\x95\xf9\x7f\x7f\xe1\x1f\xfd\x9d\xff\x4c\x0a\x10\x63\xd8\x6a\x13\x44\xe5\x8f\x2d\xaf\xf8\x2f\xfd\x59\xfd\xbf\xde\x72\x59\x11\x4a\xa2\xe5\x63\x5f\xdd\x8c\xef\xf5\x1d\xea\x6e\x4a\xbd\x80\xca\x5b\xdb\x37\x3d\xbc\x97\x52\xdf\x04\x01\x77\xf0\x51\xce\xc5\x34\xab\xe5\x6f\x30\xbc\x37\x93\x21\xd8\xab\xb6\xa7\x3f\x32\xe0\xa3\xf1\x2c\x79\x73\x60\xe6\x2d\x0d\x86\x34\x80\x06\x64\x24\x88\xa0\x12\xe7\xd6\x71\x63\x98\xf4\xa3\xde\x35\x2f\xe1\x3f\x08\x8e\xb4\xe8\x90\x88\x3e\xf6\x02\x3e\xf2\x2a\xb6\x0b\xf5\xcc\x2d\xd4\x8f\xe3\xc9\x5f\xc3\x95\x88\xdc\x61\xe5\x7a\x83\x42\xf5\xc6\x03\xdc\xea\x8e\x13\x9e\xe4\x48\x75\x9f\x4a\xb0\xc4\xb8\x81\x5c\x59\x2f\x5c\x29\x8e\x54\xf7\xcd\x97\x4e\x42\x6c\x1a\x8b\x48\x4b\x4e\x12\xeb\x35\xff\x21\x35\xd2\xad\x87\x98\xa3\x5b\x5e\x6f\x07\xe9\xfc\x0d\x8b\x16\xfd\xc7\xcd\x64\x30\xbd\x1c\x40\x94\xe8\x19\x31\x8a\xc3\x49\x4b\x17\xbc\xe6\x31\x74\x38\x46\xf1\xa5\x4b\xef\xbf\x63\xf1\x9f\x6d\x83\x5b\x97\x02\x17\xe4\x9e\x57\x69\xdb\xf9\x5f\xb6\x4b\x2f\xde\x08\xa7\x91\x3e\x48\xa6\x4f\xeb\x49\x87\xf1\x66\x3a\x5d\xf5\xa5\x5c\x65\x05\xea\x4b\xb9\xcb\x2b\x63\x3f\x95\xa0\xdc\xe0\x8e\x7e\x2b\x6f\x7b\x60\xa9\x00\x8c\xf6\x90\x50\x5b\x43\xea\xd3\xc8\xcf\x06\xfa\xbc\xae\x70\x33\x20\x7b\xdc\xff\xf2\x58\xcc\x4a\x6a\x24\x02\x53\x43\xcd\x09\xd7\xae\x03\x24\x01\x5b\x55\x0b\x20\xc5\x07\xf0\xc3\xdf\xf0\x00\xfe\xdc\x31\x43\x42\xf2\xa8\xda\x53\x2b\x3f\xe3\x7e\x56\x19\x29\xd5\xe9\x97\xb2\xe4\x78\x73\xe4\x60\xe9\x4f\x93\x61\x62\x57\xe1\xc5\xf8\x6f\x7a\x2a\x7b\xef\x27\xbd\xeb\x0f\x74\x2e\xd3\x7f\xfe\x53\xfc\x97\xe8\x85\x9a\xf8\x24\xc0\xef\x93\xd3\xc7\xcd\x2f\x5e\x3c\xe9\x8b\x86\x01\xd7\xa0\x5c\xc2\x11\x33\x35\xfa\x0f\x77\x65\x9e\xef\x44\xf9\x50\x48\x80\x0e\xab\x6c\x99\x69\xa7\xb2\x29\x37\xe4\x53\xb2\x88\x7f\x6c\xa5\xd2\x83\x65\xca\xf4\x31\x7e\x49\x52\x6a\x46\x8d\x76\x82\x45\xa8\xe0\x4c\xb8\x37\xa9\x27\x3f\xba\xac\xa0\xd0\xfc\xd1\x66\xee\xfb\x75\x56\x40\x37\x4b\xeb\xb5\x5f\xa7\x15\xa1\xa0\x8f\xe6\xdd\x96\xc1\xed\xff\x96\x83\xeb\x58\xf4\x91\x39\x3b\x27\x1c\x9f\xfb\xd7\x03\x52\x88\x8a\x75\xfa\xf7\xb2\x62\xb7\x8d\xfb\x92\xf8\xaf\x6a\x59\x49\x55\x3b\x4e\x8b\xd6\x21\xd3\xa3\x34\xef\x06\xac\xfd\xce\xf4\xee\xf9\xd6\xfe\x36\x29\xde\xa2\xa0\x29\x2d\x63\x76\xf9\x55\x63\x76\x78\x64\xa8\xc2\x25\x67\xc2\x2f\xad\xbd\xc0\x02\xd2\x86\x79\x74\xf6\x2f\x12\x1d\x7a\x56\xc7\x68\x89\x49\x82\xb3\x6f\xca\x07\x84\x06\xe2\x5b\x81\x56\x31\x35\x65\x0a\xf8\x33\xbc\x6c\xa0\x49\x59\xa7\x45\x4a\x9a\x80\xda\xde\x6d\xca\x3c\x5b\x10\xc9\x10\x78\xf9\xd4\x21\x73\x2f\xa8\xef\x20\xe0\x87\xd6\xe3\xa1\x90\x95\xba\xcb\x36\xfa\xc3\xc1\x80\xaa\x08\xf9\x64\xf1\x82\x1d\x79\x06\xb2\x65\xb0\x93\x6f\x38\xd8\x10\x61\xf0\x46\x9e\x93\x18\x94\xeb\x35\x15\xc6\x57\x65\xee\x52\x28\xff\xd7\xce\xcb\x0c\xcf\xd9\x74\x9b\xd7\xfc\xbc\x2d\x57\xc1\x04\x65\x07\x8e\x64\x2e\x7d\xaa\x0f\xd4\x6c\x25\x46\xfa\x64\x1e\x4f\xc4\xd5\x78\x92\xe0\x5d\x88\x44\x96\xda\x8f\xde\xb2\x12\x89\xbd\xac\x82\x2f\xfa\x82\x08\x52\x1f\x3d\xd1\x9d\xcb\xf9\xf2\x0d\x69\x38\x40\xbf\x9e\x54\x1d\x61\x6e\x6f\x94\x93\xec\x5d\xf6\xae\x01\x61\x73\x7d\x73\x31\x1c\xf4\xed\x15\xef\xa8\xe3\x14\xc8\x7b\x53\xf1\x6e\x30\x99\xce\x44\x7f\x7c\x75\x3d\x4c\xf4\x75\xeb\xe2\xd3\x3e\x1f\x53\x7b\x54\x4a\x56\xa4\x08\x71\x98\x29\x06\x1d\xa9\x18\xb2\xa9\x08\x66\xc1\x46\x5c\x0e\xa6\xd7\xc3\xde\x27\xfb\x6f\x0f\xe3\x32\x49\xae\x27\xe3\xcb\x9b\xbe\x01\x8d\x04\xf9\xdb\x08\x41\x38\x89\x3e\xc1\x2d\x05\x71\x32\x19\xfc\xd2\x83\x6e\x02\xad\xb4\xb8\xe8\x41\x5a\x76\xd4\x56\x52\xc2\xe1\x03\x36\x85\xfe\xe3\x54\xf4\xfa\xfd\xe4\x7a\xe6\x30\x35\x2c\xe9\x0f\x2c\x10\xb3\x29\x8e\xac\xcb\x64\x03\x1a\x67\x86\x49\x53\x97\x8c\x9f\x24\xbd\xcb\x69\x73\x22\x2c\x1e\xa1\xe3\x35\xa7\x03\x0f\xef\x38\x66\x08\xd1\x9b\x40\x39\xc5\x60\x94\x5c\x62\xe2\x9f\x7d\xb7\x07\xd4\xa1\xc1\x23\xf5\x32\x18\x8e\xfb\x70\x4d\xa6\x2f\xcc\x92\xbf\xcd\xc4\xbb\xc1\x10\xab\x41\x66\xc3\xe4\xd2\xbe\x36\x9e\xfd\x4d\xbf\xa4\xaf\xe7\xba\x37\xfa\xa4\xdd\x74\x2c\xaa\x18\x81\x42\xbd\xed\xbb\xfe\x76\x0c\x49\xee\xd6\x77\x5e\x8e\x93\x29\x26\xac\xcd\x93\xdc\xd7\xa2\x3d\xdf\xb9\xea\x7d\x12\xbd\xe1\x74\x2c\x2e\x12\x31\xbe\x98\xf5\xa0\x8b\x3d\xac\x09\x79\x37\x1e\x0e\xc7\x1f\x01\x78\x40\x37\xfd\x2f\xbe\xe4\xe8\x3f\x66\x71\xb6\x13\x6b\xb5\xdd\x3b\xad\xaf\x3f\x35\x25\xef\x6d\x44\x74\x9e\x7a\x4d\xa0\x42\xa6\x7d\x56\xaa\x40\x02\x1a\x48\x57\x04\x64\xaa\x8d\xfc\x52\x22\xd2\x60\x30\xc0\xfd\x12\x62\x48\x79\x26\x97\xb1\x98\x4a\xe9\x57\x41\xd2\x35\xc3\xa6\x22\x6d\x00\xeb\xd6\xde\x5c\x3c\x55\x5a\x13\xc3\x52\xcd\x96\x3b\xab\xf2\xea\x8d\xb8\xee\x01\x10\x00\x67\x06\xd6\x80\x5e\xab\x4f\xbb\xd9\x1c\xba\x6a\x98\x0f\xb7\xaa\xd9\x57\x14\x8f\xcc\x0a\xa3\x84\x41\xb4\xfc\xc0\x57\xc1\xd9\xfd\x5b\x05\xad\xb3\xfd\x76\x06\x2e\x0f\xea\xcb\x6f\x0f\x9f\x92\xa9\x48\x0b\x45\xc7\x9a\xfe\x89\x71\x71\x45\xb6\x06\x51\xb9\x5a\x02\xb7\x4e\x5e\x3e\xc0\xf8\x0d\x14\xf6\x6f\xbf\x86\xb8\x07\xde\xb5\xfa\x80\xf1\x59\xd0\x9b\xff\xbf\xef\x41\xe8\x86\xfc\xa7\xf8\x2f\xff\x87\xa3\xb1\xf9\xd9\xc5\xce\x9c\x68\x70\x14\xe9\x4f\x53\xd8\xf3\x09\xc7\x09\x49\x76\x61\x37\x33\x25\x46\x63\x4b\x54\x13\xef\x99\x6e\xc9\x27\xd9\x3b\xc4\x5e\x05\x88\x00\x32\x2b\xbd\x8b\x61\x62\x5c\x1e\x16\xba\xb0\xc5\x87\x00\x8d\x8f\x6c\xc4\x3c\xfd\xcc\x23\xe6\x46\x6c\xc7\xa5\xdf\x29\xd7\x01\xf5\xbf\xd4\xa0\x8c\x3a\x86\x42\xbd\x90\x2a\x36\xfe\x0d\x64\x67\x30\x3c\x8a\x75\x15\x10\xf0\xce\x73\x9b\x22\x68\x16\x0f\xb8\x1a\x99\x8b\x78\x6f\x54\x89\xf2\xde\xa4\x1c\xae\x1f\xc8\x08\x72\x80\xff\x2c\x5f\x1e\x3f\x64\x4b\x19\x79\x4c\x20\x11\xc4\x9c\x1d\x2a\x21\x37\x1b\xc7\x23\x08\xe1\x32\x67\x6d\xd5\xef\x06\x91\x80\xfb\x98\x64\x99\xe1\x87\x47\xaa\x4b\xab\xe8\x91\xcb\x39\x71\x7d\x55\x12\x03\xd7\xa4\xf7\x63\xca\xea\xed\x92\xc1\xaa\xdb\x08\xcb\xbd\x22\xbd\xa2\xd0\xe1\xb4\x4c\x01\x28\x1c\xa7\xe7\x87\xa6\x76\x9d\xea\x3e\x63\xe4\x1b\x3e\x2a\x3f\xdb\xbf\x1a\xd9\x2b\x12\xb8\xdf\x94\x2a\xcd\xad\xcb\xd7\xc6\xc5\x17\xd4\x54\xc7\x0d\x75\xa0\xa0\x70\xa6\x28\x5b\x44\xaa\xcd\xdc\xb2\x60\xd5\xb5\xf5\xdf\x2e\x0e\x8c\xd1\x1b\x71\x74\xda\xb5\xee\x38\xe8\x41\x1c\xcc\x31\x2f\x65\x2e\x6b\xa9\xf6\xd0\x0b\x1e\xb5\xf7\xe9\xc9\x51\x3f\xa4\x06\xad\xcb\x26\xd7\xcc\x5b\x71\x74\xe6\xda\xd9\xa2\xc4\xd3\x46\x8b\xbb\xb7\x39\x1e\xef\x29\xfa\xe1\x78\xa7\x3f\xef\x3a\x1d\x8f\xfd\x5d\xa4\xe7\xa9\xf6\xfe\x35\xc5\x42\x1e\x71\x75\x85\xd0\xd7\xfb\x04\x52\x4d\x7a\xc3\x40\xb6\xc9\x2b\x9f\x06\x22\x8e\xfd\xaa\x0b\x9e\xb4\x8f\x49\x42\xb5\xab\x15\x1d\x94\xa3\x39\x24\xa5\xf0\xbb\x31\x06\x87\x3a\xf1\xef\x64\x10\x6c\x95\xd2\x17\x4f\x14\x92\x6b\x19\xb8\x47\x9b\xd0\x63\x56\x37\x44\xb2\xfd\x85\x6b\x39\x3e\xdc\x37\xbb\x26\x5f\x1b\xa1\x52\x95\xee\x36\xf5\xd9\xef\xb0\xf4\xba\x6b\xfa\xca\x3a\x6a\x69\x65\x20\x96\x8a\x7d\xd6\xe7\x18\x17\xda\x3d\xed\x7e\x45\xbf\x5b\xf7\x1e\x30\x94\xb0\x27\x9f\x75\x4d\xee\x61\xce\xca\x70\xbe\xfc\x65\x5f\x3f\x90\x6f\x39\x1b\x25\xe7\xe5\x31\x68\xb8\x40\x03\xa3\xbd\xe8\xdb\x50\x73\x78\x24\x9e\xbf\xf9\xd9\xd0\x7f\x64\xcb\xec\x3b\x1f\x0e\xed\xb2\xc6\x19\xb1\xe7\x73\xbf\x10\x3d\xc5\x97\x9c\x1a\x7b\x1e\xf5\xcf\x1f\x1c\x5f\xdb\xc6\x2f\x3b\x4a\x9e\xf0\x96\xaf\x3c\x5c\xf6\x84\xbb\x68\xe9\x5c\x1e\x3e\x5f\x5a\xf9\xea\xe1\xd0\x09\x08\x7e\x42\x11\xb9\x90\x46\xeb\xf7\x75\x4a\x78\x9d\xfb\x77\x3c\x1a\xf6\xca\xfb\xb7\x75\x21\xfa\xe6\x06\xbc\xad\x51\x2d\x2b\xf6\x69\x56\x8f\xb3\xd7\x3b\x53\xf7\xdb\x5b\xb8\xcb\xb6\xb1\x3a\x68\xd6\xf8\xb2\x68\xd8\x32\xfe\xcb\xaf\x31\x60\xfc\xfb\xff\xbc\xd5\xfa\xa2\xd6\x7c\x99\xa9\xda\xf7\xe8\xaf\xb4\x4f\xec\x71\x96\xab\x03\x20\x76\x9c\x02\x88\xca\xef\x95\x9b\x63\x07\xf3\x0f\x10\xc9\x5c\x24\x4e\x74\x6e\xa6\xc9\xa4\xd3\x6d\xad\xac\x85\x07\xf9\x5c\x3f\x69\x03\x99\x00\x17\x6a\x13\x00\x63\x6a\x6c\xa9\x58\x54\xa5\x52\xc7\xc8\x1a\x06\xca\x61\xdb\xa2\x96\x15\xfe\x1b\x95\x69\x91\x4d\x8f\x10\x76\x81\xe6\x26\x47\x3d\x3a\x73\x84\x52\x61\x98\x31\x20\xa1\x49\xa1\x76\xaa\x96\xeb\x48\xac\x65\x7d\x57\x2e\x23\xc4\x37\x2b\x15\xe9\xa6\xeb\x99\xd9\xaa\x48\x2c\xe5\x3d\x70\x42\x11\x63\x53\x24\x52\x12\x82\x01\xee\xa8\x62\xbb\x4a\x17\xc8\x76\xcc\x41\xc0\x10\x5c\x82\x30\xbd\x6b\x40\x97\x4a\x19\x10\xac\x86\xda\x3b\x15\xa3\x45\x0f\x35\x67\x8c\xab\x74\xa3\xa4\x5b\xaf\x61\x79\x7f\x28\x44\xe3\x9a\xd0\x5a\x58\xde\xe0\x22\x98\x05\xb5\xd7\x0e\x4b\x6e\x4f\xae\x22\x2b\x64\xbd\x13\x47\x3f\x1b\x1a\x0a\x44\x75\x12\x8b\xbb\x7e\x03\xfb\x3e\xac\x64\xd3\x62\x06\xb7\x26\xb5\x90\xda\xa3\x9f\xd2\x2b\x67\x59\xa5\x0f\x8a\x4f\x16\x5b\x7e\x38\xe1\x73\x47\x61\x2f\xb5\x8d\xc4\xa9\x0d\x5a\x25\x36\xb2\xca\xca\x25\x40\x03\x78\xeb\x99\xac\xac\x6b\xb0\x19\x69\xde\x70\x4f\x09\x39\x65\xc1\xcf\x0c\x79\x52\xd9\x62\xc6\x86\x5a\xca\x72\x5f\x9b\xc9\xce\xa7\x5c\x02\x7d\x97\xfe\x39\x8e\x87\x9d\x4b\x64\x20\x54\x96\x4e\xce\x3b\xf0\xd8\x04\x6b\x8f\x61\xd8\x6c\x6a\xdc\xf6\x43\xab\x8f\xe3\xe6\x2d\xdc\x97\x41\xb3\x6d\x43\x11\xfe\x6c\xa1\xbf\x1b\x37\xb7\x96\x69\x0e\x08\xef\x5c\x2c\xf7\xf5\x1b\x31\xed\x5d\x5d\x0f\x93\xa6\x14\xf3\xec\x43\xf2\x64\xad\xc6\x67\x8f\xe8\x81\xff\xd3\x02\x8d\x4f\xd4\x66\x44\x44\x31\x00\x2e\x8f\x0c\x02\xd3\x40\x1f\xe1\x82\xf6\x2f\xd5\x6d\x7c\x5c\x6b\x51\x3f\x0a\xd9\x5f\xdb\x24\x15\x2d\xf9\xad\x21\xbc\x83\xc3\x17\x9e\x1d\x3f\x03\x14\xa6\xc3\x4f\x26\xa3\xcb\x29\xc0\x2f\x09\x59\xf9\xc3\x1f\x7f\x7e\xc3\x3f\xf1\xf3\xe4\x7a\x78\x7c\x1a\x9f\xc4\xf5\xe7\xfa\x1b\xbd\xe3\xe4\xe4\xe4\xe4\xd5\x8b\x17\xfa\xbf\xa7\xaf\x5f\x9e\xf0\xff\x9e\x9c\x9c\x9c\xbd\x3a\x3b\x7d\xf5\xc3\xe9\xf9\xd9\xd9\xd9\xc9\xc9\xd9\xe9\xcb\xd7\x3f\x9c\x9c\x9e\xbe\x7a\x79\xfe\x83\x38\xf9\x46\xed\xf1\xfe\x6c\x55\x9d\x56\x42\xfc\x70\x9f\x2e\xb3\xf5\x81\xcf\x3d\xf6\xfb\xdf\xe9\x9f\x64\x91\x67\x1b\x15\x82\x92\xc5\xb1\xb8\x17\xa7\xf1\xc9\x33\xc8\x9c\xf3\x14\xe9\xf5\x64\xfc\x7e\xd2\xbb\x7a\x3c\xe3\x3e\x98\x8a\xa4\x3f\x1c\x5c\x4f\x5b\x32\xee\xbd\xf7\x93\x04\xec\xb3\xf6\xf3\x6d\x4e\xfc\x91\x7c\xb7\x21\x6d\x80\xd7\x7f\x41\xee\xda\xbe\x0c\x6b\xbd\x62\xcc\x29\x0f\xac\xb5\xef\xf4\x99\x9c\x19\xa5\x6e\x4c\x80\x2a\xed\x5a\xd1\xd8\x54\x35\x32\x30\x8d\xd4\x92\xf9\x05\x5c\x23\xa0\xd0\xd2\xd3\xaa\xdb\x23\xec\xd5\x33\xf5\x48\x11\x0b\x60\xcd\x1b\x6f\x26\x71\xcb\xd6\xd8\x8c\x8b\x0b\x65\xdd\x50\x1f\xee\x1a\x1d\xdb\xc8\x8f\x8e\x65\x59\x57\xa4\x4b\x53\xf0\xe5\x7f\x94\x85\xad\xf0\x2c\xe3\xca\xa2\xd6\xc3\xd8\xf3\x65\x2b\x7c\x4e\x37\x08\x53\x73\xd1\xb8\x01\xa5\x35\x67\xbb\xf1\x90\x39\x3d\xc1\xe7\x44\xfc\x68\x1f\xa9\x7e\xa4\x87\xfa\x80\xbc\x95\xc8\x6a\x80\xec\xa6\xcb\xa5\x2b\x47\x31\x0d\x32\xb7\x3e\xef\x2b\xb5\x92\xf9\x8a\x9c\x53\x88\xa1\x2e\x6a\xd2\x93\x0b\x3f\xfb\xa3\x22\x29\x86\xd8\x6b\x95\x32\x9c\xcf\xd6\x3f\xdb\x37\x20\xe0\xc5\xbc\x11\x47\x7a\xc4\xb9\x3c\xf8\xda\x49\x9a\xab\xb6\x94\x3b\x12\xa1\x9a\x22\x5b\x87\x67\x32\xcf\xb5\x89\xed\xac\x02\xfe\xe2\x86\xdc\x38\xde\x44\x8e\x32\x7a\x31\x68\x13\x04\x3c\xae\x16\x75\x88\xcf\x8c\xfd\x0d\x51\x56\x1c\xbd\xb5\x41\x98\x12\x14\x20\x01\x86\x12\xe6\xd0\xb5\x58\x35\x9f\x64\x23\x04\x94\x24\xc6\xc7\x05\x57\xa0\xdc\x8b\xc7\xa4\x81\x2f\xa5\x3d\x40\x68\x3d\x55\x13\x65\xf9\xae\x19\x8d\xd9\xe2\x45\x43\x51\x71\x5c\x56\x2b\x7f\x05\x61\x9c\x1c\x7d\x33\x13\x25\xe7\x7a\x39\x5e\xa3\xe9\x1f\xa6\xeb\x35\xb0\x55\x7b\x13\xef\x4f\x52\xb3\x6c\x9f\x6f\x6a\x7c\xa6\xf5\xa0\xd9\x80\xea\x26\x3d\xdc\x95\x86\x3a\x4b\xb5\x4e\xae\x6f\x1f\xd8\x7d\x34\xf7\xec\x0f\x96\x08\x9f\xc5\x48\xd2\x00\x8c\x98\x40\xda\xe0\xec\xd8\xd4\x17\x65\xf0\x8b\xc3\xd8\x2b\xc0\xcc\xec\xcf\xf7\xb0\xca\x54\x3f\x54\x17\x61\x4c\xaf\x19\xd2\x6b\xb9\x4d\x42\x29\x30\xde\x5d\xa5\xa1\x1a\x96\x6d\x6b\xd3\x70\x0a\xe7\x3b\xa7\xfb\x65\x7f\x42\xd5\xe8\x11\x17\xa1\xf7\xe8\x85\x65\x63\xee\x18\xd7\x3c\x17\xfd\x03\xff\xd3\x94\x9c\x2e\xee\x5a\xd8\x8e\xb3\x42\x28\x94\x9f\xb0\xb6\xbd\xc4\xf1\x84\x7f\xeb\x76\xc4\xce\x72\xff\xeb\xc6\x3a\x08\x89\xe1\x2a\x0a\x77\xe1\x81\xf0\x60\x5d\xd2\x3f\x31\x24\x18\x04\x00\x6d\x5c\xf0\xcb\xc6\xf5\x29\x83\x87\x05\xc4\x41\xf3\x49\x6a\xd6\x15\x68\x36\xb2\x39\x8d\x86\x98\x8b\x85\xd9\x47\xd9\x2a\xf2\x40\x14\x8d\x2f\x64\xe6\xd4\x98\xef\xfc\x5f\xda\x3c\xa8\x31\xec\xad\xef\x83\x6b\x98\x6a\xa4\x7e\x04\x56\x9c\x41\xb9\xbb\x7b\x76\x38\x11\xa6\x00\xae\xa5\xd3\x0d\x35\x01\x13\x40\xb1\xaf\x20\x62\x3b\x7b\xfe\x84\x4d\x03\x16\x8f\xbb\xb4\x5a\xc2\xc1\xa2\x6f\xd0\x18\x23\xcd\x4d\x23\x2c\x77\xa4\x59\xb9\x8b\x6e\x18\xca\x81\xe0\xab\x95\x4a\xab\xef\x00\x97\xda\x58\xb5\xb4\x5c\x6b\xa7\x51\xac\x4c\x6d\xb0\x6f\x38\x1d\xac\xd4\x90\x13\x14\x25\xf0\xe5\x56\x28\x3c\x06\x0d\x35\xf2\x77\x14\xa4\x6c\x64\x6d\xf9\xec\x5a\xa5\x11\x73\x22\xf0\xa0\x8d\x55\x18\x69\x4f\x12\x50\x9c\xc1\x23\x13\xc5\x83\x8d\xca\x33\x7d\x28\xba\x32\x01\x3b\x20\x1d\x31\xb5\xb7\x3c\xa0\x04\x21\x0b\xfa\x54\xc0\xa5\xc0\x9f\x2e\xe6\xa9\x42\xbc\x1c\xd7\x75\x80\x63\xeb\x60\x3b\x39\xba\x17\xb5\x4d\x6d\xc5\x3e\x30\x7c\x20\xa1\xb0\x07\x38\x32\x60\x38\x9a\x93\x06\x69\x68\x14\xb2\x0d\x18\x85\x13\xa2\x30\x56\x65\x2e\x7d\x95\x9b\x1d\x5a\x08\x20\x87\x75\x1d\x3b\xd8\xf0\x42\xca\xa5\x5c\x1a\x6b\x80\x40\x2b\x92\x1f\x26\x36\x7e\x9e\xd0\x69\xc6\xf4\xb9\x24\x34\x4a\x4f\xb8\xf6\xa2\x5e\xa0\x31\xfe\x9e\xb7\x9b\x01\xef\x2b\xd7\xd9\x6a\x76\x84\xc0\x52\xb8\xae\xcc\x2b\x29\xb4\xd7\x60\x7a\xe6\x3e\x82\x10\x62\xd9\x6d\xae\x12\x8f\xf7\x20\xad\xcd\x26\x70\x05\xad\x59\x0d\xf1\x2b\xb5\x5d\xad\xb2\x05\xea\x0f\xd8\xc3\x91\x86\x2b\x2b\x1a\x1b\xc7\x59\x52\x03\x20\xf3\xa3\x7a\xce\x74\x70\xd8\x76\x8b\x1b\x72\x1e\x7b\xc1\x31\xa8\xdf\x6c\x68\x54\x38\x62\xe4\xf6\xa1\xd5\xcf\x0e\xcd\x37\x1d\x34\x46\x49\xa3\xc5\x13\xb5\xdb\x5a\x0f\x0c\xbf\x5e\x91\x8a\x81\xa5\x59\xa8\x1f\x23\xa5\xb0\x5d\x7a\x1b\x5c\x97\x6a\xd5\x7c\xb1\x7f\x33\xb2\x71\x48\xf4\x27\x8c\x40\x8b\xa7\xb5\x16\xf8\x55\xf0\x03\x92\x48\xcb\x64\xd8\xa8\xc8\x82\x57\x21\xb7\x85\xe8\x55\x8f\xa6\xc6\x7d\x13\xa3\x71\xbc\x37\x59\x9d\x9b\xa2\xe5\xe2\x98\x1b\x83\x88\x3f\xee\xe0\x33\xd6\xb2\xd2\xf7\xb2\xda\xd8\x23\x00\x91\x66\x35\x10\x97\xaf\xca\x40\x67\x83\xa0\x8d\x6f\xfd\x5b\x20\x1f\x14\xa2\x90\x78\xca\x98\xf8\x52\x4e\x44\x00\xc4\xbb\x8e\x59\x8d\xc8\x96\x71\x44\x18\xbf\x4e\x73\xf8\x50\xb6\xd4\xd7\xe2\xdc\x92\x60\xe1\xa5\x16\x14\xb8\xcc\xa3\x4c\x65\x7a\x5e\xaa\x5a\xaf\x9f\x55\x56\x2b\xaf\xed\x59\x57\xa8\x3a\xad\xad\x96\x27\xa7\x68\x30\xa7\xe3\x32\xc3\xb4\x27\x26\xb3\xf8\xf2\x11\x81\x7a\x1d\x49\xf4\xb5\x80\x6b\x50\x29\x9b\x5b\x72\xb0\x55\x01\xde\x24\xbb\xf7\x9b\xc3\x5d\x1e\x03\x5f\xb6\x5b\x48\xb1\xbc\x18\xb4\xad\xe9\x3d\x61\xb6\x54\xef\x2e\xbb\xae\xa5\x12\x77\xe5\x03\x10\xb5\xcf\x21\x4a\x9b\xd5\x98\x7a\x72\x84\x36\x46\x89\x0b\x2f\x6a\xa6\x94\x24\x15\x6b\xb9\xcc\xb6\x6b\xb1\xd8\xaa\xba\x5c\xe3\x2d\x0a\xaa\xf4\x57\x3c\xdf\x25\x3f\x9b\x18\xac\x10\xe2\xa3\x29\x96\x64\x8d\x0e\x32\x7a\x81\x63\xa7\xdb\xea\x6f\x6d\x23\xb0\x1c\x7c\xaf\xed\x72\x13\xec\xe6\x80\x22\xda\xcd\x5a\x43\xb3\x19\xac\x06\xe6\x94\x59\xca\x23\xb0\xd6\xde\xf2\x75\x02\xc3\xeb\xf2\x1e\x33\x54\x79\x2d\x4d\x06\xd8\x57\x04\x6e\xd1\x1e\x0d\x1f\xdf\x38\x06\x30\x6d\xa3\x17\x38\xa8\x3d\x63\xa8\x81\xea\x5e\x4d\x28\x03\x0b\xfe\xf6\x5b\x7a\xae\xaa\x06\xcb\x89\xc9\x2a\xc3\x29\xa8\x78\x2c\xc8\x97\xd0\xb5\xaf\x6e\xbe\xb0\xe1\x24\x36\xd5\x3e\x79\xd8\xed\xd9\xbf\x9d\x38\x5e\xfe\x4f\x88\xe3\x59\xdf\x20\xf0\xf3\x7d\x59\xbc\xe0\xa8\xfb\x8e\x4a\x78\xde\x7d\xbe\xa1\x84\xe7\x97\xa0\x7e\x45\x63\xa3\x66\x18\xec\xa8\xc3\x66\x97\x87\x7d\xbe\x46\xec\xce\x7f\x30\x17\xe3\xf2\x9f\xfc\x75\x42\x76\xf0\xc1\xef\x27\x64\x17\xa4\xc5\xea\x7f\x4a\xce\x2e\xa8\x1e\x7e\x8a\x9c\xdd\x97\x4c\xec\xef\x4e\x9e\x2e\x34\x96\x6f\xc4\xe3\x1a\x75\xc1\x18\xb6\x6a\xd4\xe1\xa1\xb9\x4f\xa2\xae\x25\xd3\xc9\x24\xea\x0e\x29\xd4\xf9\xef\xfe\x8d\x14\xea\x1a\xda\x70\x5f\xa3\x53\xe7\x5d\xa6\x7c\x1b\xb1\x86\x53\x8c\x47\x07\x9e\x6e\x28\xae\xe9\x27\x7f\xd3\xcd\x0e\xdc\x22\xac\x16\x2d\xe0\x6d\x6d\x23\x04\x58\x9e\x50\xef\xd8\xbf\xc5\xcb\x02\xe2\x4f\xca\x93\x0a\x33\x7b\xd9\x29\x75\x32\xc7\xd7\x8c\x6e\x5d\xba\xb6\xe9\x79\x28\x51\xa4\x3c\x78\x08\x22\x70\x98\xd3\x6e\x72\x18\xed\x2d\x6a\xde\x0d\x49\xb4\xf8\xc6\xf9\x29\xb4\x93\xa2\x43\x4b\x03\xd1\x82\x80\xab\x73\xf6\xd2\xb4\x88\xd9\x99\xa6\xb5\xe7\xfd\x7b\x62\xa7\xc8\x41\x44\xee\xb3\x6d\x65\xd1\x01\x8a\xb9\xa9\xc1\x8a\xdf\x90\xac\xbe\x35\xb6\x0a\x5c\x47\x05\xd5\x54\x07\xfa\x85\xb4\x14\xe9\x8e\x9a\x46\x5f\x37\x3a\x89\xa3\xb1\x2d\xef\x7b\xf6\x64\xa5\x33\x9b\x94\x8b\xbc\xb4\x1e\xcf\x2a\x1e\x94\x34\x3b\xa4\x24\xb6\x4f\xab\x8c\x29\x95\x3d\x26\x54\x86\x24\xca\xdf\x4b\xac\xec\x3b\x49\x55\x99\xed\xff\x5b\x89\x54\xb5\xe6\x25\x7e\xff\x32\x55\x0d\xa9\x3f\x4b\x40\xfd\x55\xcb\x7b\x44\x8b\xd0\xd5\x45\x8f\x88\x87\x9c\x41\xfc\xa7\x44\x7c\xfd\xa8\x86\x84\xd3\x8e\xe0\x0a\x11\x56\x19\x22\xfa\x83\xdc\xbc\x05\x2c\xf0\x3d\x68\xcd\x49\xe0\x8c\x14\x20\xa1\x42\x76\x1f\x69\xa4\xbb\xcb\x3e\x4e\x1b\xe9\x6f\x82\x6f\x48\x0f\xe9\x83\x10\xfe\xed\x09\x22\xbf\x06\x2e\xbc\xb3\xdc\x3f\x5f\x03\xeb\xed\xa2\x17\x8c\xc6\x34\x48\x43\xd0\x15\xff\x08\xc3\x67\xfa\x23\x5e\x9e\x26\x70\xe7\xc1\xba\xe1\x01\x6d\x2f\xd0\x40\x74\x86\xa9\x9a\xae\x75\xa8\x55\x00\xaf\xfd\xd1\xf4\xef\x48\x19\xdc\x6e\xe3\x03\x41\x89\x2f\xae\x22\x5b\x7d\x7d\x34\xef\x86\x70\x5b\xed\x05\x50\x03\x01\x8c\x07\x4f\x64\xe3\x97\x29\x40\x02\x22\x7d\x54\x8f\xd7\x71\xb8\xb7\xb5\x1d\x0a\x8d\xf7\x20\x4a\xc3\xe9\xcb\x31\xed\x5a\x86\x8e\xb6\x6a\x6b\xb4\x3c\x1b\x41\xd3\x20\x86\x07\x20\x1b\x73\xc9\xb6\x92\x75\xfa\x2d\xfa\x1f\x61\x70\x0c\x01\xb9\x18\x7c\x5d\x4b\x02\x0d\x37\xe5\xeb\x08\x9a\x5b\xb8\x23\x09\x39\x60\xbf\xa0\xf7\xb6\xdf\x5c\xc6\xd8\x5d\xa6\x17\x32\x55\x08\x5b\xf0\x8f\xea\xe6\xe5\x2f\xd5\xde\x00\xb0\xfc\xf3\x10\xd0\xa6\xd2\x3b\x12\x0c\x03\xd3\x6e\xe3\x8d\x6b\x2a\x95\xb5\x0c\x1d\x26\xb3\x82\xf4\x90\x07\xf8\xf5\xb9\xd8\x5d\xb3\x02\x91\x46\x4c\x9d\x3b\x31\xac\xe4\x5e\x56\x00\x70\xc8\xc0\xc9\x5f\x67\x35\x39\x03\x10\xa3\xf3\xfa\x0c\x89\x8c\x4c\xb6\x9a\xa2\x39\x2a\xa8\xd9\x0b\x65\x7a\x5f\x66\x4b\xa0\x4d\x28\x14\x72\xba\xa3\x41\xf2\x4c\x2a\x47\x3b\xeb\x37\xe9\xcb\x15\xc0\x90\xe7\x12\xb5\x7f\x33\xc7\x01\xea\xf8\xd9\x30\x6e\x83\xd7\x34\xf7\xb8\x69\x2d\x1f\xd2\x6a\xa9\x3d\x31\x59\x19\x8c\x86\x2d\xe6\x37\x72\xde\x9e\x7e\x37\xb3\x2e\x20\xf3\xad\x7f\xd8\x6d\x59\xba\x2d\xc2\xde\xed\xa2\xc6\xcd\xd6\xec\x97\x34\xf6\x52\x3e\xd0\x17\x03\xf0\x7b\x57\x6e\x8b\xa5\xdd\xd2\x1c\xad\xd6\x78\xfe\xde\x2f\x42\x98\x0f\xa4\x11\xe8\x48\x69\x66\x06\xab\x7b\x69\x42\x9d\xcd\x76\x63\x7d\xc3\x36\xab\x61\x33\x5a\x20\x94\x97\x75\x65\x63\x69\xb6\x82\x7b\xd0\x97\x89\x9d\x43\x37\xcc\x82\x65\xd3\xe2\x25\xa5\xbb\xd8\xab\xfc\x21\xdd\x29\x20\x89\x65\xe0\x1e\xe5\xe3\x38\xf6\x36\x8b\x4b\xe3\x11\x12\xcd\xe8\xe1\x41\x40\xc4\x20\x08\x22\xb2\x38\xe9\xe1\x5e\xea\x3d\x63\xc4\xc3\xa3\x46\x9c\x00\x39\x06\xf7\xa7\xe7\x58\x47\x1b\x19\xf8\x2e\x63\x43\x61\x4d\xd8\x23\x2a\x50\x1b\xb9\x55\x27\x58\x88\xac\x71\x4b\x3c\x49\x80\x2d\x35\xf2\x8c\x05\x21\x99\x8a\x92\xa5\xad\x43\x29\xc9\xf6\x28\x12\xe5\xe1\x9b\x52\xf1\xa1\x4d\x30\x95\x35\xb6\xa1\x40\x83\x05\xc9\xb2\x05\x09\x41\x48\x55\x97\x9b\x8d\xcc\xc3\xa4\xb9\xd3\xcf\xf4\xc3\xf8\xa4\x9e\x61\x3a\xde\x52\x45\xe6\x67\x8d\xc8\x1a\x2c\x89\x65\x2b\xf4\xe9\xb8\xc8\x4b\x1d\xf0\x7e\x37\xb4\x40\x6c\xa8\xbb\x7d\x58\xf8\x77\x89\x38\x7e\x8a\x49\xa6\x72\x25\x7a\x6b\x59\x65\x8b\x94\xe9\xb5\x18\x1a\xf3\x70\xcb\x3c\x22\xe1\xc2\xd2\x2b\x4f\x12\x71\xf9\x02\x01\x97\x3d\xba\x2d\x18\x76\x00\x2a\x6a\xeb\x6b\xc4\x7f\x60\xfb\xbf\xfb\x9f\xf8\xf9\x52\x6e\x2a\xb9\xd0\x5b\xfd\xbf\x1f\x3e\x7f\xcc\x8a\x65\xf9\xa0\x7e\xdb\x62\x80\xc3\xf8\xff\x93\xb3\xf3\xd7\xe7\x01\xfe\xff\xe5\xe9\xd9\xab\x3f\xf0\xff\xdf\xe3\x0f\xc6\x33\xf4\xa5\xd9\xf1\xeb\x9d\x12\xbe\x88\xf2\xf5\x44\xd5\x68\xa3\x9f\x2e\x45\x7a\x57\xe6\x4b\x59\x39\xcf\x2d\xcf\xe6\x95\xbe\xce\xdd\x02\x03\xad\x76\xfb\x20\x27\x82\x48\x04\x3a\x03\x31\x25\xa7\xdc\x2d\xf4\x73\xcd\x52\xac\x26\x71\x51\xc9\x5c\x32\xc4\xbd\x79\x70\x4a\x09\xc0\x85\xc7\x48\x66\x97\xad\x18\xd2\xe7\x86\xf8\xa1\x08\x33\x1e\xda\xca\x10\xd7\x98\x39\x73\xcf\xe3\x53\x8f\x87\x4a\x7f\xb6\xac\xc4\x51\x5a\x8b\x5d\xb9\xad\x44\xb9\x41\x26\x0c\x70\x90\xf5\x95\x24\x3c\xad\xe9\x5b\xba\x45\xf6\xac\x36\xf6\xbe\x75\x80\xf6\xbf\xd9\x56\x09\x18\x0c\xef\x0c\x92\x4d\x34\xe6\xe8\xad\x61\xbb\xe0\xfc\x07\xcc\xa6\x7e\x45\x24\xf2\xac\xf8\x35\x32\xce\x5f\xe0\x54\xe3\xf0\x60\x67\x1e\x50\x94\x5a\x45\x42\x5f\x4a\xab\x9d\x87\xdf\xb1\x8e\x6b\xb9\x22\xdc\xad\x05\xa8\x61\x23\x61\x48\x0d\x7e\x68\xb0\x82\x86\x80\x1b\x8f\x49\x7f\xed\xc6\xea\x1b\xa2\xda\xc3\x17\xe7\x51\x98\xbd\x1f\xdd\x88\xf7\xb2\x90\x55\x9a\x7b\x25\x27\x0b\x29\x08\x22\xa1\x3f\x61\xa6\x71\xcf\x27\xb3\x82\x4a\x77\x19\x40\x80\x56\x48\x84\xce\x67\x66\xd7\x09\xdd\x3e\x88\x74\xd9\x8d\xaa\xbd\x34\x06\xe8\x52\x53\xff\xad\x3b\x99\x2e\xdd\x82\x7c\x48\x77\x50\xc7\x89\x37\x90\x75\xa6\x72\xd4\xa2\xb0\xf5\x03\xd6\xbd\xd1\x6e\xd3\xd6\xa5\x01\xed\x8d\x03\xc6\x28\xc2\x69\xdc\xaa\x9a\x0a\xca\xf1\xe9\xae\x5d\x54\xe5\xe8\x30\x21\x06\x32\x8b\x35\x17\x7f\xdf\x52\x0e\x01\x9d\x2a\x0c\x35\xd8\xfb\x31\x7d\xd9\x2a\xb4\xe4\x3b\x93\xdf\xa7\x69\x7b\xa8\xb2\xda\x5c\x82\x16\x2e\x3a\x61\x57\x09\xe2\x54\xf8\x70\x22\x8c\x0e\x3e\xb0\xb8\x2b\xf5\xd3\x2d\x4d\x69\x49\x63\x1b\x76\x41\x4f\x8e\x19\x54\xf8\xa2\xf7\x3e\xdb\x16\xca\x49\x3e\xe8\x0b\x94\x1e\xf2\xb6\xa1\x91\xdf\x72\x64\xfe\xd5\xa6\xf7\xdf\xe2\x4f\xfc\xbc\x7f\x39\xec\x1d\x4f\xef\x52\xed\x22\x7e\x9b\x42\xc0\xc7\xea\xff\x4e\xce\xc3\xf3\xff\xfc\xfc\xec\xc5\x1f\xe7\xff\xf7\xf8\xd3\x47\xb5\xac\x7a\x27\x2e\xd3\x3a\xb5\xf5\x7f\xee\x42\x70\x2c\x68\x6d\x88\x63\xcb\xfe\x00\x95\x81\x7a\xd3\x67\xca\xe6\x0d\x9f\xf6\x90\x88\x3f\x43\x1c\x75\xec\x47\x3a\xdd\x18\xbf\xac\x2f\xbf\x16\x2b\x5a\x8a\x4f\xe5\xb6\xfd\xa2\x32\xdf\x21\xe8\x8b\x0e\x16\xf8\xee\x35\x7e\xb1\x52\xb1\xfe\x5e\xe5\xe5\xaf\x58\x8c\x91\x61\xa3\x9d\x93\xc2\xe2\x5f\xa0\x42\x00\x02\x3f\x14\x55\x86\x87\x21\xbe\x29\x35\xe2\x42\x4e\xcb\x0c\xa1\xfe\xf3\x72\x5b\x58\x0f\xe0\x69\x00\xd6\xf8\xd9\xcc\x49\xc5\xd1\x29\x0f\x7d\xf2\x3a\xe3\x6e\xd5\x60\xfa\x90\x78\x06\x3f\xe2\x10\x75\x78\x89\x4c\x6b\x18\x2f\xfa\x02\x7e\x1e\x3e\xe8\x69\x1a\xd8\xa3\x59\xed\x69\xa8\x8d\xdf\x2f\x75\x3b\x97\x3e\x5c\xb9\x50\xba\x51\x44\xac\x40\x67\x36\x64\xaa\xeb\xd6\x1c\x47\x2c\x7a\xce\xe6\x46\x7e\xcf\x8e\x14\x06\x13\x74\x9b\x89\x8f\x1f\x13\x0b\x00\x12\xaa\x24\x9c\xaa\x18\xa1\xc3\x8a\x4c\x13\xc7\x3e\x8d\xc5\xa5\x25\xab\x56\x46\x51\x28\x3e\x15\x9d\xde\x72\x69\xeb\xb6\x4a\xa1\xb6\x9b\x0d\x61\x31\xe0\xc5\x10\x6c\xfe\x64\x0e\x3b\x40\x3e\xae\xa5\x3e\xbd\x65\xae\xe4\x8f\x0a\x3e\x14\xb1\xab\x69\x56\xe0\xa7\xf5\x63\xf1\x5d\x71\x47\xd8\xbf\x87\x05\x80\x13\xf8\x9e\x15\x6b\x3c\x8d\xcf\x44\xa7\x0f\xf4\x22\x46\xbc\xed\x46\x49\xd3\x3a\x5c\x52\x45\x9a\xef\x54\xa6\x74\xef\x1d\xe7\x37\xdd\xb1\x17\xde\x57\x91\xf1\xc3\x2f\x03\xe8\xfa\x25\x0e\xbe\xfc\x94\xee\x4b\x2c\x2e\x50\x51\xb3\x5c\x19\x94\x88\xc5\xb3\x72\xe1\xcc\xb6\x66\x7a\x10\xb3\x40\xc5\x0e\x81\x92\xfc\x2b\xd0\x93\x3a\x5b\x40\xe0\x7e\x71\x57\x64\xff\xd8\x12\xbd\x0f\x81\x8e\xc1\xbb\xc4\x00\x19\x3d\xd2\xf4\x9d\x9e\x87\x9b\xbf\x10\xcb\xec\x36\xab\xd3\x1c\x61\xe5\x75\x29\x6e\xc1\x07\x04\x4c\x8c\x5b\x66\xe9\xbc\xdc\xd2\x9c\x1a\x94\xf0\x06\x74\xf8\x0a\xed\xe8\x55\xb2\x58\x42\x42\xb9\xc2\xe8\x35\x00\xb5\xb3\x82\x94\xa8\xe0\xef\xca\x99\x80\xb4\x36\xf5\x8b\x6e\xe6\xce\x45\x47\x3f\x9c\x97\x00\xf2\xd7\xb3\x10\x9b\xf5\xf5\x09\x10\x6b\x3f\xe4\xf0\xcb\x99\xd5\x46\xd5\x97\x9d\xae\x6e\x18\x43\xb6\x11\xd1\xfd\x7d\xb6\xdc\xa6\xb9\xde\x22\xc6\xbf\x62\x2c\x0e\xb7\x29\x50\xec\x2c\x89\x89\xcb\xb3\x0e\x50\xc2\x2a\x12\xcc\x6c\xb9\x2a\x56\x6d\x50\x10\xc1\x0d\x55\x03\x38\xf4\xc6\xf0\x55\xf2\x60\x8c\xcb\x8d\xc3\x0b\x1c\x07\xfb\x36\x5e\x0e\x9a\x34\x93\x69\xc5\x4e\xc8\xf5\x26\x2f\x77\x52\x5a\xf2\x89\x74\x41\xd0\x53\x18\x0e\xd3\xce\x6d\x7d\x57\x56\xd9\xff\x10\xa2\x87\xc2\xe8\x68\xaa\x38\xf2\x9c\x7d\x87\x34\x3a\xe8\xb3\x12\x37\x6b\xfb\xd1\x60\xd9\x94\x60\x93\x4d\xc0\x1a\x62\x38\xd4\xf5\xec\xa5\xe8\x24\xc5\x5d\x0a\x37\xc9\x70\xaa\x01\x58\x5b\x9b\x4d\xe4\xec\xaa\x69\xa7\x35\xb6\x90\x6c\x20\x35\xd0\x72\x05\x92\x1a\xf0\x4a\x67\x22\xc8\x3d\x3d\x9a\x87\x2c\x87\x75\x89\x0f\xd7\xcf\x05\xc4\x90\x09\x18\x3f\x32\x23\xaf\x74\xbb\xf5\x78\xf0\xa9\x28\xd2\x7a\xab\xef\x49\xae\x42\xb7\xac\x6e\xd3\x22\xfb\x1f\xaa\x45\x83\x83\xe5\x73\xa6\x6a\xb5\x47\x8d\xd0\x93\xaa\xb5\xd2\x1c\xe8\xfb\xd3\xa3\xe4\x52\x2f\xa4\x5b\x5c\x9b\x98\xb5\xcb\x73\x5e\xd8\x94\x19\xe0\xbb\x03\xd6\x55\xb2\x45\xac\x41\xff\xf4\x90\x60\x83\x6e\x2b\x25\x04\xf6\x52\x70\xb7\xab\x34\xe0\x80\xe8\x59\xa8\x8d\x48\x43\xb4\x47\x51\x22\x72\x14\x2a\xb5\xaf\xd9\x50\x71\xb9\x06\xb3\x04\xb1\x41\x6e\x6f\x32\xdd\x85\x40\xf3\x58\xcf\x74\x1d\x0a\x37\xb8\xa0\xea\x2a\x5b\xd5\x50\xb9\xba\x00\xc2\xaa\x97\x27\xff\xbf\xae\x99\x83\x72\x5b\x5b\xae\x33\x75\x97\x56\x68\x32\xa0\xd6\x2a\x43\xc0\xd7\xd1\x02\x9f\x8d\x1e\x03\x84\x66\xbc\xd7\xb0\xa6\x8a\xb2\x8a\xc4\xd1\x12\x3f\xcf\x8a\xd5\xd2\xcd\xa6\xcc\x78\x14\xdd\x40\x7c\xd7\x54\x31\x07\x26\xc2\xc8\x56\x38\xc9\x17\x1c\x20\x82\x7d\x5b\x7b\xe3\x96\xe5\x6b\xd1\x19\xca\xe5\x2d\xb3\x10\xd6\x90\x57\x52\x9f\xff\x76\x37\xb9\x7a\x41\x07\x2a\xca\x0a\xfc\x9d\x1f\x38\xf7\xc3\xfe\x06\xd8\xb4\xc3\x03\xa6\xcc\xcb\xdb\x9d\xa1\xd6\x5b\x51\x8d\x7c\x6a\xba\x49\xef\x84\xac\x64\xad\x07\xdf\x7f\x75\xe4\x78\x71\xf0\x70\x08\xb2\x14\x8f\x34\xc6\x75\xfb\x27\xd1\x81\x6d\xbd\x63\x4e\x07\x5e\x5e\x23\x21\xab\x14\x23\x35\x95\xd1\x08\xa9\xe4\x31\xc0\xf7\x6e\x65\x9b\xa7\xd1\xf1\x0c\x44\xdc\x09\x0c\xc6\x63\xce\xc6\xcf\xa2\x43\xf6\x89\xb5\x05\x40\x15\xb0\x4f\x2b\xc8\xbc\x79\x76\x8d\x59\x6e\xb0\x5a\x9e\x3d\xec\xfa\x65\x1e\x7a\xdc\x3d\x64\xbb\x84\x84\x3a\x46\xfa\x6f\x7c\x69\xee\x39\x81\x5e\x0c\xc0\x02\xc2\x34\x85\xd8\xdc\xed\x14\x38\x08\x40\x27\x8f\xe3\xb1\x2e\x6b\xb8\x94\x4b\xa5\x70\xb7\xeb\xf7\x18\x9e\xb2\x84\x36\x9d\x31\xb5\xa6\x3f\xd6\xdd\x77\x2d\x24\xc4\xb2\x3b\x48\x11\xd2\x8f\x11\x1e\x3a\x92\x5c\x91\x4f\x62\xb6\x88\x90\xc5\x6d\x7a\x2b\x97\x88\x84\xe4\xc7\x55\x25\xd2\x5b\xf2\xed\x09\x89\x49\xc4\x59\x05\x7f\x04\xa3\x86\xe8\xd1\xf0\x2f\x8c\x72\xe6\x62\xb1\xad\x14\xba\xf3\x90\xe4\xe5\x07\x08\xf8\x66\xce\x6d\x3d\x01\x7e\x00\x6d\xfd\x91\xb2\x9f\xfe\xa1\xd8\x44\xc2\x11\xe1\x68\xaf\x68\xcc\xcc\x5a\x8d\x44\x5e\x2e\xd2\x1c\x8d\x1c\x8e\x6a\xce\x36\xe7\xe9\xa9\x7e\x26\xac\x17\x7e\xcc\x95\xdb\x7a\x51\xae\xc9\xa7\xdc\xd6\x9b\xad\xb9\x83\xe8\xa6\x52\x81\x11\x5c\x21\x60\x75\x34\x5c\x44\xe7\x64\xd2\xb3\x19\x32\xc9\xac\x52\x67\xf8\x52\xb1\x24\xfc\x8f\xbe\xe0\x11\x21\x21\xbf\xbb\x79\x5a\x7c\xcd\x97\x65\x14\x96\x64\xbd\x3a\x13\x9d\xe9\x36\xc3\x20\x61\x86\xfe\x80\xfe\x88\x98\x80\x51\x31\x3d\x45\x13\x13\xf1\xa4\xba\xf5\xd9\xf8\x0e\xc4\xcb\x12\x9e\x03\xf7\x52\xfc\xfc\xea\xf9\xcf\xcf\x93\xbe\x69\x62\xb2\xad\xca\x8d\x4c\x0b\x71\x9d\x56\x79\x96\x5a\x00\x85\x2d\xa9\xd9\x16\x8b\x0c\x28\x3b\x4f\x4f\xc5\x55\x5a\x2d\xee\xc4\xe9\xcf\x3f\xbf\x32\x41\x54\xcc\xbb\x6d\xaa\xb2\xb6\xd2\x40\x80\x5c\xd4\xed\x55\x10\xb3\xd4\x8f\x5c\x22\x60\xe1\x39\xca\xbf\x2f\xa8\x6e\x36\x55\xe2\x41\xe6\x39\xe0\x74\xf0\xb4\xfd\xc7\x36\xbb\x4f\x73\x48\xb8\x1a\x37\x76\x87\x44\x2d\x94\xd6\x04\x76\x00\x36\x52\xe7\xa2\xc3\xae\x1e\x68\x49\x43\x13\x80\x2b\x8a\x04\x96\x36\x3b\xac\x17\xa9\xb7\x4b\xfc\x5b\x25\xef\x33\xf9\x80\x02\xcf\xa0\x63\x8a\x52\xcf\x69\xbe\xfb\x1f\xe4\x32\xbd\x4f\xf3\x6d\x8a\x3f\x86\x23\xf4\x57\x4c\xb4\xb7\xac\x99\x4c\xbb\xc0\x14\x8e\x9f\x6b\xab\xb2\xb8\xcb\x0a\x5c\x85\x77\xdb\x75\x4a\xe6\x38\x0d\x2b\xfd\xe7\x65\x7d\xc7\xba\xf4\x42\x74\x3e\x95\x5b\xdc\x2f\x7a\x7d\xb6\x78\xa6\xb0\x96\xcd\x5e\xda\xef\x2e\xc6\xfc\x66\x79\x16\xe3\xf2\x81\xc9\x1d\x3a\xba\x8a\x1b\x42\xea\x38\x6f\x95\x9a\x72\x16\x9f\x86\x74\x0f\xfc\x26\xcd\x0b\x72\xcd\x3b\xce\xdb\x90\x2e\x8d\x8b\x31\xa7\x82\xd0\xff\xa6\x58\x48\xca\xa9\x1f\x02\x52\x88\xac\xaa\xe4\x7d\x89\x68\xc1\x23\x69\x33\xfa\x36\x9c\xc2\xda\xf0\xb2\x6b\xc1\x23\x28\x05\xa7\x3b\xa8\xdb\xf0\x16\x39\x63\xe6\xdd\x56\x63\x75\x16\x9f\x89\x99\x57\x0d\x63\xb1\x70\xe6\x84\xc5\x11\x80\x1b\xbf\xb9\x07\x59\xdd\x11\xf0\xfe\xe0\x00\x34\xde\x15\x0b\xf9\xd4\xc8\x81\x89\x8a\xfe\xfa\x1f\x0c\x06\xc9\x76\xec\x81\x2d\xef\x24\xb0\x10\x2c\xd9\x18\x53\x8b\x66\xd4\xe3\x0e\x83\xea\xa8\x5e\xa9\xf9\x4f\x6c\x7a\xa6\xcc\x04\x59\x3a\x05\x33\x41\xb8\x4a\x28\x2d\x20\x73\x85\x24\x2f\x8f\xaf\x43\x88\xa6\x98\x75\xc6\xce\x92\x28\x84\xa1\x7c\xc5\xfa\x72\xf3\x77\x6e\xa0\x1e\x14\xbb\x51\xed\x54\x01\x0d\x30\x04\x50\x35\x3c\xa1\xda\x9f\xdf\x2d\xb5\x1d\xbb\xb3\x0c\xca\x24\xed\xc3\x77\xdb\x39\x50\x2a\xd9\xf8\x58\x41\xf3\x28\xde\xe3\x03\xa8\xd1\xe7\xf1\xa9\x18\xac\x1a\x07\x28\xfc\x80\x86\x15\x44\xc6\xb8\xfb\xc2\x19\xe6\xd3\x2e\x2a\xf9\x06\x06\x0f\xcc\xba\xef\xf2\x98\xda\xd2\x6b\x9b\xd1\x6b\x9d\xa8\x7d\x9c\x3f\xb6\x5b\x21\x13\xfd\x1c\xee\x85\xf8\x78\xbc\x74\xd8\x88\x07\x66\xce\x28\x01\xaa\x9b\xe5\x35\x09\x6f\x29\x55\x05\x1e\xd5\x3a\x2b\x00\x35\x4b\x75\xa9\xf6\xa8\x06\xdf\x00\x0b\x77\x97\x54\xa2\x01\x4f\x0d\x5b\xb1\xe8\x3e\x36\x8c\x91\x6b\xe6\x86\x30\x2e\xe0\x3d\x2e\x2a\xb9\xcc\xc0\x85\x35\xc1\x12\xca\xf3\x34\x22\xaf\x47\xaa\x1b\x8b\xa9\xde\x50\x95\xa4\x94\x6e\xfb\x97\x6d\x78\xa9\x4d\x9d\x32\xa8\xb8\x03\x19\x70\xb8\xbf\xda\x9b\x42\xaa\x5c\xd7\x27\xe6\xe6\x9c\xd5\x6f\xe8\xa4\x35\x63\xa4\x8f\x22\x59\xa7\x4b\x30\x6c\x54\x16\xcb\xe2\x58\x6d\xcd\x07\x22\xe4\xbb\xdd\x46\x56\x79\x56\xfc\xea\xae\x03\x7e\x93\xf0\x6a\x6c\x50\x98\x39\xf8\xfd\xa5\x50\x56\xde\xfc\x3c\x3e\xc3\xb1\xb4\xa5\xc6\xaa\xae\x32\xbc\x06\x40\x15\x87\x77\x31\xc3\x10\x98\xe1\x83\x9a\x70\x3e\x28\x5c\xb5\x69\x97\xc7\x49\xec\xcf\x01\xde\x6a\xf8\x90\x8e\xe9\x04\xe7\x45\xe0\x18\x79\x20\xbd\xa8\x4d\x55\x82\x19\xb9\x4b\xf5\x05\xda\x0a\x80\xa5\x02\x6f\x6e\x24\xa0\x4f\xc1\xda\xc7\x2f\x6b\xab\x36\xf9\x44\x76\xa2\xb9\x6b\x18\x3f\x1e\xf6\x3e\x8e\x5c\x17\x6c\x8b\x1b\xc6\xf3\x2f\x58\xb3\x58\x85\x4b\xc0\xf9\x42\x6c\x0b\x97\x7b\xa5\x2b\x45\x0b\x04\x96\x17\xc8\x01\x18\xa1\xad\x2b\x9e\xc2\x5f\xf8\x08\xe4\xdb\xb5\x4b\xc6\x1d\x42\xc8\xe0\xcc\x61\xbb\x79\xf6\xab\xc4\xc4\x28\x1d\xca\x01\x51\x6f\x7b\x03\x62\x6f\x29\xb5\x62\x3d\x49\x3c\xad\x24\xd3\x62\x0e\x3a\xb3\xec\x8c\x7d\xc5\x15\xec\x92\x22\x75\x53\x14\xea\xd1\x02\x9f\x1d\x40\x39\xe8\x2e\xce\x5e\x20\x20\x94\x63\x0b\xc8\x80\xf8\xba\x38\x66\x3f\x61\x77\x86\xc7\xee\x9e\x25\xb8\x86\x10\xa2\x06\xed\x64\x8b\x20\xbe\x61\xf4\xf3\x66\x5b\x22\x77\xb5\x63\xb9\xc8\xd3\x1a\x79\xc1\x58\xa0\xa0\xac\xc4\x2a\x93\x39\x38\xec\xda\xd1\x4e\xef\xcb\x0a\x28\xe6\x9d\x29\x85\xb5\x5c\xed\x87\xd3\xba\xb4\x48\xb9\xd2\x87\x21\xf2\x66\xb8\x95\xfa\xc2\x1e\xff\x2d\x39\x1c\x4c\x67\xd0\xd5\x91\x1b\x78\x77\x67\x02\xba\x28\xcc\xae\xc0\xae\x34\x44\xcd\x7f\x2f\x33\xbd\xce\x20\x62\x0a\x91\x9e\xf9\x4e\xdc\x67\x55\xbd\xb5\x54\x77\x36\xca\xad\x7f\x6b\xec\x95\xf5\x4b\xf6\x82\xbf\xdd\xab\xa9\x74\xd0\x78\xe5\x60\x92\x2d\x7c\x1c\xf1\x7e\x50\x17\x41\xa6\xd9\x7a\x79\x85\x22\x37\xce\x1e\x67\xa6\xc3\x6e\x58\x5e\x36\x00\x92\x6b\x34\x19\xda\x9f\x60\x18\xf5\xb2\xb9\x5a\x61\x65\xdc\x20\xb5\x1f\x73\x88\xf4\x0b\x79\xf8\xc3\x1c\xbb\x2f\xe2\x86\x31\xff\x51\x4c\x0c\x25\x4f\xca\x73\x45\x2f\xe2\x53\x44\x2d\x86\x99\xb6\x80\xbf\x27\x3c\x1f\xc0\x76\x9a\x0d\xb4\xe4\x95\x05\x8b\xb4\x92\x60\xf3\x80\xce\x0a\xa7\xfa\x8d\x8d\x45\xa2\x85\xe3\xd1\xeb\x87\x54\x79\x11\x7e\xca\x72\x40\x90\x02\x4f\x4b\xfd\x09\xbc\x85\x6b\x03\xa6\x6f\xa7\x60\x55\x18\x4d\x8e\x85\x7f\x37\x0e\x86\xbd\x04\x1b\xce\xb3\x77\x63\xe9\x36\x93\x05\xc5\xdc\x67\x65\x0e\xb5\x21\x50\xc0\x94\xdd\xa7\x8b\x1d\x05\xf4\x57\x78\x8a\x62\xa4\x8d\x2d\x12\x78\x63\x9d\xfe\x2a\x6d\x91\x50\x73\x3d\xd8\xcb\x47\x2c\x66\x8e\x25\x9c\xa6\xe4\x65\x7c\x0a\x00\xdd\x72\x85\xf3\x7e\xa8\xb8\x02\x30\xad\xac\xc2\x82\x92\x88\x95\x1b\x11\x7b\x38\xf0\xe5\xc3\x47\xc8\x20\xc9\xf5\x8d\xe9\x57\x92\x2b\xb0\xb5\x01\x2b\x32\xb8\x58\x8a\x92\xef\xa0\x9e\x24\x2c\x5a\x79\x7a\x9e\xd7\x26\x39\x29\x86\xf7\xad\xeb\x54\x1e\x1d\x3f\x36\x74\x60\xb3\xd0\x38\x99\xaa\x14\x18\xbb\x4d\x1d\xb5\x5d\x46\x5c\xd0\xc7\x16\x9d\x60\x3e\x95\xed\x64\x5b\x11\xff\x48\x9a\x7d\xb7\x3f\xb9\xcf\xab\x4e\x5a\x73\x30\x72\x19\x68\x66\x70\xda\x79\x98\xdb\xbd\xa5\x29\xb0\xd6\xce\x8c\x5b\x61\x6b\xc7\x5a\x6b\xc6\xda\x72\x6d\x7b\xee\x75\x75\xcb\x15\xc3\xaf\x2e\xf3\xab\xc9\x3c\x90\x1d\x06\xf1\x58\x88\x2a\x35\x65\xff\x4a\x49\xd0\x88\x11\xf3\xca\xc1\x1d\x1a\xde\x49\xc1\x07\x7c\x53\xc9\xfb\xac\xdc\x72\x24\x3b\xdd\x4d\xc3\x8d\x61\x27\xd7\xf8\x55\x4f\xd8\x6d\x5f\x54\x2f\x66\x76\xfc\xab\x58\x5c\x12\xdf\x16\x16\x20\x7e\xf4\x19\xb5\x86\x36\x19\xad\x7f\x39\x34\xdc\x28\x34\x5d\xaf\xb4\xb5\xfe\x9a\xb2\xf2\xcb\xde\xac\xc7\x4b\x4c\x93\xd1\x87\xde\xa8\x9f\x5c\xc2\x2f\xba\xff\x77\x56\x9b\xdb\x31\x3d\xb3\xa5\xc9\x9f\xc6\x37\xb6\x28\x19\x86\x8c\x46\xe5\x8f\xb2\xe4\x6f\x52\x96\x0c\x43\xfc\xbd\x6a\x92\xcd\x0e\x7c\x1d\x8b\xab\x4c\x2d\x64\x9e\xa7\x85\x2c\xb7\xc6\x11\x7a\x1d\x9f\xf2\x23\x00\x32\x2d\x9c\x81\x00\x8f\x92\x46\x9d\x97\x57\xbc\x49\x14\xad\xac\x56\xdf\x70\x3d\xdd\x52\xd1\xd7\x01\x47\x0e\x2d\x9f\x8f\x21\xe0\xb2\x26\xe8\x7c\x44\x10\x2d\x67\x01\xf4\xc8\x24\x46\x11\xf7\x8c\xc2\x55\xf0\xee\xd8\x3f\xd2\xb4\x4b\xc2\x4f\x56\x55\xcb\x8d\x22\x3f\x2d\x6b\x31\xf1\xab\x6d\xbe\xca\x40\xcb\xab\xc9\x60\x15\x76\xfc\x70\xa7\xf7\xf7\xd7\x45\x2c\x1a\x14\xac\xaf\x29\x6e\xa0\x3b\x15\x3a\xb3\x01\x70\x84\x88\x98\x38\x72\x24\xcd\xee\x1d\x22\x16\x46\x40\xbb\x1b\xd8\x59\x59\x39\xd9\x61\x23\x37\x6c\xaf\x55\xf3\x1d\x46\x4c\x21\xcd\x57\x56\xa9\xad\x93\xfa\xff\xd8\xfb\xb7\xe5\xb6\x91\xb4\x4d\x14\x3e\xf7\x55\x64\xf8\xc4\xd2\x1f\x10\xca\x92\xed\x72\x6d\x3a\x3a\x7e\x5a\xa2\x5d\xec\xa6\x49\x7d\x24\x55\x6e\xcf\x8a\x89\xaf\x41\x22\x29\xa1\x0d\x02\x6c\x24\x20\x15\xe7\x6a\xe6\x74\x6e\x63\x7d\x37\xb6\x22\xdf\x4d\xe6\x9b\x09\x50\xb6\x7b\x53\x35\xb3\x56\xe9\xa4\x5c\x12\x09\xe4\x3e\xdf\xcd\xf3\x3e\x0f\xa4\x82\x1a\x8c\xc0\xdc\xd5\x65\xce\xee\xba\x6f\xef\x8b\xd8\xbe\xb7\x46\xa2\x35\x53\x83\x1a\xb0\x46\xef\x74\x6e\xc7\x10\x04\x64\x06\xd9\xc4\xa3\xaa\x47\x82\x82\x71\x79\x54\xd1\x30\x77\x98\xed\xa3\xfd\x7f\x20\x5f\xd4\x1b\xe0\x4f\x49\x30\x61\x62\x4c\x4d\xdc\x61\x58\xa5\x68\x7c\x33\x5f\xfa\x18\xa0\x8c\x08\x73\x94\x8b\x1b\x0b\xed\xf9\xc5\xbe\xc6\xcd\xd8\xb1\x25\x38\x64\x10\x53\xa6\xd4\x9b\x2c\x30\x70\x7c\xc5\x0e\x66\x1f\xd8\x10\xf1\xb4\x9b\x9f\xbd\x91\xd1\x6a\x33\xc5\xae\x28\xb3\xa6\x3c\x50\xdc\x03\x96\x9f\xed\x07\x74\x29\xe3\x26\x46\xbd\x11\x76\x82\xef\xdb\x91\xae\x40\x0f\xc2\xd9\x7e\x05\xc3\xf8\x59\xbc\xa7\xf5\x5d\x6f\x9b\xba\xdb\x53\xfb\x57\x50\x48\x50\x75\xbf\x0c\x94\xa1\x1a\x2a\x0e\xed\x9b\xcd\x27\x4f\xa9\x70\x14\xe5\xe0\x86\x6a\x63\x3f\x57\x11\x0b\x31\xaa\x81\x22\xdd\x81\x18\x0b\xf8\x83\x5c\xa5\xf1\x95\x85\xa6\x1c\x9f\x19\x34\xaa\xfa\xbb\xfd\x58\x75\xc4\x17\x15\x98\xe2\x96\x04\x52\x3f\xeb\x9a\xb8\xa7\x0b\x3b\x72\xf0\x05\x48\x28\xe5\x28\x03\xf9\x5d\xbd\xea\x15\x2e\x02\xfe\x1d\x1f\xff\xff\x85\x9f\xf4\x9b\xd1\x6c\x35\x5d\x9c\x5d\x5f\xfd\xfb\x04\x80\x3e\x53\xff\x77\xfe\xfa\xc5\x79\x84\xff\xbf\x38\x3f\xff\x5d\xff\xe7\x57\xf9\x81\xd9\x57\x17\x7c\x86\x3f\xf9\xa0\xe5\x9d\x88\xd9\x14\x5f\xc9\x0b\xa7\x12\xac\x97\x33\x34\x13\xb7\x5d\x59\x1e\x38\x76\x8f\x99\x08\x95\xd7\xbb\xac\xa8\x52\x35\xaa\x24\x20\x07\xae\x98\xdd\x1e\x81\x44\x70\x67\x3d\xdc\x65\xad\xbe\xd7\x64\x5d\x40\x1d\x10\xdc\x61\x92\x52\x56\x96\x94\xc1\x1f\xb1\xbd\x2e\x02\x99\xeb\x30\x74\x06\x7f\x96\xf6\x24\x42\x77\x37\x75\xb3\xaf\x1b\x77\x09\xd2\xa7\x6a\x62\xac\x06\xec\x4b\x82\x65\x65\x18\xaf\x86\x9c\x0e\x93\xb3\xa4\x76\x50\x74\xb5\xa9\xbb\x26\xbb\xd5\xc8\x59\x8a\x40\xaf\x7b\x5d\xd6\x7b\x4f\xe2\xe2\x1b\x28\xc2\x23\x0f\xda\xf6\x35\x33\x9f\x08\x1c\x89\xd9\xb0\xc2\xd0\xd5\xd2\xd6\xaa\x33\x44\xee\x05\x8f\xb3\x8d\xa6\x67\xbc\x39\xa8\xa7\xf8\xf9\xa7\xf0\x1c\xd0\x4e\x41\x1b\x1d\x4b\xa8\x3a\xa3\xfd\x80\xf8\x5e\x62\xdc\x4e\x0e\x23\x74\x0d\xae\x4f\x2a\xf6\x72\x84\x59\x27\x7d\x1e\x40\x40\xc5\x68\xc0\xb0\x50\xca\x28\x89\x60\xe7\xbe\x42\x6e\xe3\xb9\xcd\xe1\x3e\xdd\x66\x9b\x16\x50\xf5\x01\x1e\x25\x90\x41\x12\x8f\x6f\x34\xe9\xce\xb6\x9b\x34\x75\x85\x61\x65\xf1\x89\xbb\x65\xef\x52\xc8\xf1\xd1\xe0\x40\x60\xbc\x2a\x36\xd6\x4e\xf2\x88\x51\xed\xa6\x70\x8f\x55\xa3\xa0\x58\xc7\x50\x2d\xa8\x35\x73\x5f\x2f\x5a\xc2\xbf\xd0\x18\x07\xec\x0c\x0f\xda\x4f\x94\x7d\xec\x9d\xce\xa0\x7c\x13\xb9\x93\xec\x28\xda\xee\x15\x95\xb2\x43\x28\xc6\x17\xea\x65\xcb\xda\xba\x2f\x86\x92\xea\xb7\x5d\x91\xeb\x12\x80\x2d\x76\x69\x7c\xd2\xfb\x16\x9e\x8f\xe6\x18\xf3\x4f\x42\x80\x4a\x43\x42\x00\x17\xab\xf5\xbc\x40\xff\x93\xdd\x1a\xfa\x30\x00\xdf\xc8\xf6\xa9\xeb\x52\xd2\x47\xe3\x2b\x0f\x84\xb6\xdd\xed\x4b\xdd\xea\x2f\xbf\xbd\xd3\x6f\xb6\x8d\xd6\x4d\x5b\x9b\x33\x57\x6a\x77\x76\xf1\xaf\xad\x02\xfb\xcc\xf9\xff\xe2\xe2\x55\xac\xff\xf6\xea\xf9\xb7\xcf\x7f\x3f\xff\x7f\x8d\x9f\x51\x75\x50\x6f\x1b\xad\x17\xab\xf9\x52\x2e\x69\x8f\x10\x76\x61\x71\x24\x5e\x85\x13\x93\xcc\x4f\x57\xa6\x8d\xf9\x36\xd4\x57\x22\x8c\x88\x7a\xb8\xab\x4b\x4d\x5f\xda\x67\x76\x9b\x6f\x80\x55\x02\x89\x78\x22\x39\xb0\x83\x88\x04\x7f\x61\xc9\xb0\xd1\x6a\x5f\x76\x26\xaa\x3e\xe5\x6b\x47\xef\x75\x95\x23\xa1\x45\xde\x95\x80\x1f\xcc\xf8\xdf\xae\x0e\xc5\x29\x62\xb9\x0c\x4b\xe3\xe3\xb2\x3c\x2a\xe9\x13\x5f\x23\xbf\x1a\xff\x65\x05\xd0\x12\x20\xc6\x2e\x01\xca\x71\x6e\xff\x3d\x2d\x2a\x40\xbc\xf9\xa1\xb4\x87\x9d\xc3\x64\xe6\x87\x2a\xdb\xd1\xff\x0a\xfa\x2f\x56\x00\x03\x66\xf5\x4f\x0c\x97\x65\x71\x2a\x90\x5e\xef\xb5\x46\xad\xee\x3a\xaa\x66\x3e\x9e\x7d\x78\x74\xd4\x40\x94\x06\x71\x82\x30\x45\x02\x68\x87\x24\x5f\x5f\x51\xfb\x6f\x5f\xe7\xfa\x7c\x0b\x81\x70\x3b\x95\xa2\xf6\xbf\xad\xa1\x4c\xdd\x7f\x0a\xd9\x25\x7b\x33\xe4\x8a\x07\xc0\xb5\xdc\x38\x2a\x5e\xb1\x38\x21\x22\x25\x2b\xa5\xdc\xdf\x46\xd7\x13\x2c\x81\xda\x66\x1b\x9d\x50\x10\xa6\x24\x4a\x4c\x5f\x14\x1c\xae\x2c\xa3\x87\x9a\x91\x30\x82\x6b\x88\xa9\x8a\x58\x8f\x08\x32\x1a\x4e\x15\x2d\x5f\x7e\x81\x28\x99\x8e\xd4\x2f\x1c\x3f\x56\xa4\xd1\x2b\x1f\x66\x97\xeb\x06\xed\xa5\x82\xeb\x7e\x1e\x9a\xa2\x6d\x75\x85\xbc\x3c\x3b\x07\xbe\xcb\x75\xcb\x9c\x6a\xd8\x3c\x27\x8e\x12\x7a\x94\x6e\xb0\x80\xbe\x1a\x93\x34\xa4\xfa\x84\x1b\xb0\x01\x12\x3b\x81\x4d\x08\x86\x58\x9a\x13\x51\xcd\x4f\x58\x4f\xce\x3c\x05\x4e\x5f\xfe\x94\x51\x60\x61\xf3\x1a\xeb\x88\x9a\x96\xab\x72\x56\x43\x63\x00\x58\x62\xe2\xcf\xaf\x94\x6d\x47\xa2\xcc\xe6\x4e\xdb\x99\x6a\x12\xf5\x49\x37\x15\xb2\xfc\x30\x7f\x2e\x99\x30\xee\x89\x43\xeb\x2c\xcb\x73\x65\x8a\xdb\x0a\xda\x4c\xd9\xb9\x7d\x53\xec\xb2\xe6\xd0\xaf\x24\x70\xfd\x47\xa6\x39\x44\x60\xe8\x06\xc5\x32\x5a\x4d\xdc\x3d\x00\x4e\xea\x57\x22\x64\x65\xa3\xb3\xfc\xa0\x28\xab\x6c\x4f\x42\x7f\xaa\x84\xa7\xc8\x05\xb0\x39\xf3\xcb\x18\xeb\xb1\xd6\x5e\xa5\x81\x8b\xee\x74\x5b\xb4\x04\x79\x83\x05\xd2\xa0\x50\x19\x41\x71\x62\xdb\x77\x1f\x86\x1f\x25\xbe\xbe\xe9\x2a\x4c\x2f\xd2\x93\x80\x63\xdf\xfe\xff\x4e\xb7\x4d\xb1\x49\x1c\x09\x24\xf6\x10\x75\x4e\xc4\xce\x86\x34\x7c\x56\xaa\x95\xfd\xce\xb8\xba\x2d\x2a\x6d\x8d\xa5\x69\x9b\xa7\xea\xa4\x15\xe5\xc1\x15\xc0\xe7\xbd\x78\x42\x51\xe5\x9d\x69\x1b\x0a\x61\x86\x44\xfe\xba\x32\x98\x10\x15\xc5\x7e\x9b\x4d\xd7\x64\x9b\xc3\xe9\xef\x21\x89\x7f\xfd\x4f\xc0\xff\xb3\x6c\xb3\x2a\xcf\x9a\xfc\xfd\xf4\x6c\xf6\xa7\x7f\x9d\x05\xf8\x39\xfe\x9f\xf3\x17\xaf\x63\xfb\xef\xe5\xf9\xf9\xef\xf6\xdf\xaf\xf1\xb3\x5c\x8d\x66\x57\xa3\xc5\x95\x7a\x3f\x55\xf3\xb7\x6a\x36\xfe\xa0\xfe\x34\x5e\x2c\xc7\x1f\xd5\xe5\xfc\xfa\x23\xa4\xa3\x88\x19\x28\x71\x02\xbe\xa3\xd9\x95\xa0\x48\x4e\x9f\x5c\x3a\xa3\xe0\x64\x73\xaa\x2e\x9e\x3f\x3f\x3f\xbb\x78\x7e\x7e\x6e\xaf\x15\x7b\x06\xbf\xd5\x50\xc1\x4d\x45\x6a\xcb\xf7\xd3\x6f\x66\x7f\x8a\xbe\x73\xfe\xfd\x77\xdf\x9f\xd9\x2f\xda\xef\x4c\x3b\x28\x8e\x5b\x31\x7a\xab\xd0\xe6\xc9\x75\x60\x50\x08\x0a\x1c\x8c\xf3\x26\xfd\x8b\x1a\x72\x58\xe4\x98\xc3\x39\xd3\x9a\x48\x8e\x97\x0f\x55\xae\x50\x0e\x78\x6f\xb5\x16\x18\x6f\x87\x81\x0e\xee\x71\x82\x70\xd6\xf7\xba\xa7\x1a\xa3\xb2\xfd\x5e\x67\x60\xfa\x22\x4d\xe6\xde\xa7\x32\xb2\x16\x6a\x19\x22\x73\x8a\xbf\x07\x1f\x29\x82\x73\x56\xfc\x89\xe8\xdf\xbd\x7a\x15\x52\x04\xd3\xab\x4c\xb7\x87\xca\x9a\xea\x36\xf6\xb8\xdd\x9b\x25\x92\x71\x60\x9c\x13\xf5\x46\x97\xa5\x9a\x66\x6b\x43\x60\x07\xfe\x14\x25\x69\xe4\xa5\x64\x3b\x97\xdf\xeb\xa6\x45\x41\x0e\x0e\xb5\x6f\x0a\xac\x70\x64\x40\xb3\x64\x2a\x14\xc1\xed\x20\x6a\x62\x87\x1c\x2c\xce\x2d\xdc\x3b\x64\xe8\x20\xc2\xc3\x8f\x44\xfa\x84\x1a\x23\xd4\xf8\x42\x75\xae\x28\x05\x17\xac\x82\x58\x3d\x75\x48\x5e\xeb\x51\x41\x2d\x08\x16\x54\xb5\xd2\xf7\x1e\x0d\x48\x0d\x5a\x6b\x10\x74\x21\x9a\x76\x88\xbe\x78\xad\x2b\xac\x9d\xa4\x1c\x4b\x5f\xe8\x8a\x07\x9a\xff\xf7\xe1\x2e\x6b\x4d\x0d\x81\xb1\xa8\x3a\x89\x39\xcf\x61\xf9\xe7\x04\xa8\x25\x61\xac\x44\xba\x5e\x59\xc5\x0c\x7d\xc0\x23\x80\x65\x6d\x89\xaa\xf4\x6d\x59\xdc\x32\xd9\x12\x47\x13\x9a\xb6\xa8\x3b\x43\x5f\x48\x9c\xbe\x8a\x9d\x92\x7a\xab\x86\x15\x4b\x5a\xaf\xb9\x2b\x85\x0a\x38\xab\xe2\x23\x67\xbf\xf5\xf1\xf6\xfb\xcf\x67\x7e\xd2\x6f\xe6\xbf\xb1\xfe\xff\xcb\xd7\xaf\x5e\xbd\xec\xe9\xff\xbf\x7e\xf5\xfb\xfd\xff\x6b\xfc\xcc\xaf\xc7\xb3\x48\xa0\xff\x89\xa4\xf9\x21\xc9\x7c\xcf\xb6\x22\x6a\xf0\xd2\x41\xa9\x70\x80\xa9\x49\x85\x70\x84\xb9\x1a\xc7\x08\xc1\x62\xe1\x54\xcd\x64\xff\x4a\x47\x55\x58\x01\xed\x79\x54\xc2\x17\x31\x85\x90\xac\x65\x1d\x90\x05\x9e\x73\x90\xea\x12\xc2\x59\x78\x99\x84\x35\xd5\x2c\xe4\x94\xf5\x95\xf7\xec\x13\xc2\x0f\x83\x86\xdd\x67\x94\xeb\x3d\x81\x08\x34\x19\xc5\x7f\xed\xfb\x65\x5b\x83\x86\xa9\x5e\xa3\x5c\x6e\xe3\xf1\x1e\x41\x2b\x83\x6f\x82\x68\x1c\x0a\xe1\x65\x46\x8b\xdb\x8e\xca\x6d\xe1\xed\x8d\xae\xb7\x82\xdf\x23\x55\x4f\xc7\xa5\xde\xb4\x4d\x5d\x15\x1b\x75\x25\xef\xe9\xf7\xda\x5e\x84\x85\xd9\xf9\x92\xfe\x1d\xff\x8a\x92\x2e\x65\xc9\xb2\x6f\x9e\x51\xdb\x4b\xd9\x63\xcc\x9d\x30\x21\x0c\x18\x60\xca\x20\xed\xdf\xea\x54\xa5\xa9\x28\x56\x90\x74\xd8\xe6\x01\xc6\xc3\xde\xad\xdc\x0e\x39\xae\x8c\xb8\x40\x9f\xd6\x63\x03\x96\x18\xad\xb0\x1f\x11\xdc\x19\xa9\x7a\x3a\x21\xd2\xeb\x2b\xca\x08\x34\x21\xc7\x8b\x4c\x57\xd1\x1a\xe6\xb2\x21\x2c\x13\x6f\x41\xc5\x29\x7a\x06\xf7\x5d\xbc\x95\xad\x36\xa7\x5e\xbb\x3e\xa8\xf1\x2f\x77\xc5\xba\x68\xd5\x48\xf0\x26\xa4\xea\xe9\x34\x6b\x6e\x75\xa3\x3e\xd4\xcd\x27\x3f\xd4\x0f\x75\xf3\x29\xa1\x48\x25\x85\x45\xa2\x9e\xdb\xbb\x37\x9a\x58\xbc\x9c\x37\xf4\xfa\x1e\x0f\x71\xa8\xf8\x40\xe1\x40\x41\x66\x90\x3a\xc1\x7e\x3f\x28\x85\xb7\x9a\xdd\xbe\x00\x4a\x03\xb3\xaf\x91\xab\x22\xcb\x73\x5d\xe5\xdd\x4e\xe5\xda\x6c\x9a\x62\x8d\x4b\xc1\x38\xe4\xe7\x4b\x24\xd4\x12\x4c\x05\x69\xc4\x75\x20\x6b\x77\x9d\xd8\x36\xd6\x19\x00\x99\x02\x18\xeb\x28\xe0\x89\xe4\x2c\xc8\xc2\x55\x37\xca\xb4\x4d\xb7\x69\x3b\x44\x43\x53\xf5\xc2\xe0\x16\x43\x20\x3b\xe2\x62\xa3\x63\x06\x85\x2e\xc3\x45\xe5\x08\x48\x89\x1a\xc0\xe8\x86\xec\x43\x62\x71\xcc\x82\x87\xa8\xc2\x88\x82\xc3\x51\xaa\x46\x5f\xd2\x13\x7b\x18\x6a\x2a\x86\xc2\x42\x40\x59\x07\xd8\xeb\xc2\x91\xe6\xfb\xf7\xbe\xc1\xf7\x56\xfa\x01\x1f\xe6\xc8\x58\xb2\x82\x06\xd7\x9e\x5a\xc3\x87\xc9\x67\x9f\x7f\x9e\x9e\x3f\x4f\xd5\xd3\xe0\x5b\x3c\x6f\x72\xd9\x3b\xe2\x2a\xa9\x6e\x01\x2b\xd2\x45\xdd\x83\x75\xf2\x35\xdb\xc6\xce\x45\x74\xaa\x83\x53\x64\x1f\x1c\xaa\xbc\xfb\xc2\x18\xd4\x59\xf0\x20\xaa\xa9\xd7\x8f\x04\xf6\x4f\x8a\xd0\x05\xd3\xdf\x63\xfe\xe8\x6d\x95\x73\x7b\xf7\x89\x66\xcb\x43\x64\xdf\xe8\xad\x6e\x9a\xa0\xea\x4c\x87\x2f\xd8\xfa\x12\xf9\x5d\xcc\x0a\x54\xb4\xb1\xa3\xe2\xb2\x04\x7e\x36\x13\x4c\x7d\xc0\x86\xf1\xba\x4d\x2e\x02\x2e\xf8\x71\x78\xc1\xda\x21\xdf\xb7\x74\xe5\x79\xf5\x3b\x0a\xfc\x51\xa0\x0d\x10\x85\xa6\xcd\xca\x52\x04\x0c\x95\x3f\x81\xa9\x32\xbf\x2c\x0c\x52\xe3\x04\x89\x7a\x50\xd2\x45\xcf\x06\xe3\x92\x85\x81\x6a\x00\xc2\xd2\x3f\xbe\x3b\xf1\xe8\x06\x9e\x83\x4f\x55\xfd\x60\xfd\x10\x97\xe0\x0c\x4f\xbd\x48\xc3\x14\xd4\xdb\x30\xcc\x8e\xc4\xb9\x72\x31\x6d\xb2\x0a\xa5\x62\x31\xaf\x02\x11\x4c\x4c\x64\x65\xcd\xe6\xae\xb8\x27\x9a\xb1\xc0\xaf\x0f\x54\xb5\x54\xae\xf9\x7b\x04\xa7\xcb\xf5\x19\x7e\x17\x68\x7a\x78\x81\x17\xd6\xf5\xcc\x01\x95\xe9\x65\x7d\xa1\x02\x4e\x6d\xee\xec\xf1\x2e\x69\x2b\x52\xa2\x2e\xe0\x43\x2f\xba\x76\x98\xa5\x9d\xae\x1f\xa1\xeb\x2e\x4b\x3a\x58\xb6\x70\x47\xfc\xc6\x9e\x91\x29\x54\xf7\x49\xc2\x65\x0f\xcf\xdf\x76\x70\x64\x06\x68\xb3\x60\x6b\x98\xae\x27\x1d\xf3\xad\x35\xf7\xde\xd6\x8d\x6c\x1c\x04\x0c\x6c\x5f\x9e\x3d\x0b\xeb\x79\xa9\xe9\x7c\x7b\xc1\x4a\xb3\xe6\x89\x19\xa0\x83\x2a\xcc\x23\x6c\x50\x1f\xeb\x0e\xdf\xfa\x45\x0c\x50\xcf\x9e\x3d\x46\x01\x25\x09\xa0\xfe\x6d\xf4\x4f\x54\x71\x1b\xd0\x32\x0d\x72\x3e\x35\xc8\x8d\xf2\x28\xf7\xd3\x17\xf0\x3c\x85\x24\x1f\x0e\x88\x09\xc5\x82\xbc\xc2\xa6\x5d\xdb\x14\x26\x8a\xf3\x4c\xaa\x0d\xd3\x4d\xcb\x1d\x13\x9d\x74\x17\x76\xd6\x57\x83\x26\x0f\xd4\xe8\x1f\xfb\xa3\x8c\x9b\x99\x3e\x6f\x45\x53\x1f\xb2\xb2\x3d\x9c\x6d\x1b\x1d\xb3\x58\x70\xa6\x2e\x62\x3d\xf0\x82\xad\xc3\xec\x03\x18\x0e\x8a\xaa\xfe\x49\x94\xfe\x31\xba\x82\x13\x61\x33\x92\x76\x94\x35\x50\x9b\x2c\xd7\xbb\xac\xf9\x74\xea\xa2\x8d\x8d\xc6\xd4\x92\xf6\x21\xc7\xbc\x30\xfb\x32\x3b\x24\x1c\x02\x81\x26\x3b\x05\xfa\x7e\xe2\x30\x3c\xf6\x4e\x06\xec\xb7\x53\x4a\x0e\x37\x2e\x28\x16\x19\xf8\x76\xfb\x1a\x77\x8d\x67\x4a\x98\x8e\x03\x9c\x03\xd8\x7f\xec\x96\xbd\xee\x1e\xa0\xb4\x5d\x37\x1a\xeb\xc9\xec\x9a\xca\x9d\x57\xc6\x9b\xb2\x3f\x9b\x09\x03\x50\x12\x9f\xd3\x4b\x9c\x76\x91\xb1\x67\xf6\xc9\x5f\xff\x8a\x99\x44\xd0\x80\x29\x4b\xd6\xaf\xaf\x9b\xf6\xd9\xb3\xd3\x2f\xed\x3d\xea\xfd\x70\x9e\xb7\x4f\x33\xe2\x24\x51\x69\xa6\x8a\x40\x12\x29\x50\x13\x43\x7a\x2a\x2e\x7a\xba\x69\x8b\xb2\xf8\x1f\x5f\x3e\x0b\xcc\x91\x49\xc5\xc5\xb7\xe0\xc0\x36\x41\x5b\x76\x19\xc0\x18\x82\x97\xf2\x6b\xb8\xfa\xba\xe7\xd7\x49\x55\x30\x41\xa9\x92\x06\xaa\x27\xb4\xb1\x7a\xaa\xe2\xbf\xef\xa9\x81\x3d\x15\x0e\x31\x17\xd4\xae\x0f\x03\x52\xd7\x83\x33\x4d\x56\x09\x18\x3f\x92\x30\x60\x9d\x99\xc2\x24\x12\xab\x11\xed\xc4\xac\xef\x8d\xfd\xdb\x77\x66\x10\xa4\xb0\x53\xf8\x2f\xd8\x96\x03\x71\x95\xdf\x70\x73\x7e\x45\x6b\x7e\x8d\x3d\x4a\x9a\x07\x41\x58\x64\xee\x2b\x5d\x7d\x91\xfb\x79\xaa\x46\x21\x45\x2e\x5f\xa4\x70\x41\x86\x2f\xf1\x30\x7e\x52\x85\xc7\x32\x56\xf1\x6b\x17\x25\x43\x3a\x9d\x2f\x71\xe3\xa5\xd3\xc0\x97\x87\xa7\xf8\x15\xfc\x56\x17\x7d\x33\x59\x18\x82\xc1\x9a\xa6\xf1\x93\x50\x2d\x80\x6f\x0d\x02\xb5\xbe\xd2\xc8\x74\xfe\x75\xcf\xcc\x74\xe5\xdc\x48\xea\xc1\xfc\x1c\x91\xde\x03\x3f\x07\x76\xa8\xee\xa1\x69\x64\xf7\xa0\xf2\xda\xf5\x21\x24\xd3\xc0\xed\x11\x92\x67\x50\xa7\x30\xb0\x34\x34\x4e\xb8\xde\xcb\x16\x94\x3d\x3c\x6d\x41\x40\x95\x6c\x17\xf8\xb1\xbe\x53\x08\xcc\x41\x61\xcc\x33\x3e\x3a\x7d\x3d\x58\x50\x5f\x0d\xcd\x75\x03\x51\x49\x2d\x15\x17\x9c\x61\xf1\x6e\x6c\x84\xff\x00\x3d\x39\x70\xba\x3d\xff\xd2\x2b\x41\x58\x93\xaa\x51\xa0\x94\xbb\x0d\xa2\x68\x10\x5b\x08\x82\x1e\x5f\xb3\x8e\x99\x59\x09\x82\xa8\xce\x47\x4a\x7c\x11\xb7\x1d\x6b\xb8\x14\xb4\xa7\xa7\x02\x7f\x96\xc8\xaf\x5d\x28\x11\xd1\x3a\xc0\xbb\x03\x8b\x3e\x98\x21\xf0\xb8\x3f\xb7\x3c\xfd\x99\x0f\xf1\xa4\x0c\x10\x2f\x79\x01\xa4\x42\x81\xbb\xeb\x27\xb0\x51\xf7\xf6\xef\x95\x8f\x76\x7e\x36\x6a\x2a\x48\xc0\x60\x50\xea\x1d\x21\xa3\x70\x0a\x07\xde\xe2\x86\xe5\x47\x96\xf6\x0e\x47\x0b\xda\xf0\xd9\xf7\x26\x38\xd6\x04\x59\x0e\xdd\xd1\xac\x55\x76\xd7\xb5\xaa\x7d\xd0\xe5\xbd\x56\x27\xe7\x17\xa7\x6a\x57\x57\xed\x9d\x11\x2a\x5f\x50\xd6\x5d\xb4\xac\x0f\x08\x78\xcd\x8d\x1d\x25\x31\x6f\xf2\x61\xa6\xf8\x45\x9d\x7c\x1b\x3d\x28\x1b\xaa\x35\xaa\xb7\xbd\xe8\x79\xb0\xa2\xee\x32\x83\x24\x97\x51\xc7\xb9\xc8\xdf\xef\x18\xdc\xc5\x8e\xc1\x04\xd9\x5a\x86\x3c\x11\x3a\x0f\x82\xd7\x70\x1c\xb3\xac\x43\x2a\xa8\x60\xaf\x17\x99\x0b\xd2\x59\x37\x0f\x5d\x29\x17\x27\xc0\xe5\x89\x35\x57\xee\x5d\x4b\xca\x60\xb3\xbd\x95\x0e\xb4\x87\x0b\xcb\x88\xa9\x3b\x33\xca\xce\x13\xb0\x7c\x34\x43\xed\x60\x01\x4b\xc7\x17\x54\x1d\x5d\x02\x3e\x3a\xcf\x41\xf6\xa0\xd7\x28\x53\x10\x8e\xac\xe0\x59\x4a\xd5\x95\xc6\x20\xd1\x60\x32\xa6\x47\x60\x56\x96\xe1\x65\xe1\x76\xfe\x21\xdc\xf9\x14\x6b\x82\xc5\x88\x71\x49\x3e\xb2\xf8\xb0\x42\xea\x32\x43\x07\x1d\x3e\x8a\x4e\x14\x58\x2d\xc1\x6b\x78\xee\x72\x92\xd1\x03\x54\x1c\x3c\x20\x1d\xba\x33\x3c\x6d\x5a\x84\x9a\xec\x0d\x0f\xc4\x14\x00\x0a\x7c\x9c\x33\x1a\x42\xb7\xa1\x03\xe1\x56\xc4\xfa\xd8\x0a\xf4\x24\x53\xdc\x61\x4f\x25\x75\x24\x97\xc0\xf1\x0b\xb1\x10\x12\xc7\xde\x42\x19\x0f\x0a\x94\x62\xb6\x7f\xf8\xcc\x62\x50\x64\x08\x7b\x29\xe4\xc9\xcd\xd7\x02\x46\x21\xa0\x67\x10\xd1\x90\xe1\x86\x38\x7c\x29\x28\x8f\xec\x0a\x17\x9e\xc0\x35\x7b\x02\xef\x81\x8c\xdf\xc4\x24\x7c\xd6\xe3\xb8\x06\x8f\xe3\x12\x7c\x0b\x57\xfc\x0a\x06\xac\x2c\x25\xb1\x17\x2c\x39\x27\x8c\xf4\xa8\x1e\xf3\x3a\x18\x64\x4e\xa7\x4a\x08\xc3\x04\xab\x8e\x9c\xbd\xa2\x35\xaa\x03\x1b\x50\xf0\xd6\x04\xf7\xc3\xa9\x10\x22\xf2\x0b\x09\x98\xb9\x60\xf9\x3a\x00\xc4\x60\x9d\x12\xec\xb4\xa2\xb5\x16\xfb\xd3\xe9\xf8\xdd\x68\xfa\x94\x46\x9b\x47\x9a\xf2\x95\xc8\xee\x41\x8b\x19\x3b\x4a\x11\x61\xff\x67\x80\xf4\x38\xe9\x0d\xc4\xf9\xf2\xd8\x78\x1c\x2d\x9c\x28\x76\xec\xf0\x92\xe1\xfd\xb6\x69\x5d\x41\x0d\x71\xf9\xc2\x11\xea\x07\x19\xcf\x69\xdc\x74\x9f\x34\xd6\xe8\x87\xc7\xa4\x2c\x31\x39\x62\x3f\x5c\x24\xe2\x20\xb6\x9b\x6d\x6f\xb7\x8d\xe3\xcf\xd2\x0a\xc6\x00\x07\x2e\x04\x43\xb9\x17\x8b\x63\xde\x7b\x40\x9e\x9f\xaa\xf5\x95\x2f\x58\xbb\x7f\xc2\xba\x0a\x78\xee\xc3\x29\x2a\x22\xb6\xbb\xac\x28\x51\x56\xd2\x60\xe9\x79\xa5\x1f\x0c\xd4\x22\x43\xb9\xb7\xf3\x48\x36\x59\x69\xd7\x0a\xb1\xa3\x20\xde\x94\xd8\x13\x1f\xee\x6a\x4f\xc7\xdf\x0b\xde\xc3\x04\x54\xfa\x41\x0c\xa5\xbb\xb7\x98\xaf\x29\x0d\xdd\xbd\x88\x84\x2a\xf4\xf7\x23\xd2\x29\x67\x01\x65\x06\x71\x4e\xa0\x2e\xb0\xef\x1a\xd3\x65\x48\x48\xed\x47\xff\x25\xc8\xb1\xa2\x0a\xab\x7c\xe4\x5a\x97\x85\xbe\x67\x48\x7d\x18\x2b\x0f\x7d\x11\xeb\x5f\x84\x7f\x77\xb5\x1d\x9c\x98\x27\x95\x96\x6f\xea\x26\x0c\x47\x64\x46\xae\x4e\x5f\x23\x08\x01\x0a\x25\x98\xe5\x36\x75\x75\xaf\x0f\xc7\xd3\x29\xd6\x0a\x55\x0b\x4e\xf8\x10\x27\x9b\x38\xcd\xf3\x0e\x3d\x2b\x4d\x60\x62\x3e\xf7\x7c\x5e\x88\xf3\xde\xb0\xcc\xfa\x97\x68\xe2\x61\x75\x2e\xc6\x8d\x87\x68\x1f\x10\xd8\xfb\x2a\x16\xb2\x05\x67\xe5\x80\xe1\x2e\x09\x8b\x82\xb3\xd2\x95\xf7\x33\xd7\x57\xa5\x5d\xf0\x57\x4e\x05\xf0\x3b\xb0\xa9\x9f\xe5\x39\xd6\x0f\xc0\x4d\x01\x19\x48\x39\xf4\xe4\x7d\xd3\x48\x04\x3b\xd3\xa7\x98\xed\x8b\xb1\xd0\xd0\xfa\x39\xfb\x9a\x98\x21\x41\xb5\xba\x65\xe6\x28\x77\x85\xc8\xc3\x33\x30\xa8\xe1\xc2\xee\x34\x66\xa6\x8c\x4f\xb8\x12\xed\x50\xef\xa4\xec\x3d\xd8\x19\x59\x6e\xdf\x66\xe0\xfc\xdd\x67\x00\xe4\x43\x59\x81\x03\xbc\xe8\x94\x06\x3b\x83\x1a\x4b\xf5\xc0\xd4\xb1\x9e\x35\xb1\xac\xeb\x4f\x30\x4d\xf8\x2c\x7a\x91\x77\xe9\x3c\x89\x02\xb8\x43\xbe\x96\x03\x92\x30\xd6\x00\xd1\x60\x09\x27\x0e\x49\x99\x30\x6a\x12\x90\x7a\x7a\x57\xd1\x85\x51\x16\xce\x0f\x12\xd4\x56\x5c\x45\x49\x13\xe8\x17\x42\xec\x3b\x0f\xf8\x6f\xc8\xd2\x00\x0e\x34\x73\xdb\xd5\x0f\x95\x13\x69\xe1\x78\x46\xa0\x7f\x72\xc4\xa6\x6d\x62\xa9\x64\xb1\x5b\xe0\x4c\x2d\x5a\x95\xad\x4d\x5d\x76\xad\x1d\xb8\x4d\xa9\xb3\x26\x8a\xd2\xfc\x23\xfd\x07\x35\x10\x48\xf3\x39\xf6\xae\xac\xac\x2b\x4f\xc0\xc6\x31\x4a\xc7\xbe\x42\x8f\x3c\x6a\x9d\x43\x91\x23\x38\xef\x72\x7d\x33\x86\xd2\xb7\xa1\xa8\x36\x5d\xd3\x3c\x66\x65\xf1\x9a\x90\xcf\xa1\xb5\x66\xba\x12\x82\x72\x5f\xde\x65\xf4\x1b\x81\x68\xc1\x76\xd7\x1f\x54\xdf\x46\xc1\xa0\x7a\x2b\x4d\x2f\x8a\x58\x19\xbf\x1e\x45\xb4\x32\x46\xad\x88\xef\x61\x9e\xd8\x2e\x0c\x62\x6a\xa5\xec\xf7\x8e\x57\x96\x3f\xf1\xcf\xcf\x5e\xa4\xaf\x84\x1a\xc0\x4e\x33\x93\x73\x64\x28\x27\xec\x43\x22\xc9\x19\x9b\x31\xb4\x33\xa1\x3a\x0d\x6c\x0d\x32\x85\x8f\x84\x83\x7a\x97\x5f\x21\x2b\x4f\x3f\xe3\x68\x07\x79\x6c\x3a\xa6\x9c\x77\x71\x57\x3f\x50\xf2\x9e\x8f\x57\xe8\x14\xd1\xef\xd0\xbd\x1b\xf0\x43\xca\x61\xa0\x20\x16\xf5\x86\x83\x0b\x9b\xba\x32\xfb\x62\xd3\x21\xf7\x19\x75\x3a\xff\x42\x83\x39\x39\x62\x2e\x83\xf1\x58\x82\x06\x2c\xaa\x57\x0f\x18\xcf\x9f\xb9\x10\x7a\x06\xf4\xd0\xfa\xb0\x1f\x1a\x32\xe3\xa3\x98\x1c\xb1\xdb\xba\x82\x36\xa6\x4b\xe4\x4a\x33\x6c\x1d\x9c\x85\xe4\x75\xe1\xdc\xb8\xfc\x3c\xe3\x4f\xe4\x3c\x85\xb0\x76\xd8\xd7\x58\xbc\xed\x89\x05\x63\xce\xc3\x38\xa8\x12\x20\xcc\xb9\x71\x7c\xa1\x0e\xf4\xcb\xeb\xaf\xb6\xad\xde\xed\x5b\xac\x13\xdc\x11\x51\x74\xc9\xb1\x08\x37\xb2\xcf\x4c\x24\xdd\x3e\xb4\x62\x1d\xb4\x86\x3e\x1a\xd0\xa3\x07\xa6\x07\x5f\xcb\x9f\x9f\x00\x1e\x70\x3f\x80\xdc\xbb\xaf\x38\x72\x71\xcc\xc8\x11\x80\x07\xf5\xa7\x41\x21\xa9\xe3\xd0\xf1\x0a\xa8\xfb\x47\x4e\xbe\xc1\xdb\xe0\x7f\xeb\xb3\xd8\xdd\x43\xf1\x51\xeb\xd4\x61\xfd\xc4\xe8\xde\xa4\x04\x84\xe9\xe1\xa9\xe7\x0c\x12\x97\x5c\x3a\x62\x35\xbe\x19\x24\x27\x60\x4b\x97\xea\x73\x89\x01\x54\x04\x7e\xdc\x36\x90\x95\x86\x70\x37\xbc\x4e\x65\xd2\x47\x5c\x02\x14\xcb\x08\x72\x42\x08\x21\xd8\xad\xfb\x5d\x90\x39\xa7\xaf\x43\xf2\x0d\xe5\xc7\xe4\x2b\x11\xc9\x56\x54\xb7\xa5\x6f\xbd\x9a\x54\x6c\x4b\x6d\x40\xae\x28\x5c\xd4\x44\x65\xdb\xbf\x91\x7a\x0b\xd7\x1f\xdc\xbc\xe9\x7b\x21\x03\x88\x16\x08\x2d\xaa\x4b\xe4\x52\xbb\x42\xeb\x72\xd9\x66\x40\xc3\x59\x37\x6a\xa1\x6f\xbb\xd2\xd7\x23\x3b\x43\x16\x62\xf4\x68\xc6\xda\x97\x50\xfe\x28\xa0\x64\xab\x0e\x31\x00\x66\x20\x5d\x40\x44\x62\x10\x56\xac\xb1\xfe\x51\x20\x67\x82\xc9\x20\xd3\xd7\xf8\xc6\x35\xae\x71\x68\x01\xf3\x80\x21\xd9\xef\x30\x41\x6c\xdc\x0a\xba\x13\x76\xd9\x2f\xc5\xae\xdb\x39\x3a\x36\xea\x9c\x27\xea\xbd\x2c\x5a\x2d\x9b\x46\xcd\x30\x61\x3b\x98\xbf\xba\xa9\x71\x65\xdb\x2d\x00\xa7\x8b\x47\x07\x21\x4d\x8b\x57\x2a\x70\x01\xca\x93\xcd\x69\x18\x03\xf2\x39\x23\x23\xf0\x9e\x58\x0c\x7c\x50\x19\x72\x5e\x23\xc3\xbf\xbc\xd1\xf9\x0a\x96\x97\x6e\xe4\xfe\x1f\x89\x20\xbc\xc4\x10\x67\xfc\x7d\x87\x67\x92\x91\x15\x33\xe0\xdc\xa5\x2c\x68\x11\x71\xdb\xd1\x68\x50\x36\x78\x68\xfe\x48\xa1\x71\xa8\x1b\xde\xb1\x2d\x0f\x14\x78\xe1\x2a\x5c\x11\x79\x81\xf2\x98\x1c\x15\xd5\xcd\x27\x60\x49\x85\x18\x2b\xc7\xac\xe1\xea\x00\x5c\x0f\x17\x39\xbf\xea\xe5\x09\x7b\x0e\xf1\x2a\xd8\x59\xf6\xc3\xcc\x3c\x28\x83\xac\xc3\x07\xaf\xf5\xc9\xb3\xb6\xcd\x36\x77\x64\x40\x0d\x38\xcb\xce\x27\x62\x73\xa7\xb7\x4f\xbf\x4d\x9d\x25\xab\xa4\x52\xbd\xf7\xd8\x01\x0c\x36\xd3\x0f\xc2\xe2\x0d\xa1\x47\x18\xb2\x26\x12\xb4\x46\xdf\x17\xc6\x4b\x1b\xf5\x79\xd8\xdc\xf3\xe9\x52\x2c\x76\xb8\x45\x8a\x9d\xfe\x67\x68\xd9\x44\x10\x09\xa6\x74\x4d\x64\x87\xd6\x89\xdb\xeb\x0a\xc3\x77\x69\xdd\xdc\xc2\xc4\x6e\x74\xe3\xc5\x21\x04\x4b\x6a\xaa\xc6\xb0\xe8\x6d\x53\xc3\x2e\xcf\xab\x4d\x74\x5a\xb8\x38\xd0\x3e\x12\x10\x09\xfc\xeb\xc8\xbe\x76\x56\x98\xf3\xfe\xcb\x87\xec\x60\x3c\x3f\x0c\xc2\x25\x80\xb9\x66\xc8\xe0\xce\x5c\x7e\x25\x15\x8f\x30\xb5\x70\x86\xed\xd7\xe9\x46\xee\x99\x92\xed\x17\x70\xc4\x45\xb3\x14\x50\xc6\xf5\x56\xe1\x10\x55\xdf\xf0\x52\x6d\x07\x08\xfb\x7c\x73\x44\x22\x35\x0a\xaa\xb8\x60\x4a\x3f\x78\xeb\x27\x0e\x12\x1a\x4d\x71\x8f\xd5\xf1\x74\x25\x93\x71\xe1\xf3\x95\x90\xca\xf0\x14\x27\x47\x32\xb6\x2e\x26\x67\x9d\x07\xc2\xdb\x06\xb5\x70\x0e\xae\x3c\x90\x0c\xe2\x51\x3b\x06\x8f\x4f\xd4\x89\x4f\x9c\xd8\xc9\x03\x4f\x30\xaf\x81\x67\xa8\xc9\x11\xbd\x81\x82\xfa\x45\xeb\x4e\x82\x80\xc3\xe4\xab\x50\xcc\x32\xbe\x6d\xaf\xac\x46\x43\x94\x09\xbc\x08\x36\x6d\x4d\xed\x8d\xf9\xfd\x5d\x93\x19\x6d\xd4\x5f\xff\x3a\xdf\xeb\xea\xd9\xb3\x84\xfe\x75\x3d\xa5\x7f\xdb\x7f\x28\x47\x50\x50\x6d\x81\x5f\xa9\x3c\x30\x41\x25\x3d\x80\xc9\x13\xa8\x5c\x55\x4a\x96\x1d\xe4\xab\xf9\xee\xf3\x7a\xd5\x6c\x5e\x0b\x9b\x1a\xbe\x11\xad\xce\xd2\xd1\x9b\x10\xe2\xfd\xb8\xd1\xad\x95\xed\x40\xc4\x8b\x92\xaa\x93\xb7\xc4\xfc\x4a\x97\xd7\xa3\x79\x9a\xa4\x0f\x63\x96\xf6\x2e\x3f\xe2\xb1\x18\x9d\x50\x60\xc0\xb7\xec\x8c\x2e\xef\xb5\x11\xd2\xdb\x94\xb4\x0b\x41\x2a\xd1\xad\x71\xea\xd6\xfc\x4b\x11\x47\x1d\x79\x08\xc0\xf1\x45\x49\xdf\x5c\x09\x9b\x00\x99\x72\xba\x4a\x8c\xac\xd0\xe5\x79\xa8\xe1\x24\x23\x93\xc3\xab\x3b\x6d\x41\xfd\xdc\xee\x69\xce\x93\x38\x47\x0d\x12\xec\xfb\x32\xdb\x68\x75\xe2\xe2\x7d\xa7\x09\xff\x19\x97\x38\x70\x91\x6a\x0d\xb9\xba\x8d\x16\x98\xb3\xff\xeb\xfc\xbf\xab\x91\xe8\x81\x89\x73\xac\xe2\xa3\x17\xff\x9d\x58\x44\x7c\x5d\x05\x92\x92\x59\xf3\x63\x7e\x3d\xfd\xcf\xf3\xff\x7c\x9e\xae\xfe\xb2\x4a\x44\xfc\x83\xf9\xe3\x4a\x7a\x20\xd6\x4b\x95\xc5\xe6\x10\x17\x2a\xf3\x9b\x26\x15\xd6\x57\x61\x69\xed\xb6\x2c\x30\x93\x9b\x17\x66\x5f\x1b\x22\xe1\x61\x42\x3c\x18\x2a\x6e\x86\x43\xe1\xb5\x31\xc5\x51\x59\x3f\xe8\xe6\x0c\x6f\x2d\x8d\xa0\x3c\xbc\xea\xe8\x2a\x80\xeb\x6b\xaf\x1b\xa3\xf3\x41\x1f\x40\xab\xbb\xe2\xd6\x1e\xb6\xc1\x23\xa0\xc1\xaf\x53\x51\xaa\xaf\xe6\x6f\x99\x68\xfc\x23\xfc\xf5\x72\xfe\xf3\x78\x31\xbe\x52\x97\xf3\xab\x71\x40\x87\x0e\xa4\xd3\xc8\xa9\xce\x55\xff\x5f\xc2\x90\xfe\xf1\x31\x46\xf4\xf1\x95\xe0\x44\x4f\x3e\x47\x8a\x2e\x08\xd1\x57\x3f\x8d\x56\x40\x76\x1d\x37\xf7\xed\x62\x0c\xcc\xd9\x57\xe3\xb7\xe3\xcb\xd5\x52\x12\xa2\x4f\xc7\x89\x7a\x3b\x59\x1d\xe5\x41\xb7\x4d\x11\x84\xea\x93\xd9\xbb\x14\x09\xb9\x67\xab\xc9\x62\xac\x16\x93\xe5\x9f\xd5\x68\xa9\x56\x73\xf8\xed\x7f\xdc\x8c\x80\x61\x7b\x34\xbb\x52\xd7\xe3\xc5\xdb\xf9\xe2\xfd\x08\x18\xc1\xdf\x0e\xb6\xcb\xf6\x47\x7d\x9c\xdf\xa4\x6a\xf9\xd3\xfc\x66\x7a\x05\x43\x12\x7c\xc8\x0e\xf4\x98\xda\x3d\xf9\x79\xcc\x24\xe2\x8b\xf1\xf2\x1a\x48\xd4\x3f\xce\x6f\xd4\xc9\x6c\x8e\xdd\x9e\xcc\x26\x48\x94\x3e\xfe\x79\x3c\x9d\x5f\xdb\x79\x44\xf2\x75\x60\x23\x47\x42\xf3\xc9\x9b\x9b\xd5\x7c\x71\xaa\x46\xcb\xe5\xcd\xfb\x31\xb5\x6a\xb9\xe2\xf9\x98\x8d\x2f\xc7\xcb\xe5\x68\xf1\x51\x2d\xc7\x8b\x9f\x27\x97\x30\xec\x8b\xf1\xf5\x68\xb2\x40\x42\xf6\xc5\xc2\xb6\x64\x3e\x4b\x71\xd2\x87\xd7\x0c\x10\xb7\xaf\x26\xab\x9b\xd5\x78\x69\x17\x83\x9d\x54\xe4\x70\xb7\x03\x8c\xa3\xe1\x57\x4c\xaa\x66\x73\xe4\x41\x7f\xdb\x1f\x80\xc9\x52\x8d\x6e\x56\x3f\xcd\x17\x93\xff\x26\x79\xce\x99\xe7\x5f\xac\x3f\xc9\x34\xa1\x94\xfa\x2e\x55\xab\xf1\xe2\xfd\x64\x06\xeb\x84\x37\xe5\x77\xe9\xb9\xd4\x14\x41\x9a\xe9\x37\x20\x99\x20\xcf\xb8\x30\x5a\xd5\xd3\x3e\xf2\x04\xbd\xb1\xe6\x41\xd7\xd6\x3b\x47\xe8\x45\x51\xd5\x41\x51\x10\xd8\x94\xf6\x39\x05\xe2\x4c\xdc\x87\x9c\xe6\x07\x09\x39\x10\x1f\xce\x8b\xe7\x2a\xb7\x5b\xbc\xde\x0e\xe8\x7b\xd8\x26\xe2\xc7\x53\xd0\x46\xf1\x58\x58\x33\x14\x57\xe4\xe8\x9f\xfd\x36\xa6\xc7\xa5\x7e\x1f\x5e\x36\xa4\x84\xe1\xa2\x52\x41\x89\xa9\x0c\x90\x01\x4b\xb6\x71\xee\x65\x42\xc7\x4e\xd1\xa0\xda\xb8\x0e\x71\x46\x45\x45\x7a\x48\x6a\xad\x0f\x35\x8d\xee\x23\xcf\x0f\x5b\xe3\x67\xf1\x22\x90\x86\x51\x37\x76\x1a\xa7\x4e\x5c\x22\xf5\xaa\x1d\xf6\x36\x0e\x45\x3b\xd6\x07\xa1\x96\x91\x39\x18\x6a\xb5\x6d\x0a\x56\x6d\xc4\xb4\xfa\x09\x00\xa3\x21\x2c\x9d\xeb\x4d\x99\x41\xfe\xe9\x6f\x5d\x7e\x8b\xf8\x32\xd4\x1f\x3a\x75\x85\x4b\xc3\x11\xb7\x10\x5b\x7c\x34\x0e\x16\x84\xc0\xe8\x81\x90\xa6\x87\x05\x64\xef\x25\x8c\xbe\x6c\x38\xbf\xe2\x8a\xc7\x80\xb5\x5d\x3d\x05\x1a\xf4\x4d\xb1\xcf\xaa\xf6\xe9\xa9\x75\x88\xf5\x2d\x07\xee\x23\x64\x36\x3c\x48\x7c\xfc\x99\x19\x84\xd3\x0e\x63\x5b\xdc\x38\x71\xa1\x60\x1b\x4a\x8b\x00\x5d\x58\x59\xc6\x1b\x86\x81\xd6\xe2\xb5\xac\x35\x12\xe0\x3a\x0d\xe8\xa4\x92\x03\x78\x91\x5e\x0c\x2f\x87\x04\xb7\xed\xb7\xb4\x25\xc8\x76\x02\x9b\x2d\x78\x81\xdb\x96\xfb\xa6\x66\x4a\xf8\xf2\x90\xa8\xae\x02\xca\xb7\x62\xcb\x9b\x8b\x9f\x84\x98\x82\x06\x75\x6d\x14\xc8\x77\xc1\xa3\x6d\x3b\x11\x0d\xf8\x83\x3a\x29\x4e\x29\x56\x5a\x54\xc0\x40\x42\xc1\xfb\x7d\x76\x08\xde\x9e\xa9\x5d\xd7\x76\x58\xfa\x6c\x3f\x0e\x0e\x8a\x10\x18\x20\x1c\x3e\x47\xa8\x1a\xb5\xcf\x0c\xa2\x16\x09\x11\xdb\xa1\xed\x30\x5c\x5c\x1e\x8f\x26\x56\x14\x15\x05\x56\x86\xe4\x4d\xf6\xc0\x86\xba\x5b\xf7\xb8\xa8\xe3\xc0\xd6\x31\x34\x35\x2f\xc2\xf8\x45\xb0\xb5\xa2\x61\x73\x03\x95\x84\xea\x44\xdc\x45\x80\x62\x66\x07\xdc\x36\x42\x1c\xd5\x9e\x3f\xc0\x93\x16\x0c\x54\x8e\xb3\x2b\x46\x97\x0c\x99\x3d\x31\xfd\x53\xdc\xb0\xd7\x35\x72\x72\x78\x00\x88\x89\xb0\xbf\x12\xbf\x7a\x11\x86\xa7\xba\x38\xed\x1d\xe5\x59\xd1\x04\x00\x41\x1c\x18\x5e\x3d\x24\xd2\x44\x16\xa9\xce\x11\x89\x11\x41\x3f\x90\x89\x97\x19\x68\xee\xb2\x26\xc7\x7f\x21\xe1\x2f\x8c\xad\xf0\x93\xbf\x6c\x0f\x1f\x03\xa8\x7d\x6e\x13\x47\x43\x46\x63\x34\xb4\x87\xfb\xe3\x86\x7d\xc9\xed\xb8\xc1\x3f\x1b\x2f\x9d\x85\x07\x3f\x5c\x2a\xa1\x34\x10\x9e\x71\x0d\x04\x93\xa9\x36\xc1\xde\x43\x75\x09\x10\x3b\x07\x2a\x87\xc1\xb8\xcb\x72\xfa\xd4\x23\xac\x0b\x72\xbd\xba\x2b\xe3\x85\xbb\x15\xf0\xf8\x7f\xf4\xec\xe7\xe5\x1f\xec\x68\x79\xa8\xfe\x1b\x8e\x51\xca\x71\xc2\x83\xdd\x8a\x6e\xb4\xa9\xcb\x7b\x9d\x7b\x58\x84\xd7\x12\x86\x04\x8a\x6e\xdb\x12\x5a\x7e\xea\x41\xd2\x2d\x70\x14\xc0\xd5\xc7\xe2\x14\x03\x3d\xf5\x1b\x88\xe6\x1e\x23\x14\x6e\xfb\xde\x67\x65\xa7\x23\xaf\xf9\xf1\x23\x7d\x60\x1b\xd1\x16\x72\xe1\x35\x94\x7e\x03\x9e\x69\x12\x0b\xb4\x3b\x1d\xa4\x4e\x77\xc4\x03\x75\xa7\x55\xb6\x83\xbf\xd4\x8d\x6f\x04\x8e\xd3\x81\x45\x2c\x23\xb7\xee\x3b\xc4\x18\xe2\x7e\xbc\xa7\xa0\xab\xb4\x2b\xa2\xa6\x7d\x87\x4d\xfb\xce\xee\x6e\xc4\x45\xd9\xf6\xe9\x2a\x47\x48\x89\x0b\x32\xb0\xb2\x82\x09\xac\x01\x5e\x93\xac\x22\xd2\x68\xa3\xcb\x52\x37\xe6\x94\x2c\x2b\x9f\x78\xbf\xcf\xca\x22\x17\x0a\x5b\x94\xb0\x63\x2e\x27\xff\x24\x61\x54\xfa\x79\x14\x1d\x08\xcd\x32\xf1\x17\x18\x82\xef\x53\xa9\x81\x24\x35\x8d\xe0\xcf\x68\x26\xcf\xe6\xea\x72\xb2\xb8\xbc\x79\xbf\x5c\x59\xaf\x64\x09\x6e\x8a\xfb\x13\x86\xe0\x51\x15\xc9\x0b\x21\x1d\x97\x39\x3a\x4d\x84\x44\x92\x94\x3c\x4a\x48\x0d\x6a\xd0\x25\x49\x86\x1d\x92\x44\x39\x9d\xa8\x25\xff\xce\x76\x43\xfa\x02\xee\x33\xcb\x9b\x6b\xeb\x1b\x2e\xd8\x61\x60\x3d\x23\xf0\xde\xc6\xcb\x44\xbd\x19\x43\xff\xa7\x63\xeb\x97\x59\x17\x29\xf0\x83\xae\xc7\x8b\xe5\x7c\xe6\x94\xa9\xbc\x22\x95\x53\xa1\x92\xd2\x54\x47\x65\xa8\xd8\x5b\xf9\x69\x64\x87\x00\x34\xa3\x1e\x75\x54\xf9\x7b\xf6\xbd\xd3\xf9\x12\x1e\xf0\x6e\x3e\xbf\xfa\x30\x99\x4e\x13\xf5\x61\xbe\xf8\xb3\x5a\xae\xe6\xd7\xd7\xa3\x77\x63\x3b\xb2\xef\xaf\x6f\xec\x43\xdf\x8e\x26\xd3\x9b\x05\xb8\xa1\xef\x47\xd3\xb7\x37\xb3\x4b\x7c\x1a\x35\xde\xce\xa0\x1d\x6b\x1e\xd0\xf7\xd6\xb3\x0d\x5a\x89\x2f\xb3\xa3\xc2\xca\x50\x6e\xac\x3e\x4a\xd9\xae\x37\x63\xfb\xd7\x99\x75\x59\xbf\x4c\x35\x8a\x7d\xb8\xc1\x55\x47\x4f\xb6\x9e\xe9\xe8\xfa\x7a\xfa\xd1\x4e\x44\x28\x0a\x76\x35\x1e\xad\x7e\xb2\xcd\xc3\xe9\x18\x4d\xd5\x64\xf6\xa7\x9b\x05\xf8\xb6\x37\xd3\x95\x5d\x6b\x6f\x17\xf3\xf7\xa2\xb5\xcf\x96\x52\x64\x8b\x3c\xee\xf1\x5f\x56\xe3\x19\xbe\x64\x72\x09\x53\x3e\x1d\x7d\xb0\x6e\xf3\x4f\x93\x37\x93\xd5\x12\xbf\xee\x1b\x99\xaa\xe5\xfc\xfd\x58\xfd\xe9\x66\x31\x59\x5e\x4d\x2e\x51\x3a\xed\x6a\x8e\x0d\x9d\x4e\xe7\x1f\xe8\xa1\x97\xd3\x9b\x25\xf4\x69\x11\xf5\xd0\x2f\x8d\xa3\x2b\x23\x51\xcb\x39\xc6\x22\xfc\x73\xec\x3c\x89\x07\xbd\x1f\x7d\x0c\xc7\xe6\xe3\xfc\x06\x36\xea\xf9\xf3\x54\xdd\xa4\xcb\x54\xbd\xb3\x0b\x7f\xf6\xde\xf6\x6d\x6c\x77\xe9\x72\xbc\x58\x3a\xb6\xda\x1e\xd4\x46\xfd\xf5\xaf\x82\x9f\xbf\x68\xf5\x2e\x79\xf6\x0c\x69\x68\x32\x34\x84\x15\xd7\xc2\x63\x6c\xf1\xe5\x77\xea\x32\x7d\x9b\x2e\x52\x7b\x48\x3f\x3f\x57\x27\xf3\x4d\x9b\xaa\xf3\xef\xbf\x7f\x05\xf2\x51\x95\x21\x9e\xda\x7a\x1b\x3e\xba\xc7\xd9\x61\x5f\x53\xe5\x9f\xf9\x50\x44\x33\x88\x4d\x13\x69\xfd\xac\xf1\x54\x81\xbe\x65\xe7\x17\xe9\xc5\xf9\x85\x3a\x59\xea\x3d\xb7\x0d\x10\xb1\xb6\x6d\x08\x68\x6e\xef\xfa\x1f\xb7\xad\x11\xbd\xbb\x78\x9d\xbe\xbe\x78\x7e\x71\x76\xee\x08\xa1\xdd\xaf\x5e\xaa\x93\x3f\x75\x95\xe6\x5e\xdb\xe3\x15\x87\x1e\x02\xe2\x70\xd1\x8c\x2b\x90\x12\xb6\xc7\xfc\x06\xa5\x6f\x07\x52\xf0\x15\xb0\x4d\xd7\x66\x00\x4e\x82\x0e\x3e\xce\xec\x79\xaa\xde\x4f\x96\x97\xe3\xe9\x74\x34\x1b\xcf\x6f\x70\x36\x81\x05\x8f\x19\xf3\x32\xa2\xb8\xc5\x70\x6c\x79\x50\xa5\xde\xb6\x6a\x5d\x66\xd5\xa7\x74\x38\x62\xc9\x5f\x85\xcc\x3a\x84\x56\x29\xa2\xf8\x59\xea\x1d\x6f\x83\x9e\x5f\xa4\x10\x4f\x9a\xcf\xdc\x56\xb7\xfb\x13\x62\x29\xcb\xf4\xc9\xd8\x65\x34\x36\x10\xde\x27\xe8\x25\x31\x71\xc4\x48\xdf\x2d\x66\x40\xa3\x68\x87\xc8\xe2\x26\x0e\x36\xe4\x64\xd3\x28\x4d\xcf\xbc\x86\x44\x2c\x78\xbc\xba\x82\x18\x07\xc1\xbf\x91\x10\x7d\xaf\x15\xde\xcf\xf7\x24\xa1\x8e\x26\x25\xfe\x20\x34\xbb\x27\xc6\x9e\x60\x66\x7d\x09\x96\xaf\x65\x42\xf3\xe8\x5e\x57\x1d\xb1\x97\x3b\xec\x37\xb8\x9e\xd8\x14\x60\x66\x80\x1a\x24\x68\x0a\x66\x51\x6b\x12\xd9\x26\x34\xeb\x36\xdb\x58\xd3\x21\x52\xa0\x03\x2e\x6b\x4c\x67\x83\xa1\x4c\xd1\x59\x4a\xeb\x0a\xbc\x06\x7c\xa6\x1f\x45\x88\xd4\xf7\xb0\x54\x59\xff\xbd\x2b\x10\x12\x03\x95\xca\xa9\x1a\xff\x05\x0e\x46\x35\x4a\x9f\xac\x20\x04\x5f\xd3\x40\x09\x94\xb4\xf9\x92\xb5\x94\x1c\xe7\x71\x22\x8b\xca\x97\x42\x7c\xb6\xf8\x25\xed\xa5\x16\x40\x5d\xd8\xda\x4e\xcc\x3a\x5d\x6a\xee\x3a\x52\x4d\x67\xf8\xec\xf4\x09\xf7\xe8\xcd\xb1\x1e\xbd\xf9\x3f\xad\x47\xbf\x35\xd7\xdf\xd0\x4f\xfa\xcd\xdb\xac\x68\xfe\x8d\xe4\x8f\x9f\xe7\x7f\x7e\xfe\xe2\xdb\x8b\x1e\xff\xe3\xf9\xc5\xef\xfc\x8f\xbf\xc6\x8f\x9d\x7d\x97\x0d\xfc\x83\x67\x65\x9e\x78\x02\xf6\x3f\x3e\xb9\x31\xd9\xad\xf3\x18\xed\x79\x06\xd4\xee\x5e\x3e\x32\xa6\x45\x06\x4e\x77\xd3\x36\x58\x99\x0c\xde\x2e\xe9\x98\xbb\x8c\x39\x3c\x25\x71\x89\x66\xc1\x1a\x04\xff\xdf\x19\x2a\x94\x72\x6f\x83\x6a\x1f\x90\x21\xd9\xc6\x6f\x48\x9f\xf8\x1c\xc1\x0f\x60\xe8\x59\xab\x7b\xa9\x46\x8b\x71\x2f\x41\xf5\xbf\xe7\x2e\xfc\xed\x7e\xd2\x6f\xa6\xbf\x31\xff\xeb\xc5\xeb\x17\x2f\xfb\xfb\xff\xdb\xdf\xf5\xdf\x7e\x95\x1f\x22\xb0\x8e\x24\x62\x24\x03\xac\xdd\x4f\xa3\x4b\xeb\xb8\x8e\x66\x1f\xad\xfb\x76\xbd\x98\xbf\x5b\x8c\xde\x0f\xe6\x8b\xc7\x90\x9c\x5b\xba\x54\x60\xc8\x2c\xab\x4e\x9e\x3a\x85\xee\xa7\xa7\x29\x78\xba\x37\xcb\x31\x64\x22\x17\xf3\xab\x9b\xcb\x15\xf9\x66\x43\xb2\xc9\xfc\x5a\x99\x83\x5c\x8c\x2f\x27\xd7\x93\xf1\x6c\xf5\x6c\x69\xdb\x38\xbe\x5e\xf9\xb4\xac\x94\x03\x4f\x99\xc7\x76\xfc\x16\x22\x17\xf3\xd9\xd2\xfe\xc6\xb3\xca\x7a\x3a\x59\xce\xaa\x64\xa9\xb3\x2a\x28\xdb\xff\x87\xf9\xe2\xdd\x68\x36\xf9\x6f\xe0\xea\xfd\x51\x9d\x3c\x55\x7f\x98\x7f\x98\x8d\x17\x7f\x54\x4f\x4f\xd1\x8a\x74\x88\x90\x6b\x94\x57\x4b\x04\xf3\xcb\xba\xf7\x3c\x1d\x31\xfc\x24\x3e\x72\x5c\xa4\xae\x2a\x9a\xc2\x7e\x03\x4f\xb4\x9f\x2b\x52\xc7\xf5\x10\x7f\xf4\xc7\x20\xee\x48\x4f\x63\x71\xe0\x23\xdf\xe1\xea\xbf\x96\xd2\x2e\x90\xf6\x69\xb4\x18\x28\x9d\x3f\xfd\x42\x12\x5c\xa5\xd4\x48\xc9\x01\xb6\xa7\x78\xef\x41\x61\x22\x0d\x7c\xae\x93\xe2\x54\x15\x80\xf9\xb5\x9e\x93\xb5\xe2\xf2\xb8\x99\x43\x04\x3f\xa4\x13\xe3\x35\xfa\xa9\xc4\xbe\xae\x7a\x9f\x7d\x66\x82\xb2\x2b\xc8\xaf\xc4\x09\x13\xfd\xcb\x1e\xb8\xec\xcb\x03\xd2\xb6\x57\x2d\x12\xec\x66\x9b\x4d\xdd\xe4\xbe\x24\xc2\xf9\x40\x97\x09\x57\x9a\x65\x9b\x56\x37\xc2\x7b\x91\x45\xee\xbd\x09\xc8\x4c\x30\x48\xb2\x38\x14\xfe\x4e\xb0\x29\x57\xc2\x73\x6c\xe6\x20\x40\x49\x69\x2c\x3b\xeb\x1a\x94\x61\xb4\x63\x8f\x04\xbe\x46\x76\xdb\x05\xa3\x0b\xb2\xbb\xff\x8d\x0a\xa6\xfd\x05\xcd\xcf\x75\x28\xc1\x02\xeb\xd5\x7a\x21\x54\x31\x86\x9c\xf8\xc9\x3d\xf0\x0e\xef\x6f\x1a\x04\x7a\xa6\x58\x21\x43\x04\xd2\xbc\xab\x50\xa2\x88\x85\xa1\xa5\x75\x70\x27\x07\x0d\x34\x01\x83\x75\x16\x8e\x8c\x7c\xdb\x95\x8f\xcb\x7a\xaa\xdd\x85\x50\x4c\xca\x5a\x31\x38\x26\xdc\x79\x3d\xaa\xce\xe0\xaf\x4c\x32\x9b\x35\xad\x8a\x78\x96\xed\x9b\xe9\x64\xcd\xd5\x35\x92\x3e\xe1\xeb\x39\x7e\x4f\x35\xee\x38\xb6\xe8\xd6\xc5\x5b\xc3\xa7\xf6\x99\xcf\xa8\x10\xf9\x06\xe7\xb0\x10\x2b\xbf\xc9\x4a\xc7\x82\x1a\x8c\x0d\x54\x94\x90\x52\x5b\x25\x04\x97\xa2\x69\x97\x4d\x8f\x4f\x35\x49\x76\xea\xaa\x85\x23\x30\x9e\x97\xde\x20\x15\xab\x83\xd3\x37\xf4\xaa\xc6\x99\xa0\xd9\x5d\x1f\xdc\xbc\xcb\xba\xb1\x40\x91\xae\x46\xf2\xb2\x0d\xf3\x40\x44\x22\x17\x05\x24\x13\x64\xcb\x07\x1a\x1c\x77\x06\x1e\x14\xee\xb8\x81\x99\x14\xcf\x74\xab\x45\xb0\x16\xdb\x21\x15\x45\xe3\x66\x70\x03\x85\x0a\xde\x21\xc5\xab\x98\x68\xc3\xb4\x8c\xef\xac\xbd\x6a\xaf\x32\x10\x61\x59\xfa\x6b\x69\x29\x49\xdc\xe2\x12\x03\xf1\x8a\xf8\x7e\x89\x18\xe4\xfc\xb2\xcf\x42\xba\xb8\xe4\x18\xad\x9c\x90\x2b\x29\x7d\x25\x83\x60\x71\xdb\x37\xf6\xd4\xd1\x43\xfb\x3f\x21\x71\x90\xf2\x20\x38\xde\xf8\x37\x8e\xec\x4d\x44\x43\x00\xbc\xed\xb9\xdf\x82\xe3\x99\x16\x5a\x7c\xac\xf3\x12\x48\xe8\xcb\x00\xee\x0f\x5b\x02\x47\xb8\x24\x6e\x80\x30\x8e\x58\x57\xb6\x1d\xa9\xbf\xb2\x7f\xbb\xb1\xa6\x93\x81\xfb\x8f\xab\x28\x3e\x45\x3c\x05\x1c\x70\x27\x19\x5d\x96\x89\x0a\x28\xdf\x12\xe2\x7b\xf3\xf1\x2a\xc0\xd4\x3a\xce\xf5\xaf\x1b\xd7\x2f\x19\x3c\x88\x68\x46\xad\x17\x59\xb2\xf0\x54\xc3\xec\x17\xc0\xd5\x11\xe2\xcc\xaa\x00\x7d\xf6\xfb\xb8\x95\x31\xb7\x81\x03\x75\xf1\xc6\x2b\xb6\x21\x29\x74\xef\x21\x05\x5b\x17\x74\x76\x06\x5d\xc6\xb4\x2c\x73\x78\x0f\xb5\x01\x88\x70\x28\xde\x2d\xdb\x8b\x98\xdd\x0d\x85\x1d\xe9\xd9\xf1\xcc\xfd\x23\xc3\x44\xf0\x69\x1c\x25\xb8\xe8\xdd\xed\x28\x59\xeb\x18\x1b\x4e\x16\x43\xdc\xee\x44\x55\x98\x85\x84\x2b\x3b\x3a\xfa\xb6\xaa\x17\xff\x35\x00\xe8\x67\xe4\x82\x02\x10\x2e\x04\xbe\x4a\xee\x92\x67\x2d\xa3\x8d\xb3\x49\xc5\x8a\xf7\x55\x30\xc6\x31\xa7\xdd\x41\xc4\xbe\xb7\x69\x68\xb7\x04\x79\x69\x22\x1e\x08\xdb\x19\x47\xe2\x6d\x9f\x54\x66\x4c\xd7\x58\xc3\xcc\x30\x02\xce\x85\xf2\xa2\x02\x49\x0f\x6e\xe7\xb5\xe2\xca\x51\xf9\x42\x25\x64\x0a\xb3\x57\xd6\x24\xad\xf3\x08\xed\x25\xe5\xb2\xa5\xb5\x32\xc0\xe2\x29\xa4\x8b\x82\xaa\xca\xb6\x16\x43\x06\xf5\x28\xf8\xa9\x35\x24\x37\x5a\xee\x44\x60\x0b\xb9\xd0\x77\x90\xfe\xb7\xb7\xfe\xa3\xed\x14\x84\xc5\x29\x8a\x7d\x3a\xf9\x50\x60\x67\xf4\x84\xd3\x02\x67\x63\x37\x57\x0f\x2b\xe0\x26\x9e\x0e\x40\xdf\x03\x2e\x3e\x35\xa6\xdb\xd9\x3d\x52\x97\x3a\x0e\x64\xc3\x01\x05\xb0\x48\xdf\xb1\x47\x1b\x5e\x69\x9d\xeb\xdc\xdd\xf3\xc0\x0b\xad\x7f\xc9\x76\xfb\x52\xe3\x2f\x03\x4e\xd3\x68\x6b\x41\x10\x8a\xa0\xf1\x6d\x6d\x2f\xdd\xfa\x41\x5a\x7e\x75\x5c\x39\xe9\x0c\x3b\xac\x3d\x5c\xc8\x42\xe4\x5e\x47\x38\x8b\x04\xeb\x8a\x5f\xb9\xd6\xdb\x5a\x1a\xdb\x3c\xa2\x91\x89\x95\x0f\xac\x92\x88\x13\x86\x37\x81\x67\x9c\x29\xda\x98\x80\xc5\xdf\xcd\xbe\x4e\x3a\xde\x38\xfe\x20\x0f\x78\x5a\xfa\xd7\x7a\xbf\x70\xda\xdd\x75\x29\x91\x62\x2e\xc6\xff\x71\x33\x59\x80\x77\xcd\xb6\xc9\x48\xb0\x23\x50\x0d\x98\xaf\x41\x1a\x1e\xde\x40\xbf\x63\xc8\x52\x82\x22\x1d\xe4\x9c\xb5\x6b\x77\xd8\x01\x09\xe2\x8f\x02\x16\x79\x9e\x22\x69\xfe\x0e\xab\xe8\xa2\xaa\xcc\x21\xe1\x5c\xf9\xea\x1f\xfd\x83\x2e\x52\xa6\x66\x70\xed\x36\xb1\x17\x25\x2f\x46\x2f\xaf\x95\x55\xb7\x9c\x09\xb3\xce\x7b\x48\x62\x19\xf4\x52\x0c\xdd\xb3\x23\x3d\x45\xb1\x4c\x59\x21\x89\x72\x2f\x82\xf8\xd2\x39\xff\x41\x9c\xe0\x05\xb4\x5f\x36\x18\xc7\xf4\x0b\xde\x49\x37\x61\xef\xf7\x62\x98\xd1\x2c\x75\x30\xb0\xf2\x20\x4e\xb9\x80\xce\x24\x36\x75\x63\xf9\xb6\x70\x46\x12\x27\x3a\x4a\xb4\xb5\x65\x01\xdb\xdf\xf3\x9c\x0a\xe5\xb6\x26\x9e\xca\xa2\x2d\x35\x91\xaa\x54\x67\xf2\x80\x4c\xe4\xe3\x1e\x7d\xc6\x23\x5a\x70\x54\x0b\x2a\x22\x20\xc4\x50\xff\x63\x30\x2c\xeb\x70\x58\x10\x6a\xa4\xbf\x64\x54\xfc\xcd\x20\x72\xa8\xb2\xf3\x4c\x64\xef\x29\xed\x85\xe4\xdc\x06\x44\x6b\xb2\x92\x47\xb4\xaf\x3a\xc7\x06\x8e\x51\x65\x6d\x5a\x56\x91\x8b\x96\x0d\x5e\xe5\xc0\x9c\x67\x7c\x9c\x7e\xef\x91\xe1\x47\x18\x0d\x84\x8b\x17\x72\x1a\xf4\x6d\x36\x70\x47\x99\xfb\x26\xb8\xe4\xe0\x18\xe7\x43\xf2\x0d\x1d\x92\xc1\xf9\x22\x79\x87\xc2\x3a\x25\x52\x7c\x70\x74\x20\x9e\x85\x88\x62\x70\xb4\x4d\x78\x11\x0b\x35\xca\xcb\x53\xf5\x87\x8f\xe3\xd1\xe2\x8f\x49\x1c\xf0\x73\x16\xb4\x41\x34\xfe\x02\xcf\xd9\x85\x36\xba\xb9\xf7\x9c\x5f\x97\x00\x58\x63\xcb\x71\xc0\x35\xc0\x76\xa3\xaa\xd0\xc1\xc9\x1b\x07\xfe\x34\xc4\xc2\xfa\xde\x7b\xe8\xe0\xd8\x99\xdf\x20\x57\xa7\xe1\x18\xd5\xb1\x10\x94\xfd\x88\x88\x39\x61\x10\xca\xc5\xa4\x4c\x14\x41\xc1\x40\x97\xda\x65\x55\xa5\xc9\x58\x12\xcc\x69\x70\x77\x1a\x59\x27\xba\xf0\x3c\x48\xf6\xa6\xe2\xae\xf5\x3b\x14\xdb\xa2\x54\x44\xcb\x8d\x2f\x8c\x2f\x57\x28\x5a\x47\xd2\x2b\x78\xe1\xd6\x0e\x76\xca\x94\x02\x12\x1b\x25\xa2\xc6\x50\xdd\xe4\xa1\x2b\x01\xb4\x4f\x86\xc2\xa0\x5a\x16\x48\x5d\xa1\x02\x38\x2b\xaa\xf0\x7a\x17\xaa\x92\x0e\x5b\xcd\x70\x42\x93\xa8\x75\x67\x0a\x38\x0f\xec\x6a\xad\x74\xe3\x8b\xe6\xcb\xe2\x93\x4e\xd5\x87\x3b\x54\xe2\x09\x53\xc6\x52\xf0\x78\x9b\x6d\xec\x7b\x98\xde\x4c\xc0\x6d\x08\x28\x1e\x18\x23\xf6\x7f\xe4\x1e\x78\xb8\xab\xbd\xf4\x46\x7c\xaf\xca\x87\x11\xe1\x83\xa7\x09\xa6\xda\x3d\x64\xa5\x92\xd3\x4d\x7b\x9a\x0d\x62\xaa\x95\xdd\xd7\x2d\x1d\x20\xe1\xc9\x14\x3a\x0a\x2b\x3b\x53\xd6\xea\x21\x83\x4c\x36\xf5\x1f\x6a\x26\x1d\x53\xf2\x39\x27\x4f\xc5\xbc\xca\x80\xde\x69\x40\x79\x82\xe8\x0a\xbd\xd5\x55\xce\xbb\x85\xe8\x4f\xfa\x24\x27\x27\x4f\x27\xf4\xd7\x42\xe7\xf2\x2f\x4f\x7d\x19\x08\x98\xeb\xb5\x31\xf6\xe8\x74\x90\x16\x38\x5d\x4d\x6b\xd4\xc9\xa6\x06\xbb\x15\xcf\xf9\xa7\x53\xf8\xa0\xfd\x36\xa9\x69\x22\x1f\x03\x5c\x89\x89\x2a\xb3\x07\xd3\x15\x64\x54\xe3\x61\x87\xaa\x2a\x54\x7b\x12\x18\xfd\x81\x51\xcb\x8d\x41\x68\xc2\x60\x93\x23\x1e\x04\x70\x52\x9d\x17\x9a\x6d\xc8\x01\x20\x45\x55\x23\xdc\xfd\xa1\x31\x1d\xd2\xfe\x04\x21\xdd\x01\x41\xd7\x2f\x9d\x52\xf4\x7c\x25\xb5\x13\xdb\x98\x8c\xcc\xf0\x95\xc2\xe8\xea\x42\x61\x31\x99\x13\x8d\xc2\xb1\x0d\x08\x96\xa0\x42\x05\x9d\x06\xe4\xf2\xd0\xb7\x24\x87\xd4\x77\x26\xa4\x29\x00\x27\xb5\xab\xb1\xfe\x7b\x97\x95\xa4\x25\x7c\x74\x70\x91\xe9\x23\x3b\xf5\x5c\x97\x82\x7d\xf8\xf8\x18\x72\xc5\x03\x8f\x36\xf4\x06\x4f\xf1\xf5\x29\x39\x23\x8f\x3c\xc1\xeb\x35\xb1\xec\x8f\xed\x4c\xd6\x0a\x56\xa6\xa3\xef\xc6\x33\x03\x36\x02\x15\xbe\x41\x29\x00\x91\x3f\x78\x98\xb9\xaa\xf4\x6d\x4d\xc8\x72\xc3\xba\x2e\x47\x06\x21\x3b\x90\xe5\x53\xec\xe1\xfe\xa9\x3c\x9f\x0f\xc1\xec\x5b\x67\xae\xeb\x5f\xf6\x0e\xd0\x1d\x78\x6c\xe1\xe9\xb0\x23\x16\x57\x7f\x9b\x7f\xf9\x11\x71\x4d\xbf\xf9\x8b\x6d\x76\xd6\x86\x03\x60\xa8\xfe\xe1\xc8\x08\x41\xf1\x00\x99\x25\xc3\x63\x7f\x07\x7c\xd4\x9f\xb4\x09\xa4\x6e\x79\x2f\xc3\xbd\xb6\xb5\x07\xbf\xb0\x24\x79\x74\xdb\xda\xb7\x2d\x21\x2c\x61\xff\x21\x52\xd9\xb9\xa0\xe0\xc5\x23\x7b\xb2\xef\x80\x82\x11\x95\xaa\x1b\xef\x3e\xd1\x4e\x4a\x1e\x5b\x1a\x48\xaf\x08\x88\x76\x7f\x52\x72\x8b\xc4\x39\x13\x98\xa6\xa2\x67\x5f\xd8\x1d\x47\x44\x67\x27\xb1\x6b\x5a\x76\xc3\x4d\x3f\x28\x83\xc5\x56\x52\x0b\x59\xb0\x46\x3d\xda\x17\x30\xa9\xec\x97\xb1\x51\xf4\x75\xa6\x5c\x99\xcd\x1d\xfc\xc3\xfe\x86\x4a\x4c\x47\x4b\x2e\x4c\x9e\x7e\x54\xcb\x31\x94\x0a\xaf\x7e\x52\x93\x59\x94\x3b\x4e\x82\xec\xb3\x4c\x7a\x7f\x49\x45\xf4\x04\xb1\xda\x97\xf3\xd9\x15\xe6\x9d\x1f\xab\x90\x16\xf5\xd1\x9f\x43\x9d\xdb\x47\x3c\xf6\x8a\xd5\x64\x35\x1d\x27\xb2\xc4\x99\x3a\xe3\x4b\xa4\x09\xfe\xbd\x50\x6f\x27\xab\x99\x7d\xfb\xb1\x5a\x69\xb2\xbd\x7d\xb4\xa4\x30\x2c\x04\xd2\x03\x7b\xc6\x05\x1f\x9e\x99\x17\xcc\x24\x50\xaf\x86\xac\x87\xe4\xaa\x8a\x22\x23\x78\x4a\x51\xe8\x08\xab\x0e\xcd\x27\x23\x95\xee\xdc\x45\x44\xc1\x2a\x3d\x0c\x12\x1d\xcc\xb7\xac\x3b\x50\x5b\x47\xa6\x23\x9f\x5a\xa6\x77\xb8\x1b\x1d\x18\x09\xb0\x39\xba\x69\x6a\x6b\xec\xc5\x6c\x78\x82\xa1\xc4\x5e\xe9\x6c\x17\x90\xe0\x23\xab\x75\xe7\x59\x9b\x25\xfc\x2c\xb8\xc1\xec\x06\xd8\x7b\x57\xb4\xab\xb2\x40\x77\x81\x84\x0f\x9a\xce\x91\x25\xe2\x69\xef\x24\x47\xbe\x8d\x6b\xfa\x1d\x02\xff\x1f\x5a\xde\x33\x5a\x84\x0e\x4c\xa1\x66\x54\x85\x20\x0a\x39\x96\xb2\xa6\xc0\xfe\x2d\x44\xfd\x63\x89\x07\x96\x5b\xf8\xc2\x0b\x59\x6f\xe1\x8a\x30\xc6\x7f\x19\xbf\xbf\x9e\x8e\x16\x1f\x1f\xa9\xc1\x10\x85\x29\xfd\xc5\xaf\xa6\xf3\xe5\xca\xee\xc2\xb7\x93\xd5\xf2\x34\x51\x3f\xcd\x3f\x8c\x7f\x1e\x2f\xd4\xe5\xe8\x66\x39\xbe\x02\x48\xfe\x1c\xcb\xe9\xb1\xe8\x25\x18\x21\x5f\x01\x33\x99\x89\x3a\x17\xeb\x38\x5c\xae\xe4\xc7\xe6\x8f\xd5\xc8\x04\x75\x31\xa7\x6a\xb4\x98\x2c\xed\x07\xa8\x8a\xff\xc3\xe8\xa3\xb2\x4d\x26\xe0\xca\x0d\xb2\x0d\x3c\x86\x69\x99\x2f\xa8\x3e\xc1\x7a\x32\xbe\x62\x1e\x33\x7f\x98\x09\x94\x55\xf2\xbe\xe6\x63\x74\xf5\xf3\x64\xf9\x65\x75\x1d\xc4\x06\xf1\x6e\x3c\x1b\x2f\x46\x53\x22\x56\x0b\xfc\xf9\x81\xb8\x14\x38\x2b\x0e\xdd\xda\x55\xba\xda\xd6\xcd\x46\x0b\xfa\xcf\x70\x13\x80\xdf\x26\xb2\x15\x58\x13\x6e\xf7\x17\x3c\x84\xd6\xb7\x7b\x8a\x53\x1a\x41\x0c\xf6\x2e\x2b\xaa\xdc\xeb\x20\x1c\xcd\xb6\xc1\x0d\x43\x22\x37\x2c\xe4\x43\x25\xd4\x51\x4d\xa9\xf5\x08\xda\x9a\xbc\x08\xdf\x51\x57\xb6\x06\xde\xca\xce\x9f\x02\xf6\xe8\x12\x94\x6c\x81\x74\x10\x31\xe2\x05\x0f\xc2\xa1\x01\xea\x44\x3f\x32\xcc\x5a\x27\x0e\xcc\xca\xb4\x05\x52\xb7\xb9\xb8\xb4\xab\x72\x75\x1e\x46\x98\xef\x8f\x9c\x4e\x57\xd5\x18\xf2\x22\x39\x47\xf6\x44\x92\xad\x6e\x9a\xda\x98\x33\xb4\xc5\x20\xac\xd5\xd9\x13\xc5\xb1\xca\x67\xec\x82\x9c\x8a\xea\xd0\x30\x60\x1e\x14\x04\xf6\xc2\x36\x2c\xc8\x11\x65\x79\xe2\xd5\x43\x0c\xee\xbe\xb0\x36\xac\x0f\xa5\xc0\x62\x2b\xe8\x85\xb7\x45\xa9\xf3\x28\x80\x52\x7c\xfd\x48\x7a\x34\xe9\x3f\x36\x2c\x51\x4d\x68\x60\x8e\x62\xbc\x46\x94\x0d\x06\xb9\xb7\xc8\x19\x12\x64\x8e\x6e\xa6\xa0\xa4\x02\xb3\x69\xa7\xa2\x60\x34\x1c\xd0\x67\xdc\x3f\x20\x06\x87\x49\xea\x7d\x20\xaa\xe7\x0d\x95\x94\xa0\x4c\xf7\x1f\x9d\x00\xbb\x80\x21\xc4\xd5\x7f\xdb\x17\x4d\x34\xc2\xb7\xb6\x59\x51\x9a\x47\x28\x1a\x99\x5e\x93\x37\x7a\x2f\x86\x1b\xc5\x12\x01\xf2\xc1\x61\x09\xc7\xa7\x61\xdf\xd2\x35\xc4\x36\x2e\xca\x5c\xa9\x3c\x1b\x62\xc1\x3b\x96\x3b\xe8\x73\x6c\x10\x61\x79\xe5\x2f\x77\x70\x09\xb2\xaf\xe8\xbd\xeb\x77\x22\x13\xfd\x2e\x08\xb1\x41\x0d\xe2\x98\xa0\x73\xc0\x75\xce\xac\x5d\x65\xd7\x71\xa0\x9d\x46\x6a\x47\x70\xb2\x78\x5a\x71\xd9\x38\xe9\x4c\x0f\xb6\x90\xdd\xbe\xa1\xcd\xed\x9b\x1c\x73\x16\x73\xb3\x70\x76\x1d\x1f\x1d\x82\x2b\x3c\x71\x07\xe3\x76\x24\xe7\x5f\x40\xf2\x27\xf6\x20\x70\x01\x22\xbf\x46\x7f\x82\x8f\xb1\xff\x89\x87\xf1\x88\xf9\x2f\x7d\x15\x25\x20\xfa\xb5\xdc\x2f\xd1\xae\x20\xbd\x7c\x2a\x69\xf8\x22\x01\x34\x13\x02\x42\x8e\x36\x8b\x68\x64\x30\x13\x8f\x48\x46\x2e\x2b\x8a\x8e\x37\xd6\x4b\x7a\xb4\x97\x85\xf1\xac\x7b\x49\xcf\x19\x07\x31\xfd\x47\x92\x6c\xa2\xa3\xbd\x5c\xfa\xa9\xe0\x01\x14\x4d\x18\x62\xf1\xe3\x89\x3e\xce\xdd\x17\x24\x0a\x99\x98\x33\x33\x9c\xc8\x29\x91\x89\x33\xa0\x00\x35\xea\x02\x54\x2c\xaa\x1c\x8f\x2c\x2a\xc9\x91\xab\x92\x40\x55\x55\x2d\x52\xd8\x31\x0f\xce\x70\xb0\x87\x72\xf2\x72\xbc\x86\xdd\x03\x56\xf6\x75\x0d\x05\xbe\x1b\x48\x12\x6d\x08\x5e\xa6\x4d\x5b\xef\xf7\xba\x8c\x13\xe8\x9e\x15\x25\xcc\x2d\xc0\x31\xe5\x3b\x1e\x9e\xd2\x03\x69\x92\x46\xe6\x11\x56\x3d\x33\x2c\xa6\x00\xb6\x57\x95\xa3\x43\x6d\x49\x0d\xe9\x0f\xcb\xd5\x68\x35\xfe\xa3\x0b\x42\x0f\x8f\x8a\xfc\xea\x4d\x05\x4e\xd0\x12\x73\x3c\xf5\x56\x8d\x76\xba\x29\x36\x19\xcc\x3f\x06\x1d\x51\x2c\xd4\xf4\xf6\x5c\x83\x97\xaa\x0c\x5d\x0e\xf7\x0e\xb4\x12\x60\x05\xd9\x05\x75\x00\xfa\x3f\xa7\x36\x86\x72\x52\x76\xa2\xb8\xe4\xb1\x36\xbc\xf1\xf1\xfd\x0f\x19\x4c\x3f\x08\xba\x3b\x95\x91\x4c\xfd\xad\xb3\x66\x19\xdc\x1f\x14\x80\xc2\x40\x01\x8a\xbf\x38\xca\xa0\xdf\xeb\x3d\x1e\xfd\x49\xbf\x99\x4f\xaf\x46\xd7\x67\xe7\xe9\xc5\xbf\xad\x02\xe4\xf1\xfa\x8f\xf3\x8b\x17\xaf\x5f\x46\xf5\x1f\x17\xcf\x5f\xbf\xfc\xbd\xfe\xe3\xd7\xf8\x59\x11\x19\xa6\x5d\x04\x51\x15\xc8\x13\x5f\x05\x72\x91\xa8\x73\xb5\xd4\xfb\x56\x43\x7d\xed\xf9\xf7\xdf\x7f\xf7\xc4\xe7\x4c\xed\xff\x26\x2a\x78\xd2\xdb\xba\xab\x72\xe2\xec\x1a\xca\x95\xaa\x59\xdd\xea\x1f\x7a\xb5\x94\xa4\xc0\xe6\x79\x3a\x9f\x8e\x9a\xd6\x5e\xe8\xae\x51\x4f\x49\x17\xc9\x5d\xc8\x1e\xb9\xac\x1b\x87\xea\x05\x13\x6f\x9a\x55\xb7\x5d\x76\x8b\x20\x27\xa6\xef\xdf\x68\x83\x57\xe6\x2f\x85\xa1\x98\xa2\xab\xd9\x74\xe8\x17\x47\x6b\xd9\xe8\x2c\x4f\x9f\x5c\x2f\xc6\xa3\xf7\x6f\xa6\xe3\x27\x2b\x3a\x52\x89\x86\x04\x74\xe8\x59\x7f\xb3\x30\x4c\x14\xce\x89\x3c\x67\xca\x4a\x5b\x20\x53\xd7\xd9\xe6\x53\x76\xeb\xd4\x55\xa1\x50\x39\x27\x0f\xd5\x79\x1b\x7e\x70\x7f\xaa\xcb\x1c\xa8\xe8\x0b\xa2\x35\x05\xca\x72\xa3\x77\xeb\x12\x22\x51\xf6\xe4\xe4\x31\x62\xed\x7c\x7b\x55\x50\xd8\xdf\x0b\x67\xd2\x81\xbf\xc7\xd7\x03\x57\x5c\x09\x66\x13\x47\xdf\x20\xa5\x19\x7d\x2c\xbc\xe7\x7b\x36\x2c\x99\x19\xf4\x59\xcc\x22\xd6\x8d\x3e\xab\x9b\x33\xa0\xe2\xda\x74\xa6\xad\x77\xd6\x7f\xde\x66\xe6\x0e\xae\xd1\x7d\xd9\xc5\xd6\x83\xf5\xab\x85\xe1\x1e\xe0\xec\xd3\x27\x57\x4e\xe9\xdf\xfc\xf0\xe4\x29\xbd\xeb\x29\x12\xa5\x19\x8f\x17\xc5\xf4\x1b\xda\x4e\xc8\x3f\x2a\x57\x89\x43\x78\x86\xc3\x8a\xa1\x04\x0f\x12\xf6\x94\xca\x43\x0f\x64\xda\x61\x66\x1c\x68\xf5\x2f\x70\xb1\xca\x06\xa7\x4f\x9e\x2e\xdb\xac\xca\xb3\x26\xe7\x2a\x2a\xd9\x56\xe2\xda\x77\x23\xb6\x65\x24\x17\xc0\x1f\x40\xd1\x85\xb8\x88\x89\x15\xc9\x84\xbf\x1d\xaa\x40\x81\x32\x49\x6b\x19\x1a\x9f\x62\x0f\xbb\x99\x3e\x79\x1a\xff\xea\xa9\x5d\xb0\x0f\x77\xb5\x75\x26\xa0\xbc\x32\xdb\x69\x51\x47\xcd\x1f\x06\x9f\x8c\xfe\xc7\x38\x6a\x7f\x5a\x1c\xe9\x93\xa7\x1f\xeb\x0e\x9e\x74\xa8\x3b\x70\xd4\x0f\x75\xf7\x0c\x2e\xfb\xa2\x02\x31\xbb\x6c\x5d\x77\x88\x4d\x83\xf4\x57\x13\xc7\x7c\x0b\xc3\x63\x91\x3e\x79\xba\xf0\x6b\x80\xbf\xb1\xd5\x9a\x5a\x9a\xb5\xd0\x54\xa0\x6f\xce\x2a\xf5\xb7\xce\x40\xde\x8d\x0a\xff\xa1\x0a\x1e\x31\x3b\x79\x91\x41\x08\x37\x71\xc2\x61\x00\xd6\x05\x05\x28\x93\xa0\x7f\x51\x6f\xd5\x5e\xd7\x7b\x10\xa5\xbb\x07\x1e\x26\xc2\x8c\x5b\x9b\x37\x55\x27\x1f\xeb\x0e\x8d\x1c\x9c\x96\x00\x3a\xc8\x6f\x2e\x04\xcf\x5a\xbc\xaa\xd6\x5d\x4b\xfc\x11\x0e\xce\xbc\xc7\x2e\x6f\xea\xdd\xae\x03\xc5\xa1\xac\x55\x25\xaa\x52\x19\x48\xbe\x37\x9f\x34\xeb\x56\x23\x0b\x7d\x86\x83\xbd\xd5\x3a\x3d\x7d\xf2\xf4\x6d\xa3\x75\x79\x60\x89\xde\x52\xfb\xa2\x86\xac\xb5\xa6\xf1\x56\xc3\x09\x8a\xfd\xf4\x2a\x0c\x45\xab\x39\x66\x01\x19\x28\x58\xb7\x50\x17\x46\xe7\xcf\x56\x03\x55\x2f\x8e\x82\x5d\x00\x77\x59\x95\x97\x7c\x26\xd8\xaf\xa7\x6a\xd2\x22\x44\x5b\xbc\x31\x94\xbe\x72\x6f\xb2\x0f\x6d\xb4\x38\x1f\x02\xd6\x72\xa0\x02\x16\x07\x23\x68\x0a\x38\xb6\x05\xe2\xc8\x3f\xf7\x34\xe6\xa8\x0f\x58\xe5\xe0\xdc\x59\x97\xfd\x60\xdd\x93\x75\xd6\x16\x3b\x41\xf0\xd0\x7a\x2d\x46\x54\x52\x72\x46\x71\xb0\x0d\xdd\x91\xcd\x9b\x8f\x23\x88\xac\xdf\x8c\xc7\x53\x50\xca\x0c\x4a\x24\x4e\x7e\x4e\x28\x31\x78\x95\x3c\x37\xf7\xc8\x0a\x67\x38\x79\xc1\xa9\x0a\x86\xc2\x69\x5f\xd9\xe1\x58\xda\x21\xc1\xbd\xee\x6e\xd5\xb6\xf8\xc5\xae\xcd\x7d\xdd\x38\xb0\x19\xfc\x4a\x20\x04\xc2\xea\xa3\xde\x45\x49\x57\xf7\x55\x0d\x74\x9c\xb5\xa0\xba\xee\x1d\x06\x6a\xe4\xef\x20\x71\xac\xd0\xd1\x64\x07\x99\x38\xa9\x5a\x72\xad\x81\x37\x26\x07\x0c\xd7\xd0\xc0\x32\x22\x94\xbb\x25\x98\xbb\xd1\x2f\x04\xb6\xee\x00\xf8\x28\x6f\x8c\xca\x5a\xf8\x87\xa1\x91\x2f\x2a\xe6\x73\x73\x2a\xae\x5e\xd0\x00\x91\x8f\x80\x60\xca\x89\x49\x93\x48\x9d\x85\xb4\x14\x0a\xd4\xf1\xa7\x1c\x15\x43\x42\x2a\xd2\xbd\xa9\xae\xbd\xaa\xf1\x7c\x36\xee\xf1\x5f\xbb\xda\xd0\x53\x22\xb4\x86\x9e\x85\x33\xc3\x4e\x60\x3c\x1f\x11\x9f\x79\x7b\xa7\x77\x2a\xde\xd3\x1e\x94\xb7\x3e\xa8\x7d\x8d\x54\x3d\x26\x2b\xf2\x7e\xed\xd9\x8d\xd1\x95\x46\xb1\x24\x64\x03\xb9\xcf\x4a\xf0\xb5\x74\x5e\x74\x58\x8e\x66\x9b\xc8\xfb\x38\x62\x10\x47\xb8\xcf\xdf\xec\xb7\x9b\xcd\x9d\xdd\x5c\xa6\xe0\x78\x60\x66\x54\xd7\x55\xba\x4d\xbb\x2e\xad\x34\x32\x50\xae\x09\xf5\xc5\x8f\xeb\x99\x27\xad\x83\x21\x3d\x32\x26\xc3\x3b\x52\xfb\x1b\x80\x40\x93\xa7\x60\x68\xf8\x66\x43\xd5\x04\x2e\x18\x38\x54\x89\xa6\x92\x96\x55\xb3\xaf\x1b\x27\xd5\x55\x37\xb7\x59\x45\xb8\x37\x57\x8d\xe0\x38\xee\x51\x06\xac\x3a\x33\xdc\x10\x2f\x2d\x64\x90\x8a\x00\x49\xdf\x5d\xd5\x25\x13\x7c\xe3\x45\x3b\xf4\x35\xa7\xb8\x65\xcf\x6c\x38\x24\xd7\xbe\xf4\x20\x58\x67\x2a\x13\x45\x99\x59\x05\x1e\xb9\xed\x92\x3d\xa9\x61\x31\x1f\x69\x19\xd9\x23\xa5\xce\x9a\xd2\x2b\x56\x1a\x58\xe6\x45\x4b\x86\xad\xf1\xfb\x7d\x70\x7b\x2a\xa5\xf2\x53\x5c\x79\x78\x9c\x04\x61\x48\x41\xde\x69\x24\xa4\x24\xb6\x22\x10\x71\x77\x44\xbc\xcc\x67\x38\xfb\x9b\x5c\x16\x09\x01\x06\x24\xd0\xbe\x1b\x3c\x75\xbf\x7c\x2b\xca\xa2\xb1\xa3\x6b\x4c\xce\x34\xd6\x32\xac\x9b\x8c\x74\x27\xad\x55\x50\xdf\x62\x00\x08\x33\xcb\x15\xea\x5c\x72\xf4\x92\xa2\xd5\x7e\xce\x28\x89\x8b\x7b\xee\x54\x81\x18\xbe\xbd\x53\xdb\x5a\xdd\xea\xf6\xd1\x69\x58\x9f\xfa\x9a\x48\xb4\xd1\xe5\x4c\xb8\xc1\xdf\x65\x9b\xbb\xa2\xd2\x67\xd6\x03\x81\x81\xa2\x1b\x2e\xdc\x32\xf8\xf9\xfe\x8e\x13\x4b\xdf\xbf\xec\xd1\xd5\xcf\x2f\x2e\x9a\x88\x45\xa7\x37\xa0\xc1\xe2\x17\xee\xc3\xd1\x47\x07\x7f\x80\xed\x45\x28\xa6\x68\x49\xf3\x83\xa4\xab\x56\x54\x72\xdc\x0d\x48\x38\x8b\x91\x7f\x74\xe2\xbe\x66\x56\xfe\x35\x9b\xe3\x95\x54\x22\x25\xc5\xd1\x66\xd0\xa8\x75\xba\x6a\xfd\x74\x80\x30\x89\x7b\x4f\xab\x0e\xf0\x65\xbc\xd4\xa0\xb2\x02\xc5\x50\x41\xce\xf2\xf8\xd7\xe1\x28\x8b\x24\x50\xa3\x3d\x0a\x16\xa2\x48\x2f\x1c\x86\x36\x79\x74\x73\xdf\xde\x36\xfa\xd6\xa1\xd0\x70\xe8\x4e\x48\xc5\xea\x20\x20\x5b\xa7\xfe\x6c\xc8\x10\x29\x0b\x5e\x2b\x9a\xbf\xc7\xbe\xd2\x2f\x56\xb7\x23\x34\x78\x50\x40\xa6\x39\xbf\xd7\xd6\x0d\x8e\x9a\x09\xb6\xb5\x47\x8c\xe1\x56\xa9\x1f\x2a\xc6\x51\x58\x8f\x1e\xe5\x9f\x06\x8e\x05\x18\x58\xa8\x12\x00\x06\xb7\x7d\xd7\x12\xb4\x83\x0a\x5e\xe1\xf7\x75\xd7\xda\x3f\xb8\xe3\xf7\xe8\x31\xc8\x0d\x0d\x48\x87\xb7\xd6\xd0\xf2\x06\xb2\x70\xbc\xc2\x6f\xa3\x4b\xb1\xd6\x65\x8d\xe9\x99\x87\xbb\x7a\x07\xfe\x10\xaa\x57\xa0\x57\xaa\x09\x52\x48\x96\xbd\xa9\xcb\x5c\x0c\x69\x79\x08\xfe\xea\x66\x2f\x17\xba\x60\xf2\x26\x7e\x9d\xaa\x4b\x65\xba\x75\x53\x5b\xcf\x45\x8e\xc6\x1a\x4c\x3a\x1a\xaf\xea\x13\x42\x2d\xeb\xfe\xa1\xcf\xc0\x4a\xbd\x03\xa1\xed\xe0\x61\xf6\xcb\xf7\x59\x53\xe0\x11\xc1\x64\xb4\x14\xb1\x71\x8c\x86\x2c\x5d\xc3\x4f\xf5\xc8\x82\xd0\x2c\xe5\x35\xd5\x1f\xb2\x8c\x04\xec\x84\x89\x04\x05\x72\x76\xce\x60\x56\xd5\x75\xd6\x64\xb7\x4d\xb6\xbf\x53\xdf\x06\x17\x91\x36\x61\x8b\xd9\x24\x00\x63\x32\x6c\xae\x37\x63\x71\x5d\x22\xb4\x0e\x23\xdb\xe8\x26\xa2\x0c\x00\x80\x1c\x6e\x1b\x0d\xd8\x5b\xd5\x6a\x23\x7c\x6a\x7e\x98\x13\x39\x88\x04\x68\x06\x22\x42\x07\x1e\x09\x80\xf8\x22\x30\xbd\x6e\x90\x00\xc0\x9a\xcc\x75\xeb\x84\xfe\x7a\x1e\x03\x40\xb8\x68\x87\xb1\x23\xe4\xb4\x55\x90\xa8\xf6\xa1\x29\xda\x56\x57\xc8\xf3\x64\x8c\xa0\xa4\x45\x6a\x97\xd1\xe5\x9f\x47\xef\x42\xd9\x10\xc6\xc2\x8d\x66\x57\x0e\xb8\x33\x9a\x7d\x1c\xc2\xb7\x79\xf0\xda\x67\xa5\x40\x80\x70\xb6\xf7\x35\x35\x7f\xeb\xc0\x6c\x8c\x79\xb1\xef\xfd\x3c\x9a\xcd\x0e\xed\xb8\xca\x7f\xcf\x0c\x40\xfc\x7f\x7c\xf9\xdb\xf2\x3f\x3d\x7f\xf9\xea\xe2\x79\x8f\xff\xe9\xc5\xf3\xdf\xe3\xff\xbf\xc6\x0f\xec\x85\xbc\x43\xbb\x11\xb4\xac\x38\x3e\xc5\x59\x00\x88\xd1\x3f\xfa\x11\xd4\xbf\x60\x8a\x93\xa7\xa7\x52\xb6\x10\xe0\x1e\x1c\x2c\x01\x2a\x4c\x7b\xf5\x83\x48\xa0\xb9\x2b\xf6\xf4\x55\xc7\xca\xf1\xa1\x6e\x3e\x3d\x3d\xb5\xd7\x9b\x3d\xc6\x1e\x2a\xdd\x04\x0f\xc7\x2a\x0f\x6b\x44\x58\xf7\x3b\x8f\xaa\xbe\x38\x38\xb0\x83\x20\x20\xe8\xf0\x0a\xe9\xaa\xe0\x7a\x65\x6d\x09\x3a\x7c\x83\xf7\xff\x20\x52\x1b\x27\x9b\x53\xf5\x87\x83\xce\x9a\x3f\xaa\x3f\xf8\x6f\xdf\xc1\x09\x6c\xfe\xf8\xc4\x55\xf5\xfb\x2b\xfc\xf1\x91\xba\x97\xc4\x5a\x76\x60\x83\x37\x87\xcc\x27\x2c\x1a\x10\x70\xa0\x38\xff\x2f\xf1\x45\xa6\x0c\xca\x2e\x5a\xbd\x33\x89\x2a\x8c\x5a\x6b\xd0\xb1\x8a\xc8\x2c\xe3\x0e\x9c\x98\xd3\x18\xcf\x10\x88\x4a\x3d\xda\x95\x54\xbd\x39\xa8\x7a\x4d\x2a\xbc\x89\x87\xf5\x7e\x43\x31\x63\x17\xe0\x8d\xba\x78\xf0\xe4\xa8\x6c\xc3\x01\x08\xdd\x7a\x3a\x89\x60\x0b\x60\x98\x5f\x59\xf6\x54\x55\xc5\xac\x1e\xad\xe4\xfd\x4c\xf3\x7f\x78\x72\xed\xae\x35\x4a\x6d\x24\xd0\x6c\xe2\xf9\xb1\xff\xd5\x8d\xb5\x22\x08\x77\x21\xc9\x49\x92\x3e\x3b\x49\xdc\x4f\x44\xbd\xb7\x26\x26\xa9\x41\x53\xb9\x71\x77\xae\x74\xdb\x12\xe7\x15\x50\x31\x69\x84\x74\xd4\x28\x60\x4a\xea\x1b\x2e\xb4\xdc\x9f\xd4\xc2\x04\xfc\x23\x3a\x1f\x8e\xae\x0d\x55\x4e\xd6\x15\xf0\x8e\x87\xd1\xd5\xb0\x67\xd6\xba\xa8\x1b\x17\xc1\x6d\x74\xbd\x95\x0b\x37\x0a\x35\x35\x32\xbd\x92\xf8\xd7\x5b\x77\xeb\x07\xc8\xa8\x6d\x3b\xc0\x8e\xfd\xd2\x7e\xd1\xc4\x11\x50\x8f\xeb\x39\xef\x0b\xfd\xe0\xf4\x56\x65\x02\x4b\x46\xa1\xf3\xb0\x19\x70\x0e\xa5\x4f\x46\x80\x7d\xd5\x67\x90\x0a\xc4\xaa\xd1\x21\xb4\x84\x08\xe0\x26\x1c\xe4\x85\xcd\x37\xb4\xf6\xd2\x27\x33\x3c\x59\x08\x79\xc2\x25\x96\x75\x1c\x12\xa3\xd9\x3b\xba\xfd\x1d\x46\xaf\x15\xe4\x61\x0f\x18\xb7\xcf\x35\x36\x7e\x40\x16\x30\x9e\x2b\x16\xb4\x8d\x6b\xd5\x31\xd6\x4b\x15\x7f\x19\x9e\xd4\xf7\x75\x91\x4b\x11\x47\x19\x8e\x88\x56\xc0\x76\x70\xe9\x99\x14\xc8\x02\x97\xf3\xb7\xab\x0f\xa3\xc5\xa0\x65\xf8\x59\xc5\xb8\x9e\xa1\x28\xac\x43\xf5\xe6\x66\x05\xf4\xea\x60\x1c\x8e\xaf\x98\x2b\x7e\xd8\x26\x74\x48\xee\xcf\x19\x84\x60\x35\xce\xe6\x33\x59\x27\x91\xaa\xc9\x4c\xcd\xe6\x80\xb3\x5e\x09\xdd\x03\xd4\x2c\xa3\x7a\x8b\xeb\x8f\x00\xd0\x56\x3f\xcd\xa7\x57\xe3\xc5\x52\xc8\x13\x30\x24\x1e\x30\xfa\x89\x24\xed\x47\x42\xff\x61\x38\xfa\x68\xa6\x46\x97\x0c\x0f\xf7\xd8\x74\x80\xa1\x87\x42\x0c\x0c\x38\x7f\xbb\x98\xbf\x4f\x18\x6b\x3e\x67\x4c\xfb\x0c\xa5\xdc\x50\x86\x2e\x98\x11\xc2\x99\x13\x22\x1d\xdb\x72\x35\x1e\x4d\x27\xb3\x77\x4b\x2c\x0d\xf0\x1f\x4e\x9f\x38\x17\x04\xe0\x44\x4d\x96\xeb\x5d\x46\x6c\x6e\x43\xa7\x8e\x75\x48\xec\xec\xac\x3d\xe9\x3b\x7b\xe5\x94\xfc\x43\xc2\x27\xbb\x99\xf7\x58\x6b\x2b\xc0\x86\x6e\x85\xd5\x4d\x4f\xb8\xb5\xe7\xa1\x24\xde\x39\x01\x57\x45\xb8\x28\x6a\x05\x95\xff\x80\x3a\xe5\x36\x52\x04\xaf\x7f\x40\x43\x58\x4c\xe4\x6a\x02\x29\x78\x54\x60\x04\x7d\x18\xc8\x1a\x1a\x16\x3b\x73\xbb\x62\x60\x03\xfc\xd6\xf6\xdc\xd7\xfe\xa4\xdf\x5c\x8e\x2f\x27\x53\xeb\x02\x9c\xff\xbb\x5c\x80\xc7\xed\xff\x57\x17\xdf\x3e\x8f\xed\xff\x8b\xf3\xdf\xf9\x5f\x7f\x9d\x1f\x90\xd0\x74\xe7\x03\xf2\xb4\xda\x93\xc5\xd5\x07\xa9\x4b\x6d\xd7\x87\xc2\x7b\xed\x49\x1f\x98\x98\x29\xe0\x2b\x73\xd1\x04\x6f\x13\x65\x2d\x95\x5f\x12\x32\x0f\xaa\xa1\x0a\xb3\xe9\xa8\xf6\x78\xad\xdb\x07\xad\x91\xa6\x86\x5c\x82\x30\x6e\x54\x99\xae\xd1\xbd\xb2\x2b\xb0\x53\x1f\x6a\x80\xc4\xd8\xfd\x5f\x6d\x8a\x7d\xa9\x8d\xba\xed\x0a\x07\x71\xcd\x9b\x6c\xdb\x72\x9a\xe0\x0c\x55\xa8\xca\x43\xc2\x54\x09\xdb\xba\xd9\xd9\x63\x08\x9e\xf7\xb6\xd1\xd5\xe6\x0e\xab\x57\xd6\x75\x7b\x87\xf0\xeb\xdb\xac\xc9\x0d\x23\x2d\xe1\xc6\xab\x1b\x0a\x12\x1e\x45\x55\x26\x0e\x78\xb9\x6f\xea\x96\xe0\x23\x38\x0e\x2d\x97\x89\xda\x9b\x96\xfa\xca\x1f\xa6\xc3\x03\x38\x61\x37\x75\x55\xef\x8a\x8d\x43\xba\xde\x8b\xca\x81\x14\x3b\x63\xec\x87\x72\xdb\x9b\xa1\x91\x11\x03\xc2\xde\x4d\x1c\x63\x0e\xe6\xeb\x07\xa0\x3f\x30\x88\x4e\xf1\x9e\x06\xb0\xaf\x10\x4b\x81\xb5\xab\xce\xb0\x41\x78\x29\x78\x73\x71\x5d\xe7\x5c\xb2\x0a\xe5\x7e\xd4\xb3\x48\xf2\x96\xd7\xd0\xc9\xa5\x56\x3f\xa8\xcb\xf1\x28\x51\x97\xf6\x1f\xb3\xc5\x32\x51\x13\xf5\x83\x9a\xcc\x16\x93\x51\xa2\xa6\x53\xf5\x83\x9a\xd6\xb7\xc5\xa6\xd0\xa5\x9a\x16\xeb\x46\x9f\xc2\x0c\x32\x9b\x43\x01\xbc\x97\x59\xab\xfe\xeb\x7f\xaa\xf2\xd9\xb8\xd2\xcd\x6d\xa1\xd5\xa8\xad\x77\xc5\xdf\x3b\xad\xce\xf0\xd9\x19\x5d\x34\xca\x00\x35\x12\x5e\x18\xad\xde\xdc\x55\xc5\x86\x38\x51\x8a\x2a\xef\x0c\x82\x47\xb5\x69\x33\xb0\xf0\x11\x09\x7c\x97\xdd\xf3\x22\xa2\xa1\xb4\x93\x0c\xd9\xde\x7a\xeb\xf9\x1e\xb2\x56\xbd\x38\x3f\x7b\xf1\x42\x35\x9d\x56\xb9\x5d\x24\xea\xed\x7f\xfd\xaf\xfc\xbf\xfe\x57\x43\xa6\xfc\xeb\x57\xaf\x5f\x5d\x58\x6b\x63\xb2\x54\x1b\x9d\xeb\x5f\xd4\xf9\xab\x44\xbd\x05\x82\xb2\xd4\xf5\x49\x57\x6d\xa3\xd5\x8c\xad\x5d\x7c\xd0\x42\x6f\xee\x74\xb3\xb9\xd3\x6a\xc9\x1d\xa0\xde\xc1\x80\x0d\x74\x0f\x97\x92\xed\x61\x5d\xda\xe1\xfb\xa7\xba\x05\x5d\x7a\x5f\x6c\xee\x74\x79\x36\xaa\x6e\xb5\xed\xca\xf7\x2f\xd5\x75\xd6\x14\x86\xbb\xf2\x6d\xaf\x2b\x13\x2a\xcc\x09\x3a\xe3\x7b\xa2\x2b\x4f\x29\x6f\x3b\xa3\x5b\xfb\xab\x11\x05\xc3\xb1\x7b\xb4\x0a\xfe\xcd\xfd\xc3\x94\x3c\x4c\xda\xcf\x75\xd9\x6d\x74\xd6\x25\x6a\x51\x6f\xfe\xde\xe9\x0a\x2a\x94\x13\xf5\xe6\x5a\x9d\x3f\x7f\x95\xa8\xd7\xdf\x9d\xbf\x7a\xa1\xa6\x5a\x5d\xde\x69\x53\x65\x07\xec\xbd\xeb\xb2\xc3\x05\x92\x7c\x0f\x79\x6d\x6e\xf5\xbf\xb5\xfb\x6c\xc9\xe7\xe2\xd4\xe9\x4b\x07\xc7\xa7\x63\xe2\x42\xef\x65\x08\x57\x8f\x52\x64\x51\xba\xd5\x9d\xb7\x3d\x9d\x77\xde\x74\x94\x26\x07\xff\xae\xc9\x76\xda\x45\x5f\x2a\xf5\xb4\xde\x6b\x66\xac\x7a\x1a\x9e\x0f\xbb\x3a\xd7\xa5\x53\x24\x12\x64\x70\x68\xf4\x7b\x35\x9c\xc2\x78\xbf\x27\x2b\x51\xdc\x91\x29\x54\x64\x41\xca\x16\x65\xf6\x1b\xc8\xb0\xa3\xab\x41\x07\xbb\x57\x0b\x30\x6d\xd6\x76\x26\x50\x0a\xc0\xc4\x96\xa3\x98\x11\xfd\x87\x53\x2c\xac\x88\x25\x16\x3b\x28\xe7\x42\xde\x56\x34\x2a\xfd\xd1\x26\x40\x42\x8e\xba\xd2\xa3\xc9\xa5\xe3\xdf\x1f\xee\xa0\x12\x4e\x7b\x1d\x6f\xec\x55\xc0\x35\xe8\xf0\x09\xd6\x47\xa5\x02\x63\xaa\x85\x3f\xb8\xf3\xde\x69\x2c\xf1\xb5\x97\x88\x6b\xc0\x25\xac\xc3\x9b\xc0\x5f\x2d\xa6\x83\x4e\x59\xe3\xb8\xa4\xa0\x98\xc1\xf7\x42\x18\x85\xdf\xea\x68\x5a\xb0\x1a\x91\x28\x36\xa8\xa0\x90\x59\xed\x98\x68\x84\x06\xc8\x76\xc8\x36\xaa\x25\xb1\x22\x8f\x47\x1d\xae\xc0\x2e\xeb\x2c\xf7\xc1\x1f\x1e\x40\x11\x07\x22\xfc\x29\x99\xff\xcc\x14\xcb\xfe\xad\x5b\xc2\x9e\xbb\xb8\xa1\x3a\x1e\xbb\x8f\x51\x67\xd8\x8e\x47\xb0\x91\x28\x86\x00\xf8\x30\x9d\xf9\xfb\x15\xd6\x23\x15\x6c\x60\x3a\x64\x97\x55\xc5\x1e\x52\x4f\x3c\x7a\x19\x61\x34\x5a\xe6\xa9\x91\x90\xb6\x82\xa4\x2a\x10\xa2\x4c\xe5\xec\x24\xfb\x82\x97\xb5\xfe\x65\xaf\x9b\x42\x57\x1b\xd4\xbc\xd8\x62\x22\x27\x2b\x8d\x3b\x7e\xaa\xb3\x5c\xef\xdb\x3b\x2f\x95\xe5\x28\xfb\x52\x16\x9c\xc2\xab\x92\x5e\x8f\x47\x4e\x76\x8b\x0d\xb6\xe3\x49\x47\x1d\x91\x2f\x2c\xfd\x52\x31\xa0\xf8\x43\x8c\x0f\x81\x85\x52\x34\x0c\x50\xc4\x24\x35\x92\xb6\x70\x34\x4c\x57\xf6\x9c\xe4\x21\xd7\x9b\xae\xf1\x35\xb7\x45\xa3\xcc\xc1\xb4\x7a\xe7\x38\xa1\xf2\xac\xcd\x88\xc1\x14\x77\x29\x34\x28\xc1\x1a\x0e\x92\xca\x2f\x91\x40\x90\xd1\xc0\xcc\x45\x52\xb4\x81\xe4\x7f\x18\x90\xe3\x17\xa7\x71\x69\x0b\xc3\x10\x11\x0a\xe5\xc8\x84\x71\x1c\x44\xcd\x93\xdb\x62\x38\x4d\x90\x4a\x2d\x5b\xdd\x30\xca\x86\x71\x90\xa3\xa6\x2d\x36\x25\xd9\x24\x28\xee\x4b\x2c\xaf\xb0\x02\x77\xf5\x3d\x11\x57\x6e\x9b\x7a\x37\x54\x6b\xe3\x91\x79\x2e\x7c\x0d\x2e\xa0\x5b\xad\x5b\xc7\xc6\xfd\xd9\x5d\xab\x72\xbd\x29\x72\x4d\xd0\xdf\xf5\xae\xc0\x59\x75\xa7\x17\xc7\xcf\x98\xe0\xd1\x53\xab\xe1\xb1\x86\x7d\x51\xe7\xea\x2c\x96\x2e\x78\xcb\x50\x5c\xbc\x73\x06\xcb\xa4\x1f\x58\xfc\xd3\xdb\x6b\x54\x8f\x04\xb3\x02\xa9\x61\x4f\x66\xa0\x36\xd9\xbe\x68\xb3\x52\x95\xba\x6d\x35\x9e\x49\x0c\x05\x44\x96\x90\xe0\x49\x76\xe3\x08\x1c\x0e\x53\x40\x3a\x7a\x40\xb7\xb3\x9c\x58\x57\x70\xf5\x25\x9e\xde\xbd\x61\x60\xa5\x1d\x01\x71\xe4\x73\xfd\x60\x1a\xbe\x62\xe9\x0c\x57\xcf\xea\xed\xe6\x86\x48\x2f\xe7\x18\xd4\xbe\xa4\x93\xde\x2e\xec\x25\x1e\xfe\x97\xcc\x53\x8c\xcb\x9a\x54\xcf\x5c\x49\x75\x32\x14\xb3\x7d\x9a\xd9\xab\xe9\x69\x40\x26\xec\xc6\x96\xc2\x92\x9a\x58\xc4\xb0\x3d\x21\x5b\xa6\x6f\x3b\xcb\x49\x0d\xf5\x61\x19\xf5\x41\x36\x98\xfa\x20\xbb\xf5\xaf\xea\x03\x6e\x27\x19\x1f\x64\xb7\x01\xa5\x7b\xe1\x93\x3e\xbd\xf1\x58\xc0\xfd\x58\xaf\xdf\x33\x8a\xef\xd1\x6e\x3b\xac\xdf\xfa\xe0\xa1\x5f\x75\x15\x11\xc6\xc5\x6b\xc1\x8d\x11\x3f\x13\xa2\x35\xe1\xc9\x19\xa0\x82\x08\x91\x07\x15\x7a\x25\x24\xf6\x01\x4e\x01\xb5\x19\x68\x2d\x48\xaa\x58\x67\xb2\xb8\x12\x47\xff\xe4\xa8\x2d\x62\x72\x64\xff\xd6\x45\xe5\x01\x25\xcc\x86\xe7\x28\xc1\x18\x1c\x5e\x94\x01\xd7\xb5\xe8\x57\xf4\x16\x4c\xfe\xcb\x17\x3c\x7e\x00\xb9\x52\x90\x78\xe9\x45\xcf\xe5\x65\x7c\x62\x4e\xf1\xe1\x27\xe6\x34\x9c\x1f\x7b\x3b\xdb\x5f\xd2\x55\x87\xcb\x9d\x72\x70\xc7\x66\x5e\x14\x5e\xba\xf9\xf1\x3b\x86\x9e\x84\x7a\x7c\x5f\x38\xe3\x9c\x07\x94\x23\xc0\xa8\x7b\x4a\x9e\xf0\x81\x42\x8c\xc2\x79\x71\x5f\xe4\x44\x0d\x86\xb5\x8a\x48\x0d\x90\x0c\xcb\x3d\xf8\xfe\xba\x35\xff\xd9\xde\x41\x6d\x0a\x5a\x23\xa2\x01\x41\x78\x3e\x41\x58\xdd\x86\xfe\x07\xf8\xd7\x4b\xfe\x53\x96\x67\xfb\x36\x0b\xb8\x19\x2b\xfd\xa0\xb6\x24\xca\x91\x11\x0f\x61\x51\xb5\xfa\xb6\xa1\xfa\x59\x32\xd9\x96\xc2\x86\x12\xef\x0e\xa8\xcc\xd9\x72\x5c\xda\x77\x6c\xec\x76\xec\x4a\x1d\x1f\xab\xf8\x5b\x3f\x4b\x46\xb7\x48\x94\x68\x57\xa2\xa1\xf5\x1b\xe4\x27\x8a\x26\x0a\x98\xda\xf1\x4c\x54\x8d\x8c\x8e\x76\x4d\x63\x10\xb8\x87\xf6\x04\x8b\x84\x01\x45\x30\xb0\xb0\x43\xa2\xde\x82\x08\x76\x73\x0f\x98\x7a\x34\x48\xd8\x1a\xa3\xd0\xb2\xa7\xac\x46\xd6\xa7\x80\x67\xf4\xe8\x36\xbd\x3a\x54\xd9\xce\x8d\xc2\x0f\x5e\xc4\x41\x4c\x5b\x67\x0f\x51\xae\xf6\x19\x22\x87\xe7\xd8\x56\x51\xe5\x7a\xaf\xab\x5c\xd4\x57\x2d\x45\xde\x56\x78\x38\xf8\x54\x3f\x15\x4e\x1f\x03\x0f\xfc\xf6\xa1\x76\xb8\xc7\x36\x1e\x31\xe6\x5e\x6d\xb4\x6a\xba\x0a\x35\x0c\x09\x48\x9c\xe5\x39\x30\xe4\x9a\x7d\x06\x69\x29\x52\x2e\xd5\x6a\x93\x95\xce\xe8\xc3\x9d\xc0\x37\xd6\x81\x1f\x14\x9f\xa5\x72\x75\xfc\x43\xe3\xc2\xd7\x42\x85\x2a\x97\x43\x2b\x14\x41\xfa\x1b\xc0\x8d\xb1\x1d\xff\x49\xb3\x15\x2b\x60\xc2\xb8\xda\x1b\x37\xbc\x64\x37\x1e\x1b\x46\x77\x86\xb3\x23\x40\x8d\x48\xa0\xb3\x4e\xe6\x04\x72\x87\xd6\x10\x29\x25\x22\x38\x1a\x88\x6b\xe4\x8e\xa1\x0d\x0d\x11\xc1\xf0\xa2\xa7\x97\xf3\x51\xc4\xce\xb2\xd1\x81\x79\x45\x86\x2d\xd2\x2f\xd6\x48\xa5\x6d\x5f\x0d\x6c\xc1\x70\x0b\x95\x5d\x93\x95\x5e\x71\x82\xad\xbd\x0b\x75\xc6\xa9\xa9\xc1\xc8\x82\xee\x05\x10\x70\x43\x05\x8d\x0a\x19\xbe\x7d\xdb\xc1\xd0\x4e\x62\x11\x0a\x96\x83\x80\xc7\x40\xce\x99\x55\x29\x5c\xda\x95\xad\x02\xbf\x72\x4d\x48\x13\xce\xcd\x7f\x45\x9c\xfc\x58\xe2\xcd\x5f\x7b\xb8\xab\x4b\xb4\x1e\x88\x59\xab\xf5\xd5\x75\xad\xa7\x99\xc7\x78\x67\x56\xe4\xe1\xf6\xe5\x67\xbf\x50\x67\x42\xe7\x8b\xe6\xeb\x45\x7a\x8e\x98\x2e\xd7\x4b\x47\xef\x93\xdb\x61\x02\x98\xe6\xd0\xad\xf5\x65\x34\xe0\xbc\xd0\xeb\xcd\xa6\x6b\x00\x96\xec\xc0\xe8\x60\x20\xc5\xc8\x74\xd4\xa9\x37\x82\x1f\xfb\xa4\x38\x65\x57\xf9\xb1\x33\x1b\x76\x1c\xa4\x98\xb3\x35\x11\x10\xe4\xf5\x43\xc5\xdf\x44\x41\x2e\x70\x61\x5a\x0d\x47\x23\xdd\x79\xeb\x83\x8a\x3e\xb3\xbf\x3b\x18\x08\x92\x61\x35\xc8\x8f\xb2\x29\x24\x75\x25\x8c\xbb\x60\x81\x30\xa1\x9a\x91\x44\x2d\x11\xd1\x4c\x4f\xef\xe1\x45\x7a\x91\xaa\x79\xa5\x03\x26\x72\x61\xea\x6f\xea\x8a\xb3\x7d\x19\x43\x6f\x62\xb2\x11\x07\x3e\xf4\x6e\x7f\x78\x9c\xd2\xe7\xe2\xa8\x0a\x5d\x6f\xe2\x8f\x4e\x85\xc3\x3a\xa8\xeb\x43\xe0\xb5\x63\xc8\xc6\x95\x55\x7a\x54\x44\x1d\x0e\x83\x93\xea\x87\xdc\x04\x2c\x1a\x08\xb3\x1f\x5b\xf4\x2f\xd2\x73\x5e\xf6\xc8\x5f\x11\x1e\x12\xd6\xd8\x21\x6e\xda\x8d\x8b\x08\x04\x61\x07\xe4\xa3\x91\xc2\x51\xfc\xe8\x97\xea\x4c\x8d\xdf\xbe\x1d\x5f\xae\x26\x3f\x8f\xd5\xd5\x68\x85\x09\xeb\xd5\x78\xf1\x9e\x86\xff\xa5\xdd\x00\xe1\x47\xe8\x2f\xab\xe0\xb0\xe0\x6d\xb1\xa9\x77\xda\xf3\x92\x73\x09\x25\xa0\x0d\x84\x4b\xe0\xb6\x4a\xa8\x60\xf2\xe8\x18\xa4\xae\x45\x17\xa9\x6c\xe1\x50\x3b\x28\x99\x5a\x54\x0a\x88\xb3\x54\xde\x35\xbc\x41\xf0\xb0\x40\x63\xed\xf8\x91\x71\xd4\xd4\x1d\x3c\x3a\x5e\xa9\x33\xb5\xbc\x9c\x5f\x8f\x99\x2b\x2d\x22\x57\x3b\xfb\xb2\x1f\x3e\x91\xdd\x39\x1b\x0a\xfd\x44\xeb\x88\x2c\x05\x76\x0d\x4d\xb7\xb9\x4b\xa2\xd3\x82\xf5\x35\xc2\x9c\xd3\x52\x06\x1b\xc4\x19\xd1\x31\x28\x88\xcf\x55\x1e\x9e\x68\xc7\xc5\x65\xb1\x47\x8f\xbb\x58\x49\x05\x4e\x6d\x18\xb8\x39\x17\xac\x25\xe1\xc5\x32\xdc\x53\x4c\x2a\xd5\x5b\xae\x33\xd0\xbf\xec\xcb\x9a\xf7\x22\x4f\x10\x36\x6a\x4f\xda\x45\xe4\xbb\x50\xa1\x86\x9d\xf1\xba\x11\x48\x6e\xa8\xcd\xc5\x38\xa4\x01\x26\x16\xe8\x9a\x2f\x52\x8e\xed\xbb\x57\x76\x17\xd0\xa4\xce\xdf\xaa\x9b\xa5\xdc\x04\xae\x99\x05\xc7\x5c\x8b\xff\x81\xdb\x9e\x4b\xcd\xfc\x41\xd3\x55\x5c\x11\xaa\x21\xcb\x16\x4d\xcd\xb6\xd0\xd0\xe8\x2d\xbb\xdc\x02\xd8\x55\xb4\x04\xbd\x93\x57\x20\x9d\x6c\x81\x3c\x2e\x42\xf6\xec\x28\x86\x72\x15\x7b\xdd\xec\xb2\x8a\x14\x21\x5a\xbd\xdb\xd7\x50\x8e\xc0\x61\x31\x5e\xfe\xe0\xdf\x84\x83\xf5\xd8\xa5\x42\x29\x2f\xf9\x7b\xa9\x73\x85\x55\xa9\x2e\x98\x4b\xfa\x5c\xf0\xef\xa6\xab\x10\xde\x67\xad\xf1\xb6\x6e\x7a\x57\x58\x1d\xba\x3c\x70\xdf\xa4\x81\xf0\x04\x78\x5b\xc4\x31\xdc\xd6\xaa\x5e\xc3\xd5\x95\x28\xd3\x76\xf9\x01\xbb\x69\x8e\x85\xc5\x7c\xc6\x80\xb3\x3d\xb8\x30\x72\x9d\xb1\x27\xef\xb2\x9d\x58\xdd\x59\x37\x3b\xb1\xf2\xa3\xdd\xb3\xa9\x31\x49\x05\x36\x76\x49\xd1\x52\xfb\x9a\xc0\xe0\x40\x4b\x93\x94\xa9\x20\x10\xd8\x0f\xf6\x6c\xb2\xa6\x01\x27\xa5\x6b\xe5\x0b\x1e\x1f\x43\xb0\xb2\x18\x73\x48\x03\x0a\xd5\x64\xae\xdf\x47\x4e\x81\x44\xde\x14\x34\x9e\x28\xc6\x9f\x35\xcd\x01\x1a\xd1\xbb\x93\x5f\xd9\x23\x78\x3c\x03\x1e\x58\xc8\xe3\xaf\xe6\xea\xfd\xe8\xcf\x63\x4f\xea\xc9\xa1\x44\xda\x22\x21\x1f\x43\xa8\xb7\x14\x70\xb7\xbb\x0f\xb2\x13\xab\xc9\x83\x4d\xb8\x56\x0a\x96\x0b\x15\x6f\x0f\xba\xc3\xb1\x6f\xe0\xef\x4b\xf7\x70\x17\x09\x16\x00\x02\xa8\x47\x8b\xb6\xfd\xe3\xbb\x3b\x6e\xc4\x90\x4e\xa4\x5b\xcb\x21\x46\xb2\x68\xa5\x06\xe8\xce\x9d\x44\xad\x21\x50\x94\x11\x29\x6f\xb7\x8a\x42\xb1\x45\xea\x54\x4e\xf4\x4c\x6d\x44\xc9\x11\xe9\x44\xbe\x4a\x5f\xa4\x21\x4d\xa8\xbd\xe8\x51\x42\x17\x99\x4f\x03\x29\xc0\x49\x25\xf4\x47\x12\x31\x7a\xf5\x36\xaa\x60\xe3\x48\xba\xd3\xc0\x38\x3a\x9b\xbb\xa2\xa5\x1b\x02\x60\x97\x1b\x46\x20\x4a\x47\xcb\xfe\x3f\x65\x02\x38\x53\x3b\x74\x0a\x10\xbd\xf9\x90\x89\xdb\x9b\x6c\x64\x3f\x48\x38\x5e\x8f\x09\x0c\x28\xee\x71\x61\x31\x28\x5c\x4b\xb0\xb2\x5d\xde\x34\x5e\x54\xa7\x89\x50\xab\xf2\x44\xc4\x63\x90\x25\xba\xb0\x31\xfb\xa6\xde\x68\x63\xd2\xde\x12\x72\x94\xa2\xc1\x52\x0a\x52\x82\xe1\x9b\x5c\xe8\x12\xf8\xc5\x76\x71\xb8\x93\x18\xb4\x88\xc5\x1f\xf0\x12\x40\xe1\x21\xac\xdf\xaf\xbc\x9b\xfd\x7a\xb1\x77\xde\x38\xa6\x96\x75\x78\x1e\x06\x5b\xbe\x9f\x5f\x4d\xde\xd2\x22\xf2\xdf\x7f\x7c\xeb\x84\x19\xe7\xa6\x8b\x3b\x2d\xe3\xd5\x32\x56\x3d\x10\xa7\x8e\xe1\xc7\xb0\x53\xa2\x8c\x6e\xa8\xd2\xc4\x51\x5c\xa1\x35\xd3\xf3\x7d\xe1\x52\x33\xae\xc0\x15\x43\xc7\xa1\x2c\xd1\x79\x1a\x48\x2e\x49\x13\x29\xf8\xdc\x45\x7a\xdc\x31\x11\x3e\x45\xbd\x8d\xc3\x01\x40\xc7\x1e\x24\x78\xbd\x3c\xc6\x11\x3b\xd9\xa8\xef\xe0\x83\xdf\x8b\x26\x70\x02\x2b\x61\xe3\x06\x7c\x48\x1c\x2c\xe4\x11\x09\x23\xda\x72\x80\xc1\x9a\x10\xf1\xfb\x24\xb2\xd6\x51\xad\x65\xdb\x81\x57\xc5\xbf\x36\xaa\xab\xee\x80\x6c\xd7\xba\xc7\x41\x96\x5c\xbc\x06\x90\xd9\x72\x6e\xd7\xc4\x16\xcc\xae\xec\xee\x33\x9a\x5a\x70\xff\xd2\xd3\x99\x8a\xd7\xd9\x48\x04\xf5\xaf\xeb\xdc\xe7\x99\x39\xaa\x07\xcc\x1a\xe8\x5c\xa3\xb6\x9a\x37\x3c\x7c\x6b\x7c\x35\xa0\xfe\x65\xa3\xc9\xa9\xe7\xaf\x71\x48\xa3\x11\x68\xea\x2c\xda\x3c\x17\x43\x9b\x07\xf7\xca\xf8\xca\xed\x22\xff\x9d\x0f\x3d\x3b\x00\xa3\x57\xc3\xfa\xc3\xf2\xf6\x7e\x64\x7c\xda\x10\xac\x2e\x1c\x9c\x5e\xde\x84\x79\x56\x6d\x33\xd6\x5a\xd6\x6e\x0c\xec\x97\x9e\x06\xf1\xd7\x6c\xf7\xa1\xb7\x27\xbf\xef\xf4\x5f\x69\xa7\xf7\x86\xfe\xdf\xbc\xe5\x87\xde\xf7\xff\xf6\xbd\xff\x62\x68\xef\x5f\x7d\x9c\x8d\xde\x4f\x2e\xed\x19\x70\x33\x1d\x2f\x1f\xdb\xf9\x77\x99\x11\x09\x89\x2c\xca\x2b\x3c\xb2\xe7\xc9\xb5\x89\x45\x6e\x60\xa7\xf4\x1f\x92\x39\x84\x44\x5f\xbd\x4f\x10\x8a\x0c\x64\xd8\xa3\xfe\xa2\x54\xd6\xf5\xc8\xd5\xca\xba\xea\x80\x77\xd7\x53\x02\xfe\x8a\xa3\x6e\xd2\x5b\x9d\xc1\x42\x39\x62\xe8\x48\x7d\x42\xd2\x6d\xc9\x3d\x12\x38\xaa\x35\xeb\xef\x78\x68\x09\xa3\xab\xda\xaf\x3b\xae\x30\x82\xe0\x93\x76\xe2\x59\xe9\x17\x77\x4b\xd8\x34\x64\x22\xff\x9a\x5d\xe8\x37\xe3\x78\x77\x38\xac\xf5\x2d\xe0\x26\x57\xe3\xe9\x74\x7c\xb9\xba\x19\x4d\xd5\xf5\x62\x7e\x3d\x5e\xa0\x14\x04\x70\x1c\x9c\xa7\x6a\xfe\xf3\x18\x0b\x3f\x00\x41\x32\x9a\xc6\x57\xdb\xca\x25\x51\x55\xfd\x40\x49\xd5\x2f\x4f\x24\xab\x51\x10\x9f\xe2\x91\x88\x3f\x17\x0d\xdf\x20\xaa\x7b\x68\xbf\x48\xf6\xc4\xd6\x37\xd4\xee\x3f\xe0\x3d\xc6\xc1\x0c\x28\xc7\x0c\x56\x9a\xa2\xac\x20\xa4\xc3\x5c\x46\x40\x7a\xcf\x58\xa2\x27\x21\x2e\xa0\x53\x1b\x05\x2c\x44\xe6\xff\xd1\x3b\x3c\xbe\xc1\x61\x43\x1f\xcb\xba\x8b\x11\x87\xfe\xb5\x98\x05\xab\x1d\xcf\xe3\xe0\x23\x07\x87\x55\xb2\x47\x1c\x45\x64\x24\xbe\x99\x1d\xf9\x54\xc1\x8d\x95\x71\xb0\x39\xbd\x48\x53\xb7\x74\x2e\xc4\xd2\x39\x16\x36\x78\x5c\x6b\xf8\x7e\x40\x62\xdc\x08\x1e\x8b\xf6\xb3\x00\x06\x38\x66\x4d\x71\x5b\x71\xd2\xd1\x07\xae\x4b\x7d\x5b\x50\x12\xdd\xb7\xf9\x85\x68\xf3\xf0\x71\xbe\x0a\x8f\x71\xc8\x0b\x1d\x3f\xc9\xb9\x84\x21\x6c\xe5\xe7\x7b\x3d\x70\x9e\xb3\x1d\x03\x0e\x2c\x08\x35\xa2\x38\xee\x9d\x94\x78\x45\xb3\x09\x96\x24\x22\x7b\x7b\x82\x6b\xbe\xaf\x2f\x53\xf5\xa7\xf9\x64\xb6\xc2\x32\xbb\xa5\x98\x19\x9f\xcd\xa4\x0f\xc6\x29\x32\x4f\x4c\xed\xd7\x5f\xcf\xa2\x02\xf1\xc5\x9a\x50\x73\x89\x2b\x62\x44\x21\x78\xe9\xd6\x43\x1d\x61\xf2\xc8\xc8\x38\x72\xbc\xed\xb6\xf8\xa5\x9f\x1b\xfe\x31\xb6\xd1\x82\x00\x10\x0c\xa5\xab\xbc\x84\x57\x93\xc8\x24\xe4\xb8\xe8\xe5\x9e\xbb\x72\xc0\x49\x4d\x8f\x8d\xcb\x45\x34\x2e\x62\x37\x52\xef\x51\x5e\xb5\x24\x61\x1e\xf7\x7f\x81\x50\xf8\xe7\x84\xc1\xc5\xb9\x45\xf8\x8e\x50\xf0\x95\x32\x58\xa0\xe4\xdf\x87\x73\xdd\x17\xe6\xec\xbf\xfe\xe7\xd9\x7d\x81\xd1\x27\xd3\x66\xdb\x6d\x12\x85\x55\x4c\xd7\xe8\x50\xe2\x9a\x40\xd6\x2c\x21\x02\x78\x6a\x3b\x90\xff\x5c\x5b\x83\xcb\xe7\xb5\x3a\x53\x8b\xf1\x74\xb4\xb2\xde\xd2\x78\xf1\xf3\xe4\xd2\x6d\xb2\xd7\x76\xc5\xa1\x22\x59\x55\xab\x4d\xd1\x6c\xba\x9d\x69\x51\x9d\xdd\x79\x31\x52\x00\x79\x5d\x16\xb7\xfd\x14\x36\x73\xa7\x89\xea\x0d\x63\x0a\x7c\x10\x06\x19\x81\x8f\x17\xfe\xd7\xa1\x45\xe2\x54\x75\xea\xb0\x53\x44\x6e\x14\xbc\x25\x0a\xa9\x02\x8a\x04\x83\xf4\xed\x61\x8f\x12\x11\xf8\x60\x5c\x29\xc7\x92\xc6\xc8\xdf\x3b\xd0\xcc\x84\x87\x11\x3e\x21\x1a\x9c\xc4\xee\x5c\x70\x20\x7b\xdb\x0e\xe1\x6b\x48\xa9\x3f\x67\x17\xc1\x35\xdf\x0b\x7a\x02\x4f\xa0\x18\x0f\x7a\xed\xe0\xd0\xb9\xb1\xc2\x26\x14\xd5\xa6\x6b\xa4\x1a\x3d\x01\x94\x53\x37\x9b\x17\xa9\x5a\x16\xbb\xa2\xcc\x1a\xe4\x11\x72\x6b\xcf\x35\x64\xf0\x8a\xa5\xd1\xc4\x3c\xaa\xf3\x44\x92\x48\xd2\x3b\xd4\xb3\x4b\x80\x85\x92\xb3\xbb\xe2\x3c\x04\xff\x68\x0d\x90\x3a\x70\x42\xa0\xe4\x80\xb9\x4d\x1f\x77\xa5\x3d\x6a\x81\x06\x65\xd8\xc1\xa5\xbb\x74\x68\x8a\x39\x26\x8c\x4d\x41\x5c\xaf\x6c\x41\xaa\x96\x76\x02\xa2\xb4\x34\xe4\x8b\xec\x74\x78\x99\x93\xfe\xd2\x81\x1c\xb3\xcc\x25\xb9\xa1\x94\x1e\xfe\xd0\x82\x20\x10\x8b\xbd\x18\xa9\x96\x2e\x58\x1b\x71\x12\x3a\xd8\xbc\xdf\xa9\xb3\x50\x38\x0c\x78\x87\xce\x53\xb5\x7c\xcc\xc6\x75\xdf\x4e\x2f\x12\x26\xca\x0e\xde\x89\x4c\x47\xb5\xf5\x1f\xb7\x50\x40\x1b\xa6\xaa\x60\xca\x45\x75\x88\xcb\x5b\x44\xd6\xf2\xe0\x6a\x42\xa5\x1e\x6b\x39\xea\xca\xa0\x15\xe3\xad\x2f\x7b\x2e\xa3\xe8\x9a\xe9\x08\x09\x26\xe4\x03\x29\x84\x9c\xc1\x3f\x39\x0f\xe9\xb3\x67\xdc\xfc\x44\x0e\xb9\x77\x77\xb5\x3d\x84\x08\xf9\x51\x38\xcf\xea\xbb\xf0\xf6\x80\x08\x81\xdf\x43\x50\x89\x13\x48\xcc\x6d\xea\xdd\xae\x68\x31\xeb\x04\xa0\x47\xa1\x96\x30\x54\x1d\x04\x24\x13\x92\xf1\x0a\xb6\x69\xdc\x31\xb8\xf9\x7c\x22\xe0\x07\x80\x9b\xd4\x5b\x1c\x8a\xbc\x0b\xf1\x1d\xcf\xac\x91\xd9\x66\x6e\x4a\xec\xb2\x64\x01\x1d\x31\x69\xd1\x2c\x25\x88\x1b\xa1\x31\x46\x9d\x1e\x21\x29\xee\xdf\xd4\x8b\x20\x76\xc4\x46\x25\x54\x22\xbd\x2b\x15\xe2\xf5\x7c\xce\xdc\xa5\xdb\xca\xac\x6d\x91\x9e\x3a\x0b\xea\x2d\x88\x6c\x24\x48\xdb\xc1\x4a\x08\x3e\xe4\xa0\xf1\x76\x1c\x4f\x0a\xdb\x83\x7f\xa2\xdd\x24\x1d\x43\x01\x7c\x6f\x3e\x09\x2a\x13\x99\x5b\xd0\x9b\xae\x2a\xb2\x06\x7e\xe1\xaa\xcf\xe0\x85\x27\x45\xaa\xd3\x48\x1d\x90\xff\x8f\x64\xd8\x13\x4e\x09\x56\xb7\xf0\x27\xff\x01\x24\x54\x87\x62\xd1\x06\x0b\x65\xe1\xc3\xfb\xba\x69\x91\x25\x03\x99\xaf\x99\x59\xb0\x6b\xd6\x38\xe6\xb5\x28\x81\xb3\xc6\x33\x40\x2c\x4f\x23\xc4\x2c\x02\x2e\x20\x2d\xa2\xed\xb2\x37\x5e\x6d\x2b\x0f\x24\x41\xdd\x2e\x8d\x05\x8a\x13\xaf\x15\x44\x5f\x1c\x1a\xf2\x70\x5d\xf3\x15\x1f\xb9\x5d\x41\xda\x56\x6e\x78\x86\x4d\x07\xf0\x3b\x3e\x96\xbe\x57\x67\x81\xd6\x27\xf0\x95\xc5\xb6\x6f\x1f\x83\x03\xbb\x13\xd0\x5d\xad\x32\x45\xdb\xf5\xb2\xb1\x43\xa5\x88\x70\xa7\xda\x27\x9d\x01\xe3\xf0\x50\x71\x80\x5b\x9c\x0f\x91\x6a\x41\x8e\x16\x2d\x23\xf7\x60\xc9\x20\x0b\x22\x20\x06\x19\xf1\xda\x6a\xd3\x52\x29\xcc\xbd\x6e\x88\x17\xbe\xaa\x3d\xac\xce\xae\x42\x3e\x98\x64\x76\xdf\x9e\x73\x1e\x36\xdb\x82\x9b\x9c\xf6\xab\xc0\xa2\xa3\xc1\x17\x7e\x39\x84\x54\xde\x64\x0f\x2e\xa2\xfd\xcf\x57\x81\x61\x6d\x5d\x58\x06\xe6\xd3\x64\x0e\xe5\x2a\x6b\xb0\x7a\xf0\xad\xc1\xcc\xaf\x50\xf4\x0b\x15\x49\x61\xdc\x30\x11\x3f\x98\x8b\xa4\x2b\x2e\xef\x36\x6d\x54\x64\x65\xbf\x0d\xa2\x33\xa2\xb6\x8a\x6a\x2b\x48\x05\x0b\xad\x67\x87\x5c\x86\x97\x30\x38\x07\xcc\x6f\xa7\x20\x17\xa8\x22\x22\x31\xa0\x17\x0b\xa5\xac\xe7\x5e\x37\x86\x28\x73\xd8\x2c\x4f\xdd\x1a\x8e\x6e\x1a\x86\x1d\xd9\xb1\xb4\x2b\xa0\x45\xc7\xe8\xb6\xae\x73\x7b\x9e\xb7\x77\x47\x21\x03\x08\x0a\x65\x03\x3c\x44\xe6\x2c\x07\xc4\x04\x83\xcb\x45\x7e\xe7\x11\xf0\x67\xbd\xed\x83\xb1\x4e\x7d\x5f\x5e\x7c\xd1\x7e\x0c\xe3\x46\x44\x3d\xc9\x65\x2c\xeb\xc8\x0a\x66\x82\x90\x1e\xfe\x9f\x0e\x6a\xc0\x99\x64\x1b\x50\xe2\x62\x03\x4d\x28\x5b\xc1\x4b\x5d\xe6\x62\x8b\xa2\xdd\xee\x4c\x49\x2f\xb0\xd0\xa6\x08\x13\xee\x03\xef\xf4\xf9\x01\xc3\x46\x2f\x11\xfb\xdf\x67\x65\x47\x95\x39\x50\x0a\xa7\xe1\x79\x55\x4d\x34\x27\x50\x9b\x56\xea\x7b\x3b\x37\x08\x80\xe4\xe1\x5a\x12\x2e\x92\xca\xee\x64\xa7\x9d\x18\x1e\xbd\x76\x78\xec\x20\xda\x80\xc0\x50\xdf\x50\x90\xb4\x4d\xa2\xb5\xc9\x85\x7c\xa4\xf4\x56\x77\xa6\x3c\xc4\x9f\x59\x23\xb6\x3f\x6b\x61\x83\xb9\xc8\x9d\x38\x44\x40\xf4\x9b\x15\x6e\x1d\x0d\x96\xab\xd0\xda\xd4\xd5\xb6\xb8\xed\xb8\x4c\xbe\x82\x83\x4c\xbe\x61\xa7\x75\x1b\x3f\x53\x6e\x41\xbf\x8e\x5e\x46\x7b\xc2\x8d\x07\x6d\x28\x7f\x49\xf3\xec\x97\x87\x47\xc6\xca\x7d\xdd\xb9\xf6\x62\xc0\xa4\x0a\x7f\xe0\x41\x23\x86\x21\x50\xa3\x27\x84\x5b\x12\x48\x3e\x86\x57\x1a\xae\xbd\xd0\xfb\x4e\xd5\xfb\xba\xd1\x75\xdf\x43\xf5\x27\xc7\x5d\x5d\xc6\xb0\xd2\xac\xd9\x81\xd4\x8a\xd4\xbe\x94\x00\x07\xba\xc9\x71\x4d\x7b\xe9\xfb\x20\xb5\x20\xae\xf9\xa2\x72\x11\x03\x32\x8d\x01\x72\x18\x80\x77\xa2\x02\xe9\x01\x37\x2b\x55\x33\xeb\x69\xb7\x77\xda\xb6\xcd\x39\x0a\x2c\x9e\xea\x5a\x15\xbe\x7b\xc8\xc4\x18\x1c\x0a\x36\x19\x0a\x22\x66\x0f\xb9\x1d\x48\x90\xcc\x3b\xbb\x7c\x90\x93\x08\xbe\xf5\x70\x36\x9f\xfd\x92\xc0\x90\x6f\xe0\x54\x00\x5f\x0f\x98\xf3\x37\x99\xd1\x67\xeb\xc3\x99\xfd\x2f\x01\xcd\xa4\xfb\xe5\x36\xf2\x51\x3f\xcc\x9a\xa6\xa6\xcb\xc8\xd0\x51\x3b\xbd\xab\x9b\xac\xca\x3b\x40\x72\x7a\x06\xbc\xa2\xba\x8d\x57\x38\x71\x91\x05\x85\x19\x41\x1e\x52\xc2\xc7\xc4\x06\x12\x71\x79\x61\xe5\x56\xd9\x4e\x83\xd0\x9b\x3b\xb7\x5c\xaf\xdd\x61\x18\x3d\x13\xc8\xd2\xd8\xe2\x40\x94\x74\x1c\xeb\x95\xac\xb5\xd2\xef\x7e\xf4\x51\x99\x27\x98\x0a\x4b\x5f\x9f\xab\x33\x40\x12\x4f\x66\x12\xbd\x72\xfe\xdc\x5a\x75\x41\x36\x07\x1e\xb2\x6e\x80\x4a\x3f\x86\x2c\x7f\xa9\xe3\x49\x7a\x8a\x21\x47\xb3\x97\x35\x8d\x75\x3f\xef\x0a\xbb\x79\x4f\x5e\x3c\x3f\x55\x79\x76\x30\xa4\x6a\x47\xd9\x65\x67\x42\x19\xb2\x68\xdb\xb8\x88\xe4\x2e\x63\x4a\x29\xd8\x78\x2e\xb0\x9d\xfa\x4e\xc6\xe1\x49\x24\xc6\x0c\xeb\x3f\xb8\x79\xde\xa8\x56\x65\x5d\xdd\x82\xda\x69\x1f\xec\xea\x68\x0e\xa4\x18\x8f\x8e\x76\xaf\x8b\x94\x05\xcb\x8c\x15\x17\xe9\xb8\xb6\x23\x05\x59\x13\xae\x0b\x70\xa0\x79\x6e\xd2\xa0\x94\x65\x80\xfe\x46\xfd\xe4\x30\xab\x56\x34\x1c\x95\x87\xe1\xe3\xa7\x17\xd5\x97\xe7\x8c\x06\x60\xf4\xe7\xe7\xea\x4c\xbd\x9f\x2c\x2f\xc7\xd3\xe9\x68\x36\x9e\xdf\x2c\xfb\x51\xf3\xf3\x73\x40\xd2\xff\xe5\xf2\x66\x09\x34\x6e\xc0\xfe\xc6\x7f\x9c\xd1\xad\x72\x0d\x77\x80\xdb\x28\x65\xc1\x75\x5a\x72\xb0\x72\x5d\x66\x07\x44\xab\x79\xef\x9a\xbc\xc9\x38\x33\x23\x4f\xe2\xac\xc5\x09\x61\x4a\xc3\xac\xf2\xab\x1b\x61\xf2\xbb\xec\x6f\xba\x43\xc4\xa4\x75\xe5\xec\x1f\xde\xd5\x39\x09\x81\xd4\x5d\x6b\xec\xc1\x08\x16\xa6\x53\x13\x11\x35\x25\xf6\x08\xc4\xe4\x49\x60\xb4\x46\x9a\xf3\x86\x84\xbb\xd9\x42\x87\x3c\x5b\x83\xcc\x6d\x10\x51\x2c\xb5\x07\x08\xc2\xe7\x2b\xdd\x3e\xd4\xcd\x27\x93\xa8\x75\x59\x6f\x3e\x79\xbe\x10\xfe\x8b\x40\xbc\x67\xea\xbe\x68\x3a\xf0\x36\xb2\xcd\x27\x9f\x35\x68\x08\xed\xcd\xdf\xc4\xf4\x07\x5a\x11\xb8\x8a\xad\xd3\x9a\xa0\x7d\x94\x95\x76\xf5\x66\xa6\x05\x0f\xf8\x21\xb3\x1b\x0f\x2d\xea\x44\xe9\xac\x69\xef\xfe\xde\x65\x9f\xec\xa7\xb7\x85\x1d\x2c\x80\xa3\x1b\x8c\x65\xd8\x35\xff\x89\x65\x20\xb2\x35\xa4\xb2\x1b\x6d\xdd\xe6\x07\x6b\xd6\xe9\x76\x93\xfa\xf5\x40\x1b\x70\x9b\x6d\xe8\xca\x0c\x56\x81\x9d\x35\x3b\xc1\x00\xb8\x07\xb5\xd4\x46\x19\xbb\x73\xb2\x52\xd5\x9b\x4d\x46\x6f\x04\x75\x94\xfb\xfa\x93\xee\x7d\x66\x1b\x87\xd8\x98\x4f\x13\xd7\x57\x37\x1c\x40\x5f\xd3\x80\xed\x1b\xdd\xe2\x11\x8d\xa8\x8a\x0c\xb5\x32\x1b\x3e\xff\xe0\x43\xe8\x42\x62\x7b\xe9\x1c\x8c\x5c\x6d\x6a\x1b\x84\x53\x5c\x53\x88\x1c\x96\x7c\xf7\xf2\x20\xc6\x84\xec\x77\xbf\xa5\x37\xb6\x59\xa5\x61\xef\xae\xcc\x36\xda\x84\x86\x88\xbe\x2f\x6a\x3b\xe5\x7d\xc5\x55\x26\xf2\x83\x78\x46\x56\x26\xc1\x55\xca\xe1\x16\x3c\x2d\x9d\xd4\x04\xf0\x4b\x04\x1c\xa9\x3e\xe0\x40\x77\x4b\xd5\x16\x8d\xf6\xda\xf2\x3e\xbf\xc6\x8f\x87\xde\xf2\xf3\x37\x75\xb5\xd1\x4d\xe5\x82\x4a\xf4\x6c\xb8\x1b\x7d\x95\x6a\xcc\xe2\xf9\x28\x78\x93\x11\xec\x2e\x8e\xe9\xd2\x96\xd1\x35\xc8\x6d\xe8\x2a\xb0\xe3\xd0\x63\x83\xf0\x60\x51\xc1\xe8\xb0\xdf\x6c\x8a\x5b\xaf\xff\x5a\x34\x2a\xef\xca\x83\x3c\xdf\x9d\x2f\x88\x5c\xab\x62\xc2\x5e\xa6\x03\xc0\x87\x2f\x5c\x8a\x48\x3a\x0a\x09\x7b\xa9\x85\x93\xb9\x78\x89\x3d\xe3\x10\x69\x24\x94\xe9\x33\x8c\x13\xba\x0c\xed\xbd\x06\x86\xd7\x04\x87\xf7\xc8\x5f\x39\x1f\x92\x7d\x82\xc0\xc6\x46\x43\xcc\xd5\x47\xd2\x79\xa4\xc8\x4f\x20\x19\x25\x21\xd2\x9f\xed\x74\x95\x63\x7c\xd5\x55\x0e\xc0\x5e\xe9\xdd\x1c\x8f\x35\x03\x15\x2b\x5b\x57\x38\x2b\x86\x24\xb8\xbb\xfc\x7d\x2d\x53\x23\x6d\x70\x5a\x64\xfe\xdb\xfd\x9b\x90\xce\xfc\xaa\x2b\xd1\x06\xbd\xaf\x8b\xdc\x73\x00\xa3\x70\x08\x28\xdf\x99\x1a\x6f\xe3\x38\x84\x10\x3e\x0e\x82\xc2\x54\x67\x59\xf7\x1e\x2c\x96\xc3\xab\x54\x4d\x47\xb3\x77\x37\xa3\x77\xc3\x75\x62\x05\xf1\xe7\xe1\xa5\x0b\x38\x38\xe2\xc8\xb3\x0f\x1b\x57\xb7\x65\x61\xee\x86\xac\x2f\xb7\x44\xc4\x12\x87\x9d\x49\xec\x0b\x38\x3a\xf4\x2c\xa6\xc2\xee\x15\x6b\x76\xed\x1d\xe4\x76\xc3\xeb\xfb\x42\x9d\xa9\xd9\xf8\x83\xfa\x79\xbc\x80\x2b\x9b\xcb\xb8\x1c\x51\x21\xf7\xef\xc2\xde\xe1\x23\x19\x8a\x6d\x0c\x6a\xdb\x87\xb6\x90\xd0\x75\x0b\x25\x2d\x65\x06\x39\x10\xb4\xf6\x6f\xb8\x48\xd5\x32\x22\xb3\xda\xd4\x77\x28\x5a\x83\x9d\x7c\x20\x7c\x77\xbf\x9c\xb4\x30\x5c\xcb\x46\x91\x3d\xd0\x4c\xa3\xd4\x96\x24\xc1\x68\x63\x42\x3d\x2d\x91\x45\xa0\xc1\x07\x61\x32\x1f\x94\x21\x23\xa3\xa8\x73\x32\x5d\x59\x8e\xbd\xdb\xe7\xa8\xef\xdc\x84\xca\xec\x7d\x98\x08\x98\xcf\xb4\xc3\x5d\xc2\x49\x88\xa7\xa3\x28\x46\x4c\xd1\x82\x56\x33\xd5\xa2\xdb\x37\x14\xc6\x74\xda\x20\xbd\x11\x5c\x42\xd0\xa3\x80\xc7\x49\x0c\xe7\x8b\x60\xc2\x96\x3d\xe5\x17\x81\x78\x43\x7a\xa8\xa3\x3a\xe9\x72\x2c\xe5\xed\x35\xf0\x2c\x77\x91\x1c\x7b\x18\x12\x4a\x0c\x74\x37\x79\x1c\x06\xc6\x58\x1a\x44\xdd\x05\x8b\xf8\x85\x3a\x53\xef\xe6\x3f\x8f\x17\xb3\xc9\xec\x9d\x9a\x8e\x3e\x40\x85\xc7\x9f\x6e\x16\x93\xe5\xd5\xe4\x52\xfa\x37\xae\xa8\xf9\xa8\x08\xb8\xa7\xad\x0c\x53\x13\x94\x90\x00\x35\x10\x9d\xdd\xa3\x45\x6e\x74\xdb\x52\x85\xb8\x35\x9b\xf8\x99\x86\xbc\x80\x3d\x5d\x9c\x64\x88\x66\x4d\x61\x82\x82\x4c\x99\xbf\xe9\x8d\x79\xdd\xb5\x67\xf5\xf6\x0c\xb8\xf3\x52\xdf\xfe\x0b\x77\x42\x64\x6b\x11\xa3\x0e\x3e\x4e\xed\x22\x51\x71\xa4\xab\x7b\xa8\xd5\xc9\xc5\xa9\xda\xd5\x55\x7b\x07\xf0\x1f\x8e\xf8\x17\x8d\xa8\xc1\xc6\x5b\x81\xee\x4c\x0d\x54\xed\xd5\xe6\x10\x04\x17\xec\x12\x72\x77\x43\xf2\x99\xbe\x8b\xf8\xf1\x56\x37\x8d\x4f\xda\x21\xed\xe1\xa5\x6d\xad\xab\x22\xff\x5b\xd7\x14\x26\x67\xc9\x48\xda\xaa\x58\x51\x7d\xed\x24\xd3\xa1\xf2\x68\x83\x80\x1d\xaf\xa4\x7c\x6e\x47\xe1\xfc\xf9\x37\x17\xdf\x7e\x73\xf1\xfc\xf9\xcb\xdf\x9c\x2f\x38\xfd\x66\xf4\xf6\xdf\x4a\xfe\xfb\x79\xfd\xef\xf3\xe7\xaf\x5e\xf7\xf5\x3f\x7e\xe7\xff\xfd\x55\x7e\x46\x9b\x2c\xd7\xbb\x62\x83\x67\x73\x5f\xf9\xfb\x1c\x0f\xa1\xa1\x4f\xfd\x1f\x2f\xf3\xf1\x74\x40\xbe\x63\xb8\xa7\x5e\xb6\xe3\x3c\x7d\xfa\xe4\x1d\x04\x90\xeb\xad\x97\xc2\x38\x5e\x0d\x0e\x6a\x0e\x68\x81\x38\xb1\x8c\xa8\x52\x21\xa4\x25\x3f\x01\x4d\xe5\x53\x6b\xca\xd5\x4d\x99\x9f\x3d\x14\xb9\x4e\x58\xf4\xe1\x6c\x90\xbd\x63\xaf\x9b\xbd\x6e\x3b\xeb\x3c\x81\xd6\x9e\xd3\xa5\x00\x53\x9c\xfe\x6d\x0f\xe6\x93\xf3\xd3\x2f\xd4\xba\xa0\x03\x3f\x09\xc4\x15\x09\xc6\xa4\x21\x25\x7b\x5c\x1f\x22\x94\xd4\x86\xd5\x20\x84\x22\xb2\x2a\x87\xa6\x5c\x9c\xd2\xa8\x63\xb0\x5c\x51\x5c\xd3\x2e\x86\x9c\x20\x06\x6d\x53\x97\x65\x0c\x10\xe0\x7c\x01\xd0\xfb\xed\x80\x7f\x38\x3f\x42\xf0\x0e\x95\x7c\x15\xf0\x07\xc6\xcf\x48\xb8\x38\x34\xc1\xd1\x80\x4e\x01\x99\x21\x00\x96\x10\x2c\x47\x17\xe6\xd7\xf4\x2e\x32\x0c\xfc\xba\x94\x12\x11\x0b\xae\xd2\x1c\xb5\x1e\xd4\xa9\x16\x41\x44\xfd\x31\x3d\x07\x8f\x8c\xc4\xec\x78\xac\x40\xfc\x0f\x8c\x06\x13\xd4\xf4\xbf\x87\xe8\x26\x59\x41\x1e\x92\x3e\xd1\xaa\x20\x91\xe2\xac\xd5\x4d\x91\x95\xc6\xc7\x8f\x5d\xa0\x6e\x28\x5f\x10\xbd\xaa\xc7\x15\x95\x3e\x19\xe3\x32\x07\xa0\xb5\xb5\x03\x78\x47\xc2\x1e\x4c\x5d\x50\xae\x75\xca\xad\x6e\x5b\xda\x6e\x55\x75\xf4\x27\x92\xb7\xf0\xd0\xcb\x61\x1d\x8e\x8a\xa3\x79\xcc\x92\x29\xd5\x0f\x1c\x2f\x15\xe4\xf6\x4c\x12\x30\xfd\x7c\xb5\x0a\x5b\x38\x04\x9c\x53\xe4\xb4\xe5\x31\x25\xb6\x18\xb7\x94\x3e\x71\x7a\x1a\xd6\xa2\xbc\x9a\x2c\x41\x7a\x62\xbc\x58\xa6\x54\xdb\x31\x5f\x30\x30\x62\xa9\x56\x3f\x8d\x56\x04\xea\x66\x0d\x8b\x09\x16\x1b\x93\xa2\xc6\x7c\x31\x79\x37\x99\x8d\xa6\xea\xc3\x7c\xf1\x67\x35\x59\xaa\xf9\x87\xd9\xf8\x4a\xbd\xf9\x08\x7f\x75\x0f\x04\x39\x09\x7a\x54\xef\x2b\xae\xb6\x06\xbf\xe8\xbe\x74\x33\xbb\x1a\x2f\xd4\x48\xfd\x3c\x9a\x4e\xae\xd4\xe5\xcd\x62\x31\x9e\xad\xb8\x00\x05\x14\x2d\xa2\xa6\xd9\x77\x2f\x20\x2c\x3b\xbe\x5e\xa9\xd1\x92\x45\x42\xa6\x1f\xd5\x72\x05\xd8\x53\x52\xae\x98\xbc\x7f\x3f\xbe\x9a\x8c\x56\xe3\xe9\x47\x75\xbd\x18\x5f\x8e\xc7\xa0\x1a\xb2\x1c\xcf\x56\xe3\xd9\xe5\x38\x19\x6e\xa7\x93\x28\xc1\x86\x81\xb6\x1d\xb7\x06\x4a\xb0\x9d\xaa\xdd\x9b\xd1\x72\xb2\xec\x2b\x98\x24\x6a\x3c\x01\x25\x8d\x47\xc5\x4b\x8e\x4b\xdb\x49\x25\x94\xd9\x7c\x76\x26\x75\x48\x50\x49\xcf\xeb\x9b\x1c\x1f\x6e\x2f\x7b\x32\x05\x71\x8f\xb7\x93\xd5\x63\x12\x78\x3f\x8d\x81\x1c\x60\x31\x56\x8b\xc9\xf2\xcf\x76\x54\x69\xea\xff\xe3\x66\x04\xe5\x41\xe4\x5e\xf7\xde\x03\x65\x43\x1f\xe7\x37\xa4\x02\xe8\x57\x9a\xfd\x86\xeb\xca\xe5\x7c\xb6\x5c\x4d\x56\x37\xab\xf1\xd2\x8e\xe0\x78\x69\x27\x61\x32\x9a\x42\x63\xf0\xd9\x7e\x98\x53\x35\x9b\xbb\x21\x5f\xcd\xfb\xef\x64\x8e\x96\x9f\xc6\x8b\x31\xce\x12\x2d\x06\x31\x65\xbe\x21\xe9\x13\x3f\xc2\xf6\x55\x0e\xe4\x98\xd2\xe7\x67\x73\x75\x39\x59\x5c\xde\xbc\x5f\x02\x8d\xd4\x12\x06\xd9\xfd\x69\x3a\x7e\x37\x02\xb1\x97\xf9\x42\xc8\xb3\x80\x08\xcb\x89\x97\xa2\x99\x8d\xdf\x4d\x27\xef\xec\xb2\x3a\x4d\x84\x56\x4b\x28\xd3\xe2\x75\x63\xdc\xea\xf7\x1a\x31\xab\x39\x48\xc4\x5c\x8f\x17\xcb\xf9\xcc\x29\xc6\x5c\x4d\x16\x63\xfb\xa0\xc9\x8c\xff\xb5\xbc\x1e\x5f\x4e\x46\x53\x58\x4a\x93\xab\xf1\x6c\x65\xff\x0d\xfa\x33\xb3\xe5\xf8\x3f\x6e\x68\x5c\x9d\xc4\x0c\xaa\xe9\x5c\xfe\x34\xb2\x0d\xb2\x1b\x8d\xa4\x62\x46\x4b\x35\x52\x8b\xf1\xf2\x66\xda\x1b\xff\x40\x16\x66\x70\xda\x1f\x5f\xc4\xfc\x6e\xdb\x87\xe9\x7c\x09\x8d\x78\x37\x9f\x5f\x7d\x98\x4c\xa7\x09\x3e\x61\xb9\x9a\x5f\x5f\x8f\xde\x8d\x13\x28\x42\xbb\xb1\x0d\x7b\x3b\x9a\x4c\x6f\x50\x93\xe6\xfd\x68\xfa\xf6\x66\x76\x89\x4f\xa3\x81\xb0\x73\x62\x47\x0f\x45\x6a\x2e\xe7\xef\xed\x02\x0f\x7a\x8a\x2f\x1b\x2f\x13\xc8\xd3\xa8\xc9\x5b\xb5\xbc\xb9\xfc\x89\x07\x14\xc7\xfe\xa7\xd1\xcf\x63\xf5\x66\x6c\xff\x3c\x7b\x3b\x5f\xbc\x1f\x5f\x71\x0f\xaf\xe7\xcb\x25\x97\xc2\xcd\xe9\xab\xf4\xe8\x94\x47\x67\x70\x15\xd1\x93\x67\xf3\x95\x1a\x5d\x5f\x4f\x3f\xda\x89\xf4\x7f\xb4\x63\x70\x35\x1e\xad\x7e\xb2\xed\xc3\xa6\x8c\xa6\x6a\x32\xfb\xd3\xcd\xe2\x23\x0d\x3f\x0b\xf7\x50\x73\x47\x8b\xd5\xc7\x67\x4b\xb1\xa0\x78\x27\x8e\xff\xb2\x82\x13\xe0\xfa\x7a\x3a\xb9\x84\x25\x33\x1d\x7d\xb0\xc7\xd5\x4f\x93\x37\x93\xd5\x12\xbf\xee\x1b\x99\xaa\xe5\xfc\xfd\x38\x08\x26\x2c\xd5\xd5\x1c\x1b\x3a\x9d\xce\x3f\xd0\x43\x2f\xa7\x37\x4b\xe8\xd3\x22\xea\xa1\x5f\x5f\x47\x97\x57\xa2\x96\x73\x1c\x1c\xff\x1c\x3b\x51\xe2\x41\xef\x47\x1f\xc3\xb1\xb1\x67\x05\x0b\xe5\xd9\xeb\x51\x72\x9b\x3a\x44\xbd\x7a\x2a\x7e\xfd\x54\x70\x7b\xee\x9d\x3f\x0e\xa9\xb3\x41\xbb\x61\x8b\x6c\x23\x7d\xf1\x31\x80\xe0\x60\xea\xd9\x9a\x77\x2c\xb3\x1f\x59\x30\xb9\x36\x9b\xa6\x58\x03\x6d\x4f\xfd\x00\x46\x3b\x96\xad\x42\x70\xce\x57\x7f\x05\x2f\xed\xdb\xfc\x10\x58\x30\xb2\x68\x21\xeb\xab\x78\x4b\xbb\x3f\x28\xa5\x1e\x34\xa4\xa1\x4a\x0a\x0c\x28\x08\xcb\x1d\x77\x1a\xc0\x22\x96\x28\x01\xa6\x34\x15\xcd\xa4\x68\x61\xc4\xfa\x61\xb2\xb6\x30\x5b\x52\x0e\xf0\xf9\x71\xa8\xf6\x2d\xb3\x0d\x7a\x2b\x5f\xdc\x0d\xaa\xcd\x61\xa1\x87\xba\xb2\xb6\x6a\x6d\x8a\xb6\x6e\x0e\x5e\x09\xfb\xa0\x36\x59\xb9\xe9\x4a\xe6\x69\x07\xb3\xa6\x55\x45\xa5\x7f\xd9\xeb\x0a\x98\xed\x29\x99\x72\xaf\xab\x02\x42\xdb\x38\x21\xeb\x03\x48\x5a\x43\x84\xdc\x40\x92\xdb\xfe\xd7\xf5\x90\x70\x4b\x38\x09\x51\x6e\x3b\x32\xf0\x88\x9a\x84\xfc\x1d\x76\x1c\x39\x82\x09\x3d\xcb\xda\x63\x1d\x81\xf2\x8c\xaf\xf7\x42\xd1\x6d\xf1\x3e\x73\x7f\x4d\x3d\x79\xdf\x01\xa6\x68\x25\xf2\xe7\xb6\xb3\xd7\xe8\x22\x8d\x30\x9a\x84\xfc\x44\xbc\xa3\x28\x67\xe2\x30\x0a\x21\x76\xc1\xf6\xd3\xab\x80\x33\x2e\x80\x49\xfe\x1e\xe1\xf8\x6b\x6b\xf8\x1e\x6b\x4a\x38\xf1\xbd\x2d\xce\x40\x51\x6a\x10\xf0\x7e\x30\x1d\xd2\xbe\xa3\x61\xdd\x35\x00\x2d\xd4\xb7\x0e\xf8\x68\x7f\x3f\x5f\x4e\xd4\xa5\x6e\x5a\x2a\x1d\xf6\xd2\x13\x1e\x20\xc5\xa0\xf0\x32\xf4\xc8\xed\xb7\x59\xce\x42\x90\x08\x42\x93\x9e\x7e\xc9\x60\x3d\xb5\x7e\x25\xc8\x30\x13\xf6\x09\xf3\x92\xa1\xcf\xe9\xfd\x49\x63\x08\xa7\xec\x88\xc1\xb2\x56\xc8\xef\xac\xa4\xbc\x06\x44\x05\x9d\x4e\xe8\xe5\xa9\xba\x78\xfe\xfc\x42\x4d\xb3\x07\xe4\x88\x1c\xa7\x6a\x51\x1b\x5d\x61\x36\x89\x46\x97\x81\xad\xa9\x54\x9f\xec\xa9\x35\xb2\x22\x45\x9c\x98\xe8\xa9\x7b\xc4\x02\x92\xb4\x34\xf8\x23\x42\x21\xda\xe5\x15\xf8\x6b\x08\xc0\x41\x27\x63\xd8\xbd\x40\xa9\x24\xa7\x47\xfe\x50\xe9\xe6\xff\x3c\x79\xb3\xdf\x7f\x3e\xf3\x93\x7e\x73\x39\x5a\xcd\x97\xbf\xa1\xfe\xdb\xcb\x57\x2f\xbf\xed\xe9\xbf\x5d\x5c\xfc\x1e\xff\xfd\x55\x7e\x2e\x59\xa8\x64\xc4\xa8\x7e\xa3\x56\x4d\x07\x98\x91\xb9\x3d\xa9\xe9\x7a\x1f\x88\x0c\x3f\xb9\x9e\x8e\x47\xcb\xb1\x5a\x8c\x47\x57\xe4\x83\xcd\x2f\x6f\x50\x33\x6e\xb4\x18\xbf\xbd\x99\x4e\xd1\x8c\x9f\xcc\x94\xb5\x57\xd1\xdf\xb4\x6e\x18\xe4\x6d\x2f\x81\x8e\x62\xf6\xd1\x9a\xc3\xd7\x8b\xf9\xbb\xc5\xe8\xfd\xa0\x3b\x3e\x06\xf8\xdf\xd2\x39\x2d\xce\x81\x18\x2d\x97\xf3\x4b\xeb\xee\x2f\xd5\x6a\x71\xb3\xb4\x0e\xe2\xfc\x7a\x3c\x53\xcb\xf9\xcd\xe2\x72\xec\x9c\x9b\x93\xa7\xf4\xaf\xa7\xa7\x29\x78\x16\x37\xd6\x35\x5b\x8c\xaf\x17\xf3\xab\x1b\xf2\x39\x24\x3f\x96\x35\x7e\x63\x5e\x10\x70\x18\xa8\x8d\xd2\xb5\x05\x1e\xd1\xf1\xe5\xe4\x7a\x32\x9e\xad\x9e\x2d\x05\x37\x71\xcf\xc7\x75\x26\xf0\x9b\x6c\xf3\xe9\xb6\xa9\xbb\x2a\x7f\x32\x34\xf8\x93\xaa\xd5\x4d\x45\x1a\x5a\x89\x9a\x54\x9b\x54\x9d\x5c\x8e\x4e\xd5\x5a\x97\x85\xbe\xc7\xf0\x9e\xb8\x43\x53\xf5\x41\xf3\xdf\x3c\xa8\x59\x5e\xb2\x92\x71\x2e\xdb\xef\x9b\x1a\x6c\xc9\xac\xa2\x14\x95\xfd\xcd\xbe\xb1\x2f\xf7\xd7\x31\x09\x24\x80\x99\xd2\x55\x8c\xc5\x00\x59\x21\xfb\x30\xb0\x90\xfe\xde\x65\x58\xad\x79\xdb\xd4\x0f\xed\x5d\x42\x21\x42\x84\xb4\xc3\x5d\x54\xab\x5c\xef\x20\xfd\x0f\xfc\x77\x9d\xb3\xd0\x30\x20\xca\xc5\x70\x50\x27\xea\xdb\x9b\xa8\x07\x4d\x55\x20\xa5\xce\x0c\x9b\x53\xd7\xa4\xd9\x70\x02\x84\x00\x5b\xc0\x4c\xae\x75\x59\x3f\x9c\xf6\xcb\xe8\xf8\xaa\x9e\xfa\xab\x1a\xca\x62\xf3\xc0\xde\xdc\xc4\x25\xd8\x8d\xde\x14\xfb\x82\x49\x21\xe5\x4b\x05\x4f\x28\xfd\x4a\x6a\xf5\x22\xbe\x5d\x88\x74\x93\x98\x8d\x14\x6f\xde\x09\x53\x8b\xd0\x46\x58\x36\x5c\xef\x18\x67\x22\xe7\x8c\xc1\x96\xd6\x7a\xb0\x0f\xb8\xbd\xb3\xa3\x62\xed\xe3\x0d\x4e\x30\xf4\xb9\x84\x2a\x1b\xd7\x22\xfb\xbe\x90\x68\x61\x60\xb0\x00\x59\x04\x72\x34\x9b\x3b\xff\x55\xac\xf2\xcf\x68\x69\x25\x91\xd1\xc7\x14\x0c\xc1\xf0\x1d\xea\x2e\x20\xac\x38\xd8\x09\xae\x1f\xaa\x81\x55\xc4\x8c\x7d\xc1\x53\x29\x77\x6b\x1f\xc3\x44\x08\xb5\xca\x6b\x65\x6a\x6b\xc6\x74\x26\xc1\x44\x3e\x3c\x36\xec\x15\x67\x66\x69\x72\x86\x34\x8e\x63\xc1\x92\xe8\xe5\x28\x63\x28\xd2\xf6\x44\x1e\x6a\xed\x77\x51\xd8\x72\x14\xdc\x25\x39\x49\x0e\x64\x5e\x47\x0b\x04\x32\xe1\xe7\x69\xac\xdb\x03\xbf\x3c\x0f\xf9\xc2\xd0\xdb\x3d\xc9\x4e\x1d\x87\x41\x86\x70\xed\xcb\x51\x12\x7a\x09\xf4\xec\x1f\xb1\xa4\x71\xdd\xfb\x02\xb8\x89\x92\x91\x5f\x14\xf2\x5c\x8e\x4e\x13\xa7\x24\x0d\x3e\x71\xee\x6a\x9b\xeb\x70\x69\x23\x05\x01\xac\x10\xf1\x85\x6f\xea\xe6\xe8\x77\x9c\xb2\x89\x2b\x35\xc9\x55\x0c\xe1\x00\x5f\x22\x6b\x65\x39\x91\x6c\x2a\x1c\x35\xd9\x76\x5b\x94\x58\x5b\x16\x30\x26\xa6\x6a\x14\x8e\x99\x7b\x9f\x61\xd2\x73\xf9\xac\x62\x0b\xb5\x01\x99\x21\xe9\xa7\xa8\xb1\xeb\x03\x76\x2e\xf8\x0a\xe6\x39\x30\xf0\x5f\x57\x98\xbb\x47\x41\xf4\xf8\xb3\x46\xad\xf5\x5d\x56\x6e\xd3\x68\x5d\x12\xa5\x13\x0b\xab\x1f\x1d\x2b\x58\x37\x3f\xa8\x93\x5f\x4e\x61\x8c\x1c\xcc\x06\xc5\x0d\xe8\x58\x18\xc0\xc0\x20\x2d\xe6\xdf\x08\xb8\xeb\x33\x2b\xfc\x5c\xb7\xe8\x0b\xdc\x88\xec\x07\x64\xa1\xe8\xd2\xc9\x01\xdf\x6b\xdb\xda\xcb\x64\x85\x07\x9f\x83\x73\xa4\x17\xc1\x60\xe1\x8a\xbd\x1c\x79\x11\x27\x51\xc1\xa6\xa0\xfa\xad\x45\x1e\x81\x01\x85\x95\xde\xb3\x5f\x04\xcf\x66\x0b\x83\x98\x8b\x31\x8b\x3a\x20\xbf\x11\xc1\x76\xdc\x51\x8d\x8e\xbb\x60\x38\x0d\x66\x2e\x58\x44\xeb\xae\x45\x12\xae\xea\x10\x4d\x25\x9f\x92\xe1\x93\x75\xa3\x03\x0e\xce\xf3\xf4\xa5\x9a\x66\x8d\x75\xa9\x31\x3b\x47\xda\x29\x0f\x2e\x26\x43\xca\x13\x26\xda\x2b\x3d\x01\x7d\x9c\x4c\xa0\x9a\xb2\x0d\x0a\x35\x1d\x8f\x1e\x62\xdc\x8a\x57\xca\x65\xb2\xaf\x89\x5c\x1b\xb4\x2b\x98\x69\x1b\x17\x02\x44\x6e\xa0\x62\x37\xd8\x76\xec\xfc\xb2\x87\x9c\x0b\x39\x3e\xc5\x79\x50\xf2\x07\x43\x76\xdb\x92\x20\xa4\x50\xee\xea\x34\x36\xe2\x65\xe9\x9b\xf9\x6d\xef\x20\x13\x81\x3e\x87\x1e\x88\xe6\xd5\xf4\x24\x3e\xe2\xbb\x09\x70\xe4\x77\x04\xa6\x03\xe4\xa1\xb5\x1b\xb0\x1f\xf6\x04\xf5\x47\x60\x70\x49\x0b\xb1\x11\x74\xb4\x43\xc1\xac\x02\x92\x85\xbe\xf1\xaf\x07\xda\xdc\xeb\x4e\xef\x06\xf6\xdf\xff\x4e\x2d\xd8\xbc\xf0\xda\x2a\x76\x00\x1f\xee\x6a\x76\xcf\x41\x25\x68\x0f\xff\x85\x22\xe0\x30\x96\xd7\x1b\xd4\x8b\x14\x33\x23\xd6\xd6\x0c\x98\x81\x2f\xd2\xf3\x98\xc5\x61\x70\x05\x25\xfd\x0b\x23\x04\x30\xf8\x26\x67\x95\x2a\x9a\x46\xdf\xd7\xc4\x49\x13\x41\x10\x9c\x5e\x48\x08\x55\xf0\x62\xd0\x82\xcf\x27\x51\xfb\xc6\x1e\x79\x7a\xe8\xf4\x21\x0c\xc2\x06\x21\x7b\x7b\xa8\xa2\x70\xbf\x39\x82\x4a\x50\x1e\xf1\x10\x6e\x78\x66\xe2\x8a\xce\x6f\x9e\xdc\x84\xbe\xbc\xb9\xeb\xb5\x04\x8a\x3d\x63\xbd\x50\xb9\x62\x20\x3b\xed\x54\xf8\xb2\xfb\xba\xc8\x19\x1d\x97\xd7\xdd\x9a\x6a\xab\xb9\x55\x5e\xbc\x90\x2a\xb0\x97\x24\x65\x60\x67\xca\xa3\x7a\xdd\xcd\x21\xc7\xcd\x1e\x4e\xbd\xed\x0d\x70\x5b\xd1\xa5\xd4\xcd\xfc\xc5\xff\x7e\x33\x2f\x90\xab\xbe\x07\xf4\x7b\x10\x99\x6e\x05\x86\xbb\x8f\xcb\x48\x3c\x8b\x8c\x83\x69\x14\x3b\x7b\x82\x7e\xe5\x6c\x7f\xd1\x94\xae\xc4\xb4\x89\xd2\xa3\x68\xd6\x2e\x02\x7e\x78\xcf\xef\xb1\x8e\xca\x9e\x06\xe9\xc0\xf9\xb4\x28\xb6\x49\x40\x1b\xd0\xfb\x42\xc1\xf6\xcb\x90\x06\x15\x16\xf7\xb0\x0a\xd6\xd0\xfb\x00\x24\x6e\x8e\x0e\xff\x3a\x3a\xf3\xd1\xde\xf3\x7d\x48\xd5\xac\x6e\xed\x69\xce\xc5\x88\x04\x69\x69\xf4\x6d\x0d\x55\x43\x55\x2d\x83\xa1\x3c\x58\xc2\x1b\x13\xe3\xf5\x03\xd8\xb7\x8c\x6d\xdf\x10\x7d\x2c\xa3\x67\xac\x95\x10\x1a\x4f\x51\x77\xd9\x2a\x00\x35\x06\x60\x66\x2f\x0c\xab\xb1\x1b\x44\x5e\x14\x15\xd1\x6a\x0f\xd5\x87\xe1\x2d\xfb\x23\xd8\xcc\x71\x29\xac\xc1\x81\x02\x4e\x59\x20\x4f\x91\xb5\xbe\x61\x42\x29\x1e\x65\xdf\xb0\x1f\x15\x58\xdb\xa4\xae\x13\xad\x84\x01\xdb\x62\x7d\xc0\x1d\xd8\xb3\x43\x51\xc1\x0b\xcc\x29\x77\xf5\x9d\xe8\x5f\x36\x7a\x0f\xb0\x7a\x49\x5a\x33\xd0\x0c\xa0\xf4\xc0\x6f\xe7\x1a\x18\x9e\xb0\x61\x9b\x53\x7c\x30\xd7\xf6\xb6\x75\x7f\x49\xf4\x0c\x00\xb7\x4e\x7b\x30\xde\xe1\x0e\xc1\x3c\x0e\x1e\x4a\x2f\xc4\x79\xe2\xeb\x5b\x39\xf2\xce\x1e\x6e\xef\x48\x62\x18\x9d\xdf\x92\xae\xac\x3e\x6c\x41\xcc\x94\x9e\x28\x31\x62\xe2\xec\xf5\x0b\xf2\x25\x2c\xdf\xcc\x98\xae\xc1\x9a\xaa\x40\x00\x80\x98\x22\x7a\x76\x92\x1c\x95\x7e\xb9\x78\xeb\xc4\x4d\xfc\x2c\x7c\x8e\x6d\xed\xb8\xf1\x9c\xaa\x71\x3c\x1e\x61\xf9\xaf\xa0\xeb\xaa\xc5\xf8\xda\xe5\x4d\x9f\x62\x79\x67\x26\xbe\x18\x36\xd2\xd7\x60\x2c\x81\x2e\x80\xa8\x0f\xb7\x16\xdf\xa3\x6d\xa7\x1e\x3e\x14\x46\xa7\x2c\xc0\x5d\x79\x4d\x3e\xa1\x1c\x2e\xd2\x4b\xc8\x9b\x4c\x53\xd9\xd3\x93\xa2\x5b\xc9\xf7\x85\x53\xab\xc6\x74\x3b\x6d\x90\x9e\x33\x24\x0b\xc3\x5b\x61\x03\xe5\x47\xae\x8b\x8f\x36\xbc\xd2\x3a\x07\xf6\x85\xc0\xc0\xbb\x48\x5f\xf6\xc7\xdb\xb3\x6b\x60\x2c\x07\xab\xa4\x7d\x05\xec\x5d\x86\x7a\xa3\xf0\xe4\x44\x41\x51\x1d\x85\xc1\xb0\xf0\x4e\x90\x12\x1e\x58\x36\xbd\xea\xaf\xdf\xc4\x95\x03\x07\xb9\x59\xaf\xdf\xe6\xf3\x30\x6e\xf0\x02\xfa\x8d\x9e\x5b\x10\x0b\x49\x2c\xc6\xff\x71\x33\x59\x00\xa4\x68\xe9\x65\xd3\xd4\x24\xf4\x9d\x22\x21\x58\x10\x72\x0f\xef\x47\x30\x6b\x2a\x2c\x6b\xda\x15\x20\x54\x43\xd9\x4d\x8e\xc2\x48\xfe\x5f\x6c\x3a\x14\xea\x23\x88\xd0\xa8\x07\xb8\xc1\x0d\xa7\x0c\x51\x07\xa7\x67\x7c\x83\x4a\x20\xa7\x10\xdb\x48\xba\x9d\xd1\xbc\xa2\xd5\x3e\xb5\xef\xe8\x81\x7a\x67\xaa\x4c\xe6\xd6\x15\xa4\xfa\x61\x52\xef\xa8\xbe\x0d\xe1\xb9\xf1\xdb\x82\xc0\x03\x95\x87\x8b\x70\x55\x98\x64\x16\x07\x66\x3c\x70\x11\xe3\xdd\x80\x6b\x1e\x10\xa7\x0b\x2a\xce\xff\x9f\x82\x58\xa5\xe4\x4c\x3f\x1a\x97\x8a\xac\xbc\x1f\x19\x6d\xeb\x9f\x64\xfa\xaf\x0e\xde\xe5\x8a\xda\xd0\x00\x67\x54\x6e\x45\x21\x0f\x16\x1f\x0a\xe9\x2b\x3d\xf3\x09\x17\x6b\xfa\x36\x25\x2e\xcd\x48\x76\x5b\x59\x20\xf7\x09\x3b\x65\xe2\x9b\x98\xc3\x97\x9d\x71\x3b\xca\x5a\x9d\xf2\x7c\x4a\xe4\xe3\x1e\x7d\xc6\x4e\x37\x9b\xbb\xac\xf2\xda\xe9\x55\xae\xb6\x45\x0b\x5c\x58\x60\x8f\xc8\x80\x94\x2b\x2a\x25\x93\x6e\x97\xfd\x52\xec\xba\x1d\x9b\xa9\x18\xfa\xa4\x60\x96\x28\x77\x2c\xb3\x87\x1f\x8f\x8d\x22\xd8\xca\xb9\xfe\x92\x41\xf4\x27\x3a\x88\xcf\x43\x39\xb3\x91\x63\x85\x0c\x6c\x89\xe3\x21\x4d\x50\x5c\x2a\x2b\xe1\x43\xc0\x89\x4a\x7c\x16\x21\xed\x96\x7b\x14\x55\x84\xab\xb2\x36\xad\x67\x1b\xfb\xe7\x3a\x6b\x37\x2b\x57\x0f\x41\x72\xdd\x87\x55\x49\x57\x19\x09\xb5\xed\xa1\x6d\x5a\x2e\xf5\x09\xdd\x78\x20\x49\x91\x7c\x70\xa1\x25\x41\xb1\x06\x5c\x08\xf1\x7d\x66\xed\xb4\xde\x4a\x97\x8d\xfa\xba\xc3\xa3\x67\x91\x31\x3f\x18\x91\xcb\x4b\x1c\x33\x27\x3d\x50\xa5\xb5\x74\x4c\xfb\x84\x23\xa2\x23\x85\x10\x12\x1e\x00\xa3\x89\xb4\x56\xe8\x27\x7a\x86\x79\xd1\x32\x54\x46\x76\xcd\x8b\xfc\x17\xfb\xd2\xf8\x9c\xe0\x53\x38\xfa\x66\x3f\x43\xd2\x1b\x30\x59\x93\x20\x26\xa6\x77\xac\x0f\xc3\x91\xa2\x58\xcf\x8b\xf4\x85\x7a\x2c\x03\xb3\xcd\x36\x76\x9d\xb3\xba\x10\x28\xd1\x37\xc0\x91\x39\x84\x12\x17\x61\xdb\xc8\x2a\x13\x4c\x15\xc1\x66\x72\x65\x80\xa4\x46\xb7\xf0\x99\x9d\x4c\xd5\x95\x3e\xb3\xfe\x56\xa2\xba\xfd\xb6\xa9\xad\xc9\xa4\xf5\x51\x1a\x6f\xd9\xbb\xfe\x4b\xa0\x16\xb7\xff\x0e\xb8\xd9\x36\x1d\x0a\x10\xb0\x4e\x11\x1f\xbc\xac\x63\x04\x4b\xb8\x02\x5f\x8a\x5d\x67\xd7\x0a\xf1\x30\x07\xd6\xa1\x18\x1c\xd9\x11\xfd\x29\x8d\xe2\x95\x51\x6b\xa3\xa2\xe9\xa1\x3d\x31\x14\x85\x05\xc1\x60\x19\x6e\x71\x6b\x0a\xaa\x9b\x91\x6e\x90\x1d\x6c\xfd\xf7\x0e\xb1\x33\x6e\xbf\xd0\xbf\xa3\x38\x3f\xeb\x93\xda\x09\x1a\xc4\xb9\x60\x14\x26\x55\x13\x00\x05\x01\x11\x33\xd1\x19\xb0\xd0\x72\xd8\xed\x7d\x53\xdf\x15\xeb\xa2\x8d\x62\x9b\xb0\x9f\x61\xf8\x41\x1c\x55\x6b\xaf\x08\xc7\x10\xfe\x88\x43\x98\x8a\xb6\xfb\x37\x3e\x4c\x31\x44\xa2\xdd\xd4\x80\xc2\x33\x83\xd0\xe0\xd4\x80\x37\x70\x68\x3d\xab\x80\x4f\x6f\xb7\x47\xba\x7b\x20\x70\xa0\xea\x7b\xe1\x45\x2b\xd6\x1a\xc4\xeb\xaa\xf2\xcd\xc5\x25\x41\x57\x1a\x1e\x75\x7e\x4d\xb9\xbe\x04\x27\x06\x12\xd1\xba\x3d\xf8\x72\xc8\x76\x01\xf5\x66\x95\x05\x71\xeb\xf5\x81\x3c\xd6\x38\xd9\x3a\xe4\x8c\x7e\x5d\x90\x3a\x19\x9a\x5c\xf9\x6e\xa8\x5a\x27\x49\x66\x2a\x93\x80\xc2\x51\xbc\xa9\x20\xb3\x95\xf4\xd6\x10\x9c\x4a\xb0\x96\xa1\xf6\xda\x99\x89\x92\x27\xac\xb7\x4e\x80\x24\x14\x09\x4e\x75\x1e\x0f\x1e\x56\x20\x07\x46\xe3\x5d\x1d\xe6\x11\x84\x75\x97\xc9\x23\x8b\x5a\xed\x98\x98\xe5\x85\x2d\x3c\xf6\x60\xc8\xb1\x68\x84\xab\x85\x98\xc3\x58\xe6\x23\x70\xd4\xc3\xb4\x47\x1d\x6a\xa4\x54\x6d\x93\xa1\x8f\x23\x98\x65\xc5\xdb\xfd\x03\x3d\x11\x6d\x12\xd4\xf2\x46\x56\x5b\x6c\x64\x05\x94\x12\xb4\x3e\xed\xbc\x0c\xe6\xc2\x66\xf5\xd1\xc5\x56\x1d\x64\xc3\x43\x2b\xa7\xd7\x4f\x14\x64\x03\xfa\x69\x8d\x47\x4b\x98\xa7\xfb\xc7\xa6\xa4\x77\xab\x9f\x5c\xfa\x8f\x8b\xdf\x9f\xf6\xe1\xbc\x40\x1b\x96\xd3\x4d\x9f\xeb\x5d\x55\x6c\x0f\xca\x5e\x3a\x03\x93\xa4\x4e\x26\xf4\x11\x6b\x96\x06\xcf\x85\x38\xbf\xbd\x96\x1f\x4d\x66\xf7\x12\xa6\xf6\xf3\x43\x0d\x0d\x08\xdf\xca\xda\x18\x6b\xde\x91\x9d\x47\x16\xa0\x69\x8d\x3a\xd9\xd4\xe0\x09\xa3\x2d\x3a\x85\xcf\x9d\x42\x81\xb7\xd3\x8b\x46\x1b\x3f\x61\x34\x27\x7e\x1b\x7b\x46\xac\x68\x74\x3a\xc9\x70\x42\x10\x24\x93\xc4\x6d\x47\xfa\x1f\xc5\x7b\x5d\xc4\x0d\x23\x4b\x1b\x0a\x28\x10\xfc\x30\xb0\x79\xa3\xd5\x73\x74\xd9\xfb\xd0\xef\xe0\x70\x61\xf2\xb4\xd2\x22\x77\x1a\x0b\x2b\xf4\xae\xfb\xd5\x9d\x0e\x38\xc3\xd8\xd3\x36\xf4\x94\x58\xc3\x07\x42\x9b\xe4\x31\x35\x34\xd8\x21\x35\xa0\xed\x0b\xb6\x1d\xc9\x0e\xf4\xad\x3e\xc6\xc8\x2f\x37\xa2\x3f\xd3\x5f\x59\x9f\x3d\x08\xdb\x67\x46\x39\xfa\x4c\xbe\xbf\x4a\x87\xb1\x40\xd6\x04\x31\x59\xe6\xf1\xe8\x48\x11\x89\x08\xb0\xf1\x31\x00\x11\x1e\xca\xa2\xe3\x0b\x29\xcc\x66\x20\xbd\x51\x37\xea\x22\xbd\x48\xfa\xe7\x37\x02\x1e\x38\xe3\x01\x04\x30\x80\x2b\xee\xe5\xb5\xa5\xad\x12\xcc\x17\xb1\x9a\xa6\xe9\x37\x93\xeb\xff\x9c\x2c\x97\x37\xe3\x65\xe2\xa0\x11\x55\xdd\xda\x8d\x7a\x39\x0a\x78\x74\xac\x5b\xf1\x45\xa0\xab\x04\x04\xcd\x87\x3e\x7c\x5d\x66\xff\x23\x4b\xd4\xc4\x94\x59\x95\x17\x59\xa2\x66\xfa\x41\x7d\xb4\x77\xd9\xf9\xf9\xeb\x97\xdf\x27\x6a\xd4\xb6\xd5\x0f\x01\x7a\xee\x5d\x53\x77\x7b\xd2\x6a\xd7\xbb\xac\x28\x6d\x43\xea\xbd\xae\xb0\x6b\xff\xff\x4d\x96\x6e\xea\x1d\x95\x61\x8a\x7a\x04\xb0\xa3\x80\xf4\x9c\x73\x07\x14\x95\xc6\x6a\x07\xff\x67\xeb\x1a\x74\xdb\x6d\x01\x34\xc5\x2a\xd7\x2d\xb0\xb0\xe3\x62\x90\xa9\x9c\xdc\x8e\xc7\x43\x51\x22\x71\xb1\x3d\x93\x76\xc4\xed\xd3\x66\x4c\xed\x83\xcc\x2d\x0e\x23\xb4\x03\x12\xee\x34\x5e\x77\xe8\xdb\x90\xe1\xe3\x17\x20\x52\xe0\x0d\x65\x32\x42\x97\x24\x5c\x0f\x94\x4c\x29\x0d\x98\x72\xbb\x3d\x28\xae\xfa\xca\x0b\x37\xbb\xb8\x40\xec\x69\xef\x6b\x90\xc3\x4b\x07\x88\xbd\x9c\x8d\xea\x53\xf6\x82\x74\x1a\x60\x6f\x64\xd4\xb4\x7a\x6f\xd4\x09\x7b\xc5\xb8\x64\x60\x9d\x08\x54\x9c\x9d\x2f\x60\xe2\x86\x94\x03\x52\xa8\x98\x5b\x3b\xa3\xe6\xf4\x78\x51\x03\x3a\x85\xaa\x85\x12\x77\x7b\xf6\x37\x7a\xa3\xa1\xf6\xb3\x87\x56\x80\xd7\x57\xfa\x41\x0c\xa3\x23\x0f\xc4\x61\xd6\xb9\x3f\x01\xbe\x15\x13\xea\x53\x87\x4e\xa3\x65\x6d\x36\x40\x0f\xe7\xc4\x5a\xd0\x67\x1a\xa9\xa1\xbb\x56\x02\xbc\x5d\x25\x36\xf6\x5c\xb7\x59\x23\x74\x5b\xf6\x7b\x9d\x35\xc4\x07\x1c\x63\x85\x58\xb3\x35\xf2\x2b\xc2\x14\x3b\x1e\xc1\xbd\xfa\x61\xb0\xf5\x5c\x16\x8b\x2e\x09\x79\xe6\x06\x71\x4e\x8e\xdf\xbf\x1c\xc8\x5f\xc2\x99\x82\xb2\x30\xdb\x83\x88\x38\x0a\x70\x41\x8b\x42\xbd\x71\xfc\x35\xc8\x10\x66\xe4\x9b\x33\xc5\x8e\x9b\x5e\x52\xd5\x13\x74\x30\xc2\x49\xb3\x13\xce\xaf\xee\xbf\x30\xde\x0e\x30\x99\x20\xc8\x36\x93\x21\xda\xe5\x6a\x41\x75\x5b\x5e\xd8\xbf\x1f\x94\x86\x7e\x7a\xfe\x27\x01\x51\xf4\x1a\x59\xf2\xf3\x14\x57\x1c\x52\xa9\xa4\x92\x0a\x95\xe1\xbe\xe2\x89\x71\x47\x0b\x61\xbf\x7a\xd6\x37\x81\x63\xc8\xbc\xb3\xc3\x79\x04\x8c\x13\x0b\x20\xc3\x05\x09\x4f\x1d\xc8\x6e\x40\xc7\xe0\x0c\xf0\xb7\x82\x0f\x33\x43\x40\x67\x17\xc8\xb6\xc5\x27\x0c\x15\x57\x27\x47\x24\x7b\x12\x1f\x1c\x3e\x62\x6d\x65\x54\x6f\x1d\x66\x8f\x9d\x25\xd2\x46\xe4\xa6\xbd\x0f\xe3\x0b\x70\x1a\xc2\xab\x11\x6c\x8e\x4c\x34\xb1\xa8\xe0\xfe\x3b\x72\xcd\x25\x12\xe0\x67\x07\x8d\xab\x8d\xa0\xbe\x4a\x14\xc9\xbb\x71\x6f\x86\x43\xe9\x70\xf7\x0d\x2e\x0b\xba\x65\xb4\xdc\x20\x70\x46\x3c\x54\x1a\x39\x3b\x06\x42\x3b\xaf\xa0\x54\x37\x22\xd8\x7f\x65\x57\xe9\x50\x71\xf6\x18\x2a\x90\x57\x3f\x61\x7d\xb6\xc7\x42\x27\x01\x9e\x5a\x62\xbe\xa1\xd0\x5a\x62\xc6\xed\xb3\xc6\xb3\x15\x16\x7a\xc3\x1f\x2e\xe7\xb3\xab\x09\xd6\x3b\x8a\xa6\x20\xa0\x1b\x3e\x4b\x45\xa9\xee\x73\x09\x22\xc9\x57\xa3\x3f\x4f\x66\xef\xa0\xd4\x75\xbc\x78\x9f\x0c\x16\x6b\xdb\xb7\xdc\xac\xe6\x8b\x8f\x51\x1d\xaf\xaf\x8e\x16\x4f\xa5\x42\xe9\x44\x5d\xdd\x2c\xa8\xfa\x33\x51\xd7\xe3\xc5\xdb\xf9\xe2\xfd\x08\xca\xcd\xe3\x62\xee\x44\x14\x69\xd3\xe7\xb1\x50\x7b\x66\x1b\x72\xac\x58\xdb\x7e\x46\x54\xe6\x8a\x61\x7b\x37\xf9\x79\x0c\x70\xf5\xd1\x72\x79\xf3\x1e\xcb\xec\xa1\xf8\x97\x8f\x15\x28\xa5\xc5\x32\x5a\x28\x16\xf5\x85\xe4\xf1\x78\x2d\xc5\x80\x2d\x83\x11\xc3\xe9\x40\x08\xfe\x68\x31\x86\x1a\xec\x37\x1f\xb1\xfe\xd3\x4e\x19\x0d\xcc\xdb\x9b\xe9\x74\xbc\x5c\x71\xd1\xea\xf5\x78\xf1\x7e\xb2\xe2\xd2\xff\xd1\x07\xa1\x4a\x8f\x1b\xdf\xdf\x61\x05\xe6\xf5\xca\x43\x8f\xba\x3f\xd7\x58\xd6\xe6\xca\xf3\xfc\xa5\x5c\x51\x99\x1e\x0a\x81\x04\x21\x86\x38\x86\x81\xa8\x30\x4c\x20\x62\xb2\x6e\x48\xc4\xa0\x88\x22\x6d\x47\xa3\x6c\xf2\x40\xe8\xbb\xd7\x64\x27\xc3\x1b\x9c\x0f\x86\xc2\x1e\xd0\x18\xe0\x5d\x07\x98\x57\xc8\x47\x18\x86\xd7\x9d\x27\x07\x41\xe4\x26\x12\x0b\x71\xb0\xea\xba\xf1\x44\xeb\xcc\x87\x45\xb6\x0f\xfa\xd7\x11\xad\xab\x7d\x04\x09\x8b\x08\x68\xda\xab\xf4\x45\x3c\x25\xc3\x84\xfc\x22\x30\x8d\x69\x6f\x8a\xe7\xda\xa9\xc2\x12\x3b\x3c\x4a\xf6\x42\xb5\xbd\xea\x36\xa5\xce\x1a\x0e\xf8\x02\xb4\x2d\x2b\x9a\x4d\x93\x6d\x5b\x55\x65\xf7\x74\xcd\x27\x2a\xe0\x93\x55\xe6\x60\x5a\x6d\x7d\x52\xeb\x25\x21\xfd\x86\x35\x6e\x99\x14\x86\x0b\x52\x8d\x3f\xde\x00\x01\x0d\x91\x35\xe2\xdb\x8d\x6e\xa2\x0d\x10\x90\x97\x3a\x43\xee\x3f\x9d\xb5\xc8\x72\x63\xc0\xa9\x2c\xaa\xbf\x75\x0d\xf2\xf5\x02\x1f\xa6\x76\x21\x4a\xcc\x93\xdf\x17\x4d\x0d\x4c\xb4\x2e\x97\x02\xa3\xf7\x6d\x1a\xf1\x1f\xc4\x7a\x4a\xdf\x7e\xfd\xd1\x28\x58\x38\x8e\xec\xa5\x04\x08\x0c\xc4\x1e\x17\xa5\xee\x76\xfb\x87\xc5\xe8\xc3\xa4\x02\x92\x4b\xc0\x11\x0c\x8c\xff\x32\x7e\x7f\x3d\x1d\x2d\x3e\x3e\xc2\x2f\x20\x28\x10\xfa\x54\x00\x6a\x3a\x5f\x82\x18\xe1\xdb\xc9\x6a\x79\x9a\xa8\x9f\xe6\x1f\xc6\x3f\x8f\x17\xea\x72\x74\xb3\xb4\xa7\xfb\xec\x0a\x19\x35\x3e\x12\xbd\x42\x30\x64\x9e\x6b\x61\x32\x13\x8c\x0a\x68\x14\xc9\x8f\xcd\x1f\x63\x63\x08\x4e\xee\x53\xc7\x7e\x30\xc1\xd7\x7e\x18\x7d\x54\xb6\xc9\x74\x96\xde\xe0\xe9\xfa\x58\xb5\x0f\x51\x23\x8c\xff\x32\x5e\x5c\x4e\xf0\x14\xb6\x0f\x42\xb8\x65\x9f\x98\xc2\x73\x11\x8c\xae\x7e\x9e\x2c\xbf\x8c\x6e\xe0\x09\x28\xac\xa9\xd5\x62\x74\x35\x7e\x3f\x5a\xfc\x19\x8f\xdc\x37\x8b\xd1\xcc\x76\xce\x0b\xea\x85\x29\x15\x87\x3f\x21\x45\x8f\xea\x20\x76\x30\x45\xb9\x83\x20\x4d\xe5\x9c\x7c\x51\xce\x12\x12\xdb\xc0\xff\x11\x5b\x8e\xf5\x0f\x41\xb5\x4e\xb0\x28\xee\x6b\xd4\xa3\x69\xd5\x5d\xdb\xee\x7f\xf8\xe6\x9b\x87\x87\x87\x14\x9d\xd7\x6f\x36\x59\xdb\xe4\xbb\xe6\x53\x7a\xd7\xee\x7c\x7e\x03\xd9\x79\xdc\x4b\x92\x98\x3b\xa7\xac\x6f\xeb\xde\xab\x51\x1f\x94\x62\x26\x97\xa3\x28\x88\x75\x39\x52\xef\xed\x97\x4f\x85\xac\x82\x7b\x43\xf8\x02\x7c\x7e\xf8\xf8\xf0\xe9\xbd\x84\x92\x38\x05\x31\x02\x48\x32\x90\x1d\x95\x4b\xf3\xdb\x15\x9a\x4b\x11\x24\x8b\xcd\xc3\x63\x84\x3f\x03\x98\x61\xec\xc4\x57\x90\x06\xf5\x9f\x21\x64\xfa\x24\xfa\x93\xbd\xa5\xd7\xe9\x79\x22\x9d\x95\x5d\x76\x38\x86\x5c\xa0\xfb\x4e\xcc\x17\x4c\x50\xc2\x72\x37\x10\x55\x1d\x98\xa4\x20\x67\x15\x69\xc0\x87\x24\x55\x3e\xb8\x98\x79\xf6\x2b\xe7\x67\x52\x11\x52\xe8\x64\x42\xf7\xbe\x4b\xd5\xf5\x68\x85\x54\x41\xab\xc9\x3b\x29\x06\xf0\x1d\x22\x59\x84\x49\xe1\xc9\xa0\xc9\xa7\xb5\x77\x0f\x31\x1b\xc8\xb8\x69\x0f\x0b\x25\xea\x65\x32\xb5\x69\x6a\x63\xce\x30\xc0\x02\xbe\x32\x50\x99\xba\x80\x8b\xab\x7f\x3f\x8d\x6a\xde\xfb\x39\x19\x40\xf0\xd1\x73\x05\x36\xb0\x57\x67\x36\x94\x6f\x81\x18\x5f\x93\x83\x86\x8e\x28\x63\x07\xff\x42\x4c\x2a\x76\xf4\xc4\x9c\x12\x44\x27\xfe\x7b\x14\xbc\x0b\x02\x75\x02\xd0\x2a\x88\x04\x5c\xeb\xc0\x7b\x83\xe7\x89\x61\x2c\x0c\x38\x8d\x18\x98\xf8\x3e\x45\x96\xa6\xe5\x4f\x93\x6b\x2f\xbb\x15\x23\x91\x7b\xc0\xaf\x81\x1c\xa6\x77\xf2\x31\x7a\x68\x97\x8b\x6d\x5d\xb6\x86\xf0\x46\xcf\xeb\x6f\x34\x86\xa1\x1c\x0c\xcb\x1c\xc3\x61\x91\xc8\xea\x91\x5a\x8f\x81\x60\x66\x6a\xf7\xfa\x57\x3f\xff\x68\x5d\xc0\xf1\x17\x5b\xaf\x4b\x62\x43\xec\x89\x77\x19\xd6\x3b\xd9\x69\x75\x60\xf5\xf8\x6f\x18\xd0\xa3\x4a\xff\x90\xff\x21\xe0\xa3\x13\x18\x31\xfb\x8c\x5d\x76\x00\xfc\x31\x96\x2f\x96\x10\x5b\xdd\x34\x9a\xec\x31\x87\x71\xe2\x58\xf2\xf0\xab\x87\x0c\x64\xec\x4f\x5e\x00\x9e\xc3\x3a\xec\x90\x18\xa4\xd3\xab\xf6\x54\x0e\x02\x59\xcd\xd3\x1f\x22\xac\xe8\xe8\x15\xd8\xfe\x9d\xc2\x03\x05\xab\xeb\x9e\xa7\x47\xa4\x41\x80\x73\xa1\xde\x0e\xac\xff\x81\x25\x17\x2f\x7c\x2c\x1e\xb3\x76\xa4\x51\x2c\x54\x7e\x20\x33\xdd\x17\x71\x32\xd5\x1d\xa7\x3d\x7b\xd0\xa5\x20\xf5\x08\xf5\x25\x74\x99\x00\x58\x11\xf3\xc5\x64\xab\xc6\xe8\x10\xe4\x70\x46\x00\xd4\x8e\x63\xaa\x6b\xbd\xa9\x77\x70\x30\xe1\xb1\x40\xe9\x8e\xaa\xae\xbc\x33\x91\x06\xe7\xe0\xa3\x58\x01\xee\x6e\xd2\xbf\xf1\x6c\xa7\xb5\xb5\xa7\x3b\x13\x91\x63\x0f\x85\x78\xec\xe2\x61\xb1\x3c\x17\x2c\xdb\x37\xd9\xa6\x45\x87\x46\x60\x34\x44\xcb\x64\x88\x6f\xa0\x79\xbc\x61\x7a\x47\xc6\x5a\x5a\x39\x99\x89\x92\x83\x32\xd7\x12\x84\x56\x58\x95\x10\xf8\x61\x68\x27\x35\xf7\xc8\xf8\xee\xe8\x43\x70\x51\x9d\xa7\xea\xdd\x78\x36\x5e\x8c\xa6\x42\x15\xc4\x8e\x6b\x80\x6d\xea\x4d\x31\x20\x5c\x50\xce\x04\xf2\x20\xba\x02\xbd\x0e\x01\xbf\x09\x7d\xbc\x24\xd4\x84\x43\xc1\x0d\x68\x34\x3c\x84\xdc\x37\xf7\x14\x72\xe8\x88\xab\x05\x6e\x49\x21\x47\xfe\x48\xea\x9d\x0b\x90\xb7\x5d\x83\xb7\xee\x86\xf9\x7d\x38\x9d\x50\x68\xc4\xc7\xb7\x75\xe2\x14\x9a\xa8\x93\x92\x15\xb9\x6e\x76\xde\xc5\xb5\x5e\xb9\x80\x8a\xf5\xca\x37\xe2\x07\xe1\xc0\xd8\xf6\x88\x71\x91\x32\x1b\x74\x20\x39\xc6\xf2\x80\xa6\x5c\xdc\xca\x8d\x26\x6c\xd9\x69\x6f\x06\xf0\x80\x81\x42\x8a\x1a\xfe\x4b\x31\x46\xf1\xa8\x88\x47\x1d\x0f\xce\xb5\x26\x56\xf1\x0c\x16\x7a\x51\xdd\x76\xc4\x09\xc4\xdf\x12\xfc\xe7\xbe\x0e\x5d\x54\xd6\x06\x07\x35\x32\x68\x97\x0f\xd9\xc1\xc4\x55\xc9\x11\x3b\xe8\x91\x46\xc9\xe2\x62\xaa\x62\xe5\xdc\x41\x10\x2d\x4f\xe8\x60\xc8\x1e\xeb\x61\x61\x78\x48\x75\x9e\xf4\x12\xf4\x20\xec\xf2\x08\x90\xf5\x24\x2c\x72\x8f\x3a\xea\x8b\xac\x45\x03\x00\x08\x00\x85\x81\x5e\x5e\xef\x72\xd4\x07\x37\xbb\xf4\xce\x40\x41\xe3\x79\xfa\xc2\x6e\x38\x94\xc2\x28\x76\x4e\x19\x73\x5b\x37\x62\xf7\x1f\x3f\x9b\x07\xb7\x43\xaf\x00\x02\x4b\xef\x49\x8f\x2d\x3c\xd4\x48\x14\xd6\xb4\x99\xb5\x22\x13\xf5\xb7\x2e\x2f\x20\xa3\x0c\x92\xab\x09\x86\x5b\x6f\xbb\x32\x73\xaa\x06\x95\x2c\xef\xeb\x4c\x8b\xf5\x2e\xb2\x7d\xc7\x1b\x76\x04\x7e\x49\xbd\xf6\xc5\xde\x1c\xb2\x25\x63\x6a\x57\x30\x2c\x83\xc3\xec\x90\x68\x01\xc4\x16\x1e\x27\xa4\x74\x86\xdf\xc3\x10\xd0\x31\x98\x76\x94\x62\xe3\x57\x05\x55\x13\x2f\xd2\x57\xc8\x89\x36\x88\x09\x04\xd9\xa3\x21\x06\xdb\x81\xf8\x76\xaa\xc6\x58\x9f\x11\xa2\x02\x18\xc6\x45\xc9\x65\x1c\xfd\x78\xb0\xcd\xb1\x2e\xf9\x04\x68\x79\xa0\x14\x28\x45\xa7\x64\x0e\xb4\xde\x2a\x90\x66\xb0\x87\x95\xf9\x64\xf7\x3f\x96\x42\xb1\xe2\x92\x2f\x4f\x11\x4a\xcf\xe7\xe7\xe9\xcb\x1e\xa0\x31\xc6\x3f\x59\x6f\xc0\x91\xa2\xb5\x94\xf1\xe0\xdc\x30\x6c\x0b\xdf\x0a\x3c\x78\x1a\xf4\x33\x24\xca\x62\xe8\x32\xdc\xd5\x88\x71\x42\x89\xa1\x83\xce\x1a\x91\x66\xc5\x4c\x50\xbd\xe5\xef\x67\x0d\x08\xd7\x44\x11\x3d\xd0\x05\x32\x12\x3f\x08\x58\xb6\xbf\x75\xf6\xc8\x06\x33\xc6\x01\xf2\x4d\x57\xa2\xf0\xb0\xb3\xf5\x11\x1b\x25\x6c\x7f\x5f\x63\x84\xf4\xf9\xf6\x5b\x75\x49\x35\xd5\xa4\xaf\x33\x90\x77\x0e\x6f\xe7\xbe\x05\x06\xba\x2f\x65\xb6\x71\xa1\xc4\xde\x28\xe2\x95\xd6\x7b\x30\x41\x76\x00\xf3\xec\xb5\xd6\x5c\x74\x4f\xd2\xf5\x2b\xe2\xa0\x56\xf7\xda\x5a\x02\x05\x69\x92\x40\x76\x09\xa1\xe1\x3a\x07\x3d\x9c\x0d\x32\xfe\xb3\x2a\x81\x2f\x64\xf7\x69\x72\x77\x92\x84\xa6\xf5\xea\x4e\x4b\x39\x77\x5e\x12\x37\x15\x2c\xec\x19\xed\xd9\x4b\x60\xb7\xe3\x6a\x84\x4b\x42\xb5\x78\x50\x5f\x00\x49\x50\x4b\x2a\xc2\x7e\x57\xd7\x39\x80\x34\xbc\xb6\x25\xe1\xcb\x03\x81\x17\xf5\x01\xaa\x1a\x82\x20\x7b\x59\x6f\xb2\xd6\x6f\x78\xb8\x9b\xa9\x9c\xeb\x3f\x3a\xbd\xd6\x9b\x44\x5d\x66\x55\x96\x67\xa4\x61\xe3\xa9\xab\x91\x41\x8d\x98\xeb\x7e\x80\xfe\x49\xbb\x01\x47\x7e\x5b\x34\x3b\xe7\xfe\x92\x30\x5c\xa3\xff\xde\xa1\xfc\x14\xfd\x21\xb6\xf0\x40\x4c\x27\x4c\x5b\xe1\xa5\xe9\xe5\x67\x9c\xdc\xcc\x54\x1b\xf7\x5a\x06\x01\x59\x9b\xd0\xf0\xdb\x6d\x3f\xff\xde\x3d\xd3\x25\x70\x28\x80\x38\x7e\x71\xab\xd5\xdf\x3b\xad\x4a\x56\x4a\x26\xd6\x97\xac\x55\xda\xce\x5c\x67\x94\xfd\xb0\x7f\x37\xa6\x05\xa0\xd4\xa8\x40\x00\x5c\x5e\xdc\x82\x90\x89\xca\xaa\xdb\x32\x2b\xa4\xac\xd2\xb7\x81\x41\x00\x32\xb5\x5e\xae\xbf\x2c\xed\x1c\xd5\x4d\x2b\xeb\x55\x31\xb6\x1f\x40\x3e\x91\x78\x86\x8f\x37\xe3\x39\x62\xba\xaa\x45\xae\x41\xb4\x04\xfc\x5c\x92\x31\x10\xd6\x83\x7f\x51\x42\x05\xaf\xa3\x82\x49\x25\xd1\x1c\x93\x32\xc5\xfe\x21\x5e\x4b\x15\x3a\x61\x1b\x7d\xc6\xff\xac\x1b\x59\x7f\x2b\x30\x78\xf7\x45\x5d\x66\x41\x1d\xee\x40\x87\x83\xe3\x1c\x43\xfc\x52\x49\xd7\x9b\x92\xce\xf6\x87\xa5\x42\xda\x3d\x61\xee\xe2\xfc\x3c\x7d\x1d\x9e\xcb\xc3\x42\x60\x03\xfa\x5f\xd2\xfa\xed\xef\x67\xed\xe6\x12\xe1\x2f\x4e\x51\xf0\xb7\xe6\xeb\xfa\x57\xff\xa4\xdf\xe4\x7a\xdf\x68\x38\x1a\xfe\xf3\xdd\xf5\xf4\xec\x45\xfa\xfc\x5f\xcd\x03\xf7\x28\xff\xdb\xf9\xf3\x17\x2f\x5f\x9f\x47\xfc\x6f\x2f\x9f\xbf\xf8\xf6\x77\xfe\xb7\x5f\xe3\xe7\xdd\xec\x86\xdd\x5d\x75\x7d\xf3\x66\x3a\xb9\xe4\x54\x94\xa3\x7a\x7b\x91\xa8\x8b\xef\xd5\x9f\xba\x4a\xab\x8b\xe7\xcf\x5f\x3f\xf1\xac\x97\xff\xf7\xff\x82\xdf\x84\xba\x4e\xea\x6d\xdd\x55\x39\x19\x6b\x40\x5f\xf6\x87\xbb\xb6\xdd\x2b\xa3\x7e\xf8\xe6\x9b\xad\xd9\xa6\x75\x73\xfb\xcd\x1f\x9f\x8c\xef\x75\x03\xfc\x17\xd6\x43\x71\x95\x46\x47\x98\x2f\xef\x75\xb3\xce\xda\x62\x17\x6b\x73\x95\x2e\x17\x82\x07\x38\x22\x9e\x01\x61\x82\x3e\x0b\x27\x2b\x01\xbc\x03\xbc\x9b\x8d\xce\x76\xeb\x52\x03\x01\x14\x74\x5e\x57\x70\xdf\x5f\x03\x87\x44\xc0\x2b\xa2\x50\x6d\xc3\x36\xa8\xd4\xdb\xd6\x17\x70\xd4\x22\x3c\xeb\xe3\xd9\x9f\x8a\x2a\x87\xa6\x41\x55\x3b\x52\x4c\xb9\x33\x0c\x38\x8a\x6b\xd3\x0e\x7d\x91\x83\x25\x25\xd5\xc3\x23\x35\x86\x27\xdc\x42\x9e\xb6\x87\x8c\xc8\xb0\x6c\xab\x72\xc4\xed\x99\x3b\x7e\x12\xa2\x6a\x5c\xe9\x84\x49\xd5\x1b\x52\x3a\xc8\x0c\x91\x51\x3c\xde\x5b\x59\x9e\x73\xdb\x65\x10\x6e\xd1\x9f\x7f\xa1\xbd\xe7\xa4\x9c\x58\xc6\xe9\xe9\xb3\x33\x1f\x0a\x68\x40\xaa\x19\xa3\x16\xc4\x06\xe6\x86\x61\x4b\x1e\x98\x35\x4d\x51\xde\x5f\x7d\xd0\x4e\x28\xee\xc8\xb2\xe2\xec\xd5\x23\x5d\x72\x03\x6e\x0d\xfe\xce\x4f\xd8\x8f\x40\x09\x4d\x2c\xbc\x80\x36\x62\xf9\x1a\x94\xa3\xac\x9b\x4f\x9e\x41\x06\x16\x99\x1d\xf8\x35\x20\xca\x58\xd1\x26\x05\x12\xdc\x4d\x56\x11\xf4\xb7\x80\x5b\x03\xc6\x8a\x93\xf3\x89\x6a\xeb\x3a\x7d\x02\x55\x5d\x0f\x5a\x99\xbd\xce\x40\x13\x27\xe8\xbc\xa0\xba\xdb\x6a\x2c\xec\x68\x6b\x1e\x6e\x50\x6d\x55\xfb\xa6\xd8\xe8\x54\xcd\xbb\xe6\x48\x47\xfb\xcb\x25\xaa\x8b\x38\xd4\x1d\x5a\x63\x60\xd5\xf9\xa9\x1c\x54\xbc\x0b\xe7\xe6\x84\x26\xba\xb9\x75\x45\x42\x3b\x55\x6c\xe1\x91\x0f\x85\xb9\x3b\x4d\xfc\x2b\xc8\x2a\x09\xc0\xba\xd6\xe4\xc8\x2a\x75\xab\xa1\x5a\x9a\xbf\x98\x59\x1b\xa5\x15\x5f\xb5\x9f\x11\xeb\x57\x66\x3e\xec\x44\xef\x0b\x6b\x12\x20\x70\xcf\x5a\x19\x95\x7e\xc0\x76\xfa\xb1\x46\x07\x98\x1e\x07\xc8\x56\x7e\x6e\x0e\xb7\x39\x2c\x97\xa2\xba\xb5\xbb\xb2\x66\xf9\x3d\x9c\x30\x0e\xea\x3f\x68\xa8\x0c\xc7\x6a\x22\xd2\x34\xb4\x2b\x82\x02\xd7\xb9\xae\xc0\x70\x02\xd6\x3b\x78\xa0\xaf\x83\xcf\xcc\x27\xf7\xa7\xda\x8e\x7c\xa3\x5d\x64\x04\x3f\x15\x94\x34\xb8\x09\xd9\xe8\x06\xe0\x77\x41\x45\xbb\x9d\x08\x1a\xa9\x23\x9a\x84\x72\xfd\x20\xd7\x19\x50\xd0\x61\x3c\xa5\x68\x7f\xe8\x3f\x0f\xd8\x77\x8c\xe3\x0e\xe4\x45\x60\x77\x06\x74\x31\x7d\xf2\xb6\x6e\x94\xfe\x25\xdb\xed\x4b\xac\xb9\x38\xfa\x7a\x2a\xcb\xd9\xc7\xf0\xcf\xdb\x26\x6b\x0b\x18\x0d\x74\xb8\xa1\xc8\x0d\xda\x65\xbd\xf3\x7d\x66\xa0\x78\x84\x01\x32\x02\x38\xc9\x2a\x7c\xd4\x28\xd3\x5b\x51\x39\xee\xb6\x23\x25\x3f\x07\xd8\x68\x89\x5b\x7e\x62\xc9\xb5\xbd\x4a\xee\x2a\xf7\x4d\x32\x50\xa3\x69\x17\x34\xad\x0f\x08\xcd\x98\x1a\xdd\x17\x58\x43\xc8\xa4\x46\x33\xf8\xe4\x0a\x69\x34\xed\x8a\x80\x97\x07\x67\xd0\xf5\x74\x68\x55\x51\xe0\xe7\xa1\x46\xa0\xf1\x0f\x20\xc0\x94\x19\xa3\x9b\x56\x22\x6f\xab\x68\x52\x21\xde\x73\x71\x4a\xb4\x37\xb8\xe2\x84\x89\x7b\x5b\xdc\xf3\x72\xc3\xc8\x81\xe0\x6d\xa6\xfb\x73\x48\xb7\xc9\x2d\x10\x9c\x6d\x48\xec\xb9\x2e\x3d\x13\x46\xb6\x79\xc6\x7d\x71\x92\x9d\xb6\x7f\x00\xe4\x01\x7f\x73\x5f\xc2\x39\xce\x53\xd0\x68\xbc\x65\xbd\x8a\x3c\x9e\x15\x45\x74\xd4\x23\x5d\x12\x40\xdc\xe1\xa0\x8f\xde\x69\x80\xf5\x87\xdf\x46\x45\x08\x2c\x4a\xc8\xf4\xd5\xee\xaa\x59\x63\x82\x1f\xd5\x8f\xf1\xf0\xc8\x13\x9c\x3e\x6c\x55\x01\x67\xf1\xba\xd4\xbb\x28\x3f\xd6\xba\x70\xac\x6e\x9a\xba\xd2\x75\x67\xa8\x7a\xc3\x6b\x6d\x3a\xc1\x62\x7e\x5f\xfa\x64\x59\xef\x34\x73\xaa\xf4\x8e\x5c\x7b\x3a\x60\xa7\x98\xaa\x1e\x10\xe0\xa6\x85\xd8\x62\xa3\x9a\xae\x1a\xe8\x43\xcc\x70\x56\x54\x20\xde\x6d\x17\x65\xe2\x59\x51\x30\x34\x58\x75\xdb\x6c\xd3\x76\x8d\x6e\xf8\x58\x43\x9e\xcc\x02\xa2\x01\x5b\x7b\x35\x22\x3e\xc9\x5e\x47\x90\x11\xca\x5a\xf0\xfb\x5c\xec\x11\xb2\xd8\x5b\x37\xb5\xd5\x2d\xcf\x82\xb8\x13\x06\x4e\x61\x8c\x67\x20\x20\x2b\x6b\x8b\x8d\xda\x83\x43\xe4\x5d\xbc\x6c\x0d\x01\xa8\xcd\xa6\x6b\x9c\xf4\x54\xd6\xe8\x2c\x80\x41\x6c\x09\x89\x7b\x5f\xe4\x5d\x56\x32\x02\x25\xe1\x28\xb7\x01\xbd\xdf\xc2\x58\xa7\x15\x09\x19\x48\x06\xd9\x5e\xe0\x5d\x65\xc7\x74\xdf\x62\x32\x49\x1c\xa4\x0f\x1a\xcf\x51\x3f\x13\x76\x38\xa2\x40\xb8\x5d\x4c\xb2\x42\x14\x63\x1f\x60\x70\xf1\xa5\x56\x1b\x0f\xb6\x80\x0c\x1a\x27\x2f\x70\xf5\xa0\x1a\xa6\xe9\xd6\xa6\xcd\xa0\x9c\x1e\x86\x98\x23\x60\x35\x18\x35\xd0\x18\x8c\x1a\x36\x3a\xcb\x0f\x58\x3b\x63\x2d\x2a\x6c\x94\xcf\x84\xc0\x11\x58\x83\xcd\x8a\xe6\x50\x51\xb1\x7e\x72\xbc\x30\xde\x5d\x4f\x81\xef\x08\x19\x4b\xa8\x17\xed\xc0\x29\x8e\x76\xd3\x93\xb7\x45\x65\x1b\x97\x50\x71\xda\xde\x07\x26\xda\x3b\x80\x6a\xdb\x31\x02\x07\x39\x83\x18\xe9\xfa\x20\xb8\x5a\x91\x04\x28\xc5\x98\x9b\xb1\xc7\x63\x57\xe6\xde\x76\x76\x5c\x82\x78\x97\x60\x1c\x2c\x60\x16\xae\x72\x45\x91\x48\x7f\x81\xdb\x83\x18\x8c\x96\x33\x22\x56\x80\x10\x44\x87\xa2\xed\xd6\x54\x87\xf5\x52\x33\xd3\x7e\x5e\xc3\x38\x5a\xd3\x02\x36\xe4\x7d\x5d\x60\x60\x9b\x58\x0e\x54\x9e\x81\x7e\x01\xd1\x88\x62\x83\xd0\x96\xc3\xdc\x7e\x60\x17\x10\xe6\x0f\xee\x8c\xa2\x0d\x38\x19\x44\x89\x03\xf0\x14\xf3\x8d\x6f\xe7\xca\x9f\x41\xc0\x0e\xc4\x47\x10\xbf\x6e\x93\x55\x74\x92\xb0\xde\x97\xb8\xed\xf9\xcd\x55\x5d\x01\x0b\xda\xff\xc3\xde\xbf\x2f\xb7\x8d\x64\xe9\xa2\xf8\xfc\xed\xa7\xc8\x60\xc4\x2f\x4a\x8a\x80\x51\x92\x5c\x97\xee\xaa\x89\x89\x1f\x2d\xd1\x36\xa7\x25\x52\x43\x52\x76\x6b\x9f\x38\xb1\x37\x48\x24\x25\xb4\x41\x80\x0d\x80\x92\x39\x6f\x74\x5e\xe3\x3c\xd9\x89\x5c\xb7\x5c\x09\x80\x92\x5c\xb7\xde\x33\xbb\x1d\xdd\x51\xb6\x44\x02\x79\xcf\x75\xf9\xd6\xf7\x31\xcf\xac\xc5\x1a\xaa\x3e\xca\x8e\x35\x55\x61\x40\x95\x62\x90\x68\x15\xf9\x11\x0e\x24\x62\x48\x2e\x7e\x45\x60\x5c\x0d\x86\x86\x8a\x81\x93\xd8\x5c\xd8\x75\x56\x64\x3e\x46\x32\xd0\xc1\x91\x01\xda\x99\x30\x87\xbc\x4b\xde\xc8\x62\x3b\x68\x4a\xe3\x83\xc4\xeb\x1b\xa0\xd5\x8c\x1c\x86\x72\x8b\xbd\xce\xb3\xcf\x14\x02\x17\x9d\x0b\xd8\x05\x7d\xbe\x91\xe7\xa1\xa8\xed\x26\x73\x83\xb1\x5b\x61\x4a\xaa\xfe\x2c\xed\x96\xc8\x92\x6e\x36\x92\x87\xd1\x3b\x21\x64\x0f\x06\x7b\xde\x16\x72\xd4\xf1\x58\x08\x85\x33\x37\x03\x71\xaa\x55\xb6\xae\xf1\xee\x18\xec\xcb\xdd\x20\x66\xe5\x49\x6b\xeb\x01\x0c\xfc\xc0\xdb\x28\x03\x16\x78\xd3\x07\x18\xc8\xd5\xdf\x25\x45\x10\x91\x5a\x94\x66\x80\xd7\xec\x80\x59\x40\x89\x2c\x92\xdc\x5a\x30\x25\x81\x46\x37\xd9\x22\x30\xaa\xac\x02\xfc\xd8\x23\xe9\xe0\x25\x66\x9d\xd4\xf7\xa8\x3b\xe2\x2e\x42\x04\x0e\xb1\xc5\xe0\x2f\xfc\x48\xa7\xd9\xf0\xa6\xf8\x4c\xb2\xd3\x50\x28\x90\xac\xd0\xd2\xc0\x53\xdc\x07\xf7\xf1\x3d\x6e\x35\x43\x31\x74\x42\xed\x56\xd7\xd3\x80\x9b\xe4\x6e\xfd\x8c\x3d\x23\xb0\xed\xe0\x6f\x03\xa6\x8d\x1a\x74\x3e\x85\x9a\xc7\x66\xb0\x2a\x1f\x80\xd0\xc3\xfd\x8c\x35\x7d\x94\x5e\xdf\xae\x90\x77\x2a\x2c\x1c\x3d\x5e\x48\xa9\xda\x38\x30\x37\xc6\x6e\xfb\x26\x77\x49\x63\xbb\xc3\x9c\xc2\x1a\x01\x63\x9f\x81\xdd\xb0\x20\x23\x09\x32\xea\xc1\x7b\xf4\x27\x04\x5a\xbc\xbe\x6e\xa4\xb6\x6e\x5d\x26\x55\x96\x23\xd3\x16\x85\x50\x83\xf2\xe8\x4e\x5e\x5f\xf1\x34\x25\x8f\x42\x42\x86\xf5\x1a\x14\x90\x28\xa9\x54\x19\xcb\x0a\xc5\x2e\xc3\x4c\xd0\x16\x58\x28\x2d\x4d\xd9\x35\x75\x13\xeb\x38\xa8\xec\xb9\xff\xac\x38\x42\xe4\x58\xd5\x2b\x0b\x72\x1c\xf1\xb2\x50\x95\x71\x94\x23\x81\x9d\xce\x34\x26\x98\x12\xc5\xd0\x33\xd8\xfb\x82\x18\x78\x40\x47\x82\x08\x9c\x64\x22\x40\xa2\xa7\xbd\xd8\xdd\x1e\x75\xfb\x9d\x0c\x00\xe9\x02\x9c\x0b\x16\x10\x2e\xb5\xe2\x6e\x21\x07\x05\x26\x01\x62\xc3\x68\xc8\xa3\xcb\x11\x9b\x2b\xb0\x06\x8a\xc6\x56\x89\x2a\xdd\x4d\xe0\xce\x73\xf7\x1a\xd8\x48\x6a\x44\x0b\xdb\x3c\x42\xa6\x08\x3e\x57\x94\xa6\xa9\x92\xa2\x5e\x23\x56\x22\x21\xeb\x98\xa2\x42\xd8\xfc\xac\xb8\xc3\x15\x5b\xf8\xf7\x3c\x58\x7c\x01\xfc\x60\x9d\xac\x2c\xb3\x91\xd6\x66\x30\x54\xb5\x81\x97\x60\x80\x4f\x10\xbd\x38\x68\xa5\x33\x99\x26\x4c\xe6\x2e\x09\x34\x8d\x10\x51\x89\xe5\x4d\xf9\xde\x38\xfb\x00\x56\x99\x4d\x1a\xf1\x70\x9c\xc3\x20\x6f\xc6\x78\x83\xbc\xbb\x2d\x30\xe4\x1d\x87\xc6\xe6\x39\xba\x56\x34\x4a\x4f\x1b\xea\x74\xec\x30\xcb\x60\x4f\x27\x34\x4f\x80\xe2\xc9\x63\xff\xdf\x13\xdf\x00\x78\x0b\x46\xd5\x3f\xb7\x0f\x22\x06\x7c\x67\x48\x92\xf3\x90\xd9\xc7\x03\xec\x33\x31\x13\x94\xf9\x69\xf0\x84\x6c\x50\x8f\xc9\xd6\x0f\xd4\x0f\x00\xa5\xa0\x3b\x98\xb7\x94\x5a\xe0\x5b\x26\x31\x1b\x5b\xec\xa2\xa0\x9e\x2c\x6b\xac\x30\x1b\xc2\x93\x36\xd6\x82\x3f\xea\x4e\xc5\x2a\x6b\x6c\x25\x88\xa0\x38\xd0\x2c\x83\xb5\x7f\x6f\xcd\x40\xf9\x96\x03\xf2\x7a\xf5\x59\x74\x50\xbc\xec\xf1\x79\xcd\xb2\xd8\x0c\xa6\xbe\x76\x72\xa0\x36\x16\x08\xfc\xe2\x8b\xf9\x99\x49\x70\xe8\xce\x9d\x11\x9a\x54\x29\x26\x10\xdd\x98\xf9\xaf\xab\x71\xc4\xcd\x88\x87\x71\x06\xbf\x2b\x21\x7b\x9e\xe4\x68\xc6\xba\x27\x88\x72\xc0\x1e\xe0\x69\xab\xf2\xae\xc8\xfe\xd3\xa6\xf2\x81\xda\x2c\xcb\x14\xaa\x26\xa2\x36\x11\xbd\xbc\xa8\x46\xdb\x0d\x4e\xf9\x2e\xdb\x16\x9e\xeb\x80\x6a\xcb\x93\xe2\x6e\x97\xdc\xd9\x08\x92\xdc\xac\x07\xf5\x98\xa5\xce\x5e\x03\x53\x2b\xd9\x94\xc5\x9d\xf2\x59\xa1\xdb\x52\x92\xea\x96\x21\x3d\xc2\x4f\xd1\x1c\xdc\x16\x73\x99\x2d\xab\xc4\x9d\x68\x03\xb9\x18\xa5\x82\x8e\x6e\x5c\x2a\x38\xa4\xab\xa3\x73\xad\x3e\x0a\x55\xc9\xe3\x7d\x99\x5b\x5a\xf7\x50\xc1\x5e\x77\xb0\x14\x45\x59\x6d\x92\x5c\xe6\x67\x9b\xac\x3e\x27\x77\x78\xc0\x5f\x25\x7f\x83\x92\xc1\xcd\xb6\x2c\x24\x5e\x2d\x4e\x10\x04\xfc\xc4\x1a\x48\x9a\xee\xc7\x19\x0a\x42\x52\x6e\xc0\x71\x04\xe8\x71\xc4\x99\xd5\x36\x58\x64\xe4\xfb\xf5\x3d\x08\x51\xe7\xd9\x66\x4b\xea\xfb\x89\xe9\x2e\x1c\x98\x30\xa2\xf0\x2a\xfc\x67\x05\xff\x7b\xe0\x36\xe9\xe3\xa9\x8a\xdd\xd2\x6c\x35\x62\x10\x09\xfc\x73\x55\x16\x8d\xfd\xd2\x44\xc2\xa0\xbe\x81\x8f\x7a\x3d\xae\x15\x7f\xc9\x1c\x7d\xb6\x55\x61\x73\x77\xbe\x17\x69\xf9\x48\x9e\x29\xa1\x63\x4b\x03\x14\xa8\x6b\xef\x34\xac\xb3\x15\x57\x24\x15\x77\xf4\x61\x73\x84\xf5\xbe\xc7\xee\x32\xf6\xd5\x91\xed\x45\x51\xed\x28\x3d\x89\xb7\x4b\x96\xdb\x4a\x6c\x7e\x16\x60\xe6\xa1\xa6\x82\x87\xa0\xe2\x19\xf6\xc0\xb6\xb2\x8d\xfa\x5e\xb5\x2b\x18\x56\x02\x0b\xf4\xbc\xac\x30\x5a\x07\x18\x2b\x3c\x66\x82\xc3\xa4\x8f\x4a\x90\x06\x29\xcf\xdb\x21\x2e\xe5\x29\xa2\xdf\xd5\x40\xb9\x1a\x84\x21\x68\xed\x20\xff\x51\xbb\xaf\xc7\xd0\x30\xa8\xde\x6a\xb1\xa2\x6b\xa4\x16\x77\x55\x11\xaa\x03\x08\xa7\xe6\x5a\xe2\xaa\xcc\xc9\x9d\xf3\x36\x83\x82\x7f\x66\x8d\x26\x4d\xf5\x3c\xbf\xee\xa9\xdf\xd4\xa6\xbd\x59\x61\x4c\xdb\xfe\x63\x53\x96\x68\x7d\xd3\x2f\xf2\x7d\xc0\xdf\xa6\xa2\xc2\x8a\x7c\x6e\x87\xae\x81\x98\x9b\x59\xc1\x2c\x38\x98\xf9\x0e\x5b\xac\xf6\x24\x73\x39\xb5\x4d\x74\x0c\x65\x49\xc0\xb4\x6f\x16\xfd\xad\xaf\x6c\x08\xf1\xce\x00\x65\xd5\xad\x42\xe4\x93\x1d\x7e\xa9\x2f\xe7\x48\x30\x5e\x6d\xe2\x2e\xc8\xc8\xa4\x26\xe7\x51\xc3\xd4\xd9\xbe\x48\x36\x04\x01\xcf\xb3\xe2\x33\x62\x0f\xbd\xaa\x0f\x57\x29\xb0\x1b\xc0\x5b\x05\xbe\xa0\x03\x5b\x14\x86\xf3\x57\xe9\x72\xef\xfa\x93\x6d\x9c\x01\x92\x26\x4d\xd2\x2a\xdc\xf3\xc2\xed\x66\x9d\x97\x8f\x2a\xdb\x5e\x62\x0c\x45\xda\xa0\xd2\x5f\x49\xe5\x15\x77\xe4\x2a\x5b\x40\xbd\x72\xcf\xb8\x42\x94\x3e\x60\x4b\x67\x7b\x9f\xc3\xb2\x15\x78\xe9\xa6\xb2\xbc\x09\x5a\xa0\x78\xf4\xc2\xba\xef\xee\x7b\xdd\xd3\x6d\x09\x37\x6a\xfb\xd0\xc3\xc8\x4b\xd2\x60\x80\x5b\x7a\x76\x16\x9b\xb7\x49\x9d\xad\x8c\xd7\x00\x44\xf7\x51\x09\x05\x3e\x51\x21\xe1\xd6\x24\xff\x9a\x97\x08\x48\xa8\x96\xeb\x6e\x50\x39\xd0\x06\x82\x18\xa3\xa7\x72\xd7\x65\x3a\x84\x80\x0a\x22\x13\xee\xe3\x1b\xdb\xb4\xf4\x26\xed\x17\xe7\xed\x64\xce\x62\x4d\xd6\xeb\xac\xda\xd4\x18\xf1\xde\x15\x5c\x05\x1b\x86\xa3\xf9\x60\xe9\x7a\x7b\xc4\xaf\xb3\x6b\xb6\xbb\x06\xe7\xa4\xda\x15\x05\x95\xde\x28\xd7\x11\xfc\x54\xfa\x77\x5b\x8f\x12\x2e\xc0\x0c\xa7\x0f\x9f\x14\x11\x98\x17\xe5\x0b\x81\x31\x2e\x0a\x50\x21\xe1\xc3\x5b\xbd\x0b\x2a\x5f\x75\x24\xbf\x5c\x9b\x75\x92\x55\x2c\x8a\x81\xab\xc7\x6d\x8e\x87\x24\xc7\x9b\xb9\x0e\xe8\xa3\x03\x4f\x10\x66\x97\x65\x38\x91\xdd\xde\x0d\x0b\x79\x00\xe8\xca\x06\xad\x52\x59\x10\xe2\x18\x42\xa3\xda\x7b\xb1\x6a\x9e\x14\x0b\x1d\xb4\x98\xd3\xd4\x42\xcf\x2c\x99\xd7\x0c\x14\x32\x57\x36\x96\xc6\x90\xad\xde\x7a\x77\x29\xa9\x2f\x5a\x5f\x50\x1e\xc2\x47\x70\xb9\x36\xf7\xc9\x03\x95\x59\x6f\xd0\x71\x0b\x6d\x58\x91\x07\xc8\xd1\xc5\xd8\x97\xbb\xc8\x78\x2a\x0a\xca\x1f\x36\xf7\xaa\x2c\x18\x3e\xc7\xf3\x4f\xa4\x29\x18\x2a\x0a\x8b\xc9\x20\xaf\xf7\x22\x54\x2d\x12\x3e\xa1\x7f\x67\x90\xfb\x90\x2a\x36\xbc\x59\x13\x0e\x30\x1c\x5b\x32\x71\x6e\x65\x60\x64\x72\x57\x4b\x58\x45\xb7\xb1\x3d\x65\xd4\x53\x4c\x2f\x41\x80\x3e\x18\x88\x92\x24\xb2\xb0\xce\x27\xa2\xad\x0d\x3f\xc2\xb8\x03\xc7\xfc\xa8\x25\x11\xec\x61\xe8\x1a\x06\x20\x55\x04\x7b\x83\xfb\x85\xbd\x7a\x0c\x8a\x51\x86\x6e\x8f\x42\x6b\xd4\x0b\x9b\xfa\x7e\x97\xbb\x86\x13\x0c\x19\xd7\x4a\x94\x05\x70\x3d\xc0\x58\xee\xcb\x1d\xac\xd4\x73\x19\x36\xaf\xc2\x8a\x0b\x1e\x59\x0c\x9d\xfd\xef\x2c\xfb\x00\xb9\x41\x90\x33\x8f\x09\xd7\x2b\x14\xcf\x16\x50\x20\x8b\xcd\x9c\xd5\x3a\xc0\x76\x0f\xf0\x19\x3f\x0b\xb5\xd6\xe9\x09\x91\xf9\x64\x8d\xd9\x15\x02\x0a\x63\x72\xeb\x6b\x9f\xc5\xb8\xc1\x2c\x06\x7a\xe2\x33\xdc\xad\xef\xdc\xe8\x0c\x8b\x26\x7b\x7d\x2e\xbc\x8b\xee\xa9\x97\xb4\x17\x27\x65\x78\xc2\x48\x9d\x43\x6a\xed\xc6\xa6\x9e\xb3\xaf\xf0\x61\x63\xd3\xd8\xd5\x7d\x51\xe6\xe5\x1d\x40\x35\x36\x36\x81\x44\xa4\x1f\xa2\xb0\xbe\x83\xa9\x06\x61\xd9\x74\x8a\x5d\xc0\x07\xca\xad\x39\x3d\xe5\xcb\xe7\xd3\xf8\x7a\xaa\x4e\x8d\xa6\xb2\x49\xb3\x37\x49\x5a\x6e\x1b\x0c\x84\x9d\x9d\x98\x0b\xbb\xb2\x9b\xa5\xad\xcc\xe9\x9f\xff\xfc\x03\x56\xab\x67\x9b\xcc\x79\x52\x10\x78\xe5\x15\xc2\x2b\x95\x51\x77\xc5\x9d\xa2\x9f\xd4\xe8\x3c\xea\x03\xde\x3e\x00\x55\xc0\xed\x05\x67\x42\x78\x4e\x46\x94\xbb\x47\x71\xe6\x3d\x67\x1e\xcb\x47\x14\xe6\x58\x97\xd5\x32\x4b\xbb\xaf\xe9\x1d\xb3\xb6\xf8\x07\x0a\x4f\x04\x5f\xcd\x6a\x1a\x78\x3c\x4d\x15\x99\xfc\xe1\x92\xa6\x3e\x14\x5f\xd8\x85\x84\x12\xc0\x4c\x6c\x0d\x3d\x41\x56\x51\xba\xad\xe0\x0e\xd3\x14\x06\x55\x18\x82\xd7\xde\x15\x05\x16\x12\x4c\xd8\x60\x5d\x0b\xf8\x8e\x9a\x0e\x8f\x6c\x5b\xb0\x4a\x22\xd2\xc8\xab\x42\x6d\xb3\x6f\x68\x30\x3d\x30\xfb\xeb\x46\x53\xd8\x84\x64\xdb\x7e\x64\xb8\xd4\x39\x06\xd1\xf4\xf5\x43\xb3\xdb\x8b\xa8\x12\x7b\xe1\x9b\x3a\x54\x4a\xa9\x03\x88\x47\xd6\x44\x0c\x17\xdf\xd8\x34\xdb\x6d\xfa\x0f\xe9\xa2\xde\x66\xab\x1d\xa6\x57\xc1\xfc\xf0\xb1\xab\xdc\x17\xfa\x94\x85\x62\x13\x7e\x26\xc2\xf5\xb3\xf9\x6c\xed\xd6\xcd\x58\xb2\xc2\xf0\x39\xd7\x0d\xb7\x08\xe3\x7b\x2a\xc9\x8a\xb2\x78\xcd\x96\xc9\x83\xe4\x62\xd2\x54\x2b\x87\x90\x11\xce\x65\xd3\x6d\x75\x97\xf4\x89\x06\xd0\xf8\x29\x8d\x0c\xf7\x52\x0e\xb4\x61\x0d\xc7\x1d\x6c\x1e\xc0\x3c\x2b\x3a\xe2\x5e\xda\x65\x25\xfd\xde\x0e\x80\xcb\x44\x22\x2e\x07\xab\xd2\x88\xca\xb6\x28\xe9\xef\xee\x2e\xf2\xc3\xaa\x27\x05\xac\x08\xde\x08\xc0\x93\x0c\x28\x83\x7a\xb7\x05\x44\xaf\xbb\x1a\x39\x3a\xe8\x51\x00\x1e\xd4\xc1\x34\x40\x7e\xb1\x5d\xb1\x59\x47\x36\xf1\x47\x49\x99\x77\x57\xdd\x13\xc1\x7d\x0c\x49\xdc\xb7\x4d\x09\xe5\x6b\x67\x4d\x87\xc0\x49\xe2\x4e\x1c\x6b\xd1\xab\xb6\x47\x03\xb2\xf6\xfc\x61\xdd\x15\x4b\x69\x2d\xdb\xa8\x8a\xa0\x5a\xdf\x63\x4c\xb6\x9d\x1c\x83\xe5\x8a\xc1\x3e\x64\xe3\xaa\x30\xdf\x1a\x48\x22\xb4\x56\xa5\x80\x74\xc0\x03\xa5\x58\x0e\x61\x39\x12\x80\x9c\x3d\x24\x45\x03\xc5\xd6\x0c\x6f\x5e\xfe\xa2\x17\x61\xea\x5c\x30\x6c\x4f\x54\x57\x6a\x63\x1f\x76\x02\x7e\x56\x36\x00\x19\xc7\x8a\x55\x57\x94\xca\x08\xc7\xe3\x7f\xe1\xfc\x1f\x1e\x5d\x37\x6b\x83\x03\x3b\x65\xc0\x9d\x5b\x1d\x7b\x5c\x8f\x56\xef\x22\xc4\x36\x9d\xd8\x2a\xe4\xd6\xcf\x78\xad\x54\xd4\x56\xe5\x06\xdd\xed\x12\x8a\xa7\xac\x48\x99\x27\x92\x03\x0b\xae\x0b\x0c\xa0\x20\x9a\x00\xf7\x7a\xa4\x37\x5e\xeb\x4e\x57\xc7\x82\x67\x23\x85\x95\x25\x04\xfa\xd0\x50\x7d\x47\x44\x52\xe6\x90\x35\x58\xbd\x00\x68\xf8\xbb\xa4\x4a\x73\x62\x30\x22\x18\xd2\x1e\x03\xeb\x10\x2a\xb4\x69\xab\xa9\x77\x00\xf7\x2f\xca\x96\x6b\xa5\x47\x4d\x12\x87\x1e\xc9\x98\xec\x29\xc7\x1e\x84\x5d\xa0\x12\x53\x0a\xfa\xd5\x03\x09\xf5\x05\x88\x0a\x96\xa4\x84\x1a\x02\xa2\x2d\xf4\xd5\x50\xe9\x31\xc7\xe5\xe1\xad\xf7\x49\xfd\x44\xe2\xa4\xa6\xa2\x7d\xb4\x8a\x31\x95\x61\x0e\xa6\x50\x7e\x76\xe3\x41\xd1\xa2\xb0\x7a\xac\xfd\x16\x15\x61\xd6\xfa\x51\xcf\xbe\x81\x2e\x61\x68\xb9\x84\x12\x98\x16\x7d\x43\xc0\x1a\x8c\xa5\x63\xd4\x4f\x2e\xfe\x96\x57\xaa\xb9\x1a\x58\xc1\x93\x39\x82\xb7\xb6\x48\xa1\xec\x0a\x5d\x98\x30\x98\x84\xe5\x62\x59\x65\x0a\x4c\xf4\x80\x15\x54\x87\xc5\x1f\x6d\xab\x25\x7c\x42\xa8\xb5\x98\x35\x12\x9d\x41\xdb\x61\x03\xd4\x14\xc0\x35\xbd\x55\xe7\x24\x96\xe5\x27\xe6\xa1\xcc\x77\xc8\x52\x92\x98\xba\x29\xab\xe4\xce\x06\x4a\x83\x28\xbe\x89\xf7\xba\x4a\x11\x17\x66\x90\xdc\xdd\xb9\xc5\xdb\xd8\x01\xcf\x8e\x1e\x22\x2c\x99\xab\x55\x96\x59\xb1\x7e\x50\xcb\x39\x0e\x8a\x76\x16\xdc\x98\x88\x97\x2a\xab\xd0\x0a\x2a\x3b\xcf\x67\x2b\xca\x2c\xed\xbe\x84\x21\x49\x98\x16\x9e\xd3\xf2\xe4\x88\xa1\x53\x12\x9b\x71\x01\xde\x57\xef\xec\x21\x93\x9e\x74\x48\x55\xe7\x13\xb3\x62\xeb\x94\xd1\x96\x40\x4f\xe8\x48\x1e\xc4\xbc\x50\xfe\x7e\x9c\x94\xc5\x6b\xba\x1a\xdf\x95\xd5\xe6\xc0\xbd\xd8\x6e\xdc\x01\xfd\x98\xbe\xdb\xac\x36\xdf\xc1\xd8\x7f\x7f\xf0\x52\x53\x19\x39\x62\xce\x7a\x5d\xd9\x24\x85\x63\xad\x37\xae\xf5\x8c\x7c\x32\x2e\xa7\xc2\xfa\x4b\xf2\x31\xd9\xeb\xeb\xf1\xdc\xbf\x30\x8c\x88\xc3\x2d\x6f\x37\xcb\x32\xc5\x38\x2c\xe4\xe4\x98\x6a\x8b\xf9\x65\x02\x12\x16\xf9\x6d\xcf\xfa\x3c\x8e\xc0\x70\xdb\x6c\x93\x22\xd3\x7c\xd9\x7d\x91\xba\xec\x0b\x9a\x1c\x89\x49\x77\x15\x86\xbf\xf8\xc9\xf8\x30\xb3\xda\xd5\x4d\xb9\xc1\x8c\x3f\xac\xd3\x00\xe7\x0f\xe7\x0d\x71\x57\xfa\xeb\xf9\x1f\xd6\xd1\x04\x28\x8d\x1b\x5b\xa0\xfd\x16\x51\x85\xfd\x1a\xf5\x4a\xdc\xd5\xdf\x00\xea\x0b\xeb\x45\x31\xdc\xaa\x3e\x52\xeb\x90\x11\x9b\x80\x5b\xbc\x82\x2a\x44\x35\xe3\x70\x28\xd3\x70\xcd\x2a\x68\xdc\xfc\x4d\x99\xda\x1c\x2e\xbf\x3b\x72\x0b\xf9\x26\xa6\xeb\x97\xc9\x25\xd5\xc8\x50\xca\x11\x80\xb0\x81\x82\xc8\xe1\xf8\xaa\xe4\x39\x64\x26\x18\x6b\x05\xad\xe0\x54\xe1\x81\x10\x61\xf4\x1b\x4d\x7a\xc4\xe9\x4b\xb0\xaf\x8b\x52\x55\xe5\x62\x9c\xd0\xd3\x77\xb0\x52\x8c\x92\xb9\x08\xd2\x0d\x98\xf0\xa2\xe3\x41\x8c\x56\x58\x31\x47\x67\xc7\x0a\x41\x4a\xc6\xfb\xa1\xc1\x41\xdd\x6b\x02\x3c\x60\x4a\x10\x66\xbf\x28\xc9\x39\x50\xa6\x16\x2d\x54\x75\x56\x86\x8e\x9f\x9e\x23\x42\x58\xe8\xd9\x09\x16\x1b\x19\xe5\x0f\x99\xe8\x34\xf6\xc4\xcd\xd1\x82\x49\x72\xaa\x62\x7d\x40\xe4\x15\x86\x79\x30\x6c\x5b\xae\x56\x49\x0d\x66\x14\x39\x88\x48\x65\x42\xe4\xed\x39\xb9\x29\x1c\xe1\xd5\x88\xf0\xfe\x16\xe3\x25\x28\x1b\xa2\xed\xd5\xed\x96\x6c\xc1\xfd\xb0\x54\x96\xcc\x81\x1d\xbc\xdc\x8b\x78\x00\x4f\x08\x8d\x37\xa6\x47\x20\xa0\x85\xc5\xca\x47\x6d\xec\x3b\x0e\x3e\x31\xf6\xe0\x88\xf9\x48\xb1\x9a\xde\x83\x33\xcb\x5c\xca\x90\x36\x48\xf6\x02\x73\x91\x1f\xe2\x8b\x71\xaa\x99\xd8\x83\xa6\x1c\xae\x16\x31\x6c\xc8\x42\x0f\x10\xf7\xcf\xad\xab\x96\xef\xa9\x46\x45\xf0\x18\xf8\x7e\xfd\xa4\xe0\xf4\xab\x3b\xcb\x32\x3a\xfc\x3a\x02\xd7\xe1\x2e\x15\xce\x20\x5a\xcd\x47\x18\x8a\xc1\x6d\x0d\x47\x55\x8b\xce\xfe\x98\x29\xb4\xe1\x8c\xaa\xf5\x40\x13\x52\x2a\xe0\x9e\x94\x0b\x12\xbd\xdf\x0c\xf9\x8f\x91\xa3\x52\xa2\xb0\xb5\x29\xec\x97\xc6\x93\x51\xfb\x9e\xd5\x09\x56\xcf\xb2\x66\xdc\x3a\xa3\xac\x5c\xff\x16\x98\x05\x96\x3e\x18\x2c\xd4\xaf\x7b\x20\x06\x3d\xf4\xcd\x88\x56\x3b\x70\xa1\x51\xf0\x90\xf8\xf8\x0b\x5f\xfd\x80\x7e\x9e\xca\x7e\x86\x07\xbb\xcf\x05\xd7\x6e\x79\x62\x06\xb7\x0e\x35\x52\x78\x1f\xd8\x83\xfb\x00\x09\x56\xb7\xd6\x56\xaf\x9b\xf2\xb5\xfb\x2f\x02\xaa\x04\x42\x17\x8c\x28\x91\x9e\xb3\xd0\x24\x80\x34\x70\xac\x7a\x52\xcb\xbd\xab\x21\x08\xb0\x55\xd6\x2c\x2d\x1e\x92\x28\x0d\x46\x53\x42\xb9\x5f\xc6\x1b\xe8\x23\x8f\x5d\x58\xb5\xdb\x53\x32\xe7\xd1\x4a\x87\x4b\x00\xd5\xd7\x7b\xce\x3e\x67\xab\x43\xa6\x52\xc5\x11\xb2\x5a\x6a\xec\xb5\xbc\x60\xdf\xce\x71\x0b\x3f\x48\x63\xef\x23\xbf\x17\x5b\xac\x1b\xfe\x0a\xe8\x9c\x66\x0a\xce\x73\xe3\x9c\xa9\x6b\xbc\xea\x06\xd0\x14\x7d\x81\x0e\x56\x65\x51\xef\x36\x68\xe8\xc3\x47\xd8\xd9\xf0\x88\xa1\x26\x29\xee\x32\x62\x95\x42\x3e\x04\xd1\x7c\x50\xc0\x93\x6a\x03\xc7\xb0\x5c\x81\xfc\xe1\xc8\xac\x93\x4d\x96\x23\x37\xea\x7d\xb9\xab\xed\x7d\x99\xa7\x9c\x0b\xaa\xfd\xa5\xc5\x49\x58\xc9\x1e\xc3\x3d\x9a\xa7\x84\x9a\x5c\x95\xd5\xb6\xac\x18\xcb\x08\x58\xed\xf4\xd1\x42\x78\x1c\x48\x6d\x34\xd7\x2f\xd7\x14\x25\x72\xc7\x67\x84\x9d\x0b\xfa\x1a\xa1\xd2\xf6\x7a\x97\x03\xec\xa8\xd6\x6c\x45\x75\x99\x3f\xe0\x30\xaf\x93\x07\x24\x61\x07\xfb\x20\xb9\xa3\x32\x94\x36\x0e\x09\x5e\x23\xf7\x0b\x72\x81\xfb\x0f\x38\xc7\x23\x32\x83\x60\x98\x02\x58\xb2\x69\xf6\x5b\xa6\x8b\x75\x77\x58\x59\x78\x30\x4e\xd2\x98\x55\x9e\xd4\xb5\x2a\x88\x68\x07\x01\x38\x01\xbb\x93\x7f\xb5\x5e\x6e\x3c\x91\xbc\xbb\x10\x02\x56\xef\xf6\x47\x51\x60\x04\x5b\x89\x13\x64\xbf\x6c\x2d\x49\xac\x20\x75\x04\x06\xd6\xb9\x08\x43\x59\x53\xb1\x19\x3e\x3d\xe8\xad\x86\xf3\x54\x69\x83\xec\x3e\xa9\x75\xb5\x84\xd2\xe5\x01\xe1\xc2\x5d\x8d\x84\x23\x10\xae\x2c\x5e\xcb\x0b\xb0\xb5\xbb\x02\x1e\x0d\x77\xf9\x0e\xe5\x53\x98\xb9\x01\xb6\x89\xb3\x06\xdc\x02\x83\x10\x21\xc6\xa3\x2c\x81\x00\x65\xe8\xa8\x2b\x80\x23\x1f\x23\xfa\x05\x17\xde\xd8\x4b\x80\x32\xc8\x46\xef\x2f\xb5\x69\x36\xb6\xb9\x2f\x53\xbc\x30\x56\x36\xdd\x55\x40\x5c\xac\x39\x08\xcc\x67\xbb\xc7\xd1\x65\xcd\x59\x2f\x2f\xaa\x15\x54\xb8\x0a\x08\xc8\x16\x00\x75\x63\xfb\x4b\x81\xba\x3e\x20\x2c\x9d\xa0\x81\x64\x82\xb4\xbf\x6f\x44\xd4\xa0\xdf\x10\xb3\x41\xeb\xb0\xfc\x0d\xc8\x72\x6c\xfb\x4e\xa1\xc4\x1d\xd0\xa4\xa5\x66\xbd\x2b\xe0\x0c\x25\x3b\xd5\x47\x67\x6d\xda\xbe\xf0\xb3\x02\xce\xe0\x04\x4a\x69\xa0\x98\x02\x8f\x00\x0c\xd3\x60\xb7\x10\xe1\x02\x69\xc2\xa5\x45\x3f\x3b\x48\xae\x88\xe8\xc5\x26\x21\x9c\xe5\x78\x1d\x64\xa4\x8a\xce\x31\xa9\x83\x82\x7c\xe0\x93\xf3\xe5\x5e\x87\x39\x32\x0d\x6e\xf1\x64\xd5\x51\x6b\xf6\x23\x45\xa3\x24\xc6\x39\x56\x35\x05\x2a\x5e\x70\xfd\x25\xab\x2e\xbb\x3e\x01\x2f\xd6\x3a\xf8\xa8\xaa\x62\xdc\x47\x82\xc9\xcc\x6a\xc1\x26\xab\xbb\xad\x52\x2c\xa6\xee\x14\xde\xda\x66\x47\x64\x70\x14\x84\x07\x4f\x16\x10\x1f\x47\xbd\xa1\xc4\xb0\x85\x50\x1d\x57\x25\xab\xc6\x56\xd9\x7f\x12\x64\xf7\xc0\xf5\x85\xfd\x0e\x43\xc6\x3c\xa8\x4c\xb2\xd4\xe3\x6f\x1f\xda\x62\xb1\x79\xbb\xa3\x64\x8c\x0e\x14\x4b\xa4\x85\x6a\xa7\xd7\xa6\xa0\x3b\xcd\x4d\x75\xd1\xc3\x5c\xcc\x1c\x9c\x98\x60\x11\xd9\x67\xde\x59\xbd\x4b\x92\x92\x0b\xc1\x80\x03\xf8\x4d\x40\x5b\x41\xfc\x12\x96\x1d\x3d\x10\xef\x8d\xd9\xf4\xea\x58\xc0\x3f\xba\xfd\xca\xf9\x39\xd4\xf3\x2e\xcc\x2d\x69\x3f\x42\xb8\x08\xd5\xe3\xd8\xd1\x26\x06\xe3\x48\x32\x31\xb0\x8c\x77\xdb\x14\x2a\xb3\x14\xe6\x08\xb6\xac\xdf\x35\x32\x0e\x95\xea\x0a\x4d\x52\xe5\x55\x0b\x69\x25\x75\xd7\x63\xe1\x49\xe7\x9e\x7e\x68\x6c\x86\xe2\xc4\x78\x4b\x9f\x0c\xf9\xd4\xc2\xe2\x78\x64\x3d\xd3\x60\x8b\x13\x1d\x2e\x43\x12\x38\x33\x98\xba\x83\xcc\xe6\xcc\x5b\x46\x61\x03\x4d\x24\x0f\xb8\x5a\x7a\x51\x59\x11\xd3\x0c\xa7\x21\x76\x39\xe1\xde\xb6\x55\xd9\x94\xab\x32\xe7\xb2\x2a\x0d\x4d\x4b\x80\xce\x57\x3f\x88\xc0\x0e\x4f\xec\x04\x3c\x13\x0e\x4e\x33\xdb\xbe\x1d\x67\xb3\x77\xeb\x60\x59\x0f\x7c\x59\x82\x16\x68\xc1\xe6\x5e\x14\xc7\xa6\x58\x75\x4f\x19\x88\x36\xea\xf6\x2b\x20\xb7\xe4\x7f\xc2\xdb\xd9\x0d\x2c\x4a\x29\xa5\xdb\x26\x75\xfd\xe8\x1a\x5c\x56\xee\x2a\xc3\x83\xb1\xd8\x26\xab\xcf\x90\xc3\xae\x6c\x92\x12\x8e\x80\xfc\x28\xa6\x29\x1f\xfa\xec\xc7\xc2\x72\x3c\x73\xa0\x7e\xea\x73\x0a\xf5\x00\x6c\x78\x05\x62\x71\x4b\x3c\x67\x19\x97\x43\xc8\x9d\xa5\x08\x5c\x61\x45\x02\xd6\xc9\x01\x68\xaf\x40\x8a\xd8\xb2\x12\x39\x54\x9f\xc3\x0a\x9a\xa6\x1a\x41\x05\x69\x95\xd5\xd9\x1c\x46\x20\x60\xb2\x29\xe4\x09\x5d\x5a\x84\x5f\x60\x81\x98\x2f\xc3\xdd\x9b\x47\x2c\x46\xd1\x70\x6f\x1d\x69\xea\xa9\x9c\x90\xd4\x0e\x06\xdf\xfa\x98\x40\xc1\xab\x4e\xfa\x9b\x8e\x67\x24\xc3\xbc\x35\x0c\x55\x32\xa0\x54\x9d\x58\x35\xbc\x01\xc1\x86\x57\x19\x1c\x3e\xcd\xa1\xcc\xd5\x3f\x1b\x93\x43\x3d\x83\xc0\x68\xb1\x90\xdf\xae\x05\xb4\x28\x77\x8d\x12\x0a\x83\x93\xb9\xb7\x07\x07\xa1\x25\x18\x5b\xea\x03\x99\x00\x7f\x26\xd5\xd1\x63\x29\x07\xa9\x5b\xb5\xa5\x00\xf5\x40\x91\x63\x96\x34\x54\xe1\xc3\x62\x3c\x90\x1e\xa7\x61\xcb\x9a\xd8\x1c\x1d\x58\x23\x34\x76\x1c\xe7\xf2\xd0\x57\xca\xd5\x94\x8f\xd4\x0a\xa4\xca\x63\xea\x06\x74\x3c\x1e\xb9\x7f\x2d\xa8\x74\x7c\x2c\x81\x7e\x8a\xd8\xf4\xbf\xdc\x1d\x12\x74\x22\x46\x94\x89\xa5\x70\x07\x1c\xb0\xe1\x10\x85\xe8\x35\x48\xd7\x31\xe9\x01\x44\x61\x7b\xf1\x13\xfe\x6d\x84\x7f\x6a\xdc\x24\x42\x21\x07\x23\xc8\x98\x8b\xe6\x00\xc1\x6d\x44\x25\x2b\x84\x25\x83\xdc\x42\x9a\xf6\x35\x90\xe7\x10\x50\xf6\x64\x32\xfb\x8b\xc8\xb7\xc9\x39\x92\xb6\xaa\xc5\x49\xe2\x67\x1f\xbf\xec\x94\xc0\x83\xd6\xfd\x4a\x25\x1e\x2e\x08\xd9\xa3\x84\xe5\xc1\x74\x82\x7c\x13\xb2\x1a\xb2\x05\x21\xb1\x26\x46\x04\xf7\xe7\x56\x4e\x91\xf3\xf2\xf4\x87\x76\x03\x7e\x36\x65\xe5\x13\x01\x33\x29\xd3\x04\x77\xa5\x7a\xf0\x3c\x68\x52\xff\xa2\x42\xc4\x98\xeb\x12\xf0\x48\x45\x03\xa5\x39\xf1\x6b\x71\x01\x3c\x80\x4f\x64\xd6\x0e\xa6\x37\x39\x01\x8a\x03\x8e\xf9\x30\xa2\xdb\xc6\x02\x44\xd5\xec\xd5\xb1\xdb\xf3\x02\x19\xdb\x64\x75\xa8\xf7\x2a\xf1\x11\x12\x87\x6a\xcd\x13\xd1\xa0\x72\xbf\x0f\x10\x35\x08\xd6\x8c\x3b\xe1\x99\x1b\x80\xfa\x44\x86\x04\x08\x73\x93\x5a\xc5\x00\x65\x56\x4a\xe6\x53\xa7\xa7\xaa\x3e\xa4\xc7\xe6\x92\xe7\xb6\xc1\x82\x37\x8c\x5f\xc0\xbd\xe8\xe6\x99\x43\x15\xae\x25\xa8\x5c\x50\xae\x29\x75\x0e\x6c\x0f\x95\x26\x7e\x68\x14\xb3\xb7\x7a\x8b\x3d\x36\x17\x76\x95\x93\x14\x51\x49\x92\x1b\x21\x14\x8d\x35\x13\x10\xfc\x47\x6e\x06\x44\xf7\x37\x56\xab\x5b\x44\x81\xbc\x02\x54\x9a\x2a\x45\x0c\xf5\xd2\xb5\x5e\x55\xac\x3c\xab\x80\x68\xbe\x0f\x8a\x47\xa3\x33\x4b\xa4\x9a\xee\x31\x12\xee\x04\xae\x83\x8e\x9a\x23\x81\xb9\xb5\x66\x2e\x6b\x8e\x71\x9f\x69\xd5\x55\x10\x53\xda\x0a\x5b\xa1\xdf\x51\x6d\x0f\x26\x12\xb5\x6d\xf5\x19\xba\x14\x89\x05\xbe\xef\x99\x52\x85\x0b\xcc\xbf\x64\xca\xbb\xbf\xf4\x76\x58\x90\xf3\x78\x7e\xb5\x60\x5e\x6d\xa8\x86\x41\x05\x6b\x20\xda\x70\x27\xd6\x80\xa3\xe7\x9a\xa2\x70\xe0\x59\x3f\x2d\xc4\x04\x38\x4f\x23\xd8\x54\x09\x84\x2b\x16\xf4\x20\x41\x91\x35\x22\x81\xe2\x6f\x9f\x88\x77\x22\xc4\xc7\x51\xd1\xad\x07\xb9\x73\xf0\xde\xd5\xd8\x14\x74\x00\xd9\x8c\x4c\x4c\x4f\x3f\xfc\x49\x4c\xd7\x27\x8e\xbd\xad\x36\x68\x71\x74\xd8\xd3\x74\xf3\x7a\x9e\x07\xf6\x02\xe6\xd6\x01\x5e\x24\x18\x5e\x2c\xfa\x08\x20\xc3\xe1\xcd\x21\xb7\x7a\xdf\x85\xe1\x97\xe1\x13\x82\xe2\xbe\xc8\x54\x71\xbd\x85\xd9\x6e\x80\x81\xf5\xb4\x5a\x7c\x31\x66\x7c\x87\xe3\xe8\x50\xfb\x75\xd8\x01\x9a\x8b\xb6\x6b\xa7\xd1\x4f\x18\xfc\x9a\xf7\xc8\xdd\xfa\x02\x52\x13\x8c\x97\x2e\xf3\x89\x00\x85\xc1\xda\x86\x0c\x27\x68\x2f\xdb\x90\x53\x01\xb7\x03\x7d\x1d\xdc\x41\xd1\x07\x4c\xe1\x80\xe8\xcd\x51\x68\xeb\x57\x0c\xf7\x61\x07\xcb\xa4\x76\x4f\xd9\xde\x4f\x11\xdb\x49\x84\xe8\x6e\xa1\xef\x12\x6d\x76\xb2\x29\x95\x2b\x59\x08\xfa\x5a\x52\x2b\xcb\xfe\x67\xf2\xeb\xcb\x87\x96\x7e\x3b\x76\x97\x62\x03\x8f\xc9\x9e\x65\x60\x16\x2d\xc6\x7e\x36\xb1\x90\x2e\x8d\xcb\x29\x94\xfe\x69\x38\x73\x54\xe5\x9c\x68\x0e\x5d\x59\x49\x7d\xfc\x11\x43\x67\x75\x92\x92\xbf\xaf\xa9\x40\xbf\xbd\xf3\x32\xdc\xc2\x0f\x65\x96\x32\xfd\x7e\x9e\xb7\xca\x8f\xbc\xd2\x84\x2e\x30\xe9\x41\xb7\x1d\x85\x22\xd8\x22\x65\x73\x40\x45\xc5\xfa\xa0\x49\x72\x57\x25\xdb\xfb\xe0\xcc\x3a\xc5\x68\xc6\x07\x05\xaf\x02\x8b\x1c\x84\x1e\x80\xc5\x4f\x93\xb7\xb6\xfc\x1a\xb2\x6f\x7d\x6d\x09\x05\x22\x55\xe8\xb9\x6d\xd7\x21\x06\x11\x42\x06\xe8\xd4\x1e\x7b\xdb\x12\xb3\xbb\x14\xea\x45\xdd\xba\x26\xcb\x7b\xcd\xc3\xa0\xde\xa8\x48\xdd\x6a\x0e\x07\x31\x2c\x7a\xf1\x15\xb2\x6e\xd1\x26\x58\x5a\x1f\x79\xb4\x52\xeb\xe1\x22\xf2\x41\x62\xd1\x08\x86\x80\xcf\xfa\xe1\x00\x9a\x9c\x8d\xd5\xb6\x0a\x06\x8a\x51\xff\xb3\x29\xcd\x0f\x27\x26\x05\xeb\xc5\xb3\x72\xdb\xba\xf6\x2b\xf4\xaa\xac\x6c\x09\xa3\xfe\xeb\x06\x51\xf5\xe9\x60\x97\xa0\x27\x99\xad\xbf\xae\x2f\x11\xce\x78\x86\x86\xc1\x3a\xab\xea\x06\xa5\x14\xc4\xc7\x90\xab\x8d\x8e\x9a\x72\x7d\x78\xc5\x70\x99\xe9\x9e\x8a\x4b\x43\xe7\x4c\x37\xd7\x43\x91\x57\x3b\x4a\x13\xfa\xa7\xca\xf8\xbe\x09\xc6\x97\xe0\x16\x2b\x9b\x6d\xbd\xee\x16\x34\x0a\xe3\x75\xfe\x78\x90\x72\x98\xee\x1e\xf3\x12\xee\x2c\xf1\x25\xbb\xb2\xd1\xbc\x9d\x50\xbf\x4d\x2c\xc1\xf7\x65\x6b\x28\x18\x42\x21\x2f\x80\x8e\xba\xde\xf4\x9d\x23\xe3\xb0\x31\xf0\x28\x88\xb1\xc9\xab\x53\x82\x41\x34\xc1\x4c\xfb\x05\x10\xe9\x82\xa5\xbf\xef\x92\x1c\x9c\x4d\x91\x96\x06\x66\xc4\x80\x71\x54\x00\x03\x72\xc7\x86\x08\xdf\xd3\x13\x96\x6f\x1a\x22\xc5\x56\xb1\xb2\xce\x93\x20\xc3\x93\x72\x81\x1f\xb0\xda\xab\x55\x4c\xc0\x90\x3e\x9d\xec\x40\xa2\xae\x4e\x1d\x16\xa8\x26\xe8\x86\x12\x25\x5a\x88\x31\x91\xb2\xc0\x61\xb1\xca\xf2\x3c\x41\xa4\xb3\xd0\x87\x74\x53\x24\x10\x9d\x07\xeb\x98\xb2\x0a\x09\x67\xac\x40\xb0\x6e\x45\x89\xa1\x27\x13\xd8\xba\x55\xd4\x9c\x3c\xfb\x6c\xe1\x88\x97\xb5\xc1\xa1\x80\x44\x06\x49\x55\x35\x17\x25\x26\x3e\x03\xc6\x00\x0d\xde\x75\xc7\x34\x6e\xc7\x10\xbe\xdb\x7b\x57\x15\xfb\x4e\x79\xa2\xa5\xea\x64\x74\x09\x91\x7e\x46\x6d\x24\x66\x6b\xc4\x55\xd1\x33\x03\x01\x67\xda\x72\xaf\x08\x67\xb0\x24\x0f\x47\xb8\x53\x76\x19\x51\x46\x1f\x2c\x0a\xba\xab\xfc\x00\x74\xb6\x3c\x72\xef\x10\x76\xd6\x59\xc8\x43\xbe\xf4\xe8\x23\x64\x44\x5f\x94\x8f\x45\xdd\x54\x36\xd9\x28\x39\x20\xf8\x12\xf0\x34\xc9\xa1\x73\xa0\x0a\x29\x4c\x91\x84\x17\xab\x10\xa3\x27\xe1\x11\x1b\xb8\x90\xe2\x44\x44\x54\x9d\x1a\xf9\xb1\xd7\xe5\x98\xc8\x7b\x02\xef\x3c\x28\xa2\x15\x6e\x83\x90\x6b\x5d\xea\x81\xb4\xd6\xeb\x72\x1f\x96\xfe\x28\xe3\x51\x93\x6d\x0d\x0b\x33\x20\x41\x3a\x95\xcb\x19\xa0\xa5\xaf\xb3\x3b\x92\x3f\xc2\xf7\x60\x05\x23\xd6\xad\x69\x76\xaa\x88\x85\x1c\x3d\x81\x1d\xa4\x24\xeb\xda\x22\x84\xb5\x2c\x2c\x7f\x06\xf0\x61\x68\x72\x74\x9f\xb1\xb1\xd5\x1d\x2e\x1c\x4d\x7d\xe5\x4e\xb6\xa7\x77\x2a\x42\x82\x19\x42\x55\x98\x6e\xe7\x08\x25\x8e\x09\x9f\x86\x69\x1c\x55\x57\x95\x84\x7e\xdd\x06\xa7\x01\x58\x24\xaf\xd5\x07\x1e\xef\x93\xc6\x6d\x4f\x7f\x1c\x32\x44\x1f\xf3\x26\x98\x35\xdf\x7f\x03\xc4\x83\x29\x54\x17\x62\x70\x45\x14\xdd\xee\x93\x94\x44\xff\x72\xaa\xdc\xd9\x29\x9a\x37\xa2\x87\x14\x53\x2b\x32\xdb\x7c\xe7\xda\x25\xfa\x36\x61\x05\xc2\xc1\x9c\x5b\xc0\x09\xc3\x8b\xf5\x40\x9b\xc4\x8e\xd1\xbf\x07\x5c\x7c\xd3\xa2\xda\xa5\x52\x38\xb9\xe3\xed\x7a\x5d\x56\x4d\xdd\x31\x97\xc9\xc3\x76\xa7\x4e\x9f\x23\xcc\x59\x34\x2d\x8c\x2c\x99\x4e\x6f\x80\xba\xbb\x1e\x4a\xc1\x0f\x18\xd0\x01\x57\xc2\xbe\xe7\xf5\x7e\xbb\x5a\x1b\x99\xaa\xdc\x27\x39\x25\xbd\x4a\x05\x6d\xc3\x6d\xd5\xd5\x68\x3e\x5c\x2b\x1f\x16\x3a\x61\x3e\x2e\x6b\x20\x68\xa6\xd4\x4c\x7e\x13\xcd\x47\x65\xa0\xd3\x87\xfd\x61\x9d\xfa\x8c\x46\x84\xf7\x51\x64\x6a\xc4\xbe\x44\x1e\x65\x08\xc0\xd3\x24\xb7\x4a\x5f\x21\x6b\x49\x59\x73\x44\xc1\xc3\x97\xa8\x28\xe3\xf4\x34\x36\xd7\xc4\xe0\x28\xe4\x6b\x22\xf5\x34\x60\x28\x47\xcb\x54\x74\x5b\x4a\x02\xb4\x80\xae\xef\xf3\x42\x5a\x2a\x3e\x3e\xfb\x18\x90\xa7\x28\x15\x0c\xa8\xee\x8a\x7d\xe5\x12\x14\x50\x0b\x43\x9f\xaf\x28\x60\xac\x01\xb5\xf2\x9b\x3a\x68\xb4\xf0\xd0\x49\x31\x46\xf0\x49\x4f\x0d\xa3\x47\x9d\x12\x4e\xee\x70\x0b\x7e\x0c\xaa\xf6\xa9\x62\xa7\xc8\x75\x40\x5a\x89\xfd\x0b\xf4\x28\x47\x1a\xcf\x64\x45\xc6\x4d\x89\x12\x10\xa4\xb8\x45\x3f\x8d\xf8\x96\x70\x67\x04\x64\xf8\xd4\x84\x83\x9d\xbd\x49\x8a\xc2\x19\x09\xbe\x4e\xba\x0b\x4f\x5e\xb7\xd7\x06\xc4\x04\xb1\x72\x98\x59\x0c\x5a\x83\x82\xb9\x1b\xba\xf2\x39\xc7\x4c\x5d\x3d\xd4\x24\x48\x22\xf5\x59\x48\xbc\xf3\xfb\x0a\x5d\x7b\xde\x8d\xfb\x59\x47\x55\xa1\x3f\x9e\xdb\x24\xa2\x79\x2c\xf3\x81\x27\x41\x69\xb4\xf6\x17\x86\x4f\x69\x86\x6a\x2e\x07\x47\x39\xef\x84\xc6\x0c\xa3\x74\x75\x83\x6a\x49\x84\x45\x0d\xe2\x03\x6d\xb2\x30\xb1\x21\x74\xa3\x95\xf5\x95\x40\x30\x43\x4a\xf2\x23\xb7\x3a\xf3\xf4\x31\x4b\xfd\x99\xf3\x1a\x19\x64\x02\x47\x3b\x2c\x69\x57\x6b\xf0\xc0\x12\x8c\x98\xcd\x2e\x42\x74\x95\x9b\x4a\xda\xe6\x6a\x8f\x93\x80\x8a\xb0\xa0\x20\x4f\xc3\x13\xd6\x88\x65\x36\x8b\x5a\x65\x3e\x3b\x73\x03\xd1\x2b\x0e\xca\xb0\x80\x0f\xd6\x01\xc8\x5d\x05\x21\xa7\x41\xd8\x49\x3c\x22\x8a\x3d\xc7\x44\x94\x60\x0a\x25\xd2\xb3\x06\x83\x6e\x54\x9f\x65\x52\x5b\x94\xe4\xb5\x44\x2c\xd4\x49\xda\x7e\xe0\xd3\xc2\xd3\x8f\x84\x81\xad\x90\x27\xb7\x8d\x60\xa2\xe2\x95\xef\xc0\xfb\x1e\x6c\x91\x60\x7d\x23\x52\xaa\x53\x50\x1f\x3f\xa1\x39\x18\x8f\x81\xbf\x75\x00\xd3\x3c\x10\x76\xf2\x70\x02\x21\x7a\x87\x96\x85\xf0\x44\x7a\x91\x42\x28\x03\xea\xed\xec\xc1\x6e\xe9\x02\x6f\x78\x6e\x1f\x58\xa9\x65\xb8\x7e\x2e\x60\x32\xc0\x4c\x45\x0d\x1e\x40\x3c\x87\x4d\xf5\x18\xa4\x67\x8d\x05\x26\x4e\x08\xe1\xbf\x18\xe8\x17\x16\x70\x58\xce\xe5\xda\xd7\x0a\xa7\xcf\x97\xf6\x78\x4e\x45\x01\x27\xf8\x97\xb4\x8a\x0d\xe4\x86\x06\xb8\x80\xfb\x24\xe0\x42\xb2\x20\xae\xc0\xb9\xd1\x5d\xdd\x68\xf4\x2a\x17\x5a\x1d\xe8\x2b\xaa\xb2\xd5\xa5\x7f\xb9\xc7\x9a\x56\x15\xd2\x54\x97\x26\xb5\xdb\xca\xd9\x66\xce\x3b\x01\x64\x09\x0d\xd1\xd2\x16\x76\x9d\x35\x1e\x4d\x19\x2c\x08\xe1\x27\x57\xa1\x17\x61\xf1\x3a\x7a\x23\x6f\x88\x7e\xd5\x81\x14\x05\x24\xd0\x9d\x46\x80\xc3\x24\xbe\x90\x07\xe8\xc7\x66\xf0\x97\xf6\x5a\x61\x0a\x3f\x89\xc6\x50\xda\x44\xc8\x6a\x88\xe3\xd4\xdd\x0a\xec\xf7\xb7\x57\x16\xf1\x82\x68\xd0\x71\x27\xa2\xcd\xb2\x53\x30\x10\x1c\x67\xc1\x76\x61\xf9\x5d\x5f\x85\x62\xeb\x9b\x78\xf5\x88\xa3\xaa\x21\x1b\x59\xea\x0e\xcc\x35\xb2\xa9\x32\xa1\x32\x67\x39\x59\xf1\x2a\x14\xad\x40\x23\x16\x57\x43\x9e\xd9\x07\xeb\xc1\x14\xb4\xe9\x22\x77\x17\xd5\xbb\x04\x71\x55\x68\x31\xaf\xca\xa2\xb0\x01\x5d\xa8\xbb\x59\xf3\x10\x1a\xe7\xf6\x0b\xce\x33\x9e\x6c\xba\x40\x5e\x79\xc6\xe0\xb5\x6d\xab\x72\xb5\x63\x2f\xeb\xc1\xee\xc9\x05\x8e\x3a\xdb\x1c\x8a\xba\x51\x90\xbf\x67\xc2\x51\x72\x52\x21\x7c\x2d\x6b\x7b\xf6\x4e\x09\x1b\x67\xc2\xb5\xc3\x88\x5d\x69\x9b\x5c\x17\x92\xc3\x70\x7d\x65\xe2\x3b\xed\x24\x75\xdc\xe8\xa2\x6f\x51\xba\x31\xc0\xe6\x67\x75\xcb\xbb\xc6\x95\x4c\x71\x9e\x90\xc4\xa0\x6f\x51\x40\xf0\x1b\xd2\xcf\x52\xed\x4f\xc6\xea\xb0\xfd\xd2\xac\x36\x03\xd0\x9e\xce\xe0\x42\x29\xab\xfd\x80\x44\x98\x3b\x38\x3a\x95\x98\xab\x57\xe5\x56\xa1\x80\x10\xdc\x1d\x09\x09\x4a\xdd\xf6\x5c\x22\x82\x3f\x0b\x60\xc8\x53\x10\xa0\x5d\xe0\x1d\x8b\x16\xcc\x48\xb9\x3c\x02\x25\x0a\x40\xa5\x87\x3d\x90\x38\x70\xb7\x0e\x54\x7b\x52\xb6\xa9\xb2\x72\x4d\x41\x5d\xbb\x5e\x9d\x92\xf5\x53\xb0\x48\x4e\xfe\xd1\x78\x2c\x9d\xf5\x48\x48\x50\x5f\x42\x08\xc1\x31\x16\x96\xd0\xca\xb2\xe8\x15\x7d\x76\x2b\x60\xbf\x51\xaa\x89\xfa\x0d\x01\x4f\x03\xa1\x9a\x38\xa4\x4a\x7c\x79\x7b\x84\xd6\xeb\x53\xc5\x6f\x04\xfd\xbe\xf6\xb3\xd1\x30\x8b\x98\xd4\xbb\xb5\x29\x9c\x6b\x82\x07\x09\x07\xe7\x3a\x0b\x8c\x63\xad\x11\xea\xf6\xaa\xd5\xd3\x5e\x5f\x40\xd3\xd9\x3d\x14\xc2\x02\xb8\xe0\xd9\x82\x84\x25\x18\xce\x11\xc2\xe0\x32\x4b\xa2\xed\x81\x96\xb9\xfb\xf1\x31\x5e\x1d\xcb\x63\xb3\xad\x32\x2a\x27\xc4\x0b\x39\xed\x7b\xb5\xec\x50\x11\x48\x20\x75\xbe\x8c\x65\x00\xe9\x48\xc4\xfa\xa4\xee\xfe\xa5\xdc\x89\x6b\x9b\x85\xe8\x40\x8a\x55\x15\xb4\x3e\xd5\xa9\x56\x06\x74\xf9\x32\x26\x8f\x89\x38\xce\x91\x0f\xb4\x9f\xfd\xc9\x5c\x25\xd5\xea\x1e\x64\xbd\x18\x29\x74\x2f\x1c\xab\x1d\xc9\xce\x25\x09\xee\x55\x3b\xc9\xea\x91\x27\xad\x31\x37\xc0\xb2\xb3\x41\x96\xfe\xdc\x0b\xbd\x93\x80\x82\x5d\x4b\x80\x26\x20\xd7\x26\x14\xc3\x5e\xd9\xc7\x4b\x1b\x02\x20\x7d\xa4\x5d\xe5\x36\xb9\xa3\x44\xf5\x74\x7a\x06\xd2\xab\x73\x51\xe5\x29\xd7\x66\x0a\xec\x66\xdf\x80\xc0\x54\x5a\x6e\xd8\x7a\x6b\x71\xdf\x61\x74\x22\x25\xe2\x2e\x73\xc4\xbe\x21\xb0\xbb\xed\x80\x2b\x05\x33\x18\xda\x7a\x94\xc6\x1e\xfb\x29\xac\x92\x34\x5b\x09\xb6\xfe\x80\x46\x7c\x84\x50\x41\xf2\xe9\xec\x97\xd5\x8e\x8e\x63\x89\x0a\x1d\xfe\x6e\x2c\xb6\x27\x8a\x13\xf4\x9f\x33\xce\x96\xaa\x75\x3d\x58\x9d\x6d\x76\x79\x93\xb0\x04\x0a\x02\xee\x5e\xa6\xcb\xce\x15\x5e\x55\x83\x44\x24\xea\x6b\x74\xb9\x74\x3c\xcd\x7d\xf7\x20\xcc\x1a\x96\xf3\x37\x7d\x02\x44\x30\xb0\x70\x2e\xf9\x1c\x38\x57\xc3\x31\x3a\x6e\xe5\x7c\xf9\x95\xbb\x6d\xc9\x85\x83\x6d\x27\x35\x91\x72\x30\xa9\x1d\xdb\x94\xee\x78\xd9\x68\x63\xbd\x05\xa8\xa4\x3a\x13\x52\x5c\xa3\x18\x20\x8f\x1a\x08\xd8\xd0\x93\x44\xd0\x21\x44\xa6\xb1\xf3\x0d\xb9\x85\x75\xe5\xb6\x30\x62\x2c\x19\x6a\x16\x1e\x98\x9a\xdd\xe7\xf4\x4d\x6c\x6e\x6a\x25\xdb\xf2\x7e\x72\x63\x86\xce\x79\x2c\x9f\x92\x67\xf8\x45\x80\x3e\x31\xb2\xda\xb4\x22\xc5\x67\x3a\x8f\x96\x59\x61\x3b\x39\x09\xbe\x8b\xfa\x94\x17\x7a\x65\x25\x9e\x6c\x3e\x57\x83\x91\x81\xe6\xa9\x2d\x3c\xeb\x69\x40\x60\x10\x6a\x18\x60\x98\xe9\x10\x40\x50\x6b\xfe\xb7\x49\x1c\x00\x96\x23\x05\x70\xdd\x13\x96\xc1\xb1\x8c\x97\xee\x5a\xfa\x2f\xe8\x5c\xe4\x33\x6d\x6f\x00\xfd\xb3\xb2\x15\xe2\xf0\x14\xa1\xbd\x77\xb8\xd8\xbb\x42\xd0\x40\x48\x3e\xe5\x86\x85\x30\xe0\x58\x1e\x85\xcb\xe5\xbb\xd8\xcc\xec\x43\xe6\x66\xe0\x63\x20\x1f\xd3\x0a\x8c\x2c\x9e\xd0\xd3\x0b\x84\xf7\x2b\x7a\x1a\xa9\x46\x05\x3a\xfc\xcf\x4a\x85\xf4\x69\xf0\x83\x04\x79\xf0\x18\x56\xdd\x67\xf2\xba\xac\x30\xf5\x36\xab\x32\xaf\xdc\x4c\x15\x5f\x41\xb4\xcb\x35\x12\xb1\x81\xee\x0b\xa8\xef\x0d\xb3\x8a\x6a\x1e\xf0\x0a\xd1\xec\x41\x73\xd8\x8d\xb6\xca\x2d\xf1\xe2\xcc\xea\x97\x0a\xfe\xb7\x50\x5e\x0c\xe5\x64\x3b\x50\x60\xc0\xf8\xf9\xb0\x20\xeb\x99\x91\x1a\x30\x34\x2e\x69\xfc\xbe\x19\x88\x32\x21\xd0\xc0\x47\xa1\x78\x1f\x81\xa1\xcb\x75\x10\xdb\x39\xa0\x2b\x43\x9e\x36\xa3\xa7\xba\x2d\x44\x41\x84\x76\x0b\x78\x1d\xf8\xf8\xe8\xa1\x55\xd3\x19\x1d\x0f\xb4\x82\x61\x72\xf7\x4f\x38\x9e\xcf\x8f\x8a\x4f\x0f\xac\xee\x4b\xce\x4c\xf0\x43\x20\xec\xf4\xf2\xe6\xd1\xa5\xfe\xe4\xfc\x6d\xab\xf2\xcb\x1e\x05\xb5\xec\x2a\x73\xfe\x05\x1c\x08\x87\xf4\x98\x0e\xcf\xa6\x7b\x04\x41\xef\x23\x21\xc9\xf8\x02\xf9\x25\xfc\x60\x00\xf1\x0a\xd3\xa8\x7e\x98\x74\xd6\x5f\x05\xe6\xf9\xaa\xc3\x21\x81\xa7\xf3\x37\xd8\xd9\xd7\x57\xc8\x25\xcc\x27\x1b\x5a\xd2\x09\x37\xaa\x77\x14\x2b\xd1\x00\x33\xa0\xfe\x61\xc8\xad\x46\xee\xeb\x14\x77\xf0\x05\x65\x22\xb4\xec\x24\x00\xe8\x23\x92\xb9\xec\x41\xb3\x80\x4d\x80\x07\xb8\xf8\x11\xd0\x2b\x82\xd5\xe2\xb2\x86\x24\x8b\x5a\x92\x78\xd0\x7d\x1f\x0b\xb8\x1b\x57\xd2\x27\x82\x77\xe3\xf1\xf6\x61\x34\x1b\x99\xf1\xdc\x4c\xa6\xe6\xd3\x70\x36\x1b\x4e\x16\xb7\xe6\xdd\x74\xe6\x7e\x61\xae\x67\xd3\xf7\xb3\xe1\x55\x64\x16\x53\xf8\xf7\xe8\xaf\x8b\xd1\x64\x61\xae\x47\xb3\xab\xf1\x62\x31\xba\x30\x6f\x6f\xcd\xf0\xfa\xfa\x72\x7c\x3e\x7c\x7b\x39\x32\x97\xc3\x4f\xb1\x19\xfd\xf5\x7c\x74\xbd\x30\x9f\x3e\x8c\x26\x66\xea\x9e\xfe\x69\x3c\x1f\x99\xf9\x62\xe8\x3e\x3f\x9e\x98\x4f\xb3\xf1\x62\x3c\x79\x0f\xcf\x3b\x9f\x5e\xdf\xce\xc6\xef\x3f\x2c\xcc\x87\xe9\xe5\xc5\x68\x06\xda\x4c\xdf\x4e\x67\xf8\x45\x73\x3d\x9c\x2d\xc6\xa3\xb9\x6b\xc6\xc7\xf1\xc5\x48\x37\xc9\x0c\x86\x73\x33\x9e\x0f\xcc\xa7\xf1\xe2\xc3\xf4\x66\xe1\xdb\x3e\x7d\x67\x86\x93\x5b\xf3\x97\xf1\xe4\x22\x32\xa3\x31\x3c\x68\xf4\xd7\xeb\xd9\x68\x3e\x1f\x5d\x98\xe9\xcc\x8c\xaf\xae\x2f\xc7\xa3\x8b\xc8\x8c\x27\xe7\x97\x37\x17\xe3\xc9\xfb\xc8\xbc\xbd\x59\x98\xc9\x74\x61\x2e\xc7\x57\x63\xd7\xce\xc5\x34\x82\xb7\xd1\x67\xf9\xe9\xae\x31\xd3\x77\xe6\x6a\x34\x3b\xff\x30\x9c\x2c\x86\x6f\xc7\x97\xe3\xc5\x2d\x08\x4a\xbd\x1b\x2f\x26\xa3\xf9\x1c\x86\x6e\x88\x2d\x3f\xbf\xb9\x1c\xce\xcc\xf5\xcd\xec\x7a\x3a\x1f\xc5\x38\x80\x93\xc5\x78\x36\x32\xb3\xf1\xfc\x2f\x66\x38\xe7\x61\xfd\x8f\x9b\xa1\x3c\xe7\x7a\x34\x7b\x37\x9d\x5d\x0d\x27\xe7\x23\xf7\x2a\xdd\xe5\xf1\x1c\x7a\x6b\x6e\xa7\x37\xb1\x99\x7f\x98\xde\x5c\x5e\x04\xbf\x77\xc3\x34\x32\x17\xa3\x77\xa3\xf3\xc5\xf8\xe3\x28\x72\x1f\x34\xc3\xf9\xfc\xe6\x6a\x44\xa3\x3d\x5f\xc0\xf0\x5c\x5e\x9a\xc9\xe8\x7c\x34\x9f\x0f\x67\xb7\x66\x3e\x9a\x7d\x1c\x9f\xc3\x28\xcc\x46\xd7\xc3\xf1\xcc\x8d\xd1\xf9\x74\x36\x73\x4f\x99\x4e\x70\x0d\xfd\x10\x23\x58\x5c\x52\x1c\x97\x8c\x4b\xc6\xd3\x62\xe2\x96\xcf\xe8\xa3\x5b\x1c\x37\x93\x4b\x37\x0e\xb3\xd1\x7f\xdc\x8c\x67\x7d\x4b\xc4\x3d\x7f\xf8\x7e\x36\x82\x61\xd6\x2b\xe2\xd3\xf8\xf2\x12\xe6\xae\xbd\x2c\x22\xf8\xca\xe4\x56\x2d\x8b\x5b\xf3\xe9\xc3\xd4\x5c\x4d\x2f\xc6\xef\xdc\xa4\xd0\xb2\x39\x9f\x4e\x3e\x8e\x6e\xe7\xc1\xa8\x0c\xe7\x6a\xbd\x0e\xdf\x4e\xdd\xc0\xbc\x1d\x99\xcb\x31\xb4\x67\x31\x85\x51\x72\xb3\x76\x31\xbc\x1a\xbe\x1f\xcd\xd5\xba\x80\x77\x92\xc6\x73\x64\xe6\xd7\xa3\xf3\xb1\xfb\xcb\x78\x72\x3e\xbe\x18\x4d\x16\xc3\x4b\x1c\xaa\xc9\x7c\xf4\x1f\x37\x6e\x66\x87\x97\xfc\x10\x33\x9c\x8d\xe7\xee\x09\x6e\x69\xd2\x34\xde\xcc\x47\xb0\xfc\x26\xbc\x6c\x16\x53\xf8\x99\x6e\xec\x91\x7f\x77\x77\x49\x9a\xcb\xe9\x1c\xd6\xdf\xc5\x70\x31\x34\xd0\xe2\xc5\xd0\xbc\x1d\xb9\x4f\xcf\x46\x93\x8b\xd1\x0c\x76\xd8\xf0\xfc\xfc\x66\x36\x5c\xc0\xcb\xdc\x37\x46\x73\x33\xbf\x99\x2f\x86\xe3\x09\xce\x86\xeb\x2f\xec\xef\xf1\xec\x42\xb6\x18\xac\xda\x77\xc3\xf1\xe5\xcd\xac\xb3\xee\x16\x53\x33\xbd\x1e\xc1\x23\x61\xfd\xa9\x99\xc0\x4f\xcc\x8f\x23\x98\x7c\x33\x7e\x67\xe6\x37\xe7\x1f\x68\xda\x4c\xb0\x91\x6f\xcd\x87\xe1\xdc\xbc\x1d\x8d\x26\x66\x78\xf1\x71\x0c\x9b\x91\xde\x33\x9d\xcf\xc7\x34\x26\x53\x7a\x02\x8d\x23\xae\xbe\x1f\x63\x94\xd6\xd8\x56\xd6\xaf\xc0\x79\xa7\xce\x24\x7e\x45\xb7\x56\x1a\x1c\x77\x52\xcd\xe2\x3e\x95\x07\xab\xd8\xa3\xeb\x05\xc7\x8a\x70\x5a\xaf\x55\x87\xf6\x4e\x5e\xae\x92\x9c\x6a\x4f\x90\x5e\x97\x40\xcc\x74\xfe\x62\xa9\x13\xe1\x80\x9d\x21\x68\x1f\x31\xe4\xb9\xab\x1a\xa6\x57\x40\xb3\x94\x9e\x94\x3c\x72\xd9\x47\xdd\x98\x55\x5e\x62\x0d\xe7\xd6\xdd\x7d\x20\x11\x80\x9a\x45\xcb\xba\xcc\x77\x8d\x45\xf6\x60\x34\x3b\x9c\x65\x9e\x3d\x64\xb9\x6a\x7b\x4f\x98\x24\x70\xcb\x18\x2e\x1a\xd4\xf5\xf8\xba\x81\x70\x20\x7c\x99\x72\x1b\x2c\x22\x89\xea\xc2\x54\xb6\xd9\x55\x9a\xdb\xd4\x8c\x26\x38\x9d\x7d\x02\x7b\x1f\x50\xae\x68\x08\xfd\x47\x54\xd6\x82\xc1\xe1\xb7\xee\x26\x9b\xd8\x47\x7e\x7a\xfd\x8a\x1c\x72\x52\xab\x01\xdb\xfe\xd1\xb3\xf1\x31\x2c\x81\xb4\x90\x29\xd9\x41\x2d\xbc\x83\xda\xc3\xba\x01\x08\x49\xc6\xba\x2e\x2d\xc1\x2e\x4c\x72\xd4\x0d\xf2\x03\x95\x26\x59\xdd\x43\x74\x5c\x60\x9c\xa5\x08\x1f\x86\x9a\xce\x68\xe1\x58\x56\x5f\x47\xa1\x84\x50\x2d\x96\x65\x40\x25\x55\x54\x0b\x62\x7c\x41\x28\xaf\xc8\x24\x4d\x93\x50\x58\xcf\x5b\xa3\x5c\xd0\x24\x76\x3c\x21\xfa\xc6\x10\xa8\xac\x93\xb5\x6b\xb1\x6b\xad\x7c\x79\xc3\x9f\xad\x1b\xaa\x93\x00\x1c\x90\x42\xc8\xa3\x04\x49\x1d\x0a\x38\x82\x39\x45\x61\x49\x45\xf2\x17\xf2\xed\xc2\x93\xe0\x11\xa4\x66\x89\xa9\x13\x4f\x8f\x66\xcd\x60\xe5\x65\x0d\x73\x74\x76\x53\x67\x17\x96\xe0\xa0\x61\xa8\x80\xf9\x6b\xd6\x3b\x61\x31\x05\xcd\x55\x67\x6a\xc6\xaf\xfe\xd5\x8d\x22\x7c\x95\x79\xd0\x54\xcf\xbf\xa9\xa1\xe6\x87\x9e\xba\xac\x32\xbb\x36\x59\x8a\xda\xa8\x8f\x54\xf1\xe1\xcc\xe6\xf8\xdf\x94\xaa\xfe\xd1\xf9\xb1\xf9\xd7\xbd\x4d\xaa\x7f\x33\xff\x0a\xdf\x2e\xb9\x8e\xee\xdf\x5e\x2d\x48\x4c\x94\xb1\x16\xc1\xdc\xfe\x24\xaa\xd7\xc1\x8c\x66\x4d\x47\x02\xb8\x3f\x0b\xf8\xa4\x85\x9b\xd4\x2f\xb7\xbd\x23\xf6\x3e\x3a\xe1\x80\x4b\x55\x0c\x70\x14\x16\x79\x1e\x77\x9d\x91\xb8\xd3\x5f\xdf\x2d\x29\x3e\xb8\x2f\xb7\x9e\x10\x89\x5d\xcb\x5d\x6d\xd7\xbb\x1c\x1d\x47\xb6\xad\xdc\x81\xcf\xf6\xd5\xcf\x52\xc4\x6a\x1f\x28\x13\xc2\x11\x4a\x7f\xbc\xac\x3b\x26\x52\x59\xbd\xc0\x42\x9a\xdb\x17\x8a\xd3\x83\x88\xb0\x73\x63\xeb\xf8\xd5\x6d\xb9\x0b\x56\xa9\x60\x8c\xc3\xd3\xeb\xa9\x09\xd2\xb4\x5d\x7e\xd4\xc0\x4d\x2b\xca\x26\x32\xb5\xb5\xe6\x5f\xef\x9b\x66\x6b\x6a\xf3\xd3\xb7\xdf\x3e\x3e\x3e\xc6\x77\xc5\x2e\x2e\xab\xbb\x6f\x19\x80\xf1\xed\xbf\xc5\xaf\x86\x79\x0d\xe6\x7e\xc0\x19\x52\x16\x2c\xd7\x06\x31\x69\x94\xb9\x06\x66\xf6\xdc\xae\x9a\xaa\x2c\xb2\x15\x22\x16\x92\xad\xad\xcc\x26\xc9\x72\xb9\xc6\xb6\xda\x3d\x24\xa8\x73\xae\x03\x20\x91\x9c\x54\xa4\x05\x92\xb8\x91\xa8\x98\xdd\x18\xf0\xb8\xa4\xc4\x7f\x0f\xc2\x1e\x78\x56\xd4\xc4\xe1\xa9\x49\x61\x37\x65\x6a\x7f\x7a\xf5\xaf\xf4\xca\x7f\x33\xbf\x60\x53\x21\x89\x30\x0c\xe3\xf0\xed\x7c\x7a\x79\xb3\x18\x5d\xde\x6a\xb7\xe2\x67\x98\x3d\x9a\x38\xd3\xec\xb7\xd6\xfc\x2f\x10\x13\x7f\xfc\x86\xd6\x6b\x7b\x5f\xfa\xf3\x1e\x0e\x60\x9b\xaf\xca\x0d\x05\x07\xc3\x6d\x8a\xbb\x52\x6a\x8b\xc5\x99\xff\x59\xbf\x66\xf5\x8d\x6e\x00\x2a\xcc\xde\xef\xb7\x65\x73\x6f\x21\x55\xe7\xa5\xf0\xb8\x59\xf0\x7a\xf9\x32\xad\x32\xd6\x3f\x0f\x0a\x86\x03\x4e\xd3\x03\xe1\x46\x33\x5d\x83\x45\x20\x39\x65\x7f\xd6\xc9\x9b\x37\x30\xe6\x4b\xeb\x3d\xcb\x9f\xe9\x9a\x7d\x7f\x33\xf6\xd4\xbd\x24\x2a\x00\xed\xd9\x81\xb7\x6f\x06\xc9\xd2\xed\xca\x65\xf9\x65\x10\x6c\x0a\x80\x77\xde\x59\x3a\x31\xec\x66\x9b\x97\x7b\x5b\x41\x8d\x31\x3e\x83\x09\xf9\x59\x53\xce\x56\xc7\x00\xa4\x72\xfe\x65\x0e\x21\xe5\xa4\x00\xb1\x78\xa0\x0f\x42\xee\x2c\x5e\x1c\xde\xd2\x1a\xf8\xf4\xb9\x30\xe7\xae\x8d\x97\x9f\x80\x38\x35\xe6\xb2\xc3\xdd\x81\xca\xc1\x4a\xd6\x10\xed\x24\x28\x59\x41\xaf\xb6\xf1\x5a\xf1\x2f\xde\x8b\x8b\xa7\xb7\xbc\x44\x5c\x10\x5e\xa6\x69\xb6\x50\x20\xbe\xf2\x67\x67\x41\x88\x73\x92\x3d\x16\x99\x2c\x5f\x97\xa0\x8e\xd9\xc4\xd4\xbb\x65\x55\xee\x9a\x0c\x2e\x37\x62\x32\xdb\x7b\xd2\x5a\xa8\x9f\x74\x4b\x16\xc6\x02\x4f\x5b\x80\xf3\x60\x43\xf2\xac\xf8\x8c\xb5\xd0\xfe\x85\x94\xa2\x69\x28\x04\x48\xe6\x1d\x3d\x9c\x82\x49\xb8\x79\x1e\x19\x01\xf0\x48\x49\xfd\xb4\x8c\x02\xb9\xfd\x4b\x5b\xd7\xb6\x3a\x1c\x50\xae\x1b\x9b\xa4\xdd\x24\xc9\xdb\x5d\x83\xa5\x2d\x91\xd9\x02\x39\x3a\xc0\x56\x0e\xcd\xc3\xf6\x3e\xcb\xcb\xba\xdc\xde\xef\xbf\x7d\xbc\xdf\xbf\x2e\xca\xe6\x75\x7e\xb7\xcd\xe3\xfb\x66\x93\xff\x5b\xfc\xea\x5f\xfe\x7b\xfc\x89\xbf\x3d\xaf\xf6\x75\x93\xe4\xf3\x26\x59\x7d\xb6\x55\xdc\x7c\x69\x7e\xeb\x77\x9c\x9c\x9c\x9c\xfc\xf0\xdd\x77\xee\xbf\xa7\x3f\x7e\x7f\xa2\xff\x7b\x02\x7f\x3f\x7b\xf3\x2f\xa7\x6f\xce\xce\xce\x4e\x4e\xce\x4e\xbf\xff\xf1\x5f\x4e\x4e\xdf\xfc\xf0\xe3\xe9\xbf\x98\x93\xdf\xba\x21\x7d\x7f\x76\xee\x32\x31\xe6\x5f\x1e\x92\x34\xdb\x3c\xf1\xb9\xe7\x7e\xff\x5f\xf4\x0f\xcd\xbe\xa1\xe9\xe7\xbb\x8b\x95\xff\xb3\x5a\x21\x8f\x9c\x65\xb9\x4d\xea\x9a\x53\xe1\x49\xe5\x2c\x3e\xf8\xbc\xae\xa1\xc4\xb2\x11\x96\xf7\x73\x46\x1b\xd7\x17\x67\xee\xf6\xfe\xa6\xf6\xc5\x18\xa8\x92\x56\xb0\x0a\x92\xe7\x3d\x8e\xcd\x35\xee\xd0\x9a\x8c\xa9\xc1\x39\xda\x1d\xa8\xf8\x33\x90\xbc\x8a\xc0\x4f\xe5\x1d\x78\x21\x00\xeb\xa2\x32\x57\x76\xb5\x14\xa3\x23\xa4\x28\x7e\xe5\xc3\x89\xaf\x26\xf6\xf1\xbc\x22\xdd\xdd\x0b\x20\x30\x24\xf5\xa1\xa2\x34\x77\xbb\x04\xf2\xe4\x00\xd5\xb9\x4b\xc8\x59\xbe\xb7\xa6\x3d\x74\x7c\xdd\xc7\xe6\x93\x3d\x58\x16\x92\x26\x9b\xe4\xce\xd6\x88\x7e\x03\x43\x3a\x6b\x22\xc5\x31\xa3\xb8\x87\xf1\x68\xff\x5c\x94\x8f\x90\x96\x43\xbc\x1c\xca\x7d\x60\x96\x43\xd2\xbe\x98\x21\xa8\xca\x1d\xf0\x28\xf0\xd1\xea\xcd\x8f\xaf\x1d\x44\xbc\x78\x5a\x1c\x98\x3e\xb6\x50\xbf\xce\xea\x00\x59\x9f\x96\xc2\x44\xef\xce\xee\xba\x84\x50\x3d\x54\x3c\xe1\x2c\x76\x79\xc9\x83\x05\x02\x3e\x5a\x86\x9a\x6d\x4a\x27\x0e\x56\x87\x48\x31\x38\x07\x3a\x5c\x22\x4f\xce\x5a\xb2\xeb\x9f\xb5\x5d\xcd\x31\x02\xe6\x5d\xc4\x6e\x3a\x4f\x01\xcc\x33\xd2\x6c\x6a\x4a\x73\x6f\xf3\xad\x7f\xbf\xe4\x96\xa0\xd7\x60\x37\x80\x9a\x67\xd1\x94\xbf\xd9\x6a\x85\xf2\x0d\x37\xdb\xbb\xd5\x3d\xbe\x79\x57\x1b\xb4\x88\x00\x44\x51\xd7\x3b\x5b\x6b\x70\x9c\xee\x59\x4d\x82\x85\x5f\xb5\xff\xe3\x6f\xdf\xfc\xe9\xcf\xaf\xa5\x1a\xfb\xf7\x38\xfe\x9f\x3b\xff\xdf\xfc\x70\x7a\xd2\x3e\xff\xcf\xbe\xfb\xf1\x9f\xe7\xff\x1f\xf1\x07\x8e\xf8\xeb\x03\x01\x85\x9f\xff\x77\x09\x28\xfc\x2c\x91\x84\xb3\x56\x24\x81\x5c\xae\xeb\x7f\x86\x08\x7e\x41\x88\x80\x46\xed\x67\xf0\x71\xca\x26\x02\xce\x06\x09\x35\x1e\x8e\xee\x8c\x8b\x55\x1c\x99\xef\xff\x6c\x16\xce\x11\xb3\xe6\x1a\x69\x2e\xe6\x3b\xf7\xed\x37\x6f\x4e\x22\xf3\xb6\xac\x1b\xf7\xc9\xab\xa1\x39\x39\x3b\x3d\x3d\x7d\x7d\xfa\xe6\xe4\x47\x73\x33\x1f\xc6\xaf\xc6\x85\x24\x13\x49\xdf\x87\x21\x16\x72\x0a\x45\x66\x66\x53\xf3\x21\x69\xf0\x55\xa4\x7f\xe3\xfa\xdf\x84\xe4\x18\x52\x51\x02\x98\x95\x86\x54\xba\xe4\x98\xe5\x55\x41\x70\xbf\x94\xd5\x53\x10\xe7\xe1\x97\xec\x13\x43\x76\x34\x98\x94\xc5\xeb\xf7\xd7\x97\x20\xfe\x3e\x38\x66\x44\x8a\xda\x0e\x24\xb0\xab\x20\x1a\xb5\x92\x48\x86\x2d\xf1\x58\xb6\xaa\x48\xad\x0a\xe1\xd7\x02\xae\x93\x12\x8d\xd8\xe8\xb7\xaa\xea\x21\x05\xc9\x92\xd1\x42\x64\x3d\x20\x96\x70\x18\xca\xc3\x23\xe1\x99\xe4\x41\x61\xd3\xe6\xb9\xa8\xbc\x2b\x41\x1d\xc6\x69\x2b\x86\x0f\x77\x43\x17\xc9\xc6\xa6\x94\x19\x1d\x4f\x27\x18\x01\x15\xb2\x7a\x4d\x3f\x08\xfa\xc5\x47\x70\x13\x02\x53\x95\x5b\xa5\x22\x2b\x5e\x0f\x8e\x11\xb6\x83\x1f\x2b\xd7\x61\x67\x37\xc0\x6f\x4c\xa5\xaa\x6e\x35\xba\x35\x06\xb9\x04\xe2\x54\xda\x00\x93\x23\x22\xbd\x21\xf0\xca\x34\xb5\xb5\xc7\xca\xf5\xbc\xd5\x4b\xa7\x26\x58\x13\xde\x45\x13\x51\x1c\x3e\x50\x92\x78\x6a\x75\xc4\x66\xea\x46\x3d\x5c\xac\xac\xf1\x4a\x51\x74\x64\x98\x4a\x19\x96\x21\xb3\x8f\x12\x11\x3d\xed\x8c\xbd\x2c\x56\xb9\xb4\xcf\x35\x01\x82\x60\x80\xc6\xae\x91\xe3\x99\x25\x33\x5a\xe9\x0e\x61\x5d\xa7\x8a\x4a\xe4\x76\x17\x26\xf2\xbf\xd1\x10\x76\xf2\x2e\x4c\x97\xe2\x7e\x14\x4c\x53\x5b\x6e\xc3\x9b\x10\x6c\x95\x0a\x19\x1e\x59\x78\x3e\x80\x20\x45\x11\xc1\x32\x46\x40\x67\xd5\xc6\xd0\xe0\x57\xdd\x29\xbd\x57\xe5\xd6\x01\x2b\x3e\x16\x9e\xf3\x7b\x09\x42\xf9\x98\xd5\xf7\xa1\x52\x45\xf0\x36\x5e\x0d\xba\xea\x4d\x31\xf7\xa4\x36\xb7\x4d\xe7\x4b\x1e\xc5\xc1\xe8\x63\xdf\x5c\xcc\xcb\xb1\x22\x17\x5b\xb5\x1d\x59\x54\x37\x80\x72\xb1\xc8\x98\xfd\xc3\xc2\x09\xf1\xb7\xa9\xdd\x56\x76\xe5\x86\xf2\x7f\x4e\x76\x45\xd6\xfc\xf6\x26\xe0\x33\xf6\xdf\xd9\xc9\x8f\xa7\x2d\xfb\xef\xbb\xb3\x93\xef\xff\x69\xff\xfd\x11\x7f\x7c\x84\xfc\xff\xfd\x7f\x8c\x9b\x80\xd7\x67\x27\x27\xdf\x99\x7f\x07\xa2\xbc\x4f\xe0\x63\x7d\xce\xaa\xcf\x91\xb9\xca\x56\xf7\x89\xcd\xcd\x79\x6c\x16\xee\x3a\x1b\xe6\xf6\x8b\xcd\xcc\x30\x36\x1f\xcb\xaa\x2c\x9a\xba\x7c\x88\xcc\xf9\x7d\x52\xe5\x99\x35\xd7\x65\x99\xdb\x57\xed\x67\x9f\xe0\xb3\xaf\xef\xb3\x3c\xdb\xba\x6f\x9e\x57\x49\x76\x87\x06\x9c\x76\x7b\xc5\x5b\xfc\x06\x5c\xcd\x6f\xbc\xea\xb5\xae\x50\xc4\x2a\xe9\xc0\x1e\x03\x25\x81\xa2\x04\x83\xad\x11\x81\x3f\xa1\xc6\x5b\x5a\xe7\xd2\xa5\x90\x26\xf6\x05\x73\xe2\x92\x27\x15\x2a\xcc\xca\x25\x22\xf5\x4e\xaa\x7d\xf1\xab\x6b\x25\x99\xe7\x8b\xcf\xbd\x12\x21\xd6\xe8\x84\xdf\x92\x77\x51\xd9\x6c\xa4\x0c\x04\x4f\x8f\x1f\x84\x48\x05\xfb\x0a\x12\x3a\x64\x73\x77\xec\x70\x8c\xbd\x74\x8c\x0b\x9f\x91\xd5\xe5\xfc\xc0\x93\x79\x4a\xb2\xeb\x8a\xd3\x51\x37\x14\x0e\x3f\x02\x0d\x68\x42\x48\x9b\xfe\xec\x0f\x47\xb0\xa2\xa0\xca\x5d\xfc\xf9\xc7\xaa\xa4\x84\xac\x04\x77\x7c\x3c\x84\x0e\xe6\xee\xb0\x40\xe5\xd8\xd6\xf3\xaf\x2b\xfd\xf5\x0d\xd6\x8f\x92\xa1\x2c\x1d\x3a\x6e\xcb\x3f\xb1\x2b\x4d\xfc\xd2\xc2\x35\x8e\xe5\x61\xd7\x58\x2a\x5f\x9b\xdf\x71\x9d\xbb\x95\xf8\xc2\xa5\x8e\xea\xff\xc3\x1c\x2b\x36\xc8\x64\xf2\x08\x3d\x22\x8a\xde\xe6\x49\xe6\xec\x0a\xa2\xc9\x24\xbc\xaf\xa2\x73\xee\x9d\x1f\x03\x94\xdd\xa2\x27\xd2\x99\x05\x52\xce\x86\xdd\x46\x99\x35\x86\xe3\x83\x64\xc6\x06\xec\x10\xb0\x1e\xb0\x79\xc2\x9f\x4b\xed\x0c\x82\x2f\xff\x5d\xe2\xdf\xff\xa7\xff\x89\xbf\xbd\x2a\x9b\xb2\x2e\x9b\xf2\x77\x09\xfd\xc0\x9f\xa7\xef\xff\xef\x7e\x7c\xf3\x63\x3b\xfe\x7f\xf6\xfd\x3f\xe3\xff\x7f\xcc\x9f\xab\xe9\x62\x3a\x9f\x22\x36\x6e\x62\xe6\xd3\x9b\xd9\xf9\xc8\x5c\x8e\xcf\x47\x93\xf9\xc8\xbc\xe6\x9a\x02\x73\x12\xff\x39\x3e\xc5\x9b\x9a\xd7\x8b\x99\x6e\x6d\xc1\xd5\xda\xe2\x2e\x83\xcf\x47\xff\x72\xde\xb2\x87\xb3\x0f\xce\x91\x8e\xbf\xd9\xc3\xa9\x9c\xe4\x66\x0e\x45\xe4\x03\xba\xd8\x72\xb0\xe6\xe5\x6a\x90\xca\xb8\xa4\x46\x3f\x35\x41\x82\x02\x92\x41\x00\x2e\x6a\x90\x6e\x07\x18\x35\xa9\x1d\x7b\xb6\x50\x79\xce\xd1\x40\x1a\x4c\x42\x07\xf5\xe0\xd8\xd7\x71\xea\x68\xd1\x72\x2f\x9d\x8b\xcf\xcb\x8d\x79\x1b\x7f\x8c\xcd\x11\xf5\xa6\xac\x9c\xdb\x3a\x2c\xfc\x67\x44\x38\x41\x6a\x60\x74\x21\x72\xc8\x81\x56\x9b\x44\x86\x25\xe5\x2f\xc6\x03\xd3\xfe\x51\xc4\x61\x70\xac\x17\x6a\xf6\x11\x19\x44\x8d\x68\xe1\x5f\xec\x1a\xd2\xf5\xc6\x0b\x07\x18\xe4\x03\xb9\x60\x71\xdf\x6b\x15\x90\xeb\xd6\x7e\xee\xb1\x96\x18\x99\x02\x94\x59\xe1\xe3\x7a\xed\xd6\x61\x7e\x9b\xa5\x21\xea\xdd\x92\xa2\x12\x64\x75\xd0\x82\xa0\x81\x1f\x23\xd5\x4e\xf6\x60\xcd\xd1\x74\x3e\x3e\x46\x1b\x08\xfc\xdd\x24\x8f\xcd\x75\x65\x93\xcd\x32\xb7\x1c\xbf\xc3\x7f\x61\x3d\xab\x2f\x34\x4e\x6d\xbd\xaa\xb2\x25\x56\xe2\xc3\xbd\x68\x46\xc5\x5d\x9e\xd5\xf7\x08\x81\x23\x09\x5d\xd7\x2e\xa9\x07\x0e\x93\xbe\x02\x62\x6f\xda\xef\x01\xfa\x04\xc5\xa9\x9f\x09\x4b\x0d\x9a\x48\x01\x4e\xb2\x5d\x5c\x04\x8c\x27\x2c\xf3\x0b\xb1\x97\xdd\x96\x0a\x65\x83\x00\xa8\x2e\x9c\x03\x3a\x09\xdd\x8a\xd6\xbc\x21\x51\x98\x55\xd9\x71\xbd\xc5\x2e\x84\x60\x25\x9c\x86\x84\x43\x08\xcb\x7d\xf0\x79\x3f\xfe\xb1\x9f\x14\xbd\xdc\x7b\xca\xfb\x88\xdd\xd5\x1b\x1e\x83\xe9\x7c\x6c\xce\x6d\x45\xd1\x20\xfd\x7c\x7e\x66\x3c\x78\x15\xf4\x82\xac\x77\xac\xb1\x60\x93\xf3\x56\xaf\xb8\xda\x6d\xe7\xb2\x22\xbe\x7a\x14\x38\xb4\x3d\x5b\x21\xc9\xa9\x10\x9b\x6a\x09\x37\xdb\xb2\xe0\x0a\x0a\xad\xdd\x5b\x77\x7a\xe7\x06\x49\xb1\x9e\x33\xd6\x01\x4d\x9a\xda\xad\x07\xd0\x59\x15\xb1\x41\xe8\x51\x0d\x85\xa2\x5c\x46\x28\x05\xaa\x6b\x6b\x3b\x66\xe5\x59\x6c\xde\x96\xcd\x3d\x0f\xc5\x39\x07\x57\x50\xe0\x09\xbc\x8b\x76\xf1\x48\xdf\x4e\x67\x17\xe0\x2a\x90\xbc\x87\x0a\x63\xe0\x1c\x20\x96\xb1\x73\x4f\xf4\xe2\xdc\x82\xca\xb6\x58\x3f\x20\x0c\xb1\x73\xcb\xf6\xc8\x57\xc3\x75\x4e\x9b\x68\x60\x06\xc1\x8b\xdc\x0f\xf4\xa3\xf1\x20\x1e\xa8\x3e\x21\x9b\x92\x0f\x10\x06\x81\xf7\x63\x32\x28\x99\x04\x8f\xb5\x3d\x19\x79\x7a\xd5\xd6\xf1\x3f\x30\xc9\xcc\xff\x99\x14\x66\x05\xc8\x57\x73\x61\xab\xec\x01\x4f\x8e\x4f\xc0\x20\x00\xd3\x06\xea\x0d\xdc\x3f\x33\x68\x7f\x68\x60\x98\x84\xe8\x40\x53\xbf\x8b\xcd\xdb\x3d\x95\xde\xb0\x95\xdc\x39\xe0\x34\xc7\x1b\xd5\x4d\xf6\x54\xea\xaa\xe2\x54\xe6\xfe\x0a\x7b\x2b\xc5\xf5\x07\xba\xcd\x34\x2f\x85\x3e\x77\xdd\x20\xb6\x29\xb0\x0f\xb7\x02\x7c\x5d\xcf\x5f\xa2\x42\x57\x2c\x66\x1e\xac\x4e\x2e\xb7\x09\xdb\x19\x54\x53\xc3\x72\xc7\x72\xb9\xef\x83\x1d\xdb\xdf\x85\x8e\x4b\xcb\x15\x93\x7c\x5f\xf2\x19\x8b\x07\x02\x21\x92\x90\x15\x96\xf3\x27\x3e\x5b\x1c\x81\xf2\x13\x55\x62\xca\x13\xfc\x6c\x85\x2c\xf2\x34\xbf\xe8\xe7\x0b\xfb\x77\xa7\x89\x69\x69\xeb\xe2\x1b\xa4\x71\x24\xd5\xc3\x1c\xa9\x32\x12\xd0\x96\xe3\xf6\x64\xc5\xdf\x76\x15\xfc\x82\x62\x01\xac\xe2\x4d\x8e\xab\xa7\xa8\xea\x7f\x4f\x59\x75\xd6\xac\xae\x64\x43\xf2\x3a\x4b\x9c\xac\x1a\xbe\x4e\x8a\x4f\xa2\xc9\xe4\xfb\x4b\x7c\xff\xac\x5e\x21\x39\x6b\x55\x7b\xc5\xf1\x52\x16\x6a\xa6\xc8\x31\xd7\x80\x7b\xce\xbc\xd6\x5a\x60\x21\x1f\x66\x39\xaf\x6b\x5b\x75\x09\xec\xea\x80\xe5\x48\x66\x04\xec\x34\x5f\x2e\xd0\xb3\xa1\xdd\x34\xe2\x93\x97\x15\x20\xb0\x41\xce\xab\xe7\x4e\x8c\x02\x3a\xdc\x43\x3b\xa5\xaf\x08\xbd\x9f\x4e\x1b\x33\x64\x7e\xcd\xb6\xc8\x49\xfd\x46\x43\xd0\xf1\x63\xd1\x33\x69\xa2\x81\x05\x4a\x76\x4f\xef\xc0\x56\x99\x2e\x3c\xb5\x73\x74\xfd\xcd\xed\x48\x50\x11\xc2\xe2\x7e\x16\x95\x65\xf7\xbc\x63\x13\xbe\x1a\x7a\xc9\xe4\x5c\x81\xee\xda\xed\xef\xbc\x89\x88\x10\xa4\xf0\x7b\x3a\x1f\xbf\x16\xdb\x40\x5f\xdc\x9a\x90\x9d\xbe\x14\x00\xf5\x72\x4f\xfc\xc7\x15\x7a\xd9\x2a\x8c\xe2\xe0\x6e\xa4\x8f\xf5\xf3\xde\x0a\x53\x98\x3a\x99\x74\x31\xf6\x7a\x97\xaf\x39\x40\xf7\x14\x8b\x92\xa6\x67\x6c\xcd\x87\x5e\x8b\x94\x4a\xe6\x4f\xa9\xe5\x7e\x4c\x7b\x00\xe4\x8f\x38\x1c\xc4\x7d\xeb\x8c\x22\x93\x36\xd4\x94\xa0\x79\xee\xea\x6e\x24\x8f\xa5\xec\x8d\xe0\x90\x8d\x5f\x4d\x3a\x35\xd4\x5d\x93\xcb\xa7\xc2\x7b\x4a\xa8\x6f\xc3\xa2\xd8\x96\x7c\x1c\x9f\xd0\x72\x44\xc1\x5e\xe3\x9c\x62\x2b\x9b\x72\xe9\xf9\x37\x48\x45\x80\xa3\x9d\xaa\x44\x5b\x59\xcd\x28\x3d\xa5\x4f\x80\xfb\xa4\xc5\xe6\x47\xd5\x22\xfa\xe9\x54\x91\x4c\xcb\x3e\xa8\x64\xef\x2c\xf8\xd0\x06\xae\x2c\x58\xc0\xc0\xfe\x6d\x81\x8f\xc7\x13\x0b\x92\xaa\x1b\xc1\xa3\xb1\x22\xc5\x2c\x34\x13\x83\xb2\x56\x58\x7f\x0e\xd5\xb7\x90\xd1\x1c\xcb\x73\x99\x62\x4d\x3f\x38\x01\x8d\xec\x2d\x8a\x7e\x89\x4d\x05\xb4\x03\x45\x06\xf4\x15\x10\xaa\x7c\x9f\x97\x80\x03\x36\x09\x2b\x67\xa5\x1d\x3c\x02\xf7\x04\x8a\x83\xc8\xfc\x7d\x0f\x94\x4a\x50\x70\x88\xbf\x7c\xe7\x46\x9d\x87\x14\xab\x76\x65\x7c\x6d\x65\x97\xfb\x90\xb8\x10\x98\x0a\x5f\x77\xa9\x0a\xa3\x90\xd2\xd0\x6f\xed\x90\xb2\x58\x48\x77\x9c\x6b\x05\x7c\x19\x3b\x2d\x03\xac\x78\x0b\xd3\x56\xfc\x58\xa4\x95\x80\x95\x22\x02\x35\x56\x37\x6d\x42\x3c\x15\xb1\xe0\x50\xc4\x1a\xf7\x91\xbe\x2e\xdd\x58\xab\x93\xab\xef\xe6\x94\x3d\xe9\xce\x11\x5b\xae\xf5\x86\x6f\x59\x2b\x35\x0c\x4e\x56\x20\x0b\x27\xcd\xf4\x31\x9c\xda\xcb\xb6\x39\x4e\x6e\x43\xa1\x6d\x72\x29\x89\x08\x8d\x5c\x22\x05\x44\xe2\x01\x52\xe3\x04\xec\x19\x2a\x5e\x01\x92\x79\xf3\x32\x6b\x56\x51\xc9\xa2\x32\xe5\x4e\x1d\x0d\xc8\x79\xea\x3a\xc0\x74\xc1\xc5\xde\x5d\xbf\xe5\x2a\x23\x35\x0d\xca\x01\xab\xa5\xc9\x2a\x1f\xce\x0d\xde\x36\x35\xe6\x6c\xe9\x00\xa8\xca\x5c\x93\x06\x11\xd9\x90\xd2\x2a\x44\x47\xa9\x3b\x00\x24\x1a\xc2\x49\x68\x71\x84\x48\xad\x77\x9b\x54\x59\x0d\x03\xae\x2c\x80\x96\x31\xd9\xbb\x95\x59\x0e\x2b\x36\xe7\x07\x2c\xf9\xa3\xa4\xf6\x32\x34\xda\x62\xc7\x8b\xa8\x27\xb6\x71\xac\xb6\x8d\x5f\x37\x4b\x14\x82\xc3\xb3\x1f\xaa\x21\x72\xdb\x04\xc9\x1b\xa2\xbb\x5e\x59\xd4\x1d\xa9\x76\x2b\x88\x14\x94\x6b\x53\x27\x59\x7a\xb0\xed\xab\xd8\xdc\x60\x15\x06\x11\xc7\xae\x85\xa8\xae\x28\x1f\x43\x1a\xd8\x03\xa4\xb2\xbc\x93\x5f\x46\x04\x0a\x50\x1e\xe7\xf2\x45\x0c\xaa\xf2\x7c\x47\x6e\x6b\x95\x78\x13\xbf\x64\xe7\xa0\x09\x4e\x19\xe7\x1e\x2d\x42\x88\xe5\xef\xdc\x00\x33\x43\xb1\x14\x36\x20\xcd\x25\xac\x11\x62\x1b\xf8\x23\x1b\xde\x67\x40\xf3\xef\xd8\xdf\xee\x1c\xa1\x4d\xd9\x3a\x1e\xe0\x4c\x55\x0e\x2d\x0a\x53\x06\x9f\x19\x28\x89\xe7\x00\x93\x21\x4b\x28\x40\x91\x1c\x5e\x43\x47\xd9\x31\x48\xf1\xe6\x56\xdf\xfb\xbd\xc6\xf0\x51\x96\x1d\x0b\x80\x15\x0b\x1a\x15\xb7\x57\x1d\x68\x44\x75\x2f\xc7\x0f\xea\xc0\xeb\xea\x4d\x8a\x37\xdc\xfe\xe2\x80\xaa\x75\x45\x7f\x36\xcf\x7d\x3c\xa1\xe5\x99\x73\x0a\x8f\x99\xd6\x24\xef\xa3\xc7\x12\x7c\x67\x9f\x9e\x34\x5e\x6b\x9b\xad\xb1\xac\xe0\x62\x66\xf3\xdd\x51\x72\x6c\x96\x36\x2f\x1f\x99\xd6\x1d\xd4\xe4\x41\x8a\x1c\x99\xdf\x41\x8a\x8c\x34\x36\x79\x03\x51\x58\x8a\xe1\x4b\xee\xb7\xf8\xa6\xa8\x75\x8d\xb8\x3b\x3c\xe8\x84\x39\x4a\x82\x50\xc6\xe0\xf8\xbf\xf5\x2d\xda\x8d\x37\xf0\x50\x2e\x69\x83\xab\xb1\xe8\x3f\x28\xbe\xf2\xc6\x94\x82\x4e\xb8\x65\x34\x46\x7b\x99\xd4\x59\x4d\x5f\xe5\x55\xdc\xde\xca\xea\x5e\xf8\xb5\x67\xeb\xb9\x26\xeb\xfe\x0d\x4f\xa9\x70\x38\xff\xab\x9c\xad\xcf\xb6\xfa\xd9\x83\xf5\x4d\x6c\x46\x5c\x40\x5d\x6b\xab\xd4\xe2\x81\xfb\x32\x0e\xc0\xd4\xda\x0d\x01\xd8\x91\xfa\xb4\xd8\x6b\xb7\x5e\xc9\x1d\xca\xd5\x5e\x47\x3c\xf7\xa4\x87\x68\x6a\xbb\xaa\x2c\x32\x21\x7a\x27\xb6\x7f\xab\xc9\x49\x89\xcb\xbb\x75\x56\xf5\x2a\x7c\x91\x82\x12\x9a\x5f\x10\xe8\xed\x92\x90\x32\x96\x83\x45\xcc\xfc\x45\xd0\x3d\xd8\x51\x5f\x3a\xb5\xfe\xf8\x24\xc4\xd8\x13\xdf\xa1\x20\x4f\x00\x14\x3d\x60\x4a\x61\x0a\x00\xc7\x40\xc2\xdb\xe0\x7c\x55\x29\x62\x2a\x26\x25\x79\x60\x21\x08\xa5\xb9\xb7\x6a\xc0\x9f\x1d\xa9\x07\x5b\x98\x4c\x14\x3a\xdd\x37\x92\x8e\xc2\x71\x9f\xcf\xf6\xec\x92\xc8\x98\xe9\x02\x9b\xc5\xac\xac\xbe\x35\x30\x4e\x5e\x83\x0f\xed\x3f\x1f\x92\x47\x87\x8e\x06\x33\x20\x20\xdc\xab\x71\xf7\x7d\x93\xed\xf1\xa8\x2a\xfd\x35\x3e\xd8\x53\xa1\x7d\x17\x23\x5f\xc3\x54\xc5\xd2\x66\x52\x49\x71\x11\xa0\x1c\xe4\xdc\x1e\x86\x77\xdf\xa2\x15\x5d\xba\xed\xc4\x56\x63\x33\x0c\x68\xcf\xa5\x9a\x37\x08\xd9\x1f\x0e\x31\x40\x91\x07\x5e\x62\x4f\x86\x9a\x65\xfd\x51\xf0\xbc\x24\xd6\x02\xce\xf3\xf9\xab\x95\x04\xe9\xe4\x37\xfe\x46\x89\x7a\x63\xcf\xfd\xac\x7a\xe2\xe1\x78\x54\x96\x87\x32\x47\x62\x02\x9c\x71\xae\xf4\x97\xb5\x55\xc4\xe4\x55\xbe\x0a\xb3\x6c\x4f\xd3\x97\xa3\x63\x13\xf2\x77\x75\x3e\x43\xc9\x62\x76\x3a\xb8\xc9\x3f\x2a\xe4\xad\xd7\xed\xf7\xd0\xfa\xb6\xf6\x30\x70\x68\x04\xd0\xfb\x6e\x12\xc0\xb7\x9f\x12\x25\x30\x95\xc4\x2b\x8f\xa7\x3e\xa9\x7d\xd0\xda\xa6\x5e\x21\x95\x56\xeb\x76\xee\x66\x97\x0e\x1e\x1f\x65\x3b\xd2\x8f\xab\x07\xa0\x64\xa5\x17\x79\x31\x4d\xa8\x0b\x79\x68\xc4\x28\x88\xec\x29\x9f\xbf\x11\x15\x33\x5b\x59\x18\x46\x15\x33\xe2\x90\xa5\x0c\x62\xa1\x31\xfb\x52\xfb\x24\xca\x27\x7d\xa0\xfe\x5a\x52\xbf\x69\x68\x59\xda\x63\x65\x4e\x0c\x31\x7f\x21\xf5\x5c\x3a\xca\xed\x27\x13\x12\x22\x8a\x46\xfe\x05\x14\xf8\x2f\xf2\x77\x85\x0d\xf5\xc0\x2a\xd7\x1b\xcc\xdb\x4f\x8d\x68\xb2\xd9\x34\x4b\x58\x39\xb6\x65\xde\xa9\xa9\xf6\x89\x48\x52\xd9\x3c\x78\xb9\x3c\xb8\xc7\x99\x8d\x5d\xdd\x27\x45\x56\x6f\xcc\x1d\x22\xc6\x73\xce\x7a\x59\x05\xd6\xe7\x8c\x29\xf2\xd3\x90\xfa\x2b\xe3\x33\x38\x69\xa0\xc8\x1d\x58\x69\x0a\xe2\x05\x49\x93\x98\xa3\xa4\x30\x83\x91\xff\x80\x3e\x37\xcd\x15\xb7\x81\xa1\xfe\x7a\x34\x39\x71\xa4\x16\xdb\x0b\xd7\x6f\x6b\xa0\x60\x72\x51\xad\xbe\xad\x83\x20\x1c\x2f\x8f\x36\x7f\xb0\xe6\xe8\xf4\xec\xd8\x6c\xca\xa2\xb9\xd7\x22\x8d\x69\x82\x20\x4a\x14\x05\x72\xe3\xb4\xb4\x2b\xa0\x6b\x09\x24\x07\xe4\x61\x75\xf6\xc5\x1c\xfd\xd0\x7a\x10\x94\xca\x23\xc9\x6d\xa3\xbb\xd4\x1b\x65\xe8\xf6\x4b\xd2\xf8\x90\xf5\x95\x17\xfb\xb4\x6a\x57\x57\xac\xde\x79\xbd\xed\xf6\x4a\xe5\x06\xb0\x86\xbf\x1f\x16\xbe\xea\xdd\x37\x9e\x9d\x36\x67\x54\x00\xbc\x06\xa3\x56\xee\x0e\xd2\x1e\x90\x0a\x96\x5c\x58\x8c\x4c\x51\xaf\x5b\x57\xa0\x6c\x41\x5f\xbc\xfa\x7b\xdc\x5e\x5c\xe7\x0b\x31\x5a\x70\xb1\xf9\x90\x69\x1f\x2f\xce\x04\xf5\x65\x19\xde\xe5\xc7\x23\x2b\xc5\xd8\xba\x34\x45\xdd\x47\xa2\xba\x1b\xa6\xd0\x7d\x30\x19\x2b\x54\xd6\xde\x11\x78\xe6\x95\xbd\x97\xcd\xb6\x2a\x37\x48\xa8\xec\x2b\x0d\x64\x9e\x5b\xc1\x50\xd8\xbd\x55\xf6\xe0\xdc\x61\x91\xcc\x86\xa2\x18\xfe\x57\x74\xd8\x18\xa5\x58\x21\xd7\xe0\x5a\xaf\x8c\x1e\xe6\x5f\xe9\x80\xd3\x36\xe3\xa1\x44\x5d\x56\x40\x54\xa4\xbd\x22\x41\x8f\x35\xcb\x8e\x91\xad\x65\xcf\xd0\xd3\x40\xa6\x3e\x79\xf6\x3e\x6b\xed\x7c\x54\x79\x60\xcc\x58\x0b\x02\x5c\xe8\x55\x42\x97\x88\x4a\xba\xc1\x81\xfa\x58\xd8\xaa\xbe\xcf\xb6\x07\x43\x99\x01\x6f\xbf\xd7\x58\x20\x23\x1f\xeb\x81\xad\xfd\x82\xf4\xb1\x2a\x62\xc9\x0c\x58\x87\x2c\x67\x96\xad\x47\x2e\x38\x71\x6d\xae\xd9\xb5\xb9\x4a\x9a\x86\xb3\xf0\xf8\x27\x83\x0c\x49\x95\x9a\x6b\x08\x3e\x9c\x83\xef\x1c\x96\x7e\x87\x32\x20\x4a\x4f\x0d\x98\x95\xd5\xc6\xfd\xa6\x3e\xe0\x51\x89\x2b\xa1\xd5\x3c\x45\x12\xa1\xe9\x6a\xbe\x75\x64\xac\xf6\xdd\xd5\xdc\xd8\x2f\x0d\x6e\x47\x01\x34\xe9\x95\x11\xa0\x75\x9a\xac\x71\x2e\xfe\xe0\x72\xf4\x7e\x78\x39\xc0\x7e\xf0\xe4\x11\x3d\x33\x38\xd6\x89\x88\xa9\x80\x9c\x0f\x06\xe7\xfd\xaf\xb3\xc2\xd4\xbb\xf5\x3a\x5b\x81\x3c\x24\x93\x04\xe3\xa0\x78\xd9\x48\x48\xdc\xba\x41\x43\x22\x70\x4f\x13\x20\xc3\x5a\x2e\xe1\x34\x81\x8d\xec\x47\x57\xf4\x67\xc9\xa4\xe8\x1c\x67\xfe\xb8\x4d\x0e\x1a\x30\xcb\x63\x1c\x2c\x74\x95\xdc\x8e\xdf\xba\x9d\x2b\xd5\x52\xd6\xc0\x18\x48\x51\x3c\x70\xe5\x21\xe1\x82\x7f\xb3\xc7\x6d\x28\x55\xb2\x22\xa5\x87\x36\xee\x33\xe4\x3c\x36\x76\x5b\x7b\x1d\x26\xd4\x39\x86\xfc\x84\xa2\xfd\xd9\x24\x19\xd4\xbc\xe7\x59\x8d\x0e\x78\x61\x1f\xeb\xbb\xaa\xdc\x6d\xeb\x63\x2f\x23\xb8\x37\xab\x24\x5f\xed\x72\xae\xba\x42\x06\x1c\x2e\x25\xf4\xf2\x8c\xe9\x01\xbc\x08\x6b\xe3\x22\x1f\xb1\x7d\x54\x03\x2b\xb7\x20\x8e\x3b\xa1\xac\x68\xfd\x67\x71\x70\xfe\x0c\xaf\xc7\x8a\xb4\x26\x1c\x7f\x6d\x71\x2a\x87\x8d\x39\x81\x84\x79\x1b\x92\x2c\x47\x83\xe1\xf5\x98\x2a\x3a\x7b\xb6\x92\x44\xa7\x94\x86\x24\xa3\x46\xd5\x98\x04\x61\x9e\x6c\xb3\xcd\xd5\xa9\x3d\xbc\x1e\xab\x8d\x01\x14\x46\x01\xef\x81\xe6\x10\xe2\x03\x43\xe6\x3e\x18\x82\x2c\x36\x33\x86\xfa\xeb\xcb\x55\xf0\xff\x24\x00\xe4\x43\x1f\xc0\x69\x54\xb6\x51\xa9\xdf\x1d\xa5\xc7\x10\xbb\x5e\x96\x0f\xb4\x69\x59\x57\xe7\x09\x28\x53\x0b\xa4\x84\xf8\x09\x46\x30\x70\xa0\x96\x89\xf0\xb5\x7a\x8f\xda\x8b\x3e\x1e\x84\x31\x22\x75\xa6\x68\xb5\x8d\x0e\x71\xb9\x31\xc6\xc6\x5e\x8f\x78\x82\xe7\xab\xba\x3d\xd3\x1d\x4e\xb4\xed\xc8\x0e\x43\x71\x4f\x70\x37\x00\x25\x05\xd5\x03\x06\xc5\xd0\x1d\x7b\xbf\x7f\x20\x7e\x95\x95\x02\x4c\x82\x4c\x8c\x21\x17\x53\x8f\x4f\xa5\x71\x0d\x07\x2e\xa6\x76\xc7\x59\x01\x5b\xa5\x1a\xb3\xc2\x8c\xbe\x60\xd0\x65\x48\xb8\x6c\x1c\xbc\x01\xdc\xc5\x9e\x1c\x91\xae\xc0\x9e\x01\x00\xdf\xb6\x7d\xf5\x1e\xba\x30\x59\x82\x82\x42\xd1\x61\x84\xde\x3b\x85\x49\x9a\xe2\x02\x42\x62\xc4\xda\x24\x7d\xd6\x05\xb6\x14\x1e\x8a\x8a\xfa\x00\x24\x63\x3e\x4c\xc0\x7b\x34\xea\x83\x54\x48\xe4\xd5\xbc\x02\x7f\x03\x0c\x42\xc4\x4a\x64\x4d\xed\x13\x39\x6d\x71\x32\xde\x9b\x70\x58\xea\x07\xe7\x25\xe7\x19\x44\xcf\x0e\x82\x08\x0f\x6e\x21\xa3\xb5\x55\x56\x7b\x78\xd1\x31\x11\x46\x26\x66\x57\xdb\xca\x4b\x41\xe4\xd9\x67\x8a\x1c\xe7\x65\xf9\x19\x43\xbd\x28\x56\x47\xd2\xe5\x3d\x20\x0f\x70\x90\x23\x66\xe4\x04\x01\x37\x40\xa3\xae\x41\xa9\x92\x60\x64\x91\x07\x91\xbd\x0c\x33\xa6\xc5\x8d\x42\x0d\xa7\x9e\xec\x53\xdb\xa5\x87\x4a\x5b\x8c\xc4\x94\x85\x07\x52\x2d\xed\x7d\x92\x53\x9e\x06\xaa\x73\xf9\x47\x1d\x8b\xb2\x1b\x84\x6c\x3b\xea\x59\x63\x56\xb9\x4d\xaa\x56\x5c\xfd\x97\xf4\xd7\x2d\x1c\x18\x44\xaf\xe4\x03\x98\x62\x8f\x3a\x0d\x23\x6c\x25\x3f\x72\xbd\xef\xda\xc1\x18\xee\xd1\x6b\x95\x1d\x59\x8d\x4b\x5c\xed\x2a\x55\x3a\xae\xbb\xdd\x49\xcc\xb4\xd8\xd0\x5f\xde\x41\x8c\x5a\xa0\xbe\xff\xda\x56\x7c\x4c\xae\xe3\xd0\x9b\x2b\xd7\x66\xe4\xc3\x08\xac\x0e\xe1\x17\xda\x53\xb8\x8c\x43\x89\x20\x01\x8c\xf5\x83\xc4\xbc\x68\x8f\x48\x17\x41\x5b\x7d\x5c\xb7\x1b\xd1\x95\x6a\x4f\x77\x2f\xf9\x9b\x03\xd4\x56\x32\x32\x26\xda\x00\x31\x61\x4d\x86\x4c\x23\x93\x1a\x7c\x77\x24\x60\xaf\xa4\x09\xcc\xcb\x08\x5d\x10\x4d\x3c\x84\xe2\x34\xdb\x6c\xb5\x2b\x77\x52\x10\x97\x89\xde\x71\x2b\xd0\x16\x1d\x70\x36\x50\x74\x21\x07\xd6\xd2\x24\x17\x99\xfd\x1a\xfc\xb7\x67\xbd\xf4\x43\xde\x4e\xa6\x2d\xc9\x67\xa3\x55\x5a\xbe\x38\x0d\xdd\xf1\xfb\xf2\x91\x2e\x24\x8b\xf7\x36\x0e\x2e\x61\xef\x68\x70\xf5\xf9\xe0\xc7\x96\x2c\xd5\xa3\x8c\x07\xae\xb2\xe8\x60\xe7\xb9\xf9\x7a\xbf\x27\x22\x3f\xf0\xe1\xd8\x1b\xb1\xdd\x8d\xae\x74\x7e\x48\xe9\xa3\x27\x01\x00\x09\xf8\xbe\x3d\x0d\x95\x8c\xfb\xe7\x8f\x9a\xdf\x71\xcf\x7f\xcd\x7e\xf7\x1d\xee\xec\xe4\xbb\xee\x4e\xee\xe4\x54\xfd\x7d\x71\x08\x6a\x63\xe3\xbb\x38\xea\x64\x9b\x50\x82\x30\xe0\x88\x78\x2a\xf9\xb4\x02\x04\x65\x2b\x01\xed\xbe\xd4\x79\x5f\x52\xfb\x9a\xad\x36\x16\x55\xcb\x0b\xd6\x10\x55\x8c\xbc\xe5\x85\x18\x82\xd2\x6f\x95\x27\xe1\xa0\x80\xe6\x93\xf5\xdb\x0f\xed\xec\x6d\xdf\x4b\x90\x9d\xbc\x66\xda\x41\x2a\x5b\xd9\xa6\x64\x64\xfc\xb8\x90\x83\xb8\x34\xe7\xe5\x66\x9b\xef\xcd\x05\x9a\x17\xf3\x26\x69\x28\x3e\x31\xb3\x77\xbb\x3c\x50\x22\x41\x43\x06\x62\xfd\x3e\x9c\x27\x32\x56\xf0\x18\x21\x1b\xa3\xf6\x1d\x12\x36\x02\x75\x77\x20\xfc\x30\xa2\x2a\xf9\xf4\x94\x92\xfd\x53\x63\x03\x23\xf3\xb7\x5d\x9a\x41\xcd\x39\x89\x98\x41\x52\x80\x5b\xdc\x36\x8c\xdc\xc9\xac\x5b\x78\xb8\x69\x64\xbe\x6d\x92\x2f\xd9\x66\xb7\xe1\x0c\x39\xf7\x98\x8e\xe1\x55\x46\x6b\xa8\xf6\xc3\xe5\x5f\x2e\xf2\x29\x24\xe3\x28\x1a\x68\x49\x7a\x4f\xf9\x82\x32\x84\x91\x53\x88\x29\x3b\x0e\xc3\x3d\x9a\x61\x87\xc3\x06\x94\x3a\xb4\x7b\x93\x40\x5d\x17\xc9\x13\xe9\x63\x93\xab\xb0\x3b\x49\x50\xef\x95\x1f\xf0\xec\xd3\x63\x55\xa3\xad\x9f\x80\xd3\x9a\xe7\xc1\x9d\x54\xf7\x18\xde\x90\x8d\x07\xba\x95\x00\x61\xc0\x83\x41\x08\x8f\xbe\x51\x8b\xf0\xbc\xe9\xeb\x88\x77\xc2\xf2\x3d\x85\x44\x68\xe7\xe8\x98\x08\x80\x05\xd2\xac\x70\x9e\x6c\xfd\x19\x90\xed\x90\x12\xd8\xee\x1a\x5b\x05\x1e\x34\x92\xe4\x70\xd5\x08\x6c\x75\xd0\x1d\x63\x7d\xcf\x1f\x9e\xcc\x96\x92\x1a\x95\xde\xd1\xbe\x46\x14\xa7\x87\x5d\x2b\x7d\x9a\xea\x83\xf4\xde\x9d\xa4\xc0\x20\x4f\x37\x98\xb7\xd5\xc5\xe3\x89\xbc\xb6\x97\x67\xc5\x15\x00\x80\x78\x9a\x80\xf7\xb4\xc5\x4a\x8a\x22\xb4\x88\x56\xa7\xd9\x98\x0a\xfe\xc8\x20\xe9\x05\x04\x65\x9f\xa8\x86\x05\x7c\x23\x84\x68\x7d\x24\xf6\xdf\x93\xe5\xd2\x56\x7d\x1f\x8f\xcd\x30\xcf\x25\x56\x8c\x61\x06\x09\xb6\xa8\x24\x5d\x9e\x3c\xca\x7a\x16\xcf\xa4\x44\x52\x66\x8d\xc1\x9c\xd8\x47\x65\xf5\xc9\x60\x6a\xb1\xaf\x0e\xd6\xfc\x25\xf2\x5f\xad\x11\x59\xc5\x66\x24\x35\x92\xe1\x3b\xa7\xc5\xaa\xe7\x28\x92\x60\x8f\xc7\xbc\x4b\x19\x82\xf7\xe0\xfa\x6d\x24\xe5\x47\xe6\x8f\xc9\xbe\xee\x00\xe1\x0f\x51\xd1\x79\xcd\x24\x7f\x73\x42\x40\xc6\xbb\x5b\xee\xeb\xb0\x89\x9e\xa8\x0a\x93\x27\xa2\x5f\xd2\x97\xf8\xd1\x38\xf8\x80\xe0\x4e\xe0\xde\x66\x42\x5e\x98\xaf\x9c\xb8\xcc\x56\xe6\x00\xbc\x5e\x05\x06\x09\xe5\xee\x97\x42\x4f\x80\x40\x1c\xf0\x1e\x31\x5a\x1f\x7c\xee\xdc\x8e\x07\x15\x25\x25\xe2\x01\x09\x1c\x23\xc0\xaf\x03\xa9\xe2\xa8\x55\x62\x9c\x92\xb7\x08\x71\xf7\x14\x25\x15\xb0\x1e\x20\xa3\xbb\x8b\x32\x91\xac\x66\x0b\x55\xb9\x79\x65\x93\x74\x6f\x92\x97\x94\x03\xa9\x08\x5b\x65\x21\xa8\x00\x0e\x09\x9b\x1c\x6c\x58\xf8\x30\xc2\xaa\x2c\xd6\xc0\x00\x96\xef\x45\x82\xae\x55\xb0\xad\xce\xf1\x1e\x53\x35\x78\xbe\xe0\x38\x5f\x60\xbc\x42\xcd\x5e\x5d\x9a\x22\xd9\x08\x41\x77\xde\x5e\xd8\xae\x89\x9c\x2c\x13\x24\xcf\x33\x40\x1e\x98\xd9\x3f\x3d\xa9\x90\x45\x35\xfd\x17\xe6\x7a\x36\xbd\xb8\x39\x5f\x98\xb1\x28\x52\x5d\x98\x9b\xc9\xc5\x08\xb4\x74\xe6\x52\xfb\x3f\x9d\x98\xe1\x44\xf4\xa9\xde\x0e\xe7\xe3\x79\xf4\x55\x32\x55\x87\x44\xaa\xf8\x19\xa0\x08\x34\x5c\x8c\xa7\x93\x48\x0b\x53\x2d\x3e\x0c\x17\xa0\xa7\xd3\xd7\xe0\x77\xb3\x11\xe8\xfa\xa0\x3a\xd4\x3c\x52\xec\x8b\x97\xa3\xc8\xbc\x1b\x2f\x0e\x92\x2e\xba\xe6\x4c\xa6\x93\xd7\xe3\xc9\xbb\xd9\x78\xf2\x7e\x3c\x79\xff\x2b\xb4\xac\xfa\xda\xd6\x11\xb5\xea\x7c\xa8\xa5\x6c\x65\xc6\x13\x18\xbc\xd9\x68\x7e\x3d\x3a\x5f\xa0\xd0\xd5\x91\x7b\xe3\x64\xaa\x87\x60\x3a\x0b\x85\xa3\xce\xa7\x93\xc5\x6c\xfc\xf6\x66\x31\x9d\x1d\xf7\x0a\x63\x4d\x6e\xbf\x42\x18\x0b\x67\xfd\x62\x3c\x3f\xbf\x1c\x8e\xaf\x46\x33\xf7\x04\x99\xde\xf3\xe9\x64\xbe\x18\x2f\x6e\x16\x20\x4e\x65\x46\xf3\x39\x09\x44\xb9\xf1\xc5\xc1\xf0\x4b\x26\x36\x13\x94\x82\x9a\xbe\xeb\x1d\xa0\xe1\xcd\xe2\xc3\x74\x36\xfe\x1f\xa3\x0b\xf3\x61\x34\x1b\xe1\x9a\x23\x9d\x35\xb5\x00\x7d\x53\x60\xdd\xfe\x39\x86\x4a\x1a\x72\x61\x34\x22\x8b\xab\x00\xf5\xef\xcd\xcd\xb6\x2c\xcc\x5b\x28\x3c\xa4\xca\x22\x0d\xa2\xed\x49\x64\x09\x80\x85\xf8\xa2\xb8\x9a\xb0\x55\x65\x48\x25\x8d\x6b\x12\x9d\xec\xb7\x86\xc9\xb8\x00\xd2\x7f\xfe\xe0\xae\xa2\x5b\x85\xaa\x21\x45\xc1\x3c\xab\x9a\xbd\x39\x7a\x73\x72\x6c\x52\x77\x91\x95\x6b\xb3\xb4\xab\x12\x0e\x86\x04\xe1\x7e\x78\x97\x2c\xa9\x33\xce\x38\xf0\x98\xe0\xc3\x05\x93\x92\xa4\x90\x82\x57\xc1\x35\x42\x72\xa8\xde\x55\x0f\x50\x78\x5f\xf8\xda\x49\x7d\x90\x0b\x07\xc2\xb5\xc7\x76\x63\x72\x01\x83\x5a\x59\x45\xac\x0b\x51\x00\xc0\xc8\x0a\xa6\x4a\x58\xda\x7d\x49\x63\xdd\xf7\x7c\x39\x62\x83\xe6\x28\xbb\xa5\x33\x9d\x43\xa8\x50\xa5\x67\x5c\x63\x4e\x66\xac\xa4\xa2\xe5\xb2\x42\x20\x07\x50\x72\x36\x1c\x02\x5c\xee\xa9\xc2\x15\x03\x24\x94\xd2\x09\x94\xa6\x31\x75\x78\xe4\xc5\xab\x53\xbb\xca\x93\x0a\xb5\xc4\xff\xb6\x23\x2e\x2a\x14\x2b\xa9\x8f\xa5\x2a\x26\x38\x8f\x03\x03\xf5\xe8\x90\xe5\xca\x5f\x15\xfd\x61\xe4\x08\x84\x40\x70\x41\x6f\x30\x6c\x96\x52\x16\x96\x17\x55\x6d\x06\x33\xc0\x82\xa4\xb6\x68\x06\xc7\xce\x9f\xb0\x77\x12\x62\xea\x3a\x7c\xbd\x90\x00\xe9\x78\xad\x0a\x7e\x59\xb1\xb9\x40\xbd\x0a\xa0\x93\xec\x64\x7b\xa1\x91\xbe\x01\x26\x90\xdf\xf6\x2a\x66\xee\x75\x67\x1d\xb7\x90\xd2\x92\xb2\xb7\xb6\x55\x09\xde\x2b\x8a\x39\x01\x73\x46\x9d\x7d\x71\xfb\xe1\x07\xde\x0f\x14\x91\x83\x3b\x54\xbd\x56\x27\x32\xcc\xb5\xad\xb2\x32\x1d\x1c\xb3\x36\x98\xec\xad\xa4\x31\xc1\x47\xa0\xa9\x04\xc1\xc2\xb8\x4f\x56\x00\xd9\xad\x1b\x3f\x40\x2d\x94\x66\x9b\xec\xf5\x8b\x12\xb3\xd9\x35\x3b\x44\x4f\xb9\x6f\x80\xbd\xa5\xf2\x7e\x5a\x6e\x1a\xe5\x33\x92\x1a\xe2\x07\x04\x3e\xdc\x1d\x28\x7f\x61\x76\x87\xd6\x78\xfa\x52\x11\xd7\x89\xb4\x4a\x1e\xd9\x3c\x90\x95\x8c\xcb\xb4\xed\xfc\x77\x43\xb7\xb4\xc6\x5a\x2f\x80\x4d\x42\x03\x04\xd8\xa4\x70\x80\x12\xdf\x37\x2b\x7d\x43\x45\x9f\x3d\x2e\x7f\x2f\x2a\x2f\x24\x9c\xe1\x08\xa5\x38\x91\x6a\x64\x99\xc4\x80\x44\xfd\x09\x55\xd6\xe9\x12\xd9\x65\xdc\x71\x0c\x3f\xf4\x2c\x41\xd9\x55\x87\xd6\x9e\x6b\xef\xd9\xa1\xf2\x70\xa9\xd9\xfc\xb2\xcd\x2a\x39\x92\xba\x43\xa1\xfc\x9a\x99\x1f\x92\x8f\x49\xbe\xb3\x1d\xa7\xb0\x5d\x43\xff\xc4\xf1\xc2\xd3\xa2\x97\xd8\x6f\xb6\x83\x29\xc0\x1b\x16\x20\x54\xb6\x2e\x73\xe7\x7b\x4a\xd6\x6a\xb9\xd7\xfa\xfb\xb5\x6d\x1a\xcc\x56\x1f\x9b\x6d\x95\xf9\xe4\x1b\x1d\xa3\x34\x42\x7d\x5d\xf2\x53\x48\x67\x07\x86\xed\x64\xb4\x1e\x78\xb4\x54\x5d\x72\x78\x9a\xb8\x61\x57\x43\x71\x60\x2a\x05\x4e\xde\x24\x9f\x6d\x41\x52\xe1\xab\x55\xb9\x43\x31\x89\xd4\xe2\xec\x0a\xca\x6b\x03\xbf\x29\x2b\xdf\x00\x1c\xa3\x3d\xcb\xf3\xe7\x1d\x4f\x68\x52\x9a\x99\x6d\xaa\x92\x14\xa4\xbc\x2b\xab\xad\x0e\x67\xb7\x37\x42\x38\xe1\xfa\xa5\xee\xa8\x56\xdb\xff\x7c\x94\x80\xf2\xd0\x9f\x8f\x96\x92\x67\x87\xa0\x79\x91\x62\x4e\x50\x0c\x12\xb7\x69\x30\xc8\xa9\xee\x1e\x7d\xbf\x4b\xb8\xa8\xac\x6a\x62\xc9\xaa\x6d\xee\x36\x68\x4d\x14\x56\x10\xce\x07\x67\xfa\x21\xc9\xb3\x54\x5d\xf6\x14\x1b\x67\x8e\x4b\xff\x24\x65\xf1\xf8\x59\x57\xdd\x09\xad\x84\xa6\x65\x7b\x9d\x9e\x3c\xa1\xa1\x8a\x56\xdc\x64\x6a\xce\xc7\xb3\xf3\x9b\xab\xf9\xc2\xd9\xcc\x28\xa4\x28\xbf\xc2\x30\xda\xe2\xc3\x68\x3a\xbb\x8d\xcc\xa7\x0f\x23\xb0\x69\x17\xd3\xd9\x42\xcb\x86\x4e\x46\xef\x2f\xc7\xef\x47\x93\xf3\xd1\x71\x84\x06\xef\xd0\x59\xc8\x2c\xc5\xf9\x69\x3c\x1f\x45\x66\xfe\x61\x78\x79\x19\x18\xca\x11\x09\xaf\x8a\x81\x2c\x9a\xab\x17\xe3\x39\xff\xac\xcf\x3e\x95\xcf\xcd\x6f\xae\x9d\xcb\x32\x63\x43\x9a\x95\x3c\x49\x61\xb4\x25\xba\xea\x3e\x71\x3d\x9a\xcd\xa7\x13\xf4\x3b\x26\xb7\x66\x3c\xb9\x18\xcf\xc0\x9c\xef\x51\x5a\x8d\x0e\x4b\xad\xd2\xfb\xce\x3f\x0c\x5d\x57\x47\xb3\xe7\x5c\x26\xfe\xde\x3b\xd2\x47\x75\x0f\x78\x3f\x9d\x5e\x7c\x1a\x5f\x5e\x46\xe6\xd3\x74\xf6\x17\x33\x5f\x4c\xaf\xaf\x87\xef\x47\x6e\x04\xaf\xae\x6f\xdc\x43\x45\x1b\x75\x66\xae\x86\x97\xef\x6e\x26\xe7\xf8\x34\x6a\xbc\x9b\x29\x37\xa6\xec\x68\x5c\x39\xff\x2a\x68\x25\x8b\xb1\xb6\xa4\x52\x51\x1a\x15\x27\xe4\xc3\xf0\xe3\x08\x15\x52\xc7\x13\xe7\x38\xbd\x4c\x22\x95\x5d\x09\xee\x21\xce\x12\xb3\xea\xe3\x93\x9d\x5f\x34\xbc\xbe\xbe\x04\xd1\x59\xff\x4b\x90\xbd\x1d\x0d\x17\x1f\x5c\xf3\x70\x3a\x86\x97\x66\x3c\xf9\xf7\x9b\x19\x78\x57\x37\x97\x20\xcc\xfb\x6e\x36\xbd\x52\xad\xfd\x27\x83\xe5\xbf\x00\xff\xe3\xdd\x7c\x3a\xbc\x7e\x7d\x1a\xbf\x59\xfe\x5e\x0c\x90\x4f\xf3\x3f\x7e\x7f\x72\x76\xfa\x5d\x9b\xff\xf1\xcd\xc9\x77\xff\xe4\x7f\xfc\x23\xfe\xc0\xec\xb7\x38\xe5\x5f\x31\xeb\xa3\x5b\x14\x10\xe5\xc6\x4f\x91\x94\x7d\xfe\x44\x74\xfb\xaa\xfc\xcf\x2c\xcf\x93\x8e\x8a\xc2\xd5\xf5\xe5\x69\x7c\x4a\xc5\x00\x35\x5f\x95\x70\x85\x3d\x5a\x40\x32\xe7\x50\x2a\x26\x0f\x12\x78\x19\x7e\x13\xb1\xa4\xce\xee\x3c\x8d\x4f\xe2\xd3\xc8\x9c\xc5\xa7\xf1\xd1\xea\x38\x82\xa4\xcb\x59\x7c\xe6\xff\xf1\x27\xf7\x8f\xe5\x71\x64\x4e\x4f\x30\x8c\x77\x7a\x1a\x4b\x92\xe6\x4d\xfc\x27\xf3\x98\xd4\x26\x49\x53\x9b\x62\x6b\x24\xa2\x29\xcd\x72\xaf\x81\xe7\x2f\xf9\xd9\xee\x2f\x6f\xe2\x33\x73\x54\x03\xe5\xb4\xfb\x38\xfc\xe4\x7b\x73\xc4\x2d\x07\x4b\x07\xaa\x04\x6c\xd1\xd8\x62\x65\x29\x19\xf4\x26\xfe\x21\xf8\x1a\x09\x96\xe4\xdd\xe4\x47\x23\x03\xed\x49\x30\x93\xd5\xe7\xe4\xce\xaa\x64\xa9\xe7\xa2\x17\xf9\xa2\x64\xbb\xda\x6e\xcf\x30\xcf\x5f\xa7\xf9\xd9\x7d\xa0\xc5\x00\x19\x02\xcc\x54\xdd\xb9\xcf\x7e\x5b\x57\x28\xd5\x89\xff\x72\xdf\x88\x08\x63\x9a\x5a\x2a\x19\x61\x23\xad\xfb\x68\x34\xcd\x6f\x2e\x2e\xc6\xc1\x4b\xf0\x59\xbb\x34\xcd\xce\x3c\x24\xfe\x93\x5d\x9a\x1a\x28\x3e\x4d\x9d\x80\x4e\x88\xfe\x0a\xfe\xa8\xfe\xf6\xd1\x2e\xf1\x43\xb1\x59\x94\x12\xf8\xc4\xce\xd5\xaa\x52\xa5\x29\xcb\xbc\x26\xbc\x05\x11\x01\xd6\x8a\x3b\x3b\xdf\x47\xc8\x11\xc8\x5c\xda\x6a\x95\x0a\xa6\x19\xbe\x9d\x14\xa0\xb5\x4c\x40\x53\x5c\x71\xa0\xfb\x67\x8b\xec\x21\x4b\xe2\x55\xb9\x41\x4b\xc7\x5c\x8c\xde\x8d\x27\xa8\xfe\xcc\x06\x23\xac\x3e\xff\x8f\xd3\x38\xac\x3b\x27\x7a\x01\x08\xf4\x50\xa5\x3b\xa6\x9d\x51\xd2\x39\xac\x29\xa8\x7b\x4a\xdd\xdb\xd4\x41\xfc\xa2\xb3\xf0\x45\x9c\x63\xd1\xdc\x25\x2a\xd1\xcf\x6b\x63\xca\x9b\xe8\xbc\x4c\x6d\x44\xe6\x5e\x98\xdb\x66\x15\xb2\x24\x2c\xad\xe6\x39\xec\x67\x26\xc4\x0c\xad\xcf\xd5\xb4\x23\xd1\xd0\xe4\x37\xd0\x64\x14\x89\x68\xf3\xac\xb4\x1a\xd6\x69\x15\x79\x8a\xcf\x77\xc9\xb5\xb3\x55\x91\xc1\xd8\x46\x60\xf0\xf2\xd8\x98\x76\x69\xb4\x6f\xe8\x77\xf1\x4b\x0a\x99\x98\x39\xe2\x0f\xaa\xaf\xf2\xcd\xfb\xde\x35\x4f\x00\x49\xdc\x0e\x3d\xb2\x8c\x75\xc5\x02\x31\x9f\x54\x6a\x73\xbe\xc1\xe3\x7e\x88\xcd\x00\xa9\x41\x73\x73\x81\xad\xb3\x95\x9e\x1b\xe7\x6a\x3e\x64\xe9\x0e\xb0\x01\xbc\x8a\x95\x22\x0c\xe5\xa7\x3a\xcf\xe0\xbe\x6b\xa0\x13\x05\x71\x64\x03\x2e\xf7\x3e\x43\xeb\x9b\xf4\x63\x6c\x06\x97\x49\x75\x67\x2b\x48\x46\xf9\xa1\x06\xde\x3e\xe2\x63\x83\xa5\x60\x5b\x1d\xef\x2b\x79\x0f\xc5\x7e\x5e\x54\xd4\xea\x9b\xf2\xa7\xd8\xb3\x17\xcb\x98\x04\xca\x78\xfe\x93\xa7\xf2\x59\x3d\x31\xf7\xc9\x83\x88\xcb\x70\x0a\x0f\x7c\xb2\xe8\x59\x70\xc4\xe3\xbd\xc5\x08\x15\x06\x2a\x20\x1f\x4b\xcb\x9e\x4a\xd4\x08\x3b\x0d\xe8\x22\xce\x3d\xc2\xf2\xc3\xf1\x8d\x82\x18\x1e\x7d\xb5\x0d\xb2\xa6\x12\x78\xe9\xc8\x9f\xe3\x17\x90\xa4\xb4\x38\x52\x5e\x42\x91\x42\xe1\xb6\xce\xa6\x65\x97\xb4\x9f\x8e\x24\x36\x9f\xee\x6d\xd1\x5a\xde\xb5\x2f\xd9\x45\xc1\x28\x5b\x65\x58\xad\x44\xec\x48\x2d\x3a\x90\xac\xfe\xc9\x83\xe7\x87\x58\x89\xfc\x6c\x4f\xdc\xc1\xcc\x88\xa3\x2e\xb5\x4b\xa7\x0b\x07\x9a\xef\xdf\xfb\x16\xdf\xfb\x02\xd6\x97\xfe\x13\xf1\xe9\x17\x9c\xc6\xce\x13\x1f\x04\x5f\xe3\x89\x6b\x21\xb9\x05\xc4\x21\xa7\x12\xec\x0e\xc1\x47\x04\x68\x96\xaf\xd9\xc1\x6e\x32\x7a\xce\x63\x78\x70\xd4\x5e\xc5\x59\x23\xb3\xd8\xc7\xe9\xd8\xca\xfc\x06\xf3\x1f\xee\xe1\xbe\x6d\x7b\x7a\x02\xbb\x91\x72\x03\x58\x22\xa5\x97\xb1\x26\xb6\x3c\xaa\x8f\x23\xe4\x1b\x61\x8a\x11\x55\x42\x23\x1b\xc9\x5f\x1c\x7d\x55\xee\x1b\xdb\xdc\x97\xa9\xbb\x51\xcb\x95\xad\xa9\x0c\x30\xd9\x02\x6d\xc4\xae\x16\x2a\x18\x3a\x97\xe9\xed\xfe\xac\x30\xcc\x4c\xa3\xef\x4b\x67\xa6\xbe\x90\x97\x8c\xd6\x4c\x30\x48\x4f\x71\x95\x65\x07\x99\xc9\x32\xbf\x24\xff\x50\x4e\x32\x7f\xa1\xc1\x5a\xd7\x86\xe1\xb3\x6c\x64\x4f\x1f\x2c\x78\xff\x01\x63\x3c\x48\xa7\x46\x0a\x4a\x1b\xde\x1d\x3c\x88\x62\xbb\x7c\x53\x0b\xd7\x65\xbb\x66\x99\xac\x46\xa8\x06\x70\x6d\xaa\x6c\x5d\x93\x5a\x46\xb5\xba\xcf\x1e\x48\xcb\x36\xd2\x4a\xa7\xa1\xb4\x7a\x6a\xf9\x7b\x19\x32\x21\xa5\xf6\x35\x7e\xd7\xcd\x89\x96\xbf\x79\xcc\x52\xeb\x0e\xf5\xa0\xa2\xb9\x28\xa9\x06\x40\x2d\x18\x67\x14\xde\x96\xbb\x81\x39\x2a\x2b\xf8\x5b\x35\x38\x96\x45\xdf\xba\xc7\x13\xa6\x33\xc7\xfb\x9c\x4a\xfb\x40\x21\x06\xef\x07\xd8\x93\x91\x18\xd8\xf9\x9e\xd7\xbe\xbe\x4b\xf8\xf6\x8c\xbe\x9e\x74\x01\xb4\x4b\xdb\x94\x0b\x3f\xb8\x6d\xfb\xae\xac\x74\xe3\x32\xb7\xb4\xb0\x5f\x04\xa0\xc3\x45\x29\xcc\x51\x68\x0e\xc0\x52\xab\x81\x1e\x3f\xa0\x08\x42\x02\x5a\x86\xa0\x3a\x9b\x8b\xb8\xc0\xdd\xca\x84\xfe\xdc\x96\x3b\x7c\x29\x31\x17\x7b\x73\xc0\x2f\xf1\xc8\x0c\xe8\x3b\xbc\x0d\x11\x68\x6e\xcd\xb6\x7c\x74\xe3\x84\xe1\x78\x1d\x9a\x8f\xbc\x48\x2f\x14\x04\xc3\x0f\x69\xae\x37\x49\x91\x50\xe8\xbc\x24\xb6\x15\xec\x8e\xbf\xf4\x97\x88\x99\xaf\x12\x7c\xaa\x10\x9a\x60\x62\x68\x79\x1c\xd6\xac\x42\xf5\x06\x18\x79\xeb\x6c\xdd\xec\xcd\xd6\x56\x2b\x48\x8f\x7d\x7f\xf2\xff\x3b\xe6\xd9\x2a\x77\x0d\x00\xf3\x60\x81\xdd\x27\x15\x3a\x20\x4b\x5b\xd8\x35\x61\x3f\xf5\x23\x55\xab\x90\x73\x8d\xd5\x20\xce\xa7\x17\x82\x78\xe0\xd5\xe7\xdc\x63\xd8\x24\x5d\x33\xd0\xf3\x06\x01\xd0\xaf\xef\x23\x21\x39\xd7\xed\x1f\x46\xce\xa5\xac\x02\x37\x9d\xb8\x44\x9e\x28\x88\xad\xcd\x91\x32\xa7\xe9\x18\x77\xb6\x3b\xc3\x72\x8e\x5b\x87\x7a\xb7\xab\x88\x2b\xfb\xd5\x94\x5f\xdd\xc3\xee\xa8\xc7\xf6\x3d\x26\xe4\x76\x25\x97\x56\xb7\x5a\xfd\xdb\x90\xab\x2b\x31\xca\xf2\xfe\xd9\x7d\x40\x8d\xd1\x92\xc7\xe8\x6b\x69\xba\x3a\xe3\xa0\xc8\xba\x14\xb7\xd5\x8e\x3a\x0a\x82\x00\x47\x03\xe4\x43\x69\x4a\xfc\x37\xdc\x1c\x1b\xd7\xc5\xc1\x71\x9f\x89\xd4\xea\xda\xaf\xe1\xec\xe2\x14\x57\x7d\xb0\xb0\x93\xf8\xbb\x6e\x11\xad\xbd\x6b\xb2\x3c\xfb\x4f\xab\x14\x0a\x40\x45\xd1\x3b\xab\x3d\xec\x4d\xd1\xcb\xfa\x80\x65\x77\xca\xed\xed\x76\x4b\xd9\x98\x47\xab\x63\xf5\x8f\xf4\x58\x76\xe7\x59\x58\x33\x1b\xec\xc9\xf9\x2f\x61\xb5\x03\x97\x3a\x00\xe1\xfe\xfa\x3d\xfc\x7b\xef\xc6\x36\x59\xdc\x6f\xb5\x11\x5f\xce\xbd\xd7\xbf\x49\x9f\xe4\xd2\x8b\xf4\xe2\x69\x6f\xdf\x96\xfb\xfb\x47\x6d\xe7\x7e\xd6\xbd\x5f\xbc\x91\x7b\x02\x59\xfd\x23\xf5\xbf\xe1\x06\x7e\x71\xdb\x9f\xd9\xa5\x6f\x7c\x46\x12\x92\x5d\x6f\x2f\xc7\xef\x87\x41\xa8\xf1\x8d\xbb\x62\x5b\x40\xfa\x96\xe3\xb3\xe8\x2c\x46\xb4\x8e\x6e\xfb\x4b\x95\x6f\x43\x8a\xad\x17\x73\x7e\x3d\xed\x0d\x29\xca\xaf\xb3\xae\xe1\xac\xcc\xc1\x60\xe9\xfe\x03\xf8\xbd\x7e\x88\x4f\xd1\xbe\xfd\x95\x2c\x5f\xba\x7b\xb7\x3d\x1c\x5f\x0c\xe2\xfd\x2a\x7a\x2f\xee\x8b\xe7\xe9\xaa\x35\x51\x57\xcd\xfe\xc4\x6f\xcb\xd4\x75\xfb\xfb\x31\x75\xbd\x89\xbf\xf7\x2b\xf9\xec\x69\xaa\x2e\xfa\x5c\x9b\x30\x4e\x1f\xad\xae\xa5\xac\xdc\xee\x7d\xac\xf2\x70\x28\xb2\xc5\x38\x85\xcc\x21\x09\x80\x64\x02\xa9\xcc\x3e\x65\x0a\xdf\xf0\x37\xcf\x30\x1c\xd1\x07\xdb\x3c\x47\x79\x1e\xae\xf6\x43\x5b\xf0\x79\xe2\x22\x2e\x07\xb9\xed\x12\x14\xc1\x52\x69\xdf\x07\xe8\x7b\x24\x8d\xaf\xe1\x87\x07\xfc\x3a\xb6\x21\x95\xea\x7b\x86\x6b\x28\xb4\x51\x65\xa2\xe8\x74\xe9\x4e\x94\xa7\x21\xe2\x0e\x03\x82\x9f\xa6\xa3\x77\x62\xd9\x11\x53\x13\x4c\x25\x60\xcb\x36\xc9\x10\xfc\x4b\x17\x41\xcb\xae\xa9\x9e\x23\x0f\xba\xfd\x0a\xf2\x20\x3d\x07\x7e\xe9\x7c\xf7\x72\x8a\x1f\xd7\xa5\x03\x1c\x3f\xed\xba\xa7\x83\x54\x3f\x5c\x42\xf3\x62\xb6\x9f\xfa\x2b\xe9\x7e\x3a\xc6\x4d\x0b\xf7\x74\x16\x23\xf8\x33\x3e\x8b\x82\x8f\xfd\x76\xa4\x40\x38\x33\xff\x20\x56\xa0\x80\x52\x79\x89\x41\xdc\x5e\x7a\xa0\xbe\xcd\x13\x92\xbb\x1d\x24\x07\x7a\xd3\x1e\xbb\x5f\xc0\x11\x14\x0c\x7d\xf2\xd9\xd6\xff\x15\xc8\x82\xc2\xc3\xf2\xeb\xf8\x81\xdc\xb6\xef\xe5\x07\x0a\x23\x7b\xbf\x82\x28\xc8\x8d\xd5\xe1\x7d\xd8\xc3\x13\x84\x0b\xf5\x6b\x89\x82\x3a\x9b\xe6\x97\x13\x06\x1d\xad\x8e\xbb\x7c\x41\xfa\xf9\xc2\x1b\x54\xbf\x90\x38\xc8\x2f\x51\xa0\x5c\x20\x5c\xa3\x7e\x24\xf1\x08\xd5\x7c\x2f\x1d\x1e\x7c\x37\x30\xe1\xef\x3b\x64\x42\x47\xf5\x31\x7b\x37\xed\x91\xff\x6d\x38\x85\x9c\x79\xd2\x65\x15\x6a\x5f\xe7\xbd\x14\x3b\x01\xb1\xce\x33\x4c\x3a\xcf\x30\xd8\xc0\x4e\x2b\x7e\x3d\x85\x4d\xe7\x72\xef\x3c\xf8\x65\x14\x36\xbf\x9c\xbd\x66\xbc\x56\x5e\x47\x1a\x90\xcc\xe8\xc9\x77\xf3\x7a\xfb\x55\x4c\x40\xcc\x17\xa8\xcf\x4b\x9f\x43\xf6\x3d\x87\xcd\xf2\x35\x5c\x50\x3d\xca\x68\xd4\xfb\xdb\x67\xf8\x99\x02\x1b\xa0\x87\xb3\x29\xb0\x07\x9e\xe6\xf5\x69\xca\x3f\x86\xda\x27\x6c\x52\xc7\xfe\x0f\x69\x7d\x6e\x5f\x4c\xeb\xd3\x35\xd0\x0e\xd4\x26\xc2\x8e\xfb\xe1\x65\x04\x35\x7a\x13\x86\x34\x35\x6d\xd0\x83\xfa\x36\xe6\xc5\x0a\xac\xd4\xea\x23\x91\xf0\x07\xd8\xe9\xeb\x37\xf1\xf7\x0a\x39\xbd\xb1\x8d\x67\x8d\xe9\x9f\xbb\x56\x00\xa8\xcf\xa2\x5c\x77\x90\x09\x9d\x35\xd2\xc3\x9d\x73\xeb\xb9\x73\xb8\x72\xf6\xab\xd8\x73\x82\x84\x53\xd2\x08\x6b\x2c\x86\x33\xb6\x79\x06\xa9\xf9\x67\x48\x1b\x84\xb7\x4d\xa1\xf5\x65\x7b\xf4\xf4\x35\x2d\x2d\x65\x6b\x9b\xc6\x6e\xb6\x44\xb0\xbe\xc9\x90\x3e\x23\x67\x23\x48\x56\xe0\x37\xb5\x58\x9c\xdd\x04\x33\x3f\x54\xf2\xf0\xf4\xd1\x1a\x67\xa5\xb9\x6f\x73\xcc\xcb\x59\xf3\xfc\xa4\xf0\x80\xfb\x01\xe4\xde\x75\x28\xa7\x92\x65\x5d\xe6\xbb\xc6\x9d\x72\xbd\xa4\x34\x64\x7b\xbe\x90\x95\xe6\xb6\xc3\x4a\xf3\xe2\xdd\xc2\x25\x25\xaa\x77\x7d\xaa\xb2\x0a\x9a\x10\xba\x80\x3a\x16\xb8\xd5\x64\xf2\x54\xac\x47\xd1\xcf\x03\x17\xda\x5b\x9e\xa2\x0e\xcd\x91\x88\x50\x28\x92\x23\x59\x7b\x9a\xcb\x45\xd3\x9c\xbe\x89\x7f\x8c\x75\x44\xb2\xb3\xb9\xc9\x95\x0d\xc2\x96\x98\x0a\xdb\x2c\x7b\x7a\xd7\x22\xa6\x79\x39\xc2\xa7\x2f\x8c\xab\x5f\x89\xb0\x92\xac\xb8\xcb\x7d\x1f\xa0\x58\x1b\x6f\xb9\x55\xe2\xb6\x5a\xb8\x68\xea\x5d\x65\x7b\x4f\x9a\x67\xe9\x6a\x0e\x79\x8c\x7f\x72\x16\x09\xc6\x7b\xfa\x0e\x42\xd7\xd9\xca\x6e\xca\x07\xe6\x9f\x25\xb2\x28\x82\x66\x31\xd1\x9e\x70\x32\x45\x81\xaa\x23\x13\x34\xb9\xfb\x23\x59\xda\x9c\xc4\x15\x00\x70\x8a\xb2\x08\x66\x3c\x61\x44\xfd\x62\x0a\x25\x03\x97\xb7\xe6\xe2\x06\x0a\x1d\xe6\x8b\xe1\xe2\x66\x01\x75\x03\xb3\xd1\xfb\x9b\x4b\x08\x55\x3e\x49\x6c\x73\xfb\xfb\x10\xdb\x04\xcb\xe1\xab\x48\x6d\x42\x4b\xe9\x27\x70\xba\x7f\x0b\x52\x9b\x9f\x25\xf8\xf0\x8f\x64\x9f\x79\x13\x7f\xf7\xdf\x89\x7b\xe6\x39\x8e\x99\xef\xa1\x0e\x64\x7c\x2e\xa5\x22\x41\x21\xfa\xcb\x29\x66\xfa\x8f\xe5\x0e\xc1\x4c\x9f\xe5\x4f\xe6\x1b\xc7\x91\x3a\x5b\xfa\x07\xf3\x71\x34\x9b\x8f\xa7\x93\x79\x8b\x35\x80\xf7\x35\x80\x1f\x02\xc2\x14\xfa\xc5\x7b\x84\x06\x05\x4c\x2d\x2f\xe7\x65\xe9\x13\x10\x1d\x39\x17\x85\x6f\x45\x0e\xa3\xde\x65\x0f\xb6\x80\xdb\x11\xc8\xdc\x76\x24\x9f\xca\x1f\x2b\x76\x9b\xa5\xa7\x24\xfb\x21\x3e\x3b\xc8\xf3\x42\x1f\x01\xb6\x97\x60\x7f\xfe\x3a\xa6\x97\xdb\xdf\x9f\xe9\x25\x68\xed\x2f\x65\x79\xf1\x43\xf4\xa6\x4b\xac\xc2\xbf\x0c\xfc\xa3\x97\xd3\xa9\x98\xa3\x90\x4e\x05\x2c\xdc\xb4\x3c\x48\xa7\x12\x22\xfb\xbe\x1a\x51\x77\xac\x2e\x39\x77\x3e\x12\xa1\xca\x6d\x1f\xa1\x0a\x5c\xf7\xf7\x55\x52\x5b\x33\x80\x5b\x64\xe0\xf3\xd7\x5d\x82\x15\xfa\x64\x5a\x62\xa3\xb6\x5b\x67\x63\x65\x45\xc8\xa5\x72\x64\xe5\x04\x2a\xca\x46\x69\x2b\xf1\x07\xd0\xfe\xea\xd1\x05\x3a\x96\x43\xd8\x2b\x01\xf5\x30\xb7\x40\x47\x5a\xb3\x78\x80\xc8\xa5\xcf\xe0\xe3\xfa\x8c\xb0\xba\x25\x36\x47\xef\xb2\x3c\x17\x39\xa4\x67\x62\xd8\x51\x17\xb5\xa6\xdd\x5e\x7e\xc4\x53\x6e\x2f\x45\xee\x30\xc9\xe4\x3e\xbe\xa9\x6d\xfe\x60\xeb\x50\x8b\x6b\x69\x5b\x48\xc0\x36\xea\x19\x12\x91\x3f\x1e\xe0\xfe\x80\x85\x7b\x3e\xfd\x38\x9a\x8d\x2e\x10\x02\xf4\xdb\x13\xc6\x70\xf5\x27\x31\xc6\x44\xcc\x17\xe3\xcc\x0c\xb4\x38\xa0\x48\xf4\x99\x4a\x48\x77\xb4\xf2\x17\x15\x91\xcc\xf4\x9d\x62\x87\x01\xb3\x26\x72\x3f\x7b\x37\x5e\x4c\x46\xf3\xf9\x41\x9e\x98\xc8\x4c\xa6\x13\x22\x89\x19\x5d\x8d\x26\x4c\x73\x32\xbb\xa0\x22\xc7\xf1\x64\x31\xba\xbc\x1c\x9d\x2f\x6e\x86\x97\x6e\x40\xae\x47\xee\xa7\xb3\xf1\xfb\x0f\x8b\x79\x84\x15\x94\x93\x5b\xdf\x61\xe0\xb3\xb9\x1a\xde\x9a\xe1\x6c\x3c\x1f\x99\xb7\xb7\x66\x36\x1a\xce\xe9\xd2\x9a\x0d\x2f\x46\xe6\x66\x8e\x35\x9a\x37\xf3\xc5\xf4\x8a\x2a\x44\x6f\x66\x73\x22\xba\x19\x5e\x02\x55\x4d\xd0\xf1\xf1\xe4\x3d\xf4\xfa\xdd\x74\x36\x7a\x3f\x85\x81\xb9\x9d\xde\x98\xe1\xf9\x5f\x26\xd3\x4f\x97\xa3\x8b\xf7\x23\x4f\xa3\x33\x9f\xbe\x5b\x7c\x1a\xce\xc2\xe9\xe3\x59\x72\xad\x95\x4f\x22\x3f\xcb\xdc\x5c\x4c\xa1\xd0\x92\x7a\x10\x3e\xe4\xd3\xf8\xf2\xd2\xcc\x6e\x26\xe6\x66\xe2\xc6\x61\x36\xbb\xb9\x5e\xe0\x7c\x8d\x66\xb3\xe9\x0c\x08\x7a\x62\x6c\xe4\xe8\x42\x95\x68\xf6\x33\xed\x60\x6d\xe6\xfc\x10\xcb\x8e\x6e\x3a\xf2\xdc\x5c\xb8\xf1\x03\x8e\x9d\x03\xa5\xc6\xd0\x3e\xdd\x19\x5f\xae\xcb\x05\xba\xaa\x2c\x97\x2b\x75\x75\x81\xee\xe8\xaf\xa3\xab\xeb\xcb\xe1\xec\xf6\xd9\x52\x5d\xb7\x86\x81\x55\x68\xb8\xb8\x71\x43\xf3\x61\xb8\x98\x4f\x47\x1f\x47\x33\xbf\xb0\xdf\x0e\xe7\x6e\x74\x26\xaa\x84\x99\x17\x46\xf4\x74\xcd\xf3\x7c\x31\x1b\x9f\x2f\xd4\x08\x86\xa5\xcf\x6e\x31\xb9\xef\xb8\x25\x31\x7d\x07\x54\x4b\x13\x5a\x77\x6e\x81\x5d\x0e\xdd\xf0\x13\x97\x11\x0f\xa3\x2f\xd9\xd5\x03\xe4\xab\x75\x87\x17\x1f\xc7\xd4\xdc\xa7\x8b\x75\xe1\x75\xe1\x4f\xce\x81\xf1\xc8\x3f\x0b\xd7\xf8\xf0\xed\x25\x54\xe7\x8e\xe6\xa3\xd1\x04\xf7\xc6\x64\xba\x70\x4b\xd9\xcd\x17\x74\xda\xb5\x59\x8a\x92\xdf\x69\x86\x21\xa6\x6d\xc2\xc1\x1e\xfd\xf5\xfc\xf2\x66\x3e\xfe\x38\x32\xb3\xd1\xd5\xe8\xe2\x56\xd6\x72\x8c\xed\xd0\x85\xc3\x13\x99\x29\x1c\x5c\x28\xdb\xbe\x01\x0e\x22\xb7\xb0\x79\x75\x2e\xa6\xcf\x55\x51\x5f\x4e\xe7\xc0\xda\xf4\x6e\xec\xb6\x36\xff\xfe\x62\xb8\x18\xc2\x09\x25\xe3\xfa\x75\xd5\xd6\x44\x8c\x35\x1c\xcf\xf8\x78\xc1\x72\x6b\xf7\xde\x79\xec\x26\x72\x32\x85\xa9\x5a\x3c\xb7\x9c\x99\xf5\x09\x9a\x75\x3d\x9b\x9e\xdf\xcc\xe4\xc8\x9a\xdf\xbc\x25\xea\x26\xbf\x8f\x5c\xa3\x81\x0e\x6a\x34\x8f\x0f\x9d\x18\xe3\x79\xb0\xef\xdc\x80\x5d\x8c\xe6\xe3\xf7\x93\xd1\x05\xbc\xf3\x66\x0e\xc4\x55\xd3\xc9\xeb\xcb\xf1\x64\x64\x46\xff\x71\x33\xbe\x86\x77\x8e\x27\xe6\xc3\xf0\x7f\x0c\x67\x17\xd3\x9b\xb9\x19\x4d\x3e\x8e\x67\xd3\x89\xfb\xc5\x1c\x27\x68\x38\x37\xee\xa8\x14\x83\x7d\x72\x73\x7e\x39\x1a\xba\x31\x3a\x77\x6b\x0c\x6a\xeb\x87\xe3\xd9\xf9\x6c\xf8\x6e\x61\x26\xc3\x8f\x04\x87\xa1\x5d\xb8\x98\x4d\xb1\x78\xfe\x72\xfc\x6e\xf4\xfa\x7c\x36\x5e\x8c\xcf\x87\x97\xda\x09\x98\xc7\xc1\x40\xd1\x95\x72\x79\x2b\xd7\x1b\x2c\x23\xbf\x9f\x5a\x75\xe1\xc4\x5b\x15\x1e\x3b\x13\xa2\x04\x38\xff\xf0\x55\xfd\x85\x3b\xe0\xfc\x7c\x74\xbd\x98\x03\xe3\x81\xbc\x73\x3c\x61\xb2\x2f\x5e\xd6\x43\x58\x11\x50\x57\x0f\x8d\x9c\xfb\x23\xc3\x35\xe5\xb7\x6c\x15\x9f\x9c\x6e\x12\x69\x73\xcd\xc5\x73\xba\x1e\xce\x86\xef\x67\xc3\xeb\x0f\x78\x9d\x2e\x46\xb3\x2b\x33\x38\x38\xd6\x03\x73\x35\x1a\x4e\x80\x12\x4c\xbb\x61\xe3\x89\xf9\xf4\x61\x7c\xfe\x01\xef\x26\x5a\xed\x70\x4a\x05\xeb\x1f\x7e\xd2\xea\xd4\xd5\x90\x67\xc4\xe0\xa1\x7c\x79\x8b\x87\x9a\xfc\x6b\x3c\x31\xd7\x1f\x6e\xe7\xd0\x14\x2a\xed\x57\x7b\xf6\xc3\xcd\xd5\x70\x02\x8b\xe3\x77\x22\x34\x43\x5e\x89\xd0\x1a\xfa\x65\x84\x66\x7f\x82\xd1\x1d\x4f\x7c\x08\x05\xb8\xfb\x4e\xe3\x96\xcb\xfa\x6b\xe9\xca\x6e\x0f\xd1\x95\x7d\x2d\x55\xd9\x9b\x93\x5f\xc7\x50\x16\x46\xf0\x24\x35\xfa\x0b\xe9\xc9\x2e\x7b\xe8\xc9\xa8\xe2\xe8\x37\xe5\x27\xeb\xa7\x27\xfb\x53\x7c\xe6\xff\xfa\x46\x42\xd1\x5f\xc1\xff\x73\x0d\x8e\x6f\xb6\x4d\x3a\x04\x40\x30\xf4\xea\xd7\xdf\xd4\xbd\x68\xc3\xff\xd6\xb4\x40\xad\x21\x38\x8c\x31\xf9\xdd\xa9\x81\xfe\x84\x00\x1e\x0c\x85\xbd\x80\xf6\xe7\x4f\xd8\xb4\x3f\xc5\x67\xbf\x80\xf4\xe7\x10\xd1\x4f\x55\x1f\xd3\x8e\x79\x92\xe8\xe7\xf6\x77\x20\xfa\xf9\xf3\x21\x2e\x16\xf8\xed\x3f\x84\xe9\xe7\x76\x7a\x43\xde\xde\x64\x8c\x06\xf9\xe8\xe3\xe8\xd2\x59\x15\x51\x3f\x3d\xe6\x21\xf6\x1f\x7d\x90\xff\x93\xf9\xe7\xff\x38\xe6\x9f\x6f\xe6\x6a\xd5\xb1\x97\x34\xfa\xeb\xc2\xd9\x4f\x64\xcf\xb8\x59\xbe\x1c\x7e\x72\x46\xf5\x87\xf1\xdb\x31\x1b\xb1\xbe\x91\xb1\x99\x4f\xaf\x46\xe6\xdf\x6f\x66\xe3\xf9\xc5\x98\xac\x38\xf2\x9c\x87\x97\x97\xd3\x4f\xf4\x50\xf0\x5a\xd0\x8c\x0d\x7b\xe8\x97\xc6\xc1\x95\x11\x99\xf9\x14\x07\xc7\x3f\xc7\xcd\x93\x7a\x90\xb3\x9b\x82\xb1\x71\x26\x1e\xf2\x74\x99\x9b\x78\x1e\x9b\xf7\x6e\xa9\x83\x05\x68\x46\x6e\x73\xce\x47\x33\x44\x98\x9f\x9e\x9a\xab\xf1\xfc\x7c\x74\x79\x39\x9c\x8c\xa6\x37\xf4\xc3\x33\x30\x50\xa7\x13\x99\xac\x77\x62\x99\xc2\x07\x86\xb5\x59\xda\xe6\xd1\x9d\x43\xfd\x60\xce\x16\x46\x9e\x2b\x47\xa8\xc4\xa4\xee\xc8\x99\x62\x7d\x09\xa6\xe7\x92\x4d\x82\xcc\xe7\x50\x98\x78\x18\x69\x5a\xee\x1a\xae\x28\x46\x20\xbf\x5c\x4a\x41\xa2\xbd\x93\xff\xf3\x02\xcc\x4d\x49\xdc\x02\xce\x20\xea\xef\x88\xee\x44\xc0\xc5\x46\xf7\xa9\x74\x84\x90\x18\x00\x35\xb5\x7f\xdf\x65\x98\xa8\x85\x5a\x0e\xaf\x93\x4e\xe6\x56\x86\x88\xcc\x22\xc5\x2a\x8b\x1e\x01\xfd\x55\x59\xd4\x4d\xd6\xb0\x0e\x70\x92\x6e\xb2\x9a\xa3\x95\x82\xfb\x88\x8d\x9b\x0b\xf7\xff\xd1\x5f\x61\x79\x12\x9b\xc2\x60\xd1\xaa\x63\x87\x21\x80\xa4\x51\x0f\xf2\xb9\x2f\x96\x69\x14\xf5\x0f\x71\x6d\x32\x1d\xc2\xf1\xcf\x1d\x8a\x6a\xff\x78\x0a\xdc\x1e\x80\x1d\x88\xcd\xc6\xf1\x78\x92\x57\x4c\x02\x5c\xbd\x4c\x55\xe3\xfa\x72\xdf\x34\xdb\x9f\xbe\xfd\xf6\xf1\xf1\x31\x5e\xd5\xf1\xba\xde\xc5\x36\xdd\x7d\x6b\x6c\x71\x67\x73\x5b\x7c\x5b\x97\xc9\x96\x6f\xec\xfb\x66\x93\xbb\xaf\xcc\x85\x75\x43\x55\x15\xf8\xa8\xbe\x66\xe5\x0f\xca\x0e\xdc\xcc\x71\x44\x8c\x6a\x70\x9e\x8e\x5b\x52\x01\x0f\x4b\xbb\x23\xc4\x3f\xcf\x6c\x1a\x9b\xb9\xb5\x61\x32\x86\x32\xbe\xf5\xd6\xae\xb2\x75\xb6\x32\x79\x52\xdc\xed\x92\x3b\x8e\xc1\xab\x0a\x5c\xb7\xea\x74\xd6\xb0\xd3\x72\xca\x6b\x75\xca\x9e\xd7\x6a\x3a\xe7\xbe\x90\xf8\x27\x53\x37\xa9\x1b\xa7\xf8\x3e\xe2\xbf\x9e\xa9\xbf\xc7\x2b\xf5\xe3\x95\xfa\xf1\x76\xab\x7f\x01\xff\x22\x26\x20\xf8\x36\xff\x7d\xe5\xff\xfe\x3f\x73\xfb\x25\xce\xd5\xbf\xf7\xc9\x6a\x15\xef\x23\x63\xab\xaa\xac\xe0\x6b\xf4\x37\xf7\xa5\xfd\x66\x59\xe6\xf0\x57\x67\x52\xca\x83\xd2\x72\x75\x06\x73\x89\x80\x23\xf9\xd1\x36\x5d\x47\xb0\x1c\xee\x6c\xe3\x9e\xc4\x7f\x85\x26\xe7\xd8\xa1\x3c\xb5\x7f\xdf\x59\xfa\x7b\x9e\xd5\x0d\xfd\xf5\x01\x70\x6d\xf4\x8f\xda\x7d\x5f\x06\xb1\x07\x8d\xd1\x43\xc5\xe0\x56\xcb\xac\x5c\x3a\xeb\x7e\x18\x9b\x87\xa4\x30\x23\x5c\x81\xb1\xb9\xe6\x92\x1f\x55\xa6\xd0\xfb\x51\x02\x3c\xb2\x54\xd2\xd1\xf9\xb1\x39\x3b\x39\x39\x7d\x7d\x76\x72\xf2\x5d\xff\x37\x22\xf3\x1e\xd9\x88\x4c\x56\xac\xd0\xb1\x9a\xe1\x22\x99\x59\x60\x4b\x42\x00\xac\x3a\xa3\x8e\xea\x63\xa8\x6e\x1d\xfc\xcf\x03\x7f\xe2\x81\xfb\xf5\xff\x35\x29\x1b\xfb\x13\xf4\x1f\x80\xd8\x7c\x46\xf8\xd4\x02\xc2\x9d\x20\xeb\x51\xe7\xee\x9d\x39\x11\xcb\x34\xc1\x77\x6c\x5b\xf1\xa9\x0d\x57\xac\x3b\xc3\xb9\x12\x48\x55\x7d\x0f\xc0\x42\x2e\x95\x3e\xd0\x92\x2a\xf1\xd5\x7e\xf2\xb1\x75\xb9\x2b\x24\x29\x1e\xce\x54\x5b\x63\xfc\xb6\xa3\x0f\x1a\xff\xdf\xed\x73\xf3\x2d\x9e\x9b\xd7\x8a\x89\x43\x4a\xf1\xed\x66\x69\x53\x49\xc1\x67\xb5\x47\x5c\xd4\x2d\x9e\x2e\x78\x48\xdf\x72\xc0\x8f\x1d\x9e\xfe\x3f\xff\xaa\xe9\x6f\x87\x85\x30\x92\x43\x84\xeb\x9f\xdc\x81\x36\xc1\xb8\x86\xc4\xfd\xdf\xde\x9a\xf7\xa3\xc9\xf8\xe3\x78\xe8\xec\x0f\x49\x56\x74\x19\xfb\x55\x22\x25\xc8\xbf\xbc\xbd\x59\x74\x62\xa8\x2f\xce\xbf\xc0\xfb\x9e\xcb\xbf\x18\xd7\x19\x09\x99\x5c\x84\xf1\x50\xcf\xf8\x89\xb1\x97\x9e\xf0\xbe\x8f\xe9\xf7\x45\xf7\xc5\x32\x97\x30\xff\x13\x86\xf9\xd1\x33\x1d\x3f\x1c\x71\x85\x50\xae\x0e\xb7\xfe\x2c\x96\xfa\x8d\xf3\x67\x2e\x86\x8b\x21\xbc\x98\x82\xcb\x3f\xbb\xbf\xbf\xbd\x99\x8f\x61\x68\x24\xb3\x32\x9e\x4e\x8e\xcd\x87\xe9\xa7\xd1\x47\x67\x93\x0f\x6f\xe6\xa3\x0b\x18\xc3\x29\x86\x00\xd1\xb5\x0a\xcc\x65\xef\x67\x8d\x75\xd2\xa1\x9d\x4d\x80\x77\x1f\xf6\xc4\x02\xef\xeb\x58\x92\x0d\x2a\xc5\x40\x79\x87\x20\x46\xa9\x22\xc7\xde\x47\x90\xa4\xc2\x73\x7e\x40\x3c\xf8\x27\x21\xe7\x3f\xe0\x4f\xfc\xed\xfb\x77\x17\x97\xaf\x4f\xe3\xd3\xd7\x65\xf5\x1a\x74\x0c\x7f\x73\x1a\xd0\xa7\xf9\x3f\xbf\x7b\x73\x76\xfa\x63\x8b\xff\xf3\xcd\x77\x3f\xbe\xf9\x27\xff\xe7\x1f\xf1\xe7\xfd\xe4\xc6\xbc\x73\x2e\xd1\x45\x00\xf8\xec\x32\x81\x9e\x46\xe6\x2a\xa9\x56\xf7\xee\xee\x3a\x79\xd5\xb9\xce\x4e\xf0\x29\x62\x7e\xbe\x73\xf7\x34\x85\x02\xc7\xee\x12\xfb\xfe\xd4\xbc\xab\x92\xe2\x73\x9e\x15\x66\xde\x44\xe6\x5d\xb6\x6e\xee\xcd\xbb\xbc\x2c\xab\xc8\xbc\x2d\xeb\xc6\x7d\xf2\x6a\x68\x4e\xce\x4e\x4f\x4f\x5e\x9f\xbe\x39\x39\x35\x37\xf3\xe1\xab\xd1\x83\xad\xf6\x65\x01\x76\xd8\xd6\x56\x9b\xac\x69\xd8\x51\xda\xee\xdb\xa8\xce\x07\x5b\x2d\x93\x26\xdb\x70\x2d\x54\x4b\xd2\x42\x40\xad\x58\x57\x0e\x95\x91\x80\xda\x50\xc2\x43\x79\xf9\x48\xb7\xeb\x49\x6c\xae\x67\xa3\xe1\xd5\xdb\xcb\x11\x9b\x8c\x44\x18\xd3\xc3\x6d\xc3\x55\xf1\x26\x31\x9b\xa4\xd8\x25\x79\x04\xe6\xca\xb2\x2c\x3f\x47\x42\xe7\x02\xbc\xf8\x8d\x2d\x7c\x61\xed\x60\x5d\x59\x3b\x10\xd6\x40\x46\x85\xbb\x9f\xa6\xe5\xe6\x27\x40\xf7\xd4\x00\x34\xb5\x3c\x0e\x10\x8f\x84\x40\x76\xf6\x60\xf9\x93\xc1\x80\x54\x56\x0d\x49\xc6\x4a\x8b\x8a\x14\x04\xcb\xc8\xb0\xe7\xe2\xcc\x68\x2a\x4d\xa8\xea\x2a\x0b\xfd\x23\xa0\x50\x2d\x8b\x34\xa9\x32\xe7\x82\xb7\x14\x5c\xd1\x2a\xa9\xc5\xdb\x49\x76\xcd\x3d\x49\x68\x32\xf4\xab\x32\x89\x79\x4c\xa0\x86\xe4\xce\x02\x23\x66\x9a\x31\xee\xde\x66\x15\xf8\xe3\x00\x81\xcf\x11\xd6\xbb\xb4\x28\x30\x5a\xd4\x59\x0a\xe9\x83\x76\xe4\x60\xd3\x4b\x4d\x09\x03\x5d\x77\x11\x80\x59\x6d\x12\xf3\x39\x2b\x52\x37\xbe\x03\x37\x56\xb9\x5d\x37\x03\x01\xdd\x13\xd5\x56\xd2\x60\xa1\x2b\x22\xb8\x1e\xbd\x34\x96\x5f\x3c\x98\x55\x08\x41\x37\x6b\x92\x94\x80\x59\x4c\x36\x34\x95\xb1\x19\xa3\x84\x5e\x4e\x11\x5f\xf7\x6b\xb7\xe1\xde\x23\x71\x64\xcb\xf7\x56\x92\x75\xe8\x18\xbb\x16\xfa\xb5\x6b\xeb\xec\xae\x20\xf0\x24\xbc\x2f\xb0\x3e\x3f\x59\x0c\x11\xcb\xc7\xda\x05\x30\x02\x17\x23\xec\x1c\xf2\x85\xb9\xa5\x5a\x77\x1f\x19\x99\xa5\xc5\x52\xe6\xe0\xc7\xa6\xb0\x36\xad\xf1\x67\x01\x40\xfc\x27\x93\xe0\x4f\x59\x26\x98\x2c\xfc\x55\xb9\xa1\x30\x00\xbf\x0a\x21\xe3\x1c\x95\x87\xb1\xa2\x35\x5c\x7b\x58\x99\xa7\xcf\x2c\x6d\x1d\x9b\xb7\xa0\xf5\xdd\x25\x8b\x03\x67\x19\x4f\x03\xf9\x06\xbd\xe7\x67\x00\x7e\x21\x69\x17\xd0\x93\xb1\x6e\xab\xdb\x95\xbb\x24\xa7\xe5\x56\xd9\xbb\xa4\x4a\x41\x3b\x04\x18\x90\x30\x3e\xb2\x81\x02\x5d\xd8\x31\x44\xce\x84\x27\x84\x47\x31\x02\x5c\x7c\x5b\x65\x18\x80\x2f\xcb\xcf\xb1\x9b\x80\xca\xc2\x8e\x29\xd2\xf6\xf6\xc8\x8a\x55\xb6\x85\x8d\xe5\x9a\x81\xab\xea\x11\x55\x4b\xe9\x44\x81\xc0\x10\x56\x75\x49\x7d\xb2\x56\x26\x3c\x8d\x25\x32\xe9\x4d\x69\xc5\x4f\xfb\x14\xe2\xd5\x75\x1b\x87\x45\x9d\x44\x65\xf5\xb9\xcd\x48\xc8\x98\xb3\x6d\x9e\xac\x3c\x9c\xde\x4b\xfc\xde\x97\x79\x0a\x5c\xbe\x74\x74\xf0\xf8\xf6\x47\x5b\xfa\x89\x36\xe1\x18\x1d\xf0\x5d\x33\x70\xeb\x2c\x2f\x1f\x23\xec\xad\xb4\x16\x02\x6c\xbe\xc9\xae\xb1\x48\xa6\xb8\x71\x3e\x99\x38\xea\xc4\x47\x0d\xfb\x85\xb6\x09\x95\x82\x67\xc0\xf0\x4c\x24\x6d\x49\x6d\x06\xfb\x72\x37\xc0\x00\x26\x93\x5d\xda\xd4\x93\xe8\xb2\x64\xac\xec\x70\x21\x0e\x84\x71\x52\xb5\x16\xc1\xc7\x00\xc5\x4c\xc4\x1f\x18\x90\x54\xa7\xe9\x96\x50\x9d\x70\x21\x45\x7c\xfc\xb6\x4e\x2d\x42\xf3\x02\xf9\x6b\xce\x7c\x7b\xa5\xb0\xd8\x71\xac\x88\x5b\xce\x47\xf0\x9e\xd3\x4e\x03\xec\x7c\x91\x6c\x2c\xf0\x0f\xda\x22\xcd\xbe\x10\x47\x46\x55\x16\xcd\x6b\x5a\xca\x35\x53\x91\xb5\x3a\x4a\x07\x9e\xdb\x98\xc2\xce\xa3\xf1\xf0\x58\xd5\x56\x16\xba\xda\x5d\x0e\x74\x08\x7c\xe1\x49\x5f\x77\x9f\x5c\x06\xff\xfe\xa6\x36\xe5\x03\x90\xe5\xca\x2e\x3b\xc2\x8c\x14\xe3\xa7\xb1\xa5\x58\xf6\xe9\x17\x65\x41\xf1\x53\x5a\xaa\xee\x4c\x59\x23\x98\x9d\x42\xc3\x5a\xf2\xa7\xf5\x86\xd8\x1c\xbd\x2b\x2b\x63\xbf\x00\xd3\x74\xc4\x85\x61\xd2\x44\xd8\x73\x58\x2d\x93\xc8\x6d\x0d\xe4\x6a\x89\x3b\xdd\x93\x26\x5b\x01\xb5\x68\x67\xd4\x25\x06\x6a\xbf\x6c\xf3\x84\x8a\x0b\xd5\x97\xe2\x63\x58\xe6\xc1\xe0\xad\xb8\x94\x32\x91\xe3\x65\x6d\xee\xb3\xba\x29\xab\x6c\x05\xc1\x91\xa2\xa0\xa7\xcb\xe8\xf3\x48\xf1\xda\x69\x0d\x15\x1a\x16\x6b\xe4\xce\x8b\xd4\x05\x1e\x99\xed\x7d\x96\x97\x75\xb9\xbd\x77\xcf\x8e\x8c\x6d\xe0\x2f\x48\x26\x95\x67\x00\x12\x30\xdb\xb2\x46\x36\x47\x3c\x04\x69\x75\x6f\x24\x3e\x36\x18\x17\x0f\x49\x95\x25\x45\x23\x49\xce\x01\x84\x32\x56\xb6\x82\xe8\x6d\x67\x5c\xf8\x50\x83\xb2\x7d\x2c\xf3\xc5\xeb\xc8\xb5\x1a\xd8\x8b\xf0\x52\xc7\x22\xf0\x72\x6d\xba\x6f\x88\x5a\xf8\x57\x4c\x8c\x27\x7b\x75\x39\xe8\xf9\x6b\x31\xbd\x74\x0a\x7d\xa1\x1f\x80\x3f\x30\x0b\xfb\xa5\x69\x75\xa0\xbe\x2f\xab\xc6\x6c\x93\xba\x86\xbc\x03\xe4\x77\xbf\x28\x01\xb5\x3c\xab\xb9\xe1\xef\x60\x37\xa9\x27\xb9\xb1\x7c\x9b\xac\x3e\xeb\x9f\xfd\xc6\x8d\x1f\x9a\xc1\xc2\x1d\x0c\xdb\xa4\x72\x67\x65\x10\x2b\x6f\x1f\x55\x66\x93\xac\xee\xb3\xc2\xbe\xae\x6c\x92\x42\x02\xc2\x7d\x3a\xf2\x75\xde\x18\xc6\x4a\x0c\xd6\x8f\xd3\x44\x71\x50\x5a\x78\x0a\x14\x55\x00\xe5\x08\xc8\x52\xc1\xa3\x36\xa2\xef\x49\x8a\x81\x6e\x80\x87\xcc\x3e\x12\xbd\xba\xb3\xea\x6c\xea\xf7\x27\x44\x72\x9b\x2a\x71\x37\xc8\xba\xac\x1e\xdd\x75\x4b\x07\x0c\x3c\x3b\x5b\xe1\xa0\xbb\xef\x95\x78\xa4\x1c\xad\x21\xa0\x0e\x73\x02\x5c\xef\xc0\xb4\xb9\x36\xdb\xec\x8b\xcd\xeb\x63\xf9\xde\x36\xc9\xb0\x3e\xc5\x59\x1c\xfe\x9b\x69\x95\x3c\x66\xc5\x5d\x7d\x8c\xe5\x43\x1d\x36\x4d\xfa\x3d\xbd\x31\xf2\xd5\x8f\x59\x6d\x6a\x4e\xdf\x40\x13\x8a\xed\x0e\x0f\x32\x0c\x3c\x56\xb4\xef\x0c\xcb\xc0\x8b\x00\x21\x9f\xdf\x44\x2f\x9c\x18\xb7\xac\x2d\xf2\xdc\xe0\xf7\x5e\xf8\xe8\xd8\x0c\x71\x9a\xc1\x9c\x45\xfa\x12\x0f\x68\x57\xab\x01\xb3\x2e\xc1\x64\x6e\x92\xea\xf3\x6e\xeb\x6b\x2e\xbc\x25\xe8\xa6\xf2\x11\x22\x9c\x15\x54\xf7\x97\xbb\x2a\xb9\xb3\xba\xb0\x41\xdf\x4a\xee\xe2\x77\xab\xc8\xf5\x94\x0c\x2d\xf5\x62\x69\xa1\xd6\x6b\x0d\xd7\x69\xe6\xd6\x05\x94\xbb\x0d\xa6\xdb\xe4\xef\x3b\x8b\x37\xef\x08\xcf\x61\xb2\xb4\xfc\x60\xc0\xe8\xb8\x41\xd1\xdd\x23\x07\x8e\xcb\xd9\xf1\x98\x1d\xce\xcf\xc7\x63\xef\xc5\x40\x7f\x23\xb7\xf5\xb2\x62\x5d\xd2\x98\xe2\x03\x23\x73\x99\x2c\xec\x5f\x5b\x3f\x9b\xbf\xbf\xba\x74\x63\xf0\xd7\xab\x4b\x03\xf5\x09\xee\xfa\x86\x85\x1d\x2c\x90\x8b\xc5\x05\x65\x20\x9a\xc4\x9d\x6f\xe9\xeb\x55\x09\xbc\x0b\xc0\xa3\x09\xcc\x0d\xe6\xc3\xe2\xea\x32\x34\xc9\xef\x77\x9b\xa4\x08\x06\x32\x36\xd8\x7d\xe9\x24\xf7\xe6\xba\xac\x9b\x39\x94\x4a\x45\xe6\xfa\xe2\x5d\x58\xa7\xc7\x1f\xc6\x1b\x0f\xf7\x97\x9b\x0e\xbd\xbb\xa0\x0a\x64\xb9\x0f\xbe\xf7\x58\x56\x29\xf3\x11\x43\xde\x55\xf7\x16\xcc\x4e\x29\x78\xba\x58\x5c\xb0\xe5\x41\x5f\xc0\xc2\x75\x10\x58\x20\x69\x37\xc5\x6d\xcf\x03\xe3\x55\x01\xf8\xb0\xf1\x6a\x11\x30\x1e\x54\x5a\x4a\xda\x11\x1b\xdb\x6e\x13\x34\xa3\xdc\x35\x6e\x4e\x3c\xf7\x6a\x91\xef\xfd\x59\xbd\x70\x57\x87\xb9\x4e\xee\x98\xfe\x38\xa2\x62\x31\x6d\x6c\x23\x13\x1b\xdc\x32\x66\xeb\x56\x72\xd6\xd4\x36\x5f\x13\x81\x31\x18\x8f\xeb\xd2\x79\xf2\xc0\xfb\x8f\x39\x65\xea\x99\xb5\xc4\x1b\xe5\x8c\xd9\xc8\x5d\x9d\xd9\x12\xfd\x59\x2b\x75\xad\x6d\x32\x31\xa8\xee\xac\xa9\xd2\x86\xca\x56\xc2\x06\x20\x9d\x2c\xda\xf5\x59\x21\x53\x48\x25\x24\x58\xf2\x02\xde\x19\x78\x20\xbe\xdd\x09\xb6\x36\xea\xe9\xb7\xcf\x78\x14\x58\xbd\x62\xcd\xa6\xac\x1b\xc5\xd9\x84\x8d\x41\xea\x75\xbc\x14\x5c\x03\xbe\xa9\xf1\x05\x6e\x51\xd9\x95\x15\x4f\x6b\x69\xef\xb2\x02\x4c\x58\x06\xed\x95\xa9\xaa\xc6\xfc\x82\x65\x75\x67\xb1\xf9\x38\x9a\xbd\x1d\x2e\xc6\x57\xe6\x7c\x7a\x7d\x3b\x9e\xbc\x7f\xa5\xab\x75\x7b\x62\x2e\xe1\xad\x46\xb6\x90\x4d\xb3\xdd\xe6\xa5\xa1\x85\x76\x0d\x7b\x58\xdf\x1e\xfa\x20\x94\x74\xf2\x4b\x91\xdd\x63\xba\x72\xc9\x39\x69\x0e\xb8\x42\x41\x63\x91\x9f\x45\x16\x6d\x40\xa3\xa3\xae\x05\xd0\xf7\x4b\x53\x53\x94\x52\x79\x5c\x20\x03\x9a\x9b\xe1\xa4\xa9\x4b\xfb\x60\x09\x24\xd7\x13\x1c\x0a\x39\xe1\x20\xe5\x65\x57\xf7\x05\x98\x60\x1b\x9b\xd4\x3b\x5a\x5b\xe5\x12\xdd\x3f\xc5\xbe\xc8\xf0\x39\x98\x44\x50\x96\xac\xd8\xb9\xd8\xab\x99\xa4\xb3\x12\x93\xf3\x9f\x2d\x9d\xf2\x42\x49\x27\x64\x0f\xa2\x9c\x0e\x62\x15\x70\xb5\xda\xa2\x16\x32\x19\xfb\x05\xa9\xc2\x10\x96\x01\xcf\xec\x2b\x46\x4f\x4c\x0e\x7c\x15\xb6\x28\x77\x77\xf7\x54\x25\x88\x34\xf3\xbe\x19\x42\xc8\x81\xfb\x90\x9a\x29\xc3\xe6\x6c\x2f\xa9\x5b\xd5\x0b\x0c\xbe\x93\x5b\xf0\x00\x70\x1a\xbc\x43\x09\xb1\x02\xf5\x10\xe0\x2c\x4b\x05\x6c\x57\xa4\xd2\x41\x39\xd3\x89\xd8\x93\x7b\x03\xbc\x8b\x31\x2f\x6c\x33\x9e\x98\xff\xb8\x19\x4e\x16\xe3\xc5\x2d\x15\x32\xbb\x07\x70\xc1\x25\x1f\x38\x3a\x94\xa8\x16\x0f\xf6\x1b\xd9\xd6\x99\x8a\xf9\xf4\xe4\xc4\x2f\x4c\xe5\xf9\xb4\xd6\xa8\x9c\x28\x81\xe9\x28\xe3\x66\x0b\xa0\xdf\xd1\x53\x0b\xb0\x8a\x07\x70\x90\xf1\x56\xa8\xaa\x7d\x84\x75\x6d\x64\x62\xc9\x41\x06\x8c\x4e\xa0\x9c\xa3\x9e\xfe\x53\x9f\xfd\x8a\x87\x18\xb8\x89\xf8\x74\x6c\x7b\xdb\xa8\xe5\x0f\x2e\x93\xd5\x67\xfc\x5c\x6c\xde\x96\x20\xb1\x01\x2d\xf2\x73\xdd\xd3\x1e\x2e\x4e\xdf\x93\x4a\x66\xe8\x40\x7a\x95\x1f\x5e\x6e\x8b\xb0\x45\xf8\x70\xb2\x60\xb1\xb9\x3b\xd7\x3f\x38\x2c\xa5\xb0\xd9\xdd\x32\x32\x41\xf8\x3b\xfb\x77\xd4\x25\x55\xa7\x65\x91\x9a\x87\x0c\xa2\x87\x71\xc0\x40\x13\x72\x1a\x70\x6f\xa9\x73\x99\xe7\x43\x8c\x21\x85\x2b\xa4\xe8\xcc\xcb\xa7\x62\x50\xfe\x7b\xe0\x32\xe4\xa5\x33\x30\x6a\xac\xf7\xe6\x10\xa9\x6a\x63\x7b\x45\x81\xc5\x91\x34\x59\x8d\x0c\x5f\xb5\x5e\xec\x11\x5b\x02\x0d\xe5\x96\x93\x3a\x08\x76\xef\xa9\xf8\x10\x3b\x43\x15\xf4\x35\xd7\xe7\x2b\x92\x82\x14\xce\x7a\xbc\x89\xe5\x74\x76\x23\x4d\x12\x4b\xe6\xa1\xcc\x77\x9b\xac\x28\x77\x70\x28\xad\xb3\xc6\x2f\xad\xbd\xcf\xdc\x83\xf5\xea\xa6\x23\xab\xea\xc6\x94\x05\x0c\x84\x73\x96\xcc\x51\x52\x9b\x0d\x6a\x08\xc0\xb7\x3d\x01\xd6\x31\x8f\x6d\x82\x6c\x74\x6a\xcd\xf9\xd2\x5e\x68\x29\x3c\xd2\x5d\xb7\xe9\xdf\x12\x60\x35\x87\x3b\x3c\xee\xd9\xa4\xc1\x51\xc7\xe6\xd6\xd7\xee\x58\xbf\xf3\x70\x40\x3c\x57\x5d\xc7\xa9\x6a\x99\xa8\x7b\x20\xf9\xa0\x15\x01\x38\x37\xdf\x04\x24\xa2\x87\x43\x0a\xc3\xaf\xfd\x9f\x52\x26\xe8\x6b\x77\x30\x13\x83\x02\x6b\x76\xbc\x2e\x6c\x03\x31\x28\xe1\x6f\x52\xc1\xa8\x84\x82\xcb\x4d\x4f\xc3\x5a\xbd\x8f\x30\x3c\x5b\xae\x51\xf9\x4c\xd6\x7b\xa4\xcc\x42\xf6\xf5\xe8\x95\xaf\xd1\x44\xa6\x20\x1b\x94\xc4\x43\xfb\x00\x0c\x57\x3e\x16\x79\x09\x46\x69\x59\xec\x37\xe5\xae\x76\xfb\xbe\xf1\x2a\x05\x46\x7f\xf9\x35\x1b\xd2\xfc\x68\xb7\x2f\x9b\x72\x55\xe6\xfe\x86\x61\x2c\x48\x4e\xc1\x91\x2d\xa6\x8e\x64\x6e\x80\xa5\x4e\xb1\xa9\x6d\xab\x5d\x8a\xcc\x95\x76\x5b\x03\x8b\x3e\xd4\x12\xa3\x9d\x13\xb2\x08\x96\xeb\xd6\xca\xc8\x0a\xf3\xf7\x5d\x42\xfc\xfb\xc0\x0d\x4c\x5c\x1e\x6c\x7c\x74\x46\x13\x6a\x2d\xa8\x90\xa0\xb9\xdf\xf1\x50\xc0\x54\x71\xcc\x1a\xaf\x23\x99\xa7\x5d\xd1\x64\xb9\xfb\xa5\x73\xf2\x61\x8f\x98\xbd\xb3\xe4\x3c\x49\x20\xa8\xc5\x41\x9d\x7e\xfb\x8a\x2d\x82\x15\x72\xa4\x71\x90\xcd\x7d\x05\xf7\x2e\xd4\x4d\x27\x77\x08\xf4\x73\x5b\x1e\xa8\x15\xaa\xfa\x58\x8a\xe0\xad\xd7\xbb\xf1\xc1\x52\xdc\x44\x0d\x53\x3f\x5a\x0c\x70\x2c\x77\x0d\xb1\x8b\xb0\xfc\x89\x58\x3e\x44\x81\xa8\xb2\x3a\xdd\x9d\x05\x62\x1b\x4b\xbb\x46\xda\x29\x3f\xf6\x6e\x89\x16\x7b\xb2\x17\xda\x86\x02\x8c\xfc\x5d\x86\x47\xe2\xc6\xad\xe5\x7b\xb0\x65\x9b\x92\xcd\x41\x78\x3f\x11\x87\x98\xdd\x36\x85\xf1\x6d\x15\x6f\x5f\x68\x5d\xa6\xef\x62\x73\x35\xbd\x18\xbf\xe3\x8a\xb0\xe7\x4c\x57\x56\x0d\xf2\xa1\xe0\x4e\xd7\xbc\xf9\xa1\x2c\x0f\xe7\xc0\x4a\x45\x02\x8a\xfc\xb1\x19\x12\x5a\xb2\xae\x03\xac\x79\xd3\x08\x2d\xa4\x7a\x1d\xa3\xf3\xed\x2a\xab\x81\x60\x2d\x30\x7d\x25\x10\xd8\xf9\xde\x9a\xea\xcd\xe1\xbc\x2c\xbb\x97\x49\x84\xab\x14\x0d\x8f\xa0\xc0\x80\x35\x59\x02\x8f\x9f\xbe\xdd\x79\x0d\xd0\x64\xa0\x79\xbb\x2d\xeb\xda\xba\xff\x29\xd0\x66\x86\x1c\x39\x7c\x43\xaa\xdd\x9a\x96\x74\x85\x41\xf4\x56\x30\x62\xed\x17\xb0\x1e\xc3\x30\x36\x37\xb5\x24\xd0\xbc\x2f\x64\x8e\x5c\x53\x83\x2b\x19\xc2\xb8\x49\xb1\x3f\x36\x09\xdd\xa3\x48\x5f\xb1\x12\x72\xac\xa4\xe9\x8e\x06\x94\x39\xe1\xaf\xc9\x44\x17\x75\x25\x61\xd1\x20\xa6\x05\xbc\xe1\x38\x5a\x5c\x59\xd4\xa7\x4c\x8a\x7d\x84\x44\x78\xb5\x92\x79\xfb\x00\xf1\xdb\xfd\xa1\xf0\xfa\xb1\xb7\x34\xf8\x78\x03\x23\x16\xdb\x4d\x39\xa4\xb0\x19\x1c\xa4\x16\x42\xc4\x96\xb1\xe4\xc9\x2d\x60\xef\x50\x4e\x1c\x10\xc2\x5c\xb8\xf2\x36\x36\x97\x19\x9c\x38\xad\xd1\x04\xab\x84\xf6\x70\x14\x70\xc5\x6d\x6d\x55\x93\xec\x1e\x4b\xb0\x74\xd2\xad\xf4\x45\x95\x08\xd8\xb4\x18\x35\x7b\xa7\xd8\x6d\xf3\x3b\x4c\xa2\xe1\x56\xe6\x03\x71\xed\xb6\x3e\xa7\x14\x38\x43\x76\xf0\x88\x39\x22\x0a\xa0\xac\xa9\xbb\x9f\x86\xc9\xca\x1a\xb8\xa3\x20\x97\x47\xc2\x28\x0f\x56\x58\xd8\xcf\x63\x33\x87\xab\x38\x18\x15\x70\xc2\xdb\x84\x0d\x6d\xf3\xb4\xa7\x4b\x6d\x43\x96\xdf\x72\x11\x9b\x6b\x36\xf4\xc8\x10\xef\xfa\xae\xbd\x47\x97\x31\x66\x14\x9b\x61\x9a\x12\x23\xa9\xb0\xad\xb6\xbf\x0e\x73\x01\x87\x7f\x2b\x93\xc4\xb6\x12\x1d\xf7\xa5\x78\x8a\xc1\xcb\xf9\x65\xef\xdc\xce\x05\x33\x27\x32\xd9\xc6\xf9\xeb\x09\x70\x9f\xf9\xdb\xa9\xcf\xe7\x6e\x7b\x32\x77\x99\x68\xdd\x91\x99\xe0\x97\x23\xa7\x9a\x9f\x38\xf7\x0e\xa6\x09\x25\x90\x0e\xc0\xd3\xfa\xbe\x7c\x14\xba\xd3\x61\x9a\xda\x22\xdd\x6d\x30\x71\x28\x8c\x39\x6a\xe0\x39\x1b\xd4\x6a\xab\x78\x0f\xc4\x5b\xdb\x97\x7d\x20\xf8\x04\x59\xca\xda\x09\x42\xae\x1c\x6a\xc3\x41\xd7\x8e\x9b\xf3\x41\x46\x17\x15\x1e\x80\x13\x0f\x7d\xc9\x0e\xcb\xbc\x10\xc4\xa8\x2e\x34\x5e\x24\x17\x37\x24\x04\x53\xe9\xb4\x19\x50\x8a\xb3\x91\x48\x0f\x30\x9b\xa7\x48\xb3\xdb\x80\xf4\x53\x63\x37\x60\x90\xc0\x15\xcc\x3b\x4e\x5c\x8f\x08\x2c\x91\x08\x48\x84\x64\x0b\x85\x58\x8d\x43\x37\x42\xc2\x43\xd1\x39\x5d\x62\xf2\x34\x2a\x4a\xcf\x3f\xd1\x81\xf6\x38\x46\x42\x8b\x53\x58\x69\x76\xa7\xb5\x4f\xb7\xd4\xbb\x51\xaa\x85\x6e\x8c\xf4\xf9\x07\x35\x89\x09\x6e\x32\x18\x23\xa2\x57\xe1\xf7\xf5\x75\x97\xec\x3a\x6a\xb2\x9c\xd7\xac\xf2\xcb\xd3\xf7\xef\xad\xe9\x6b\xdb\xed\x7c\x6f\x45\xfd\x4b\x09\xb6\x35\xed\x21\x6f\x66\x27\x2f\xb0\xeb\xb1\x6a\xe0\xb3\x7d\x64\xe6\xee\xf6\x9b\x0f\x2c\x5e\x7c\x63\xe7\x16\xcc\x1a\xd0\x47\x5e\x42\x62\xca\x79\xbd\x0b\xb8\xc7\x49\xae\x81\xa0\x01\xf4\x28\x3f\xa1\x34\xd7\xaa\xc0\x63\xe3\x56\x62\xa7\x2d\x14\xcc\xf5\xe8\x03\xf7\x2e\x05\xab\x90\xcb\xc1\x1d\x70\x6e\xda\x6b\xb6\x2b\xc3\x30\x23\xc5\x7b\xcb\xea\xb9\xfb\xd2\x73\x41\x82\x2f\xca\x20\x83\x43\x77\xe7\x5f\xd0\xa0\x29\xf6\x3d\xab\x77\xb8\x12\xce\x67\x40\xf3\x00\xdd\xd1\xe0\xc2\xa6\xa2\x9b\x19\x85\x6e\x3e\x3d\xe2\x9b\x60\x9f\x6e\x83\x63\xca\x6f\x73\xbe\x2e\xbc\x9e\x26\xf2\x8b\x15\xa8\xa5\xe9\xbc\x46\x09\xf7\xf9\x9a\xe0\xa4\xd5\x26\x0e\xeb\xa7\xbe\x55\x34\xfb\x4d\x28\xfb\x79\xd9\x73\x53\xf5\x9c\x87\x9d\xd5\xe6\xcf\x32\x6c\x7f\x56\x91\x32\x77\xa1\x7f\x02\xf9\x5f\x2f\xba\x8d\xa6\xbf\xa8\xfa\xba\xf3\xf5\x21\xc9\x39\x04\xeb\x1c\x0f\x05\xf3\xd2\xa2\x98\x3c\x38\xf4\x40\x6a\xfb\x55\x6c\x2e\x40\x74\xfb\xc0\x44\x8d\x8a\xb4\xac\x6a\x9a\x24\xa2\xd8\x4b\xe4\x73\x1c\x89\xed\xe1\xd8\x6b\x6f\x7f\x7e\xe1\x24\x36\x17\x25\x39\x48\x64\xbb\x15\x7b\x63\xbf\x20\x6f\x9a\x9f\xc2\xba\xf5\x6e\x12\x5f\x59\x95\xc5\x3a\xcf\x56\x10\x1d\xd7\xa1\xab\x62\xdf\x1d\x72\x1d\xb2\xe9\x9c\x46\x22\x87\x07\x9a\xa2\x3d\xf8\x0e\x44\x64\x20\x0c\x64\xc5\x4c\xdc\x7f\xdf\x25\x79\xb6\x86\x80\x4c\x4f\xc6\x5e\xa1\x2d\xdc\xa1\x2d\x71\x30\x02\xb0\x08\xf1\x95\x5f\x02\x12\x46\x6e\xd0\x0e\x41\x57\xdd\x67\xfa\x7b\x58\x1b\x6b\xa5\xf9\x9e\x38\x53\x91\x7a\x0d\x92\xdf\xe0\x2b\x64\xee\x5c\x4f\xd3\x60\x01\xb1\x29\x93\x83\x35\xdb\x7b\x5f\x1f\x98\xb8\xee\xc5\x4c\xc7\x18\x3d\x98\xd9\x09\x43\xd7\x01\xe8\x29\x91\x07\xbf\xbb\xee\x74\xc8\x30\x79\x6e\xd1\x29\x3f\x50\x09\x6c\x0a\x98\xc5\xb9\xdb\x56\x7d\xde\x75\x6e\xef\x8b\x55\xd4\x8c\x2f\xf7\x90\x4a\x76\x27\x34\x10\xe6\xd9\xfa\xf5\xeb\xb5\xc6\xb4\x88\x70\x07\x3c\x64\x6b\x21\xfa\xf7\x90\xd9\x47\xc3\x84\xc6\x92\x47\x92\xc4\x30\x98\x97\x0f\x24\xfb\x5d\x98\xb2\xba\x4b\x0a\xae\xa1\x24\xcb\x16\xef\x5a\xa8\x44\x7b\x08\x94\x3f\x81\x56\x96\xc3\x39\x3d\x03\x43\x60\x0a\xf7\xb9\xdd\x16\x23\x88\x88\xa3\x4c\x31\x07\xd7\x09\x44\x93\xf5\xd2\xfd\xe2\xd9\xf7\xfa\x6b\xad\xa8\xb4\x68\x29\x5b\x04\x74\xea\x65\xa2\xcd\xb6\x43\x1b\xdb\x4c\x91\xea\xda\xea\xf7\xb6\x9b\x66\xd0\xf9\x84\xdf\xb5\xde\xcf\xf7\x21\x06\xd3\x96\x7b\x04\x33\x51\x68\x06\xd8\xbb\xf9\x40\x26\x5c\xea\x31\xae\xae\xc2\xb2\xc2\x22\x6f\x72\x6f\xb7\x10\x4f\x9f\xd7\xbc\xa4\xc8\x2c\x43\x04\x74\x12\x04\x22\xa7\x7c\x79\xe7\x7b\xdf\x8e\x3d\x32\x01\xb8\x99\xf5\xad\x50\xba\xed\xf4\x04\xd2\xd2\xdc\x13\x5b\x74\xb2\x82\x83\x4c\xd3\x7b\x47\x41\xb1\x27\xda\x4c\xb0\x39\x7e\x86\xe5\xcb\xbf\xac\x2c\x98\x04\x78\x07\xe7\x30\x5c\xce\xb5\x04\x64\x54\xb6\xca\x1a\xed\x10\xc8\x59\x22\x56\x87\xbf\xac\x11\x73\x93\xb2\x70\x2a\x3d\x4a\xf2\xc2\xb8\x1e\x49\x14\xc0\x7f\xed\xa8\x3e\xee\xd8\x7f\x94\x6e\x6d\x11\x1b\x62\xa4\xa9\xd7\x3b\xc9\x90\x80\xbe\x56\x26\x18\x6b\xb4\xe3\xf9\x4d\xe4\x1e\x54\xe5\xb9\xd7\x5b\x97\x69\x24\x7a\x6f\x8e\xef\x63\x73\x3e\xbd\x7a\x3b\x06\xc2\x9b\x8b\xe9\xf9\x0d\xf0\xf0\x84\x41\x29\x10\x35\x6f\x45\xd3\x3c\xc7\x31\x63\x6c\x9f\xc4\x0a\x45\x1d\x6f\x0a\xf6\x2b\x5e\x6b\x7c\x50\x7d\x87\x01\x2a\x05\x9c\xf6\xb1\xb4\xba\x2f\x6c\xc5\x41\xf0\x8c\x83\x2f\x5e\x1b\x4d\xb1\xf1\xf6\x9b\x0c\xea\x03\x62\x97\x49\x57\x22\xa5\x78\xc7\xd6\x2b\xe1\xa9\xe1\x8b\x49\x7d\xe0\xa9\x70\x42\xd2\x88\xa5\x68\x42\x66\x68\xe2\xf7\x38\x61\x0b\x69\x33\x7f\xb6\xb0\x0c\x9c\xe0\xeb\xce\xed\xc6\x3e\x8f\x2c\x22\x22\xdd\xbc\xc9\xb6\xb9\xa5\x14\xd6\x2a\xc9\xfb\xda\x45\xe7\x00\x6d\x03\x66\xdb\x65\x26\x69\xf7\x74\xe5\x17\x01\x3e\x99\x1f\xdb\xf3\x30\x0f\xfc\x73\x7b\x14\x62\x12\x6e\xaf\x79\xf6\x72\xc6\x5d\x45\x98\xe8\x0d\x72\x49\x60\x22\x02\xf6\x81\xe7\x7c\x57\x64\x7f\xdf\xc1\xbe\x4f\xd2\x94\x3c\x41\x75\x66\xa2\x28\xb4\x41\xe7\xc2\xdd\x8e\x75\xd4\x89\x85\xc8\xf4\x11\xa0\x9f\x77\x48\x10\x90\xe2\xf7\x65\x6b\x56\x5c\x76\x37\x54\x0e\xfc\xa6\xd4\x06\xe2\x92\x35\x57\xdc\x6c\xe8\x61\x92\xfe\x6d\x57\x37\x1a\x2e\x1a\x5e\xbc\xbc\xf8\x9e\x37\x00\x5a\xbe\xbe\x58\xca\x6a\x01\xa0\x65\xd5\x59\xcd\x2a\x68\xc9\xbb\x51\x59\x95\xf5\x13\xde\x2b\x5f\xcc\x7d\x4b\x9c\xd1\x42\xe0\xd0\x1e\xf4\x83\x7f\xf6\x8e\xdb\x33\xef\xee\xf8\x1e\x74\x6d\xf6\x7f\x5a\xfb\x24\x4a\x21\x23\x25\xa3\x39\xcf\xfb\xbe\xa4\x0d\x18\xac\x15\xfe\xc1\x9d\x5f\xc0\x74\xc9\x24\xc6\xbd\x87\x18\x95\xbd\xac\x4a\xd0\x99\xa2\x14\x55\x4d\xb6\x71\x5f\x92\xf3\xab\xce\x36\x8c\xc8\xf8\x4b\x46\xa9\x5a\xb7\x8a\x7c\x54\xad\x83\x9e\x1e\xff\x9e\xee\xde\x14\x10\x5b\xdb\x13\xf0\x9d\xe9\x3b\x1b\x15\xa8\xa1\xda\xe5\x3d\x4d\x70\xa7\x6c\x27\x3d\xdb\x72\xe3\x7c\xbb\x08\x78\xd2\x93\xbb\xe5\x21\xb6\x5f\x50\x17\x5a\x1a\x2f\xb5\x28\x70\xa7\x32\x49\xbd\x6a\x74\x2b\xd3\x91\x35\x6a\xe0\x94\xca\x62\xaf\x90\x04\x1e\xff\x44\x68\xd5\x2b\x8c\x08\x20\xf5\x06\x39\xc2\x5d\xc3\x94\x8c\x1a\xc5\xda\x79\x84\x5a\x22\x2c\x9d\x6e\x2a\xf0\x71\xdf\x80\x21\x3e\x5d\x07\x4a\x7f\x8c\xcd\xf0\xfd\xfb\xd9\x88\xd8\x01\x3f\x8d\x17\x1f\xcc\x78\x72\x31\xba\x1e\x4d\x2e\x80\x31\x71\x3a\xfb\xcb\x1c\xd1\xb3\x5a\x86\xbe\xbd\x0e\xdd\x65\xde\xd4\xaa\xd6\xa7\x0e\x24\x3f\x2d\x28\xf9\x5b\x72\x6b\x53\xeb\x3c\x2a\x34\x2e\x78\xd2\x18\xef\x15\x51\x72\xd7\xdd\x8b\x98\x3c\xb7\x6c\x24\x97\x80\xb2\xd4\x29\x6a\xf0\x3f\x09\x1b\xe5\x45\x34\x9c\xa9\xf7\x78\x5f\xc2\x9a\xdc\x15\xf4\x83\xe7\x32\x53\x6a\xbe\x8a\x32\xe8\xaa\x0f\xdc\x66\x35\xd2\xab\x28\xe1\x01\xf5\x41\xf1\x8c\xf5\x97\x3d\x76\x33\x29\xcc\x20\xb9\xbb\x73\xf3\xd3\xd8\x01\xe3\x5a\xd4\x7c\xfa\x0e\x00\xff\x74\x10\x77\xae\x6d\xbe\x7e\x4d\xf7\x2c\x9d\xbf\x35\xa6\xa4\xf0\x65\x5a\x32\xc2\xf7\xc8\x8d\x21\x31\x78\x61\x6f\xb3\x4a\x10\xe3\xea\xab\x9c\x9b\xd9\x4b\xf8\x40\x15\x63\x1d\xaa\xde\x0a\xa2\xed\x63\xa5\x25\x80\xf6\xbc\xd2\x70\x50\xe9\x3d\xf3\x06\x40\xd1\x5e\x75\xb3\xe1\xbc\x56\x3f\xc6\x80\x22\x8c\x3d\x85\x06\x3e\x2d\xe1\xae\x84\xbf\xef\x92\xaa\xf1\x21\x2a\x77\x08\x3b\xf3\x80\x47\x3b\x6a\x47\x99\xb5\x4b\x13\x46\xe2\xca\x10\x19\x54\xef\xaa\x0a\x08\x12\xc0\xd0\xe9\x98\x95\x74\xba\xc9\x8b\x62\x33\x15\x70\x31\x0c\x28\x82\x79\x10\xe5\xe8\x1f\x9d\xe0\x33\xdd\x57\x71\x9d\xfa\x07\x00\xa1\x61\x6c\x16\xb3\xe1\x64\x8e\xa2\x10\x60\x7d\x29\x3c\x34\xea\xf3\x73\x74\xc7\xd7\xe0\xe9\xf4\x45\x64\xea\x52\x5c\x0a\x8d\x2d\xf4\xcf\xe9\xa6\x84\x7a\x72\x08\x62\xed\xc6\x66\x06\x77\x86\x5b\x3b\x07\x0d\x2d\xfd\x70\xc1\x64\x01\x24\x3e\xc9\xfb\xfc\x96\xac\xea\x14\x43\xd5\x51\xe0\x0d\x89\x56\x5b\xab\xdd\x3a\x22\xd2\x6f\xc4\x70\x0e\x55\xb6\x11\x1b\x15\x2d\x92\xff\xba\xcf\x70\x8c\xbb\x3a\xae\x01\x24\xbd\x7d\x7c\x77\x6f\xb4\x96\xd2\x9c\x7a\xff\xa8\xb8\x03\xa4\xcd\x01\x7e\x7a\x88\x97\xae\x92\x9a\x0e\xbd\x34\xab\x85\xe0\x4e\x88\xa2\x60\x8a\x54\x73\x18\x21\xf7\xd2\x77\x44\x4f\x7f\x1a\xb0\x19\xce\xa5\x4c\xb2\x1c\x99\xeb\x62\xcd\xb0\xf9\xaa\xa5\xa0\x82\xd0\x1c\x96\xfe\xf6\x74\x95\x51\x0b\x4c\x14\xac\x35\xaf\x8e\x47\x9c\x3f\x88\x2d\xc3\x51\x5c\x8b\x16\x66\x38\x32\x43\x89\x27\x29\x9d\xa4\x43\xaf\x7f\xea\xed\x59\x6d\x1e\xca\x8c\xbc\x25\xe8\x6e\x48\xf6\xe9\x49\x40\xc1\x47\x3a\x48\x82\xa5\xb0\xa0\x14\x4d\x02\x25\x46\x40\x26\x8b\x1c\x23\xa3\x33\x4a\x7e\x10\x29\xbb\x02\x48\xa7\xcb\xab\x05\xcd\x11\x7c\x33\xee\x12\x4f\x00\xca\x0d\x4b\xdd\x06\x67\x40\x1c\x29\x76\x57\x94\x66\x66\x76\x4e\x48\xce\x79\xf6\x28\x62\x31\x8b\xcd\xbb\x1b\xa0\xd7\x9e\x8d\x3e\x8e\x95\x9a\x86\x67\x69\x65\x77\xef\x50\xfd\x79\x20\xa3\x51\x58\x28\x36\x44\x2d\x8d\xb6\x80\xc6\xd3\xb5\xf0\x7d\xba\x1a\x70\x83\x06\x5a\x1c\x2c\xae\xc1\xba\x07\xce\x07\xdf\x66\x55\x26\x2e\x0e\xa3\x19\x1f\x38\x99\xbc\xdc\x35\x9a\x74\x07\xb9\x2b\x89\x92\x95\x8a\x18\xe1\x15\xdb\xaa\x5c\xe6\x16\x0b\x5d\x56\x65\xb1\xb2\x55\x51\x23\xdf\x94\xa2\xca\xba\x2b\x76\x71\x59\xdd\x7d\xcb\xe5\xc3\xdf\x62\xe9\x85\x96\xff\x68\xb1\x6d\x65\xf5\x0b\x85\x40\x3a\x11\x2b\xaa\x1e\xe2\x38\x73\xa0\xe9\x81\xdf\x79\x42\xd7\x62\x40\xf5\xb8\xc0\x38\xc1\x9f\x1a\x68\xac\x76\x46\xb1\x66\x5e\x58\x1c\x68\x86\x9a\x1a\x46\xf7\xfb\xe3\x9f\x02\xd9\x8c\xd1\x61\x8d\x7d\xf6\x51\xa9\xad\xa9\x96\x00\xa6\xe0\x4d\xd0\x04\xfc\x78\x8f\x70\xc9\x91\xd8\x6a\x69\x95\xac\x9b\x63\x8e\xa7\x1d\x5a\x76\xdd\xf1\x12\x83\x09\x1b\xb3\x77\x06\x63\x30\xc4\xdd\x83\x6f\x1f\x6a\x07\xba\xd6\xf2\x57\x10\x95\xf3\x2b\x9a\x37\xbc\xb8\x18\x4d\x2e\x6e\xae\x7e\x72\xa7\x82\x8f\x87\xb5\xdc\x18\x38\x51\xc4\xec\x7d\xb5\xe8\xf9\x18\xd4\x95\x89\x47\x22\x53\x46\x64\x07\x51\xaf\xca\xba\x6d\xbb\x6b\xa9\xf6\x10\x05\x5e\x2a\xf3\xec\x2f\x5e\x8c\x18\x69\x77\xbf\x36\x7f\x03\xb3\x45\xa0\x0b\xbe\xc2\xe2\x27\x4d\x54\xb1\x3a\x36\xb7\xa3\xe1\xcc\xdc\x4e\x6f\x66\x66\x32\xbc\x1a\xc5\xe6\xda\xdf\xf2\x99\x27\xa2\x95\x63\x3a\xc0\xe4\x41\x62\x4d\x14\x78\x33\xef\x59\xf6\xa3\x19\x9e\x3b\x4e\x22\x45\xb5\x77\x6a\xfa\x76\x83\x9a\xdd\x67\x26\xf3\x67\x6f\x4d\xf7\x98\x17\x68\x42\x5f\x8e\xe7\xa0\xe5\x30\x9e\x99\xc5\x78\x71\x39\x9a\x2b\x7c\x59\x17\x1d\xee\xbf\xc3\xb7\x0e\x7d\xb4\x03\x0f\xf7\x9f\x94\xd2\xb0\x96\xb0\x4a\x8f\x7f\xdd\x8d\x89\x3c\x3d\x58\x83\xf8\x15\xe1\x44\x61\x69\x15\x65\x6f\xe9\xa8\x5b\x71\xd6\x0c\xa0\xad\xbd\x1f\x19\x40\x91\xbd\x4d\xc0\x00\xa5\x52\x11\x44\x7d\x01\x84\x19\x85\x13\x25\x37\xd5\x7a\x63\x67\x90\xe4\x85\x7d\xbf\x0c\x5e\x35\x78\x6a\x80\x75\x18\x68\xdd\x53\x55\xca\x5d\xf7\xdb\x50\x67\x94\x8a\xa6\xca\x1e\x9c\xc1\x6a\x55\x79\x1d\xb3\x30\xac\x40\x1b\xfd\x51\x33\x13\x60\xb0\x85\x8e\xce\xda\xfa\xaf\x61\x28\xd0\xf9\x7e\x39\x2d\xe8\xbd\xd7\xa6\x64\x52\x12\xcf\xb3\x20\x56\x13\x93\x48\x37\xcf\x70\x5b\x34\x25\xf1\xb7\x90\x91\xb0\xc3\xbd\xdf\x62\xb2\xf8\x47\xd3\xe1\xfc\x1f\xf7\x27\xfe\xf6\x3a\xb7\x5f\x76\xf5\x6f\x4e\xfa\xa4\xfe\x3c\xcd\xff\x74\xf2\xe6\xbb\x1f\xdb\xfc\x4f\x67\x67\x67\xff\xe4\x7f\xfa\x43\xfe\xf8\xfb\xd1\x8d\x3e\xb0\x39\x2d\xee\x91\x44\xf1\x3e\xd9\xd5\xe6\x00\xfb\xe0\xcc\x76\x10\xc5\x3b\x55\xfb\x26\xc7\x04\x44\xa9\xeb\xba\x5c\x65\x89\x8e\x12\x92\x14\xf5\x80\xef\xb2\xc1\xf1\x01\x96\x22\x09\x10\x24\x95\x55\xfc\x4f\xed\x82\xc1\xd0\x54\x10\x23\x10\x12\x2e\xb6\xf9\x89\x18\x54\xc2\x46\x93\x67\x0e\x9c\x91\x20\x9b\x46\x6a\x01\x90\x1b\xf2\xf6\x86\xca\xb0\x93\x0c\x32\xe0\x28\x3b\x0f\x53\x75\x50\x94\x5f\x6a\x05\x4f\x83\x30\xe6\x59\xf7\x01\x59\x61\x96\x28\x81\x08\xa8\xc7\x1e\xb9\x56\x4c\xe1\xb5\x81\x99\x11\x73\x5c\x61\x92\x44\x77\x9f\x1c\x6d\x3f\x36\xa0\xed\x9e\x64\x1b\x5b\xfd\x4a\x9d\x57\xdd\x74\xae\xab\x5b\x70\xf2\x68\xb0\xca\x93\xba\x7e\x2c\xab\x3c\xad\x07\xd8\x11\x42\xdc\x00\x15\x0f\x54\x5c\x40\xb2\xc1\x60\x05\xf2\xa6\x6c\x44\x75\x95\x22\x78\x1e\x7a\x92\xd5\xde\xe2\xe1\xa5\x81\x74\xf6\xcc\xa6\xa5\x42\x35\xe5\xba\xbd\x7a\xdf\xf5\x7e\x30\x32\x5b\x44\xe5\x73\x79\xc3\xb2\x5c\xfe\xff\x57\xf4\x2d\xe7\x40\x19\x2e\x28\xb8\x7e\x41\xb3\x14\xa4\x88\x0b\xdf\x83\x11\x28\x48\xcb\x31\xfc\x69\x50\x4c\x2c\x49\xe8\x5f\xd0\xc5\xf0\xb1\x19\x2a\xbb\xdf\x65\x35\xe2\xb4\x9a\x2a\x49\xed\x26\xa9\x3e\x77\xbf\x49\x49\xea\x8b\x9d\x65\x3a\x2e\x2a\xef\x12\x71\xc8\xa6\x0c\xbe\x12\x9b\x23\xf2\x35\xd5\x2b\x63\x3d\x6e\xdf\x1e\x9b\xf8\x55\x47\x44\x48\xf3\x8f\xa2\x66\xd1\xc5\xe8\xc3\xf0\x06\xf5\x02\x14\x5f\xff\xdc\xfc\xaf\xff\x05\x3c\xcc\xdf\x7c\xd3\xe6\x26\x45\x91\xb1\xff\x2a\xec\xa4\xd2\x41\xd7\xe6\xc5\x3c\xec\xe3\x3f\x39\x4b\xff\xdb\x70\x96\xfe\xd7\xb7\x57\xe3\x6f\xcf\xcf\x5f\xbf\xbd\x7d\x3d\x39\x7f\x7d\x1a\x9f\xfc\x3e\x56\xe0\xd3\xf6\xdf\xd9\x8f\x67\xa7\xa7\x6d\xfb\xef\xcd\xd9\xd9\x3f\xed\xbf\x3f\xe2\xcf\x79\x65\x31\x5b\x76\x5e\x6e\x36\xce\x68\x18\x36\x72\xb1\xbf\x9e\x94\xc5\xb9\x10\x35\x98\xd3\xf8\xc4\x9c\xcf\x46\xc3\xc5\xf8\xe3\x08\x14\x42\xa6\x13\x77\xb2\xcd\xae\xa7\xa4\xea\x46\x72\x71\x43\x50\xce\x78\x37\x9e\x5d\x21\x4b\xdd\x74\x84\x3f\xa7\x5b\x80\x74\x61\xbc\x10\x9d\x88\xb3\x68\x29\xe7\x0b\xd0\x81\x63\x6d\x51\x79\x06\xbc\x7f\x04\xc2\x63\x8b\xc5\x74\x36\x19\xdd\xbe\x3e\xbf\x1c\xbb\xc3\x0c\x44\x0f\xc7\xd3\xc9\xfc\xc3\xf8\x3a\xee\xb6\x93\x5e\x3e\xc7\xa7\xa3\x3c\x89\xc8\x05\xa2\x6e\xe9\x6b\xd1\x2d\xed\xf9\xfe\xd5\xf0\x2f\xd0\x04\x7d\x87\xcc\x46\xef\x87\xb3\x0b\x16\xe3\xd4\xcf\xe4\x0b\x0f\x35\x0f\xf9\xbe\x98\xb7\x95\x4b\xe8\xcc\x6e\x09\x95\xb8\x0b\xe3\x66\x3e\x8a\x5f\x31\x09\xab\x7b\x3a\xc8\xba\x1c\x0d\xe7\x48\xfa\xe7\xae\xd2\xd1\xe5\xf4\xd3\x71\xaf\x28\x2b\xea\xb7\xf9\x40\x79\x77\x30\x6e\xde\x5e\x8e\xcf\x65\x74\x8f\x06\xe7\xe7\xd7\x97\x03\x77\x82\x0e\xe8\x67\x83\x63\x94\xd3\x83\xd7\xe2\x3b\x16\xa3\xf3\x05\x5e\xe1\xe7\xd3\xeb\x5b\xd0\x3b\x75\xbd\xfb\x96\xcf\xdd\x96\x74\x4a\x0c\xe7\xae\x12\xb0\x83\x47\xe1\x27\x17\x1f\xdc\x04\x06\x02\x6a\x3d\x82\xb2\xf8\x5a\xe0\x69\x1f\x5d\xc4\xaf\xde\x3a\x5b\x60\x34\x3b\xc7\x73\xdd\x3d\x1c\x35\x57\x59\xc0\x05\x9e\x2f\x63\xf1\x61\xe4\x4e\x74\xd4\x38\x04\x41\x36\xb0\x27\xde\xcf\x46\x20\xf8\xf2\x76\x64\xde\x4e\x6f\x26\x62\x90\x84\xe3\x25\xf2\x6f\x5e\xb4\x7b\x3a\x33\xef\xdd\xb4\xcf\xe1\x91\xee\xe7\xf4\x72\x77\x5f\x0d\x61\x42\xdc\x1b\xe9\x06\x9b\x8f\x2f\x94\xd2\x21\xc4\x1b\xb1\x15\xac\x6e\x0a\x77\x08\xbe\x94\x4c\xa0\x0b\xe4\x71\x64\xb2\xc7\x0b\x81\xdc\xd6\x04\x42\x4f\x62\x33\x38\x27\x84\x07\x89\x4b\x0f\x84\xfd\x0b\xd9\x2c\x39\x14\x93\x38\x7b\x31\x2b\x53\x00\xad\x65\x75\xbd\x03\x1c\x4d\x73\x5f\xe6\xe5\xdd\x1e\x8b\xfc\x56\xfb\x55\x5e\x6e\x6d\x9a\x25\x00\x60\xf0\x45\xe0\x9f\x14\xae\x0e\xf3\xd2\xcd\xde\xfd\xdb\x83\xf6\xc0\x3d\x89\x74\xe5\x7b\xa2\xe2\xd7\x42\x91\xe2\x3d\x9b\xc8\x8b\x9a\x20\x5c\xfe\x00\xb8\x42\xf8\x73\x7c\x3a\x1f\xfd\xbe\xa4\xae\xed\x66\x99\x0b\x3b\xa2\x20\x5d\x1e\x28\x21\x1d\x9b\x61\xc8\x68\x49\x12\x2a\x6e\x28\x5a\x63\xe6\x13\x56\x4b\x1b\x26\xa6\x5b\xca\xdd\xc0\x64\xc0\x48\x4a\x28\x36\x3b\x16\x14\x85\x27\x2f\xea\xaf\xe5\x5a\xc6\x66\xd0\x7a\x5c\x38\x57\x54\x5f\xb3\xdb\x52\x19\x15\xbc\xb0\xac\x5a\x3f\xf0\x60\xa9\x6d\x65\x5f\x4b\xbd\x01\xe1\x4e\xfc\x6c\xab\xe4\x2a\x68\xde\xc1\xbc\x2b\xfc\x6f\x64\xd2\x2a\xf9\xff\xd8\x7b\xd7\xe5\x36\x92\x2c\x4d\x70\x7f\xf3\x29\x7c\x69\xbb\x9d\xa4\x6d\x10\x12\xa9\x5b\xa5\x54\x56\xd6\x10\x08\x4a\xe8\xa6\x08\x16\x00\xa6\x8a\xf3\x67\xc6\x01\x38\x88\x28\x05\x22\x30\xe1\x01\x32\xd1\xb6\x3f\xfa\x1d\x66\x9f\xb0\x9f\x64\xcd\xcf\xc5\xfd\x78\x44\x00\xa4\xb2\xa4\xec\xea\x1a\xd1\xaa\xcc\x52\x64\x5c\x3c\xfc\x7a\x2e\xdf\xf9\xbe\x95\xae\x08\xe4\x9d\xa8\x45\x0a\xf1\x50\x9d\xf9\xdf\xac\x0a\xf0\xff\xd6\xe9\xac\xda\x94\x26\x24\xa7\x2c\x64\xfe\x4b\x33\x03\x7d\xfe\x3b\x37\x1e\xc1\x2b\x25\xcf\x7c\x5a\xa6\xf3\x3b\xaa\xe3\x2a\xdc\x50\x5a\x7a\x28\x05\xb5\xf1\x13\xc0\xa9\x6d\x4e\x35\x0f\xa0\x9c\x69\x5b\x25\xf8\x29\xee\x52\x33\xc7\xfb\xe7\x7a\x0d\x25\xea\xac\x0c\x8e\x99\xa6\x6f\x3e\xd8\xb5\x91\xdd\x35\xb0\xb3\x0e\xeb\xe1\x14\xa5\x24\x6a\x12\xa8\x34\xae\xa1\xdd\x72\x29\x32\xd6\x1c\xf1\xf7\x3e\x46\x90\x4a\x2f\x9a\x77\xd4\xa1\x57\xb7\xe8\x02\xf8\xf2\xd1\xf7\x3d\x2c\x0b\xaf\x3d\xc1\xef\xe3\xe7\x99\x8e\x3a\x94\xd3\xb0\x92\x15\x9e\x00\x6d\x81\x2e\x2d\x16\x71\x9d\xef\x02\xba\xeb\x89\x6d\x5e\x74\xd4\xe1\x6d\xb1\xf1\x33\x3d\x6f\x6f\xa6\xf9\xd5\xd9\x13\x56\x08\xdf\xb4\xa5\x95\x21\x2f\x8d\xe9\x32\x81\x73\xbf\x4f\x8b\xcc\x7f\x5f\x6b\x63\x98\x29\x13\xe0\x65\x9c\x73\xfd\x0c\xdb\x23\x70\xa0\xe1\x63\x7d\xb6\x9b\x25\x7c\xda\x60\xea\x3c\xd0\x10\xb0\xc0\x46\x9b\x3d\x4d\x9e\x1b\xbb\x4e\x81\x55\x20\x54\xd5\x41\x73\x39\x44\x72\xd6\x51\x17\x3a\x2d\xa1\xd4\x1d\x03\x6a\x41\x1f\x8a\x25\x46\xa2\x9c\x09\x09\x45\x01\x49\xea\x7c\x33\x33\x09\xb2\xcd\x60\x6e\xde\xd8\xaa\x4c\x67\x15\xac\x30\x16\x10\x42\xe1\x2c\xfc\x82\x85\xc6\x20\x7b\x42\x24\x2d\x56\x67\x26\xf0\xff\x4a\x9d\x21\xda\x72\x3c\x01\x2c\x3f\x2e\xd0\x4b\x51\xbc\xa9\x78\xc8\x0d\x43\x1d\xc2\x6f\x33\xfd\x10\x9e\x2b\xb0\x52\x99\x7e\xf0\x94\x4b\xdc\x47\x1f\x4a\xc8\xac\x8c\x63\x21\xaa\xd6\x04\x6e\x23\x17\xea\x87\x63\x69\x4a\x33\x25\xfd\x43\x8b\xa2\x5e\x0a\x42\x11\x0f\xe9\xdc\x24\xaa\x2c\xb6\x3a\xab\xb6\x27\x8b\xd2\x98\x44\xe5\x45\x7e\xe2\xbf\x2c\x71\xe3\xbc\x36\x40\x3f\x73\xc4\x4b\x7e\xbe\x29\x23\x8c\xa0\xf8\x04\xff\x91\xc7\x7e\x60\xe4\x5c\xa8\x82\x3c\x6b\x2a\xb7\x6d\x5f\x34\x0a\xc7\xc6\xdb\x70\x80\xc3\x48\xca\x88\x1e\x4e\xcc\x0a\xb0\x37\x45\xb9\x2e\xe0\x5c\x14\xc7\x70\x55\x44\x75\xfa\xb5\xed\x8d\x59\xca\xda\x9e\x8a\x75\x56\xfe\xa1\x3e\xf3\x56\x7f\xc4\xbb\x70\x64\x55\xbc\x7d\x30\xe8\x96\x1e\x59\xdb\x2b\xfd\x2d\xb3\x4e\x4d\x17\x8d\x41\x71\xa5\x5a\x2f\x8b\xbc\xc0\x53\xc3\x42\x31\x09\x33\x71\x31\xd7\x0d\x8c\x04\x1c\x09\xe1\x37\x90\xf9\xad\xfd\x56\x4d\xb7\xb4\x9d\x10\xbe\xe8\x2e\xad\x00\x8e\x3e\x4f\x0b\x3c\x2c\x7c\x41\x47\xe8\x35\x56\xd5\x6c\xe9\x82\x5d\x9f\x3f\xff\xbb\xfa\x96\xd6\x1e\x9f\xf8\x08\x30\xcd\x39\x3a\x3a\x79\x3a\x7a\x06\x3b\xa8\xe6\x27\x18\x2e\x13\x11\x22\x03\x43\x5e\x3c\x20\x44\x5f\xd1\x32\xc2\x9c\xf9\x1c\xf1\x30\x9d\xe6\x2b\x24\x24\x0c\x57\x3b\xeb\x1c\x20\x45\x77\x4c\x41\x80\x01\x77\x4f\x6f\x97\x6d\x55\x6e\x66\xc6\x5a\x5d\x6e\xf7\xac\x1b\x0a\x36\xd7\x1b\x8d\x89\x07\xba\x8c\xc8\x96\x09\x79\x25\x94\x4f\xfd\xa6\xe0\xde\x4c\x1b\x43\x29\x35\x92\x00\x0a\x88\x5b\x25\x42\xe5\x26\x22\x33\xcd\x0f\x42\x32\x63\x42\x7c\x62\x07\xa4\x12\xea\x05\xf5\x53\x42\x3d\xcf\x2b\xb5\x85\xd4\x7c\x88\xb1\x97\xe2\x75\x62\xed\xdf\x36\xe0\x8d\x49\x83\xa8\x4e\xfc\x86\x26\x4f\xe2\x4b\x2e\xf0\x32\x98\x32\xe1\xcf\xc2\x78\xcc\x05\xac\x7b\x27\xad\x02\xab\x20\x42\x4c\xbe\x81\xcb\x48\xb8\x42\xf7\x26\x4f\xe1\xe9\x23\x43\xf9\x91\x01\xd2\xb8\xa5\x68\xc7\x25\x2d\x27\x2e\xe8\x53\xd0\x83\xa2\x35\xc3\xdb\x2a\xb4\xf2\x36\x22\x3a\xfa\x06\x1d\x10\xb3\x2b\x82\xc1\x42\x85\x5a\x8c\x97\xa1\x9e\x10\x1b\x04\xda\x90\x19\x51\xfc\xfb\x83\x74\xb7\x49\x41\xbd\x52\x9a\x59\xba\x4e\x4d\x5e\xd9\x9f\xc2\x5c\xa6\xaf\xdb\xa5\xd2\x1d\xb7\x4f\xc0\xfd\xbc\x81\x16\xc6\xe3\x8b\x31\x6b\xb7\xe7\x03\xd2\x1f\xed\xd6\x50\xc5\x0b\xb5\xeb\x78\x60\xd6\x45\xc2\x0b\xce\xc8\x70\x6a\xa7\x58\xa8\x07\x30\xff\x2b\x20\xd5\x93\x2d\xf8\x4e\xb3\xcf\x17\x34\xc3\xe2\x77\x7e\x66\x8d\xdf\x92\x95\x06\xca\x22\x63\x7e\x83\xa2\x0c\x29\xc3\xe0\x77\x82\x7e\x4a\x8e\x2c\x6c\x58\x46\xe2\x6b\xe2\x76\x0f\x50\x97\x31\xa7\x72\x0b\xab\xd1\x7e\xee\x3a\x14\x1b\x4e\x03\x22\xf2\x28\x65\x47\x88\x2d\x82\x07\xb7\x9d\xa0\x4a\x43\xc5\xba\xb7\x1a\xf1\x43\x80\xa0\xc0\xbd\x7a\x6a\x1a\xbb\xc7\x6e\x43\x9a\xe5\xc4\xf9\x18\x6e\x36\x0d\x1c\x44\x66\x82\xe1\xa2\x65\xbf\x09\xf2\x54\x0a\xe5\xb1\xbf\x42\xf7\xad\x4b\x3d\xab\xd0\xa6\x49\x54\x69\x56\x50\x09\xc8\x0d\x6e\x7c\x8f\x33\x28\x59\x7c\x02\xb4\x35\xdc\x56\xef\xdf\x41\x8b\xa1\xe6\x9c\x00\x27\x8e\x67\x14\x6b\x7e\x48\xed\x44\xfb\x2e\x1f\x52\xf7\xe9\xbe\xc5\x87\x04\xeb\x48\xae\x22\xbf\xfa\xc1\xbd\x6d\xdd\x01\xaa\x02\xee\x68\x3b\x59\x58\x2f\x00\xa6\x39\x57\x20\xad\xcb\x74\x05\xda\x3a\xc1\xee\xa7\x0a\x54\x64\x7f\x83\x47\x3e\xe8\x72\x2e\xd8\x74\x95\x9e\xdf\xeb\xbc\xa2\x2a\x93\x35\x7c\xbd\x51\xab\x22\x47\x46\x68\x49\xf0\x8a\x0b\xc3\x53\xbc\xca\x45\xb7\xf0\xc6\xbb\x37\x77\x7d\xc9\x86\xb4\x58\xd8\x5e\x59\xa4\x99\x39\xb1\x4b\x5d\x12\x2b\x6d\xe0\x27\x47\x39\xdb\xa6\xbb\x8d\xcb\xe0\xbb\x7c\x57\x54\x9e\x15\xb8\x67\xbc\xac\x3b\x22\x3c\x5b\x6f\x45\x56\xd5\xa6\xea\x82\xec\xa4\x46\x8f\x88\x40\x40\x83\x1a\xf7\xdb\x9e\xe7\x18\x3b\xa9\x5b\x82\xee\xf7\x4d\x2f\x60\xe7\x11\xd2\x24\x9f\x62\xaf\xc7\x07\x98\x98\x82\xaf\xbe\x10\x38\x25\x2c\xe4\xfb\x69\x2d\x62\x05\x13\x38\x25\x30\x37\x6e\xa9\x8a\x1c\xb5\x98\x81\xe0\x00\x8a\x6c\xef\xcd\x96\x21\xba\x00\x0b\x38\x72\x9f\x6e\xcd\x66\x5e\xe4\xdb\x15\xd0\xe1\x78\x4f\xcb\x97\x71\xd7\x1b\x91\x2e\x94\xdd\xc0\x46\x3e\x7f\x27\xb0\x9d\xd1\xa1\x21\x2f\xe1\xfa\x3d\x5f\x91\xd0\xd8\x78\x34\x7f\x18\x53\xd3\x72\x1b\x5b\x0e\xa3\xb6\x5d\xe5\xc8\x74\xee\x3a\x89\x3a\xbc\x70\xdb\xca\xb2\x59\x67\x41\x97\x4d\xb7\x8d\x9d\x05\x09\x63\xc6\xb3\xd2\x98\x1c\x1c\x08\x26\xd9\x09\xb5\x0d\x3b\x6e\x3d\x3c\x26\xa8\x39\x35\x9d\x2c\xff\x94\x95\xa5\xe8\x24\x83\xfd\xce\x8f\x16\x6e\x30\xef\xfc\x02\x49\xd4\x92\xd1\xff\xb8\xe9\x3c\xd2\x55\x2d\x53\x2d\x51\x10\x7d\x5b\xa5\x79\xba\xda\x50\xdd\x21\x35\x09\xcb\x12\x10\xd2\xf0\xb0\x24\xca\x3c\xbf\xaf\xac\xd6\xba\x84\x46\x89\xe8\x12\xdd\x88\xf7\x58\x66\x90\xf1\xe7\xbf\xe7\x02\xd2\x56\xd2\xf8\x52\xf9\xc0\xe3\x0f\x66\x74\xc3\x88\x15\x30\x34\x05\xa3\x3f\x7b\xd3\x08\xde\x79\xee\xed\x26\x77\xc3\xfb\x2d\x1a\x91\x3c\x29\xfc\x0e\x49\xdc\x4c\xcc\xe6\xd8\x56\x40\xe9\x4f\x16\x2f\xba\x81\x6f\x20\x5b\x0c\xad\x20\x7f\xa2\x4d\x0d\xe2\x75\xf8\xae\x9f\xac\xf2\x35\xbe\x84\x65\x16\x83\x99\xe6\xce\x00\xd9\xbe\x15\x51\x10\xd7\x15\x66\xb6\x81\x78\x66\xf0\x94\x64\x20\x22\xf2\xbe\xe0\x60\x8a\x70\xb9\x74\x87\xb7\x55\xd9\x9a\x0c\x30\x4d\x95\xe9\x87\xc5\x26\x7b\xb2\xb5\xeb\xd1\x2b\xb7\x88\x9b\x65\x06\xd0\x62\x9a\xa5\x77\x5e\x1e\x63\xad\xb7\x38\x57\x21\x50\x03\xc5\x26\x40\x77\x9b\xd9\xa2\xdc\xfa\xd6\x2d\x8c\xfb\x43\x69\x2c\xc4\x0f\x6d\x1c\x4c\xa6\xfd\xdd\xbe\x83\x63\x0d\x3e\xd6\xdb\x6a\x69\xbe\x70\xc3\x67\xe2\xe0\x55\x12\x80\x30\x89\x60\x79\xe0\x12\x97\x19\x64\x3f\x21\x96\xc5\xd1\x2f\xf9\x3e\x8a\x7f\xe1\x69\x52\x2d\xd3\x72\x4e\x8a\xf6\x58\x8b\xc1\x8a\xed\x73\xb3\x80\x38\x3b\xd0\x7d\xe5\xf7\x9a\x01\x3b\x70\x84\xcd\xb6\x21\x4c\x56\x81\x68\xd4\xc6\x0d\xd7\x5f\x37\x38\x3e\xb5\x27\x77\x54\xff\x2f\x98\xb7\x1a\x33\x04\xe6\xf2\x56\x8d\x27\xdd\x49\xff\xdc\x6b\xfd\x72\xa6\x4c\x42\x1f\x30\xc9\x05\xd7\x7c\x1e\x0d\x20\xab\x38\x1c\xa9\x51\xff\xcf\x37\x83\x11\xa6\xef\xe2\x3c\x5d\x12\xe5\xf9\xe8\x89\xe7\x21\x2b\xaa\x7c\x56\xb4\xa1\x8a\x4e\x38\x9a\xa0\x8b\xde\x1f\x40\x7a\xaf\x45\x4e\x58\xa0\x52\xf8\x21\x80\x4a\x81\x24\x59\x42\x10\x8d\x1d\x89\xd5\xde\xf0\x6a\xd2\xbf\x9a\xc0\xf3\xba\xbd\xde\xcd\xa8\xdb\xbb\x95\x49\xc5\x0e\x15\xab\x5f\xfa\x98\xa6\x02\xe4\xb8\x17\xcb\xa7\x9e\xa4\x3c\x61\xff\x2f\x13\xcc\x17\xef\xee\x91\xee\xd5\x39\xdf\x24\xf3\xb4\x8c\x29\x81\x2c\x6d\x48\xe5\x4e\x86\xaa\xeb\xc6\x63\x74\x0e\x80\xa1\xdb\x7a\x3e\xf7\xfd\xa8\xdf\xed\x7d\xf4\x2d\x0e\x9f\x39\xb8\x52\x63\xac\xae\x57\xaf\x92\x08\x49\xf4\x79\x70\x79\x19\x32\x8f\x01\x30\x34\x19\x42\xfe\x91\xb0\x34\x98\x48\x27\x44\x0d\x63\x89\x3c\x5a\x48\x42\x88\x22\xac\x50\xa2\xae\x6f\xae\x06\x90\x10\x1e\x8e\x02\xa8\xa8\xf1\x99\x1e\x2f\x13\xcf\xb4\x08\x3f\x83\x23\x10\xa0\x33\xbe\xcd\x1f\xbb\x63\xf5\xbe\xdf\xbf\x7a\x3a\x98\x66\xcc\xf5\xdd\x13\xaa\x1a\x4b\x8b\x3c\x84\x4f\x26\x0d\xb7\x77\xff\x3e\x94\x65\xa2\x2c\x2e\x2e\x97\x03\xd7\xc3\x2d\xb7\x69\x09\x05\xf9\xd3\x2d\xec\x57\x5e\x0b\xa3\xdd\x33\xf3\xa9\x8c\x98\x26\xb5\x59\x40\xf7\x14\x93\x0d\x9d\x96\xdb\xd6\x92\x3a\x71\x4e\x3f\xb5\xb8\xce\xdb\xc0\x70\x36\xa6\x3b\x9a\xba\xb3\xd4\x8e\x6d\xdf\xc2\xfa\xc3\x21\xb0\xb7\x59\x75\x9a\xa8\xb3\xc4\xcd\xd0\xd7\x89\x7a\x83\x31\xa4\x3f\x60\xd3\xec\xa6\xbc\x4f\xef\x43\x9c\x85\x19\x62\x76\xa7\x45\x6b\x91\x7f\xf4\x88\xda\xe2\xff\x49\x74\x54\xc9\x11\x26\x25\xd8\xdf\x12\xc6\x97\xa7\xe3\x31\x24\x5f\xdc\x97\x03\x9d\x15\x1f\xf8\xc4\xe3\x2c\xce\x72\x92\x36\x8d\x42\xa0\x92\xd4\x59\xa4\xf5\x02\x53\x8b\x0f\xf3\xe0\x6c\x82\xc8\x8d\xad\x8a\xb5\x8a\xd8\xb1\x83\x21\x5e\x91\x34\xcc\xca\xb4\x18\x6c\x14\xb1\x62\x61\x44\x93\x79\x97\x85\xa6\x07\x71\x0e\x16\x30\x90\xf3\x52\xd7\x98\x17\x8e\xa2\xb3\x2c\x44\xa0\x44\xa1\x1b\x72\x29\x5a\x21\x13\xe0\x7c\xb6\xc4\x77\xfc\x23\x91\xc5\xe3\x16\x7e\x00\x68\x9d\x67\xf6\xe7\x59\xb7\x28\x4a\xe2\x36\x44\x11\x5b\xb5\xc9\xb1\x36\x3e\xcc\x66\x1d\x6b\x7b\x70\x8d\xf9\xa7\xd4\xce\x4c\x96\xe9\xdc\x14\x1b\x01\x8a\x80\xda\x46\xa8\xca\x8c\x83\x8b\x5f\xe3\x68\x35\xed\xdc\x28\xff\xc7\x39\xdc\x22\x0e\x03\x0a\x3e\x5c\x19\x63\x2a\x84\x0c\x6c\x6b\x66\x8b\x8a\x65\xea\x73\x9b\x22\x06\x3b\xc4\xe0\x70\xf9\xfc\xc6\x8f\x6d\x71\x83\xbe\xfe\xe3\x62\x27\xe5\xbb\x7d\x25\x7a\xd6\x6e\xba\xc2\x3a\x68\x2d\x1e\x4d\x91\x43\x30\x4b\xe7\x10\x45\xcc\x4d\x0e\xd3\x0a\x16\x3b\x99\xb2\x51\x1e\x32\x51\x80\x6d\xe6\xe8\x84\xc6\x99\x57\x01\x4b\x4c\x96\xce\xd3\x8a\x50\x31\xf4\x14\x30\x1b\xbc\xad\x0b\xbb\xe6\x3c\xb0\x35\xec\x09\xad\xb3\xf9\xcb\x42\x3d\x1a\xd7\x29\xa5\x08\xb8\xe4\x99\x83\xb8\xbe\x52\x9e\xb0\x1c\xe1\x7b\xb1\xa9\x00\x8b\x40\x2c\x84\x77\xbd\xc9\xf3\xa2\x70\x58\x64\xe0\x87\xb4\x4c\x78\x10\xf6\x11\xac\xb6\xd0\x45\x02\x63\x70\x55\xc0\xe7\x10\x0e\x7f\x47\x6f\xfb\xd6\xcc\x5d\x73\x9d\x3f\x03\xe7\x1c\x56\x43\xf0\x21\xea\xac\x60\xc3\x23\x4c\x6b\x1a\x1a\x03\x57\x97\x6c\x28\x43\xdd\x30\x3f\x2f\xcd\x01\xe0\x8e\x5e\xc2\x5c\x91\x98\x9a\xe8\xad\x2d\x85\x8e\x50\x53\x82\xca\x0f\xda\x9f\x2a\x80\x0e\x91\xa9\x20\xf1\x21\x95\xe4\xda\x68\x63\x29\xf0\x55\xf1\x3b\x30\x04\x3c\x9b\xf1\x20\x82\x98\x1a\xd1\x7a\xe5\x05\x4e\x3c\x3e\x4b\x6c\x12\x5e\x41\x02\x0d\x91\x1b\xba\xfb\x15\xa1\x40\x38\xf5\xef\xf1\x8b\x35\x8a\xb0\x4d\x01\x9b\x33\x45\x67\x8a\x09\x24\x74\x16\x46\x92\xe2\xee\xc0\xce\xe8\x8b\x0d\xdc\xc5\xce\xdb\xd9\xe4\xcc\xfe\xcf\xb6\x48\xad\xe7\x44\x55\x83\x87\x7e\xf1\x04\x87\xb9\xb8\x41\x21\x65\x2a\x51\x08\x3d\x1a\x15\xf8\x92\x0a\xb8\x7b\xfc\x41\x03\x6b\xca\xaa\xeb\x61\xb0\x5b\x78\xd8\xf4\x17\x70\xec\xd8\x8d\xde\x4a\xd1\xad\x1d\x21\x3c\x4c\xac\x34\x5e\x27\xd1\x40\x59\xca\x21\xad\x5b\xa4\x4c\x84\x1d\x07\x7d\x3a\xec\x24\x90\x55\x75\x8f\x2b\xb0\x24\x07\x7e\x39\xd7\xa8\x4b\x19\xda\x90\x88\x84\x33\x77\x4f\x40\x57\xc0\x4d\x24\xac\x92\x30\xb9\x08\xdc\x02\xe1\x27\x04\xc6\xc0\x14\x06\x21\xc6\x54\x67\xfe\x15\x8c\xe6\x88\xbf\x91\xfb\x28\x63\xc3\xb4\xcd\x88\x59\x14\xa5\xb9\x2b\xe0\x5f\x0f\x85\x3a\x3a\x3b\xf6\x74\xd5\xc8\x95\xdf\xe8\x99\x65\xc4\x6c\x91\x72\xb6\x6f\xce\x89\x0c\xda\xcc\x23\x08\x06\xcc\x77\xb1\xb3\xa2\xc0\x5d\x88\x44\x00\x7a\xcd\x3b\xfe\x56\xc6\x3a\x3a\x07\x7d\x84\x73\xb1\xf1\xc6\xc9\x54\x01\xbf\x72\x56\xec\x8c\xa8\xc0\xa5\x82\x49\x28\xf9\xc2\x28\x9d\x0d\x8b\x32\x18\x29\xbd\xde\xf5\x65\xa2\x72\x22\x01\xc0\x61\x85\xd1\x67\x46\xfa\x50\x15\x73\x58\xef\x8c\x43\x9e\x0d\x2c\xb7\x2b\x2a\x68\x4a\x95\x15\x77\x05\xb0\x8c\x36\x27\x57\x58\x1a\x71\xf1\x0e\xef\x7b\x2d\x77\x21\x49\x48\xa8\x6b\xdb\xb0\xdd\x84\xbb\x63\xdd\x44\xaf\xdf\xfe\x93\x7b\x5b\x7e\x32\xdb\x94\x60\x74\x86\x86\x6e\x80\xd3\xf4\x6e\x93\xce\x4d\x96\xe6\x06\x05\xa9\x98\x39\xc8\x57\x95\x13\x43\xfa\x83\x99\xda\xb4\x32\x71\x2c\x1f\x92\x56\x41\x13\x13\x7c\x26\x4a\x8b\xb4\x10\x61\x34\x97\x36\xbd\x8c\xea\xab\x90\xdb\x9b\x6b\x87\xe8\xda\x19\xf5\x41\x51\xde\x3d\xfb\x07\xa8\xa4\xf8\xaf\xf9\xd3\x79\xf6\x6f\x59\x3a\x3d\xa9\x11\x89\x7f\xdb\x3a\x90\x47\xea\x7f\xcf\x4e\x5f\xbd\xae\xd5\x7f\xbc\x7a\xfe\xf2\xf4\x47\xfd\xc7\xef\xf1\x13\xf3\x63\xb8\x11\x38\x39\x7b\xfe\xfc\x8d\xea\x2d\x75\x99\xa5\x46\x5d\x17\x45\x66\x0e\xda\xaf\x7a\xa9\xfe\x05\x6a\x16\x3f\x77\xd4\x95\x79\xf8\x92\x3a\xbf\xe2\x53\x3a\x5b\x6a\x93\xa9\x5e\x47\x4d\x1e\x8a\x44\x75\x33\xf3\xab\x49\x55\xb7\xa3\x7e\x29\xca\x22\xaf\x6c\x71\xdf\x7c\xda\xf3\x13\x28\x3e\xbe\x5e\xa6\x59\xba\x76\xd7\xf6\x4a\x9d\xde\x1d\x4c\xa2\x52\xe2\x54\xd4\xa1\xfe\xa4\xed\x49\x6a\x7f\x4a\xfc\xae\x8b\x84\xec\x88\xe5\x24\xa2\x5e\xb0\x57\xc8\x66\x00\x9a\xaa\xbc\x50\xe6\x1e\xd1\x04\xc4\x78\xcf\x6a\x33\x53\xa3\x96\x26\x9b\xb3\x51\x50\x3f\xec\x23\x5c\x65\x94\x2a\x12\xed\xeb\x1c\xec\x24\x13\xd1\xf9\xb6\xc8\x4d\x44\xb1\xe2\xbf\x8a\xdf\x45\x27\x9f\xb4\x26\x64\x42\x14\xdd\x19\x8a\x8c\x50\x9c\x1e\x21\x2c\x69\x45\x70\xbd\x98\xee\x71\x51\x1a\x93\x21\xc3\x94\x0c\xb8\xec\x81\x29\x9d\x62\x8e\x18\xdd\xbc\x66\x25\xb7\x2c\xe3\x5d\xa5\x56\x08\x8b\xbf\x0b\x14\xaa\x40\xb0\x95\xe9\x74\x15\xa8\xc5\x1e\xca\xa2\xaa\x71\x8a\xf9\x2e\x8b\xc5\xdf\xa2\xc1\xce\x01\x47\x0b\x28\xf3\x04\x34\x71\xfc\x06\x85\x7a\x40\xd6\x98\xf8\x83\x8e\x83\x44\x07\xdc\x55\xab\x6c\x16\xb1\x0d\x70\x15\xae\x21\x02\x9f\x5b\xf5\xa4\x05\x80\x31\xbc\x6f\xb8\x06\x5a\x1f\xb8\x63\x19\x20\x74\xb8\x4b\xba\x0b\x84\xc8\xf2\x84\x53\xcc\x65\x0f\x12\xd9\x80\x55\x2b\xbf\x50\x10\x05\xa4\x85\x91\xcb\x78\xd7\xd8\x49\x51\xfe\xb6\x11\xf2\xa5\xdd\x68\xaa\xa7\xb3\xc8\x2f\x40\x04\xc6\x1c\xa9\xed\xb0\x79\x1e\xcb\x41\xed\x8c\x0b\xc5\xff\xb3\x77\xbb\x1f\x3f\xf5\x9f\xce\xb3\x0f\xbd\xde\x09\x56\x57\xa4\x45\x7e\xf2\xa2\x73\xfa\xcd\x8b\x40\x1f\x39\xff\x5f\xbf\x3a\x7d\x55\x3b\xff\x5f\xbc\x3e\x7b\xfd\xe3\xfc\xff\x3d\x7e\x3e\xf4\x7a\x6a\x74\x73\x35\x19\x7c\xea\xab\xcb\xc1\xfb\x51\x77\x74\x4b\xa9\xaf\xc1\xf0\xea\x80\x29\xaa\x5e\x74\x4e\x13\xf5\xe2\x54\x7d\xd2\xe5\x6c\xe9\xb6\xaa\x9f\x0f\x98\xe7\x27\xcd\x11\xb0\x9b\x16\xf9\xdb\x36\x26\x3a\x4e\x28\x3c\xbb\x9b\xcd\xc2\x3c\xeb\x2c\xab\x55\x26\x0d\x81\x1e\xec\x80\x3f\xef\xa4\xb8\x4a\xd4\x20\x9f\x75\xd4\x1f\xe9\x0d\x0b\xbb\x80\xa7\xff\xe9\xa0\x7f\x6f\x4a\x38\x5e\x53\x2b\x1c\x29\xa2\xf0\xaa\xf3\x20\x4b\x8e\x61\xc9\x1d\x9d\x79\x4e\x5b\x26\x72\x9d\x6e\x2a\xd4\xf8\x05\x17\xbc\xf2\xa1\x0a\x77\xda\xb8\x23\x04\x76\x44\xe8\xbc\x4d\x0e\xae\xd0\x65\x3a\x2d\x75\xb9\x55\x7d\xfe\x44\x75\x74\xe8\xff\xfb\xf0\x18\x78\x19\xf2\x28\x4c\x13\xcc\x05\x74\x5c\x99\x14\xeb\x8d\x24\x10\xdb\x45\xa7\xc4\x1c\x61\x2f\xd4\xd1\xe1\x87\xeb\xcb\xfb\x17\x87\xc7\x1d\x35\xa8\x24\xea\x51\x13\x89\xc3\x22\xcd\x8c\x3a\x72\x0f\x3c\xac\x35\xf6\xf0\x18\xcf\xe9\x29\x22\x30\x78\x87\x27\x6e\x59\x0a\xc4\xd5\x39\x4f\xb9\x75\xf0\xd8\xa0\xd6\xc5\x3c\x2c\xee\xb7\xce\xfc\x29\xee\x4d\x49\xe1\x3c\x68\x9f\x2c\x18\x84\x3e\xf7\x9d\xd3\x39\xf8\xcc\xea\xad\xce\x10\x70\x9d\x5a\x31\xa5\x31\x96\xd3\x00\x9b\x55\x02\x7f\x91\xb2\x09\x6b\x3e\xc3\x8b\x85\x9a\x99\x12\x48\x57\xdc\x35\x4b\xa3\x5d\x3b\x5d\x53\x48\xd2\x8d\x3e\x3b\x83\xcf\xf6\x11\xbe\xca\x13\x22\x63\x0e\xcd\xbd\x05\x8d\xa0\x7a\x19\x58\x18\xd4\x14\xbb\x16\xe8\xad\x6b\x04\xd3\x79\x91\x9f\x7c\xb8\xbe\x54\x47\xc1\x84\x43\x1d\x3f\xc0\x9e\x1d\xf3\x1b\x2c\x19\x82\x89\x2f\xfa\x79\xd0\x5b\xcc\x38\x3c\xa1\xe1\x40\xc9\xcb\x83\x13\xf7\xa2\x52\xea\x79\x54\x39\xda\x41\x1e\x6c\x1e\x12\x9d\xab\xc3\x81\xa8\xb7\xfc\x54\xcc\x37\x99\x39\x24\xf1\x44\x8a\x95\x78\x22\x5c\xd7\x9e\xfa\xdc\x46\xe9\x19\x33\x23\xd2\x1f\x00\xa9\x68\xe7\xf2\xfb\x6e\xb8\x2e\x8b\x99\xb1\x48\x1f\x8a\x91\x3b\xb2\x95\xa1\x1a\xac\x32\xe5\x42\xcf\x04\x01\x2d\x4d\xb1\xda\x7b\x70\xf5\xd1\x8a\x0b\x21\x09\x0f\x97\x6a\xb9\x05\x3e\xf5\xf0\x43\xaf\x17\xea\x2c\x6b\x7c\x97\x6e\x31\x61\x4b\x4d\xc8\xc7\xba\x7d\x65\x1f\xef\x90\x4d\xa2\x89\x2c\x16\x1d\xa4\x8d\x42\x9c\x36\x22\xee\x3b\x7e\x7c\x01\xab\xa3\x0f\xd7\x97\xc7\x61\x1a\x06\x6e\x4b\x14\x4e\xc6\x64\xdf\x94\xc2\x82\xc1\xda\x6b\x52\x02\x8e\x2f\xe8\xdb\xaf\x2f\x4f\x00\x0f\x55\x81\x64\xa7\x67\x56\x52\xd2\xac\x7e\x80\x1c\x6f\x5c\x65\xe5\xe6\xa8\xbe\xf3\x75\xa0\x42\x16\x96\x59\x9d\x1e\x50\xf3\x1b\x61\x41\x52\x09\x04\x9a\xef\x56\x5c\x8a\xcc\xdd\xa5\x60\x08\xf2\xbc\xb6\x0b\x77\x05\xb6\x71\xa2\xcb\x3b\x53\x01\x9d\xcc\xa1\x50\x63\x2b\x36\xd5\x7a\x23\x44\x98\x66\x3c\x4c\xa8\x16\x57\x1a\x0c\x93\xde\xa7\x25\x44\x9c\x2b\x7c\xca\x1a\xa7\x1a\xd4\x7e\xcc\x96\x69\x65\xa0\x74\x15\x56\x15\xce\x51\xf6\xe5\x20\xbd\x61\x37\xa9\xff\x85\x4a\x73\x60\x98\x2c\x60\x47\xa6\xe2\xe2\x32\x51\x59\xa1\x21\xa4\x99\xa5\xf9\x17\x84\x43\x3d\x8b\x26\xfc\x7a\xa9\xdb\x23\xae\xba\x4a\x94\xf8\x36\x89\x45\xc2\x12\x8b\xb9\xae\x34\x07\xdf\xf1\xb8\xf4\xc0\x5f\xa0\x44\xd2\xd6\xf3\xb0\x43\x54\xbb\x32\x25\x69\x72\xd6\x12\x07\x09\xc1\xe6\xe7\x24\xdf\xe7\x5c\x9d\x20\x05\xfe\xd8\xdd\x5e\x1a\xe5\xb0\x65\xcd\x1e\x86\xe2\x5b\x8b\x84\x58\x98\x2b\xc9\xb6\x4a\x3a\x0c\xa0\x13\x96\x9f\x44\x6f\xc9\x74\x7e\xb7\x01\x57\x19\x55\xc0\xa8\x79\xcb\xcd\x4a\xe7\x27\x21\x0c\x3a\xc7\x90\xfe\x33\x18\x01\xf5\x2f\xfa\x5e\xab\x5f\x68\x4c\x3f\xa1\xd2\xba\x9a\x6e\x2b\x43\x57\x42\xf5\x9b\xe8\x55\xb7\x33\x6f\x50\x5b\x23\xe8\x5f\xd1\xee\x22\x69\xbc\x30\xda\x5e\x15\x84\x29\x5c\x43\x21\x1b\xce\x14\x8b\x2a\x30\x4d\x84\xb2\x14\x9d\x6b\xdd\xce\x6c\x9a\xcf\xcc\xae\x3f\xb3\x38\x3f\x65\x80\x8a\x82\x73\xd8\x65\x95\x86\x23\xcf\xf0\x3c\xa7\xf7\x88\x76\xa2\x12\x63\x68\x26\x6d\xdc\x6d\xaf\x4a\xad\x3a\xec\x67\xe9\x9d\x5b\xe4\xbc\x75\x43\xa5\x42\xce\x9a\xeb\x1f\x7a\x3d\xac\xce\x37\x5e\x74\x1e\x13\xff\xb5\x1d\x82\x37\x05\x96\x51\x14\x0f\xe2\xad\x30\xec\x45\xa2\x68\xbd\x80\x43\x16\x99\xb5\xc4\x38\xb8\x2b\xe9\x04\x6c\xdb\x87\x60\x9d\xaf\xab\x74\x95\xfe\x1b\xe2\x45\x70\xdb\xd8\x39\x55\x2d\xed\x3a\x6e\xac\x84\x82\x9d\xce\x15\x7f\x7d\x5b\xf7\x30\x7d\x02\xd4\x99\xba\x8e\xee\x06\x7b\xeb\x3a\x56\x7b\xbc\x65\x6a\xcf\x58\x14\x8a\x77\x43\xc3\x55\xe6\xc5\x22\x5a\xda\x94\x8f\x9d\xb2\x15\xc2\xae\x73\xfd\xa8\x84\x7e\x6f\x9e\xb6\x36\x81\x18\x14\x82\x96\x31\x55\xcb\x9b\x2f\x7d\x70\x38\xef\xa8\xd8\x39\x4e\x3a\x83\x2d\x55\x17\x25\xd1\x59\x16\x35\xf2\x41\x5b\x9e\x5e\xd8\xd6\x7d\x7d\x26\x4b\x84\x40\xbe\x00\xa1\xdb\x41\x55\x24\xec\xf7\x94\x60\xe1\xb6\x08\x82\xd0\x44\xb5\x55\xeb\x04\xfd\x71\xaf\x17\xd5\xe8\x10\x2e\x8d\xbe\x2a\xd4\x67\xa3\xbf\x98\x9c\x2e\x77\xf3\xa3\x47\x2c\xd6\xce\xdc\xf6\xd9\x08\x91\x9d\x8f\x2c\xb3\xb0\xe9\x82\x4a\x97\x48\xbc\x01\xe7\xf6\x66\x85\x97\xb1\xca\x7f\x39\x3f\xc1\xbc\x90\x0c\x30\x6e\x72\xc4\x06\xc4\xd6\xaf\x6b\x82\x54\x88\xb0\x75\x86\x5b\x3e\xe3\xfe\xb3\x9d\xb9\xdf\xf0\xd3\x79\xf6\xdf\x4c\x3e\x3f\x39\xfb\x5e\xdc\x4f\xff\xc7\xe3\xfe\xff\xcb\xd7\x2f\x1b\xfc\x9f\xa7\x2f\x9f\xff\xf0\xff\x7f\x8f\x1f\xb7\xb0\xdc\x0c\x50\x7d\xe7\xea\x9a\xa6\x83\x79\xd6\x79\xfe\xbc\x16\xaa\x3c\xfd\xf9\xe7\x9f\x31\x54\x09\x77\x4e\x7c\xcd\x9f\xb1\xea\xb2\x9a\x47\x95\xbb\xa1\x18\x77\x17\x67\x68\x9a\xf3\xf1\xed\x7e\x23\x28\x30\xed\x63\x9c\xa0\x91\xc7\xff\xdd\x29\x41\xab\x6f\xcc\xc0\xf9\x0f\xcf\x03\x6a\xd5\xa1\x9b\x1f\x87\xf0\xfe\x43\x31\xc9\xbe\x05\x27\xa8\x6d\xe7\x04\xad\xf3\x78\xec\x98\xa0\x4f\x64\x05\xa5\xfd\xfd\x9f\xff\xcd\xe4\xf3\xce\xac\x58\x71\x45\xf9\x8e\xa7\x4a\xa1\x09\xd6\x98\xa0\x9e\x8c\x34\x22\x6a\xa7\x47\x8b\xae\x44\x24\xd8\xc0\x80\x80\x27\xca\x34\x0c\xf3\x99\xf1\x61\x02\x98\xc5\x2d\x6a\x06\x84\x92\x93\x92\x0d\x35\x7f\x39\xab\x6b\x10\xe8\xec\x41\x6f\x6d\x40\x74\x52\x3a\x2b\xdd\xc1\x7f\xaf\xbd\xd7\x1a\xcc\x0b\xa4\xc7\x45\x2d\x03\xba\x1d\x6b\x88\x64\x6b\x5b\x9e\xd6\xee\x0d\xd7\xfb\x31\xf2\x8d\x77\x0c\xd1\x15\x11\x6a\x54\x24\x3a\x9a\xef\xba\x70\xa9\x6b\x90\x5f\xcf\xfc\xef\xf1\x8e\x91\x2c\x54\xf4\x09\xcc\xc2\xb3\x03\xe5\xf8\xaa\x75\xdf\x61\xdf\x50\xe2\x9b\xea\xfb\x4f\x58\xc1\x71\x3e\xec\xad\x3a\x84\x80\x24\xe7\xbe\xbc\x88\x6c\x15\x6f\xef\x09\xe5\x05\x05\xb2\x23\xe0\x32\x1e\x1e\x1e\x3a\x3c\xd3\x59\x00\xd0\xed\xe4\x7a\x7e\x6f\xca\x0a\x53\xa0\x61\x2f\x70\xaf\x4d\x0b\xb0\xd6\x16\x46\x57\x50\xe6\x2d\x4b\xba\x1b\xb9\x43\xa6\xcd\x78\xf4\x3b\xe2\x03\x29\xb5\x4f\x6f\xf3\x5e\xe2\xd9\xff\xd6\xbf\x3a\x57\x93\x7e\xef\xe3\xd5\xf0\x72\xf8\x61\xd0\x1f\xab\xcb\xc9\x79\xe7\x1f\x81\x71\x76\xc7\x97\xfd\xe0\x99\xfd\xc1\x33\xfb\xe8\x4f\xe7\x59\xf7\x7a\x7c\x79\x72\xfa\x1d\xd2\x7e\xfe\x67\xbf\xfd\xff\xf2\xcd\xd9\xe9\x59\xcd\xfe\x3f\x7d\xf3\xe6\x07\xff\xeb\xef\xf2\xd3\xbd\xbe\xbe\xec\x33\x21\xe8\x78\x78\x33\xea\xf5\xbd\xb0\x96\x14\xa8\x39\x51\xdd\x75\x99\x66\xea\xf4\xe7\x04\xec\x7f\x75\x8d\xa6\x52\x69\x74\xad\xee\x63\xa6\x4b\xb3\xd8\x64\xd9\x56\x4d\xcd\xa2\x28\x9d\x69\xf9\x90\x67\x85\xa6\x58\x69\x04\x99\x79\xbf\x8d\xfe\x8a\x2e\x41\xe3\xba\x24\x08\x95\xdf\x95\xc6\x10\x24\x54\x22\xa0\xf7\x53\x6a\x40\x99\x3e\xca\x82\x17\xa5\x9a\xe9\x1c\x32\x79\xee\x51\x7b\xe9\x38\xbc\x39\x48\xf7\x72\x4b\xf9\x98\x83\xfa\x07\x09\x94\x38\xed\x70\xb4\xff\x5d\x94\x86\xa9\x15\xaf\x89\x0c\x1d\x56\x39\x80\x56\x8b\x37\xb7\x21\xea\x84\x2c\x89\xdd\xf5\x9a\x62\x36\x9b\xca\x94\x94\x02\x3d\x3a\x84\x5f\x1f\x1e\x87\x8a\x0f\xf7\x45\x9b\x7c\x66\x2c\xc2\x3e\x04\xe2\x27\xb5\xf4\x10\x4a\x3f\x8c\xd1\xb9\x91\x85\x74\xf8\x2a\x2f\x29\xd3\x92\x05\xc4\x27\xc8\x7a\x79\x8e\x5d\x71\xcb\x1f\x88\x5c\x25\x70\x16\x62\x8c\x1f\x60\xfd\x32\x45\x88\x41\xc6\xbd\x64\x28\xfb\xda\x7b\x2f\x66\xe4\x11\x44\xf5\x1b\x46\x21\xd0\x40\x14\x8b\x63\x80\xbc\x86\x5a\x79\xb6\xc7\x1b\xc6\x76\xf8\xc0\xa3\x43\x56\x1b\x3a\xee\xa8\x2e\x45\xe6\x39\x47\x47\x7f\x62\x42\x27\xd7\x80\xc3\x2e\xc7\x8a\x6a\x5f\x4d\x94\x19\x28\xc1\xe9\x6c\x5d\xca\x13\xcd\xa2\x8c\x65\x74\x93\x8f\xe3\x99\x3b\x33\x07\x12\x10\x2a\x62\xf6\xc5\x8a\x10\xac\xfa\x09\x69\x01\x21\x79\xb5\x41\xa8\xff\xda\x94\xbe\x8e\x59\x11\x11\x56\x21\x55\x3d\x7d\x6f\x43\x91\x3f\xa2\xb3\x00\x5f\x8d\x6f\x58\x89\xe2\x89\xd3\xce\x99\x82\xd9\x45\x76\xed\xb5\x86\x78\x1e\x92\x15\xe2\x77\xbd\x55\x47\xfa\x38\xe2\x0e\xc0\x6a\x7f\x9a\x23\x68\x71\x02\xf6\x0d\x05\xd6\xb8\xc0\xfa\x28\x3d\xc6\x77\x63\xce\x09\x1e\xcc\xc2\x71\x50\x3f\xf1\x10\x73\x92\xe9\x19\x82\xb5\x12\x60\x1d\x84\x69\xe8\x3e\xce\x52\x7a\xa1\x2a\xe8\x8d\x6e\x86\x1d\xa5\xe9\x31\x53\x0c\x39\xab\x99\x3f\x78\xa5\xab\x8a\xc8\x68\x35\x0b\xe2\x47\x24\x13\x3d\x48\x34\x4c\x37\x15\x0d\x56\xc4\x35\x13\x15\xd7\x40\xbe\x36\x78\xe1\xe4\xd5\xd5\x04\x1b\xe3\x11\x65\xc7\x54\x76\xf4\x3b\x6c\xef\xb4\xad\x07\x99\x46\xe3\x77\xeb\x40\x78\xe1\xe3\xdd\x97\xe6\xee\xca\x92\x14\x89\x7d\x5e\xb4\xd2\x5f\x9c\x37\xca\x79\x06\x44\xab\xc7\x99\xc1\xa8\x3f\xc2\x1c\x7b\xa1\x0e\x7b\xe4\x2d\xc9\xf5\xd2\x32\x32\xf5\x57\xc6\xd2\xed\xcd\x45\xc4\x9a\xe8\xb5\xfb\x68\xb4\x10\xd3\x0f\x15\x37\xe9\xbd\x40\x0f\xd0\x8e\x11\x1a\xf8\x52\x1d\x9e\x9b\x75\x56\x6c\x7d\xd3\x68\x02\xec\x94\xeb\x94\xdf\x23\x9d\xcb\x05\x72\x19\x51\x52\xce\xb5\xb3\x34\xd6\x00\x88\x06\x90\x29\xe6\xde\x64\xc5\x1a\x11\x8d\xa3\x7f\x3a\xa7\x32\x4a\xef\xbd\x35\xeb\x49\x12\x2c\xf6\xc9\x91\xf3\xc1\x3f\x75\x63\x9b\x42\xd3\xc5\x22\x6e\x16\x09\x00\x43\x73\xa6\xee\x94\x25\xac\x6c\x51\xde\xe9\x9c\x88\x80\x99\x66\xd7\xb5\x7b\xf4\x4f\xe7\xf8\xd5\xda\xaa\x07\xe3\xfc\x40\x4b\x9c\x3d\x38\xde\xf4\xdf\xbe\x4f\x88\x0e\x68\x6f\x1b\xa8\xd4\xba\x49\x77\x20\x93\xa3\x88\x1d\xc8\x73\x0a\x91\xc1\x90\xbc\x52\x87\x97\xba\xbc\x33\x65\x1b\x99\x32\x9f\x60\x80\x0a\xb1\xb5\xc1\x28\x1b\x03\x8d\x93\x13\x1c\x75\x77\xac\xcb\x04\xff\x6e\x3b\xc2\xb7\xe4\xb5\x3a\x8c\xa6\x17\xb6\x25\xaa\xc1\x52\x55\x91\xa0\xda\x3e\xc7\xa1\xfc\x1c\x24\x6a\x21\x77\x01\x6d\xcd\xb6\x82\xfa\x0e\xfa\xbb\xad\xca\x0d\x52\x30\xd7\xba\xae\xa3\x3e\x2f\x29\x89\x8a\x58\x56\xd2\xcc\x87\xcc\xb1\x35\x25\xa1\x99\x00\x3a\x92\x78\xfd\xf0\x19\x83\x5f\x71\xdb\xae\x35\x12\x86\x4b\x36\x93\x56\x58\x5e\x71\x92\x43\x23\x78\x84\x76\x50\x37\xc2\xb2\x4d\xef\xb8\xd5\x6e\x43\x73\xcf\xce\xcd\x03\xde\xe0\x8d\x99\x38\xa9\x87\x71\x49\xb4\x66\xbc\xf9\x20\x04\x96\x3c\x4d\x1c\x5a\x22\x74\xea\x35\xba\xc2\x8f\xc5\x9b\x86\xc1\x81\xf3\xc2\x7d\xab\xfb\x14\xb2\x1e\x70\x22\x2c\x02\x94\xa8\x66\x6c\x69\xeb\x91\xaf\x4c\xf6\x18\x62\x0d\xde\x3c\x68\xab\xd4\x0f\x48\x9f\xb6\xd7\xe5\x5b\xb5\x59\xcf\x75\x45\x91\x91\xf5\x5d\xa9\xe7\x68\xf8\x49\xfb\x29\x68\xc9\x7f\xd5\xab\x31\xa8\x2b\xb5\x4a\x5b\x0b\xb8\xfc\x33\x98\x39\x87\x0e\x1e\x01\x35\x3a\xb2\x00\x58\xc1\xba\xca\xa2\xfc\x12\x0e\x29\x48\x5a\xe3\x61\x80\x71\x2d\x06\x4b\xc1\x64\x81\x1b\xe4\x37\x43\xc5\xd7\x6f\xe9\xc8\x30\xa2\x7f\x50\x87\xe2\x89\xf2\x68\x00\x30\x01\xb8\x1b\x02\xd7\xb1\x7b\x4c\x19\x5e\x11\xe1\x3e\x56\xfa\x0b\x04\xb1\x22\xda\x52\x92\x9a\x15\xb4\xb1\x59\xe6\x2e\xd9\x80\x2a\x62\x98\x8f\xce\x1d\xd8\xe0\xac\x14\x8a\x66\x01\xd4\x34\xf7\x16\x3f\xaf\x42\x3b\x2b\xd3\x75\x65\x7d\x84\x9b\x09\x10\x25\x6e\x0c\xf7\x7b\x5b\xe9\x2c\x00\xc9\x74\x84\x60\x39\x12\x23\x70\x1c\x7a\xea\x67\x22\xdb\x2e\x4a\xf8\x8f\x72\x27\xed\xb6\xa6\x4a\xc6\xaf\xa0\xdf\xc6\x00\xb9\xb8\x0d\x48\x7a\xea\xef\xf3\xc7\x14\x14\x5f\x30\x07\x39\x3b\x13\x65\x91\xd9\x84\xd4\xdf\xdd\x3f\x32\x98\x8c\xcc\x33\xc0\x24\xd2\xc0\xba\xc3\xfd\xe2\xf6\x65\x20\x33\x4b\xc8\x24\x3a\xa4\xbf\xd4\xd7\xf5\xba\x78\x70\xee\x50\xf3\x34\x02\x76\xa5\x99\x66\xef\x0c\x7f\x49\x6a\xbf\x2b\x9d\xeb\xbb\xa0\xf0\x0f\x4c\x0a\xd0\xe8\xc4\xf3\xe3\x22\x6f\x59\x55\x6a\x7c\xaa\x37\xa3\xa1\xd5\x6e\x41\x00\x03\x36\x71\xa3\xab\x45\xba\xa8\xa0\x78\x6f\x06\xe7\xf7\xab\xe7\xff\xf7\xb1\x67\x6a\xa6\xd0\x74\xb1\xa9\x3c\x4c\xc8\x2e\x35\xc5\x48\xa7\x26\x37\x8b\x14\x0a\x3b\xa2\x07\x8a\x36\x71\x72\xe8\xda\xe7\xb7\x6e\xac\xb1\xef\x54\x2f\x64\x75\xfe\xa9\x46\x6c\xfb\x9b\x48\xb5\x71\x45\x36\x18\xb5\x13\x62\x67\x70\x76\x12\x01\xee\xdc\x3e\x86\x26\xe3\x8c\x98\xf8\x6b\x84\x2c\xde\x3d\x6e\x31\xe4\x88\xa0\xfb\x64\x17\x43\xb7\x20\x1f\xcf\x84\x60\xa8\xb0\xc6\x8b\x05\xb6\xf5\x27\x74\x10\xdb\x1c\x14\xfa\x58\xca\x8a\x11\x54\x92\xf7\xe6\x5a\x83\xaa\xc2\x79\xf5\x51\x28\x9a\x5d\xbb\xb3\xce\xa9\x4f\x58\x80\xfd\x23\x25\xdb\xeb\x80\xe2\xda\x63\xeb\xf9\xca\x9a\x21\x6a\x8b\xcc\x64\xdb\xaf\xb0\x0a\xeb\x40\x0f\xc1\xdd\xab\xa0\xec\x1e\xb6\x8e\x7c\xe6\xfd\x52\xa5\x60\x91\x50\xca\x20\xe6\xf1\x26\x7a\xe8\x00\x7d\xae\x7b\xa0\xa6\x26\xb3\xcc\xda\x13\x1e\xc3\xea\x59\x04\xa9\x17\x28\x87\x68\xfd\xe8\x50\xa1\xf0\x36\x16\xb7\x6b\xcc\x86\x7c\xbe\x93\xec\xb6\xed\x8e\x3d\x0c\xb8\xef\xc4\x77\x83\x57\xd5\x94\x9a\xde\xc7\x54\xbc\xa8\x9f\xd9\x91\xed\x88\xb3\x5a\xe6\x45\xeb\xfc\xc5\x9e\x4f\xf9\x29\x04\xc4\x8d\xf3\x72\x27\x11\xf1\x7e\xee\xe1\x3a\x6f\x9b\x17\xc7\xd0\x32\x1f\x8e\x3b\x2c\x93\x8f\xbe\x86\x43\x5d\x74\xd6\xec\x18\xab\x8b\x4d\x05\xa9\x15\xe7\x50\xcc\x66\x9b\x52\xc3\x3f\x83\x18\x77\x96\xc5\x73\x38\xd4\x75\x01\x76\x0a\x8f\x78\x4a\x2f\xc3\x0e\x51\x2c\x70\x62\xc2\xc7\x7e\x8a\xd2\xf5\x88\x0d\x64\x44\x53\x2d\x89\x17\x0f\x38\x61\xc1\xe7\x49\xa0\xfe\x83\xa0\x08\x8f\x2e\x5a\xa5\xba\x2c\x43\x34\x4a\xd4\x21\x84\xf4\x74\xd3\x11\x54\xf3\x0d\x96\xd2\x61\x2b\x28\xd6\x95\xe6\xaa\xff\xeb\x32\x9d\xa6\x95\xea\xfa\xb5\x85\x96\xec\xa2\xd5\xb4\x03\xf2\xa3\xda\x17\x7a\x72\xd0\xb3\xce\x99\x9f\x15\xe8\x48\x46\xf3\xea\xb7\x2e\x6a\xab\xab\xd4\xba\x2d\x88\xaa\x17\xe3\x7d\x9d\x47\xda\x6d\x5f\x6d\xe4\x12\xb5\x2f\x40\x28\xa3\xb0\xe5\xe3\x85\x04\x64\x22\xee\x45\xb0\x4f\xe1\x47\x98\x79\x6d\x2e\x84\xf8\xa3\x37\xf2\xd2\x3c\x7a\x11\x58\x69\xf7\xa9\x46\xce\xa2\xb2\xc8\xd3\x59\xec\x20\x02\x9b\x66\x38\x3a\x10\x02\xac\x1e\xcc\x54\xd9\xb4\x32\xc7\x8f\xf1\x0e\x61\x80\x31\x3e\xf8\x22\xc6\x19\xab\xac\x01\x77\xb6\x5a\xc6\x5c\xbc\x20\xcd\x90\xf8\x88\x81\xa8\xcb\xc0\x17\xdd\xc6\xca\xfb\xce\x59\x82\xb5\x5d\x5b\x56\x82\xbe\x5b\x26\xc6\xa1\xfb\x5a\x7a\x7d\x5f\x6f\x86\x4e\x04\xd8\xb3\x55\x50\x2f\xa1\x2d\x2c\x06\x9a\x46\xf5\x51\x83\xed\xe1\xc1\x64\xf7\x46\x1d\x9d\x9e\x1d\xab\x55\x91\x57\x4b\x1b\x7c\x39\x5e\x92\x60\x98\xea\x8c\x1e\x83\x27\x0b\x98\x6a\xc8\xa2\x81\xef\x32\xe5\xbb\x78\x83\x48\x91\xc4\xb9\x65\x0a\x4b\x8f\x30\xfe\x0a\xd8\x11\xd0\xcd\x4f\x68\x4d\xe2\x39\x02\x63\xb7\x2c\x1e\xa0\x2b\xa7\x94\xd1\x76\x5d\x1b\xdf\x3f\xdd\xba\x75\x97\x41\x30\x61\x53\xf1\xf8\xba\x3d\x8d\x4f\x72\xb9\xd0\x17\x90\x00\x88\xd3\xc1\xda\x1d\x44\x9d\x59\xb1\x7a\x86\xf3\x13\xf1\x3c\xcf\x22\xa3\x1f\xca\x8f\x80\x0a\xc3\xf7\x7a\x7d\x83\x9c\xef\xfd\xfe\x34\x97\x8e\x51\xd2\x44\x9c\xe7\xd9\x36\x11\x1b\x56\x60\x30\x65\xb0\x0e\x07\x00\xe1\x69\x9e\x65\x83\x03\x2d\x69\xee\xe9\x27\xa2\x13\x28\x89\xc3\xe9\x8f\x2c\x6a\xa8\xfa\x08\x1c\x0e\x8f\xac\x25\xd8\x35\x64\xef\x16\x39\x0c\x18\x26\x09\x0c\x61\x78\x71\xe8\xea\x67\x19\x63\x7f\x60\x82\x03\xfa\xd6\x42\xcd\x35\x63\xac\xd9\xb7\xa1\x15\x87\x70\xf7\x5c\x84\x4b\xc4\xca\x6d\x90\x68\x37\x1d\x14\xde\x19\xdd\xb6\x08\x40\x5e\x61\xc0\xc6\xb1\x61\xdc\x2c\x39\xce\x04\xa4\xaf\x75\x4d\x18\x69\x8e\x06\xf3\x13\x5f\x0a\xdf\xb3\xd7\xe0\x44\x23\x69\x7f\x54\x1e\x02\xb0\x45\x19\xbb\x42\xb8\x44\x1a\xb1\x65\xb6\x34\x13\x69\x66\x02\x51\x2d\x4e\xc3\x66\x2c\x96\x47\x1e\xb8\xb8\xec\xac\x58\x13\xbf\x1a\x1a\xce\xda\x7a\xc3\xd9\xf7\x6f\xb4\x89\x59\x38\x32\xdc\x1d\x67\x9d\x33\xb9\x0a\xdc\x39\xb0\xbf\x73\xd3\x0a\x72\x39\x36\x9d\xa7\x58\x9d\xd4\xe8\xdb\x9d\xba\x3c\x81\xc1\x0f\x1e\x54\x96\xe6\xbe\x20\xbe\xae\xff\xfc\x11\xc0\xd5\x6c\x12\x0e\x78\x24\x82\xd0\x9b\x79\xbc\xc9\x1f\x00\x26\xde\x7b\x41\x91\x04\x84\x84\xbe\x8b\xa0\xd6\xa1\xd6\x4b\xc7\x51\x20\xb9\xe6\x50\xb4\x85\xda\x45\x6c\xd4\x2d\x94\xb2\xd8\xdc\x2d\xd5\x6a\x93\x55\xa9\x7b\x4b\x95\xd2\xe6\xda\xc0\xe2\xbd\xec\x28\x11\x34\x15\x30\x6f\x4f\xcb\x2f\xfe\x1c\x43\xda\x1b\x91\x63\xcf\xb8\xfc\x35\x51\xd3\xfa\xc7\x01\x87\x90\x78\x25\x06\x2f\xd3\xfc\x2e\xf3\x58\x3f\xd8\x35\x82\x05\xc9\xa6\x90\xe0\x38\x27\x9e\x33\xca\x94\x34\x61\xd9\xf2\xf5\xa5\x51\x8b\x4d\xe6\x0e\x14\x2a\x49\x69\x3b\x40\x21\xce\x88\x31\xe2\x28\x17\xf0\x4a\x52\xca\x82\x05\x4f\x73\xcf\x47\x49\xfa\xde\xee\x0e\xb1\x37\xa2\x2e\x14\xc6\xc6\x99\xf3\x71\x3d\x71\x31\x3c\x81\x93\x3a\x4d\xca\x0a\x54\x3c\x14\x0a\x37\xc1\x43\x4f\xf3\x4e\xdd\x64\xc0\x09\x26\x07\x19\xc6\x97\xe5\x2a\x64\xb5\x29\xbe\xd8\x6f\x01\x60\x22\xe0\xb3\x65\xae\xd9\xdd\x8d\x0b\x9d\x34\x20\x9d\xcb\x0a\xae\x5e\x69\xfc\xbc\x7a\xdd\x91\x75\x15\x13\x37\xf2\x9d\x5d\x06\x93\x67\xab\x40\x0e\x37\x67\xbb\x1b\x83\x22\x32\x4c\xce\x91\x00\x7f\x7b\x51\x42\x10\x6e\x6e\x56\x39\xf1\xf1\x65\xa9\x07\xfb\x0b\x1a\xa9\x08\x9a\xea\x3d\xfd\x66\xed\x01\x6e\x84\x35\x88\xa0\xe4\x11\x4d\x73\x75\x74\x58\xff\x8e\xc3\x63\x55\xd3\xdc\x0a\x9e\x57\x33\x24\xff\x91\x89\x5a\xbd\xb8\x4f\xa1\x6c\x81\xc9\xc4\x82\x52\x2d\xc5\x43\xae\xa6\x66\xa9\xdd\xf9\x8e\x47\x1f\xfc\x1a\xfa\xd5\x99\xe8\xae\xe9\xf8\x99\x09\x51\xea\x55\xee\x5e\xba\x85\x1d\x6b\x61\x67\x7a\xe3\x49\xb4\xed\x27\xc1\x26\x58\x63\x0b\xad\x7f\x21\x26\x88\x49\xd9\x8f\xf2\x31\x90\xc5\x0b\xde\x2c\x6d\xf8\x1e\x21\x41\xa3\x02\x67\x92\x59\x98\x1c\xb9\xff\x96\x45\x36\xe7\xd9\xa9\xcb\x15\x30\xfe\x31\x9b\x49\x18\xba\x34\x07\x76\x2a\xce\x3f\x52\x06\x53\x5b\x6b\x4a\xa0\x9f\xb8\xd3\x6e\x89\xd3\x73\xa6\x4c\x60\x1f\x40\x9f\x2d\x5f\xc0\x3c\xc1\xbf\xd4\xf0\xb4\x7e\x59\x86\xa9\xfc\x64\x34\xae\xd8\x34\xbe\x07\x1c\x37\xf6\x6e\x7f\x03\x1e\x57\xc6\xec\xfc\x4a\xfb\x0e\x48\xdc\xb8\xa1\x5f\x09\xc5\x15\x9d\x18\x61\x71\x69\x06\x37\xb1\xb7\x3c\x7b\xbe\x0e\x6a\x1b\x3b\x22\xfb\xa1\xb6\x7f\xe8\x08\xcd\xe6\x5b\x40\x1d\xde\x5c\x5f\x0f\x47\x13\x84\xa9\xc7\x9f\xcb\x9d\x4a\x2c\xc9\x20\x2d\x4b\xb9\x6d\xc8\x43\xad\x4b\x73\x42\x89\x37\x67\x9d\x54\x20\x11\x03\xb1\x61\xb7\x68\x11\xf3\x84\xbf\x24\xb1\x90\x47\xde\x61\xca\xb2\x28\x7d\xd6\x6b\x93\xcd\x29\x74\xbd\xd0\x69\xc6\x78\xda\xac\xb0\x78\xb8\xeb\x4a\x33\x21\x22\x8a\x3f\xe4\x1c\xbf\x61\xbb\x06\x9b\x8d\x61\x9c\x99\x57\x7e\x0a\x27\x93\xe0\xf8\xc2\xad\x08\xd7\xb7\x7b\xbb\xd0\xbe\xa8\xc5\xea\xda\xcf\x47\x08\xec\x63\xe8\x82\xb6\x32\xe4\x18\x05\x6e\xcd\x32\xb5\x5f\x50\x3b\x79\x38\x1a\x7c\x18\x5c\x75\x2f\x55\x6f\x78\x1e\xe3\x71\x99\x58\xbe\x7b\x75\x5e\x67\x95\xbf\x4d\xd4\xcd\xf5\x87\x51\xf7\xbc\x3f\x16\xe3\x25\x89\xe6\x11\xa9\x0b\xc0\x35\xff\x5f\x3f\x8d\x3d\xf7\xf8\xd1\xf8\x58\x1d\x5d\x10\x53\x39\xa1\x68\x01\x5e\x4a\x64\xeb\x63\xf5\x07\xb8\xef\xe7\xe4\x91\x87\x74\x47\x7d\xd5\x1b\x5e\x5e\xba\xdb\x7e\xe9\x5f\xde\xaa\x51\xff\xa2\x3f\x1a\x01\xc2\x55\x75\xc7\xea\x10\x6e\x3a\x3c\x16\x04\xfd\x0c\xd4\x55\xdd\xcb\x4b\x09\xfe\x25\xa1\xec\x20\xf4\x9c\xb4\xb0\xe4\xff\x56\x64\x71\xe3\xe1\x6d\x58\x63\xd7\x95\xdd\xc9\x60\x7c\xd1\xed\x4d\x86\xa3\x5b\xf5\xe7\x9b\xee\x57\x60\x90\xaf\xce\xd5\xd5\xf0\x6a\x70\x75\x31\x1a\x5c\x7d\xf0\xa8\xde\x88\xf4\x1e\xf4\xb0\x3b\xd4\xa5\x5e\xb0\x9d\x9a\xa9\x26\x1f\xbb\x13\x68\xff\xc5\xcd\x15\x8d\x42\x90\xce\x06\x3d\x83\xfa\x74\x01\x0e\xfc\x4f\xfd\xfe\x04\x05\xb4\x89\xaf\xdf\xbd\x7a\x8c\x10\x5d\x7e\xe2\xf0\x5a\x88\x6d\xef\x78\xce\xfb\xbe\xba\xb9\xf2\xd8\x61\x84\x76\xf7\x47\xa3\xe1\xe8\x44\x5d\x8c\xfa\xfd\xf0\xc0\xf3\xfe\x45\xbf\x37\x19\xef\x69\xd2\x7b\x37\x29\x46\x23\x50\x43\x87\xdd\x65\x38\xea\x5e\xba\xfb\x3f\x8f\x06\x93\x49\xff\x2a\x16\x97\x1f\x01\xca\xb7\xd7\x57\x1f\x06\xbf\xf4\xaf\x58\x6c\x00\x50\xc4\xdd\x2b\x9e\x7f\x41\x06\x7d\xd4\x77\x93\xa2\x7f\x35\x41\xc1\x76\xc4\x77\xb3\xe8\x7d\xb4\x8f\x09\xc0\xf1\xe0\xca\x5d\x31\xee\x43\x8b\xc7\xbd\xe1\x75\x00\x1d\xf3\x1d\x1d\x4a\xdd\x84\x1d\xc0\x97\x49\xc5\xfb\x53\xca\x85\xeb\x42\xac\x89\xaa\xb4\x90\xa7\x20\xf8\xf2\x2a\xdf\xcc\x32\xa3\x4b\xb5\xd0\x33\x77\xd8\x43\x92\x50\xa7\xe5\xac\xd4\x8b\x4a\xe5\xfa\x3e\x65\x56\x81\x98\x6f\xd6\x6e\x6d\x65\x56\xc8\x11\xa1\xd3\x52\x55\xa5\x5e\x2c\xd2\x99\x4f\x03\xae\xb0\x16\xdc\x06\xb5\xe8\x19\x73\xad\xd3\xce\xd8\x1e\x34\xc6\x2d\x34\x03\x40\x6a\xa1\xe6\x46\x57\x4b\xf0\xd7\x2c\x98\x0e\xa8\xb4\x01\x2f\xb5\xce\x68\x33\x6a\xbd\xdc\xa2\x54\x36\x70\x3f\xdf\xa7\x65\x91\xaf\x90\x93\x15\x89\xdf\xe0\x00\xf9\xb9\x23\x94\x24\xc8\x31\xfe\xb9\x73\xaa\x06\x12\x3e\xe7\x19\xab\x69\x97\x24\x29\xc5\xc5\x26\x67\x9d\x6d\x67\x09\x09\xb5\x9e\x29\x11\x7e\xc4\x1f\x30\x35\xb3\x62\x45\x45\x1b\x8f\x83\xf6\x92\x60\xe7\x80\x2e\x8f\xb3\xd6\x91\x46\x82\xc0\x1e\x55\x65\x56\xeb\x8a\x8a\x9a\x67\xde\x61\x22\x45\x4d\x8f\x6e\x8b\xfc\x55\x86\xe7\x78\xdb\x82\xe1\xb8\x46\xb5\xa3\x1d\xdf\x61\xb8\x38\x9c\xd8\xed\x97\x39\xb3\x58\x00\x40\xf3\x82\x22\x8e\xfc\x45\x69\x7e\xf7\x0e\x92\xac\xb3\x63\x65\x37\x76\x6d\xb0\x29\xde\xc2\xdf\x13\x26\xd9\xed\x4b\xef\x69\xce\x26\xaf\xd2\x0c\x12\x09\xee\x57\x73\xd3\x50\x2f\x30\xd4\xe9\x69\x08\x69\x6a\x37\xc3\x4a\xc8\x0c\xa3\xf7\x4b\xb3\x45\xcf\x57\x69\xee\xde\x8a\x0c\xa8\xfa\xce\xe4\xb3\x2d\x43\x5d\x0c\x78\x25\x7f\xdd\x94\xa9\x9d\x63\xaa\x16\x5a\x89\x1d\x9e\xa5\x8b\x8a\x87\xdb\x7d\x33\x98\x52\x5a\xc6\xac\x21\x4c\x4d\xe2\x4f\xe2\x1a\x8f\x0b\xf4\xd6\x68\xc8\xd7\xa6\x2b\xaa\xa8\x67\xa9\x0b\x0e\xff\xac\x0b\xd4\x8f\x87\x29\x45\x89\x0f\xc6\xa2\x10\x19\x3f\xe5\x7a\xc9\x2f\xa4\x28\x7c\x4c\x55\xb1\x20\x5f\xd5\xac\x24\xaa\x27\x46\x0f\xdc\xac\x39\xdd\xd5\xd6\xbf\xc8\x37\xe7\x7a\x15\x22\xb0\x1e\x39\x0a\x78\x03\x67\xa7\x80\xba\x5f\xc4\xa7\x2b\xe4\xdc\xc0\x7f\x2c\x4a\x0e\x27\x25\x28\xc7\x60\x37\x2b\x13\xcf\x90\x26\x9f\x49\x12\x63\xd5\xa2\xc9\x22\xc6\xbd\x7d\xc6\xf0\x6a\x83\xfe\x76\xe3\x56\x1f\xb6\x30\x24\x94\x87\xd8\x31\xf3\xa6\x5b\x3f\x10\xdf\x79\x14\x06\xdc\xb7\xb4\xa0\x6c\x7d\x45\xed\xfa\xd2\xbc\x26\x4a\xde\x20\x82\x07\x52\xf5\x72\xc3\xda\xe4\x94\xb7\x84\x68\x1a\x1b\x85\x44\x68\x53\xcb\xcf\xd4\x69\xf9\xc1\xd7\x2a\xcd\x3a\xd3\xb3\xfd\xdb\x0c\xfa\xf5\x48\x3c\xc2\x1b\x06\x06\xa3\x10\xfd\xc1\xac\x02\xa0\x39\x7c\x57\x54\x29\x06\xc9\x17\xe0\xec\xf1\x4e\x47\x5f\x1e\xc0\x4b\x52\x6f\xc9\xef\xed\x67\x42\x99\x28\xaa\x1f\xea\xa8\x9b\xab\xf3\xfe\xc8\x1d\xf9\xbd\xc1\xa8\x77\xf3\x69\x3c\xe9\x5e\xf5\xfa\x63\x3a\xa5\xf1\x2c\x6f\x16\x5d\xb5\x96\x58\x71\x05\xd6\xee\x02\xab\x9a\x0a\x0f\x68\x38\x5d\x76\x41\x55\x08\x84\x8c\x62\x51\x1e\x30\x91\x6e\xf0\xbf\x07\x57\x42\x99\xe8\x86\xcc\x82\xc8\x90\x49\x14\xb5\xcd\x59\xd6\xee\x33\x27\x1f\xfb\xa3\xfe\xf0\x22\x54\x48\xe1\x97\x76\x45\x19\x55\x28\x98\x0a\x76\xfa\xee\x2a\xa9\x63\xa8\x00\x3b\xbf\x71\xa6\x54\x50\x4a\x92\xa5\x53\xa2\x0c\x0a\x3a\xee\x37\x08\x06\x91\x59\x3a\x71\x0e\x84\x1b\x0b\xaf\x18\x75\xd1\x1d\x5c\xde\x8c\xc0\x0a\xea\x8f\xc7\xd4\xb1\x6c\xcb\x92\x23\xe1\x4c\xc9\xf3\xdb\x98\x18\x16\x27\x38\xef\x97\x55\xe1\x76\xf7\x10\xca\xa0\x6c\x04\xc4\x38\xb2\xc0\xd3\xde\xf4\x3c\x21\x1f\x8f\x8a\x94\x4a\xaf\x8a\x0d\xee\x5c\x08\x17\x9a\x17\x59\xa6\x4b\xab\x8e\xfe\xaf\x57\xcf\x3b\xcf\x9f\x23\xa0\xeb\xf4\x79\x47\x4d\x98\xbc\xbb\x5e\x2f\xe2\x79\x2d\x30\x2e\x27\xf4\xfe\x3d\xa1\xac\xe0\x33\x47\xb1\x19\xf7\x2f\xae\xc1\xc6\x6a\x91\x84\xfe\xc3\x57\x93\xb8\xdf\x7c\xd2\x33\x35\x1c\xab\xbf\xc8\xff\x56\x63\x53\xde\x9b\xf2\x30\x16\x40\xdb\xfd\x7c\x77\x42\xe1\x72\xf4\xa9\x81\xa3\x99\x97\x53\xc9\xb6\xfc\xde\x4f\xee\xe6\xc3\x63\x96\x8d\x10\xbf\x64\x8f\xf6\x37\x14\x82\xd7\x2d\x28\x11\x5b\x88\xc0\x10\xd3\x2d\xeb\x0b\xd2\x5e\x25\x98\xd5\x89\x3f\xa5\x4a\x57\xcc\x0b\xe7\x27\x80\xc0\x27\xef\xe6\x56\x27\x1b\x55\x3b\x8b\xb2\xb0\x31\xd5\x79\x9c\x8f\x84\x03\xee\x59\xb8\x73\x51\x94\x2f\xca\x39\xe5\xa5\x20\x25\x89\xb3\xe1\xb4\xa3\x86\x8c\x0b\xe3\x68\x16\x22\x7a\xac\x20\xd8\x4f\x48\x0b\x13\x3f\xac\x32\x6e\x1f\x56\x04\xfa\xa1\x23\xe8\x09\xe8\x78\x6f\xdd\x14\x65\x4b\xd8\x91\x8b\x8d\xe2\x7b\x0e\x09\xa7\x8e\xd1\xb9\xe6\xdf\x23\xa1\x85\x58\x7b\xab\x5e\x9c\xd4\x8c\xd9\x79\x5b\xb6\x16\x79\x4e\x44\xb8\x8a\xed\xbd\x9d\x0d\x68\x03\xcc\xe2\x07\x06\x89\x26\x0c\x2d\xd1\x44\x2a\xac\xa9\xd7\x89\xc4\x20\x1c\x11\xda\x76\x1f\x26\x1a\x51\x2d\xcd\x8a\x26\x51\xc7\x4f\x9d\x08\xc3\xf5\xb7\xdb\x25\xb5\x74\x4c\xe8\xdd\x5d\xfd\x09\xf3\xe8\x2c\xd2\x52\xf3\xd0\xd1\xb3\xce\x69\xf4\xfb\xbf\x49\x5b\xad\x86\x51\x89\x47\x9b\x6d\x38\xa9\xf3\x4c\xe6\x1e\xa6\xd6\x9d\x3f\xc7\x64\x8f\x74\xbd\xc7\x4c\x11\x2c\xb9\x91\x4f\xf2\xf7\x38\x8f\x06\x66\x00\x49\xd0\x50\x81\xc3\x8b\xe7\x6a\xae\xb7\x10\x34\x03\x87\x0a\xfa\xf4\x01\xa3\xde\xf2\xfa\x3a\x74\x4c\x98\xcd\xe4\xec\xe2\xa1\xc0\xee\x40\x5a\xce\x36\x2b\xcc\x46\x01\xcf\xd9\xac\x4c\xa7\x71\xa2\xe7\xf4\x45\xe7\xd5\xd1\xf4\xd8\x39\x32\x31\x90\xe2\xeb\x7a\x25\x91\x72\x60\x6a\xbe\xf1\x18\x46\x94\xea\xa9\x87\x83\x81\x26\x1c\x4b\x08\x58\x70\x08\xb8\xe1\x30\xe1\x23\x3d\xc6\x38\xda\x2e\xe6\xc3\x99\xea\x93\xe5\xb9\x88\x67\x06\x18\xf2\xc2\x76\xc7\xe0\x73\x48\x0c\x88\x3e\x03\x75\x33\x48\x53\x92\xf8\xd1\xb7\xb1\xc6\x1b\x80\x3c\x70\xed\x6d\x55\x16\xdb\x1a\x9a\xb1\x71\xb5\xaf\x8d\x4a\x73\xa4\xaa\x5a\x17\xd6\x1a\x24\x07\x09\xa9\x60\xe4\x38\x08\x4e\xa4\xb7\xdf\xe3\x35\x07\x7b\x3c\x64\x7a\x31\x72\x0f\x09\xe6\x6c\xeb\xd7\x07\xd2\x8f\x54\x45\xa4\x83\x87\xf6\xc4\x53\x55\xf2\xd4\x75\x10\xee\x81\xf7\x25\x94\x5c\x4d\x4b\x95\x6b\x24\x37\xb4\x4b\x08\x72\x04\x29\x3f\x72\x19\xa6\x66\x5b\xd0\xc2\xdd\xf3\x8a\xb8\x41\x12\xf3\x3e\xc5\xf9\xe8\x85\x58\xaa\x22\xc0\x03\x5e\x80\xf8\xdf\x1f\x12\xf5\x73\xa2\x4e\x9f\x27\xea\xf4\x34\xc1\x49\xe3\x86\xe3\xf4\x45\x47\x5d\x35\x75\x56\x22\x85\x1d\x08\x1c\xc1\x15\x8b\xa2\xac\xc9\x77\x47\x19\x3f\x36\xa9\x38\xcf\x50\x94\x15\x63\x66\x21\x55\xec\xfc\xbc\x0c\x57\x24\x7f\x24\xd7\x0a\x7b\x69\x30\x66\xa2\x0c\xaa\x29\xee\x30\x81\xcd\x9e\x72\x91\x7b\xfa\x87\xdb\x1e\x48\x65\xcc\x5f\x37\x73\x72\xd1\x1a\x72\xb0\xa5\x1b\x07\x33\x07\x5f\x5f\x76\x01\xee\xbe\x2f\x6a\x92\x75\x7e\xbd\xbd\xe8\x9c\xaa\x0f\x3e\x80\xa0\xfa\x39\x80\xbb\x4b\x4a\x17\x34\xf0\x3b\xea\x50\x08\x01\xa4\x95\x59\x1d\x42\x25\x96\x59\xf0\x51\x75\xd1\x1d\xa9\xb3\xce\xe9\xf3\xd3\x8e\x7c\xac\x27\xdf\xc0\x6f\x9e\x2d\x73\x88\x75\x01\x13\x65\xac\x15\x5c\x03\x36\x21\x64\x49\x54\xaf\x72\x92\x75\x63\xdd\x2e\x06\x1a\xf5\x01\xc0\x18\x49\xf3\xc4\xed\x8a\x27\x37\x1c\x32\xfc\x8c\xad\x14\x37\xc8\xc2\xd0\xd5\xda\x09\x46\x46\x9b\xfe\x43\xcb\x28\xbb\x5e\x70\xb3\xf2\xf4\x54\x1d\x4d\xfc\x63\xce\x75\xa5\xd1\xe6\x84\xbf\x9d\xa9\x23\xb6\x7f\x3d\x33\x21\xfc\x19\x69\x25\xcf\x8d\x1b\x3f\x0e\x35\x9c\x9b\x05\xe5\xb2\xca\xd9\x52\x5b\x63\x13\x75\x0e\x7d\xfd\xea\xac\x73\x76\xf6\xe6\xe4\xcd\xf3\xd3\x57\xf5\x77\xa9\x93\x13\x90\xc0\xa1\x4f\x1b\x54\x66\x65\xf1\xfd\x67\x67\x6f\x3a\x6f\xce\x9e\x9f\x9d\xbc\x50\x47\x23\xdf\xff\xe2\xda\x46\xc3\x50\x23\xa0\xfe\xcb\x73\x09\x07\x3b\xee\xa8\x2e\xf4\x43\x9a\xdf\x65\xce\x74\xca\x32\x75\xd3\x19\x77\x5a\xe7\x17\x97\x84\xb6\x81\x3b\x1a\xa3\x1d\x42\x50\x04\x3d\x08\xb3\xf7\x4c\x8d\x0c\x16\xab\x70\xe1\xc2\x35\x99\xb0\xb1\x25\x21\xed\x94\x10\x31\xd0\x16\x73\x76\xb8\xe9\x53\xb4\x2c\x81\x85\x43\x26\x6f\xa2\xfe\x5a\xa4\x90\x5b\xcc\xb1\x12\x4e\x3a\x22\x5c\xf7\x83\xc5\x29\x5c\x88\x83\x61\x25\x14\x72\xe3\xb2\x56\x38\xe4\x42\x52\xdb\xb7\xc6\x97\xa4\xf1\xe4\xc5\x92\x8f\x52\xd4\x81\xf8\x9c\x19\xec\xc0\x80\xcc\xe0\x43\x0b\x81\xed\x30\xed\x64\x85\x88\xe8\x9e\x17\x11\xcb\xe1\x79\x30\x04\x81\x39\xb6\x35\xb0\x02\x6d\x4b\x57\x6b\x9d\x96\xde\x82\xf4\xd9\x50\x1a\xb5\x24\x00\xa3\xc8\xb8\x4c\xf0\x3c\x22\x74\x25\xfd\x12\x23\x43\x55\x82\x3a\x10\x55\x5b\xa5\x32\x73\x1d\x6d\x95\xa7\x90\xe5\xda\x3b\xa9\x8e\x09\x70\xb2\xa2\x54\x36\x5d\xa5\x99\x0e\xd1\x6c\xab\x34\xc6\xee\x43\x95\x39\x05\x3a\xa9\x80\xa7\x86\x5e\x92\xe8\x94\x64\xef\xdb\x29\x39\xcd\xf2\x84\xfc\x95\x21\xe2\x8b\x9f\x14\x7d\x8e\xe8\xf8\x97\xea\x33\xa8\x02\x42\x95\x0c\x16\x52\x82\x11\x73\x41\x49\x03\x0f\xa6\x01\x1f\x93\x85\x48\xf7\xe9\x4c\xca\x19\x4c\xe2\x87\xda\x4b\x0f\x2e\xd4\x62\x03\xf3\x93\x9e\x15\xb4\xef\x74\x55\x53\x2b\xe7\x17\xa0\xdc\x57\xa6\x1f\xf0\xec\xb8\xdb\x50\xcd\x17\x5a\x17\xb4\xbb\xd9\x90\x9a\x61\x5e\x5d\xca\x02\x70\x69\x52\x4b\x1c\x8e\x2d\x3b\x00\xfd\x96\x58\x01\xee\x5b\xef\x3c\xd0\x86\xba\x9e\xe8\xb8\x57\x6a\x6c\xee\x4d\xe9\xf5\xb2\x9d\x21\x3f\x58\x78\x30\x07\x41\x32\x7c\xf8\x7b\x67\x60\x7b\x91\xe6\x73\xbb\xbf\x4b\x13\x51\x90\x1b\x92\xc9\xc8\xe6\x11\xe9\x78\x26\x34\x21\xe3\x07\x99\xc6\x49\x4d\xb7\x04\x85\x4c\xfd\xab\x54\xc8\x64\x72\x37\x24\xbc\x85\xf2\x94\x82\x6d\x26\x30\xf1\x67\x45\x5e\xac\xd2\x19\xd5\x64\x11\xa2\x10\xb2\x5f\xde\xf2\x27\x07\x3d\x09\xae\x51\x2c\x09\xfa\xd5\x9a\xb7\x1d\x70\x38\xf6\x0a\xf7\x21\x36\x39\x8a\x96\xba\xbe\x80\x12\x05\x2b\xab\x45\x10\xa9\x0e\x3e\x04\x02\x10\xb8\x90\x98\x28\x27\xc0\xe3\x40\xf7\xca\x73\x11\x07\xe0\x27\x5f\xfd\x82\x28\x88\xef\xa9\x0c\xd7\xb4\x88\xa1\x92\x85\x03\x9f\xec\x0e\x0a\x7e\x4a\xd2\xba\x97\x05\xc7\x40\xc8\x70\x73\xb5\x0c\x14\x3b\x88\x4b\x9c\x97\xcf\x9d\x06\x55\xb3\xb6\x1d\xce\x8c\xd5\x51\x6d\xc6\x7f\x5a\x3d\xd5\xdc\x0f\xd3\xfe\xb5\x3a\x4f\xad\x3b\x5d\xd5\xc8\xd8\x22\x43\xdc\x24\xae\xd0\xb4\xa2\xdc\x65\xa8\x2a\x9d\xd3\xb5\xa5\xbf\xb6\xfd\xc4\x41\xdc\xb6\x97\x2d\x6c\x18\xdf\x95\xfe\x42\xdc\x2a\x6c\x7f\x5d\x15\xe0\x30\xe5\xae\x39\x18\x9d\x72\x1e\xbf\xce\xd2\x45\x51\xe6\xa9\x0e\x47\x58\x78\x07\x21\xb4\x58\x59\x90\xad\x30\xce\x75\x46\xab\x92\x41\xd7\xf7\x06\xe7\x24\x55\x9e\x57\x3c\x22\x0b\x33\x07\x92\x5c\x58\xdd\x96\xbd\x68\xe8\x4d\xdf\xa0\x66\x41\x49\x6c\xda\x19\xa9\x50\xc5\x43\x77\x93\x83\x2b\x71\x45\x31\x99\x5e\x91\xdf\x23\x67\x9c\x2a\x9c\xe1\x83\x9b\x99\xf5\xb0\xcc\x01\x16\xc3\x11\xd2\x6b\xac\xb1\xf8\xe6\x43\x51\xcc\x81\xf5\x3a\xe0\x58\x00\x5e\x3c\x27\x1d\x27\x1c\xca\x37\xaa\x8f\xd8\x93\x2e\xa3\xe0\xde\x91\x09\xe4\x06\xe2\x52\x3f\x7c\x2f\x55\xd8\x1a\x57\x06\xa1\x47\xe3\x97\xf9\xed\xba\x8e\x99\xcd\xf4\x83\xad\x75\xd6\xb8\x82\x72\x71\xde\x69\xe0\x9f\xf5\xe9\x40\xd5\x5e\xa8\xdc\x51\xa0\xfb\x11\xfe\x0e\x5b\xc5\xac\xc8\x67\xf4\xf1\xb3\x22\x5f\x64\xb0\x51\x38\xab\x49\x3f\x70\xaf\x7d\x8e\x48\x47\xb2\x62\xc6\xb0\xd5\x6a\x49\x02\x0d\x60\xe3\x2c\xd4\x9f\x37\x66\x6a\x66\x89\xea\xe9\x5c\xcf\x75\x12\x17\x4d\xaa\x59\x06\x90\x25\x22\x35\x7a\x8b\xea\x19\xd4\x61\x61\x96\x2e\xd2\x72\xe5\x8f\xb5\x2d\x0b\xe6\x83\x9a\x64\x60\x6c\xad\xc5\x79\x20\xd2\x59\xab\x81\x00\xa9\x36\x3c\xdf\xa0\xad\xfd\xfc\x2e\x4b\xed\xb2\xa3\x2e\x8d\xf5\xaf\x2d\xf2\x4a\x99\x5f\xd3\x3b\xa3\xfe\xe7\xc6\x28\x80\x16\xa3\xbd\x87\x07\x68\xa5\x8c\x1b\xbe\x8d\x55\x99\xb1\xe2\xc9\x20\xb2\xfa\xab\xb1\xca\x16\x20\x80\x5d\x9a\x79\xea\x9c\x51\x93\x2b\x9d\xdf\x65\x3a\xb5\x1d\xd5\xff\xcb\xc7\xc1\xfb\xc1\x44\x75\x3b\x07\x87\x3b\x14\xc4\x98\x1c\xf7\x79\x3b\x7b\x53\x37\xcb\x18\xbb\x3e\x62\x6a\x5c\x9c\x2e\x92\x69\xc1\x36\x43\xb7\x6e\x9b\x6e\xc0\xfe\x6b\x57\x45\xee\x97\x27\x08\xd0\xa5\xa9\xd7\x48\xed\xe3\x58\x92\xac\x5f\xa8\x1a\x23\x68\x91\x64\xb1\xa3\x57\x6d\x83\x96\xd3\xac\x6c\x51\x2d\x8d\xb0\x99\x44\x1b\x46\x20\x56\x59\xa7\x29\x58\xa9\x9e\x50\xcf\x43\xb5\xad\x7a\xee\xb6\x7e\x22\x1a\x13\xd4\x61\xae\x49\xc8\x1a\xde\x12\x03\xcf\x82\xc0\x99\xb0\x24\xa5\x7e\xac\x04\x90\xcb\x2b\x20\xa3\xe9\xc1\x6b\x53\x6d\x53\x9b\x34\xf0\x6b\x12\xaa\x96\xa8\xfe\x00\x12\x6a\x6d\x68\xaf\x00\x63\xfb\xd8\x1f\xf5\xdf\x07\xf4\xd8\x18\xe0\x63\x90\xea\x6a\xe5\x9d\xf4\xaf\x0c\x99\xca\x84\xd0\x40\x7b\xe8\x26\x93\xc7\x71\x5e\xc3\x91\xba\x1a\x5e\x9d\x28\x09\xf4\xf2\x63\xc6\x92\x7b\x1e\x28\x4b\x1b\xb7\x67\xb7\xf2\xe6\xea\x9d\xdf\x7a\x85\x16\x70\x26\xb0\xf4\x8d\x9e\xee\x1c\xfe\x57\x24\x4f\xff\x07\xf8\xe9\x3c\xeb\xf5\x4e\xde\xdf\x9e\x8c\xbb\x27\x2f\xbf\x17\x07\xfc\x23\xfc\x8f\x2f\x5e\xbd\x7a\x5e\xe7\x7f\x7f\xf1\xe2\xe5\x0f\xfe\xc7\xdf\xe3\xa7\x21\xdc\xdc\xad\x7c\x0c\xfe\x64\xbc\xd4\xa5\xe9\x66\xe9\x17\xa3\x5e\x76\x9e\xd7\x2c\xb4\xc6\x9d\xbd\xa2\x5c\x17\x84\x0e\x3c\x6a\xca\x6a\x1f\x07\xb9\x77\x67\xa2\x80\x49\x80\x15\xf6\x94\xdf\x26\xff\x97\x42\x3b\xee\x6c\x04\x46\x00\xcf\x44\xa2\xe7\xee\x17\x1d\xb2\x4a\x45\x72\xac\xde\x10\x8a\x46\xfa\x80\xbe\x7f\x83\xaf\x7b\xca\xf4\xc3\xd6\x94\x27\xb3\x0c\x4e\x7a\xc1\x56\x14\xe2\x5a\x2d\xfa\xf1\x28\x68\xe5\x1c\x30\xff\x68\x3c\x85\x32\xb2\x9d\x42\xe9\x64\xa8\xba\xa4\x23\x03\x04\x6b\xe9\xc8\x68\x79\xf4\x5d\x7a\x1f\xa9\xdc\x3b\x3b\xa6\x34\x77\x1a\x22\x7b\xd1\x2b\x91\x01\x8c\x79\x98\x5b\xc4\xcf\xd3\xb2\x95\xfb\x23\xa9\xcb\x9a\x8b\xe6\xb6\x34\x88\xd9\x1d\x30\xe3\x1c\x40\x10\x0b\x11\xa6\xc7\x70\xbc\x54\xc6\x4d\x89\x19\x93\xa8\x35\x36\x59\x66\x6c\xe5\x7d\xf1\x02\x1d\xf1\xce\xc1\x0d\x1c\xd4\x8d\x77\xc6\x12\x59\xb6\x29\x2a\x5e\x1f\x58\x9e\x31\x5a\x81\x17\xad\xcb\x39\xc4\x2d\x29\x3f\xd0\x60\x3f\x41\xa0\xbd\x7b\x28\x8b\x03\x45\x55\x44\x28\x6f\x67\x99\xf8\x03\x50\x59\x4b\x8c\xc3\x92\x09\x81\x2c\x4d\xc5\x82\x85\x83\x97\xe9\x5a\x3c\xc6\x8f\x89\x30\xb6\x62\x42\x0d\x16\xa9\x8b\x5e\x1b\x44\xc4\xd8\xf8\x8e\xbe\x92\x21\x80\x93\xba\xa2\x41\xa8\xab\xc5\x9a\x1e\x14\xb6\xf2\x63\xaa\x33\x56\xb1\xb3\x54\x8d\x8c\x34\x81\x6e\x38\x96\x7a\x63\x2b\xc8\x00\xe1\x02\xc4\xfa\x85\xa2\x5c\x79\xbe\x2d\xe7\x3f\x73\x37\x77\x0e\x7a\xf1\xdb\x16\x05\xff\xb1\x28\xed\x5b\x35\x74\xbe\x76\x6d\x64\xd0\x0f\xaf\x61\x88\xa7\x1c\x63\xc6\xee\x4b\xff\x0d\xc3\x36\x6e\xee\xcb\x0f\x8f\x05\x79\x36\x20\x46\x4f\x3d\x9b\xe6\x0a\x48\xe8\x43\xe8\x91\xe3\x20\xac\xc9\xf3\x58\x77\x77\xa0\xb9\x71\x3b\x43\xf1\x69\x87\x26\x9f\x9b\x1f\x3e\xd5\xa6\xb1\xde\x89\xd4\x9d\xb4\x48\xb3\xb5\xf3\xeb\x18\x09\x0d\xf0\xa8\x01\xb2\x51\x21\x16\x87\x6b\xba\xe5\x65\x50\x96\x63\x0d\xa4\xb6\x03\xd2\x43\x40\xd8\xea\x4f\x91\xe3\xe4\x31\xb6\xa2\x2f\x67\xc0\x99\xc5\x28\x21\xdf\x8f\x58\xb1\x08\x38\xbb\x96\x56\x00\xaa\x9b\xa4\x84\xe3\xdd\xc6\xcd\x93\x76\xba\x05\x72\x62\x3c\x27\x14\xf6\x79\xaf\x77\xe2\x37\x28\x7e\x08\x69\x03\xd2\x13\x37\x61\xef\xd2\x4c\x3f\x48\x71\x97\x60\x30\x46\x2b\xa9\xa3\x3e\xb9\x2e\x98\xed\x99\x93\xea\xad\x7a\x48\xbf\xa4\x9d\x19\x6d\x20\xc8\x33\x65\x41\x31\x34\x9e\xcb\xff\x7d\x51\x94\xff\xdd\xdf\xd7\x36\xd1\x43\x67\xbe\x55\xef\xb7\xe4\x63\x40\x1d\x13\xae\x92\xda\xcc\x4f\xdc\xe9\x42\xcf\x63\x0a\x8a\xbd\x73\x5b\xf4\xe1\x5c\x74\x0b\x2a\x82\xfa\xad\xa1\x6d\xb6\x01\xc2\x33\xdc\x5e\x94\x3f\x59\xf9\x7c\x3a\x6d\x63\xa0\x77\x88\xe7\xfe\xc7\xbf\xff\xaf\x48\x49\x6d\x6a\xb0\xf8\x88\x72\xaf\x22\xf6\xf8\x94\x41\xf9\x8f\x7f\xff\x5f\xa0\x1d\xe5\xab\x89\xe8\xed\x14\xe4\x16\x31\x0f\x9e\x2e\xd1\x32\x44\x68\x1b\x64\xa1\xc2\x17\x04\x96\xb0\x47\xf7\x50\xf4\x73\x43\xc7\x2f\xb5\xe5\x4d\x06\x81\x7b\xf0\x82\x8e\xba\xb1\xf5\x92\x50\xd1\xe7\x6e\xdf\xb7\x15\xc5\x95\xc5\xbe\xb2\x10\xf6\x81\xeb\x39\x1b\x25\xce\xb9\xdb\x30\x0b\x03\x91\x8d\xd0\xe0\x7a\xa1\x2a\xed\xf0\xfc\xca\x8e\xea\x86\x36\xbb\xd7\x63\x6d\xb3\x1b\x75\x20\x85\x82\x00\x89\x4d\x48\x8a\xcb\x2a\x6d\xbf\x78\xea\x07\x88\x7f\x02\x9b\x24\x04\x45\x48\xf6\x1b\x18\x1d\x09\x9a\xd2\x39\xe8\x66\xd5\x12\x8a\xc5\x71\x28\x90\x10\x16\xc0\x5e\xa2\xf3\x03\xbb\xb6\xc9\x67\xc5\xa6\xd4\x77\x1e\xd7\x8b\x91\x2e\x4c\x0b\x52\x63\x88\x09\x02\x7b\x02\xb7\xcc\x5d\xcb\x51\x4c\xfb\xdf\xb2\x1e\x4d\x9b\x05\xf0\x64\xeb\x34\xb6\x25\x0e\xde\x47\xc4\x77\xc2\xf1\x9c\x73\x34\xe6\x88\x43\x27\x70\xde\x1e\x27\x92\xeb\x4c\x54\xcb\xed\xe2\x1d\xdf\x41\xb4\xf6\xad\x3e\x40\x1d\x1d\xc6\xbf\x38\x3c\xee\xa8\x49\xc4\x90\x06\xef\xab\xdd\xe5\x6b\x05\x2b\x53\xae\x4b\x53\x05\xa9\x49\x8c\xbe\x26\x3e\x00\xe8\x29\x37\x5a\xba\x26\x6d\xf2\x78\x20\xc8\x1b\xbb\x47\x53\xa0\xb0\x5a\x1a\xdb\xde\x1d\x21\x75\x72\x59\xdb\x1a\xdd\xeb\x61\x76\x97\xbb\x5f\xe5\x53\x33\xd1\x03\x4a\x33\x33\x60\x34\x83\xed\x49\xcc\x8e\x51\xeb\x3f\xf9\xd3\xae\x49\x81\xb2\xa3\xa1\x9d\x03\x8f\xe5\x52\xff\xf1\xef\xff\xab\x21\xa6\xab\x3b\xaa\x3b\xd7\xeb\x4a\x3e\x1d\xa9\x09\xdb\x8c\xbf\x5e\xb4\x71\x8d\x29\x8f\x3a\x12\x5b\x56\x5a\x43\xb4\x16\x25\x89\x2c\x42\xe1\xc6\x8e\xaf\x41\x20\x2b\xe6\x0c\xdb\x2f\x49\x2d\x6a\x79\xc2\xce\x9b\xb0\x36\xbf\xb3\x00\x4b\xb7\x61\xcc\x93\x20\xf5\x49\x05\xac\xc1\xa0\xf2\x44\x16\x10\x9e\x43\x1e\x5e\xda\x3b\x40\xd1\xb8\xae\x5a\x8d\x49\x9a\x3d\x1f\xba\x34\x99\x5f\x2b\x3c\x7a\x48\x30\x19\xec\xd3\x45\xdb\xec\x65\x16\xc8\x9d\xdf\xa8\xd5\x6a\x83\x15\x5c\xce\x30\xf7\xdc\x1c\xc8\x17\x51\x94\xca\xc2\x32\x2d\x0d\x01\x24\x92\xe6\xd8\xb9\x87\xa0\xac\x11\x25\x99\xe7\x8f\xbd\xd3\x6e\xf3\xd9\x92\x6c\xf5\x74\x65\xe6\xde\x67\x24\xf0\xa2\x5a\x15\xf7\x60\xde\xf9\x0a\xb2\x29\xcf\x19\x77\x3e\xfb\x85\xe9\x79\x4d\xd9\x56\x84\x85\xc8\x89\x5a\x58\x5d\x7b\x7b\x95\x99\x9c\x61\x25\x7b\x19\xa1\xaa\x68\xf9\xc6\x26\x56\xe6\xd1\x6d\x2b\x1e\x08\xf8\x8c\x59\x47\x41\x98\x08\x02\xda\x24\xee\x19\x7f\x8d\xf6\xdf\x92\xa5\x8c\x83\x6e\xdb\xf1\x83\x3a\xa8\x30\x9a\xd6\xce\x97\xc3\xc3\xa9\xb1\x67\x3a\x6b\xd5\x5a\x93\x57\x29\x64\x33\x61\xcf\xfb\x9f\x9b\xf4\x5e\x67\x3e\x4b\xdb\xde\xe6\x79\x67\x7f\x27\x62\xbb\x23\xfb\xe2\x99\x40\x3c\x30\xf0\x29\x2b\x2c\xaa\xe0\xa2\x25\x13\xb9\x75\xde\x12\x48\x5a\xd9\xba\xa3\x29\x39\x2d\x0b\x3d\x9f\x69\x5b\x25\xcd\xa9\x09\xad\xdb\xa4\x28\x20\x91\x5a\x00\x13\xb9\xad\x80\x9a\x1a\x9e\x8e\x51\x01\xd7\x08\x20\xd3\x0a\x48\x5d\x48\xe3\xe8\xa9\xc9\x88\xe9\x46\x57\xe6\x0e\x9d\xac\x27\xae\x36\xf1\xac\xc8\x27\xf5\x3c\x26\x47\xd3\xe3\xa3\xd3\xe3\x93\xa3\xb3\x63\xef\x4b\xee\xeb\x5e\x18\x02\xd3\x21\x6c\xa9\x1b\xd0\x20\xb3\xe5\x16\xed\x27\xa3\x2d\x94\xb9\xf3\x62\x28\x70\x2a\xe1\x2f\x51\x55\xd9\xeb\xee\x59\x43\xa7\x0c\x22\x2f\x83\x75\x97\xf8\x7c\xc4\x94\x41\xba\xf7\x58\x64\x89\xfb\x13\x24\xd9\x88\x04\x06\x4c\x77\xc1\x25\x82\x57\x74\xcb\x2a\x9d\x65\x46\x9d\x9e\xb2\x6d\xf8\x79\x70\x3d\x14\x9f\x36\x71\x13\x72\xab\xf4\xbc\x58\x53\x12\xe0\xdc\xcc\xcc\x6a\x6a\x4a\x75\xf6\x1c\xe4\x50\x5e\x27\xf5\xb9\x93\x46\x87\xb9\x4f\x2c\x62\xa7\x2c\x3a\x41\xb7\x14\xd7\xa0\x24\x9a\xc1\xee\x58\xe8\x94\x30\xb4\xf0\x5f\x73\xa3\x33\x9e\x28\xcf\x22\x74\xc9\x1e\xf3\xfc\xf1\x03\x48\x88\x91\xc0\x76\x22\x32\xef\x8d\xed\x0f\x9a\x7e\xd7\xf1\xab\xbe\x9f\x11\xed\x4e\x73\x33\xd3\x64\xe5\x18\xcb\x7b\x01\x0d\x64\x0e\xa0\xa2\x85\xd2\x8f\x45\x7f\x30\xe0\xd1\x78\x55\xfb\xdc\x85\xe9\x28\x2c\x2b\xfc\x5c\x6f\x5d\x41\xc3\x97\x9d\x96\x0d\x3d\xb4\x5c\x97\x55\x6a\xab\x74\x86\x9d\x58\x19\x14\xf1\x85\x63\x65\x4e\x4b\x31\x1c\x94\xe1\xb4\xaf\x8a\xc6\x41\xec\x06\x07\x7a\x75\xbe\x73\x5f\x4a\x3b\x0d\x1b\x2b\xb4\xa4\x06\xbc\xa7\xaa\xa3\x56\xc9\x94\x27\xed\xde\x89\x28\x50\x11\xf0\x5e\xe7\x3f\x3c\x6d\x7e\x6c\x9f\x34\x3b\x42\xbe\x31\xea\x8a\x86\x27\x96\x89\x7e\xf8\x6b\x08\x3e\x88\x0e\x08\xf4\xd5\x50\x02\x50\x12\x25\xf2\x51\x6a\xec\x31\x76\x4b\x3b\x79\x75\x4b\x47\x7f\xe9\xe0\x34\x08\x3a\x0e\x1c\x32\x94\x23\x28\x1c\x95\x29\x0a\x07\x93\x82\x4b\xc9\x22\xf3\xcc\x40\x0b\x1e\x94\x6d\x37\x82\x6a\x23\x1a\xbc\xb6\x18\x03\x4f\x2f\x0a\x84\x62\x3e\x30\x10\x0e\x0a\x09\x84\x87\x7f\x59\x13\x10\xf8\x51\x31\x7d\xc2\x64\xb3\x65\xd0\x87\x98\x7b\x06\xca\x55\xd3\x02\x8e\x3f\x37\xf8\xb1\x1c\x59\x83\x0f\x5d\xc1\xe6\xe6\xc3\x59\x74\x31\xf0\xc6\xcc\xa8\x3b\xc4\xc3\x89\xb4\x13\x31\x2d\x1a\xf9\x18\x35\x16\x2f\x84\xa1\xcc\x20\x10\x66\x4d\x4e\xa6\x20\x6a\x69\x66\x9d\x7d\x87\x1e\x0d\x03\x73\xb8\x85\xda\xae\x70\xfc\xd6\x42\xd0\xe7\x48\xf8\x7d\x6f\xd4\xcf\xaf\x9f\xfd\xfc\xac\xdf\xe3\x4f\xe8\x6f\xdc\xb1\xa1\x73\x75\xad\xcb\x2c\xd5\x58\x0d\x91\xcf\x03\xca\x68\x93\xcf\xd2\xcc\xfd\xf3\xf4\x54\x7d\x02\x2a\x66\xb7\xad\x73\x29\x2e\x26\x20\xd6\x65\x51\x31\x9f\xf8\xc2\x6f\x0b\x16\x14\x32\xdc\x23\xe7\x81\x61\xc8\x6e\x66\x33\x63\xe6\x60\x74\x07\x56\x47\xda\xb0\x85\x2d\x23\xec\x18\x9f\x2a\xdd\xa2\x09\x4a\x3b\x26\x30\xe8\x41\x67\xad\x28\xfd\xde\xb2\x50\xc2\x2a\x79\xcc\xcd\xdd\xbd\x5e\x70\x89\x2f\xc9\x3f\x2c\x91\x9b\x0a\xe6\x86\x7b\x63\x9a\xdf\x05\xe7\xe8\x0c\x9c\xa3\xf1\xac\x58\x1b\x76\x8b\x2e\x25\xc3\x56\x60\xa9\xff\x2a\x56\xf2\x36\x83\x24\x6c\x24\x75\x8e\x72\x26\x15\xdf\xc5\x29\xee\x4b\x3a\x10\x4e\x58\x23\x26\x6c\x61\x1c\x04\x68\x20\xf6\x9e\xd9\xe5\x07\xb7\x6f\x7d\x55\x21\xca\xa0\xba\x9d\x58\x28\x88\x76\xa0\xd6\x3b\x93\x36\x9e\xa1\x1a\x13\xe9\xfb\x4e\x40\xc0\x0a\xfa\x83\xf0\xe4\xba\xc5\x1f\x68\x88\xf7\x58\x19\x68\x13\xc2\xc9\x77\x5f\xa4\x73\xf6\xe1\xe7\xc5\x66\x5a\xb1\xe3\xb5\xc7\x46\x69\x9c\x0b\x49\xeb\xb9\xec\x33\x6f\x70\x7d\x40\xb2\x51\xca\x21\x37\x6c\x4e\x87\xf2\x2f\x5f\xad\xd1\x70\xcd\xf1\xab\x5e\x60\x51\x1b\xda\x07\x51\x45\x54\xed\xdd\xe9\x0e\x33\xf6\xf5\x91\xf6\x32\x0a\x2f\x3b\xea\x93\x99\xa7\x58\x69\x80\xa9\x13\xfb\x4e\x54\x21\xc4\x4a\x11\x3a\xcb\x8a\x07\xc4\xeb\xc8\xc3\x9e\x93\x19\x96\xc9\x33\x1e\x9b\x44\x20\x30\x51\x7f\xad\x07\x9f\xe7\xc5\x83\xfa\x92\x17\x0f\x79\xac\xe7\x44\x44\x57\xf1\x06\xbf\xab\xa5\x91\x76\x15\x90\xd2\xd5\x1a\x0d\x20\x66\x4f\xa6\x07\xe6\xa9\xe5\xc2\x46\x24\x67\x0b\x85\xc6\xaa\x28\xe3\x23\x7c\x51\x94\xd3\x74\x1e\x80\xa7\x1c\x7c\x79\x4a\x63\xf6\xf5\x4d\xa4\xa7\xf2\x94\x87\x05\x73\xff\x51\x27\xe3\x89\x3e\x90\x4d\x61\x26\xb6\x0a\x85\x88\xac\x15\x9c\x61\xa9\x15\xae\x91\x3e\x3e\x7a\x79\xac\x72\xe0\x53\xa6\x35\x6a\x77\xae\xcc\x57\x1d\x75\x5e\x3c\xe4\xb6\x2a\x8d\x5e\x09\x86\xc1\x4e\xb4\x8b\x0c\x81\x70\xda\x57\x3a\xfb\xb1\x73\x7b\x6f\xd3\x38\x57\x7d\xe0\xb5\xf7\x0f\xdb\x63\xa8\x45\xd5\x88\x3e\x8e\xa6\x73\xa2\xb8\x6e\xbe\xf1\xb1\x39\x5d\xe7\x89\x7b\x7a\x54\xc1\x6f\x71\x82\xe4\x6f\x57\x2b\xdc\x77\x37\x7a\xb4\xed\xb3\x1b\x21\x10\x78\x16\x1c\x19\xdf\xfc\xd3\xe9\x4c\x68\xbc\x32\x74\x49\x33\x3d\xd8\x0c\x07\xf9\xe0\x8f\xe8\x94\x1e\x30\xe6\xcd\xe5\x3c\x91\x72\x1f\x8f\xc9\x0e\x08\xee\x4f\x28\x98\x88\xcb\x9e\x11\x10\xed\xdb\x85\x76\x24\x6e\xea\xee\xe6\x47\x5d\x76\xa6\x6c\x6e\x89\x91\xb9\x43\x04\x58\xf9\x0b\x01\x52\xf7\x7d\x58\x9f\x95\xd4\x8d\x64\x77\x3f\x3e\x7b\xb9\x83\x5e\x43\xef\x10\x55\x40\x7b\x75\x4d\xed\x3c\x90\x98\x5f\x4a\xb7\xd4\x0b\x93\xe2\xec\x1c\xed\x83\xc4\xb4\xb2\x0d\x35\x2a\x20\x49\x0a\xa7\x27\xb3\x9d\xec\x75\x8c\x52\x9b\x20\xb8\x14\xb2\x49\x58\x23\x03\x08\xfd\xc2\xcd\x30\xb7\xa5\xd3\x67\x60\x28\x96\x1d\xbf\x62\x41\x1a\x31\xb6\xd2\xd5\xc6\x7a\xce\x28\x3f\x35\xd9\x1b\xb5\x41\x59\x81\x12\x37\x30\xad\xbd\x13\x4e\xa4\x42\xb2\x78\xce\xf3\xe0\xbb\x7d\xeb\xf4\xf8\xa8\x7b\x7c\x94\x1e\x73\xb4\x72\x28\xd3\xe5\xc1\x92\xfb\x54\x94\x3a\x70\x0f\xb0\x73\xe3\x3d\x56\xa4\xa7\xaa\xcc\x1d\x06\x65\x38\x40\xd4\xc0\xa7\xb4\x6c\xba\x39\xc9\x56\xa2\x9f\x01\xb7\xaf\xcb\xf4\x5e\xcf\xb6\x49\x4c\xf7\xca\xc1\x15\x06\xba\xa7\x9e\xe1\xf9\x9d\x5a\x32\x17\x6b\xac\x1b\xc3\xa0\x93\x5a\xdf\x3d\xf1\xfc\x93\xa9\x89\xb6\x38\x76\x48\x82\xa3\x5f\xdd\x26\x1d\x09\x56\xc3\x53\x4c\x83\xc4\x57\xe1\x36\xca\xca\xce\x3a\xcc\x3d\x0c\xa7\xbf\xe7\xa2\x10\xa1\xbf\xa7\x75\xb6\xb4\xa2\xbe\xaa\x9f\xb6\xa1\x20\x8d\xd8\x3d\xc8\xe4\x4e\x39\x05\xc3\xdc\x28\xf8\xd0\xbd\xcb\x3d\x54\xda\xa1\x42\x53\xb6\xc5\xe5\x84\xcc\xd6\x9a\xdf\x80\xbb\xc8\x2c\x35\xd5\xd6\x43\x04\xb6\xea\xbe\xc8\x36\x39\xa8\xd1\x50\xfb\xc0\x86\x87\x45\x52\x15\xf8\x5b\xd0\x98\xcb\xac\xfb\x57\xa8\x30\xb7\xb3\xa5\x59\x19\x20\x7c\x71\x06\x18\xf1\x59\x6b\x6b\x6a\x89\xa5\x50\x68\x50\x22\x40\x7b\xc7\xe7\xe3\xdc\xe0\x3e\x08\xce\xd1\x0b\x79\x40\x0b\xc1\xa6\xce\x01\x6c\x15\x8f\xed\x84\x51\xa9\x03\x90\x73\xd4\x42\x3f\x11\x08\x68\x5e\x4b\x4e\x55\x31\x03\x38\xae\xdc\x01\x92\x2d\xec\xf1\x43\xd4\x51\x14\x09\xf0\x39\x20\x67\x9b\x1e\x07\xee\xed\xba\x97\xe3\x89\x88\x43\x9b\xd2\x85\xd7\xf8\xa5\x20\x58\x7d\xc9\xd4\x31\xe1\xa1\x15\xe2\xf1\x18\x24\x63\x1d\xbb\xb8\xae\x84\x10\x5c\x9e\x1f\x62\x57\x30\xca\x87\x48\x9f\xb0\x41\x7a\x92\xf5\x90\xd8\x96\xb9\x2f\xac\x53\xa8\x7f\x89\xe8\xb4\xe9\x56\xad\xad\xd9\xcc\x8b\x7c\xbb\x82\x23\xd0\xbf\xf0\xf8\x5d\xfc\x55\x69\x87\x50\xef\x38\xa1\x90\x04\xa2\x7e\x0d\x5c\xc4\xe4\x60\x5e\xfc\xc8\xfa\xd2\x9b\x78\x51\xd7\xee\xbe\xdf\x77\xb3\x11\xba\x4d\xae\xfb\x02\xde\x30\x7e\x0a\x3c\xe4\x66\x34\x00\x27\x64\xbb\x36\x65\x96\xe6\x5f\xf8\x11\x6d\x1e\xb0\xdc\x4c\x7c\x27\x6e\xd5\xba\xd4\xb3\x0a\x81\x24\xef\x22\x83\x2f\xcd\xe7\x28\xc3\x43\x54\x20\x7e\xce\xed\x1e\x50\xaf\x6a\xc5\x37\xa7\x81\x29\x7a\x5d\x9a\xfb\xb4\xd8\xd8\xd8\x66\xaf\xb9\xd2\x3d\xf1\xda\x9d\x19\xbe\xa7\x9c\x58\x3a\xa8\xb4\x92\xd9\xfb\x6b\xc5\xac\x8f\x50\xcd\xd3\xec\xb8\x56\x07\x59\xec\xef\x6c\xcf\xb1\xca\x4f\xcd\x74\x6c\x1e\xda\xbb\x67\x2c\xa6\x90\x29\x74\xe5\x1c\xcd\xcd\x2a\xc1\xb0\x51\xc2\xa6\x39\x34\xd8\x67\x91\x1f\xd9\x1d\xd0\x77\xf2\x48\x21\x29\xaa\xed\x5f\x5d\x15\xbb\x5a\x3e\x65\xba\x00\xa4\xbc\x6b\x9b\x53\xc0\xec\x80\x65\x1d\x98\x16\x67\x14\x59\x15\x18\xfe\x63\xc0\x6a\x38\xc6\x06\x8b\xdd\x2b\x54\xa8\x06\x94\x66\x55\x10\x07\x07\x6d\x1a\x12\xae\x2b\xb1\x31\x4d\xdb\xe8\x49\xb3\x9b\xad\x27\x91\x76\x70\x27\x8d\x50\x5b\xdd\x3f\xa2\x09\x2f\x84\xf6\xa0\x0e\xfc\xc9\x07\x7f\x76\x9d\x03\x08\x20\x8c\x3c\x89\x53\xf4\xfc\xf7\xf8\x1c\xd8\x41\x53\xd3\x96\x94\xe1\xd0\x58\xa0\xd5\xd7\xab\x66\x5a\x86\xe6\xb6\x27\x03\x2f\x55\xa6\xa1\xe4\x09\xe4\x27\x77\xa5\x8d\xeb\x93\x1f\x25\xb0\xbe\x7a\x51\xed\xf7\xa7\x5a\xd6\x15\x6a\x52\xd2\xb8\x7c\x8f\x45\xb4\xcb\xed\x7f\xf1\xf7\xe0\xb5\x35\x26\x16\x1d\x11\x54\xe9\x59\x37\x4f\x6a\xd9\xa8\xe0\xd6\xee\x75\x62\x79\x62\xbf\xc4\x40\xf1\xee\x10\x7f\xe7\xe0\x73\x13\x6f\xe1\x5d\x6b\x9c\x0b\xfb\x32\x04\x5f\x99\xa4\x7a\x4b\x76\xd2\x62\x4f\xec\x33\x8a\xe9\x9c\x1e\xcb\x88\x73\x25\x59\xea\xcd\xaf\x04\xa1\x02\x7c\xed\x8e\xd8\x2c\x58\x9a\x6e\x11\x90\xd2\x33\xa8\x70\x05\x9a\x60\xde\x13\xaa\x90\xdc\x34\x3e\xb1\xf0\x8e\x76\x14\xda\x17\xbc\x98\xd4\x13\x1e\xc9\x8f\x08\xcf\x06\x34\x8f\xff\x75\x34\x69\x01\xb3\xb8\x17\x7b\x40\xd0\x4e\xf3\x1b\x1f\xa0\x8e\xd8\xb1\x49\xa1\x25\x3e\x6b\xc1\xad\x83\xd2\x90\xfa\xc4\x94\xd1\xc0\x45\x2d\x76\x17\x36\xce\xe9\xb1\x3f\xe3\x67\x91\x18\x5b\x88\x28\xef\xdf\x77\xe3\x6d\xf7\x6f\x19\x2f\x58\xe6\xfb\xa2\xea\x51\xc8\xf0\x25\x5a\xc8\x94\xd7\x8e\x0a\x61\x90\x10\x95\xb4\x80\x9a\x78\x85\xb6\xe0\x46\x0b\x6a\xa9\xb6\x8a\x08\x90\xbd\x17\xaf\xc1\x6d\x7b\x85\xe0\xb7\xc8\x50\xfc\x1c\x0a\x53\xe2\x64\x80\xfb\x63\x4c\x91\xad\x3b\xea\x26\x07\x3d\x90\x00\x2b\xb3\x66\xad\x49\x5d\x12\xbe\xa2\xd2\x5f\x7c\x2e\x50\x9c\xd7\x4f\x72\xde\x61\xe3\xb4\xbb\x0c\x45\x7b\x92\x5a\x92\x5a\x39\xf1\x79\x4f\x96\x4e\xf8\x82\x55\x36\xb1\x2c\x39\x2a\x70\x87\xef\x23\x93\xf2\x4b\x8a\xdb\x3c\x57\x52\xef\xc8\xe0\xd4\x48\x63\x92\xa0\xe4\xe3\x7d\xd2\x80\x1c\xa8\xc1\xe4\xdb\x41\x43\x71\x53\x80\xe5\xd1\x1d\x3d\xe5\x6c\xa9\xf3\x4a\xb3\x58\xcc\x22\xad\x72\xaf\xb9\x22\x85\x43\x68\xa1\x24\x92\x2e\x97\x18\xc3\x05\x8e\x26\xc3\x78\x42\xe0\x37\x30\xee\xf0\x70\x87\x1b\x0a\x48\x6c\xfd\xb9\x8b\x5d\x85\x84\x37\xe2\x01\xa8\x5e\x11\xbe\x9f\x64\x30\x7c\xea\x02\x48\x1d\x80\x56\x24\x43\xf5\xfa\xd2\xd4\x35\x63\xc5\x87\x72\x08\x83\x72\x2c\x9e\x3b\x23\xa4\xc5\x68\xfd\x08\xf7\x85\x0f\x52\xb9\xff\xb3\x19\xb6\x2b\xba\x91\x0a\xba\x57\x64\x32\x94\x33\x2b\xa2\x2d\x73\xbb\x42\x81\xe6\x01\xe6\x7f\xab\xa5\x29\xca\xad\x70\xfb\xda\x87\x2f\x37\x77\x59\x7a\xe7\xba\xe9\x38\x86\x56\x32\x00\x9f\xb5\xaa\x09\xe8\x9d\x08\xf9\xea\x34\x9f\x81\xd3\xeb\x7e\x0b\xec\x0e\x20\xb3\x02\x17\xad\x37\x79\x8a\x45\x3b\xe6\x57\xb3\x5a\x67\x5a\xce\x2b\xd0\x09\x31\x10\x68\xb4\x24\x2c\x45\xc8\x3a\x51\xaf\xa5\x4b\xcc\x0b\xbb\x06\xef\x48\x9a\x15\xfb\xcf\xcf\x04\x7a\xce\x6d\x99\x0d\x90\x07\xd0\xe2\xe9\x39\xea\xec\x30\x70\x00\xba\xdd\x33\x88\x40\xc4\xe4\x09\x0d\xe5\xd9\xa2\x25\x9c\xc9\x4d\xd9\xa0\x2a\x64\x9f\x36\x59\xc4\xfd\x3b\x27\xcb\x0c\x0d\xe4\x5d\x6e\x71\xad\x76\x39\x6e\x87\x8f\xa9\xea\xa9\xf3\x2e\x3c\xd3\x83\x04\x5c\x4b\x1c\x2d\x82\xda\x76\x6d\x72\xab\xc2\x9d\x5c\x84\x36\x04\x44\xe4\xaf\xe9\x8a\xf8\x20\xdc\xca\x2b\xb2\x4d\x15\x35\x14\x94\x19\x3d\x1d\x51\x54\xa8\x17\x36\xf3\xd7\xb0\x99\x4f\x0c\x95\x5b\xd6\x19\x41\x35\x6d\x49\x75\x44\x15\x01\xc3\xd8\x52\x0a\x99\xd6\x47\xe0\xbe\xde\x7d\x76\x43\x28\x24\xb2\xf6\x30\x7e\xee\x4a\xfe\xe7\x11\x61\xf9\xee\xc3\x4f\x30\xcc\xc8\xfc\x0e\x6f\x05\x9e\xe9\xa2\x0c\xc6\xdb\xa6\x1e\x82\xf5\xe7\x07\xa8\x11\xf1\x03\x1b\x32\xca\xe8\xa8\xb9\x23\x1a\x94\xe9\x2a\x63\xdf\x06\x3f\x2b\xce\x2e\x69\x69\x20\x90\xe6\x71\x5a\x10\x58\x18\xb8\xf0\x4a\x12\x38\xa6\xb0\x7c\xe5\x7f\xdb\x42\x65\x0a\xcd\xe7\x2d\xd5\xfb\xb0\xfe\x81\x82\x73\xf4\xac\x83\xe8\x71\xd6\x96\xf3\x4d\x45\x62\x93\x1a\x10\x9b\x56\xc0\x93\xcd\x96\xd7\x47\xd3\x63\x91\xd6\x47\x26\x25\x11\x1f\x95\xdb\x82\x5b\x72\x60\x1b\x56\x85\xb2\xc6\x7c\x41\xba\x44\x9e\x55\xf0\x45\xfe\x03\xf6\x66\x09\xe7\x8f\x35\xb0\xf6\x52\xf0\x82\xd1\xbd\x6a\x1f\x64\x2a\xaf\x22\x9b\xa4\xdd\xbb\x2a\x91\xd2\x34\x60\xb1\x76\xd7\x17\x04\xba\x56\x91\x87\xf0\x59\x30\xcf\xc3\x15\xe6\xe9\xae\x0f\x35\x9d\x40\xce\x74\x0a\xb4\x9b\xaf\x13\xf5\x06\x8d\x97\x3f\x78\x22\xd1\x36\x06\xcb\xfa\xc3\x78\xbc\xde\xc0\xea\xc7\x94\xce\xc4\x27\x67\x7b\x8d\xc8\x71\x84\x0e\xc0\x7d\x8c\x30\xb5\xbe\xd8\xe5\x6b\xfd\xd3\x00\x54\x0b\x4a\x73\x1b\xb4\x0b\x85\x28\xd5\x5d\x69\x88\xca\x67\x8a\xe4\x4b\x54\xa4\x40\x81\x85\x50\x75\x99\xe6\x77\x54\xc4\xec\xc1\xb4\xa2\x44\xba\x7d\x64\xa0\x5e\x11\x05\x19\x49\xf2\x0f\xc8\x50\x78\xdc\x11\xb9\x06\xb1\xbc\xc0\xd8\x47\x4b\xeb\xab\x32\xd9\xdc\xdb\x7f\x80\xde\x1e\xf0\xee\x1f\xed\xb2\x8f\x2e\xb1\x1d\xd8\x19\xe2\xda\x96\x43\x22\x8f\x17\xe7\xd3\x97\x06\xfd\x4e\x38\xa6\x12\xef\xcc\x27\x22\xb8\x10\xc5\x0d\xea\x24\x5b\x2d\xf1\xdc\xa0\x49\x96\xe9\x07\x64\x16\x9b\x92\xde\xbb\x27\x47\x6d\xa2\x20\xdb\x67\xf5\x3e\x73\x6c\xb1\x83\x2f\xae\x09\xe6\x21\x02\xbe\x1a\x4b\x5c\x2a\xe8\xf0\xea\xd9\x7d\xac\x6f\xf1\xcc\x70\x69\x2e\x99\xe1\xa2\x1c\x1d\x80\x69\xd2\x4a\x89\x47\xfb\xea\xca\xd0\xb6\x99\xce\x69\x00\xf8\xd9\xf1\xfb\x51\x57\xc8\x93\xd3\xb7\x78\x69\xd4\x73\xb8\x6d\xf2\xb4\x6d\x52\xad\x55\x9e\x64\x0e\xa1\x30\x3b\xd0\x50\x33\xc8\x81\xe3\xc9\x2c\x56\xde\xae\x3e\xf4\xe4\xb6\x1a\x0a\x8e\x88\x88\x9f\x25\x95\xc2\x99\x4c\xac\x62\xd8\x73\x3b\x16\x2c\x14\xc2\xb5\x1c\x25\xf3\xdf\x98\x86\x6f\x54\xa8\x09\x8b\xcb\x9d\x66\x09\x27\xfb\xc0\xd4\x49\x68\xd2\xa4\xf7\x69\x66\xee\xc8\x46\x4b\x61\xb7\x01\x93\x2d\x8e\x0a\xd5\x93\xe6\x24\x4d\xee\x63\x0b\x8c\xf9\xf0\x20\x4f\x37\x31\x82\x1b\x18\x93\xa9\x09\x28\x54\xa7\x59\x9e\xe8\x19\x2e\x48\x34\xa0\x80\x88\x47\xad\x44\xb8\x53\xa7\xfe\x4b\xda\xa8\x26\xb6\xa8\x99\xcf\xaa\x29\x5b\xae\x39\x6e\x79\x20\xce\x60\xce\x60\x54\x5e\x7c\x91\xc9\x0c\xa9\xb4\x82\xb5\x74\x83\x68\x10\x97\xda\x51\xd6\xe5\xd0\x0f\xe5\x21\xa1\xeb\x7e\xf5\xdb\xe1\xa3\x5c\x0c\xb0\x42\xe7\xb4\xdb\xc7\x28\xe3\x79\x01\x6c\xd5\xa2\x5e\xac\xf7\x9c\xa7\xc5\x39\xfe\xed\xdc\x70\x42\xc7\xab\xea\xb2\xe5\xc9\xb9\x75\x72\x6b\x11\x67\x80\x57\x73\x2d\xec\x4a\x16\x68\x2d\x75\x29\x04\x35\x1f\x69\xb7\x42\xa9\xfd\xe0\xa3\x45\x9a\x11\xed\x1f\x5e\x64\xe9\xcc\xcd\xb2\xa0\x71\xb9\xa3\xd0\x89\xaf\x6c\x19\xdf\x60\x41\x31\xa8\x0c\x5e\x26\xf6\xe4\x90\xe4\x6f\x52\xa9\xec\xd0\xe6\x40\xbd\xc8\xbb\xa2\x95\x14\x85\xf7\x1e\x98\x3f\x40\x56\xfe\x50\xba\x0f\xcd\x3d\x8b\xe0\x23\x6e\x2d\x96\x66\xe6\x74\xd2\x79\xaa\xfe\x4d\x2e\x70\x71\x31\x60\x8e\x39\xb3\xdb\x27\x6d\xf4\x0d\x5f\x73\xe8\x8b\x90\x0c\xf5\x57\xa3\x96\xfb\x09\xa7\xad\x33\x01\xee\x4a\xbd\x5e\x86\xb1\x88\x18\x30\xaa\x06\x13\x87\x6d\x59\xf0\x01\x45\x54\xe9\xd9\xee\x9a\xb7\xce\xdf\x2d\xbb\x15\xf3\x3f\x9d\x7e\x2f\xf2\xa7\x47\xf9\x9f\xce\x5e\x9f\x9d\xbd\xaa\xf3\x3f\x3d\x7f\xf1\xfc\x07\xff\xd3\xef\xf1\xb3\xaf\x40\x5d\x9d\x76\x9e\xa3\xf8\xe4\xe0\x97\xbe\xea\x0d\x3f\x7d\x42\xd9\xce\xd1\xf5\x90\x04\x37\x07\x28\xf2\xd9\x55\x97\xdd\xcf\xea\x62\x30\xfa\x04\x9c\x76\x5e\xfc\x93\xe4\x5e\xd5\x65\xff\x43\xf7\x52\x8d\xfb\xa3\x5f\x06\xbd\xfe\xb8\xa3\xce\x07\xe3\xc9\x68\xf0\xfe\x26\x88\x76\x0e\xc6\xea\x7c\xd4\xbd\x98\x78\x4d\x2b\xff\x0c\x16\xbf\xbc\x52\xdd\xc9\x64\x38\xba\xea\xdf\x9e\xf4\x2e\x07\xfd\xab\x09\xe9\x61\x0d\xaf\xc6\x1f\x07\xd7\x9d\x66\x3b\xe9\xe5\x63\x7c\x7a\x24\xca\x79\xe5\x1e\x77\xd8\x1d\x9f\x0c\xc6\x87\xea\x7d\x77\x3c\x18\xb7\xdc\xff\xa9\xfb\xaf\xd0\x04\x49\xaa\x37\xea\x7f\xe8\x8e\xbc\xcc\x94\x7c\x26\x2b\xdb\x22\xab\x5f\x20\xf2\x0b\xe2\x57\x17\xc3\x91\x17\xae\x1a\xf5\xc7\x37\x97\xa0\xe5\x75\x31\x1a\x7e\x52\x83\xc9\x58\xdd\x8c\xfb\x9d\x03\x32\x92\x0e\xdc\xd3\x3f\x0f\x47\xff\xaa\x8e\xba\x63\x75\xde\xbf\x00\x95\xd4\xf7\xfd\xcb\xe1\xe7\xe3\x48\x46\x17\x65\xba\xdc\xd5\x93\xfe\xe8\xd3\xd8\xf7\x65\xb3\x33\x6e\xde\x5f\x0e\x7a\xbe\x77\x8f\x0e\x7b\xbd\xeb\xcb\x43\x35\x1c\xa9\x43\xfa\x1d\x10\x0a\xf0\x6b\xf1\x1d\x13\xd0\x38\x55\xef\x6f\x55\x6f\x78\x7d\x0b\x02\xaf\xac\x35\x0b\x32\x5e\x40\x5e\x38\xe8\x81\xda\xd9\x65\xf7\x73\x07\x28\x08\x6f\xc6\x7d\x96\xee\x82\x47\xe1\x95\x93\x8f\x6e\x00\xc7\x52\xea\x94\xdb\x2e\x84\xcc\xf0\xb5\x40\xb1\xd9\x3f\xef\x1c\xbc\xbf\x55\xfd\xbf\xf4\x47\x3d\x14\x42\x03\xd1\x2e\x10\x99\x45\x01\x34\x7a\xbe\xef\x8b\x8f\xfd\x51\x3f\x51\xb7\xc3\x1b\xd5\xed\xf5\xfa\xd7\x13\xa4\x57\xfc\x30\xea\xf7\xdd\xf5\xef\xfb\xea\xfd\xf0\xe6\x0a\xbe\xa6\xd9\x5f\xd4\x00\xec\x01\x96\x00\x56\x1f\xdc\xb0\x8f\xe1\x91\xee\xf7\xf4\xf2\x20\x5b\xeb\xde\xa8\x06\x57\x20\xe0\x36\x38\x17\x22\xb4\xa0\xc6\x86\xad\xe8\x5e\xf5\xfa\x5e\xb7\x0c\x5f\xea\xda\x15\xb4\x7a\x51\x2c\xa2\x23\xa9\x06\x28\x90\xa3\x3b\xea\xb0\xe7\x95\xb4\x80\x40\xfd\xd0\x97\x5a\x63\x69\xa2\x27\x06\x71\x76\x4b\x5a\xcc\x21\xdd\x9b\x5a\xbb\x81\x84\x47\xb5\xf4\x44\xeb\x26\x9f\x6d\x67\x59\xb1\x36\xf3\x54\x27\x31\x7d\x80\x7b\x2e\xab\xfd\x23\x0f\x2e\xc8\xb6\xab\x4d\x1e\xc1\xc0\x12\x50\x89\xbf\xe3\x32\x77\x94\x37\x07\x12\x1c\x04\xd2\xc9\x3a\xf4\x24\x58\xf9\x10\x03\x61\x7f\xbb\xee\x6a\x23\x9f\x16\x62\xc8\x56\xd6\x64\xf7\x50\x4c\x55\x1a\x80\x60\xae\xa6\x19\x44\x4f\x01\x1f\x12\x14\xc5\xb0\x5c\xa6\xa3\xba\x70\x37\x3b\xaa\xc1\xa7\xd0\xaa\xd6\x67\x0d\x1d\x02\xb2\x78\xb5\x3a\x37\x65\x7a\xaf\xc3\x85\x47\x82\x40\x15\x59\x40\x04\x8f\x49\xad\x70\xa0\x86\x61\x98\x76\xd4\x61\xed\x71\xf1\x58\xd5\x79\x1d\xe0\x85\x45\x59\xfb\x45\x20\x13\x5b\x97\xe6\xc4\xfc\x8a\xd2\xf2\xd8\x4f\x72\xb4\x99\xdd\x01\x55\x75\x88\x04\x41\xd8\x50\x89\x9a\x97\xda\xb9\xc2\xff\x46\xd7\x2c\x52\x56\xa2\xe5\xdf\xac\x0a\xd8\xe2\xd7\xe9\x0c\x48\xec\x09\xbb\xd1\x56\x99\x5e\x56\xb5\x12\x46\x3d\x2d\xd3\xf9\x1d\xbe\xc7\x79\x9d\x41\xcd\xa5\x29\xd5\xd0\x9c\x6a\x1e\x3b\x84\x95\xf0\x75\x26\x0a\x8d\x69\xe0\x98\xe6\x58\x7f\xfb\xc1\xae\x8d\xec\xae\x81\x9d\x75\x82\x5b\x74\xf8\x58\xed\x1d\x52\xff\x87\xec\x24\xbc\xa8\x55\x93\xbf\xf9\xa2\x79\x47\x1d\x7a\xae\xda\x2e\x98\xd4\x8f\xbe\xef\x61\x59\x78\x01\x7c\x7e\x1f\x3f\xcf\x74\xd4\xa1\x9c\x86\x98\xb9\xa6\xc0\x3d\xa4\xb8\xa0\x4b\x63\x32\x3b\x68\x7b\x04\xf3\xd8\xdb\xe6\x45\x47\x1d\xde\x16\x1b\x3f\xd3\xf3\x47\x4b\x12\x9b\xb1\xfc\x90\xc1\x2e\x20\xf6\x8e\x4c\x90\x08\xe6\xcb\xb6\x14\x20\x36\xf3\xdd\x8d\x69\xe5\xe5\xfe\x0c\xdb\xa3\x73\x72\xe8\xb1\x84\xf9\x9c\xfb\xb0\xb8\x88\x5e\xed\xaf\xfa\xd8\xdd\xe4\xb9\xb1\xeb\x14\xf8\x24\x3d\xfa\xd0\xc7\xb3\xa1\x8b\xce\x40\x7c\xa2\x04\xda\x29\xca\xb1\x37\xc2\x23\x59\x88\x70\x79\xc2\x3c\xc0\xa8\x46\x21\x3d\xc1\xf8\x2f\x15\x20\x39\xa3\x87\xfc\xff\x81\x31\x20\x2d\x6d\xa5\xac\xce\x8c\x48\x10\x8a\xea\x3d\xda\x72\x7c\x39\xa4\x2f\xb1\x5d\xc4\xd3\x44\x15\x0f\xb9\x29\x1b\x34\x5c\x24\x60\x41\x9e\x5b\x24\x52\x80\x81\xa9\x17\xa1\x1e\xf4\x03\x12\x6f\x7d\x4d\x19\xa8\x4f\x01\xfd\xf6\xda\x4f\x51\xe8\xb9\x36\xe5\xda\x54\x6e\x42\x1e\xf1\x92\x9f\x6f\xca\x08\x50\x2c\x3e\xc1\x7f\xe4\xf1\xce\xaa\xd0\x98\xca\x0b\xb7\x6d\xcb\x51\x66\x38\x36\xde\x86\x03\xbc\x2a\x44\x31\x68\x98\x98\x55\xe1\xbc\x6d\xe2\x4b\x35\xf2\x18\xae\x0a\x0c\xf4\x94\x6a\x55\x80\x54\x4f\xb4\xbd\x59\x5f\xfe\xd7\x7c\xaa\x6b\x85\x78\xe8\x3c\xc8\x3b\xc5\x8f\x78\x17\x8e\xac\xaa\xf0\x94\xa8\xb0\xe7\xf3\x23\x6b\x7b\xa5\xbf\x65\x06\xb7\x08\x2d\x19\x16\x60\x28\xd5\x7a\x59\xe4\x05\x9e\x1a\x16\x22\x74\x54\xe0\x4e\x3e\x74\xb6\xf5\x5c\x28\xe2\x37\xee\xad\xf5\xdf\xaa\xa9\x2f\xbf\x5f\x28\xad\xe6\xe9\x5d\x0a\x22\xdb\x9b\x79\x5a\xe0\x61\xe1\x4b\x74\x42\xaf\x71\x2c\xaf\xa5\x0b\x76\x7d\xfe\xfc\xef\xea\x5b\x76\xf5\x38\x48\x2b\x40\x6e\x99\xa6\x1d\x9d\x9e\x3c\x23\xe7\xbf\xb9\x9e\x74\x6e\x20\x55\xdf\x69\xbe\x42\x62\x30\x7d\xc2\x14\x99\xe9\x9c\x01\x52\x2b\x8a\x44\xe8\x86\x2f\xd7\x04\x01\xe6\x5d\xf5\x9e\x61\xe9\x10\x8d\x46\xbd\xd1\xc8\x8f\xcf\xac\x97\xc0\x55\xca\x71\x67\x46\x20\x4e\xb7\xa2\xf4\xb6\xf4\x52\x18\x25\x93\xe9\x1f\x60\x59\xef\x28\x2a\x96\x9b\x08\x6e\x12\x7e\x90\xc4\x81\x51\x07\xec\xad\xbd\xf0\x38\x80\x10\x1b\x0c\x10\x5c\x59\x9b\x27\x96\x3f\xc3\x3d\xc3\x34\x4b\xc2\xe4\xa8\x51\x40\x20\xf7\x21\x9a\xda\x45\x29\x2f\x83\x59\x13\xfe\x2c\xec\xc7\x9c\xe1\x54\xbb\x8f\xc7\xa4\x26\xbb\xc2\x28\x42\x66\xde\x0f\xf0\xda\x3c\x85\xa7\x8f\x18\x8a\x3d\xa0\xea\x0b\x34\xe5\x1a\x32\x2f\xd5\x52\x19\xc8\x45\xe3\x83\xa2\x65\xe3\x89\x74\x5c\x2b\xa1\xe0\xfb\x5b\x76\xc0\xe3\x30\x5a\xea\x09\xb1\x47\x10\x67\x62\x85\x97\xfa\xb3\x74\xb7\x55\x41\xbd\x12\x8a\x73\x7f\x7a\x0c\x1b\xeb\x25\x52\xe3\xf6\x05\x69\xc9\x60\xa3\x85\xf1\xf8\x62\xcc\xda\x6d\xfb\x7a\x86\x94\x8e\x58\xb7\x61\x45\xe1\x46\x43\x47\x46\x08\xfc\xee\x02\xad\xc4\x2d\xf8\x4e\xb3\x4f\xa8\xb5\x4a\xb4\x71\xc4\xe0\xc4\xb2\x3b\x4c\x1c\x12\xe3\x8b\xd8\xf5\xf4\xf8\x18\xb7\x79\xe7\x36\xb5\x15\xc2\xb3\x22\xaa\xb2\xfa\x00\x79\xa9\x17\xb9\x85\x09\x3e\xa3\x7d\xe7\x62\xc3\x6f\xc0\xda\x3b\x04\x98\x05\x18\x26\xca\xe5\xb5\x1c\xa2\x4a\x43\x98\xd8\x1b\x8e\xf8\x21\x95\x35\xd9\x82\x28\x22\xdb\x2a\xb7\xda\x6d\x69\x2e\xcf\xf2\xe4\xe4\x8d\xa6\x81\x8f\x28\xd5\x62\x5d\xa7\xfb\x4d\x90\xa7\x52\x03\x57\x14\x6a\x13\x12\x2e\x7f\xf0\x0d\x6e\x7c\x0f\x60\xe0\x21\x99\x8f\x62\x97\xb0\xd5\xcb\xac\x59\x25\xb5\x34\xd0\x3f\x49\x90\xdd\x86\x8a\x2f\x9a\x1f\x52\x3b\xd4\xbe\xcb\x87\xd4\xdd\xba\x6f\xf1\x21\xc1\x40\x1a\x2c\x80\x1c\xf5\x7b\x6d\xdf\xe8\x2d\xd7\xcf\x7e\xd4\x7d\xac\xdb\x7d\x3b\x77\x8c\x7a\x2d\x59\xc0\x6c\xf9\x90\x82\x67\xd8\xae\x7d\xb7\x1b\xaa\x79\x5a\xd5\xea\x78\x42\xc1\x83\xf2\xbc\x4c\x4c\x13\xba\xa9\xd2\x2c\xfd\x37\xaa\x78\x9b\x15\xf9\xbd\xd9\x72\x1a\x1b\xa8\xbd\x8e\xdc\xa7\xcb\x42\xb8\x60\x5b\xfb\x6a\xbd\x7a\x23\xd2\x85\x2f\x16\x7c\x87\xeb\x04\x74\xcd\xa3\x3d\x42\x5e\x42\x76\xed\x4c\x13\x5b\x71\x73\x9e\x69\xfe\x30\x2a\x20\xf4\x6d\x6c\xd9\x7b\xda\x26\xd1\x91\xe9\xdc\x75\x12\x75\x78\xe1\x66\xd1\x52\x46\x5b\xa2\xbb\xa7\xdb\xc6\x44\x82\xd4\xdc\xe1\x78\x56\x1a\x93\x83\xc9\xe8\xcb\x48\x3c\x89\xfc\x8e\x5b\x0f\x8f\x9d\x97\x34\x5b\x72\xd3\x39\x31\xbe\x22\x8c\x38\x8b\xfa\xb4\xd4\xaa\xbc\xf3\x20\xb2\x44\x94\x41\x63\x21\xd5\xfe\xae\x6a\x99\x6a\xa8\x3e\xed\xd1\x12\x56\x34\x09\x62\x2b\x28\x80\x49\x80\xf3\x10\xec\x01\x52\x47\xc0\xfa\xca\x78\x02\xdd\x88\xf7\xf8\x74\xb4\xdf\xee\x75\xa5\x32\xa3\x6d\x45\xe5\xe9\xab\x34\x87\x12\x67\x8b\x6f\x7d\xfc\xc1\xb0\x52\x5f\x39\x63\x2f\x82\x73\x27\x75\xb0\x7a\x40\xb2\x07\xd3\xec\xfd\x16\x2d\x07\x9e\x1a\x3e\x28\x44\x49\xbf\xd2\xa0\xea\x4d\x9b\x94\xbc\xdf\x4e\x3c\x8e\xdc\x12\x16\xb3\x64\xc6\x6f\x81\xf3\x9c\x1a\x5b\x21\x48\x7e\xc6\x34\xdd\xce\x1e\xcf\xcc\xfc\xce\x28\x34\xc6\xc5\x90\xa6\xb9\x3b\x75\xb6\xa2\x16\x36\xed\xc4\x48\x5b\xe4\x87\x9f\x4b\x82\x78\xe9\x8c\x46\xe6\x37\x12\x6b\x57\xc2\xfc\xf5\xd5\xec\xac\xe7\x4e\xe6\x04\x26\xbe\xf1\x52\x40\xfc\x3c\xd9\xdc\xf1\xd9\x62\xaa\x05\x41\x65\xd7\xad\xa8\x5c\x80\xe7\x6b\xa2\x78\xe0\x8a\xe9\xa4\x59\xa6\x6d\xd4\xc2\xb8\x3f\x94\xc6\x42\x0c\xa9\x96\x24\x5e\xeb\x2d\x64\x80\x45\x21\x69\x9a\xe2\xe9\x0f\x5f\xee\x4f\x6e\x06\xbd\xc7\xd1\x8c\x24\x64\xca\x93\xc0\x35\xe0\x19\x0d\x30\x5d\x0b\xc1\x0d\x0e\x87\x94\x4d\xcd\x67\xc4\x84\x54\xcb\xb4\x9c\x13\xc8\x03\xa1\x37\x14\x92\x54\x73\xb3\xd0\x2b\x9f\x31\xbf\xd7\x0c\x6a\x22\x42\x83\x10\x37\xa9\xa0\xa8\x64\xe3\xc6\xee\xaf\x1b\x62\x0a\x88\x9f\x2c\xce\xa1\xfe\x5f\x30\xa3\x31\x66\x1d\xa9\xcb\x5b\x35\x9e\x74\x27\xfd\x73\x35\xb8\x8a\x73\x28\x9c\x9c\xf9\x3c\x18\xf7\x31\xfd\x01\xd7\x7c\x1e\x0d\x20\xdf\x34\x1c\xa9\x51\xff\xcf\x37\x83\x11\x26\x76\xe2\x0c\x4e\x12\x65\x80\xe8\x89\xe7\x21\x5f\xa6\x7c\xbe\xac\xa1\x7a\x45\x92\x53\x4f\xd0\xbd\x0a\x32\x56\xc9\x53\x74\xac\xe2\x94\x5b\x6f\x78\x35\xe9\x5f\x4d\xe0\x79\xdd\x5e\xef\x66\xd4\xed\xdd\xca\x74\x13\xf4\xd9\xeb\x4e\x54\x9e\x92\x8b\xf2\x14\xee\x49\xca\x20\xf5\xff\x32\xc1\x4c\xe2\xee\x1e\xe9\x5e\x9d\xf3\x4d\x32\x83\xd7\x1d\x61\x56\x0a\xf2\x77\x21\xc9\x37\x19\xaa\xae\x1b\x8f\xd1\x39\xc8\x6b\xdd\xd6\x33\x7d\xef\x47\xfd\x6e\xef\xa3\x6f\x71\xf8\xcc\xc1\x95\x1a\xf7\x7b\x90\x40\x7a\x95\xb8\x7f\x5d\x0d\x55\xff\x17\xd7\xb8\xcf\x83\xcb\xcb\x90\x93\x7a\xdf\x87\xb7\x5d\x42\x52\xeb\x76\x78\x83\x83\x73\x4b\x29\xd6\xc9\xc7\xfe\x70\x84\xa9\x46\xf7\xcb\xf1\x75\xbf\x37\xe8\x5e\x82\x72\xd8\xe0\xbc\x7f\x35\x71\xff\xdd\x1b\x5e\x8d\xfb\x7f\xbe\xe9\x5f\x4d\xe0\x4f\xd7\x37\x57\x03\x48\x15\x0e\xdd\x60\xf5\x3f\x5d\x5f\x76\x47\xb7\x8d\xcf\x74\x83\x54\x4b\x96\xb9\x1b\xdc\x47\xd4\x12\x7e\x09\x34\x5b\x0d\x2e\x42\x9b\x3f\x76\xc7\xea\x7d\xbf\x7f\xa5\xba\xe7\xbf\x0c\x60\x42\xe1\xe5\xd7\xc3\xf1\x78\x40\x1d\xc7\x29\x32\x7a\x31\x8c\xe3\x9b\x8e\x44\xab\x87\xad\x7b\xd2\xf0\x86\xf6\xef\x4e\x59\xb6\x0b\x22\x8e\x16\xa9\x5b\x77\xd3\xd2\xe8\xd9\x92\x61\xaa\x11\x06\xb4\x69\xb0\xfb\x20\xb7\xf5\x51\x6e\x10\x88\x84\x58\x33\x48\x1b\x52\xb0\xf9\x29\xa6\x5d\x60\xcf\x68\x3b\x6a\xfc\x79\xee\x13\x1b\x88\xa8\x06\xad\x9d\x00\x00\x0b\x80\x75\x8f\x27\x87\x33\x34\xdd\xd1\x54\x44\x17\xfa\xc2\x89\xa6\x64\x5f\x61\x8d\x00\xac\x49\x50\xf2\x59\x03\x97\x0c\x4d\x63\x70\x32\xbb\xdf\x3b\x24\xf6\xc5\xa6\x56\x8b\x09\xa3\x03\xd7\x4e\x1f\x5f\xb5\xc4\x6f\x90\x24\xd1\xfe\xd6\x00\xaf\x3c\x33\x8f\x1b\x90\xbc\xd0\xa2\xe8\xb4\x27\x3e\x90\x28\x32\xc6\x86\x42\x2d\xe1\x13\xb0\xd1\x99\x28\x53\x80\x51\x70\x5e\x49\x2b\xb4\x1c\x0d\x76\x89\x26\x6f\x18\x76\x14\xc8\x60\x6e\x1a\xc0\x08\x22\x1e\x8b\xa6\x07\x34\x11\x78\x69\xd3\x6a\x39\x2f\xf5\x43\xec\x35\x1f\x45\x87\x5a\x08\x4c\xe8\xca\x57\xf1\x20\x6c\xd8\x86\xa2\x78\xf0\x68\x93\x96\x1a\xe0\xd6\xf5\x71\xcc\x6c\xff\x5f\xad\x8b\xcc\x60\x53\x31\x9b\x43\x64\x1d\x06\x03\x66\xcf\x1f\x3a\xea\x53\x6a\x67\x26\xcb\x74\x6e\x8a\x8d\x48\x97\xf7\xdd\x12\x06\xe2\xd1\x38\xe6\xf4\x35\x0e\x59\xd3\x1e\xae\xda\x6a\x0f\x8b\x38\x3a\x24\xc8\xcf\x65\xe8\x81\x22\x50\x50\x34\xdf\x9a\xf3\xd0\xb6\x75\x6e\x53\xf5\x59\x73\x43\x90\x36\xc1\x6f\xfb\xd8\x16\x77\xe9\xeb\x3f\x2e\x76\x66\xbe\xdb\x57\xce\xc0\x03\xdf\xaf\xd1\x0e\x79\xb3\x7b\x9d\xa5\xc0\x7a\x1e\xa1\xc3\x19\x04\x1a\x65\xa8\x04\x64\x5b\x54\xb0\x40\x31\x8d\x7b\x48\x5a\x11\x5e\x62\x37\x26\xdb\x0b\x7f\xef\x8d\xb8\xb2\x51\xbc\xd8\x94\x98\x27\xc3\x75\x4a\x91\x63\xd6\xaa\xe5\xd8\x9e\x87\x37\x52\x96\x3f\x7c\xaf\x47\x97\x7f\x35\x9e\xbd\xf6\x20\xec\x23\x58\x6d\x02\xe5\x1e\xb2\x21\x02\x4a\xbe\xbb\xb7\x7d\x6b\x08\x8d\x1f\x63\xc9\xe9\x10\x6d\x03\x90\x43\x63\x18\xc0\x5d\x7a\xcc\xa9\xa8\x98\x03\x3c\x2a\xfa\x0e\x73\x65\xd3\x3b\x21\x94\xec\xd1\xd4\x53\xa3\x66\x4b\x5d\xde\x51\x89\xd4\x8e\xa7\x8a\x14\xf8\xf7\x51\x7d\x86\x59\x5f\x2b\x74\x9b\xa0\x43\x0c\x65\xac\x0d\x00\xab\x40\xaf\x4a\xaf\x91\x72\x28\x3b\x5f\x01\xfb\xb9\xe7\x30\xc5\xf7\x7c\x5d\x91\x8e\x1f\x49\x66\x76\xd6\x5b\xf6\xe0\x29\x9a\x10\xd1\x49\x7b\x5b\xa4\xd6\x73\x82\x62\xdf\x83\x82\x78\x82\xc3\x5c\xdc\xc0\x01\xcc\x88\xe2\xd0\xa3\x45\xad\x52\x94\x72\x11\x4f\x82\xce\x37\xd7\x94\xaf\xdf\x26\x47\x7b\xab\x1e\x96\xba\xb2\x05\x1c\x8c\x2d\xf8\xe4\x10\x6f\x6f\x81\x43\x87\xce\xab\x95\xfc\xe2\x01\x49\xce\x5d\x4b\xfd\xaf\x2f\xe3\xa5\xb2\xda\xd0\x06\x59\x56\xd0\x84\x50\xc3\x4d\x77\x26\x37\xa5\xce\xa2\xe2\x5f\x2e\xf9\xf5\x53\x98\x8b\x7e\x1b\x95\xbb\xf1\x37\x72\x1f\x79\x4d\xad\x36\x23\x66\x51\x94\xe6\x0e\x4a\xd1\xaa\x87\x42\x1d\x9d\x1d\x2b\x58\x9b\xf9\xcc\x39\xda\x69\x0b\x50\x7c\xa9\x65\x16\x8c\x29\xb8\xa0\x40\x11\xe2\xdb\xba\xc6\x97\xe6\x2d\x6d\xb1\xb3\x82\x8d\x2a\xe2\x13\x80\x6b\x12\x44\x06\x22\x1a\xd2\x39\xf8\x3a\xbc\x7f\x54\x59\xe0\xf9\xe6\x31\x9a\xd7\x42\xde\x64\x54\xaf\x77\x7d\x99\xa8\xdc\xa4\x14\x43\x70\xc3\x0a\xa3\xcf\x35\xa0\x4f\x41\xda\x7b\xed\x8f\xaf\xc2\xda\x43\x4b\x5b\xb1\xf6\x2d\x77\x61\xf5\x5b\xa8\x3f\xd8\x88\x92\x9d\x16\x55\xed\xfa\xed\x3f\xb9\xb7\xe5\x27\xb3\x4d\x89\x05\x79\xbe\xa1\x1b\x0b\x92\xcc\x9b\x74\x6e\xb2\x34\x27\xba\x72\x8a\x2e\x86\x12\x86\x02\x01\x80\x0f\x66\x6a\xd3\xca\xd4\x24\x81\xf4\xdc\x48\x11\xa5\x35\x31\x26\x19\xcb\x29\x10\x67\x85\xb8\x91\x49\x57\xe6\x89\x20\x79\x12\xf8\x6e\x2b\x9b\xf8\xfb\x05\xcb\xff\x03\xfe\x30\xfe\xff\xaa\x77\x72\x75\x7e\x72\xd6\x79\xf5\x1d\xaa\x00\xf6\xe3\xff\x5f\x9c\x9e\x9d\xbe\xa9\xe3\xff\x5f\xff\xc0\xff\xff\x3e\x3f\x7b\x05\xea\xae\x8a\xdc\xfd\xda\x94\xee\xa4\x3a\xb9\x2a\xc0\x73\xb0\xea\xac\xf3\xea\xf7\x2b\x0b\xf8\x51\x10\xf0\xbf\x71\x41\xc0\x70\x24\xde\xe4\x26\xd3\x8f\x0a\x81\x1f\x15\x02\x3f\x2a\x04\x7e\x54\x08\xfc\x3d\x54\x08\x3c\x41\x41\x45\xba\x26\x41\xad\xd2\x99\xf2\x85\x4d\xb9\xa0\xbc\xd1\x9f\x10\x4c\xdb\xe6\xb3\x65\x59\xe4\x34\x1a\x0d\xd4\x42\xba\x32\xf3\x93\x7d\xda\x93\xea\xe8\x10\x9e\x91\xe6\x77\x87\xc7\x6d\x15\xdf\x3f\x4a\x22\x7e\x94\x44\xfc\x28\x89\xf8\x51\x12\xf1\xa3\x24\xa2\x56\x12\xf1\xf7\x52\x13\xf0\x37\xd4\x37\xfc\x6f\x56\x36\x80\xe8\xdd\x10\xb0\xda\x32\x29\x6d\x5e\xf0\xcd\xdc\x96\x7a\x46\xfe\x6f\xaf\x38\x90\x41\x5f\xe6\xb9\x15\x3a\x9b\xe2\x03\xac\x81\x28\x67\xb5\x14\xb5\x07\x56\xbd\x3c\x9a\x1f\xc3\xc7\xbc\x3c\x32\xc7\xad\xe5\x0b\x3f\xaa\x17\x7e\x54\x2f\xfc\xa8\x5e\xf8\x51\xbd\xf0\xa3\x7a\x61\x4f\xf5\x02\x43\x8d\x6d\x24\xe6\x30\xcb\xb4\x1b\xb1\x97\x47\xb3\xe3\x9d\x20\x7f\x39\xd9\xfc\x22\x11\x42\x11\xed\x82\xcc\x6d\x1b\x30\xa6\xf8\x04\xd7\x2b\xe0\x93\xca\x74\xa5\xcb\x34\xdb\x06\x63\x76\x81\x95\x08\x48\xfa\x0b\x8f\x7c\xd0\xe5\x1c\x52\xb1\x18\x6b\x55\x7a\x7e\xaf\xf3\xca\xb9\x71\x90\x8e\x77\x47\x96\x51\xab\x22\x37\x20\x7c\xe4\x1c\x48\x76\xa9\x71\xfe\x98\x5f\x67\x4b\xe7\xda\x47\x73\x73\xe1\x2d\x52\x6f\xc3\x99\x39\x85\x54\xa4\x15\xc2\x36\xc8\x22\xcd\xcc\x89\x5d\x6a\xc0\x44\x47\x19\xa0\x28\xd7\x2c\x59\xc3\x0a\x26\x6f\xfb\xe6\xdf\x25\x98\x51\x2b\x86\x7a\xe5\x05\x63\x80\x19\x88\xdb\x7a\xeb\xae\x54\xb0\xec\xa4\x46\x8f\xc4\x98\x93\xef\x57\xf5\xf1\xb7\x55\x72\x50\x9f\x24\xbf\xa5\x64\xe3\xad\x3a\x4a\x8f\x43\xa9\xc6\x8e\x6a\x8c\xa8\x82\x23\xa9\x97\x70\x88\x42\x0c\xaf\xcd\x76\x94\xa6\xc7\x4c\x09\x5d\x7f\x1a\x5d\xe2\x97\xbb\xd7\x45\x52\x3a\x2f\x44\x42\xb6\x28\x3d\xe0\x02\x8a\x2f\x94\x66\x7d\x3c\xa0\xad\x83\x60\x4e\xc2\xe9\x4a\x37\x3d\xd1\x8f\x4e\xd4\x5f\x8b\x4d\x99\xeb\x0c\xe3\x70\x52\xf1\x2e\xcd\x25\xe0\xbe\xde\xb5\x49\xd8\xce\x9c\x15\x97\x22\xbb\xf9\xd4\x83\xbd\x45\x89\x05\x4a\x7e\xc8\x6e\x43\x60\x4d\xad\xdd\x4f\x2a\x5d\x11\x87\xdf\x5e\x31\x99\xe4\x31\x9b\x86\x99\x33\xa9\xce\x23\x80\x42\x08\x2d\x62\x69\x69\x6a\x6b\x8b\x59\xaa\x59\x78\x50\xcc\x42\x89\xcb\xb9\x19\x0d\xe4\xc1\xe1\x8f\x6d\xd3\xe8\x37\x48\x7b\xc3\xcb\xd0\x61\x0f\x12\x3a\x72\xaa\xfe\x1e\x95\x2c\xff\xd5\xcb\x56\x1e\xa7\x35\x7e\x62\x08\x31\xae\x14\xb9\x0e\x3a\xf2\x6a\xe4\x05\xfa\x6e\xc0\xca\x7e\x9f\xe9\xfc\x8b\xe1\xd9\xe2\xec\xac\x76\x68\x6b\x2d\x08\x22\x44\xef\x02\xdb\x7f\xa4\xec\x5e\x94\xea\xde\x79\x64\x52\xc5\xde\x3b\x3d\x24\xe0\x87\xcb\xba\x3b\xee\x75\xaf\x13\xf5\xfe\xd3\x20\x51\xe3\xfe\xb8\xdb\x3b\x4e\xa4\x8e\xa0\x0f\x40\xd6\x35\xf1\xc3\xe6\xea\x4f\x2b\xf9\x57\x7c\xf8\x83\x99\xce\xb4\xad\x8e\xeb\xeb\x0f\x26\x90\xbc\xfc\x77\x38\x95\xe3\x12\x95\x4f\xc6\x9d\x3c\x30\x72\xa3\x80\x88\x19\x7b\xcd\x42\x3f\x52\xdf\x7e\x48\x60\xc6\xf8\xe0\xd8\x9d\xc9\xb1\x08\x45\x28\xe2\xb9\x5f\x56\xd4\x85\x1f\x75\x59\x6e\xd5\x45\xf1\xab\xea\xc2\xa5\x8d\xe1\x01\x68\x94\x70\x95\x84\xed\x17\xdb\x93\x47\x87\x40\x55\xce\x69\x83\x43\xf4\x71\xe5\x99\x5a\xb3\x2f\x5b\xaa\x81\x38\x90\x3b\xdd\xaa\xd3\x37\xea\x66\xdc\xf3\x26\xd7\xe9\xe9\x2b\x1e\xe5\x9b\xb1\x20\xa4\xef\xce\x2a\x38\xc1\xa0\xcf\x82\xb6\xbe\x0f\x1d\x48\x32\x57\xeb\x35\xb7\x4a\x01\xc5\xc6\x18\x18\xee\x1f\xf2\x03\x7e\xc7\x49\x63\x3a\xea\x33\x4e\x65\xb7\xc9\x3e\x36\x61\xbe\x76\x0b\x69\xa4\x1b\xbe\xe3\x26\x70\xd2\xba\x09\x8c\x5d\x0b\xfa\x64\x8c\xed\xdb\x00\xbe\x6e\xa9\xff\xad\x33\xea\xe5\x37\x9d\x51\x7b\x3e\xe1\x77\x9a\x49\x5f\x5d\x18\x79\x73\x75\x09\xa5\x5a\xbe\x7c\xec\xd3\xcd\xe4\xa6\x7b\x79\x79\xcb\x75\x64\x94\x19\xbf\xee\x8e\xb8\x66\x89\xca\xca\x92\x90\x12\x1f\x5e\x5c\xf4\x47\xe3\x90\x7d\x07\x50\x05\x64\xb4\x3d\x7e\x62\xd4\xbf\x1e\xf5\xc7\xfd\x2b\xac\xf8\x82\x5a\xae\xf6\x2a\x32\xd5\x1b\x5e\xf5\xfa\xa3\x2b\xc6\x57\x50\x7d\x11\x96\x94\x25\x5c\x50\x96\x40\x29\xdc\xcd\x64\x38\xba\x8d\xaa\xdf\x92\xc7\x2a\xcd\xe2\x97\x4e\x06\x93\xcb\x7e\xa2\x3e\xf5\x47\xbd\x8f\xee\xb7\x88\xd2\x48\xd4\xc5\x60\x72\xe5\xba\x05\x8a\xaa\xf0\xdb\x7b\x37\x97\xdd\x91\xba\xbe\x19\x5d\x0f\xdd\x6b\xae\x86\x57\x83\xab\x8b\xd1\xe0\xea\x43\xff\x53\xff\x6a\x92\x70\x65\x54\xf7\xfd\xb8\x4f\xc9\xfd\xcb\x2e\x14\x9a\x79\xa0\xc4\x79\xff\xa2\xdf\x9b\x8c\x13\x5f\xc4\xe6\x6f\xc2\xae\xc1\xbb\xc4\x03\xfa\xa3\xd1\x70\x34\x4e\xd4\xe7\x8f\x7d\x78\xc0\x70\x04\x60\x98\xf3\xc1\xb8\x37\xfc\xa5\x3f\xea\xbe\xbf\xec\x77\xd4\x78\xf8\xa9\xaf\xfe\xe5\x66\x34\x18\x9f\x0f\x7a\xd8\xb7\xe7\x43\x84\xe2\x5c\x5e\x0e\x3f\x53\xc9\x5b\xef\xf2\x66\x4c\x30\x04\x2e\xc9\x0b\x3d\x91\xa8\xf1\x10\xa1\x08\xe1\xc2\x4f\xdd\x5b\x7c\xc8\xf5\xf5\xe5\x2d\xd5\x9d\x7d\xfb\x42\xbb\x1f\x35\x6f\xff\x18\x35\x6f\x3f\xea\xdb\x7e\xd4\xb7\xfd\xa8\x6f\xfb\x51\xdf\xf6\xb7\xd6\xb7\xfd\xa8\xfc\xfa\x5d\x2a\xbf\x66\xff\x88\x95\x5f\xf3\x1f\x95\x5f\x3f\x2a\xbf\x7e\x54\x7e\xfd\xa8\xfc\xfa\x51\xf9\xf5\xa3\xf2\xeb\xc7\xcf\x9e\x9f\xce\xb3\xe1\xc5\xe5\xc9\x69\xe7\xf4\xbb\xa9\xbf\x3c\x56\xff\x75\xfa\xfc\xec\xcd\xcb\x5a\xfd\xd7\xe9\xeb\x57\xa7\x3f\xea\xbf\x7e\x8f\x9f\x10\xe8\x3c\x9a\x1d\xab\x3f\xce\x75\x65\xec\x9f\x12\xf5\xc7\xf0\xfb\x8f\x45\x36\x37\xe5\x9f\xd4\xd1\x1f\x6f\x46\x97\xff\xaf\xb3\x83\xb3\x3f\x1d\x27\x07\xb0\x15\x8d\x08\x03\xa7\x2e\x8a\xbc\x52\x57\xce\x0d\xf8\x63\xf3\x77\x7f\x22\x9b\x02\x7e\x31\x2e\x16\xd5\x83\x46\xd7\xb6\x65\xcf\x1e\x0f\x2e\xd5\x70\x6d\x72\xbc\xd8\xdb\x00\xbf\x50\x10\xde\x4d\xd4\x83\x49\x0d\x24\x0c\x28\x4d\x02\x9a\xa2\xb9\xe0\xec\xea\xcc\x16\x62\xeb\x22\x84\xfc\x45\xf7\xcf\x4a\x57\x6f\x79\x13\xb2\xb3\x32\x5d\x57\xb6\x63\xd3\x0c\x36\xa0\xe1\xc5\x25\xb6\xe0\xba\x7f\xa5\x2e\x86\x57\x5e\x8f\xe6\x40\x34\x40\x9d\xa8\xb3\xd7\xea\xc2\x4c\xcb\x8d\x33\xba\xcf\x9e\x3f\x7f\x73\x70\x3d\xea\x77\x3f\xbd\xbf\xec\x1f\x4c\x96\x46\xdd\x15\x10\x8e\xa0\x8c\x78\xfd\x63\xd4\xd1\xf0\xe2\xf2\x18\xe1\x8f\xce\x51\x4e\x57\x1b\x77\xc2\x04\xf4\xae\x9a\x9b\x7b\x93\x15\x6b\x36\xa3\x66\x45\x96\xe9\x69\x51\xe2\xd6\xba\x28\x00\x1d\x53\xfc\x15\xd5\xba\x81\xe1\x72\xbd\x2e\xca\x8a\xce\xfc\x9c\x05\xa8\x8a\xdc\xb9\x9d\x45\x89\x20\x66\x3d\x73\xa7\x42\x3a\x23\x20\x60\x7e\xb7\x49\x6d\x95\xce\xd8\x08\x44\x42\x36\xa6\x82\x43\xa7\x5c\x69\xb5\x28\x0d\x3a\xb0\x85\xfb\x8a\x45\xa9\x57\xe6\x81\x50\x4f\x58\xb3\xe1\xde\xe7\xb7\x79\x92\x5e\x43\x31\x3e\xf7\x10\xcc\xf4\xba\x83\x37\x37\x98\x00\x85\x61\x80\xf3\xc5\x76\xa0\xaf\x5c\x8f\x83\x8c\x73\xe4\x28\xce\xe9\xc1\x68\xf8\x6f\x2c\xaa\xa9\x6f\xe6\x00\x3b\xf0\x76\x28\x92\x96\x07\x37\x78\x0e\xed\x45\xe9\x5d\xa8\x44\x42\x83\x65\xeb\xc5\xc5\x6d\x91\xb1\x67\x41\xc5\x44\x88\x9e\x81\x97\x49\x13\x0e\x8c\xbc\x80\x14\xa5\xea\x9a\x99\xce\xc1\xe2\xde\xe4\xf3\x0c\xea\x4f\x56\x53\x33\x87\xe0\x45\xdc\x0a\x02\x3d\xc0\xdb\x3c\xcc\xcc\xf2\xbc\x17\xb0\x16\x8a\x74\x30\x92\x14\x00\x06\x41\x0a\xdd\x7d\xb6\x6b\x6d\xbd\x21\xa2\xcd\x98\x53\xf3\x7f\xb7\x22\x9e\x26\xc5\x2a\x21\x80\xe3\x35\xf1\x82\x70\xdc\x76\x2d\xe5\xd3\xf0\xb9\x14\x15\x81\xc9\xe7\x0c\x33\x3f\x10\x14\x52\x13\x3e\x3b\x2f\xc1\x20\x66\xc7\x92\x8b\xd0\x7f\xc5\x6c\x03\x4f\xe1\x9c\xcb\xc6\x06\xcb\x94\xfc\x21\x0c\xf3\x89\x0f\xe8\x1c\x40\x71\x23\x16\xbe\x1d\x1c\x46\x3b\xc6\x21\x42\x13\x7c\x70\xc2\x1a\x58\x1e\x8b\x34\x83\x80\x1f\x7d\x24\xcb\xf6\xd5\xf6\xaf\x23\x7b\xdc\xd6\x74\x08\x57\x64\x46\x97\x00\x99\x2d\xbf\x50\x48\x66\x33\x5b\xd2\x9e\xe5\xa6\x36\xa3\x4e\x09\x85\x01\x2f\x4c\xd4\x74\x93\x66\x73\x45\x3b\x08\x0e\x04\x7d\x31\xa5\x60\x0e\x9b\x3b\xa1\xfc\x04\xd7\x47\x38\xe0\xc1\xd1\x63\x0c\x01\x62\xad\x63\x00\x86\xd7\x70\x3e\xb2\xc7\x9d\x83\x50\x18\x43\x3b\x53\xbd\x77\xb8\x1e\x0e\x5d\xf9\x78\xeb\x05\xf4\x40\x8e\xb4\x95\x56\xc9\xa9\xbb\xbb\xf7\x3a\x07\x87\x9f\x78\xe1\xb5\xbc\xb2\xb6\x62\xc0\x70\x9c\xa2\x43\x0a\xb6\x7b\xa2\xe6\x26\x33\x15\x24\x1c\xdd\xda\xd8\x4c\x43\xf5\xdf\x7f\xfc\xfb\xff\xc7\xfb\x84\x42\x09\x77\xa8\xe0\x83\xdf\x0b\x1c\x9e\x68\x75\x1d\xbb\xf4\x0b\xd7\xa6\x4d\xb7\x0a\xd2\x8a\x50\x01\x42\x88\x76\x04\xf6\xb8\x2d\x92\xe7\x5f\xdc\x1b\x50\x3e\x98\x9b\x07\x65\xf2\xfb\xb4\x2c\x72\x40\x65\x1e\x1c\x72\xc1\x51\xfd\x1b\x21\x40\x51\x26\xca\xb8\xb7\x18\xf7\x5f\xeb\xb2\xb8\x2b\xf5\x6a\x05\x60\x15\x46\xb4\x83\xe1\x8f\xc1\x09\x02\x3a\x99\xd2\x16\x39\x16\x28\x71\x29\x64\x88\xe9\x44\x4d\xea\x1c\x5c\xf7\x47\x9f\x06\x63\xc8\xbe\xfc\x93\x28\x05\x3d\xb8\x0e\x25\x3a\xa9\x8d\x8a\x40\xdc\x36\x04\xdb\xb5\x3b\x31\x20\x52\x92\x70\x9b\xe9\xcd\xc5\xb4\x22\x45\x59\x0f\x9f\x6e\xbe\x1a\x6e\x82\x8a\x19\xb7\xdf\x6e\x13\xb8\x32\x51\x2b\x03\x0f\x84\x1d\x8f\x76\xe0\x6d\xbc\xed\x91\x4c\xb1\xc9\xb2\x78\x83\x16\x45\xa2\x5c\x4d\xd1\xfa\xda\x5a\xee\x36\x80\xd3\x43\x34\x11\x90\x2e\xa7\xc7\xea\x8a\x3c\xba\xe6\x50\xe6\x1c\xfd\x45\xc9\x49\x51\x7a\x15\x26\x0f\x14\xb7\xfa\x99\x53\x94\xaa\x3e\xad\x6d\xe2\x0f\x34\x3a\x2f\xd0\xff\xc5\xfa\xa5\xe3\xfd\xf7\xb6\x7e\x1d\x3f\xcf\x9f\x1c\x5f\x71\x5e\x24\xb5\x03\x83\xe2\x6c\xeb\x2d\x7a\x55\x29\xd5\xb1\x61\x76\xa1\x01\xd7\xf2\x91\x6a\xb9\xc7\x5b\xc3\x47\x19\xed\x6c\x73\x45\x3d\x8a\xe1\xe8\x7c\x7e\xa2\xb3\x22\x27\x01\x58\xda\xee\x96\x9b\x95\xce\x4f\x4a\xa3\xe7\x60\x4f\x2d\x8d\x9e\xbb\x65\x81\xeb\x95\x92\x10\x65\xb1\x2e\x53\x48\x4a\xeb\xd9\x32\xcd\x4d\xb8\x7c\x65\x2a\x3d\xd7\x95\x56\x8b\xd4\x64\x73\xcb\x02\xf7\xa8\x30\x5b\xaa\x69\x9a\x3b\x53\x0a\xb7\xf2\xe8\xf4\x2e\xac\xe1\x7b\xa8\xcd\x46\xdb\x14\xaa\xe0\xcc\x43\xd8\xb0\x36\xd6\xa0\x00\xf1\x8b\x63\x75\x55\x34\x86\x65\xf7\xa8\x70\x28\xa0\xb9\x57\xe3\x89\xc1\xea\xc7\x40\x16\xeb\x9d\xf9\x75\xb4\x0c\x45\xa1\x08\xee\x53\x65\x69\xec\xba\xc0\x48\x4c\x7d\x2b\xa5\x73\x45\x94\x5c\x60\x21\x44\x0d\xfb\x8d\x00\x81\x2d\x1a\x74\x00\x3c\x04\xb0\x99\x09\xe1\x55\xfe\x6c\x44\xae\xbe\x3c\x86\xd3\x3b\xa7\x86\xb3\x6a\x6f\xcb\x29\x48\xc1\x16\xdc\xde\xc4\xb5\x71\xdf\x44\x31\x46\xb0\x44\xd0\x30\x5c\x15\x6e\xa9\x9b\x7c\x5e\x94\xa4\x9e\x3b\xbf\x37\x65\xc5\x90\xe9\x7a\xc7\x87\x22\xdd\x42\xe9\x59\xa0\x3d\xc6\x7e\x0a\x05\xe1\x8f\xb4\x99\x13\x9e\xa2\xd1\xa5\x0f\xf4\xa5\xe5\xbe\x01\x42\x28\x04\xf6\x4e\x6d\xcb\xf1\x1b\x13\xa4\x0f\xf8\x5f\x49\xdb\x59\x94\x20\x62\x77\x6a\xa2\xd3\x12\xc3\xc8\xa2\x8a\x25\x2c\x34\x0a\x5b\xba\x9b\xa8\x13\xe5\x8d\x75\x4b\xec\x77\xb7\xc0\x6a\xc7\xcd\xc4\x1d\x37\x57\x00\x8b\x88\xbd\xab\xa9\x99\x15\xce\x44\xc9\x37\x59\x06\x5f\x74\x5f\xa4\x73\x56\x6d\xe7\xec\x23\x6d\x3d\x21\xe9\x43\x06\xec\xca\x54\x9d\x03\x66\xbe\xe8\x8f\x80\xc4\x02\x9c\xaa\xf1\xf0\x62\xf2\xb9\x3b\xea\x47\xd4\x15\xc4\x2f\xdc\x60\x16\xbe\xad\xf1\x0a\x37\x08\x85\x05\xce\x43\xbd\xbf\x99\x00\x54\x01\x60\x1e\xfd\x73\xe0\xe3\x8d\xf9\x84\x87\x17\x1e\xe2\xd1\x7d\x2a\xc4\x03\xe0\x2b\x35\x94\x87\x7b\x90\xe7\xa6\x48\xd4\x35\x00\x3c\x12\x35\x19\x75\xcf\xfb\x9f\xba\xa3\x7f\x4d\x02\xd8\x03\x2e\xe9\x44\x00\x87\xf1\xc7\xee\xe5\x25\x31\x1a\x33\xbf\xc5\xc7\xe1\xe5\x79\x5f\xa2\x1d\x18\xd2\x00\xfd\x97\x78\x7c\x82\x7f\xae\xa7\x12\x91\x3d\xe0\x6e\xf8\xd0\xbf\xea\x8f\xba\x97\x89\x04\x43\x9c\x0f\x46\xfd\xde\x24\x86\x45\x00\xbd\x86\x40\x46\xf0\x2b\x02\xcc\x64\x00\xcc\x28\xdd\x1e\xf3\x56\xf4\x86\x57\x93\x51\xd7\x3d\x67\x32\x1c\x4d\x6a\x70\x1b\xc9\x89\x9c\x04\xf8\x04\xc1\x25\xdc\xc3\x04\x4d\xb2\xfb\x5d\x73\x42\x0c\x47\x48\x80\xc2\x28\x99\xee\xe5\xe0\xea\xc3\x18\x49\xae\x6b\xd7\xfe\x08\x16\x7e\x8b\x9f\xce\xb3\x4f\xfa\x8b\x19\xe4\x73\xf3\xeb\x7f\x92\xfe\xf3\xf3\x17\xaf\x5f\x3c\xaf\xf3\x3f\xbd\x7a\xf3\xe6\x47\xfc\xef\xf7\xf8\xf1\xa3\xaf\xce\x25\x04\xf6\x0a\xcc\xc7\x83\xd3\xd3\x67\xee\x7f\x3f\xff\xe1\xe7\x03\x11\x28\xec\x1d\x2b\xf7\x2b\x67\xef\xf4\x96\x26\x57\xff\x04\xb0\xe1\xd4\xf9\x18\x83\xbc\x32\x25\x22\x63\x74\xa6\xc6\x5b\x5b\x99\x95\x4d\xd4\x20\x9f\x75\x9a\x4f\xf8\x03\xc8\x60\x64\xe9\xbd\xa9\xaa\x14\x2c\x30\x5d\xce\x96\xaa\xe7\x4c\x9c\xb2\x79\xf9\x1b\x77\xf9\xc8\xdc\x49\x0f\xf0\x26\x4f\x01\x9f\x8b\x99\xfa\x9e\xce\xd2\x45\x51\xe6\xa9\x3e\x40\x4b\xe1\xed\xc1\xb5\x59\x3a\x5b\x12\xda\x79\xb4\x5e\xce\xfe\xb9\x34\x79\x91\x96\x9d\xa9\x29\xbf\x98\xcc\x6c\x3b\x66\xbe\x39\x3e\xf8\x9a\xcf\xb8\xd6\x59\xa1\xba\x99\x73\x69\xc5\xfb\x6e\xc6\xdd\xbd\xce\x99\xcf\xcd\xc7\x28\xe8\xc0\xa4\x2b\x9d\x23\x00\x88\x82\x4f\x59\x33\xfe\x5b\x4b\x32\xbc\x8d\x2f\xac\x52\xfe\x13\xc4\x9b\xd8\xb4\x15\x05\x44\xe2\x79\x01\xe3\xc1\x89\x58\xfb\x05\xdb\x0b\xe9\x75\xac\xf8\x58\xa5\x95\x02\xb3\x35\xa0\x82\x9a\x65\xf2\xda\x62\x28\x8f\x4d\xe1\xf6\x26\x35\x1a\xa1\xf3\xad\x73\x36\x9c\x63\x4c\x20\x32\xe0\xcd\x30\xbf\x9a\xd9\x06\x69\x39\x00\xc5\x52\xef\x19\x61\x78\x53\x79\x26\x38\xf2\x0d\xd7\x23\xdc\xec\x23\x38\xb3\x62\x6e\x28\xeb\x28\x1e\x08\x05\x24\xb3\x82\x2c\xb6\x3b\xb0\x99\x00\x8f\x94\xcb\x42\x95\x98\xe8\xc6\x2e\xd3\xf5\x1a\x49\x70\xf2\xb9\x5a\xea\x7c\x9e\xa1\xcf\x6a\x2b\xdb\x51\xfd\xf8\x13\x9a\xa3\x2b\x6d\x42\x99\x3a\x94\xed\x64\xc3\x53\xcf\xa0\xa6\x24\x4f\xb1\x7b\x35\x64\x14\xd7\xe9\x6c\x53\x6c\xac\xf0\xe7\x77\x76\xba\x0e\x11\x24\x1a\x7c\x93\x65\xb6\x36\x05\x96\xc5\x83\xeb\x46\x0c\x15\xd4\x9b\xd2\xa9\xcd\x70\x31\xb5\xc5\x64\xf0\x56\xf5\xbd\x70\x89\x9d\x33\x41\xb5\x52\x8d\x4e\x08\xc1\x7f\x69\x43\x82\x51\xe9\x73\xf9\x02\xd8\x20\xcd\x63\x3f\x89\x09\xd0\x11\x20\x0a\xc0\x23\x44\x3d\x07\x38\x7e\xee\xb5\x66\xe7\x60\xa2\x7b\xa6\x33\x9f\x56\x6f\x5c\x03\x19\x5a\x24\x29\xa9\x0f\x19\x06\x39\x2c\x0c\x32\x38\x72\x98\xa9\xff\xeb\x26\x17\x70\x04\x5b\xac\x0c\xdd\x6e\x4a\xc0\xcd\x50\xb1\x44\xe8\x86\xc4\x2d\x00\x0b\xbe\xd6\x62\x93\xf9\x1c\x78\x6a\x91\x0e\xa1\x32\xf9\xdc\x93\x1f\xe1\x7f\xcc\xd5\x4c\xaf\x11\xa7\x24\x01\x45\xfe\x79\x29\xc7\xcf\x23\xd2\x9f\xfa\xf0\xec\x19\x0e\xd9\xd3\x08\x4f\x53\xd7\x9c\x4f\x88\x6e\x71\x33\x06\xfc\x18\x8b\x3b\x25\x55\x8e\x43\x5a\x22\xb0\x6e\x44\x35\x16\xc0\xe1\x95\xd9\x42\x36\xae\x31\x73\x90\x9c\xa1\x39\xa1\xec\xb2\xd8\x64\x73\x8c\x6d\xd3\x3b\xa6\x7a\xf6\xc5\x23\x2d\x61\xef\xa7\x3c\x91\xd8\x2e\x1a\x43\x27\xf1\x24\x54\x50\x6a\x8b\xb2\x02\x44\x94\xf7\x4e\x5d\x5f\xcf\x9c\x0f\x0b\x4e\xfb\xda\x35\x97\xb0\x61\x8c\x5b\xf0\xc8\x8d\x19\x6e\xe0\xec\x66\x89\xb7\x83\x1b\x57\x86\xc2\x09\xc2\x31\x5a\x0f\x38\x49\x67\x9b\x4c\x97\x3c\xec\xbf\x9f\x6d\xdb\x79\xf6\xe1\xfa\xf2\xe4\xb4\xf3\xfc\xc4\x4d\xde\xef\x63\x02\xee\xb7\xff\xce\xde\xbc\x39\x6b\xf2\x7f\xbe\x7c\xf9\xc3\xfe\xfb\x3d\x7e\x3e\x5c\xdd\xb0\xbb\x58\xe3\x84\x0c\x29\xcf\x24\x24\x3b\x77\x99\x82\x17\xa5\x31\x21\x78\x74\x51\x6c\xf2\x39\x55\x71\x3b\x9b\x49\xbd\x3a\x55\x17\xa5\xce\xbf\x64\x69\xae\xc6\x55\xa2\x2e\xd2\x45\xb5\x54\x17\x59\x51\x94\x89\x7a\x5f\xd8\xca\x5d\xf9\xa9\xab\x9e\x9f\x9d\x9e\x3e\x3f\x39\x7d\xf1\xfc\x54\x39\x83\xaa\x7f\x6f\x4a\xb0\x0d\x78\x4f\xae\xe8\xb8\x81\xe3\xae\x66\x49\xdd\x9b\x72\xaa\xab\x74\x55\xb7\xa4\x42\x8c\x04\xa3\x21\x48\x96\xe0\xb3\x04\x69\xb0\x7b\xd0\x76\xe9\x1c\x5c\x97\x46\xaf\xa6\x99\x39\x90\xc4\x2b\x12\xc8\xb7\x50\x2b\x67\x26\x58\x99\x4f\x71\x07\xb3\x55\x15\xa2\x30\xa1\xb2\x1b\x82\x73\x8a\x0e\xa8\x95\x29\x67\x74\x42\x17\x56\xdc\x01\x42\x64\xb0\xd7\x00\xd7\x5d\xb1\x29\xd5\x07\x04\x8a\xa9\x6b\x44\x3a\x5d\xb6\xb3\x61\xdd\x6d\x34\x1c\xbf\xc0\x76\x53\x42\xe8\x7f\x5e\xc0\x56\x0c\x69\x58\xcc\x6c\x61\xb9\x3b\xa4\x05\xb8\xb1\x27\x27\x01\x25\x4a\xb5\x61\x56\xa4\xe4\xe1\x5a\xc0\xb9\x65\x19\xc4\xd0\x31\xc4\x08\x81\xa9\x1d\x0d\xab\x45\x2e\x77\x4d\x85\x9f\x6c\x78\x11\x25\x9a\x85\xb4\x17\xed\x93\x78\x06\x52\xc5\x2c\x24\xa7\xd3\x0a\x33\x12\x38\x56\xc8\xd6\x30\xd3\x39\x04\x6e\x53\x0c\x90\x41\x07\xd0\x13\x20\x25\x5e\x74\x0e\x3e\x3b\x8b\xfe\xc1\x28\xbb\x36\x1a\x28\xdd\xa2\x4e\x48\xdc\x9f\x5c\x43\x20\xb9\x53\x12\xbc\x8c\xfa\x30\x21\xc2\x35\x38\xf7\xc7\x98\x9b\x83\xca\x09\x84\x4a\xef\x1e\x1e\xca\x0d\xcd\x55\xad\x87\x75\x15\x18\x89\x20\xb7\x11\xc6\x0a\x94\x19\xf5\x83\x06\xe8\x31\x24\x4f\xc2\xec\xad\xb5\xd8\x3f\x87\x8c\xe4\xc8\x48\x2c\x4a\xe8\x94\x3b\x53\xc1\x84\x46\x02\x83\x07\xed\x8c\xfa\x4a\xdc\xea\xae\xa1\x49\x11\x0d\x3c\x11\x9b\xac\x53\x43\x47\x58\x0a\xf5\x03\xb9\x79\xc0\x56\x70\xe7\x52\x05\x3b\x3f\xee\x4b\x5e\x3c\xf8\xe7\xce\x61\xf8\x21\x9c\x9e\xe6\x77\xb6\x73\x30\x81\x80\x71\x65\x66\x15\x8e\x10\x0b\xad\x3d\x18\x95\x1b\xd1\x4b\x92\x7d\x08\x9f\xbd\x28\xca\x29\x20\x96\x61\xf1\x3b\xf3\xd2\xe4\x5b\x78\x11\xbe\x21\xe8\xb3\xb9\x49\x64\xbf\xe0\x9f\x0a\xd7\xdf\xa5\x09\xe6\x0b\xd1\xcb\x61\xc6\x23\x7e\x0b\xb1\x63\xc2\xc3\x67\xa6\x04\x6b\x37\x3a\xdd\xb9\x1a\xd1\x3d\x39\xad\xf3\x41\xd4\x32\x59\x61\x8c\x50\xcd\xd2\x5d\x8c\x29\x32\x37\x63\x0f\x2e\x8a\x52\x99\x5f\xf5\x6a\x9d\x99\x64\xef\xb3\x34\x25\x7f\xa5\x49\x88\xf6\xc2\x5d\xa9\xab\xd4\xb2\x15\xa1\xd5\xc2\x98\x04\x5f\xe3\x4c\x5c\x2f\xef\x19\xe8\x7e\x60\xf9\x8a\x12\xa1\x68\x12\x0a\x02\x9f\xda\x34\xad\x96\x66\x0b\x0b\x28\xf1\xb3\x4c\xcc\xac\xba\x3b\xa0\xba\xf9\x3c\xb4\xc2\xb9\x13\x80\xac\xa0\x98\x3c\x75\xff\xc1\x67\xd3\x36\x0d\xc8\xb4\x7f\x28\x94\xad\xcc\xda\xbe\x55\x47\xa7\xc7\xc2\xb5\x8d\xbb\xd5\x4d\xba\xa3\xb3\x63\x22\x4b\xc2\x79\x20\x76\x76\x84\xa2\xdc\x81\xe3\xe8\xfe\x88\x98\x5d\x61\xc4\xd3\x89\x91\xc8\x6e\xa7\xa4\x1b\x8d\x93\x7c\x5f\xe7\xa0\x9b\xd9\x22\x81\xae\x86\x6c\x1b\x6e\x47\x3f\x59\xfe\x0e\x44\xf4\xce\xdd\x66\x8d\xd3\x19\x16\x1a\x4f\x67\x9e\x4e\x98\xad\xe3\x13\x2c\xe0\xc2\xad\xef\x6a\x4f\x6a\xe2\x8d\x50\xef\x93\x46\x6b\x1f\x6a\x21\xea\x1b\xb5\xb7\x8a\xa7\x5b\x70\x2f\xdc\x4b\x4c\x46\x90\x86\xb5\xb6\x28\x3b\x1a\x9a\x97\x82\xfd\xea\xe7\x87\x3b\xa4\xdc\xea\x85\xb6\x3c\xf0\xd8\xe3\x1e\x45\xe7\x61\x25\x84\x7e\x12\x65\x8b\x00\x58\x59\x97\xc5\x34\x73\x76\x7e\x9a\x57\x48\xb9\x37\xf7\xdc\x19\x02\x60\x5d\x9a\x45\xe6\x86\x9d\xaa\x44\x7c\xa8\x83\xb6\xf7\x9f\x9c\xf5\xbe\x21\x28\x3c\xa2\x81\xd6\xae\x85\x76\x47\x2d\xc9\xa2\x40\x22\x1b\x70\xb7\x63\x67\x22\x9f\x47\xfc\x72\x94\x3d\xee\x1c\xec\xb6\x6e\x5a\x99\x96\x21\xe2\xde\x1b\x5e\xdf\x42\xc9\x68\x44\x47\x0e\x05\xac\xc3\xf3\xc1\xc5\xa0\x87\x69\x12\xa5\x94\xfb\xff\xf3\x1a\x5e\xde\xf3\x3a\xc9\x63\x91\xfa\x8c\x3d\x01\x3c\xf2\xc0\x45\xc5\xa9\xeb\x33\xb9\x9a\x7d\xd2\x75\xa6\x67\x32\xa3\xc8\xeb\x62\x09\x29\x31\x65\xf5\x96\x6c\x17\xca\x2c\x37\x93\x4b\xcd\x22\x95\xf6\x83\x0b\x8f\xf6\xc3\x6b\x6c\xde\x61\xc2\x30\xba\x18\xf6\xc0\x15\x25\xfc\x09\x48\x2e\x8d\x61\x85\x43\xc1\x5e\x4c\x43\xcd\x4f\x23\x2a\x1a\x91\xaf\xbf\x0e\xcf\x70\xcf\x85\x5b\xe9\xf3\x39\x37\x25\x2f\x41\xd8\x06\x7a\xa9\xee\x24\xa3\x27\x79\x5b\x8f\xd3\x80\x11\xbb\x20\x15\x4a\xd1\xf6\x00\xf3\x59\xcf\xe7\xa5\x81\x35\xa1\xad\x3a\xdc\x16\x9b\xc3\x0e\x8f\xe0\x69\x60\x80\x7a\xb2\x59\xe9\x1b\x09\x46\x4d\x38\x86\xb5\x8d\x4e\x68\xd7\x62\x26\x85\x02\x76\x9e\x7a\x32\x1f\xce\xce\x10\xc6\xc9\xf0\xed\x22\x93\x9e\x6d\x19\xa9\xed\xba\x36\xe4\xfe\x75\x1e\xe5\xdb\x5b\x63\x82\xad\xf4\x6a\xdb\x77\x0d\xda\x21\xf7\x39\x7b\x88\xdb\x76\x59\x7d\x81\xca\x46\x4f\xad\x21\xde\x01\x18\x53\xff\x26\xaf\x3d\x2d\x64\x54\xc3\x16\x14\xf7\x64\x04\x4a\xd9\xf3\xda\x40\x31\x2e\x6e\x16\x43\x08\xd0\x17\x3c\x22\x03\x9d\xc0\x72\x4b\x04\xd8\x33\x0c\x3f\x01\xa3\x34\x19\x7e\xf8\x5e\x3f\x1d\xce\xc2\xb3\xe8\x6c\x80\x53\x8b\x69\x02\x5b\x67\x81\xaf\x1c\x89\x27\x2b\xee\x5f\xcd\x29\xd5\xc2\x87\xd9\xb2\x66\xaf\x75\xa9\xef\x4a\xbd\x5e\xaa\x53\xae\xd4\x6c\x4e\x1e\x08\xa1\xcc\x6b\x90\x19\x4f\xe1\x78\xac\x66\x9a\x01\x0e\x81\xaa\x1d\x40\x16\xee\x48\x04\xae\x8f\x40\x60\xc3\x73\xc0\x56\x54\x70\xe1\x67\x28\x58\x8c\x98\x81\x27\x88\x06\xe5\xe3\xe7\x6e\xf2\xd1\xb0\xe3\x55\x30\xe8\x5c\xc4\x27\xdf\x8f\x90\x2e\x9e\x22\x9e\xd4\x70\xdb\x5e\xc8\x68\x97\x81\xf7\x87\xee\x2c\x7d\x5e\x3e\x02\xbe\xd4\x87\x40\x97\x74\xb6\x16\x0b\xbf\x5d\x20\xea\x34\x08\x15\x47\x7d\x9f\x50\x94\xcc\x43\x4f\xb5\xeb\x0a\x9e\x48\x6e\xff\x83\x35\xc2\xb2\xbc\x6e\xf4\xbf\x6e\x87\x55\x47\x92\xa8\x7c\xeb\x27\x6a\x51\x60\x35\x25\x6a\x34\x7b\x1b\x40\x18\x19\xce\xa4\x2d\x56\x08\xb3\xa8\x37\x02\x08\x8f\x60\x6a\x16\x6b\x77\xf1\xb1\x2f\xe8\x3b\x66\x73\xc1\x0f\x39\x6f\xdc\x79\x51\xae\xa0\x32\xb4\x34\x7a\x8e\xee\x15\x18\x24\xce\xaf\x04\xf2\xa9\x7b\xb7\xe1\x3c\x38\xd7\xa9\xdc\xe4\xc2\xc2\xc4\x61\x4c\x91\xfa\x23\x77\x33\x04\x82\x6e\xe5\x26\xcf\x09\x69\xc7\xe5\xd8\xfe\x41\xe8\xa0\x51\x0c\x19\xb8\x9f\x6c\x45\x07\xb5\xad\xd4\xc6\x42\xd5\x98\x06\x6b\xd3\xf9\x5a\x79\x85\xe4\x17\x48\xaa\xeb\xb6\xb7\x3c\x2f\x36\xf9\x0c\xcf\x52\x89\xcc\x7d\x7c\xe3\xf3\xa7\xe8\x6e\x43\xeb\xc8\xd9\x76\x19\xc0\xdc\xf4\x36\x9a\xec\x01\xfc\xcc\x17\x1f\x07\xa7\x07\x5d\x7a\x37\x7c\x51\xfe\x03\x01\x3b\xb5\xf0\xa9\x35\x51\x89\x37\x3c\xc3\x64\x99\x90\xa2\x2f\x39\xdc\x7e\x9f\x9a\x87\xa7\xed\x7f\xbe\xc0\xf1\xf8\x6f\xde\xf1\xb0\x49\x3c\x1d\xe3\xc9\x44\x96\x76\xdb\x9c\x4c\xf3\xc0\xa3\xe7\x9d\x11\x68\xd6\x27\x28\x83\xbc\xbb\x2b\xcd\x9d\xaf\x4e\x67\x96\xb7\xba\xa6\x43\x63\x07\x87\x11\x71\x36\x6a\x00\x91\x1e\x43\x0d\x9e\xba\x2f\xb2\xcd\x8a\x48\xbf\x6c\x55\x94\xc4\x7f\x12\x19\x80\xc4\x7d\xe7\x61\x30\x53\x2f\xeb\x2e\x6c\xad\xb0\x6a\xed\xac\x58\x33\x4b\x1b\x5b\x9b\xfe\x00\x78\xb1\xdf\x1e\xa8\xb7\x59\x98\x28\x12\xc9\xcc\x67\x00\xbe\x34\xec\xe5\x67\xc7\x40\x1d\x83\x58\x47\x76\xdd\xeb\xa9\xae\x7d\xa7\x81\x75\xc7\x41\x3e\x57\x67\x94\x22\xd9\x7d\x26\x00\x69\xf6\x62\xe7\xd1\xc0\xf9\x24\xe7\xa4\x86\xe1\x80\x62\x33\x53\xd5\x51\x6c\x8d\xac\x9a\xb0\x7a\x12\xb2\x62\xdb\x10\x52\x5f\xf1\x25\xef\x54\x51\x26\xe1\xe4\x68\x36\x4f\x7b\x74\x17\xcc\xce\x84\xea\x9a\x91\xf8\x8f\x18\xd9\xaa\xa5\x73\x9c\xb6\x46\x97\xb8\xaf\x7b\xeb\x43\x2a\xb6\x83\x73\xc5\x9b\x32\xce\xe1\xdc\x1d\x82\x3a\xe3\xc5\x14\x22\xfb\x28\xdd\x2f\x27\xdb\x31\xac\x1f\xea\xa5\x46\xbf\x48\x60\x6d\xdc\x85\x51\x8f\xe1\x91\xf3\x0d\x7a\x6a\xb6\x6b\x20\x25\x37\x9f\xb0\x49\xc1\x00\xae\x0a\xc1\x0c\xb5\xb3\x95\xec\x5b\x60\x32\xd0\xcc\x3b\xea\x08\x5c\x1d\xe0\x21\xce\x71\x96\xa7\x21\xe5\x0b\xc9\x2f\xd7\x71\x79\x91\x0b\xd2\xa2\x86\xa3\x86\x49\xb2\x45\xdc\x28\xb9\x83\x3e\xbe\x3e\x00\x9d\xda\x39\x76\x5d\x30\xae\x65\x74\x49\x07\x24\x08\x3c\xac\x31\xc4\x47\x1a\x35\x3c\x34\x0f\xcc\x8f\xba\xd2\x5f\x60\x7e\x47\xd6\x58\x55\x40\xa8\xf1\x02\x6c\x8a\xe8\xed\x69\x66\x92\x30\xfa\x51\x67\xa1\xde\x03\xd9\xd3\xf5\x44\xb3\xc6\x3c\xd6\xc6\x19\x4f\x69\xb0\x60\xde\xa9\xe9\xa6\x4a\x50\xb1\x85\xca\x82\x09\x30\x09\xb1\xf3\xb4\xc2\x48\x99\xdb\xd2\x6a\x45\x08\xfe\xc9\xfc\x54\x5c\x83\x00\xdd\xac\x74\x3e\xd7\xe5\x5c\x65\xe9\xb4\xd4\x65\xca\x66\x7d\x98\x27\xb0\x31\xae\x4d\x89\x76\x1e\x26\xed\x54\x21\x75\x58\x6a\xdf\xec\x4e\x7a\x9b\x70\xfc\xc9\xbf\x00\x41\xc0\x64\x13\xc2\xf6\xe7\x15\x8a\xd8\xcc\xac\xbf\x58\x57\x8d\x37\xfb\x9d\xf7\x65\xcc\xc5\x4b\xc8\x73\xc2\x9a\x07\x22\xea\xa4\x66\x30\xf2\xd9\x16\x6d\xcd\xb4\xba\xa3\x8a\x66\xbf\x55\x0a\x04\xe5\x2e\xa7\xb8\x9b\xbb\x33\xb1\x32\xab\xb5\x24\x96\xf7\x81\xa4\xdf\xd8\xaa\xd4\x02\x80\x92\x79\x22\xb2\xac\x46\xcd\x13\x28\x7b\x64\xa8\x0c\x11\xf9\xd1\x83\x5a\x98\x33\xd4\x47\x2e\xfd\xf1\x04\x06\x0d\x6e\x1e\xf4\x5e\x50\x3b\x23\x7a\x36\xff\x01\xd2\xd2\xdb\x98\x9a\x63\x87\x55\xfb\x54\xc2\x1e\x5b\x78\x38\xb7\x27\x4e\xdd\x4b\xd1\xe3\xe7\xc3\x2b\x4a\x8e\x34\x42\x3e\x48\x4f\x8c\x63\x50\x8f\x1a\x1c\xc9\xc8\x42\x5b\x50\xe2\x18\x63\xba\x58\x58\x4e\x1d\x8d\x09\x5e\x26\xcf\x8b\x82\x8b\x15\x9c\xa5\xb6\xa0\x68\x07\x65\x45\xda\x02\x54\xbe\xdd\xaf\x25\x53\x0b\x6e\x73\xfb\x0c\x88\xbd\x8d\x4d\x6a\x00\x8d\x78\xbe\x04\xbc\x8c\x6f\xaf\x67\x61\xf4\xe1\xb6\x4c\x48\xb8\x34\xc2\xa0\x71\x08\x94\xdb\x15\x17\x63\xec\x08\xc8\xc5\xab\x55\xf0\xd7\x33\xf1\x49\x14\x72\xa7\xef\xfa\x4a\x46\xfa\x34\xf7\xbd\xfa\x06\x23\x55\xbb\xd2\x4b\xd0\x10\x8e\x95\x94\xa8\x52\xc1\x41\xde\xdc\x3c\x44\x68\x94\x3d\x69\x9c\x66\x55\x3b\x72\xd9\x46\x8f\xe0\xe2\x7c\x9b\xae\xd2\x0c\x09\x35\xec\x3a\x2d\xd3\x2a\xa0\xf7\x01\xa8\x1f\x34\xb3\xa6\x9b\x8a\xa4\x14\xc0\xb0\x4e\x73\x35\x37\x95\x4e\x01\x72\x42\xb1\x29\x78\x85\x8f\xac\x22\x21\xc4\xcc\x94\x34\xaf\x60\x42\x09\x2a\x4a\x67\xd8\xe4\xa0\x1f\x02\x2c\x91\x1b\xa2\x45\xe6\x2b\x50\x7c\xcd\x07\x8e\xfd\xb8\x7a\x7a\x60\x5d\xbb\x94\xbb\x25\x8e\xa9\x8b\x18\x66\x8a\xde\xdb\x21\x90\x62\x00\x32\x8a\x99\x3d\x93\x38\xbb\xe5\x3d\x08\x51\xc3\x53\xed\x12\xb8\x21\x07\xbd\x20\x92\x56\x8f\x49\x29\x39\x52\x10\xbd\x4a\xb0\x16\x50\x64\x74\xd7\x6c\x68\x7c\xb9\x77\x0d\xb0\x0b\xb6\x8f\x75\x40\x52\x77\xd4\x5d\x63\xf8\x0e\x60\x1d\x79\x7a\x5b\x78\x06\xff\xc1\x53\x8b\x3f\xb8\x49\x5a\x53\xbc\x71\xfb\x62\x23\xb0\x84\xea\x37\x28\x96\x26\x13\x71\x94\x28\x8d\x8c\xab\x1a\x02\xdf\x13\x74\x25\x58\x8a\x16\xa3\x63\x38\x73\xe6\xce\x73\x51\x2c\x01\x36\x8f\x4f\x33\xe0\x24\x48\x6d\xc4\x96\xfe\xc8\xd7\xd6\xde\xb6\xeb\xb2\x77\x90\x9c\x2d\x56\xc6\xad\x31\x8b\x99\x13\x6f\xf9\x58\x9f\x08\xe9\xa8\xe1\xc6\xd9\x15\x33\x24\x25\xe2\x85\x07\x9c\x16\xbe\x29\xd5\x43\x11\x6a\xae\x09\xee\xe8\x4b\x4d\x21\x91\x52\xe9\x6a\xe3\x71\x68\xa2\xdc\xd4\xfd\x8a\xb3\xe7\x71\x76\x1a\x9e\x54\xac\x0a\x5f\x33\xc8\xbc\xf8\x58\x74\x4c\x32\x10\xfe\x16\x22\x77\xc9\x42\x1c\x31\xe8\x84\xde\xba\x7f\xfe\xdc\x51\xef\xfb\xbd\x2e\xa3\xde\xaf\x47\xc3\x0f\xa3\xee\x27\x15\xa8\x05\xcf\xd5\xc5\xa8\x0f\xac\x82\xbd\x8f\xdd\xd1\x87\x7e\xe2\xae\xc3\x12\x09\xf1\x28\xc8\x50\x88\x07\x24\x35\x82\x45\xa8\x1b\x9c\x4c\xda\x18\x16\x3d\x25\xe3\xe7\x8f\xfd\x2b\x41\xf2\x39\x9e\x74\xdd\xf5\x81\xcc\xb3\xb5\x2c\x61\x1c\x0b\x7d\x32\x05\x28\x4b\xb9\xca\x6f\xa2\x42\x8e\xc7\xea\x38\x06\xf0\x20\x2a\xe7\xe8\x9f\xb7\x17\x74\x24\x2d\x15\x1d\x09\x6a\xad\x36\xa8\x2b\x5b\x4a\x3b\x20\x6d\xf3\x58\x75\x07\x6a\x7a\xf6\xaf\x26\x83\x51\x5f\x8d\x06\xe3\x7f\x55\x5d\x2f\x20\xfa\xe7\x9b\xae\x7f\xce\x75\x7f\x04\xf2\xae\xc4\xc8\x59\x1b\x46\xf7\xb5\x40\x8c\xa9\xc6\x1f\x87\x37\x97\xe7\xd1\xdf\x5d\x37\xf5\x89\xf4\x73\xf0\x0b\x8b\x90\x8e\xc7\x37\x9f\xfa\xd4\xdb\x63\x28\x96\xe8\x5e\x5e\xaa\xab\x7e\xaf\x3f\x1e\x77\x47\xb7\xa4\x8c\x0b\xbd\x30\xea\x5f\x77\x07\x23\x2c\xd8\x18\x8d\xfa\x50\x8f\x11\x32\x18\xcf\xe3\xe2\x12\xe2\x71\xdd\x4d\xb6\xe9\x9e\x43\x94\xae\x93\xa1\x1c\x79\xe0\xdd\x84\x92\x93\xda\xf0\x43\xad\x88\xfb\x43\x18\xfe\x5b\xf5\xf9\xe3\x10\xb8\x41\x21\x2f\x76\xcb\x13\x64\xd4\xf7\x89\xb3\x78\x5e\x74\xc7\x62\x7a\x76\xdf\x0f\x5d\x3f\x34\xa8\x3d\x85\x28\xee\x53\xaa\x5a\xb8\x96\x65\x67\x29\x4b\x93\xcd\x73\x7f\x39\x0a\x37\xf6\x68\x6f\x4d\xd1\xe5\x70\x0c\xd3\xed\xbc\x3b\xe9\x2a\x68\xf1\xa4\xab\xde\xf7\xdd\xd5\xa3\xfe\xd5\x79\x7f\x04\x0b\x0a\xb9\x5d\x27\xf0\x32\x77\x47\x7f\xac\xc6\x37\x63\x92\x86\x7d\x7f\x8b\x54\xa6\xa0\x78\x3b\x3a\xf7\x2b\x0a\x26\xe9\x45\x77\x70\x79\x33\x6a\x4c\xb3\xc9\x50\x0d\xaf\xfb\xf0\x48\x98\x6e\x62\x40\xf0\x8a\xf1\x71\xa0\x22\x05\x6a\x51\xaa\x29\x8a\xd6\xed\xed\x6f\x22\x27\x55\xfd\x2b\xbc\xae\x25\x6f\x7a\xd0\x5d\xaf\x4d\x3e\x4f\x7f\x7d\xeb\x9c\x10\xb7\xf5\x77\xa1\x0e\x0d\x91\x17\x13\x38\xf8\x91\x63\xab\x54\x57\xe6\x81\x4f\x37\x7b\xc0\x4a\x1b\x48\x78\x41\x65\xd8\x1e\xfd\xc0\xf1\x49\xca\x5f\x53\xd0\x84\x4e\x48\xc4\x67\xdb\x4a\xad\x0b\x6b\x53\x60\x27\x42\x6b\x1d\x0a\x55\x41\x1b\xc2\x5d\x36\x75\x97\x3c\x68\xac\x89\x9b\x2d\x53\x03\x56\x4a\x6a\x09\x1d\x0b\xe7\x4e\x5a\xd5\x0e\x00\x3c\xf7\x7c\xee\x7e\x06\x08\xf0\x18\x3b\xc0\x30\x1a\x19\xee\xa5\x38\xe2\x24\x78\x0c\x55\xa5\xc9\xa1\x0e\xb6\x90\x4f\xb5\x15\x32\xea\xd1\x51\x03\x00\xa2\x59\xbd\x70\x2d\x76\xad\xf5\x37\xaf\x3c\xe3\x41\x45\xf8\x69\x48\x04\x0a\x3a\x02\xf8\x94\xc2\x56\x44\x34\x89\x71\xfc\x59\x91\xdf\x9b\x2d\xb9\xf3\x40\xe6\x8d\x66\x59\x9c\x9f\x83\x47\xc1\x33\x08\x55\x8b\x0c\x5e\x21\xa0\x66\xd4\xa1\x3f\xfe\x0f\x55\x96\xe6\x1c\x64\x5f\x17\x10\xee\x8f\xa3\x49\xe0\xcb\x31\xb0\xda\x9d\xe3\x9b\x7c\xde\x39\xf8\xa3\xeb\x46\xb8\x95\x63\x72\xe2\xd3\x7f\xb2\x54\xe0\x0a\x4f\x9d\x96\xa9\x59\xa8\x74\x6e\x34\xb4\x15\x72\x40\x15\x98\x6f\x9d\x3f\xa9\x3a\xf2\x70\xbb\x55\x7f\x64\x55\x0e\xb4\x6b\xfe\xd4\x40\xfd\x46\x43\xfb\xce\xc3\x95\xa2\x01\x45\xe3\x56\xe0\x41\xd2\xaa\x3d\xc9\x63\x14\x40\x0a\x76\xe4\x26\xed\xd3\x8d\xc2\x77\x22\x95\xcd\x28\xcb\xa2\x54\x47\xb5\xa4\x4e\xd3\x06\xde\x0f\x6b\xa6\x84\xcb\xb2\x58\x53\xf6\x83\xf5\x2f\xa6\x8c\x2c\x47\x5f\x84\xcf\x66\x51\x1c\x79\xfb\xce\xe7\xc7\xcc\x3d\x51\x21\xa6\x2b\x10\x2e\x89\x50\xd2\xf5\x23\xb6\x28\x9f\x70\xc2\x8e\x8d\x79\xac\xf7\x16\x2c\xf0\x88\x9e\x91\xed\x1c\x38\xf7\x52\x4e\xca\x10\xc2\x8c\xc2\xac\xfb\x46\x44\x66\x8b\x43\xaf\xbd\x53\xe9\xc2\x4d\xd2\x27\xda\xaa\x08\x62\x4d\xd4\xeb\x37\xaf\xd4\x27\x6d\xad\xea\xde\x9b\x44\xf5\xf4\x0a\x54\x8e\x0d\x23\x57\x5f\xfc\x9c\xa8\x9b\x71\x17\xe1\x43\x80\xcf\x97\x31\xd8\x22\xe7\x6c\x0f\xb1\xa1\xc1\x4c\x9c\x6e\x91\xe2\xb6\x2c\x72\xe2\xe6\x59\xeb\xb5\x29\xd5\x4a\xa7\x59\xe7\x80\x7c\x18\x31\xd6\x22\xc1\x96\xf8\xcd\xab\xd8\x54\xeb\x4d\xa5\xb4\xeb\xac\xd2\x67\xc2\xb2\xf4\x0b\x6d\x75\x90\xb3\x4b\x2b\xdc\x3e\x2c\x22\x12\xa2\x54\xdd\xaa\x98\x9b\xb7\x07\x1f\xf2\x62\xe5\x29\x43\x69\x56\xbe\xfe\x39\x69\x2c\xba\x5f\x7f\x55\xf1\x9a\x53\xf2\x4e\xac\x17\x86\x2e\xef\xbe\x1f\x0f\x2f\x6f\x26\xfd\xcb\x5b\x69\xc2\xbe\x83\x91\xa6\x41\x46\x0e\x9a\xff\x61\x5d\xd7\x3c\xfc\x44\x58\x9a\xfa\xa2\x0d\x27\x01\x6c\xce\x26\x73\xef\x68\x14\x21\xf9\x25\xcb\x00\xac\xe0\x0f\xbd\x93\xaf\x99\xfd\x24\x1b\x80\xb8\xa3\xe5\x76\xed\x9c\xac\x8a\xb5\x55\x30\x2d\xca\xcd\x82\xd7\xfb\x9b\x69\x46\xc2\x3f\xab\x1a\xef\x41\xe4\xc3\xed\x0a\x2d\x0e\x17\x6a\x56\x6c\x4a\x4b\x2a\x3f\xfe\x75\x10\x76\xb3\x3e\xec\x3e\xd3\x59\x06\xe1\x33\x2e\x1d\x21\xd2\x9e\xa5\xce\xdb\x5b\xf6\x0e\x21\x5c\x33\x68\x1e\x2c\x61\x20\xed\xdc\x58\x73\x32\xcb\xd2\xd9\x17\x8b\xda\x50\xf9\x46\xa5\x95\x59\xd9\x93\x13\xb7\xb9\x82\x2b\x6b\x37\x69\x65\x23\x18\x6d\xb4\xf8\x20\xa1\x74\x67\x68\x67\x32\xab\x75\x56\x6c\x4d\xa9\x8e\x18\x66\x4a\x32\x75\x5a\x10\xa1\x40\x81\x3e\x5c\x6e\x9d\xff\x9c\x09\xbd\xa2\x02\x28\x5e\x95\x16\xc7\x8a\x80\xaa\x1c\x86\x14\xa6\xaf\x63\x59\x04\x8a\xdb\x8e\xfa\x08\x59\x46\x65\x01\x4f\xf9\x8e\x44\x11\x2b\xa2\x3e\xb0\x6f\x0f\x6e\x8b\x6d\x31\xdf\xe6\x86\x17\x2d\x95\xe1\xf1\x1b\x6c\x4d\x69\x0b\x96\x81\xb1\x9e\x2e\x9b\xd7\xda\xff\x10\x73\xfa\x27\x75\xa4\x65\xad\x0b\x4a\x34\x40\xc4\x32\xcd\x08\x24\x05\x6b\x11\x60\x77\x00\xf9\x66\x79\xfa\xd2\x1e\xfb\xac\xd5\x74\xab\xfe\x05\xf8\x7e\x3e\xea\xd9\x17\x53\x76\x0e\xfe\x88\x12\x2c\x9b\x12\xd6\xd2\x64\xab\x7a\x45\x91\xff\x29\x51\xa7\xaa\xbb\x2e\xd3\x0c\x91\xf5\xf4\xeb\x44\x5d\x97\xc6\x42\xa9\x92\xbb\xf8\x97\x74\x66\x0e\x26\x4b\x5d\xfd\xe4\x73\x0e\x25\x17\x0b\xa5\xd5\xff\xf9\xf4\xf2\x91\xce\xb3\xc9\x70\xf4\xe7\x9b\xfe\xf7\xa4\x00\x7c\xa4\xfe\xf7\xcd\xeb\x97\xaf\xea\xf5\x1f\x67\xaf\x9f\xff\xa8\xff\xf8\x3d\x7e\x70\xf4\xd5\xfd\x59\xe7\xd5\xff\x13\xce\x3e\x3e\x3f\xef\x4f\x3b\xa7\x07\x31\x45\xe0\xd9\xf3\xd3\xe7\x27\x67\xcf\x4f\x4f\x55\x77\xae\xd7\xcc\xf6\xb9\xc6\xa8\x7c\xdf\xad\xa6\x75\x99\x5a\x43\xd5\xb2\x52\x5d\x97\xeb\x50\x3b\x20\xfe\x5d\x0f\xb2\x6f\x90\x4e\xa4\x11\x2a\xa7\x06\x7a\xdb\x1c\x5b\x0a\x2c\x76\xd2\x2c\x22\x21\x1c\x3c\x37\x88\x10\xcf\xed\x24\x74\x3b\x00\x37\x12\x05\xcc\xa5\xb5\x12\x32\x60\x34\x0c\x94\x2a\x4c\x88\x07\xe6\x85\xbc\x1b\x2a\x39\x8a\xf2\x7f\x6e\x0c\xfc\xf3\x9f\xed\x66\x6d\x4a\x67\x56\x57\xa6\xec\x14\xe5\x1d\x7c\x56\x89\x34\x35\xb0\x63\xda\xcd\xd4\xce\xca\x74\x6a\x24\x5b\x0b\x9c\xec\xae\xab\xb2\xd4\x56\x82\x0e\xf5\xe1\xe1\xa1\x53\x7f\xe2\x33\x77\xed\x4a\xe7\xcf\x32\x08\xf2\x2e\x8a\x67\xe2\xfd\x1d\xd5\xdb\xd8\xaa\x58\xb9\x57\x62\x75\x04\x35\x96\xb4\x62\x9d\x09\x52\x0a\x54\x13\x7e\x83\xb3\xdf\x0a\x3d\x55\xd3\x52\x43\x21\x89\xef\x56\x88\x7b\xb7\x8c\x28\x0c\x22\x03\xc0\x79\x2c\xb8\x7f\x77\xdc\x73\x9f\xea\xb7\x07\x7d\xd7\xf8\xb7\xd4\x63\x27\x74\xcb\x3f\x6b\xba\x7a\xc6\x17\x77\x66\xc5\xaa\x73\x70\xbd\x2c\x72\xf3\x56\x1d\xfd\xe1\xf9\xe9\xb1\x7a\x73\xfa\xe6\xe4\xc5\x9b\xe7\xcf\x0f\x3e\x9b\xe9\x5b\xe5\x3a\xa6\xf5\x2e\xf8\x0b\xf5\x56\x49\x0a\x79\xd6\xfd\x21\x66\x30\x81\xe2\x4f\x2b\x75\x5b\xc5\x94\x0f\xdf\x7f\x04\x8e\x8e\xa7\x9a\x3b\xf6\x80\x18\x26\xc5\xcd\x8a\x19\x19\x83\x3a\x9f\x23\x38\x9c\x0d\x0d\x9a\x5c\x62\xea\x0a\xca\x21\x49\x33\x46\x45\x92\x69\x45\x10\x3a\x7e\xa6\x3d\xed\xa8\xcb\x68\x36\x8b\xc9\x27\x2a\x25\x7d\x19\x6b\x4c\xe9\x74\x43\x70\xcc\x66\x03\xe4\xa7\xa6\x39\x7b\x8c\xee\x5a\x66\x5c\x2a\xca\x95\x4d\xf6\x02\xe4\x12\xac\x22\xf7\xe5\x57\xb5\xe2\xed\x2c\x6b\x80\x4c\xea\x91\x68\xe0\x81\x41\xa4\x6d\x37\xdf\xaa\x51\xa3\x99\x8d\x72\xe7\xd2\xf8\xfa\xe3\xbd\xc4\x56\x46\x90\x0a\x21\xd3\x0d\x26\xd6\x3d\xf1\x24\xa1\x6e\x5e\x25\xdc\x65\x96\x28\x35\x43\x03\x19\xca\x18\xd0\xb2\xbb\x1e\xd2\x21\x7c\x68\xcb\x47\xa4\xb9\xec\x51\xfe\x08\xa9\x47\xff\x4d\xbe\xe3\xe5\x37\xf9\x0e\x5f\x90\x2b\xf9\x0a\xd9\x01\x26\x89\x75\x37\x1b\x53\x9d\xd9\x30\xdc\x1e\x59\x22\x3f\xbc\x43\x88\xa9\xb8\x3b\x2c\xa3\x9e\x43\x67\x34\x0b\xd8\xdb\x9d\x23\xaa\x3c\x6f\x85\x58\x88\xfd\x1c\x62\x05\xf9\xb6\xae\x2a\x8f\x9f\xc0\xc5\xe2\x60\x0d\xe1\x0d\x98\x3b\x6c\xcc\x33\xf2\xc1\x25\x13\x5a\x5b\xb1\x72\x01\x97\x04\x32\x59\x44\xb9\xa0\xb7\x0a\xf6\xf8\x2e\xac\x90\x5a\x67\x1b\x2b\xe0\x45\x50\xb7\xc3\x79\xe4\x46\xdb\xe3\x86\x47\x9b\x07\xf7\x21\x11\x9c\x8a\x95\x0e\x0d\x22\xfa\x7f\x84\x37\x1d\x05\xb4\x24\x53\xad\x1f\xfb\x95\x2d\x72\xb2\xac\x35\xef\x8e\x68\x66\xf1\x42\xac\x17\x8f\xbd\x9b\x1c\x69\x81\x10\x4f\x03\x86\x6a\x5d\x03\x3b\x6e\x20\xc3\x37\xe3\xdd\x20\x9e\xda\x80\x40\x3b\xa4\x61\x44\x4d\x4b\x59\xb9\x51\x2c\x80\x31\xf7\xfa\xfd\x98\xa2\x70\x0f\xda\x72\x7c\x10\xe7\xcd\x55\x77\xdc\x55\x5d\x67\x47\xd7\x18\x43\x12\x75\xa9\x1f\x4a\x40\xa2\x5f\xa6\xf7\xa6\x84\xe1\xb9\x62\x12\x8f\x4b\xa4\xd0\x2d\x4a\x02\x3e\xfe\x62\xca\x74\x9e\xea\x9c\x67\x14\xf0\xf4\x12\x9a\x48\x9a\x3f\x1d\x75\xaa\x06\x62\xaa\x8e\x8b\x6c\x43\x90\x4e\x38\x1b\x7f\x49\x6d\x5a\xed\x3c\x8b\x9e\x11\x59\x84\x7d\x16\xe2\x1b\x72\xe2\xeb\xa9\x1b\x14\x31\xa9\x01\x6e\xf0\x90\x67\x85\x9e\xfb\xa9\x7b\x01\xd8\xe7\xfa\x4d\xd1\x39\xce\xaf\x41\x12\xc6\x22\xd4\x08\x3e\x72\x54\x87\x25\x95\x28\x6b\xcc\xee\xd3\xb6\x73\x48\x88\x8c\xc0\xe7\xa5\x86\x17\x21\xb7\x03\x2a\x59\xfb\x78\xbd\xf6\xa6\x83\x3a\xf0\x5f\x4d\x6a\xaf\x48\x98\xec\x5b\x25\x85\x9e\x22\xe9\x46\x84\x5f\x27\x11\xe3\x97\xfb\x32\x6a\xe3\xe5\x6d\xe8\x88\xf3\x36\x6a\xaf\xee\x79\xf7\x1a\x24\xc6\x7a\xc3\x4f\xd7\x37\x90\x5c\xe9\x5f\x4d\xfa\xa3\xeb\xd1\x60\x4c\x1f\xd3\x51\xbd\xe1\xe8\x7a\x38\x22\x35\xba\xc1\x64\xac\xba\x17\x17\x83\xcb\x01\xe4\xe3\xdc\x7d\xdd\x2b\xf8\x70\x16\x1d\xeb\x8c\x3b\xea\xc3\xf0\x97\xfe\xe8\xea\x13\x89\xc9\x41\x02\xe0\x02\x6f\xfd\xd0\xbf\xea\xb9\x0f\x6e\xf2\x87\x21\xf5\x17\xa6\x3c\xda\x68\xc0\x7c\x3e\xc5\x6b\xa1\xed\xa6\x06\x13\x89\x91\xf6\x61\xb8\x1e\x0d\x7b\x37\x23\x4f\x91\x36\xbe\x79\x3f\x9e\x0c\x26\x37\x93\xbe\xfa\x30\x1c\x9e\xc3\xe0\x62\x5e\xab\x3f\x7e\xe7\xf3\x28\x37\xae\xcf\xcf\xbb\x93\x2e\xbc\xf8\x7a\x34\xbc\x18\x4c\xc6\xef\xdc\x7f\xbf\xbf\x19\x0f\x60\xac\x06\xae\xf7\x46\x37\xd7\xae\xb3\x8e\xd5\xc7\xe1\xe7\xfe\x2f\xfd\x91\x82\x8c\xea\x39\x0c\x17\x89\xc2\x91\x1c\xdc\xf0\x42\xd2\xa3\x09\x3a\xb3\xc0\x60\x36\x9e\x8c\x06\xbd\x89\xbc\xcc\x75\xf4\x70\x34\x91\xc9\x9f\xab\xfe\x87\xcb\xc1\x07\x54\xe1\x13\x64\x67\xc7\x3e\xaf\x34\xb8\xa2\x20\xea\x6d\x23\xc5\x74\x11\xaf\x8a\x90\x9a\x79\x72\xda\xa5\xc6\x75\xee\xd3\xdf\xce\x12\x14\x2a\x39\x99\x7e\x00\x8b\xf1\xa6\xd2\xcb\x44\x6c\xf5\x90\xff\x9f\x19\x0c\x0a\x58\x35\x5b\x16\x29\x22\x9c\x32\xfd\xa0\xca\x4d\x66\x2c\x28\x87\x18\x75\xfa\x56\x85\x1d\x39\xec\xb6\x24\xd7\xaf\x8c\x2e\xb3\x54\xc4\xaa\xef\xcf\x3a\x2f\xc4\x4e\xdd\xe1\x9b\x59\x61\x4b\x6e\xd8\x66\x5b\xe4\x73\xbf\xa7\xbb\x3b\xf1\x2c\x96\xbf\x89\xe8\x98\xf9\x0f\xa1\xba\x1e\x79\x3f\x19\x86\xaa\x74\xf5\xf6\x40\x78\x4d\xeb\xa9\x45\x5a\x6c\xb7\xdd\x8e\x8c\xbd\x4c\xa7\x63\x38\x16\x46\xc6\x6e\xb2\xaa\xa3\xed\xfa\xff\x67\xef\xcf\xb6\xdb\x38\xd6\x3c\x51\xfc\x7f\xad\xa7\x88\x3f\xce\xa9\x32\xd9\x27\x99\xe2\xa0\xc1\xb2\x57\xad\xd3\x10\x90\x94\x60\x93\x00\x0b\x00\xad\xcd\xdd\xab\x97\x3a\x80\x0c\x10\xb9\x95\xc8\xc4\xce\x81\x34\xf6\x55\x3f\xc2\x79\x86\x73\x57\xaf\xd1\xf5\x26\xfd\x24\x67\xc5\x37\xc4\x90\x99\x24\x25\x6f\x5b\x2e\xd7\x06\x2f\x6c\x11\x44\x46\xc6\xf8\xc5\x37\xfe\x7e\x3f\xff\xdf\x9f\xd4\xee\x3e\x2f\xe2\xf2\x5f\xf2\xad\xca\xb6\x8b\xf2\x9f\x93\x2c\xae\xcb\xaa\xd8\xfd\x4b\x3f\x4d\xff\x79\x5b\xe4\x42\x8b\xcf\x8f\xc4\x05\x0e\x1f\x2e\x65\xa5\x6e\xf3\x62\xf7\x2f\xe7\x85\x52\xff\x74\x7a\xcc\x57\xdd\x3f\x9d\x1e\x0f\x49\x42\x97\xff\x9c\x17\xb1\x2a\x3e\x2e\x76\xff\x02\xc4\xdf\x6c\x02\x5a\xcd\x9b\xcc\x4c\x50\x67\x76\x56\x85\xa2\xbf\xa6\x36\x70\x70\xaf\xf4\x2d\x8c\x29\xab\x3c\x03\xac\xe0\xff\x96\x60\x20\xe1\xf3\x58\x6d\x0b\xa5\x07\x1b\x7f\x24\x28\x90\xff\xeb\x57\x76\x04\x3d\x85\xff\xf1\xea\x65\x13\xff\xe3\xc5\xc9\xe9\xe9\xde\xff\xf3\x35\x7e\xf6\xf8\x1f\x7b\xfc\x8f\x3d\xfe\xc7\x1e\xff\x63\x8f\xff\xb1\xc7\xff\xd8\xe3\x7f\xec\xf1\x3f\xf6\xf8\x1f\x9f\x8f\xff\xb1\xc7\xfe\xf8\x23\x63\x7f\xec\x71\x3f\xf6\xb8\x1f\x84\xfb\xb1\xc7\xfc\xd8\x63\x7e\xec\x31\x3f\xf6\x98\x1f\x7b\xcc\x8f\x7f\x40\xcc\x8f\x3d\xde\xc7\x1e\xef\x63\x8f\xf7\xb1\xc7\xfb\xd8\xe3\x7d\x7c\x4d\xbc\x8f\x3d\xd6\xc7\x1e\xeb\x83\xb1\x3e\xfe\x88\x38\x1f\x7b\x8c\x8f\x5f\x1b\xe3\x63\x8f\xef\xb1\xc7\xf7\xf8\xe3\xe2\x7b\xec\xb1\x3d\xfe\x31\xb1\x3d\xc4\x1b\xf8\x74\x8f\xed\xb1\xc7\xf6\xf8\xd5\xb1\x3d\xf6\xb8\x1e\x7b\x5c\x8f\x3d\xae\xc7\x1e\xd7\x63\x8f\xeb\xb1\xc7\xf5\xd8\xe3\x7a\xec\x71\x3d\xf6\xb8\x1e\x7b\x5c\x8f\x3d\xae\xc7\x1e\xd7\xe3\xd7\xfc\x09\x9f\xbf\x9d\x0d\x8f\xce\x8e\x06\xa9\xd4\x1b\x6a\x9c\x1f\x8d\xeb\x65\xaa\x64\x71\x44\xfb\xfa\xe8\xf4\xf8\xe4\xc5\xdf\x57\x10\xf2\x14\xff\xff\xe9\x59\xb3\xfe\xe3\xd5\xab\xd3\x3d\xff\xeb\x57\xf9\xb1\x97\xc0\xff\xfa\x37\x71\x7a\x7c\xfc\x6d\x20\xf4\x82\x8b\x49\x21\x97\xa9\xc9\x92\xd5\x62\x44\xae\x56\x49\xaa\xa5\x61\xd9\x8d\xea\xf1\xec\x1a\xb3\xe0\x1d\xbf\xb2\xf1\xad\xa3\x02\xdd\xa8\x99\x47\xe2\x6c\xf5\x1b\x01\x13\x54\x4f\x20\x12\x40\x64\xfc\xbf\xb4\x0a\xd7\x7f\x11\x1a\xc1\xd3\x55\xf9\xb6\x27\x56\x24\x86\xdd\x3d\xf8\xa5\x50\x02\xbf\xac\x13\xbf\x36\x16\xc0\x7f\x11\x63\x27\xe3\x93\xf5\x09\xda\x4d\x03\x72\x88\x22\xb1\xba\x23\xde\x31\x7b\xa2\x74\x49\xb7\x4b\xbe\x2f\xeb\x12\x6b\x05\x54\x16\xe7\x05\x82\xc4\xa0\xf7\x4e\xd9\xaa\xe7\x36\xab\xba\xb5\xf9\x68\xe7\x90\x6b\x7c\x29\xb6\x45\xa2\x37\x14\x09\x6f\xc7\x3f\xfa\xec\xe1\x1a\xe6\xb7\x37\x0f\x3b\xce\xb0\xa2\x74\xf4\xf6\x7a\x3e\x99\xce\x8c\x83\x4c\xff\xe1\x2b\xd6\x34\x7f\x96\x33\x0c\x0a\x98\x1f\x2f\x5b\xf6\x47\x39\xf9\x30\x8e\xc8\x31\xe5\x0c\xf1\xa1\x02\xe3\x60\x5f\x5e\xfc\x87\x2b\x2f\xd6\xda\xa0\xc5\x67\x30\xd9\x73\xee\x01\xa2\x6a\x00\x2e\x6e\x0a\x6c\xd2\x24\xa4\x67\x52\x45\xda\x8a\x4a\x88\x58\x9c\xc0\xb7\x03\x48\x72\xae\x8a\x7a\x89\xf2\x9a\x32\x01\x30\x00\xb4\x91\xf0\xb0\x74\x32\x88\x33\x54\x3d\xc4\x4a\x2e\x81\x61\xff\xeb\xd1\xe0\xff\xc3\xfe\x84\xcf\x3f\xfc\xfc\x21\xc9\xe2\xfc\xbe\x3c\x32\x31\x9a\xa3\xb3\x5f\x15\x0c\xee\x09\xfd\xef\xf4\xec\xf5\x59\x43\xff\x7b\x79\x7a\x7c\xb2\xd7\xff\xbe\xc6\x0f\xc6\x8d\x46\x13\x7d\x13\xcc\x47\x83\x88\x71\x9a\x1e\xc8\x50\xea\xaa\x48\x71\x4b\x6d\x17\x85\x56\x5c\xc0\x13\xe8\xd4\x5f\xad\x1c\x50\x1e\x99\x6a\x39\x61\x8c\xe9\x4a\xfd\xdc\x40\x3b\x82\x96\x0a\x95\x2a\x69\xb3\x06\xb8\x61\x49\xf9\x1a\x4b\x2f\x81\xee\x9e\x77\xb0\xb8\xa0\xef\x5d\xe0\x97\x02\x08\x70\x43\xea\x48\xc3\x2b\x77\x16\x9e\x70\xdb\xe6\xbb\x9f\xe5\xa6\x6b\x3c\xd5\xe9\x1b\xec\x9c\xa0\x87\xdf\x6c\x74\x2f\xae\x45\x98\xaf\x9d\x78\x29\x18\x7f\x6e\x12\x79\x5d\x42\x4a\xda\x76\xa7\x25\x71\xf6\x89\xf3\x93\x9a\x79\xab\x38\x3d\x38\x98\xfb\x0c\x55\xf0\x80\x35\x4b\x37\xdf\xce\x4d\x9c\x00\x20\x05\x3f\x49\x85\xa6\x94\x53\x65\xc9\xb3\x0f\x7e\x3a\xcc\x49\xd3\x2a\x17\x26\x7f\x3d\x59\x88\xf4\xb0\x4f\x6f\x89\x79\x54\xf4\x0d\x5e\xc6\x07\xbe\x09\x81\xf3\x46\xea\x34\xed\x90\x00\x31\x14\x12\xb3\x4f\xc8\x3e\x28\x03\xf6\x97\xd3\xac\x9a\x7c\x01\xd8\x21\x16\xfc\x2f\x76\x0a\x76\xd1\xd5\x47\xbe\x36\xb9\x0b\xc5\x3c\x17\xf2\x2e\x4f\x62\xb1\x49\xca\x54\x49\x4a\x4e\x87\x58\x82\x2c\x1d\x67\x3e\x05\xa4\x9d\x9a\x0f\xae\xc1\x70\xf2\xeb\x63\x05\x39\x85\xd0\xba\xed\x17\x39\xf9\x60\x56\xe1\x79\xac\x2f\x62\x60\xab\xbf\xd4\xe4\xbb\xc7\x4b\xb8\x61\xda\x70\x3e\xfc\x72\x99\x17\xba\x73\x14\xb2\x7e\x61\x73\x13\xc0\x2d\xea\x27\x3f\xe6\x2b\xbb\x4b\x4c\xfd\xa1\x99\x4e\x2c\x8f\xc7\x72\x18\x84\x0f\xe1\x9a\xd4\x2a\xa7\xb9\x6d\x0e\x41\x2f\x0e\x4f\x2a\x3c\xd8\x28\xd0\xe2\xe0\x50\x0e\xf3\x8f\xe9\x12\x6b\x59\x75\x4d\x8d\xfa\x2d\x67\xe6\xf7\x16\xbd\xff\x21\x7e\xc2\xe7\xdb\x72\x55\xc8\xdb\xdf\x0a\xfb\xf5\xff\xf7\xf4\xfd\x7f\xfc\xfa\xac\x8d\xff\x7a\xf2\x7a\x7f\xff\x7f\x8d\x1f\x5a\xfd\xb8\xfa\xb9\x05\xeb\xf1\xe6\x95\x18\x14\x32\xb9\x15\x6f\x65\x51\xc8\xaa\x0a\xc4\x65\xb2\x5c\x4b\x95\x8a\x41\x28\xde\x15\x32\xa3\x72\xb7\xa1\xbc\x4b\x62\x31\x90\x45\xaa\xa5\x62\xf8\xcc\x71\x0e\x21\xc4\x02\x3b\x88\x20\x08\x40\xd9\xc7\x7f\x90\xf8\xd6\x30\xcf\xbe\x01\x8f\x30\x55\x4a\x70\xa9\x6a\x2e\xea\xb2\x51\xea\x8f\x75\xdb\x09\x3a\xcd\x38\xb6\xa9\x9f\xd6\x97\xea\xff\x1f\xf3\xd5\xf8\x1b\x8d\xfa\x6d\xba\x43\xf4\x00\x6d\x16\x17\x5c\x59\x80\x15\x02\x11\x69\xe3\xc6\x49\x0a\x83\x8f\xc1\x15\x18\xea\xe7\x6d\x9a\x2c\x93\x2a\xdd\xc1\xed\xa3\x62\xf1\x3e\x9a\x46\x9f\x25\xe1\x1a\xfe\xdf\x8b\xb7\xe3\x8b\x5f\x5d\x14\x3c\x71\xfe\x5f\xbc\x3c\x3b\x6e\x9c\xff\xb3\x17\x2f\xf6\xfa\xff\x57\xf9\x69\x82\x3b\x1f\x9f\x05\xa0\x7f\x4e\xd5\xad\x5b\xac\x7b\x9d\x25\xa0\x27\xe2\x51\x1a\xc8\x34\x59\xe5\x45\x96\x48\xbd\x47\x8b\xbc\xbe\x5d\x5b\xec\xc5\xb7\xaa\xf8\xa4\x52\xb5\xeb\x82\x5e\x14\x07\x8e\x77\x18\xc2\xbe\xdb\x8a\x8d\xff\x42\xfd\xb5\x4e\x0a\x45\x65\xd0\x77\x32\x2d\x6d\x9e\x33\x40\xdf\x0d\xd5\xb6\x0a\xf5\xb7\xa3\x4c\x15\xb7\xbb\xc3\x07\xc0\xa5\xff\xe3\x79\x99\x0f\x4e\x0e\x7f\x77\x3f\xf3\xc1\x69\xbb\x0f\x7f\x6c\x4f\xf3\xc1\xd9\x61\xa7\xaf\xf9\xf1\xed\xfa\x59\xdb\x34\xe8\xdc\x70\x7b\x97\xf5\xde\x65\xfd\x8f\xe0\xb2\x7e\xf6\x07\x70\x59\x17\xec\xe0\xc8\x72\x91\x2f\xd2\x84\xaa\x8f\xef\xd7\xb2\x2a\x73\xc8\x7d\x80\x12\x73\x2a\xeb\xce\x76\x62\x51\xdf\x8a\x55\xf2\xb3\xb6\xc0\xb7\xb2\x5a\xae\xa9\x32\xaa\xde\xde\x16\x32\xb6\x59\x7b\x0c\x73\x1c\x88\x55\x9d\x2d\x51\x30\x80\x14\x81\x4c\x7a\xc8\xfa\x31\xc5\x43\x7e\x6d\xde\x41\x2f\xca\xd6\x92\x8a\xd7\xcb\xde\x21\xa1\xa7\xe4\x99\xfa\x5e\xac\xb9\x5a\x8b\x34\x46\x8b\x03\x00\xe9\x05\x60\x24\xbb\x4f\x3b\x50\xd3\x24\xe0\xc0\xc7\xb4\x4c\x77\x01\x96\x41\x17\x6a\x59\xa1\x81\xfd\x99\xf2\x8c\x45\x0a\x54\xf0\x60\x3d\x78\xa9\xb6\x12\x8a\x13\x58\xae\xb4\x90\xee\x6c\x8d\xbf\xdb\x39\xf0\xa4\x60\x8d\x29\xe5\x60\x20\x98\x81\x2f\xf7\xa9\xb1\xef\xa0\xd6\x36\x3b\xa2\x44\xc5\x3b\x15\x88\x22\xdf\xc9\xb4\xda\x1d\x61\xcd\x83\x2a\xb6\xaa\xaa\x4d\x05\x13\x62\x95\x66\x65\x25\xd3\x34\x40\x57\x17\x97\xdf\x6d\x0b\xdd\x61\xe5\xd6\x5c\x83\xbb\x2a\xf0\x2a\x2d\x9c\xa2\x0a\xc4\x2f\x56\x85\x93\x6f\x64\x4d\x0e\x34\x5d\x6c\x49\x5f\x7b\x9c\x8d\xfa\x6e\x74\x8d\x19\x94\x09\x7b\x77\x22\xe2\xb2\x57\xa4\xb9\xf9\xe3\x38\x17\xc2\xe7\xfd\xab\xd9\xc5\xd1\x69\x78\xfc\xdb\x79\x00\x1e\xd7\xff\x5f\xbc\x6e\xfb\xff\xf5\xbf\xf6\xfa\xff\xd7\xf8\xe9\x5f\x5d\x5d\x44\x8c\x8d\x35\x9b\x5c\x4f\x07\x51\x0b\x00\xf4\x34\x3c\x16\x47\xa2\x5f\xdf\x6a\x05\xf1\x55\x00\x56\x82\xb8\x42\x07\x7d\xa1\x64\xec\xd5\xa6\x8a\xa5\x2c\xb4\xbd\x9e\x6a\x4d\x68\x05\x79\x9f\x84\x96\x8b\xd5\x36\x8e\xa2\x03\x65\x9f\xee\x5f\x21\x86\xd8\xfa\x5a\x60\x52\x04\x41\x32\x91\xfd\xbd\x50\x62\x91\xd7\x99\x2d\x14\xf2\x50\x59\x4c\x52\x9e\xef\x6c\x44\x30\x3b\x70\xfb\xea\xa6\x58\xea\x77\x3e\x1b\x88\x2d\x0e\x91\x9e\x35\xb0\xec\x14\xe9\xac\x7c\xc8\xb8\xed\x36\x55\x00\xa6\xfc\x9d\x18\x65\xe2\x07\x99\x01\x5e\xea\xe9\xf1\xf1\xeb\x40\xe0\x1f\x19\x52\x07\xb5\x46\x16\x58\xa0\xb6\x82\x12\xd8\xc3\xaf\x0d\x48\x6c\x61\xa2\x5b\x4f\xf7\x91\xfe\x82\xbf\x83\x17\x85\xb2\xd4\x0d\xe0\x32\x41\xad\x01\xe0\x72\x9a\xdf\x1b\x18\x22\x54\xdb\x01\x1f\x41\xd4\xdb\x58\x56\x2a\x46\x47\x4a\x66\xa4\x24\x79\x17\x20\x13\x17\xda\xda\xc8\xd8\xcc\x8c\x16\x0e\x7a\xfd\x19\x31\x8b\x3c\xf2\xdf\x8b\xa1\x2d\xfd\x6e\xa0\xa0\x7d\x01\xf6\x99\x1d\x96\x38\xc0\x31\xf6\x0e\xe1\x4a\x2c\xcd\x85\xe7\x5c\x85\x50\x47\xfd\x24\x66\x1a\xb6\x09\x09\x75\x54\x35\xdc\x85\x5f\x06\x50\x60\x13\xae\x9e\x1d\xe4\xb1\xea\xa1\x20\x77\x71\x90\xd0\xf7\xed\xd7\xc9\x36\xf6\x0a\xbe\x8d\xe2\x13\x4d\xf6\x00\xe7\xf8\x1c\xf4\xe8\xd3\xde\x21\x04\xd7\xc0\x42\xe0\xd8\x02\xfd\x89\xb1\x3a\x4e\xc2\x13\x5c\xf1\x64\x09\xe3\xbe\x92\x95\xbe\x8c\xa7\x60\xe8\x22\xac\xda\x77\xe2\x40\x1e\xb2\x41\xb5\x94\x50\xcf\xa9\x0a\xc5\x83\x2f\xa9\x92\x42\x66\x15\x56\x5a\x32\xf4\xe6\x41\x72\x28\x28\x5d\x32\x5f\x69\x45\x08\xb1\x00\xa1\x68\xbf\x50\x22\xcb\xef\xf5\x04\xe9\xa6\xe4\x4a\xdf\x9c\x72\x89\x36\x79\x20\xf2\x7b\xc2\x1b\xcf\x0b\x21\x4b\x8b\x73\x8a\x6f\x04\x80\xc6\x24\x39\xc4\xa6\x80\xa8\xc6\xcc\xdb\x46\x56\x55\x93\x8c\x44\x77\xcf\x9b\x7d\xdc\x94\x00\x15\x41\xf3\xac\x7e\x86\x51\x9b\x0c\x51\xaa\x5e\x0f\x1c\x0b\x95\x6c\xc7\x46\xdd\xb5\xd7\xae\x55\x7c\xb2\x55\x91\x64\xb7\x70\xb5\x63\x81\xc4\xc1\xa2\x6b\x06\x59\xbb\xfc\x6a\x13\x08\x2f\x7c\x7a\xfa\x92\x0c\xcb\x6c\x2e\x1b\x30\x56\xf2\x93\xca\x10\x1f\x83\xd0\xb2\x96\xf9\x46\x2b\x26\xa8\x0e\x6b\xe3\xd9\x9b\x8f\xd0\xec\xb1\x53\xd1\x1b\x58\xd3\x95\xd1\xfa\xe0\xc4\xaa\xa2\xc4\x14\x0d\x7d\x86\x2a\x42\x71\x58\x62\x5d\x0e\x15\x2e\xd3\x84\x1b\xbd\x19\xfe\x4a\xe1\x51\xaf\x8b\xf6\x85\x67\xfa\x85\xc8\x60\x84\xe7\xcd\x62\x76\x34\xb6\x42\x73\x8c\x98\x4c\x6d\x46\x05\xf9\x64\xee\x1a\x33\x19\x4c\xe3\x39\x0e\x0d\x81\x6f\x49\xdb\xd2\xa0\xc7\x11\x7a\x8f\x51\xe5\x6c\x07\x5f\x88\x5e\xf4\x33\x40\x9d\xe8\xcb\x6b\xa8\xb6\x69\xbe\xa3\x5e\xe2\x79\x03\x84\xd9\x87\x30\x20\x2c\x70\x04\xe8\xf4\xee\x50\xad\x0c\x0b\xac\xee\x0e\xab\xc5\xbf\x05\xd6\x5a\x70\xd3\xc1\x6f\xf2\xfa\x7b\x1e\x86\xde\xae\x04\xe0\xe0\xb6\x1d\xd8\xc5\x97\x25\x22\xa1\x01\x6a\xd2\x85\x2c\x6e\x55\x21\x3e\x00\x56\x23\x61\x11\x52\xb9\x94\x45\xbb\x22\xb8\xfb\xc0\xc1\xda\xc2\xbb\xa1\x12\x69\xb2\x49\x08\x6c\x3b\x56\x69\x72\xa7\x8a\x1d\xf9\x7a\x2a\x28\x3b\x66\xb7\x9f\x53\xe5\x40\xcc\x69\x4b\x67\xef\x49\xb1\x4c\x01\xd2\xc0\x1f\x94\x9d\xf3\x97\xa2\xe7\xf4\xd4\xec\x42\x1f\x20\x53\x2f\xbd\x2a\xfd\x29\xd5\x06\x59\x63\x25\xf1\x95\xa0\x83\xeb\x11\x34\x49\x12\xba\x15\x04\xd3\x93\x57\xa2\xe7\xed\x1f\xec\x0b\xcc\x1b\xa7\x2e\x88\x2a\x0f\x30\x36\x09\x49\x0d\x45\xbe\x31\x9b\x8c\x41\x95\x73\xdc\xae\x65\xbd\x28\x11\x66\x82\xfe\x8e\x49\x50\x94\x11\xde\xb1\xe5\xf1\xa6\x54\x77\x49\x5e\x97\xbf\x78\xff\x3f\xd4\xc0\x67\x1e\x04\x01\x98\xd9\x30\x7f\x36\x03\x23\x26\xb0\x1a\x55\x30\x2a\x35\x86\xb1\xa5\xf7\x12\x91\xd0\x11\x69\x4c\x17\xda\x50\xce\x84\xd1\x60\xb2\x8a\x9d\xcb\x12\x03\x22\x0e\x0c\xa8\xbb\xcc\xde\xee\x87\x0c\x31\x75\x8f\x0f\x18\x75\x42\x5f\x07\x00\xc6\x60\x26\xc7\xd8\x7d\x7c\xe7\x43\x4c\x64\x63\x25\xb5\x55\x1f\x18\x3c\x30\x5f\x79\xaf\xb5\xbb\xe2\x75\x4b\x4b\xc0\x1d\x0a\xe2\x00\xf8\x8f\xe0\xca\xc7\x2d\xb9\xb2\xa5\x12\x0d\x75\x47\x96\x06\xaa\x23\xdd\xa1\x82\x65\xf5\x1a\xa3\xb4\xb4\x81\x5e\xdc\x93\xd9\xf5\xba\x6c\x47\x5a\x5d\xd9\x74\x66\xb8\x4a\x4f\xc9\x5a\x4f\xf9\x45\xaf\x36\x08\x78\x46\xcb\xb4\xf0\x3a\xa4\x5f\x25\xae\xce\xc5\xa0\x2f\x1c\xcb\xb3\x60\x41\x07\xe5\xa1\xc9\x87\xd0\xfd\xb0\x17\x30\x00\x4a\x38\xc9\x28\x54\x7b\x11\x3b\x61\x7e\x77\xcc\x50\xbd\xff\x4b\x26\xd2\x2c\xe8\xb7\xa2\xe7\x34\xe8\x5e\x42\x50\x5f\x2a\x0c\xb0\x17\xa3\x47\x3d\xb4\xa4\xa8\x21\x96\x50\x63\x63\x48\xc1\x1e\x46\x97\x72\x57\xf2\x01\x70\xa8\x80\xd8\xc2\xf4\x11\x2a\xcb\x7c\x99\x48\x8c\x8c\x56\xaa\x58\xc9\xa5\x72\xd0\x96\xf8\x10\x96\xcb\x22\xd9\x56\xa5\xf1\x37\xc3\xc5\x9c\xa7\x34\x8b\xc6\xc1\xce\x0e\x15\x07\xa1\xcf\x05\x7c\x3a\x70\x16\xe0\xd0\x6e\xfd\x37\xa2\x77\x93\xd7\x3d\x3d\x6c\xfd\x0f\x47\x45\x80\x8b\xeb\x2e\x89\x6b\x99\x22\x50\x2f\x02\x6e\x93\xb6\x40\x88\x2f\x7a\xa0\x14\x9b\xe9\x02\x30\x3a\xcf\x0b\xf7\x31\x00\x24\x6a\xbe\x8f\x20\xb0\x70\x4a\xa8\x75\x6b\x00\x14\x79\x5a\x06\x08\x60\x01\xbf\xa4\xb0\x17\x11\x83\x9d\xdf\xa9\xaf\x24\x44\xcf\x80\x79\xd1\x17\x44\xa0\x2f\xa0\x80\xb4\xbd\x1e\xfd\xa5\x79\xac\xb7\xf9\xbd\x36\xc0\xa8\x20\xc8\xb9\xaa\x03\x04\x51\x65\xfb\x0f\x3f\x34\x09\xad\x99\x44\x05\xd3\x6c\x76\xec\xb4\xc5\x71\x5f\x30\xd7\x03\xb6\x6a\x74\x06\x4c\x3e\x5b\x1c\x82\x96\x58\x94\xeb\x64\x8b\xa2\x76\x55\x81\x3a\xb6\xd4\x6d\x1e\xbc\x3c\xfe\xa7\x43\xc1\xc5\x94\x74\x8d\xe4\x75\x05\xe8\x5c\x60\xe7\xac\x25\x11\xb4\x2d\x54\xa6\x56\x09\xe4\xee\x79\x0d\x3a\x7d\xe2\x5c\xb3\x2b\x13\xd8\xba\x2e\x55\xf9\xbd\x18\xd8\x60\xce\x3f\x8b\xa9\x03\xee\x13\x8a\x59\x97\x21\xd4\xc0\x7b\x69\xd9\xd0\x78\x20\x5d\x47\x61\x89\x0b\x60\x2a\x9a\x39\xd1\x0c\x70\x65\x31\x1f\x99\x90\x53\x5d\xa3\x32\x8b\xad\x01\xde\x75\x7f\xea\x43\x99\xc6\x47\xf7\x49\xdc\x70\x31\x06\xbe\xff\xd1\xe2\xbf\xf8\x76\x46\xbe\xc2\xae\x7e\x83\x36\x5d\x97\xe9\xe5\x1b\xd5\x25\xea\xe9\x2c\x99\x1b\xfd\xa9\x1e\x46\xe8\x3d\x0d\x4f\xc4\x75\x66\xc2\xff\x70\xdf\x18\x94\x25\xdf\xc2\x09\x18\x1c\x35\x60\xef\x73\x80\xf2\x00\xc5\x9f\xa3\x80\xea\x9d\xcd\x26\x42\x5e\xdc\xca\x2c\xf9\x9b\x65\x2b\x15\x2d\xb5\xd6\xa0\x5b\x07\xa2\xb6\x5d\xf1\x71\x8e\x1b\x23\x42\xf4\x75\x03\xf3\x87\xb8\x7f\x47\xce\x27\xdb\xba\xd8\xe6\x40\xfc\xeb\x87\x48\x13\xc2\xaf\x06\x21\x94\x2d\x8d\x99\x2b\x04\x1c\x37\x43\x45\x40\xd1\x4f\xc4\x60\x61\x13\x4f\x7f\xe0\x91\x62\xf8\x9a\x8f\x9f\x6d\x09\xb7\x03\xd3\x89\x6c\x8b\x44\x55\xda\x6e\xe4\xba\x7c\x1f\x1a\xbb\x34\x2b\x4e\xac\x4b\x3b\x21\xb7\x5b\x25\x8b\x07\xcc\x53\xfd\x74\x13\x40\x9b\x5b\xee\x7a\xa2\x0b\x51\x9b\x36\xb3\x0b\x97\xac\x27\x61\xe1\x4c\x02\xa3\xfe\x35\xb2\x1b\x2d\x0e\x5b\x45\xf8\x05\xe6\xef\x0d\x95\xc0\xb7\x3b\xe0\xd4\xb8\xe1\xd6\x9b\x16\xf4\x72\x6b\x6f\xe0\x58\x5d\xd8\x2f\x04\x86\xd5\x52\xd0\xe2\x7f\x91\x36\x9d\xb5\xef\x68\xa2\x85\xad\xf0\x11\xc6\x07\xf3\xc7\x41\x81\x54\x17\x28\x8c\x0e\x95\x96\x14\x20\xbb\x03\x07\xd6\xcf\x46\xdf\x51\xac\xcf\x48\xe8\xbe\x0a\xcd\x99\x3a\x25\x7d\xb4\x75\xa2\x28\x3b\xa7\x35\x2f\x5f\xeb\xa4\xb5\xad\x76\xf8\xa2\x6f\xc3\xfd\x6a\x87\x0b\x05\x68\x5a\xe6\x62\xa3\x94\xcb\xce\xeb\x21\x13\x3f\x74\x04\x4b\x59\x25\xe5\x6a\x67\x50\x2d\x7d\xc1\xce\xb3\xae\x05\x18\x6c\x44\x32\x26\x2c\x59\xa9\xb7\x13\xf5\x47\x9e\x2e\xff\xc0\x96\x8f\x6b\x10\xb7\x55\x4b\x24\x53\x0a\x15\x71\x33\x69\xc5\x4c\x2b\x17\x49\x59\xa1\x49\xc4\x60\x14\x99\x88\x7e\x5e\x27\x8b\xa4\x12\x7d\x33\x1d\x68\x22\xac\x3a\x75\xe6\x34\xed\xf4\xa4\x80\x70\xff\x7b\x91\xd3\x6f\xfe\x0e\xe4\x74\x3d\x2f\x88\xe3\xad\x5b\xf9\x9c\x8d\x14\x34\x78\x5c\x1e\x1a\x69\xab\x2d\x15\x37\x76\x24\x45\x19\xad\x2a\x0d\x2b\x41\x31\xca\xfb\x75\xbe\x81\x37\x81\x8b\xb8\xab\xb1\xae\xae\xe5\x45\x87\x0f\x37\x6c\xf6\xf1\x33\xfb\xc7\x89\x6e\xc6\x28\x6d\xa6\x97\x97\x0a\xa2\x95\xd5\xba\xe9\x54\x6d\x5a\x50\x1c\xee\x23\x55\xc4\x7b\x8e\x37\xf8\x19\xf3\x60\xac\xd0\xab\xc2\x90\x96\xbb\xce\x75\x69\xee\x73\x10\x6e\xf7\x2a\xbd\x53\xe2\xe0\xe4\xf4\x50\x6c\xf2\xac\x5a\x3b\xb9\x4c\xbc\x0b\x40\x97\x97\xa9\x69\x91\xda\x43\x8a\x32\x50\x73\x21\x8e\x9d\xe0\xfb\x55\x81\x22\x8d\x4a\xf7\x11\xe5\x56\x2e\x7c\xd9\xd4\xb1\xdd\x3f\x77\x03\x18\x37\x0e\x7c\xeb\x40\x85\xb7\xa1\x55\xb8\x90\x07\x52\xdc\xab\x05\x90\x97\x1f\x5a\xb1\x7b\x26\x86\x0d\x2e\xef\xc8\x1a\x16\x3f\x19\x6a\xfe\x51\x66\xbc\x02\x10\x04\xef\xde\xe1\xde\x2c\x1e\xb4\x7c\x1c\xcf\xf3\xc6\x26\x6b\x42\x6b\x07\x2d\xe0\xe0\x3c\x4b\x77\x41\xd7\xed\xda\x3c\xc7\x81\x71\x05\x83\xfb\xa3\x2a\x55\xba\x72\x69\x19\x81\x1e\x2a\x05\x83\xcc\xbb\x50\x03\xff\xfc\x3f\x21\x02\x01\x3e\xd9\x9c\xb1\x87\x18\x05\xbc\xcb\xbe\x03\x6a\x04\xe3\x20\x8a\x28\xe5\x91\x2f\xbb\x79\x0b\xdb\x15\x7a\x21\xe6\x00\x85\x7d\x05\x50\xd8\x53\xe2\xc4\xd2\x53\x62\xad\x79\xb7\x02\x10\x9c\x49\x18\x1c\xa3\x8b\x7c\x0d\x8e\x3e\xeb\xe8\x07\x09\xeb\xf8\x8e\xf9\x2c\x39\xc7\x8b\xfd\xc2\x49\xd1\xe9\x71\xea\x9a\x1a\x7b\x12\x11\x13\x54\xeb\xed\xda\x0e\xae\x0b\x7d\xaf\x61\x42\x9d\xb9\xfb\x8c\xa5\x4f\x6e\x2d\xb7\x37\x26\x2f\xcf\x6b\xde\xdc\x24\x1c\x08\x40\x3b\x0f\xf5\x7b\x63\xd9\xeb\x2b\x3f\xd5\x47\x41\x9b\xb6\x5a\x89\x54\x7a\xd2\x98\x6e\x6c\xe5\xf0\x99\x90\x15\xf5\xd8\xb4\xb0\xb2\x89\x45\x44\x89\x04\x5e\xb1\x1d\xfb\xfc\xe1\xca\xc7\x48\xc2\x02\x5c\xa9\x15\xb3\x78\xbb\x2f\xb0\xb5\x38\x6e\x00\x03\xc5\xc7\x63\x5d\x75\x6c\x4b\x2a\xe6\x32\x77\x39\x24\xa6\x59\x1b\xbd\xb2\xa0\xac\x7a\x14\x66\x01\x5d\x84\x56\x52\xc8\x6e\x6c\xca\x87\x5e\x98\x8d\x12\x65\x9e\x2a\x9f\x37\x0d\xc6\x57\xaa\x65\x5d\xb8\xec\x2f\x8f\x76\x36\x53\x2a\x56\x31\x23\x89\xa0\x6b\xc0\xe5\x4b\x93\x1e\x98\x3b\x2d\x59\x6a\x69\xf7\x4c\xe2\x28\xf2\x76\xe4\xf7\xd0\x51\xc0\xf3\xf0\x24\xa3\xaf\x72\x61\x70\x0f\xc4\x63\x7b\x00\x14\xb6\xc1\xbd\xc4\xaf\xe2\x70\xb6\x0b\x4f\xdc\x6c\xd7\x61\x14\x28\x30\x47\x1e\xa5\xdf\x52\xb7\x1f\x9b\xea\xd7\x15\xa1\x0c\x37\x17\x26\xf0\x0f\x11\xaf\x01\x6d\x99\x2e\x27\xdd\x4d\x2b\x0d\x27\xef\x0e\xe2\x20\xc8\x12\x45\xd9\xbd\x31\x78\xe7\xa4\xfd\x8e\xc7\x33\x78\x02\x9b\xc2\x13\x88\xa4\x28\xd4\x5d\x8e\xa6\xb3\xb1\xb3\xb1\x45\x98\x90\x47\x2d\xeb\xcf\xd8\x29\x07\x4e\x18\x01\xf7\xc1\x21\xc5\xd5\x38\x2a\xc5\x6e\x20\xf4\x31\xb4\x42\x86\x5d\x6a\xfe\x13\xf0\xde\x9f\xad\xd5\x73\x4e\x98\xdc\x30\xd9\x04\x48\x05\xd4\x65\x65\x69\xdc\x0b\x66\x75\x3d\x5b\xa6\x04\xb5\x1a\x40\xff\x43\x82\xfd\xe7\xda\x2d\x27\x40\xe2\xe0\x31\x63\x3c\xce\x8f\xf4\xa0\x7f\x69\xb3\x68\x3b\xd2\x29\xc5\x99\xf2\xa2\xbe\x24\x42\xd2\xc5\x87\xe1\xbe\x12\xc3\x03\x49\x76\x9b\x9a\xe4\x56\xd8\xf1\x08\x65\x57\x3b\xb6\x49\x53\x5d\x35\xfc\xa3\x74\x80\x37\x36\xe1\xdc\x7d\x7d\x01\xe0\x73\xab\x04\x56\x96\x41\x84\x9a\x0a\x97\xcb\xc4\xe4\x06\xf6\x5e\x86\xe2\x22\xd9\x24\x95\x34\x00\xd5\xb4\xf1\x8c\x23\x32\xea\x00\x8f\xa7\x22\x0a\x47\x25\x3c\x0d\x6c\xc6\x04\x49\x20\x0e\x09\xd3\x63\x64\x1f\xa7\x89\x16\x65\x00\x1b\x4b\x87\xd7\xdc\x55\x84\x75\xdd\x36\x06\xb5\x62\xe3\x2e\x32\x91\xcd\xa0\x08\x72\xea\x66\x7d\xd1\x47\x2a\x25\xb6\xed\xe6\x53\xe8\xa7\x51\x16\x24\x19\x24\x9b\x80\x94\xd6\xb7\x51\xa1\x4c\xf6\xf4\xab\x50\xf4\x6d\xcb\x00\xe5\xe8\x92\x69\x71\x7e\x22\x31\x6f\x10\xe9\x57\x93\x76\x26\x30\x05\x36\xfa\xf8\x6c\xf5\x02\x04\x40\xfb\xb2\xc9\x28\x69\xd2\x5e\x7b\x36\x4b\xb3\xf4\x93\xbe\x8d\x37\x2d\x2b\x93\x12\x06\x68\x72\xbe\x5d\xce\x16\x5f\x73\x37\xd0\xe1\xe2\xa0\xd7\x1c\x07\xe6\x5e\x52\x50\x14\x9c\xa5\x3e\xf9\x98\x27\xaf\x2d\x92\x3e\x0f\x1e\x30\x1e\x31\x15\x21\x67\x3b\xff\x3e\x13\x0b\xb5\x96\x5a\x27\x44\xb1\x0d\x1f\x77\xdc\x7e\x38\x55\xe0\x34\x31\x8f\x18\x47\x53\x5b\x59\x71\x98\x38\x49\x91\xf3\xdc\x22\xdf\x94\x4e\x32\xa6\x61\x5f\x84\x43\xd5\x1c\x34\x6c\x39\x58\x2d\x23\xff\x30\x32\x6c\xdd\x39\x7c\x75\x73\xe6\x13\x2d\x94\x96\x7d\xb1\x5a\x29\x08\x22\xc6\x50\xb2\xec\x6a\x35\xe0\x6c\x72\xd5\x9a\xb5\x2c\x36\xa9\xde\xf0\x2b\x1a\x8f\x5d\xe3\x24\x5b\xd6\x45\x61\xd2\x1c\x18\x98\xab\x2c\x15\x50\x47\xc9\x5b\xa9\x65\x81\x9d\x0d\x18\x89\xdb\xf6\x02\x68\xaa\x4a\x8e\x52\x3c\x30\x56\x86\x8b\xff\xa9\x01\xf9\x6e\x09\x1d\xcc\x39\xf8\x6c\xc0\x78\x47\xe2\x74\x40\xc4\x7b\xe8\xec\x06\xa8\xfa\xf3\x20\xda\x27\xd9\xb2\xe9\x1b\x34\x01\x35\x5b\x3a\x8e\x97\x81\x44\xc6\x84\x65\x9d\xca\x46\xc5\x79\xf3\xce\x47\xba\xa2\xac\x4a\xb2\x5a\x71\x5e\xc0\x43\xe0\x96\x16\x78\xdd\x1e\x71\xf0\x11\xd9\x73\x5e\x73\x06\xac\xdf\xd1\x8e\xe6\x70\x55\x16\xa5\xfa\x6b\xed\x20\xe0\xb7\x26\xd1\x2b\x8a\x87\xf5\x08\xc5\x98\x4e\xa5\xbd\xc4\x49\x30\x12\xef\x3d\x51\xbf\xe6\x2e\x5b\x01\x45\x19\xac\xe2\x50\xe5\xbe\xf0\xc7\x7b\x30\xee\x0a\x32\x11\x2e\xbb\x0b\xb1\x3d\x99\x8a\xd9\xf5\xd5\xd5\x64\x3a\xc7\x32\x7b\xaf\x29\x9e\x53\xa2\xaa\x68\x71\xd0\x6d\x0b\x75\x44\x1e\x08\xad\xd6\x54\xaa\x84\x74\x3a\xf0\xd6\x55\x02\x73\x1e\xf1\x43\x8c\xb6\x3e\xf1\x0a\x55\x14\x79\x61\x42\xd2\xda\xaa\x47\xff\xd3\x4a\x26\x69\x4d\x91\x9c\x34\x2f\x61\xd6\x63\x59\x49\x3c\xc9\x54\x62\x92\x64\x86\x95\x26\x2f\x9c\x5e\xcb\xe5\xb2\x2e\xe4\x12\x98\xc5\x3f\xdb\xc8\xab\xcb\x4e\x73\x35\x78\xe0\x66\x85\xa8\x1b\x7a\xbb\x48\x08\x82\xa4\xc8\x2a\x7d\x5f\x15\x49\xf9\x29\xa4\xa2\x8c\x9f\x00\x30\x79\x30\x19\xfa\xa5\x29\x6e\xc1\x49\x13\x48\x3c\x10\xd7\x57\xef\xa6\xfd\x21\x22\x26\xd3\x5a\xb9\xe8\xe2\x58\xa6\x02\x59\xab\xe6\x5f\xdf\x30\xd2\xfa\x64\x7a\x30\x3b\x14\x07\x83\xc9\xc5\x05\xa2\x71\x5f\xdc\x88\x69\x74\x1e\x4d\xa7\x88\xef\xdc\x9f\x89\x1e\x3c\xd1\xb3\x60\xeb\x58\x68\x02\x45\x17\x33\x04\xdf\x9e\x89\x6f\xa1\xed\x37\x87\xf8\x8a\x8b\x0b\xbf\x9a\x84\x0a\x64\x2e\x6e\x4c\x65\x0a\x7c\xc7\xa9\x76\x21\xc8\x6c\x8b\xa4\x1c\x74\x54\xd5\xfc\xd2\x52\x9a\x56\xe3\x1d\xc5\x35\x01\x0c\xa7\x3f\x1f\xcd\xce\xfb\x83\xf9\x64\x7a\xc3\x68\xe7\xf0\x87\xa7\xaa\x6e\xe0\x4b\x88\x72\x3d\xc0\x27\xfe\xf5\x7a\x14\xcd\x45\x34\xfe\x61\x72\x73\x19\x8d\xe7\x01\x4c\xcc\x78\x32\x1e\x8d\xcf\xa7\xa3\xf1\x3b\x53\xdc\x62\x31\xaf\x6f\x04\x14\xe4\xcc\x42\x67\xb1\xa2\xfe\xe0\xbd\x3b\x95\x62\x38\x89\x66\x30\x6c\x1a\x9e\xe8\xbf\xeb\x8f\xc6\xb3\x39\xd6\xb6\x9c\x47\x53\x28\x33\x61\xf8\xf5\xa9\xed\x00\x17\x8a\xb8\x7b\x4c\x4f\x58\x7f\x0e\x1f\x9f\x5f\x8f\x69\x25\xf5\xdb\x10\x98\x7b\x34\x6e\xef\x4a\xc0\x45\xbf\x8c\xa2\x39\x36\x4f\xc8\xea\xfa\x05\x33\xa7\x35\xc4\xe6\x1e\x4d\xc6\x5d\x6f\xc5\x36\xde\x46\xe2\x7a\x6c\x0a\x72\x10\xf1\x3e\x9a\x4e\x27\xd3\xa3\xf3\x69\x14\x61\x1d\x8d\x6e\x0e\x61\xe2\x67\x0f\x77\xe6\x6d\xc4\x28\xf0\xd1\x10\x44\xd7\x64\x8a\x28\xe8\x1f\xa6\xa3\xf9\x3c\x1a\x8b\xd1\x18\x80\xea\xb1\x3b\x53\x28\x9c\x19\x44\xe2\xdd\xe8\xa7\x68\xcc\x80\xf0\x91\x5e\x1e\x9e\xf6\xeb\xf9\xfb\xc9\x74\xf4\xe7\x68\x28\xa6\x91\xde\x81\xd1\x78\xde\xd7\x27\x83\x81\xdf\xdd\xe5\xc0\x82\xaa\xc1\x34\xea\xcf\x23\xd1\x37\x67\x32\x14\x0f\xc0\x44\xb5\xbd\x5b\xe8\x61\xe9\xc6\x84\x72\xd0\x9f\x56\x4d\xa8\x27\x24\xb7\x4c\x8a\x65\x21\x57\x95\xc8\xe4\x1d\xe9\x8a\x41\x23\xab\x0c\xab\xc7\xd1\xbd\x2c\x13\x60\x5e\x5a\xad\x20\xf7\x0c\x23\xfc\xc4\xcf\x56\xa2\xfc\x86\x54\x01\x49\x2e\x7d\x12\xab\x9d\xce\x27\x14\xbf\x29\xe4\xb2\xe7\x22\x56\xb2\x5a\x07\x64\x42\xcb\x54\x24\xd9\x5f\xea\x02\x33\x0b\x4a\xad\x0f\x39\x54\x8b\x60\x5f\xdf\x25\x45\x9e\x81\x4b\x30\x15\xb1\xdc\xc8\x5b\xbc\x7a\xde\x84\x78\x9a\xcd\xd6\x31\x75\x55\x61\x83\xd9\x41\x9f\x80\xab\xe9\xe4\xfd\xe8\xed\x88\xe8\x1d\x2e\xfa\x1f\x82\x8e\x5a\x37\x5c\xd3\x8e\x95\x6b\x17\xb8\x75\x96\xb3\x71\xb5\xdb\x67\xc3\xea\x03\xee\xff\x45\x1f\xa9\x23\x26\x58\xbd\xc5\x0c\xda\x93\x29\x9e\x9a\xc7\x60\xf7\xfd\xf3\x49\x5d\xd3\x22\x5d\x4f\x09\x90\x60\x4c\xce\x6d\x31\xda\xf5\x78\x18\x69\x89\x64\x2b\xd6\x6c\x6d\x9a\xbd\x20\x1e\x2e\x48\x3b\x84\x62\xbb\xe1\xb5\x3e\x61\x66\xb2\xbd\x2a\x35\xa7\xe2\x8c\xa7\x12\x8a\xcb\xdc\xb9\xfc\x05\x28\xfa\x24\x0e\xe7\x5a\x52\xcd\xe6\xfd\xf1\x90\xa9\x36\x1c\xc0\xff\x68\x36\xa3\xb9\xe6\xda\x46\xba\xd5\xb4\xc0\x19\xde\x84\x62\x36\xb9\x8c\xc4\x0f\xd7\xd3\xd1\x6c\x38\x22\xe9\x35\x9c\xc0\xde\xe8\x5f\x5c\x4c\x3e\x40\x7b\x0f\x6c\x28\xfd\xcb\x67\x90\x26\x04\x62\x66\xd6\xd0\xb4\x73\xd9\xbf\xc1\x97\x5c\x5d\x5d\xdc\x10\x5d\x03\x58\xf0\x59\x0e\x80\x0a\x95\x28\xd7\x32\x4d\x8d\xff\xa2\xca\x2b\x28\xd7\xea\xf0\x67\x02\x03\x0b\x1c\x00\xdf\x57\x23\x4d\x65\xac\xf1\xd5\x2d\x76\xae\x52\x97\xca\xfb\xc3\x2e\xd7\x93\xfa\x79\xa9\x28\x94\x26\x37\x79\x8d\x9e\x4f\x4c\x8b\x89\xf3\x34\x95\x45\x29\x0e\xfe\xcf\x97\xc7\xe1\xf1\xf1\xa1\x61\xcc\x98\x17\x32\x56\x1b\x49\xfa\x97\xd3\x98\x71\x01\xa3\x71\x0c\xe9\x90\x2d\xd2\xb5\xca\x3c\x4d\xc4\x6e\x31\xd7\xfb\x52\x81\x42\x20\x7a\x97\x72\x49\xff\x13\x93\x99\xfe\xd7\xbf\xd6\xc9\xf2\xd3\x3c\xd9\x28\xef\x17\x31\xab\x0a\x25\x37\xda\x26\x98\xa9\xe2\x4e\x15\x3d\xd6\xa7\x68\x6a\xcc\xab\x02\xce\xc4\x15\xf4\x6b\x9a\xdf\xe6\xad\x0e\x2c\x54\x9a\x67\xb7\x54\xfe\x82\x9a\xf3\xc1\x32\x07\x67\x19\x12\x03\x50\x99\xc8\xa5\x6e\xa3\x07\xa9\x42\xe4\x0c\x34\x6f\xf2\x5f\x84\xef\xf1\x5f\xe3\xbf\xa5\xd3\x5c\x45\xc5\x51\x4f\x24\xcd\x9b\xfe\x96\xf3\x6a\x88\xca\x78\xe9\xc8\x6e\x79\xf6\x43\x05\xd0\x4d\x1b\x09\x7b\xff\x05\x15\xd4\xad\x06\xbc\xfd\xe7\x30\x03\x9a\x64\x82\xc5\x8e\xb2\xe3\x04\xe5\x28\x58\x5e\x3a\xc0\x7a\x4e\x53\x81\x0c\x46\x88\x7a\xce\xfb\xdf\x71\x46\x9b\x89\x15\x75\x29\x6f\x89\xbb\x28\x85\x0b\xc8\xf2\x33\x6e\x73\x30\x09\x64\x25\xd6\x55\xb5\xfd\xee\xf9\xf3\xfb\xfb\xfb\x50\x82\x49\xb4\xcc\x37\xcf\x21\x0b\xee\xb9\x7d\x72\x95\x17\x67\x45\x4c\xcc\x79\xe1\xba\xda\xa4\xb8\xb5\x4f\x42\x31\xe1\x64\xae\x56\x32\x56\xcb\x65\xdc\xe5\x2b\x6e\x45\x28\x30\xe5\x06\x91\xa6\xd9\x9d\x55\x25\x15\x43\x98\x38\x10\xda\xe4\x00\x6a\x65\xd9\x63\x0a\xe6\x62\xd7\x32\xe5\xd9\x08\xff\xe2\x57\xb4\x17\xb2\x33\xbd\xdf\xbc\x38\x2f\xba\x5c\x2d\x07\x7c\x16\xbc\x94\xee\x43\xae\xfa\x34\xbe\x32\xbf\x4d\x43\x73\xb8\x50\x0d\x12\x3e\xaf\x08\xc8\xcd\x63\x34\xae\x06\xe0\xe6\xee\xf0\xb6\x05\x8e\x95\xed\xd5\x9a\x76\x75\xa0\x6b\xd5\x70\x80\x86\xf1\x8b\x2c\x62\xda\xf4\x79\xa9\x3a\xd0\xf3\x9c\x34\x1b\xc7\x9d\x47\x27\xd6\x14\xda\xae\xd5\x86\xb6\x39\x6e\xb0\xd3\x10\xdc\x2b\x94\x66\x6e\x12\x41\x4f\xc3\x13\xef\xf3\x46\xb5\x17\xe5\x36\x74\xf0\xfa\xe1\x60\x60\x4e\x0d\x45\x64\x23\xf3\xc4\x9f\x64\xae\xd5\x71\x91\xbe\xa8\xa2\x09\x43\xc6\x2b\x62\xd4\x83\x73\xba\xa3\x12\x03\x4a\x46\xa2\x1c\xe3\x96\xeb\xda\x3c\xa3\x75\x3f\x98\xf8\x45\x01\x07\x81\x12\x79\xce\x8e\x45\x2c\x77\x60\x64\x2f\xd4\x32\x07\x71\x2d\xef\xd1\x9b\xe6\x7e\xbf\x91\xbe\x92\x6c\x36\x2a\x4e\x64\xa5\xe5\x2e\xe9\xb7\x78\x59\x32\x17\x70\x52\x2c\xeb\x0d\x3a\xbe\xb5\xa8\x2a\x97\x45\xb2\xf0\x7d\xca\x27\x67\xe1\xcb\x83\xc5\xe1\xf7\x22\x2f\xfc\x14\x90\x2f\x9b\x15\xd8\x78\x30\x0b\xfa\xce\x89\xeb\xc2\x25\xe4\x6b\x3b\x8f\x20\xa9\x08\x2b\x13\x84\xc4\x8e\x00\x4f\x1c\xfa\x96\xbd\x28\xa3\xe7\xaf\xfb\xbe\x91\x79\x84\x5d\x88\x13\xf4\x76\xae\x92\xa2\xac\x7e\x49\xdb\x37\xc0\xd1\xc9\xc9\x4c\x38\x5f\xce\xd6\x3b\x15\x11\xe4\x89\x02\x90\xbe\xbb\x09\xaf\xb7\x79\x66\xb6\x15\x1c\x33\x7b\x35\x55\xb9\xb7\x3c\x65\x95\x6f\x3d\xce\x4a\x2f\x26\x84\x0f\xfb\x88\x2f\x26\x14\xc4\xa4\x70\x71\x23\xc9\xa1\x15\xf6\x03\x28\x1a\x1b\x41\x32\x75\x51\x7e\x0c\x06\xae\x04\x5b\x68\x89\xe1\xad\x74\x67\x4e\x0d\xe2\x7c\xe8\x47\xed\xc0\x48\xfb\x2a\xeb\xe2\xce\x70\x5b\x3b\x7f\x6d\x15\xbc\x5e\x15\xc4\x6e\x40\x57\x50\x40\xd1\x9d\xa4\x10\xc8\x49\x10\x70\x0e\x89\x25\x65\xc5\x5c\x5c\xb1\x50\xbb\x9c\x8e\xf3\x23\xaf\xf0\x3b\xf4\x44\xed\x90\x89\x6e\x9d\x05\xe2\x65\x20\xbe\x0d\xc4\x9b\x40\x9c\x1c\x07\xe2\xe4\x24\xc0\xf5\xd5\xd3\x7b\x72\x06\xce\x41\xbc\x53\xd9\xbd\xaa\x35\x4c\xf4\xf7\x59\x95\x89\xf2\xe4\xb6\x2a\x2b\x69\xa9\xbc\x68\x03\xeb\x9e\xec\xa6\xcc\x8b\x0a\xc4\x71\xba\xc3\x30\x55\xa1\xca\x3a\xc5\x23\xca\xe3\xe3\x62\x63\x1e\x9c\xbe\x88\x00\x24\x10\xb4\x00\x4c\xc1\x60\x1e\x58\x26\xf4\x7f\x78\x6a\xb8\xef\x7c\x66\xb7\x85\xfa\x4b\x1d\xeb\x63\xeb\x0d\x03\x1d\x9d\x70\x01\x6f\x54\xbc\xe3\xfe\xc2\xf8\x51\x16\x9f\x85\xe2\x32\x29\x97\x2a\x4d\x65\xa6\xf2\xda\x96\xd1\x9d\x85\x27\xe2\x1d\xc4\xed\xe0\x18\x45\x19\x24\x6e\x17\x5d\xbe\xc6\xa4\x44\x32\x0e\x93\x44\x98\x54\x6a\xd3\xd3\x33\x01\x95\x04\x28\x8c\xce\xfb\x53\x71\x1a\x9e\x1c\x9f\x84\x6e\xb3\x1e\x5d\x62\xa5\x96\x6b\x48\x0c\x02\x2f\x24\x4b\x7a\x12\x7a\xfe\x1b\x29\xbf\x06\xeb\x38\xe1\x72\xe2\xe8\x4e\x5d\x6a\x99\x56\x24\x2e\x35\x33\x33\x65\x61\xf5\xac\xdf\x2f\x7f\x53\x63\xcd\x33\xb5\xb1\x73\x53\x25\x53\xbb\x6e\x8d\x7e\x22\x2e\x83\x05\xb1\x36\xaf\xed\x58\x62\x3d\x0b\x7a\x37\x9e\x9c\x88\x83\xb9\x69\x66\x28\x2b\x28\x69\x8a\xf1\x6f\xa7\xe2\x80\x6b\xb3\x0d\x9b\x10\xfc\x19\x13\xc5\x86\x4a\xaf\x1f\xa7\x67\x0c\xd5\x8a\xfc\xe0\xc5\x72\x2d\x21\x73\x73\x08\x73\xfd\xf2\x34\x3c\x3d\x7d\x7d\xf4\xfa\xf8\xe4\x65\xf3\x5d\xe2\xe8\x48\x0c\xec\xd0\x46\x95\xda\x94\xf8\xfe\xd3\xd3\xd7\xe1\xeb\xd3\xe3\xd3\xa3\x33\x71\x30\x35\xf3\xef\x7c\xb7\xd5\x31\xbd\xbb\xda\x1f\x0e\xdd\xdc\xa5\xc3\x50\xf4\x2d\x1e\x66\x00\x2a\x1a\xe0\x1e\x75\xed\x2f\x93\x12\xd1\x11\x55\x6e\xad\x76\x33\x97\xc7\xd9\xbd\xa7\x62\xaa\xb0\x10\x85\x8b\x12\xae\x48\xd3\xf5\xf5\x0a\x57\x15\x23\x10\x71\xac\x45\xc3\x4a\x53\x90\xcb\x42\xde\xaa\x6c\xb9\x43\x12\x6c\xd2\x8c\x03\xf1\x97\x3c\x81\xb8\x44\x86\xe5\x76\x85\x2f\x3e\xe0\x46\xc4\xc2\x13\x2e\xb2\x49\x40\x7f\xac\xee\xb5\x48\xd6\x5f\xdf\xe4\xd9\x2d\x5e\xac\x0f\x85\xed\x6c\x4c\xcd\x74\xd3\x94\xa1\x59\x28\xd9\xac\x42\x08\x55\x2e\xfe\x30\x26\x08\x88\x64\x88\x15\x1b\x88\x31\x48\x3d\x97\x04\x83\x6b\x53\x77\xec\xbc\x9d\x89\x51\x16\xab\xad\xca\x80\x29\x66\x88\xc4\x7a\x00\x1a\x2c\xc6\x39\xf2\x08\x35\xb5\x3f\xe8\x5b\xb2\xd9\xca\xa4\x30\xc6\x8b\x09\xb1\xd0\x72\x06\x36\x4f\x83\xc8\xfa\x02\xbc\xa0\xa0\x0f\xa5\x61\xf0\x5b\x01\x09\x48\x00\x66\xa3\xaa\xba\x2a\xaf\xf5\x4e\xce\xd3\xfc\x76\x47\xb6\x1a\xda\x68\x70\xaf\x53\xaa\x85\x4d\x8f\xc8\x0b\x43\xad\xcc\x30\x3b\xa5\x90\xe8\xd5\xb3\x75\xb4\x20\xe8\x29\xe3\xba\x55\x14\xec\xc6\xcb\x83\x47\xdf\x6e\xe2\xba\x3c\x3e\x93\x0b\x42\x83\xf1\x06\xe2\x4c\xf9\x0b\xf1\x41\x26\x77\xaa\x80\xa2\x18\x83\x62\x1f\x8a\x73\x72\x24\x3e\x9a\x84\xa6\x4d\xd7\x55\x8e\x70\x73\x24\xf2\x3a\xe3\x64\xee\x3e\x8f\x95\xbe\x0e\x84\x14\xf7\xf0\x5e\xf0\x75\xd4\xb0\x8b\xa9\xad\x8d\x51\x30\x65\xe5\xef\x6c\xf3\x02\x64\xb3\x4f\xe5\x3d\x5e\x2f\xb7\x75\xca\xc8\x48\x09\x16\x04\x6a\x19\x58\x5a\x07\x6e\x2a\xb3\xdb\x5a\x9b\xae\x50\xea\x66\x8a\x93\xf0\x8e\xf7\xcf\x1e\x69\x6c\x90\xc3\x5a\x60\x79\xbb\xe9\xbd\x83\xa2\xdc\x51\x5c\x7b\x16\xbe\x14\x33\x75\xa7\x0a\xf2\x19\x85\xa0\xfc\x8f\x56\x26\x84\x4c\x41\x5f\x09\x04\x5a\x15\x17\x71\x2a\x50\x1b\xff\x52\x17\x49\x19\x27\xa4\x4e\x26\x59\x5c\x3e\x3e\xa5\x81\x53\x1b\x6c\x23\x56\x88\x18\x52\x67\x34\x93\x58\x8c\x8d\xbb\xd3\x6f\x48\xb5\x2e\x73\x7a\xc4\xdc\x57\x1b\xf9\x73\xb2\xa9\x37\x9c\xda\xc3\x70\x6c\x5a\x59\x29\x73\x02\x82\x26\x8d\x0a\xcc\x82\x65\x9e\xe5\x9b\x64\x49\x55\x59\x94\xed\x04\x4e\x72\x63\x2d\x90\xb5\x1f\x58\x73\x0a\x74\xb3\x98\x69\xab\x9b\x1b\xc6\x44\x7e\x99\x51\x9f\xb7\x5a\x4c\x6f\x0e\xc1\x48\x19\xe7\x95\x3e\x3c\xa6\x42\x0c\xeb\x91\x0a\x75\x9b\x03\xd1\x7e\xb2\x6a\xf8\xe0\xf4\x5c\x40\x2a\x7d\xe9\x96\x6e\x94\x68\x7b\x01\xce\x37\xc4\x38\xb9\xa6\x99\xe0\xe9\xc0\x4a\x41\x93\x2c\x61\x56\x3e\x9b\xd5\xc4\xdf\x3e\xc3\x93\x09\x46\x12\x86\x7b\xcd\x52\x50\x82\xc8\xca\x63\x0b\xd7\xd7\x09\xb7\x12\x74\x0a\x36\xab\xe1\x1b\xf3\xd2\x96\xae\x40\xba\xaf\xf3\x15\x6d\x90\xf3\xa4\x41\xd9\x6c\x77\xc8\x13\xb5\x7d\x3d\xf0\x7c\xd7\xa8\x3c\x4a\x2a\x8b\xf3\x90\x64\xc4\xaa\x96\x97\xa5\x2a\x99\xd2\x9c\x82\x10\xce\xb6\x7f\x25\x86\x49\xa9\xef\x60\x31\x55\x65\x9e\x22\x78\x21\x9e\xd0\xa4\x62\xd0\x32\x93\x09\x13\xd3\x77\x0b\xf3\x5d\x73\x2f\x31\x4a\x04\x3b\x55\x52\x52\x5d\xf3\x2e\xd5\xbc\x02\xce\xb2\x54\x2e\x4d\xe8\x65\x9c\x83\xe5\x93\x51\xb6\x36\xda\x53\x2e\x2c\x22\xcf\x9b\x7d\x07\x65\x8b\xe8\xf3\xef\xdc\x6a\x26\x26\xe2\x9d\x4a\xce\x67\xbc\x53\xb8\x27\xa9\x08\xbe\xe2\x15\x59\xa9\x18\x70\xdc\xe1\x74\x97\x6c\x79\xc3\x6c\x9a\x0e\xb5\x2b\x4a\x7c\x05\x50\xf1\x5e\x75\x6d\xb0\xeb\x0c\x0c\x8d\x31\xb9\x4f\x06\x79\xa6\xb7\x17\xe5\x4a\x0f\x48\x98\x95\x26\x6b\x6c\x84\x15\x3d\x94\x4b\x32\x93\x58\x24\xf2\x2e\xcf\x63\x20\x27\xb4\x3e\x42\x48\x76\x8c\x55\xec\x2c\xe5\x6b\x11\x61\x80\xbb\xcf\x19\x39\xdf\x93\xa2\xa4\x17\xe2\x42\xde\x37\x14\x18\x10\x9c\x49\x85\x20\x19\xb0\xdb\xe1\x69\x9b\xcf\xc3\x4b\xeb\x9c\xff\xce\xb2\x9a\x06\x10\x08\x17\xeb\xcf\xdb\xeb\xbe\x50\xad\x94\xbe\x54\xde\x97\x8d\xc9\x9a\x55\x50\x2f\xce\x92\x06\x7e\x6d\x6e\x07\x2a\xbd\x82\x15\x5a\xe4\x71\x03\x45\x13\x44\xc5\x32\xcf\x96\x34\xf8\x65\x9e\xad\x52\x10\x14\x5a\xb7\x92\xf7\x3c\x6b\x1f\x3c\x44\x95\x34\x5f\x4a\x07\xea\x19\xc4\x2e\x61\xe9\xfd\x6b\xad\x16\x6a\x19\x88\x81\xcc\x64\x2c\x03\xbf\x6e\x52\x2c\x01\x9a\x98\x71\x85\xbe\x83\xbd\xc0\x13\x66\x77\xe9\x2a\x01\x0d\x03\xaf\xb5\x1d\x13\x8b\xfe\xb5\xc6\x7c\x0c\xcb\x6b\xe3\xfa\x86\xc0\x29\xd9\x48\xeb\x2f\xe1\x26\x86\xfb\x0d\xfa\x1a\x65\xb7\x69\x52\xae\x43\x71\xa1\x4a\xf3\xda\x3c\xab\x84\xfa\x39\xb9\xfd\xf7\x7f\x13\x7f\xad\x95\x80\xd4\xc7\x7f\xff\x37\x38\x28\x78\x85\x56\x42\xe9\x05\xac\x4b\x01\xc4\x08\xa6\xed\x65\x9e\x65\xea\x67\x55\x8a\x32\x07\x5c\x8c\xe2\xdf\xff\x2d\xd6\xcd\x94\x42\x65\x42\x66\xb7\xa9\x4c\xca\x50\x44\x7f\x82\x50\xa0\xe8\x87\xcf\x7a\x57\x9c\x34\xef\x23\xf5\x9e\xbc\x79\xf3\xe6\xe8\xf4\xf8\xf8\xb5\x0b\xa2\xd4\x4f\x53\xce\xa8\x9d\xfa\xa8\xdb\x2e\xc8\x42\xd9\xf6\xaf\xb6\x4a\x2b\x3a\x40\x26\x3c\xf3\xcc\x60\x03\xc8\x42\x35\x11\x92\x1e\xc3\x44\x72\x21\xc5\x0e\xf4\x97\xbf\xa1\xbf\x7c\x73\x18\x7a\x35\x87\x18\x8f\xe1\x9e\xd3\x7e\x44\x78\x1b\x76\xd1\x9b\x34\x41\xeb\xfb\x20\xd2\x10\x4c\xa5\xf3\xd9\x64\xcd\xba\x7b\x6e\xf8\x7c\xab\x32\x04\xef\x73\x3c\xf2\x72\x5b\xa6\xcf\xa9\x10\x55\x02\x94\x37\xa5\x7e\x3b\xe0\x64\xba\x5b\xc8\x31\xda\xe1\xac\x4e\x53\x6b\x79\x76\x93\x62\xb8\xd9\xad\xee\x37\xa0\x60\x5f\x7c\x03\x09\x32\xdf\x88\x85\x2c\x93\x32\xf8\x22\xb2\x7d\x2f\xbf\xc4\xa6\xca\xbc\x8f\xa6\xd1\x5b\x9b\xaf\x32\x83\x84\x15\x88\x60\x76\x42\xbb\x9a\x57\xda\x38\x61\xe0\x62\xae\x77\x23\xba\x06\x9f\x91\x58\xd2\x48\x24\xd1\xdd\x1d\x4f\xc6\x47\x6e\x1e\x89\x59\xc7\x92\xc8\x85\x5d\x26\x61\x90\x88\x8c\x8b\x6b\x94\xd7\x5b\x23\x88\xbd\x52\x06\x9b\xf8\xdb\x9a\xf9\xb0\xf7\x87\x81\x68\xfc\x4d\x7f\xc2\xe7\x93\x8b\x61\xff\xea\xe8\x24\xfc\x3b\x49\x3e\x1f\xf9\x79\x1c\xff\xf1\xe4\xec\xec\xac\x8d\xff\xf8\x7a\x8f\xff\xf8\x55\x7e\x40\x82\x6d\x55\xa6\x37\x41\x83\xd1\xd8\xe0\x3f\x9e\x84\x2f\x02\x71\xf2\xad\x01\x35\xd4\x77\x8f\xc3\x16\x71\xf2\xe6\xcd\xb7\x47\xfa\x33\x44\x8e\x37\xad\x59\xa2\xed\xee\x9b\x89\xd0\x12\xe7\x86\xad\x07\xcb\x79\x5a\x61\xdd\x5e\xbf\xa8\x92\xb2\xb2\x1d\x43\x1f\xa6\x23\x35\xcd\x4d\x70\xa5\x8a\x54\x5c\x11\x5b\x31\xea\x65\x28\x21\xa0\x08\xaa\x4c\x6e\x33\xb8\xe2\xb2\xca\xc4\xd3\x96\xaa\x74\x8b\x8a\x4d\x52\xa5\x09\xd5\xa1\xaf\x7c\x81\x48\x97\xe1\xb3\xab\x69\xd4\xbf\x7c\x7b\x11\x81\xe8\x77\x8d\xb8\xc4\x5e\xf3\xc4\xd7\x8b\xfa\x6f\xa3\x8e\x9a\x82\x62\x18\x1c\x16\x57\x72\xf9\x49\xcb\x2f\xa6\x86\xd6\xc6\x46\x1c\x60\xd8\xc9\xc9\xb1\xe2\x99\x7e\x0f\x74\x52\xc8\x9c\x07\x17\x79\x99\x6f\xb4\x98\xdc\x2c\x52\x43\xa3\xc7\x73\xc5\x19\x51\x00\x26\x07\x36\xbb\xf5\x19\x59\xb3\x13\x5e\x0f\xe5\xa6\x29\x24\x34\xb3\x95\x58\x97\x86\xd7\xcb\x7c\xcd\xcf\xd1\xad\xbb\x4b\x43\x78\x44\x70\xff\x6e\xf2\x42\x1d\xe5\xc5\x11\xa4\x8b\x5b\xf7\xed\x4a\x96\x6b\x70\x7b\x01\xde\x8d\x9f\xf9\xab\x4d\x17\xf4\x06\x80\x51\xea\x53\x07\x3d\x73\x50\x27\xbf\x7b\xd6\xa3\x77\xf5\x10\x66\xc1\x62\xd1\x51\x4e\x04\x9a\x09\x6d\x6a\xaa\xc5\xae\x73\x5a\x03\xb2\xfd\x18\xf1\xd7\x26\x4f\x77\x35\xc8\x69\xc7\x8c\x83\x56\xa9\x9f\xa1\x64\xc9\xed\x70\xf8\xac\x37\xd3\xa6\xb7\x2c\x62\x56\x7c\xdc\xbe\xc2\x2a\xdb\x3d\x90\x80\x89\xb9\x96\x25\xb9\x83\x54\x66\xaa\xd0\xc1\xa5\x61\x92\xc6\x4d\x6d\x7a\x87\x23\x5b\x0f\xec\x3e\x29\xd7\xca\x29\xb2\xf4\x87\x19\x3e\xeb\x35\x3f\xea\x09\x20\x93\xcf\xb9\xde\x38\x93\x1b\xab\xa7\x5b\x78\x0d\xb0\x70\x0d\xfa\x89\xa1\xf3\xc6\xee\x87\xcf\x10\xbd\x07\xc9\xa2\x18\xe9\xfa\x1b\xa8\xf0\x49\x32\x40\x45\x92\x8b\xbc\xae\xa0\x89\xae\x2a\x34\x38\x41\x57\xa6\xb1\xa9\xdd\x03\xfc\xc4\x4a\x29\xea\x29\xd1\x9b\x03\x94\xb6\xcc\xc4\x5f\xea\xb2\x4a\x56\x3b\x06\x92\x01\xad\x49\x0f\x1f\xac\x7f\xb1\xcc\xf5\xe1\x66\x94\x01\xa0\xb2\x87\x32\x16\x48\x44\xa0\x9c\x14\x95\x43\x3c\x35\xbb\xcb\xd3\x3b\xa8\xdf\x81\xd8\x81\xd0\x92\xeb\xc0\x73\xf3\xba\x29\x4c\x55\x6e\xde\x9c\x54\x36\xe0\xd7\xdc\x55\x4d\x60\x4b\x84\x27\x43\xbb\x09\x52\x1b\xab\x9d\x56\x4a\x53\x2c\xad\x29\xf5\xb1\x41\xbf\x24\xec\x3d\xaa\x7c\x97\x38\xd9\x2b\xa5\xc2\xc3\x67\xbd\xf3\x42\xa9\x74\x27\xfa\x5c\x4a\x6c\x61\xac\x24\x20\xbb\xae\x14\x48\x52\x1c\xa7\x2d\x9a\x4a\x80\x78\x07\x6a\x9b\x81\x5b\x06\xf6\x2d\xd8\x68\x24\x7f\x56\x0a\x32\x27\x71\x16\xf4\x06\x58\xcb\x2c\x4e\x59\x26\xe8\xc7\x43\x31\xaa\x18\x5f\xc2\xbc\xd1\x2f\xaf\x31\x6f\xc2\x2a\xa6\x2e\x26\x7f\xe3\x08\x76\x04\x23\x58\x6d\x58\xa4\x08\x18\xb9\x8c\x38\x6b\x70\x3c\xb4\x64\xd0\xeb\x02\xe4\x82\xf2\x5e\x5a\x10\x9b\x06\x70\x0d\x81\x71\xb3\xb3\x9f\x8c\x5c\xef\x18\x1a\x91\xcd\x87\x8f\x03\x76\x85\x45\x3c\x6a\x42\x6d\x00\x8c\x30\x63\x55\x38\xc8\x1a\x06\x90\xac\xc5\x93\x51\x52\xb5\x90\xc1\xf2\x72\xe0\x67\x18\x7f\xc9\xd4\x63\x80\x03\xd5\x45\xa9\xcf\x8b\x8a\x5d\x63\xf0\x91\x53\x24\xe9\xe3\x8b\xb5\x2e\x4c\xba\xc6\x87\x39\xc4\x77\xf3\xc2\xfe\xa5\x25\x0c\xb4\x96\xce\x77\x90\x23\x56\x48\x34\xe9\x49\xa6\x68\x6f\x95\x58\x7f\x70\x12\x83\xbf\xac\x6b\x62\x9d\xfa\x57\x18\x96\x83\x8a\x89\x35\x1d\xc8\x24\xe7\x62\xdb\xb8\x37\x06\x82\x54\x76\xcd\x7c\x92\x95\xaa\xa8\x3a\x2a\xf7\x0d\xe6\x07\xe3\x6e\x80\xc1\xc8\x55\xf9\x4e\xbd\x7c\x46\xd0\xfb\x8c\xce\x21\x2b\xf8\x2a\x1e\xf6\x8e\xa5\xce\xe1\x54\x2a\x59\x56\x62\x32\x8e\x78\xb1\x5b\x70\x4e\xf2\x90\x5c\x6d\x6d\xaa\x3b\x16\xa1\xad\xf5\x68\x60\x85\x42\x26\x4e\xf3\x4c\x93\x16\xa0\x85\xfe\x0e\x52\xc8\x00\xe2\x4b\x26\x71\x1b\x5d\xee\xba\x54\x99\xa2\x80\x80\xd0\xd2\xe9\x4e\xa6\x7a\x82\xb4\xfc\xab\x37\xe8\x0f\x4f\xe5\x92\xcf\x71\x83\xfe\x0f\x2e\x6a\xf9\x17\xfd\x74\xb1\x5c\xeb\xc3\x55\x26\x95\x32\x6f\xaf\xeb\x4c\x55\x61\x5d\x87\x99\xaa\xa0\xa9\xc5\x0e\xab\xac\x6d\xf9\x73\x43\x3d\x81\xd2\x32\x0c\x04\x3f\x3c\x27\xdd\x27\x52\xd9\x1b\x00\x67\x77\x71\x28\x5a\x90\x2c\xbc\x61\x40\xa8\x92\x2f\x91\xb6\x95\xa5\x17\xcf\x7d\x74\x1e\x6e\x6f\x79\x28\x0a\x05\xa9\x88\x80\x26\x99\x67\x47\x25\x77\xc4\x62\x47\x68\xbd\xca\xe4\x2c\x96\x8c\xff\xcd\x5e\x2e\xbc\x68\xbb\x1e\x23\xd8\x0e\x94\xd9\x20\x24\x17\x16\xb3\xc0\xdb\x67\x2e\xfd\xc2\x46\x6b\xd5\xa9\xd8\xea\x21\x69\x49\x0d\x9b\xf9\x81\x9e\x91\x3e\x92\x2a\x59\xa4\x3b\xc7\xad\xa4\xb7\x79\xc2\x4a\xad\x83\x35\xd2\x79\x3c\x85\x10\x31\xc2\x6c\x5b\xbf\xb3\xc3\x97\x54\x14\x92\x92\x74\x4a\xab\x53\xb4\xb5\x08\xac\x4d\x36\xc1\x35\x5f\x0b\xb4\xc0\x93\xed\x43\xee\xc2\x3d\x42\xa5\xbf\x07\xd9\xd1\x29\x75\x3f\xff\x28\xba\x85\xdb\x0f\xee\x31\x77\xa5\xd1\x51\x80\x74\xa3\x84\xaa\x58\xe5\xb7\x18\xb0\x25\x00\x0e\x13\xfa\x2b\xc5\x01\xed\x5e\x77\xcd\xf4\x18\xcc\x99\x3b\x14\x10\x6b\x23\x70\x8e\x5b\x55\x3d\xba\x0c\x8b\x43\x50\xe0\x36\x5b\xc8\xea\x69\x90\x1c\xd9\xc9\xa7\xa2\x86\x23\x83\x4d\x49\x37\x9c\x7f\x64\xf0\xfb\x1d\x84\x9b\x76\xeb\xdb\x97\x3d\xba\xfb\xf9\xc5\x09\x1c\x29\x2c\x70\x85\xf8\x51\x6b\x42\xbd\xcd\xef\x98\x0f\x0f\x36\xed\xfd\x01\x8e\x17\x21\x2f\x35\xb6\x34\x37\xe4\x9a\x69\x49\xe6\xce\x7b\x29\x0e\xfc\x99\x7f\x74\xe1\xbe\x64\x55\x7e\x9d\xc3\xf1\xd2\x2d\xa7\xa6\xb2\xe9\xa2\x53\xa9\x35\x51\xd0\x76\x96\x99\xa3\x12\xb7\x5a\xcb\x76\xf0\xb0\xc3\x27\x83\x74\x2d\x50\x86\xfd\xf0\xe3\x20\xca\x1a\x75\xdc\x8d\x33\x0a\x1a\xa2\x53\x19\xbd\xeb\x3a\xe4\x8d\x9b\xfb\xf6\xb6\x50\xb7\xb2\xf2\x80\x06\x0e\xb6\x39\xc4\x45\xdd\x84\x9d\x43\x2b\x1b\x3c\xbc\xea\x14\xe3\xf9\xdd\x8f\xb4\x9d\xa9\x7a\x86\x3a\x05\x05\x04\xa3\xe3\x3b\xa5\xcd\xe0\x46\x37\x41\xb7\xa6\xdc\x00\xe1\xb0\xde\x72\x3d\xfc\x1c\x2a\xce\x11\x51\xb5\x25\x16\x60\x62\x81\x53\x12\xd0\x80\xb6\x75\x45\xf0\xc6\x94\x4d\x00\x9f\xe7\x75\xa5\xff\x60\xc4\xef\x83\x62\x90\x3b\xea\x25\x7a\xae\xb4\xa2\x65\x15\x64\xc7\xf0\xf2\x9f\x46\x93\x02\xf3\xf4\x19\x9f\x0b\xec\xa1\x5b\x20\x67\x40\xab\x54\x6d\xbc\x72\xd1\x32\x4f\x63\x67\x4a\xd3\x9d\xf7\x57\xb3\x7a\xc6\x95\xe2\xda\x62\x58\x6c\x3d\x10\x65\xbd\x28\x72\x6d\xb9\xb8\xb3\xb1\xd8\x21\x3b\x07\xcc\x57\xf6\x09\x01\x6b\xf3\xb6\xd0\x2f\x48\x33\x50\x9b\x3a\x95\xa0\x5e\xd8\xc6\x20\x74\x28\x8b\x04\x45\x04\x47\x19\x16\x3b\xbf\x15\x54\x44\x9d\x94\x20\x52\x43\x6d\x91\x41\x73\x8a\x18\xc7\xdf\x51\x89\x00\x38\x47\xaf\x11\x62\x3a\x5d\xc9\x42\xde\x16\x72\xbb\x16\xaf\xbc\x8b\x47\x95\x7e\x0f\x59\x05\x20\x94\x6f\x6d\x64\xaa\xb5\xbc\x4b\xf2\xa2\x29\x84\x5d\xa8\x75\xbd\x2d\xef\x9d\xc2\x5e\xb4\x12\x31\x21\x19\x62\xfc\xb7\x05\x05\x8f\x2b\x55\x3a\x26\xb5\x3b\xf3\xdf\x86\x36\x7b\xeb\x91\x49\x6f\x2d\x9b\x37\xe9\x75\xf9\x5b\x4f\x38\x41\x4d\xfe\x1d\xbb\x3a\x74\x90\xc3\x4a\x7b\xaa\x16\x3b\x18\xa2\x16\x95\x3b\x2c\x37\x76\x48\xf2\xfc\x2e\xb8\xe4\x7b\x18\xbc\x69\xfa\x08\x1b\x16\xde\xa3\x07\x44\xeb\x80\x0c\xfc\x86\x67\x39\x41\xe7\x15\x25\x2c\x19\x09\xe2\xe6\x18\x3a\x59\xfa\x6b\x99\x79\xce\x33\x92\xaa\x54\x18\x38\x6f\x10\x16\x76\xf8\xf8\x76\x3c\xf5\x5f\x8f\x4d\x90\x2b\xa8\xde\x8f\x66\xe2\xaa\x3f\xf8\xb1\xff\xee\xe9\xc2\xed\x2f\x63\x0c\xec\x8a\x2b\x3d\xcd\x18\x38\xfa\x02\xc6\x40\x9c\xdb\x28\x8b\xf7\xf1\x9d\xcf\xf9\x09\x9f\x5f\x0d\x87\x17\x47\x27\xbf\x1f\xff\xd7\xd9\xab\xb3\xe3\x57\x8d\xf8\xcf\xc9\xeb\x97\x7b\xfe\xef\xaf\xf2\x33\xd9\xaa\x0c\x93\x8f\x07\x80\x95\x5e\x8a\xa3\x86\xbf\x62\xa8\x62\x76\x9c\xfe\xb3\x09\xc5\x1e\xe8\x5d\x73\xf8\xec\xaa\x50\x72\xb3\x48\xd5\x33\x0e\xfc\x7c\x69\x53\x4b\x4a\x53\xb7\xa1\x13\x2e\x1e\x37\x60\x6e\x3b\x04\x73\x5b\xa1\x7f\x04\x40\xce\x2d\x68\x17\xb3\xfb\x82\xc8\x03\x5c\x7e\x56\xa6\x09\x31\x17\xbd\x3f\x24\x02\x89\x01\xc3\xc1\x34\xb7\xc1\x27\xec\x49\xab\x76\x3d\xcf\x20\x9b\x7c\x21\x4b\x04\xe4\x60\xb3\x88\x18\x2c\x0e\x7a\xfa\xaf\xbd\xc3\x80\x73\xd7\x8c\x0d\x42\xa0\xf1\x08\x93\x9f\xee\xc2\x67\x97\xa0\xe2\x9b\xb6\xb4\x68\x5e\x52\xe6\xd9\x62\x67\xef\x45\x7d\xdf\x6f\x94\x97\x5f\x55\x06\x10\xf2\xc1\x4a\xa3\xa8\x2e\xf2\xad\xa2\x2c\x5d\x23\xd3\xe1\x1f\xd2\xb0\x21\x3b\x3c\x42\xf6\x8d\xfa\x3e\x26\xb7\x5d\xaf\xac\x13\x54\x17\x93\xb2\x67\xbe\x22\xa8\x03\x6f\x73\xad\xc2\x33\x6c\x70\xa9\xd0\xaf\xcb\xd5\x7b\x0e\x2a\x26\xaa\xf9\x98\x4d\xcd\x58\xff\x74\x59\x6d\x8b\xbc\xd2\x66\xbe\x33\x60\xad\x21\x00\x8c\xc9\x52\x66\x0c\x5f\x56\x67\x4b\x55\x54\x32\xc9\x88\x63\xb3\x90\xcb\x0a\x53\xf8\x93\xd5\x2a\x59\xd6\x69\xb5\x23\xb5\x28\x2f\x31\xb2\x41\x69\x6f\xb0\x0f\x1a\xad\xe3\xda\x80\xae\x81\xa9\x88\x50\x07\xb0\xa8\x2d\xb6\xb8\x29\x4d\xb1\xd5\xc4\x1e\x47\x81\x14\x3d\x08\xa9\x35\x48\xa5\x7b\xc8\x49\x2d\x97\x6b\x5b\x40\x97\xa0\x6a\x90\xd7\x55\xea\xb2\x5a\xcd\x96\x09\xec\x25\x3e\x02\x57\x45\x5e\xe5\xcb\x1c\x32\x34\xc5\x68\xb3\x4d\x15\x9b\xb7\x70\x5c\xfa\xcb\xa5\x2a\x4b\x38\x35\x84\xd3\x88\x35\x2a\x94\xf1\x48\x89\xc0\x06\x98\x71\xa9\x44\x55\x24\x0e\x5d\x69\x9d\xa6\xaa\xac\x4c\x2a\x6a\x4e\x79\xa8\x5a\x5b\xd0\x43\x85\x9c\xc8\xbc\xa0\xbc\x4d\x43\xf0\xe9\x54\x3e\xdb\x8d\x82\x21\x4c\xde\x0a\xbc\x5a\x98\xad\x38\x30\x91\x8a\x71\x5e\x20\x9f\x08\x27\x70\x3b\xe4\x2a\xf9\xca\x4d\xab\x34\x4d\xe5\xb8\x09\x59\x3d\x04\xbf\xbc\xf4\xb5\x48\x3e\xfe\x81\xa7\x47\x2e\x2b\x83\x90\x88\x59\xc9\x70\xb6\x71\xc6\x4c\xd2\xa4\x01\x26\xaa\x9d\x0c\x91\xe6\xbb\x31\x53\x67\x9b\x97\x89\x9b\x3d\x68\xe2\x16\xfc\x81\x16\x20\xcf\xde\x2a\x86\x81\x76\x43\xba\xe0\xe3\x2d\xfd\xc6\x91\xe7\xbf\xb4\xd2\xc0\x14\x3e\x2f\x53\x10\x3d\xa5\x5d\x11\x93\xf3\x68\xea\x5d\x62\x90\x89\x01\x45\x60\x90\x3d\xcc\x93\x4e\x98\x83\xeb\x40\xe3\x11\xc9\x5d\xde\x40\x09\x33\x8a\x3b\x77\x36\x14\x53\x1b\x91\x21\x56\x01\x47\x42\xfa\x66\x20\xfc\xcd\x94\xa1\xd0\xb1\xd5\x93\xb4\x51\xb2\x44\x2a\x5c\x62\x60\xb2\x3b\x84\xa7\x15\x66\xc1\x31\xf8\x3d\x49\x69\x21\x8b\xf0\xac\x92\xe4\x24\xba\x41\x88\x8c\xc4\x06\x5d\xbc\x40\x70\x7d\xf0\x84\x97\x6a\x59\xa8\x0a\x22\x4d\x84\x28\x22\xdd\x79\x68\xc5\x9c\xd8\xa7\xea\x94\xf7\x15\xa5\xe1\x9f\x72\x43\x0d\x7c\x86\xf4\x22\x55\xae\xbf\xd2\x86\x70\xb4\x58\xb2\x56\x5d\x6b\xb0\x88\x76\x88\x09\x63\xa0\x68\xde\xe6\x32\xa5\x78\xbf\x3d\x71\xde\x2a\xae\x55\x6a\x62\xce\x8f\xbe\x87\x8f\x1c\x6e\xdc\x8c\xe3\xf0\x94\x7b\xbc\xa0\x60\x4a\xd9\xbd\x97\x63\xbc\x5a\x6d\x93\xb0\x97\xad\x59\x91\xca\x7b\x14\xdd\x7a\x5a\x36\x79\xc9\x94\x5c\xa9\xbc\x77\xac\xb3\x85\xcc\x32\x4c\xc0\xee\x75\x02\x71\xf6\x02\xbc\x24\xd7\x60\xe4\xa4\x3b\x61\x92\x69\x53\x93\x00\xeb\x04\x06\x71\x6b\x43\x7a\x45\x89\xd0\x29\x24\xd9\x1d\x97\xde\x3a\xbf\xef\xa4\x70\x18\x5d\x99\xda\x31\x99\x11\xf6\x77\x92\xfd\xb5\x06\x50\xb1\x00\x25\x63\x8c\x10\x83\x20\xd5\x8c\x04\xde\x00\x26\x1d\xdc\x49\xde\x25\xea\x4c\x4c\x1a\x53\x5f\x21\xdd\xa4\xdc\x26\x95\x12\x9b\x1a\x6a\x33\x8b\x4d\x9e\x25\xa5\x49\x32\xde\x24\x19\xe4\xfa\xa7\xea\x4e\xa5\x25\xe1\x17\xd0\x09\xc1\x0d\x80\x2c\x01\xca\xed\xba\x0f\x59\x63\x6a\x53\xb4\xdc\x2e\xb7\x68\x16\x96\xd4\xcf\x38\x29\x29\x0c\xd0\xd5\x63\xbc\xd4\x6a\x10\x23\xca\xdc\xf1\xe6\x6a\xd4\x0d\x82\x48\xb4\x62\xca\x4e\x12\x97\xae\xea\x89\xc2\xea\xa0\x87\x81\x55\xdd\x22\x4e\x7f\x2d\x7c\xd5\xa0\x0c\x8c\x5e\x44\x1b\xfa\x36\xcd\x17\x10\xf9\xa4\xfb\x21\x14\x2c\x3e\xf9\xcc\x11\xa3\xf6\xc3\x90\xc5\xb0\x33\x7d\x61\x8b\xd5\xc4\xce\x82\x3b\x59\x22\xa5\x19\x15\x7f\xaa\x52\x75\x27\x0d\x20\x27\xb9\x93\x65\xb2\x29\x41\x84\x00\x59\xf5\x6d\x0e\x49\xbb\x8d\xf2\xf7\x92\xa2\xd0\x4e\x46\x43\x63\xc7\x14\x5a\x2e\x4b\xce\x6b\xa6\x88\x3c\x07\xa3\x29\xe0\x02\x4b\xa1\x5b\xb6\xfd\x05\xbe\x2d\xdd\x43\x07\x8f\x99\xba\x84\x87\x97\x74\xd3\x07\x12\x87\x14\xba\x88\xf1\xd9\x35\xf8\x03\xe0\x73\x8c\x33\xa2\x1c\x05\x49\x4e\xae\xb6\xc6\x95\x12\x8a\xeb\x2c\x4d\x3e\x29\x16\x77\x38\x32\xa0\xdb\x86\x3d\xaa\xf5\x0e\x8a\x20\x58\x8a\x5d\xf8\xb3\x1e\x49\xad\xcf\x28\x11\x6b\x6b\x69\xb2\x55\x19\x5f\x70\xa6\xc1\xa0\xd1\x37\x0f\x37\x81\xf4\x8f\x5e\xec\xb0\x7a\xf7\xdc\x5e\x03\xc8\x63\xaa\xa4\x81\x9f\x86\x45\x80\x3f\xa1\x24\xb2\x5e\x14\x7e\xa1\x3d\xae\x0b\x73\x3b\x73\x92\x37\x58\x09\xe0\xf2\x01\xfa\x44\x07\xcb\x85\xe6\xc8\x26\x8c\xa0\x57\x4e\x31\x22\x42\x48\x29\x69\x66\x8a\xb5\xb8\x82\x44\xdf\xa5\xcc\xbe\xd1\x1b\xf0\xc8\xe4\xa5\x55\x86\x51\xca\x49\x87\x69\x9c\x8e\x2e\x9c\x86\x76\x7f\x33\x2a\xd7\x4b\xd5\xca\xc5\x63\x08\xc5\x30\x87\x10\x6f\x6e\xa8\x36\xab\xa2\x06\xdc\x3e\xad\xf0\x80\x12\x01\xd7\x44\x95\x8b\x45\x9d\xa4\xb1\x28\x20\x87\xcc\x16\x45\xf0\xa5\x7a\x07\xe9\x40\xc6\xff\xac\x10\x41\xb0\x24\xc5\x94\xf3\xfe\x65\x51\x95\x94\x1c\x6e\xb6\x1f\x28\xe6\xa0\x0c\x72\x25\x4e\x21\x16\xd6\x18\x78\x44\xf3\x39\xe0\x3f\x1f\x5a\x09\xe0\x5a\x1e\x19\xad\x95\xb8\xd7\x37\xf5\x9d\x2c\x12\x55\xb9\x84\x92\xe2\x08\xf6\xcf\x5f\xea\xb2\x12\x2b\x89\x12\x02\x46\x7b\xd4\xd8\x6a\x94\x8f\xc7\x4b\xfc\x0b\x6d\xce\x15\xc5\xca\xb1\x26\xe3\xe1\x61\x41\x88\x39\x59\x21\x0a\x2a\x2e\x1b\xdd\x46\xa4\x8b\x3d\x84\xe1\x6f\x55\x31\x9e\x0d\x75\xa7\x32\x7f\x68\xba\x25\x6d\x6d\x20\xc6\x0c\xcc\xcf\xe3\x42\xfa\x91\x99\x70\x94\x1b\xc0\xc7\xd0\x6b\x08\x2b\xd7\xb9\x6c\x5e\x37\x20\x35\x82\x89\xeb\x64\xa5\x0a\x7d\xc7\xb4\x59\x0a\x9c\x41\x7d\x8f\x83\xc1\x84\x35\x78\xf3\x27\xa8\xc2\xe2\x84\x45\x6c\x16\x7a\x67\xbc\xc7\x6d\x43\xb7\xe3\x00\x85\xcf\xfc\x03\xa9\x67\x08\xe2\xe8\x6d\x7d\xdc\x8c\x12\xc8\x54\x1e\x3b\x94\x4c\xd7\x0b\x15\x95\x7a\x3d\xa5\xf9\x0a\xaa\xa7\xa9\xd2\x53\x5f\xb9\xc4\x94\x58\x2d\xe8\xf4\x9a\x94\x25\x16\xa8\xfa\x35\x1c\x7c\x07\x35\x60\x07\x7d\x8d\x29\xf0\xb1\xe8\x34\x21\xfc\x2c\xc5\x1e\x10\x9e\x06\x06\xa5\x0e\x76\x15\x1d\xbb\x23\x73\xf0\x8e\x1e\x3f\x77\x0d\x9b\xd1\xdf\x20\x99\x22\x56\x40\x8a\xad\x62\x3e\xea\xbd\x29\x91\x01\x03\x9a\x4e\x47\x76\xdb\xb5\xd0\xb8\x37\xe0\xcb\xf4\x45\x05\x99\x59\x3f\xe8\x63\x0a\x57\x0c\xe2\xff\x1a\xad\x9a\xcc\x00\x7e\x3c\x56\x32\x35\x25\x81\x9d\x7b\xfb\x81\x4d\xbd\x50\x84\xc1\x82\x95\xae\x19\x48\x64\x5c\x3d\x96\xc8\xf7\xfc\x97\xfc\x3e\x2b\x4d\xc9\x80\xca\x08\x55\x9c\xb6\x22\xb3\x4a\x19\xcc\x0d\x98\x0c\x9c\x17\xca\xbd\xd1\x2a\xeb\x67\x6d\xfb\xa6\xb4\xdc\xaa\x62\x23\x33\xd4\x83\x61\x61\x0c\xfa\xfd\x8e\x48\xcc\x75\x0f\x10\x24\xdd\x27\xd6\x31\x17\x36\x3b\xab\x48\x61\xd2\xff\xfc\x94\x64\x94\x2b\x92\x54\x3c\x1d\x6e\x20\xa0\xce\x20\x9b\xd6\x0e\x0e\xa7\x0e\x11\x0e\xd4\x16\x06\x67\x42\xba\x55\x2e\xd6\x72\xbb\x55\x59\xf8\xec\x4a\xdb\xdb\xa3\xef\xc4\x28\xab\x0c\xee\x09\x28\x23\xee\x91\x43\x39\x7e\x85\xdc\x01\xfa\x23\xa7\xa4\xc2\x02\x3a\x9b\x94\x62\x3d\xb6\x43\x2c\x69\x83\x70\x2e\x66\x64\x20\xbd\xd4\x49\x78\xec\x92\xc4\x63\x05\xd9\x36\xa9\x64\x0a\x40\xcc\x1f\xf2\x22\x2e\xf5\xf7\x6c\x36\x6a\x4f\x1c\x89\x11\x53\x3e\x7a\x6e\x19\x5f\x27\xc5\xcf\x32\x95\xdc\xae\x17\x39\xc2\xdd\x38\xaa\x1f\xf9\x25\xd2\x9d\xa9\xec\xf2\x1d\x58\x8e\xc8\x86\x2a\xe9\x95\xaf\x44\x7a\x75\x8d\x4d\xb6\xb1\x17\x10\x22\xe9\xe9\xfb\x46\x77\x76\xde\xe0\xb2\xd5\x0d\x0d\x8d\x68\xc1\x83\x6d\x38\x2c\x21\x2d\xd2\x92\xb9\x20\x72\x09\xd7\xf3\x3b\xfa\x16\x26\xf8\xf1\x86\xa4\xd4\x63\x1b\x56\xb5\x6f\x30\x68\xdf\x0f\xdd\x41\x43\xb3\x6f\xb9\xd3\xfa\x31\xdd\xf1\x7e\x23\xa5\x19\x2e\x50\xca\x6d\xc0\xb4\x62\x02\xda\x94\x55\xb2\x04\x14\x29\x55\xad\xf3\x18\x3c\x04\x5a\x87\xc2\x02\x66\xeb\xdc\x74\x75\x94\xc5\xce\xe5\x84\xb6\x23\x02\xab\xf0\x97\x75\x19\xb7\xa8\xee\xf8\x25\xb4\xc2\x1b\x52\x6f\x43\xe8\x3a\xca\x3f\x48\xa7\x30\x99\x8e\x6b\xb9\xad\xb4\x19\x39\x1a\x89\x03\xcf\xdd\x79\xd8\x40\x30\x31\x6f\x19\x22\x99\xe7\x9d\x12\x07\xf6\x9f\x6f\x5e\x3d\x7f\xf3\x3c\x1a\xf0\xf2\xa2\xf7\x55\x42\xe4\x38\x4d\x24\x42\x19\x69\xa5\x9a\xc3\x78\x75\xb6\x4c\x20\x33\xf4\xe4\x44\x5c\xca\x62\xb9\x16\x27\x6f\xde\xbc\x62\x73\x1e\x8d\x3c\xc7\xc9\x42\xd0\xce\xa0\x26\x1d\x1a\xa4\x33\xaa\xfa\x67\x6a\x5f\xc7\xe3\x0a\xb0\x36\xe4\x79\xe3\x4d\x6f\x64\x8b\x81\x8f\xff\x92\xbd\x4c\x33\xae\x67\x97\x2d\x77\x64\x7f\x26\x5b\xc6\x0c\xd1\x82\x12\xb4\x0c\x2d\xf8\xe7\x42\x2e\x3f\x89\x7a\x6b\xae\x03\x53\xe9\x8a\x2f\x42\xa1\x62\x17\x51\x22\x1c\x11\x62\xa8\xd2\xbc\x18\xce\x12\x69\xaa\x4e\xf1\xb3\xd2\xe4\xf6\x11\x20\xb7\xf9\x15\x1b\xbf\xa6\x7d\xad\x9b\xbd\x53\xc5\x22\xa0\xb1\xc4\x39\x9a\xc1\x3b\x70\x26\x32\x65\x2f\xbb\x67\xf0\x6a\x1f\xb8\xca\x83\xbf\xe5\x4a\x83\xdd\xc1\x10\xb6\xec\xbf\xc1\xd4\x4a\x0f\x83\xe1\x7b\x3a\x16\x74\xde\x31\x42\xc1\x26\x0e\x53\x65\x50\xb4\xd9\x38\xdc\xd2\x9d\xc8\x94\x3e\x3b\xb2\xd8\x39\x30\xee\x09\xe2\xca\xb3\x29\xb1\xa1\x5c\x39\x94\x1e\x6c\x0c\xb9\x92\xc5\x14\x50\x58\x0c\x2a\xf3\x5e\x9c\x22\xe4\x57\xe7\xd9\xef\xd6\xef\x87\xae\x9e\x01\x27\xeb\xcb\x0e\x2c\x54\x00\xa0\xca\x42\x77\x08\xc2\x8c\x74\x70\x01\x1b\xeb\x54\x4b\x0b\x9f\xf9\xc3\x6b\x13\xee\x09\x9e\x7e\x6d\x31\x02\x34\x3e\xe7\x97\xc2\x55\x9a\xc2\x2e\x82\x9c\x86\x64\xa9\x00\x91\x5e\x52\x7a\xf5\xb1\xf8\x60\x0a\x7f\xad\x95\xa3\x05\x47\x89\x5f\x38\x09\xc5\x05\xb2\x10\x1b\x98\x31\xbf\x0f\x38\xd7\x43\x6b\xa0\x9b\x64\xc3\x50\xf4\x8d\xfa\x84\xae\x85\x96\x25\xde\x38\x37\x03\xef\x1a\x6b\x6e\x35\xef\x56\x75\x89\x01\x17\xfa\x4d\x46\xc9\xfa\xa2\x66\xf4\xc4\xf9\x2e\x0d\x38\x03\xec\x60\x87\xf8\xda\x0a\xdc\xcc\xde\x71\x67\xf7\x45\x41\xd3\x78\xca\xb3\xe4\x32\xdf\xda\xea\x78\x19\xda\x3e\x61\xbc\xc0\x53\xc8\xbb\x6e\x6a\x5a\x50\xd8\x9e\xc2\xf3\x52\xa2\x71\x58\x9a\xf2\xf8\x46\x20\x6c\x51\x7b\x26\x07\x59\x01\xdf\xf9\xdb\x57\x9f\x17\x90\x2b\xe5\x72\xad\x36\xd2\xdc\xc5\x78\x56\x0c\x17\x7f\xe0\xe6\xf3\xa1\xce\x85\x39\xc3\xa5\x07\x32\x30\xf4\xac\x05\x63\x93\xb8\x7b\xd0\xbc\xd9\xc9\x2a\xad\x48\x26\xc7\xea\x67\x55\x7e\x6f\x0d\x23\x95\x55\x05\x5e\xa1\x94\x2e\x56\xae\x95\xaa\xca\xef\x8d\x65\x7e\x9e\xa8\x94\x92\x23\xcd\xe5\x5c\x56\x79\x61\x5d\x9c\xfc\x3a\x77\xea\x2c\xa9\x83\xd9\x01\xf0\x24\x2a\x19\x50\x71\x83\x0f\x7b\xb7\x02\xbc\x73\x87\x24\x2b\xfa\xeb\x8d\x7d\xd7\xd8\x5c\xad\x0f\x50\x25\x87\xe8\x53\xec\xb0\x77\x16\xd2\xb6\x5e\xa8\xa3\xba\x4a\xd2\xc6\x9c\x1a\x6e\x05\x09\x64\x12\x95\xcc\x80\x0b\xd1\x05\x8c\xc5\x98\x58\xf3\x85\x30\xfd\x50\x2b\x01\x36\x28\x1b\x28\x05\xa1\x8f\xbb\x3b\xcf\x9d\x06\x9c\xad\xce\xc6\xf4\x9c\x61\x8b\xdc\x18\x4e\x1c\x5c\x14\x9b\xdc\xab\xac\xf0\x04\x64\x52\x8a\x52\x91\x76\x06\x37\xb7\xa7\x40\x35\x32\xc0\x3c\xea\x39\xb8\x90\x2c\xf2\x8a\x8d\xfd\xd2\x71\xe3\xfe\x61\xda\x79\xf3\xac\xf9\x12\xc9\x52\xa4\x32\x04\xcf\x92\x61\xbf\x4c\xfa\x61\xed\xb9\xc7\x3f\x51\xf9\x95\x87\xc7\xee\x8e\xee\x7b\xbb\x01\x1e\x78\x97\x35\xbd\x11\xdb\xb1\xf4\x67\x9b\xf9\x7d\xed\xcc\x3b\x15\xdd\xac\x82\xbc\x08\x4f\x85\x56\xd0\x0b\x03\x5c\x65\xde\x03\xfe\x4a\x8a\xe6\xc4\xaa\x92\x49\x5a\xba\x1b\x73\xf9\x19\xfd\x42\x44\x63\x04\x72\x76\x2a\x70\x4c\xce\xee\x13\x5d\x3b\xfb\x82\xae\xf1\xd2\x5c\xdb\x9a\xc9\xa4\x74\xb6\x0a\xf8\x13\x21\x65\xd5\x02\x51\xa8\x1d\x1c\x58\xb0\x4b\xd9\x44\xf7\xf9\x90\x10\x4f\x06\xf1\x0a\x3d\xe7\x03\x6d\x92\x33\x71\x0e\xd8\x26\xc0\x8f\x55\x28\x0a\x47\x79\xc6\x5c\x65\x8c\x50\x13\x2d\xc2\xb2\x17\x72\xff\xb8\xdc\x92\x89\xb7\xdb\x3c\xbd\xa8\x39\xdb\x6b\xcc\x0b\xa6\x7b\xf4\xa9\xbb\x06\x58\x78\x28\x19\x00\x42\xd6\x5d\x2f\xb7\xb7\x81\xf7\x66\x4b\x3c\x65\xd6\xd5\x7d\x8c\x9a\x6d\xaa\x71\xac\xe6\x35\x70\x71\x59\x19\x42\x43\x78\xf4\x9d\xeb\x19\xec\xba\xbc\xb1\x92\xe9\xd8\xf9\x1a\x45\x9d\xa8\x52\xf4\x73\x6f\x64\x6c\xe7\xc4\x7d\xdd\x93\x97\x78\xb7\x5b\xbf\xb5\xc0\x8b\x9d\x0b\x49\x31\x34\x41\x74\x76\xd6\x38\x8b\xd3\xa9\x9e\x70\xb8\x9c\x90\xa9\x4c\xbd\x2f\x01\x32\x82\xf4\x76\x62\x30\x16\xc3\x19\xd1\x07\x3f\x5b\x0d\xf1\x84\x57\x63\x0c\x85\x02\x8f\x40\xc9\xae\x9e\x25\x87\x66\xd8\xca\x28\x9a\xa1\x3f\xe3\xdc\xf1\xda\xc1\xc2\x59\x73\x36\x7f\x51\x3f\x03\x8b\x6b\x62\x77\x75\xd9\x08\x9d\xac\xd8\xa6\xe5\xda\xab\xd0\x15\x97\x8d\x5e\x61\x3e\x91\x49\xed\x4d\x5a\xaa\x96\xdd\xdc\xa9\x36\x0c\x11\x42\x10\x30\x93\xd0\x06\x6c\xeb\x4b\xa4\x42\x3f\x3a\x2c\x0b\x3a\x68\x3c\x7d\x77\x08\x84\x43\x30\x55\xfa\x1a\x72\x38\xec\x9c\x61\xb7\x8d\x3f\x6b\xf1\xd1\x89\x27\x7a\xf0\xa4\x10\xfa\x3f\x25\x63\x6a\x6b\x33\x26\x2f\x8c\x38\x04\xc8\xa6\x45\x7e\xa7\x1e\x6e\x8f\x20\x7d\x30\x24\x0b\x91\x01\xdf\x84\x82\xfa\x5d\x98\x0c\x38\xf3\x7a\x81\xef\xc5\xa7\x2c\xbf\x47\xb8\x2d\x2a\xc1\xa6\xb9\xc1\x09\xa3\x02\xc4\x53\xc2\xee\xeb\x36\x57\x9f\xdc\x15\xa0\x09\x18\x3a\xe8\xf0\xc4\x55\xf4\x93\xcc\x5e\xdd\xa1\x18\x79\xe1\x77\x12\x66\xde\x93\xfe\xfd\xfc\x65\x36\x7a\xd0\xde\xe7\x14\xf9\x74\x72\x78\x9c\x81\x75\x1f\x0d\x73\xd3\x40\xfa\x0c\xc2\x78\x7a\x93\xd6\x32\x1a\xbe\xeb\xd0\xec\x9f\x50\x0d\x79\xd5\x3d\x0a\x77\x93\xfe\xf2\xd8\xb0\x71\x90\xb8\x55\x1e\x75\x32\xfc\x06\xbb\xa5\x7d\x62\xc9\x9b\x49\x60\xe9\xc8\x5d\xe7\x74\xf0\x81\x18\x34\x9b\xdf\x0c\xfa\x08\x89\x2c\x6d\x19\x78\x16\x9e\x99\x18\xd4\x93\x97\x80\xbb\x09\x4b\xd8\x4b\xfa\x5b\x7a\x6f\x3f\xb5\x05\x1d\xb3\x33\x79\xa0\x89\x5f\x7b\x5b\x1a\x00\x39\x40\xe0\x6e\xf8\x82\xad\xe8\xc7\xfc\x51\x87\x33\x1a\xc9\x43\xa4\x5d\xd4\x26\xbd\x6c\x83\x7b\xd6\x89\x72\x5d\x3b\x3e\x0e\x9b\xf9\x55\x5b\x9d\xb6\xa1\x66\x3f\x3a\xdb\xd0\x3d\x7b\xeb\xa8\x9f\xf5\x63\x49\x05\x53\x83\x76\x9e\x03\x3a\x5c\xb3\x31\x48\x86\x34\xc1\xc5\xa1\xef\x0e\xac\xb7\x7c\x25\x54\x16\x2b\x79\x97\xd7\x45\xf8\x8b\x0f\x85\xed\x0f\xf9\x8d\x88\xb7\x99\x6c\x8c\x34\xed\xd8\xf4\x2c\xf8\x3f\x5b\x54\xbe\x10\x97\x79\x61\x6c\x7b\x52\xf6\x4a\x5a\x6c\x92\xf8\x1b\xe7\x1b\x4d\x46\x7d\xb3\xf7\x17\x4a\x24\xb1\xca\x2a\xac\xd2\xa5\xb2\x09\x59\x57\x6b\x9b\x94\x04\x4b\x85\xf0\xa8\xb9\xc5\x0c\xd3\x9d\xb3\x99\x5d\x68\x2f\xd9\x12\x69\x07\x43\xdb\xb4\xf7\x4d\x29\xd6\x79\x96\xd7\x05\x29\x29\xdb\x9a\xe9\xd8\x3d\x54\xd4\x58\x15\xf9\xad\xac\xf2\x62\x67\x5f\xe2\x6c\xc8\xf3\x56\xc2\x87\x29\x6c\xb6\x72\xc8\x1f\xba\xd9\xbf\x2c\x86\xf5\x1a\x38\xdf\xc0\x21\x98\x6f\x19\xc9\xeb\xde\xdf\x4f\xe4\x6e\x5a\xe4\xbe\x2f\x0c\x4e\x38\x66\xdb\x68\xf5\xc0\x08\x1a\x4f\xe9\xd5\x97\x8f\x1f\x7e\x32\x0c\xb8\x7b\xce\x14\x74\x4a\x4a\x3d\xf9\xde\x0b\xfd\xab\xc5\x91\x9b\x80\xae\x69\xee\x63\x7f\x12\x7f\xab\x19\xf2\x8d\xc8\xf6\xfa\x1b\xaf\x98\xbb\x07\x0a\x84\x9a\x66\xdc\x46\x7f\xbc\x4f\x4e\x2e\xb8\xc6\x03\xf7\x2c\x20\x2e\x06\xb3\xbd\x26\xc5\x03\xf3\x65\xbc\x02\x70\x98\xb6\x6a\x69\x83\x4c\xae\x4e\x4d\xe6\x6b\x96\x57\x14\xf6\x2c\x5b\xe9\xe3\x6d\x7f\x1f\xb8\x60\x1e\xd8\xe2\x84\x7d\xe2\x75\x4a\x77\x19\x21\x20\xca\x7a\x51\x26\xa5\xe3\x5d\xe1\x24\x9b\xf6\x6b\xa9\x46\xfc\xd8\x47\xfc\xae\x72\xcf\xce\xc5\xef\x9c\x00\x37\x28\x25\xcf\x61\xb2\x6f\x0d\xd1\x2f\x86\x07\xe9\xb8\xa8\x39\xc4\x9a\x94\x1d\x31\x56\x04\x6d\xb1\x59\xff\xed\xb6\x1d\x3e\x62\x93\xbc\xdf\xa6\x72\xee\x4e\x7f\x36\x39\xcf\x9d\xae\x05\x36\x1b\x30\x73\xd5\x24\x2f\xe3\x7d\x41\x07\x06\x92\xa0\xbd\x14\x68\xcf\xeb\xfd\xa2\x89\x93\x5e\xe5\xec\x69\x79\xd0\xf7\x81\xac\x56\x78\x9b\xa6\x5e\x9e\x8b\xf5\xd2\x3c\xac\x1f\xe6\xf7\x59\xf8\x55\x3d\x18\x2f\xc2\xb3\xd6\x10\x1d\xa7\xcd\x2f\x1a\xa6\xeb\xf4\x79\x74\xa8\xe8\xa0\x7a\xe8\x0b\x75\xe9\x64\xd1\x58\x37\xf5\x57\x9b\x1d\xf2\x50\x8c\xbe\x13\xef\xa0\xa2\x37\xb5\x18\xd5\x25\x96\x96\x1f\x8b\x0f\x48\xbc\x0d\xa0\xd1\x16\x56\x26\x68\x00\x1f\x42\xe2\x22\x33\xb5\xe1\xa3\x27\x70\x92\x78\x8f\x9a\x9a\x57\x92\xa9\xde\x5c\xf4\x64\x29\x92\xb2\xd7\x2a\xa1\x61\xd2\x6f\x3f\x65\xe1\xc1\x33\x64\x8d\x51\x3d\x77\x49\xa5\x2f\x11\xfd\x24\x32\xd5\x22\x53\x34\xc1\xae\x65\xaa\x2c\x03\xe3\x86\x00\x6b\x98\x60\xcd\x16\xe6\x9f\x48\x9b\x1b\x20\x14\x57\x95\x31\x13\x35\xe5\x54\xfa\x18\xf2\x5d\xc5\x34\xbe\x34\x44\xbd\x0c\xd4\x4b\x9c\x2e\xea\x34\x0f\x12\x26\xb8\xa4\xbc\x1e\xfb\x45\x2e\xcf\x34\x4e\xd7\x9b\xbc\xa6\xb2\xff\x53\x97\x9b\xcb\xe7\xc7\x36\x0e\x31\x4a\xe8\x60\x98\x61\x4c\x63\xc6\xca\x94\x85\xc9\x88\x6d\xba\x12\x4a\x22\x57\x61\xac\x0c\x5c\xec\x16\x68\x71\x89\x4c\x0e\xf6\xad\x2b\xc3\x23\xcc\x0c\x29\xc6\x85\xc7\xd0\x38\xe8\xcf\x93\x5c\xbc\x43\xa9\x94\x8b\x9d\x49\x4e\x71\xd2\x61\xac\x9b\x89\x97\x95\xe8\xc6\x09\x1b\x06\x9f\x55\x29\xeb\xc8\xfc\x2d\x6a\x9e\x1a\x5d\x49\xd8\xf9\x16\xfe\x98\x57\xdd\x1b\x33\x52\x2b\x93\x2c\xf0\x96\xc9\x23\x1d\xa7\x61\x53\x6c\xc8\xa7\xa0\x09\x30\x66\x8e\xb9\xd3\xa0\xbb\x82\x92\xaa\xff\x0d\xd8\xd6\x40\x63\x0d\x7f\xda\x6a\x11\x0f\x46\x06\xc2\x92\x6c\xb6\xa9\x2c\x76\x4c\x2a\xd3\xea\x04\x9b\xa3\x9c\x0b\xd7\xe9\x91\x82\x9c\x23\x19\x23\xf9\x38\xef\x6b\xd0\x63\x0c\xe8\x39\x00\xed\xf0\x4b\x70\x0b\x9d\x69\x05\xce\x8e\xb0\x6b\xc7\xf0\x36\xe1\x0c\x3c\xc3\xb8\x43\xd7\x1b\x42\xf3\x15\x7a\x1b\xae\x92\x4c\x66\x48\x96\xa2\x77\x41\xe5\x19\x23\xf8\xbc\x5d\x1b\x2d\x10\x54\x2c\x32\x75\x9b\x26\xb7\x78\xe4\x1e\x5f\x23\x42\x4f\x38\x66\x59\x85\xbf\x9e\xe8\x11\x74\xc3\xf4\x3b\xb1\x54\xac\x8d\x20\xd3\x21\xbb\x93\x69\x02\x47\xa1\x0b\xa5\x1f\x30\x75\xe0\xc4\x59\x64\xfd\x25\x3c\x41\xdc\x3f\x6d\x34\xf9\xaa\x8d\xa3\xff\x68\xf8\xfa\x55\x78\xda\x8a\xf6\xe2\x54\xfd\x52\xe8\xee\x0f\x58\x6e\x83\x2e\xf5\xb5\x2a\x14\x64\xa4\x17\x8a\x8a\x89\xf4\xfc\x28\x59\xa4\x89\xa2\xaa\x35\x06\xea\xd7\x47\x98\x5f\x46\x65\x40\xe4\x1a\x34\x44\x75\x0f\xbc\x4c\xcf\x10\x15\x05\xf2\x2b\x71\x68\x67\x0f\x86\x8d\x70\x3e\x9b\x35\x61\x74\xa0\x9d\xd3\x0c\xdb\xd0\x49\x5a\x4a\xe9\x7a\xa3\xca\xb9\xac\x49\xe8\x69\x52\xec\x3c\xb8\x7d\xd2\xd6\x5c\x23\xf2\xa0\x9d\x78\x4f\x58\x2d\xcd\xc5\x30\x37\xfe\xa1\x58\xc9\xa4\xe0\xfc\xc2\x00\x7f\x03\xab\xdc\xa4\x4a\x22\x64\x34\xaa\x77\x9e\x51\x08\xb9\x26\x90\x1e\xb6\xcc\x6f\x33\x38\x98\xee\x85\x59\xd8\x27\x11\xc9\xca\x21\x2d\x83\x7c\x65\x27\xb2\x8d\x0d\xfa\xc3\x2e\x69\xc2\x5f\x34\x26\x1c\x83\x31\x94\x66\xf0\xb8\xc5\xc5\x6c\x1d\x10\xa7\x32\xcf\x23\x11\x7e\x01\xe8\x3f\xd6\xe2\x66\x72\x0a\xe3\x06\xa2\x45\xb4\xf5\x31\x3e\x23\x64\x63\x8d\x9e\xe8\x08\xb9\xd6\xb8\x50\xcb\x1a\x04\x7a\xe7\x3c\xf4\x8a\xc6\x2d\x81\x7e\x8c\x76\x13\xc8\xa3\x40\xe2\xac\x15\x67\x73\xe1\x2b\x36\x8a\x10\x7b\x1a\x78\xab\xf6\xf4\xfe\xde\x55\xd4\x7f\xdc\x9f\xf0\xf9\x28\x5b\xe5\x47\x7f\x1e\x5d\xfd\x5e\xf5\xff\xc7\xaf\x4e\x4e\x8f\x9b\xf8\xcf\xa7\xaf\xf6\xf8\xcf\x5f\xe5\x87\x57\xdf\x80\x3e\xb7\x68\x06\x8e\x8f\x4e\x8f\x8f\xdf\x08\xb3\x4d\x00\xcb\xb9\x51\x20\x1d\x3e\x3b\x67\x38\x58\x54\xc3\xed\x15\xeb\xe7\xee\x1a\xb6\xa9\x1e\xb7\xd7\xc3\x22\x3c\x84\xa0\x21\xa7\xa1\xe5\x7e\x28\x15\x61\xf6\x70\xb2\x69\xf9\xdd\xb3\x4b\x59\x7c\x12\xfd\x38\xd5\xe6\xce\x0f\xf9\x3a\x13\x6f\xeb\x72\x1d\x88\x1f\x65\x91\x8a\xa1\xbc\x4b\xca\x40\xbc\x97\x85\x4c\x63\x31\x54\xd9\x27\xf8\x96\x92\xd9\xd1\x65\xb2\x5c\xab\x54\x0c\xeb\x45\xae\xbf\x02\x9f\xa5\x79\xbd\x15\xef\x64\x02\x95\xb0\xef\xeb\xac\x52\x85\x78\x97\xcb\x2a\x55\xbb\x40\x44\xb1\x78\x97\x17\x71\x9e\x05\x62\x24\x33\xfd\xef\x8d\xcc\x02\x31\x58\x17\x49\x29\xde\xab\x62\x91\x17\xd5\x3a\x10\xc3\xa4\xf8\x24\xde\x4b\x48\x10\x7a\x57\xa8\x5b\xfd\xf2\xea\x3e\xb9\x0d\xc4\x34\x5f\xa8\xa2\x12\xef\x91\x4e\xfe\x87\x3c\x93\x80\x0a\xf3\xbe\x8e\x4b\xdd\xe8\x95\xac\x53\xf1\x63\xa2\xb2\xa4\xfa\x5b\x00\x3d\x8f\xc5\x8f\x49\x51\x2e\xd7\x0b\x59\x6f\x70\x6c\xd9\x4e\x5c\x28\x15\x88\x49\x96\xe5\xe2\x4e\x66\x42\x8b\xc4\x0b\x7d\x0b\xeb\x5e\xdd\xe6\x85\xb8\x94\x59\x5c\xe8\xa1\x65\x9f\xf2\x40\xcc\x2a\x75\xa7\xc4\x55\x28\x2e\x93\x14\x26\x68\xa6\x8a\xdb\x24\x17\x97\x79\xa6\xca\x24\x10\x3f\x6a\x2b\x4d\x4c\xee\x95\xbe\x16\xdf\xa9\xbc\xb8\x55\xe2\x4a\x55\x45\x7e\x47\x9d\x9f\xe6\x2a\xcd\x57\xa5\x9e\xce\x44\x5c\xdf\x2b\x31\xcd\x37\x1b\x95\x72\xcb\x33\x99\x26\xe5\x02\xd8\xf0\x87\xfa\xf2\x9f\x6d\x80\x9c\x0b\xfe\x98\x89\xcb\x50\xcc\x96\xeb\x7b\x15\x4b\x9a\xa6\x2a\x91\x99\x98\x6d\x13\x05\x7d\x19\xe4\xe5\x26\xc9\xc4\xbc\xa8\x2b\x19\x88\x7e\x56\xe5\x49\x06\x94\x10\x6b\x95\xfc\x45\xf1\x8c\xdc\xe5\x99\x78\xab\xd6\x85\xfe\x60\xaa\xaf\xc1\x0f\x12\xe0\xe5\x2e\x93\x4f\x4a\x7c\x58\x27\x95\xa2\x44\xfc\x4e\x72\x3f\xb4\x59\x83\x9e\x31\x58\x1f\x30\x56\x3b\x3c\x3d\x6d\xca\x73\x73\x38\x80\xfd\x0c\x33\x0a\x88\xe1\x0b\x68\x42\x40\x7d\xb5\x06\x19\x81\xb8\x69\xa5\x1b\xd2\xbb\xcd\xbf\xac\xc9\xc1\x35\x9c\x64\xfd\x1b\xeb\xc3\x50\x57\xca\x22\x81\x88\xbe\xee\x3a\xa9\xac\xa4\x3b\x41\xde\xab\x43\xba\x6e\x0a\x4c\x78\x1e\xc2\x67\x57\x06\xcb\x47\xcf\x09\xdf\xca\xd6\xa0\xeb\x7a\xaa\x09\x98\xe1\xd7\x82\x9a\x90\x87\x5b\x67\x66\xd2\x32\x64\x0a\x39\x32\x55\x0b\x6e\x49\x7f\x86\x80\x1d\x41\x93\x1d\x04\xc3\x68\xd6\x65\x61\xd2\xde\xec\xa1\x77\xcb\xa7\xc1\x5d\xff\x5f\xc4\x54\xb9\xd0\x6f\x58\xd0\x86\x25\x8c\x80\x23\x79\x00\x3a\x13\xa5\x94\x25\x19\x28\xe5\x87\x68\x33\x58\x4f\x2b\xbd\xba\x89\xd2\x1b\xa0\xf4\x49\x30\x7e\xd0\xf4\xa5\x50\x69\x55\x49\xca\x9f\xf1\x47\x76\x77\x2b\xc9\xc4\x22\xc9\x00\x26\x2a\x2f\x36\xe2\x60\x99\x6f\xb6\x49\xaa\xe2\x07\x20\x27\x13\x55\x9a\x5e\x12\xe2\xd5\xaf\xdd\x51\xdd\xa5\xd8\x65\x7d\x14\x44\xf7\xe2\x17\x1a\x38\x27\xc8\xf8\x31\xdd\xa1\x85\xa2\x6f\x15\x38\xbf\x3d\xb2\xb8\x33\xa5\x18\x37\xc5\xc3\x92\x44\x74\x03\xd8\x4a\x84\x57\x66\xc1\xf5\xf3\xad\x0b\xe4\x57\xb2\xaa\x98\xc5\x42\xa2\x43\xbb\x50\xb7\xb2\x88\x4d\x86\x0b\x7d\x3f\x31\xf9\x10\xf6\x4d\xdf\x80\x57\xb6\xa8\xea\x2d\x15\xb1\x13\x9e\x5f\x9e\x2a\x5f\xa1\xa7\x4b\x89\xe6\x07\xb3\xfc\x9a\xc0\x8b\xd2\xc2\xbb\x5e\x67\x7f\x4e\xb6\xb3\xf3\x3f\xf1\xba\x1e\xd8\xd3\x31\x3b\xff\xd3\x87\xe4\x6f\x87\x3e\x8e\x61\xa9\xd2\xd5\x11\xa7\x40\x66\xb7\x8c\xa9\xfb\xbd\xc9\x4a\xb2\xf4\xf3\x2c\xa1\xa0\x45\xcf\x44\x36\xb7\xa4\x2c\x3d\x0c\xb2\x4c\x5f\x41\xa9\x80\xee\x60\xa5\xbe\x07\x17\xdf\x4a\x57\xa4\x3e\x23\xd4\xba\x9e\xa5\x98\xf6\x6d\x5f\x1f\x5c\x15\x43\xae\xb4\xde\x25\x47\x47\x66\x58\x41\x07\x8d\x2f\xa2\x51\x83\xeb\x20\x53\xf7\x9c\x38\xa8\xaf\x67\xa8\x12\x29\x03\xac\xf1\xd7\x9f\xe0\x17\x61\x0f\xe9\xaf\x02\xb8\x1e\xd4\x8d\x40\x9d\xfc\x4a\x42\xf5\x30\xbf\x96\xd1\x08\x08\xd8\x57\x0b\xa2\x18\x36\x11\x61\xac\x49\x2d\xeb\x28\xd2\xba\xcb\xe4\x26\x59\x06\x08\x26\x81\x88\xf8\x00\xf2\xbc\x34\x38\x8d\xa6\x55\x70\xb0\xeb\x39\x60\xf9\x7d\x74\x44\x30\xea\x62\x9b\x22\x90\x0e\x40\xac\x83\xbe\x81\x38\xc7\x59\x6c\x3d\x0c\x0b\x25\x36\x49\x69\x4c\x6e\xfc\xda\x42\x71\xbc\xd3\xd4\x00\x30\x0a\x6b\x01\x68\xf7\x30\xd7\x09\xc1\x65\xe0\xa1\x37\xeb\xd0\x78\x24\x14\x33\x78\x69\x63\x11\x08\x57\xfd\x33\xba\x61\xee\x25\xac\xa3\x56\x4f\xaf\x5f\x2a\x17\x0a\x4a\xf1\xe8\x4e\x69\xbd\xdb\x9c\x7a\xcc\x3b\x76\xd4\xb3\x03\xba\x1f\x00\x30\xb0\xf2\x48\x15\x9f\x78\xa9\x2d\x60\x58\x52\xe5\x17\x82\x31\x97\x87\x81\xe8\x5d\xe5\xcb\x4f\xaa\xc2\xf3\x15\xf4\x44\xef\x43\xf2\xe7\x9e\x5e\xd4\xde\xa5\x5c\xfe\x39\xd9\xda\x0b\x1c\xcf\x39\x86\xe3\x1d\xb4\x3a\x3d\x12\xab\x93\x3e\x30\xa1\x85\x45\x05\x61\x6a\x43\x5e\x17\x77\x6e\x81\xef\xc1\xc5\xae\xf9\x73\xb2\x3d\x7a\x5b\xdf\x82\x7e\x60\x26\x5b\x1d\x6d\x64\x92\xea\x2d\xaa\x55\x07\x03\x07\x65\xbf\x70\x3d\xbd\x38\xd0\x63\x63\xe8\x6c\xe0\x21\xdf\xa6\x3b\xfb\x0d\x28\x94\x67\xbc\x12\x86\x6a\xe5\x80\x5c\xb3\xfb\x74\x56\x9d\xc5\x46\xd2\x8f\xaa\x49\xc3\xd1\xb1\x6c\x7a\x46\x69\x62\xcd\x0c\xb3\x28\xa3\xd9\xd6\xff\x6b\x2e\x02\xfd\x8e\xbf\xe9\x43\x61\x56\x63\x45\x2a\x50\x7e\x6f\xc0\x03\x20\xb2\x89\x12\x86\xf7\xe1\xde\x12\xff\xa3\xfd\x84\xcf\x6f\xb3\xfa\xe8\x2f\xf2\x4e\xea\xcd\x7d\x64\xae\xca\x5f\xd3\x1b\xf0\x84\xfd\x7f\xfc\xf2\xf4\x65\xc3\xfe\x7f\x79\x76\x7c\xb2\xb7\xff\xbf\xc6\x0f\x94\xcc\xb1\x55\x62\x56\x9f\xf9\x5b\x00\x7b\x95\x75\x12\xbc\x65\x1d\xb8\x27\x04\x46\x46\xb0\x37\xd0\x5d\xa5\x8b\x08\x1e\xf8\xcf\x19\x87\xf3\x62\x47\x58\xa8\xc2\x20\x63\x38\x05\x9c\x2e\xd6\x7d\xb3\x08\x5f\x7f\xf3\xdd\xf8\xda\x44\x45\x7d\xba\x2a\x1b\xa0\x21\x65\xcf\xbc\x91\xa3\x5d\x14\x62\x40\x56\x52\xc3\xc5\x0f\x98\xdc\x5a\x51\xdd\x35\x54\x4a\x64\x92\xd8\x80\xa4\xfd\xa2\x8e\xfc\x91\x84\x60\xf8\x5c\xdf\xd2\x5a\x1d\xfa\xdd\xfc\x7f\xc7\x27\x67\xaf\x9b\xfe\xbf\x97\x27\x2f\xf6\xe7\xff\x6b\xfc\x10\xcb\x0e\x53\x29\xc5\x39\x02\x2b\xe8\xdf\xef\x65\x46\x64\x17\x49\x45\x6c\x35\x23\x51\xa8\x55\xcd\x10\x82\x40\x0c\x60\x42\x99\xac\xc6\x18\xbf\xc6\x52\x95\x7f\xa4\x93\xf0\x8f\xf9\x13\x3e\x67\x76\xbd\xa3\x93\xf0\xf8\x68\x99\x7e\xfb\xeb\xcb\x81\x27\xf8\x1f\x4f\x8f\x5f\x9d\x36\xce\xff\xd9\x8b\xd7\x67\xfb\xf3\xff\x35\x7e\xe6\x6b\x25\x9a\xfc\x8a\x3e\xac\xef\x9e\xe4\x70\x4f\x72\xb8\x27\x39\xdc\x93\x1c\xee\x49\x0e\xf7\x24\x87\x7b\x92\xc3\x3d\xc9\xe1\x7f\x46\x92\xc3\x55\xb5\xdd\x53\x1c\xee\x29\x0e\xf7\x14\x87\x7b\x8a\xc3\x3d\xc5\xe1\x9e\xe2\x70\x4f\x71\xf8\x0f\x4a\x71\xa8\x07\xab\x8a\xf4\x97\x53\x1d\x7e\x09\x67\x1e\xf1\xfb\xf5\xa9\x67\x0f\x69\xec\x94\x3c\x43\x79\x58\xde\xf6\x48\x4a\x21\xd3\x7b\xb9\x73\xb3\x4a\xfc\x2d\xe3\xe4\x8f\xf9\xfb\xb9\x14\x6a\xb3\x50\x71\xac\x62\x93\x9a\x12\xa0\x02\x99\xe5\xe0\x4e\xa9\x84\xac\x2a\xb5\xd9\x82\xa3\x67\x23\x63\xe5\x43\xe6\x52\x43\xdf\x94\x4e\x62\x87\xb8\x4b\x0c\xfd\x0c\xd6\x4d\x00\x3c\xb5\xa9\xbd\x78\x60\x18\x14\xbd\x07\x92\xc2\xe6\xf4\x55\x45\x8d\xfb\x4e\x3e\x2e\x3a\xf6\xb4\x7a\x7b\x5a\xbd\xfd\xcf\x2f\xf8\x09\x9f\x5f\x5e\xfd\xc6\xf4\x7f\x4f\xf8\xff\x5f\x9c\x9d\x9d\x35\xfd\xff\x27\xaf\x5e\xed\xe3\xff\x5f\xe5\xe7\x72\xf2\xe7\xd1\xc5\x45\x5f\x5c\x5d\xbf\xbd\x18\x0d\xc4\xc5\x68\x10\x8d\x67\xd1\x33\xd6\x7e\x4f\xc2\x63\x72\x51\x39\x5e\x69\xd6\x22\x4f\xc2\x93\x50\xf4\x06\x36\x29\x9a\x5d\x74\x60\xdf\x69\x15\x97\x6b\x5e\x99\xd1\x82\xd0\xa7\x50\xc3\xb2\xbe\x6c\xfd\x57\x92\xea\x97\x5d\x7a\xfd\x49\x78\xea\xbf\xc8\x7a\x9a\xd9\x43\xa7\x88\xa5\xca\x03\x34\x9c\xb0\xd3\x6a\x90\xc7\x2a\x20\x09\xed\xbd\x41\x98\x9a\x54\xe1\x34\x1f\x98\xa4\x64\xff\xcb\x70\x0d\x2e\x68\x4c\x50\xf8\xb7\x04\x38\x5a\xe7\x51\xdb\xe5\x33\xe8\x32\xe6\x0c\xe8\xf7\xbb\x7d\xf5\x3a\x26\x5a\x9d\x32\x91\xd4\xc7\x47\x04\xbd\xf4\x9e\x0c\xac\xa3\x48\x96\xca\xc9\xe4\xd6\x0a\x33\x7b\x20\x0b\x95\xaf\x6c\x37\x5f\x84\xa2\x17\x59\xc0\xee\xa1\x7b\xcb\x5e\xaa\xe5\x5a\x66\x49\xb9\xe1\xbe\x4b\xb1\xe1\x8f\x48\x15\x63\xf4\xef\xad\x03\x2f\x63\x75\x59\x27\x1a\x63\xfd\xc0\xec\xa9\x75\x60\xc2\xab\x42\x66\xe5\x0a\x35\x05\xe4\x6b\xe3\xee\xbd\xd4\xdd\x33\xd6\x15\xf7\xc3\x9d\x57\xf6\xa9\xa1\x2b\x94\x40\xcf\x64\x26\x66\x68\x41\xea\xaf\xd8\xe6\x5e\x85\xa2\x37\xd2\xdb\x58\xa6\x62\x88\xbd\x53\x85\xbb\x32\xb6\xd2\x04\x8b\x4a\x61\x0f\xb7\x61\x6d\x5a\x6d\x18\xa7\x8f\x7d\x2b\xfb\xee\x8c\x2f\x7d\xb1\x13\xd1\xcf\x90\x84\x28\xfa\xb6\x4b\xaf\x43\xd1\xbb\x40\xd3\x00\x31\x9a\x79\xaa\x01\x59\x83\xe8\x21\x90\x81\xad\x31\x70\xad\xb1\x34\xd6\x15\x35\xc6\x25\xbd\x5d\xdc\xea\xaf\x67\x36\x1c\xe4\x57\xbf\x9a\x7c\x15\xee\xca\xb7\xba\x2b\xcc\xd8\xe3\xa0\x81\xc7\x6e\x99\x2c\x7c\xf3\x4d\x28\x7a\xde\xce\x33\xdd\xd6\x96\x37\xa5\x8a\x93\xf9\x10\xab\x54\xc1\xaf\xc6\x68\x20\xc8\x57\xe4\x8c\x30\x70\xbc\x50\xdc\x9f\x30\x6a\x5d\xfb\x8c\x60\x39\xb1\xba\x4b\xf2\xba\x6c\xc8\x09\xf1\x41\x6b\xae\xfe\xae\x28\x39\x2b\x91\xf4\xc7\x52\x15\xe4\x3f\x27\x27\x88\xf4\x1a\x71\xa0\x9d\x85\x10\x7d\x04\xfe\x78\x72\x24\x2e\xfc\xbf\x44\xaf\x2c\xc1\x4e\x02\xc5\x63\x73\x08\x0f\x74\xdf\xbe\xf7\x2d\xbe\x37\x53\xf7\xd8\x18\x85\xe6\x28\x12\x8a\x50\x1e\xb6\x0e\xfb\x0b\xdb\x3f\x09\xb5\x1a\xda\xf3\x9e\xe2\x75\x73\xf7\x2d\x14\x10\x10\x86\xac\x39\xcb\xb0\xa7\x0c\x8e\x72\xac\xb4\x19\xb9\x70\x78\x2f\x3f\x73\xdf\xeb\xb5\x68\x88\x65\x74\x5d\x27\xcb\x75\x20\xc8\x62\xe1\x90\x55\x52\x99\x45\x74\x6b\x4b\x99\x84\x96\x31\x56\xd2\x42\xc9\x78\xe7\x2f\xbf\xbf\xf3\xbb\x36\xfb\x89\xbe\xbc\x9c\x6e\xbb\x52\x60\x0b\x01\x4c\xa2\xd2\xd8\x58\x6b\xc2\x79\xc1\x0a\x90\x7c\x90\x35\xa7\xe9\xab\x4e\x2a\xb7\x8a\x06\x31\xa2\xe2\x5a\x9b\xd8\x89\x5d\x4d\x8a\x0c\xc3\x81\xb1\xd1\x13\x63\x4d\x39\xc5\x1e\xbc\x61\xd9\x72\x67\xcb\x85\xa3\xdf\x98\x70\x6e\xa1\xdf\x92\xac\xac\x64\x9a\x3a\x38\x68\x0e\xb7\x3a\x56\x43\x9b\x4a\x11\xb7\x8a\xc6\xe4\x6b\x23\xf3\xc4\x66\x2b\x8b\x04\x72\xe3\xe4\xad\xee\x70\xf5\xc4\xe9\x44\xd9\x0b\x4c\x05\x00\x3c\x16\x38\x90\x3c\xbe\xdc\xe2\xe9\x34\xb7\xe6\x37\xa5\x58\xae\xf3\x84\x49\x15\xdd\xcd\x44\xcc\x38\x10\x6a\xd7\x7d\x82\xdc\x6b\xac\x15\x00\x4f\xbe\x4c\xdb\x4e\x55\x85\x7c\xad\xdb\x42\xcf\xa9\x88\x15\x3f\x47\x5e\xf3\x58\x1d\xe1\xb3\xc8\xb7\x65\xab\xc8\xee\x93\x58\xe9\xfb\xcc\x74\x7b\x05\x00\x14\xe4\x4c\x72\xb6\x8e\x56\x47\x20\x12\xcc\x42\xaf\x71\x6f\x48\x62\x34\xa0\xfb\x83\x60\xdb\x9a\x30\xf8\xe4\x17\xcc\x37\x5b\xa4\xab\x45\x6b\xdf\xc6\xdc\x58\x5a\x07\xfe\xb6\x87\xf6\x09\xb8\xf1\xae\x11\xea\xb3\x47\xa3\xac\x4d\x41\xb6\x45\xc0\x3a\x41\xd0\x2b\xa7\x73\x50\xb1\x40\x51\x6d\x53\xee\x9d\xed\xb8\xe7\x7c\xfd\xc0\x46\x2b\x03\x86\xd5\x2d\x72\xa0\x12\x5e\xec\x60\x37\x25\x96\xa7\x65\xb3\xc9\x33\xb3\x2f\x61\x3c\x37\x79\x8d\x2f\x6d\x55\x86\xba\xd5\x4c\x3d\x7a\x86\x67\xf4\x40\x1e\xe2\x41\xcc\xef\xf5\x3c\x11\x92\x05\x71\x2a\x63\x59\x9d\x3e\x00\x26\x81\x14\x3f\xa4\xf5\xdd\xc8\x4c\xda\x8a\x7d\x88\xf1\xe0\x70\x3c\xc8\x12\x03\xcc\xe4\xc6\xaa\x60\x3c\x07\x8b\x43\x91\xdf\x67\xaa\x00\x5c\x22\xb8\x30\x56\xd5\x4e\x9b\xf4\x4b\xdd\xe6\xc1\xcb\xe3\x7f\x3a\x84\xf7\xe4\x85\xd9\xcc\x79\x5d\x31\x7a\x03\x96\xa8\x80\x16\x87\xc0\xba\x58\xf1\xe7\x36\xe8\xf4\x89\x63\xa4\xee\x9e\x6f\xc8\x2a\xa0\x29\x98\x77\x6a\x1d\xef\x0a\x69\xaf\xe5\xee\xaf\x68\xc5\x60\xb1\x63\xc0\x45\x07\x6d\xf1\xe8\x49\xb8\x45\x5b\x88\xe4\x15\xf1\x25\x05\x3a\xb4\x76\x0f\xf0\x95\x21\xaa\x9b\x73\x9b\xc2\x6a\xe6\x08\xd0\x60\x2a\xdd\x2c\x89\x77\x9c\x94\xdb\x14\x22\xa2\xaa\xc0\xb3\xec\xb0\x58\x74\xa4\xdf\xf8\xb2\xe7\xa0\x43\x0d\x3a\x24\x1f\x6d\x61\xdc\x34\x0d\x35\x19\x69\x7a\xad\x6f\xd6\x51\xc0\x5c\x90\x38\xdd\xf7\xc5\x21\xed\x6e\x06\xd1\xca\xf2\x7b\x48\x55\x51\x85\x92\x2b\x7d\x47\xea\xa5\x35\xc8\xba\xe6\x68\xb4\x97\x22\x60\x17\x1a\xb1\x77\x6b\x73\x22\x30\x39\x46\xa5\x16\x9c\x07\xbd\xeb\x2a\x49\x93\xbf\xa9\xde\xe1\xe7\x0e\x15\x7d\xa5\x65\x9e\x2a\x9b\x7e\x41\xe0\x2e\xa0\x3d\x00\xfc\x8d\xde\x6f\xd8\x7f\x54\x8c\xc8\x49\xdf\x60\x1f\x21\xe2\xc9\x1b\x64\x5c\xa7\x9e\x7c\xf6\x94\xeb\x41\x30\x38\x5e\xa6\x37\x9c\x02\x08\x75\xb7\x2f\xe4\x8c\xf5\x5e\xca\xaf\xe1\x42\x9d\x96\x29\xe4\x98\x41\xa5\x3d\x12\xa7\xa1\x7b\x81\xf8\x07\x21\xd2\x16\x90\xfb\xd7\xff\x7c\x67\xc0\x9f\x25\x4e\xd4\x5a\xd0\x52\xbb\x63\xef\x5e\x2c\x26\x80\xd1\x1a\x83\xa8\x33\x13\x79\x86\xbc\xa2\xc0\x0d\x71\x34\x4e\x8e\x6c\x1b\x21\xbf\xf9\x49\xf2\x4c\xf3\xc6\xce\xec\xf0\x0a\xfc\x8e\xe7\xe4\x0b\x7a\xf3\xd5\x8e\xcb\x59\xe8\x5b\xf5\x13\x8b\x7c\xc8\x07\xe6\x4c\xdf\x30\x7d\x5b\xe2\xad\x97\xb2\x71\x09\xcd\x5b\x9b\x0e\x75\x03\x3d\x09\x44\xe6\x8f\xc0\xae\xce\xc7\xc6\xd5\x03\x95\x78\x9f\x65\x8c\xba\x8a\x33\xcb\x6e\x07\x9e\x87\x55\x19\x38\xff\x4d\x55\xd1\x51\x86\xbc\x2d\x4a\xd3\xe8\xa6\x47\x42\x62\xc5\x43\xa4\x46\x5f\xa2\x68\x19\x1b\xb3\xa5\x6a\x05\x06\x13\x19\x92\x25\x38\x5f\xa4\x41\x49\xce\xed\xc0\x81\x03\x9a\x51\xe7\xef\xfe\xf0\x74\x53\x76\x0c\x7e\xb8\x13\x78\x9a\x08\xcd\x20\xa7\xfc\x7c\x1a\x14\x7a\x47\xba\xe6\x09\xb7\x7d\x5a\x41\x16\x6c\x61\xd2\xc2\x4a\xd6\xa0\x19\x28\xe8\xa1\xb1\x93\x1f\xc7\x66\xc6\x7d\x63\xf8\x16\x55\xa1\x60\x42\x9c\x10\x2b\x77\xd7\x4c\x44\xe6\x82\x02\x99\xb4\x62\x18\x09\xc7\xc6\xdb\xa8\x41\x9e\xe1\x69\x91\x56\x5f\xda\x9d\x7c\x1a\x72\x7e\x91\x41\x02\xeb\x70\x05\x69\x2b\xdb\x33\xff\xbf\x64\x37\x73\x35\x31\xf8\x03\x3d\xfe\x35\x77\x9a\xc1\x74\x7c\x6a\x8f\x59\x39\x6c\xf2\x05\x09\xd3\xb9\xf4\xed\x36\xbb\x0a\x85\xb8\x03\xcc\x67\xeb\x77\x7b\xd2\x7f\xe7\x63\x40\xdc\xaf\xf3\x0d\x45\xbc\x71\x1d\x3a\xde\x62\x46\x45\xb4\x66\xab\xe6\x60\x75\x1f\x9e\x7c\x6f\xc0\xe8\x06\xc8\x86\xe5\xd9\x55\x26\xdf\xa5\xba\x57\xe9\x9d\x12\x07\x27\xa7\x87\x62\x93\x67\xd5\xba\x14\x78\x1b\x54\x48\x99\x44\x8c\x68\xa0\x4c\xa5\x3b\x20\x57\xdd\x38\x3d\x41\x65\x8e\x1b\x2b\x93\x9f\xc5\xc1\xab\x46\x43\x48\x32\x84\x60\x1b\xfe\x6e\xf6\xfd\xb8\xde\x86\xb0\xa9\xc8\xfe\xc0\x39\xa9\xd9\x6e\x7b\x3c\x8a\x48\x54\x41\x25\x31\x34\x46\xa0\x23\xc5\xcd\x4c\xae\x8d\xae\x73\x88\xd3\xe3\x32\xf9\xb9\x98\x82\x4f\x2f\x2e\x04\x68\x13\x26\x3b\x01\x67\xb6\xa3\xa0\xd8\x93\xa1\x2f\x02\x85\x4e\x84\xc7\xbc\xed\x46\x64\xa1\x79\xa5\x0d\x52\x4f\x9c\x9a\x53\xb1\xf3\x4f\x05\x79\x24\x60\xa5\xd1\x7b\xd5\x4c\x75\xc1\xbc\xc4\x92\x44\x01\x36\x45\xa7\x0d\x26\xc8\x7b\x0d\xbb\xe0\x61\x07\x10\x78\x0b\x36\x10\x76\x49\x55\x9b\x32\x69\xd1\x79\xcd\xac\x37\x1c\x7d\x1c\xd7\x65\xc3\x32\xdd\xb9\xa6\x65\xba\x0b\xd0\xc1\xe7\x2b\xbd\x4d\xa8\xd4\xb6\xa5\x65\xe9\x08\x4c\x92\x90\x13\x8b\xee\x74\x19\xb3\x9d\xeb\x6c\x0b\xbc\x37\xb4\xb2\x44\x8e\x6d\x9b\x02\xfa\xa0\x40\x60\xaa\xd3\x06\x32\x87\x2b\xd5\x58\x70\x3a\xd9\xbc\x60\xf9\xba\x66\x69\xd3\xc9\x65\xb7\xce\x8b\x50\x8c\x5c\x3d\xf7\x8a\xf5\xdc\x4b\x59\x55\xc4\xa6\x67\xf5\xdc\x39\xec\xbe\x2b\x50\x8f\x07\xc4\x7b\x6f\xbe\x30\x5a\x41\x7f\xc0\x02\xfa\x94\xe5\xf7\xa9\x8a\x6f\x69\xfd\x25\xa9\xd4\x86\x55\xf2\x31\x42\x6c\xc6\x79\xa1\xb3\xeb\x61\x46\xa0\x1e\x44\x96\x4a\x52\x95\x02\x28\xc8\x30\x4f\xb2\xc3\x93\x78\x48\x09\x40\xfe\x8e\xaa\xd4\xcf\x98\x3d\x6b\xd3\xa0\x7c\x6f\x99\x73\x18\x01\xd6\x36\x16\xbd\x8b\xe8\x5d\xff\xa2\x47\xd3\xce\x53\x4e\xf1\x29\x3d\x28\xb3\xab\x71\xa0\xe4\x40\xb4\x7f\x86\xb4\xe4\xd5\x2a\x59\x26\xc8\x9f\x5c\xc9\x24\xe5\xb9\x31\x02\x07\x33\xf5\xf5\xdc\xa1\x28\xe7\x83\xb7\xac\x00\x05\x50\x0f\x25\x5f\xc0\x39\x04\x41\x65\x27\x19\xa5\x21\x9e\xbe\x4f\xa0\x50\x34\x64\x9e\x95\x40\xf2\xc1\xab\xf6\x14\xaf\x72\x4c\xd5\xd0\xa7\x6e\xab\xcf\x0f\x65\x3e\xeb\x91\xc0\x1c\xe0\xc4\x11\x4b\x01\xa5\xae\x9b\x17\x3b\xc2\xd4\xea\xfe\x60\x03\x43\xa3\x95\x4d\x4d\x2b\x2b\xb5\x2d\xc5\x01\xe7\xe9\xea\xa3\x80\xa4\x9a\xae\x83\x6f\x23\x13\xc8\xdf\x4f\x93\x12\xe1\x32\x33\x75\x5f\xde\x16\x79\xbd\x2d\x0f\x5d\x1d\x7e\x29\x53\xbd\x57\x08\x13\x09\x99\xa4\x44\xb5\xce\x81\x4d\x3a\xb7\x79\xf9\x2d\x5f\x2f\x96\x1c\xa8\x7b\x67\x2a\xcd\xed\x80\x33\x6d\x09\xda\xc8\xd0\x71\x0d\x81\xfe\xd5\xa8\x7d\x00\x8a\x96\x50\x22\x66\x3b\xfe\x84\x32\xab\x36\x7a\x64\xd6\x2b\xcc\x3a\x25\x13\x3b\x90\xab\x8d\x2d\x2a\xaa\xb9\x2a\xd4\x83\xb6\x4b\xb2\xd9\xa6\x8e\x74\xec\x5f\x8d\x9c\xcd\xdf\x20\x36\x04\xa0\x9d\x16\x4d\x97\x5d\x5f\x2b\x1f\x5e\x86\x62\xca\xee\xfe\x31\xd6\x05\xb4\xae\x13\x5b\x57\x80\xf9\x93\x2c\xd5\x6c\x6c\x80\x83\x97\xb0\x77\xda\x1a\xb0\x03\x74\x64\xfc\x9c\x28\x22\x7d\xb9\xc7\x01\x46\xef\x51\xcc\x8d\xf4\x24\x61\x87\xe2\x0a\x82\x34\xc1\xa4\x33\x4f\x12\xb2\xd8\x62\x4b\x1b\x98\xc7\xc9\x05\xe8\x2e\x24\x00\x80\x98\x7a\x87\x38\xc6\x14\x3c\x4c\xc7\x2e\xfd\x28\x33\x1b\xa1\x34\x13\xde\x71\xb3\x71\x42\xfd\xe2\xa4\x6a\xd2\x30\x40\xd5\xbd\x36\x67\x6b\xc8\xa4\x36\x17\x84\x2b\x11\x3d\x5d\x14\xae\xe3\x5a\x61\x74\xa2\x74\x39\x30\x2b\xae\x1a\xf0\xc4\x5f\xab\xe1\x34\xa7\x7d\x69\x0e\xa3\xb4\xb0\xa1\x78\x71\xe6\x94\x49\x78\x68\x50\x9f\x20\xfb\xeb\x9e\x29\xdd\x2d\x69\x67\x9a\xe7\x9f\x28\x97\x13\x6a\x30\xf0\x45\x6e\x02\x28\x64\x7b\x56\x39\x9a\x03\x96\x07\xae\x91\xd5\x19\x18\x78\xb7\x80\xd3\x42\x91\x58\x7b\x93\xd1\x2d\x60\x51\x94\x1d\xc0\x7f\x68\xd8\x59\x40\xbf\xb6\xc7\x5f\xf7\x96\xfd\x12\xe7\x58\x35\x95\x42\x2d\xd6\x0d\x65\x58\x8a\x85\x5a\xcb\x74\x65\xcd\xfa\x9c\x3f\x7a\xf8\xfe\xa7\x98\xa6\x9b\x3d\x60\x4f\x0b\x08\xca\xa4\x12\x72\x51\xe6\x69\x5d\xe9\x89\x43\x14\x79\x08\x6e\x1b\x67\xc5\x2f\x19\xbf\x48\x2c\x13\x37\x61\x77\xcb\x34\xcf\x94\xb5\x58\xc9\x5f\x86\x64\x3e\x20\x2b\xa1\xc9\xd5\x63\x9a\x0f\x1a\xaf\xee\xfe\xe6\xa4\x5f\x0f\xab\xbb\x2e\x8a\xc7\x74\x28\xde\x13\x6e\x3b\xb4\xd7\x10\x2b\x7f\xf5\x05\x43\x46\x93\x0b\xc4\xa5\x1e\xae\x15\x57\xaf\x1a\x2e\x91\x7c\xe5\x2a\x56\x3f\xb9\x00\x3c\x2c\xc1\xfc\xe4\xe0\x66\x02\x42\xe4\xa7\xf8\xe3\xf6\x48\x18\x83\x1a\x04\xa3\x21\x39\x76\xd8\xc1\x8e\xce\xc2\x97\xa8\x09\xa1\xa5\xa1\x18\x0d\xa8\xa1\x0c\x07\x6c\x84\xdd\x40\x95\x10\x6b\x28\x74\x3e\xb9\x0e\xe8\x51\x23\xa3\x2b\x86\x99\xb8\x36\xc7\x13\x96\xaa\x17\xd1\x24\x61\x65\xec\x08\xa7\x02\x89\x84\x2c\x0c\x6a\x55\xa7\xab\x04\x9c\x78\xa0\x74\x3a\x07\xd0\x9b\x06\x72\xe5\xd0\x68\xd8\xb8\x5e\xe6\x59\xb9\x4d\x96\x75\x5e\x97\x96\x85\x29\xfe\x4c\xa5\x38\x78\x40\x25\x86\x2b\x33\x05\x6e\x4f\xc0\x24\xeb\x52\x90\x9f\xb8\x16\x5a\x4a\xf2\x43\x15\x22\x5d\xaa\x7a\xc3\x33\x45\x98\xcc\x16\x10\x8f\x54\x03\x0c\x86\x9a\x62\x1b\xb9\x33\x96\x15\xae\x8d\x45\xd6\xb2\x99\xa9\x66\x9d\xfc\x0c\x60\x36\x4d\x93\x0c\x23\x8d\x89\x5f\x47\xdb\xed\x95\xf0\x68\x10\xb9\x73\x7c\xad\x76\x8c\xcb\xa2\x89\x53\xce\xb0\x96\xf1\xc9\x26\xc1\x7a\xad\x94\x8d\x79\x33\xb3\xdf\x94\x0d\x62\xc3\xae\x1d\x6b\x92\x2c\xe8\xab\x25\x9e\x0e\xa8\x7b\xf0\x63\xfa\x7c\x39\x3f\xbd\x00\x3c\xe1\x76\x02\x79\x74\x9f\x25\x78\x2b\xc7\xb1\x46\x3a\x3e\x34\xd4\x5e\x06\x98\xf3\x6e\x21\x4b\x20\x38\x5f\x76\x27\xfc\x87\x96\xc8\xe6\x36\x7a\x50\xe0\xbe\x0e\xdd\xc0\x40\x4b\xb2\x92\x13\xc0\x8b\x1e\x60\x8c\x76\xb3\xc0\x54\x1a\xef\xd8\x38\xd1\x89\x2f\x4b\x75\xea\x8a\xa4\xb8\xaf\xc4\x44\xa1\x24\xbb\x4d\x4d\x12\x38\xe0\xc2\x92\x9a\xb2\x04\x90\x5f\x7f\xa7\x94\x75\xa1\x3a\xc5\x7c\x6b\x37\x58\x69\xc8\x27\xa9\x65\x6b\x83\x99\xed\x60\xbc\x0e\x20\x37\x40\x0c\x51\x71\x9b\x55\xb2\xaa\xd1\x33\x39\x55\xb7\x75\x6a\xcb\xfe\x8c\x8e\x08\xee\x5f\xeb\x7f\xa2\x08\x05\xa6\x18\x50\x7e\x41\xb6\xeb\xe6\x42\xf0\x3c\xd1\x0e\xb7\x00\xc0\x2f\xe4\x85\x9b\x98\xe0\x2d\x06\x69\x95\xa5\xed\x5c\x61\x3a\x87\xca\x25\x4f\xd8\x77\xe0\x1c\x70\x3b\xf3\x70\x2f\x48\xd0\x6e\xe4\xcf\xc9\xa6\xde\x34\x29\xc0\xbe\x37\x3e\x12\xcf\xad\x61\x03\x05\xa5\x31\xb4\x97\x68\xc0\xa9\x1d\x31\x1d\x50\xb5\x81\x7b\x81\xf1\x8d\xe3\xa3\xd1\x7b\x86\xec\x03\xb6\xf0\x0b\x8b\x1c\xe9\x3e\x6f\x12\x39\x5a\xa0\xb5\x0d\x59\x17\x8a\x08\xe0\xaa\x1a\xf1\x28\x07\xab\x70\xb1\xeb\x9e\x59\xaa\x9c\xed\x1a\x86\x75\x20\xa4\x3b\x72\x21\xd0\x9e\x73\x7d\x08\x80\x28\x1c\x23\x7c\x5f\xf9\x29\xd1\x66\x37\x14\x73\xb2\x8f\xd3\x12\x52\x70\x9d\xfa\xcb\x56\x88\xa8\x95\x58\x35\xf7\xf6\x3c\x11\xa4\xc0\x06\x74\xfd\x86\xdd\x72\x46\x5b\xd4\xb2\xaa\xe4\x72\x4d\xfa\x42\x87\x85\x68\x0c\x01\xbe\xdd\x5b\x27\xe8\x55\x68\xd4\x37\x9e\xef\x46\x20\x0b\xb2\x60\xc6\xea\xbe\xa5\xe6\x8d\x55\x55\x2e\xe5\x56\x31\xdd\x17\xc7\xb9\x06\x4e\xcd\xed\x41\x8f\xbf\xd5\x3b\x44\x6a\xeb\x7a\x91\x26\xa5\x3e\x30\xc8\xf1\x42\xe8\xba\x99\xba\xb7\x30\x94\x7e\x3f\xe8\xae\x48\x36\xb8\xc9\x93\x8d\xde\x05\xda\xea\xe5\x3b\xea\x9e\xaa\xd0\x6f\x93\x3b\x95\x51\xe1\x4b\x92\xdd\xd6\x49\xb9\xd6\x92\x90\xbf\x96\xd5\x9b\x85\x15\xb1\xaf\xb4\x16\x15\x21\xbb\x44\xbe\xea\x1c\xdf\x24\x5b\x36\x8e\xae\x71\x62\xd0\x28\x2c\x4b\x84\x6b\x47\x36\x34\x48\xa3\x67\x18\x2b\x17\x4b\x90\x90\x56\xb8\x36\x28\xd3\x1e\x10\x82\x73\xc8\xa5\x71\xc1\x3b\xc0\x00\x69\x99\x3b\x46\x1f\x94\x02\xe1\x9d\xd3\x52\x96\xbc\xd6\xf0\xe2\xe9\x76\xed\xdb\x09\xb7\xa3\x5b\xec\xcc\x2a\x87\x40\x39\x97\x29\x37\x65\xd8\xec\x80\xb5\x6c\x42\xb6\x58\xf7\x16\x11\x71\xd8\xf0\x58\xc3\x55\x60\x5c\x04\x6d\x3f\xa3\x5d\x2c\x70\xc5\x33\x08\x8b\x7f\x27\x92\x07\xcf\x46\xa1\xc0\x09\x6f\x6b\xc3\x1f\x8a\xc6\x1d\x58\xa7\x3c\x80\x12\x64\x50\x6b\xea\x11\x69\x10\xd7\x6b\x65\x8e\xa4\xc9\xe7\xfc\xe2\x3c\x4a\xd7\x65\xaa\xa5\x3a\x95\x9c\x83\xf6\xca\x2a\x15\x94\x98\x93\x12\xb9\x5d\x17\xb2\x54\xa5\xe8\x5d\xe6\x7f\x4b\xd2\x54\xf6\x02\xd1\xa3\xda\x83\xab\x0b\xfa\x05\xff\x61\x0e\x98\xfe\xf7\xd5\x45\x8f\x55\xa2\x65\x9e\xad\x80\xed\x3c\xdd\x89\x32\xd9\x24\x7a\x6b\x62\xab\xa6\xd6\x70\xbb\xd5\x7a\x9a\xcc\x76\x68\x87\x70\xd1\xbc\x9b\x46\x01\xb9\x5d\x3e\x32\x41\x52\xb9\x0a\x1e\x3c\xd1\xd8\x48\xdc\x80\x49\xc4\x7d\x58\x03\x54\x82\x06\xd8\x00\x05\x84\x97\x9b\xfd\xd5\x44\x2e\x3c\x38\x4f\xd2\x14\x1d\x7d\x4f\xc7\x0d\x82\x76\xf2\xa5\xab\x9b\x71\x13\x8f\x79\x95\x9c\x42\x3b\x7c\xcb\xa6\x54\xe9\x9d\x02\x50\xfb\x58\xa9\x8d\x62\x56\xa6\x06\x8c\x42\x43\xe4\x1f\x52\xe1\xe4\x70\x34\x1b\x5c\xf4\x47\x97\xd1\x54\x4c\xce\xb9\xd8\xec\x06\x36\xf4\x60\xf2\x53\x34\x8d\x86\x62\x30\x19\xfa\x45\x6f\xd7\xe3\x61\x34\xc5\x9a\x38\x2a\x3a\x11\x93\xb1\xe8\x8f\x4d\x35\xdc\xdb\xfe\x6c\x34\xb3\xa5\x6d\xdc\xaa\x7e\x43\x7f\x7c\x23\x7e\x1c\x8d\x87\x81\x88\x46\xf3\xf7\xd1\x94\x2b\xe5\xa2\xa1\x53\x2b\xf7\x64\x81\x9c\x53\x14\x37\x7f\xdf\x9f\x43\xc1\x5c\xb3\xbb\xe7\xd3\x28\xd2\x6f\x1c\x46\xe7\xd1\x60\x3e\x0b\x4c\xed\x5c\xff\xed\x45\x14\x88\xf3\xd1\xfc\xc1\x8a\x39\xdd\x95\xf1\x64\x7c\x34\x1a\x9f\x4f\x47\xe3\x77\xa3\xf1\xbb\x10\x5e\x11\x8d\xe7\xa3\x69\x24\xa6\xa3\xd9\x8f\xa2\x3f\x13\xf3\x09\x7c\xfa\xaf\xd7\x7d\x53\x8b\x77\x15\x4d\xcf\x27\xd3\xcb\xfe\x78\x00\xef\xee\xea\x97\x1e\x8f\xb8\x99\x5c\x87\x62\xf6\x7e\x72\x7d\x31\x84\x29\xf1\xbe\xa4\x27\x3a\xa2\x7e\x8f\x7e\x8a\xc4\x68\x0c\xdf\x99\x46\xb3\xab\x68\x30\x0f\xf4\xc3\xe2\x60\x3c\xc1\x61\x8f\xc6\xa3\xf9\xa8\x7f\x21\x86\xd1\x4f\xd1\xc5\xe4\x4a\xaf\xe3\x14\xbe\x3e\x81\xe9\x1d\x4c\xc6\xf3\xe9\xe8\xed\xf5\x7c\x32\x3d\x14\xfd\xd9\xec\xfa\x32\xa2\x5e\xcd\xe6\xbc\x1e\xe3\x68\x10\xcd\x66\xfd\xe9\x8d\x98\x45\xd3\x9f\x46\x03\x98\xf6\x69\x74\xd5\x1f\x41\x63\x83\xc9\x74\xaa\x7b\x32\x19\x53\x21\x64\xf7\x9e\xd1\xaf\x9a\xcd\x47\xf3\xeb\x79\x34\xd3\x9b\x41\x2f\xea\x18\xba\xa6\x27\x18\x67\xc3\xee\x98\x50\x8c\x27\xe2\x7a\x16\x71\x1f\x9a\xb3\xd4\xbf\x9e\xbf\x9f\x4c\x47\x7f\x8e\x86\xe2\x7d\x34\x8d\x70\xcb\x45\x7f\x1a\x44\x57\x73\x77\xff\xd9\xae\x50\x49\xae\x98\x47\xd3\xcb\xd1\x18\xf6\x49\x87\x5e\x43\x9a\x25\x99\xa5\x4c\xb3\x60\x72\x1e\xf0\x02\xd7\x22\x22\xc9\xc0\xaa\xf1\x4a\xa0\xc9\x89\xb3\x82\xc0\x8e\xaf\x9a\xa3\x54\xd1\xed\x24\x98\xc8\x6d\xbe\xa4\x6d\x0c\xb8\x10\x17\x05\x38\xc8\x09\x12\xe4\xec\x58\xc4\xfa\xea\xcd\x57\x62\xa1\x96\x39\x84\x0a\xe4\xbd\xb4\x59\xa9\xf8\x75\xa4\x6c\xb1\xf9\x64\x65\x97\x1b\xc3\x09\x1d\x60\x9c\x2d\xdd\x99\xa1\x11\x3c\x4e\x5d\xdc\x01\x2c\x11\x99\xc0\x5e\x69\x92\x6b\x8d\x5f\x19\xb6\x4a\xce\xeb\x47\x9b\x2c\x29\x44\x26\xd1\xe9\xec\xa6\x05\x24\x19\xd3\x62\x2d\xd4\x2e\xa7\xc9\x7d\xe4\x05\x7e\x77\xb8\xf4\xd7\x9e\x6c\xbd\x1b\x2e\x46\x7d\x2c\x6e\x85\x3f\xe3\x5a\x8f\x27\x62\x30\x9a\x0e\xae\x2f\x67\x73\x7d\xb4\x66\x70\xd6\xcc\x9f\x50\xd9\x9f\xbf\x8f\x26\xd3\x9b\x40\x7c\x78\x1f\xc1\xce\x9f\x4f\xa6\x73\x71\x60\x04\x89\x18\x47\xef\x2e\x46\xef\xa2\xf1\x20\x3a\x0c\xf0\x58\xf4\xf5\x61\x9a\x4c\xf1\xa4\x7c\x18\xcd\xa2\x40\xcc\xde\xf7\x2f\x2e\xba\xcf\x55\xd0\x7d\xaa\x02\x3e\x6f\xc3\xd1\x8c\x3f\xd3\xc3\x70\x37\xb4\xf9\xce\xec\xfa\x4a\x0b\xb8\x29\xef\xfa\xc9\xb9\x98\x5d\x0f\xde\xa3\x08\x8a\x66\x81\x78\x1b\xc1\xf8\x2f\x22\x2d\x5c\xf4\x39\xf7\x0e\xf3\x55\x34\x9d\x4d\xc6\x28\xb6\xc6\x37\x62\x34\x1e\x8e\xa6\x20\x11\xb4\x60\x18\xf5\x2f\x40\x6e\x8e\x86\xd1\x78\xae\xff\x0d\x47\x77\x3c\x8b\xfe\xf5\x9a\xce\xe1\xb0\x7f\xd9\x7f\x87\x75\xc4\x70\xe4\xde\xf7\xf5\x14\x44\xd3\xa7\xa4\x2d\x3f\xa7\xdf\x7b\x31\x99\x41\x03\xef\x26\x93\xe1\x87\xd1\xc5\x45\x20\x3e\x4c\xa6\x3f\x8a\xd9\x7c\x72\x75\xd5\x7f\x17\xe9\x99\xbd\xbc\xba\xd6\x8d\x9e\xf7\x47\x17\xd7\x53\x90\xa5\x97\xfd\x8b\xf3\xeb\xf1\x00\x5b\xa3\xce\xeb\x15\xd4\x73\xcd\x13\x7a\xa9\xc5\xb3\xd7\x4b\x7c\x99\x9e\x95\xe8\xa7\x68\x2c\x46\xce\x5c\xdd\xd0\x42\xbd\xef\xff\x14\x89\xb7\x91\xfe\xeb\x58\xcb\x5d\x7d\x8b\xa0\xd4\xbd\x9a\xcc\x66\x5c\x24\xcd\xb3\x4c\x2d\x87\x2c\x88\x3a\x77\x1d\xb5\xac\xc5\x6b\xff\xea\xea\xe2\x46\x2f\x84\xfd\xa3\x9e\x82\x61\xd4\x9f\xbf\xd7\xdd\xc3\xe5\xe8\x5f\x88\xd1\xf8\x87\xeb\x29\x08\xe8\xeb\x8b\xb9\xde\x6b\xe7\xd3\xc9\xa5\xd3\xdb\x6f\x66\xce\xee\xe3\x6b\x23\xfa\xd3\x3c\x1a\xe3\x4b\x46\x03\x58\xf2\x8b\xfe\x07\x2d\xfb\xdf\x8f\xde\x8e\xe6\x33\x7c\xdc\x76\x32\x14\xb3\xc9\x65\x24\x7e\xb8\x9e\x8e\x66\xc3\x11\xcc\xe5\x4c\x0c\x27\xd8\xd1\x8b\x8b\xc9\x07\x6a\x74\x70\x71\x3d\x83\x31\x4d\x1b\x23\xb4\x5b\xe3\xc1\x9d\x11\x88\xd9\x04\x2f\x54\xdb\x8e\x5e\x27\xa7\xa1\xcb\xfe\x8d\x3f\x37\xfa\x26\xe3\x32\xf9\xeb\x70\x16\x8a\x77\x7a\xe3\x8f\x2f\xf5\xd8\x22\x7d\x4a\x67\xd1\x74\x46\x92\xb8\xc3\x87\x2d\x7a\x0e\xb4\x40\x52\xa9\x4d\xd0\xc3\x42\x3d\x89\xbc\x79\x2e\xc5\x54\x92\x89\x17\xdf\x8a\x41\x78\x1e\x4e\x43\x71\x1a\x9e\x1c\x9f\x88\x83\xc9\xb2\x0a\xc5\xc9\x9b\x37\x2f\x0f\x91\x14\x94\xb8\x2c\xf2\x95\xd7\x70\xab\x26\x8a\x20\xf2\x1f\xfb\x8a\xef\x7e\xc6\x6e\x39\x9e\x32\xfd\x8d\xba\x6c\xf6\xea\xe4\x34\x3c\x3d\x39\x15\x07\x33\xb5\xe5\x7e\x41\xb2\xb3\xee\x97\x62\x4c\xde\xd6\xd7\x75\x5f\x9c\x91\x9d\xbe\x0e\x5f\x9f\x1e\x9f\x1e\x9d\x18\xf4\x46\xf3\xd1\x0b\x71\xf0\x43\x9d\x29\x1e\xb1\x16\xa6\x38\xe9\xa0\xeb\x43\x6c\x38\xca\x62\xe2\x3b\x96\x4b\x70\x6b\x75\x39\xe0\x00\xef\x0f\xc2\xe7\x2d\x0f\x2d\x5e\x62\xb8\xa6\x27\xa1\xb8\x1c\xcd\x06\xd1\xc5\x45\x7f\x1c\x4d\xae\x67\xed\x1b\xd5\x10\x31\x98\x4a\x5e\x60\x03\x76\x18\x37\x97\x79\xb6\x54\x05\x78\x02\x39\x0d\x7b\x03\x99\x27\x82\xea\x59\x1f\xe6\x1b\x75\xaa\xc5\x1c\xba\xd1\x06\xc7\x28\x26\xfe\x9a\x67\xf1\x86\x81\x58\xc0\x2a\x2f\x36\x9c\x30\xea\x7b\x69\xbc\xb0\x3a\x5b\x12\x4e\xab\xa1\x3f\x48\xd3\xa6\x6b\x52\x0d\x64\x9a\xac\xf2\x22\x4b\x24\xd0\x31\x5a\x9e\x67\x71\xa0\xba\x3c\x43\x3e\x7d\x23\x20\x50\xca\xcc\x62\xc9\x95\xd6\xb6\x39\x0c\x88\x2c\x16\xcc\x0a\x24\xaf\x02\x70\xaf\xa3\x7c\x75\xe4\xbf\x2b\x14\x1f\x1a\x3e\xbf\x38\x29\xb7\x50\xa1\x6d\x22\x24\x26\xc1\x4e\x9b\xcc\x94\xf8\xae\x4f\xde\x32\xa9\x92\xbf\xa9\x0c\xaa\x94\x08\x9b\x0d\x2b\x87\x96\x6b\x59\x20\x9f\x05\xfa\xad\xf4\xde\x25\x40\xc9\x38\x17\x0b\x6d\xc9\xa9\x52\xbf\x00\xa9\x8e\xaf\x33\x70\x77\xcd\x2a\xac\x13\x5f\x89\xfe\x46\x15\xc9\x52\xa2\xcf\xb0\xce\x00\x5d\xd5\x1a\x6e\xb0\x33\xe0\xd8\xdc\x17\x49\x05\x0c\x24\xe4\x6f\xc3\x7e\xfb\x01\x1b\xd7\x4a\x26\x7c\x78\xad\x29\x21\x1e\x91\x7e\xc0\xfb\xfe\x23\x39\x47\xe5\xa1\x5d\x46\xa7\x1c\x60\x05\xc6\x18\xf1\x61\x60\x84\xac\x58\x24\x55\x41\x9e\x3a\xe3\xea\x4c\x73\xa8\x01\xc3\xe9\xdb\xca\x1d\x57\x07\x2e\xf3\x92\x4a\x48\xed\x63\xdf\x83\xa9\x0a\xd5\x81\xf6\xc3\xf6\xb8\xfa\xe6\x88\x98\x8e\xc1\x2e\x4f\x32\x31\x93\x59\x25\xc5\x20\x95\x85\x14\x83\xbc\x86\x88\xa9\xdd\x6f\x81\xe3\x4f\x91\x75\xb9\x05\x28\xc7\x7c\x25\x7e\xe8\x5f\xce\x9e\x47\x59\x3c\xc4\x99\x21\x4f\xeb\xf2\x90\xe2\x06\x15\xc7\x90\x3f\xa7\x27\x0d\xea\x2f\x8f\x5c\x94\x34\xd4\x73\x15\x43\x28\x6e\x90\xd7\x85\x85\xd6\x1c\xe7\x90\xdc\x9e\x51\x94\x16\x7d\x5a\x6e\xdf\x61\x4a\xef\x54\x56\x2b\x81\xb5\x73\x9f\x31\xde\xee\x65\x68\xa6\x6c\xc2\x5a\x3c\x9e\x85\xae\x2f\x89\xba\xa8\x68\xd9\x90\xfb\xcc\xa0\x5e\xc9\xaa\xca\x8b\x4c\xed\x4a\x04\x1a\x25\x8a\x6e\x50\xbb\x31\xcc\x29\x9b\x3e\x54\xb3\xf9\xc7\xc6\xe1\x98\xdd\xe9\x53\xa4\xbf\x90\xa1\x6d\x2f\x97\x0e\x1a\xed\x28\xab\x54\x81\xba\xb1\x4c\xc5\x4c\x62\xb2\xcc\xbb\x3c\x8f\x4b\x00\xf6\x69\x32\x82\xc7\x58\x54\xac\x0f\xbd\xef\x9d\xc7\xa3\xed\xd0\x6f\x71\xc4\x4f\x66\xb7\x35\x00\xbf\xad\x20\x5f\x9d\x0a\xe5\xcc\xba\x3a\xc8\x3c\x54\x19\x0a\x89\x9a\x05\x26\x72\x59\xdf\x82\x61\x47\x6f\x39\xc1\x4e\x4e\x43\x30\x45\x27\x63\xa3\x60\x69\xad\x08\xcc\x30\xbc\x20\xc8\x31\x9e\x64\x10\x75\x31\x44\x62\x54\x65\xea\x15\xf7\xc8\x12\x2c\x25\x2e\x8a\xb5\x06\x95\xe3\xa8\x0f\x1e\xcc\xd1\x6d\x30\xef\x3d\x9c\x13\x4a\x94\x7c\xe0\xe2\x72\xf3\x09\xf3\x95\x57\xd5\xd9\x88\xc6\x2e\xa0\x3a\x80\xf2\xbb\xd1\x67\x8b\x05\xd6\x8c\xe6\xea\x5d\xac\x36\x2b\xdb\xa6\x37\x63\x70\x09\x36\x3b\xe0\x0e\xdb\x44\x35\xf0\x39\x61\x57\xf0\x66\x5c\xae\xa9\x2b\x81\x03\xa4\x6a\xb2\x74\x56\x72\x59\xe5\x05\xa7\x2b\x73\x24\x11\x61\x06\x20\x62\x01\x56\x18\xa1\x55\x91\xe7\xde\x09\x96\x35\xf0\xfe\xb1\x74\x48\xfd\xb5\x4e\x30\xc4\x0a\x95\x43\xa1\x88\xfe\x04\xaa\xa7\xe8\x87\xcf\x7a\xf3\x46\x85\x3c\xcc\x0c\xc4\x53\x80\xc7\xd8\x97\x0e\x0f\xf8\xcd\x1c\x24\x12\x71\xa0\xbf\x67\x10\x0a\x0e\xbf\x37\xce\x4e\xbd\xd9\x0c\xb3\x21\xbc\x40\xd9\xed\xd3\x11\xf5\x36\xa6\xaa\x81\x70\x5d\x50\xde\xb2\x5b\x7c\x61\x0c\xfe\x4a\xac\xab\x6a\xfb\xdd\xf3\xe7\xf7\xf7\xf7\xe1\x06\xfb\x19\xe6\xc5\xed\xf3\xcb\xab\x8b\xe7\xcf\x66\x2d\xe8\x36\xc7\xf9\xab\x5c\xfd\xc3\xaf\x40\xd1\xd3\xc7\xce\x2e\x2a\xbb\x7a\xdc\xd9\x45\xb5\x02\x5d\xdc\x95\x33\xa5\xfc\x18\x03\x89\x0a\x83\x4e\x65\x8e\x34\x6a\x1f\x4e\x29\x32\xe2\x99\xd9\xc0\x59\xab\xe7\x21\xc0\xc0\xfb\x3e\xc7\xa4\x14\x1f\xf5\x8f\x78\xa8\x30\xb5\x13\xa1\xc0\x79\xea\x8a\x0b\xa2\x9c\xd2\x35\xfc\x9b\x2c\x5c\xdc\xae\x83\xc1\xa1\x79\xa6\x9f\xa6\x44\x3d\x2f\xa6\x4c\x3c\xeb\x4a\x82\x83\xf2\xf0\x3b\xfe\x72\x6f\x8f\x53\xf5\x59\x3f\xe1\xf3\x77\x09\xd1\x87\xfe\x5e\xfc\x2f\xa7\x2f\x8f\x5f\xb4\xf8\x5f\xf6\xfc\x4f\x5f\xe7\xa7\x9f\xa6\xea\xb6\xc8\xc5\x0b\x14\xae\xb7\xb4\x19\x38\xe4\x71\xf8\x8c\xbf\x90\x94\xf0\xc7\x23\xd8\x2a\x62\x54\x89\x7b\xe9\x1d\x5e\xe9\x5c\x6e\x04\x35\xaf\x6f\x16\xd2\xcd\x96\x39\x91\x46\x6a\xed\x09\x62\xca\x25\xc5\x37\xab\x1c\xa4\x38\xb2\xc5\x62\x02\x86\x7e\x8f\x15\xcd\x50\x31\xcb\x65\xb2\x2e\xd4\x3a\x36\x64\x61\x88\xd6\x72\xf9\x09\x13\x77\x90\x55\x93\x91\xb6\x89\xc8\xea\x13\x3d\xe0\xa0\x68\x42\x92\x5a\x95\x23\xda\x3a\x62\x71\x54\x6b\xea\x71\xa1\xaa\xba\xc8\xc2\x67\x26\xff\xd3\x30\x62\x31\x04\x22\xe3\x6c\xee\x48\xb1\x50\x99\x56\x0b\xe5\x2d\xea\x21\xd5\x5a\x66\x9f\x74\xa3\x0b\x93\xe6\x2f\xa9\x51\x18\x20\x5f\x7b\x3c\xbf\x06\x1f\x89\xcc\xc6\x25\x67\xcd\x2e\x76\x6c\xe3\x50\xc9\xdc\x51\x9e\x59\x52\x0b\x54\xde\xb0\xf5\xba\x54\xab\x3a\x05\x7c\xf5\x42\x61\x62\x24\xbf\x39\xd3\x57\x45\x91\xdf\x51\xe6\x77\x4e\x61\x2d\x40\xff\x0c\x08\xf6\x72\x2d\xb7\x25\x80\xfd\x53\x51\x23\x57\x26\x60\xd1\x43\x69\xf0\x44\x29\x31\xdd\x84\xf7\x50\xcb\xa0\x35\x5f\xca\x4c\x1b\x8a\x85\x4d\xdf\xda\x98\xa2\x04\x0f\x27\x5f\xeb\x18\x2e\x4b\x38\x06\xb2\xb0\x3c\x40\xdc\xca\x8d\x5e\x10\x34\x5d\x03\xbd\xa8\x26\x89\x38\x83\x9c\x00\x6c\x70\x83\x5a\xb2\x8a\xcd\x2c\x96\xf9\x46\x99\xe0\x5f\x85\xd8\x62\x71\xa2\xf5\xa1\x45\x6d\x57\x4a\xaf\xbd\xcb\x70\x10\xa3\x86\x1a\x8a\x0f\x4a\x54\x85\x9e\x01\xfd\x4d\x2e\xce\x5d\x00\x80\x66\x4d\xe0\xa3\x79\x09\xa0\x0d\x6f\x77\x62\xb6\x96\xf7\x99\x78\x2f\x8b\xdb\x42\xc9\x3b\x55\x06\xe2\xe4\x5b\x31\x59\x56\xb9\x3e\x05\x27\x6f\xde\x7c\x1b\x3e\xb3\x91\x85\xef\xc0\xb3\x36\x9b\x9c\xcf\x3f\xf4\xa7\x9d\xf0\x8f\x4f\x86\xba\x5a\x68\x90\x4e\x84\x4b\xbc\xbd\x9e\x83\x4b\x0d\xbc\x6c\xd1\x90\xfd\x83\xdd\xc0\x8f\xe4\x88\x0c\x9e\x44\x7d\x0c\xc4\x7c\x34\xbf\x88\xc0\x7f\xe7\xc4\xb2\xa2\xcb\x68\x3c\x0f\xc5\x68\x2c\xc6\x13\xf0\xab\xce\x1d\x9f\xf7\x60\x72\x75\x33\x1d\xbd\x7b\x3f\x17\xef\x27\x17\xc3\x68\x3a\x23\x67\xed\x64\x1c\x59\xf7\xb6\xee\xb2\x37\x21\xd6\x67\xcd\x8e\x69\xc7\x85\x8b\xee\x5d\xe3\x40\xb5\xee\xf9\xd1\xd8\x71\xc2\x83\xaf\xde\xf7\xc4\xf7\xa7\xa3\x19\xbb\x52\x03\xa1\xe7\x76\x72\x0e\x13\x08\xcf\x8d\x31\x20\x85\xc1\x34\xaf\x37\x93\x29\xfc\x7e\x8d\x51\x3c\x7c\xfd\x30\xea\x5f\x8c\xc6\xef\x66\xfa\x61\xf7\xcb\x7f\x28\xba\xb7\xd6\x4f\xf8\x7c\x38\x1b\x5e\xfd\x86\xe0\x8f\x4f\xdf\xff\x2f\xce\x4e\x9a\xf7\xff\xc9\x8b\x57\x7b\xfe\xb7\xaf\xf2\x63\x4f\xeb\x78\x32\x1f\x9d\x8f\x06\xe0\xa1\x7f\xa6\xd5\x6e\xfb\xa7\xd3\xe3\xe3\x17\xe2\x7a\x3c\xfa\x29\x9a\xce\x28\x16\x32\x78\x3f\x1a\xf4\xdf\x4d\x90\x89\x9f\x6f\x04\xa0\xfe\x00\x8c\x1f\xe6\x15\xd7\x7f\xaa\xd4\xb2\x72\x32\xcc\x2d\xe8\x73\x2a\xef\xcb\x86\x0b\x04\xfd\x7f\xa1\x70\x98\xec\xc1\xa6\xdf\xee\x30\xd3\x8e\xd3\x70\x5c\x24\x5e\x4c\x51\x2b\xdb\xb4\xe4\x2e\xea\x87\x8a\x9b\x89\xd1\xd0\x08\xe7\x98\x95\xc4\xae\x8b\xa9\x67\x85\x22\x24\xad\xdc\xab\x5f\xcb\x9b\xb0\xf3\x60\xfb\x5c\x67\x09\xa4\x8b\x60\xa9\xf9\x60\x9d\x2c\xe5\x2d\xfa\x83\x75\xf3\xc2\x25\x19\x86\xbc\x44\x13\x7d\x2d\xc1\x72\x46\x63\x1a\x5e\xa6\x35\x24\x5b\xb4\xfe\x28\x4b\x3f\x68\x60\x89\xc3\xda\xde\x93\xa5\x48\xca\xde\xf7\xc6\x5d\xd5\xb6\x12\x4d\xe1\x84\x37\xbd\xad\x79\xea\x42\x29\xd9\x16\x6a\x8b\x80\x8e\x26\x67\x49\x2b\x77\xa5\x93\x8f\xe7\x66\xd5\xe6\xa8\x13\x94\x81\xd6\x11\x2c\x81\x79\x52\x3e\x4c\x23\xe3\x2e\x01\xba\xab\x20\x6b\x6b\xc9\xce\x46\xe6\x07\x05\xad\x42\x4f\xa8\x2c\x98\x3e\x0c\xfc\x25\x2e\xc8\xb5\x99\xb4\x72\x0d\x5a\xc3\x32\x61\x38\x77\x0b\x64\x38\xf7\xc1\x9c\xb5\xde\x59\x57\xeb\x1c\x33\xa1\xbf\x7b\x36\xab\xa0\x04\xfb\x87\x50\xbc\x55\x59\x99\x67\xe2\x52\x6a\x55\x46\x56\xc9\x12\x2d\xe6\x01\x47\x7a\x66\xcb\x44\x65\x4b\x25\x86\x09\xc5\x0e\xfa\xc5\x6d\x9e\x65\x8a\xbc\x79\x32\x15\x17\x72\x91\x17\x12\xaa\xa3\xf8\x6f\xa3\x0b\xf1\xea\xf8\xc5\xd9\x9b\x67\x37\x49\xb6\xab\xc5\x8d\x12\x43\x3d\xc1\x15\x63\x56\x5d\x5a\x04\x2b\x6e\x5f\xbf\x34\xca\x6e\x93\x4c\x21\x3c\xc2\xac\x92\xd9\x2a\x07\x86\x7a\xb3\xff\xf8\xb3\x40\x0c\xfa\x10\xd2\xe9\x3f\xd3\x33\xf9\xd7\x5a\x95\x2e\x3c\x08\xa5\x28\x37\xc0\x3a\x0d\x4a\x46\x81\x4e\x20\x88\x93\xe8\xb1\xff\xd7\xcd\xb2\x0c\x65\x96\x86\xb7\xf9\x9d\x6e\x61\xa7\xfb\x7c\xb4\x53\xff\xb5\xa4\xd7\x85\x2a\xae\x9f\x3d\x36\x6c\xf0\xbb\xac\xe4\x52\xef\xed\x44\x99\xa4\xff\xd2\x38\xfb\x47\x69\x9a\x64\x79\x82\x53\x3b\x8a\xe5\x3a\x07\xa8\x31\x84\x83\x59\xec\xf8\x9c\x39\x11\x02\x1b\xab\x0a\xec\xe1\x71\x88\xcf\xba\x4f\x25\xc1\xcf\xb8\x31\x22\xc7\xbf\x69\xdc\x43\xfe\x62\x44\x99\x2a\x6e\x77\xae\x32\xf7\x0c\xa1\xbc\xa7\x93\x77\xd3\xfe\xa5\xf8\xd0\xd7\xff\x8e\xae\xfa\xd3\x68\x28\xfa\x90\xb6\xd2\x1f\x0c\x26\xd7\x63\xd0\x36\x30\xb2\x7d\x35\x19\xcf\x26\xfa\xef\x6f\x6f\xe0\xef\xef\xa2\xf1\xe0\x86\xc3\xcc\xd7\x63\x50\xd9\x66\xf3\xfe\x3c\x9a\x39\xa1\xcf\x50\x8c\x29\xbf\xe9\xb1\x6f\x89\x31\x07\xc3\xb1\x51\xfd\x40\x34\x39\x0f\xe0\x73\x7a\xb0\x2d\xb8\x03\xf3\x18\x76\x62\x34\x15\xd1\xe5\xd5\xc5\xe4\x26\x22\x95\xeb\xfc\x7c\x34\x88\xa6\xb3\x40\x5c\xf6\x7f\x84\x5c\x89\x1b\xa3\x97\x76\xeb\xa2\xba\x39\x48\x0d\xc2\x2f\x63\x3e\x85\x0d\x7a\x4f\xa6\x5d\x0e\x5f\xdd\xbf\xfe\x60\x70\x3d\xed\x0f\x6e\x30\xec\x7f\x11\xcd\x23\xad\x93\x42\x83\xd7\xb3\xe8\xfc\xfa\x02\x54\x54\xd2\x85\x31\x44\x4f\x39\x05\xfd\xab\xab\xfe\xb4\x3f\xbf\x9e\x05\x7a\x31\x86\xd7\x94\x8a\x71\x35\x9d\x0c\xf4\x23\xb0\x60\x93\x19\x75\x6e\x1a\xe9\x3e\x47\xe3\x39\xa5\x7b\x8d\xe6\x33\x50\xf0\x3e\x40\xfe\x94\xd6\x9d\x59\xbb\x15\x57\xd3\xd1\x4f\xfd\x79\x74\x71\x23\x26\x1f\xc6\xd1\x50\xc0\x2d\x38\x0b\xc5\x34\x3a\x8f\xa6\x10\x7e\xd7\x73\xac\xf5\xc0\x09\x66\x64\x5c\x45\x03\x7d\x77\xba\x19\x08\xa6\x43\xd4\x1b\xe8\x03\xa6\x46\x45\x7a\x17\xcc\xa7\xfd\x61\x24\xc6\xfd\x4b\xad\x64\xeb\x7f\x5f\xf6\xa7\x3f\xea\xd9\x1e\x5f\x9f\xf7\x07\xf3\xeb\x69\x34\x6d\xe6\x95\x0c\x27\xd1\x0c\x3a\xca\xb9\x56\xa3\x0b\x37\x61\x8a\x57\xe3\x06\x86\x16\x8d\x87\x93\xe9\x0c\x34\xf5\x40\x4c\x23\xe8\xd9\x78\xd8\x37\xe9\x13\xe7\xfd\x9f\x26\x53\xb0\x1c\x6e\x1e\xdf\x5e\x9d\xbb\x0b\x53\xd9\x7e\x1a\x45\x1f\xc0\x36\x98\x5c\x8d\xc6\x90\x4b\xa0\x57\x09\x92\xae\x66\x4e\x4e\x1e\x4d\x16\xe5\x19\xb8\x9d\x87\xb7\xe1\xe2\x9c\x5f\x44\x83\xb9\x98\xbf\x9f\xcc\xa2\xa7\xce\xc5\x03\x5d\xfa\x43\xeb\xe1\xbf\xd7\x4f\xf8\x7c\x72\x31\xec\x5f\x1d\x9d\x84\x27\xbf\x99\x11\xf0\x14\xff\xeb\xd9\xeb\x93\xa6\xff\xef\xf8\xf5\xf1\x5e\xff\xff\x1a\x3f\xe0\xda\xdf\xaa\x4c\x6f\x82\x46\xe8\xc5\x01\x81\x3f\x09\xc4\xe9\x4b\xd1\xaf\x6f\xeb\xb2\x02\xd7\xc6\x33\xeb\xa1\xd7\xbf\x06\xc2\x6b\xe7\x3c\xaf\xb3\x18\xab\x93\xba\x9d\xf6\xe3\xbc\x52\xdf\xa1\x9f\x2b\x75\xc2\x23\x4d\x8e\xbf\x5e\x93\x99\x16\xf2\x67\xdc\x28\x8a\xb9\xb2\xaf\x54\x01\xa8\x24\x06\x32\xe1\x82\x02\x1e\x5a\x53\x2e\x9d\x74\x9b\x56\xe9\x64\x5e\x9a\x74\xc9\xd6\xfb\xc2\xde\xb3\xab\x69\xd4\xbf\x7c\x7b\x11\xed\xb9\x70\xf7\x5c\xb8\x7b\x2e\xdc\x3d\x17\xee\x9e\x0b\x77\xcf\x85\xbb\xe7\xc2\xdd\x73\xe1\xfe\xa7\xe5\xc2\xad\xeb\x4c\x55\x7b\x36\xdc\x3d\x1b\xee\x9e\x0d\x77\xcf\x86\xbb\x67\xc3\xdd\xb3\xe1\xee\xd9\x70\xff\x41\xd9\x70\x7f\x31\x0b\xae\x8b\x39\xa0\x36\x00\xb9\xe9\x35\xa6\x1f\xbe\x93\x45\x82\x22\x82\x8b\xec\x39\x43\x95\x2b\xb5\x18\x71\xe0\x97\x70\xeb\xe2\x94\x49\x82\xe6\x71\x54\xa4\x7c\x45\x8b\x09\xab\x2a\xae\x64\x21\x6f\x0b\xb9\x5d\x8b\x57\x3e\x83\x50\xe9\xf7\x98\x55\x02\x50\x26\xfd\xee\x3a\x89\x66\xb0\x2f\x31\x53\x09\xb1\x93\xd1\x4c\xc4\x32\x5e\xc8\xe2\xbe\x65\x1a\xa2\x4a\x95\x8e\x4d\xcd\x8d\x99\xfa\xe3\xff\xa8\x3c\xb6\x6f\xf6\x34\xb6\xff\xb9\x7e\xc2\xe7\x8b\xbf\x25\xdb\x53\x60\x80\x7d\xf9\x1b\x45\x00\x9e\xc8\xff\x39\x7b\x75\x72\xd6\xf4\xff\xbf\x38\xdd\xfb\xff\xbf\xca\x8f\x53\x5e\x11\xbe\xd4\xe2\xe6\xe4\x58\x0c\xd5\x52\x41\x2a\xef\xe9\xf1\xf1\x6b\xc7\xd3\xff\xbf\xfe\x4d\x9c\xbc\x79\xf3\xea\x48\x7f\x2c\x7e\xa8\xd3\x44\x66\x62\xa6\xee\x65\x11\x7b\x69\x40\x81\x80\x2d\x85\x85\x2b\x8e\x33\x84\xaf\xd7\x34\x59\xd0\x17\xc0\x5b\x92\xa6\x8d\x22\x59\x81\x74\x83\x4f\xbf\x15\x83\x0b\x06\xa2\x91\x82\x0b\xcf\xa6\xca\x57\xe1\x90\x85\x1c\xbc\x1c\xa8\x46\x53\xa1\x1e\x5c\xf5\x79\xb1\x31\x74\x37\x96\x2d\xca\xd5\xa7\xb1\x3f\x8f\x11\xac\x1b\xbb\xc4\x75\x6f\x41\x4a\x85\xaa\xc0\x54\xf9\xdf\xff\xf3\xff\x15\x7e\xaf\xe0\xd6\x73\xd1\xc4\x09\x10\x01\x31\x1e\xf5\xbc\x2d\xf2\x3b\xd5\x72\x30\x11\x13\x1c\x93\xf7\xb9\xaf\x23\xdc\x04\xdb\x17\xeb\x7b\x0a\xb9\x0f\x73\x07\xfa\xbd\x99\x2b\x03\x1d\xa0\x2b\x65\x93\x94\x26\x6d\x49\xc5\xdf\x5b\xa4\x1f\xb8\x03\x01\xa8\xdc\xa8\x60\xf7\x45\x5e\x29\xdf\x2d\xc6\x6d\x9a\xc4\x5f\x53\x9a\x63\xc9\xf6\x32\xab\x9a\x05\xc8\x65\xc1\xd8\xda\x18\x50\xc9\x58\x9f\x02\xe5\xcd\x4f\xed\x32\xb9\xc0\x72\xbb\x2d\x14\xed\x2e\x7d\xdf\x13\x90\x11\x3b\x6c\xcd\xb8\xfb\x29\xd6\x9e\xd2\x84\x1b\x60\x2e\x46\x4c\xdb\xa6\x32\xc9\xd2\x1d\xfa\x61\x63\xae\xd1\x0e\x2c\xb8\x5b\xe7\xbc\x80\xab\x46\xb1\xe1\xd2\x1e\xbd\x3b\xeb\xee\x65\x8e\x89\x46\xbf\xcf\x15\x0e\x97\x77\x67\x16\x32\xa5\x01\x60\xf4\xde\xbb\xcb\xbf\xec\x0e\x6f\x27\x22\x7f\xce\x1d\xde\xff\x82\x3b\x5c\xe8\xae\x9b\x64\x9c\xe1\x43\x79\xc8\x34\x92\x8e\xc4\x62\xc2\xbb\xb0\xc8\x17\x2e\xe0\x85\x41\xc1\x88\xfe\x14\x5d\x5e\x5d\xf4\xa7\x37\x8f\x80\x60\x1c\x3c\x31\xf0\xab\xe9\x64\x70\x3d\x8d\x30\x69\xe1\x5c\xcc\xae\xdf\x72\xae\xc6\xbb\xc9\x64\x38\x73\x52\x42\x66\xdf\x1b\x54\x8c\x6b\xc8\xf5\xe8\xcf\xfb\x9c\xcc\x72\x3e\x9a\xcf\xbe\xd7\xff\x7e\x7b\x3d\x1b\xc1\xd4\x8c\xc6\xf3\x68\x3a\xbd\xbe\xd2\x2a\xd2\xa1\x78\x3f\xf9\x10\xfd\x14\x4d\xc5\xa0\x7f\x3d\x8b\x86\x98\x90\x81\x68\x3f\x08\x67\xe2\x41\x53\x3c\x90\x3c\x3d\x9b\x4f\x47\x83\xb9\xfb\xb5\xc9\x63\xe8\x27\x5e\x66\xca\xa1\xc9\xb3\x26\x90\xa1\x0f\xfd\x1b\x4e\xb6\x36\x69\xd4\x84\xdc\xc3\x7b\xcf\xe2\x71\xf4\x87\x3f\x8d\x66\x9f\x83\xb9\x11\x3e\xbb\xea\xcf\xa3\xf1\x7c\xf6\x9d\x98\xa3\xbb\x6e\xa1\x50\x0e\x6e\x76\x16\x99\x9f\x6e\x1f\x36\xe8\xf0\x17\x52\xdf\x6b\x62\x46\x42\xb4\x7c\x7d\x82\xd3\xdb\xbc\x48\xaa\xf5\xa6\x74\xac\xdf\x91\x5f\x1e\x02\x7a\x3b\xd7\x40\x00\xe9\x64\x51\xec\xa0\x18\x54\x32\x55\x18\x66\x23\x82\x6e\x09\x80\x01\x4a\x8c\xc4\x52\x66\x00\x4b\xca\x88\x39\xb7\xb5\x84\xfc\x4a\x2b\x06\x40\xc2\x1b\xb2\x92\xdf\x29\x7d\x25\x7c\x7e\x99\x14\x93\xd9\x6f\x9a\x00\xfe\x84\xfe\xf7\xf2\xe4\xec\xb8\x99\xff\xfd\x7a\xaf\xff\x7d\x9d\x1f\x58\x7d\x93\xf1\x61\x75\xbd\xff\x76\x13\xf5\xa7\xff\xfd\xd9\x7f\x1b\xf7\x2f\xa3\xff\x2e\xfe\x5b\x74\xd9\x1f\x5d\xfc\xf7\x67\x57\x4d\xdd\xa7\x34\x78\x88\x99\x1b\xed\x32\x9a\x5d\x47\x84\x0c\x4a\xb0\x29\xd7\x1a\xca\xd1\x8d\x43\x05\xc1\xbc\x8d\xcf\x12\x94\x18\xba\xf8\x03\xe7\x16\x83\xda\x31\x9b\xab\x1c\x2b\x44\xf2\x86\x3b\xd1\x14\x33\xb7\x62\x7b\xb6\xa0\xbf\xce\xa0\xdc\x55\xc5\xac\x3a\x72\xc2\x33\x66\x1c\xa7\x3b\xcb\xc1\xe8\x16\x9b\x95\x2a\x4d\x6d\x21\xda\x46\x15\x5a\xd6\x98\xd8\x64\x80\x38\xc9\x08\xb1\xb5\x54\x94\x60\x0c\xdd\xf1\xd2\xb4\xe9\x5e\xd5\xf3\xd3\x2a\xf7\x21\x40\xcb\x4f\x49\x16\x07\x1c\x3c\xae\xab\x4d\x5e\x56\x06\x18\xd6\x68\xa1\x8b\x5d\x0b\x0b\x24\x6b\xd4\x07\x67\x36\xf5\xdb\xa6\x85\x6f\x64\x9a\x2c\x81\x22\x9c\x73\x59\x0a\x71\x5b\xe4\xfa\xeb\xea\x36\x4d\x6e\xa1\xf3\x62\x94\x89\x2c\x07\x16\x2a\x24\x21\x64\x84\xf2\xbc\x08\x58\x7d\x61\xf2\x11\x2a\xc2\x67\xdc\x89\x34\x31\x04\x5f\x96\xaa\x97\xff\x4f\x0e\x56\x28\xb8\x0f\x44\x9a\x97\xc8\xc4\x8a\x1f\x03\x65\xb1\x29\xc3\x77\xdd\x2a\x54\x78\xaf\x17\xda\xc1\x48\xd4\x73\x1b\x18\xa6\x2c\x19\x23\xfe\x2a\x67\xb0\x80\x57\xd1\xe4\xd2\x23\x56\x2e\xbc\x17\x43\x10\x80\xa4\x43\x09\x34\x22\x56\x2b\xe8\x1e\xd5\x8c\x43\x9d\x1c\xb1\xe3\x25\x15\xe5\x9e\x97\xdc\x0b\x88\xc8\x6d\x55\x51\xe6\xd9\x37\xa5\x48\x36\x90\x73\x50\x29\xb1\x92\x75\x5a\x61\xd8\xb1\x36\xa5\x73\xf7\x04\x2a\x0d\x73\x0d\x40\x0c\xa3\x8f\xe3\x8f\xb3\x8f\xf3\x8f\xd3\x8f\xd7\x1f\x07\x1f\xe7\x1f\x47\x1f\x27\xf0\xc9\x77\x1f\x9f\xcd\x19\xa0\x13\xf1\xcf\x36\xdb\x54\x56\xea\xe0\xe4\x90\xf4\x3a\xfc\x7c\xa7\x24\xe6\xe9\xd8\x93\x75\xc0\x91\xa5\x98\x20\xb3\x37\x12\x41\xc6\x11\xa5\x5b\x66\xb7\xea\x10\x8d\x31\xe4\x7d\xc6\x20\x17\x4d\x94\x6d\x66\x0d\x9e\x25\x4e\xe9\x87\x5b\xaf\xf9\x65\x5c\xfa\x52\xcf\xb7\x49\xa3\x0a\x45\xff\x2e\x4f\x62\xa0\xea\xd3\xa3\x56\x3f\x57\xe1\xb3\xe9\xc7\xbe\x19\x5b\xff\xe3\xc5\xc7\x08\xc6\x67\xd2\xbd\x30\xdd\x5f\x6e\x2b\xe3\x09\xd7\x7b\x1e\xb8\x1d\xf4\x84\x19\x86\x11\xc7\x40\x0a\xc4\x2a\xcf\xaa\x32\x68\xda\x8a\xe0\xbc\x4b\x96\x50\x6a\x50\x67\xb1\x50\xd5\x32\x3c\xb4\x2c\x4b\x86\xc7\x1d\xa5\x94\x7e\x1d\xae\x49\x1c\xa3\xf4\xb8\x4c\x8a\xb7\xb3\x21\x64\x39\x98\x7c\x1b\x04\xb2\x00\xfd\xbe\xc6\x34\x72\x70\xd7\xd6\x25\x72\xb3\x79\xce\x44\x48\x1b\x5b\x27\x65\x95\x17\x5a\xf1\xb6\x42\x0a\xe5\x5d\xef\xe0\xf4\x50\xc8\x58\x6e\x49\x58\x45\x75\x91\x6f\x55\x06\x58\x1c\x0b\x45\x4e\xc2\x0c\xd3\xba\x0e\xe2\x22\x4f\x2a\x11\x7f\x23\xeb\x4a\xd5\xc5\xa1\x58\xe6\xb5\x3e\x60\xaa\x34\x13\x4f\x4a\x05\x0b\x5a\x10\xb1\x80\xe5\xfe\xbf\xff\xe7\xff\x23\x30\xb9\x3e\x44\xd0\x70\x04\x3c\xa8\x72\x31\x3c\x9f\xbd\x3b\x38\x3b\x14\x27\xe1\x09\x80\x83\x64\x65\x5d\x70\x70\xf2\xdd\xd5\xc5\xdd\x29\x32\xbd\x57\x7c\x5a\xf4\xc2\x94\xa5\x2a\x10\xc4\x00\x12\xb9\xd8\xbd\x0e\x16\x6e\xaa\xfb\x6c\x91\xab\xd0\xa1\xe6\xdc\x22\xb8\xb6\x4b\xfd\x00\x04\x6f\x91\x9c\x0a\xa9\x96\x72\x31\xf9\x71\x78\xf0\xe2\x10\xc0\x1c\x74\x07\x26\xb3\xe1\xc1\x4b\xfd\xeb\x1b\xec\xd0\x5f\x6b\x99\xea\xc7\x4a\xdc\xbb\xe7\x85\x52\x82\xe1\x15\x0e\x5e\x1d\xd2\xb5\x52\xe6\xf8\x97\xa1\xbb\x15\x0e\x5e\x1f\x9a\xcd\x45\x05\xc6\x2e\x9e\x37\xcc\xb0\x41\xc2\x00\xa6\xa8\x83\x6f\x0f\x0f\xde\x1c\x1e\x9c\x1c\x1f\x86\xcf\x3e\x68\x65\x32\x4d\xd4\x9d\xf2\x8a\x44\x1d\x69\x86\xa2\x3c\xa3\x99\x31\xc0\xb9\xdd\x60\x41\x68\x5d\x17\x06\x49\xc3\x54\x0f\xdf\x2b\x6a\xd9\x83\x69\x5c\x49\xb0\x82\x97\x95\x4b\x6b\x85\xd5\xd0\x65\x9e\x67\xfa\xff\xfa\x61\xc0\x78\x54\xee\xa3\x12\xa4\xd5\x22\x55\x1b\x7d\x3f\xa9\x4f\x70\x7f\x6e\xe8\x52\x00\xfa\x02\xe6\x43\x02\xb2\x2e\xee\x0c\x70\xd4\x40\x04\x41\xab\xcd\x08\xa9\xeb\x05\x52\xbd\x6b\x14\x6d\x5c\xdc\x82\x49\x69\x2a\x66\xcb\x5c\x8b\x9b\xa4\x2a\xcd\xdd\x50\xea\x83\x1f\x7d\x3c\xff\x18\x7d\xd4\xff\x1f\x7f\x1c\x7c\x8c\x50\xb4\x69\x53\x58\x4b\x32\x58\x3b\x0b\xa7\xb1\x49\x8a\x45\x19\x87\xb1\x42\x25\xf4\x88\x36\x10\x7c\xfb\xf4\xd0\x05\xdd\xd0\x87\x06\xa5\x01\xe0\x6e\x30\x90\xe5\x73\x3e\x79\x32\x0d\xb7\xeb\x2d\x3c\x78\xe6\x3d\x18\xab\x45\x22\x33\x78\x08\x1c\x51\xe9\x47\x2e\xf7\xf8\x3f\x6e\xeb\x24\x56\x69\x92\x29\x60\xaf\xd3\xdb\xb2\xf1\x42\x4b\x50\x0f\xcf\x9f\x84\xc7\xf0\xc5\x97\x8f\xf5\x2c\xce\x97\xe5\xf3\xbc\x04\xda\x63\xbd\x63\x9d\x6f\xde\x66\x35\x7c\x65\xbb\x4e\xd2\xbc\xcc\xb7\xeb\xdd\xf3\x55\xa1\xd4\x51\x79\x1f\xae\xab\x4d\x0a\x4f\xbc\xfe\xac\x27\xe2\x7c\x69\x1f\xf9\xd6\x7b\x24\x59\xe9\xcb\x5c\x4f\x29\xfe\xeb\xa3\xfe\xde\xf3\x34\xf9\x9b\xca\xfe\xb6\xd4\x46\x4f\x61\x9f\x7c\xf3\xd4\x88\x79\x9a\x71\xf9\x8e\xcd\xd7\x1f\x5a\x8d\x4d\x52\xe4\x25\xb6\xff\x7b\xeb\xb5\xfb\x9f\xcf\xfb\xe1\xfc\xff\xd3\xf0\xf4\x77\xca\xff\x3f\x7e\x71\xfa\xba\x85\xff\x71\xfc\xfa\xe5\xde\xfe\xfb\x1a\x3f\x9f\x93\xff\x7f\x1a\x9e\x06\xe2\x44\x5c\x42\xc9\xe5\xe9\xf1\xf1\xf1\x43\x2e\xf6\x96\x53\xb9\x99\x0e\xe9\xb9\x71\x0f\x7a\x7c\xb5\xf7\x0e\x7f\x73\x17\xfc\x49\xf8\x25\x1e\x78\xab\x15\x1b\xff\x4c\xc9\xcc\x6e\xc0\x6d\xd8\x6a\xcc\xa6\x80\x59\x0e\x5c\x2f\xeb\xd1\x96\x9e\x62\x1e\x68\xb3\x81\x24\x73\x63\x12\xdc\x1b\xb2\x8d\x7f\xf5\x90\x00\x1b\x51\xfe\x8a\x10\x79\x05\xe5\x9c\x52\x09\xb7\x63\xbd\x9a\x04\x18\xb7\xeb\x9c\x01\x6a\xdc\xdc\x3d\xde\x4f\x3d\xcf\x79\xfe\xcb\x9c\xdc\xb3\xa6\x93\xfb\x21\xdf\xb6\x41\x9c\xea\x28\x42\xa1\xdc\xb5\xab\xcf\x78\x8d\xe3\x95\x5f\x4a\x20\xeb\x71\x86\x93\x91\xdb\xde\xf9\x88\x38\x07\x70\x3a\x93\x82\xec\xa5\xbf\xb7\xb3\x2f\x43\xe0\xfc\x41\xf0\x12\x2e\x63\x36\x94\x20\xe4\x1a\xb0\xc7\xb6\xc8\x21\xc3\xee\xa0\x71\x9b\xa7\xb1\xdc\xc2\x05\x7d\xe8\x66\xbc\x74\xbc\x93\x32\xb7\xef\x4c\x06\x4d\xfa\x04\x55\x09\x7c\x97\xb9\x94\x2d\x3d\x09\x23\x01\x35\x28\x4a\x5c\x28\x1f\x4c\xc4\xe2\xd9\xa6\xe4\x17\x8f\x01\x28\x35\xa0\xb0\x5c\xa4\x5b\x7c\x06\xf5\x47\x65\x69\x1a\x3e\x23\xca\x31\xb9\x8a\xc6\x38\x07\x93\x6b\x2a\x8a\x04\xb7\xb9\x03\xc9\x3d\x13\xff\xe3\x7f\x80\xb3\xe6\x9b\x6f\x9a\x51\x10\x8f\x66\xe0\x3f\x7c\x1c\xa4\x6b\xac\xba\xfb\xf3\x99\x3f\xdc\x7d\xa0\xe4\x3f\x4f\xa0\xc4\x9c\x71\xc0\xe8\xad\x0a\x19\xab\x8d\x2c\x3e\x3d\x2a\x76\xbc\x8a\xbe\x37\x47\xfa\x9e\x7f\xb0\xac\x2f\xd0\xd7\xd7\x7d\x9e\xc7\x62\x90\x34\x61\x56\xaf\x67\xfd\x07\xaa\xfe\x1e\x00\xf5\x70\x4b\xb5\x3a\x2b\x3c\x1a\x95\x76\xe4\xfb\xdd\xd7\xfb\xfe\x1a\x3f\xe1\xf3\xc1\xe0\xe8\xed\xcd\xd1\x78\x78\x74\xfa\x5b\x25\x00\x3d\xae\xff\x9f\xbe\x3e\x3d\x6b\xd5\xff\x9e\x9d\x9d\xed\xf5\xff\xaf\xf1\x33\x28\x14\xe2\xb9\x0c\xf2\xcd\x46\x6b\x8d\xfd\xca\x68\x76\x47\xe3\x1c\x48\xaa\x4a\x71\x1a\xbe\x14\x83\x69\xd4\x07\x26\x99\xc1\xe4\xf2\x72\x32\xd6\xb7\xc7\xf4\x6a\x32\xc5\x0b\x65\x84\xc0\x04\x7d\xa0\x1f\x38\x1f\x4d\x2f\x41\xb8\x1a\xc0\x02\xba\x7f\x09\x14\x82\x25\x79\xe8\xe0\x81\x21\xbd\x80\x47\x07\x64\x9e\x86\x37\x47\x80\x9b\x31\x9f\x4f\xa6\xe3\xe8\xe6\x68\x70\x31\xd2\x57\xc5\x34\xba\x80\xf7\xcf\xde\x8f\xae\xc2\x76\x0f\xe9\xb5\x33\x6c\xd7\x81\x8e\xb0\x54\x43\x47\x86\x6a\xa8\xe3\x79\x84\xbe\x18\x4f\xdc\xcb\x7a\x1a\xbd\xeb\x4f\x87\x8c\x5f\xe6\xb6\xc9\x4a\x46\x80\x63\xa7\x8b\x79\xd6\x24\x7e\xa0\x1b\xb1\xc1\xf3\x40\x68\x14\xe1\x33\x36\xbe\x00\xbd\x6d\x32\xfd\x51\x1c\xf4\x67\x62\x18\x9d\x8f\xc6\x5a\x7d\x89\x2e\x26\x1f\x0e\x3b\x79\x94\x22\x20\xad\x99\x99\x59\x6c\x4f\xc6\xf5\xdb\x8b\xd1\xc0\xcc\xee\x41\x6f\x30\xb8\xba\xe8\xe9\xfb\xa9\x47\x9f\xf5\x0e\x11\xd6\x01\x5e\x8b\xef\x98\x47\x83\x39\xaa\x4d\x16\x0d\xaa\x3f\x1e\x3e\x37\xa8\x68\x3e\xf3\x44\x08\xb7\xda\xb5\x85\x70\x80\xa6\x26\x84\x61\xa2\x17\xd0\x23\xe5\xe9\xe2\x80\x9a\x3a\x6f\xd2\x9b\x09\xfb\x01\x98\xc2\xd1\x30\x7c\xf6\x56\x6b\x61\xd1\x74\x80\xd7\x28\x30\x1a\x01\x38\x87\x01\xbc\xd3\x2f\x34\x93\xf3\x3e\xd2\x17\xe8\xcd\xe4\x5a\xf4\x07\xc0\xfa\x03\x9a\xdc\xbb\x69\x04\x04\x1a\x6f\x23\xf1\x56\xeb\x44\xac\x15\xfa\x13\x68\x38\x86\xf4\x9f\xf0\x97\xc9\x54\xbc\xd3\xfb\x60\x06\x4d\xea\xcf\xe9\xe5\x5a\x3d\xe8\xc3\x0a\xe9\x37\x92\xc2\x30\x1b\x0d\xa3\xa9\x61\xce\xb8\x99\x5c\x4f\xa9\x17\x4c\xec\x04\x57\x36\xbe\x94\x94\xcf\xe1\x08\x76\x33\x97\x42\x3a\xd5\xcf\x5c\xf1\x12\x8a\xde\x80\xaa\x93\x89\x38\x8e\x6b\x41\x25\x45\xc4\x2c\x3d\xfb\x56\x15\x49\x1e\x27\x4b\x99\x62\x70\x2d\x10\x32\xab\xd6\x79\x9a\xdf\x02\xb6\xb5\xca\x96\xbb\x65\x9a\x6f\x55\xac\xaf\x6d\x83\xf4\xaf\x15\x84\x0f\xe8\xec\x06\xef\xae\xca\xaa\xa4\x50\x40\x15\x2b\xea\xcc\x14\x65\x61\x80\x54\x42\x4e\x3a\xa2\x47\x3b\x00\xa0\xcc\xcd\x9a\x59\x03\x17\x99\x35\xaa\xa4\xc2\x52\x58\x53\x0d\x05\xbe\xfa\x2c\x56\xe0\x7d\xcc\x2a\xc4\x95\x22\x7b\x8a\x58\xc9\xd0\xfc\x97\x25\xd4\xbd\x73\xc2\xb9\x34\x55\xda\x77\x4a\xdc\xaf\xf3\x54\x85\xa2\x8f\x8e\x6b\xaa\xe1\xa6\xb7\x29\xa4\xdd\xf7\xe6\xcc\xab\xef\x75\x52\xc9\x65\x93\x95\x4f\x1c\x48\x4b\x1d\xb2\x50\x69\x7e\x7f\x68\x0b\xa1\x11\x8a\xab\x4d\x8b\xc6\xc5\x3e\xa1\xe8\x35\x9a\xf3\xd7\x8a\xb0\xc1\xeb\x2d\xd5\x31\xc3\x0b\xb5\xb5\xe3\x7d\x60\xab\x40\xb7\x85\x3a\x82\xd0\x25\xc0\xd2\x23\xfe\x96\x5d\xed\xaa\x90\x59\xc9\xe4\xa0\x9b\xba\x84\x75\x77\xea\x57\x02\x11\x17\x72\x23\x2b\x2a\x90\x0b\xc4\x0a\x43\xe3\x32\x35\x9f\x6c\x72\xac\xb3\x48\x96\x55\x5d\x38\x5c\xda\x18\x5a\x2b\xd4\x12\x18\x43\x6f\xf5\x7a\x58\xe7\x04\x39\x68\x16\x45\x82\xb9\x7b\xb0\xd0\xb1\xca\x4a\x6a\x94\x22\x7c\x38\x04\xf0\x6d\xb4\xb7\x1a\x95\x25\x14\x6a\x29\xcb\x2a\xc0\xa1\x20\xf1\x06\x3e\x8f\x01\x34\x13\xa1\x45\x26\xe6\x5f\x7f\xb1\x1b\x2b\xdb\x66\xb6\x3a\xa7\x2f\xc8\xbb\x3c\x89\x19\x81\x21\xce\xeb\x45\x15\x70\xb9\x91\x39\x3d\x50\xd8\x4d\xcb\xb0\xcc\x37\xdb\xbc\x4c\xb8\x50\xb1\x35\x9f\x50\xc5\xbc\xcb\x96\xeb\x22\xcf\x1c\x58\x79\xf7\x28\x6a\xeb\x3b\x3e\x42\xd6\x05\xae\x15\x93\x62\x93\x43\x09\x56\x02\x91\xed\x83\x1e\xb4\x91\x64\xb7\xbd\x43\xc3\x22\xfa\x77\x0d\x98\x2b\xc9\x42\x46\x5d\xcf\x0b\x5b\x7a\xae\x20\xc2\x7f\x97\xc4\xb5\x4c\x51\x9e\x00\xf1\x07\x62\xc2\x62\x5d\xa2\x19\xc0\x13\xe4\xf2\xa6\x12\x2b\x14\x3d\x03\x19\xde\x87\x88\xd3\x93\xef\xbb\x5f\xe7\x0e\x38\x03\xbe\x8f\xdb\x53\xa1\xe8\xb9\xe7\xce\x8b\x78\x43\x90\x0c\xf6\x50\xbe\xe2\x08\xeb\x3a\xd9\x1a\xd6\xee\xcf\xec\xf3\x2a\x14\x88\x84\x40\x47\x3b\xeb\xee\xa6\xfa\x59\x15\x4b\x8c\xa1\x3e\xc8\x16\x00\x63\x61\x40\x88\x6d\xa1\xee\x12\x24\xbf\xbf\x4b\xf2\xd4\x8c\xef\xf3\x58\x9b\x79\x26\xe0\xfc\x70\xb3\xa6\xda\x9e\x53\x44\x1c\x8f\x94\xa9\x61\xe2\x85\x06\x5f\x1d\x76\x5a\x3d\xd2\xe5\x58\x95\xdb\x04\x82\x86\xdc\x61\xea\x2e\xfb\xb2\x4e\x43\x71\x2e\x93\x42\x5c\x97\x8a\x4c\x42\xc0\x7f\x59\x9b\x54\x0e\x1f\x04\x86\x53\x25\x08\x55\x10\xe0\x07\x21\x5f\x27\xc0\x6c\x21\xe2\x03\xd1\x22\x85\x01\xec\x29\x63\x04\x46\xb0\xd2\xaf\x82\x6c\x9e\x55\x52\x94\x95\x28\x81\x1d\x83\x7d\x9a\x2e\xce\x3d\xc9\x58\xe0\xc8\x28\xf5\x89\xa0\xe6\x5a\x89\x11\xf9\x7d\xa6\x8a\x2e\xf0\x4a\xdb\xae\x9f\x8a\x53\xb2\x4b\x94\xe7\xe8\x9d\xb6\x58\x43\x31\xf3\x09\x0f\x6c\xe2\x94\xe3\xb4\x6d\xac\x6b\x60\x97\xc3\x45\x69\x44\x8e\x75\x90\x80\x69\x7c\x9f\xc4\x2a\x10\x45\xbe\x93\x69\xb5\x3b\x5a\x15\x0a\x38\xe6\xb3\x23\x33\x32\x48\x9e\xda\x2a\x08\x51\x1f\xf0\x91\x8f\xeb\xc2\x93\x33\xce\x10\xcc\x20\x0f\xcd\xc2\xb8\x7b\xa1\xb2\xdc\x87\x89\x7b\x4f\x95\xe8\x2c\xff\xff\xd8\x7b\xd7\xe5\x36\x92\xec\x5c\xd4\xbf\xf5\x14\x19\x88\x73\x76\x13\x67\x17\x21\x92\xba\xf4\x4c\xcb\xe1\x38\x10\x09\x49\xb0\x49\x82\x03\x80\x2d\xeb\xfc\xd9\x91\x28\x24\xc8\x1a\x15\xaa\xe0\xca\x02\x29\xf8\x97\xdf\xc1\x2f\xe1\xf7\xf0\x9b\xf8\x49\x4e\xe4\xba\x64\xae\xac\x2a\x80\x54\x4f\xf7\xd8\xde\xbb\x19\x31\x31\x2d\x12\xa8\xca\x7b\xae\xcb\xb7\xbe\x8f\xee\xc9\x9f\x82\xc5\x52\x97\x8d\x48\x36\x2e\x4c\x2c\x1b\xa7\x12\x6e\x79\x72\xba\xeb\x1d\x94\x79\x2b\x20\x94\x69\x9e\xe7\x92\x75\xb2\xf9\x54\x04\xdb\xf8\x87\x7a\x52\x93\xe6\x23\xde\x85\x3b\x3a\x16\xb9\x08\x54\x9f\x9b\xfb\xb2\x28\xf1\x8c\xb6\x20\x6f\xb4\xcc\xec\x26\x67\xc9\xe7\x34\xdf\x25\x8c\x13\x13\xbf\x81\x92\xef\xc6\x6f\x81\x01\x1c\xce\x06\x44\x1b\x65\x77\x59\xed\xae\xe6\xed\x32\x2b\xf1\xaa\xf3\x51\x91\x30\x04\x0c\x56\xeb\xe8\x4f\xb3\x2f\xe2\x94\x7e\xde\xfd\xf4\x78\xe8\x7e\xe2\x79\x53\x4a\x65\x10\xb2\x71\x7d\x81\x47\x4d\x61\x85\xb9\xd1\xb9\x85\xbd\xf0\x3e\xd7\xc5\x57\x53\xf3\x52\xb5\x83\xb0\x56\x1f\x35\xf0\xe9\x74\xec\x2f\x8c\xfc\x40\x07\xa0\x49\x08\xfd\xf2\x07\x26\xaa\xae\x3c\x64\x1a\xcd\x57\xff\x6e\x16\x18\x2b\xd3\xcc\x99\xa2\x47\x66\x70\x37\x50\xc3\xd9\xf9\xf0\x26\x51\xef\xaf\xc6\x89\x9a\x8d\x66\xc3\xf3\x3e\x6f\x03\xd7\xc8\x70\xb7\x41\x52\x4b\x3e\xcd\xcd\x2e\xfe\x96\x27\x43\xfe\x15\x1f\xfe\x68\x16\xce\x18\xe9\xcb\x7b\x78\x20\xc6\x26\x1b\xa8\x2b\x93\xde\xeb\x02\x06\x70\x1a\xb4\x34\x50\xa5\xbf\xac\x76\x61\xc0\x7e\xed\x91\x81\x69\x6b\x8e\x49\x59\xb9\xb3\x38\xbb\x2b\x60\x9d\xe8\x3b\x67\x4c\x63\x57\x3e\x01\x62\xf9\x43\xf9\x4d\x0d\xef\x9c\xd1\xdf\x1a\x26\xc0\x44\x87\xe5\x0e\x87\x0b\xe9\x4f\xfb\x6b\x01\xad\xe1\x5e\x0a\xf4\x52\x64\x19\xf6\xfa\x8d\x00\x5e\xd2\x14\x75\x01\xee\x9b\xdc\x96\x50\xf6\x43\x22\xca\x41\x33\xe0\xf4\x47\x75\x3b\x3b\xf7\x32\x3d\xa7\xa7\x6f\x3c\x1d\xf0\x4c\xd4\x3c\x0e\xd3\x1a\x6a\xbf\x1b\xa5\x9c\x59\x41\xa7\xaf\xd4\x95\xb2\x7d\x61\x4b\x7c\xc6\x39\x74\xfb\xe8\xa9\x09\xfa\x5e\xcb\xae\x65\xc2\xfd\x66\x6b\xff\xb8\x73\xed\xcf\xdc\xfb\x47\xdf\xb0\x20\xf5\xd0\xba\xff\xbe\x15\xfe\x97\x4e\xe0\xeb\x5f\x6b\x02\xe7\x3e\xe1\x49\xdd\x27\x17\x81\x6f\x21\x44\x0b\xe7\x39\x71\x3e\x81\x5a\xae\xeb\x5e\x6d\xfd\xc8\x16\xe5\x23\xe0\x9b\xc0\xe4\x76\x53\x88\xf2\x54\x4b\x54\xea\x1f\xb4\x5f\xc1\x24\x26\x75\x8b\xa0\x0c\xbc\xac\x98\xd6\x44\x63\x7e\xb9\x36\xe9\x7d\x41\xf5\xdc\x91\x20\xe0\x9e\xeb\x92\x72\xab\xcd\x46\x13\x6b\x94\xa7\x89\xd9\x95\x5b\x2c\x3f\x28\x4a\x81\x52\x86\xb6\xb4\x74\xe3\x65\x15\x9c\x33\x1c\x83\xfe\x17\xa3\xa4\x17\xbb\xb0\x3c\x5d\xa3\xc9\x94\x08\x25\x73\x98\x1f\x9d\x06\xbc\x34\x71\x5b\xf3\x94\xf3\x83\xb2\x22\x68\x6a\xd1\xd8\x45\x82\x63\x40\xc5\x2c\x56\x90\xd7\x16\x0a\x2c\x6c\x21\x1b\x2d\xe0\xd9\x56\x58\x0b\x6d\x86\x11\x81\xcc\xa6\x3b\xb8\x0b\xab\xed\x0f\x75\xf8\x18\x2c\xfa\xf0\x67\xe1\x5f\x17\xf9\xee\x29\xd3\x1e\xef\xf1\x2f\x5c\xf5\xc6\xeb\xc2\x67\xf4\xe1\x65\x35\xb2\x0c\xc3\xd3\xa7\x54\x20\xa2\xc6\x4b\x67\xee\xaf\x32\x74\x75\x93\x0e\x1b\xdd\x3c\x98\x6a\x47\x0f\x8a\x8c\x8c\xc8\xe1\x73\xef\xfe\x55\x07\x20\xe6\x83\x00\x17\x87\xa8\xc1\x4b\x1b\x24\x9d\xbd\x55\xfc\xd9\xbb\xd6\x3a\xaf\xf1\xa3\xde\xf4\xde\xef\x84\xd0\xa8\x04\x7a\xb0\x1f\xc2\x36\xa0\xde\xed\x13\xcd\x8e\xdb\x17\xb4\xaa\xc3\xdd\x1b\xe6\xe3\xab\x31\x1b\x67\x25\x02\x60\x12\x5d\x7b\x28\x2d\x20\x6e\xb2\x15\x12\x0f\xd4\x2d\xcd\xee\x92\xb1\x0b\x0c\x82\x28\x57\xcc\x89\x0e\x77\x80\x6c\xc1\x6f\xb4\xfa\xd0\x6d\x87\xd1\x4e\xef\x8b\x32\x2f\xef\xc0\x7c\x58\x1b\x6d\xb7\x15\x77\x81\x99\x1c\x75\x9a\x12\x83\xfb\x36\x0c\x20\xc7\x03\xb4\x5a\xeb\xa2\x80\x0b\x24\x6d\x48\xc3\xee\x9f\x20\xaf\xd1\x28\x4f\x3f\xb0\xfc\x83\x28\xf8\x3e\x33\xba\x15\x57\xc1\x33\x8b\xd2\x73\x26\x2a\xbd\xec\xb2\xb9\x95\x06\xa2\x86\xd8\xa0\x40\xea\x11\xd2\x64\x6d\x9e\x1e\xfb\x5d\x6f\x35\x5e\x49\x23\xa5\xa3\x69\x10\x43\x23\xc2\x30\x78\xa5\x1b\x74\x7f\x08\xf2\x52\x4a\x1a\xf2\xaa\x9b\x4a\xa7\x35\x7a\x41\x89\xaa\xcc\xda\x0d\x8f\xe0\x52\x6b\xf4\xa7\xd8\x31\x42\x03\x7c\x6b\x62\x09\x5c\xec\x08\x24\xad\x5e\x1f\x2d\xfa\x09\xff\xcd\xd8\x9a\x4e\x5a\x74\x3b\xa8\x34\xf6\xb7\x3a\xe5\xaa\x0e\xaf\x69\xef\x06\x6a\x57\xe9\xb0\x11\xe1\x23\x90\x84\x01\x4a\x24\xa5\x0d\x8d\x1d\xb2\x8e\x81\xb7\x06\x5e\x0e\x0b\x2d\x7a\x61\xc2\x9f\xd4\x51\xd6\x87\x8f\xca\x32\xd8\x46\x9c\x07\x0c\x84\x8d\x35\xdb\x65\x59\xec\xd6\xa8\x6c\xeb\x5d\xd2\xbe\xfb\x27\x53\x90\x24\x8c\x53\x3a\xca\x32\xf8\x43\xd7\xd3\xe8\x23\x7e\xc6\xbd\x69\xec\x25\x24\x51\xfe\xb3\xac\xbc\xda\x21\x5a\x45\x5a\x81\xca\x21\xd4\xaf\x50\x4c\x91\xe6\xc1\x42\xc8\x02\xc3\x39\x89\xfa\x73\xb9\xad\x0a\x9d\x63\x38\x58\x87\xa4\x99\xdb\x2a\xfc\xd6\x1f\x6c\x17\x5c\x8b\x57\xb4\xbb\x7c\x33\xf4\x46\x16\x3b\xaf\xd5\x18\x98\x50\xdd\x60\x26\xd1\xb0\xa1\x4a\x71\xa3\xdd\xef\x70\x9f\x64\x75\xde\x38\x23\xc2\x88\xbd\x93\xe7\x1f\x2d\x75\xff\xa6\x5d\xbc\xea\x9f\xb8\xd6\x82\xe4\x30\x1c\x55\x7e\x7c\xa9\xf6\x18\x8f\x91\x45\x54\xf7\xef\xcf\x24\xda\x99\x58\x54\x00\x7d\xb9\x9d\x8e\xe5\xd9\xe1\x4f\xee\x36\xcc\xcd\x75\x18\xaf\x04\x8c\x1b\xa1\xdd\xc4\xe8\xf6\x70\x49\xcc\xdc\x63\x69\x57\x92\xc9\x98\xad\x37\x39\x1c\x7a\x5c\x62\xb6\x8b\x86\x19\x4e\xd1\x77\x82\xb6\xed\x9e\x0b\x41\xb1\x02\x88\x58\x51\xb5\xa5\x6a\xa1\xd6\x51\x03\xb1\xe8\x75\x56\x64\xeb\xed\x1a\xbb\x45\xef\x87\x10\x2c\x01\xc4\x58\xbe\x74\xe7\x73\x23\xeb\x8d\xae\x50\x31\x36\x84\x1e\xf9\x38\x81\xef\x58\xca\x8d\x84\xa3\xde\x93\xa2\x69\x2b\x68\x11\x59\x52\xfc\xe9\x07\x33\xb6\x6c\x1a\x6b\x92\x24\xea\xb3\xbf\x05\xe1\x9d\x17\xfe\x8a\x74\x5f\xb8\xbd\xbe\x84\xd2\x6f\x46\xb1\xa8\xab\xdb\xf9\xed\xf0\xf2\xf2\x0b\x66\xd2\x40\x6b\x8a\x32\x68\x00\x52\x1a\x81\x44\xd2\xe7\xe9\x78\x0e\x70\x1f\x9f\x3a\x9b\x7c\xf8\x30\x9a\xce\x42\x96\x0e\x92\xaf\x90\xf9\xf2\x79\x56\xcf\xd1\x8f\x59\x5d\x35\x99\x36\x70\x52\x2c\x87\xa5\xce\x27\xd7\xe7\xa3\xe9\x35\xe7\x61\xaf\x86\xf3\xd1\x74\x3c\xbc\x9c\x79\x6d\x82\x24\x28\x13\xcc\xe6\xc3\xf9\xed\x1c\xf0\x3d\x11\x9f\xfe\x13\xcc\x33\xf1\x9b\x41\x08\x2b\x69\x92\xce\x3c\x47\x42\xeb\x7a\x72\x2d\x75\xb3\x12\x56\x97\x1a\xbe\x9f\x8d\x28\x13\x78\x09\x85\xcd\x52\x6b\xea\xc3\xe8\x7c\x3e\x4b\x84\x36\x02\x7d\x09\xc7\x07\xbf\x25\x1e\x30\x9a\x4e\x27\xd3\x59\x80\x2c\x4d\xa6\x90\x39\xbf\x18\xcf\xce\x27\x3f\x8f\xa6\xc3\xf7\x97\xa3\xef\xd6\xfe\xff\xd0\x09\x71\x9b\x4d\x30\x6f\x19\x3e\xb8\x57\xcd\xff\xed\x40\x5d\xfa\x80\xab\xb3\x2c\x2f\x33\x22\x38\x1d\xb8\xaf\x8f\x6e\xe6\x9c\xb5\x1d\xfd\xe3\x1c\xd3\xf9\x7f\xba\x1d\xb3\x4a\x46\x94\x58\x4e\x22\x70\xdb\xe7\xf1\xe5\x65\x58\x57\x01\xb8\x86\xef\x66\x4c\x17\x82\x0d\x08\xd9\xc5\x98\x36\x8f\x5a\x93\x50\xb6\x08\xb3\x96\xa8\x9b\xdb\xeb\x31\xa4\xce\x27\xd3\x00\x6e\xf3\x89\x7b\x86\x70\x79\xdc\x56\x9c\xbd\x8e\x70\x5c\xb8\xd2\x03\x84\xcb\xb7\xf9\xd3\x70\xa6\xde\x8f\x46\xd7\xcf\x07\x75\xcd\x98\x97\x6b\x6e\xaa\x75\x86\xea\xcf\xc1\x69\x9a\xb7\x8c\xdd\x03\xb6\x36\x1e\x4c\x35\x3d\xc7\x34\x58\xc9\xc0\x72\x72\x07\xd5\xa2\x02\x66\xca\xc5\x0e\x6e\x74\xba\x5a\xf6\xd9\x63\x3e\x8a\x61\x7d\xce\x23\x03\xd5\xe6\x12\xfd\x58\x9f\x7a\x68\x9a\x25\x68\x5f\xb9\x37\x74\xa9\x27\xfb\xb3\xd8\xe7\xf0\xb8\x28\x3f\xe3\xfb\xc0\xd8\xd0\x15\x01\x0d\x87\x23\x31\xdb\xd3\xac\xca\x00\x33\x6b\x56\xa8\xd5\x36\xcf\x3b\x24\x82\x9d\x53\x94\xfb\xb8\x26\xf9\xbc\x56\x9d\x26\xea\x2c\x51\x6f\x12\xf5\x36\x51\x3f\xa2\x97\xf8\x07\x6c\x9a\xdd\x56\x0f\x5c\xea\x5f\x87\x19\x3a\x90\x1b\x6e\x64\x03\xd0\x16\xef\xca\x09\x24\x12\xdc\x1a\xcd\x26\x94\x16\xff\xb2\xd0\xbe\x0c\xdd\xf7\x21\x21\xe3\x7a\x0e\x4c\x8d\x5c\xbc\x0a\x2d\x12\x81\x2d\x0a\x17\x34\x08\xdc\x51\x2b\xd2\x34\x53\x7d\x81\x66\xdf\x3b\x72\xb8\x72\x2a\x64\xca\x2f\x37\x4d\x36\x70\x36\x36\x31\xb7\x53\x67\x6b\xd3\x71\x29\x93\x4f\x0a\xd8\xdf\xf4\x5e\x19\xa6\x69\xf7\xcb\x03\x9a\x08\x24\x79\x59\x7d\xbf\xac\xf4\x63\x43\xfe\x3f\xca\x46\x07\x1f\x53\x87\xf2\x4f\xb0\xb1\x33\x1b\xd1\x7e\x2f\x4c\xe2\x07\xfe\x89\xd8\x41\x9f\x0b\x68\x23\xc7\x1f\x16\x59\x51\x67\xc5\xd6\xf8\x55\xb7\x2a\x99\x8c\xc8\x80\xf0\x36\x5b\x46\x62\x35\x87\x9c\x0a\x4c\x06\xd3\xc3\x5d\x65\x36\x35\x79\xae\x0b\x53\x6e\x05\x32\x04\xa0\xd9\x80\xd6\x8e\xc3\x07\xcf\x74\x1a\x92\x38\xfd\xc7\x29\xdc\x32\xf6\xe9\x7d\x2d\xb8\x89\x1c\x46\x56\x93\x72\x96\x6a\x67\x62\x4b\xdb\xce\x65\x5c\x97\x7b\xf6\x7e\xec\x2a\x41\x84\x5a\xca\x36\x45\xe3\x0b\x69\xc3\x07\x9d\x67\x4b\x04\x8b\x9b\x02\xc6\x56\x88\xce\x35\x6b\xe5\xb3\x5a\xca\xd4\xe3\xf0\xbb\xe6\xc1\x43\xb2\x9a\xf0\x31\xf4\x14\x21\xc9\x66\xe8\xe8\x58\x06\x89\xeb\x03\x11\x24\x2e\x03\x58\x6d\x2b\x4c\x13\xe2\x62\xa5\x48\x98\x50\x59\x87\xaf\x6a\x76\xce\x09\xd5\x11\xfa\xeb\x85\xf7\x81\x5d\x64\x6d\xbc\x2d\xcf\x56\x27\xd9\xf4\x51\x00\x32\x04\x2e\xc3\x83\x70\x8c\x60\xc9\x85\x21\x12\xf9\xa3\xeb\x12\xba\x43\xb5\x19\x7b\x46\xdb\xb7\x66\xe9\x9a\xbb\xc4\x80\xf7\x92\xca\x63\xf8\xd6\x48\xcb\x82\x58\x92\xea\x32\x32\xf9\xe1\xd3\x4c\x1f\x60\x81\x3d\x85\x9f\x97\x15\x42\xe9\x76\xa9\x9c\xc3\x16\xe2\x86\xe8\xf6\xa0\x73\xc1\x3c\xf7\x48\xcc\xdc\xf9\x54\x91\x05\x88\xee\x46\x89\x14\x01\x6f\x08\xd0\x4d\x61\xec\xd5\xc2\xd4\x8f\xc6\x14\xd1\x0c\xed\x4b\xae\xf3\x6a\xc6\xd3\x98\xf8\x5f\xa8\x78\x18\x17\x1e\x1f\xa8\x36\x09\xaf\xb0\x4c\x7b\x21\x65\x01\xf7\xbe\x02\x0e\x35\x72\xae\xf8\x3d\xc1\xeb\x92\x94\x98\x0b\x48\x49\x2c\x90\xeb\x57\x2f\x71\xe3\x61\x55\x32\xce\xa4\x65\xbd\xbc\x9d\x28\x5b\x81\x28\x06\xea\x12\x90\x5a\x02\x5f\xc8\x8d\x91\x13\x95\x31\x1e\x04\xc6\x0b\x1c\xd6\xe2\x16\x6e\x21\x2e\x76\x09\x23\x1a\xa9\xe9\xa3\x6b\x0e\x8f\x7f\xd1\xc2\x9e\x12\x7f\x97\x0e\x93\xdd\xde\x53\x5e\x58\x91\xd5\x0c\x41\x1e\xc2\x92\x96\x45\xe1\x26\xb8\xf0\x97\x82\x70\x3c\x07\xaa\xf5\x3a\x89\x0b\xa2\x4a\x6f\x3a\x8e\x38\x27\x86\xae\x36\x0e\x12\x92\x27\xd4\xf7\xa6\xc4\x1a\x2d\x64\xf0\x05\x4e\x09\x2b\xda\x20\x99\x46\x78\x78\x02\xec\x00\xa9\x80\x50\xb2\x3a\xc1\x79\x75\xff\x91\x15\x69\xe6\x5c\x6c\x44\x8c\xc0\x12\x86\xb2\x96\x4c\xe7\xfe\x15\x82\x18\x43\xf4\x91\xc7\x88\x6b\x5f\x3a\x6f\xf2\x55\x59\x99\xbb\x12\xfe\xf5\x58\x42\x69\x35\xec\xcd\x22\xa5\xca\xf4\xd6\xc8\xb8\xbb\x30\x44\xf5\x33\xf6\xfe\x97\x1c\xaf\xa3\xc3\x3c\xc2\x26\xc0\x7a\x17\x27\x2b\x18\x6a\x3a\xa4\x26\x00\xc7\xb6\xc8\xb3\x3b\xed\x91\x0e\xfc\xfd\xc1\x8b\x11\x02\xbb\x3c\x1f\x2a\xe5\x0c\x04\x2e\xc9\x99\x72\x29\x72\xfc\xd3\xf6\xa0\x04\x97\xaf\x01\xe4\xe4\x9c\xdf\x94\xe1\xa6\x3e\x3f\xbf\xb9\x0c\x04\x29\x38\xad\x30\xfb\x5c\x91\x14\x4a\x24\x7a\xcd\xc1\xe8\xf1\x6a\x00\xec\x95\x3b\xd0\x42\x39\x45\xa5\xf2\xf2\xae\x04\x85\xc1\xf6\xe2\x0a\x5b\x23\x2e\x03\xe3\x73\xaf\xe3\x5b\xa4\x7c\xe9\x0b\x1d\xb7\x6c\x3c\xe0\xe9\xd8\xb4\x53\x9b\x5f\xff\xc1\xbd\xad\x38\x4e\xb7\x15\x58\x5e\xa1\xa1\x5b\xab\xef\x8c\x0a\x05\xef\x10\x95\xa4\xf0\x08\xc5\xb6\x0c\xa8\x9d\x66\xb5\x55\x8f\x66\x01\x82\x00\x0d\xdd\x82\xa5\x51\x9a\xb5\x0a\xd0\x49\xa0\xb0\x66\x47\x95\x58\x7b\x6b\x7b\xc1\x23\x88\x3a\xba\xeb\xc2\xb3\x00\xa4\xf4\xd9\x94\xc6\xa0\xac\xee\x5e\xfe\x5e\xdc\xf1\x57\xfa\x19\xbc\x7c\x3f\xbb\x38\xbe\x41\x95\xde\xac\x2c\x7e\x8b\x0a\x90\x27\xf4\xdf\x5e\x9f\x9d\x34\xf9\xbf\x5e\xbd\x7e\x7b\xfa\x7b\xfd\xc7\x5f\xe3\xe7\xfd\xec\x42\x85\xd9\xf7\xa5\xdf\x1f\xcc\xa2\xda\x3a\x43\xd2\xcd\x89\xba\xa9\x8c\x5e\x2f\x72\xf3\xe2\x98\x7e\x40\x0c\xed\xbd\xa9\xbe\x9a\xdc\xec\x42\x39\xe7\x85\x2c\x0a\x3f\xea\xbd\x9f\x5d\xf4\x02\x84\xec\x1e\x83\x96\x0f\xa6\x50\x90\x02\x45\xa7\xc7\x9d\x11\x5e\xb1\x0c\xc9\x8d\x20\xe9\x48\x39\x62\xb8\x67\xd5\x63\xb6\x34\xca\x6e\x2a\xa3\x03\x49\x10\xe9\x70\x01\x41\x49\x59\xdf\x0b\xae\x73\xb2\x44\x8b\x63\xf1\x2b\xae\x30\x46\xa0\x07\x11\xd5\xae\x9d\x7f\xf3\x08\xbe\xfe\xa6\xca\x40\xa9\x0c\x49\xb1\xa8\xb2\xb5\x2e\x55\xb6\x86\x26\x43\xeb\xe8\xda\x46\x92\x1a\x74\x08\xc2\x81\xc8\x25\xef\x70\x01\x3a\x63\xbe\xba\xdb\x06\x01\x8f\x9a\xbd\x75\x67\x20\x9b\xba\x8e\x7d\x4f\x34\x36\xdd\x4c\xe4\xde\xd2\xb1\xee\x39\x78\x11\x58\x6e\x05\x1a\x8f\x68\x02\x43\x35\x35\x04\x95\x69\xf0\xe8\x42\xbb\x37\xf9\x26\xf1\x97\x4f\xb6\x34\x9a\x73\x8c\x90\x9f\x71\x9e\x1f\x6a\xc5\xd9\xba\xd2\x99\x57\x42\x46\xfd\x2c\xb0\x77\xd3\x6d\xae\x2b\xe7\x29\x6c\xc9\xc3\x2b\x09\x98\xca\x58\x3b\x88\xd3\x23\xd1\x0f\x47\xd6\xc3\x95\xbe\xa9\x4a\x77\x63\x2f\xbd\x5e\x8a\xfd\x09\x52\x8d\x1c\x3f\x9f\x9f\xdf\xbc\x1c\xdf\x78\xf9\x87\x2c\xcf\xb7\xae\x25\x35\xe7\x3e\x57\xa8\x8a\x03\x8c\x02\x82\x7b\x29\x0c\x74\xf3\x9d\xb9\xd1\x4b\x0a\x49\xe8\x8d\x73\x6e\x52\x67\x49\x30\x82\xc7\xb7\x42\x1d\x1f\xab\x72\xe5\xae\x5f\x60\x0c\x43\x4e\x9b\x2d\xe2\x48\x6c\x4d\x0b\x4b\xab\xa5\x51\x7f\xde\x56\x26\xa8\xbd\x1c\x99\xbb\x44\x4d\x66\x63\x55\x98\x1a\xd6\xdd\xba\x5c\x9a\xdc\xf6\x07\x2f\x3e\xb3\x75\x89\xef\xdd\x54\x65\x9e\xad\x4c\x88\xbc\x78\x12\x84\x0e\x7b\xe4\xe3\xf5\xad\xfa\x48\xcb\x29\x26\x5d\x88\xd2\x0f\xc6\x07\x0d\x20\x9e\x85\xd9\x60\xf2\xc6\xaa\x32\x47\xa6\x25\xac\x52\x07\xd0\x24\x0b\x3d\x0f\xd4\xc7\xcc\x53\x98\x21\x70\x1a\x80\x48\xac\x78\xbc\x32\x8f\x0a\xec\x00\xf7\xcf\xde\xc7\x9b\xcb\xe3\xda\xad\x05\xb3\xec\x31\xcd\x11\x14\x58\x90\x44\xc3\xa2\x5c\xee\xfc\xb6\x83\x45\x86\x94\x68\xce\x22\x61\x50\x80\x59\xc6\x52\x0d\xc7\xc7\x5e\xba\x8b\x9a\xc1\x3e\x70\x78\x4a\x9e\x7d\x35\x20\x81\x95\xe5\xa2\x08\xa2\xe7\x9b\xb2\x29\x2b\x8a\x7f\xad\xf5\x57\x32\x65\xd7\x10\x58\x72\x6b\x94\x82\x4f\x90\xa2\x85\x0c\xcc\x6a\x0b\x45\x0b\x4b\x5d\x1b\xf7\xfa\xda\xfb\x62\x59\x61\x1e\x32\x44\x7b\xa7\x59\x95\x6e\xd7\x16\x96\x87\xe5\x9c\x0c\x71\x6b\x01\xab\x70\x12\x69\x17\x90\x78\x3d\x85\x1b\xef\x4a\x9d\xd3\x12\x7f\xc8\x96\x7c\x3a\x01\xa0\x32\x5b\x1a\x3a\x9e\xd0\xd2\x42\x97\x27\xab\xa8\x24\xe7\x31\xb3\xf7\x20\x44\xb2\x75\x4b\x4a\xdf\x69\xb7\xe6\xd0\x71\x0d\xa3\xdf\x1b\xbc\x18\x17\xde\x6f\x4b\x00\x01\x9b\xea\x02\xb0\xfd\x59\xc1\x4a\x40\x40\x8d\x88\x91\xd5\x2c\xbd\x67\xd9\x6b\x90\x8c\x82\xed\xe9\x9d\x67\x93\x03\x59\x9e\xd0\xd7\xc8\xdd\xbe\x3c\xc6\x8c\x5e\x1f\x39\x2f\x90\x49\x99\x9b\x27\xba\x4b\x95\x37\xbe\xad\x18\xf2\xe3\x14\x98\x6b\xb3\x5f\xd5\xae\x49\xa6\xce\xea\xb2\x1a\xa8\xcf\x20\x2b\x89\xeb\xdc\x57\xaa\x84\x30\x2d\x52\x22\xba\x57\xae\x8d\x2e\x28\xe9\x97\x1b\xcd\x7c\x79\xa0\x3f\xb3\xf4\x31\x9b\x62\xe7\x35\xdd\x90\x34\x8d\xb7\x48\xb6\x12\x51\x28\x24\xf3\x5b\x46\x42\x9b\x70\x1e\xa6\xf0\x26\x09\x31\x76\x4f\x8c\xce\xd2\x85\x4e\xbf\xb2\x7e\x85\x7b\x7b\xf9\x58\xa8\xa3\x86\x76\x09\x52\x46\x38\xc3\x1a\x1f\xbb\x86\xc8\xe7\xc2\xa8\x95\x26\x7c\xb2\x5b\xcd\xe4\x97\xb0\xdc\x93\x5b\x19\x70\x05\xc1\xa0\x37\xf8\x32\x3c\xd6\x10\xc1\x67\x90\x8b\xb4\x89\x7a\x74\xb6\x38\xf8\x40\xac\xc8\xd1\xeb\xbe\x9d\x7b\x3f\xa9\xa1\xef\x3e\x26\xb6\x19\x2f\xef\xf9\xc3\xdd\x39\xba\x2c\xd7\x12\x02\xd6\xb8\x64\x58\xd3\xd3\x4f\xa4\xaf\xbc\xa2\x0b\xf7\x41\x57\x08\x2c\x5d\x29\x6b\xea\x1a\xa3\x18\x70\xd7\x36\x2e\x57\x8c\xf4\xf1\x3f\x59\x5c\x94\x56\x53\x44\x85\x08\x9e\xc2\xbd\x86\x9a\x15\xda\xaf\x82\x44\xd2\x4a\x8c\x11\xdd\x05\xcb\x72\x3d\x00\x6b\x03\x98\xbe\xed\x9e\xe0\xe2\x8a\xa4\x2a\x01\x89\x29\x07\x9b\x62\x06\x02\xb9\x47\x00\xb4\xc1\x0b\x18\x5b\xac\x70\x1c\x4f\xae\x7d\x0a\xa7\xab\x1e\x0f\xb2\x47\xe7\x93\x9b\x2f\x90\x2b\x94\x45\xab\x58\xeb\x79\x35\xb9\x18\x7f\x18\x9f\x63\xad\xdf\xf1\x5f\xf8\xf3\x42\x29\x75\x12\xd5\xfe\x0d\x82\xdc\x55\x8f\x24\x6e\x7b\x09\xa2\xec\x13\x21\x2f\x4a\x31\x52\xf7\x67\xc5\x84\x75\xb2\xb6\x7e\x5f\xe0\x3a\x6f\x04\x5c\xfb\x6a\xa8\x7a\xa2\x3e\x8d\x0e\xe6\x03\x6f\x26\xbf\x5a\x7c\x8a\x7d\xe6\xa0\xae\x8a\xed\xe9\xa8\xa2\x10\x72\x55\xbd\x2b\x31\x51\x5d\x2f\x82\x5d\x83\x62\x3e\xe8\x35\x16\x77\xcd\x57\x58\xa1\xea\x04\x75\x39\x5d\xed\xd5\xe9\x3d\x77\xdb\x70\xb1\xe5\x2c\x2d\x37\x86\xb0\xa7\xa2\x24\xe5\xce\x59\xa7\xa2\x74\xe8\x39\x4b\x8c\x75\xba\x70\x2c\x06\x6a\xe2\xa3\xbf\x0f\x98\x7f\x02\x02\xbf\x6d\x6d\x33\x42\x9b\x5a\xf7\xee\xe6\x84\xbc\x43\x8c\x16\x76\xb7\xda\x16\x05\x6f\x25\x1e\x63\x4f\x77\xcf\x77\x70\xe0\xee\x6c\x0a\x13\x89\xaf\x00\x82\x1b\xa6\xd5\xd9\x5f\x2b\x70\xf9\xdd\x26\x84\x03\x31\x84\x47\xe3\x1a\xc5\x78\x0d\x70\x5d\xcf\xcf\x31\x5b\x03\xfc\xda\xab\x56\xb5\xe9\x1d\xf6\xe9\x77\x72\xe3\x88\xe6\x90\x52\x85\x2a\xab\x13\x0e\x50\xb2\xb0\x61\x5b\x01\xca\x35\x78\x93\xa5\x5b\x2c\x94\x02\xbe\xa9\x88\x42\x91\xa2\x1b\xae\x03\x14\x97\x86\x66\xc9\x4f\xb5\xb0\x26\xef\x5a\x00\x29\x00\xe1\x7c\x17\xca\x50\x2f\xac\x27\x98\x05\x1a\x5b\x0c\x56\xbe\x13\x8a\xa6\x45\x00\xfd\x34\xe5\x54\xfd\x88\xc4\x1c\x52\xfe\x3d\xa1\xea\xb6\x39\x2b\xaf\x06\x4a\x6e\x22\x78\x5d\x15\xb3\x75\xd1\x1e\xc4\x9b\x49\x6e\x7e\xaf\xbc\xda\x52\xee\xac\xba\x67\x2c\xe9\x12\x84\x46\xe3\xb0\x6b\x67\x76\xcd\xdf\xda\x98\xfd\x0c\x5e\x42\xe7\x6f\xde\x85\x09\x6a\x90\x4e\xc7\x8b\xd4\xab\x3b\x08\x86\x69\x04\xd4\x04\x56\xd0\x3a\xa8\xc7\x22\xc9\x6c\x53\x89\xe4\x09\x42\xac\x18\x87\x49\xc6\x07\xd8\x75\x92\xee\xba\x28\xab\x35\x78\x31\xe2\x34\x16\xa7\xed\x1c\xb4\xba\xe3\x73\x92\xdb\xee\xfd\xa4\x10\x82\xf5\xea\x14\xc1\x52\x25\xa6\x62\xc9\x5d\x55\x16\x2b\x74\x11\x79\x91\x78\x7d\x8a\x47\x51\xc8\x92\xf6\x23\x98\x77\xc3\x84\x6a\xb5\x2a\x8b\x75\xb5\xa1\x91\x21\x4c\xbc\xa9\xca\xfb\x6c\x91\xd5\x8c\xb2\x8d\xa4\xed\xd8\xfc\xef\x3c\xad\x5f\x3f\x77\xd1\x4a\x33\xf0\xf7\x25\xfb\x9f\xb7\x64\x3d\x92\xd4\xaf\x4f\x8c\xce\x1b\x82\x2b\x82\x65\x07\x5d\x75\xbf\xa3\x33\x10\x6b\x55\x2c\x86\x92\xe9\x98\xf4\x57\xa4\x1b\x2c\xc8\x8a\x2f\x9d\x0d\x9b\x5b\x55\x18\x03\x74\x7b\x3e\xa9\x99\xe5\x88\xe6\x6b\x8c\x85\x28\xb6\x0d\xdc\x04\xa8\xeb\x19\x4f\x1d\x1c\xff\xd1\x47\xe0\x36\xa4\x0e\xc4\xd2\x2f\x34\xea\x42\x4f\x12\x1d\x49\x7a\x75\x10\x97\x6c\xb6\x9a\x16\x5b\x5c\x2a\xc2\x62\xdb\xe5\xb6\x58\x8a\x9d\x17\x06\x51\xb3\x30\x45\xa8\x68\xdf\x75\x67\xf0\xed\x7d\x80\x25\x02\xe9\x01\x80\x15\x0a\xd4\xc0\x23\xe6\x41\x4b\x00\x86\xb6\x4c\x74\x6c\x9b\xc1\x77\xc0\x4d\x2e\x57\x09\x85\x95\xbc\x33\x00\x94\x02\xf8\x06\x94\x18\x27\x09\x49\x67\x67\xc2\x85\x28\xd8\x8d\x9f\x55\x29\xfd\x66\xa0\xc6\x6b\x12\x54\xf4\x21\x9a\x68\x0f\xa3\xe6\x2e\xee\xdd\xc6\x06\x3d\x6c\x55\x5a\xe6\x05\x88\xb2\x56\x7e\xf6\x05\xb6\xc0\x67\xc9\xce\x7d\x8a\x0d\xab\x36\x09\x4f\xa2\x05\x9a\x64\x61\x54\xad\xbf\x1a\x60\x5f\xce\x5a\x2d\xef\xce\xfe\xcb\xa3\xe9\xed\x40\x30\xc7\x7c\x39\x44\x4a\xf7\xbf\x81\xd8\x4e\xe0\x6c\xf9\x34\xb9\xbc\x18\x4d\x01\xaf\xe8\xfa\x82\x78\x46\xf7\xdc\x2f\xea\xf3\xa7\x09\x80\x05\xc1\x5d\xfa\xc2\x3c\x32\xd3\x91\x77\xa8\x46\x04\x71\x9c\x7c\x9c\x0e\xaf\xd4\x70\xa6\x6e\x46\xd3\xab\xf1\xdc\xf5\x6c\xf8\x7e\xf2\xf3\x28\xf9\x6d\x49\xea\x5a\xc8\x3e\x42\xf2\x4d\xd5\xf8\x9a\xc7\x6c\x3e\x81\xdf\xc9\x76\xfe\x1f\xc0\x6d\x17\x10\x8c\x80\x48\xc4\x39\x0e\x70\x55\x9c\xde\x5f\x84\x69\xfc\xcf\xce\x7f\xfc\x9f\xfe\x33\x00\x32\xef\x87\x4d\x71\x0c\xa4\xde\x36\x3f\xc6\xb3\xf4\xd7\x4c\x05\x3e\xc1\xff\x7c\x7a\xfa\xb6\xc9\xff\xfc\xf6\xe4\xc7\xd7\xbf\xe7\xff\xfe\x1a\x3f\x33\x84\xa0\x28\x3f\xeb\x10\x4b\xcb\xb3\x02\x22\xee\x93\x8d\x29\x7e\xbe\xb9\x46\x2f\xc2\xfd\x63\x36\xbb\xfc\x29\x0e\x53\x83\xa1\x60\x9b\x4f\x49\xfc\x57\xe7\xbe\xd0\xcd\x99\x64\xe3\x22\x1d\x80\xfb\x1b\x71\x8f\xd4\x25\xbc\x91\x62\x2c\xcb\x10\x09\xe1\x70\x96\xf7\x62\xa8\x0d\xea\x92\xb4\x24\x8f\x88\x31\x3a\x18\x76\x5e\xdc\xaf\x5c\xf9\x4f\x83\xc5\xc4\x50\x0f\x80\x28\xb2\xc7\xa3\x2d\x7f\xa8\xdf\xf2\x0c\x48\xde\x38\x2d\xd7\x0b\x42\xf3\x5a\x81\xed\x81\xcb\xff\xb1\x14\x65\x89\xe5\xc2\xec\x9e\xc8\xee\x70\xd1\x32\x01\xbd\xac\x97\x66\xf0\xa4\x23\x4b\x4a\xed\x95\x14\x51\xd3\x05\x37\xd0\x97\x8c\x91\xaf\x03\x03\xe4\xcc\xd8\xa0\xd7\x0d\x30\x40\xc2\x9e\x86\x09\xad\x4b\xf4\x8b\x1e\x62\x51\x7c\xfc\xea\x62\x5b\x47\x8a\x17\x84\xd0\x11\x2a\x0f\xa1\x54\x0d\x55\xd1\x38\x5b\x00\x7f\x4c\xd4\xd2\xe4\x86\xf5\xc1\xc3\x3b\x3d\x6d\x36\x5a\x9f\xf2\xfd\xbf\x9f\xf9\xff\x95\x7e\x06\x2f\xe7\x57\xba\x36\xff\x99\xfa\x6f\xaf\x7f\x3c\xfb\xb1\xa5\xff\xf6\xe6\xf7\xf3\xff\xaf\xf2\xe3\xfc\x6e\x58\x01\x70\xcc\xa8\x19\x46\x16\x7c\x5d\x47\x14\x0a\x17\x85\xc2\x20\x27\x43\xf9\x59\x48\xeb\xc3\x23\x66\x3f\x5f\xff\x43\x56\xb3\xd0\x6f\x42\xc1\x05\x3e\x5a\xdc\xe9\x54\x15\x3a\xcf\x77\xc7\x6b\x9d\x15\x24\x01\x87\x1f\x0e\xf5\x97\x1f\x75\xb1\x5b\x9b\xa5\x9a\xcd\x3e\xf1\x83\xfa\x83\x17\x43\x0a\xc2\x4a\xc2\x7e\x4a\x3b\x6d\xb2\xdc\x9d\xd2\xb9\xb6\xd6\x58\xf4\x85\x51\x2f\xbe\xac\xee\x06\x75\x76\x57\x65\x76\x60\xb7\x0b\x3e\x7d\xfe\xac\x1f\xf4\x3d\xdf\x54\x6a\xf6\x50\x9c\xe7\x00\x6b\x87\x07\x90\xf4\x30\x06\xc8\x29\x65\x96\x87\xa3\xfb\xef\x87\x3f\x0f\x3f\x5d\x1e\x73\xaa\xc8\x9d\xa0\x82\x36\xf9\x28\xed\xab\xb3\x93\x93\xd7\xc7\x67\x27\xa7\x67\x3c\x22\x5e\x0a\xf7\xbf\x89\x54\xf1\xff\xf3\x9f\x2e\x54\xdc\x6e\xc1\x7f\x6f\x69\x84\xce\xfe\xf8\xdc\x36\x47\xfc\x58\xf5\x30\xc3\x85\x27\x0b\x5c\xcb\x42\xdd\x97\x8f\x6e\xd7\x95\x0b\x52\xa7\x58\x6f\xe0\xd2\x95\xf3\xc2\x58\x04\x0f\x3b\x61\xa3\xc7\xf2\xb6\x84\xe4\x48\xb1\x8b\x05\x16\x3b\x3e\x7e\xf0\x29\x18\xa9\x6b\x2d\x08\xca\x00\x76\xc4\xe7\xe2\x40\x30\x7c\x24\x80\x79\x30\x4d\x8e\x59\x74\x0f\x84\x4a\x4b\x9c\xaf\xe8\x9b\x9b\x7c\xeb\x0c\xcd\xa2\x5c\x43\x10\x7b\x65\x8c\x90\x67\x5e\x18\xc6\x0d\x89\xa8\xb1\xa8\xfe\x10\xe5\xbe\x61\x11\x20\x14\x4c\x17\xca\x7c\x33\x29\x7d\x1c\x6d\xa2\xce\xf1\x0d\x04\x82\xcd\x51\x07\x16\x9a\x72\xb9\xcd\x0d\x80\xb6\x38\x0a\x07\x9a\x72\xbe\xb8\x99\x39\x44\x9a\x5f\xe6\x2f\x96\x15\x46\x2d\x69\xab\xee\x36\x54\x8d\xe7\x27\x0b\xe3\x8a\xfa\xcf\x25\x96\xf8\x96\x85\xcc\x17\x21\x0c\x04\xe6\x73\x67\x6b\xb3\xc6\x08\x25\x87\xf1\x1b\x1d\x54\xd5\x96\x72\xca\xcd\xa5\x19\xad\xcc\xa0\xa2\x19\x15\x6a\x35\x3b\xb0\x7f\xbd\x39\xfb\x1d\xc1\x27\x06\x93\x8d\x20\x8e\x08\x71\xb6\x46\x70\x1f\x39\x64\xf2\x2c\xad\xf3\x5d\xac\x71\xd9\x3c\x45\x6f\xa0\xd8\x2c\x61\x1c\x71\xe3\xef\x4a\xd7\x50\xf3\x5e\x56\xf5\xff\x6b\x1f\x8a\xaf\x59\x3d\x48\x4b\xd0\x9d\xbb\x33\x84\xb7\x79\xbe\x18\xf6\xd5\x70\x3e\x0a\x7f\xdd\x2b\x06\xf1\x5b\x47\xe9\x9e\x53\x61\x0c\xd5\xbe\xd7\xc7\x71\x95\x71\x23\x70\xf7\xa2\x23\x70\x17\x77\xf1\x77\x01\x88\xff\x7d\x04\x20\x9e\x6d\xff\x79\xfe\xff\xf3\xe3\xeb\x8b\xe3\xd7\x83\x93\xdf\xc0\x13\x38\x6c\xff\xbf\x3e\x7b\xd5\xd2\x7f\x3e\x7b\x7b\xf6\x3b\xff\xff\x5f\xe5\xe7\x09\xfe\xff\xe2\xdc\xe3\xba\x58\x0d\x00\x3e\x6e\xd5\xeb\xc1\x89\x1a\x17\x60\xd1\x53\x9d\x59\xeb\x51\xe7\x04\xbc\x43\x34\x78\xab\xae\xa6\x1f\xea\xbd\x72\xfd\xa8\x56\x59\xb5\xc6\x10\x0c\xdf\x99\x0c\xa6\xc3\xca\x2b\xa2\x4b\x81\xab\x12\x7f\xa3\x97\xee\x17\x83\x18\x76\xde\x55\x8b\x43\x95\x42\x1e\x88\xe8\xdf\xe0\xf9\x83\x72\xfd\xb8\x33\xd5\x71\x8a\xbe\x80\x37\xf4\x98\x6e\xd9\xde\x67\x9b\x8e\x02\x32\xac\x45\x0b\x12\x98\x44\x9f\xc1\x85\x42\xd2\x88\x0b\x36\x0f\x18\x93\xaa\xa7\xed\x71\x66\x7b\x6a\xa1\x6d\x66\x3b\x1e\x8d\x31\xb2\x50\xe6\x86\x55\xeb\x77\x1a\xd8\x06\xa3\x57\x62\xfa\x8a\x4d\xd2\x0e\xb4\x71\x56\xed\x29\x2b\x6f\xd4\x35\x89\xe6\x76\x34\x88\x0d\x64\x1b\x44\x67\x01\x05\xef\x6c\x00\x2e\x51\x0b\x79\x74\xce\x39\x22\x19\x2f\x67\x7b\x57\xdb\x3c\x37\x42\xcd\x9a\xac\x83\xc1\x8b\x5b\x40\x80\xb6\xde\x19\x07\xcf\x6c\xbb\xaa\xa8\x39\xb1\xbc\x62\x74\x00\x70\x5b\x83\x15\x88\x5d\xb0\x41\x84\xd4\xba\x87\x96\xc4\xb6\x42\xd3\x8e\x7e\x1a\x29\x22\x07\xe9\xaa\x52\xd9\x7b\x80\x6e\x49\x2c\x85\x6d\xd0\x47\x87\xc7\xf8\x39\x11\x9c\x56\xc1\x47\x81\xb6\x98\x0a\x2c\xfa\xe8\xb5\xa1\xda\x93\x4c\xe8\xb8\x97\x08\x67\xa3\x8c\xb9\x74\xe7\x80\xe6\x5b\x07\x97\x0e\x35\xb8\xfd\x9c\xea\x5c\x30\xd6\x17\x90\xf6\xf4\x8e\xf9\xbd\xde\xda\x1a\x98\x82\x71\x03\xc2\xaf\x91\xc4\x56\x57\x30\x7e\xe5\x36\xf0\x2d\x0c\x5e\x9c\xc7\x6f\x5b\x79\x72\x9e\xb2\xb2\x3f\xa9\xc9\xb6\x6a\xcd\x0c\xe6\xcf\x89\xda\x79\x45\x94\x66\xe0\x61\x03\xff\x1c\x8a\xcb\xfe\x33\x86\x1d\x01\x1e\x55\x47\xd4\xad\x22\x52\xbc\x85\x6a\x34\x1a\xd9\xac\x50\x8f\x7a\x67\x45\xa1\x9a\x40\xa4\x2f\x76\xcf\x18\xee\x01\x34\x37\x6e\x67\x55\x99\x87\x12\xaa\xc5\x43\xad\xad\x65\x19\x36\x80\x79\x63\x7d\x02\x17\xf8\x8a\x4c\x70\x17\x9d\xb3\x11\xc5\x1e\x66\xa7\xd2\xfb\xb2\x84\x69\x5c\x39\xb7\x07\x24\xbf\x71\x4f\x77\xbc\x0c\x14\x05\xad\x49\x01\x4f\x21\x68\x1e\x7d\xa1\x77\xf3\x29\x72\x9e\x94\x2d\x83\xe7\x4f\x63\x99\xea\x42\x55\x86\x63\xe1\x7e\x1c\x31\x73\x6e\xdc\xb0\x75\xb4\x42\x82\x24\xe2\xd3\x86\xc8\xfa\x24\x91\x45\x1e\xc5\x8e\xc8\xef\xa1\x19\x52\xe7\xe7\x01\x38\xce\x0f\x81\x83\xc8\x3f\x71\x1b\xce\x2e\xf0\xcd\x38\xa2\x5c\x4a\xf6\xee\x68\x27\x0d\xd4\x55\x59\x99\xe6\x0e\x88\xd6\xa4\xfa\x49\x3d\x66\x5f\xb3\x41\x57\xa9\x61\xbc\x96\xff\xd7\xaa\xac\xfe\x97\xff\x5e\xd7\x42\x0f\x83\xf9\x93\x7a\xbf\x23\xb1\x77\xa0\xab\xc6\x5d\xd2\x58\xf9\x89\x10\xcf\x67\xf2\xee\x83\x6b\x5b\x8c\xe1\x52\x0c\x0b\x8c\x48\x38\x1a\xba\x56\x1b\x44\xea\xc3\xd7\x81\x7f\x4c\x3c\x9f\x6e\xdb\xb0\x76\x56\xfe\x02\x70\xee\xf1\x7f\xfc\xcb\xbf\xae\x40\x1b\x5f\x3b\xef\x37\xf1\xf2\xe4\x84\xde\x11\x0c\x0a\xcf\x99\x94\xff\xf8\x97\x7f\x25\xc8\x3c\xa5\x5e\x3c\x58\xf5\x6e\x9b\xeb\xba\x15\x5e\x6b\x6c\x43\x18\x28\xf4\x1a\x43\x0f\x6c\x0b\x3e\xbc\xf7\x0c\x25\x85\x08\x3f\xf0\xf7\x9a\x45\xd4\x33\x2c\x2c\xbf\x43\x4a\xf6\xdb\x40\xac\xd8\x1e\x73\x77\xee\xdb\x3a\x63\xea\x05\x7f\xae\xac\x84\x7d\x40\xd8\xfd\x90\x17\xf2\xc3\xe6\x3e\x60\xb1\x0a\x5a\x70\xc9\x57\x71\x3b\xe9\x84\xe7\x57\x0e\x3c\xb0\x9f\x94\x26\x91\xc4\x81\xb2\x6b\x54\x6f\x2b\x55\x3f\x2c\x15\xc6\x68\x22\xf2\x23\x88\x15\x90\x29\x02\xa0\x09\xa9\xef\xd2\x2a\x5b\xb8\x9d\x3d\xcc\x9d\x4f\x7f\x77\x2f\xb9\x1a\x61\x26\xe4\xb1\x91\xf8\x84\x90\x29\xd2\x72\x5b\xe9\x3b\xae\x2e\x20\x76\x02\x38\xb2\xb9\x31\x84\x84\x0a\x21\x96\xfd\xdb\x51\x2c\xfb\x5f\xb2\x1f\x4d\x97\x05\xf0\xcb\xcd\xd5\x86\xd8\xed\xfb\x48\xa2\x21\x54\xb7\x9b\x25\x73\x47\x1f\xc5\x3a\x30\xc8\xa7\x88\x88\x20\x8c\xad\xdd\x55\xc6\x10\x8e\xca\x73\x31\x1c\xbe\x19\x32\xdb\x36\x7a\x7e\xad\x1e\xa9\xa3\x5e\xfc\x0b\x90\x77\x8a\x38\x00\xa1\x01\x8d\x6f\x31\x69\x9e\x7b\xf2\xa6\x32\x35\x63\xc1\x58\x36\x3d\xf1\xfc\x8e\x9e\xc2\xa5\x63\xac\x90\xa4\x20\xcc\xa3\xeb\xee\x17\xb7\xc8\x5a\x08\xaa\x3d\x25\x1d\x01\xca\x7e\xd9\x38\x3c\xdd\xeb\x31\x88\xb4\xff\x55\x0b\x53\x98\x55\x56\x37\x58\x0a\x08\x58\x4e\x94\x53\xa1\xa8\x2c\xb4\xfe\xca\xdf\x87\xa1\xd2\x9d\xcd\xe8\x3d\x0d\x85\x40\x9a\xfb\x9f\x27\xc1\x56\xff\xf1\x2f\xff\xda\x59\xbe\x31\x50\x43\x14\xb2\x09\xef\xc1\xa8\x62\x97\xa1\x78\x1e\x1d\x72\xb3\x6c\x9d\xe5\xba\xe2\xe1\x45\x08\x60\x03\xe2\x57\x56\x4d\x41\xa1\x8e\x7e\x21\xa3\x60\x88\x0d\xb6\x3f\x92\x59\x2f\x25\x04\x15\x05\x79\x6d\x2a\xf8\x0f\x94\x12\x5a\xb6\xe5\x79\x04\x4b\x00\x67\xe1\x25\xca\x14\xcf\x19\x37\xd6\xe2\x32\x12\xdc\x0c\x87\x3a\x7a\x6f\x72\xbf\x8d\x3c\x5b\x04\xd6\xf0\x36\xd5\x97\x9a\x75\x94\x01\xa1\xd9\xd9\xc7\x20\x7e\x80\x35\x7a\x82\x1f\x3d\xe9\xd4\xe8\x69\xcd\x9d\x7b\x48\x0e\xd6\xa7\x07\xeb\x3e\xf1\x4e\x90\xe7\x21\xbb\x3e\x5b\x9b\xa5\x3a\x24\xe7\x23\x08\x90\x0e\x0e\x11\x2e\xa1\xe8\x4e\x7c\xe9\xda\x4f\x9f\xa2\x5d\x02\x70\xff\x5c\x90\x58\x94\x11\x17\x18\xdd\x5e\x49\x07\x65\x49\x63\x68\x16\x55\xa9\x97\x28\xd3\xd4\x96\x85\x72\xad\xdb\x66\x08\x7e\xc8\xac\xba\xd0\xb5\x76\x4b\x92\x9a\x9a\x88\x98\xb2\xf3\x64\x5d\x23\x20\xb3\x11\xb8\xea\xa0\x5e\x56\x2f\x4c\x8e\x57\x57\xaa\x6b\x73\x87\x8e\xc1\x33\x67\x5d\x3c\x2b\xf2\xa3\x78\x77\x9e\x1d\x2d\xfa\x47\xa7\xfd\xe3\xa3\xb3\xbe\xf7\x7f\x0e\x0d\xaf\x20\x47\x1a\xf9\x82\xf5\x79\x44\xde\x7c\xc5\xe4\xcd\x9c\x22\x70\xd7\x63\xc4\xe8\x9c\x28\x9f\x2c\xf3\x55\x21\x9b\xaa\xdc\x38\x1b\x97\x8d\x92\x24\x82\xef\x43\x9d\xea\x83\x11\x84\x63\xb9\x7e\xb4\xce\x81\x5e\x51\xb1\xa1\xa4\x52\xc1\x4f\x0c\xab\x3a\x4b\x73\xa3\x4e\x4f\x3d\x0f\xec\xf8\x66\x22\x7a\x37\x77\x57\xcd\x4e\xe9\x65\x09\x0b\xb9\x2c\xd4\x85\x49\x0d\x68\xb6\x9d\x9d\x24\xea\xf4\x8f\x7f\x7c\x9b\x34\x97\x4f\x16\xdd\x30\x81\xc3\x48\xf0\x2b\x8d\xd8\x1c\xc4\xa3\xf1\x52\x68\xec\xe0\x88\x08\x4d\x1e\xf7\x5f\x4b\xa3\x73\x5e\x2e\x2f\x23\x3e\xb6\x03\x86\xe5\xd3\xc7\xa1\xc8\x4e\xc3\x4d\x23\x38\xb3\x5b\x9b\x51\xe8\x43\xb5\x37\x6a\xc8\xf4\xe8\xaa\xce\x6c\x9d\xa5\xd8\x9c\xda\x00\xe4\x08\x8f\x8b\x25\x2d\xed\x70\x00\x86\x53\xbc\x2e\x5b\x07\x6c\x49\x14\x64\x66\xd9\xb5\x6c\x85\x94\x54\xf3\x22\x0d\x8d\x69\xb0\x39\x12\x53\x51\x27\x5d\xf6\x1e\x53\xa3\x7d\x42\x72\x7a\x9e\xf9\x76\x28\xb3\xff\xbc\xc1\xde\x3d\x6b\xa8\xe9\x1e\x27\x2f\xf4\x72\xaf\x41\xde\xa8\x42\xbc\x13\x2c\x57\x5d\x02\x60\x47\xb6\x1f\xc4\xb5\x8e\x32\x63\xfb\x38\x32\xdd\xfa\x5a\xdd\xc3\x7d\x3f\x50\x91\x81\x45\x2f\xc2\xd0\x63\xb6\xc6\x92\x83\x28\x68\x01\xc8\xf4\x0a\xdc\x64\x55\x97\x8f\x40\x2c\x20\x0b\x61\x97\x0f\xba\xa8\x11\x7b\xa0\xd6\x65\x61\x6a\x0d\x5c\xff\xeb\x0d\xcb\xe1\x7d\xc7\x29\x66\x48\xdc\x63\xff\xc8\xae\xda\x4b\xef\xb9\x06\xc4\xc2\x13\x01\x42\x4a\xf0\xd8\xde\x6b\xb8\xa1\xc5\xce\xc7\xc1\xc8\x6c\x63\x8c\x04\xa6\x20\x70\x5a\x6c\xf4\x8e\xa9\xbe\x3a\xbb\xbd\x8f\x98\x8b\xfb\xc8\x33\x92\x0d\xd4\xec\x1e\xe1\x08\x30\xe5\xa1\xa0\x5a\x6e\x2e\xe1\x47\x10\xdb\x19\xc9\x2b\x01\xb3\x07\xb0\x24\x50\x91\x1e\x38\x38\xb6\xdb\xee\x68\xec\xb4\xe0\x54\xc5\xc2\x86\x5e\x46\x25\xa2\x64\x8f\xef\xc4\xb8\x1c\x74\x99\x59\x6b\x98\x00\x34\x89\xc9\xd5\x12\x16\x5d\xa8\x44\xbd\x8e\x67\xeb\x5b\xb7\xcd\xcf\xb8\xbb\xc1\xcd\xe4\xc0\x17\x32\xba\xc1\x21\xee\xa3\x4d\xf4\x61\xe0\x79\x4b\x69\x38\xc4\xc3\x91\x0e\x5f\x6d\x72\x4d\x00\x13\x70\x95\x81\xbf\x29\x12\xa3\x49\xdd\x45\xc6\x6c\x85\x6b\x9e\xa2\x3f\x0f\x0e\x5d\xf1\x34\x13\x2c\xa5\x16\x40\x8c\xc1\xd8\x68\x04\x89\x2f\x60\x3f\xb9\x5b\xf5\x8f\x6f\x5f\xfe\xf1\xe5\xe8\x9c\x7b\x31\xda\xba\x1b\x52\x17\xea\x46\x57\x79\xa6\x61\x7d\x41\x6c\x75\x45\x66\xe3\xb6\x48\x33\x40\x4e\x9e\x9e\xaa\x2b\x5d\xa5\xf7\x70\x83\x71\x49\x15\xa6\x08\x36\xa1\x78\xbe\x5c\xf9\x43\x1b\xf9\xaf\xdc\x23\x97\x58\x61\x05\x37\xde\x36\x4d\x8d\x01\xb2\x51\x6d\xd5\xa3\xc9\x21\x2a\x46\x17\x93\xb5\xc8\xc6\x96\xef\xa4\x80\x8d\x67\x36\xdb\xa1\xe1\x47\xb7\x3c\xa8\xb2\xf1\x78\xb1\x70\xc5\x61\x11\xc3\x27\x5c\xcf\xfd\x47\x19\x1e\xc0\xf7\xe4\xa2\x55\xce\x47\x2f\x91\xf8\xcd\xbd\x31\x2b\xee\x5a\xfe\xc9\x19\xf8\x27\xa1\xda\x19\x3d\x93\x4b\xc9\xcb\x29\x74\xae\x4e\xbf\x4f\xb6\xae\xeb\x20\xfb\xe5\x0a\x76\x5e\x06\x04\xa9\xe9\x1b\xa2\x76\x22\x4c\xbb\x57\xa7\xae\xc3\x2f\xed\x3e\x4b\xeb\x52\x08\x9f\x29\xa5\x86\x03\x01\x31\x82\x03\xf4\x5e\xef\x33\xed\x93\xae\x6a\xac\x04\x8e\xe7\xc6\xd9\x29\xe3\xef\x50\x0a\x1c\xbd\xf3\xfd\x40\xc9\x37\xfa\xf7\x23\x4a\xd7\x5d\x4b\xd0\x88\x0e\x57\xe4\x89\x57\x89\xf9\x3c\x3b\x64\xaf\x3d\x47\x06\xeb\x80\xb5\xd7\x32\x0a\x92\xce\x08\x83\xcf\xbe\xc1\xe7\x83\xd6\x0e\xa5\x1d\xa0\xf0\x0f\xdc\x93\xb5\x7b\x1c\xdc\x15\xe0\xca\xef\x73\xbe\xf1\xe7\x15\x32\x63\x63\x5e\x04\x49\x4c\x3b\xd7\x24\xf8\x61\x5d\x9e\xc1\xdb\x23\xdd\x17\xcf\x7b\x3d\x50\x57\x4d\x95\xa6\x77\x41\xee\xa9\xa9\x06\x95\xe7\xe5\x23\x8b\x4a\x05\x93\x8f\xd3\x1a\xb8\xda\x9f\xb1\x38\x7f\x91\xa2\x15\x09\x72\xc5\x77\xc9\xbe\x96\x46\x1c\xb1\x04\xf0\x8e\x1a\x4d\xfa\x65\x6c\x9c\x3b\x8b\x1f\xa7\xcb\x19\x87\xd6\x9a\x4a\x88\x6f\xaa\xb2\x8a\xad\xb8\x55\x59\x2d\x32\x9c\xce\x28\xc8\xf2\x9c\xc6\x1c\x1a\x1b\x19\x61\x7d\xd6\xc3\x82\x07\xf5\xa4\xdf\xf6\x4c\x9b\xcc\x66\xb0\x1e\xa9\x47\x8d\xe9\x0f\xf9\xab\x05\x21\xf3\x83\xc3\xa9\xfb\x47\xaf\xfb\xaa\x00\xa2\x2e\xda\xd1\xb6\xb5\x85\xc5\xca\x7b\x33\x50\x17\xe5\x63\x61\xeb\xca\xe8\xb5\x20\x07\x18\x34\x0f\xa8\x09\xa8\x38\xb5\x85\x5b\xdd\xf9\xde\x76\x79\xd4\x08\x68\xd7\x02\x91\xf3\x7e\x8b\x3d\xe2\x83\xf7\x51\x33\x5d\x90\x6e\xd4\x61\xa9\xd8\x43\xf7\xd7\x77\xdd\x1e\x83\xe6\xe1\x78\xed\x16\xac\x18\x18\xa9\x56\xf6\x94\xba\x95\xe0\xc3\x2d\x25\x3b\xb9\x67\x25\x97\xcd\x21\xd5\x6a\x38\xce\xdc\x97\x9f\xf4\xfc\xeb\x32\xd9\x17\xf5\x71\xc7\x27\xe2\xe6\x7c\x8b\x6d\x4b\x15\xab\x39\x5e\x64\xd6\x3e\x3d\x57\x62\x8c\xde\xc2\x00\x99\x62\x59\x56\x96\x34\x9e\x9a\x32\xbb\x8d\x93\x50\x72\x21\x53\xbe\x81\x04\xa3\xeb\x6a\x8b\x71\xdf\x38\x3d\x45\xdb\x1f\x47\x36\x27\xa9\x67\x0a\x07\x93\x26\x1a\xfe\xe2\x09\x97\x30\x43\x35\xf8\x02\x1d\x29\x77\xc2\x63\xc8\x0d\x85\x77\x40\xe8\x1b\xbb\x81\xf1\x45\x76\x79\xcb\xd5\x2a\x83\xcb\xcd\xd6\xba\xde\xba\x51\x6a\x52\x96\x57\x9c\x76\x11\x4a\x98\x90\xb9\x40\x46\x11\x29\xd3\xa3\xe3\x9a\x78\x2f\x6b\xe7\xb6\xeb\x69\xff\x68\xd8\x3f\xca\xfa\x22\x04\x37\x91\x29\xe3\xc8\x3c\xba\x2a\x2b\xcd\x89\xd9\xe0\x44\x78\x8f\x1d\xb9\x6b\x6b\x73\x87\x41\x1e\x8e\x39\xb5\x60\x1a\x1d\x27\x4e\x41\x72\x7d\x68\xcf\xc3\xd7\x37\x55\xf6\xa0\xd3\x5d\xa3\xcc\x9f\x5d\xb6\x8d\xa9\x2c\x08\xba\xd7\x2c\x8e\xfc\x4e\xd0\xc9\xc5\x4a\x57\x84\xbd\x68\x8c\xe0\x33\x0f\x7f\x19\x7f\xef\x0a\xd1\x86\x5c\x30\xc6\x15\xba\xf8\xc9\xe1\xca\x7c\xce\xbd\x18\xcc\x1f\x1f\x68\x8e\x0d\x9a\x1b\x5d\xb3\x73\x10\x28\x6f\x45\x40\xf1\x79\xe3\xdd\xb0\x25\xbe\x6b\xb4\x76\x2d\x81\x4f\x29\xc8\xc9\x02\x17\x9c\x03\x7b\x62\xf7\x07\x6d\x50\x8c\x35\xa0\x2e\x28\xf1\x5d\x82\x99\x8f\x0a\x1a\x70\xa8\xa0\x26\x68\x20\x4c\x7b\x28\xf3\x6d\x01\xfe\x37\xb5\x0f\xd9\x29\xbd\xe4\x29\xc1\x87\x23\x49\x4f\x78\x52\x7a\x6f\xd6\x20\xe4\x81\xf5\x68\xa8\x25\xa4\x19\x0f\xee\xbb\x1c\xea\xeb\xbd\x1c\x44\x67\xf7\x71\x85\xf0\x18\x44\xa4\xd8\xc4\xa4\xd6\x1d\x22\x6f\x16\xbf\xed\xb7\x6c\x5b\x8e\xcd\x2b\x79\xf1\xa9\xf3\xd8\x48\x84\x43\xe9\xa9\x63\xf7\xa0\x96\xe5\xbe\xf2\x09\x99\xde\xa9\x63\xe8\xbf\x3f\x23\x48\xae\xee\xa0\x0f\xc1\x75\x84\x1d\x7e\x48\x60\x75\xf3\xef\x07\xe2\x26\xb0\x65\x49\xe3\xab\xb5\x05\x7d\x90\xa5\xf5\xae\xf8\x0d\x18\x76\x61\x82\x99\x98\xc1\x8a\xb0\x51\x10\x6c\x3b\x14\xdf\xf3\x21\xdc\x67\x9c\xbc\xc9\x5e\x11\xae\xa0\x93\xd7\xea\xcc\x91\x48\xb0\xef\x82\x4c\x1c\x5c\xaf\xfe\x85\xfd\x77\xad\x8e\x65\x03\xe2\x50\x8a\xf8\x9d\xda\x1f\x83\xcf\x11\x45\x4b\x20\x78\x0a\xda\x0c\xf1\x51\xd1\x7e\xc0\xc3\xa1\xef\xef\xd7\x9c\x6c\x3d\x08\x9e\x73\x3b\x1d\x83\x81\xbf\xdb\x98\x0a\xeb\x62\xcb\xbd\x5e\xab\x3c\xa5\xba\x25\xdd\xde\x35\xcd\x28\xcf\xd5\x92\xe1\xaa\xf4\x49\xbb\xfd\xf3\x4b\x4b\x50\x17\x9e\x86\x9d\xa8\x44\x81\x72\x8e\x64\xff\x23\x93\xb8\xed\xdd\x9e\x0f\x62\x96\x98\xce\xed\xff\x9c\x6b\x51\x30\xe2\x90\x49\xf9\xad\x8e\x44\x59\xdb\xc3\xd7\xe9\x88\x8a\x2d\x7a\xc8\xed\x15\xae\x29\x80\x39\x3a\x82\x89\x6d\xd3\xaa\x2e\x69\xb3\x1f\xb0\xf3\xcf\x82\xd5\x6a\x75\x9d\xd9\xd5\x8e\xca\x5f\xbc\x21\xda\xb6\x4b\xf6\xef\x9d\x88\xa7\x8d\xf9\xd2\x48\x43\x90\xcc\x6d\x18\x28\x9f\xfd\x7d\xe2\x40\x42\xaf\xc8\xa3\x81\x82\x9c\x5e\x2c\x00\xb9\xa7\xe5\x8b\x9d\xa0\x49\xed\x5e\xd1\xda\xdd\x20\x58\x4c\x42\x8c\x36\x84\x14\x03\xd3\x89\xb1\x29\x12\x94\x1a\x5d\xd0\xe3\xd5\xfe\xe3\x42\x48\x5d\x32\x43\x6c\xe1\x05\x5c\x24\x2a\x57\x42\x60\xda\x16\xe0\xb3\xb6\x57\xeb\x1a\x7a\x8d\xf1\xb5\xfd\x31\x52\xf8\xc6\xe7\x76\xa6\x78\x1a\xab\x50\x1f\x8a\xb2\x7e\x67\x0e\x46\xa8\x2b\xaf\x0e\xac\xf4\xc8\x65\x3d\xed\xcb\x40\x5d\x2d\x25\x9f\xcc\x37\x42\x82\x00\x90\x30\x91\x81\xaa\x10\x29\x03\x2b\xa2\x52\xda\x5d\xa1\xb6\xd6\xa8\x65\x41\x25\xa3\xa1\xdc\x9d\x68\x07\xe9\xdf\x1c\x9f\x7d\x2a\x9e\x25\x15\x49\xa3\xd8\x51\xf7\x9e\x7b\x17\xcc\x78\x3a\xf2\xbc\xa2\xf3\x33\x1a\xe9\x1b\xe5\x5b\x0b\xe0\x06\xff\xeb\x68\x43\xc1\x09\x71\x30\x05\xce\x44\xb2\xbf\xf0\x01\xea\x88\x8d\x61\x20\x06\x0f\xb1\x64\x6e\x1d\xa0\xea\x5b\x23\x20\x4e\xe3\x54\x50\x16\xc8\x18\xdb\xe1\xb3\x87\x47\xee\x2f\x9f\x5c\x58\xfe\x87\x0e\xdc\x28\x7c\xf2\x1a\x0d\x1c\xe2\xeb\x8d\xca\x03\x2a\x83\x29\x0c\x58\xfe\xed\x74\x78\xd7\xb1\xdc\x81\xcf\x68\xec\x3a\x82\xa9\x3e\x85\x08\x90\x1b\xfe\x0d\x02\x7e\xa2\x2b\xbe\x21\xa8\x29\x65\x10\x57\x42\x06\x31\xec\xcb\x5b\x94\x48\x0a\x50\x1a\x6b\x36\xba\x42\x0e\x4b\xe8\x0f\x72\x51\xb5\x0e\xba\x67\x79\x75\x2c\xe5\xd5\x7d\xbf\xdb\xe3\x0c\x5b\xa9\xed\xb1\x4f\x3c\x35\xc4\x76\x9a\x72\x45\xe0\x5c\xf8\x2e\x92\x25\xf0\x35\xc3\x7b\x26\x35\x55\xb1\x17\x5a\x15\xbc\x1b\x32\xb5\x13\x66\xd7\x4a\x82\x9b\x12\xb2\xea\x0d\x18\x71\x37\x40\x25\x6e\x0a\x48\xe1\xba\xbb\xaf\x4a\xef\x75\x51\xd3\x58\x27\x6a\x95\xd5\x85\x1b\x63\xd4\x14\x10\x5c\xf7\x74\xb6\x60\x82\x21\x2b\x56\x55\x56\xdc\x91\x10\x97\x00\x6c\xe4\xe8\x65\x7a\xa7\x7b\x69\x56\x26\x75\x3b\x5a\xa7\xe9\xb6\x02\xa7\x9c\x31\x8e\x30\x54\xa8\x59\x2b\x1e\x60\xaa\xaa\xac\x84\x77\x07\xb5\xaf\x75\x08\xe8\x3a\x23\xb1\x7c\x30\x15\x82\x28\xf1\x82\x08\x86\xa3\x8d\x2d\x47\xef\xd8\x52\xe4\xd9\xab\xca\xc9\x0c\x04\x6a\x73\x87\x85\xc9\x01\x32\x79\x73\x88\x18\xc7\x3e\x9f\x37\x2b\xdc\x12\x30\x0f\x28\x30\x4e\x95\xf8\x7e\x71\xb5\xc5\x93\x3a\xf4\x92\x8e\x9e\x80\x18\x15\xe6\x2e\xcf\xee\xdc\x48\xf5\x63\x44\x99\x17\x5a\x02\x57\x38\x92\x4c\xe2\x5f\x05\xf1\xa4\x24\x96\x4e\x4a\xd4\x66\x5b\x64\x58\xd7\x60\xbe\x99\xf5\x26\xd7\x72\x69\xa9\xbc\xb4\x90\x0b\x4c\x4b\x00\xd5\x9a\x6f\x1b\xc2\xbf\x8a\x92\x16\x56\x5d\x72\x0d\xde\x93\x50\x28\x0f\x5f\xbe\x09\x2a\x0e\x64\xab\x36\x00\x62\x61\x4c\x01\x55\x4c\x60\xba\x51\xf2\x16\x86\xdd\x4b\xce\x81\x1f\xfd\x8c\x86\xf2\x82\xd1\x12\x37\xe3\x56\xad\x2f\xd4\xe1\x62\xab\xa7\xd6\x8b\xf8\xfe\xa1\xf5\x92\x62\xda\x60\x9f\x67\x03\xc7\xc7\xbe\xa6\xf8\xab\x1b\xeb\xf6\x85\x00\x5c\x00\x9d\x4a\x04\x21\x62\xa8\xf6\x1d\x75\xeb\x12\x88\x28\x11\xdf\x06\xbc\xbe\xdf\xb2\x35\x28\x4a\xe8\xc2\xed\xbf\x32\xdf\xd6\x51\x43\x41\x9a\x8f\x04\xe3\x56\x71\x39\x53\xeb\x70\x7f\x0b\x87\xfb\xdc\x50\x6d\x9a\x10\x5f\x1d\x34\xd4\x57\x1b\xab\x82\xe1\x48\x6c\x70\x85\x94\xd4\x13\x90\xc7\x86\xa6\xdc\x27\x8e\xdf\xd1\x05\xbc\xd2\x59\xde\x4c\x8f\xed\x4b\xbd\x16\x78\x37\x3e\x85\x87\xd9\x27\x05\x2b\x8e\x06\x5c\x5c\xe1\x69\xb2\x58\xa1\x7d\xa5\xb8\xb5\x2d\x54\x2c\xf1\xc5\x32\xcf\x06\xfe\x44\x65\xb2\x02\x78\x82\xec\x4f\x51\xb0\x24\x4e\x3f\x68\x69\x40\xe0\x0b\x1f\xb2\x92\x60\x93\x99\x55\xe9\x16\x02\xc6\x21\x96\x5b\xfb\xdf\xc2\xe0\x64\x85\x7a\x75\xa2\x96\x50\x24\x44\x18\x64\x3e\x68\xbd\x4b\xe0\x1f\xf8\x4e\x95\x55\xe4\xa0\x01\x94\x96\x2e\xaa\xd0\x60\x14\x0a\x6c\xa0\x52\x5f\x3c\xed\x4a\x46\x96\xcd\xdb\xa3\x45\x5f\xe4\x42\x51\x83\x52\xc4\xd2\xe4\x61\xe1\x36\x22\x0a\xdf\x96\xca\x1a\xf3\xd5\xb9\x35\x66\xc9\xcb\x0b\x3a\xe5\xfb\xf0\x54\x3a\x25\x3d\x9c\xe5\x6d\xbd\x17\x4a\x90\x30\xa5\xd2\x3d\xdb\x54\x9a\x42\xf6\x4a\x77\x46\xa5\xda\x23\xf9\xda\x61\x8e\x48\xfd\x57\x1f\xbc\xf6\x39\x14\xaf\xd9\x17\xd6\xec\x81\xbe\x2e\x63\xed\xde\x86\x70\x2f\x6b\xf6\x76\xe9\xf5\x76\x3c\x4f\x1e\x0b\x3f\xc2\xb1\x80\x49\x81\xb9\x4f\x69\x9d\x77\x05\x05\xa3\xe4\xea\xb3\x04\x1b\x9f\x4c\x50\x05\x48\x11\xba\xae\xa8\xa0\x0a\x06\x64\x88\x5f\x42\xf0\x7e\x29\xf6\xf0\xd0\xbd\x05\x41\xdc\x60\x4d\x27\x2d\x89\x4a\x0e\xf9\xa3\xb1\x1d\xca\x4d\xbb\x67\x0a\x6a\xbf\x50\x9d\xd6\x9d\x0e\xee\xc0\xae\x82\xdd\x4a\x30\x23\x88\xd5\x2c\xcd\xc6\x14\x4b\x91\xc7\xfa\xde\x2c\xa0\x1c\xfa\x3f\xc0\xd0\x8f\xf9\xaa\x68\x9e\xc5\x4f\xee\xbf\x3d\x68\x04\x5c\x14\xd1\xfc\xc8\xeb\xa8\x2e\x9d\x9f\x8b\x4e\x2e\x5c\x6b\x89\x4f\xe7\x25\x22\xd5\x18\x65\x11\x61\x5e\x0f\x26\xc2\x48\xd3\x65\x9b\x2f\x55\xae\x1f\xdd\x7d\xbc\xc3\xda\x9d\xa5\xf1\x66\xd2\x73\xe2\x4d\xcf\x31\xe2\xf6\x89\xe8\xb6\xe1\x11\xa4\xeb\x1a\xe9\xe8\x0a\x61\xc7\x45\x53\x31\xfc\xbb\x55\x69\xb3\x3a\xd2\x9f\xe5\xb2\xb5\xd0\xb6\x54\x17\x34\x07\xfc\xec\xf8\xfd\xd6\x20\x45\x13\x65\xa2\x3b\x1c\x3d\x1a\x3c\x3c\x56\x79\x0d\x1f\x52\xf4\x45\x64\xc1\x7e\x88\x49\xac\x8e\xeb\xff\xbe\x6f\x18\x99\x42\x38\x16\xc7\x75\x97\xf7\xb6\x32\xe2\xfe\xee\xd2\xc9\x6d\xee\x61\xa8\x29\xea\xbe\x6d\x96\xbf\x30\xc9\xdb\x2a\xef\x11\xa6\x9a\xbb\xf3\x12\x4e\x1f\x81\x8d\x94\xd0\xd2\xc9\x1e\xb2\xdc\xdc\x91\x71\x97\xc1\x19\x84\x0a\xc6\x51\x38\xaa\x99\x92\xfd\x52\x6e\x65\xfe\xc7\xa3\x07\x3c\x42\xcf\x2d\x8f\xe0\x45\xfe\x79\x5b\x65\x76\x99\xa5\x8c\x03\xf7\xf8\x92\x67\x09\xc6\x66\x75\xab\x2a\xbc\xa5\x89\x9a\x74\x55\xf2\xef\x50\x4c\x1c\x22\x93\xd0\x13\x2a\xe9\xec\x78\x20\xae\x63\x0e\x5a\xd7\x5e\x41\xd3\x72\x79\x0d\x96\x00\x80\xb1\x80\x42\x53\xb4\x18\xb8\x4e\x89\x62\xed\x3d\x3f\x9b\x3d\x42\x2d\x7d\xf3\x27\xe4\x93\xa5\xee\xb0\x4f\x97\x74\x07\xc4\x28\xd1\x65\x09\xea\xf6\x52\xfe\xf4\x84\x97\xc5\x05\xfe\xed\xc2\x70\x18\x9f\xf1\x60\xcf\xd5\x5e\x45\x05\x61\x51\xd3\x72\xaf\xab\x50\xb1\xfb\x54\xbb\x61\x42\x65\x98\x23\x62\xfb\xe9\xee\x78\x99\x67\xa9\x5b\x65\x41\xa8\x94\xab\xf6\x1b\x95\x83\xfc\xc9\x8e\xf9\x0d\x76\x16\x23\x75\xe0\x65\xe2\x70\x7e\x8e\x02\x2c\xe5\x25\xbf\x4b\xff\x15\xd6\x4f\xa7\xfe\xeb\x13\x2e\x71\x07\x64\x1a\xee\x93\x42\x80\x8d\x62\x14\x12\x69\x00\xed\x59\xb4\x51\x1f\xbe\xc7\x0e\x10\x11\x1d\x1a\xaf\x56\xa9\xec\x33\xae\x5d\x67\x15\xdc\x55\x7a\x73\x1f\xe6\x22\x22\x18\xa8\x5b\x44\x07\xf6\x99\x32\xb2\x1d\x4b\xe1\x77\x8e\xd1\xe7\xfe\x0c\x5e\x2e\xcd\xa6\x32\x70\x8c\xfc\xaf\xe1\xc7\x9b\xcb\xe3\x57\xbf\x3a\x07\xd0\x41\xfe\x9f\xd3\x93\xb3\x57\x6f\xcf\x1a\xfc\x3f\xaf\x4f\x5f\xbd\xf9\x9d\xff\xe7\xaf\xf1\xf3\xf1\xfa\x56\x0d\x3f\x7c\x18\x4d\x27\xea\xe3\xe8\x7a\x34\x1d\x5e\xaa\x9b\xdb\xf7\x97\xe3\x73\x16\x44\x7b\xf1\x33\xd1\x06\xbf\x4a\xd4\xe9\x1f\xd5\x75\xf9\xc0\x15\x63\x27\x3f\x4a\xf2\xcb\x73\x20\xbf\xfc\x51\x7d\xa8\x8c\x20\x64\xfb\xe0\x5c\x1c\x3a\xd0\x80\xfb\xf9\x6f\xef\xeb\x7a\xa3\xac\xfa\xe9\xe5\xcb\x95\x5d\xc1\xb1\xfd\x77\x2f\x00\x99\xe8\xee\xdb\xcc\x8a\x0b\x81\x4a\x14\x9f\x25\x22\x25\x58\x4a\x99\xb7\x11\x61\x43\x50\x5f\x82\xf4\x1a\x8d\x08\xd8\xe0\x85\x97\xb5\x9d\x13\x69\xf3\xd0\x39\x5d\xe5\x5e\xee\x66\x67\x27\x21\x38\xdd\xb5\x2b\x37\x2b\x0f\x2b\x8a\x99\xf0\x02\x03\xcc\xd7\xac\x58\x5a\xd6\xce\xb4\x09\x03\x8f\xd1\x6c\x96\xca\x7d\xa6\xb0\x28\x86\x47\x4c\x7e\xb2\x48\x86\xbc\xbd\x7a\xc7\xe8\x75\xd6\x52\x65\x49\x52\xc0\xe1\x84\xf7\xa3\x5e\x9e\x3f\xf7\x91\x65\xd0\xd6\x5d\xed\xe3\x3c\x26\x33\xd9\xb8\xbf\xca\x66\xd5\xce\x5a\xd7\x8f\x9a\x94\x75\x58\x54\xd0\x13\xe1\x80\xa9\x8c\x55\x4a\x54\xf8\xf0\xd5\x0e\xd4\xfb\x1d\x55\x8b\x5b\xe7\x1b\x6d\xab\x3d\x03\xda\x20\x85\x21\x7d\x4c\x5d\xd4\xc6\x3c\xfd\x3a\xe7\x08\x48\xaa\x6f\xcd\x5c\xe1\xc7\xc7\xec\x65\xc0\x88\x42\x9c\x69\x0d\xaa\x28\xee\x71\x61\x10\x98\xb9\xd1\x5d\x95\x5b\x6b\x2a\x3b\x78\xf1\xf9\xde\x14\xea\x11\xf8\x16\xf4\x57\x10\x2d\x92\xdf\x00\x81\x46\x5d\x91\xfe\x6d\x45\x82\x8f\xd4\xc6\x84\xab\xc6\x52\x62\xb2\x38\xd4\x65\x39\xc2\xa1\xa5\x5e\xf6\x05\x03\x3d\x42\xc3\xb1\x2e\xe5\xfa\x0f\xcb\x3e\xee\xd0\x11\x8d\x4e\x75\xe7\xc9\x40\x01\x1f\xe3\x1e\xf9\x98\xd9\xfb\x7e\x12\x5e\xc1\xb0\x1c\x49\xe6\x08\xe5\xb6\x05\x30\x25\xba\xbd\x42\x5f\xd4\xce\x50\xa9\xc5\x57\xdd\x67\xc4\x94\xfb\xd7\x53\x14\x7c\x93\x99\x14\x5b\x97\x01\xd6\xa0\x30\x8f\xd8\x4e\x9a\x1e\x5f\xd8\x4f\x8f\xfb\x5a\x94\x8f\xfe\xb9\x4b\x30\x63\x21\xac\xe8\x0c\x91\xc1\x8b\x0b\xf3\x60\x72\xb7\x25\x6c\x20\x12\x39\xb4\xa0\x58\xc1\x74\x27\xc2\x9e\xb8\x8f\x1e\x4b\x65\x6b\xb3\xb1\x3f\xa9\xa3\xd3\x3e\x43\x19\x05\x2f\x47\x11\xf5\x06\x1b\x79\x74\xd6\xa7\xc0\xd7\x0e\x52\xe0\x42\x81\x0d\x13\xb6\x48\xd2\xe5\xfe\x48\xbe\x4c\x84\x96\x75\x4f\x4f\xe4\xcc\x11\xaa\xd2\xf3\xb7\x1b\xb1\x65\x87\xca\x1a\xe7\x54\x22\xa7\x0f\xb0\x17\x80\x05\x65\x56\x06\xcb\x79\xdc\x5a\x85\x75\xfa\x83\x5f\x17\x19\x13\x01\x48\x49\x53\x88\x1d\x40\x25\x01\x16\xee\x9a\x68\x9b\x90\x9b\x8d\x4a\x58\x98\x92\xf0\x08\xef\x58\xc6\x16\x19\x60\xca\x75\x93\xae\x95\x93\x5f\x61\x62\x4a\xa9\xb1\x3a\x50\x57\xa8\xd0\xe3\xff\xde\x5a\xa8\xee\x7f\xf7\x46\x57\xb5\x29\xc8\x33\x16\x3c\x23\xe4\x05\x84\x22\x31\x71\x24\xca\x60\x78\x7c\x12\xfa\x67\x6f\x09\x04\x13\x1f\x8d\x96\x6c\x50\xd2\x2d\x76\x46\xa4\x08\xa3\x03\x7d\xf0\x96\x98\x6d\x0f\x70\xf7\xb3\x1a\x37\x55\x00\xe8\x96\xe6\x00\xe6\x3c\x50\x2a\x55\xda\xb3\x54\x84\x97\xc1\x32\xd3\x7c\x5c\xb3\xcd\x0f\x75\x01\x41\x06\xd7\xbd\x41\x6e\xcb\xc8\xb5\x1b\x3c\xff\xaa\xf2\x87\x4c\x74\xe7\x84\xab\xc6\xd7\xa5\x43\x86\x29\xc5\xaa\xb8\xfa\x5e\x70\x38\xc8\x56\xe0\x52\xb0\xed\xc2\x44\x7f\x39\x01\xdd\xad\xaf\xb8\xac\x3d\x29\x6d\x89\x49\x96\xe6\x65\x25\x4a\x3b\xeb\x06\xa7\x6e\xa4\xa1\x25\x46\x57\x48\x60\x56\xfe\xfd\xb0\x25\xf0\x2b\xba\xa6\x87\xc3\x4c\x42\xe0\xc8\xf8\x7a\x4d\x66\x32\x6a\x3d\x36\xc1\x49\xc1\x8f\xe5\x5c\x31\x09\xa4\xb5\xf8\xb4\x84\xb6\x79\x7b\x42\xa9\x09\xcf\x68\xfb\xe0\xc5\xb0\x50\xc0\x26\x17\x44\x8c\x49\xb8\xdb\x7d\xfc\xf0\x64\x02\xd8\xc5\xfb\xbe\x8b\x1d\x7d\x3c\x51\x8f\xda\x46\x77\x09\x72\x05\x83\xdc\x25\x23\xc2\xef\x4a\x9d\x5b\xce\xa1\x3b\xfb\x25\x04\x96\xf3\x00\x33\xaf\x95\x6e\xaa\x43\x70\x93\x6e\x2e\xd1\x8e\xa2\x7f\xdf\x43\x7d\x2c\x90\xf0\x2e\x61\x52\x1f\xf7\x7f\x91\x0e\x49\xde\x36\x95\x09\x68\xe3\x0e\x49\xae\xbf\x40\xe4\x77\xbf\xc6\x6f\x97\x98\xef\x1e\x7d\xdd\xde\x5c\x9c\xef\x3d\x81\xdf\xe4\xfe\xbd\xe2\x1e\x3e\xb9\xfd\xf0\x79\xde\x36\xee\x61\x0a\xa5\xc1\xd3\x71\x9c\x67\x5f\x0d\xb2\x3a\xc4\xe1\xb3\x3d\x96\x23\xd5\x15\x58\xb3\xce\xdc\x98\x6c\xd3\x1a\xa2\x79\xf6\xab\x6f\x7e\x90\xe8\x6d\x88\x02\xfb\x77\xc2\xc6\x85\x5d\xd8\x85\xb3\xf4\x25\xa5\x23\x29\x8f\x0b\xcb\x66\xb9\xac\x8c\x25\x59\xb8\xde\xae\xdc\xf6\x06\x1c\xbc\x32\xc6\xf6\x60\xfc\x7b\xa1\x50\xa9\x17\xa2\x8c\x0c\x4f\x82\xf0\x43\x59\xdd\xe9\x22\xfb\x67\x1d\x06\x7d\x5e\xaa\x1e\x5e\x87\x3d\xd6\x9b\xf5\x95\xdf\x60\xfb\x33\xb1\x8d\x5e\xea\x4d\xcd\xb0\x23\x19\x32\x20\xbd\x7a\x67\x99\x6b\x7b\x1f\x30\x7d\x78\x75\xf0\xf5\x1e\x2e\xe6\x44\x82\xcb\x61\xab\xe2\x69\x0e\xc1\x47\x65\xbe\xe9\x14\xcd\x02\xbc\x0d\xc2\x35\xc4\xfa\x97\xb4\x6b\x35\xb5\x5b\xec\xf1\x1e\x37\xc9\xe8\x2a\xcf\x58\xe9\x1e\xb0\x26\xf0\x5f\x3d\x46\x68\xf6\x5a\x9f\x82\xb1\x18\xaa\x1e\x2b\x0f\xb8\xdf\xf5\x68\x24\x84\xb6\xf2\xb6\xf0\xef\x94\x82\x78\x4f\xe8\xf4\xba\x31\xde\x54\xe5\x46\xdf\xe9\xda\xb4\x87\x79\x09\x6b\x04\x43\xc8\x54\x6b\x49\x77\x43\x3b\x01\x91\xb0\x7a\xbb\x33\x5a\x51\xa1\x30\x14\x28\xb0\xfd\x92\xe5\x3b\x06\x84\x10\x03\xa5\xc7\xd3\x70\x94\x30\x50\xc9\x45\x4a\xd0\x09\xab\x32\x20\x61\x39\x79\x6d\x70\x3c\x43\xcd\x42\x8d\xa0\x19\x5c\x30\x78\x05\x43\x3d\x0c\x49\xf8\x0e\x5c\xb7\xa1\x9b\xc8\x38\x40\x70\xd2\xee\x23\xe3\xe8\x90\x8e\x42\x3f\xf1\x97\x7c\x77\x21\x3e\x83\x90\x95\x75\xe6\x43\x5a\x6e\x8b\x1a\x24\x2c\xca\x96\xd0\x33\x56\x92\xfb\x89\x48\xcb\xe2\xc1\x34\x17\xbb\xc7\x4e\x11\x2d\x0c\x77\x01\x65\x2b\x01\x6a\xcb\x8f\x66\xc5\x45\xf6\x1c\x02\xab\x15\x6b\x30\xab\x2b\x43\x5e\x55\xa5\x65\xe8\x10\x6e\xca\xa8\x8a\x84\x46\x94\x2e\x66\x52\x96\x28\x4a\xa2\x77\x22\x70\x04\x59\xb1\xe4\x3a\x63\xf3\xb9\xaa\x7c\x58\x84\xf7\x3c\xe0\x55\x8c\xbf\x58\xe9\xd4\x30\x63\x82\x55\xbd\xa1\xd0\x5a\xbe\x04\x43\xf9\x1a\xa5\x46\x7b\x0d\x4c\x07\x0b\xd9\xfa\xb9\xd3\xf8\xc6\x22\xe3\xfa\x9e\x4d\x55\xae\xb3\x02\x64\x1b\xd5\x43\x86\xd7\xf4\xca\xa0\xde\x28\x7c\xdb\x59\xf7\xfe\xcd\x4f\xe8\x3c\x07\x2b\xbf\x36\x79\x6e\xbd\x3d\xe1\xe9\x4a\x3c\xbf\x05\xcb\x37\xfb\x20\x39\xcc\xde\x11\x2d\xd7\x8e\x4e\x34\x80\x5a\x8c\x4e\x60\x1f\xcc\x13\xda\x91\x54\xb6\x1b\xd5\xf0\xdc\xf6\x99\x8c\x2d\x25\x15\x88\x87\xcc\x3c\xee\x51\x86\xf6\xa9\xb4\x30\x0d\x84\xdb\xc3\x1c\x0f\x0a\x2b\x40\x1f\x9d\xe1\xa6\xe1\x8e\xa9\x54\xb9\x21\xce\x35\xcf\x2b\xa8\xd6\xa6\xd8\x26\xe8\x55\xe3\x80\xab\xac\x76\xfe\x24\x91\x2b\xb8\x27\xad\x8d\x01\x28\xb2\x3b\x15\xab\xac\x36\x15\x27\x62\x4f\x07\xac\x23\x73\x5e\x2e\x59\x52\xdd\xa8\x9e\x30\x94\x7a\x84\xc2\x93\x67\x11\xde\xff\xce\xb7\x46\xb6\x95\x75\x74\xc6\x43\x18\xa3\xab\xf6\x16\x92\x3e\x03\xd5\x9b\x60\xa5\x0e\x3e\x3d\x6c\x2c\xe0\x11\xc0\x17\xf3\x33\x75\x74\xe8\xce\x98\x29\x78\xcc\x63\x16\xbe\x2e\xc6\x11\x37\x23\x1e\xc6\x19\x17\xc3\xfa\x72\x44\x7c\x82\x27\x08\xdc\x01\xba\x3d\x2d\xef\x0a\x08\xd3\xf3\x07\xac\x5a\x94\x4b\x40\xa0\xb5\x3c\x18\xff\x22\x59\x9d\xde\x46\x2a\xe2\xb9\xbe\x76\xa3\x90\xeb\xe2\x6e\xab\xef\x4c\x02\x99\x2a\x66\x84\x73\x3e\x5c\xbe\x43\x3f\x48\xaf\x4b\x90\x34\xf6\xae\x98\xeb\xb6\x4f\x15\xba\x65\x48\x8f\x08\x53\x34\x43\xf9\x88\x4b\x16\xe5\xe9\xf9\x8b\xd1\x4b\x48\xd0\x8d\x4b\x00\x6a\xba\x3a\x5a\xd7\x2a\x7c\x2a\x88\xc8\xd2\xba\x07\x20\xb1\x6d\x69\x84\xa0\xda\xb0\x9f\x1f\x14\xf0\xc1\x03\xfe\x0a\x14\x2f\xce\x59\xf1\x02\x8d\x51\x34\x2c\xe9\x4c\x0a\xd6\x80\xae\xdb\x1f\x87\x1d\xbe\xe8\x2b\xaa\x55\x03\xf4\x38\x38\x41\x48\xee\x17\xf2\x3f\xd0\x60\x8a\xb9\x75\x3d\x08\x8b\x1a\xb3\x35\x61\x91\x95\x56\xed\x85\x03\x13\x46\xac\x4a\x45\xf8\xac\xc7\x2a\xed\xa7\x75\x69\xca\x6a\xac\x07\x6e\x69\x36\x1a\xd1\x4b\x7c\x92\x97\xaa\x39\x12\x5e\xa9\xa4\x0c\xe2\x79\x4a\x82\x46\x88\x3a\xfa\x6a\xaa\xc2\xe4\xee\x7c\x2f\x96\xe5\x23\x29\x84\x10\xdc\xa1\x54\x65\xe1\x6b\xbb\xd8\x53\x6c\xcb\x89\x1c\x21\x7a\xa0\xbf\x57\x57\x04\x46\xaf\xda\x32\xab\x38\xeb\x32\x55\xb8\x10\xd1\xd9\xf3\x6a\x3d\x78\xdd\xa0\xf8\x4a\x19\x76\xad\x48\x4a\x87\xef\x55\xdb\xc2\x6d\x6f\xbf\x40\xcf\x23\x8e\x13\x3c\x66\xa2\xc3\x24\x8b\x9f\x89\x22\x3b\x38\x48\x1d\x1a\x52\x05\x30\xbe\xa0\x42\x88\x33\xe5\x6b\x80\xbb\xda\x5a\xe7\x39\xad\x9d\x55\x4b\x24\xc6\xbd\xa6\x0f\x0d\x03\x2f\x57\xbc\x8c\xf9\x17\x42\x80\x07\xbb\x1a\x92\xdf\x36\xad\xb2\x4d\x4d\xf6\x6d\x51\x57\x65\xce\x0c\xd8\xde\x66\x90\x51\x8e\x0e\x01\x19\x7e\xea\x0f\x56\x35\x37\x2b\x16\x4b\xa3\x4b\x72\xcc\xe9\xdb\xba\x2c\xd1\xfa\xa6\x3f\x38\x17\x37\x04\x74\x64\x64\x4e\xf0\x81\x11\x09\xb3\xa4\x73\x24\xc2\x23\x74\xc0\xe3\x16\x8b\x3d\xc9\xa8\xe4\xa6\x89\xde\xa8\x26\xea\x9a\xc5\x70\xeb\x0b\x1b\xc2\x3b\x69\xa4\x8e\xa3\xad\x2d\xd3\x4c\x73\xd9\x38\xcf\x25\xfe\x51\x5e\xce\x81\x3f\xb4\x25\x58\x83\x09\xeb\xa0\x3b\x06\xf9\x85\x5d\xa1\xd7\x14\x23\x21\xdd\x47\xbb\x5d\xf8\x91\xf1\xfc\x65\xec\x06\xec\x0d\xe4\x53\x04\x24\x5c\xa5\x20\xe6\x54\x03\x20\x15\x4a\x20\x62\x3e\x28\xc2\x92\xc0\x42\x58\xe5\xe5\xa3\x5a\x98\xfa\xd1\x18\x82\x10\xb8\x55\x2f\x9b\x21\x02\xf7\xba\x0a\x95\x15\xfe\x36\x9b\x03\xb6\xb4\x63\x68\xbd\x98\x7a\xf3\xdc\xf6\x61\xd5\xca\x12\x35\x38\xef\x83\x06\xc6\x07\x1d\xb1\xf6\xbb\xbb\x5e\x77\xb8\x2d\xf1\x5e\x6d\x9e\x7b\x3e\xa8\x09\x32\x9d\xbe\x67\x67\x03\xf5\x5e\xdb\x2c\x55\x37\x81\x0d\x1a\x2f\xf0\x40\x8a\xce\x34\x01\x6d\xf3\x29\xa2\xab\x6d\x02\x72\x5b\x41\xe0\x1b\x8e\x8f\x42\x4d\x44\xcc\x07\x1f\xd1\x9f\x31\xfa\xad\x2d\xa5\x46\x11\x17\x7e\x3d\x8a\x1b\x65\xce\x68\xd5\xab\x55\x56\xad\x2d\x46\xa8\xb7\x85\x07\x5b\x44\x91\x63\x3e\x5b\xda\x0e\x1f\xba\xa5\xe5\xb6\xde\x6c\x49\x5a\x93\xa3\x62\x5a\x49\xef\x11\x5c\x55\xa9\x63\x27\x5a\x03\x77\x20\xc1\xd1\xf1\x49\x18\xe2\x2a\x20\xf6\x48\x65\x3b\x49\x04\x1c\x8a\x1f\xde\xe8\x9d\x4e\xbf\x16\xe5\x63\x6e\x96\x77\xc6\x46\x91\xf7\x72\xe5\xa9\x1f\x03\xe8\x3e\xd0\x67\x25\x11\x07\x43\x44\xd6\x9f\xeb\xc7\x48\x1a\xde\xf9\x3a\x09\x0c\x0b\x39\x01\xe8\xcd\x46\xad\xb2\x42\x38\xbf\x14\xde\x4a\x70\x64\xc5\x3c\xd9\x52\xe5\xce\x38\xd2\xd4\x62\x0f\x4f\x11\x3a\x02\x98\x35\xca\xa0\x06\x3d\x35\xa1\x58\x93\xcc\xf5\xc6\xbb\x4b\x2e\x80\x0e\x42\x6c\x6e\xb9\x04\x10\xcd\xbd\x7e\xa0\xe8\xe5\x9a\xd8\xde\x22\x33\xd6\x13\x5b\xe5\xe8\x65\xec\xca\x6d\x42\x8c\x76\x10\x25\xc5\x34\x4e\x7d\xaf\x56\x3a\xcd\x72\x3c\x77\xdd\xe7\x42\x54\xd4\xbd\x87\xa2\x45\xb1\xf0\x1f\xa4\x57\x1a\x95\x5e\x9d\x42\xfd\x84\x39\x41\x17\x0f\xb9\x88\x24\xc3\x14\x1e\xf1\xf1\x00\xc3\xc9\x25\xa8\xf8\xe7\xd0\x8c\xfa\x7e\xeb\xe3\xe4\x51\x1b\x9b\x53\x46\x3d\xc5\x6a\x34\x60\x23\x8a\x06\xa2\x2c\x70\x7a\x16\xe6\x5e\xe7\x2b\x02\xaa\xe0\xaf\x30\xf4\xc0\xd1\x3f\x6a\x09\x04\x73\xb1\x6b\xd0\xf3\x4d\x55\xde\x67\x0b\x88\x68\x98\x75\xc4\x48\x44\x71\x31\xca\xa4\xc1\x13\x7d\x2f\x24\x07\x7c\xb9\xad\x2d\x05\xa9\xb3\x58\x0f\x06\xc7\x72\x47\x15\x11\xe7\x7e\xd8\x02\x17\x03\x91\x28\x00\x13\x11\x43\xc1\xa2\x0c\xb7\x5b\x22\x5c\xdf\xa5\x1a\xf5\x77\x74\xb6\x90\xd8\xc7\x8c\x99\xd0\xc0\x7c\x8f\xf2\xd8\xef\x94\x65\xe6\xe9\x13\xaf\x48\xa3\xb6\x85\x87\x5d\x42\xfb\x5e\x41\x74\xa4\x26\x30\xe4\x2d\x26\x92\xd0\x19\xa7\xba\x83\x0f\x6e\x74\x86\x45\x9d\x1d\x9f\x7b\xee\x24\xf7\xd4\x4b\xda\x8b\xd7\x65\x7c\xc2\x78\x30\x26\xc1\x45\xf9\xca\x77\xc6\x92\xe7\xcb\xa9\x23\xbe\x1c\x22\xc5\x15\x43\x24\x42\x41\xa0\x01\x74\x88\xdf\x56\x77\xf3\xdb\x86\x53\xa3\x6e\xf1\xdb\x9e\x9d\x04\x8a\x5b\xa4\xb7\x15\x04\x97\x10\x7b\xe5\x15\xc2\x2b\x95\x49\x85\x8a\x3b\x41\x21\x45\xe1\x6d\xb8\xd2\x99\xd8\x97\xab\x78\x0b\xda\x5e\x70\x26\xc4\xe7\x64\x42\x29\xd4\x8c\x0a\x90\x29\x49\x58\x3e\x62\xfe\x83\xb8\xb2\x5a\xaf\xe9\x1c\x33\xdb\x88\x32\x60\xd6\x26\xfa\x6a\x66\x69\xe0\xf1\x34\x15\x94\x82\xed\x02\x10\x89\x93\x0d\xc4\xfe\x65\x6b\x87\xe2\x25\x88\xa1\x3e\xac\x9f\x81\x9e\x40\xd2\xbe\xf6\xd2\xdd\xeb\xac\x56\x01\xb8\xc0\x21\xba\x06\x97\x44\xf0\x08\x89\xad\x73\x45\x78\x5c\xe4\x02\xbe\x73\xa7\x6d\x2d\xcd\x5b\xb0\x4a\x12\xdc\x9b\x70\xa6\x66\xd5\x92\x03\x60\x3f\xd0\x60\xb2\xdc\xc3\xf7\x8e\x26\xcc\xde\xeb\x81\xd8\xb6\x3f\x33\xac\xe4\x1c\xe3\x68\xf2\xfa\xa1\xd9\xed\x44\x9e\x78\x7b\xe1\x87\x38\x6f\x87\x37\x8b\x8f\xce\x65\xb5\xe7\xbd\xe0\xe2\xfc\xae\x43\xba\xb0\x9b\x2c\xdd\x96\x5b\x4b\x45\xce\x22\x7c\x95\xef\x38\x0b\xe4\x56\xb6\xd1\x6e\xfe\x11\x1e\x73\x30\xc8\xf5\x4e\x7d\x35\x66\xe3\x66\x4c\xa7\x18\x41\xc7\xdf\xe3\x09\xe3\x4d\xc0\xd8\x5c\x22\x4a\x8f\xa2\x2c\x8e\xd9\x32\x79\xf0\x59\x99\x25\x79\xee\x3a\x4d\xcb\x8a\xed\x70\x5f\x17\x11\xc1\x80\xdd\x48\xec\x6f\x00\x8d\x9f\x28\x91\x74\x2f\xe5\x58\x1b\xd4\x2c\xa3\x16\x10\x4a\xa6\x73\x7a\x61\x4f\xec\x4b\x69\xb8\xd1\xfd\x0d\x27\x63\xe0\x7e\x22\x11\x1e\x41\x68\x66\xac\xd0\x2c\x4a\xfa\x6f\x50\x3f\xf1\xc3\x2a\x27\x05\xac\x08\xde\x08\xee\x39\x88\x0a\x20\xa9\x49\x51\x0c\xbb\x93\x84\xa3\x68\xe8\xae\x0c\xda\xc3\x6f\xe4\x62\xbb\x62\xb3\x8e\x6c\x62\xc2\x58\x75\xae\xba\x03\xf1\x7d\x5f\x71\xda\x8a\x88\xb1\xbb\x9d\xd5\x01\x6f\xed\xbf\xe4\xc9\x64\xd0\x00\x96\xab\xb6\x49\xd4\xe6\xfe\xcc\x95\xd8\x5d\x2b\x96\x32\x5b\xa6\x16\x2a\xf6\x51\x19\x84\xa7\x1e\xe8\x83\xe5\x8a\xf1\x3e\x28\x3d\xd7\x55\xb5\x13\xe1\xc5\xce\x55\xb9\x93\xf4\x24\x19\x85\x73\xee\xb2\x07\x34\x78\x2b\x93\x9b\x07\x5d\xd4\x50\x19\xe6\x4b\x20\x7e\xd1\x8b\x10\x1d\xe6\x33\x9b\x5d\x2e\x04\xed\x09\x69\xec\xc3\x4e\xe0\xf2\x27\xda\x00\x64\x1c\x93\x1f\x08\xa1\x22\xea\x41\xc4\x6c\xb1\x46\x04\x70\x18\x5d\x37\x6b\xbd\x3d\x3b\xa5\xe7\x8b\x10\xfa\xa1\x76\x5f\x68\x4a\x01\x8b\x6c\xe5\x1d\x5f\x11\x75\xeb\xe8\x08\x26\x05\xcb\xc2\xb8\xcf\x28\x4c\xeb\x67\x85\x5b\x33\x50\x65\xca\xb9\x5c\xed\xd3\x60\xd1\x75\x81\x31\x94\x4a\xa8\x4e\x25\x72\xe3\x35\xee\x74\x71\x2c\x84\xf2\x26\x58\x59\xbe\x9c\x93\x78\x53\x57\x0d\xcf\x9d\xa1\x59\xe0\x6c\x26\x54\x8b\x84\x25\xf2\x2b\x16\x0d\xd8\x61\x6c\x1d\xe5\xbe\x97\x8d\xa6\x7a\x01\xbd\xd8\xb5\x92\xa3\xe6\x73\x87\xde\x56\x7b\xd4\x3b\x8c\x30\xc6\x91\x97\x07\x9d\x67\x50\x7d\xd8\x90\x90\x65\x94\x14\x20\xb6\x44\xc1\x3e\x1d\xfa\x4b\x8e\x5c\x29\xa5\x96\x7d\x0e\xcd\xc3\x5b\xef\xb5\x3d\x90\x3b\xb1\x09\x1e\x44\x68\x15\x63\x36\x43\xed\xcd\xa2\x88\x32\xb9\x2c\xba\x91\x5a\x6f\x11\x41\x66\x58\xf5\x64\xc6\x3f\xf9\x06\xba\x84\xa1\xe5\x3e\x94\x80\x2c\xa3\xce\xae\x46\x16\x51\x0c\xa7\x63\xe0\x2f\x10\x04\xc5\x36\x23\x26\xdd\x90\xb3\x8e\xeb\xc4\x9a\x25\x62\xe4\xc2\xc4\xf1\x24\x84\x05\x65\x95\x2a\x30\xd7\x03\x56\x50\x84\x6a\x6a\x5b\x2d\xf1\x13\xd2\x72\xbd\x80\xe0\x3c\x27\x39\x3d\x53\x5f\x89\x27\xa1\x56\xb9\xbb\x1c\x2a\x81\x8f\x02\x5b\x06\xf2\x8f\x0f\x65\xbe\x5d\x13\x82\xc4\xd6\x65\x45\x1c\xef\x51\x4a\x91\xef\x75\x91\x25\x2e\x54\x4f\xdf\xdd\xb9\xc5\x5b\x9b\x1e\xcf\x8e\x1c\x22\xe8\x7c\x6d\x23\xbc\x93\xaf\x0d\xa6\x96\x73\x28\x14\xed\x2c\xb8\x31\x11\x7f\xe2\x85\x30\x83\xbf\xdd\x78\x3e\x5b\x51\x6a\x61\x76\x25\x0c\x09\xc5\xb1\x04\x71\x08\x3a\x62\xe8\x94\x0c\xd4\xb8\x00\xef\xab\x73\xf6\x90\x01\xca\x77\x48\xc8\x68\x6a\xac\x05\x6e\x9c\x32\xd2\x12\xe8\x08\x1d\xf9\x07\xc1\xd2\x79\x2b\xef\xc7\xeb\xb2\x38\xa6\xab\xf1\x43\x59\xad\xf7\xdc\x8b\xcd\xc6\xb5\xe2\xbe\xfb\x6f\x33\xab\x5e\xc3\xd8\xbf\xd9\x7b\xa9\x89\xa4\xdc\x5a\xa7\xf7\x59\x61\x8e\x2b\xa3\x97\x70\xac\x75\xc6\xb5\x3a\x5e\x16\xa7\xf0\x5c\x0b\x0b\x21\x7b\xf4\xa8\x77\xf2\x7a\x3c\x0f\x2f\x8c\x83\xe2\x70\xcb\x9b\xf5\xa2\x5c\x62\x28\x16\xd2\x72\xf7\x3b\x14\xaf\x21\xaa\x7a\x49\x90\x26\xfe\xda\xb1\x3e\xfb\x49\x53\x6b\x7e\x5f\x18\x4f\xad\xb2\x6f\x68\x72\x68\xb5\xdc\x56\x18\xfe\xe2\x27\xe3\xc3\x54\xba\xb5\x75\x49\x4a\x09\xb0\x4e\x23\x20\x34\x9c\x37\x31\xc3\xff\xe2\x3f\xb1\xa3\xda\x97\xe0\x80\xfd\x96\x28\x38\xd7\xd1\x4e\xab\x95\xbb\xfa\xdd\xe6\xa8\x8c\x51\x3b\xa3\x49\x10\x54\x7c\xc4\xca\x90\x11\x9b\x80\x1b\xbc\x82\x60\x59\x57\x34\x1c\xc2\x34\x5c\x31\x29\x2a\x37\x7f\x5d\x2e\x4d\x0e\x97\xdf\x1d\xb9\x85\x7c\x13\xd3\xf5\xcb\xe0\x39\x31\x32\x94\x75\x04\xe0\xaa\x30\x7d\x0f\xc5\x57\x7d\xaa\xc3\xcf\x04\x43\x3f\xa1\x15\x9c\x2d\xdc\x13\x22\x4c\x7e\xa5\x49\x4f\x38\x83\x09\xf6\x75\x24\xf4\x8f\x71\x42\xa9\xcb\x8f\xb9\x69\x7e\x17\x0a\xff\x85\x8c\x03\xe6\xbc\xe8\x78\xf0\x46\x2b\xac\x18\x90\xf2\xf1\x88\x3c\x32\xde\xf7\x0d\x0e\x6a\x1f\x34\xc0\x88\xda\x59\x85\xe4\x1c\x08\x53\x8b\x16\x6a\x44\xb2\x24\x1d\x3f\x39\x47\x04\xb2\x90\xb3\x13\x2d\xb6\x26\xe0\xb1\x33\x6e\x8e\x16\x0c\x23\x77\xe1\xc6\xf6\xd4\xe2\x18\xb6\x2d\xd3\x54\x5b\x30\xa3\xc8\x41\x2c\xca\x22\x08\x90\x30\x9b\x3a\x47\x78\x85\x03\xba\xec\x6e\x31\x5e\x82\x7e\x43\x34\xbd\xba\xed\x82\x2d\xb8\xb7\x0b\x61\xc9\xec\xd9\xc1\x0b\x72\x8c\x60\x6f\xe2\x84\xd0\x78\x0b\x52\x48\xe4\x6c\x3a\xba\xab\x74\x9d\xc1\x9e\xc1\x25\x82\x83\xdf\xa7\xf6\xc3\x88\x09\xa1\x85\x18\x70\xb9\x27\x7b\x84\x2b\x1e\xd2\x06\x7a\xe7\x91\x2e\xfe\x97\xa4\x77\x01\x53\xbd\xda\x56\x18\x9b\xc3\x29\x87\xab\xc5\x1b\x36\x64\xa1\x4b\x8f\xf3\xc9\x75\xd5\xf0\x3d\xc5\xa8\x84\xea\x66\x78\xbf\x7c\x52\x74\xfa\xd9\xd6\xb2\x4c\xf6\xbf\x8e\xf0\x75\xb8\x4b\x3d\xa2\x93\x56\xf3\x11\x86\x62\x70\x5b\xc3\x51\xe5\x06\x38\x84\x4f\x76\x7d\xca\xb0\xe0\x19\x65\xe5\x40\x13\x58\x4a\x04\x99\xc5\x05\x89\xde\xaf\x73\x4f\xb2\x02\x35\x61\x43\x14\xd6\xaa\xc2\x7c\xf3\x21\x24\xd9\x33\xab\x77\x44\xfb\x8a\xa8\xdd\x55\x46\x89\xb9\xee\x2d\x30\x8d\x2c\xfd\xc7\x80\xea\x55\xf7\xa5\x25\x45\xbf\xae\x6f\x26\xb4\xda\xa1\xbc\x95\x82\x87\x51\x6d\x8d\xf0\xf3\x62\x44\xbb\x38\xd8\x43\x3a\x58\xf0\x1a\xda\xc8\x69\xf3\x05\xe1\x66\xef\x3e\x40\x49\xd8\x8d\x31\xd5\x71\x5d\x1e\xbb\xff\x47\x4c\x95\x47\xd1\x45\x23\x8a\x7c\x84\x6c\x20\x19\xc0\x69\x78\x9a\xb2\x66\x76\xb9\x73\x35\x44\x01\xb6\xca\xa8\x85\xc1\x43\x72\x85\x95\xc6\x38\x25\x94\xfe\xf5\x10\x66\x71\xe4\xb1\x0b\x2b\x76\xfb\x92\xcc\x79\xb4\xd2\xe1\x12\x88\xd9\xdd\x44\xc3\x9c\xad\x5e\xda\x38\xd1\x9a\x51\x42\x63\x19\x8a\xf4\xf7\xed\x1c\xb7\xf0\xa3\x4c\xf6\x2e\x09\x7b\x71\x61\x22\xb0\x48\xb8\x02\x5a\xa7\x99\x40\xf4\xdc\x3a\x67\xea\x06\xaf\xba\x1e\x34\x45\x5e\xa0\xbd\xb4\x2c\xec\x76\xed\xc9\xf8\xeb\x1e\x3b\x1b\x01\x34\x54\xeb\xe2\x0e\xb0\x65\xcc\xa8\x4d\x72\x6d\xf5\x4e\x62\x4f\xaa\x35\x1c\xc3\xfe\x0a\xe4\x0f\x27\x6a\xa5\xd7\x59\x8e\x54\x53\xf7\xe5\xd6\x9a\xfb\x32\xf7\x05\xd5\x36\x5c\x5a\x9c\x84\xf5\x09\x64\xb8\x47\xf3\x25\x01\x27\x53\xa1\x9f\x0f\x1e\xba\x56\xcb\x47\x03\xe1\x71\x20\x6a\x5e\x1a\x64\x2e\xa1\xed\x85\xd8\x43\x7f\xc7\x67\x04\x9f\x8b\xfa\x9a\x60\x4d\xee\x6a\x9b\x13\xb9\xb3\x8f\xe2\x57\xc6\x96\xf9\x03\x11\x43\xe9\x07\x84\xed\x23\x1f\x99\x3b\x21\x3f\x74\x40\x91\xe0\x35\xfe\x7e\x01\x03\x4b\x7c\xc0\x39\x1e\x89\xea\x45\xc3\x14\x21\x93\x55\xbd\xdb\x80\x59\x81\x9c\xd4\xeb\xb2\x08\x78\x1c\x5d\xab\x34\xd7\x78\x06\xf8\xa6\xc7\x41\x00\x4e\xc0\x6e\x43\x61\x4b\xfc\x72\x85\x7d\x80\xad\xa1\x77\xb1\xec\x65\xf3\xa3\x3a\xad\xb7\xdc\x4a\x9c\x20\x94\xc3\x86\x1b\x2a\x0b\xe2\xd8\xc4\x7b\x94\x48\x6b\x6a\xa0\x86\x87\x07\xbd\xd1\x70\x9e\x2a\x69\x90\x39\x4f\x5d\x72\x29\x86\x3b\x1d\x98\xce\xb6\xce\xba\xc5\x91\x2a\xca\xe2\xd8\xbf\x00\x5b\x4b\xb4\x11\x70\x97\xbb\xdf\x04\xb6\x3e\xdc\x26\xce\x1a\x70\x0b\x0c\x42\x84\x18\x8f\x32\x84\x03\x14\x35\x41\xd0\x15\x80\x92\x8f\x11\x00\x83\x0b\x6f\x1c\xe8\x52\x19\x67\x23\xf7\x97\xd8\x34\x6b\x53\xdf\x97\x4b\xbc\x30\x52\xb3\xdc\x56\xa0\xb3\x44\xc5\xea\xf8\xb0\xaf\x66\x67\x05\x01\x5b\x27\x15\x2b\xd4\x13\x41\x03\xb0\x36\x08\x80\x37\xed\x92\x0a\xdb\xed\xa0\xc2\xd2\x89\x1a\x48\x26\x48\xab\x9c\x84\xca\xe4\xf7\x19\x62\x31\x51\x2c\x44\x62\xec\x76\xb5\xca\xf0\x0e\x97\x77\x0a\x25\xee\xea\xac\xd8\xba\x83\x60\x5b\xc0\x19\x4a\x76\x6a\x54\x0d\xd2\xb8\xf0\x91\x57\x0f\x10\x80\x9b\xca\x90\xda\x63\xc9\x71\x20\x53\x05\x90\x0b\xa4\x09\x59\x59\x3a\x4a\xae\x78\x1a\xb9\xb5\x26\xa8\xe5\x78\x15\x65\xa4\x8a\xd6\x31\x29\x83\x82\x7c\xe0\x93\xf3\x25\xa4\x18\x04\xbe\x85\xe5\xfa\xd1\x23\x93\x83\x1b\x50\x36\xc2\x38\x4f\xd3\x6d\x05\xc8\x67\x9f\x11\xc4\xeb\x4f\xf3\xab\xc4\x3e\xf4\x12\x09\x22\xf8\x08\xda\xfa\x61\x69\x46\x93\xc9\xe2\xb4\x84\x12\xa5\xbb\x2d\xe8\x64\x20\x50\x69\x63\xea\x2d\x10\xbc\xb0\x75\x89\x9e\x2c\x20\x3e\x8e\x3a\x43\x89\x71\x0b\x2d\x5c\x8c\x3a\xad\x0d\xd0\x2c\xf4\x0f\x58\x62\xd8\xef\x38\x64\xcc\x83\x0a\x8b\x66\x61\xba\xfc\xed\x7d\x5b\x6c\xa0\xde\x6f\x6b\x2e\x56\x0b\x81\xe2\x58\x32\xc9\x99\xf6\x05\xdd\x69\x6e\xaa\x0b\xa2\x76\x10\x26\x1e\x31\x76\x93\x8c\x25\xf1\xdd\x88\x9d\xd5\xb9\x24\x29\xb9\x10\x0d\xf8\x51\xa4\x09\x1f\xc5\x2f\x61\xd9\xd1\x03\xf1\xde\x98\x4e\xae\xfa\x1e\xfc\x23\xdb\x2f\x9c\x9f\x7d\x3d\x6f\x23\xdd\x74\xf3\x11\xbc\xc9\xe4\xe3\xd8\xd1\x76\x36\x22\x40\xba\x39\x13\x03\xcb\x78\xbb\x59\x02\x11\xa0\xc0\x1c\xc1\x96\x0d\xbb\xc6\x8f\x43\x25\xba\xe2\x8b\x10\x69\x59\x25\xbc\x92\xda\xeb\x91\x17\x73\xf6\xd4\x43\x07\x6a\xe8\x9d\x98\x60\xe9\x93\x21\xbf\x34\xb0\x38\xbc\x34\x42\xb4\xc5\xb3\xda\x9a\x7c\xe5\x21\x09\x9c\x19\x5c\xba\x83\xcc\x20\xa4\x08\x6e\xaa\xda\xd7\xdc\x09\x3b\x8d\x5f\x54\x32\x43\x1c\xa7\x21\xb6\x39\x41\xdf\x36\x55\x59\x97\x69\x99\x73\x81\x95\x44\xa7\xe9\xb4\x2a\x49\x3e\x90\x1e\x44\x60\x87\x03\x3b\x01\xcf\x84\xbd\xd3\xcc\xb6\x6f\xcb\xd9\xec\xdc\x3a\x58\xd9\x03\x5f\xf6\x41\x0b\x5f\xaa\xc7\x95\xfe\x66\x89\xc5\xcf\x94\x81\x68\x02\x6f\xbf\x03\x75\x4b\xfe\x27\x31\x87\xa3\x1b\x58\x94\x5e\x80\x7f\xa3\xad\x7d\x74\x0d\x2e\x2b\x77\x95\xe1\xc1\x58\x6c\x74\xfa\x15\x72\xd8\x95\xd1\x4b\xc2\x11\x90\x1f\x05\xa3\xf5\xe3\x40\x0d\x43\xf6\x03\xd8\xe2\xf0\x9e\x15\xbf\x0d\x39\x05\xdb\x03\x1b\x5e\x80\x58\x02\x01\xf2\x01\xe4\xce\xc2\x2b\x53\x99\x20\xd0\x86\xa0\xbd\x82\xe4\x48\x2b\xcf\x67\x24\xd8\xad\x54\x77\x23\xa8\x26\x8d\x72\x3c\x94\xcd\x61\x04\x02\x26\x9b\x38\xc9\xe0\x2d\xc8\x1a\x65\xc8\x50\xfd\x86\x7d\xef\x9d\x7a\xc4\x7a\x14\x89\xf8\x96\x91\xa6\x8e\xe2\x09\x9f\xda\xc1\xe0\x5b\xab\x68\x28\xd7\x8f\xe0\x55\xeb\xee\xa6\x33\x7d\x13\x06\x9f\x25\x12\xd5\x67\x40\x31\x24\xe7\xfe\x42\x1b\x10\x6c\xf8\x26\xe5\x32\x61\xaa\xc4\xb3\x31\x39\xd4\x31\x08\x8c\x16\xbb\x73\xe6\x48\xd1\x01\xba\x6b\x2b\x5f\xc3\xc9\xdc\xd9\x83\xbd\xd0\x12\x8c\x2d\x75\x81\x4c\x80\xa8\x91\xea\xde\xb1\x9a\x43\x32\xdf\xef\x19\x28\x72\xcc\x74\x4d\x45\x3e\x65\xc5\xa4\x7d\x3b\x3f\x6c\x59\x3d\x50\x47\x7b\xd6\x08\x8d\x1d\xc7\xb9\x02\xfa\x95\x72\x35\xe5\x23\xb5\x42\xe7\xe0\xbc\x99\x0a\x23\x07\xe0\x78\x3c\x72\xff\x1a\x68\xe9\x41\xdf\x07\xfa\x29\x62\xd3\xfd\x72\xa0\xa7\x65\x86\x5d\xcc\xc4\x52\xb8\x03\x0e\xd8\x78\x88\x62\xf4\x1a\xa4\xeb\x98\xee\x00\xa2\xb0\x9d\xf8\x89\xf0\x36\xc2\x3f\x45\x24\x62\x22\x6b\xd8\xe6\xd4\xf3\xab\x1b\xab\x56\x08\x4b\x06\xb9\x85\xe5\xb2\xab\x81\x3c\x87\x00\xb4\x6f\x88\xc9\xc9\x36\xdd\x43\x11\x71\x28\x78\xe6\x67\xf7\x9f\x77\x4a\xe0\x41\xeb\xfe\x24\x12\x0f\xcc\x5c\x0e\x6e\x24\xe3\x18\x58\x80\x1b\x2a\x4d\x3c\x71\xaf\x8f\x35\x31\x22\xb8\x3b\xb7\x72\xfa\x06\x8e\xd1\xd3\xb7\xcd\x06\x08\x7e\xd5\x45\x5f\x4d\x7d\xa5\xe6\x06\xc5\x84\xfc\xcd\x15\x4a\x60\x44\x88\x18\x73\x5d\x1e\x3c\xc2\xcc\x70\x52\x5b\xc6\x7a\x17\x20\x00\xf8\x2a\x0e\x0d\xee\x4d\x6f\x72\x02\x14\x07\x1c\xf3\x61\xc0\x30\x85\xae\x75\x56\x8b\x66\xa7\x7d\xb7\xe7\x3d\x64\x6c\x9d\xd9\x98\x1a\xdd\xc7\x47\xaa\xec\x2e\x2b\x5a\xf3\x94\x20\xc8\x8c\xfb\x8d\x7f\xeb\xf2\x6c\x10\x6b\xc6\x9d\x00\x4e\xc8\xea\x2b\x9e\x9f\x62\x48\x40\x02\x58\x5b\x11\x03\xf4\xb3\x82\x0d\xd0\x9e\x25\x45\xf4\x61\xd9\x47\x42\x7a\x8e\xa3\x6c\x89\xc0\xc6\xeb\x8c\x45\x62\x88\x85\x5e\xe3\x7f\xe4\xc4\x56\x27\xc6\xde\xbb\xde\x6b\x2f\x34\xe0\xdf\x62\xfa\xea\xc2\xa4\x39\x31\x2b\x96\x88\xbf\x6e\x40\xd1\x3c\x93\x1a\x80\xff\x02\x91\x36\x94\x55\xc2\x5f\xf1\xf5\x49\xf8\x28\xfa\x8f\x64\xee\xc1\xa8\x58\xf1\xd2\x95\x5c\x55\x59\xb1\x34\xeb\x22\x02\xa2\x85\x3e\x80\x0d\x25\x3b\x21\x17\x0d\x72\xb2\x06\x8c\x84\x3b\x81\x1b\x2a\xca\x47\x1e\xe6\xd6\x98\xb9\xac\xee\xe3\x3e\x43\x0e\x1c\x08\x2c\x28\x6d\xed\x76\xbd\xf1\x3c\xa7\x61\x47\x35\x3d\x98\xc4\x33\x9e\x8b\xcf\xd0\xa5\x48\x1a\x14\x5d\xcf\xf4\x85\xb8\xc4\x43\x5a\x32\x09\x61\x67\x87\x3d\x72\xbe\x24\x59\xd1\x08\xe6\xd5\x84\x6a\xc0\x55\x2c\xa8\x0b\x7b\x1c\x3d\x97\x0a\x8c\x3d\x26\x5b\x86\x41\x42\xe9\x61\x89\x1e\x3a\x3d\xf1\x81\x70\xbe\x33\x63\x84\x1c\xe2\x7b\xa8\xef\xe1\xf6\x49\x78\x27\xda\x20\xb0\xd4\x81\xdc\xd9\x7b\xef\x4a\x6c\x0a\x3a\x80\x6c\x46\x6a\xd5\xd1\x8f\x70\x12\xd3\xf5\x89\x63\x0f\xc2\xb2\xce\xe2\x68\xb1\x4c\xc9\xe6\x75\x3c\x0f\xec\x85\x2e\x06\x04\xac\xfb\x88\x20\xc3\xf1\xcd\xe1\x6f\xf5\xae\x0b\x23\x2c\xc3\xb8\xe3\xd1\xb9\x1f\xea\x4c\x05\x27\x56\x9c\xed\x06\x18\x58\x47\xab\xbd\x2f\xc6\x14\xc9\x28\xe7\xb6\xa7\xfd\x32\xec\x00\xcd\x45\xdb\xb5\xd5\xe8\x03\x06\x7f\x12\x50\xe0\x70\xeb\x7b\x90\x9a\xc7\x78\xc9\x4a\x9f\x04\x50\x18\x4c\xc4\xcd\x70\x82\xe6\xb2\x6d\xb2\x92\xba\xed\x40\x5f\x07\x77\x90\x56\x93\x20\xb7\x6c\xe7\x28\xa4\xf5\xeb\x0d\xf7\x61\x0b\xcb\x24\x76\x4f\xd9\xdc\x4f\x09\xdb\x49\x84\xe8\x6e\xa0\xef\xb4\x34\x3b\xd9\x94\xf2\xdc\x1c\x40\x9c\xcd\x56\x75\xb0\xec\xdf\x91\x5f\xef\x56\xa8\xcc\x4d\x50\x77\x29\x36\xf0\xa8\x11\xfb\xfd\x87\x41\x8b\xb7\x5e\xca\xa5\x86\x72\x8a\x40\x4e\xd4\x98\x39\x2a\x74\xd6\x92\x9b\xd6\xaf\xa4\x2e\x0a\x09\xe0\x9a\xae\x6b\xb3\xde\x08\xd5\x46\xf2\xdb\x5b\x2f\xc3\x2d\xfc\x50\x66\xe4\x3b\x02\xca\x2c\x2e\x3f\x0a\x6c\xdf\xbb\x6e\x46\x7b\xde\xef\x12\x1e\x00\x07\x49\x2d\xb8\x4e\xda\x35\x42\x26\x04\x4d\x88\x9d\x52\x9e\x59\xa7\x18\xcd\x90\x14\xfc\x60\x91\x1b\x6d\x89\x81\xcc\x33\xd1\xb7\x2c\xbf\x9a\xec\xdb\x50\x5b\xc2\xba\xfb\x21\xf4\xdc\xb4\xeb\x10\x83\x48\x24\xf3\x4b\xa8\x96\xf5\xb6\x25\x66\x77\x29\xd4\x0b\x21\xb2\xa2\xce\xf2\x4e\xf3\x30\xaa\x37\x2a\x96\x6e\x35\xc7\x83\x18\x17\xbd\x84\x22\x59\xb7\x68\x35\x56\xd7\x27\x01\xad\xd4\x78\xf8\x4a\x67\x39\xec\x6e\xb7\x7f\x56\x94\x61\x6c\xf0\xe8\xbb\xd3\x08\xee\x70\xa9\x53\x06\x81\x62\xa4\x42\xad\x4b\xf5\x96\x48\xf9\x51\xc2\x1a\xde\x64\xac\x0d\x2b\xf4\xaa\xac\x4c\x09\xa3\xfe\x97\x0d\xa2\xe8\xd3\xde\x2e\x41\x4f\x32\x63\xbf\xaf\x2f\x44\x2a\x95\xa1\x61\xb0\xca\x2a\x5b\x03\x6d\x7d\xf0\x31\xfc\xd5\x46\x47\x4d\xb9\xda\xbf\x62\xb8\xd2\x74\x47\xf5\xa5\xb1\x73\x26\x9b\x1b\xa0\xc8\xe9\xb6\x6a\x2a\x22\xf8\xf1\x7d\x15\x8d\x2f\xc1\x2d\x52\x93\x6d\xfc\x81\x89\x8d\xc2\x78\x5d\xcc\x80\xbf\x67\x8f\xf1\xbe\xf0\xb7\x83\xe4\xe0\x17\x8c\x83\x50\xc2\x8d\x3c\x15\xce\x7c\x8a\x87\x82\x21\x14\xfe\x05\xd0\xd1\x1d\x30\xd8\xb7\xcf\x91\x71\xdc\x18\x78\x14\xc4\xd8\x84\xbc\x04\xc2\x20\xea\x68\xa6\xc3\x02\x48\x64\xc1\xd2\x3f\x6d\x75\x0e\xce\x66\x50\xa6\x2c\xcc\x63\xcc\x95\xe8\x01\x03\xeb\xa6\xc0\x81\xb7\x64\xdc\x90\xfd\x11\x03\x7a\x1b\xa8\xeb\x71\x9e\x04\x19\x9e\x94\x0b\xfc\x84\xd5\x5e\x8d\x62\x02\x86\xf4\xc9\x64\x87\x4e\x91\x44\xa2\x51\x87\x55\x56\x4b\x44\x8d\x70\x43\xb1\x8e\xaa\x81\x31\xf1\x65\x81\xc3\x22\xcd\xf2\x5c\x23\xd2\xd9\x33\x88\xb4\x53\x24\x10\x9d\xaf\x50\x4c\x01\xb2\x0a\x9a\x33\x56\x20\x9b\x93\x52\x62\xe8\x60\x02\x3b\x12\xf6\xc4\xe6\xe4\xd9\x57\x03\x47\xbc\x50\xe7\xc2\x50\x80\xf6\x83\x24\x0a\x9b\x0b\xe2\x2c\x8f\x48\x03\x24\x78\x17\x95\xe7\xdc\xcc\xc5\xf0\xdd\xce\xbb\xaa\xd8\xb5\xca\x13\x0d\x15\x28\xa3\x4b\x88\x0c\x34\x62\x23\xd1\x41\x4e\xab\xa2\x63\x06\x22\x0a\xb1\xc5\x4e\x70\xce\x60\x49\x1e\x8e\x70\xab\xec\x32\xa1\x8c\x3e\xc9\x5c\xc2\xd2\x0d\x03\xd0\xda\xf2\x5e\x81\x1f\x58\x33\x4e\x06\x6a\xc8\x97\x1e\x7d\x84\x8c\x68\x21\x07\x3f\x8d\xe5\xe0\x81\xaa\xc9\x1f\x3a\x7b\xaa\x90\xe2\x14\xc9\x3e\x75\xf7\xf8\x88\x8d\x5c\x48\xef\x44\x24\x54\x9d\x9a\x84\xb1\x97\xe5\x98\x48\x7d\x02\xef\x8c\x84\x73\xe5\xb8\xc6\xdb\x00\x24\xbf\x33\x46\x62\xf8\x7a\x20\x2c\x57\xcc\x60\xd0\x16\xbb\xb8\xf4\x47\x18\x8f\x92\x6f\x6b\x58\xa8\x9e\x29\x6a\xf0\x97\x42\x2e\xa7\x87\x96\xbe\xcc\xee\xf8\xfc\x11\xc9\xf8\x42\x05\x23\xd6\xad\x49\x82\x2a\xb4\xbd\x42\x4a\xd6\x6d\x95\x1c\x9c\x2e\x83\x10\xd6\xb2\x30\xfc\x19\xc0\x87\xa1\xc9\xd1\x7e\xc6\xda\x54\x77\xb8\x70\x24\xfb\x95\x3b\xd9\x0e\xef\x54\x84\x04\x33\x84\xaa\x50\xed\xce\x11\x4a\xdc\x73\xdf\xa3\x49\x2f\xba\xea\x4e\x5f\x31\xc1\x11\x38\x0d\xc0\x22\xb9\x15\x1f\x78\xbc\xd7\x35\x90\x11\x4a\x9e\x7b\xff\x59\xce\x9a\xef\x7e\x70\x97\xb8\x59\x42\x75\x21\x06\x57\x20\x5f\x69\x6c\xad\xee\xf5\x12\x1d\x83\x6d\x4e\x95\x3b\xc1\xce\xf2\x32\xb1\xde\xd4\x4a\xd4\x26\xdf\xba\x76\x79\x45\xa1\xb8\x02\x61\x6f\xce\x2d\xa2\x85\xe1\xc5\xba\xa7\x4d\xde\x8e\x91\x7f\x07\x5c\x7c\xdd\x60\x3c\xa5\x52\x38\x7f\xc7\x9b\xd5\xaa\xac\x6a\xdb\x32\x97\xc9\xc3\x76\xa7\x4e\x97\x23\xcc\x59\xb4\xa6\xd6\x74\xa3\x48\xdd\xdd\xf5\x50\x0a\xbe\xc7\x80\x8e\xe8\x12\x76\x1d\xaf\x0f\xdb\xd5\x98\x84\x94\xb6\xa5\xb8\x99\x60\x82\x95\x4d\x79\xb2\x56\x3e\x2e\x74\xc2\x7c\x5c\x56\x43\xd0\x2c\xcf\x6a\x2a\xc9\x8c\x51\xb8\x90\x24\x3a\xc6\xea\x40\x9c\x7e\x80\x80\xc2\xbf\x21\x81\x93\xeb\x47\xbb\xcd\xea\xbe\xdb\x41\xe6\xce\xbb\xee\xc2\x40\xa7\x0f\x87\xc3\x7a\x19\x32\x1a\x09\xde\x47\x89\xb2\x88\x7d\x49\x02\xca\x10\x80\xa7\x3a\x37\x5e\x82\xa5\xf2\x41\x2d\xc9\x90\xe6\xde\x13\xe0\x4b\x54\x94\x71\x7a\xca\xca\xf1\x36\xf0\xaf\x15\x18\x4a\x2c\xab\x1e\x43\x39\x1a\xa6\xa2\xdb\x52\x3e\x40\x0b\xe8\xfa\x2e\x2f\x24\xbe\x9d\x05\x4b\x5b\xc4\x9f\xc2\x7f\xce\x2c\x56\x77\x0d\x42\xe5\x12\x14\x50\x7b\x92\xbe\x50\x51\xc0\x58\x03\x6a\xe5\x0f\x36\x6a\xb4\xa7\xa2\xf3\xc5\x18\xd1\x27\x03\x3b\x8c\x1c\x75\x4a\x38\xb9\xc3\x2d\xfa\xb5\x2a\x1f\x09\x92\x44\x87\x64\x2e\x03\xd2\xfe\xc1\x41\xcf\x50\xe7\x95\xd1\xcb\x9d\xd2\x29\x19\x37\x6e\xa7\x99\xca\xa0\x05\xca\xbf\x4d\xf8\x96\x70\x67\x04\x64\xf8\xc4\x84\x83\x9d\x8d\xa2\x6f\x49\x53\x1a\x22\x82\x27\xaf\x9a\x6b\x03\x62\x82\x58\x39\xcc\x2c\x06\x8d\x41\xc1\xdc\x0d\x5d\xf9\x9c\x63\xa6\xae\xee\x6b\x12\x8a\xcd\x76\x58\x48\xbc\xf3\xbb\x0a\x5d\x3b\xde\x8d\xfb\x59\x46\x55\x51\x9a\xd1\xd3\x9b\x24\x34\x8f\x65\xde\x6b\x08\x21\xf3\xd9\x88\xe1\x53\x9a\x21\xcb\xe5\xe0\xc6\x46\x42\x79\x10\xa5\xb3\x35\x0a\x35\x12\x16\x35\x8a\x0f\x34\xf9\xc2\xbc\x0d\x21\x1b\x2d\xac\x2f\x0d\xc1\x0c\x5f\x92\x9f\xb8\xd5\x99\x2f\x1f\xb3\x65\x38\x73\x8e\x91\x44\x26\x72\xb4\xe3\x92\x76\xb1\x06\xf7\x2c\xc1\x84\x09\xed\x12\x44\x57\xb9\xa9\xa4\x6d\x2e\xf6\x38\x6e\xf0\xc0\x82\x82\x3c\x0d\x07\xac\x91\x58\x84\x76\xcf\xba\xc0\xe8\x55\x53\x5f\x1f\xeb\x00\xfc\x5d\x05\x21\xa7\x5e\xdc\x49\x3c\x22\x8a\x9d\xd7\x87\xf3\x9a\x19\x8c\x68\xcb\x6a\x0c\xba\x51\x7d\x96\x5a\x9a\xa2\x24\xaf\x05\x69\x57\x01\x49\x04\xf4\x12\xe0\xd3\xc2\xd3\x8f\x3c\x09\x5b\x50\x9e\x6b\x1a\xc1\xc0\xda\x2e\xbe\x03\xef\x7b\x30\x85\xc6\xfa\x46\x00\xb0\xaa\x2d\x45\xf5\xf1\x23\x92\x87\xb1\x0f\x32\x51\x3d\x98\xe7\x1e\x61\xc0\x9b\x33\x08\xe1\x3b\x34\x2d\x3c\x57\x24\x91\x95\x23\x64\x7c\x4f\x6f\xf7\xf6\x4b\x56\x78\xc3\x73\xbb\xd0\x4a\x0d\xcb\xf5\x6b\x01\xb3\x01\x76\x6a\x8e\xe6\x77\xd1\x6a\x6a\x00\x21\x3d\x69\x2d\x30\x73\x42\x8c\xff\xc5\x48\xbf\x67\xec\x86\xf5\x5c\xae\x42\xb1\xf0\xf2\xe9\xda\x9e\xc0\xab\x18\x88\x84\xfd\x4b\x1a\xd5\x06\xfe\x8a\x06\xbc\x40\x4c\x39\xec\x03\x0b\x9c\x1c\xdd\xda\x5a\xc2\x57\xb9\xd2\x6a\x4f\x5f\xeb\x12\x02\x8d\xa5\x12\x3a\xbe\x0c\x36\x45\xc5\x17\xf0\x39\xcc\xa6\x72\xc6\x99\x73\x4f\x00\x5a\x42\x43\x24\x78\xc7\x71\x92\xa2\x05\x81\xbe\x31\x2a\xb9\x70\xec\xc5\x33\x79\x1d\xbd\xf2\x6f\x48\xfe\xa2\x13\x09\x4e\x02\x00\x03\x2c\x45\x23\xdc\x4a\xc9\xa5\xd3\xe4\xfd\xa1\x00\xd2\x1f\xa8\xde\x3f\x34\x97\x0b\x33\xf9\xf9\x88\x0c\xa5\x4e\x3c\x61\x0d\x51\x9d\xba\x9b\x81\x7d\xff\xe6\xe2\x22\x6e\x10\x09\x3c\x6e\x45\xb5\x89\x02\x14\xed\x2f\x8e\xb5\x60\xbb\xb0\x04\xaf\xab\x4a\xb1\xf1\x4d\xbc\x7e\xbc\xb3\x2a\x61\x1b\x20\x6f\x9b\xad\x90\x54\x15\xdb\x17\x32\x9d\xf4\x80\x86\x7e\x00\x1a\xb2\xb8\x20\xf2\xcc\x3c\x98\x00\xa8\xa0\x7d\x97\xb8\xfb\xc8\x6e\x35\x62\xab\xd0\x6a\x6e\x09\x0e\x29\x77\xbb\xe6\x31\x3c\xae\x8c\xe4\x83\x92\xa8\x48\x5e\x78\xc7\xe0\xb9\x6d\xaa\x32\xdd\xb2\xa7\xf5\x60\x76\xe4\x06\x27\xad\x9d\x0e\x85\xdd\x70\xc5\x75\x9d\x44\x60\x17\x48\x94\x2f\x80\x5c\x9d\xdf\xd2\x39\x25\x6c\xa0\x79\xbe\x1d\x46\xed\xfa\xb6\xf9\x2b\xc3\xe7\x31\x5c\x5f\x99\xff\x4e\x3a\x4a\x2d\x57\xba\xe8\xda\x1c\x6e\x0c\xb0\xf9\xee\x4e\x88\x3c\x6c\x5c\xcc\x14\xeb\x89\x89\x0c\xba\x16\x05\x04\xc0\x21\x05\xed\x2b\xfe\xc9\x60\x1d\x36\x5f\x9a\x59\xd5\x5b\x66\x36\xad\x32\xb8\x54\xca\x6a\x07\x35\xa6\x5d\xac\x71\x22\x39\x67\xd3\x72\x23\x90\x40\x08\xf0\x4e\x3c\x11\x8a\x6d\x7a\x2f\x09\x41\xa0\x3d\x68\x28\xd0\x10\xa0\x6d\x10\x9c\x8b\x06\xd4\x48\xb8\x3d\x1e\x4e\x14\x01\x4b\xf7\x7b\x21\x83\xc8\xe5\xda\x53\xf1\x49\x19\xa7\xca\x48\x01\x38\x77\x33\x85\xd5\xe9\x33\x7f\x02\x1a\xc9\x09\x40\x1a\x8f\x85\xb3\x20\x09\x0d\x1a\xe9\x93\x06\x31\x08\x6c\x5f\x00\x90\xc0\x3d\xb8\xd1\x3b\x06\x26\x46\x79\x84\x7a\x17\x73\x35\x10\xb2\x89\xc3\xaa\x44\x9b\xb7\x43\x78\xbd\x3c\x55\xc2\x46\x90\xef\x6b\x3e\x1b\x8d\xb3\x44\x88\x7d\xc9\x4d\xe1\xdc\x13\x3c\x48\x38\x40\xd7\x5a\x60\x1c\x6f\x4d\xa0\x76\x48\xae\x9e\xe6\xfa\x02\xb6\xce\xf6\xa1\x10\x17\xc1\x45\xcf\xf6\x68\x58\x82\xe2\x1c\x21\x14\x2e\x33\xa4\x4b\x41\xde\x3a\x2a\x65\xba\x5f\xf7\xf1\xf6\x58\xf4\xd5\xa6\xca\xa8\xa4\x10\xef\xe4\x65\xd7\xab\xfd\x0e\x25\xbc\x3a\x09\xa3\xfa\x7a\x67\xcb\x47\x22\xd6\x28\xb5\xf7\x2f\xe5\x4f\x5c\xdb\x0c\x44\x08\x96\x58\x59\x41\xeb\x53\x9c\x6a\xbe\x70\x33\x1e\x93\x47\xed\x9d\xe7\x24\x04\xdb\xcf\xfe\xa0\xae\x74\x95\xde\x83\x04\x12\xa3\x85\x22\x55\x46\xf6\x0c\x3d\x5a\x0e\xe8\xd5\xaa\xad\xcf\xec\x91\x37\x2d\x71\x37\xc0\xb4\x83\xda\xf8\x52\x3f\x2f\xc8\xcf\x73\x90\x26\xe2\xd8\x26\x24\xc3\x4e\xd8\xc8\x0b\x13\x83\x20\x43\xb4\x5d\xe4\x37\xb9\xa3\x44\xf7\x74\x7a\x06\x82\x97\xb3\x6d\x55\x19\xf8\x68\xb9\x42\xbd\x5b\xfb\x03\x68\x3c\x2d\xcb\x35\x1b\x70\x0d\xfe\x3b\x8c\x50\x2c\x89\xbc\x4b\x1d\xb1\x7f\x08\x0c\x6f\x5b\xe0\x4b\xc1\x2c\x86\x34\x20\x7d\x63\xfb\x61\x0a\x2b\xbd\xcc\x52\x8f\xaf\x6f\xca\xc4\xca\x4c\xdb\x8e\xfd\x3a\xf3\x2d\xdd\xd2\x71\xec\x23\x43\xfb\xbf\x3b\xf0\xe6\x27\xea\x8d\x76\x9f\x33\xce\x9c\xb2\xb2\x26\xcc\x66\xeb\x6d\x5e\xeb\xc2\x20\x4f\x0f\x82\xee\x5a\x74\x55\x9d\xec\x21\x5c\xe5\x55\xd5\x48\x46\x22\xbe\x46\x97\x4b\xcb\xdb\xa4\x50\x8c\x1b\x6b\xd1\xc6\xac\x06\xa5\xe4\x3c\x6f\x84\x8a\xf8\x50\x74\x63\x0b\x47\x53\x48\x85\x73\x51\x1c\x83\xe4\x52\xe7\xd2\xa7\xee\xc2\x25\x4f\x0e\x76\x9e\x2f\x8d\xf4\x67\x93\xd8\xb4\x75\xe9\x4e\x98\xb5\x34\xd9\x1b\xb8\x4a\x2a\x37\x21\xc9\x28\x0a\x05\xf2\xc0\x2d\x4a\xb0\x00\xcb\x48\xe1\x21\x06\xa8\xb1\x0f\x0e\x29\x86\x55\xe5\x76\x31\x42\x2d\x19\x71\x16\x9f\x99\x92\xe4\xe7\xf4\xd5\x40\x4d\xcd\xba\xac\x8d\xba\x26\x8b\x7b\x1c\x68\xd0\xdf\xa9\x5b\x0f\x80\x3b\xa8\xf3\xf2\xcb\xc1\x7e\x34\xf6\x02\xd0\xe8\x07\x06\xd6\x48\xab\x04\x05\xf1\x0e\x82\xd2\x1c\x3d\x5e\x2f\xf5\x13\xc8\x3b\x04\x39\x7f\x05\x5d\xcc\x77\x07\xb8\xdc\x01\x46\x08\xaf\xe4\x37\xf9\x5a\x4f\xf0\xde\x04\x3b\x7c\x1f\x62\xd6\xf0\x47\xd4\x18\x13\xb9\x9d\x43\x2e\x55\xf4\xf4\x05\xa3\x01\x44\xe5\xef\xa1\x5a\xdd\xa7\xab\xb0\x83\x47\x05\xa6\x9f\x67\xd8\xf6\x35\xf6\xba\xda\x05\x1e\x31\xaa\x56\xd5\x9e\x40\xc3\x17\x89\x93\xbc\x12\x16\x56\x77\xb6\x05\x0f\x64\xc9\xae\xbb\xbf\xaa\x9e\x92\xb3\xb2\x6c\xbe\x53\x1d\x64\x8f\x90\x4b\x30\x3c\xbc\x5c\xd2\x32\x32\xc2\xe3\x10\x84\x0f\x3e\xfc\xf2\x15\xe9\xdd\x81\x26\x09\x4e\xf1\x95\x6e\xce\x45\x56\x98\x56\x06\x8d\xad\xa6\x2e\xa9\x90\xef\xe9\x30\x15\x2d\x92\x0f\x11\x18\x58\x02\x3f\x6f\xc4\xb3\x11\xab\x6d\x0c\x48\x13\xb7\x1b\xc7\x9a\xe7\x51\x39\x48\xc4\x35\x02\xe8\x31\x5f\xa7\xd9\x36\x02\x18\xc3\x1d\xba\xea\x6b\x38\xc0\xce\xf5\x44\x31\x60\xad\x43\x41\xb1\x84\x59\x7d\xc7\x08\xe0\xb9\xf4\xda\x9d\x4b\x0f\x99\x1b\xc3\x9f\x23\x2d\xae\x46\x20\xce\xf5\x77\x9f\x7c\x22\x02\xa2\x89\xff\xad\xa2\xa7\x91\xa0\x98\x50\xe1\xb1\xea\xb9\x22\x35\x74\xac\x67\x6b\xbc\x26\xb2\xb5\x19\xa8\x99\x3b\x1c\xa2\xa7\xb1\x72\x31\x73\x26\x66\x85\xb2\x9b\xac\xca\xfc\x72\xe5\x42\xc3\x28\xc8\xea\xda\x8a\x90\x54\xf7\x85\xa5\xa9\x49\x6c\x8b\x74\x64\xe0\x15\x9b\xaa\x5c\xe4\xc6\x4b\xdb\xa7\xa6\x2a\x44\x4a\x93\xc7\x38\xb3\x44\x4d\x0b\xb6\xaa\x5b\x1b\xdb\xcc\x82\x61\xc5\x9f\x28\xb6\xeb\x85\xa9\x5a\xe0\x42\x46\x10\xb3\xeb\xe1\xd1\xe7\xf8\xf9\xb8\x0e\xf0\x79\x03\xd6\x63\x60\xa6\xae\xc3\x3e\xe8\xa1\x09\x45\x76\x58\x9d\xc4\x0a\x7e\x04\xc5\x77\x47\x94\x88\x2c\xee\xd1\x37\xa2\x30\x0f\x63\xf7\xda\x0d\x45\x45\x8e\x66\x0b\x62\x6d\xa8\xfa\xc0\x1a\x6a\x0d\x52\x80\xf9\xc1\x68\xed\x84\x0c\x14\xbe\xfd\xd9\x83\x13\x72\x54\xe9\x7d\xc9\xe9\x31\x7e\x16\xc4\x3e\x9f\xdf\x4a\xb2\x2a\x0f\xce\xe6\xa6\x2a\xbf\xed\x50\x33\xd0\xa4\xd9\x92\x05\xf9\x56\x5b\x60\x87\xfa\xfe\xcd\xe0\x9e\x44\x65\x20\x89\x27\x6c\xf9\x06\xb9\x4e\xfc\x60\x04\x37\x8c\x53\xfa\x61\xd0\x24\x02\x45\x24\x89\xd8\xde\xc2\x91\x81\xa7\xf3\x37\x38\xe8\x24\xed\x98\x4b\x98\x5d\x36\xf8\x7d\x5f\xdc\xe0\xde\x51\xd8\x4e\x82\x1d\x81\x86\x8a\xe1\xdf\xb2\x8a\x44\xc2\x2d\xa2\x2f\x08\x53\xb5\x61\xaf\x43\xb1\x08\xa2\xea\xcb\x0e\x64\x15\xd8\xa6\x24\xa2\xe7\x59\x73\x5d\xaf\x08\xe2\x8d\x8b\x1c\x12\x7e\x62\x81\xe2\x21\xf8\x66\xe0\x0b\x0d\x70\x5d\x7d\xa6\x52\x03\x3c\xfa\x3e\x8d\xa6\x23\x35\x9e\xa9\xeb\x89\xfa\x3c\x9c\x4e\x87\xd7\xf3\x2f\xea\xc3\x64\xea\xfe\xa0\x6e\xa6\x93\x8f\xd3\xe1\x55\xa2\xe6\x13\xf8\xf7\xe8\x1f\xe7\xa3\xeb\xb9\xba\x19\x4d\xaf\xc6\xf3\xf9\xe8\x42\xbd\xff\xa2\x86\x37\x37\x97\xe3\xf3\xe1\xfb\xcb\x91\xba\x1c\x7e\x1e\xa8\xd1\x3f\x9e\x8f\x6e\xe6\xea\xf3\xa7\xd1\xb5\x9a\xb8\xa7\x7f\x1e\xcf\x46\x6a\x36\x1f\xba\xcf\x8f\xaf\xd5\xe7\xe9\x78\x3e\xbe\xfe\x08\xcf\x3b\x9f\xdc\x7c\x99\x8e\x3f\x7e\x9a\xab\x4f\x93\xcb\x8b\xd1\x14\x14\xc3\x5e\x4e\xa6\xf8\x45\x75\x33\x9c\xce\xc7\xa3\x99\x6b\xc6\xcf\xe3\x8b\x91\x6c\x92\xea\x0d\x67\x6a\x3c\xeb\xa9\xcf\xe3\xf9\xa7\xc9\xed\x3c\xb4\x7d\xf2\x41\x0d\xaf\xbf\xa8\x7f\x18\x5f\x5f\x24\x6a\x34\x86\x07\x8d\xfe\xf1\x66\x3a\x9a\xcd\x46\x17\x6a\x32\x55\xe3\xab\x9b\xcb\xf1\xe8\x22\x51\xe3\xeb\xf3\xcb\xdb\x8b\xf1\xf5\xc7\x44\xbd\xbf\x9d\xab\xeb\xc9\x5c\x5d\x8e\xaf\xc6\xae\x9d\xf3\x49\x02\x6f\xa3\xcf\xf2\xd3\x5d\x63\x26\x1f\xd4\xd5\x68\x7a\xfe\x69\x78\x3d\x1f\xbe\x1f\x5f\x8e\xe7\x5f\x40\xe6\xec\xc3\x78\x7e\x3d\x9a\xcd\x60\xe8\x86\xd8\xf2\xf3\xdb\xcb\xe1\x54\xdd\xdc\x4e\x6f\x26\xb3\xd1\x00\x07\xf0\x7a\x3e\x9e\x8e\xd4\x74\x3c\xfb\x07\x35\x9c\xf1\xb0\xfe\xe9\x76\xe8\x9f\x73\x33\x9a\x7e\x98\x4c\xaf\x86\xd7\xe7\x23\xf7\x2a\xd9\xe5\xf1\x0c\x7a\xab\xbe\x4c\x6e\x07\x6a\xf6\x69\x72\x7b\x79\x11\xfd\xdd\x0d\xd3\x48\x5d\x8c\x3e\x8c\xce\xe7\xe3\x9f\x47\x89\xfb\xa0\x1a\xce\x66\xb7\x57\x23\x1a\xed\xd9\x1c\x86\xe7\xf2\x52\x5d\x8f\xce\x47\xb3\xd9\x70\xfa\x45\xcd\x46\xd3\x9f\xc7\xe7\x30\x0a\xd3\xd1\xcd\x70\x3c\x75\x63\x74\x3e\x99\x4e\xdd\x53\x26\xd7\xb8\x86\xde\x0e\xb0\x70\xc1\xa7\xdb\x2e\x19\x23\x8f\x87\xc6\xb5\x5b\x3e\xa3\x9f\xdd\xe2\xb8\xbd\xbe\x74\xe3\x30\x1d\xfd\xe9\x76\x3c\xed\x5a\x22\xee\xf9\xc3\x8f\xd3\x11\x0c\xb3\x5c\x11\x9f\xc7\x97\x97\x30\x77\xcd\x65\x91\xc0\x57\xae\xbf\x88\x65\xf1\x45\x7d\xfe\x34\x51\x57\x93\x8b\xf1\x07\x37\x29\xb4\x6c\xce\x27\xd7\x3f\x8f\xbe\xcc\xa2\x51\x19\xce\xc4\x7a\x1d\xbe\x9f\xb8\x81\x79\x3f\x52\x97\x63\x68\xcf\x7c\x02\xa3\xe4\x66\xed\x62\x78\x35\xfc\x38\x9a\x89\x75\x01\xef\x24\x71\xe6\x44\xcd\x6e\x46\xe7\x63\xf7\x1f\xe3\xeb\xf3\xf1\xc5\xe8\x7a\x3e\xbc\xc4\xa1\xba\x9e\x8d\xfe\x74\xeb\x66\x76\x78\xc9\x0f\x51\xc3\xe9\x78\xe6\x9e\xe0\x96\x26\x4d\xe3\xed\x6c\x04\xcb\xef\x9a\x97\xcd\x7c\x02\xbf\x93\x8d\x3d\x0a\xef\x6e\x2f\x49\x75\x39\x99\xc1\xfa\xbb\x18\xce\x87\x0a\x5a\x3c\x1f\xaa\xf7\x23\xf7\xe9\xe9\xe8\xfa\x62\x34\x85\x1d\x36\x3c\x3f\xbf\x9d\x0e\xe7\xf0\x32\xf7\x8d\xd1\x4c\xcd\x6e\x67\xf3\xe1\xf8\x1a\x67\xc3\xf5\x17\xf6\xf7\x78\x7a\xe1\xb7\x18\xac\xda\x0f\xc3\xf1\xe5\xed\xb4\xb5\xee\xe6\x13\x35\xb9\x19\xc1\x23\x61\xfd\x89\x99\xc0\x4f\xcc\xfa\x09\x4c\xbe\x1a\x7f\x50\xb3\xdb\xf3\x4f\x34\x6d\x2a\xda\xc8\x5f\xd4\xa7\xe1\x4c\xbd\x1f\x8d\xae\xd5\xf0\xe2\xe7\x31\x6c\x46\x7a\xcf\x64\x36\x1b\xd3\x98\x4c\xe8\x09\x34\x8e\xb8\xfa\x7e\x1c\xa0\x3f\xb9\xa9\x4c\x58\x81\xb3\x56\xcd\xd3\xe0\x05\x5d\x5e\xcb\xe8\xb8\xf3\x95\x55\x20\x12\x1a\xad\xe2\x50\xe9\xe1\x31\xd5\x08\xed\xa6\xb0\xc4\xc2\x90\x11\x94\x97\xa9\xce\xa9\x0e\x0a\xa9\x9e\x09\x50\x4f\xe7\x2f\x96\xdd\x11\x26\xdd\x19\x89\xe6\x11\x3d\xa2\x2d\xb8\x7e\xe0\xe9\xa0\xa5\x4c\x4f\xd2\x8f\x5c\x82\x64\x6b\x95\xe6\x25\xd6\x13\x6f\xdc\xdd\x07\x8a\x15\x28\xa1\xb5\xb0\x65\xbe\xad\x0d\x32\x59\xa3\x11\xe2\xcc\xef\xec\x21\xcb\x45\xdb\x3b\xc2\x75\x91\x0b\xcc\xd0\xe5\xa8\xc6\x2c\xd4\xb0\xc4\x03\x11\x4a\xe6\x9b\xc0\x25\x0f\x9a\x28\x54\x65\xea\x6d\x25\x79\x76\xd5\xe8\x1a\xa7\xb3\x4b\xf6\xf1\x13\xaa\x67\x0d\xa1\xff\x88\x10\x9c\x73\xa1\xc2\x17\x77\x93\x5d\x9b\x47\x7e\xba\x7d\x41\x81\x21\x12\x4f\x22\xa9\xcb\x8d\x54\x86\x10\xf2\xc8\x94\x77\xa3\x16\xde\x41\x1d\xac\xf3\xec\x4b\xca\xea\x6d\x6d\x4b\x3f\x0e\xf3\x6d\xb6\x46\xae\xaa\x52\xe9\xf4\x1e\xb2\x34\x1e\x52\x4c\xd9\x56\x20\xf0\x95\xea\xb9\x68\xe8\x18\x56\x4c\x47\xd1\x8e\x58\x64\x98\xf5\x99\x7d\xd6\xd2\xfa\xea\x85\x39\x21\x0e\x13\xa5\xeb\x5a\x53\x78\x39\xd8\xa6\x5c\x5c\xe7\x8d\x7b\x42\x97\x8e\xc1\x33\xb2\x7a\xe5\x5a\xec\x5a\xeb\xbf\xbc\xe6\xcf\xda\x9a\x6a\x76\x00\x93\x26\xaa\x35\x50\x11\xc7\xd6\x81\x15\x3e\xdf\xa1\x39\x45\xe1\x71\x41\x38\x19\x73\x3f\xc3\x93\xe0\x11\xf6\x1e\xe2\x42\x98\xc2\x0b\x54\x7d\x46\xf5\xd2\xa0\xb2\x99\xa3\x2b\xbb\x74\xe6\x61\x09\x21\x0e\x8c\x57\x31\x97\xd2\x6a\xeb\x19\x75\x5d\x6f\x56\xce\xe2\x1c\xbc\xf8\x5b\x37\x8a\xf0\x55\xe6\xe4\x13\x3d\xff\xc1\x42\xfd\x19\x3d\x75\x51\x65\x66\xa5\xb2\xa5\xd1\x8a\xa9\xa9\x28\xd7\x32\xf8\xbb\x86\x14\xfe\xdf\xee\x8c\xae\xfe\x4e\xfd\x2d\x7c\xbb\xe4\x9a\xce\xbf\x7b\x01\x71\x88\x4d\xc0\xfd\x44\x73\xfb\x93\x17\xc2\x8e\x66\x34\xab\x1b\xca\xd1\x59\xdd\x9d\x90\x7e\x8e\xa1\xab\xed\xf3\x2d\xf1\x84\x5d\x92\x96\xc7\x7b\x29\xea\x53\x8e\xe2\xba\xe3\x7e\xdb\x43\x19\xb4\xba\x1d\x7a\xe7\xeb\x61\xee\xcb\x4d\xe0\xe8\x62\xb7\x73\x6b\xcd\x6a\x9b\xa3\x53\xc9\x26\x96\x3b\xf7\xd9\xcc\x7a\x27\x55\x94\xf1\x39\x1c\x30\x0f\xa7\xcc\xaa\x65\x29\x95\xd5\x33\x0c\xa5\x99\x31\xcf\xf5\xa4\x39\xe7\x85\x9e\xae\x1d\xbc\xf8\x52\x6e\xa3\x35\xeb\xd1\xef\xf1\x59\xf6\x8c\xe9\x92\xbc\x72\x61\x0c\xc1\x93\x2b\xca\x3a\x51\xd6\x18\xf5\xb7\xf7\x75\xbd\x51\x56\xfd\xf4\xf2\xe5\xe3\xe3\xe3\xe0\xae\xd8\x0e\xca\xea\xee\x25\x23\x84\x5e\xfe\xdd\xe0\xc5\x30\xb7\xe0\x03\x44\xa4\x36\x65\xc1\x92\x82\x90\x30\x41\xdd\x74\x90\x0e\xc8\x4d\x5a\x57\x65\x91\xa5\x08\xa9\xd1\x1b\x53\xa9\xb5\xce\xf2\xc1\x0b\x06\xe4\xfb\xf3\x28\xd5\x41\x05\x12\x1b\x8a\xa1\xcb\x67\x84\x29\xd1\x69\xa4\x71\x42\x26\xf1\x58\x0d\x3f\xab\xf9\x46\xc4\x7b\xc3\x53\xd1\x20\x83\x14\x02\x37\x99\x76\xbf\x33\x10\x5e\xc9\x55\xa7\xd5\xa3\x59\x70\xca\x03\x17\x78\x56\x4b\xb9\x29\x8c\x56\x33\x1d\xb2\x56\x3d\xd6\x17\x83\x80\x19\x56\xd4\x19\xbd\xb4\xa1\x09\x90\x6d\x4c\xef\x01\x9f\xcf\xf9\xb0\x25\xa3\xc7\x51\x0d\x08\x39\xed\x77\x56\xc4\xc3\x89\x3b\x94\x78\xeb\x40\x7f\x2a\x90\xf8\xb9\xbb\x36\x8a\xbd\x2c\x4c\x5d\x13\x0e\x4a\x38\x7a\x74\x51\xbd\x83\x15\xe0\x6b\x13\x5e\x85\x12\x06\x4e\x95\xc5\xdc\x75\x5f\x1a\x23\xee\xc6\x10\xc6\xc9\xac\x37\x79\xb9\x33\x15\xc7\x8e\x85\x5e\x03\xab\x0e\x9a\xaa\x0f\x38\x3b\xe7\xf2\xe5\x30\xc2\xba\xd8\x41\x26\xd2\x66\x77\x05\x52\xab\xf1\x21\x18\x8c\x9f\x5e\x40\x56\x08\xe1\xf9\xa0\x4e\x02\xd3\x86\x30\x87\x78\x6d\xba\x05\x1f\x09\x5f\xa2\xe9\x02\x15\x4d\xe8\x68\xfa\x3d\x04\x32\xd5\xcf\xdc\x0a\x7f\xf3\xfb\x8f\xf8\x19\xbc\xfc\xac\xeb\xb4\x5c\x1f\x9f\x0e\x4e\x06\xf5\xb7\xfa\xb7\x78\xc7\xc9\xc9\xc9\xc9\xdb\xd7\xaf\xdd\xff\x9f\xfe\xf8\xe6\x44\xfe\xff\xc9\xc9\xc9\x9b\x93\x1f\xdf\x9c\xfd\xcd\xe9\xab\xb3\xb3\xb3\x93\x93\xb3\xd3\x37\x3f\xfe\xcd\xc9\xe9\xd9\xeb\xb7\x3f\xfe\x8d\x3a\xf9\x2d\x1a\xd3\xfc\xd9\x3a\xc3\x45\xa9\xbf\x79\xd0\xcb\x6c\x7d\xe0\x73\x4f\xfd\xfd\xbf\xe9\xcf\x6c\xb7\xd0\xd6\xa8\xc9\xc6\x14\x0a\x57\x42\xf3\x0a\xe2\xcb\xff\x74\x70\xf2\x02\x9c\x47\x74\x97\x66\x5f\xde\x0f\xdd\xbf\x6e\x46\xd7\xea\xf3\x70\x7e\x3e\xb9\x52\xb3\xc9\x87\xf9\xe7\xe1\xd4\x39\xff\xb3\xf3\xe9\xf8\xbd\x73\xf4\x46\x97\x93\xcf\xea\xa8\xc7\x7f\xea\xf5\xd5\xd8\x39\x82\xef\xff\x7e\x74\x3e\xe7\xc0\x43\x97\xb9\xae\x66\xa3\xb9\xbb\x9c\xe7\x9f\x9c\x6f\xbe\xe7\x85\x37\xb7\xef\x2f\xc7\xe7\xea\x72\x7c\x3e\xba\x9e\x8d\xc4\x57\xf8\xb5\xf4\x97\x5e\x7f\x00\xfe\xe6\xd5\xf0\x0b\x38\xb3\xec\xef\xfa\x06\x8f\xaf\xc1\xac\xb8\x1a\x5e\x5f\x8f\xa6\x1c\x3b\x80\xb8\xc5\x39\x84\x91\xf6\xb6\x92\x06\x83\xde\x83\x6f\x19\x5f\x5f\x8c\xcf\x9d\x9b\xfa\x65\x72\x3b\xa5\x27\x40\x20\xe5\xfd\x97\xe6\x8b\xc0\x39\x17\xde\x36\xdb\x38\xe0\x6d\x0f\xdd\x2b\xdc\x97\xa6\xa3\x9b\xe9\xe4\xe2\x16\xa3\x23\x10\x6c\xf8\x02\x4e\xfd\x54\x5d\x8c\x67\xf3\xe9\xf8\xfd\xed\x7c\x7c\xfd\xb1\x1f\x75\x69\xe0\xbc\x60\xd7\x9a\x8b\x09\x74\x99\x3a\x32\xbc\xbc\xe4\x36\x3f\xa3\x3f\x09\x7f\xfb\xf0\x80\x0d\x5e\x7c\xdf\x2a\x42\x89\x60\xb2\x78\xde\x45\x4a\xfc\x0d\x65\x39\x0a\xad\x33\x97\x4f\xec\xac\x78\x13\x84\xef\xc2\x9f\x28\xe6\x6e\x3c\xb1\x93\x0c\x04\x63\x1b\x7f\xb0\xdc\xc0\xf3\x97\xe7\xff\xf3\x7f\xc2\x6d\xf2\xa1\xac\xea\x4a\x17\x41\xb4\xd4\xa3\x4b\x8e\x7a\x6c\x16\xf7\xfa\x52\x92\xa0\x8b\xf8\x81\x04\xb4\x25\xd1\x22\xfa\x61\x58\xc2\x83\x2e\x5f\xee\x1c\x17\x11\xd2\x5d\x1a\x25\xe9\x9b\x05\x4c\x63\xb1\xa3\x16\x0f\xd4\xd0\x22\x3f\x51\x03\x4b\xc2\x14\x2e\xa7\x83\x53\xd0\xd8\x66\x20\x07\x16\x35\x90\xac\x17\x22\x20\x7f\x62\x2c\x4f\xcd\x92\xc3\xe8\x16\xd1\xbc\x51\x96\x0c\x70\x2d\x98\x65\x40\xd8\x56\xa2\x8e\xb2\xbe\x2f\x07\x58\x79\xe8\xa1\x47\x73\x15\xe5\xe3\x3e\x94\x3f\x56\x0f\x2c\xd8\xcb\xf7\x02\x99\xf4\x4a\x28\x39\xce\x32\x8f\xf6\x78\x40\x02\x5a\xa8\x19\x5b\x6b\x30\x78\x08\xc5\x13\x5c\x84\x09\xd7\xa3\x9d\x03\xeb\xac\x73\x0a\xe4\xca\x20\xa0\x95\xb7\x2c\x3c\xea\xaf\x32\x2c\x87\x43\x7e\x94\x70\xae\x5a\xcf\xf5\x1e\x85\x04\xd5\xbc\xf3\x25\xd2\xed\x31\xe4\x82\xb6\xbf\xda\x08\xc2\x0b\x9f\x1e\xbe\xac\xc0\xb0\xc6\x95\xd4\x06\x4a\x54\xad\xbf\x9a\x02\xfc\x0a\xe3\x41\x9f\xeb\x05\x17\xff\xc2\x12\x8e\xc6\x63\xe0\x57\xd9\x99\xea\x9d\xcb\x02\x99\xc0\xfc\x89\xc4\xb7\xc0\x9a\x4a\x45\x6a\xd0\x2a\x8c\x83\xf8\x0a\x12\x18\x70\x1f\x5b\x80\xbf\x92\xdb\x1f\x35\x31\xbc\xf0\x95\x7b\x21\x26\x6e\xcf\x85\xaa\x77\xc7\x52\x68\xf6\xf1\xde\x44\xbd\x2a\x57\x8d\x39\x66\x38\x4e\xe3\x7b\xb4\x3c\xdc\x5f\x48\x13\xcd\x19\xf6\x54\x3a\x04\x2f\xae\x4c\xb9\x0a\x0d\x7c\xad\x7a\x17\xc6\x99\xcd\xbd\x80\x91\xc7\xfa\x05\x5f\x9f\xa1\xe2\xe5\x26\xfb\x23\xab\x5f\x9d\x89\x0c\xb3\x05\xce\x88\x6b\x67\x65\xac\x01\x48\x19\xb8\x07\x18\x86\x82\xfc\xd3\xd1\xf4\x7f\x5c\xf4\xb9\xa9\x37\xcc\x4f\x7c\xcb\x38\x78\x5f\x3d\xc2\xeb\x38\xc4\x1a\x13\xcc\xef\xb0\xba\x0e\xbf\x69\x6b\xdb\x5a\x26\xe5\x2a\x6e\x2a\xe1\x47\xa1\x89\x01\x30\x59\x45\x45\x8d\xcc\x12\xe1\xfa\x32\xfd\x1f\x17\xf0\xdc\xee\x66\x5a\xf5\x68\xa0\x96\x92\x78\x6b\x70\x21\xd2\x7f\x5b\x29\x75\xf8\x54\xbb\x16\x3b\xd8\x0e\x04\x86\x94\x38\x49\xd2\xf5\x41\x9a\x8d\x8a\xe0\xe8\x61\xea\xde\xa8\xde\x25\xca\xbd\x7c\x2e\xab\xaf\x7e\x31\x13\x26\x00\x0e\x7a\x02\x02\xd8\xc6\xa4\x55\xad\x05\xc1\xb0\xc8\x25\x56\xb5\x1e\xa0\x64\x69\x24\xfc\xa1\x25\x6f\x55\x2f\x5a\x86\xd8\x96\x88\xb7\x4d\xd5\x65\xa2\x96\x26\x37\xf0\x0f\xbc\x4d\x68\x64\x29\xd4\xe7\x3e\x00\x5e\x1f\x16\xac\x86\xa3\xce\xd6\xd5\x36\x85\xa4\x28\xf9\xa7\x8d\x9d\x83\x52\x68\x54\x9a\xf9\x4b\xb7\xd1\xbe\x07\x3c\x73\x3f\x21\xd7\x1d\xb3\xe2\x7a\x11\x2e\xf0\x3d\xad\xa9\x08\x6c\xea\x99\x5f\xae\x22\x72\x4c\x8b\x77\x5b\x63\xb8\x60\xe1\xc8\x01\x6b\x55\x03\x69\x8c\x2c\x0a\x9e\x2f\x39\xcd\xef\xb8\xed\xee\xcc\x07\x29\x3c\xf3\x88\x5f\x10\xd5\x1b\x4d\xde\x2f\x1f\xdf\xe0\x98\x83\x4f\x1a\xc7\xb8\x54\x1b\x71\x1c\xc9\xd7\x86\x55\xf1\xa3\xea\x45\x63\xcd\x2b\xd4\xf5\xd5\x75\x85\x60\x49\xe7\x44\xe5\xec\x9d\xf4\xd0\x3e\xf6\xdf\xb9\x8a\x3b\xdf\xa1\xbd\xd1\x61\x62\x74\x96\x81\x86\x0a\xcf\xae\xf7\x15\x3b\x4f\xae\x0a\x3c\xab\x77\x95\x5e\xe2\xe1\x8e\x1a\x59\x2c\x59\x5d\x56\x84\x66\xff\xae\x77\x23\x2e\x50\x12\xb5\x06\xde\x19\x2e\x86\xc0\x0d\xc6\xe6\x84\x47\xb6\x61\x30\xd1\x68\xa0\x2a\xc9\x72\x73\x64\xfb\x9e\x4f\xcd\xb5\x24\x5c\xe5\x75\x83\x42\x9e\xcc\x3f\x22\xac\x87\x2f\xc8\x5e\x43\xd9\xd9\x2f\x1a\xcb\x30\xab\x7f\x50\x3d\x79\x14\xf2\xa4\x52\x81\x48\xf3\x64\x83\xc8\x9a\xd7\x1e\x21\xbe\x06\x77\xba\xde\xa3\x72\x06\x41\x49\x89\x73\x7e\x53\x65\x0f\xac\xa7\x85\x24\xe1\x6c\x57\xfa\xc2\xc3\x81\x1a\xca\x47\xfe\xd0\xfd\xe6\xac\x90\x2f\x48\xf5\x46\x03\x27\x1c\x56\xa4\x95\x40\x81\x5d\x25\x1c\x2f\x32\x89\x5a\x83\xbe\x6a\x12\x89\x78\x31\x4f\x19\x02\x09\xf4\x1d\x03\x27\x94\xe0\xb4\x4f\xf6\xdf\x24\x47\xa2\xf1\x9e\xf3\x9c\x7f\xd3\x0f\xb8\x15\xe6\xf3\xd0\x36\xba\x62\xc2\x80\xff\x91\x63\x78\x2d\x0b\xe2\x7e\xbb\x86\x40\x3b\x49\x3a\x05\x3a\xa6\xee\x8d\xc4\xd8\x3d\xbb\xcd\x6a\x5f\x39\x46\x8c\xab\x2d\xf5\x45\x14\xfb\xf4\x05\xd2\xc8\xb7\x0c\x84\xbb\x59\x38\x04\xb8\xfc\xdd\x1d\x5c\x41\xd5\x7e\xbf\xf6\x7d\xa2\x6c\x5a\x65\x9b\xda\x7a\x41\xb0\x20\xbf\xdc\x10\x14\x93\xdc\xbb\xa4\xc8\x0b\x2c\xea\xd0\xf0\x23\xb1\xe6\xfb\x61\xa4\x4e\x4f\x54\xef\x4b\xb9\xed\xb9\x7e\xbb\xff\x10\x06\x9e\x5c\x85\x90\x6b\xa3\x0c\x24\xda\x7a\xcf\xd1\x99\xc5\x20\x9f\xf8\x1a\x08\x8b\x34\xdf\xe7\x4d\x17\x28\xaa\xc4\xa7\xf3\x55\x0c\x3d\xb5\x09\x15\xa2\x84\x72\x64\xae\x4e\xc1\x77\x92\x8c\x00\x0f\x0c\xd2\x99\x7f\x29\xb7\x09\xd9\xea\xa1\xc8\x36\x3e\x4d\x41\x93\x37\xe9\xb0\x46\x20\xba\x19\x8a\xee\x82\xe8\x34\x9a\x14\xfa\xce\x63\x82\xe0\xbc\xc0\x46\x87\x92\x68\x80\xbc\xe3\x4e\x88\x40\xee\xbe\xea\xc1\xd9\xf8\x15\xa8\x49\xc3\x0d\xb7\xaa\xc1\x98\x4e\xc1\xce\x7b\x73\xf2\x7f\xf7\x9b\xe5\x34\xe5\xb6\xf6\x08\x50\x7b\xaf\x2b\x3c\x7e\xb1\x70\x0f\x77\x8b\x7c\xa0\x68\x13\xab\xe8\xdf\xf8\xa2\xea\x5b\x6b\xec\x3b\x75\x1e\xf0\x67\xff\x43\x4d\x05\x8f\xc1\x60\x26\x19\x3c\xf6\x40\xd6\x5a\x80\x53\x3a\x03\xdd\x60\x2f\xb8\x56\x05\x27\x20\x68\x42\x53\x5d\x0c\x08\x2a\x82\x2f\xd3\x41\x80\x03\x46\x6f\xf9\x58\xe4\xa5\x5e\x76\x9a\x2d\x58\x88\x7c\xdc\xae\x44\x4e\xe2\x8a\xe5\x50\xc7\x17\x7b\x89\x32\x20\xb0\xcf\x77\xa6\xde\x52\x48\x9b\x8a\xa5\xf8\x42\x6c\x34\x08\xa9\x5c\xa2\x00\x05\xfb\xe7\x67\x83\x53\x5f\xcd\x14\xfb\xa3\x09\xe7\x1a\x12\x16\xbb\x8a\x4a\x99\x85\xdf\xd0\x78\x1b\xea\x28\x56\xde\xc6\x6f\xd8\x5d\xe2\xaa\x78\xa6\x53\xd1\x69\xa7\xc7\x5c\x81\x19\x89\x0e\xc3\xe9\x52\xa4\x3e\xfc\xa0\x14\x6c\x23\xaf\x4b\x8a\xcc\xf3\xf0\x86\xe0\x78\xbb\x5f\xe4\x52\x3f\x2b\x36\x24\xeb\x88\x95\xcb\x17\x78\x2b\x24\x6c\x35\xb5\xf3\xe6\x39\x37\x4d\x23\x43\xd9\x05\x11\xda\x41\xe2\x69\x03\x00\x06\xa3\xab\x3d\x51\x03\xf7\xf5\x7d\x82\xc4\x5d\xdf\xc0\xce\x83\x6c\x49\x93\xcc\x06\x4c\x09\x31\x0a\x8b\xa7\x46\x61\x8f\x70\x31\xcc\x26\x64\xf4\xfd\xdf\x1b\xe6\x56\x74\x3f\xe3\xde\x40\x42\x47\x3c\xe3\xbf\xa0\x3e\x37\x2d\x16\xec\xa3\xac\x9f\xc3\x7c\x13\x51\x64\x10\x38\x93\xbc\x92\xa2\x6d\xe8\x60\x6c\x22\xaf\xf1\x2b\xcc\x6d\xd2\x20\xb8\xa8\x08\xb1\xcd\xb5\x8c\x3f\x78\x8a\x2e\x53\x19\x38\x8c\x13\xc1\x1a\x18\xa8\x1c\xf0\x9c\x9e\xb1\xce\xd0\x40\x0c\x5f\xda\x07\x47\x00\xd0\xa2\x9e\x87\x65\xa7\x56\x46\x23\x8a\x42\x24\x0b\x25\x5c\xbf\x73\x48\xb1\xb4\x36\xcf\xd2\xaf\xc7\x8f\x95\xde\x10\x85\x3c\x87\xf0\x28\x25\x66\x89\x82\x05\xa5\xd6\x04\xa8\xd3\x1d\xdb\xee\xbb\x5c\x70\x5e\xa8\xde\x98\xfe\xde\x53\x8b\x6d\x5d\xe3\x05\xc0\xa0\xe8\xb5\x71\x5e\x58\x66\x99\x23\xb4\xf5\x5e\xae\x3b\x67\x16\x74\xc1\x76\x19\xc4\x0e\x02\xc2\xd4\x93\xa3\x6c\x63\x42\xc3\xb6\x47\xef\xd7\x16\xda\x53\x31\x1b\x45\xec\x3a\xf7\xf9\x0a\x99\xf9\xb2\xc6\xb8\x28\x29\x1e\x8b\x3a\xd4\x13\x83\x21\x62\x12\xac\x58\xcb\x6a\x08\xe2\x34\x49\xad\x4c\x6c\xbb\x67\x05\xfa\x9d\x82\x61\xb8\x62\x62\x80\x50\xc0\x1e\xdb\x9c\x20\x21\x83\x45\xe3\x44\xd9\x03\xdf\x0a\xd2\x17\x78\x4d\x04\x9d\xe9\x03\x57\x92\x69\x9a\xde\x67\x83\xb3\x5f\x76\x06\x63\x7c\x27\x6a\xec\x2f\x3d\x18\xb9\x0a\x8a\xc5\x19\xe3\x46\xf3\x96\x70\xb7\xc5\x63\x87\x2a\x7f\xe3\x44\x68\x8e\xe0\xbb\x3d\xe7\xd0\x72\x8b\xd9\xee\xd6\x05\x28\xab\x84\x99\xb9\xc5\x7c\xcb\x6c\x9d\x50\x69\x2f\x91\xa3\xaa\xd1\x37\xa8\x0b\x56\x43\xdf\x51\xf4\x83\x57\x9d\x7e\x61\x9e\x77\x46\x1d\x61\x92\xbc\x19\xe5\xc3\xe7\x60\xd8\xa2\x89\xf5\x0c\x91\x6e\xd7\x29\x8c\x77\xa0\x4d\x80\xdf\x66\xf2\x07\xb0\x27\xc8\x35\xc5\x4f\xbd\x8b\x0f\x17\x3f\x26\x80\x32\xd8\xd7\x70\x9c\x70\xb3\x8c\x7b\xd0\x45\xeb\xf0\x0c\xc1\x57\xe9\x41\xe7\x31\xb7\x9d\x35\x10\x29\xab\xc1\x67\xe5\xc9\x7f\xa5\x16\x26\x2f\x1f\x93\x2e\xc1\x51\x5a\x89\xad\xad\xe3\x8e\xe2\x47\x93\x3f\x18\x75\x74\x7a\xd6\x57\xeb\xb2\xa8\xef\x6d\x88\x79\xf0\xb0\x20\x8b\x53\x4e\x8f\xc1\x1a\x57\x38\x0d\xe1\xbc\xcd\xf0\x5d\xa6\xc2\xc2\x6b\x3a\x66\x37\x70\xed\xc1\x29\xdc\x08\x99\x37\x46\xef\xd0\xc8\x05\x30\x09\xf8\xcd\x47\x66\x70\x37\x08\xb6\x1d\x95\x82\x3d\x9a\x85\xb2\x59\x6d\xfa\x72\xce\x96\x7d\x77\x12\x7c\x09\x7d\x6f\x1e\x19\x91\x08\x9d\x70\x71\xd0\x99\x2b\xf2\x5d\x12\x26\x3d\x1c\xb4\xcd\x55\xe6\xb9\x86\x31\x02\x85\x6a\x2b\x22\x46\x09\x48\xc3\x1c\xbc\xb3\xe8\xda\x4d\xe2\xd5\xf9\xc4\x06\x8d\x75\x07\x9f\x58\x3b\x54\xec\xd7\xc6\xea\xa0\xae\x35\xb1\x14\x97\x0b\xb0\x31\x9a\x17\x78\xd3\x2c\x31\xed\x50\x07\x7b\xbb\xad\x46\xb2\x1e\x8d\xc0\x67\x61\x53\x61\x86\xcb\x47\x4f\x4d\x1c\xaa\x77\x9b\xc7\x21\x34\xa7\xf5\xa9\x10\xfb\xc2\x0e\x17\xa5\x02\x38\xe8\xa6\x2a\x6b\xf6\x0b\x56\x32\x39\x04\x27\x8d\xc8\x37\x30\x4b\xe4\xde\xdd\xe6\xbe\x14\x4d\x08\x46\x26\xa9\x36\xce\xd2\xd5\x4f\x65\x49\xb4\x3d\xa4\xc7\x01\x4e\xd6\x8a\xeb\xfa\xc0\x31\x81\x24\x09\xd3\x8b\x22\x27\xbc\x10\xb2\xde\x85\xcb\xe5\x15\x7c\x3e\xc4\xa8\x74\x1a\x18\x46\xe0\x96\xc5\x72\x5c\x32\xac\x50\x1c\xe5\x50\x5f\xe9\x8c\xa8\x25\xab\xaa\xc7\xf7\x76\x85\x52\xbb\xe6\x32\x9c\x30\x6e\xc1\x64\x05\xd6\x81\x58\xbb\xad\xdc\x2d\x85\xb5\x1f\x7e\xea\x42\xfc\x8a\x02\xb6\x8d\xa1\xaf\xdb\xcf\x17\x24\x13\xc4\x59\x52\x07\x62\x0c\xa1\xf1\x56\x1b\xa8\x33\xde\x4a\x15\xc5\xa0\x58\x1e\xc6\x94\x1c\xd5\x83\x03\xc3\x86\x7f\x93\x21\x1f\xb3\x62\x20\x60\x84\xb9\xb6\x05\x80\xce\x1a\xb3\x46\x31\x85\x40\xac\x21\xeb\xe6\xe1\x8c\x3c\xd4\x56\xe1\xbf\x43\x4e\x56\x87\x1b\x1c\x49\x6b\x7c\x1c\xa4\x0e\xc4\x17\x88\xf6\x6e\xb0\x4f\x0b\x1b\xd9\x35\x9b\xbc\x65\xc0\x42\x1b\x70\xde\x02\x33\xa6\xef\x9f\x35\xc0\xf6\x1b\x3a\x73\xb0\xb1\x28\x64\xca\x18\xad\x36\x34\x2e\x66\xc4\x68\xf3\x8a\x44\x04\xb5\x80\xb5\xa2\x34\x4b\xe3\x1e\x88\xed\x22\x2c\xa0\xfc\x82\xfc\x37\xcd\x0e\x50\x62\x33\x26\xa6\x5f\x00\xc5\x6a\xcc\xbb\xd1\x7c\x2e\x6c\xb3\x57\x03\x7c\xee\x47\xd8\x19\x20\x7f\xc9\x92\x04\x1c\xe7\x22\x83\xb6\x39\x31\x49\xbc\x8d\x78\x0e\x68\xc9\x74\x45\x9f\xc5\x9c\x20\xa7\x4b\x9c\xb6\x46\xfb\x4d\x32\x92\xb6\x58\xd2\x22\x6a\x34\x1f\x81\x10\x27\xe9\xc1\x90\xc3\x33\xe6\xf7\x48\xe4\x0e\x71\xf6\xfa\xfb\xf8\xfa\x20\xfa\xd2\x4a\x85\xef\x37\x7b\x13\xd5\x40\x93\xd3\xe5\xdb\x36\xeb\xf8\xd4\x01\xb6\x64\xa4\x95\x41\xc5\x46\xe4\xfb\xb2\x21\xc2\xe2\x47\x3f\x72\xff\x2c\x18\xbb\xee\x2b\x67\x83\x33\x98\xe5\xd7\x03\x25\xb2\x72\x36\xb0\xc0\x60\x2e\x59\x69\xf9\x67\x8c\xae\xad\x17\xed\xec\x0d\xc5\x47\x88\xc7\xe0\x7b\xd2\x72\xcd\xb8\x0b\xb8\x12\xe2\x95\x98\x93\xc2\x7a\x66\x2f\xff\x39\x26\xbb\x98\x32\x10\xe8\x05\x24\x0d\x7b\xd3\x32\x57\xf7\x21\xf6\x2b\x38\x93\x57\xdb\x7c\x95\xc1\xec\x31\x70\xb2\x69\xef\x49\x42\x4b\x99\x94\x7e\x23\xeb\xa3\xc0\xb9\xa7\xc5\xe5\xc3\xb0\xa3\x0e\x22\xff\xa0\x4b\xe0\x7d\x10\xb8\x2a\xf8\xa6\x83\x27\x30\x9c\x81\x19\xe9\x30\x98\x90\x67\xa0\xf7\x56\x19\xbf\xad\xc2\x3d\x82\x97\xce\xa0\xb1\x64\x28\xd0\x24\x67\x99\xe4\x36\x88\x2e\x5a\xa8\x3d\x35\xb8\xfb\xe1\xce\xa6\x87\xe3\x65\x4e\xff\x80\xca\x48\x24\x5f\x2a\x08\x10\x9c\x63\xf9\x4d\x65\x7c\x45\xe9\xdb\x0e\x15\xb6\xb0\xbc\xa8\x34\xb3\x64\x21\x74\x2e\x4e\x27\x0a\x38\xb5\x32\x60\x34\x49\x79\x41\xa2\x54\x48\x58\x66\x86\x45\x93\xf8\x4e\x8a\xca\x2c\xb1\xd7\x94\x38\xe4\x68\x62\x93\x19\x4d\x92\xc1\xf7\x9a\x8d\xed\xf5\xa1\x79\x82\x61\x29\x26\x92\x8a\x4e\xcc\x50\xfa\xc9\x3d\x84\xaa\x0f\xd2\x90\x2f\x82\x35\xb7\x30\xf7\xda\x59\xbb\x78\x70\x7e\x41\x64\x77\xeb\xfe\x49\xbc\x11\x54\xfa\xaf\x04\x6b\xad\x6d\x30\x0c\xc2\xda\x27\x1b\x35\x0a\x16\xfd\x20\xa9\x12\xbd\xa9\x06\xbb\xa7\xd9\xeb\xbd\x66\x59\x08\x72\xf1\xed\xc9\x8c\x27\xac\xfa\xe3\x0e\x32\xb3\x32\xc5\x92\x20\xc4\xf9\x32\xb2\x2c\x20\xdc\x26\x4d\x8b\x7b\x5d\xad\xc1\x24\x6d\x0b\xf0\x64\x45\xba\xad\x2a\x0f\xc6\x21\x13\x43\x5b\x6b\x2a\x20\xa0\x27\x66\xc3\x30\x1e\xd0\x17\xf9\xf0\xc5\x8e\x19\xd9\xc8\xe4\xe9\xec\x2d\xcb\x05\xfe\xdc\xa8\x5f\xf6\xdb\x57\x2c\xf8\x67\x73\x01\x88\x55\xd5\x51\xf2\x1f\x55\xdb\x33\xe2\xfc\x99\x25\xf7\x93\x22\x6d\x06\x4b\x7d\xbe\x36\x14\x99\x10\xd1\x90\xa4\x0d\x8c\x4a\xef\x9b\x37\x2f\xec\x47\x41\xed\x00\xca\xb3\x7b\x2a\x5e\x42\x25\x75\xd8\xcb\x00\x6b\x0f\x1b\xda\x7d\x1d\x06\x3b\x6e\x68\xc7\xe3\x70\x5a\x16\x48\xbc\x53\xef\x6b\x64\x5c\x3e\xc3\x10\xbd\x6b\xda\x9a\xe1\x56\xe6\x53\x50\x37\x78\x5c\x05\x3b\x0c\xc5\xaf\x22\x81\xc5\xe8\xa8\x4f\x49\x51\x71\x4f\x4a\xf9\x0f\x83\xa8\x5c\x7a\x32\x55\xb3\xdb\x9b\x9b\xc9\x74\x8e\xd4\x19\x2d\xc7\x8e\x69\xb1\x40\xb4\xb4\xcc\x19\xff\x05\x40\x84\x4d\x65\x8e\x09\x79\xe1\x0c\x95\xda\x58\x60\xb8\x2a\x31\x6c\xb7\xda\xa2\x7e\x88\xfb\x25\xe6\xf3\x9f\x78\x85\xa9\xaa\xb2\xf2\xa8\x87\x6d\xce\xd1\x9f\x95\xce\xf2\x2d\x65\xad\xf2\x92\x48\xd7\x74\xad\x49\x77\x13\xbd\xcf\xac\x00\xfa\x77\x83\x2c\xff\xa1\xd5\x3a\x4d\xb7\x95\x4e\x33\x43\x27\xf7\xb3\xfc\x2d\x41\xbe\x18\x1b\xab\xdd\xf7\x28\x64\x18\x31\xd6\x44\x47\x21\x9c\x16\xa8\xf6\x58\x65\xf6\xeb\x80\x8a\x98\x7f\x86\x3a\xd7\xf3\xc9\x05\x94\xad\x53\x6d\xf8\x85\x2f\x08\x1f\x5e\x5f\xb4\x8a\xc2\x13\x75\x7b\xf3\x71\x3a\xbc\xc0\x42\x57\x9a\x2b\x59\x29\x0e\xdf\x22\x9c\x73\xf8\xcf\x1f\x66\x84\xc7\x9d\x4c\x8f\x66\x7d\x75\x74\x3e\xb9\xbc\xc4\xda\xea\xcb\x2f\x6a\x3a\xfa\x30\x9a\x4e\xb1\x30\x77\x38\x53\x3d\xfc\x4a\x2f\xd4\xce\x63\x39\x13\x20\x7b\x67\x58\x4b\x3d\x53\x7f\x80\xa7\xff\xb1\x0f\xff\x37\xbc\xbc\x54\xe7\x93\x6b\xc4\x11\x4f\xa6\x33\x2e\x53\xbf\xfc\xa2\x2e\xc6\xb3\xf3\xcb\xe1\xf8\x0a\x3e\x23\x8a\xcf\x43\x9d\x33\xe1\x86\x13\xfe\xd2\xaf\x50\xd9\xde\x7a\x78\x47\xad\x7b\x02\xdd\x19\xce\xc7\xb3\x0f\xc3\xf3\xf9\x64\xfa\x85\x8b\xd7\xe1\x0f\x4f\xd5\x76\xc1\x87\xb0\x3e\xf9\x1c\xbf\xf1\xa7\xdb\xf1\x68\xae\x46\xd7\x7f\x3f\xf9\x72\x35\xba\x9e\x27\x30\x30\xd7\x93\xeb\xf1\xf5\x87\xe9\xf8\xfa\xe3\xc8\xfd\x12\xb1\xd1\x5c\xad\xfc\x45\x41\x69\xf8\x6c\x20\xe7\x6b\x34\x3c\xff\x24\xc7\x52\x5d\x4c\x46\x33\xe8\x37\xf5\x4f\x0d\x3f\x0e\xc7\xd7\xb3\xb9\x1a\x5f\xcf\x47\xd3\x0f\xa3\xe9\xe8\xfa\x7c\xe4\xcb\xe9\xa7\xa1\x05\x0c\xc4\x96\xeb\xcc\x8d\xd8\x10\xb1\xe8\x1f\x6e\xaf\x69\x2a\xdd\xdb\xb0\xa6\x9a\x60\xf2\xd1\xca\x84\x5a\xf6\xab\xd1\x68\x8e\x8f\xa7\x6a\x78\xf7\x82\x99\x78\x1a\x96\x55\x8f\x27\xd7\x5d\x6f\xc5\x67\xbc\x1f\xa9\xdb\x6b\x68\xf4\xf4\xf6\x66\x8e\x0c\x06\xa3\xe9\x74\x32\x3d\xfe\x30\x1d\x8d\x12\xac\xe4\x1e\xce\xa9\xec\x7f\xb6\xbf\x31\xef\x47\x5c\xd5\x3f\xba\x80\xe3\x6b\x32\xc5\x02\xf6\xcf\xd3\xf1\x7c\x3e\xba\x56\xe3\x6b\x20\x1e\xc0\xe6\x4c\xa1\x48\xfb\x7c\xa4\x3e\x8e\x7f\x1e\x01\x16\x1e\x47\x3b\x51\x43\x3f\xee\xb7\xf3\x4f\x93\xe9\xf8\xff\x1b\x5d\x00\x4e\x7e\x34\x1b\x5d\xcf\x87\x6e\x73\x70\xb5\xbe\x9c\x8f\xd9\x27\x58\xed\xd3\xd1\x70\x3e\x52\x43\xbf\x31\x49\x95\x22\x8d\x69\x61\x3b\x43\x78\x18\xef\x20\x46\xcf\x20\x8c\xce\xc8\xf3\x20\xbe\x5c\x6c\xd3\xdc\xe8\x8a\xb9\xa9\x00\xf0\xa0\xb3\x2a\xad\xf4\xaa\x56\x85\x7e\x20\xdb\x30\x69\x28\x2e\xdb\x9d\xad\xcd\x9a\x24\xca\x32\xd0\x5d\x59\x21\x25\x29\x42\x1a\xd6\x3a\xbd\x07\x50\xa2\x57\x9e\x06\x28\x32\x84\xc3\xf1\x6c\xed\x8c\x05\xe1\x19\x9c\x1b\xbd\x44\x02\x60\x5d\xdf\x27\x1e\x3b\xa4\xb2\xe2\xcf\x5b\x22\xaf\xb5\xce\x30\x32\x6a\x73\xbf\xb3\x59\x8a\x78\x0f\x53\x3c\x64\x55\x59\x40\xdc\x33\x57\x4b\xbd\xd6\x77\x86\x25\x70\x44\xa1\xc2\xe4\x03\xb0\x19\xc0\xfe\x1c\x34\xa8\x3a\xdc\x16\xb8\x99\x4e\x3e\x8d\xdf\x8f\x89\xaf\xe3\x72\xf8\x39\x89\x08\x1b\x70\x6a\xb8\xc8\xa3\x3d\x75\x81\x2c\xe1\x03\xfd\xf5\x62\xec\x96\x91\x24\x42\x88\xd8\x11\xf8\xcf\x31\x33\x82\x27\x03\x60\x8a\x84\xe8\xf8\x8d\xe9\x12\x26\x6e\xc7\x5c\x0e\x91\x27\xc4\xf5\x67\x3c\xf3\xb5\x26\x93\x29\x6e\xa9\x43\x74\x0a\xf1\xe6\xa5\x56\xbb\x33\xdf\x0d\x17\x30\x9e\x4c\x3e\x24\xea\xf3\xa7\x11\x34\xe8\xf6\xfa\x62\xe4\xce\xab\xf9\xa7\x91\x3b\xd0\x26\x1f\xb0\xfb\x43\xd7\x87\x70\x83\xcc\xdd\x95\x21\x2a\x46\xae\x47\x1f\x2f\xc7\x1f\xdd\x31\xd2\x4f\x14\x96\x89\xcc\x67\x61\x22\x7c\x7f\x3f\x8f\xdd\xae\xf1\xf4\x08\x7e\x98\x81\xe6\x40\x8e\xf3\x2f\xa0\x47\xe0\xe3\x72\xee\x0e\xb2\xd9\x7c\x78\x7d\xc1\xcc\x2a\x82\xca\x61\x34\x9b\xd1\x14\xd0\x29\xcc\x23\xef\xce\xa3\x8b\x2f\x03\x35\x9b\x5c\x8d\xd4\xdf\xdf\x4e\xc7\xb3\x8b\x31\x1d\x6e\x5c\xbb\x72\x79\x39\xf9\x4c\x75\x29\x9d\xcb\xcd\xfd\xe3\x10\x1d\xc6\xa1\x49\x4f\xd4\xcc\x4f\xad\x7f\x38\x17\x0a\x0d\x6f\x6e\x2e\xbf\x10\x3b\x07\xf8\xf9\x45\x09\x95\xc6\x35\x91\x29\xf8\x00\x47\xdb\x07\xfa\xc1\xaa\xba\xac\x75\xde\x1d\xa5\x74\x5f\xc6\x9d\x14\xc7\x72\xb4\x57\x55\xf6\x11\xb8\xc5\xae\xa1\x7d\xdd\xef\x22\x98\x34\xdf\x52\x43\x69\x31\xbd\x2e\xb7\x18\xcf\x5c\x65\x0f\x46\xdd\x6f\x8b\x65\x05\xb9\x8b\x3c\xd7\x95\x55\x47\xff\xd7\x9b\x93\x93\xc1\xc9\x49\xdf\xab\x0e\xcd\xbd\xb6\x6a\xa3\xfe\xc6\x47\x78\x89\x99\xb9\xf0\xf1\x27\x91\xc7\x0d\xca\xac\x90\x8a\x0a\xa2\xad\xaa\x87\xc3\xd3\xe3\xd1\xa1\x7e\xee\xfd\xfc\xc2\xe4\x65\x71\x47\x5c\x16\x64\x3f\x1f\x11\x4b\x25\xd2\x06\xd0\x13\xd5\x95\xfb\x7a\x0f\xd0\x51\x0c\xfd\xf6\x52\xb2\xd1\x43\xe3\x67\x36\xa6\xe8\x48\xd6\x33\xf0\x33\x91\xf5\x54\xbc\xc6\x3d\xb0\xf5\xb9\x48\x37\x1c\xd8\xee\x97\x65\x85\xbe\xdf\xa6\x2a\x81\x83\xd2\x17\x11\x2d\x4d\x05\xb5\xdf\x3e\x25\x17\x7b\x22\xf0\xf8\xee\xaa\x00\x4f\xa2\x81\x44\xb3\xac\x0e\x09\xec\xa0\x12\xc3\xa4\x7c\x9c\x48\xc8\x72\x68\xe9\x5a\x78\xc5\x93\x09\xe3\xc3\x06\xaa\x01\xf0\xda\xab\x91\x28\x1d\xb4\x56\x40\x1e\x71\x2e\x16\x99\xad\x29\x46\x54\x67\x35\xd9\xcd\x5e\x19\x88\xa0\x30\x34\x07\x71\x48\x08\x90\xb4\x8b\x5d\xcb\x69\xf6\xee\xee\x77\xbf\xa3\x3d\xc8\x9d\x05\x1f\xfe\xcd\x65\xd5\x19\xd8\x38\xf2\xcb\x2d\xc2\xe7\xf7\x29\xd7\xb4\x0d\x11\xa8\xf8\xb1\xe0\x46\x13\x71\x4b\xcc\x05\xbe\x57\x15\x2b\x38\xf6\x89\xd2\x75\x57\x10\x2b\x11\x3e\x2d\x47\xcf\xf7\x37\xa1\x6b\xee\xb0\x97\xa1\x84\x1c\xdd\xcf\x88\x92\x39\x2a\xb8\x8a\xe1\x3e\x22\x4c\x46\x40\x0e\xcf\xcf\x7e\x6f\xd6\x4c\x46\xcb\xcc\xc1\x4d\xbd\x51\xfc\xf5\x69\xf4\xfb\x46\xad\x1f\xa5\xf1\x1b\x02\x45\x3e\x55\x82\xa3\xea\x65\xff\x1a\x20\x8b\x78\x98\x19\x28\xc3\x20\x06\x4c\x22\xaf\x88\x85\x10\x9c\xcb\x1d\x71\x5c\x12\x12\x8a\x50\xe2\xad\x50\xb0\xff\x8e\x33\xac\x60\xb8\x17\x15\xec\x01\x2a\x88\x61\x95\xc5\x72\xa5\x16\x26\x2d\x41\x43\x5d\x3f\x62\xd0\x4a\x7e\xbe\x01\xcf\xc8\xd6\x6b\xb3\xcc\x50\xf3\x95\x8c\x47\xbc\x56\x98\x44\x20\xab\xd2\xed\x1a\x03\xc9\xee\x00\xb1\x69\x95\x2d\xe2\x18\xed\xe9\xab\xc1\x9b\xa3\x45\x5f\x68\x5f\x13\xcc\xe1\x19\x43\x01\x6b\x0c\xba\x9e\xad\x8d\x5a\x6e\x2b\xc9\x4b\xd8\x8e\xca\x00\xf4\x1a\x6b\x4a\x48\x54\x6f\x9f\xb0\x48\xa4\x0b\x65\x59\x1a\x4a\x75\x4a\x43\xf5\x3b\xe2\x66\xcd\x38\x62\x58\x3a\x67\x6a\x84\x84\x47\xe5\x2a\x5e\x44\xb7\x9b\x32\xa8\x41\xc2\x3e\xf9\x22\xf9\x8f\xe5\x48\xdb\xba\xdc\x44\xba\x5d\x51\x4a\xa4\x0d\xa1\x4a\xe2\x5a\xa4\x28\x35\x10\x69\x94\x35\xc0\x79\x60\x61\xdb\xba\x2a\x77\x0d\xd0\x63\xeb\xd3\xbe\x0c\x30\x23\xad\x58\xa9\x80\xe6\x13\x39\x03\xd0\xea\x96\x9a\x3f\x9e\x5c\xb7\xf9\xac\x20\x90\x89\x19\x23\x41\xb2\xef\xc9\xca\xc5\x60\x91\x19\xc3\x2a\xcf\xbc\x1b\x44\xc1\x4f\x7c\x4c\xdd\x34\xd2\xe9\x09\x25\x53\xb2\x4a\x15\xba\xde\x56\x26\x61\xe8\x08\xf1\xa6\x66\x05\x13\x55\x2d\xcc\xae\xa4\x2d\x7e\xe0\x15\x71\x83\x24\x84\x66\x81\x8b\x18\xc1\x6f\x54\x4a\xca\x69\xa4\x57\x89\x7a\x93\xa8\x3f\x24\xea\x8f\x89\x3a\x3d\x49\xd4\xe9\x69\x82\x6b\x06\x18\xb9\x5e\xc1\x95\x8e\x99\x4e\x8e\x70\xe6\x19\x07\xdc\x82\x61\xb2\x22\x2e\x79\x53\x58\x66\x07\x91\x91\x7d\x36\xd7\x38\x52\x58\x56\x75\xa4\xa1\x19\x78\x11\x7d\xff\x60\x57\x35\x50\x89\xc0\xd7\x05\xc0\x39\x22\x74\xb6\x4c\xd8\x05\x4b\xe7\xc0\xd0\x70\xdb\x79\x4b\x6f\x2a\xf3\xe7\xed\x32\x4b\x1b\xdd\xc0\x48\x23\x5c\xcd\x6b\xb3\xdc\x71\x7b\x03\x62\xc1\x0d\xc8\x55\x66\x53\x93\xe7\xc8\x61\xee\xb7\xd9\xab\xc1\xa9\xfa\x08\x69\x32\xd8\xcc\xa3\x02\x50\xe2\x55\x57\xb0\x0f\xe8\x54\x7a\xa2\x4c\x23\xab\xcd\xba\x07\x25\x7d\x00\x17\x84\xb3\xea\xc3\x70\xaa\xce\x06\xa7\x27\xa7\x03\xf9\x58\x5f\xb7\x8d\x1d\x4e\xef\x01\x1a\x04\x61\x40\x3e\xfd\xe9\x4c\x6c\xe0\x7d\x10\xc0\x83\x25\xbf\x70\x61\x71\x26\x85\x18\xa1\x33\xa9\x4a\x1d\xf1\x6d\x35\xda\xd5\x54\xfa\xcc\xac\x60\x95\x16\x7d\xca\xc3\xbc\x35\xda\x09\x06\x00\xf7\x03\x79\x79\xf0\xb5\x1d\x53\xec\x46\xc1\xad\xc6\xd3\x53\x75\x34\xf7\x8f\xb9\xd0\x35\x94\xad\x2d\xf1\x6f\x67\xea\xe8\x9c\xcb\xc7\x18\xa1\x09\x7f\x46\x2c\xd8\x85\x71\xf3\xc7\x38\x85\x0b\xe4\xfe\x57\x9b\x6d\x95\xde\x6b\x6b\x6c\xa2\x2e\x60\xac\xdf\x9c\x0d\xce\xce\x7e\x3c\xfe\xf1\xe4\xf4\x4d\xf3\x5d\xea\xf8\x58\x9d\x87\xae\x8d\x6b\xb3\xb6\xf8\xfe\xb3\xb3\x1f\x07\x3f\x9e\x9d\x9c\x1d\xbf\x52\x47\x53\x3f\xfe\xe2\xb3\xad\x86\xa1\xcd\xda\xfc\xe5\x85\x04\x47\xf5\x41\x1e\x17\xa9\xe9\x72\x67\xd4\xe4\xb9\xba\x1d\xcc\x06\x9d\xeb\xcb\x63\x03\x3a\x92\xb8\xad\xd9\x6e\xc2\x5a\xc4\xea\x3d\x53\x53\x43\x42\x10\x54\x01\x71\x83\x19\xfa\x86\xad\x21\x0d\xb4\x48\x87\x01\x8b\x92\x51\xc8\x53\xdf\x99\x22\xdd\x25\xb0\x71\xc8\x66\x4e\xd4\x9f\xcb\x0c\x52\x03\x05\x96\x54\x56\xf1\xf1\x01\x77\x27\x56\xb9\x70\x49\x0f\xd0\xa3\x9b\xfa\xd1\x1d\xc9\xee\xe3\xeb\xb2\xb8\x43\xf5\x8d\xbd\xb7\x5e\x48\x6d\xf9\x76\xfa\x5a\x43\x5f\x3d\x0d\x55\x25\x95\x28\x35\xf1\xc1\x70\x38\x93\x21\x37\xcb\xb7\x18\xe2\xe1\x11\xac\x2b\x41\x2c\x61\xe0\x5e\xa9\xb1\x28\xde\xba\x08\x85\x01\x83\xbd\x42\x16\xd0\xb6\x6c\xbd\xd1\x59\xf5\x84\x1b\xec\x53\x1f\x34\xcb\x49\x40\x44\x50\x09\x42\x82\xf7\x16\xb4\xcc\x7a\xce\x3d\xb7\xee\xb3\x3a\x51\xce\xab\x33\x75\x57\xed\xbe\x5b\xe0\x65\x5e\xde\xed\xc8\xef\x42\x7f\x0b\xe9\x7b\x11\xd4\x10\xf0\x09\x02\xaf\xbd\xda\x16\x74\x71\x68\x9b\x44\x43\x82\xe7\x7f\x6d\xa8\x72\xa8\x01\x62\x95\x49\xeb\xe4\xe0\xdb\x7d\xd6\x95\xfb\xe7\x51\x17\xd4\x99\xa8\x23\x62\x22\x5e\xab\xcf\x40\xb2\x08\x85\x39\x84\xa1\x06\xf9\x40\x8a\xed\x1d\x86\x69\x09\xd5\x35\x89\x7d\xeb\xbe\x49\x68\xfd\x2f\x8d\xbb\x26\x80\x5e\x8b\xd9\x1d\x89\x45\x99\x9e\xb5\xf6\x76\xa9\xae\xe3\x15\xef\x5f\x80\x7a\xff\xb9\x7e\xc4\x6b\xe7\x6e\x4b\xb5\x67\x18\xa0\xf4\x14\x5e\x3e\xa8\x9a\xeb\xe2\x6e\xab\xef\x0c\x97\x04\x52\x85\x54\x97\x36\x8a\x10\x8d\x5b\x56\xc8\x90\xe0\x5b\x2f\x48\xdf\x3b\x8a\x2d\x5f\x0d\xde\xa8\x99\x79\x30\x15\x53\xc4\x82\xa3\x30\x5e\xf9\xfc\x2e\x25\x64\x35\xab\x92\xac\x78\xf6\x8b\x5a\xfd\x79\x5b\x65\x76\x99\x91\xb1\x9b\x15\x4b\x7b\x78\x48\x13\x51\x17\x1e\x52\x49\x48\x0b\xb9\x2d\x68\x24\x51\x8f\x8d\xd9\xa5\xe5\x83\x4c\xeb\x92\xa7\xaf\xf8\x7b\x6c\xad\xbf\x65\xeb\xed\x9a\xc1\x35\xcc\xf3\xec\x8c\x18\xaf\x4f\x42\x96\x16\x78\x13\x69\x59\x94\xeb\x2c\x65\x4d\x37\xeb\x5d\xe5\x42\xe8\xbb\x55\x14\x96\x66\xd7\x0b\x6c\xb6\x25\xd3\x7e\xef\xe5\xdb\xcf\x0a\xe4\x52\xe4\xa5\xb6\xa4\x37\x0f\xc0\xb7\x69\x0a\x15\x60\x4d\x54\x65\xee\x4a\x10\xea\xcc\x56\x8d\x70\x96\x50\x9e\x12\xe5\x26\x16\x5d\x36\xe7\x9c\x62\xf2\x91\xeb\xd9\xa5\x7e\x14\x7a\x72\x5e\x1c\x23\xc0\x8a\xf8\xd3\xaf\x70\x6b\x82\x6f\x45\xc2\x56\x3c\x15\x04\xd2\x58\x45\xb4\xeb\xee\x9a\xe1\xa7\x24\x9d\xe7\x5d\xf0\x26\x82\xf8\xbd\x2f\xb7\x01\x9c\xb1\xf8\x88\xf3\xde\x79\xd0\xb8\x9e\x63\x9f\xd3\xd0\xed\x31\x64\xf5\x73\x7d\x84\xb0\xec\xdf\xaa\x8b\xcc\xba\xbb\x59\x4d\x0d\xb3\xc9\xd1\x0e\x0d\x02\xbe\x41\x47\x88\x3e\x5b\xf9\xcf\xfa\xfb\x8a\x89\x46\x7c\x18\x26\x27\x9b\xb6\xec\xb2\xd9\x6b\x10\xc5\xca\x75\xea\xf3\x21\xd7\x25\xb8\x59\x85\x6b\x0f\xd6\x10\x95\x2b\x75\xae\xf3\x6c\x55\x56\x45\xa6\xc3\x3d\x27\x5e\x42\x68\x0e\x0e\x71\xb1\x15\xc7\x99\x8a\x68\x5f\x32\xe4\xef\xc1\xe0\xaa\x24\x0a\x84\x9a\xe7\x64\x65\x96\xc0\xa9\x48\xfc\xb7\x5e\x03\x4d\xd7\xa1\x45\xed\x52\x8b\x86\x08\xbc\xe4\x0b\xe4\xc9\xbb\x2d\xc0\x05\xb9\xa6\x60\xcb\x79\x59\xb8\x05\x46\x30\xed\x73\x3a\xce\xac\x87\x6f\x8d\xb1\xfc\x8e\x90\x1e\x33\x8d\xd5\x13\x1f\xcb\x72\x09\x54\xaf\x21\x8d\x8d\x32\x50\x66\x29\x26\xf3\x47\x35\xc2\xdc\xf3\x90\x11\x33\xef\xc8\x84\x72\x33\x71\xa9\x1f\x1b\xa6\x8d\x2c\xd2\xc1\xf5\x0e\xdf\x0e\x78\x1b\x9e\xdc\x5a\xaa\x86\x75\xd4\x9b\x34\xd8\x64\x98\xaa\x61\xde\x29\x66\xd5\xc4\xd6\xe5\xfa\xd1\x36\x06\x6b\x56\x13\x9f\x30\x9e\x35\xf0\xcf\xe6\x7a\xa0\x82\x31\x98\xa1\x45\x89\xbe\x4b\xf8\x3b\x1c\x16\x24\x15\x41\x8a\x82\xab\x1c\x8e\x0a\x67\x75\xe9\xc7\xc1\x8b\xcf\x11\x21\x4f\x5e\xa6\x5a\x10\x8c\xc2\x91\x4b\x05\x4b\x7f\xda\x9a\x85\x49\x13\x75\xae\x0b\xbd\xd4\x49\x5c\xb7\xa9\xd2\x1c\xb0\x0a\xc4\x3e\xf5\x13\xac\x02\x1e\xaa\xb0\x3e\x57\x19\x98\x17\x78\xa5\xed\x98\xe7\xf3\x9f\xb6\x08\x92\xa0\x3f\x34\x25\xa0\x40\x51\x24\xae\x25\xb0\x70\x0b\xc3\xdd\x06\x6d\x1d\x15\x77\x79\x66\xef\x07\xea\xd2\x58\xff\xda\xb2\xa8\x95\xf9\x96\xdd\xfd\xfb\xbf\xa9\x7f\xda\x1a\x05\xe8\xc3\x7f\xff\x37\x1b\x4a\xed\x6b\x65\xdc\xd4\x6d\xad\xca\x8d\x15\xcf\x06\x4a\xe6\x6f\xc6\x2a\x5b\x82\xfa\x7f\xf5\xef\xff\xb6\xcc\xfe\xfd\xdf\xac\x32\x85\xd2\xc5\x5d\xae\x33\x3b\x50\xa3\x7f\x84\xcc\x9c\x1a\x0e\x5e\xf4\x6e\x18\x52\x2e\x08\x6d\xd3\xbe\x3a\xfd\xe3\x1f\x5e\x1d\x9f\x9d\x9c\x9c\xd1\x46\x4d\xd4\xb8\x48\x31\x30\x41\x3e\xc3\xd4\x80\x8e\xcf\x92\xd8\x5e\x25\xbb\x86\x6d\x47\x63\xdd\xe9\xdc\x02\x93\x36\x3e\x15\xf9\x6c\x9e\x12\x02\x54\x04\xe3\xd0\xf5\x77\xd1\x8f\xa9\x23\xf7\x95\x1f\xe8\x2f\x3f\xf4\x63\xa9\x41\xcc\x6a\x70\xfb\x69\x41\x22\x49\xd2\x26\xcf\x82\x53\x17\xc1\xb2\xde\x7f\x21\x2a\x37\xc8\x23\x7d\x18\x5f\x8e\x90\x3c\xee\xe3\x74\x04\xdc\xee\xc3\xcb\xcb\xe7\xd1\xc7\x0d\x23\x7a\xd8\xcb\x80\xc7\xf6\xfe\xa5\x7f\x79\x3b\xbe\xdd\x51\x72\xe5\xbc\xf4\x5c\xca\xc1\x2a\x5d\xab\xc7\xc7\xc7\x81\x45\xdc\x52\x5a\xae\x5f\x92\x8d\x6a\xaa\x97\xe5\xc6\x14\xc4\xa5\xfa\x62\xde\x1d\x42\xcf\xf3\xe0\xf6\xb6\x8b\x44\x64\xa3\x9b\x9f\xc0\x3a\xca\x1f\x00\x1e\xf3\x83\x5a\x68\x9b\xd9\xe4\xbb\x64\x13\x22\x68\x49\x03\x28\xd3\xc2\xb0\x7c\x1a\x4d\x47\xef\x1b\x00\x16\x48\x59\x06\xa0\x89\x64\xd8\x6f\xf3\xee\x25\x92\x67\xb8\x5b\x70\x21\x79\x06\xd0\xa4\x01\x2c\x71\x7d\xb8\x9e\x5c\x1f\x4b\x5c\xc9\x40\xdd\x00\xec\x0a\xf8\x4b\xe5\x08\xb6\x98\x5c\xbd\xd9\x7c\xe7\x2f\x80\xa8\xca\x20\x20\x7f\x5b\xd3\x31\xe8\xed\xe1\x3d\x1d\xbc\xbc\xba\xb9\x3c\x3e\x1d\x9c\xfe\x56\xe4\x9f\x4f\xf3\x7f\xbe\x3d\x3b\x7b\xdb\xe0\xff\x3c\x7d\xfb\xe3\xc9\xef\xfc\x9f\x7f\x8d\x9f\xab\xf2\x9f\xb3\x3c\xd7\xcd\xf3\xf2\x67\x7f\x5e\x9e\x12\x5d\xa3\x64\x69\xf4\xa4\x21\x27\x83\xd3\x81\xea\x89\x50\x91\x20\xb5\x89\x43\xe5\xd2\xc9\x26\xda\x94\xb6\x19\x2c\x35\x2a\xa3\x0a\x15\x41\x53\x32\xe8\x64\xa1\x83\x9c\xcc\xaf\x4a\x3e\x77\x16\xbf\x88\x47\x44\x52\xc8\x34\xb8\xb1\x3a\xc8\x06\x30\xe6\xde\x48\xcd\x59\x4a\xea\xb7\x63\x3e\xee\x09\xdd\x19\x4a\x92\x22\xf5\x08\xda\xae\x24\xc9\xe0\xd5\xe0\x99\x84\x79\xaa\x7d\xf9\x56\xcf\xea\x51\xd7\x3d\xc3\x55\xc1\x80\x43\x0a\xf1\xfa\x03\xac\x79\x03\xd5\x1b\x05\x86\xf1\x0b\xb9\x4e\xae\xb8\x94\x3e\x30\xb2\xf9\xea\x7a\x75\x87\x8c\xa1\xa4\x98\xbe\x11\xb6\x5d\xb8\x93\x04\xa7\x05\x01\xab\x48\xd7\x12\x8c\xe1\xf0\x56\x10\xb4\x5e\xa1\xdf\xb7\xd4\xb5\x16\xcc\x70\xae\x79\xbe\x96\x94\xdb\xd1\x55\xad\x8e\x11\x3f\x01\xf9\x0d\x35\x98\x82\xde\x6d\xa0\x7a\x63\x5f\x7b\x4b\x57\xad\x9c\x99\x98\x5c\x87\xd6\xb0\x20\xb9\x22\x00\x71\xeb\x19\xdc\x77\x59\x77\x4a\x59\x3e\x89\x1d\xf1\xe5\xdb\x82\x5b\x6c\xf0\x5f\x86\xfc\xee\x0f\xae\x29\xf8\xcb\x30\x26\x59\x30\x60\xe5\x27\x4f\xfd\x67\xe5\xc4\xdc\xeb\x87\xa8\xe4\x0e\x88\xe1\x2b\x5d\xd4\xc9\xbe\xd0\x09\xa9\x72\x84\xd0\x29\x45\xa5\x20\x19\x4a\xab\x9e\xab\xa5\x11\xf8\x02\x88\x7e\x06\x86\xc3\xf2\x63\x8e\x4e\x49\xa8\x18\x2b\x5e\x7b\x29\xe4\x46\x94\x7a\xf0\xc7\x41\x27\xe1\x9f\x7d\x1e\x85\x5d\x20\xf8\x6b\x92\xfb\x51\x1c\xa3\x73\xb3\xef\x27\xe9\x23\xf2\xbd\x66\x6e\xe7\xbb\x49\xf8\xa8\x7b\xc3\xbf\x9c\x86\xaf\xd5\xf8\x3d\x0d\x17\x6f\xf4\xe4\x7c\xfb\x59\xf6\x3a\x87\xe5\xf0\x93\x4f\x07\xa7\x27\x83\x3d\x34\x7c\x8d\x62\x6f\xcf\xfc\x17\x64\x11\x4a\x2f\x4a\x97\x35\x32\xf8\xdf\xb3\x69\xdd\xf8\x77\x10\xd8\x50\xf2\xb5\xb1\x70\xb3\xda\x4f\x5c\x17\x44\x2c\x8b\xc9\x1e\xa2\x29\x8f\xb7\x6d\xd7\x4e\x3d\xc5\xbb\x9e\x0a\xca\xce\xa1\x04\x26\xe2\x80\xc5\x3f\x40\x6a\xff\xc8\xf6\x13\x64\xb6\xe5\x92\xc4\x2e\x7e\xdb\x43\xc4\x26\x89\x5a\x9b\xfa\xbe\x04\x8d\xed\x32\x35\x96\xfc\x19\xbd\xd9\xe8\x4a\xd7\x5b\x82\x14\xe0\xed\x23\xde\x1e\x8e\x07\xc5\xc5\x9b\xf2\x82\x3c\x75\x3d\xd8\xc3\x07\x87\x5c\x07\x15\xa2\x7a\xbb\x8b\xe3\xff\x7b\x51\xbe\x85\x3b\x0c\x81\xbd\xd8\x6d\x58\x97\x1e\x03\x94\x69\x7c\x94\xae\x32\x0b\xf9\x10\x0a\xb7\x1f\x3e\x4b\x88\x16\xcf\xe4\xb9\xfa\x5a\x94\x8f\x45\x22\x2c\xb7\xf8\xba\x58\x35\x61\x69\x3f\x58\x95\xde\x97\x59\x4a\xb1\x35\xb9\x0d\x48\x82\x11\x99\x7b\xca\x35\xc4\xc4\x70\xf1\xa0\xc2\x86\x86\x80\xf3\x3a\xa2\x1b\x30\x28\x56\xb5\xa9\xdc\x48\xaa\xa5\xe1\xef\x31\xff\x8d\x39\xc6\xef\x46\x74\xe1\x99\x55\x8f\xd9\xd2\x44\x5c\x1e\x2b\x28\x74\xa1\x7a\x3f\xb1\x60\x9c\x15\x08\x2c\x75\x47\x9e\xa6\xae\xff\x97\xf1\xe2\x11\x17\x4a\x1c\xb9\x6e\x91\xda\x40\xf6\xa0\x81\xc0\xd2\x0d\x79\xcb\x36\xe9\x91\xb5\xdb\x0e\x8a\xa5\xd3\x43\xec\x7b\xbf\x09\xe7\x9e\xfa\x52\x6e\xf1\xa5\xcc\x3c\xe9\xdb\x1a\x96\x78\xf2\x5f\x9c\x8d\x0f\x6a\x2c\x91\x9c\xb9\x8b\x97\xef\x57\xe2\xe3\x93\x3b\xa0\xc5\x59\x74\x8a\xbb\xa4\x6d\xfa\x41\x15\xfc\xbe\x3f\xb6\xc8\xf7\x7e\x09\x5b\x5e\x8c\x54\x14\xac\xca\x5d\x45\xe9\x78\x18\x0b\x48\x9e\x1e\xd0\xe2\xf8\xce\x22\x76\x0f\xde\x5d\xeb\xea\x6b\xbf\x71\x9c\xb7\x7b\xda\x51\xd5\x2e\x6a\xd8\x1b\xd5\xed\x82\x93\xbb\xa3\xc8\x3b\x3e\xe6\x8e\x3a\x0c\xdd\xfe\x53\xac\x7b\xcc\x76\x6c\xbd\xd1\x11\x95\xab\x37\x68\x59\x16\x3c\x44\x37\x44\x09\x8f\x57\xaa\x87\xd3\x79\x0b\x1a\x6f\x9c\x44\x6d\x99\x10\xdb\x9a\x3c\x27\x81\xf3\x36\x09\xe1\x5a\x7f\x35\x94\x4e\x77\xbe\x63\x82\x03\xb4\x01\xb5\x77\x37\x3e\xee\xcb\x78\x04\x21\x29\x9c\x3b\xf8\xac\xce\x4d\x12\xd5\x28\x83\x9b\xee\x86\xb0\xb4\xdd\xc4\xd1\xdd\x23\x24\xd8\xdc\xd2\x41\x37\xa8\x98\x61\x04\x92\xee\xea\x88\x80\x30\xc0\xb5\x5c\x99\x3d\x54\x91\xed\xe9\x5f\x65\x95\xad\xc5\x44\x36\xc3\xcc\x4f\x90\xec\x88\xd6\x2e\x07\xad\xb4\x65\xd4\x40\xd7\xb0\x45\xf9\x00\xdb\xa5\x83\x2d\x83\x3a\xf7\x93\x3a\xed\x13\x8a\x8c\xf1\x78\xc0\xcc\x67\xa0\x94\xb1\x1b\xfe\xfd\x4e\x9d\xf5\x95\x35\x60\xd6\xec\xff\x4c\x59\xa9\x57\xf8\x68\x89\xb6\xb4\x78\x16\xba\x95\xf2\x93\xca\xf0\xec\x8c\x29\xe0\xf6\xd8\xbd\x19\x7d\xf8\x49\x77\x5f\xf0\x28\x58\x81\xfd\x59\x9a\x87\x2c\x35\x56\x90\xab\x0d\x22\x20\x02\x1d\x4f\xb3\xef\x3f\x43\x3a\x10\xe6\xbf\xc2\x71\xf6\x1b\x1f\x4c\x51\x1c\xe7\x57\x3c\x93\xe2\x10\x0d\x17\x03\x77\x20\xe5\xf7\x9c\x57\x9c\xd9\x86\xc8\xfb\xb6\xf0\xac\x6b\x14\x7c\x17\x93\xdb\x3c\xc9\x6c\x2b\x3f\xfd\xcb\x4f\xb6\xe7\x1d\x6c\x49\xe3\x64\x3b\x10\x06\x93\x1d\xa7\x2e\x7a\xa6\xa6\x97\x7b\x24\x2d\x9c\x6b\xd4\x11\xcd\x8b\x07\x8e\x6f\x68\xf1\xed\xbe\x38\x54\x51\xd9\x01\xce\xcf\xe6\xd9\x29\xce\xdb\x03\xc7\x28\x9c\x0f\xcf\xec\x58\xe7\x8c\x22\x77\xf9\x59\xe7\xe6\x7d\xe6\x73\xff\xb2\xd1\x78\xde\x01\x2f\xe8\x5d\xce\xfc\xe1\x0e\xff\x7d\xf0\x80\x97\x2d\xc2\xa3\xdd\x8d\xbb\x55\x71\x78\xb9\xcb\x33\x7b\xee\x49\x7e\xf6\xdd\x27\x39\x90\x09\xfa\xd3\x3c\xa6\x8b\xb0\x74\xb2\x8b\xca\x9e\x8e\x41\xdd\x73\xc0\x77\x7e\xf2\x59\x67\x7c\x38\x48\xd7\xcd\xfc\x69\xd7\x9c\xee\x3f\xee\xbf\x67\xc5\x34\xee\x80\x23\x41\xed\x2a\x02\x2c\x1d\xef\xef\x0b\xa4\x09\xde\x1a\x70\x9b\xbd\xee\x3f\x7d\x46\x34\x43\xae\xe0\xee\x2d\xac\xa1\x1c\xfe\xf3\x9a\xcf\xe4\x51\x51\x94\x79\x12\xa8\x59\x78\xe9\xbc\x72\xc6\xf6\x30\x86\x7a\x44\x30\x90\x46\x89\x0f\xb8\x48\x40\x48\x89\xcc\x44\x25\x89\xcd\xfa\x5f\xfb\xa4\x03\xd2\xe3\x3c\x27\x2c\x7a\x38\x24\x22\xd7\x71\xdb\x7b\x16\x3e\xe1\x53\x84\x7e\x00\xa9\x7d\x8a\x80\xf0\x39\xfe\xa6\x0f\x12\xb6\x3c\xce\xa4\x81\x89\xf2\xdc\x8b\xcf\xe5\x3f\x6e\xc6\xc8\x62\x86\xe3\xc1\xf3\xd9\x8d\xdd\x3f\xba\xc6\x29\x90\x1c\x37\x60\x67\x75\x80\xfc\xb8\xeb\x7d\x5f\xdf\x9f\x41\x80\xdc\xc1\xc2\xe3\x07\xa2\x90\x44\x47\x1c\xec\xc6\x9e\x70\x34\x5b\x7c\x80\x9e\xdc\x59\x07\xf4\x6a\xf0\x26\xac\xe1\xb3\x81\x1a\x62\x4c\xc3\xc3\xdb\x64\x52\x02\x82\xa5\x51\xe4\xf6\x7b\xd6\x31\x4c\xe5\xc2\x34\x95\x2f\xb2\x28\xf1\x81\xd1\xb3\xa7\x56\x57\xb0\x4c\x3c\x3e\x17\x50\x73\x24\x32\x11\x42\x57\x61\xfc\x2b\xf5\xe0\xfe\x5e\x84\xdc\xcf\x93\x39\x24\xaa\x8b\x28\x51\xdb\xf9\xf1\xbe\x5c\x23\xef\xb2\xc6\x19\xe8\x78\x8b\xef\x15\xde\xb4\xd9\xaa\xd9\x59\xd7\x86\x27\xdf\x9b\x30\x05\x38\x94\xc0\xc4\x41\xa6\xa0\x5e\xdd\xe6\x6c\xc5\x00\xa9\xbf\x0f\xb3\x9a\xd3\x10\xb9\xdb\xc3\x29\x08\x51\xf3\xc3\x90\x20\x80\x1f\x66\xb3\x6f\xea\xe8\x6d\xe3\x41\x7a\x2f\x9b\x4d\x9c\x4b\x8c\x16\x84\x27\xf0\x69\x74\x9c\x85\x5d\xc2\x82\x1f\x78\xa0\x95\x27\x8b\xa2\x3e\x9a\xc2\x72\x49\x19\x45\xa8\xbb\x76\x20\x0e\x8f\x24\x45\x05\x0d\x67\xe2\x7e\x7e\x7a\x72\x33\x77\xe8\x67\x5c\xb1\x08\x09\xd5\x8e\x8c\xf1\xab\x81\x3b\xfc\xcd\xff\xcf\xde\xbb\x2e\xb7\x8d\x64\xeb\x82\xff\xf5\x14\x39\x8c\x98\x53\xe2\x09\x08\x96\xe4\x4b\x55\xb9\x4e\x9c\x08\x5a\xa2\x6c\xf6\x96\x49\x6d\x92\xb2\xdb\xbd\xa3\x63\x6f\x90\x4c\x8a\x68\x83\x00\x37\x00\x4a\x66\x3f\xc1\xfc\x9e\x47\x9c\x27\x99\xc8\x75\xc9\x5c\x99\x00\x25\xd9\x65\xbb\xba\x4f\x5b\x3f\xba\x5d\x12\x09\xe4\x3d\xd7\xe5\x5b\xdf\x87\x71\xd4\xd6\x8c\xaf\x3b\xa6\x30\xb2\x94\x64\x59\x50\x58\xb5\x67\x3f\xb0\x6e\x32\x44\x2c\x21\xfd\xc0\x1b\x99\xb7\x30\xeb\xff\x7d\xe0\x55\x67\xbe\x82\xfb\x8c\xee\xa9\xb0\x72\xac\x95\xc7\x38\xbe\x9f\xc5\x36\x20\x0e\x0f\x3d\x07\xcc\x3f\x40\x09\x32\xc7\xd4\xb2\x9d\x8c\xaa\x65\xbb\x08\xed\x12\xdf\xf7\x93\xd4\xa0\xed\x09\x48\x27\x37\xc6\x1d\x66\xb9\xf3\xbd\x09\xcb\x16\xf9\xa2\x48\x09\x6d\x3d\x90\x5a\xb2\xd4\xd3\x7b\x8f\x82\x56\x3e\x5e\x47\x89\x81\x5e\x37\x1e\x96\x18\xa6\x83\x9e\x81\x29\x22\xe3\x71\xfb\xec\xc8\xa7\xf1\xb3\x18\x50\x9b\xd6\x43\xbc\x62\x0f\xf1\x2d\xc0\x21\x2b\xbf\xfa\x74\x0a\xeb\xee\x0a\x8c\x32\xb4\x64\xdc\xdf\x07\xcb\x86\xd9\x18\xd0\x8c\x24\xd6\x00\x65\xaa\x2c\xb1\x8e\x7f\xaa\xee\x77\x55\x03\xae\x4e\x0a\x3a\x6b\xd5\x52\x4a\xdb\xe6\x38\xb6\xf0\x31\x16\xa5\xb1\x30\x22\xef\x63\xc1\xda\xab\xf5\xa7\x1a\x57\xbc\x85\xa3\xc9\x1d\xee\x21\x3f\xa0\x50\x7b\xa1\x3a\x97\xfd\xd7\xbd\xcb\x0e\xb3\xf0\xd2\xe4\x10\x8e\x82\x18\x5d\x17\x16\x94\xba\x93\x18\x11\xfc\x33\x10\x1d\x2f\x97\xe9\x1c\x60\x8c\xa8\xb4\xce\xe3\x67\x0f\x25\x44\x69\x9b\xf1\xc5\xe3\xde\x49\x9b\xc7\xe1\x44\x20\x31\x1d\xc9\x46\x09\xf6\x28\x7b\x06\x87\x7b\x28\x38\x10\x93\xbd\xf7\x71\x30\x76\x08\x92\x35\xdb\x75\x63\x36\x9e\xe0\xff\x82\x21\xc1\x71\xf4\xf5\x31\xbc\xa1\x07\x1f\x48\x1c\xc4\x22\x95\x96\x2f\x24\xf6\x9a\x6c\xf4\x5a\x6f\x2a\x75\x08\xdd\x4a\x20\xe3\x97\x2e\x21\xd1\x20\x33\x25\xeb\x24\x05\x47\x3b\x4b\x2b\x84\xdd\xe7\xfa\xae\xba\x29\x8b\xed\xa6\xea\x4a\xed\x85\x79\x92\x99\x3b\x82\xea\x2d\x91\x8f\x9a\x60\xf2\x77\xab\xc2\xc9\xda\xb7\x17\xa3\xe6\xfa\x4e\x8c\xac\xbd\x59\x70\xe4\x1d\xca\x99\x6a\xa2\x65\xa7\x7b\x57\x83\xbd\x5b\xe8\xa7\x20\x5d\xeb\x19\x55\xc2\x80\x67\xd5\x72\x2c\x5e\xe2\x14\x9b\x19\xb3\xfd\xfb\xd1\x2a\x74\x3a\xbf\xd6\x89\xbe\x8a\x71\xf1\x34\x46\xd3\xf5\x26\x13\xe7\x6f\xef\x6a\xd0\xb2\x79\x00\x86\xe9\x64\x2b\xd2\xca\x63\xf7\x26\xef\xc6\x2d\x88\x40\x17\x63\xec\x69\xcd\x55\xe2\xaf\x3e\x17\x03\x7d\x0a\x4b\x6d\xa4\x00\x07\xf0\x26\x17\xc6\x56\xdf\x6c\xcb\x6a\xcb\xa4\xb6\x76\xcd\x3e\x43\x3f\x1d\x3d\x63\x8f\xb8\x50\x67\xa9\xbe\xe5\xe2\x9d\xfb\xa6\x21\x29\xc3\x4c\x1f\xab\xa5\x59\xb8\xd5\x61\x65\x85\x2b\xc3\x39\x10\x7b\xdb\x51\x8c\x10\xfb\x6e\x0b\xa8\x62\x4f\x9a\xda\x18\xc3\x6a\xcc\xe7\xe1\x10\x45\x04\xe2\x16\x35\x04\xbc\xad\x3e\x5f\xe3\x00\x8e\x91\xd4\x0a\x7a\x30\x96\xc4\x34\x76\xb3\x25\xee\x73\x71\x7f\x49\x33\xcb\x33\x92\xc1\x5a\x40\x7e\x43\xe0\x7a\x60\x20\x07\x40\xd1\xf3\xe6\x7d\xdf\x78\x30\x80\xdb\x21\x66\xc3\x3b\x3d\x01\x7f\xec\xd6\x8c\x18\xde\xeb\x45\xb9\xeb\x12\x59\x7c\x82\x5a\x1a\x77\x50\x9a\x0d\xe5\xcf\x1f\x35\x96\x4e\x65\x45\xf1\x11\x03\x59\xf0\x18\x7a\x07\x74\xd3\x79\x05\x0b\x8f\x77\x54\x4e\xbb\x99\x51\x4b\xbc\xb8\x58\x60\x81\x0a\x58\x01\xd0\xa2\xa0\x3a\x4d\x0c\xba\x77\x76\x3a\x8c\x92\xeb\x39\x6c\x18\x39\x5f\x41\x1d\x75\xbe\x0b\x6e\x7f\x06\x79\xc9\x71\x76\x0a\xbd\xd6\x1c\x68\xf1\xd8\x3c\xb3\x80\x7e\x27\x8b\x5d\x7c\x6a\xd5\xef\xc5\x19\xfb\xcd\xd8\x5e\xf7\xb0\xb9\xb6\xdb\x6c\xf7\x92\xbb\x02\xb1\x71\x5a\xab\x64\x06\xb5\x43\x66\x49\x21\xe9\x19\x72\x19\x31\xcd\xe9\x97\xf4\xdf\xec\xb0\x2f\xe4\x7d\xbd\xc7\x5a\x6d\xb2\xbe\xde\x4f\xf6\xba\x77\x4c\x1a\x86\x54\x40\x01\xf0\xf8\x2e\xa3\x83\x6c\x3a\x04\xdd\x75\x27\xd9\x8b\x20\x68\x55\x2c\xa5\x31\xcc\x14\xb1\x6e\x3d\xee\x53\x19\x4e\x3d\x23\xda\x4a\x63\xb0\xa3\x15\xd2\x51\x3b\x52\x85\xf8\x24\x42\x6b\xe6\x69\xfc\x34\x82\x3b\xc2\x0c\xe1\xd3\xf8\xb9\x60\x99\x58\x63\x31\x76\xd3\x9d\x89\xd8\x81\x36\xcd\x73\x96\x23\xed\x7e\x4f\xa7\x61\x9f\x83\xf8\x7b\x45\x34\x3c\x40\x0e\x1d\x00\xd6\x07\xf4\xc5\x34\x60\x3d\x99\x4e\x39\xee\x6d\x70\x1b\xc4\x76\x14\x12\x3d\x4f\x39\x00\x47\xbd\xe1\xc0\xc8\xbc\xc8\xab\x4d\x3a\xdf\x16\x5b\xd0\x29\x25\xb1\xa7\x47\xba\x35\xd1\x1e\xa7\x06\xd2\x89\x99\xf9\x4b\x09\x4c\x7d\x6d\x2e\x4e\xcb\x99\xe6\x17\xeb\xe9\x3d\x67\x58\x90\x70\x6a\x73\xb6\x96\x0d\x04\x68\xe3\xac\x64\xb7\xc5\x4a\x5e\x93\x20\x0c\x22\x7d\x58\x74\x4b\xd2\xc3\xe2\x7c\x39\x2a\xa2\x86\x1c\x47\x28\x2a\xc2\xa1\x86\x3d\x95\x38\xfb\xb9\xdc\x5d\xcd\x71\x50\x55\xd1\xd2\x57\xa7\x87\x54\xd7\x7a\xbd\x21\x92\xa3\x75\x8a\x65\xcf\x19\x3b\x06\x92\xc7\xda\xe7\xab\x68\x5b\xc5\x36\xe2\xdf\xa0\x2f\x68\x10\x51\xd0\x9d\xfb\xf0\xa4\xf0\x80\xbb\x01\xe4\xde\x3d\xea\x68\xae\x45\x88\xf4\x0b\x55\x51\x22\x96\x44\xf9\xbc\x5b\xe3\x1f\xfa\xcc\xb6\xf7\xd5\xde\x23\xf9\xe7\x7f\x56\x79\x02\x32\xee\xe6\x49\xf5\xcd\x74\x09\x58\xbf\x61\x90\x0b\xba\xc3\x33\xa4\xda\x3a\x47\x4b\x77\x52\x27\xf5\x16\x63\xcc\x63\x4b\x12\x00\xdf\xb3\x46\x35\x84\xf0\x5d\x24\x91\x44\x47\x42\xc6\xae\x00\x2a\xd7\x92\x4d\x10\xc5\xac\x55\x81\xec\x0f\x02\x63\xe7\xcb\xd8\x60\xe3\x2a\x6c\x5c\xa4\x80\x53\x07\x85\x87\x01\xae\xe7\x53\x1a\x78\xe6\x39\x4a\x8f\xcb\xd6\xed\x6f\xd6\xfd\x60\x74\xa7\x4a\xed\xc5\xad\x64\x4d\x17\xc7\x47\x28\x1d\xa9\x77\x2a\xa1\xaa\xfb\xc9\xd6\x86\x54\xf0\x7e\xe3\x0b\x49\x5e\x41\x41\xc0\x61\x4f\xec\x02\xef\xf8\xc6\xf7\x2d\x48\x51\x86\x76\xaa\x56\xff\x88\x14\x26\x7c\xb1\x39\x2e\xf1\xa7\x28\x94\x5b\x07\x6e\x64\x23\x5c\xa4\x6d\xdd\x70\xbe\x61\xb6\xa3\xc8\x0f\x2d\x42\x19\xfa\x29\x96\x0a\xe8\x66\x8c\x57\x5e\x7d\x04\xb2\x38\xa0\x5f\xe0\xf0\x35\x1c\x9a\x90\x14\x56\x69\xcd\x72\x19\xbd\xb0\xb8\x3b\xf0\x29\x7d\x8a\x3a\x2c\x08\xc6\x15\x29\x03\xc3\xed\x47\x8e\x71\x6b\x93\xba\x4e\xe6\x2b\x32\x27\xda\xfc\x4d\x72\x1a\xf8\xee\x6f\xec\xa8\x17\xfb\xd5\x00\xe8\x58\x02\x80\xe7\x50\xdf\xd9\xcf\xd1\xef\x87\xba\xae\xe6\xc9\x46\x43\xfe\xdc\x12\x0c\x57\xea\xcc\x29\x70\xab\xc3\x0e\x7f\xaa\xd3\xfd\x3c\x55\x01\xfd\x8d\x44\x05\x6c\xa7\x4e\x63\xc1\xf8\xd6\xd2\x3d\x10\x1f\xf0\x36\xf2\x17\x68\x0f\xe8\xa6\xf4\x40\x92\xdd\x25\xbb\xea\x9b\x28\x10\x78\xad\xfd\x4c\x01\x02\xdd\xae\x3f\xc0\xd3\xd7\xa6\x40\x60\x17\xc0\xb7\xd4\x20\x80\xb9\x82\x14\x0b\xc8\xcf\xa7\xb7\x1a\xef\xc6\x03\x1b\xba\xf3\x93\x8b\x90\x61\x71\x02\x90\xfb\xd2\xab\x87\xb8\xb1\x76\x34\xa2\xe0\xb0\x2c\x0a\xd0\xfc\x2b\x17\x88\xfc\x44\xf6\x97\xb4\xb6\xdb\xd1\x56\x5b\x7c\x76\x95\x43\x57\x5c\x8a\xe6\x44\x2f\x35\x84\x30\xc0\x88\xb5\x5c\x9b\x85\xb3\x25\x37\xab\x32\xa9\x74\xa5\x3a\x54\x3d\xd9\x89\x54\xe7\xed\xe8\x2f\x83\xcb\xcb\xde\xd5\x25\xfd\x07\xfe\xc3\x6e\x2f\xf3\x4b\xfa\xd5\xd5\xa5\x65\xc4\x9d\x17\xf9\x12\xe0\x4f\xd9\xce\xb2\x13\xe1\xc3\x4d\x6f\x89\xe3\x86\xb4\x8c\x77\xb2\x35\x0c\xc0\xa8\xe1\x53\xda\x8a\xb5\xba\x4f\xa0\x49\x57\x35\x6d\x3a\x87\xb5\xf4\x2a\x32\x61\x89\x0b\x13\x11\x3a\x1f\x2c\xc1\xcc\x91\x4c\x48\x2d\xbf\x36\x1b\x52\xab\x3d\x95\xa5\xe6\xe5\x76\x65\xfa\x7f\x8b\xd5\xe1\x45\x8a\x08\x30\xba\xb0\xee\xcd\x27\x45\x6d\x44\xba\xce\xba\xe3\x47\xdc\x17\x6f\xa2\xf0\x39\xa2\x08\xcc\xc7\xd7\x95\xce\x6e\x75\x25\x88\x91\xf0\x12\x69\x40\x6d\xbc\x8d\xd0\x25\xdd\x16\x2e\x37\xef\x8f\xd5\xe8\xc2\x16\xb5\x9b\x3f\xee\xd5\x8b\x40\xd6\x6f\x9f\x5a\x7c\xa8\x7a\x43\x2b\x24\xf1\xaa\x37\x19\x4c\x3e\xaf\x52\x1e\xe9\xf9\xdb\x64\x18\xda\xea\xdc\x45\x8d\xbb\x55\x04\x08\x9b\x7b\x31\xee\x03\x5f\x37\xd1\xfb\x47\xa2\x14\xfe\xb2\x0f\x75\xf0\x7b\x6b\xe0\x83\x92\xf7\xc1\xf0\x35\x2a\x68\xf4\x87\xd3\xc1\xb8\xaf\xc6\x83\xc9\xbf\xa9\xde\x84\xf9\xe2\x49\xc6\x01\x8a\xfa\xaf\xfa\x63\x90\x02\x18\x9e\xf5\x5b\x85\x09\x06\x13\xab\x9c\x10\xab\xc9\x9b\xd1\xf5\xe5\x39\xb1\xc6\x8b\x0f\x99\x81\xee\x53\xbb\x07\xef\xfa\x6a\x30\x24\xd2\xf1\xc9\x15\xb0\xc3\x7f\x18\x5d\xab\xc3\xe1\x08\xbb\x3d\x18\x0e\x80\x2f\xfc\xbc\xff\xae\x7f\x39\xba\x32\xd3\x88\xa4\xed\xc8\x1e\x2e\x18\x06\xba\xaa\x37\x99\x5c\xbf\x65\x9e\xf7\x89\x95\xf1\x18\xf6\xcf\xfa\x93\x49\x6f\xfc\x41\x4d\xfa\xe3\x77\x83\x33\x18\xf6\x71\xff\xaa\x37\x18\x23\x2f\x39\x68\x1f\x0c\x46\xc3\x18\x27\xbd\x7d\xc9\x00\x7f\xf9\x74\x30\xbd\x9e\x82\x20\x86\x24\x4f\xef\x8d\x59\x89\x62\xe2\x78\x23\x86\x48\x3a\x4f\x6d\x08\x47\x49\x48\x24\xbc\xe9\x8f\xfb\xb8\xe4\xfa\x7f\x3e\xeb\x5f\x4d\xe5\xfa\x73\x4d\x61\x75\x19\x41\xb4\x4a\xe7\xf9\x2f\x58\x93\xf0\xe5\xbc\xbd\x01\x3d\xed\x3d\xd4\xbc\x78\xb6\x60\xf5\xe4\xef\xe7\xe2\x35\x4d\xc4\x8f\x3f\x8e\x4d\xd5\xa5\x7d\x1a\x44\xaa\x5f\x9f\x33\x55\xc2\x45\x7e\x1f\x63\x6a\x6c\xe7\xe9\xd4\xc6\x13\x10\x44\x52\x6b\x49\xff\x84\x72\x93\xba\x44\xb2\xc3\x56\x2a\x5f\x4c\xbb\x1e\x22\x27\x91\xf9\xd8\x42\xcf\xb3\xa4\x2e\xca\x9d\x71\x91\x6e\xe0\x33\xc8\x06\x5c\x39\x2a\xdf\xf6\x50\x80\x8f\x6c\xdd\xeb\xa0\x7b\xbe\x39\x3d\x10\xd2\xb8\xb0\x44\x8c\xd7\x82\x7e\xec\x9c\x03\xc4\xb6\x64\xaf\x06\x0a\xb4\x0e\xb0\x3d\xce\xd3\x4d\x92\xd7\x9d\xae\xf1\x57\xf4\x0d\x47\x19\xfd\xe2\x14\x78\x8e\xf8\xf4\x4f\xed\x78\xd8\x76\xb4\x84\x1d\x26\x59\xf8\x48\x89\x1b\x59\x0f\xbc\x27\xfd\x2e\x5e\xeb\x8b\x50\x86\xaa\x88\x4f\x30\x13\xdf\x3e\xe1\x91\xda\x6e\x8a\x5c\xbd\xa0\x35\x4f\xb7\x1c\x5c\xbe\xde\x0b\xec\xbe\xdb\x94\x05\xcb\xc6\x66\xbb\x48\x6d\x73\xd0\x3a\x4b\x97\xbc\x7b\xf8\x49\x98\x5a\x86\xcc\xee\x06\x6e\x45\x7a\x34\x08\x2e\x01\x6c\xeb\xa5\x3a\x4c\xbb\x14\xc3\x49\x73\x60\xa5\xa7\x40\xe3\x26\xd9\x79\x6f\x4f\xd4\x7a\x5b\x6f\xb1\x62\xdf\x7c\x1c\x0c\x4c\x9b\x46\xd5\x0c\xdd\x67\x57\xbf\x54\x9b\xa4\xaa\x71\xaf\x23\xf2\x90\x08\xd3\xee\xe1\x8b\x17\xaf\xc3\x32\xae\x34\xc5\x42\x9d\x45\x99\xdc\xb1\x05\x67\x97\x3d\xae\xe9\x36\xba\xab\xb6\xe9\xe7\x35\x18\xbe\x08\x76\x56\x30\x6c\x76\xa0\x22\x70\x4a\x1b\x5d\x34\x9d\xda\x24\x3b\xdc\x35\x65\x99\xf0\x2e\x33\x27\x8c\x31\x3f\xfc\x81\x5a\xe0\xec\x8a\xd1\xa5\xa8\x90\xe5\x83\x2a\xc9\x20\x0b\xba\x46\xd6\x2f\x0f\x00\x51\xa2\x35\x57\xe2\x67\x2f\x42\xff\xd8\x16\xc7\x39\xf1\x0d\x7e\xda\xa4\xa5\x57\x48\x82\x03\xc3\xab\x67\xa3\xcb\xb4\x58\x30\x95\x8d\x71\x2c\x67\xc5\xad\xcc\x72\xcf\x62\x62\x55\x46\x84\x71\xa4\x56\x49\xb9\xc0\x7f\xd9\x82\x93\x48\x7a\x37\x8f\xdb\xc2\xfb\x10\x4f\x0f\xed\xe1\x60\xc4\x68\x88\xda\xb6\x70\x73\xd8\x00\x63\x8e\x88\x77\x06\xbc\x97\xfa\xb6\xf8\xa8\x17\x02\xf8\x9e\x58\x3f\x1a\xf0\x5e\x78\xc2\x21\xe6\x9d\xaa\xb6\x16\x91\xaa\x8a\x6c\x21\xe5\x58\x51\x90\x6d\x95\x2c\xe8\x53\xf7\x40\xa0\xe5\x72\xb5\x77\xc2\x53\x7b\x27\xe0\xe1\x7f\xef\xc9\xcf\xab\xdf\xdb\xd0\xf2\x48\xfd\x06\xa7\x28\xa5\x63\xb0\xee\x80\x17\x34\x30\x13\xde\xea\x85\x4b\x75\xcf\x76\x2e\xd7\x50\xaa\x4a\xd7\x35\x02\x30\xba\x82\xe4\xdc\x92\x38\xf0\xa2\x6c\xeb\xa9\xdb\x3f\x34\xf7\x18\x08\xb5\xbb\xf7\x36\xc9\xb6\x3a\xf0\x7e\xee\x3f\xd1\xf7\x02\xaa\x1c\x59\x5e\x9d\x7c\xd4\x66\x6f\x03\x23\x2e\x30\xe2\x9b\x8d\xbe\xd0\xb8\xa9\x2c\xfc\x97\x54\x5c\x4a\xd7\x08\x1c\x27\x3c\x43\x0a\xeb\xe9\xb9\xe9\x85\xe8\x2b\x6e\x47\x2b\x26\x20\x0c\x87\xa0\x69\xbf\x60\xd3\x7e\x31\x9b\x1b\x71\x1f\xa6\x7d\x3a\x5f\x20\x56\xa0\xa1\xe0\x5e\x79\xb6\x00\xaf\xc9\xa2\xc4\xc8\x64\xa9\x2b\x9d\x65\xba\xac\xba\x64\x3a\xb9\x1c\xe1\x6d\x92\xa5\x0b\x61\x3f\x51\x1e\x81\x5c\x60\xf1\x24\x61\x34\x3e\x82\xac\xbe\x0e\x24\x26\xf6\xab\x51\x99\xbf\xa2\x9d\x3b\x1c\xa9\xb3\xc1\xf8\xec\xfa\xed\x64\x6a\xdc\x0a\xe4\x63\xb3\x7f\xc2\xf0\x28\xea\x2f\x39\x5d\xa6\x7b\x15\x97\x9c\x44\x93\x2f\xb4\x84\x6a\x56\x1f\x46\xd7\x51\xbb\x63\x11\xb5\xbb\x15\x56\x25\xea\x7c\x30\xb1\x8a\x4c\xa0\x04\xd5\xa2\x24\x35\xb9\xbe\x32\x1e\xde\x98\xcd\x7e\x56\x65\x02\x1f\xac\x3f\x89\x84\x64\xd6\x74\x84\xda\x53\xfd\xf1\x64\x34\xb4\x02\x5a\x4e\x23\x4b\xc8\x66\x39\x2d\xad\x86\x8c\x52\xa0\x9e\x74\xf6\xa6\x67\xba\xde\x1f\x3f\xe4\x61\xf2\xf7\xcc\x7b\x2f\x47\x13\x78\xc0\xeb\xd1\xe8\xfc\xfd\xe0\xf2\x32\x52\xef\x47\xe3\x7f\x53\x93\xe9\xe8\xea\xaa\xf7\xba\x6f\x46\xf4\xed\xd5\xb5\x79\xa8\xd5\x8e\x1a\xab\xb7\xbd\x4b\x56\xbc\xb3\xbd\x67\xda\x37\x1e\xc3\xb7\xc6\x25\xf5\x5a\x89\x2f\x33\x03\x61\x65\xaf\x78\x78\x3e\xd0\x04\xbd\xe9\xbd\xeb\xa3\xda\x15\xca\xce\x3d\x4a\xee\x2a\x6e\xc8\x45\x79\x5a\x54\xf8\x64\x4f\x3d\xca\xfd\xd1\x0c\xc1\x79\xbf\x37\x7d\x63\x9a\x87\xd3\xd1\xbb\x54\x83\xe1\x9f\xae\xc7\xe0\x94\x5e\x5f\x82\xda\xd8\xc5\x78\xf4\x56\xb4\xf6\xa7\x89\x58\x75\x81\xb4\x9a\x79\xc9\xe0\x0c\x66\xf9\xb2\xf7\xde\xaa\xac\x4d\xf0\xeb\xae\x91\x8f\x13\xd8\xea\xff\xf9\xec\xf2\x7a\x42\xda\x7b\x7e\x0f\xef\x13\xd8\xb2\x42\x60\xac\xa5\xe5\x9e\x63\xe6\xe9\x21\x65\x2d\x16\xa2\x02\x82\xf8\x1b\x47\x10\xcf\x87\x51\x85\xa1\xf8\xc7\x48\x10\x44\x1d\x24\x4c\x4a\xd0\xf6\x55\xa9\x47\x22\xf9\xec\x17\x75\x16\x5f\xc4\xe3\x18\x65\x09\xd4\xe1\x68\x5e\xc7\xea\xe4\xd7\x5f\x9f\x77\x23\x16\x64\xa6\x02\x44\xf9\xe0\x06\xbd\x4b\x07\xce\xbc\x7b\x3f\xe2\xa7\xf1\xb1\x59\x22\xbb\x98\x94\x24\x1e\xe5\xb5\x8a\xa5\x00\x26\x7a\xc3\xed\x82\xca\x5a\x4f\x28\xba\xf1\x71\xd3\x16\xd1\x33\xa6\xf3\x3f\x51\xf5\xaa\x2c\xb6\x37\x2b\xf7\xab\x67\xea\xf0\x4f\xdb\x5c\x73\x8f\xbf\x31\x29\xff\xc9\x49\x20\x34\xd1\xc8\xa8\x78\x88\x45\x64\x5f\x87\x5a\x69\x47\x57\x2b\xf8\x5e\xf7\x30\xd2\x0e\x96\x0f\xb0\x9d\xa7\x95\x5a\xe9\x6c\xd1\xce\xc6\x0d\x53\xe2\xbe\x6b\x2f\xe9\x52\x2f\x8b\x72\xcd\xd5\x52\x7e\x36\xcb\x43\x7f\x72\xe8\x54\x3c\xf5\x31\x2c\xb9\x01\xad\xed\xc6\x05\x09\x44\x68\x57\xbc\xd3\xe7\xcc\x46\x1a\xed\x7c\x17\x39\x72\x75\x1b\xcc\xed\x46\xca\xdd\xd3\x29\x82\x26\x81\x27\xf7\xa8\x58\x1e\xf9\xef\x8a\xd5\xfb\xc0\x15\x22\x36\x68\x21\x2f\x69\x6b\x4c\x8a\x9c\xb1\xd9\xb0\xf1\xe6\x69\x9d\xfe\x5d\x23\x09\x33\x5c\xe5\xcc\x1e\x32\x5f\x25\x65\x0d\x0b\x06\xf3\x7b\x66\xe9\x92\x8f\xbe\x28\xd4\x6c\x5b\xa5\x39\x78\x9e\x68\xa9\xf8\xec\xc0\xc5\x52\xf5\xd6\xba\x4c\xe7\x49\x44\x19\x7e\xeb\xdf\x3c\xc0\x3e\x3d\x6b\x90\xc2\x06\x54\xd1\xf0\xbb\x0b\x62\x84\x3e\x43\x46\x68\xfa\xed\x83\x3c\xd5\xb0\xe8\x91\x65\x1a\x49\x5b\xd2\x5c\x4d\x92\xbc\x4e\xd4\x59\x96\x94\x89\x79\x1c\x60\xbd\x1a\xdf\x01\xb3\xb1\x00\xe2\x06\x1c\xba\xb0\x54\x66\x5e\x54\x75\xf5\x10\x15\x12\xf2\xd3\xc3\x47\xc9\xd6\xb2\x06\x6a\x52\xd7\x45\x99\xeb\x5d\xf5\x93\x5a\x6a\xa2\x57\xd6\x9f\x36\x60\xa7\xfe\x71\xf4\xd5\xdf\x55\x0e\xc0\x85\xf0\xf7\xeb\x01\x9c\x9c\xc6\x6a\xec\x49\xda\xe3\xe8\xdb\x5a\x8d\x5e\x65\x89\xb1\xdb\x51\x28\x41\x8c\x80\x89\x0a\xec\x86\x68\x4c\x2c\x69\xc4\xe7\x0b\x2b\x1c\x94\x94\x29\x56\xba\xef\x2b\xc2\x31\xf3\x4e\x34\x5e\xdb\x3a\xcd\xd2\xbf\xdb\x59\xf3\x80\x56\x0d\x40\x88\x27\x78\x85\x1c\x7e\x66\xf1\xb5\x77\x44\x76\x82\x76\x3c\xa3\x49\xa8\xc0\xcb\x1b\x26\x24\x0f\xd0\xff\xbd\x4d\x11\x82\x04\xdc\x01\x4e\x15\x84\xc2\xb3\x69\xe5\x44\x71\x6d\xc9\x83\x97\x43\x71\xbc\xe4\xc4\x73\x07\xf2\x05\xd8\x3b\x8b\xe3\x71\xf2\x44\xdb\xac\x4e\x37\x99\x3e\x22\x2f\x64\x01\x19\x3e\x40\x8a\x34\x3a\x85\x3a\x1b\x55\x7a\x83\x61\x2e\x51\xbe\xde\x08\xea\x26\x95\xea\xd8\x47\xd3\x08\x2e\x3a\x71\xdb\x2f\x2d\x33\x18\xad\xd1\xe6\x7b\x41\x82\xa1\xae\x20\x47\x59\x17\x34\x63\x0f\x34\x00\x27\x50\x80\xe3\xf8\x53\x6f\xaf\x2e\x39\xa6\x03\x40\xb3\x1c\x53\xa9\xec\x72\xba\xf3\xde\x45\x50\xf6\x42\x9d\xe8\x64\x6d\xc2\x3c\x04\xcc\xda\x65\xc0\x8e\xf6\x24\xea\xe2\x83\xce\x34\xe0\xea\x73\xbc\xd8\x2d\x1c\xdc\x0f\x13\xc9\x62\xe4\xd7\xd2\x3d\x76\x7f\xb3\xe9\xdd\x2f\x26\xde\xe6\x8c\x3b\x96\x94\x78\xf5\xc5\x82\x89\xba\x56\xab\xba\xde\xbc\x7c\xf2\xe4\xee\xee\x2e\x5e\x63\x3b\xe3\xa2\xbc\x79\xf2\xf6\xea\xf2\xc9\xc1\xe4\x71\x7c\xd6\x69\xd5\x42\x67\xcd\x49\xba\x47\xd1\x59\x53\xd1\x2b\x9d\x97\x54\xb0\x9c\xa5\xe6\xbc\x9c\x7c\x4b\xea\xe7\x16\x2e\xef\xb4\x52\xff\xf9\xa8\x1f\xfc\x72\x4b\xb4\xbe\x8d\x2d\xe6\x9e\xa7\xc6\x07\x96\x57\x5e\xf0\x98\xb4\x7f\x96\x2a\x49\x2c\xfb\xfc\x59\x97\x3e\x78\xb0\xef\xe1\xed\x34\xf4\x52\xe9\xb5\xea\xbe\x7c\x74\x8f\x7b\x6e\x03\x9a\x53\xb9\xde\xbb\x0b\xa4\x06\x6c\x2b\x38\x44\xe3\x3b\x5d\xd6\x1e\x36\xc0\x7f\xfc\xe7\x7f\xfe\xe7\x5f\x95\xdd\x06\x51\x8b\x94\xb7\x30\x07\x8b\xa5\xfa\x0f\x6c\xd9\x5f\x3d\x34\x9e\x30\x08\xcd\x95\xa8\x93\x85\xb2\x12\x26\x18\x5c\x35\x96\xf1\x0e\x54\xa4\xaa\x15\x64\x48\xb2\xac\xb8\xe3\x90\xfa\xae\x91\xde\xe7\x5e\xed\xa7\x07\xd0\xd8\x92\xbf\x7a\x97\x0f\x89\x81\xe2\xc3\x49\xc1\x89\x40\x2f\xfb\xdf\xe1\x1e\xff\xf6\xea\x12\xa0\xf1\x58\xe5\x01\xdf\x58\xe8\x39\x1a\xe3\xb3\x1d\x91\x87\x52\x48\x4c\x8c\x0a\xf4\x90\x8c\x21\xd4\x1c\x01\x15\x52\x7b\x42\x50\xd8\x19\x78\xae\x7c\xad\xa2\xca\x23\xda\xe4\x4e\xfd\xd5\x43\xe1\x9a\x51\x23\xfc\x05\x91\x37\xb5\xbd\x3e\xf2\xe0\x67\x66\x31\x3c\xa6\xd3\x82\x5a\x51\x1c\xfa\x7e\x1b\x3a\x07\xc3\xd1\xb4\x8f\xc2\x13\x50\x6b\xc9\xcf\x71\xc7\x36\xa2\xb7\x01\x71\x51\x65\x66\xe5\x67\x3b\x07\xbd\x70\xdf\xe1\x91\x68\x85\x28\x03\xc7\x64\xeb\x56\xc6\x93\x95\xa4\x1c\xad\xd0\x73\x7b\x4b\xca\xc4\x05\xe5\xed\xc7\x96\xc5\x36\xb7\xb0\x43\xff\x94\x08\xc8\x02\xf0\x36\x0c\x08\x58\xff\x68\x56\xf4\x7f\x9d\x9f\xf8\xc9\x18\xf8\xff\x9f\xff\x61\xfc\xff\x3f\xbf\x78\x76\xfc\x2c\xe4\xff\xff\xf9\xf8\xe4\x07\xff\xff\xf7\xf8\x19\x9b\x03\xac\x2c\xe6\x49\x16\x5a\x6e\x27\xf1\x73\x75\x38\xbe\xba\x3c\x89\x9f\x77\x0f\x9c\x19\xf7\x3c\x52\x7f\xda\x66\x3b\x75\xf2\x3c\x52\xa7\xc7\xc7\x3f\x1f\xf8\x37\xf5\xe9\xf1\xf1\xc9\x91\xf9\xbd\x72\xf2\x93\x57\xdb\xb2\xda\xa6\x35\x28\xc6\x44\xed\x77\xf5\xd5\xb8\xdf\x7b\xfb\xea\xb2\x0f\xe6\xc6\xfe\x36\x99\xf6\x74\x8d\x9d\x31\x03\xde\x19\xe2\x0f\x81\x18\x11\x26\xab\x4b\xfa\x2a\x96\x59\x81\xd9\x6c\x0e\x73\x24\xf7\x8d\xd4\x32\x49\xcb\x5c\x57\x55\x7c\x30\xc8\xcd\xf1\x56\xd6\x44\xb3\xca\x37\xf4\x4d\xa9\xef\xd8\x0f\x83\x9a\xa1\xb4\x44\xd6\x86\xcc\xdc\xab\x59\x51\x6c\x56\x45\x86\xa7\xa9\x25\x8f\x2e\x36\x3a\x67\x7a\x5d\x67\xb0\xbb\xcf\x12\xd5\x4c\x56\xdc\xe9\x85\x4d\xe0\x3a\x39\x44\xef\xfb\x9e\x36\x2a\xb2\x36\xa8\x65\x9a\x27\x39\x04\x19\x49\xcc\x0d\x0f\xfa\xb4\xb6\xc1\x02\xe6\x40\x2f\x2c\xfd\x33\xe2\x4b\xd2\xb5\xb9\xb3\x18\xd2\x5f\xe2\x03\xc1\xb0\x71\x4a\x08\x96\x24\x1f\x4d\x10\x0d\x71\x05\xf0\x77\xd7\x14\xc7\x2a\xe6\x54\x5c\x61\x15\xa3\x5d\xb0\x67\x91\x2e\x48\xa0\x52\xbe\x57\xc6\x1c\x40\xca\xa1\x23\x18\x0d\x3a\xf1\xc1\xfb\x55\xca\x95\xec\x14\x4c\xd2\x25\x18\xf0\xcb\x52\xeb\x45\xb1\xb6\xa5\x31\xeb\x62\xa1\x33\x74\x11\x49\x85\x39\x32\xfd\x86\x72\xd9\x8f\xe8\x2d\x6d\xeb\x95\xf1\x64\xe9\x16\x1b\x5f\x5d\x42\x82\x50\x9b\xf1\xd8\xe6\x66\xbe\xb9\xa7\x72\x98\x5d\xaf\x93\x5a\x65\x58\xaf\xe9\xa4\xe3\x6d\xdd\x72\xf0\x70\xe3\x5a\xe3\xd4\x5b\x38\x71\xac\x7a\x58\x8a\x9f\x65\x91\x9a\x6d\x6f\xd4\x32\xfd\x64\x66\x1f\xa2\x76\x95\x13\xe2\x31\xde\x64\x9a\xdf\x2c\xb7\x19\x2a\x96\x25\xd9\x16\x4c\x37\x39\x23\x77\x9a\xb0\x00\x73\x1b\xf0\x35\x97\x7a\x6a\x65\xf4\xd2\x52\xdd\x19\x93\x33\x99\x7f\xc4\xf4\x61\x38\x81\xba\xa4\xca\x80\x39\x5c\xdc\xcb\xad\xce\x58\xeb\x3a\x22\x08\x55\x55\x9b\x7f\xdf\x94\xc5\x1d\xd4\x52\x40\xb4\x28\xc9\x25\xc8\xd3\x38\x18\x50\x2b\xd1\xb6\x2c\x41\x35\x88\xe6\x6f\xe7\x4c\x04\xc0\x8d\x66\x20\xa9\x08\x98\x71\x09\xb6\xaf\x9d\x0a\x99\x65\x97\x85\xdf\x55\x96\xca\x8b\x67\xce\x58\x4a\xd6\x70\xb8\x2b\x04\x59\x70\xf5\x52\x75\xce\xf5\x26\x2b\x76\x14\x7a\xb7\x45\xde\x67\xc5\x7a\x53\xe4\x66\x85\x77\xe2\x83\xb1\xbe\x49\x4a\x02\x2b\x99\x0f\xaf\x21\xab\xef\xac\x4d\xf3\x92\x1d\x7a\xdf\xc0\xcc\xb2\x77\xce\x74\x3d\x8f\xf7\x11\x1e\x3d\x6e\x3d\xdd\xad\x34\x60\x76\x15\x36\xdb\xd3\x8c\x38\x3a\x62\x33\x30\xc5\xd8\x5a\x86\xc1\x20\xe0\x2b\x02\x4e\xe1\x74\x41\xc1\xd6\x18\x81\xee\x30\xd6\x75\x52\xd6\xaa\xdc\xe6\x36\x47\x6c\xa7\x65\xc7\xf5\x8b\x58\xc8\x52\x42\xf0\xac\x0c\x3f\x16\x1f\x5c\xf0\x62\xf0\x87\x04\xa9\x27\x78\x1c\xe1\x69\xb8\xf4\x45\x60\xb2\x9a\xaf\xf4\x3a\x71\x94\xe4\x91\x64\x14\xa7\x01\x3b\x3a\x52\x25\xcc\x00\x60\x8b\x8a\xa5\x65\x5e\x36\x8b\xf2\xa7\x52\x13\x6d\x39\x72\x9e\x17\xae\x54\x69\x86\x55\x1b\x08\x0f\x47\xc5\x8b\xbb\x42\xad\x12\x80\xe2\x16\x4b\x35\xcf\x8c\x89\xfd\x04\x2e\x0b\xff\x74\x39\x3a\x72\x55\x22\xab\xa4\x34\xbe\xf4\x07\x39\x16\xe6\x77\xb8\x77\xcd\x59\xac\x36\x29\x55\xae\x25\xb9\x4a\xab\x02\x6b\x2e\xaa\x8c\x02\x31\x69\x0d\xf7\x82\xd4\x2f\xa8\x57\xda\xdc\x0a\x45\x92\x55\x91\x1d\xae\xbb\xa4\xa2\xf1\xc1\xd8\xd6\x5a\xeb\x7a\x4f\x09\x15\x89\x92\x91\xcd\xeb\x34\x74\x4c\x1f\x7d\xf6\xa2\xf0\xb3\x03\x02\x2f\xdc\x6a\x75\x38\x9a\x0c\xba\xe8\x89\xdb\x80\x00\x65\x91\x80\x4a\x3c\xc7\xf6\x56\x21\x4c\x1b\x05\x51\x84\xea\x75\x9b\xc4\xa7\x53\xda\x60\xfc\x31\x28\x95\xa1\xea\xcf\xb1\x7a\x8d\x9a\x2b\xbf\x71\xa5\x0c\x85\x05\xff\x87\xa7\x07\x84\xf7\xc4\xfe\x6b\x5b\x58\x0f\xea\xd0\x05\x80\x64\x41\x0d\xa5\x70\x6e\xca\x64\x5d\x39\xca\x40\x3c\x71\x93\x0a\xc9\xe6\x93\xca\xc3\xd7\x6d\x37\x0b\x96\xf8\x81\xa1\xd4\x39\x44\x89\xe8\x2a\x42\x02\xcb\x24\x5d\x78\x8f\xc5\x07\x1e\x76\x38\xe8\xd3\xe9\x7a\xd5\x02\x73\x0a\xd6\x05\xf5\x01\xa2\xcc\x67\xe2\x04\x1e\xd8\xec\x59\x15\x99\x19\x50\xee\x58\x01\x14\xf1\x01\x6b\x8b\xd0\xb7\x48\xec\x53\x91\x9f\x42\x1d\x62\x10\x15\xa3\xd9\x34\x5f\x5d\xe7\xcc\xf1\x53\x69\xee\x77\xc4\x02\x9d\xb0\x5a\xe1\x16\x51\x30\x1e\xe9\xce\x43\xcc\xc7\xaa\x57\xd9\xec\xa3\xfc\xc3\x4b\xc7\x7c\xdf\x2a\xb3\x04\xb3\x04\x5a\x9c\x42\xab\xe6\x6e\x55\x38\x9e\x08\x29\xb7\xb4\x68\x93\x5b\x82\xe2\x67\x3a\x68\x85\xda\x92\x3b\xde\x29\xf0\x4a\x34\xba\x13\xb3\xe7\x3d\xa2\x5c\x5f\x03\x9a\x03\xb6\x42\x9b\xdc\xb9\xa3\xd6\xbd\xe4\x63\x16\x2c\xce\xa4\x9c\xaf\x18\xda\x76\xc5\xc2\xa2\xd7\x15\x97\xac\x33\x21\x7e\x5b\x26\x46\x2e\x3f\xfb\xcc\xb6\x09\x70\xec\x91\xa2\x65\x04\x19\x84\x16\xd9\x3c\x98\x59\xeb\xe5\x4d\x92\xdb\x68\xbf\xdf\xfc\x07\x1a\xec\x76\x46\x93\x2d\xdf\x0d\x1a\x2d\x99\x87\x5b\x48\xd0\x1c\xda\x8f\x3e\x69\xb3\x90\x3c\x02\xb6\xfd\x5c\x4b\xe9\x29\x33\x7f\x7e\x05\x10\x64\xbc\xdb\x16\x99\xcc\xc9\xe3\x42\x85\x1c\xb4\xdb\x50\xa0\xe5\xc9\x4f\x7e\xf6\x0f\x28\x16\xa5\x18\x88\xb6\x28\xee\xf2\xac\x48\x88\x01\x36\xc9\xd5\xc5\xf4\x4a\xd1\x35\x65\x4e\x1b\x3d\x53\x55\x5a\xa3\xd4\x10\xe3\xda\xd6\x92\xc1\x0e\x8a\xb9\xe6\xd4\x48\x2c\x05\x15\x4a\x54\xaa\x63\xb7\x8a\xa7\xb5\x12\xd0\x35\x87\x23\x1f\x61\x85\x6d\xc3\x40\x42\x64\x04\x54\xa5\x59\x0c\x82\x77\x3f\xb4\xe9\xbe\xbc\x68\x17\x68\xda\x7b\xd8\x0b\x99\x29\xfb\x4d\x3a\xe9\x64\x17\x28\x40\x47\xe7\x22\xe5\x27\x9c\x0c\x29\x3f\xe3\x17\xfb\x0c\xb7\x4a\xe5\x63\xec\xca\xb5\x89\x22\xc9\x6f\xe4\x9f\x79\xcd\xe5\x2e\x49\x99\x2a\x85\x34\x5d\xe4\xd4\xb9\x81\xe7\xb9\x0d\xb4\xd6\x99\x95\x80\x38\xb0\x84\xbe\x93\x72\x17\x81\x27\x16\x17\xdc\x17\x04\xe8\xb3\x8d\xe1\x57\x67\x3b\x72\x02\xf6\x5d\x45\x85\xbb\xe2\xbc\x1b\xe9\x91\x74\xf7\x27\xf1\xc9\xf1\x23\x14\xa8\xaa\x40\xbe\xa9\x7a\x8c\x06\x15\x00\xc3\x29\x8c\x5c\x5a\x42\xb2\xa2\x4c\x6e\xbc\x2b\xb0\x31\x13\x0e\xba\x9d\x48\x39\xa7\xc2\x7d\x7b\xbf\xb2\xd3\xde\x87\xd1\xd3\xc2\x27\xe1\x5d\x4e\x61\xe3\xca\x57\x26\x24\x42\x58\xcf\x09\x5c\x6e\xf3\x39\xe6\xbe\x89\x51\xb5\x65\x1d\x81\x59\x0e\xb5\xaf\x42\x6b\x48\x75\xe4\x61\xcd\x63\x4c\xf1\xf7\xd6\xb3\xd7\x97\x94\xa9\x8a\x4c\x67\x78\x1e\x81\x1b\x0e\x90\x17\x2b\x85\x0d\xe2\x82\xb7\x2c\x75\x9d\x17\xf9\x91\x40\x23\xb1\xec\x4a\xac\x7a\xf2\x91\x3f\xdd\xf3\xfa\x34\x97\x6f\x99\x27\x9b\x04\x82\x28\x48\xc8\x5a\x2c\x97\xe9\xdc\xf8\x0d\x7a\x6d\x2e\x69\xad\x23\xb5\xd6\xeb\x99\xf9\x8d\xb1\x26\x37\x3a\x5f\x38\x29\xe2\x39\xd0\xeb\x95\x2a\xb9\x21\x10\x6a\xa2\xe6\xae\xe6\x38\xda\x7f\xf5\x1d\x8a\x1e\x80\x1e\x8f\xec\x53\xd7\xd1\x73\xfc\xf7\x36\xc9\xd2\x25\xb4\x4d\x8e\xb0\x94\xed\x69\x77\x10\xc5\x32\xaf\xf5\xa7\x3a\xb2\xa6\xa1\xf4\x6a\xc0\xcf\x89\x5a\x55\x99\xaa\xc8\xca\xdc\x90\x3e\x53\x60\xa9\x8a\xdc\x96\x39\x1b\x24\x77\x9c\xcb\x39\x78\xfc\x8e\x30\x3e\xc6\xe3\xbe\xd1\xae\x6a\xbd\xda\xc2\x6d\x80\xc2\xf7\x24\xed\x84\xc9\x8e\x6d\xde\x32\x75\x62\x67\x35\x83\xe9\x11\x39\x96\xe1\x63\xe0\x93\xe1\xcd\x21\x86\xf0\xa9\x19\x42\xb4\x3d\x78\xdc\xd2\xfc\x56\x57\x52\x41\x5e\x7f\xda\xe8\x32\x6d\x52\x70\xd1\xf2\x33\x7d\x73\x81\x00\xc7\x11\x0a\xa7\x85\xcd\x5b\x86\x05\xe5\x72\x5f\x41\xad\x7e\xa5\x36\x45\x4d\x62\x55\xdb\x4a\xcb\x46\x3e\x53\x1d\x30\x10\x85\xd5\xb8\xd0\x59\x6a\xae\xdf\xd6\xa7\x3d\x61\x83\x50\x1c\xef\xb3\x1d\x7d\x99\x56\x2a\xe1\xf8\x72\x5d\x03\x94\x22\xa0\xe1\xe2\xbf\x23\x3c\x46\xca\x1b\x69\xe0\x69\xd9\x6b\x5a\xb5\xbf\x5d\xf4\xe5\xb9\xea\xb4\xdd\x70\xb6\x41\x8f\xf4\x8e\x1e\xe1\x15\xa1\x0d\xd0\x74\x8b\xdc\x72\x95\x99\x6e\x6b\xa2\xcc\x76\xd6\x17\x11\xcd\x7e\xf1\x58\x45\xb5\xfb\xd4\xd3\xf6\x4e\x7f\xcb\x90\xed\xd3\x59\x73\xa6\x44\x8d\x0e\x55\xbb\xda\x1a\x6e\xfc\x6f\xa4\xb9\xa6\x1d\x57\x0f\x0d\xaf\x9b\x2d\x11\x60\xf9\xbc\xd3\x60\xb6\x4d\xb3\x85\x4a\x6c\xe4\xa7\x9d\x17\x40\x7a\x40\xf7\x2d\xb3\x9f\x55\xe7\xba\xd2\xe5\xd1\xbb\x14\xc1\x4a\xbd\xda\x19\xd4\x9f\x67\xa6\xbd\x12\x4f\xfd\x85\xe4\xc4\xac\x4a\xda\xef\x13\x49\x0b\x2c\xb7\xfd\xf2\x65\xee\x7d\xdf\x44\xc8\x0c\x78\x01\xd8\x7a\xff\xc7\x96\x2b\x6b\x15\x29\xa3\x43\xeb\x2b\x89\x95\x1d\xab\x1e\xb8\x52\x70\xa0\x8c\x96\x3e\x0c\x87\x0b\xd9\x24\x1b\x31\x7a\x5e\x01\x5c\x33\xe5\x78\x26\x04\xe9\xcc\x57\xaa\xf4\x06\x96\x56\x1d\xa9\x15\x32\x19\x9a\x5f\x03\xbe\x4c\x67\x90\x94\x49\x38\x2c\x09\xa0\x2b\x04\x8e\x71\x84\xc0\x18\xd6\xb2\x48\xca\xe9\xed\x14\x25\x13\x4f\xc8\x30\xbb\x2f\x95\x2a\x37\x8d\x59\x39\xe2\x62\x10\x97\x79\xe2\x53\x59\x4d\x21\x2a\x48\xc5\xaf\x5c\x24\x2c\x08\x6e\xb2\xe4\x8e\x33\x4f\x4c\xe3\xd0\x1c\x09\x78\x0c\xc0\x8c\x35\x94\x04\x93\x28\x10\x1c\x6b\x96\xe3\x48\xbc\x06\x4b\x79\x09\x28\x01\xfb\x3b\x71\xb3\xd1\xc6\x13\x85\x9f\xb1\x48\x6a\x84\x3f\xcf\x20\xbe\x6e\xba\x94\x65\x70\xb7\xb6\x05\x12\x63\x35\xb8\x80\xca\x78\xae\x0f\x78\x3d\xee\xf7\xb1\xd8\xbe\x77\x09\x15\x32\x18\x24\x04\x70\xff\xd9\x68\x78\x3e\xc0\x72\x82\xa0\x2e\x9d\xbf\x7e\x3d\xe9\x47\xea\xed\xe8\x7c\x70\xf1\x21\x52\x67\xe3\x7e\x6f\xda\x57\xe7\xfd\xf1\xe0\x5d\x6f\x3a\x78\xd7\x9f\x40\x49\x87\x2d\x78\xc1\x92\xfa\xc9\xe8\x62\xfa\xbe\x37\xee\x43\x4b\x06\x53\x35\x98\xa8\xc1\x5b\xac\xc9\xb8\xec\x43\x15\x85\x69\xde\x74\x04\xe5\x22\x97\x1f\xbe\xa0\x6d\xd3\x37\xfd\x21\x3c\xe4\xac\x37\xfc\xdd\xad\x44\x91\x91\x63\x14\xbe\x12\xf7\xbf\xba\x30\x3e\x93\xbd\x35\x7d\x45\x2c\x7d\x4f\x10\x57\x32\xe1\xd9\x00\xe0\xd7\x16\xf6\xe3\x07\x3f\xc0\x31\x4e\xd2\xab\x8d\x80\xd0\x7e\x15\x2f\xe6\x9b\x0f\x83\x98\xf2\x92\x6a\x9e\xf3\x11\x41\xc4\x01\xbc\x58\x50\x78\xf3\xa5\xd3\x67\xc1\x90\xd7\xef\xd4\xd5\x6a\x37\x32\x43\x9b\x30\xcd\xd5\xac\xa8\x57\x4d\x61\x0b\x62\x8d\x6b\xbb\xe9\x85\x0a\x87\x3a\xc3\x63\x27\x34\xaf\xd5\xe1\xbe\xda\x94\x7d\x71\xb0\xee\x7e\x5f\x71\xb1\xa0\x9c\xaf\x75\xd2\xf3\x9b\xc7\xf8\xe8\x10\x13\x6f\x3c\x52\xe8\x25\xa8\x6b\xbc\x0e\x71\x2a\x6d\xe5\x64\x85\x8a\xbe\x52\xcb\xd7\xca\xfb\x7a\xb7\xaa\x5d\x57\xa1\x76\xd6\xe3\x54\xb2\xda\x0d\x9a\x50\x0b\xcb\xb8\x91\x35\xbb\xc8\x7e\xa9\x84\x65\x38\xf4\xcb\x48\xbd\xaa\x0d\x4c\x73\x73\xb0\xf3\x1b\xb5\x51\xc8\x09\xb8\x4d\x5c\x22\xe6\x21\x60\x64\xe2\xfc\x79\x1b\xd1\x96\x17\x3f\x96\xa4\x99\x1a\x3c\xa9\xca\x82\x82\xad\xc7\x67\xbc\x77\x48\xd4\x80\xa5\xc4\x01\x8c\x2a\x72\x69\x74\x3c\x7a\x22\x8e\x92\x72\xa6\x82\x30\xdf\xd6\x64\x5d\x25\xc6\xfa\xd0\x65\x5a\xd5\xe9\xbc\x8a\xd5\x34\xad\x41\x7a\x24\x60\x00\xe5\xc8\xf9\x7d\x3a\x05\xb9\xcc\xb0\x37\x87\x0f\x21\xe3\x8e\x03\xc3\x8e\x17\x8b\xba\xf9\x92\x65\x15\xd1\x0d\xee\x3b\x72\xbd\xeb\xfa\xd5\xae\xad\x0a\x42\xc0\xf9\x04\x05\xde\x0b\x35\xd3\x59\x71\xf7\x3b\x75\x08\xd5\x63\x8e\x5f\xd8\x88\x3e\x63\xfa\x3f\xfc\x31\xfc\xec\x2b\x1d\xc3\x81\xa9\x85\xb9\x9f\x3d\x1a\x15\xad\xbb\xff\x4b\x4e\xe8\xe8\x7e\x45\x44\xe5\x4b\x1c\xee\x8b\x8d\x3c\x8b\x4f\x7f\xf7\x09\x19\x2a\x46\x7e\xfe\x01\x24\x06\xef\x9f\xf9\x74\x7c\x1e\x1f\xab\x3e\xee\x12\xf3\x27\x61\x2e\x69\x56\x11\xe5\x52\x93\x30\x8b\xd4\x52\x64\x82\x7a\x01\x82\xbf\xc1\x74\x9d\x55\x3b\xab\xc8\x5d\xad\x55\xc4\x53\x16\xe1\x07\x54\xa5\xe7\xa5\x46\x94\x14\x58\xdf\x16\x9d\xd1\xdc\x5c\xb6\x83\x45\x1b\xd1\xad\x10\x5d\x70\x95\x51\x20\xd1\xb3\xe0\xda\x48\xe6\xc8\x6c\xfb\x88\x94\x4f\x7c\x8a\x95\x9d\x20\x55\x48\x28\x66\xe4\x30\xe0\x3e\x34\x4b\x09\x22\x54\x9b\x13\x24\x4c\x29\x12\x13\x7a\xe6\xcd\x3a\xd9\xb1\x9f\x26\x65\xc6\x42\xe9\x8b\xa5\x34\x5e\x03\x82\x1e\x8e\x16\xc1\x31\x69\x9e\x87\x63\x6f\x0e\xef\xba\x82\x95\x07\x9a\x13\x25\xe4\x0e\x80\x9d\x10\xef\xba\xd4\x23\xd5\x00\x23\xd8\x4e\xd0\x83\x23\x4b\xfa\x50\x98\x46\x83\x6f\x60\xe4\x3a\x60\x39\x6d\xd8\x36\x0f\xaf\x21\x88\x07\x6d\x4a\x4d\xed\x62\x77\xce\x35\x07\xc6\xc2\x5d\x9f\x78\x6c\xba\xbb\x18\x2d\xf9\x16\xfe\x64\x4f\x3f\xd2\x75\xce\xee\x1a\x94\x64\x80\x7d\x95\x38\x73\x20\xa0\x76\x78\x1e\x9f\x20\xff\x8e\x5d\x2d\xc9\x5c\x48\xd6\x98\x6b\x01\xcb\xbf\x48\xd4\x6e\x05\x55\xbf\xf2\x0a\x6d\x5e\x67\x74\x8f\x79\xc4\x16\x38\x23\x69\xc9\x15\xa1\xe6\xec\x0b\xeb\x99\x5a\xae\xee\xa0\xf6\x17\xd6\x6b\x52\x55\xdb\xd2\xd8\x9f\xd6\x3f\xb6\x62\x52\xf7\x4d\xb1\xad\xb7\x6a\xbe\xc6\x86\xff\x99\xc1\x03\x6f\x71\x2b\xcf\x7b\xdf\x96\x65\xa1\x87\xa5\xd8\xdc\x14\xda\x78\x60\x98\x40\x38\x05\xe5\x89\x24\xe1\x34\x11\xc2\x88\x4a\xbf\x19\x94\x5a\xd7\x98\xc6\xf1\xdf\xe1\xd0\xaa\x1e\xf9\x48\xb1\x7c\xa0\xb5\x62\x9d\x00\x62\x23\x71\x6e\xa2\xd0\x7a\xe2\xb8\xba\x57\x0f\x14\x30\x95\x58\x62\x8d\xc8\xa3\xe1\xae\xaa\xed\x5a\xe3\x66\x0d\xca\xfe\x8c\x79\xa2\xe7\x18\xa7\xbf\xff\x34\xa4\xd7\xe6\x5a\x2f\xcc\xf1\x83\x75\x6a\x18\xb2\xd3\x9f\x92\xf5\xc6\xd8\x8b\xe6\x97\x9e\xd5\xd2\x14\x5e\xf5\xc2\x46\x50\x4b\x42\xb7\x4f\xc8\x76\xdd\xcc\xf6\x21\x73\x34\x9c\x71\xcd\x5e\x30\xc8\x16\x16\x16\xbf\x6f\x06\x51\x17\x81\x87\xa0\x21\x6c\xf7\x8a\x5e\xc4\xc7\xf8\x74\x21\x1b\xaa\x7a\xf9\x02\x2f\xa8\x0a\x48\x57\x00\xb2\xb9\xd0\x96\x02\x89\x8c\x35\x32\x44\xf0\x94\x96\x93\x17\xa9\x56\x46\x19\x8f\x8a\xc9\x3b\x48\x9a\xec\xe9\x7c\x8f\x7f\x29\x18\xe0\x70\x5e\xc0\x6c\x42\x99\x93\xb8\x1d\xba\x2e\xb7\xfd\x15\xb5\x4d\x5d\xd0\x3e\x6a\x45\xd6\xb0\xfd\xfd\x0c\x8b\x87\xc5\x65\xf5\x19\xad\x61\x28\xa0\x35\x27\xbf\xa1\xca\xe9\xcf\x1e\xa3\x3d\x29\x15\x15\xfe\x69\x02\xd2\x5c\x76\xd9\xa7\xe6\x2c\xf4\x5c\x06\xcf\x47\x08\x3c\x08\x5f\x13\x0e\x53\x36\xf7\xee\x40\xe0\xd4\xb9\xcb\x85\xb1\xa9\x5a\xb4\xc8\x9b\x46\x3a\x9b\xef\xcd\x50\xa9\x34\xe0\xa3\x07\x03\x29\x91\xc4\x08\x35\x66\x11\x2b\x35\x3f\xe2\x6d\x45\x90\x58\x98\x2e\xba\xfa\x90\x15\xda\x38\x46\xc6\xc5\x54\x15\x10\xfa\x81\x63\x9c\x2c\x52\x60\x1c\x83\xdc\xa5\x47\x90\x0c\x3c\x45\x01\x6f\xa0\xbd\x40\xc4\xbb\x1d\xb2\xa9\x55\x49\xb1\x55\x93\x16\x8e\xfe\x92\x2d\xb1\x22\x07\xc1\x90\xba\x08\x2a\x4d\xf7\x28\xd7\x06\xfd\x0e\x85\x6b\x71\x03\x53\xe1\xdc\x67\xa9\xd7\xc2\xa1\xda\xa6\xd1\xb1\xe7\x68\x24\xc7\x39\xdc\x4d\xa8\x65\x21\x64\x6f\x11\x4a\xff\x75\x54\x6f\x1d\x2d\xf9\xfd\x5a\xb4\xbe\x0c\x81\x10\x36\x7d\x50\xd6\x25\xac\x63\xa3\x6b\xbd\xed\xcc\xc0\x95\x16\xb1\x76\xec\x83\x48\xb2\xa6\xb0\x32\x8b\x4d\x78\xc2\xc1\xee\xd1\xfb\x40\xe2\x84\xf5\x2b\x72\xad\x0e\x4f\x48\x98\x95\x10\xd1\x1e\x2c\xdc\xd2\xed\xb7\xaa\xc5\xe6\x85\x02\x28\x35\x16\xd7\x3d\xa8\x18\x0b\xc7\x21\xd6\x61\x14\xf4\x82\x2f\x55\x69\x35\xf6\x85\x64\x71\x17\x3d\xfe\xc6\xc2\xad\x9e\xb6\x73\x28\xa6\x45\x06\x75\xbb\x48\x74\x5b\x01\x77\x5a\xd9\x13\x3b\xcd\xc1\x37\x43\x64\x3a\x25\x50\xe0\x24\x9d\x17\x15\x58\x63\xac\x36\xc6\x09\xde\x10\x2f\x09\x01\x1b\xf3\x72\xc1\x52\xff\x99\xda\xb2\xe1\x7d\xfd\x39\xb7\x1b\x26\x70\x18\xaf\xed\xfc\x1d\x4f\x4b\x95\x2b\x31\xa8\xf0\x3f\x14\x93\x36\x4e\x30\x89\xd2\x7a\xd8\x2e\x56\xa8\xfd\x7d\x52\xb3\x0c\x29\x7c\x8c\xd8\xec\x3d\x88\x0f\xab\x92\x88\x04\xe0\x81\xeb\xc1\x77\x6b\xe8\x39\xec\x8b\x2c\xa6\x39\xc0\xd2\xc2\xc5\x02\x24\xe8\x69\x1a\xaa\xce\xd2\xfd\xe8\xac\x99\xe6\x03\x03\x8d\x1e\xa4\x1a\xff\x8a\x8a\xb4\x2d\xfe\xab\xdc\x12\x44\xde\xcf\xd3\xa7\x09\x3a\xaf\x8f\xf4\x27\x62\xaf\x72\x19\x04\x2a\xfe\xe5\x49\xb7\xc5\xc0\x45\xe9\x74\x49\xf4\xa7\x7a\xaf\xe7\x6c\x4d\xb5\xbb\x32\xad\x6b\x9d\xcb\xfc\x6b\xc1\xfa\x61\xd6\x55\xdc\x13\x2a\x10\x3a\x01\xf7\x8b\xea\xc6\x1e\x47\x6f\x53\x54\xd7\xb2\x57\x82\xcd\xb0\x57\x45\x17\x2a\x4b\x1e\x2d\xa1\xfb\x99\x0a\xba\xfe\x4d\xd4\xb2\x59\x56\xdb\x75\x92\x1f\x19\xb3\x05\x4f\x71\xab\x92\x0b\x27\x8e\x2f\x8d\x6b\xda\xfd\x07\x48\xe1\x7a\xac\xab\xa1\xec\x2a\x0f\x72\x90\x0f\xfb\x0c\x89\xd5\xc3\x4e\xef\x6a\xd0\xe9\x3a\xa1\x3e\x7f\xb6\x5a\x34\x56\xb1\xed\x9f\x29\xb1\xea\x2b\x45\xde\x27\xad\xda\x3e\x29\xd5\x16\xaa\x4f\x16\x7b\x66\x47\x8c\xd2\x3c\x6e\x08\xb0\x12\xf4\x97\x7e\xf9\x48\xb9\xd5\x17\xf1\x53\xa1\xb2\x0a\x84\xb2\xa8\xae\xea\x9c\xb9\xbd\x96\xa3\xa2\x93\xa7\x6c\xaa\xaa\x56\x4e\xe8\xcc\x0e\xf7\xd7\x91\x53\x7d\x11\x3f\x6b\xaa\xa9\x7a\x9b\x94\x4f\x91\xa9\xfe\x54\xef\xd1\x59\xf5\xcd\xc7\x34\xc7\x64\x64\x60\x56\xb3\x9b\x4e\x76\x75\xab\xc0\xe7\x07\x28\xe4\x85\x38\x12\x88\x90\xdd\xb4\xab\x4f\x37\xad\xc1\x47\x5d\xaf\x84\xf2\xb9\x45\x7e\x9e\x47\x6b\xeb\xed\x4d\xa4\xe2\xee\xf2\x01\xf0\xad\x23\xf4\x20\x1a\xde\xe7\xcd\x61\x90\x56\xf7\x21\xa9\x5a\x1e\x08\x18\xd0\xf0\xce\xba\x0f\x71\x19\x62\xc7\x02\x11\x17\x59\xc0\x13\x79\xe2\xaf\x1f\x1e\x14\x7f\x0d\x2f\xe0\x64\x3e\x2f\xd6\x9b\x24\x87\xa2\x26\x7f\xb6\xc5\x0c\x37\xc4\x1b\x99\x92\xc5\xee\xd5\xfb\x55\x79\x45\x57\xb9\xe6\xea\xeb\x8b\xf3\xb6\xbd\xc0\x8a\xf4\x7e\xa1\x0a\xaf\x77\x04\xc9\x26\x4a\xc7\x4a\x2c\x2a\x14\xfb\xf6\x8b\x5c\x5c\x61\x0b\x0d\x5c\xb2\xdf\x29\xa3\xf8\x93\x77\xf4\xef\x73\x64\x3c\xa7\x03\x99\x96\xb3\x6c\x27\xdd\x1a\x1e\x9e\x34\x77\xf2\xc5\x56\x50\xbd\x75\x4e\xfb\x41\xd5\xf4\x03\x87\x45\x1d\x6a\x8f\x4d\xb0\x1a\x19\xde\xe6\x7d\x97\xcc\x9f\xdd\xa3\x07\x8a\xf5\xaf\xbc\xa7\x3c\x38\x14\xc5\x92\xde\x24\xe6\x84\x4f\x2c\xaf\xf7\xb3\x9d\x59\xa4\x7c\x86\x48\x65\xf6\x5c\xdf\x19\x7b\xa3\xd8\x6e\xaa\xc8\x97\x69\x8f\xd4\x9d\x9e\x65\xc5\x8d\x44\x9d\x57\x69\x0d\x12\xe5\xb8\xba\x5a\x8a\x89\x14\x55\x8f\xe9\xfc\x26\xcd\x39\xdb\x20\x6e\xd9\x19\x50\xb7\xeb\xb9\x55\x78\x5f\xe8\x4f\x58\x21\x6d\xda\x67\x0d\x5b\xd3\x7d\x63\xa1\xd6\x85\xfa\xef\xad\x2e\x53\x5d\x51\xa1\xef\xde\xc8\xe9\x03\x78\x67\xa5\xd4\x22\x56\xfb\x80\xa8\x5f\x74\x4e\xbe\xa2\x73\xf2\x21\x74\xab\x3b\x38\xcd\x6e\x3c\xba\xa5\x4f\x92\xe1\xff\x59\x47\x23\x2b\x1f\xe9\x2c\xcd\x35\xa0\xae\xad\xe9\x2d\x40\x12\x30\x5f\xac\xee\x94\x88\x06\x09\x33\xe5\x6b\x1c\xb2\x14\x73\xe6\xcf\xc8\x37\x59\x69\x82\x8a\xd8\xfc\x60\xaf\x72\xd7\x51\x70\x81\xab\x5c\x94\xce\x6c\x7e\xc2\x8c\xf9\x03\xe3\xc9\xdc\x58\xb1\x9a\x16\x18\x53\x60\xc9\x14\xd9\x82\x7d\xe6\x1a\x6c\xd5\x87\xde\x60\xce\x52\xc9\x42\x6a\x8f\x55\xeb\x00\xb7\x51\xee\x7e\xe6\xa1\xeb\x1f\xb9\x2f\xe2\xe7\xaa\xe7\x32\xa3\x53\x5d\xae\xab\x07\xa4\xbf\xbf\x8b\xee\x77\x8b\x6f\xf8\xd5\xc4\xbf\x1f\x97\xd4\x46\xda\x43\x17\x62\xc1\x83\x48\xb0\xc4\x33\x8f\x26\xb0\x08\xe4\x8b\xbd\x5e\x61\x53\xab\x36\x10\xa8\xfd\xc3\xb4\xc3\xfd\x8c\xe0\x23\xe4\x67\xb1\xce\x80\xa8\x58\x81\x88\x35\x62\x66\x57\xa4\x28\xc3\xd8\x00\x13\xb3\xb2\x71\x61\x3b\x99\x58\x58\x38\x3b\x78\xbe\x9c\xad\x1c\xc2\x6f\xae\x3c\xfe\x22\x7e\x61\x9e\x0f\x94\xc1\x15\x12\x04\x8f\x60\x8e\x69\xed\x55\xb1\x7a\x8f\x3b\x2b\xdf\x71\x76\xd8\x46\xd4\xe4\x0d\x3e\x33\x27\x4c\x59\xa3\x76\x01\x32\xb2\x34\x00\x91\x70\xc6\x58\x86\xb6\xc5\x16\xa1\xee\x7c\x58\xce\xd3\x72\xbe\x5d\x23\x8e\x31\x52\x4b\x28\xfa\x6f\x93\x4d\xc4\x07\x78\xec\x22\xbe\x44\xa3\x15\xf1\x5b\xf1\x31\xb0\x2a\x72\xa0\x6f\x60\xc0\xb9\x7f\x3c\xc1\x8a\x0c\x0f\xfb\xa6\xf0\x78\x20\xde\xbc\x3f\xcf\x24\xd5\x24\x99\x8e\xb9\x55\x30\x96\xcb\xd7\xb9\xc1\xcc\x90\x79\x57\xa6\x5e\x02\x94\x96\xa1\x0f\x87\x27\xa1\x0c\x36\x8f\xf1\x2d\x60\x88\x2e\x93\x6a\x65\x23\x0e\x1c\xbf\x9d\x07\xbc\xe2\xf5\x0a\x33\x4c\x79\xdd\xe4\x0b\x00\x89\x59\xf1\x36\x2b\xea\x49\x91\x11\x0a\x06\x06\xb8\x8f\xf0\x64\x89\x51\x27\xef\xd8\x93\x34\x9d\xb6\x14\xe9\x16\xa5\xa7\x46\xda\x90\x18\xb5\xf6\xd9\x1e\x51\x52\x62\x4d\x69\x5e\xe2\xff\xf0\x1a\xa1\xfb\x11\x7a\xbf\x4f\x28\xd4\x61\xd0\x9b\x42\xa1\x0e\x60\xfe\x99\x42\xa1\x2d\xa5\x88\x0f\xaa\x85\xfe\x1c\x9f\x7c\xa9\x2a\x68\x24\x1c\x77\xba\xe8\xe0\x96\xdb\xa7\x0a\x6a\x4d\x7b\x98\x82\x40\x18\xf4\x71\x50\x48\x7b\x2c\xdc\x27\x09\xea\x3c\xcf\x36\x3d\xcf\xa0\x0e\x3d\x72\x29\x9f\x7d\xaa\x9b\x7b\x64\x36\x31\x5c\xb8\x47\xa9\x1d\x65\xbe\x0b\x63\x19\xda\x3a\xd0\x2c\x5c\xb7\xcc\xb3\x0b\x39\x46\x86\x5d\x85\xa8\x2b\x5a\x5f\xde\x55\x4d\x8e\x15\x3c\xb5\xa5\x78\x4f\x9c\x74\x33\x12\xad\x66\x24\x47\xed\x30\x11\x2a\xe9\xda\x5c\xcc\xc9\xd3\xf8\x17\x81\x4f\x14\xeb\x0c\xeb\xbc\xfe\xe4\x91\xb7\x97\xea\x1d\x90\xaf\x2f\x11\x90\x03\x0c\xf5\x91\x9a\x75\x45\x8c\xc4\x3d\x0b\x21\xf5\xa1\x3f\x8e\x65\x7f\xe6\x86\xed\x9a\x0f\x39\xa7\xa1\xf1\xc5\xe4\x21\x7b\xd4\x8d\xa7\x3c\x00\xa0\xd8\xd1\x3a\xd0\x16\xff\x85\x1b\x6a\x3f\x35\x0e\xde\x76\xc0\x5b\x8e\xec\x42\xa4\xbd\x78\xac\xce\x09\x79\x84\x54\x01\xef\xe9\x5a\x8f\xb9\x80\xe5\xdc\x56\x9f\x7c\x73\x3d\xd1\xdf\xab\x26\xda\xda\xe2\xaf\x2c\x29\x7a\x71\x3d\x46\xb5\x9e\x37\x7d\x7c\xfe\x70\xe4\xfa\xf6\xb6\x77\xde\xb7\x82\x31\xd4\x13\xd9\x52\xd3\x24\xab\x7e\x79\x7e\x5f\xc3\xdf\xf6\xfb\xd3\x09\xea\x9f\xc0\x63\x48\x82\x14\x24\x7b\xfa\x93\xb3\xf1\xe0\x8a\xe5\x52\x3c\xf5\xd2\xb1\x1a\x5d\xf5\xc7\x34\x44\x93\xde\xe0\x1c\xbe\xdf\x9b\xb2\xc2\x8c\x69\xdb\xe4\x7a\x30\x65\x99\x98\x57\xfd\xc1\xf0\xb5\xfa\x30\xba\x1e\x83\x52\xe9\x68\xc8\x5a\x34\x3c\xfd\x58\x8b\x04\x0d\x9e\xc0\xdb\xb9\xaf\x91\xed\xdf\x48\xe8\xc1\x46\xd8\x27\x14\x07\xb5\x6a\x43\x3f\x4d\x50\x44\x66\x02\x05\x52\xa6\x6b\xa8\x2b\x34\xed\x0d\xcf\x7b\xe3\x73\x14\x1e\x92\xcd\x04\xf1\x9a\x7d\xbd\xfc\x1d\xb2\xae\xad\x0b\xa4\xa1\xed\xda\xfc\xd4\xa3\xc4\x5d\xcd\x3b\x59\xe0\xd5\x0e\xde\xb7\xd4\x75\xe5\x2d\xc8\x85\x68\x7e\xe5\xd9\x68\xac\xde\x0f\x48\x20\x68\x72\x7d\x75\x35\x1a\x4f\xf1\xcf\xb6\x57\xa6\xc1\x83\x89\x93\xa5\x1a\xbd\xba\x1c\xbc\x46\xf5\x9c\xe9\x48\x0d\x26\x93\xeb\xbe\xba\xbe\x3a\xef\x4d\xfb\x34\xbe\xe2\xcb\x62\x7d\xbc\xe9\xc1\x26\xf8\xb7\xe1\xe8\xfd\x65\xff\xfc\x35\x0c\x76\x1f\x16\x09\x0a\xc3\x8e\xc6\xea\xdd\x60\x7c\x3d\x31\xa3\xe6\x3d\x23\x52\xaf\xae\xa7\xea\x7c\xd4\x9f\x40\x23\x69\x65\xb9\x5d\xd1\xd8\xc5\x4e\xad\xa8\x3f\x1e\x8f\xc6\x13\xfb\x68\xab\x95\xf4\xb5\x55\x6e\x5b\x17\xcc\x97\xc9\xdc\xfe\x1a\x1f\xab\x4b\x0b\x44\xc3\xcb\xd0\x46\x56\xff\x10\xd5\x30\xb9\x50\xa3\x70\xcf\xee\x53\x08\x6b\x8c\xc8\x0f\x99\xb0\x1f\x32\x61\xff\x67\xca\x84\x1d\xab\x37\xe9\xcd\x4a\x8d\xd3\xea\xa3\xea\xcd\xeb\xf4\x16\xea\xdc\xe2\xfd\x37\x89\x79\xd0\x45\xef\xfa\x72\x7a\x34\x1d\x5d\xf6\xe1\x30\xa3\x33\xd6\xfc\xe5\xbc\x3f\x19\xbc\x1e\x9a\x3b\xf2\x6d\x6f\x78\x7d\xd1\x3b\x9b\x5e\x8f\xcd\x7f\x19\xa3\x67\x38\xed\x0f\x8d\x55\x65\xe6\xe3\x1a\x0d\x0f\xbb\xef\xa0\xd5\x13\x35\x1a\x1e\x5d\x0e\x86\x7d\xdc\xa3\xa3\x4b\xd5\xff\xf7\xeb\xc1\xd5\x5b\x33\xe4\x83\xa1\x7a\xd3\xfb\x4b\x6f\x7c\x3e\xba\x9e\xa8\xfe\xf0\xdd\x60\x3c\x1a\x9a\x3f\x4c\xd4\xd8\x7c\x68\x0c\x33\xd8\x1b\x5c\x1e\x4d\x7a\x17\x7d\x79\x2d\x46\x38\x29\x3d\x3a\x9a\xfb\xce\x78\x30\x03\x3c\xbc\x3e\xbb\xec\xf7\xcc\xc2\x3f\x33\x8b\x05\xb6\x70\x6f\x30\x3e\x1b\xf7\x2e\xa6\x6a\xd8\x7b\xc7\x77\x05\x1a\x29\x6f\xaf\x87\x83\xb3\x1e\x4e\xe3\xe4\xc3\x64\xda\x7f\x8b\x1f\x57\xd3\x71\xef\xe2\x62\x70\xc6\xed\x8e\x14\x6e\x72\x75\x39\xb8\xe8\xdb\x8b\xe9\x6d\xef\xec\xcd\x60\x48\xc5\xcf\xef\xfb\xbd\x2b\xef\x31\x83\xa1\x7a\xff\x66\x70\xf6\x06\xda\x68\xf7\xe1\xbe\x2b\xfd\x0c\x2f\xf1\x7e\xef\x9c\x5e\x85\x13\x0b\xcb\x3c\x0a\x17\x39\xbc\x70\xd2\x7f\x67\x8c\xb9\xab\x37\x1f\x26\x83\x33\x5c\x4f\x62\x18\xed\x7a\x52\x87\x9d\x37\x83\xd7\x6f\xc8\xe6\x30\x96\x00\x8c\x4a\xa7\x2b\x2e\x43\x2a\x06\xe7\x13\x73\x82\x47\xd9\x85\x79\xec\xe5\x07\x7b\x25\xc0\x89\xd1\x34\x7a\x3d\x23\xf9\x62\x30\x1d\x9a\x3f\x9b\x25\xd1\xf6\x5a\x56\x3e\x3b\x6e\x13\x1c\x62\x1c\x8b\x90\x1b\xf2\x82\x8d\xff\x88\x0a\x43\xe8\x73\xdb\x12\xd3\x2c\xdb\xd9\xa2\x88\x8a\xa3\x8d\xa9\xae\x24\xa1\x8f\x1f\x1d\x0d\x83\x40\x18\xf1\xd9\x24\x65\x72\x53\x26\x9b\x95\xe9\x1b\x49\xb3\x11\x59\xe0\xbc\xc8\xff\x46\xe9\x08\x4a\x00\x63\x85\xbc\x28\xa0\x33\x0f\x14\x0e\xd2\xc8\x3a\x48\x29\xc2\xc5\xd8\xcf\xfc\x25\xa2\x77\xdb\x0b\x7e\xb4\x54\xe7\x34\x5c\xa2\xec\xf3\xd7\xc8\x82\x6e\x16\xee\xb1\x2c\x37\xb5\x25\x49\x96\xb6\x73\x47\x3e\xe5\xe4\x18\xf1\xa3\x61\x40\x05\x82\xcd\xf6\xb9\x88\x0b\x6f\x1b\x39\xe2\xd8\xe6\xe9\x14\xc1\x05\x0a\x88\x81\x77\xcd\xe8\xd0\x78\x9f\xf0\xd3\xde\x25\xf5\xa5\x7a\x4f\xad\xa1\xc2\x07\x60\xfe\x42\x68\x36\xe2\xe1\x35\xe3\xf3\x2d\x95\xa3\x4e\xe3\x63\x48\xd5\xb0\x2c\xac\xaf\xc3\xb7\x47\x97\xdd\x89\xce\x42\x50\xd3\x49\x5b\xa7\xeb\xb5\x5e\xa4\x49\xad\x31\xc4\x54\x7b\xba\xba\x2b\xed\x45\xa7\x2b\x5f\x69\x49\x84\x39\x5e\xc0\x1e\x5c\x06\x02\x7e\xb6\xc2\xac\x92\x30\x6c\x8c\xc6\x43\x6c\x07\xb9\xbf\x40\xbf\xa4\xf4\x37\x1f\x08\x22\xed\x58\x2b\x4e\x54\x0b\x46\xea\x19\x67\x5d\x5f\x40\xa8\x63\x53\x42\x7b\x31\x04\x61\xf5\x09\xed\xa6\xb4\x2c\x23\x45\xa5\xed\x63\x5c\x8e\x04\x21\x0e\x62\x0c\xcc\x02\xe6\x80\x07\x30\x4d\xed\x29\xf6\xb4\xb4\x40\xa7\xf1\x89\xea\xb1\x6e\xb8\x9c\x18\x75\xbd\x29\x72\xf5\xaa\x34\x07\x5c\xcb\x24\xb5\x20\xef\xf6\x4e\x92\xaf\x4b\x9e\x62\x60\x71\x09\x80\xb8\x82\x86\x2a\x5c\xb2\xb4\xf2\x90\x0f\x9d\x3e\xb8\x65\x76\xce\x19\x34\x8a\x53\xfd\xf5\x2a\x35\xa7\xef\xe1\xd3\xe3\xae\x95\x79\x9f\xe9\x79\x81\x2c\x2d\x58\xd9\x8a\x8b\x61\x46\x9d\xe9\x81\x42\xf1\x2c\x28\xa9\x6b\x89\x36\x5a\xcc\x1b\x26\x4b\x85\x3e\xb2\x2f\x73\xcc\xf5\x00\x3c\x74\x8d\xd0\xfc\x95\xab\x63\x47\x18\x1a\x1e\x8f\x69\x49\x4c\x6b\x91\x87\x2f\x4f\x73\x12\x21\x57\x33\xbd\x2b\x68\xb0\xef\x79\x7e\xe4\x37\x47\xcc\xed\x69\x73\x46\x7b\xa0\x2a\x4e\x4f\xb9\x42\x90\xdf\x40\x94\xbc\xd9\x2c\x37\x29\x73\x7b\x02\xf6\x58\x90\x66\xbe\x0f\x24\xc9\xfb\x85\xc9\xa5\x0c\xb5\x9e\x67\x49\x99\xd4\x45\xb9\x53\x7f\xdb\x2e\x6e\x50\x52\x1f\x57\x72\xd7\x1e\xdf\x5e\x62\xd3\xcb\x9d\x1d\xee\x49\x4e\xda\xaf\x02\x74\x12\xc5\xd9\x33\x5a\x21\x49\xce\xf9\x3a\xb8\x94\x89\xe2\xac\x2e\xec\xba\xaa\x80\x39\x6f\x53\x00\x27\x62\xa7\x1b\x88\xa6\xb7\x14\x36\x7e\x91\x42\xfd\x9e\xd3\x8c\x0b\xe8\x5d\x0b\x54\xbb\xbe\xff\x53\xf3\xba\x67\x8d\xf3\x1b\x67\xdb\xed\xaf\x4d\x59\x30\xbe\x37\xdb\xa9\xad\x99\xe5\x2a\xfd\x64\xf6\xc4\x0b\xde\x13\x04\xca\x80\x63\x4b\xbc\x16\xd1\x18\x14\x7e\xbd\x02\xfd\xff\x4e\x57\x6d\x73\x28\x68\xb0\xfb\x2b\xa9\x95\xf7\x11\xac\x73\x4d\x5d\x52\x19\x30\xd4\x65\x0a\xab\x02\x70\xdc\x85\xda\x24\x3b\xf9\xa2\x44\xad\xb7\x35\x22\x1a\xe0\x1b\x70\xc6\x0a\x8c\x0b\x95\x55\x39\x36\xe8\x0d\x00\x09\x4a\x2e\xfc\xda\x4b\x89\x09\x25\x1d\xcd\x01\x75\x64\xa5\xa6\x17\x8b\x32\xb9\xe3\x70\xbb\x5d\xcb\xb8\x50\xef\x02\x71\xd5\x16\x4c\x09\x2d\xb3\xe0\x0d\xb0\x4f\x68\x88\xa0\xe8\xc0\x1f\xa2\x44\x2a\x80\x72\xef\xcc\x7a\x60\x71\x78\x30\x2d\x68\xcf\x30\x2f\x97\x3f\x46\x0b\x9c\x4a\x31\xb6\x64\x54\x71\xa1\x1a\x55\xfa\x34\xfa\x44\x89\x0e\xee\x39\xea\xe6\xb7\x2c\x42\xbb\xb1\xf6\xad\x3e\x28\x6d\x0f\x8e\x6f\x71\xac\xd7\xc4\x59\xb0\x49\x5d\xfe\xa0\x39\x14\xe2\x38\x7a\xaa\xc6\x6e\x50\xde\xb1\x64\xfe\x34\xcc\xd1\x82\xc9\x04\xc7\xcc\xbd\x67\x0c\x4f\x8c\x5c\x66\x5f\x6f\x1b\x4b\x3a\x68\x3b\xac\x94\xbd\x5d\xa8\x43\x66\x97\x9e\xed\x94\x20\x3d\xaf\x74\x5d\x23\x32\xa7\x2b\xe4\xf1\x21\x67\x8b\x4a\x01\x38\x48\x6d\x7d\x72\xb3\x48\x07\x08\x02\xf7\xed\x70\xdd\xf2\x70\xb5\x16\xa5\x9a\x1d\x60\x46\x5e\x8c\xc5\x9e\xd9\xb4\xd6\x5b\x9d\x7c\xd4\x39\x89\x3c\xcc\xe7\xc5\x16\x99\x01\x16\x1a\x27\xd8\x16\xa5\xac\xe1\x2f\x45\xe9\x1a\x80\x63\x84\xab\xb8\x28\xc3\x3a\xf8\x93\xd3\xf8\x99\x1a\x16\x6a\xac\xeb\xb2\x48\xb0\xe8\xa0\x8f\xb7\x99\x99\x6b\x69\xf9\x0d\x42\x83\x4d\xdc\x55\x2d\xb5\x41\xa6\xdd\xac\x36\xee\xf4\x13\x1c\xa8\x45\xdc\x39\xf2\x6a\xb7\xc6\xb4\x31\xae\x11\xea\x51\xe9\x2c\xd3\x25\x57\xd1\x02\x18\x1b\x12\xce\xb7\x49\x96\x2e\xc4\x2d\x4f\xc0\x14\xc2\x92\x88\x07\x09\x5b\xc7\x4d\xb3\x68\xbd\x6f\x1e\x88\xbf\xb0\x7a\xea\xb1\x2f\xba\x6d\x07\x0f\x28\xb4\xf6\xa9\x7d\x4b\xc7\xc5\xab\x9e\xf9\x21\xb2\xfe\x5d\x44\xd6\xdb\x4b\x6f\x1e\xab\xb4\x8e\xd3\x7b\xaa\xc6\x12\xac\x09\x36\x58\x49\xb1\x31\xcf\xa3\x4f\x49\x30\xd9\xd7\x56\x26\xc6\x43\x24\x20\x04\xf6\xe6\xf9\x2e\x82\x0b\xc1\x02\x19\xff\x56\xa4\x80\x37\xc8\xd1\xb0\xf4\xc8\x52\x90\x7d\x67\x49\x09\x5c\x66\x5c\x05\xcb\x8e\x42\x1d\xe6\xe3\xeb\x02\xb3\xd3\x91\x60\x09\x6b\xe2\xcd\x9c\x17\x62\xdb\x2a\x8a\x2d\x0a\x07\x00\x4f\x4a\x41\x98\x69\xe9\x31\xc0\x06\x06\x46\x94\x39\x0b\x37\x6c\x36\x3a\x29\x11\x47\xe4\xf1\x2a\xb8\xd1\x7b\xaa\x06\x82\xca\xfa\xdc\x69\x03\xec\xa7\x0f\x81\xc6\xa5\xeb\x4d\x92\x96\x92\x4c\xcf\xc2\x27\x68\x72\x23\x97\x89\x27\xc9\x01\xa8\xac\x66\x72\xcf\x08\xb8\x4c\x34\xda\x15\x92\xee\x40\xcf\x57\x79\x91\x15\x37\x3b\x74\xe6\x00\x1e\x45\xdb\x8e\xaa\xb7\x11\x74\x93\xac\xb5\x44\x4d\x59\xbe\x2f\x95\x54\x7e\x6f\x61\x03\xe9\x5a\x13\xb7\x69\x5b\xc1\x2c\xaa\x29\x53\x23\x1d\xc5\x53\x5b\x03\xc5\xd8\x3d\x83\xfd\x63\xc6\x6d\x5a\x90\x5f\x67\x06\x4d\xbd\x4f\xd2\x5b\x5d\xc6\xea\x22\x49\xb3\x2d\x56\x61\xef\xb3\xb8\x81\x76\x08\x5c\xd4\x07\xe4\xfc\xe5\xea\xa5\x28\x41\xa2\xee\xe0\x45\xc0\x83\x8a\x46\x1d\x3d\x6b\x6d\xfd\xf5\xa4\xf6\x97\xab\x7d\x81\xe8\xc6\x73\x35\xd1\xb7\xba\xb4\xe9\x9f\xa9\xcf\x03\x40\x0b\x90\xf9\xfc\xd7\x1b\x2c\xbf\xb3\x0c\x9b\xa0\x43\x57\x3a\x75\x26\xa2\xfa\x5a\x43\x75\x9b\x22\xd6\x23\x63\x84\xdc\xdf\xc1\xd4\xb8\xa8\xd9\x82\x83\x62\xb9\xf5\xdc\x33\xe0\x0f\x63\x09\xf5\xca\x5d\x06\x50\xa6\x62\xd6\x03\xb0\x8c\x34\x28\x9f\xbc\x52\x2a\x06\x9d\x88\xa7\x8a\x11\x78\xa1\x06\xb9\xe0\x38\x39\x43\x07\xfa\x1c\x21\x0e\x93\x3a\xa9\xa9\xe2\x71\x6c\x55\xdd\x45\xed\x05\x54\xb0\xbb\x00\x25\x11\x78\x48\x27\xdc\x11\x9b\xee\x09\x1f\x85\x26\x73\x55\xe0\xda\x06\x41\xb2\x7d\xc8\x6c\x82\x53\x56\xd8\xbc\xc8\x78\x82\xc4\x67\x5b\x02\xe5\x89\xa7\x42\x2f\x8a\x38\xe6\x49\x4e\x88\x18\x8f\x33\x36\x60\x1c\xa9\xc2\xb0\xc6\xd3\xf8\x67\xd5\xff\xb4\x29\x4a\x30\x0f\x21\x70\x23\x8a\x7d\x31\x4a\xc7\x11\x1d\x2e\x2f\x13\x5d\x62\xcd\x10\x12\x65\x11\xe2\x03\x70\x5a\x40\xfc\x56\xc3\xe3\xe1\x9f\xd0\x78\xfb\xdf\x7b\x46\x80\x56\x36\x58\x0d\x18\x1b\x92\x25\x70\x66\x77\xb9\xb3\x64\xb6\x53\xd7\x39\xc4\x1a\xcd\x7c\x52\xf8\x91\x50\xbc\x5e\x8c\x8a\x2d\x1a\x1e\xb9\x0a\x98\xf4\x82\xe6\xcf\x76\xa2\x07\x48\x8e\xb0\xb7\x99\x91\xad\x45\x87\x3d\x43\xd5\x0f\xb3\x66\x69\x7a\xa8\xf9\x0d\xbc\xf5\x0f\xb4\xcd\xcd\xce\x2f\xaa\x57\xce\xd2\x9a\xe5\x06\x3c\x28\xd1\xff\x40\x24\x51\xb0\xb5\xed\x2e\x92\x54\x26\x67\x45\x56\x94\xc9\xa2\xe0\x70\x1d\x07\x59\x0e\x09\x0b\xed\xef\x31\xbf\x79\x4e\xaf\x9d\xca\x3f\x2a\x37\x4a\x5d\x28\x14\x24\x63\x32\xc5\x2a\x3c\x80\x6a\x1e\x15\xcb\x23\xff\x5d\x71\xc8\xfa\xe4\x33\xbf\x10\x14\xca\xab\x47\x6b\xa7\xb7\xaa\xb6\x33\x02\x6d\x9b\x01\x27\x45\xc1\xc4\x8d\x92\x00\x19\x96\x5b\xd4\xac\xd4\xa8\x70\x49\x15\x28\xb4\xf7\x7a\x6b\x5d\xa6\xf3\x24\x97\x23\xac\x7a\xee\xaa\xc7\x06\x93\xe4\xa0\x6c\x6e\x6f\x91\xac\x2b\x75\x66\xec\xfd\x5d\xe4\x86\xf6\x7a\xd2\x03\x15\x1c\xac\x17\xb8\xd5\x18\x5a\x5c\x50\xa5\x22\xfa\x41\xe2\x4d\x9b\xb2\x98\x6b\x0d\x8d\xff\x9b\x9c\xd5\xa4\xe2\x7d\x27\x4b\x69\x42\x82\x7e\x74\xb0\x98\x5f\x99\x07\xaf\x0d\xcb\xfb\xa7\xed\x82\x3c\x27\xf0\x92\x21\xdc\x72\x97\x94\x0b\x8c\x08\xa4\xb9\xd7\x28\x7a\xb3\xce\x6b\x8d\x22\x99\x0b\x3e\x5b\x17\x5c\xc7\x38\x2f\xb6\xc8\x29\x48\xf7\x6f\x5e\x7b\xed\x47\xdb\x9b\x9f\x69\xa3\xe0\xf8\x4a\x86\x95\xff\x54\x01\xb0\x9c\x72\x21\x15\xb1\x59\x89\x76\xd0\x7a\x14\x93\x46\x7c\x0a\x04\xde\xa3\xa0\x0a\xe6\x93\x96\x29\x48\x2b\x84\xb4\x7f\x78\xff\x42\x0a\x47\x3c\x19\x1b\x02\x2e\xa8\xfe\xe8\x24\xe8\xc8\x06\x61\xfe\x69\x9c\x2d\xf8\x28\x12\xa4\xa4\xb7\x69\xf6\x50\xd7\xa3\xd6\x36\xbb\x85\x0b\x04\x5a\x19\xae\x5b\xe1\xb0\xee\x1d\x14\x1a\xca\x26\xdb\x27\x1d\x79\x43\x82\x2d\x9e\x15\xb9\xb1\x62\xe1\x03\x39\xda\x21\x89\x31\xae\x58\xc1\x62\x90\x93\x06\x3c\x94\x7f\x4c\x12\xac\xb0\x7c\x5d\x14\x8b\xca\x2c\x58\xb7\x25\x71\x2b\xb3\xee\xa0\x57\xef\xe0\x3e\x04\xd6\x49\xc0\x4b\x98\x98\x71\xd8\xa9\xba\x04\xa7\x2a\xa7\x9c\x99\x8b\xb6\x38\x5b\xa2\xf5\xb8\x0f\xe4\xdc\x72\x24\x1d\xf7\x6e\x3a\xb2\x14\xf9\x00\xb2\x8c\x0d\x59\x92\xdf\x6c\x13\xac\xc4\x4e\x1c\xc5\xbc\x1d\x73\xe1\x12\x50\x14\x04\xd2\x62\x25\x92\x8d\xe0\xc7\x00\x49\x0b\x50\xdb\x50\x66\xc9\x9d\xc3\xbf\xaa\x3e\xca\x7e\xf6\xd8\x42\x0a\x8e\x5d\x97\xd9\xe1\x14\x05\x7c\xdc\x19\x54\xec\x38\xc8\xc0\x54\x78\x9d\xde\x63\x69\x59\x74\xe8\xc1\xb4\x59\x01\x0a\x34\xaf\x04\xf9\x07\xe7\xe0\x9b\xd4\xd3\x36\x59\xe5\x21\x1d\x58\x17\x2f\x0f\xae\x31\x12\xaa\x3f\x99\xb5\x9a\xd6\x50\xb6\x47\xa5\xd6\x82\xc3\x6d\x11\xb0\x30\x12\x5a\xbd\xad\xe4\x81\x0a\xb1\x9c\x51\x05\x1d\x01\x86\x3e\x9f\x76\xfc\x1e\x7d\xe5\xce\xf8\xea\xb2\xd3\x55\x9e\xdc\x33\x14\x9d\x84\x60\x73\xd0\x1d\x61\x51\xe3\x99\x45\xaf\x8a\xf4\x11\x33\xb8\x00\x59\x4b\x49\x2a\xf2\xdc\x2a\x33\xd6\x78\x1e\x09\x15\xd1\x80\xde\x08\xe9\xa9\xe8\xb6\x85\xb4\xb0\x6f\x15\xd4\xf7\x32\xa8\x13\x98\x16\xf2\x31\x2e\x44\xd7\x24\x88\xb1\xca\xb3\x96\xa2\x10\x2d\xb7\x8c\x73\xa1\x0c\x9c\x85\x4c\xe8\xef\x00\xce\x22\xc2\x85\xc1\x79\xfd\x71\xff\xd5\x07\x89\xe1\xbc\xbc\x44\xd4\x87\x83\xa5\x0a\xac\x6d\x2b\x5e\x4a\xc0\x3e\x07\x08\xb7\x72\x10\x5a\x80\x11\x45\x1e\x58\xa1\x0d\x49\x1b\xa9\x7f\xbf\x1e\xf4\xa7\xaa\x3f\xfc\xd3\xe8\xc3\xdb\xfe\x10\x11\x69\x02\x5b\xdb\x37\xbf\x8c\xd5\x44\x6b\x3b\x54\x4b\x91\x90\x74\x67\x09\x5a\x4e\x42\xc7\xc3\x26\xb5\xe9\xc4\xf5\xc6\x3b\x3e\xb0\x00\x6c\xd8\x9b\x0f\x55\x00\x12\x27\xf3\x1d\x5a\x25\x38\x4f\x51\xeb\xe6\x6d\xad\xe9\x4c\xbc\xf8\x94\xa5\x7a\x8e\x9f\xa9\xc3\x45\xf7\xe5\xc1\x1f\xad\xc1\xfe\x47\xfe\xc4\x4f\xfe\x72\x75\x79\x74\x1a\x1f\xff\x61\xfa\xff\xc7\xcf\x9e\x9e\x34\xf4\xff\x5f\xfc\xfc\xec\x87\xfe\xff\xf7\xf8\xf9\x4b\xb1\xd1\x8d\x5b\xe0\x2f\x57\x97\xee\x0e\x38\x8d\x8f\x0f\xe0\xda\xae\x44\x4c\x58\x88\xfe\xcf\xbb\x0a\x1e\x72\xe6\x34\xde\xd4\x61\xbd\xee\x36\xd0\x27\x98\x1c\xb7\x1c\x1a\x24\xfd\x8f\x26\x01\x87\xdc\x6d\x7d\xd6\x5c\x97\x35\x16\x03\x25\x9e\xc2\x7e\xac\x06\x35\x7c\x0a\x0a\xa8\xe0\xa3\x0b\x5d\xa5\x37\x39\x94\x1d\x25\x95\x7a\x7d\x75\x09\x37\x45\x52\xc3\x11\x40\x57\xd3\x85\xf1\x44\xec\xad\x7c\x51\x6c\xf3\x05\xb5\xf4\x62\x72\xd1\x8d\x0f\xc6\xda\x63\xe6\x49\x30\x15\x00\xd4\x05\x78\x3f\x99\xdf\x90\x4c\xb5\xb9\x97\xaa\x88\xe2\xb3\xa5\xa5\x48\x92\x75\x31\x48\xc3\xec\x4a\x65\xed\xdd\x62\x8d\x30\xcb\xac\x2e\x2f\x2e\x48\x3a\xea\xfa\x25\x8a\x2f\x2b\xbf\x51\x95\x68\x0d\xdc\x96\x94\xd6\x07\x3e\x42\x48\xa7\xcc\x8a\x5b\xdd\x20\x7f\x8a\xf0\xd6\xcd\xd2\x8a\xcc\xf0\xdc\x32\x81\x31\xd6\xc2\xb5\xc5\x61\x9f\x48\xf2\xa7\xad\x0d\x62\x18\xb8\x0d\x14\x28\xfc\xfa\xcd\x60\xe0\x4d\xc0\x0d\x22\xb8\xc7\x8d\xd1\xa7\x8d\x11\x2d\x6e\x70\x6b\x1e\x34\x08\x7d\x9e\xa2\x83\x00\xb5\x5c\xed\xab\x96\xf9\x21\x2c\x20\x0d\x1c\xa3\x45\x51\x62\x16\x6e\x53\x16\xeb\x02\xf3\xe2\x18\x8e\x0d\x38\xf6\xe5\x3e\xe1\x95\x81\x69\x9c\x16\x0a\x2d\xf8\x4e\xd8\x0c\x52\x36\x80\x76\xda\x48\xb2\x17\x93\x92\xef\xc0\xc8\x29\x55\x1f\x72\x65\x32\xeb\xef\x59\xca\xe4\x1b\xe3\x7f\xec\x8a\xad\x5f\xdd\xb7\x05\xdc\x4f\x79\x9b\xce\x89\x7f\xfb\xb0\x5a\x83\x68\xd4\xd4\x51\x72\xc3\x98\x14\xcb\x66\x2b\xcd\x9d\x4d\x96\xd6\x1a\x85\xb5\x50\xaf\x14\x7c\xbf\x4a\x6f\x92\x32\xf1\x82\xa3\x87\x95\xd6\x6a\x55\xd7\x9b\x97\x4f\x9e\xdc\xdd\xdd\xc5\x7f\x2f\x36\x3a\x9e\x17\xeb\x27\x6f\xcd\x7b\xba\xc4\x06\xcf\xd1\x51\x90\x62\xc3\xfd\x40\x45\x81\x91\x63\xef\x70\x92\x5a\xb6\x62\x10\x3f\x0f\x72\x5b\x65\xb9\x13\x8c\x75\xcc\x78\x56\xd5\x14\x22\x31\x1b\xd0\x3c\x09\x89\x3a\x68\xe5\xe1\xdb\x18\x00\x48\x54\x1e\x60\xec\x23\x9d\xc7\x81\xc3\x1a\x1e\xf8\xc5\x1a\xb2\xf6\xea\xd5\x07\xf5\x97\xd1\x55\x5f\x9d\x8d\xc6\x57\x23\x02\xec\xfe\xd7\x7f\x81\xf9\xf8\xd3\x4f\x88\x44\x77\xf8\x52\xac\xd0\x69\x16\x23\x79\x15\x56\xaf\xae\xa7\x80\x51\x06\xb3\xaf\x7f\xae\xa6\xa3\x08\xd0\xb5\x2d\x35\x4c\x4d\xf3\x0f\xde\xf8\x90\x05\x18\xd4\x3e\xc5\x6a\x30\x54\xc3\x11\x40\xe1\xa7\x84\x51\x6f\xf4\xc9\xb4\x7b\x3a\xf1\xf1\xb4\xae\x88\xe0\xc2\x16\x28\x60\xd1\x80\x2b\x1f\x90\x55\x03\xb6\x94\xa0\xff\xe7\xfe\xdb\xab\xcb\x1e\x41\x7e\xdb\x2b\x09\x0e\x1f\x18\x92\xab\xf1\xe8\xec\x7a\x0c\xb6\x2a\xa2\xf0\x5f\x51\x59\x09\xd4\x0f\x4c\x10\x4b\x3c\x7e\x37\x38\xeb\x4f\x7e\xb3\xa5\x05\xa0\xf7\x74\xde\x9b\xf6\xe0\xc5\x57\xe3\xd1\xc5\x60\x3a\xf9\xcd\xfc\xfb\xd5\xf5\x64\x00\x83\x36\x18\x4e\xfb\xe3\xf1\x35\x54\x3b\x75\xd5\x9b\xd1\xfb\xfe\xbb\xfe\x58\x9d\xf5\xae\xcd\xec\x99\xd1\x1d\x61\xc1\x11\x16\x7f\x78\xf8\x7e\x57\x09\x32\x18\x8a\x7a\x8f\xc9\x74\x3c\x00\x90\xb5\xfd\xd8\xe8\xbe\x5a\x11\xaf\x3e\xa4\xab\x7a\xe3\xc1\xc4\x7c\x80\xea\x9c\xde\xf7\x3e\x28\xe3\x14\x10\xe4\x9a\x6a\x63\x82\x5a\x1e\x2e\x6a\xe8\x9d\xbf\x1b\x4c\x1e\x53\xb8\x40\x37\xb2\xe0\xc5\x81\xcc\x68\x45\xc7\xb6\xb8\x0b\x18\x1f\xd3\x38\x48\xa1\xc2\xd5\x6c\x1f\xa7\xfd\x57\xf9\x7c\x13\xcd\xe3\x64\xc2\x2e\x85\x60\x0d\xc1\x13\xc0\xdc\x19\x8e\xed\xd2\xa3\x8c\x9a\x97\x7a\x91\xd6\xe8\x53\xc6\xff\xd2\x76\xfc\x97\xfe\xc4\x4f\xa6\x67\x57\x47\x77\xa5\x71\xa3\xca\xea\xdb\x38\x01\x0f\xd8\xff\x27\xa7\xc7\xcf\x03\xfb\xff\xe9\xe9\xc9\xf3\x1f\xf6\xff\xf7\xf8\x71\x86\xfc\xc9\xaf\xbf\x3e\x37\xbb\xf9\x7d\xaa\xeb\x4a\xab\x77\x3a\xd7\xeb\x64\x8f\xcd\x3e\x29\xd6\x5a\x0a\x7b\xe2\x05\x4a\x91\x70\xa1\x5c\xce\xca\xa7\x2c\xbb\x12\xa3\x27\xc1\x26\x9b\xba\x33\xc6\x3d\xf1\x19\x66\x3b\x6b\x22\x61\x3c\x67\xbd\x49\x09\xed\xef\x35\x49\x25\xb5\xea\xa7\xf9\x62\x55\xdc\xea\x5c\x5d\xe7\x29\x44\xa4\x10\xd2\x3c\xb5\x69\xae\x08\xec\xa7\x21\x00\x03\xb2\x24\x5f\x80\x6c\xac\xe9\xe3\x71\x64\xfe\xf7\x04\xfe\xf7\x14\xfe\xf7\x29\xfc\xef\x33\x44\xa8\xff\xfa\xeb\xf3\xef\xee\x0d\xa4\x15\x87\x3e\x43\xab\x19\x90\x35\xcc\x80\x85\xb6\x15\x60\x7f\x40\xd5\x74\x93\x6a\x1e\x50\xe9\x9a\xd9\xa7\x77\x92\x4a\xa5\x15\xa2\x68\xb8\x59\x20\x8e\x8a\x71\x69\x04\xdc\x93\x6e\x8c\x28\x47\x88\x1e\xa2\xea\x07\xcc\x59\xe3\x6b\x66\xf8\xd7\xba\x34\x06\x53\xcd\xc5\x04\x00\xb1\x4e\x6b\x10\xfb\xb6\xb6\xa9\xa3\xd9\x20\x33\xf5\xc7\xc1\xfd\x07\xfe\xc4\x4f\xce\xb6\x33\xfd\x0d\x83\x3f\x0f\x9f\xff\xa7\xc7\xcf\x5e\x34\xe2\x3f\x27\xc7\x3f\xce\xff\xef\xf1\x63\x66\x5f\xdd\x18\x77\x98\x28\x02\x45\x84\x21\x52\xa7\xc7\x6a\xa1\xe7\xea\xf4\xf8\xf8\x29\xeb\x60\xc4\x07\x22\xf6\x73\xd6\x35\x7f\x3b\x39\x82\x0f\xbc\x2f\x00\x9b\x77\x9b\xe4\x6a\x54\x94\xf5\x5a\x97\x55\xa5\xf3\xfb\x4e\xa8\x9f\x92\xea\x28\xad\x7e\x8a\xda\x8e\xa7\x96\xc3\x69\x07\xb0\xce\xbc\x20\x54\x27\x56\x82\xac\xa0\x06\x64\x55\x94\x15\xd0\x3a\xe9\x6c\x21\x4a\xa4\xbc\x72\x2a\xaa\x8e\x73\xf4\xe3\xdb\xca\x09\xe7\x3a\x94\xc7\x95\xf3\xcf\x7d\xb1\xaa\x24\xdf\x15\xb9\x65\xeb\xf1\xdd\xf0\xc0\xf3\x96\x1a\xe5\x02\xbf\x28\xf2\x92\x1c\xf7\x20\x8e\x14\xe3\xbd\x23\xa2\x41\x78\xfa\xc6\xa3\x2f\xb5\xce\x76\x51\x98\xc1\x71\xa1\x92\x52\x20\x50\x38\x6e\x34\x15\xfc\xe2\x41\xf7\xbc\xf0\xc6\x3a\xad\x2c\xa8\x49\x2f\x7e\xf3\xe8\x31\x09\x97\x6c\xdd\xe5\xbb\xb2\xa8\x25\x73\x79\xe2\xd2\x2a\xe0\xb4\x9b\xcf\x34\x87\x05\x69\x56\x31\x54\x12\x61\xe5\x04\x13\x41\xaf\x11\xa5\x4c\xf9\x5f\xa4\xfe\x0a\xf8\xfb\x98\xab\x2b\xd9\x6c\x4a\x4d\xf2\xed\xb3\xad\x25\xdb\x61\xd6\x6e\x0e\x55\xf5\x32\xcc\xc0\xd3\x0a\xb6\x89\x2a\x56\x68\xd8\x64\x49\x9a\x67\x3b\x04\xb3\x2d\x18\x2a\x2a\xf8\x78\x5a\x87\x05\x80\xd8\x9a\x31\x2d\xcd\xce\xdb\xa8\x52\x6a\x2b\x21\x38\xf5\x05\xc8\x96\x75\x71\x8b\x37\x6d\x42\xcd\x83\xe5\x07\x0c\x4e\xd8\x4e\x3f\x46\x25\xe4\xd8\xe6\x19\xc4\x39\x6c\xae\xa5\x2e\x94\xd9\xad\x2f\x29\x3e\x34\x09\xbb\xe9\xde\xda\x29\x35\xa7\x0f\x3b\x96\xdf\xca\x89\x95\x65\x02\x6c\x05\xb6\xca\x4e\x66\x21\x9b\x71\xaa\x1f\x17\xf4\xff\xb9\x3f\xf1\x93\xb7\x83\xe9\xd1\x52\xaf\xfe\xb8\xfc\xcf\xe9\xc9\xc9\xcf\xc1\xfd\x7f\x7a\x72\x7a\xfa\xe3\xfe\xff\x1e\x3f\xfe\x6d\x27\xd5\xac\xf4\x22\x82\xeb\x87\x58\x8d\xcb\x1b\x54\x86\x85\x5b\x4e\x97\x55\x91\x0b\xb8\x5f\x20\xa2\x54\x49\xce\x5c\x46\x82\x37\xc4\x31\xd0\x69\xc4\x32\x31\x4e\xcd\x74\xba\x28\x3f\xab\x11\x14\x53\x87\xf2\xc7\xe6\xb8\x12\x57\x9e\xbc\x67\x9b\xae\x8a\x2c\x4d\x62\x29\x2c\xd3\x4e\x87\xf6\x5c\x6b\xe8\x16\x31\xe5\x45\x22\xcc\xde\xd0\xbe\x7a\x02\xf8\xa7\x2c\x23\xc7\x4b\x05\xe2\xcc\xf6\x3a\x47\x37\x8f\x86\xa8\x42\xb6\x79\xb2\x37\x64\x51\xc5\x72\x5b\xe6\x48\xce\x87\x6a\xbb\x55\x71\xcf\x25\xef\xb2\x25\x2f\x21\x5d\xde\x9e\x62\xa1\x00\x76\x5a\xc9\x14\x03\xfd\x49\x08\x5d\x3a\xb1\xcc\x64\x6f\x6f\x90\x7d\xbb\xae\x9a\x79\x97\xf0\x06\x77\xd0\xc9\x14\x44\x80\xf6\xa4\x6b\xdc\x92\xd8\x24\xf3\x8f\xae\xba\x1d\x8b\x70\xec\x0c\x27\x15\xe4\x5c\xe2\x83\x90\x67\xc8\xc6\xd8\x09\x8d\xf1\x20\x0e\xe3\x3e\xe6\xb2\x96\x18\x32\xc4\x44\x7f\x27\x98\x42\x21\xd3\xd4\xd0\x87\x4e\x34\xe3\xe9\xe6\x55\xc8\x55\xd4\x16\x36\x87\x40\x7c\x24\xe9\x69\x90\xba\xa6\x3d\xb2\xdc\x1b\x02\xf5\x04\x32\x83\xb8\x30\x33\x44\x94\x7d\x6e\x21\x8e\x1d\x5f\x8c\x47\x6f\x23\x0e\x1b\x8f\x38\x3c\x3d\x44\xf2\x2a\x24\xdd\xf2\x06\x7f\x34\x76\xc1\x65\x6e\xcb\x79\xbf\x77\x39\x18\xbe\xb6\xfc\x24\x96\x7d\xea\x87\xa1\xf0\xcf\xf6\x03\xf7\xff\xb7\x75\xff\x1f\xf6\xff\x5f\x9c\x86\xfe\xff\xd3\x17\x27\x3f\xee\xff\xef\xf1\xf3\x76\x30\x65\xdc\xc7\x81\x0f\xea\xf8\x5f\x3b\x9d\x94\xff\x5b\xfd\x2f\x77\xcd\xac\x8a\x6c\xa1\xcb\xea\x7f\x1f\xfc\x30\x1a\x7e\x18\x0d\x58\x23\x5e\x6d\x67\x55\x9d\xe4\x75\x9a\x64\x0d\xa5\x68\xc7\x07\xf2\xaf\x72\x9b\x43\x02\xfb\xea\xc3\x78\xf0\xfa\xcd\x54\xbd\x19\x5d\x9e\xf7\x7f\x5c\xf1\x3f\x7e\xfe\xa1\x7f\xe2\x27\xaf\x26\xe7\x47\x4f\x8f\xce\x20\xd8\x74\x34\x2c\x8e\x86\x5b\xe0\xa3\x3e\x62\x40\xff\xef\xb7\x0d\x1e\xb8\xff\x9f\x9e\x3e\x0d\xf1\x9f\x2f\x4e\x9f\xfe\xc8\xff\x7e\x97\x1f\x2f\xff\xfb\xec\xe8\xf4\xf8\xf8\x57\x35\xd9\xe6\xea\x6d\x3a\x2f\x8b\x6a\x57\xd5\x7a\x5d\x45\x6a\x90\xcf\x31\x13\x3c\xc6\x8b\x71\xcc\x99\xe0\x7f\x40\xe0\xe4\xff\x0c\x30\x8b\x50\x9b\xf4\xf5\x60\x93\x0f\xa3\x26\x1b\x0d\xf8\xea\x98\xc9\xef\x0a\x99\xfc\x9f\x6a\x48\xa5\x1a\x35\x23\x27\x8b\xe5\xbe\x35\x52\xb8\x4f\xf9\x80\xa1\xa2\xb4\xf8\x80\xaf\x84\xaa\x74\x75\x68\x7b\xe0\x95\xf7\xe6\xc6\xc1\xf0\x88\x3a\x2e\xf3\x64\x93\x4c\x0c\xfd\xfb\x98\xe6\x8b\x18\xea\x32\x5a\x18\x21\xcf\x46\xc3\xf3\x01\xb0\x6a\x02\x0b\xf4\xb8\x3f\xe9\x0f\xa7\x44\xb3\x69\x0c\x87\xf6\x2a\x0e\x60\xd3\x6d\xe1\x94\xfc\x7c\xe3\xa4\xa5\x4a\x23\x02\x28\x1f\x15\x96\x00\xb1\xea\x79\xff\x3c\x56\x93\xeb\xa1\x7a\x3b\x38\x1b\x8f\x04\x6d\xe7\x59\xac\x0e\x3b\x93\xeb\x61\xa7\x8b\x44\xa8\x53\x47\x4e\x3d\x11\xc4\xb4\x2d\x98\x3e\x32\x59\x26\xd7\x17\x17\xfd\x31\x42\x1e\x89\xe9\xb3\xaf\x7a\x13\xd5\x23\x72\x5a\xc4\xd7\x01\x5e\xef\xed\xe8\x7c\x70\xf1\xc1\xf4\xde\x23\x4f\x1d\xbe\x0e\x58\xaf\x09\x54\x78\xde\x1f\x0f\xde\xf5\xa6\x83\x77\xfd\x89\x6f\x6d\x01\x69\xb6\xe9\x0c\x7d\xd0\x35\xb8\xd9\xcc\xcb\xd1\x64\xaa\xc6\xe6\x7b\xd7\xfd\x88\xa0\x7d\xf0\x7a\x46\xfb\x01\xbf\x6e\x03\x9f\x68\x31\x89\x1e\x0a\x31\x0a\x28\x6d\xaf\xae\x87\x03\x60\x1b\xb7\x6c\xb6\x2d\xc0\xc0\x71\xff\x75\x6f\x7c\x7e\xd9\x9f\x4c\x18\x70\xd7\x8a\x11\x64\x8b\xad\x89\xe2\x03\xb3\x8d\x81\x9c\x53\x24\xbe\xde\x83\xec\x33\x83\xf2\xa6\x37\x41\x82\xe2\x47\xc3\xfc\x26\xf1\x01\x54\x2c\xce\x03\x1d\xdd\x3a\xdc\x33\x79\x51\x13\xc4\xde\x38\x77\xb6\x2c\x0d\x58\x8e\x88\xb8\x71\x49\xf5\x5d\x7c\xf2\xc0\xa7\x23\x2e\x24\x24\xa7\xab\xd8\x58\x29\x88\x12\x05\xc0\x75\xce\xb5\xa3\xa0\xed\x86\x76\x87\x5a\x26\x73\xa2\x74\xfc\xa3\xef\xc6\x7f\x85\x9f\xf8\xc9\x64\x30\x99\x5c\x1e\x9d\xc4\xa7\xdf\x2c\x0a\x74\xbf\xfd\xf7\xf4\xf8\xe9\xc9\x49\x33\xff\xf3\x23\xfe\xf3\x5d\x7e\x0e\xcc\xe9\x31\x18\x9e\x5f\x4f\xa6\x63\x27\xfd\x60\x8e\x99\xeb\xf1\x99\xa5\x71\x3e\x70\x05\xa1\xa7\x08\x32\x38\x56\xe7\xfd\x8b\xc1\x10\xef\x40\xae\xf9\x8d\x4f\xd4\x99\x43\x3b\x5c\x57\xc6\x28\x4b\xf2\x2a\x10\xd2\x97\x9c\x17\x42\xdb\x7a\xc4\xa9\x75\x54\x87\xb5\x62\x5b\xa1\x9c\xb7\xad\x30\x8e\x4f\x3d\x02\x19\x6e\x22\xbe\x92\x28\x5a\x66\x1e\xad\x65\xf0\x12\x57\x7a\xe2\x8b\xd8\x33\xae\x19\xeb\xa7\x1d\x5e\xad\x45\xd3\xfc\x24\x7e\xaa\xfa\x99\x9e\xd7\x65\x91\xa7\x73\x75\x2e\x3b\xfa\x56\xcf\x57\x49\x9e\x56\x6b\x6a\x52\xa2\xd6\xf6\x37\x37\x3a\xd7\x25\xd2\xf1\xcd\xe7\x7a\x23\xf0\xcd\xae\x58\xd5\x31\x10\x09\x6d\x52\x2e\x50\xd7\xee\xa5\x75\x99\xe4\xd5\x12\xd9\x6f\x16\x49\x9d\xb8\xb6\x3d\x53\x7d\x57\x4e\x8b\x8d\xf0\x47\x99\xea\xce\x91\xba\xc9\x09\x42\x49\x51\x55\xfb\xb0\xe7\x6a\x80\x2a\xaf\xcc\x8d\x64\x0c\x49\x3b\xd6\x02\x0c\x5a\x94\x58\xb6\xbf\x53\xe9\xc2\xfc\x83\xab\xb8\xb0\xae\x3e\x7c\x84\x0d\xd8\xb9\x42\x6b\x0a\x3f\x59\x55\xf6\xd9\x4e\xf5\x3f\x01\x5b\xae\xea\xb9\xf6\xbc\x50\x97\x49\x79\xa3\x4b\x50\x92\xb3\x43\x8c\x2c\xc8\x40\x59\x8d\xd3\xaf\xc3\x3e\x1b\x73\x93\x23\x55\x35\x96\x8a\xa3\xf5\x3b\xa7\x77\x7b\x2c\x20\x7b\xa9\x6a\x5c\x43\x7e\xb6\x85\x73\x3c\x1c\xa9\x4b\x9c\xb9\x8f\xfd\x42\x1f\x13\x93\xb1\x4a\x6e\x79\xf5\xdb\xa2\x1c\x08\xa3\x46\x1c\xce\x5b\x27\x9f\xd2\xf5\x76\xcd\x2c\x23\xcc\xaf\xe3\x38\xaf\xc8\x2b\x02\x51\x34\x5a\xe3\x24\xc6\x4b\x24\x1a\x5e\xf5\xb6\x28\x32\x8f\x3c\x16\x51\x16\xf3\x0f\x74\xc1\x03\x8a\xb1\xf8\xd7\x70\xa7\xe0\xa8\x03\x2d\x33\xfa\x26\x20\x5f\x59\xaa\x85\xce\x50\x01\xce\x82\xad\x28\x52\x38\x47\xaa\x2a\x96\x54\x36\x2f\x16\xde\x45\x63\xa6\x90\x29\x49\xdf\xa6\xc5\xb6\xf2\xdf\x1d\xab\x9e\xf7\x0b\x95\x22\xfe\x09\x7f\x7a\xc8\x89\xf0\x60\xab\x64\xcd\x7c\x82\xa5\xe9\xa4\xba\x65\x26\xa6\xb9\x70\xda\x9b\xe2\xde\xfb\x0a\xdf\x9b\xeb\x3b\x7c\x18\x1c\x21\x56\xc7\x8b\xf1\xaf\xad\xa7\xd1\xc3\xcf\x3f\x89\x4f\x8e\x83\xef\xe0\x04\x04\x2c\x05\x4d\x9a\x3c\x58\xda\xb8\x2b\xd2\x80\xaa\xfa\x73\x36\x9f\xd9\xc5\xde\xfb\x45\xcb\x4e\x98\xf0\x17\x39\xee\xc5\xd2\x20\x46\x4a\x70\x4f\x0f\xab\x6e\xa4\xf2\xe2\x0e\xd4\x71\xc1\x88\x34\x4b\x0c\x99\x25\xdc\xca\xbc\x2f\x3e\x1f\x19\x47\x7f\x55\x2c\x22\x64\x83\xa9\x08\x48\x97\x6c\xa0\xe2\x6c\x5b\x11\x2f\x7e\xc4\x67\x1b\xbd\x5d\xec\x3d\xce\x55\xc8\x53\xfc\xe4\xd4\x1b\x04\x77\xae\x6d\x2c\xc3\x2f\xf3\xdb\x35\x27\x6e\x09\x06\x2d\x5c\x64\x0d\x71\xb4\xb4\x96\xdd\x31\x5b\x6d\x5d\x2c\x80\x62\x27\x75\x0b\x23\x22\x05\xd1\x7c\x27\x13\x1f\xc6\x42\x2e\x97\xc9\x5c\x63\xf1\x7a\xea\xf2\x1f\xc8\xc9\x00\xea\xd9\x95\x75\xa7\x89\x20\x9f\x80\xf3\x2e\xf3\x9e\xe6\x55\x9d\x64\x99\x53\x61\xcb\xc5\xad\x20\x46\xe0\xa9\x9a\xd4\x49\xbe\x48\xca\x45\x25\xfa\x5f\xd9\xdf\x89\xc3\x3c\xcd\xed\x9a\x78\x25\x9e\xf0\x0c\x88\x1f\x0e\x89\x66\xb7\x6b\x97\x40\x70\x39\x24\x44\x11\x48\x97\x84\xfe\x64\xec\x85\x4a\x50\x07\x00\x62\x2d\xb2\x55\x00\x82\xec\x5c\x1c\x55\x7c\x28\x47\x3e\xe5\x11\x3c\x9f\x38\xe0\xf6\xc8\x08\xaa\xb4\xaa\xb6\x96\x01\xc2\xb1\x01\x9c\xc4\xea\xa2\x28\x65\xe3\x00\x0d\x8f\x7c\xd5\x90\x00\xc1\x29\xa2\x76\xf3\x25\x03\xa3\x6e\xd6\x5b\xe5\x6b\x14\xc0\x24\xa5\x4c\x7c\x60\x6e\x70\xa4\x75\x81\x49\x82\xde\x7c\x28\xb6\xf8\x4a\xc9\x52\x84\xb7\x87\x9d\xf0\xc8\x7e\x05\x47\xf3\x30\xe9\xe2\xba\x2c\xee\xcc\x18\x21\xcd\xac\xa4\x9c\x8d\xb0\x0a\x92\x2b\x24\xf1\x97\xd6\xeb\xca\x93\x1b\xcb\x89\x07\x65\x04\xd8\x19\x77\x9f\xcc\x76\x8e\x11\x46\x5a\x6a\x48\x7a\x3c\xeb\x3a\x59\x6b\x00\xfc\x17\xc8\x64\x6e\xd6\xe5\xb2\x86\x1c\xdf\x1c\x8a\x3d\x9f\x1f\xff\xdf\x5d\xab\x68\xba\xad\x61\x15\x99\x59\xac\x56\x49\x89\x99\xa3\x99\xce\xf5\x92\x68\xda\xe4\x23\x45\xab\x08\xd8\x79\xcc\xc6\x28\xc8\x56\xb1\x45\x8a\xab\xee\x34\x3e\x01\xb8\x6b\xd3\xae\x78\x0d\xb7\x5f\xfb\xdf\x64\xc6\x12\x39\xf7\xc1\x70\xc8\x16\x47\x77\xa9\x31\x0b\x89\x53\xf9\x68\x59\x6a\x6d\x8e\xab\xfc\x08\x68\x7e\xaa\xf4\x56\x3b\xca\x15\x2f\xf1\x66\xad\x53\xd8\xb5\x99\x31\xce\xcc\x6a\x47\x62\xab\x7a\x47\x87\x92\xb8\xa0\xdc\xbf\x0e\x93\x2e\x2e\x91\xf6\x6f\xd2\x9e\x38\x14\xe6\x19\x1d\x69\xc6\x12\xe4\x42\xdd\x6e\x70\xc0\x35\xfb\xcc\xb9\x4c\x1b\x78\x74\x09\x4d\xa2\xc9\x88\x98\xd1\x49\xa6\x31\x51\x5f\xc4\x67\xc4\xf3\x4f\xbf\xc3\x16\x83\xaa\xdb\x08\xf2\x7a\x17\x9a\xcd\x8d\x26\x95\xbd\x0f\x13\x69\xce\xfd\x66\x3e\x20\x86\x68\xd6\xa5\x6d\x84\x77\x4c\xc5\x97\x0c\xb3\x1c\x5b\x53\x0d\x8f\xe1\x48\x81\x08\xa7\xa2\xec\x2b\x11\x98\x05\xb6\x3f\x71\x21\x46\xc8\xd1\x6b\x6c\xfe\x08\x47\x68\x63\x16\x3f\x84\x5f\xcd\x97\xf1\x1c\x2a\x50\x75\xd3\x3c\x30\xc9\x5c\x6e\xd7\x39\x32\x66\x0c\x0b\x5b\x11\xfd\x98\x21\x12\x56\xc3\xe1\xbc\xdb\x4e\xbd\xcc\x84\xa3\x7c\x48\x9d\xc6\x27\xe6\x00\x30\x2d\x32\x63\x62\xae\x76\x64\xf3\x37\x2b\x93\x72\xd7\x50\xbe\xdc\x9c\xff\x65\x5a\x56\xb5\x98\xc9\xd0\x2c\x6e\x55\xae\x6d\x9a\xbb\xa6\xb5\x8b\xae\x1a\x16\xb5\x99\x59\xbb\xaf\x65\x03\x4d\xc3\x66\xc5\x2d\xec\x1c\x5e\xab\x99\xe3\xb6\xa4\xbe\xbd\x54\x27\x5d\x22\xfb\x5b\x68\xc7\x3f\x0a\x26\x9a\x76\x06\x9a\xd7\xc8\xdf\xd4\x69\xd7\xd5\x96\xef\xfb\x4c\x51\xaa\xa7\xf8\x68\x49\x82\x5d\xe1\xa1\x68\x56\xca\x4b\x95\x76\x45\xf9\xf8\x7c\xbf\x87\x08\x07\x2b\x7d\xf8\x21\x6f\x92\x96\x3c\x91\x1a\xb9\xf2\xfc\x85\xbe\x4d\xe7\x5e\x59\x15\x80\xd8\x8d\xa3\x21\x94\x52\x9b\x06\xdf\x53\xe3\x63\x4b\xb1\x29\xa7\x03\xc8\x0e\xf7\xd3\xf8\x44\xf5\x7c\xae\x33\x4b\x09\x36\x0d\xec\x3a\x71\x19\x06\x26\x24\x46\xe5\x25\x37\x12\x70\x88\x3e\xb0\x20\x1e\x75\xd3\x52\xcd\x48\xcb\x5d\x1b\xea\x8c\xe0\x05\x1b\x62\x42\x3c\x5a\x50\x54\x62\x77\x7f\xf7\xfb\xe7\x33\x72\xc5\x1e\x07\x15\xee\x5e\x2c\x28\x29\x2a\xa7\xa9\x51\x29\x62\xf7\x6b\x1b\x28\xa4\x59\xcc\x6a\x5d\x06\x1a\x2d\xb5\x63\x98\x03\xf2\xf4\x3d\x7d\x27\x47\x5d\xe8\xf7\xd3\x51\x6e\xf9\xbd\x63\x5f\xee\x17\x4e\x97\x55\xba\x59\x0b\x8d\x99\xb6\x00\x07\x1a\x1a\xe8\xd8\x30\x91\x3f\x3c\x68\xb9\xcd\xb2\x16\x96\x2c\x77\x7e\xe0\xaa\xf0\x5d\x38\x27\xa9\x4c\x72\xcc\x48\xb1\x20\x49\x5b\xb3\x8c\xdd\x01\xdc\x48\x95\xae\x41\x49\x8a\xce\x5c\x67\x36\xce\x8a\xc5\x4e\x28\x8c\x14\xb9\x56\xab\x6d\xbe\x00\x7d\x8c\x3b\x9d\xd7\x3b\x75\x78\x72\xca\xb2\x11\x33\xbd\x34\xd6\x83\x79\x33\xdc\xfd\x7b\xba\x1b\x50\xb9\xdb\x3c\xa0\xdf\x8b\x45\x81\x22\x07\x5a\xd7\x2c\x6b\xe4\x1a\x1c\xf9\x42\x49\xac\x2a\x4e\x7e\xe7\x61\xda\xc5\x32\x21\x7d\x4b\x7c\xd5\xf6\x60\x71\x3d\xdb\x94\x45\x5d\xcc\x8b\x8c\x84\xf6\x6d\x19\x51\xba\xde\x20\x27\xbf\xdd\x80\x30\x13\x7e\xe3\xc0\x3f\x41\xa9\x10\x6d\xe6\xe5\x51\x5f\x62\x8d\x89\x96\x3f\xa5\x5e\x84\x86\x78\xd2\x08\x49\x04\xf4\xbe\xa8\x0f\x3e\x5f\x89\x3e\x61\x71\xd1\xbe\x16\x34\x5a\xec\x45\xdf\xa0\xcc\x8a\x2d\x9c\x54\x4b\x2e\x2f\xe0\x9e\x26\x12\x36\xce\x56\xd2\xf2\xcf\x4d\x9f\x59\x7a\xc3\x0c\x3d\x4a\x49\xdd\xa3\xac\x83\x8b\x18\xee\xa9\xf9\xb6\xaa\x8b\xb5\xf6\x37\x44\x73\x28\x62\xd5\xb3\xf5\x32\xd9\x2e\xf2\x65\x9a\xf6\x2c\x95\x9d\x5b\xea\x72\xd5\xe0\x5e\x6d\x59\xe5\xc1\x1d\x1c\x2c\xa6\x50\x62\xc8\x2d\x99\x7d\x0f\x6b\x78\x4e\x48\xdc\x4e\xee\x36\x12\x9e\x31\x99\xb0\xd9\x8a\xb6\xfe\x17\x33\xab\x54\x17\x9c\x0b\xaf\xfc\x01\xe2\x42\xc1\xd0\x6c\x7a\x6b\x39\x9a\x61\x2b\xd0\x76\x71\x8f\xf5\x84\xf0\xbd\x65\x66\x9e\x4e\x54\xcb\xa9\xe9\x12\xc7\x70\x04\xa3\xb2\x77\x96\x37\x1e\x9c\x15\x74\x4f\x59\x85\x8b\x04\x6e\x88\x5b\x63\xa9\xa3\xa3\x52\x94\xbb\x2e\xa9\x63\x24\x28\xc6\x60\xab\xc0\xb2\xf4\x23\x09\x75\x67\x45\xf1\x11\x4f\x4b\x78\x0c\xbd\x23\xf6\x65\xe5\x17\xa8\x72\x5f\xa2\x8f\x22\x97\xc0\x61\xd5\x75\x32\xfc\x0b\x52\x35\x87\xbc\x36\xb4\x28\x20\x25\x17\x83\xee\xc5\x4d\x5c\x44\xd2\xf5\x1c\x38\xa9\xe4\x7c\x79\xc2\x68\x78\xca\xf8\x68\x46\xba\x24\xe4\x38\x63\xef\xd1\x16\xc2\xf7\xb5\xdc\x21\xc6\xf6\xb4\x5e\x93\x2d\xcf\x77\x34\xc0\x6c\xff\xc9\x20\x8d\x55\x2d\x5f\x15\xe6\x12\xac\x0b\xbc\x17\xed\xd1\x81\x78\x4d\x73\xa9\x6b\x38\x54\x22\x9b\x12\x37\x0e\xc1\xc6\x18\xb0\x66\x87\x2d\xf4\x1a\x22\xd1\x20\xcf\x61\xe5\xc4\x66\x19\x31\x97\x42\xd4\x43\x0e\xbd\x68\x3c\xef\x61\xef\xca\xe4\x45\xfa\xa6\xb8\x33\x37\x7c\x24\xe5\xfd\x2b\x52\xf8\xe7\x1b\xae\xb8\x63\x12\x11\x6c\x35\x5c\xee\x92\x57\xa4\x35\xc6\x2c\x66\x88\xd9\xcf\x93\x59\x55\x64\x5b\x90\x35\xb3\xea\xfb\xb9\x3b\x37\xbf\xa4\xe3\x20\xd3\x07\x25\x76\x56\xdc\x23\xc9\x8a\x5c\x3b\x4b\x87\xdc\x4e\x7b\x76\xd0\x23\x49\xf8\xbe\xc5\x64\xa7\x00\xa8\x7b\x5b\x9a\xcf\xb7\x65\xe9\xdc\x9d\xe6\x77\x68\x53\x99\x4b\xca\x8c\xc7\xe3\x3b\x82\x87\x38\x48\x92\x98\x4e\xb8\xc3\xe9\xa9\x9f\xd5\x28\x96\x32\xa9\x40\x97\xb4\x20\x3f\x17\xbe\x62\x23\xd7\x20\xbe\x68\xc6\x84\x56\x3d\x06\xd6\x72\x94\x6f\x6b\x1c\xc3\x4e\xcc\xb1\x02\x7b\xd7\x7c\xd1\x9c\x98\x4e\x59\x65\x8d\x8a\x18\x78\xde\xb7\x24\x78\xd2\xa5\x8c\xe1\xd8\xf3\xc2\xa7\x84\x0a\x77\x61\xb0\x44\x83\xae\xc8\x1b\xf2\x21\xc7\x09\x09\xc7\xa8\x32\x94\x4a\x51\xe7\x45\x5e\x6d\xd2\xf9\xb6\xd8\x56\x20\x11\x24\xe0\xb5\xf9\x4e\x9e\x99\xde\x98\x15\x65\x58\xf4\x19\xe1\xa6\x6f\xa0\xa4\xc1\xad\xca\xcc\x5f\x4a\xc4\x44\x3b\x2b\xef\x9e\x43\xc5\xe7\x11\x0f\x3a\xdd\x3a\xc3\xe6\x53\xed\x93\x6a\xcb\x52\xef\xd9\xf3\xad\xa7\x18\x97\xab\x5a\x3b\x82\xbe\x3f\x5f\x15\xe0\x93\x63\x4f\xe0\x1c\xc3\xe8\x29\x0d\xbb\x2b\x6f\x75\x98\x21\xab\x61\xe7\xc3\xc8\x98\x85\xfe\x5e\x4e\xd9\xc6\x34\xd2\xed\xf2\x79\xbd\xdf\x5f\x7c\xfb\xa8\x23\xa9\x16\xae\x0a\x76\x1c\x1f\xd4\xec\xa3\x42\x2d\xc2\xb6\xe3\x07\x8a\x82\xf7\x9c\x17\xf1\x1f\x75\x30\xd9\xa3\x76\xef\xb9\xf3\x4c\x06\x84\xc4\x01\x43\xb6\x9b\x17\x2f\xc2\xb0\xa5\xf1\xcf\x9b\x69\x1b\xe1\x96\x7f\x5e\x86\xaf\x2d\xf4\x25\xdf\x09\x3d\xaa\xd2\xfc\x26\xb3\xc0\x35\x70\x56\xc8\x2a\x99\x27\x15\x29\x1e\xb8\x69\xae\xb6\xa5\x6e\x3d\xe2\x1a\x53\xb9\xdc\x66\xcb\x14\x22\xc9\x6c\x23\x34\x13\x2f\xcf\xe2\x63\x1f\x24\x74\x36\x7a\x7b\x75\xf9\x41\x9d\x5f\x83\xfa\xf7\x64\xda\x03\x0e\xb4\xd1\x58\x8d\xfb\xaf\xaf\x2f\x21\x74\x60\xbe\xf7\x9d\x05\x3b\xfc\xe9\xf8\x2c\xb1\x0e\xdf\xb2\x7c\x09\xd1\xef\x76\x51\xcf\xb0\x5d\xf7\xe7\x4f\x7f\xb3\x21\x34\x7b\x1c\x62\xfc\xcd\xf1\x15\x33\x34\x80\xc2\x53\x7a\xa7\x12\xf0\x6a\x63\x35\x41\xcf\x0a\xf3\x2f\x80\x38\xa0\x53\x5d\x9e\xe3\xb0\x58\xfa\xaf\x7b\x97\x64\x37\xb7\xa9\xc3\x9a\x6b\xcc\x92\x0f\xc8\xef\x5b\xb7\xdb\xe7\xde\x6c\x33\xed\xfb\x6d\x62\x14\x2c\x2e\x4b\xe2\x6d\x4e\xb6\x45\xca\xa0\x54\xfb\xba\x51\x6d\x97\xcb\x74\x9e\x62\xba\x78\xa1\xeb\x24\xe5\x65\x98\xb8\x4b\xc3\x34\xa6\x28\x17\x08\x6b\xad\x3e\x02\x15\x07\x68\x79\xb0\xd7\x08\x27\x1f\xc4\x07\x55\x5a\x13\xbb\xe3\x31\xcb\xd0\x73\x39\x03\x29\xe4\xdb\x88\xbe\x2f\x05\xbb\xd9\x64\x29\xb1\x3a\xc2\x24\x14\x74\x06\xb6\x1f\x30\x40\x0a\x5b\xd7\xc9\x7c\x45\xac\x8e\x6d\xae\x12\x99\xba\x7c\x6b\x06\x5e\xaf\xe7\xa7\xb9\x59\x3a\x81\xe6\xbf\x88\x8f\xd5\xbb\xfe\x78\x02\x18\x4f\x5f\xe5\x9c\xce\xac\x17\xf1\x89\x1a\xea\x3b\x61\x14\x4d\xb6\xa8\x0f\xc1\x21\x87\x52\xdf\xa6\x15\x12\xbc\x3f\x29\x4a\x48\x13\xcb\x8b\xb2\x16\x34\xf5\x78\xc2\xa7\x6b\x5c\xca\xe9\xda\xcc\xb5\x71\xf2\xf8\x1e\x05\xf6\x13\x5b\x77\x9b\xc0\x52\x49\xf3\x9b\x6d\x5a\x81\x54\x15\x7f\x2c\xdf\xae\x67\xee\x54\x7d\x11\x9f\x0a\xc1\x3c\xbf\xad\x23\x73\x09\xfa\x7b\xd5\xb2\xf1\x52\xfb\x6d\x20\xcf\x73\x12\x83\x9b\xdd\x5e\xba\xd6\xc7\xca\xee\x8c\x83\x6f\xb5\x83\x1d\x5f\x69\xab\xe9\x94\x58\x8e\xf9\x58\x3c\xa2\x2a\x84\xdf\x02\xb4\x18\x66\xf9\x3e\x18\xc2\xc6\x6b\x26\x24\xaf\x0f\xc7\xda\x75\x6f\xb6\x33\x73\x16\xab\x21\xf9\x30\x02\x13\xb3\xcd\x59\xce\xdb\x81\x35\x30\x83\x22\x5e\x29\xe2\x82\x75\xd1\x72\x64\xff\x8c\x41\x5d\x64\xdb\x1c\x9b\x65\xc4\x38\x60\xf3\xd7\xd1\x78\xf0\x7a\x30\xec\x5d\x62\xa6\x4b\x16\x4a\x5d\x0f\xcf\xfb\x63\x6f\xbb\x20\xf7\xa4\x02\x1c\xb3\x7a\xd5\x9b\x0c\x26\x9f\xc7\x4d\xef\xf1\x8f\x7a\xa4\xa3\x6d\x5c\xf3\xa2\x98\x6a\xfa\xa6\x37\x85\xc5\xdf\x68\xed\xc5\xb8\x0f\xd8\xd5\xf3\xfe\x45\xff\x6c\x3a\x89\x04\xae\xf9\xb2\x0f\xa0\xe6\xc7\x02\x9a\x07\xc3\xd7\x31\xbc\xa3\x3f\x9c\x0e\xc6\x7d\xd2\xd8\x9f\x70\x69\xd7\xbf\x5f\xf7\x2c\xc1\xe9\x55\x7f\x7c\x31\x1a\xbf\xed\x01\x5b\xe6\x45\x7b\xc3\xa0\xe4\xe9\xc3\xe8\x3a\x56\x93\x37\xa3\xeb\x4b\xe4\x61\xf5\x3f\x65\x46\xba\x4f\x2d\x1f\xbc\xeb\x33\xc5\xe6\xb8\x3f\xb9\x02\x6c\xf0\x87\xd1\xb5\x3a\x1c\x8e\xb0\xe7\x80\x7b\xeb\x5d\xaa\xf3\xfe\xbb\xfe\xe5\xe8\xaa\x3f\xee\xaa\xde\x64\x72\xfd\x16\x50\xbe\xea\x6c\x34\x99\xf2\xc8\x0f\xfb\x67\xfd\xc9\xa4\x37\xfe\x40\x04\xa4\x30\xc0\xe3\xfe\x55\x6f\x30\xc6\x6a\xb1\xf1\x18\xcb\xb2\x62\x9c\xdc\xf6\xb5\x01\x80\x64\x64\x34\x9d\x98\x49\x37\xd3\x87\x0c\xa9\x66\x24\xc3\x83\x34\x56\xc3\x11\xc3\x88\x9b\x1d\x1d\x4c\xa8\x5c\x6d\xf0\x97\xfe\x39\xc0\xc5\x71\x6d\xf5\xff\x7c\xd6\xbf\x9a\xca\x85\xe6\xda\x02\x4b\xf7\x97\xf8\x58\x4d\xfb\xe3\xb7\x83\xa1\x35\x24\xe0\xb7\x27\xdf\x4b\xc0\xfb\x73\xc5\xbb\x9f\x1e\xff\x3e\xcd\xee\xc0\x8c\x84\xab\xe7\x2b\x0b\x76\xc3\x43\xbf\xb2\x62\x77\x20\xd8\xad\x7e\x89\x4f\x1f\xa1\x86\xca\xb7\x9d\x99\x4f\xca\xde\x7d\x86\x26\xea\x7d\x3a\xa8\x38\x70\xdf\x55\x08\xd5\x29\xbf\xa8\x23\x38\xb8\x07\xf9\x62\x5b\xd5\xe5\x4e\x84\x67\xc9\x8a\xe2\xda\xe7\xce\xf4\x73\x14\x54\x1e\xf5\x4c\xa1\xa2\x72\x8a\x15\xcb\xf4\x87\xee\x6f\xa6\xc7\x07\x9c\x9d\xf2\x95\x51\xee\xd7\x3b\xe1\x45\xd4\x39\xe8\xf0\xdd\x88\x05\xd5\x5e\xe6\xcc\x35\x21\xa9\xd5\x4d\x99\x2e\x90\xdb\x2d\xae\xb6\x39\xb1\xe8\xe7\xba\x7e\xc2\xe2\xba\xab\x7a\x9d\x75\x0e\x3a\x93\xfb\x55\x52\x84\x3a\xa1\x9f\x2a\x54\x49\x4e\xb7\xd0\xa3\x14\x52\x28\xeb\xe2\x58\xde\x0e\x88\xe5\xcd\xa9\x8c\x5c\x8a\x84\x18\x24\x19\x7e\x8f\xda\x88\x18\xb1\x69\x5b\x20\xe7\x75\x99\x2e\x54\x1f\xc7\x87\x3e\xd3\xb4\x2d\xf7\x44\x81\x5e\x1e\xb4\x97\x41\x75\x0e\x3a\x57\x9c\xee\xe7\x68\xf4\x6c\xf7\x72\x5f\xd1\x94\x19\xf4\x26\xa9\xde\x9e\x4f\x77\x0e\x3a\x6d\x85\x78\x9d\x83\x8e\x08\x5c\x1f\x56\xdd\x97\xff\xf9\xe0\x4f\xc7\xa9\xb0\x98\x7d\xc2\xcb\x98\x01\xde\x63\xe9\xa3\x2e\xb1\x4a\x0b\x36\x81\xfd\x24\x91\xd4\x3f\xf8\x39\xe8\x21\xd9\x5e\x47\x4e\x63\x15\xf2\x62\xa5\xb6\xda\x2c\x49\xfd\x52\x4e\x87\xc3\x9e\x59\x20\x90\xcb\xf6\x78\x6f\x25\xd5\xaf\xf6\x3f\xaa\xcd\xb6\xac\xb6\x09\x0a\xc7\x0a\xa3\xde\x7f\xb5\xc5\xe6\x9c\x1a\x23\x3e\x81\xcb\xc2\x89\x84\x55\x96\x98\xbe\x00\xaa\xbb\x30\x5f\x76\x6f\x22\x89\xdd\x36\xea\x0d\xa5\x4b\x1c\x9b\x3d\x50\xcc\x13\xd8\x10\x79\xf0\x20\x19\x51\x15\x68\x0c\x8b\x11\x89\xc4\x66\x8e\x5a\x37\x36\x46\x3c\x59\x09\x36\xc7\x7e\xcc\x5d\x3f\xac\x1c\x3c\xd2\xec\x70\x97\x4f\x51\xe9\x13\x0f\x1b\xc4\xd6\x7c\xc5\x1e\x63\xce\xcd\x0a\x42\x99\xc7\x47\x7b\xe4\xd2\x23\xcb\x38\x58\xb6\xa4\x49\xfd\x87\x42\x1e\x1c\x5b\x5d\xff\x28\x16\xfa\xc2\x9f\xf8\xc9\x64\xa3\xf3\xb9\x2e\x8f\x7e\x7d\xf6\xad\x0a\x80\x1e\xe2\xff\x7e\xf1\xfc\x69\x58\xff\xf3\xfc\xc5\x8b\x1f\xf5\x3f\xdf\xe3\xc7\xab\xff\xf6\xf9\xb0\xdf\xe8\xdc\x58\x37\xb8\x3c\xda\x89\xc0\x9b\x15\xb6\x66\x87\x0b\x63\x09\xa3\xc4\x36\x92\x5f\x4b\x0d\xd1\xa9\xce\xf4\x66\x65\xdc\x6c\x73\x66\x99\xff\xba\x29\x93\xcd\x0a\x8e\x22\x38\x78\xec\xbd\x3b\xd6\x37\xf2\x5c\xf1\x39\xbf\xcf\x92\x2c\x5d\x16\x65\x9e\x26\x5f\x87\xbb\x95\x31\x41\x0e\x45\x0f\xd7\xef\xa3\xf8\x5a\xbf\x80\xa8\x15\xc9\x6b\x1d\xa7\xa9\xaf\x84\x4b\x35\x0a\x18\xbf\x98\x23\x42\xb8\x8d\xb6\x16\xb0\x76\x2c\x7f\x58\xdc\xa9\xe4\x6e\xb9\xcd\x22\x30\xf8\x29\xab\xb6\x03\xfe\x5b\x8a\x2b\x2d\x41\x42\xd7\x38\x17\x35\xb3\xa7\x7e\x19\x69\xac\xb5\xe7\x66\x8e\x43\x94\xa8\x63\x49\x1c\x98\x8b\xb1\xd5\x24\x35\x97\xcb\x52\xdf\x81\x43\x51\x01\x9c\x4b\x95\x3a\x61\xc2\xd6\x2a\xb2\x72\x0e\x81\xb0\x5b\xa3\x9a\x9d\x49\x57\x99\xf1\xf5\x3b\x51\xbd\x7e\xf5\x2e\x3c\xfb\x0c\xde\xd8\x6f\x74\xc3\xc5\x4f\xfa\x67\x7f\xac\xfe\xdb\xe9\xf3\x9f\x5b\xf8\xbf\x9f\xfd\x38\xff\xbf\xcb\x4f\x7f\xb1\x9d\xb3\xcc\xed\x99\xad\x32\x64\xaf\x58\x68\xc0\x45\xaa\xb7\x29\xd3\xcc\xb8\x26\x3f\x4b\x1d\xa7\xa2\xd2\x8b\x6d\x5c\x94\x37\xec\x4f\x56\x4f\x80\x6e\xea\xde\x07\xdb\x40\xac\x31\xea\x0f\x3b\xfd\xb3\xcb\x4e\xd7\x13\x9a\x81\x8b\x62\x93\xcc\x57\x1a\x3e\x62\x41\xf7\x56\xf0\x09\xf1\x2a\x6c\x38\x57\xf3\x62\x63\x2f\x18\x82\x1c\x63\xf9\x5b\x9a\xab\x8a\x6d\x7e\xca\x50\x48\x42\x65\xc8\x13\x68\xbd\xb0\x2f\xd5\xdc\x6c\x5b\x73\x09\x80\xb7\x0a\x4f\x05\x87\x6f\x93\x07\x66\x92\xb5\xb4\x55\x99\x2b\x6e\x66\x4e\xf1\x6d\x8e\xae\x8d\x18\xb4\x04\x3e\xee\x8f\x1a\x45\xef\x8e\x40\x6f\xaf\x3f\x7e\x8b\x44\x12\x8e\x68\x02\x62\xa7\x20\x5a\x34\xee\x5f\x8d\x47\xe7\xd7\x67\x2c\x03\x7a\xee\xe1\x84\xe9\x6e\x39\xb7\x25\x24\xb6\x7e\x8c\xfe\xaf\x43\x93\xd0\xa1\x08\xca\x5a\x27\xb9\x0c\x61\xfb\x62\xaa\x54\xdb\xef\x0a\x07\x88\xa6\x45\xe6\x46\x49\x83\x9b\x9d\xa9\xd9\xce\x41\x36\x4e\x54\xbd\x2a\x8b\xed\xcd\x4a\xfd\xea\xaa\x5b\x82\xda\x48\xbf\x5d\x45\xd9\x68\x98\x23\x46\x01\xb8\x80\xa8\x30\xc5\xdb\x33\xfd\xbb\x4b\xe5\x86\x9f\x05\x7f\x82\x8d\x81\x40\x9a\xbe\xd1\x00\x28\xfd\xe9\xc3\xa3\x1b\x8d\xd8\xe6\xc2\x0b\x49\xe6\xf0\x2c\x6e\x05\x57\x51\x62\x68\x83\x4a\x87\x5c\xf1\x5f\x59\x64\x48\x6c\xd3\x2c\x10\x32\xbf\xdd\x5f\x21\x04\x4f\xa0\x62\x18\xa8\x14\x82\xf5\x7d\x5f\xb5\x50\x87\xbe\xdf\xe1\x7a\xa1\xf4\x8f\xac\x17\x4a\xd3\xa0\x60\xa8\xb5\x4c\x88\x80\x62\x7b\xcb\x85\xf8\x59\x69\xf7\xd1\x55\x43\x62\x52\x3f\x14\xdb\x0e\x54\x60\x98\x7f\x95\x9d\xae\x9c\xd7\x46\x6d\x9a\x5c\x01\xb2\x32\xcd\xb1\xca\x54\x32\x70\xd9\x56\x21\xc1\xef\xc5\x60\x60\x07\xe1\x4d\xc1\x5a\x0a\xaa\x0a\xf7\x15\x10\x3e\x50\x33\x60\xed\x33\x4f\xb3\xc1\x47\x02\xc9\xb0\xc0\xbc\xc8\x97\xe9\xcd\xb6\x14\x4c\x8a\x61\xa3\x47\x60\xbd\x36\x1b\x6d\xab\xc4\x03\xfc\x33\x55\xb4\xcf\x93\x8c\xca\xd0\x8b\x72\x6d\x21\x48\xf0\x1b\x51\x78\x28\x01\x5f\x0f\x74\xcd\xaa\xff\x14\x68\x4e\x63\xd7\xb0\x6a\xbe\x01\x77\xb2\xbd\xb3\x76\x60\x5d\x30\xd3\x91\x5e\xa4\x89\xaa\x77\x9b\x66\x57\xdf\x17\xe5\xc7\xc6\x26\x87\xf2\x71\xd3\x56\x94\x94\x58\xa5\x1b\xb7\xd4\x1d\xec\xba\x28\x15\x0e\x14\x75\x05\x08\x03\xda\x10\x61\x36\x17\x9a\x54\xb0\xd0\xe6\x14\x0a\xa4\x68\xad\x47\xc4\xc8\x07\x95\x44\x11\x98\x03\xc2\xa6\xb4\x0b\xd7\xc2\xc3\x24\x57\xfa\x53\xb2\xde\x64\x3e\xad\x11\x59\x9a\xbd\xcd\x46\xe7\x8b\xf4\x13\xea\x26\x77\xc3\x9e\x9f\xeb\x32\xbd\x4d\xa0\x66\x08\xb0\x35\x9d\x70\xa6\xcd\x3b\x1e\xd3\x6f\x6e\xf2\x0c\x6a\x3c\x8a\x1c\xb6\x99\xa4\x6e\xc2\xb3\x07\xd1\x32\x39\x62\x08\x5c\x0a\xdf\x18\xca\x05\xc8\x40\x41\x5a\x9c\x0b\xc3\xf2\xa2\xe6\xd5\xaf\xb3\x64\x46\x02\x71\x78\x08\xd0\xa4\x7a\x91\x28\x6b\xc0\x47\x88\xc8\xb9\x5b\x15\x58\xa1\xe5\x6e\xe7\xe6\xac\xde\x73\x9a\xda\x39\x0b\x87\x49\x48\xdf\x33\x96\xf0\x0e\x7e\x0f\xc3\x40\xd9\x1a\xac\x4e\x02\xf7\xad\x2c\xd6\xd0\xe8\xb5\x2e\x75\x66\xdc\xe0\xfc\x23\x0c\xd0\x2c\xcd\x61\x0d\xe4\xc9\x5a\x77\x79\x5a\x6d\xb1\x2f\xd7\xb4\x8a\x61\x6b\x34\x84\x4a\xc8\xc2\x79\x3d\x13\xea\x7c\xad\x73\x1a\xae\x6c\xb7\x05\x3d\x87\x27\xc8\x92\xdb\x76\x98\xc7\xac\xc3\x22\x05\x8e\xba\x52\xda\x2c\xa9\xf1\xf3\x45\xb9\xb7\xd9\x91\x58\xea\x35\xc6\x25\x21\xf7\x57\x6d\x67\xc4\xfa\x56\x17\x4e\xf0\x1e\xeb\xb8\xa0\xfa\xb2\xb0\xfc\xe2\x8c\xf9\xda\x63\x1c\x98\x0d\x76\xef\xc9\x2e\xcc\x06\x73\x8e\xc2\x8b\x9b\x40\xe2\xe0\xc9\x8f\xbd\x81\x6d\x3f\x3a\xa2\x08\x9e\xab\xc7\x1d\x6f\x47\x64\xc6\x79\x96\x64\xb0\x46\x98\xbd\x8c\x8c\x4e\x32\x41\x2b\x9d\xdb\x48\x82\x1d\x10\x33\x1e\xb5\x58\xf6\x30\xc2\x0f\x5d\x15\xfe\x73\x8b\x5c\xf2\x87\xac\x93\x14\x4a\x24\x33\x63\x7c\x47\x1e\x57\x1e\x1b\x23\x36\x03\x01\x70\x9e\xaa\xda\x6a\x73\xb8\xcf\xe1\xc6\xa2\xbf\x11\x5c\xb1\xd4\x64\x35\x58\x0b\x47\x0e\x6b\xe4\x77\x65\xe9\x8f\x27\x10\x98\xa4\xd5\x7c\x5b\xc1\x9d\x0b\xef\x5a\xc3\xd9\x46\x2b\xf4\x3d\x9c\x4b\xa6\x7b\x2e\xf5\xe8\xf7\x8c\x57\x96\x0f\xb0\xa5\x30\x80\x5f\xb0\xe9\x54\xa3\xd3\x1c\xc6\x1f\x86\xae\x7d\x4d\x25\x95\xea\x0c\x8b\x5a\x56\x07\x18\x1f\xbe\xb3\x6f\x03\x06\x36\xac\xed\x30\xef\xa2\x7b\x96\xa6\xb7\x0a\x81\x05\xd8\x7f\xa9\x03\xe5\x94\x7a\xae\xe1\xa4\x9d\xed\xfc\x37\x78\x7c\x1f\x69\x3e\x27\x99\x4d\x02\x96\x89\x2d\xc4\xb1\x1f\xac\x95\x2e\x96\x22\x0b\x25\x8d\x9a\x89\x1f\xd3\x6a\x75\x13\x1a\xa7\x27\x64\xe2\x65\x2d\x85\x5f\x74\x5d\x17\x54\x77\xbd\xd1\xe5\x46\xd7\x5b\xb3\x0f\xa0\x04\x1b\x2b\xb0\xbd\x9a\x6b\xf3\x9f\x47\xcc\x26\xed\xd7\x66\xa7\x65\xa9\x6f\x0b\x04\xdc\xb8\x49\xcb\x1c\x08\x50\x94\x3b\x6f\x4a\x73\x36\xeb\xe6\xb9\x64\xd6\x25\x40\x80\xe6\xd9\x4e\x14\x43\xf3\x6f\x5a\xaa\xa2\xa3\x36\x6c\xa8\x3d\x27\xc1\x18\x6d\xbc\x65\xdf\x35\xca\xc1\x2c\x3b\x09\x57\x92\xb1\xe2\x9f\x6a\x06\x0e\x29\x79\x9d\xa0\xde\xb2\x28\x60\x26\x1f\xbc\x1b\xd6\x03\xef\x2d\xc2\xc6\x92\x4d\x73\x38\x43\x0d\x36\xfe\x6f\xba\xc6\x12\x06\xa8\xc8\xb6\x3b\xd9\xf2\x1f\xb9\x23\x02\x6b\x68\x60\x1e\xb2\x00\x4d\x08\x85\x06\x30\x8e\xe6\xc4\x91\xdc\x24\xec\xdb\x73\x0d\x3d\x7c\xdd\xab\x06\xe2\x13\x2e\xd7\x73\x5d\x55\x49\x99\xc2\xfe\xf2\x4b\xd0\xd3\xd2\xdb\xae\x87\x55\x17\x71\xd8\x74\x2f\x35\xab\x88\x5b\xbe\x60\xd3\xfd\xb0\xa4\x2c\xee\xd1\x6f\x10\x7f\x16\x82\x9b\x74\xe3\x58\x94\x7a\x9a\x57\x75\x0a\xa8\x4f\x3b\xe0\x35\xd7\xa9\x24\x37\x89\xf9\xb3\xe4\xb2\x38\x14\x14\x25\x6a\x5e\x16\x55\x75\x64\x83\xb8\xf3\x62\x6b\x6c\x13\xfc\x6f\xac\xe3\x4a\xee\xaa\x6d\x5a\x9b\x8e\x65\xfa\xc6\x2b\xa1\xe0\xbb\x3f\x38\xb3\xee\x3b\x84\x90\x26\x10\x1a\x5b\x09\xff\x54\x30\x87\x5a\x12\x17\x59\xcf\x4d\x69\x54\x41\xf1\xd2\xa8\x9e\xa7\x15\xce\xe6\xb8\x80\xc8\xd8\x72\x11\x68\x00\x9e\xd4\x02\x92\x64\xa3\x41\x50\x4b\x4f\xcb\xa8\x16\x75\x3e\xc6\x77\x5a\x20\xd5\x4f\xb0\xa0\x25\xde\x69\xb6\x6b\xc0\xa3\x7d\x01\xe5\x86\x9d\xa2\xd7\x9b\xac\xd8\x91\x8b\x90\xdb\x59\x64\xda\xb4\xf2\x26\xc9\xd3\xbf\xdb\x56\x88\xfb\xdd\x5f\xc7\xb8\xfc\x6b\x9f\x96\x8b\xaf\xc6\xda\x25\x1d\xa4\x81\x97\x56\x88\xb2\xc4\x6f\xdd\xea\xbc\x76\x1f\x68\xdb\x25\xc8\x20\xb5\x10\xef\xf2\x9a\x07\x56\x9b\x6b\x7d\x03\x39\x89\xd1\x39\x6f\x87\x12\xb4\xd4\x21\x28\xf1\x33\x0c\x27\x4a\xca\xf9\x4a\x2d\xb7\x18\x18\x70\x30\x24\xc4\x6a\x06\x98\x12\xab\x1c\x68\xd7\x84\xd9\xb6\x34\x37\x1c\x7a\xf7\x59\x7a\xe1\xb7\x8c\xa9\x71\xec\xbc\xc1\x39\xef\xf3\xf8\x3f\x64\xe9\x72\x41\x8f\xf1\x42\xb7\xeb\xfb\x99\x8f\xd9\xb8\xda\xeb\x6c\x35\x6b\x58\x6c\xf2\xbd\x9d\xf4\x1f\x8d\x92\x44\x54\xbf\xdd\x30\x3e\x0d\xc7\xcb\xaf\xcc\xbb\xb7\x43\xed\x75\xf9\x92\xa6\x63\x26\xde\x83\xe1\x24\xe7\x2e\x7c\xb6\x40\xff\x87\x36\x81\x7e\xf9\xb6\xb9\x78\x1b\x72\x39\x47\x01\x99\x15\x1b\xdc\xa6\x15\x2d\xf3\xc3\x74\x13\x42\xbb\x81\x94\x0d\xd0\x86\x88\x68\xd1\x47\x8e\x63\x85\x88\xa6\x9c\x3c\xb9\x6d\xbb\x2b\x18\xf7\xdf\xed\x2e\x24\x67\xaf\xe2\xbd\xc3\xdf\x84\x86\x10\x96\x62\xa3\x4b\xac\x67\x2a\x1a\x44\x61\x61\x07\xe4\x50\xe0\xa1\xef\xf6\xb1\xa5\x2a\x52\x9d\xe1\x68\x3a\x38\xeb\x77\x54\xad\x3f\xd5\x84\x65\x73\x84\x2b\x20\xef\x24\x36\x80\x38\x50\x1f\x33\x5e\x21\x6f\x43\xa9\x93\x85\x35\xc3\x6c\x98\xb4\x65\xb0\xa8\x6c\xcb\x5d\x04\x70\x08\x60\x53\xa1\x91\x5f\x7d\xb4\x90\x0b\xac\x56\x99\x4e\x2a\x64\x25\xa0\x0f\xba\x7d\xb3\xc9\x8c\xeb\xfd\x92\x9b\x94\x70\x7b\xdc\xc8\x49\xd0\x9b\x18\xc5\xf6\xd9\x11\x57\x9c\xb7\x24\xca\x30\x70\x95\x2e\xdd\xbe\x36\x66\xc2\x8d\xbb\xfb\x9b\x4f\x85\x92\x5c\x6e\x20\xd9\xa9\x22\x26\x46\xbe\x4b\x4b\xef\x97\xee\xa4\xbe\xd5\x54\x36\x0d\x15\xfd\x47\xc8\x59\xc4\xe3\x9b\x17\xe5\x1a\x49\x29\x21\x71\x89\x39\x0e\x1f\x14\xa9\xe5\x4c\x29\x4e\x9f\xa7\xb9\x0d\xfc\x25\x99\x70\x8f\x8d\xad\x05\x27\x28\xa1\x85\x1c\x5c\xde\xa2\x61\x1b\x95\xd8\xc5\x5d\xde\xba\x6e\xa8\xe7\x8f\xdd\xcb\x45\x7e\x53\xa5\x44\x22\x08\x24\x64\xc9\x62\xa1\xf3\xc5\x76\xcd\x46\xb4\x37\xc3\xbc\x81\x71\xb7\xfa\x47\x2d\xd6\x73\x39\x70\x59\xeb\xa2\x86\xb8\x15\x97\x76\xd6\xe5\x16\x57\x09\x76\x78\x4f\xd6\xa1\xb5\xe7\xce\x89\x01\x0b\x7a\x4d\x11\x00\xf8\xfb\xba\xc1\x2a\x01\xb5\x25\xd8\x58\xd9\x42\xb3\xce\x1a\x05\x87\x9f\x93\xdd\x81\x07\xf8\x45\xbf\xcd\x16\xc0\xc7\x18\x3c\xd1\xee\xf3\xc8\x80\x9c\x1d\x54\x78\xd2\x63\x52\x4a\xde\xa5\x64\xcd\x7d\xc4\x7c\xd1\x82\x60\x80\x04\xf7\x27\x70\x3b\xe4\x88\x3f\x8f\x8d\x1b\xc5\xf0\x10\x70\x76\x85\x2d\x06\x1f\xb9\xce\x33\x63\x3f\x98\x89\x11\x82\xa8\xf0\x4c\x99\xd9\x30\xfd\x0d\xcc\xdb\xf6\x38\xd6\xbd\xb1\x2b\xaa\xb6\xf3\x02\x22\x56\x71\x27\x2c\x65\x79\xc8\xd7\x93\x02\xca\x62\x21\x50\x1d\x4c\x29\xbe\x1b\x37\xb8\x9b\x6a\x16\x20\x80\x52\x51\xa8\x1e\x22\x94\x3d\x23\xac\x37\xba\xac\xf4\x82\x4a\xfa\x83\x8a\x17\x2e\xb2\x61\x56\xa6\x06\x50\xdc\x82\xff\xc0\xc5\xd3\x50\x2f\xcb\x35\x6e\xb6\xe3\xa5\xbe\x49\x4a\x4c\xf9\x84\x4e\x4e\x45\xd5\x57\x6a\xca\x17\x31\xfe\xc6\xab\x3a\x58\x14\x1a\x01\x34\x68\x33\x0a\x2d\x23\x0b\xf9\xd1\x78\x93\xa3\x36\x81\xb8\xd6\x2b\xe3\x5d\x96\xb7\x08\xc0\x80\xff\x44\x08\xab\x45\x62\x06\xa5\x59\xe6\x14\x76\x7e\xae\xe5\xc9\x5c\x42\x2f\x92\xaa\xc8\x6d\x31\x30\x92\x98\x24\xe5\x8e\xc9\xd1\xa9\x0a\xd0\x0f\xb8\x36\xc2\xac\xbc\x2b\xf8\x63\x74\x00\xb7\x9c\xbf\x54\x52\xa4\xce\x9d\xf8\x43\xb1\x54\xef\x59\x2d\x5b\x2c\x69\x49\xe7\x29\x2c\xec\x2c\xb9\x83\x03\xd2\xcc\xd5\x02\x2b\x7f\x39\x14\x16\xb9\xc9\xa1\x9d\x5b\xb9\x66\x1e\x9a\x76\x36\xe2\x0b\xf6\x73\xc6\xb4\xf0\xa6\xb0\x4b\x38\x71\xd2\x7b\xda\x53\xaf\x34\xe8\x93\x84\x92\x4d\x79\xdf\x8f\x1c\x67\x2b\x5f\xc4\x3e\xa3\x56\xc6\x50\x88\x7f\xe3\xa8\x90\x6e\x95\xbf\x97\xa6\x83\xe9\x65\x3f\x6a\x51\x54\x68\x08\x33\x14\xe5\x83\xda\x0c\xb1\xad\x2f\xaf\x8a\x4c\x67\xbb\x06\xa6\x6b\xa1\xd1\xd5\xb4\x7b\x6f\xb3\x29\x8b\x4d\x99\x1a\x7b\x13\x3a\xb6\x74\xf4\x75\x02\x5f\x26\x83\xa0\xac\x91\xb6\x5d\xa3\x99\x5d\xa6\x15\x9c\xb6\x96\x3b\x94\xf9\x25\x4b\x4e\x62\x82\xcd\x23\xb3\x98\x4d\xaf\x98\xaa\x7c\xd4\xa5\xd3\x42\x03\x42\x31\xaa\xf1\x86\x3f\x4b\xfd\x75\xd0\x7a\x81\xa7\xe4\x05\xb1\x66\xd6\x2b\x5d\x94\x3b\x2f\x75\x54\x17\x65\x2d\xe3\x0b\xb9\xbe\xc9\xd2\x1b\x9d\xcf\x75\x37\xb2\xa9\xe3\x28\xc8\x1d\x6f\x1f\x5c\xb5\x96\x42\x66\xa1\xb3\x74\x06\x16\x10\x34\xe8\xa6\x2c\xaa\x2a\xdb\xd9\xd7\xd4\x2a\x99\xd7\x55\x77\xff\x2a\xc7\x33\xce\x3b\xd2\x81\x9d\x92\x55\xe4\x29\x88\x00\x13\x87\x42\xf2\x1e\xa1\x2b\x94\xac\x60\x1e\xdd\x65\xd4\x01\x61\x92\x64\xf0\x41\xa0\x4d\xa5\x28\xbf\x45\xf2\x41\x79\x01\xeb\xd2\xd3\x09\x3a\x5f\x25\x66\x28\x8c\x0b\x4c\x42\xf5\x41\xc9\x7c\xc8\x2e\x66\x56\x39\x9d\x09\x5b\xfc\x4d\x9a\x5b\x36\x0f\x77\xea\xe1\x86\xbd\x37\x3b\xc0\x2d\x31\x9d\xcc\x0a\x5c\x82\x37\x45\xb1\xb8\x4b\x33\x0c\x0a\x7e\x54\x55\x5d\x6c\x36\xc9\x0d\x88\xe1\x11\x2e\x72\x99\xa4\xd9\x16\x39\xee\xd6\x49\xb6\xdc\xe6\xce\x78\xf0\xa8\xa5\xa9\xf4\xde\xf2\xc2\xdb\x7e\xe3\xcb\x74\xd5\x75\x40\xc5\x46\xcc\xcd\x46\xbb\x93\x05\x96\xce\x72\x48\x02\x2a\xb9\x89\x83\x85\xbe\x47\x0f\x86\x85\xfa\x6b\xac\x7a\xc0\xac\x6e\xba\xfc\xde\x4a\xbb\x94\xb2\x84\x40\x2c\xed\xf7\x2b\x63\xce\xee\xdb\x6d\xf7\x26\xb3\xee\xa5\xd5\x69\x72\xea\x20\xdf\x3b\x0b\x5f\x58\x56\x16\x47\xd4\x62\xf9\x59\x44\xc6\xb3\x9d\x68\x87\xaa\x88\x1d\x69\x77\x95\x56\x70\x53\x38\xe2\x37\x6b\x66\x5b\x76\x1d\xe3\x3c\xd8\x81\x81\x61\x13\x8f\x14\x45\xbb\xc0\xdf\xd6\x4a\xbd\x83\xe1\x57\xfa\xb5\x39\xe3\xdc\x09\x07\x6d\x8c\x9a\xb4\x3c\x2e\xe6\x20\xe6\x96\xe2\xb8\xb9\x2b\xfb\x6b\x12\x50\x44\x6a\xa1\x97\x3a\xa7\x58\xd3\xaa\xc8\x5a\xae\x9d\x55\x52\xae\xe1\xb8\xb8\x97\x96\x02\x37\x20\x46\xb0\x92\xaa\xd2\x25\x38\x72\x18\x0a\x8d\x9a\xeb\x6e\xb6\xa3\xdb\xdc\xd6\x3f\xb8\x51\x6b\xd0\x04\xc9\x3c\x68\x92\xb9\xf7\xc7\xaa\x3f\x44\x29\x96\x16\x3c\xd7\x41\xef\xea\xaa\x3f\x3c\x1f\xfc\xf9\xa5\x99\x1c\xf0\x63\x37\x9b\x0c\x4d\xab\xfb\xc1\x73\x75\x81\x2d\x32\x1b\xf3\x60\xfa\x65\xdf\x8b\x08\x58\x70\xe0\xfb\xc1\xb3\x22\xcd\x74\xb9\xc9\xcc\x71\xca\x22\x54\xd6\xce\x5e\xa6\x3a\x5b\x54\x4a\xe7\xf3\xac\x40\x26\xcd\x83\x59\x99\xcc\x3f\xea\xba\x52\x9d\xff\xf8\x6b\xc7\x58\x2e\xc6\x8f\xa6\xeb\x67\xc7\xcb\x86\x98\xa3\xc1\x0f\x12\x9e\x62\x7c\x70\x78\x5e\xe4\x3f\xb9\x20\x02\xd6\x64\xe2\x03\xff\xaf\x2e\x38\x9f\xe0\x9d\x55\x2b\xe6\x00\xb3\xaf\x46\x5b\xfa\x40\x5c\x9d\x78\xc2\xe4\xb5\xaa\x76\x79\x9d\x7c\xb2\xb9\x45\xf0\x53\xf1\x9d\xb1\x7a\xaf\x31\xc8\x59\x6a\xfc\xf4\xe2\x00\x63\xfa\x44\x9d\x06\x0b\xa4\xaa\x88\x0c\xcc\xb8\x23\x82\x1e\xc1\xdc\x9f\x94\xa7\x94\x5c\x0d\x45\x0e\x43\x08\x44\x78\x9d\x4d\x99\x42\xf4\xd7\x9c\x94\x1d\xd6\x3c\x68\x20\x3d\x4c\xd3\x74\x52\xa5\xba\x3c\x60\x52\x6d\x4a\x5f\x0a\x72\x3c\xf6\xcd\x93\x72\xbe\x4a\x6f\xcd\xa9\xe6\x92\x73\xff\xb1\xdb\xed\x76\x7f\x55\xff\xc1\x62\x5c\x41\xba\xf2\xaf\x3c\xe3\xa2\x7e\xef\xe0\xde\xa5\x11\xa9\x77\x12\x90\x69\x5a\x6d\x51\x82\xdd\xdf\xd8\x82\x3f\xf8\xd2\x6a\x45\x3e\x55\x0e\x1e\xa8\x55\x3c\xb8\x1f\x57\x4a\x48\xe5\x83\x2f\xb7\x69\x0f\xaa\xdf\x51\xe4\x48\xc6\xeb\xc1\x57\x30\x5e\x0f\x9c\xf1\xfa\x45\x65\x8f\x07\xd2\x92\x7b\xb8\xf6\xf1\x1e\xe8\x78\xfc\xa4\x7f\x7d\x75\x79\x74\xf2\x2d\x01\xe0\x0f\xe8\xff\x9c\x3c\x3b\x3d\x0e\xf1\xdf\x3f\xff\xfc\x43\xff\xe7\xbb\xfc\xf4\xb7\x65\xb1\xd1\x49\xae\xae\x01\xde\x7a\x05\x29\x6e\x5c\x38\x73\xad\xde\xc5\x27\xf1\xf1\x81\x59\x21\x96\xa3\xda\x7e\xc1\x1d\x22\x00\x09\x07\x77\xfc\xfe\xa7\xe1\xb9\x62\x9e\xd6\xe9\x4a\x76\x17\x69\x67\xd9\x2a\xe4\x43\x09\x28\x06\x18\x9b\x13\xb0\xb0\xa1\xa4\x7b\xb9\xd7\xe6\x1a\x33\x74\x5b\x57\x7b\x84\xe1\x3d\xc1\xea\x61\x4c\x6c\xc4\x02\xc9\xd3\xd2\x3d\x81\xde\xc6\x6c\x3a\x87\x3e\xcf\x0e\x18\x01\x5b\x3c\x2f\xe6\x66\x6f\x32\xb8\x8f\x0e\xe3\x10\x46\x84\x02\xda\xb2\x31\xdd\xf8\xc0\xab\x4a\xe6\x54\xdc\x63\x7b\x68\x3c\xad\xdc\x8f\x21\xb5\x0c\x9c\x31\xa2\xe9\x66\xf6\xaf\x7b\xa6\xc8\x59\x03\x4e\x12\xb8\xc7\xdc\x1f\xf7\xde\x5d\x75\xd8\xe2\x97\x07\xcd\x0b\x47\xc1\xaa\xc1\x05\x44\x76\x3c\x1d\x7e\x9c\xde\xdc\x59\x8c\x66\x92\xab\x15\x50\xc3\x02\x57\x3b\x38\xc1\x75\x11\xe4\x05\xf9\x91\x71\x13\xdf\x4e\x8e\xa9\x1c\x97\x28\xe8\x28\x91\x47\x24\xb7\x3a\xf8\x83\x79\x79\x9a\xdf\x70\xb6\xec\xff\xfb\x7f\xfe\x5f\xb0\x3b\xe8\x31\x2f\xfd\xe5\x14\x7c\xc8\x9f\x35\x4b\xe5\x89\x0b\xf8\x25\x9e\xe1\x6d\xf7\x0d\xd9\xed\x0e\xb9\xe4\x82\xf7\x76\x16\x9b\x4b\x31\x12\x08\xd3\xc4\xd7\x7c\x41\x57\xab\x2a\xcc\xef\x05\x21\x1d\xfe\x8d\x8c\x90\xa4\x62\xaa\x6f\xd9\x8d\xd0\xad\x79\x69\x31\xa6\x28\xef\xcd\xcd\x27\x28\x3b\x99\x61\xae\xa6\x5d\x5e\x33\x3a\x22\x20\x28\x30\x52\x37\x16\x89\x8d\x1e\x3a\x79\x14\x82\x31\x8a\x50\xde\x5c\x84\xf2\x70\x11\xcb\xfd\x06\x8a\x13\x92\xb2\xbd\x54\x5c\x4d\x3e\xb7\xfc\xf7\xfe\x4b\xad\x91\x00\x68\xda\x05\x62\x4a\xc0\xca\x4b\x97\x3b\xd6\x8b\x02\x47\x3b\x18\x8a\xdf\x70\xf0\xe9\xcd\x80\xf1\xc3\xb0\x0d\xf6\x5b\x80\x8d\x92\x3b\x69\x7e\xa4\x5c\xb2\xb0\xcd\xeb\x72\xa7\xd6\x18\x18\xc6\x06\xf4\xca\x3a\x9d\x67\x5a\x9d\x3c\x0f\x97\x12\xec\xa2\x96\xe6\xd3\x52\x49\xeb\xaa\x31\x55\xe1\x23\xc4\x82\xc0\x27\xad\xb6\xeb\x24\x3f\xb2\x79\xb9\x30\x29\xe9\x8e\xd3\x1a\xa8\xf0\x81\xf5\x3b\xbf\xd5\x39\xd0\x7b\x41\x1d\xbf\x2e\x36\x19\xb1\xb5\x6d\x17\xe8\xd1\x63\xfc\x37\x7c\x77\xb0\xe8\x5e\x52\x01\xa5\xa5\x4d\x31\xbb\xdf\x49\x9e\x81\x3f\x6f\x11\xde\x98\x9a\xa2\xa6\x98\xed\x58\x53\x9d\x0e\x40\x62\x37\xa5\x16\x90\x69\x8a\x3c\xc0\x7c\x6d\xca\xe2\xa6\x4c\xd6\x61\x53\x78\x07\xe1\x18\x00\xa1\x0a\x66\x44\x30\x42\x85\x12\xfb\x94\x49\x14\x62\x08\xcd\x3d\x29\xc2\x9d\x81\x45\xe5\x9f\x04\x01\xed\x02\x32\x78\xee\x79\xed\xdd\xaa\xe0\x94\xf8\x7d\x8f\xf7\xc3\x61\x0e\x34\xe2\xae\x4b\xd8\x81\x16\x57\x1f\x2c\x8d\xf6\x21\xd1\xe0\xe0\x40\x39\xc4\x23\x1a\x99\x7c\x24\xb5\x9b\x6d\x65\x2c\xcf\x40\xd2\xbf\xfd\x5a\x72\xc3\x83\x67\x4b\x20\x0c\x6d\xc6\xf7\x4c\xa2\x35\xb1\x19\x09\x92\x91\x91\x50\x47\xa4\x6e\xd2\x5b\xf8\xff\x4c\xe7\x18\xd1\x2d\x75\x8e\xa1\x3a\x19\x9c\x89\x24\xf0\xd3\xfc\x27\xa0\xc0\xd6\x69\x8d\xff\xd5\x26\x32\x68\x8f\xcf\x48\x15\xf9\x51\x96\x22\x26\xab\x58\x2e\xe1\xdf\x51\x1b\xb6\x83\x50\x4d\x28\xee\x91\x64\x7e\x28\x63\xcf\xf8\x31\xa8\x72\x22\x6b\xd2\x02\x36\x24\x79\x70\xce\x35\x66\x33\xc4\xe1\xff\x3b\xf4\x69\x00\xa5\x78\x24\x80\x6c\x19\x1d\xab\x75\xa1\x16\x41\x4d\x72\x64\x6f\xf3\x05\x17\x85\x78\xce\xe4\xad\xae\x84\x30\x61\x70\xe3\xbb\x25\xe6\x05\x1a\x09\xf1\x32\x4f\xcb\xf9\x76\x4d\x82\x6f\x0c\xfd\x4f\xb2\x0c\x97\x53\x24\xbe\xed\x0b\x61\x83\x81\x26\xfe\x2a\xd2\x4d\xde\xfb\xa9\x94\x37\xf9\xd8\x02\xe7\x0c\x2e\xa1\xf0\x91\x62\x8b\xf3\x6e\x42\xa8\x67\x88\x87\x77\x2c\x6f\xc0\xa9\x6f\x2f\x5f\x4c\x8e\x42\xf2\x5d\x5a\xae\xb4\x7c\x18\xfa\xe3\x3d\x1a\x5a\x4b\x38\x52\x0b\x2c\x8d\x5a\xee\xe6\xa8\xb5\xc9\x6d\x40\xd3\xc6\x1b\xe5\x17\xcc\xde\xa1\x5c\x52\x5e\x3f\xf2\x3b\x6e\xdd\xd8\xe5\x2a\x33\x96\x8d\xef\x52\x12\xae\x70\x1f\xa7\x8a\x47\xce\x38\x2c\xb8\x92\x1e\x8c\x4b\xcb\x40\x5d\xf1\x7a\x58\x27\x75\xe5\x52\x05\x79\x71\xa7\x3e\xe6\xc5\x1d\xdc\xea\xc0\x5c\x4c\x30\x34\x00\x9a\x55\x6a\x99\x94\x3c\x5e\x81\xb3\x8f\x6a\xf1\x95\xaa\x8a\xd8\x5a\x82\x7c\x01\x43\x9e\x18\x10\x6a\xeb\xc2\xec\x55\xa6\x0b\xda\x6c\x90\x6b\x44\x6c\xba\xbb\x24\xbd\xd5\x15\x18\xa2\x76\xe6\x6d\xf2\xc4\xfc\x56\x3c\x21\xe0\xdb\x4c\xcc\x86\xc2\x6d\x6d\x1a\x24\x4d\x0d\x58\x3b\x4e\xa3\xa7\x5e\xb9\x1d\xc9\x15\xa7\xf3\x22\x2f\xd6\xe9\x5c\xca\x83\x90\x20\x7c\x96\x56\x8c\x57\xf3\xce\x07\x87\xe0\x95\xe6\x57\xf3\x58\x50\x4e\xb6\x0a\x8f\x71\x7a\x85\xc5\xcc\x20\xb0\x63\xa5\xb3\x86\x01\x1a\x05\x5d\x64\xc8\xeb\xce\x76\x4a\xb8\x55\xc1\xe9\x26\x36\x5e\x8b\x1d\xcb\x78\xe7\x33\xbf\x24\xa1\xc1\x6d\xda\xe8\xb5\x04\x3b\xd8\xe7\x53\x5c\x05\xa8\x0c\xaa\x16\x59\x0c\x84\x7f\x04\xf6\x49\x80\x98\x12\xee\x56\xf3\xb3\xc1\x2a\x71\x39\xce\xdc\xa9\x4b\x26\x6a\x9d\xcc\x57\x69\xae\x5b\x41\x50\x81\x3a\xa3\xbb\x5c\x1c\xde\x07\x62\xda\xf2\x3b\x08\xfc\x65\x54\xad\x7d\xbb\xb4\x58\xa8\x86\x13\x4c\x15\x0c\xeb\x3b\x1f\xed\x5e\x17\x2e\xac\x28\xa3\xf3\xd4\x9c\xc4\x45\x95\x02\xde\xd6\x81\x3a\x65\xe3\x8d\x39\x9c\x54\x29\x61\x7a\xcc\x2a\x23\xfd\x5a\xc1\x21\x9c\x54\x0a\xba\x45\x5b\xd5\xb6\x9c\xd9\x3f\x61\xf1\x89\xf3\xac\x69\x77\xd9\x36\x31\x4e\xf3\x52\xc4\xb6\x0a\x81\x90\x31\x7f\x1e\x12\x60\x21\xcd\x1b\x6e\xbb\x55\x27\x37\x2f\xd4\x9b\x92\xb7\x9f\xb3\x86\x88\x05\x10\x4a\x4a\x6b\x42\xf1\x01\x28\x1a\x82\x9a\xe4\x60\xb8\xc8\x9a\xdb\x11\xbc\xa9\x58\x8c\xc1\xdb\x05\x58\x97\xda\x7a\x6b\xca\x00\x47\x64\xf7\xff\xa7\x55\xb2\xad\xdc\x26\x10\x07\x2a\x22\x70\xd1\xda\x90\x87\x9e\x18\x10\x38\x8c\xeb\x82\x11\x2e\x23\x91\x1e\xf2\xc3\xab\x76\x3f\xdd\x70\x9d\x81\x68\xb3\xf3\x52\xf0\xe0\x49\x2b\x49\x64\x02\x9c\xce\x92\xbf\x04\x13\x37\xe2\x55\xa8\xab\x64\x77\x3e\xbf\x32\xa6\xfb\xc1\x4b\x5a\x95\x81\x0b\x0e\xa6\x44\x4f\x60\xaa\xa0\x4d\x2f\xfd\xb9\xc2\x2c\xed\x47\xad\x37\x66\x5e\x8d\xc9\xd8\x8a\xd6\xf4\x34\xf1\x2a\x8b\xce\xe2\x54\xa4\x87\x23\x84\x12\x5c\xef\x0c\x25\x53\x85\x7e\xb5\xf0\x40\x15\x0e\x3e\x10\xfb\x36\xf5\x1e\xf9\x2a\x21\x7e\xc2\x02\x40\x8d\x98\xf7\x7c\xaf\xb0\x15\x2c\x96\x95\x7e\x52\xad\xf4\x43\x5e\x4a\x5b\x73\x1c\xfe\x36\x30\x8e\x1e\x0d\xc0\x75\x8d\xe0\xfc\xab\x45\xf2\x32\xc1\x27\x60\xe3\x03\x8f\x1c\x96\xe1\x59\xb1\xd9\x65\x7a\x09\x78\xf1\x6d\xa5\x5f\xf2\x61\x6b\xdb\xf8\x90\xdf\xe5\x1b\xe2\xde\x0e\xaa\x5a\x73\xb1\xf7\x85\x1d\x48\x1f\xf4\x41\x67\xc4\x12\x2a\x2f\x8a\xfc\x01\x51\x87\xb9\x0e\x06\xfd\xd0\xf2\x8b\xf2\x79\xd7\x65\x44\x60\x9b\xf4\xd8\xfd\x00\x2d\xef\xfa\x6c\xf6\x56\xe8\x92\x49\x59\xb2\xfd\xbe\x18\x4e\xc9\x7a\x93\xd4\x9c\x2f\xdf\x37\x2f\xe7\xcd\x79\x39\x93\xf3\xd2\x2c\x9c\x6a\x58\xbd\x62\x26\x66\x05\x65\x81\x1a\x11\x0d\x95\xe4\x78\xa6\x41\xf0\x25\xf3\x43\x87\x89\x6d\x6c\xa6\x65\x34\xef\x51\x73\x48\x16\xe8\xbd\x53\xd8\x7c\xbc\x2b\xec\xac\x8c\x61\xc3\x1f\xc4\x61\x8a\x54\xa7\xf9\x8d\x0e\x9e\x1e\xd6\x04\x23\x93\xae\x22\x8b\x8d\x0f\xff\x84\xeb\xb0\xfd\x2b\x57\xae\xa3\x09\xe6\x36\xe5\x3c\xfc\x54\x79\x07\xa6\xeb\x47\xb3\x1d\x50\xd2\x9f\x99\xe9\x87\x83\x64\x95\x56\x4f\xcc\xb8\xb6\x7d\x3d\x8c\x8d\x16\xcd\x9b\xa2\xe5\xf9\x78\xee\x6e\x4a\x6d\xbc\x1f\x58\x4a\x96\xbd\xd6\x7c\xcb\x8b\x39\xbd\x5f\xe9\xdc\xf3\xd1\x9b\x9b\x1b\x4b\x14\x42\x37\x3b\xf2\x97\x21\x6c\x44\x8b\x6a\x65\xd3\xea\xe8\x61\xdb\xca\x19\x44\xed\xd6\x4c\x6a\x0d\x44\xde\xeb\x2d\xe6\x8c\x75\xf3\xf6\x5a\x33\x5a\x7f\xb1\x35\x83\x95\x9e\x57\x65\x51\x63\x3d\xdc\xcb\x3d\xa1\xcf\xaf\x84\x62\xfc\x07\x44\x2f\x86\xd6\x28\x83\x3b\xcf\x56\x09\x3e\xac\x67\xeb\xd3\xd9\x60\xb1\x75\xe9\xc2\x55\x2b\xc9\x03\xe2\xbb\xca\x3d\xb6\xd5\xee\x6a\xb2\x50\xa7\x15\x49\x90\xcf\x76\x6a\x95\xae\x71\xdb\x94\xee\x30\xaa\x0b\xfb\x6b\xbc\xf0\x92\x9a\x2f\x64\xae\x65\x02\x4a\x15\x3c\xcf\x30\x85\x84\xb8\x2b\x9c\xbb\xf0\x04\xee\x87\xa8\x95\x47\xf4\xc1\x8f\x96\xd3\xdb\x67\x65\x9a\xdf\xf8\x69\x33\xa0\xb4\xfe\xee\x9d\x01\x6d\x82\x0f\xc5\x96\x68\x17\x5c\x12\x80\xea\x92\x83\xed\xdd\x9c\x45\xbf\x54\x59\x0e\x0e\xb9\x92\x14\xf9\x12\x11\x2c\x2c\x97\xf4\x8b\xe8\x3c\x2f\xe6\xa1\x7b\xfb\x5e\xc0\x2c\x2f\x38\x5b\x0f\x87\x17\x54\x9a\x63\xac\x19\xb4\xe6\x6d\xa4\x9a\x8e\x00\x52\x70\x82\x32\x75\x9c\x80\x7c\xbb\xd6\x65\xb1\xad\x64\x05\x63\x15\xab\x81\x15\xe0\x4b\xd4\x32\xcd\x51\x6e\xe0\x8e\x77\xcd\x1a\x83\x49\x25\x6a\x62\xb2\xb2\xd1\x42\x2f\xf5\x1c\xfd\x80\xce\x6c\x7b\x53\x75\x54\x9a\xaf\x10\xd5\xcf\x17\x49\xbd\xc3\x20\xa3\x4b\x34\x21\x69\xb1\xe5\x57\xe2\xab\x0d\x0d\x7b\xdc\xe3\x51\xbb\xf3\xdb\x88\x43\x33\xf0\x21\xa9\x54\x5a\x75\x48\xc0\x11\xe2\xf5\x04\xb2\x95\xa0\x5a\x0c\x8d\x7e\x4c\x11\xa9\x3e\x27\x7e\x66\x37\x35\xf7\x89\xfa\xab\xb5\x2e\xe7\xab\x24\xaf\x13\x86\x90\x2d\xd3\x3a\xb7\x98\x2e\xa9\x36\x41\x18\x9c\x48\x25\xb3\x8a\xc3\x28\x62\x9c\x74\x59\x16\x65\x05\x30\xbb\x6d\x99\xcc\x77\x18\x1e\x95\x85\xa3\x50\xfb\x74\x9f\xd4\xb6\x48\x0f\xbb\x2d\xe9\x95\x34\x73\x1e\xe7\x45\xeb\xfa\x82\x23\xbd\xd5\x7b\xd8\xc1\xaa\xca\x95\xae\x2a\xc2\x80\xca\x32\x22\xe9\x83\x24\xce\x20\xb4\x41\x5a\xeb\xb8\x21\xe2\x97\x23\x39\xde\x05\xf3\x4b\xb8\xb6\x2d\xc6\x11\xf6\xad\x45\xeb\x70\xd8\x11\xe6\xed\x2e\xcd\x96\xdb\x4c\xad\xd3\xca\xbc\x74\x8b\xf5\xb7\x8c\xd2\xb4\x3c\xbd\x24\x9f\x5c\x17\x36\xf0\x8d\xf1\xee\x2a\x8c\xa3\x99\xbb\x35\x15\x38\x61\x87\xa5\x5d\x5a\x92\xf7\x26\x0b\xd5\x3a\xa9\x75\x89\x3a\x40\x18\x69\x8b\x42\x80\xac\x59\x5a\x91\x05\xc7\x0a\xf4\xab\x5d\xad\xa5\x87\x87\x5d\x3e\x72\xf1\x45\x5f\x19\xff\xca\x4f\x58\x24\x75\xc2\x60\xd8\x06\xfc\xd5\xe3\xe6\x14\x91\xff\xcf\x86\xbb\x0a\x68\x67\x73\x1a\xdc\xd0\xe3\xde\x46\x29\xa0\x02\xfd\x3f\x98\x69\x87\x95\x04\x4a\x50\x0a\xb4\x62\x5d\x2e\xfc\x02\xb1\x85\xc1\x32\xfb\x55\x0a\xaf\x8a\x62\x5c\xf3\x37\x84\xd2\x36\x80\xb4\x8d\x40\x48\xb3\x4e\xad\x89\xa4\x35\x07\x09\x3a\xd6\xb9\x57\x81\x65\x6b\x4b\xbe\x3f\xda\x96\xac\xac\xfb\xf0\xb6\xf3\xdf\x89\xb7\xdd\xb5\xe3\x6d\x77\x8f\xc7\xdb\xb6\x5f\xb8\xb4\x16\xff\x81\x81\xb8\xad\x38\x5c\x88\x16\x99\xf1\x01\xa9\xba\xe4\x56\xd3\x80\xea\xc5\x67\x20\x71\x01\x35\x72\xcc\xa0\xf0\x44\xc4\xdf\x83\x24\xdc\xc6\xa9\x73\x84\x58\x1b\xf2\x2e\xed\xdb\x67\xc6\x95\x4e\x91\x05\x07\x6f\xca\x74\x5e\xe4\xaa\x33\xc0\xf1\xeb\x30\xe6\xc6\xdd\xab\xb3\xa2\xae\x0b\x2c\x4b\x56\x77\x69\xbe\x28\xee\x38\x95\xc4\xdb\x04\x00\xaf\xe1\x8b\x89\xd2\x68\xb9\x4c\x4b\x26\x74\xaf\x90\x0f\x41\x4c\x28\x93\xbe\xdf\x25\x3b\x5e\x75\x45\xb9\xf0\x01\x99\xe5\x36\xa3\xf3\xd4\x4b\xa1\xc4\xea\x4c\xf4\x03\x89\x02\xe6\x45\xee\xe2\xcb\xb8\xf6\x50\x96\x10\xaa\xd4\x05\xe9\x47\x12\x8c\xa8\x68\xb7\x2d\x01\xc0\x6a\xe3\xb6\x52\x36\xa4\x37\xc1\xa6\x67\xbb\x08\xa0\xa6\xee\xe9\x3b\x7a\xfa\x67\x3f\x16\xf9\x88\x2d\x7d\x9f\xb8\x31\x03\x72\x88\xd9\xce\xde\xe6\xa7\x61\xfb\x09\x16\x4e\x16\x72\xe3\x4e\xa9\x65\x1e\x9e\x55\x4c\x5a\xd2\xf1\x8c\x0c\x7a\x38\x7c\xe1\x1e\xf2\x40\xda\xed\xe4\x24\x56\x03\x87\xa4\xf6\x93\x8d\x94\x04\x83\xac\x22\x17\xc0\x3f\xf8\x6a\xf9\xce\xd9\x8e\x88\xab\x3c\xbe\xaa\x80\x69\x89\xda\x7a\x08\x60\x66\xa4\xa2\x03\x21\x1b\x38\x8e\x49\x44\x74\x51\xdc\xe5\x59\x91\x2c\xdc\xa3\x31\xc6\x0e\xf4\xc6\xb5\xb6\x82\xd0\x5d\x0e\xb8\xba\x46\x1a\x6b\x30\xd7\x68\x0d\x00\x87\x9f\xff\xa2\x44\xdd\xe9\x59\x95\xd6\xba\x4b\x4c\xcb\x5c\xdd\x6d\x13\x44\x5e\xfa\xb5\x06\x52\x0b\x37\x5e\xc6\xef\xc5\xe4\x36\x9d\x2f\x41\x4a\xd1\x95\x23\xc2\x37\x7d\x90\x36\x2c\xbf\xc5\xa2\xa4\x5a\xad\x20\x6b\x16\x06\x93\x57\xda\xec\x48\x95\xd6\x94\xe1\x15\x09\x93\xc8\xde\x6f\x8b\xc8\x18\x18\xa5\x5e\x78\x2e\x74\x13\x61\x85\x93\x7f\x1a\xab\x69\xa8\xff\xd3\x0e\x26\x98\xff\x5e\x3d\x26\x88\xe4\x99\x15\x44\xd2\x4a\x41\x7b\x54\x53\x1b\xd2\xf7\x14\x27\xa8\x85\x29\x65\x7b\xe0\x7d\xe6\xc6\x72\xef\xf4\x42\x68\xb4\x64\x05\x18\x65\x05\x91\x0a\x22\xbb\xf2\x97\x92\xd7\x98\x16\x1c\x8d\xf5\x6d\x60\x27\x93\xc1\x2a\x94\x95\x96\x5b\x48\x23\xec\x81\xae\x53\x27\x4e\x9e\xc6\xea\x6d\x5a\xcd\x75\x96\x25\xb9\x2e\xb6\x68\xe6\x90\x1d\xb9\x29\x35\x48\x58\xc2\x58\xf0\x51\xf2\x2b\x17\xd4\xca\xe5\x60\x19\xdb\xb8\x2c\xc0\x2c\xe5\x5a\x56\xca\xce\x74\x7d\xa7\x09\xcf\x79\x45\x5a\xfb\x89\xef\xeb\x5b\x9f\xde\x4e\x60\x4c\x92\x9e\x30\x68\x32\x38\x27\xdf\x0d\xf9\x30\x50\x5e\x52\x00\x2e\xd4\x66\x33\xcc\xb5\x30\x0d\xfd\x1d\x40\x11\x57\x3b\x57\xa8\x7d\x09\x8f\x84\xa7\x90\x7c\xb4\x7d\x8c\xb5\x4c\xbd\xf5\x6f\xab\xbf\x49\x34\xd3\x35\x8f\xad\x53\x51\x2d\x4f\xc5\x4c\xc6\x03\x5e\x9b\x09\x03\x34\x63\x33\xed\x9c\xd6\xd8\x02\x58\xd8\xa2\x1b\x36\x4b\xee\x01\x94\x29\x7c\x86\x1a\x8c\xe6\xc2\xac\x0b\x05\x5f\x91\xe4\xa4\xd6\xb6\x9b\xa5\x39\xd5\x28\x86\xba\x8c\xde\xa5\x50\x80\x8d\x0c\xbf\x4c\x45\x0c\x0d\xb7\x2e\xc7\xd0\x62\x90\x57\x6c\x55\x77\x14\x01\x48\xa7\x3c\x88\x9a\x9f\x6a\x9b\xa7\xff\xbd\xd5\xa1\x7c\x23\x6a\x48\xbb\xe7\x85\x8f\x83\xfc\x83\xae\x6c\x07\x58\xcd\xd5\x78\xad\x05\x92\x33\xc3\x65\x07\x1f\x73\x22\x68\x29\xa8\xe3\xcc\x32\x99\xbd\x39\x79\x16\xab\x3f\x6d\xcb\xb4\x5a\x60\xb2\x0f\xb2\x73\x60\xcb\x59\x02\xa4\x80\x03\xb6\x5e\x09\xac\x5e\xab\x24\x99\xf3\xda\xe4\x0a\x6f\x99\x28\x2f\x96\xc4\x86\xa9\x59\xd8\x2e\xba\xc4\x23\x17\x08\x2d\xfc\x4d\x34\xd9\xc5\xb3\xb7\xe8\x5d\xff\x69\x5b\xd5\xa9\xb3\xf8\x1a\x10\xf6\x54\x57\xf0\xe6\x2c\x49\x17\x70\x69\x81\xfd\xc4\x66\xc1\xd3\x5f\xf8\x8b\x53\x73\xdb\xef\x94\xae\xea\x04\xa6\x8d\x2f\x88\x26\x26\x3e\x6e\x19\xb6\x70\x0c\x68\x87\x7b\x78\xf4\xfd\xe3\x82\x2c\x48\x9f\x3b\xee\x7b\x46\xcb\xa5\xb0\xdb\xc6\xcd\x9c\x4c\x1a\x19\x9f\x60\x04\x1d\x1a\x40\xd4\xeb\x57\x80\x82\xa0\xcc\xd5\x76\x5e\x63\xd5\xf7\xa6\x4c\x21\x64\x3c\xdb\x56\x69\xae\x2b\x34\xef\x4e\x9e\xc7\xaa\xe7\x8e\x97\xcb\xe4\xce\xaf\xdf\xb7\x79\x86\x99\x6e\x28\x33\x43\x35\x4f\x30\x6d\x58\x5c\xc0\x08\xdb\xfb\x5b\x67\xee\x0e\x80\xf4\xe8\x1b\xe3\xac\x95\xe0\x52\x2f\x53\x19\xaa\xc9\x1e\x6a\xc3\x2b\x9d\xdd\xa4\x49\x8e\xd8\x9e\xa5\x84\xbe\x25\xe1\xfc\x9a\x3d\xf8\x3b\x97\xf8\x6f\xe2\xf9\xbe\x6d\xf1\x98\x75\x62\xfa\x9b\x17\x34\x02\xe4\x3b\x34\xfa\xae\xd2\xbc\xc2\xe4\x4a\xfb\x98\xc6\x07\xcc\x20\x7c\xd0\x92\xfc\xaa\x3a\xe4\x5b\x90\x95\xc7\x1b\xe5\x39\x42\xfe\x93\x52\xc3\x10\x99\xf6\xbf\x46\xcc\xaf\x57\x08\x52\x69\x75\xf8\xfa\xea\xb2\xab\x6e\x63\x75\xca\x1f\x1c\x6d\x74\xee\xd0\xa5\xf6\x73\xa3\x09\x7d\x2e\x3e\x89\xcc\xff\x3f\x8d\x8f\x0f\x2c\xec\x16\xe8\xd2\x83\x27\xdf\xc6\xea\xc4\x7d\xa6\x3f\xcf\xd2\x4d\xa5\xef\xff\xd0\x99\x9e\x9b\x4d\x02\x6f\x39\xfe\x97\x93\x91\x8a\x9f\xfc\xe5\xea\xf2\xe8\x34\x3e\xf9\xc3\xf4\x3f\x8e\x9f\x1d\x3f\x0d\xf5\x9f\x4e\x5e\xfc\xfc\xf4\x47\xfd\xd7\xf7\xf8\xf9\x4b\xb1\x69\xec\x8f\xc3\xbf\x98\xed\xe9\x2a\x42\x4f\x54\xaf\x05\x45\x36\x9f\x83\x4e\x13\xba\xa6\x4e\x18\xc3\x32\x5c\x51\x1c\x81\x7c\x27\x1d\xd6\xc2\x62\x2d\x54\x45\x12\x52\xfc\x65\x1b\xff\x9c\xeb\xb2\x26\xbc\x49\xa5\x0a\x73\x3a\x90\x72\xa5\x1a\xd4\x28\xf5\x9d\x55\x05\x7e\x54\x30\xf9\x26\x95\x7a\x7d\x75\x09\x17\x18\x9d\x59\x74\x84\x5f\x94\x5a\xa0\xd7\x2f\x8a\x6d\xbe\xc0\x43\xfb\xf0\x62\x72\xd1\x8d\x0f\x7c\x2e\x40\xa4\xb6\xc0\xac\x27\xd1\x21\x9b\xdf\xcc\x50\xed\xdc\x18\xa8\xd5\xfd\x64\x7e\xa8\xf6\x80\xc0\x54\xa8\x07\xf6\x08\xa5\xea\x3d\x94\x7d\xc8\x9e\xac\x6b\x96\x87\xf2\x1b\x55\x89\xd6\x40\x69\x85\x20\xbf\x43\x1f\x96\x66\x64\x47\x59\x76\x6f\xbe\x22\x9e\xa4\xaa\x46\x90\x37\xbf\x34\xb2\x1e\xa2\x6b\x92\x4b\x5e\x30\x98\xbd\xa5\x29\x62\x34\xb8\x29\x12\xc9\xfd\x2d\x5a\xd3\xaa\xa4\xc4\xc6\x3b\x15\x93\x51\x1a\x41\xa4\xb5\xac\x4f\xd7\xa0\x7b\x7c\x1a\xab\xa1\x4c\x91\x37\x56\xa7\x27\x16\xc5\xe9\x0f\x9d\x2f\x8a\x12\x09\x37\x36\x65\x01\x81\x0c\x8a\xa6\x57\x1e\xf9\x7d\x20\xa2\x75\x67\x1d\xc6\x54\x10\x7e\x8b\x1c\xbf\x35\xea\x5a\x36\x09\x8b\x45\x09\x54\xba\x07\x0a\x97\x2f\x42\xa5\x5c\x92\x58\x0f\xc5\xcd\x1c\xc4\xc0\x58\x7f\xbb\x62\xeb\x82\x03\xfc\xad\x09\x46\xb8\x11\x42\x77\x58\xad\x81\x3c\xc5\x91\x2f\xa9\xc3\xda\xfc\x6a\xcf\x88\xc5\xea\xda\xc6\xc9\xd6\x41\x5d\xa4\xe5\x88\x72\x1e\xaf\xe0\xf0\x6a\xeb\xf3\x73\xab\x42\x89\xfc\x91\xb0\x41\x08\x88\x16\x09\x09\x4d\x2b\x5f\xf2\x85\x7c\x93\xbb\x36\xbe\xc9\x06\xd2\x8d\x58\x5a\xf2\x1b\x1d\x1f\xb8\x2c\xdb\x01\x88\x65\x4f\x46\x17\xd3\xf7\xbd\xb1\xaf\xda\xfe\xea\x03\x09\x82\x5f\x7d\x18\x0f\x5e\xbf\x99\xaa\x37\xa3\xcb\xf3\xfe\x78\xa2\xfe\xeb\xbf\xa0\x96\xfc\xa7\x9f\x80\x13\xa2\x37\xfc\xd0\xaa\xca\x2e\x4a\xcb\x3d\x81\xf6\x57\xd7\x53\x35\x1c\x91\x40\x7b\xff\x5c\x4d\x47\x11\xca\x92\x37\xbe\xa6\x46\x17\x21\x87\x11\xbc\xf1\x21\x0e\x23\x65\x7a\x62\xf5\xbf\xcf\x63\x35\x18\xaa\xe1\x48\xf5\xdf\xf5\x87\x53\x35\x79\xd3\xbb\xbc\xdc\xd3\xb1\x57\x7d\x75\x39\xe8\xbd\xba\xec\xe3\xa3\x87\x1f\xd4\xf9\x60\x0c\x02\xea\x83\xa1\xfb\xd7\xd9\xe0\xbc\x3f\x9c\xf6\x2e\x23\x35\xb9\xea\x9f\x0d\xcc\x3f\xfa\x7f\xee\xbf\xbd\xba\xec\x8d\x3f\x44\x54\x45\x3f\xe9\xff\xfb\x35\x89\x9c\x9f\xf7\xde\xf6\x5e\xf7\x27\xea\xf0\x81\x31\xb8\x1a\x8f\xce\xae\xc7\x40\xdd\x64\x3a\x3e\xb9\x7e\x45\xa2\xe9\xea\xf5\x68\x74\x0e\xe5\xf9\xa8\xc2\xde\x9f\xfc\xa6\x2e\x47\x13\x18\x1e\x50\x54\x3a\xef\x4d\x7b\xf0\xe2\xab\xf1\xe8\x62\x30\x9d\xfc\x66\xfe\xfd\xea\x7a\x32\x80\x51\x1a\x0c\xa7\xfd\xf1\xf8\xfa\x6a\x3a\x18\x0d\xbb\xea\xcd\xe8\x7d\xff\x5d\x7f\xac\xce\x7a\xd7\x66\xba\xcc\x70\x8e\x50\x2c\x7e\xfa\xa6\x3f\x1a\x83\xdc\xb1\x19\x03\x62\x8c\x7a\xff\xa6\x0f\xb2\xfb\x83\xa1\xe9\xd5\x74\xdc\x33\x43\x30\x99\x8e\x07\x67\x53\xf9\xb1\xd1\x58\x4d\x47\xe3\xa9\xe8\xa3\x1a\xf6\x5f\x5f\x0e\x5e\xf7\x41\xd8\x7e\xac\x46\xe6\x29\xef\x07\x93\x7e\x57\xf5\xc6\x83\x89\xf9\x00\x69\xd4\xbf\xef\x7d\x50\xa3\xeb\x29\xab\xdf\x93\xf2\xbb\xb7\x2a\x23\x98\x3a\x35\xb8\x50\xbd\xf3\x77\x03\x58\x65\xf8\xe1\xab\xd1\x64\x32\xa0\x85\x01\x43\x76\xf6\x86\x86\xfb\x87\xa2\xea\xbf\xc4\x8f\xd3\x7f\xfd\xe5\xc5\x1f\xa5\xff\x7a\xf2\xf3\x49\x53\xff\xf5\xf4\x87\xfd\xff\x3d\x7e\x84\xee\xf8\xbc\xab\x4e\x7e\xfd\xe5\x85\xb9\xa9\x7d\x85\xd5\x69\x51\x16\x79\x5d\xc4\xea\x3d\x19\x2d\xb3\x5d\x28\x0e\x3b\x84\x7a\x6d\x61\xfb\xd8\x38\xb5\x55\xcf\xfc\x2e\xe2\xac\x81\x1e\x2b\xa1\x3a\xff\x59\x64\x59\x19\xc7\xf4\x5d\x85\x59\xff\x18\x2d\xd5\x1f\xb7\xcb\x3f\xc6\x4f\xfc\xe4\x22\xb9\xfb\xa8\xab\xa3\xf1\x36\xaf\xd3\xb5\x3e\xb2\xc5\x4f\x5f\xef\x36\x78\xe0\xfc\x3f\x7d\x7e\x1c\xf2\xff\x3c\xff\x71\xfe\x7f\xa7\x9f\xcb\x34\xff\x28\xb4\x4d\x67\xa5\xf1\xe9\xc1\x37\xc2\x04\x70\x51\xaa\xc5\x2e\x4f\xd6\xf4\x9f\x18\xf4\x60\x15\x36\x40\x93\xa4\x95\x2d\xb0\x27\x75\x13\x06\xb6\x5a\x59\x38\xf9\x70\x73\xa0\x6d\x09\x33\xb8\x9f\xdb\x58\xab\xd7\xc3\xeb\x7d\xe1\x63\x70\x29\x31\xb3\xbe\x2a\xa0\x20\xc0\x6a\xaa\xc4\xaa\x57\xa9\x84\x09\x38\x5d\x25\x5f\xb4\xc7\xbf\xe7\x13\x95\x7b\x6e\xbd\x62\x1f\x7b\x0f\xda\x6d\xde\x07\x61\x20\xd2\x9c\xe9\x47\x6a\x3b\x1c\x75\xa1\x9c\x76\x04\xd1\x1d\x23\xe9\x00\x82\x0a\x32\x01\x1b\xf0\xa9\xb9\xf1\x97\x10\x75\x6a\x3c\xd6\x5e\x70\x50\xfc\xd0\x22\x3e\xe4\x72\x43\xee\x95\x9c\x10\xe7\xa7\x23\x88\x67\x55\xa4\x5e\x66\xdc\x3a\xc0\x10\x51\x5b\x6b\x5d\x47\xc4\x50\x07\xda\x1c\xf9\x47\xc0\xbc\x86\x2d\x7a\x78\x02\x3d\xd9\xf7\x84\xbf\x17\xab\x5e\xde\xf2\x38\x84\x5b\xd3\xbf\x2d\xc6\x3a\x0f\xad\x0a\x73\x75\xb5\x2f\xaa\xc1\x12\xc3\x01\xcc\x17\xe0\xfe\x16\x59\x02\x6a\x28\x65\x5e\x30\xaf\x0b\xd7\x78\x32\x2b\x62\x90\x5a\xb5\xdf\x9e\x6d\x69\x78\x4a\x8d\x40\x3b\x84\xef\x51\x61\x69\xa1\xaa\xc2\xbe\x9d\x68\xee\xef\xd2\x6a\x65\xff\x18\xa9\x85\x86\x34\x7f\xf0\x5a\x47\xef\x0e\x3d\x93\x4d\x90\xe0\x4a\xc4\xe4\xe1\x8e\xc3\xa8\x44\x9a\x57\x75\x92\xd7\xc0\x79\x58\xeb\x35\x70\x35\x42\xaa\x6b\x0b\x2c\x02\xf3\xb2\xa0\xda\x60\x60\xb8\x60\x58\x6a\x25\x42\x52\x28\xb2\x50\x94\x18\xf6\x40\x1e\x16\xc1\xe9\x87\x7c\x72\xf9\x47\x63\x3f\x89\xfd\x6e\x23\x2a\x7b\x96\xb7\x7b\x80\x8d\x31\xcd\x76\x2a\xad\x2b\x9d\x2d\x45\x84\xa6\x75\xa1\x22\xe1\x8b\x08\x15\xdd\x7f\x02\x10\x63\x90\x1b\x4c\xfb\xc6\x15\xc2\x2e\x19\xec\x80\xac\xc0\x4e\xef\x24\x01\xf8\xc7\xdd\x6a\x47\x59\x50\xdb\x00\x68\xf7\x1a\x8e\x86\xcf\x6a\xc8\x3f\xbd\x19\x13\x3f\x39\x4f\x6f\xd2\xf1\x36\xd3\x47\x17\xa3\xc9\xe4\x5b\x5c\xff\x0f\xdd\xff\x2f\x8e\x8f\x43\xfd\xf7\xe7\xa7\xc7\x3f\xee\xff\xef\xf2\xc3\xb3\xaf\x26\x45\x86\xb1\xfd\x9f\x2a\x65\x56\x82\xbd\x6d\xfb\x76\x97\x4d\xed\x69\x7f\x66\x4f\xfb\x3d\x6a\xe3\xa1\xc6\xac\x95\xc2\xc4\xf3\x1c\xff\x40\x3c\xb4\x8e\xae\xae\x81\x44\xf2\x58\xb6\xe0\x5a\x5a\xeb\x05\x88\x96\x81\xa4\xaa\x8d\x98\x5f\x21\x17\x14\xe1\x98\xb5\x95\x94\x86\x8e\x10\xf4\x40\x34\x2e\xfc\xb5\x6b\x9d\xf1\x17\xf1\x29\x2e\xe5\xe4\xdc\xad\xc4\x7d\xc5\x23\x74\x13\xde\x65\x62\xef\x3d\xbf\x14\x94\x45\xe8\x81\x91\x4f\xd5\x69\x9d\xe9\x05\x35\x84\x07\xfa\x32\xad\x6a\x94\x94\xc4\xdf\x0f\x21\x52\xed\xda\x46\x89\x37\x02\x15\xcf\x76\xaa\x39\x77\xaa\x41\xae\x7a\x96\xa5\x28\x26\x68\x6e\xb3\x34\x8c\x7b\x03\x2a\xee\xde\x8f\x13\x68\xb1\x49\x97\xda\xba\x70\x8a\x72\xcf\xda\xc1\x71\x1f\x88\x7b\x5f\xae\x8a\x4d\x51\x7a\xa6\x43\x7b\xc9\x33\xdd\xbf\x41\x8a\xc5\x9f\xfc\x79\x92\x3b\x0c\xd6\x8e\x11\x66\xe9\x42\x97\x81\x15\x03\xc5\x67\x9c\x8f\xb8\xb3\x7c\x6a\x1d\x7a\x98\x1b\x75\x1e\x9d\xd6\xfe\x36\x86\xcb\x4a\xbe\x23\xcd\xad\x98\x47\x76\xe7\x7b\xf8\x4b\x6f\x29\x61\xc9\x96\x2e\xd5\x61\x67\x57\x6c\x3b\x50\xef\xb5\x43\xb1\x72\x33\xfe\xb2\xc0\xb4\x31\x36\x2d\x76\x1c\xa5\x2d\xc2\x4f\x82\x5c\x18\xe1\xa6\xf7\xa5\x20\x19\xdc\x72\x82\x9c\xbd\xc5\x4c\xd3\x15\x78\x75\x09\x6b\x2b\xcb\x58\xcd\xae\xb2\x81\x10\x39\xfe\x50\x2d\xcc\xb3\x29\x48\xe7\xbd\x52\x46\x9b\x3d\xe2\x6f\x4a\xc9\xeb\xb6\x96\x1f\x86\xf9\x53\xac\xbf\xa3\xfa\x28\x7b\xf9\xdb\x5a\x95\x70\x9d\x55\x5d\x06\xd5\x50\x3c\x25\x7c\x81\x7d\x84\x25\x72\x60\xc5\xe4\xa0\x3a\x9d\xc7\x22\x80\xe2\x50\x47\xf8\x2d\x4f\xe3\x50\x2c\xab\xd1\xa2\xaf\x78\x66\x74\xf8\xb5\xcf\x1e\xf1\xda\x34\x97\x92\xea\x80\xe1\x14\x56\x50\x51\xae\x65\x4a\x8e\x00\xaa\xf3\xa2\xc4\x00\x18\x4e\x65\x58\x8f\x2d\x73\xd2\xc4\x5d\x00\x6c\xd8\xa8\x7a\x27\x64\x22\xec\x5f\xa0\x0b\x52\x98\x73\x47\x50\x22\x88\x15\xdd\xdb\xbc\x8a\x3b\xfb\x3c\x56\xbd\x2c\x93\x0a\xdc\x70\x42\xdf\xdc\x18\x37\xab\x96\x69\x5f\x5e\x65\x0c\xc3\x0f\xd1\xf9\xc0\xdf\x83\x6d\x2d\x4a\x75\x5b\x64\x5b\x64\xd5\xae\xea\xa2\x4c\x6e\xb4\x7f\xf0\xb8\x9b\xab\x0a\x56\x71\x43\x30\xdc\x9e\x86\xe2\xa6\x11\x61\xb3\xdf\x73\x4c\x3d\x8d\xdb\x0e\xff\x52\x57\xba\xbc\xd5\x15\x6e\x53\xc4\x7b\x9b\x86\x13\xef\x6a\xb6\xb3\x41\x57\x5c\x60\x7b\x44\xa1\x30\xe7\xea\xce\x09\xac\x1c\x0d\x60\x0a\x20\xe7\xa5\x59\x85\x13\x76\xe4\x1e\xab\xa1\xb9\x3d\xcd\x21\x85\xde\x47\xa3\x0a\x2c\x3e\x68\x2c\x6f\xe6\x96\x85\x54\x3d\xa3\x52\x0e\xab\xee\x13\x17\xba\x3e\x4f\x6a\x7d\x30\xd6\x99\x4e\xcc\x9b\x93\x32\xdb\xa9\x33\x8b\x1f\x61\xd4\xc7\x41\x6f\x9e\x2c\xf4\x3a\x9d\x23\x18\x84\x9f\x7a\x1a\x1f\x1f\xf4\x36\xc9\x5c\xb2\x1b\xf2\xdf\x4e\xe2\xe3\x27\x27\xf1\xc9\x13\xfc\xcc\x26\xb3\x48\x19\xa2\x11\xf0\x9e\x51\xd6\x69\x55\xa7\x73\xbb\xae\x2f\xcc\xfd\x74\xa5\xcb\x4c\x3d\x8f\x7f\x89\x8f\x0f\x5e\x4d\xce\xed\xdf\x3a\x7f\xda\x66\x3b\x75\x7a\xaa\x4e\x7e\xfd\xf5\xd7\xce\x01\x61\xd9\xce\x5d\xe9\x2e\xea\xbe\x4b\x48\x8a\x05\xe7\x9c\x9d\x9f\x5f\x76\x01\xc0\xd6\x0e\x81\x03\xc6\xe6\x76\xe0\x9b\xf9\x93\x71\x66\x2e\x29\x88\x61\xee\x99\x4b\x5d\x55\xba\xec\xec\x85\xea\x5d\x02\x56\xef\x34\x3e\x7e\x72\x1a\x9f\x3c\x79\x1a\x1f\x1f\xfc\x29\x99\xcd\x74\xc9\x90\x3d\x6f\x20\xcc\x0b\xde\x0e\xa6\xee\xdb\x3d\x49\x89\x01\x4e\xd6\xdb\xc1\xf4\x88\xbd\xa7\xfa\x53\xdd\x55\x47\x07\x6f\x8b\xbf\xa7\x59\x96\x34\x5e\xfd\xf6\x0a\x3b\x6a\xe6\xe0\xa0\x1d\x21\x68\x46\xde\xfc\x65\x32\xb9\xb4\x83\x7b\x48\xc8\x1c\x0a\x39\x4f\x26\x97\x3a\xd9\xf1\x5f\xbb\xaa\x73\x7a\x7c\xfc\xb4\xa3\x0e\x3b\x27\xbf\xfe\xfa\x4b\xa7\x7b\x70\xf5\xe6\xca\x3e\xee\x69\x7c\x6c\xba\x78\x72\x70\xb5\xab\x57\x45\xee\x1e\x79\x36\x1c\x0f\x14\xfd\xf2\x92\x9f\x74\xc4\x1f\x6b\x03\x16\xb9\x16\x9a\xd6\x4f\x32\xad\x37\xbb\x79\x62\x65\x9d\x55\x07\xa7\xde\xcf\xb4\x0c\xb2\x2c\xcd\x8b\xb4\x7a\x32\x3c\x9b\xf4\x5a\x47\xf8\xe8\xe0\xfd\xd3\x33\xf7\x90\xd3\xe3\xe3\x93\xce\xc1\x9f\x4f\x4e\xc2\x5f\xfd\x25\x4b\x67\x4f\xb2\x74\xb6\xb1\xa4\x34\xe6\xbb\x6d\x68\xaf\x7f\x45\xd4\xe3\x8f\x1f\xfe\x89\x9f\x0c\x5f\xfd\xb1\xfc\xff\x27\xa7\xcf\x9e\x86\xf9\xdf\x93\x9f\x5f\x1c\xff\xf0\xff\xbf\xc7\x8f\xb1\x86\x87\xba\x56\xaf\x8a\x22\xd3\x49\x78\x99\x1c\x30\x08\xf4\x24\x32\xb7\x55\x6f\x7b\x63\x2c\x17\x73\x70\x2a\x77\xfb\x9a\xff\x8c\xbc\x87\x0c\x84\xdc\x77\xa4\xc6\x7a\x71\x57\x14\x0b\x75\x06\xb5\xca\x67\x49\x96\x2e\x8b\x32\x4f\x93\x48\x5d\x4f\x7a\x60\xc4\x8d\xd1\x56\x19\xa3\xfd\xb2\x80\x74\xb2\x7e\xa9\x3c\x64\x68\xda\x00\xd7\x69\xd5\xb1\x97\x2e\xb5\x17\x34\x57\xa4\xaf\xea\x8c\x40\x73\x11\x93\xa5\x86\x4c\x5d\x24\xaa\x11\xab\x81\xab\x21\x05\xa2\x76\x16\xce\xa4\xd7\x14\xae\xee\xb3\xf1\xbe\xb8\x73\x70\x35\xee\xf7\xde\xbe\xba\xec\x03\x8f\x7f\x2a\xb8\x6e\x4c\x83\x19\x0a\x9b\x56\xc8\xa2\xcd\xc5\x6e\xc2\x98\xa2\x22\x3c\x08\x79\x27\xea\x2a\x99\x7f\x34\x36\x27\xb9\xdd\x50\xfa\xb9\x88\x58\xb1\x95\xb0\xa3\x6e\xe8\xdf\xa0\xa0\xc0\x3a\x49\xc1\xe3\xac\x90\xaa\xaf\xd2\xeb\x59\xc6\x05\xb9\x09\x37\x19\xe8\x48\x8a\x4c\xd9\xe4\x89\x60\x0a\xb1\x34\x03\xf8\x7a\xa0\x39\xc9\x34\x51\x31\x73\xf5\x6b\x59\x05\x1f\x6b\x42\x07\x5b\x12\x13\xdc\x23\xf0\x87\xd7\x45\xa9\x8f\x8a\xf2\x08\x92\x20\x8e\x60\x68\x99\x54\x2b\x30\x8e\x37\xd9\x36\xd0\x09\x87\x9a\x2f\xc1\x4c\xe4\x39\x92\xf1\x81\x88\x3b\xbd\x3c\xe8\xd0\xbb\x42\x76\xae\x79\x01\x5c\x1f\x14\xdc\xc7\x38\xb6\x5c\x24\x14\xe6\x0d\x87\x95\x14\x49\xad\x81\x5a\xd9\x54\x46\xdb\x03\x99\x13\xbf\x5e\x95\xc5\xf6\x66\x05\x85\xdc\xdb\x24\x0b\xe8\xf1\x3a\x93\x3a\xc9\x17\x49\xb9\x60\x43\x56\xb6\x15\xab\x8d\xdd\x88\x2d\x55\x5a\x53\x41\x47\xed\x93\xf0\x45\x4a\x72\x45\x58\xd0\xe3\x9e\xaa\xef\xbb\xb4\x5a\x69\xc1\xf2\xe5\x77\x33\x3e\xe8\x84\xbf\xea\x98\x05\x7b\xb7\x2a\x30\x94\x8e\x7a\x48\x0b\xc7\x6c\x6f\xc5\x86\x4a\xf7\x1f\x2e\x1c\x40\x8b\x23\x3e\x00\xaa\x71\xf3\xf5\x5d\xb1\x05\x11\xe2\x5d\xb1\xfd\x09\x89\xb8\x30\xe7\x98\xcc\x8a\x6d\x0d\x8f\x20\xb5\xc3\x80\x34\x22\xad\x78\x2c\xe2\x83\xce\xd8\xad\x01\xfe\xc6\x52\x6b\x6a\x69\x52\x43\x53\x21\x9f\x91\xe4\xea\x6f\xdb\xaa\x4e\x97\x3b\xf6\x46\x91\xb7\xa6\x58\x52\x25\xf1\xbc\xa8\xea\x48\x2d\xb6\x2e\x00\x83\xbc\x11\x55\x84\x9c\x46\x20\x94\x08\xcc\xf7\x69\x7e\x5b\x64\xb7\xac\x74\x5f\x15\xaa\xc8\x63\x75\x68\x7c\x6c\x5b\x18\x39\xd3\xae\x00\xb0\x2e\xec\x9b\x53\x0b\x35\x69\xae\xaa\xd9\x96\xa8\x1e\xec\xf2\x5c\x6f\xb6\x44\x8d\xc6\x92\x2a\x49\xad\x32\xe4\xb2\x80\xbc\x58\x52\x7e\xd4\x04\xa8\x27\x58\x46\x42\xea\x56\x5a\xc7\xdd\x83\xce\x05\x92\x97\xf5\x98\xbc\x8c\xc3\x57\xf0\x8d\xbc\x00\x3e\x8c\xb4\xa2\x7e\x2e\xec\x54\xa5\xb5\x5e\x53\x86\xc6\x38\x72\xb8\x6e\x91\x2d\x19\xcf\x9f\xa5\x86\x84\x13\x8e\x82\x59\x00\xab\x24\x5f\x64\xb6\x2e\xba\xd6\x6b\xc0\xe3\x53\xe6\xd0\xbe\xb1\x29\x2c\x0f\x6f\x42\x65\x7d\x1f\xa0\x13\x44\x06\xc4\xc1\x08\xe0\x18\x5b\xf6\x4b\x78\x98\x13\x27\x18\x8d\xac\xdc\xf9\x82\x54\xed\xef\x92\x9d\xba\xd5\xe5\x2c\xa9\xd3\x75\xc0\x31\x57\x35\x55\xd9\xc3\x6d\x68\x8f\x6c\xde\x7c\x8c\xd6\x16\xf8\xa0\xb6\x9c\x29\xaf\x22\x2d\x1d\x66\xeb\x7a\x84\xb0\xf7\x8a\x75\x3b\x59\xa6\xd3\x41\xdb\x2b\x8e\x0f\x5a\x42\x10\xf0\x96\x67\xdb\x1b\xb5\x4c\x3f\x99\xb5\xb9\x29\x4a\xa6\x47\xc2\x5f\x61\x9c\x9a\x73\xf1\x82\x29\xac\x19\x21\xc5\x4b\xfd\xbc\x80\xb2\xe7\xa2\x74\x7f\x69\x1c\x06\xaa\xe7\xee\x20\x71\xac\xd0\xd1\x64\x06\x99\x44\x81\x6b\x51\xc1\x4b\x81\x8b\xb6\x81\xe5\x70\x05\x77\x4b\xb0\xf2\x63\xaa\x16\x93\xd2\x36\x04\x2d\xa6\x80\xd8\x2d\x80\xcf\xa2\x39\xf2\x69\x5e\xe9\xb2\x46\x1d\x08\x0f\xda\x6d\xbe\x87\x7c\xca\x04\xe8\x06\xb7\x93\xc3\xde\x80\xc2\x42\x31\xf4\x3c\x80\x7d\x27\x35\x65\x46\x81\xac\xbd\x39\xd5\x85\x63\x19\x18\x0d\xfb\x8d\x28\x2a\x87\x4e\x93\x2e\x86\xe8\xb1\x67\xfe\xcc\xd0\x11\xda\x98\x0f\x4f\xab\x40\x23\x76\x3e\xdc\xd3\x8e\x8d\x62\xb6\x53\x9b\xa2\x42\x42\x99\x24\x5d\x84\xaa\x2a\x85\xba\xae\x74\xae\x6b\xe4\x7b\x51\xe6\x74\xba\x4d\x32\xc8\xb5\x43\x94\x0b\x05\x8e\xb3\xc4\x52\xf4\xf9\xdf\x27\x3e\xeb\xbf\x99\x6f\xa3\xf6\x9c\xaa\xd2\x5a\xdb\xb7\x6f\xb7\xb9\xae\xe3\xed\x36\xce\x35\xea\xb6\xce\x76\x48\x80\xce\x8f\x6b\x98\x27\xc0\x23\x83\x71\xd5\xfd\x63\xd2\xbe\x23\xb5\xbb\x01\x70\x74\x67\x5d\xd5\xc0\xfa\xf3\x82\x81\x43\x95\x24\xf4\x68\x59\xa1\x15\x4a\x54\xce\x45\x79\x93\xe4\xe9\xdf\x5d\xad\xb3\x52\x6a\xde\x55\xa5\x26\xbd\xbf\xff\x9f\xbd\x77\x5b\x6e\x23\xc9\xb2\x05\xdf\xf5\x15\x3e\x34\x3b\x93\xc4\x58\x10\x12\xa9\x5b\x2a\xf3\xd8\xb1\x03\x91\x21\x0a\x55\x14\xc0\x02\xc0\x54\x69\xc6\xc6\xac\x1d\x80\x83\x88\x56\x20\x02\x1d\x1e\x20\x13\xf5\x30\x3f\xd4\x9f\xd0\x6f\xf5\x65\x63\xbe\x2f\xee\xdb\x23\x02\xa4\x94\x59\x99\x55\x5d\x25\xb6\x59\x75\x8a\x8c\x8b\x87\x5f\xf7\x65\xed\xb5\xf6\xc0\x15\x66\xb9\x21\x21\xf2\xe8\xec\x2a\x78\x25\x12\x2a\x52\x9a\x3f\xe6\xde\xec\xba\x8d\xe9\xe2\x90\xa2\x02\x0b\x96\xfc\xcc\x8a\xe6\x99\xd2\x21\xcc\xb7\xd1\x05\xd0\x92\xb9\x4f\xf2\x40\x8c\x03\x2d\x23\x7b\x24\x37\x10\xf4\x62\x7b\xd3\xc2\x34\xcf\x6a\x32\x66\x6d\x58\xef\x9d\xcb\x53\x29\xb5\xec\xe1\xcc\xc3\xed\x24\xae\x85\xaa\x2a\x4d\xd4\x69\x42\x73\xbd\x6d\x45\x84\x00\x74\x23\x67\x51\x23\xab\x8e\xb3\xbc\x6d\xd7\x22\x7f\x38\xe0\xdb\xb9\xeb\x7e\xf9\x52\x8c\x72\x27\x87\xe6\x98\x1c\x69\x44\x3f\x60\x7c\x0c\x2c\xbb\x44\xd5\xe5\x2d\x6a\x14\x10\xe8\xc7\xd6\xd5\x6e\xe1\x53\x1c\x38\x17\xc5\x98\xb9\x6f\xf0\x6b\x0e\x94\xaf\xa9\x44\xb9\x54\xb7\xa6\x7e\x70\x18\xe6\xbd\x50\x37\xd5\x2a\x59\x0a\x9d\x7f\x28\x04\x1f\x2f\x19\xa1\xc2\xd9\xb0\x9a\xfd\xd4\x0f\x2f\x7b\x70\xf6\xf3\x8b\x81\x7b\x51\xe6\x02\x5a\x1d\x1a\x4d\x7e\xe1\x3e\x1c\x7c\x74\xf4\x07\x22\x35\x85\x70\x74\x63\x4a\xf3\x83\xd8\x3d\x5b\x20\x05\xbf\xe8\x77\xab\x8e\xe3\x9e\x7f\x70\xe0\xbe\x66\x54\xfe\x36\x8b\xe3\x65\x5f\x10\x9c\x11\x4f\x59\xd5\x69\xd4\x0a\x9e\x3c\xf1\xaa\xc6\xca\x69\x3f\xad\xd8\xc3\xcd\x78\xa8\x01\x83\x9a\x7b\x0e\x71\x9e\x1d\xbe\x1d\xb6\xb2\x06\x71\x5a\x63\x8d\x82\x85\x28\x38\xcd\xf6\x5d\x8b\xbc\x71\x72\x73\x22\x46\x42\x88\x8e\x91\xc6\x2e\x97\x7c\x78\xbd\xb0\x37\x68\xeb\xf9\x10\x35\x9a\xbf\x87\x6e\x69\xcb\xaa\xb9\x1e\xea\xdc\x28\x20\xf3\xb0\xbc\x33\xce\x0d\x6e\x34\x93\x65\xa4\x90\xf2\x70\xe5\x79\xd7\x98\x93\xd6\x79\xf4\xa8\xff\xda\xb1\x2d\x40\xc7\xe6\x54\xa0\x9a\x15\xdb\x1d\x92\xd1\x55\xca\x73\xf7\x68\xab\xca\x5d\xed\xfe\xe0\xb7\xdf\x83\xdb\x20\x37\x34\x22\xdf\x59\x81\x60\x8e\x37\x90\x85\xe3\x15\xdf\x8d\x2e\xc5\xdc\x00\x55\x71\x5d\x3a\xcf\x6d\x03\xfe\x10\x4a\x6e\xa1\x57\xca\x20\x79\xb2\xec\x6d\x99\x2f\x45\x97\x82\x1a\x4d\xf8\x6b\x3b\x8d\x26\x7d\x31\xe4\x50\x3d\x57\x76\x37\xaf\x4a\xe7\xb9\xc8\xde\x98\xef\x7d\x12\xda\x83\x07\x99\xac\x54\x6e\xfa\x2c\x90\x62\x36\x3b\x50\x1b\x96\x0f\x73\x37\xdf\xe9\x2a\xc3\x2d\x82\x01\x79\xac\x82\xea\xc5\x0d\xf7\xf1\x53\xd1\x30\x25\xa7\x4c\x98\xa5\x81\x63\xb3\xd9\x65\xac\x45\x20\x4c\x24\x20\x07\x75\x63\x06\xa3\xaa\xae\x75\xa5\x6f\x2b\xbd\x5d\xab\x57\xd1\x41\x64\x6c\xdc\x62\x36\x09\xc0\x98\x8c\x9b\x1b\xcc\x58\x9c\x97\xf7\x40\xf8\x8d\x80\x38\x74\x13\x57\x3a\xcb\x09\x1b\x07\x2c\xb3\x80\x4a\x34\x56\xf8\xd4\xfc\x30\xe6\xf8\x9c\x91\x2d\x72\xc8\xa7\xf7\x0b\xfb\x6f\x57\xb6\xea\xd5\x68\x0f\xd5\xaf\x32\x31\x24\x14\x9e\x5d\x0f\xce\xff\x38\xb8\x8c\xab\x21\x49\x3f\x17\x2a\xe6\x58\x3c\x57\x94\x3e\x7e\x41\xe1\x23\xdf\x05\x45\x7f\x83\xd9\x70\x3c\xfa\x92\xc2\xc7\xe1\x57\x14\x3e\x62\xd7\xa6\xc5\xf2\x5f\x25\x25\xd2\x7f\xfa\x36\xab\x67\xee\x50\x2f\xea\x93\xd3\xdf\x86\x06\xe2\xe1\xf8\xff\xab\x57\x67\xaf\x9b\xf8\xff\xe7\xcf\x9f\xbf\xf8\x16\xff\xff\x3d\x7e\xc2\xe8\x77\xa5\x1b\x43\xfc\xbf\x7f\x8a\x44\x0d\x0f\x5f\xdf\x94\x0e\x6f\xaa\xfc\x8a\xbb\x17\x08\x9d\x42\x5e\xa3\x1c\x8e\x1a\xbf\xe7\xf8\x7d\x49\x5b\x75\x6f\xf2\x1c\x4e\xea\x62\xaf\x76\xdb\x25\x83\x9d\x21\xe4\x6d\x0a\x8d\xc4\x6a\x90\xf9\x0f\xf1\x59\xff\xa0\xe3\x23\xf1\xc6\x6b\x7a\xea\x51\x2f\xe0\x45\x1a\x61\xe0\x70\x75\xa2\x86\xc5\xa2\xaf\x8e\x8f\x98\x7e\xe7\xa8\x87\x6a\xc2\xed\x07\x06\x8c\xd0\x76\x57\xd9\x9d\x16\xec\xdc\x57\x21\x79\xe1\x19\xd2\x97\x7c\x5f\xbf\xf5\x9b\x84\x75\xac\x10\xe1\x08\xfc\xb4\x40\x64\x50\x9b\x05\xb5\xf0\xa6\x3f\xed\xc7\xb0\x48\x29\x9f\x6a\x4d\x93\x70\x03\x13\x1b\x32\xc9\xc0\xc6\x1b\x68\x5b\xb8\x27\x25\xd2\x8e\x63\x91\xd6\x7d\xbb\xb9\x4f\xae\x2b\xa3\x37\xf3\xdc\xe0\x4c\xe0\x7f\xb5\xb5\x96\x40\x26\xc0\xc0\xc7\x40\xf1\x98\x4a\x8b\xdb\x3c\xb3\xeb\x84\x7c\xe8\x7a\x57\x61\xe4\xce\x06\x89\xc4\xf0\x05\x11\xa1\x71\xe3\x3d\x48\x9f\x1e\x1d\xe8\x79\x80\x84\x1b\xd2\x61\x44\xb9\xb5\xe6\x73\x31\x83\xc4\xc0\x1a\x88\x15\x78\xc5\x98\x36\x7f\x21\x25\x33\x80\xa7\x50\xb6\x82\xf8\x4a\x42\x29\xca\x06\x27\xb8\xb7\xfd\xe5\xaa\x08\xd9\x09\x64\x4d\xed\x08\xcd\x3d\x0c\xa6\xa0\xf5\xf4\x87\xf1\xf4\xea\xa8\x97\x08\x31\x55\xe4\x88\xde\x06\xd6\x79\xf9\x80\xa1\x7b\x27\xa4\x2c\xfa\x6a\x6a\xc8\xe1\x79\x71\xec\xfc\xbd\x62\xa9\x5e\x1c\xaf\x7a\xc7\x59\x96\xf5\x44\x23\xc6\xd3\x2b\x64\xd6\x25\x42\x95\xdc\x80\xee\x5c\xf4\xa9\x5e\xf9\xcc\x2d\x9e\x1f\x1a\xc1\xd8\x1d\x1a\x16\x21\x14\x2b\x3a\x52\x4c\x6f\x9d\x13\x3a\x57\x5b\xd2\x73\x2d\x0b\xc3\xa4\xe6\xc2\x67\xe8\xb6\xef\x09\x57\xe9\xbc\x24\x6f\x48\xc3\x37\x58\x37\x5d\x74\x2e\x72\x77\xe8\x10\xdb\xbe\x1a\x95\x2c\x8b\x17\xf8\x9d\x29\x1a\xce\x71\x7b\x8e\xbc\xbe\x2d\xeb\x75\x4b\x56\x59\x44\x23\x3a\xb9\xfc\x1a\xab\x97\xf1\x8e\x1f\xa2\x10\xd7\x46\x2f\x81\x89\x66\x5b\x99\xbb\xac\xdc\xd9\x48\xeb\x00\xb9\x62\x62\xdd\x11\xf0\x44\x76\x6e\x56\x1f\xcf\xfc\xf4\x3c\x6a\xbd\xf0\x48\x1d\x45\x2f\x72\xbf\x90\x8f\x3e\x82\x4f\x38\x12\xdf\x74\x84\xbb\x1e\x59\xd0\x59\x24\xd7\xd5\xef\x89\x58\x2d\xb4\x89\x64\x0d\x39\x0d\xf7\xa1\x19\x67\x3c\x30\xc8\xc5\xd2\x67\x62\x30\x2b\xd6\x56\x0e\x82\x61\xcb\x6a\xf1\x7d\x2d\xc8\xb8\x3d\xc2\x05\x73\xb8\xa9\x2f\xfa\xea\xed\x5e\xb0\x6b\x77\x35\x47\xf8\x4f\x87\x98\x9d\xdd\x3e\xb8\x0f\xa4\xd7\x70\x34\x14\xfb\xc6\xd7\xe2\xae\xf9\xd9\x1c\xfa\x6c\x46\xdd\x16\x51\xc4\xa9\x6a\x93\xc9\x1d\x6e\x45\x5f\x0d\x0b\xa1\x74\x20\xf8\x4d\x38\x28\xdc\x94\x12\x84\x69\x12\xb7\x33\xcc\x23\xe7\x8d\xba\xe9\x6e\x11\xd4\x5e\xae\x42\xa0\x20\x08\x38\x68\x5e\x1d\xcd\x10\x85\x35\x79\xce\xf4\xe9\x6a\x59\x16\x1c\x1c\x96\xb1\x6a\x16\xfa\x00\xbe\xc0\xc2\x6a\xaf\x56\x70\x60\xd1\xb4\x8f\xc0\x24\xb0\xe2\x20\x05\xb6\xee\x5e\xad\x51\xa7\x07\x26\xf3\x88\xc3\x3c\xf6\xfe\x21\x5a\xdd\xd5\x0e\x06\x67\xa3\xb3\x5f\x79\x2d\x2a\xf1\xac\xef\x6c\x50\x23\x88\x7a\x37\x08\x45\xe9\xbb\x32\x5b\x72\x8a\x7d\x59\xee\xe6\x75\x53\x30\x13\x9e\xdf\x6e\x40\x77\x3f\x04\x90\xe4\xaf\x69\x5e\x08\xcc\xb8\x27\xfd\xaa\x11\x6c\x74\x1f\xcc\x0e\xb9\xd7\x77\x2e\x81\x46\xad\x3e\xfa\xd8\xd1\xb8\xd1\x11\x8e\x43\xe5\xc6\x1b\x43\x05\xfb\xc0\xdf\x7e\xbf\xd6\xb5\x2d\xf1\xf8\x2f\xf0\x8e\xe8\x09\x61\xb5\x37\x09\xe6\xb1\xf3\xef\x3c\xf3\x58\x67\x13\x5d\x3f\x17\xdf\xd5\x88\xed\x46\xe1\x0f\x2c\x72\x05\x7f\xdc\xfa\xf6\x64\xc5\xbf\xef\x10\x20\x49\xda\x10\x1c\x13\xa2\x4a\x3f\x0b\x19\x1c\x2c\xde\xec\x7a\x4f\xa7\xbe\xc1\x3e\x0e\xd8\x41\x72\x75\x15\xa4\x80\xe0\x75\x5e\xa2\xa0\xac\xb0\x3f\xfd\xf7\x7a\xa5\x02\x94\xf6\xe9\x92\x28\xe0\x52\x46\x44\x56\x00\x1b\xd3\x27\xdc\x88\x45\x90\x0f\x74\x11\x7e\xd5\xe4\x68\xec\x44\x1c\x10\xa2\xae\x41\x4e\x7f\x21\x30\xeb\xc9\xfe\x89\xe3\xbf\x8e\xa9\x3a\x73\xaa\x47\x39\x74\x9c\xb8\x49\x80\x4f\x26\x0e\x6a\x88\x8d\x77\x18\x6c\x09\x7e\x7c\xac\x8c\x72\xf0\x3c\x10\x96\x4d\x1c\x75\xf3\xb4\xd4\xfd\x27\xf1\x8c\x17\x77\xc4\xf4\x5b\x5e\xaf\xa1\x3d\xe4\x59\x41\x46\x1b\xb0\xb1\x3f\xbc\xff\x23\xa8\x40\xa2\xa4\x3b\xa4\x0e\xff\x1d\x52\x49\x94\x1d\x5f\x96\x1e\x34\x1f\x8b\x3d\x48\xab\x1d\x88\x1d\x0a\x78\x46\xbe\xef\x8c\xdd\x76\xbf\x89\x8a\xb1\x7c\xf5\xe4\x78\x3a\x3c\xf1\x16\xa7\x34\x37\x73\xee\x7e\x60\x96\x46\x0d\x3f\xb7\xb4\xaa\xcc\xd4\xba\xda\xcb\x42\x60\x51\x81\xec\xe7\x0b\x4b\x55\xfa\xcb\x64\x69\x85\x3c\xa3\xd7\x51\xf8\x19\x78\xbf\x48\x86\x0d\x82\x68\xbb\x7c\x05\x4c\xe6\x6b\x8f\xc8\xd8\x04\x04\x82\xe8\xe5\xe3\x58\xe5\x5b\x8c\x87\x9c\x8b\x44\xcc\xcc\x57\x89\xe9\xde\xa3\x35\x50\x3a\x9b\x58\x14\x2e\x75\xf7\x22\x17\x04\x59\xa2\xba\x7b\xcc\x70\xac\x3d\xfb\x58\xb0\x76\x9f\xc4\x87\xd0\x93\x36\xb1\xb4\xf8\x3c\x8a\xe0\x06\x62\x69\xb4\xf2\xb3\x0d\x9e\xa2\xee\xff\x67\x60\x4a\x17\x84\x60\x02\xcf\xa5\xc9\x78\xdd\x71\x44\xc9\xbd\xa1\xdf\xad\xd5\xe2\x07\x83\x8f\x88\xb8\xc0\x9d\x45\x7a\xbb\x48\xac\x6d\x20\x56\x69\xbd\x19\xc3\xa6\xda\xfa\x59\x9e\xef\x3b\x78\xd0\xc5\x04\xa9\x63\xb6\xec\x43\x2b\x0d\xab\xa1\x5c\x97\x08\x9d\x9b\xf6\x7d\x1d\x2d\xa2\x88\x03\x18\x75\xe1\x68\x5a\xd5\x64\x69\xd2\x9f\xf9\xf6\x16\x71\xb7\xb4\xf9\xc6\x80\x04\x6a\x6a\x00\x45\x18\x38\x11\x55\xbe\x8a\x3a\x94\xf7\x81\x48\xa4\xa7\xbd\x03\x44\x6e\x5c\x65\xc0\x5f\x85\x74\x89\x01\x6d\xf3\x65\xc0\xd0\xc1\x18\x2c\x4c\x85\x9c\x92\xee\x1d\x2c\xe1\x2b\x00\x92\x64\x91\xdf\x63\xe1\x07\x30\xd8\xb8\x39\x5b\xd9\x1a\x62\xcd\x81\xc2\x51\x3e\xd8\x5d\x53\x99\x2d\x62\xe4\xbc\x8b\xb3\x28\x8b\x3b\x53\x64\x48\x51\x5f\x28\xad\x2e\xf3\x12\xe9\xde\xe9\x00\x37\xc5\xb2\x31\x08\x7d\x5f\x0f\x02\xe5\xa8\xe4\x87\x5e\xb2\x36\xd6\x95\xac\xbe\xe0\x2e\xed\xab\x69\xcc\xff\x73\x98\xb7\x40\x6e\x38\x61\x44\x4c\x65\xe6\x7b\x96\x5d\x87\x43\xce\x59\x10\xf9\xf2\xe4\x3e\x5b\x9a\xa4\x2d\xbc\x7e\x12\x08\xb6\xfd\xee\x18\x51\x10\x65\x15\xe6\x25\xf6\x07\xa4\xc8\xf0\xc8\x4c\x88\x45\xa0\x3b\xb9\x0d\x54\x8b\x49\xa0\xdd\x4c\x28\x72\x93\xb0\xa6\x4c\xa2\xb6\xa6\xc2\x1c\xba\xb0\x57\x1a\x18\xcd\xb6\xab\xc3\x48\xc6\xf9\x1e\xc4\x58\x83\x16\x4f\x59\x85\x0d\x8f\xd4\x48\xe0\x84\x9b\x37\x1d\x67\x72\xf0\x65\x3a\x98\x3d\x76\xcf\x4b\x84\x82\x39\xbb\xc2\xa3\x38\x08\xa5\x57\xc9\x34\x60\x73\x3b\xf5\x79\xf2\xbe\xba\x81\x93\x86\x4c\x8b\x72\xe5\xc5\xec\x8b\xf2\x5e\xd1\x90\xe1\x82\x44\x65\x44\x92\x20\xaf\xca\x3c\xc7\x4f\x8b\x7c\x07\xf2\x70\x13\x0c\x8a\xa1\x71\x84\xca\xbd\x60\x0c\xeb\xdc\x1d\x3f\xfa\xce\x80\x27\x9f\x44\x8c\xa3\x60\x2a\xb9\x0e\x27\x9c\x70\xdc\x97\x9d\x5d\xe6\xcc\x62\x5b\xe6\x26\xac\x59\xf2\x19\xbc\xef\x89\x75\xb9\xc0\xd6\x94\x35\x44\x10\x0c\xa6\x8b\x81\xb9\xf3\x77\x6c\x75\xa7\xee\xb2\x94\xa4\x39\xeb\x58\x84\x75\xd9\x78\x30\xac\x4a\xd1\xf3\xfd\x46\x00\xc3\x97\xdd\x0a\x95\x64\x4b\x79\x55\x88\x4a\x49\x26\x0b\xc8\xc0\x59\x52\x1e\xaa\x14\x26\xf7\x77\xa8\x6c\x70\x9c\xf5\x40\x67\x31\x37\x32\x6a\xd4\xe5\x80\x96\x95\x3a\xce\xdc\xd5\xc5\x1e\x36\xea\x55\xe6\x51\x35\x25\x81\xaa\xd1\x94\xe5\xc4\x74\x3b\x8c\xfb\xde\x54\x26\x2b\x70\xb6\x65\x4d\xab\xa5\xf6\xf1\x8d\xe6\x8d\x47\x94\xb1\xf4\x35\xa7\xa4\xb4\x0b\x11\xa2\x46\xac\x85\x13\xda\x6c\x93\x7b\xad\xfa\xa8\x33\x7f\xd1\x2e\xf7\x76\x1f\x15\x23\x33\xc4\x3b\x98\x45\x59\xc1\x51\x44\xf5\xe2\x58\xf7\xb0\x1c\x35\x41\x58\x12\xa9\xb4\x80\x14\x48\x9d\x81\xff\x56\xfa\x0d\xa4\x14\x52\x9d\xc6\xeb\xaa\x7b\xc9\x24\xb7\x14\xe2\xcd\xc8\x9d\x1d\xd1\x97\xab\x63\x1d\x45\xb4\x8e\x7a\xff\xba\x7b\x71\x4b\x1a\xed\xdb\x76\xfc\x6d\x3b\x3e\xb8\x1d\x3f\xef\xab\x14\xe7\xbd\xdf\x77\x79\x57\x86\x6d\x1a\x6a\x6c\xd6\x18\x57\x88\x6d\x63\x2f\x83\xb1\x34\x66\x83\xcb\x16\x95\x47\x1b\xb2\xa3\x42\x79\x3a\x54\x01\x24\x3c\xf0\x24\x4d\xad\xac\x59\x54\x06\xa5\x59\x83\x2b\xd9\xbd\xce\xfc\xc1\xd1\x19\xe0\x13\xaa\xd5\xa1\x9e\x99\x24\x59\xd7\xb0\x01\x43\xb0\x9f\x42\x0e\xa2\x6a\x88\x6b\x9e\x3d\xbe\xb2\x29\x1c\x25\x0e\x03\x30\x7f\xdd\x92\x09\x08\x22\x24\x6f\x7a\xe0\x1e\x0a\xd4\x08\x12\xb2\xc3\x7e\x83\xc0\x42\x49\xba\xee\xb5\xae\x96\xc0\x8a\x08\xe9\x0a\x94\x80\x8e\x18\x32\x6b\xd6\xfd\x46\x06\xee\xc7\x7a\x8a\xe8\x25\x61\xda\xe2\x1d\xee\x45\x4d\x96\x85\xf6\x41\xf6\xe8\x94\xf0\x72\x33\xd8\xac\x6d\x55\xae\xb3\x79\x56\x87\xd6\x08\xee\x4f\xf7\x20\x0c\x07\x84\xb4\x0c\x9e\x48\x01\x65\x12\x52\x6d\x7b\xd1\xef\xe1\xdb\xfc\xda\x40\xd0\x0c\x8a\x3f\x06\xc7\xc8\xe7\xfe\x06\xb4\xbd\xc1\xbc\x68\x48\xe7\x72\x2e\xe5\xb0\xf7\xed\xc6\x99\x8e\x15\x91\x03\xd8\x8b\x32\x8f\x10\xa7\xc6\xb3\x51\x22\x60\x58\x8c\x51\x0c\x4a\xe2\x83\x1a\xff\x88\xab\xe4\x70\x0c\x3b\x4a\x0d\x80\x40\xae\x0f\x49\x94\x95\xb9\x2d\xb3\xe2\xf6\x4b\x7a\x8b\xb3\x81\x74\xf4\xc5\x1d\xf1\xd8\x07\x10\x5c\x6a\x89\xd8\xf8\x42\x6f\x4c\x42\x7a\xc1\x25\x41\xef\xb6\xba\x5e\x27\x01\xd3\xb7\x81\x6c\x3d\x10\x96\xf9\x9c\x01\xd4\x54\xb1\x68\x38\x56\x0b\xc0\x53\x37\xba\x28\x50\x1b\x9d\x7f\x61\x96\x99\x16\xd8\xe5\x4a\x8d\x45\x3c\x75\xe2\x65\x00\x2f\x9a\xd2\x01\x78\xe8\x0f\x62\xc3\x69\xd6\x88\x11\x7e\x6a\xe5\x67\x7e\x9b\xa9\xda\xb6\x1b\x02\xab\x3d\x26\xe0\x50\x13\x20\x00\x00\x82\x5d\x96\x50\x39\x04\xff\x25\x98\x23\x49\x67\xfe\xaa\x43\x57\xdd\x9a\x10\xc0\x4a\x3a\x05\x96\xd9\x7e\x3c\x43\x0c\xc5\x2f\x6d\x6b\x17\x1b\x11\x26\xf2\x1f\x92\x7d\xc7\xc9\xa8\xd5\x6a\x07\xde\xc1\x81\x48\x4c\x88\xe9\xe0\xc3\xb8\xc9\xaf\x29\xd6\xb5\xb3\x82\x1d\x26\x2e\x58\x09\x51\xa5\x7a\xed\x36\xdf\x6a\x1f\x71\x2a\xb5\x13\x89\xa1\xfd\x7d\x21\xb7\x0b\x58\x03\xd2\x33\x86\x29\xba\x01\x73\x40\x84\xbb\x71\xce\x36\x4c\xbb\xee\x1c\xd3\xa1\xac\x44\x47\xd7\xeb\xbc\xc6\x17\x72\xad\x13\xee\x0e\x81\x85\xeb\x50\x8f\x95\x1c\xed\xe2\x6a\xaf\xef\xd8\x3e\x08\xe2\x84\x6d\xd0\x70\xd6\x29\xe9\xec\x4b\x65\x83\x7e\xa8\x6b\x44\xb8\x80\x9e\xcc\xe8\x92\x65\xec\x96\x2c\x7b\xc2\x16\xa5\x92\x19\xaf\x49\x28\x73\x15\x61\x30\xb1\x7e\x2c\x54\xd7\xf0\xbc\xc5\x34\x49\xf2\xd8\x9c\x4a\xba\x12\xb2\x07\x33\xc3\x0f\xac\x50\xb9\xe0\x82\x31\x5e\x4b\x16\x1d\xed\xf6\xf3\xf8\x5a\x78\xa2\x18\xfa\x90\x2e\x15\x55\x6e\x9d\xc6\xca\x9d\x7b\x9c\xda\x98\xc5\x5a\x17\x99\xdd\x10\x48\x38\xf7\x5a\xbb\x82\x7f\xc8\xa3\x30\x44\xa5\x70\xa8\x51\xe4\x78\xad\x90\x88\x05\x51\xc5\x15\x2a\xcf\x83\xfc\xf9\xb1\x2e\xd4\x51\x1a\x2e\x88\x28\x4d\x3e\x70\x1b\x8e\x7a\x08\xdf\x91\xbd\xc9\xc9\x44\x31\xf9\xbe\x70\x3e\x37\x3a\x8a\xc8\x76\xe0\x38\x89\x51\x16\xda\x2a\x80\x4c\x13\xba\xec\x6b\x7b\x53\x65\xad\x32\xe2\x7d\xb9\x0b\xf0\x89\x26\x69\xb8\x29\xec\xae\xf2\xd4\x6b\xcd\xd9\xc3\xdf\x89\x2d\x95\x89\x7c\x29\x14\xff\x68\x57\x22\x1d\x2f\x96\x83\x73\x0c\x4f\xb8\xb8\xbe\xf6\xa3\xaf\x86\xd2\xbc\xb8\x66\xf3\xe2\x03\x90\x95\x7b\xcf\x4e\x29\x95\x01\xc0\xac\x5a\x82\x5e\xe1\x5e\x9d\x83\x8b\xe7\xb3\x37\x60\x92\x7d\x2e\xca\xfb\xdc\x2c\x6f\xf9\x38\x0a\x71\xff\x32\x7e\xfd\x77\xf6\x80\x55\xe3\x8d\x5e\x59\x4c\x4b\x02\xce\xa2\xce\x3c\x18\xc5\x0c\xfe\x8e\x10\x1c\x8d\x4d\x1a\xb4\xb4\x21\x9e\xe3\xd1\x59\xb2\xc7\x23\x6c\x11\xb3\x6b\x5d\xa5\x97\x83\xab\x23\xfc\x0e\xde\x6b\x48\xba\x0a\xfc\x3f\x8e\x6d\x63\xc0\x80\x88\x8f\xc3\x9f\xa1\x54\x72\xb5\xca\x16\x00\x6e\x5c\x9a\x1a\xa1\xdd\xd0\x29\x7e\x9f\x44\x43\xc9\x75\x1a\x40\xf5\x39\x79\xa2\x9d\x09\x4e\xdd\x5a\xce\x21\x04\x0f\x16\x7c\xe8\x5d\xf4\xa0\x3d\x14\xa5\xbd\xa9\x84\x49\xa3\x0f\x6e\x95\xf3\x1e\x76\x16\x1a\xf5\xdb\xaa\xdc\x6c\xeb\x7c\x1f\x98\x73\x8d\x82\x3e\xc0\x8e\x23\xce\x37\xaa\xa7\x0d\x6f\x0e\x28\x93\xe0\xd9\x03\xa2\x0f\x1e\x5a\x87\x6a\x19\x5b\x9b\xad\x55\xc7\x5c\x3c\x58\x94\x75\xb6\x42\xa4\xc7\x16\x73\x84\x58\xf1\x96\x41\x51\x71\x9e\x59\x34\x82\x0b\x73\x6f\x6f\xab\x72\xb7\xb5\x3d\xc9\x93\xb5\xd0\xf9\x62\x97\x33\xf7\x2e\x0a\x3a\x53\x26\xee\x7e\x5d\xc6\x1a\xc1\x6d\x74\x02\xd1\xec\x52\x51\xb4\xb9\x17\x1d\xeb\x21\x75\xd8\xef\x84\x09\xa3\xf9\x9f\xf5\x23\x03\x75\x70\x3d\xf4\xd3\xbf\xb9\xff\xc8\xb3\x4d\x98\x86\x5b\xc1\x3b\x01\x2e\xd4\x4a\x2f\x8c\x3a\x3e\x1a\x5c\x0f\x8f\x7a\x1e\x2f\xd5\x58\x4a\x3e\x88\xc2\xab\x49\xd0\x9c\x89\x3e\x89\xa2\x11\xd9\x66\x9b\x9b\x20\xbe\x36\xb8\x1e\x8a\x85\x01\x05\x88\xdc\x42\x54\xaf\x15\x92\xd8\xec\x14\xfa\xb1\x8f\xba\x20\xeb\xab\x09\x93\xfb\xb3\x25\xfb\x09\xe2\x91\xf4\x4b\x78\x61\x22\xdc\x0f\x28\x6d\x2e\x9b\xa8\xd8\x17\xc7\x8b\x1e\xc4\x66\x51\x1e\x19\xb2\xfa\x26\xcf\xcc\xdd\x83\xc0\xab\x06\xa4\x8a\xb0\x31\x5c\x64\x4d\xf1\x44\xd6\x6b\xa2\x13\x00\x7a\x53\xac\xc5\x10\xb9\xc0\x68\x86\xd8\x53\x20\x0b\xb5\x6f\x6f\x2a\xbe\xfe\xcb\x7d\x3c\x6d\x4b\x48\xe6\x68\x85\x1d\x11\x4a\xc0\x1b\x16\x31\xf9\x31\x52\xaa\x0c\x98\xc5\xb9\xe2\x13\xce\x9e\xce\x9d\x89\xb4\xa6\xda\x1d\xf1\xab\xac\x79\xa8\x77\x63\x9a\x04\xde\x1c\xba\xac\x37\x99\x07\x6f\x07\x09\x3a\x3f\xdc\x70\xf1\x35\x05\xcd\x71\xd3\x49\x7f\xc6\xf0\xc0\x80\x70\xac\xc4\x68\xda\xf3\x25\xda\xb0\xc7\x70\x49\x7e\xbb\x03\xc0\x8a\x6e\x4c\x80\x03\x87\xb1\xdf\x39\x39\x62\x1a\x07\x92\x83\xf9\xa9\x97\x4b\x9c\x40\x58\xf4\x6b\x1b\x39\x2e\x0a\xb6\x10\x67\xa7\x7b\x68\x56\x7b\xd8\x12\x96\xa2\x19\xc4\x07\xd4\xe2\x42\x4c\x5e\x06\xec\x5e\x6c\xc9\x00\x27\x36\x26\xc6\xb3\xda\x86\x44\x05\x91\xe7\xb5\x4e\x2e\xd8\x2c\xe5\x83\x59\x27\x3f\xec\xa3\x1a\xdc\x95\x3b\x37\x91\x63\xe7\xb8\x47\x65\x8d\x1a\x18\x5b\x28\x6e\x32\x37\x2a\xcf\x3e\x53\x80\x33\x2f\xcb\xcf\x01\xe3\xc5\xb4\xb2\x5d\x19\x7d\x30\xc5\xa9\x1c\xb3\x51\x20\x98\x78\xd0\x52\x12\x20\x4b\x5f\x86\x50\x92\xfc\xbc\x31\x51\x44\x47\x66\xa5\x55\x71\x58\x22\x0d\x47\x0e\xe4\x1e\x1e\x78\x33\x37\x6b\x9d\x53\x3a\x01\x38\xda\xf9\x57\xaa\x21\xd0\xdf\x11\x71\x68\xba\x04\x19\xd5\x53\x37\xc2\xbf\xbf\xe4\x7b\x15\xd0\x8e\xac\x98\x4b\x1c\x49\xf6\xcb\xc2\x04\x8c\x6c\xec\xcb\x97\xfc\xc8\x55\x03\x12\x00\x48\x64\x70\x2c\xe5\x5c\x65\x13\x59\xa2\xe0\x16\xbb\x4a\x30\x97\xcb\xcf\x6e\xe5\x0f\x68\x1a\xd9\x5d\x0e\xc1\xab\x2f\xff\x40\xf4\x87\xc0\x4c\x71\x1f\xc7\xdb\xa4\xe9\xc7\x36\x69\xb9\x52\x69\x30\xa9\xa9\x92\xc4\x76\x96\x88\xb7\x7d\xa6\x03\xf9\x0a\x0f\x30\xea\x06\x15\x11\x45\x8a\x9b\xc5\x84\xa3\xc4\xb6\xb6\x48\x9d\xda\xb8\xf6\x25\xe4\x0c\xc3\xc9\xa1\xeb\xcc\x42\x22\xa4\x0b\x50\x24\x50\xf5\xba\xe7\x29\x7f\x9c\x1b\x4a\x5e\x91\xb3\x1e\x45\x5f\x24\x98\x63\xc4\x48\x54\x88\x21\x14\x76\x9b\x2d\x76\xe5\xce\x0a\xea\x8a\x3a\x26\xa6\x27\xb7\x20\xf1\x45\x32\x2d\xed\x4b\x60\x23\xd2\x35\x00\xe0\x83\xfa\x65\x44\xf3\x7c\xc8\xd7\x78\xc0\xb1\x09\x16\xde\xa3\x7e\x70\x00\x2f\x69\x3a\x56\xb6\x3c\xfe\x82\x6d\x03\xcf\x6d\xec\x5c\xc2\x6a\x51\xe7\xca\xfd\x21\xf4\x2d\x59\xaa\xee\x6e\xac\x56\xf0\xc6\x67\x7b\x81\x62\xc3\xa8\xd7\x31\xe3\xd2\x0e\x31\x43\x62\xb8\x6b\x2d\x92\x52\xc1\xa3\x5b\xc4\x6f\xb8\x56\xbf\x66\x9d\x86\x0f\x6e\xad\xc0\x55\x7b\x05\xb6\x52\x76\x61\x9f\x3f\x00\xcd\x3f\x36\xfd\xdb\x7e\xd2\xca\x67\x00\xb3\x98\x6b\x4d\xe0\xb9\x79\x28\xbd\xb1\x00\xa4\x5c\x07\x1f\x58\xeb\x7d\xda\x86\x7a\xaf\x26\xe6\x90\x57\x39\xf8\x2b\x10\x67\x48\x82\xc5\x84\x29\xea\x32\x4c\xf1\x07\x61\x7f\x00\x52\xf2\xf3\xae\x1b\xc2\xd7\xd9\xbe\x2f\x41\xf0\xf1\x9c\x69\x46\x23\x4c\x65\xea\x92\x47\xe7\xd6\xf9\x11\x0d\x28\xed\x17\x6c\x98\x5d\x27\xa3\x4d\xda\x29\xc2\xf6\x48\x8f\xca\xda\x75\x16\xd0\x2b\x30\x62\xda\xe7\xf5\x5b\x1d\xe4\xd9\xa8\x8a\x9a\x84\x4f\xf6\x11\x21\x17\xa6\x34\xe1\x3f\x7c\x82\x47\x24\xb3\x89\xc2\x2b\x62\xb2\x81\x97\x06\x97\xb4\x68\x17\x95\x25\xcd\x18\x4e\xc7\x97\x84\x4c\x2d\x17\x96\x37\x81\x59\x7a\x21\x7c\xe4\x62\xd9\xcc\x4b\x84\x7a\x86\x3c\x44\x2e\x45\x16\x7e\x85\xe1\x61\x63\xfe\xe1\x0b\x1e\x5a\xb5\x00\x5f\x5c\xf6\xe0\x0e\xb7\x5f\x57\x5b\xe0\x81\x32\x95\x89\x46\x99\xae\x6e\x4f\xbf\x77\x65\xc5\xa5\x00\x1d\xa7\x46\x7c\xbc\x3f\x76\x22\xdd\x67\xcd\x9c\x74\x20\xd9\xef\x6c\x70\x82\xd2\xdc\x6e\xb3\xf2\x6d\x0d\xf7\xeb\x83\xed\x06\xa2\x3a\x3c\xd4\xbb\x0f\x46\x0f\x90\x08\xec\x2a\xce\x02\x85\x29\x14\x47\xba\x64\x39\x2b\xb1\x3e\x54\x62\x77\xf4\x08\x80\x43\x6f\x0a\x62\x5a\xee\x4d\x5a\x15\xbb\xcd\x1c\x43\xab\x5f\xfd\x56\x7c\x1f\x31\xf7\x13\x10\x1c\x4e\xd6\x79\x0f\xa7\xcc\xc1\xbb\xc0\x5f\x8a\x80\x3c\xa1\xeb\xee\x74\xbe\x33\x89\x97\x18\xd2\x39\x59\x8a\x2b\x03\x25\x9e\x4d\x0c\x7e\x30\xeb\xff\xa1\xab\x68\x14\x56\x9d\x84\x69\x83\x45\xa7\x0f\x4c\x18\xe6\x1b\xd3\x16\x1c\x4a\xf7\x72\xd2\x65\xe2\xa4\x6b\x57\x65\xce\x6f\xb5\x17\x35\x4b\x77\x22\x31\xa9\xae\xf4\x5c\xa0\x4f\xa2\x1c\x2f\xbb\x51\xbf\xe6\xf0\xd8\x3f\x54\x77\xf2\x5b\x7d\x7a\x57\x61\xca\xcb\xbe\x1a\x16\xde\x73\x29\xe1\x08\xce\xf7\xea\x02\xfd\xf1\x69\xad\x6b\x2a\x7b\x9e\x98\xdb\x5d\x4e\x22\x72\xde\xed\x87\x1c\x5c\x08\xe1\x13\xcc\x67\x81\xcf\xc0\x75\x59\xf8\x44\x5f\x77\xee\x11\xae\xa2\xa5\x07\x2c\x9f\x5f\x60\x48\x51\xb4\xc0\x62\xeb\x12\xf5\xef\xbb\x65\x06\x82\x76\x40\x9b\x92\x60\xb2\x8e\x9b\xdb\x0c\x23\xe0\x56\x1f\x5a\x78\xb8\x69\x34\x6a\x1b\xfd\x73\xb6\xd9\x6d\x78\xcd\xf1\x17\x93\xd3\xb2\xc8\xc8\x72\xb3\xa1\xaf\xc2\xcb\xf1\xd8\x61\x20\x08\xda\xa4\x08\x4e\x5c\xae\x29\x8f\x57\xc6\x45\x3a\xc1\xa2\xf7\x31\x28\x2c\x15\xe0\xf9\x18\x84\xd7\x09\x12\x62\xf6\x4a\x43\x49\x77\x5f\x4d\xdd\xe4\x96\x4e\x06\xab\x94\xb6\xc0\x2d\x21\x86\x7d\x30\x65\x28\xc4\x18\xe4\x13\x70\x58\xf3\x3c\xf2\xe0\x6c\x47\x98\xaa\x4f\x2a\x07\x8d\x3d\x8b\x3b\x83\x60\x7b\x5d\xbd\x46\x5c\x7e\x5d\x1f\x12\x42\x96\xf9\x9e\x12\x08\x64\xaf\xca\x0c\x02\x20\xc0\x96\x59\x01\x6a\x8d\x9f\xa9\x9a\xc1\x8b\xe2\xca\x78\x33\x4a\xab\x71\x45\x28\x18\xd8\xb0\xa6\x99\x51\xf3\xd5\x83\x28\x86\x06\xb9\x80\xa0\x73\xc0\xb1\xe1\x28\xa4\x34\x54\xa4\xef\xb2\x76\xce\x4b\x5d\xeb\xc5\x9a\x9c\xbd\x10\xd6\xf2\xc1\xc1\x24\x08\xfe\x65\x82\x38\x9a\xb6\x4e\x1f\x94\xf5\x98\x0e\xae\x37\x93\x06\xf2\xac\x23\x6c\xab\xfb\x6a\x64\xee\x45\xe0\xc1\x37\xd2\x6d\xc4\x54\x20\xd3\x51\x1e\x53\x99\xbb\xcc\x2d\x46\x3a\x9e\x1f\x28\x08\x11\x39\xe7\xd4\x73\x0e\xc4\xef\x1c\x17\x8b\x8e\xf5\xed\xf3\x0d\xa1\x4c\xc7\x57\x4e\x85\x20\x62\xb7\x51\x24\x42\x99\xf9\xbd\xde\xdb\x56\xe1\x4d\xc4\xaa\x2a\x16\xbe\xae\x43\x34\x21\xb6\x1a\x7d\x90\x8b\xb7\x62\x58\x0e\xce\x5d\xca\xdd\xcc\x5b\x50\x29\x3c\x7e\x22\x39\x5b\xae\xab\x70\x01\x45\x0c\xc5\x95\xb9\x2b\x3f\x23\xc0\x33\x6c\xd8\xbe\xa4\x6e\x29\xf8\x4d\x73\x5b\x8a\x58\xe3\xce\x52\xdc\xf3\x81\x02\x6e\xff\x2d\xd8\xde\x39\xca\x2f\xfb\xaf\x52\xc7\xf3\x1d\xaa\x11\xe3\x59\x95\x95\xbe\x0b\x7b\xcd\x5a\xa3\xd0\xef\xc2\xfb\x06\xf8\x1d\x84\x27\x43\x09\xda\xe1\xaa\x1c\x91\x30\x23\xa0\x75\x40\x4c\x74\x04\xce\x7d\x60\xba\x5d\x80\x28\x92\xb2\x2d\xef\xb3\x5d\x23\xbe\x6a\x64\x02\x00\x6a\x16\xcc\xd2\x03\x60\x8d\xa4\xc1\xfe\xb1\xa4\x28\xaa\xa4\xe2\xc2\x32\xa2\x8c\x4e\x29\x32\x08\x61\x82\x30\xf5\x46\x5e\x19\xbd\xdc\x77\x99\x5e\xed\xaf\x12\x99\x27\x62\xd8\x04\x6b\x8c\xa7\x18\x3b\xee\x21\xbc\xbe\x28\x8b\xd5\xce\xf9\x91\xf9\x5e\xd9\x6c\x93\xb9\x25\xd0\x20\x52\x11\x3b\x76\x47\x28\x28\x7a\xbe\x47\xef\x7f\x41\x70\x08\x2a\xef\x6d\xa9\x0a\xbd\xa1\xa2\xe4\x2a\x60\xc5\xa5\xe5\xd6\x82\xf5\x3d\x82\x66\x63\xbe\xae\x0b\xcf\xf3\xeb\x6e\xf8\x48\x91\xd6\xbe\xba\x1a\x9e\xa7\xa3\x69\x7a\xa1\xae\x27\xe3\x8b\x9b\xf3\x59\xc4\x97\x75\x33\xba\x48\x27\x48\xa7\x45\xd7\xa9\xf1\x48\x0d\x46\x0a\x78\xb4\xd4\xdb\xc1\x74\x38\x0d\x9c\x58\xc4\x7d\xf5\x49\x8d\xdf\x01\xab\xd6\x1f\x87\xa3\x8b\x44\xa5\xc3\xd9\xfb\x74\xd2\x41\xb1\xf5\x28\xaf\x96\xe0\xd2\x9a\xbd\x1f\xcc\x80\x67\xab\xab\xb9\xef\x26\x69\xea\xde\x79\x91\xbe\x4b\xcf\x67\xd3\xc4\xd3\x6e\x0d\xde\x5e\xa5\x89\x7a\x37\x9c\x1d\x24\xdb\x72\xcd\x19\x8d\x47\x27\xc3\xd1\xbb\xc9\x70\x74\x39\x1c\x5d\xf6\xe1\x35\xe9\x68\x36\x9c\xa4\x6a\x32\x9c\xfe\xd1\x7d\xeb\x6c\x0c\xbf\xfd\xd3\xcd\xc0\xd3\x78\x5d\xa7\x93\x77\xe3\xc9\x87\xc1\xe8\x1c\xde\x7d\xa8\x6d\xee\xbb\xd4\xa7\xf1\x4d\x5f\x4d\xdf\x8f\x6f\xae\x2e\xda\x17\xb9\xce\x4e\xa9\xed\xc3\x9f\x52\x35\x1c\x41\xe7\x4d\xd2\xe9\x75\x7a\x3e\x4b\xdc\xcd\xea\xd8\xbd\x71\x34\x96\x5d\x30\x9e\xb8\xb6\xbb\x2b\xc7\xd0\xbf\xe7\xe3\xd1\x6c\x32\x7c\x7b\x33\x1b\x4f\x7a\x6a\x30\x9d\xde\x7c\x48\xe1\xea\xf3\xf1\x74\xc6\x03\x32\x4a\xcf\xd3\xe9\x74\x30\xf9\xa4\xa6\xe9\xe4\xa7\xe1\x39\xf4\xfc\x24\xbd\x1e\x0c\xe1\x61\xe7\xe3\xc9\xc4\x35\x62\x3c\x22\x0a\xb5\x8b\xe1\xf4\xfc\x6a\x30\xfc\x90\x4e\xdc\x13\xfc\xf0\x9e\x8f\x47\xd3\xd9\x70\x76\x33\x4b\xa7\x6e\x2e\xa4\xd3\xa9\xeb\xae\xc1\x15\xf4\x2f\x76\x46\x98\x30\x7d\x35\x1a\xab\x9b\x29\x74\x52\x57\x07\x0d\x6e\x66\xef\xc7\x93\xe1\xff\x9d\x5e\xa8\xf7\xe9\x24\xc5\x19\x97\xfe\xf9\x3c\xbd\x9e\xc9\xe9\x17\x9a\xe2\x49\xde\x68\x47\x6f\xc0\x21\xb9\x90\x5a\xfe\x5d\xdd\x6c\xcb\x42\xbd\x85\xda\xed\x7e\xac\xe9\xc0\x76\x5e\x03\xdb\xe1\xd1\x63\xe8\xc0\xfb\xd3\xa3\x51\xa8\x4d\x55\xe1\xc8\x9e\x57\x1e\x30\x79\xc9\x88\x70\x6f\xf2\x17\xee\x2a\x3a\x6b\xa8\xa0\x9c\x28\x83\x6b\x53\xa8\xe3\xd3\x67\x3d\xb5\x74\xa7\x6a\xb9\x22\xfd\x7a\x80\x2c\xb8\x9d\x95\x8e\x10\xba\xa9\x91\x61\x39\x10\xee\xf0\x1e\x13\x1c\xb9\x25\xe4\xa3\x96\x26\xcf\x20\x3e\x7c\x97\x69\x65\x36\xd4\x2a\x82\xbb\x01\x2a\x34\x96\x81\xfb\xee\xe3\xfb\xf1\x70\xfa\x1d\x00\xaa\xe6\xa2\xac\xb4\x32\xb7\xce\x40\xd5\x21\xb8\x7c\x6f\xe6\x16\xad\x75\x4c\x48\x74\xe5\x81\x91\x3c\x0b\xf8\xe4\x0f\x06\xe4\xdc\x59\x50\xec\x11\x18\x08\x1d\x8f\xad\xe4\xe6\x89\xc7\x1a\x9b\xdd\xc2\x15\x59\x01\x80\xe8\x96\xc1\x0f\x4e\xdf\x1a\x31\x24\x85\xad\x33\xb0\x85\x45\x5a\x1e\x7b\x77\xc1\xe2\xdd\x79\x2e\x3c\xc2\xc3\x45\xfc\x1e\x08\xe1\x29\x1c\x3c\xca\x1f\xd9\xc9\x77\xd5\x1d\x50\x11\x15\xa1\x9e\x5f\x1e\x8a\xe2\x10\x62\x04\x18\xb8\x19\xd2\x94\xc2\xf9\x64\x1e\xf1\xa1\xfa\xae\x4d\x5c\x29\x85\x18\x08\x9c\x19\x59\x45\x4c\x57\x49\x84\x40\xcb\x0a\xb6\xa3\xe6\x66\x5f\xd2\xfc\xef\x6a\xa2\x3f\xf1\xa2\x2f\x12\x16\x67\x6b\x89\x0d\x80\x78\x81\x9e\x71\x8d\xd0\x91\x61\xb1\x72\x4e\x18\xc4\xc4\xbd\xed\x90\x21\x3f\x94\xf3\xb9\x6a\xce\x54\xce\xf7\x44\xdc\x80\x41\x49\x42\x9e\x64\xe2\x76\x42\x38\x1d\x43\x39\x15\x84\x04\x96\x66\x91\xeb\x4a\x43\xee\xf9\xdf\x77\xcb\x5b\x14\x2e\xc3\xcc\x58\xcf\xd3\x3d\x44\xc7\x63\xe4\x1c\x1c\x1f\xf2\x1a\xf8\x56\x40\x47\xc1\x1a\x07\x0a\x77\xc8\x57\x17\xf4\x06\xc5\x2e\x01\x81\xc5\x78\xa1\x83\x8c\xcc\xb6\x04\x96\xaf\x9e\x73\xe3\xcc\xad\xcf\x83\xb5\xfd\x6c\xc8\x9d\x23\x03\x48\x56\xf8\x7f\xf1\x67\x5b\xc1\x62\x41\x5e\x36\x72\x25\x2f\xa5\xc4\x9e\x80\xa4\x41\x13\xc3\xfb\x19\x7d\x1e\x21\x8a\xad\x3a\x75\xaf\x3b\x6b\x79\xe3\x84\x9d\xf2\xbb\xdd\xb6\x2a\x43\xbc\x0e\xb9\xca\x6c\xf6\x73\xbd\x57\xc7\xaf\x78\x93\xa2\xb4\x21\x18\x34\xe2\xb5\x12\x6d\xa1\xae\x4d\x95\x95\xcb\xa3\x9e\xda\x15\x20\xbb\xc2\xbb\x9d\xeb\x90\xe8\x12\x68\x2a\x21\x50\x31\x82\x2e\x16\xf5\x71\xd6\x03\xd8\x83\xde\xcb\x17\x69\xb5\xd9\xd5\x3b\x04\x8f\xba\x3b\xc0\xf8\x15\xe0\x24\x8e\x6d\x7b\x70\xfb\x56\x5b\x48\x96\x10\x16\x9b\xb0\xee\xad\x71\x61\xc2\xac\x46\x7f\x86\x20\xb4\xfb\x88\x65\xa5\xef\xd9\x56\xf3\xf3\x18\x27\x69\x33\xe6\xd2\xce\x2f\xd3\x0c\x6b\xbc\x00\x96\x08\x75\x10\x50\xeb\xc7\x1d\x14\x11\x36\xf3\xb7\x01\x8b\xbb\xde\xe3\xe4\x0f\x74\xd0\x41\x25\x31\xea\xa1\x25\x0e\xa4\xe8\x59\xe6\x85\x72\x7e\x1f\x72\x1b\x62\x38\xa4\xf1\x49\x64\x24\xf3\x87\x63\xd4\xa7\x63\x0a\xfa\x35\x75\x68\xee\xb9\xf6\x9e\x1d\xe2\x3c\xf1\x75\xf7\x3f\x6f\xb3\xca\x6f\x48\xed\xae\x10\x2e\x8b\x10\x66\xf9\x49\xe7\x3b\xd3\x0e\x21\x34\x88\x61\x1e\xd8\x5c\x78\x58\xe4\x14\xfb\x9b\xad\x60\xca\x42\xc7\xc5\x7c\x95\xb1\x28\x6e\x72\x2c\xd4\x15\x64\x7c\xd2\xd4\x35\x42\xea\x7a\xe4\x52\xd2\x99\x44\x9b\x28\xf5\x50\xd7\x27\x85\x21\xf4\x2a\x99\x91\x94\xd1\x1d\xf7\x56\x1d\x98\x32\xe2\xdd\xc4\x75\xbb\xe8\x8a\x03\x43\xe9\xab\xb3\x6a\xfd\xd9\x14\x48\xb7\xac\x17\x8b\x72\x07\x0d\x52\x4b\x83\xa3\xeb\x31\xf5\x1b\xf8\x8b\x73\x8e\xb9\x01\xd8\x47\x38\x85\x4b\xef\xfa\x08\xf8\xdb\xa8\x54\x13\x53\x57\xa5\x86\xdd\x48\x04\x3b\xa4\x1d\xe8\x9c\xa8\xda\x73\x30\xb9\xef\x12\x27\x54\xa3\xed\x6f\x8e\x75\xcf\xbd\xea\xcd\xf1\xdc\x83\x01\xdd\x57\x98\x62\x89\xc0\x25\x6f\x22\xba\x45\x83\x19\x5d\x71\xf2\x48\x03\xc1\x9b\x36\x65\x65\x89\x4e\xd4\x9a\x3c\x37\x95\x25\x9e\xcf\x40\x6c\x78\xa7\xf3\x6c\x29\x8c\x05\xc2\x01\x34\xd9\xd6\x29\xb1\x88\x4d\x0e\x83\x2e\xbe\x26\xb6\x32\xea\x86\x31\x7c\xfa\xac\xaf\xae\xa2\xf0\xfa\x15\x67\xfd\xfb\x64\x56\x8f\xc6\xea\x7c\x38\x39\xbf\xf9\x30\x9d\x39\x27\x66\x0a\x5e\x8d\xff\x13\x06\x2f\x67\xef\xd3\xf1\xe4\x53\xa2\x3e\xbe\x4f\xc1\xc9\x98\x8d\x27\x33\x75\xec\xdd\x36\x35\x4a\x2f\xaf\x86\x97\xe9\xe8\x3c\xed\x25\xe8\x81\x0c\x9c\xcb\xe2\x7c\x13\x77\xfd\xc7\xe1\x34\x4d\xd4\xf4\xfd\xe0\xea\x2a\xf2\x5c\x12\xf0\x46\x84\xc7\x92\xb0\x2f\x73\x31\x9c\xf2\xef\xba\x1c\x06\x7f\xdd\xf4\xe6\xda\xf9\x90\x13\xf6\x6c\xc6\xef\xd4\xf4\xe6\xfc\x3d\x7a\x78\xe9\x34\x51\x6f\xdd\xdb\x9c\xff\xe7\x7c\x37\x77\xc5\x75\x3a\x99\x8e\x47\xe8\x08\x8e\x3e\xa9\xe1\xe8\x62\x38\x01\xff\xca\xb9\x59\xc3\xc1\x15\x78\xa3\xc3\x8b\x74\x34\x73\xff\x0d\xde\xd0\x68\x9a\xfe\xe9\x86\x5c\x9b\x8b\xc1\x87\xc1\x25\x92\x3a\x43\xdb\xdf\x0f\xdc\xa7\xa6\x93\xc7\x7c\x58\xbe\xcf\xbd\xf7\x6a\x3c\x85\x07\x5c\x8e\xc7\x17\x1f\x87\x57\x57\x89\xfa\x38\x9e\xfc\x51\x4d\x67\xe3\xeb\xeb\xc1\x65\xea\x7a\xf0\xc3\xf5\x8d\x7b\xe8\xbb\xc1\xf0\xea\x66\x02\xde\xe9\x87\xc1\xd5\xbb\x9b\xd1\x39\x3e\x8d\x1a\xef\x46\xca\xf5\x29\x7b\x7e\x1f\x9c\xc3\x1b\xb5\x12\x5f\xe6\x3a\x22\xfd\x29\x1d\xa9\xa1\xe8\x9e\x4f\x34\x20\xef\x07\x3f\xa5\xea\x6d\xea\xfe\x3a\x72\x9e\x6c\x7a\xc1\x7e\xec\xf5\x78\x3a\x65\xc6\x6a\xee\x58\x7a\x72\x9f\x7d\x3b\xfe\x42\x1c\xa5\x01\x5d\x8d\x4f\x76\x8e\xea\xe0\xfa\xfa\xea\x93\xeb\xfb\xf0\x47\xd7\x05\x17\xe9\x60\xf6\xde\x35\x0f\x87\x63\x70\xa5\x86\xa3\x3f\xdc\x4c\xc0\xdd\xbd\xb9\x9a\xb9\x39\xf5\x6e\x32\xfe\x20\x5a\x3b\x15\x93\x8c\xfd\xf0\xf4\xcf\xb3\x74\x84\xef\x18\x9e\xc3\x20\x5f\x0d\x3e\xba\x39\xf2\x7e\xf8\x76\x38\x9b\xe2\xdd\xa1\x8d\x7d\x35\x1d\x7f\x48\xd5\x1f\x6e\x26\xc3\xe9\xc5\x10\xba\x72\xaa\x2e\xc6\xd8\xce\xab\xab\xf1\x47\x7a\xe8\xf9\xd5\xcd\x14\x3e\x69\xd2\xf8\xc0\x30\x33\x0e\x4e\x8c\x44\x4d\xc7\xd8\x37\xe1\x39\x6e\x98\xc4\x83\x3e\x0c\x3e\xc5\x5d\xf3\x69\x7c\x83\x8b\xf5\xb4\x4f\x7b\xac\xcd\x58\x5d\xc9\x99\xa3\x54\xe6\x30\xb0\x6a\x6e\xea\x7b\xb7\x7b\x44\x08\x9f\x98\xc1\x13\xb9\x10\x90\x43\xc0\xb6\x0a\x3f\x98\xff\xac\x58\x32\x9b\x9c\xd2\x55\x86\xf8\x89\xee\xf3\x2b\x51\xe5\x0e\xb9\xe8\x6b\xab\x76\x75\x96\x93\x6a\x8d\xfb\x15\x1d\xf9\x1d\x61\x44\x51\x4b\x56\x97\x48\x71\x07\x86\xd0\xc1\x86\x37\x78\xcc\xe0\x04\xac\xe2\xbe\x40\x5e\x00\xf3\x1f\xbb\x0c\x13\xb0\x40\x0b\x10\x2a\x85\xc9\xea\x96\x14\xc0\xee\xd0\x6c\x97\x90\x0b\xef\x0f\xc9\x3d\x88\x35\xde\x7d\x91\xc7\x44\xe1\x80\x9c\xf5\x91\xe5\xf8\x12\x2a\x0f\xe1\x50\x4a\x8b\xa5\xba\xb1\x40\x68\x37\x3b\x04\x58\x13\x6a\x06\x20\x37\x96\xa0\x57\xa7\xb1\xea\xb8\xc1\x25\xfa\xe2\x7b\x75\xde\x7f\xd7\x9f\xf4\xd5\x59\xff\xf4\xd9\xa9\x3a\x1e\x2f\xea\xbe\x3a\x7d\xf3\xe6\x65\x2f\x61\xb0\x0f\x20\x5a\x56\xf2\xb1\x3e\xc1\xe2\xa3\xa3\x88\xbf\x7b\xe0\x82\x08\xae\x07\x4d\x42\x2d\x47\x4f\xa7\x04\xf4\xfc\x51\x8b\x4e\xcf\xfa\x67\xa7\x67\xea\x78\x6a\xb6\xdc\x26\xa8\x40\x70\x6d\xc2\xea\x91\x7a\xdd\xbe\x1c\xa8\x7d\xc3\x57\x9d\xbd\xee\xbf\x3e\x7b\x76\x76\x72\xea\x83\x01\xfe\x57\x2f\xd4\xf1\x1f\x76\x85\xe1\xaf\x75\x43\x75\xb0\xbf\x95\x5e\x00\xa6\xea\x10\xd6\x0b\xc9\xab\x4a\xeb\x2d\x51\x6b\x80\x07\xb2\x5e\x73\xb9\x31\x0c\xe9\xf3\xbe\xfa\x90\xd9\x85\xc9\x73\x5d\x98\x72\x67\x1b\x69\x25\x5f\x45\x40\x95\x36\x2c\x3c\xef\x0f\x7f\x37\x24\x0b\x53\x79\x1b\x86\xf9\x3b\x36\x50\xad\xa4\x88\xf7\x00\x74\xcb\x1f\x4c\x53\x67\x56\xad\x4d\xbe\xa4\xa4\xd8\xae\x30\x05\xa4\x37\x84\xbc\x56\xb8\xd7\x4f\xe2\xca\xac\xca\x6a\xc3\xa5\xa6\x71\xae\x2f\xaa\xbe\xe0\x90\xb4\x78\x6a\xe3\x43\xfd\x33\x65\x55\x6d\x50\x44\x55\xb9\xbe\x97\xcc\x2b\xc7\xa6\x2b\xbf\x28\xf2\x0c\xb9\xbe\x07\xc0\x8a\x2e\x82\x46\x9a\x80\x2e\xf4\xa0\x20\x83\x6c\xa6\x0c\x2b\x1d\x40\xb2\xea\xa4\x5c\x9d\xc4\xef\xc2\xcd\x23\xd4\x8c\x0b\x08\x15\x55\x32\x08\x8f\x24\x26\x6d\x14\xf1\x14\xb0\x64\x4b\xc0\x82\xe1\x6e\x28\x3a\xb1\xb1\x27\x96\xb6\xb6\x8f\x95\x0d\x2f\xca\x5d\x55\xd3\xa5\x68\xd9\x79\xe3\x59\xd7\x75\x59\x15\x66\x6f\x91\x46\x13\xa9\x9a\xb7\x60\x14\xe2\x1e\xd1\xc1\x69\x73\x53\x40\x52\x76\x44\x59\xe6\x73\x20\x1f\xc3\x0b\x0a\xdc\x17\xf5\x42\x88\x6e\x0c\x0b\x22\x4e\x84\xfa\xd3\xa9\xc6\x52\x85\xcb\xb2\x5c\x5a\x37\x91\x42\x5f\x61\x1f\x9b\x25\x16\x37\xbb\x7e\xed\x4e\x91\x07\xfa\x6c\xec\x28\x56\x08\x01\x30\xcb\x82\xde\x1f\xba\x0c\xb6\xcc\x6a\x67\x96\x11\x73\xe6\xb2\xc2\x6a\xab\xa0\x76\x22\xd8\xdf\x1a\x39\xa5\xd3\x17\x7d\xc9\x41\x5e\xae\x60\x90\xb3\xa2\xe1\x9f\x7d\x82\xa2\x28\xd8\x25\x90\xe2\x20\x4e\x1b\x19\x62\x23\x50\xbb\xed\x16\x0b\x85\xf3\xf2\xde\x54\x80\x77\x49\x3c\x61\x13\x9c\x5e\x77\xd9\x72\x07\x28\x05\xa5\x99\x8b\x1d\x69\x81\xa8\x94\xcf\x4d\x0c\x79\x7e\x25\xbc\x81\x6e\x73\x40\xc3\xf9\xd4\x7b\x03\x51\x91\x7c\x7d\x39\x77\x66\xed\xae\xab\x98\xfb\x9d\x6b\x7f\x68\x5a\x66\x88\x98\x95\xd2\xff\x54\x0a\x8a\xad\xf6\x34\x50\x55\x99\xdb\x04\x31\x59\x82\xb4\x06\x7e\x83\x2f\x58\xa0\x14\x3f\x6b\xec\xba\xef\x80\x60\x85\x5e\xad\xb2\x3c\xf3\x42\x3a\x09\x56\x88\x76\x86\x8a\x03\x5b\x5e\xe2\x9f\x83\x9d\x0b\xb1\x97\xb5\x51\x5b\xd7\xed\x6c\x32\x48\x83\x01\x50\x53\xa8\x28\x03\x53\x04\x7e\x49\x60\xca\x8d\x2e\x34\x39\xa4\x25\x51\x82\xe0\xd7\x85\xa1\x9d\xef\xc3\xec\x93\x79\xdb\x10\x6e\x29\xef\x0b\x53\xd9\x75\xb6\x55\xa0\x77\xbb\xaa\xf7\x6a\x6b\xaa\x05\xc4\x9a\x5e\x3e\xfb\x1f\x3d\x5f\xd0\xc1\x0a\x98\xbb\xda\x03\x87\xec\x5a\x57\xc6\xe3\x07\xb3\x9e\x9a\x9b\xc2\xac\x08\xce\x22\x9f\x2b\xda\x76\xb8\x88\x56\x2f\xef\x70\x1a\x81\x15\x11\x7a\x97\x46\xec\x21\x24\x4e\x12\x0a\xc4\x04\x95\x0d\xc8\xe1\x64\x77\x59\x6e\x9c\x5d\x16\xf1\xf3\xbb\xbe\x98\x87\x42\xda\x7b\xdd\x2e\xf9\xd7\x95\x89\xc9\xa4\x8c\x54\x0c\x05\x01\xa8\x1c\xee\x97\xa7\xe1\xcb\xbe\xe7\x39\xc4\x90\x37\x1b\x26\x31\x4d\xa6\x47\xe9\x70\xb0\x9b\x4d\x05\xe8\x69\xc8\x4e\x97\x85\xf1\x73\xbb\xab\x69\x9e\x71\xd1\xbd\x3e\xc1\x6a\xce\xed\x5a\xcf\x0d\x04\x7e\x18\x4d\xc4\x1b\x9e\x64\x63\xf4\x39\x06\x0d\x55\xfc\x50\x9d\x7d\xe0\x45\x9e\xe3\x16\xac\x60\xf9\x2d\x6e\x7d\x04\x62\x48\xf7\x2f\xbb\x2e\xef\x21\xfa\xb5\xd5\x95\x29\x40\x47\x09\x6b\x8d\x85\x59\xfa\x83\x4a\x7f\x07\x6a\xb1\xbe\x33\xb0\xc2\x47\x9d\x01\xa3\x7c\x33\xfd\xfe\x83\x9a\x79\x03\x52\x5b\x3f\x00\x6d\x59\x09\xfc\x66\xdc\x0b\xba\x24\x3a\xa2\x77\x9d\x1e\xcf\x7b\xf0\x3a\x7a\x04\x29\x9d\x3f\x2c\xad\x42\xcf\xc0\xee\xdc\x7a\x59\xaa\x10\x3d\x95\x4f\xf4\x66\xda\x0f\xbf\x58\xb3\x04\xc7\xfc\x10\x73\x5d\xd8\x2d\x0f\x93\xd6\x75\x71\xd4\xb5\x98\xec\x1e\xfd\x2c\x18\xc7\x78\x94\xd8\x9f\xf9\xa1\x43\xaf\xe5\x0b\xfa\x28\x6a\x25\x76\xd0\x6f\xc0\x35\xc8\x7d\xe6\xde\xf8\x4b\xc9\x06\xdb\x05\x71\x1d\x73\x16\xe3\xb2\x3f\xa0\x26\xd8\x43\x45\x98\x8d\xbb\x5f\x1c\x1b\x9c\x85\x02\xd1\x86\x4f\xd9\xfa\xbc\x0a\x14\x58\xaf\xe0\x14\x01\x30\x7f\x4b\x69\xb6\x9b\x65\x42\x54\x04\xe5\xa0\x80\xbe\x13\x84\xc6\x08\x04\x43\x54\x2c\xe8\xbd\xc3\x4e\x1e\x34\x91\x43\x81\x74\x38\x11\x59\x89\x93\xd5\xf8\x58\xd3\x8c\xcf\x49\x67\x41\x64\x79\x28\x89\x72\xd6\x92\xce\x73\x6f\xfd\x1d\xe0\xbe\x43\x3b\x85\xea\x3a\x7c\x8d\x18\x3b\x72\xce\x47\x07\x34\xa2\xb0\xbe\xbe\x80\xef\xa3\xb5\xd8\x35\x76\xf3\xa7\x72\x47\x0b\xbd\xc3\x1f\xf5\x57\xbf\x68\x27\x18\xd3\x3f\x43\x64\x45\x0d\x9e\xcc\x02\x80\x0e\x48\x18\xa9\xae\x7b\xbb\x35\xba\xfa\x0d\x6a\x6a\x39\x30\x4a\x65\x2c\xad\xd0\x41\xbb\xe2\x85\x0b\x6c\x31\xff\xe9\xb6\xfa\xb6\x04\x76\x5d\xb2\x46\xd1\x3e\xba\xae\x08\x58\x4b\xcf\xf1\xfb\x03\x7c\x32\x00\xaa\x65\x4d\x0f\x7c\x62\xc7\xd1\xfb\x88\x38\x55\x10\xb3\x22\x61\x1d\xde\x15\x1a\x62\x98\xc0\xdd\x53\x05\xd6\x77\x54\x85\x76\xfd\x9b\x11\x75\x1b\x3c\xf6\xa0\x60\x2d\x79\x6d\x40\xb3\xbd\xd9\xe6\x59\xac\xc6\x1f\x99\xdd\x20\x89\x3d\xa7\x42\x06\x49\x1a\xe4\x77\xbf\x5a\xad\xeb\x7a\xfb\xc3\xd3\xa7\xf7\xf7\xf7\xfd\x79\xe6\xdc\x1e\xf7\x81\xfd\x45\xb9\x79\x4a\x9b\xf8\xd3\xfe\x93\x69\x4b\x30\x47\x20\xcd\x4c\x74\x56\x45\xdc\x49\x6e\x65\x20\x9c\x08\x02\x3b\x8f\xc1\x89\xa8\x03\x98\xbd\x0a\x49\x8a\xf2\xcc\xb9\x3e\x53\x13\x33\x54\xb3\x51\xe1\x75\x03\xbd\xbb\x83\xbe\xaf\x70\x05\x50\x2b\x32\xc0\x7f\x5b\xed\xee\x3f\x69\x6e\xf4\xff\x2a\xf2\x7c\xbf\xf9\x4f\xff\xe9\x9f\xae\xaf\x4e\x4e\xfb\xcf\x7e\x0b\xe1\x3f\xfa\x79\x58\xff\xef\xf4\xd9\x8b\xe7\x4d\xfd\xbf\xd3\x57\x2f\x5f\x7d\xd3\xff\xfb\x3d\x7e\x00\x59\xa7\xae\x6f\xde\x5e\x0d\xcf\x3d\xcc\xf0\x2e\x6c\x94\x4f\x82\xb4\xe8\xf1\x79\x4f\x9d\xbe\x79\xf3\xe6\xe4\xec\xd9\xb3\x97\x6a\xe6\xdc\xe0\xda\x2c\xd6\x6a\x30\x4d\xd4\xa8\xac\xee\xf5\xbe\xff\x24\xbd\x33\xd5\xde\x79\x25\x99\x45\x69\xd0\xba\xe6\x93\x7a\xbb\x6f\x97\x83\x8a\xd0\x11\x07\x4a\xfb\xb0\xe5\x43\x34\xb9\x25\xf2\x06\x6a\x30\xa5\x32\xd6\xed\xb6\x08\xde\x36\x66\x89\x0c\x3a\xe0\x66\x32\x57\x01\xd3\xe5\xfb\x30\x2c\x45\x63\x04\xc7\x07\x3f\x32\x6c\x36\xa5\x3b\x32\x68\x6f\xdf\x94\x4b\x93\x13\x73\x7e\xde\x06\xbf\x03\x00\x99\x9f\x1d\x11\x4c\x93\x05\xb6\xcd\xf5\x22\x94\xe1\x87\x43\x70\x8d\xf2\xac\x16\x8b\xff\x18\x00\xdb\x41\x6b\xd7\x89\xe0\x36\x6e\xa8\x00\x1e\xe5\xb7\x59\x31\x54\x54\x1d\xe1\xdb\x95\x79\xf4\x9b\xc4\xc9\x10\x8c\x99\x0f\x8c\x06\x22\x6f\xe1\xf6\x66\x1b\xd9\x79\xf1\xa8\x89\x70\x1a\x3f\x22\x09\x94\x85\x59\xb5\x3c\xc1\xc0\x5f\x07\xfd\x8d\x75\x67\x0c\x9e\x3a\xf1\xed\xf0\x02\x41\x31\x56\xae\x50\xb2\x2a\x68\xd0\x82\x7b\xb9\xb3\xa6\xd1\xf6\x27\x97\x94\xc8\x9d\xc0\x41\x22\x34\xe9\x80\xb9\x90\xf9\x53\x49\x7f\x3c\xf0\x40\xb7\x62\xd5\xec\xd3\x71\x37\x78\x78\xfc\x5e\x66\x54\x42\xac\x2a\x94\xfe\x30\x16\x48\x30\x6c\x37\x1e\xd6\x57\x1f\xd7\x25\x72\x8a\x01\xc6\x43\xe7\x8f\xf4\x66\x29\xd2\x07\x59\x6d\x18\xbc\x0c\x0c\x97\x82\x2e\x86\x2f\xa7\xf0\x2c\x98\xea\x36\xbb\x2d\x50\xfb\x11\x2b\xa8\xb4\x77\xe5\x45\x7b\x88\xad\xdd\xd7\x81\x77\xae\xcc\xf0\x06\x88\xfc\x05\x5e\x68\x78\x4f\x5c\x3e\x00\xb1\x69\x50\xac\x54\x5b\x96\x57\x0e\x2e\xc0\x89\x62\x58\x3e\x47\x46\x70\x22\x9e\x84\x65\x91\x08\x40\x35\x9b\x89\xd4\x22\x82\x4d\x5b\x48\x9d\x48\xd9\x8d\x80\xc1\xc8\x79\xf2\x20\xba\xba\xd1\x3b\x91\xc5\xd3\x17\x0a\x77\xee\xdb\x21\x62\xdf\xe9\xd4\x4c\x65\x86\xa7\xa9\x95\xb3\x89\x2b\x63\xc1\x78\x23\x2e\x2a\x04\xcb\xb7\xb9\x86\x43\x8b\x18\x67\xb2\xd5\xf5\x62\xcd\xd1\x6a\xcf\x28\x1e\x87\x8f\x7c\x68\x37\x7a\xa3\x60\x1d\x6f\x98\xdf\xce\x1d\x40\xa0\xbe\xa7\x74\xdc\x94\x77\xc6\x1b\xfe\xb1\x25\x9e\x15\x8d\xe5\xe4\xb1\x85\x1f\xd7\xa6\x78\xac\x5f\xaa\x16\x65\xa6\x9c\x65\x09\xec\x85\xd1\xa2\x13\xc4\xec\x07\x49\x8e\x1f\x1d\xd1\x2e\xe9\xa5\x68\xb7\x82\xba\x15\x19\x19\xb6\xad\x47\xf8\xd9\x0b\x43\xe1\x2f\x6b\x71\x04\xfa\x3d\x58\x2a\xd8\x70\xa8\x80\x8f\x81\x88\xa8\xe0\xd8\xfa\x4a\x93\xd6\x97\x08\x96\xd9\x26\xfd\xc9\x46\x2f\xd6\x59\x61\x4e\x1a\x9e\x44\xbb\xe5\xe0\x89\x1f\xbe\xb6\x59\x04\xd2\x7a\x40\xb3\xf0\x07\x6a\x1b\x8c\xa9\xe9\x23\xe5\xdc\x13\x93\xac\xc5\x7f\xda\x79\x70\xf3\x74\x5a\x76\x50\xe5\xce\xc5\x43\x80\x06\x91\xa3\x9a\x79\xde\xe0\x00\xc2\x7a\xc4\x03\x9f\x88\xa2\x94\xb6\xf4\xe5\x6c\x5c\x09\x1a\x65\x0d\xf9\xf6\xca\xe8\x25\x5c\x28\xfd\x35\x9a\x67\xf2\xa8\x95\x5b\x69\x23\x6e\x21\x57\xb9\x97\x4c\x2c\xbc\x82\x9b\x80\xf0\x62\x92\x8a\x69\x2f\x99\x07\x13\xcf\x36\x30\x06\x80\x69\x2f\x2b\x18\xf3\x2c\xd6\x5f\x74\x1a\x98\x9f\x41\x32\x17\xad\x83\xcc\x0a\x9c\xdd\xc1\x0e\xdc\x74\x51\xd0\x79\xf4\xf8\xc3\x9d\xf9\x28\xcb\x8b\x3c\x34\x5e\xf6\x5b\x1a\x80\x9e\x85\x8d\x75\x83\x1f\x9a\x7d\x8c\xaa\x06\x77\x1a\x8e\x33\x48\xea\xed\x3a\xc9\xf2\x2c\x66\x69\xa0\x08\x12\x57\x90\xc4\x6b\xcd\x69\xe1\x79\x5d\x3e\xbf\xaa\xf0\xe2\xce\x27\x26\xaa\x32\x3b\x0b\x9f\xeb\xa5\x67\xf1\xa0\x69\x50\xb2\x1f\x3c\x75\xbf\xea\x73\x61\x67\xb7\xf4\xb4\x04\xf5\x92\xe2\x80\x74\x3b\x82\x21\xcf\x81\x40\x66\xd2\xb5\x16\x1f\x5e\x46\x8f\xec\x28\xdc\xaa\xc3\x2b\x4a\x23\x10\xef\xeb\x57\x16\x3e\xf7\x97\x2c\x96\xce\xcd\xe2\x67\x37\x8c\x59\x1d\x14\xbf\x3a\x3e\x16\x0e\x01\x1a\xb3\x92\x6a\xb4\x96\xaa\x32\x27\x51\xd5\x03\x8d\x1c\x14\x90\x1d\x1a\x3a\x7c\x08\x6b\x68\x74\x74\x22\x70\x5c\x8a\x8f\x86\x4e\xc5\x23\x5c\xb4\x89\x6b\x79\xb9\x53\x91\xb5\xac\xdd\x27\x36\x92\xbb\xa4\x6a\x98\x7d\xeb\xf6\xf8\x4b\xf0\xdc\x71\x3e\x16\x96\x2c\x40\x09\xa5\xe4\x75\x95\x9f\xc2\x20\xe4\x48\x16\xd6\xfd\x99\x58\x7f\xb1\x10\x72\x11\x34\xbb\x1e\x3f\x80\xdd\xc4\x34\x90\x91\x8f\x02\x56\x34\xcb\xe3\x52\x74\xbb\x03\x03\xa6\x2c\x40\xb6\x2b\x44\x78\x24\x24\xf2\xc9\xb0\x50\x45\x49\xa8\x51\xc2\xc0\x77\x35\x84\x28\x29\x62\x4f\xca\x22\xb7\x5d\xa0\xf4\x2d\xf6\x1e\x63\x25\xfb\xf6\x4b\xcc\xd1\xbc\x84\x32\x8d\x3b\x53\xec\xd0\x5a\xaf\xca\x55\x56\x0b\xd6\x0e\x4e\xb6\x86\xb4\x2b\x04\xb7\x74\x0e\xcf\x87\xa0\x26\x6e\x0d\x20\x09\x00\xb5\xa9\xf0\x05\xd8\x9e\x44\x12\xf9\xee\x05\x2a\x15\x52\x9a\xa1\xbe\x08\xcb\xef\x3d\x79\x35\x16\x8a\xfb\x47\x74\x01\x42\xb2\xe2\x4e\x57\xd9\x97\x00\x42\xfa\x4f\x46\xa5\x2f\x3f\x7c\x32\x6b\xda\xb9\xdd\xe7\x7a\x64\x32\x61\xb0\x10\x36\xc4\xd1\xf8\x40\x94\x30\x40\x54\x67\xef\xd3\xe8\x9a\x8b\x74\x3a\xbc\x1c\xc9\x1a\xc1\xa1\xaf\xe9\x7b\x37\x9c\x8d\xd2\xe9\xf4\x60\xb5\x60\xff\xc9\x39\x72\xbc\xb9\xc9\xa3\xef\x63\xdf\xdc\x59\x92\x0d\xa2\xfa\x2b\x7d\x0f\x13\x8d\x42\x13\xea\x22\xb3\xdb\x5d\x6d\x6c\x00\x58\x20\xb6\x1b\xe5\xd3\x6d\x5e\xaa\x73\xd7\xe5\xe7\xe5\xae\xaa\xff\x75\xe2\x8b\xfd\xa7\xa3\xab\xf1\xc5\x6f\x1b\x00\x7c\x38\xfe\x77\x76\xfa\xec\xf9\xf3\x66\xfc\xef\xf5\xcb\xd7\xdf\xe2\x7f\xbf\xc7\x8f\x5b\x1d\xe6\x36\xe3\x4a\xf7\x05\x6e\xa3\x90\x3d\x11\x78\xc0\x0b\xe0\x72\x77\x33\xa5\xf7\xe4\xba\x32\x90\x9d\x03\xe0\x26\xdc\x22\x96\xe2\xc2\x48\x65\xae\xa8\x5e\xde\x6d\xdd\x89\x3f\x9d\xc5\x81\x26\x58\x88\x93\x46\xe4\x65\x21\x99\xc5\x4d\x48\x12\x31\xd4\xbf\xbb\xe6\xb3\xa1\x78\x66\xeb\x6c\x4b\xc1\xbf\x28\x34\xb3\x30\xa0\x1f\x0f\x25\xe7\x11\x15\x32\x54\x1f\xb5\x4d\xe3\x70\x1f\x31\x91\x21\x49\xcd\xe1\xf7\x76\x87\x97\x16\xa8\x57\xe3\xfe\xea\xac\x01\x91\xfc\x7b\x9d\x88\x52\x10\xd4\x4f\xf1\xd0\xe1\x10\x69\x0a\x0c\x82\x9c\x62\xf9\x8f\x9d\xce\x05\xf8\x45\x7e\x0a\x92\x2f\x52\x8c\x26\xa2\x7b\xa6\x24\xea\xaa\xac\xfa\xf1\xf8\x05\x60\x99\x10\xa0\x90\xe9\x19\x8a\xdf\x05\xfc\x0c\x45\x61\x6d\xa3\x96\x45\x3a\x15\x61\x9a\xbd\xa3\x90\x6d\xb9\x52\x43\xd1\x9e\x41\x48\x37\x92\x47\x6d\x6e\x33\x4b\x19\x5c\x98\x52\x8c\xfd\x8c\x2d\x17\x2f\x07\x54\xae\x60\x40\xac\x55\xac\xde\xbb\x50\x16\x88\x71\xe3\x09\xc6\x18\x04\xb4\xb4\x31\x40\x63\x7e\x36\x9b\xad\x27\x1a\x92\xdf\xda\x9c\x3b\xf2\x4b\x42\x64\x7c\x00\xa4\x56\xbb\xca\x35\x5c\x8c\xe1\x57\x74\x26\x77\xd9\x77\xd6\xc7\xb4\xcb\x15\xe7\xd9\x10\x72\xb9\x28\x6f\x8b\xec\x2f\x78\x5c\xe5\xfa\xbe\x4f\xd1\xce\x80\xef\x83\xf8\xe7\x5f\xff\xf3\x82\xca\x84\xff\xfa\x5f\xf4\xf6\x8d\xd1\x85\xd2\xa2\x7c\xb8\xf2\xf4\x0a\xdb\xaa\xac\xcd\xa2\x6e\xe1\xe4\x5e\x3c\xe7\xb1\x3c\xf4\xb9\xf8\x2e\x31\x82\xf1\xeb\x6a\xf3\x73\x6d\x13\x95\x91\xd9\xe2\x5a\x0f\x42\x3a\x36\x41\x9b\xdf\x1a\x69\x58\xdd\x03\xd5\xc5\xa1\xc6\x9c\x3e\xd2\x16\xa4\x7a\x83\x10\x31\x99\x2a\xd1\x63\x04\x9e\x96\x0a\x98\x01\x69\x48\x91\xba\x46\x68\xfc\xaf\xff\x59\x98\xec\x76\x3d\x2f\x51\xa9\x01\xe7\xf8\x5f\xff\xcb\x0d\xfe\xf9\x5a\x6f\x6b\x53\xa9\x97\x8f\x34\x47\x0a\x4c\x73\x9f\xe3\xde\xb0\x5d\x97\x75\x09\x90\x14\xdb\x93\x44\xdd\x87\xf2\xb6\x62\xc7\xc0\xee\x76\xef\x89\xfb\x99\x05\x07\x39\xf4\xc5\x91\x60\xba\x81\xb2\x04\x6e\x2e\xb8\xd7\xfd\xf5\x3f\xf7\xe5\x2e\x7e\x00\xd4\x28\xa3\xd5\x8a\xa8\x48\x84\x5d\xd9\x8e\x6d\xf1\x60\xb3\x18\x8f\xd3\x98\x02\x6b\x73\xe8\xe9\x4c\xd3\xfb\xd9\xc4\x1c\xf4\x0f\xed\xb9\xf4\x2e\x4f\x98\xd9\x9c\xdf\x6e\x87\xa4\xa8\xe9\x3d\xd1\x42\x36\xf6\xbb\x78\x5b\x8f\x44\xb7\xcb\x88\x28\x3d\x44\x6f\x48\xec\x64\xa1\x6b\x83\x4a\x8e\xa6\xc2\x92\xec\xf2\x5e\x0a\x3a\x22\xa9\x99\x01\x9d\x17\xe7\x78\x16\xbc\x3e\x6e\x9a\xcb\x50\x92\x5f\x73\x73\x3d\x93\x37\x1d\x92\x1e\x36\x46\x31\x00\x40\x53\x9b\x8a\x0b\x26\x7c\x48\x19\xc0\x93\x3c\x19\xfd\x8d\x1c\xde\xa7\xe3\xdc\xfd\x6b\x26\x36\x98\xa4\x19\x71\x90\x9b\x51\x6b\x63\x8c\x0f\x3d\x19\xf8\x91\x7d\xcb\x8e\x17\x41\x5a\x09\x81\xc3\x69\x11\xda\x0a\xe6\x7b\x88\x62\xfc\x5f\xd0\x52\xde\xcb\x9b\x47\x95\xe4\x1b\x6d\x5d\x50\x97\x14\xf3\x49\xf0\x41\x48\xc0\x73\xe0\x51\x4f\xbd\x24\x5f\xd7\x05\x82\xa8\x36\x3a\x1c\x74\xb1\x8c\x1b\xd9\x6a\x14\x56\x8f\x42\x86\x91\x50\x88\x44\xd2\x28\x9e\xd3\xc7\x67\xc0\xa9\x0a\x95\x29\x51\x20\x3c\x51\x28\x4d\xba\x35\xd5\xd6\x80\x0a\x0a\xec\x04\x65\x95\x2f\xef\xb3\xa5\x09\x46\xc2\xac\xd1\x68\xca\x12\x32\x08\x91\xe5\xcb\x76\x28\x4a\x82\xd7\x81\x7e\x84\xeb\xaa\x25\xe8\xae\x41\x37\xe0\x26\x43\x0c\x9a\x8b\x72\x63\xe8\x22\x3a\xd0\x30\x5a\x1e\x15\xd6\xc8\x73\xcb\xee\xe6\x27\xa2\x1e\xd6\x2b\xfc\xb4\xd6\x26\x28\x4e\xf2\x39\x1a\x4d\xbb\x85\x09\xcc\x8c\x3e\xa3\x41\x01\x07\x28\xae\x10\x7f\x27\xa9\xc9\x60\x36\xee\xac\xa1\x89\x13\x0d\x20\x7c\x93\x07\xcd\xe1\xb6\x02\xbe\x76\xad\x31\x89\x19\x1c\xc1\xb0\x4f\x5f\xf3\x65\x60\xcf\x0e\x80\xb6\x08\x6a\xe2\xa1\x21\x38\x56\xce\xee\xa8\xb3\x8d\xae\xa9\xd6\xc9\x5b\x59\x24\x68\xb1\x23\x5f\x79\x85\xc7\xbd\x3b\x5e\x16\x74\xa6\xb0\x03\x2f\x1b\xd3\x6e\xba\xdc\xe9\xb3\x42\xdd\x65\xa5\xc0\xa9\x11\x5d\x5c\x59\x45\x34\xf2\x6e\xe6\xcf\xad\xa9\x80\xf3\xb0\x58\x21\x7c\x0a\x6c\xbe\xf6\xe3\xb9\x18\x01\x17\x30\x19\x42\xa2\xed\x12\xef\x89\xd1\x02\xbf\x0d\x46\xad\xc4\xca\x2d\x6b\x0a\x9b\x01\x1e\xb6\xcb\x96\x1b\xf9\xe2\x08\xb3\xd8\x55\xce\x04\x1d\x2c\xea\x76\x93\x0e\xa8\xed\x92\x01\x89\x43\x19\x19\xbe\x4c\x37\xb5\xab\xd7\x65\x95\x11\xd6\x4f\x68\x0a\x49\x8b\xa9\xfd\xba\x60\x00\xcc\x0f\x49\xfa\xb2\xed\x1a\x78\xbe\xc2\xc6\x0b\xe4\x97\x6d\x23\x00\x96\xdc\xc2\x99\x31\x01\xce\xf5\xa5\x26\x41\x48\xfa\x49\x3d\x48\x96\xc8\xc5\xf4\xb7\xcd\x6e\x0b\xc5\xf2\x90\x73\x2e\xc3\xf0\xeb\xc2\x14\x20\x25\xa4\x0b\x67\x48\x9a\x65\xb6\x21\x7a\x09\x20\x7c\x8b\x16\x86\xa9\x4c\xd4\x9b\xdf\x59\x95\x97\xb7\xa5\xe0\x9c\x33\xd5\x46\x17\x48\x30\xe8\xba\xe7\xb6\x62\xdc\x65\xd9\xda\x28\x89\x0c\xa6\x96\x89\x61\x0c\xa5\x76\x79\x1b\x1d\x5d\x04\x15\xe7\x55\x9d\x2d\x72\xc6\x2c\xca\xe2\x21\x7e\x30\x6f\x9a\xc3\x55\x3c\x11\x5c\x9b\x1b\xde\x98\x7c\x1f\xa2\xf5\xa2\xc5\xce\x1b\x0e\xb6\x43\xd0\xd1\x40\x91\x39\x80\x3d\x93\xd8\x49\x81\x40\xe5\xc2\x68\x0a\x2d\x0b\xf9\xc5\x2e\xe3\xc7\x84\xe3\x10\x6a\x8e\x2a\xdd\x71\x20\x6a\xab\x6c\x89\xff\x7f\x8d\xf6\xf6\xda\xd0\xde\x6b\x95\xc6\x4c\xde\x0a\x7f\x1f\x74\x4d\x89\x9a\xb1\x2c\x45\x56\xbd\x61\xc1\x1c\xfe\x5e\x4e\x2e\x62\x65\x3e\xb2\x17\x21\x4f\x91\xf4\xc9\x1a\xe6\xc0\x02\xb6\xbc\x96\x3d\xe0\x3d\x91\x2e\xf4\xe2\x83\x9a\xe2\xfe\xe8\x8a\x98\x00\x42\xc1\x13\x77\xb9\x33\xab\x32\x88\x20\xcb\x46\x4a\x53\x03\xfe\x05\x47\x16\x4d\xfc\xd6\x43\xbe\xb3\xd1\x19\xd1\x71\xc4\x73\xe1\x19\x12\x12\x66\x1b\x50\xd2\xab\x0d\xc5\x0b\x9c\xef\xcd\x7b\x38\x4b\xa0\x0c\x0b\x24\xf1\xe5\xb0\x2b\xb7\xaf\x6b\xc6\xc8\xe7\x49\xd9\xd4\xf8\x99\x28\x85\xb5\x31\xda\x32\x21\x72\x28\xd3\x89\xc8\x22\x40\x4a\x7a\xd9\x57\x6f\x4d\xb8\xe0\xc1\xef\xf3\xcb\x39\x90\x2b\xfe\xa2\x89\x3d\xdf\xab\xbb\xac\xaa\x1b\x4c\x14\x0b\x9f\xf1\x1b\x84\x25\xda\xb4\x25\xc9\x4a\x88\x77\x07\xbf\x76\xdd\x22\x40\xec\x67\x63\xb6\x72\x25\x72\x50\xc2\x88\xe4\x5a\xe3\x99\x34\x6b\x50\xab\x3a\xa3\x19\x39\x4b\x02\x4d\x6d\xdd\x6e\x93\x17\x59\xc2\x04\x5e\x5d\x62\x46\x47\x3e\xdb\xa7\x3c\x28\x9f\xd3\xee\x9b\x83\x5b\x12\xd8\x45\xfe\xdb\x40\xe4\xa2\x16\x4c\xb1\x3e\xc0\x8c\x42\xdf\x1d\xcd\x2b\xdc\x2b\x72\x96\xe6\x8d\x33\x7f\x3f\x80\xa3\x47\x86\x0d\xd8\x33\x5d\x47\x6f\xfe\x40\xb4\x6e\x19\xa2\x75\x4d\x81\xc2\xff\x07\x88\x18\x39\x74\x67\xcb\xea\xff\xfd\xeb\x7f\x1d\xfc\xcc\xf0\x89\x9d\x1b\x12\x7e\x0a\x14\xc5\xce\xdb\xf1\x32\x1d\x90\xbf\xcd\x12\x3d\xbf\xca\x17\xab\x7e\xf0\xf2\x9f\x75\xf6\x14\x24\x27\xb9\x97\x28\x1f\x3e\x6c\xcf\x62\xbf\x1a\xc8\x34\xef\x5c\x0a\xb9\xd1\x15\x9c\x79\x4b\x96\xad\xd2\x35\xdd\x60\x45\x3e\x86\xc9\x87\xe4\x13\x38\xcd\x8c\x3a\x89\x6e\x2d\x1d\x58\x0c\xcc\x12\xd9\x75\x34\xb2\xfc\x30\xe6\x6c\x01\xb5\x6f\xd5\x26\xb3\xb9\xd1\x4b\x64\x9a\x73\xe6\x24\xcb\xa9\x75\xdc\xef\x06\xb3\xac\xa8\xfe\x09\xb8\x72\x2b\xac\x82\x76\x8f\x85\x26\x8e\x08\xa1\xdd\x30\x00\x0a\xc1\x3c\x1f\x42\xa8\xdf\x81\x06\x96\x25\xb3\x9e\xc5\xc5\x39\xfb\xc8\x35\x16\x5e\x0d\xa8\x32\x50\xe9\x5e\x2c\x05\x85\x5c\xd4\xcb\xec\x06\xb2\x9a\x07\xd0\xe7\x54\x77\x80\x75\xc0\x70\x42\xd7\x02\x7b\xdd\xa4\xc7\xf4\x01\x4e\xee\xe2\xc6\x29\xe8\x4b\x97\xfe\xfa\x9f\xda\x39\x58\x7f\xfd\xaf\x6e\x5f\x89\x49\xe0\x4d\x55\x71\xbc\xb8\x24\x27\x9a\x52\xb6\x7e\xb6\xfb\x4c\x59\x51\xb2\x0e\x12\x14\x86\x06\xdb\x38\x2e\x79\xf6\x35\x09\xe4\xf0\x83\x03\x7f\x78\x0f\x99\x1d\x8e\xea\xc6\xd1\x5c\xd1\xd4\xa5\xc1\x93\x5c\x54\xc6\xf8\x43\xb8\xe1\x15\xd7\x1d\x1c\xde\x1e\x7b\x2b\xa2\x85\x51\x33\xc2\x74\x8d\x33\xa8\xed\xea\x52\x95\x97\x16\x42\x58\xb1\x0e\xcd\x81\xf3\x04\xb5\xb5\x17\x65\x51\xd0\xc2\x86\x56\xb3\x3f\x0d\xd4\x5f\x15\x65\x53\xdb\x20\xc8\x66\xc7\x7d\xdf\x57\x97\x3b\x0d\x10\x31\x63\x55\xe5\xe5\xb8\x61\x87\xe3\xb0\x37\x04\xc6\x21\xf4\x9b\xc9\x79\x23\x76\x7a\x6f\x45\x6f\x2b\x36\x49\x44\x4f\x80\xa3\x94\x59\xbb\x43\xff\x7e\x4b\x12\x8a\x40\xad\xed\x36\x1e\x64\x1f\x0a\x2f\x37\x3f\x6f\xd1\xbd\x28\xab\xc0\x7a\xf1\x70\x8b\x18\x9a\x1b\x1e\x27\x0a\xe3\xdd\x73\xcd\xd2\x75\x2f\xed\x4c\xce\xdd\xca\x28\x34\x67\xbc\xa6\xd9\x3c\xc3\x7a\x5a\x8a\x18\x73\x8d\x98\xfc\x14\x9c\xd5\x02\x35\x19\x65\x17\x08\xe8\x81\x24\xbf\x81\xdd\x19\x4d\x1d\xf1\xea\xd0\xca\xbe\x7a\xcb\x88\x5d\x8f\x68\xf4\x9c\x0c\x8d\x64\x05\x70\x6a\xd3\xa9\x7b\x1b\xc6\xac\x03\x58\x1a\xcd\x96\xa2\xdb\xa2\x6c\x09\x76\x95\xd6\x3c\x90\x50\x21\x56\x52\x4e\x61\x41\xf5\x56\x2d\x66\xc3\xb0\x91\x98\xc8\x9a\xd4\x27\x20\x46\xad\xb7\x75\x23\xa8\x03\x1c\x2a\x1e\xb5\x2c\x1b\x1e\x99\xe1\x0d\xa3\x02\x19\xfe\x7d\x64\x3b\x6c\x58\x91\x78\x99\x68\x67\x6e\x64\x0d\x36\x93\xc3\xcb\xf5\x41\xb1\x1f\xdf\x14\x14\x18\xf5\x02\xaa\x8f\x3d\xd0\x1d\xb4\xd8\x01\xb0\xb7\xe7\x25\x6e\x08\x83\x47\x6e\x6c\x86\x73\x03\x3a\x89\xee\xb3\x14\x9a\x59\x91\x9e\x81\xe8\xa1\x1f\x5a\x66\x09\x8f\xce\xb1\xc0\xac\xf7\x92\xf0\x00\xd2\x63\xd2\x55\x40\x02\xb6\x43\x3e\xcb\x92\xb9\xa2\x99\x4e\xc6\xc7\xd8\x7f\x50\xe7\x50\xff\x7b\x67\xd4\x39\x94\xe3\x5b\x69\xbc\x86\xd7\x43\x02\x49\x98\x25\xa7\xfd\x67\x89\x3a\xc3\xff\x79\x89\xc0\xa7\x62\x8b\xc7\x2c\x5f\xf2\xbc\xff\x0c\xc5\xac\x5a\x6f\x18\xe9\xbb\xe2\x36\xbb\x33\xb9\x35\xee\x2a\x67\xa1\xdd\x9a\xaf\xfd\xa8\xee\xaf\x81\xfe\x83\x48\xd5\xc1\xcf\xb1\x8d\xde\xec\xfb\xad\x2f\xf0\x98\xb4\x36\x3f\x81\x58\x75\x27\x33\x2c\x30\xa4\xba\x15\xb3\x80\xce\x1a\x31\xb3\x25\x78\x3f\xab\xf8\x00\xf4\x84\x67\xa3\x0e\x9a\xfc\x2e\xa7\x13\xcc\xb1\x48\x66\xb2\xcb\x5c\x3a\xb4\xbc\x82\x40\x58\x17\x2d\xff\xd7\x9b\xc7\xc4\x12\x41\xd6\x9e\x24\x1b\xd8\x64\x85\x5b\x80\x7b\x75\x0c\x32\x6d\x10\x2d\x71\xd7\x7c\xe0\xdf\x03\x17\x88\x7f\xe8\x60\x49\x37\x50\x24\x79\x02\xa4\x31\x38\x67\xd6\xbb\x6a\xb1\x56\x83\xd5\x4a\x67\x95\xed\x21\x10\x10\x41\x78\xfe\x03\x40\x9d\xcc\xe3\xd3\xca\x15\xf2\x23\x24\x22\x3e\x19\x76\x5a\xb8\x5f\x28\x4f\x7f\x69\x06\xc5\x1b\xe4\xe0\x79\x80\x81\x5f\xa3\x96\x32\x28\x47\x95\xb9\x73\x65\xc5\x6c\x6a\xda\xeb\x32\x00\xed\xa9\xb3\x2e\x7d\x31\x5f\xae\x51\xeb\x0f\x13\x3d\x80\xa2\x8a\x12\xcb\x51\xa4\x11\x69\x56\x44\xd8\x9d\x19\xf8\x10\xa2\x03\xa7\x01\x19\x49\xc8\x94\xd5\x65\x54\x00\xbe\xbd\x8b\x89\x66\xe1\x69\x73\xe7\x8d\xd2\x1f\x31\x43\xf4\x3d\x19\x81\xa1\xbd\x82\x4a\x31\xb6\x9f\xbd\xd6\x86\xb8\xb8\x61\x42\x6e\x34\x89\xeb\xd0\x89\x8e\x0a\x81\x8d\xe0\x63\x95\x19\xb0\x2b\x38\xce\x17\x16\x01\x84\x65\x41\x15\x12\x89\x30\x6b\x6f\xaf\x6f\xb6\x06\x55\xa0\xc3\xab\x2d\x87\xf6\xa3\x82\x9a\x9c\x00\x4f\x68\x9e\xee\x0a\x37\x49\x43\x38\xf0\xc1\x40\x28\x20\x51\xcb\xdd\xed\xda\x93\x17\x2d\xff\x75\x20\x50\xff\xd2\x3f\xfd\xa7\x97\x58\xff\x79\x52\x56\x27\x20\x23\xfa\xb7\xc7\x81\x3d\x82\xff\x7a\xfd\xea\xe5\xeb\x06\xfe\xeb\xf9\x8b\xd3\xb3\x6f\xf8\xaf\xdf\xe3\xe7\x72\x74\xa3\x2e\xd3\x51\x3a\x19\x5c\x35\xaa\x40\x9f\xf8\x72\xf9\x44\xbd\x33\xf3\x6a\xe7\x36\xae\xd3\x37\xdf\xbf\x69\x95\x84\x7e\xff\x06\x50\x3d\x01\x4b\xfa\xae\xdc\x15\x4b\xda\xdb\x81\x96\xe3\xe5\xa9\x7a\x57\xe9\xe2\x73\xee\xfc\x91\x3a\x51\xef\xb2\x55\xbd\x56\xef\xf2\xb2\xac\x12\xf5\xb6\xb4\xb5\xbb\xf2\xc3\x40\x3d\x3b\x3b\x3d\x7d\x76\x72\xfa\xfc\xd9\xa9\xba\x99\x0e\xbe\xae\x9a\xf4\xce\x54\x73\x5d\x67\x1b\xf7\xc7\xcc\xb4\x2a\x18\x3c\x9e\x15\xb3\x2b\x10\xf6\xc1\xa3\x28\xa8\x9b\xe4\xe5\xbd\xdb\xf8\xae\x2b\xa3\x37\xf3\xdc\x3c\x11\x46\x8b\x24\xa2\x85\x4a\x1b\x5b\xcb\x0a\xd0\xcd\x56\x17\x50\x1b\x8a\x4c\x70\x9f\x8d\xd9\x02\x8f\xad\x65\x42\xe5\x8d\xa9\x16\x84\xd0\x2a\xad\xb8\x03\x20\x68\x68\x6f\xdb\x3a\x51\xe5\xae\x52\x97\x04\x70\x6a\x54\x7a\x4a\x8e\xc5\xba\x0c\x3e\x16\xc2\xdf\x1f\xaa\x84\x8d\x8a\x29\x4f\x4e\x98\xa9\x8e\xea\x07\x4c\x54\x31\x0a\xd7\x7a\x73\x1e\xa9\x36\x98\x76\xf1\x40\xc3\x44\x5d\xac\x7b\xda\xa1\xa9\x20\xb5\x09\x21\xf4\x2a\xeb\xa7\x58\xde\xf9\x1e\x7a\x07\x13\x7f\x96\xf2\x04\x68\x23\xe2\x58\x61\x69\xc0\x42\x17\xac\x74\x14\x98\xc5\x7d\x91\x47\x5d\x96\xfd\x27\x50\xc1\x76\x0f\x36\x8f\xfe\xdc\xaa\x28\x4d\xdc\x9f\x10\xcc\xbe\x32\x15\xcb\x94\x51\x1f\x26\x64\x2d\x43\x4a\x60\x2a\x6c\x26\xf4\x78\x0f\x0f\x0f\x26\xf1\x70\x78\x64\x0f\x53\xa1\x15\x44\x18\xc1\x8d\x0a\x63\x75\x0b\xb5\x16\xc0\x2c\x55\x01\x8e\x44\xcc\xde\x46\x8b\x9b\xcc\x39\x4d\x1a\x0a\xd7\x29\xb7\x06\x05\x75\x90\x70\xfb\x5e\x17\xee\x9f\xe2\x56\x77\x4d\x57\x79\x34\xb1\x5d\x6c\x33\xb3\xc0\x77\x67\x00\x4c\x04\x8a\x1a\xd7\x0a\xee\xdc\x1f\x03\x85\x96\x7b\xdc\xe7\xa2\xbc\xf7\xcf\x5d\x96\x64\xd4\x02\x33\xa8\xed\x3f\x99\x95\x9c\x8a\xc5\x11\x62\xa3\xe7\xde\xa8\xc2\x88\x5e\x8a\x2a\x1e\x09\x82\x52\xcd\xb3\xa5\x2f\x73\x28\xd5\xd2\x14\x7b\x46\x94\x5a\x09\x3d\x04\xd4\xd6\x67\xd6\xe5\xb3\x60\xa9\x73\xb0\x1c\xaf\xe2\x2a\x9c\xf8\x2d\x95\x2e\x6c\xae\xb1\x9a\x62\x61\x2a\x88\x13\x46\xcc\xa7\x6e\x0c\x58\xf1\x8f\xba\x53\xec\x35\x72\x8b\x91\x63\x54\x56\x7c\x31\xa9\x43\x65\x75\xff\xc9\x3b\xe0\x08\xd1\x9b\x2d\x80\x8e\x1e\x78\x96\xe6\xac\x93\x27\xa8\x61\x86\xb6\x5b\xe7\x56\x20\xd6\x32\x88\x24\xfa\x2a\x8b\x5b\x2e\x81\x13\x25\x28\x5c\x46\x41\x5d\x15\x4d\xc2\xa6\xe2\x7d\x98\xa6\xf5\xda\xec\x61\x01\x25\x7e\x96\x89\x99\x25\x92\x25\x0b\x90\xbf\x1b\x90\x8a\x3d\x3c\xca\x99\x97\xee\x92\x0d\x39\x88\xd4\xfd\x4f\x3e\x9a\xae\x69\x40\x0e\xe6\x7d\xa9\x6c\x6d\xb6\xf6\x07\x75\x7c\xda\x13\x49\xf8\xb8\x5b\x41\x32\xf0\xac\x87\x62\xd7\x34\x0f\xc4\xce\x8e\x4e\xb4\xeb\x05\x84\x1d\x7b\xa8\x19\x43\xa6\x3c\xfa\x38\x8a\xf8\x80\x05\x2d\x54\xbc\xac\xaf\x83\x1d\xe4\xb6\x44\x5a\x34\xc8\x4e\xe2\x76\xf4\x9d\x47\x28\x32\x5a\xa9\xdc\x55\x38\x9d\xef\x09\x4f\x01\xbd\xc9\xd3\x09\x3a\xd4\xf0\x09\x16\x84\xf7\x02\x03\x24\xee\xb8\x21\xe4\xcc\x88\x5e\xde\x86\x7d\x83\x38\x7e\x25\x37\x6a\x5f\xc3\x34\xdf\x43\xc0\xc9\xbd\x04\xa2\x10\xa8\x47\x60\xd1\x31\x08\xcd\xcb\x20\x86\xe9\xe7\x87\x3b\xa4\xdc\xea\x85\xb6\x30\x42\x98\xaa\x52\xe8\x3c\xac\x45\xc1\x5b\xe2\xf5\xba\x28\xc2\x3f\xcf\xb1\x52\xaa\x86\x60\x3f\x36\x03\xd1\x59\x98\x79\xc5\x02\x9b\x55\x0e\xb1\xe4\x22\x7a\x16\x6f\xef\xdf\xa9\xca\x6c\x77\x84\x3d\x43\xda\x87\xad\x6b\xa1\x3d\x90\x65\x5e\x51\xfd\x0f\xf1\x26\x8b\xe8\x58\xa8\xe9\x5a\x30\x22\x2d\x87\x18\xd7\x61\xeb\x46\xcd\xd2\xc9\x07\xa4\x5d\x3f\x1f\x8f\x2e\x86\xc8\x4b\xfd\x0e\x18\xa6\xaf\x3f\x01\xa3\xb8\xa7\x43\x67\x3a\xe9\x0f\xe3\x8b\xe1\xbb\xe1\x39\x10\x4a\x3b\xff\xf7\x59\x83\xdd\x75\xe0\xe9\x6a\x1b\x54\x11\x7c\xba\x45\x80\xd7\x26\x86\xe9\x2b\xb9\x23\xbe\x82\x36\x22\xb3\x07\x0e\x2d\x3c\xd6\x8f\xae\xb1\x79\x47\x09\x86\x06\x13\x3c\x15\x03\xd1\x05\xf1\xe2\xf2\x27\xdc\x83\xea\x2d\xf8\xec\xea\x28\x8e\x90\xba\x17\xf3\xd3\x88\xbc\x52\x24\xa4\xae\xc3\x33\x40\xad\xc8\xdd\x2a\xc8\x33\x9a\x97\xb0\x34\x3b\x9e\x47\x9e\x7c\xc8\xdb\x79\x20\xf0\x5c\xaf\xe3\xfa\xd7\x3e\x92\x07\xca\x48\x2f\xa1\x7e\x31\xc4\x7e\xb4\x2f\x77\x47\x7d\xc1\x14\x71\x88\x02\xa1\xd3\x9c\xf4\x0d\x04\x63\x26\x1c\xbf\xda\x46\x27\x73\x56\x27\x31\x42\xaf\xab\xee\x7a\x51\x16\x76\x9b\x2d\x76\xe5\xce\x12\x84\x40\x44\x74\xf3\x20\x50\x59\xb2\xbc\x30\x36\x32\x8a\xfb\x36\x6b\xfa\x1b\xac\x09\xae\xd1\xbc\xb7\xfc\x88\x46\x69\x56\xd4\x7a\x51\xfb\xe3\xc1\x93\x72\xb9\x56\xc1\xb0\xfb\x48\xca\x21\x6b\xaf\x58\x06\x48\x8d\x65\xae\x48\x18\x4f\xff\x26\x77\xcd\x2d\xeb\x2f\xe1\x8c\x6f\x57\x79\xf3\x50\xcb\x32\xc2\x07\x5e\x0b\x3a\x4d\x3e\x03\x46\x37\x8b\x21\xc4\x22\x53\x38\x1a\x3d\x64\x6f\xbb\xde\x5b\x20\xba\xd4\xa8\x56\xc1\xe0\xc5\x0a\xb9\x5a\xdc\x7b\x9b\x6c\x18\x74\x1e\xc0\x49\xc5\x44\x60\x9d\x33\xc0\x67\x3b\xe3\x49\x8a\x7b\x56\x7b\x3a\xc1\x22\x8a\x2b\xb5\x3b\xd6\xea\xb5\xe7\x2c\x3c\x65\x55\x8c\xf6\xc4\x81\x34\xce\xb2\x51\x2f\xec\x4b\x84\x7b\x02\x61\x12\x48\x3b\xb2\x9c\xd1\x27\x55\xb5\xef\x28\x45\xb7\x35\x85\xd1\xfc\xec\x24\x88\x2b\xbc\x04\xee\x66\xb8\xc4\x52\xd7\x81\x4c\x0e\xae\xfa\x91\x71\xb3\x4a\xa9\xb9\x7c\xff\x3d\x12\x9f\xac\xc2\x72\xf7\xcf\x8f\x05\xc9\x68\xae\x27\x9e\x70\xfa\x9e\x29\x53\x90\x2a\x54\xf0\x23\x76\x0d\x81\xbb\xa0\x46\x12\x70\xbf\x4d\x70\x84\x90\x71\x39\x8d\x6a\x7e\x64\x00\xf7\x99\x19\xed\xba\x82\x27\x91\xdb\xf7\x60\x7d\x30\x56\xd1\x8d\xfe\xd7\xed\xac\x81\xba\xdb\xd3\x2c\x44\x31\x6f\x84\xb9\xfa\x73\x5f\x18\x16\x0d\x85\xe8\xa8\x11\x89\x62\x95\xcb\x12\x60\xb6\x3d\x5f\xf6\xdb\x63\x13\xc1\x0f\x39\x6f\xd8\x1e\x6a\x52\x19\xbd\x44\x97\x0a\x8c\x10\xa0\x59\xd4\xac\x2e\x05\x31\xe5\x6a\x57\x08\xab\x12\x87\xd1\xcd\x69\xf8\xa3\xad\x35\xa4\x44\xaa\x5d\x01\xbb\xb5\xc8\x1c\xfa\x07\x11\x1a\x11\x6d\x95\xcc\x19\xbc\xb6\xa6\xc3\x19\x38\x60\x77\x3a\x57\xf7\x1a\x2c\x4c\xe7\x5f\xa1\xda\xcc\x32\xb3\xdb\x5c\xe3\xd6\x56\x14\xe5\xae\x58\x18\xa2\x93\xf0\x64\x0c\x5f\xb0\xe9\xf9\xd3\xf3\xb0\x71\x75\xec\xec\xb9\x1c\xf0\xfb\x82\x7e\xc9\x7d\x6f\x40\x0b\xf1\xc5\xbd\xe0\xe8\xa0\x1b\xef\x86\xaf\x32\x8d\x4c\x26\xf7\xb1\x24\x0a\x09\x06\x0b\x15\x55\x9b\x3c\xe7\xd3\x0d\x94\x6d\xd6\xce\xea\x2a\xd5\x5d\x66\xee\xbf\x6c\xef\xf3\x3a\x3c\xbd\x5f\xbd\xdb\x61\x93\xbc\x7e\x70\x34\x99\xc8\xba\xee\x9a\x93\x19\xc0\x8a\x29\x98\xc0\x0e\x08\x34\xeb\x83\xeb\x67\x7d\x7b\x5b\x99\x5b\x41\xb6\xc9\xc8\xfa\xa5\xd9\x1a\x94\x2e\x0a\x62\x14\x72\xfd\xba\x11\x71\x76\xe9\xd2\xd3\xee\xf6\x20\xb9\xa9\xee\xca\x7c\xb7\x31\x8c\x88\x2e\x2b\x60\x49\x6f\x40\x06\x08\xfb\xee\xd3\x5b\xf3\x8a\xbb\x59\xd8\x58\x61\xd5\xda\x45\xb9\x35\x81\xfe\x00\x16\x71\x93\x0e\xe8\x10\x15\x92\x6c\xaf\x30\x4b\x2a\xd1\x70\xde\xff\xf1\x85\x61\x1f\x3f\xeb\x81\xc4\x2e\x42\x2c\x0f\x30\x46\x3e\x78\x12\x08\xc9\x2e\x40\xb0\x1e\x3e\x0f\xa0\xb6\x64\x75\xf0\x58\xd0\x0b\x0c\x3a\x81\xc2\xaf\x1f\x0a\xcf\xed\x00\x60\x22\x90\x9a\x02\xa2\xd7\x07\x98\x1e\x58\x4a\x98\x81\x42\x8f\xd8\x9f\x87\xbe\xe4\x47\x55\x56\x49\x38\x35\xda\xcd\xd3\x20\x91\x56\x1b\x9a\x99\x09\xca\x37\xe1\x04\xac\x55\x6e\x34\x70\xb2\x3a\x47\x69\x6f\x74\x85\x7b\xba\xb7\x3a\x24\xd0\x1c\x9c\x29\xde\x90\x71\xfe\x16\xee\x00\xd4\x39\x2f\xa4\xc0\x80\xcd\x5c\xb0\x61\xa2\xf5\x50\x5a\xe4\x00\x03\x86\xa4\x40\x88\xbb\x30\xea\x31\x3c\x6e\xfe\x06\x3d\xb5\x38\x34\x90\x32\x0b\x28\x6c\x51\x30\x7a\x41\xa6\x9d\x13\x41\x07\x5b\xc9\xfe\x04\x73\x9e\xf7\xd5\x31\xb8\x37\x2c\x03\x9a\xa1\x6b\x48\x61\x52\x04\xfe\xb9\x8e\x2b\xca\x42\x48\xa0\xb4\x1c\x33\x94\x99\x5e\xc5\x8d\x92\xbb\xe7\xe3\xeb\xc3\x19\x7f\xa6\x2f\xc9\x8a\x99\x7c\xc3\x4d\x12\xb7\xce\xd1\xd7\xa8\xdb\xe4\xc5\x34\x34\x70\xd1\x43\x44\xc6\x59\x8d\xb4\xfc\x31\x53\x30\x32\xbf\xfa\xd1\x8f\x3a\x0b\x75\x0f\xc8\x8e\xb6\xcd\x66\x09\xde\xe3\x2c\x58\x2f\x3f\xaa\xf9\xae\x4e\x10\x49\x45\xdc\x11\x44\xe9\x00\xb1\xf2\xac\xc6\xc8\x18\xd4\x8b\x12\x3a\xb6\xf9\x64\x7e\x6a\x28\x1d\x84\xa8\x82\xae\x96\x2a\xcf\xe6\x95\xae\x32\x36\xe7\xc3\x3c\xa9\x91\xdd\xb0\x42\x1b\xcf\xee\x6d\x6d\x36\xca\xa3\x0f\x10\x5f\x1b\x7d\xb3\x3b\xe5\x91\xb2\x1f\x8e\x79\x7e\xc1\x1a\xd8\xe0\xc9\x1e\x84\xed\xcf\xd7\x9e\xb2\x89\xd9\x7c\xb1\xae\x5b\x6f\x6e\x12\x61\x31\xe7\x6e\x42\xc6\x77\x22\x24\x60\x93\x86\xa1\x28\xca\x8f\xc2\xb6\x4c\x2b\x5b\x4b\x4d\x0e\xbf\x4d\x8a\x3c\xf8\x21\x27\x18\x18\xc0\xeb\xda\x6c\xb6\xb5\x14\xad\x2f\x7f\x5d\xab\x32\xab\xee\xca\x6c\x49\x85\x9e\x59\x9e\x1f\xd4\x5c\x94\x61\x31\x81\x87\xb8\x6e\x58\x17\x92\x13\xfa\x7d\x79\x8f\xc4\x26\x6c\x9e\xde\xaf\x4b\x0c\xde\xf8\x25\x86\x5e\x0b\x0c\x62\xfc\x6c\xfe\x03\x00\x3f\x82\x44\xe4\x43\xd6\xac\x0f\xe9\x70\x0c\x3b\xab\x84\x06\x9f\x07\xa0\x4b\x3d\x5d\x8c\x1a\x50\xeb\x82\xf8\x2d\xa0\xce\x42\x61\x01\xa3\xcc\xdf\xee\xbb\x42\x3b\x08\x18\x8c\xeb\xfc\xa2\xb3\x98\xdd\x8a\xae\x00\x44\x8f\x64\x3d\x08\xec\x0b\x9d\x7c\x98\x15\xd1\xd3\xf4\x24\xbe\xd0\xde\x59\x26\x5d\x81\x28\xc6\x02\x43\xa0\xa1\xce\x50\xd8\xbe\x6d\x1c\x7e\x79\x43\x93\x38\x78\xdb\x98\x27\x34\xa0\x96\x71\x63\x56\xb0\x0a\xfa\x90\x9a\x87\x21\x74\x85\x3a\xe3\x30\x27\xb7\x2b\xae\xfb\x38\x10\x74\x8b\x57\xa9\xa8\x61\x67\x14\x67\xac\x76\x51\x34\xc2\xd0\xdf\xb1\xf0\x4b\x10\x94\x68\x4b\x7d\x67\x1e\x07\x3c\x7b\x20\x7d\x84\x00\x43\x8a\x89\x54\x06\x29\x73\x28\x88\xdb\x85\x05\x3a\x30\x93\xb1\xeb\xdc\xa0\xb9\xef\xce\x36\x86\xa0\x99\xd1\x23\xb8\x76\x84\xcb\xe4\xb3\x42\xd9\x6d\x56\x65\xbe\x48\x86\x51\xda\x74\x07\xa6\x14\x91\xd4\x0f\x8c\x68\x94\xdd\x24\x65\x6f\x96\xcd\x76\xaf\xf0\x91\x53\x64\x09\x5a\x98\x8a\xe6\x13\x4c\x26\x06\xdf\x64\x16\x0c\x19\x86\x7c\x67\xc5\xed\x2e\xb3\xa0\xb7\xc6\x57\x14\xbb\xcd\xdc\x54\x3e\x30\xec\xc7\x94\x10\xfb\x6e\xb2\xc4\x97\x36\xb8\x19\xf8\xf8\x08\x71\xca\x0c\x3d\xb5\x23\x00\x25\xeb\x1a\x03\x6d\xee\x01\x47\x49\x9c\xbd\xf2\xde\x82\x80\x03\xd6\x87\x2a\x83\xc8\x19\x87\x97\xeb\x3a\x54\x02\x54\x1c\x15\x88\x5e\xc5\xe3\x1b\xa2\x9f\x87\x66\x43\xeb\xcb\xbd\x1b\x80\x5d\xb0\x7f\xac\x03\x92\xa6\x53\xee\x1a\xc3\x77\xb8\xad\xf5\x2b\xda\x42\x48\x65\x92\xb9\xbd\x77\x13\x14\xc0\x3f\x8b\xb2\xda\x96\x00\x9a\x8d\xf0\x7f\xfe\x80\x28\xb8\xa2\x39\x4e\xb2\x51\x12\x34\x32\xa4\x44\x97\x22\x5b\x00\xc1\x63\x13\xb0\x91\x7d\x51\x24\x46\xd6\x39\x2b\xe6\xce\xee\x90\x05\x41\xfb\xa6\xc1\xa9\x0b\x92\x46\xe4\x4e\x3f\xfe\xa5\x8d\xb7\x1d\xba\xec\x47\x48\xbc\x96\x1b\xe3\xd6\x97\xc5\xac\x88\xb7\x72\xac\x4f\x72\xf4\xd5\x78\xe7\x6c\x88\x05\xe2\x14\x79\xd1\xdd\xee\xe0\xdc\xa6\xa6\xd4\xf7\xa5\xba\x2d\x75\x0e\xbd\x07\xcb\xae\xba\xe3\x19\x87\x49\x92\x5a\xd7\x3b\x4c\x9f\x81\x92\x0e\x3b\x64\xf0\x2b\xce\x8c\xc7\x99\x67\x78\x52\xb9\x29\x7d\x95\xb9\x5d\xeb\x8a\xab\xbd\x2b\x43\xc0\x76\x7f\x0b\x11\x8e\xe4\x18\x2b\x84\x2a\x0b\xc1\x7c\xf5\x06\x7e\xfb\x36\x3d\x1f\xdc\x4c\x53\x54\xf0\x9c\x8c\x2f\x27\x83\x0f\x0a\xa4\x3a\x49\x42\xf5\xdd\x24\x4d\xd5\xf8\x1d\x48\x97\x5e\xa6\x89\xbb\x6e\x92\xba\x2b\xe4\xa3\xde\x8d\x27\xf2\x01\x49\x43\x71\xf3\x3a\x9d\x7c\x18\xce\x66\xe9\x85\x7a\xfb\xa9\x21\xbf\xd9\x57\xe9\x9f\xcf\xd3\xeb\x99\xfa\xf8\x3e\x1d\x05\xf9\x57\x35\x9d\x0d\xdc\xf5\xc3\x91\xfa\x38\x19\xce\x98\x91\xeb\x7c\x7c\xfd\x69\x32\xbc\x7c\x3f\x53\xef\xc7\x57\x17\xe9\x04\xd2\x20\x4f\x59\x37\x96\x65\x5c\x5d\x33\x7e\x1a\x5e\xc4\xdf\x74\x04\xfc\x5f\x47\x8f\xc8\x04\xa4\x43\x78\x50\xfa\xe7\xeb\x49\x3a\x75\x9f\x3f\x9e\xa8\xe1\x87\xeb\xab\x61\x2a\xd9\xc1\x12\xf5\xf6\x66\x06\xa2\x9c\xa0\xd3\x99\x5e\xa8\xd9\x18\x7a\x86\xaf\xe5\xa7\x0f\x51\xfa\xf5\x17\x91\x86\x61\x07\x8e\x66\xc3\x49\xaa\x26\xc3\xe9\x1f\xd5\x60\xca\xdd\xfa\xa7\x9b\x81\x7f\xce\x75\x3a\x79\x37\x9e\x7c\x18\x8c\xce\x53\x2f\xc4\x1a\x86\xd1\x7d\x2d\x08\x86\xaa\xe9\xfb\xf1\xcd\xd5\x45\xf4\x77\xd7\x4d\xa9\xba\x48\xdf\xa5\xe7\xb3\xe1\x4f\x69\xe2\x2e\x54\x83\xe9\xf4\xe6\x43\x4a\xbd\x3d\x9d\x41\xf7\x5c\x5d\xa9\x51\x7a\x9e\x4e\xa7\x83\xc9\x27\x35\x4d\x27\x3f\x0d\xcf\xa1\x17\x26\xe9\xf5\x60\x38\x41\x71\xd3\xc9\x24\x05\x89\x54\x0f\xab\x1d\x8e\xdc\x14\x49\x7f\x72\x13\xe0\x66\x74\xe5\xbe\x75\x92\xfe\xe9\x66\x38\xe9\x9a\x06\x20\x51\x7b\x39\x49\xa1\x2b\xe5\xa8\x7f\x1c\x5e\x5d\x91\xec\x6f\x3c\xf4\x5e\xd5\x36\x0c\xfd\x27\xf5\xf1\xfd\x18\xf4\x52\x21\xdf\xf5\x89\x27\xc7\x24\xf5\x09\xb1\x78\x4e\x0c\xa6\x62\x6a\x0e\xde\x8e\x5d\x1f\x44\x0a\xc0\xae\x43\x40\x7f\x96\xd5\x5a\x03\x41\x9c\x7b\x35\x25\xe8\x3a\xc5\x80\x0f\x6b\x01\x0f\x26\xc3\xa9\x7b\x82\x9b\x85\x34\x62\x6e\x01\xba\x99\x36\xe2\x19\x32\x1b\xab\xe6\xa2\x14\xfa\xc9\xed\xd9\xe7\x45\x82\x2f\x06\xb3\x81\x82\x16\xcf\x06\xea\x6d\xea\xae\x9e\xa4\xa3\x8b\x74\x02\x8b\x69\x70\x7e\x7e\x33\x19\xcc\xd2\xa0\xf4\xab\xa6\x37\xd3\xd9\x60\x38\xc2\x41\x71\xdf\x0b\x4b\x79\x38\xb9\xf0\xab\x09\x26\xa8\x97\x16\x8e\xa7\xd8\x6c\xac\xc6\xd7\x29\x3c\x12\xa6\x9a\x18\x10\xbc\x62\xda\x6b\x68\x09\xe3\xe8\xa9\x68\xcd\x7e\x52\xef\x07\x53\x14\x15\x1e\x5c\xfc\x34\x9c\x7e\xa1\xa6\x70\x3a\xc2\xeb\x3a\xf2\xa1\x4f\x06\xdb\xad\x29\x96\xd9\xcf\x3f\x38\x87\xc3\x6d\xfb\x03\xa8\x1e\x41\x44\xc5\x0c\x0e\xfc\xba\x74\x26\x62\x05\xf8\x6f\x3a\xd9\xec\x13\x3a\x0a\x3d\x19\x2b\xdb\x3e\x88\x6a\xe0\x18\x24\xe5\xa5\x29\x38\x42\xa7\xe3\x2d\x28\x7c\xd9\xda\xd7\x77\xa2\x3f\x54\xaa\xf5\x6e\xa3\x0b\xd0\xad\xab\xa1\x9a\xda\xd6\xa0\xc8\x06\x62\xe7\xeb\xcc\xdc\x11\x2d\x31\x96\x76\xb0\x14\x67\x17\x8f\xbc\xcf\xc9\x2f\x80\x40\x27\xc6\x04\x30\x3c\xa6\xc5\xfd\x0c\x78\x16\xf6\x10\xea\x5a\x93\xe3\x1c\x6c\x20\xa1\x6f\x23\xa2\x1b\x7d\x35\x44\x46\x70\xbd\x72\x2d\xc6\x9a\x77\xba\x79\xc3\xd7\x42\x6c\x1d\x08\x9f\x34\x10\xf8\x83\xc7\x8f\xda\x50\x25\xc6\xce\x0d\xd4\x75\x63\xac\x1e\x64\xda\xf6\xe4\xb6\x03\xa9\x08\x9a\x63\x71\xfe\x2d\x68\x01\xc9\x22\x73\x11\x38\x33\xea\xc8\x1f\xfd\x47\x2a\xcf\x0a\x0e\xa4\x6f\x4b\x08\xe9\xc7\x51\x23\xf0\xdb\x28\xc4\x0e\xa4\x18\xbb\x62\xd9\x7f\xf2\x3f\x5d\x37\xc2\xad\x1c\x7b\x13\x9f\xfe\x9d\x85\xfa\x42\x7a\xea\xbc\xca\xcc\x4a\x65\x4b\xa3\xa1\xad\xa4\x7c\xe0\xcc\xb6\xfe\xff\x52\x4d\x44\xe1\x7e\xaf\xfe\x27\x57\xaa\xa2\x4d\xf3\xbf\x9e\x70\x59\x03\x3b\xd7\xd1\xd0\xfe\xe8\x61\x48\xd1\x80\xa2\x51\x2b\x70\x1e\x59\x7d\x48\x59\x01\xa0\x02\x07\x72\x8f\xf6\xcb\x8d\xc1\x1f\x45\x9a\x9a\xd1\x93\x65\xa5\x8e\x1b\x89\x9b\xb6\xed\xdb\x6f\x7d\x60\x83\x28\xc4\xbd\x75\x5d\x6e\x8d\x57\x8d\x60\x83\x69\x67\xcd\x6a\x97\xa3\x0f\xc2\xe7\xb2\xdb\x41\xf8\x6c\xfe\xd1\xe7\xc0\x80\x80\x14\x82\x85\xa8\xda\x13\x82\xfd\xe5\xaa\x75\xbc\x96\xd5\x17\x9c\xae\xac\xfa\xf3\x40\xef\xad\x98\xef\x08\x3d\x22\xdb\x7f\xe2\x5c\x4a\x39\x29\x43\xa8\x32\x0a\xa7\x3e\x34\x22\x32\x1b\x1c\x7a\xed\x47\x95\xad\xdc\x24\xfd\x42\x3b\x15\xc1\xa9\x89\x7a\xf5\xfa\xa5\xfa\xa0\xad\x55\x83\x3b\x93\xa8\x73\xbd\x99\x57\xd9\xf2\xd6\x30\x22\xf5\xf9\x9b\x44\xdd\x4c\x07\x08\x0b\x02\x79\xab\x46\x05\x1b\x65\x74\x20\xc8\x87\x28\x27\x37\x4b\x4c\x6e\x16\x75\x55\x16\xd9\x82\x20\x39\x5b\x53\xa9\x8d\xce\xf2\xfe\x13\xf2\x5d\xc4\x58\x8b\x24\x5a\xe2\x37\xaf\x72\x57\x6f\x77\xb5\xd2\xae\xb3\x2a\x9f\xed\xca\xb3\xcf\xb4\xd5\x41\x5e\x2e\xab\x71\xfb\x40\x82\x92\x22\x4a\xc7\x6d\xca\xa5\xf9\xe1\xc9\x65\x51\x6e\xb8\x18\x88\x67\xe5\xab\x37\x49\x6b\xd1\xfd\xfc\xb3\x8a\xd7\x9c\x92\x77\x22\x79\x05\x74\xf9\xe0\xed\x74\x7c\x75\x33\x4b\xaf\x3e\x49\xf3\xf5\x47\x2c\x1f\xc5\x41\x56\xf5\x7e\x6b\xd4\xbf\x59\xd7\x35\xf7\xdf\xf5\x3d\x17\x52\x03\xd3\xc8\x27\x01\x6c\xce\x26\x07\x72\x22\x20\x3c\x8e\xd7\x30\x69\xac\x12\xb0\x2a\xf8\x42\x3f\xca\xd7\x2c\xbe\x93\x0d\x40\x3c\xd1\x7a\xbf\x75\x0e\x16\xaa\x5d\xfa\xd4\x27\x37\x0b\x5e\xef\x6f\xa6\x19\x09\xff\xac\x51\x40\xd8\xa7\x1c\x23\xff\xed\x50\x18\x71\xbc\x02\xc1\x62\x4b\x25\xff\xfe\x75\x10\x62\xb3\x3e\xbc\xbe\xd0\x20\x1f\x0b\xfe\x11\xf8\xf4\x82\x85\xa6\xb3\x65\x3f\x22\x34\x6b\x01\xcd\x83\x25\x3c\x77\x43\xbb\xb3\xe6\x64\x91\x67\x8b\xcf\x10\x4c\xd8\x98\x62\x87\x1c\xcc\x27\x27\x6e\x73\x05\x17\xd6\xee\x32\x64\xe2\xf4\xf0\xd8\x68\xf1\x41\xe2\xe8\xd6\xd0\xce\x64\x36\xdb\xbc\xdc\x9b\x4a\x1d\x33\x7c\xb4\xac\x3e\x63\xa8\x9a\x6e\xde\x98\x0a\x94\x5e\xe1\x72\xeb\xfc\xe6\x3c\x90\x0d\xd7\x25\xa8\x8f\x28\x2d\x8e\x15\x01\x45\x39\x0a\x69\x4a\x36\x03\xdc\x5a\x65\xf9\xec\xbe\x7a\x0f\x99\x44\x65\x01\x27\xf9\x23\x29\x58\x00\x44\x45\x6f\x8c\xfd\xe1\xc9\xa7\x72\x5f\x2e\xf7\x85\xe1\x45\x4b\x1c\x6f\xa2\x9a\x1a\xc1\xb3\xf4\x66\x58\x06\xc6\x7a\x55\x02\x5e\x6b\xff\x26\xe6\xf4\x77\xea\xd8\x7f\x1b\xd6\x83\x56\x98\x85\x00\x8a\xfa\x2a\x18\x12\x00\xa7\x03\x28\xb7\xfb\x8f\xcd\xdc\xfd\xb1\xe7\xb3\x53\xf3\xbd\xfa\x03\xd4\xd1\xbf\xd7\x8b\xcf\xa6\xea\x3f\xf9\x9f\xae\x23\x34\xcb\x43\xce\xf6\xea\xbc\x2c\x8b\xff\x95\xa8\x53\x35\xd8\x56\x59\x8e\x88\x79\xfa\x75\xa2\xae\x2b\x63\x81\xd1\xc9\x5d\xfc\x53\x06\x74\xaa\xba\xfe\xce\xe7\x16\x2a\x2e\x57\xcd\xea\xff\xe3\x6f\x5f\x93\xd3\x7f\x3a\xbe\xba\x18\x5c\x9f\x9c\xfd\x86\x04\xc0\x0f\xd7\x7f\x3c\x7b\xfe\xfa\xd9\x8b\x46\xfd\xc7\xd9\xb3\xd7\xcf\xbe\xd5\x7f\xfc\x1e\x3f\x6e\x97\x1c\x6f\x4d\xe1\x26\x41\x63\x47\xf3\x05\x20\x50\x1b\xfb\x5a\xfd\x61\x57\x18\x10\x00\x13\x05\x20\xee\x9f\x89\x8a\x1e\x22\xcf\xd7\x89\x59\xde\x97\xe5\x12\x98\xb5\x13\x21\x74\x8f\x07\x2a\x68\x1f\xa3\x74\x93\x9a\x40\x64\xc7\x2c\xfb\x4f\x26\xa6\x95\x42\x0c\xfa\x52\x8d\x1a\x02\x41\x8e\xc0\xe5\x1d\x78\x2a\x1f\x1f\xf1\x79\x7f\xd4\x4b\x1e\xc4\x02\xa1\x0c\x43\xa8\x2e\x69\x4b\x1b\x05\x13\xbf\x11\x85\xdb\x98\xfa\x07\x42\x12\xc6\x8d\xb6\x18\x3f\x12\xc9\xc2\x1d\x50\xcb\xd3\xf1\xc5\x9d\x27\xe8\x00\xa8\xc8\xdf\x39\x10\xed\x87\xa1\xca\xa7\xdb\xac\x99\xd2\xa2\x81\x1b\x09\xda\x69\x08\x66\x6b\x3e\x20\x2b\xd4\x1c\xeb\x17\x21\x27\x4a\xad\x41\x9e\x0e\x43\x50\xbe\xf2\xae\x8d\xac\x49\x38\x45\x82\x59\x71\xf9\xf9\x04\x06\x0b\x7d\x23\x50\x87\xac\x6b\x12\x8d\x08\xd9\xe1\x78\xd8\x6d\x9c\xe5\x9b\xe9\xdc\x86\xee\xf6\x89\xec\x96\x7e\xcc\x73\x4c\x0c\x80\x6d\x72\xc4\xd3\xec\x28\x88\x1d\x09\xae\x12\x53\x2c\xcb\xca\x32\x7b\xff\xa6\xac\x4d\x60\x23\x89\xa4\xbd\xe1\xbb\xbc\x49\xc8\xf3\x62\x5b\x65\x6e\x96\xd0\xbe\x2e\x00\xe4\x74\xf2\x77\xcc\x71\x8c\xaa\xb6\x6f\x49\xd4\x16\xb4\x91\xbc\x55\xb8\xf2\xb7\xfc\xef\x72\x6b\x8a\x7c\xa9\xb7\xfd\xb2\xba\xe5\x64\xe8\xf5\x17\x34\x93\xd3\x30\xc1\x88\x10\xdd\x51\x10\x07\x83\xf8\x55\x10\x86\xc5\x8c\x1d\xb2\xbd\xfc\xaa\x8f\xf5\xbf\xcc\x90\x0c\xe4\x36\xb3\x35\x14\x6a\x07\x01\xaf\x07\x6e\xa7\x64\xdf\xc5\x0e\xa4\xba\x97\xce\x74\x45\x4b\x64\x6e\x28\xe1\x41\x16\x7b\xd8\x91\xaa\x12\x92\x54\xc7\x42\x04\x55\x76\xdf\xd3\x5e\xff\xc9\xec\xfd\x70\xaa\xa6\xe3\x77\xb3\x8f\x03\x8c\xa9\x52\xe0\x12\x62\x31\xb3\xf7\xa9\x1a\x5f\xa7\x23\x6c\xca\xf8\x66\x74\x31\xf0\x78\xee\xf3\xf1\x08\xe3\x59\xe3\xc9\x54\xfd\xdb\xbf\x41\x68\xf3\xbb\xef\xe0\x4f\xce\x7f\xea\x0a\x5f\x8a\x90\xe4\xef\x1c\xc9\x54\xee\xe3\x2e\x86\xd3\xf3\xab\xc1\xf0\x43\x7a\x11\x47\x06\xa7\xef\x07\x57\x57\x07\xbf\xd5\x35\x7f\x36\x8d\x3f\x37\x04\xe8\xde\x51\x04\xf0\x62\x38\x49\xcf\x67\xee\xab\xc2\x7f\x71\x18\x4e\xc4\xe6\xd2\x3f\xa7\x1f\xae\xaf\x06\x93\x4f\xc9\xe1\xd8\xdc\xf1\x23\x3d\x73\x3d\x19\x9f\xdf\x4c\xd2\x0f\xae\xe9\x10\x8f\x7a\x3b\x9d\x0d\x67\x37\xb3\x54\x5d\x8e\xc7\x17\x10\x2b\xc3\xf8\x68\x3a\xfd\xd1\xc7\xe4\x6e\xa6\x69\x02\x01\x39\x78\xf1\xf5\x64\xfc\x6e\x38\x9b\xfe\xe8\xfe\xfb\xed\xcd\x74\x08\x7d\x37\x1c\xcd\xd2\xc9\xe4\xe6\xda\x7d\x75\x4f\xbd\x1f\x7f\x4c\x7f\x4a\x27\x0a\x22\xf3\x17\xd0\xc9\x30\xf0\x30\x29\xc6\x13\x08\x85\xb9\x3e\x80\x31\x48\xd4\xc7\xf7\x29\x84\xd2\x86\x23\xec\xa9\x81\xeb\x82\xe9\x6c\x32\x3c\x9f\xc9\xcb\xc6\x13\x35\x1b\x4f\x66\x32\x90\x38\x4a\x2f\xaf\x86\x97\x29\xc4\x8e\x27\x21\xfa\xde\xf3\x31\xca\xe1\x88\x1c\xf2\x4f\xad\x70\xa5\xfb\x4f\x31\x7d\x43\x98\xef\x8b\x43\x78\xbf\xae\x50\xbb\xff\xd4\x5c\x9a\x22\xfb\xf9\x37\x94\x7f\x7d\x54\xff\xf5\xec\x45\x53\xff\xe1\xec\xf4\xc5\x37\xfd\x87\xdf\xe5\x27\xbd\x4c\x47\xc3\x3f\xf7\xcf\xc7\x1f\x9a\x05\x32\x90\x48\x70\x4b\x34\x14\x02\xf7\x4f\xfb\xcf\x62\xbd\x50\x5f\x15\xeb\x0e\x84\x18\xdc\xb0\xaf\xd7\x65\xa1\xce\x47\x93\x61\xbb\x40\x26\x51\x5a\xdd\x67\x4b\xe0\x4e\x04\x48\x86\xbb\x6f\x6b\x8a\x13\xb6\x9a\xa4\xec\xd8\x69\x5f\x0d\xa9\xce\x28\xb0\x10\x66\x56\x1d\xb5\x1e\x7b\x04\xad\x30\xf5\xbd\x31\x85\xa2\x79\xbd\x28\x37\x42\xe1\x6d\xfa\x39\xcb\x73\x34\x5f\xa6\x4c\x4d\x76\xb9\x99\xbf\x57\xc7\x47\xe1\x7a\x67\x32\xae\xf5\x1d\x41\x8f\x81\x8c\x03\x22\xa7\xd7\xda\xd6\x65\x75\x72\x55\x9a\xf5\xc9\xb4\xae\xfa\xea\xc5\xf7\x89\xba\x38\x79\xf1\xec\xf5\xab\x17\xea\x4a\x17\xb7\xa6\x58\x99\x7c\x99\xa8\x4b\x60\x58\xdd\x07\x55\xa5\x61\xb1\xcc\xee\xb2\xe5\x0e\xa9\xd0\xc7\xd5\xad\x2e\xb2\xbf\xb0\xa5\xca\xa4\xcb\x47\x3d\x26\x8d\xa2\x54\x64\xc0\x22\x31\x7b\x9a\xb4\x7f\x33\x2f\x56\x5b\x56\x91\x79\x07\xdc\x8a\x31\x73\x58\xd3\x38\xae\x85\xf2\xcf\x51\x2f\xa2\x0c\x47\x66\xbb\x69\x4c\x0a\xfa\x20\xeb\xa7\xe8\xe8\x46\x98\x4e\x8c\xb7\xb8\x88\x3c\x77\xd2\x09\xf1\x94\xd3\x2d\x9a\x6c\x29\x18\x99\x20\x41\xf6\x49\x60\xc8\xb6\x14\x29\x22\x2b\xd6\xf5\xb5\xce\xf7\x7f\x71\x36\xab\xb1\xb5\x67\x67\x67\xbb\x93\x51\xe6\x48\x88\x9c\x83\x3a\x92\xd9\x42\x2e\x3d\x60\x78\x41\x87\x20\x89\xb8\xe0\x9b\xe3\xd0\xd0\x46\x05\x64\x22\xd5\x29\x00\x83\x49\x78\x98\xc7\x86\xb0\x89\x9b\xa8\x35\xa3\xb6\x82\x6c\xea\xe3\x7d\x87\x2a\x05\x08\xc9\x6c\x4a\x76\x26\x0f\xbe\xba\x25\xdd\x45\x9f\x0c\x41\xec\x2b\xc9\x6c\xf8\xbc\x2f\x23\x79\xee\x37\xa2\x61\x40\x9d\xef\xd9\x66\xc2\xa7\x4b\x49\x31\x3f\x8a\xc8\x4d\xc5\x69\x62\x60\xd0\xee\xbb\x03\xfe\x0f\xe9\xf9\x4c\xcd\xc6\x70\x0e\x4e\x67\x83\x99\xb3\x42\x3e\x49\xb3\xe8\xe3\xfb\xe1\xf9\x7b\x75\x3e\x18\x81\xb5\xf0\x36\x55\xe9\x9f\xdd\xf9\x9a\x5e\x24\x4a\xec\x51\x1f\x06\x7f\x4c\x21\x69\x3e\x49\x9d\x71\xe6\x8c\x13\xac\xdc\x1b\x4f\x22\xd3\x8c\x6c\x37\x61\xb9\xf5\x9d\x35\x08\x27\xf0\x3b\x95\xfe\x79\xf0\xe1\xfa\x2a\x6d\x18\x27\xf0\xa4\xee\xb7\x39\xdb\x81\x6d\xaf\x29\x7c\x43\xfc\x7e\xf1\xfa\x4f\x5d\x06\xde\x78\x12\xdb\x77\xa3\x4f\x5d\x16\x1e\xe4\x0c\x07\xb3\xd8\x38\x48\x83\x69\x0b\x59\x5c\xd7\xdc\xe1\xe8\xdd\x64\x38\xba\x4c\xc9\x98\xe1\x34\xe3\x27\x05\xa9\xdd\x29\xfb\x14\xe1\xab\x22\x53\x07\xe0\x46\xe1\x23\xd1\x76\xa4\x4e\x0f\x49\x5b\x3a\x06\xd2\x38\x41\x7c\x33\x4d\x27\xd3\x56\xc3\xf8\x9b\x3a\x0d\xc6\x83\x56\x22\x65\x4f\x23\x6b\x91\xf3\x17\x72\x40\xf8\xfa\x77\x7c\xc3\xf8\x5d\x30\xf9\xc8\x0e\x4c\xba\x8d\xc0\xa4\x7d\xc3\x70\x04\x89\x7e\xfc\x6b\xc8\x9f\xa6\xe7\x37\xa3\xe1\x60\xf2\x09\x6e\xe8\xa9\xc1\x54\x0d\xd4\x24\x9d\xde\x5c\xcd\xd0\xf6\x84\xd6\x61\x42\x1c\xb2\xce\x13\x51\x1e\x4a\xb0\x8a\x60\xc3\xb1\x45\x9d\x4e\x86\x3f\x0d\x66\xc3\x9f\x52\xc4\x7b\x8c\xdf\x7d\x91\x79\x47\xd7\xf6\xd5\x74\xfc\x21\x55\x7f\xb8\x99\x0c\xa7\x17\xc3\x73\x9c\xe6\x17\x63\x18\xa9\xc1\xd5\xd5\xf8\x23\x61\x43\xce\xaf\x6e\xa6\x34\x05\xe3\x01\xff\x82\x2c\x7a\xa2\xa6\x88\x85\x80\xb4\xfd\xc1\x87\x7d\x18\x7c\xc2\xd7\x5e\x5f\x5f\x7d\x92\x93\x83\x3d\xba\x19\x41\x40\xe5\xf1\xdc\xde\xc8\x1e\x04\xc1\xee\xb6\x25\x52\xa4\x62\x64\x40\x30\x43\x3f\x86\xc3\x9c\x01\xd4\xff\x1a\xa0\xfe\x41\x08\x7c\x20\x25\xda\xdd\x01\x10\x1d\x81\x07\x0f\x4f\x1f\x8f\x68\x14\x1c\x06\x0d\x53\x12\x8e\x69\xf2\x72\xea\x40\x91\xd8\x69\x1c\xf9\x52\x33\xb9\x5b\x76\xe6\x22\x41\x75\xb4\xf1\x84\x83\x95\xc6\x6d\x61\x05\x62\x9c\xc3\x22\x95\x0e\x51\xd2\xf3\xa8\x9a\x51\xd6\x49\x78\x44\x2f\x9a\x17\xb1\x8e\xac\xef\x80\x8b\x66\x7c\xe6\x75\x9f\x53\x22\x80\x8d\x2a\x31\xab\xc1\x14\x8d\x1d\xc5\xd1\xc4\x51\x0e\xb5\xc5\x5e\xee\x80\x39\x1d\x20\xcc\x64\x77\xc0\x5e\x89\x04\xbd\xba\xa0\xa0\xc7\xbd\x86\xc8\x08\x4b\x34\xe1\x39\xc6\x5c\x85\xfd\x2f\x7b\xb9\x67\xf8\x22\x81\x83\xba\x54\x0b\x40\x1c\x40\x73\x90\x4e\xac\x2c\xec\x3a\xdb\x42\x1e\xec\xd6\x14\x8b\x3d\xa2\xac\x0b\x53\xb9\x5f\xc3\x91\xfb\xef\x65\x06\xe8\xcf\x02\x82\xfc\x1d\x16\xa7\x9b\xa9\xd1\x09\x3b\x5c\x71\x25\x38\xe5\xd3\xd8\x7a\x7a\xa0\x89\xbb\x22\xd7\xf7\x90\xda\x45\x20\x39\xd3\x3f\x40\x43\xb5\x05\x56\x7a\xa2\xeb\x42\x45\x1b\xae\xd4\xa6\x57\x04\x1e\x6a\x2e\x0a\x8c\x75\x23\x7d\xf6\x05\x2d\x29\x98\x8b\x99\x67\x00\xd3\x4c\x03\x58\xee\x80\x02\x96\x79\xdb\x80\x84\x06\x44\x97\x30\x85\x53\xb6\x6b\x5b\x81\xaf\xc7\xd3\x73\x83\xd2\x22\xd2\xf9\x85\xa0\x56\xc7\xb4\x28\x96\x82\x94\x16\x27\x09\xb4\x16\xca\x7e\x98\x56\xd5\x37\x2e\x93\x92\x67\x88\x2f\x07\xa1\x9c\xa0\xf6\x74\xb0\x87\xfb\x0f\xec\x51\xbe\xcf\xa4\x9c\x24\xb2\x95\xd7\xa6\xda\x56\x86\xb2\xf1\xa8\x42\x6b\xb7\x30\x93\x99\x2c\x5a\xdf\x03\x2b\x20\x5b\xff\x28\xc5\x41\x81\xe3\x55\x9e\x61\x59\x9e\xbb\x2a\xb4\x12\xf0\x21\x11\x17\x6f\x53\xc7\xf2\xa6\x80\xa9\x3e\xa2\x5a\x95\xf3\xb2\x70\xf3\x8e\x52\xcf\xe7\x34\xfb\x11\x55\x39\x2c\xa8\x52\x07\x45\x39\x34\x16\xdf\x5e\x96\xe5\xd2\x3e\xbe\x81\x60\x49\x6a\xcc\x9a\xe1\xec\x5d\x31\xab\x05\x4b\x34\x73\x46\x53\x50\x11\x62\xd2\x21\x06\x68\xd9\x3e\x7f\x28\x20\x2b\xe9\xa1\x41\x10\x96\x15\x8a\x68\x8e\x8b\xad\xc9\xd3\x17\xc3\x6a\x2f\xb1\xa2\x32\xd7\xc5\xed\x0e\x2a\x03\x0f\x2e\xa5\xcc\xaa\xb4\xb8\xcd\x33\xbb\x06\x78\xae\xdf\x77\xd7\xda\x4a\xd4\x01\xd3\xc1\xe0\xc9\x00\xb4\x07\x44\x92\x49\xaf\x80\xd2\x9c\x20\xa0\xc1\x67\x84\xeb\xf3\x2b\xa9\x97\xe0\x86\x26\xc3\x9a\xf8\x82\xf0\xa2\xdf\xf7\x43\x7b\x9e\xbc\xdd\xab\x65\x79\x5f\xe4\x25\x10\x7e\x27\xa1\xe6\x21\x2b\x6c\xad\xf1\xb3\x38\x48\x1e\x39\x7e\xd2\xe4\x0f\x1e\x93\x7b\xae\x25\xf8\xd4\xbc\xdc\x15\x01\x35\xfb\x90\xbf\xd6\x5e\x0f\x10\xc3\x06\x55\x5f\x94\x9a\x63\xa6\xe3\xee\xcb\x7d\x68\x9b\x41\x16\x3f\x3c\xf9\x2a\x5f\xfb\x49\x87\x1f\xfd\xa4\xed\x46\x3f\xa1\x75\xf4\x8d\x87\xf0\xb7\xfc\xe9\x3f\x1d\x4d\xae\x7e\xcb\xe0\xdf\xe3\xf9\xdf\x57\xcf\xcf\xce\x9a\xfa\xaf\xcf\x5f\xbd\xfa\x16\xff\xfb\x3d\x7e\x46\x93\x2b\xbf\xc2\x03\x38\x78\x34\x9e\x0d\xcf\xd3\x27\x83\x3c\xe7\x13\xb6\x95\xcc\x93\x81\x28\x69\x29\xca\x10\x55\x94\xc8\xf5\x45\x4b\x37\x53\x35\xd2\x77\x3a\x87\x9c\xaf\xae\x16\x6b\x75\xa5\xe7\x65\xa5\xc1\x0c\x3c\x1e\x4d\xae\x7a\x0a\x49\xf5\x9a\x75\x09\x59\xc5\x47\x6e\x76\x67\x84\x30\x78\xff\xc9\x75\xc3\xda\x0d\x49\x62\x0e\xf0\x04\xe3\xc3\xa8\x91\xa9\x9f\x9e\xc1\x37\xbc\xe8\xbf\x38\xb9\x72\x9b\xd8\x5b\x53\x7d\x36\xb9\xd9\x77\x9b\xb9\x56\x1d\xbf\x9d\x5e\xf4\xf8\xe9\x37\x45\x06\x11\x16\xb4\x3f\x42\x56\x5b\xe9\x3a\x3c\x08\x43\x7f\x91\x29\x1e\x7d\x95\xfb\x26\x77\xa2\x4d\xcc\xad\x64\x45\x39\xf4\xec\xee\x64\x39\x3c\xe1\xe6\x3c\xbc\xf5\x3c\x92\xb1\xba\xea\x8c\xd2\x4a\x1e\xf9\x2e\x57\x41\xd0\x4e\x91\x88\x9f\xb6\x06\xa5\xdd\x95\x9b\x2e\x42\x91\x9d\xe0\x7b\x14\x9c\x8a\x2a\xd2\x64\xab\x62\x71\x2d\x76\x6e\x18\x30\x9b\x71\xd5\x98\x1f\x5a\xac\x25\x3d\xa0\x26\xd5\xf9\x60\x2b\x9f\xdc\x9c\x0f\x4d\xd4\x40\x3c\x97\xef\x4d\x15\x26\x13\x30\x81\xb8\x8f\x9c\xef\xd5\x9d\xae\xb2\x72\x67\xd5\xd6\x94\xdb\x1c\xb8\x92\xa0\x2c\xa7\xf1\xf5\x9e\x9b\x87\xe7\x2a\xa0\x8d\xf8\xfd\x9e\x55\xad\xfd\x06\xd7\x12\xc4\xe4\x5a\xa2\x0d\x14\x23\x2c\xa8\xc3\xfd\xa3\x4a\x77\x5b\x5f\x8d\x77\xb5\xcd\x96\x86\x96\xd2\x20\x81\x87\x39\xdb\x24\xf4\xb2\xb3\xfd\xcb\x8d\x69\xad\x86\x66\x1b\x70\xfe\xa0\xa9\xed\x59\x62\x58\xb6\x51\x43\xd5\x1b\x49\xb8\x34\x91\x01\x56\xcc\x6f\xfe\x0d\xf3\x01\xc8\x60\xa5\x0f\x4c\x12\x99\x7e\x1f\x5a\xcb\x0c\xa3\xee\xbf\x29\x0c\x2c\x05\x2e\x81\xd7\xb9\x13\x04\x12\xdc\x76\xf7\x1b\xe1\xb7\xdb\xc7\x40\x1e\xad\x8d\xa1\x35\x0f\xd0\x0d\xf4\xc3\xf3\xcb\x70\x20\x6e\x08\x23\x58\xf1\xe3\xcb\x80\xbb\x0d\x1f\x4f\xd4\xda\x1d\x20\x8e\x07\x20\x25\x7f\x6b\x04\x07\xc7\x84\xff\xb9\x70\x24\x2f\x70\x78\xf4\xf2\xce\x54\x35\x92\x8a\x87\xfb\x37\xe8\x53\x01\xb3\x8d\x01\xec\x9e\x65\x56\xcc\xd6\x1e\x02\xdf\xcd\x09\x85\xb8\xf5\x42\xb1\x1c\x80\x3d\xcc\xbf\x41\xff\x8f\x21\xde\xce\x01\xe2\x73\xd3\x76\xad\xcf\xe0\xfb\x75\x9e\x06\x49\x7c\xce\x38\xb7\x5c\x0a\xfb\xf4\x7f\xe1\x5b\x69\xa2\x4b\x5d\xee\x99\x59\xac\x8b\x32\x2f\x6f\xf7\xea\x22\x43\x9f\x35\x79\xf0\x04\xe7\x90\xa0\x54\x22\x62\x58\x31\x9f\x20\x45\x29\xa0\x9d\x1c\xe2\x8b\xc4\xdd\xa5\xd6\xe9\x57\xe3\x7a\x6c\x13\xd7\xe3\xb7\xb1\x43\x98\x97\xfe\x93\x28\x9e\x2d\x01\x24\xae\xbd\x0d\x4c\x89\xfb\xd5\x97\xe3\x47\xfe\xbb\xa0\x47\xdc\x57\x61\x9c\xf8\x1b\x4a\xe4\x9f\x11\x25\xe2\x8e\xfa\xbb\xcc\xdc\xfb\xb8\x00\x95\x0e\x59\x3e\xed\x43\xac\xf7\x81\x53\x12\x43\xe0\x65\x28\xe8\x67\xae\x66\x0c\xdf\x01\x9a\x8b\x02\x59\x32\x62\x06\xf1\x16\xaa\x9a\x47\xa9\x5c\x54\xb8\x50\xdb\x32\xcf\x16\x40\x47\x41\xfb\x05\x51\x78\x90\xbc\x12\xd6\xa9\xf8\xe3\xfb\x71\xd7\xe1\x9b\x6c\xc1\xd7\xfd\xf4\x9f\x0e\x37\x79\x36\x3f\xfb\xfb\xe1\x7f\x9e\x3d\x7f\x7d\xfa\xaa\x85\xff\x7e\xf9\xf2\x9b\xff\xff\x7b\xfc\xe0\xe8\x7b\xe8\xc7\x75\x30\xc3\x33\x1b\x21\x35\xdc\x2a\x84\xea\x1d\x67\xc0\x01\x6b\x56\xe2\xe9\x6d\x51\xd4\x1f\x79\xa3\x02\xd9\xdc\x57\x42\xb6\xd1\xfb\x38\x86\xc2\x44\x09\xde\x06\xfa\x6f\x9d\xb7\xf2\x50\x7c\xb8\x0b\x06\x12\x29\x31\xe3\x33\x17\x5e\xdf\x5e\xf2\x8f\x60\x6c\x3b\x69\x30\xfc\x6c\x0c\x7c\x96\x67\xa3\x94\x40\x10\xc9\xfe\x43\x36\x68\x83\xaf\x3d\x8e\xd2\x12\x4f\x2a\x02\xcb\xa9\x8b\x88\x89\x8b\xc2\x10\x53\x49\xbb\xbf\xab\x0a\xac\x2f\x0c\x3c\x34\x0d\x61\xde\x2e\xf7\xe3\x07\xd8\xd5\xbb\x8d\x6e\xb2\xad\xb3\xc8\xb7\xa2\x3f\xf9\x2c\x87\x8c\xdd\xe8\x83\x5f\xe3\x8d\xcc\xf3\xa6\x1b\x88\x31\x82\x25\x36\xc7\x83\x6b\xfc\xc8\xba\x9d\xdf\x5b\xc4\x10\x80\x60\x6f\x87\xe0\xbe\xe8\x5b\xc9\x39\xe2\xa3\xec\xa8\x73\x8f\x09\x26\xc9\x74\xdf\x9c\x54\x59\x4b\x22\x9a\x9b\xd1\x57\x1f\x02\x6e\x85\xfd\xc6\xd6\x55\xc4\xe4\x15\x66\x8e\xb8\xda\xf3\x71\x47\x26\x65\xcb\xbd\xc0\x94\x85\xf3\x03\xd7\x25\x8a\x33\x98\xe6\x67\xdd\x65\x1a\x7d\x72\xcc\xdc\x41\x0b\x36\x66\xb1\xd6\x45\x66\x37\xea\x58\x14\x0b\x7a\x32\x29\x77\x8b\x56\x85\xa9\xa1\x10\x0b\x6a\xbc\x96\x99\xee\xb9\xb3\xf4\xde\xcd\x3c\xed\x71\x39\x9a\xc9\x1b\x49\xae\x33\xdf\xcb\x8f\x80\x90\x3e\x44\xf7\x29\x09\xd4\x1c\x45\x48\xc3\x90\xc0\xe3\x63\x4f\x0a\x0f\xe3\x76\xb8\x29\x60\x6b\xa3\x97\x3c\x34\x09\xdd\x19\xfb\x43\x5e\x3a\xa3\xd3\xa5\xca\x0a\x3e\xff\x5b\x53\x2c\x51\x1f\x74\xb1\xd3\xb9\x4d\x08\x22\xc5\xa9\xc0\x0f\x20\x41\x0a\x3e\x23\x4d\x37\xcb\xa9\xa3\x78\x67\x89\x7d\x43\x21\x51\x1a\xb3\x4f\x8b\xf6\x34\xb2\x65\xed\x24\xbb\x96\xe8\x02\x4a\xd9\x17\x9f\x6d\x10\xd1\x66\x26\x36\xff\x6e\x56\x32\xf3\x77\x1d\x03\xe7\x2e\xc2\x20\xca\x4a\x2d\xf7\x85\xde\xe0\x3f\x7b\x58\xcb\x0b\xc4\x79\x5c\x21\x1e\x20\x5c\xf8\xbc\xfe\x93\x6b\x4c\xc2\x58\xaa\xc0\x25\xda\xf2\x93\xeb\xab\xc1\x70\x44\xd4\x78\xdb\x5c\x67\xc5\x89\xc1\x0c\x98\xb3\xac\x72\x5d\xe8\x5a\x66\x9f\xc5\x56\x11\x72\xbb\x0d\x6f\x48\x7a\x3f\x04\xec\x4a\x1e\x23\x00\x69\xb9\x3e\x92\xf4\xa1\x83\x78\xc1\xbd\xf0\x41\x2f\x27\xf9\x02\x17\x67\x74\xa1\x46\xe3\x11\x83\xa3\x9c\xdf\x70\x08\x25\x3f\xb8\x99\xbd\xef\xf6\x6f\xc0\x41\x4a\x24\x46\x09\x01\x42\xdd\x2e\xc0\x60\xa4\x06\xe7\x8c\xb7\x09\xfe\x00\x98\xfe\xd2\xc8\x4f\xbc\x91\xff\x6e\x32\xfe\x90\xb0\x7d\x3f\x66\x3f\x62\x84\xac\x1f\xc8\xfe\x10\x75\x3e\x51\xc2\x10\xb5\x05\xb6\xe5\x22\x1d\x5c\x0d\x47\x97\xce\x93\x89\x2e\xfe\x25\xb6\x6f\xff\xe9\x34\x37\x66\xbb\x5f\xe8\xfa\xef\x54\xff\x77\x7a\xfa\xf2\x79\xcb\xfe\x7b\xf5\xea\x1b\xfe\xfb\x77\xf9\x71\xf6\x83\x9f\x01\x21\x13\x14\x4a\xc3\x17\x3d\x75\xfa\xe6\xcd\xb3\x93\xd3\x37\x6f\xde\x88\x2b\x03\x9e\x68\x90\xe7\x6c\x55\x55\x8f\x15\xf1\xfd\xf2\xf8\xed\xaf\x2e\xd2\x3b\xf9\xbb\x07\x54\xdb\x2d\xf8\xef\x1d\x4f\xed\xfc\x1e\xe0\x06\xf4\x1f\x33\x37\x9e\x0c\x94\xa4\x4a\xba\xa9\x13\xd0\x75\xe8\x26\x5a\xe5\xba\xf1\x8b\xb7\x0d\x47\xa2\xd8\x07\xa6\x51\xa4\xb2\x95\xe7\xf1\x0e\xa8\x29\xe3\xfb\x30\xdf\xd1\x1a\x74\xb2\x3c\xe6\x6d\xd0\x5b\xac\x51\x5d\xc5\x3a\xf7\xc8\x7d\x8b\xdc\x16\x50\xbd\x5f\x1f\x60\x10\x56\xdb\x7c\x67\x05\xe9\x30\xa8\xf7\x00\x2d\x3a\x87\xfe\x2b\x63\xf2\x88\x5f\x5c\x48\x78\x0a\x83\x51\xf2\x32\xfe\x02\xb2\xda\xfa\xcb\x89\x6a\x01\x96\xe4\xcd\x9e\xc7\xb8\x68\xcb\x4a\xd2\xbf\xd6\xfb\x2d\x99\x35\x31\x03\xed\x46\xff\x3b\x6a\x2b\x6f\xcb\x42\xa6\x3c\xbf\x9e\x99\xf6\x91\x9a\xbf\xe9\x55\x9a\x5e\x7f\x3a\x1f\xcc\xc2\x15\x7f\xb7\xe8\xec\xe3\x76\x0b\x04\x0b\x47\xe3\xd1\x89\x34\x5c\x92\x2f\x08\xd8\x76\x7c\xe6\xb7\x78\xed\x3f\x4f\xbc\xb6\x7d\x06\x27\xee\x7f\x9f\xc3\xff\xbe\x80\xff\x7d\xf9\xf5\x08\x82\x6f\x27\xf5\xbf\xe4\x49\x7d\x28\x1b\x27\x26\xcb\x3f\x64\x52\xee\x91\xca\xee\x49\x7a\x99\x8e\x66\xd3\x7f\xc2\x6c\x9c\xfc\xba\x6f\x59\xb9\x7f\xa1\x5d\xfe\x25\xec\xec\xaf\x60\x67\x0f\xd4\x40\x6e\xb7\x78\x67\xdc\x4e\x01\x4b\xf3\xbd\xae\xee\x74\xb5\x14\xcb\xf7\xdb\xee\xfe\x6d\x77\xff\x67\xda\xdd\xdf\x0f\x26\x3f\x0d\x26\xb8\xf2\x5b\xe4\x15\xff\xed\x77\x77\xfe\xba\x6f\xcc\x1c\xff\xdc\xbb\xfb\xdf\x3b\xba\xf7\xf8\x4f\xff\xe9\x64\x37\xdf\xff\xb6\x05\x00\x8f\xe4\xff\x5f\x9c\x9e\x9d\x36\xf1\xff\xaf\xbe\xf1\x7f\xfc\x3e\x3f\x0d\x25\x54\xa0\x3b\x0c\xf2\x9d\xf7\x7a\x7f\x48\x08\x35\x64\x48\x37\x2d\x70\x6d\x67\x6a\xbe\x2d\x5c\xb6\xdc\x6d\x73\x14\x67\xd1\xa1\xd0\xc0\x03\xc8\xbb\x21\xc7\x12\x3e\xe0\x4f\x54\xfb\xb8\x8a\x67\x53\x40\xb9\x20\xc9\xd2\x7d\x67\xc3\xca\x40\x94\x3c\x1e\xa5\xdd\xaa\x6a\xba\x87\x4a\xbd\xf8\x96\x58\x50\x8a\x4e\x78\xa2\x74\xb8\x28\x41\xfd\x26\x2a\xec\x82\x8e\x06\x0e\xe8\x77\x18\xfc\x1b\x70\x5c\x91\xca\x38\x35\x94\x15\x6e\x4b\x8b\x91\x31\x9d\x2d\xdb\xa2\x55\x37\xd6\x14\xa6\x56\x14\x09\xfc\x8f\x5d\x76\xa7\x73\x48\xb2\x93\xe8\x6c\x59\x41\xf5\xa2\x54\xe9\x08\x0a\x11\x1c\xd4\x3b\xdc\xfc\x20\x88\x8d\x12\x6d\x2d\x59\xd1\x50\x5f\x5d\xe4\x7b\x18\xf5\xac\xe0\x4e\x47\xe9\x0b\x16\xfb\x10\x8c\x27\xf0\xb4\x45\x0f\x67\x58\x51\x16\x27\x5e\x5e\x0a\x6c\xb0\x0c\x62\x8e\xe2\xb7\x60\xb1\x90\x59\x9a\x15\xb6\xae\x76\x41\x6d\x86\xf8\xa9\x4b\x2f\x4f\xee\x67\x4f\x67\x0d\x0a\xbc\x7a\xd9\xc3\xce\x47\x4b\x2b\x36\x8f\xab\x4a\x17\x84\xdc\x0d\x06\x17\x76\x59\x53\x2b\xb0\xa1\xf6\x23\x67\x56\x43\xcd\x4c\x98\x96\xbf\x66\xb2\x35\x5e\xe8\x3b\x0b\xb1\xe4\xf3\x0a\xde\x81\xca\x5c\x4d\x59\xfa\xba\xbc\x35\x41\x14\x35\xea\xc4\x63\x1a\xeb\x0d\xe4\xd8\xd5\x96\x94\x16\xc3\x64\xea\x3d\xdc\xcf\xad\xee\x8d\xa4\xfc\x5a\x31\x74\xdf\xa9\x87\x04\x06\x9b\x35\x28\xff\x8d\x27\xcb\x8b\xd6\x7e\x84\x75\xc4\xb8\xec\xa0\x4c\x84\x68\xdf\x1b\x13\x88\xf0\x05\xf8\xce\x80\x17\xa0\x8a\xea\xbd\x0a\x6a\x7b\xbd\xbe\x7a\xeb\x8c\xed\x72\x23\x8a\x66\x5a\x9d\xee\xee\x2e\xca\x5a\x12\xd6\x86\xa6\x06\x65\x77\x28\x53\xe1\x6b\x3b\xf8\xef\x95\x82\xa4\x03\xe2\x1b\x2c\x35\xbc\xb4\x0d\x7d\xe0\xcc\x8b\xb4\x47\x52\xa8\x0c\x53\x80\x18\xfe\x55\x7a\x39\xb8\xf2\xdc\x11\x20\xce\x59\x65\xdb\xba\x6b\x2e\x03\x94\x24\x43\x04\x69\x56\x6c\x77\x00\x87\x42\x9f\x04\x75\xe7\xb5\x65\x9e\x6c\x5f\xdf\x15\x86\xb3\x44\xd4\x46\x44\x39\xb1\x72\x87\x4d\x20\x5e\x10\x55\x33\xcd\x65\x33\xdf\xd5\xa0\x88\xee\xb6\x4e\xc4\x6d\x01\xab\x32\xea\xc1\x50\xa9\x0f\xc9\x19\x90\xf3\x64\xcb\x7c\x29\x86\x27\xdf\x47\x7f\x65\x9d\xd4\xe0\xcd\x49\xc8\x09\xb3\x59\x1c\xf4\x8a\x98\x54\xc7\x99\xcb\x92\xe7\xfd\xcb\x7d\x9f\x2e\x76\x95\xbf\xb1\xde\xca\x7f\x03\x93\xf7\xdb\x8f\xf8\xe9\x3f\x1d\xe4\x7a\xb9\xcc\x8a\xdf\xd0\x05\x78\xd8\xfe\x3f\x7b\xf5\xf2\xf5\xeb\x26\xfe\xe3\xf9\xb3\x6f\xf8\xdf\xdf\xe5\x87\x46\x1f\x35\x12\x1a\xfc\xcf\xc7\x4c\xfc\xf7\x7d\xa2\x46\xe5\x9d\x01\x19\xb5\xd3\xef\x21\x40\xf9\xa6\xf7\xa4\xa9\x1f\xc0\x49\x29\xf8\xdf\xd7\xf0\xbf\x74\xad\xe2\xb7\xa4\x58\x12\x90\x59\x63\x93\x27\x1f\x4c\x91\x97\xea\x5a\x57\x9f\x1b\xd4\xd0\xfd\x69\x7f\xd0\x1d\xcf\x54\xa3\xf1\x2c\xfd\x21\x06\xe7\x21\x8a\x0d\xb7\x6e\x90\x1b\x41\x66\x19\x21\x22\x71\xc5\xbc\x36\x5f\x23\x2f\x17\x48\x87\x2a\xa3\xec\x6e\xee\x4c\x8c\x1a\xf6\xf4\xa0\xbe\xc6\x47\x8e\x28\x87\x90\xef\xf3\x92\x70\xee\x11\x2b\xbd\xc9\xf2\x4c\x57\xc1\x54\x90\x97\x7a\x4e\x05\x67\x0f\xc5\xc2\x94\x70\xbd\xf9\xb9\xae\xb4\x5a\xc0\x39\xd1\xd1\x99\x0d\x4e\x3d\x34\x20\xca\x82\xac\x8c\x88\xd2\x83\x20\x8c\xb2\x07\x11\x63\x98\x55\xaa\xbc\x2f\xa0\x4a\x13\x14\x6a\x59\xc8\x13\x92\xf0\x45\x9d\x55\x26\x88\xdb\xc7\x60\x59\x0c\x8e\xc6\x85\xa1\x99\x75\xd6\x0d\xca\x19\xf7\x48\x66\x2e\xe3\x83\x0f\xa5\xf6\x8b\x5b\x50\xb4\x5f\x7a\x1b\x01\xd4\x1b\x72\x43\xca\x81\x41\xae\x19\xae\xf5\xa2\x6f\x59\x65\xeb\xf0\x6c\xd7\xef\x53\x92\x29\x7f\x26\xdd\x1a\x0d\xea\x07\x60\x5a\x2e\x0d\xda\x17\x82\x12\x0f\x20\xb5\x70\xa8\x33\xce\x20\x0f\xd3\x69\x6e\x00\xba\xca\x86\x47\xb1\xe4\xbb\x18\xe8\x5e\x41\x87\xd4\xa4\x6f\xbb\x2e\xf3\xa5\x6d\xd8\x12\x64\x86\x51\x67\x16\x4b\xa0\xca\x71\xbf\xb9\x3a\xf4\x1a\x37\x34\xd8\x2c\x2e\x44\x25\x9e\xef\x5d\x51\x57\x7b\x29\x12\x51\x07\x52\x98\x69\xad\x6b\xd7\x89\x95\x71\xae\xe8\x17\x74\xd1\x2b\xc6\xc0\x46\xf2\x16\x20\x99\x0c\xb4\x25\x8c\x5f\xd5\xf7\xde\x8d\x88\xa5\xf7\xa1\x35\x60\xab\x3c\xeb\x7b\x96\xc8\x0f\xba\xae\x4d\xd5\x62\xd5\x11\xea\x92\x35\x49\x8d\xef\x6a\xe3\xb5\x28\xd4\xe7\xc2\x4d\x38\x6d\xd5\x11\x4f\xe9\xcb\x75\x69\x6b\x1c\xac\xfe\x11\x58\x86\x47\xa4\x29\x75\x94\x80\x29\x76\x9f\x60\x63\x2d\x02\x94\x91\xee\x08\x75\x96\x66\xb1\xf6\xae\x8e\x8a\xb2\x51\x7f\x1e\x16\xaa\x18\x24\xb7\x6e\x72\xd8\x0c\xba\xd6\x14\x96\x22\x5c\x91\xb2\xea\x51\xaf\xaf\x08\x72\x5b\x94\x35\x81\x8c\x3a\xda\x0d\xfb\x91\x88\xc7\xb7\x3f\x16\x74\x6d\xc2\x0d\x47\x3e\x36\x2f\x68\x1b\xe5\x03\x63\xc4\x91\x90\xda\xc6\x29\x0b\x25\xab\x6e\x1f\x1a\x54\x75\xb6\x32\x3f\x87\xfd\x6c\x58\x2c\x60\xa4\x06\xea\xe8\xa0\xf8\xec\x11\x61\x83\x44\x8b\xb9\x13\x19\x4b\x1d\xf3\x63\x36\x54\x2c\x61\xab\x00\x1d\xe8\x80\x9a\x8a\x26\xa7\xc0\x12\x0e\x90\x00\xe9\xf4\xcd\xeb\x57\x21\xc8\x11\xb3\xef\x20\x8e\x5e\x04\x23\x50\x5d\xf1\xd3\x23\xd4\x7b\x5e\xdd\x8d\x22\xe6\x1f\xc7\x93\x3f\xaa\xb7\x03\x88\xd2\x8e\xe4\x15\x3d\x94\xe7\x1b\x8e\x2e\x86\xe7\x83\x59\xea\xfe\x31\x51\x83\xf3\xf3\xf4\x7a\x16\xb4\xff\x82\x70\xa3\x9a\x8d\xd5\xc5\x58\x4d\xc7\x09\x66\x1a\xae\xae\x20\x5e\xdf\xa5\x95\x06\x26\x31\x81\xb0\x93\xb8\x85\xe3\x89\x68\xbe\x6c\xee\x78\x02\x2d\x9d\x86\xa6\x0e\x67\x70\xc6\xbd\x87\xdb\x20\xe8\x3d\x7b\x3f\x18\xc5\x6d\xba\x74\x36\xfa\x14\xbe\x03\x74\xf7\xa6\xc0\xd8\x37\x1b\xb3\x5e\x9f\xec\xa0\xb4\xf9\x3e\xd7\x7c\xc1\x4b\x08\xaf\x07\x91\xc4\x69\x4a\x50\xe6\xa9\xa2\x12\xd8\xf7\xc3\xb7\x43\x52\x9b\x04\x89\xc9\xe1\x3b\x78\x27\x53\x10\x42\xa7\xd1\x9d\x5d\x1d\x92\xf0\x95\x8f\x35\x8b\x49\x7e\xfd\xb1\xe9\xfe\xcd\xcb\xae\x71\xb2\xb9\xd3\x34\xce\xab\xa1\x89\xd0\x15\x58\x01\x24\xdc\x9e\x36\xbc\x10\x60\x8c\x14\x8b\xad\x81\x23\x06\xa2\x05\xf1\xa1\x08\x9a\x4d\x9e\xb9\x95\xe4\x8e\x13\x11\xb6\x91\xb2\x71\x6a\x57\xf8\xa0\x58\x54\xfa\x74\x25\x0f\x71\xb1\x6c\xb8\x2e\xfc\x58\xf7\x7c\x90\x00\x6e\x84\x8a\xcb\xf0\xe8\x3c\xab\x41\x6b\xe8\x38\xeb\x9b\x7e\xe2\x63\xb1\xbd\x46\x30\xf6\xda\x2b\xae\xc9\x4c\xaa\xb6\x52\x74\x1f\x94\xf6\xd6\x55\xb9\xbb\x85\xd8\x2c\x1d\x4f\xb9\x3b\x9a\x30\x18\x8a\x51\x43\xae\x1d\x3f\x9e\xf7\x9a\xe1\x8b\x68\xd9\x13\x6b\x1e\x50\xe6\x76\xee\x2c\xcd\x4f\x09\x2d\x86\xa5\xff\xa5\x4d\x01\x26\x84\x30\x62\x81\xbb\x4d\x1c\xd8\x07\x2b\xa5\xe4\x58\xcb\x2e\xbf\x88\x70\x9d\xab\xae\x6d\xef\xe0\x8e\x09\x21\x55\xb9\x0d\xcb\xe0\x26\xd7\x86\x48\x5a\x45\x2c\xbe\x5f\x67\x73\xd8\x15\x33\x22\x02\xd4\x7b\x26\x64\x81\xea\x25\xd4\xb5\x2a\xe8\x98\x86\xe9\x02\xdd\x14\x97\x19\xdd\xaf\x0d\x05\xa2\x2a\xb3\xa8\xf3\xbd\x3a\x86\xb0\x88\x7f\x1a\x96\x7d\xc8\x88\xb7\x17\x43\x07\xa2\xe0\x87\xee\x83\x20\x12\x11\xb2\x21\x11\x62\x20\x0c\xf4\xa3\x5e\x56\xed\x7b\xb8\x98\x26\xf0\xb9\x11\x49\x26\x33\x0d\x74\xb6\x48\x1d\x71\x96\x00\xab\x09\x8f\x7e\xa4\x68\x93\x8f\x27\x9b\x9f\x41\x0b\xca\x26\xac\x8e\x82\x78\xd7\xb5\xde\x59\x38\x8d\x4c\xb1\xdb\x98\xca\xd7\xb3\x88\x3e\x06\xf9\xb3\xac\xce\x8c\xed\xa1\x5d\x10\x66\x04\xd6\x68\xd9\x16\x44\x37\x2b\xee\xca\x1c\x28\xbf\xf9\xfb\x02\x29\x5f\x56\x08\x23\x70\x63\x4d\x7e\x67\x2c\xc4\x73\xd4\x5d\x56\xe6\x71\x41\x8d\x98\x71\x3c\xe1\xdc\x9c\xcb\x7a\xea\x9a\x42\xf9\xd1\x5c\x73\x26\x1e\x16\xa2\x11\xf7\x77\x04\x90\xb6\x75\x59\xe9\x5b\x43\xba\xc4\x75\x95\x99\x3b\x9d\xfb\x4e\x76\x03\x40\x32\xde\x6a\x65\x0c\xf2\x44\x13\xa7\x1d\x72\xa8\xc0\x1d\xc8\x87\x19\x1e\x7a\xec\x4f\xde\x42\x95\xc5\x09\xa8\x37\xd2\x23\x7b\xcd\x6d\x14\x56\x93\xf1\x3e\xd6\xa2\x84\xfa\xa0\x93\xa5\xd9\x9a\x02\x70\x29\xb4\x2f\xf1\x75\xf7\xac\xe6\xe1\xbd\xb1\x46\x43\xfc\xef\xef\xca\x7c\x87\x40\x05\xd9\xb6\x45\x59\x58\x14\x3c\x77\x7f\xa9\x74\xb1\x2c\x37\x6a\xa9\x6b\xdd\x23\xb7\x42\xd7\xdc\x4f\x5c\x18\x45\x9d\x41\xe5\x96\x75\xc3\x08\xf4\xa6\x53\x56\x84\x46\x93\xf4\x38\x9a\xd4\xed\xd9\xdb\x57\x83\x82\x27\x1f\x5c\x1b\x4f\x6b\x8f\x8a\x8e\x02\x89\x6e\x17\xa2\xc5\x9b\x75\x75\xad\xe7\x8d\x45\xb4\x33\xf1\x4a\x2a\x0e\x94\xfb\xaf\x73\x57\xb8\xc9\x1f\xb1\x6b\x2f\x76\xb6\x2e\x81\x11\x95\x09\x62\xe9\xbe\xbe\x3a\x66\x65\xbd\x07\xd7\x47\xbf\x27\xe7\x62\x26\x37\xc0\xf6\x8c\xac\xcc\xa6\xbc\x23\xbc\x39\x5a\xec\x21\x4a\x0f\x25\x88\x9d\xb3\x04\xa2\xb5\x51\x3d\x9d\x38\x09\x2a\x13\xf0\x34\x4b\xf2\x26\x73\xfc\x6a\x9f\x5e\x74\xf3\x1d\x88\x44\xf1\x15\x38\xd6\x79\xde\xac\x18\x08\xd7\x20\xd7\x50\x0c\x99\x47\x4c\x7e\x71\x22\xb6\xe7\xed\xae\xda\x96\x56\x08\xdf\x70\xf5\xb2\xef\x73\xf1\xc8\x28\x09\xe0\xe3\x04\xbc\xe6\x8f\x85\x53\x1a\x95\x1e\x44\x50\x9e\xde\xd7\x4d\xb6\x94\xb6\x39\x7f\x32\x62\x4b\xd8\x8f\x3d\xbf\x38\x81\x92\xb1\x8d\xbe\x2d\x4c\x9d\x2d\x54\xad\xb7\xcc\x4b\xbf\x45\x61\x43\xde\x26\xe0\xc6\xc6\x94\x80\x8a\xbe\x25\xee\xe4\x73\xd3\x98\x21\x79\x66\xeb\x7e\xaf\x35\xdd\xa3\x8d\xf1\xcb\xe7\x3c\x35\x35\xae\x29\x56\xf3\xb2\xc4\xe2\x55\x7d\xab\xff\x92\x15\xe6\xab\xa7\xac\x33\x44\x06\x7e\x43\x97\x8e\xb0\x67\xcf\x6c\x61\xdc\x22\x32\xda\xc6\xb9\xc3\x19\x8e\xc8\x68\x68\x18\x7e\x3e\x15\x52\x12\xd9\x56\x56\x5b\x65\x17\xe5\xd6\xf4\xd5\xbb\x5d\xb1\x20\x86\xd5\x9d\x35\xea\xb8\xda\x15\x6e\xc2\xf7\x9a\xef\xa1\x0f\xe4\x03\xc1\x59\x91\x5c\xb6\x42\x09\x0b\xbf\x20\xc8\x16\x82\xdb\x77\x21\x96\x24\x9e\xd4\x6c\x2c\x1b\x3f\xb0\x57\x64\x01\xcd\x05\xc9\x28\xb7\x8b\xd6\x59\x0d\xa6\xe9\x03\x76\xcc\x71\x63\x9a\x92\xe4\x05\x14\x5f\x83\x4d\x32\xdf\x2b\xfa\xb8\xc8\x94\xf0\x16\xe2\x82\x2c\xc4\x9d\xad\xd5\xc6\x98\x5a\x5a\xd9\x9d\x38\x40\x30\x6b\x88\xe7\x8d\x2d\x25\x8c\xc4\x74\x58\xd5\xce\xd4\xc0\x78\x1d\x9b\x13\xce\x81\xcf\x59\x6d\x01\x72\x67\x5c\xae\x02\xbf\x6b\xe1\xd2\x5a\x36\x1d\xdc\x03\x92\x8a\xe5\x8a\x54\x30\x3e\x96\xd5\xe7\xa3\x5e\xe3\xa8\xa6\xb0\x1d\xb0\xb3\x05\xee\x64\x69\x07\xed\xf9\xbb\x17\x9a\xb3\xe2\x1f\x29\xa4\xb4\xd0\x55\x05\x15\xc6\x9b\xac\x00\x96\x65\x8a\x8b\x41\xb9\x2f\x74\x25\x7d\xeb\xc1\xc7\x7f\x67\xe3\x94\x9a\x3b\x01\x0d\x6f\x24\x18\x38\x83\xba\xfb\xb6\x5a\x74\xe7\xa3\x45\x6b\x43\x70\xac\xd9\xbe\x87\x9a\x85\x85\x45\x21\xe6\x07\x19\xfe\x42\x6f\x4c\x42\xca\xa1\x27\x1b\x9d\xe5\x4a\x2f\x97\x95\x3b\x99\x8f\xd1\xc4\xed\x25\x71\xfb\xc1\xa1\xc2\xbd\x98\x27\x09\x7e\xcb\x8f\x8d\xb3\xe9\xd3\xe1\xbe\x9d\x9b\xc0\xa3\x0e\xb1\x03\x9c\x11\xb0\xae\x6a\x0a\x2b\x56\xb7\x70\x66\xa2\x7a\x26\x5b\xe1\x6e\xe7\xe8\x24\x5b\x0f\x0b\x3f\x6e\x06\xce\x02\xff\xee\xc2\x1d\x41\x39\xd4\x68\xe9\xa5\x0d\xda\xae\x42\x6d\xd7\xb9\x9a\x6b\x53\xb8\x25\xd3\x9a\x1f\x59\x9d\xb8\x06\xc2\x80\xd5\xd9\x46\x7c\x14\x1c\x54\x05\x50\x20\x6f\x69\xe7\x03\xca\x8b\x6d\x95\x15\x70\x4e\x30\xcf\x98\x76\x3b\x5b\x51\xee\x8a\x05\x31\x39\xfa\xe1\x68\x04\xf3\x3a\x79\x20\x74\x34\xcc\x5e\x55\xb4\x28\x83\x04\xf4\x71\x59\x29\x93\x5b\x93\x28\xab\xf7\xd1\x44\xa5\xd3\xde\x75\x37\x5d\xdc\xeb\xab\xa9\x3b\xaa\xe8\xa1\x41\xa0\x10\x24\x0d\x7d\x01\x1e\xa1\x4a\x23\x39\x5f\xff\xe5\xb0\x75\xc9\x3c\xec\x41\xa2\x62\x98\x46\x06\xd5\x50\xe1\xb1\x5c\x36\x78\x97\x99\x7b\x1f\x78\x6d\xdd\xe6\xcf\x21\xef\x7c\x7f\x04\x06\xc2\xe3\x14\x4e\x71\xf0\x09\x39\x2c\x7b\xdd\x29\xc5\x0c\x19\x60\x3f\xf4\x30\x24\x56\x8c\x89\xa5\x20\x56\x63\x64\xd0\x7e\xab\x29\xd8\x80\x5c\x09\x70\xae\xba\xa6\x87\xc0\x57\x46\x4a\x29\x73\x67\x93\xcc\xcb\x9f\x8f\x92\xd0\x37\x60\xca\xff\xc7\x2e\xab\xf0\xe0\x6e\x4d\x06\x40\xf2\x62\xdf\x37\xba\x11\x8c\xeb\x45\x56\x2d\x76\x1b\x5b\x6b\x37\xb1\x7e\x6c\x7d\x63\x6d\x4d\xbe\xea\xfa\x54\x7f\xcc\xc7\xdf\xdc\xf9\x99\x71\x6b\xf1\xa4\x6b\xb6\xb8\x71\x4b\xbf\x17\xad\xb1\x3b\xb1\xd4\x63\xc8\x08\x3c\xd5\x8f\x9a\xaf\x68\x5c\x94\x95\x3b\x3c\x4a\xe4\x2f\x3d\x84\x20\x59\x94\x4b\x93\xa8\xa5\xc9\x33\xe4\x9c\x47\x59\x09\x08\x28\x90\x21\xad\xab\xcc\xf5\x99\x25\x3f\x49\x22\x2f\x4c\xc5\xfb\x6b\xb3\x52\x14\x5d\x6b\x38\xad\x42\x35\xe5\x16\x82\xd1\x15\x3e\x68\x13\x25\x17\xa0\x3e\x12\xe9\x39\x5a\xb8\xad\xac\xee\xaa\xdf\xc4\x64\xc1\x03\xf5\x9b\x24\x08\xfc\xa5\x35\x9c\x09\xd5\x9d\x3a\xf7\x22\xa0\xe6\xe0\x23\x57\x7a\x61\x30\x6a\x9b\x05\xee\x1d\xba\xbe\x16\x78\x0c\x06\x83\x13\xed\x3a\x49\x23\x07\x0e\x60\xa2\x2d\x8f\xec\x2c\xf1\x45\xae\x85\x3e\x09\x26\xf6\x80\x68\x41\xe2\xa9\xc6\x55\xa1\xde\x0b\xf2\x53\x50\x9a\xe3\xc7\x81\x27\xa4\x53\xbe\xa3\x27\x01\x46\x8d\x6a\xd3\x63\xd6\x75\x4e\xd4\x67\x53\x15\x26\x4f\x88\xc6\x58\x39\x93\xfd\x6b\x6b\x51\xab\x9d\xeb\x60\xbf\xcd\xc3\xe6\xd7\x82\x84\x35\x58\x6b\xc8\x6f\xc3\xef\xcc\x84\x8d\x91\x61\x81\x07\x0a\x4a\x01\x09\xa8\xa7\x01\x92\x2b\xe6\xae\xd7\xd1\x97\x60\x43\x11\xb0\x07\x70\x31\x19\xd0\xee\x78\x1d\x15\xf2\xa2\xa2\x2e\xa7\x4d\xc8\x5f\x13\xd9\x06\xd4\xbf\xda\x3f\xb5\x6b\x73\x25\xc6\x9b\x60\x45\xf0\xc5\x59\xb1\x64\xbb\xdb\xfb\x86\xbc\x49\x2c\x4a\x5c\x91\xf3\x7d\x7b\x7f\x0f\xf7\x0b\xd0\xd6\x8a\x3f\x88\x14\xd1\x84\x90\x17\x1b\xa5\x32\xb2\x74\xe5\x8d\xe2\x36\x06\x0a\x37\x80\xa8\x37\xb3\x10\xe0\x04\x4f\x69\x03\xa6\x09\x14\xb0\x63\xb4\x37\x0e\x15\x33\x81\x94\x59\x64\xdb\xcc\x14\xf5\x77\xd6\xcd\x87\x6a\x91\x05\x7b\x86\xd2\xd5\xc4\x97\x05\xa1\xeb\xac\xe8\x87\x77\x0e\x1b\x41\xa7\x72\x25\xa7\x54\x59\x45\xc8\x41\x8e\x0c\xce\xf7\x48\xc9\xc3\x5f\x2c\x70\x9e\xac\x82\x01\x2b\x74\xbb\x47\xbb\x57\xab\xa5\x41\x01\x72\xb3\x44\x84\x2a\x6c\xd5\x45\x78\xca\x03\x4f\x68\x6d\x2f\x1e\x53\xe5\xce\x15\xc4\xbb\x42\x12\x10\xd8\x82\x9a\x1f\xd3\xb8\x3b\x41\xb5\x7a\xe7\x75\x83\x73\x23\x8d\x31\xf6\xc2\xdc\x82\x30\xa0\x65\x7b\xa8\x09\x0d\x21\x1e\xd1\x45\x81\xa6\xd6\x39\xd3\x7e\x13\x42\x0a\x65\xd2\x83\xe1\x31\x71\xef\xe3\x71\x69\xc4\x89\xc8\xa9\xd7\x96\xb9\x07\xf3\xbd\xc8\x0b\xd0\x20\x46\x53\x25\x66\x0d\x93\xcc\x60\x65\xd5\xdc\x05\x1e\x7a\x8b\x0f\xa3\x08\x8f\x9a\x26\x71\x1f\x04\x8c\x74\x5d\x9b\xcd\xb6\x16\xb8\x61\xea\xa5\xae\xb7\x3f\xf0\xf2\xcc\x92\x84\x0c\x2c\xb5\x87\x64\x98\xc0\xa0\xa7\x3e\xeb\x6a\xd5\x7b\x96\xb0\xe3\x81\xbc\x5f\x97\x4c\x03\x4e\xb1\x47\x0c\xf4\x43\x5f\x70\x72\x06\xa6\x91\xdb\xb8\xda\x8f\xc4\xe6\xb8\x5e\x85\xa7\x20\x10\xc1\x2b\x11\xf9\x86\xc1\x46\xcd\x90\x04\x4c\xfc\x52\x03\x50\xfb\xc5\x99\x53\xab\x5d\x8e\x47\x54\x9e\x39\xcb\x87\x41\x98\x63\x58\xcb\xad\x24\x02\x99\xf7\xcd\xd8\xc1\x53\xc9\xfa\x1b\xf5\x60\xf0\xe4\x21\x5a\x6f\x2a\xe2\xac\xd8\x15\x35\x00\x51\x63\x6d\x9e\x24\xa4\xb0\xdc\xb4\xd1\xcb\x25\x1e\xf7\x5b\x60\xb0\x52\xb7\xa6\x84\xe4\x3c\x04\x70\xa2\x36\x08\xc2\xba\x20\x20\x53\x53\xea\x9a\xde\x15\x40\x9b\x71\x10\xdb\x8a\xda\x3c\x0c\x0d\x60\x4a\x75\x53\x82\x23\xce\x2d\x45\xbc\xcc\xce\xd2\x0b\xcc\x12\xdc\x49\xe8\xd5\x85\xb6\x5c\xd6\x26\xec\x68\x42\x73\x13\xa3\x86\x68\xa1\xb3\x63\x57\x62\xf3\x86\xbf\xcf\xcb\x65\xeb\xc0\x60\xb4\xe7\x95\xbf\x97\x52\x39\x22\x3d\x29\xc1\x8e\xb3\x31\x24\x1b\x11\xf3\x98\x1c\xb5\xf8\xa6\xfa\x28\x93\xe6\xee\x11\xca\x85\x90\x84\x15\x8f\x4c\x54\x3a\x84\x2c\x6a\x97\x96\xf3\xef\x5e\x16\xd6\xe6\xa7\xa2\x7c\x73\x53\xbf\x0f\x95\xdd\x46\xb3\xe1\x24\x55\x93\xe1\xf4\x8f\x6a\x30\x65\x92\xac\x3f\xdd\x0c\xfc\x1b\xaf\xd3\x09\x68\xd9\xf9\xc4\x75\xd4\x95\xc0\x25\xf5\x69\x7c\xd3\x57\xd3\xf7\xe3\x9b\xab\x8b\xe8\xef\xae\x9f\x53\x75\x91\xbe\x4b\xcf\x67\xc3\x9f\x52\xcc\x8a\x0f\xa6\xd3\x9b\x0f\x98\x9a\x3d\x1f\x4f\xa1\x71\x40\x0c\x9c\x9e\xa7\xd3\xe9\x60\xf2\x89\x4a\xbf\xa0\xbf\x26\xe9\xf5\x60\x38\xc1\x42\xb3\xc9\x04\xe9\xab\x70\x59\x89\x62\xb7\x9b\xd1\x95\xeb\x91\x49\xfa\xa7\x9b\xe1\x04\x33\xc9\x83\xeb\xeb\xab\xe1\x39\x94\xb7\x5d\x0d\x3e\x82\x52\xde\xe5\x24\xc5\x01\x1f\x8e\xd4\xc7\xc9\x10\x52\xe6\x20\x75\x88\x09\xef\xf1\x24\x89\x35\x08\xb1\xab\x3e\xbe\x1f\x83\x2e\x1d\x65\x97\x07\xa3\x8b\xa7\xe3\x89\x9a\xa4\x07\x52\xdf\x83\x29\x26\xcb\x67\x6e\x70\x41\xed\x2e\x89\xf5\x0e\x5d\x07\xb8\xa1\xf3\xca\x78\xa1\x8a\xcc\xbd\xfa\x32\x1d\xa5\x93\xa8\xdc\xee\x0b\xe4\xf5\x7c\x99\x59\xb3\xb6\x6c\xa2\x86\x23\x9e\x3b\xb3\x31\xfc\x2e\x82\x31\x3c\xc8\x95\xc6\x65\x77\x17\x83\xd9\x00\xb2\xea\xee\xff\xbf\x4d\xdd\xd5\x93\x74\x74\x91\xba\x9e\x1e\x8e\x06\xe7\xe7\x37\x93\xc1\x2c\x65\x99\xc5\x74\xaa\xa6\x37\xd3\xd9\x60\x38\xc2\x81\x70\xdf\x0b\x8b\x85\x67\xdf\x10\xe9\xce\x06\xea\xdd\x60\x78\x75\x33\x69\x4d\xa9\xd9\x58\x8d\xaf\x53\x78\x24\x4c\x2d\x31\x20\x78\xc5\xb4\x17\x6a\xe4\xa0\x0a\xee\xfd\xf8\xea\x22\x9d\x08\x91\x45\x18\xb8\xf7\x83\xa9\x7a\x9b\xa6\xa3\x2f\xaf\xa3\x9b\x32\x36\x9a\x64\xe6\xda\xfa\x5d\x99\x6d\xc9\x66\x49\x08\x13\x20\x51\x9a\x0c\xea\x08\x33\x8c\x54\xba\xd6\x65\x86\x25\x08\xb9\xbe\x57\x95\xf3\xa7\x22\xed\x36\x8f\xd6\x8f\xdf\x0c\xca\xfe\x14\x9d\xc2\x34\x2e\x6a\x7d\x79\x93\x25\xd7\xf7\x94\xcf\x80\x47\x08\xf2\xcd\x48\x52\x2c\xab\xad\x9a\x57\xa5\x5e\x1a\x88\xa7\xea\x82\xa2\xa7\x36\xb3\x35\xca\x27\xca\xe7\x61\x4e\x94\xf3\x0a\xba\x0a\x04\x20\xdc\x34\xff\x1e\x16\x78\xf0\x10\xfe\x18\xa0\x73\x09\x3d\x07\xa1\x0b\x88\xd9\x24\xcd\x83\x2f\xae\x41\x9e\xa4\x58\x7a\x99\x5e\xf8\xed\x4a\xc0\x1c\xb5\xda\x15\x19\x96\x24\x81\x76\x9e\x28\x45\xee\x7e\xa5\xbb\xd2\xdd\xb7\xf8\x8f\x5d\x56\x35\x13\x47\x7c\xa4\xc2\xd1\x14\x3f\x38\x69\x84\x99\x01\xd7\xf8\x83\x38\xd8\x1b\xed\xc8\x88\x0d\xca\xb8\xbe\xda\x50\xc8\xfb\xc2\xac\x10\xd0\x78\x74\x31\xbe\x00\xb2\xd9\x06\x7e\xc1\x8d\x49\x9b\x00\x7b\x91\x6b\x6b\x31\x3e\xaa\xad\x3a\x12\xc9\x26\x8f\x71\xe3\xa0\xc2\x11\x3c\xe6\xc1\x4b\xe2\x17\x1c\x09\x21\x14\x4c\x91\x25\x6a\xbb\xab\xec\x4e\x17\x10\x33\xbf\x78\x37\x98\x78\x38\xdf\xd9\xd9\xeb\xfe\xeb\xb3\x67\x67\xd8\x70\xd1\xab\x99\x3d\xd0\xa3\xdd\x1f\x75\x40\x6a\xa5\x33\x4e\xda\x3f\xdc\xc1\x22\x37\x73\x31\xbe\xf8\xef\xd0\x9b\xb2\x33\x4f\xcf\xfa\x67\xa7\xbf\x6f\x57\xfe\xfd\xab\x25\xfa\x4f\xc7\x57\x17\x83\xeb\x93\xb3\xbe\xfb\xbf\xdf\xa6\x06\xe0\xb1\xfa\xdf\xe7\x2f\x5e\x36\xf1\xff\x67\xcf\x5f\x7c\xc3\xff\xff\x1e\x3f\xb3\xb5\x51\xe3\xad\x29\xdc\x24\x68\xe2\xff\x19\xfe\x0f\x73\x23\x51\x67\xdf\xab\x3f\xec\xf2\xbd\x3a\x7b\xf6\xec\xd9\x21\x62\x91\xaf\xa3\xfc\x3e\x8e\x88\xbe\x7f\x63\xe2\x91\xd3\xaf\x92\xd4\x09\x59\x14\x48\x69\x60\x95\x1f\xe1\x90\x80\xf8\xfa\x80\x4a\xcf\xc3\x54\x22\x80\x88\x5e\x50\x6c\xf4\xe1\x17\x1c\xe4\x16\x49\x7e\x57\x72\x91\x0e\x15\x20\xcc\x6b\x91\x42\x94\x8e\xea\xc3\x83\xdb\xc7\xef\x67\x27\x7c\xc6\xd4\x24\x47\x3c\xdb\x8e\xf0\x41\x24\x16\xf1\xcb\x68\x47\x5a\x64\xf0\x87\xd8\x46\xd8\x0c\xf1\x53\x5d\xd4\x7a\x90\x67\x7a\xfd\x05\xaf\xe1\x00\xd0\xdc\xa8\x85\x86\xa8\x95\xf8\x9c\x82\x5c\x7d\xf1\x2b\xbd\xdd\x1a\xcd\x63\x92\x55\xc4\xbe\xf2\x6b\x1b\xfb\xaa\xaf\x2e\x76\x46\x2d\x2a\xb3\xcc\x6a\x16\xdd\x08\x9c\xea\x65\x7c\xf3\x75\x55\x42\xc4\xec\x78\x5d\xd7\xdb\x1f\x9e\x3e\xbd\xbf\xbf\xef\x97\x5b\x53\xe4\x4b\xbd\xed\x97\xd5\xed\xd3\x1e\xab\x38\xcf\xba\xdf\x49\x39\xbc\x3b\x08\x3f\x49\xf0\x01\x76\x10\xa4\x33\x4b\xf8\xff\x7d\x95\xea\xc5\x1a\xaf\xa5\x78\xc4\x12\xe1\x5c\x3b\x5f\x76\xa3\x3d\xcc\xbd\xd8\x6d\xe6\xa6\x0a\x91\x35\x4e\xf6\xfa\xde\xa6\x60\x51\x74\x72\xf2\xbb\xfd\x3b\xca\xaa\x2b\xb1\x8b\x46\xe3\xdc\x9a\xff\xd8\xb9\x33\x3c\x5c\xbd\xa2\x08\x06\x9d\xbf\x8f\x32\x8c\x8d\xaf\xd3\x11\xf6\xc7\xf8\x66\x74\x81\x72\xe8\x5f\xce\x36\x16\xc5\x1b\xfe\xa1\x19\x69\x0e\x7d\xeb\x37\x86\x9a\x7f\x6e\x86\x1a\xbf\xde\x33\x1b\x29\x38\x3f\xb4\x05\x85\x8a\x8e\xd3\x37\x6f\xde\x9c\x38\x7b\xe0\xd0\xde\x91\xb8\xd3\xe3\xbe\x2c\x97\xea\x3c\xab\xf7\x8d\x3a\xbf\xe9\xe0\x80\xaa\xe5\x75\x54\xb1\xd6\x81\x8b\x5f\x76\xb3\x92\x88\x73\x07\x42\x02\x18\xef\xff\x07\xb0\xb2\xff\x71\x7f\xfa\x4f\x3f\x0c\x67\x27\x42\x13\xef\x37\xf0\x01\x1e\xb1\xff\xcf\x9e\xbf\x7a\xde\xb0\xff\x9f\xbf\x7e\x76\xf6\xcd\xfe\xff\x3d\x7e\xe2\x22\x5e\xb7\x94\xdd\x7a\xfe\x5e\x9d\xeb\xca\x3a\xab\xe4\xbd\xce\xea\xbf\x40\xd2\xfc\xd2\x94\x2b\x60\x1e\xac\x32\x4b\x16\x3f\x2b\xa4\x46\x3c\x72\xad\x27\xbe\xc0\x27\xfe\x31\xdb\xa8\x8f\xa5\xc9\x97\xa6\xb2\xdf\x74\x86\xbe\xe9\x0c\x75\x7e\x4d\x47\x84\x08\xf8\x33\x58\xe9\xe5\xff\xa4\x6a\x89\xac\xde\x07\x3f\x86\x80\xb5\xb1\xd0\x90\x7f\x35\x5a\xc5\x5d\x6e\x51\x22\x5c\xa1\x48\xd1\x7a\xab\x17\x9f\xf5\xad\xe7\x33\x8f\x3d\x0d\x8d\xb0\x98\x6f\x22\x29\xff\x3a\x22\x29\xff\xc4\x3f\xfd\xa7\x6f\xf5\x7a\xbf\x5d\xff\x1d\xf5\xff\xce\x5e\x3e\x7f\xd6\x8c\xff\x9d\xbe\x78\xfe\xed\xfc\xff\x3d\x7e\x5a\x9a\xff\x33\x28\xc2\xdb\x42\x45\xbf\x20\xb2\x25\xd2\x23\x40\xc6\xad\x15\x57\xa6\x57\x4d\xa9\x98\xcb\x0f\x3f\x39\xa7\xe0\xb4\xf9\x98\x86\xc8\xfa\x0a\x30\xfc\xee\x4f\x3a\x87\x7b\x76\x04\x03\xc3\x20\xcb\x92\xd5\xd9\x78\xdb\x5e\x97\x5b\x23\x48\xaa\x00\x32\x32\x37\x85\x59\x65\x84\x8d\xb1\xce\x93\x80\xc3\x6c\x5b\x19\xcd\xcc\x14\xb2\x05\x8d\x7a\xd3\xe9\x56\xbb\x83\xf0\x24\xd7\xc5\xed\x4e\xdf\x1a\x35\x33\x7f\x06\x30\xf6\xae\xc8\xb0\x66\xd3\xfc\xbc\x45\x59\x74\x80\xb3\x22\x02\x7a\xae\x17\x9f\x4f\xe8\xc5\x70\xc8\xba\xb6\x67\x04\x75\xcb\x6a\xb5\xd0\x85\x5a\x9b\x7c\xab\x3e\x1b\xb3\x75\x8d\xf0\x7f\x77\x9f\x05\xd8\x36\xa3\x01\x27\x6a\xf1\xfd\x98\x71\xeb\x3f\xf1\xb0\x9a\x9a\x6a\x63\xf0\xd4\x72\xfd\x04\xc6\x90\xeb\x1b\xc9\xf9\x14\x60\x10\x37\x10\xfc\x28\xca\x18\xf4\x0b\x2d\xf9\xc3\x2e\xcf\x4a\x35\xd5\xc5\x62\x6d\xfe\x92\xb8\xb6\x24\xea\x0f\xa5\xfd\xce\xa8\x41\x5f\x7d\xd0\xff\x5f\xa1\xbd\x60\x9a\xbe\x65\xf9\x34\x2f\xd3\x0a\x25\xff\xd6\x97\x4b\xcc\x0d\x92\x25\x20\x02\xd7\x66\x5c\x6d\xe5\xee\x36\x55\xe5\x2c\x3f\x2e\xa1\xf6\xe7\x68\xe1\x9a\xcf\x34\x02\x7a\x03\x47\x6a\x14\x5d\xcb\x10\x63\x4a\x40\xb1\xac\x00\xf8\x89\xa4\x6f\x41\x93\xc3\x6b\x02\x3a\xb3\x02\x12\x45\x4c\xc8\x01\x94\x68\x08\x61\xe3\xf2\x29\x7a\x51\x9f\xd3\xb6\xf0\x4b\x9b\xd5\x3b\xce\x38\x01\xfb\x0c\x55\x46\xc7\xdf\x52\x99\xad\xce\xaa\xbe\xba\xe9\x94\xa8\xb3\x11\x80\x47\x2f\x16\x66\x0b\x9d\x4d\x8d\xb1\x91\x3e\xcb\x93\x4f\xe5\x0e\x06\x61\xc7\x51\x33\xff\x20\xee\x11\x2a\x86\xc0\x00\xd8\x42\x17\x45\x59\x23\xff\x09\xdd\xd0\x34\xb4\x7c\x9e\x15\x21\xca\xf1\x53\x3b\x8a\x3c\xb0\xb4\xa0\xb6\x28\xfc\x86\x16\xf3\xfd\xba\x4c\xb0\x4c\x01\x90\x60\xeb\x3d\xbe\xdd\x35\xeb\x73\x56\x2c\xa1\xc0\x01\x10\xeb\x38\xef\xad\xa1\x8a\x25\xa2\x6b\x01\x1b\xd1\xfc\xfc\xbf\x6f\x37\x77\x7d\xc1\x6f\xe3\x1b\x14\xef\x13\xb0\x49\x74\x36\x0c\x0b\x9e\xb3\x9a\x4b\xc1\x75\x2d\xeb\xa2\xdc\xb7\xe7\x46\x57\xf9\x5e\xe5\x7a\x6e\x72\x4c\x0c\x06\xda\x35\x88\x22\x06\x12\x4a\xa4\x0b\x51\x17\xc6\x6e\x33\xc2\xbd\xe5\x7a\x01\x21\x0c\xae\x57\x48\xd4\x3d\x17\xa7\xe6\xd9\x67\x88\x57\xae\x8d\xae\xdc\xf4\xda\xd5\xac\x08\x38\xcf\x0d\x82\xd4\x56\x59\xb1\xf4\x64\x1f\x95\xd9\x96\x55\xcd\x7f\x6f\xf5\x40\x3a\xba\x40\xb3\xa6\xb1\x8d\xfe\xbd\xf7\xf5\x2f\xfd\xe9\x3f\x9d\x5e\x0e\x4f\xde\x9e\x9c\xf6\x4f\xff\x4e\xfa\x6f\xcf\x5f\x3c\x7f\xd9\xca\xff\x3d\x7b\xf1\xec\xdb\xf9\xff\x7b\xfc\x4c\x2f\x87\xea\xdd\x24\x15\xc6\x34\xd3\x8c\xbc\x0d\xfc\x5f\xa7\xfd\x53\xf5\xec\xec\xe9\xd9\xd9\xd3\xb3\x67\xcf\x9e\xf5\x28\x9b\x76\xe1\xeb\x07\x2c\x63\x9c\xdd\x85\x47\x03\x62\x74\xd2\xb9\x1a\xa1\x1b\x78\xed\x8e\x4f\xd0\x1a\x67\xba\x19\xac\x28\x09\x17\x6e\xfd\x15\x50\xd7\x25\xd3\x26\xfc\x90\xac\x50\x63\x26\xec\x3c\x77\x3b\x48\x08\xfb\xaf\xe9\xc8\x7f\xf0\xd5\xfd\x23\xdf\xc8\x33\x75\x74\x4e\x58\x74\xf7\xa4\x23\x51\xd1\x11\xbf\xa2\xac\xd4\x07\x59\xbc\x91\xf0\x79\xb9\x28\x37\xf3\xac\xf0\xee\xbe\x3b\x21\x43\x1f\x3c\x57\x47\xef\x75\xb5\x44\xc0\x02\x95\x6e\xb8\x2d\x66\xbd\xb7\x08\xf7\x34\xa1\x22\x1c\x8f\x11\xe2\xb6\x84\xc2\xea\x85\xb1\xd6\xf8\x5f\xd8\xba\xac\x08\x76\x59\x19\xbb\xcb\x11\xe6\x43\x97\x41\xf1\x2b\x05\x09\xc8\x44\x61\x36\xcc\xd0\x9a\x17\xea\xe8\x4a\x57\xb7\xa6\xc2\x5a\x47\x6e\x90\x28\xbc\xc4\x8f\x01\xaa\x9e\xd0\x29\x90\x81\x2b\x2b\xaa\x59\x21\x23\x00\xf2\x84\xb0\x7d\xbb\xc3\xaa\x09\xb9\x3a\x80\x71\xe0\x86\xbc\x64\x32\x25\x3d\xcf\x7d\xc7\x50\xd1\xa9\x0f\x99\x00\x3f\xab\xdb\xb3\x13\x8e\x47\x6c\xf4\xcf\xd9\x66\xb7\x51\xe6\x67\x40\x41\x11\x0b\xaa\x09\x64\x18\x94\x00\x86\x44\x14\xd9\x05\x30\x2f\x75\x8e\x4f\x82\x6a\x6b\x9f\x0b\x02\x59\x32\x2c\x54\x4a\x14\x97\xde\x4b\x7a\x18\x0c\xdc\x2c\xca\xe2\xce\xec\x5b\x20\xfe\xd3\xfe\x2b\xfe\x0a\x31\x6d\x9a\xf9\x4e\xb8\xf0\xb5\xbf\x70\xa9\xae\x35\x54\xe6\xf2\x1d\x5b\xf8\xa7\x82\x94\x2d\x77\x14\x24\x85\xe7\x7b\xe5\x16\x24\xce\x0c\xa8\x48\x5a\x55\x59\x71\x1b\xba\x78\x87\xa9\x51\xab\xb1\x56\xbb\x35\x5b\xdd\x07\x45\x33\x36\x12\xa0\x9d\x5e\x0e\xbf\x6c\x06\x7f\xaf\x8e\xa2\xa7\xc8\x69\xec\xd5\x9e\x91\x88\x95\x19\xdb\x44\xa9\x00\x92\xe5\x61\x71\x0e\x56\x73\xec\x2a\x3f\x34\x9d\x4d\xde\x56\xe6\x0e\x22\x89\xd1\x5b\xfb\xea\xa3\xb3\x54\xa2\x59\x09\x38\x6c\x38\x99\xa9\x02\xd4\x9a\x8a\x22\x49\x54\xc4\xa4\xa3\x87\xa8\xcc\x8a\xe2\xde\x01\xc1\xea\xc5\x27\x50\xed\x61\xcd\x12\x5a\x1a\x4b\x69\x05\x93\x41\xdc\x62\x5a\x6e\x8f\xf6\xc2\xc3\xcf\x3c\xf0\xc1\xa1\xa5\x6f\xb1\xa5\x85\xb9\x17\xa5\xbd\xbe\xdc\x39\x86\x23\x76\x74\xea\xc3\xcf\x3f\xed\xbf\x51\x47\xb8\x41\xca\x91\x2d\x0e\x6c\xb4\x65\x15\x8d\x01\x50\x7e\xf9\x62\xbf\x39\xd3\x1a\x0b\xe4\xbd\xa0\xb7\x6d\xed\x02\xa7\xcf\xd4\x51\xf4\x78\x7f\x24\xc4\xe5\x52\x6d\x60\x17\xfc\x85\xcb\xc3\x90\xd3\x6f\x1e\x48\xc7\xe4\xed\xb4\xf7\xcb\x36\xa6\x3f\x03\x39\x8c\x1a\xb8\xc6\x47\xef\xc7\xe8\xe1\x6e\xbb\x04\x64\xa2\xfb\x6f\x70\x67\xb0\xda\x90\x69\xa2\x48\xcd\x04\x8b\x25\xdc\x6a\xa9\x4b\xf1\x49\xa7\xea\x68\xc2\x65\x41\xa1\x43\xa1\x16\xea\x2e\x5b\xee\x80\x23\x48\x69\x95\x9b\x5b\x9d\x33\x75\x20\xd5\x0e\x05\x0a\x2b\x3c\xcf\xb0\x35\x48\x5d\xc5\xe1\x65\xb9\x3d\xf1\x1e\xdb\xc0\xe8\xc3\xf3\x57\x3b\x58\x68\x82\x46\xae\x01\x55\xb5\x3b\x5f\x6b\xc2\xa0\xb7\xef\xb1\x12\x51\x34\x0d\xca\x0b\xe4\xf7\x04\x1e\x1f\xe7\xea\x09\xe2\x43\xaa\x0a\xb4\x09\x16\x77\xc1\x3f\x72\xe8\xee\x84\x0a\xf2\xf1\x5d\xce\x11\x41\x72\x17\x28\x22\x44\x14\x29\x3f\x1f\xdf\xef\x49\x3a\x7c\x1e\xcf\x1b\x17\x89\x3a\xa2\x3b\x8f\x30\xb3\xcf\x6d\xc0\x7e\x3e\xd6\x3d\x72\x05\xef\x5d\xef\x21\xc3\x91\x64\x3b\xc2\xc8\xbe\xff\xf5\x46\x17\xce\xdd\x07\x03\x04\x1f\x04\x8d\x3d\x9e\xf7\x54\x79\x5f\x98\xca\xae\xb3\x2d\xee\x26\xab\x1a\x52\x0e\x0b\xe0\xb9\x79\xf9\xec\x7f\x00\x87\x12\xa8\x7d\x72\xb1\xe0\xae\x06\xe2\x71\x0c\x8a\xe8\x0a\x95\x30\x31\x3c\x80\xcc\x50\xf2\x81\xe2\x8d\x62\xea\x9c\x89\xae\xfe\x9a\x63\x42\x87\x1e\xfc\xfb\x1f\x17\xa7\xcf\xd5\xd1\xf4\x72\xc8\xed\x9e\x66\x79\xb6\x28\x0b\x75\x89\x05\x2e\x36\xf1\x4c\x84\x78\xf5\x0b\xb8\xfa\x6b\x0f\xc5\x06\x03\x66\xf3\x6c\x65\x40\x16\xcf\xf6\x4b\x38\xfa\xdd\x62\x6a\x55\xfe\xc0\x85\xa7\xf0\xd0\xe8\xea\x40\x68\x49\xe7\x42\xa7\x41\xe3\x59\x3c\x22\x8e\xaf\xa2\x36\x79\x6e\x16\xf5\x0e\x8d\xd9\xad\x71\xbf\xc5\x6f\x49\xbc\x84\xed\x72\x17\xe8\xaa\xba\xef\xd8\x56\x65\xcd\x9b\x4e\x56\xac\x91\x65\x96\x76\xb8\xc6\xae\xe5\x9a\x1f\x93\xe3\x85\x19\xa1\x91\x4f\xed\x3e\x73\x17\x56\xe5\x5e\xe7\xf5\xfe\x64\x55\x19\x93\x00\x3b\x0e\x40\xde\x2d\x32\xc0\x50\xaa\x09\xd3\x41\x51\xfe\xe7\x07\xe0\xc2\xe0\x25\x4c\xb1\x88\x8e\x91\x81\x9b\x3d\xc6\x2d\xce\x66\x11\x4b\x5c\x83\x43\xd2\xc2\x31\x49\xc4\xa8\xd4\xd7\x64\xde\x05\x84\x5c\x22\xa8\x0f\x96\x6e\x21\x02\xa0\xae\x7d\xda\xf1\x81\xfc\xd8\x54\x86\x42\xc2\x70\xb9\xf5\x07\xa8\x56\xc2\x3e\xfe\x11\xde\x06\x3c\x14\xf8\xe5\xee\xb9\xe2\x93\x69\xb6\x41\xb3\x37\xfa\xb3\x49\x88\x2f\x43\xbb\x9e\x86\x50\x96\x35\x79\x9e\x60\xb1\x25\x96\x97\x6b\x60\xcf\xd8\x40\x18\x41\x02\xf1\xb0\x9e\xaf\xd2\x85\x5d\x91\x1f\xf3\xcb\x3e\xac\x2f\x07\x9e\xdc\x89\x30\x7b\xf1\x38\x39\xc8\xad\x30\x27\xf2\x80\x1a\x4b\xd5\x65\xe8\x6d\x55\x56\x00\x4b\xcc\xca\x82\x38\xd5\xc0\x26\x9b\x81\x70\x01\x0c\x56\x1e\x55\x1a\x10\xb3\x30\x0e\x67\x6c\xb4\xad\x92\xc8\x4a\xc7\x2a\x39\x64\x98\x6b\x18\x6b\xce\xb0\x72\x96\x79\xe4\x20\x72\x93\xa2\x6b\x81\x59\x83\x3c\xc9\x68\x77\x82\x42\x8c\xa8\xd6\xb8\x63\xb7\xe8\xfa\x8c\xac\x08\xc0\xfa\xfe\x29\xcc\x81\x40\x02\xe7\xbf\x2e\xb0\x39\x89\xb7\xda\x88\xf2\xae\xd5\xd8\xbe\x1a\x95\xad\xb7\xd9\x66\xfd\xa7\xd8\x14\x29\x42\x8e\xdb\xf9\x86\xed\x48\x79\xc1\xbc\x39\x2b\x5c\x23\x9b\x53\xbe\x6c\x34\xb2\x75\x06\xb8\xd9\xf1\xe8\x63\xc2\xa6\x79\x26\xa6\xda\xef\xb3\x75\x86\xf7\xc5\x7b\x1d\x2c\x68\xa6\x53\xa2\x02\x4f\xba\xd2\xfe\x82\xed\x2f\xac\xf5\xd6\x69\xfc\x0f\xb5\xd4\xfd\x48\x3c\x77\x33\x8a\xbb\xd5\x59\x50\x1c\x71\x50\xc3\xcd\x36\x37\x3e\xc7\x4d\x33\xdd\x17\xd4\x72\x0d\x74\x3c\xd7\xa1\x2b\xdd\xf0\x72\x59\xb6\x00\x2a\xd7\xa5\xfb\x22\xf1\x48\x77\xaf\x7f\x1b\x6f\x16\xf9\x6d\x59\x65\xf5\x7a\x63\x95\xd9\xcc\xcb\x65\x16\x0c\xf3\xaf\x37\x3a\xd4\x01\xe4\x31\x7f\xfd\xf3\xfe\xa9\x9a\x98\x1a\xb7\x26\xd7\x02\xb4\xf7\x9f\x9e\x13\x18\xc4\x17\xaa\xcc\x42\xf4\x28\x22\x7a\xf5\xce\x80\x27\x95\x66\x25\xf6\x45\x59\xd8\x6d\xb6\xd8\x95\x3b\x0b\xb1\x70\xe7\x6e\x99\x25\x9a\x93\x02\xc1\x20\xc2\x06\x55\x1b\x53\x2e\xf7\x3e\x34\x6f\x5b\x97\xb4\xb7\xc8\xa2\x49\xeb\xb1\x49\x64\xf4\x0b\x59\x26\x7c\x5c\xcc\xdc\x19\x92\x48\x21\x53\x1c\xdc\x0d\x26\x77\xaa\xcd\xcf\x75\x08\xff\xaf\x32\x93\x2f\x7f\x84\xbb\x84\x96\x7a\xf3\x05\xc8\x12\xd4\x49\xa4\xd3\x78\x37\xef\xdc\x31\x4e\x03\xb6\x9a\xdc\xfd\xa5\xd2\x39\x6b\xed\x80\x3a\x75\xe0\x4b\xf0\x74\xfe\x39\x51\x61\x95\x71\x27\x40\xf9\x0e\x3b\x76\xe8\x00\x3f\x14\xd1\x63\xf6\x4b\xd8\x3a\xf2\x3d\x35\xd1\x76\x4f\xbc\x40\xd3\x01\xb4\x81\xbf\x7e\x60\xfd\x64\x3c\x53\x83\x1c\x52\x99\x60\xdf\xf8\xc9\x77\x1d\x95\x28\x84\x6d\x05\x78\x77\x3a\x9c\xe5\x03\x7b\xa6\xdc\x02\x37\x7a\x9f\xc8\x3a\x78\xc6\x1e\x2d\x4d\x55\xde\x7a\xcb\x92\xce\xf0\xe9\xe5\x30\x74\x39\x51\x98\x32\x36\x3c\xb6\x24\x1f\xe0\x2d\xa1\x8d\x49\x4c\x1c\xf2\x2e\x8f\x6d\xaf\xd9\x23\xb4\x89\x1e\x9f\xf6\x62\x5e\x2d\x75\x7c\xd6\x73\xde\x2f\x9f\x7b\x4b\xb7\x70\x17\x3a\x6f\x31\xef\xcd\x77\x48\xad\x08\x95\xeb\x78\xae\x53\xda\x49\x13\x61\x84\x59\x18\x6b\x75\x45\x75\xed\x10\xfe\x2d\xdd\x51\x51\x65\xab\x7d\x3c\xd3\x80\x16\x8c\xe1\xe2\xee\x99\xab\x78\xcf\xf9\x91\x3f\xed\xf8\xb9\x6c\x5c\xb9\x8a\x1e\xb3\x58\x97\x25\x46\x59\x25\xb3\x25\x0c\x53\x4b\x04\x42\x0e\x59\xbb\x3c\x85\x5f\x80\x37\x07\x3b\x21\xb3\x7e\x1f\x7e\x0e\x43\x34\x65\xf3\xff\x45\xa2\x5e\x25\xea\x75\xa2\x4e\x9f\x25\xea\xf4\x0c\x03\x03\xa7\xcf\x13\xe6\xa3\x81\x07\x89\x82\x04\x9f\x10\x83\x70\xe7\xd6\x54\xd6\x2c\x39\x3e\xe3\xf5\x03\x78\x86\x41\xef\xe6\xa2\xa0\x2f\x4c\x32\xe3\xce\x62\x46\xae\xc1\xbd\xbe\x73\xa4\x07\x76\x60\x86\x02\x17\xa0\xfe\x8c\x9c\x36\x73\x5b\xe6\xbb\xda\xe4\x7b\xcc\xe7\x89\x44\x1f\x32\x16\x62\x73\xf0\x7b\xb0\x3f\xdb\x9d\x89\x34\x8c\xd0\xd7\xf0\x31\xc2\xd6\x75\xf6\x7c\x20\x07\x66\x63\x78\x08\x4b\xcc\x6c\xb6\x6b\x6d\xb3\xbf\x84\x31\x88\x8b\x76\x35\x02\xf6\xcc\x52\x49\xb4\x5d\xa2\x2a\x73\xab\xab\x65\x6e\xac\x6d\xd4\x0a\x60\x3d\x8f\xd9\x6c\xf3\x72\xdf\x6c\x49\x67\xcd\x9f\x1c\xd9\xfe\x59\x63\x19\xbb\x3d\x50\x52\x38\xc2\x78\x30\x5b\x46\x2b\x00\xd7\xb6\xd2\xd8\xf3\xd2\xc0\xf8\xb4\x76\xeb\x83\x77\x41\x48\x94\xf3\x31\x4f\x07\x6a\x83\xdc\x3c\xec\x5d\xcf\xd5\xb0\x58\x9a\x4d\x01\x0a\xd2\x2d\x5b\x4b\xdf\x56\x06\x93\xbe\x19\x5e\xb5\xc2\xc7\x71\x06\x3b\xcf\x98\x3f\x26\x2b\x16\xbb\xaa\x12\xbe\x96\xeb\x61\x4c\x58\x84\x72\x0c\xb7\x57\x8b\x9d\x32\x5e\x12\xe1\xe5\x30\xd8\xd6\x17\x0e\x11\x03\x08\x58\xd1\xb3\x0e\xa2\xce\x2e\xd6\x1d\xdc\x89\x00\x26\x12\xa8\x4d\x62\xca\x93\x4c\xce\xf9\x79\x65\xf4\x62\x4d\x21\x2e\x77\x07\x85\xfd\xe1\x1d\x2b\x9d\xe5\x16\x69\x78\x2b\x0a\x1c\xfd\xff\xec\xbd\xeb\x72\xdb\x48\x96\x27\xfe\xff\xac\xa7\xc8\x50\x44\x87\xc5\x0d\x08\x65\xc9\x2e\x57\x95\xbd\xbb\x11\xb4\x44\xdb\xec\x91\x48\xad\x48\x95\xdb\x33\xd1\xd1\x95\x24\x92\x52\xb6\x41\x80\x0d\x80\x92\x39\x9f\xf6\x1d\xf6\x0d\xf7\x49\xfe\x91\xe7\x92\x79\x12\x00\x25\xb9\x6f\xbb\x1b\xd1\x9e\x98\x6a\x5b\x02\x90\xf7\x93\xe7\xfa\xfb\xe1\xf3\xcc\x78\xf8\xea\xa5\xca\xf4\xce\x47\x49\xf0\xe2\x12\xb8\x2c\x7d\x26\x11\xfb\x31\x51\xe1\xcd\x7d\xf2\x2b\x59\x1c\xf5\xb6\xba\x07\x06\xce\x22\x80\xb3\xf4\xf8\xf4\x12\x77\xc6\xc0\x05\x24\x9e\x69\x47\x63\x30\x01\xc2\x77\x27\x95\x37\xa8\xeb\x46\x42\x6f\x40\x7d\x52\xb3\xad\x4c\xc2\x65\x6b\x0c\xac\x62\xa0\x80\x5c\x2d\xcc\xae\xa4\x39\x7f\xb4\x4f\xd1\x10\xb8\xbc\x6a\x52\xaa\xb9\xaf\x2e\x98\x56\x8c\xca\x82\x58\x3d\xf1\xc2\x7a\x18\xba\x5b\xf2\xe1\xec\x42\x3a\x2d\x3a\x25\x60\x3f\xf9\x6c\x5f\x30\xe4\xbd\xe3\x3d\x76\x55\x17\x4e\x1a\xa2\x79\xea\xa5\x20\x7d\xac\x14\x38\x33\xae\xb5\x80\xcb\xd3\xdd\x4a\x90\x35\xe2\xe6\xc9\xa9\xc2\xbe\x26\xd1\xd4\x4d\xb9\xd9\x98\x3c\xa6\xf6\x6c\xa3\x9c\xb6\x3b\xf5\x0e\xdd\x0b\xb0\xb4\x6e\x46\x08\x4a\x53\xd4\x5e\x04\x20\x75\xf8\xf7\xc3\x9d\x6e\xea\x12\xf3\x83\x1e\x4d\x3c\x96\x76\x35\x46\xd3\x56\x2d\xdf\x2a\x95\xd7\x71\xe5\x3d\x96\xd8\x05\x00\xf5\xde\x02\xb8\xf6\x94\x3e\xa7\x7c\x6d\xf6\x71\xfc\x0e\xdc\xaa\xd6\x0f\xd5\x36\x68\x4c\x94\x55\xec\x17\xed\x51\x48\xf0\x46\xa0\x65\x43\xfc\xb2\xc6\xae\x3d\xd6\x0f\x01\xc9\x82\xb4\x17\x2c\x51\xbd\x6a\x5f\xff\xc2\xf6\xc0\x10\x21\x46\x35\xf3\xe6\x63\x95\xdd\x59\x4b\x49\xbb\xd0\x0f\xf5\x3b\x35\x29\x8b\xe3\xb1\x30\xcd\xc1\xce\xa8\xf0\x0b\x9c\x11\xef\xed\x4f\xc0\xa1\x80\x6b\x65\x9b\x6b\x51\xbf\x89\x1a\x95\x3b\xe2\xa0\xc7\xd4\x2d\x8b\x2b\xb3\xf5\xa6\xac\x6d\xaf\xe6\xf9\xc4\x26\x30\xdf\x9c\xf9\xe9\x9a\x3c\xe6\xbf\x42\x80\x06\xad\x52\x76\xc2\x3f\xb3\x5b\x89\xc7\x6f\x48\x67\x29\x05\x7c\x61\xf3\x00\xfe\x34\x79\x41\x3c\x28\x11\x7a\x5b\x85\xa2\x5b\x99\xb5\x05\xf4\x69\x8b\xc8\xe6\x8b\xdc\xde\x62\x66\x51\xb9\x30\x74\x25\x3c\xb3\x27\x69\xeb\x02\x85\x6c\xa9\xa0\xb8\x76\x85\xab\x93\x13\x81\xe6\xd7\x3b\x53\x6a\x75\xe4\x59\x10\xc0\x66\xf1\xa5\x0b\x36\xdf\xe1\x56\xed\xf7\x48\xb0\xd4\xc0\xdb\xec\xab\x45\x46\x00\x81\xed\xdd\x26\x87\xc2\xed\x3f\x88\x2f\x17\x99\x5e\x87\x4f\x87\x1c\x25\xda\xa7\x09\x0a\x19\xd2\xe4\x1a\xdd\xb8\xce\xed\x12\x4f\x57\x25\xbd\x15\x62\xd7\x00\x2a\x88\x6d\xd4\x1a\x0e\xfe\xc2\x59\x52\x66\x8d\x93\x0d\x7e\x0b\xd0\x0b\x28\xd7\x9f\x2b\x3e\xcf\xd0\xd9\x5e\xae\x54\xbc\xa1\x23\x85\xd0\xa9\x6e\x85\x1f\xb8\x74\xdd\x80\x93\x26\x68\x75\x62\xd3\x76\x6c\x03\xd2\xb6\x57\x1e\x3c\xdb\xcd\xd0\xc3\x5d\x99\xe3\x32\x00\x98\x17\xde\xcb\x7e\x9d\xe0\x9e\x09\xad\xbd\xa8\x1f\x5d\x18\xa9\x60\xc1\xc5\xef\x64\xdb\xc6\xad\x32\x24\x0d\x92\x3f\x8c\x6e\x43\xe8\x38\x4c\xc2\xcf\xa9\xa2\x2c\x97\x36\x7e\x4a\x0a\x6f\xb8\xad\xc6\x30\xd4\x58\x03\x9b\xf1\x58\x0a\xf3\xc0\xd6\x50\x07\x7b\xa5\x53\x1a\x9b\x28\xaf\x31\x10\xc2\x3a\x55\xc5\xba\x53\xdc\xae\x88\x9d\x3a\x89\x13\x4d\x9f\xcf\x80\x0c\x14\x76\xb4\x09\x70\xea\x96\xdb\x5c\x57\x71\xe4\xcf\xec\xb5\x20\xfb\xc2\x11\x42\xd3\x45\x63\xc7\x16\x5b\xc3\x46\x80\x6d\xfa\xc1\x93\x75\xc3\x4d\x42\x9c\x08\xac\x25\xff\x12\x4c\x74\x8f\x7d\xf8\x58\x9d\x2e\x0f\x20\x22\xea\x03\x39\xdf\x72\x2f\x8a\x7c\xa1\xc0\x6e\x56\x93\x09\xf5\xba\x07\xad\xd2\x29\xd9\xbc\x9e\x82\xce\x86\x7c\xe4\x91\xec\x8d\xfa\xcc\x64\x6c\x3d\x58\x78\x6e\xfb\xfc\x92\x86\xba\xda\x6b\x35\xfd\x20\x12\x73\xcf\xa6\xbf\x02\x14\xd3\xd9\xf4\xbc\xaf\x3c\x24\x3d\x04\x70\x2d\x2e\x02\x19\x4e\xce\xfb\x0a\x7e\x5b\x1c\x53\x71\x1d\xef\x93\xdc\xae\xc3\xc9\x97\x67\x7c\xb4\xaf\x8e\x64\x36\x9c\x8f\x67\x1f\x86\x67\xf3\xe9\xf5\x17\xc6\x1c\x7b\xba\xba\x24\xe1\xf2\x92\xe3\xb8\xbe\xc4\x4d\x3c\x82\x8b\x01\x5a\xdb\xf7\x41\x9a\xf9\xc2\x0d\x89\x63\xe6\xb3\xd5\x5a\x40\x66\x5c\x2e\x7b\x3d\x9a\x5d\x41\x1d\x72\xab\x69\xc4\x35\x13\x95\x2a\x30\x96\xa7\x70\xcd\xb0\xce\xb6\x7f\xa1\xdd\xd2\x0e\x27\x6a\x34\x9b\x51\x21\xb3\x9b\x96\x36\x8f\x58\xea\xda\xa6\x9a\x5d\x28\xa0\x69\xed\x0d\x2c\xb5\x19\xff\xfb\xe8\x5c\x7d\x1a\x5d\x8f\x6e\x26\xe7\x80\x59\x07\x0c\x5b\xb3\x9b\xf7\xbf\x1f\x9d\xcd\x71\xb6\xa2\x6e\x20\x71\xd6\xcb\x54\xac\x79\x54\x97\x9c\x2a\xfc\x90\x1b\xf7\xf8\xfa\xec\xe6\x72\x06\x24\x67\x6e\x22\xae\x91\x83\x99\xaa\x99\x43\xb9\x4e\xab\x3c\xb9\x7f\x5b\xc5\x35\xcb\xed\x32\xe7\x41\x22\x8a\x7c\xe2\xfa\x1e\xac\x2d\x72\x4b\x42\x85\x44\x10\x82\x25\x94\xb7\x67\x95\x95\xf7\xa0\xaf\x3d\x52\x4b\xce\xb3\xfd\x69\xe8\x7a\x03\xd5\x48\x8f\x0e\x8c\xdf\xfb\x40\x98\x69\xee\x03\x1f\xa7\xd3\xf3\xcf\xe3\x8b\x8b\x04\x49\xe5\x66\xf3\xe9\xd5\xd5\xf0\xe3\x28\x89\x60\xd8\xdc\x90\x2f\xaf\x6e\x5c\x13\x1e\x3d\xed\x5a\x5d\x0e\x2f\x3e\xdc\x4c\xce\xf0\xdb\x34\x24\xa6\x91\xc3\x22\xa5\xb3\xe9\xa5\x3b\x7a\x51\x9f\x19\xae\xad\x05\xa6\x86\xe0\x69\x38\x83\x9f\x86\xbf\x8e\x10\x43\x6d\x3c\x71\xc7\xe5\x79\x20\x6a\xbc\x23\x7b\xf7\x0a\x7d\x19\x98\xdd\xae\xae\x2e\x00\x96\x2e\x3e\x24\xe7\xa3\xe1\xfc\x13\x94\xcf\x8f\xae\x67\xd3\xc9\xf0\x42\x8d\x27\xbf\xbf\xb9\x86\xb3\x76\x73\x31\xe7\xba\x2d\xf2\x3b\x8a\x3d\x42\xc7\x7c\xf4\x87\xf9\x68\x32\x6f\x03\x00\x32\xcf\xdc\x0c\xfb\x1a\x7a\x97\xaa\xd9\xf4\x72\xa4\x7e\x7f\x73\x3d\x9e\x9d\x8f\x89\x99\x8e\xb9\xe7\x2e\x2e\xa6\x9f\xe9\xa3\x67\x17\x37\x33\x02\x2a\x88\x87\xf6\x0c\x7c\xbe\x44\xcd\x5c\xdf\x86\x73\xf1\x1d\xb7\x40\xe2\x43\x97\xc3\x2f\xf1\xa4\x5c\x8f\xce\xc6\x57\x63\x27\xd6\xe0\xf4\x9d\xa4\xfd\x1e\x14\x5f\x7e\x58\x97\xb9\x81\x50\x42\x5c\x6a\xc0\xe5\x10\xce\xb0\x24\x0e\x93\xa0\x94\x06\xa2\xae\x44\x39\xed\x9e\xdc\x65\xdb\xc6\xe6\xcc\x33\x56\xae\x1e\x43\x69\x6d\xa9\x42\x99\x59\x19\xe0\x20\xf5\x5e\x1c\x77\x4d\xde\x95\x79\xa6\xee\x74\xb5\x06\x6f\x57\x7f\xd2\x06\x41\x0a\x17\x99\xd2\xb7\x50\xbf\x82\x7e\x9f\xd2\x69\xa9\xde\xfb\x93\xf0\x68\x9c\xe6\x50\xa3\x65\x6d\xbe\x6d\xd0\xb2\x6e\x71\xc5\x32\xbb\x96\xeb\x3f\xe0\xa4\xc2\xad\xab\x9b\xa6\xac\x0a\xb3\xab\xd5\xca\x98\x7a\xc0\xb3\xc2\x83\x97\x2e\x59\x08\xbc\xc5\xd0\x40\x9c\x7b\xe0\xeb\x45\xfb\x70\x89\xdb\xb9\xad\xf4\xe9\xc7\x75\x72\x8f\xc0\x1c\xd2\x95\x60\xd5\x4f\x53\x34\x88\x04\x4c\xd8\xa8\xc8\xd4\x0d\x14\xf3\x40\xd8\xa9\x9d\xb4\xa8\x23\xd4\x32\xdb\x98\xf5\x61\x8b\xed\xea\x29\xe0\x33\x0a\x75\x07\x52\x62\xc9\xba\x09\xc6\xf5\xeb\x9f\xc3\x60\x31\x89\xee\x83\xc9\x20\x1c\x73\x1d\xac\x2b\x1f\xdf\xd8\x3b\x00\xce\x8f\x45\xa5\x49\x78\xd8\x1e\x27\x4b\x24\x9e\xe4\x27\x83\xc0\x38\x83\xaf\x52\x75\x69\xeb\xa5\xc9\x73\x5d\x98\x72\xdb\x76\x01\xf9\x25\x61\x62\x5d\x02\xc5\x07\x8f\x24\x74\x77\x59\x16\x4b\x53\x79\x72\x1a\x20\xe8\xa1\xd6\xd7\x50\xf3\xe5\x0b\x80\xbc\xae\xd8\x07\xde\x08\x35\x4d\x98\x32\xb0\x2d\x4c\xb1\x2a\xab\xa5\xc1\xec\x13\x66\x97\xa5\x77\xfd\x81\xae\xcc\xaa\xac\xd6\x08\x48\xac\x91\x6b\x79\x79\x67\xcd\x3d\xc4\x1b\x0a\x2c\x5b\xd1\xb5\xcf\x53\xc6\x90\x8a\x5e\x1b\xca\xb1\x03\xdb\x76\x59\x16\xe5\xda\x2e\xd9\xb1\x46\x2c\xcb\x25\x7b\x2e\x42\xab\xde\xc7\x09\x8e\x0f\x77\xd0\xbb\xcc\x92\x10\xab\x8a\x5d\x75\xad\xd9\x0c\xb5\xd0\x22\x63\x9b\x12\x43\xea\xa6\xda\x52\xf0\xab\x07\xb6\x4e\xa2\x68\xc6\x10\x8e\xdc\xb3\x1e\x6c\x4d\x4a\xe1\xf7\xb4\xc6\xbc\x66\xb5\xb3\x8c\xe1\x54\xd8\x02\x12\x29\x78\xe6\x29\xb9\x47\x52\x83\x91\x6b\x55\x7c\x74\x61\x9a\x07\x67\x01\x89\x1f\x55\xa6\x86\x68\x52\x8d\x2e\xd7\xdc\x36\x96\xc2\x60\x32\xc4\xd8\xf4\x4e\x45\x6b\xab\x86\x9c\x80\x3f\x6f\x2b\x5b\x67\x98\x2f\xc6\x43\xe7\x73\x74\x56\x6e\x05\xd0\xe6\xa4\x04\x98\xf8\x82\xd8\xd4\x90\xdd\x56\x74\xef\xa8\xac\xbc\x83\x36\xde\x9b\x71\x23\x96\xb1\x97\xe1\xeb\x09\xed\x78\xd9\x52\xcf\x24\x33\x60\xda\xbd\x71\x86\x1a\x26\x8b\xfa\x41\x20\xf2\xf3\x4c\x17\x8d\x76\x36\x7e\xa5\x5d\xcf\x8b\x36\x00\x4b\x58\x65\x08\x72\x91\x51\xdf\xbe\xa9\x40\xa4\x3f\xee\x73\x4a\xb0\xbb\x24\xfd\x91\xad\x70\x8f\x6c\x27\xdf\xce\x86\x08\xd2\xe7\x77\x1e\x14\x4d\xce\x37\x6d\xb5\x09\x89\xac\xb3\xb2\xb8\xe7\x68\x7f\xe1\xfe\xd5\x54\x7a\x49\x49\x32\xee\xf1\x71\x41\x51\x05\x88\x13\xcf\x28\xdb\xf1\x63\x59\x66\x35\x55\x72\x92\xff\x2f\xe0\x5d\xc3\x7e\xd1\x0f\x58\xf1\xc8\xc2\x91\x40\x5a\xb9\x92\x22\x04\xef\xb8\x48\x14\xb2\xc5\x96\xd4\x7e\xd8\x4b\xe1\x18\xf1\x2d\x09\xe6\x75\xa5\x57\x20\xc3\xbb\x39\x44\xf1\x6d\xed\xd3\x11\x0e\x78\x97\x0e\xc9\x20\x85\xeb\xd5\x3d\x00\xd8\xf1\x71\xa6\x9c\x2f\xce\x60\x89\x00\xd9\x00\xbe\x80\x56\xec\x6f\x5d\xf4\xc6\x5d\xb4\x44\x0b\x67\xd4\x8b\x8f\xe3\x16\x29\x3e\x77\xe9\x7d\xa2\x64\x39\x90\x24\xc7\x36\x8c\x9c\x2a\x73\xde\xe3\x2e\x71\x6f\xf0\x4a\xe9\xb3\xe1\x23\xcf\x8b\x04\xdb\xf7\x05\x94\xf0\x31\x82\xd1\xdf\x13\x41\xef\x7c\x00\xb1\x42\x5a\x0c\xa4\xfe\xd6\x6a\xf6\x68\x3d\x89\xdb\xb4\xc5\x5b\x75\x01\x12\x7b\x86\xbe\xf8\x3a\x51\x27\x6f\x5e\xbe\x54\xc3\xf5\xe6\xce\x36\x77\x46\x37\x95\x51\x57\xba\xfa\xfa\xa0\x77\x89\xba\x74\xe7\xcb\x35\xf5\xab\x35\x0f\x89\x3a\x1b\xaa\x5f\x5e\xbf\x7c\xfd\xea\xf8\xe4\xd5\x8f\x27\x98\x44\xdb\xbc\x3d\x20\x04\xb6\xb2\xae\xd3\xfa\xd6\xa6\xcb\x72\xfd\xc3\x06\xd1\xd9\xea\x1f\xdc\xac\xbf\x3f\x98\x30\xb5\x38\x84\xf6\x7c\x18\xd9\x16\xb1\x43\xa7\x0d\xeb\x21\x91\x91\x4a\xe2\x15\x02\x0c\x0a\xb5\xd0\xb5\xad\xe9\xa8\x7f\xbf\xbf\xe1\xff\x3d\x5f\xc3\x41\xe4\xfe\x27\x4c\xbb\x28\x22\x60\xeb\xb7\xea\x3f\x10\x8b\x10\xf0\x1f\x69\x16\x93\x96\x17\x4e\x25\x24\xc8\xb0\x0c\x14\x28\xcc\xfe\xa8\x12\x51\xc4\xbe\xd8\xed\x53\x9a\xfb\x1a\x6d\x15\xca\xff\x87\xc2\x7a\x03\xc8\x34\x07\xba\x7e\x08\xd0\x31\xd8\x25\xd7\xc0\x21\x79\x6b\xab\x0c\xae\x1b\xe5\xf8\xe3\xbe\x9e\x84\x46\xc9\x15\xee\xa5\x06\x3b\xb6\x16\xbb\x16\x33\x87\xad\x91\x9d\x0a\x78\x5c\xdc\x95\x9c\xd7\x06\xd3\x79\x98\x0a\xa3\x0f\xb3\xeb\xe0\xb1\x44\x1d\x37\xe1\xfb\x2b\xfe\x12\xe2\x44\x4e\x1e\x2b\xfd\xeb\x8e\xf9\x3b\xcb\xff\x0e\xd5\x1f\xff\x9f\x29\xca\xfd\x27\xfe\x49\x7f\x38\x3b\x3b\x7e\xff\xe5\x78\x72\x76\xfc\x3a\x7d\xf9\x8f\x29\x01\x7e\xbc\xfe\xf7\xf5\xe9\x9b\x1f\xdb\xf8\x5f\xa7\xaf\xfe\x85\xff\xfb\xcf\xf9\x73\xe6\xc4\x80\xd3\x0a\xce\xa0\x48\xa7\x56\xc3\xc6\x9b\xce\xc7\x93\xb2\x38\x0b\x46\xe9\xeb\xf4\x65\x4b\xd3\xea\xbc\x7c\x46\x44\x21\x08\xee\xdb\xfe\xf5\xe1\xc0\xb3\xbe\x82\xee\xb5\xb2\x15\xb1\xc4\x73\xc0\x9f\x71\x36\xd0\x54\xa2\x20\x38\x46\xea\xd1\x78\xca\x90\x33\xb7\xcd\xdf\xde\xe9\x08\xc1\x87\xf8\xf8\xbe\x6f\x81\x0a\x12\xa0\x03\x3b\x53\x1d\x2f\x73\x4b\xb1\x70\xca\x0d\x30\x64\x27\xdf\xd9\x4d\xda\xfd\xee\x5a\x7f\x05\x92\xb5\x3a\x7c\x9a\x6e\x09\x22\x57\x0b\x5c\xc5\x81\xc1\x99\x6e\x64\x5d\x1f\xdb\x9a\x6e\xe4\x9e\x4f\xdf\x02\xdc\x46\x60\x64\x44\x6e\x9b\x5b\x5d\x81\x6c\x93\x4d\x62\xdd\xaa\x67\xef\xf2\x8c\x98\x5e\x22\xda\xaa\x37\xf9\xdf\x17\xf3\xf4\x74\xb7\xa7\x43\x0c\x2a\x8c\xc4\x73\x21\xd7\x47\xba\xaf\x30\xc5\xc7\x75\x90\x93\x05\x2c\xd2\xe7\x30\x98\xd8\x36\xcf\x4d\xdd\xb4\x8b\x77\xd3\x83\x1b\xb0\x38\x3a\x6d\xc6\x08\xd4\xf5\xc1\x93\x0b\x1b\xb8\x29\xa1\x14\x4b\x57\x19\xb8\x29\x9c\xa6\xd7\x57\xfe\x80\xc9\xb2\xee\xa3\x65\x55\x8b\x20\x36\x79\x38\xee\x4a\x80\xa7\x0b\x70\xb4\x25\x16\x76\x05\xd3\x1c\xcb\x57\x9c\x1d\xb0\x6d\xee\x4a\x4c\x62\x08\x9f\xf1\x6b\x22\xb4\xef\x00\xe3\x01\x7d\x21\xda\xa0\xa8\x59\x2a\x2f\x0c\x8a\x5e\x3c\x4a\x4c\x52\x6e\x33\xd9\x83\xf7\x28\x23\xce\x50\xf4\x08\x51\xd1\x00\xaf\xa9\x24\xbf\x76\x8a\x77\xe2\xd3\xbb\x03\xe5\x72\x42\x07\x10\xd9\x9d\xcb\x6a\xed\xcb\x62\xca\x6d\xc8\x8f\x01\x9f\x8d\xfb\xff\xb3\xb8\xd1\x95\xcf\xa1\x29\xab\xfa\xad\x9a\x6e\xab\xce\x02\x31\xb1\x22\xa4\x01\xac\x88\x5c\x09\x94\x0e\x60\x5b\x83\x59\xc4\x34\xbd\x12\x8e\x80\x1c\xff\x26\xc2\x01\x75\x2f\xfa\x09\xb6\x85\x7a\xd0\xbb\x5a\xa4\xdd\x08\x7a\xa6\xc5\xee\x19\xb3\x9e\x42\x77\xe3\x7e\x56\x95\xb9\x2f\x21\x10\x98\x7a\xfa\xa6\x9a\x11\x96\x2b\xa3\x33\xac\x15\x75\xe7\x0c\xb6\xdb\x13\x75\x36\x22\xc7\xed\xce\xec\x38\x3e\xba\x30\xab\xb2\x42\xb3\x77\x87\x47\xbb\xa7\x31\x64\x53\x35\x90\x72\xa6\x43\x8e\x4b\xc8\x80\x6d\x7f\x45\x2e\x97\x67\x87\x12\x73\xb9\xd4\x85\xaa\x0c\x63\x2c\x07\x7a\xc0\x00\x74\xd4\xd3\x0b\x86\x61\x81\x34\xa4\x48\xe8\x74\x18\xb4\x03\xa8\x32\xfa\x9e\x7c\xd5\x28\xce\xf9\xd9\xd9\xb1\x97\x53\xfc\x91\x04\xeb\x31\xe9\x8b\xdb\x20\xc2\x00\x67\x87\x38\x5a\x31\x4d\x2b\x60\x2b\x8a\x03\x95\xaa\xcb\xb2\x32\xed\x83\x10\xed\x49\xf5\x56\x3d\xd8\xaf\x36\x5d\x92\x1c\xc1\x52\xd4\x1a\x70\xaf\xe3\xbd\xfc\xa7\x55\x59\xfd\xc9\xbf\xf7\xc8\x7e\x0f\x73\xfa\x56\xbd\x77\x62\x02\x66\xbf\x30\x7c\x66\x5a\x07\x20\xf1\xd9\xc5\x65\xc5\xc5\x2b\x8f\x6e\x71\x31\x95\x82\xc6\x11\x27\x26\x08\x8a\xbe\x4d\xe7\x99\x39\xb8\xbd\x17\x11\x26\x23\xdd\xbd\x61\x0b\xc5\x84\x65\xff\xfb\x7f\xfe\xaf\x15\x38\xee\x81\x09\x3e\x51\x0b\x83\xdc\xc5\xe4\x24\x17\x31\xf2\xe7\xac\xcd\xff\xfe\x9f\xff\x0b\x48\x07\x99\x0a\x38\x90\xc4\x82\xb3\x45\xf0\xf4\xf0\xae\x89\x4e\x23\x01\x37\x14\xf9\x4e\x8c\xa0\x6e\x17\x23\xee\x97\xa8\x98\x93\x12\x26\x1e\x32\x64\x51\xd6\x20\xdb\xe1\x2d\x56\x2d\xdd\x04\xa6\xb7\xee\x9c\xbb\x5b\xa0\x6e\x2c\xbb\x7d\xbd\x78\x59\x09\x6d\xc1\xcd\x5c\xe4\x1d\xf3\xd3\x06\xb0\x64\x98\x7a\x13\x3a\x1c\xde\x8c\x72\xd6\xb8\xc9\x54\x0d\x43\x9f\x21\x55\x41\x7f\x35\xb8\xea\x3a\x67\x68\xa6\x3a\x70\x08\xeb\xfa\xab\x67\x6a\x06\x58\x4d\xca\x97\x5f\x60\xe6\x20\xa6\x10\xc9\x8a\x8a\x9c\xc8\x18\x23\xbe\xde\xc5\x2e\x92\x1e\x89\x27\xf3\x31\xc5\xb2\xdc\x56\x9a\x52\xb6\x7c\x4a\x23\x48\x6e\xee\x0c\x95\x7a\x04\x87\xdf\xfe\x53\x29\xb6\xfd\x5f\x73\x2c\x8d\xa9\xbb\x0a\xc3\xf7\xa8\xab\x2d\x7a\x8b\xf7\x51\x11\x7e\x54\x25\x48\xd6\xed\x11\x87\x58\xe0\x02\x1e\x24\x88\x95\xb5\x44\x22\x47\x88\x89\x55\xc6\x90\x0f\x7b\x01\x2c\x50\x51\xee\xed\x9e\xd2\xcb\xbf\xe3\x18\xd4\xd1\x61\xfc\x83\xc3\x41\xaa\xe6\x91\x9b\x10\x9a\x6c\xbd\xe5\x76\x56\x8b\x7f\x0a\x12\xb6\xd9\xb3\x99\x78\x50\x30\x4f\x99\xd9\x33\x3b\xc8\x75\x15\xd6\xca\x0d\xf0\x8b\xdb\x48\x7d\xd0\x68\xfd\xfa\x28\x5f\xa1\x17\x2d\x01\xe9\x9a\x17\x29\xf1\xbd\x4d\x05\x18\x3e\xf9\x01\x62\xa1\xc4\x0a\x63\x26\x60\x8e\x7a\x7f\xe9\xaf\x3e\xaf\xa0\x7b\xc5\x79\x4f\x47\xbd\xfa\xe3\xa9\x82\xd4\xff\xfe\x9f\xff\xab\x0f\x00\x49\xa7\x6a\x98\xe9\x4d\x23\xdb\xc1\xf2\xf6\x3e\xd5\xf0\x2c\x12\x64\x33\xbb\xb6\xb9\xe6\x9c\x68\x81\x74\x21\xb2\x71\xcb\xca\xd9\x0f\xee\xa2\xdc\x94\xc5\xbe\x71\x21\x1c\x47\xa0\x2d\xee\x3e\x62\x6b\xac\x46\x04\x49\x9c\xa0\x77\x18\xfe\xe2\x2c\x8f\x5b\xf7\x37\x2c\x56\x84\xa0\x4c\x12\xa7\x37\xfb\x3a\x13\xf0\xab\xae\x75\x51\x80\x20\x64\x86\x24\x71\xe1\x04\x0f\xcd\xa3\x03\x85\x10\x5c\x54\xa7\x5b\x56\x7b\x50\x21\xe2\x7d\x9c\x88\x32\xb3\xde\x31\x6a\xb5\xde\x22\xe4\x12\x72\x6b\x53\x9c\xc9\xed\x4c\x18\x54\x0d\x67\xb6\x32\xcb\x12\x8c\xac\xa4\xbb\x76\xee\x23\x39\x28\x9a\x54\xde\x9e\x3d\xd5\x66\xbd\x2b\x96\x77\x1c\x95\x5d\x9b\xcc\x5b\x94\x9c\xfb\xb7\x2e\x01\xf1\xc8\x3a\x03\x8a\xb7\xcd\x82\xb7\x8d\xbb\xb2\xfd\x29\xf5\xa0\x54\xac\x45\xc2\xa9\xe4\x18\x02\x1c\xb5\x47\x27\xd6\x16\xf8\x90\xcf\x71\x65\xfe\xf1\xee\x30\x1f\x23\xad\xda\x23\xc6\xe2\xb5\xe0\x91\x44\x3e\xc7\x9e\x3e\xe1\xa0\xa2\x1b\x1c\x20\xae\xe9\x29\x46\x5f\xca\xcb\x1a\xb3\x26\x50\x57\x88\xcc\x28\x7f\xd7\x26\xbd\xa1\xa8\x68\x91\x81\x4f\x6f\xa9\xeb\x26\xe9\x2e\x36\xf4\x6e\x6b\x91\x55\xd0\xd6\xea\x5c\x37\xda\x1d\x2e\xea\x6a\x22\x90\xbf\x9d\x15\x0e\x89\xb4\xe5\x83\x0c\x88\x3b\x09\xc9\x08\x85\x65\xa5\x96\xba\x31\xb7\x68\xcd\x3c\x73\xff\xca\xe0\xba\xb4\x01\x7d\x69\xee\xd1\x62\x70\x74\x32\x38\x86\x0a\x3a\xb2\xdd\x1e\x9b\x5e\x5e\x85\x2c\x55\x23\x08\x04\xbb\x6b\x66\x6e\x96\x77\x45\x99\x97\xb7\x70\x12\x2e\x8d\xae\xb7\x95\xa9\xfd\xf6\x2a\x71\xab\xe1\x0f\x31\xf4\x40\x5a\x09\x84\x2e\x51\x88\x63\xb2\x6d\x50\xa1\x92\x88\x0a\x07\x90\x47\xef\x8d\x48\xad\x87\xb8\xf1\x6a\x9b\xaf\x6c\x9e\x83\x7e\xbc\xc8\x29\x34\xcb\x4a\xdc\xb0\x6a\xec\x32\x37\xea\xe4\x84\x15\xb0\xcf\xe3\xab\xa9\x18\xdd\xdc\x5d\x93\x3b\xa5\xb3\x72\x43\x61\x8d\x73\xb3\x34\xe0\x9a\x3f\x7d\x99\xa8\x93\x5f\x7e\x79\x93\xb4\xb7\x8f\x8d\xee\xca\x10\x78\xe6\x79\x31\x1c\x4b\xf3\x99\x10\x82\x8f\x96\x66\x64\xa5\xd1\x85\x91\xe0\xdf\x32\xa3\x73\x89\xb3\x16\x12\xbe\x1f\x51\x83\x9f\x16\xec\x18\x1f\xaf\xfd\x41\x16\x94\xc3\x1d\xb1\xc2\xbd\x5f\xa5\x3d\x22\x27\x48\x09\x5d\x35\xb6\x6e\xec\x12\xbb\xd3\x98\xca\xe9\xf8\x28\xf8\x32\xda\xda\x41\x94\x87\xfb\x88\xd3\xca\xe3\x7b\xd4\xc7\xef\xf7\x1f\xf5\xdb\xb4\xa3\x12\x84\xce\xb4\x8a\xb2\x70\x98\xfd\xf9\x21\xcf\x92\x2f\x5c\x14\x02\x47\x8e\x2a\xf7\x9a\x12\x94\xde\xe7\x4d\xf6\xee\x59\x53\x4d\x1a\x09\x99\xce\x17\x7b\xcd\x87\x3c\x9e\x8a\xbb\x54\xb0\x3d\xfb\x39\x08\xf8\x4f\x50\x2d\xcb\x85\x01\x47\xd6\xd4\x03\x9c\x99\x36\xfa\xd3\x63\xd3\x6d\x53\x15\x2b\x87\xd8\x10\xba\x4d\xed\x5a\x57\x36\xdf\xc5\x9e\x16\x28\x3c\xaf\x18\xc4\xf8\x41\x57\x59\xad\x44\x92\x91\xce\xee\x75\xd1\x40\x58\xbb\x52\xeb\xb2\x30\x8d\xdb\x30\x40\xc8\x5e\xd4\xe4\x14\x7c\xb6\x14\x33\xdf\x08\x04\x76\xef\xcc\xae\xba\x5b\xef\xb9\xaa\xd0\x62\xa7\x32\x7b\x6b\x1b\xf7\x15\x9b\x9b\xe3\xfa\x0e\x23\x63\xe2\xe4\xe3\x64\xd8\xba\x35\x47\xa2\x10\xd7\x54\x64\x84\xca\x1c\xb4\xde\x61\x93\xba\x59\x90\x10\xf6\xd7\x21\x8f\x91\x57\xe4\xcf\xa9\x9a\xdd\x21\xc5\x9c\xc6\x8b\x95\xbd\x91\xf2\x70\x09\xab\x87\x6a\x71\xf1\x71\x2c\xbf\x72\xb6\x38\x6e\x38\x32\xc7\xea\x7e\x0d\xaa\x75\xd2\x82\x09\x28\x93\xdf\x12\x6e\x88\x90\x73\x12\xe1\x65\x08\x77\xa2\xcc\x8e\x83\x7f\xd5\x86\x6b\xf9\x12\x86\xc0\xe6\x40\x64\x59\x51\xe1\x10\x07\x26\x31\x67\x07\xcc\xd2\x75\x57\x91\x8e\x87\x1b\x8c\x62\xf6\xd6\xc1\x40\xd7\x20\xc4\xbd\x8b\x8c\x1e\x06\x92\xf4\x25\x4d\x87\xf8\x38\x26\x20\xaa\x4d\xae\x19\xa4\xc0\x19\xf6\x50\x5a\x11\xce\x57\x0e\xce\xb5\xda\x70\xf1\xe3\x9a\x97\xe8\x6b\xfa\xd8\x15\x4f\x2b\xc1\x95\x3d\xa1\xbc\x39\x28\x1b\x2d\x07\xf7\x39\x9c\x27\x77\xab\xfe\xf2\xe6\x87\x5f\x7e\x18\x9d\xf1\x28\x46\x5b\x77\x43\xea\x42\x5d\xe9\x2a\xb7\x3a\xd4\x48\x71\x42\xde\xb6\x58\x5a\x40\x71\x3b\x39\x51\x97\xba\x5a\xde\xc1\x0d\xa6\x48\x8b\xc7\xf0\x46\x40\x7f\x72\x0f\xb2\xd0\xae\x31\x30\xba\xc6\x83\xcd\x37\xde\x76\xb9\x34\x06\xa0\x72\x74\xad\x1e\x4c\x0e\xae\x3c\xba\x98\xea\xda\x49\x1a\x98\x16\xb7\xa9\xee\x75\x0e\x24\x68\xa4\xb4\x14\x3b\x54\x61\xe9\x96\x87\x52\x35\x9e\xaf\x9c\x52\x27\x7a\x64\x98\xa8\x6c\x7a\xc2\x6c\xde\x2f\xca\x50\x00\xdf\x91\xb1\x59\x61\xaa\x11\xec\x10\xe2\x3b\xee\x58\x5a\xa7\x60\x69\xcd\x96\xe5\xc6\x08\x1b\x8b\x55\x64\xf4\xe2\x04\xd4\xc4\x93\x3d\x38\x34\xcf\xbc\x62\x62\x99\x1f\xe1\xcd\x80\xea\xfd\x38\xac\x8c\x2f\xb1\xc5\xfc\xc1\x08\x69\x26\x91\xbe\x65\x25\x0a\x83\x69\x2a\xcd\x3e\x0b\xbb\x5f\x96\x36\xa5\x00\xb5\x44\x5c\x4b\x41\x32\xe9\x04\x28\xc8\xa5\xde\x97\x13\x34\x0e\xcb\xdc\x60\xaa\x31\x38\xfc\xb1\x28\xa8\x25\x3b\x65\xec\x00\xf0\x12\xa2\x36\xdf\xa7\xca\x43\x7e\x09\xf4\xaf\xd0\x7a\xc7\xca\x78\xa2\x09\xb1\x8e\xa7\x8f\xe9\x69\x78\x2b\x81\xc6\x73\x5f\xda\x8c\xfd\x0c\x59\xb9\x5d\x34\x6c\x12\x3e\xa2\xe5\x75\x94\x81\xa4\xd7\x47\xe2\x23\x86\xf0\x3c\x8e\xcb\x6d\x02\x0a\x95\x14\x86\xcd\x92\xf5\x86\xd2\x15\x05\xa4\x41\x8f\xfb\x80\x2b\xee\xa1\xa0\x1d\x63\x39\x50\x68\xde\xbf\x17\xc1\x92\xec\xb3\x08\xde\x1c\xe9\x81\xf8\xde\xeb\x54\x5d\x9a\xcc\x6a\x2c\x54\x87\xc0\x4f\xfd\x4e\x35\x4e\xe3\x07\x6d\x7f\x1d\xa1\x06\xe8\x3c\x2f\x1f\x9c\x71\x32\x8f\x54\x3d\x8e\xc1\xe0\x2e\x7f\xc6\xa6\x74\x5a\xd7\xba\xdd\xac\xc7\xe3\x2d\xca\x07\xf5\xb5\x28\x1f\x40\x2f\x76\xab\x81\x69\x70\x94\x70\x12\xdf\x21\xfb\x7a\x1a\x9c\xd4\xcc\x53\xd4\xea\xf4\x83\x06\x2f\x0f\x2b\xe5\x08\x54\xe0\x16\xc6\x29\x85\x75\x6d\x2a\x51\x37\xae\xca\x2a\xd6\xde\x56\x65\xb5\xb0\xb8\x9c\x91\x9b\xe8\x39\x9d\x79\x6c\x6e\xa4\x1f\xf8\x59\x1f\x0b\x96\xd3\x93\xf6\xda\x33\x75\xb1\xda\xc2\x7e\xa4\x11\xb5\x96\x3f\x04\xdb\x30\xeb\xa7\x16\x86\xa6\x1e\x1c\xbd\x1e\xa8\xc2\xdc\x9b\x8a\xcf\x75\xdd\x39\xc2\x62\xe7\xfd\x98\xaa\xf3\xf2\x81\x19\x2d\x2a\x0f\xbe\x95\xb6\x05\xd3\x54\xe2\x7a\x88\x15\x74\x72\xbd\x6b\xea\xa8\x11\x20\x1b\x55\x02\x0d\x62\x9f\xa6\x1e\xc1\x39\x78\xbf\x9f\x2e\x18\x90\xab\xd3\xe2\x53\x3b\xbb\x5d\x9f\xf8\x5d\x8e\x0f\x2f\x14\x27\x6e\xc3\x8a\x89\x11\xe0\x93\x51\x5e\x23\xf6\x92\x14\x2c\x42\x5a\x11\xf9\x51\xa0\xbc\x33\xc4\x0c\x25\xd2\x57\x51\x77\x50\x3d\x43\x71\xe6\x5e\x7e\xd2\xe2\x6f\xca\x64\x9f\xdf\xca\x89\x4f\x80\x31\x2d\x7d\x8f\xeb\x30\x59\xed\x35\x08\x6a\x39\x86\x8f\x9e\x5a\x2b\x31\x47\x6f\x60\x82\x04\x0c\x81\xfb\x77\x73\xe7\xf3\xdc\xba\x92\x10\x92\x6b\x6d\xb3\x6d\x30\x11\x84\x7c\xd7\x22\xe5\xb6\x6e\x05\xd1\xe8\xf8\xe3\xcc\xe6\x84\x55\x4b\x0e\x6d\x98\x32\xfe\xc1\x13\xa6\xa0\x85\x7a\x16\x30\x03\x88\x22\x19\x9d\x86\x9b\xd2\xed\x26\x27\xc9\x68\x18\xe8\x21\x65\x53\xb7\x5c\x11\xfa\x2b\x94\x6e\xd7\x80\x86\x1b\x6d\x43\xb6\x83\x00\xc4\xd8\xde\x16\xec\xe1\xa2\x2d\xac\x74\x23\x78\xb5\xe3\x24\x50\x0f\x28\xe3\x8e\xeb\xc9\xe0\x68\x38\x38\xb2\x03\xe1\x44\x9c\xca\xf8\x76\xa4\x16\x5d\x96\x95\xce\x7d\xa9\x34\x1b\x0f\xde\x52\x67\x44\xd2\x5b\x74\xee\xb0\xaf\xa9\x93\x5a\xd2\x23\x71\x0a\xb7\x09\x2b\x13\x88\xd9\x12\x67\x8f\xde\xeb\xe5\x2e\x89\x79\xa7\xd9\x54\xc3\x42\x79\xac\x00\xc7\x0e\xbd\x53\x77\x9e\xff\xa6\x95\xe3\xcc\x60\xef\xcd\x5f\x21\xfc\x65\x04\xa1\xcf\xc9\x1c\x02\xd7\xe8\x4f\xa0\x46\x23\x09\x0d\x57\xe6\x73\xee\xc5\x04\xe0\xab\xe0\x60\xb3\xab\x3c\x56\x68\x10\x4e\x10\x6f\x3f\x0f\xf5\x21\x1c\x89\xcf\x9b\xef\x96\x2e\xf1\x5d\xb3\xb5\x0b\x10\xfb\xcb\x12\xea\xe8\x49\x8b\xb5\x1c\x2f\x81\x1b\x91\x94\xab\x27\x4e\x7f\xc0\xdf\x97\x95\x6b\xc4\xb2\x04\xea\x3d\xb4\x80\x42\x65\x69\x4d\xb3\x13\xb0\x05\xf7\x65\xbe\x2d\xc0\xee\xa6\xfe\x81\x5a\xec\xb1\x0e\x08\xb7\x72\xb3\xcd\x6b\xf7\x2f\x9c\x15\xa4\x94\xb9\x33\x6b\x93\xaa\x31\xea\x20\x04\x40\xe1\x6c\xa4\x78\xc8\x21\xe3\x9f\x20\x3d\xf6\x0c\x1f\x77\x08\xcf\x41\x54\xe4\x80\xc1\xeb\x3d\x4e\x7e\xc8\x55\x10\xf6\xe2\x7e\xcd\xb6\x63\xd0\xbc\x92\x17\x9f\x3a\x8b\x95\x44\x10\x4a\x4f\x89\xdd\xa8\xa2\xa1\x9d\xeb\xdf\xec\x61\x70\x94\x01\xaa\x26\xa6\x78\xf7\x32\x62\x0c\xf1\xbb\xc7\x6c\x07\x59\xcd\x67\x8b\x10\x0a\x72\x2a\x20\x85\x47\xd7\xdb\xba\xe9\x31\x4e\x20\x44\x1f\x77\xce\xae\x08\x16\xa4\xde\x92\xb3\xb1\x7d\x3e\xdb\x79\xfd\xa1\x23\x71\x0b\xe8\x1d\x43\x60\xb9\x55\xab\x94\x84\x92\xbd\x08\xaf\x6e\xbf\xd3\xcf\xfb\x75\x9f\x21\x96\x13\xce\xa6\x16\x65\x2e\x22\x10\x86\xf4\x49\xed\xc1\x88\xa9\x5b\xec\xd4\xa6\x36\xdb\xac\x2c\x76\x6b\xb8\x7b\x7d\x83\x83\x77\x9d\x81\xd9\x94\xca\x17\x24\x17\x54\xcf\x63\xf0\x1c\x41\xf8\x93\x43\x69\xe5\x46\xc3\xe5\x26\xb1\x1c\xe9\x7e\xe0\xfe\xb1\xf7\x8d\xcf\x06\xc4\x12\xb4\x90\xa3\xd8\xf9\x10\x7c\xe7\xe6\x1a\xc0\x67\xef\x76\x1b\x53\xe5\xb6\xf8\xca\x5f\xe9\x33\x65\xa5\x08\xf3\x13\xba\x53\x9b\x4a\x2f\x1b\xcc\x38\x79\xd7\xd6\xb1\x38\x3b\xdd\x4d\x1e\x6c\x3a\xde\x88\xfb\xd7\x97\xb6\x20\xc1\xf2\x2f\x23\xb4\x44\xcf\x96\xb0\xee\x40\x04\x46\x2d\x9f\x89\x96\xf7\xca\x86\xe7\xdc\x99\x18\xa2\x0d\x58\xc1\x00\xd8\x59\xae\x48\x3b\x31\x7d\xd3\xd7\x6b\xa5\xc6\x37\x0c\x6b\x97\xb5\x6e\x6c\x4d\x00\x17\x42\x61\xec\xea\x0f\xfb\xb7\x31\x06\x99\xc9\x39\xe5\x4c\xbd\xed\x3a\x41\xaf\x10\x13\x14\x14\xd0\x67\x1f\x67\x7e\x42\x70\xa0\xf5\xe2\x73\x8b\x6c\xc3\x7a\x9c\x68\xba\x29\xf7\xf5\x7c\x41\x45\x9c\x19\x92\xfe\xf6\x6d\x2e\x28\x06\x44\xe0\x4a\x89\xc4\xcc\xcc\x39\x94\xe9\x22\x13\x5e\xa3\x8b\x74\xbc\xda\x7f\x72\x83\x5c\x53\x95\x59\x97\xf7\x11\x41\x9d\xcc\xf8\x95\x09\x35\x5d\x4d\xed\x59\x3b\x3d\x36\xed\x23\x81\xdc\x71\xa7\xb8\x5f\x79\xb7\x8b\xfb\x72\x37\x84\x1c\x02\xc6\xd0\x7d\x8c\x15\x98\x7b\x6c\xdf\xc3\x25\xd3\x50\xba\xfe\x1a\xa7\x12\xb4\xa8\x28\xf6\x6d\x42\x79\xc5\xbd\x46\x9f\xdd\x7e\xbf\x2b\xbc\xf1\xb9\x1b\x47\xf7\x1e\x06\x3c\x19\x8f\x79\x6e\xbf\x33\xae\xf3\x36\x5c\x7f\xab\x47\x9c\x47\x91\x39\x7c\x32\x90\xce\xbf\x46\x32\x14\x99\x6f\x94\x27\x03\x19\x95\x7b\xfc\x5f\xa0\xa1\x54\x4a\x33\x21\x0e\x30\x12\x51\xfd\x8d\xbf\x9d\xa2\x8a\x39\xe3\x7d\xbe\x4f\xba\xe3\x82\xce\x4f\x22\xd0\xa3\xff\x3e\xa3\x55\xdf\x8a\x6f\x1e\x72\x39\xfc\x8f\xa3\x53\x0d\x19\x6c\x8f\xc6\xc9\x1b\xd6\x95\xfe\xba\x0f\xa8\x23\xd6\x9c\x6d\x53\x4b\x87\x33\xf7\x0e\xca\x06\xda\xbb\x53\x4a\xe7\x65\x1a\x8e\xa8\x74\xc8\x3d\x2e\x00\x79\xe6\xfe\xf6\xd5\x82\xfd\xfc\x98\x53\x32\xf2\xb5\xbc\x46\x85\x87\x4a\xa2\xa3\xfa\x87\xca\x60\x9c\x03\xf6\x73\x37\x66\xde\x67\x1e\xf7\xa4\xa3\xb4\x8e\x11\x25\xe0\x3e\x95\x36\x20\x4f\xf0\x8f\x98\xdf\x14\x5d\xf9\x9f\x43\x59\x42\xec\x52\x45\xc8\x6d\x2e\x56\x0d\x07\xed\xa6\x40\x18\x55\x9f\x39\x54\x9b\x8d\xae\x34\xe0\xc1\x32\xe7\x80\x8f\xd8\x08\x69\xfb\x2c\x13\x10\x41\x42\xf7\xdd\xf7\xf5\xb1\x25\xa0\x83\xfa\xd8\x47\xa7\xf0\x6c\x62\x05\x47\x51\xb6\x50\x1f\x6a\x01\xfb\x40\x7c\x52\x1e\xe6\xad\x05\x35\xd0\xe3\x51\x67\x53\xa8\x8d\xe0\x96\x48\xfc\x36\x36\x84\x5b\x09\xd2\xfd\x59\x2c\x71\x57\x00\xdf\x01\x78\xe3\x97\x77\xba\x68\x3c\xee\xc6\xca\x36\x85\x9b\x63\xc8\xe4\x95\x48\x60\x24\x2c\x30\x0a\x21\x79\x04\x12\x99\xd5\x91\xa3\x49\xea\x2d\xf4\xcc\xac\xcc\xd2\x9d\x68\xbd\x5c\x6e\x2b\xb0\xe0\x39\x6d\x13\xa6\x0a\x29\xbd\xc4\x07\x90\xf8\x35\x8c\xbf\xac\x60\x1b\x7b\xef\xaf\x53\x1a\xcb\x7b\x53\x61\x5e\x28\x4a\xfc\xa0\x48\xd6\xb1\x26\x19\xc0\xe7\xd1\x4d\xed\xce\xeb\x6a\x8b\xc7\xd2\x87\x29\x90\x1c\x28\x6c\x4c\xf6\xa6\xc9\xab\x40\x38\x44\xf6\x19\xc8\xb6\x70\x5b\x00\x6f\x42\x84\x89\x95\x9b\x6b\x61\xa0\xdc\x05\x75\x12\x27\x22\x08\x5b\x13\xa3\x74\xcd\x9d\x71\x56\xe9\xd1\x13\x79\x48\x85\xb9\xcd\xed\xad\x9b\xa9\x41\x9c\x40\xe7\x19\x71\x89\x9e\x88\xd2\x7b\x13\xc1\x58\x64\x8b\x25\x58\x33\xee\xa7\xcb\xb2\x20\x78\x34\x78\x68\xb3\x2d\x2c\x16\x6e\x98\x6f\x66\xbd\xc9\xb5\xdc\x5a\x80\xcc\xe2\x71\x58\x12\x5f\x68\x0f\x4f\xb4\x20\x67\x18\x01\xa5\x4f\xa8\x94\x8f\xdf\xa6\xcc\xd7\xbb\xea\x66\x49\x00\x48\x9d\xce\x10\x28\xef\x11\x96\xde\x67\x74\x94\x37\x8c\x96\xc9\x35\x6e\xd7\x06\xd4\xe1\xfa\x79\xfb\x45\xbc\xff\xd8\x7e\xa1\xca\xdd\x7d\x96\x0e\x88\x8f\x7d\x5d\xf1\x5e\x3a\x64\x2c\xf6\xd0\x00\x32\xc7\x56\x26\x4c\x62\xa2\xd5\x3e\x51\xb7\x2e\xdd\x4d\x46\x49\x70\x7a\xb3\xa9\xca\x6f\x76\x4d\xb0\x1b\x1e\x56\x5b\x76\x14\xd8\x7c\xb5\xbd\xc7\x3e\x47\xf5\x5a\x1d\xe1\xfe\x06\x84\xfb\xdc\x50\xf1\x9d\x04\x58\x0e\xc2\x7b\xde\xb3\x2b\x38\x67\x89\x35\xa8\x10\xbf\x7a\x22\xc3\xd3\x9b\x44\x6e\x3d\x53\xe5\xc9\xae\xe9\x02\x5e\x69\x9b\xb7\x63\x69\xfb\xe2\xb3\x94\xd2\xf8\x54\xd2\xcc\x3e\xd8\x67\x21\x1a\x70\x73\x85\xaf\xc9\xfa\x8b\xee\x95\xe2\xf6\xb6\xff\x66\x9b\x44\xed\xcd\x91\x1e\x80\x51\x53\x19\x5b\xd4\x80\x8f\xf2\x36\xf2\xac\xc4\xb1\x0a\x2d\x15\x08\x6c\xf0\xde\x96\xb9\xa7\xc0\x59\x6e\xc1\xbb\x1c\x1c\xbf\x8d\xff\x69\x1b\x72\x9a\x53\xae\x59\xd0\x7a\xbb\xc4\x7f\xf0\x9d\x2a\xab\xc8\x4a\x84\xcc\x61\xba\xa8\x42\x87\x21\x61\xa1\x9d\x84\x4b\xef\x3d\x5b\xb3\x79\x73\xb4\x18\x88\xc0\x29\x81\xdb\x04\xc7\x9b\x14\x16\xee\x20\x82\x66\x08\x34\xd3\xe6\xab\xb3\xad\x4c\xc6\xdb\x0b\x06\xe5\xc7\xf0\x8c\xa4\xd3\xc7\xfb\xd8\x6a\x17\x8a\xab\x30\xfe\xd2\xbf\xda\x54\x6d\x43\xfa\x4a\x7f\xf8\xa5\x52\x75\x53\x6e\x44\x36\xcd\xfe\x44\xf3\x86\x10\x90\xd7\x46\x78\xba\x7d\xc0\x05\xee\x1f\xf0\x5e\xfb\x3d\xfb\xc8\x58\xb3\x34\xc0\x5d\x9e\x24\xea\x47\x66\x09\x70\xc7\xee\x67\x8f\x1b\xde\x87\xcf\xfd\x84\xd5\xf6\x13\x88\x05\x8c\x20\xcc\x7d\xfc\xeb\xac\xcf\x83\x18\x45\x62\x03\xbc\x89\xac\x82\xf8\xde\x68\x56\xc8\x3b\x42\xfb\xd9\xc9\x85\x2d\x2a\x90\xc1\xd9\x09\x9e\xfe\x4c\x26\x4d\xbb\x56\x30\x67\x7d\x8d\x5c\x3d\xa1\x36\xcf\x16\xb7\x54\xf1\x1a\xf0\x87\x42\x3d\x6d\xff\x4a\x41\x55\x5b\xa3\x1b\xcf\xfb\x8a\xe0\x25\xbc\x0f\x3c\x18\x9a\x2d\x32\xb3\x31\x45\x26\x82\x5e\xdf\x1b\x32\x94\x53\xff\x33\x4c\xfd\x98\xaf\x8a\xb6\x2c\x7e\xf2\xfc\xed\x49\x5d\xc0\x4d\x11\xad\x8f\xbc\x8e\x9a\xd2\x19\xae\x68\xb5\xc2\xb5\x96\xf8\xd8\x5f\x22\xe2\x92\x51\xc8\x11\xd6\xf5\xd1\xa8\x19\x31\x43\x02\xd5\xba\x7e\x70\xf7\xf1\x0e\xcb\x91\x32\x13\x90\xc3\xbb\x19\x6e\x7b\xf7\xfb\x63\x4a\xdc\x3e\x7c\xaf\x6e\x2e\x05\x61\x21\xb7\x20\xbe\xac\xc0\xf0\x69\x87\x93\x09\x90\x8a\x49\x88\x6d\x21\x49\x88\xa3\x10\x11\xd3\x5d\x88\x4f\xfb\x4a\xbc\xd0\x37\x22\xf8\x17\x00\x62\x71\xfb\xb5\x41\xc0\xb8\x40\x80\xd1\x36\xf4\x68\xf2\x50\xac\xf2\x1e\xf6\x8d\x7a\xf5\xaa\xf1\x70\x61\x81\xac\xa4\x3f\x1f\x65\x09\xb1\x58\xbc\xc5\xc5\x61\xdc\x37\x8d\x0f\x54\x09\x07\x7a\x46\x46\xbc\x1b\x70\x79\x6f\x2b\x23\xee\x6f\x50\x58\x39\xeb\x77\xcf\x19\x86\xa2\xa9\xfe\xdb\x26\xfb\x2b\x23\xc2\x9d\x6a\x26\xa1\xaa\xb9\x3b\x2f\xe1\x58\x13\xe8\x48\x09\x6d\x1d\x7b\x6f\x73\x73\x4b\xca\x9d\x05\x19\x04\xba\x5e\xec\x5f\x6a\xc7\x6f\xbf\x94\x5b\x19\x2c\xf2\xa9\x06\x3e\x8d\x8f\x48\xbc\xc9\x8a\x8c\x21\xc5\x44\x32\x4a\xda\x2d\x70\xf7\x08\x09\x88\xc6\xd5\x94\xe0\x15\x69\x15\x95\xc2\x14\xb9\x0d\xc1\x92\x2e\xe9\x83\x2a\xd8\x21\x97\x0b\xb8\x47\x61\x24\x54\xa5\xda\xf3\x41\xdc\xc7\xec\xc4\x6e\x3c\x00\x73\xcd\xd5\x44\x58\x27\x00\xca\x42\xb1\x34\xb5\xdf\x0c\x5c\x96\x45\xbe\xf7\x43\xbf\x9a\x87\x94\xe2\xf4\xcd\x4b\xc8\x27\x6b\xf9\xe1\x9c\x32\xec\x4c\x9c\x4a\x9a\x95\x00\x70\x27\x2a\x8a\xce\x5e\xf2\xb6\x38\xc7\xdf\x9d\x9b\xcc\xb3\xed\x11\x60\x16\x2b\xaa\x1c\xe0\x25\xab\x18\x83\xdd\xf8\x34\x57\x4f\xae\x65\x09\xcf\x9d\xae\x04\xc0\xf6\x13\xfd\x56\xc8\x26\x19\xec\xbb\x00\xaa\x45\x3b\xbc\xfb\x81\x32\xb7\x4b\xb7\xcb\x02\xce\x35\xc3\x12\xb4\x8a\x21\xf9\xc9\x9e\xf5\x0d\x7a\x16\xa7\xf5\x40\x63\x42\x38\x87\x30\x73\x17\x8a\x43\x45\xa5\x0c\x11\xf7\x44\x5e\xde\x96\xbd\xa0\x1a\x2c\x81\x60\xff\x44\xe4\x0f\x74\xe4\x9f\x2a\xcd\xe9\xc9\xab\x86\xfb\xa4\x10\x99\x49\x71\xca\x12\xf3\x2d\xf6\x6f\xda\x68\x0c\xdf\xa3\x07\x08\x8f\x0e\xcd\x57\xa7\xfa\xf7\x19\xd7\xae\xd3\x0a\x6e\x2b\xbd\xb9\x0b\x6b\x11\x21\x28\x34\x1d\x24\x87\xba\xe7\xc0\x87\x84\x96\x46\x43\xa6\x49\xff\x56\x48\xff\x31\xe8\x45\xe9\x0f\xef\x67\xe7\xc7\xaf\x8e\xcf\x72\xbd\xad\xcd\xff\x09\xfc\x9f\x97\xa7\x3f\x9d\xfc\xd8\xc6\xff\xf9\xe9\xe4\xa7\x7f\xe1\xff\xfc\x33\xfe\xc4\xa8\x64\xff\x75\x67\x74\xf5\xdf\xd5\x7f\x05\x82\x96\xff\xae\x22\x7a\x95\x40\x8e\x12\xd3\x32\x22\x24\x46\x2d\x29\x0c\xdd\x4f\x16\xb6\x20\x8c\x81\x35\xe3\xcf\x51\x44\xdf\x49\x85\x18\xc0\x17\xd2\x87\xbc\xd4\xec\x92\xa7\xf5\x25\x34\x20\xd2\xa1\xc1\x5c\x83\x93\x0e\x57\x24\x62\xbb\x05\x22\x3b\x0a\xdf\xf9\x34\x04\x74\xd3\xb4\xc3\xea\xde\x5f\x54\xc3\x01\x96\xad\x51\xa5\x72\xe8\x4a\xf0\xbe\x30\xf5\x74\xbb\x0b\xb6\x90\xb3\xc0\x5d\xe0\x34\xed\xbf\x77\x2f\x38\x5b\x3c\xa6\x65\x8c\x32\xb0\x58\xb6\x89\xa4\x32\x1f\x27\x91\x5d\x67\xfe\xcd\x89\xb1\x94\xe3\x62\x3c\x60\x1e\xc6\x41\xb8\xc3\x08\x98\x03\x39\x60\xfc\x50\xcd\xd2\x5a\x50\xab\x78\x29\x07\x89\x33\x8d\x4f\x00\x0c\x1c\x44\x66\x2f\xfd\x90\xbb\x90\x19\xa4\x8f\xb7\x0f\xf3\xf1\xef\xe5\x20\x4a\x0f\x00\xec\xdc\xd3\x04\x48\xfe\x85\xf7\x5f\x00\x3a\xfc\x6c\x7a\xf5\xe5\x7a\xfc\xf1\xd3\x5c\x7d\x9a\x5e\x9c\x8f\xae\x3d\x56\xe1\xfc\x7a\xfc\xfe\x66\x3e\xbd\x9e\x79\x10\x45\x00\x6d\x9f\x7c\xf1\xe0\x89\xd3\xeb\x1e\xa8\xc3\x08\x21\xf1\xfd\xcd\x1c\x60\xc3\x01\x21\x71\x74\xae\xe6\xd3\x04\x1a\xed\x41\x48\xec\x42\x22\x42\x7b\x4f\xe1\x1f\xb6\xb8\x20\x52\x35\x9e\xa8\xc9\x14\x30\xe3\xe7\x04\xe6\xde\x37\x4a\xc2\x42\x0f\x63\x7c\x0e\xea\xbe\x04\xdb\xf7\x08\xfc\xa3\x3f\x8c\x2e\xaf\x2e\x86\xd7\x5f\x1e\x01\xe0\x3f\x7a\x62\x4a\xae\xae\xa7\x67\x37\xd7\x80\xdc\x88\x70\xf5\xef\x67\xf3\xf1\xfc\x66\x3e\x02\xd8\x7d\x98\x68\xe4\x66\x18\xcd\xde\x79\xc0\xfd\x9b\xd9\x28\x21\xd4\xfd\xe9\xb5\xfb\xc4\x87\xf1\x7c\xf6\xce\xfd\xfd\xfd\xcd\x6c\x0c\x93\x36\x9e\xcc\x47\xd7\xd7\x37\x57\xf3\xf1\x74\x32\x50\x9f\xa6\x9f\x47\xbf\x8e\xae\xd5\xd9\xf0\x66\x36\x3a\x87\xd9\x9d\x22\x4d\x04\xd2\x1f\x44\x40\xf8\x81\x0b\x61\x3c\x11\x44\x06\x6d\x96\x03\x68\xbb\xc5\x96\xd0\x22\x46\xf0\xc4\x07\x03\x35\xbc\x1e\xcf\xdc\x03\xc4\x4e\xf1\x79\xf8\x45\x4d\x6f\xe6\x0c\xda\x4f\xc4\x10\xd1\x8e\x0d\xe8\xff\xc3\xf3\x5f\xc7\xb3\xe7\x20\xfc\xff\x55\x1a\x42\xfa\x43\x66\x36\x95\x01\x9d\xfb\x4f\x1f\x3f\x9c\x5f\x1c\x9f\xa4\xaf\xfe\xce\x6a\xc0\xe3\xf7\xff\x8f\xaf\x7f\xfc\xa9\x8d\xff\xf7\xfa\xe4\xf5\xc9\xbf\xee\xff\x7f\xc6\x9f\x8f\x93\x1b\x04\xfc\x3d\x8f\xae\x0d\xc6\x48\x09\x90\xbf\xaf\x12\xf5\x4a\x4d\xca\x7b\xae\xc0\x7e\xf9\xf3\x81\xd0\x1d\xce\x06\xee\x47\x2f\x13\xf7\xdf\x13\xf8\xef\x29\xfc\xf7\x27\xf8\xef\xcf\x2d\x4c\xe1\x0f\xe5\xb6\xc8\xe8\xee\x07\x98\xd2\xff\x4a\xc8\xb8\xab\x7a\x05\x66\xcf\x7f\x3f\x80\x32\x00\x67\xaf\x5a\x89\x52\x4c\x38\x00\x31\xc8\x3f\x70\xd2\x2e\x74\x63\xd7\xee\x97\x56\x14\x47\xe4\xde\x21\x86\x63\xc3\x1c\x5d\x28\xe2\x44\xe0\xad\x56\x04\x09\xee\xbd\x97\xa9\xba\xba\x1e\x0d\x2f\xdf\x5f\x8c\xdc\x3f\x81\x27\x3e\xd8\x8d\x6d\xfc\x78\xf6\xff\x40\x60\x67\xab\xf3\x04\x4c\xde\x45\x59\x7e\x15\x51\xb9\xc0\x7a\xc5\xca\xd2\x6a\x9b\xfb\x5e\xa9\xc3\x55\x65\xcc\x21\xdf\xdf\xb5\x21\x22\x5a\xf7\xd3\xac\x5c\xbf\xa5\xac\xe6\x6d\x65\x90\xf6\xd9\xcd\x0a\xb8\x7e\x7c\xbe\x3f\x3d\x19\x4d\x8f\xa0\x2f\x36\xca\x36\x7b\x54\x30\x02\x20\x4b\x14\xdd\xf4\xa1\x3c\x18\xf3\x79\x8b\xb2\x90\x3f\x02\xdf\x73\x59\x64\x50\x6c\x9c\xc4\x93\xb1\xf1\xa9\xb6\x3e\xc3\x06\xac\x3a\xe8\x0d\x1b\xba\xce\x9e\x7e\xd0\x88\xc0\x64\xc0\xce\xc9\xac\xb7\xd3\x6d\x45\xe5\xea\x0f\x77\x36\x37\xe4\xb2\x94\x50\x77\x80\xa6\x11\xa3\x93\xc7\xe6\x22\xd3\x35\x60\x22\x67\x8a\xeb\xd7\x26\x7e\x65\xea\xb6\x43\x37\x57\xb9\x59\x35\x87\x5c\x5c\xce\x65\x8f\xba\x41\x25\x04\x0d\x35\x0f\xf9\x27\xb5\x2b\xd4\xe6\x9a\x3b\xb3\xae\x4d\x7e\x8f\x90\x4b\x6e\x19\xfc\x2a\x3a\x75\xa9\xc6\xa2\xc7\x31\x65\xa5\x90\xf1\xe9\x7e\xed\x8e\x1d\xa4\xc3\x74\x20\x7d\xb8\x2f\xb6\xa6\xb4\x4f\xd7\xc3\xb0\x93\x21\x53\x94\xea\xbb\xa1\x3d\xd6\x8d\x30\xa7\xca\x60\x4c\xc5\x3f\x16\x6f\x57\x41\x9a\x4c\xb4\x5e\x30\x85\xb0\x71\xeb\xee\x27\x03\x06\x58\xf4\x63\xa8\x7d\xab\xf1\x67\x91\xb2\xf9\x56\x69\xfc\xe9\xa6\x2a\x6f\x2b\xbd\xf6\x28\x72\xe5\x9a\x40\x45\xb8\xa9\x90\xcd\xe7\xe7\x8a\xf6\xb0\x40\x5d\xf7\xed\x39\xeb\x3a\x55\xef\xb7\x5d\x16\x5f\xcc\x99\xf7\x68\x00\xfe\x0d\x6a\xe7\x9d\x1b\xe2\x52\x17\x5e\xf3\xe4\xd0\xbb\x3b\xa3\x5b\x0f\x0b\x13\x73\xfe\xb6\x90\xfa\xdd\x89\xa1\xec\x06\x94\x17\xc2\x67\xe3\x96\x68\x53\x59\x64\xda\x2d\xcb\xaf\xa9\x5b\x80\xca\x20\xf3\x7a\xd6\x3e\x1e\xb6\x58\xda\x0d\x1c\x2c\xd7\x0d\xdc\x55\x0f\xe0\x56\x63\xf9\x02\x59\x21\x75\x53\x6d\xbd\xa7\x10\x72\x70\x4d\xb1\x24\xd6\x8c\xd4\xd3\xe7\x04\x45\xf1\x7c\xf4\x61\x3c\x41\x78\xed\xce\x7e\x17\x28\x13\x88\xde\x57\x50\x21\x2f\xca\x25\x1c\x3e\x25\x81\x72\x96\x27\x39\xf0\x01\xcd\xbc\x0e\x29\xc1\x90\x98\xe4\x5d\x5a\x1d\x0b\xa0\xd6\x24\x4a\x78\xbe\x25\x24\x79\x2f\x79\x9c\x44\xc0\x9f\x41\x3d\x0a\x37\x45\x59\x77\x54\x6e\x7b\xdc\xad\xb7\x0d\x4c\x75\xdb\x82\x97\xdf\x16\x9e\xcf\x2e\x09\xa1\x5c\xdd\xc0\x20\x45\x0f\x84\x35\x15\x45\x7a\x30\xaa\x75\xc8\xd7\xe0\x61\x82\xa0\x5f\x89\x48\x83\xf6\x35\x25\x61\x1e\xdd\xc7\x31\x0c\x85\x55\xed\x2d\xb7\x0f\x11\x4d\x43\x67\x39\xed\xb7\x56\x3a\xcb\x2a\x53\xd7\xb8\x83\x0e\x77\xe5\xf6\x30\x95\xc8\x62\x8d\x40\xfc\xb1\x2b\x00\x63\x73\xd3\x9d\x30\x6f\x1d\xe6\xd5\x48\xc6\x76\x18\x22\x64\x17\x3c\x00\xb5\xf4\x5e\x2c\xa6\xb0\x6c\xb9\x7e\x80\x2d\x35\x54\x87\x97\x9c\x3c\x4d\x97\xfd\x21\x0f\xe2\xdc\xcb\x3a\x90\x8b\xc0\xa4\xe9\x5a\x92\x5c\xe8\xf2\x31\x4c\x42\x0a\x29\x73\xd1\xbd\xb2\x71\x2d\xf0\x45\x9d\xf0\x45\xd4\xae\x50\x44\x6b\x35\x60\x53\x31\x53\x08\x65\xb7\x10\x0f\x03\xf7\x9c\x2f\x23\x9f\x6e\x7b\x88\x33\xee\xcc\xd0\x0c\xa0\xc4\x8b\xcc\x7e\xc3\x7e\xad\xaa\xb2\x68\x8e\xe9\x50\xd7\x26\xa2\xf7\xf0\x23\x20\xd1\xef\x44\x94\xe4\xd2\xf0\x46\xb2\x44\x07\x8e\x96\xba\x86\xc2\x01\xef\xda\xaf\xbb\x5f\x2e\xa3\x7f\xbf\xa8\x15\xe4\x45\xe5\x01\x04\xe3\x08\x0b\x92\x18\xf2\x08\x7b\x5a\x0f\x7c\xba\x35\x1c\xc7\x82\x22\x23\x22\xca\xb6\x72\x1f\xf1\x35\x38\x94\x1f\x00\xbf\x6f\xb5\x90\xaa\xa3\xf9\xdd\x16\xe1\xd6\xa3\xbe\x81\xd8\x41\xaf\xa5\xf6\xea\x0b\xa0\x63\x68\x77\xc1\xe9\x06\xf0\xe4\xb5\xea\x4c\xb7\xcf\xa6\x31\xdf\x36\xb9\x66\x39\x12\x5e\x4a\x07\x70\xa8\xa2\x59\xc3\x4e\x2f\x50\x63\x42\x09\xbb\x52\x77\xb6\x6e\xca\x0a\xaa\x15\xfb\x80\x37\x3c\x7b\x44\xc5\xe4\xca\xd1\x1c\xa1\xa6\xb5\xc2\xe8\x4b\x22\x74\x98\x44\x6d\xee\x6c\x5e\xd6\xe5\xe6\xce\x7d\x3b\x51\xa6\x81\xbf\x80\xdb\xa1\xcc\x2d\x44\xfb\x94\xe7\x2c\x8d\xa2\xc3\xeb\x94\xb5\xbf\xc3\x71\x71\xaf\x2b\xab\x8b\xc6\x47\xde\x0f\xc1\xfb\xc4\xc8\x93\x9d\x79\x61\xb9\x0e\x69\x7b\x4c\xd6\xc4\x25\x1e\x00\xd8\x80\x7a\x0d\x06\x55\x80\x7d\xb5\xdd\x82\x07\x61\x92\x15\x19\xb5\xc7\xd0\x68\xaf\x1f\xd1\x14\xf4\xf2\x54\x02\x0f\x92\xdf\xf2\xc1\x55\x6d\x1b\xe1\x83\xca\x3c\x96\x9d\x42\x42\x4d\x1a\x11\xa4\xdc\x74\x14\x65\xc2\x3c\x14\x85\x32\xba\x0e\x83\x40\x51\x1a\xa4\x87\xde\xf1\x06\x56\xff\x69\xaa\xb2\x67\xb4\x3e\x5e\xea\x5f\xf2\xdd\xa4\xaa\x1e\xcc\x28\xe8\xbe\xe9\x93\x8f\x89\x80\xb9\x28\x0b\x13\x56\x0e\x58\xb8\xd4\xdc\x7c\x6b\x5a\x4b\x56\xdf\x95\x55\xa3\x36\xba\xae\x21\x25\x0e\xe0\xa2\xbf\xd1\xf9\x47\x88\xa1\x9a\x97\xea\x03\x08\x0e\xf1\x25\xb7\x7b\xde\xeb\xe5\x57\xf9\xb3\xbf\xe7\x72\x0d\x3b\x4d\xb2\xf7\x4c\x37\x98\x19\xf6\xa3\x93\xc3\x19\x95\x62\xe8\x76\x67\xda\x4f\x9f\xd2\xe3\x2c\x35\xe7\x4e\xba\x6e\x74\xe5\x6e\xb9\x88\x17\xa5\x2d\xef\xd5\x5a\x2f\xef\x6c\x61\x8e\x2b\xa3\x33\x48\x87\xc4\x7b\xc8\x67\xce\x72\x4e\x1b\x96\x40\xd0\xa6\x67\xdf\x9c\x4f\x67\xea\xc0\xc3\xdc\x92\xe2\x8b\x97\x64\xe2\x91\x0e\xeb\xad\x6d\x34\x2b\xf6\x40\xb6\xcb\x57\x8c\xd7\xba\xeb\xa6\xd2\xee\xfe\x5a\x95\xd5\x83\xd3\xd9\x48\x36\xc3\x17\xed\x12\x17\xd1\x99\x14\x25\x4a\xe3\x23\x40\xc4\xc6\xb4\x47\xa7\x82\x97\x94\x95\xb8\xb1\xdf\x4c\x5e\x0f\xfc\x7b\x1b\x6d\x8b\x86\xd5\xd6\xf0\x66\x56\xe9\x07\x5b\xdc\xd6\x03\x55\xa3\x0a\x9b\x41\x3e\x9e\x1f\x0f\xfd\x9e\x5a\x4c\x02\x78\x54\x7b\x30\xb6\xd8\x6c\xf1\x0e\x70\x1d\xc4\xe9\x6a\xe8\xc6\x58\xe1\xad\x81\xc9\x07\xfe\xea\xe3\x5a\x66\x60\x14\x37\x18\xd9\x67\xa0\x85\x67\x7d\xda\xed\x23\x58\x5c\xb0\x89\xb0\xf2\x29\xc4\x28\xc5\x1e\x40\x5e\x9d\x68\x09\xd7\xba\xfa\xba\xdd\x24\xad\x64\x5f\xfe\x69\x48\xf3\x24\xb4\x48\x5c\xd7\x07\x8d\x45\xd7\x90\x8a\x06\xa8\xb1\x92\xd9\x57\xde\xf3\x4e\x89\x74\x5b\xca\x4d\x00\xc9\x15\xd1\x1f\xa7\x4e\xe1\x9a\x71\xa7\xba\xcf\xb8\x2b\x2c\x52\xe8\x65\xd2\xbe\x5e\x97\x5b\xca\xcb\x31\xdf\x1a\x3f\x0f\xbc\x30\xee\x53\xf1\x19\xb0\xb5\x5a\xea\x3c\x37\x99\x3a\x9c\x6e\xf4\x5f\xb6\xe6\x10\x8e\xca\x08\xab\x95\xc8\x28\x08\x53\x0e\x6b\xe0\x1a\x96\x1d\x22\xcf\x03\xe7\xdc\xe3\x75\x38\x9c\x9d\x8d\xc7\xc1\xe0\xa6\xf9\x9b\x9b\x6f\xb6\x58\x95\xb4\x72\xf8\xc1\x44\x5d\xe8\xb9\xf9\x43\xeb\x67\xb3\x8f\x97\x17\x6e\x4a\xff\x70\x79\x41\x38\xd3\x9a\x0e\x4d\xb4\x0d\xcf\xe7\xe7\x94\xea\x43\x10\xf8\xc7\xcb\x12\xca\x92\x20\xc1\xcc\xba\x41\xa8\x4f\xf3\xcb\x8b\x44\x5d\x95\x75\x33\x5b\x56\x76\x03\x2b\x75\x75\xfe\x21\x36\x28\xef\xb6\x6b\x5d\x44\x4b\x95\x46\xb3\xd0\xc8\x15\x10\x2b\x14\xc6\x7d\x35\xf9\x98\xa8\x3f\x9c\x7d\x80\xee\xfc\xfe\xea\x63\xaa\x70\x46\x3b\x0f\x6e\xaa\x72\xe3\x36\x36\x47\x47\x34\xd7\xf4\x90\xf9\xe0\xc1\xd6\xdd\xd9\x82\x52\xb4\x7c\x47\x75\x60\xfe\x3d\x27\xd5\x38\xd9\x02\xd2\xd0\xe5\x7c\x81\x8d\xe5\x71\xed\xce\xe7\xe7\xac\x5c\xd2\x0b\x48\x0e\x57\xe6\x21\xed\x9c\xc4\x92\x9c\xda\x80\x50\xcb\xa2\x10\x1f\x72\x3d\xda\x37\xa3\x1e\x28\x74\xb1\x23\xb1\x11\x77\x13\x81\xd0\xb6\x8d\x5b\xe8\x2e\xfe\x0d\x5c\x5b\x73\xa0\x73\xbc\xd2\xb7\xe6\x90\x8b\xee\x28\xc3\x5f\x18\x9b\x98\xd7\x88\xcc\x8f\x1b\xb7\x16\xb6\xa9\x4d\xbe\x4a\xd4\x26\xdf\x12\x57\x64\x08\x13\x6d\x30\xf3\x9b\x06\x0b\xc0\x51\x88\x67\x99\x67\x89\xd3\x9b\xec\x22\x27\x98\x82\x00\x5d\x16\xf3\x31\x12\x38\x19\xe6\x92\x08\x8a\x9e\xd0\x01\x8c\x98\xa3\x5d\x6b\x0b\x01\x0b\xe3\x16\x81\x60\x73\xc0\x3b\x81\xc9\x90\xbe\xdf\xc4\x6c\x99\xf4\x8c\x3b\x14\x47\x16\xae\x49\xe8\x9f\xbb\xd2\x36\x55\xb9\xb6\x05\x94\xd3\x43\x67\x04\xd6\x30\x74\xe0\x45\xcd\x25\x13\x9b\xca\x2c\x8d\xf7\x34\x2c\xcc\xad\x2d\x0a\x22\xdc\x84\x1f\x94\xd9\x2e\x64\xf0\x7d\x6b\xc2\x1a\x78\xb5\xfe\x50\x98\x3f\x1d\x8e\x7f\x34\x18\xbc\x35\x56\x47\x1e\xc8\xae\xfa\x8f\x87\x97\x2e\x62\xd6\xc8\x0e\x47\x05\x74\x36\x53\x7f\xf8\xf2\xef\xbe\x35\x32\x62\xea\xed\x62\x5b\xd8\xa6\xf3\x41\xa1\x60\xb2\x8d\x65\x6b\x18\xad\x85\xa4\xf1\x3f\x7c\xf9\x77\x4a\xea\x42\xc3\xc1\xfd\x1b\x95\x7c\x53\x00\xd0\x71\x2d\x76\x47\xd0\x7d\xbc\xe5\xe5\xdf\xe8\xd8\x5e\xea\xe8\x93\x53\xb6\xdc\xaf\x41\xde\x70\xf5\x89\x8f\xc9\xf1\xb8\x20\x62\xb8\x46\xde\x3e\xc6\xd0\x0e\xd0\x13\x87\xc3\xe5\xd7\xa2\x7c\xc8\x4d\x46\x39\x1b\x87\x89\x3a\x0c\x39\x3c\xf0\xcf\x51\x80\x09\x71\xff\x2e\x2b\x75\xf8\x09\x2c\x85\xdd\xa1\x33\x2d\x4a\x75\x78\x45\x4e\x47\x98\x1c\xd8\x3e\x87\xbe\xc4\x20\xe8\xbc\x50\xcc\xbf\xe3\x3a\xe1\x5d\x9f\xb2\x83\xb7\x43\x43\x99\x73\xb5\x78\xb9\xb5\x3c\x88\x93\x2b\xa9\x25\x83\xea\xec\x77\x4f\xa4\xfb\xb2\xc8\xfb\xcc\xa4\xb2\xe7\xa2\x02\xa6\x80\xa9\x2f\xa5\xee\x88\x07\x06\xd3\xc8\x59\x7d\xec\xf7\xe9\xc8\x71\x80\xd2\x5d\xef\x69\x45\x57\x71\xa6\x56\x89\x09\x73\x48\x86\x88\xd7\x31\xf9\x99\xda\xd4\xae\xe8\x32\x07\xe9\xab\x39\x7f\x36\x14\xe0\x40\x59\xa8\x2f\x90\x78\x2b\xb2\x71\xa0\x00\x6a\x29\x58\x15\x9b\xfd\xbd\xf3\xa9\xe0\xb6\x56\xf7\xa5\x45\xb9\xef\xb4\x8c\xa2\x64\x86\x54\x5f\x89\xac\xc3\xe9\x6d\x51\xca\x9e\xa6\xea\xd7\xd1\xf5\xfb\xe1\x7c\x7c\x09\x51\xcf\xf1\xe4\x23\x41\x2a\x90\x05\xd2\x8d\x1b\xc4\x6a\x79\xec\x06\x7b\x9e\x43\x3c\xe9\x64\x2b\xc8\xa9\x8b\x3d\x65\xb8\xbc\x02\xf5\x9c\x9d\x3c\xb4\xee\xe4\x42\x7b\xce\x62\xc3\x82\xfa\x54\x82\x8c\x31\xb9\x50\xf8\x08\x3d\x14\x80\xfc\x33\xc8\xd3\x24\xac\x8c\xe0\xfd\x7a\xb8\xd3\x4d\x5d\x02\xde\x13\x7c\xbd\x27\xc0\xd1\x43\xc4\x18\x50\xad\x02\xaa\x90\x2a\x17\xe8\xb4\x64\x89\x53\x95\x39\xb9\x4b\x90\x98\xcd\x69\xb9\xdb\x8a\x1d\x41\x3b\x21\x7f\x49\x5c\xc2\xd9\xd4\x5f\x4d\xec\xdb\x12\x95\x22\x3b\xea\x07\xb9\xc8\xda\x68\x9d\x1e\x7d\x14\x09\x4b\xdd\x37\xc1\xa4\x74\xaf\x89\xf5\xd6\x2a\xd7\xd5\xad\x51\xa6\x40\x12\x84\x2d\xbb\xec\x64\x37\xb6\x75\x83\x05\x02\x28\x1f\x7b\x8a\x48\x59\x32\xbc\x4a\xe5\x06\x83\x77\x72\x03\xde\x1a\x5c\x86\xe0\x74\x04\x0f\x77\xd7\xf3\x08\xa6\x37\x2e\x17\x0f\xd0\xab\x77\x04\xe1\xc9\xa3\xa1\x8c\x0c\xda\xd8\x6a\x3c\x51\xff\xe3\x66\x38\x99\x8f\xe7\x5f\xdc\x6f\x68\xa8\x74\x67\x79\x35\x81\x86\x75\xe4\x27\x05\x40\x3b\x00\xb8\x8d\x1c\x48\xeb\x35\x1c\x6d\x38\x7d\xe1\xad\x7b\x70\x3c\xb5\xae\x9c\x84\xe6\x0b\x71\xc5\xa0\xe6\x54\x17\xea\xe4\xe5\xcb\xb0\xa1\x85\x77\xab\xb5\xb7\xbd\xfe\x10\xd9\xcc\x7e\xbe\x4d\x01\xc5\x4e\x72\x4b\x40\xae\xe0\x3d\xd6\x78\x82\x5a\x58\x55\xbb\xc4\x13\xd2\x40\x29\x16\xab\x2d\x1a\xeb\xf7\x6a\x23\xbf\xfe\xb6\xcf\x70\x27\x08\x12\xf7\x0b\xfc\x3a\xf6\xbd\x6d\xcd\xf3\x83\x0b\xbd\xfc\x8a\xcf\xa5\xea\x7d\xd9\xdc\x71\x8f\xc2\x1e\xe9\xe9\x4f\xf0\x58\xc0\xe9\xab\x63\x27\x61\x60\x44\xe0\x6d\x3a\x8f\x7b\x84\x1f\x27\x03\x1b\xbb\xbb\x75\xe3\x83\x9b\x1e\x53\x26\xf3\x1c\x0d\x7a\xaf\xb8\xa0\x16\xf0\x17\x04\x42\x15\xba\x51\x91\x29\x67\x44\x43\x42\xba\xdf\xa6\x59\x87\xac\x8a\x46\x4b\x83\x73\xb2\x84\x0a\x37\x10\xcb\xdd\xd7\xfe\x33\xbb\x88\x88\xb8\x84\xf7\xc0\x57\x92\x97\xce\x46\x81\x21\xef\x7c\x40\x50\xf4\xb1\xad\xc5\x80\xd1\x12\x30\x1f\xa2\x6a\x83\x84\x4d\x81\x86\x98\x2a\x75\x1d\x05\x7a\x77\x94\x21\xce\x4c\x2c\x40\x4e\x82\x07\x65\xcc\x59\xf0\x84\xc7\xd0\xc0\xa2\x02\xbb\x0d\x4b\xf5\x7b\x83\xa8\x55\x4d\x59\x02\x1a\xd1\xda\x16\xe5\x16\x84\xd9\xca\x36\x61\x6b\xb9\x25\xa4\x28\x16\x98\xd9\x6e\x39\x80\xae\xb3\x2c\x4c\x4d\x5e\x22\x75\xa4\xdd\x1d\x56\xc0\x0d\xb9\xb2\x12\xda\x61\xc0\x73\xab\x97\x0d\x56\xb4\xfb\x3d\xe7\xe4\xa4\x2d\xb6\x86\x7a\x0a\x9f\x74\xca\x75\xf6\x67\xbd\x84\x32\x07\x28\x81\xec\x39\xdc\xb1\xfb\x9f\xcc\xab\x3d\x6a\xe7\xde\x13\x1b\x4e\x1e\xe9\x8e\x8c\x1e\xd0\xf5\xf9\xb4\xac\x5c\x27\xe8\x4a\xde\x11\x46\x2f\xef\x44\x17\xb0\x12\x15\x84\x1b\x06\x1b\xfb\x9f\x82\xc0\x26\x12\xdc\x1f\x17\xa6\x81\x98\x42\x5e\x92\xb2\x00\x59\x5f\xc1\x70\x63\x5f\x11\x3d\x77\x8c\x66\x30\x85\x57\x00\x48\x96\x30\x83\x11\x75\x2f\x2f\x75\xa6\xe4\x33\xc7\x9e\x16\x8e\x5b\xda\x54\x65\x53\x2e\xc1\xf0\x0b\xbc\xf2\x9d\x41\x76\x84\x1f\xc4\x9d\xca\x95\x3b\x1b\x51\x96\x30\xad\x8e\x67\x6e\x22\x9f\xf6\x06\x03\x51\x7e\x9e\x1b\x77\xbb\x45\x98\x1f\xdb\x0c\x1d\x5a\x66\x83\x05\xd4\xa8\xa1\x82\x85\x12\x25\xe3\xb9\x46\xe3\x55\xb6\x85\xfa\xcb\x56\x83\x01\x92\x60\x32\x1d\x24\x07\x04\x05\xa4\x33\x1a\x49\x12\xdf\xdc\x6d\x79\xd6\x2c\xf2\x73\xe3\x15\x85\x57\x92\x5f\x87\x6d\xd1\x58\x28\x5d\xcb\x8d\xc6\xfd\xae\x76\xce\x06\x43\x30\x4f\x1c\xaa\x1b\x97\x5d\x9b\xce\x35\x5b\x44\xab\x7d\xd4\x07\x10\xb6\x03\xa2\x98\x5b\x44\x53\xa8\x30\x33\x33\x0f\xd7\x8e\x46\x37\x1e\x79\xc1\x5a\xa6\xd3\x98\x7c\xa8\x84\xd7\x12\x90\xd7\xf8\xc0\x27\x41\xfb\xa1\xb4\x6a\x91\x8f\xd0\x3d\x25\x80\x9e\x4c\x7c\x6a\x22\x6d\x02\xfc\x2d\x40\x13\xee\x74\x86\xb6\xb2\x90\x48\xc2\xba\xb5\xdb\x4b\x77\x60\x85\x0a\x14\x70\xd7\x3e\x25\xb9\xab\xed\x26\x83\xf9\x65\x92\xe1\x56\x1f\x60\x5c\xaf\x53\x75\x39\x3d\x1f\x7f\x18\x9f\x0d\x7d\x38\xf7\x31\xf5\x55\xab\x76\xe8\xae\x33\xb4\xde\xb8\xa7\x33\x90\xd8\x7d\x7e\x0a\x1f\x7d\xc5\xaa\x48\xac\xcd\xba\x01\x30\x01\xb2\xfb\x46\xa7\x39\xfc\x7c\xb0\x3a\x63\xf5\xd7\xc7\x6f\x3a\xef\x31\x2d\x04\xc8\xbe\xb2\x7b\x31\x24\xb8\x4b\x03\xf0\x5b\x27\xe1\x38\xf2\x27\xd2\xdb\x9d\x66\x80\xda\x00\x55\xdc\x0d\xd4\x9b\x03\xd1\x9f\x3f\xe0\xb6\x41\x24\x39\xba\xed\xc4\x69\xcd\x4a\xba\x8e\x20\xda\xe6\x81\x98\xdb\x0d\x70\x91\xef\x10\x89\xc4\xe8\xa9\xe0\xc5\x50\x47\x00\x01\x5e\x44\xd7\x24\x56\xad\x0d\x00\xc4\xdc\x3d\xe8\x86\x66\x8b\x65\xc3\xf9\xae\xba\x63\xec\xe3\x85\x41\xbf\x26\x35\xdd\x43\x56\xd1\x86\xaa\xd5\x11\xd9\x8d\x70\x5b\x71\x90\xaf\x32\xea\x01\x42\x23\xc5\x2e\x41\x58\x83\x5a\xb0\xbd\x93\x31\xbd\x2f\x1c\x3a\x08\x5a\x03\x8b\x37\x50\x64\xb1\xdf\x94\xfd\x10\x77\x83\x63\x8b\x9e\x2f\xb3\xa5\xf8\xe8\xc6\x3f\x89\x7c\xa7\x32\x65\xd7\xc3\x7b\x5d\x40\xe6\x73\x7b\x36\x11\x06\x1d\xcf\x70\x82\xb5\x4c\x15\xde\x6b\xe8\x96\xa9\xbd\x5f\x06\xa9\x53\xe3\x44\x21\xc1\xd7\x49\xc3\x8c\x43\xcf\x7b\x96\xd8\x1d\xf3\x5b\x4c\xff\xc0\xa3\xcc\x02\x71\xe5\x8e\x3e\x87\x80\x39\xb7\x63\xaf\x88\x39\x02\x78\x99\x15\x97\xce\xc4\x4f\x27\x04\x85\xe7\xae\xb3\x95\x79\xf0\xa0\x82\xf6\xde\x0c\x12\xae\xa0\x03\x95\x8a\x0f\xe3\x8e\x91\x8b\xe1\xc0\x91\xd8\xf3\x72\x04\x91\xca\x66\x70\x0d\x47\xb3\x08\xee\xb6\x76\x32\x77\x5b\x35\xed\x99\x82\xb6\x12\xcb\xad\x9c\xa7\xca\x3b\x60\x48\x09\xef\xda\xbb\xbd\xa2\x4e\x29\x35\x4a\xd5\x30\xcb\x00\xd0\x60\x83\x5e\x5d\xd7\xdf\xf6\xeb\xb0\x76\x70\x59\xb4\x32\x05\x58\x4f\xa2\xeb\xa1\xf4\xd6\x65\xd4\xb8\x2f\x61\x77\x27\x1d\x54\x9c\x44\xd9\x35\x98\x40\x80\x43\x13\x6e\xb3\x3e\x3b\xbd\x6d\xc5\xdc\xda\x7b\x96\x5a\x8f\xd2\x37\xee\x91\x93\x7b\x13\x60\x7c\xf4\x10\xea\x04\xea\xbb\xf2\xa1\xe0\x9f\x0c\xb3\xcc\x14\xd9\x76\x4d\x1c\xb0\x34\x9c\x8f\x62\xe2\x39\xda\xdf\xea\xab\xb7\x1c\xdc\x91\xaf\xfb\x83\xcc\x94\x28\x48\x5a\xb2\x34\x80\xdc\xe1\xf4\x7d\xd8\x6b\xd6\xa5\xea\x93\x9f\x57\xb8\xe4\x0a\x62\x12\x13\x3a\x54\xcb\x4b\xe3\xae\x6f\xd1\x79\x4c\x78\x44\xe9\xe3\xfd\x6c\xde\xc9\x97\x88\x51\x36\x35\x6e\x62\x0a\x7a\x66\x19\x96\x46\x02\xa0\x5f\x63\xd6\xa0\xbf\xc0\x8d\xcd\x07\xd4\x5b\x1d\x09\x28\x2e\x89\x2a\xcc\x43\x38\x71\x71\x52\xe2\xbe\x0b\x44\xf3\x4c\x74\x84\x11\x47\xac\x3d\xa9\xc8\xfe\x51\xb4\xa7\x31\x61\x12\x6a\x27\xc2\xb8\xdb\x9d\xde\x3e\xde\xd3\x60\x41\x89\x1e\xfa\x39\x22\x71\x09\xa1\x71\x8d\x67\x0c\xe6\x88\x98\x20\xb9\xbd\xbe\xe1\x92\x1a\xc8\x3c\xc4\x2c\xde\x21\xda\xcb\x69\x68\x4a\xa9\xdf\xb7\xd6\xb0\xad\xc6\x07\x4e\xff\xde\x9d\x04\xa7\x9a\x8e\x50\x50\xe0\xf5\x33\xd4\x70\xc4\x60\xf9\x6a\x1e\x18\x86\xb7\xdd\xf2\x9e\xbd\x8b\x2d\x76\x2e\x4d\xdb\xa8\x07\x5d\x7b\xb8\x43\x76\xa2\x52\x04\x9d\x72\xde\xe8\x53\x61\x41\x69\xad\xc3\xf5\x58\xae\xdd\x4e\xec\xf4\x85\x3c\xe3\xf0\x33\xcc\x45\xd3\xad\x9a\x4f\xba\x4b\x9c\x7c\x73\xcb\x5e\xb3\x1a\x1a\x7b\x26\x29\xb0\x53\x56\x4f\x5d\xaf\x26\xdc\xc3\x12\xbf\x73\xdf\x55\xfb\x6f\x18\xb2\x81\x00\x6a\x67\xfb\x76\xfc\xf3\xe0\x7f\x8f\x3d\xf4\x5d\xf7\x3b\xf7\x83\xbe\x47\xdb\x37\x92\x55\xe1\xc4\xf3\x9d\x41\xd1\x5b\xaa\x1c\x6b\xa8\x4c\x19\xcc\x46\x81\xbc\x46\xb5\x44\x4a\xb7\x3a\xc6\x81\xbd\x2c\x74\x8d\xf6\x40\x43\xa9\x7d\x34\xdc\x8b\x9e\xeb\xaa\x47\x28\x76\xf6\x5c\x10\x6b\xd8\x7f\xa0\x57\xff\xd6\x84\xd2\x68\xf8\x09\xe4\xfa\x78\x70\x0e\xb2\x17\x6a\x06\xd0\x12\x3c\x2c\x1c\x6f\x14\x0e\x79\x59\x31\xca\x93\x43\x1f\xa4\xbe\x5f\xa6\xea\xdc\x80\xa9\xda\xbf\x5a\x51\xa8\xc4\x27\x54\xd6\xad\x3c\x2d\xe9\xf5\xdf\xa3\xf0\x70\x83\x93\x54\x9d\x97\x64\x55\x91\xc2\x57\xec\x94\xf9\x06\xda\xea\x6d\xe8\x25\x84\x12\xf6\xf4\x43\x61\x4a\xdb\xb2\x2c\x56\xb9\x5d\x36\xc8\x89\x18\xfc\x58\x7d\x09\x3d\xdc\xfc\x54\xae\x55\xb1\xeb\x0d\x1c\x48\x5f\x4f\x47\x96\x79\x00\x50\x27\xf6\xfb\x92\xff\x6a\x42\xcf\x37\x45\x06\x6a\x0a\x1c\xd0\xbf\x6c\x75\x0e\xc9\x46\x75\x5f\x56\x97\x48\xc5\x73\x22\xdf\x3b\xd0\x28\xbb\xd1\xc3\x00\x84\xad\xe3\xfd\xd6\x0d\x2a\x31\xe8\x17\x08\x89\x53\x18\x21\x76\x1d\x41\xfd\x10\xad\x0e\xdf\x43\xed\xf4\xd2\x90\x55\x55\xa2\x61\x62\xdd\xad\x90\x65\xd1\xc6\x0b\x58\xe6\x58\x34\xd8\xb3\xaf\xf7\x2c\x78\xcf\xad\x8e\x42\x90\x3e\x0c\x06\xd1\xa2\x6d\xa7\x84\x48\x4f\xcf\x7e\x95\xbe\x46\xfd\xd4\x66\x8d\x81\x8e\x3a\x99\x8e\xce\xb6\x17\x74\x01\x70\x3c\x61\x2a\x3b\x2b\xbe\xd8\x41\xb2\x8c\x93\xef\x80\x84\x67\xea\xe3\xe3\x88\xd1\xda\x03\x1d\xc1\x47\x36\xc6\x60\x96\x91\x79\xf0\xa4\x00\x3e\xdc\x1c\x72\x5c\x9c\x6e\x7a\x6f\x08\xd3\x46\x95\xd5\xad\x2e\xec\x7f\x52\x6d\x65\x2d\xdc\x0a\x50\xe4\xde\x49\xa4\xd3\x3e\x27\xa3\x67\x62\x28\xfd\xcc\x3d\xb7\xdd\xa0\xeb\x11\xcb\x0d\x32\x0c\xd5\x77\x3c\xd8\x9c\xf0\xd5\x79\x91\x53\xbc\xf0\xb5\x96\x3b\x3b\xc0\x8c\x05\x3e\x2a\xde\x26\x52\xe7\xdb\x27\x10\xd4\xb4\x20\xec\x08\xd1\x6e\x27\x45\x0d\x2d\x5d\xf8\xdd\xbe\x7c\xb4\x8c\x82\x8d\x47\x12\x28\x5e\x54\xed\x73\xf9\xc6\x00\x77\x57\x61\x28\xca\xde\xcd\x0e\xd4\x79\x65\x74\xb6\x0b\x87\x5c\x93\x4b\x97\x93\xa0\x64\xd4\x05\x5c\xae\x7c\xf5\xe7\xbb\xd0\x0f\x77\x38\xcb\x0a\x56\x36\xf4\xc2\xd7\x90\xf8\x2f\x50\xa8\x9f\x49\xb1\x35\x82\xaf\xb8\x0d\x67\xee\x74\xbe\x02\x30\x91\x9d\x88\x93\xa1\xc6\x05\x87\xe3\x1d\x6c\x5f\xfe\x25\xa3\x7b\xc2\x0d\x9e\xc3\x74\x39\x3b\x16\xb2\x67\xed\xd2\x46\xb8\x38\x5e\x96\x78\x9d\x25\x5c\xf5\x98\xa5\x98\x11\xad\x1d\x7f\xca\x07\x9f\x71\x3f\x1e\x51\xea\xb0\x7f\xed\xa8\x1b\xd2\xe1\xac\x8c\x45\xec\xb9\x41\xb7\x56\xaf\x69\x63\x2b\xaa\xf1\x0d\x0a\x9c\x9b\x1b\x62\x1b\xec\x21\xdf\x10\x47\x97\xd1\x50\x7a\x6f\x9c\x1f\x53\x75\x36\xbd\x7c\x3f\x9e\x8c\x27\x1f\xd5\xf9\xf4\xec\xe6\x72\x34\x99\xb7\x3c\x60\xeb\x85\x2d\x5a\xaa\x11\x16\x35\x21\x78\x25\xfd\xec\xd1\xec\xca\xa4\x63\x8a\x31\xc5\xb7\x88\xeb\xbd\xa6\x9c\xd8\x50\x5f\x14\x1c\x77\x75\x9f\x8f\x8c\xbd\xe7\x96\x3d\x3d\xae\xa7\xda\xab\x38\x34\xeb\xfd\xaa\x86\x78\xc0\x6b\x75\x7e\x28\xae\xbb\xdc\x03\xd6\x7d\xa9\xec\x08\x5e\x94\x59\xb7\xd1\x57\x77\xc8\xfb\x0b\x33\x96\xf9\xfa\x00\xdb\xb4\x65\x7d\x2b\x56\xbc\x69\xa9\x47\xb6\xda\x7f\xf1\xce\xfd\x48\xb9\x05\xe0\xc4\x82\x78\x22\x5f\x92\xee\x0c\xf7\x99\x82\x04\xc5\xba\xcd\x1b\xbb\xc9\x0d\x45\xcc\x96\x3a\xef\x1b\x8d\x07\x0a\x27\x6d\x9c\x68\x94\x6b\x5b\xdc\x52\x46\xaa\xb0\xc5\xa0\xf8\x87\x3f\xdb\xf3\xb1\x90\x52\xee\x4e\x36\xb8\x41\xdc\x09\x0d\xd8\x64\x0c\xf1\x9b\x10\x3f\x95\x0c\x5d\x81\x42\x0a\xa9\x25\xbc\x53\xb6\x85\xfd\xcb\x16\xa4\x85\xce\x32\xb2\x3e\x85\xa4\xb5\xc8\xa5\x2b\x92\x6e\x92\x8e\xfb\xc5\x2f\x3a\x55\xcb\xf1\xb9\x8a\x7c\x66\xdc\x9e\x5d\x21\xb6\x2a\xd8\x02\x26\xaf\x8d\xd2\xdc\x07\xd4\x37\x53\x75\xc9\xdd\x86\x11\xea\xec\xcf\xdb\xba\x91\x29\x48\xf1\x75\xcd\x5b\xf6\x69\xb5\xa1\xe5\x5e\xf0\x7a\xb9\xd8\x00\xa8\x8f\x75\xce\x80\xf0\xab\xf2\x19\x16\x3a\x6c\xfd\x88\xc5\xcc\xd7\x79\xdf\xc1\xe0\xfc\x46\x30\xa2\xf7\xda\xde\xef\x82\xb1\xf8\x44\xdb\x3d\xe9\x48\x4c\x0b\xd1\xf3\xb4\x34\x83\x04\xf8\x74\x46\x2a\x7a\x9e\xf7\xbd\x14\xeb\xe8\x07\xc8\x86\x74\x36\xbd\xb8\x18\x9d\x81\xbf\x5f\x4d\x3f\xf4\x8b\x3e\xaa\x30\x65\x4a\x95\x92\xd8\xf0\x51\x13\xef\x8b\xa9\x7e\x97\x44\x44\x27\x50\xb8\x9a\x22\x04\xee\xa8\x9e\x56\x14\x12\xca\xe5\x09\xed\x74\xcf\xa6\x4f\xbb\x6d\xdb\x1d\x61\x30\x7d\x12\x55\xe4\x5e\x54\xdb\xbc\xa7\x0b\x4e\x36\x77\xa2\xc1\x2d\xa3\x31\xf4\xcb\x4a\xbe\x98\x28\x54\xcc\x53\x4c\x88\xee\xa1\xf3\x3e\xe5\x1c\x6e\x62\x4a\x28\x93\x9d\x6e\x05\x63\x6c\x13\xf3\x91\xf6\xcd\xb4\x1f\x27\x5e\x1a\x48\x54\xd4\x2b\x20\xb1\xee\xa9\x41\xd4\xbb\x0a\x71\x81\xb2\x38\x1c\xc0\x33\x14\xaf\x4b\x77\x98\xa2\xac\xa5\x6f\xc2\x30\x83\x51\xfa\x66\x7f\x4a\xd5\xf0\xe3\xc7\xeb\xd1\x47\x88\x42\xa9\xcf\xe3\xf9\x27\x35\x9e\x9c\x8f\xae\x46\x93\xf3\xd1\x64\xae\x3e\x4f\xaf\xff\x6d\x86\x29\x8c\xcb\x72\xbd\xb1\xb9\xee\xad\xa5\x72\x2a\x00\xa3\x79\x80\x6a\x5c\xcb\xdb\xda\x63\x2a\xb6\xe1\x14\xc3\xa2\x71\x32\x69\x42\xb1\x64\x77\x9b\x62\xac\xde\xb0\x6a\x5d\x56\x44\x5f\x1c\xc5\x87\x38\x85\x2b\xe4\x75\xeb\x42\x1d\xea\xdb\x5b\x37\x13\x8d\x39\x64\x2f\xca\x5e\x96\x57\x12\x60\x7e\x68\x94\x35\xce\xe0\x25\x90\xff\x80\x42\x11\xf0\xde\x98\x3f\x76\xd5\x7e\xf1\x05\x30\x05\x81\x57\x67\x57\x16\x19\xa4\x5c\xb5\x8f\x18\xe6\xcb\x62\x89\x3b\x80\xd2\xb6\xfc\x56\xad\xa3\xa3\x0b\xe5\x07\xd2\x2a\xc0\x8e\x19\x2b\x63\xc7\xb8\xcf\xca\x05\x83\x85\x3f\x20\x38\xb5\x01\x7f\x34\x54\x33\xef\x2b\x7f\x8e\x9c\xf8\x63\x86\xfe\xf5\x9a\xbe\x88\x44\x88\x28\xa3\x7a\x05\x65\x20\x1b\xc8\x08\x0c\x75\x20\xf5\xbe\xb4\x05\xf2\x5c\xf6\x94\xa9\x51\x24\x44\xa3\x66\x41\xda\x37\xdd\xb8\x8d\xad\x4c\x3c\x37\x91\xe7\x5a\x5a\x3a\xb1\x7b\xaf\x8c\x33\x8d\x16\x95\x5e\x7e\x35\x4d\x57\xcf\x6c\xcf\x9e\x07\x47\x07\x94\xbd\xaa\x2c\xec\x52\xba\x79\x20\x52\x8c\x19\x35\xbd\xf5\x76\xe2\x2d\x77\x97\x11\x79\x1b\xfb\x35\x89\xb1\x83\x72\xad\xcb\xa2\x95\x9d\xd5\xed\x2a\x32\xba\xfa\xce\xc1\x02\xfd\x9c\xaa\xf9\xf5\x70\x32\xbb\x80\x93\x0c\x4a\x9b\x28\x2f\xb1\xb5\x74\x41\x85\xba\xf8\x18\x9b\xa9\x2e\xbd\xfd\x22\x33\x27\xc3\x77\xba\xc1\xae\x9e\x68\x87\x57\xad\x53\x75\x0d\x57\x8d\x3b\x6b\x7b\xf5\x33\xf9\x71\x9f\x39\x46\x30\xe9\x7d\x46\x92\xad\x3a\x05\xc9\xc4\xc7\xc6\x5d\xf7\x64\x3b\xad\x7e\x4b\xf7\x4b\xbf\xee\xc3\xd1\x61\x7f\x9e\x58\x17\xf1\x3e\x64\xef\xb6\xe9\xab\x6b\xfb\xd2\xea\x80\x8e\x2a\x7c\x7a\xd5\x62\x76\x4d\xc6\x1a\x57\xdd\x0d\x23\xb0\x7e\xd2\xa7\xa2\xf7\x5d\xaa\x90\xb1\x26\x69\x87\xfc\x58\x46\xc5\x2d\xe4\x16\x45\xd9\x09\x32\x0d\x95\x12\xfc\xf6\x0c\xbe\x14\xbd\xa4\x6b\xd1\x9b\x0a\x4e\x21\x5c\xea\x9a\x44\x76\x66\x6b\x0f\xc3\xa7\x16\xa6\x79\x30\x24\xef\xe4\xac\xec\x6b\xad\xd3\x2d\xf0\xae\xb3\x42\x5a\x89\x66\x93\xfe\xf7\x21\x0d\xc6\x19\xd4\xda\xe6\x2c\xc1\x82\x7f\xaa\x1d\x31\xb0\x4f\xa8\x87\x2d\x5f\xb8\xcc\x4e\xc7\xf6\xa5\x34\x3c\xf2\x27\x00\x88\x80\xba\x71\xad\xf0\xc4\xc9\x80\x28\x09\x76\x1b\x8f\x46\x0b\x1f\x0a\xc8\x25\x4d\x48\x29\x83\x0e\xc2\x60\x7e\x49\xd5\x7c\x74\x7d\x39\x9e\xf8\xd3\x2e\xb3\x77\x65\x09\x79\xa2\x3c\x57\x35\x4a\xb1\x7d\x39\xd1\x06\x71\x34\xb5\x04\x70\xf5\xfb\xaa\xb7\x76\xb1\xd8\x29\xdd\x34\x66\xbd\x11\x3c\x88\x8c\x4b\xf2\x9c\xe6\xb1\xd4\xf4\xbe\xb4\x64\xef\xc2\x4c\xc4\xd8\xbc\x01\x26\x7b\xd7\x0f\x05\x2f\xe3\x8d\x12\x6b\x1e\xf2\x81\x20\x7e\xee\x8e\x58\x80\x5c\xef\x9c\xc2\x86\xb2\xb1\x2a\x7f\x06\x99\x85\x3e\x30\x6c\x74\x10\x10\xac\x40\x53\xcf\xd4\x91\x1e\x04\xf0\x5f\xcc\x14\xa7\x40\x3e\x20\xc0\x40\x72\x55\xd3\x07\xa4\xc0\xce\x20\x4a\x2a\x5d\xd9\x22\x1e\x74\x1d\x75\x0c\x27\xe9\x68\x31\x00\xb1\xa8\x0b\x53\x34\xae\xa9\x8e\x82\x43\x1f\x5f\x69\x9b\x83\xab\xd8\x1d\x1a\xca\x50\x6d\x03\xc6\xfb\xba\x25\xc9\x0a\x06\x35\x12\x08\xb6\xd6\x94\xea\x0d\xa1\xcf\x8b\xe8\xb9\xa9\xeb\x00\x5b\x7d\x59\x56\xa6\xe4\xbc\xed\xbf\x61\x12\xc5\x98\xf6\x0e\x09\x46\xc2\xc9\xdb\xcf\x1e\x0b\xa9\x4e\x16\x3d\xb8\x98\xd2\xe9\x53\xd9\x20\x1b\x9a\x68\xff\x32\x61\xf0\xee\xdd\x31\x58\x2d\xca\xf8\x08\x03\x91\xc9\xd3\xee\x6e\x48\xf6\x5e\x6e\xab\x36\xf4\xbf\x9f\xdf\x57\xd1\xfc\xe2\x2e\x77\xdd\xd9\xf8\x20\x11\x79\xea\xe1\x4a\x8f\xa1\xde\xf7\x9c\x89\x4e\xf9\xb7\x04\x9b\x37\x02\x52\x75\xc5\xce\x73\xa7\x51\xb4\xa6\x82\xd5\x35\xdf\x00\x0c\x14\xd2\x1f\xfb\xcb\xce\x65\x67\xe0\x53\xe0\x53\x17\x3c\x0a\x08\x22\xdd\x44\x2b\x1d\x36\x40\x22\x87\x1d\x0c\xa5\x6e\xcc\x04\x9d\x1d\x3e\x1e\xe3\x07\x09\x8e\x4c\xb8\xfa\x98\x84\xa0\x0e\xe0\x37\x08\xa9\xf2\x32\x55\x1f\x6e\xe6\x37\xd7\x23\x75\x3d\xfa\x75\x3c\x63\x3b\x1c\xc0\xd8\x2e\xc6\x67\xa3\xc9\xcc\xc3\x40\xed\x03\xb1\x0a\x89\xfb\xf5\x9d\x2a\x0c\x60\x86\x20\x01\x4a\x4b\x47\x50\x8f\xa3\x6d\xd1\xbe\x71\xdb\xd0\x29\x1b\x76\xcd\xc8\x28\x85\x79\x08\x9f\x62\xe4\x65\xa6\xd3\xb5\x85\xaa\x37\xb6\xb2\xa1\xc8\x8c\x72\xc7\xef\x39\x7d\x67\xb1\x6d\x48\x7f\x03\xca\x03\x5b\xa8\x0c\xd2\x2d\xc1\x5f\x8b\x58\x24\xd0\xc4\xa6\x2a\x17\xb9\xf1\xd0\xfc\x4b\x53\x15\x10\xd0\x34\x8a\xe0\xb9\x1e\x1e\x1e\xd2\xdb\x62\x0b\x10\x5d\x0c\x4d\xf4\x03\xd6\xca\x3a\xb3\xbb\x95\xdb\x28\x70\x7a\x30\x1c\xab\x29\x86\x74\xbb\xb5\xf5\x1d\xd9\xa3\x75\x88\x95\x76\xdd\xfc\xcc\x80\xcf\x70\xdc\x52\x74\xe0\x3b\xed\x8c\x4a\x71\x26\x0f\xe9\x48\xe6\x6e\x57\xf0\x53\x87\xb2\xa2\xc6\x52\x80\x0e\x69\x28\x9c\xc2\xb0\xe1\x53\x24\x6a\xe3\xf6\x61\xfb\x53\xe6\xb4\x77\xd1\x79\xb6\x7e\xdf\xa1\x8a\x3d\xde\x51\x17\xf0\x71\x1f\x60\x0a\xe9\x00\x47\x60\xbb\xd5\x6e\x9a\x2a\xbd\x6a\x06\x1c\x84\xd8\xb7\xed\x1e\x01\x4d\xc0\xce\xec\x9c\xbd\x1c\x4d\x71\xf7\xaa\x63\x05\x79\x79\x57\x32\x09\x39\xbf\x82\x79\x93\x7f\xc7\xee\x75\x97\xb3\x2a\xbf\xed\x20\xcd\x3f\x33\x4b\x9b\xb1\x3d\xba\xda\x36\x4e\x38\xc6\x87\x47\xac\xac\x40\x74\xa2\x4c\x5f\xf8\xd0\x0b\x0f\x10\x1d\x18\x4d\xdc\x02\x40\xc9\x10\x57\x88\x86\x19\x91\x22\xc7\xe3\x4f\xe3\x35\xe2\xf4\x15\x9c\x8f\x28\x63\x91\xe3\x4a\x91\x11\x7c\x72\x92\xaa\xeb\x11\x4a\x0a\x2a\x39\x3b\xbc\xd4\x75\xed\x24\xcf\xe5\x36\x6f\x2c\xf9\x75\xcf\xca\x3c\xd7\x8b\x12\x11\x8a\xd4\xcc\x36\xe6\x10\x02\x61\x87\x97\x97\x67\xf8\xcf\x81\x28\x34\xfd\x5c\x56\x79\xa6\x3e\xbb\x39\xf9\x6c\x16\x0a\x74\x45\x0a\xfc\x04\x68\x76\x7f\xb9\xc0\xbd\x86\x76\x3a\x1a\x10\xb5\x4f\x42\xae\x45\x3d\xc8\x4a\x2f\x6d\x8e\xd9\x91\x74\x5f\x41\xf9\x6b\x53\x42\xae\x35\xe9\xf1\xf0\x99\x54\x0d\x79\x2e\x1f\xec\x57\x4b\xeb\x45\xcf\xbb\xe9\x87\x17\x80\x63\x8d\xc3\xab\x51\xd9\x65\x05\x25\x33\xc3\x67\xcc\x44\x98\x84\xc3\x01\x87\x0d\x82\x93\xb0\xb6\x8d\x11\xb3\x52\x1b\x32\xab\xbb\xe3\x86\x7c\xe1\xb0\x59\x29\x5f\xcb\xcd\xad\xfb\x06\xac\xd4\xe1\xd9\xd9\xf1\xfb\x2f\xc7\xb3\xa1\x2c\x2e\xee\xc0\x71\x0b\x76\xe4\x63\x22\xde\xcc\xed\x57\xa3\x5e\xa5\x2f\xbd\x22\x13\xda\x59\xec\xba\x5f\x38\x2b\xab\x4d\xc9\x48\x54\x60\x9f\x1c\xaf\xca\xea\x78\x53\x95\x2b\x08\x70\xfb\xdf\xb2\xbb\x34\x24\x84\xa2\x13\xb6\x5c\xa9\xc5\xb6\xb6\xc0\xec\x66\x0b\x35\xd3\x85\xfa\x50\xe9\x62\x69\xeb\x65\x99\xa8\x33\x9d\xdb\x55\x59\x15\x56\x43\x62\x26\x24\xaf\xeb\x9a\x0f\x8d\x47\x8c\x8b\x4f\x8f\xc8\x0f\x8c\x3a\x4f\x38\x25\x70\x9f\x86\xc8\x36\x4e\xd7\xb8\xe0\xbe\x86\x72\xec\x52\x96\xa1\x54\x86\xff\xa1\x85\x55\x0a\xdc\x8f\x90\xd3\x2d\x68\xb8\x74\xed\x73\x5c\xb8\xa0\x38\x3a\x45\xc3\x02\xd6\xca\xd6\xea\xd0\xe4\xf6\xd6\x06\x14\x10\x9f\x03\x7e\x18\x08\xa3\xfb\x28\x76\x63\x6e\xdd\x15\x57\x49\x7d\x25\x61\x03\x59\xd0\xa8\xe7\x85\x09\xe8\xbe\x0e\xba\x05\x52\x2a\x0a\x7a\x6f\x78\xe2\xf2\xf2\x8c\x50\x16\x3c\xaa\x45\x0e\x76\x3d\x4f\x52\xd6\x37\xf4\xe0\xc8\x85\xf7\x8f\x4e\x06\xea\x4e\x43\x41\x66\x08\x58\xd7\xf8\x3c\x3b\x0f\x6a\x0f\x01\x04\xba\xfd\xe9\x00\x3b\x0f\x3b\x3c\x6a\xce\xeb\x8b\x1e\x96\x13\xa1\x37\x7f\xf6\xf1\xb9\x72\x63\x2a\xdd\xf0\x45\xa4\x58\xd4\x70\x34\x9a\x57\x0f\x7f\xd3\x7f\xfa\x70\x8e\xf8\xe8\xf0\xc1\x42\x78\x43\xf7\x7b\x41\x6e\xc4\xc9\x6b\xc3\xed\xed\xb6\x6e\xa8\x33\xbf\x44\x9e\x08\xc3\xcb\xbc\x6f\x95\x53\x35\x3c\x3f\x1f\x4d\xce\x6f\x2e\xdf\x3a\xdb\x2d\x84\x9e\x5b\xbe\x7f\xd0\x2c\xbd\xaf\xf8\x60\xde\xf3\x18\x72\x9a\xf2\xe5\xe3\x2f\x7a\x02\x8b\x4e\x84\x4b\x46\xa6\x1a\xb6\x62\x1c\x99\x0c\xab\xf8\x12\x30\x81\x47\x2e\x69\xcf\xda\x1e\x9b\x3f\x83\x0b\xcf\x1b\x49\x01\xf3\xe0\xed\x41\x8c\xbb\xfe\x65\x34\xbc\x56\x5f\xa6\x37\xd7\x6a\x32\xbc\x1c\xa5\xea\x2a\xf8\xb8\x9c\xf6\x54\xe9\x42\xa0\x9f\x26\x71\xad\x0d\xe4\xbe\xf9\xc2\x76\x1b\xc2\x31\xfd\x59\xc7\x4f\x29\xa1\x89\x12\x98\xaf\xaa\x4f\x87\x6a\x4b\x90\xfd\x2a\xc0\x3b\x94\x70\x45\x1f\xe4\x53\xe2\x7e\xdc\x29\xd1\x4c\x98\x56\xa6\x5d\x92\xe9\x61\x5c\x7c\x02\x8b\x57\x2e\xdb\x91\x25\x36\x75\x8c\x77\xde\x3c\x3e\xe2\xc3\xf4\x80\x8a\xb8\x60\x7f\xf4\x75\xb5\x5b\x4a\xda\x57\x36\x9a\x44\x61\xb4\x43\x37\xf6\x34\x4d\xb1\xfb\x87\x2a\xb7\x85\x09\xdc\x76\x6f\x0f\x7c\x28\xba\xc7\xef\x88\xf0\x60\x17\xe3\xd9\x5c\xcd\x3f\x8d\xc6\xd7\x6a\x3e\x9e\x5f\x8c\x66\xa2\xa4\xa6\xdb\xa3\xf0\x0e\x7b\x4e\xe8\xd1\x4e\x75\x6b\x78\xf2\xa9\x91\x7b\xec\x9a\x68\x94\x65\x45\x26\x18\x57\xc8\x2f\x22\xaa\x31\x37\xfc\xca\x20\x5d\x29\xd4\x1b\x80\x22\xf5\x50\x2a\xc8\xa2\x2c\x28\x16\xd4\x94\x00\xaa\xc3\x82\x66\x4b\x17\x0f\x1b\x8d\x7e\x13\x8b\x84\xb0\xa2\xa9\xec\xbd\xb3\xef\x8c\xc0\xa4\x61\xac\xd1\x65\x99\x99\x44\x3d\x48\xfc\x4d\x8c\x7a\x92\x12\x5f\x9b\xf0\x1a\xca\x66\x9d\xe7\x86\xa9\xde\x30\x5f\xe2\xae\x24\x4b\x3f\xc6\x3b\xf5\xbe\x16\xc6\xae\x68\x9e\x40\x70\x75\xd7\x24\x04\x74\xc8\x39\x4d\xec\x08\x2d\xbc\xd6\xff\xd3\xd0\xcf\xf0\x27\xfd\xe1\xe2\xea\x0a\x40\xbf\x97\xff\x18\xf2\x8f\x27\xf1\xbf\x5f\xbf\x7e\xf9\xe3\x69\x9b\xff\xe3\xe4\xf5\x9b\x7f\xe1\x7f\xff\x33\xfe\x00\x95\x1f\x40\x4f\x5d\x55\x25\x80\x2c\xc6\x9b\xf9\xe0\xbf\x1d\x3f\xfe\x7f\x07\x6e\xff\xc8\x3b\x63\x09\x2a\xc8\xf1\xcb\x1f\x8f\x5f\xbe\x16\xd7\xdc\xc9\x2f\xbf\xfc\x02\xb8\xe0\xc7\x00\x08\x0e\x6d\xbe\xe2\x46\x23\xb8\x6f\x81\x31\xf8\x57\x63\x7c\xb7\xcb\x03\x7b\xa0\xbe\x3d\xc8\xf7\x7f\xa3\x3f\x07\x4f\xcd\x85\x3a\x72\x63\x1d\xb0\xd7\x70\x53\xd9\xb5\xae\x76\xbe\x07\x28\x49\x42\xe9\x32\x7e\xea\xab\xa9\x0a\x93\xfb\x98\x06\xf0\x9e\xe3\x6f\x36\x7a\xf9\x95\x08\x79\x23\xb8\xdc\xf4\x20\xae\xba\x13\x83\x94\x6e\x46\x37\x2c\x6c\x0c\x04\x78\x99\x67\x2d\x07\x29\x5c\x02\xfe\x81\x07\xa7\xe9\x45\x53\x4a\x24\xaf\xfc\x6d\x0e\x8a\x7a\x17\x4b\xbe\x0b\xb0\x67\x96\xc4\x32\x66\x92\xd5\x6a\x6e\xfe\x70\xcc\x28\x9c\x47\x2c\x16\x75\x3c\xb0\x01\x2e\x05\x4e\x3d\x53\x74\xd8\x82\xad\x44\x80\x01\xf7\x65\xba\xba\x60\x48\x6a\xa6\x16\x8e\xda\xdb\x16\xdc\x5a\x53\xba\xc6\x53\x58\x2c\xbe\xe9\x7f\x63\xca\x86\xe1\xe4\x5c\x7d\x9a\x7e\x56\xf3\xa9\x3a\x1f\xcf\x90\xe4\x62\x84\x09\x0b\xea\x66\x72\x3e\xba\x8e\xfc\x7a\x2f\x3c\xc6\x2f\x16\x48\x08\xec\x65\xa0\x24\xc6\xdb\x82\x13\x64\xe8\x56\xa1\xd8\xa1\x28\x29\x04\x47\xa9\x44\xd8\x89\x0b\x56\xf1\xfa\xb1\x1c\x83\x17\x36\x47\xce\x71\x8a\x68\x1d\xb0\x2f\xc2\xd1\x24\xf7\x15\x15\x93\xd0\x5a\x49\x8c\xe5\x50\x14\x4b\xb8\x95\x6c\x18\xee\xf9\x52\x27\xb1\xd1\x1b\x8a\x7b\x5a\x48\x0f\x3e\x33\x09\x7b\x74\x76\x61\x12\xad\xb9\x37\x21\x85\x5a\x34\x09\x13\x1c\xfc\xb0\xa0\x3d\x07\xb4\x7a\x4c\x6c\x8a\x13\x69\x7a\x3b\x16\x36\x03\xc3\x53\x43\xa9\x1c\xe8\x38\x0f\x77\xba\x41\x18\x1b\x0f\x4e\x13\x61\x50\xd6\x61\xff\x23\xb0\xfc\x5a\xdb\x08\xc0\x98\xe0\xde\x88\x53\xdd\x16\x8d\xb9\xad\xe0\xaf\xb8\xf0\x81\xe4\x59\xce\x50\xc0\x97\xc1\x1c\xda\xda\x18\x75\x87\x06\x8b\x5e\xde\xc1\x7c\x40\xa7\x6f\x4b\x9d\x73\xbb\xc6\x34\x41\x1b\x91\x48\x17\x10\x70\x02\xc8\xbb\xc8\xe6\xf8\x6d\xb9\xba\xbd\xdd\xda\xcc\xa4\x8d\xf9\xf6\x02\xba\xf3\xdb\xba\xcc\xc4\x8f\x6c\xd1\x96\x2a\x51\x26\x8c\xdb\xa5\xf5\xf6\xf6\xd6\xd4\x18\x8e\x3e\x90\x60\xe1\xff\x2d\xfc\x39\x18\x17\xfd\xd2\xb4\x65\xee\x90\x23\xb4\x42\xe7\xdb\xdb\x83\xdf\x3e\x97\xd5\xd7\x17\x10\xf5\x83\xc5\x41\xcd\xb2\x0f\xfa\x5b\x06\x06\x7e\x3b\x27\x86\x9f\xd6\xdb\x30\xb7\xc4\xba\x57\xec\x64\xc2\x48\xae\x1f\x90\x1d\x30\x62\x06\x32\xf0\x81\xf4\xe0\xb7\x4b\x21\xed\xf1\x7b\x00\xb7\x97\x79\x54\x04\x02\x4a\x72\x22\x4a\xb6\xbd\xbf\xb1\xe3\x63\x15\x95\x0e\xa0\xbc\x07\x82\x22\x9f\xd9\x0f\xb8\x99\x02\x0b\x1b\xca\x03\x28\xe2\x0c\xbf\xd3\x75\x5d\x2e\x2d\x48\x2d\xaf\x8c\x43\xb3\x88\x97\x66\x6f\x0b\xe8\x35\x70\x9a\x7a\xd0\x6c\x92\x8e\xee\x03\x1e\x84\xca\xdf\x7d\x7f\x23\x6a\x36\x4e\xd4\xee\x85\x9a\x33\x23\xa4\xfe\xdb\xe7\xca\xad\xa7\xd8\x73\x2f\xd4\xa5\xfe\x4a\xa6\xb1\xc8\xed\x81\x4f\x04\xc8\x4a\x58\x41\x28\x29\x40\x44\xbd\xd0\xdd\x5e\x07\x52\xaa\x64\x13\x21\xed\xff\x08\x2e\x98\x36\x0f\xc0\xc0\xc9\x15\x46\x6f\x10\x69\x36\x80\x00\x5b\x70\xfd\x47\xe8\x55\xc0\xc2\x58\xec\x70\xe5\x60\x2a\x57\x00\x6d\xc0\x60\x21\x7c\xc9\x7d\x98\x5f\xb9\x8e\x7d\x9a\xe3\xff\x2e\x76\x4c\x17\x09\x2f\xd6\xbb\xba\x31\xeb\xf0\xf4\x6c\x5b\xbc\xa8\xd5\x84\xea\x02\x3f\xb8\x47\x66\xf0\x88\x3a\x9a\x7c\x98\x0d\xd2\x83\xdf\xce\x20\x5d\x2c\x1c\x86\x76\x14\xe5\xb3\x3f\x19\x21\x64\x40\xfc\xa2\xbc\xce\x58\x36\x8c\x5e\x2b\xbc\x6d\x3d\xe2\xc6\xb6\x86\xe9\x86\xd4\x39\xc6\x5c\xa1\x4e\xd2\xf5\x2f\xe0\x30\x65\x9e\x0a\x62\xa8\x40\x20\x2e\xa7\xf0\xa4\x70\x1f\x7b\x8f\x0e\x39\x00\x3e\x03\x91\x00\xce\x1a\xc0\x3e\xca\xa0\x17\xfe\x52\xa4\x1c\xf6\xaf\x83\xe0\x4b\xd1\xcb\xc6\xde\x43\x4b\x40\x74\x4a\x1b\xb3\xad\xd3\xb9\xd5\xfd\x9e\x0e\x46\xbc\xb1\x7d\xf8\x11\x24\x4d\xce\xb6\x15\xa4\x82\x5f\xd2\x35\x61\x2a\xb7\x2c\x01\xfa\x91\xd1\x06\x8a\xd2\x47\x31\x69\xc1\x45\x96\xd8\x67\xbe\x22\xa2\x1a\x61\xf7\x90\xaf\xf6\xa0\xf7\x31\x24\xe4\x51\xb6\xdd\xcb\xbf\x05\xb5\xf9\x13\x84\x8d\x5f\xec\x3f\x7d\x07\xbf\xbd\xd7\x90\x7b\xc4\xec\xb7\xd8\x5b\xb2\x8a\x03\xde\xa9\xc0\xbf\xad\xd6\x90\x52\x40\x30\xa0\xe0\x80\xdb\x12\x2a\x66\x15\x68\x74\x09\x6e\x96\x50\x7d\x43\x8a\x59\x34\x59\x43\xd5\x6e\x1d\x23\x8d\x90\xce\x89\xb5\x2d\x60\xf3\xe7\x72\xd1\x17\x5b\x86\x03\x7c\xa2\x14\xb2\xf3\xed\x38\xa7\x09\x72\x7d\xbb\x0d\x78\x50\x2e\x02\xe2\x02\xc8\x1c\x28\xa1\x05\x98\x1d\x50\x15\x70\xae\xb7\x74\x86\x4c\x05\x3b\xce\xe4\xbb\x54\xdd\x78\xc2\x62\x4e\xc3\x08\x91\x3d\x40\xe9\x01\xc1\xc9\xaa\x03\xdf\x97\xe4\xe3\xa5\x73\x70\x67\x08\x31\x31\x2c\x55\x67\x28\x40\x54\xf0\x1b\xdc\xd9\xc7\x1f\xe0\xcc\xbc\x20\x81\x07\x1a\x14\x65\x4c\x39\xa1\x82\x4a\x14\x25\xfe\x60\x3b\xf4\xde\x8a\xde\xd3\x7e\xbd\x2d\xd3\xcc\x70\x07\x7f\x73\x3a\x01\xdf\x00\x2f\xd2\x83\xb3\xe9\xe4\x7c\x4c\xd9\xe6\x93\xa0\x24\x8f\x81\x10\xed\x3c\xc2\x9f\x91\x0a\xc2\x53\x7f\x98\x9d\xc4\x1f\x5c\xe9\x3e\x6f\x83\xb7\xfc\xd0\xe2\xed\x89\xa5\xb1\xdf\x12\xc8\x87\xcd\xb5\x49\x34\xd3\xef\x30\x39\xd2\x3d\x55\x6e\x1b\xb7\x69\x20\x85\xaa\x5e\x96\x1b\x03\xb9\x66\xc1\x7e\x49\x38\x4d\xca\x7d\x9f\x77\xb8\x6f\x87\x6e\x0d\x66\x3c\x0f\x84\xd6\x22\x6b\x8b\x48\x26\x75\x66\x24\x63\x2c\x12\xd2\x42\x6d\x35\xdc\xd7\x1b\x77\x7b\xfb\xe0\xe0\x67\x2e\x84\x38\x0d\xc9\x7f\x11\x66\x0f\x63\x4e\xc9\xda\x9e\xc8\xb5\x89\xd3\x50\x13\xfa\x0e\xa5\x5e\xd8\xf6\x1d\x58\xae\x70\x8f\xc9\xf3\xc2\x03\x13\xc7\x69\xdf\x3c\x7b\x47\x2b\x8a\x99\xd8\xd6\x26\x1d\x24\xba\xfe\xb9\x88\xaf\xae\xb7\xeb\x47\x28\x5d\x96\xc8\x23\x4b\x70\x85\xbd\x13\x10\xdd\x78\xad\xab\x2d\xc0\x2b\x53\xb2\xd0\xb3\x67\xab\xab\x74\x22\xa5\xad\x3a\xf5\x30\x8b\x12\x9f\x4e\x37\xad\x7e\xd8\xf8\x13\x3d\x76\x2a\xa6\xf4\x2d\xed\xc6\x52\xb1\xa2\xbf\x7e\x28\x0d\x5a\x7e\xae\xe4\xba\x70\xbc\x6c\x9d\x26\x09\x17\xb2\x46\xcc\x01\x40\x94\x0b\x19\x31\xf4\x1d\x93\x51\x9a\xd3\x4e\x4c\x44\x7b\xc2\xfc\xdd\xde\xd2\x82\x11\x40\x8a\x8c\x12\x4d\xc9\x45\xdd\xbb\x2c\xde\x04\x14\xfe\x0f\x74\xcd\x7c\x1e\x20\x78\x29\xe0\x72\x59\xb2\x6d\x6b\x22\x27\x86\xdb\x41\xee\x90\x34\x46\xc2\x6c\xa7\x14\xca\xbd\xd4\xdb\x58\xa0\x53\x8f\xc6\x5b\xb7\xf7\x44\xfb\x6b\x69\xf4\xaf\xce\x2a\xc2\xae\x5c\xeb\xc2\x0d\x9d\xf9\xb8\xbb\x93\xd2\x0b\x90\xdb\xc2\xec\xaa\xe3\xab\x0f\x8b\x16\xc5\x7c\x53\x0a\xfd\x73\xe7\x9c\x67\x97\x4a\xf5\xe2\x1d\xfd\xf8\x54\x7b\xbc\x8a\xd6\x71\xc6\xd2\x03\xf2\x19\xc9\x17\xba\x9f\x8b\xf7\x54\xf4\xbd\x68\x72\xa9\x4a\xe9\x6f\x18\x66\x74\xf6\xa3\x51\x44\x71\xc1\xc7\x38\x7e\xd1\x16\xbb\x37\xd5\x4e\xdc\xf2\xf2\xfc\x7b\x8c\x24\x04\x35\x6d\xe9\x01\x04\xa5\xec\x0b\x8f\x5a\x08\x43\x0c\xfd\x6c\xdd\xad\x0f\x99\xab\x32\x7f\xaf\x60\x28\x4c\xa8\x82\xde\x33\xf0\xd8\x6b\xa9\xb3\x8c\xca\x04\xa3\x82\x73\xfc\xb8\x27\x76\xe8\x1d\x09\xc3\x1f\x68\x62\x6d\x69\x3d\xd4\x5a\x56\xce\x84\xd1\x24\x14\x38\xfe\xe4\x01\x4f\xf6\xb4\x82\x8a\x4c\x6b\xb6\x58\x1f\x12\x71\xa3\x58\x65\x41\x37\x45\x82\x86\xc6\x3d\x5b\xf5\xfd\x0d\x74\x55\x2f\xd2\x5c\xb6\x35\x78\xa0\x4c\xd1\xa3\x7c\x71\xd3\xba\xe9\x6f\x3b\x1a\xde\x53\x33\x23\x80\x59\xb7\x85\x5e\x2f\xec\xed\x16\xcb\xbf\xbb\x5d\x03\xd7\x65\xdb\xed\x14\x6e\x34\xdf\xd0\xdf\x36\x04\x5e\xda\x45\xaa\x46\xfd\x5b\x39\x1e\x00\xc7\xbd\x42\xfe\x0e\x87\x95\x31\x7b\x8f\xb5\x99\x42\x43\xe2\x07\x57\x1f\x11\x46\x2b\xf4\x55\xae\x6f\x42\xf4\x5c\xfe\x6b\x01\xf2\x5b\xf8\x0a\xd0\xfa\x25\x4b\x21\x72\x2f\xd6\x91\xa6\x11\x75\xd5\x97\x10\x0b\xd6\x38\x8f\xac\x09\x09\x49\xcb\xe5\x16\x8a\xbd\xf2\xf2\xb6\xd5\x51\x9e\x95\xa5\xb3\xf4\x94\x2d\xbc\xf9\xe8\xd3\xf1\x65\x4b\x80\x2a\xee\xf3\xc7\x3c\x20\x7f\x2d\x6f\x8f\x23\x46\x83\x94\x0e\x81\xa6\x0b\xff\xd8\x5f\x5d\xc0\xd2\x8b\x31\x1c\x91\x5c\x04\x54\xbc\x67\x35\x52\x19\xf0\xe5\x80\x9a\xe8\x6e\xf8\x22\xcb\xb9\x32\xb1\xaa\x00\xcf\x09\x38\xbe\xbc\x16\xd1\x37\x9f\x5e\x9a\x01\x37\x20\x59\x9b\xa0\x2c\x50\x5e\xb4\x30\x4e\x58\x33\xd9\xa9\x2c\x00\x4f\xa2\xf0\x69\x29\xa6\x1d\xb1\xae\x94\xca\xf0\xd2\x96\x22\x5a\x02\x7e\x52\xe7\x82\x68\xf6\xb2\x41\x7e\x8c\x51\x10\xc9\x04\x78\x9e\xca\xf6\xce\xbb\xf8\xdb\x58\xa7\xe2\x28\x46\xc2\xc9\x73\x7b\x3a\xd5\x1b\x26\xd8\x03\x47\x51\xa1\xa9\xe9\x7b\x93\xf4\x48\x41\x55\x05\x32\x84\x7c\xae\xfe\x63\x12\x9f\xa7\xfb\x5d\x58\x16\xaf\x7d\x50\xbe\x14\x06\xc1\x39\x0d\x17\x03\xff\x6b\x63\x80\xc8\xc4\x0a\xbf\x7b\x82\x21\x0d\xa7\xf2\xdc\x42\xf0\xbf\xca\x7c\x8e\x75\xb0\x76\xd6\x1b\x03\x0a\x60\xa7\x59\x01\xb7\xdb\x3f\xc4\x77\x61\xfe\x4f\x9d\x09\x14\x8e\x50\xe0\x22\x5a\xad\xec\xd2\x92\x0c\x2b\x17\x50\x9b\xff\x4c\xdd\x9a\x4b\x42\xff\x5e\x1a\x40\xac\x78\x74\xf4\xfd\x58\x6b\x89\x21\xa5\x5b\xb2\x20\x16\x50\x4e\x88\x01\xc8\x6d\xfb\x68\x45\x0d\x52\xd1\x54\xfc\xd9\x18\x1a\x95\xcc\x86\x37\x89\xb7\x1b\x48\x09\x21\xea\xb9\x5b\x5d\x79\xe8\xeb\xce\x99\xfa\x39\x25\x5c\x84\xa0\xc2\x00\x94\x04\x4f\x9b\xbb\x2c\x0a\x22\x5f\xd9\x54\xe5\x9d\x5d\x58\x2a\xe4\xba\x03\x51\x4c\xc1\x04\xae\xe0\x4c\xc4\x92\x73\x41\xde\x62\x47\x3c\x05\xcd\x5d\x99\x25\xec\x08\x0b\x1b\xbe\x2e\xbd\x46\xb3\x30\xcb\x72\xed\xee\x39\x8f\xaf\x00\xa2\xbe\x1f\x8c\x56\x77\xee\xd4\x60\x5c\xd9\xce\x7d\xb0\x5f\x95\x8e\x8c\xaf\xd7\x34\x8b\x5c\xa0\xd4\x36\x61\x23\x97\x78\xb1\x6b\xad\x30\x96\xbb\x86\xac\x11\x4f\x8c\x84\xbe\x4e\xf9\x32\xf4\x3f\x7a\xfb\xa8\xc7\x8f\xcc\xb1\xdb\x22\x62\xe9\xf1\x1e\x1d\x38\xd0\xde\x5f\x46\xf3\xc8\x6d\xfa\xe4\xea\xca\xe4\x1a\x48\x25\x8b\x6d\x9e\x33\x33\x5d\x1d\xa1\x87\x89\x48\x8a\x47\x43\x27\xe6\x39\xda\x39\x58\x71\x8c\x08\x20\xc1\xa1\x84\xee\x77\xd7\x3c\x17\x27\x04\x7d\x70\xd8\x6b\x8f\x77\xcd\x5e\x2d\xd0\x2c\x7c\xce\x67\xe4\x37\xf3\xb9\x53\xa8\xfe\xdc\x95\x45\x59\x75\x4e\x42\x40\x8a\xe5\x03\xc1\xe7\xc1\x16\xad\x53\xc0\x16\x06\xc8\x37\x2b\xd2\xd0\x31\xb1\xbe\xc4\x16\x78\xd8\x4d\x28\x94\x96\xa4\x0a\x71\x44\xd4\xab\x4a\xa0\x05\x3f\x76\xee\xf7\x0e\x3a\xe9\xd9\x13\x84\xad\xcf\xb7\xa4\x97\x8a\x11\x8d\xb1\xd4\x75\x82\xf2\x0a\xfa\x3d\xba\x1c\xbd\x8c\xf1\x07\x27\x6a\xa4\x33\x60\x32\x71\xeb\xbe\xc9\x14\x7e\x25\x56\xdd\xba\x76\xfd\xc9\x49\x2b\x56\x0f\x97\x4d\x8d\xde\x2a\xf1\xfd\xb2\x90\x29\xaf\x10\xa6\x93\x71\xf3\xb0\x56\xae\x77\xb0\x4a\x4d\xe7\xab\x58\x2a\xd3\xfa\x2a\x97\x15\xc3\x21\x01\x4f\x37\xb2\x17\x47\x51\x2d\x2f\x98\x74\x41\xdb\xf7\x14\xdc\xf7\x77\x04\xd4\x1f\xb5\x05\x79\x7b\x5e\x16\x82\x72\x4a\x3b\x9a\xaa\xec\x11\xb2\x89\x35\x7d\x50\x25\xe1\x2f\x16\x32\xf9\x5d\x5b\x79\x1e\x4a\x95\x98\x17\x21\x76\x8e\xd7\xe9\xc1\x64\xaa\x3e\x0f\xaf\xaf\x87\x93\xf9\x97\x28\xe0\x39\x17\x6e\xf9\x07\xae\x9f\x8d\x7c\x78\x6a\x84\xc5\x8f\xa0\xe9\x87\x5a\xc6\x00\x90\xf9\x50\x59\x37\x21\x09\xdd\x32\xb1\xc7\x3e\xe4\xdf\xfb\xf9\xf9\xcd\x09\xd2\xfa\x45\xf0\xb5\xf8\x76\x49\x86\x7f\xb5\x45\xe6\x63\x7e\x54\x70\xe9\xcc\x72\x62\xd3\x31\x99\xd0\x40\x03\xe8\x79\xd0\x40\xb1\x27\xf4\xac\xe0\xe5\x81\xa2\x6e\x53\xb9\xfd\xd5\x70\x28\x1b\x6b\x0b\x1b\xc8\x31\x27\x6e\xb1\x50\x5b\x43\xb4\x64\x78\x97\x51\x65\x7d\x65\x6b\xb8\x0a\x68\x1f\x01\x50\x1e\x7d\x67\x63\x2a\x10\x92\x82\x84\x8b\x4f\x2a\x2c\xcc\xae\xdc\xa6\x6a\x86\x2c\x0a\xfe\x97\x00\xab\xa6\x32\x43\x1c\xf6\x09\xb1\x65\xd4\xdb\x35\xd3\x80\xa0\xa4\x70\xab\x5a\x18\xa8\x2f\x04\xa4\xea\xea\xde\x2e\x61\xfc\x95\xd9\x68\x5b\x25\x58\xac\x54\x55\x0c\x1f\x38\x06\x68\x3e\xdc\x39\xa4\x48\x7b\x84\xdb\x45\x27\xce\xeb\x46\x7e\x5b\x19\x3c\x1f\x61\x4d\xb1\xc8\x6a\xde\xb3\xae\x09\xdf\x54\x54\xcc\x80\x2c\x5d\x01\xf8\x69\x5f\x60\x2b\xe0\xe5\xb9\x79\xde\x41\xce\x48\x5b\x37\x6a\xa5\xf2\x86\xeb\x17\x93\x09\x05\x63\x0c\x20\x79\x33\x94\x02\xe2\xa5\x54\x2a\xd3\x40\x74\x29\xcd\x14\xd7\x2a\x31\x28\x24\x5c\x40\x0f\xbf\x07\x8d\x00\x89\x70\x97\x65\x41\xe9\xec\x50\x3a\x87\x1f\x51\xba\x42\xf6\x4d\xb7\x4f\x69\x7b\x6e\x6b\xd3\xbe\xb2\xe9\xb7\xb6\xe0\x6d\x25\x40\x90\xf9\x12\x7e\x74\xc3\xe6\x25\x92\xae\x67\xba\xd1\x09\xfc\x97\x72\x08\x2a\x27\x1a\x10\x72\x93\xad\x47\x98\xc7\x1c\x70\xdc\x55\xbd\xad\x29\x57\x1d\xa5\x8e\xb3\x56\xc0\x8c\xc7\x7b\x95\xbb\xbc\xd2\x36\x17\xc6\x31\x8b\x67\x4c\x8b\x17\x30\x94\xb4\x32\xc4\xff\x39\x48\x7c\x12\x52\xef\xd1\x76\xaa\xbf\xb6\x99\x40\x6c\x82\x7f\xca\xe5\x0d\xf8\x81\x19\x56\x02\x32\xd8\x76\x59\xd7\x36\x64\x93\x80\x2c\xa5\x29\x4f\x0f\x2e\x87\xe3\xc9\x7c\x34\x19\x4e\xce\x46\x58\x82\x88\xa9\x4b\xfb\xe2\x30\x90\x02\x05\x43\xba\x23\x45\xd6\xc9\xa6\x6d\xad\x7e\xc3\x8e\x1d\x73\x9e\x8b\xc9\x5e\xec\x1d\x4b\xab\xdc\xd8\xbb\x07\x82\xdb\xcc\x33\xef\x71\xbe\x5b\xc7\x81\x26\x42\x9e\xc1\x53\xee\xfd\x53\xc8\xdc\x18\xb2\x6e\x84\xf2\xd8\x37\xb1\x08\x1b\x27\x7c\x72\x3d\xa3\x49\xf7\x0f\xbd\x3b\x66\x14\xf3\xba\x4f\x55\xc5\x0a\xd7\x1a\xe0\x58\x96\x12\xf7\x38\x1a\x0a\x46\x9b\x1e\x98\xb2\xa0\xe4\xa0\x0c\x5a\xf4\x64\xf1\xd7\xd1\xe5\x81\x05\xc1\x3e\x7b\x64\x81\x3e\x04\xd4\xf2\xb4\xba\xd7\xb9\xcd\x94\x71\x23\xca\xb9\x00\x73\x90\x12\xad\x85\xe4\xb1\xf0\xdf\xec\xe9\x3b\xe4\x19\x79\x4c\x02\x10\x31\xcb\x46\x6d\x37\xe8\xc4\xad\x5b\xbd\x13\x33\x16\xa9\x19\x7d\xd3\xd6\x94\xea\xb7\x6d\xb1\x6f\x22\x8b\xb2\xa7\x37\x1e\x0a\x85\xa2\xe4\x74\x49\xa2\x1b\x7d\xbf\x99\xf8\x40\x7b\x84\xa0\x69\x2b\xa7\x5d\x81\x92\x5a\x91\xa9\x6c\xc4\xd2\x60\x05\x12\xa6\x0f\xac\xb7\x85\x8d\x20\x96\x37\xa6\xb2\x25\x9c\xb2\xda\x7e\x53\xeb\xb2\x68\xee\x02\xd1\x9a\xa7\x86\x66\xec\x21\x91\x79\xe3\xfe\x8e\x5a\x38\x5c\x43\xb8\x4b\x4d\xa1\x01\xeb\xfa\x0b\x65\x26\xa2\x1d\xf5\x0c\x9b\x17\xa4\x91\xc7\xb7\xf0\xe2\xc5\xa3\xe6\xf6\xaf\x23\x70\xc3\x94\xde\xa3\x5a\x95\xb9\x81\x44\x78\x79\x91\xca\x05\x49\x7c\xca\xe4\xf3\x3b\x26\xe7\x34\xf8\x73\x80\x7d\xe6\x2d\x05\x6f\x2f\x11\x65\x4c\x94\xca\x33\x92\x83\xeb\x63\xc5\x75\x0d\x3d\x0d\x1d\x71\x76\x6b\xf7\xb6\x24\xb9\xd3\x3c\x94\xa4\xa1\x0f\xa2\xae\xf8\x45\xd5\x05\xfa\x4a\x0b\xd3\x90\x18\x00\xaf\x4a\x6d\x74\xb5\xbc\xe3\x78\xea\x78\xc5\xc5\xec\xee\xa7\xe8\xd9\x00\x67\xcd\x6a\x9b\x93\x43\xc7\x14\x08\x95\xf1\x70\x67\x28\x00\x1d\xe6\xb0\x6e\xdc\xad\x1e\xe6\x31\x76\xb6\xa3\xb4\xc1\xdb\x47\xce\x35\xa2\xa8\xd7\x5f\x1f\x39\x88\x68\x4f\x2b\x46\xa2\x91\xdb\x13\xae\x34\xca\x0b\x71\x97\x14\x6c\xcd\xd8\xbe\x01\xf1\xe5\x47\xb4\x2d\xc2\x98\x90\x70\x10\xb6\x26\x46\x0d\xdc\xed\xb6\x36\x3d\x7b\x15\xec\x5a\xfd\xd5\x14\xfb\x0d\x73\x1e\x49\x51\x94\x5b\xf7\x86\x48\x56\x71\xb6\x29\x3a\x85\xa9\xf3\x0d\x85\xa5\xe0\xfb\x1e\xfd\xc6\x6f\x53\x79\x48\xd4\x51\x6b\xa7\x72\x16\xf0\x03\x59\x85\xe0\x0a\x23\xce\xff\x0c\x20\x4f\xdb\xb2\x71\x53\xe2\xe9\x00\xd7\xd7\x7a\x93\x02\x11\x6b\x63\xbe\xa5\x03\x9a\xa7\x57\xda\x4f\x54\x7f\xf0\x05\x24\x07\x6e\xd9\x22\xc3\x13\x88\xc5\x8a\xba\xae\xa3\x69\x6a\x29\x02\xbb\x72\x4b\xd3\x02\xfd\x74\x23\xac\x99\x72\x52\xd2\x44\x80\x58\xe5\x99\x93\x24\x16\x8b\x27\x3a\x86\xd2\x5c\x76\xae\xf7\xe2\xe3\x1e\x43\x9a\xd3\x9e\xee\x2e\x10\x7f\x17\xc5\xea\xdf\xd6\xf1\x10\x27\xa6\x04\x5c\xf5\x5b\x58\x69\xf9\xf4\x0b\x88\xac\x23\x6b\x00\xde\x8e\xa7\x8b\x94\x5d\x5a\x6e\xa6\xa9\xb6\xad\x32\xb4\xb3\xeb\xf6\xbe\x71\xab\x7f\xa7\xf3\xdc\x00\x51\x78\x41\xc6\xcd\x7e\xef\x51\x51\x56\x7b\xd5\x03\xfa\x1d\xe9\x59\xa6\xe4\xcc\xcc\x22\xc0\x6c\x23\x8e\x6f\x7c\x17\xe3\x2d\x84\xd7\x5e\xa6\xea\x92\xac\x18\x00\xe1\x14\x14\x7d\x47\x85\x79\x18\xf4\x74\x49\x44\x7a\x1b\x81\xc7\x0b\x10\x7f\x61\x69\x7b\x86\xc2\xde\xb7\xf0\x90\xb3\xf5\x91\xb1\xc6\x1f\x3e\x31\x73\x88\x71\x81\x3c\x96\x6c\xf3\xf6\x26\x5a\xbc\x5a\x0c\x9c\x64\x78\x3d\xf0\x5b\x40\x37\x7d\x1d\x20\xe4\xee\x25\xc1\x65\x78\xfe\xaf\x7e\xb7\x9d\xdb\x29\xc4\xa9\x15\x45\x66\x77\xd8\xc8\xf7\xcb\xb8\x21\x0f\x66\x7f\xa3\xec\x29\x4a\x82\xaf\x25\x41\x87\x1f\x5e\x54\xc8\xdc\x25\x35\xca\x5e\xef\x8f\xfb\x2d\x94\xa1\x78\xff\x11\x6d\xef\x67\xdf\x8f\x11\xd3\x9f\x3c\x40\x34\x13\x49\x3b\xb7\x2f\x89\x62\x69\xad\x28\x63\x0c\x40\x00\x27\x82\x14\x2d\x5d\xf7\xed\x30\x08\xc2\x50\xe3\x90\x3c\xe1\x85\x34\xbc\x5b\x98\x07\x7e\x9f\x41\x5c\xdd\xde\xed\x93\xda\xa0\xcc\xaa\xd3\xc5\x80\xdd\xae\x7f\x5d\x65\xc4\xf7\xa4\x7e\xc5\x16\x89\x80\x9a\xf1\xd1\x40\xbb\x76\x3a\xa8\x06\x8e\xdd\xff\x33\x15\x16\x84\x68\xcf\x9f\x03\x18\x6f\xd4\xbb\x31\xb4\xf9\xdb\xae\xdc\xbe\xf0\x3e\x2a\xa6\xf7\x38\x38\xbb\x2b\x4b\xb0\x82\xe7\x2d\xd4\xb1\x21\x85\x4b\xb9\x48\xea\xf8\x99\x7f\xdc\xbe\xe4\x1a\x1e\x76\x31\x86\xd2\x06\x28\x53\xd0\x08\x9d\x59\x90\x4f\xc2\x59\xd3\xff\x45\x86\xc8\xfe\x8b\xf4\x9b\x12\xfd\x38\xc0\xba\x08\xad\x36\x24\x07\x95\xb5\x69\xbb\xde\x48\x68\x64\x4c\xee\xb0\x62\x02\x60\xe9\xb4\x2e\x76\x94\x4e\x5c\x88\xfe\x2d\xb6\x10\x03\xad\x1b\xa3\xb3\xa8\x08\x39\x3c\xb2\xd7\x1b\xdb\xa5\x12\x03\xa8\xf6\x1e\x6f\x39\xc4\xff\x4c\x1e\xaa\xbc\xcb\x87\x22\xf4\x9d\x40\xfd\x02\xa8\x14\x1d\x9b\xd6\x58\x48\x1e\x70\x46\x31\x78\xee\x98\xac\xcf\xed\x47\xb7\xf4\x3e\x42\x16\x55\x1a\xed\x97\x2e\x68\x43\x85\xe2\x8c\xef\xaa\xc4\x70\x76\x36\x1c\x06\x0c\xe8\x34\x80\xae\x89\x18\xf2\xb6\xc8\x7a\xc2\x50\xf1\xfe\x1d\x37\xfe\x0b\x2d\xfd\xe9\xe1\x6e\x17\x1f\x05\x6c\x3c\x74\x7d\x7f\xa1\xaa\x3a\xfa\x78\x75\x31\x00\x52\x1a\x91\xfb\x64\x0b\xc1\xc7\x05\xb9\x0a\x4f\x94\x63\x41\x83\xe8\x7b\xcc\x6c\xbd\xdc\x52\xdd\x7a\xd1\x9e\x21\xb7\xf8\xa8\x82\x83\xad\x97\x9b\x7b\xed\x51\x0c\xe9\x60\xa2\x4b\x98\x74\xc1\x38\x83\xac\x75\xbc\xa1\x2a\x9d\x37\x4d\x65\x94\x29\x96\xe5\xb6\xd2\xb7\xd8\x25\x28\xa5\xb1\x8d\xbb\x83\xae\x23\xb1\xa2\xca\x42\xc9\x6a\x11\xf5\x99\x7c\xb1\x32\x30\xf5\xec\xe3\xdc\x3a\xdb\x58\xe8\xe6\xb6\x5a\xc1\xb4\xda\xe4\xcc\xdb\x93\x87\x43\x7e\xa6\x68\xa7\xa3\x05\xad\x73\x77\x4e\x82\xab\x18\x6e\x05\x51\x3f\x44\x3a\x98\xd8\x32\xab\x08\x05\x97\x9e\xea\x06\x8b\x53\xf5\x19\x6a\x91\x40\x63\x02\xe5\x0a\xe7\x9c\x90\x40\xb6\xcb\x76\x71\x09\x78\x42\x71\x3c\x71\xb8\xc9\xdd\xd9\x0d\x2b\xa0\xf0\xd4\x1d\xb0\xa9\x80\x0d\xbc\x44\x0f\xa3\x3a\x3e\xf6\xba\xd9\xaa\xac\x6e\x4d\x13\x4a\xfe\x20\x38\xe4\x3b\x18\xc7\x1f\xdf\x21\x7a\xb0\x07\x2f\x2c\x97\xcb\x6d\xc5\xbe\x4e\xcc\xc2\x66\x13\x16\xce\x37\xd2\x47\x51\xdc\xfe\xae\x5b\x43\x26\x30\x30\x19\x49\x23\x9a\x2b\xcb\x64\xc9\x00\xc5\x46\x93\xb7\xff\x3c\x82\xa7\x58\xef\x7c\xc2\x99\x4f\xe6\x44\x3c\x60\xc1\x7d\x0f\xc5\x39\x89\xdb\xb9\x6e\x35\x97\x10\xfb\xf1\x30\x5b\xac\xa5\xfa\xeb\x9b\x7d\x40\xe0\xb3\x00\x28\x8d\x6d\x8d\x68\xd2\x2c\x87\x17\x4e\x3b\x83\x8c\x23\xf7\x97\xa6\x54\x5f\x8d\xd9\xf4\xa7\x10\x8a\xa8\xaf\x8f\xd3\x10\xa6\x4f\x59\x18\x67\xee\x53\xdd\x95\xaf\x96\xa0\x31\x95\x11\x87\xfb\xc2\xdc\xe9\x7b\x5b\x56\x71\x79\x60\xd8\x97\x0d\x25\x63\x14\x44\xa9\x29\xd0\x59\x82\x3b\x3c\x3d\x20\x2c\x8f\x9b\xda\x44\x97\xe9\xbe\xa3\x16\x01\x7a\x78\xe1\x8f\x01\x2a\x5b\xb4\xa8\xa1\xa4\xd3\x5d\xdc\x56\x25\x32\xaf\xfa\x7a\x8b\x1e\xbf\x25\xfb\xc9\x51\xcd\x02\xc0\x7c\x12\xc6\x3b\xf6\x7a\xe2\x70\x3d\xf3\x24\xe6\x89\xff\x50\x56\x48\x7f\x4b\xcc\x55\x8d\x85\x55\xe2\x6d\x27\x48\xf1\x40\x9b\x13\xfa\xa0\xd7\x66\x9f\x97\x14\xdf\xce\xd0\x83\x12\x96\x2a\xf2\xa2\x3e\x16\x46\xfd\xc4\xde\xcf\x3e\x98\x26\x9a\x05\x80\xb4\xe1\xfe\xbd\x3d\xf8\xdd\xef\xd4\xc6\xde\xa6\x59\xf3\xcd\xfd\x35\xd8\x60\xa7\x2f\x5f\xfe\xa8\x2e\x53\xf5\x25\x55\x13\xbd\x36\x07\xbf\x3b\xf8\x1d\xae\xe4\x23\x05\xa9\x3f\x48\x02\x0d\x7f\x23\x1d\xfc\xae\x73\xb4\x1e\xaf\xbb\x96\x75\x70\x5c\x65\x7e\xf0\xbb\xce\xa1\x2c\x2b\x75\x14\xf3\x2c\x0d\xba\xe0\x25\x29\x74\x1b\x78\x9a\xdd\x09\x6a\x27\xfb\x45\xe1\xc9\x83\xdf\x49\xe0\x3b\xf7\xc6\xb7\xe3\x0d\xf6\x10\x20\xf0\xf2\xcd\x26\x4f\x9b\x6f\xcd\xc1\xef\x50\x7a\xc4\xb8\x29\xd8\xac\x15\xc0\x47\x79\x1e\xad\x3a\x8c\x1d\xc6\x7d\xf0\x3b\xff\xb2\x9b\xe6\x1f\x4e\x4e\x7f\x78\x79\xe2\xbf\x91\xb6\xe6\x9a\x5d\xde\xa0\xe1\x48\x6f\x41\x8f\x33\x97\xdf\xdd\x6f\xff\xf0\x57\x6d\x2d\x56\xb7\xdd\x24\xd1\x0d\xf8\xd5\xc2\xb2\x14\xda\x27\x18\x38\xb0\xb7\xa9\x2d\x6a\x9a\x0a\xd8\xe0\x5c\xac\xe9\xae\x1b\xf7\xeb\xba\xd9\xa5\x07\x1f\x01\x09\xf0\x91\x1d\x88\xb0\x3d\x58\xfe\xd8\xda\xde\x82\xd8\xaf\xaf\x54\x15\x93\xea\x21\x9b\x42\x00\xa5\x50\x89\x2a\xe8\x86\x95\x28\xa1\x41\xd3\x1b\x07\xf2\x1b\x8d\xe4\x45\x82\x7f\xb5\x45\xfd\x02\x15\x93\xdf\xa8\xe3\x2f\xd4\x51\xc3\x94\xd7\xe8\x22\x6c\x65\x2e\xf9\x4f\x50\xe5\x9c\xff\x0e\x1a\xe9\xaa\xa7\x4a\x2b\xea\x92\xdb\xa8\x71\x35\x10\x76\x00\xa4\x58\x4f\x3d\x18\x74\xae\xaf\x52\xad\x33\x50\x72\xc9\xff\x16\x56\xf7\x85\xb7\x8f\xc9\x08\x00\xa3\xc3\x3d\x7b\x29\x77\x53\x20\x05\x86\x9d\xd6\x94\x01\x58\x1e\xce\x18\xd5\xf5\xa1\x8d\x1f\x45\x10\x50\x39\x81\xe2\xc4\xbe\xe8\x4d\x00\xe5\x8d\xe0\x5a\xfc\x1d\xed\x04\xbf\xfc\x9e\x27\xa0\xed\xeb\x1e\x88\xe6\x8c\xe0\x7f\xca\x2a\x43\xbd\x4b\x52\xa2\xfb\xce\x92\x07\x04\xf2\x9c\x57\xdb\x9c\x27\x28\x58\xcf\xa0\x8d\x79\x2a\xf6\xa5\x86\x50\x72\x5e\x16\xb7\xec\xf3\x84\xbc\x39\x80\x00\xc3\xdc\x4a\x8b\x5f\xaf\x4d\xbe\x4a\x0f\xe2\x32\x84\xb9\x6b\x7a\x58\x19\x35\x29\x1b\xc2\x3c\xc7\x54\xf0\xe7\x6a\x97\x07\x33\x37\x47\x3a\xa7\x92\x9a\x20\x29\xdd\x62\x30\xc0\x63\x80\x65\xa3\x2b\x5c\x96\xab\xd3\xb9\xa2\x7f\xb1\xb6\x01\xe9\xcb\x42\xe5\x98\x93\x8b\x87\x34\x0e\x4a\x48\x51\x82\x0c\xc0\x9f\xa5\xa5\x66\x48\xc4\x6e\x4e\x8e\xcc\x6c\xe3\x2c\x0e\xb0\xe6\x8e\xdc\x05\xa6\x1b\xa8\xaf\x85\x4c\xac\xf0\xef\x41\x94\xd1\xdd\xce\xcb\x15\x25\x94\x08\xd5\xcb\x79\x87\xd0\x8d\x23\x93\xde\xa6\x48\x33\xaa\x56\xe6\x01\xe0\x95\x28\x3c\x94\xa1\x49\x50\x19\xe8\x44\xc8\x83\xcf\x0d\xb8\x74\x82\x6d\xda\xe8\xfa\x2b\x3b\xd1\x78\x96\xdf\x2c\x60\xde\xde\x64\xaa\xbe\x83\xdc\x03\x4e\xc7\x4b\x0f\xc6\xde\x8f\x11\x1b\x15\x8f\x2c\xe9\xc1\x39\xd0\xc1\x15\xb7\xea\x33\x96\x1c\x85\x0a\x54\xd6\xd3\x10\x76\xc4\x2d\xaa\x87\xba\x27\xb3\xbe\x75\x55\x34\xa2\x8e\x15\x77\x22\x55\x1e\xa1\x10\x93\x39\x9b\x1d\x3d\x32\xb8\x60\x04\xd7\x13\x65\x38\x43\x85\x13\xef\x0e\x92\xaa\x90\x58\x90\x19\x44\xea\xf5\xb8\x9c\xd0\x4e\xa8\xa2\x15\xed\xcd\xbd\x9b\xbf\xed\xde\x37\x0c\x87\x00\x0a\x8b\x08\x37\xe7\x14\x13\xdb\x3b\x8a\x10\x79\xee\x68\x6e\x4c\xf4\x02\x77\x0b\x7a\x85\x51\xec\x6a\x84\xd9\xa2\xf2\xeb\xb7\x7b\x2f\x31\xd7\x28\x36\x18\xf2\xdc\xd6\xba\xb0\x2b\x53\x37\xee\x4a\x4f\x0f\x98\x56\x19\xf6\x67\xca\xb4\x46\x7a\x51\x1b\x46\x12\x2d\xd4\xb6\x80\xb4\xe1\xd2\xe9\xd8\xc0\xa0\xe4\x4c\x16\xe8\xe7\x02\xa7\xbc\x0e\xfc\xe3\x8f\x4d\xae\x6e\x5a\x55\x7b\x44\x4e\x47\x01\x91\xca\xca\x94\x0a\x30\x28\x42\x79\x9a\x3b\x0c\x49\xfc\xf5\x07\x0e\xb7\x78\x04\x34\x86\xda\x10\xb1\xbd\x65\x59\x38\x45\x66\xeb\xf6\x1b\x3a\xc4\xe3\x45\x6e\x35\xfb\x7f\x09\x5c\xd5\xbf\xfe\xfc\x9d\xff\xa4\x3f\x9c\xdd\x0c\x8f\xa7\x00\x01\xf6\xf2\x1f\x84\x00\xf6\x38\xfe\xd7\x8f\x6f\x4e\x5e\xfe\xd4\xc6\xff\x3a\xfd\xe9\xc7\x7f\xe1\x7f\xfd\x33\xfe\x9c\xdd\x0c\xd5\x74\xb5\x72\x42\xb5\xe5\x1c\x0c\x90\x5e\x2f\x29\x41\xe0\xdc\x53\x9b\xfa\xb2\x1d\xb7\x69\x4e\x52\x75\x78\xe6\xae\xc3\x0a\xf8\x59\x6e\x6a\x0f\x17\x1b\x97\x76\x48\x5f\x2c\x01\x74\x34\x4c\x1f\x04\xf4\xf3\x99\x11\x08\x21\x50\x23\x17\x8a\x25\x76\xa1\x45\x6c\xcf\xf3\x41\x73\x63\x88\x06\x80\x5c\x9d\x68\x38\x03\xcb\x3a\xa3\x99\x93\x5d\xea\x43\x28\x58\x0b\x89\xfa\xad\xf4\x08\x8a\xa1\x9d\xc6\x0d\xf1\x8c\x48\xf8\xe0\x1e\xf0\xc3\x29\xeb\x2f\x67\x80\x48\x88\x20\xad\x51\x0b\xa8\x1c\x2d\x76\x50\x0d\xe1\x3f\xef\xd3\x55\x5a\x0f\x07\x3e\x52\x77\x1b\x85\x24\x4d\xf1\x6a\xe8\xf2\x2b\xe8\x72\x98\x50\xd9\xd7\xa8\x63\xaa\xd3\xa9\xe0\x8c\x7a\x74\x44\xd0\xcb\xe8\xcd\xc4\x7b\x64\x40\x31\x0b\x5e\x15\x42\xb5\x21\x3d\xa4\x5c\x85\x6e\xbe\x4e\xd5\xe1\x28\x00\xb3\x44\x55\x01\x97\xc6\x99\x14\xb6\x5e\x73\xdf\xb5\x5a\xf3\x8f\x38\x99\x31\xdf\x11\xac\xb7\x40\xfd\x64\xb4\xc6\xcc\xdc\x9b\xbc\xdc\xac\xe3\xc0\xd8\xaa\xcb\xd5\xe4\x41\x5e\x28\xff\x30\x74\xef\x47\xd7\xbd\x6f\x66\xb9\x05\xf0\x33\xee\x47\xb4\x51\xc1\x10\xd8\x21\xf2\x8a\x80\x3a\x98\x95\xdb\x6a\x69\xe0\x91\xf0\xb9\x37\xa9\x3a\x1c\xbb\x83\xa3\x73\x75\x8e\xbd\x33\x95\x5c\x19\x41\x07\xe6\x74\x27\xdc\xc3\xbe\x4e\x31\x63\xf3\xa7\xf3\x0d\x1e\xbb\x68\x95\x35\x24\x99\xf3\x3a\xfa\x06\x75\x26\x6a\x18\xba\xf4\x53\xaa\x0e\x2f\x74\xe5\x0c\x1b\x77\xbb\x87\xa9\x46\x77\x17\x68\x02\x44\x98\xd8\x1a\x78\x59\x75\xd6\x15\x0d\x84\x25\xb5\xae\x6e\xdd\xe3\xc2\x41\x15\x03\x04\x5c\xc4\x29\xfe\x27\xe9\xcf\xae\x2b\x84\xc4\xea\xe7\x44\xc0\xd8\xca\x27\x4f\xfc\xb3\x72\x61\xee\xf4\x3d\x0b\x13\x8f\x66\x00\x98\xb9\x9e\xf9\x78\xad\xbf\xd9\xf5\x76\x0d\x60\x21\x00\xb7\x84\x8a\x59\xe2\xd3\x84\x98\xfb\xd9\x06\x62\x4e\x4b\xb3\x0d\x5f\x82\x9c\x24\x89\xfb\xac\x97\x38\xbf\x09\x26\x03\x13\x6d\x13\xbd\x4a\x4c\x13\xcb\xb2\xb8\x37\x3b\x93\xa9\x98\x86\xfe\x24\xfd\x25\x55\x87\xd1\x11\x3a\x14\x20\xe7\x92\x70\x0a\x58\xed\x73\xd3\x44\x8c\xc0\x81\x2d\xdf\x75\x0a\xe2\xa9\x94\xe3\x4a\x6e\xb2\xde\xc3\x8e\x48\x4f\xc4\x25\x1c\x0b\x3c\x64\x9d\x8b\xb7\xb7\xe0\x8c\x04\x2b\xae\x36\x15\x65\x92\x83\x82\x98\x28\x1d\xc7\x51\x6c\x2d\xca\x00\x87\x44\x04\xf4\xd4\x48\x98\x6c\xb5\x1f\x4f\xab\x33\x84\x3d\xdd\x0f\xed\xbe\xc7\x76\x81\xf1\xdd\x17\xb2\x86\xa2\xd4\x22\x46\xcb\xf8\xce\xef\x9f\xa4\x27\x2f\x53\x75\x18\xbd\xc5\xeb\x26\x0f\x20\x01\x1c\x21\xd2\x12\x0b\x25\x38\x1c\x78\xac\x6c\x2b\xa3\xe6\x7b\x0e\xb0\x5b\x8b\xd6\xfd\xe2\x51\x1e\x93\xf6\x26\xb6\x81\xf8\xb3\x0f\xe9\xdc\xe3\x61\x22\x95\x76\xb4\xfc\xf1\x11\xee\x3b\xb5\x27\x78\xef\x5f\x69\x38\x50\x67\xb9\xb6\xeb\x68\x17\x6f\xf0\x17\xc0\xc7\x75\x54\x0f\x12\x55\x94\x0f\xaa\x7c\x28\xb0\x9e\xc1\x1d\x08\xcc\x1d\x0a\xe7\x28\xdc\x1b\x1c\x5c\x80\x44\x71\xaa\x7a\xe3\x72\x37\x2a\x8f\xa2\xb0\xe1\x06\x48\x24\xb7\x35\xb6\x83\x37\x91\x68\x3d\x88\x0a\x37\x10\x38\xc8\xf2\xb2\x3c\x71\x23\x10\x53\x2f\x45\xf2\x06\xfd\x68\xe8\x3f\x58\x87\x5a\x42\x31\x49\x40\x0f\x8d\x7a\x4c\x1c\x32\x23\x6a\x11\x91\x86\x9f\xe7\xee\x11\x20\x32\x15\x1c\xf7\x89\xda\xe4\x5b\x3a\xf4\x01\x2a\x0e\xa2\x3b\x2b\xbd\x8c\xa8\xe4\xe9\xd0\xb9\x6d\xb3\x69\x6a\xcf\x44\xc9\x81\x1a\x49\x56\x89\x84\x9a\x02\x16\x0b\x6d\xd5\x70\x9f\x11\x80\x33\x0c\x1b\xf6\xa5\x77\x88\x58\x82\x51\xd2\x95\x85\x9a\x63\x7d\xeb\xba\xd9\x3c\x21\x57\x88\x61\xd2\xe4\x39\x93\x13\x07\x2d\x2e\xbe\x3a\x78\x12\xbd\xe2\xf2\xa2\x26\xd0\x65\x2c\x35\x91\xc7\x80\xa0\x0d\x7c\xa1\x6a\x28\x86\xd1\xd5\xf2\xce\xde\x6b\xc8\x10\x58\xb7\xd0\xe5\x45\xe8\x5a\x65\x86\xdf\x23\xf5\x33\x33\xc7\xf8\x2e\xd6\xfa\xd1\xd1\x84\xe8\x65\x66\x9c\x4c\x0f\xf0\x74\x98\x78\xb9\xbc\x73\x57\xa4\xd8\x30\x4e\x23\xfc\x52\x6e\x89\xb4\xe2\x4b\xb9\xad\x04\x6b\x47\xeb\x1a\xd7\x14\x0d\xa4\xeb\xdc\x7c\x73\xfa\x31\x38\x29\x24\x3b\x53\x00\xee\xc0\xec\x70\x5f\xc9\xc4\x50\xda\x74\x79\x26\x3d\xcc\x77\x31\x4f\x4a\xfb\x86\x55\xb6\xae\xb7\x3e\xee\x42\x88\xde\xea\x8d\x3b\xb6\x1f\xca\x4a\x76\xce\xba\xad\x85\xe3\x0a\x84\xfa\xc5\x8e\x7b\xce\xda\x00\x6c\xb5\x3a\x21\x57\x85\xfb\x47\x0e\x12\x02\xf6\x93\xe5\xc0\xfc\x12\x58\x30\xfc\xce\x84\xf1\x7c\x29\xb7\xd8\x28\x15\x16\x05\x6d\x20\x6c\xf1\x44\x1d\xd2\x3b\x7c\x0c\x8f\x34\x96\xd4\x6f\xca\x07\x37\x4f\x04\x71\x01\x2e\x44\xfc\x3b\x5c\xef\x18\x53\xc5\x88\x5a\xc5\x2e\x6b\x77\x30\x0b\x7d\x1b\x88\x48\xb7\xde\x36\x08\x77\xfe\x02\x79\xca\x81\xf6\x57\x1a\x27\x30\x9e\xa3\xc5\x00\xc4\x55\x55\xdf\xd9\x0d\x14\x50\x95\xe8\x4f\x76\x67\x71\xd5\x40\x3d\xe7\x12\x88\xfd\x7e\x7c\xf9\x3b\x4f\xac\x5f\x6e\x1b\x77\x35\xc3\xa1\x07\x58\x40\x50\xab\x17\xa6\x30\x2b\x0b\xc6\x51\xf4\x49\xd1\x2b\xce\x70\x96\x27\xa0\x25\x73\x4f\xd3\x13\x3c\x25\x5d\x35\xf0\xa3\x93\x6c\xfb\x7e\xe9\x64\x2d\x4b\xbf\x1a\xb2\x70\x40\xcb\xcb\xb3\xe3\x07\x48\x6c\xab\xca\x9d\xce\x9b\xdd\xf1\x0a\x30\xdb\x8b\xb2\x38\x36\xdf\x96\xf9\x16\x68\x5b\x04\xf2\xf9\x02\x02\x73\x98\x28\xc4\x36\x19\xc8\x2a\x60\x44\x76\x7b\xde\x9d\x3c\xe3\x7e\x8a\xc2\x58\xe8\x03\x6e\x25\x71\x77\xf4\xbf\x40\x07\xe2\x48\x28\xd2\x24\xc1\x11\xd6\x32\x33\x6b\x5d\x7d\x1d\xb4\xe4\x79\x77\xa8\x98\x2f\x05\xa5\x61\x58\xde\x1b\x18\x07\x33\x5b\x6f\x72\xbd\x4b\xb8\x58\x4d\x72\x10\xb6\x11\x68\xbb\x72\xee\xa8\x47\xeb\x1d\x10\x9d\x71\xe5\xef\xab\x96\x55\x44\x01\x50\x49\x7d\xa2\x84\xce\xfd\xce\x3d\x20\xe6\x68\xc1\x73\x84\x77\x6a\x4d\x97\xaa\xb2\xc5\xaa\xb2\x90\xba\x4a\xfa\x34\xde\x39\x09\x79\x3c\x9d\x2c\x37\x39\x83\x4c\xb4\x94\x03\xf2\xfb\x25\x94\x6c\xa1\xdd\xcf\xb6\xc8\x44\xad\x97\xc8\xff\xef\x5e\x46\x21\x04\x58\x08\x08\x19\xab\x73\xe3\xfb\x1f\x8c\x76\x37\x87\x65\x28\x02\x7b\xc6\x14\x09\xdd\xec\x68\x39\x90\x5e\xca\xc0\x6a\xc1\xf1\x3c\x96\x50\xa7\xe9\x89\xdb\x2f\xcc\x6b\x08\xc9\x3d\x2b\xaa\x12\x64\x88\x22\x48\x45\xed\xae\x3f\xf2\xbb\x84\x95\x6c\x29\x4b\x7b\x41\xcb\x5a\x27\xcd\xf5\x36\x1b\xa8\x49\xd9\xb8\x95\xf5\x07\x5a\x76\x90\x13\x2c\x81\xc5\x82\xf6\xaa\x88\x1d\xd3\xd8\xde\xaa\x93\x01\x4c\x28\x5c\xb3\xa0\x8d\x02\xdc\x06\xb2\xc4\x7b\x35\x38\xea\xe4\x3b\x75\x3a\x08\xec\xd8\xfb\x9e\x29\x2b\xf5\x0a\x3f\xcd\xdb\x03\x61\x86\x40\x1a\xba\x9d\xf2\x56\xd9\x81\x48\x85\x59\x3e\x62\xd0\xbb\x8f\xd0\xc3\x4f\x1a\xff\x92\xc1\x9b\x2f\x50\xb8\x59\xef\xed\x32\x80\xb9\x9c\xa6\xa7\xa9\xbc\xe6\x59\x40\xcd\xbe\x5f\x8a\x24\xe8\x59\x90\x1f\xfb\x3b\x08\xb4\x7f\xb4\x68\x8a\xdc\x3a\x7f\x47\xa9\x14\x7b\x6c\xd0\xc1\x95\x61\x79\x59\x6b\x92\xfa\x25\x16\x73\xd6\x15\x18\xbd\xf0\xb9\x19\x0b\x5d\xdb\x3a\x91\xab\xdb\x96\x65\x2d\x2f\xc0\xdf\x26\xdb\x9e\x27\xda\x92\x96\x6c\x7b\xc4\x2d\x26\x47\x4e\x63\xd4\x39\xd4\x84\x62\x3f\x6d\x11\x6d\x6d\x18\xa7\x33\x8f\x7a\xbc\x7b\xf1\xcc\xf1\x2d\x2d\xde\x1e\x08\xb1\x0a\xeb\x8a\x12\xb4\x2d\x3d\x85\xc4\x7d\x44\x90\x82\x84\x78\xe6\xc0\x7a\x97\x14\x66\xda\x89\x8c\x9e\xe3\xfb\xcc\xef\xfe\x6d\xb3\xf1\x4c\x11\xef\x19\x65\x4e\xd3\x53\x16\xef\xee\xaf\x8f\x4a\x78\xd9\x21\x94\xed\x6b\x28\x74\x89\xbd\xcd\x7d\xc6\xd9\xb3\x45\xf9\xe9\xf7\x8a\x72\x04\x5b\x61\x71\x1e\xc9\x25\xa8\x95\xc1\xaa\x0d\x2f\xb7\x7b\xe6\x74\x8f\x84\xef\x7d\xf2\x59\x42\x3e\x48\xd2\xd8\x0e\x2d\x57\xbd\x4b\xba\x5f\xde\x7f\xcf\x86\x69\x5d\x02\x47\x81\x2a\x5a\xfa\x58\x7a\xda\x1f\x04\x9c\x67\xba\x36\xde\x61\x35\xcb\xd3\x22\xa2\xed\x81\x6d\x45\x64\x9f\xd7\x7d\xc6\x26\x8d\x9c\xce\xd3\x45\x6e\x6f\x63\x7f\xcf\x2b\xa7\x6f\x0f\x37\x3e\x95\x13\x12\x61\x44\x3d\x41\xab\x39\xb4\x92\xa0\x62\x14\xc4\xb2\x42\x6a\x36\xf1\x63\x1f\x83\x80\x1d\xff\x2c\x2f\xe9\xe3\x5e\x11\xb9\x8d\xbb\x06\xb4\x30\x0b\xa3\x79\xeb\x49\xd5\x83\x12\xed\x27\x94\xa3\x67\x99\x9c\xde\x67\xd8\x31\x3a\x51\xc5\x84\x1a\x80\x2d\xa4\xb0\x76\xb9\xd7\xc4\x77\x60\x87\x31\xe0\x63\x48\x6b\x95\xc3\x8b\x71\xcb\xd2\x88\xeb\x1c\x65\x31\xe2\x66\x30\xab\x29\x0d\x0a\xfd\x43\x7d\xf3\x84\x79\x2d\x79\x03\xb8\xbe\x95\x87\x40\xa9\xd9\xaf\xc0\xb0\x11\x8f\x90\xd1\x37\x11\x42\xec\x0b\xcf\x7c\x6c\x2a\x03\x13\x22\x32\x9f\xb8\xbb\x7e\x22\x0a\xef\x2e\x05\x02\x63\xca\x69\xf3\xf8\x64\xd0\x89\xf0\x00\x7d\x39\x72\x24\xf2\x6c\xbf\x4a\x7f\x0c\x7b\xf8\x34\x55\x43\x41\x6f\xe1\x7a\x2d\x63\x14\xe0\x2f\x8d\x1c\xb9\xdf\xb3\x8f\xa9\xc0\x0c\x8f\x5a\xf0\x9e\xd8\x28\x0e\x82\x0e\xb4\xa7\x76\x57\xd0\x4c\x7c\x7d\x13\x14\x61\x81\xf7\x59\x7a\xaf\x24\xbd\xee\xbd\xfb\x7d\x11\x42\x41\x4f\x86\x94\x28\xd3\xce\x69\x06\x30\x26\x62\xaf\xc6\xfe\xf7\xb6\xe2\x47\xf5\x8e\x89\x25\x5b\x83\x75\x7d\x78\xb2\xdd\x04\xa7\x8a\x2a\xf0\x62\x3f\x93\x47\xdc\x6b\x1e\x4c\x7e\x6f\xd4\xd1\xc9\xe9\x80\x4b\x02\x03\x77\x20\xdc\x87\xb6\xe1\xa8\x04\x40\x2a\x2c\x21\x61\x99\x3f\x86\x30\x23\xfc\xb1\xda\x7e\x53\x47\x6f\x5a\x1f\xd2\x22\x86\xd1\x01\xff\x12\xa1\xc5\x68\x43\x78\x28\x8b\xd6\xc0\x1b\xc2\xb3\x0f\x1b\x1e\x0f\x21\xa6\x5e\xd5\x9b\xb2\x08\xc9\x2f\x90\x8e\xe7\x21\xae\xda\x47\x99\x7b\xc2\xe9\x79\xa1\x0d\x09\xc3\xf1\xf4\xe2\xda\xba\x05\x32\xd1\x1b\x40\x7e\x95\x3a\xe1\x6f\xd0\x95\xda\x1b\x00\x0e\x62\x0a\x9d\x4b\x3a\xcf\x63\x11\xba\xef\x3c\x90\x47\x56\xfb\x14\x56\x7f\x90\x7d\x4d\x01\x81\x2f\x7c\xe1\x5d\xe7\x5e\xc1\x73\x46\xf7\x54\xac\x64\x87\xb5\x67\x9c\x37\xf8\x40\xda\x27\x49\x43\x39\x62\x4f\xba\x79\x2b\x58\xc3\xd9\xb9\x49\x80\x93\x16\x8e\xb5\x7c\x97\xa0\x5e\x12\x1b\x7f\x6d\x52\x85\xae\x01\x8e\xbe\x67\xbe\xb1\x1a\x40\x27\x0d\x11\xb5\xde\xf8\x25\x7b\xf9\xc4\x86\x48\xbc\xf1\x4f\xee\xfc\x80\x33\xb2\x57\x14\x70\x3d\x52\x8c\xe4\x65\xa5\x3c\x63\x61\x29\xb2\x0c\x41\x15\x91\x2e\xb9\x7d\x7a\xe4\xab\xf4\x75\x0a\xd9\xbb\xde\x42\xbc\x62\x0b\xf1\x52\x37\xee\xce\x88\x4d\xca\x39\xec\xbb\x2b\x50\xca\x50\x93\x81\x4c\xc6\xb6\xba\x18\xf0\x3b\x28\xab\x32\xe6\x12\x8b\xf6\xef\x8b\xfa\x71\x13\xd5\x0a\xa0\xa3\xa6\x64\x7f\xb3\x91\x01\x49\xd6\xc7\xfb\x0c\xc6\xe8\xc6\x76\x6a\x3a\x24\xa0\x9f\xa6\xa7\x49\xf4\x58\x6b\xcf\x41\x11\x1f\xec\x74\x9f\x24\x2a\x4f\x76\x94\x00\xc2\x6c\x9c\x17\xa3\x8f\xc3\x8b\x43\x5a\x18\x5e\x14\x4a\xa7\x70\x53\xe5\xf7\x3d\xe9\xb4\x21\x55\x04\x7f\x0d\xb9\x6f\x01\xba\x8d\xa8\xec\x71\xfe\x02\x34\x1b\x54\x24\xb9\xf9\x45\x31\xcf\x47\x73\xd9\x74\x16\x02\xf1\x30\x89\xc2\x23\xac\x48\x90\xbd\xed\xb3\xd3\x12\x84\xed\x12\xf9\x70\x0f\xb7\xe6\x0e\x13\x4a\xdd\x31\xdd\x34\xf9\x4e\x02\x3d\xc1\x94\xe0\x3c\x52\x5e\x27\xb1\xe7\x44\x53\x0f\xb6\x8f\x10\xc0\x22\x8a\x56\x70\xba\x2a\x82\x34\xa0\x6e\xde\x98\x4d\x1d\xd8\xd9\xdc\x21\x5a\x21\x02\x8d\x08\x92\xac\x09\x49\x38\xc7\xcc\x48\x28\x36\xae\x6f\xab\x72\xbb\xa9\x07\x21\x5d\x70\xa7\x96\x3a\x77\x77\x43\xc3\x48\x59\x70\xa9\x13\x63\xf8\x5d\x19\x78\x0a\x3a\x51\x32\x58\x98\xc2\x3c\x88\x99\xf5\x37\x0a\xce\x7c\x00\xe2\x20\x57\x81\x1c\xf4\xf0\x6a\xdc\x39\x3a\x2f\x5a\x11\xda\x48\x89\x12\x0a\x3b\xe1\x39\xad\x11\x7f\x8e\xa3\x6a\x6e\xae\xf6\x9f\xc3\x72\xd5\xb2\x01\x59\xb3\xc7\x6b\xcd\xcf\x47\x80\x24\x73\xd3\xc1\xac\x1b\x38\xda\xe1\xd5\xb8\xe7\xd0\x40\x29\x10\xf7\x14\x53\x9a\xbb\x68\xc7\x61\x23\xb4\xec\xea\x6b\xb3\xa9\x4c\xcd\x82\xad\x8e\xdd\x6b\x15\xff\x12\x53\x87\x13\x15\x8c\xb1\xcc\xd6\xcb\xbc\x74\x2a\xf9\x66\x5b\xd5\x5b\x8d\x10\xb0\x61\x8b\xbe\x06\x63\x1c\xed\x5f\xf9\x49\xe2\x74\xab\x3b\xe6\x53\x67\xf2\xdd\xc4\xc4\xbf\xf7\x19\xdc\x9c\x63\x75\x54\x0f\xd8\x09\xd2\x9e\x79\x71\x92\x49\x48\x71\xf2\x46\x6f\x26\xc5\x9e\x78\xb4\x53\x79\xd5\x35\x4b\xbf\x09\xe2\x64\x8b\x4b\x32\xdb\xe2\xae\x40\x69\x18\xae\x93\x10\x58\xe7\x14\x26\xcc\x28\xee\x98\x1b\x02\x21\xc6\x19\x18\x3e\xb3\x17\x08\xd1\xa9\x6e\x52\xdc\x52\x52\x99\x8a\x54\x61\xd0\x09\xb6\x06\x43\xc4\x75\xc8\xde\xa0\x24\xf4\xce\xad\xde\xf9\x70\x5e\xd2\xe6\x16\xac\x8b\x5c\x4b\x4b\x77\x79\x59\xed\x06\x84\x90\xaa\x09\xac\x9c\x13\x82\x73\xfb\xd5\x60\x05\x47\x5e\x96\x5f\x89\x1e\x4e\x94\xe2\xc0\x30\x83\xee\x9f\x21\x0a\x74\x85\xc1\x2f\xb9\xec\x6e\x45\x3d\xdd\x43\x96\xc9\x02\xba\x3a\x4e\x6b\xe3\x14\x1c\x1a\x44\x24\x29\x43\x62\x52\x18\x39\x92\x47\x88\xf5\x6a\x31\x7a\x17\xbb\xd6\x1d\xcf\x99\x5d\x72\x9e\x71\xf4\xd1\xa5\xdf\x63\x97\x45\x97\x3f\xfd\x0c\xf4\x08\xaa\x9e\x89\x14\x01\x3f\xdc\xe5\x5d\x59\x22\xe3\x0f\x18\x67\x94\xb6\xc7\xc1\x62\xa8\x46\x00\xa5\x37\xf1\xf8\x8e\x89\x44\x10\xcf\xcc\x1a\x12\xd2\xca\x4a\x09\x62\xc1\xe0\x7e\x80\x0f\x8b\x59\x8f\x01\x8d\xe3\x2e\x75\xac\xc9\xac\x54\x75\x89\xe6\x7c\x09\xbb\x09\x6b\x8a\x17\xe6\x4e\x03\xb2\x46\x81\x85\xf2\x25\xff\x68\xbf\x66\x46\x9e\x2e\xe9\x37\x09\x6b\x04\xb9\xe4\xb6\x51\x7a\x51\x97\xf9\x16\x8a\x2a\x00\x6f\x1f\xfd\xe3\x08\x99\xbe\xbc\xfb\xab\xc6\xef\x4e\x18\xcc\x2b\x1e\x76\x30\x28\x72\x40\x0d\x62\xff\x01\xb9\xff\x01\x32\x07\xef\x22\xf8\xe4\xea\x31\x9d\x14\x5d\x09\x91\x3b\x91\x99\xcd\x7d\x1f\x6c\xb1\xdc\x56\xd5\x63\xda\x2d\x9f\x16\xf9\x9d\x16\xe8\xe0\xf3\x87\x8c\x66\xb0\x1b\x10\x0c\x37\x48\xb2\x37\x5d\x94\x64\xa1\xf2\x92\x13\xad\xee\xe5\xd6\x69\xfb\xc7\xc4\x7b\x98\xc5\xe2\x36\x06\x99\x53\x11\xcd\x51\xb9\x12\x57\xc2\xc9\xf1\xab\xf4\x47\x41\x4e\xc3\x04\x1c\x1d\x03\x25\x61\x93\xd8\x75\x25\xe8\x84\x74\xd2\x9d\x11\xf2\xa4\xc9\xd7\x97\x57\x63\xa5\x92\xf3\x84\xdf\x20\xca\xb2\xa1\xc3\xee\xad\xba\xbb\xf2\x81\xd2\xa3\x58\x1a\xc0\xa0\x56\xdb\x7c\x65\x11\x6b\xdd\x19\x02\xe2\xe8\x45\xd3\x40\x2e\x35\x1a\x0d\xbb\x3a\x96\x65\x51\x6f\xec\x92\xb9\x24\x04\xf5\xfc\x33\x0c\x95\x64\x8f\x99\x02\x11\xc2\x1c\x8a\x3d\x75\xbe\xc7\x68\xe9\x91\x5f\x52\x56\x75\x0c\x97\xbe\xfd\x01\x66\x74\x8f\xf9\xb4\xea\xa4\x78\x76\xe4\x22\x1b\x24\xbe\xd8\x76\x85\xe2\x05\xd3\x77\x12\x26\x95\xd5\x3b\x6f\x01\xe3\x7a\x85\x62\x2b\x72\x74\xcb\xb5\x8b\x61\xa9\xd9\x79\x80\xc1\x1a\x46\xfa\xf5\x76\x45\xbf\xdf\xc8\x73\x4f\x88\xc0\x83\xbf\x12\x7a\xc6\xea\xb1\xa9\x05\xb6\x1d\x78\x54\x41\xe2\x79\xe4\x21\x3f\xdb\x2f\x6a\x6f\x5f\x75\x53\xf5\xf8\xa3\xde\x87\x4f\x8f\xd6\x78\x62\x9a\x3b\x1f\xdc\xf6\x8e\x63\xba\x5f\x9f\x5e\x94\xfd\x60\xde\xcf\x12\xc3\x8d\x70\x7a\x92\xa5\x85\x30\x31\x9d\x65\x40\x2e\xb5\x5e\x91\x0b\xb8\x8c\x8f\x48\xc3\xde\x1b\xe2\xff\x6a\xf9\xec\xef\xa6\xbd\xe2\xf7\xa7\x54\x06\x32\x85\x9c\x25\x37\x4d\x14\xe7\xc4\x1c\xa2\xf5\x02\x13\x56\xa3\x43\x24\x82\x24\xdf\x97\x19\xdd\x17\xf7\x95\x4d\x62\x3a\xae\x2d\x6e\x73\x4f\x49\x0b\xe5\x69\x51\x3d\x58\xbc\x47\xa8\x16\xb6\x2b\xf4\x3b\xfb\x20\xc8\x46\x0f\x3d\xda\xf6\x86\x80\x23\x44\xe0\xfd\x9e\x41\xee\x9a\x3a\x47\xad\x76\xd6\x68\x28\x0d\x2c\x2b\x75\x6d\x6e\xb7\x98\x82\x08\xef\x79\x05\xba\x55\x18\xf7\x25\x14\xba\x31\x7f\x0e\x81\x49\xec\x9f\x22\xa2\x62\xa8\x37\x94\x4d\x50\x13\xc4\x99\x48\x9c\x8b\x16\x83\x54\xee\x1a\x3b\x97\xa8\x3f\x6f\x33\xca\xc7\xaa\x18\xd3\xb9\xf2\xbd\x8d\x55\xf1\xb7\xe0\xcf\x91\xbd\xdb\xdf\xad\xc7\xb3\xcd\xdf\x79\xb7\x56\xe4\x89\x0a\xf1\x9c\xda\x7b\x3e\x28\xc0\x68\x76\x4a\x43\x60\x34\x55\xb3\xad\x77\x96\xe0\xfd\xc6\x17\x92\xbc\x82\x5a\xae\x84\x3d\x5e\x89\xd7\xc8\x15\xde\x7e\xdf\x67\x1e\xf6\x16\x9e\x46\xb6\x10\x21\xa3\xd3\x70\x79\x98\x44\x67\x41\xfe\xa5\xb0\x0f\xc2\xcc\x26\x04\x78\xdc\x33\x8c\x60\x07\xe6\x3b\xf2\xe9\xf8\xda\xdd\x08\x6f\xbf\xac\x32\x5b\x00\x14\xf8\x57\x9b\xe7\x54\x6d\xcc\x0e\x69\x10\x9a\x10\xe5\x05\xf4\x1f\x04\xee\x6b\xc5\xf0\x3a\xf6\x63\x04\xee\x05\xfe\x03\x43\x28\x28\xd2\xd5\xdb\x2f\x72\x9c\x09\xab\x9b\x86\x71\x6b\xfb\x6d\x4b\x32\x10\xf8\xee\xef\x9c\xa8\x37\xa9\x57\xeb\x7c\x91\x77\x6c\xdf\x42\xd6\xe6\xc4\x3c\x08\xf5\x4f\x16\x6e\x11\x6a\x86\x93\x52\x80\xf0\x52\xbb\xc3\x81\xb8\xd3\x64\x76\x17\xe6\xa1\x43\x63\xc7\x43\xc6\x1b\xc1\xae\x71\xff\xda\xb5\x5b\x60\x67\x0a\xf3\x4d\xf4\x40\x90\x4d\x08\xbf\xa0\x61\x7f\xd8\xe2\x76\x6b\x6b\x40\xf6\xe7\xc7\x8a\xed\x7a\x11\x04\xe9\x1b\xa7\x3f\x8d\x10\x90\xb2\x5c\xb5\xfa\x3e\x2d\x96\xad\x03\x1a\xb8\x8d\xb1\xff\x82\xd8\x41\x98\xd2\x2d\xad\xd1\xeb\x11\x81\x78\x10\x10\x6c\x9c\x06\x62\x0b\x3c\xf2\x5b\xe0\xb9\xe8\x57\x23\xb5\x0f\x82\xb4\xb8\x0b\x83\x89\xe7\x5e\xa7\x3b\x45\xf4\xb6\xe7\x6b\x78\xb1\xf4\x07\x57\xc2\x54\x87\xd1\x2d\x76\x3d\x2b\x08\x1c\x58\x60\xfc\x85\x6c\xa3\x9e\x75\x66\x00\x10\x5f\xec\x22\x3c\x89\xc4\xd0\x1e\xc2\x95\x2d\x3b\xd6\x5b\xf6\x3d\xc4\xec\x7e\xe9\x5e\x11\xa7\x22\x92\xae\xd0\x3d\x18\x79\x06\xdc\xb9\x86\xd0\xc8\x7e\xde\x34\x0f\x32\x86\xe7\x87\x61\xa0\xc0\x06\xc9\xca\x08\xad\x01\x71\x25\x6c\xe3\x4f\x9d\xaf\x94\xf8\xee\x0a\x85\x81\xb8\xfb\x9c\xe0\xae\x0c\x78\x25\xbe\x44\x90\x71\x65\x50\x19\x37\x77\x95\xae\x4d\xad\x0e\xc3\x3c\x1f\x26\xf0\x2f\xfa\x9f\xab\x8b\x43\x0f\xe0\xbf\x2c\x8b\x15\xa4\x26\xe5\xbb\xc0\xfb\x04\x1f\x10\xc4\x3d\x4e\x01\x63\xb8\x26\x6e\x91\xb3\x23\x1a\x78\x4a\xe2\x52\x78\x14\x13\x8b\x8c\xb2\x1d\xf5\x2c\x64\x42\x46\xd5\x93\xb0\xab\x85\xb6\x07\x03\x6c\xed\x3a\xfe\xb6\xaf\x80\xd9\xaf\x0e\x1a\xb5\xb7\x10\x34\x55\x47\x1f\x08\xfb\x9c\xae\x98\x47\x63\x3a\x49\x37\xbb\x50\xea\x63\xfc\x89\xc7\xbc\x41\x02\x79\x01\x5b\x61\x20\x8a\x85\x7b\xc3\xac\x3d\xc8\x44\x27\xdd\x25\xda\xce\x03\x62\xae\x3a\x1f\xcf\xce\x2e\x86\xe3\xcb\xd1\xb5\x9a\x7e\xf0\x6c\x20\xb0\xdb\xcf\xa6\xbf\x8e\xae\x47\xe7\xea\x6c\x7a\x3e\x52\xe3\x99\xba\xba\x9e\xfe\x3a\x3e\x1f\x9d\xf7\x40\x62\x2a\x60\x48\x56\x87\xc3\x99\x1a\xcf\x0e\xd5\xfb\xe1\x6c\x3c\x4b\xd4\xe7\xf1\xfc\xd3\xf4\x66\xee\xbf\xea\x5a\x18\x4e\xbe\xa8\x7f\x1b\x4f\xce\x13\x35\x1a\x03\xf6\xe6\xe8\x0f\x57\xd7\xa3\xd9\x6c\x74\xae\xa6\xd7\x6a\x7c\x79\x75\x31\x1e\x9d\x27\x6a\x3c\x39\xbb\xb8\x39\x1f\x4f\x3e\x86\xaf\x5c\x8c\x2f\xc7\x73\xe0\x5e\x4e\xf8\x8b\xe3\xd1\x4c\xcd\x3f\x0d\xe7\xc0\x06\xd0\xee\xee\x87\xeb\x11\x30\x05\x9c\x8f\x3e\x8c\xce\xe6\xb3\x44\x5d\x8e\xae\xcf\x3e\x0d\x27\xf3\xe1\xfb\x8b\x51\xa2\x3e\x8c\xe7\xea\xc3\xf4\x5a\x0d\xd5\xd5\xf0\x7a\x3e\x3e\xbb\xb9\x18\x5e\xab\xab\x9b\xeb\xab\xa9\x1b\xce\xb5\x9a\x4c\x27\xc7\xe3\xc9\x87\xeb\xf1\xe4\xe3\x78\xf2\x31\x85\x26\x46\x93\xf9\xf8\x7a\xa4\xae\xc7\xb3\x7f\x53\xc3\x99\x9a\x4f\xe1\xa7\xff\xe3\x66\x78\x31\x9e\x7f\x01\x14\xd1\xab\xd1\xf5\x87\xe9\xf5\xa5\x64\x29\x68\xf7\xcb\x8d\x47\x7d\x99\xde\xa4\x6a\xf6\x69\x7a\x73\x71\x0e\x53\x12\x3d\xe4\x26\x7a\x44\xfd\x1e\xff\x3a\x52\xe3\x09\x3c\x73\x3d\x9a\x5d\x8d\xce\xe6\x89\x7b\x59\x1d\x4d\xa6\x38\xec\xf1\x64\x3c\x1f\x0f\x2f\xd4\xf9\xe8\xd7\xd1\xc5\xf4\xca\xad\xe3\x35\x3c\x3e\x85\xe9\x3d\x9b\x4e\x10\xcf\x74\x7a\x3d\x50\xc3\xd9\xec\xe6\x72\x44\xbd\x9a\xcd\x79\x3d\x26\xa3\xb3\xd1\x6c\x36\xbc\xfe\xa2\x66\xa3\xeb\x5f\xc7\x67\x30\xed\xd7\xa3\xab\xe1\x18\x3e\x76\x36\xbd\xbe\x76\x3d\x99\x4e\x52\x5c\xf4\xfe\x3d\xe3\x9a\x9a\xcd\xc7\xf3\x9b\xf9\x68\xe6\x36\x83\x5b\xd4\x09\x74\xcd\x4d\x30\xce\x46\xd8\x31\xa9\x9a\x4c\xd5\xcd\x6c\xc4\x7d\x68\xcf\xd2\xf0\x66\xfe\x69\x7a\x3d\xfe\xf7\xd1\xb9\xfa\x34\xba\x1e\xe1\x96\x1b\xfd\xe1\x6c\x74\x35\x97\xfb\x2f\x74\xc5\x33\x8c\x8d\xae\x2f\xc7\x13\xd8\x27\x2c\xb3\x7f\x4e\x99\x22\x28\x36\x8c\x3b\xa1\x3f\x9f\x8b\x82\xd7\x3a\x62\x50\x80\x5d\xb3\x6d\xca\xb5\x06\xbc\x38\x74\x12\x39\x31\xba\x82\xd0\x5a\xac\x9c\xa3\x10\xc1\x92\x46\xa4\x91\xe1\x87\x9c\x95\x01\x97\xe5\x02\x20\x8f\x19\x32\xf7\xd5\x4b\x95\xb9\x6b\xb9\x5c\x21\x1e\x2f\xf8\x6a\x30\x73\x18\x65\x08\x3e\x9e\xaa\x61\x9e\x8b\xfc\xd7\xba\xcf\xad\x21\x82\x31\x18\xff\xcc\x77\x7e\x68\x28\x35\xea\x6d\x75\x6f\xef\x43\xce\x4f\x94\xce\x2c\x2d\xf1\xab\xaa\xbc\xb7\x75\xc8\xdd\x4a\xc8\x2a\xb3\x15\x51\x6a\xc6\x49\x1b\xb6\x60\x7c\xed\x85\xd9\x95\x34\xb9\x8f\x34\x10\x77\x27\xac\xd3\xa9\xbf\x49\x31\x95\xa3\x71\x72\xba\x61\xef\xe7\x02\x4a\xc1\x4c\xe5\xd9\xf7\x1b\x84\xc4\x0a\xe9\x7f\x14\x04\x3d\x82\x9c\x66\xf0\x7b\x65\x66\x99\xeb\xa6\xac\x76\xce\xac\xb9\x5d\x23\x85\x21\x88\xc4\x81\xaf\xe0\xea\x37\xdf\xe3\xf4\xd2\xbd\x46\x75\x64\x4f\xd3\x07\x21\xa8\x0a\x5b\xc4\x59\x1a\x68\x7b\x2e\xd9\x81\xeb\x6b\xe7\x1a\x00\xdb\x3e\xbc\x02\x15\xce\x6e\x74\xd1\x1c\x0e\x9c\x8d\x61\x6e\xd9\x33\xd8\xaa\x12\x81\x0f\x89\xc7\x5f\xf4\x67\xa5\xf6\x27\x2d\xf8\x79\x92\x25\x88\x1e\xf6\x3e\x54\xe9\xee\x89\x86\x8b\x66\x5d\xc7\xdd\xe0\x7a\x82\xe2\xa4\x50\x9f\xa6\xa7\xfd\x2b\x9e\x20\x92\xf6\x1b\xda\xf4\x74\xd1\xc1\x35\x1b\x35\xe0\x0f\xde\xa6\x2a\xc1\x8e\x05\xfe\xd8\x84\x39\x8b\xec\x8a\x8f\x0f\x7f\x09\x23\xbd\x10\x68\xdd\xc0\xc5\x48\x9f\x76\xfd\xc4\xec\xa9\xb7\xea\xc8\x0e\xc8\xf1\x22\xb8\x8c\x00\x07\x7f\x17\xb5\xae\xd5\x7a\xdb\x20\xb2\x24\x3c\x0e\x9a\xa2\x00\x87\xa1\x14\x7a\xb6\xcf\x2b\xb5\xd1\x35\x42\x64\x52\x02\x20\x71\x01\xf5\x67\x5c\xb6\x67\x13\x0b\xaa\xac\xc5\x8a\x99\xac\xd2\x0f\xac\x8f\xf9\x7d\x8f\x9b\xba\x6d\xd6\xef\xc9\x20\xf5\x9b\xb0\xdd\x10\x1c\xad\xd6\xb4\xf9\x89\x4a\x62\x6e\x0b\x1e\x22\x80\xd7\xe9\x1d\x1e\x1b\x84\x8f\xa7\xbf\xa3\xcf\x26\x9e\xa8\x0c\x57\x57\xcc\x2e\xb9\x72\x98\x89\xcc\x23\xfd\xb4\x86\x46\xba\x2c\x4f\x40\x91\xec\xc9\xcb\xf8\xee\x4d\x18\xcb\x6d\x21\xcf\x1b\x32\xce\x37\xb6\x8a\x0a\x3a\x70\x62\x78\xf7\x10\x71\x0a\xe2\x89\x59\x66\x98\x6a\x05\xe4\xc1\xb8\xa1\x4c\xdf\x44\xdd\xe9\x2a\xc3\xbf\xf9\xca\x8f\x44\x5a\x2c\xcf\x3b\xc3\xfb\x32\x8f\x9e\x3a\xc4\xad\x29\xa3\x39\xea\x3b\xc3\xdd\x79\xc3\xb1\x44\x89\xe7\x95\xb9\x2f\xbf\x9a\x4c\x24\xa0\x6b\x6f\x20\x43\xde\x15\xca\x38\xcc\x3d\xa7\xf2\xa9\x2c\x51\x75\x99\x47\x10\xd8\x19\x4c\xc6\x9d\xce\xe8\xa9\x47\x52\x91\xe5\x7e\xf5\xb7\xc2\x2b\x7f\x2b\xa0\xf8\x7f\x54\xf6\xf3\xf6\x8f\x4e\xb4\x14\xaa\xff\x00\x31\x4a\x41\x14\x4c\xff\xe7\x1d\x5d\x99\xba\xcc\xef\x4d\x16\x82\xd1\x8b\x9d\x84\xe3\xac\x4d\xd3\x60\x62\xc4\x80\x70\x50\xe8\x50\xd3\xd5\x47\xbb\xb2\x6f\xa4\xe1\x00\x79\x92\x83\x48\x42\xdd\xeb\x7c\x6b\x5a\x86\xce\xe3\x22\x7d\x6f\x82\x13\xdd\xd4\x0b\x43\x0c\x2a\x80\x5b\xa8\x97\xcb\x72\x8b\x68\x94\x8c\xd4\xe5\xd3\x70\xd7\xf0\x9b\xb2\x0a\x9d\xc0\x79\x42\x21\x52\x56\x6d\x1a\xcb\x9f\x31\x79\x0c\xcf\xe3\x3d\x43\xdd\x09\xd5\xa1\xd5\xb5\x9f\xb1\x6b\x3f\xbb\xd3\x4d\x14\xb4\x79\xae\x4c\x91\x61\x34\xdf\xd7\x07\x31\xd1\x50\x1d\x69\x03\xbc\x27\x01\xe8\x1e\x70\xf5\x6b\x93\xe7\xa6\xaa\x07\xa4\x3c\x85\xc8\x1e\x10\x51\x09\x0d\x8a\xbc\xff\x64\xed\x8a\x2f\x09\xb5\x31\xac\xa3\x18\x40\xac\x7a\x89\xdf\x30\xef\x6b\xb0\x6c\x9c\x36\x7c\x31\x1e\xbe\x1f\x3b\x83\x02\x7e\x8d\xba\xee\x64\xaa\xce\xc6\xd7\x67\x37\x97\xb3\xb9\x33\x2d\x66\x60\x6b\xf8\x5f\xa1\x57\x73\xfe\x69\x34\xbd\xfe\x92\x28\x26\x35\x98\x4f\xaf\xe7\xea\xc8\x1b\x52\x6a\x32\xfa\x78\x31\xfe\x38\x9a\x9c\x8d\x06\x09\x9a\x05\x43\x67\x4c\x4c\xaf\xd1\x52\xf8\x3c\x9e\x8d\x12\x35\xfb\x34\xbc\xb8\x70\x06\x46\xd2\x6f\x5c\x24\xfd\xa6\x45\xc2\x46\x87\xa7\x4f\x98\x82\x6d\x20\xb5\x7a\xff\xcc\xec\xe6\xca\x59\x79\xd7\xac\xfa\x4f\x3f\xa8\xd9\xcd\xd9\x27\xb4\xc3\x46\xb3\x44\xbd\x1f\xc1\x24\x5c\x8c\x9c\x85\xe5\x9e\xb8\x1a\x5d\xcf\xa6\x13\x34\xd7\x26\x5f\xd4\x78\x72\x3e\xbe\x06\x4b\xc8\x19\x44\xe3\xe1\x05\xd8\x8b\xe3\xf3\xd1\x64\xee\xfe\x0e\x26\xcb\x64\x36\xfa\x1f\x37\x64\x7f\x9c\x0f\x2f\x87\x1f\x47\x33\x6f\x6a\x7c\x1a\xba\xa1\x8f\xae\x9f\xb2\x32\xf9\x3d\xd7\xee\xc5\x74\x06\x1f\xf8\x38\x9d\x9e\x7f\x1e\x5f\x5c\x24\x40\x0f\xa1\x66\xf3\xe9\xd5\xd5\xf0\xe3\xc8\xcd\xe8\xe5\xd5\x8d\xfb\xe8\x87\xe1\xf8\xe2\xe6\x1a\x6c\xc8\xcb\xe1\xc5\x87\x9b\xc9\x19\x7e\x8d\x3a\xef\x56\xce\xcd\x31\xcf\xe1\xa5\x33\x4b\xa3\x5e\x62\x63\x6e\x22\x46\xbf\x8e\x26\x6a\x2c\xa6\xe7\x0b\x2d\xd0\xa7\xe1\xaf\x23\xf5\x7e\xe4\x7e\x3b\x71\xf6\xa6\xb3\x9e\xd1\xda\xbc\x9a\xce\x66\x63\xdc\x3f\x7e\x62\xe9\xcb\x29\x1b\x60\xbd\xbb\x8d\xbe\xec\xcc\xca\xe1\xd5\xd5\xc5\x17\x37\xf7\xe1\x97\x6e\x0a\xce\x47\xc3\xf9\x27\xd7\x3d\x5c\x8e\xe1\x85\x1a\x4f\x7e\x7f\x73\x0d\x86\xe9\xcd\xc5\xdc\xed\xb1\x0f\xd7\xd3\x4b\xd1\xdb\x17\x33\xb1\xeb\xd8\x5c\x1e\xfd\x61\x3e\x9a\x60\x23\xe3\x33\x58\xe5\x8b\xe1\x67\x67\xf3\x7e\x1a\xbf\x1f\xcf\x67\xf8\x7a\xe8\x64\xaa\x66\xd3\xcb\x91\xfa\xfd\xcd\xf5\x78\x76\x3e\x86\xb9\x9c\xa9\xf3\x29\x76\xf4\xe2\x62\xfa\x99\x3e\x7a\x76\x71\x33\x83\x31\x5d\xb7\x46\x18\xb6\xc6\xde\x9d\x91\xa8\xd9\x14\x27\x27\x7c\xc7\xad\x93\xf8\xd0\xe5\xf0\x4b\x3c\x37\xce\x82\x27\x1a\x62\x75\x93\xce\x52\xf5\xd1\xed\xf5\xc9\xa5\x1b\xdb\xc8\x9d\xce\xd9\xe8\x7a\x46\x2e\xf4\x9e\x18\xbe\x3a\x5c\x86\x3a\x2d\xdb\x98\x75\x72\x88\x48\x46\x1a\xd5\x5f\xc5\xf5\xff\xe8\xfe\x79\xfd\xb3\x3a\x4b\x3f\xa4\xd7\xa9\x13\xcd\x2f\x4f\xd4\xd1\x74\xd9\xa4\xea\xe4\x97\x5f\x7e\x1c\x24\x8c\xdd\x48\x95\x80\xf2\xc3\x1d\xac\x95\x43\x90\x7a\x8f\x3e\x12\x87\xdf\xb1\x5b\x22\x2a\xa8\x2b\xc2\x2f\x8d\x7a\x75\x72\x9a\x9e\x9e\x9c\xaa\xa3\x99\xd9\x70\xbf\x20\x0b\xcf\xf5\xcb\xb3\xbd\x75\x1e\x77\x7d\x11\x23\x3b\xfd\x29\xfd\xe9\xf4\xe5\xe9\xf1\x89\x67\x41\xf3\x3f\x7a\xad\x8e\x7e\xbf\x2d\x0c\x8f\xd8\x09\x54\x9c\x74\xf0\x74\xc2\xd5\x32\x2a\x32\x75\x53\x1b\x27\xd8\x11\x36\xa5\x2f\xe4\x58\x00\x7d\x62\x59\xf7\x44\xa3\x05\x0e\xd1\xc9\x49\xaa\x2e\xc7\xb3\xb3\xd1\xc5\xc5\x70\x32\x9a\xde\xcc\xba\xa1\x90\x28\xab\x30\x50\x12\x09\x82\x3b\x41\x5e\xcc\x00\x01\x6b\xc8\x86\x56\x04\xf8\x05\xf4\xcd\x05\xb1\xe8\xec\x01\xa9\x50\x77\x26\xf7\xa8\xb1\x85\x29\x56\x65\xb5\x34\x58\xd0\x00\x6b\x12\xde\xf5\xf7\x34\x80\x9a\xae\xb9\x70\x29\x0e\x43\x45\x89\x99\xec\x28\x15\x5f\x6d\xb9\x49\xfc\x37\xa5\x43\xf9\x4c\xe7\x76\x55\x56\x85\xd5\x40\x12\xbb\x09\x9e\x02\xe1\xc8\x15\x6d\xc6\xa4\xb2\x08\x4a\x5b\xec\x92\xc0\x01\xec\x5d\xb7\x03\xc8\xcd\xa4\xab\xda\x62\x66\xe3\x2a\xb7\xcb\xe6\xb8\x5c\x1d\xc7\x6d\xa5\xc0\x4d\x21\xcd\xa1\xcc\xd6\x1b\xa8\x6a\xf7\x19\x22\xbe\xdc\xa3\x2c\x38\x5d\x1a\x4e\xde\xd2\x36\xf6\x3f\x4d\x01\xb8\x21\x70\x9b\x33\x96\xc7\xf2\x4e\x57\x0d\xec\x18\x0c\xcc\xb9\xbd\x4b\x86\x7a\x56\xaa\xc5\xb6\xb6\xc0\x08\x4c\x5e\xda\x9b\x02\xc2\x79\x33\x24\x02\x2d\x57\x6a\xb8\x36\x95\x5d\xea\x84\x42\xf3\xde\xc6\x89\x33\x51\xfa\xa6\x37\x02\x90\x30\xea\xcf\xdb\xca\xd6\x99\x5d\x4a\xc3\xe4\x83\xc9\x20\xff\xe5\xac\xdc\x56\x01\x6a\x7c\xe2\x76\xae\xa9\x0a\x4a\x8a\xc2\x70\x52\x58\x20\x2a\x5a\xbe\x37\xc5\xd6\x28\x84\x50\xb1\x85\x9a\xe9\xa2\xd1\xea\x2c\xd7\x95\x76\x9f\x83\x84\xac\xce\x3b\xa0\x39\x22\xbf\x0f\x4e\x5d\xbb\x6a\x65\x59\xd6\x4d\xfd\x14\x30\xd1\xd2\xf5\x16\x1f\x25\x75\x4b\xd2\x27\x96\x55\x61\x76\xf5\x0b\xb5\x32\x06\x7f\x6d\xbe\x6d\x40\x55\xc5\xe4\x22\xdd\x0e\x4d\xfa\x39\x9f\x90\xe9\x70\x56\x16\xf7\x44\xa5\x56\x16\xa8\xc4\xeb\xa5\x60\x1b\x45\xd2\x44\x4d\x65\x61\x33\x8d\xd9\xab\x1f\xcb\x32\x83\x8a\x00\x62\x91\xce\x77\xb4\xed\x4c\x86\x25\x5f\xc4\x7d\x2c\x82\xde\xb8\xa1\x04\x6b\x35\xe7\xd4\xe8\xe2\x76\xab\x31\x33\x5a\x07\xc0\x14\xbf\xb0\xc8\x48\xb0\x75\x96\x23\x99\x25\x60\x3a\x55\xe8\xae\x68\x61\x28\xb7\xf7\x87\xa7\x09\xbf\x1e\xcd\xae\xa6\x13\x7f\xad\xbb\xbb\x18\x9c\x9e\x28\x96\x86\xb5\x5a\x98\xe6\xc1\xa9\xac\xfd\xf9\x23\x2d\x47\x01\xa3\x06\xf8\x13\xd1\x59\x59\x2c\x2e\x85\x4c\x8b\x98\xf0\x78\x7f\x41\x0c\x73\x1d\x37\xb5\xda\x36\x36\xb7\xff\xe9\x97\x2d\x4a\x91\xea\xa4\x72\x80\x51\xc7\xc9\x30\x9e\x3c\x63\xcf\x40\xe4\x20\x5a\x1c\x38\x54\x6c\x45\x03\xa1\xbc\x49\x48\x34\x33\x7f\xd9\x5a\x4c\x1e\x82\x3a\xfe\x40\xba\x4e\x4e\x5a\x89\xce\xed\xcb\x10\xa2\x58\x8a\xc0\x74\x46\x08\xba\xb5\xad\x59\x5c\xfb\x0c\x1c\x5c\xac\x57\xa9\xba\x74\xaa\xd0\xd5\xc5\xe8\x98\x1c\xdd\xa8\xfc\x62\x92\x47\x67\x54\x90\x82\x66\x6a\x7b\x8b\xce\x2e\x51\x4a\xde\xf1\xed\xea\x5a\x1d\x5e\x6e\xf3\xc6\x6e\x72\x73\x4c\x53\x98\x1d\xa6\x7d\x3f\xf4\x48\x5d\xb4\x4b\xbb\xed\x22\x67\x76\xcd\x38\xca\xb8\x64\x4f\x74\x00\x57\x50\xe4\xb5\x79\x21\x84\x5c\x52\x60\xfd\xe5\x74\xe0\x02\x9a\x44\x1d\x24\x7e\xf0\xa3\xec\xcd\x52\x22\xd9\xda\xcd\xd0\x10\xd9\xd0\xa3\x3f\x80\xa6\xa8\x86\xea\xf8\x91\xc0\xdc\xc1\xe1\xbc\x05\xa2\x07\x9b\x0f\xbe\xac\xab\x8e\xcc\x7d\x16\xd4\x2b\xba\x81\x3d\x20\xe3\xe0\x9d\x0f\xdc\xba\x43\xec\x29\x59\xa0\x0d\xba\x0b\xf7\xe4\xeb\x5d\xb4\x89\xbf\xb0\xda\x23\x2a\xf9\x0d\x91\x71\xdd\x30\xd7\xc6\x72\xab\x4b\xe8\x65\x8a\x18\x65\xc0\x1b\x94\x16\xa6\xf9\xe1\x60\xe6\xf5\xb7\x7e\x92\xae\xa0\x53\xc4\xd5\xcd\xee\x90\x70\xe0\x8e\xa0\x2e\x1e\x0f\xdc\xc5\x1c\xfc\x82\x81\x3f\x55\x33\x63\xe2\xec\x09\xda\x17\xb4\xf2\xcb\x20\x30\x51\xa3\x10\x80\x5f\xee\x80\xcb\x6c\x9f\x4e\xcf\x91\x61\x2c\x8e\x9f\xda\x5a\xfd\xe9\x59\x7f\xf0\xe5\x1e\x07\x7e\x1f\x8e\xcb\x23\x5f\x4d\xd5\x15\x9f\x11\x01\x30\xd2\xff\x2c\x15\x7f\x30\x3a\xfb\xd1\xd9\x80\x1e\xdc\xf7\x75\x0c\xf2\x5c\xe3\x7c\x5c\x9b\xda\x54\xf7\x26\x4b\x0f\x84\xd8\x3b\xaa\x07\x6f\x9f\x3d\xe2\x61\x38\x8c\x4e\x44\x37\x7b\x8f\x03\x15\xbd\x6f\xeb\x7e\x46\x4d\xf7\x0f\xec\xb7\x8f\xd8\xc3\x31\xf8\x8f\x3f\xfd\xe9\x4f\x7f\x54\xfe\x30\x24\x41\xf3\x22\x2a\x04\x23\x95\xc3\x72\xa5\xfe\x03\x7b\xf6\xc7\x28\xa9\x4e\xa8\x87\xc4\x9e\x87\x6d\x42\x69\x3a\xb8\x5b\x99\x8e\xf5\xc1\xd6\x77\x10\x34\xc9\xf3\xf2\x81\x9d\xec\xbb\x4e\x68\x9f\x47\xb5\xbf\x6e\xdf\x60\x4f\xfe\x18\xdd\x44\xc0\x9f\xc0\x1f\x0f\xbc\x59\xae\x99\xfd\x6d\x84\xcf\x43\x32\x44\xe2\x19\xb9\xf1\x9d\xcc\x2c\x51\x39\x5f\xec\x08\xe0\x93\xbc\x64\x62\x5e\x02\x5f\x2c\xd1\x3d\x40\x4c\x3f\x48\x0a\x41\x03\xe3\x89\xf8\xf9\x5d\x09\x83\xc9\xc3\xfa\x63\x94\x4e\x2b\x78\x4c\x08\x58\xa9\xaf\xf9\x24\xca\x23\x63\x1e\xc2\xa7\x86\x2d\x80\x0f\x61\xf4\x7c\x09\xc4\xbd\x38\x3c\xf8\x8f\xc9\x74\x3e\x7a\x0b\x2a\x5d\x44\x6b\x18\x52\x1a\x30\x13\x1b\x89\x1a\x73\xb7\xfd\x03\x47\xa3\x7c\x87\x27\xa3\x37\xdd\x38\x62\x48\x88\xce\x73\xc4\x20\xda\x4b\xb0\x18\x7a\x52\xe9\xe0\xaa\xf7\x8f\xad\xca\x6d\xe1\x53\x08\x63\x51\xd1\x2a\xe5\xc7\xeb\x31\x2e\x98\xfe\xe3\xbf\xc8\x01\xfe\x5f\xfd\x93\xfe\x30\x9d\x5d\x1c\x9f\xa6\x27\xff\x20\xec\xff\xff\xef\x49\xfc\xff\xd3\x57\xa7\xaf\xdf\xb4\xf0\xff\x4f\xde\xfc\x74\xfa\x2f\xfc\xff\x7f\xc6\x1f\x50\x38\x36\xa6\x50\x5e\xb7\x22\xa9\x76\x0f\x7e\x38\x64\xf4\xed\x7d\xa0\xad\x29\xca\xd4\x59\x48\xe0\x66\x29\x02\x36\x8f\xb3\x1e\x91\xe4\xf3\xce\x6e\xe8\xd5\xa9\x64\xfa\x39\x1c\xa8\x07\xb8\x11\xa1\xf4\x24\xfa\x78\x59\x1d\x0e\x20\xe9\x11\x2e\x0f\xb4\xf6\x56\x25\x13\x40\x72\xc6\xad\x20\x6d\x0e\xbf\x6c\xfa\xd8\x63\x58\x65\x8b\xda\x7f\x7b\xc0\xc6\x85\xb8\xf2\xfa\x07\xee\xb9\xda\xd2\x13\x30\x89\x06\x88\x6f\x87\x75\x34\xdc\x96\xbf\xa2\x78\x0c\x7f\x0b\x6e\x1d\x00\xc4\x6d\x4c\xb3\xd5\xb9\x84\x88\x43\x8f\x53\x48\x3e\xcf\xca\x78\x6e\x38\xb9\x42\x0f\x30\xff\x98\xf0\xe7\xba\x83\x47\x1d\x7e\x63\x4d\xfd\x8e\x89\xed\x07\xc8\x2a\x65\x36\x88\xa9\xef\xb3\x41\x91\x31\xf2\xe8\xb0\x9d\x20\x7a\x38\x00\xee\x5b\x0a\x90\x77\x5a\xe0\xef\x2e\x07\x2d\xb3\x96\x0a\xdd\xdb\xb7\x1a\x53\xdd\x74\x12\x51\x3d\xad\x19\xcc\x82\x70\xe5\xe0\x8d\x5f\x32\xe8\x37\x7f\x35\xfe\x62\x59\xf5\x7c\xd0\xe3\x32\x0a\x63\x9b\x6d\xe4\xfc\x99\x9b\x82\xc7\x97\xe1\xbc\x21\x9c\x5f\xcf\x90\xb0\xdb\xf9\x4e\x22\xe4\x19\x9e\x93\x4d\xae\x77\x8f\xbc\x83\x20\xb1\x62\xb7\x5d\x49\x98\xeb\x7f\xde\x56\x4b\x68\x32\x24\xc6\x77\x1d\xc0\xbd\x23\x70\x60\x61\xde\x70\x09\x21\xe0\xbd\xad\x17\x65\x66\x4d\x57\xe5\xe0\x12\x97\xd5\xb6\x2a\x7c\xa6\xb4\xfc\x46\x1f\xfa\x5e\x0f\x7c\xe9\x33\x77\x13\x82\x81\x89\x29\xed\x03\xe0\x25\xbd\xae\x5a\x7f\x27\x5a\x78\xdc\xfc\xe3\x70\xe1\x3e\x39\x29\x94\x3e\xc6\x35\x82\xe4\x2a\x00\xb7\x0e\x72\xa9\x8a\xac\xef\x69\xcc\x99\xd6\xde\x07\xe0\x7e\x8a\x68\xe2\xb4\x5a\xeb\xe5\x9d\x2d\xcc\x71\x65\x74\x46\x84\x50\xfd\x40\x5b\xfd\x27\x33\x2f\x19\xac\x1a\x99\x3f\xc4\xcb\xf1\x93\xb0\xe4\xbe\x43\x02\x9b\x55\x74\xb3\x42\x43\xb0\x95\xd5\x5e\xeb\xc6\xd6\x2b\x4a\xef\x16\x15\xc2\x8b\x1d\x5c\x04\x98\x21\xf7\xec\x61\x60\x4d\xa6\x84\x5c\xa8\xcc\xa6\xac\x2d\x24\xce\xed\x05\xba\x40\x2f\x92\xb2\x05\xfa\x6d\x2d\xd9\x31\x80\x47\x50\x58\x4c\xb5\x03\xd6\x61\x0a\x9d\xaf\xb0\xe4\x0c\x66\x47\xd7\x61\x84\x5c\x92\xd0\x76\xea\x75\xe6\x8b\x58\x1f\x7d\x21\x87\xc0\xfe\x42\x57\x04\x15\x2e\xec\x19\x08\xf8\x57\xbe\xff\x46\xc4\x73\x19\xee\xef\xee\x9e\x82\xca\xaf\x81\x1a\xa1\x98\x70\xdb\xf6\x83\xb3\x5e\xf8\x4a\x24\x80\xd7\x89\x30\x98\x0a\xbd\x46\x09\x1c\x4e\x6e\x51\xb6\x7e\x45\x49\xf5\x91\xcb\xb3\x67\x4a\x0a\xca\x48\xc0\x65\xb5\x02\x78\xb5\xc6\x34\x93\xea\x1e\x6a\x74\xdd\x0f\x92\xc8\xd6\x07\x2a\xc8\xac\xac\x6a\x22\x78\x28\xd7\x65\xe3\xcb\xe6\xea\xc0\x51\xea\xb3\xee\xe3\xcd\xcb\x0e\x7f\x76\x04\x61\xf2\xc3\x43\x65\x9b\xc6\x14\xb8\x39\xea\x6e\x9d\x47\x59\x05\x17\x6c\xab\x00\xb4\xcf\xf9\x8a\x68\x17\x22\xb7\xc9\x4d\x82\x1f\x60\x12\x56\xab\x4e\x48\xe4\xd6\x09\x3e\xa0\x6a\xb3\xac\x0c\x22\x19\xc0\xfc\xc0\xe4\xf7\xa3\x04\x89\x85\x10\xf0\x20\x21\x3e\x00\x98\x51\x9e\xaa\x44\x4d\x1e\xc1\xc2\xec\x93\xc0\x40\x10\x4d\xf4\xfb\xf0\x03\x94\xf0\xbe\xd2\xb0\xcd\x09\x51\xcb\x8c\x31\x91\xc3\x93\xf1\xaf\x45\x64\x38\xc0\x1c\xba\x6e\xe1\xc6\x8d\x7b\x03\x76\xac\xd8\x13\x72\xac\x04\x21\x86\xd4\xe6\xf0\x6b\x2c\x32\x8e\xcb\xe6\x5a\x12\xf4\xc9\xe5\xb3\x9e\xc9\x35\x23\xb9\x8a\xf6\xb5\x6f\x17\xb6\x14\x0e\xca\x7d\x08\x6f\x4c\x41\x3d\x09\xbe\x9a\x9e\x62\xdc\x62\xf7\xa8\x00\x0d\x45\x20\x0f\x81\x76\x5c\x07\xa1\x29\x53\x8f\x7e\x74\xe7\x15\x1c\x64\xb9\x3a\x37\x9b\xbc\x84\x04\x25\x79\x9d\xf5\xfc\x5a\x5e\x6b\x5b\x3c\x36\x59\x0b\x8e\xa0\x2b\xe4\xfb\xd4\x2a\x2a\x89\x7f\xd0\x5c\x71\xcb\xbe\xfa\xa7\x5f\x95\x27\xd8\x5d\x5f\x88\xd8\x27\x36\xcc\x97\x72\x1b\x70\xfc\x9f\xf7\xcd\xb6\xdb\x18\x76\x8d\xb3\x37\x90\x1f\xb7\x46\xd2\x80\x36\xb0\x53\x0b\x51\xc8\x87\x51\x56\x54\xff\x54\xde\x1b\x66\x17\x85\x0c\x83\xc2\x34\x0f\xb0\x81\x86\x44\xba\x8d\x72\xc3\x93\x18\x7b\xdb\x83\x54\x33\x88\xaf\xe0\xca\xfb\x14\xab\x44\x86\x8c\xb8\x92\xbb\x67\xa5\x7c\xba\xd6\x8a\xe9\x58\xc3\x78\x3b\x72\x46\x77\x08\xc7\x7b\x74\x5c\x74\x0e\x3e\x8d\xb9\xe0\x4c\xb1\x4a\x86\x2e\x98\x8c\xf7\xe4\x68\x39\x90\x59\x06\x6f\x06\x6a\xd8\x84\x56\xd1\xef\x2b\x80\x44\x2a\xd3\x68\x5b\x24\x7d\xce\x2e\x92\x19\xfb\xb5\x75\x74\x4e\x27\x8c\x96\x85\x22\x32\xe9\x43\xe7\xf6\x3e\x35\xef\x70\x7b\x4a\xbf\x81\x21\x02\xa3\x89\xae\x05\xb0\x83\x58\x2f\xe4\xbc\xcf\x30\x51\x8e\xeb\x59\xef\xc9\x9b\xf6\xff\xb3\xf7\xae\xcb\x6d\x23\x59\x1a\xe0\x7f\x3d\x45\x86\x62\x37\x2c\x6e\x40\xb0\x2e\xae\x72\x97\xdd\xd1\x31\xb4\x44\xd9\xac\x96\x49\x0d\x49\x95\xdb\x33\x31\x31\x93\x24\x93\x12\xda\x20\xc0\xc6\x45\x2c\xf6\xc6\x3e\xcf\xc6\xfc\xd9\x87\x98\x27\xdb\xc8\x73\xc9\x3c\x09\x80\x92\xaa\xab\xab\x6a\x66\xda\xfa\x51\x65\x89\x20\x90\x99\xc8\xcb\xb9\x7c\xe7\xfb\x84\x74\x57\xc5\x85\x12\x25\x26\x21\xc4\x68\x20\x4d\x51\x7c\xd8\xa4\x1b\x6c\x85\xfd\x68\x77\x7f\x6a\x28\x50\x0d\xa3\x28\x76\x01\x17\x60\xfb\x89\x4f\xd2\x7a\x09\xca\x19\xf7\x08\xa4\xb3\xe6\x5a\xbf\x6e\xfb\xe0\x75\x4f\x7d\x22\xfe\x13\xf0\x4e\x8a\xfc\x81\xc4\x9a\xc1\xf4\x4e\x4a\xd8\xda\x31\x25\xc1\x17\x0a\x2b\x90\xb8\x53\x44\x56\xcf\xdb\x29\x54\x6a\xd2\x65\x1e\x08\xba\xb8\x4a\xd0\x48\xc9\x82\x97\x04\x8c\x46\xf7\x20\x28\x3d\xd9\x66\x1d\xfe\x09\x7d\xe8\xdd\x9e\x65\x08\xc2\xde\xbb\x26\x84\x1b\xda\x32\x0a\x16\x41\x72\xc3\x87\xfe\xfd\xb9\x4e\x20\x74\xd1\x7c\x57\x63\xdd\x75\x46\xd3\x6a\x91\xf6\x1d\xc8\x22\x19\xd4\x1d\x31\x76\x93\x5a\x90\x28\x6c\xc3\xcd\x2f\x3d\xe7\x46\x47\xba\x3a\xcc\x94\x41\x89\x1b\x34\xad\x99\x2c\x7b\x24\x41\x26\xe0\x12\x51\x27\x5e\xc2\x36\x8a\xde\x34\x79\xe8\xa2\x0c\x6d\xf0\x71\x30\x9a\xc9\x32\x36\x84\x03\xe4\x85\xba\x1a\xce\x46\x83\xe9\x74\x6f\x3d\xdb\x73\xaa\xd7\x08\x3f\x38\x9e\x0c\xdf\x0f\x47\xfd\x6b\x84\x37\x06\xe5\x6a\x10\xed\xda\x53\xfb\xb5\x10\xda\xcd\x76\x6b\x2f\x4b\x52\x4c\xf2\x7c\xd7\xb2\xbc\x68\x94\xcb\xc8\x4c\xeb\x35\xb4\xeb\xb1\xc8\x28\x13\xaf\x65\xe9\x56\x0c\x56\x7e\xf5\xd4\xb5\xe7\x7e\x06\x1b\x87\x33\xf3\xea\x16\xbe\x95\xe5\x6a\x91\x14\x8b\x7a\x8d\xfa\x70\x38\xaf\x6a\xfe\x08\x15\x7f\xaa\x7b\x93\x17\x42\x05\xc7\x4e\xa6\xbc\xa8\xd4\x91\x87\xb9\x64\xe6\x2e\x4d\xee\xec\x1c\x42\xe4\x1d\x20\x3e\xa2\x86\x46\x0e\xd1\x0d\xca\xd5\x03\x47\x89\x13\xef\xcc\x76\x2c\x3d\xbf\x72\x80\x62\x54\xed\xf1\xfa\x3d\x90\x34\xd5\x29\x4c\x1a\xd8\x34\xed\xbf\xd1\x5d\xa2\x4a\x6a\x3b\xc0\x0c\xd1\xf0\x14\xa8\xb6\x41\xf6\xe0\x45\xcc\x46\x93\xe4\xa3\x8b\x96\xb9\xee\xd0\x2d\xa1\xc8\xd7\xa3\xd3\x95\x9f\x6d\xfb\x90\xe6\xe8\x80\xdd\xe5\xf9\x72\x9b\xa4\x69\x84\xa1\xcd\xb2\xca\x37\x1b\x7d\x67\x22\x6f\x06\xac\x74\x92\xd6\x28\x8d\xb1\xd6\xe9\xaa\xce\x16\x78\x37\x1a\x08\x27\x17\x48\xf4\x20\x0e\xa9\xe8\x7a\x8a\x0f\x43\x98\x50\x52\x4a\xce\x6f\x89\xc8\xe8\x82\xd7\xf8\x0f\x57\x50\x9e\xa1\x51\xa3\x06\x5f\x05\xb0\x0b\xfd\xb9\x06\x8f\xd7\x8e\x96\x1d\xbc\x95\xf7\xe3\x80\xbd\xcf\xbf\xfd\x47\x51\x6e\xce\xe4\x25\xe8\xa4\x6f\x62\xac\xa6\xf9\x3a\x84\x78\x95\xae\x3e\x1a\x72\x8f\x78\x53\xf2\x24\x11\x30\x2f\xfb\xe7\x27\xc3\xde\xb9\x10\x61\x11\x37\x20\x9c\xf8\x3e\x61\x7a\xdd\x61\x16\xdc\xc8\x7c\xce\x6b\x84\xa3\xf7\x54\x1f\x18\xa3\xdd\xd1\x34\x13\x80\xf5\x0e\x86\x9e\xc7\x42\x94\x50\x46\xd7\x38\x99\x9b\xf4\x2b\x41\xdd\x91\x59\xad\xec\x72\xf3\xe7\x49\xb8\x62\xab\x9c\x71\x12\x54\xbd\x03\xfb\xab\x86\xcd\x06\xb0\x46\xe2\x6c\xce\xf7\x9f\x47\xde\x83\x31\x69\x69\xd4\xbc\xae\x1a\x45\xf9\x52\xb9\x8d\xdc\x59\x8f\xeb\x64\xb0\x95\x3f\x31\x11\xc7\xd4\x93\x11\x45\x71\xd0\x79\x12\xe3\x96\x8d\xf2\x58\x4c\x98\xa8\xc5\x1d\x53\xad\xa0\x7d\x69\x1c\xe2\xc2\x09\x3c\xa5\x13\x3d\x72\xe6\x97\x60\x72\x42\xfe\xbb\xc6\x4e\xba\xef\xc8\xfe\x5b\xc7\x20\x80\xd5\x85\xac\x27\x00\xd8\xf5\x56\x0b\x80\x41\xe1\x3d\xfe\xa5\x4e\x1e\x74\x0a\xee\xb4\xde\x42\x53\x78\xed\xd7\xd6\x38\x30\xa5\x8b\xfb\x24\x01\xa0\xaf\xb2\xc3\xba\x03\x97\x0d\x95\xfc\x23\x54\xd1\x77\x5a\x72\xfb\xc7\x8c\x0c\x97\xce\xa1\xc3\x0f\x28\x8f\x0f\x09\x5d\xed\x57\x44\x17\x1f\x11\x11\xeb\xd8\xd5\x4e\x18\x69\x8c\x82\x2d\x49\x0e\xba\x0b\x54\xeb\x6b\xd1\xa4\xa5\x62\xbf\xe8\x21\x45\x10\x29\x83\xc3\xef\xc9\x39\xe0\x2b\xbd\x82\xd6\xc1\xd4\x82\x2e\xf0\xa6\x5b\xe5\xea\x3e\xe7\x50\x13\x67\x05\xe4\x30\x34\x9c\x94\xd3\x93\x9e\xdc\x01\x60\xdf\xa4\xc8\x7a\x7f\x81\x7b\xc2\xa3\xbd\x0b\x2b\xf0\x9c\xcc\xc1\xdf\xa9\x7f\x1d\xe5\x68\x70\x60\xe0\xde\x45\x45\xb7\x21\x0d\xde\xa2\xc8\xcb\xf2\x18\xab\xb4\x72\x9a\x63\xa6\x80\xdf\x23\x87\xd2\x0c\x6c\xde\xcc\x95\x6d\x99\x46\x25\x59\xd7\x81\xe9\xaa\xc3\xc8\x66\xa5\xf1\x91\x05\x41\x4d\xd0\xb6\xdf\x88\xd1\x18\xe0\x62\x61\xf7\xb0\xae\x1a\x30\x47\xae\xa5\x03\xc8\x5e\x3b\x44\xd7\xa1\x48\xc5\x45\x8a\x04\x76\xef\xa9\xef\xc5\x71\x14\xa9\x1f\x00\x2f\x6c\xdf\xd5\x7b\x87\xd2\xba\xd6\x5b\xd2\xad\x75\x2a\x82\x65\x9d\x54\xfb\xc1\xcd\x14\xa6\x98\x03\x90\xbf\x22\x76\xc5\x8c\x6c\x7e\xc6\x30\xeb\x10\xeb\xbc\x25\x7f\x24\x30\x9c\x0a\x53\x22\x4c\xbc\xf0\x00\x23\x19\x3a\xc6\x60\xa5\x5d\x7c\x9b\x22\x59\xeb\x62\xe7\x90\xda\x91\x30\xf1\x10\xad\xbb\xf5\x31\xe2\xe0\xc1\xcf\x87\x9d\xff\xa6\xc0\xe4\xbd\x76\x5a\x5e\x57\x76\x90\x10\x6b\xb7\xc8\x37\xed\x7d\xca\x4e\x2c\x00\x1d\xf3\x2e\x15\x56\xa7\xb5\x41\xe8\x01\x1b\x1a\xb8\x60\x26\xd3\x69\x25\xce\x7a\xd8\xcf\x7d\x4e\xb7\x6f\x6d\xd6\xd3\xd7\xf0\xe7\x8b\x58\xfd\xd7\xff\xab\x4e\x4f\x4e\x95\xa9\x54\x69\xfe\x12\xff\xb4\x9d\x7e\xdf\x36\x9f\x94\x2e\x98\xd2\x28\xaa\x7b\x9c\x6e\x80\x90\xd4\x10\x6f\x41\xd0\xb9\xba\x32\xd6\x7e\x1c\x52\xed\x3b\xde\x13\xe2\xe1\x50\x0b\xf1\xc8\xc1\x08\x21\x75\x03\x99\x2a\x36\x48\xfd\x1a\xb0\xf3\xb7\xca\x23\x4e\x7b\x3d\x10\x7f\x38\x42\xad\xdd\x48\x43\xb9\x41\x6a\x88\xf7\x6a\x01\x61\x32\x9c\x77\x8c\x93\x67\x20\xfc\x93\x0e\xe3\x13\x80\x7a\xbc\xa3\x23\x07\x84\x44\x76\x96\xd1\x10\xc2\xe6\x20\xc8\x09\x82\x7d\xd2\x8e\xca\x66\x63\x34\x9c\x6c\xe2\xa2\x9f\xff\x1a\xce\x7b\xea\x63\x52\x2e\x4c\x9a\xea\xcc\xe4\x75\xf3\x78\xfc\x49\x85\x35\xd5\xbd\xf9\x1f\x54\x5c\x03\xdd\x7f\xd5\x53\x97\x5e\xba\x38\x5f\x39\x6d\xd9\x60\x18\x58\x4a\x97\x0a\xa1\xf2\x86\x89\x1a\x78\xa8\xf5\x86\xa8\x28\xd2\x7c\x6b\xd7\x12\x70\x1c\xfe\x06\xba\xbb\x3f\x55\x3a\xd7\x09\x90\xff\xad\xca\xb9\xbb\xbf\x4d\x39\x37\xf9\x2d\x95\x73\x93\xa4\x21\x9d\xdb\x29\x98\x4b\xf4\xd6\x7b\x85\x73\xf9\x5e\x49\xef\xd9\xfa\xb9\xa7\xdf\xf4\x30\xc4\x6c\x7b\x77\x2b\xa1\xe7\xdc\xd1\x16\xe8\xc5\xbe\xf1\x2d\xf1\x74\x88\xdc\x0a\x8b\x3f\x39\x40\x03\xda\xb9\x6d\xba\x31\x90\xf7\xdd\xa1\xa1\x6f\x27\x94\x3b\xb5\x21\x00\x5b\x12\xd7\x2c\x84\x56\x2b\x53\xac\x4c\x61\x9c\x6a\xec\xbc\x2d\x93\x03\x1d\xaa\xed\xb7\x30\xb4\x1f\x1f\x90\xf7\xef\x96\x73\x88\xb5\x3e\x3b\x39\x39\x3f\x3e\x3b\x39\x79\x65\x6d\x97\x02\x4c\xc2\x41\xac\x26\x79\x69\x32\x04\x5a\x3b\xa2\x60\x02\x5a\xab\x1b\xef\xb4\x25\x65\x00\x13\xe1\x42\x90\xcd\xae\x4d\x40\x2a\xda\xc0\x3b\xb4\x84\x30\xb8\x20\x85\x37\x8b\x80\x39\x56\x04\x8c\xf9\x6b\xd2\xa9\xed\x4e\xa3\xe2\x29\xc1\xbd\x84\xf7\x1d\x7f\x85\x97\xfe\x62\x3f\xf1\xcb\x41\x56\xd9\x3d\xfd\x37\xc3\x7f\x9e\xbc\x3a\x6f\xe1\x3f\xcf\xce\x5f\x9d\x7e\xc5\x7f\xfe\x1a\x3f\xf4\xf6\xf7\x54\x04\xc5\xea\x34\x3e\x39\x10\x9b\xce\x02\x37\x1d\x45\x5f\x8b\xd4\xf5\xf5\x45\xf7\x56\x73\x30\x31\xad\x8c\x63\x8d\x1a\x0e\x58\xd7\x83\x01\x0f\xe4\x72\xb5\x16\x87\xd3\x9f\x2d\x3a\x37\x99\x08\x49\xbf\x00\x8f\x63\x37\xab\x90\x3b\x3c\x84\x84\xfa\xc0\x04\x7c\x69\x6d\x90\x66\xea\x34\x56\x61\xa3\x50\xd1\x14\x5b\x03\xbc\x93\x22\x29\x89\xa8\x1b\xa8\x5c\x68\xc2\x65\x22\xde\x12\x4b\x38\x22\xe5\xd3\xb2\x26\x3a\xb5\x11\xc3\x3f\x6b\x37\x21\xc9\xe4\x28\x70\x13\x24\x54\xf3\xef\xd9\x0a\x76\x50\x43\x70\x99\x54\xa8\xb5\x56\xa6\x29\x12\x9d\x8a\x5c\x91\xcb\x6e\xc9\xa6\xb3\x90\xa6\xf5\x17\x4d\xb6\x3c\x06\x72\x92\xa6\xfe\x96\x24\x17\x46\x9f\x4b\xde\xc2\x17\xce\x05\xaa\x27\x61\xe3\xf5\x82\xe5\x79\xec\x8d\xe1\x4d\x1e\xc2\x81\x43\x30\x1e\x6f\x79\xe5\x1b\xe3\x66\x97\xaf\xf5\xa7\x4a\x28\x38\xbb\xed\x15\xd3\x41\xff\x5a\x1d\x51\xb5\xd9\x76\xbb\x8d\x73\xf0\x44\x74\x1a\xe7\xc5\xdd\xcb\x5e\x7c\x08\x25\xa7\x54\x59\x44\x75\x45\x49\xd9\x68\x06\x92\xc5\x3a\xb6\x4f\xb0\xd2\xf9\x89\x49\x55\x9a\x74\x45\x7d\x23\xf9\x01\xeb\x00\x11\x0c\x22\x29\x96\xc7\xe8\x2e\x85\xb7\xb4\xb6\x42\xb1\xc6\x20\x12\xdc\x98\xe9\xb6\x67\x0e\x32\x75\xc8\xed\x27\x92\x03\x5a\x86\x87\x38\x7c\x74\xe8\xfe\x6d\xc0\x27\xd7\x7a\x5e\x7c\xfb\xb0\x4e\x68\x8f\xb6\xff\x1e\xa9\x0d\x88\x7f\xb2\xce\x96\x32\x9b\xf4\x9f\x0c\x1d\x2e\x8b\x7c\xcd\x74\xcc\x37\xcf\x68\x83\x30\x21\x16\x1a\x8c\x65\xdf\x73\x84\x83\xd9\x2b\xe4\x68\xc8\x37\x91\xa0\x14\x4d\xf4\x64\x57\xec\xba\xe1\xe3\xef\x00\xc8\x31\xa6\xe3\xab\xd9\xa7\xfe\x24\x24\x03\xfd\x8f\xff\x80\x8c\xe8\x8b\x17\xc8\x6c\x32\xfa\xdc\xc9\xe8\x29\x18\x3b\x03\x72\xcf\x77\xb7\x33\xa0\xd5\x00\xa6\x8d\xc1\xa5\x9a\x8d\x89\x78\xa6\xf5\x35\x35\xbe\x6a\xa5\x3e\xed\x13\x9f\xca\x7d\x2a\xdb\x60\x97\xb5\xbc\x8c\xd5\x70\xa4\x46\x63\xa0\x56\x99\x11\xe7\xc9\x60\x34\x1b\x4c\xa7\x7d\xd8\xaf\x23\x35\xbe\x19\x8c\x60\x15\xd8\xd6\xcf\xa6\x92\xe6\x66\x2a\xa8\x69\xae\x1c\xe3\x0d\x52\xd1\x78\x52\x1a\xc9\x45\xe3\x08\x6a\x06\x7f\x1a\x7c\xbc\xb9\xee\x4f\x3e\x3f\xc2\x4f\x73\xf4\xc4\xc0\xdc\x4c\xc6\x17\xb7\x13\x48\x03\x23\xb7\xcb\x3b\xe2\xdb\x04\x56\x1a\x60\x8e\x41\x02\xcf\xc1\xf4\xad\x23\xac\xb9\x9d\x0e\x22\x75\xd9\x9f\xf5\xe1\xc1\x37\x93\xf1\xd5\x70\x36\x7d\x6b\xff\xfd\xee\x76\x3a\x84\xa1\x1b\x8e\x66\x83\xc9\xe4\xf6\x66\x36\x1c\x8f\x7a\xea\xc3\xf8\xd3\xe0\x87\xc1\x44\x5d\xf4\x6f\xed\x3b\xb4\x63\x3c\x46\x02\x52\x64\x18\x0a\x58\x63\x3c\xdd\xd0\x70\x24\x48\x85\xa6\xb3\xc9\xf0\x62\x26\x2f\x1b\x3f\x46\x48\x14\x90\x10\xf5\x54\x7f\x32\x9c\xda\x0b\x88\xf7\xf4\x53\xff\xb3\x1a\xdf\xce\x38\x43\x4d\xa4\xa1\xc1\x8c\xf4\x54\x39\xfd\xcb\x1f\x86\xd3\xe7\xd0\xe1\x90\xfb\xe0\x56\x15\x91\xa8\xc0\xa9\xf7\x90\xa7\x75\x56\xe9\x42\xe0\x2f\x03\xaa\xb2\xb5\xf5\x62\xbd\x63\x5d\x86\x9a\x41\x6e\x1b\x85\xfd\x4d\x7b\xc9\xaf\x74\x47\x19\x9f\x3c\x0b\x9e\xeb\x60\x57\xf3\x5d\x60\x3b\x44\x4a\xec\xc3\x72\xb3\x80\x4d\x06\x3c\x44\x89\x74\xa5\x2c\x12\x3f\xde\x6d\x39\xa5\x31\xea\xf7\xfb\x76\xf4\x3f\x7c\xf5\x1f\xf6\xff\xc4\x2f\x3f\x9d\x5f\x1c\x9f\x7e\xf7\xdd\xef\x4e\x5e\x9f\x9d\xfc\x32\x4e\xc0\x13\xf6\xff\xb7\x27\xe7\x27\x4d\xfb\xff\xec\xd5\xab\xaf\xf6\xff\xaf\xf1\xf3\xe9\xfc\xe2\xbf\xfe\x3f\x7f\xec\x8d\xc6\xb3\xe1\xc5\x80\x98\xa1\x80\xdc\xa1\x61\xfd\x9f\x7e\xf7\xdd\xab\x63\xfb\xa2\xd4\xa7\xbc\x48\x97\xea\x53\xb2\x34\xea\x93\x99\x03\x13\x52\x5e\x54\x49\xbd\x8e\xd4\xd1\x47\x5d\x96\x7a\x71\x5f\x97\xa6\xaa\x4a\x35\x74\xe4\x12\xf9\x4a\xcd\xcc\xe2\x3e\xcb\xd3\xfc\x6e\x17\xb9\x0f\x28\xa9\xa0\x53\xb5\x34\x6a\x62\x16\xf7\xa6\x58\x80\x51\xa9\x86\xbc\xf8\xff\x52\x1b\x65\x2a\xfb\xa7\x3e\xa5\xdb\xfe\x52\x9b\x48\xfd\xd1\x24\xb9\xba\xcd\x12\x28\xc9\xaa\x76\xbd\xee\xfa\x72\xb9\xc9\x6c\xcf\x61\x53\xf0\xcd\x7d\x79\x6d\xee\x74\xfa\x12\xf7\xca\x4f\xe7\x17\x08\xea\x10\x70\x18\xcf\x7c\xc9\xc6\x6d\xe9\xc1\x30\x4e\xd5\x21\xa9\xcc\xba\x84\xe4\xf0\xdc\x40\x40\xbc\x21\x96\xeb\xcd\xf7\xfb\x3c\x5d\x9a\x42\x96\xff\x7b\x5b\x97\xe1\xbb\xea\x1d\xf3\x25\x40\x5c\xbc\x66\xbc\xe1\x4b\x08\x47\x6d\x76\x18\x19\x4e\x4a\x68\x6c\x04\x09\xd5\x23\x81\xa2\x36\x3d\x89\x1f\xdd\x31\x7e\xaf\x30\x7a\x19\xb1\x48\x46\x9e\x2f\x31\x66\x05\x44\xd0\x4d\x81\x13\x51\x30\xd0\x91\xef\x7d\x73\x70\x13\x64\xff\x01\x07\x6e\xdb\x15\x51\x55\x4a\xd4\x19\x44\x72\x27\x02\x0a\x74\x94\x0d\x1e\xae\x27\xfc\x3f\x86\x11\x51\x28\x94\xda\x8e\x57\xae\x0c\x4a\x8d\x10\xa9\x6b\x2b\xb6\xd5\xd4\x9a\xda\x09\xc5\xb2\xb0\xbb\x79\x06\xdc\x75\x21\xe6\x23\x68\x78\x4b\xbb\xcb\x71\x8a\x54\x18\x99\x97\x59\x86\xa0\xd4\x27\xf2\x0f\x5f\xeb\x2f\x86\x9d\x52\x6b\xdf\xaf\x6a\xc8\x29\x8b\x8a\x6d\x5a\x8a\xa1\xea\xe3\x43\x62\xb6\x4e\xec\x04\x98\xc0\x38\x99\x6c\x02\xca\x8b\xa2\x59\xb2\xc7\xde\x67\x1f\x12\x06\xe6\xd8\xfc\x48\x74\x6a\xdd\xd5\x02\xde\x61\x2c\x23\x06\xbf\xc2\xa4\xef\xce\xfe\x0f\x57\x2a\xcb\x33\xa3\xe0\xae\x91\xd2\xaa\xbc\xcf\x0b\x57\x5d\x42\x4d\xf4\x63\x0c\x8e\xee\xd1\xfd\xce\x3e\x0b\xf0\xb2\xa5\xaf\xa0\x8a\x94\xfb\x13\xfb\xfa\x3d\xae\x6c\x67\xe7\x86\x28\x7e\xed\x4d\xe7\xf9\x72\xc7\xc0\xb0\xc7\xc6\xc0\xba\xf7\x6f\xd4\xa1\xdf\xcc\xfe\xeb\x3f\xd5\xbf\xfe\x1f\x4b\x5d\x99\xe3\x7c\x75\xcc\xef\xf7\xdf\xfe\xb7\xed\x6a\x87\xe4\xa3\x8f\xdc\x9b\xf0\x22\xe2\x08\x79\x6f\x96\xa2\xd9\x41\xb5\xbb\x20\x90\x0d\x44\x0d\x35\x6f\x80\x20\xf0\xb7\xb7\xa6\x40\xe9\xff\x58\x1d\x7d\x02\xc9\x34\xc0\x25\x20\xbc\x83\x0b\xcd\x6e\x27\x43\x77\x5b\x37\x8b\xc1\xe3\xf3\xb2\x3a\x0b\x62\x24\x21\x87\x30\xee\x35\x7c\x31\x7b\x1a\x5d\x8e\x2f\x6e\xad\x57\x80\x54\x85\xd2\x3b\x43\xb8\x6a\x74\x08\x97\x5d\x8c\x6f\x3e\x4f\x86\xef\x3f\xcc\xd4\x87\xf1\xf5\xe5\x60\x32\x55\x1f\xfb\x7f\xb4\xc7\x9a\x9a\x0c\xac\xcb\xc6\x77\x00\x4f\x42\x3a\x6c\xe4\xd1\x75\x2b\x34\x74\xba\x2a\x8f\xfb\x6d\xe3\x49\xe8\xb6\x8d\x3e\xef\x11\x61\x70\xe2\x0e\xce\xe8\x1f\xf8\x9e\x8f\x27\x8d\x8e\x7f\x1a\x12\x81\x25\x03\x66\xc9\x6b\x19\x4e\x2e\x89\x3d\xf3\xa6\x3f\x1b\x8c\x66\xd3\xc8\x0f\xc5\x34\x52\xb3\x49\xff\x72\xf0\xb1\x3f\xf9\xe3\xd4\xf9\x21\x0a\x3f\x8b\x0f\xda\x43\xe6\x1e\xf2\x1c\x57\x90\xdc\xbf\xfd\x2e\x1f\xbb\x3a\xe4\xdf\xd8\xbb\x3c\xa7\xab\x48\x67\x83\x92\xb2\xd9\xb2\x51\xdd\xd3\x3e\x4c\xd7\x7a\x07\x4d\x9e\x7b\xea\x46\xbd\x7c\x30\x45\x85\xa9\x3f\xc8\xa0\xcd\xd3\x64\x91\x60\x26\x8a\x4e\x56\x9e\x99\xad\xe0\x07\xb3\xf9\x44\x3e\x6a\x00\x31\x04\x19\x06\x99\x25\x55\x6a\x38\x69\xe2\x60\xea\xed\x83\x0e\x12\xcd\x65\x99\x2f\x92\x0e\xe9\x47\x38\x7c\x35\x00\x23\x41\x7b\xa9\x64\xbd\x01\x38\x0b\x5b\xfd\x8c\x9f\x45\x8d\x83\xb6\x8c\xdd\x63\x98\xdd\x2d\x5f\xd9\x45\xfd\xa2\x94\x5c\x2b\x9c\xaf\x99\x9b\x05\x8c\x32\xd2\x5f\xdb\xf3\xaf\xbe\xab\xcb\x4a\x9d\xbe\xb2\xd6\xde\xef\x54\x09\x24\xfe\x28\x73\x5d\x60\x24\x72\xbd\xd1\x15\x73\x90\x41\x43\xdf\xdf\x5c\x53\x16\x88\x8b\xe3\x4d\x56\xd6\x05\x13\xc9\xd9\x0d\xc5\x8d\x89\x2f\xa0\xf0\x74\x9b\x59\xce\x6a\xb7\x98\x78\xc3\x54\xbb\xce\xec\x8d\xf9\xb4\x21\x14\x68\xba\x0b\x6f\x47\x28\x1c\xb9\xf5\x27\xf8\xbd\x8d\x5e\x7c\xd1\x77\xa6\xf4\xa4\x4d\x30\x88\xc1\xc0\x30\x5c\x65\x93\xa7\xc9\x62\x27\x59\xaa\xed\x86\xa4\x2b\x13\xab\x1b\xef\x63\xe6\x75\x21\x52\x70\x57\xfd\x7f\x26\x9e\x40\x48\xdc\xfe\xa5\x36\x65\xc5\x8c\x33\x75\x45\x46\x9b\x8f\xa6\xc2\xae\x67\xef\x50\x26\x55\x20\x5c\xea\xa8\xa3\xba\x0e\x57\x78\x02\xf7\x04\x04\x9c\x55\x9a\xcc\xb7\xdb\x6d\xa4\xfa\x6b\xbd\xd3\x68\x69\x7d\x9f\xdc\x95\x7a\x1b\xab\x31\xd8\xa4\xcd\x96\x40\x67\xe8\xcd\x2f\x74\x86\xc3\x55\x98\x05\x25\xfd\x6c\x7b\x8e\x71\x00\xfe\x09\x0f\x92\xaf\x1e\xf3\x3f\xca\x4f\xfc\xf2\x5d\x52\xcd\xf2\xa2\x30\x59\x75\x7c\x1a\xff\x22\x11\x80\xc7\xfd\xff\x6f\xcf\x5e\x9d\xbf\x6a\xf8\xff\xe7\xe7\xe7\x5f\xf3\x7f\xbf\xca\x8f\x7f\xfb\xcc\x6b\x01\xd9\x13\xca\x03\x1e\x08\x66\x40\x3c\x54\x1e\xbf\xfe\x31\x4e\x18\xfb\x89\xf8\xf6\x22\xc5\xf2\x79\x60\x05\x43\x17\xda\x6d\xe9\x2e\x4d\xd1\xa8\xc2\xab\x37\x4b\x64\xa2\x2d\x94\x3d\x23\x2b\xaa\x2e\x2b\x0c\xec\xd0\x1e\xf8\xe8\x6e\x74\x74\x28\x9e\xc8\x89\x87\xc3\x9e\xe7\xa1\x90\xa7\xc6\x7c\x27\xda\x67\xcd\xf8\x45\xac\x8e\x04\x05\x0d\x3a\x4f\xed\x1b\xfa\xfa\xc9\x4d\x5d\x94\x35\x29\x77\x34\x81\x58\x5a\x39\x7e\x99\x1b\x56\x6d\x6d\xfe\x05\x0a\x21\xad\x5f\x6c\xb2\x2a\x29\x4c\xb5\x8b\xa8\x62\xab\xc2\xbd\xba\x13\x61\xde\x00\x97\xb9\xda\xc3\x52\xe0\x98\x48\xf1\x29\x10\xe2\x13\x3e\xbb\xf0\xd3\xd9\x25\xd8\xb5\x9b\x7b\x70\x53\x18\xbd\x9e\xa7\x06\x67\x02\xff\x16\xd0\x8b\x56\xb9\xe3\xb4\x84\xce\x6c\x52\x6b\xcb\x0c\xb2\xbb\x34\x29\xef\x23\x2a\xfe\x07\x05\x19\xa8\x40\xed\xc2\x71\x0a\x59\xfb\xaa\xf9\x1c\x80\x11\x87\x05\x57\xa9\x24\xe9\x20\x64\x96\x93\x9d\x6c\xbe\x84\xa5\xd9\xd8\x76\x66\x04\xd6\x75\x65\x09\x01\x73\x5e\x8b\x32\x4f\xb6\x82\x62\xea\x7c\x0d\x12\x5f\x5a\x67\x88\x03\x27\x72\x55\x08\x14\x1c\x44\x3c\x5a\x39\x2f\xa3\xbe\xd7\xf3\xb9\x29\x3a\xd7\x92\x67\xe3\xfc\x7e\x3c\xbd\x3e\xec\x45\x4e\xbf\x81\xb4\x32\xf5\x06\xec\x31\x98\x17\xf2\x06\x43\x52\xd7\x78\x30\xb1\x17\x95\x78\x75\xb4\x40\xf1\x93\x57\x47\xab\x1e\xe2\xaa\x7c\x23\xc6\xd3\x6b\x21\x0b\xb1\x2c\xf2\xcd\xc6\x2c\x1b\x5d\x0d\xa8\x81\x39\x74\xf1\x59\x4e\x26\x26\x02\xb8\x03\x9a\x8c\xad\x96\xc5\x95\x72\x92\x83\xba\xb4\x62\x71\x66\x3b\x84\x79\x46\x70\x33\x9d\x29\x7d\x77\x57\x98\x3b\xeb\x68\x96\x2d\xba\xcf\x84\xf0\x71\x64\xbd\x6f\x8a\xfc\xae\xd0\x5c\x47\x5f\xda\x49\x63\xbd\x6d\x57\x64\x8f\xa9\xe0\x12\x69\x03\x28\x34\xe4\x02\x77\x2b\x63\x90\x1a\x18\x09\x06\x39\x40\xf2\x2e\xaf\xee\x83\xf2\x5b\x04\xab\x36\xf5\xb9\x9b\xb3\x25\x58\xc3\x6c\xd8\x75\xab\xc0\x6c\x0a\xf3\x90\xe4\x75\xd9\x60\x2c\x06\x77\xc1\xd5\x9e\x5b\xab\x0f\xd8\x09\x6b\x50\x60\x9c\xb9\x49\x7a\xd8\x7a\xe0\xa1\x3a\x0c\x1e\x64\xff\x20\x6f\x4d\xb9\xe2\x80\xba\x06\x13\xe3\x8e\x61\x41\x74\x04\x65\x13\xcf\x63\x27\xc7\x0e\x25\x5b\x9e\xf4\xa1\xd1\x29\xda\xd8\x3b\x5e\x32\x05\x02\xac\xbd\xb9\xaf\x38\x08\x5e\x5b\x52\x89\xfe\xa9\x36\xaf\x54\x43\x26\xa0\xd5\xd4\x57\x10\x2c\xc5\xfa\x15\x8e\x53\x34\x9b\x23\x62\xad\x21\x5f\x67\x88\x38\xdd\xb5\xeb\xee\xc3\xde\x72\xe4\x6e\x5f\xb7\x19\x7a\x91\xc9\x2d\xd5\x0e\x62\x53\xf9\x7b\x7f\x2b\x00\xb1\xed\x35\x6f\xb1\x51\xbe\x96\xac\xa3\x7a\x7d\xd7\x22\x64\x14\xf3\xa8\xca\x89\xe9\x93\xd3\xef\x4d\x48\x64\xab\x0b\x8d\x30\x6b\x44\xc5\x63\xa2\x5c\x81\x36\x62\xdc\x10\xec\x90\xc3\xb8\x01\xd7\x03\x55\x7f\x6f\xef\x75\x55\xe6\xb8\x89\x67\xf8\x8d\xe0\x0e\xfe\x6d\x35\x35\xde\x11\x21\x08\x22\x39\x0e\xd8\xd3\x6a\xe2\x32\x37\x65\xf6\xa2\xc2\x48\xbd\xd3\x01\xb4\x9e\x98\x06\xf4\x24\xb7\x87\x6a\x1d\xf3\x82\x71\xec\x2c\xb7\x4c\xb4\xa1\xbe\xce\xbb\xfb\x39\x1d\x3c\x12\x91\x3b\x3f\x17\xf7\xba\xb8\x33\x08\x44\x5f\xf9\xf2\xf5\x1d\xd6\x8d\x6c\x36\x79\x81\x35\xb3\xab\xa0\xbf\xa4\x86\x8f\x97\xf9\x8e\x7b\x7a\x23\x58\x52\xf0\x4a\x17\x75\x59\xe5\x6b\x70\xfa\x3f\xe3\x42\xb2\xa3\xce\x8f\x25\xbf\x55\xea\x72\x93\xde\x29\x75\x8e\x85\xa4\x5a\xc4\x2b\x92\xa7\x5d\x94\xa0\xc8\x22\x97\xae\x05\x6d\x5f\x23\xde\x99\xe4\x1d\x59\x61\xb1\xb9\x15\x46\xd8\x7c\x41\x66\xf3\xd8\x8a\x94\xa5\x4e\xdd\x52\x66\xf1\x41\x38\x67\x43\xc1\x75\xb1\xd0\xe0\xb1\xf9\x36\xeb\x78\x69\x4f\xf1\xf6\x36\x6a\xf9\xad\xc9\xc9\x65\xa3\x70\xd7\xd6\xd6\xf5\x67\xbb\x22\x51\x87\x19\xe4\x8c\xa9\x9b\x8e\xf4\xb0\x6d\x3d\x35\xb8\x8a\x79\x1a\x35\xdb\xdf\x7a\x12\xe9\x60\x3b\x7a\x9f\xf1\x74\x78\xec\x4e\x7e\x79\xec\x3b\x76\xb6\xbc\xf0\xe2\xd9\x45\xbe\x29\x12\x03\x89\x7e\x27\xcc\x45\x5b\x06\x52\x9c\xbb\xf9\x52\x53\x75\x9a\xbb\x4c\xf2\xf3\xc8\x5d\xf2\x9e\xcd\x33\xb7\x33\x49\xc1\xed\x55\x9d\xae\x12\xaa\x0c\x0f\x0a\x6c\x5a\xe5\x97\x61\x68\x39\xe0\xfc\xf5\x73\xb1\x41\x83\x25\xa6\x7b\x8f\xd6\x00\x70\xb8\x08\x56\xf7\xee\x51\x64\x24\x7e\x49\x70\xb9\xa7\x8e\xee\xea\x9e\xf9\x76\x85\xbd\x11\xb2\xde\x1e\x8c\x5a\xa2\xea\xed\xe2\x30\xaf\xf8\xdd\x21\xb3\xfe\xd9\x6d\x25\xac\x37\xde\x94\x2e\x17\x39\x3d\x5a\x6b\x1c\x62\xdc\xa3\x30\xee\x86\xc4\x19\x77\x42\xfa\x5d\x98\xd6\x24\x13\x23\x76\x80\x96\xaa\x38\xc6\xf9\x83\xbb\x53\x80\x8a\xa6\xbd\x90\x74\x68\x0f\x66\xc3\x7a\x2c\x0c\x98\xc9\x50\x1a\x68\xa0\x12\xd2\x17\x30\xe0\xfe\xb9\xc0\xa8\x2c\x3e\xc3\x9a\xf3\xb9\x7f\xa0\xb0\x56\xb6\x24\x06\xb7\x83\xbf\xa2\x32\x1f\x6a\xf2\x31\xec\x51\xde\x18\x25\xfe\x36\x48\x63\xee\x6c\x2a\x47\xdf\x86\x4a\xfd\x5a\xbd\x4f\x73\x2c\x6b\x61\xd5\xc4\x6c\xa9\x9a\x4a\xfc\xdc\x93\x99\x6d\x12\x99\xbf\x8e\x36\x90\x3f\xbc\x92\xc5\xf4\x7b\x09\x19\x77\x3f\x85\x90\xd1\xaf\xeb\xa0\x7c\x2d\x29\x96\xac\x6f\xd1\x99\xc1\xc3\xcd\x3e\x7a\x94\x16\x34\x56\xb7\xf6\xbe\x0e\x6d\xea\xb3\xb7\x44\x46\x19\x31\x93\xa5\xa4\x82\x6c\xa6\x76\xdb\x66\x92\xe0\x8d\x27\xf1\x7c\xaf\x3d\xb8\x27\x5f\xaa\xe6\x4d\xbb\x9b\xfc\x83\x4c\x1a\xdf\x64\xf0\x3b\xfe\x11\x24\x2c\xa9\x33\x57\x67\x00\xec\xfe\xf4\x55\x76\x13\x3b\x39\x1f\x95\x52\x73\xa6\xcd\x60\x42\x32\x56\x22\xb4\xe6\x0d\xc8\xa3\xd8\xe6\x61\x49\xe1\x1e\x72\x4b\xd1\xb1\x2e\x5e\xca\xa8\x41\x4a\x19\x11\x8d\x0e\x48\x44\x4a\xcc\x2d\x14\x9d\xd8\x31\xcf\xbb\x74\x55\x3b\x87\xcc\x5a\x65\x65\x9e\x9a\x56\x8d\x96\x33\x5d\x43\xad\xc6\xa0\x74\xcb\x60\x3d\x1d\x69\x63\xfc\x6a\xad\xde\x43\xbf\x8a\xe5\x6c\xe4\x7f\xb5\x96\x54\x95\x37\x6e\x0c\x6b\x4c\x8c\x7c\xdc\xf0\x7f\x0e\x5d\x65\xd8\x4e\xe9\x25\x87\xd1\xad\x21\x5c\x10\x45\x3d\x6c\x39\xbc\x3f\x96\xf5\xbc\xa4\xc2\xf7\x42\x95\x55\x51\x2f\x20\x3e\x91\xaf\x50\x4d\x17\xe9\xe0\xc5\x21\xd0\x69\x19\x41\xd1\x13\x10\x45\x99\x2d\x7e\xc3\x95\x7e\x81\xf2\x3e\x5a\x61\x85\xec\x98\x88\x03\x7d\x80\x9a\x60\x2a\x5e\x6d\x1e\xb7\x95\x73\x8d\x9a\x5f\x3c\xa4\xa2\x3d\x06\x32\xd8\x7f\x3b\xe7\xb2\xe1\xa6\x31\xee\x00\xf4\x83\x1f\xe8\x78\xb0\xad\x0a\x06\xf2\xdd\xae\xab\xf2\x57\x1c\xcd\xa2\x8c\xfe\xd5\x91\xee\xa9\xb9\x49\xf3\x2d\xab\xed\x20\xdb\x4b\x5e\x70\xf5\xdb\xf6\x3e\x77\x5b\x01\x2f\x1d\xc9\xbe\x66\xf0\x53\x7c\x52\x13\x31\x62\x37\xf4\xa0\x13\xea\x48\x07\x7e\xed\x61\xef\xeb\xae\xfa\x75\x57\xfd\xba\xab\x3e\xbd\xab\x9e\xc7\x4f\xf2\xb6\xfe\x77\x66\x2b\xa5\xcb\xe5\x74\xff\xb9\x04\xa6\xa5\xd9\xe8\x42\x57\xc2\x4a\x6e\xef\xea\x98\xd9\x5d\x0a\x0c\x1d\xc9\x8b\x3c\xf2\x1d\x72\xf7\xbb\x58\x2b\x5a\x0e\xf0\x53\xc4\x15\x7f\x03\xd7\x69\xd7\x48\x3d\x8f\xfe\xb4\x7d\x26\xfd\xa6\x0c\xa8\x7e\xdc\xff\x26\xe2\xd3\x57\x31\x32\xc2\x8c\x45\x54\x65\x62\xee\x74\x01\xae\xdd\x65\xb3\x86\x09\x37\xed\x7e\x78\xf0\xcd\x1a\x71\x86\x0e\xd9\x93\x47\x49\x3e\x39\x78\xbb\xdf\xd9\x04\x58\xa6\x20\xe8\xde\x17\x74\x74\xf3\x8f\xc2\xa8\x08\x50\xf0\xc9\x1c\x7f\xae\x12\x9e\xd3\x7d\xe2\x8f\x93\xa8\x33\x0a\xd9\x4d\xff\xf0\x04\x1f\x83\x60\xe3\xed\xff\x8c\xb6\x76\xe1\x36\xf6\xeb\x19\x35\x68\x3e\xd4\xaa\x06\x23\xad\x29\xdd\x23\xbc\x4d\xa3\x3d\x6b\x3f\x37\xf9\xb5\xa0\x1e\x75\x46\x93\x60\x0c\x6f\xf2\x39\x5a\x57\x79\x17\x30\x8a\xb7\xc3\xc1\xbe\xfd\xb1\xe0\x6d\xa5\xaa\x6f\xdc\xf2\x91\x1d\x31\xa7\xb9\x4d\xbd\x42\x5a\x8e\xc6\xd1\xdc\xce\x33\xec\xdd\x3e\xf2\x66\xcc\x17\x67\x4f\x5a\xe1\x03\x19\x48\x83\x05\x84\x9e\xb9\x6d\xdf\x88\x51\x38\xd1\xd3\x8b\xbd\xe0\xfd\xdd\x31\x14\x8a\xe8\x01\x07\xaf\xdc\x20\x66\xce\xd2\xd6\xa9\x43\x38\x61\xf7\x05\x83\x39\x5f\x40\x77\x0e\xd4\xef\xbc\x59\xb9\xec\x09\x5b\xa2\x8f\x91\x6c\x8a\x92\x06\xfc\xfc\x71\x93\x66\x8d\x83\xde\xd1\xd3\x0c\xb6\x1d\x61\xf4\xbd\xf1\xfc\x47\x56\xa4\x5c\x60\xde\x78\x02\xaf\x42\xaf\x8d\x02\xd6\x2b\x7b\x4a\x85\xd7\x22\x43\x84\x7f\xd5\x3e\x25\x25\xc4\x03\x3a\x0f\x97\x07\x7b\x3b\xb5\x36\x8b\x7b\x9d\x25\xe5\x5a\xdd\x99\xcc\x14\x58\x31\x08\x11\x66\xbf\xa1\x37\xcb\x1f\x89\x56\x64\xbd\xae\x33\xe6\x06\x04\xeb\xc6\x9e\xbc\x45\x9e\x25\x0b\x7b\xa6\x64\xe5\x0a\xd9\x59\x97\xba\xd2\xea\x48\x67\xea\x70\xe0\x2f\x90\xfb\xa6\xfa\xc8\x6d\x38\xec\x61\xea\xb5\x8b\xb1\x56\x4c\xb6\x67\xce\xdf\xc6\x40\x51\x31\x2c\x00\xe2\xc2\xdc\x98\x53\xbe\xad\xb6\x26\x7d\x30\xea\xe8\xf4\xac\xa7\xd6\x79\x56\xdd\x97\xc4\x02\xe4\xf0\xaa\xc0\xdf\x0f\xaa\x78\xe9\xce\x81\xdd\xfc\x5c\x91\x37\x2b\x93\x1f\xd5\xd1\xb7\x8d\x1b\x69\x70\x11\x11\x7c\x26\xbb\x54\xea\x64\xf9\x8c\x7e\xb9\x74\x6d\xc8\x2e\xed\x13\x6c\x4d\x16\x08\x40\xce\x05\x04\x5c\x72\x6c\xb9\x01\x38\x2a\x32\xd5\xc3\x47\xbd\xfd\xc6\x93\xaf\xcd\x1a\x15\x80\xa1\xd0\x09\x1d\x08\x5a\xba\x3f\xbc\x02\x17\x31\x10\x39\x39\x03\xed\x86\x0d\xb4\x8f\x40\x45\xe3\xac\x7e\xa5\x54\x02\x40\x84\x62\xa9\x6e\xc0\x7f\xba\x00\xf3\xdf\x45\x97\xe1\xb8\xe6\x6a\x57\x3e\xea\x24\x43\x6a\xf0\xf8\x17\xe5\x1e\xbb\xd0\x19\x44\x4e\x17\x4e\x12\x08\x56\x6d\x56\xb5\x06\x5f\x87\x08\x5a\xfb\x03\x00\x15\xd0\xac\xd3\xee\xb2\xf8\x72\xc4\x83\xec\x33\xd1\x1a\x1d\x5e\x0f\xde\xf7\xaf\x0f\xb1\x1f\xbc\x8f\x11\x9d\x0f\xf8\x06\x9e\x94\xd8\x36\x9b\x74\x3f\xfc\xc7\x49\xa6\xca\x7a\xb5\x4a\x16\x00\x82\x59\x9a\x4a\x27\x29\x0f\x8a\x97\xa9\x83\x44\x84\x1d\x34\xeb\x4a\xaf\x39\x3e\xac\xad\x79\x46\xc3\x4a\x5c\x91\x60\xdd\xf9\xd1\xc5\x79\xeb\x92\x95\xed\x0d\x2c\xe0\x38\xdf\xb3\x0d\xcf\x7b\x38\x58\x68\xf0\x6d\x8a\x7c\xbd\xa9\xd2\x9d\x54\x1d\x81\x31\xc0\x81\x23\x2a\x15\xaa\x9a\xf0\x4f\xf6\x79\x48\xef\xf5\x79\xee\xf1\xca\x5e\x43\x26\x70\x65\x36\xa5\x3a\x42\x1a\x26\x04\x2b\xae\xa0\xca\x05\x52\x1d\x9b\x22\xd1\x60\x32\x20\xd9\x54\x8a\x55\x8c\x85\xca\xcc\xb6\xbc\x2b\xf2\x7a\x53\xf6\x9e\x64\xb5\xc6\xb0\xf8\xf6\x3e\xe7\x18\xc8\x72\x4f\xfe\xd3\x5a\xa4\xe0\xc3\xd9\xd7\x91\x99\xad\x18\x58\xb7\x96\x71\xdc\x09\x35\x40\xf3\x3f\x89\x03\xcb\xbb\x7f\x33\x74\xd3\xbf\xb9\x27\xc8\x73\x53\x98\x9d\xe4\x88\xaf\xb9\x2e\xa3\x58\xe9\x85\x51\x47\x87\xfd\x9b\xe1\x61\xcf\x65\xd4\x1b\x4b\xc9\x39\xd8\x4e\x8e\xd6\xc3\x9b\xc4\x98\x04\x9e\x6a\xb2\xde\xa4\x48\xf1\x03\x97\xf6\x6f\x86\x62\x61\xe8\x14\xf8\x12\xb9\x38\x06\xe0\x3d\xbe\x04\x93\x1d\x06\xf7\xee\x83\x21\x48\x62\x35\x61\x76\x2b\xb6\x92\x3f\x43\xd8\x89\xfe\x08\x0f\x8c\x84\x03\x07\x95\x26\x79\x13\x3d\xf5\xea\x68\xd1\x83\xf0\x1b\x6a\x37\x42\xd6\xd1\xa4\x89\x79\x78\x34\x35\xdf\x48\xba\x63\x3e\x90\x33\x72\x1c\x6b\x62\x7e\x04\x59\x18\x25\xd6\xa2\xf7\x6a\xd1\xd3\x15\x7b\x0a\xa4\x0d\x76\xed\x4d\x85\x47\x60\x69\x3b\x4f\xdb\x12\x16\x5c\x48\xae\xfb\x65\x8d\x2f\xda\x34\xad\x6d\xe4\x46\x0e\x50\xe1\xb2\x82\x42\x48\xed\x74\x58\x2d\xdd\x03\xf1\xb3\x3c\x05\xc7\x57\x80\x3e\x2f\x6e\x0e\x5d\x96\xa1\xcc\xd3\xb5\x1d\xc8\xce\x8e\x3b\xb1\x4f\x8a\x8c\x36\x94\x8f\x09\xef\x84\x83\x77\xd8\xb3\x9f\x41\x68\x11\xd5\x4e\x3b\xb5\x89\xd0\x5d\xdc\xec\x9a\x13\x60\x8f\x19\xe5\x76\x4e\x8e\xa6\x85\x41\x46\x6f\xda\xea\xe5\x12\x27\x10\x96\x20\x94\x4a\x07\xab\x9b\x1c\x71\xe2\xf0\xb7\x37\x4d\x2a\x07\x8c\xc8\x4b\x3c\xcd\x21\x7f\x59\x89\x0b\x31\xdb\xe4\xd1\x1d\x2d\x79\x4f\xb5\xc4\xdc\x1f\xd0\x2a\x73\x2c\x3a\x42\x48\x49\xeb\xe4\x82\xcd\x52\xde\xd8\x15\xd8\xb8\x7d\x54\x83\x2b\xf4\x60\x27\x32\x22\xbe\xf3\x62\x07\x0f\xea\xe1\x6b\x56\x1a\xca\xc8\xc8\xa7\x06\x02\xef\x2f\x14\xfc\x4a\xf3\xfc\x8b\x67\xa5\x62\x55\xa1\xae\xa4\x25\x98\xf9\x44\xa8\x86\xe8\x04\x0d\xe8\xaa\x55\x5e\x44\x0e\x16\x11\x79\x50\xc4\xf3\x30\x10\x84\x11\xa3\xb2\x00\xc7\x7a\xdc\x1d\x40\x6f\x3a\x26\x48\x04\x0c\xfe\x24\x2e\x27\x04\x06\x60\x05\x7b\xe4\xa0\x7d\x41\x51\x7b\xd5\x54\x02\x68\x46\xc7\x43\x77\x23\xa9\xd4\x22\x35\xba\x68\x84\x06\xff\x96\xfe\xda\x89\x03\x83\x88\x7b\x0b\x04\xb2\xd3\x3c\x33\x1e\x45\x15\xc6\x09\x72\xbe\xe5\xaa\x91\xc3\x05\xac\x1a\x38\xad\x72\xae\xae\x1c\xc5\xab\xc7\xd9\x10\x5d\x62\x87\x00\x42\x2b\xb6\xdc\x60\x57\x7f\x7e\x07\xd1\xf7\x02\x33\xc5\x76\x8e\xb7\x49\x13\x87\x36\x69\xbe\x52\x03\xef\x0c\x11\xe2\xb8\xf4\x13\x4d\x2c\xea\xb6\x7f\xb6\x27\x96\xed\x00\x10\xdd\xa0\x07\x7c\x67\x30\x8b\x71\x1f\xa2\xb6\xfa\xe8\x54\x3b\x2e\xe5\x0a\x48\xed\xb9\xe4\x4f\x0e\x10\x29\x63\x4d\x8c\x26\xe0\x41\xa0\x2f\x75\x8f\x99\x0e\xc1\xc5\x25\x0f\xcc\x5a\x8f\x01\x1f\x0e\x24\x92\x64\x75\xaa\x06\xd4\xc2\x26\x59\xd4\x79\xed\x8a\x38\x1c\x3d\x78\x33\x5c\x10\x39\x30\x75\x8b\xe0\x47\x2d\xf2\xd4\x7e\x54\xe8\x54\x14\xa5\x94\x15\xf3\x7a\x3e\xe2\x6b\xec\xf3\x8e\x13\x69\x49\x3e\xe9\x73\x4b\x8a\x62\x27\x99\x82\x77\xbf\xcf\xb7\x9e\x2a\xc7\x0f\x2e\x61\x49\x68\x70\xe5\xfe\xe0\xc7\x96\x2c\x55\xfb\x6d\x44\xb5\x3a\xe3\xb3\xbd\x40\xb1\x61\x34\xea\x18\x8d\x6f\x87\x1f\x21\xf7\xd7\xb5\x16\x81\x90\x66\xf7\xf4\x16\xf1\x0b\xae\xd5\x9f\xb2\x4e\x7d\x87\x5b\x2b\x70\xd5\x5e\x81\xad\x74\x8e\xdf\xe7\xf7\x80\x37\x8f\x4c\x7c\x17\x47\xad\x58\x77\x99\xaf\x31\x46\xe7\xb9\x34\x1f\x0b\x7d\x2f\x00\xc9\xd3\x2a\x16\xef\x78\x9e\x2e\x7d\x5d\x40\x13\x13\xc5\xab\x1c\xfc\x15\x88\x69\xec\x13\x06\x7d\x12\x96\x04\xa8\x12\x37\xef\xba\x21\x46\x9d\xed\x7b\x0e\xc2\x88\xe7\x4c\x33\xf2\x01\x9c\xba\xfc\x76\xee\xac\x1f\xb1\xde\x98\xac\xf4\x25\x6a\xcf\xd8\x30\xbb\x4e\xc6\x32\x6a\xa7\x8f\xda\x6f\x7a\x94\x57\x76\xb0\x1c\x01\xe7\xe3\xa4\xb2\x9c\xba\x05\x02\xd0\x62\x07\x84\xf4\x7e\x0f\xcb\xee\x30\xdd\x05\xff\x70\xc1\x7f\x91\xe8\xa4\x6a\x4c\x1f\xce\x27\xdf\x58\xb8\xa4\x59\xbb\xf8\x20\x6a\xc6\x55\x3a\x7a\xe2\xb3\x78\x88\xff\x5c\xb6\xe0\x37\x9e\x6f\x8b\x2a\x33\x43\x8e\x04\x3b\xdb\x31\x55\x97\xfa\xa8\xa8\xc8\xd0\xae\x30\xf4\x6c\xec\xb9\x0c\xe1\x36\xb5\xcc\x33\x3f\xb0\x92\x3e\x14\x93\xec\x8b\xe6\x6b\xdc\x83\x23\x6f\xd7\x86\x08\xee\x2a\x8d\x6e\x70\x37\x80\x3d\x00\x5f\xf9\x3d\x09\x2f\x08\xf2\xa8\x21\xff\x01\x52\xa7\x76\xb4\xc6\x1e\x6e\x7c\x26\x92\xff\xe4\x44\x12\xc4\xfd\x5e\x94\xee\x0c\x09\x67\x98\x40\x43\x14\x26\x78\xcb\x74\x75\x7b\xfa\x75\xd2\xdb\xba\x53\x23\x3c\xde\x9f\x3a\x91\x20\x62\x12\xe4\x2b\xb9\x33\xba\xbb\xc1\x11\xf2\x4d\xb0\x18\x0b\xb4\x55\xaa\xa6\xed\x6b\x37\xb0\xbb\xe1\xa1\xde\x7d\x30\x06\xd4\xa7\xde\x02\x85\x29\x14\x46\xba\x64\xd9\x13\x96\x33\xb8\x57\x6c\x77\x47\x97\x1d\xde\xf7\x24\xdc\x81\xf9\x49\x5a\x65\xf5\x7a\x8e\x61\xdc\x9f\xfc\x54\x7c\x5e\x61\xca\x8d\x59\x30\x50\x15\x4e\xd6\x79\x0f\xa7\xcc\xde\x6f\x81\xbf\x14\x80\x3c\xfc\xd0\x3d\xe8\xb4\x36\x91\x62\x19\x1c\x9d\x92\xa5\xb8\x32\x50\x0a\xd4\xc4\x08\x7b\xb3\xfe\x8a\x7a\xad\x1f\xf2\x64\xc9\xda\x14\xcb\xbc\x9e\x23\x81\xb1\x48\xcf\x43\x4f\xbb\xe7\x49\x7b\x71\x01\x7e\x1c\x8e\xf3\x9f\x33\xd3\x89\xbb\xd9\x4f\x1b\x2c\x4e\x7a\x64\xc2\x90\x33\x0b\x10\x64\x8d\xc0\x52\xb3\xde\xa4\x22\x6d\x1d\x09\x69\x8c\xea\x17\xde\x8b\x1a\x5b\x40\xac\xfa\x2e\x41\x63\x5f\x7b\x3b\xf5\xe7\x79\x3c\x0a\x73\x97\xb3\x00\x5e\xf6\xf3\x0e\x8f\x5d\x17\xb2\x3d\xfa\x85\xbb\xde\x05\x9c\xff\x26\x56\xc3\xcc\x79\x2e\x39\x1c\xc1\xe9\x4e\x5d\xa2\x3f\x3e\xad\x74\x45\xe5\x71\x13\x73\x47\xc5\xe3\xc2\xed\x87\xfc\x9e\x0f\xe1\x13\x04\x44\x92\xea\x08\xe1\x8f\x47\x14\xe4\x68\xe9\x41\x55\xf6\x33\x0c\x29\x8a\x16\x94\xd8\xba\x48\xfd\xb9\x5e\x12\x4f\x76\x01\x1c\xe7\x90\x08\xe4\xe6\x36\xc3\x08\xb8\xd5\x87\xb4\x3f\xdd\x4d\xa3\xb7\xb6\xd6\x3f\x26\xeb\x7a\xcd\x6b\x8e\x7b\x4c\x4e\xcb\x22\x21\xcb\xad\xf4\x63\xe5\x1f\x8e\xc7\x8e\xd7\x8c\xb2\xad\x40\x0c\xda\xf2\x9e\x72\x84\x79\x58\x44\xe0\x2d\x7a\x17\x83\x42\x34\x34\xcf\x47\x4f\x74\x4a\x70\x01\xb3\x53\x1a\x4a\xff\x62\x35\xb5\x93\x5b\x3a\x19\xd0\xe3\x79\x07\xf0\xc1\xc7\xb0\xf7\xa6\x23\xb1\x2d\xad\x3b\x38\xca\xf8\x16\xa5\x6c\x73\x7e\xb1\x98\x5f\xb8\x67\x85\xd2\x41\x9d\xa3\x46\x2c\xfd\x5d\x1d\xf1\x21\xcb\x74\x47\x09\x04\xb2\x57\x65\x06\x01\xd0\x41\x4b\xa4\x97\x2d\xbf\x10\xd7\x84\x93\x29\x93\xf1\x66\xd4\x08\x70\xdc\x42\xc8\x11\x85\x3c\x4d\x5c\x35\xf3\x08\x42\xa2\x51\x84\x2a\xca\x7e\xf1\xdd\xe4\x4d\x55\x93\x3c\xd8\x64\x21\xb0\xae\xab\x4a\x2f\xee\xc9\xd9\xf3\x61\x2d\x17\x1c\xe4\xfa\x47\x08\x48\x2f\xf2\x62\x93\x17\x3a\x54\x78\x84\x49\x0b\x44\x42\x26\x5b\xb8\x7a\x18\x69\x20\xcf\x3a\xc2\xb6\x3a\x56\x23\xb3\x15\x81\x07\xd7\x48\xbb\x11\x13\x80\xbf\x0d\xdf\x57\x85\x79\x48\xec\x62\xa4\xe3\x39\x6b\x55\x03\x98\xe6\x93\xe6\xb1\x1a\xb8\xda\xd4\xf0\x99\xe3\x6c\xd1\xb1\xbe\x5d\xbe\xc1\x97\x11\xb8\xca\x0e\x1f\x44\xec\x36\x8a\x44\x28\x33\x05\x8a\xfb\x66\x6d\x41\xb2\x47\x22\x4b\x57\xbe\x5e\xe0\xb3\xbb\x45\x99\x8b\x88\x9f\xfd\x3a\xcc\xcc\x47\x0a\xed\xdc\x1d\x31\x34\xd6\x95\x41\x95\x87\xbe\xef\xa1\xf0\x73\x01\x04\xd5\xd0\xfe\xdd\x5f\xb0\x20\x52\x53\x54\x37\xe0\x71\x0f\x1d\x21\x6a\x17\x02\x6e\x97\x22\x89\xf4\x67\xcb\xcf\x6b\xd7\xeb\xad\x1a\x31\x77\xa8\xa4\xf1\x06\xe0\x1e\xc8\x45\xd4\xa8\xc7\x5e\xe6\x4e\x41\x08\x76\x6f\x48\x8a\x42\x85\x45\x42\xe7\x01\x99\x5e\xa8\xff\x4e\xc5\xd0\x69\x61\xf4\x72\xd7\x65\xe4\xb4\x7b\x25\x72\x3c\x85\x81\xb0\x36\xd8\x3d\x7c\xae\xb2\x8b\xec\x03\xd9\x8b\x3c\x5b\x01\x8b\x49\xba\x53\x65\xb2\x4e\xec\x64\x6b\x94\xb6\x8b\xbd\xb1\x23\xe8\x12\xdc\xdf\x81\xa1\x9f\x11\x86\x81\x2a\xc8\x32\x57\x99\x5e\x53\x81\x61\xe1\x11\xbb\xd2\x46\xe2\xaa\x25\x2f\xf6\xfb\x38\x20\x0e\x95\x34\xe3\xfd\x6a\xb4\xc8\x7a\x78\xa9\x6e\x26\xe3\xcb\xdb\x8b\x59\x40\x35\x75\x3b\xba\x1c\x4c\x90\x96\x95\xae\x43\xde\x58\x05\x14\x54\x28\x98\x1a\xb5\xd4\x52\x99\xf5\xe8\x8f\xc3\xd1\x65\xa4\x06\x43\x60\x5f\x7a\x94\x6f\xca\xdf\x03\x08\xa7\x80\x0f\x29\x20\x9c\x72\xa4\x51\x5d\xcd\xbd\x9a\x0c\x80\x5e\xe9\x72\x70\x35\xb8\x98\x4d\xa5\x9c\xea\xf5\x20\x52\x57\xc3\xd9\x7e\x26\xe1\xf1\x44\xca\xb1\x0e\x47\xef\x9f\xa3\xab\xda\x1f\x5d\xaa\x9b\xc1\xe4\x6a\x3c\xf9\xd8\x07\xaa\xdb\xab\xbd\x6d\xf3\x52\xab\xd3\x0f\xe3\xdb\xeb\xcb\xf6\x45\x76\xb0\x07\xd4\xf6\xe1\x0f\x03\x66\xc8\x9d\x0c\xa6\x37\xc0\x37\xf5\x79\x7c\xab\x8e\xec\x13\x47\x63\x39\x04\xe3\x89\x22\x8a\x2a\x64\xb7\x12\x94\xc6\x3d\xd5\x9f\x4e\x6f\x3f\x0e\xe0\xea\x8b\xf1\xd4\xd1\x50\x8d\x06\x17\x83\xe9\xb4\x3f\xf9\x4c\x9c\xc2\x30\xf2\x93\xc1\x4d\x7f\x38\x41\x3a\xab\xc9\xc4\x36\x62\x3c\x8a\xf1\x9d\xef\x11\x86\xbd\x18\x8f\x88\xa4\x78\x6a\xe7\xc2\x60\x3a\x25\x06\x2c\x3b\xbe\x8e\xc7\x97\x3a\x1a\xab\xd1\x98\xf9\xaf\xba\x06\xa8\x7f\x3b\xfb\x30\x9e\x0c\xff\x65\x70\xa9\x3e\x0c\x26\x03\x9c\x71\x83\x3f\x5d\x0c\x6e\x66\x72\xfa\xf9\xa6\xa0\xa4\x65\x1c\x68\x58\x0a\x50\x23\x97\x54\x06\x0a\x77\xb7\x9b\x3c\x53\xef\xa0\x8a\xb3\xa1\xdd\xc1\x16\x55\x87\x88\x32\x71\x48\x24\x8f\x68\xdf\x51\x7d\xe8\x0a\xc0\x0c\xf9\x1e\xe3\x92\x05\xb1\xb3\xa5\xbf\xb0\x2e\xe8\x3c\xa1\xd2\x52\x47\xf0\x97\x14\xd5\x4e\x1d\x9d\x9f\xf4\xd4\xd2\x1e\x61\xf9\x4a\xcd\xcd\x22\x87\x3d\x41\x23\x62\x16\x4f\x91\x39\x75\xa6\x0f\x52\x4d\x73\x9f\x09\xdf\x53\x7d\xea\x32\xe4\xae\x7a\xd8\x41\x83\x03\xb9\x27\x0e\xa2\x36\xe5\x9e\x1c\xeb\xc4\x8d\xaf\x8d\xc0\xcc\x36\x66\x54\x80\x82\x1c\x73\x77\x12\xc3\x64\x5d\x40\x34\x00\xe6\x66\x97\xd3\x58\x3f\x22\x27\x15\x85\xcd\x11\x76\x44\xeb\x75\xf6\xa1\xdc\x97\xee\x41\xf2\x85\x43\xa1\xa6\xe7\xce\x29\xc4\x42\x55\xd6\x92\xae\x38\xff\x34\xdf\x51\xb9\x30\x86\x9a\xba\xc4\xf8\x10\xb7\x72\xe4\x65\xe4\x96\x66\x91\xea\x42\x43\x46\xf1\xcf\x35\xb1\xe2\xa3\x82\x56\xd9\xeb\x96\x19\x0c\x4c\xbe\xa3\x7d\xb6\x20\x7f\x15\x30\x2f\x30\x9f\xac\x75\x8e\x59\x48\x27\x1c\xc8\x86\x1e\x41\x80\xbc\xca\xfa\x04\xd0\x54\x4b\x93\x55\xbd\x86\x94\x61\xdb\x7b\x82\x8c\x28\x56\x8e\xb3\x32\x12\x1c\xc0\x4e\xe0\xd0\xd5\x4e\x93\xef\x24\xc5\x7b\xdb\x40\x23\x68\xa2\x7f\x3e\x15\x0f\x87\x18\xd4\x52\x9d\xda\xc7\x9d\xb5\x7c\xac\xa6\xaa\xe4\xa6\xc8\x7d\x14\x06\x99\x4a\xca\xe4\x47\xbb\x1a\xbe\xe5\xd5\x40\xc9\x20\x38\x3c\xc5\x63\x65\x0e\x5d\xdd\x98\x22\xc9\x97\x87\x3d\x55\x67\x29\x88\xee\xf0\xca\xd2\x95\x0a\x2e\x81\xa6\x12\x86\x11\xe3\xa2\x49\x06\xe4\x77\x76\xfc\x40\x50\x2a\x57\x1b\xbd\x93\x0f\xd2\x6a\x5d\x57\x35\xc2\x0f\xed\x37\xc0\xd0\x12\x90\x13\x8e\x58\x3a\x38\xf4\x46\x97\x10\x02\x27\xf4\x2e\xa1\xa3\x5b\xef\x85\x89\x32\x1a\xe3\xe9\x43\x8b\xb6\x13\xcb\x42\x6f\xd9\x2e\x70\xf3\x18\x27\x69\xd3\x93\x6e\x67\x0d\x69\x86\x35\x1e\x00\x4b\x84\x06\x08\xc0\x7d\xe1\x00\x05\x32\xbe\xdc\x37\x54\x6e\xdf\xe1\xe4\xb7\x46\x04\x2d\x17\x24\xb5\xab\x1a\x23\x44\x4a\xb8\x62\x64\x99\x0f\xc2\x5a\xf3\xc8\x6c\x84\x4e\x6e\xa3\x4b\x64\x90\x71\xc7\x49\x47\xbd\x3d\x05\xdd\x9a\xda\x37\xf7\x6c\x7b\xcf\xf6\x55\xda\xbb\xf2\xd7\x1f\x37\x49\xe1\x36\xa4\xf6\x50\x08\xf3\x78\xe2\x87\xe4\x07\x9d\xd6\xa6\xed\x18\x36\xe8\x08\x1e\xd9\x5c\xf8\xb5\xc8\x29\xf6\x77\x5b\xc1\x94\x5b\x0c\xcb\x77\x0a\x53\xe6\xe9\x83\x59\x7a\xc0\xc4\x7c\x17\x44\x9d\x4c\x55\x21\x50\xaa\x27\xa9\x01\x0d\x6f\xa2\x34\x42\x5d\x5d\xf2\xaf\x90\xf6\x0e\xcc\x3c\xb9\xd1\x7a\xe0\xd1\x12\x25\xde\xe1\x6e\x62\x87\x5d\x0c\xc5\x9e\x57\xe9\xea\x31\x2a\xfd\xc5\xd8\xa9\x65\xdd\x86\x05\xa8\x4d\xda\x79\xb6\x34\xf8\x76\x1d\x0a\x7b\x0d\x9f\xe4\x85\x6f\x00\x8e\x11\x4e\xe1\xbc\x08\x0a\x29\x10\xd4\x34\xca\xd5\xc4\x54\x45\x4e\x0c\x91\xde\x85\x0d\x75\xb3\x25\x77\x87\xed\x97\x38\xa1\x1a\x6d\xff\xee\x48\x83\x02\xdc\x77\x47\x73\x07\xf1\xb2\xbd\x30\xa8\x11\xe4\x5d\x06\xa7\x88\x58\xca\x93\x47\x9e\xee\x2e\xf6\x92\x17\x25\x91\x89\x95\x26\x4d\x4d\x51\x12\xcb\x97\xa7\x35\x7a\xd0\x69\xb2\x14\x27\x3d\x65\x77\x9d\x38\x7d\xe9\xa3\x11\xce\xdc\xf1\x2f\xbd\xa5\x27\xea\x14\x21\x1b\x86\xd7\xe9\x49\xfc\x88\x4e\x3f\x98\x70\xa3\xb1\xba\x18\x4e\x2e\x6e\x3f\x4e\x67\xd6\x60\x9e\x82\x05\xed\x3e\xc2\x90\x14\x2a\x51\x78\xf1\x89\xfd\xd2\x12\xbd\x48\xc8\x52\x48\x99\x89\x88\xc4\x3f\xa4\x95\x1c\x81\xe5\x2b\xac\xe3\x48\x39\x6a\xd7\x29\xff\xad\xcb\x38\x75\xd7\x4d\x6f\x6f\xac\xbf\x32\x61\x2b\x9a\x35\x27\xc0\x9b\x18\x4c\x23\xc1\x1a\x3b\x1b\x23\xf1\xed\x60\x32\x1d\x8f\x1c\x87\x6c\x8b\x3b\x36\xd4\x13\xd9\x4b\x24\x4b\xcf\xbb\xf8\xd0\xb7\x5d\x05\x3d\x8e\x47\xfd\x25\xfe\x9e\x7d\x2e\x4b\x85\xbc\x1f\x8f\x2f\x3f\x0d\xaf\xaf\x23\xf5\x69\x3c\xf9\xa3\x9a\xce\xc6\x37\x37\xfd\xf7\x03\x3b\x82\x1f\x6f\x6e\xed\x4d\xaf\xfa\xc3\xeb\x5b\xe4\xa3\xfd\xd8\xbf\xbe\xba\x1d\x5d\xe0\xdd\xa8\xf1\xa0\x00\x73\x7d\xed\xbc\x8c\x8f\xd6\xb9\x0a\x5a\x89\x0f\x03\x4e\x61\x12\xec\x70\xc3\xf3\x99\x5e\xc8\x87\xfe\x0f\x03\xf5\x6e\x60\x3f\x1d\x59\xaf\xe9\x39\x62\x1e\xd3\x98\xfd\x08\xee\x61\xa0\x52\x42\x77\xb6\x4e\x51\xff\xe6\xe6\xfa\xb3\x1d\x7b\xff\xa1\x1d\x82\xcb\x41\x7f\xf6\x01\x04\x52\xe0\x75\xf4\xaf\xd5\x70\xf4\xfd\xed\xe4\xb3\x9d\xb3\x93\xc1\xf4\xf6\x7a\x66\xa7\xd5\xd5\x64\xfc\x51\x34\x78\x2a\x25\x4c\xc8\xed\x1b\xfc\x69\x36\x18\xe1\x63\x86\x17\xf0\x9e\xaf\xfb\x9f\xec\x34\xf9\x30\x7c\x37\x9c\x4d\xf1\xdb\xbe\x99\xb1\x9a\x8e\x3f\x0e\xd4\xf7\xb7\x93\xe1\xf4\x72\x78\x81\xec\xcb\x97\x63\x6c\xea\xf5\xf5\xf8\x13\xdd\xf4\xe2\xfa\x76\x0a\xbd\x9a\x34\xfa\xe8\x27\xc7\xde\xb9\x11\xa9\xe9\x18\x87\xc7\xdf\x07\x35\x0c\xdc\x8d\x3e\xf6\x3f\x87\xa3\x63\xbd\x50\x14\x87\x8e\x69\x9b\x2d\x99\xd2\xd6\x1a\x2c\x8c\x5f\xef\x97\xdd\x52\xf0\x21\x79\x17\x16\x40\x63\xe1\x70\xd9\x42\xf4\x33\xf1\x4e\xb6\x74\x82\xba\xba\x48\x30\x31\xde\x7d\x84\x45\x2a\xaf\x61\x17\x4d\xaa\x52\xd5\x55\x92\x26\x7f\x75\xdb\x89\x94\x31\x6d\x04\x4d\x7c\x01\x52\x95\x23\x3b\x12\xd8\x42\x7b\x1b\xde\x20\xd0\x81\x43\xb0\x08\xc7\x02\x8b\x81\xcd\x5f\xea\x04\x33\x6b\x50\x0b\xec\xcb\x03\xc9\xf0\x96\x1c\x80\x79\x61\x87\xb5\xa3\x74\x74\x91\x3b\xca\x74\xac\xcd\x17\x32\x4c\x0e\xef\x42\x42\xc6\x31\x32\x1d\xa2\x3a\x37\x1c\x4d\x83\x6c\xa9\x6e\x4b\xa0\x43\x9a\xed\x03\x23\xa1\x34\x7a\x01\x29\x90\xa4\x32\xeb\x08\xb9\x4a\x34\x56\x1b\x36\x98\xc4\x5e\xfd\x4e\x5d\xc4\x57\xf1\x24\x56\x67\xf1\xe9\xc9\xa9\x3a\x1a\x2f\xaa\x58\x9d\x7e\xf7\xdd\x37\xbd\x88\x81\x1c\x80\x56\x58\xc9\xdb\xba\xe0\x79\xc0\xf1\xfc\xe8\x05\x0d\x95\x03\x5d\x92\x12\x98\xe3\x36\x61\xc6\x6a\xdf\xa2\xd3\xb3\xf8\xec\xf4\x4c\x1d\x4d\xcd\x86\xdb\x04\xe8\x72\xdb\x26\xac\x0c\xa8\xee\xdb\x97\x03\xbd\x9f\xef\xd5\xd9\xeb\xf8\xf5\xd9\xc9\xd9\xf1\xa9\x43\x9e\xb9\x3f\xbd\x52\x47\xdf\xd7\x99\xe1\xde\xda\x57\xb5\x77\xbc\x95\x5e\x00\x5e\x66\x1f\x8e\x07\x99\x64\xf2\xd2\xd9\xa3\xa5\x01\x16\xb1\xea\x3e\x50\xd9\x3f\x8f\xff\x51\x45\x91\xc3\x8e\xba\x7b\xca\x6a\xcc\x0b\x9d\x26\xab\xbc\xc8\x12\xad\x42\x39\x76\xb0\x7b\xda\xb9\x23\x11\xd9\x06\xed\x59\x96\xd1\x73\x24\x8d\x2e\x0b\xda\x8b\x7e\x82\xf4\xbb\xdd\x3f\x7c\x45\x75\xa3\x2a\x55\x38\x25\x2d\x49\xfc\xb4\xd9\xb9\x86\xd4\x7a\x20\x45\x4f\x46\xef\x95\x59\x02\x18\xf1\xc2\x69\xe5\x63\xe2\xa7\xb0\x4d\xcf\x08\xf2\x84\x86\xa6\x18\x1e\x4e\xdf\xd6\x1b\x03\xb6\x19\x7c\x9b\xbf\x7c\x61\x8d\x5b\xac\x13\xd4\x59\xa5\xed\x26\x5e\xe8\x48\x7e\xfd\x48\x97\xb2\xa4\xa4\x47\x38\xb1\x07\x93\xd5\x46\xa1\x14\x74\x92\xc9\x6f\xd3\x3d\xe5\x4d\x04\xb6\x2c\xcd\x4b\xaf\x7e\xde\xda\xf6\x59\x9a\xfc\xb1\x72\xda\x05\xb4\xdf\xeb\xa2\x77\xc9\x9d\x7b\xb5\x73\x56\x4d\xff\x0d\x55\xfa\x3f\x37\xc1\x55\xfe\xa2\xad\xe6\x98\x99\xaf\xa2\xd0\x0a\x38\xf8\x2a\xc0\x44\x50\xb1\x83\x74\x6f\xfd\xa2\xee\x02\xcb\x85\xc7\x5b\x3f\x03\xa9\xe5\x3d\x99\x65\xcf\x4e\x8a\xaf\x46\x67\x77\xb5\xc6\x02\x19\xed\xf5\xaa\xdd\x0c\x85\xd3\xa8\xa8\xcd\x32\x20\xc4\x5b\x16\x58\xa4\x84\x97\x41\x8a\xc5\xb3\x5c\x35\x75\xde\x5f\xc5\x0d\xa1\xf3\xcf\x10\x5f\x6b\x38\xc0\x9f\xa1\x96\xe8\x7f\x8e\xc8\xf9\xb3\x2a\xac\x93\xb2\xac\xbb\xea\xab\xbb\xf4\xd1\x05\x9c\xf9\xb7\x50\x47\xe7\xaf\xfc\x83\x6b\xa3\xc7\x8e\xe5\x0c\xc3\xe4\x6c\x09\x85\xb4\x72\x0e\xf2\xc1\x01\x72\xb6\x4d\xa0\x45\x90\x80\xcd\x33\xe3\xde\x78\x17\x7a\xd6\xf1\xad\xd9\x23\x39\xc2\xd2\xc0\xcd\xbd\x9e\x1b\x88\x37\x31\x34\x85\x77\x20\xc9\xc5\xe6\xb4\x8c\x34\x94\x9b\x43\x59\xf1\x9e\x07\x39\x42\x47\xb0\xbc\x65\x5f\xec\x94\xf1\xb4\x70\xf6\xb7\xf2\x3e\xdf\x42\xd0\x6d\xa3\x0b\x93\x55\xf7\xa6\x24\x26\x50\x61\x0a\xbf\x51\x83\x5f\x81\xc3\x28\xb6\x16\x9d\xef\xd4\x19\x10\xd8\x36\x33\xcc\x6f\xd4\xcc\x59\xac\xba\x74\x2f\xa0\xcd\x65\x8d\x7d\xc6\xe5\xd1\xc5\x0b\x1e\x3c\xeb\xf4\x68\xde\x83\xc7\xd1\x2d\xde\xa8\x67\xf0\xb9\xd3\x3d\x70\x38\x37\xba\xd0\x77\x85\xde\xdc\x8b\xa0\xad\xbc\xa3\xdb\xb8\xdf\xfc\xcd\x44\xe9\xf8\xce\xf7\xb1\x5d\xf9\x3d\x64\x3f\xd1\x55\x17\xaf\x55\x8b\xfd\xea\xc9\x6e\xc1\x7b\x0c\xdf\x12\x1f\x77\x6f\x3a\x48\xe2\x9f\x31\x46\x41\x2b\x71\x80\xfe\x67\x70\x93\x75\x4c\x58\x8c\x05\xbf\x41\x5d\xe2\xc7\xca\xf9\x1a\xdf\x7e\x75\x64\x70\x0a\x0a\x6c\x14\xde\xc5\xa9\x7f\x21\x05\xc2\x0a\xb6\xda\x2f\x2d\xfd\xb4\xfd\xe4\xb4\xa2\xb6\x24\x4d\xed\x97\x6a\x41\xdd\x89\x90\x22\xc4\x57\x6e\xd2\xba\x6c\x2a\xf2\xf8\x52\x5b\x7f\x6c\xb0\xfe\x15\x02\xaf\x4a\x27\xaa\xcc\x87\x89\x3d\x54\x93\xd4\x17\xd7\x58\x03\x42\xa7\x5e\x6d\x67\x0f\xc3\x16\x1e\xdd\x54\x21\xe0\xaa\x8d\xd8\x6d\xd4\x45\x52\x02\xae\x4d\x18\x24\xcf\x60\xa9\xc0\x61\x86\x81\x75\x8b\x5d\xe3\x48\x7f\xce\x6b\x5a\xe8\x1d\x0e\xb0\xbb\xfa\x55\x1b\xd4\x32\xf8\x13\x44\x73\x54\x1f\x64\x98\x28\xfa\x0f\x6c\x6f\x54\x24\xec\x04\x97\xff\xce\x05\x9a\x1c\x8f\xa5\x9a\x88\x56\xb8\xa2\x5d\x3e\xc1\xd5\x9a\x98\x76\xb5\x5b\x7d\x53\x2a\x1d\xd5\x8b\x50\x18\x61\x17\x5c\x27\xa4\x6f\x1d\xc3\xe7\x1b\xe8\x32\xa0\x73\x65\x81\x08\x74\x51\x17\x2d\xd7\xe6\x09\x45\x0c\xa1\xa0\x81\x99\x39\xde\x15\x3c\xb8\x0a\xa1\x36\x9b\x1d\x63\x87\xdc\xe3\x10\x33\x9c\x10\x47\x94\x97\xa9\x0f\x2b\x09\x90\x49\x8e\xdc\xc4\x24\x23\x4d\x02\xd8\x35\x9c\x9f\x12\x18\xa3\xf6\x99\x44\x1c\xa0\x03\x76\x1b\xb7\xfb\x55\x52\x5b\x6e\x9e\x58\x3f\xc4\x76\x30\x5e\xe4\xeb\x97\xb4\x89\xbf\x8c\x0f\xa6\x2d\x7e\x7e\x01\xa6\x32\xc1\x59\x15\x90\xfc\xd8\xc5\x81\x88\x19\x08\x26\x3d\x85\x98\xa1\x01\x60\x9a\x25\x64\xd3\x49\x13\xeb\x8b\xb0\xae\xd3\xb5\x80\x06\xc3\xbe\xc9\x8a\x4a\xce\x09\x40\x67\x5b\x18\xc8\xa8\x80\xe5\xb1\xa4\xad\x76\xff\x63\x68\x20\xc5\x2f\xaf\xff\xe5\x63\xff\x18\x67\x8f\xb5\x50\x7e\x75\xfd\x9f\x93\xd3\xb6\xfe\xef\xf9\xab\x6f\xbf\xea\xff\xfc\x2a\x3f\xc3\xf8\x5b\x35\xb5\xab\xc5\x7a\x6c\x3c\x09\x60\x1d\xd9\x79\x01\x7b\x89\x5d\x75\x80\x3c\x86\x53\x15\xff\xee\x2e\x3d\x18\xde\xe5\x85\xba\xd1\x0f\x69\xfe\x00\x6b\xaa\xbf\x4e\x0a\x35\xfd\xab\xf9\x02\xc5\x23\x90\x72\xac\xab\xfb\xdc\x2b\x95\xee\xbb\xaf\x7d\xe6\x08\x00\x74\x3e\xa0\x80\x12\xa0\x0c\xa7\x87\x5a\x55\x4c\x59\x5b\x73\x69\x97\xe9\x35\xfd\x9a\x26\xd9\x17\xa6\x76\x5e\x1a\x75\x94\x17\x6a\x9e\x64\x10\x59\xcb\xf4\xda\xf4\x78\xaf\x46\x46\x6f\x4f\xe0\xf7\x44\x53\xbc\x1c\x20\x6e\xf9\x02\x8a\x98\x7d\x31\x4b\x87\x6d\xae\x9a\x12\x32\x17\xe8\xac\xde\x00\x12\xc9\x05\xc7\x1e\xfc\x51\x80\xb1\x8c\x75\xb3\x9e\x24\x30\x09\x7f\x62\x63\x05\x31\x7b\xc7\x29\xf5\x48\xf3\xae\x3b\x9a\xf7\x0f\xb1\xf7\x7d\xfd\xb1\xfb\xff\xbf\xa4\xc9\xfc\x97\xd1\x7d\xe7\x9f\xa7\xf6\xff\x6f\x5e\x9d\x37\xf6\xff\xd3\x6f\xcf\xcf\xbf\xee\xff\xbf\xc6\xcf\x5f\xd3\x64\xee\x76\x80\x50\xea\xfd\xf7\x3b\xa3\x8b\x3f\xa8\xdf\xb7\x44\x48\xff\x80\xd4\xfe\x2e\xbf\x85\x1a\x65\x58\x5d\xfa\x42\x97\xc7\x49\xf9\xc2\xc7\xba\x91\xeb\xae\x69\xba\x39\x16\x09\xc0\x8d\x64\x39\xc1\x46\xb6\xac\x1c\xc1\x67\xc6\xdc\x60\xb2\x26\x4d\x3c\xf3\x5b\xb6\x6b\x66\x51\xfd\x26\xe9\x08\x37\x45\xfb\x62\x29\x56\x1e\x72\xa9\xea\x6c\x97\x67\x42\x6c\x41\xf6\xaa\xa5\x83\xe3\x7d\x4c\x91\xed\x13\x21\xf8\x92\x24\x08\x72\x62\x61\x4c\x58\xdd\x4e\x38\x3d\x49\xa5\x56\x85\x81\xa3\xb1\xb1\x41\x7b\x75\x6c\xa7\x81\x0a\x42\xeb\x5e\x22\x1c\x99\x8c\x5a\xdd\x43\x7f\x0c\xc8\x09\x8c\x5a\x27\xa5\x4b\xa4\x99\xe5\x5b\x0f\xf8\x07\x1f\x03\x60\x4f\x2e\x18\xb2\x2d\x72\xaa\xd8\x72\x1c\x49\x6e\xc8\xa4\x28\x48\xf8\x34\x64\xb0\xf1\x2a\x4f\xa2\xa8\x7a\x8d\x20\x28\x2e\xba\xa7\x52\xcb\x40\xed\x96\x69\x66\xf4\x06\x64\x20\x90\xcf\xba\x76\x05\x07\x4d\x31\x2e\xd0\x4c\x01\x65\x40\x70\x7e\x5c\x79\x0d\x17\x41\x81\xbc\x5c\xba\x03\x62\x5b\xb3\xe4\xcc\xaa\xa8\x49\xe8\x1c\x16\xc0\x79\x19\xce\x23\xb6\x3b\x4f\x9c\xc9\x33\xa1\x9a\xca\x6e\x1a\xa4\x02\xd7\x20\xbd\x02\xa5\x79\xd8\x3c\x17\x74\xa2\x76\x2e\x03\x86\xd9\xdf\x7a\x89\x3f\xfa\x13\xbf\x04\x7e\xbf\xe3\xfe\xc5\xcd\xf0\x97\x3a\x05\x1e\xdf\xff\x4f\xcf\x5f\xbf\x6e\xee\xff\x67\xdf\x9c\x9f\x7c\xdd\xff\x7f\x8d\x1f\xfb\xde\xd5\xb1\x72\xae\x3c\x1f\x05\x7d\x4e\xbb\x1f\xec\xff\x48\x0d\x3f\xde\x8c\x27\xb3\xfe\x68\xa6\x8e\xd5\x64\xd0\xbf\x54\xef\x06\x57\xe3\xc9\x00\xa4\xc7\x01\x96\x35\x1c\x4d\x67\xfd\xeb\x6b\x90\xff\x9e\xa8\xdb\xe9\x70\xf4\x3e\x3e\xb8\xcc\x5d\xe5\x0e\x24\xbb\xf4\xf2\x69\xd1\x6c\x4f\x58\x73\xb4\xc8\x81\x16\x92\xaa\xd3\x01\xeb\xcc\x4d\x04\x98\x73\x95\xa4\x9e\x41\x66\xa1\x0b\xb3\xaa\xad\x8b\x50\x18\xbd\x6c\x6c\xb4\x5d\x72\xcb\xa0\x81\x60\xdb\x44\x3c\x15\x28\xe2\x8c\x61\x2d\x7c\x48\x20\x13\xd7\x32\xae\x93\xd2\x8f\x8f\xdb\x45\x97\x39\xa1\x77\xcb\x7b\xac\xe4\xc2\xaf\x47\xfc\x01\x05\x0f\x7d\xfc\xc7\x3f\x2d\xa6\x03\xc0\xab\xb4\x8f\xc6\xb3\xe1\xc5\x40\x4d\x9b\xe5\xc1\x49\x89\x88\x9f\x63\x71\x8c\xff\xd7\x7f\xaa\xd3\xef\xbe\xfb\xee\xf8\xec\xe4\xe4\x9b\x08\x99\x3c\xd5\x45\x5e\x6c\x30\x03\xe4\x68\xdc\x4a\x53\x3c\xf8\x4d\x97\x90\x7f\x84\xff\x3c\x8b\x4f\x69\x2b\x4c\xca\xb0\x9e\x0b\x76\x3d\x79\x4f\x0c\xa1\x24\xd5\xa3\xe4\x9d\x82\x59\x06\x29\xbc\x3d\x2d\x70\x28\x74\xe4\xce\x74\x4c\xae\xcb\x2c\xef\x92\xf8\x19\xc5\xa4\x89\xd4\x22\x7f\xc0\x42\x62\xaf\x3e\xe6\x0f\x76\x5d\x3d\x87\x58\xd4\xd1\x99\x9e\xc5\x67\x44\x7c\x4a\xe2\x12\x11\x1c\xdb\x00\x05\x82\x2a\xf5\x88\x43\x91\x94\x30\x62\x9d\x58\x63\xe7\x20\xc6\xd6\xb0\x94\x42\x86\xd7\x64\x08\x0f\xe3\xa7\x92\x60\x1d\xe2\x8b\x47\x87\x17\xb6\x1b\x66\x89\x3a\x8d\x3d\xc8\xfc\x16\x85\x79\xc8\x17\x08\x50\xd9\x98\x62\x63\x6c\xd3\x23\x54\xba\xd8\x26\x4b\xaf\x10\x85\x2f\x00\xda\xfd\xa2\x14\x4c\xfc\x7c\x28\xcf\x75\x49\x8f\x0f\x02\x72\x74\x00\xa6\x3b\xeb\x2f\x63\xaf\x8f\x0e\xc7\x7c\x2c\xf2\x1b\x86\xe6\x90\xda\x7d\x84\x38\x97\xa5\xcb\x5c\x95\x51\x40\x21\x58\x7b\x3d\x8b\x4d\xaa\x77\x38\x52\x79\x21\x81\x0a\xb2\x9f\x8c\x0b\xc0\x48\xa6\x0b\x5a\xba\x77\x28\x8a\xff\x11\xa2\x06\xbd\x7a\x6b\x1f\xe1\x5e\xd8\x79\xf8\xc2\x78\xb7\x32\xc0\x5c\x27\x85\x3f\x90\xb4\x20\x3b\x66\xbe\x63\x0c\xd0\x87\x52\x01\x47\x8f\xb5\xa1\xc7\xfc\xd2\x02\xf9\xe4\xc5\x2e\xb0\x11\x2c\x79\xe1\xd2\xa8\x8c\x0d\x77\x94\x6b\x1d\xe3\xfb\x98\xd8\x85\x6d\x01\xfc\x0a\xc9\x86\xb5\x1d\xcc\xf6\x30\xc2\x90\xfb\x6c\xe2\x56\x2a\x41\x34\x64\x2d\xd6\x49\x26\x6b\xf9\x43\x1d\x0b\xc9\xa7\x0b\xf0\x6c\x99\x59\x94\x75\x9f\x89\xb0\xdd\xa9\x80\xe5\xbe\x35\x98\xf0\x08\x36\xb7\x5b\x59\xaf\x46\x0c\x64\xb5\x6f\x70\xb0\x14\x38\x60\x7b\xca\x8b\xb6\x40\x82\x84\x53\xce\x77\xe8\x6e\x30\xd3\x8b\x29\xab\x7c\xb3\x31\x69\x90\x97\x7f\x8b\x48\x9a\x46\x2f\xb1\xac\x63\x9f\x7c\x04\xd6\xe9\xae\x1a\xc7\x89\xd0\xec\x07\xb3\xdc\xa0\x4a\xee\xb9\xdd\xbc\x47\x97\x43\x00\xbe\xd2\x74\x3d\x8f\x01\x74\xba\x6c\xb0\x3a\x51\xea\x00\x26\xdf\xc4\x21\x68\xae\x6a\x40\x44\x79\x0e\x28\x4e\xb1\x74\xdd\x22\x48\x13\xf8\xda\xeb\x4a\x63\x96\xe9\xb1\x45\xd8\x78\x19\x54\x46\xe3\x9a\xb1\xa2\x66\x48\xbc\x28\x3e\x2c\x20\xa5\xf4\x73\xc6\x1f\x43\x98\x3e\x8a\xc4\x67\x82\x88\x1d\xd0\x63\x98\x10\xbb\x70\x23\xe8\xd5\xdc\xfc\xf8\x8a\x92\x5d\xfb\xe1\xe0\x47\x58\x04\x17\x3e\xdb\xe1\x90\x6c\xe0\x54\xf2\x44\x8b\xfc\x56\x80\x62\x85\x00\xed\xb0\x73\x35\xe8\x7d\x83\xa2\xc0\x18\x91\xeb\x2f\x43\x22\x21\x64\x8b\x20\xc7\xc6\xf1\x3a\x83\x5a\x9e\xd8\x77\xa0\x8a\xa9\x62\xf4\x00\xee\x04\xad\xd5\x5a\x31\x49\x39\x27\xca\xe0\x2e\x71\xa3\xc9\x3c\xb6\x5c\xb8\x45\x49\xdc\x06\xb2\x34\xbc\x87\xd7\x1b\x46\x38\xa4\x59\xc2\x12\xcf\x0b\x77\xef\x7d\x4f\x01\xf7\x6e\x9d\x80\x24\x33\x88\xaa\xac\x03\x35\xd6\x60\x8e\x78\x49\xeb\xfd\x48\x66\x38\xc8\xbb\x56\xb4\x5b\x0c\x67\x4f\x2d\x86\x2c\xff\x6f\xb2\x1e\xf2\xba\xfa\xdb\x96\xc4\xdf\x32\x8d\xf9\xd8\x6e\x51\x39\x3a\xad\x20\x61\x17\x3b\xd3\x08\x06\x2c\xf0\x40\xf7\xad\x06\xf2\x69\x31\xd6\x92\xfc\xd5\xb8\xfe\x88\xf3\xd6\x0f\x21\x57\x0a\xed\x1f\x31\xe1\x77\xbb\xae\x63\xa9\x3f\x61\x57\xb1\x70\xc8\x23\xf4\xa4\x21\xe9\x9a\x45\xec\xb7\x29\xff\x0e\xfb\xc3\x3a\x11\x88\x9b\x6e\x0b\xce\xac\xe7\xf9\x32\xe9\x50\x40\x70\x77\xf6\x18\xc1\xf0\x11\x9e\x0f\x16\xd8\x1a\x9f\xba\x79\x78\x62\x05\x6d\xb5\x43\x6a\x0f\x70\x3f\xb5\xcf\xbb\x26\xe5\x40\xb0\x2e\x35\x3e\x4d\xb2\x66\x6a\xf7\xe7\x4e\x5b\xaa\x3f\x26\x31\xb2\x47\xf7\xe7\x9f\xb3\xe7\xfe\x8c\xc9\x8a\x30\xbb\xb6\x28\xcf\x79\xfc\x8a\x8d\xba\xc2\x10\x56\x85\xdd\x96\x08\x99\xf8\xd9\x0c\xa9\x4c\x61\x60\xda\x71\x08\x6e\x9f\x15\xe1\x6e\xfd\x4d\xac\x46\x94\x59\xb6\xd7\x02\x1d\x06\x5e\x97\x05\x24\x7a\x82\x58\xa2\x5b\xad\x0c\xbf\xe4\x60\xa5\x0c\xd7\xd2\xcb\x07\x53\x54\x49\x9b\xef\x10\xb5\x92\xd6\x1c\x7b\x43\x2d\x30\x72\x86\xf1\x91\x4b\xa3\xd3\x24\xbb\x03\xb3\xdd\x51\x5e\xd2\x36\x8b\x8b\xa5\x43\xb0\x39\x98\x03\x8e\x3c\x10\x20\xd2\xdb\x22\xa9\x2a\x93\xb9\x85\x4e\x44\x58\xce\x7d\x63\xcd\x24\xc1\x6f\xd0\x1f\x5d\xaa\xc1\x9f\xac\x77\x0f\x95\x51\xd7\xc3\xfe\xe8\x82\x3d\xc2\x57\xd6\x78\x19\x8e\x66\x83\x6b\xf5\xb1\xff\xc7\xc1\x54\x8d\xc6\x9d\x99\x7b\x35\x19\xbc\xef\x4f\xa0\x58\x0d\xea\xc6\xc6\x57\xb3\x4f\xfd\xc9\xc0\xd3\x69\x7c\x18\x4c\x06\x71\xf8\xd9\x78\x32\x7c\x3f\x1c\xf5\x7d\x29\x12\x3e\x07\xca\x97\x26\xc3\x1f\x06\x97\xf2\xaf\xee\x5b\x92\xa3\xe3\x10\x90\x05\xd1\x21\x74\x01\xaf\xfb\x34\xa4\xca\x28\xba\xc8\x95\xb1\x8d\x27\xb3\x48\xf5\xa7\xd3\x21\xd6\xe1\xb9\x78\x05\x15\x90\xcd\x26\xfd\xe1\x88\x62\x17\x58\xef\x85\x3c\x11\x83\x69\xfc\xd8\x9d\x6f\x6f\x2e\xfb\x33\xa8\xff\x1a\x7d\xb0\xb7\xfd\x38\x18\xcd\xa0\x2e\x0c\x0a\xa7\xa6\xd6\x0c\xe4\xef\x43\x01\xdc\xd5\xf0\xa2\x7f\x7d\xfd\xd9\x0d\xff\x14\xab\xe4\x90\x15\x44\xb2\x7e\x8c\xaf\x04\x95\x07\x14\x76\x45\x6a\x34\x1e\x11\x59\x07\x3c\x07\x7a\x7d\x35\x9c\x8d\x06\xd3\xe9\x5e\x96\x8f\xd8\xbd\x48\xeb\xe5\x8e\xec\xfb\x1b\xfc\x60\xbf\x8c\x35\x64\xd8\x34\xa8\x51\xb3\x0d\xf1\x55\x64\x50\x52\x06\xb1\x01\x3b\x54\x33\xc7\x69\x81\x55\x6f\x9e\x7b\x63\xf6\x61\x38\xb9\xc4\xfa\xb1\xc8\x55\xfd\x5d\x8f\xa7\x30\x4c\x57\xc3\xd9\x34\xc2\xdf\x2e\xfb\xb3\x7e\xe4\x4a\xf3\x6e\x91\x7e\xe4\x62\x3c\x9d\xc1\xef\x37\x93\xf1\xc5\xed\x04\x7b\x05\xa5\x70\xef\x88\x65\x03\x8a\xf8\xe0\x91\xfc\x3a\xa0\x3a\x6f\x6f\x79\xe1\xfe\x8a\xc2\xfe\x64\x38\x85\xf7\x7b\xeb\x79\x3a\xfa\xef\x27\x03\x78\x68\x44\x15\x99\x50\x73\xd8\x27\xca\x8e\xfe\xc5\x8c\x6a\xd4\xb0\x3e\x33\xa8\xc1\x8b\x70\xce\x4d\x88\xab\x64\xf8\x03\x7c\x85\x0b\x38\x79\x58\xa7\xaa\x7f\xf9\x03\xf0\xa4\x50\x24\xe7\x79\xa5\x7f\x83\xe9\x40\x94\xb3\x4d\xe9\x5d\x61\x35\xdb\x68\x3c\xfb\x34\x9c\x7d\xb0\xb3\x18\x96\x9b\xbd\x9d\xab\x63\xc4\xbb\x0b\x56\x12\xa6\x7a\xb9\xa2\xd7\xfb\x71\x38\x1b\xd8\xc5\xfa\x71\x70\xf9\xd9\x4f\x8d\x73\x61\x1e\x7a\x30\xbc\xf9\x11\x19\xbf\x69\xe7\xdc\x67\xf2\x39\xb2\x3b\x19\xd6\xcb\x0b\x55\xee\xca\xca\xac\x05\x7d\x17\x60\x9a\x03\x62\x49\xde\xba\x10\x4f\x29\x42\x29\xd9\xce\x8b\xbe\x08\x0f\x10\xb7\x4c\x14\x44\xd7\xa9\x8f\x1a\xdd\xc6\x6a\x1a\xab\x4b\xb3\xd1\x45\xc5\x80\xed\x0b\xcc\xdb\x98\x90\x26\x55\xdf\x99\x6c\x81\x90\x82\xe0\x6a\x51\x4e\x31\xb5\x66\x70\x29\xaa\xa3\x1a\xe5\xce\x6e\xa4\x70\x7c\x4a\x4f\x07\xef\xd3\x49\xae\x61\xc1\x2d\x61\x27\x3f\x7e\xe2\x6b\x1a\x38\x17\x93\xbb\x4c\x2d\x4d\x59\x51\xb1\x71\xd4\x7c\x3f\xa0\x1b\x64\xbc\x79\x15\xd8\x15\x54\x3c\x92\x17\xd5\x4b\xf7\x3c\x1f\x97\xf2\x89\xbc\x0e\xfc\x98\xbd\x77\xaa\xb7\x65\x24\x8a\x2e\x00\x82\xbe\x34\x05\x42\xd1\x71\x1c\x65\xde\xca\x8d\x5f\x3c\x8d\xd9\x6a\xe8\x2f\xd7\x49\x66\xdb\x84\xe7\x8f\xe7\x51\x2c\xc5\x54\x83\xc0\x68\xc9\xda\x2b\x38\xcb\x92\xca\x9f\xc9\x58\x11\x69\x6d\xa1\x64\x99\xe8\x22\x31\x25\x26\x0d\x5b\x7d\x43\xe6\x96\xc5\x7d\x06\xa0\xf3\xa5\xae\x34\x54\x47\x59\x1f\x28\x12\x51\x43\x28\xf2\x2f\x1e\xc0\xfc\xd9\x37\x9b\x29\x72\x01\x35\xf5\x05\x56\x87\xa2\xab\xd8\x7e\x9d\x77\xbe\x7e\x8e\x5a\x4c\xb3\x8b\xa3\x30\x34\x85\x59\x38\xd0\xb6\xd4\xeb\xf6\x43\x6f\xfd\x2d\x30\xbd\x08\xf3\x1a\x1a\x9a\x1a\xa8\x74\xb3\xf6\x60\x59\xd6\x85\x7d\x43\xd1\xde\xf5\x02\xd3\xc8\x07\x6b\x78\x7d\xb8\xdb\x50\x5e\x2a\x7e\xf9\xce\x98\x02\x22\xcd\xbf\x18\x06\xe0\x89\xfc\xff\xc9\xab\x93\xd7\xcd\xfc\xcf\xab\x6f\xbf\xf9\x9a\xff\xf9\x35\x7e\x0e\xed\xe1\xf0\x6e\x30\x98\x1c\x83\x25\x45\x27\xfa\xa1\x3a\x9a\x18\xb2\xeb\x5f\x9d\xf5\xde\x1c\xfc\x7e\x73\xff\xe5\x9f\xae\x0a\x63\xde\x4d\x2f\xe3\xf1\xe4\xfd\x1f\x5c\xf6\x98\x22\xd7\x50\x28\x0d\x4a\x35\x24\x77\x87\x16\x3b\x5e\x40\x49\x54\xe2\x7a\x55\xcb\x5c\x6d\xef\x75\xe5\x34\x66\xb6\x9a\x2b\x5a\xf1\xc0\xa8\xea\x15\x16\x72\x6e\x8d\x5a\x1b\x53\x21\x15\xea\x52\xef\xbc\x1e\x46\x75\x9f\x64\x5f\xc4\xe5\x0a\xb3\x1f\xd5\xbd\x4a\x2a\x47\x2a\xab\xe6\xf5\x4e\xad\x8d\xd2\x6a\x6e\xb0\xc4\xaa\x30\x55\x5d\x64\xea\x26\xaf\xd3\xe3\x0f\x26\x83\x85\xf2\x47\xbd\xde\xfc\xf7\xce\xd1\xfe\x92\x3f\xf1\xcb\xf1\xc5\xc5\xcc\xe3\x3f\x8f\x4f\xe3\x93\xbf\xf7\x4e\xf0\x14\xfe\xe7\xec\xec\xdb\x26\xfe\xf3\xf5\x37\x5f\xf1\x9f\xbf\xca\x0f\x40\xd6\x2f\xfa\xd3\x8b\xfe\xe5\x80\x68\x6a\x41\x40\x48\x80\x01\x21\xeb\xf3\x7e\x74\xab\xae\xdf\xdf\x5c\x3b\x94\xe0\x59\x7c\x1a\x03\x50\x3e\x47\x18\x0b\x02\x2f\x93\xd8\xc4\x44\x84\x8d\x61\xa3\x9e\x8f\x61\xa8\xc3\x2d\xb2\xf4\x6b\x48\xfe\x96\x04\xb6\x9e\x17\xba\xd8\x1d\xc2\x7a\x15\xb4\xae\x9e\x47\x9b\x2c\xa0\x7b\x28\x0a\x13\xf5\x2b\x89\xd7\x22\x17\x37\x42\x51\x5e\x04\x80\x07\x90\x56\x72\x93\xa1\x1f\xa6\x2c\x4d\xa1\xde\xa3\x78\xe6\x3e\x18\xe4\x59\x7c\x2a\xf4\x84\x1a\x24\x09\xb2\xd3\xa1\x35\x1b\xb6\x5b\xb4\xba\x2b\xea\x11\x8c\xfe\xcc\x5a\x2b\x79\x9a\xdf\xed\x54\x0a\x9d\xb1\xc6\xcd\x91\x44\x1d\x61\x0c\xf3\xe2\xf2\x1a\x85\x3f\x93\x85\x5a\xa4\xba\x2c\x4d\xd9\x63\xf8\x3a\x27\xa2\x85\xd6\x4d\x93\xfa\xdf\x76\xe9\x2e\x79\x30\x22\xca\xeb\x55\x65\x48\xd2\x07\xf8\xdd\x82\x40\x0e\x17\x6a\x79\x65\xe6\x04\x19\x3f\x4b\xc6\x5c\x61\xb1\xe6\x1c\x64\x77\xf3\x4c\xad\xf4\x22\x49\xa1\x00\xd4\x3f\x9f\x53\x5f\x7b\x7a\xed\x01\x38\xbf\xf5\xaa\xf8\xc7\xf9\x89\x5f\xbe\x9b\x5e\x1e\x63\xfc\xfc\x18\x22\x64\x7f\x7f\x33\xf0\x89\xfd\xff\xec\xd5\xe9\x37\x2d\xfc\xff\x37\x5f\xf1\x3f\xbf\xca\x4f\x08\xf9\x3c\x3b\x39\x3d\x8d\xd4\xa5\xa9\xcb\x6a\x17\xa9\xeb\xeb\x8b\x83\x4e\x9c\x48\x23\x66\xad\x91\xb6\xab\xed\xf1\xdb\x0d\x05\x93\x07\xf6\x92\x39\xd2\x90\xdb\xf3\xa0\xa4\x2c\x3f\x68\x6f\xa0\xff\xb2\x0e\x44\x39\x80\x9a\x13\xc0\xff\xd6\xb9\x0a\x37\xb0\x67\x65\x5d\xff\xaf\x46\x60\xbd\x6c\x26\x83\x28\x2c\x4e\x46\x6a\x3b\x03\x9c\xb9\x9c\xa5\x48\x50\xca\x87\xb5\x62\xe5\x4b\x17\x2b\x8f\xb1\x05\xad\xf8\x32\xe8\x2c\xd9\xb1\x05\x7f\x96\xff\x5c\xb2\x57\xbb\x90\xa5\x6e\x24\x8f\xce\x75\x87\x26\x5b\xe6\x05\x46\x3c\x38\x7a\xdc\x1d\x1a\x0e\xdf\x80\x2b\x60\xe0\x82\xa8\x30\x22\xbc\xf1\xc0\x58\xd7\x36\x78\xef\xf1\x01\x04\xc3\x3a\x23\xac\xef\x3e\x13\x93\x2e\x23\x92\x3e\x8c\xaf\x2f\x07\x13\x64\x31\x13\xcc\x62\x53\x8a\xc5\x62\x28\xb6\x3f\xfa\xdc\x41\x7a\x2c\xc2\x9b\x01\xff\xf1\xbb\x5b\x00\x3a\xb9\xe8\xd4\x6c\x1c\xc1\x43\x9f\x15\x15\x7d\x56\x10\x54\xd9\x6e\xb9\x88\xf7\x65\x57\x20\xb4\xab\x97\x14\x4c\xf4\x7d\xf4\x6c\x67\x57\x8e\x48\x0d\xc3\x8f\x3e\x10\x29\xe9\xcd\x1c\xe7\xd9\xe0\x4f\x83\x8f\x37\xd7\xfd\xc9\xe7\x47\x28\xcf\x8e\x9e\x18\x92\x9f\x10\x23\x7d\x2b\x03\xad\x11\xc5\x5e\xc7\x13\x0e\xc9\xbe\xb5\xff\x7e\x77\x3b\x1d\xc2\xa0\x0d\x47\xb3\xc1\x64\x72\x7b\x33\x1b\x8e\x47\x3d\xf5\x61\xfc\x69\xf0\xc3\x60\x82\x51\xd0\x4b\x18\xdd\x31\xb2\x32\x77\x06\x41\x7d\xc0\x53\xf0\xd2\x4d\x67\x93\xe1\xc5\x4c\x5e\x36\x7e\x8c\xd3\x2e\xe0\xb1\xeb\xb9\x40\x2d\x91\x41\x7f\xea\x7f\xf6\x31\xdb\x01\xd3\x29\x07\x33\xd6\xb3\xaf\xf5\x2f\x7f\x18\x4e\x9f\xc3\xb0\xf6\x0f\x69\x76\xc4\x2f\x47\xfd\x69\xff\xf8\x34\x3e\xff\xad\xe2\x3f\xe7\xe7\xe7\xdf\x34\xfd\xbf\xd3\xd7\xdf\x7e\xad\xff\xf8\x55\x7e\xec\xdb\x57\xe3\x9b\xc1\x48\x4d\xc7\xb7\x93\x8b\x81\xcf\x7f\xa8\x1f\x06\x13\x20\xd2\x3b\x8d\xcf\xf1\x34\xe8\xbe\xec\xe8\xd0\xfd\xfb\xb0\xa7\x2e\x07\x57\x76\x0b\x81\xa5\x06\xfb\xa6\xdf\x72\x26\x03\xa2\x92\x44\x76\x46\xa6\x9b\x84\xdf\x3e\x8e\x2f\x21\x0f\x36\x63\xe6\xbe\xc9\x40\x5e\x60\xef\x71\x31\x98\xcc\xfa\xb0\xa7\x10\x53\x63\x33\x69\x78\x7d\xfd\x59\x4d\x06\xd7\x83\xfe\xd4\x1f\x52\xb7\x23\xd8\x2b\xa7\xb3\xfe\x6c\x30\x55\xef\xc7\x3f\x0c\x26\x23\xcc\x93\x4d\xa1\x3d\x83\xe9\x60\x34\xf3\x97\xcb\x0b\xec\x3e\xf4\x59\x5d\x0f\xa7\xf0\xf9\xe0\x7a\xfc\x49\x1d\x1d\xb6\x2e\x38\xec\xc5\x8f\x3e\x28\xea\x78\x52\xeb\x26\x11\x30\xbf\x8f\x60\xdb\x1d\xd9\x23\x16\x32\x68\xc7\x48\x19\xf9\x6e\x30\x1a\x5c\x0d\x2f\x86\x7d\xdc\x68\xed\xc1\x64\xf7\x79\x3c\x2c\x82\x61\x84\xfd\x3e\x1c\xb8\x29\x6f\x7b\xd3\xdb\x77\xdf\x0f\x2e\x66\x6e\xd0\x20\xef\x3a\x1e\x0d\xd4\xa7\x0f\xc0\x47\x3f\xf5\xef\xc7\xfe\xdb\xdd\xc3\xfe\x82\x2f\x67\xd0\xbc\x3d\xbd\xe5\xe6\x9d\xa1\xc7\x38\x0d\x30\xc5\x3b\xf4\xec\x99\xc0\x88\x6f\xb7\xf5\xc1\xf8\xca\x76\x3a\xc2\x81\xef\xcf\x28\xb1\x16\xa9\xfe\xc5\xc5\xe0\x66\x46\x7b\xfd\xd5\x2d\x9d\xc2\x93\xc1\xf4\x66\x3c\xa2\x7d\x7b\x48\x84\xa9\xe3\x77\xd7\xc3\xf7\x94\x0d\xb3\x07\x4d\x1f\x9e\x38\x1c\x35\xf2\x78\xf1\x81\x20\xb5\xeb\x43\x34\xfe\x8d\xfa\x77\xfb\xa3\x5a\x1f\x78\xc8\x80\x43\xbd\x5f\x9a\x32\xb9\xc3\x8c\x8b\xfd\xda\xb3\xbe\x33\x4b\xaa\xd4\xf0\x43\x6e\x4b\x03\xa2\x51\x32\xf3\xf1\x97\xda\x94\x95\x59\xc6\xea\x26\x35\xba\x34\xea\x87\xa4\x4c\x5c\xcd\x7d\x77\xcb\x6e\xf2\x84\x93\x58\x59\xa5\x17\xc0\xb0\xd7\x7e\x34\x3d\xd4\xda\x9f\x40\x2d\x63\x5f\x43\x80\x3c\xec\xc7\xea\x50\x50\x2a\x1c\x12\x2b\x52\xeb\x79\xc4\x9c\x68\xd4\xd2\x3c\x98\x34\xdf\x60\xde\x21\x40\x55\x78\x40\x3c\x03\xf6\x25\xaf\x13\xc6\x06\x1a\xf4\x37\xd4\x88\x77\xd0\x08\xc4\x2b\x20\x55\x7d\x89\x0d\x61\xcc\x25\xc1\x69\x31\x7d\x81\xb4\x93\xbb\xa6\x00\x37\x23\x6b\x19\xba\x9a\x08\xe2\x67\x17\x6a\x20\x5c\x45\x49\xc4\x66\xd6\xca\x0e\x54\x24\x41\xda\x15\xdc\x90\x7b\x93\x35\x94\xf4\x90\x66\x0e\x03\x3d\x01\x1c\x5f\x29\x75\x11\xab\xc3\x4b\x04\x37\xf3\x10\x42\x26\xed\x1e\x5d\x01\xa2\x1c\xf3\xd0\xef\xe6\x7d\x3a\x33\xa8\xf3\x1d\xdd\x0a\xf9\x43\x92\xb5\xbe\xc3\x0c\x95\xcf\x55\x2e\xcd\x43\xb2\x70\xad\xb8\xc4\x56\x38\x27\x87\x9b\x82\x42\xf5\xcc\x1b\xc3\x40\xe7\xfd\x6d\x29\xcc\x9d\x2e\x96\xc0\x0f\x9f\xaf\xf0\x1e\x94\xf5\x82\xa7\xf2\xe3\x06\xb1\x3a\xbc\xd6\xc5\x9d\x29\x80\xa8\xc8\x3f\xad\x49\x78\x49\xfc\x32\x30\x98\x65\xc7\xf3\xac\x13\xc3\x72\xaa\x4e\xb4\x13\xc6\xdc\xdd\xa2\x34\x1b\x0d\x71\x40\x97\x37\x6d\xde\x26\xd0\xc1\x91\x5c\x8a\x8f\x55\x64\x50\x4f\xae\x62\x75\x28\xe7\xc1\xa1\xe3\x59\xdb\x61\x51\x97\x67\x74\x12\xcc\x32\x04\xa1\x6b\xd0\xf5\x40\x0b\xa3\x27\xe8\x7a\x84\x27\xd8\xde\x2e\xf2\xa2\x63\x8c\x10\xd7\x44\x84\x47\x4d\x50\xf7\xa3\xbc\xa6\x88\x06\x62\x3f\x76\xca\xda\x70\xa7\xaf\xd5\xed\xf4\x42\x9d\x9e\x9c\x0a\xbd\x74\xf0\x7c\x91\x63\xd1\x77\xb4\x35\xd2\xda\x87\x5a\xb5\x12\x33\xc0\x0b\x29\x12\xf0\x0a\x97\x98\x49\x57\x01\xd7\x6b\xe7\x1e\xf0\x3e\x56\x87\xad\xa1\x90\x6b\xa9\x3d\xad\x30\xc5\x59\x18\xd8\x33\x03\xd9\x26\x5f\x92\x34\xdf\x75\xec\x9d\x30\xb5\xda\x7f\x5e\xfa\xad\xdd\xee\xec\x90\x22\xcf\x00\x56\xb6\xc4\x6d\xd4\xfe\xc8\x19\x20\xe2\x07\x51\x10\x02\x86\x0d\x70\x01\x14\x3e\xd9\xae\x15\x3c\x65\x7a\x4e\xee\xfa\x87\x58\x1d\x4e\x58\xa2\x4d\x4c\x3d\xbb\x15\x6d\xef\x73\xe6\x5b\x2d\xbb\xa7\x7d\x57\xb7\x9b\x04\x48\x92\x34\x87\x9f\x3a\x84\xa7\x2e\x3b\xb6\x8b\xa6\xb8\x70\xe7\x63\x91\x16\x31\x7c\x97\x5e\x9f\x6c\xad\x3d\xb6\xee\x7b\x78\x10\x45\x27\xc4\x63\x00\x3c\x8c\xac\x4e\xb4\x3f\xd6\x59\x65\x0a\x3b\xb3\x22\xdc\xec\x10\x5c\xb7\x7f\xd7\xe4\x27\xfc\x31\x56\x87\x53\x9d\x06\xd3\xc5\xfc\x88\xb8\xe7\xbd\x1d\x00\x52\xa9\x3c\x33\xb0\xd5\x9a\xbf\xd4\xc9\x83\x4e\x41\x8f\x4c\xa7\xb5\xbb\xf3\xb5\xbd\x73\xe3\x9b\xf2\x29\x1d\x87\x5f\x5b\xfe\x16\xa1\x2a\xac\xde\x01\x4b\xc7\xed\x73\xfc\xa0\x8f\xb1\x3a\xbc\x2d\x83\x7b\x07\x6c\x9e\x85\x32\xeb\x4d\x9a\xef\x24\x18\xa5\xb3\x4b\xa2\x44\x39\xe6\x63\xff\xfd\xa4\x8f\x01\x01\xb4\xc0\xfd\xd1\x7f\x0b\x73\x67\x94\x67\xc7\xa4\x10\x83\xa8\xea\x37\xee\xd6\x41\x41\x5b\x58\x19\xd7\xde\x4d\x89\xf6\x3a\x90\x19\x6e\x6a\x6f\xd8\x13\xb7\x49\xb5\xc4\x4f\x69\x6f\x7a\xa4\xd3\x4c\x25\x3c\x55\x8e\x0f\x70\x6b\xa5\x59\xcb\x43\x35\x50\xc7\xdb\x04\x64\x6b\x51\x92\xe3\x18\x2a\xb5\x5c\x2d\x59\xae\x4c\x76\x67\xe7\x16\xed\x8c\x3e\x5e\x07\x72\x06\x94\xa1\x30\x05\xe3\x26\xf6\xb4\xed\x0d\x0d\x22\x56\xe3\xdd\x96\xc6\xff\x7e\x16\xaa\xa9\xfb\x0f\x00\xfb\xeb\xd7\x81\xff\xe0\x55\x1c\xcc\x1a\xff\xc1\x37\x4d\x3c\xb0\xff\xe8\x5b\x78\x8a\x35\x38\xbc\x11\x85\xaf\xf3\x7f\xe6\xab\xc4\x6d\xac\x61\x05\xfe\x2f\x7a\xc1\x76\x7f\x0a\x5e\xec\x18\x95\xee\xec\x61\xef\x3f\xba\xc0\xd2\xfe\x86\x90\x4b\x4d\xef\x95\xb9\x04\xdf\xc5\x28\xc0\x28\xa8\x68\x8d\x14\xde\xc7\xfd\x34\x14\x2d\x0e\xcd\x5c\x0a\x56\xb7\x76\x90\x64\x15\xb1\xe8\x0b\x6a\x5b\xde\x9b\xf0\x9b\x49\x69\xed\x1e\x6f\x58\x05\x33\x04\x76\x2d\xb6\x8a\x98\x74\x34\xf8\x3a\x14\xdb\x94\xad\xf6\x22\xf7\xf6\x82\x5e\xbe\xbb\x75\x30\x17\x62\x35\x14\x4a\xcd\xae\xeb\xde\x16\x16\x37\x24\x63\xc8\x57\xb0\x74\x59\x1c\x97\x9d\x63\x9d\x64\x7e\xa0\x4b\xbb\x47\xda\xb1\x82\x01\x4f\xf3\x2d\xb4\xcb\xcf\xd9\xb0\x14\x11\x2b\xff\x4a\xbd\x36\xae\xb2\x15\x64\x67\xc5\x25\xcc\x53\xe0\xc9\xc5\xe0\xf2\xe7\xad\x49\xb7\x9d\x4b\x47\xd7\x6e\xea\x83\x8b\xe1\xcd\x70\x30\x9a\xf9\x7d\x3d\x3c\xc1\x8b\x8e\x92\x83\xce\xb7\xcf\xcd\x83\x4a\xa1\x4e\x73\x8a\x58\xe5\x56\x01\x37\x11\xbf\x37\x92\x48\x71\xd3\xf4\xfc\x43\x1c\x2c\xa2\x4f\xf7\x26\x03\x90\x8f\x16\x63\xe8\x33\xe9\x04\x7e\x94\x7f\xe8\xde\x4a\xa4\x2b\x15\xb4\xae\x5b\x92\x17\x45\xb6\x1f\x31\x23\x64\xe1\x28\x2e\xef\xe1\xea\xe7\xb4\x50\x96\xaf\x4a\xa5\xd2\xc0\x5c\xf4\xf7\x47\xfe\x44\xbb\x9e\xa1\x88\xb6\x59\x19\x8c\xfc\x20\x4a\x3f\xe8\x24\xc5\x9a\x5f\x57\x55\x43\x79\xb0\x67\x76\xd3\x7a\xc3\x79\xb1\xd6\xcc\xfe\x7d\x6f\xe7\x73\xce\xcc\x7f\xcd\xc7\x42\x65\x9b\x20\x1f\x5f\xeb\x2c\x83\x1a\x57\xa4\xe1\x46\xfd\x00\xad\xd6\x66\x99\xd4\x6b\xb5\xa8\xcb\x2a\x5f\xa3\xd3\x0d\x29\x2a\x50\x14\xe7\x07\xb3\x2d\x26\xfc\xfd\x41\xb8\xfb\x43\x77\x9a\x80\x55\x99\xd4\x0b\xd3\x70\x54\x2e\x5d\x7a\xcc\x02\x0a\xa5\x3e\xb6\x91\xff\x6b\x97\x1f\x90\xa6\x2a\xc9\x40\x88\x4a\x58\x5c\xf3\xb4\x9d\xf8\x73\xcc\x96\x5e\x7f\x20\x30\xf0\x2b\x27\x02\x15\xea\x3f\x23\x12\xa2\xc1\x28\x42\x3c\x30\xeb\xfc\x81\x10\x73\xf3\x42\x2f\xbe\x18\xbb\xfd\x30\x41\x61\xfc\x6f\xdc\xec\xd9\xe3\x23\x01\x7d\x70\x75\x26\x2b\x47\x4e\x0c\x01\x12\x66\x9e\x46\x4a\x6c\x47\xb1\xdb\x1e\x09\x47\x51\x0d\x2d\xc3\x1d\x11\x27\x06\xe7\x11\xe1\xbe\x18\x94\xd0\xa5\xf5\x93\x10\xf6\xfc\xf4\xa0\xee\x8c\xc6\x62\x21\x6b\x2f\x74\x78\x5a\xc1\x58\x98\xce\xa1\x68\x10\x11\xfd\xdf\x9f\x07\xfd\xc9\xff\xb3\x17\x8b\x6d\xdd\x53\xc9\xee\x32\xdf\x59\xef\x0d\x3c\x38\xe4\x39\xa0\xd2\xc1\x89\xe4\x39\xf8\x79\x23\xbd\x48\x1e\x92\x14\x80\xc3\x60\xdd\xe4\x59\xba\xfb\x1f\x34\x34\x3c\x36\xa3\x5c\x74\x3a\x29\x31\xea\xe6\x63\x08\xe1\x4d\x71\xb3\x87\xc8\xa6\x3a\x7d\x1d\x01\xb2\x1b\xeb\xb2\xed\x10\x8f\x61\xd7\xdb\x33\xd0\x17\xb4\xfc\x65\xf8\x0e\x4b\x71\xef\xb5\x9d\x84\x06\x8a\x0f\xed\x98\x04\xb1\x97\x3d\x7e\x68\x33\xa8\x28\x8a\x0e\x99\xe1\x95\x62\x10\x14\xc1\xa4\xe5\x68\x9f\xda\x15\x02\x84\x8d\x8f\x76\x3b\xd8\x8a\x84\x82\x21\x18\x01\xa5\x54\xaf\x76\x5b\x58\x8b\x53\xb6\xf1\x9c\xa6\x25\x05\x15\x03\xab\x3a\x5d\x25\x69\x2a\x9c\x3a\x50\x3e\x01\x77\x1f\x64\xce\xa2\xf6\x20\x79\xa3\x06\x19\x22\x4c\x7c\x17\xc3\x99\x88\xee\x6e\x9a\xdf\xc1\x07\x24\x77\xc6\x22\xf6\xe4\x52\xba\xf1\xa4\x72\xe0\x66\xcd\x71\xe3\xa2\x88\x7b\x64\x6d\xe6\x40\x93\xb3\xec\xe8\x5e\xf0\x45\xb2\x66\x4a\x1e\x1a\xf1\x6e\x83\x17\x2a\x9b\xd4\x7a\x97\x48\x0b\x6f\x7e\xd4\xeb\x8d\x3d\xf8\xe6\x3b\x19\xd7\xe8\x2a\x46\x6e\xda\xaa\x3f\xb1\x18\xd9\xcd\x2a\x09\x51\x6b\xad\x63\x52\x67\xa7\xde\x09\x22\x80\x08\x41\x70\x58\x46\x0b\x0e\x3e\x46\x49\x80\x25\xea\x21\xff\xe2\x97\xc0\x65\xac\xfa\xe1\xab\x25\xd2\x62\xef\x54\x35\x76\x9f\x3d\x6e\x0a\xb5\x45\xb7\xbf\xe0\x62\x31\x68\xaf\xef\x75\xcc\xa4\x31\xc6\x6d\xa7\x4d\x27\xa9\x1c\x60\x04\x43\x2a\x48\xdb\x16\xa2\x44\x1a\x5e\x00\x46\xac\xf0\x91\x8e\x0f\x5c\x44\x8c\xfb\x1d\x8f\x03\xbb\x07\xa3\x24\xb4\x37\xb9\xa5\xd8\xb9\xe6\xe1\x1d\xb2\xac\xcf\x3a\x47\xba\x98\xa8\xb3\xc4\xd2\xe3\x2f\x29\x0b\xb1\x6b\x68\x7d\x60\xe5\x05\xa2\x69\xf6\x47\x0c\xe9\xe0\x83\x27\x26\x60\x50\x73\x1f\x72\xa7\x2f\xc4\x6c\xd5\x54\x3f\x12\xcc\x21\x77\x7d\xa4\x38\x57\x61\x9b\x52\x1a\xf3\x45\xd8\x60\x92\x47\x6e\x69\x8f\x12\xeb\xc6\x92\x37\xb4\xa2\xb0\x6c\xab\x6d\x2f\x90\x29\xb4\xd9\xb0\x17\x18\xa3\x4d\x16\xc9\x46\x0c\xe6\x9e\xe0\xf7\x10\x45\xbd\x56\x2b\xa0\x11\xc9\x95\xb5\x05\xbe\xa8\xba\xb4\xcf\x87\xed\x54\x27\x44\x76\xb0\x58\xd4\x10\x86\x2f\xcc\x22\x2f\x96\xe5\x23\xf9\x8c\xc0\xc0\x8b\x50\xe8\x14\xf8\xf6\x37\x7b\x03\x58\x11\x8a\xa5\x51\x36\xcc\x36\xa4\x80\x3c\x99\x29\xf6\x85\x6c\xe7\x3b\xf5\x90\x94\x89\x63\x5d\xf0\xc7\xf7\xd6\xcc\xcb\xa4\xe2\x04\xd8\xbf\xc7\xc1\xc8\x00\xfa\x0a\x38\x3d\x80\xae\x07\x94\x68\xbc\x6d\x1c\xd6\xee\x82\x25\x6b\x27\x64\x89\x7a\x15\x5e\x5b\x04\x4e\x79\x5a\x7e\x72\x52\xb7\x13\x5d\xd2\x7a\x47\x39\x7d\xd1\x4b\xde\xbb\xfc\x2d\xb0\x31\x1d\xdd\xa5\x2b\xb7\x66\xae\x6c\xe7\xfc\x14\x43\xb4\x1a\x59\xf4\x7a\xb1\xb0\xcb\xb4\x75\xe2\xb0\x9d\x03\x2c\x7a\x99\xe6\x60\x24\x79\x6b\x2b\x62\x9b\x82\xcc\x97\xf6\xcf\x58\x61\x71\x31\xe4\x25\x61\x2e\xe4\x59\x52\xe5\x05\x85\x6d\x99\xb5\x50\x20\xcc\xa8\x34\x10\x44\x9f\x00\x3d\x8c\x4b\x00\xef\x61\xbf\xd6\xea\xd7\xbf\xfd\xf7\x9d\x80\xec\x62\x75\x24\x44\xe7\x3b\x65\x8e\xd7\x24\x59\x0e\x58\xf2\xa7\x93\xb4\x69\x52\x52\x90\x61\x91\x02\xef\xc8\x37\xf1\x55\x1c\x35\xa6\xae\x98\x8b\xff\xab\xa6\xef\xdf\x75\xc8\x9e\x37\xd7\xdf\x77\x98\x9a\x81\xb2\x9c\xae\x18\xbd\xde\x34\x03\xed\xe9\x99\x26\xe6\xc1\xb0\x34\x5c\x18\x4f\x73\x4e\x9d\xd3\x7b\x01\xb6\x25\x8e\x4f\x3d\x24\x79\xaa\x49\xd8\xd0\xfc\x48\xca\x81\x5e\xbe\xb6\x51\x3b\x59\x62\x52\x0e\xe3\x0b\x35\x08\x4d\x80\x1e\x3e\xf1\x6f\x10\x57\x8c\xef\xc2\x3d\x30\x5b\xae\x56\xc9\x02\x06\xdc\x33\x90\x80\x21\x02\xa3\x41\x7f\xc3\xd4\x2f\x07\xd5\xba\xb6\xff\x0f\xed\x33\x79\x71\x9f\xe7\x18\x4a\x05\xb2\x29\xc7\x63\x8a\x5c\x67\xd6\xf2\x34\xb0\x2f\x44\x8e\xb6\x35\xe2\xb5\x1e\x59\xeb\xca\xac\xb3\x04\xb5\xb0\x5f\x82\x80\xb0\x66\xed\xc8\x79\x4a\x3a\x5f\xc8\xf6\x94\x19\xaf\x6d\x84\x0e\x83\xb7\xa6\xf7\xa5\x7c\x5a\x8d\x5d\xe6\xaa\xcc\x05\xd9\x35\x90\x31\xd9\x17\x48\x96\xd4\xdc\xdc\x6b\x6b\xfc\x13\xa5\x47\xee\xfe\xd2\x75\x98\x86\xd9\x75\xf7\x20\x8a\xe4\xe9\x66\xc4\x82\xd5\xfd\xf4\xbc\xcc\xd3\xba\x32\xe9\x4e\x2d\x52\xeb\xd4\x39\x91\x3c\x08\x81\xfe\xad\xa3\x64\x27\x21\xbc\x01\x7e\x7f\xba\x92\xc9\x8f\x34\xcf\x4c\xcc\xf4\x37\x11\xab\x97\xbb\x8f\xa9\x72\x36\xe7\x67\xad\xba\x0c\x1b\x48\x72\x3e\x98\xa2\xd5\x65\x97\x4c\xf2\x0d\x4b\xb2\x45\x5d\xf8\x00\xed\x1a\xed\xf5\xc2\x94\x75\x0a\x2b\xf6\x27\x76\xd3\x77\x2c\x6c\xb9\x48\x50\xb6\x26\x26\x72\x27\x85\x49\x67\x50\xd8\x5a\xcf\x31\x9a\xdf\xb2\x15\x11\x46\xc0\xe8\x01\x77\x4c\x3d\x0d\x12\x10\x81\x9e\x40\xc4\x09\xab\x8b\xc4\xf3\x61\x14\xec\xc1\x96\x3a\x0c\x36\x58\x54\x28\x2d\xae\x4b\x22\xba\xea\x9a\x3a\x10\xef\x7a\x26\x1e\xc2\x05\x35\xc9\x2a\x96\x4d\x48\xca\x90\x3e\xb8\x6b\x9d\x7f\x0f\x22\xad\x76\x38\x9c\x7a\x58\x20\x8c\x29\xe5\x71\x58\x1d\x47\xec\xe9\x25\x67\x70\x36\x35\x2c\x22\x76\x4b\xec\x9c\xf4\xe5\xe3\xf6\x8e\x77\xa0\x16\x68\xcd\xdc\xa0\xdc\x7a\x5f\xc5\xbb\x7d\xaf\xe4\xf2\x62\x61\x27\x17\x88\x85\xe5\xd0\xb2\x92\x3f\x10\x26\x8d\xd5\x95\x4e\x52\x08\x1c\x3a\x43\xda\xd3\xd7\x85\x37\xe1\xa7\xc1\x8c\xb5\x27\x4a\x91\xac\x13\xa4\x9a\xe4\x69\x29\xe4\xb3\x52\xbd\x2d\xbb\xc2\x38\x5c\x87\xde\x3c\x48\x74\x43\xf6\xd2\x11\x04\x13\x4b\x41\x46\xa6\x3f\xe4\xff\xf9\xaf\x70\xa2\xba\x23\x1b\x65\xf4\xbc\x9c\x2e\x67\x25\x48\x56\xd7\x31\x16\xb9\xad\x25\xec\x9f\x4b\x11\x08\xea\x96\xf1\x95\x44\xc7\xa3\x0a\x72\x9f\x81\x73\x6f\xd5\xa7\xfe\xf0\x07\x22\x78\x19\x8e\x2e\x07\x1f\x47\x0e\x77\xe9\xd3\x09\xa3\x5c\x7d\xa2\xb5\xfd\xa6\x13\xe3\xd7\xc1\xb8\x72\xe8\x54\x5c\x10\xa1\xdd\xa5\xe4\x32\x18\x02\x30\x9c\xca\x00\x06\x97\x11\xe3\xf9\x01\x20\x38\x9d\xf5\x67\xb7\x33\x10\x3d\x7f\x02\xf6\x1e\x3c\x01\xe0\x83\x9d\x8d\x04\x76\x96\x8b\x31\x48\x6c\xab\xd9\xd8\xb3\xad\x40\x2a\x25\xfa\x29\x34\x2b\x4f\x55\x13\x20\x03\xc9\x64\x30\xb8\x1c\x7f\x64\x8a\x1a\xcf\xca\xf2\xd3\x5a\xfc\x6e\xa0\x06\x93\x09\xdd\xcf\x41\x27\xc3\x6f\x5f\x8e\x2f\x6e\xed\x9d\x89\xa9\x66\x78\xe5\x5e\x47\xd4\xea\x76\x37\xfc\x33\x04\x49\xaa\xcb\x31\x10\xf9\x40\xb1\x02\x3c\xef\x63\x7f\x34\x1a\x4c\x40\x5a\x9e\x6b\x0a\xfa\x23\x35\x18\x5d\x8e\x27\x53\xfc\x4a\x17\x92\xd5\x01\x3d\x27\x43\x00\x8b\x52\xa6\x8a\xa7\x01\xea\x8c\x03\xd6\x94\x05\xc7\x2f\x07\xd3\xe1\x7b\xfb\x36\x3e\xf4\x27\x97\x88\x1f\x95\x4c\x41\x97\xb7\x17\xb3\x06\xbd\x0c\x09\x8f\x63\x3e\xac\xa1\x5c\xee\x4a\x01\xba\xba\x7c\x75\x3b\xb1\x37\x88\x3a\x9a\x2d\xb8\x77\xae\xaf\x1f\x59\x3f\x82\xd3\x48\x62\x74\x3d\xf6\x15\xde\x04\x60\x7d\x11\x89\xea\xd1\xc9\x12\x20\x3b\xba\x94\x08\x5b\x35\x9c\xd1\x22\x8a\x0f\x7d\xc6\xe4\x93\x4e\x1e\x88\x76\x6b\xc8\xa7\xea\x1b\x31\xa4\xf0\xee\xa6\xf6\x05\xc3\x92\x0e\xd4\xe9\xb9\x2f\xef\xfb\xc3\xd1\x74\xf6\x04\x40\x79\x38\x9b\xba\x42\x8d\x31\x95\xf1\x4c\x6f\xdf\x89\x3f\x01\xa4\xf7\xd3\xe0\xfa\xda\xfe\xbf\xe3\xf5\xc6\xb6\xdb\xee\xb7\x17\xd3\xc7\x5e\x03\xcf\x01\x9e\x67\x62\x70\x23\x75\x39\xf8\xd8\x1f\x5d\x4e\x23\xaf\xeb\x3e\xf8\xd3\xcd\x60\x34\x95\xba\xfa\xae\x18\xc4\x4b\xd5\x03\xbc\xdc\x97\x91\x40\x11\x0e\x8b\xff\xdb\x8b\xdc\x3c\x7a\x07\xd8\x70\x92\xf3\x0f\xa7\x4e\xf4\xdc\x0e\x88\x0b\x1d\x61\x12\xee\xa3\x38\xfe\x1f\xc6\xd7\x97\x76\x32\x7f\xbc\xb6\x1b\xc6\x2f\x3d\xf4\x51\x43\x95\xff\x66\x30\xf9\x38\x9c\x11\xd0\xfc\xba\xff\x29\x0e\xba\x35\x1d\x5f\x0f\x88\xe9\xc7\x95\x2b\xc1\x08\x7e\xec\xcf\x00\x52\x0f\xfd\x79\x37\xa0\x5a\xab\x8f\x83\xcb\x61\x7f\x36\x88\x6c\x0f\xae\xfb\xb3\xc1\xa4\x7f\xad\x66\xf6\x01\x23\x27\xce\xdf\xc4\x5a\x33\x02\x69\x30\x72\x57\x0b\xfc\xd1\xcc\x14\xeb\x84\xc1\xd4\xb3\x30\x99\xcb\xa1\xe9\x46\x7e\xde\x9e\x84\x78\x46\xa3\x38\x04\xdd\x01\x24\x22\xf2\xb5\x13\x04\x4a\x56\x81\xb5\xbe\xd2\x49\x4a\xac\x9d\xeb\x4d\xba\x73\x80\xde\xb2\x3b\xf9\x4e\xee\x97\xfb\x52\x5d\x50\x9d\x77\x96\x67\x0d\x3a\x1c\x0c\xab\x15\xd5\x4e\x1d\x9d\x9f\xf4\xd4\x52\xef\xc0\x84\x9c\x9b\x45\xbe\x06\x1b\x0b\x23\x96\xab\x8e\xef\xc7\xea\x76\x93\x67\xae\x0b\x58\xe8\xd8\x6d\xc1\xaf\xd7\x66\x99\x68\x74\x30\x20\x12\x23\x18\x95\x9f\xcc\xeb\x63\x4a\xc6\xc3\x10\xca\x7d\xc1\x60\xe2\x37\x4c\x77\x6e\xb4\xc9\x32\x9e\x17\x46\x2f\xc0\x20\xf1\xad\x43\x9b\xa5\xac\x8b\x07\x16\x79\x76\x2a\xf6\x02\x86\xd2\x6d\x8b\xbe\x8b\xd5\xd4\x7a\x1d\x64\x74\xbd\xd9\xaf\xd2\xee\xe7\x03\x90\x11\x3d\xe8\x34\x01\xce\xbd\x40\xa7\x9d\x8c\xb6\x96\x08\x7a\x25\x65\x9b\x99\x6c\xd2\x28\xb8\x09\xb8\x20\x85\xd7\x65\x67\xa7\x04\xe7\x9c\x59\xeb\x04\x39\x9d\x57\xcf\xc1\x0f\x5f\xc4\xaa\xef\x1f\x7e\xad\xb7\xad\xd9\xdc\x25\x84\x1e\xda\xc1\x2b\x92\x3f\x07\x41\x6b\xeb\xc3\xae\x88\xcd\x9d\x23\x36\x91\x94\x0e\x9f\xd7\x28\x66\xe1\xa9\x30\x23\xb5\x34\x38\xf8\x1c\x0c\xf5\xfd\x6c\xc3\xbb\x00\x7c\x69\x74\x46\x61\x3c\xeb\x2c\x0b\x4f\x20\x5c\x7b\x51\xe0\xb8\x53\x52\xd2\x2c\x13\xe3\xbc\x74\x88\x34\x9b\x52\x64\x37\x06\x59\x65\x0d\x7a\x40\xa4\xb1\xbf\xd1\x1a\x14\x0f\x0a\x26\xcc\x26\x7e\xa9\x96\x5f\x42\x2c\xad\xfb\x4a\xf8\xc0\x80\xf5\x90\x83\x94\x7b\x33\x85\x10\x47\xdc\x89\xe0\xa4\x29\x4a\xb3\xb4\x26\x38\x16\x1b\x93\x88\xc7\xda\x64\xd6\xcd\x22\xa8\xcb\x7c\xe7\xc2\x30\x8e\x37\xd1\xb5\x66\x59\x83\x14\xba\x59\xd4\x62\xb1\x34\x06\x63\x10\xab\x77\x09\x76\xa5\x8f\x84\x8b\x76\xc2\xbf\xdb\x41\xe8\x6a\x53\x71\x17\x85\xb0\xc0\xf3\x10\xbe\xc1\x4e\xb1\x5a\x25\xa0\xda\x5c\x95\xcc\xea\x58\x01\x3a\x0a\x54\xcf\x5a\xa0\x25\x4d\x1b\xe7\xd3\x98\x23\x9a\x09\x1c\x25\xf3\x77\x21\x67\xd0\x6f\x51\x7b\xef\x89\xae\x8b\x48\x36\x34\x23\x7c\xa8\x7e\xeb\x6f\xbd\xa0\xc0\xdf\x9e\x90\x7f\x52\x52\x3c\x0e\x93\x78\x3e\xb5\xc5\x99\x73\xb3\x0c\xf2\x48\x0f\x90\x23\xc6\xe8\x6a\xf9\xc6\x03\xb9\xff\xfd\xdf\xff\x21\x0b\x3c\x9f\xf8\x89\x5f\xbe\xbf\xb9\x3e\x3e\x8b\x4f\x8e\x21\x3e\xfc\x8b\xd4\x80\x3e\x5e\xff\xf9\xea\xf4\xf5\x49\x93\xff\xe1\xec\xdb\xf3\xaf\xfc\x5f\xbf\xca\xcf\xfb\xd1\xad\x33\xd6\x6e\x6e\xdf\x5d\x0f\x2f\x9c\xfe\x07\x2b\xd7\x9e\x45\xea\xfb\x3a\x33\xea\xf4\xbb\xef\x4e\x0f\x04\xfc\xe4\xa2\xa7\x4e\xbf\xfb\xdd\x77\x11\x7c\xa0\xae\x0a\xe3\x55\x4b\xd4\x55\x5e\x67\x4b\x32\x71\x86\xd9\x22\x3e\xf8\xc6\x5e\xa1\xb3\x2f\x69\x92\xa9\x69\x55\x18\x53\x45\xea\x2a\x59\x55\xf7\xea\x2a\xcd\xf3\x22\x52\xef\xf2\xb2\xb2\x57\x7f\xec\xab\x93\xb3\xd3\xd3\x93\xe3\xd3\xf3\x93\x53\x15\xa9\xdb\x69\xff\x60\xf0\x60\x0a\xa8\x8e\x48\x4a\xc1\x0a\x41\x5a\x14\xcd\x70\xdd\x83\x29\xe6\xba\x4a\xd6\xf6\x43\x77\x64\x25\x8e\xa4\xd9\x95\x66\xe0\x99\x0a\x28\x0a\x48\xc2\xb8\x5a\x22\x00\x7d\x98\x65\x7c\x70\x53\x18\xbd\x9e\xa7\x06\x68\x8e\x9c\x2d\x85\x75\x04\xa5\x48\x81\x81\x04\x2e\x6c\x46\xb4\x39\x41\x7a\x7b\xab\x77\x48\xc3\xb3\x2a\x8c\x59\xe6\x6b\x40\x8f\xde\xf3\xc1\x44\xe8\x8d\xa4\x02\xc1\x19\x84\x63\x95\x74\x4e\xc3\x3b\xe9\x26\x27\x4a\x50\xbf\x24\xa3\x0c\xff\x5d\xad\xc1\x70\x33\x4f\x3f\x09\x40\xd3\xdc\xe4\xe3\x63\x52\x9a\x50\x84\xc0\x0b\x49\x20\xe1\x5a\x36\x47\x12\x54\xbf\x2e\x4a\x92\x81\xd9\xd3\x32\x30\xc6\xf0\x68\x80\xd1\xa1\x53\x79\xdf\xb4\x78\xd1\xd0\xfb\x09\x90\xbd\x24\x97\xad\xb6\x80\xb0\x65\x2d\xb8\x45\xbe\x5e\x27\xa4\xe9\x82\x6f\x2c\x56\x47\x28\x83\x03\xdf\xda\xf7\xa8\xa0\x6b\x0d\xcc\xf1\xd3\x74\x50\x49\x56\x56\x46\x2f\xe3\x1e\xc8\xd6\x2c\x74\x46\x50\x64\x6c\x09\x0c\x3b\x35\x17\x6a\xe6\xf2\xf8\xe0\xd3\xbd\xc9\xd4\x16\x44\x88\xf5\x17\x3b\x0e\xc1\xd0\x47\xf6\x23\xdb\x18\x94\x3c\x27\x5b\x86\xde\x5c\x04\x13\x70\x53\x24\xd6\x59\x18\xd7\xfb\x1a\x55\xb6\xa6\x9c\x7c\x97\xc4\xf1\x04\xea\x3a\x90\x68\xf4\xb3\x42\x2c\x13\xbf\x3a\x82\xe6\xa9\x23\x9a\x33\xc5\x1d\xcb\x29\x27\xa5\x83\x38\x24\xa8\x67\xb4\x4d\xca\xfb\x5e\xd4\x92\xd5\x6f\x6a\x54\xdb\xc1\xba\x33\xc0\x14\xc5\x5f\xd4\xd6\xb0\xaf\xc4\x57\xed\x35\x34\x43\x83\x59\x48\xc9\xe9\x4d\x62\x16\x4c\x90\x02\x6a\x23\x66\x8b\xed\xe5\x31\x7f\xeb\x2d\x16\x7b\xbb\x2f\x59\xbe\x95\x3c\x83\xe4\xf2\x59\x57\xa6\x8c\x0f\x66\x90\xdf\xad\xac\xb1\xe5\x45\x82\x4a\x78\x23\x99\x11\x03\x19\x30\x99\xa2\xe2\x42\x5e\xcc\x93\xa5\xd0\x0b\x5c\x9a\x6c\x47\x4c\x84\x80\xe1\x22\x08\x25\x08\xb5\xe8\xf2\x8b\x93\xac\xad\x8b\xc2\x38\xf0\x37\xc3\xc4\x67\x84\xfb\x92\x4f\x29\x74\x56\x42\x06\xd1\x6e\x6b\x58\xad\x00\xc5\x17\x79\x56\x26\x73\x66\xd2\xb2\x2f\xc4\xde\x99\x86\xb3\xf3\x75\xca\x61\x84\xd4\x02\x5d\x0c\x36\xaf\x9d\xb7\xf1\xc1\x95\x04\x59\x3d\x76\xaf\x12\xb3\x60\x4e\xbe\x7e\x7b\x6f\x90\xa3\xb4\xd0\x55\x02\xdd\x85\x5d\x42\xad\x0c\xc9\x62\x41\xaa\x03\xd8\xc5\xd0\xad\x72\xe9\x3d\xd6\x86\xe1\xd4\xa5\x9c\xa5\xa4\x08\x15\x66\x49\x38\xcf\x0c\xfc\xab\x79\xe4\xe6\x98\x98\x57\x0d\x08\x73\xac\xfa\xc4\x0e\x09\xb7\x2a\xef\x11\xbf\xbf\x0e\xfc\xfe\x12\xe6\xc4\x0e\x27\x0a\x2a\xc1\xb3\xf4\xd3\x27\xd3\x35\x3b\x28\x74\xb0\xcd\x55\x59\x99\x4d\xf9\x46\x1d\x9d\xf6\x04\xf8\x2a\x1c\x6d\x3b\x17\x8f\xce\x7a\xa4\xd9\xe3\x44\xaa\xf8\xe8\x41\xd6\x58\x3b\x3c\xc8\x91\x99\x9a\x3b\x9d\x4a\x78\x95\x93\x57\x12\x6f\x83\x12\x69\xf4\xfa\xe4\xf3\xe2\x83\x7e\x5a\xe6\x84\x99\x03\xac\x32\xec\x94\x2f\x4a\xee\x07\x67\xa9\xf3\xba\xc0\x59\xbe\x25\x40\x30\x0c\x33\xcf\x32\x4c\xe9\xf0\x11\xeb\x9d\x31\x97\x2e\x37\xb8\x75\x66\xb9\xcb\xf8\xf9\x9d\x21\xd8\x3c\x00\x48\xdf\x3c\x4c\x9c\xaf\x35\xdf\x41\xbe\xc7\x3e\xc4\xa4\x14\xce\xd8\xe8\x12\xf9\xe2\x7c\xf3\x12\xa0\x9a\x92\x28\x4b\x7a\x57\xba\x02\xda\x50\x7c\x7f\xb0\xbb\xd1\x81\x2d\xc0\x97\x69\x84\x6f\x98\xb2\xb1\x9b\x22\x9f\xa7\x66\x0d\x87\x26\xea\x1f\x40\x33\xe0\xbc\x28\x3d\x74\xa5\x30\xab\xd4\xbe\xf6\x3c\x0b\xee\xc5\x27\xcf\x0b\xeb\x5f\xd4\x24\x14\x1f\x1f\x5c\xa1\x58\x16\xb2\x5c\xcb\xcd\x08\x5c\x95\x7b\x48\x59\x66\x06\xd1\x90\x95\x06\xa8\xfa\xdc\x93\xdb\xb1\x34\x54\xac\x3e\x19\xa7\x08\xa7\x1f\xf2\x84\x81\x99\xd9\x9d\x07\xa2\xba\x69\x40\xfa\xd9\x3a\x7c\x1e\xe1\x8b\x97\xc9\x43\xb2\xac\x51\x17\x1b\xf3\x61\xa1\x74\x11\x44\x12\x58\x7d\x83\x2a\x30\xab\x7b\x7f\x9b\x4d\x91\x6f\x8a\xc4\x54\x40\x9f\x08\x7b\x24\xb2\x5a\xdb\x17\x0c\xef\x05\x06\x1b\xf0\xa3\x49\xd5\x4c\x78\xd3\xa3\xb8\x14\x83\x1e\x89\x38\x14\x9e\x54\x2f\x68\x9e\x50\x35\x3e\xc6\x31\xe8\x3a\x0d\x06\x17\x52\x49\x82\x26\xe8\x9e\x10\x1d\xdc\xd0\x2e\x0e\x08\x87\xb4\xf8\xc7\x02\xc9\x0b\x74\xfe\xe2\x03\x88\x3e\x32\x2d\x15\x29\x30\x41\xdc\xd3\x09\x14\x06\x24\x23\xf6\x42\x49\x44\x62\x5d\xd8\x13\xb2\x7a\x3a\xcc\x1c\x9a\x60\x30\x84\x0e\x7e\x08\x14\x97\xb8\xce\x29\xbd\x8a\x45\x6d\x90\x3c\xdd\xa4\x7a\xe1\x6d\x8f\xa6\xae\xae\x2a\xf5\x8e\x2c\x51\x82\x2d\x4a\x95\x36\x5f\x42\x14\xc6\xa6\xba\x2d\x04\x2c\x75\x3a\xbc\xc1\xe6\x1d\x46\x6a\x6e\xd2\x7c\x1b\xa1\xd1\xe1\x5a\x0f\xdb\xbb\xe8\x82\x6d\x3c\xb1\x39\x10\x59\xa7\xa3\x73\xb4\x0f\xe6\xbb\x51\xcd\xaa\xa8\x69\xbf\xf1\xf7\x00\x79\xde\xb0\x5c\x9d\xda\x2e\x34\xc4\xf4\xf6\x8d\x2b\xdf\xb7\xa7\x24\x50\xfb\xe2\xb5\x34\x6a\x3c\x47\xe5\x9d\xa5\xec\x49\xe2\x49\xe8\x9d\xc1\x4f\x6c\x72\x0d\x81\x16\xda\x3f\xdd\x01\x0b\x72\x21\x8e\xdb\xc0\x43\xeb\xd5\xd1\x07\x88\x5c\x00\x84\x37\x72\xd7\x13\x2c\x23\x28\x31\xca\x6b\x0a\xc4\x05\xb0\x55\x28\xc5\x3f\x94\x0f\x3f\x8c\x7b\x08\x47\x92\x62\x36\x7a\xb9\x2c\x0c\xec\x7a\xba\x54\x87\xbb\xbc\x3e\x84\x58\x49\xdf\x17\x2b\x8a\x12\xa2\x67\x4e\x78\x46\x38\x04\xd6\xad\x9f\xb5\x6f\x71\xcf\x04\xbb\xaa\xae\xca\x64\x89\x68\xfb\x72\x91\x6f\x68\xa6\x10\xd8\xb4\xa8\xb3\xd6\xc8\x3b\x69\x5e\xb4\x56\xcc\xd2\xeb\xc4\xe4\x75\xb5\xa9\x2b\x9f\xa9\x17\x5f\xe1\x96\xb0\x54\x1a\xf3\xdb\xc1\x9e\x1e\x90\x03\xec\x9d\x67\xea\x28\xc9\x96\x66\x63\xcd\x27\x8c\x1f\xdd\xeb\x07\xdb\x38\x57\x70\x0e\x28\xc3\x76\x8b\x7b\x50\x79\xe6\x81\x54\x76\x8e\x15\xb5\xb5\x97\xed\xbd\x4a\xfb\x14\x3e\x47\xdc\xa3\x96\x39\x05\xf0\x4e\xbd\x3c\xe5\xb3\x9d\x4b\x77\x1b\x70\x6a\x84\xc6\x63\x19\x58\xc7\x09\xe0\x63\x60\x81\x60\x15\x55\x17\x33\xab\x1d\x9a\x4d\xb2\xa8\xf3\xba\x4c\xf1\xe9\x40\xdd\xbe\x29\x28\x1b\xb0\xb1\xcb\xbc\xbc\xb7\x9d\xf0\x05\x60\xe8\x94\xf0\x55\x1d\xd5\x53\xd8\x09\x56\xf2\x11\xd0\x9d\xb7\xea\x8b\x31\x1b\xbb\x22\xa0\x18\x88\x8c\x34\xfc\x5a\xc9\xa7\x10\xe9\x0f\x56\xc1\x3e\xe8\x65\x76\xf4\xbc\x34\x99\x17\x88\xf2\xb7\xb6\xd7\xdc\x71\xb2\x80\x35\x02\x9a\x80\x2f\x7e\x03\x8d\x22\x3f\xf7\x1c\xe0\x14\x77\x7c\x2c\x74\x35\xbc\x2a\xf7\x9e\x1a\x28\x35\x3c\xdb\xee\x77\x25\x40\x51\x68\x66\x33\x09\x4a\xe1\x65\x39\x3d\x9b\x38\x80\xf1\xc9\xea\xcb\x37\xb4\xc5\xd8\x5e\x3b\x7b\x47\x18\x54\xa0\xd0\xc4\x4e\x35\x5b\xbf\xac\x9d\xca\x6d\x22\x6b\x0d\x69\x78\xa1\x5f\x45\xf7\x94\xe1\x2d\xb3\xb1\xb5\x55\xf7\x35\x9c\x78\x98\x52\xda\xbf\x46\xb8\xee\xa2\x3d\x53\x61\x6f\x6f\x88\x2b\x16\x72\x3b\x0e\x8e\x92\x29\x75\xee\x14\x91\xc5\x5d\x33\x13\x2b\x16\x8d\xa9\xbc\xe4\xac\x01\x39\x51\x3e\xa1\xb9\xf0\x4e\xf7\xbc\x3d\x8f\x62\x7b\x95\x93\x8d\xb3\x86\x01\x70\x21\x5b\x4b\x57\x17\xc5\xae\xc5\x42\x5c\x22\x7a\x15\x96\x34\xaf\x09\x18\x6c\xa2\xdb\x84\x6f\x3f\x22\x9d\x47\x8d\x98\xb7\x1a\x01\x73\xd3\x11\x50\x37\x5c\x1e\x28\x98\x83\x95\x15\x71\x29\xb1\xda\xde\xe7\x29\xd7\x1e\x00\xfd\x89\x3b\xd0\x91\xea\xb8\x41\xbb\xd9\x7e\xa5\xba\xa8\x3c\x9c\x0b\x63\xd8\xde\xec\xb1\x66\x01\x3e\x41\xdb\xae\xf3\x2c\xe6\xc8\xfa\x7d\x52\x2c\x5d\xd6\x63\xdf\xd9\x7f\x2d\x50\x40\x4a\xa9\x45\x8f\xed\x6f\x37\xd8\x7c\xb8\x67\x79\xb1\xd6\x2c\x83\x8c\xa1\x14\xb0\xf0\x41\x39\x4b\x93\x9a\x32\x42\xc1\x8b\x3a\x13\xbe\x1c\x8e\x9d\x9d\x92\xf0\x61\x59\x69\xc0\x77\xf3\xb6\x0b\x68\x63\x3b\xd3\xc4\x8d\xc0\xcc\xa3\x33\x11\x43\x41\xc5\x12\xa9\x5f\xb7\x1a\xd5\x34\x36\x45\x82\x02\x19\x5e\x1f\x56\xe9\x2c\xcb\xeb\x6c\x41\xb9\x3f\x5f\xf5\xf3\x8c\xad\x4d\x07\xe0\xb4\x4e\x7f\xe5\xc8\x5a\xa3\x29\x88\xaa\xea\x5d\x30\xb9\x18\xf0\xad\xdd\xc5\x3d\x1f\x52\x80\xb8\x17\x61\xc8\x1a\x88\x40\x1e\x59\xf7\x6e\x82\xb5\x40\x67\xa4\x49\x53\x3e\x9c\xec\xad\x18\xc4\xfc\x90\x98\xed\x9e\x0d\x2f\x56\x47\x8e\x85\xfd\x0d\x6b\x8c\xba\x73\x15\xeb\xda\x92\xe0\xbd\x41\x18\xd3\xe1\x90\xdd\x8b\xc6\x31\x46\x07\x3e\x1c\xdd\x08\xb7\xa5\xfd\xe7\x6e\x43\x8c\xdf\xbf\xb1\xc6\x8d\xe2\x9e\x9d\x78\xb3\x56\x11\x5b\xc8\x53\xe0\xe6\xe2\xd6\x81\x27\x61\xde\x83\xb3\xc8\xe5\x66\x90\x47\x2d\x8d\x14\x8f\xb1\xee\x1e\x7c\x83\x6c\x9b\x7d\xcb\x8d\xb6\x40\x9d\x21\xf6\xce\xd5\xee\xd9\x93\x34\x59\x82\x11\x22\xed\x08\x7b\xb1\x83\x87\xa2\x42\x2e\xce\xd5\x75\x69\x52\x10\x32\xae\xec\x44\x97\xef\x24\x72\x35\x9b\xb0\xfc\x9c\x6c\xb7\xe8\x26\x30\x01\x70\xf3\x61\xa5\x34\x36\x18\xc6\xcf\x86\x8f\x8e\xd5\xbb\xba\xda\x77\x3d\x72\x05\xb8\xbb\x06\x24\x4c\xb8\x73\xa0\x9f\x91\x94\x8f\x9f\x10\x55\x53\x0b\x88\x4e\x20\xbc\x07\x3b\x6e\x79\xb6\x7f\x83\x89\x28\x12\xeb\x23\x15\xe8\x8e\x05\x72\xbc\xa6\x14\x4a\xbf\x22\xbb\x0b\x8f\x61\x9b\xb1\xf6\x54\x20\x1e\x89\x0c\xdd\x0a\x39\xc8\xb6\xf7\x39\x29\x8c\x24\x98\x74\x9f\xdd\xd7\x65\x24\x82\xf4\x15\xe9\x40\x72\x8a\x18\x82\x94\x0b\x26\x97\x00\x4b\x47\x04\xe5\xc0\xf2\x2c\xc3\xb8\x4e\x95\x93\xb3\x46\x59\x5e\x6c\x2e\x3a\xeb\xbb\xbc\x7e\xab\x0a\x8d\x38\x6b\xf1\x28\x74\x57\x02\x7d\x64\x27\x10\x4d\xaa\x80\x9d\xc3\x2d\x1c\x22\x68\x0d\x2b\xd8\xd3\x04\xec\x7a\x6f\xd0\xeb\x40\xb8\x73\x6d\xf7\x35\x7d\x77\x67\x47\xca\xb1\x7e\x64\xc2\xed\x84\x44\x77\xd7\x82\x6e\x9a\x4f\xb0\x1d\xa2\xb6\xd3\xfe\x89\xd3\xb3\xbf\x6b\xf5\x90\xa7\x35\x52\x57\x6b\x55\x56\x79\x41\x34\x4d\x41\x0f\x89\x14\xc0\x6d\x42\xf3\x82\x77\x3d\xd1\x3a\xc1\x81\x61\xfd\x8e\xce\x43\xec\xfc\x71\xeb\xbb\xd9\x85\x66\xeb\xed\x31\x85\x8f\x61\x7b\xe6\xac\x67\x57\xb7\xa4\xea\x82\xd0\x67\x28\xb0\xb9\xdf\x1e\x2a\xad\x41\x94\x2d\xd5\x19\x15\x5c\xed\xb1\x8a\x96\x54\xdb\xd0\x50\x84\x16\x06\x51\x9f\xb9\x03\xb8\xc6\x92\x22\x00\xeb\x4d\x6a\xe0\x58\x2b\x30\xd6\xbb\x44\x09\x89\xc5\x7d\x92\x99\x63\x7b\x56\xe3\xc6\x28\x89\x24\x70\xd1\xf3\xb2\x7d\x22\x44\xb0\xa7\x1f\xf0\x66\x9f\x45\xe5\x00\x07\x0d\x9a\x56\x6f\x55\x5e\x44\xde\xbc\x6a\x77\x49\xbb\xb5\x44\x65\x24\x88\xde\x01\x23\xb9\x52\xa9\xd1\x65\x05\xf1\x31\x2c\x84\x47\x8a\x41\xe7\x1f\x78\x8b\x67\x17\x91\x5d\x4d\x26\x51\x96\x63\xc9\x08\x38\xc4\x64\x51\x63\x82\x89\x8d\xfc\x14\x74\xf8\xd9\x5c\xa6\xd1\x92\x33\x14\x39\x44\x68\xb0\x5b\xc3\x2b\x49\x34\xc2\x37\x11\x0c\x3c\xa3\x10\x7e\x93\x01\x5f\xec\x9b\x43\xb2\x12\x4c\x78\x9b\x60\x61\xd2\x46\xec\x14\xe4\x83\x18\xff\x9e\x7e\xc6\xea\x08\x02\x5e\x5a\x14\x0d\xc2\xaf\x90\x14\xf5\x48\x25\x44\xb6\x71\xf9\x6a\x2b\x3c\xc1\x7e\x7f\xd0\x24\x69\x37\x3d\xbd\x2c\xb1\x92\x83\x0c\x18\x9a\x51\x58\x11\x98\x17\x44\xf5\x32\xad\xe7\xbc\xeb\xcf\x71\xa4\x9d\x4d\x12\x72\xaa\xf8\xcd\xc2\xf3\xad\x6d\x30\x03\x87\x2f\x60\xed\x4e\x45\x7b\x11\xe4\x78\x31\x50\x1a\xba\x50\x40\x83\x15\xab\x2b\x30\xf1\x65\x8b\x31\x74\xe6\xe6\x58\xa0\x34\x80\xfc\x7e\xe4\x5b\xb7\x9a\x95\xa6\xf6\x19\xb5\x75\x6b\x12\xef\x63\x44\x6a\x93\xd6\x44\x48\x59\x96\xf9\x22\xe1\xc8\x95\x29\x56\xda\xce\x6e\xb3\x02\xfa\x91\x3c\x43\x97\x88\xae\xc7\xed\xb5\x48\x36\x98\xb4\x5d\xca\x83\xc9\x36\x2e\x49\x7d\xed\x5a\x92\x95\x95\x4e\xd3\xa0\x3a\xdf\x08\x65\x62\x47\x12\xa9\x3b\x15\x75\xa2\x56\x77\xe4\xd2\x80\x7c\x1a\x32\x43\x12\x7d\x41\xb6\xc3\x12\x07\x4f\xdb\x49\x96\xaa\xfc\xda\x91\xf5\xae\x31\xac\xc7\xb2\xd3\x85\x14\x8e\xe8\xf9\x89\xbf\xd6\x7f\x86\xb3\x74\xbd\xc9\x33\xb0\x3a\x8f\xb0\x83\xb6\xc5\x5f\x4c\x91\x99\x14\x8d\x8e\xd2\x6e\xce\x3d\xee\x60\xbe\x31\x2c\x3b\x89\x5a\x94\x10\x0d\x62\x31\x3f\xf1\x42\x8b\xda\xbe\x84\x3a\x4b\xb1\xdc\x10\x09\x4d\xf1\x51\x8e\x5f\x82\x16\x64\xc2\x70\x36\x3f\x78\x70\x78\xaf\x5a\x76\x80\xb8\xbf\x35\x9f\xa4\x88\x90\xd7\x6b\x87\xa9\x8e\xfc\x65\x58\xeb\x48\x38\x07\x12\x42\x12\xb0\x27\x88\x27\x93\xc1\xea\xbe\x25\xa8\x0d\x1b\x37\x68\x4d\x3f\xb6\xa4\xc1\xd0\x84\x9b\x21\x29\x23\x18\x9b\x5d\x26\x63\xb0\x1f\x9a\x07\xb0\x93\x81\x18\x28\xf4\x57\x7d\x38\x72\xbd\x31\xa0\x93\xdc\xd1\x84\x46\x64\x47\x0c\x06\xeb\x11\xb3\x29\x80\xb7\xda\xec\x08\xb7\x07\xf5\x66\x73\xaf\x9a\x58\xec\x33\x11\x08\xd1\xa7\x4b\x66\x32\x48\x77\xfe\x04\x17\x20\x3b\xe7\x7a\xf5\xed\x6a\xab\x2a\xb3\xde\x54\xa1\x60\xf3\xbe\xa7\x3f\xf2\xf0\xa4\x54\x0f\x79\x42\xc1\x52\x48\xd4\x84\x80\x65\x0f\x64\x96\x46\x69\x57\xab\xdc\x3a\xe4\xe1\xb5\xc6\x31\xa4\x64\xdc\xc6\x8a\xa1\x25\x18\x0b\xce\x69\xc3\xcb\xb5\xbb\x6f\xfb\x96\x3e\xf1\xc5\x18\x81\xa4\xf0\xf8\x16\xd7\x30\x58\x3a\x2c\xe9\x87\xa9\x02\x87\xc2\x5c\xeb\x04\x22\x61\xab\x3a\x4d\x85\x60\x28\xbc\xb9\x6f\xf0\xcd\xf1\x24\x90\x6e\x24\x42\x20\x1b\xbe\x45\x99\x64\x24\x0e\x08\xcd\xb1\xdf\x21\x60\x83\xdd\x6a\x5d\xef\x33\x2a\x91\x82\xdc\x21\xd1\x0a\x82\x03\x1f\xa4\x4f\x29\xf0\xb6\xff\xbd\xe4\x05\x78\x72\x4d\x46\x5d\x4e\xca\x6b\xf6\xb6\x10\x1d\x7d\x9f\xcc\x13\x82\x7a\xa6\x7a\xeb\x72\xe5\xe4\xff\xb5\x7b\x03\xb7\x29\xcc\x2a\x2f\x90\xbe\x04\x9b\x43\x04\x15\x7e\x45\x35\x42\xec\x47\x14\x31\xda\x6f\x8b\x63\x44\x26\xc9\x96\xf6\x24\xa2\x29\x83\x8f\xd7\x14\x7a\x0d\x5e\x70\x95\x73\x99\x2c\xc4\x47\x08\xc5\xf3\x53\xd2\x6a\xd8\x62\xdf\xfc\xc6\x10\x36\xfc\x16\x72\xd2\xbe\xa5\xea\x6b\xa0\x12\xc4\x93\xff\x31\xeb\xfd\x89\x1e\x07\x08\x82\xc6\xea\xa1\x99\x5f\x8a\x1a\x3c\xb7\x9b\xb9\xf4\x2d\x7e\x82\x98\x8c\x56\x5a\x3d\x4c\xa9\x73\xbb\x82\xaa\xca\x7d\xd5\x02\xe1\xce\x94\xac\x37\x39\x85\x17\x19\x38\x1c\x2a\xe1\x66\x0d\x2c\xc4\x0b\xef\x40\x32\xfc\xbc\x5d\xf2\x90\x64\xcd\x55\x44\x50\x10\xb4\x8e\x08\xc7\x8e\xbc\x55\xae\x3e\x61\xbe\x6b\x6c\xc4\x8d\xa8\x3d\xbc\xa4\xd7\xb1\x1a\xae\xe8\x50\x07\x4a\x9b\xbf\xd4\x2e\x7c\x6f\xb7\xff\xa2\x52\x7f\xae\x97\x77\x4e\xc3\x36\x4d\x85\xbf\x49\xd9\x5e\xe6\x59\xe7\x8b\x56\x41\x19\x35\x06\x61\xd4\x51\x88\x57\x77\xdf\x2d\xcb\xda\x94\xbd\xa8\xa9\xdc\x84\xe3\x08\xf3\xc0\x4e\x9d\x23\xc6\x9a\x40\xb9\xaf\x6d\x15\x08\x0e\x47\x12\x1b\x2e\x64\xf5\x7b\x7c\x46\x67\x55\xa1\x97\x09\x21\xff\x3b\xa0\xce\x6e\xdb\x81\x94\x18\xad\x64\xf3\xe3\xa2\x2e\x71\xca\xba\x69\xb4\xff\xbb\x10\xb9\x22\x90\x11\x44\xa6\x44\xd4\x3d\x27\xbb\xbb\xd4\x55\x52\xae\x76\xaa\x4c\xd6\x75\x5a\xe9\xcc\x60\x42\x07\x53\x0c\x02\x5d\xdf\xb1\x3b\x33\x9b\x3e\x61\xe1\x4c\x51\x61\x7c\x5c\x7c\x8d\xce\xfc\xd6\x3b\xdc\x89\x79\xb9\x67\xe5\x51\xbe\x5d\x35\x31\x40\xba\x01\x1a\x50\xdb\xbc\x4e\xd1\x84\x43\xc8\x65\x48\xbf\x5a\x74\x32\x4c\xf2\x43\xe6\x3b\xb2\x77\xf3\x12\x29\xad\x39\x07\x46\x39\x90\x6e\x76\x26\x47\x33\xb8\xcb\x6b\x17\x86\x33\xe8\x4a\x10\x9a\xd2\x4e\x85\x74\xe9\x46\x77\x9e\x83\xe2\x2b\x05\x97\xe4\x09\x07\x97\xcd\x0d\xd6\x09\xac\x0a\x7b\x5c\xb9\x00\x0f\xbc\xe2\x47\x9a\xcf\xd6\x5b\x23\x2f\x13\x04\x99\xa0\x3e\x3a\x5d\x3e\x59\xa2\x42\x79\x80\x64\x51\xa7\xba\x50\x8b\xa4\x58\xd4\x6b\xe4\x88\xc7\x0d\x6e\xae\x53\xbf\x83\x1b\x79\x7b\x89\xf3\xc4\x48\x23\x67\x3d\xf8\x22\x91\x43\xe8\xbc\xde\xba\x58\xc8\x94\x2a\x1e\x8b\x69\xce\x61\x10\x48\xa3\x8a\x93\xae\x48\x5a\x92\x2d\x6b\x9a\x58\xf0\x1b\xae\x7b\x81\xfc\x28\x3d\xf6\x01\xab\x89\xaa\x1d\xc5\xc4\x48\xc4\x81\xf7\x5f\x8c\xc0\xc9\x1a\x15\x07\x41\xc0\x2b\xdf\x86\x0f\xbf\x27\xfa\xb6\xd2\xf6\x4f\xb4\x90\x53\x71\x8e\x84\xb1\x32\x77\x85\xa8\xe5\x09\xe1\x8c\xc1\x6b\x46\x93\x3f\xf2\x71\xd3\xc4\x4e\xff\xb5\xe3\xc6\xdb\x20\x86\x82\x57\xc0\x06\x22\xec\x76\xc8\xd4\x47\xe8\xb0\xc9\x37\xa9\x44\xc3\x80\x0a\x67\x5e\x97\x01\x25\xb2\x73\xbb\xb7\xc9\xd2\xa8\x82\x39\xc9\xdb\x2d\x02\x87\xb8\x20\xf3\x59\x57\x5e\x1c\x5f\x15\x86\x36\xf4\x3c\xc3\x30\x76\x09\x2b\x33\x20\x08\x5f\xc9\x2f\xbd\xa5\xc8\x68\xbd\x71\x49\x59\x80\x2e\xbd\x5c\xe6\x19\x8e\xff\xd2\x2c\x20\xed\xbf\x52\xf7\xa8\x4e\x70\x0f\x93\xc6\x5a\x82\x04\x41\x0d\x76\x31\x27\xb1\x40\xbc\x9f\x6e\x3b\xa2\x46\x62\xda\xc5\xc1\x1a\x68\x23\xa4\xa3\x10\x77\x62\x10\x1f\xa5\xd8\x6d\xb8\x70\xe4\x4c\x25\x0a\xd4\x1c\x9e\xe3\xe8\x34\xb6\xe4\x23\x36\x18\x59\x5a\x07\x16\x1e\xac\x65\xd5\x19\x4c\xfc\x9d\x83\xa3\x35\xa3\x13\x2f\x09\x5d\xda\xd8\xb5\x80\xe7\x86\x51\x0e\x40\x17\x40\x08\x39\x54\x7e\xb7\x1b\x17\xf9\xa6\xf3\x60\xf6\xcf\x77\x3e\x2f\x25\x9d\x74\xdc\xa6\x05\x73\x4c\x13\xf0\x63\x77\x46\x70\xbb\xca\xa0\x1d\x1d\x67\x02\xd3\xc5\xa1\x6a\x7c\x9a\x2c\x92\x4a\xdd\x99\x1c\x98\x9c\x90\x71\x41\x76\x51\x60\x53\x80\x4a\x7b\x89\x8b\x25\x2f\x8d\xef\x8a\x07\xca\x05\x5f\x0d\x10\xf6\x18\xc4\xc9\xb0\x4a\x2a\x07\x5b\x83\x07\x02\xb7\x8e\xba\xa4\x07\x98\x65\x9b\x02\x43\x34\x5f\x08\xfb\x62\x57\x45\x0b\x75\x69\x67\x25\x47\x0e\x29\x6f\x38\xcf\x97\xed\xd4\x98\x7d\xa9\xdf\x21\x5e\x65\x2f\xd6\xdb\x0e\x14\x63\x24\x0a\xf3\x90\x40\xae\x15\xdf\x78\x66\xb6\x2c\xee\xeb\xb2\xf0\x7b\x40\xdf\x68\x04\x00\x21\x76\x0e\xff\x27\x42\x98\xe0\x16\xcc\x0f\x5a\x26\xeb\xc4\x6e\xee\x49\xa6\xca\x4d\x52\x24\x8e\x7a\x9d\x6a\x92\xf8\x1b\x58\x70\x80\x6a\xc2\x10\x91\x4b\x32\xb5\x34\x15\xb1\x23\x11\x2c\x08\x1e\xe1\x60\x8b\x98\xba\x58\x98\x22\xc3\x6d\x1b\xac\x6b\x16\x28\x4e\x4a\x88\x9e\x66\x4a\xc3\x2b\x4c\xb2\xbb\x3a\x29\xc1\x45\xe2\x2b\xb2\x7a\x3d\x37\x85\x5b\x06\xce\xc8\x45\x31\x48\xb0\x9e\xc3\x4b\x5b\x8e\x04\xee\x94\x02\xf4\x46\x87\xed\x21\x30\xc5\xe8\x0a\xe1\x57\xf6\x0e\x87\x51\x88\x3a\x77\x38\x0a\x41\x74\x55\xed\xe3\xa3\xa7\x65\xc5\x9b\x1a\x37\x0a\xa9\x26\x5b\x8f\xe2\x17\xec\xa1\x74\xfb\xa6\x43\xab\xeb\x2e\x45\x81\x63\xb0\x7b\x72\x04\xbc\x04\x34\x91\x24\xd9\xd6\xf0\x57\x80\xdc\xfa\xf9\x8d\x01\x7c\xd1\x89\xb3\x1e\x19\xfc\x29\x55\xaf\x51\x2b\xa2\xb9\x2f\x65\x55\x4e\xdb\x6f\x80\x7d\xa7\xac\x5c\xb0\x7e\x1b\x46\x35\xce\x34\x48\xfa\xda\x15\x66\xc2\xe3\x81\xc1\xea\xd6\x7c\xf7\x6e\x34\xda\x86\x9e\xe0\x8d\x0f\x4b\xb9\xc7\x3d\xd1\xd5\xc6\xd3\xf6\x5d\xf6\x16\xca\x24\xf2\xb5\xb1\x4b\xac\xc4\xb3\xc0\xc5\x17\x4b\x07\x32\xc6\x52\x08\x7b\x82\xc1\xa8\xf3\xba\xbb\xab\xa5\xa8\x74\xb5\xcd\xd5\x5d\xae\xd3\x12\x6d\x04\xa0\xa0\x75\x2c\x81\x60\x12\x54\xba\xaa\x11\x45\x9b\xa6\xc2\xff\x87\x3f\x71\xf5\x4c\x58\x94\x82\xd6\xc6\x3a\x77\xc6\x46\x79\xaf\x0b\x2e\xe0\x2c\x0c\x1d\x21\xee\x2b\x77\xb8\x99\xa4\x28\xf4\x32\x1a\x3b\xce\x0e\x78\xf1\xa7\xb1\x7a\x37\x00\x09\x4d\xd4\xa1\x9c\x8c\xdf\x4f\xfa\x1f\xd5\x70\xca\x05\x57\x97\x40\xf8\x01\x52\x77\x1f\xfa\x93\xf7\x83\x08\x95\xd2\xec\x15\xe2\x5e\x80\x5f\x15\x37\x78\x94\x00\x80\xa8\x32\xde\x5d\x0f\x90\x0b\x60\xf0\xa7\x8b\xc1\xcd\x4c\x7d\xfa\x30\x18\x79\x79\x4d\x24\x26\x00\xe5\xb4\x4f\x93\xe1\x0c\xb9\x2d\xf6\xe8\xbb\xbe\x64\x5d\x4e\xe4\x40\x19\x38\x1a\x98\xa0\x4f\x4d\x46\x98\xe7\xb1\xc1\x08\x59\xd8\x5f\x59\x0b\x16\x25\xfc\x06\xa3\xd9\x70\x32\x50\x93\xe1\xf4\x8f\xaa\x3f\xe5\x61\xfd\xe7\xdb\xbe\xbb\xcf\xcd\x60\x72\x35\x9e\x7c\xec\x83\x40\xe9\x55\xf3\x35\xda\xde\xaa\xcf\xe3\xdb\x58\x4d\x3f\x8c\x6f\xaf\x2f\x83\xcf\xed\x30\x0d\xd4\xe5\xe0\x6a\x70\x31\x1b\xfe\x30\x88\xec\x85\xaa\x3f\x9d\xde\x7e\x1c\xd0\x68\x4f\x67\x2c\xef\x37\x1a\x5c\x0c\xa6\xd3\xfe\xe4\x33\x89\xb7\xc2\x28\x4c\x06\x37\xfd\x21\xc9\xcf\x4e\x26\x03\x90\xcb\xc3\x1d\xe5\x2c\xd4\xae\xbd\x1d\x01\xf1\xc4\x64\xf0\xcf\xb7\xc3\x49\xd7\x34\x00\x36\x95\xf7\x93\x01\x0c\xa5\x7c\xeb\x40\x1c\x63\xdf\x4f\xf3\xd5\x47\x21\x01\x0b\x72\x9e\x7c\xfa\x30\x56\x1f\xfb\x9f\x11\x31\xfd\x99\x27\x87\xd4\x07\x0c\x06\xa0\x3f\x15\x53\xb3\xff\x6e\x6c\xc7\xc0\x6b\xe7\xce\xc6\x30\x20\xf6\x05\x39\xea\x8f\x90\xd0\x83\x8a\x14\x85\x80\xae\x57\xd5\xdd\x2f\xa0\xcb\x5c\x21\x4d\xb5\xd8\x89\x1a\x8e\x78\x86\xcc\x40\x00\x31\x68\xac\xd0\xa4\x6d\xcf\x3e\x27\xa4\x7b\xd9\x9f\xf5\x15\xb4\x78\xd6\x57\xef\x06\xf6\xea\xc9\x60\x74\x39\x98\xc0\x62\xea\x5f\x5c\xdc\x4e\xfa\xb3\x81\x60\x2e\x99\xde\x4e\x49\xa5\xf0\xdd\x67\xe8\x2f\x2c\xe5\xe1\xe4\xd2\xad\x26\x98\xa0\x57\xfd\xe1\xf5\xed\xa4\x35\xc5\x66\x63\x35\xbe\x19\xc0\x2d\x61\xaa\x89\x17\x82\x57\x4c\x7b\x5e\xf5\x16\x58\x3d\xbc\x64\xb1\x7c\x71\x1f\xfa\x53\xf5\x6e\x30\x18\x3d\x5f\x19\x77\x1a\xab\xc1\x08\xaf\xeb\x40\xd4\x1f\x7c\x40\x54\x53\x1f\x9c\x4e\x0c\xa3\xce\xe0\x94\xaf\x72\xf5\xd9\xee\xac\x23\xb3\xe5\xc3\xac\x3c\xa0\xd3\x8f\x74\x05\x95\x66\x8b\xc7\x63\x79\x44\xa5\x18\x19\xfe\x74\x20\xde\x41\x6d\x45\x59\xa9\x4d\x5e\x62\x28\xac\x2e\xdd\x21\x83\xce\x1b\x79\xd5\xf6\xa2\xad\x46\xc1\x90\xc5\xbd\xf5\x21\xf0\x54\x47\x00\x07\xd3\xf8\x85\x3b\x3e\x1e\x74\xae\x10\x66\xa1\xb3\x30\x7e\x29\x8a\x29\x25\xe8\x0b\x0c\x1a\xa8\x2d\xe3\x90\x6b\x55\x69\xca\x27\x79\xd3\xc7\x41\x6a\x73\x99\x05\x8d\xc9\x11\x2f\xf5\xca\xb6\xd8\xb6\xd6\x7d\x79\xcd\xd7\x02\xe6\x0e\xb2\x47\xf6\x13\xca\x9e\x00\x17\x38\xd7\x5a\x62\x69\x07\x62\xf8\x90\x00\x92\xf2\x51\x20\xa3\x83\x56\x58\x08\xcb\x85\x5b\xc1\x3d\xca\x7b\x08\x95\x80\xdd\x26\xb2\xf4\x46\x1d\xba\xf3\xfe\x50\xa5\x49\xc6\x50\xbb\x4d\x0e\xfe\x0d\xc0\x67\x00\x69\x07\xfd\xac\x31\xa1\x00\x35\x82\xf6\xe0\xae\xb3\x65\x7c\xf0\x7b\x40\x45\xc0\x77\x39\xd3\x2f\xfa\x2e\x79\x4d\x75\xa6\x92\xa5\xd1\x88\xfc\x01\x76\x4e\x44\x64\xab\x3f\x34\x0a\x8e\x7f\xaf\x76\xbb\xdd\x4e\xfd\x41\xfd\xde\x29\xaa\x93\x29\xf3\x87\x03\x70\x33\x45\x29\x4e\xf0\x76\xdf\xba\xaa\xc0\xe0\x9d\xa2\x39\x2b\xea\xab\x92\xaa\x1b\x6d\xf9\x68\x55\xae\x2e\x9f\x6f\x05\xbe\x15\x65\x0b\x58\x5e\xcd\x0f\xb8\x16\x19\xad\xa3\x10\x8e\xdc\x6b\x1b\xc1\x71\xab\xbf\x32\xb0\x40\x6e\xd4\x7d\xbe\x61\x9d\xc4\x4a\xea\x19\xac\xea\x14\xbd\x91\x2e\xce\xb6\xb7\xae\xc6\x81\x32\x7c\x10\x9b\x4d\x01\xc2\xc7\x78\xca\x7c\xd5\x3a\x68\xf3\xe2\x19\xe7\xec\xd4\x98\xa7\x06\x73\xc5\x14\xa1\xe8\x1b\x95\xf1\xc1\xe7\xbc\x0e\xa6\xa9\x87\x38\x04\xd0\x8d\xc7\x5e\x90\xcc\x35\xfa\x51\x7b\x6b\x3d\xcf\x2c\x6f\x1a\xc7\x8f\x97\xb2\x47\xea\xe7\xd4\xb2\xc7\xaa\x0f\x4a\x4e\xcb\xe5\x1e\x79\x16\x66\xc3\xb0\xd3\x75\xbe\x53\x26\x35\x8b\xaa\xc8\xb3\x64\x41\xf5\x72\x1b\xe0\x38\x4f\xd2\xf8\x80\x5c\x1b\x31\x03\x04\x2a\x34\x72\x9b\x1c\x15\x69\x68\x3b\x84\x85\xc3\xcd\xa6\xc9\x17\xda\x12\x01\x7d\x98\x54\xb8\xcd\x94\x58\xa1\x10\xe0\x4b\xd7\xf9\xd2\xbc\x39\x78\x9f\xe5\x6b\x26\xeb\xe1\xa9\xfb\xed\x77\x91\x0a\xd7\x27\x28\x5c\x34\x56\xa6\xfc\xe6\x22\xb7\x86\x3e\xbc\x88\xfe\xbb\xe9\xf8\xfa\x76\x36\xb8\xfe\x2c\xcd\xdb\xb7\xf0\xfe\xe9\xd5\xab\x6a\xb7\x31\xea\x3f\xa0\x92\x73\xfb\x82\x2a\xb1\x9a\x2b\xdb\x9f\x19\xb0\x89\x9b\xd4\x3e\x03\xe3\xbe\xe1\x42\xa7\x2a\x24\x17\xd3\x61\x47\xe9\xad\x7c\xcc\xe2\x85\x6c\x00\x96\xa5\xdd\xef\x36\xd6\xfb\x42\x3e\x65\x07\x9d\xe6\x66\xc1\xe3\xdd\x97\x69\x9e\x72\xf1\x69\x00\x5e\x0e\x9c\xbb\x7d\x75\x5b\xe3\x15\xa4\x3b\x98\x45\xd4\x3d\x0e\x52\xb9\x14\x09\x9a\xdb\xd3\x09\xf2\xea\xe0\x3c\x81\xcf\x2f\x8a\x86\x3a\x5b\x46\x35\x40\x18\x3f\x87\x85\x3d\xb7\xaf\xb6\x2e\xcd\xf1\x22\x4d\x16\x5f\x20\xd8\xb0\x36\x59\xad\x92\xca\xac\xcb\xe3\x63\xbb\x11\x83\x83\x5b\xd6\x09\xa6\x5a\x5d\xa5\x7b\xb0\x24\x01\x01\x77\x67\x68\xbf\x42\xd5\x42\x53\xa8\x23\x2e\xf9\x76\xa8\x5f\xfa\xf2\xda\x14\x3d\x85\x75\xcc\x85\x2a\xad\x57\x9d\xb2\x40\x26\x60\xac\xca\xe4\x2e\x53\x5a\x1c\x3f\xa2\x74\xe5\xd0\xd7\x77\xb0\xc1\x60\x57\x30\xb3\x7f\xc6\xea\x03\x61\xbf\xb5\x2a\x21\xb5\xf1\x16\x71\x4c\xf0\x15\x3b\x2d\xcb\x37\x07\x9f\xf3\x5d\xbe\xdc\x65\x86\x57\x33\x31\xdb\xf0\x43\x10\xa9\x23\x74\x51\xec\x4a\x30\xa0\xc3\x11\x2c\xb7\xff\x10\xd3\xfa\x85\x3a\x22\x54\x1e\x90\x69\x43\x51\x6b\xa9\x08\x32\x92\xa4\xa6\x28\x7b\x2e\xc0\x35\xdf\xa9\xef\x6d\x43\xd4\x07\xbd\xf8\x62\x0a\x7b\x4a\x22\x9e\x83\x94\x62\x67\x3b\x75\x91\xe7\x99\xfa\x83\x8a\xd4\xa9\xea\x6f\x8a\x24\x05\x9a\x0d\xfe\x20\x52\x37\x85\x29\x13\xae\x89\xfa\x21\x59\x98\x9f\x43\x6b\x13\xbf\x5c\x27\xab\x63\xe7\x74\xff\x22\x04\x30\x8f\xf3\xbf\x9c\x9c\x9e\x9c\x9d\x36\xf8\x5f\xce\x5f\xbd\x3e\xfd\xca\xff\xf2\x6b\xfc\xf4\xf7\x60\xbb\x38\xea\x85\xe5\x3b\x76\xcf\xb5\xc6\x62\x80\x41\x0f\xad\xe7\x34\x99\x17\x50\xe3\x41\xb6\x83\xc8\x81\xc7\x6a\x8a\x11\xc7\x05\xd6\x4d\x27\x2b\x8e\x66\x41\x31\x4f\x82\x65\xd2\xb0\x45\x56\x76\xff\xd0\xc4\x8c\x8e\xdb\xdd\xa2\xc8\xb1\xe2\x26\x03\x4b\x72\x55\x67\x94\x58\xa7\x4c\x2d\xb5\x2d\xa2\x3d\x85\xd7\x9c\x6c\x75\xb6\xb4\x56\xe8\x17\x87\x9b\x94\x4f\x47\xce\x7f\x48\x72\x05\x88\xbe\x48\xdc\xc0\x03\x9b\x9d\xb6\x90\x2f\x6c\x42\x76\x61\x40\xa6\x78\x74\x57\xa7\xc0\xe1\x7e\x03\x85\x8e\x36\x37\xfe\xfe\x89\x44\x73\xce\x79\x46\xa6\x98\x97\x89\x76\x7b\x84\xef\x9a\xf0\x35\x68\xf7\x1a\x76\xb0\x9f\xd4\x90\xaf\x14\x59\xff\x58\x3f\xf1\xcb\x4d\x59\x57\xd6\xd4\xf9\x45\xa8\xbf\xe0\xe7\x89\xfd\xff\xfc\xfc\xdb\xb3\x26\xff\xd7\xab\xf3\xd7\x5f\xf7\xff\x5f\xe3\xe7\x66\xaa\x6e\x2b\xa6\x97\xb9\xd1\x8b\x2f\xfa\x0e\xf9\xae\xb8\x46\x1b\xd8\x54\x61\xa7\xe4\xcc\xc8\x06\xaf\x62\xa1\x0e\x60\x16\x00\xdb\x7b\xd1\xe0\x06\xfb\xee\xf4\xf8\xf4\xbb\xef\xbe\x51\xfd\xec\xae\x2e\xd5\xf7\xb1\xba\x88\xd5\x65\x7d\x77\xa7\xb3\xf8\x80\x62\xde\xea\xa3\xfe\x62\xec\xed\xe3\x75\xb9\xf0\xbf\x64\x95\xff\x77\x5e\x9e\x1d\xb8\x5f\xea\x2c\xf9\x51\x4d\x06\xfd\xcb\x8f\x03\xdb\xc2\x55\x72\x17\xdf\x93\xe6\xd9\x26\x5e\xaf\xcb\x03\xb3\x29\x57\xab\xa4\x8a\x17\x8a\xff\xb5\x86\x6d\x1d\xd4\x0e\x0b\x53\x36\x7f\xdd\xa4\x07\xab\xe4\xc7\x65\x5a\x16\x1b\xfc\xcc\xff\xb6\x49\xed\x2f\xab\xb5\xff\x00\xfe\x8d\xdf\x58\xeb\x85\xff\x3b\xfe\x82\xd7\x6f\xca\x65\x52\xf9\x8f\xf8\x57\xfc\xd6\xa6\xdc\xc8\x8f\x36\xee\x5b\x28\xda\xe6\x3f\x73\xbf\xe3\xf7\x2a\xf1\xb5\xca\x7f\x6b\xbb\xda\xfa\xbf\xe3\x2f\x78\xfd\x56\x5c\xbf\x15\xd7\xcb\xcb\xe9\xea\x3b\x53\xe9\xd5\x5a\xe1\xff\xe0\x43\x42\x6c\xf3\x60\x89\x5f\x37\xe9\x81\xb5\x70\x2b\xf3\x63\xa5\x36\xba\x5a\xdc\xa7\xe6\x21\xbe\x57\x9b\x72\x9e\xe7\x5f\xe2\x05\xff\x63\xad\xb3\x83\x4d\x69\x8a\x22\x2f\xe0\x8f\xf8\x2f\x7b\xdd\xda\x14\x77\x06\xee\xca\xff\xde\xa4\x07\x9b\x32\xab\x37\x70\xa1\xfd\x3f\x7e\x68\x4d\xdc\xbf\x1a\xf8\x23\xfd\x13\x6f\x5a\x82\x3f\x0c\x7f\xa7\x7f\xe2\xf5\xd6\x82\xc1\xbf\xda\x7f\xdc\x1f\x6c\xca\x2a\xdf\x94\xf0\x17\xf8\x07\x5e\x65\x37\x3a\xf8\x1b\xfc\xe3\xfe\xc0\xba\x46\x8b\x7b\x5d\xd8\x09\xbf\xf3\x5a\x61\x9b\x04\x93\xc6\xbe\x3a\x43\x88\xac\xab\x23\x5f\x9c\x1a\xe2\x0a\x02\xdb\x28\x2f\x8e\x37\x45\xbe\x4a\x2a\x96\x88\xe8\xf9\x9a\x6a\xa8\x0b\x3a\xed\x41\x22\xdb\x73\xcd\x54\x2d\x38\x92\xcb\xf3\x81\x36\xa3\xd1\x05\x82\xe5\x37\xa9\xde\xf9\x10\x0f\x0b\x91\x51\x18\x8b\xd9\xed\x28\x60\x01\x8e\x5e\xd2\xb8\x1d\x48\xff\x72\x55\x26\x7d\xaf\x30\xd6\x3d\x5a\xca\x5e\x88\xbb\x63\x79\x7b\xa3\xc5\x01\xdb\x57\xbb\xc5\x0e\x69\x0d\x76\x62\xbe\xe2\x72\x9e\x23\xa1\x29\x2c\xf4\x66\x1b\x59\xcc\xb2\x2a\x7b\x54\x67\x21\x6b\x1d\xf2\xd5\xe3\xdf\x89\x54\xc9\x11\xa6\xac\xde\x17\x0d\xca\x0b\x75\x0d\xb5\xe7\x9f\x74\x9a\xbe\x28\x55\xbf\x40\xb5\x24\x77\xc1\x91\x6b\xbb\xaf\x9c\x33\x45\xaa\x5e\xa9\x2f\x49\xd5\x43\x04\xc2\xfb\x9b\x6b\x98\x23\xad\x2f\x27\x19\xc6\x33\x3e\x7b\x0a\x62\x4f\x01\x25\x98\x38\xd6\x06\xc0\x68\x35\x55\x83\x13\x16\xcf\x53\x78\x21\x94\x20\xe1\xf2\x84\xa4\x92\xd0\x19\xac\x96\xeb\x51\xb4\x3d\x78\xb3\xae\xed\x87\xba\x3c\x4e\xca\x43\x90\x73\xf0\x81\xbb\x42\x90\x06\xe2\xa3\x12\x6b\x0a\x57\x99\x29\x4b\x3f\xd7\x3d\x64\xad\xd2\xe5\x17\xf9\x3a\x41\x1b\xdd\x97\xff\x07\x73\x94\xaa\x5f\x52\xc1\xa6\xb0\xcd\x54\x91\x94\x5f\xe2\x83\x77\xba\x64\xfb\x7f\xa8\x96\x79\xf6\xa2\x52\xeb\x24\x5b\x42\xd8\x8b\x63\x1b\xc1\x14\x12\xe0\x73\x08\xee\x2c\xbe\x64\xf9\x36\x35\x4b\x62\x8a\xc3\xe0\x52\xe4\x49\x26\x08\x9d\x25\x11\x37\x25\x4d\xfd\x1d\x11\x5f\xdd\x9b\xf5\x57\x03\x37\xfc\x89\x5f\x8e\x6e\xc6\xd3\xeb\xe3\xf3\xf8\xe4\x17\xb3\x00\x1f\xb7\xff\xce\x5e\x9f\x7c\x7b\xde\xb4\xff\x4e\xcf\xbf\xfa\xff\xbf\xca\xcf\x28\xcf\x8e\x6f\xf0\xa0\x1a\x6f\x4c\xe6\xc3\xde\xbc\x9d\x9d\xc7\x27\x98\x69\x78\xf2\xca\xa3\x43\x79\xc9\xf4\xfa\xb0\xe7\x02\xc5\xe7\xf1\x89\x3a\x82\xa4\x12\x5d\x7c\xd8\x6b\x32\x69\xb9\x63\x05\x02\x86\x2e\x7a\x5c\xde\x27\x1b\xfa\xaa\x53\x6d\xfd\x94\x17\x5f\x0e\x7b\x84\x7e\xc9\xb7\x99\x29\x82\x9b\xe7\xc5\x61\x0f\xd0\xa3\x44\xb7\x15\x26\xe2\x70\x23\xf6\x29\x39\xa5\x97\x7f\xd6\x0b\x22\xca\xae\xee\x3b\x28\x26\x38\xe4\x18\x3c\xff\xcd\xc1\x35\x53\x79\xf8\x7c\xd1\x93\x43\x24\xc6\x83\x6c\x80\xf7\x20\xe0\x06\xe4\xd8\xfc\x58\x17\x13\xe0\xee\x70\xb5\x0b\xd4\x03\xd8\xf1\x49\x97\xdb\x64\x69\xa2\x00\x91\x1d\xa9\x2c\xcf\x8e\x29\xe5\xf7\x60\x44\x95\x12\x12\xe4\x73\x72\x89\x7b\xb3\xac\x43\xa1\x65\xd7\xed\x88\xaa\x47\xf6\x95\x32\x43\x64\x9d\x43\x26\xad\x71\x01\xd8\x24\x55\x23\x51\xa2\x0b\x74\xcb\x14\x8a\x08\x7b\x0b\xa9\x51\x04\xff\xd6\x17\x16\xa3\x1c\x24\x92\x75\x45\x4a\x2f\xf5\xa6\x8a\x30\x8c\x4b\xac\x5c\xab\xbc\x58\xfb\x6a\x2c\x7b\xe3\xa2\x70\x0c\xa2\x41\x6b\x20\x86\x0e\xe1\x5d\x54\xed\xb3\x36\x5b\xa3\xf0\x47\x1d\x1d\x5e\xfa\x3f\xd9\x2f\x95\x87\x3d\x2a\x49\x01\x09\xc9\xd6\x4d\xdf\xfa\x92\xdc\x10\x36\x8b\xe5\x88\xeb\x3a\xc3\x22\x9d\x90\xef\x27\x1c\x25\x7b\x6a\x35\x1f\xdb\x4c\x64\x3b\xdb\x03\x89\xfa\x73\xae\x70\xe0\xbb\x86\x77\xcc\x8b\x8e\x1b\xda\x2f\x7c\x6e\x31\xdd\xc8\x46\x3a\x9d\x82\xb4\x39\x9d\x9f\xb3\xe4\xe9\xa5\xb2\xc5\x91\x64\x0e\xe6\x7b\xfa\xfa\x68\xd9\xe3\x91\x5a\xc2\x48\x51\x89\x76\xc7\x68\x60\x8f\x53\xcc\x4d\xd3\x77\x0c\x8f\x2e\x10\xc4\xec\xff\x0e\x9b\xa6\x6e\x21\xdd\x60\x19\xc3\x2f\xbb\x8a\x70\x90\xa8\x62\x82\x81\xee\xdb\x0c\x15\x05\xa8\xe0\x36\xf5\x01\x37\xd7\x06\xa4\x4d\x2c\x8c\x32\xeb\x79\xbe\x4c\xbc\x19\xdf\x98\x1e\xa5\x5a\xd5\x45\x16\x24\x94\xf9\x1e\xfb\x97\x30\x41\x92\x23\x86\x38\x44\xd6\xa8\xb2\x16\x71\x9a\x46\x54\x04\x0e\xa5\xe6\x3a\x35\x91\x47\xb1\x13\xbb\xc9\x1a\x74\xc5\x9e\x37\x53\xd9\xfa\x74\x63\x3e\x45\x57\xe0\xc2\xba\x02\x01\x03\x21\x72\xe2\x89\x8f\x0f\x9f\x2c\xc0\x0e\x1f\xff\x78\x25\xb6\x2b\x6f\x73\x82\xa5\xa1\x03\xc4\x72\xe8\xf6\xeb\x94\x5f\x15\x45\x5f\xc1\x93\xc4\x44\xf1\x22\x07\x9e\x1c\xe8\x51\xd2\x00\xd9\xfd\xee\xe5\xee\xf3\xcf\x9e\xb5\xad\xf3\x4a\x98\x20\xae\x25\x7e\xdd\x96\xa2\x7d\x08\x6e\x24\x24\xb5\xe3\x1f\xe1\x9a\x18\x58\xb9\x42\x53\x72\xbe\x83\x83\x10\x89\xc4\x9e\xdd\x0d\x4e\x03\xfb\x14\x75\x61\x36\x79\x99\x54\x79\xb1\x0b\x58\x76\x74\x6a\xfd\x04\x2e\xf1\xc2\x4a\xa1\x24\x33\x3f\x6e\xec\x29\xfb\x60\x18\xe9\xfb\x60\xb2\x44\x94\x24\xcf\x77\xb0\x0e\x57\xb8\x81\xb0\x9d\xef\x7a\x68\x57\x50\x92\xd5\xf8\x12\x1a\x85\x4c\xe1\x5b\x83\x52\xe1\x9e\x1a\x30\xd4\xa5\x54\x57\x45\xbe\x76\x1b\x14\xcc\xd0\x58\x8d\x04\x57\x25\xa4\x01\x6d\x97\xfd\x82\xca\xf2\xc6\x47\xc0\x27\xe6\xf5\x57\xdd\xd6\xdc\x38\x5c\x32\x2e\x7b\x63\x3f\xaa\x2a\xf4\xd2\xac\x75\x81\xd9\x54\x66\xcd\x86\x3f\x44\x1c\x5f\xe0\xb2\x7c\xd2\x20\x07\xea\x31\x00\x99\x3a\x6f\xbb\x45\x2d\x96\x94\x8d\x59\xe2\x00\x1a\xac\xd0\x0e\x5a\xe0\x6d\x9d\x76\xee\x62\xac\x06\x1d\xb5\xd0\xa0\xa7\xef\xc5\x1f\xb9\xc0\x36\x09\xd9\x8f\x78\xdf\x44\x6d\x50\x57\x5f\xca\xb7\x7e\x51\x8a\x5e\x47\xde\x8c\x28\x23\xb1\x1f\xd9\x0b\xec\xd1\x50\x18\xac\x98\xf0\x29\x0c\xeb\xd0\x82\x21\x50\xeb\xd4\x15\x10\x81\xcb\xda\x28\x47\xf3\xaa\xfb\x3f\x75\x7b\xcb\x0b\xde\xdd\x70\xd3\x5d\x33\xfd\xa0\xa0\xaf\xe5\x2d\xdc\x27\xd1\xab\x7b\x71\x26\xd2\xc7\x10\x88\xc0\x3d\xdb\x11\xcc\x40\x5b\xbb\x1b\x09\x10\x22\x31\x23\xfc\x94\x73\x71\x19\x64\xe9\x83\x8f\x91\xfc\x23\xd4\xfc\x6c\xec\x50\xa3\x3d\x6f\xc8\xcb\x49\x66\x95\x29\x36\x85\xf1\x62\xd6\x50\xc0\xec\x9f\x0b\x13\xca\x9b\xc0\x74\xd6\x03\xcc\xc9\x41\xc5\xc5\xac\xf3\x25\x89\xbb\x47\xf7\x29\x5f\x2c\xbf\x15\x68\x32\xbf\x37\x49\xb9\xca\x6f\xec\x6a\x05\x6e\x91\x54\x5d\x9a\x4d\x9a\xef\x50\xd5\xd3\x1f\x17\x1d\x1f\xcb\x63\x03\xde\x7a\xc8\xee\x12\x18\x35\x62\xfe\x3f\x6d\x22\x11\x21\xe7\x56\xb3\x9c\x15\x33\x83\x3e\xfd\x55\xb9\x9e\xe7\x3b\xe6\x86\x17\x53\xe8\x73\x5e\x7b\xca\x74\xaa\x85\xcc\xf9\x55\x4b\xb4\x56\x68\x93\x2d\x3d\xa5\x18\xea\x7d\x23\x34\xc3\x2e\x21\x7f\xcc\xe9\x92\xa8\xf1\x5c\x45\x98\xab\xaa\x62\x61\xf7\x1c\xe4\x03\x55\x66\xaa\x2d\xcc\x9e\x7e\x49\xe5\x43\xb0\x65\x38\xfc\x8b\x33\x27\x68\x9d\xe7\x2b\x37\x9d\x9d\xf6\x5a\xe4\xc9\x14\x2b\x6b\x48\xc3\x98\x75\xbc\x26\xde\xd7\xf7\x0d\xbf\x6e\x8e\x22\x22\x43\x82\x38\x1e\xce\x49\x67\x47\x1e\x2d\x7a\x58\x5b\xde\x53\x7d\x11\x22\x9d\x10\x95\xbe\x6b\x57\x61\x2a\x6d\x77\x31\x5a\x39\x8d\x23\xd9\xb6\x77\xbf\x79\x8c\x32\xc3\x51\x88\xfc\xe0\xfd\x0b\x66\x97\x5b\xc6\x0e\xc8\xe9\xea\x84\x9f\x3a\xfc\xa1\xd4\x7a\x6b\xac\x91\x82\x9b\x28\xdf\xc1\x0d\xb4\x53\xbd\x02\xea\x64\xa4\x6f\x01\xb0\xa4\xf9\xb1\x72\x0c\x79\xe8\xc8\x82\x2a\x2c\xbe\xfb\x43\x39\x1c\x23\xb8\x67\x7c\xd8\xc5\xbc\x29\x1b\xc8\x01\xbe\xa7\xc6\xc2\xf3\x73\x6a\xc1\xd0\xd9\x7e\xe2\x7e\x53\x80\x44\xe1\x25\x93\x3b\x3f\x02\xf7\x66\x0e\x40\x77\x9f\xe9\xaf\x7b\x4e\x82\x16\x8c\xfa\x22\x7f\x30\x19\xd4\x44\x82\x41\x1a\x90\xd9\xf2\x85\xb8\x87\x34\xdc\xd1\xf2\x31\xca\x0f\xe0\x65\xca\x5c\xbd\xc2\xbb\xfe\x74\x38\x85\x07\x34\x2b\x17\x9c\x33\xcb\xcb\x07\x0f\x95\x34\x01\x41\x5f\x2f\xd3\xd6\x66\x87\x46\x18\x17\xc5\x5f\xc9\x73\xb3\x3e\x86\x2c\xa1\x07\x6e\xb7\xc5\xbd\xce\x2a\xa7\x4b\xd7\x88\xc9\xca\x88\x2c\x25\x22\x9e\x53\xb4\x40\xc8\x6e\x27\x41\xfa\x69\x3c\xf9\x63\x58\xaa\x00\xa1\x9d\x4e\xf5\xe0\xcf\x81\x5c\x9b\xdd\x39\xca\xd2\x4e\x45\x7b\x4e\xbb\x0c\x81\x2c\x8a\x17\xe7\x60\x97\xb9\x24\x0f\xc7\x06\x3f\x35\x33\xb5\x88\x17\xe4\x31\x5f\x58\xcb\xd9\x53\xd7\xbe\x64\x10\x4e\x52\x1a\xaa\x18\x35\xe7\x80\x42\x55\x96\x39\x63\x02\x87\x3f\x42\xa5\x85\xea\xde\xe4\xc5\xce\xef\xc9\x76\xaf\xb0\x76\x81\x48\xe9\x64\xe6\x2e\x4d\xee\x4c\xb6\x30\xc8\x50\x00\x89\xc2\x28\xa0\x1a\x88\xe8\xbc\x0d\x1c\x3b\xf0\xa0\x19\xfa\x41\x47\x01\x2f\x36\xac\x6f\x8f\x5c\xa5\x7b\xc4\x80\x1b\x98\x3a\xb0\xc0\xed\xbf\xd1\xee\xc5\xf2\x56\x18\xe6\xa5\x5e\xeb\x3b\x61\x90\xde\x6b\xdb\x18\xbb\xa9\x17\x09\x6e\x1a\xa1\x1e\x7b\x38\xb3\x0b\x3e\x2c\xbb\x77\xe3\x27\x26\x2d\x3f\xdb\xf6\x21\xcd\x91\x94\xf1\x2e\xcf\x97\xdb\xc4\x5a\x5b\x10\xa3\x2b\xab\x7c\xb3\xd1\x77\x06\x69\xaf\x6a\xdb\xb0\x15\x29\x73\xc3\x79\x95\x32\x54\x27\x62\x93\x8f\xbd\x35\xaa\x4a\x17\xf4\x61\xdc\x53\x7c\x98\x61\xad\xa1\x34\x78\xe7\x5e\xb4\x5b\xc8\x3c\x4a\xaa\x51\xe0\x9f\xac\x1a\xba\x90\xce\x0a\x22\x12\x1b\x7f\x4f\x2c\x28\x05\x62\x35\x26\x52\xb1\x2d\x14\x22\xa5\x44\x95\x81\xe7\x5d\x95\xac\x0d\x1e\x84\xde\x84\xd6\xb0\x26\xf8\xc8\x0e\xe9\x25\xec\xd7\xe0\x63\xc7\xdb\x42\x28\x4a\xac\x71\x06\xaf\xbb\x28\xcc\x43\x8e\x4d\x7d\x84\xce\xc5\x8d\xdb\x6a\x2f\x8f\x0b\x54\x15\x3e\x1e\xea\x79\x2c\x1e\xd5\x75\x36\x47\x0d\x59\x16\x2d\x53\x6f\x66\xb5\xb2\x2b\xc7\xc7\x3e\xc3\xc5\xe7\xa5\xd9\xf1\xbd\xe0\xa6\x49\xc3\x01\x49\x3c\x29\xf0\x51\xed\x65\x36\x0e\xc5\x17\x44\x71\x63\x83\xc9\x13\xda\x51\x61\x2d\x39\x92\xf8\x10\x97\x3e\x81\x14\x84\xc5\x7e\x2a\x36\x6c\x71\x1b\x38\xf1\xf0\xec\x6b\x1d\x8e\x8f\x45\x03\x31\x7c\xb2\xcc\x91\x46\xcf\xad\xa5\xfb\x3c\xcb\x99\x05\x73\x9f\xa2\x05\x9e\x4d\x82\x62\x28\x50\x48\x20\x8e\x36\x62\xe1\xcb\xed\xf3\xc0\xf6\xda\xed\xf7\x03\x9a\x2c\x10\x98\x7f\xf4\x77\x15\xb5\x95\x88\x89\xe3\x95\x50\xca\x2d\xf0\x70\xa5\x13\xb0\x20\x0f\xed\xb4\xc0\xdf\x96\x46\xa7\x49\x76\x77\xd8\x6b\xbc\x11\xda\x09\x1d\x97\x95\x14\xae\xb5\x8f\xf0\x44\x39\xe0\xe4\xc3\x01\x4a\xdc\x37\xde\x71\x6e\xf2\xdf\x60\xd9\x50\xeb\x90\x80\xf1\x47\x9d\x33\xda\x66\xaa\x1c\xc7\x99\x02\xd8\x7e\x60\xc5\xdb\x66\xfb\xf1\xf4\xa4\x27\x57\x36\x6c\x6c\x14\x2a\xec\x13\x4a\xf1\xd1\x9e\x85\xfc\x43\x7f\xef\xbe\x69\xb7\x2e\x01\xe2\xf7\x19\x71\x8c\x6b\x83\x7b\x12\xb1\x52\xc9\x89\xab\xd5\xa2\xc8\xcb\xf2\x18\x99\x6e\x61\xa5\xd7\xc0\x1c\x69\x7f\x8f\x94\xbe\xd3\x49\x56\x4a\x0f\xad\x90\x0e\xbc\x41\x5a\x1f\x47\xc7\xd7\x75\x3c\xa0\x79\x52\x3a\x62\x18\x1a\x1f\xa9\xf7\xeb\xe5\x7b\x9b\x1b\x32\x1e\x7d\xd4\x6e\xff\xb0\x2e\xfa\x20\x98\xf7\xeb\x39\xdd\x73\xcf\xfe\x24\x60\x9b\x52\x22\xec\x5e\x17\x4b\x54\x42\x82\x0a\xdb\x9e\xfa\xbe\x2e\x92\x72\x99\xd0\x70\xfd\x60\xb2\x1a\x77\x4f\x94\x15\xb5\x4d\xb8\xd6\x5b\x22\x7a\xc3\xb6\xe5\x08\x70\x0f\x94\x65\x5b\xd4\x0b\x73\xa3\xe6\xc0\x50\x51\x39\x4e\x04\x9c\x72\x35\x21\xfa\xb5\xfa\xb3\x78\x32\x56\x46\xd1\x45\x32\x6c\x97\x2c\x0d\x61\x59\x29\xab\x2f\x23\x5e\x18\xfa\x41\x65\xde\x64\xad\x8b\x9d\x9a\xd7\x65\x62\x6d\xc0\x48\x18\x33\x10\x97\xd0\x5b\x4f\x92\x1d\x3c\xd8\xd3\x3d\x90\xe0\xc6\x2a\x4d\x16\xd5\x71\xbe\x3a\xa6\x93\x90\x14\x7f\x49\xf5\xa3\x49\x28\x62\x58\xa3\x78\x44\x2f\xe3\x02\x22\x77\x5c\xa2\x72\x41\xf6\x50\xe9\x7c\xc6\x61\xb0\x3f\x4d\x75\x0a\x87\xd7\xfb\x3c\x5f\xc2\xf6\xe6\x0f\x4a\x4f\x13\x61\xc7\x7e\xaf\x55\xc2\xf2\x24\xd5\x3e\x9a\x60\x98\xc8\x2b\x6b\x6b\xf0\x49\xc8\x93\xb1\x4b\x71\x19\xf1\xb9\x92\x99\x3c\x5b\xaa\x8d\xc9\x74\xca\xa6\xb8\xdf\x1c\x73\x17\xcf\x07\xa6\xb7\xac\x55\xbe\x21\x07\x3a\x0e\x49\x4d\x42\x6d\x6c\x3e\xce\x9a\xb2\xd8\x92\xc7\xe2\xf4\x0c\xfc\xd9\xbc\xc8\xcc\xae\x7c\xa1\xae\x8c\xb5\x79\x86\x18\x8c\xd0\x8e\x7d\x87\x08\x85\xf6\x1f\x90\x18\x66\x34\x10\x1f\x67\x23\xca\xcf\x64\x3b\x0b\xab\x3c\xe2\x60\xfb\x83\x4e\x52\x5c\x85\x85\xb3\xa1\xe6\xc8\xd3\x5d\x11\x49\x63\x61\x00\x2a\x4c\xb3\xa7\xa4\x11\xc3\x68\x6e\x43\x91\xba\xcb\x6a\x14\x06\x82\xf6\x9d\x5b\x19\xc3\x67\x5f\x09\x15\x46\x8b\xba\x28\x88\x61\x25\xcf\x32\x1a\x43\x41\xf7\xda\xde\xed\xec\xa8\x6c\x36\x46\x83\x0d\x24\x2e\xfa\xf9\xef\xe1\xbc\xa7\x3e\x26\xe5\xc2\xa4\x29\x92\x74\xc5\xfb\xb5\xc9\xc5\x31\x0b\xdc\x4f\x08\xf2\x0e\x68\x9f\x22\xa7\xa9\x14\x6c\x8c\xc0\x4c\x6f\xfd\x61\x26\x55\x09\x0d\x56\x57\xc0\x22\x8b\x53\xc5\x5d\xb1\xa5\xaf\x7a\xea\x32\x40\x42\x1d\x7e\xce\xeb\x43\x3b\x8a\xb3\xc0\x64\xc2\x3f\x13\x75\x8f\x7d\x43\x4d\x2a\x77\xe7\xfc\xd4\x9b\x8d\x29\xd0\xe8\xde\x5a\x83\x1c\x88\x5b\x88\xae\x36\x13\xc2\x62\x68\x1e\xa2\x0f\x05\xb3\x65\xc7\x47\x9d\x7d\x39\x92\xba\x92\xf5\x48\xd6\x9b\x14\x68\x03\x91\x17\xda\xe9\x85\xb8\x49\x1c\x35\xcc\xbc\x2b\xdb\x08\x7f\x7f\x48\x1f\x73\xf7\x60\xe3\xc0\xd0\x09\x3d\xdc\x53\xbd\xe5\xa9\x9d\x94\x65\x98\x72\x8b\x48\xa0\x83\x65\xa7\xd6\x6b\x24\xc6\x00\x16\x5c\x68\xd1\x2e\xaf\xf1\x99\xac\xb5\xee\xde\xb1\xc7\x9a\x45\xea\x90\xbe\xc3\xc1\xc7\xa3\xa4\x87\x4b\xc9\x8e\x56\x44\x6e\x9d\xa4\x30\x8b\x30\x6c\xc2\x81\x17\xfc\x23\x1d\x32\x6b\x9d\xe9\x3b\xa7\x69\x0e\xb3\x04\x7b\xe3\xdf\xc8\x7c\xe7\x3c\xce\x86\xc3\x99\x17\xea\x28\x49\x7a\x08\x76\x00\x48\x44\xbe\x52\xab\x64\x55\x01\xf1\x35\xa0\x17\x8e\xbe\x39\xf9\x3f\x7b\x8a\x6b\x27\x99\xed\xb6\xae\x9c\xae\x3a\x28\xc2\x96\x7c\xaf\xa4\xa7\xe6\x26\x33\xab\x04\xfc\xaf\xe0\xbe\xa2\x6d\x38\xf1\xbe\xe9\x61\xb8\xcd\xf6\xee\xb6\x34\x9e\xfe\x90\x3b\xda\x42\x00\xd8\x37\xbe\xd5\x3b\x2c\x61\xf0\xc1\x61\xc1\xae\x44\x47\x1e\x8c\x74\x47\x40\x00\x59\x95\x40\xd5\xdf\x4e\x28\x77\x4c\x42\x2c\xaa\x64\xfe\xa1\x9c\xb8\x96\x4c\x61\xc8\x42\x28\x70\xa9\x85\x5c\x89\xd0\xa1\xda\x7e\x0b\xc3\x93\xd8\xab\x6f\x7b\xea\xa3\xd4\xd0\xca\x57\x8d\x75\x34\x6b\xac\x79\x8f\xd0\xf8\xaf\xff\x54\x67\x27\x27\xdf\x58\x5b\xa2\x00\x13\x6d\x92\x97\x26\x8b\xd5\x8d\x4f\xc0\x84\x99\x80\x26\xfb\x64\xd4\xf4\xcd\x1a\xf4\xac\xb8\xb3\xca\x84\xe7\x7e\xa3\x1f\x73\x6e\x98\xd7\x96\xf9\xcd\xd0\xba\x44\xb4\xcd\xb2\x3b\x32\x83\x4c\x30\xad\x2c\xaf\xe7\x5e\x6d\xc8\x1a\xe1\x4a\xfe\xb1\x1d\x74\x60\x31\xa2\x26\xd3\xa6\xec\x2a\x58\xf0\x2e\xfa\xc7\x88\x18\x04\xf0\x7c\xe4\x3f\x0b\x98\x10\x4a\x60\x39\xc5\x5d\x34\x02\x03\xb4\x50\xd9\x80\x0b\x35\x0c\x00\x8f\xfd\x11\x5a\x45\xb0\x98\x03\x1a\x4f\xe6\x56\x15\x19\x01\x66\xf9\x2f\x54\xb3\x61\x28\xf5\x68\xd4\x61\x27\x2e\x02\x1d\xa7\xf1\xf4\xfa\x30\x90\x98\xb2\x8f\xc1\x25\x93\x97\x9c\x6c\x24\x3b\x83\x4b\x66\x3b\x1f\xf6\x16\x17\xbf\x08\x75\x23\x57\x73\xe5\xa4\xba\x1c\xa5\x93\xcb\x1c\xad\x92\xa2\xac\xec\x49\xaf\x81\x23\x8c\x68\xe8\x1d\xa4\x84\xbe\x76\xd8\x00\x31\xfd\x3e\xc9\x4a\x53\x50\x9f\x39\x98\x07\x6d\xb3\xa6\xc4\x1f\x0e\x95\xd7\x8d\xa0\x3b\x70\x9b\xf3\x6d\x26\x98\xbd\x61\x77\x5e\x81\x4c\x73\xba\x73\x04\x59\xf4\x3e\x98\x27\x20\x6b\x68\xd4\x81\x78\x6a\x92\x34\xde\x0b\x3a\x38\xfe\x4d\x34\xde\x3c\x38\x02\xf6\x1d\x10\x1a\xd9\x79\x07\xc4\xdc\xdd\xfd\xf6\xee\x75\x89\x32\x72\x60\xdf\x3d\xe0\x06\x44\xaf\x12\x6e\x33\xb4\x67\x00\xae\x85\xa3\xf1\x74\xd8\x73\x0e\x1f\x1e\x6d\x38\x08\x76\xd5\xf1\x20\x15\x06\x45\x7d\xec\x02\x30\x45\xe5\xb7\x95\x4d\x91\xdb\xc3\x1d\xf7\x9c\xd7\x3d\x89\xa9\xe9\xaf\x4d\xb6\xf4\xc9\x2f\x9e\x03\x30\x2a\x7a\x8d\x6e\xbc\xa3\xc2\x22\x6b\x79\x0f\xf2\x6e\x3c\xbd\x56\xe7\xf1\xc9\x61\xcf\x8e\xff\xe1\x73\x40\x7d\x87\x71\x88\xe6\xa6\x3b\xf8\xdc\x8f\x1b\x22\x6a\x89\x2e\x69\x25\x39\xa1\xaf\x23\xdd\x93\xde\x0d\xd1\x9d\xa1\xa9\xb7\x34\x8b\xd4\x9e\x37\x8e\x7d\x20\x21\x1d\xcc\x63\x01\x8d\xcf\x8b\x3b\x9d\x25\x7f\xc5\x81\x42\x2e\x3a\x48\x7c\x83\x76\x13\x88\x90\xd6\x06\x08\x21\xca\x1c\x8a\xe0\x5c\xce\xa5\x8b\xbc\xf3\x39\x70\x28\xd2\xe2\xe2\x44\x68\x59\x6f\x20\x2f\xec\x73\xf5\x6d\xeb\x99\xc5\xb5\x8e\xe6\x08\x7f\xc7\x85\x05\x51\x3f\x0a\xd5\x71\xa8\xe1\xb5\xfa\xd7\xc3\xee\x9c\xc5\xe1\xbf\x01\x5e\x8b\x46\xd8\x8d\x2c\x1c\x86\x5f\x0c\x11\x6e\x05\xed\x2f\x9f\xc4\x63\xe1\xcd\x22\x22\x8f\x1a\x4f\xd4\xf8\xea\x6a\x30\x91\x54\x51\xc3\xc1\x54\x7d\xfa\xd0\x9f\x4d\xc7\x83\x1f\x06\x13\xd7\x8f\x45\xcf\xfa\x19\xd5\xa3\x5d\xf9\x9d\xfa\xd7\xc3\x3d\xf1\x76\xec\xcb\xde\xe6\x60\xda\x1c\x19\x19\x65\x0c\x99\xdc\xdd\x21\xb3\x45\x00\xed\x15\x32\xea\x64\xf9\xd6\x5b\x79\x87\x68\x34\x1d\xf2\x97\x5d\xb3\x97\x38\xfc\x8c\x85\x6b\x84\x78\x5a\x27\x91\xbd\xa9\x17\x3b\x85\x8f\x9e\x5c\x16\x87\x24\xf9\xe3\x01\x00\x7b\xb6\x77\x6f\x01\xed\x3f\xe6\x7e\xd2\x94\x7c\xfc\x25\xbb\x35\xc9\xa2\x1a\xf8\xf4\x2f\x5c\x7f\x4a\x0b\xcf\x2b\x3b\xe0\xe2\x73\xe2\xa4\xfe\x14\xb0\x2b\x96\x47\xca\x0d\xdf\xeb\x58\x8d\xbd\xa9\x89\x95\xfd\x40\x91\xf6\x77\xea\x1b\xb4\xda\x07\x2f\x9a\x9d\xe2\x9d\x15\x1f\xca\xdc\x8d\x18\x23\x6f\x82\x75\xa1\x2a\x80\xf4\x01\x89\x49\x63\x8e\x47\xb5\x75\xe5\x53\x5d\xb8\x7d\xb7\x41\x40\xe9\xea\x69\xd1\x4c\x48\xfe\x6a\xd8\x5e\xda\xdf\x4b\x3c\x60\x1e\x7f\x33\xf4\x32\xa4\xc2\x89\xd4\x13\xda\xb7\xbb\xba\x59\x6d\x7a\xcf\x59\xf7\x69\x10\x93\x84\x69\x0d\x2b\xf6\xb0\xdd\x22\xf0\x07\xdb\xc3\x46\x1d\x25\x8e\x48\x6c\x26\x6c\x81\xdb\xee\x87\x3e\xd6\xf4\xdf\x1a\xb2\xfe\xf5\xe7\xef\xf8\x13\xbf\xec\xd7\x55\x6e\xad\x35\x4f\x02\xf1\xf7\x2e\x06\x79\xaa\xfe\xf7\xd5\xab\x6f\x1b\xf5\x1f\xdf\x9c\x9c\x7c\xad\xff\xfd\x55\x7e\xfa\xb7\xb3\xf1\xc5\x78\x74\xa5\xec\x7f\x86\xef\x6f\x27\x03\x35\xbd\x98\x0c\x6f\x66\xc4\x15\x39\x1c\x8f\x0e\x7e\xf0\x55\x0b\x91\x3a\xfd\x9d\xea\xd7\x77\xd6\x0d\x39\x3b\x39\xf9\xee\xa0\xe9\x14\x7f\xf7\x04\x7b\x92\xfa\xfd\x7d\x55\x6d\xde\xbc\x7c\xb9\x2a\x57\x71\x5e\xdc\xbd\xfc\xc3\xc1\xff\xcf\xde\xbf\x2d\xb7\x8d\x6c\x6b\xa2\xf0\xbd\x9e\x22\x83\x17\x7f\x89\x11\x10\xac\x83\xed\x3a\xfd\xb1\xa3\x29\x0a\xb2\x39\x8b\x22\xb5\x48\xca\x2e\x77\x47\x47\x2f\x90\x48\x4a\x98\x06\x01\x4e\x00\xb4\xcc\x79\xb1\x63\x3f\xcb\xbe\xeb\x9b\x7e\x88\xf5\x28\xfb\x49\x76\xe4\x38\x64\x8e\x04\x40\x49\x75\x9c\x6b\x77\x94\x2f\xaa\x6c\x89\x04\xf2\x9c\xe3\xf0\x8d\xef\x8b\x98\x71\xcd\xe3\x1e\x66\xc5\x98\x97\x08\x30\x8b\x23\x92\xe1\xbf\x48\x6f\x05\x74\x6d\xa4\xa9\x4e\x8e\x09\x09\x59\x11\x7d\x96\xd5\xda\x04\xfb\xd4\xa9\xed\xc5\x99\x44\x53\xfa\x90\xa4\x6f\x9f\x27\x9c\x0a\x5c\xa5\x87\x3a\xee\xbd\xbb\x1d\x7f\xb9\xe8\xf5\x81\xec\x4d\x56\xbd\x10\x7d\x2f\x52\xb9\x19\xeb\x77\xa9\xe3\xf2\xe5\x72\xf1\xcc\x77\x0e\x2c\x6e\x52\x33\xd7\xfe\x34\xad\xd4\x3d\x24\x3e\xf0\x29\xd0\x8e\x16\x17\x96\x1d\x02\xd2\xe0\x6f\x70\xc1\x7b\x23\x84\xea\xb4\xc5\x63\xcb\x00\xe7\x43\xe4\x1b\xe0\x6c\x02\xa2\x24\xe2\x9d\x92\x10\x43\xcb\xd8\x4d\xc9\xdf\x6f\x2a\xa2\x09\x97\xe9\x47\x0c\xb8\xeb\x3a\x2e\xf7\x98\xb9\x3b\x0d\x45\xdc\x13\x0d\xc2\xde\x90\x08\x2d\x10\x52\x9e\x32\x53\x3c\x2b\x46\x79\xca\x62\x6b\x41\xf2\x2b\x9a\x6a\xdd\xd5\xd8\xd2\x63\x78\x3a\x85\x8d\x40\x71\x6f\xc2\x7a\x55\x43\x2c\x10\xc6\x57\x23\x3a\xa7\xeb\xf1\x4e\xf6\xcb\xf2\x3e\x19\x87\x51\xb6\xdc\x2a\x4f\x09\xce\xe3\x15\xa9\xbe\xe3\xf5\x8c\x71\xf8\xc4\x0c\x50\xa8\x43\xc0\xe8\xba\x5f\xa4\x39\xa8\xaf\xa7\x99\xee\x23\x47\xb0\xf9\xe1\x26\xcd\x53\x6c\xa7\xd9\x2a\x45\x45\x25\x0d\x89\x5e\xee\xee\xef\x19\x69\x66\x7e\x52\x97\x08\x0a\xc7\x79\xc2\x3e\x8e\x72\x9d\xa5\xf7\x10\x38\xb3\x23\xeb\x35\x58\xba\xf8\x5d\x03\xc2\x1a\xea\xb6\x32\x60\xe0\x36\x94\x8b\x8e\x59\xf9\x6e\x40\x82\xf9\x02\x3e\x66\xfa\xe3\x7b\xd0\x75\xc6\x05\x24\xc6\x34\xf0\x71\xb3\xfc\x51\xc8\x1e\x00\xee\xd4\x85\x1a\xbf\xa4\x45\xc6\xa6\xaa\x5d\x7c\xb0\x01\x44\x58\x2b\x5d\xfb\x1a\x3d\x76\xee\x90\x2b\x90\x55\xa3\x1b\xa3\xc2\xcb\x98\x67\xcc\x97\xb8\x2b\xd4\x52\x03\x03\x59\xd7\xf0\xd8\x70\x49\x33\xfe\x45\x72\x17\xe6\x51\x5f\x8a\x34\x69\x6e\x3d\x4e\xb7\x39\xae\x19\xb9\x64\x9d\x1e\x09\x73\x3f\x82\x6c\x7b\xd7\x47\x85\xb2\x73\xa9\x37\x05\xd3\x62\x8a\x4d\xce\x02\x7b\x00\x44\xb1\xf1\xa2\x4a\xaf\x0a\xa0\x9f\x63\x4f\xc2\xf3\x7b\xed\xd0\x92\x0a\xfa\xa4\x50\x1f\x75\xfc\x59\x43\xc2\x55\xee\x09\x73\x5b\x64\x7a\xcd\x92\xae\x16\xd0\x4a\xa0\xb7\xd6\x91\x63\xcd\xf6\x74\x83\x02\x18\x7b\x26\x59\x06\x8a\xe7\xdd\x66\xeb\x42\x07\xa0\x7c\x73\x42\xb9\x2d\xab\xa6\x68\x0c\x78\xc4\x41\xf8\x27\xa9\x69\x85\x9f\x1a\xa4\x59\xb5\xbe\x96\x6b\xf6\xff\xce\x26\x6f\xf8\x6a\x78\x3b\x1d\x9f\x9c\x85\xa7\xe7\xff\xaa\xfa\xdf\xb7\x6f\x5f\x37\xf9\xbf\xce\x4f\xdf\xbc\xfe\xcb\xfe\xfb\x33\xfe\x98\x4d\x08\x27\xd3\x6d\x59\xc0\x9d\x09\x11\x0f\x1b\x58\x34\x8b\xa3\xaf\xcc\xea\x38\xba\x2d\x75\xbc\x59\x66\xfa\xc8\xcb\x8b\xa0\x7d\x51\x21\xcf\xaf\x48\xeb\x63\xc1\x42\x33\x85\xe2\xa1\x93\xd0\x90\x40\x1a\x60\x8a\xd3\x74\x41\x96\xcd\x7d\x15\x39\x62\xab\x6b\xe0\xa2\xb1\x98\xde\x06\x5f\x85\x4d\x40\x61\xc2\x58\x80\xe3\x51\xa0\xab\x28\x37\x68\xe6\x80\x80\x1d\x70\xd9\x56\xcd\x7c\x81\x67\xab\xd8\xcc\x46\xa9\x21\xec\x79\xf2\x7c\xdb\x48\x8a\x1c\xea\x02\x20\xc5\x6d\x61\x8e\xa2\x45\xd5\x8f\xbf\xec\x69\x92\xcc\x32\xb1\x75\x92\xfe\xf7\xe9\xa3\x0e\x59\x6d\x11\x6d\x2d\xb5\x3b\xfc\xf2\x84\x95\xb2\x21\xeb\x97\x32\xfa\x38\x70\x14\x11\x16\xba\x69\x09\x24\x44\x38\xd6\x63\x85\x40\xc9\x55\x77\xec\xb6\x68\x28\xf0\x95\xe6\x63\x83\xb2\x4e\x57\x88\x78\x44\x41\x5b\xa6\xd7\x87\xd9\xe3\xc0\xff\xb2\x55\x23\x51\x6a\xc7\xb2\xcb\x39\x32\xf3\xb5\x01\xc4\x74\xbe\xa9\x10\x3e\x9b\xd7\x47\xcd\x65\xa7\x81\xc3\x31\x51\x4b\x5d\x3f\x6a\x4d\x85\x19\x35\x88\x07\xc9\x14\x37\xa6\x96\x28\xc7\x5c\xea\x38\x21\x15\x3c\x67\x55\x50\x25\x62\x63\x9d\xbb\xf0\xc9\x76\x57\x56\xbb\x98\x6b\xc9\x1b\x89\xb1\x67\x5e\x88\xb6\x20\xd4\x31\x55\xee\xd1\x9d\x64\xc4\xe2\xc1\xc7\x3d\xec\x7d\xaf\x1f\x72\x45\xfa\xd1\xe2\x7d\x84\x48\xef\xe3\xc1\x5c\x5d\x45\xd7\xc8\x38\x1e\x8d\xa7\x1f\xfb\x6a\x64\x19\xfb\xaf\xd4\xdd\xe4\x2a\x42\x2d\x01\xa4\xf5\x06\xb4\xf8\x68\xae\x86\xd3\x2b\x60\x1d\xff\x5b\x34\x5c\xa8\xe9\x6d\x34\x61\x85\x02\x75\xdc\xa3\xbf\x01\x10\x90\x5f\x83\xcf\x5c\x44\x43\x52\x1d\x70\xf4\xf1\x9e\x62\x40\x53\x8c\x60\x30\xf9\x84\x64\xec\xd7\xee\x51\xf8\xc9\xc5\xfb\xc1\x44\x0d\xe6\x6a\x70\xb7\x78\x3f\x9d\x8d\xfe\xab\x68\xab\x93\x4b\x40\xd2\x77\x7e\xd3\x78\xf0\x91\xda\xf1\x7e\x74\x39\x5a\x44\x57\xe1\xd1\xe5\x27\x15\xfd\x1c\xcd\x86\xc8\x00\x6f\xde\x06\x1f\xb5\x20\x79\x78\xa1\x1d\x8c\xf7\xd1\x2c\x1a\x4d\x88\x97\x7f\x08\x32\x09\x83\xc9\x15\x12\xe5\x9b\x6f\x5c\x46\xea\x72\x7a\x37\x81\x0e\xb6\x87\x8c\xda\x84\x83\x82\xcd\x56\xef\x66\x83\xc9\x62\x0e\x0f\x34\x3f\xa5\x97\x0f\xa7\x13\xe2\x80\xc7\x37\xaa\xd1\x04\xb8\xeb\x47\x57\xd1\x6c\x60\xdc\x6d\xf3\xcc\x4f\xd3\xbb\x19\xb5\x82\xc5\x06\x80\x8e\xbd\x8b\x7e\x3d\x54\x23\xf8\x82\xba\x9a\x02\x51\xbd\x6d\xb1\xe8\xc5\x8b\x1a\x8f\x7d\x1f\x0e\x26\xe6\x29\x37\x83\x9f\xa2\xae\x19\x62\x03\xbf\xe9\x91\x29\xa5\xe2\x50\xf5\x68\x6b\x57\x04\x99\x08\x44\x99\x7f\xb6\xc7\x02\x9b\x98\x3e\x22\x19\x51\x71\x0d\xd3\x16\xa0\x9a\x5d\x5d\x29\x26\xd1\x7d\xf6\x90\x64\xfb\xd8\x1e\x20\xb2\x2e\xcb\xfc\xad\xe4\x46\x2e\x4d\x23\x71\xc7\x88\x92\x32\x7f\x5b\x4a\x94\xc9\x2f\xdc\x8f\xfc\x9a\x55\xa8\x9a\xb4\x02\xfc\x3e\x4f\xb4\xde\x62\x8a\x39\x8a\xee\xff\x00\x44\x48\x48\x5b\x4d\x9f\xe8\xaf\x18\xc2\x15\x67\xb8\x52\x2a\x09\x55\xaf\x39\x20\x3d\x0c\x12\x3b\x98\x11\xff\xba\x0a\xac\x9a\x32\xaa\x46\x23\x89\x1a\x17\x92\x73\x15\x92\xd5\x6c\x4d\xe2\x3a\xb6\x34\x9d\x7e\x6d\xa2\x2d\xd5\x51\x4a\xe9\x50\xf5\x6e\xe9\x6c\x2e\xfd\x12\x6f\xb8\x05\x6c\xb0\xe2\x51\x2f\xab\xb4\x06\x76\xea\xfb\xf8\x9f\x69\xae\x03\x35\xbc\x3a\x99\x4d\x6f\x02\x75\xf5\xe1\xca\x9d\x89\x24\x95\x0e\xae\x2e\x62\x41\x9c\x48\x33\x17\x93\x20\xc0\x1c\x27\x99\x51\x1d\x4a\xa9\x75\xd8\x28\x38\x97\x69\x20\x6d\x17\x24\x7a\xeb\x92\xc3\x8a\xd0\xd9\x62\x38\xb0\xe3\x56\x47\x9b\x2a\xa3\x1e\x74\x6b\x01\xf2\xbb\xef\xcd\xbb\xeb\x38\x4f\xe2\x32\x51\x14\x36\x93\x0d\x40\xe4\x1a\xf5\x60\xad\xd2\x1a\x92\x81\x78\xdb\xe9\xdc\xde\xdc\x01\x62\x5b\x2b\xff\xa7\x87\x7c\x33\xba\xf5\x78\x88\x07\x44\x8c\x84\x5a\x5c\xf4\xbb\xa5\xb6\xd0\x11\x62\xeb\x4f\xd2\x6a\x55\x6a\x99\x40\xc5\x2f\x72\x57\x1e\x42\xd5\xc3\x65\xfb\xd4\xf8\xe1\x08\xc9\x7b\x9a\x7c\x2c\xbb\x1a\x24\x8c\xaf\xb1\x97\x83\xd6\x38\xd2\xea\x04\xf8\x97\x5b\x7a\x41\x93\xd5\xec\xf1\x21\xad\x35\x50\xa1\x57\xf6\x66\xe5\x93\x87\xdb\x9f\x32\x10\x2e\xad\x50\x4f\xb2\x85\x68\xe3\x7b\x97\x44\xb3\x84\xf9\x69\xf7\x9e\x05\x74\x3f\xa3\xd1\x4c\x7e\xef\x75\x9c\x96\xea\xae\xd2\xaf\xf8\x2f\xb6\x4c\xf1\x85\x88\xfd\x52\x27\xbb\x95\x0e\x10\x53\x89\x72\xce\x04\x99\xc2\x6d\x89\x0d\xe0\xf2\x1f\xd8\x1d\x0c\xd6\x0f\x94\x04\xea\x07\x9c\xdc\x8d\x49\x6a\x1c\x76\x95\x04\xfc\x17\x5c\x9a\x41\x54\x17\xfc\xf0\x26\x1d\x0c\x11\xec\x30\x96\x4e\x16\x28\xd8\xe7\xfa\x05\x37\x44\x0f\x11\x36\x8b\xf0\xe7\x5d\x66\x76\xa3\x24\xa2\x4b\xa5\x95\x6f\x07\x62\x72\xf9\x55\x34\x1e\x5b\x5d\x6e\x35\xd4\x98\x1f\x1f\x62\xcf\x10\x9d\xb0\xdd\xec\xcb\x8a\x36\xbb\x18\x04\xac\x3f\x95\x87\x75\xc5\x15\xf5\x40\x89\xf9\x83\xbb\x16\x9b\x78\xb9\x8a\x8f\x88\x06\xba\xc3\x2b\x25\x2d\xdb\xd7\x5c\x9a\xa3\x9f\x55\x3c\x7a\xa5\xbf\x95\xb8\xdc\xf8\x55\x08\x99\x5a\xee\xee\xd5\x3a\xfd\x6a\xb6\xd0\xb6\x28\x6d\x75\x21\xfc\x48\x5c\x2e\x3e\xb3\x86\x3d\x57\x2d\xdc\x82\x82\xdb\x57\x05\x78\x4d\x85\x00\x62\xd0\x99\xa1\x06\x74\xf5\x8a\xa3\x8a\xce\x3a\xa8\xac\x46\x58\x6e\x4d\x02\x14\x20\x69\x99\x80\x45\xde\x39\x1a\x56\x31\xbd\x09\xe6\xee\xbc\x67\xb9\xc7\xc2\x4a\x47\x94\x1a\x0c\x95\xe3\xb7\x48\x2b\x6c\xe3\xb1\x94\x44\x74\xe7\x46\xdf\x03\x7e\xd9\xd3\xbe\xa3\x2a\xca\x7a\x36\xb6\xa0\x95\x50\x53\xb2\x54\xd6\x81\x9c\x90\xf0\x03\x74\x63\x12\x3f\x58\xff\x50\x3c\x06\x28\xbf\x00\x3d\x06\x35\x15\xc0\x18\xd1\x87\xe1\xf9\x40\x7b\xea\xae\xfa\x0e\xe0\xc1\x53\x2b\xaa\xb5\x84\xcc\x9b\x1a\xcb\xac\x59\x92\x6d\xc6\xe1\xfe\xbe\xd4\x10\x84\x15\x85\x17\xc7\xa4\xba\xb3\x17\x2e\x6d\x5f\x70\x0f\x4a\x76\xa7\x2c\x2e\xef\x0f\x7e\xa5\x53\x9c\x55\x98\x12\xc2\x47\xc4\x42\xd0\x5d\x55\x79\x2e\xa2\x73\x03\x85\x5f\xcf\x37\x0f\xa9\x4e\xfc\x76\x37\x92\x6a\x24\xf0\x71\x58\x5e\x2e\x44\xf0\x98\xb7\x0c\x96\xb9\xbd\x7c\x5a\x5b\xfd\xd9\x09\x38\xe8\x32\x2e\x77\xb5\x87\x1c\x04\xfe\x95\xda\xeb\x80\xef\x9c\x36\xc4\xcd\xa1\x64\xcf\xf2\x05\xc8\xa5\x1e\x78\xdd\x46\xee\x10\x36\xc6\x3b\x8d\x09\x98\x9b\x01\x74\x76\x59\x16\xbb\x3a\xcd\xb1\x8c\x65\x53\x24\x3b\xd3\xa7\x6a\x47\xe8\x52\x2a\xff\x67\xc2\x75\x14\x43\x2d\x5e\x74\xb6\x79\x7b\xd4\x95\x13\xf9\xc7\x85\x57\x78\x6c\x6f\x69\x38\x2b\xe8\xc3\x87\x63\x39\x8d\xc3\xe3\x75\xd8\x62\x8a\xfa\x55\x17\x14\x6c\xef\xce\x1b\x8a\x4a\xbd\x62\x77\xf9\x04\xf2\xbe\x6a\xdc\x50\x79\x71\x82\x04\xa9\xcd\x9b\x4c\xd6\x88\x32\x77\xaa\xbb\x6a\xd8\xa0\xa0\xe4\x64\xbf\x49\x9b\x62\xb9\x52\x04\x21\x0a\x58\x0b\x48\x89\x12\xb8\x5b\x00\xd6\x10\xf2\xab\xe9\xd2\xb7\xf0\xdf\x84\x6a\x26\x24\xed\x71\x63\x64\x92\x1e\xc6\x2f\xb1\xbc\x20\xb8\xa9\x57\x01\x04\x04\x16\x62\x7a\x6c\x05\xa2\x33\x1a\x1d\x52\x57\x2a\xe8\x37\x2e\x52\x60\x67\x62\xfc\x37\x25\x31\x44\xbd\x5d\x5b\x6d\xd7\x11\x39\x58\x16\x07\xec\xb6\xa4\xdc\x65\xa0\x0c\xfc\xbc\xaa\x8a\x55\x0a\xc3\xeb\xca\xd0\x09\xc9\x48\x77\xab\x46\xbd\xd7\x17\x2c\xec\xc6\xdd\xec\xb5\x3e\x4e\xbe\xe8\xb2\x4e\x11\xef\x2e\xae\x1f\xcc\x76\x70\x56\xa3\xb2\x1e\x4f\x6c\xd9\x7e\x8b\xb5\xb5\x04\xc4\x55\xe8\xa3\x48\xad\xe1\x24\x8e\xc2\x5f\x41\x3e\xa4\x7d\xca\xa1\x5f\x72\x64\xb8\x2b\xcb\xeb\x36\x32\xf6\x64\x3a\xa6\xd2\x06\x20\x9d\x61\xda\xd9\x8e\x00\xb2\xcd\x02\x59\x63\xd8\x0a\xf5\xfb\xbe\x85\x2d\x65\xee\x78\x96\xb9\xa4\x91\xca\x8b\xee\xa6\x6e\x89\x70\x82\xab\x82\xc6\x03\x08\x50\x63\x5d\x6f\x46\x11\x4e\x78\x92\x55\x81\x30\xe6\x69\xb1\xbb\x7f\x08\x58\x00\x7b\x09\x72\xe5\x09\x75\x2e\xe1\xce\x11\x5f\x2f\xde\x6e\x07\x6e\xf0\xe7\x6f\x6a\x1f\x46\xd7\x79\xb2\x05\xae\x30\x75\x07\x92\x35\xe0\xb2\x3b\x9d\xac\x80\x69\x01\xee\xf2\x14\xee\xcc\x99\x26\x0f\x78\xc4\x34\x23\x40\xa2\x14\xb4\x0b\x12\x50\x18\xcf\xe3\x0b\x6b\x9f\xe1\xa5\xd7\xe2\x46\x39\x3a\x38\x54\x79\x05\x85\xbb\x0f\x58\x53\x5f\xe4\xac\xe6\x05\xc3\x6c\xae\xd2\x67\xc7\x81\xd9\xd9\x18\xe9\xd0\x1d\x17\xb5\xbc\x00\x07\x1f\xfa\xca\x6f\x6d\xe8\xa1\xce\x91\x4e\x8a\x98\xa3\x28\x0d\x4c\x2f\x12\x16\x3f\x76\x03\x04\x86\xa4\xab\xf6\x64\xb5\x9e\x07\x80\xa8\xbe\x71\x5e\x45\x77\xbd\xb0\xa5\xe0\xf1\xdb\x67\x69\x09\xb5\xd8\x2c\x76\xde\x3f\x6b\xbd\x35\x37\x6f\xbc\x02\xbc\x8b\x43\x01\x62\x62\xd8\x46\x86\x9a\x01\xea\x82\xc1\xd5\x82\x5c\xc5\x31\x97\xf8\x2d\x78\x6e\xf9\x36\xd6\x02\x56\x0d\xc0\x28\xae\x1e\xf2\x22\x2b\xee\x01\x24\xb2\xd1\xb1\x59\x10\x95\x57\xd2\xc5\x24\x71\x45\x2b\xa3\x04\x87\xa4\xda\xc4\x79\x0e\x05\x6c\x42\x1b\xdf\x46\x43\x9e\x0c\xcb\xad\x3b\x4e\x23\xcf\xe9\x37\xce\x61\x9a\x41\x25\x9a\xb9\x22\x37\x45\x89\xb1\x82\x74\x83\xdc\x64\xb6\x60\x0c\x29\x41\x72\xb5\x05\x84\x33\x88\xb6\xa5\x90\xee\x7e\xf2\xdb\x9b\xb8\xd6\x65\x1a\x67\xe2\x30\x49\xbd\xfc\x93\x70\x42\xf5\x57\xc0\xa6\x83\x43\x2d\x5a\x0d\xb8\x28\x57\x83\x80\xf5\x8e\xab\x07\xac\x09\x46\x5d\xe2\xfb\x5d\xc6\x24\x89\xe2\xca\x72\x55\x87\x68\x38\x41\x11\x2d\x5c\x22\xb0\x03\xb7\xfe\xc9\x0b\x94\x4b\xe6\xda\x97\xe0\xe2\x2a\x60\xae\x9d\x94\x36\xa6\x23\xe2\x09\x31\x96\x2c\x12\x02\x18\x57\x27\x6e\x9d\x40\xf5\x3e\x92\x9a\x71\x0f\x42\xd2\xe6\xe7\x83\x0f\x83\xd1\x78\x70\x39\x8e\x7a\x81\xa7\x44\x48\x92\xc0\x42\x10\xd8\x13\xf9\x9d\x89\xe8\xb7\xf9\xd7\xbb\xbb\x81\xf9\x5d\x14\xcd\x43\xf5\x69\x7a\x17\xb0\xcc\xeb\x2c\x60\x85\xdd\xc1\x78\x8c\x14\x39\xa3\x89\x1a\x2d\xe6\xe6\x97\x52\x5f\xd6\xa5\x11\x46\x93\xeb\xd9\x68\xf2\x2e\xba\x89\x26\x8b\x40\xdd\x0e\x40\x52\xd9\xff\xe1\xfc\x6e\xc4\x9a\x87\x81\x8a\x16\xc3\x90\xe3\xfd\xd4\xea\xf1\x27\xcb\xa7\x33\x87\x17\xd3\xcf\x03\xdb\x97\xe9\x0c\x24\x97\xef\x16\xd3\xd9\xa7\x83\x1d\x93\xed\xe3\xb1\x01\xc4\x3c\x24\x09\x82\x27\x06\xa4\xa5\x81\x1c\x88\x1f\x8c\x05\x39\xd0\xec\x59\xc1\x46\x2b\xfc\x2b\x15\x9c\x17\xa3\xc5\x18\xb2\x2f\x93\xe9\xe4\xc4\x1f\x1b\xd0\xb3\x1d\x2c\x5c\x7a\xe5\x98\xbe\x7f\x3b\x9d\x41\x6e\x03\x14\xad\xa7\xd7\x90\x87\x22\x1d\xe3\xc0\xcc\xc6\xf5\xdd\x38\x50\x97\x77\xef\x4e\x50\x02\x7b\x66\xa5\xb0\x3f\x8c\x66\x77\x73\x9a\x58\x75\x73\x37\x5f\xa8\xdb\xc1\x7c\x8e\x6b\x4d\xd2\x16\x4d\x40\xd4\x3a\xfa\x10\xcd\x30\x17\xe2\x8b\x10\x63\x6e\x69\xa6\xae\xa2\xd9\xe8\xc3\x60\x31\xfa\x80\x3f\x9a\x23\xd5\x54\xa8\x46\x79\xa2\x37\x39\xb0\x09\x79\x3b\x2d\xd1\x6b\x9d\x03\xc3\x13\xfc\x7e\x8d\x70\xc4\x87\x02\x28\xee\xca\x0d\x54\x18\x09\x43\x8b\x63\x91\x36\xf8\x89\x46\x0a\xd8\x94\x44\xc8\x00\x44\x3e\xc0\x26\x18\xa0\xb0\x5e\x40\x8c\x37\x96\x72\x27\xb0\x3c\x37\x29\x06\xe8\x41\xd6\x40\x96\x61\x4b\xb4\x9c\xa8\xb8\xc6\xfa\x59\xd3\x0c\xbf\xf4\xba\x2f\xb0\x40\x1c\x50\x97\x6c\x07\xb1\x5f\x90\xcf\x26\x0e\x87\xd4\xbf\x0b\x3d\xea\xa5\x5c\x52\x2f\x91\x9e\xb8\xaf\x40\x7e\x58\x79\x3a\xf0\x84\xaa\x41\x6e\x5a\xe4\xcb\x58\xd7\xfc\xee\x72\x3c\x9a\xbf\x8f\x66\x6d\x79\xe8\xe9\x04\x16\xd3\x38\x7a\x37\x80\x6f\x9a\xfd\x73\x4d\x2b\xac\x43\x16\x3a\xf0\x45\xa1\x03\x75\x7b\x37\x19\xc1\xe4\xc3\x6e\x8d\x6e\x6e\xc7\x83\xd9\xa7\xc3\x5a\xd1\x7e\xae\xd1\x6a\x47\x5f\x7b\x4b\xca\xca\xa8\x3b\xed\xe5\xa7\xfa\xf4\x6b\xc4\x97\x81\xa6\x28\xf4\x78\x89\x9c\x4b\xb4\xe8\x4a\x33\x1f\x32\x22\xd0\x55\x3e\x44\x6a\x02\xb9\x27\xb3\x1a\x96\x25\x78\xb5\x8e\xcc\x8f\xcd\x9f\x36\x3f\xcf\xc8\x86\xd4\x2b\x1b\x53\x37\x97\xc3\xe3\x43\xd1\x10\x6b\x6d\xd5\x87\xc0\x5a\x34\x2f\x68\x07\xd4\x03\xd6\x3d\x0b\x9c\x73\x0f\x4f\x43\x9a\x55\x32\x7d\x1c\xff\x83\x4e\x5c\x54\x0e\x6e\xc3\xf4\x40\xb3\x4a\x0d\x21\xcc\x34\xc7\x24\x08\xdc\xa4\xa9\x4c\xa7\x18\x63\x8f\x1f\x1f\xb2\x43\x5b\xa9\xb3\x40\x9d\x07\xea\x6d\xa0\xbe\x0d\xd4\x77\x81\xfa\x3e\x50\x67\xa7\x30\xda\x67\x67\xd8\x42\xe6\x1c\xe0\x91\x7a\x8a\x73\x00\xbd\x41\xe2\x6b\x5a\x96\x44\xe7\x22\xf8\xd7\x9d\x9b\x4a\xde\x7c\x83\x32\x55\xb0\xa7\x20\x7e\xc3\x3b\x5d\x1c\x6f\x2d\x52\x40\xca\xcf\x63\xdc\x9c\xbe\x54\x62\x40\x80\xbd\xef\x8f\x8c\x0f\x2c\x9d\x16\x2f\x56\xc9\x61\x22\xc9\x3e\x55\x9a\x11\x3a\x4f\x2a\x7f\x19\x09\x7f\xb4\x11\x50\xc1\xa0\x40\x57\x58\x25\x68\x65\x45\x7e\x65\xc0\x5e\x06\xe4\xfb\x90\x76\x31\xf3\x6a\x6b\xe0\x6d\x2b\xbc\xc4\x42\x37\x9f\x72\xa9\xc1\x89\x6b\xa6\x7e\x1d\x4d\xaa\x35\xc0\xd1\xe2\x84\x71\xa9\xea\x62\x2b\x1c\x4a\xe9\x97\x0a\x16\xb1\x1f\xed\x6a\xb5\x0b\xdd\xba\x44\x54\x7e\x9f\x59\x56\x0c\x5a\xfe\xd0\x44\x50\xdd\x4e\xeb\x87\xa4\x8c\x1f\x1b\x38\x10\x6f\x89\x38\xdf\x20\xae\x6d\x22\x91\x69\x11\x6c\x72\x17\xb0\xaa\x81\x3d\x25\x9e\xf1\x2d\xfb\x01\x1d\x2f\x9e\x63\x08\x9b\x08\xc9\x9a\xed\xae\x42\xce\x12\xb8\xb1\x90\x81\x8a\x6a\x71\xc5\x6e\x75\x01\x2c\x98\x0e\x62\x68\x0a\xdd\xcd\x89\x16\x32\xb0\x1e\xea\x8a\x03\x6b\x90\x9d\x2d\x37\xce\xf7\x73\x17\xad\x8d\x18\x32\x37\x3b\x6c\x05\xc9\x49\x16\x74\x51\x03\x98\x46\xba\x60\x23\xd2\xd6\x02\x4d\x12\xa7\x4a\xd2\x1c\xbe\xa3\x57\xd6\x3c\x66\x6b\x7d\x13\xd7\x35\x27\xb6\x7d\xda\x00\xd9\x2e\x54\x84\xcd\x8b\x6e\x00\x55\x9b\x00\xc5\x4b\x3f\x7a\x61\x50\x47\x2f\x08\x87\xb2\x8b\x72\xec\x15\x1d\xdb\x92\xe4\xd0\x91\x0f\x52\x11\xa6\x7b\xad\xcc\xc8\xb6\x49\x5c\x24\xc8\xb6\x93\xa8\xf0\x30\x4f\x21\xe7\x25\xfd\x6e\xb1\xa7\x99\x75\x0f\x50\xf7\xe6\x5b\xc1\xd6\x23\xb8\x95\x1b\x13\x17\xce\xa6\xd8\xaa\xdb\x53\xb6\x2b\xe8\xec\x22\x21\x54\xe8\x73\xbb\x1c\xb8\x35\x2d\x47\x8b\x2c\x96\xa8\x3d\x9e\x25\xad\xb2\xc2\x27\x4a\x7a\xd0\x71\xa2\x8a\xf5\x3a\x5d\x35\xc3\x6d\x66\x97\x79\x3f\x48\x1b\x74\x2a\x81\xf7\xf0\xe6\x83\xb7\xa5\x19\xeb\x6d\x9c\x61\xfd\x07\xb2\xe5\x81\xe0\x6f\xf3\x4d\xfe\x65\xf2\x2c\x67\x0d\x49\x88\x82\x5b\x2d\x39\x6b\x78\xc3\x78\x49\xdc\x00\x24\xc1\x1d\xab\x17\x4b\x59\x69\x05\x0f\x21\x8e\x52\xfb\x14\x01\xe0\xd6\x74\xc9\x0a\xd4\xc7\x13\xb1\x2a\x9e\xb5\xf5\xae\xc4\x54\xf2\x8a\x49\xeb\x6b\xb1\xff\x5b\xec\x8a\xcf\xb2\xec\xd0\x95\x03\xd5\x10\xbb\xcd\x61\xa2\x9d\xc6\x83\x70\x84\x30\x52\xe5\xd3\xef\xe0\x8d\x36\x29\xc8\x0e\x2a\x9f\x18\x6b\xdb\x9a\x44\xeb\x0d\xa8\xe6\xa3\x5a\x3d\x14\x5e\xb0\x71\x45\x51\x53\x6c\x2a\x1d\x90\xd0\x18\xf8\x74\x69\x77\x59\x5e\x4b\x7a\x6f\x08\xba\x72\x15\x47\x95\xde\x8b\xc5\x8a\x47\x01\x09\xcf\x42\x26\x21\x11\x9c\x4a\xad\xa7\x8a\x00\x6d\x93\x63\xd1\x92\xbe\x02\x40\x20\xaf\xd3\x92\xa2\x6e\xc8\xd7\x46\x20\x4a\x39\x3f\xf0\x1e\x3e\x27\xa5\x79\x60\x91\x91\x48\x88\x06\x9b\xbf\x04\x34\xad\x19\x0a\x58\x78\x7c\x39\x1b\x27\x87\x5f\x52\x29\xc9\x28\x40\xc1\x8c\x83\x2f\x81\xeb\xd1\x12\x60\x88\x37\xf1\x06\xf4\xce\xd1\x65\xb1\xcb\x99\xb0\xdb\xab\xf7\xb2\xe4\x68\x5d\x91\x7e\xb4\xac\x24\xc5\x38\x9b\xaf\x8d\xf1\x13\xc1\x76\x9b\x0d\x97\xb1\xf3\xcd\x0e\xac\x1a\x0e\x9e\xbb\x71\xf5\x0f\x11\x8a\xe3\xfe\xe1\xa5\x07\xe1\xab\xe9\x3c\x5a\x9c\xdc\x8e\x4f\xce\xc3\xb3\x3f\xa8\x02\xe0\x69\xfc\xff\xeb\x6f\x4f\x5f\xb7\xf4\xbf\x2e\xce\xff\xd2\xff\xfa\x53\xfe\x98\xd9\x6f\x14\x2f\x1e\x1d\xaf\xfa\xea\xfc\xf4\xec\x0d\x85\xcd\x00\xb6\x3a\x8b\xe6\xd1\xec\x43\x74\xa5\x3e\x44\xb3\xf9\x68\x3a\x51\xe7\xe1\x99\xef\x22\x23\xd0\x78\x2e\xb1\xae\xd3\x6b\x8c\xb4\xcd\xa2\xdb\xd9\xf4\xea\x6e\x88\x91\x2b\x1b\x9b\x81\x7f\xdd\x4c\xaf\x46\xd7\xa3\x21\x45\xb5\x06\x93\x2b\x35\x8b\xe4\x27\xcc\x43\x86\xd1\x6c\x31\x00\x9c\xec\x87\x68\x16\x5d\xa9\xf9\xf4\x7a\xf1\x71\x30\x8b\xba\x00\xce\xcc\x75\x3d\xfe\xa4\x66\xd1\x38\x1a\xcc\x23\x8b\x7a\x05\x28\xf3\x7c\x7a\x37\x1b\x46\x2a\x1a\x47\x43\x8c\x48\x45\xc3\xf7\x93\xe9\x78\xfa\xee\x93\xba\x9e\xde\x4d\xae\x10\x83\x7b\x7c\x3d\x9d\xdd\x44\xb3\xf1\x27\xd5\x83\x6f\xce\xaf\x3e\x88\x5f\xf7\xfa\xe1\xd1\x60\xf2\x69\x3a\x89\xd4\xc7\xf7\x53\xd3\xc7\xb9\xeb\xa4\xf9\xbb\x0b\x3f\xcd\xb9\x87\xe6\x6f\xd3\x99\xec\x1c\x8d\x55\xb3\x53\x36\xe6\x76\x3b\x98\x2d\x38\x60\x16\xa8\xd1\x1c\xbb\x31\x58\xa8\x01\x0d\x24\x02\x7c\x47\x93\x77\x6a\x34\x51\xd7\x77\x14\x4d\x41\x6c\xaf\x83\x19\x8f\x26\x38\x4f\x80\x0b\xbe\x89\x26\x8b\x83\x80\x61\x07\x31\x26\x18\xf4\x2c\x82\x0f\xdc\x46\xb3\x9b\xd1\x62\x11\x5d\x99\x0f\xdd\xcd\xa3\xce\x66\x5b\xc6\x66\xf2\x0c\x40\x17\x4a\x6f\x63\xc0\xdd\x63\x32\x0c\xef\x8c\x9b\xe2\x9f\x69\x96\xc5\x4d\x51\xce\xe3\xde\xcd\xed\xb8\xd7\x77\x95\xb3\xe7\xe1\x29\x09\x80\xe6\x79\x51\x7b\x26\x12\xfb\x60\x2b\x5d\x89\xeb\x48\xbc\xdd\x9c\x9e\x37\xb7\x63\xf3\x8c\x40\x6d\xd1\x8f\x63\x61\x50\x58\xf1\xae\x2c\x59\x3d\xea\xa5\xaa\xd2\x5a\x1b\x63\xf2\xf1\xf1\x31\x34\xbf\x77\xbf\x86\x1a\x65\xd4\x9a\x3a\xb1\x0c\x08\x0b\x8f\xff\xca\xa5\xc2\x97\xfa\x3e\xcd\xd1\x5b\xf9\xa1\x8d\x93\xa6\x0b\xf7\x2c\x3c\x53\xbd\xa1\x73\xa7\x19\x2e\x0b\x56\x81\x8f\x50\xf4\x18\xf7\x30\x43\x02\xa8\xa4\x2a\x70\xfe\xb8\x76\xc8\x4c\x90\x38\x83\x51\xc2\xec\xc4\x63\xee\xaa\x37\xb9\x20\x3b\xb4\xad\x38\xf7\x5a\xe1\xd0\xaa\x0e\xbc\x2b\x68\x59\xb9\xa7\xf6\x1b\x0c\x86\x00\x7f\xb3\x52\xc7\x29\x18\xa0\x7d\x81\xba\x96\x0f\x47\xc7\x31\xae\x25\x8d\xbd\xf8\xfd\x37\x95\xf7\x60\xd7\xc6\x0b\xd1\x46\xd1\xb8\x66\xa7\x10\x73\xd4\xfd\x6c\xf7\xb0\xd7\xae\x6c\x98\xbf\xc8\x0f\x94\x99\xaa\x6b\xd0\x28\x2b\x04\xe0\x18\x26\x30\xce\xbc\x1e\x19\xa7\x3a\xae\xeb\x78\xf5\x40\x28\x36\x07\xf8\x8a\xbe\xa2\xe8\xca\x20\x68\x65\xc6\x48\xe6\x0a\x2c\xb2\xe6\x3b\xd1\x1e\xbe\xf1\xa1\x78\x07\x3f\x6b\x81\x65\x71\xa5\x85\x3f\xb7\x2d\x4a\xce\xfc\x00\xf9\x8a\xeb\xfd\x1b\xd5\x1b\xe5\x50\x6f\x53\x83\xf7\xfb\xd1\x58\x53\x73\x28\xeb\x34\xf6\x30\x6d\x43\x06\xee\x33\xe6\x82\xbd\x25\xf2\xb7\x7f\xc9\x48\x30\x8c\x3f\x91\x63\x72\xc9\x8b\xb5\x39\x13\x3f\xaa\xa2\x74\xef\x5c\x86\xce\xc7\x6f\x4d\xb6\x39\x5a\x1a\x6a\x28\x1d\xa1\x0b\x3e\x46\xce\xc2\xaf\xe0\xa9\xc4\x65\x96\x3a\x8f\xc4\x3a\x12\x4b\xf4\x18\x55\x9c\x55\x45\xd7\x63\xe2\xf6\x18\xb9\x31\x7d\xeb\x23\xef\x8b\x72\x63\x41\xfe\x0c\x4a\x63\xdc\x3b\x20\x13\x1c\xb9\x50\x73\x42\xdd\x33\xbf\x55\xbd\x31\x02\x14\x3a\x8a\x06\x28\x4b\x6a\xb6\xa5\xee\xd8\x06\x02\xac\xc7\x99\xc6\x00\x53\xa6\x95\x39\x89\xe3\x9a\x78\x01\x8e\x41\x5e\x02\x40\x8f\xb2\xa0\xfb\xf0\x59\xf1\x9d\x13\xee\xb4\xe7\x03\x00\x33\x10\x96\xed\x3e\xf8\x3d\x7f\xd0\x8c\x08\x7f\xf6\x21\xfe\xc2\x6e\xbc\x75\xf0\x21\xe8\x14\x58\x37\x2d\xfe\x2a\xdd\x34\x42\x0d\x0a\xb2\x52\xce\xf5\xa7\x0e\xdc\xc2\x6b\xf1\x1e\x4b\xcd\x4b\x55\xed\x96\x14\x94\x80\x52\x13\xa9\x37\xe0\xa5\xd6\xb1\x4a\xba\x4d\x3a\xe9\x7a\x71\x76\xca\x54\x84\xb4\x11\xe5\xb4\x32\xed\x42\x53\x1a\x13\xb7\x0a\x4c\x3c\x70\x2f\xb4\x27\x59\x16\x66\x57\x9c\x1a\xb2\x2e\x88\xaa\x8b\x40\x25\x3a\xd3\xd6\xbb\x08\x08\x63\xe7\x71\x54\x12\xe2\xbf\xe6\x9a\xe5\x67\x37\x12\x48\xce\xe8\xc7\x67\x5a\x45\x19\x6c\xec\xe2\xe1\x85\x70\x76\xa6\x7a\x04\x9b\x1b\x42\x16\xab\x87\x9b\x44\x1e\x08\x6e\xa8\xa4\xb8\xd6\x71\xd5\x7f\x3a\xf0\x14\xa8\x8d\xae\x1f\x8a\x24\x60\xca\xbc\x80\xb9\x1f\xcd\xca\xdd\x55\x36\x6d\x46\xde\xd8\x56\xa2\xf7\x60\x03\x2e\x29\x78\x2a\x1b\x03\x9d\x43\x72\x00\x70\xa0\x31\x14\x9e\xe0\xc6\xf7\x94\x8f\xda\x47\xc3\x9e\xd6\xe6\x67\x00\xd4\x03\x9b\x21\xca\x8d\xc1\x5f\x00\x22\x02\x39\x35\x29\x3a\x06\x42\x85\x80\xb2\x63\x80\x1d\xaa\x07\x21\xaa\xae\x58\xb3\x8e\x0c\x52\x41\x78\x97\x69\xe3\x87\xee\x4e\x16\xc3\x7f\xae\x7a\xad\xf3\x88\x17\x27\xa8\x4f\xad\x7f\x80\x46\x3f\x45\x4d\xf2\xc1\x19\x58\x81\xfd\xf0\x58\x57\x95\x2e\x5f\xf0\x9d\x33\xf7\x9d\x81\x19\x81\xe2\xd9\xef\x00\x6d\x0c\xf3\xcf\x9b\x63\x89\xcf\x66\x0a\x09\x79\x29\x17\xd7\xd5\x0b\xaf\x8c\xc7\x3b\x5d\x71\xff\x35\x4e\x57\x4f\x4d\xb2\x53\x33\x52\x3c\xfc\x35\x15\x87\x98\x93\xd0\xfc\xad\xec\xf5\x7f\x1b\xf1\xf1\xbf\x96\xcf\xf8\xd3\xaf\xe1\x33\x16\x07\xd7\x71\xfc\xaf\x63\x36\x16\xad\x58\x36\x18\x8e\x81\xca\x18\xee\xcb\x4e\xae\xe3\x43\x1c\xc7\x48\x03\xfc\x32\x72\xe3\xf3\x46\x99\x0a\x66\xa6\x86\x36\x33\x45\xad\x33\xde\x2e\xfe\x9e\x7e\x10\xc5\x8d\x83\xe6\x60\x75\xca\xc9\xb3\xe5\x29\xbc\xfa\xfd\x9b\x04\x67\xbb\x53\x1f\x91\x57\xde\xb1\xb0\x28\x5c\xa6\xd0\xa6\x0f\xfb\xcf\x1e\x8e\x05\x62\x81\xad\x9e\x73\xd0\x80\x8d\x3b\x95\x65\x12\xe2\x0d\x58\xc5\xd7\x67\x33\xf6\x41\xc4\xfa\xeb\x36\x2b\xd2\xba\x7d\xc6\x59\x15\x2d\x94\xdd\xda\xe5\x36\x42\xb6\x8c\xab\x94\x70\xe9\xbe\x09\x1c\xa8\xa6\x70\xb4\xb0\x8e\xa4\x5e\x30\x5e\x76\x38\x68\xde\x0d\x65\x67\xbd\xd1\xf3\x5f\x22\x21\xf9\x0c\x58\xfa\x37\x9c\xe9\xe7\xe1\xb9\x8a\x20\xb8\x6e\x16\xc2\x55\x5c\x6b\xfa\x85\x80\x58\x57\x5d\x18\x6b\xb3\x22\x9b\x11\x51\xbc\xbb\x5d\x03\x98\x8a\x46\xdb\x17\xac\xc1\x14\x96\x83\x41\xa0\x8e\x9a\xa5\x47\x3c\x2f\x0f\xec\xc4\xb2\x92\x68\xbf\xaa\x31\x98\x5e\x5f\x2e\x04\x54\x04\xa0\x92\xc8\x03\x34\x5f\x15\xdb\xe7\xfa\xe5\x71\x52\x9e\x43\x84\x18\x76\x77\x9e\xed\x9b\x70\x86\xae\x03\x77\x52\xc8\x58\x2e\xd7\xb2\x09\xa8\x00\x17\x14\x91\x6a\xdb\x21\x2e\x59\xc9\x39\xd9\x61\x5d\x1d\x78\xb7\x9f\x65\x16\x53\x64\x8e\x34\x4a\x38\xe7\x4f\x49\x9a\x36\x3d\x66\xff\x28\xe0\x5c\xde\xca\x52\x30\xc5\x2d\x17\x0c\x91\xf0\xd4\xaf\x67\x8d\x42\xc0\x39\x7a\xb8\x00\x38\xdc\x4d\x43\x2c\x35\x76\x69\xcb\x81\xf9\x98\x49\x4b\x2c\xc1\xd8\x7f\x53\x35\x6b\xc6\xda\x43\xe5\x58\xeb\x3b\x62\x09\xed\xad\xd2\xa5\xf0\x22\xca\x1d\x78\xff\x1f\xd8\x4e\x7d\xbf\x87\xab\xee\x93\xc0\x9a\x7f\x66\xbc\x5b\x53\xcb\x92\x1f\xcb\x8a\x53\x6d\xad\x56\x86\x76\x11\x77\x71\x8b\xa2\x19\x29\x0a\x35\xe9\x89\x52\x1f\xb7\xa1\x09\x0c\xda\x0b\xf7\x85\xd5\x78\x93\x5d\x13\xbd\xa7\x92\x76\x2f\x7d\x25\x51\xa0\xc2\xed\xf6\x38\x8d\x64\x4d\x46\xf8\xba\xef\x36\xea\x6b\x35\xb7\xde\x92\xf5\xfd\xe9\xb7\x93\xc2\x37\xe7\x21\x83\x2d\x36\x17\xeb\x01\xfb\xe2\x73\x58\x6d\x87\x6c\x6e\x6d\xd1\xe6\x03\xfb\x28\x16\x4e\x9b\x5f\xba\x26\xa1\x0d\x95\xd6\x8e\xad\xf6\x34\x3c\xef\x63\x0a\xf3\x25\xbe\x3a\x04\xa6\x1c\xa9\x60\xc7\x97\xdc\xf8\x5c\x88\xf1\x79\xd3\x40\xbe\x1e\xba\xf5\x05\xeb\xb5\x08\x58\xb8\xdf\x2f\x75\x96\xea\x2f\xba\xea\x58\xf0\xb0\xe4\xe0\x90\xe2\x82\x15\x8a\xdf\x1d\x57\x7d\xbc\x38\x60\x5f\x57\xbb\xb5\xb1\x63\xcc\x00\x39\xb9\x33\x5c\x69\xc2\xa7\x25\xf2\x37\xff\x0d\xcf\x39\xba\xe7\xe1\x5b\x5b\xb2\xdc\xb5\xb0\x29\x2c\x20\x0b\x94\xc1\x5d\x93\x4b\xdc\xb2\xb8\xb5\x92\xc8\x0e\x93\x93\x14\xab\xba\xc4\x9a\xb1\xf5\xc1\x7a\x65\x47\x87\xf2\x8f\x5d\xfa\x25\xce\xcc\x98\xba\x86\x7e\xdb\x36\xc9\x2c\x36\xeb\xc2\xf8\x24\x17\xe1\xb9\xf9\xcf\x05\xde\xd1\x17\xe1\x6b\x18\xdf\x66\xe1\xd6\xb3\x57\x2a\x97\x2e\xcf\x18\x27\x42\x38\x4c\x7a\xe7\x45\x78\xa6\xae\x1a\xd4\x87\xe4\xa4\x18\xff\x84\x3e\x35\x90\xe4\xc9\xf4\xa9\xae\xd3\xa6\x2b\xaa\x27\x15\x6f\xfc\x58\x60\x53\xa1\x15\xad\x18\x8c\x52\x22\x33\x7d\x6e\xed\x31\xa8\x02\x58\x76\xc6\xc5\xfc\xab\x4b\x94\x8a\x74\xca\xb5\x36\x0b\x9c\xae\x85\xd7\xd5\xee\x52\xd5\x42\x50\x3c\x91\xf9\x27\x72\x8f\x3d\xd0\x16\x91\x58\x60\xec\xd7\xeb\xb6\x9b\xe9\x48\xf9\xf8\xc8\x69\x0c\x12\xcb\xd6\x36\x2b\x71\x2b\x9f\x22\xd3\x2f\xb3\xc5\xb0\x58\xa3\xc0\x21\xae\x6b\xbd\xd9\xa2\x5d\xd5\x59\xe2\x21\xab\x38\xfc\x03\xff\x50\x74\xef\x22\x3c\x6f\x2d\x9f\x46\x00\x91\x3e\xd9\x16\x73\xec\x5a\x40\xcd\xd0\x72\xfd\xa0\x73\xdf\x72\x20\x5b\xad\xf1\x55\x18\x4a\x88\x78\x2e\x75\x33\x94\xda\xb9\x2e\xe3\xca\x0f\xe7\xba\x43\xf3\xac\x55\x72\xd4\x5c\x47\x1d\xc5\x42\xe6\x13\x4f\x4f\x7f\x67\xd4\xdb\x2c\x2a\x81\x77\x46\x7f\x1d\xbe\x56\xa7\x1b\x0d\x25\x86\x79\x0e\x1a\x44\xc6\x40\x42\x0c\x84\x31\xbb\x9c\x1b\x89\x96\x08\xb1\xd3\x7b\x65\x5f\x85\x3f\xa5\x6d\xcf\xa2\xa3\x6c\xab\x55\x5a\x64\xda\xf8\x6c\x85\x16\x46\x2a\xad\x0d\x58\xb7\x70\x85\xf0\xbd\x66\x99\xb9\x4c\x33\x71\xd8\xaa\xf9\x6a\x47\x72\xee\x96\x2e\x1e\xd8\xc6\x7e\x84\x35\xfc\xcb\xd6\xed\x21\xaa\x0b\x58\xca\x17\xad\xa5\xec\xf9\x66\xf4\x39\x1e\x36\x2e\xa7\xf7\xd9\x7c\xbd\x6f\x34\xa9\x62\x85\x45\xd1\x55\x74\x0f\xeb\xb7\x69\x04\xb5\x19\x1d\xc5\x7d\xc6\xe3\xd6\x0a\x6f\x9a\xed\x06\xa1\x3f\xd1\x18\x22\x86\xf5\xac\xd6\xee\x80\x3b\xc5\xe6\xe5\xd1\x07\xa1\x38\x92\x62\x6a\xe7\x58\x02\x8b\xd3\xee\x3a\x42\xcd\x04\xbe\x24\x53\x13\x3c\x29\x03\xe4\xec\xb5\xac\xbd\x66\x0f\x7a\x35\x62\xd1\xe2\x0e\x6c\xbe\x15\xa2\xb8\x55\xe1\xd6\xa4\x5d\x4c\x36\x7c\x2a\xc6\x70\x13\xef\x03\x0a\xdd\xa7\xa5\x2a\xb6\x18\x86\x62\xa8\xd7\xcb\x4c\x44\xaf\x51\xe4\x68\xb7\x14\xf0\x0e\xb5\xd5\xad\xd6\xd7\x24\x58\x5e\x35\xd6\x25\x96\x95\x42\x11\xb1\xb7\x49\x8c\x5d\x6a\xc5\x78\x85\x72\xa6\xbd\x4e\x44\x0d\x86\xb3\x74\xe8\x97\x16\xb7\x6d\xff\x2d\xeb\x88\x5d\x51\x1d\x46\xf6\x3c\x56\x16\xa1\x72\xdc\xe7\xa0\x3c\x21\x88\x0e\x6d\xd2\x03\xd7\x71\xc0\xaa\xda\x76\xc7\x00\xa2\x09\x7a\xd8\xd5\x21\x5f\x92\x4e\x82\x84\xcd\x7e\x4a\xf6\xea\x73\x5e\x3c\xe6\x6a\x1d\x63\x2c\x2a\xcd\xe3\xd5\x6a\x57\xc6\xab\xd4\x45\x6d\x2f\xc2\x37\x6a\xe0\x6b\x4a\x0a\xfe\xdf\x85\x99\x45\x77\xa6\x5e\x84\x6f\xc2\x33\x77\x3e\x3c\x14\x05\x96\xab\x43\x18\x26\xe0\x82\x44\x3a\xc5\x63\xb5\xd6\x1a\x2b\x53\xdd\xd8\x91\x7c\x8b\x2d\xcf\x41\x4c\xa2\xc3\xee\x16\xcb\x2c\xbd\x77\x86\x81\xdc\x94\xfe\xfd\xd4\x3e\x10\x5a\xca\x57\x49\x61\x96\x3d\x44\x23\x0a\xc1\xc2\xb2\xd4\x0f\x71\xb6\x0e\x08\xdb\x57\xab\x82\x7f\xd4\xe1\xd0\x85\x0d\x3d\x65\x63\x48\x2f\xab\x22\xdb\x81\x5a\x2e\x0a\x5e\xf8\x28\xf0\xa7\xba\x1a\x1c\xea\x2b\x50\x63\xc1\x5d\xe2\xf8\x18\xb2\x22\x17\xb5\xc1\x14\xaa\xb4\x55\x4e\xae\xba\x09\x6b\x7c\xbd\xf0\x8f\x15\x8e\x75\x88\x68\x92\x6f\xec\x8a\x28\x36\x9c\xc2\x97\xcf\x15\x6e\x71\x2c\x37\x59\xcb\x6a\x57\x5b\xc3\xec\x16\xd2\x81\xcd\xd4\xd2\x34\xf6\x25\xc3\x11\x20\xb8\xe2\x38\x99\xa7\xe6\xe9\xaf\xca\x73\xfb\x72\x44\xe0\x8a\x57\x0b\x87\xc2\x32\xb5\x35\xa2\x53\x4d\x8a\xa7\x43\x52\x8f\xc9\x4e\x63\xc5\x40\x5c\x83\xcd\xfe\xf7\x5d\x42\xf1\xea\x12\x84\x14\x5d\x1d\xa7\x3c\x6b\x3a\x00\xdb\x00\xa4\x87\xce\xaf\x75\x42\xdc\xc8\xc5\x6a\x87\xb7\xa0\x78\x4c\x3f\x50\x56\xa9\xb5\xd2\xab\x5d\xc9\xab\x08\xe1\x2d\xa8\xa5\xa7\xab\x3a\x24\xaa\x8f\xd5\xc3\x81\x9e\xb3\x77\x01\x4b\xd6\x5c\x2f\xd2\x34\x14\xa1\x08\x81\xa8\xb4\xc7\x09\x1e\xea\x22\x28\x41\x62\xbc\xe6\x58\xf2\x72\x9c\xdd\x05\xd4\x10\xc5\xb3\xc5\xac\x31\x54\x1f\x48\x55\xf3\xd6\x25\xd2\xa0\x26\x23\xe8\x3c\xa1\x3f\x93\xe2\x31\xaf\xea\x52\xc7\x6d\xc7\x87\xca\x96\xba\x1f\x6a\xa1\x9f\x44\x24\x32\xca\xed\x32\x2e\xd4\x10\x4d\x92\x2b\x9c\xde\x39\x4e\xaf\x79\xe9\xcc\xce\xc4\x11\x5a\xf8\x28\x4a\x00\x15\xe6\xae\x22\x81\xee\x6f\xaf\xc6\xd7\x65\x9d\x0f\x8d\x8a\x1f\x07\xae\x8a\x0d\x5d\x67\xd9\xe1\x81\x79\x66\xf9\x81\xb7\xc3\x0d\x26\x7a\x72\x3e\xbf\x7e\x80\x84\x51\xd3\xf6\xea\x6e\xdb\xd3\x19\x7e\x52\x7d\x5b\xf6\xed\x22\x22\x4b\xd7\xed\x62\xb6\x95\x28\xf8\xa9\xf7\x04\x46\x0f\xd5\x7c\x67\xd9\x22\x91\x07\x9c\x17\x66\x93\xaa\x90\xaf\xb8\xa7\x56\x61\x44\x97\xa5\xb7\x5b\x7d\x79\xf6\xca\xcd\xa5\x1c\x9a\xea\x50\x33\x5c\xe8\x06\x36\x49\x1d\xa7\x19\x65\x27\x63\xdf\x6e\x2a\xca\x04\x49\x19\xab\xcf\x50\x9f\x07\x7e\x19\xd7\x39\x38\x90\xb4\x4a\x6b\xa6\x63\x11\xb5\x80\x74\x76\x99\xcb\xf4\xda\xe9\xa2\xe3\x2a\x14\x31\xf7\x67\x63\xe8\x4f\xd7\x06\x92\xd0\xd1\x3a\x4e\xb3\x03\xcb\x93\xf5\x98\x2b\x9f\x60\x1f\x6a\xdc\x30\x0d\xc1\xd5\x76\x35\x2d\xa7\x8e\xc3\xb3\xa3\x59\x88\x93\x38\x80\xee\x82\x28\x4f\xa9\xd3\x9c\xaa\x89\xcc\xba\xb4\xc7\x8e\x69\x78\xc0\xd8\x7a\x54\xd0\xae\xd3\xac\x7d\x69\xe9\xaf\xc6\x64\x49\x6b\xd2\x75\x5f\xa7\x68\x35\xdb\xa1\x20\x76\x6b\x8c\x7b\x06\x76\xc5\x62\x12\xab\xc8\xef\x41\xfb\x9f\x32\x58\x69\x47\xb2\xc9\x0c\x1a\x58\x20\x66\x1d\xae\x6d\x51\x25\xae\xcc\xfc\x44\x14\x21\x9a\x45\x66\x46\xaa\xe5\xe5\x22\xe3\x4a\x5d\xa8\xb7\xa7\x27\x49\xbc\xaf\x5c\xf9\x3e\x46\xdf\x60\x7c\x97\xf1\xea\x33\x12\x2e\xb9\x47\x86\xea\xa6\x28\x75\xc1\xb6\x0c\xf7\xe2\x97\x8d\x6a\x47\x4f\x3b\x3b\x0a\xfd\x4b\x75\xf5\x2b\x7a\x48\xde\x0c\x29\x79\x60\xd2\x09\xd0\x3e\xb6\x8b\xb6\x90\xd4\x29\x4f\x36\x9e\xed\x34\x4d\xda\xf5\x8b\xa2\x99\xce\x10\x6a\xae\x4b\x37\xcc\x17\xcd\x61\x6e\xb1\x24\x60\x2b\x42\xbb\xfb\xce\x39\xd7\x30\x92\xe5\x99\x98\x78\xf0\x83\x3a\x08\x5c\xaa\xcd\x29\x57\xb3\xcd\x26\x0b\x38\x09\x14\x60\xee\xa8\xaa\xd2\x25\x96\x7b\x74\x4a\xe7\x63\x1d\xa7\x20\xb4\x63\xe1\xb7\xa2\x34\x06\x4e\x72\x0f\x9f\xc2\x92\x1a\xc0\x8c\xee\xcc\x15\x7f\xc2\x40\x1a\xa8\xc1\x2c\x8b\xaa\xa2\x9f\xa8\xbe\x53\xea\xef\xc8\x32\x31\x9e\x03\x93\xff\xd9\x5e\xe2\x03\x40\x13\x1f\x5b\x26\xa1\x3f\x87\x37\x3a\x15\x70\x71\x19\x06\x01\xb5\xc4\xeb\xaa\x83\xee\x7a\xe3\xf4\x3e\x0f\xcf\x0e\x54\xe0\xd8\x0d\xec\x66\xe9\x42\x3a\x24\x43\xb7\x74\xa4\x6f\xd2\x55\x34\xba\x2e\x4a\x8d\xab\xbf\x99\xaa\x7c\x13\x40\x43\x5b\xc0\x0b\xfa\xbd\x3b\x03\xb1\xec\x47\x44\xce\xd4\xf1\x13\xa1\xe4\x7e\x20\x3e\x7a\xde\xfe\x68\x23\xf6\xe3\x7d\xfc\xa2\xfd\x71\x2f\xd0\xd2\x87\xdb\x5d\xdc\x7e\xea\x98\x9c\xe3\x3e\x4d\x18\x6c\x0c\x74\x6d\x79\x6b\x1c\x0a\x01\x9a\x7b\xc7\xc5\x13\xe9\xe6\x85\x6c\x27\x62\x7d\x20\xee\x76\x71\xaa\xc4\x76\xe2\x9d\xe4\xea\xcb\xdd\x96\x86\xcd\x8a\xe2\x2d\x54\x07\x16\xfb\x7b\x57\xd4\x04\xb6\x16\xc6\x93\x51\x4c\x15\x0b\x03\xa0\xa5\x37\x9d\x9b\x2d\x06\x76\xb0\xb9\x05\xec\x73\x4c\xff\x77\xa6\xcd\xb9\xae\x1f\x99\x20\x06\x18\xdd\xd2\x22\xc1\x96\x2b\x62\x81\x80\xf0\xa2\xf1\xa8\x8e\x2f\xfa\x6a\xaf\xe3\xb2\x72\xcb\xee\xb5\xb7\x91\x66\xc6\x9f\x76\x49\x85\xd1\xe1\xab\xf5\xb0\x59\x05\x81\xb4\x02\x39\x6c\x8c\x3f\x87\x23\xdb\x3a\xd0\x3a\x28\x83\xe5\xc4\xc5\x40\x6e\xb1\x16\x69\x9b\x40\xfc\xfe\x82\x56\x83\x6e\x67\xbd\xa8\x66\xd3\xdc\xf9\x54\xb4\x9e\x7a\x48\x46\x91\x36\xe6\x10\x23\x56\x54\xc1\x51\x9e\xe6\xcc\x1f\x9b\xe6\x90\xef\x31\x8e\x88\xb1\x7a\xb0\x16\x3e\xe7\x2a\xc0\x4a\xeb\xcf\xb8\xe7\xfe\xbe\xcb\x11\xc0\x50\xea\x2c\xd5\x88\x6f\xf7\xe4\x45\xd3\x2c\x5b\xef\x32\x49\x5b\x5b\x76\x1e\x99\x4f\xbb\x52\xf2\x91\xbb\xfc\xef\x66\x59\xeb\xbc\x4c\x57\x0f\x28\x29\x86\x14\x9d\x4d\xd8\x71\x16\x3f\xf6\xf1\x10\x00\x7a\x73\xca\x4a\xa5\xb9\x58\xc6\xc5\xda\x26\xea\x1c\x1e\xd1\x01\x49\x60\x50\x80\xeb\xf9\x85\xb5\xd8\x6e\x65\xbd\x51\x51\x9e\xa8\xbb\x4a\xbb\xa2\xfd\x81\xad\xa2\xe3\x05\x46\x54\xbf\x5f\x38\x4c\x27\xf8\x09\x84\xc1\x25\x4e\x34\xd3\x11\x6d\x0c\xa6\x4a\x14\x93\x8b\xea\x3c\x79\xe5\xf0\x49\x53\x94\xcc\x3f\x54\xe9\x2c\xd3\xa5\x39\x4c\x30\x3b\xe5\xba\x07\xe5\x95\xd9\x5e\xc2\x1e\xc8\x23\x83\x2b\xd6\x7b\x56\x87\x29\x68\xaf\x67\xd9\x03\x22\x97\x25\xfe\x85\xba\x41\x92\xf1\x36\x14\x1c\x45\xa6\xf3\xac\xd0\x6b\x7e\xd9\x15\x7e\xb5\x81\xe6\x8e\xf7\xa3\x1d\xd4\x8b\x8d\x9d\xd2\x93\x98\x25\xb3\x8c\x1e\x85\xf4\xaf\x59\xfd\x9f\x53\xb3\xb9\x28\x62\x49\x34\x88\x3a\x09\x18\x80\x82\x89\x00\xf0\x28\x8a\x72\x2f\x52\x7f\x41\x27\x36\xd6\xd1\x70\x3d\x81\x8c\x4f\x8d\x5d\xa7\xe1\x1c\x4d\xb4\xf1\x91\xaa\x40\x6d\x74\xb9\x7a\x88\xf3\x1a\x37\xf7\x3a\xad\xf9\x08\x73\x96\x9f\x95\x7c\x2b\xc1\xa2\xa2\xfd\x02\x12\xab\x0b\x57\x01\x5a\xa6\x15\x70\x1c\x93\x87\xf4\x8f\x5d\x0c\x1e\xaf\x99\x72\xc2\x84\xc5\xa2\x42\xb9\xab\x6d\x0e\xaa\x38\x7f\x80\x1d\xd0\x85\x35\x86\x09\xd0\xd4\xfe\xf4\x8b\xd5\x63\x27\xf7\x16\x23\x72\xc7\x90\xe5\xf0\xc3\x6b\x7d\x63\x2e\xed\x36\xda\x4b\xf2\x20\xf8\x99\x43\x2e\x08\xbe\x80\x31\x2e\xf5\x36\x4e\x4b\xd2\xe1\x2f\x09\xcd\xc8\x7c\x83\x5d\x04\x68\x7b\xaf\x32\x36\xce\x95\x99\x4e\xac\x7f\xf7\x58\x49\x25\x22\x89\x58\x75\x3a\xbb\x99\x56\x4e\x8b\xb6\x73\xb1\x51\xf4\x56\xfc\xc6\xb5\x8b\x79\x8b\x0e\x68\x34\x9b\xdf\xde\xc1\xf7\xf2\xc2\x27\x41\x20\x37\x88\x7e\x25\x09\x03\x1c\x58\xb3\x2e\x4a\xef\x9c\xcc\xf5\x7d\x96\xde\xeb\x7c\xa5\xfb\x81\x85\x71\x06\x0d\x1c\x27\xee\xc2\xc6\x94\x30\xec\xb7\xc8\x35\x10\xc2\x48\x14\x59\xfb\xf2\x96\xea\x8f\x84\x99\x6a\xd1\x1e\x58\x56\x03\x42\xa5\x3a\x7c\x6a\x07\x53\x41\x70\x98\xaa\x80\x66\x65\xf5\x10\x9b\xce\x20\x99\xdc\x53\xdb\x4f\x5e\x0c\x99\x59\x5b\xa8\x60\x4e\xec\x4d\xe6\x71\xf7\x45\x91\x98\x5b\x28\xc0\x6c\x50\x55\x17\xdb\x6d\x7c\xaf\x03\x67\x42\xac\xc9\x3b\x07\x4c\x4d\xb6\x86\x1b\xad\xc8\x2d\x34\xda\x16\x2b\xc0\x24\x08\xd5\x20\xdb\xe6\xd2\x52\x45\xf9\x32\x78\x28\x79\x06\x13\xe0\x8e\x5a\x4c\xc4\xea\xc4\xd2\x0a\x40\xc4\xc5\xd6\xe9\x63\xd0\x82\x34\xb6\xb9\x74\x4f\x2e\x26\x11\x39\x75\x2c\x00\x1c\x78\x73\xbf\x34\x03\x92\xe8\xb8\x06\x2e\xe2\xad\x2e\x2b\xb0\xac\xcd\x85\x5d\xee\x9b\xbc\x53\xae\xb5\xdf\x54\x62\x55\x35\x62\x2e\x3e\x0f\x81\x0d\xc1\x10\xee\xd0\x35\x32\x54\x73\x63\xeb\xc8\x38\x6e\xc5\x26\x11\x6a\x4b\xd5\x8e\xdf\x9e\xa1\x7d\xb2\x87\x2f\xa0\xb4\xa0\x5c\x17\xf0\xd8\xf2\x73\xfc\x28\xb3\x83\x0b\xf0\xd8\x78\xbc\x59\xec\xe0\x31\x81\xb2\x70\xf9\x24\x05\x57\xdd\xac\x20\x5f\x6a\xb5\x2c\x8b\x1d\x18\x32\x20\xfa\xcd\xb9\xeb\x1d\x49\x49\xc6\x5e\xc7\xc9\x32\x01\x38\x23\x50\x96\x19\xdb\x6f\x13\xa7\x54\xd3\x61\x46\xaf\x83\x56\x62\xb9\xab\xd2\x9c\x63\x23\x34\xba\xb6\x79\x9d\xa4\x18\x8e\x10\x23\xae\xbd\x06\xb8\x5d\xe3\xd4\xa9\x09\x93\xb4\x2a\xf2\x75\x96\xae\xea\x93\x62\x7d\x42\x13\x4a\x51\xe1\xb6\x2c\x02\x9b\x20\xa4\x05\x5e\xa2\xc9\x12\xdb\x45\x23\xc2\xac\x68\x2b\x7a\xee\x2b\xcc\xa2\x74\x71\x99\x39\xeb\x1d\x74\x01\xec\x3f\xe9\xe8\x7d\x1f\x9e\x19\x1f\x90\xf7\xd9\xa8\xd6\x1b\x11\x30\xeb\x3c\xb1\x55\x4f\x6c\xcc\xb4\xd6\x9b\xa0\x07\x77\x22\x5c\xc9\xba\xdc\x28\x86\xdc\xa3\x93\xf4\xfa\x3b\x35\x0c\xaf\xc3\x59\x68\xbc\xd4\xd3\x33\x75\x3c\x5d\xd5\xa1\x3a\xfb\xfe\xfb\x37\x78\x94\x56\x24\xe8\x52\xac\xbd\x07\xdb\x23\xa3\xb2\x75\x8a\x66\x8a\x9e\xfc\x48\x43\x23\x03\x9a\x05\x73\x4a\x7c\x4b\xa5\x53\x24\x73\xad\x3a\x3b\x0f\xcf\xcf\xce\xd5\xf1\x5c\x6f\xb9\x5d\xa1\x39\xc0\x3d\x56\xcd\xd6\xc7\x4d\x5b\x44\xcf\xce\xbf\x0d\xbf\x3d\x3f\x3d\x3f\x39\x33\xfe\x8f\x59\xb3\xee\x47\xaf\xd5\xf1\xdf\x76\xb9\xe6\x1e\x9b\x49\xbd\x0b\xe7\xde\x84\xb0\xf9\x5a\xa9\x78\x05\xce\xd9\xa1\xb2\xb6\x1c\x28\x91\x8d\x9d\x42\xa6\x74\xa5\xc1\x96\xa9\x1f\x98\xf2\xc1\x4e\xeb\xb9\xb9\x7c\xe7\xf0\x98\xf4\x3e\x57\x23\xa0\x6d\xa8\x65\x34\x14\x5a\xc1\xe9\x92\x7b\xd7\x1a\xd8\x09\x75\x5c\xb3\x99\xb5\x43\xb3\xe8\x29\x1c\x0e\x65\xd3\x80\x60\x83\x32\xdd\x95\x7d\x75\x4a\xaf\x6e\x85\xe8\x89\x5e\x44\x32\x3f\x88\x74\xc9\x01\x73\xff\xfb\xf0\x42\x0d\x11\x62\x69\xae\xfb\xf8\x11\xda\xfb\x41\xe7\x3b\xed\x32\x58\xdf\x87\x17\xe1\x19\x3b\x95\x70\xb1\xca\x0e\xc2\xd1\x81\x19\x23\x7a\xed\x5d\x0e\xf1\xed\x79\x8d\x85\xc5\x6c\x8b\x0b\x46\xc0\x4e\x33\x59\xd0\xd6\xc7\x5e\xc2\xc9\x16\x7a\x38\xf2\x11\x7e\xa3\x6b\x47\x70\x80\x31\xa5\x83\x81\xc7\xde\x56\xf0\x8c\x40\x39\xd7\xe3\xe9\xd3\xc5\xa1\x2c\xe2\x04\x92\x1b\xf6\xe0\x4f\xd2\x6a\x0b\x36\xc8\xc1\x23\xb8\x53\x7d\x42\x8a\xa5\x78\x87\x2f\x13\x43\xb5\xf2\x70\x74\x5c\x03\xc3\x8f\x10\xc5\x80\x0f\x86\xfe\x8c\x9d\x7b\x33\x96\xab\xd8\x5c\x8d\xfb\xce\x39\xea\x58\xb7\x7f\xd0\xb4\x71\x33\x5e\x32\x5b\xdc\x28\x33\x09\xec\x0b\x3b\xb2\xdc\x3f\x79\x2a\x0e\x4f\xc0\xc7\x18\xd4\x7e\x6a\x73\x65\x5d\x85\xc3\xc6\x2c\x5c\x34\x70\x12\x6d\x07\x9c\x6f\x28\xb3\x15\x31\x40\x29\x83\x32\x07\x61\x72\x6f\xc2\x73\xb7\x89\x5f\xab\xf9\x6e\x5b\xea\x4d\xbc\xda\x4b\xd8\xad\x7d\x34\x92\x35\xa9\x2c\xd5\x3b\xa8\xe5\xc7\xeb\xd9\x18\x57\x3a\xc1\xc1\xe4\xd8\xca\x35\xf5\x73\x60\x8e\xce\x0a\x83\x2f\x33\x91\x9a\xba\x32\xc6\x40\xa5\x9f\xfd\x9c\x05\xdf\xae\xb2\x78\x67\x69\xe1\x89\xde\x08\x43\xc1\x49\x02\x0e\x6c\x25\x0f\x13\x87\x1e\x6b\x5f\x47\x07\xa0\x63\x67\xa7\x1d\x9c\x5c\x1e\xea\xd8\x83\x54\x53\x2c\x4b\xd7\x92\x81\x68\x55\xe4\x2b\x5d\xe6\x1c\x06\x6c\x10\xb2\x51\xe1\xfb\x8b\x28\xb1\x1e\x74\x46\x34\x78\x3e\x25\xd6\x0b\x08\xa6\xf0\x3e\x3a\x90\xdb\x67\x76\xa9\xb4\xf6\x78\xa4\xd0\x04\xc4\xc8\x97\xcc\x20\x62\x98\x84\x22\x0f\xc2\xc1\xcf\xe2\xfc\x7e\x17\xdf\x13\xbf\x81\xdd\xa1\xb6\x31\xe0\x91\x96\x3b\xed\xe8\x65\xc1\x02\x2c\x21\x18\x18\xf8\xb4\x47\x56\xc5\x8c\xbe\xd3\x58\xb9\x9c\x7f\x68\x51\x27\x9c\x9d\x85\x1c\xf9\x6f\x8a\xa2\x72\x39\xe5\x59\x78\xa6\x26\xfa\xd1\x7e\x4c\xdc\xb3\xa0\x26\x4b\x91\xd8\x88\x39\x0d\x17\x4c\x01\xbe\x97\x3c\x1c\xc7\xbd\xe9\x3c\x5a\xf4\xfa\x40\xf8\xb8\xd1\x65\xc6\x88\xa3\x18\x17\x82\x7c\xd4\x55\x7a\x9f\x1a\xbb\xfd\x43\x01\x67\x86\x7b\x4a\xdf\x6a\xc1\xd7\xfa\x31\x2e\x93\xb6\x5b\x1e\xb9\x92\x12\x8e\xf4\x88\x9d\x7a\x76\x16\x5e\x40\xf0\x1a\xc0\x42\xae\xba\x4e\xc2\x2f\xf9\xd1\x0f\x71\x83\xb4\x8e\x74\x87\x18\x51\x51\x3d\x40\xdd\xb5\x5f\xec\xea\x35\x25\x5e\x3d\xd8\xaa\x07\x3e\xe7\xee\x53\xe3\xdb\xc5\x60\x72\xa4\xf9\xfd\x8e\xd4\xc9\xf8\x63\xf9\x6e\xb3\x74\x6a\x86\x67\x67\xb6\x7c\x0c\x9e\xdf\x31\x0b\x07\xe4\x06\x5e\x82\xb6\xab\x85\xc8\x79\x43\x0e\x97\xd8\x64\x2d\xf8\x9c\x8b\x18\xb2\xbd\x90\x42\xef\x04\xa5\x1d\x28\xdd\x40\x71\x99\x66\x29\x88\x13\xea\x61\x7b\xc0\x9f\x03\x31\x0e\x17\x84\x04\xd7\x49\x73\x04\xe8\x62\x25\x04\xaa\x3d\xa0\xa0\x62\xc7\x33\x37\xba\x74\x14\x1e\xe9\xb2\xb4\x72\x50\x66\x4a\x25\x10\x17\x6f\x74\xdb\xbd\x0e\xbc\x2b\x20\xd6\x5b\x8a\xef\xed\xe3\x08\x9b\x59\x6a\x50\xf0\x90\x9d\xc5\xa8\xaa\x15\x3a\xb1\x1e\x96\x8d\xc5\x49\xcd\x8f\xe6\x2a\xe5\x2a\x22\x4c\x3f\x53\xf9\x18\x34\xda\xb6\x88\xbf\x82\x10\xe4\x8a\x4b\xe3\x04\xf5\xa7\x18\xe7\xd7\x02\xf6\x9b\xdf\xb7\xb3\x2c\x0b\x22\x94\x78\x09\x84\xb5\x31\x41\x16\x02\x28\xd6\x6a\x37\x5b\xc1\x0b\x9f\x7f\x30\x8c\xde\xbd\xaa\x03\x09\x5e\x3a\x40\x5f\xd2\x9c\x35\xc6\x7a\x30\x03\x4a\xa8\xa2\x9f\x41\x81\x56\x0d\x1a\xea\xcc\xd0\x7a\xfe\x1a\xe6\xdb\x50\xa8\xb8\xf5\xa1\xf4\x69\x49\xea\x0e\xca\xae\x40\x7d\x09\xcf\xc3\x33\x73\x86\xde\x8e\x7b\x7d\xbc\xfc\x3c\xad\x8e\xe9\xed\x18\x88\x53\x7c\xe9\x86\x44\xe4\xcc\xd7\x69\x46\xeb\x57\x20\xf2\xcd\x31\x18\xd7\x3f\xbc\x94\x18\xc9\x82\x9a\xcc\x6b\x2c\xac\x09\x42\x44\x55\x5a\x72\x20\x6f\x4b\x54\x78\x13\x4b\x99\xe3\x85\xa3\xb1\x21\x0e\x70\x24\x40\x80\xcd\x6f\x59\xee\xcc\x63\x1d\xde\x87\x74\x6b\x03\x06\x91\x59\xc9\x98\xf5\x22\x06\x3e\xdf\x2f\x66\x37\x63\xc4\xb0\x28\xf7\x7d\x4e\xe8\x08\x34\x8e\xa5\x8a\xc8\xd2\xcf\x9a\x82\x5d\x45\xf1\xd9\x6d\xf5\x98\x33\xff\xce\x54\x4c\x12\x09\x94\x43\x58\x6c\xed\x50\x47\xc5\xba\xa9\xa6\x58\x3d\xa4\x5b\xb7\x50\x2e\xd5\xc9\x8b\xb8\x79\x7a\xcf\xae\x9a\x97\x31\xfc\x50\x39\xc7\x3a\x15\x7e\xd6\xe1\x35\xf5\x87\x33\x10\xfe\xf5\xe7\x5f\xf9\x27\x7c\x35\x1c\x9e\x5c\x7e\x3a\x39\x0f\xdf\xfc\x41\xec\x8f\xcf\xf1\x3f\x5e\x9c\x7e\xfb\xed\x69\x93\xff\xf1\xf4\xe2\xed\x5f\xfc\x8f\x7f\xc6\x9f\x21\x14\x9d\x7e\xd1\x10\x08\x35\x56\xea\x40\x88\xa2\x9d\x87\x6f\xd4\x70\x16\xa1\x60\xc6\x70\x7a\x73\x33\x9d\x80\x6c\xc7\xed\x94\xa4\xca\x47\x73\x64\x10\x04\xf9\xf5\xeb\xd1\xec\x06\x08\x1c\xaf\xa6\x11\xfe\x9c\x44\x60\x48\xb0\x61\x1e\xcd\x3e\x8c\x86\xd1\x3c\x54\x4d\x7e\x47\x9f\x47\x92\xbf\x0d\x6f\x8e\xd4\x60\xa2\x06\x8b\xc5\x74\x36\x89\x3e\x9d\x0c\xc7\x23\x54\x98\x18\xc3\xfb\xe7\xef\x47\xb7\x61\xbb\x85\xf4\x5a\x52\x09\x19\x4d\xae\xa7\xb3\x1b\x92\x56\x9f\x98\xc7\xf5\x06\xf3\x93\xd1\xbc\xa7\x2e\x07\xf3\xd1\xbc\xe3\xfb\x37\x83\x9f\xa0\x09\x52\x63\x65\x16\xbd\x1b\xcc\x40\x8c\x65\xf1\x3e\xf2\x9e\xc9\x4a\x37\x48\x5e\xe9\xa4\x5f\xc6\x23\x92\x5f\x01\x89\x0a\x16\x99\x98\x45\xf3\xbb\x31\x70\x36\x5e\xcf\xa6\x37\x2c\x46\xf3\x3b\x6a\xf7\xb7\x06\xe3\xee\x72\x3c\x1a\x0a\x05\xff\xe1\xf0\x76\xdc\x53\xd3\x99\xfa\xdf\x5b\xcb\xff\x77\x51\xf2\xc7\x7f\xbc\x50\xcb\xff\xb7\x2b\xf9\x1f\xe4\x8c\x8c\x43\xd5\x1b\x5a\x25\xfd\x0e\x66\x38\x69\xfa\x20\x38\x09\xe4\xb5\xd2\xaa\xda\x81\x33\x53\x3f\xa0\xbf\x0d\x9c\xdd\xab\xfd\x2a\x2b\xb6\x3a\x49\x63\x80\xed\x34\x95\xd5\x73\x08\xac\x62\xd6\x1f\x19\xf0\x05\x51\x0b\x72\xbf\xc4\x59\x41\x00\x1a\x63\x0f\x81\x4b\xaa\x98\x0c\xd2\x15\x22\x33\xea\x90\xd2\xe6\x40\xd0\xc3\x3c\x74\x00\x67\xce\x13\xbd\xd5\x79\x82\x76\x57\xf9\x99\xeb\x10\x37\x95\xce\xbe\x40\xa0\x0b\xd2\xc2\x95\xde\x2c\x33\x96\x12\x8d\xad\x00\xf9\x17\xc8\x29\x43\x54\xc5\x23\xc7\x13\x49\x7a\xd5\x18\x33\x4f\x29\x54\xc8\x8a\xb6\x44\x7e\xd5\xb1\x34\x91\x74\x56\x3c\xf6\x2d\x1c\xb1\x85\xf4\x6b\x4b\x7b\xfc\xd1\xd2\xff\x72\xb6\x81\x84\x86\x03\x49\x9b\x5d\x05\xf3\x0e\x90\x05\x44\x3c\x05\x2a\x29\xe3\x4d\x5c\xa7\xff\xa4\xcf\xac\x31\x54\x1a\x67\xf6\x27\x9b\x02\x4e\xfb\x6d\xba\xaa\x77\xa5\x75\xf9\x03\x55\x01\x53\x76\xa9\x57\x80\x4f\xbf\x37\xf3\x51\x5b\xae\x20\xfc\x6a\xbc\x2c\x53\x84\x99\xc2\x44\x27\x3a\xaf\x62\x2f\xab\x8d\x5d\x80\x9a\xe0\xf6\x52\xa3\x4c\x67\xa9\x57\x71\x85\xba\x27\x79\x85\xe1\x35\xfc\x7e\x12\x6f\x6b\xf3\x77\x59\xc8\x16\xff\xfe\x93\xdd\x98\xd9\x76\xa0\xe6\x9a\x3e\x10\x7f\x29\xd2\x84\x51\x2e\x49\xb1\x5b\x5a\x4c\x58\x2d\xe4\xdc\x62\x3b\x0d\xc6\x18\x2f\x28\xdc\x6a\xfc\x87\xe6\x78\x42\xa0\x6a\x9f\xaf\x1e\xca\x22\xa7\xd9\x50\x0d\xb5\xbb\x3a\xdd\xe8\xe4\x04\xa3\xe3\xac\x11\x11\xab\x4d\x01\x44\x73\xe9\x26\xbe\xd7\xea\xb8\x07\xcf\x48\xf3\xfb\x5e\xdf\x86\x91\x7e\x53\x87\x1d\xdf\x3d\xb1\x39\x3a\x96\xda\x1a\x98\x17\x3b\x64\xf4\x61\x42\x0a\x0c\x20\xd4\xbe\x64\xca\xb3\x30\xb6\x24\x54\xbd\x29\xd3\x60\x20\x01\xfa\xb3\xef\x7b\x7c\xe0\xa0\x4c\x62\xdf\x27\x54\x36\x7b\x72\xdf\xd5\x52\xd0\x1e\xbc\x50\xe4\xe3\x5c\x13\x04\x87\xc8\xc1\xb0\x66\xee\x85\x6d\x5e\x87\x44\xe8\x76\x80\x36\xee\x17\xd0\xc5\x91\x58\x12\x79\xcd\xa5\xfe\x92\x16\xbb\x2a\xdb\x13\x7e\x90\xfa\xf7\xb2\xca\x9f\xda\xea\xf8\x14\xa5\x7d\xac\x8d\xc8\x11\x0a\x0d\x71\x36\x55\x65\x59\xec\x5d\x0c\x04\xe1\x75\x56\x93\xf2\x70\x93\x13\x5d\x6d\x81\x34\xd9\x36\xd8\xc1\x1d\x99\x58\x8d\xb9\x45\xd4\x0c\x1e\xd3\x4e\xf7\x67\x52\x9c\xc2\x91\x8c\x94\x1a\xb9\xc8\x00\x65\x11\x78\xbc\x0b\x82\x79\x84\xd5\x46\xa0\x07\x82\x55\x04\x4a\x07\xaa\x18\xe3\x0e\x2c\x87\xe3\x91\x52\xf9\xf9\x23\xe6\x8a\x5a\xfb\xcb\x04\x3d\x75\xcb\xb9\xc7\x3f\xa5\xe8\x3d\x3e\xd7\x87\xaa\x54\x4c\x1e\xe2\x11\xca\xfd\x4a\x59\x69\x3b\x1d\x07\x79\xe5\x9e\xa5\x95\x0b\x7e\xad\x88\x52\x5f\xaa\x47\xdb\xb5\x20\x40\xfc\xa9\xbc\xa7\xac\x92\x0f\xdc\x93\x42\xac\x19\x66\x92\x88\xe5\xc4\xc2\x84\x82\xd3\x55\x51\x6e\x8b\x92\xf9\xc6\xe8\xb0\x6b\xd4\xe8\x36\xce\xf3\xca\xd6\x04\xb7\x9f\x6a\x5a\x21\x1e\x6a\x0b\xbf\x9a\x8f\xf8\xd1\xdd\xd1\x22\xa6\x0b\x87\x32\x3f\xb2\x29\x53\xf6\xa3\x3b\x0c\xfd\xc8\x24\x17\x1e\x96\x6a\xfb\x50\xe4\x05\x1e\xeb\x15\x24\xec\x88\x2c\xcf\x02\xca\x2d\x6b\x9e\xf8\x89\xc0\x4d\x3a\xe0\xf9\x72\xcf\x5c\x9e\x6b\x48\x01\x60\x96\x23\xde\x25\x69\x81\xb7\x23\x6f\x5b\x31\x6a\x96\x31\xa6\x3d\x04\x87\xba\x9f\xfc\xa7\xea\x4b\x73\xc4\xc5\x29\xfe\xb2\x8b\xf7\xf1\xa9\x8b\x57\xf0\xa1\xa4\xa1\xba\x15\x48\xd5\x19\x6c\x1d\xd3\x6f\xc4\x4a\x5e\x66\x71\xfe\x59\x3b\x3a\xac\xd0\x6d\x42\x00\x77\x54\x5d\x07\x07\xa6\xd4\x60\x98\x1d\x82\xd2\xdd\x04\x58\x25\xf3\x25\x8d\xd1\x2e\xb7\xef\x66\x08\x4b\xb1\x4a\x8d\x8d\x0d\xe1\x4b\x35\x98\x0f\x07\xb7\x81\xba\xbc\x19\x05\x6a\x1e\xcd\x07\xc3\x3e\xef\xef\x54\x57\xe2\xd2\x86\x28\x9d\x87\xb9\xb5\x35\xbc\x3c\xcc\xf2\xb7\xf8\xf0\x47\xbd\x34\x56\x56\x5f\x35\x55\x5e\x69\x6c\xd2\x50\xdd\xe8\xd5\x43\x9c\xc3\x00\xce\xe8\x8c\xcd\x13\xaa\x60\x2d\xca\xbd\x1b\xb0\xdf\x7b\x64\x60\xda\xec\xb9\x4e\xc8\x07\x0c\x1a\xdf\x93\x5e\xd8\x3d\x80\xf7\xa1\x27\xef\x81\xe0\xe7\xba\xf8\xaa\x06\xf0\xd1\xd6\x28\x41\xda\xd7\xad\x63\x99\xfd\xf1\x35\xcd\x8f\x7b\x2b\x50\xc8\x23\x8b\xb7\xd7\x6f\xf0\x93\x04\xcd\x38\x3c\xa4\xb9\xb3\xca\x0c\x06\x1f\x91\x6c\x83\x2c\xf7\xea\xec\x5b\x75\x37\x1f\x8a\x5c\xe2\x1b\x8b\xdf\x98\xab\xa1\xbd\x42\x06\xab\x1a\x78\x67\x61\xcc\x2c\xd9\x95\xd9\xaf\x78\xab\x78\x88\xc6\xbe\xb0\x37\x3e\xe2\x14\x9a\xcd\xfe\xdc\xfc\xfc\x52\x8b\xb5\x65\x9a\xfe\x61\x4b\xff\xa4\x73\xe9\xcf\xcd\xfb\xa3\xaf\x48\xc9\xf4\xd4\xb2\xff\x65\x0b\xfc\xb7\x4e\xe0\xeb\xdf\x71\x02\x17\x56\x01\x91\x46\x80\xbc\x1f\xbe\x60\xe1\xc4\x8e\xb3\x4c\x6d\x8c\x67\x8e\x38\x22\xd3\xc3\xba\xb2\x83\x9b\x17\x8f\x94\x13\x27\xc3\x00\xab\x7e\x12\xfd\xc5\x7c\x3f\x6c\xbf\x42\xe6\x4d\x5c\x9a\xda\xea\x5e\xf9\x1c\x8e\x31\xa2\x04\x41\xa0\x9b\xaa\x7e\x3d\x44\xc3\x01\x4b\x80\xf8\xe6\x9b\x8d\x0e\x81\x06\x8d\x3e\x66\x0c\x5b\x32\x3e\xfd\xea\x0f\xbb\xcc\x04\x92\x8e\xaa\x8b\x12\xae\xae\x9f\x91\xf1\x87\x90\x51\xc1\x1f\xda\xc5\xe1\x76\x41\x03\x00\x90\x5d\x7e\x21\x50\x5c\x49\x95\x6d\x86\xf0\xba\x04\x88\xa5\x73\xb7\xb6\xa6\x79\x9d\xb0\x66\xda\x79\xf4\xc0\xdd\x75\x8e\x1d\x97\x7f\x62\x69\x72\xed\xd9\x0c\x1f\x83\xc5\xeb\x7e\x2d\xfc\xff\xff\x44\xea\xfe\x9e\x15\xe0\x39\xa4\x3e\x27\xd9\xef\x30\x00\x7f\xa9\xee\xff\x5a\xd5\xfd\xdf\x75\xf5\xfd\x6b\xd5\xf9\x5d\xc5\x9a\x3c\xc2\xc0\x33\x71\x18\x87\x43\x66\x7e\x2b\xee\x83\xd4\xfe\xa4\x4f\x41\x84\x68\x54\xf7\xd9\xe5\x13\xa8\x18\xca\x77\x7c\xc3\x20\xad\x2b\x9d\xad\x09\x19\xd6\x3c\x3d\x0e\x87\x06\x1a\x50\x93\x8e\xa6\x41\x8c\x8f\x10\x06\x24\x00\x21\x0e\x41\x5e\x4a\x41\x8b\x86\x22\x5e\xd5\x5c\x9f\x49\x48\x10\xdb\xe0\x56\x7f\x72\x40\x9f\x24\x69\xdd\xac\x78\x25\x70\xdf\xeb\xe3\x65\x3f\xe0\xdf\xe9\xaa\x36\x37\x47\xb3\xe1\x0d\x9b\xfc\x0f\x69\x78\x33\x2a\xf5\x6b\x1a\xee\x29\x60\xee\x7f\xef\xd3\xc9\x0b\xcf\x9a\xe6\xb5\x34\xac\x8b\xb2\xc3\x4d\x3d\x78\x22\xb4\x88\xc2\xac\x75\x63\x43\xbe\x04\x4a\x0b\x24\x41\x02\x53\xa8\xe8\x24\xdd\x81\xf4\x24\xfa\x55\x8c\x16\xde\xd5\x69\x96\xfe\x33\xcd\xef\x91\xb9\xb9\x09\x08\x6a\x04\xd6\xc0\x72\xd9\x56\x7a\x97\x14\xf9\x7e\xd3\xa8\xfe\xed\x63\x51\xd1\x96\x2a\x14\xe3\x3c\x79\xc5\x24\xce\x69\xf7\xd3\xe8\x23\x76\x25\x58\x9b\x5d\xc5\x39\x85\xaf\x51\xa2\xb6\xb4\x62\x91\x68\xae\xc5\x0a\x18\x56\xa1\x06\x98\x82\xb8\x01\xe3\xbd\xcc\x35\xcc\x12\x02\x7f\x2f\x76\x65\x1e\x67\x18\x7f\x8f\x45\x72\x32\xcd\xed\x5b\xbf\xa9\x5a\x43\x1b\x08\x26\x3b\xa2\x5c\x46\xde\x1f\x2a\x4a\xee\xa0\x9f\x70\xc3\x26\xca\xaa\x5c\xbb\x7f\xc4\x8d\x9f\xd6\x59\xe3\xd0\x73\x23\xf6\x63\x8b\x44\x8d\xde\xb2\xf7\x77\xc2\x33\x77\x34\x4e\x4a\x0e\xb0\xeb\xb8\x76\x63\xcb\x1a\x97\x15\x33\xc4\x54\xc6\x88\x8e\x05\x8c\xc7\xee\x56\xa1\x27\x7a\x37\x1b\xc9\x83\xd0\x5e\x43\xba\x35\x66\x3e\xfb\x39\x16\x90\x91\xd6\xa5\x58\xa6\x3f\x52\xee\x06\x1f\x11\x53\x89\x63\xfb\xc4\x88\x79\x33\xa7\xd8\xb1\x3d\xe3\x75\x3b\x6e\x8d\xae\xe3\x80\x20\x3d\xbd\xeb\x52\xe7\xab\x07\x99\xe7\xf0\xbe\xbd\xdc\x37\xd7\x64\xd0\x33\x1d\xe9\xcd\x57\xa5\xd6\x39\xc4\x2e\xac\xfe\x9c\xe5\x5a\x3e\xf0\xd5\x5e\x9f\x58\x85\xa8\xe9\x64\xa2\xa7\x9b\x6d\x06\xf7\x13\x5d\x39\xb9\xcf\x43\x0a\x17\x5e\x87\xa6\x37\xcd\xdf\x73\x43\xd5\x71\x88\x10\x85\x29\xab\xd7\x56\xa2\x49\xcc\x80\xa5\xe3\x92\xe1\x4b\x36\xcd\x02\xe0\x1f\x84\x59\x89\xc0\x36\x9f\xa9\xf0\x9d\x8a\x67\xcf\x5e\xd4\x71\xad\x32\x1d\x57\x0c\x89\x25\xd6\x5c\xae\x1e\x7a\xfe\xc1\x4c\x49\xe4\x13\x66\x57\x01\x57\x5a\xa7\x54\x75\xea\xca\xb0\xa1\x3c\x75\x32\x8e\xe6\x73\xcc\x11\x7f\x1c\xcd\x23\x75\x73\xb7\xb8\x03\xd5\x46\xc8\xd3\x82\xd4\x20\xe5\x67\x6f\x07\x33\x48\xc1\x8f\x26\xea\xe3\x6c\xb4\x18\x4d\xde\x05\x2e\x31\x3b\xbd\xbe\x8e\x66\x73\x97\x03\x86\xd4\x3e\xe4\x55\x6d\x16\x7f\x16\xdd\xce\xa2\x79\x34\x59\x20\x66\x40\x4d\x67\x32\xb1\x3f\xbd\x86\x74\xf2\x4f\x23\x4c\xc5\x0e\xa3\xd9\x84\xb3\xfc\xe6\x81\x81\x8a\x7e\x36\x5f\x9f\x07\x6a\x74\x73\x3b\x1e\x45\x57\x81\x9a\x2f\x06\x8b\xbb\xc5\x74\xf6\x49\x71\x3e\xdc\xf4\x20\x50\xa3\xc9\x70\x7c\x77\x05\xed\xfb\x38\x5a\xbc\x9f\xde\x2d\xd4\x78\x74\x33\x5a\x90\xb6\xa5\xff\xd2\xc5\x68\x31\x8e\x02\x75\x13\xcd\x86\xef\xcd\x4f\x11\x2b\x10\xa8\xeb\xd1\x62\x62\x46\xe6\x7a\x3a\x53\x03\xec\xfb\xf0\x6e\x3c\x98\xa9\xdb\xbb\xd9\xed\xd4\xbc\x66\x32\x9d\x8c\x26\xd7\xb3\xd1\xe4\x1d\xc8\x39\x82\x5e\xa4\x69\xee\xe0\x72\x1e\x51\x8a\x79\x3c\x58\x44\x93\x85\x6d\x9e\xba\x8a\xae\xa3\xe1\x62\x0e\x92\x91\x77\xb3\xc1\xf0\x93\xfd\x12\x0e\x0d\x7e\x4b\x3c\x20\x9a\xcd\xa6\xb3\x79\xa0\x3e\xbe\x8f\xe0\x01\xd3\x19\x40\x32\xae\x46\x73\xd0\x7d\x1c\x5c\x8e\xa3\x50\xcd\xa7\x37\x91\xfa\xdb\xdd\x6c\x34\xbf\x1a\x0d\x71\x6c\x59\x52\x72\x3c\x9e\x7e\x84\xe7\x47\x3f\x0f\xc7\x77\x73\x4a\x86\xd3\x08\x8a\x91\x08\xd4\x9c\x74\x27\xdd\x07\x6f\x06\x9f\xf0\x21\xb7\xb7\xe3\x4f\x66\x1d\x7c\x9a\xde\x71\x2d\xbf\x2c\x78\xce\x5d\xc1\x73\x68\xbe\x1e\xdd\x2e\x18\x0e\x10\xfd\xbc\x40\x9c\xc8\xbf\xdd\x8d\x66\x08\x64\xf0\x11\x0b\x66\xb2\xcc\xda\x88\x3e\x98\xcf\x7d\x1c\x8d\xc7\x6e\x49\x5d\x46\x80\xdd\x18\x47\xf4\x6e\x44\x8d\x7c\x22\x14\xcb\xe2\x7d\x64\x66\xfe\x9a\x44\x3a\xe7\xb7\xd1\x70\x34\x18\xc3\xe4\x8f\xae\xcc\x22\x1b\x07\x80\x02\x88\xfe\xed\x2e\x9a\x2c\xe0\x57\xb7\x77\x93\x11\x60\x32\xa6\x33\x15\xfd\x1c\xdd\xdc\x8e\x07\xb3\x4f\x16\x11\x32\x98\x21\xa8\xc1\x2c\x97\x26\x16\x86\x26\xa9\x81\xac\x08\xa0\xd9\x6a\x74\xed\xda\xfc\x7e\x30\x57\x97\x51\x34\x51\x83\xab\x0f\xa3\x79\x74\xc5\x1f\xbf\x9d\xce\xe7\xb4\xb4\x2c\xf4\x80\x5e\xcc\x35\xe4\x6d\x2a\xb1\xa6\x3e\x3a\x17\xef\x1c\x72\x92\x9e\x66\x0e\x03\xcb\xd1\x9c\x51\xc4\x80\xb3\xf4\x08\xb0\x0e\x19\xd2\x36\x8c\x54\xd9\x64\x1a\x08\x4d\x43\x4a\x4b\xb2\x41\xbd\xc4\x24\xb3\x84\x7d\x1d\x99\x2c\x71\x5a\xdb\x84\x31\xbc\x01\x4b\xf9\x2c\x5f\xbc\xed\x5e\xe2\x0a\x07\xe0\x84\x4c\x0f\x34\x15\x55\xd0\xcd\x51\xbb\xde\x65\x99\x6a\xf3\x54\x79\xba\x57\x8e\xce\xfe\x2c\x50\xe7\x81\x7a\x13\xa8\xb7\x81\xfa\x16\x5d\xfe\xef\xb0\x69\xcc\x71\xc1\x6e\xb1\xa7\xcd\xd9\x09\x44\x68\xa4\x9e\xd0\xb1\xea\x4a\x40\x05\x1e\x76\x5c\xce\x30\x54\x8d\xfd\xba\x3c\x92\xcc\x13\xf5\xdb\x32\x29\xb6\x45\x22\xda\x68\x99\x65\xbc\x88\x55\xa9\x51\xc2\xb5\x91\x57\x76\x94\xd9\xd6\x2b\xc7\xd5\x54\x22\xb3\x61\xb1\x15\x24\xdf\xf4\x42\x34\xb4\x31\x91\x58\xa7\x1b\xdd\x71\x6d\x37\x48\x58\x35\x97\xad\xd8\xe5\x01\x4d\x04\xf2\xfd\xb4\x7e\x48\xca\xf8\xb1\xa1\x57\xe1\x41\x1f\x5c\xc0\x20\x46\x41\x87\xa5\xd6\x39\x2b\x7a\x49\x96\xdd\xa5\x0e\x5e\x4a\xff\xd2\xe7\x82\xba\x66\x9d\x9c\x71\xd1\xd3\x7c\xa7\xed\xaa\x83\xda\x23\xd4\xb3\x47\x05\x7f\xb2\x0c\xc5\x6a\x76\x09\x3c\x98\x0c\xae\x5d\x6f\x15\x69\xe1\xc1\x00\x35\x2b\x96\x98\x4d\xa4\x90\x7e\x81\x23\xd5\xb6\x76\xbc\x04\x34\x83\x08\x1a\x94\xec\x2a\x96\x69\x49\x11\x38\x43\x18\x05\x14\x4d\x74\xa5\x56\xa9\x4a\xa7\xb9\xb6\x89\x50\xe2\x30\xc3\xf9\xf2\x57\x77\xb6\xc3\x18\xfe\xe5\x9d\xf3\x4d\xd5\x3f\xac\x97\xab\x97\x15\xca\xa5\x39\x50\xf7\x60\xf5\x8e\x28\x69\x6b\xcb\x7e\x64\xf1\x63\xa0\xd2\x5a\xb2\x46\xe0\xca\x33\xcd\x83\x87\x10\xf7\xaf\x7d\x8a\xe5\xa4\xc0\x11\x31\xa7\x66\xe2\x94\x5a\x9f\x88\x84\x32\xe5\x00\x13\x8a\x13\x6b\x14\x45\x74\xd9\xdd\xe4\x98\x9b\xad\x1f\x7c\x41\x71\x1f\x7b\xdc\x64\x7f\x1f\xac\xef\x6b\x3c\x08\xc7\x08\x76\x9b\xa8\xfa\x73\x49\xd7\x09\x32\x17\xf9\xe5\x95\xdd\xdc\x75\x4b\xad\x12\xd3\xdc\x04\x13\x30\x09\x31\x4c\xf3\x25\x0a\x6c\x15\x3c\xc3\xd2\xdb\x83\x4f\x97\x96\xd0\x22\x17\xd5\x82\x69\xae\x1e\xcb\x14\xe9\x04\xf3\x44\x19\x3f\xdd\xc5\xbf\xd1\xdb\x45\xbf\x12\x39\xb7\x13\x51\x09\xdc\x7a\xaa\xc8\xd1\x7a\xa6\x82\x44\x64\xd5\x8e\x3b\xc8\xd5\x6e\x3a\xb9\x6e\x37\x43\x87\x40\x2c\xbc\x9a\xf1\x22\x82\xd8\xa0\x79\x16\xd4\x6e\x09\x5a\xd4\x34\xbf\xaf\x02\xc9\x4e\x25\x75\x79\x28\xb7\x71\xf0\x15\x70\x9e\x93\x5f\xcd\xef\x71\x0e\xb7\x2c\xa0\x5c\x42\x8a\x8c\x09\x0b\x5d\xbd\x87\x28\xdb\x87\x33\x1e\x4a\x42\xd0\x3f\x23\x5f\x71\x55\x00\x0b\x00\x95\xaa\x58\xf2\x60\x7f\xe4\x38\xc2\xbb\xd4\xae\x30\x8b\x17\x38\xac\xc5\x1d\x5c\xc0\x66\x06\x6b\x9d\x8b\x11\xf5\x6a\x98\x48\x6b\x1b\x38\x48\x5a\xd0\x6e\xaa\xcb\x89\xdd\x64\xb7\xf7\x14\xaa\x3d\xe5\x85\xa3\x3d\x7a\x7c\x88\xeb\xaa\x80\x8b\x11\x0a\x7d\xf3\xdc\xde\x87\x22\xe6\x10\xaa\xd6\xeb\x24\xfe\xce\x67\xf1\xe1\x1c\x2d\x46\x58\x70\x90\x24\x17\x91\xa3\xf9\x21\xea\x1b\xd7\x86\xa7\x35\x64\xe1\x4b\xf7\xa8\x47\xda\x49\x09\x74\x98\x11\x88\xe1\x44\x7e\x1f\x79\x8c\x32\xc7\xea\xf4\x14\x39\x64\xfd\x58\xa8\xe3\xf3\xbe\x82\xbd\x99\x03\xf3\x7f\xba\x6e\x8f\x8c\x31\x03\x5c\x76\x2a\xe5\xc0\x4f\xc2\x71\x67\x3a\xcc\x3d\x0c\x10\xac\x77\x71\xb2\x82\x8d\x1a\xbb\x14\x1b\xe0\x45\x05\xe1\x3d\xf0\x41\xe1\xf7\xc3\x23\x2a\x7a\x65\xe3\x8d\x73\x5f\x02\xff\x67\xac\xd8\x95\xa8\xc0\xb7\x09\x57\x5b\x8c\xcc\xc9\x62\xbb\x29\x9d\x91\x32\x1c\xde\x8e\x03\x95\x13\xd7\x19\x4e\x2b\xcc\x3e\xeb\x85\x5a\x05\x34\xd5\x6b\x0e\x46\x8f\x57\x03\x60\x1c\xcd\x81\x66\x3f\x4b\xe2\x68\xa6\x79\x1d\x8b\xcb\x6d\x0d\xa4\x85\xe3\x9d\xc1\xe7\x5e\xc7\xb7\xb0\x00\x5b\xc8\x81\x09\x7e\x01\x2a\x62\x97\x26\x7a\xf3\xeb\xdf\x98\xb7\xe5\x27\x40\x7f\x9f\xd7\xa2\xa1\xbb\x2a\xbe\xd7\xea\x7e\x97\x26\x3a\x4b\x73\x40\x2e\xdb\xf4\xae\x2b\x61\x2d\x10\x58\xfd\xa8\x97\x55\x5a\x6b\x8f\x3f\xab\xa5\x67\xbe\x05\x82\x20\x88\x72\x53\xc0\xdc\x58\x21\x66\x66\xd2\x8d\xee\xd8\xda\xf4\x32\x10\x8c\x58\x81\x2d\x57\xab\x87\xba\xde\xfe\xf0\xea\xd5\x8a\x3e\xbb\xa2\x31\x28\xca\xfb\x57\xae\xa8\x2b\x7c\x35\x2c\xf2\xa4\x28\x4f\xce\xc2\xb3\x3f\xaa\x00\xe8\xe9\xfa\x9f\xb3\x8b\x6f\x4f\xdf\x36\xeb\x7f\x5e\xbf\x3d\xfd\xab\xfe\xe7\xcf\xf8\x83\xb3\xdf\x28\xfd\x3b\xfa\x60\xc5\xf3\xcf\x02\x35\x5d\xd5\xc5\x52\x97\xea\xe2\x34\x50\xe7\xa7\xa7\x17\x47\x0e\x09\xf1\x1f\xff\x53\x9d\x7d\xff\xfd\xe9\xc9\xf9\xe9\xe9\x5b\x45\x8f\x5a\xe8\x78\x13\x00\xb7\x2e\x10\x42\xcc\x57\x29\xd6\x2a\x5f\x69\x73\x30\xa0\x01\x76\x97\xa7\x80\xb9\x41\xbb\xef\x63\x5a\x41\xae\x30\x3f\xb9\x89\x93\xb4\x2a\xf2\x40\xd9\xbf\x7c\x1c\x21\x90\x80\x00\x2f\x33\xc6\x06\x00\xc2\x05\x60\x82\x32\x4e\x4d\xeb\xff\x07\xbf\x2d\x03\x73\x2e\x00\x16\x4c\xdd\x96\xc5\x5a\x57\xe6\x4c\xbd\x49\x4b\x88\x20\x7d\xc9\xf7\x81\x69\x1b\x1e\x18\xcd\x56\x07\xea\xec\xfc\xec\x54\x7d\x0c\xd5\x55\xbc\xaf\x8b\x5c\xcd\xeb\xd0\x6b\x9d\x7a\x63\x96\xef\xc9\xd9\xdb\xef\xde\x04\xea\xf8\xed\xe9\x77\x7d\x75\xfe\xf6\xfc\xe4\xf4\xbb\x37\x6f\x21\x53\x63\xde\xf2\x5f\x56\x55\xf8\x98\x56\xab\x50\x27\xbb\x10\xab\x37\x6d\x15\xba\x15\xad\xae\x0b\x3e\xf6\xb1\xed\xff\xf1\xbf\x2c\xe1\xf2\xdb\xf0\xab\xd0\xc4\xec\x71\x2d\x7d\xaf\x0f\x15\xbd\x89\xfe\xa2\xa1\x9c\x83\x4d\x39\x9e\xd2\xb2\xf8\x3b\x40\x73\x7e\xcf\x79\x71\x67\x3e\x91\x17\x3a\xcb\xfd\xb2\x20\xbe\x85\x99\xbe\x97\xc2\x5f\x07\x9e\xa9\xe6\xfb\xaa\xd6\x1b\x0a\x47\x93\x26\xf6\x97\x22\xdb\xe5\x75\x5c\xee\xfd\x22\x12\x3c\x1e\xe9\x5e\xf2\xbb\xa7\x8e\x7b\x6e\x39\xbe\x2f\xb2\x44\x97\x56\xc2\xd9\xe7\x25\xf5\xdb\xd2\xeb\x1f\x58\x42\x45\xde\x39\x88\x5b\x8c\x40\x54\x5a\xf3\xb9\xfa\xf8\xf8\x18\xae\xe0\x53\x5b\xfc\x10\x9d\xac\xa3\xbc\x32\xee\x20\x95\x41\x78\xfa\xca\xc4\x25\xc8\xd9\x48\x4f\xda\x1f\x51\xa8\x4d\xd9\x40\xe4\x9c\xb1\xec\x02\xc8\x84\x55\xda\xdb\x4f\x3e\x01\x6a\x79\x28\x97\x64\x1e\xb6\x44\x49\x01\xd3\x33\x2a\xa5\xb1\x17\x1f\xde\x83\x12\x03\xd1\x06\x7a\x5b\x6c\xb6\x35\xb7\x1c\xfa\xa1\x32\x4b\x6d\x5f\xec\x3a\x2a\xd5\x1d\x8e\xc6\x39\xa7\x3f\x50\x5d\xd3\xcc\xeb\x5e\xf5\x8b\xfb\x07\x39\x55\x09\xfe\x4d\x2b\xd5\x79\x7e\xa9\x34\xff\x41\x1d\x9f\x61\x2e\xd4\x3d\x1d\x88\xfb\xcf\xfb\x60\x6d\x00\xb3\xad\x47\x99\xe6\x60\xdd\x55\xba\x49\xb3\xb8\x54\x9b\xb8\xd6\xa5\xb1\x11\xb1\x6c\x45\x92\xc3\x5a\xdb\xd7\x4a\x06\x99\x3e\x12\xee\x7d\xd0\xfd\x7c\xab\x4a\x41\x45\x1c\x8d\xd9\xf6\x30\x3d\xfe\x50\x62\x7a\x0e\x86\xb1\x07\xc7\x07\x2d\x27\xb7\x71\x2a\x4f\x9a\xc4\x3b\x45\xec\x46\x79\x72\xdd\xf6\x7b\x40\x51\x98\xd5\xba\xcc\xc1\x5c\xc8\xf6\x01\xe6\x7c\x91\x6e\x81\x41\x83\x69\x99\x9c\xa0\x81\x17\xaf\x3e\xe7\xc5\x63\xa6\xb1\xfc\xc7\xf8\x0c\xe5\x06\xc2\x20\xe8\xfc\x10\xc8\xc8\xff\x94\xa5\x4b\xb0\xb3\x98\x38\xed\x39\x66\xa9\x02\x1b\x98\xb1\xf4\x20\x0e\xb3\x32\x86\x56\xba\x32\xdf\x02\x0d\x21\x34\x4d\x9b\xdc\x45\xf6\x63\x00\xa5\x29\x2a\xe0\xda\x5c\x13\x09\x65\x45\x8c\x06\x1e\xe5\x81\x60\x98\x03\xe6\x66\x6e\xaa\xf6\x7f\xfd\x4d\x05\x96\x22\xb8\x7e\xa6\x77\x65\xb1\x2d\x81\xc0\x7f\xc5\x54\x94\x84\x54\x5b\x70\x0e\xd9\x0e\x7e\x8a\x7a\x48\xf7\x69\x55\x43\x71\x89\x30\x6e\x9f\x3c\x1d\xf9\xc4\xc5\x67\xba\x6f\x09\x2f\x91\x09\x7d\xb4\x79\x95\xe5\x6c\xda\x14\x82\xe3\x24\xa0\x1f\x9a\xb5\x62\x2e\x8a\x92\x79\x59\x4a\x6d\xd6\x49\x80\xfc\xdf\x82\xe6\xa6\x81\xbb\xa8\x9c\x1c\x77\x9e\x30\xb4\x2e\x60\x2a\x6f\x6a\x47\xbc\x5e\xa7\x5f\xb1\x29\xd6\x71\x2d\x9f\xd9\xe9\x4f\x98\xef\x30\xbe\x5f\x80\xbc\x15\x26\x0c\xec\xe1\x2f\x69\xac\xf4\xc6\x12\xa4\x83\xc1\x1a\x27\x9b\xb4\x71\xb5\x92\x36\x8a\x97\x83\x87\x05\x4c\x4c\xe0\xc4\x13\x89\xa7\x18\xab\xe2\xbf\x60\x16\x30\xe6\x40\xd1\x9f\x54\x68\x1d\xd8\x3b\x97\x48\xb3\xb0\xec\x64\xdd\x38\x77\xf6\x04\xd4\xe0\xa0\x5c\xdc\xac\xd3\xe8\xa8\xe7\x40\x22\x67\x17\x78\xcf\x3c\xe2\x1d\x02\x28\x88\x4e\x05\x42\x03\x11\xcf\x72\xe3\xec\xed\x51\x4c\xe8\x80\xd4\x7d\x5d\xd0\x3f\x51\xde\xfe\x90\xba\xbd\xbf\x3b\xed\x1d\x03\x7a\x3c\xe8\x75\xc2\xf9\x02\xff\xc6\xf8\x67\x9e\xe0\x62\x43\x1f\x05\x4a\x16\x29\xda\xd1\x50\x40\x27\xd6\x60\xa6\x4e\xad\xdb\x42\xe1\xde\xcb\xbb\x34\xc2\xd3\x35\x4b\x0c\x92\x8f\xe4\xb5\x16\x84\xab\x71\x9a\xf6\xc5\x2e\xf0\x55\xad\x5a\xcf\x07\x75\x59\x0a\xa4\xc9\x76\x50\x58\x8c\xb8\x8c\x58\xf7\xcc\x1b\xff\xa7\xfa\xe7\xd1\xc3\x7a\xd9\x7a\x7e\x43\xc5\x57\x8c\x38\xfe\x9d\x18\xdd\xa4\x50\x0f\x71\x99\x3c\xd2\x1d\xae\x30\x24\xeb\x05\xc7\x10\xac\x48\x18\x28\x72\xa8\x05\x9f\x52\xb5\x5b\x32\x49\x8b\x56\xc7\xb1\xfa\xf7\x7f\x9f\x71\xe4\xb9\xd7\x77\x00\x1c\xd1\xfe\xa7\x94\x49\x04\x37\x74\x2c\x19\x58\x05\x01\x2b\xfe\x1b\x39\x5a\xe2\xc7\x6a\x97\xd6\x4d\x6d\x91\xc6\xaa\x62\xed\x10\x18\x59\xdb\xb8\x6f\xb8\x45\xc7\x56\x9a\xa2\xf5\x81\x46\x56\xf2\xb8\x5b\x9e\xa4\x2f\x4c\xd7\xc6\x24\x61\x56\xac\x21\x19\x62\x8e\x42\x5a\x1e\x49\xcc\xba\x99\x62\x58\x88\x30\x27\x41\xef\x44\x9a\x46\xb4\x8e\xdd\xa2\x6d\x70\xe0\x9b\xeb\x03\xd8\xcd\xb8\xc5\x2f\x60\xb5\xef\xc8\xf8\x55\x71\x9a\x34\x7a\x02\x17\x36\xe0\x68\xdd\x26\x16\x59\x4b\x41\xfd\x08\x87\x31\x9d\xee\x96\x26\x9f\x98\x0b\xa2\x19\x50\xf2\xbd\x1f\xcd\xd5\x7c\x7a\xbd\xf8\x38\x98\x45\x1e\xf3\x00\xa1\x32\x5c\xb9\xfe\xfb\xe9\xf8\x2a\x9a\xd9\x62\x76\x64\x76\x98\xd2\x0f\x20\x7d\x3d\x19\x7d\x88\x66\xf3\xd1\xe2\x93\xea\x0d\xe6\x6a\x34\xef\x61\x41\xfe\xe4\x13\x83\x2b\xd4\x74\xd6\x09\x0e\x10\x88\x8a\xcb\xbb\x05\xa0\x02\x00\x51\x01\xf8\x90\x00\xa9\x18\x5a\x5f\x53\xd3\x6b\x0b\xab\x18\x30\xac\x62\x7a\xad\xe6\x83\xc5\x68\x7e\x3d\x18\x02\x72\xe3\xdf\xee\x06\xf8\x0b\xd3\x92\xe7\x30\x17\xa6\x79\x77\xf3\x48\x99\xa1\xb0\xc3\x74\x15\xfe\x86\x71\xb8\x19\xfc\x14\xb5\xb1\x29\x6a\xf1\x7e\xb0\x80\x8f\xf2\xc8\x07\xea\x66\x7a\x35\xba\x1e\x0d\x11\xbb\x12\xa8\x68\xf2\x7e\x30\x19\x02\xf0\x03\x46\xed\x2a\x9a\x8d\x3e\x20\xe3\xc3\xc7\xe9\xec\x27\x40\xc2\xcc\xa2\xe9\x75\x80\xa0\x06\x33\x62\x0c\x16\x81\x01\xbf\x05\x64\x48\xe0\x9a\x1d\xa8\xc5\x6c\x70\x15\xdd\x0c\x66\x3f\xd1\x5f\xd5\x3c\x1a\xce\x22\x81\x1e\xb9\x9d\x4d\x6f\x67\xa3\x68\x31\x98\x11\xed\x82\xa5\x9f\xb7\xe8\x16\x00\x9d\x30\xe1\x05\xae\x9f\x17\x0f\x8d\x69\x16\xbe\x68\x7a\x7d\x3d\x1a\x46\xb3\x40\x0d\xde\x31\xb0\x25\xba\xb9\x1d\x4f\x3f\x45\x16\xff\x20\xc6\x70\xfe\x7e\x30\x1e\xab\xf7\x83\x0f\x30\x92\x8e\x6e\x63\x31\x65\xfc\x44\x24\xfa\x10\xcd\xe6\xd3\x09\x4e\xf1\xd5\x68\x16\x0d\x17\x66\x75\xf1\xdf\x5e\x82\xe2\xb0\xc8\x0d\x68\x97\xc5\x74\x30\x8c\x83\x70\x44\xc3\xf7\x83\xd9\x60\xb8\x88\x66\xcf\xa1\x81\x6e\x67\xd3\xe1\xdd\x0c\x26\x12\x91\x19\x97\xf3\xc5\x68\x71\xb7\x88\xd4\xbb\xe9\xf4\x0a\xe6\x96\x09\x53\x02\x35\x9e\xce\xe1\x0d\x77\xf3\x28\x50\x57\x83\xc5\x00\x9a\x30\x9b\x5e\x8f\x16\x73\x68\xce\xe5\xdd\x7c\x04\x4b\x78\x34\x59\x44\xb3\xd9\xdd\x2d\xbe\xe4\xfd\xf4\x63\xf4\x21\x9a\xa9\xe1\xe0\x6e\x1e\x5d\xc1\x68\x13\x98\x85\x60\x2c\xd3\x6b\x9c\x8f\x81\x19\x05\xda\x42\x9f\x02\xb5\x98\xce\x16\xea\xd8\xf6\x40\x4d\xa2\x77\xe3\xd1\xbb\x68\x32\x8c\xfa\xd0\xf2\xab\xbb\xe1\x42\x8c\xb8\x0f\x83\x62\x40\xcb\x08\xdf\xf4\x71\xf0\xc9\x61\x5b\x04\x96\x45\x9c\x2f\x0e\xd0\xf2\x0b\xe1\x2b\xdf\x85\x6a\xa8\x4b\x60\x2a\x83\x9b\x1b\xfc\x7c\xb2\x5b\xaa\xd6\xf5\x5e\x34\x3c\x32\x0b\x70\x4d\x6b\x8d\xb0\x01\x67\x55\x58\x94\xb9\x13\x1b\x02\x47\xf3\x89\x87\x19\x9b\x98\x81\xe6\x71\xc3\x60\x03\xbe\xe9\xe8\x2b\x98\x59\x43\xc2\xd1\x43\xc9\x30\xbb\xac\x1e\xef\x29\x24\x37\x31\xff\x52\x71\xb9\x43\xf6\x44\x0f\x9f\x6b\x1b\xf7\xd3\x5c\x23\xcf\xf5\x95\x9e\x25\xb3\x86\xcd\xb8\xf8\xa1\xce\xa0\x87\x6d\x3b\xc4\x69\x59\x97\xa9\xa3\xce\xac\x9d\x4c\xa1\x14\x3b\x42\xb4\x05\x3e\x76\x25\x1e\x4b\x03\x0b\x9a\xb2\xa6\x35\x65\xba\x81\xc4\xb8\x10\x8f\x2d\xdc\x5b\xc5\x78\xdb\x9a\xec\xef\x43\x62\x74\xb7\x81\x30\x54\x77\x25\x96\xce\x12\xeb\xa7\x78\x94\x3a\x49\x3b\xbb\xe3\x0c\xc7\xff\xfe\xef\x32\x85\xd6\xeb\x77\x04\xeb\x7f\x0b\xcd\xa7\x9a\x9a\x41\x77\x54\xe3\x04\x1f\x11\x49\x05\xca\xbf\x4b\xfe\xbc\x03\x04\x93\xe8\x87\x20\xb7\xf1\x63\xbc\xaf\x1c\x58\xa4\x46\xa5\x92\xb4\xee\xc6\x9d\xc4\x96\x8f\x53\x70\xde\x81\xf8\xba\x25\x6c\x34\x5f\x27\xc9\xfe\xc3\x74\xa2\x07\x38\x3e\x9b\xf9\xef\x16\xe7\xa7\x98\x36\xb0\x85\x3b\xa8\x59\xe5\xcc\x1e\xa2\x65\x7d\x02\x6d\xd6\x15\x08\xfc\xe1\x48\x3c\xf4\xe8\xb9\x10\xf2\xd1\xb7\x17\x6f\xbf\x6d\x07\x57\x8f\xda\xd1\xe3\xa3\xee\xe0\xf1\x51\x2b\x52\x7c\x44\xf1\x9a\x2d\x48\x74\x88\x5f\xbc\xfa\x3f\xe1\xb3\xaf\xe0\xbf\xe1\x43\xbd\xc9\x7e\x03\x45\x5f\xf8\x6a\x98\xc5\x55\xb5\x8d\xeb\x87\x13\xa4\x59\x49\x8b\xfc\xe4\x3c\x3c\xfd\x1d\x93\x41\x4f\xe7\x7f\x4e\xcf\xde\x9e\x37\xf3\x3f\x6f\xce\xde\xfc\x95\xff\xf9\x53\xfe\x8c\xd3\x9c\xf4\xf4\xc0\xa5\x5c\x96\xa0\x93\x54\x5b\xf4\xa6\xb9\x4a\xf6\x79\xbc\xa1\x7f\x0a\x0f\x7c\x53\x24\xbb\x4c\x03\xaa\x80\x34\xf9\x62\x72\x69\x75\x22\x79\x8e\x8a\xdc\x7b\xb8\x39\x8a\x77\x84\x37\x3c\x4c\x85\xa1\xd5\xbb\xc9\x9d\x7a\x87\x99\xfc\xe6\xa9\x8b\x45\xdb\xe6\x43\x40\x00\x25\x1d\xe9\xf0\x68\x00\xe5\xcc\x98\xf9\x57\x76\x45\x07\x8d\x82\x87\x07\xca\x14\xf0\x51\xc0\x3d\x37\xc7\x32\x9c\x93\x82\x22\x05\xf4\x6e\xf2\xcf\xfe\x07\x61\x20\x24\x81\x15\x0f\x47\x5d\x28\x0e\x50\xc7\xb9\xd2\x56\xa6\x11\x04\xbd\xe3\x32\x01\xa8\x4e\x83\xab\x57\xd2\xbb\x42\xf4\xba\xf5\x58\xa7\x87\x5f\x6c\xf7\x8d\x2a\x75\xc2\x4d\xb1\xd4\x8e\x7b\x25\x1f\xc2\xfc\xf4\x7d\xb1\x2b\xcd\xa1\x0d\xe5\x31\x36\x94\x0d\x07\x3c\x84\xa8\xcc\x99\xbe\xd1\xba\x46\x31\x3b\xc0\x19\x99\x8e\xeb\xa4\xa3\x45\xcf\x4f\x20\x77\x8e\xef\x10\xfc\x5e\xa8\x06\x79\xc7\xe3\x88\xbe\x01\xff\x6e\xc3\xed\x50\xf1\x48\x51\x4b\xb8\x58\x8b\xf2\xd0\xa2\xa2\xd0\x87\x3d\xeb\xdd\xef\xdc\xbd\x07\x11\xc1\xc4\xea\xf9\xe0\xca\x30\x83\x0a\x03\xd3\xe0\x04\xb6\xdf\x5e\xee\x6a\x1b\xc1\x03\xe7\x1a\x41\x16\x18\xf1\x4c\x0a\x55\x15\xae\xf8\x0c\xd5\x87\x1e\x8d\x51\xc1\xbf\x0c\x54\xa2\x81\xbf\xbe\xf1\x5a\xc0\x5c\x42\x4c\x1c\x7a\x26\x9b\xf0\x67\x52\xae\x86\xaf\xde\x5d\x5f\x8d\x4f\xce\xc2\x8b\x93\xa2\x3c\x01\xc9\xce\xdf\x1d\x06\xf0\xf4\xf9\xff\xe6\xf5\x9b\x6f\x2f\x1a\xe7\xff\xc5\x9b\xd3\xd7\x7f\x9d\xff\x7f\xc6\x1f\x73\xcc\x5e\x97\x5a\xab\x2b\xcf\x61\x68\x03\x01\x2e\x02\x75\xa1\x26\xc5\x17\x0d\x64\x7f\xe7\xa7\xa7\xdf\x09\x1c\xc0\xf1\xb0\x6f\x7e\x84\x00\x81\x33\xf8\xef\x39\xfc\xf7\x5b\xf8\xef\x77\xf8\x0a\x6b\x1c\x3a\x16\xe9\x40\x8d\xf2\x55\xa8\xfe\xff\x64\xeb\xac\xab\x35\x64\xa3\xfe\x8f\xa3\xe8\x8b\x2e\x41\x37\x2e\x95\xb2\x70\x07\x0e\xc0\x2f\xba\x5c\xc6\x75\xba\xb1\x3c\x36\x6b\x3f\x87\xc9\xce\x10\x6e\x66\x20\x99\x40\xfd\x18\x0b\x89\xcb\xb2\xe2\x91\xca\x49\x4f\x43\x75\x3b\x8b\x06\x37\x97\xe3\xe8\x88\x68\x1b\x0e\xf0\xa4\x81\xd6\x00\x21\x41\xa1\x9c\x6a\x17\x67\x81\xaa\xf5\xd7\x7a\x59\x14\x9f\x45\x66\x8a\xb5\xde\xe2\x8c\x09\xe1\xd7\xbb\xcc\xb6\x4a\xf5\xd6\xa5\xd6\x3d\x4e\x84\x55\x7c\x6a\x9a\x9f\x26\xc5\xe6\x07\x84\x06\x40\x3a\x4b\xf3\xa8\x40\x82\x63\xcd\x12\x89\xf4\x49\x6f\x78\x44\x0a\xc6\x98\xf6\x07\x72\xab\x7b\x1c\x07\xab\x53\xe9\x14\xa6\xf0\xee\xcf\x8b\x5c\xfe\x28\xb4\x7c\xd2\x69\xd6\x54\x85\xd9\x5a\xec\x3e\xc3\xcc\x62\x5b\x22\x6a\x8d\x7a\xe3\xaa\x3c\xc6\xe0\xb1\xdd\xeb\x9a\x4b\xd3\xe8\x0b\x69\x49\x5c\x96\x8f\x0f\x69\xa6\x29\xbf\x44\xa9\x64\x26\xb3\x2b\x35\x94\x8d\x02\xc1\xf5\x1a\xcc\x76\x49\x61\x01\x38\x01\x2e\xf2\x44\xdf\x6f\xd1\x98\xb0\x18\x84\x39\x49\x71\x6b\xbb\xcf\xf4\xba\xee\xb1\x02\x07\xb3\xc5\xc5\x75\x2b\x7f\x61\x83\xc1\x3c\x69\x90\xc9\x74\x64\x95\xc6\xa7\x83\x94\x4d\x2a\x90\xda\x15\x15\xb3\xd4\xa4\x62\xb2\xb1\xaa\x26\x87\xad\x9b\xc0\x5d\x7f\x48\xec\x60\x5a\xe8\x56\xb2\x26\xd8\xae\xe9\x3b\xbc\xaf\x92\x09\xe8\x8f\xa4\x25\x6b\x3f\xe6\x2f\xd7\x5c\x15\x65\x82\x89\x1f\x72\xf8\x60\x08\x61\xe1\x56\xed\x47\x06\x6a\xa9\x21\x25\xe2\xff\x58\xe5\x5a\x27\xa4\x34\xea\x85\x19\x7e\x50\x31\xa5\xad\xca\xe2\xbe\x8c\x37\xaa\x42\x99\x4f\xd0\x24\x86\xe5\xc7\xaf\x42\xe3\xc3\x0a\xb8\x98\xb1\xa2\x35\x2c\xd4\x4f\x84\xb2\x99\xae\x42\x75\xc9\x55\xfd\x62\x32\xcd\x12\x61\x30\x63\x5d\xb8\x6f\xd0\x7b\x7e\x34\x5d\x5c\xc5\xb9\x4d\x97\x32\xae\xd4\xec\x51\x40\xd3\xc2\x72\xf3\x0d\xb3\x86\x9c\x0c\xf0\xe8\x11\xb7\x4d\x8d\x12\x4a\xec\x9f\x22\xdb\x6a\x99\x22\x99\x49\x51\x7c\x0e\xcd\x04\x94\x80\xb4\xd3\xcd\xfa\x0c\xab\xbf\x97\x21\xbc\x15\x57\xd5\x23\x54\x01\xf1\xf9\x02\x40\xfb\xaa\x2e\x77\x2b\x06\x24\x58\xad\x07\xe6\x86\xe5\x32\x36\x8c\x89\x01\xe3\x70\x74\x3d\x9a\x20\x81\x6c\x6b\xbd\x0b\x0e\x05\xd3\x6d\x1c\x16\x77\x2e\x61\xf7\x09\xa5\x8c\xe5\xe5\x81\xe3\x7a\x00\xe9\x40\xa6\xbb\x47\xd5\x40\xeb\x93\x37\x2d\x69\x55\xc5\x74\x94\xf0\x78\x4b\x91\x81\xe7\x28\x15\xb1\xe6\xd6\xbe\x8a\xb8\xee\x88\xe7\xee\xa4\x4d\x74\xe7\x12\x1e\xbb\x9c\xa7\x3f\xcd\x6d\x4d\x52\xc0\x0b\x9c\xc4\x96\x3d\x22\x4a\x61\xa8\x52\xd9\x0b\xa9\xc7\xc1\x49\xdf\xe3\x6b\xb0\x17\x20\x9f\x5d\x80\x53\x60\x87\x10\x79\x73\xec\x38\x3e\x02\xf4\x79\x00\xc3\xc7\x2c\xb8\x02\x3c\x0b\x9b\x98\x13\x6f\x68\xc3\x63\x4a\x12\xc5\x80\xcd\x0a\xea\xed\x8b\x5d\x0f\x03\x2b\xf1\x8a\x68\x4e\x9d\xf1\x9c\xa2\x61\x69\x86\x3b\x10\xfa\x32\x0d\xe3\xff\xd1\x92\x6f\x3c\xda\x18\xa4\x99\x0d\xe1\xc4\x74\xf0\x18\xc2\x92\x1a\xa8\x5e\x53\x37\xa5\xc7\x9d\xb8\xb2\x67\x1d\x51\x5c\xee\xf1\x4d\xb4\x38\x78\xfb\xda\x8f\xa1\xae\x70\x51\x5a\x81\x4d\x79\xaf\x6c\x49\xfb\x04\x2e\xea\x80\x2f\xa2\x26\x05\x11\x46\xe0\xb8\xd6\xdb\x92\xfe\x12\x95\x00\xeb\x21\x71\xcb\x9d\xb8\x01\x55\xcf\xf5\x70\xc4\xf3\x78\x63\x06\x77\x6b\x7c\x8c\xf4\x2b\xb6\x6b\x5d\x16\x79\x7d\x42\x9b\x9a\x81\x0d\xcd\x8e\xd2\xd1\x6f\x8e\x28\x9b\x9e\x97\x5a\xec\xcc\xc3\x4a\x84\xa1\x6e\xaa\xcd\xd5\x06\x51\x55\x2a\x8f\x6e\x3f\xb9\xf0\xfe\xfd\x4d\xa5\x8c\x13\x8b\x39\x3e\x3c\x6f\x8e\x31\x09\xc8\x30\x68\x6c\x69\xd5\x67\xef\x0a\xb7\x63\x4e\x0c\x9a\xb4\x49\xcd\xe9\xba\x36\x0f\xb1\x49\x4f\xd3\xd4\x94\x34\xbb\x1a\x6f\x08\xd5\x31\xba\xde\x69\xa3\x6d\x28\x37\x06\x34\x28\xb1\x35\x5f\x4c\x0f\x36\xb1\xb9\xe0\xe2\x3a\x5d\x19\x07\x54\xb5\x86\xdb\xc2\x40\xf4\xd7\x6d\x16\xf3\x39\xe2\xbe\x14\xf6\x61\x53\x79\xa3\xb6\x62\x81\x8d\xd8\x9e\xb0\x6b\xf5\x90\x56\x75\x51\x12\x75\x5f\xbb\xc0\x80\x87\x88\x17\x4d\x63\x8c\xd0\xd2\x5a\x63\x09\x41\x20\x6c\x98\x40\x6d\x1f\xd2\xac\xa8\x8a\xed\x83\x79\x76\xa0\x74\x0d\x7f\x01\x58\x4c\x91\xa5\x10\xe4\x50\x96\xa2\x17\xef\x01\x5a\xd6\x9b\x90\xad\xbf\xde\x28\xff\x12\x97\x20\xa7\xcf\x45\x9a\x3d\xf0\x06\x57\x94\x7a\x68\x8d\x0b\x9f\xeb\x40\x16\x81\xac\x5a\x8e\xcb\x0e\xc0\xe1\x68\xd7\x60\x0d\x68\xb1\x56\xed\x37\x04\x6c\x48\xd0\x99\x88\xb2\x3d\xf1\x5e\xdc\x8f\x72\xfe\xa8\x42\xb2\x4b\x48\x9a\xc4\x60\x78\xc9\x5b\x2a\x88\x75\x5a\x8b\xa2\xd0\xc4\x72\x8e\x9b\xf6\xb8\x1e\x41\xce\xbd\x65\x28\x13\x22\x42\x12\xf4\x55\xae\x13\x78\x94\xba\xd3\x23\xde\xf3\x02\x56\xff\xd4\x65\xd1\xd1\x5b\x68\xa3\xd7\x27\xdb\x4c\x66\x8f\x80\xb5\xd5\xfe\x26\x36\xb0\x16\x95\x41\xb9\x76\x33\x07\xf2\x53\x6a\xa1\xbf\xd6\x8d\x29\xab\x1e\x8a\xb2\x56\xdb\xb8\xaa\x58\x0e\xda\xac\x7b\xca\xb5\x94\xe6\xfc\xad\x78\xaa\xae\xe1\xe0\x10\x4f\x32\xab\xe7\x32\x5e\x7d\x96\x3f\xfb\x3d\xa7\x6b\xd0\x7a\x25\xc3\xfb\x21\x8a\x52\xd5\xea\x8d\x39\x87\x13\x0a\x0a\xc5\xcd\xc6\x34\x3f\x7d\x4e\x1f\xe7\x53\x73\x61\x4e\xd7\x6d\x5c\x9a\x5b\xce\xd3\x08\x6a\x9e\xf7\x6a\x13\xaf\x1e\xd2\x5c\x9f\x94\x3a\x4e\x6c\x69\x6f\xe0\x32\x55\xcc\xc0\x84\x41\x73\x5a\xf4\x54\x4d\xb5\xb2\x38\x09\x57\xd6\x40\x87\x20\x15\xe8\xd0\x25\x19\x58\x8c\x61\xb5\x4b\x31\x6e\xb5\x06\xcb\xe7\x0b\x16\xe4\x78\x56\x77\x55\x97\xb1\xb9\xbf\xd6\x45\xf9\x68\x6c\x36\x3a\x9b\xe1\x89\xe9\x0a\x27\xd1\xb8\x14\x05\x9e\xc6\x50\xae\x9c\x62\x81\x0f\x72\x82\xa2\x20\xf6\x36\xfd\xaa\xb3\xaa\x6f\xbf\xb7\x8d\x53\x60\x2b\x02\xb3\xd5\x7d\x33\x29\xe3\xc7\x34\xbf\xaf\xfa\xaa\x42\x13\x36\x31\xb7\x81\xeb\x0f\xfd\x9e\xde\xc8\x45\xb9\x1d\x9d\x49\x73\xd0\x3c\x2a\xb0\x81\x38\x5c\x35\xdd\x18\x6b\xbc\x35\xb0\x62\xde\xa3\x39\x01\xba\x7b\xb3\xe0\x35\xe2\xd2\x98\x0e\xf0\x45\x8f\x36\xeb\x08\x26\x17\x7c\x22\x38\x9b\x05\x2e\x44\xac\x01\x94\x48\xf2\xa6\x70\x13\x97\x9f\x77\x5b\xe4\x60\x5f\x56\x9a\xe8\x23\xf9\xa7\x36\x0b\x45\x2c\xf3\x54\x2e\xf9\x08\x2a\xf8\x60\x9b\xac\x8a\x5d\x19\xdf\x6b\x99\xed\xf1\xb0\xce\x40\xf2\x17\x43\x00\x96\xce\x15\xd1\x1e\x8c\x10\x02\xb3\x39\x35\xaa\xfd\x19\x73\x85\x79\x06\xbd\x79\x53\x1d\x63\x45\x57\xbc\x29\x76\x54\x17\xa7\xbf\xd6\x76\x1c\x78\x62\xcc\xa3\xfc\x3d\x90\x56\x6a\x15\x67\x99\x4e\x54\x6f\xba\x8d\xff\xb1\xd3\x3d\xd8\x2a\xd1\xd7\xd8\x38\x6d\xe4\x14\xb8\x21\x87\x39\x30\x2f\x96\x0d\xa2\xc8\x03\x03\xb8\xf0\x3a\x1c\xcc\x87\xa3\x91\x73\xb8\x69\xfc\x16\xfa\x6b\x9a\xaf\x0b\x9a\x39\x7c\x60\xa0\xc6\xf1\x42\xff\xdc\xf8\xd9\xfc\xdd\xcd\xd8\x0c\xe9\xcf\x37\x63\xb5\xab\x30\xc4\x6e\xeb\x8e\xdd\x32\xbc\x5a\x5c\x05\xac\x5c\x6c\x4e\xed\xe4\x64\x55\x40\x22\x0b\x50\xdb\x40\x5e\xa3\xde\x2f\x6e\xc6\x81\xba\x2d\xaa\x7a\xbe\x2a\xd3\x2d\xcc\xd4\xed\xd5\xb5\xef\x50\x3e\xec\x36\x71\xee\x4d\x55\xe8\x8d\x42\x2d\x67\x40\xcc\x90\xeb\xf7\xed\xe4\x5d\xa0\x7e\x1e\x5e\x43\x73\xfe\x76\xfb\x2e\x54\x38\xa2\xad\x0f\x22\x88\x56\xd7\x0c\x51\x8f\x39\xd3\x4d\xee\x83\x59\x1f\x58\x49\x9b\x80\x79\x0f\xfc\x88\xcb\xbd\xf7\x3d\x73\xaa\x81\x86\x2d\xa4\xe3\x2a\x7f\xbc\xc0\xc7\xb2\x72\x03\x57\x8b\x2b\x36\x2e\xe9\x0b\x58\xe9\x56\x64\x95\x0d\xec\xd2\xb1\x24\x87\xd6\x09\xd7\xf2\x51\x88\x1f\x32\x2d\x3a\x34\xa2\x16\xd8\xbc\xdc\xd3\xb1\xe1\x37\x13\x5a\x56\xec\x6a\x33\xd1\x4e\x4b\x22\xcf\xf6\xee\xda\x5a\x00\xc9\xd4\x6d\x7c\xaf\x7b\x4c\x4f\xb5\x46\xe3\x5a\x38\x9b\x14\x81\x87\x8f\x6e\xcd\x5c\x20\x70\x3a\x50\xdb\x6c\x47\x38\x3a\x87\x20\xdf\x62\x8d\x23\x75\x56\x6b\x62\x5a\x37\xce\x5b\x60\xec\xa6\x74\x89\xf1\x1c\xed\x40\xef\xb5\x2f\xca\x0a\xb8\x06\x74\x83\x6c\x71\xab\xdf\x00\xcc\xa3\x5a\x21\x0f\x47\x5e\x6a\x26\x81\x42\xe3\x58\xb5\x08\xdc\x0b\xb6\xdd\x44\x35\x14\x74\xf4\x9b\x7c\xc6\xaf\xb5\xca\xcd\x2b\xa1\x7d\xe6\x4a\x13\x3c\x45\xd0\x18\x66\xb8\x65\x67\xe8\x9b\x0a\x5f\x10\xa8\x6d\xa9\x57\xda\x46\x1a\x96\xfa\x3e\xcd\x73\x52\x5c\x87\x1f\x14\xc9\xde\x55\x9a\x7f\xad\xdd\x1c\x58\xb3\xbe\x27\xdc\x9f\xad\x2e\x2b\x74\xcc\xa5\xea\x81\xf3\xc6\x2a\x2f\x02\xd9\x36\xff\x71\xf3\xd2\x45\xcc\x16\x59\x2f\xca\xa1\xb1\x89\xfa\xf9\xd3\x7f\x75\x52\x21\xe8\xc4\x54\xbb\xe5\x2e\x4f\xeb\xd6\x03\x85\x81\xc9\x3e\x16\xd4\x05\xe8\x55\x5a\x99\x4b\xea\xe7\x4f\xff\x95\x6a\x5d\xd1\x71\x30\xff\x46\x23\x5f\xe7\x90\x65\xaa\xc4\xea\x70\xb6\x8f\xf5\xbc\xec\x37\x5a\xbe\x97\x3a\x7e\x6f\x8c\x2d\xf3\x6b\x02\x75\xe0\xda\xe4\x7b\xdf\xf6\x0b\x90\xf0\x1b\x4c\x9b\x33\x3d\xbc\x53\x2e\xe9\x0d\x1c\xdc\x1e\xe2\x62\xbd\x40\xf5\xae\x34\x8b\x43\xc3\x3f\x23\x84\xb6\xf3\xaf\x8b\x52\xf5\xde\x83\xa7\xb0\xef\x19\xd7\xa2\x50\xbd\x5b\x0a\x3a\xc2\xe0\xc0\xf2\xe9\x59\x02\x37\x67\xf3\x3e\x1a\x1b\xd1\x4b\x0f\xb5\x8c\x1d\xbc\x1d\x6a\xe2\x1f\xa8\xc4\x97\x1b\xd3\x13\xaf\x88\x23\xd9\xe2\x28\x9d\xe9\x6c\x57\x8f\x67\xfb\xf2\x91\xf7\x91\x2b\xaa\x1d\x13\x56\xa5\x72\x18\xfa\x42\xda\x8e\xb8\x61\xa4\x0a\x7d\x7d\x20\xa6\x23\xfb\x01\x46\x77\x75\xe0\x2d\x60\xfa\xba\x20\x2a\x5a\xef\xb6\x1e\x65\x29\x34\x45\xad\x36\x83\x0d\x47\x2e\x77\x35\x9e\xbe\x50\x1c\x60\x3c\xa4\xca\x92\x95\x42\x15\xb6\xa5\xf9\xfa\x41\x80\x9b\xcd\xad\xc3\xd7\x3d\x9b\xc0\x87\x5a\x67\x06\x09\x0e\x86\xb4\x52\x5f\x0a\x62\x50\x40\x3d\x0c\xa6\x2d\xa1\xaa\x2c\x33\x57\x76\xf7\x36\xc8\x2c\xce\x43\xf5\x21\x9a\x5d\x0e\x16\xa3\x1b\x40\x1e\x8e\x26\xef\x8e\x84\xfe\xed\xa1\xc4\xa9\x33\xcb\xfd\x30\xd8\xcb\x02\xe2\xcd\x3c\xaa\x3f\x74\x75\x07\xc9\x9e\x10\x43\xe7\x20\x0f\xcd\x3b\x85\xd0\x5e\x32\xd9\x0a\x4b\x07\x65\x0d\x0d\xf1\x4b\xa6\xee\x05\x9c\xd6\x4d\x80\x38\xc2\x6a\x33\x71\xf4\x4b\xd4\xf5\xc3\xd3\x3b\x95\x6f\x24\xf7\x2c\x44\xd4\x98\x1c\x5a\x70\xc3\x16\xaa\x58\x62\xd0\x92\x4f\x9c\xb2\xc8\x28\x5c\x12\xc3\x4e\x31\x56\x2e\x81\xc1\xcc\x70\x88\xf3\x97\x8e\x4b\xcc\xd0\x7e\xd6\x7e\x6c\x2b\x54\xef\x99\x9a\xc9\x42\x97\x30\x44\x66\x6c\x79\x96\x1a\x32\x9d\xd7\xc4\x1c\x0e\x47\x11\x3e\xb3\x83\x11\x14\xc0\xe8\xe5\xbd\x56\x3a\x2f\x76\xf7\x0f\x42\xb8\x4a\x36\x63\x57\xd5\x98\x0a\xc7\xf3\xb1\x19\x34\x34\xce\xa3\x95\x75\x97\x0b\x0c\xbe\x93\x69\x88\xd6\xe0\x34\xb8\xa0\x23\x44\xb8\xdb\x91\x47\xaa\xa7\x31\xd3\xc5\x1d\x6c\x72\x96\x72\x6f\xa8\x1c\x8a\x16\xb6\x1a\x4d\xd4\xbf\xdd\x0d\x26\x0b\x42\xdb\x52\x57\x19\xd0\xc6\x66\x02\x75\xeb\xd8\x0e\x8a\x69\x3d\x32\x75\x53\x00\x69\xb3\x81\xad\x0d\xbb\xcf\x7d\xeb\x0b\x04\x9e\x1a\x57\x4e\x40\xe3\x65\x66\x0f\xc0\x52\x80\xbe\x3a\x3b\x3d\x75\x0b\x5a\x44\xb7\x1a\x6b\xdb\xda\x0f\x9e\xcf\x6c\xc7\x5b\xe7\xab\xac\x20\xae\x00\xd7\x52\x6c\x08\x9b\x85\x65\xb9\x0f\xd4\x2a\xd3\x71\x99\xe1\x46\xb6\x66\x0b\x00\xf7\xe1\x78\x11\x4f\xff\xa1\xcb\x71\xc7\x53\x04\x42\x81\xf8\x74\x6c\x7b\xd3\x9b\xe7\x0f\x2e\xe3\xd5\x67\xfc\x5c\xa8\x2e\x8b\xfa\x81\x5b\xe4\xd6\x48\x47\x7b\x5c\xc4\x02\x76\x5f\xe5\x07\x09\x1d\xca\x83\x97\xe9\xc2\x6f\x11\x3e\x9c\x1c\x6c\x6c\xee\xce\xf4\x0f\x6e\x7a\xac\x1c\xcc\x32\x74\xe8\xad\xe1\x82\x56\xc0\x3f\x90\x74\x5f\xd8\x46\x79\xa2\x8c\x13\x0d\xd2\xf3\x52\xad\x96\x00\x3c\x6c\xe9\x51\x6f\xa9\x73\xe6\x2c\xa1\x02\x99\x10\x48\xef\x99\x6a\x03\x13\xa7\xba\x92\x19\x17\xf7\x3d\x88\x95\x80\x2c\x1c\x76\x79\x6f\x13\x82\xa2\x8d\x4d\x2b\x06\x9c\x96\xb8\x4e\x2b\xbc\x94\x2b\xed\x51\x92\x91\x2b\x50\x13\x41\x7f\x5c\x79\x89\xde\x3d\xb1\x75\x30\xa1\x2b\x70\xbb\xe0\x46\x19\x31\x97\x10\xb3\x6b\xc1\xa4\x02\xa8\x85\x4f\x75\x33\xd2\xc0\x76\x5f\x14\x50\x75\xbc\x49\xf3\x62\x07\x87\xd9\x3a\xad\xdd\xd2\x32\x53\x48\x59\x2c\x56\x2d\x46\x81\xa1\x22\x87\x81\xa8\xa0\xe4\x04\xd8\x1e\x72\xb8\x21\xd7\xa9\xa4\x7d\xed\xf3\xd8\xc6\x2b\xc8\x37\x89\x35\xe7\xd0\x97\x88\xde\x31\x8f\x34\xc6\x75\xf2\xf7\x78\x05\xd4\xc9\x00\xfb\xeb\xd8\xdc\x7e\xf8\x9f\xdc\xab\x03\x66\xe7\xc1\x1d\xeb\x76\x1e\xd9\x8e\x96\x4b\xbe\x15\xf3\x69\x78\xb9\x7b\x29\xfe\x07\x18\x21\xd7\x84\x3d\xd8\x68\x70\xb8\x61\xb2\xb1\xfb\x53\x08\x14\x03\xa4\xe4\x49\xae\x6b\xc8\x29\x58\x25\x67\x40\xc3\x38\xc7\x8d\x63\x45\xf4\xb9\x13\x74\x83\x29\xbd\x62\x6c\x04\x62\x23\x07\xb8\xcd\x63\x9e\x15\x71\xa2\xe4\x67\x4e\xd8\x27\xe6\x27\x98\xfd\x51\x17\x2b\x70\xfc\x28\x2d\x5b\x77\x74\xb2\x75\xf8\x41\xde\xa9\x58\x53\x3d\x19\xef\x1d\x7b\xcb\x30\xd3\x49\x46\x31\x6d\x42\x9d\xd9\x71\xae\xcd\xed\xe6\xf1\x01\xef\x12\x0c\x68\xe9\x6d\x15\x38\x0b\x15\x3c\x14\xd5\x2c\x03\xf7\x67\x39\xcd\xd5\x3f\x76\x31\xf1\x23\x43\x05\x28\x80\x03\x9c\x01\xd2\xea\x0d\xa0\x8e\x89\x90\xb0\x7e\xd8\xf1\xa8\x41\x16\x9d\xb3\xad\x78\x25\xd9\x79\xd8\xe5\x75\x9a\x39\x72\xd8\x22\xd7\x6a\x6f\x7c\x30\x94\x9c\xc0\xae\x9a\x7e\xa5\x1b\xdd\xba\x66\x73\x6f\xb6\xbd\x8a\xac\xfa\xa1\x84\xbb\x17\xf0\x4e\xf1\xbd\xe3\x6b\xaa\xe3\x34\x73\xd7\x4e\x8c\x61\x3c\x4b\xc1\xe3\xb9\x4e\xa3\x9a\xb9\xf3\x34\x46\x69\x8d\x89\x2a\x68\xde\x93\xc0\x59\x3f\xc4\x08\x21\xf0\x08\xed\x5d\xf2\xa8\x01\x93\xbd\x2e\xc0\xa8\xf2\x28\x03\x81\x99\x08\x6c\x86\xa6\xb1\x00\x23\x0f\x70\xc1\xfa\x41\x6f\xcc\x5a\x7a\x00\x2f\x14\xf1\x7f\xc6\x24\x84\xf7\x13\xb3\xbe\xda\x6d\x13\x18\xdf\x06\xca\xcc\x5a\xef\x54\x41\xec\x55\xfb\x3c\x67\xbe\xc6\xaa\x99\xba\x6b\x75\xad\x33\xef\x09\x9c\xd8\x14\x3e\x6f\x94\xf6\xb6\x51\x81\x92\x7b\xb1\xf5\x3a\x7c\xbc\xf3\x3a\x7d\xf3\xd7\xe6\x6f\x5a\xdf\x5b\xa7\x59\xc6\x3e\x79\x59\xb4\x2f\x86\x00\x57\xa9\x23\xa3\xf6\x36\x04\xf0\x54\xc9\x78\x22\x7d\xbb\xf5\x9a\xba\x30\x7e\x32\x98\xb8\xdb\xa2\xaa\x74\x05\x15\x14\x76\x83\xa7\x75\xa8\x46\xee\xb6\x13\xbb\x35\x29\xe8\x3a\x82\x6c\x9b\x15\x3c\x6b\xbe\x80\xe5\x41\x06\x21\xc8\xdc\xd1\xa7\x5c\x14\x43\x1d\x43\x7d\x6c\xee\x5d\x93\xc8\xed\xdd\x57\x31\xdd\x89\x58\x01\xb0\xb2\x12\x04\x71\xcb\xd9\xc7\x0b\x83\x7e\x4d\x66\xba\x53\xdd\xe3\x4a\x85\x63\xf2\x1b\xe1\xb6\xe2\x24\x5f\xa9\xd5\x23\x71\x44\x07\xc8\xc3\x55\x09\x79\x34\x72\xa6\x0f\xa5\x43\xfb\xce\x6a\xe0\xe3\x0d\x09\x08\xa1\xdd\x84\x7e\xf0\x9b\xc1\xb9\x45\xcb\x5e\xd8\x30\x7c\x5c\x2d\x01\xec\x1d\x29\x45\xc8\x94\x72\x97\xa1\x1a\xa7\x95\x75\xf9\xdc\x68\x82\x85\x41\x7b\x38\xf0\x94\xe2\x30\x2c\xd3\xa4\x5f\xf5\x81\x42\x9e\xd2\x23\x45\x92\x64\xea\xf9\xc0\x14\x9b\x6d\x7e\x8f\xf0\x0f\xdc\xca\x7c\x20\xae\xcd\xd6\xe7\x14\x30\x63\x3b\x0e\x1e\x31\xc7\xc6\x68\x83\x25\x57\xb5\x3f\x0d\x93\x95\x22\x3b\xe8\x5a\x3f\x72\x61\x83\x79\x43\xdf\x72\xb9\x83\x49\xc5\x9b\xd1\x2c\x54\x5a\x0f\x8e\x45\x74\x23\x78\xf9\x86\x21\xe8\x42\x69\x7f\x14\x21\xdc\x56\x37\xf4\x01\x9a\xa6\x69\xc7\x10\x34\x8d\x58\x7e\xcb\x55\xa8\x6c\x00\x86\x8c\xf0\x0e\x8d\x83\xae\xa3\x4e\x29\x15\x85\x6a\x90\x24\x2d\x4a\x85\x26\x27\x3d\x95\xb1\x37\x91\x5e\xd6\x4e\x62\xba\x4c\xeb\x5d\x7a\x2f\xe7\x97\x5d\x9b\x9d\x0e\x26\x4e\xa0\xd2\x0d\xb8\x40\x35\xe4\x72\xec\x6d\xd6\xe5\xa7\x37\xbd\x98\xfb\xf4\x0b\x9f\x5a\x4e\x85\x4d\xc0\xc4\x77\x4f\x9f\x93\x07\x01\x30\x36\x7b\x08\xe5\xf3\xd5\x43\xf1\x98\xf3\x4f\x06\x49\xa2\xf3\x64\xb7\xc1\xf0\x19\x77\xe7\x9d\x18\x78\xce\xf6\x37\xda\x6a\x3d\x07\xb3\xe5\xab\xee\x24\x33\x01\x05\xc9\x4a\x96\x0e\x10\x96\x27\x31\x33\xff\x21\xb7\x2e\x54\xef\xed\xb8\xc2\x25\x97\x83\x2c\x0f\x7a\x9e\xfb\x43\xbc\xc4\x23\xd1\x78\x04\x3c\xe2\xe9\x63\xe3\x6c\x36\xc8\x17\x88\x5e\xd6\x15\x2e\x62\x4a\x7a\x26\xe0\x7e\xa4\x35\x08\xaf\xd6\x7a\x83\x35\x0b\xe6\xc6\xe6\x0d\x6a\xbd\x8e\x00\x0c\x97\x00\xea\xba\xec\x8e\xf3\x41\x89\x87\x2e\x90\x98\x47\xa2\x75\x18\x71\xc6\xba\x24\x1c\xda\x13\xbd\x68\x0e\x63\xc0\x32\x2b\xe6\x08\xe3\x66\xb7\x5a\xfb\x74\x4b\x9d\x07\x25\x5a\x68\xc7\x88\x8e\x4b\x48\x8d\xc7\xb8\xc7\x60\x8c\x12\x5d\xad\xca\x74\xc9\xef\xeb\xea\x2e\x99\x81\xd4\x64\x7b\xbc\x33\xa1\x21\xcf\xe1\xdf\x1a\x73\xd8\x34\xe3\x9d\x84\x45\xe7\x4a\x82\x5d\x4d\x5b\xc8\x19\xf0\xf1\x0b\xcc\x70\x94\xee\xfa\xac\x1f\x59\x88\xac\xf9\xe6\x03\x6b\x17\xdf\xd8\xba\x34\xd3\x1a\x38\xb4\xb8\xa8\x80\x83\xa8\xcc\xdd\x87\x98\x37\x7a\x94\x9b\x50\xae\x9c\xb7\xd7\x63\xb1\x31\x2b\xb1\xd5\x16\x8a\x8c\x3b\xc1\x6a\xf3\x2e\x81\x1f\xb4\x77\x89\x39\xdf\xf6\xa0\xce\x40\x66\xa8\x1f\x99\xa4\xc4\x4e\x51\x3e\x77\xbd\x6a\x77\x0f\xd7\x02\xb8\x76\xe8\xaa\xfd\x09\x53\x36\x90\x40\x6d\x2d\xdf\x56\x7c\x1e\xe2\xef\x7e\x84\xbe\x1d\x7e\xe7\x76\xd0\xf3\x68\xf9\x7a\x67\x95\xdb\xf1\x7c\x67\x50\xf6\x76\xc5\x82\x58\x39\x3c\x06\xdc\x46\x1b\x27\xb4\x6c\x5e\x92\xa7\x67\xc3\xe5\xb2\xaf\x40\x7a\xc6\x36\x8d\xd6\x40\x4d\xd0\x3e\xea\xee\xb8\xe3\xba\xea\x38\x14\x5b\x6b\xce\x1d\x6b\xd8\xfe\xb4\xc4\x8c\x89\xd3\x41\x31\x3f\x01\xac\x8f\xe5\x71\x27\x7f\xa1\x52\x6d\x9d\x40\xce\x37\x8a\x80\x3c\x60\xaf\xfc\x91\xe3\x07\x52\xdb\x6f\x42\x75\x85\x75\x24\xdd\xb3\xe5\xa5\x4a\x2c\xa0\xb2\x6a\xe0\xb4\x64\xd4\xff\x80\xc1\xc3\x2f\x9c\x84\xea\xaa\x20\xaf\x8a\x0c\x3e\xe0\x0c\x23\x1d\xfa\xca\x11\xa4\x2e\xf5\xa1\x76\x10\x13\xfb\xaa\xc8\xd7\x59\xba\x42\x3e\x78\x11\xc7\xea\x02\xf4\xf0\xeb\xa7\x72\xae\xf2\x7d\x67\xe2\x40\xc6\x7a\x5a\x67\x99\xa5\xc6\x32\xc7\x7e\x17\xf8\x0f\xe1\x7a\x88\x11\xb4\x32\x6d\xff\xd8\xc5\x19\x80\x8d\xaa\x2e\x54\x97\x80\xe2\x99\x23\xdf\x06\xd0\x08\xdd\xe8\x94\xad\xec\xd2\xb1\x71\xeb\x1a\x8d\x18\x8c\x0b\x08\x95\x24\xc8\x10\x9b\x86\xa0\x7d\x88\x5e\x87\x6d\x61\x8c\xcc\xdb\x8c\xaa\x2a\xd0\x31\x49\xcd\xad\x90\x24\xde\xc2\x63\x3b\x28\x03\xd3\xb9\xf3\xb2\x3f\x30\xe1\x1d\xb7\x3a\x1e\x82\xf4\x60\xa6\xec\xf2\xfd\x14\x97\xe9\xe9\x58\xaf\x32\xd6\x18\x3f\xb7\x58\x85\xd3\x99\xd6\x6d\xa4\xa3\xf1\xed\xb5\xf8\xbc\x2d\x64\x6b\xcd\xf8\x72\x0f\x60\x19\x73\xbe\x13\xb3\xf4\xc9\x09\xc4\xfc\x10\xc1\x10\xb8\x92\x2b\x78\xc8\x56\x6b\x44\x19\xe9\x47\xdc\xa4\xcc\x22\x64\xb6\xb6\xc3\xb8\x00\x1d\x95\x26\xe2\x67\x55\x94\xf7\x71\x9e\xfe\x93\xaa\xea\x2b\x11\x56\x00\x2a\xb0\x16\x90\x2e\xb6\x98\x8c\x8e\x81\x21\xf8\x99\xf9\xdc\x6e\x8b\xa1\x47\x2c\x37\x48\x30\x55\xdf\x8a\x60\x33\xe0\xab\xf5\x45\x86\x78\xe1\xd7\x1a\xe1\x6c\x27\xca\x96\x27\xae\xba\xad\x22\xc2\x4b\x67\xf3\x1d\x3a\x10\xd4\x34\xcf\xf6\x60\xac\x88\xf7\xb6\x20\x6a\xe8\xe9\xc2\xef\x0e\xe1\xd1\x98\x89\xe9\x58\xc4\x81\x08\x43\x84\xb3\x42\xe5\x1b\xc8\xd0\x67\x1e\x86\x59\xf6\x36\x3a\x30\xce\x4a\x1d\x27\x7b\xb7\xc9\x63\x2e\x0a\x25\x10\x94\xcc\xba\x40\xc8\x55\xc8\xea\x4b\x46\x28\x12\x05\x13\xad\xb0\x35\x24\xf6\x09\x94\xea\xe7\x1a\xc0\x78\x05\x07\xa0\x59\x70\xfa\x21\xce\xd6\x20\xbc\xb9\x17\x79\x32\xb4\xb8\x60\x73\xfc\x68\xab\x07\x91\xc3\x00\x0c\x0a\xbc\xc1\x33\x18\x2e\xe3\xc7\x02\x7a\x36\x5d\xa5\x75\xa7\x2e\xbf\xb5\x59\xdc\x55\x8f\x28\xc5\x04\xc3\x34\xf6\x51\x36\xf9\x8c\xeb\xf1\x98\xa0\xc3\xf6\x6b\xc7\xed\x94\x0e\xa3\x32\x96\x7e\xe4\x06\xc3\x5a\x9d\xae\x4d\x5a\x82\xef\x58\x09\x03\xce\x8c\x0d\x40\x5a\x4a\x2a\x54\xd2\x88\x03\x4b\x81\xd9\x41\x6c\x5d\xe6\x00\xe8\xbc\x71\xde\x84\x6a\x38\xbd\xb9\x1c\x81\xf8\xd2\xd5\x74\x78\x07\x0c\x37\x7e\x04\x0c\x6a\x8b\x1b\xa1\x3b\x57\x8f\xcc\x18\xc1\x27\xd1\x95\x41\xcb\x15\x83\xfd\x8a\xd7\x21\x1f\x54\xaf\x09\x13\xeb\xea\x8b\x5c\xe0\xae\xea\x8a\x91\x71\xf4\x9c\x95\xbe\x04\x75\x98\x3b\xd7\x0f\x98\x1a\xe2\x03\xd6\xaa\xb3\x5d\x31\xcd\xe5\x16\xb0\xed\x4b\x65\x47\xf0\x45\x89\xba\xf5\x9e\x8a\xa5\xbe\x5e\x35\x76\x8a\x0e\x82\x7f\xd6\x37\x72\xc5\xdb\x86\x79\x94\x96\x87\x2f\xde\x85\xed\x29\xbf\x21\xd7\x0c\xd4\xe2\x4b\xd2\xec\xe1\x2e\x57\x90\xb8\xe6\x77\x59\x9d\x6e\x33\x4d\x19\xb3\x55\x9c\x75\xf5\x86\x4e\x0f\xda\x3c\x96\x3d\xb3\x4a\xf3\x7b\x42\xa4\x0a\x5f\x0c\x8a\x7f\xf8\xb1\x1d\x0f\x73\x90\x72\xb3\xb3\x21\x0c\x62\x76\xa8\x53\x92\x31\x2d\xc7\x91\x87\x7c\xb4\x97\xba\x02\x83\x14\xa0\x25\xbc\x52\x76\x79\xfa\x8f\x1d\x32\x43\x26\x09\x79\x9f\xe2\xa4\x4d\xeb\xa0\x01\xba\x09\x5a\xe1\x17\x3b\xe9\x54\x2d\xc7\xfb\xca\x8b\x99\xf1\xfb\xd2\x35\xea\x3f\x83\x2f\xa0\xb3\x4a\xab\x98\xdb\xc0\x8c\x21\x37\xdc\x6c\xe8\x61\x9c\xfc\x7d\x57\xd5\x12\x82\xe4\x5f\xd7\xbc\x64\x9f\x37\x1b\x1a\xe1\x05\x6b\x97\x8b\x05\x80\xf6\x58\x6b\x0f\x88\xb8\x2a\xef\x61\x61\xc3\x56\x4f\x78\xcc\x7c\x9d\x77\x6d\x0c\xc6\x37\x82\x13\x7d\xd0\xf7\xfe\xd1\x39\x8b\xcf\xbc\xbb\x03\x8e\x04\x97\x6d\xf7\xa7\xa5\x1b\x24\x24\x80\xa9\xd4\x1b\x8a\x2e\xda\x5f\xf2\x6d\x74\xa2\x5d\x1b\x4e\xc7\xe3\x88\xd4\xd3\xa6\xd7\xdd\x47\x1f\x55\x98\x92\xd8\x3a\x11\x5d\x57\x64\x89\x77\xe5\x54\x7f\xd1\x89\x88\x41\x20\x77\x35\x39\x41\xab\x66\x3d\xad\x28\x24\x94\xd3\xe3\xde\xd3\xde\x9b\x16\x76\xdb\xf4\x3b\x5c\x67\xba\x4e\x54\x81\xbd\x28\x77\x59\x47\x13\xcc\xd9\xdc\xca\x06\x37\x9c\x46\xd7\x2e\xc2\xc7\x74\xa4\x8a\x3f\x39\x6e\x80\x12\x64\x5a\xb9\xf1\x16\x72\x0e\x37\x31\x01\xca\x64\xa3\x1b\xc9\x98\xb4\xf6\xb5\xef\xbb\x46\xda\xf6\x13\x2f\x0d\xb8\x29\xe3\xce\x03\x12\xeb\x9e\x6a\xa4\x31\x2d\x91\xd2\x3f\xf1\xd3\x01\x3c\x42\xfe\xbc\xb4\xbb\x29\xca\x5a\xba\x06\x0c\x11\x8c\x32\x36\xfb\x6d\xa8\x06\xef\xde\xcd\xa2\x77\xc8\xec\xf6\x71\xb4\x78\xaf\x46\x93\xab\xe8\x36\x9a\x5c\x81\x5a\xde\x74\xf6\xd3\x1c\x21\x8c\xab\x62\xb3\x4d\x7d\x51\x4e\x59\x0d\x96\x32\xeb\x2c\x98\xc6\x95\xc7\xdf\xa9\xb7\x71\x89\x32\xb1\x3e\xbd\x84\x9b\x34\x06\x93\x06\x94\x4b\x36\xb7\x29\xe6\xea\x35\x9b\xd6\x05\xc0\xcc\x65\x46\x1c\xbc\x5d\x82\x70\x39\x5c\x77\x9c\xab\x5e\x7c\x7f\x6f\x46\xa2\xd6\x3d\x8e\xa2\xb8\x90\xaf\x63\xcf\xb0\x76\x97\xec\x1a\xa1\xc6\x99\x71\x17\xf0\x0f\x78\x28\x82\x68\x09\x31\x50\xba\x23\x91\xbf\x88\xc4\xc1\x10\xd5\xd9\x17\x79\x02\x90\xab\xe6\x16\x43\xbc\x2c\x96\xb8\x87\xea\x23\x55\xb3\x34\x8a\xb3\xdc\xd6\x89\x73\x65\x3b\xd2\x28\xc0\xb6\x25\x33\x1e\x9f\xaa\xab\xf4\xb4\x47\xb9\x7d\x00\xe5\xd9\x39\x20\x21\xaa\x99\x0f\x95\x3f\x7b\x41\xfc\x11\xb3\x8f\x59\x4b\x5f\x64\x22\x44\x96\x51\x5d\x40\x19\x88\xd3\x88\xaa\x39\xbd\xd6\x0d\x5b\xa0\xc8\x65\x47\x99\x1a\x65\x42\x62\xb4\x2c\xc8\xfa\xa6\x1b\x97\x84\x86\xc4\xd8\x78\x91\x6b\xe9\xe9\xf8\xe1\xbd\xc2\x47\x1a\x2d\xcb\x78\xf5\x59\xd7\x6d\x3b\xb3\x39\x7a\x56\x6e\x1f\x14\xe2\xca\x22\x4f\x57\x32\xcc\x03\x99\x62\x44\xd4\x74\xd6\xdb\x89\x6f\xa1\x12\xfe\xd4\xb1\x76\x3e\xe8\x3d\x81\x8c\x10\x6b\x5d\xe4\x0d\x74\x56\xbb\xa9\x48\x85\x63\x1b\xc7\xf4\x78\x8b\xd9\x60\x32\x1f\xc3\x4e\x06\xa3\x4d\x94\x97\xa4\x95\x0c\x41\xb9\xba\x78\x9f\x74\xbd\x2a\xac\xff\x22\x91\x93\xee\x39\xed\x64\x57\x47\xb6\xc3\x9a\xd6\xa0\x13\x9b\xc5\x2b\xb3\xd7\x0e\xda\x67\xf2\xe1\x16\x39\xc6\x9c\x3e\x1d\x4e\x52\x5a\xb6\xa9\x7d\x02\xcf\xf5\xb2\xc4\xba\x8d\x76\xcb\xf0\x4b\xb7\xed\x63\xc9\x82\x9b\xba\x6c\x3e\x45\x9c\x59\xcd\x5d\x75\x6d\x9f\x1a\x0d\x88\xdb\x42\xc6\xcd\xbb\x98\x43\x93\xbe\xc5\x55\xb5\xd3\x08\x6c\x9f\x74\x99\xe8\x07\x09\x7e\x24\xc5\xb0\xed\x4b\x94\xdf\x03\xb6\xe8\x10\x27\x1b\x03\xfc\x0e\x74\xbe\x10\xad\xa4\x6b\xd1\xba\x0a\xc6\x20\x74\xd2\xc7\x49\x5a\x75\x6b\x81\xc9\x51\x39\xf4\xb6\x56\xb3\x20\xba\xee\xb4\xab\xdd\x6b\x83\xee\xef\x03\x0c\xc6\x38\xd4\x71\x9a\xf1\x09\xe6\xe2\x53\xcd\x8c\x41\xfa\x8c\x79\xd8\x88\x85\x4b\x74\x3a\xbe\x5f\x9e\x86\xc7\x76\x07\xf4\xcd\x4a\x6a\xe7\xb5\xdc\x27\xce\xfa\x24\xa8\xba\xdf\x12\xeb\x16\xb3\x4a\x5a\xe6\x92\xda\x41\xca\xa0\x81\x96\xe5\x30\x9a\xdd\x8c\x26\x76\xb7\x4b\xf4\xae\x2c\x21\x0f\x04\x61\x71\xd0\x51\x4f\x6e\x87\x00\xe9\x8a\x94\x27\x57\x65\xd7\x55\x67\xed\x62\xbe\x57\x71\x5d\xeb\xcd\xd6\x63\x21\x2e\x5e\xfc\x7a\x2c\x35\xfd\x52\xa4\x09\x6b\xfc\x65\x59\x43\x50\xd6\x71\x34\x83\x97\xdb\x96\xae\x90\xf9\x46\x8b\x20\xe6\x4a\x7a\xc8\x9f\x9b\x2d\xf6\x25\x2d\x0e\xed\xc2\x9a\xd0\x58\x4e\xbd\x13\x63\x9e\x92\x65\xb1\xc5\x80\x00\x89\xf8\x34\xa7\x04\xda\x71\xdc\x77\xca\x70\x88\x14\xa7\x44\x3e\x30\xc0\x00\xb8\xaa\xee\x22\x52\xe0\x60\x10\x81\x4a\xd7\x69\xee\x77\xba\xf2\x1a\x46\xa2\x16\xcb\x3e\x1c\x8b\x71\xae\xf3\xda\x0a\x37\x74\x3c\x7c\x1d\xa7\x19\x84\x8a\xcd\xa6\x21\x84\x2a\x27\x8e\xec\x70\x70\xdd\x52\x53\x23\xdf\x11\x55\xbf\x3d\x55\x49\xbc\xaf\x64\xf6\x5c\x57\x95\x93\x42\xb8\x29\x4a\x5d\x30\x6e\xfb\x37\x0c\xa2\xe8\xd3\xc1\x2e\x41\x4f\x18\xbc\xfd\xe2\xbe\x90\xe9\x94\x62\x04\x17\x21\x9d\x16\xca\xe6\x0b\x0c\x3b\x87\xf7\xe0\x8a\xc1\x6a\x51\xe6\x47\xe8\x0b\x24\x4f\xb3\xb9\x0e\xec\xbd\xda\x51\x9a\xcf\x3d\xd5\x8e\xef\x85\x37\xbe\xb8\xca\x4d\x73\xb6\x36\x49\x44\x91\x7a\xb8\xd2\x7d\x5e\xf0\x03\x7b\xa2\x55\xfe\xed\x76\x91\xb8\x6b\x30\x30\xce\xb2\x8c\x2d\xad\x65\x36\xd7\xec\x0b\x98\xba\xec\x50\xd9\xb9\x6c\x8c\x63\x40\x97\xe2\xb3\xa0\x6a\x59\x7b\x33\xed\x16\x40\x20\xbb\xed\x1c\xa5\x76\xce\x04\x83\x1d\x36\x1f\x63\x3b\x69\xe9\xfc\x40\x60\x0e\xdb\x61\xc9\x6f\x90\x52\xe5\x34\x54\xd7\x77\x8b\xbb\x59\xa4\x66\xd1\x87\xd1\x9c\xfd\x70\x29\xc3\xcd\xd1\xae\x43\x24\x56\x1e\x99\x6c\xae\x81\x33\x04\x19\x65\x1b\x36\x82\x7a\x9a\x6d\xab\x8b\x3c\x16\x12\x79\x1e\x23\x2d\x33\xc8\xb2\x4a\x4d\x9a\xab\x6a\x9b\x96\xa9\x2b\x32\x23\xec\xf8\x17\x86\xef\x2c\x77\x35\xd9\x6f\x20\xfb\x90\xe6\x2a\x01\xb8\x25\xc4\x6b\x91\x8b\x04\x5e\xb1\x2d\x8b\x65\x46\xec\xc0\xab\x22\x5f\xe9\x32\x87\x84\xa6\x27\x79\x74\x9f\xef\x80\xa2\x8b\xa9\x89\x5e\x61\xad\xac\xe4\xb8\xf5\x14\x29\x01\x1f\xf1\x42\xb6\xdb\x66\x98\x9f\x85\x39\x99\x04\x59\x1e\x1d\xf8\x9d\x26\xa2\x52\xec\xc9\x1e\x6d\x49\xe0\xb4\xe3\x4f\xf5\x64\x45\x4d\x4a\x09\x3a\x96\xfb\xe6\xec\x1c\x94\x5a\xdb\xda\xb8\x43\x34\x87\x84\x9c\xb6\x21\x3a\x2b\x22\x6a\x1b\x54\x72\xc4\xdb\x6b\x82\xaf\x04\x2d\xe0\x00\xc7\xe0\xbb\x55\x66\x98\xca\x78\x5d\xf7\x39\x09\x71\x68\xd9\x3d\x41\x9a\x80\x8d\xd9\x1b\x7f\xd9\x1b\xe2\xf6\x55\xc7\x06\x32\x71\xf9\x9a\xd6\xf2\x57\x10\x37\xf9\x3b\x36\xaf\x3d\x9d\x65\xf1\x75\x0f\x30\xff\x44\xaf\xd2\x84\xfd\xd1\xf5\xae\x36\x87\x63\x8b\x83\xd9\xf2\x7f\x3a\x46\x27\x42\xfa\xc2\x83\xbe\xa9\x18\x52\xe2\xb8\x15\xcd\x04\x40\xc9\x10\x57\x88\xba\x11\x91\x47\x0e\xa5\xf0\xfe\x49\xd7\x48\xed\xb8\x8d\x25\x62\x91\xf3\x4a\x9e\x13\x7c\x76\x16\xaa\x59\x84\x27\x05\x95\x9c\xf5\x6e\xe2\xaa\x32\x27\xcf\xcd\x2e\xab\x53\x8a\xeb\x0e\x8b\x2c\x8b\x97\x05\xa9\xa6\xcf\xd3\x5a\xf7\x20\x11\xd6\xbb\xb9\x19\xe2\x3f\xfb\xa2\xd0\xf4\x63\x51\x66\x89\xfa\x68\xc6\xe4\xa3\x5e\xa2\xe2\x38\x25\x7e\x78\x46\x2a\x77\xb9\xc0\xbd\x86\x7e\x3a\x3a\x10\x95\x05\x21\x57\xa2\x1e\x64\x1d\xaf\xd2\x0c\xd1\x91\x74\x5f\x41\xf9\x6b\x5d\x00\xd6\x9a\xec\x78\x52\x6b\x19\xf0\x58\x3e\xa6\x9f\x53\xab\x88\x0e\x9f\x37\xc3\x0f\x5f\x30\x4e\x7d\xce\xe9\x55\xaf\xec\xb2\x84\x92\x99\xc1\x0b\x46\xc2\x0d\x42\xaf\xcf\x69\x03\x17\x24\x04\xa1\x4c\x37\x2a\x95\x26\xb7\xba\xdd\x6f\xc0\x0b\x7b\x5a\x9b\x90\xcb\xbc\x19\xc2\x33\x60\xa6\x7a\xc3\xe1\xc9\xe5\xa7\x93\xf9\x40\x16\x17\xb7\x94\x34\x07\xb5\x0d\x24\x9d\xcc\x1f\xcc\x92\x1e\x64\xe9\x67\xad\x2e\xc2\x53\x6b\xc8\x78\x14\xd5\xad\x27\x0c\x99\x4d\x1d\xa2\x84\x66\x3f\x9e\xac\x8b\xf2\x64\x5b\x16\x6b\x48\x70\xdb\xdf\x72\xb8\xd4\x01\x42\x31\x08\x5b\xac\xd5\x72\x57\xa5\xb9\x39\x97\xd3\x5c\xcd\xe3\x5c\x5d\x97\x71\xbe\x4a\xab\x55\x11\xa8\x61\x9c\xa5\xeb\xa2\xcc\xd3\x18\x80\x99\x00\x5e\x8f\x2b\xde\x34\x96\x31\xce\xdf\x3d\x02\x1f\xd8\xe0\xd7\x06\x9e\x12\xb8\x4f\x5d\x66\x1b\x87\x6b\x64\x79\xe1\x5d\x39\x76\x21\xcb\x50\x4a\xcd\xff\x88\x85\x57\x9a\xe6\x14\x8b\x00\x72\x0a\x38\xb2\xa1\xa1\x8c\x71\xe1\x82\x62\x6f\x17\x0d\x72\x98\xab\xb4\x52\x3d\x9d\xa5\xf7\xa9\x63\x01\xb1\x18\xf0\x1e\xa1\x64\xbb\x24\x68\x9b\x2e\x74\xba\xe6\x2a\xa9\xcf\x74\xd8\x00\x0a\x1a\xed\xbc\x26\x79\xba\xaf\xbe\x5d\x6c\x34\x6a\x9d\x79\x14\xe3\x69\x65\xda\x47\x2c\x0b\x96\xd5\x02\x94\xa0\xec\x20\x25\x5d\x5d\x77\x81\x5c\xf8\xfe\xf1\x59\x5f\x3d\xc4\x50\x90\xe9\x12\xd6\x15\x7e\x9e\x83\x07\x95\xa5\x00\x62\xc1\xba\x47\xd4\x5e\xdb\x55\xfe\xeb\xac\xbd\x68\x69\x39\x91\x7a\xf3\x3b\x9b\x9f\x2b\xb6\xba\x8c\x6b\xbe\x88\x14\x1f\x35\x9c\x8d\xe6\xd9\xc3\xdf\x74\xef\x3e\x1c\x23\xde\x3a\x9e\x10\x3d\xfc\x1e\x0f\x06\xb4\x5a\x08\xbc\x36\xd8\xdd\xef\xaa\x9a\x1a\xf3\xbd\x17\x89\xd0\x3c\xcd\x87\x66\x39\x54\x83\xab\xab\x68\x72\x75\x77\xf3\x83\xf1\xdd\x5c\xea\xb9\x11\xfb\x07\xcb\xd2\xc6\x8a\x8f\x16\x1d\x1f\x03\x6a\x1a\x1b\xc6\xb7\x17\x3d\x09\x8d\x05\x22\x24\x23\xa1\x86\x8d\x1c\x47\x22\xd3\x2a\xb6\x04\x4c\x88\x1c\xb2\x7d\x8f\xc9\x59\x3f\x62\xf3\x77\x08\xe1\x59\x27\xc9\x71\x1e\xfc\x20\xb9\x53\x57\x7d\xf5\x29\x1a\xcc\xd4\xa7\xe9\xdd\x4c\x4d\x06\x37\x51\xa8\x6e\x5d\x8c\x2b\xad\xa4\x98\x3f\xba\xd1\x5e\xad\x0d\x60\xdf\x24\xef\x71\xf2\x44\x1c\xee\x79\x23\x34\x50\x82\xf3\x55\x75\xd9\x50\x6d\x86\xfe\x43\x26\xc0\x8f\x78\xc2\xe5\x5d\x94\x4f\x81\xf9\x71\xab\x44\x33\x60\x9d\xfb\x66\x49\xa6\xa5\x71\x69\xb0\x4b\x77\x64\x96\xd8\xd5\xd1\x36\x78\xf3\x74\x8f\x7b\xe1\x11\x15\x71\xc1\xfa\xe8\x6a\x6a\xbb\x94\xb4\xab\x6c\x34\xf0\xd2\x68\x3d\xd3\xf7\x30\x0c\xb1\xf9\x3d\x95\xa5\xb9\x76\xda\x83\x3f\x1c\xd9\x54\x74\x47\xdc\x11\xe9\xc1\xc6\xa3\x39\xa8\x01\x8d\x66\x6a\x31\x5a\x8c\xa3\xb9\x28\xa9\x69\xb7\xc8\x7d\x87\x23\x27\xf4\xd1\x56\x75\xab\xfb\xe4\x73\x3d\xb7\xdc\x35\x5e\x2f\x41\x3c\x64\xa3\xdb\x32\x66\xb6\x20\xf5\xa1\xd4\x3a\x50\x1b\x5d\x42\xbd\x01\x18\x52\x8f\x85\x8a\x9d\xba\x24\x5c\x25\xd5\x8e\xd2\x28\x55\x5a\xef\xe8\xe2\x61\xa7\xd1\x2e\x62\x01\x08\xcb\xeb\x32\xfd\x82\xb4\xee\x8e\x93\x86\xb9\x46\x57\x45\xa2\x03\xf5\x28\xf9\x37\x31\xeb\x49\x46\x7c\xa5\xdd\xd7\xf0\x6c\x8e\xb3\x4c\x67\xb4\x49\x04\x35\xba\x22\xea\x5d\xc7\x26\x6a\x63\x2d\xcc\x5d\x51\x3f\xc3\xe0\x6a\xae\x49\x48\xe8\x50\x70\x7a\x87\xe7\x49\x83\xaf\xf5\x5f\x4d\xfd\x0c\x7f\xc2\x57\x37\xbb\xed\x1f\x25\xfc\x4d\x7f\x9e\xd1\x7f\x38\x7f\xfb\xb6\xa9\xff\x70\xf6\xe6\xf4\xe2\x2f\xfe\xef\x3f\xe3\x8f\x7f\x0f\x9d\x7d\xff\xfd\x9b\x93\xf3\xd3\xb3\x73\x73\xb2\x0f\xca\xcf\x9f\xcb\x58\x45\x79\xad\xcb\x6d\x99\x56\xba\x42\xb1\x3b\x8a\xa3\x94\x2c\xc5\x7d\xe4\xeb\xfa\x32\xc5\xf5\x93\x72\xc4\x4f\x0b\xfd\x7a\x62\xc5\x2d\x86\x8d\x6e\x91\x61\x84\xfe\xe8\xfa\x09\xb1\x61\x29\x5c\x49\x5a\xc2\x75\xcc\x59\x3d\x40\x7c\x35\x8b\x80\x02\xe6\x11\xaf\xc8\xf1\x70\x6f\xa3\x1c\x85\x6b\x8a\xd3\xcf\x63\x3a\x92\x66\x13\xd2\x5c\x8e\x42\x5b\xce\xf8\xf7\x6d\x45\xd3\x82\xf1\x94\xa0\x7c\x06\x80\x2e\x61\x63\xd9\x74\x4f\x8c\x37\xb1\xf5\xf9\x80\x76\xc1\xbf\x16\xa5\x65\x07\x68\xe6\xc9\xd6\xa9\x44\x11\x33\x61\x42\x9a\x43\xee\x84\x92\xda\xab\x55\xb1\xd9\xc6\x39\x60\x12\xbc\xf6\x86\x42\x7f\x1a\x53\x2a\x31\x54\xfa\xb1\x2b\x4e\x2f\x75\x14\x14\x88\x4e\xb4\x59\xa9\xc7\x87\x82\xc4\xc3\x9b\x05\x7f\xe1\x91\x10\x3c\x3c\xac\x76\xf8\x2f\x12\x2c\x7c\x99\x2c\x61\x53\x8f\x70\x34\x51\x93\x29\x68\xa9\x2d\x48\x1d\xcf\xbc\x70\x70\xb7\x78\x3f\x9d\xcd\xd5\x65\x04\x92\x6d\xe3\x08\x1f\x38\xf9\xd4\x21\x84\x27\xf5\xef\xac\x28\x9e\xaf\x7c\xe7\xc9\xe2\x59\xf9\xbb\xe3\x27\x7b\xfe\x4b\xd4\xee\x7e\x6c\xab\xdd\x05\x42\xee\xee\xc7\x83\x72\x77\xfd\x17\xc9\xdd\x59\xd5\xba\x40\x7d\x7c\x1f\x81\x36\xe0\x68\x22\x44\xf0\xe6\x8b\xd9\x48\x8a\xdb\xc1\xbb\x0f\xeb\xe1\x79\xda\x77\xfd\x3f\x47\xfb\xee\xf7\x34\x1d\xc2\x57\x1f\x2f\x86\xe6\xc8\x7f\x73\xfa\xe6\xec\xe2\x8f\x31\x04\x9e\xb9\xff\x2f\x5e\x9f\x36\xf5\x3f\xce\xcf\xcf\xcf\xff\xba\xff\xff\x8c\x3f\x40\x17\x8f\xf8\x60\x76\x0c\xec\x5d\x70\x80\xeb\xbd\x12\x8e\xa5\xbb\x78\x32\x4e\xba\xb2\x74\xc8\xe5\x9e\x14\xbc\x91\x47\x01\xae\x1d\xc6\x9d\xd5\xfc\x56\x0c\x40\x1f\x0b\x8f\x4e\xf7\x15\x20\x04\x1c\x6c\x81\x72\x50\x71\x12\xb0\x94\x60\x51\xc8\xec\xb0\xd4\x10\xf4\xdb\xd4\x15\xb7\x0f\x8f\x6e\x3d\x60\xbb\x9f\x98\x6e\x11\x84\xd9\x76\x3e\x6d\xb1\x70\xfe\x8f\x99\xfc\xd9\x01\x33\x9f\x5c\x6b\x08\x08\x11\x81\xbd\x19\xe7\x07\x5d\xea\xa5\x15\x00\x7e\x0a\x51\xee\xf7\xa7\xc8\x95\x39\xd4\x7d\xd4\x14\x4c\x1e\x10\x5a\x97\x35\x33\x22\x97\xba\x58\x07\xe2\xea\xf4\x6e\x3e\xb0\x90\xfe\x9f\xff\xeb\xff\x46\xe6\x21\x20\x17\xd2\x5f\x6b\x1b\x65\x9f\x4c\x17\xa3\x61\x44\xda\xcd\x5c\xc8\xf8\x25\xd5\x8f\x0c\xdd\x42\x48\x5b\xc1\x1c\x3b\x92\xe8\x1f\xaa\xf0\x3c\xe4\x58\xc8\x2f\x33\xb6\xc3\xb6\xd4\x27\xb6\x82\x2c\xcd\x6b\x0d\x68\xca\x5d\x9c\x91\x28\x72\xbd\x97\xd0\x91\xc0\x55\x62\x17\x65\xf7\x5c\xaa\xd1\x1a\x18\x9f\xb1\x2e\x0d\x51\x17\x1f\x2f\x86\x2e\x16\x61\x3e\x6f\xf3\x0f\x73\x20\x7d\x9e\x10\xdb\xda\x03\x13\x91\x73\xfc\xc0\x36\x75\x62\x33\xbe\x66\x4a\xd9\xae\x69\x8a\x8d\x04\xae\x86\x45\x6c\x11\x91\x7a\x20\x42\x68\xfd\x88\x16\xa7\x10\xe5\x74\x24\x88\xb0\xfd\xaa\x0e\xdd\x4e\x57\xda\xd2\x59\x65\xc6\x03\xcd\xff\xfe\x6f\x5c\xa2\x97\xa8\xbb\xd9\x88\x27\xc7\x0c\x05\x3f\xf0\xbf\x23\x99\x93\xb3\xf5\xff\xdb\xa7\x68\x30\xfb\xef\xe6\x33\xff\xf1\xbf\xd4\xf1\xcd\x68\x11\xa8\x68\x36\x1c\xdd\x04\xea\x27\x9d\x16\x81\xba\xd4\xa9\xe9\x79\x3f\xec\x1d\x09\x5c\x11\x9a\x4a\x1f\xa7\xb3\x9f\x3a\xcc\xa4\xa0\x47\x0a\xbf\x4d\xdd\xdf\x6e\xb9\x63\xb8\xf6\xa5\xf5\xd4\x36\xae\x84\x45\xd5\x69\x50\x3d\x6d\x44\x4d\x67\xbe\x0d\x05\xfa\xc7\x5d\xe2\xce\x56\x77\xd9\xde\xd0\x4e\x82\x19\x54\x96\x09\x95\x7d\x40\x54\x79\xf1\x7e\x34\xbb\x82\x47\xb3\xc0\xf2\x5c\x28\x2c\xcf\x85\xc4\xf2\xdc\x29\x12\xe3\xef\xc2\xa3\xf6\x68\xd9\x97\xbc\xc4\x62\x23\x2b\xed\xb0\x65\xc6\x26\x09\xd9\x21\xe6\x29\xcf\xf4\x32\x3c\x5a\x70\x91\x02\xc9\xcd\x26\x7a\x13\x13\x0a\xb4\x7d\x1b\x6c\xe2\x3d\xb4\x96\x45\x56\x00\x34\xf7\x45\x97\x35\xf2\x77\x7b\x85\x42\x5b\xe4\x5f\xb7\xf4\x99\x74\x7c\xf1\x51\xc9\x1c\xa2\x01\x47\x69\x29\xc6\x2d\x4a\x97\x09\x2d\x45\x27\x37\xb6\x84\x39\x2b\xe9\x59\x19\xf0\x16\x01\x8c\x2e\xdd\x00\x15\x08\x10\x1f\x21\x87\x59\xb3\xf9\xff\x49\xe2\x30\xff\xaa\x3f\xe1\xab\xe9\x70\x3c\xfc\x9d\x05\x3f\x1b\x7f\x9e\xb6\xff\xce\xdf\xbc\x3d\x7d\xdd\x8c\xff\x7c\xfb\xe6\x2f\xfd\xb7\x3f\xe5\x8f\x99\x7d\x35\xd3\x95\x8e\xcb\xd5\x43\x53\x68\xf3\x3c\x3c\x3d\x5a\xc0\xbd\xfb\xff\x03\x89\x5d\x8a\x3a\x4c\xd7\xea\xae\xd2\x47\x37\xf1\x1e\x95\xde\x44\x32\xe3\x3f\xfe\x27\xfc\x24\x54\xf0\xdc\x69\x0e\x41\x6f\x2b\x8b\x3b\x26\xf1\xcc\xa1\xce\x6b\x5d\x92\xf6\xdb\x20\xcb\xd4\x0c\x43\x4a\x33\x0a\x29\x1d\xdd\x8e\xa3\xc1\x3c\x52\xb3\x68\x70\x85\xde\x92\x3d\x80\x87\x83\x59\x74\x7d\x37\x1e\x7f\x0a\xd5\xe5\x27\x75\x35\xfd\x38\x19\x4f\x07\x70\x3d\x80\x46\xbf\xf9\x0b\x4a\xcf\x5f\x45\xea\xd2\x3c\x63\x30\xb9\x7a\x25\xce\x36\xac\x69\x18\x0c\x87\xd3\x9b\xdb\xc1\xe4\x13\x7e\xde\x41\x7d\xd4\xb1\xf9\x76\xcf\xea\x39\x07\xea\xd3\xf4\x4e\x0d\xde\xcd\xa2\xc8\xb8\xb1\xe6\x97\xd7\xd3\xf1\x78\xfa\x11\xbe\x18\xcd\x6e\xac\xa6\xfd\xd5\x68\xd1\x85\x1d\x0a\x8f\x98\x10\xe0\x0c\xc0\xc0\x25\xf5\xf5\x68\x4e\x9a\x26\x16\x0b\x7f\x58\x4b\xb3\x49\x29\x8b\x63\xbb\x5e\x93\x91\x62\x67\x0f\xcc\xe8\xde\x94\x03\x2f\x43\xc7\x99\xd0\xc3\x5a\x50\x2a\x60\xb3\xa4\xfc\x92\x55\xe1\x98\x6b\x5b\x7c\xc5\x9b\xae\xa7\x61\x2b\x7a\xe2\x27\x55\xaf\xef\x19\xb5\x88\xb9\x32\xa6\xd9\x89\xd5\xd1\x09\x50\xce\x09\xd5\x9c\xf2\xe2\x64\xf5\x10\x97\xc0\x52\x42\x6a\xe6\x60\x5e\x5a\x45\xd4\x82\x74\x4c\x91\xc2\x7b\x8b\x12\x2a\xad\x9a\x84\x96\xc1\x7e\x6c\xac\xca\x12\x21\x93\xd0\xe3\xaf\xfc\xcf\x7e\x40\xe4\xb0\x4c\xde\x4b\x99\x26\x41\xe7\x6b\xe9\xd8\x1b\xf0\x61\x30\xdf\xec\x58\xa1\x63\xd4\x35\x2e\x16\xbd\x7d\xe3\x51\x15\xf9\x23\x4b\x15\x29\x30\x82\xb7\x98\xbb\xe8\xf5\xdd\x2a\x39\x0f\xd5\x95\xad\x20\xaf\x8e\xac\x3c\xd3\x8a\xd0\x12\x74\x6b\xd2\x37\x11\x82\xb1\xf7\x40\xea\x60\x1a\x62\x60\x4e\x56\xb3\x60\x59\x23\x1b\xb5\xa0\xf9\x40\x56\x22\x3f\x8b\xe1\xe4\x40\x98\x60\x7e\xdf\x50\x02\x33\x06\xbc\xe0\xa9\xa0\xaf\x39\xe9\x55\x2c\x52\x93\xcd\xed\xe2\x5b\xe6\xb7\xb9\x99\x71\x95\xd5\xde\x9a\x0a\x7b\xe0\xa0\x34\xa9\x10\xe5\x33\x38\xa8\x78\x88\x5e\xc9\x26\x09\x45\x0c\xb1\xc0\xc8\xf4\xdc\x96\xa6\x10\xb1\xd2\xc0\xbc\x9c\x8a\x19\x3f\x16\xe5\xe7\x1e\x15\x05\x11\xc8\x11\xb3\x5c\xe4\xca\x82\xef\x72\x4f\x82\xf9\x80\x42\x2c\x61\x68\xaa\x66\x03\x45\xc1\x93\x59\x44\xa1\x1a\x28\xef\x25\x5c\x89\x62\xac\x1f\x73\x7c\x9a\xd9\x01\xa4\x24\x38\x6d\x5c\xc7\x8a\xf5\xa3\xe0\x81\xa0\x87\x4e\x62\xf8\xc5\xda\x7d\xc6\x1c\xb4\x64\x9f\x25\x66\xab\x7c\xd1\x59\xb1\x45\x78\x85\xed\x6a\xa8\xae\xe4\x60\x8e\x2d\xbb\x1e\x9c\xf1\x47\x48\x64\xc7\x39\xad\x99\x03\xaf\x57\xa8\x86\xc1\x50\xf0\x5c\x03\xda\xb7\xdc\xa3\x5c\xd5\xaa\xb8\xcf\xd3\x7f\x82\xaf\x5c\x26\x27\x66\x18\x2c\xd4\x12\x82\xb4\xe2\xa7\xda\xbc\x1d\x1b\x73\x5c\x69\x8d\x43\xdf\x0f\x08\x18\x78\x68\x96\x89\x98\x9b\x7e\x0a\x09\x04\xe6\xb1\x83\x07\xe0\x32\x00\x14\xe9\x0e\xc1\x08\x4c\x36\x2d\x5e\x68\x39\x7d\x4b\xbd\x4a\xb7\x29\xd6\x04\xe9\xaf\x66\xe3\x57\x76\x27\x50\xb3\x39\xdf\x2e\xd8\x63\x40\x55\xda\x3b\x02\x91\x1b\xd1\xf1\xf4\x32\xc3\x87\x5c\xff\x50\x83\x5f\x12\x4e\xdd\x1d\x27\x00\x18\xa2\xdf\xe6\x89\xa5\x67\x58\x6a\x8c\xef\xc3\xa7\x6d\xb5\x01\xe4\xc9\x61\x14\x15\x8e\x22\x90\x9e\x1a\xbf\xd4\x78\x64\xe6\xc0\xe3\xb5\xcd\x2c\x98\x82\x9e\xb7\xdb\xc7\x86\x6f\x56\x7d\xd2\xe5\x42\x53\xbc\xab\xed\x58\xbd\xd2\xe8\x24\x17\x58\xb6\xbe\x50\x39\x97\xd5\xd2\xaa\x22\xce\xd4\x9e\x3a\xad\x25\xe2\xa4\x08\x0f\xad\x93\xb8\xaa\x8a\x55\x0a\x89\x02\x4b\x1a\xc3\xa7\x50\xab\x09\x72\x34\x1c\xaa\x03\x0e\x48\x57\x7c\xc6\x87\x82\xad\x43\xe9\x5b\xb8\x4c\xf3\x5c\x91\xa1\x0d\x76\x51\xf0\xda\xe2\x8a\x3e\x3c\x5b\x89\x60\x6d\xfb\xb0\xaf\xb8\x46\x81\x2e\xb5\x92\x13\x17\x98\x05\xa1\x99\xb6\x6b\xd0\x29\x94\x76\xd4\xf0\xbc\x1a\x9b\x89\xb4\x89\xf5\x71\x1a\x2f\xd3\xcc\x38\x51\xdc\x3c\x8b\xec\x73\x74\xe1\x3c\x4c\x20\x14\xfb\x92\x5d\x65\xb6\x13\x04\x84\x84\x9d\xc3\xce\xf0\xed\x6c\xfa\x6e\x36\xb8\xf1\x1c\xfd\xc1\xfc\x64\x34\x0f\xa0\x28\xd4\x38\x94\xe4\x7f\x7f\x62\xcf\xf2\xa7\xd1\xe4\x4a\x1d\x47\x23\xf0\x70\xdb\xee\x7c\x3f\x04\xd3\x6b\x66\x0c\xb6\xf1\xa7\x00\x2d\x99\x9b\xc1\x4f\xd1\x5c\x4d\xa6\x5e\x28\xa0\x23\x52\xf0\xee\x6e\x60\x7e\x1d\x41\xa4\xe0\xd0\x1b\x02\xd4\xc4\xa4\xa4\xc8\x1c\xe2\x65\x10\x3a\xff\x05\x0f\x17\xa9\x0c\xee\x27\xc4\x1c\xe0\xd3\xbf\x29\x89\xd3\x19\x80\x08\xd4\x60\xae\x16\xd3\x1f\xd4\xf1\xa0\x8f\x16\xe6\xdd\x04\x0a\xc2\x07\x1c\xc4\x98\x4c\x27\x1c\x6f\xe0\x0c\x0a\xcd\x4d\x00\xcf\x94\xac\xb1\x81\xb9\x63\x80\x49\xc3\x34\x6f\x3a\xfb\x49\xc1\x8b\x6d\x49\x6f\x04\x3f\x84\x2c\xca\xf1\x25\xbe\x6f\x16\xcd\xef\xc6\x8b\x39\xcf\xe1\xed\x6c\xfa\xb7\x68\xb8\x50\x77\x93\xab\x68\xb6\x18\xfc\x14\x4d\x84\x61\xfd\x1b\xdf\x7b\x28\x47\x05\xf9\x97\xd1\xe5\xdd\xe2\xf7\x4a\x54\xf9\xb1\x10\x7a\x0c\x06\x5e\x5e\x96\xb2\x0a\xfe\xca\x59\x35\x23\x62\x76\xee\x7f\x71\xc6\x6a\x1e\xc2\xf9\xf2\x3e\x9a\x45\x97\xe6\x0d\xa3\x0f\x18\x38\xa3\x4d\x6a\xa6\x99\x67\x45\x1e\x24\x83\x77\x83\xd1\x64\xbe\xf0\x57\xc7\xc7\xf7\xa3\xe1\x7b\x75\x33\xf8\x44\xeb\x56\x5d\xcf\xa6\x37\x08\x9e\x6b\xb7\x15\x0e\xd8\xcb\xd0\xb3\x66\x88\x95\xef\xaa\x71\x38\xe2\x45\x02\x57\xc4\xb0\x48\xb4\x60\x5e\x3f\x60\xc1\x5a\xe9\x3b\xe4\x19\x66\xc6\x72\x7b\xb8\x03\x50\x1a\xac\xe2\x86\x3f\xa0\xc3\xfb\x50\x82\x11\xfa\xc1\x13\xb6\xab\x2d\xe6\xde\x55\x1a\x95\x5a\xf8\xee\xf0\xb9\x8b\xd1\xb7\x73\x78\x8b\x24\xae\xe3\x27\xcd\x7c\xef\xe2\x6c\x74\x93\xc8\x3a\x72\x0b\x8f\x70\x39\x08\x8c\xc9\xff\x80\x80\x6a\x2f\xa0\x7c\x7e\x7a\x7a\x7a\x62\xae\x60\xe0\x35\x80\x1a\xba\xd5\xae\x04\x56\x95\xbd\x8e\xcb\xfe\x2f\x88\x09\x38\x0e\x0b\xe1\xa2\x1e\x80\x9f\x10\x11\x8d\xf3\x6f\x60\xf8\x4c\xcf\x01\x76\xcc\xc4\xdb\xad\xda\x1a\x4e\x6f\x1d\xf0\xa6\x11\x85\x52\x39\x2f\xfd\xc9\x48\x09\x63\x26\xcf\xc3\x53\x72\xc3\x6d\x08\xe1\x47\x8f\x1c\xca\xa2\x54\x61\x6a\xa8\xbe\x12\xb4\x2e\x36\xdb\x2c\x85\x2a\x05\xeb\x7b\xb7\x54\x58\x30\x9f\x66\x4c\x1b\x1a\xd7\x2e\xe0\x6a\x5c\x73\xb9\xce\x76\x57\x66\x61\xb1\xca\x56\x50\xb0\x63\xfe\xf2\xaa\xa4\xf6\xbf\x9a\xce\x6e\xc7\xaf\x42\x97\x28\xe9\x96\x6b\x16\x25\x3c\x5e\x9a\x07\x78\x08\x18\x1a\xb1\x8c\xab\xb4\x7a\xda\x24\xb0\x72\x3a\x54\x46\xca\xfc\x50\xa9\x99\xbf\xb9\xd6\xde\xcb\x2c\x7d\x17\x0b\x4a\xb1\xf4\x94\xba\x2f\xbe\xe8\x12\x9c\x30\x5a\x04\x08\xba\x65\x2b\xa9\x6a\xb7\x3c\x54\x7e\x86\x85\x78\x53\x60\x9d\x7c\x29\xb2\x5d\x0e\x42\x72\x76\x91\x79\x22\xf2\x20\xe9\xe0\x98\x1a\x2a\x8f\xf2\xcb\x5f\x0e\xc8\xa3\x09\x5c\xd4\x69\x8e\xc2\x67\x70\xaa\xe4\xfe\xc7\x02\xb5\x45\xfe\xe6\xca\xaf\xa9\xb2\x73\x64\xa7\x07\x57\xb5\x08\x32\x24\x30\x09\xff\xe3\xc9\x3f\xf8\xa5\x51\x9e\x82\x0c\xe2\x15\xfa\x80\x8e\x1a\xf4\xc5\x4f\x0b\xd5\x2d\xe7\x12\x57\xa4\xbd\xb1\xdc\x1f\xf8\x34\xec\x12\x71\x0e\x0c\xfb\xf8\xc1\x43\x0f\xef\x8c\xf7\x85\xd2\xb5\x3a\xae\xfa\x3f\x3c\xd3\x51\xfb\xb0\xde\x11\x72\x5d\xbf\xe0\x78\x9f\x14\xf9\xc9\xe6\x8f\x38\xe2\xcd\xae\x3e\x78\xca\x17\x78\x7c\xfc\xfa\x53\xde\x89\x03\x99\x23\xb9\x3b\x2d\xec\x72\x8e\xa9\x4f\xa6\x4d\xc1\xc4\x6a\x9b\xae\x76\xc5\xae\x72\x1c\xb9\xff\x89\x8e\xef\x1e\x91\x46\xb9\x9b\x0c\xf6\x7e\x13\xaa\x27\x99\x4b\xed\x01\x29\x46\xb7\xe1\xeb\x94\x3e\x86\xad\xb0\xb2\x3a\xa8\xcc\xd0\x7c\x45\xd3\x2f\x53\xbb\x2d\xe8\x41\x83\xc2\x04\xd8\x10\x57\x9d\x8b\xcc\x0f\xe6\xc8\x25\x07\xdf\x69\x02\x10\xbd\x8f\x57\xcd\x0b\xe6\x89\xd5\x01\x64\x69\x38\x0a\x70\x3a\xc5\x35\x54\x90\xa0\x2b\xda\x6a\xfc\xaf\xf6\x4d\x7d\xbf\xf4\x40\xac\x4a\x5e\x04\xb1\x2d\x83\x14\x5b\x0b\x55\xd2\xe4\x66\xc3\xd8\xd7\xc2\xa7\x44\x80\x66\xb9\xd8\xd4\xa5\xf9\xde\x45\x38\x24\x0c\xe4\x71\x5c\xc9\xa5\xdc\x77\x3b\x04\x72\xe7\x1e\xb0\x92\x2b\x88\x7a\x03\x4b\x6c\x83\x11\xbc\xb4\x42\x61\x15\x3f\xee\x68\xce\xff\xc0\xfa\xf3\x36\x94\x67\x96\x9e\x88\xd7\x39\x31\xe0\x5c\x50\x0d\x21\xb5\x10\xdd\x2a\x87\x89\x77\x2c\x16\x03\xeb\x6e\xfc\x76\x35\x58\x77\xa0\x0e\xc8\xa1\x6d\x7c\xfe\x50\x1b\x22\x16\x24\xa9\x79\x87\x46\x1b\x3f\x6c\x5d\x94\xcb\x34\x49\x34\x85\x7e\x2b\x8d\x3a\x1b\xad\x36\x08\x69\x35\x39\x38\x5e\x09\x50\xbb\xe1\x20\x6b\x2c\xd6\xab\xc7\xfc\x90\x55\x45\xc0\xa8\x0a\xf9\xcc\xa5\xe4\xb0\x22\xee\xd8\xc6\x83\x83\x83\xa2\x77\xe6\x0a\xde\x55\x6d\x1b\x16\x42\x40\x36\xba\xdd\xe8\x9b\x59\x0e\x73\x47\x38\xc3\x8f\x7d\x57\xc6\x79\x6d\x7e\x77\x0d\x29\x69\x56\x5e\x5d\x33\xd4\xd8\x0c\x14\xbd\xab\x23\xb8\xb5\xdc\xe3\x01\xe8\xce\x36\x06\x2c\x21\x9e\x07\x4c\x0f\xaa\x27\x96\x99\x10\xb6\x1c\xb1\x72\x6c\xf5\xd0\xfa\x32\x96\xf3\x1f\x4a\x94\x10\x6a\xe8\x64\x0d\x15\x15\x32\x57\x22\x59\x34\x0e\xe6\x4e\x10\xdd\x04\x85\x17\x84\xd7\xd5\x02\xec\x94\xc4\xdb\x3a\x20\x80\x0b\x17\xad\x07\x4a\xe7\xa0\x64\x13\x70\x14\x39\x68\x89\xd2\x05\x2f\x4c\xb9\x58\xd8\x17\xf2\xdd\xb7\x12\x38\x4c\xbb\xde\x35\xde\x20\x9d\xd2\xfa\x06\x61\x9b\xfa\x8c\x1a\x2e\x13\xcf\x64\xae\x34\xc6\xb2\x69\x83\xda\x45\xa0\xaa\x07\xe0\xe4\xdb\x95\x5f\x40\xb1\xc7\xa7\x4c\x68\x15\x97\x01\x5b\x00\x20\x8d\x5d\xf4\xfc\x4d\xd8\x64\x5a\xa0\x44\x1e\xbc\xc9\x9b\x40\x3b\x13\xc7\xd0\x2e\x22\x62\xb3\xea\xe7\xb0\x2c\xda\x5c\x18\xc2\x04\xea\x1f\x62\x3c\xb1\x85\xbb\x9e\xfe\x2c\x9c\x17\xf0\x5b\xe4\x23\x8b\xb1\xc5\xa8\x0e\xde\x15\x00\x4e\xf3\xb5\x39\xfc\x89\x99\xa6\xab\x91\xb4\xd1\xfa\x2a\xbe\x8f\xd3\xbc\x22\xc4\x92\x97\xeb\xb2\xc9\x0e\x7a\x3d\x8d\x0a\x42\x9b\x56\xb2\x9a\x07\x68\x47\x10\xb1\x21\x91\x7a\x8d\x32\x74\x4b\x14\x71\xcc\x81\x6c\x0c\x9b\x2f\xb3\xf4\x1e\xd7\x44\xbf\xb3\x60\x13\x66\xd6\xb1\x59\xf8\x23\x47\x9c\x2b\x96\x70\x03\x5a\xb7\x2c\xc1\x59\xb6\x9c\x5e\xa9\x19\x93\xe3\x8b\xd3\x3e\xb2\x6e\x14\x6b\xb5\xd4\xab\x02\xd8\x25\x63\xc4\x65\x31\xe9\x46\xee\xdc\x34\xb4\x66\xdc\x16\x74\x69\x03\x62\x16\xc6\x53\x7e\x5b\x6a\xb8\x71\xf0\xcd\x72\xe1\x81\x1f\x5e\x6a\x9a\x95\xcc\xc2\x01\x1b\x6b\xb5\xf9\x3d\xb7\x22\xdf\x12\x65\x18\xa5\x6f\x28\x41\x63\x91\xf1\x2d\x1d\x16\x2b\xf4\x41\x5a\x4f\x4d\xb7\x14\x22\xf4\x8c\xf5\xe1\xc0\x79\xc1\x1c\x6f\xce\x8e\xb3\x57\x27\x92\x4d\xa4\x45\x69\xd1\x3a\xc6\xd8\xa4\xb2\x7b\x34\x49\x32\xfd\xc5\xac\x76\x99\xd6\xc3\xfb\x0a\x20\x9e\xc0\x43\x62\xcc\x8e\x0d\xea\x60\x66\x20\x9d\x66\xe6\xbc\x82\xd9\x82\x34\x87\xed\x87\xcd\x15\x48\x0d\x70\x5a\x33\x44\xd2\xd2\x2a\x61\xe5\x24\xe5\x91\x99\x2c\x3e\x3d\x5b\x69\x3a\x06\x6f\xc6\x68\xf8\x9a\x13\x86\x66\x81\x0d\xae\x0e\x0f\xfd\x2e\x9c\x87\xc6\x89\x2d\xca\xfa\x95\xfe\x6a\xfe\xa7\x4a\x7d\xbf\xb3\xe4\x62\xa5\xe3\x61\x14\x49\x28\x7c\x31\x7c\xf7\x4a\x9b\x17\x32\x4d\xc1\x10\xd3\xd0\xda\x2b\xea\x26\xae\x44\x62\xfa\x80\xc9\x51\x2e\x89\xad\xfd\x67\xe3\x82\xdb\x60\x35\xaa\xb1\x44\xc2\x23\x00\x5d\xc6\x35\xbc\x62\x49\x23\x03\x44\xe6\x7b\x4a\x26\x81\xf1\xc1\x76\xe0\x53\xc3\xe1\xb9\x1f\xb1\xa3\x36\x22\xbb\x04\xa8\x13\x69\xe5\xe1\x55\xb5\xd5\xe5\x56\xc3\xb1\x83\x84\x47\xdc\x54\xa0\x91\x79\x22\x07\x4f\x0e\x90\x4d\x17\x61\x43\xcd\x51\x82\xfa\x4f\xb8\xc6\xfe\xb1\xd3\x96\xd0\x61\x55\xec\xca\x5a\xfd\x7d\x97\xdc\x33\xef\x64\xa5\xeb\x3a\xc3\xd3\x4d\xe6\xb8\x5e\x70\x18\x52\xd7\xc9\x79\x89\xc9\x1c\x88\x89\xf2\xb3\x51\x6d\x64\x26\xdf\x5d\x60\x2e\x5d\x5e\xc6\x49\x4a\x92\x73\x4f\x41\x39\x60\x67\x8b\x0f\x10\x19\xb7\xfe\xba\xda\x49\x89\xa7\x76\x64\xa8\x4d\xb2\xc3\x7e\xe8\x01\x37\xb6\x2a\xa0\x6a\xb1\x30\x2b\x69\x97\xd5\x71\xae\x91\x09\x9d\xa5\x37\x9b\x07\x6d\xd7\x39\xdb\xb0\x5f\xa4\x4e\xa7\x3c\x48\x0e\xb4\x00\xf1\x78\x18\x26\xb1\x7c\xfc\xe9\x1a\x6e\x40\x58\x9e\x7c\x65\x3e\x82\xfd\xc8\x94\x40\x69\xed\x19\x40\x9e\x3a\x5f\x3b\xa5\x65\x96\x0d\x70\xe7\x71\xe5\x0f\x11\x17\x31\x60\x5a\xea\x10\xa6\xb9\xfd\x97\x90\x24\x0c\x48\x33\x90\xdb\xc0\x03\xb4\x2c\xc8\xe3\x6c\xb4\x16\xab\x8e\x9a\xec\x03\x70\xfa\x33\xba\xd8\x89\x90\x9a\xf6\xac\xcb\x38\xcd\x89\xac\x32\xdb\xe3\x04\x3f\xd1\x25\x7b\x83\x66\x3a\x2e\x49\x50\x40\xe6\x82\x31\x07\xdc\x75\xd4\x78\x0b\x3f\xb6\x43\x64\xf1\xf4\xcc\xa0\x2f\xbd\x39\x14\x3b\x8d\x81\x23\xaf\xd8\x6c\x91\x8b\x29\xa1\xdc\x30\x3f\x41\x70\x06\xc1\xe5\x5f\x55\x3b\x1a\x07\xc0\x7f\x80\xce\xa4\xe5\xda\x02\x75\x4b\xdc\x7a\x18\x45\x11\x45\x59\xfb\x06\xb9\x54\x63\xb9\xc0\x83\x43\xe3\xd6\x09\x82\x91\x86\x58\x58\xe3\x4d\xe2\x45\x76\xf8\xb7\x45\x45\x42\x8e\xca\x6c\x91\x5d\xbe\xb2\xe8\xec\xc6\xc3\x1e\xf5\x52\x2d\x77\x59\xa6\xeb\x34\x57\xcb\x02\x24\x1b\x16\x70\xc3\xd1\x51\xd7\x26\xa2\x41\x54\x92\xde\x58\x49\xf5\xca\xb8\x54\x68\x9c\x73\x41\x5a\x9a\x7f\x89\xb3\x34\x31\xc6\x5a\x51\xaa\x5d\xae\x4d\x03\x57\x9a\x73\xb9\x74\xcd\xba\xf3\x14\x27\x00\xbc\x49\x92\x3e\x87\x50\x69\x9c\x96\x74\xa5\x6e\x08\x3f\x2b\xda\xc5\xca\x7f\xa8\x01\x4e\xba\xb2\x69\x8e\xe0\x7e\x78\x1d\x5a\xe6\xf0\x40\xc8\x1b\x80\xe2\x4e\x5a\xef\xac\xa1\xe8\x37\xe2\x41\x67\xe6\xcc\xce\xe2\xc7\xf5\x2e\x0b\xf0\x12\x70\x37\xa2\xfd\x32\xd0\x86\xba\x6f\x99\x5b\x93\x49\xa9\x36\x74\x21\xae\x01\xf9\x44\x17\x8c\x85\x40\xa4\x79\x2d\xcc\x04\x26\x1c\x33\x6f\x31\xf6\xa7\x25\x3e\x06\x1d\x5c\x82\xfe\x9a\x49\xc6\x63\x29\x8b\x1f\x71\x66\x3a\x31\x58\xed\x38\x3f\xd2\x1b\x81\x3c\x78\x7b\xaf\x42\xd5\xe5\x46\xe7\xc6\xb3\xb6\x67\x10\x20\x88\xd9\x97\x77\xc2\xea\xcd\xf3\x86\x05\x67\xcd\x30\x58\x92\x87\x5c\x3f\x4a\x72\x02\xb3\xfe\x30\x49\x21\xf5\x15\x8c\xa5\x57\x21\x55\xbe\xc0\x9d\x38\x8e\x45\xe2\xbf\x43\x00\x0a\x49\x28\x11\x9d\x8f\x15\x15\xcd\x0b\x0e\xa1\x0b\xb8\x8d\x35\x46\x69\x10\xbb\xaf\x3c\x5a\x74\xd2\x2a\x3b\xf2\x1a\x48\xbc\x78\x16\xc7\x81\x7e\x1d\xbb\x37\x1e\xbd\x12\x0c\x60\x27\xa5\x27\x4f\x2b\x51\x89\xf1\x22\xe0\x08\x02\xa9\xf1\x90\x7d\x01\x21\x2e\xa7\x52\xc4\x53\x42\x09\x12\x8a\x8d\xb0\x99\xe9\xde\xe7\xaf\xa0\xc6\x30\xdb\x05\x8b\x79\x03\xb6\x7d\x30\x26\x5a\x97\x3b\x57\x7c\xda\x70\x23\xcd\x12\xb3\xb3\x4d\x3a\x8a\x6b\x35\x7d\x48\x0b\xbb\x66\xee\x72\xc0\xd8\xc0\x2f\xe1\xa3\x83\x8d\x2e\xd3\x55\xec\x02\x4b\x48\xbb\x8d\x7a\xb0\xc0\xef\x93\x31\x40\x0b\xd5\x90\xe0\x1f\xb0\x96\xff\x95\xf8\xdf\xf0\xd5\x60\x59\xd5\xfb\x4c\x57\xff\x2a\xfc\xf7\xe9\xd9\xc5\x79\xb3\xfe\xff\xfc\xcd\xf9\xe9\x5f\xf8\xef\x3f\xe3\xcf\x82\x68\x30\x07\xb7\xb3\x68\x70\x73\x39\x0e\x17\xd1\xcf\x81\x65\x7a\x39\x0b\xcf\x4e\xb5\x2b\xc6\x58\xee\xd5\xfb\x38\xaf\x4e\xde\x03\x75\x5a\xae\x2e\x8b\x44\x1f\x1d\xbf\x7f\x7f\x39\xbd\x8a\xfe\xcb\xd5\x74\x7e\x37\x19\x9d\x85\x97\xa3\xc5\x24\x5a\x10\xdc\x16\xf8\x47\xd2\xe5\x42\xff\xac\xfe\x1d\xc2\x4d\xe6\x72\xfc\x46\xad\xe3\x4d\x9a\xed\xfd\xf7\x18\xc7\x56\xdb\x78\xb4\x6b\xd0\xd5\x74\x48\xd1\x76\x44\x93\x09\x26\x7c\x72\x88\xa1\x0f\x5b\x87\x88\x95\x36\x0d\x67\x25\x11\xd9\x80\x99\xc9\xa0\x2b\x0d\x79\xe4\x27\xb1\xce\xbe\xff\xfe\x2c\x30\xff\x3d\xef\xe8\xf2\x41\x7a\x1e\xc4\xc0\xfa\xa0\x57\x49\xba\x2f\xc5\x14\x6c\xa5\x57\x9b\xdf\xa0\x25\x82\x6a\xed\x4c\x41\x7e\xcd\xbf\x2a\xb5\x95\x6d\xc1\xcc\xac\xbd\xaf\xc2\xc3\x0d\xed\x92\x93\x6e\x49\xdd\xb4\x9b\xda\x29\x27\xdd\x25\xc5\xd0\xac\x69\xac\x1d\x45\xbb\xe3\xda\xe7\x0a\x36\x2e\x3f\xed\xce\x41\xdb\x94\x48\xdc\xd1\x7b\xa7\x1c\xc3\x01\x69\x50\x42\xfa\x57\xef\xaa\xff\xef\xfc\x09\x5f\x25\x7a\x5b\x6a\xa0\x62\xf8\x1f\xef\x6e\xc7\x7f\x44\x25\xd0\xd3\xe7\xff\xeb\xb3\x6f\x4f\xdf\x34\xce\xff\xd7\xa7\x17\x6f\xff\x3a\xff\xff\x8c\x3f\x40\x63\x14\x4d\xa2\xd9\x60\xac\x6e\xef\x2e\xc7\xa3\xa1\x65\xbd\xb5\x98\x96\x40\xfd\x6d\x97\x6b\x38\x12\x5b\xa7\xe4\x77\xdf\xc3\x29\x79\x76\x90\x03\x0c\x53\xc2\x47\x6f\xce\x80\xc3\xf0\x73\x96\xe6\x6a\x5e\x97\x5a\xd7\x81\xba\x4e\xd7\xf5\x83\xba\xce\x8a\xa2\x0c\xd4\x65\x51\xd5\xe6\xd3\x37\x03\x75\x7a\x7e\x76\x76\x7a\x72\x76\x71\x7a\xa6\x02\x75\x37\x1f\x1c\x45\x5f\x74\xb9\x2f\x72\x34\xa8\x2d\x2f\xcc\x81\x63\xec\xd0\x79\x9b\xd9\x6c\x1d\x33\x15\x2e\x11\xce\x8b\x94\xea\xc8\x2c\x08\x7e\x57\x96\x15\x8f\xe6\x46\xb8\x2d\x75\xbc\x59\x66\x1a\x9c\x0d\x6b\x59\xa3\x2a\x58\x55\x3b\x50\x09\xba\x81\x55\x7a\x9f\x63\xab\xd0\x13\x7e\x8c\x29\xb0\xb2\x2e\xb5\x4e\x0a\xf0\x9c\xab\x07\x2e\x4a\x26\x87\x24\xad\x43\x75\x49\x00\x94\x98\x2b\x98\x0f\x53\x4b\x21\xdd\x59\x8d\xb6\x71\x5d\xa8\xfb\x5d\x0c\x67\xba\x7e\xfe\x4d\x1e\xf9\xd4\xc9\x09\x5f\x56\x15\xd3\x50\xdb\xde\xa4\x15\x7e\x76\x4d\x0c\xcb\x69\x4d\x2a\x26\x64\x5d\x1f\x68\x99\x48\xda\xc1\xe8\x90\xf5\x7c\x68\x59\x7c\x23\x40\x39\x28\xfa\x2a\x02\x6f\x7c\x97\x3f\x42\xb8\x80\x35\xd5\x57\xc5\x66\x83\x2c\xc7\xbb\x0a\x67\x2c\x54\xc7\x73\x47\x44\x76\x90\x9e\x59\x76\xad\x91\x6d\x35\x43\x3d\xd6\x55\xa5\xcb\x83\x23\x9e\x57\xb5\x8e\x93\xb0\x0f\x71\xeb\x15\x06\x0d\xb2\xbd\xc2\x96\xc0\xb0\x73\xaa\x38\x50\x75\x51\x84\x47\xa0\xe1\xf2\x08\xf8\xa5\xf8\x73\x8b\x4d\x0c\x38\xca\x62\xb8\x07\x6d\x0e\xbe\xe0\x99\x0b\x30\xf2\x55\x82\x0a\xe7\x74\x77\xa8\x51\x55\x6b\xc9\xc9\xb9\x94\xb4\x09\x1c\x8f\xa5\x55\x21\xb6\x89\xdb\x1d\x3e\xd9\xd9\x31\xad\x99\xf2\x9e\x91\x58\xc0\x1e\x5e\x7e\x81\xeb\x76\x4d\xfe\x67\xf5\xd0\x0f\xdc\xab\x38\xce\x26\x21\x15\x45\x09\x83\x75\xaf\x6b\xd8\x5a\xf4\xc5\x18\xe4\x8c\xc5\x57\xcd\x67\xac\x73\xae\xbd\x52\xf8\x5d\xa5\xd5\x36\xd5\x24\x21\x0f\xfa\x4a\x24\xe6\xaa\xb5\x1d\xf3\x1f\x7d\x01\xbb\xcf\x79\xf1\x68\x9f\x9b\xd8\xd2\xba\x87\x34\xbf\xaf\xc2\xa3\x05\xd0\xe2\xd6\xc6\xfb\x14\x09\x27\x98\x11\xd0\xae\xe3\x81\xf4\xc2\xea\xf0\x6c\xcc\xab\x9b\x25\x6a\x8e\x21\x33\x92\x3a\xdf\x53\xd4\xd7\xbc\x41\x14\xbc\x14\x2a\xae\x3e\x33\x8d\x70\x05\x08\x1a\x36\x65\xf0\x53\xac\xaf\xea\xbf\x85\xf4\x2f\xb0\xb2\x19\xab\xa4\x21\x29\x57\xe4\x55\xba\x94\xb4\xbd\x40\x0f\xd1\x42\x2d\xf9\x11\x0a\xb7\xd8\x50\x33\x1a\x22\xb4\x48\x11\x99\xd6\xe1\x51\x33\x0a\x7b\xf0\x59\x44\xe8\x4b\x83\x1d\xa8\xc7\x07\x0d\x5b\x0d\x00\x13\xd0\x5d\xb4\xcc\xd7\x5a\x0b\x95\x37\x60\x5d\xf7\x20\x29\x95\x15\x35\x61\x12\x76\xb9\x4a\x85\x80\x5a\x63\x1d\xd7\x0f\x7a\x0f\xbb\x2a\xb0\x6b\x4c\xac\xab\x06\x8a\x27\x54\x03\x89\x95\xaa\x1e\x50\x40\x6c\xe3\xd5\x57\x56\xb0\x26\xf6\xb8\x50\x90\x9d\x8f\x66\xe5\xe8\xa3\xee\x5a\x1d\x14\x14\x78\x2c\x30\x98\xf9\x03\x50\xb8\x3a\x03\xdd\x1f\x6d\x26\x6c\x2d\x80\x68\x1d\x97\x87\xb8\x7a\x30\x4e\x87\x6a\xdc\x18\xd5\xbd\xf7\x05\x6d\x5e\xc2\xf0\x29\x29\x04\x11\x74\x01\x22\xb7\xb1\x99\x29\x38\x29\xbf\xa9\xb8\x1f\x9c\x66\x2c\x76\x25\xae\xf2\x47\x42\x24\xc0\x30\xf3\x2a\xc3\xb2\x1e\xbe\x62\x89\x62\x25\xce\x93\xca\xce\x81\x15\xb9\x7f\xe4\x2a\x15\x7b\x32\xf8\x9c\x86\x4c\xf9\x2d\x4f\x5c\xeb\x56\x90\x16\x03\xd0\x75\x64\x14\x3c\xdf\xc6\x15\x66\x50\x5c\xf3\x52\x40\x87\xd9\x85\x53\x17\x3c\x57\x71\x6d\x05\xb4\x28\x76\x4c\x17\xb6\x0c\x2d\x06\x38\xc3\xc4\x4a\x6b\x19\xed\xd3\xbc\x46\x9a\x35\x68\x06\xdc\x17\xc4\xa4\x8f\x0a\xd7\x10\xa6\xe4\x12\xb1\x86\x24\x63\xf5\x0d\x70\xe5\xd6\xcc\x1b\x76\x9d\x92\xa0\x07\xd4\xcf\x88\xc3\xe8\xff\x65\xef\xdf\xb6\xdb\x38\xb2\xac\x51\xb8\xaf\xf9\x14\x31\x70\x23\xf2\xfb\x93\x90\x48\x49\x76\xd9\xaa\xdf\x63\x40\x24\x24\xa1\x8a\x04\xd8\x00\x68\x95\xf6\xcd\xee\x00\x10\x20\xb3\x94\xc8\x40\xe7\x81\x30\xfa\x8d\xf6\x6b\xec\x27\xdb\x23\xd6\x21\x62\x45\x66\x82\xa4\x5c\xb6\xab\xbb\x47\xf1\xc6\x16\x09\x64\xc6\x39\xd6\x61\xae\x39\x31\x6c\x06\x58\x87\xdc\x50\x94\x49\x43\x75\x0e\x74\x9d\x86\x04\x53\x08\x65\x5f\x7d\x36\x70\x90\xc2\x89\xf1\x60\x53\x8c\x2b\xad\xdc\x51\x48\x4c\xdf\x22\xdb\x61\x0b\x72\x81\xa2\xf7\x41\x07\x22\xd5\x39\x42\x08\xc7\x69\x0a\x54\x50\xc3\xe8\xaf\x9b\x7a\x8e\xc4\xf1\x63\x44\x3e\x15\x44\xa6\xb7\x85\x79\xc0\x7a\xaf\x14\x97\x0d\x0c\x36\xe6\x41\x2b\x64\x70\x13\x43\x8c\xaf\x62\x78\x9a\xa7\x66\x86\x45\x49\x8b\xea\x05\xad\x93\xba\x24\x74\x58\x15\x3e\x47\x99\x21\x0a\xb5\x1b\x28\xc7\xeb\x2c\x85\x5e\x07\xfe\xa0\x44\xb5\x08\x07\x25\x35\x0b\x41\x23\xfb\x47\x9d\x05\xda\x1f\x80\x29\xe3\xe6\x0b\xd4\x7d\x5c\x8e\x66\x58\x59\x00\x55\xe1\xe3\xcb\xa8\xa4\xe5\x48\x29\xf5\xaa\x11\x53\x6c\x60\x93\xb6\x21\x65\x1a\x84\xd6\x68\x9f\x87\xca\x59\xf6\x56\x49\x70\xec\x00\xaf\x92\x2a\xf5\x9e\x2c\xd1\x0e\xa8\xdd\xa1\x1a\xd7\x6e\x0b\x01\xd1\x76\x1e\x3d\x96\x60\xa5\x64\x82\x46\x87\x6f\x3d\x1c\xef\xa2\x0b\xc8\x74\x84\x1a\xd3\x3d\xe8\x89\x47\xe8\x88\xb8\x37\x93\x81\x13\xf2\xaf\x23\x73\xdc\x80\xed\x50\xdb\x43\x7f\x33\xbd\xfb\xd1\x0b\x43\xba\x5b\x52\xbb\xdd\x84\x9f\xa5\x51\xeb\xca\x49\x33\xac\x4e\x91\xb4\x2a\x35\xc0\x1b\xfc\xc4\xce\x14\xd3\xf4\xf0\xf9\xe9\x2f\xd8\x15\x52\x72\x33\x0d\x39\x83\xcb\xfb\xea\xf8\x13\x84\xdb\x21\x94\x9f\x44\x82\x54\x92\x64\x98\xc3\xbb\x01\x76\xce\x58\x03\x37\x2f\xaa\x27\x5f\xde\xeb\x9f\xa0\x32\x06\xa3\xbd\xa0\x5e\x1b\xb3\x67\x88\x9e\xec\xed\x6d\x8d\x52\xa0\x83\x65\x95\x3e\xe0\x2d\x2f\x98\xc7\x9f\xb9\xe0\x3b\xb1\x84\x61\xd5\xbe\xc3\x33\x13\xec\xaa\xba\x2a\xd3\x15\xea\x4e\x95\x4b\xbb\xa5\x95\xa2\x97\x60\xb1\x17\x75\xde\x1a\x79\x3a\x64\x43\xfe\x3e\x24\x4e\x6c\x5d\x6d\x6b\x81\xc3\x13\x5f\xe1\x96\x40\x8e\x03\x88\xdb\xcb\x50\xa4\x01\x27\x23\x24\x90\x78\xd6\xbb\xd6\x99\x3a\x96\xba\x90\x76\xcd\x75\xd1\x20\x9b\xc1\x20\xfd\x8e\x16\x9f\x80\x8c\x62\xe5\x95\xb2\xdd\x1a\x2b\x6a\x67\x2f\xbb\x67\x01\xa0\xd3\x0b\x31\x86\x54\x0e\x49\xd7\x9f\xf5\x85\xe0\xf4\x33\x9d\x4b\xff\x18\x70\x6a\x82\x09\xac\xcb\xc8\x3a\x26\x35\x60\xb7\x41\x58\xa1\xb2\x4d\xfc\x25\xe0\xda\x84\xa7\x13\x39\xca\x2c\xc8\xcc\xd8\x1c\xaf\x7c\x6a\x64\x94\xc9\xec\x0c\x1f\x06\x62\x2d\xd7\x68\xbe\xc8\xdf\xa9\xaf\xc6\x6c\xdd\x8e\x00\xf1\x53\x32\xd2\x18\x31\x44\xb7\x90\xb3\x65\x1a\x78\x4f\xf6\xd9\x20\xfb\xb3\x28\x3d\x18\x23\xdf\x8b\x47\xbb\xcf\x80\x2d\x18\x3c\x3b\x71\xb1\x37\x21\x9d\xdd\x3a\xa8\x3a\xb3\xf9\x5d\x48\xcc\xf8\xbc\xb8\x14\x06\x47\x67\x05\xac\x50\x1f\x74\x66\xbc\x33\xaf\xec\x08\xf4\xac\x19\x17\xc9\xf6\xa2\xde\x2b\xae\xdf\xf6\x1a\x30\xae\xd7\xde\xde\x11\x06\x95\xbb\x4a\x7f\x61\xa7\x9a\xad\x5f\xa6\x7c\xf5\x8a\xbd\x68\xad\x91\x0c\xf7\x76\x8f\xa8\x9d\xae\x24\x22\xe7\x5e\xe3\xa3\x0d\xc8\xfe\x59\xe2\xf8\x91\x3d\x92\xd0\x2d\xd9\x5e\xa9\x70\xb6\xc7\x27\x21\x9d\xf0\x5d\x57\x89\x27\x29\x61\x70\xd8\x01\xf5\xc0\x8d\x31\x95\xd0\x5d\x2a\x65\x20\x18\x8a\x0a\x94\x52\xfa\x24\xd8\xf3\x08\xa1\xa9\xee\x45\x74\xd9\xa3\xcd\x97\xba\x28\xf6\x42\x9e\x84\x57\x5d\x59\x11\x70\xc1\xef\x09\x18\xec\x95\xc0\xaa\xf3\x01\xb4\xa2\xd4\x5c\xe0\x69\xeb\x53\x23\x16\xad\x46\xb0\x3c\x57\x78\xae\x18\xad\xa0\xba\x9d\x30\xa6\xb2\x2d\xe5\xe0\x2f\x74\x0b\x42\x65\x11\x01\xdb\x13\xf8\xa9\x84\x00\x02\xc1\xec\x71\x66\x01\x69\x76\x36\xc0\xfc\xb8\x0b\x19\xe4\xe1\x96\xcc\xa1\xbb\x5f\x0a\xdd\x29\xa5\x96\x27\x6c\x7f\xfb\xc1\xe6\xcb\x3d\xb7\xc5\x86\xa4\x04\xf5\x0a\x43\x29\x60\xe1\x03\x76\x57\x7b\xd6\x97\x7b\x93\xbb\x13\x55\x2a\x76\x6b\x14\xcb\x4a\xf0\x8f\x65\xa5\x0b\x77\x85\xf2\xb1\xeb\x36\x00\xac\x34\xf1\x20\x26\x7f\xc6\x86\x94\x95\xb2\xc5\x0a\x69\x8f\x77\x7a\x9f\x70\x42\xb4\x22\xe1\xbf\x6d\xa6\xf7\x2d\x74\x86\x28\xe3\x7f\xc6\xd1\xe6\xed\xab\xc3\xfe\xca\x31\xe9\xa5\x27\x6c\x64\x09\xc9\x7b\x2c\x09\xd1\xfe\xc3\x27\x21\xa4\x80\x54\x87\xa8\x96\xd1\x40\x36\xf1\xc8\xfa\xb9\x89\xf6\x02\xdd\x91\x04\xbf\x77\x9f\x77\x8f\x52\xf7\xa8\x68\xf1\x90\x9a\xdd\x81\x03\xaf\xaf\x8e\x11\xc8\x99\xda\xfc\x47\x16\xbd\xf3\xf7\x6a\x55\x9a\x6c\xcd\x41\x40\x1e\x6e\x10\xb0\xe7\x12\x04\x3f\xd1\x38\xc6\xe8\xc0\xc7\xa3\x4b\x68\xdb\xc3\xf7\xae\xbf\xf1\x03\x72\x09\x9f\xd6\x78\x50\xff\x84\x88\x13\xca\x46\x61\x47\x24\x40\xec\xd7\x22\xbc\x30\xac\x7b\x70\x16\x31\x7f\x43\x65\x22\x5e\x32\x9d\x25\x6b\xf0\x1b\x64\xdb\x1c\xda\x6e\x74\x04\xa2\x26\x94\x47\x04\xed\xa5\xb6\xad\xb4\x23\x00\xc7\xc6\xe2\xd3\x52\x16\x99\xa4\x8f\x49\xfd\xb1\x43\x53\xc6\x39\xa3\x06\xd8\xcb\x09\xa9\x27\xba\x69\x4b\xd1\xfc\x1d\xc9\x47\x36\xc0\x70\x1b\xd7\xf9\xf8\xd5\x7d\xf5\xbe\xae\x0e\x7d\x9e\x44\x56\xf8\xa9\x52\x42\x87\x4e\x0e\xf4\x33\xd2\xf2\xf1\x1b\xa2\x3a\xc0\xa2\x83\xcf\x60\xc7\xcd\xe6\x87\x0f\x98\x84\x22\xb1\x21\x52\x81\xee\x58\xb3\x94\x01\x20\x3b\xde\x2e\xa0\x7c\x1f\xbc\x86\x6d\xc6\x1a\x4e\x7e\x0c\x56\xe4\x2b\xa2\xa9\x80\x6e\x21\x5c\x02\xd0\xda\xce\x3e\xb9\xb7\x6a\xe7\xee\x5c\xd6\xe9\x9b\xdf\xd7\xce\x8d\xad\xa4\xcf\x2f\x51\x44\x42\xe2\xd0\x5d\x2d\x80\x8b\x0b\x41\x39\xb0\x3c\xcb\x38\xae\x53\x59\x72\xd6\x28\xb9\xed\x41\x79\x88\xdf\x7e\xa7\x0a\xed\xba\x97\xc8\x57\xa1\xbb\xe2\x69\x63\x7c\x40\x0b\x03\x37\x79\x55\xd8\xac\x73\xb8\x85\x43\x04\xad\x61\x3e\xa8\x66\x1d\x44\xd3\xc4\x89\xea\xe2\x36\x46\x08\x5c\xd3\x83\xd9\x8b\x81\x9e\x00\x76\xa6\x6b\x43\x37\xcd\x27\x38\x0e\x49\x7c\xea\xe0\xc2\x39\xf9\x56\xc1\xf5\x70\x08\x2d\x3c\xa4\x58\xb4\x2e\x5c\x62\xe0\x77\x74\x5e\x62\xaf\x1f\xb7\xbe\x9b\x5d\x68\xb6\xde\x5d\x53\xf8\x1a\x4f\xa7\x05\x95\x22\xb2\x4e\x10\x42\x9f\x66\x59\xa3\x78\x18\x80\x05\x0f\xdb\x43\xa5\x33\x88\xf2\x95\x3a\xa7\xaa\xb4\x03\x56\xd1\xca\x82\x1e\xb9\x67\x28\xa2\xc2\x4c\x61\x10\x0d\x98\xe1\xde\x2d\x61\x3f\x1d\x1e\x5f\xb5\xb4\x05\xc6\x7a\x91\xad\x57\x2f\xef\xd3\xdc\x9c\xba\xbb\x1a\x0f\xc6\xe0\x54\x24\x0c\xf3\xee\xa0\xa8\x79\x7e\x3f\x60\x66\x69\xd6\x96\x75\x59\xd9\x8d\x2e\xd2\x6c\x8f\xfc\x9d\x70\xa7\xfb\x00\x9e\xbb\x68\xd0\xb4\x7a\xa7\x6c\x91\x04\xf3\xaa\xdd\x25\xed\xf7\x12\x58\xcf\x89\x02\xe4\x23\x1a\xc9\x95\xca\x8c\x2e\x2b\x94\x86\x81\x82\x52\x48\x97\x04\xff\x40\xc0\x5a\x89\x4e\x99\x4d\xa2\xdc\x62\x65\x35\x38\xc4\x64\x51\x63\x82\x49\x14\x35\x6e\x4d\xc1\xe6\x32\x8d\x96\x5c\xa1\x09\xdc\xb6\x34\xd8\xad\xe1\x95\x55\xf4\xf1\x4c\x44\x03\x8f\x16\xdc\x3f\x69\xc0\x97\x87\xd6\x90\xac\x37\x17\xde\xe6\x8a\x10\xdf\xb0\x09\xd7\xe4\xc1\x45\x31\xfe\x03\xfd\xec\xab\x63\x08\x78\x09\xb1\x1e\xb8\x61\x30\x29\x8a\xfe\xfc\x1a\x4b\x3c\x05\x6a\xbf\x15\x9e\x60\xbf\x3f\x6a\x92\xb4\x9b\x9e\xde\x96\xd0\x45\x36\x60\x68\x45\x79\xbc\x1e\xfe\x75\x56\x2f\xf8\xd4\x5f\xe0\x48\x7b\x9b\x24\xf2\xc4\xd7\xe1\xb0\x08\xd2\x7f\x5b\xcc\xc0\xe1\x04\x6c\x22\x3a\x6d\xc8\xf1\x62\xa0\x34\x76\xa1\x40\x35\x14\x61\xec\x20\x7d\xe8\x5b\x8c\xa1\x33\xbf\xc6\xa2\xfa\x65\xd4\x2f\x24\xdf\xba\xd5\xac\x2c\x73\xef\xa8\x41\x97\x28\xf8\x18\x89\xda\x66\x35\x91\xfb\x05\x0a\x2c\x58\x1c\x6b\xbd\x8c\xca\x44\xc1\x25\xa2\xcf\xe3\xf1\x5a\xa4\x5b\x4c\xda\xae\xe4\xc5\xe4\x1a\x97\x0a\x89\x75\x50\xd9\xcd\xb2\x48\xb9\x29\xf4\x48\x54\x88\x82\xcd\xc6\xf2\xfb\x86\xad\xd3\x76\xa1\xb6\xdc\x1a\x90\x4f\x73\x77\x81\xaf\x19\xc9\xf7\x90\x86\xf3\x31\x19\x6f\xa9\xca\xaf\x1d\x3b\xef\x1a\xc3\x7a\xf4\x64\x5b\x48\xd1\x94\x93\xb0\xf0\x37\xfa\xef\x58\x0a\xb3\xb5\x39\x58\x9d\xc7\xd8\x41\xd7\xe2\xaf\xa6\xc8\x4d\x46\x72\x7d\xee\x70\x3e\xe1\x0e\xa2\x22\x1e\xac\xf9\x7d\x59\x99\x0d\x46\x83\xb8\xb0\x5f\x4c\x68\x51\xbb\x49\xa0\xfa\x31\x2a\xed\xa0\x57\xb1\x1d\xce\xb2\x25\x29\x55\x71\x8a\xc1\x23\x6a\x81\xa6\x1d\x20\x9e\x0f\x65\x4e\x61\xfd\xa7\x81\x77\x02\x96\x3a\xf8\x3e\xcb\x25\xbc\x9c\x70\x0e\x54\x32\x88\x69\x5f\x14\x00\xcc\xf4\x92\xe5\xca\xfd\xb7\x9c\x21\xfe\xa0\x33\xb0\x75\xe3\x07\xb4\x96\x1f\x5b\xd2\x60\x68\xa2\x72\xd9\xd2\xd6\x60\xc1\x97\x9d\x26\x63\x74\x1e\x9a\x07\xb0\x93\xa1\x76\x22\xf6\x57\x43\x38\x72\xb3\x35\x48\x77\xd9\x6e\x42\x23\xb2\x23\x06\x03\x46\xef\x4d\xff\x57\xcb\xd7\x87\x52\xef\xdf\x5b\xbd\xfe\x91\x97\xff\x66\x2a\xf6\x61\x1f\x3e\x25\xcc\x9d\x04\x65\xee\xe4\x31\x69\xee\x90\xf8\x62\x8c\x40\x2a\x91\xe3\x41\x9d\xbb\xb4\x0a\x26\xc9\xf9\x2d\x90\x2a\xa0\x06\x10\xa1\x36\x57\x18\x88\xa2\x48\x37\x73\x6f\xe3\x92\x74\xe9\x46\xa2\x16\x6f\xb3\x0e\x2a\xcd\x97\x42\x78\x1d\xea\x6e\x10\xd8\xe0\x8e\x5a\xdf\x7b\x67\xe9\xc2\xfa\xce\x02\x82\x1e\x1c\xf8\x28\x7d\x4a\x81\xb7\xc3\xf3\x62\x0b\xf0\xe4\x9a\x95\xc5\x9c\x94\xd7\xcb\x50\xdf\xb5\x2d\xec\x7d\xba\x48\xa9\xa6\x33\xd3\x3b\x9f\x2b\x27\xff\xaf\xdd\x1b\x78\x4c\x01\x32\x98\x09\x70\xc8\x40\x73\x88\x06\x3d\xec\xa8\x46\x88\xfd\x58\xa8\xc7\x77\xdb\xe2\x09\xa9\x42\xa0\x68\x12\x2e\x99\x58\xd8\x38\x9a\xe0\x0a\x6c\xd2\xd2\x26\x9e\x92\xd6\x7b\xaf\xcf\x4c\xab\x61\x8b\x43\xf3\x1b\x43\xd8\xf0\x5b\xc8\x49\xfb\xae\x8f\xe9\x0e\xaf\xa4\xdf\x8a\x9a\x7c\x4b\x8f\x23\x04\x41\x63\xf7\xd0\xca\x77\x17\x53\x16\x89\xa7\xcb\xf4\x2d\xfe\x05\x31\x19\xad\xb4\x7a\x9c\x52\xf7\x95\x72\xcf\x61\x65\x8e\x4f\x26\xac\x02\x7c\x3e\xef\x68\xf9\xe2\x99\xbc\xa3\x8d\x5d\x44\x50\x10\x92\x4c\xc5\x32\x22\x94\x40\xf3\xf5\x81\x8b\x7d\xe3\x20\x6e\xb2\x34\xb8\x49\xfa\xbe\xaf\xbe\xa5\x96\x52\x67\x99\xf0\x37\x29\xdb\xdb\xac\x99\x5c\x47\x75\x93\x18\x84\x41\xc1\x70\x41\x46\xca\xdf\x2d\xcb\xda\x94\x27\x4f\x55\x53\x1e\x33\xd6\x64\xb1\xa7\x56\xd9\x02\x18\x16\x44\xf1\x47\x11\x4e\xe9\x93\x6f\x2e\xbf\x84\x94\xd8\x81\x9a\xcb\xc7\xbf\xfb\x48\xd5\x65\xa8\xb4\xa4\xca\xc1\x46\xc5\xe5\x73\x2b\x2d\x05\x16\xce\x14\x15\xc6\xc7\xc5\xd7\xe8\xce\x6f\xcd\xe1\xff\xa6\x4a\xcc\x8a\x99\x5b\xc0\x95\x20\x34\x25\xd5\x66\x46\x75\x99\x69\xd5\xaa\xc3\x0c\xf5\x7f\xbf\xae\xea\x12\xad\xb7\x46\x5e\x26\x0a\x32\x81\x8a\x4f\xb6\xe2\xf2\xbe\x46\x6d\x9f\xaf\x55\xe3\x3c\x00\x71\x3c\x2c\xd3\x62\x59\x6f\xca\x0a\xf9\x35\xdc\x2b\x17\x3a\x0b\x27\xb8\x91\x8f\x97\x38\x4f\x8c\x34\x72\xd6\x83\x3f\x24\x72\x08\x9d\x9f\x77\x2e\x16\x16\xeb\x8a\xd7\x62\x9a\x73\x14\x05\xd2\x58\xb5\xa8\x23\x92\x96\xe6\x20\x4e\x48\x70\x36\xde\xf7\x02\xf9\x51\xc6\x75\xf9\x26\x70\xfb\x22\xcd\xb0\xe2\xf3\x17\x23\x70\xa1\x18\x72\x1d\x20\x08\xf8\xc9\x77\xf1\xcb\xef\x49\x68\xb5\x74\xfd\x13\x2d\xe4\x54\x1c\x5d\x4a\xc8\xdf\x43\x4f\x64\xb8\x63\x70\xa7\xa3\x69\x46\x93\x3f\x09\x71\xd3\xd4\x2d\x7f\x77\x96\xe0\x15\x4f\x92\xf7\x5e\x29\x1d\x22\xec\x6e\xc8\xd4\x35\x74\xd8\xd8\x6d\x26\xd1\x30\x77\x26\x37\x85\xad\xcb\x06\x81\x1c\x2b\x9b\xa4\x2b\xa3\x0a\xc8\x13\x82\xf8\x64\x07\xd3\x1e\x2f\x78\x94\x61\x47\x87\x04\x70\x7f\x74\xa0\xdb\x9c\x19\xeb\xe0\x0a\x44\x12\xe3\xb0\x1e\xfd\x97\xde\x51\x64\xb4\xde\xfa\xa4\x2c\x40\x97\x5e\xae\x6c\x8e\xe3\xbf\x32\x4b\x48\xfb\xaf\x15\xdc\x90\xaa\x84\xda\x5d\xb0\x04\x09\x82\x1a\x9d\x62\xd4\x56\xaf\x70\xe4\x8f\x23\x6a\x24\xa6\x5d\x3c\xac\x81\x0e\x42\xba\x0a\xf1\x24\x06\x31\xdd\x40\x70\x7c\x60\x65\x03\x12\xcd\x35\xd5\xbd\x27\xdb\x13\xba\x68\x47\x3e\xe2\xc2\x64\xa9\x79\xf0\xe5\xb5\xad\x0b\x0b\x2f\xd6\xb2\xea\x0c\x26\xfe\xc9\xc3\xd1\x9a\xd1\x89\x97\x84\x2e\x6d\x52\x22\x97\x02\xe5\x00\x94\x0f\x84\x90\x03\xa7\xa8\x70\x07\x17\xf9\xa6\x8b\x68\xf5\x2f\x04\x4b\x85\x74\xd2\xdb\x3a\x02\x0d\xc0\x8f\x3b\x19\xc1\xed\x2a\xa3\x76\x74\xdc\x09\x90\xa1\x5e\xad\x30\xe8\xb0\x05\x31\x1d\x75\x67\xdc\xc7\xb7\xf7\x90\xe6\x8e\xba\x28\xb0\x29\x50\xb5\x29\xa8\xef\x7d\x57\x02\x50\x2e\xfa\x6a\x84\xb0\xc7\x20\x0e\xd0\xa9\xe9\x8d\x05\x5b\x83\x07\x02\x8f\x8e\xba\xa4\x17\x98\x15\x95\x15\xbb\xdd\xac\x4b\x93\x34\xa5\xd8\xbd\x6c\x3d\x76\x55\xb4\x50\x97\x6e\x55\x72\xe4\x90\xf2\x86\x0b\xbb\x6a\xa7\xc6\xdc\xa4\xfe\x80\x78\x95\x83\x58\x6f\x37\x50\x8c\x91\x40\x42\xa3\x15\xcf\x78\x6e\x76\x8d\xd2\x26\x73\x08\xf4\xdd\x2a\x22\xee\xab\x99\xeb\x5a\xf4\x08\xf0\xa2\x16\x26\xd4\x3c\xe7\xaa\xdc\xa6\x45\xea\x49\x74\x98\x37\x9d\xbe\x81\x05\x07\xae\x81\xab\x14\x22\x72\x69\x4e\x25\x6d\xb2\xa8\xde\xbd\xc2\xc3\x16\x31\x75\xb1\x34\x05\x91\x9c\x81\x75\xcd\x45\x73\x69\x09\xd1\xd3\x9c\xe8\xf3\xd3\xfc\xae\x4e\x4b\x70\x91\xf8\x13\x79\xbd\x59\x98\xc2\x6f\x03\x6f\xe4\x22\xb1\x26\x58\xcf\xf1\x47\x5b\x8e\x04\x51\x95\x05\xd0\x1b\x5d\xb6\xbd\x96\x2a\x7c\x2f\x89\x51\xe7\x1e\x47\x21\xf5\xf8\xee\x0f\x60\xfb\x68\x5b\xf1\xa1\xc6\x8d\xb2\x05\x5f\x13\xbf\x52\x80\xbe\xd5\x75\x9f\xa2\xc0\x31\xd8\x3f\x39\x02\x81\xdd\x62\x79\x6f\xd9\xce\xe7\xaf\x38\xc7\xf4\x1b\x1a\x03\xf8\xa2\x57\xde\x7a\x64\xf0\xa7\xd8\x1c\xdd\x2a\x12\x80\x57\xc3\xe3\x37\xc2\xbe\x53\x56\x2e\xda\xbf\x0d\xa3\x1a\x57\x1a\x24\x7d\xdd\x0e\x33\xf1\xf5\xc0\x60\xf5\x75\x43\x62\xeb\x83\x0c\x48\xfb\xcb\x52\x9e\x71\x4f\x74\xb5\xf1\xb6\x43\x1f\x7b\x07\x65\x12\x76\x63\x50\xa7\x0b\xee\x02\x1f\x5f\x2c\x3d\xc8\x18\x4b\x21\xdc\x0d\x06\xa3\xce\xfb\xee\xae\x96\x2a\x95\xd5\xce\xaa\x3b\xab\x33\x12\x85\x87\x82\x48\x4f\x70\x08\x26\x41\xa5\xab\x1a\x51\xb4\x59\x26\xfc\x7f\xf8\x15\x57\xcf\xc4\x45\x29\x68\x6d\x6c\xac\x37\x36\xca\x7b\x5d\xb0\x06\x48\x61\xe8\x0a\xf1\x5f\xb9\xc3\xc3\x24\xdb\xc3\x4c\x07\x42\xfb\x2f\x30\xf1\x67\x7d\xf5\x7e\x08\x2c\xdf\x4d\x72\x7d\x2a\xb8\xba\x54\x1f\xa6\x43\x20\xb0\xbe\xf8\x34\x98\x7e\x1c\x02\xd3\x3c\xca\x11\x8b\x67\x01\x7e\x35\x62\xe3\x26\x5d\xa2\xe1\xdf\xe6\xc3\xf1\x5c\xdd\x0c\xa7\xd7\xa3\xf9\x7c\x78\xa9\xde\x7f\x51\x83\x9b\x9b\xab\xd1\x05\x50\xa9\x5f\x0d\x3e\xf7\xd5\xf0\x6f\x17\xc3\x9b\xb9\xfa\xfc\x69\x38\x0e\x0c\xe0\x6a\x36\x1f\xb8\xcf\x8f\xc6\xea\xf3\x74\x34\x0f\x12\x4a\x4d\x5d\x3a\x92\x52\x42\x16\x75\xe0\xb1\x1f\x7a\x65\x80\xa8\x4f\xcc\x0c\xfc\x38\x25\x70\xcc\xe1\x3f\xbc\xec\x96\xfd\xfb\x23\x84\x94\xfb\x38\x80\xe3\xf9\x68\x3a\x54\xd3\xd1\xec\xaf\xc8\xc8\x0f\xbf\xfd\xf7\xdb\x81\x7f\xce\xcd\x70\xfa\x61\x32\xbd\x1e\x00\x87\xfa\x87\xe6\x34\xba\xde\xaa\x2f\x93\xdb\xbe\x9a\x7d\x9a\xdc\x5e\x5d\x46\x7f\x77\xc3\x34\x54\x97\xc3\x0f\xc3\x8b\xf9\xe8\xe7\x21\xe9\x4a\xcd\x66\xb7\xd7\x43\x1a\xed\x19\xca\xf3\x5d\x5d\xa9\xf1\xf0\x62\x38\x9b\x0d\xa6\x5f\x88\x5f\x1e\x46\x61\x3a\xbc\x19\x8c\xa6\x28\xf3\x37\x9d\x0e\x41\x20\x00\x4f\x94\xf3\x98\x54\xff\x76\x7c\xe5\xfa\x3a\x1d\xfe\xfb\xed\x68\xda\xb5\x0c\x80\x0d\xff\xe3\x74\x88\xca\xcc\x62\xd6\x41\x77\x10\x68\xd9\x1b\x53\x9f\xc4\x04\xfa\x28\x74\xf8\xf9\xd3\x04\x58\xd8\x01\x31\xfd\x85\x17\xc7\x74\xe8\x21\xd5\xf1\x9a\x18\xcc\xc4\xd2\x1c\xbc\x9f\xb8\x31\x08\x44\xff\xf3\x09\x0c\x88\x20\x82\x97\xca\x8f\xee\xd5\x54\xa4\x28\xd8\xfe\x83\x04\xc0\xb3\xc5\x0f\x3d\xa1\xfd\x54\x8d\xc6\xbc\x42\xe6\x13\xd5\xdc\x94\xc7\x8f\xa9\x4e\x7a\xae\xff\xcb\xc1\x7c\x00\xba\x89\xee\xbf\xef\x87\xee\xd3\xd3\xe1\xf8\x72\x38\x85\xcd\x34\xb8\xb8\xb8\x9d\x0e\xe6\xf0\x32\xf7\x8d\xe1\x4c\xcd\x6e\x67\xf3\x01\x08\x24\xbc\xff\x02\xfd\x85\xad\xcc\xda\x91\xb0\x80\xdd\x02\xfd\x30\x18\x5d\xdd\x4e\x5b\x4b\x6c\x3e\x51\x93\x9b\x21\x3c\x12\x96\x9a\x98\x10\xfc\xc4\xec\x24\x50\xf3\x03\xf9\x3e\xce\x9e\x8a\xf6\xec\x17\xf5\x69\x30\x53\xef\x87\xc3\xf1\x37\xd1\xf7\x0f\xc7\xf8\xb9\x0e\x44\xfd\xd1\x27\x44\x35\x0d\xc0\xe9\x9c\x07\x16\x46\xf7\x4b\x90\x3c\x1b\x9b\x1d\x5f\x66\x25\x33\x1a\x11\xb9\xa4\xd2\x6c\xf1\x04\x2c\x8f\xa8\x14\x23\xc3\x9f\x2e\xc4\x3b\xa8\xad\x28\x2b\xb5\xb5\xcc\x08\x53\xfa\x4b\x06\x9d\x37\xf2\xaa\xdd\x87\x76\x1a\xf9\x5b\x96\xf7\xce\x87\xc0\x5b\x1d\x01\x1c\x70\xd1\xa4\x55\xe3\xc4\xc7\x8b\xce\x17\xc2\x2c\x75\x1e\xc7\x2f\x45\x31\xa5\x04\x7d\x81\x41\x03\xb5\x65\x1c\x72\xad\x2a\xbd\x6c\x4a\x11\x7b\x48\xad\x95\x59\xd0\x3e\x39\xe2\xa5\x5e\xbb\x16\xbb\xd6\xfa\x2f\x6f\xf8\xb3\x80\xb9\x83\xec\x91\xa0\xf8\x47\x81\x2e\xaa\xb5\xc4\xd2\x0e\xd2\x17\xb3\xf9\x83\xd9\x53\x3e\x0a\x18\x5b\xd0\x0a\x8b\x61\xb9\xf0\x28\x78\x06\x31\xb6\x22\x29\x54\xc8\xd2\x1b\xd5\xf3\xf7\x7d\x0f\xd4\xa5\xc8\xe7\xdb\x5a\xf0\x6f\x90\x10\xdb\x50\xf1\x28\xa4\x01\xb8\x24\xdf\x5d\xdc\x75\xbe\xea\x1f\xfd\x19\x50\x11\xf0\x5d\xce\xf4\x8b\xbe\xbf\x28\x83\xc4\xa8\xce\x55\xba\x32\x1a\x91\x3f\x1a\x26\x1e\x10\xd9\xea\xa7\x46\xc1\xf1\x9f\xd5\x7e\xbf\xdf\xab\x9f\xd4\x9f\xf1\xcb\xee\x36\x47\x53\xe6\xa7\x16\x0d\x44\x34\xbb\xef\x7c\x55\x60\x34\xa7\x68\xce\x8a\xfa\xaa\xb4\xea\x46\x5b\x3e\x5a\x95\xab\xcb\xe7\x5b\x81\xef\x44\xd9\x02\x96\x57\xab\x98\xc0\x1f\xb2\x38\xc7\x31\x1c\xf9\xa4\x6d\x04\x3f\x4e\x7b\x41\x6e\xd4\xbd\xdd\x92\x3b\x0e\x90\x01\xb4\x9b\xea\xd2\x00\xab\x93\xf3\x46\xba\xe8\x31\xde\xf9\x1a\x07\xca\xf0\x19\x4f\x34\xe4\xf1\x94\x76\xdd\xba\x68\x6d\xf1\x8c\x7b\x96\x29\x3e\x1e\x19\xcc\x35\x33\xe9\x93\x78\x54\xff\xe8\x0b\xf0\x92\x85\x65\x1a\x20\x0e\x11\x74\xe3\xb1\x09\x92\xb9\xc6\x30\x6a\xef\x9c\xe7\x99\xdb\xa6\x71\xfc\x78\x29\x7b\xa2\xfe\x91\x5a\x76\x24\x4a\x06\x5f\xbe\xa1\x14\x40\xd8\x50\x00\x00\x60\x09\xa2\x5b\x4a\x26\x33\xcb\xaa\xb0\x79\xba\xa4\x7a\xb9\xad\x29\xd4\x46\xa7\x19\x50\xc3\x45\x80\x8a\x08\x15\x9a\xf8\x43\x8e\x8a\x34\xb4\x1b\xc2\xc2\xe3\x66\xb3\xf4\x2b\xcb\x9b\xdf\x3b\xb7\xbb\xc2\x63\xa6\x24\xe2\x67\x89\x2f\xdd\xd8\x95\xf9\xf1\xe8\x63\x6e\x37\x4c\xf4\xc5\x4b\xf7\xbb\x1f\x92\x06\xf7\xff\xde\xe8\xa2\xb9\x33\xe5\x37\x97\xd6\x19\xfa\x30\x11\x83\xf7\xb3\xc9\xd5\xed\x7c\x78\xf5\x45\x9a\xb7\xef\x60\xfe\x59\x37\xac\xda\x6f\x8d\xfa\x0f\xa8\xe4\xdc\xbd\xa0\x4a\xac\xe6\xce\x0e\x77\x06\x1c\xe2\x26\x73\xef\xc0\xb8\x6f\xbc\xd1\xa9\x0a\xc9\xc7\x74\xd8\x51\x7a\x27\x5f\xb3\x7c\x21\x1b\x80\x65\x69\xf7\xfb\xad\xf3\xbe\x90\x67\xc4\x43\xa7\xb9\x59\xf0\x7a\xff\x65\x5a\xa7\x5c\x7c\x1a\x81\x97\x23\xe7\xee\x50\xdd\xd6\x64\x0d\xe9\x0e\xd6\xfa\xf4\xaf\x83\x54\x2e\x45\x82\x16\x86\x65\x24\xc1\x79\x02\x9f\x5f\x14\x0d\x75\xb6\x8c\x6a\x80\x30\x7e\x0e\x1b\x7b\xe1\xa6\xb6\x2e\xcd\xe9\x32\x4b\x97\x5f\x51\xe0\xdc\xe4\xb5\x4a\x2b\xb3\x29\x4f\x4f\xdd\x41\x0c\x0e\x6e\x59\xa7\x98\x6a\xf5\x95\xee\xd1\x96\x04\x04\xdc\x9d\xa1\xf3\xca\x6c\xb6\x99\xdd\x9b\x42\x1d\x73\xc9\xb7\x47\xfd\xd2\x97\x37\xa6\x38\x51\x58\xc7\x5c\xa8\xd2\x79\xd5\x19\x26\x20\x72\x04\x87\x97\xe9\x5d\xae\xb4\xb8\x7e\x44\xe9\x4a\x2f\xd4\x77\xb0\xc1\xe0\x76\x30\x0b\x12\xf6\xd5\x27\xc2\x7e\x6b\x55\x42\x6a\xe3\x1d\x91\xca\x56\x24\x68\x5d\xfe\x78\xf4\xc5\xee\xed\x6a\x9f\x1b\xde\xcd\xc4\xd6\xcd\x2f\x29\x99\x40\xc7\x6b\x4b\x57\x06\x42\x8c\x74\xa4\xf2\x76\xfb\x0f\xb1\xac\x5f\xa8\x63\x42\xe5\xe9\xaf\xa6\xc4\xa2\xd6\x52\x11\x64\x24\xcd\x4c\x51\x9e\x48\x0e\xa5\xbf\xb8\x86\xa8\x4f\x7a\xf9\xd5\x14\xee\x96\x44\x3c\x47\x8d\x44\xc3\xf3\xbd\xba\xb0\x36\x57\x3f\xa9\x44\x9d\xa9\xc1\xb6\x48\x33\xa0\xd9\xe0\x3f\x24\xea\xa6\x30\x65\xca\x35\x51\x3f\xa7\x4b\xf3\x8f\xd0\xdd\xf4\x5f\x5e\x4e\x2e\x7e\x3f\xea\x2f\xf8\x79\x9c\xff\xe5\xec\xd5\xdb\xef\xce\x9a\xfa\xcf\xaf\xdf\xfc\x8b\xff\xeb\x0f\xf9\x09\xc7\xb7\x3b\x2c\x82\x24\xe8\x48\x5c\x4e\x6e\xcf\x0d\x2e\x86\xc7\xf3\xeb\x93\x44\xcd\x07\x13\xfc\x9f\x8b\x11\xff\xdf\xe5\x20\xe7\xbf\xba\x87\x5c\xd8\xd9\xf5\xe8\xc2\xfd\xfb\xe8\xc9\x6f\xfd\xd4\xf5\x35\x75\x7c\x6f\xf2\xa5\x59\xdb\x02\x88\xc9\x09\xa4\x07\xb1\x2a\xd5\xbb\x9c\x5c\xf8\xa3\xbf\x87\xf2\x9a\x8d\xc0\xd4\xa5\xad\xef\x32\x5d\xaa\x8b\xbe\x9a\x2d\xef\x37\xe9\x0a\xfb\x76\x8f\xe1\x7d\x94\x6f\xba\x2b\x6c\xbd\x75\x3b\xf4\xb3\x86\x90\x69\x65\x73\x75\x9b\xa7\x70\xb1\x55\xfb\x44\xfc\x3f\x70\x33\xeb\x2c\x5d\xdb\x22\x4f\x75\xa2\x46\xc5\x43\x9a\xd3\xa5\xf3\xb3\x76\x57\xca\x22\xcd\xaa\xe8\xcb\xb1\xae\xca\xd9\x0f\x3f\xbc\x3e\x3d\x7f\xf5\xea\x87\x04\xd9\x51\x9b\xf2\x55\x33\x80\xbf\xc8\x6e\xb9\x03\xcc\x6e\x4d\x7e\x8a\xb6\x7e\x02\xf7\x5d\xb6\x57\xfa\x41\xa7\x19\x01\x82\xf9\xee\xe3\x7b\x0f\xae\x44\xd4\x8f\x09\x40\xa5\x50\xe5\x16\x6e\xc2\xd3\x53\xcf\xcc\x4c\x29\xc5\xb4\x28\xcc\x83\x5d\xea\x45\xb6\x3f\x3d\x75\x47\x5c\xd4\x96\xa8\xa0\x31\x5f\x45\xa0\xb5\x2d\xd7\xd4\x07\x24\x19\xb5\x58\x70\x58\x7f\x1b\xd5\x58\xa0\x12\xe0\xf2\xad\xc4\x59\x46\x08\x01\x0a\xf2\x37\x32\x1c\x29\xf8\x28\x85\x9d\x87\xdc\xe1\x2b\xa3\x16\xb5\x9b\x1f\xa4\x8c\x89\x7a\x26\xe8\x4b\x40\x95\xa9\xaf\xc6\xb6\xf3\xa9\xb9\x31\xab\x92\x3c\xd1\x20\xc3\x81\xd7\xdb\xdf\x91\x6a\x22\xdd\x32\x4a\x31\x40\xfc\xa0\x53\x78\xcb\xf9\xda\x7f\x18\xb0\x8a\x6c\x5a\xe7\x8d\xb8\x2b\x3d\x9e\xfb\xbc\xc1\x8f\xfd\x32\x20\x20\xfd\x87\xa8\xc5\xa5\x27\x91\x47\xdb\x26\xb7\x02\x24\xd0\x32\x81\x88\xce\x9d\x5a\x24\xc4\x6f\x38\xd9\x76\x60\xa0\xdc\xb8\x54\x46\x4c\x83\x1f\x38\x86\x1a\x6c\xd2\x52\xda\x39\xad\x35\x84\x78\x41\x84\xf2\x8a\x89\xa3\x62\xf7\x3d\x98\x3b\xd9\x1a\xb2\x1d\xee\x0a\x86\x08\x2b\x52\x2f\xb8\x81\x25\x83\xa9\xe3\x89\x20\xcf\x04\x6e\x3e\x54\x0b\xa5\xc0\x5c\x8c\xdc\x05\xd1\xa7\x61\x79\xa2\x74\xb2\x74\x92\x68\x5b\x61\x8f\x75\x2e\xf7\x9c\x54\x50\x06\x03\x38\xc3\x05\xe9\x96\x42\xfe\xa2\x62\x9a\x61\xe6\x83\xa1\x01\x79\xe1\x66\xa2\xbd\xd0\xd2\x3c\x5e\x06\x09\xa3\x26\x77\x46\x99\xdc\x59\x7b\xfa\xce\xa7\xd8\x33\xe3\xe6\x00\x39\x2f\x4a\xeb\x3e\xe2\x96\x09\x86\xa1\x8d\xb7\xc2\x60\x0f\x92\x45\x12\x6f\xd7\x1a\x31\x9f\x65\x65\x0b\xa0\x00\x74\x06\xec\xe0\x62\x08\x47\x30\x1e\xbf\x74\xf4\xca\x53\x17\xc8\x8f\xcb\xb4\x22\xec\xe6\x46\xa7\x79\x60\x8b\xe7\x77\x7c\xe4\x33\xb3\x02\x95\x31\xae\xe0\x76\xb7\x83\x77\x96\x46\xa4\xa6\x63\x56\x6a\x06\x99\xe2\x52\x1d\x8f\x66\xa3\xd9\x89\x07\x2f\xa0\x50\x14\x7c\xeb\x52\xcc\xc5\x04\x8f\x15\xd4\x95\x02\x7b\x76\x7d\xe8\x6c\x9e\x55\x7d\x75\x65\xeb\xb4\xf4\xc6\xa0\x9c\x2c\xbb\x8e\xe6\x31\xc4\xf3\xcb\x48\xbd\xbc\xf3\x33\x6e\xe3\xd5\x79\x5a\xed\xfb\x6a\x56\x2f\x7c\xa9\x13\xed\xdc\x07\x99\x6e\x28\xdd\xdf\x81\xc0\xf6\x3f\xfe\x43\x3b\xa7\xe4\xc5\x0b\x4f\xcb\x4b\x5e\x32\x42\x35\x75\x55\x5a\x79\x7a\xe1\x5a\xdb\x47\xae\xf4\x06\x11\xff\x15\x91\x42\x27\x2a\xb7\x79\x0c\xb1\x5a\x47\xb4\xdf\x9d\xac\xbe\x10\x37\x58\xa7\x55\xee\xa6\x7f\x6d\x5b\xd8\x13\x82\x50\x40\x9e\x36\xb7\x0a\xb7\x09\xa9\x67\x44\x1d\x82\x32\x55\x86\xe1\x23\x9f\x03\x00\x74\x12\x0f\xd5\x49\x18\x0d\x9e\xb8\xe3\x6e\xb3\xcd\x74\xb1\x4f\xd4\xd6\x0d\x1d\xb8\x9e\x98\xb6\xc4\x44\x3d\x68\xd1\xad\xf4\x46\xdf\x21\x0f\x09\x8f\x41\x9b\x47\x21\x51\x99\x45\x8d\xae\x75\x5a\x95\x84\x2f\x76\x8e\xc1\x0a\xd3\xb8\xcc\xf5\x0b\xb1\x3f\xcf\x9e\x8d\x72\x50\xf8\xfc\xbe\xba\x4a\xbf\x9a\x1d\xa8\xd8\x34\x2f\x54\x3f\x81\x30\x5b\x5d\x73\x45\xa9\xc6\xaf\x69\xbe\x4a\x22\xc9\x78\xd3\xf8\x14\x22\xb0\x93\xf6\xb4\xb9\x35\x1e\xcd\x40\xc7\xf8\xb7\x26\x17\x86\x4b\x17\x29\x9c\x1b\x84\xf1\x46\x0f\x10\xdf\xa5\x33\x80\x66\xd6\x25\x55\x5e\xa1\x0a\x04\x63\x53\xfa\x07\x2d\x98\x0b\x6f\xaa\x1c\x30\x53\x10\xf7\x4b\x0e\x9b\xa1\x92\xd5\xb2\xaa\x57\x80\x6b\xc0\x95\x41\x88\x5c\x58\x10\x38\xe4\x5d\x6a\x31\xcd\xb5\xea\x4f\xf8\x32\xa1\xe6\x96\x66\x59\x18\x44\x4b\x48\xe8\x90\xb3\xd6\xe4\x3c\x75\x54\x4e\xf7\xd5\xb5\x2d\x8c\xa5\x1d\x14\x56\x2e\x9c\xf6\x4f\xf7\xdd\x16\xcf\xee\xbe\x2d\x42\xef\xdb\x7b\x00\xd6\x26\x5c\x2e\x35\x96\x8b\xe3\x32\x0d\xe8\x27\xbf\x25\x78\x97\x78\xaa\xe9\xd6\x3e\xe8\x1f\x1d\x5c\x9d\xbc\x2e\xcb\x7a\x0b\x0c\xea\x88\x1e\xc7\xad\x02\x17\x78\xb8\xdf\x6d\xa0\xd9\x7e\xe4\xb4\xfc\x15\xeb\x40\x0e\x04\x58\xdd\x65\x8a\xfe\x2f\x51\x01\x26\x58\x3d\x44\xa2\x18\xb2\x40\x06\xbe\x4b\xfa\x51\x50\x21\xac\x06\x22\xaf\x1e\xaa\x25\x74\x61\x6b\xba\x0f\x40\xeb\xca\x57\x61\x0b\xd3\x87\x47\x00\x6e\x0a\x31\x5c\xde\x10\xe9\xb7\xf6\xf8\x97\xf3\xbf\x9e\x32\x1c\xb6\x02\x23\x94\xe1\xeb\xee\x4d\x60\x23\x65\x80\x66\x9e\xcc\xd4\x36\xd3\x15\xdc\xe1\xcd\xef\x3d\x76\x88\xf8\x0f\x85\xba\x85\xdc\xec\xd4\xed\x4c\xad\xf4\x3e\x43\xb3\x11\x48\x4a\x4a\x55\xd4\x99\x61\x7a\xab\x05\x70\xad\xdf\x01\xbe\xc3\xf9\x30\xee\x4e\x1e\xe6\xa6\xb8\xdb\xab\x1b\x9b\xa5\xcb\xbd\x1a\x20\x4b\xc5\xf9\xab\x57\x6f\x93\x1e\x67\x22\x4a\x67\x46\x62\x50\xd9\xbd\xa5\xf5\x0a\xcc\x9a\x1f\x5f\xce\xe6\x27\xf0\xba\x70\x21\xc6\xec\xe4\x48\xf0\xf5\xcb\xd6\xad\xa5\xcb\xd9\x9c\xa4\x9b\xae\xc1\x11\x3a\x7f\xf5\xea\xfb\x4e\x1f\x04\x99\xa4\xf0\x25\x2f\x57\x5e\x4d\x52\x67\x26\x5f\x61\x12\x5c\xc6\x2f\xe1\xdc\x6a\xd6\xd6\x10\x6f\x64\x28\x37\x58\x18\x12\x35\x08\xf7\xa8\xeb\x98\x6b\x13\xb6\x3f\x9e\xb1\xbd\xaa\xb7\x77\x70\x7c\xe0\x12\x6d\x3f\x1f\x6b\xc1\xd2\xfc\x2e\xdb\xa3\xa5\x03\x31\x9e\xe7\x3a\xab\xc1\xe3\x4c\x9e\xb1\x7b\x1e\x71\xf8\x04\x71\x3d\x17\x5d\x99\x7c\x65\x8b\x92\x4f\x0a\xb0\xdd\xd8\xf8\x47\x85\x1a\x20\x54\x6c\x91\x48\xa4\x9e\x41\xc6\xc7\xe0\x89\xaa\x9a\xe3\x47\xa2\xdc\x01\xbe\xf3\xeb\x8f\x40\x8a\xa7\x66\xb1\x28\x41\x6e\x9b\x84\x74\x24\x08\xf2\x0d\x6d\x7f\xe6\xf8\xdb\x22\x9a\x82\xdc\x16\x88\xcf\x49\x2b\x12\x49\x93\x7d\xb5\x21\x88\xf7\x0f\xf4\x99\xc0\xb1\x06\xe1\x5a\xb8\xac\x60\xcd\x78\xa5\x15\x4c\x84\x01\x32\xf5\xee\xce\x94\xcc\xe6\xb0\xf2\xc4\x0e\x70\x44\xe5\x15\x9e\x93\x20\x10\x8a\xbf\x27\x69\x5f\x67\xbf\x6f\x0c\xd8\xef\xfd\xa3\x76\x28\xe2\xbf\x1b\x35\x75\xff\xe5\x74\x36\x38\xbd\xbe\xfc\x3d\x43\x80\x4f\xf1\xff\xbf\x7d\xd3\x8a\xff\x7d\xf7\xf6\xcd\xbf\xe2\x7f\x7f\xc4\x4f\x9b\xf5\xfe\xf4\x3c\x51\xd3\xd9\x40\x5d\xea\x4a\xab\x99\x59\xd6\x05\x6c\x2e\x10\xf6\xbd\x20\x39\x68\xf7\xb9\x6e\x39\xdf\x23\x51\x82\xe4\x23\x3f\x5e\xf4\x5c\xde\xa5\x5c\xed\x12\xd7\xd4\x23\x8e\x99\x69\x41\xa8\x8c\xf9\xde\xa8\xde\xa1\x26\x5d\x5f\xbe\x55\xd7\xa6\x74\xd6\xf1\xe9\x65\xea\x76\xac\x1a\x64\x77\xb6\x48\xab\xfb\x4d\x0f\x22\x04\x59\xa6\x36\xba\x32\x85\x33\x2a\xdc\xce\x4d\x6d\x4e\xe5\x4d\x10\x5b\x34\xf9\x12\xcd\x7c\xd9\x3e\x4f\x6f\x59\xe7\x24\x65\x28\x18\x98\x31\xe3\xd1\xc1\xfa\xef\xfa\xd9\x92\xac\x8c\xfb\x07\xee\xca\xce\xcb\xff\xc6\x1d\xed\xb5\x38\x4e\x7e\xff\x5e\x9b\x88\x86\xbf\x7f\x74\xe8\x8d\x98\xda\xc8\xad\x2a\x0c\xe1\x5a\xa9\x82\x45\xc8\xbb\x08\x46\xc0\x86\x6f\xd4\x8a\xef\xb1\x44\x73\x59\xa7\x87\x3f\xf3\xa8\x17\x5b\x45\x76\x73\x0f\xdc\xba\x5e\xeb\xda\x0c\x0a\x0f\x91\xc7\xcd\x8e\x1e\x58\x0d\x65\x60\x3c\x63\x5a\x85\xc2\x48\x1d\xdc\xbd\xe0\xee\xf2\xfe\x49\x53\x1c\x41\x4b\x74\x79\xa0\x68\xfd\x67\x6f\xf0\x27\x7e\xfa\x2f\xff\x32\x9b\x8c\x7f\xdf\x04\xd0\x13\xe7\xff\xf9\xd9\x79\x93\xff\xff\xec\xed\xab\xb3\x7f\x9d\xff\x7f\xc4\x8f\x9b\x7d\x4e\x3e\x1f\xb5\x04\xe1\xcf\x15\xac\x0e\x5b\xdc\x35\xa4\x44\xa4\xc4\xb1\x59\x61\x86\x02\x5c\x3c\xa0\xec\x48\x3c\x3d\xaa\x29\x4a\xe7\xa9\x2e\x98\xd2\xb3\x41\x7a\x15\xa1\x6d\x05\xcf\x41\xbc\xa7\x90\xf3\xed\x18\xae\x81\x99\x4f\xfd\x24\x58\xd6\x02\x6a\x62\x70\x94\xf8\x20\x64\x50\x60\xf2\x65\x98\x8f\x47\x9e\x64\x11\x26\xe7\x50\xe2\x92\xef\x8d\x81\x6e\x79\x8e\xb8\x10\x46\x8e\x8b\xd1\x79\xfb\x9b\x96\x68\xd8\x2c\x82\x2b\x54\x96\xab\xea\x70\x88\x90\x8e\xe8\x9e\x4e\xfd\x99\xe4\xe2\xaf\x8b\x1c\x7d\xc0\x50\xd4\xdb\x10\x8d\x0f\x28\x33\x49\xc6\x07\xb4\x9e\x40\x3e\xf2\x2d\x72\x32\x5e\x33\xcb\x13\x9e\xa6\x79\x24\x81\x56\xa0\xfc\x9b\xc6\x80\x86\x14\x3a\x97\x2d\x47\x6f\xcc\xf7\xc3\x3f\xd5\xf3\x9d\x7c\xb4\x76\x85\x6c\xf7\xc3\x87\x34\xeb\x1f\xcd\x3f\x0d\xd5\x6c\xf2\x61\xfe\x79\x80\x88\x67\x82\x15\x5f\x32\x96\x38\x79\x0a\x4c\x8c\x28\xe2\x6e\x0c\x71\x17\x88\xd3\xbd\xf0\x51\xe4\x70\xf2\x24\x9c\x09\x70\x90\xe3\xc9\x78\x34\xfe\x30\x1d\x8d\x3f\x0e\xaf\x87\xe3\x79\x8c\xc5\x9d\x7d\x1a\x5c\x5d\xc1\xab\x06\xb7\xf3\x4f\x93\xe9\x4c\x11\xf9\x70\x0c\xac\x0e\x38\xd8\x0f\x04\xb4\xbd\xb8\x1a\x8c\xae\x13\x0f\x63\xf5\x08\x4e\xf7\x31\x6a\xdd\xe7\x4f\x43\xf8\xd5\x68\xac\x06\x63\x35\x00\x40\x30\x80\xc7\x27\xe3\xf9\x74\x70\x31\x4f\xd4\x7c\x32\x9d\xfb\xaf\x7e\x1e\xcd\x86\x89\xc7\xc3\x7e\x98\x4e\xae\x13\x46\xc5\x02\x1a\xd6\x7d\x6f\x8c\xb0\x62\x84\x97\x46\x33\x42\x98\x73\xc2\xce\x62\x5b\x2e\x87\x83\xab\xd1\xf8\xe3\xcc\x7d\x59\x7e\xf8\xbf\xfd\x9d\xf7\xaf\x9f\xf0\xd3\x7f\x79\x71\x73\x75\x7a\xf6\xdb\x8b\xfe\x88\x9f\xc7\xef\xff\xf3\xef\xde\x7c\xf7\xa6\xed\xff\xfd\x4b\xff\xe7\x0f\xf9\xb9\xb0\x9b\x8d\xcd\x9b\x78\xc9\x9f\xbd\x2e\xdb\x2b\x38\x99\x07\x17\x17\x93\xeb\x9b\xc1\xf8\x8b\x3b\x3b\x44\xc9\x83\x3f\xa5\x6f\xc7\x97\x43\x3c\x22\x10\x21\x0e\x90\xf2\xd1\x4c\x5d\x4c\xae\xaf\x27\xe3\x86\xb2\x90\x3a\xee\x41\xfd\x81\x3b\x2f\x7b\x27\x7d\x38\xf0\x6e\xdd\xe9\x34\x1d\xde\x4c\x27\x97\xb7\x74\x94\x4d\x63\x76\xf6\x06\x1a\xfe\x62\x32\x9e\xcd\x47\xf3\xdb\xf9\x70\xa6\xa6\xc3\x8b\xd1\xcd\x68\x38\x9e\xbf\x98\xb9\xa6\x0e\x6f\xe6\xa1\x44\x63\x34\x53\xfe\x65\x7d\x75\xd6\x3f\xba\x1c\x7e\x18\x8d\x09\xb9\xde\xbb\x10\x85\xbb\xc4\x6b\x0e\xac\x6d\xfa\x84\xad\x8a\xa5\x0e\x85\xa2\xa8\x74\x1f\xe9\x8d\x26\xd1\x1f\x3c\x4a\x22\x36\x60\xba\x38\xc3\xd2\x52\x0d\x98\xc9\x00\x6c\x82\x23\xa4\x55\x6b\xbc\x16\x31\xdf\xf5\x82\x92\x08\xf2\xd5\x4c\x2f\x97\x9e\x10\x2c\xdd\xa3\xcb\x25\x33\x26\x7f\x28\x3d\x09\x41\xac\xc6\xe7\xde\x1d\x21\x92\x1b\xab\x37\xe9\x51\x64\xc9\x1c\xfa\x0e\x57\xb5\x56\x94\x5d\x67\x20\x82\xec\xea\x82\x12\xf3\xc2\x7d\x8b\x84\xe0\x07\x4a\x0e\xbf\x7a\xe1\x1f\x59\xbe\xe0\x44\x98\x54\x76\x05\x16\x71\xb5\xd3\x40\xa1\x6e\x56\xcd\x06\x2d\xa8\x98\x3c\xfa\x4a\xc5\xc0\x02\xca\xd4\x6b\x2c\x1c\xb7\x79\xeb\xb3\x2f\x4a\xb5\x30\xf7\x3a\x5b\xf7\xa3\x56\x79\x59\x6e\xcf\x63\x75\x68\x40\x20\x68\xff\xa3\x3a\x4e\x11\x94\xe4\x89\x3e\x99\xdc\xeb\x50\x0d\x38\x62\x51\xff\x4e\x81\x86\x36\x57\xa3\x87\xa3\xa7\x85\xb2\xbb\x3c\x68\x4f\x47\xab\x47\x1d\xa7\xf4\x62\xcf\x95\x2a\x83\x10\x4d\x82\x83\x9e\xe8\x39\xf3\xf9\x4b\x83\xbd\x00\xb6\x84\x6a\xdf\xa8\x10\x8e\x0b\x95\xfb\x47\xbd\x2b\xe6\x33\xbe\xa1\x8c\x1e\x3e\x8c\xb9\x24\x08\x51\x89\x4d\x86\x74\xda\x62\xdf\x98\x55\xaa\x30\x75\x0d\x27\x18\x67\x9a\x05\x51\x76\x9f\x27\x20\xe9\x88\x52\xa3\x10\x74\x5a\x95\xf1\xe2\xd1\x19\x30\x30\x16\x08\x67\x5e\xda\xcd\x02\xdc\xf7\x36\x71\x78\xaf\xa1\x62\x00\x98\x84\x78\xc2\xe3\xc9\x69\xeb\xc3\xca\xad\xdb\x3f\xea\x4d\x99\xd9\x45\x0c\xa4\x6b\x8c\xe0\xbd\x38\x58\xdf\x2d\x8e\x00\x01\x0f\xc8\xa2\x23\xa6\xec\xab\xf3\xfe\xd1\x47\x67\xa9\xba\x23\x0d\x4c\xc7\x19\x1d\x52\xb3\xd8\x13\x88\xd9\x5b\xc5\xc3\xe1\x18\x91\xc3\x2e\x1d\xb8\x52\x4d\x03\xcd\x8e\xca\x6d\x7e\xea\xb5\x7e\x13\xcc\xcf\xed\xd2\x95\x49\x62\x02\x10\xa1\xe6\x10\x22\x7e\x85\x21\x48\x58\xa2\xb6\x85\xdb\x00\x1d\xf1\x30\xbb\x26\x3f\x6a\x89\xdc\x6f\xdb\x4c\xef\xc5\x6f\x88\xc8\xb1\x29\x81\x23\x49\xb7\x9a\x53\xe6\x61\x00\xd1\xb9\xcc\x90\x62\x2f\x5c\xdf\x6c\x09\xe4\x93\x1f\x83\xb7\xb9\x76\xf4\xe9\x58\xfe\xe7\x0d\x74\x83\x96\x05\x17\x4f\x6b\xdf\x51\x18\x32\x41\xe7\xd5\xf9\x9f\x49\xe0\x7d\xc4\x7f\x92\x26\x37\xf4\x32\x90\x9b\x11\x2f\xfe\x37\x0e\xea\x73\x46\x0e\xd3\x4b\x8d\xe6\xa3\x27\x18\x11\x44\xe3\x66\x8d\x68\x08\xe3\xad\x9d\xc7\xe2\xf0\xe9\x3a\x61\x14\x12\x96\xe8\x37\xbf\x90\xf2\x0d\x41\x67\x47\xd4\x03\x44\xa1\xd1\x21\xde\xf9\x3e\xa0\x3c\x27\xc6\x33\xd9\x36\x04\x00\x36\x04\xe4\x9a\x13\x81\xf4\x04\x9d\x9d\x8e\x28\xa3\x03\xa3\x86\x78\x05\x2b\xb9\x07\x9c\x63\xdc\x34\x40\x28\xde\xeb\x62\x85\x60\x42\x53\x28\x0c\x48\x7b\x56\x79\xb7\xd8\x60\x81\xc0\xb2\x5d\x9e\x88\xf5\xd6\xd2\x75\xd2\x19\xa1\xd0\x5a\x4b\x96\xd6\x6a\x25\x55\x0f\xa1\xf4\xbf\x6c\x9c\x94\xa5\x81\xf4\x7c\x75\x4f\x94\x55\xce\xa1\x57\xba\x2c\xeb\x02\x98\x66\x5a\xc0\xa9\x86\xe8\x78\x90\x86\x6d\x95\xe7\x7b\xa2\x99\x2a\x8c\xa6\x47\x5a\x74\x8b\x9a\x33\xdb\xf3\x5a\x8c\x2d\x5e\x62\xc4\x4a\x26\xdf\x2c\xd0\xfe\xf9\x5e\xa0\x5b\x2a\x2b\x86\x6c\xcd\x80\xc4\x52\x2d\x80\x9f\xa4\xe2\x4e\xc8\xa7\x0b\x16\xb4\x06\x0c\xe6\xf1\x76\x0a\xf2\xaa\xbe\x1a\x10\x93\x13\x2d\xcb\x40\x32\xcd\x41\x7a\xfa\x96\xdb\x0b\x7e\x4e\x24\x5f\x18\x4c\x2f\x1d\x3f\xa1\x07\x74\xf8\xb8\x29\xd9\xb8\x25\x6d\x33\x13\x8b\xca\xed\xf1\x78\x58\xd6\x85\x54\xe9\x78\xb4\xe1\xb9\x31\x2b\xb3\xe2\xa3\xa0\x8b\x48\x4a\x42\xd5\x1a\x3b\x01\x30\xd8\x82\x0f\x30\xcb\xec\x4e\xb4\x37\xa6\xa1\x89\x4c\x59\x4c\x0c\xf9\x8f\xbe\x28\x3b\x3a\xa2\x97\xf0\x68\x5c\x57\xfc\xca\x05\xb0\xf1\x1d\x24\xdf\x83\x9d\xb2\x3a\x69\x2f\x11\x9f\xe7\x60\x1d\x34\xdc\x01\x5f\x73\xbb\xcb\xcc\x0a\xb4\x3b\x81\xa3\xa8\xac\xd7\xeb\x74\x09\xcd\x0f\x77\x22\x8d\x15\x61\x66\xe4\xae\x89\x6a\x5d\x30\xcd\x5d\xdd\x77\x5d\xa7\x61\x73\xa5\x79\xd3\xe8\x50\xaf\xfb\x47\x54\xe0\xed\xfc\x9a\xd9\xd1\x20\x6a\xba\xa0\xab\x38\x38\xa2\x4d\x02\x5e\xc1\x84\x0d\xb0\xa6\x6e\x4b\x33\x4a\x66\x79\x4f\xa9\x22\x60\x0c\x97\x76\x1d\xe4\xf9\x68\x5d\x98\xef\xa4\xe7\x53\x95\xed\x57\x0a\x27\x47\x56\xb9\x86\xfd\x6b\x73\xb2\xdb\x99\xd9\x41\x5a\x4e\xf0\x0b\x01\xde\x8b\x9b\x13\x74\xc0\x01\x06\x8f\x69\xa2\x28\x52\x2c\x60\x7f\x45\xb3\x1f\x69\x95\xe1\xc5\xe7\xee\xf1\x18\xd0\x27\x1e\xf7\xe8\x33\x9a\x49\xb2\xe7\xe0\x07\xdf\x09\x87\x4e\x8e\x08\xf1\xf0\x3c\x67\x40\xc2\x71\x07\xa5\x6e\x6d\x6c\xe6\x23\x78\xcf\x34\x5f\x42\xce\x12\xb1\xe9\x87\x60\x9e\x0c\xf5\x96\x80\xce\xd0\xf0\xf4\x04\xc1\xf5\x65\x24\xd4\x87\xa5\x54\x7c\x05\x12\x45\x4e\x80\x96\xf8\x25\x83\x32\x56\x40\x6b\x12\x5c\x4c\xb9\xfa\xd1\x15\xc0\x99\x69\x9c\xd8\x70\x26\xbd\x93\x6e\xf1\x43\xdc\x96\x26\x3b\x73\x83\x1e\x2a\x54\x60\x40\xc3\xda\xf6\x11\xf2\x2a\xbb\xbd\x54\x0a\x5d\x04\x2a\xed\x24\x71\x3e\x54\x32\xd5\x41\xab\xc2\xa8\x8d\xce\x73\x53\x28\xf4\xbc\x3c\xe9\xd6\xf3\x08\xc3\x59\x8c\x88\x84\x67\x1b\x2d\x06\x9e\xb2\xd0\xec\x86\xdd\xe6\x1a\x2a\x76\x31\x67\x3f\x1b\x5f\xea\xf2\x57\xe4\xc6\x6d\x24\x75\xc2\x4c\xf1\xf3\x22\xf1\x34\xa1\x5b\xd5\x41\xbb\x17\x2d\x56\xc6\x55\x15\x66\x63\x51\x3a\x01\xab\xf9\x28\x23\x1b\x25\x35\x4a\xa6\xce\xa6\xd7\xa4\x6d\x35\x85\xd6\x11\x0f\xed\xa3\x14\xfc\xde\xb3\x3a\xa3\xe5\xc3\xc1\x08\xe4\x20\x3a\x7c\x8a\xc3\x54\xd2\xfc\x91\x5e\x96\x97\x20\x81\xeb\xad\x94\xe1\x9b\x69\x24\x6c\xe9\x5f\xdd\x7e\x61\xdb\xf4\x7b\xd3\x3f\xba\x98\x5c\x5f\x0f\xa7\x17\x40\x70\x21\x42\x63\x47\x17\x1d\x44\xec\xa4\x18\xe9\x97\x09\x30\x88\x21\x61\xed\x41\x79\xd9\x26\xb6\xd7\x20\xa6\xa1\x28\x13\xb5\xa8\xcb\x14\xce\x25\xb7\x85\x72\x53\x04\x0d\xa6\x2c\xfd\x6a\xfa\xea\xf3\x3d\x10\x12\x48\x40\x59\x83\xe9\x6d\xad\x97\xee\x3d\x5c\x20\x22\x90\x9e\x6d\x2a\xb6\xa4\x69\xb7\x83\x33\x4d\xcb\xa8\x6c\x5e\x63\x5a\x3e\x8c\x90\x6a\x81\x0f\x9b\xca\x54\x21\x75\x16\xcd\x16\x1d\x34\x6c\x72\x2e\x01\xdb\xa2\xb6\xb6\xa2\xd3\x2c\x3e\x26\xf1\x00\x89\xdd\x72\xc1\xf5\x0b\x86\x4f\x14\x7a\xfa\x35\x8d\x4d\xda\x21\xac\xe3\x9e\x98\x5d\x19\xb5\x39\xf1\xd6\x9d\xdb\x6f\x25\x66\x43\xd7\x06\xd8\x14\x50\xf2\x66\x93\xbb\xb5\x85\x1a\x2b\xad\xe6\xab\xe3\xde\x88\x3e\xe3\xae\xa9\xf8\xc9\xfa\x4e\xa7\x79\x59\x31\xf0\x19\x24\x44\xe9\x70\xa7\x63\xbf\x44\xc2\x75\x16\x32\xc9\xf6\xaa\x77\x05\x1f\x84\x9a\x3c\x01\x66\xc7\x6b\x3a\x51\x99\xde\x61\x21\xb1\xf7\x3f\x49\xfe\x96\x19\x97\xa5\x89\x1d\x99\x90\xdc\x18\x2c\x3b\xe9\x6c\xb2\x97\x9c\xf9\x05\xc3\x4e\xba\x2e\x83\x8b\xa6\x09\xb7\x68\x7d\x41\x47\x70\x6d\xbb\x46\x96\x22\x72\xb9\x11\x01\x39\xa0\x8c\x7e\x84\xf0\xf4\xa9\x89\x45\xb7\x50\x12\xbf\xb2\x51\xc7\xbc\x88\x4d\x4d\x21\x38\xe3\x3c\x83\x26\x8e\xad\x2a\x4c\x46\xda\x68\xf8\x01\x8d\x26\x3a\xd3\xf4\x12\xf9\x60\xdb\x74\x97\xe6\x09\x14\x80\x00\x97\xae\x7b\xca\x7f\xd6\x3a\x83\x0c\xb7\xce\x0f\x0e\xae\x3b\x26\x7f\x74\x57\xc4\xb6\xb0\x9b\x6d\x95\xc1\xa1\xcc\xc7\xd6\xe1\x31\xdc\x15\x29\x57\xf2\x04\x96\x4f\xbc\x22\xdd\xa5\x01\xa6\xff\x23\x4f\x08\xca\x05\x2c\x72\x87\xf8\x5f\x13\x6c\xcc\x83\xef\x26\xd1\x23\xb7\x1d\x04\xa1\x2e\x8c\x9e\x59\x39\xcb\xba\xca\xb8\xb4\xef\xce\x56\x29\x29\xfb\xc2\x1c\x1d\x1c\x04\xcd\x38\xa4\xd4\xf9\x34\x0c\x0c\x0a\x3d\x53\xba\xf2\x96\xb3\xf9\x65\x8b\x8c\x85\x91\x73\x14\x1f\x10\x1b\x2a\x2f\x0f\xae\xfe\xf3\x4f\x89\x1b\xfa\xcd\xdf\x5c\x9b\x1b\xe6\x0f\x88\x10\x03\x2b\x60\xf7\xf0\x10\x27\x1e\x7c\xab\x7b\xe0\xef\x41\x5f\x13\x2a\xd9\x31\x18\x07\xc1\x4f\xde\xc8\x70\x3f\x81\x8a\xac\x30\x6d\x79\x68\x2b\x1b\xda\x96\x10\xe5\x64\xfb\x21\x58\xd5\x20\xcc\x72\x4e\x3e\x74\xb7\xa8\xed\xeb\x81\x89\xd7\x57\xb7\xc1\x30\x29\xb9\x1c\xe1\x91\x75\xb1\x0b\x14\x22\xe1\xb0\xe4\x16\x89\x43\xa6\x7d\xd4\xcb\xfe\x3d\xb3\x53\x64\x0b\x06\x52\x6d\xf2\x7b\x4b\x61\x8e\x36\x96\xfb\x56\xa3\xad\xea\x4f\xda\x12\xac\xc4\xb2\xce\xaa\x47\xfb\x05\x66\xcc\x16\xca\x20\x81\x0f\x90\x8b\xa1\xde\xf6\x8f\x24\x09\x1d\x91\xbf\x0d\x66\x0c\x96\xb8\xfa\xa2\x66\xc3\xb9\xfa\x30\x99\xce\x3f\x61\x12\x5f\x26\xcb\x92\x26\xbf\x99\x4f\xf6\x81\x54\xb2\x27\x79\x7b\x3f\x98\x8d\x66\x2d\x78\x06\x91\x59\x09\xdd\xe5\x47\xb8\xdf\x04\x6a\x43\x12\xbf\xf1\x23\x01\xb5\x01\x8a\xcc\x89\x24\xaa\xe9\x7c\xc5\x7c\x34\xbf\x1a\x26\x6a\x3c\x19\x9f\x4a\x58\x46\xd2\xa2\xab\x99\x4c\x9f\x41\x57\x33\x8c\xc3\x29\x29\x86\x50\x80\x7f\x3e\xa6\x63\x5f\x19\x94\x4d\xe0\xe0\x82\x28\x87\xcd\x49\xd2\x8c\xcb\x4c\x57\x87\x75\x00\x08\x05\x05\xb1\x1a\xac\x15\x2f\xbf\x96\x12\x17\xe5\xef\x22\xc9\x20\xdf\x96\x8e\xe8\xcc\x2a\x2c\xea\x4a\x35\x18\xd9\x31\xb0\x04\xef\xf0\x97\x3a\x72\x1e\xa2\x7e\x46\x51\xd8\xa2\x4c\x24\xc3\x3c\x96\x56\x23\x0f\xb1\xeb\xbb\xbb\xd5\xd9\x34\x00\x17\xa7\x00\x7b\x01\x2a\xd7\x74\xa5\x93\xc0\x55\xe9\x0e\xc2\xff\xac\xd3\x6d\xf0\x90\xeb\x9c\x5c\x0c\x42\x7f\x62\xdc\xa9\x28\x6a\xcf\x1c\x4a\x05\x1f\x70\x36\x7f\xd7\x3f\xba\x1c\xcd\x00\x17\x33\x9c\xba\x99\xf6\x50\x98\x6f\x5f\xd8\x63\x5a\x7e\x3e\x6f\xac\xc6\x8c\xbb\x99\x8c\xd1\xac\x9e\x4c\x67\x84\xde\xf9\x34\xf8\x79\x08\x7f\xf3\x2f\xf4\x28\x9d\xcb\xd1\x74\x78\x31\x4f\xd4\x68\x1c\xfe\x8f\x39\xe9\x04\x51\xdd\xf0\x6f\xc3\xeb\x9b\xab\xc1\xf4\x4b\x72\x98\xa8\x4e\x30\xce\xb5\x97\xbd\xba\x9a\xcc\xe6\x6e\xff\x7d\x18\xcd\x67\x27\x89\xfa\x34\xf9\x3c\xfc\x79\x38\x55\xc0\x26\x79\x09\x30\x24\xd8\x93\x5f\xdc\x96\x9d\x4c\xbf\x44\xc3\x13\x21\x85\x02\x38\xc8\xb9\x0f\x17\x73\xf9\xb1\xc9\x14\x11\x43\xa2\x29\xe3\xe1\xc7\xab\xd1\xc7\x21\x24\xd3\x05\x8e\xe8\xc4\xe3\x88\x46\x63\xda\x91\x5f\x3a\x28\xf6\x1e\x4b\xdf\x13\xa0\x68\xf8\x37\xe7\xcf\xcc\x86\x7c\x3a\x60\x72\x4b\x41\xb2\x6b\x78\xa9\x3e\x0d\xa7\x43\x80\x16\x04\x62\xbb\x6f\x21\xad\xfb\xbe\x7f\x44\xb4\x81\x47\x4c\xe7\xce\x71\x86\x0e\x6f\x15\xfc\x95\xc7\xd9\xdc\xa3\x85\x0f\x31\x49\x11\xda\x47\x7d\x7d\xb7\xa7\x02\xc9\x39\x0b\x35\x98\x08\xe3\x6c\x48\x41\x65\x65\xbc\xaf\x77\x30\xa1\x24\x0b\x00\x59\x5f\x42\x93\xe4\xd5\xde\x17\x00\xba\x5b\xd4\xb9\x03\x95\x4d\xbc\xaa\x3b\x75\xd4\x63\xef\xc0\x55\xd9\x84\x9d\xef\x8e\xab\x4d\xbd\x61\xa3\xd9\xb3\xe8\x78\x48\x7b\xe3\x41\x38\x34\xc0\x1e\x17\x46\x06\xea\x66\xc4\x09\xc9\x65\xe1\x22\xf1\x53\x71\xc1\xa2\xf7\x2a\xe2\x5b\xb9\xe1\x74\x7a\x21\x02\x31\xda\x95\x0d\x8e\xec\xb1\x48\x94\xaa\x65\x61\xcb\xf2\x14\xed\x2f\x08\xaf\xd5\x20\x9f\x06\xff\x06\x33\x8a\xdc\x8e\x13\x56\x4c\xc8\x9b\x21\xe9\x10\x46\xef\x8a\x25\xb9\x17\xd7\xd1\x1d\xd0\x75\xcc\x72\x19\xb5\x97\xf4\xd1\x3e\xe3\x0e\x95\x73\xf0\x08\x31\x10\x69\x09\x98\x56\xe4\xcc\x0e\x02\x8f\xe9\xb7\x8f\x64\xbe\xe7\x2c\xc4\xaf\x1b\x16\xf4\x1b\xbc\x2c\x57\xd5\x16\x9b\x3d\x0e\x0c\xe2\x51\xa6\xaa\xe1\x00\xc1\x2c\x52\x21\xac\x80\xf8\x73\xb2\xea\xc4\xbb\x20\x65\x63\x40\x5f\x70\xff\x8e\x4b\x9e\xa4\xd6\x07\x1a\xfa\x28\x0d\x89\xc7\xe3\xc5\xc9\xaf\x9e\x80\xa3\x41\x96\x75\xbd\xea\x59\xb3\x8c\x80\x94\x35\x32\x95\x59\xbc\x26\xf7\x81\x7d\x84\x1a\xe0\xab\x30\x68\x8b\xb7\x02\xc9\x8d\xe8\x26\xa0\x87\x38\x26\x51\xb3\x65\xec\xde\x52\x23\x97\x44\x14\x39\xdc\x9a\x22\xb5\x58\x1b\x9f\x6e\x8c\xd2\x6b\xac\xe0\x5f\x5a\x64\xd1\xc0\x79\x20\x07\x0c\x25\xfb\x58\xaa\x09\x14\x2e\xbe\xa1\xf7\xbe\xdf\x89\xcc\x62\xfb\xd8\xc3\x12\xaa\xdf\xea\xd2\x34\x4c\x9c\xb6\xaf\xac\x9d\x15\x85\xc4\xef\x22\x56\x46\x05\xed\x0d\xe9\x39\xd9\xb8\x03\xb2\x29\xf1\xd0\x61\x3a\xaf\xbd\xb3\x43\x93\xa5\x0f\x2d\x9b\x85\xb3\xeb\x5c\xce\x34\xaf\x19\x73\x50\x3c\xa4\x0f\xa6\x7f\x34\x64\x52\xd0\x88\x1e\x5f\x96\x38\x45\xd2\x8a\x01\xf7\x1d\x9f\xe5\xce\x04\x4b\x85\xf3\xad\x1f\x6c\xba\x02\xfe\x6f\xd2\x78\x58\xe2\x89\x1e\xdd\x49\x92\xdd\xc8\xbd\xc9\x39\xa2\x40\xcc\xbf\x10\x3c\x3a\x14\xed\x0c\x48\x70\x8c\x71\xa1\x4b\x1b\x1e\x37\xab\xcc\x4e\x17\x2b\x2e\xd7\x2a\x43\x6a\x11\xfc\x0f\xe2\xcd\x8f\x58\xee\xc5\xb9\x02\x7c\xfa\xee\x97\x27\x1d\xeb\xb6\x83\x32\x7f\x4c\xb2\xa8\x81\x99\xae\xea\x6c\x0d\x2b\x7d\xf8\x86\x78\x61\xa6\x38\xe9\x35\x7a\x7f\x4d\xde\xad\x07\xdc\xb5\x1e\x86\x9f\x82\x60\x67\x09\x4c\x72\x78\xdb\xb6\x53\x9e\xc5\x83\xe1\x50\x6f\xbb\x45\x70\x0d\x61\x69\x52\x26\xa0\x5c\x51\x3a\x59\x8c\x12\xaf\xf0\xf0\x20\xcf\x51\xfe\x3c\x82\xfe\xb9\x94\xc6\x0a\x03\x1e\x65\xdb\x4f\xb0\x57\xd9\x4e\xef\xcb\xa6\x10\x69\xa3\x20\xe0\x60\xb3\x70\xdb\x10\xc8\x00\xb1\x74\x4c\xa6\xd9\xb8\x8b\xf0\x20\xd1\x8f\xf7\x32\x15\xbc\xa7\x49\x2b\x5a\x02\xd4\x95\x8f\x24\x20\x45\x47\x5b\xd0\x82\x13\xc1\xc2\x2a\x9a\xd0\x57\xc3\x0e\x4d\x3f\x48\xe0\xc0\x1e\xf0\xea\xab\xe7\xc7\x1a\x29\x67\xe0\x76\x80\x32\x88\x24\x3a\x03\x08\x96\x95\x5b\x91\x8f\x97\x60\x87\x8a\xa4\x65\xda\xb1\x34\x02\x18\xc8\xde\x76\xbb\x5e\x2c\x60\xe5\x1b\x0a\x8a\x70\x90\x17\x64\xb6\x04\x53\x56\x76\xbb\x35\x59\x13\x0d\x10\x0a\x2b\xe3\x34\x06\x89\x55\x71\xc7\xe3\x0b\xb1\x23\x4d\x16\xca\x32\xe7\x2d\x5b\xf7\xce\x3e\x98\x42\x50\xfc\x38\x93\xc0\x97\x71\x40\x98\xde\xae\x81\xb9\xf9\x0b\x30\x38\x52\xb4\xbf\x7b\x4c\xe4\x77\x63\xee\x01\xbb\x56\x83\x8d\x29\xd2\xa5\x86\xf3\x00\x23\xba\x2c\x4b\xd6\xdc\x2f\xc8\xad\x1f\xc5\x85\xbb\xfb\x16\xf4\x80\xdd\x01\x03\xa4\xa3\xb8\x60\x11\x3a\x4b\x09\x05\x7a\x82\x2e\xa0\x60\x10\x36\x2d\xbe\x7f\xa7\x61\xf2\xdd\xaa\x0b\x55\x3f\x5a\xfd\xbd\x76\xc6\x2f\xdc\xd5\x14\xdd\xc3\xe0\x8b\x6b\x55\x30\x1e\xfe\x77\x95\x37\xf4\x5f\x5e\x5c\x9c\xbe\xff\x72\x3a\x1b\x9c\x9e\xf7\xdf\xfe\x3e\x45\x00\x8f\xe3\xff\x5f\xbf\x79\xf5\xea\x75\x03\xff\x7f\xfe\xfa\xf5\xbf\xf8\x1f\xff\x90\x1f\xa8\xe8\x4e\x1f\x30\xb6\xe8\x4e\xce\x41\xe5\x4f\xe1\xd3\xd9\xbd\x2e\xcc\x00\xa8\x82\xcf\xfb\x6f\xd5\xc5\x74\x38\x98\x8f\x7e\x1e\x12\xaa\x7f\xa6\x2e\x26\xd3\x9b\xc9\x14\x43\x14\xa0\x52\x31\x57\x03\x50\x18\xf8\x30\x9a\x5e\x43\x58\xe2\x72\x32\xc4\xdf\xb3\x4c\xc4\xd5\xf0\xe3\xe0\x8a\x74\x0d\x9c\x8b\xde\x8e\x11\x04\x41\x8c\xf0\x6d\x78\xf3\x10\xea\x9c\xe6\xf3\xc9\x74\x3c\xfc\x72\x7a\x71\x05\x81\x9b\xe9\xf0\x0a\xde\x3f\xfb\x34\xba\xe9\xb7\x5b\x48\xaf\x9d\xe1\x73\x47\x63\x90\x6f\xc0\x77\x71\x10\xf3\xd4\x07\x31\x3b\xbe\x7f\x3d\xf8\xeb\x50\xca\x6f\x8c\xa0\xda\xe0\xe3\x60\x7a\xc9\x32\x19\xf2\x99\x1c\x21\x4d\xb0\xef\x14\xae\x9a\x35\x22\x47\x1c\xf2\x99\x0e\x67\xb7\x57\x73\xae\xc6\x52\xa3\xf9\x4c\xdd\xce\x86\xbe\xd2\x1c\x0a\x2f\x3e\x4f\xa6\x7f\x55\xc7\x83\x99\x82\xaa\x85\xe1\xa5\x7a\x3f\xbc\x9a\x7c\x3e\x79\x5e\xed\x45\x6b\x30\x9a\x55\x18\x17\x17\x37\x57\x3d\x35\x99\xaa\x1e\xfd\xae\x77\x82\x52\x18\xf0\x5a\x7c\xc7\x7c\x78\x41\x62\x22\xa1\x6e\x2d\x12\x02\x69\x6a\x8c\x50\x35\x07\x07\x68\xe0\x51\xf8\xc9\xf9\x27\x37\x81\x33\xaa\x85\x1b\xfd\x5f\xa2\xed\x62\xd2\xa3\x0a\x39\xb7\x98\xb0\x1d\x9f\x46\xef\x47\xf3\xe1\x65\xff\xe8\xfd\x17\x8e\x1a\xb1\x34\x04\x05\x8d\xb8\xa8\xcf\xbd\xd0\x0f\xce\xa7\xe1\x94\xc5\x36\x2e\x30\x4a\x38\xbe\xc4\x50\xa0\xfb\xfc\xfb\xa1\x7a\x3f\xb9\x1d\x43\xf7\xda\x03\x48\x2d\xc2\x21\xc1\x7f\x4c\xa6\x18\x9b\x9a\xc1\x23\xdd\xef\xe9\xe5\x17\x93\x31\x49\x3b\xa0\x66\x0b\x84\xda\x66\xa3\xcb\x21\x6d\x8f\xc9\x07\xf7\x8d\x69\xa3\x3c\x05\xc2\x55\x5d\x9a\x0a\xa8\xec\xd1\x57\x97\x5e\xe6\xbb\x24\xc4\x8a\xee\xab\xde\x85\xcf\xbb\xaa\xcf\xb6\xf8\xea\x71\xe7\xa4\x42\xce\xe8\x1b\x4d\xde\x21\xf0\x56\x83\xec\x66\xa2\x74\x5e\xdd\xdb\xcc\xde\x51\x6c\x6a\xb9\x5f\x66\x76\x6b\x56\xa9\x06\x24\x43\x50\xc2\x76\xcf\x65\xf8\x1a\x0a\x27\x42\x1a\x51\xd5\xb9\xf7\x39\x10\xa6\x2d\x29\x37\x05\xd7\x13\x63\x5b\x85\x4d\x07\x8a\x9f\x18\xd4\x80\xbc\x3c\x5b\xd5\x9c\xae\xde\x9a\x1c\x58\x8d\x11\x26\x8e\x86\xcf\xa6\x34\xd9\x03\x24\x53\x80\xc2\xaf\x34\x9b\x45\x86\x59\x4e\x0b\x89\x15\x3f\x0e\x20\x83\xd8\x57\x03\xe4\x9b\x66\x2d\x50\x1f\x42\xd1\xaa\x31\x66\x11\x29\x11\xf8\x5f\x2b\x00\x14\x69\x75\x19\x60\xe2\xf0\xc1\x63\x5d\xa2\xda\xba\x33\x95\x4c\x66\x77\x27\x81\x84\x1a\x21\x59\x6d\x81\x50\x9a\xab\x45\x5f\xf5\x1a\x8f\x8b\xe7\x8a\xb0\xa3\xf5\x96\x6a\x90\xe1\x85\xce\xa0\x8c\x7e\x11\x32\xe6\xdb\xc2\x9c\x9a\x5f\xd0\x97\x60\x10\x7b\x98\x6d\xc0\x72\x67\x64\x5a\x6e\xea\x12\xe6\x1d\x12\x52\x0c\x4c\x5b\x15\x7a\xa3\xab\xf4\xbf\xe8\x33\x6b\x2c\x8e\xd6\x99\xff\xcd\xc6\x82\xc9\xb4\x4d\x97\xc0\x47\xed\x95\xcb\x4a\xe0\xeb\x2a\x0c\xd1\x2d\xb9\xf9\xa8\x3c\xda\x9f\x3c\x86\x45\x91\xa2\x6c\x2c\x4a\xbb\x9a\xbc\x0c\x9c\x60\x21\xe7\x85\x9c\x5b\xad\xa5\x46\xb4\xe6\x85\x59\xea\xb2\x4a\x08\x96\x0e\xe1\x4a\xfc\xfe\x4a\x6f\xa1\xd0\x9c\x34\xbd\x11\x38\xf6\xdb\x4f\x76\x63\x66\xdb\xca\xaf\x1f\xe8\x03\xe0\xba\xb3\x72\xe7\xca\xd6\x0b\x34\xf8\x49\x0f\x03\x77\x8f\x6b\x09\x4f\x03\x88\xc7\x97\x04\x3a\x2f\xda\xe3\x09\x5c\x18\xfb\x7c\x79\x5f\xd8\x9c\x66\x83\x0d\x6a\xde\x8a\xce\xa9\x5e\x9d\x62\xf8\x82\x71\x09\x5a\x6d\x2c\xc8\x5c\xa5\x90\x81\x39\xee\xc1\x33\xd2\xfc\xae\x77\xe2\x7d\xd0\x7f\xa8\xc3\xb4\x92\x97\x7d\x45\xb5\x3e\xa1\x5e\x08\xdd\x81\x55\xfa\x90\xae\x08\x84\x20\x6b\x86\x28\x47\xec\x3b\xd0\xa9\xaa\xd1\x7e\xd1\xaa\xaf\x7a\x13\x16\x4c\x1c\x00\x09\xec\x93\xef\xdb\xdd\x5b\x42\xef\xac\xfc\xfb\xf8\x79\xa6\xaf\x7a\x72\xdf\x45\x58\x5b\xf0\xee\x61\x0d\x79\xb5\x02\x62\x9c\x45\x74\xe1\x33\xdb\xbc\xee\xab\xde\x17\x5b\x87\xf2\x9f\xee\x66\x0a\x44\xf7\x41\xb5\x77\xd2\x76\xc7\xe8\xdf\xb6\x30\x0f\x29\xea\x06\x3f\xa4\x36\xf3\xfd\xeb\x6c\x4c\x27\x31\xe3\x67\xb8\x0f\x08\x3e\x75\x2f\xbc\x7d\x8f\x7c\x6d\xd2\x89\x85\x9a\x06\x8c\x7e\xfb\x44\xe3\xe1\x26\xaf\x4c\xb9\x4d\xdd\x39\xee\x1b\x4c\xcd\x65\xcd\x3b\xa5\xd4\x9d\x5f\x3f\x46\x0d\x11\x7b\x51\xca\x29\x09\x81\xab\xfb\xf4\xee\xfe\x34\x33\x0f\x26\x0b\x60\xe0\xca\x57\x9f\xe9\x52\x95\x10\x57\x40\xbf\xd5\xb7\x94\xee\x10\x50\x47\xf7\xd1\x30\x84\xe8\x36\xc6\xe9\x47\x69\xe1\x26\x2a\x98\xb8\xd0\xd4\xf3\xbe\xfa\xa0\xd3\x42\xdd\x96\x46\x4d\xa1\xc7\xc0\x7e\x7c\x8f\x7c\x77\x8f\xe2\xdb\x0a\x83\x85\x4f\x90\x5f\x45\x29\x7e\xe2\x9f\x40\x57\x92\x00\xfc\x12\x1b\xb5\x76\xaf\x82\x82\x9d\x75\x5a\x94\x15\x55\xb7\x31\xd6\x2c\xf0\x53\x78\x11\x71\x5f\x2e\x24\xaa\x1d\x62\xf4\xb8\xdd\xe5\x86\x03\x12\x02\x53\xae\x77\xe1\xb9\x8d\xf4\x2d\xf4\xfb\x75\xdf\x4f\xe7\xc7\x02\x48\x10\x3b\x0b\x9e\x0e\xc0\xb9\xbd\x72\x8d\x9f\x8f\xb8\xea\x09\x84\xcc\x0f\x15\x38\x25\xcd\x42\x28\xcf\x4f\xae\x8e\x3d\xc1\x6f\x5d\x44\x47\xa2\xe8\x82\xef\xe4\x89\x2c\x44\xf3\xcb\x56\xd4\x4e\xa4\xf2\x4a\x2d\x39\x6a\x04\x57\xfa\x8f\xc1\xb8\x92\x55\x6c\x62\x0f\x35\x74\x1a\xc5\xb9\x5c\x51\x94\x93\x54\x6b\x1a\x57\x4f\xe9\xf9\x3e\xda\x4f\x05\x2a\xda\xf0\x50\xbf\x6e\x9b\x8f\x78\x17\xcc\x89\x8a\x4f\x3a\x92\x20\xe4\x47\x36\x8e\x75\xff\x95\x65\xbf\x11\x80\x0b\x34\x1e\xdb\x7b\x9b\x5b\xbc\x81\xb0\x28\x8f\x6a\xf1\x7c\x29\x5e\xc2\x20\x17\xf1\x1b\xd0\xa0\x69\xfc\xd6\x6d\x44\xdc\xc9\x20\x21\xbf\x4a\xef\x52\x80\x87\xd7\xab\xd4\xe2\x45\xee\xd9\x04\xc3\xa8\xf9\x5c\x55\x7b\x08\x0e\x75\x7f\xf5\xdf\xaa\x2f\xcd\x11\x17\x17\xce\xf3\x6c\x84\xdd\x63\x36\x02\x2f\x48\xa5\x54\xda\x57\x37\x02\x6c\x34\x85\xad\xe3\xfa\x8d\xe8\xa7\xf7\x99\xce\xbf\x9a\x8a\xf7\x60\xd9\x0f\x9b\x90\xc2\x5c\x1d\x07\x07\xa6\x2e\x60\x98\x43\x9c\x32\x5c\x5a\x28\xcc\xfe\x90\x6a\x74\x21\xfc\xbb\x69\x23\x95\x76\x99\x3a\x77\xe0\xd8\xf4\xef\xfa\x6a\x30\xbb\x18\xdc\x24\xea\xfd\xf5\x28\x51\xb3\xe1\x6c\x70\x71\xc2\xfb\x3b\x15\x8c\xa4\x24\xad\x2d\x9f\x66\x0b\xfe\x2d\x0f\xb3\xfc\x2b\x3e\x7c\x67\x16\xce\x20\x3c\x91\xb6\x50\x5f\x8c\x4d\xda\x57\xd7\x66\x79\xaf\x73\x18\xc0\x69\x28\x92\x9a\x55\xba\xaa\x2b\x5b\xec\xc3\x80\xfd\xd6\x23\x03\xd3\xd6\x1c\x13\xc0\x02\xa1\xa0\x8b\xb3\xb7\xee\x9c\x43\x83\x5d\xf9\xa4\x8b\x62\xaf\x3e\xd8\x5f\xd4\xe0\xce\x39\x5e\xad\x61\x82\xdc\x74\x58\xc8\x70\x6a\xd2\x66\xf7\x57\x33\x7a\x24\x3d\x28\x42\xf4\xca\xbb\x27\x8d\x0c\x54\x8b\x20\xc8\x2d\xac\x3a\x2b\xdd\x68\xf0\x19\xc9\xf6\xd2\x62\xaf\xce\xbe\x57\xb7\xb3\x0b\x9f\x4f\x3d\x3b\x7b\xeb\x43\xb9\x33\xa1\x65\x31\x58\x56\xea\x98\x66\xd3\xfc\x67\x9d\x3e\xe8\x0c\xf3\xd4\x74\xad\xfc\xbd\x2e\xd2\x72\x85\x1e\x45\x79\x22\x6c\xa3\xcf\x38\x87\x6e\xb7\x3f\x35\x41\xdf\x6a\x5d\xb7\xcc\xe8\xdf\x6d\xed\x9f\x76\xae\xfd\x99\x7b\xff\x90\x0a\x30\x1e\x5b\xf7\xdf\xb6\xc2\xff\xd1\x09\x7c\xf3\x5b\x4d\x60\xe0\x90\xa2\xee\x93\x9b\xc6\xd7\xab\x67\x87\xda\x98\x95\x1b\xb1\x1c\xa3\x02\xba\x2a\xfd\xc8\xe6\x76\x07\x35\x73\xe0\xf6\xb8\x29\xc4\x40\xfd\x0a\xb5\xb9\xfb\xed\x57\x48\x44\x6c\xc8\x08\x7a\x3c\x8a\xa4\x9b\x46\x88\xa4\x5b\x15\x66\x79\x0f\x47\x40\xb6\x8f\x71\x2c\x07\xec\x00\xec\x70\xab\xd1\x51\xe6\xa5\x3b\xd5\x12\x19\x9d\x85\x61\x43\x27\x24\x5a\x94\x52\x6f\xfa\x6a\x1a\xa8\xc7\x08\x57\x1c\xd1\xec\x46\xd9\x2a\xf5\x9a\x06\x20\x95\x49\x2d\xa8\xc1\x11\xcb\x00\x2b\x3f\x11\xba\x47\x19\x9b\x60\x34\x0b\xa6\xb3\x52\xd8\x32\x5f\x48\xa3\x43\x1e\x0d\xcf\x29\xbd\xf7\x27\x33\x7c\x0c\x56\x6e\xf8\xb3\x08\x54\xe4\xd9\xfe\x29\x1f\x09\xaf\x59\xd6\x72\x09\x2c\x1a\x5c\x00\x94\xa8\x40\x59\x0d\x4f\x9f\x1a\x2a\x50\x1a\x31\x35\x26\xc4\x0c\x92\x0e\x67\x07\x2b\x1b\xf0\x41\x91\x0d\x10\x79\xce\xee\xdd\xbf\xe9\x00\x84\x71\x75\x4b\x04\x8b\xec\x91\x66\x92\xf5\xc1\x69\x24\x84\xc1\xc3\x15\xd7\xf8\x51\xef\x18\x1c\xf6\xe6\x68\x54\x0a\x5f\x2f\xf4\x22\xc2\x7c\x8a\xe5\xdc\xaa\x02\x8e\xdb\xd7\xe0\x4d\x80\x0b\x34\xcc\xc7\x57\x63\xb6\xce\x86\xd5\xce\x4b\xf1\x1a\x9e\x25\x57\x32\x11\x7f\x40\xd4\x32\x32\x67\xc1\x2c\xf7\xc2\x6c\x42\x61\x14\x0e\x72\xd9\x82\xdf\x69\xf5\x79\x9c\x0d\x6c\x7e\x9b\xd9\x3b\xb0\x01\x36\x46\x97\x75\xc1\x5d\xa0\x0a\x02\xa8\x7c\x42\x36\x50\x51\x6c\xc4\x81\x15\x5f\x11\x24\x90\x18\x55\xb3\x92\xb5\x39\x41\x02\x97\x10\x8e\x30\x21\x94\xff\x98\x91\xdf\x0a\x50\x21\x34\x84\xe8\x44\x09\xfb\x43\x78\xf1\x2e\x8f\x40\x69\x60\x20\x8d\xad\x02\xc2\x6b\x21\x4b\x41\xf3\xf4\x38\x1c\xc3\x50\xa3\xb5\xb4\x34\x3a\x9a\x06\xc1\x48\xa2\x07\x24\xae\x1f\x71\x08\x06\x99\xa6\xb8\x06\x47\xe0\x79\x12\x2e\xe0\xf3\x0d\x6e\xf5\x27\xdf\xbb\x06\xac\xd2\x0a\x51\x41\x54\x21\xbe\x80\x12\x18\x37\x63\x6f\x8e\x97\x27\x09\xff\xcd\x94\x15\xe0\x15\x1a\x0d\x6f\x58\xe4\xbf\x4b\xc3\x9b\xe1\xb3\x5f\xd3\xf0\xe0\xcd\xfd\x3e\xe7\x73\x3b\xc8\xf7\xcc\x83\x3a\x16\x98\xed\x0e\x30\x41\x9c\x52\x6f\x3c\xf1\x85\x8f\xe6\x20\x98\x46\x3e\x0f\x0a\x98\x5b\xf9\xc5\x94\xff\x27\x9c\x4a\xb4\x4f\x51\x6e\xe0\xb9\xcf\x67\xef\xe3\x70\xba\xf2\x2f\x7a\xab\xf3\x93\xfe\x6f\x7f\xf9\x88\x08\x0d\x95\xea\x6f\xcd\x32\xc2\x61\xf9\x40\x58\x69\xf2\xca\x78\xe0\xfc\xa3\x17\x16\x94\xc5\x36\x67\xee\x9f\x7d\x79\x35\xbd\xdc\x3f\xf4\x22\x6b\xd8\x0e\xff\x33\xef\xaa\xe6\x8c\xfe\x0f\xb8\xb6\x5a\x87\xdc\xef\x7f\x83\x35\x5f\xf9\x2b\x2f\xb3\x10\xf5\x62\x95\xf9\xdf\xc9\xf2\x45\x6f\xbd\xb5\x3b\x40\xd1\xa2\x19\xff\x3b\xb8\x80\xdb\x25\xec\xec\x35\xfa\xb4\x1f\xf1\x6d\x24\x12\xf2\xcb\xf0\x7d\x24\x07\x00\xd5\x5e\x9d\x53\x90\xb5\x30\xaa\xae\xd2\x2c\xfd\xaf\x34\xbf\x43\x2e\xba\x8a\x45\x33\x68\xf5\x34\x92\x2b\xe0\x11\x6e\x4b\x53\xaf\x6c\xbe\x47\x39\xdd\x10\x5c\x3d\x71\xff\x2c\xeb\x2d\x11\x63\x10\x25\x20\x30\xcd\xa5\xdd\x4f\xa3\x8f\xf8\x4b\xd6\xc7\x42\x94\xce\x05\x05\x03\x8c\x33\x95\x2d\xe0\x39\xae\x15\x40\x34\xa1\x08\x88\x12\x79\x9e\x6e\x19\xa8\xe5\x21\x87\x92\xa8\xbf\xdb\xba\xc8\x75\x86\x39\x58\x5d\x09\xd2\xa7\xdc\xbf\xf5\x45\xd9\x1a\xda\x24\x2c\x18\x92\x2f\x71\x4d\x58\x70\x52\x52\x52\x31\xb8\xc1\x4c\xa2\x61\xc3\x3a\x88\x46\xbb\xdf\x35\x53\x0c\xbc\x72\xc3\x88\xbd\x6b\x58\x16\xdd\x68\xe7\xe4\xa9\x1b\x48\x30\xc6\xb8\xb3\xc1\x8f\x2d\xdf\x3a\x2c\x4d\xd9\xac\x13\x0b\xd1\x84\x3a\xcf\x40\x13\xd0\xf5\xe3\x76\x3a\x92\x3b\xd4\x9f\x9a\x1d\x34\xd1\x1e\x12\xd9\x52\xfb\x11\xcb\xf4\x1d\xe5\x5e\x08\x7a\x47\xc8\xbb\xb6\x31\xa6\xd9\x4e\x62\xd2\x03\x2e\x7e\xeb\x38\xd9\xba\x4e\x04\x58\x26\x89\xea\x7d\x28\x4c\xbe\xbc\x97\xb9\xee\xe8\xdb\x8b\x7d\x73\x4d\x26\x3d\xd7\x91\xde\x6c\x59\x18\x93\x43\x50\xd8\x13\x36\x59\xfe\xe4\x81\xaf\xf6\x4e\xfa\x6a\x06\x05\xbe\xd8\x74\x8a\x7e\xa4\x9b\x2d\x1a\x25\x41\x1f\xa0\xc5\xe5\xf1\xce\x53\xe5\x34\x85\x33\x9f\x1a\xaa\x8e\x43\x04\xf8\xce\xb4\x2f\xd8\x29\x45\x93\x20\xc9\x4b\x8a\x36\x18\x21\x8b\x98\xc5\xb6\xba\x80\x46\x89\xe4\x26\x9b\xab\xf0\x9d\x92\x67\xcf\x5f\x26\xba\x52\x99\xd1\x25\xd8\xb3\xdb\xc2\x6e\xd2\x1c\xc0\xa4\xb4\x7a\x9e\x7e\x30\x9c\xc1\x6f\xfb\x6a\x1a\xcb\x44\x24\xea\x73\x4c\xc3\x73\xe9\xef\x63\xf7\x85\xdb\xf1\x15\xd4\x81\x72\x85\x19\x42\x74\x80\xa8\x9b\xa0\x39\x50\x9e\x39\x04\xb2\xe9\xcf\xd3\xd1\x1c\x0a\x44\x3d\x26\x67\xf2\xe1\xc3\x70\x3a\x0b\xf0\x1f\x40\x75\x01\xa4\xc6\x03\xb8\xa6\xc3\x9b\xe9\x70\x36\x1c\x63\x45\x1d\x54\x8e\xc6\xf4\xdf\x5c\x9c\xaa\x2e\x26\xe3\x8b\xe1\x74\xcc\x00\xaf\xeb\xc1\x7c\x38\x1d\x0d\xae\x66\x9e\x64\x3c\x09\x14\xe3\xb3\xf9\x60\x7e\x3b\x87\x92\xbb\x88\x67\xfb\x89\x2a\xd6\xf8\xcd\x54\xb3\xca\x15\xaa\xa3\xe7\xf2\x8f\x27\x4d\xf2\xf1\x84\xcb\xea\x06\xef\x67\x43\x82\x18\x5d\x0d\xe6\xc3\xf1\x5c\xb2\x76\x7f\x18\x5e\xcc\x67\x89\x1a\x5c\x5c\xdc\x4e\x07\x17\x5f\xfc\x97\x70\x7c\xf0\x5b\xe2\x01\xc3\xe9\x74\x32\x9d\x85\x2a\xc2\xc9\x14\x20\x79\x97\xa3\xd9\xc5\xe4\xe7\xe1\x74\xf0\xfe\x6a\xd8\x57\xb3\xc9\xf5\x50\xfd\xe5\x76\x3a\x9a\x5d\x8e\x2e\x70\x80\x2f\x27\x08\x08\xbc\xba\x9a\x7c\xa6\x5a\xbf\x8b\xab\xdb\x19\x81\xa1\xb8\xdc\x37\x8c\x44\xa2\x66\x13\x04\x44\x85\x0f\x5e\x0f\xbe\xe0\x43\x6e\x6e\xae\xbe\xb8\xc5\xf0\x65\x72\x0b\x0b\xec\xbb\xbe\xba\x0a\xf4\xfd\xd6\x9d\xfd\x54\x61\xd7\x57\x54\x0e\x4a\x70\xb0\xe1\xdf\xe6\x88\x13\x04\xb6\x2c\x40\x7a\xc5\x88\xb5\x24\x62\x6c\xff\x3c\xba\xba\x0a\xeb\x2a\x10\xb3\xe3\xbb\xb9\xcc\x12\x51\x8c\x54\x6c\xc9\xd5\xa0\xbe\xde\x53\x16\x81\x46\xd5\x9e\x89\xba\xb9\x1d\x8f\x00\x93\x37\x99\x86\xb2\x50\x8f\x08\xe4\xaa\x4a\x5f\x4a\x19\xc3\xe2\x7c\x69\x65\x40\xd6\x85\xba\x48\xdf\xe6\x4f\x83\x99\x7a\x3f\x1c\x8e\xbf\xa5\x52\xd2\x0d\xe9\xf7\x7d\x35\xa7\x12\x9f\xd4\xe6\x21\x88\x38\x6f\x19\xd4\x8f\x98\xec\x78\x1e\x89\x3a\xac\xba\xb2\xee\xd2\xc0\xd0\x2c\x38\xe4\xee\x7c\x5a\x14\xe0\xed\x2c\xf6\x60\xb5\x74\x96\x40\x86\xf8\x84\x0f\xcd\x97\x1e\x4c\x81\xd2\xaa\x16\x6b\xf9\x3d\xa6\xe1\x39\xe6\x18\x9a\x9c\xee\xad\x6d\x24\x83\x38\xa9\x3d\x60\x08\xd9\x02\x80\x7c\x37\x94\x07\x70\xf7\x84\x78\x11\x9c\x8e\xe9\x81\xa6\x62\xb5\xa7\x3b\x66\xd7\x75\x96\xb5\xea\xa9\xb1\x6c\x3f\xf3\x09\x3c\x5f\xc5\x70\x96\xa8\xf3\x44\xbd\x4d\xd4\x77\x89\xfa\x1e\xbd\xa1\x3f\x61\xd3\xa8\x32\xc9\x3b\x6c\x11\x7f\x66\x27\x10\xad\x91\xcf\x47\xc3\xbf\x2b\xab\x8f\xf6\x48\x33\x5c\x0d\x57\x0b\x56\x3f\xfd\x9a\xe4\xbc\x4c\xbe\x9f\x00\xa4\xc2\xf5\x1c\xe8\x28\x7d\xc9\x3c\x16\x69\x78\xf3\xa6\xbb\x46\x89\x94\xaf\x9b\xb8\x22\xa4\x0b\x93\x4c\x83\xbe\xda\xae\xb2\xaa\xac\xec\xb6\x5d\x75\x8f\x46\x36\xa2\x33\xaa\x74\x63\x3a\xae\xec\x40\x50\x06\xf3\x0b\xc8\x13\xc4\x5e\xd1\xf2\xc0\x3a\xa2\xca\xc2\x44\xae\x0a\xbd\x6b\xc4\x28\x22\xe8\x5b\x14\xf1\xb8\xd7\xa5\x5a\x18\x83\xf0\xb8\x06\x2d\xe2\xc2\x24\xad\xda\x8e\x03\xfb\x83\xc4\xf3\x1b\x81\x1a\x59\xc8\xc6\xab\x0e\x4a\x76\xb1\x7c\x17\x2b\x95\xc9\x2a\x14\xab\x39\xa0\x22\x60\x32\x60\xf5\xfc\xa9\xaf\xae\xd3\x72\x69\xb2\x4c\xe7\xc6\xd6\x02\x86\x0a\x05\x15\x50\xf1\x15\x47\x29\xbe\xc5\x89\x6a\x5b\x3a\x11\x00\x89\x41\x64\x36\x8e\x21\x28\x2d\xb1\x1e\x22\x1f\x11\xc2\x47\x9d\x78\x15\x5d\x76\xae\xed\xca\x1e\x38\x10\xc4\xf6\xf9\x95\x9d\xed\x30\x84\xbf\xbd\x73\xb1\x99\xfa\xbb\xf5\x12\xbd\xe6\xee\x2a\xf9\x2b\x89\x79\xfa\xef\x51\x23\x1f\x25\x98\x9e\x57\x21\xcf\xe1\x21\x41\x68\xf9\x07\x17\xcb\x7b\x24\xcb\xd8\x42\x77\x48\x1f\xf4\xc0\x68\xfb\xd6\xac\x5c\x73\x57\x98\xd4\x5e\x11\xb5\x21\x5f\xa2\x40\xc1\xc8\x33\x2c\x3d\x3d\xf8\x74\xe1\xc5\xb8\x7d\x01\x33\x10\xf2\x79\x76\x26\xa8\x73\x4d\xef\x44\x21\x98\xaf\xd1\x5a\x18\xd2\x73\x22\x87\xb2\xfb\xa9\x02\xf8\x12\x99\x0a\x12\x91\x0b\x4e\x30\xa0\xc8\xc3\xd8\xab\x85\xa9\x76\xc6\xe4\xd1\x0c\x1d\x02\x31\xc6\x14\xc7\xc4\xbc\x46\x74\xf7\x82\xda\x38\xcd\xef\xca\x24\xbc\xa2\x54\x92\xc7\x95\x29\x96\x0f\xbd\x02\xce\x73\x1f\xc9\xc5\xf7\x04\x67\xdb\xaf\xe1\x85\x51\x0b\x80\x1d\x10\xb3\x24\xd7\x4c\x62\x3d\x1c\xb3\x58\xc2\x19\x0f\x05\x9b\x5e\x6d\x14\x59\x0b\x41\x61\x7e\x29\x54\x73\xbf\xd8\xba\x31\x72\x42\x4e\xd6\x83\xed\x79\x81\xc3\x5a\xac\xe1\x02\x66\x45\xd8\x30\xa2\xb4\x4f\x22\x54\xa4\x7b\xfc\x51\x3b\x0a\x8f\xfe\xbf\x6e\x14\xe4\x45\x7b\xca\x2b\xfe\x79\xe1\xbc\xa0\x66\xdf\xc5\x91\x16\xd2\x8b\xad\xd7\x49\xfc\x35\xe9\x6a\xd3\x71\x24\x14\xfe\xf6\x8a\xac\x43\xac\xff\xab\xee\x8d\x2d\xf6\x41\x83\x9e\x48\x91\xba\x15\xf5\x3b\x34\xbd\xdc\x97\xee\x4c\x6e\x0a\x9d\x75\xf3\x97\x1e\x52\xa9\xf7\x18\xcd\xb8\x8f\x3c\x46\x19\x1b\xa6\x5d\x46\xcc\xda\x16\xe6\xce\xc2\xbf\x76\x56\x1d\x9f\x9f\xf8\x0c\x40\x09\x61\x9c\xd6\xc8\xdc\x47\x95\xac\x42\x0e\x32\x66\xa3\x8c\x80\x95\x14\x1c\xf7\x27\x2b\x4a\xd6\x06\xe4\x02\xb2\xb1\x87\x62\x79\xbb\xf6\xdf\xef\x1f\x51\x01\x2d\x1b\x6f\x0c\x29\x10\xf8\x6f\xc2\xd1\x8a\x12\x79\x02\xb1\x78\x8a\x08\x06\xe0\xf8\x4d\x19\x8c\x94\x8b\x8b\x9b\xab\x44\xe5\xa4\x04\x49\xe5\x96\x6e\xf6\x6b\x32\xda\x40\x0f\x7e\xa3\x8b\xaf\xaa\xd7\x1c\x8c\x1e\xaf\x06\xcf\xb6\xe5\x3f\x0b\xbc\x42\x77\xd6\x35\xaf\x63\x71\x85\xad\xb1\x2d\x52\x5b\xf8\x9d\xc1\xe7\x5e\xc7\xb7\xfa\x6a\x80\x72\x17\x54\xcb\x5f\xb3\xdd\x84\xa7\x63\xd3\x44\x6f\x7e\xfd\x85\x7b\x5b\x7e\xba\xac\x0b\x30\x3a\x43\x43\x51\xa6\xff\xae\x4e\x57\x26\x4b\x73\xa8\x5c\xf1\xa8\x19\x5f\x2b\x0d\x64\xe1\x55\xa9\x76\x66\x51\xa6\x95\x89\xaa\x7f\x5b\xe4\xab\xce\x67\xa2\xe4\x61\x47\x91\x7d\x7b\x6b\xd3\xcb\x20\xa3\x06\x38\x69\x67\x6c\x56\xd5\xf6\xc7\x97\x2f\x97\xf4\xd9\x25\x8d\x81\x2d\xee\x5e\xfe\xef\x2a\x67\xfd\xd7\xcf\x37\xfe\xf4\x5f\x7e\xbc\xb9\x3a\x7d\xdd\x7f\x75\x6a\xf3\x6c\xff\x4f\xa8\xff\x3d\x7b\xf5\xfa\xcd\xf7\x4d\xfd\xaf\xf3\xef\xde\xfc\xab\xfe\xf7\x0f\xf9\xf9\x38\xbe\x55\xc4\x91\xd5\xa8\x0f\x3d\x62\x11\xb0\xd7\x89\x3a\xff\x41\xfd\xa5\xce\x8d\x3a\x7f\xf5\xea\x7b\xa1\x12\xfa\xff\xfe\x3f\xf0\x1b\xf5\xa1\x30\x42\xec\xf1\x83\xb3\x8e\xa8\xf4\x0b\xa4\x83\xff\xec\x8e\x1f\x55\xaa\x1f\x5f\xbe\x5c\x97\x6b\x38\x75\x7e\xfa\x36\x4a\x95\x07\x53\x2c\x74\x95\x6e\x9a\xdc\x2a\xec\xe3\xb0\xdc\x16\x66\x21\x01\x8e\x89\xb4\x12\xde\xd0\xc9\x32\xbb\x33\xab\xfe\xd1\x4d\x61\xf4\x66\x91\x19\xd0\xa7\x84\xce\xa3\x89\xd0\x54\x40\x03\x78\x29\x96\x27\xb8\x06\x65\x66\x1d\x42\x0b\x11\xfd\x76\x28\xce\xfb\x9a\xe6\x80\x3e\xc7\xc2\x3c\x54\xc0\xf4\x31\xa3\x35\xd4\x07\x94\x55\xd7\x17\x39\x19\x94\x09\x61\x68\x4c\x9c\x91\xff\x01\xfa\xd2\x3b\xbd\x57\x7b\x5b\x17\xd0\xaa\x95\xbb\x07\xac\xbb\xff\xe9\x49\x08\x41\xf5\xc0\xf2\xb2\xaf\xde\xef\x31\x8d\x8c\xf5\x74\x4f\xf6\x56\x96\xb2\xdc\xd5\x1a\x9c\x46\xf3\xf4\x0b\x9d\xd9\xe1\xb9\x62\x20\x9d\x41\x8c\x7f\xa7\xa7\xc1\x33\x2a\x40\x2c\x01\xfd\xb9\x12\xb5\x62\x63\x8d\xe7\x2c\x83\xfb\x10\xb8\xa6\xfb\xea\x33\xe5\xc4\x0e\x2f\x2b\x36\x26\x1e\xe9\x92\x1f\x70\xbb\x56\xae\x13\xfc\xc2\x77\x2a\xad\x7c\xc2\x1b\x94\xbc\x23\x35\x16\x40\xe5\x53\x90\x89\xc2\x2a\x6e\xe0\x17\x40\x0f\xce\xd9\x0e\xc4\x0c\x2c\x75\x4e\x74\xbd\x29\x38\x12\x30\x56\xcc\x77\x98\xa8\xca\x5a\xa2\x64\xdf\x01\x42\x44\x43\x95\x59\xd4\xf9\xc4\xfd\x09\x79\x3a\xd6\xa6\x28\xc8\xe2\xa2\xe1\x4e\xa8\x06\x2c\x5d\x9a\xbe\x9a\xd4\xc5\x81\x8e\xb6\x97\x4b\x18\x74\x30\xd8\xf6\xb6\xf6\x51\x4c\x39\x95\x9d\x8c\x45\xf1\xdc\x1c\xd3\x44\x17\x77\x9e\x0d\x7f\xe3\xac\x58\xf7\xc8\x5d\x5a\xde\x9f\x24\xe1\x15\x14\x85\x8d\xe8\xe5\x9d\x85\xad\x73\x75\x67\x50\xd7\x9d\xbe\xa8\x73\xf7\x4f\xf1\x55\xf7\x19\xb1\x7e\x25\x7f\x98\x9b\xe8\x6d\xea\x9c\x6d\x64\x61\x77\xb6\x59\x6e\x76\xd8\xce\x30\xd6\x18\x02\xa3\xc7\x7d\xcd\xed\xce\x3f\x77\x05\x16\x2c\xea\xcf\xe7\x77\x6e\x57\x5a\xf7\xbd\xca\x39\x7f\x30\x61\x68\x33\xc3\x4c\xe4\x06\x07\x70\x5b\x98\x07\x30\x1b\xdd\x8a\xa0\x88\xf1\xca\xe4\x90\xb1\x74\xcf\xc5\x07\x06\xde\x18\x5d\x7e\xf5\x7f\xb2\x6e\xe4\x0b\xe3\xed\xe1\x82\x8a\xc8\x04\x55\xb8\x9f\x90\x83\x3c\xec\x69\x13\xbc\xd0\xd0\x12\x0e\xeb\x07\x65\xf1\xdc\x87\x89\x33\x29\xad\x7e\x6c\x3f\x0f\xe2\xa6\xe4\xf0\x8a\x45\xc0\x65\xda\x65\x83\xa7\xf8\xb1\xd7\x63\xb5\x31\x0f\x7d\x00\xd0\xdf\x15\xba\x4a\x61\x34\x50\xb8\x62\x6d\xa8\xa7\x44\x4e\x5b\x22\xa4\xa8\x11\xeb\x12\x78\x2f\x6a\x54\xd9\x5a\x51\x2b\x81\xe0\x6a\x2c\xed\xea\xde\x80\x8e\x8a\x4d\xfc\xf2\x13\x4b\x0e\x47\xca\xaf\x46\x67\xf1\xaf\x42\x93\xca\x7b\xa4\x9f\xde\xf0\xfa\x80\xe0\x52\x09\x0d\xdc\xe3\x1a\xc2\xb0\x3f\xcd\xe0\xd1\xa5\x79\x30\x99\xdd\x62\x51\xab\xae\xe2\x33\xe8\xe6\xaa\x6b\x55\x91\x5f\xbc\xb3\xaa\xac\xcc\xb6\xfc\x51\x1d\x9f\x9d\x40\x15\x7b\x21\xb5\x62\x38\xa0\x17\x09\x44\x3b\xd7\x11\xd1\x59\xb8\xe2\x44\x78\xe0\x2e\x7d\xe0\xe5\x86\x9e\xb2\xa8\xe1\xa4\xfb\xb3\xa9\x9e\xf6\x12\x0e\x43\x5a\x20\x38\xdb\x10\xb9\xf7\x5d\x7a\x81\xe4\x69\x78\xbc\xbd\xe0\xbe\x78\x42\x65\xd7\xbf\x65\x66\x74\x01\x42\x23\xdb\x8c\xa0\x7a\x38\x05\x98\x18\x90\x71\x02\x3c\x2b\xd2\xc6\x51\x8f\xe5\x1d\x0b\x5b\xdd\xe3\x41\xdf\x78\x67\x09\xf2\x65\xfc\x36\xcf\x96\x8c\x81\x14\x0e\x83\xf8\xab\x06\x60\x41\xc5\x57\x0c\x5a\xe3\xe1\xb1\x4a\x70\xfa\xb0\x55\x29\x9c\xc5\x8b\xcc\x6c\xe2\xf0\x83\x2f\x26\x5d\x01\xbf\x2d\xc4\xb4\x89\x71\x1d\x5b\x82\x0c\xb8\x5c\xc8\x4a\xef\xeb\x1f\xcd\xec\x06\x06\x2c\x5d\x76\x1c\xb9\xee\x74\xc0\x4e\x31\x64\x0b\xea\x05\xcb\xca\xdd\x6c\xb6\x50\x45\x9d\x77\xf4\xa1\xb1\x9b\xdd\x17\x52\x2c\x7c\x00\x5e\x05\x92\xe7\x82\x88\x8f\xce\xeb\xb5\x86\x9a\xfc\x82\x8f\xb5\xd2\x52\xd8\x08\x44\xc2\xf3\x95\x06\xbd\xd1\x0c\xc4\x13\x21\x41\x5f\x01\x3b\xb1\x0f\xcd\x00\x17\xe4\xda\x4f\x6d\x7e\xc7\xb3\x20\xee\x84\x8e\x53\x18\x71\x62\xe5\xbe\xac\x0c\x24\xf2\xd4\x56\x57\x95\x29\x82\x3e\x9c\x5e\x00\x82\x63\xb9\xac\x0b\x5f\x63\xa9\x0b\xa3\xe9\x65\xab\x7a\x59\xa1\xf9\x23\xb3\x63\xac\xb2\x4e\x54\x64\xa5\x1b\xf1\x65\x5a\x9a\x6c\x4f\x28\x06\x34\xdd\xe0\x02\xaf\x73\xd4\xad\x40\x6a\x40\x71\x90\xee\x0c\x9e\xa3\x61\x26\xdc\x70\x34\xd8\xca\xdc\x62\x82\x33\xdd\xde\xa7\x8b\x94\xa3\x04\x60\x70\xf1\xa5\x06\x7c\xde\xd4\x52\x88\x81\x73\x2c\x17\x57\x8f\x2e\x9c\x5b\x2e\x54\xcf\x61\x88\xc9\x5e\x58\x59\x30\x6a\xa0\x31\x10\x09\x52\x85\xd1\x2b\xaa\x3d\x71\x16\x15\x09\xad\xfb\x18\xaf\x67\x10\xa7\x6f\x62\x7e\x46\xb2\x2d\x94\xa2\xe9\x10\x3e\x40\xc5\x2d\xea\x45\xd5\x71\x8a\xa3\xdd\x74\xf4\x21\xcd\x5d\xe3\x12\xc2\x99\x6e\x83\x0a\x4c\x75\x0f\x20\x69\x37\x46\x10\x96\xd5\x79\x85\xb5\x8e\x7e\xed\x6d\x59\xbe\x8e\x78\xbb\x48\x35\xc3\xdb\xce\xfc\x01\xba\x4b\x10\xf5\x49\xe7\x87\x27\x5f\x24\x28\x4f\xb8\xc0\x73\x8e\xc0\x9d\x72\x7c\x09\x2a\x99\x2a\x92\x14\xa1\xb4\xa0\xe5\x9c\xd8\xca\xc2\x38\x3a\xd3\x22\xd0\x23\xc2\x62\xc4\xf0\x9d\x5a\xb9\xe5\x59\xb0\xaa\x2c\x36\x08\x6d\x39\xe2\xec\x93\x76\x81\x5a\x42\x17\xe0\xce\x48\xab\x48\x2c\x09\xc9\xb9\x4d\xa5\x8b\x7d\x5f\xcd\xc3\x8d\xef\xe6\x2a\x9c\x41\xa0\x64\xc7\x47\x10\xbf\x6e\xa9\x73\x3a\x49\x40\x63\x02\x86\xc3\xdf\xf6\x5b\x4f\xd3\x96\x43\x6d\x33\x3a\x01\xb4\xb6\xbb\xb3\x35\x20\x32\x67\xb7\x7b\x28\x5f\x8b\x68\x33\x21\x06\x2b\xaa\x9d\xa8\xde\xa7\x7f\xd4\x45\x18\x73\xa4\x94\x7a\x15\xf1\xc5\x40\x5c\xbe\x27\x03\xcb\x3d\xb4\x33\x61\x0e\x79\x97\xbc\xf6\x8b\xed\xa0\x29\x8d\x0f\xf2\x5e\x5f\x0f\xad\x66\x04\x1d\xfa\x5b\xec\x14\x60\xd7\xc0\x03\x87\x39\x53\xd6\xb1\xe8\xf2\x8d\x02\x69\x49\x69\x36\xa9\x1b\x8c\x7a\x89\xac\x81\xe5\x57\xdf\x6e\x4f\x7a\x27\x9b\x1d\x29\xff\x04\xfa\x86\x56\x20\x52\x02\x08\x20\x75\xc7\x62\x4c\x24\x0e\x59\x98\xb2\xc4\xbb\xa3\xb7\xb7\x75\x2f\xb0\x13\x98\xb2\x07\x03\xdf\x0b\x36\x4a\xcf\xe3\xbe\xe2\xf4\xbe\x2d\xee\x34\x73\x75\x60\xab\xe7\x56\xf5\xf0\x9a\xed\x31\x39\x09\x51\x1c\x90\x5b\x0b\xa6\x24\xd3\x99\x28\xba\x1c\x00\x09\x4b\xb3\xb0\xf3\xd8\xde\xb5\x2e\xef\x53\x0a\xfd\xa5\x05\xd2\xef\xb2\xc5\x10\x2e\xfc\xa4\xc9\xae\xb9\xd1\x5f\x49\x73\x43\xe7\xce\xa2\x5b\xa2\xa5\x81\xa7\x78\xa0\xb3\xe3\xe2\xe3\xa5\xce\x32\xe0\x05\xe9\x35\xaf\xa7\x1e\x37\xc9\xdd\xfa\x29\x7b\x46\x60\xdb\xc1\xff\xf5\x18\x45\xd7\x6b\x7d\x0a\xc6\x62\xa0\x7a\x2c\x95\xb9\x13\xfc\x1b\x14\x18\x06\xe0\x5f\xa0\x12\x0a\xa2\xd2\x31\x31\x8e\x6d\x8b\x38\xb9\x31\x76\xdb\x57\xdf\xe9\xca\xb4\x87\x79\x05\x6b\x04\x09\x1b\x88\x2d\x1f\x16\x64\xe2\xc3\xc4\x72\xf0\x76\xe1\x84\x40\x8b\xb7\x30\xcb\x0a\x2b\x40\x4b\xe3\xd6\x25\x8a\x6e\x51\xca\x02\x2f\x31\xa1\xf1\xd8\xca\x78\x46\x8c\x0b\x9e\xac\xc6\xfc\x62\x96\x08\x3b\x48\xc1\xda\xd3\xfe\x14\x54\xde\x2e\x43\xe6\xc3\x2d\xe4\x8a\x0d\x4d\xd9\x0d\x75\x13\xe1\xad\x24\x27\xd4\x7d\x56\x1c\x23\xff\x72\xe1\x7b\x29\x0f\x8e\x93\x84\x97\x45\x08\x2b\x47\x91\x7d\xd6\x2d\x53\xa5\x33\x72\x80\x2d\xba\x00\x7b\xdf\xe7\x52\x1f\xd0\x91\xd0\xa5\xda\x99\x2c\xf3\x13\xb1\xb4\xf9\x83\x69\x2e\x76\xb7\x47\xdd\x7e\x27\x03\xc0\x77\x01\xce\x05\x03\x20\xc9\x52\xe8\xb1\x91\x83\x02\x93\x00\xe9\x3a\x34\xe4\xd1\xe5\xe8\xab\x6b\xb0\x06\xf2\xca\x14\x7a\x29\x79\x6f\xdc\x9d\x27\xa4\xd2\xfc\x88\xe6\xa6\x42\x16\x2c\xf8\x5c\x6e\x83\xc2\xad\x5d\x53\xe5\x47\xc2\x51\x21\x6c\x7e\x9a\xdf\xe1\x8a\xcd\xc3\x7b\x1e\x0c\xbe\x00\x7e\xb1\xd6\x4b\xc3\xa0\xf1\x52\xf5\x06\x41\xdb\x41\x5d\x81\x01\x3e\x46\xf8\x76\xaf\x81\xf7\x45\xb8\x67\x15\xe6\x4e\xe3\x1b\xf3\x94\x2f\x4c\x0f\xb0\x04\x8a\x17\x92\x93\x30\xba\xf2\x1e\x8e\x73\x18\xfc\x9b\x31\xde\xe0\xdf\xdd\xc6\x38\xb3\xe3\x50\x99\x2c\x2b\x19\x5c\x5b\x3c\x69\xa8\xd3\xb1\x73\xcc\xdc\x4a\xed\x4e\x34\xb4\x5a\x18\x27\xc3\xfe\x7f\x50\xba\x03\xe5\x49\x18\xd5\xf0\xdc\x2e\xa0\x95\x6b\x29\xa9\xe2\x3d\xa4\x66\xd7\x94\x90\x93\xc5\x69\x15\xb1\x8e\xe2\x34\x78\x4d\x4e\xad\xb2\x14\xa3\x3b\xd0\xc7\xa5\xdd\x6c\x40\xdb\xd6\x1d\xcc\x5b\x02\x32\x05\x6a\xac\x8d\xc9\xeb\x04\xfd\x56\x42\xb4\xa6\x95\xd9\xb0\xb9\x0a\x4f\xda\x18\x53\x51\x89\xd1\xb2\x48\x2b\x53\x30\x7d\xcd\x19\xd4\x79\x3b\x37\xf2\xc2\xb9\x91\x5c\x17\xdd\x13\xbe\x65\x8f\xbc\x5e\x79\x16\xe1\xc5\xbf\x36\x45\x41\x5c\x69\xd1\x19\x0f\xe1\x29\xdc\x94\x71\x45\x33\xc8\x8c\xf6\x55\x6f\x12\xb4\x39\xa5\x40\xbb\xb3\x2c\xe8\xc5\xfc\x4c\x1d\x1d\xba\x33\x67\x84\xea\x62\xa5\x46\x3c\x66\x11\x2f\x11\x8f\x23\x6e\x46\x3c\x8c\x53\xf8\x9b\x05\x19\x53\x9d\xa1\x19\xeb\x9e\xe0\x59\xcf\xf6\xc0\x39\xbe\xb4\x77\x79\xfa\x5f\x66\xe5\x3f\x50\xaa\x85\x5d\xed\x13\x05\xc2\xd0\x31\xaa\xd9\xbf\xa8\x14\x29\xf5\xb6\xa4\x25\x9e\xeb\x40\x55\x9e\xe9\xfc\xae\xd6\x77\x26\x01\x36\x15\xdc\x3a\xce\x73\x5b\x19\x56\x3d\xd4\x1b\x9b\xdf\x09\x9f\x15\xba\xed\x89\x79\xdc\x32\xa4\x47\x84\x29\x9a\x81\xdb\xa2\xae\xd2\x45\xa1\xdd\x89\xd6\xf3\x17\xa3\x3b\x91\x83\xfd\xe0\x2b\xc3\xe8\xea\x68\x5d\xab\x3b\xaa\x83\xd1\x48\x34\x47\xeb\xfe\x58\x9f\x60\xe8\x94\xe4\x0d\x69\x10\x72\x5b\x6c\x74\xe6\xe7\x67\xab\x97\x5f\xf5\x1d\x1e\xf0\xd7\xfa\xef\x00\x4a\xdc\x6c\x6d\xee\xe3\xd5\xde\x09\x82\x80\x9f\xb7\x06\x74\xd5\xfe\x38\xec\xf0\xc5\x89\x22\x68\x1c\x14\xf6\x81\x50\x1f\xe6\x0a\x03\x94\x7e\xe7\x6b\x8d\xba\x1f\x84\xc0\x38\x8f\x64\x57\x5a\xb5\x17\x0e\x4c\x18\xe9\xf3\xe7\xe1\xb3\x9e\x42\xff\xc0\x6d\xd2\x25\x32\xd9\x77\x4b\xb3\xd1\x88\x5e\xe2\x29\x95\x96\x36\xaf\xcc\x2f\x55\xe2\xc9\xf1\x36\xf0\x51\x67\xa4\x61\x6a\x7e\xc9\x5f\x52\xc7\x5f\x4d\x91\x9b\xcc\x9d\xef\xf9\xca\xee\xc8\x33\x25\x99\x77\xab\x6c\xee\x99\x14\x68\xe1\x2d\x59\x46\x26\xbf\xa3\x0f\xab\x63\x2c\xa8\x38\x71\x97\x71\xe0\xa1\x6b\x2e\x8a\xa2\xce\x4b\xaa\x62\x74\xaf\x4f\x33\x53\x78\x9b\x5f\x52\xf9\xec\x98\x64\x4b\xc7\x8a\xba\xb0\x07\xb6\x85\xa9\xc4\xf7\x8a\x3a\x57\x84\x91\x87\x05\x7a\x61\x0b\x8c\xd6\x01\x82\x00\x8f\x99\xe8\x30\xe9\x52\xe9\xa5\x41\xca\xb2\x66\x88\x4b\x78\x8a\xe8\x77\x55\x26\xe1\x30\x04\xad\x1d\x84\x53\x34\xfb\x7a\x02\x0d\x03\xac\x99\x78\x19\x55\xcf\x79\x36\x76\xee\x6a\x80\x5d\x94\xcb\x22\xdd\x56\x64\xdf\x62\xc9\x1a\xba\x73\xc1\x66\x10\x64\xfe\x69\x25\x05\xbe\x03\xcb\x83\x7b\xea\x8b\x52\x35\x37\x2b\x8c\x69\xd3\x7f\xac\xac\x45\xeb\x9b\xfe\x90\xed\x23\x51\x56\x11\x15\xe6\x95\x5b\x90\xa7\x26\xcc\xcd\x34\x67\x80\x1e\xe2\x36\xe2\x16\x8b\x3d\x89\x00\xa3\xaa\x65\xa2\x37\x54\xaf\xbb\x66\x31\xdc\xfa\xc2\x86\xf0\xde\x19\xc8\x4f\xb4\xa5\x9d\xf8\x64\x87\x3f\xca\xcb\x39\xf1\xc8\xeb\xa6\x42\x2d\x64\x64\x56\x2a\xe3\x51\xc3\xd4\xd9\x3e\xd7\x1b\x02\x5d\x67\x69\xfe\x15\x29\xe2\xfd\xc8\x78\x20\x07\xbb\x01\xbc\x55\xe0\x0b\x32\xb0\x45\x61\xb8\x70\x95\x2e\xf6\xae\x3f\xe9\xc6\x19\x20\x2b\x5d\xe9\x06\xa2\xc9\x16\x7e\x21\xac\x33\xbb\x13\x18\x2f\x8b\x31\x14\xdf\x06\x91\xfe\xd2\x45\x60\x32\xf3\x57\xd9\x1c\x8a\x06\x3b\xc6\x15\xa2\xf4\x72\x09\x79\x7b\x9f\xc3\xb2\x05\x78\xe9\xaa\x30\xbc\x09\x1a\x30\x74\xf4\xc2\xda\xef\xee\x7a\xdd\xe3\x6d\x89\x37\x6a\xf3\xd0\xc3\xc8\x8b\xae\x30\xc0\xed\x7b\x76\xde\x57\xef\x75\x99\x2e\xd5\x8d\xf7\x44\xd0\x7d\x14\xe4\x23\x1d\xcc\xee\x1e\x82\x5f\x04\x4c\x27\x2f\x11\x84\x12\xae\xdb\x41\x65\xaf\xa7\x0a\xa1\x56\x67\x00\x16\x85\x79\xb0\xe8\xad\x08\x31\x6f\xc3\xc0\x5f\x89\x23\x2d\x8c\xda\x98\xaa\x01\x4e\x33\xbf\x38\x6f\x27\x75\x16\xab\x5e\xaf\xd3\x62\x53\x62\xc4\xbb\xce\x3d\x94\x28\x0a\x47\xf3\xc1\xd2\xf6\xf6\x48\x13\xb3\xae\xb6\x35\x21\x5b\x8a\x3a\xcf\x49\xc0\x46\xb8\x8e\x28\x82\xf1\x10\xf4\x9e\x65\x75\xb1\xbb\x00\xa9\x16\x11\x9f\x94\x90\xe6\x42\x5a\xd1\xb5\x42\x7c\xa4\x82\x1d\x54\x3e\xbc\x59\xdf\xb0\xf4\xfa\xee\x65\x14\xc9\xb7\x6b\xcf\xd6\x17\xea\xbf\x03\x8b\x4e\x42\xe5\x52\x38\x9e\x8b\x7d\xec\x09\xc2\xec\x72\x99\xf1\x06\xe2\xdc\x6e\x58\xc8\x03\x40\x57\x36\x6a\x95\xc8\x82\x90\x2e\x28\x1a\xd5\xc1\x8b\x15\xf3\x54\x5a\x05\x1c\xbc\x9a\x5a\xcc\x69\xea\x00\x29\xe2\xcc\x6b\x9a\x23\x0a\x3c\xd4\x3c\x93\xad\xde\x78\xb7\xf5\xa9\x2f\x5a\x5f\xa5\xcd\x22\x8a\xd0\x7b\xfd\x40\x88\xb7\x0d\x3a\x6e\xb1\x0d\xeb\x19\x97\x32\x74\x31\xf6\xb6\x4e\x3c\xd2\x75\x65\x28\x7f\x58\xdd\xb3\x26\x30\x13\x26\xf1\xfc\xe3\x69\x41\xa1\xa2\x48\x72\x1e\xf3\x7a\x42\x68\xe7\x20\x2e\x98\xd0\x7b\xe8\xdf\x21\x47\x11\x0b\xf1\x04\xb3\x26\x1e\x60\x38\xb6\xfc\xc4\xb9\x95\x81\x91\xc9\xba\xf4\x61\x15\xd9\xc6\xe6\x94\x51\x4f\x31\xbd\x84\x72\xc3\x72\x20\x6c\x8e\xd3\x83\xe2\xec\x09\x6d\x6d\xf8\x15\xc6\x1d\x38\xe6\xe7\x55\x4f\xdd\x06\x82\xae\x61\x00\x52\x44\xb0\x37\xb8\x5f\xd8\xab\xc7\xa0\x18\x65\xe8\xe0\x89\x52\x34\xc6\xf7\xdb\xd6\x15\x27\x18\xd2\x42\x31\x91\x2c\xd4\xee\xc1\x58\xee\x6d\xcd\x1a\xdc\x34\x6c\x14\xe0\x08\x15\x85\x69\xb1\xac\x37\xce\xfe\x77\x96\x7d\x84\xdc\x20\x61\xc4\x80\x04\x94\x2b\x54\x50\x2d\x42\x25\x8a\x28\x2b\x8d\xf0\x19\xef\xbc\x1c\xee\xd9\x2b\xc2\x9f\xa6\x95\xaa\x73\x0f\xb7\x66\xb2\xca\x9b\x90\xc5\xb8\xc5\x2c\x06\x7a\xe2\x44\x30\xf6\xc1\x8d\xce\x20\xaf\xd2\xd3\x0b\x68\xf1\x83\x33\x23\x6d\xae\xae\x68\x2f\x8e\x6d\x7c\xc2\x34\x81\xd6\x7c\xdf\x3b\x4b\x89\xc3\xc6\xdd\x05\xfb\x62\x88\x62\xe4\xbb\x5a\xd7\xd9\x3a\xcd\x32\x58\x36\x2d\xe5\x22\xf0\x81\x32\xa3\xce\xce\x7c\xf5\xea\xe8\x66\x22\x4e\x8d\xaa\x30\xba\xda\x2b\xbd\xb2\xdb\x0a\x03\x61\xe7\xaf\xd4\xa5\x59\x1a\x20\xd8\x3e\xfb\xe1\x87\xef\x60\x47\x95\xe9\x26\x75\x9e\x14\x04\x5e\x79\x85\xf0\x4a\x65\x52\xa8\xfc\x8e\x26\x8e\x87\x81\x53\x37\x4c\x3a\x00\x63\x02\x50\x05\xdc\x5e\x70\x26\xc4\xe7\x64\x42\xb9\x7b\x2e\x3a\xa2\xcc\xa3\xdd\x61\xfd\xf0\xda\x16\x8b\x74\xd5\x7e\xcd\x21\x92\x83\x28\xc4\x80\xf5\xac\xd1\x57\xd3\x92\x06\x1e\x4f\xd3\xe7\x51\xe7\x76\x00\xbb\xe3\x2e\x68\x4a\x00\x33\x17\x04\xf4\x04\x80\x2f\x8c\xf0\x85\x3b\x2c\xe8\x4e\xfa\xf8\x9c\xb7\x6f\xd6\x0d\x77\xd0\x93\x45\x22\xcc\x1f\xb9\xb1\x85\x96\x2c\xd9\xb6\xa4\xa2\x0e\x7b\x13\x93\xa3\x24\x6f\x9d\x9a\xf2\x05\x0d\x66\x90\x22\xf9\xb6\xd1\x64\xce\xb1\xb0\x6d\x7f\x66\xb8\xd4\x05\x06\xd1\xe4\xf5\x43\xb3\xdb\x89\xa8\xf2\xf6\xc2\x8b\x32\x32\x66\xf0\x66\xf1\xa1\xb9\xb4\x4a\x18\xcf\x8e\x24\x04\xdd\x87\x74\x5e\x6e\xd3\x65\x8d\xe9\x55\x30\x3f\x42\xec\x2a\xdb\x7b\xb1\x29\x9b\x2b\x2a\x63\x00\xd8\xd7\xa3\x11\xae\x77\x07\x39\x40\xdc\x09\x23\x54\xec\x1a\x15\x8b\x1c\x38\x61\xcb\x24\x54\xbe\xad\xc8\x6d\xd7\x4b\xa0\x61\x41\x23\x9c\x8e\xa0\xef\x43\x12\x03\x97\xd2\xea\x91\x06\x70\xed\xdb\xa2\x34\x44\x5b\xe8\x5e\xca\x81\x36\x2c\x92\xbf\x4b\x19\xa7\x1d\xf0\x0f\xdd\x81\x2f\xc9\xaa\xdf\x0c\x80\xfb\x89\x44\x5c\x0e\xd6\xeb\x50\xb9\x7e\x6e\xe9\xff\xdd\x5d\x14\x86\x55\x4e\x0a\x58\x11\xbc\x11\x40\x4b\x0c\x50\x06\x65\xbd\xdd\x5a\x77\xe8\x15\x21\x3a\x18\x50\x00\x01\xd4\xc1\xe5\xdd\x61\xb1\x5d\xb3\x59\x47\x36\xf1\xcf\x3e\x65\xde\x5e\x75\x8f\x04\xf7\x3d\x17\x4f\x2b\x1c\xc6\xbe\x76\x2a\xf8\x42\xfc\x97\xbc\xf0\x19\x1a\xc0\x72\xd5\x76\x54\xce\xf1\xd4\xbe\xe9\x5a\xb1\x94\xd6\x32\x94\x98\x59\x13\x30\x24\xdc\x63\x9e\x59\xef\x04\x2c\x57\x0c\xf6\xb9\xcb\x7e\x09\xd4\x9e\x21\xb6\xd8\xb9\x2a\x3d\x48\x07\xd1\xfd\x09\x2f\x09\x34\x78\x0b\x93\x99\x07\x9d\x57\xa0\x57\xe8\xeb\xce\x7e\xd5\x8b\x30\x75\xee\x31\x6c\x5d\x2e\x04\xed\x09\x69\xec\xc3\x4e\xc0\xcf\xfa\x0d\x40\xc6\x31\x39\x81\xa4\xbc\xb4\x22\xce\x09\xc8\x27\x85\x3f\x38\xff\x87\x47\xd7\xcd\x5a\xef\xc0\x4e\xe9\xf9\x72\xb3\x93\x80\xeb\x91\x0c\x75\x54\x27\x44\x27\xb6\x08\xb9\x75\x74\x04\x33\x82\x36\x47\xde\xf4\xa5\xdd\xa0\xbb\x6d\xd5\x16\xf4\xf2\x19\x07\xa0\x7d\x0e\xac\x59\x25\x59\x31\x9a\x00\xf7\x7a\x2c\x67\x11\xdf\xe9\xe2\x58\x08\x15\x3f\xb0\xb2\x3c\x83\x18\x34\x54\xde\x11\xe4\x77\x11\xbc\x11\x9c\xcd\xc4\xf9\xa5\xba\x58\x65\x24\x0b\x4d\x30\xa4\x3d\x06\xd6\x21\x54\x88\xb4\x98\x31\xe2\x07\x2b\x71\x62\xd7\x4a\x8e\x9a\x4f\x1c\x06\x24\xa3\xde\x53\x8e\x3d\x0a\xbb\x40\x61\x9a\xd7\xc4\x14\x0f\x24\xd4\x17\x20\x2a\x58\x9b\x03\x94\xae\xa9\xba\x3a\xf5\x95\x5e\xab\x13\x8e\xcb\xc3\x5b\xef\x75\xf9\x48\xe2\xa4\x4c\xf0\x20\x42\xab\x98\x68\x99\x0f\xa6\x50\xde\x85\x12\xec\x34\x56\x8d\x6c\xbe\x45\x44\x98\x09\x3b\xc0\x04\x4e\x8f\xbf\x81\x2e\x61\x68\xb9\x0f\x25\x80\x0f\x03\x76\x35\x02\x6b\x30\x96\x8e\x51\x3f\x7f\xf1\x37\xbc\x52\xa9\x78\xfa\xa8\x94\x49\xd2\x08\x26\x61\x99\x5d\x5a\xa8\x1c\x13\x3d\x60\x05\x45\xc0\x8f\xb6\xd5\x12\x3f\x01\x85\x58\x83\x1e\xb8\x8f\xce\xa0\xed\xb0\x01\x2a\xb7\xe2\xce\x14\x01\xa7\x07\xb2\x93\x98\x7c\x7c\xb0\x59\xbd\x21\xee\x91\xb2\xb2\x85\xbe\x83\xbb\x23\xca\x27\xf2\xbd\x2e\x52\xc4\xb9\xea\xe9\xbb\x3b\xb7\x78\x2b\xd3\xe3\xd9\x91\x43\x04\x9d\xaf\x4a\x91\x65\x0e\xf7\x37\xb7\x9c\xe3\xa0\x68\x67\xc1\x8d\xe9\x29\xae\x22\x2b\xc8\xb6\x9e\xcf\x56\x94\x5a\x98\xbd\x85\x21\xa1\x20\x96\x10\x5b\x40\x47\x0c\x9d\x92\xbe\x1a\xe5\xe0\x7d\x75\xce\x1e\x6c\x15\xe5\x3b\x24\x24\x57\x35\x02\xfb\x1a\xa7\x8c\xb4\x04\x3a\x42\x47\xfe\x41\xcc\x4e\x11\xee\xc7\xb1\xcd\x4f\xe9\x6a\xfc\x60\x8b\xcd\x81\x7b\xb1\xd9\xb8\x56\xd0\xf7\xf0\x6d\x56\xaa\x37\x30\xf6\x6f\x0f\x5e\x6a\x22\x23\xb7\xd1\xcb\xfb\x34\x37\xa7\x85\xd1\x2b\x38\xd6\x3a\xe3\x5a\x4f\x72\x05\xa6\xa8\xbc\xe7\x2f\xc9\x9d\xde\xcb\xeb\xf1\x22\xbc\x30\x8e\x88\xc3\x2d\x6f\x36\x0b\xbb\xc2\x38\x2c\xe4\xe4\xee\xf7\xc8\x7f\x4e\x18\xac\x58\xca\xd8\xff\xb5\x63\x7d\x9e\x24\x60\xb8\x6d\xb6\x3a\x4f\x43\xfd\x6a\x77\xa4\x2e\xfd\x05\x4d\x0e\x0d\x7c\x05\x10\xfe\xe2\x27\x13\x93\xd6\xb2\x2e\x2b\xbb\xc1\x8c\x3f\xac\xd3\x08\xe7\x0f\xe7\x0d\xe2\xe3\xc4\xf5\xfc\x4f\xeb\xa8\xf6\x45\x6e\x60\xbf\x25\x54\x70\x8c\xac\x58\xc4\xe0\x53\xdd\x17\x06\xd5\x11\x31\xdc\x2a\x3e\x52\xca\x90\x11\x9b\x80\x5b\xbc\x82\x0a\x44\x35\xe3\x70\x08\xd3\x10\x83\x41\x18\x89\x80\xe6\x6f\xec\xca\x64\x70\xf9\xdd\x91\x5b\xc8\x37\x31\x5d\xbf\x64\x26\xc8\x91\xa1\x94\x23\x00\x61\x85\xe9\xfb\x58\x7c\xd5\xe7\x39\xfc\x4c\x30\xd6\x0a\x5a\xc1\xa9\xc2\x03\x21\xc2\xe4\x37\x9a\xf4\x84\xd3\x97\x60\x5f\xe7\x56\x68\x50\x62\x9c\x30\x30\x40\x2d\xa9\xec\x80\xdf\x15\xf8\x00\xd0\x46\xc3\x84\x17\x1d\x0f\xde\x68\x85\x15\x73\x7c\x7e\x22\x10\xa4\x64\xbc\x1f\x1a\x1c\xa0\x34\x65\xc0\x03\xa6\x04\x61\xf6\x73\x4b\xce\x81\x30\xb5\x68\xa1\x8a\xb3\x32\x76\xfc\xe4\x1c\x11\xc2\x42\xce\x4e\xb4\xd8\xc8\x28\x7f\xa0\x58\x52\x77\xdc\x1c\x2d\x18\x60\x8a\xcc\xb1\x40\x11\xfe\x09\x61\x1e\x0c\xdb\xda\xe5\x52\x97\x60\x46\x91\x83\x88\xfa\xd4\x1b\xe7\xea\x23\x8e\x11\x72\x04\x14\xe1\x95\x88\xf0\xee\x16\xe3\x25\xe8\x37\x44\xd3\xab\xab\x17\x6c\xc1\x7d\xb7\x10\x96\xcc\x81\x1d\xbc\x20\xc7\x08\xf6\x26\x4e\x08\x8d\xb7\xa0\xf7\xdf\x66\x7a\x69\xd4\x71\x13\xfb\x8e\x83\x4f\xcc\x1c\x38\x62\x82\x6f\x3d\x4c\xef\xc1\x99\x4d\x05\xc5\xc3\x4e\xef\x3d\xcc\xc5\xff\x12\x5f\x8c\x53\xcd\x94\x07\x34\xe5\x70\xb5\x78\xc3\x86\x29\x18\x25\xe2\xfe\xa9\x75\xd5\xf0\x3d\xc5\xa8\x78\x3c\x06\xbe\x5f\x3e\x29\x3a\xfd\xca\xd6\xb2\x4c\x0e\xbf\x8e\xc0\x75\xb8\x4b\x3d\x8d\x0b\xad\xe6\x63\x0c\xc5\xe0\xb6\xde\x53\xbd\xb8\x08\x9f\xec\x4f\x28\xc3\x82\x67\x54\x29\x07\x9a\x90\x52\x22\xc8\x2c\x2e\x48\xf4\x7e\x53\x60\x9d\x45\x68\x7b\x88\xc2\x96\x2a\x37\xbf\xf8\x10\x92\xec\x59\xa9\xe1\x89\x24\x45\x60\xd5\x3a\xa5\xac\x5c\xf7\x16\x98\x46\x96\x3e\x18\x2c\xd4\xaf\x7b\x5b\x52\xf1\x43\xd7\x37\x13\x5a\xed\xc0\x1a\x44\xc1\x43\xb4\x9b\x4c\x1e\xaa\x1f\xd0\xcf\x13\xd9\xcf\xf8\x60\x0f\xb9\xe0\xd2\x2d\x4f\xcc\xe0\x96\x91\xd3\x16\x44\x4b\x0e\xee\x83\x1a\x82\x6e\x5b\x63\x8a\xd3\xca\x9e\xba\xff\x46\x32\x28\x8d\x11\x45\x92\x40\x36\x90\x0c\x80\x34\xbc\x6c\x43\x33\xb5\xdc\xb9\x1a\xa2\x00\x5b\x61\xd4\xc2\xe0\x21\x89\x82\x5c\x34\x25\x94\xfb\x65\xbc\x81\x3c\xf2\xd8\x85\x15\xbb\x7d\x45\xe6\x3c\x5a\xe9\x70\x09\xd8\x42\x46\xf3\x44\xc3\x9c\xad\x0e\x99\x4a\x11\x47\x48\x29\xa1\xe1\x3a\x29\x18\xac\xbb\x76\x8e\x5b\xf8\x51\x1a\x7b\x9f\x84\xbd\xb8\x30\x11\x52\x24\x5c\x01\xad\xd3\x4c\xc0\x79\x6e\x9d\x33\x75\x83\x57\x5d\x0f\x9a\x22\x2f\xd0\xde\xd2\xe6\x65\xbd\x41\x43\x1f\x3e\xc2\xce\x46\x40\x0c\x55\x3a\xbf\x03\x60\xd9\xd6\x14\x25\xd3\x54\xa0\x6c\xb3\x00\x9e\x14\x1b\x64\xe8\xe2\x2b\x90\x3f\x9c\xa8\xb5\xde\xa4\x19\xa0\x7c\xd4\xbd\xad\x4b\x73\x6f\x33\x4f\x17\x50\x86\x4b\x8b\x93\xb0\x3e\x7b\x0c\xf7\x68\xb6\x22\xd4\x24\xd3\xc7\x22\x96\x11\xb0\xda\xab\x9d\x81\xf0\x38\x28\x8f\xaf\x0c\xf2\x10\xd1\xf6\x42\xe0\xa1\xbf\xe3\x53\xc2\xce\x45\x7d\x4d\x50\x19\x64\x5d\x67\x00\x3b\x2a\x25\x79\x4b\x69\xb3\x07\x1c\xe6\xb5\x7e\x00\xae\x1d\xb4\x0f\xf4\x1d\x95\xa1\x34\x71\x48\xf0\x1a\x7f\xbf\x80\x81\x25\x3e\xe0\x1c\x8f\x44\xf5\xa2\x61\x8a\x60\xc9\xaa\xda\x6f\xc1\xac\xb0\x08\x45\xb3\x79\x00\xe3\xe8\x4a\x2d\x33\x5d\x96\xa2\x20\xa2\x19\x04\xe0\x04\x6c\xed\xff\xd5\x78\xb9\xb2\x9e\x05\xc7\x5d\x08\x91\x7e\x62\xf3\xa3\x1a\xc4\xb9\xb1\x95\x38\x41\xe6\x97\xad\x59\xa2\x55\x87\x1a\x13\x18\x58\xe7\x22\x0c\x61\x4d\xf5\xd5\xe0\xf1\x41\x6f\x34\x9c\xa7\x4a\x1a\x64\xf7\x40\x16\xe9\xab\x25\x54\xb8\xd3\xdd\xa5\xbc\xaa\x4b\x94\xd8\x86\x70\x65\x7e\xea\x5f\x80\xad\x95\x04\x36\xee\x37\x81\xbe\x05\xb7\x89\xb3\x06\xdc\x02\x83\x10\x21\xc6\xa3\x0c\x81\x00\xfd\xd0\x51\x57\x00\x47\x3e\x42\xf4\x0b\x2e\xbc\x51\xe0\x30\x65\x90\x8d\xdc\x5f\x62\xd3\x6c\x4c\x75\x6f\x57\x78\x61\x2c\xcd\xaa\x2e\x80\xc9\x01\x0a\x84\x58\x9d\xf1\xab\xd9\xe3\xe8\x5a\x52\x90\x09\xfc\xa8\x92\xcb\x8b\xab\x80\x80\x0a\x08\x50\x37\xa6\xbb\x14\xa8\xed\x03\xc2\xd2\x89\x1a\x48\x26\x48\xf3\xfb\x58\x1b\x59\x1e\x34\xc4\x4c\xd4\x3a\x2c\x7f\xab\xd7\xeb\x14\xef\x70\x79\xa7\x50\xe2\x0e\x98\xc3\x56\x6a\x5d\xe7\x70\x86\x92\x9d\x1a\xa2\xb3\x6e\x7b\xc7\x17\x7e\x9a\xc3\x19\xac\x4b\xc3\xc5\x14\x78\x04\x60\x98\x06\xbb\x85\x08\x17\x48\x13\x2e\x0c\xfa\xd9\x51\x72\x85\x29\xd1\x80\x02\x03\xa6\x8f\x58\x9c\xd9\x4b\xce\x5b\xc7\xa4\x0c\x0a\xf2\x81\x4f\xce\x97\x7b\x1d\xe6\xc8\x24\xb8\x65\x4d\x45\xa5\xe8\x91\xc9\xc1\x0d\x10\x1b\x61\x9c\x63\x55\x93\x2e\x43\x46\x10\xaf\x3f\xcd\xaf\x12\xfb\x90\x80\x17\x6b\x19\x7c\x14\x55\x31\xee\x23\xd1\x64\xa6\xa5\xc7\x26\x8b\xbb\x2d\xf0\x80\x21\x4a\x69\x6b\xaa\x9a\x68\xb2\x28\x08\x0f\x9e\x2c\x20\x3e\x8e\x3b\x43\x89\x71\x0b\xa1\x3a\xae\xd0\xcb\xca\x14\xe9\x7f\x11\x64\xf7\xc0\xf5\x85\xfd\x8e\x43\xc6\x3c\xa8\xb0\x68\x16\xa6\xcb\xdf\x3e\xb4\xc5\xfa\xea\x3d\x53\x82\xcb\x40\xb1\x8f\xb4\x50\xed\xf4\xda\xb3\xc5\xb8\xa9\xce\x89\x02\x46\x98\x78\xaa\x30\x41\x1b\x80\x39\xc2\xc4\xce\xea\x5c\x92\x94\x5c\x88\x06\x1c\xc0\x6f\x1e\xb4\x15\xc5\x2f\x61\xd9\xd1\x03\xf1\xde\x98\x4e\xae\x83\x06\x92\x6c\xbf\x70\x7e\x0e\xf5\xbc\x0d\x73\xd3\xcd\x47\x78\x7a\x3e\xf1\x38\x76\xb4\x89\xa1\x3a\xf1\x99\x98\x04\x35\x81\x57\x50\x99\x25\x30\x47\x11\x91\xa0\x18\x87\x42\x74\x85\x26\xc9\x2f\xab\x84\x57\x52\x7b\x3d\xf2\x62\x4e\x9f\x7a\x68\x5f\x0d\xbc\x13\x13\x2c\x7d\x32\xe4\x57\x06\x16\xc7\xee\x9e\xa8\xbd\xa2\x2d\x4e\xac\x46\x0c\x49\xe0\xcc\xe0\xca\x1d\x64\x06\x21\x45\x70\x53\xc1\x59\x1f\xb2\xb0\xb8\x7b\xf8\x45\xa0\xcf\x05\x7a\xa8\x94\x86\xa8\x33\xc2\xbd\x6d\x0b\x5b\xd9\xa5\xcd\xb8\xac\x4a\x42\xd3\xf4\xb2\xb0\x65\x29\x1f\x44\x60\x87\x47\x76\x02\x9e\x09\x07\xa7\x39\xf0\x45\x36\x9c\xcd\xce\xad\x83\x65\x3d\xf0\x65\x1f\xb4\x08\xd4\x81\xc4\x60\x61\x56\x58\x75\x4f\x19\x88\x26\xea\xf6\x1b\x20\xb7\xe4\x7f\xc2\xdb\xd9\x0d\xcc\xad\x2f\xa5\xdb\xea\xb2\xdc\x81\xf4\x44\xe1\xae\x32\x3c\x18\xf3\xad\x5e\x7e\x85\x1c\x76\x61\xf4\x8a\x70\x04\xe4\x47\x31\x49\xec\x20\x64\x3f\xe6\x86\xe3\x99\x3d\xf1\xdb\x90\x53\x28\x7b\xa4\xce\xe5\x41\x2c\x40\x8d\x4e\x9b\xe0\x20\x72\x67\xb1\x67\x64\x0b\x56\x24\x60\x9d\x1c\x80\xf6\x84\xd0\x26\xdd\x79\x21\x87\x15\x35\x4d\x34\x82\x0a\xd2\x8a\x88\x99\x94\x11\x08\x98\x6c\xe2\x24\x83\xb7\x20\x2b\x52\x57\x03\xfa\x2d\xf6\xbd\xf7\x6a\x87\xc5\x28\x12\xee\x2d\x23\x4d\x1d\x95\x13\x3e\xb5\x83\xc1\xb7\x2e\x8e\x44\xa4\x5d\xec\x6e\x3a\x9e\x91\x0c\xf3\x96\x30\x54\x9f\x01\xa5\xea\xc4\xc2\xd3\x93\x83\x0d\x2f\x32\x38\x7c\x9a\x43\x99\x6b\x78\x36\x2b\x36\xb4\x06\x81\xd1\x62\x77\xce\x1c\xc9\x3b\x40\x77\x8c\x41\xc3\xdb\xc7\x33\xca\x76\xf6\xe0\x20\xb4\x04\x63\x4b\x5d\x20\x13\x60\xcd\xa3\x3a\x7a\x2c\xe5\x60\x19\x9e\x26\xdd\x9e\x18\x28\x72\xcc\x74\x45\x15\x3e\xee\x90\x63\xc9\x1f\x1e\xb6\xb4\xea\xab\xe3\x03\x6b\x84\xc6\x8e\xe3\x5c\x01\xfa\x4a\xb9\x1a\xbb\xa3\x56\xe8\x0c\x9c\x37\xa2\x6e\x40\xc7\x63\xc7\xfd\x6b\x40\xa5\xfb\x27\x3e\xd0\x4f\x11\x9b\xee\x97\xbb\x43\x82\x4e\xc4\x84\x32\xb1\x14\xee\x20\x99\x7b\x39\x44\x31\x7a\x0d\xd2\x75\x4c\x7a\x90\xa2\x96\x47\x07\x7e\x22\xbc\x8d\xf0\x4f\x31\x75\x5d\xc8\x1a\x1e\x24\xa3\x4c\xa8\x64\x85\xb0\x64\x90\x5b\x58\xad\xba\x1a\xc8\x73\x08\x28\x7b\x32\x99\xc3\x45\x14\xda\xe4\x1c\x49\x53\x94\xde\x49\xe2\x67\x9f\x3c\xef\x94\xc0\x83\xd6\xfd\x49\x24\x1e\x98\x55\x1e\xdc\x48\xc6\x31\x58\xd2\x52\x86\x32\x13\xe6\x09\x0f\xb1\x26\x46\x04\x77\xe7\x56\xce\xde\xc2\x31\x7a\xf6\x5d\xb3\x01\xef\x94\x2d\x42\x22\x60\xea\xcb\x34\xb7\x48\x5c\xec\x6f\xae\x50\xff\x22\x42\xc4\x98\xeb\xf2\xe0\x91\x82\x06\x4a\x2a\x5a\x94\xde\x05\x08\x00\xbe\x82\x43\x83\x07\xd3\x9b\x9c\x00\xc5\x01\xc7\x7c\x18\x89\x2b\x61\x01\xa2\x68\xf6\xf2\xc4\xed\x79\x0f\x19\xdb\xa4\x65\xcc\x95\xe9\xe3\x23\xc0\x3f\xdb\x9a\x27\xd2\xb8\xe6\x7e\x1f\x20\x6a\xf0\x58\x33\xee\x44\x60\x6e\x00\xea\x13\x3f\x24\x3b\x28\x71\x2b\x45\x0c\xd0\xcf\x8a\x27\xc0\xa5\xa7\x8a\x3e\xac\x4e\x90\x08\x5e\xaa\x49\xac\x3d\x27\xaf\x9b\x67\x0e\x55\xb8\x96\xe4\x7a\x83\xff\x93\x11\x1f\xa2\x18\x7b\xef\x7a\x73\x4b\xc5\x5b\xcc\x89\xba\x34\xcb\x0c\xc7\xb0\xb2\x88\xbf\x6e\x40\xd1\x3c\x05\x20\x80\xff\x82\x64\x0f\xd4\x54\xc2\x5f\xf1\xf5\x49\xf8\x28\xfa\x8f\x2c\x48\x02\xbf\x11\x2f\x5d\xcb\x55\x95\xe6\x2b\xb3\xc9\x23\x20\x5a\xe8\x83\xe0\xd1\x68\xcd\x12\xd1\x94\x06\x8c\x84\x3b\x81\xcb\xa8\xa3\x40\x53\xdd\x39\x73\x69\x75\x82\xfb\x0c\x99\xa4\x20\xb0\x00\x65\xf1\x9b\xad\xa7\x96\x0c\x3b\xaa\xe9\xc1\x24\x9e\xbc\x53\x7c\x86\x2e\x45\x04\xd6\x74\x3e\xd3\x57\xe1\x92\x28\x95\xcd\x23\x86\xf4\x46\x87\x3d\x72\xde\x92\xdc\x68\x04\xf3\x6a\x42\x35\xe0\x2a\x06\xb5\xa4\x15\x9c\x58\x3d\x8e\x9e\x4b\x05\xcd\x1e\xf4\x99\x76\xda\xc6\x68\xf6\x7f\x03\x36\xd5\x07\xc2\xf9\xce\x8c\x11\x72\x88\xef\x11\xd4\xa6\x38\x96\x49\x90\x39\xd3\xac\xb1\xd2\x81\xdc\x39\x78\xef\x4a\x6c\x0a\x3a\x80\x6c\x46\x6a\xd5\xd1\x8f\x70\x12\xd3\xf5\x89\x63\x6f\x8a\x0d\x5a\x1c\x2d\xf6\x34\xd9\xbc\x8e\xe7\x81\xbd\x80\xb9\x75\x80\x17\x79\x0c\x2f\x16\x7d\x44\x90\xe1\xf8\xe6\xf0\xb7\x7a\xd7\x85\x11\x96\x61\xdc\xf1\xe8\xdc\x0f\x45\xa6\x82\xeb\x2d\xce\x76\x03\x0c\xac\xa3\xd5\xde\x17\x63\xce\x7c\x38\x8e\x0e\xb5\x5f\x86\x1d\xa0\xb9\x68\xbb\xb6\x1a\xfd\x88\xc1\x2f\x79\x8f\xdc\xad\xef\x41\x6a\x1e\xe3\x25\xcb\x7c\x12\x40\x61\xe8\x2a\x62\xf0\x6d\x2d\xdb\x98\x53\x01\xb7\x03\x7d\x1d\xdc\x41\x5a\x4d\x82\xba\xb5\x9d\xa3\x90\xd6\xaf\x37\xdc\x07\x2d\x2c\x93\xd8\x3d\xb6\xb9\x9f\x12\xb6\x93\x08\xd1\xdd\x40\xdf\x69\x69\x76\xb2\x29\x95\x09\x3d\x40\x66\x97\x2f\x85\x65\xff\x8e\xfc\x7a\x90\x00\x16\xb9\x09\xea\x2e\xc5\x06\x76\x7a\xcf\x74\xf4\x42\xa5\x22\xc2\x52\x20\x5d\x1a\x97\x53\x04\xc6\xa3\xc6\xcc\x51\x95\x73\xc4\xbb\xeb\x57\x52\x17\x7f\xc4\xc0\x59\x9d\x55\x65\x36\xdb\x4a\xd4\x54\xa0\xdf\xde\x7a\x19\x6e\xe1\x07\x9b\xae\x98\x98\x3c\xcb\x1a\xe5\x47\x41\x1d\x43\x16\x98\x74\xa0\xdb\x24\x3c\x00\x0e\x92\x4a\x08\x1c\xb4\x6b\x84\x4c\x08\x9a\xe8\xbb\x42\x6f\xef\xa3\x33\xeb\x0c\xa3\x19\x9f\x04\xbc\x0a\x2c\x72\x50\x53\x00\x16\x3f\x70\xa9\x3b\x2d\xbf\x8a\xec\xdb\x50\x5b\x42\x81\x48\x11\x7a\x6e\xda\x75\x88\x41\x84\x90\x01\x3a\xb5\x27\xc1\xb6\xc4\xec\x2e\x85\x7a\x21\x44\x96\x57\x69\xd6\x69\x1e\x46\xf5\x46\xf9\xca\xad\xe6\x78\x10\xe3\xa2\x97\x50\x21\xeb\x16\xad\xc6\xd2\xfa\x24\xa0\x95\x1a\x0f\x5f\xeb\x14\xc9\x88\xdc\xfe\x59\x53\x86\x11\x3f\x1b\x86\x03\x68\x72\x36\xa6\x25\x12\x46\x64\xc3\x95\x55\xdf\xbd\x52\x2b\xb0\x5e\x40\xda\x1a\xde\x64\xca\x32\xac\xd0\x6b\x5b\x18\x0b\xa3\xfe\x8f\x0d\xa2\xe8\xd3\xc1\x2e\x41\x4f\x52\x53\x7e\x5b\x5f\x48\xe1\x32\x45\xc3\x60\x9d\x16\x65\x85\x3c\xc3\xde\xc7\xf0\x57\x1b\x8b\x83\xad\x0f\xaf\x18\x2e\x33\xdd\x53\x71\x69\xec\x9c\xc9\xe6\x06\x28\xf2\xb2\xa6\x34\x61\x78\xaa\x1f\xdf\xd7\xd1\xf8\x12\xdc\x62\x69\xd2\xad\x3f\x30\xb1\x51\x18\xaf\x8b\xe5\x50\x0e\xec\x31\xde\x17\xfe\x76\x08\xbb\xb2\x92\xbc\x9d\x50\xbf\x5d\x1c\x10\x9c\x61\x08\x85\x7f\x01\x74\x74\xdf\xad\xb2\x40\xb7\x8a\xff\x2c\x3c\x0a\x62\x6c\x52\x81\x23\xc7\x5c\xa1\x9c\xe9\xb0\x00\x12\x59\xb0\xf4\x9f\xb5\xce\xc0\xd9\xb4\x1e\x98\x9f\x9b\x5d\xcc\x38\xea\x01\x03\xfe\x8e\x8d\x11\xbe\x67\xaf\x60\xc8\x7e\xc0\x80\xde\x16\xea\x7a\x9c\x27\x41\x86\x27\xe5\x02\x3f\x61\xb5\x57\xa3\x98\x80\x21\x7d\x32\xd9\x81\x44\x5d\xad\x3a\x2c\x5b\xac\x10\x35\x22\x58\xfa\xa0\x00\x2e\xc2\x98\xf8\xb2\xc0\x41\xbe\x4c\xb3\x4c\x23\xd2\xd9\xd3\x87\xb4\x53\x24\x10\x9d\x07\xeb\x98\xb2\x0a\x9a\x33\x56\xc0\xe9\xbe\xa4\xc4\xd0\xa3\x09\x6c\xd9\x2a\x6a\x4e\x96\x7e\x35\x70\xc4\xb7\x84\x2c\xb5\x1f\x24\x51\xd5\x9c\x5b\x4c\x7c\x46\x8c\x01\x12\xbc\xeb\x8e\x69\xdc\x8e\x31\x7c\xb7\xf3\xae\xca\xf7\xad\xf2\x44\x43\xd5\xc9\xe8\x12\x22\xfd\x8c\x54\xd6\x59\xcb\x55\xd1\x31\x03\x11\x67\xda\x62\x2f\x08\x67\xb0\x24\x0f\x47\xb8\x55\x76\x99\x50\x46\x1f\x2c\x0a\xba\xab\xc2\x00\xb4\xb6\x3c\x72\xef\x10\x76\xd6\x59\xc8\x03\xbe\xf4\xe8\x23\x64\x44\x5f\xda\x5d\x5e\x56\x85\xd1\x1b\x35\xf5\xa0\x14\xf8\x52\x90\x58\x79\xa4\x0a\x29\x4e\x91\xc4\x17\x2b\xcd\x63\x29\x4c\xdb\xb6\x0b\xe9\x9d\x88\x84\xaa\x53\x93\x30\xf6\xb2\x1c\x13\x79\x4f\xe0\x9d\x91\xf4\xa8\x1c\xd7\x78\x1b\x10\xe9\x26\x21\x31\x7c\x3d\x90\xe4\x92\x5f\xec\xe3\xd2\x1f\x61\x3c\x4a\xb2\xad\x41\xae\x7a\x28\x78\x29\x73\x39\x3d\xb4\xf4\x65\x76\xc7\xe7\x8f\xf0\x3d\x58\xc1\x88\x75\x6b\x92\x9d\x0a\x6d\xaf\x88\xc0\x0e\x52\x92\x65\x69\x10\xc2\x6a\x73\xc3\x9f\x01\x7c\x18\x9a\x1c\xed\x67\x6c\x4c\x71\x87\x0b\x47\x52\x5f\xb9\x93\xed\xf1\x9d\x8a\x90\x60\x86\x50\xe5\xaa\xdd\x39\x42\x89\x0b\x39\x0a\x5d\x45\x5d\x75\xa7\xaf\x98\xe0\x08\x9c\x06\x60\x91\xac\x14\x1f\xd8\xdd\xeb\x0a\x74\x2a\x82\x68\x97\x0d\x9f\xe5\xac\xf9\xfe\x05\x10\x0f\xae\xa0\xba\x10\x83\x2b\x90\xaf\x34\x65\xa5\xee\xf5\x0a\x1d\x83\x3a\xa3\xca\x9d\x5a\xd0\xbc\x11\x3d\xa4\x37\xb5\x12\xb5\xcd\x6a\xd7\x2e\x2f\x54\x15\x57\x20\x1c\xcc\xb9\x45\x9c\x30\xbc\x58\x0f\xb4\xc9\xdb\x31\xf2\xef\x80\x8b\xaf\x1a\x54\xbb\x54\x0a\xe7\xef\x78\xb3\x5e\xdb\xa2\x2a\x5b\xe6\xb2\x90\x7d\xee\x72\x84\x39\x8b\xf6\x84\x60\xb3\xbb\xeb\xa1\x14\xfc\x80\x01\x1d\x71\x25\xec\x3b\x5e\x1f\xb6\xab\x31\x89\x2a\xec\x5e\x67\x94\xf4\xb2\x02\xda\x86\xdb\x4a\x34\xe5\xc9\x5a\xf9\xb8\xd0\x09\xf3\x71\x69\x05\x41\xb3\x2c\xad\xa8\x24\x33\x46\xe1\x42\x92\xe8\x14\xab\x03\x71\xfa\x01\x02\x0a\xff\x86\x04\x4e\xa6\x77\x65\x9d\x56\x27\x6e\x07\x99\x3b\xef\xba\x0b\x03\x9d\x3e\x1c\x0e\xeb\x55\xc8\x68\x24\x78\x1f\x25\xaa\x44\xec\x4b\x12\x50\x86\x00\x3c\xd5\x19\x91\xfa\x6e\x00\xa3\x44\x41\x2d\x49\x8f\xe6\xde\x13\xe0\x4b\x54\x94\x71\x76\xd6\x57\x37\xc4\xe0\xe8\xc9\xd7\x72\x0c\x25\xda\xa2\xc7\x50\x8e\x86\xa9\xe8\xb6\x94\x0f\xd0\x02\xba\xbe\xcb\x0b\x89\x6f\x67\x41\xd1\x16\x91\xa7\xdc\x04\xb2\x49\xa8\xee\xea\x87\xca\x25\x28\xa0\xf6\x0c\x7d\xa1\xa2\x80\xb1\x06\xd4\xca\x17\x65\xd4\x68\xcf\x43\xe7\x8b\x31\xa2\x4f\x06\x6a\x18\x39\xea\x94\x70\x72\x87\x5b\xf4\x6b\x65\x77\x04\x49\xa2\x43\x32\x93\x01\x69\xff\xe0\x40\x67\xac\x33\xa4\xf1\xd4\x4b\x32\x6e\x48\x7a\x05\x2d\x50\xfe\x6d\xc2\xb7\x84\x3b\x23\x20\xc3\x27\x26\x1c\xec\x6c\x14\x55\x4d\x44\x9d\x74\x1b\x9e\xbc\x6e\xae\x0d\x88\x09\x62\xe5\x30\xb3\x18\x34\x06\x05\x73\x37\x74\xe5\x73\x8e\x99\xba\x7a\xa8\x49\x90\x44\xea\xb2\x90\x78\xe7\x77\x15\xba\x76\xbc\x1b\xf7\xb3\x8c\xaa\xa2\xea\xb7\xe7\x36\x49\x68\x1e\x6d\xd6\x0b\x24\x28\x95\x14\xf1\xc3\xf0\x29\xcd\x50\xc9\xe5\xe0\x50\xbb\x15\x84\x68\xbb\x34\xcd\xa3\xf8\x40\x97\xd6\xe1\x90\x14\xb1\x7c\xa3\x85\xf5\xa5\x21\x98\xe1\x4b\xf2\x13\xb7\x3a\xb3\xd5\x0e\xe5\xb5\xf1\xcc\x39\x45\x06\x99\xc8\xd1\x8e\x4b\xda\xc5\x1a\x3c\xb0\x04\x13\x66\xb3\x4b\x10\x5d\xe5\xa6\x92\xb6\xb9\xd8\xe3\xb8\xc1\x03\x0b\x0a\xf2\x34\x3c\x62\x8d\x18\x66\xb3\x28\x45\xe6\xb3\x35\x37\x10\xbd\xe2\xa0\x4c\x96\xd9\x1d\x1e\x21\xd8\x2b\xba\xab\x20\xe4\xd4\x8b\x3b\x89\x47\x44\xbe\xe7\x98\x88\x14\x95\xc2\x44\x7a\x5a\x61\xd0\x8d\x95\x11\x57\x26\xb7\xe4\xb5\x20\x53\x3d\x20\x89\x48\x64\x90\x47\xe4\xd8\x33\xb0\xe5\xfe\xc9\x4d\x23\x98\xa8\x78\xfd\x77\xe0\x7d\x0f\x26\xd7\x58\xdf\x88\x94\xea\x14\xd4\xc7\x4f\x48\x0e\xc6\x13\xe0\x6f\xed\xc1\x34\xf7\x3c\x3b\x79\x3c\x81\x10\xbd\x43\xcb\xc2\xf3\x44\x06\xcd\x36\x9d\x1f\xea\xec\xc1\x6e\xc9\x02\x6f\x78\x6e\x17\x58\xa9\x61\xb8\x7e\xcd\x61\x32\xc0\x4c\xcd\xd0\xfa\xce\x5b\x4d\x0d\x18\xa4\x27\x8d\x05\x26\x4e\x88\xe1\xbf\x18\xe8\xf7\x2c\xe0\xb0\x9c\xed\x3a\xd4\x0a\x3f\xa9\x27\x99\x08\x4e\x45\x0f\x4e\x08\x2f\x69\x14\x1b\xf8\x1b\x1a\xe0\x02\xee\x93\x80\x0b\x49\x63\x21\xf5\x3c\x04\x44\x05\x7a\x95\x0b\xad\x0e\xf4\x15\xf5\xe7\x4a\x1b\x5e\x1e\xb0\xa6\x45\x81\x34\xd5\x56\xad\xcc\xb6\x70\xb6\x99\xf3\x4e\x00\x59\x42\x43\xb4\x30\xb9\x59\xa7\x55\x40\x53\x46\x0b\xc2\xf3\x93\x8b\xd0\x8b\x67\xf1\x3a\x7e\xed\xdf\x90\xfc\x43\x07\x52\x12\x91\x40\xb7\x1a\x01\x0e\x93\xf7\x85\x02\x40\xbf\xaf\x7a\x7f\x6d\xae\x15\xa6\xf0\xf3\xd1\x18\x4a\x9b\x78\xb2\x1a\xe2\x38\x75\xb7\x02\xfb\xfd\xcd\x95\x45\xbc\x20\x12\x74\xdc\x8a\x68\x13\xf7\x27\xda\x5e\x1c\x67\xc1\x76\x61\xf9\x5d\x57\x85\x62\xe3\x9b\x78\xf5\x78\x47\x55\x42\x36\x58\xde\x0c\x41\xd8\x44\xa8\xcc\x59\x4e\x7a\x40\x43\xb4\x02\x8d\x58\x5c\x0d\x59\x6a\x1e\x4c\x00\x53\xd0\xa6\x4b\xdc\x5d\x54\xd6\x1a\x71\x55\xb6\x53\x9a\x4e\x2b\x77\xb3\x66\x31\x34\xce\xed\x17\x9c\x67\x3c\xd9\x64\x81\xbc\xf0\x8c\xc1\x6b\xdb\x16\x76\x59\xb3\x97\xf5\x60\xf6\xe4\x02\x27\xad\x6d\x0e\x45\xdd\x70\xbd\x75\x1d\x43\x60\x13\x48\x84\x2f\x00\x5c\x9d\xcf\xd2\x39\x25\x6c\x9c\x79\xae\x1d\x46\xec\xfa\xb6\xf9\xeb\xc2\xe7\x30\x5c\x5f\x99\xf8\x4e\x3a\x49\x2d\x37\x3a\xef\x5a\x94\x6e\x0c\xb0\xf9\x69\xd9\xf0\xae\x71\x25\x53\x9c\x27\x26\x31\xe8\x5a\x14\x10\xfc\x86\xf4\xb3\xaf\xf6\x27\x63\x75\xd0\x7c\x69\x5a\xaa\xde\x2a\x2d\x97\x45\x0a\x17\x8a\x2d\xf6\x50\x5f\xda\x45\x17\x27\x12\x73\xe5\xd2\x6e\x05\x0a\x08\xc1\xdd\x89\x27\x41\x29\x9b\x9e\x0b\x0b\xed\x7a\xc0\x50\xa0\x20\x40\xbb\x20\x38\x16\x0d\x98\x91\x70\x79\x3c\x94\x28\x02\x95\x1e\xf6\x40\xfa\x91\xbb\x75\xa0\xda\x93\xb2\x4d\x85\x91\x7a\x8c\xee\x5a\x0a\xab\xd3\x67\xfd\x04\x2c\x92\x93\x7f\x34\x1e\x0b\x67\x3d\x12\x12\x34\xd2\x3a\x0e\xc2\x12\x24\xd1\xed\xc1\x23\x70\x09\x6e\xf5\x9e\x41\x89\x51\x0e\xa1\xda\xc7\x3c\x0d\x84\x6a\xe2\x90\x2a\xf1\xe5\xed\x11\x5a\x2f\x4f\x95\xb0\x11\xe4\xfb\x9a\xcf\x46\xc3\x2c\x61\x52\xef\xc6\xa6\x70\xae\x09\x1e\x24\x1c\x9c\x6b\x2d\x30\x8e\xb5\x26\x50\x37\x24\x57\x4f\x73\x7d\x01\x4d\x67\xfb\x50\x88\x0b\xe0\xa2\x67\x7b\x24\x2c\xc1\x70\x8e\x11\x06\x97\x02\xc3\xed\xca\x87\x95\x90\xd0\xde\xfd\xfa\x04\xaf\x8e\xc5\x89\xda\x16\x29\x95\x13\xae\x49\x81\xb3\xe3\xd5\x7e\x87\x7a\x81\x04\x34\x3c\xb8\xd6\xb9\xe4\x23\x11\xeb\x93\xda\xfb\x97\x72\x27\xae\x6d\x06\xa2\x03\x2b\xac\xaa\xa0\xf5\x29\x4e\x35\x1b\xd1\xe5\xfb\x31\xd9\x69\xef\x38\x27\x21\xd0\x7e\xfe\x27\x75\xad\x8b\xe5\x3d\xc8\x7a\x31\x52\xe8\xde\x73\xac\x76\x49\xd3\x02\xb5\x5a\x51\xfb\xac\x1e\x79\xd2\x12\x73\x03\x2c\x3b\x1b\x64\xe9\xf7\xe4\x64\x6c\x39\xac\xcc\xda\x07\x68\x22\x72\x6d\xaf\xa0\x1a\xec\xe3\x85\x89\x01\x90\x21\xd2\x2e\x72\x9b\xdc\x51\xa2\x7a\x3a\x3b\x07\xb1\xdd\x99\x57\xe5\xb1\x6b\x35\x01\x76\xb3\x17\x20\x30\xb5\xb2\x1b\xb6\xde\x1a\xdc\x77\x18\x9d\x58\x11\x71\x97\x3a\x66\xdf\x10\xd8\xdd\x6a\xe0\x4a\xc1\x0c\x86\xb4\x1e\x7d\x63\x4f\xc2\x14\x16\x7a\x95\x2e\x3d\xb6\x9e\x5f\xd1\x95\x65\xdb\xb3\x4f\x67\x7e\x59\xd6\x74\x1c\xfb\xa8\xd0\xe1\xef\xf6\xbd\xed\x89\xe2\x04\xdd\xe7\x8c\xb3\xa5\x4a\x59\x0f\x56\xa6\x9b\x3a\xab\x34\x4b\xa0\x20\xe0\xae\x45\x55\xd5\xc9\x1c\xc2\x15\x5e\x45\x85\x44\x24\xe2\x6b\x74\xb9\xb4\x3c\xcd\x7d\xfb\x20\x4c\x2b\xd0\x5f\xcf\xb2\x46\x8c\x88\x4f\x44\x37\xb0\x70\x2e\x85\x1c\x38\x57\xc3\x31\x3a\x6e\x89\xfa\xe1\x4a\xb3\x0b\x07\xdb\xce\xd7\x44\xfa\x83\x49\xec\xd8\xca\xba\xe3\x65\x23\x8d\xf5\x06\xa0\x92\xea\x4c\x48\x71\x8d\x62\x80\x3c\x6a\x20\x60\x43\x4f\xf2\x82\x0e\x31\x32\x8d\x9d\x6f\xc8\x2d\xac\x0b\xb7\x85\x11\x63\xc9\x50\xb3\xf8\xc0\x94\xec\x3e\x67\xaf\xfb\xea\xb6\x14\xb2\x2d\x1f\xc7\xb7\x6a\xe0\x9c\x47\xfb\x98\x3c\xc3\xaf\x02\xf4\x79\x23\xab\x49\x2b\x92\x7f\xa5\xf3\x68\x91\xe6\xa6\x95\x93\xe0\xbb\xa8\x4b\x79\xa1\x53\x56\xe2\xd1\xe6\x73\x35\x18\x19\x68\x81\xda\x22\xb0\x9e\x46\x04\x06\xb1\x86\x01\x86\x99\x0e\x01\x04\xa5\x0c\x7e\x93\xc4\x01\x60\x39\xbe\x00\xae\x7d\xc2\x32\x38\x96\xf1\xd2\x6d\x4b\xff\x19\x9d\x4b\x42\xa6\xed\x35\xa0\x7f\x96\xa6\x40\x1c\x9e\x20\xb4\x0f\x0e\x17\x7b\x57\x08\x1a\x88\xc9\xa7\xdc\xb0\x10\x06\x1c\xcb\xa3\x70\xb9\xbc\xe9\xab\xa9\x79\x48\xdd\x0c\xfc\x1c\xc9\xc7\x34\x02\x23\xf3\x47\xf4\xf4\x10\xa0\x4a\x7c\x5c\x05\x3d\x8d\x54\xa3\x72\xb3\x6b\xeb\xd2\x3c\xa2\xba\xd7\x12\xa8\x55\x33\xe7\x64\x47\x8f\x61\x9d\x5d\x26\xaf\x4b\x73\x55\x6e\xd3\x22\xf5\x36\x08\x57\x7c\x45\xd1\x2e\xd7\x48\xc4\x06\xba\x2f\xac\x4c\xa5\xd3\x0c\x66\x15\xd5\x3c\xe0\x15\x5e\xb3\x07\xcd\x61\x37\xda\x22\xb7\xc4\x8b\x33\x2d\x89\x23\x14\x0c\x07\xb7\x96\xea\xb4\x84\x5b\x8e\x3f\x91\xd7\x9b\x85\x29\x5a\x28\x2f\x86\x72\xb2\x1d\xe8\x61\xc0\xf8\xf9\xb8\x20\xeb\x89\x91\xea\x31\x34\x4e\x57\x61\xdf\xf4\xbc\x32\x21\xd0\xc0\x27\xb1\x78\x1f\x81\xa1\xed\x3a\x8a\xed\x1c\xd0\x95\x21\x4f\x9b\xd1\x53\xed\x16\xa2\x20\x42\xb3\x05\x42\xa4\x98\xe2\xa3\x87\x56\x4d\x6b\x74\x02\xd0\x0a\x86\xc9\xdd\x3f\xf1\x78\x3e\x3d\x2a\x21\x3d\xb0\xbc\xb7\x9c\x99\xe0\x87\x40\xd8\xe9\xf9\xcd\xa3\x4b\xfd\xd1\xf9\xdb\x16\xf6\x97\x3d\x0a\x6a\x99\x65\xea\xfc\x0b\x38\x10\x0e\xe9\x31\x1d\x9e\x4d\xf7\x08\x82\xde\x27\x9e\x24\xe3\x17\xc8\x2f\xe1\x07\x23\x88\x57\x9c\x46\x0d\xc3\x24\xb3\xfe\x22\x30\xcf\x57\x1d\x0e\x09\x3c\x9d\xbf\xc1\xce\xbe\xbc\x42\xae\x60\x3e\xd9\xd0\xf2\x9d\x70\xa3\x7a\x47\xb1\x12\x09\x30\x03\xea\x1f\x86\xdc\x4a\xe4\xbe\x4c\x71\x47\x5f\x10\x26\x42\xc3\x4e\x02\x80\x3e\x22\x99\x6d\x07\x9a\x05\x6c\x02\x3c\xc0\xbd\x1f\x01\xbd\x22\x58\x2d\x2e\x6b\x48\xb2\x88\x25\x89\x07\xdd\xdb\xbe\x07\x77\xe3\x4a\xfa\x4c\xf0\x6e\x3c\xde\x3e\x0d\xa7\x43\x35\x9a\xa9\xf1\x44\x7d\x1e\x4c\xa7\x83\xf1\xfc\x8b\xfa\x30\x99\xba\x3f\xa8\x9b\xe9\xe4\xe3\x74\x70\x9d\xa8\xf9\x04\xfe\x3d\xfc\xdb\x7c\x38\x9e\xab\x9b\xe1\xf4\x7a\x34\x9f\x0f\x2f\xd5\xfb\x2f\x6a\x70\x73\x73\x35\xba\x18\xbc\xbf\x1a\xaa\xab\xc1\xe7\xbe\x1a\xfe\xed\x62\x78\x33\x57\x9f\x3f\x0d\xc7\x6a\xe2\x9e\xfe\x79\x34\x1b\xaa\xd9\x7c\xe0\x3e\x3f\x1a\xab\xcf\xd3\xd1\x7c\x34\xfe\x08\xcf\xbb\x98\xdc\x7c\x99\x8e\x3e\x7e\x9a\xab\x4f\x93\xab\xcb\xe1\x14\xb4\x99\x5e\x4e\xa6\xf8\x45\x75\x33\x98\xce\x47\xc3\x99\x6b\xc6\xcf\xa3\xcb\xa1\x6c\x92\xea\x0d\x66\x6a\x34\xeb\xa9\xcf\xa3\xf9\xa7\xc9\xed\x3c\xb4\x7d\xf2\x41\x0d\xc6\x5f\xd4\x5f\x47\xe3\xcb\x44\x0d\x47\xf0\xa0\xe1\xdf\x6e\xa6\xc3\xd9\x6c\x78\xa9\x26\x53\x35\xba\xbe\xb9\x1a\x0d\x2f\x13\x35\x1a\x5f\x5c\xdd\x5e\x8e\xc6\x1f\x13\xf5\xfe\x76\xae\xc6\x93\xb9\xba\x1a\x5d\x8f\x5c\x3b\xe7\x93\x04\xde\x46\x9f\xe5\xa7\xbb\xc6\x4c\x3e\xa8\xeb\xe1\xf4\xe2\xd3\x60\x3c\x1f\xbc\x1f\x5d\x8d\xe6\x5f\x40\x50\xea\xc3\x68\x3e\x1e\xce\x66\x30\x74\x03\x6c\xf9\xc5\xed\xd5\x60\xaa\x6e\x6e\xa7\x37\x93\xd9\xb0\x8f\x03\x38\x9e\x8f\xa6\x43\x35\x1d\xcd\xfe\xaa\x06\x33\x1e\xd6\x7f\xbf\x1d\xf8\xe7\xdc\x0c\xa7\x1f\x26\xd3\xeb\xc1\xf8\x62\xe8\x5e\x25\xbb\x3c\x9a\x41\x6f\xd5\x97\xc9\x6d\x5f\xcd\x3e\x4d\x6e\xaf\x2e\xa3\xbf\xbb\x61\x1a\xaa\xcb\xe1\x87\xe1\xc5\x7c\xf4\xf3\x30\x71\x1f\x54\x83\xd9\xec\xf6\x7a\x48\xa3\x3d\x9b\xc3\xf0\x5c\x5d\xa9\xf1\xf0\x62\x38\x9b\x0d\xa6\x5f\xd4\x6c\x38\xfd\x79\x74\x01\xa3\x30\x1d\xde\x0c\x46\x53\x37\x46\x17\x93\xe9\xd4\x3d\x65\x32\xc6\x35\xf4\x5d\x1f\xc1\xe2\x3e\xc5\x71\xc5\xb8\x64\x3c\x2d\xc6\x6e\xf9\x0c\x7f\x76\x8b\xe3\x76\x7c\xe5\xc6\x61\x3a\xfc\xf7\xdb\xd1\xb4\x6b\x89\xb8\xe7\x0f\x3e\x4e\x87\x30\xcc\x72\x45\x7c\x1e\x5d\x5d\xc1\xdc\x35\x97\x45\x02\x5f\x19\x7f\x11\xcb\xe2\x8b\xfa\xfc\x69\xa2\xae\x27\x97\xa3\x0f\x6e\x52\x68\xd9\x5c\x4c\xc6\x3f\x0f\xbf\xcc\xa2\x51\x19\xcc\xc4\x7a\x1d\xbc\x9f\xb8\x81\x79\x3f\x54\x57\x23\x68\xcf\x7c\x02\xa3\xe4\x66\xed\x72\x70\x3d\xf8\x38\x9c\x89\x75\x01\xef\x24\x8d\xe7\x44\xcd\x6e\x86\x17\x23\xf7\x3f\xa3\xf1\xc5\xe8\x72\x38\x9e\x0f\xae\x70\xa8\xc6\xb3\xe1\xbf\xdf\xba\x99\x1d\x5c\xf1\x43\xd4\x60\x3a\x9a\xb9\x27\xb8\xa5\x49\xd3\x78\x3b\x1b\xc2\xf2\x1b\xf3\xb2\x99\x4f\xe0\x77\xb2\xb1\xc7\xe1\xdd\xed\x25\xa9\xae\x26\x33\x58\x7f\x97\x83\xf9\x40\x41\x8b\xe7\x03\xf5\x7e\xe8\x3e\x3d\x1d\x8e\x2f\x87\x53\xd8\x61\x83\x8b\x8b\xdb\xe9\x60\x0e\x2f\x73\xdf\x18\xce\xd4\xec\x76\x36\x1f\x8c\xc6\x38\x1b\xae\xbf\xb0\xbf\x47\xd3\x4b\xbf\xc5\x60\xd5\x7e\x18\x8c\xae\x6e\xa7\xad\x75\x37\x9f\xa8\xc9\xcd\x10\x1e\x09\xeb\x4f\xcc\x04\x7e\x62\x76\x92\xc0\xe4\xab\xd1\x07\x35\xbb\xbd\xf8\x44\xd3\xa6\xa2\x8d\xfc\x45\x7d\x1a\xcc\xd4\xfb\xe1\x70\xac\x06\x97\x3f\x8f\x60\x33\xd2\x7b\x26\xb3\xd9\x88\xc6\x64\x42\x4f\xa0\x71\xc4\xd5\xf7\x7d\x1f\xa5\x35\xb6\x85\x09\x2b\x70\xd6\xaa\x33\x91\x17\xd7\x2a\x3a\xf1\x7c\x41\x8b\xfb\x60\x16\x2d\xe4\x00\xb0\xf7\x50\x56\x44\xd4\x06\xb9\x3a\x34\x79\x32\xbb\xd4\x19\x95\x9f\x20\xc3\x2e\xe1\x98\xe9\x08\xc6\x6a\x27\x82\x02\x3b\x5b\xd0\xec\x30\xea\x59\x17\x15\x33\x2c\xa0\x65\x4a\x4f\xd2\x3b\xae\xfc\x28\x2b\xb5\xcc\x2c\x96\x71\x6e\xdd\xf5\x07\x2a\x01\x28\x5b\xb4\x28\x6d\x56\x57\x06\x09\x84\xd1\xf2\x70\xc6\x79\xfa\x90\x66\xa2\xed\x1d\x91\x92\xc8\x33\x63\xc4\x68\x54\xda\x13\x4a\x07\xe2\x81\x08\x95\xca\x4d\xbc\x88\xcf\x55\xe7\xaa\x30\x55\x5d\x48\x7a\x53\x35\x1c\xe3\x8c\x76\x69\xec\x7d\x42\xc5\xa2\x01\xf4\x1f\x81\x59\x73\xc6\x87\x7f\x71\x97\xd9\xd8\xec\xf8\xe9\xe5\x11\xf9\xe4\x24\x58\x03\xe6\xfd\x2e\x10\xf2\x31\x32\x81\xe4\x90\x29\xdf\x41\x2d\xbc\x83\xf2\xc3\xb2\x02\x14\x49\xca\xd2\x2e\x0d\xcd\x2e\xcc\x73\x94\x15\x52\x04\x59\xa5\x97\xf7\x10\x20\xf7\x48\x4e\xeb\xb5\x0f\x63\x59\x67\x34\x72\x0c\x0b\xb0\xa3\x56\x42\x2c\x18\xcb\x4a\xa0\x3e\x5b\x54\x7a\xd0\xf8\x9c\x80\x5e\x89\xd2\x55\xa5\x29\xb2\x17\x0c\x52\xae\x69\xf2\xa6\x3c\x81\xfa\x46\x10\xab\x2c\xf5\xda\xb5\xd8\xb5\xd6\x7f\x79\xc3\x9f\x2d\x2b\x2a\x95\x00\x28\x90\x00\xc9\xa3\x0a\x49\x19\x6b\x38\x82\x45\x45\x91\x49\xc1\xf3\x17\x53\xee\xc2\x93\xe0\x11\x24\x68\x89\xd9\x93\xc0\x90\x66\x54\x6f\x19\x94\x0d\x33\xf4\x77\x57\xce\x34\xb4\xe0\xa3\x61\xb4\x80\x29\x6c\xd6\xb5\x27\x32\x05\xd9\x55\x67\x6d\xf6\x8f\xfe\xec\x46\x11\xbe\xca\x54\x68\xa2\xe7\x2f\x4a\x28\xfb\xa1\xa7\x2e\x8a\xd4\xac\x55\xba\x42\x79\xd4\x1d\x15\x7d\x38\xcb\xb9\xff\x93\x10\xd6\x3f\xbe\x38\x51\x7f\xde\x1b\x5d\xfc\xa4\xfe\x0c\xdf\xb6\x5c\x4a\xf7\xd3\xd1\x9c\xf4\x44\x19\x6e\x11\xcd\xed\x8f\x5e\xf8\x3a\x9a\xd1\xb4\x6a\xa9\x00\x77\x27\x02\x1f\x35\x72\x75\xf9\x7c\xf3\x3b\x61\x07\xa4\x15\x11\xb8\x12\xf5\x00\xc7\x71\x9d\xe7\x49\xdb\x1f\xe9\xb7\xfa\x1b\xba\xe5\xeb\x0f\xee\xed\x36\x70\x22\xb1\x77\x59\x97\x66\x5d\x67\xe8\x3b\xb2\x79\xe5\xce\x7c\x36\xb1\xde\xf9\x3a\x56\xf3\x40\xc9\x10\x0e\x52\x86\xe3\x65\xdd\xb2\x92\x6c\xf1\x0c\x23\x69\x66\x9e\xa9\x4f\x0f\x3a\xc2\xce\x93\x2d\xfb\x47\x5f\x6c\x1d\xad\x52\x0f\x33\x8e\x4f\xaf\xc7\x26\x48\x32\x77\x85\x51\x03\x4f\x2d\xb7\x55\xa2\x4a\x63\xd4\x9f\xef\xab\x6a\xab\x4a\xf5\xe3\xcb\x97\xbb\xdd\xae\x7f\x97\xd7\x7d\x5b\xdc\xbd\x64\x0c\xc6\xcb\x9f\xfa\x47\x83\xac\x04\x8b\x3f\xa2\x0d\xb1\x39\x2b\xb6\x41\x58\x1a\x95\xae\x81\x9c\x3d\x33\xcb\xaa\xb0\x79\xba\x44\xd0\x82\xde\x9a\x42\x6d\x74\x9a\xf5\x8f\x46\x6b\xb9\x15\xd0\x43\x24\xb4\x73\x26\x63\x20\x89\x3f\xa9\x48\x0e\x44\xbb\x91\x28\x98\xe0\x18\x20\xb9\x24\xc6\x7f\x0f\xda\x1e\x78\x56\x94\x44\xe3\x29\x79\x61\x37\x76\x65\x7e\x3c\xfa\x33\xbd\xf2\x27\xf5\x2b\x36\x15\xf2\x08\xc3\x30\x0e\xde\xcf\x26\x57\xb7\xf3\xe1\xd5\x17\xe9\x59\xbc\x83\xd9\xa3\x89\x53\xd5\x7e\x6b\xd4\x7f\x80\x9e\xf8\xee\x05\xad\xd7\xe6\xbe\x0c\xe7\x3d\x1c\xc0\x26\x5b\xda\x0d\xc5\x07\xe3\x6d\x8a\xbb\xd2\x97\x17\x7b\x7f\xfe\x9d\x7c\xcd\xf2\x85\x6c\x00\x8a\xcc\xde\xef\xb7\xb6\xba\x37\x90\xad\x0b\x6a\x78\xdc\x2c\x78\xbd\xff\x32\xad\x32\x96\x40\x8f\x6a\x86\x23\x5a\xd3\x03\x11\x47\x35\x59\x83\x45\xe0\xd3\xca\xe1\xac\xf3\x6f\xde\xc0\x98\x2f\x4c\x70\x2e\xdf\xd1\x35\xfb\xf1\x76\x14\xd8\x7b\x49\x57\x00\xda\x53\x83\xc3\xaf\x7a\x7a\xe1\x76\xe5\xc2\xfe\xd2\x8b\x36\x05\x20\x3c\xef\x0c\x9d\x18\x66\xb3\xcd\xec\xde\x14\x50\x66\x8c\xcf\x60\x4e\x7e\x96\x95\x33\xc5\x09\x60\xa9\x9c\x8b\x99\x41\x54\x59\xe7\xa0\x17\x0f\x0c\x42\x48\x9f\xc5\x8b\x23\x58\x5a\xbd\x90\x41\xf7\xe4\xb9\x6b\x15\x14\x28\x20\x54\x8d\xe9\xec\x78\x77\xa0\x78\xb0\x50\x36\x44\x3b\x09\xaa\x56\xd0\xb1\xad\x82\x5c\xfc\xb3\xf7\xe2\xfc\xf1\x2d\xef\x83\x2e\x88\x30\x93\x4c\x5b\xa8\x11\x5f\x84\xb3\x33\x27\xd0\x39\x29\x1f\x7b\xa5\xac\x50\x9a\x20\x8e\x59\xad\xca\x7a\x51\xd8\xba\x4a\xe1\x72\x23\x32\xb3\x7d\xe0\xad\x85\x12\x4a\xb7\x64\x61\x2c\xf0\xb4\x05\x44\x0f\x36\x24\x4b\xf3\xaf\x58\x0e\x1d\x5e\x48\x59\x9a\x8a\xa2\x80\x64\xde\xd1\xc3\x29\x9e\x84\x9b\x67\xc7\x20\x80\x1d\xe5\xf5\x57\x36\x89\x14\xf7\xaf\x4c\x59\x9a\xe2\x70\x4c\xb9\xac\x8c\x5e\xb5\xf3\x24\xef\xeb\x0a\xab\x5b\x12\xb5\x05\x7e\x74\x40\xae\x1c\x9a\x87\xed\x7d\x9a\xd9\xd2\x6e\xef\xf7\x2f\x77\xf7\xfb\xd3\xdc\x56\xa7\xd9\xdd\x36\xeb\xdf\x57\x9b\xec\xa7\xfe\xd1\xbf\xfd\x2f\xf8\xe9\xbf\xfc\x25\xcd\x4d\xb5\xea\x57\xbf\x54\xbf\xd7\x3b\x5e\xbd\x7a\xf5\xea\xbb\x37\x6f\xdc\x7f\xcf\xbe\x7f\xfb\x4a\xfe\xd7\xfd\xbc\xfe\xfe\xed\xeb\x7f\x3b\x7b\x7d\x7e\x7e\xfe\xea\xd5\xf9\xd9\xdb\xef\xff\xed\xd5\xd9\xf9\xf9\xeb\xd7\xff\xa6\x5e\xfd\x5e\x0d\x92\x3f\xb5\xbb\x49\x94\xfa\xb7\x07\xbd\x4a\x37\x8f\x7c\xee\xa9\xbf\xff\x0f\xfd\x99\x4c\x47\x1f\x47\xe3\xc1\x95\xba\x1a\x5d\x0c\xc7\xb3\xe1\x8f\xc8\xdb\x1a\x18\x70\xcb\xa3\x63\xa0\x8f\xe5\x83\xf2\xec\x87\x1f\xce\xdd\xad\x7f\xa3\x73\x7d\x97\xda\x2a\x2d\xd5\xbc\x4c\x8b\xf4\xce\xfd\x2f\x9c\x56\x14\x00\x3c\xee\xfc\xc4\x09\x23\x32\xe3\x9c\x13\xa0\x5a\x10\xb3\x06\xfa\x75\xe1\x4e\xac\xa2\xe6\x30\xc7\x38\x17\x01\xb3\x30\x3a\x01\xa3\x49\xa1\x8a\x09\x74\xdc\x35\x02\x90\xf2\x76\xa5\x30\x79\xc7\x0d\x81\x11\x65\x7e\xa9\x34\x52\x6f\xa1\x06\x1f\xa7\xbd\x23\x4e\xe6\x94\xab\x82\x36\xf6\x81\x39\x21\xf9\xe3\x81\x1a\xc6\x35\x48\xdc\xee\xcc\x06\x16\x14\x4a\x5a\x2f\x07\x82\xdc\xd2\x3e\xf1\x94\xfe\xd1\x75\x53\x21\x23\x1e\x23\xe6\x61\x0a\x76\xb2\x37\xc6\x17\xfb\x18\x1a\x52\x49\x46\xb7\x20\xdb\xdf\xfe\xe0\x56\x57\xcb\xfb\xe0\xd5\xf9\x6a\x9a\x26\xb6\x24\xf6\x05\x9b\x65\xcc\x3f\x92\x9c\xae\x5b\x25\x8d\xd4\x00\x5b\xed\xbe\x35\xba\xa4\x07\x05\x7a\x0f\xfc\x22\x16\x27\xbe\x0e\x92\xa0\xde\x5a\x69\x3c\xf2\x38\xed\x1b\xf5\x67\xfc\xc7\x4f\xfd\xd6\xff\x9c\xe0\x3b\x89\x65\xb5\xce\xd1\xe3\x5d\x79\x72\xef\xbe\x1a\x80\xc7\x1e\xa4\x47\xb9\x8d\x7a\xbb\xf5\x48\xa8\x8e\xf7\x02\x90\x81\xaa\xa6\xaa\x26\x01\x56\x66\x1e\x4c\x46\x1d\xf1\x9a\xc0\xb0\x18\xf8\x2d\x69\xa9\xea\xad\x27\xd5\xa1\x60\xfa\xba\xf5\xa4\x92\xb5\x04\xe7\x8f\x7f\x0c\x5b\xcd\xf8\xa9\xfb\xb4\x7c\x09\x34\x09\xce\xfe\x5d\xec\xa9\x2b\x88\x34\x6f\x12\xff\x8a\x9c\x9d\xe8\x1a\xb4\x16\x3c\x6a\x5f\xde\x8c\x8c\x9b\x51\xf5\x13\xd4\x7e\x16\xee\x71\x0b\x73\xaf\x1f\xd2\x66\xe3\xc4\x72\xeb\xcb\x43\x03\x35\xbf\x72\xab\x62\x26\x92\x52\xa1\x4d\x08\x51\x82\x3a\xad\x38\xc6\xc3\xa3\xe7\x97\x6e\xe3\x24\xe0\xb0\x83\xdf\xff\x3d\xed\xcc\x8b\x9e\x3f\x1d\x24\xe4\x19\xcb\x2e\x22\x07\xb0\xb1\xd7\x7e\xe4\x1c\xeb\x8f\xea\xbc\x7f\xd6\xff\x53\xff\xfb\xd3\x25\xe0\x4a\xaa\xf8\x80\xfc\xd3\xe9\xf9\xab\x57\x67\x6e\x7c\xa7\x76\xa1\xde\x17\xba\xce\x8f\x66\x50\x75\xe6\xeb\xed\x9b\x4f\xfa\x61\x5b\x98\xb3\x37\x5a\x3c\x87\x1f\x31\xab\xcc\x83\x51\x1f\x8b\x7a\xb1\xf0\xbe\x05\x2a\xb8\x16\xdb\x2a\x54\x54\x39\x87\x4b\x8d\x00\x95\x67\x1e\x24\x53\xad\xdf\xab\x38\xc4\x09\x92\x70\xbb\x29\xc7\x9b\xdf\xed\x34\x66\x42\xa6\x52\x15\xa3\x8e\x7d\xc3\x4f\x12\x3a\x9f\xd1\xd3\x4e\xef\xa4\x53\x8f\xcb\xa2\xfc\xf1\x68\x04\x3e\x84\x01\x2d\x53\x34\x25\xf9\x91\x7c\xcc\xf0\x57\xdc\xa1\x92\xdf\xa9\xbb\x3a\x5d\x99\x2c\xcd\x51\x54\x3e\x70\xe4\x78\xb4\x93\x57\xe1\x73\x26\xdb\x48\xad\x52\x52\xea\x30\xa8\xc8\x0c\x41\xa3\x4c\x97\x95\xa4\x3c\x46\x04\x4d\xba\xea\x1f\xcd\xac\x47\x91\x38\x0b\x32\x18\xae\x35\x25\x15\xcf\xfb\xe3\xfe\xff\x51\xc7\x63\xf5\xd3\xff\x5f\xbd\x3e\x69\xb6\x0e\x31\x24\x90\x04\xa4\x41\xf2\x69\x34\x0f\x4f\x25\x81\x9d\xbe\x1a\x5b\x2e\x17\x1c\x29\xbd\x11\x18\x28\xd7\x91\xf3\xfe\x79\xff\xff\x40\x70\xe8\x1d\x95\xa2\x8a\xfa\x0c\x40\x99\x2c\x21\xd6\xe7\x2c\xea\x75\x8d\xf5\x15\x63\xbd\xe1\xaf\x03\x11\x35\xbd\x49\x9d\xf7\x5f\xf7\x5f\xd1\x57\x9d\x93\x0c\xee\x63\xe9\x81\x45\xf8\x75\xda\x29\xee\xbd\x67\xb0\x45\x71\x7d\xfd\x9f\x03\xe6\x6a\xff\xe5\xca\xed\x34\x77\x58\xad\xfe\xef\xab\x8f\x37\x57\xa7\xaf\xfb\xaf\xfe\x7f\xbf\xad\x35\xf8\xb8\xfd\x77\xf6\xdd\xdb\x37\xdf\x37\xec\xbf\x37\xe7\xaf\xdf\xfc\xcb\xfe\xfb\x23\x7e\xc0\x97\x1a\xce\x66\xc3\x29\xa7\x88\xd4\xcd\xed\xfb\xab\xd1\x05\x1b\x84\x47\x3f\x73\x00\x2f\x51\xe7\x3f\xa8\xbf\xd4\xb9\x01\x74\x60\x23\x5a\xe9\x7e\xf5\x48\x30\x70\x94\x2f\xfb\xd2\xcb\x5a\x97\x6b\xf0\xb0\x7e\x3a\x1a\x72\x18\x3a\x52\x93\x64\x6a\xf9\x86\x31\xd8\xa9\x5a\x97\x96\x1d\xdc\x30\x8b\xba\xc2\x18\x36\xdd\x6d\xb1\xce\x24\x45\x69\x3a\xd0\x1a\x4f\xf9\x95\xec\x5d\x53\x49\x53\x27\xf4\xc2\xae\xbb\x71\x50\x07\x31\x42\x9e\xee\x2c\xc4\x55\x0f\x30\xc5\x65\x69\x19\x94\x34\x9d\x01\xf0\x2a\x62\x3d\xbc\xf4\x45\x58\x9e\xda\x9d\xfe\x33\x28\x91\x17\xf0\xde\x14\x26\xcd\x13\xd5\x93\x7e\xb1\xa4\xb2\xee\x6c\xf9\xa3\xa3\x12\x8a\x56\x7a\x14\xdc\x78\xf2\x79\x8f\x20\xd9\x42\x93\x7b\x73\x88\x16\x43\x70\x20\x26\xdb\x8e\xd0\x68\x87\xe8\x92\x22\x0d\x7f\x9d\x43\xd6\x46\xc8\x54\xbb\xab\x96\xa0\x66\x9f\x29\x72\x04\x25\x6c\xd1\xe8\x8a\xf1\xcb\x55\x4f\x3c\xc1\xd7\x4b\x05\x1e\x56\x34\x5d\xa8\x46\x82\x83\x92\x20\xfb\x2d\x75\x81\xab\xd0\xa7\x0e\xf1\x7f\x01\x75\x95\xd0\xeb\x2b\x8e\x90\xe0\xfc\x42\xa1\x6a\x59\x2f\x3c\xab\xb8\x26\x82\x71\xdf\x81\xe8\x3d\x10\x34\x47\x5d\x53\x2d\xf8\xb2\xa9\xc6\xfb\xc9\x66\x36\x07\x42\xf5\xa2\x81\xa3\xe2\x52\x18\x07\x52\xea\x23\x01\x64\xf7\x21\x0f\x05\xce\x49\xa9\x36\x9a\x06\x6f\x6a\xfa\x0e\xce\x63\x3e\xf3\xc6\x06\xe5\x0e\xc1\xf7\x02\xac\x3c\x9e\xc8\x9d\x26\x90\x36\xbb\x53\xa2\xdc\xb4\x77\x85\x62\xe8\x3f\xcb\xda\xd2\xd0\x37\x90\xe4\xbf\x4e\xf3\x74\xa3\xb3\xce\xaa\x24\x66\x0d\x8f\xdf\x48\x45\x65\x8f\x89\xd8\xb4\x9a\x99\x08\x3b\xc1\xad\xa3\xa6\xac\x3b\xd5\xf8\x0a\x6d\x72\xf9\x46\xac\xf6\x11\x3c\x66\xa9\xf3\x4a\x89\x37\x25\x41\xe1\x04\xb9\x80\xc4\xa0\x27\x9e\x63\xc4\x2f\x2e\x39\x24\x5d\x23\x12\xf7\x4a\x4e\xe0\x85\x5d\x3d\x39\x26\x0d\xd9\x87\x97\xa0\x0b\x10\x77\xb6\xd5\xc4\x98\xf8\x08\x74\xe6\xa1\x9e\xa0\xf2\x39\x6e\x14\x91\x27\x8d\x0b\xd0\x8e\x36\xb8\xfa\xd8\x72\x8a\x9b\xe3\xad\xe1\xe8\x35\x6e\xff\xc5\xe6\x5a\x24\xde\x20\xaa\x03\xa2\xa7\xf5\xc9\x8d\x1d\x32\x87\x95\x3b\x95\x28\x91\xdf\x38\xe7\x6e\xae\x9e\x21\xf7\x15\x71\xb2\x94\xea\x35\xf4\xf5\x4d\x27\xe1\x25\x04\xc6\x41\x12\x63\xe1\x6e\x57\xa8\x33\x7e\xec\xc5\xe7\x9d\x4a\x9d\x91\x44\x27\xa5\xa9\x05\x59\x56\xc8\x35\xf9\x93\x4a\xe7\x48\x72\x8c\xa6\xbd\xf4\x89\x12\xa5\x59\x61\x65\x1f\x1d\xd2\x4c\x1e\x0f\x00\x33\x37\x83\x54\xd1\x57\x6f\xd1\xc7\x02\x5e\xc2\x68\x35\xb1\x7e\x3f\x91\x10\xf1\x43\x8f\xe5\x39\x8e\x70\x82\xe2\x0e\x09\xeb\xb6\xba\x2c\x25\xd7\xb4\xff\x0e\x94\xc5\x3c\xd8\xaf\x4c\x78\x9e\xcb\xc8\x75\x4c\x41\x1b\x39\xa5\x74\xe0\x08\x46\xd1\x2e\x56\x81\xb6\xcc\x1a\xa4\xaf\xb4\xba\xb3\x76\xa5\xd6\xda\x1d\x4f\x48\xb9\xd0\xe0\xd7\xf7\x54\x70\xc0\x90\xdf\xec\xbf\x60\xaa\x43\xec\x2f\x64\x9c\xe3\x51\x4c\xe2\x7e\x96\x95\x73\xc0\x49\x24\x87\xb2\x0f\xa4\x35\x25\x48\x30\x02\x05\x61\xe9\x63\x64\xcc\xf2\x4b\xfc\x86\x90\x2a\x95\x84\xa6\x21\x9e\xe3\x33\x16\x70\xec\xe6\x41\xf7\xed\x20\x9d\x6d\x53\xcc\xb6\x41\xbb\x4c\x3c\x50\xac\xe5\x3d\xc1\x03\xc2\x9d\x25\xce\x4e\x14\xe9\x8b\x6b\xaf\xd8\xee\xb6\x2f\x9f\xfe\x9f\x8c\x76\x4d\xfb\x90\x66\xc4\x46\x34\x6f\x9c\x32\x9e\x8e\x2e\x1e\xde\x0d\x08\x67\x78\x03\x4e\xe8\xc1\x23\x0f\xd7\x3d\x3e\x17\x01\x07\xcc\xcf\x2d\x18\x97\xfd\x25\xd5\xd8\xcd\x50\x45\x1c\x69\xe6\xe0\xd0\x71\x56\x9d\x61\x8e\x40\xe9\x1e\x2d\x1d\x4f\xe8\x21\x9a\x25\xf4\xda\xc9\x28\x00\xa4\x0f\xda\xc4\x79\xbd\x31\x05\x4a\xc8\xe9\x42\x6f\x4c\x05\xaa\xd2\xb0\xbb\xca\xaa\xa8\x97\xe0\xb1\x66\x7a\x6f\xeb\x8a\x48\x32\x97\x48\x13\x42\x4c\xa3\x1b\xd4\xc1\x5f\x16\xb6\x74\x4b\x11\x30\x0b\xbc\xc2\xa8\x90\xc1\x6c\xb6\xc8\xac\x7e\x0c\x7a\x5f\x85\x5a\x9b\x1d\xc0\x49\x73\x0c\x87\x66\x26\xbf\xab\xee\x4f\x3c\x15\x15\x94\x43\xd0\x08\xf9\xc8\x9f\xd8\x3f\x1f\xd3\x07\xd3\x52\xac\xc5\xa5\x14\x04\x8a\x3b\x44\xc8\x7c\xa4\x56\x58\x31\x60\xc1\xa6\x39\xc1\x19\xda\x1f\xe1\xe8\x30\x38\xf9\x85\x39\x24\x09\x27\xf4\xfb\x06\x04\x12\x6a\x0b\x1f\x75\x88\xa0\xd1\x46\x08\x05\x1f\x4d\xb7\x23\x28\x71\x8b\xdb\xe2\x80\xe0\x63\x7c\x3f\x1d\x5e\x32\xb4\x50\x2a\xfd\x15\x68\xa9\xef\xa0\x06\x29\x89\x90\x30\x54\x33\xc4\xcc\x2d\x9d\x44\x0e\x4d\x7b\x82\x87\x8c\x4a\xcc\x42\xe4\xa5\x61\x15\xe7\x2b\x55\x18\x60\xe7\x57\xc6\x39\x53\x26\x90\x95\xac\xcc\xa2\xbe\x03\xff\x0a\x09\x7e\xe3\x5b\x81\x6b\x78\x9c\x05\xb6\xb2\x38\xd7\xbf\xd1\x32\x69\xdb\x42\x7f\xf4\x42\x69\x58\x9c\xbf\x76\xa9\x20\x07\xf3\x87\x0e\xf3\x09\x25\x6d\x91\xca\xb9\x9d\x29\x28\xd5\x0a\x8b\x91\x51\x50\x46\x98\x4c\x26\x8e\x9e\xf1\x38\xb2\x91\xe5\xfb\xbf\xb1\x68\xf0\x94\x4c\x9d\x57\x82\xd6\xf2\xce\x00\x2d\x14\xa0\xb4\x21\x69\xbf\x34\x2c\x8b\x16\xf8\x95\x8b\x50\x94\x22\x0b\x28\x9f\xdd\xe5\xd5\x89\xba\xb4\x42\x3e\xb4\xbd\x1e\x9c\x5f\x1b\x29\x92\x3d\x66\x93\x3f\xcd\x68\xd0\xcd\xa9\xd0\xb4\x63\x83\x3e\x03\x85\x98\x31\x94\x2d\x2b\x59\x45\x1d\x1a\x86\x2a\x92\x68\x4c\x0a\xc3\x25\x53\x60\x8f\x42\x1d\x55\xc3\xe6\xe4\xb5\xd2\xa5\xe0\xd3\x36\xc6\x95\x50\x3f\x17\xdf\x69\x38\x12\x4c\x54\x8c\x2c\x05\x21\x94\x2a\x6c\xc3\xef\x9a\x93\xb4\x8e\x38\x7b\x3b\x75\x83\xc2\x5c\x9c\x9d\x40\x49\x9a\x0e\xe3\x52\xde\xeb\x02\x8a\x39\x71\x39\x6d\xcc\xf2\x5e\xe7\x69\xb9\x81\xe7\xb2\xb3\xd7\xf6\xee\x06\xe1\x09\xe1\x2b\x69\x09\x6b\x01\x46\xf5\xd8\x19\x5c\xce\x00\xd4\x15\x10\x04\x42\x25\x51\xa7\x49\xea\x19\x7a\xb8\x56\x88\xbc\x19\x37\x17\x08\x43\xd9\xd6\x95\x1b\x0e\x30\xe8\x03\x2d\xe8\x4e\xd8\x4b\x24\x84\x96\xed\x9f\x9e\x15\x7c\x67\xa8\xb8\x26\x9f\xf9\x14\x0e\x85\x0a\xd2\x1e\xa2\xbb\x5d\x0e\x95\x01\xb2\xf5\x47\x65\x63\xd0\x21\x91\x82\x97\x14\x26\x96\x05\xb0\x92\x6e\x31\x08\xc7\x2c\xef\x23\x34\x4a\xcc\xf2\xd8\x9c\x7d\x21\xac\xd9\xa1\x58\xd1\x7a\x98\x33\x43\x18\xfd\x72\x48\xd1\xea\xf0\xd8\xc5\xe7\x9a\x8c\x10\xf0\x76\xa1\x18\x01\x6e\x18\x3e\x67\x7e\xf5\x9e\xe9\xab\x63\xf2\x68\x20\x14\x83\xfe\xd9\x9b\xd5\x2b\xdc\xaa\x07\xa5\x5c\x80\x9d\x44\x47\x87\xfc\xa3\x87\x4e\x5b\xc0\xb0\x79\x9e\xf8\xa2\xdc\xa8\x1d\x67\x92\x1d\x5a\x68\xa8\x1e\x6c\xd8\xef\xb4\xbb\x4f\xdc\xb2\x7c\x2b\x4c\x15\xef\xf2\x46\xe6\x0a\xca\x56\xf0\x3e\x0f\x4a\x9a\x42\x53\x05\x7d\xd8\xae\x78\x95\x2a\x53\x54\x52\x85\xff\xc2\xf1\x4a\x55\x9e\xfc\x40\xb6\x67\xa4\x98\xfa\x63\x2f\x73\x66\xce\x40\x82\x88\xc0\xc6\xf5\xaa\xe8\x07\x04\x80\x29\x3c\xeb\x6d\x75\x1d\xaa\x4c\xf9\x65\x8f\x99\xec\x81\x60\xf3\x29\x5b\x37\x36\x12\x5a\x2f\xe9\xb0\x13\x50\xe2\xf5\xd0\x00\x26\xaa\xce\x63\xad\xf7\x50\xd7\xdb\x1e\xa6\xa4\x2d\xe0\x75\xe0\x4a\x14\x76\xcd\x23\x76\x57\x67\x1f\x82\xda\x0c\xf8\x93\x22\xf8\xd7\xdd\x01\x3c\x24\xb6\x99\xf6\xd2\x8e\x4d\x56\x72\x1e\x33\x24\x8f\xf7\x2f\x0c\xd9\x71\x31\x4a\xac\xae\xde\x5d\xf2\xfa\x8c\x58\xf5\xef\x52\x0b\xfb\x78\xce\xe0\x7f\x67\x49\xac\xbf\x86\x5b\xc2\x07\xbf\xae\x4a\xf6\xf1\x31\xfc\x83\x8b\x65\x03\xca\xfd\xb7\xaf\x96\x7d\x64\xe0\xbe\xa9\x80\xf6\x89\x94\xcc\x23\x75\xb4\xcf\x1e\xf5\x5f\x5f\x70\xfb\x2d\xab\xa3\xa3\x06\x17\xef\x84\x47\xaa\x70\x1f\x6f\xb7\xa8\x52\xfa\xf6\x62\x5c\x31\x50\x94\x91\x84\x8a\xdc\x86\xf8\xe7\x1a\xf9\xb1\x9e\x2a\xcb\xf5\x29\x94\x7f\x76\x9a\xf7\xe0\x4f\xff\xe5\x6c\x34\x9b\x5d\xfd\x9e\xf0\xcf\x27\xf2\xff\xaf\xdf\x9c\xbf\x69\xe2\x3f\xcf\xbe\xfb\x17\xfe\xf3\x8f\xf9\x99\xd5\xce\xdc\x04\x51\xde\xbd\x9a\x55\x3a\x5f\xe9\x62\x55\xb2\x95\xcb\x3b\xea\xd4\x7b\xa4\x67\xfd\x33\xcc\x7e\xbc\x52\x97\xc3\x0f\xa3\x31\x55\xc6\x91\xa3\xd8\x3f\x83\xec\x20\xc9\xfd\x3a\xaf\x91\x99\xeb\x22\x1c\xa4\xe4\xc9\x61\xa9\x3f\xb7\x5d\x26\x0c\x55\x02\x7f\x3c\xa2\xfa\x89\xa8\xaf\xfa\xfe\x7d\xe7\xee\x7d\x81\x06\x93\xf3\x7a\x22\xfd\x24\x99\x33\xe8\x04\x89\x5e\x13\xc2\x03\x31\xac\x12\x52\x88\x0b\x61\xf0\x50\x4a\x52\xbc\x2e\x34\xe3\xb5\xea\x0d\x43\x15\xcc\xa5\xec\xeb\x35\x3b\xba\xdc\x28\x2d\x7c\x5f\x12\x32\x27\xe2\xc4\xad\x28\x69\xf2\x88\x36\x2a\x1f\x24\x7d\x1e\x10\xb4\x24\x92\x1b\x70\xdc\xc2\x5b\x99\x0b\x1c\xf8\xbf\x74\xa5\x43\xeb\xde\xa8\xde\x10\xfc\x34\x37\x98\xdc\x8c\x78\xac\x09\x69\x2a\xd4\xdb\x21\xdd\x42\xcb\x00\xdc\x19\xff\xb8\xb7\xaa\x37\x02\x1a\xe5\x4c\x5d\x62\xe3\x4c\x21\x47\x3c\xcd\x81\x43\xbc\x46\x6e\x01\xa2\xfa\x66\xea\x3f\xd6\x54\x74\x1e\x4f\xe3\x19\xdc\x75\xf1\x52\xb6\x47\xbd\xd3\xbb\xd8\xab\xe1\x2f\xc0\xef\xa6\x06\xa1\x45\xdf\xa9\xde\x95\x2e\xee\x4c\x41\x19\x69\x1e\x68\x24\x53\x81\x3c\x31\xd9\x95\xcd\x7e\xcb\x4c\xab\xeb\xb6\xb1\x6b\x26\x07\xc3\xb7\x3f\x26\x4a\xd4\x36\xa8\xcf\xfa\xdf\xab\x9e\x07\x55\xf0\x90\xa4\x65\x2b\x06\x76\xd6\xff\x13\x7f\x50\x4e\xca\xbd\xf6\x44\x80\x31\x59\xae\xd7\x96\xdc\xe8\x5f\xd2\x4d\xbd\x61\x8f\x9d\xeb\x43\x05\x73\x31\x69\xe6\xa5\x81\x69\x30\xa5\x91\x46\x62\x3f\xa2\x82\x07\x5a\x26\x20\x9a\xf0\x64\xc6\xc0\xde\xe0\x1c\xaa\x2c\x6b\xd0\xde\x79\xc7\x02\xe1\x23\xa1\x17\x3f\xa8\x5e\xb4\x6d\x7a\x42\x43\x9b\xb3\x43\x44\xcb\xb8\x32\x99\xc1\xbb\x93\x73\xb1\xc4\x48\xbf\x34\x28\x0d\xc4\xf9\x0b\xbb\x66\x7b\xac\x7d\x26\x30\xbc\x93\x09\xd8\xa3\x97\xf7\xd5\x20\xfa\x85\x4a\x4b\x11\x51\x1c\x90\x92\xcf\x53\xad\x92\x34\xbb\x1a\xb3\x41\x42\x40\xaf\xbd\x7c\xba\x9b\x12\xde\xfb\x1e\xdf\xeb\x6c\xf1\x90\x5a\x0a\x4a\x5b\x42\x21\xac\xb3\xbb\x8f\x3f\xff\xac\x7f\xf6\x4a\xf5\xa2\x2f\xf1\x14\xc8\x6d\x04\x1c\x7d\x1c\x11\xe3\x93\x05\xd3\x1c\xff\x1f\x7b\x7f\xd7\xdc\x46\x92\xee\x89\xe1\xff\x6b\x7e\x8a\x5c\x46\xfc\x83\x64\xb8\x08\x89\x94\xba\x7b\x5a\xda\xd8\x30\x44\x82\x12\xfa\x40\x00\x17\x00\x5b\xc3\x75\x38\x66\x13\xa8\x04\x59\xad\x42\x25\xba\xb2\x8a\x6c\xcc\x27\xf0\xdc\xda\x5f\xe0\xdc\xf9\xe8\x38\x62\xaf\x7c\xe3\xf0\xdd\x2a\xf6\x7b\x39\xf2\x79\xc9\x97\xaa\x02\x49\xf5\x74\xf7\x8e\x8f\xc5\x8b\x19\x35\x59\x95\x95\xaf\x4f\x3e\xaf\xbf\x1f\xa7\x9f\xa4\xca\x2c\xcb\x6c\xe1\x25\xd0\x53\x8f\xa1\x3d\xcf\x51\x07\x82\xbe\x9d\x88\x7d\x84\x25\x17\x67\x04\xcf\xed\xb7\x47\x08\x9a\x7c\x68\x8e\x12\x51\xe8\x7b\x8f\xd3\xdd\x05\xb6\xed\xb3\x02\x38\x14\xee\x8b\xe0\x13\xa2\x6c\x27\xc6\x76\x43\xb1\x50\xb9\x01\x3e\xaa\xda\x38\x70\x66\x92\x74\xf4\x75\x7f\x04\xed\x98\xe0\x80\x84\x72\xfd\xe4\x54\xec\x07\xf3\x10\x4a\xb9\x0d\x78\xc8\xcb\x86\xa5\x1a\x2f\x1f\x32\x66\xc2\xf5\xb6\x6e\xe6\xec\x67\x55\x94\xe6\x80\x3c\xd6\x40\x64\x9c\xf9\xed\xc1\xb4\x02\x76\xdf\x1a\xa3\x21\xbd\x36\x0d\x52\x76\x3c\xe8\x76\xc0\x06\x66\xd7\x71\x53\x51\x10\x84\xca\x35\x4b\x9d\x87\xf8\x82\x84\x4b\x18\xb8\x9c\x30\x5c\xea\xaf\x89\x60\x0e\x5e\x88\x7d\xa7\x18\x84\x33\x60\x9c\xb6\x10\x08\xf7\xac\x70\x3b\xe3\x4d\xd0\xc6\x4b\xb1\x7f\xad\xeb\x7d\x00\x52\xb4\xff\x2a\xf7\x8f\xdc\x56\x68\x5c\x18\x92\xd1\x09\xf0\xe2\x20\x5c\x4e\x3b\x49\x21\x8b\x0f\x7b\x75\xd6\x1b\x04\x53\x46\xef\x88\x17\x5c\x2c\xa6\x93\x06\x98\x3d\xd4\xf9\x47\x86\x45\x2b\x5c\x9d\x19\x53\x3b\x1f\x0a\xa7\x75\x7c\xdb\x3b\xc1\xca\xbf\xa0\x73\xe0\x73\xb1\xa3\x39\x38\xf0\x40\xe7\x90\x51\x8e\x5d\xe7\x9b\x07\xa6\xdf\x6e\x3d\x13\xc3\xcf\x33\x22\x29\xd5\x7c\xea\xf5\x5a\x17\x6e\xb5\x60\x40\xd7\xba\xfe\x02\xb8\xf5\x83\x03\x9a\xd3\x43\x79\x44\x41\xbf\x7b\x3b\x53\x18\xc1\x41\x68\x5c\xfc\x37\x5c\x27\x1e\x80\x99\x42\x3c\xa8\x99\xad\x65\x21\x6f\x9c\x75\x04\x0e\x33\x1c\x8f\xbf\x63\x16\x5b\x47\xde\x18\xe9\x72\x0e\x04\xd3\x1e\xe3\xd2\xdc\x66\x1b\xdb\x04\xd4\x07\x82\x3a\xb1\xca\x56\xd5\xd6\xda\x54\x4b\x00\x07\xff\xe6\xf9\xff\xff\xc8\x85\x7e\xeb\xca\x81\xd7\x41\x74\x01\x1c\x16\x08\xe3\x0c\xba\x64\xd4\x64\xd0\x2b\x4a\x73\x79\x2e\x66\x93\xab\xe9\xd9\x40\x9c\x4d\xce\x07\x2e\x77\x15\xf7\xdf\x69\xef\x04\x7c\x3e\x6d\x8d\xe3\x2d\xdc\x88\xdd\x7f\xb3\x12\x88\x65\x82\x41\xaa\x17\x44\x8c\x3f\x6e\x43\xc6\x27\x31\xb4\xbc\x07\x5d\x8e\xa9\x63\x1c\xf8\xa9\x3d\xc1\x80\x5b\x68\xf7\x3c\x46\x21\xaa\x2d\x89\xa8\xe0\xca\x3a\x74\xf9\x27\xdd\x2f\xd0\x81\x08\x13\x64\x3c\x88\xba\x63\x19\x3d\x6a\x48\xb9\xf6\x50\xb9\x00\x8b\x73\xa8\x1c\xac\x70\xc2\x31\xc8\x84\xb3\x4a\x92\x00\xaf\xbf\x5d\xaa\xd5\x14\x80\x87\x1d\xfa\x15\x31\x8a\xea\xd2\x49\xf1\xf7\x8d\x7c\x22\xf4\xb6\x49\x9f\x7d\x21\x45\xa0\xde\x01\xb0\x43\x30\x47\x2e\x57\x85\x08\x30\xe8\xaa\x89\xc9\x18\x50\x75\x0a\x58\x16\x42\x92\x05\xbd\x6a\x9a\x04\x0e\xc1\x1f\xdc\x49\xd6\x14\x48\x18\x78\x19\xe1\xea\x19\xd6\x1f\x02\x29\x0d\x68\x7f\xea\xbf\xb7\x70\xec\x1c\x6a\x8f\x9d\xfd\x84\x29\x0a\xd4\x87\xc3\x25\x9e\xe5\x16\xed\x1f\x97\xa6\xb1\x84\x3a\xed\x9d\xd8\xfd\xc2\x81\x2e\x7b\xc3\xbb\x24\x01\x76\xcb\xa6\xb2\xea\xda\xea\x58\x52\xe5\x57\xb2\xa9\x25\x3f\xd1\x9d\x6c\x7b\x9b\x1e\xb5\xb0\x28\xc3\x0e\xda\x8e\x2d\xf4\x1d\x1c\x98\x0e\x18\x68\x1a\xdb\x2b\x71\x72\x44\x41\x0c\xce\x04\xb9\x06\x24\x95\x5c\x55\x01\xa7\x53\xd4\xc9\xd7\xe2\xf4\xc8\xd1\x4f\xee\x7c\x46\x97\xe2\x05\x36\x1d\x62\xcd\x1a\x94\x85\x76\xa7\xbc\x12\xd9\x51\x90\x12\xb6\xdc\x6d\x38\x82\x3c\xa5\x87\x1f\x33\x32\xc3\xf8\x46\x58\x66\x97\xaa\x3b\x8c\xbd\x7b\x4d\x60\x51\x57\xcd\xac\x9f\xb6\xe6\xf7\xc2\x9a\xdf\xc3\xd9\x7c\x3a\x7c\x73\x65\x0d\x70\x31\x79\x33\x1a\xbe\xed\x87\xb6\xf8\x8b\xde\x49\x9c\xf2\xbc\x8a\xf8\xc0\x22\xf5\x2e\xb8\x09\xe3\x6e\xb7\x4b\x09\x31\x6c\xf8\xc8\x86\x78\xd2\x35\x4b\x55\x2d\x1d\x17\x2d\x1e\xab\x6b\x0e\x93\x71\x66\x43\x18\x39\x69\xf2\x80\x03\x98\x4d\x14\x59\x09\xc7\x07\x9b\xc7\x8d\x21\xc6\xe4\xc6\xd3\x4b\x94\x3b\xe4\x29\xa5\x41\xa1\xa6\xd8\x35\x51\xe8\xba\xcc\x2b\x85\x04\xd2\x9c\x79\x83\x7a\x51\x90\xee\xb6\x6b\xec\x64\xbd\x7b\x08\xf5\x03\xc7\x0a\xa8\x4a\x05\x13\xd2\x43\x44\xa1\x90\xb2\xc0\xde\x7e\x21\x4b\x6c\x87\xe7\xa3\x09\x70\x5e\x6f\x74\x81\x0d\x01\x74\x4d\x40\x45\xe6\x51\x42\x68\xe6\x71\x5b\xc4\x4e\x10\xd4\x60\xec\x74\x51\x95\x12\x2c\x08\x6a\x5d\x5e\xe5\x8a\xa0\x51\x8d\x02\x10\x0f\x16\xba\xde\xa5\xb4\xd0\x29\x20\x3c\x11\xea\x94\x2e\x94\xb8\xad\x8b\x14\x42\xd9\xf7\xaa\xa8\xb6\xe2\xf0\xe4\xf4\xf9\x11\x32\x3d\x2e\x80\xae\x4e\x20\xfa\x43\xb6\xd9\x35\xdc\x1e\x93\x9d\x60\x3e\xa5\xcb\xf3\x89\x47\x41\xf9\x51\x6b\xa5\x2a\x26\xff\xf5\x1d\x4e\xf0\x6a\x67\xa8\x61\x0e\xfd\x30\x51\x45\x86\x98\x34\xf6\xa0\xca\xd8\x4e\xf4\x23\xdb\x94\xba\xd2\x4b\x9d\x07\xd8\xb4\xf0\x54\xb6\xa6\xb2\x0e\x77\x02\x61\x25\xe2\xce\x21\x2e\x90\x4f\xb7\x79\xd2\x4b\x56\xcd\xb2\xb2\xa7\xe3\x4f\x59\xe4\xb5\x11\x78\x67\x13\x8c\x2e\x66\xa9\x16\x14\x06\xf5\x63\xc2\x2c\xaf\x5d\x3d\x68\xf5\x38\xf2\xcb\xe5\x79\x83\xd2\xce\xcb\x06\x08\xdb\x51\xbc\xc5\xc4\x39\x41\xc0\x7d\xe2\x10\x9b\xed\xdc\x2f\xa4\xc9\x8c\xc7\xf7\xcf\xac\x7e\x73\xf8\x82\xf7\x03\x4f\x03\xde\x54\xcb\xda\x54\x7a\xad\xe2\x13\xd1\x9e\x8b\x9e\x13\x85\xa7\x9e\xd0\x92\x78\xf2\x7b\x5e\xbe\xa4\x35\x4a\x49\x54\x60\x1c\x93\x72\x60\xe1\xda\x5d\xeb\x80\xa4\xda\xf2\x05\x62\x3b\xbe\xc6\xc8\x61\x76\xc1\x76\xa2\x2d\xe7\x9b\x8d\x08\x5f\xa3\xa5\xb2\xad\xa7\x08\x55\x9c\xd9\x93\xc4\x1e\x11\xca\x60\x6e\x09\xc4\x56\xc3\xb9\x26\x61\xef\x79\x77\x3c\xe9\x34\x2a\xf9\xba\xdc\x1e\x51\x14\x56\x62\xe2\x92\x43\xab\xce\xb3\x8f\x0a\x53\x42\x72\xad\x3f\xa2\xc4\xc1\x70\x39\xb1\xab\xda\x61\x7a\x59\x90\x46\x34\x09\xe1\xc4\x1f\x9a\x23\x27\x62\x65\x9a\xe2\xca\x20\x08\x96\x81\x4c\x37\x7f\x8e\xc9\xab\x45\x83\x88\x7c\x10\xde\xcf\xe7\x47\x8e\xd9\x84\xc1\x7a\xc5\x3c\xa3\x70\x52\x5b\xc8\x00\xcd\xdb\x00\x47\x8f\x0a\x05\x7e\xaf\x4b\x10\x5b\x0d\xce\x99\x1c\xf4\xbb\x52\xe5\xc4\xd6\xae\x9d\x16\x85\x1b\xe0\x3a\x0e\xb7\x55\x1a\xef\x15\x0f\x60\x4d\x04\x3c\x62\xa5\x28\xab\x8c\x4b\x8c\xb1\xfc\x4b\x97\xe0\x0e\x00\x8e\x7f\x84\xb5\xf3\x40\x76\x21\xde\x6a\xa5\xa3\x59\x8f\x39\x38\x60\x9e\x5b\xe9\x37\x69\x48\x56\xca\xfd\x04\x04\x37\xbc\xcb\xf9\x82\xd0\xf7\x05\x14\x6b\xe7\xab\xa8\x44\x04\x7f\xc5\xcd\xb5\x74\xc7\x60\x71\x18\xc2\x89\xc1\xfe\x72\x6b\xd1\x28\xe9\x2a\xb0\x48\xec\xfc\x9a\x81\x43\x92\x18\xc0\x08\x81\x36\x0f\x12\x3b\x07\xd2\x4a\xd6\x14\xc8\x5a\x73\x72\x9c\x9a\x5c\x6d\x77\xf8\x9a\xb9\x50\x3c\x04\x1f\x84\x5a\x6e\x67\x2e\xb4\xdf\x69\xc0\xd7\x3e\x7d\x20\x28\x03\xaf\x81\x90\x79\xa5\x4a\x2f\x97\x5e\xc4\xb1\x02\xbd\x0a\x3c\x30\xbe\x4a\xc3\xaf\x9a\xb7\xb5\x5a\xee\xfb\xe0\x45\x3b\x27\xbe\xf6\x68\xed\x32\xca\xaa\x0e\xc2\x22\x87\x3f\xf9\x82\xca\x85\xad\xb0\xf4\xd4\xc4\x6b\xc5\x84\x42\xb2\xea\x8a\x9b\x64\x28\x11\xbc\x8a\x46\x27\xd9\x54\x74\x50\xf8\x46\xde\xa1\x6e\xb6\x35\xe5\x2c\xbc\x60\x1e\x33\x3c\x40\x65\xa1\x4f\xc2\x1e\x24\x42\x8a\x4d\xb6\xac\x91\xd4\xa0\x89\xa5\x11\x88\xcb\x68\xce\xb4\x93\xc5\x1c\x6f\x4e\xf0\xb8\xab\xb4\x21\x52\xc0\x2c\xc9\x21\x0d\x00\x40\xcc\x02\x25\xe9\x21\x79\x12\xca\x8e\xd6\xa8\x3b\x97\xd8\x3e\xd5\xbd\xaa\x61\x48\x7c\xd7\xa1\xef\x14\x60\x44\x96\xe1\xaf\x61\x7a\x9f\x53\x9d\x70\x28\x94\xa7\x8e\xd4\x23\x30\xef\x1e\x20\x9a\xd4\x9f\xdd\xd5\x30\xcc\x89\x0b\xe8\x65\x4d\x6d\x73\xe7\x3a\xd2\xcd\xf2\x65\xa3\xe7\xd1\xf8\xde\xf1\xb8\x9e\x24\x93\xaa\x40\xd7\xc7\x81\x53\x2e\x4d\x6b\x8c\x30\xa0\x6e\xf9\x03\xe0\xaa\x3b\x04\x46\xef\xbf\x97\x64\x72\xb2\x76\xa7\xe0\x79\x19\x7a\x54\x02\x09\x43\x6a\x7e\xe4\x70\x89\xab\x39\x77\xda\xb5\x5f\x16\x31\xeb\xf2\x1d\x85\xdf\x84\x11\x51\xb6\x20\x91\xe4\x80\xb2\xcf\x09\x7c\xd2\xee\xbc\x78\x99\x0d\x33\xc8\x3f\x44\xca\x06\x4b\xb9\xaa\xf3\x55\x06\x4e\x58\xd6\x0f\xda\x01\x8c\x97\xbd\xe7\x31\xc8\xf1\xd9\xe4\xfd\xe5\xe8\x5a\x9c\x5f\x01\xdc\xf2\x6c\xde\x9f\x5f\x21\x3a\xf1\x74\xf0\xf6\x6a\x04\xb6\x37\x65\xc0\xa0\x2a\x08\xf6\xa4\x47\x44\xb9\x66\xbe\x92\xc0\x76\xf2\xbc\x47\xbb\x18\x2c\x80\xc6\xd7\x6c\xc8\x85\x88\xf4\x61\x65\xe8\xe7\x8e\x97\x83\xb4\x47\x2b\x7d\xeb\x4a\x25\xe2\xa7\x3a\x25\xef\x29\x52\xd5\x80\xad\x7a\x53\xe7\x5c\x6f\x17\x68\x95\xaf\xc0\xdb\x18\x76\x6f\x77\xbf\x1e\x8e\x45\xbe\x76\x3e\x28\x27\x0f\xd1\x81\xc5\xb1\x1a\xe3\x42\xee\xe4\xdf\x51\x5b\x21\xc1\x2a\xa4\xd4\x38\x7c\x6f\xe3\x13\x73\x81\xc8\xd4\x0b\x72\xd8\x2c\x83\xb7\xfd\x11\xe9\xcc\xa1\xda\xe8\xea\x30\x7b\xa7\xf0\x99\xd6\xfb\xce\x6c\x0d\x53\x12\x4c\xa7\x5a\x8f\x05\x9e\x8d\x24\x69\x26\x18\xa3\x1c\x5c\x9c\xea\x78\x66\x13\x36\xb0\xda\xc3\x30\xf5\x6a\x95\x2d\x33\x0c\xbd\x62\xc6\x1e\x6d\x43\x19\xf0\x9a\xeb\x95\x00\x48\x66\x48\xa2\xfd\x98\xe5\x39\x15\x4f\xb2\xd5\x05\x92\x0f\x1c\x6c\x4c\xaa\xf6\x4d\xef\x39\x03\x94\xa3\x43\xe8\x42\xcc\xdf\x0d\x67\xa1\x27\x7c\xde\xaa\xc9\xc3\xd4\x39\x5c\x04\x1d\x14\x54\x77\x38\xc3\xed\x79\x04\xc4\x5e\xaa\xa4\xee\x32\x93\x48\xd7\xe5\x6b\xb3\x61\x35\x7a\xd7\x40\xb4\x4a\x27\x94\xd3\xf9\x5c\xfc\x38\x98\xce\x86\x93\xf1\x8c\x01\xb5\x63\x27\xfe\xb7\xbd\x13\x80\x57\xf6\x5a\xd1\xac\xfe\xe2\x6c\xcd\x07\x72\x32\xa3\x74\x48\x4e\xc7\x7c\x5a\x4e\xa4\xeb\xe1\xa9\x18\x90\x73\x63\xd5\xe8\xeb\xc4\x5e\x82\xf1\x59\xb5\x53\x0a\x3a\x96\xcf\xb0\xe3\x0b\xed\xa1\x0a\x78\xba\x74\x9d\x7d\x95\xdf\x63\x85\x90\xa7\xb9\xa9\x8d\xda\x89\xef\xeb\x73\xd4\x7a\x41\x13\x46\x07\x86\x8b\x7d\x1d\xb6\xef\xa3\x3e\x60\xbc\x66\x38\x95\x60\x47\x57\xe3\x04\xc2\x59\x5d\x00\x1d\x17\x18\x31\x41\x9e\x49\x5d\xc0\x7c\x44\x89\x0f\x54\x91\x1c\x24\x6d\x46\x75\xa4\x6d\x91\xfd\x1d\x7a\x45\xcf\x46\xfd\xe1\xfb\xc1\xd4\x6e\x23\x06\x6c\xb5\x7f\x75\x48\x77\x10\x21\x1a\x3a\x3e\x86\x73\x71\x35\x3e\x1f\x4c\xa3\xe3\x22\x26\x63\xd1\x1f\x3b\x76\x86\x37\xfd\xd9\x70\x96\xfc\x46\x24\x0d\xdc\x0a\x20\xe2\xc3\x61\x4d\x42\x62\x86\xf9\xbb\xfe\x1c\xb6\x7f\xab\xbf\x17\xd3\x01\x80\xda\x23\x35\xc2\x2c\x09\xa0\x89\x47\x83\x44\x5c\x0c\xe7\x3b\x11\x89\x6d\x5f\xc6\x93\xf1\xf1\x70\x7c\x31\x1d\x8e\xdf\x0e\xc7\x6f\xff\x0e\x22\x87\x56\xc7\x5a\x74\x0e\x00\xad\x1f\x3d\xd5\x20\x75\x10\xc3\x31\x3c\x34\x1d\xcc\x2e\x07\x67\x73\xe4\x78\x38\x1c\x4f\x70\xe4\x90\x55\xd6\x1f\x89\xf3\xc1\x8f\x83\xd1\xe4\x72\x30\x3d\xea\xe4\x7f\x18\x5f\x7f\x01\xff\x03\x2e\x6f\xf7\xee\x00\xf2\x83\xf9\xd0\xde\xe7\x33\xbb\xec\x76\xf9\x90\x07\xc1\xce\x64\x53\x94\xf6\xc4\x18\x19\x0f\xa8\x0f\xad\xe9\xe8\x5f\xcd\xdf\x4d\xa6\xc3\xff\x34\x38\x17\xef\x06\xd3\x01\xee\x2e\xe2\x13\x09\xb6\x9a\xef\x0b\x6c\xde\x3f\xf5\x9e\x03\xe8\xfc\x70\xec\x54\x09\xf8\xed\x49\x43\x6e\xd3\xcd\xd9\xe0\xbe\x77\x6e\x63\x14\x5d\x84\xb1\x5c\xa9\x06\x87\x27\x99\x6b\x2b\xca\x13\x8f\x6e\x7b\x38\x62\x98\xdf\x83\x98\xb5\xfc\x90\x55\xab\x40\x20\x2c\x4a\xf0\x82\x91\x8f\xee\xc5\x73\xe7\x9a\x5b\xa8\xa5\x06\xc8\x2a\x89\x81\x0d\x14\x00\xf8\x78\x4f\xf4\xf3\x3c\x22\xf9\xee\x32\x80\xe8\xf2\xb1\x6f\xbb\xa2\x2c\x1e\x1b\xa6\xf3\x9a\xba\xbc\xcb\xee\xbc\x7f\x3e\x0a\xb7\x84\xa6\xc4\x25\x13\x9e\x91\x56\x9f\x90\x1e\x9a\x95\xa2\x90\xe8\x4e\x83\xcb\x98\x80\xff\xbc\x47\x7a\xa1\xb6\x9a\x66\xf7\x81\x0f\xc4\xdd\xe9\xb9\x75\x3a\x8d\x5d\xd1\xf6\xad\xa0\x91\x38\xc6\x61\x57\x95\xc2\x60\xb6\x2d\x55\xa4\xe8\x8a\x73\x71\x55\x66\x14\x34\xe2\xd0\xe3\x53\x38\x7d\x45\x97\x86\x5c\xb6\x46\xe5\xb9\x2a\xcd\x11\x4d\x9f\xb7\xdb\x81\x20\x37\x98\x43\x32\x5a\xc8\xb4\x08\x5a\x0a\x76\x8e\x63\x81\x0c\x3b\x1e\x4f\x7e\xf0\x17\x18\xf9\xf7\xbd\xe7\x28\xc7\xec\x61\x18\x0d\x49\x5b\xb6\x7f\xc1\x8d\x3e\x9e\x88\xb3\xe1\xf4\xec\xea\xfd\x6c\x6e\x25\x08\x12\x2a\xb8\x3f\xa1\x0a\x37\x7f\x37\x98\x4c\xaf\x13\xf1\xe1\xdd\x00\x04\xe8\x7c\x32\x9d\x87\x0c\x22\xe3\xc1\xdb\xd1\xf0\xed\x60\x7c\x36\x38\x4a\xec\x49\x9d\x4f\xfb\x56\x62\x30\x2b\xc7\x87\xe1\x6c\x90\x88\xd9\xbb\xfe\x68\x64\xa5\x48\xd2\x2d\x41\x92\x80\xee\x03\xda\x18\xbe\xb9\x9a\x4f\x3c\x25\x8b\x0b\xa6\x4d\x40\x32\x44\x67\xda\x3d\x34\xbb\xb2\x0a\x16\xca\x0e\x68\x8e\x58\x3e\x88\x7d\xa4\x41\xc8\x62\x9f\xb8\x1c\x4c\x67\x93\x31\x8a\xe5\xf1\xb5\x18\x8e\xcf\x87\x53\x90\x77\x1d\x2c\x2c\xc9\x6e\x1a\x16\xfa\xde\xd9\xbb\xbe\x1d\xfb\x60\xfa\xd8\x75\xc2\xef\x5d\x10\x77\x8a\x6d\xe0\xed\x64\x72\xfe\x61\x38\x1a\x25\xe2\xc3\x64\xfa\x4f\x62\x36\x9f\x5c\x5e\xf6\xdf\x0e\x12\xb0\x6b\xae\x6c\xa3\x8e\x37\x65\x2a\xde\xf7\x47\x17\x57\xe3\x33\x6c\x8d\x3a\x6f\x97\xce\x4e\x32\x4f\xe2\x7b\x7b\xfd\x44\xbd\x64\xa2\x96\x06\x8d\x0a\xd2\xa6\xe0\x0a\xbd\xeb\xff\x38\x40\xf6\x94\xe1\xd8\xde\x2b\x4f\xa3\x4f\x61\xf9\xcb\x23\x8c\x76\x1b\xb5\x6c\x2f\x0f\xab\x00\x83\xad\xe6\xff\x08\x94\x38\x83\xfe\xfc\x9d\xed\x1e\x2e\x47\x7f\x24\x86\xe3\x1f\xae\xa6\x70\xfd\x5c\x8d\x80\xb4\xe7\x62\x3a\x79\x1f\xf4\xf6\x60\x16\x6c\xbb\x06\x6d\x54\x83\x06\xe8\x72\x3a\x79\x37\x7c\x33\x9c\xcf\xf0\x75\xdf\xc9\x9e\x98\x4d\xde\x0f\xc4\x0f\x57\xd3\xe1\xec\x7c\x08\x73\x39\x13\xe7\x13\xec\xe8\x68\x34\xf9\x40\x8d\x9e\x8d\xae\x66\x30\xa6\x69\x63\x84\x4f\x20\xe8\x49\xc4\x6c\x82\x93\xe3\xdb\xb1\xeb\x14\x34\xf4\xbe\x7f\x1d\xcf\x8d\xbd\xa8\x21\x85\xfb\x79\xef\xb9\xb8\xea\xcd\x7a\xe2\xed\xe4\xc7\xc1\x74\xfc\xde\x0e\x6e\x60\xcf\xe7\x6c\x30\x85\x28\x32\xfe\x11\xac\x79\x2b\x8c\x5e\x39\x80\xee\x99\x47\x07\x26\x34\x1a\x4e\xd2\xb3\x82\x46\x97\x6d\xbf\x71\xa3\x29\x82\x98\x95\xad\xdf\x6f\x4a\xab\x94\x73\x72\x11\xd2\x88\x99\x7a\x11\xfc\xe2\x90\xfd\x36\x99\x2a\x8f\x02\x22\x6b\xdf\xc8\x81\xe1\xdb\xd1\x65\x32\x06\xe8\xc1\x51\xbd\x59\xec\xd9\x73\x9c\xb6\xe0\x30\x25\x83\x65\xa5\xcb\xea\xd6\x25\x5b\x90\x84\x7e\xed\x80\xca\xed\x65\x09\xfc\x39\xde\xcd\xf5\xf2\x4f\xe2\xac\x77\xd1\x9b\xf6\xc4\xe9\xe9\x77\xbd\xef\x4e\x9f\x9f\x38\x8a\x47\xfa\xc5\xe9\xf1\x4b\x71\x68\x6d\xbe\x73\x65\x55\x7d\x8e\x60\x9d\x23\x15\xae\x38\x3c\xd7\xe7\x47\x38\xa5\x06\x0b\x94\x8e\x1c\xa4\x71\xd8\x7a\xef\xe4\x39\xfa\x6c\x4f\x4e\x7b\xa7\x27\xa7\xd8\x64\xa1\x8b\xe3\x73\x7d\x1e\xbf\x8e\x0b\x7e\xd2\x7b\x2e\xde\x0f\x67\x67\x83\xd1\xa8\x3f\x1e\x4c\xae\x66\x2d\xab\xd0\xa1\xae\xba\xdc\xf9\x0d\xa4\x5c\x78\x8a\xdb\x80\xc3\x92\x73\x9b\xd6\xb2\xaa\x28\x5f\x4a\xaf\xc0\x95\x87\x29\xba\x3b\x78\x47\xed\xac\xdd\xaa\x3c\x25\x93\xb6\x2e\x54\xb1\xd2\xe5\x52\x21\xc5\x3f\x28\x1a\xfe\x5d\xb7\x24\xa5\x5a\xe9\x72\xad\x3a\xcb\x96\xa3\xea\x64\xf6\xf8\x05\xad\xf6\xe2\x41\xba\x36\x43\x47\xd5\x99\xcc\xb3\x95\x2e\x8b\x4c\x02\xa5\xd1\xc6\x2b\x11\xf6\x06\x6e\x7b\x01\x02\x5b\x24\x97\xf7\x9e\x5c\x80\x9c\xa1\x26\x20\x02\x0e\xa1\xbe\x90\xab\xbc\x58\xe5\xd9\xb2\x3a\xd6\xab\xe3\xf8\x5b\x3d\xf1\xa1\xe1\xf1\x49\x33\xb3\x81\x84\x1c\xe7\x67\x76\xdc\x35\xd6\x84\xa2\x6c\x32\x20\x38\xca\xaa\xec\xaf\xaa\x60\xa2\x73\x59\x70\x16\xe2\xf2\x56\x96\xc8\x10\x8d\x3e\x8a\xcc\xe0\x7f\x01\xa8\xbe\x67\x0d\xa7\xb3\x72\x55\x80\x67\x63\x56\x01\x06\x8c\x5e\x89\x3e\x22\xce\x24\xe4\x93\xac\x38\x22\x13\xfb\xb3\xbb\xa6\x37\xca\x7d\x53\xe2\xa7\xba\xcc\x4c\x9a\x2d\xc3\x24\x99\x0b\x95\x82\x17\xfd\x0c\xe9\xa5\xe8\xb7\x63\x0d\xec\xbd\x05\x05\x47\xd0\x9e\xf6\x0b\x44\x40\x44\x77\xca\xda\xbb\x98\xfd\x99\x15\x62\x26\x8b\x4a\x8a\xb3\x5c\x96\xd2\x36\x07\x71\x99\xd6\x3b\xe0\x87\x42\xba\x41\x9c\xba\x26\x6e\xf1\x52\x9b\xca\x3c\x96\x69\x8c\xec\xcf\xf0\x28\xe9\x61\xd2\xe8\x02\xdd\xd4\x55\xa5\xcb\x42\x6d\xcd\x81\x58\x29\x65\xb8\xfc\x15\x14\x5f\x82\x6a\x8e\x73\x72\x82\x39\x1f\x93\xa7\x04\x70\x2f\x8a\x8a\x58\x25\xce\x48\xf4\x19\xe7\xab\x04\x12\x31\x54\xc2\x64\x2e\x66\x12\x63\xd2\x6f\xb5\x4e\x41\x22\x11\x9c\x31\x30\xf6\xa3\xcb\x0b\x13\xd0\xed\x56\x8b\xfd\x7f\xb8\xa1\xdc\x8e\x75\xb1\x9a\x5c\x16\x37\xb5\xbc\x21\x72\x4a\x97\xe9\xd9\x45\xf9\x7d\x23\xb3\x82\x10\x68\xd3\x12\xf3\xb5\xf1\x31\x00\xdb\xf4\x0c\xb6\xa1\x82\x3e\xf8\x33\x5c\x98\xa2\x2f\x8e\xc1\xf0\xf7\x89\x14\xf4\xc8\x1e\x20\x3f\x86\x79\xf8\x01\xe8\x74\xd9\xda\x58\x9d\x6d\x84\x05\x4b\xe2\xb0\x42\xec\x3f\xac\xcb\x38\x7a\x1d\x25\x00\x61\x12\x2c\xb7\x4f\x87\x7d\x47\xf4\xa2\xc5\xea\xaf\x17\x10\x25\x69\x42\x54\x90\x1a\x5f\x89\xbf\x3c\xfc\xd3\xdb\x73\x77\x53\x98\x63\xe5\x7d\x2d\x81\xcc\x8c\x93\xb0\x80\x28\x85\xdc\x13\x90\x3a\xf1\x98\x7b\x02\x13\x5a\xf6\xda\x60\xd7\x9e\xad\x28\xa4\x26\xaa\x98\xfa\x78\x95\x2d\xfd\x86\x40\x89\x19\xe4\x62\xc7\x4c\x74\xa6\xdd\x73\x44\xf7\x6e\x85\xf8\x1e\x99\x17\x37\x3d\xdd\xa9\xb9\x3b\x02\x87\xaf\xf6\xec\x56\x78\x9f\x2d\x4b\x8d\xb0\x1f\x06\x81\x67\x7b\x7b\x97\x9c\x60\xc9\xa9\x0b\x8b\xed\xab\x27\xf6\xe1\x2f\x7b\x76\x75\x22\xb0\xdb\xa7\xbf\x6a\x4d\xdf\x29\xce\xd4\x54\x19\x55\xde\xa9\xb4\xb7\x17\xe4\x3f\x1c\x9a\x2f\x68\x8c\xcf\xcd\x1b\x7b\x6e\x78\xbf\xc3\x0c\xf1\x7f\x89\xcc\x63\x80\x92\x37\x2d\x80\x29\x98\x6c\x54\x31\x59\xad\xb2\xa5\xea\xe9\xf2\x46\xfc\xf9\xfd\x08\x30\xd4\xc4\x05\x60\x4d\x88\x19\xad\x36\x09\x39\xc8\x25\xb1\xed\x54\xe2\xb6\xaa\x36\xaf\x9e\x3d\xfb\x65\x9d\xf7\xf4\x46\x15\xda\xb5\xd1\x6c\x32\xcc\x37\x24\x1a\x3c\x70\x0b\x0c\x5d\xc1\xc2\xce\x8f\xec\xd1\x47\xe4\x26\x6b\x7e\xe4\xbf\x77\x89\xe4\xbf\xe9\x9f\xde\x33\x06\xfd\x3e\xd6\xe5\x31\x44\xb5\x7f\xf3\x5a\xe0\x2f\xc7\xff\x7e\xf1\xcd\xe9\x57\xfc\xef\x3f\xe4\xe7\x2b\xfe\xf7\x57\xfc\xef\xaf\xf8\xdf\x5f\xf1\xbf\xbf\xe2\x7f\x7f\xc5\xff\xfe\x8a\xff\xfd\x15\xff\xfb\x2b\xfe\xf7\x57\xfc\xef\xaf\xf8\xdf\x5f\xf1\xbf\xbf\xe2\x7f\x7f\xc5\xff\xfe\x8a\xff\xfd\x15\xff\xfb\x2b\xfe\xf7\x57\xfc\xef\xaf\xf8\xdf\x5f\xf1\xbf\xbf\xe2\x7f\x7f\xc5\xff\xfe\x8a\xff\xfd\x15\xff\xfb\x2b\xfe\xf7\x57\xfc\xef\xea\x2b\xfe\xf7\x57\xfc\xef\xaf\xf8\xdf\xff\x46\xf0\xbf\xdf\xe6\x75\xfe\x8b\xfa\x3d\x01\xc0\x1f\x8e\xff\x3f\x7f\xfe\xdd\xc9\x37\x8d\xf8\xff\xe9\xc9\x77\x5f\xf1\xbf\xff\x90\x9f\x39\x60\x4d\xfb\x70\x0c\x27\x3a\x6f\xe4\xf2\xa3\xbc\x51\x88\x27\xc5\xde\x84\x93\xef\xbf\xff\xfe\xf8\xf4\xf9\xc9\x73\x2b\x0b\xfa\x45\x5a\xaa\x7b\x71\x99\xeb\xea\x63\x56\xf4\xf6\xbc\x87\xab\x1d\xb7\xcf\x2a\x00\xf9\xb1\xe7\x11\xdc\xfe\x5b\x07\xfe\xe9\x8a\x1e\x8b\x6d\x20\x90\x93\x06\xab\xbf\x8b\x1e\x35\x32\xb6\xc9\x43\x0a\x81\x7e\x95\x36\x4a\x1a\x43\x5f\x2f\x8c\x89\x06\x58\x69\xd4\xef\xf4\x7d\xc1\x91\xa4\x76\x35\xba\xac\x12\x44\x59\xa1\x1a\x44\x7e\x5d\x62\xad\x4e\x57\xf9\x7a\xd3\x3e\x89\x06\x81\x62\x90\x92\x05\x7d\xf1\x2c\x74\x84\x3b\xa1\xcb\xc6\xf0\x08\x8e\x01\x93\x41\x8d\x58\x6f\x09\x45\x87\x54\xa7\xab\xe9\x48\x98\x5b\x3b\x0c\x28\x26\xfa\x55\x52\xa6\xf7\x6c\xd4\x1f\x1d\x9f\xf4\x5e\xfc\x8e\x02\xe0\xe1\xf3\x7f\xfa\xfc\xf9\xc9\xf3\x36\xfe\xff\xf3\xaf\xe7\xff\x8f\xf8\x81\x3b\x73\xa9\x44\xbf\xac\xe0\xb6\x52\x80\x66\x7f\x38\xea\x8f\xec\x3f\x8e\xf6\x2e\xcb\xcf\x9f\xe4\x7a\x51\xe7\x4a\xbc\xda\xeb\xdf\xa9\xa5\xc8\xa5\x68\xbd\x94\x88\xfc\x40\xd6\x95\x2e\x33\x83\x3b\x57\x19\xab\xce\x14\xc5\xe7\x4f\x4a\xa4\xe4\x29\x2c\x13\xfb\x4f\xab\xaf\x82\xc3\x4c\x55\xf6\x3f\x11\xb5\x5e\x97\x6b\x32\x69\xf0\x5a\xce\x95\x11\xff\xed\x7f\xab\xef\x4a\x65\x44\x6a\x05\x45\xae\x5c\x56\x7c\x6a\x7f\x57\xea\xac\x32\xf6\x7d\xf8\xae\xaa\xcb\xde\xde\x48\x5b\x1d\xf8\x20\xbb\x29\x74\xa9\x4a\xb1\x74\x8f\x25\x9d\x5d\x86\x6f\x94\x6a\xa9\x8b\x42\x7e\xfe\x2f\x95\xed\x8e\xfd\xcd\xa6\xd4\xd5\xe7\x7f\xb9\x51\x3d\x31\xc8\x73\x25\x54\x41\x95\x07\x76\x02\xf2\x03\x04\x23\x5e\xc2\xef\xad\x6a\xa0\xaa\x4a\x16\x95\xf8\xfc\xcf\xa2\xd2\x75\x25\xea\xc2\x8a\xa2\x65\x6d\x55\x19\xb1\x92\x59\xa9\xec\xaf\x6a\x63\x05\xe9\xd2\x4e\x64\x95\xad\xa0\xff\x84\x68\x81\xe8\x74\xd0\xb0\xd9\x58\x65\xff\xe7\x5a\xe5\xc6\xfe\xaf\x30\x3a\xc3\x89\xa8\x4b\x71\xa3\x8a\x52\x61\x07\x6b\xc0\x07\x59\x2b\x91\x1e\x50\x26\x2f\x68\x5e\xb3\x2c\x81\xae\x7e\xfe\x17\x6b\x5d\xdf\x7c\xfe\x54\x7c\xfe\x54\x02\x18\x69\x7e\x10\x26\x9c\xa7\x35\xce\x89\x48\x69\xda\x40\xe6\xd6\x19\x0c\x01\xe2\x07\x2a\xb3\x62\xdd\xbe\xb6\x5c\x7e\xfe\x17\x23\x64\xfd\x8b\x5f\x09\xdf\xd3\xee\x39\x4d\x84\xac\x29\x5f\x3c\x83\x4d\x61\x67\xe1\xce\xee\x0a\xd5\x13\xa3\x83\x0c\x12\xba\xdd\xf6\xe0\x1d\x63\x57\xfe\x00\x42\xfb\xb4\x79\x52\x58\x19\x83\xd7\x92\x11\xe9\x41\x5d\x28\xea\x84\x78\x0d\x13\xa9\x4a\x01\x60\x23\xf5\x9d\xca\xed\xaa\x05\xaa\x7c\xea\xa6\xda\xaa\xe7\x56\xbc\xca\xf5\x26\xb7\x82\xb9\xc4\x05\x06\x94\x0a\x6b\x32\x7f\xfe\x14\x3f\xdd\x13\xa3\xae\x7d\x82\xeb\x6c\xbb\x7b\xa7\xb3\x52\xfc\xa4\xeb\xcc\x18\x50\x17\xd3\x60\x97\xc2\xfa\xc3\x6e\x81\x1d\x05\x8f\xe0\x8e\xa2\xbd\x4a\xfb\x8b\x0a\x0e\x64\xd4\x03\xd8\x33\x3d\x3a\x5e\x4a\xa4\x9f\x3f\x41\xa6\xf3\x06\x0f\x43\x5a\x5b\xf5\xff\xf3\xa7\x32\xfb\xb9\x86\x15\xcd\x5c\x7d\x40\x0a\x73\x5a\x16\xaa\xc2\xe3\x64\xef\x9b\x9b\x6c\x99\xd9\x5d\x04\xa7\xc9\x6e\x7e\x65\xec\xd5\x24\x3b\x46\x2c\xb4\xdd\xbc\x9f\xee\x74\x5e\x7f\xfe\x24\x5e\xf1\x01\xe8\xdc\x9a\xe6\x40\xaf\x56\x00\xb2\x83\x55\xb4\x39\x66\xac\xd9\x8d\x93\x4b\xb1\xcc\xca\xa5\x03\xbf\xb0\xbf\x3a\xf8\xfc\x09\x6f\x65\xdb\x31\xbb\x89\xdc\x41\x67\xac\xfe\x01\xac\x9c\xb1\xa6\xed\xe7\x7f\x05\xf7\x23\xec\x15\xb9\x88\x1a\xb6\x5d\xf5\x1b\xe3\x80\xa7\x1b\x99\x30\x14\x9e\x15\x3a\x73\x1b\x55\xdb\x4f\xdd\x40\x22\x5d\x89\x6b\x9f\x1f\xc8\x3b\x59\x54\xf6\x00\x02\xc8\x45\x6d\x7a\x7b\x67\x07\x76\xfb\xd9\xb6\x65\x66\x60\x33\x5a\xcb\x3a\xb3\x23\x82\x11\x77\x6d\x82\x57\xe0\x23\xd1\x35\x6c\x01\x55\xa1\x98\xf8\x74\x43\x72\x66\xe7\x9c\xa9\x5c\x17\x34\xab\x59\xb1\xcc\x36\x10\xb9\x01\x0d\x29\x57\xab\xca\xce\x78\xb6\x50\x65\xf5\xf9\x93\xdd\xe4\x56\x4c\x24\x4e\x5a\x06\xc2\x12\x26\x35\x94\x95\x24\x63\x2b\x74\x44\x73\x4d\x4d\x6a\x8f\x7a\xa9\x37\x25\xa1\x3a\x3a\x38\xea\xde\xde\xf9\xe7\x4f\x2e\x31\x50\xbc\xda\x1b\xeb\xda\xd8\x5d\x66\xac\xb0\x2c\x20\xca\x2d\xfe\xeb\xff\xc1\x47\xec\xbf\xfe\xdf\xf6\x1c\x83\x60\xcb\x69\xc2\x99\x42\x42\x25\x91\x68\x5e\xea\xc2\x7c\xfe\x04\xe8\x0f\x76\xa7\xd9\xb5\x70\x6f\xd0\x0a\x89\x0a\x4f\xa8\xfd\x5b\x8a\xbd\xb0\x2f\x66\xc7\x72\x53\x5a\xf9\xf2\x6a\x6f\xd4\x7c\xe3\x95\x18\xe6\xc2\x1c\xc8\x1b\x90\x53\xc1\xd9\xff\xb9\xce\xc0\xb1\x5f\xaa\x22\x6d\x77\x4d\xc8\xac\x30\x19\x7c\xc8\x1e\x46\x7b\x16\x14\x01\xae\x3b\x90\x97\x8d\x36\x95\x3d\x48\xaa\xb6\xdd\x3f\xcc\x01\x65\x1c\x8a\x08\xea\x5f\xc2\xd1\xb8\xe3\x8a\x21\xae\x23\xbe\x0d\x4c\x05\x87\xc7\xde\x6a\xb0\xc9\xf1\xdb\x80\xb0\x1c\xdc\x45\x8e\x70\xc3\x76\xd8\xce\xed\x52\x55\x15\x21\x38\x2f\xdd\x34\xf0\x07\x9c\xe4\x72\xbb\xc5\xde\x02\x79\x67\xff\x8d\x86\x63\x92\x55\xca\xf4\xfc\xc4\xb9\x19\x78\x25\x60\x6f\x1f\x7f\xfe\xe7\xe3\x34\x2b\xc3\xc5\xa0\x4e\xdb\xce\xb8\x5e\xdb\x9e\xa6\x1d\x2b\x96\xea\x22\x1c\xbc\xb8\x03\x29\xf1\xaf\x55\xc9\x2a\xee\xe7\x4f\x0a\xf7\x8c\x1d\x5f\x0e\xf6\xc3\xad\xed\x53\x6f\x6f\xb4\x6b\x73\xb4\xbb\xd6\x1a\x1b\x80\xe7\xc3\xfc\x19\x9e\xb8\x2a\xb3\x67\xc6\xc9\x02\xbf\xf5\xbb\xba\xad\x0a\x3b\x33\x20\x76\xf1\xc6\x8d\x15\x05\xce\x0f\xab\xf8\x34\xb9\xb3\x45\x9a\x48\x14\x35\x87\xad\x4c\xf7\xe3\xea\xf3\xbf\x40\x56\x05\x2f\x60\x6f\x6f\xe2\xf6\xcc\x21\x5f\x52\xa0\xde\xfb\x2b\xcb\xf7\xef\xc8\x0e\xfd\x56\xda\x06\xd5\x2f\x90\x5c\x61\x87\x9f\x4a\x38\xf4\xaa\x63\x1b\xeb\x3a\x9a\x3a\xd7\x15\x3f\x3b\x9b\xf2\xf3\x27\x2b\xb2\x98\x12\x48\x59\x29\xb9\xfa\xfc\x09\xe3\xb5\x20\xf7\xe8\x04\x48\x00\x8c\x27\xf1\x09\x29\x1f\x95\x2a\xed\xeb\x15\xff\x86\x63\xb8\x75\x34\x41\x46\xd4\xb9\x3f\x28\xbd\xbd\x33\xfb\x94\x78\x25\xe6\xb6\xd9\xe8\x49\x38\xa1\x7c\x88\x72\x7b\xff\x1b\x45\xb7\x70\xb8\xe9\x31\x65\xee\x58\x4c\xde\xfc\x30\x98\xc3\x7f\x9c\x45\x67\x42\x62\xb7\xf5\xe2\x27\x5c\x0c\x3a\x23\xe5\xa3\x67\xe4\xce\x8a\xb2\x8d\x55\x04\xfe\x0a\x57\x73\xa8\x45\x06\xd3\xcb\xc9\x70\xa3\x83\xcf\x7f\x9b\x0f\xc6\xe7\x57\x03\x71\x3e\x10\xa3\xbe\xf8\x61\x72\x35\x9c\xcd\xfa\xe3\xb3\x41\xd0\x2b\x5a\x12\x7b\xdc\x8d\xae\xd7\x99\xb5\xf7\x9a\x9a\x53\x02\x22\x82\x4f\x7c\xfb\x94\x43\xc7\xb2\x22\xb5\x97\xb6\xe0\xde\xc2\xf9\xbd\xd3\xc6\xc9\x7d\x43\xd7\x94\x74\x2a\x72\x2e\x23\x15\x39\x77\x71\x2f\x87\x33\x74\xda\x3b\xb1\x3d\x1f\x0d\xdf\x0c\xa6\xf3\xcf\x7f\xb3\x03\x39\x9b\x5c\x0e\x07\x53\x71\x38\xb9\xb2\xff\x35\x1d\x5c\x4e\x27\xe7\x57\x50\x72\xee\xa0\xe4\x7f\xb4\xfd\x91\x76\x9a\x60\x27\xf3\xb5\xc3\xba\x39\xf5\x9e\x46\x0e\x9d\xb2\x23\x48\xa0\xb7\x72\x9d\xc1\x16\x81\x5d\x65\xb7\x21\xaa\x45\x46\x17\x85\x4a\x68\x70\xac\xb5\x42\x97\x2b\xb5\xbc\x2d\x60\xe4\x76\xc7\xeb\xed\xe7\x4f\xca\xf7\xfe\xb4\xd9\xfb\xf3\xe1\xc5\xc5\xd5\xcc\xf6\x7f\x38\x9e\x0f\xa6\x97\x53\xbb\x46\x53\x00\x72\x99\x7e\xfe\xdb\x6c\x30\x86\xff\x62\x88\x86\xc1\x34\x1e\x13\x2d\xbe\x9b\xb4\xd8\x8a\xa0\xfd\x0d\xfb\xd1\xc9\xa6\x24\x14\x64\xba\x16\x85\x15\x09\x76\x18\xc1\x20\x94\x47\xf5\x6c\xfd\x25\xcf\x54\x0d\x6a\x4e\x95\xd9\xa9\xd0\x56\xdb\x56\xf5\x2f\xb6\xa9\x9b\x52\x56\xb5\xd5\x8f\x4d\x86\x5b\x80\xcc\x16\xf5\xd7\xc6\xad\xe4\x76\x74\x9d\x59\x0d\xc5\x8a\xc8\x20\xe2\xde\x13\x3f\x69\xd4\xc4\xf1\x66\x82\x41\xc4\x1b\x0c\x2f\x20\x60\x5e\xb1\x7d\x03\x14\x4e\xd8\x6d\x25\x08\x88\x65\x66\x3e\x7f\x42\x1f\xe7\xe7\xff\xcb\xaa\x59\x55\x69\x27\x2a\x90\x63\xe2\xb5\xff\xe0\x69\xcf\xbf\x2d\x01\xc8\xb2\xca\x0a\x59\x49\x14\xd5\xa2\xd0\x6b\x52\x54\xed\xa7\x68\xcf\xa7\xe1\xed\x99\x88\x2d\xde\xcd\x19\x18\x6b\x77\x9f\xff\x4f\x3b\x33\x3c\x09\xb0\xef\x78\xce\xbd\xcc\x0b\x3a\xf0\xe2\x81\x0e\xd8\x01\x64\x39\x6c\xca\x52\x66\x95\x40\x45\x3c\x30\x50\xfc\x1d\x7e\x88\x62\xb4\xfe\x45\xa8\xea\x59\x2c\x49\x8d\xdb\x36\xa3\xe0\xa6\x89\x06\x81\x9f\xd0\x85\x5d\xbe\x83\x2c\x37\xe1\xe5\x66\x7f\x89\x63\x71\x56\xcb\xe7\x7f\x0e\x76\xdd\x81\x93\x81\x64\xb0\x1a\xb1\xfe\xfc\xaf\xeb\x78\xb1\x51\x96\xf3\xae\xf4\x47\xe2\x45\xf3\x48\xbc\x9f\x9c\x0f\x2f\x86\x04\x0d\xf4\xd0\xe9\x65\xe1\x10\x6f\x76\xb3\x63\x4a\xe2\xf9\xe8\x34\xad\x9f\xb0\x35\x97\x28\xcc\xec\x2e\xbb\xab\x95\xc1\x9d\x08\xb7\x75\xae\xe0\x7c\xab\x42\x2c\xa1\x9e\x22\xb8\x64\x51\xb3\x86\x1e\xfa\xd3\xb7\x6b\x0b\xfe\x5c\x1f\x64\xdd\x3a\xa0\x7f\x55\xe1\x21\xf3\x0c\x68\xb9\x24\xd3\x84\xbe\x15\x5d\xe8\xf1\x56\x73\xcb\x16\x49\xbd\xe8\xda\x95\xe4\xeb\x80\x45\x74\x47\x46\xd7\xf8\x07\x94\x84\xfc\xdb\x20\x0b\x24\xf8\xce\xcb\xde\x6f\xb9\xd3\xfc\x42\xff\xda\x9d\xf6\xa2\x27\xce\xa7\x93\xe1\x7c\x26\xce\x26\xe3\xf1\xe0\xcf\x83\x19\xfc\x7a\x84\x7a\x82\xdd\x37\xd6\x72\x05\x14\x55\x55\xc3\xe6\x0e\x14\x28\xbe\xe8\x10\xe5\x96\x7f\x7d\xa7\x33\x93\x15\x46\x80\xd6\x98\xdd\x51\x4a\x36\x16\x88\x67\x95\x5d\x49\xab\x1c\x2c\x4c\x25\xed\xd6\xb0\xe3\xf6\x17\x1f\x68\x56\x9f\x4a\xa7\x4c\xc6\xfa\x02\xaa\x8b\x30\x4d\x3f\xd7\x3a\x4b\xe0\x11\x54\xa0\xc8\x08\x69\xea\x32\xae\x07\xa8\xaa\xd2\xc5\x6d\x48\x77\x6c\x2d\xa3\xdd\x53\xed\xf5\xeb\x89\x73\x85\xcf\xa2\xa1\x6d\x8d\xbc\xb2\xad\x73\x7e\xfe\x67\x78\x7f\x21\x0d\x6c\x36\xf2\x74\x99\x04\x7e\x1b\xf2\x6c\xd1\x87\x64\x51\xdd\x6a\x6b\x9a\x2b\x9a\x2a\x9c\x27\x74\x11\xb9\xf9\xc1\x9e\x46\x0e\x06\xff\xc9\xca\x5d\xb2\x6c\x46\x75\xcc\x1a\xe5\x9f\x8e\x0e\xc4\x70\x3c\xff\xfc\xb7\xb7\x53\xc4\x80\xb1\xaa\xce\xc1\x7f\xfb\x5f\xaf\x7e\x9c\xa2\x96\x83\x6a\x5c\x73\x74\xd1\x59\x80\x11\x0a\x55\x18\xb5\x5e\xc0\x05\x50\xd0\x8c\x52\x2f\x47\xfd\x11\x8e\x43\x1a\x53\x97\xb0\x2d\x9d\x73\x0c\xfc\x10\x4f\x5c\x67\xdb\x9d\x59\xe6\x87\x59\xe0\xb2\x03\xeb\x19\xe4\x2e\xc3\xa9\xca\x8a\xf4\xf3\xa7\x8d\x2a\x52\xb9\xf6\x9a\x1d\x77\x2e\x11\x32\xd7\xa5\x69\xae\x17\xb5\xc4\x18\xac\x3f\xd7\x07\x9f\xff\xd9\x9f\x10\x32\x56\xdd\x00\xe1\x6a\x6f\x8d\x70\xf7\x3e\xe1\xf4\x99\xe9\x70\xfe\xf9\x7f\x99\x0e\x66\xa8\x85\xbd\xbf\xec\xcf\x11\xc4\xe8\xf3\xdf\xe0\x91\xab\xe0\x6d\x45\xd4\x19\x24\x29\x58\xc0\xd8\xef\x98\xcc\x0a\x67\xa3\x6a\xf2\x7d\x98\xcc\x89\xdc\x93\x9e\x80\x95\x47\x94\x19\xd5\x74\xb4\x86\xce\xd5\x40\x6d\x74\xd2\x22\x8d\x74\x20\x9e\xe6\xf0\xb6\xa6\x83\xbe\xb2\xe7\x38\xaf\x97\x25\x98\xb3\x06\xd4\x5b\x03\x31\x1a\xab\xee\x19\x97\x5d\xec\xa4\xcb\x92\x0d\xfb\x03\x62\x4e\x69\x5c\x24\xf4\xde\xb2\xcc\x2a\x6b\x40\xa1\x0e\x46\xc3\x47\xe7\x97\x13\x96\xa7\x34\xc6\x1b\x59\xca\xa2\x42\x15\x72\x23\x2b\x55\x16\x59\xd3\x4c\x42\xa5\xdb\x5f\xfd\x2e\x3a\x2c\x8b\xc0\xb2\x0f\xdf\xf8\xb9\x86\x60\xbf\xaa\x58\x63\x88\xb6\xc5\x6b\x07\x89\x8c\x5d\x08\x3c\xc2\xb4\x36\x9f\x3f\xdd\xc8\x9c\xc1\x6f\xdc\xea\x1d\x82\x8a\xb5\x29\xf5\xd2\x76\xf1\xc8\xb5\xf3\x92\xda\xa1\x39\x61\x31\x1c\xd3\xff\xa1\x05\x2f\x0c\x38\xa8\xa8\x9b\xe4\xf0\x7d\x4c\x6c\xa9\x62\xa9\xbd\x00\xe2\x3f\x94\x9f\x3f\x6d\x74\x91\xca\x02\x7d\x6d\x0f\xcd\xf9\x46\x1b\x30\x3b\x64\x49\x03\xe4\x9c\x9a\x1f\x27\x33\xbe\x1f\xac\x1a\x3e\x1a\x0d\xce\xe6\x57\x83\x11\x5d\x12\x38\x17\xc5\x81\x04\xc1\x15\x1b\x6b\x85\xdd\x68\xd6\x4e\x68\x5e\x16\x06\xac\x88\xaa\x54\x91\xa9\x2f\x8a\x2c\x7c\xda\xce\xb7\xfa\x45\x99\x9e\x18\x14\x90\x73\x65\xc8\x79\x9a\xfa\xd7\xf0\x0a\xcc\x0f\xd0\x57\xd9\x29\xb0\xc8\x0d\xc0\x57\x27\xd2\xe9\xfe\x35\x38\x53\x29\x38\x30\xad\xe2\x58\xff\xc2\x9b\x33\xb8\x3b\xc3\x53\x65\x76\xf5\x3c\xda\xf7\xa4\xdb\xa2\x0f\xd5\x4e\x2d\x1e\xd1\x9d\x17\x5a\xeb\x23\xc5\x81\x2a\xaa\x52\x7e\xfe\x2f\x05\x5f\x9c\x10\x39\x30\x46\xc2\x1c\x38\x23\x36\x98\x2c\xcf\x03\xa7\x72\x43\xa0\xa7\xb0\x72\xd3\xc1\xec\x72\x32\x9e\xf5\x49\xf8\xb8\x55\x0b\x75\x45\xb4\x8f\x1b\x97\x0a\x8c\x09\xab\x77\x82\x4d\x21\x0e\xdb\x26\xa2\x97\x30\x89\x93\x2f\x47\x88\x22\x02\x6d\x60\xce\x1c\xb8\x62\x73\xd9\x74\x74\xdb\x66\x0c\xba\x4a\x37\x76\xe6\xed\x11\x30\x04\x7c\x69\x95\xdf\xf3\xab\xe9\xe7\xbf\xb1\x51\x0e\xa5\xe7\x91\x45\xce\x1b\x1d\x7d\x7f\x6a\xb5\xb2\x3b\xcf\x1e\x66\x5c\x24\xca\xe1\xe0\x8d\x61\x3f\x84\xa4\x6b\x54\x0b\x2d\x46\x10\x8f\xa9\x76\xc4\xa2\x12\x54\x6b\x42\x1d\x2b\x50\x09\x41\x93\xc1\x6b\x3c\xf8\x4c\x25\x97\xe0\xf2\xda\xe5\xca\x48\x6b\x7b\xe5\x81\x39\x8f\xff\xea\xd2\xa6\x10\x52\xd9\x9e\x47\xd8\xde\xe4\xab\xb0\x17\x22\x6c\xad\x42\x05\xe6\xa3\xdd\x1f\x76\xe3\x55\xaa\x5c\xab\xb6\x87\x85\x36\xfe\x46\x95\xa9\xfa\xab\x83\xfd\xfc\xb9\xf6\xa6\x30\x7d\xfc\xe7\xfa\x00\x24\x14\x3c\xce\xee\x2d\x77\x0f\x83\x2c\xb9\xc9\xd6\x88\xd7\x84\xde\x0b\x59\x83\x05\x0c\x2f\x7c\xfe\x57\x90\x5c\x78\x51\x16\xca\x7d\x74\xad\x70\x07\xa7\xbe\xcb\xe5\x13\xba\x5b\x28\xb6\xdf\xed\xcb\xd8\x98\x35\x2b\x64\xae\xb3\xb2\xa1\x48\x70\xc7\xa3\x3e\x7f\xdf\x13\x23\x7b\xfb\x0e\x2f\x2e\x3e\xff\x6d\x3a\x18\xcf\x07\x33\x0f\x24\xfd\xe8\x6e\x02\x8b\xb2\xe9\xdb\x84\x19\xa8\xf3\xcc\x7e\x03\xc1\x04\x54\x21\xee\x6a\x50\xc7\x8c\x2e\x84\x5c\x7f\xfe\x94\x67\xba\xa4\x68\x87\x3d\x34\x26\xd0\xf3\xc1\xab\x6c\x15\x6a\x50\xfa\x6b\xb1\xb6\xe3\x83\x45\x38\x63\xbf\x7f\xbf\xb2\x7b\x2a\x55\x47\x76\x22\x0d\xbb\x36\x55\x1c\xd3\x72\x37\x1b\x06\x7f\x74\x65\x05\x0b\x0c\xc2\x1b\x83\x95\xae\x7f\xd2\xf6\x3b\x76\x5a\x6e\x75\xf6\x8b\xb0\x12\xc5\xaf\x6d\x85\xa1\x90\xb4\x71\x1e\xe8\x4f\xb5\x8b\xae\xfa\x44\x33\x0a\x80\x58\x9d\x04\xbb\x46\xde\x1d\x67\xbb\xa1\x78\x25\x89\x47\x84\xe4\x3f\xd7\x76\xda\x90\x14\xa1\x34\x49\xe7\x3a\x46\xdf\x47\x93\x2e\x0d\x47\x19\x3b\x1c\x11\x9f\x10\x96\x76\x36\xb9\x9a\x1d\xd3\x1a\x7a\x8b\xc5\xf6\xee\x98\xd6\x11\xb6\x11\xb8\xd6\xec\x26\x22\x19\xeb\xc4\xb0\xd5\x25\xd8\x61\xda\x23\xd5\x97\x9d\x57\x20\xc5\xd9\xee\x12\x0b\x88\x9b\x02\x3c\xfb\x63\x7b\x4f\x18\x55\x5a\xe1\x0a\x07\x1b\x0a\x64\x70\x89\xe9\x6e\x21\x83\xaf\xe5\xa4\x66\x1c\x3e\x31\x1a\x00\x0c\xe9\xe0\xcf\x73\x44\x88\x3c\x1f\xfe\xc7\xab\xae\x1d\x6a\x75\x95\xf2\xf3\xa7\x34\xbb\x01\x93\xb7\x88\x3c\xbd\xce\x27\xb9\x2a\x65\xf1\xf9\x7f\x97\x19\x84\x2d\x50\x71\x08\x40\xc4\x52\x25\xde\xa8\x12\x64\x49\x8e\xb1\x8a\x96\x33\xf3\x1f\x38\x41\xed\xeb\xcf\xef\xfa\xd3\x7b\x36\x3b\x1b\xf4\x7f\xcf\xec\xbf\x47\xf1\x7f\xbe\x79\xfe\xe2\xb4\x99\xff\xf3\xf2\xe5\x57\xfc\x9f\x3f\xe4\xc7\xae\xbe\x98\x61\x39\x17\x95\xb6\x70\x1a\xed\x49\xef\xf9\xde\xdc\x65\x4b\x9f\x39\xdf\xd2\x2b\x82\x3f\x08\xc0\x66\xe0\x57\xfb\x9c\x14\xbc\x4f\x19\xb8\x6b\x25\xb1\x1a\xc0\x84\x00\xac\x9d\xac\x4a\x9e\x5b\xda\xf3\x17\xea\x92\x4b\xc3\x2f\x80\xc4\x10\x40\x3d\xda\xdc\x50\x99\x11\x1d\x83\xe0\xe2\xc3\x43\x0f\xfb\x97\x04\xf5\x5b\x69\xb6\x24\x1c\x38\x2a\xc8\x88\xcb\x25\xb3\xbc\x4d\x38\x42\x59\x92\xc0\xb3\x0e\x00\x32\x4c\x87\xa1\xcb\xb8\x88\xa1\xf9\x30\x88\x75\xea\x86\x2e\xa3\xc9\x99\xe9\x62\x2b\xce\xb8\x56\x6d\x60\x2f\xeb\x4a\x66\x08\x85\xeb\x80\x37\x01\x3b\xe9\x90\x90\xd9\xf7\xed\x58\xf7\xa1\x7a\x67\x3f\x28\x9c\xdf\xb7\xbd\xd8\x0f\xa6\x2b\xfa\x8c\x2c\xb6\x58\x4f\x01\x13\x80\x3c\x41\x86\x0a\x13\x4a\x59\x98\xdc\xa1\xe2\x34\x52\x0c\xf4\x2a\x24\x44\x79\x84\xa6\x16\xfd\x5e\x76\x42\x82\x32\x6a\xae\x44\xa2\x5b\xbe\xd2\x54\xbe\x82\x08\x05\x90\x11\xc4\x08\x1e\x6b\xb9\xbc\xcd\x0a\xe5\x8b\x5a\x7b\xb4\xab\x02\xfe\x7d\x3b\x4a\xfa\x45\x38\x4a\x97\xf5\x0f\x85\x26\x8c\x69\x20\x6e\x30\x3f\x3c\xdf\xb2\x3d\x18\x2c\x26\x23\x18\x17\x69\x6d\xaa\x72\xfb\xc8\xd8\xdc\xf3\x41\xae\x6c\xd2\x84\x0f\x86\x3f\x25\x8c\x23\x40\x25\x06\xab\xec\xa6\x26\x8f\x54\xb0\x1b\x80\x0c\xdf\x71\xe1\x87\x6b\x05\x45\xd3\x5d\xb4\xf8\x06\xeb\x96\x36\x00\x33\xab\x4b\x4c\x0e\x85\x14\x7d\x58\x5a\x42\xff\x87\x8c\xd1\x2d\x71\x70\xed\xe0\xce\x6f\xd7\x02\x9d\xf6\xdc\xa9\x07\x4a\x74\x54\xb3\x68\xc7\x36\x98\xd0\x2b\x2d\xae\x75\x9d\x20\x6b\xa7\x5e\x31\xb5\x61\x03\x94\x73\x17\x30\x56\xb3\x32\x4b\x64\x65\xa9\xee\xf4\x12\xd1\x7f\x23\x16\xf5\x04\xe9\xd6\x91\x6d\x7d\xa3\xca\x8d\xaa\x6a\x49\x9c\xdb\x21\xf9\xba\x3b\xeb\x4c\x63\xce\xdc\xe5\x01\x9d\xb9\x4f\xd5\x4d\xa8\x08\x20\xdf\x32\x50\x06\xe4\xdd\x62\xa9\x35\x62\xc0\xf8\xbd\xc1\x02\xc8\xb3\xc3\xd9\x5d\x27\xd8\x9d\x3e\xd6\x88\xee\x68\xbf\x0c\x50\x8a\x76\x1b\x23\x0d\x39\x56\x43\x40\x12\x0e\xa6\x41\x71\x49\x00\x2d\x84\x2b\x69\x63\x84\x7e\x9c\xd6\xe6\xac\x76\xa1\x8f\x04\x7c\xb5\x4c\xb8\x06\xe5\x43\x76\xcb\xae\xb8\x17\x00\xc1\x2c\x43\xa8\x62\x14\xb3\x46\xa9\x8f\x81\xc0\xdb\x94\xba\xf2\xd4\xff\x15\xf3\xc3\xe2\x19\x95\x4b\x0f\xcb\xb2\x86\xc7\x7d\x25\x6a\xb6\xde\xc8\x0c\x47\xd4\x62\x99\x23\x02\x09\x86\x67\xe5\xe9\x24\x94\xac\x2d\xe0\x6b\x21\x70\x30\x08\x6e\xea\x2d\x63\x40\x10\x99\x98\xc3\xc8\x34\xcf\xb0\xf4\x22\xa0\x68\xc2\x06\x3d\xda\x42\x90\x46\x82\x86\xac\x6d\xf6\x5e\xe5\x4b\xbd\x6e\xa5\x99\x64\x85\x2b\x2d\x6b\x20\x16\xe8\x4d\x95\xad\xa9\xc0\xc3\x24\xa2\xd2\x3a\x37\xed\x9c\xec\x54\x99\xec\xa6\xc0\x05\xcb\xd6\x9b\x52\xdf\x81\x90\x53\xbf\x6c\x38\x2d\x9b\xb6\x15\x78\xf0\xed\xef\xcc\x52\x6f\x54\xb3\xf3\xe2\x70\xa9\xc1\x91\x83\x10\x0e\xfb\xd1\x20\xf6\x8f\x7a\xe2\xf2\x41\x82\x6d\x66\xd9\x5b\x11\xa9\x5c\xc0\x95\x13\xa1\x9d\x57\xb7\xda\xa8\x86\xf7\x91\x09\x5f\x79\x11\xae\x75\xed\x33\xe7\x6f\x91\x29\x54\xdc\x67\xe6\x16\x21\xa2\x81\x46\x04\x58\x02\xa3\x3e\xba\xe5\xa3\x62\x53\x40\xa2\xf2\xc5\x31\x20\x4d\xb1\x8a\xa6\x68\x6c\x84\x1e\x20\x1e\x40\xed\xdf\x9d\xce\x52\xae\xbc\x49\x75\xbd\x40\x44\x14\xdb\x17\x95\x33\xe7\x99\x2a\xd2\x07\x3e\x9f\xb8\xa9\x48\x35\x40\x51\x68\x71\xa7\xf3\xba\xa8\x64\x99\xe5\x5b\x57\x1f\x7a\x93\xdd\x79\x60\xa8\xae\x51\x30\x22\xc4\x46\x96\xce\xd3\x0b\xe4\xdf\x3b\x2f\x68\xbc\x98\x9b\x72\x30\x69\x48\x21\x12\x2e\xae\x10\x22\xb8\x8c\x61\x96\xb0\x18\x02\x8a\x7b\x7b\xd4\x93\xe5\xc7\x42\xdf\xe7\x2a\xbd\xe1\x1a\x29\x9a\x12\xc2\x18\x82\x15\x09\xa9\xa1\x77\xcc\x0b\x94\xba\xc6\x7f\xf3\xd0\xcc\x4e\xc8\xe6\x5d\xc7\xb1\x63\x22\x60\x23\x03\xa9\x99\x8e\x98\x41\x80\xff\x50\xd1\x36\x2a\xb9\x5d\x5d\xf4\xa8\x17\x00\xc2\x61\xcd\xf5\x1c\x20\x8e\x97\xa5\x22\x39\x04\x6f\xa7\x0a\x19\x45\x7c\xd1\x17\x20\xd8\x57\x58\x66\x8e\x80\x16\xd0\x2e\x6e\xc3\xb4\x31\x9e\xd6\xd6\x4a\x10\x27\x5d\xe7\xf8\xaf\x8d\x2c\xb1\x8c\x43\x1a\x5f\x9d\xb1\xd8\x42\xd7\x7a\x62\x76\x0b\x07\x01\x06\xed\xb6\x9b\x63\x32\x65\x0a\xc5\xc7\xbf\xc8\xc8\xd8\xc8\xa9\x6b\xd7\xab\x32\x50\x5c\x52\x66\x06\x11\x54\xec\xc1\x72\x5f\xb8\xb1\x16\xf8\xb2\x54\x69\x06\xf7\x0a\xd4\xc3\xc9\x1c\xe0\xad\x3e\x22\x74\x16\x7f\x3a\x14\x82\xac\xb8\x38\xad\xb3\xa9\xb4\x06\x24\xbf\x88\x45\xef\xc9\x3d\xa3\x11\xe0\xc5\xe6\x54\xdb\xd6\x70\x80\x8d\x8f\xca\x51\xad\xfc\x8c\x20\x90\x22\xd9\xc2\x35\xab\xdd\xc8\xd5\x4f\x51\x00\x7a\xe2\xa2\x2e\x11\xcf\x26\x5b\x3d\xb4\xd0\xd8\xe9\x4a\xdd\x20\x42\x52\xab\xdb\x08\xf1\xf5\xe8\x61\x75\x10\xe6\x30\xb0\x18\x29\x05\x6e\xb1\xd6\x38\x0b\x7d\xcf\x10\x39\x56\x7e\x74\xcd\x67\x41\x5b\xc8\xf1\x68\x57\x0e\xfd\x5a\x97\x1c\x27\x9c\xaa\x90\x6d\x30\x30\x72\xac\x3e\x11\x16\xdc\x97\x2a\x90\x16\x31\xc0\x8a\x5f\xa3\x75\x93\x0c\x3e\x55\x65\x76\x87\x81\x3b\xfb\x68\xa9\xf4\xaa\x49\x04\x8f\x36\x54\x8b\xab\xd5\x55\xaf\xf7\xec\x0c\x11\x89\xaf\xaf\x50\x6f\x30\x4f\x61\x95\x56\x13\x8c\x06\xaa\xc5\x51\xfb\xe5\xc2\xf2\x9e\x18\x42\x66\xd2\x6a\xdb\xe8\x2c\xed\xcd\x7b\x55\x2a\x34\xe8\x1a\x2b\xc9\xb0\x38\x5d\xdd\xc1\x43\x16\x5e\xc6\x2d\xbb\x2b\xda\xa0\xf1\x97\xe1\x6b\xc8\x83\xe4\xaa\xc8\x9b\x8b\x12\x18\x50\x54\xcd\x7a\x0d\x99\x91\xbf\xe1\x9a\x04\x9f\x40\x08\x8e\x43\x69\x62\xfc\x2f\xd8\xdd\xd6\xb4\x86\xaa\xdb\x1b\xad\x53\x93\x88\xac\xa7\x7a\x9e\x28\x2a\x50\xe9\xcc\x91\x70\x3c\x9e\x4e\x0d\x04\x7b\x48\x8a\xb4\xae\xb6\x4d\xa1\x16\xf7\x1f\xed\x98\x58\xbf\x6c\x2d\x30\x23\xa9\xca\x2a\xe4\xcb\x6c\x28\x46\x1c\x8c\x1a\x6b\xf1\x81\x88\xb1\x21\xd5\xe0\xdd\x40\xcc\x26\x17\xf3\x0f\xfd\x69\x4c\xba\xf7\x20\xc3\x1e\x72\xc3\x5d\x4e\x07\xb3\xc1\x18\x79\x6c\x80\x5e\x28\xa0\xc9\x7b\x80\x7a\xef\x4b\x88\xf7\x6c\x1b\x71\xab\xf3\xe1\x7c\x34\x48\x42\xb6\xbc\xc1\xfb\xc1\x78\x1e\xb2\xed\x01\xb3\x10\xf0\x22\x5d\x0c\xe7\x63\xfb\xc5\x5d\xbc\x7b\x3d\x20\xb6\xb3\x43\x9f\x4d\x46\x83\xd1\x35\x87\xe9\x86\x6f\x46\x03\xa2\x26\x42\xce\xb7\xe1\xf8\x2d\x4c\x55\xff\xf2\x72\x3a\xb9\x9c\x0e\xfb\xf3\x01\x34\x3c\xb9\x10\x57\x33\xe8\x3d\x64\x84\x5d\xdb\xe7\x80\x72\xd6\x11\x56\xf1\x9b\x6e\x92\x81\xa7\x09\xe9\xf2\x60\x1a\x87\xb3\x7f\x9a\xd9\x5f\x4c\xce\x6c\xab\xe7\x8e\xad\xcf\xce\xd7\x60\x7a\x36\x44\x26\xbb\x4b\xdb\x8d\x19\x86\x4d\xda\x7c\x88\x2e\x50\xe7\xa0\xfe\xed\x06\x1a\x31\x43\xf1\xaf\x21\xfc\x12\x1f\x86\xa3\x11\xaf\x1c\x52\x44\x45\xf4\x59\xc0\x34\x18\xfc\x91\x58\xa8\xe6\xef\x86\xd3\x73\xfa\xd5\x85\x23\xef\x42\x52\x2d\x4f\xaf\x15\x91\x25\xed\x66\xdb\x1a\xfc\x79\xf0\xfe\x72\xd4\x9f\x5e\x3b\x0e\x2b\x98\x1c\x62\x25\x64\x12\x2f\x24\x8b\x4a\x80\xdc\x0a\x5e\xc3\x87\x13\xd1\x9f\x0e\xed\xda\xd0\xf8\xec\xae\x1b\x63\x6a\x15\x64\xde\x62\x5b\x38\x8b\x83\xf9\x7c\x30\x15\xfd\xb7\xd3\x01\x6d\x26\x26\x3b\xbb\x98\xd8\x3d\x3e\x80\x41\x4f\xa6\xe2\x6a\x1c\xfc\xa2\x93\x46\xeb\x5d\x7f\x86\xfc\x59\xfd\xf3\x1f\x87\xb3\x87\xe9\xb3\x76\x74\xbc\x47\xec\xaa\x7c\x0a\x66\x0d\x3a\xad\x01\xf0\x48\xce\xed\xfb\xd8\xfd\x19\x0d\x08\x89\xb6\x1c\x91\x94\x6d\xe5\xe2\x6a\x34\x1a\xcc\xe6\xcc\x8d\xc5\xbb\xc8\x0e\xa7\x3f\x07\x7e\x2c\x5a\x23\xe0\x98\x7a\x8f\x6c\x56\x9e\x30\x79\xc6\x31\xbc\xb7\x8e\x58\x62\x24\xef\xd9\xdf\x08\x80\x17\x95\x16\x3f\x04\xcc\x31\x8e\xb2\xa8\xef\x28\x89\x3a\xf9\x7c\x40\x9f\xc7\x0c\x31\x45\x7e\x9f\x26\x4f\x53\x05\x54\x27\xf7\x5e\x96\x57\xd6\xd2\x69\x50\xcd\x84\xf0\xb0\xb2\x12\x0b\x9d\xc2\x55\x94\xcb\x7b\xe7\xc8\x44\x0c\x80\x0c\xad\x18\xdb\x20\xe1\x2b\x45\xe4\x2e\x2d\x42\x1d\x24\x65\x91\xce\xf6\xde\x94\x7a\xa9\x14\xfa\x9f\x80\x2c\x8a\xb0\x43\x81\xc5\xa8\xc3\x12\xf4\xe3\x47\xd2\x3e\x99\x02\xd9\x33\x70\x3e\x22\xc5\xdf\x06\x92\xb5\x4b\xf4\xff\x78\x9a\x3f\x37\x5d\xfc\x19\x66\xc9\xaa\x37\x0a\x18\x00\x81\x8c\xc7\xc3\x37\xd5\x45\x05\x43\x9e\xc9\x02\x00\x39\x75\xd2\x35\x53\x82\x4c\xba\x78\xb8\x8e\xc0\x07\xdb\x64\x1f\xc8\x23\x04\x3f\x44\xc6\xcb\xc8\x85\xb2\x04\x10\x20\xf2\x42\x99\x7a\xb1\x86\x4c\x88\xca\xa8\x7c\xe5\x01\xac\xc8\x9e\x89\x69\x86\xec\x3a\x20\x4f\x90\x5e\xb1\x4e\x0d\x4c\x43\x00\xb1\x8c\x48\xa8\x26\x62\x4c\xc7\x05\x01\xaa\x71\x46\x37\x4d\x10\x81\x10\x09\x83\xa8\x17\xf7\x92\xef\x75\xcf\x57\x2b\xed\xb7\xb7\xa2\x42\xec\x4e\xb4\xec\x3a\xd7\x37\xd8\x38\xf1\x52\xba\xb8\xa7\xc7\xd6\x1f\x7b\x00\xbf\x86\xba\x12\xfb\x66\x03\x38\xfe\xd3\xe7\xcf\xbf\x79\xd0\xb3\x6c\x55\xe1\x3d\xba\xee\x43\x95\x7d\x77\x2c\x20\x09\xe8\x74\x9e\xb7\xe9\x74\xb6\x7f\x10\x9d\xce\x2b\x66\x09\x29\x95\x51\xb2\x5c\xde\xf6\xcc\x52\xc9\xde\x52\xaf\x9f\xd9\x7f\xfc\x05\x61\xe9\xfe\x82\xaa\xe8\x5f\xc8\x2d\xd8\xbb\xad\xd6\xf9\xde\x55\x91\x2b\x63\x3c\x7a\x9a\x15\x11\x11\x85\x17\x98\x89\x76\x21\xd0\xb3\x53\x88\xfb\x32\xab\xb2\xe2\x26\xf1\xbe\xdf\xbf\x83\xa2\xa7\x9b\x41\x78\x88\xac\x89\x67\x93\xf1\xf9\xd0\x49\xe2\x26\x65\x8f\xf8\xad\x28\x7b\x42\x88\xde\x27\xf0\xf6\xfc\xf7\x8e\x4c\x7d\xfd\xf9\x23\x7e\x7a\xcf\x2e\x74\x51\x1d\x2b\x86\x32\x3f\x3e\xed\x3d\xff\xad\xa3\xc1\x8f\xe0\xbf\x9c\x9c\x3c\xff\xb6\x11\xff\x7d\x79\x72\xfa\xcd\xd7\xf8\xef\x1f\xf1\xd3\x37\x42\x3a\x1f\x94\xdb\x05\x0e\xf4\x0e\xf9\xb2\xc0\xeb\x88\xb6\x1e\x45\x98\x08\xa5\xdd\x8a\x79\x28\x62\x00\x98\xb7\xf5\x42\xa5\xfe\x97\x56\x5e\xd5\x85\xcc\x91\x6d\x30\xc6\x1f\xe6\x47\x9c\x23\xc7\x13\xb7\xf8\x3f\x3a\x38\xac\xc5\x96\x6f\xfb\xa5\xc4\xeb\x45\x51\x10\x33\xe4\xf0\x24\x7c\xf9\x08\x05\xf0\x41\xb6\x11\xd4\x23\xdd\x98\xfd\xf7\xd8\x07\x9e\x15\x40\xa3\xcc\x2a\x15\x1a\xc1\x48\xf6\x67\xc4\xfd\xed\x36\xea\x39\x45\x48\xbe\xac\x07\x31\xf6\x7e\x30\x9f\x7c\xa3\x02\x30\x27\x4d\xaa\x0a\xe9\x06\x00\x38\xa6\x81\xe8\x85\xaf\x2e\xea\xca\x05\x00\x81\xe6\x61\x91\x67\x37\xac\x6f\x80\x8f\xd2\x7d\x97\x80\xa3\xbd\xaf\x5f\x18\x9d\x88\x54\x01\xe7\x67\xe3\x9b\x1e\x33\x0b\xe2\xc6\xe1\xf7\xbf\xde\x15\xff\xef\xfd\xe9\x3d\x7b\x33\x3b\x3f\x3e\x3d\x3e\xcb\xed\xd1\x3a\xa6\xe0\xe5\x6f\x7b\x01\x3c\x22\xff\xbf\x79\x7e\xf2\xb2\x25\xff\x5f\x9e\x7e\x95\xff\x7f\xc4\x4f\xc0\xe2\xb5\x3c\x12\xff\xfe\x7a\xd0\x9f\xfe\x07\xf1\xef\xcf\x26\x97\xd7\xd3\xe1\xdb\x77\x73\xf1\x6e\x32\x3a\x1f\x4c\x67\xff\x61\xaf\x61\x7d\x30\x0e\x56\xc6\x79\x0f\xf0\x9b\x45\x56\x00\x26\xa9\x2e\xd7\x86\xf8\x22\x74\xe9\x88\x4b\x42\x17\x29\x92\xd4\x78\xc2\xaf\xd8\x31\x1d\x01\xac\x86\x01\x04\xfb\xd2\x5a\x55\x9c\x82\x14\x77\x0a\x2e\x97\x10\xcc\x8c\x78\xfe\xc1\xa6\x80\xe0\xc9\x42\xdf\xb5\xd1\xd1\x13\x86\x2b\x37\x60\x87\x86\x5f\xa3\x88\xae\xef\x4a\x9a\x99\x65\x2e\xb3\x35\x55\x63\x9f\xb6\xbb\x90\x15\xe1\x2c\x70\x17\x18\xc5\xfb\xb7\xee\x05\x1b\xef\x0d\xb7\x38\xe2\x95\xe2\x85\xc5\x74\x12\xc6\xcf\xb1\x33\xc0\xc2\xae\xf7\xf6\x66\x5f\x90\xc2\x91\xb3\x61\xe8\xd0\xf9\x71\x30\xb7\x3a\x0f\x92\x5f\x38\x7c\xd5\x4e\x21\xc1\xc0\x34\x02\x43\x76\xe7\xa7\x70\x56\x87\x0c\x73\x3f\x82\x8c\x90\x46\xae\x48\xa1\x8f\x39\x02\x1b\x26\x87\x24\x61\x82\x89\xe3\x72\xb6\xe6\xd2\x4a\x66\x79\x8d\x60\xb4\x46\x56\x99\x59\x31\x6a\xef\xae\xb1\x1e\x71\x42\x45\x90\x6f\xb2\x96\x1f\x55\x82\xee\xf6\xb5\xb4\xbd\x82\xd0\xaf\x06\x48\x56\x08\x5e\xe7\x79\x42\xff\x9b\xad\xb1\x9a\x1c\x7c\x43\x2e\x8f\x02\x13\xae\x78\xcc\xc6\x85\x13\x10\x28\x17\x5c\x12\x79\x48\xa3\xa2\x4c\x00\xdc\x6d\xa7\x90\xfa\x04\xfb\xc1\x24\x0e\x16\xdd\x11\xb2\xd3\xe4\x23\x37\x2f\xff\x36\xa1\x46\x61\x52\x16\x2e\xdc\xd8\x58\x44\x1d\xe5\x61\x04\x28\xcc\x84\x06\x9e\xe5\x5b\x91\x15\xab\x32\x2b\x6e\x90\x52\xd5\x1e\x89\x43\x09\x01\x89\x2c\x8e\x4b\x1f\x9a\x23\x74\x1b\xe4\xec\x76\x70\x5f\x33\xb8\xdd\xe3\x6f\x1b\x62\xa9\x2a\x8e\xdd\x5f\x90\x5f\x39\x0d\x16\x27\x8c\x8f\x26\x81\x24\xd2\x65\x78\x04\x8f\x84\xcc\x75\xa1\x5e\x13\xbb\xcd\xe1\xe2\x88\x50\x8d\x43\x7e\x8c\x8e\xee\xba\x43\x02\xe8\xc6\x7a\x45\x08\xa0\x90\xe8\x52\x69\xd2\x83\x5b\x21\x62\x78\x53\x1a\xdb\x51\x02\xe9\x7e\xc2\xd4\x5a\x75\x3b\x11\x24\xf7\x10\x2a\xb8\x91\xa8\x00\x38\xcb\xb6\x49\x8a\xeb\xf3\x3c\xa0\x46\x6c\xf8\x2b\x7e\x58\xa8\x0c\x77\xae\x14\xb3\xac\x45\x7b\xb9\x83\xb5\xd9\xeb\xbc\x41\xc3\x86\x09\xeb\x02\xba\x89\xb0\xa3\xbd\x3d\x64\xc5\x12\x32\x64\xa2\x06\xe5\x31\x45\xc9\x67\x8f\x2a\x1f\x77\x60\x0b\x80\x0e\x50\x3a\x62\x1c\x60\xec\xde\x87\x99\x71\x49\x53\x6d\x71\xe1\x13\x49\xdd\xd7\x01\x73\x12\x3c\x27\x7c\xf5\x28\x53\xe9\xcd\x46\x41\x5e\x9d\x3b\x8a\xbd\xbd\xf3\xe1\xec\x6c\xd4\x1f\xbe\x1f\x4c\xf7\xd0\xef\xdd\x15\xb7\x7a\x73\x0d\x8e\xef\xd6\x0d\x09\x91\x8e\xb3\xc9\x18\xa3\x32\x93\xe9\xcc\xf9\x7e\x20\x20\x33\xbe\xee\x08\x4f\x05\x7e\xa0\x28\x52\xf5\xe6\x6a\x2e\xc6\x13\x8a\x54\x0d\xce\xc5\x7c\x92\xc0\x47\xdb\xaf\x89\xc9\x45\x33\x30\x05\xdf\x7b\x2c\x30\x05\x31\x29\x37\xde\xf3\x9e\x18\x8e\xc5\x78\x02\x01\x87\x39\xf9\xf9\xbb\x47\x89\xee\x2a\x3f\x48\x1f\xb3\xd9\x1d\x8d\x09\xa3\x2e\x2e\x14\xe3\x62\x2f\x09\xb5\xe9\x03\x36\x2e\x1a\x73\xf8\xc8\x9c\x5c\x4e\x27\x67\x57\x53\x08\xa9\x60\xd0\xe3\xcd\x6c\x3e\x9c\x5f\xcd\x07\xe2\xed\x64\x72\x0e\x9d\x9d\x0d\xa6\x3f\x0e\xcf\x06\xb3\xd7\x10\x05\xc1\x78\xda\x20\x11\xe7\xfd\x79\x1f\x3e\x7c\x39\x9d\x5c\x0c\xe7\xb3\xd7\xf6\xdf\x6f\xae\x66\x43\x98\x35\x80\x21\x99\x5e\x5d\x02\x80\x8a\x78\x37\xf9\x30\xf8\x71\x30\x15\x67\xfd\xab\xd9\xe0\x1c\xa6\x17\x82\x97\xd7\x1c\xc9\x0a\xc3\x27\x3e\xb4\x83\xc1\xa0\xf9\xb4\x6f\xa7\x60\x36\x9f\x0e\xcf\xe6\xe1\x63\x93\xa9\x98\x4f\xa6\xf3\x60\x8c\x62\x3c\x78\x3b\x1a\xbe\x1d\x8c\xcf\x20\x16\x04\xc1\xaf\x0f\xc3\xd9\xe0\xc8\x05\x9a\x86\x63\x0a\x58\x5e\x8b\xc9\xd5\x9c\x43\x3f\x57\x18\xc1\x8b\xb6\xac\x8f\x1d\x3d\x21\x4e\x44\x61\xa1\xaf\x56\xdc\xff\x07\x7f\x7a\xcf\x7e\xd9\x6c\x7e\xdf\xf2\x8f\xc7\xec\xbf\x97\xdf\x7e\xd7\xc2\x7f\xfd\xe6\xe5\xb7\x5f\xed\xbf\x3f\xe2\x87\x02\xfc\x20\xbd\xad\x7c\x18\xfc\x52\x95\x6a\xad\xfe\x9d\x18\xc9\x85\xb8\xac\xf3\xfc\x52\x96\x46\x95\x7b\xb1\x9d\x68\x57\x0a\xb4\x88\x79\x59\x9b\x4a\x61\x0c\x6d\x58\xa4\x99\x2c\xa4\xb8\x2a\x32\x70\x0c\x55\xdb\x9e\xe8\xe7\x39\xdf\xf5\xa5\x23\xc0\xff\x07\x34\x25\x8f\xb0\xa7\xbf\x95\x39\xa9\x9c\x1d\xc7\xb9\xcb\xf4\x8a\x83\x6e\x89\xea\x08\x1e\xb3\xfc\x02\x7b\x8f\x08\xa0\x19\xa6\x9b\xb4\x1e\x40\x1f\x38\xed\x1e\xc4\xef\x67\x90\x3e\xda\xad\xdf\xd0\x3a\x85\x11\xbe\x38\x82\xa0\x79\x03\x03\x9c\x93\x19\x91\x20\xa5\x63\x06\x60\xc8\xa1\xc2\xea\xf7\x43\x90\x6c\x6b\x5b\xc4\x3a\x26\xf0\x0b\x13\xc4\x1d\xbf\x67\x82\x30\xa0\x02\x74\x56\xef\xe1\x6d\x6f\xfc\xe8\x18\x61\xbe\xf3\x0a\x33\x1d\x23\x66\xa5\x4d\xae\xa4\x51\xe2\x2e\x33\x59\x25\x28\xb4\x79\x7f\x7f\xdf\x53\xf8\x76\x2f\xc3\x86\x7b\x2a\xad\x9f\xed\xdb\xae\xf5\xf3\x4a\x95\x85\xc4\xa4\x71\x5a\x20\x3f\x04\x74\x43\x4b\x88\x6c\x2a\x59\xb6\x6b\x5d\xc0\x89\x8e\x16\x28\xd8\x97\x77\xaa\x44\xcb\xa1\xba\xcd\xca\xf4\x18\x23\xdc\x71\x7b\x46\x14\xb6\xbb\x50\x43\x03\xad\x62\xd6\xfd\x11\x9c\x7e\x40\x23\xdf\x8f\x87\x9f\x99\x6a\xbb\x0f\x9f\xe8\xf8\x43\x34\x2f\xfb\x71\x0a\x31\x70\xf6\x41\xca\x43\xaa\x4b\xa3\x28\x66\xbe\xd6\xc8\xd3\x65\xd7\xc2\x60\x4e\x9d\x4a\x99\xce\x37\xb0\x98\x9d\x64\xd8\x40\x0e\xc3\x7d\x69\x65\x41\x11\xc4\x3c\xf1\x9d\x2e\x19\x75\xd1\xf9\x7c\xc2\xab\x03\xe9\x9f\xcb\x47\xd7\x07\x33\x3d\x81\xe4\xeb\xd1\xbe\x86\xb1\xf2\xce\xe9\x83\x89\x2d\xa0\x26\x6a\xbb\x63\x82\xc3\x25\xce\x4a\x78\x23\x79\x7c\x12\x28\x52\xd0\x35\x0d\x1d\xbb\x98\x8e\xa4\x01\x8b\x4d\x01\xd2\x8f\x84\x7a\x6b\x27\x59\x43\xf1\xe8\x0e\xb0\x0b\xa4\xb0\xc9\x49\x79\x1c\x15\x65\xab\x78\xc3\xd2\xc3\x59\xc8\x9c\xd8\xd8\xaa\xad\xf0\x6e\x01\xff\xa4\x2a\xaa\x5d\xbd\x64\x31\x84\x84\xec\x39\x27\xa5\xb1\x09\x5b\xaa\x65\xb6\x01\x6c\x15\xa8\x54\xc0\x27\x39\xf7\x85\xd8\x08\xc2\x6f\x78\x22\x23\xee\x3e\x33\x85\x3c\xdc\xdb\xc8\x94\xa4\x6b\x75\x80\xb9\x61\xb3\x79\x7f\x7c\x3e\x13\xf3\x77\xfd\x79\xb7\x51\xc9\xa6\xa2\xbd\x85\x3f\xbc\x1b\x9e\xbd\xb3\xc6\x58\x60\xe5\xf5\x67\x62\x3e\x11\x67\xfd\x4b\x34\x1f\x28\x6f\xa0\x7f\x76\x76\x35\xed\x9f\x5d\x83\x31\xf7\xbe\x7f\x3e\xe8\x81\xd1\xd5\x1f\xf7\xc5\xd5\x78\x08\x28\x08\xf3\x6b\xf1\x76\xf8\xe3\x60\xd6\x6c\x6f\x7c\x2e\xde\xf7\xff\x09\x7f\x1f\x27\x5a\xb6\x7b\x79\x31\x1d\x80\x81\x11\xa6\x43\x92\xc1\xe1\x52\xf1\x2e\xfb\x73\xc8\x6b\x73\x06\x63\xe2\x4c\x18\x81\x19\x8d\x83\x79\x7f\x7a\x2d\xe0\x6f\xb3\xce\x7e\xba\xfe\x04\xfd\xec\xee\xcb\xc5\x74\xf2\x5e\xec\xbf\xb9\x7a\x3b\xdb\x4f\xc4\xfe\x8f\xc3\xe9\xd5\x6c\x00\xff\x9c\x4f\x27\x3f\xf4\xc7\xe2\xdd\x64\xea\x7e\xd1\xbf\x14\xe7\x93\xc9\x14\xfe\xeb\xc3\x64\xfa\xde\xfe\xc3\xf5\xec\x5d\x7f\xfa\xfe\xe2\x6a\x24\xce\x26\x76\xee\xdc\x9a\x61\xf6\xe4\x0c\xf5\xa1\xf1\x7c\x38\x1d\x40\x16\x25\xad\x02\x58\x51\x83\xe9\xc5\x64\xfa\xbe\x0f\xa6\xda\x45\x94\x7b\xf9\xcc\x2e\x8c\xcf\xb6\x7c\xdf\x9f\x0f\xa6\xc3\xfe\x68\x96\xc0\xa4\x77\xbc\x6f\x7f\xfd\x63\x7f\x34\x3c\x27\x93\x6c\x38\x86\x3f\xc1\x5a\xbc\x1d\x8c\x07\x53\x68\x07\xb2\x40\xdd\x87\x7e\x3b\x5b\xad\xf7\x2c\x55\x9b\x52\x41\x35\xec\x5f\x46\x6f\x2f\x47\xc7\xa7\xbd\xe7\xff\xc3\x6f\x6b\x10\x3c\xac\xff\x7f\xfb\xfc\xe5\xcb\xa6\xfe\xff\xf2\xf4\xf4\x6b\xfc\xe7\x0f\xf9\x01\x36\xa5\xe1\x9b\xa9\x3d\x9c\xb8\xdb\x46\xe2\xf2\xea\xcd\x68\x78\xc6\xe7\x61\x8f\x53\xbf\x4e\x13\xf1\x43\x5d\x28\x71\xf2\xfd\xf7\x27\xa1\x3d\x70\x76\x04\xbf\xda\x49\x0c\x85\xb5\x17\x7b\xdf\xd8\x27\x64\xf1\x31\xcf\x0a\x31\xab\x12\x71\x91\xad\xaa\x5b\x71\x91\x6b\x5d\x26\xe2\x8d\x36\x95\x7d\xf2\x7d\x5f\x3c\x3f\x3d\x39\x79\x7e\x7c\xf2\xe2\xf9\x49\x22\xae\x66\xfd\xbd\xc1\x9d\x2a\xb7\xba\x50\x4c\xc7\x84\x4a\x3e\xd4\x1b\xb7\x89\x66\xee\x54\xb9\x90\x55\xb6\x8e\xd2\xdc\x3b\xb8\x68\x31\x4c\x0e\xa5\x99\x56\x0d\x44\x22\x3b\xf0\x7e\x5a\xcd\xd0\x1a\x29\xff\x13\x68\x81\x19\x71\xd1\x67\x25\x68\xcd\xa0\x11\xb4\xf8\xcb\x98\x1b\xef\xed\xe5\xa8\x27\x86\xd8\x14\x53\x9d\x9d\x8a\x85\xc2\xac\x85\xac\x12\x37\x9a\xab\x25\xb8\x85\x53\x57\xf6\x58\xa6\xa8\xa4\xdb\x46\xfe\xe7\xbd\xcb\x52\xc9\xf5\x22\x57\x7b\x73\xef\x33\xc7\xac\xc5\xb5\x06\x54\x62\x2e\x73\x00\x7d\xd4\x57\x24\x62\x05\xe7\xbd\xdc\x62\x80\x7e\x55\x2a\x95\x5a\xf5\x43\x23\x65\x2b\xc6\x65\xb0\x20\x35\xab\x7a\xe2\xcd\x96\xe8\x1a\x0c\x51\xd9\xee\x4e\x56\xf0\x45\x38\x50\xb0\x5d\x69\x71\x53\x03\x5c\x9b\x52\x8f\x7f\x0b\x6a\xe4\xb8\xd3\xc7\xc7\x14\x38\x11\xc4\x8b\x1f\xaa\xa8\x06\x9f\x85\x12\xd6\x3c\x67\x92\xe6\xd2\xf4\xf6\xe6\x91\x97\x37\x64\x19\xdb\xc5\x81\x16\xd0\xc3\x19\xbd\x56\x9c\xe6\x92\x6f\x69\xca\xc0\x27\xbd\x93\x08\xd0\xc7\x62\xa8\x98\xb5\xc9\xbd\x68\x9b\xbe\x87\x18\x0c\x1b\x79\x44\x60\x86\x15\x80\x30\xc1\xd7\xba\x06\x6a\x33\xda\x00\x44\x1b\x16\xb4\x00\x75\xa6\xbd\xbd\x0f\xb7\xaa\x10\xf7\xd0\x45\x09\xc1\x86\x68\xc6\x12\xfb\x27\xdb\x3d\x60\x65\x06\xe6\xe7\x4a\xf3\x84\x27\xb0\x6f\x37\x25\xd4\x80\x4d\xea\x5d\xac\x68\xa6\xb5\x57\xc2\x25\x90\x55\xcc\x9e\x17\x2c\x66\x67\xed\x4b\xd4\x3d\x71\x48\x4b\x5d\xba\x3a\x67\xab\xed\xaa\xf2\x0e\x58\x8e\x88\xca\x36\x33\xb7\x0c\xc1\x10\x70\xc2\x45\x1a\xa4\xd5\xcf\x64\x21\x6e\x54\x05\x27\x92\x5e\x94\x45\x25\x90\x6a\x99\x5e\xb5\xcf\xd0\xc6\x8a\x36\x8f\x2e\x61\x9e\x37\x99\x5a\x62\x2f\x33\xc8\x3c\x2d\xd4\x3d\xf6\x97\x78\x96\xcc\x6b\x4f\x0a\x6e\x9b\xb3\xe6\x8e\x6b\x37\x85\xd8\x27\xe6\xb0\x16\x37\x76\xdb\x69\x2e\x92\xc6\x95\x43\x75\x0f\x56\xa4\x50\xc1\x44\x46\xf8\x88\xd0\xf6\x4a\x97\x8b\x0c\x6a\xa6\x80\xdf\x58\x8b\x54\x15\x5b\x64\x8d\x83\x2f\x78\xc5\xd1\x6e\x2e\xf3\x91\x09\xe5\x4c\x5d\x96\xca\xe5\x63\xe2\x53\x10\xb3\x31\xcd\xaf\x10\x76\x03\x34\xce\x24\x8b\x84\xbb\x86\x78\x7f\x19\x09\x0d\xdb\x32\xd3\x98\xee\x2a\x65\xca\x99\xb2\x53\x97\xfc\x2c\xe5\x25\x65\x55\x6f\xef\x02\x6a\x9c\x25\xc2\xaf\x3e\xb9\x29\x8e\xc5\x00\x26\x27\x0c\x15\x0e\xb6\x58\x29\x15\xf0\xe0\x42\x45\x24\x26\x75\x91\xaa\x6e\xe0\xf0\x37\xcb\xe5\xef\x95\xb8\xb1\x1b\x74\xeb\x0a\x96\xed\xdb\x8d\x6d\x5c\xdd\xaa\x2d\x1c\xaa\xc4\x6d\xb1\x60\x5b\x35\x6c\x16\x97\x09\x05\x5c\xdd\xd2\x31\x71\xf9\xfa\x00\x1e\x49\x8b\xb4\x17\xf2\x99\x55\xa5\x18\xed\x02\x71\x41\x28\x74\x1e\x0c\xc4\x68\xdf\x2f\xe8\x86\x27\x06\xef\xfa\x0e\xc6\x69\xd7\x12\x88\x90\x71\x93\xbb\x56\xf3\x80\xbd\x1e\xc8\x93\x37\x59\x8e\xb7\x57\x4f\xf4\x8b\xd4\xf7\xd1\xdc\xea\x7b\xfc\x00\xed\x65\x88\xe4\x43\x4f\xd4\x16\xf7\x3b\x5a\x8d\xb4\xb9\xf6\xac\xd8\x58\xab\xea\x56\x43\xd9\x02\x83\x02\x14\x37\xe1\x96\x17\xb7\xd2\x88\xea\x5e\x0b\x53\xa9\x8d\x79\x25\x0e\x4f\x8e\x02\x9f\x51\x3c\x88\x22\x15\x87\xa7\x47\x14\x07\xc7\x1d\x1f\x5c\xc2\x18\x41\xbc\x81\x0c\x7a\x98\x7c\x75\x63\x0d\x2a\x6f\xa5\xd2\xe5\x1e\xc2\x36\xb0\xd7\x28\x28\x74\xcf\x99\x5c\xb1\x9f\x1b\x9d\xc0\xce\x82\x64\x04\xf7\x92\x2e\x0f\x4c\x80\x70\x00\x67\x16\xa4\x09\x9f\x59\x3e\x33\xb0\x40\x8a\xf5\x0c\x08\x2a\x9a\x4a\x16\xa9\x37\x74\xf1\x6a\x2a\xb4\xb8\xa7\xda\x36\x2f\xe7\x08\x82\x82\x28\xce\x87\xb1\x4a\x90\xc5\x85\xc7\xf6\x1a\xb2\x9f\x50\x39\x15\x54\x6e\xa4\x41\x63\xd3\x77\x2e\x03\x5f\xa9\xdb\x3f\x95\xe6\x05\xb3\x27\xc0\xed\x24\x90\xd4\xa4\xb3\x44\x8e\x45\x47\x3e\xc7\x1b\x0f\x90\x20\x98\x04\x36\x2b\xaa\x80\x81\x1b\x6e\x33\xe3\xcb\x06\x4b\xb5\x82\x2a\x65\xdd\x70\x56\xd2\xfd\x76\x20\x4a\xb5\xa9\x29\x65\xbc\xb7\x77\x61\xff\x96\xc3\x72\x6f\x23\x01\x8b\x5a\x13\x64\x8e\x16\x10\xe9\x2f\xec\x6c\x56\xf9\x16\xa7\x80\xa4\x35\xfa\x03\x4c\x4f\x7c\x50\x2e\x03\x11\x00\x01\xd0\xf7\x67\x77\x3e\xe5\x1c\x60\x8d\x67\xa6\x82\x04\x7b\xbb\x37\xe3\x3b\x08\x06\xe1\x21\x53\x72\x57\x4c\x10\x07\xba\xed\x85\x7b\x0b\xcc\x0c\x80\x22\xb9\xac\x3c\xe4\x0d\xd7\x90\xba\x51\x14\x48\xb1\xbe\x29\x33\x55\x01\x9d\xb5\x03\x30\x80\x4b\x41\xdd\x21\x67\x7a\x86\xb7\x81\x4b\x02\xb1\xd7\xce\x32\x57\xb2\x0c\xe6\x1f\xfb\x00\x87\x73\x11\x24\x41\xc0\x9e\xa5\x7d\x77\x40\x5b\xa9\x46\xdf\x17\x02\xd0\xd0\x73\x12\x14\xd3\xde\xde\x7b\xab\xfc\x59\x1d\xcd\x04\x05\xef\x5c\xa0\x04\x3a\x4e\xa0\x58\x00\x65\x61\x94\x8a\xea\x95\xcc\x9d\x6a\x5e\x42\xa7\xf3\x1e\xb0\x1c\x49\x59\xb0\xdd\x04\x82\x2e\xf4\x09\xc1\x25\x4a\xe9\xb3\x91\x42\x06\xc6\xc4\xd3\x95\x32\x3e\x7e\x81\x36\xe6\xba\x1f\x37\x6f\xc7\xf2\x73\x9d\x55\x8a\xe8\x8e\x5d\x1a\x6a\x34\x2a\xc8\xf2\x58\xf0\x65\x00\x2e\xab\x94\x74\x80\x55\x9d\x13\x72\x4c\xaa\x8b\x03\x44\xad\x5e\x2b\xb7\x40\x70\xd9\x23\x56\x01\xab\xfc\xc0\x39\x2d\x03\xc7\x3d\x7d\x84\xab\x4a\x40\x33\xc7\x64\x60\xb7\xfa\x52\x18\xb5\x91\x40\x38\x49\x4c\xb3\x79\x50\x9f\x11\xaf\x0f\x7e\x87\x8f\xf3\x22\xaf\x4b\xe7\xf3\xce\x0a\xac\x1a\xba\xb7\x9b\x01\xf7\x32\x88\xab\x85\xaa\xee\x95\x2a\x48\x06\x12\x6d\xbe\x4c\x53\xd2\x07\x65\xc4\x66\x69\xb2\xf5\x26\xdf\x8a\xda\xf0\x0d\x31\x22\x76\xfd\xc6\x2d\x27\x83\xdb\x9a\xbc\x87\xce\x2c\x8a\x84\x3a\xe0\x66\x91\x22\x8d\x29\x23\xe1\x17\x5a\xf2\x3f\x33\x42\x16\x32\xd7\x37\xba\x86\xc5\x2e\xeb\xa2\xc0\xcf\x37\x76\x12\x0c\x22\xe0\xa8\xa3\x5f\x87\x78\x06\x85\x90\xa2\x52\xbf\x80\xdf\x0d\x2a\x57\xe0\xc2\x30\x7e\xe3\xd9\x1b\x55\xa5\x84\x1c\x05\x89\x42\x99\x09\x69\xde\xef\x75\xf9\x31\x11\x32\xa8\xc9\xf6\x76\x17\xc9\xb8\xa8\xf3\xf1\x61\xe9\x66\x19\xae\xac\x80\x33\x02\x20\xd0\xc1\x8b\xde\xdb\x7b\x43\xa6\x1e\x5b\x9d\x76\x55\xed\xf1\x0b\x16\x35\x09\xe6\xeb\xb1\x2f\xac\x74\x68\x6a\xa4\x59\x8a\xd0\x1d\x20\xb6\x10\xba\x83\x1d\xe4\x1e\x9e\xea\x56\x96\x50\xb4\xc4\x56\x27\x98\x8b\x1c\xb1\x28\x7d\x2b\x9c\x47\x1f\x1c\xb8\x0f\xe0\xeb\xa6\x60\x0a\x29\x5c\xf2\x23\x82\xf1\x70\xe8\x67\xcd\xa8\x41\xf8\x59\xfc\x9a\xdd\x98\x95\x2a\x7b\x7b\x6e\xc5\xea\x82\x15\x55\x38\xd3\xb8\xf1\xf4\x0a\x12\xba\x22\x55\x9c\x50\x13\x52\xb5\x29\x59\x09\x04\x73\x0f\xa7\x10\xf2\xdb\xf8\x49\x02\x00\x58\xa8\x42\xad\xb2\xe0\xf8\xe3\x35\x50\xc9\xaa\x6e\xe8\x9f\xc8\x31\xad\xd6\x46\xe5\x77\x4e\xa0\x3c\x2c\x9e\x70\x93\x7b\x13\x17\xfd\x0d\xe1\xfc\x75\x0e\x82\x0c\xbe\x40\x13\x00\x01\x7c\x7f\x9b\xe5\xc4\xdc\x5e\xde\x39\x6d\x8a\x4d\x2b\x00\xf4\x82\x6a\x7e\xae\x4d\x0c\xdb\x0b\xec\x9b\xb8\x59\x9f\x86\xd7\x00\x0d\x80\xb1\xf6\xc4\xe1\x07\x12\x46\x40\x24\x6e\xc5\x05\x28\x83\x5a\xc8\xe5\x6d\xa6\xee\x28\xaf\x5f\x5a\x1d\xe3\x46\x96\xa9\x71\x4a\x66\x56\x30\x72\x19\xa8\xb2\xe8\x21\x71\x92\x0d\x5f\x4e\x69\xbb\x77\xbc\x0b\x81\x44\x74\x8d\xaf\xea\x62\x59\x85\x94\xdd\x4c\x83\x8d\x51\xa3\x5b\xbd\x51\x81\xf4\xcb\x48\x01\xc9\xad\xb4\xb6\x66\xad\x34\x88\x59\x0b\x73\xce\xbe\xf7\x78\x12\x50\xfa\x6e\xac\x9a\x64\x76\x24\xaa\x22\x2c\xd1\x66\x0b\xa7\xa1\x15\x6f\x8e\xb8\x41\x30\x1c\xd8\x13\x97\x72\x2b\x96\x39\x18\xf4\x15\x33\x55\x72\x7d\x0a\x5d\x3b\x4b\x2f\x85\xa5\xd8\x87\xcc\x40\x17\x2e\x08\x44\x20\x06\xc0\xf8\x09\x18\x28\x55\xcc\xf8\x47\x30\x0d\x8f\xa8\x4f\x09\x63\x84\x48\x86\x1b\xa1\xa3\xc8\xa0\xb2\x5b\x0a\x2b\x97\xed\x99\xc3\x64\x50\xfb\x15\xbb\x6b\x6e\xd0\xda\x6a\x5a\x15\xbd\xbd\xb1\x26\x52\x63\xba\xe0\x1c\xfc\x3d\x9a\x63\xac\xad\x76\x56\xd0\x3c\x26\xa5\x4a\x09\x1f\xad\x6e\x65\x81\xaf\x58\xdb\x9f\x0a\x8a\x74\x61\x2f\xca\xc1\xf4\xbd\x4b\x8f\xe3\x42\xc7\x0b\x48\xfa\xba\xbc\x86\xdc\x2e\x0f\x66\x00\x89\x55\xe7\x44\x7f\x73\x06\x4e\xf0\x3d\x21\xc4\x73\x77\x7a\xf1\x9b\xbe\xf8\x39\x50\x27\xa0\x86\x97\x05\x21\x0f\x09\xb5\x19\x37\xbd\x8e\x7b\x79\x93\xcb\xa5\x1f\x63\x57\xca\x21\x61\x5e\x10\xed\xbb\x4a\xa9\x00\xd8\xc8\x2d\x79\x0c\x11\xca\xec\x41\xf8\x1b\x8f\xa1\xf2\xa0\xd4\x39\x04\xbe\xea\xa5\xcc\x73\x95\x8a\xfd\x10\x8d\x63\xff\x88\x8a\xa1\x49\x91\x50\x94\x08\x5a\x2a\xb0\x1b\xa4\x11\xfb\x5b\x5d\xef\x43\xf0\xb1\x2f\xf6\xdd\xf6\x23\x7a\x6d\xc1\x20\x63\xe8\xac\x74\xb3\xe3\x4f\x28\x99\x55\xa9\xac\xac\x5e\x60\xb5\x17\x95\x02\x8c\x91\x71\xbb\xa1\xb8\x53\x85\xb5\x45\xf2\x2d\xdf\xb3\xa8\x38\xb4\xef\x6c\x23\x0e\x5d\x79\x18\x6a\x0a\x4e\x8c\x47\x5f\x84\xcf\x1d\xc1\x61\xd7\xe5\x3a\xb8\xb6\x11\xbe\x6d\x8e\xe5\xc5\x38\x94\x04\xf0\xa9\xee\x13\xf4\x7d\xc5\x00\x49\xad\xd5\xd6\x25\x66\xeb\x62\x2f\xac\xc1\xba\xb0\x47\xb5\x73\x89\x58\x70\xf4\xec\xc4\xb5\x4f\xf2\x28\x9e\x4a\xaa\xc5\x0d\xdd\x8e\x14\xc9\x0c\x74\x0a\x68\x05\x3f\xe0\x77\x54\x2e\xef\x5f\x39\xe4\x51\x48\x36\xb7\x4a\x06\x3e\x1b\x40\x0b\x35\x5b\xe6\x8a\x39\xf4\x63\xb9\x62\x60\xe7\xe0\xa6\x64\x98\x06\xee\x0c\x2d\xa7\xf3\x0c\xa5\xc2\x54\xa5\xb4\xfd\x58\xe9\xf2\x5e\x96\x29\x24\x02\xc3\x1c\x92\x2b\x93\xea\x84\x7b\xe2\xf0\x1d\x20\x8c\x82\x03\x22\x89\x70\x41\xe1\x52\x0c\x92\x2c\xac\x8e\xe8\x8b\x87\x59\xf8\xdb\xc9\x14\xfb\x61\x77\xf6\x7b\x47\x21\x82\xe7\x12\x10\x3c\x51\xe2\xc0\xe8\x71\x66\xd1\xe4\x02\xc7\x26\x9a\x1a\x6b\xbe\x36\xe0\x21\x44\x06\x05\x05\x22\x1e\x6a\xa5\x41\xad\xbd\x08\x25\x58\xe2\xdd\x32\x51\xe2\x0e\x9e\x06\x72\x29\x85\x7f\x61\x3f\xf3\x5a\xa7\x35\x90\x0a\x55\x4e\x56\x24\xc4\x42\x53\x6c\xad\xb5\xa0\x97\x19\x83\xf3\xa8\x72\x25\x81\xe5\x86\xe1\x6f\xf9\xc2\x84\xe7\xe1\x0b\xcb\x32\xdb\xa0\xe7\x9a\x22\x15\xd6\xec\xce\x23\x66\x20\x04\xa8\x30\x95\xcc\xf3\x30\x11\xdd\xcb\x6c\x7b\xa2\xad\x9e\x87\x5e\x3c\xed\x85\xec\x13\x6f\x35\xae\xff\x8b\xc4\xb9\x97\x2c\xaf\xd1\xf0\x00\xbf\x69\x5d\x99\x0c\xec\x56\x83\x60\x85\x78\x35\x49\xc4\x65\xf0\x8a\x3b\x2b\xec\x5e\x83\x1d\x79\x37\x07\xfa\x0f\x58\xe9\xa3\x32\x87\xba\xda\xd4\xa4\xaa\x61\xda\x7a\xe8\x22\xe0\x8e\xc1\x15\x96\xad\x04\x91\x81\x80\x57\xc0\x11\x2f\x40\xf1\xe9\xce\xd3\x29\x0e\xb3\x22\x55\x1b\xab\xaf\x15\x0e\xb2\xc2\x69\xe0\x41\xff\xc0\x82\xd0\x3a\x87\x05\xa7\xca\x7e\x91\x55\x47\x3d\xf1\x81\x5c\x94\xee\x84\x96\x80\xf4\x6f\xdb\x34\x02\x38\xf8\x29\xd5\x81\xdb\x82\xec\x06\x4c\xa1\xa1\xbf\xf0\x98\xe2\x7b\x3e\x7c\xbe\x47\xf5\x4a\x8c\x73\xf0\xe4\xd0\x95\x6b\xe6\xc0\x74\x6f\x6d\x69\x22\x6f\xba\x95\x14\x0c\x2a\xa8\xd2\xac\x6e\x41\x7e\x6d\x89\x14\x6f\x93\x2d\x6b\x5d\x1b\x86\x48\x74\xc4\xc1\x60\x55\xd8\xdb\xc9\xdc\xda\xd1\xbb\xea\x1e\x21\x8b\xf0\xa9\x36\x66\x32\x8d\x86\x13\xc2\xf4\xca\xb9\xca\x5e\x8b\x8f\x4a\x6d\xec\xc9\xb1\x3b\x8a\x4f\x21\x83\x87\x11\x24\x31\x15\xcc\xb4\x10\xc7\x48\xff\x92\x0b\xa3\x08\x27\x12\xe0\xc3\x5c\xd3\x8d\x49\xdc\x85\x5d\x06\x08\x87\x01\xee\x84\x3f\x63\x6e\x49\x30\x7c\x01\xbe\x69\x07\xa7\xb0\xb9\xdd\x9a\x6c\x69\xad\x4e\x3c\x0b\x5c\xad\x53\xe2\x81\x40\x27\xa5\x64\xd7\xab\xdc\x0a\x49\x51\x02\xbd\xa1\x33\x6d\xc7\xe5\x7c\x86\x01\xda\x6a\xd6\x80\x86\x85\xef\x72\x4d\x19\xf7\x89\x9c\x9d\x5b\x44\x9d\xdb\x6c\xb1\x12\xa2\x63\x77\xf0\x5d\xd4\xb8\x33\xc0\xd3\xc5\xae\xad\x07\x8e\x51\x42\xca\x73\x7b\x53\xc2\xa9\x6d\x41\x9b\x05\xf7\x5c\xa4\xeb\xcc\x68\x70\x27\x5c\xe9\xd1\xde\x7b\xa0\xe9\xac\x95\xc2\x8d\x80\xa3\x30\x61\xd5\x95\x03\xa4\x43\x63\xc1\x79\x4f\xf1\xc6\x80\x4c\x3e\xac\x05\x5f\x80\xbf\xa5\xa1\x01\x30\x5f\xe2\xe2\xc8\x07\x08\x7c\xd1\x38\xfa\xe8\x5d\x93\x56\x32\xcb\xb2\x44\x33\x3a\x03\x12\x1e\xde\x95\xd6\x9e\x74\xa0\x3f\x70\x66\x60\xa9\xd2\xa0\x19\x97\x05\x49\x58\x38\x50\xba\x02\x4f\x71\x27\x96\x9d\x9d\x00\x78\xca\xe8\x8a\x43\x45\x2b\x74\xf6\x15\x9a\xf7\xa3\xbd\xaa\xe1\xc4\x64\x65\xea\xa0\x70\x76\xab\x99\x1e\xd2\x59\x08\x91\x1e\x89\xe1\xca\xee\x2c\xb9\x44\x8f\x0b\xdd\xd4\x6e\x02\x78\xf7\x04\xaa\x95\x53\xd4\x50\x09\x41\x67\x8a\x5e\xa1\x82\x88\x1d\x35\x35\xe8\xdc\x04\xb3\xd4\xa5\x07\x36\x24\x21\x7f\x3f\x09\x6f\x31\xc4\xb8\x96\xe5\x0d\x56\xcf\x93\x23\xfc\xfe\x56\x15\xd1\x3b\xa8\x7c\xdc\xe9\x8f\xf6\x4e\x01\xa0\xbb\x6d\x14\xf8\x91\x00\x90\x07\xe4\x3e\xb7\x42\xad\x56\xba\x24\xdc\x24\x17\x11\x4a\x78\xd8\xe8\xaf\x6d\xf4\xd8\xe5\xaa\xc1\xa8\x48\xaf\x0c\xe7\xa0\x42\x64\xea\xa8\x4f\xa6\xb2\x06\xab\xde\x28\x6b\x7b\x13\xdc\x13\xa1\xfe\x1a\xb8\x16\x20\xb3\x92\x81\x33\x01\x4d\x15\xb1\x86\x44\xa9\xd6\x60\x87\x10\x42\xf9\xaa\xce\x79\xb1\x0e\xa3\x08\x5b\xb0\x0e\x70\x77\x05\x16\xda\x12\x41\x7d\x84\xf9\xb9\x86\x90\xb0\xd6\x14\x9b\x91\xee\x2b\x7c\x97\x59\x1b\xb6\xb4\x12\xfd\x5e\xe5\xf9\x31\x28\x2c\xa0\xc2\xb4\xae\xcc\x60\x46\xe0\xee\x2f\xd5\x4a\x97\x2a\x11\xb3\x7a\x61\xe8\x4c\x9f\xa6\x0c\x9e\x63\xbc\x5f\x3b\x78\xef\xd8\x6d\x8b\xd6\xec\xa1\x1e\xc4\xfa\x87\xfb\x33\x7b\xc3\x51\x56\xca\xfc\x95\x55\x02\x1a\xbd\x69\xad\x4f\x46\x89\x0a\xc1\xe8\x1b\x2d\xe2\xe2\x74\xcd\x12\xaa\xa3\x1c\x48\x85\xb1\x60\x8a\xab\x2b\x79\xab\x5a\x12\x07\xe6\x15\x8e\x2c\xc4\x76\x90\x6f\x77\x95\xc1\xb0\x68\x6a\xe8\xfc\xc9\x8a\xde\x20\xbd\xab\x65\xc4\xc7\xc2\xd6\x5a\xcb\xec\x40\x96\x8b\x7c\xeb\x30\x94\x1b\x2b\x04\xbe\x5c\xf6\x2a\xa3\xa1\x4f\xbe\x1e\xf4\x6b\xd1\xa9\x68\xe2\xaa\x23\x9a\x31\x88\x87\x84\x71\x1e\x82\x61\xda\x5d\xe2\xba\x7f\xcf\xc7\x2a\x10\xfc\x10\x3d\x94\xa6\xf1\xe9\x9e\x78\x53\x57\xbb\x9e\x47\x97\xb9\x6b\x55\x1a\x77\x02\x68\x06\xb9\x74\xd0\x3c\x7c\x17\x35\x53\xbf\x9d\xac\x84\x36\xdc\xae\x29\x76\x0b\xc0\x84\xf2\x32\x42\xc4\xa3\x95\x33\xe9\xd9\x94\x36\x0e\x5d\x83\x30\xc4\xe0\xb4\x30\x7c\x30\x8a\x77\xf4\x5d\x83\x16\x04\x10\x27\x77\xca\x5e\x17\x76\x58\xe8\x02\x03\x50\x29\xab\xeb\xdc\x6a\x71\x6f\x6f\x77\x08\x96\xc3\x2e\xab\x4d\x12\xe4\x15\xd9\x0f\x64\x48\xd9\xce\x9d\xe5\x93\x65\xcf\xb4\xd5\x9a\x82\x84\x00\x50\x83\x4d\x94\x71\x00\x35\xa7\x60\xdb\x52\x56\xaf\x3b\xdc\x0b\xd0\x10\x5e\x93\x23\x26\x09\x3f\x85\x16\x27\xd1\x00\x28\x1f\x50\x0f\x8d\x92\xae\xe9\x0e\xfd\xe4\xa5\xf0\x48\xe5\xb4\x01\xbb\xd6\x8d\x01\xef\x3d\x6a\xda\x5a\x95\x4a\xc8\x9b\x1b\x3b\x53\xdc\x30\x9b\x9d\x30\x12\x48\xfc\xee\xd2\xea\x9b\x8a\x9a\x38\x64\x6b\xf7\x81\x8d\x73\x04\x90\x5b\x80\xfe\x8d\x8e\x07\x29\x4c\xa5\x4b\x79\xa3\x22\x0c\x6e\x90\x13\xa0\x1a\x07\x00\x33\xa5\x73\xc9\xfb\xde\xf9\x4b\x36\x00\x70\x6f\x5c\xb2\x2f\x02\xe8\xb2\x0d\x82\xc0\xe1\x19\x8b\x77\xe6\x93\x22\x6f\x60\x0d\x2a\x99\xb6\x94\x57\xb8\x96\x6f\xb2\x3b\x55\x34\x60\xd1\x28\xe4\x3c\xd7\x98\xb5\x92\x99\x20\x4d\x01\x70\x77\xbe\x40\xd9\x4e\xe2\x44\x85\xe0\x99\x27\x86\x0d\xef\x7c\x96\x60\x38\x10\xdd\x00\x7c\x3e\x04\x8d\xa4\x50\xf7\xca\xc3\xd7\x80\x3e\xf0\x40\x46\xdc\xee\x29\x83\x6b\x0f\x32\xe1\x23\xf5\xc0\x0a\x57\x44\x42\xdb\xe2\x98\xb8\x71\xee\x59\x90\x93\xd4\x3b\x12\xe7\x28\x1e\xd7\x31\xfb\x01\xa7\xc9\x15\xa4\xa2\xd2\x1c\xc2\xba\x4f\x8a\x25\x39\xd2\xf9\x29\xc2\x17\x86\xcb\xda\xaf\x15\x4b\x00\xc0\x20\xb0\x7d\x60\x9f\x2b\xc5\xb5\xed\x13\xe6\xc9\x93\x1c\x39\x3b\xf3\x5c\x18\x7b\x3b\x03\x5d\x35\x5b\x05\xa0\xbd\xc7\xfe\x28\xea\x18\xdd\x42\xf4\xd5\x9e\x83\xd1\x24\x43\x25\x03\x67\xc5\xaa\xce\xbd\x70\xe7\x98\x3c\xec\xb9\x10\x04\x1c\x53\xb5\x9a\x06\x76\x14\x80\x64\x05\x04\x6e\x9d\x48\x37\x7f\xf9\xb0\x11\xdc\x3c\xf4\x81\x1b\xac\x6c\x44\xef\xac\x26\x80\x67\x94\xcd\x8e\xd3\x23\x3b\xff\x0d\xf6\x99\x20\x26\x18\xf0\xa4\x74\x99\x2d\xc6\xda\x2d\x45\x2a\x4e\xa9\x20\xaa\xc3\x78\x61\xb8\x69\xbb\xac\x4e\x48\x39\xbb\x7c\xa9\x4b\xcc\xbe\x82\x88\x2c\xd1\xd9\x1c\x97\x4a\xa6\xa8\x2e\x84\x25\x5f\x78\x15\xf2\x65\xf6\x88\x0f\x79\x47\x07\x41\xde\x91\x2c\x5b\xd6\xa6\xd2\x6b\xac\xf4\xaf\x39\xb5\x20\x60\xb9\xa9\x54\x19\x18\x27\xc3\x55\x4b\xe4\x87\xd3\x96\x79\xb4\x6c\xb0\x60\xb1\x52\x6a\x69\xef\x3a\xde\x10\x58\xad\x1f\x86\xee\xc1\xa3\x4e\x87\xd0\xbd\x65\xb5\xac\x3b\x99\x83\x22\x13\x37\xd0\xf2\xc4\xb1\x9a\x04\x5a\x04\x34\x46\xb8\x1c\x19\x03\x6d\x7a\x95\xad\x91\x97\xd8\x68\x2b\x01\x55\xdf\x6a\x39\xf5\xcd\x6d\xc3\x74\xf2\x5e\xb1\xf5\x46\x81\xbf\xbd\xa3\x43\x0d\x77\x41\x30\x35\x8c\xe7\xde\x8f\xb7\xba\x8b\x2f\x14\xba\xb1\x4b\x1b\x56\x79\xa4\xe8\x2c\x6a\x38\x24\x61\x4e\x26\xde\xf0\xcd\xeb\x6f\xb1\x15\x0b\x85\xe5\x8b\x4c\xb1\x54\x46\xbe\x78\x70\xfb\x18\x8e\x20\x74\xc7\x9d\x46\x2e\xee\x34\x43\x57\x1c\x06\xc5\x33\x7b\xf8\x75\x4e\x99\xda\xee\xcc\x36\xbd\xda\xcd\xbe\x93\xf5\x8b\x86\x82\x58\xc9\x3c\x37\xce\x8f\xf8\xf0\x9d\xe9\x82\xc4\xb9\x4b\x48\x78\xa8\xbb\xed\xd9\x40\x4c\x3a\x30\x1f\x83\xc3\xcd\x22\xa7\x2b\xc8\xef\x24\x4a\x90\x8b\xed\x96\x2c\x46\xa6\xf3\xea\x44\x12\x45\xb6\x9e\x12\xcb\x8b\xd3\x0f\xfc\xec\xec\xf0\xc0\xf6\x9c\xe0\xfa\x16\x01\x32\x48\x5f\x87\xa3\xdb\x3c\x9e\x60\x97\x36\x03\x25\x90\x35\xfc\xc8\xf4\xc1\x6f\xb8\xca\x92\x8f\x6d\x10\xe8\x75\x13\x17\x8a\xf8\x48\x17\x0f\x25\x03\x3b\xc6\xd0\x1b\x83\x01\xb0\xc7\x36\x4b\xe3\x34\xc6\xc7\x1e\x37\x5c\xe8\x86\xa5\xac\xfb\xb2\x86\x3f\x2a\x9f\xb4\x6d\x4f\x09\xf8\xa1\x8a\x8a\x2d\x45\x0c\xa2\xa0\x29\x15\x9c\x07\x5d\x57\xf1\x30\x30\xa5\xd5\xbd\x91\x39\xf8\x60\x7f\x39\xc1\x0a\x56\xb7\xa5\x32\xb7\x3a\x4f\x7d\x7a\x1f\xfa\x3c\xb8\x3b\x98\x6a\x0d\x61\x67\x48\x23\x47\x8b\x7a\xb1\x15\xb9\xbc\x67\xc9\x8a\x9e\xee\x22\x4c\x0c\xc5\x55\x00\x47\x77\x51\x23\xfe\x73\x6e\x27\x5c\xae\x55\xa5\x4a\x6b\xa1\xc9\xca\xaa\xab\x65\xbd\xac\xea\x52\x89\x5c\x6e\xed\x61\x42\xdf\x2c\xc8\x4d\x80\xb8\x01\x5b\x70\x0d\xf1\x0a\xb9\x2c\xb5\x09\x7e\x91\x15\x79\x56\x84\x61\xb6\x43\x6b\x23\xd8\xdf\x21\xca\x8a\x15\xbd\x59\x21\x72\x55\xdc\x54\x98\x87\x4d\x8e\x96\xc0\x5b\x1e\x76\xd8\x2a\x04\x45\xe8\xcf\x6f\xda\x3b\xc4\xd6\x07\x5b\x07\xf2\x71\xf2\x6d\x7b\x27\xf4\xc4\xe1\xc0\xef\xd9\x38\xdc\x65\x95\x8f\x60\x67\x41\xf0\x64\xc7\x59\xc4\x04\x01\x34\xec\xad\xa8\x69\xdc\xfb\xdf\xa2\x61\x3f\xe1\xf2\xbb\xa4\xb9\xd8\x0f\xc8\x04\x0f\xb5\xd8\xb8\x4f\x76\xee\xfa\x07\xfc\x9e\xdf\x22\xa8\xb7\xda\x35\x64\xe7\x22\xc8\x8d\xee\x1c\x48\xd2\xe2\xc1\xe1\x18\x0d\xed\x6e\xe4\x9a\xcd\x3b\x4c\x24\xdc\xd0\x4c\xe6\xde\x27\xf1\x18\x20\x46\xda\x87\x9d\x22\x41\xfe\x59\xe7\xb6\x86\xf8\x33\x5e\x2e\x7c\xb7\x7c\xb1\x5c\xc6\x6c\x49\xa8\x2a\x6f\x87\x37\x77\xac\x6c\xd2\x56\x00\x79\x92\x68\x9e\x79\x8e\xd1\x09\x0e\x38\xeb\x4d\xbf\xb2\x5f\x0b\xca\xd7\x89\xe2\x60\xcd\x60\x22\xa8\x6c\xa0\x2d\xa9\xf2\x00\x89\x7a\x6a\xc3\xd4\x94\x56\x49\x57\x42\x15\x37\x59\xa1\x50\x83\x01\x61\xac\x16\xf5\x0d\x64\xc4\xb5\xfd\xe1\x3e\x88\xe0\x52\xd9\x9b\xee\x64\x9c\x2a\x1f\x4a\x89\x7c\xbf\xcd\xf0\x52\x46\x61\x43\x4c\x46\x74\x85\x0a\xe1\x23\xec\xdd\x81\x6e\x3f\x74\xbf\xb8\x6e\x91\xf3\xac\x3b\x3a\xe2\x92\x96\xa1\x43\x69\x8d\x8a\x1b\x93\x30\x32\x35\x9e\xe9\xe2\x05\x71\xe6\x66\x58\x5d\xdf\xa6\xd3\xd4\x71\xe0\x5c\xae\x35\x9a\xdb\xeb\x44\x48\x03\xce\x49\xf4\xb3\x81\xd5\x09\x71\x1e\xdc\xe7\x6c\x95\x43\x96\x14\x6d\xe1\xee\x11\x60\x0a\xb8\xeb\x4e\xaa\x85\x2e\x94\x0f\x2f\x60\x31\x47\x10\x5a\xe8\x3b\x4d\xde\x0d\xfc\xef\xd1\xe7\x5b\x43\xf4\x59\xb9\xce\x1d\xcc\xb9\x52\x40\x7d\xc3\x4b\xec\xbe\x7e\xf8\x98\x41\xd0\x6d\x03\x1c\x41\x04\xac\x2d\xf0\x22\xd5\x28\xd4\x14\xa3\xb3\xd7\x1e\x72\x6b\x90\x0f\x89\x00\x58\xbd\x50\x4e\x52\xf6\x41\xa4\x8a\x07\x6e\x05\x5c\x47\x7b\x5d\x07\x59\xfc\xe1\xa6\x86\x4b\x89\xeb\x23\x42\x69\xe2\x7c\xb2\xc1\xa8\x1a\xb9\x13\xcd\xa0\x46\x4f\x1c\x62\x29\x1e\xa5\xf3\x6b\x9d\x36\x3a\x72\x7f\xab\x7d\x85\x05\x22\xff\x61\xec\x19\x1c\x60\x8e\xdb\x96\xc2\x3d\x59\xd3\x45\x45\x39\xf3\x21\xc4\x9a\x55\x86\x40\x17\xd5\xae\x3e\x43\xb5\x3c\xda\x94\x2c\x18\xf5\x39\xf8\x1c\xde\x65\x18\xc2\xda\xb5\x4b\xa5\x73\x02\x82\xa1\x95\x08\xc0\x29\xc6\x38\x62\x25\x72\x25\x4d\x05\xaa\x8c\x12\x5b\x25\x4b\xa8\x31\xf3\x45\x36\x60\x5f\xe1\x89\xb2\x5d\x70\xf8\x1b\x04\x1d\x8f\xfb\x32\x70\xfc\x7f\x2b\x13\xbe\x2e\x30\x50\x49\x91\xa9\x42\x8b\xb5\xc6\x18\x4b\x41\xf3\x87\x48\x21\x14\x09\x71\xb7\x7c\x0c\x32\xe9\x42\x63\x1d\x36\x68\xb8\x85\x7f\xb5\x01\x8a\x31\xd7\x87\x0d\x4f\xb4\x9f\xfd\x88\xfd\x2c\x74\x98\xa1\x41\x38\xed\x47\x55\x3a\x9f\x92\xdb\x47\xe0\x84\x22\xd8\x45\x8a\xc3\xa7\x31\x85\x81\x09\xe7\x99\xbd\x3f\xae\xde\x8e\xdf\x35\x5c\x4e\x40\x1c\x4f\xde\x53\x03\x39\x2e\xe1\x91\x4e\x42\x83\x38\x4e\x9a\x79\xf0\xce\x8e\x64\x35\x24\x2f\x59\xbd\x13\x00\x78\x1a\xe9\xfd\x50\xdc\x46\x6e\x04\x46\x8b\xe1\xa3\x16\xba\x54\xec\x74\x65\x55\x90\xac\x2d\x77\x00\x8a\x37\x15\xff\x50\xc2\x41\x21\x1d\x02\x46\xb8\xae\x61\x4a\xbe\x77\x24\x11\x08\x49\xf8\xda\x61\x56\x70\x5a\xd4\x0e\xe4\x47\x27\xe0\xd6\xf2\x27\x70\x64\xaf\x37\xba\x80\x33\x7e\x48\xc7\xb3\x4c\xc4\x47\x55\x16\x8a\xaa\x03\x8c\xbd\x38\x8e\x9c\x42\x0c\x11\x3e\xb8\xf7\xb7\xa6\x52\x6b\xcc\x07\xc9\x96\xb7\xcd\x69\x28\xeb\xc2\x24\xa2\x46\x8e\x09\x57\xb3\x02\x9f\x72\x96\xc6\xd2\x97\xb1\xc4\x6f\xa3\xdd\x80\xf9\x84\xb7\x72\xb3\x51\x45\x90\x1a\x1b\x3a\x3d\xb0\x54\x37\xcd\x96\x15\x5b\x9f\x94\x81\x19\x16\x05\xea\x15\xf9\x2f\xc3\xca\x95\x46\xf6\x30\xc5\x83\x3c\xb2\x4b\x24\x67\x9a\xa3\x76\x0e\x03\xff\x7d\x74\xa2\xcb\xc2\xb0\xbb\x95\x53\xca\x17\x1a\x27\x7c\xed\xc2\xe3\x5e\x3b\xbc\x71\x04\xdf\x1d\x96\x7b\x1c\x4e\x62\x32\x31\x76\x15\xa2\x3b\x88\x83\xa0\x14\x87\x8d\x92\xa1\x1f\x4a\x12\x32\x59\xaa\x8e\x17\xdb\x63\x4c\x72\xb2\x16\xb3\xc9\x8a\x9b\x5c\x05\x51\xd5\x30\x73\x36\xac\xf1\x8d\x3e\xf6\x40\x36\x55\x4b\x8f\x35\x3c\x65\x54\x81\xe0\x12\xd4\xda\xaa\xab\x0b\xb1\xed\x14\x87\x9d\xa3\x0a\x38\x86\x76\xf6\x38\x33\x01\xd4\xac\x2b\x9e\xa7\x80\x75\xcb\xbd\xe9\x6b\x5f\xef\xf5\x63\x2a\x53\x73\x60\x7c\x31\x85\x0a\x2e\x88\xd0\x07\x02\x7d\x75\xe1\x0b\x34\xe0\xed\x46\x81\x75\x38\x14\x4a\x00\x7e\xa2\xc3\xb4\x6d\xeb\x04\x89\x21\x6f\x77\xeb\xe8\x9d\x23\x63\x74\x7d\xb9\xac\x70\xae\x7c\x60\xff\xd1\x58\x26\x04\x0d\x7f\x01\x56\x72\x54\x06\x15\x96\x26\xad\x32\x3a\x1e\x11\x83\x61\x30\x21\xa1\x48\x77\xf3\xc8\x34\x6c\xd7\x01\xdf\x0e\x06\x11\x98\xf2\xda\x40\xc0\x00\x77\x24\xa8\x51\x76\x58\x49\x83\x84\x36\xf2\xcd\x74\xa0\xb5\xba\x9d\xd1\xc1\x16\x8e\xac\x55\x55\xa5\xd6\x9b\x90\x0e\xda\x55\x6c\xfe\xea\x8e\x64\x46\xdc\xe9\x8c\xf6\x26\x68\x57\xb2\xae\xf4\x5a\x56\xd9\x12\x64\x14\x12\xc5\xda\x63\x12\x06\x45\xbb\x7a\xe8\xae\x22\xf6\xf9\x5a\x45\x0f\x6e\x5a\x77\x3b\x63\xb8\x04\xba\xc3\xf5\xdc\xcc\x6a\xd0\xd1\x64\x83\x57\x11\x4b\x67\x1d\x28\x83\xeb\x18\xdc\x1e\xe0\x39\xa6\x82\x20\xd7\x01\xcc\xfa\xe0\x3a\xb4\x80\x0a\x89\xe9\xcf\xae\x03\xbe\x06\x77\xab\x43\xcd\x06\xac\x4e\x23\x50\x97\x59\x0b\xc9\xa9\x0f\x90\x1c\x81\x0e\xe4\xe8\x22\x2e\x34\x5e\xa1\x50\x6b\x4a\xc0\xdb\xf6\xa5\xb8\xce\xb6\x93\xa5\xb8\x8a\x33\xcb\x32\x46\xb3\x0a\xa2\x4a\x5c\x90\x2e\x97\x1e\x4d\x6f\x53\xea\xdb\x6c\x01\xfc\x5f\xe8\x11\x73\x85\xe2\x94\x7f\xd0\x1e\x4d\x94\x6d\xb2\xd8\xc6\xa5\x6d\x51\xb5\x67\x2b\x32\x54\x6c\x1f\x88\x05\xa3\x2d\x98\x15\xc4\x88\x06\x5b\x06\x3f\xcf\x74\xd3\xcd\x10\x2b\x91\x5f\x80\xc7\x8d\x80\x27\xbe\xa4\xae\x04\x7b\xec\xbb\xdf\x98\xc2\x46\xdc\x3c\xf3\x54\x5f\x90\xdd\x0f\x98\xcf\xdb\x26\xd5\xe8\x97\x0e\xb9\x0a\x2b\xcf\x1b\xc7\x87\xb6\xbe\x01\x8f\x27\x95\x97\xf9\x02\x4a\x57\x03\x47\x8c\xff\x1d\x05\xd8\xc1\x31\x16\x71\x1d\xb6\xbb\x66\x23\xf8\xf8\x1d\x75\x39\xb1\xf0\xca\xd6\x90\xaf\x04\x05\xc4\x84\x8f\x17\x2b\x33\x45\x3c\x28\x73\xe0\x93\x19\x48\x38\x92\x20\x60\x44\xe8\x5b\x48\x62\x6f\x9e\x28\x82\x44\xa0\xe0\x2b\x92\xea\x71\x3c\x85\x48\xc9\xf0\x42\x0f\x22\x45\xcd\xd0\x35\x2c\xd8\x49\x4f\x0c\x57\xa4\xe4\x2e\x75\x81\xe1\x57\xca\x4b\x45\x6e\x39\xf1\x53\x4d\x48\x7c\x98\x5a\x1e\x24\x3f\x50\x15\x70\x0c\x2b\x46\x90\x08\x0d\x7e\x19\x71\x88\xf5\xbf\xeb\x8c\xc0\x6e\xf8\x5d\x63\x6a\x65\x8e\x92\x26\x90\x25\x4e\x24\xec\x09\xbb\x8d\x0e\xd9\x8d\xb8\xd8\x52\xaf\x74\x99\x82\x76\x1e\xb2\x06\x3a\xf1\x7d\xe4\xa3\x58\xa8\xdf\xb1\x3d\xbc\x83\xb7\x99\x58\xa2\xe9\x58\xab\x5f\x96\x56\xf5\xb3\xdf\x75\x5b\xea\x21\xce\x67\x82\x5c\x20\xad\x31\xd4\x99\xb8\xec\x84\xf1\xf8\x4d\xb6\xae\xf3\x4a\x16\x0a\x33\x95\x31\xb3\x16\xe9\x6c\x22\xd6\xb2\x0e\x96\x62\xd2\x81\x55\x59\xe1\x2d\x1f\xbc\x46\xce\xef\xd6\x1a\x86\x2c\x76\x3b\x4e\x21\xd5\x61\x8b\x26\x1a\x86\x6c\xc2\xa9\x63\x59\x23\x44\x0b\xd0\x25\x19\x72\x12\x34\x00\x2a\x9b\xce\xee\xc5\x96\xf2\x36\x34\x60\x25\x68\x97\xdc\x4d\x41\x7e\xe7\x03\x06\x02\x79\xf7\x5f\xd5\x2d\x60\xda\xd9\x61\x04\xee\x7d\xac\x0f\x43\x3c\x20\xbb\x15\xf2\xd4\xcd\x2e\xe8\xea\xce\xc7\x18\x5e\x77\x8e\xc9\xda\x7e\x7b\x55\xda\xbb\xcb\x65\x1b\xc1\x12\x3f\xd0\x7d\x8e\x82\xb4\x02\x9f\x41\xc6\x53\x66\xc4\xad\xca\x53\x26\x58\x42\xa6\x28\xa2\xba\xc4\x84\xc1\x02\x49\x24\x30\xf1\x20\x5b\xd6\xb9\x2c\xc5\x32\x2b\x97\xf5\xda\x80\x04\x47\x61\xb7\x90\xb9\x17\xe7\x2a\x6c\x3e\x2c\xe2\x84\x94\x1c\x5f\xd7\xcb\x4f\xf9\xcc\xbe\xce\x17\x20\x95\x00\x13\x41\x82\xef\x1a\x36\xd6\x82\xb4\x2e\xce\xba\xec\xc8\xeb\xca\x0a\x70\x60\x11\xb0\x8b\x83\x43\xf4\x90\x00\x1e\x37\xb0\x01\x28\xc8\x40\x85\x2c\x8c\x31\x1f\x0c\xa6\x2b\x43\x3e\x4e\x4f\x13\x0f\x4f\xbe\x8e\x3f\x0e\x60\x1d\x60\x72\xe7\x51\x0f\x03\x6c\x8f\xea\x96\x49\xd5\xa9\xc5\xea\xb6\x81\xd4\x14\xaf\x33\xd9\xc0\x2e\x89\x2f\xb3\xdb\xdf\xca\x12\xbc\xef\x1b\x15\xef\x9b\xd2\xaa\x06\x76\xc6\xc4\x7b\x18\xaf\xd2\x9b\x3c\x44\x49\xb8\x51\x85\x2a\x75\x6d\x1a\x7c\xea\xe4\xe6\xbd\xb7\xb6\x5a\x09\xb9\x35\x61\xe1\x5a\xa8\xf7\xf3\x86\x07\xd9\x45\x9d\xcb\xd0\x7f\x88\xbb\xa2\xc0\x9c\x4a\x53\xb9\x42\xc1\x30\x24\xe0\x5e\x7a\x4d\x8a\x7c\xbd\x71\xd5\x06\x50\xf4\xf7\x2c\xd5\x05\x4e\x3f\xe1\x3a\x65\x2b\x01\xb7\xa5\x30\xb7\xb0\x67\xac\x5a\x48\xb5\xf7\x91\x14\x73\x9c\xf4\xd8\x3f\x2f\x8e\xa8\x93\x58\x1b\xea\x2a\xfa\x48\x10\xd2\x5d\x88\x92\x18\xe2\x1c\x3e\x4b\x67\xc7\xce\x86\x8c\x25\xdb\x55\xfb\x9d\x7c\x4b\xa8\x13\xf7\xe4\x33\x59\xa8\x1c\x6b\x76\x31\x84\xd9\xba\xb0\xf0\x66\x35\x55\x67\x94\xfe\xe4\xd4\x85\x05\x9a\x65\x46\xcf\x08\x67\xa9\x99\x02\x64\x82\xfa\x1f\x60\xfc\x24\x78\x87\xa5\xae\xed\x02\x2b\x57\x44\xb7\x88\x76\xff\x22\x60\x7c\x08\x0b\xac\x4c\x12\x2b\x27\xad\x1a\x4d\x2b\x1a\xc1\x31\x10\xd7\xdb\x74\x5c\x0a\x10\xe2\x4a\x53\xf4\x3b\xd8\x6d\x90\x55\xe2\x46\xe9\x9b\x52\x6e\x6e\x21\x14\x1b\x0d\x31\x28\x6d\x0b\xd9\x7f\x35\x94\x29\xd0\x50\xbc\x5f\x3b\xa6\x90\x0f\x21\xea\xb0\xae\x09\x13\xe9\x21\xe2\xe1\x27\x02\x45\x47\x6d\xe8\x03\x2a\x05\xc2\x59\x3c\xcd\xd2\x34\x18\xd9\xc3\x42\x6f\x76\xfc\xb8\x1e\x4a\xa0\xd4\x67\x77\x30\x39\xa9\x99\xa5\xb8\xbd\xaa\x2f\x30\xce\xbd\x13\xf4\x0c\x9c\x2d\x54\xfe\x53\xaa\xbb\x0c\xea\x11\x70\xc9\x0b\x75\xcf\x79\x74\xad\xf8\xec\x2e\x00\x03\x50\x07\x80\xcf\x44\xc3\xff\x93\x2b\x29\x6a\x0a\x8c\xab\x05\xc0\x49\x64\x39\x42\xda\x9a\x4d\x56\x66\x8e\x87\x08\x0a\xe8\x8b\xca\x23\xdb\x2c\xea\x8a\x22\xb6\xe0\xea\x05\x04\x91\x4a\x66\x39\xd2\x20\x43\x6d\x2c\x7c\xc2\xa1\xde\x60\x46\xed\x52\x95\x14\xae\x03\x9d\xdb\xe5\x04\x1a\x4a\xd8\x93\x84\xd3\x70\x53\x67\x06\x2c\x27\x7e\x02\xc1\xfc\xdc\x79\x70\xfa\x2e\xb9\x8f\xed\x3d\x12\x3f\xda\xb2\x2f\x50\x66\x06\xe9\x7b\x74\xed\xee\x03\x62\xad\xac\x7c\x32\xe4\x7e\x12\x03\xb1\xb9\x42\xa2\x00\xb4\xba\xda\x45\xce\x44\xe7\x8b\xc5\x9b\x83\x29\x2c\xf9\xbe\x88\x3e\xc5\x0b\xed\xcb\xa0\x77\x6d\x8b\xd6\xd0\x7d\x56\x3e\x65\x59\x7a\xab\x22\x9e\x09\x1f\x62\x5e\xde\x6a\x56\xf5\xf9\x11\xac\x92\x78\x72\x27\x60\x03\xbf\x74\xfa\x23\xe7\x27\x06\xa7\x03\xb4\x85\xd6\xe6\x84\xdc\x44\x14\xc0\x0d\xec\x09\x38\xd3\xd1\x01\x6e\xaa\xd5\x05\x78\x67\x2a\x30\x1d\xd8\x43\x04\xf9\xe5\x65\x86\xb0\x6b\xfe\xba\x60\x14\x37\xa0\x96\x76\x36\x36\xea\x8a\x1e\xa5\x88\x2f\xcf\x50\xe4\x3d\x32\xf0\xc6\xd7\x76\x3d\xf6\x1a\xf0\x03\xf5\x5a\xd9\x83\x66\xf0\x6e\x70\xfe\x77\xe3\x12\x5a\x10\x23\xd0\xde\x68\xb0\x06\x7c\xfa\x6e\xea\x2c\xf5\x5d\xa9\xee\xb5\xb8\xd1\x10\xad\x58\x85\x00\x16\x55\x1b\x6f\xc3\xaa\xaa\xde\x39\x80\xfe\x67\x42\xb9\x08\x60\x2a\x0b\x06\x16\x5b\x6b\xa7\x7b\x30\x7a\x08\x46\xde\xe9\x46\x71\xaf\xdc\xa0\x48\xc9\x51\xa1\xf4\xb0\xc0\xd7\xb0\x0d\xbe\xe9\x89\x37\x03\x20\x64\x21\x32\x7b\x44\x30\x1d\xce\x18\xb5\xf4\xdc\xc1\x16\x9f\xbd\xeb\x4f\xdf\x0e\x80\x40\x07\x31\x84\x83\xb6\x1c\xed\x01\x35\x90\x30\x40\x6f\xc8\x67\x3f\x9f\x23\xed\x4f\xff\xf2\x72\x34\x3c\x03\xae\x9b\x51\xff\x43\x4f\x0c\xfe\x7c\x36\xb8\x9c\x8b\x0f\xef\x06\x63\x4f\xd6\x22\x66\x73\xc0\xeb\x1d\x8e\xc5\x87\xe9\x70\x3e\x1c\xbf\xdd\x4d\x17\xf4\xcc\x43\x24\xf7\xa7\x80\x77\x4c\x80\xd0\xd1\x98\x18\x1b\xba\xc1\x1d\x7d\x1d\x73\x45\x0f\x86\xd0\x10\x71\x0c\x0d\xce\x03\x96\xa1\x3f\x98\x5a\xa8\xf7\x00\x6e\xf2\x7f\xbc\xea\xbb\x76\x1a\x18\xca\x8d\x65\xb4\xa3\x15\xd7\x93\xab\x9e\x98\xbd\x9b\x5c\x8d\xce\xa3\xbf\xdb\x69\x1a\x88\xf3\xc1\xc5\xe0\x6c\x3e\xfc\x71\x90\xd8\x07\x09\xb5\x99\x66\x7b\x06\x08\xd5\xfd\xd1\x48\x8c\x07\x67\x83\xd9\xcc\xbe\x85\x54\x40\x30\x0b\xd3\xc1\x65\x7f\x38\x45\xe2\xa1\xe9\xd4\xb6\x32\x19\xa3\x7c\xf9\x36\xa6\x42\xba\x1a\x8f\xec\x58\xa7\x83\xff\x78\x35\x9c\x76\x6d\x03\xc0\xe1\x7e\x3b\x1d\xc0\x54\x86\xab\xfe\x61\x38\x1a\xc1\xfa\x34\x97\x1e\xf0\xa7\xed\x1f\xfc\xd2\x5f\x8b\x0f\xef\x26\xe2\x7d\xff\x1a\x81\x2f\xae\x79\x73\x4c\x07\x0e\x19\x23\xde\x13\xfd\x59\xb0\x35\xfb\x6f\x26\x76\x0e\x3c\x13\xd3\x7c\x02\x13\x62\x17\x88\x98\x94\x82\x2d\x00\x9f\x26\xa4\xdf\x80\x8e\xc9\x73\x34\xed\xa6\x63\x62\x1a\xa2\x26\xf7\xd0\x54\x0c\xc7\xbc\x43\xe6\x13\xd1\x3c\x94\x01\xc3\x51\x7b\xf7\x39\x5a\xa6\xf3\xfe\xbc\x2f\xa0\xc7\xf3\xbe\x78\x33\xb0\x4f\x4f\x07\xe3\xf3\xc1\x14\x0e\x13\x42\x9d\xcf\xe1\x63\xf6\x8d\xc1\x4c\xcc\xae\x66\xf3\xfe\x70\x8c\x8b\x62\xc7\x0b\x47\x99\x21\xc9\x19\x22\x5d\x5c\xf4\x87\xa3\xab\x69\x6b\x8b\xcd\x27\x62\x72\x09\xd8\xda\xb8\xd5\xfc\x82\x30\xc6\xf6\x91\xe7\x50\x02\x96\x24\x5c\x3d\x11\x9d\xd9\x6b\xf1\xae\x3f\x13\x6f\x06\x83\xf1\xd3\x79\x96\x66\x3d\x31\x18\xe3\x73\x1d\xc0\x28\x7b\xef\x10\xad\xa7\x0f\x36\x28\xfa\x58\xe7\x70\xd7\x57\x5a\x5c\x5b\xc9\x3a\x56\xf7\x74\xb5\x65\xca\xec\x31\x93\x2f\xa2\xe5\x60\x69\x45\x8c\x65\x15\x60\xa8\x92\x25\x40\xf7\xe3\x0d\xe6\xd1\x56\x1e\x0d\xa6\x36\xee\x96\x41\x6b\x0e\x80\xed\x20\x95\x61\xad\x8a\x94\x71\x18\x00\x7d\x49\x45\x96\x4e\x88\x9f\x88\x20\x97\x31\x74\x23\x57\xc6\x3a\x40\x5c\x70\xb7\x82\x25\x80\xfa\x32\x70\x40\xc6\x6e\x91\x16\x52\x87\x38\xd4\x65\x82\x95\x2d\x9e\x03\x63\x47\xf4\xe7\x11\xd4\x9a\x23\x00\x76\x75\xc5\x3a\xfc\x85\x44\xc8\xaa\x92\x14\xdf\xf5\x0a\x97\x2b\x9f\x89\x70\x38\x19\xeb\xd9\xc8\x95\x9d\x45\x7b\xfd\xbb\x97\xd7\xfc\xac\xa9\x28\x58\x04\xe9\x5f\x14\xa6\xc6\xbc\x5b\x8d\xe0\x5c\x21\x9e\x17\x80\xad\x6c\x29\x3e\x0c\xd4\x96\xa8\xfb\xc5\xf5\xee\xd0\x14\xb4\x61\x6e\xc1\x55\x83\x69\x04\x3e\xf3\x43\x89\x7d\xa7\x5f\xec\x43\x12\x28\xd9\x9c\x1b\x0d\xe6\x15\xf2\x17\x2a\x02\x5f\x86\x98\x04\x45\xc1\x80\x80\xba\x2e\xd2\xde\x9e\x5d\x49\x78\x33\xcc\x1d\xc9\x1d\x18\x01\x30\x54\xa0\xb3\x4d\x64\xa9\x92\x98\x14\x8a\x00\x43\x88\x78\x10\x23\x84\x6f\xad\x65\x0a\x2f\x39\x52\x1c\x46\x74\x76\xe6\x63\xb4\xa9\x5e\xbb\x4a\x9e\x68\x2f\xa1\xe2\x1c\x20\x81\x66\xd5\xae\x2d\xf0\x38\x1a\x21\xd4\x28\x3e\x55\xff\x7c\x1d\x40\xb0\xc4\x95\x4a\xce\x2b\xaa\x4b\x71\x18\x23\x00\x1c\xb5\xd5\xee\x5e\x6b\xdc\xa1\x53\x83\x2c\x38\xc0\xc8\x62\xc0\x26\xd6\xd1\xb0\x42\x07\xed\x1f\xd6\x06\x90\x0f\x0e\x35\x82\xd7\x2e\xf9\x99\x32\xae\x15\xd2\x1e\xaa\xd4\x43\x10\xe8\x55\xeb\x52\xd7\xe5\x13\xee\xf4\x99\x52\x4f\x9d\x54\x44\x29\x07\xb0\x69\x6b\x95\x99\xde\x9e\x3d\xf4\xe1\x56\xed\xce\x92\x79\xd2\x82\x85\x95\x19\x7e\x16\x5f\x5b\x23\xb8\xd0\xd5\x13\x55\x65\x44\xa4\x4f\xc4\xaf\x84\xa4\x47\xc4\x59\xf0\x28\x84\x6c\x3e\xda\x41\xad\x31\x65\x8c\xdd\xc1\x8b\xad\x50\xb9\x5a\x56\xa5\x2e\xb2\x25\x61\xbe\x6e\x00\xe2\x37\xcb\xa3\x99\x81\x1c\xdc\x1b\x45\xdb\x47\xad\x37\xb9\xde\xaa\x52\x1c\x72\xad\x9a\xab\x46\x26\xfb\x65\xad\xca\x23\xc1\x78\xe2\xc6\x9a\x57\x39\xfa\xa2\x0b\xc0\x3f\x86\x98\xa0\x90\x81\x24\x08\xe0\x39\xf6\x5d\xc2\xa2\x87\x77\x5c\xb9\x54\xb6\x6d\x4f\xbc\x23\xc4\x5b\x29\x0c\x78\xb9\x5f\x53\x41\x61\x45\xac\x3f\xe6\xd5\xde\xb5\xde\xea\x74\x5b\x28\x9e\x4c\xa2\xf8\x0d\xd8\x58\xf2\xd0\x69\x03\x82\x47\x41\xfa\xd1\x5e\xf0\x61\xf1\x9f\x2f\x4a\xbd\x38\x10\x87\xbe\xc6\x1d\xba\x76\xaf\xf0\xae\xf9\x58\xe8\x85\x39\x62\x07\xc7\xde\x62\x2b\x7e\xb0\x9f\x17\x53\x59\xa4\x7a\x2d\xde\xc9\xe5\x47\x55\xf6\xf6\x30\x09\xac\x2e\x41\xbc\xcc\xb7\xe2\x4c\xdb\xa5\x3b\x11\xfd\x4d\x99\xe5\xe2\xe4\xfb\xef\x9f\xef\xb9\xdf\x5e\x96\xca\x64\x5c\xfd\xfe\x63\xb6\x54\x7b\xf3\x5b\x59\x1d\x38\x80\x20\x1c\x39\x18\xe9\xff\xee\xdf\x3c\x27\x62\xef\xd9\xd9\xd9\xf1\x9b\xeb\xe3\xf1\xd9\xf1\xac\x7f\xfc\xa2\xf7\xfc\x77\xe0\x02\x7c\x98\xff\xe3\x9b\x93\x6f\xbe\xf9\xae\xc1\xff\x71\xfa\xed\x8b\xef\xbe\xf2\x7f\xfc\x11\x3f\x67\x56\x09\xb4\xd7\xfb\x99\x5e\xaf\x75\x61\x44\xbf\x72\x1a\xd8\xf1\x58\x17\xf6\xd7\xaa\x5c\x66\x32\x3f\x9e\xdd\xca\x52\xf5\xf3\xec\xa3\x12\x2f\x7a\xcf\xc5\x55\xb1\xd1\xa5\xbd\xb2\xce\xa6\x83\xbe\x35\xc3\xc4\xd9\xe4\xfd\xfb\xc9\x78\x66\x6d\xaa\xcb\xc9\x14\x19\x6c\xc0\xde\x9e\x8b\x3e\xd8\x4a\x17\xc3\xe9\x7b\xd0\x77\xcf\x27\x03\xfc\x3d\x1b\xbc\xa3\xc1\xdb\xfe\xc8\x91\xb5\xf6\x62\x44\x40\x26\x37\x65\xae\x42\xf7\x36\x7c\x79\x20\xfa\x63\xd1\x9f\xcf\x27\xd3\xf1\xe0\xfa\xf8\x6c\x34\xb4\x76\xdb\x74\x30\x82\xef\xcf\xde\x0d\x2f\x7b\xed\x1e\xd2\x67\x67\xd8\x6e\xc8\xb8\x03\x00\x84\xd6\xe6\x3e\xb6\x36\xf7\x9b\xfe\x6c\x38\xeb\x78\xbf\x8b\xab\x68\x3a\x78\xdb\x9f\x9e\xb3\xc1\x1f\xb6\xc9\x34\x4f\x48\x01\xc4\xac\xbb\x33\xcf\x06\x1b\x9a\x6a\x62\x3a\x98\x5d\x8d\xc0\x84\x04\x9e\xa3\xe1\x7c\x66\x2d\xaa\xde\x1e\x5d\x81\x7b\xb6\xf5\x0f\x93\xe9\x3f\x89\xc3\xfe\xcc\xda\xc0\x68\x02\x0d\x46\x93\x0f\x47\x11\xa7\x14\x30\x4f\x41\x5f\xd0\xce\xe0\x59\x6c\x4f\x46\x44\xf7\x22\x0e\xf7\xcf\xce\x2e\x47\xfb\xd6\xd0\xd9\xa7\xdf\xed\x1f\xa1\x51\x0f\x9f\xc5\x6f\xcc\x07\x67\xe4\x16\xf1\xf6\x6d\xe4\xd2\x68\x7a\x4b\xac\xa2\xe2\x98\x6a\xa9\x29\x7c\x72\xfe\xce\x2e\xe0\x4c\xf4\xaf\xe6\xef\x26\xd3\xe1\x7f\x0a\xfa\x1e\x2c\x3a\xe1\x45\xe2\x97\xec\x66\xc2\x7e\xbc\x1b\xbe\xb1\x96\x64\x6f\xef\xcd\xb5\x18\xfc\x79\x30\x3d\x43\x13\xd5\x7e\x0d\xb9\xa6\xd8\xf5\x00\x1f\x74\x93\xf3\x6e\x30\x65\xb7\xc1\x19\x78\x71\x80\xa4\xd9\xda\xf1\xf6\xf9\x37\x03\xf1\x66\x72\x35\x76\x64\xcf\xf1\x04\x52\x8f\x7a\x0d\x5f\x51\xd4\x5b\x6b\xcb\xbf\x19\x80\x1d\x3d\x44\x1b\x16\x9b\xed\x07\x9c\xc0\x68\x8e\xda\xe7\x27\x53\xf1\xd6\x6e\xa3\x19\xf4\xc8\xfe\x9e\xfa\x6e\x1f\x46\x1b\x17\x9d\x57\x63\xd7\x62\x9f\x4f\xc6\xf5\xe4\x6a\x4a\x83\x70\x74\x54\xd6\xd8\xec\x32\x2e\x19\x86\xec\xdc\xa7\x9b\x73\x7e\x5f\x4f\xec\xf7\x53\xb9\xc1\xa8\x82\xc7\x8f\x0c\xd2\x4d\xea\x0d\x65\x63\x7c\x80\xba\x51\x5d\xc6\xbf\xf1\xbc\xf6\x62\x53\xaa\x63\xf5\x0b\xfa\xd2\x31\xf3\x85\x59\xcb\x6d\x93\x01\xb2\x60\x22\xa4\xfb\x66\xd2\x4c\x31\x4a\x04\xe8\xac\x9e\x7e\x6d\x5d\x9b\x6c\x19\x20\x73\x5a\x85\x44\xba\x1c\x03\xab\x3f\xd8\x5f\x10\x18\x56\x59\xd9\xef\x2f\xa9\x25\x5d\x8a\xcd\xad\x2e\x1c\xde\x34\xa5\xa8\x43\x98\x10\x81\xf8\x88\xe4\x71\x99\x15\x6a\x2d\x2b\x0e\x0d\x05\xfd\x33\x31\x73\x1d\xe4\xe7\x65\x61\x3a\xf0\x87\xa0\x24\xb2\x54\x4b\xa4\xd4\x61\x6c\x79\x95\x26\x08\xd6\x2d\x37\xa8\xe5\x73\x5c\x89\xc0\xda\xa0\x39\x6b\x68\xdf\x14\xd9\x5f\x01\x0e\xa6\x05\x1f\xc3\x81\xb0\x84\x73\xf6\x30\xf7\x35\x28\x23\xf2\x98\x79\x76\x9e\xcf\x3c\xf4\xa7\xcb\x5f\x43\x3c\x4f\x86\x99\x91\x85\xf0\x6b\xee\x31\xcf\x1a\xe1\x6c\x97\xb7\x71\x41\x0f\x00\x48\x3f\xc7\xdd\x53\x5d\x2f\xaa\x24\xb0\x26\x3f\xb8\x9a\x3b\x58\x2f\x99\xd3\x12\x84\x53\x1e\x2e\x07\x65\x86\x6f\x8b\xe5\xad\x55\x91\xff\x1a\x15\x6d\x61\x63\x05\xc4\x8e\xd2\xe3\x52\x11\x54\x22\xe5\x9a\xae\x35\x38\xa5\xb3\xb5\xbc\x51\xe2\x70\x1f\xda\xc8\x8a\x9b\xfd\x23\x67\x31\xfd\xea\xc1\x72\xb6\x68\x4f\xec\xfb\x79\xdc\x05\xab\xba\x73\xe3\x05\xfb\x5e\x15\xcb\xed\x12\x58\x43\x33\x49\x75\x9d\x45\x75\xab\x73\x7d\xc3\x89\x88\xc1\x04\x99\xc4\xcf\x0f\xc6\x48\x4b\x2d\x53\xbb\xa5\xf0\x51\x8f\x52\x02\x7f\xe5\xc4\xab\x35\x41\x02\xfb\xaa\x65\x7c\xc4\x93\xb3\x3a\x80\xb6\xc3\x9b\x23\xc6\x55\x85\x1d\x0c\xc9\x77\x94\x7a\xe4\xb2\x29\x78\x88\xd0\xdb\xf8\x2c\x62\x0e\x24\x57\xcc\x24\x21\x5c\x63\xc4\x92\x08\xb5\xda\x98\x74\xd3\x3e\x2c\x21\xae\x28\x94\xbb\x31\x62\x15\x42\x95\xd5\x85\xab\x8f\x81\xe3\x11\xd8\x7e\x50\xdc\x45\x56\x26\x25\x69\x84\x49\x04\x09\x17\xdb\x51\xa7\x20\x97\x9d\xb3\xac\xf1\xbc\x7b\x80\xa5\x4e\x4c\x25\xea\x29\xe7\x85\x43\x0c\xc3\x18\xb5\x5e\xe4\x18\xa2\xd6\xc1\x26\xb8\x53\x0c\x10\xd5\xff\xcd\x0e\xe3\x21\xd0\x2f\x60\x75\x31\x16\x7a\x35\xb7\xec\x4e\xd4\xb7\x65\x4f\xec\x9f\x3b\x8f\x02\xef\x59\xce\x16\x90\x77\x32\xcb\xb9\x48\xc9\x3b\xfa\xe2\x50\x3b\xa1\x01\x06\x38\x83\xb0\x5e\xba\x0c\xba\x88\x49\x70\x1e\x11\x32\x71\xf9\x0e\x46\x62\x11\x29\xed\x43\x82\x4c\x84\xc0\xd0\x7d\xa1\x4a\x73\x9b\x6d\x5c\x49\x4d\x4f\xec\xb3\x69\x3f\xc0\x64\x12\xb3\x1f\xe0\xc2\x7a\x17\xdc\x6d\x76\x73\x7b\x9c\xab\x3b\x95\xbb\x48\xa3\x24\x4d\x55\x19\x04\xaa\xb2\x13\x8c\x6e\x9c\x11\xe7\x31\xd2\x5a\x43\x12\xa8\xf3\xad\x54\x59\x95\xb7\x4e\xfc\xab\x50\xf1\x4d\xc4\x58\x17\x4b\xa7\xf9\x26\xc2\xab\xbe\xdc\x73\xe5\x7a\xae\xcb\xb0\xc7\x9e\x81\x24\x09\xfe\x6d\x77\x24\x92\x8b\x6a\xa2\x19\x75\xc5\x0b\x50\xae\x74\x68\x8e\xfc\x34\x3f\x11\xdd\x6f\xd5\x13\xfb\x13\x5e\xb1\x3e\x78\xd4\xa8\x23\x0e\xf1\x6e\x29\x8d\x7a\xf4\x6e\xfc\xd2\x5e\x43\xd9\x1c\xb8\x8e\xd3\x68\x6b\x80\x07\x26\x78\xdb\xbd\xb4\xe5\x0a\x7d\x06\x4f\x23\xac\x1e\xe7\x7a\x2b\x5f\xd3\x42\x39\xf0\x28\x71\x98\x1d\xb5\x07\x11\x5e\x21\x98\x3b\x5f\x41\x59\xbc\xc9\x8a\x1b\xa8\xa2\x87\x1b\x27\x83\x19\x80\x0b\x8a\x6b\xe6\x5d\x32\xa0\x41\xb8\x33\x6d\x5f\xc5\xf7\xac\xda\x91\x67\x90\x30\x9d\x2a\x70\x5c\x24\x62\x93\x4b\x2b\x80\x12\xf4\x59\x6c\x4a\x15\x67\x4b\x72\x3f\x1e\x90\xfb\x08\x3c\x03\xf9\xf4\xac\x9f\xac\x74\xfe\x31\xd7\xa5\x7a\x2d\x0e\xb3\xce\xc1\x39\xfd\x04\x73\x1e\xa0\xf4\xb1\x24\xdc\x0f\xf8\x15\x74\x1f\x8b\xf9\x6f\x64\xce\x73\x6b\x47\x83\xf4\x84\xab\xec\x17\xc5\x49\x5f\x35\xa0\xd7\x36\x27\xcd\x1d\x4a\x7c\x80\x6a\x47\x0f\xb3\x8e\x0e\x85\x37\x0e\xca\x86\x1b\xe9\x6e\x67\x2c\x5d\xb1\x07\x7b\x9d\x51\x2d\x92\x7b\x9e\xb7\xe7\x4d\x4f\xec\xdb\xad\x11\x1e\x0e\x37\x61\xe4\xc2\x8d\x26\x0d\x4f\xc2\x83\x20\xea\x2e\x1d\x86\x6b\x6b\xdb\x60\xd4\xc4\x76\x94\xd6\x0e\x3c\x31\xfc\x70\x22\xcc\x32\xc3\x4d\xb8\xa4\x6b\x8d\x7a\x90\xea\xb5\xb4\x4b\xee\xca\x75\x49\x93\xab\xb0\x4c\x53\x51\xa2\xee\x9a\x01\x1d\xfd\xea\x06\xfd\x49\xb3\x9b\xac\x92\x00\x32\xbc\x0e\x55\xde\x85\xd6\x56\x03\x92\xeb\xcd\x6d\xae\xaa\x60\x4b\x12\x12\xf1\x6b\x7b\x42\x15\x40\x3f\x24\x9c\xc1\x92\x08\xa3\xca\x35\x65\x6f\x78\x54\xb2\xb0\x24\x04\x3d\x5e\xf6\xe5\xb4\x94\x90\xea\x0d\x59\xf3\xf4\x6f\x7d\x1c\x2a\x60\xaf\xa1\x70\x53\x97\x2e\xeb\x89\x9a\x83\x33\x8a\x89\x5a\x6b\x4c\x4e\x16\x69\xbd\x5e\x00\x85\xd8\xeb\x40\x89\x83\x7a\x36\x93\x79\xf5\x2b\x20\xe3\xbf\xd7\x25\x6c\xa6\x96\xf6\xcc\xe8\xa6\x94\xfe\x82\x97\x28\xa4\xf9\x54\x84\xaf\xe8\x26\x92\xe0\x44\xed\xda\x41\xb5\x66\xc4\x1d\x13\xb5\xbb\x7d\xcd\x4a\xaf\x55\x3f\x4b\x79\x0f\xa7\x78\x23\xb3\xa2\x82\x7f\xc9\x72\x79\x9b\x55\x3c\x9b\x66\x59\xe7\x1b\xfc\xa7\x2a\x6e\x4a\x79\x47\x99\xfa\xb9\xed\xbb\x6f\x6f\x73\xab\x7f\xfb\x6e\xfb\x46\xa3\x3e\x4b\xc2\xc9\x94\x65\xf5\x1a\xc2\x27\x79\x5e\x9b\xaa\xa4\x5b\x75\x2d\x37\x20\x81\x8a\x44\x98\x8f\xaa\x5a\xde\x62\xc1\x68\xa9\xd4\x71\x9a\xad\x55\x61\x00\x2b\x13\x1b\x43\x85\xf8\x0e\x63\x34\xb4\xb2\xe0\xfc\xdd\xb8\x7f\x87\xb3\x01\xba\xa2\xdd\xff\x4b\xd8\x34\x81\x64\xb0\xff\xe9\x4e\xf0\xeb\x50\x1a\xbd\xc6\x22\x36\x07\x5b\x1e\x40\xc1\x62\x94\x0a\xd3\xd2\x11\x41\x06\x73\x4b\x91\x97\x40\x7a\xdf\x2f\xa8\x1b\xb8\x09\x3d\xf8\x3b\x7d\x9d\x27\xf0\x4e\x96\x99\xc2\x9b\x06\xf2\x6d\x8d\x7b\xa0\xec\xfc\x96\x55\xa0\xbc\x44\x0e\xf5\xa8\xdd\x62\x99\x45\xd3\x6d\x4f\xec\x5f\xeb\xda\xa9\xf3\x45\xf7\xad\x45\x95\x06\x10\x99\xdc\x55\x6d\x44\xb5\x45\x0e\x18\xe6\x2e\xc3\x54\xf5\xbb\x4c\xe7\xee\x86\xec\x16\x63\x70\x8a\x4a\xc0\xb7\x71\xa9\x6e\xce\xb4\xe6\x66\x5d\xa4\x84\xf6\x5b\x8b\xd0\xde\xc7\x9f\x30\x03\xc9\x95\x47\xec\xee\x72\xaa\xcc\x26\x03\xac\x6c\xee\x30\x75\x37\xa8\xcf\xce\x7a\x62\x1f\x43\x2f\xf9\x56\x5c\xe2\x4a\x04\xaa\x24\xdf\x80\xa4\x3c\x96\x6a\x99\x55\x32\xc2\xf7\x70\x2e\x01\x44\xac\x5d\xd7\x05\x56\xe2\x34\xb5\x4e\x80\xe9\x6c\xb5\x92\x30\x31\x3b\x7e\x51\x97\x7c\xc0\x42\xbe\xb3\xc5\x56\xdc\x67\xb8\xab\xed\xff\x43\xed\xad\x7f\x1e\xdb\x64\x89\x1c\x1a\x57\xaf\x1f\x55\x86\x3f\xb0\x49\x40\x55\x9c\xf7\x92\x6a\xbe\xd7\x6a\xbd\x70\xec\x44\xee\x71\x48\x2f\xa5\x22\x73\x88\x25\xe3\xfb\x54\xa1\x8e\xb5\xab\x70\xd9\x54\xee\x3f\x23\xa2\xba\xa5\x9d\x05\x22\x4f\x51\xeb\xd7\xe1\x04\xbb\xa9\x8c\x3b\xb8\x63\x76\x5c\x8e\xbb\x9f\xf1\x00\xfc\x85\xde\xe5\xbe\x07\x33\x12\x2e\x5a\x63\x86\x77\xcf\x23\xf4\xd3\x09\x0d\xca\xe2\xf2\xff\xed\x7a\x1e\xf5\x35\x60\xab\xcb\x6e\x0a\x48\xa3\x45\x55\xa5\x44\x33\xde\xf0\x06\xfc\xa9\x27\xf6\xa7\x54\x77\xde\x32\x62\x3a\x6c\x93\x1d\x5f\xe9\xd0\x10\x80\x83\xb0\x2e\xa0\xea\xe0\x2e\x33\xf6\xcc\x97\x6a\x09\xf9\x02\x37\x7e\x06\x31\x68\x65\xf5\xb6\xec\x17\x4f\xd8\x10\x56\xc2\xf3\x1f\x76\xce\x9e\x43\x1f\x5d\xe1\x05\x41\xb2\x71\x97\x23\x04\xae\xde\x40\x81\xf0\x17\x7f\x10\x3f\x44\xb4\x3f\xc6\x89\xbf\x90\x59\x29\xce\x95\x84\x2c\xf4\x29\x11\xc5\x8e\xb5\x63\xb3\x8b\xd5\xa6\x38\x77\xbc\x54\x76\x66\x13\x9c\x19\xac\x84\xa4\xec\x6d\x98\x48\xc0\x0e\x40\x2a\x66\xbb\x8d\x7d\x1c\xcf\x95\x4c\x0a\x59\xa2\x70\x84\x07\xfc\x04\x93\xf2\xeb\x12\x0f\x5d\x89\xb6\x2b\x2b\x5d\x41\xe1\x8a\x15\xda\x85\xb3\x89\x5d\xf1\x2d\x7f\x27\xc0\xca\xef\x60\x54\x09\xdc\x80\x98\xd7\x0f\x38\x27\xf2\xde\x30\x2c\x2b\x8f\xfa\x6d\x29\x8b\xaa\x27\x66\x51\x6d\x5a\x77\xf6\x6c\xab\xc8\xc9\xc9\x55\x0a\x6d\x52\x11\x25\x94\x96\xd9\x0b\x25\x4f\xef\xb3\x54\x25\x51\x6d\x4f\x02\xf4\x60\x94\xbc\x01\x10\xf8\xaa\xdc\x28\xf0\x85\x1c\xb2\x05\x9f\xd6\x65\xe4\xe5\x0a\x86\xe0\x06\x79\xe4\xcc\xdc\x4e\x00\x5f\x87\x47\xf2\x81\xc2\xc2\x00\x20\x97\xa2\x4f\xe7\x95\x77\xea\x56\x5a\xb8\x53\x14\x6c\xd2\x46\xda\x6c\xe0\x6a\xab\x74\xe4\x5c\xf1\x7e\x0b\xe3\x78\xb0\xdb\x0d\x22\x4f\x62\x8b\x8d\x2c\x7c\xfb\xb5\xf7\xa8\x55\x6c\x3f\x42\x83\xbe\xb5\x7e\xe0\x6b\x8d\x8b\xd3\x5d\xa9\x4b\xe8\x7e\xf0\x07\x0d\x6a\xd2\x43\xbe\x9a\x98\x00\xa3\x92\x1f\xa1\x06\x97\x90\xb6\x15\x12\xd8\x22\xec\xb2\x92\x65\xbe\x15\xb9\x5c\xa8\xdc\x1a\x80\x6b\x59\xc2\x2d\x15\x99\x7b\x64\xb6\x6e\xb9\x34\x23\x80\xf1\x81\x42\x16\x87\x92\x4b\xb6\xf8\x07\x00\x3e\x6b\xc0\xb9\x87\xfd\x5b\x72\x7d\xd5\x5a\x96\x1f\x55\x2a\xf6\xe7\xe1\xeb\x08\xf3\x22\x4d\x48\xe2\x03\x47\x6c\x50\xdc\xe4\x94\xf3\x3c\xdb\xc8\x22\x33\xb7\xc9\x3e\x2a\x54\x11\xde\x15\xb6\xee\x4a\x5f\x3b\x1a\x77\xbc\x48\xec\x5f\xeb\xed\xbf\xf6\xce\xa3\x4a\x8b\xf3\x38\x77\xab\xa9\x08\x84\xfb\xc5\xad\x41\x7b\x07\x84\xab\x0f\x96\xa6\x77\xfa\x3c\xe1\x1b\xc1\x6e\xe0\x3b\x61\xee\x90\x5b\xe8\x0c\x90\x8d\xc6\xc7\x03\x5d\x08\x79\x0e\x2b\x8f\xb0\x26\x98\x9d\x61\x1c\xac\x5a\xa1\xef\x81\x4e\x17\xcc\x2a\x7b\xac\x91\x6f\x39\xc5\x52\x87\x5e\xfb\x13\x21\xb0\x95\x83\xce\x26\xca\xe9\x16\x35\x86\xc4\xac\xf1\x4a\x2d\x6f\x0b\xaa\xbb\x75\x39\x15\x0f\x9c\x63\x14\x64\xad\x4e\x47\x52\x8b\x3d\xb7\x7f\x3a\x5c\x1d\x25\x30\x48\x7a\x1f\x2b\x30\xb9\x74\x9f\xcb\x60\x23\x27\x58\xa9\x58\x82\x61\x26\xb7\x4a\xa3\x4b\xbe\xae\x44\xa3\xd8\x34\xe8\x5e\xaa\xcc\xb2\xcc\x16\xb1\xfb\xf8\xe5\xa1\x3a\x62\x34\xdf\x69\x50\xaf\x8b\xf3\xc7\x82\x8b\xfb\x12\xbc\xf8\x82\x26\x37\x0b\xe1\x06\xe0\x10\x05\xc5\xc3\xc0\xf0\x49\x9d\xa1\x9c\x2c\xef\x07\x0c\xcb\x83\x03\x39\xc7\x45\xc5\xc1\xae\xd2\xe5\x03\x1b\x17\x6a\x73\x1e\x73\xb4\x79\xfc\x34\x87\x4b\xc3\xf9\x4a\x89\x20\x59\x7e\x55\x64\xd0\xf2\x54\x51\x6e\xdf\x90\x9d\x5c\xa5\x38\xbc\x9a\x0e\xc1\x6f\x9b\x74\x68\xfe\x08\x25\x1f\xa6\x3f\x41\xc7\xec\x27\x1f\x1e\x44\x5c\x41\x8d\x68\x47\xa0\x3e\xb9\x52\x6a\x1a\x4d\x70\x41\x10\xee\x37\xdd\xef\xbb\x6d\x12\x8e\xf0\x2c\x10\x0c\xc8\x15\x89\x71\x4d\x79\xd8\xd3\x1d\xfb\x99\x57\xbd\xd2\xfc\x55\x7e\x79\x47\x9a\x5e\x3c\xdb\x34\x2c\x0f\x1f\xe1\x3e\x18\x2c\x47\x93\x4f\xe8\xcb\xb8\x84\x3a\x59\x8a\xc0\xb3\xf9\x77\xae\x0b\xc0\xb1\x3e\xfe\x60\x70\x0f\xef\xa8\x85\x77\x29\xa1\x28\x4a\x20\x4a\xb4\x94\x56\xae\x49\x53\x97\xea\xb1\xb5\x0d\x96\x4f\xee\x58\x3c\xb8\x50\xae\xb1\x2c\xf5\xb7\x5d\x45\x48\x6e\xf4\x82\x42\x1e\x85\x65\x4f\x0f\x29\x0c\x61\x90\x04\x73\x1c\x11\x3d\x8c\x4b\x8d\x08\x17\xa3\xa1\x58\x08\x09\x68\x2c\xce\x16\xc6\x6b\x09\x21\x97\x30\xdb\xb9\x29\x5e\x1e\x38\xef\xc3\x15\xe6\x27\x93\x76\x12\x75\x08\x82\xdd\x0c\x68\x08\x96\x5d\x11\xc8\x58\xde\x9a\x49\xc3\x59\x41\x55\xb0\x88\xd9\x55\xaa\xb5\x15\x7e\xae\xaf\xe1\x28\x0a\xc0\x35\x4e\x99\x5e\x95\x20\x40\x16\xdb\x60\x2a\xd3\xa3\x84\xff\xa8\x4c\x05\x35\x83\x71\x7f\x8b\x48\x3f\xfa\x1d\x3a\x1c\x04\xa8\x7e\x55\x87\xbd\x0e\xf8\x44\x79\x1d\x07\xc5\xbc\xd0\x7e\x05\x01\x82\x9d\x2b\x49\x3e\x76\xd9\xa8\x77\xeb\xf4\xc0\x38\x6f\x6a\x33\x0e\x05\x58\x04\xcd\x46\xa1\xd5\x56\xce\xd4\x4f\x75\x99\x19\xc6\xc5\x62\xb9\x75\xe8\x28\x23\x33\xcc\x1d\xa0\xde\x34\x0a\xe5\x8e\x1a\x08\xe2\x4f\xee\x8f\x38\x54\xbd\x9b\x5e\xf2\x05\x09\x5b\xb3\x23\x71\xb8\xdf\xf7\xc6\x46\xc0\x31\xfa\x94\x9b\x6e\x3a\x44\x04\xc0\x76\x0b\x5d\x92\x13\x22\xb0\xc1\xe2\xfd\xe6\x17\x5b\xd0\xf6\x83\xd7\x9b\xea\xea\xf0\x13\x2f\xba\xf0\x1b\xbf\x91\xa0\x6c\x77\xe6\x57\x5c\x6c\x9d\x63\xfa\x7b\xaf\x38\x19\x87\xe3\x1b\xe3\xff\xad\x2f\xc0\x50\x54\xfd\x9d\xd7\xe0\x83\x3b\xe1\xe1\xcb\x30\x4c\x09\xf9\xad\xaf\xc4\xae\x95\x6e\xdc\x8e\x8b\xd6\xed\x18\x8a\xd8\xdf\xeb\x8e\x0c\xbe\xf1\x25\x37\x65\xe7\x88\xbc\xdd\x18\x2e\xa2\x9b\x3f\x48\x98\xea\x04\xea\xc1\x72\xa6\x4e\xe3\x80\xcc\x77\x59\x14\x01\x2f\xe7\xa6\xcc\x88\xde\xc2\x79\xb1\x80\xd2\xa9\x24\x3c\x14\x68\xf2\x5e\x96\xa9\xf0\x81\x7b\x21\xd3\x3b\x59\x54\x44\x01\xb4\x81\xf4\x32\x25\xd6\xba\x40\x54\x44\xe0\x80\x28\x8c\xa7\x3d\xf3\x94\x8c\x91\xae\xe4\x7c\x4d\x61\xd1\x2e\x21\x3a\x39\x27\xec\xca\x3b\xef\xb2\x5c\x1d\x73\x71\x6b\xe4\x49\x30\xb7\xb2\x33\xf7\x03\xa7\xff\x77\x19\x57\x04\x38\x48\xa9\xed\x85\x16\x1b\xb9\xe5\x54\x1e\x98\xeb\xae\x57\xc9\x47\x77\xdc\x72\xd2\x85\xb3\xd4\x9a\x92\x20\xb5\x83\xd4\x93\xf3\x00\x43\xea\x61\xa3\x0c\x13\xec\xfa\x71\xce\x5d\xe4\x82\xf2\x6a\x0b\x81\x6d\x4a\x56\x2f\x02\xaf\x86\xdd\xc6\x9b\xba\x34\xb5\x2c\x22\xdb\xd9\x6a\xa3\x49\x4b\xc6\xb6\x60\xad\x5d\xa6\x8d\x8b\x61\xd0\x14\x26\xa1\x13\x89\xd9\xe2\x90\x7e\x45\x97\xb4\x0f\x18\x77\x0a\xf0\x54\xff\x9a\x15\x37\x5e\x55\xe1\xea\x27\xfb\xef\x46\xe2\x06\xc0\x7b\x6d\x8c\xaa\x53\x5d\x6c\xd7\x58\xc6\xe1\xce\xda\x91\xfd\x4f\x66\xd7\x4b\x38\x76\x9e\x75\x37\x44\x7f\x75\x7a\x9e\xc3\xc7\x75\xd4\x5b\x48\x63\xae\x4b\x07\x74\x45\x7a\x84\x14\x80\x92\x05\xbe\x59\xca\x5c\x4a\x38\x45\x03\x70\xe4\x20\x2a\x96\x88\x9f\x74\x5d\x16\x32\x3f\x22\xb8\x61\x5f\xaf\x77\xb8\x1f\xa8\x22\xe2\x12\x5b\xdf\x87\xcc\x02\xee\xce\x41\x1b\x45\x3c\xf1\x22\x06\xaa\xcc\x09\xc5\x35\x86\xc3\x82\x19\xa7\xdc\x96\x70\x2a\x1d\xca\x5e\x38\x20\xd2\xfe\x1a\xa9\x3e\x6c\x1a\xf8\xa9\x64\x85\x2e\x56\x80\x03\x46\xbe\x48\x17\x76\x2a\x90\x2b\xb1\xb1\x82\xc9\xcd\xb3\x07\x83\x20\xb4\x15\x4f\x19\xed\xce\x0d\xda\x7c\xb4\x71\xa1\xeb\x57\xd3\x61\x28\xbc\x57\x31\xcc\x79\x04\xa2\xae\x59\x73\x44\xdf\xbe\x2f\x3b\x0a\x77\xab\xcb\xe8\xb8\x3b\x0a\xb1\x6f\xa0\x07\x4e\xcc\x1e\x2e\x8e\xda\x19\x42\xb1\xed\x20\x59\xb7\x67\xdf\x67\x80\xc4\xde\xca\xcd\x8c\x6f\x14\xda\x4d\xfb\x17\xa5\x2a\x96\xb7\x91\xdf\xb3\x11\xaf\x69\x6c\x5d\x74\x66\xee\xcf\x96\xa5\x52\x05\xa4\xe0\x38\x98\xbb\xc8\xb5\xda\xf1\x2a\xe4\xa7\xdb\xd1\x60\xa7\x43\x6b\xa4\x8a\x2f\xdc\xf4\x88\x9d\x86\x21\x7a\x11\xdd\x38\xe1\x5e\x83\xcb\xe7\xb5\x13\x9e\x89\xb8\x65\x5c\x45\xbc\x90\x9a\xe9\x3b\xa1\x99\x52\x46\xb7\x34\x44\xfd\xd6\x59\x91\xad\x6b\x62\xc1\xa6\x6e\x22\xc8\x25\xb0\x97\x11\x88\x18\xfd\x81\x49\xc9\x7d\x4e\x63\x71\x43\x35\x93\xa6\x43\x71\x89\xbe\x47\x0d\x06\x20\x67\x01\xaf\x8b\xe1\x29\x32\x2e\xe1\x8a\xaf\x59\x57\x3d\x2a\x4d\x80\x8d\x4a\x20\x52\xfc\x12\x6f\xb5\x66\xca\xa5\xef\xde\xc3\x59\xc2\x8e\x2b\xaf\x40\x96\xaa\xa0\xf1\xdd\x8b\xd6\x91\xaa\x1b\x4a\x1d\xe6\xb4\xc5\x61\x18\x55\x09\x5d\x57\xa4\x49\xc0\x61\x58\x44\x91\xfc\xeb\x07\xc1\x43\x5b\xaa\x28\x60\x05\x21\xd4\x1a\x23\x07\xe5\xc0\x07\xaf\x00\x53\x0f\x1e\xc1\xc8\x63\x23\x9a\x95\xb0\x34\x35\xb7\xd9\x06\x93\x0a\x52\x5d\x1a\x4c\xa0\x25\xaf\x66\xf3\x00\x44\x79\x8b\x56\x8a\x77\xc8\xd3\x76\xda\xa5\xc6\x5b\x16\x6d\xfa\xb2\x79\x42\x93\x88\x10\x87\x93\x60\x13\x9f\x4f\x50\x66\xc4\x88\x5e\xa9\x22\xcc\x2e\xe8\xbe\xa8\x9e\xd4\xc7\x20\x47\x72\xf7\x6e\x60\xe7\x2d\x26\x1b\x8c\x75\x71\x7c\x2f\xb3\x3b\x38\x7c\x67\x7a\xbd\xa9\x73\xa3\xcb\xad\xb3\x6d\x66\xcb\x5b\xb5\x56\x06\x60\x92\x30\x69\x20\xb4\xb9\x4d\x9c\x5c\x1c\x50\x5c\xc2\xb1\xa0\x00\x1d\xa6\x5c\x7a\x4c\x2e\xc0\x30\xa9\x74\x49\xb4\xda\xee\x9b\x5e\xcc\x1a\xf8\x2a\x03\x74\x2d\x94\xb0\x5d\xe4\xec\x45\x37\x11\xe4\x54\x67\x58\x6f\x8a\xfc\xb5\x7b\x01\x67\xdf\x77\x85\x61\x1f\x9d\xae\xbc\xd8\xe2\x42\x76\xaa\xcb\xed\xbd\xfa\x3a\x98\xc0\xac\x27\x3e\xfc\x03\xcf\xde\x3f\xda\xd4\x59\x69\x0b\x87\x25\x04\x13\xc5\x6f\x50\x50\x86\xbe\xe1\x85\x0e\x1e\x2c\x07\xdf\x13\x20\x1f\xdf\xca\x42\x14\x61\xba\x30\x88\x50\x87\x02\x16\x33\xfc\xbc\x3c\x5c\x1e\xf9\xfc\x3f\x68\x00\x26\xc6\xfc\x1e\x53\x1f\x45\xdd\x60\x9b\x64\x3d\xf1\xa3\xce\xeb\x02\x74\xfd\xd6\xee\x98\xef\x5c\x9a\xdd\x1d\xf3\x8c\x45\x51\x4a\x8b\x95\x14\x11\xed\x76\x40\x62\x43\x1f\xc0\x1a\x11\xc5\x78\x59\x3e\x9f\xde\xf6\x5f\x2f\x21\x1b\x0c\xa3\xbf\xa9\xbd\x3d\x4d\xa5\x4a\x03\xec\xae\x05\x41\xda\xc7\x83\x35\x89\xb8\xcb\x24\xe1\xfa\xe1\xeb\x89\xf7\x7b\xfe\xea\x9d\xc2\xe6\xe7\xef\xb7\x1d\x82\x7c\xee\x81\x03\xe3\xf6\x0d\x02\x62\x2b\xdc\xd5\x94\x2c\xca\xb7\x87\x9b\x48\xdb\x33\x17\x0b\xed\x80\x7b\x87\xdc\x98\x28\x4b\x22\xa1\x03\xe0\x83\xef\xc9\x93\x23\x67\x1e\xc3\x8f\x7c\x07\xf8\x79\x47\xf5\xfc\x44\x03\xce\xa1\xac\xea\xb2\x4a\xc4\xda\x9a\x4b\x70\x2f\x79\x3c\xea\x4a\x7e\x64\x4d\x23\x55\xa5\xbe\x91\xb0\xe3\xa5\xcb\xeb\x75\xd5\x40\x61\x5c\x01\x57\xc4\x01\x98\x6e\x4a\xf5\x53\x9d\x66\xb0\x0c\xf4\x58\xe3\x42\x3b\x30\xe2\x16\x60\x1e\x91\xe7\xa2\xae\xc8\x1b\xe0\xaf\x39\x3b\xff\x26\xd0\xfa\xda\xe2\x13\x54\x5e\xf1\x83\xdc\xc8\xe2\x28\xa8\x73\x89\xf6\x5d\xb8\xe1\x3a\x23\xa3\x87\x8b\xa3\x96\x83\xfa\xb0\x1d\x75\x0e\xe6\xf6\xc8\x8f\x33\x55\x6a\x1d\x00\x3d\xd2\xbc\x62\x3e\x29\x4e\x2d\xfe\x3b\xe2\xc5\x2a\x77\xce\xee\x17\x4c\x1b\x65\x45\xd5\x6c\x39\x44\x3b\x13\x34\x5c\x90\x6f\x82\xf8\xcc\x50\x73\xea\xaa\x1d\xf1\x1a\x9f\x0b\x49\xac\xea\x3c\xb7\x96\x3d\x87\x26\xc2\x0d\x5d\xc5\x79\x33\x05\x7c\x5e\xe6\xb8\xbb\x2b\x2d\x14\xea\xf1\xe4\xcf\x0b\x8c\x3a\xb7\x22\x5e\x13\x6c\x1c\xca\xee\xa5\x78\x60\x19\x38\x82\xee\xce\x1e\xb3\x84\xda\xe3\x05\xd8\x85\x9c\xd5\xf8\xc1\x7b\x62\xed\xc4\x9d\x3b\x37\xad\x7d\x81\xb0\xa6\x3c\x94\xd8\xfb\xab\xf9\x55\x7f\x34\xba\x0e\x00\xa6\xa8\x20\x95\x11\x8e\x02\xbc\xa9\xfe\xf8\x9c\x0b\x52\x2f\xae\x46\xa3\xc1\x6c\xfe\x04\x10\xb3\xc4\x17\xa0\x4e\x2e\x2e\x06\xd3\x99\x2f\x95\x85\x0a\x68\x68\xd5\x15\x3b\x4f\x07\x97\xd3\xc1\x6c\x30\x9e\x63\x69\xb5\x98\x4c\x1b\x70\x61\x0c\x47\x26\xce\x26\xe3\xb3\xc1\x74\xcc\xc5\xd0\xb6\xc1\x84\xb1\xc9\x12\x8f\x4b\x36\x9b\xf7\xe7\x57\xf3\xc9\xf4\xda\xa1\x2a\xd9\x71\x47\x78\x65\x8c\x73\x02\x88\x51\xf0\xdd\xa4\xf1\xd1\xf9\x70\x3e\x1a\x24\x4d\x54\x93\xe4\x51\x4c\x93\x44\x8c\x27\xe3\xe1\xf8\x62\x3a\x1c\xbf\x1d\xbc\x1f\x8c\xe7\x89\x20\x30\xb8\xfe\x9b\xd9\x80\x4a\x69\x47\x7d\x98\x42\x57\xd5\x8c\x98\x63\xb3\x44\x20\x20\xd5\xd9\xb5\x7b\x09\xa7\x06\xdf\x0a\x1a\x18\x4c\xa7\x93\xe9\x2c\x11\x1f\xde\x0d\xa0\x81\xc9\x14\x2a\xd7\xcf\x87\xb3\xb3\xc9\x8f\x83\xa9\x5d\x88\x9e\x98\x4d\xde\x0f\xc4\x0f\x57\xd3\xe1\xec\x7c\x78\x86\x73\x7b\x3e\xc1\xba\xf9\xd1\x68\xf2\x81\xaa\x8c\xcf\x46\x57\x33\x2a\xfa\x6d\xa3\xb5\x25\x62\x36\xc1\x12\x64\xff\xe0\xfb\xfe\x35\x36\x72\x79\x39\xba\x26\x54\x30\x26\x08\x1c\xf9\x84\x48\x5d\x88\x51\x46\x6e\x72\x87\x6a\x17\xd7\x36\xef\xc6\x3f\x4b\x22\xb8\x34\x00\x3d\x73\x5b\xaa\x85\x48\x06\xc5\xf5\xd7\x54\xec\x3f\x7f\x37\xb0\x2b\x7f\x41\x68\x68\x1d\x48\x64\x49\x8c\x43\x96\x88\xcb\xab\xf1\x10\x4a\xd7\x27\x53\x31\xf8\xf3\xe0\xfd\xe5\xa8\x3f\xbd\xde\x0d\x4f\x16\x57\x8f\x3b\xb8\xb2\x8b\x70\x4f\x12\xc2\x97\xeb\xf3\xaf\xc1\xf3\x22\xb2\x9a\x39\x11\x41\x64\xba\xf0\x89\x29\xf3\x56\x12\x42\x37\x66\x3d\x8a\x20\x10\x98\x9e\xe9\x22\x86\xf0\x87\x80\xae\xbd\x54\x16\x25\x04\xd7\x62\x55\x66\x57\x48\xdb\x57\x73\xb5\xaa\xb8\x62\x2c\x9e\xdd\xb7\xb6\x0f\x8d\x74\x59\xcc\xce\x31\xf2\x54\x96\x0c\xe7\x90\x06\x8d\x3b\xdb\xd1\xc1\x9d\x9c\x19\xec\x4f\xb3\xf7\x30\x37\xdf\x0b\xe8\xf1\x12\x71\x9a\x88\x6f\x12\xf1\x6d\x22\xbe\xc3\x9c\xc5\x3f\x11\x7f\x68\x5d\xde\x65\x77\x3e\x92\x48\x6b\xf5\x40\xed\x6f\x23\x6b\x14\x9d\x0a\x5d\xb9\xa3\x78\xef\x35\x13\x9f\xd8\xdf\xfe\x2b\x53\x40\xc3\x14\xcf\x23\xc8\xeb\xb5\x23\x37\x95\x2c\x52\x76\xc7\x11\x2f\xdb\x23\x4a\x7b\xa9\x72\x25\x83\x4c\x1a\x5a\x46\x84\xcf\x0d\x51\xeb\x69\x0f\x81\x13\xd2\x54\x7a\xd3\x66\xe0\x40\x97\x38\x66\x64\x56\x99\x35\x31\x5a\x1e\xb2\x46\xca\xa6\x6a\xd5\xbd\x42\x17\xa1\xbe\x26\xab\x6e\xd3\x52\xde\x37\x6e\xda\xa8\xce\x3e\x0f\xf5\x70\x76\xf1\x23\xa1\xaf\x89\xa8\x52\x16\x2a\x69\xe9\xf1\x3b\x4e\xc5\x51\xd2\x81\x79\x9f\x91\xc3\x2d\x2b\x6a\xe5\x76\x1d\x20\xd2\x23\xe6\x1a\xc4\x22\x1d\xc5\x97\xdf\xcd\x3e\xf7\xd6\xf3\x0c\xfd\xa9\x27\xde\x67\x66\xa9\xf2\x1c\xb9\x0b\xbc\x38\xf0\x6c\x1f\x5f\x90\x27\x84\xd9\x03\xa1\x4f\x31\xd6\xff\xed\x32\xba\x00\x62\x40\x00\x12\xa6\x10\xfb\xb6\x0a\x9f\x62\xd0\x99\x06\x2d\x4d\xe7\x66\xa6\x78\x5d\x07\xe1\x8e\x3f\x2f\x5f\x34\xba\x86\xcb\xf9\xcb\x87\x13\x7b\x85\x7f\xb7\x71\x2d\x7b\x8e\xce\xc0\x6e\xf5\xce\x4c\x12\xc8\xad\x7f\x98\xcb\xa0\x69\x80\x55\x41\x34\x50\xe2\xe6\xb2\xdd\xf3\x08\xff\xcc\x53\xa2\x5a\x49\x0a\x56\x30\xa6\x8c\xf3\xbc\x63\x8f\x33\x8f\x12\xfa\xfe\x98\x5c\x85\xf4\x7b\xd2\x9f\x9b\x4c\x27\x8e\x1c\x84\x6a\x17\xfd\x78\xb1\xab\x00\x6c\x41\x45\x5b\x1c\xfe\x22\xbf\x36\xa9\xe8\x51\xb6\xab\xcf\x92\xf5\x0d\xe1\x1c\xc1\x81\xf2\x53\x14\x84\x0c\xc7\x1a\x86\x43\x35\x2d\x3b\x66\xdb\xf5\x86\xcc\x1e\x74\x2d\x41\xab\x85\xe6\xdb\x11\xc0\xee\x79\x85\xc3\x98\x0b\x3c\x5d\x12\x26\x38\x00\x8b\xbb\xf6\x02\x23\x1b\xc8\x00\x91\x55\x29\x98\xad\x2d\x99\x58\x48\x81\x49\xa1\x9d\xee\x56\x03\x27\x68\xa4\x03\x84\xb8\x00\xe0\x1e\x01\xc4\x83\x80\x98\x65\xa1\xaa\x7b\x45\xf0\x7d\x8e\xc1\x6a\x47\xad\x18\xef\x66\xbc\x6b\x88\x4c\x89\x78\x6f\x98\xf8\x14\xaf\x0b\x13\x70\xbf\x18\x32\x76\x43\xdb\x64\xf7\x27\x3c\xcc\x77\xe6\xbe\xe3\xc3\x5e\x61\x44\x7b\x01\x65\x35\x54\x89\xc3\xa5\xdc\x32\xf7\x2b\x49\x66\x34\xd4\x4b\x41\x98\x82\x23\x2f\x71\xbd\x12\xab\x1b\x8d\x99\x63\xb7\xfc\x22\x20\x4e\x0d\x9d\xdb\xeb\x1a\xee\x58\xf6\x65\x07\x54\x37\xab\x58\x60\xda\xb5\xb5\xcd\x7b\xc7\xcb\x7c\x87\x2f\x28\x60\x0d\x89\x31\x36\x1c\x53\x71\x9a\xb4\x0a\x6d\xa0\x32\x20\x2d\xe5\x0a\x9a\xe1\x38\xb0\x3b\xaa\x19\x24\xb2\xb8\xe3\xfc\x46\x95\x85\x12\x67\xba\xb8\xb3\x3b\x21\x88\x77\x5c\xfa\x02\x18\xbd\x12\xa3\xa0\x74\x5a\xf4\xb9\xaa\x11\x0b\xcd\x0e\xad\x35\xbd\xc6\xdc\x01\x5d\x88\x99\xda\x54\xe8\x56\x3b\xfd\x53\x22\x4e\xbe\xff\xee\x7b\xe2\x86\x9a\xea\x75\xf4\x25\xbd\x12\x27\xdf\x7f\x7b\x82\x7f\xfc\x30\xbc\x9c\x08\x8f\xd9\x39\x2f\x95\x44\x99\x73\xf2\xfd\xf7\xdf\x06\x8f\x5c\x86\x75\x63\x90\xb9\xef\x91\x4a\xe2\x97\xdc\xdc\x5d\x15\xf6\x6c\x18\x99\x07\xed\x07\xdd\x38\x84\x1c\x41\xe4\x1a\xd0\x85\xf8\xa1\xce\xb7\xe2\xf4\x25\xf4\xfc\xe4\x88\x79\xc6\xb8\xe6\xc8\x1e\xcb\x78\x29\xc0\x4f\x44\xd7\x73\xc6\x7c\x51\xb9\xba\x93\x45\x15\x27\xe6\x45\x5e\xee\x51\xa4\xf2\xd8\x13\x63\x74\x4d\xfa\xd2\x42\xb1\x74\x02\xf6\x7d\x2c\x0d\xf3\x81\xd9\x90\x14\x3a\xd8\xda\xb4\x9e\x2e\xae\x18\xe8\x77\xc0\xeb\x81\x73\x13\xbc\x40\x9d\xdd\xe1\xc5\x70\x98\xfb\x70\x82\x65\x69\xc7\x9d\x55\xe0\x48\xea\xf4\x5a\x76\x6a\x90\xc0\xc1\xc6\xd8\x46\xc1\x89\x0c\x6a\x07\x76\xfb\x3e\xb9\x82\xbd\xf5\x1a\x10\xb1\x84\x1e\xa7\x66\xda\x98\xcb\x98\x6c\x5e\x92\xc8\xf1\x1a\x16\xa1\x05\x99\x5a\x7c\x33\x93\x17\x31\x0a\xd2\xc5\xd7\x67\x6f\xaf\x95\x82\x39\x86\x28\x79\xfb\xf7\xf4\x51\xe9\xc5\x77\xfb\x96\x5c\x43\x81\x50\xa1\x3d\x4a\xea\xfd\xad\xac\x8c\x06\x6d\x76\x47\xa1\x1a\x66\xa4\xb7\x3e\x17\x82\xbb\xe4\x19\x27\x8a\x50\x7c\x8e\xf9\x8c\xb6\x82\x0c\x39\x04\x72\xa8\x6e\x95\x26\xd8\x4b\xa4\xe4\x85\x42\xc8\xa0\x0f\xc9\xe3\x90\x07\x84\x96\x9f\x30\xf3\x2e\xbc\x02\xc1\x7b\x2c\x69\x76\xd4\x2f\x55\x26\x73\xf7\x09\xae\xe0\x8b\xc7\xc8\x73\x94\xb3\x0d\xd9\x65\x79\xac\x74\xa9\x6e\x34\xfc\xd7\xbd\x16\x87\xa7\x47\x40\x5f\xac\x10\xbc\x28\x5b\xb5\x67\xe6\x36\xa2\x98\xf4\x50\x20\x8e\x1f\xd7\xc4\x42\xda\x19\xc5\x81\xae\x44\x74\xc9\x79\x28\x0d\x42\x3e\x30\x90\x93\xf8\x7e\x6f\x8f\x9c\xe9\x1e\xe8\x14\x2b\x4a\x82\x30\x32\xd5\x48\x05\x87\xdb\x95\x25\xcb\xa0\x80\xd5\x4f\x45\x68\x59\x9c\x9d\x5d\x8e\x92\xf6\x30\x5d\x36\x07\x06\xc4\xb3\xbf\x2a\x97\x37\xb1\xd8\xb2\xf3\x9c\x36\x01\xa9\x6f\xa5\x84\xc2\xb3\x8f\x62\xbf\xd9\xda\x3e\xef\x1a\xf0\x75\xdb\x23\xe3\x9e\xd5\xa5\xc8\xf5\x8d\xb6\x8d\x74\x6c\x42\x7f\x29\xc6\xf1\x5d\xd6\x78\x3a\xde\x42\x66\xcf\x20\x50\xc1\x46\x11\xea\x45\x4d\xfb\xbb\xf9\xfa\x01\xe4\x1b\x1c\x2f\xeb\x12\x2c\x4a\xdf\xd1\xda\xc8\x1b\xa2\x97\xc8\xb3\x82\x02\xd8\x14\xac\xf0\xd8\xcb\x98\x8a\x28\xee\xd5\xc2\x64\xcd\xfa\x3b\xc8\xe7\xf2\xa5\xda\xe0\x06\xe1\xa4\xaf\x0e\x86\x99\x87\x12\x10\x60\x5f\xfb\xbe\x05\xc5\x44\x7e\xe1\xb0\xb0\xdd\x25\x4d\x84\x06\x41\x6b\xa6\x69\x1c\x84\xf7\xab\xa0\xc4\xfb\xb6\xaa\x36\xaf\x9e\x3d\x5b\xd2\xb3\x4b\x9a\x5e\x5d\xde\x3c\xeb\xfd\xe3\xc1\xc9\xf6\x9e\xcd\xe4\x2f\x1b\x59\xdd\xfe\x0e\xb8\xaf\xfc\xf3\x30\xfe\xeb\xf3\x97\xcf\x5f\xb6\xf0\x5f\x5f\xbc\xfc\xe6\x2b\xfe\xeb\x1f\xf1\x13\xa3\xb4\x9f\x3e\x7f\xfe\xfc\xd8\x2e\x83\x55\x62\x3f\x2a\x57\x90\xde\xdb\xeb\x7b\xa9\xcb\x45\x84\xbd\xbd\xa9\x6a\x72\x83\x81\xd8\xc8\x0a\x06\xba\xb7\xbf\x09\x08\xd9\x4d\xd2\xc2\x8e\x09\x43\x52\x09\x96\x89\x3b\x11\xd4\xa6\xca\xf6\x75\x80\x0d\xa2\x9e\xb5\xc2\x84\x92\x93\x9e\x88\x3b\x85\x89\x85\x01\xef\x3c\x04\x1f\x4b\x05\xcc\x64\xde\xa9\xd7\x91\x95\x88\x57\x20\xd2\xa3\x85\x9e\x3e\xd6\x6a\x7d\x5f\x7c\xb6\x3d\x17\xe6\x37\xfb\x90\x15\xe1\x34\x70\x1f\xc2\x32\xea\x5f\xdd\x8d\x20\xd5\x1f\xa6\x09\xbb\xc5\x48\x14\xc1\x34\xd1\x78\x53\xbd\xac\xbd\x7a\x4a\x49\x3c\x54\x81\x2a\x2b\x55\x66\x32\x0f\xca\xaf\x9d\xbe\x13\x8e\x87\x6b\xec\xe7\x9c\x89\xb9\x3f\xeb\xff\xf9\x52\x56\xb7\xfb\x3e\xb4\x8b\x70\xf5\x29\x86\xe2\x20\xf3\x89\x6c\xfa\xb5\xae\x18\xde\x8a\x69\x85\x3d\xca\x65\x66\x02\xaa\x24\xda\x21\xbb\x32\x94\x50\xd2\xb7\x7f\x9f\x88\x0d\xba\x3b\x19\x85\x9d\x2e\xef\xff\xd1\x90\xa0\xd3\xe5\x0d\x17\xaf\x5e\x3e\xa1\x1f\x81\xd9\xb9\x94\x79\xae\x52\x3f\xdc\x44\x14\x1a\x91\xa2\xfc\x0c\x78\xc3\x16\x3d\xe0\x76\x82\x92\x47\x07\xe3\x93\xf3\xa9\x21\xdb\x35\xb0\x72\xde\xcb\x42\x12\xee\xe2\xe1\x66\x1d\x0e\xe2\xa8\xb7\x37\xf4\x90\x69\x44\xd5\x81\xd7\xe2\xe1\xa2\x76\x2c\xff\xe4\x24\x3d\xf2\x3c\xef\x5c\xe3\xc3\x09\x1a\x45\x7a\x5c\x1b\x55\x36\xb6\x46\x7b\x0f\x94\xad\xe3\xfe\x4c\xf3\x48\xfd\x7c\xb1\x3e\x57\x08\xb9\xfc\x58\xe8\xfb\x5c\xa5\xd4\x7f\xdb\x91\x3b\x99\xab\xc2\x39\x18\xdc\x19\x7a\xb5\xb7\x0f\xb6\x3e\x6d\x0c\x6f\xb4\x78\xe6\x47\x64\x38\xf1\xfe\x98\xe6\x44\x1d\xd2\xc5\x7b\x7f\x7f\xdf\x0b\x66\xe9\xd9\x51\x6f\x7f\xaf\x1f\x73\x86\xc0\x81\x73\x9d\x83\xbe\xd1\x4d\xee\x29\x01\x6b\xc3\xaa\xae\xd5\xb3\x4c\xa0\x80\xf8\x3b\xbe\xf9\xa9\x3d\x88\x39\x31\x81\x4c\x84\xc6\xfc\x9f\xff\x33\xd0\x38\x1d\x1c\x20\xd2\xf0\xf8\xba\x93\xaa\x29\x0a\xe8\xfd\xa1\xac\x4d\xc2\x76\x98\xa1\xa9\x07\xe7\x31\x0b\xd2\xec\x5d\x7f\x04\x01\x3b\x37\xe9\x88\xd5\x3c\xf3\xc1\xcf\xc9\x0f\x83\xb3\x39\x82\x1b\x0f\xdf\x5c\xcd\xed\xdf\x7c\xf8\x8f\x63\x7c\xe7\xc3\xe9\xe0\x6c\x6e\x47\xe6\xff\xe5\x83\x7d\x2e\x02\xe8\x42\x7b\xc9\x6e\x2e\xa2\xc3\x47\x66\xe7\x72\x3a\x39\xbb\x9a\x42\x5c\x17\xe3\x75\x6f\x66\xf3\xe1\xfc\x6a\x3e\x10\x6f\x27\x93\x73\xe8\x38\xa3\x8d\xbf\x76\x1c\x44\x57\xb3\x41\x02\x04\x44\xf0\xe1\xcb\xe9\xe4\x62\x38\x9f\xbd\xb6\xff\x7e\x73\x35\x1b\xc2\xfc\x0d\xc7\xf3\xc1\x74\x7a\x75\x39\x1f\x4e\xc6\x47\xe2\xdd\xe4\xc3\xe0\xc7\xc1\x54\x00\x13\xd9\x39\x4c\x34\xc5\x38\x29\xba\x39\xb9\xf0\x28\xdf\x3e\x08\x8c\x38\xce\x04\x03\x3d\x9b\x4f\x87\x67\xf3\xf0\x31\x3b\xa9\x93\xe9\x3c\x24\x4e\x1a\x0f\xde\x8e\x86\x6f\x31\xa8\x1c\x84\xca\x8f\x5c\xd0\x73\x38\x26\x2a\x90\xeb\x16\x3d\x13\x85\x42\x79\x5b\xfa\xa0\xe7\x93\x43\x9c\xff\x80\x7a\xeb\xd7\x9f\xdf\xe6\xa7\xf7\x6c\xf6\x61\xf4\x3b\xea\xfe\xff\xbf\x27\xe8\xff\x27\x27\xdf\x36\xf4\xff\x93\x17\xdf\x7d\xe5\x7f\xf8\x43\x7e\xe6\x8e\xbf\xd2\x44\x30\x47\xa1\x6e\x52\x69\xab\xcb\x25\xa0\x9d\x72\x86\x5e\x12\xb0\x16\x25\x04\xd9\xc1\x91\xda\x50\x7b\x82\x3a\x03\xab\x60\x45\xba\x05\xfb\xba\xc8\x19\x93\x34\x54\x7d\x07\x1e\xdf\xae\xcd\xb2\x6d\xa2\xf6\xee\xe1\x5e\x08\x0e\x0c\x35\x62\x49\x35\x91\x9e\xd0\xca\x79\x27\xef\x54\xb9\x90\x55\xb6\xe6\xa8\x43\xa4\xa3\x43\xec\xa9\x15\x3b\x48\x78\x58\x88\x90\x85\x40\x4f\x62\xa5\x54\x14\x7e\xe6\xe1\x70\x30\x9f\x5d\x3f\x60\x0e\x99\x9e\x78\x1f\xa1\xc4\xb0\x7f\x2d\xd2\x30\x17\xaa\x83\x12\x34\x2b\xdd\xda\x40\x70\x4b\xa9\x94\x5c\x14\x56\x6d\x0a\x9c\xa6\xa0\xaa\x80\x27\xdb\xe3\xb5\xd8\xd5\x6c\x4e\x2c\xd4\x4e\xa9\xfb\xc0\xeb\xcd\x10\x48\x1e\x25\x99\x02\xa9\x88\x29\xbb\x21\x00\x33\x4f\x39\xe6\x90\xde\x31\xa9\x74\xdb\xdb\xeb\xd6\x14\x02\x0d\xc1\x91\x79\xc4\x5a\xc1\x7c\x02\x57\x16\xf2\xe8\x01\x03\x46\x4b\x3d\xe8\x4c\x0a\xfa\x62\x7e\xc2\xd6\x05\x38\x9c\xcf\xc4\xf9\xe4\xec\xea\x3d\xe7\xb2\x39\x4e\xc6\xf3\xc1\x74\xf8\x23\xd0\x63\xcc\x90\x30\x74\x72\xe1\xef\xcb\x70\x58\xef\xfa\x3f\x0e\xbe\x30\x51\xa8\x17\x35\x40\x54\x20\x7e\x62\x60\xac\x17\xc3\x33\xc8\xf8\x63\x4d\x2c\xe4\xf7\xfa\x4d\x95\xc2\xa7\xe4\xc7\xd9\x2e\x8e\x27\xe3\xe3\x30\x49\xae\x27\x76\xeb\xb8\x8e\x3b\x45\x38\xee\x14\x6c\xe4\xc1\x71\xc3\x4c\x8e\x27\x62\xf2\x66\x34\x7c\x8b\xb4\x16\xf3\x89\x23\x86\x79\xdf\xb7\x1a\xd7\xb8\x3f\x3e\x1b\x24\x62\x76\x75\x79\x39\x99\xce\x13\x71\x75\x79\xde\x9f\xdb\xe9\x18\x8c\xdf\xd9\x3f\xd9\x9e\xcd\x60\x11\x81\x40\x73\x78\xd6\x27\xbe\x8b\xb7\x93\x1f\x07\xd3\x31\x68\x81\x57\xb3\xc1\x2b\xe6\x0e\x06\xc9\xb4\xb4\xa7\x17\x95\xfc\xf0\x34\xea\x42\x2c\xd4\xad\xcc\x57\x7c\x9c\xaf\x7a\xb3\x9e\xb8\xd1\x77\xaa\x2c\x50\x24\xd8\x5f\xbe\x75\xff\x1d\xfa\xa6\xa1\xb0\x69\x7f\xea\x69\xd0\x11\x94\x6f\xbf\x65\x24\x61\xda\x2c\x3a\x75\x1b\x16\xb9\x07\x7e\xa7\x97\x2e\x54\x0a\x54\x68\x7d\xdb\x61\x82\xe0\x9d\xaa\x9b\x3a\x27\x79\x72\x78\xd1\x9f\x1a\x28\xb3\x3c\xcb\x65\x6d\x94\xf8\xe6\xb4\x77\x7a\xfa\x5d\xef\xe4\x7b\x71\xb8\x3c\x12\x87\xa7\x47\xbd\x5d\xe3\x56\x0f\x0c\xfb\x5c\x6d\x64\x59\x71\x00\xf5\x5c\xad\x50\x0c\x46\x2f\xb9\xc8\xf9\x32\x97\xc6\xa0\x3f\x5f\x1a\xb1\xef\x41\x28\xb0\x1c\xa5\x52\xa5\xe3\x61\xdb\x77\xae\x8b\x2f\x9c\xc3\x78\x66\x68\xac\xa7\x38\xd8\xe3\xef\x9e\x9f\xbc\xc0\xe1\x9e\x40\xf2\xee\xb9\x9d\x94\x47\x42\x17\x49\x20\xad\x29\x9c\xe6\x17\x3c\xe8\x9c\xab\xd7\x30\x90\x40\x81\x01\x13\x7b\xa9\xd1\x84\xb5\xae\x4a\x78\x23\x20\x2d\x8c\xed\xe3\x82\x82\x8a\x61\x32\x1b\x07\x22\x7d\xa0\x9d\xa3\xca\x1c\x85\xd9\x7b\x73\x2d\x86\xe3\xd9\xbc\x3f\x1a\x61\x5a\x6d\x24\xd1\x90\xc9\xe6\x9f\xc6\x93\x0f\xa3\xc1\xf9\xdb\x81\x98\xbf\xeb\xff\x3f\xec\xfd\x5b\x6f\x1b\x47\xd6\x2e\x00\xdf\xfb\x57\x14\x04\x6c\x58\x02\x5a\x6d\x4b\x3e\x24\x71\x36\xde\xf7\xa5\x25\xca\x66\x22\x89\xda\x24\x15\x8f\x33\x08\x26\x45\x76\x91\xac\xa8\x59\xcd\xdd\xd5\x2d\x45\xbe\xfe\x7e\xc3\x77\xb5\x81\xf7\x26\xc0\xc6\xf7\x07\xe6\x2a\x57\xdb\x7f\xec\x43\xad\xb5\xea\xd4\xdd\xd4\xc1\x49\x3c\x99\x19\x09\x18\x8c\x43\x36\xab\xeb\xb8\x6a\x1d\x9f\x67\x02\x1f\xc2\xe9\x1a\xf5\x7b\x87\xf8\x0b\xc8\x24\xc6\x64\x57\xf7\x08\x90\xed\x8c\x27\xe6\x60\x0e\x26\xf6\xc0\xd2\x77\x9d\x94\x38\x46\x7c\x76\xd3\xcb\xfc\xa3\xb5\x99\x87\xbf\xfb\xfe\xa5\x4f\xa6\x1f\xe4\x7a\x7f\x77\x2f\x7d\x9a\xbe\xfc\x83\xec\x80\x5b\xf4\xff\x67\xfb\x5f\x3c\x6f\xfa\xff\x9f\xef\x3f\x7f\xd0\xff\x3f\xc7\x9f\xf5\xba\x21\x15\xcf\x16\x6c\x86\x2d\x12\x8c\xbe\x84\xdd\x52\x33\x6e\xe5\x72\x6a\x1f\x01\x44\xe3\x3c\x8f\xaf\x2f\x74\xe1\xcf\xa2\xa0\xc2\xde\x57\x5f\xbd\xdc\xdd\x7f\xba\xf7\x94\x7d\x53\xe7\x92\x2b\x36\x62\x63\x71\xc5\xcb\x2c\x65\x0f\x51\x05\xfb\xb6\x3b\x04\x15\x3c\x90\xa7\x8b\x4c\x7a\x13\x22\xf0\xbb\xaf\xa4\x76\xc9\x5d\x22\x43\x1e\x5d\xf7\x3d\xb4\xe9\x5d\xc1\x57\x65\x41\xf7\x93\xcb\xa6\xb4\x6d\x3a\xa5\xa1\x6e\x19\x75\x50\x38\x4e\xae\xda\x24\xf6\xf4\x5a\x12\x81\xca\x91\x58\x54\x0d\x05\xc7\x15\x2d\xf1\xf5\xba\x14\xb4\xc1\xa6\xb5\x43\x75\xb7\x56\x95\x8d\x32\x80\xef\x56\x64\x76\xba\x09\x36\x4b\xe3\x90\xa6\x82\xad\x73\x2e\x15\xc0\x48\x02\x98\x2a\xc7\x34\x3f\xca\xec\xd8\x38\x2d\x0c\x52\x89\xad\x4a\xd0\x1e\x3c\x05\x08\x26\x0d\xdc\x0e\x54\x16\xc2\x98\xc0\xef\x14\xe5\xa0\x8b\x7f\xb6\x39\xdc\x71\x83\x73\x99\xaa\x82\x50\xc5\xde\xec\x6a\xfe\x67\x72\x34\xd3\x58\x1e\x7c\xc8\xff\x3a\x3e\x64\x92\xfe\x28\xfb\x13\xf6\x93\x86\x7f\xfc\x97\xb9\x4f\xd2\xa2\x5c\x30\xb8\x58\x9e\xd8\x1b\xc6\xa1\xf6\x81\x66\x62\xce\xdf\xcb\x30\xb3\xf1\xe9\xde\xd3\x07\x6d\xf3\x77\xf8\x4b\x9f\x9c\x0e\xc7\x7f\xb0\x03\xf8\x16\xfe\xdf\x2f\x5e\x3e\x7f\xd1\xf4\xff\xbe\x78\xd0\xff\x3e\xcf\xdf\x69\x7f\x32\xf8\xbe\x7f\xca\x86\x67\xfd\x53\x36\x1e\x9e\x8f\x0e\x2c\x29\x69\xff\xd1\x77\xfe\x04\xb6\x89\x43\x6d\xf6\xb4\x39\x9e\x7b\x69\x64\xf2\x9f\x6b\xc7\xd8\x10\x69\x72\x8d\xac\xae\x0b\x7b\xfb\x1e\x18\x53\x5b\x64\xec\xa0\xc8\x1a\x9c\x1c\xdc\xdc\x96\x65\x86\x09\x73\xfe\x8d\xf8\x3e\x42\x9f\xf1\xfc\x6b\xe0\xa4\x24\xf2\x16\x04\xd5\x04\x60\x54\x4d\x09\x90\x8e\x2d\xce\x66\xf2\x12\x37\xa1\x91\x2d\x91\x87\xd6\xbf\x68\x3f\x7e\x11\xa3\x19\x09\x39\xad\x66\xc5\x6a\x1a\x55\x92\x05\xb5\xd2\x66\x40\x09\xdd\xe8\xb1\x0f\xb8\x76\xcc\x41\x41\xf3\x3e\xa9\x23\x7e\x18\x12\xe0\xa6\x34\x26\x28\x09\x98\xd5\x39\x2f\xc3\x9f\xfa\x2e\x3f\x83\x2e\xfb\x09\x0d\xfb\x1a\x75\x8c\xb5\x3a\x45\x89\x73\xb7\x8d\x08\x7a\x19\xfd\x12\x72\xe0\xb1\xea\x82\x47\x04\x5d\x6b\xac\x42\x87\xb7\x97\xa2\x98\xfb\x6e\x3e\x4f\xd9\x56\xdf\xf3\x5a\x1c\x86\xfb\xe4\x44\xcc\x96\x5c\x49\xbd\xf2\x84\x9b\x2b\xfb\x91\xcd\x74\xcd\x91\x72\x65\x1d\xb0\x0d\x34\x53\x05\x40\x15\xa5\xca\x82\xea\xda\x25\x82\x06\x6c\x1a\x21\x37\x61\xc6\x2b\xee\xbb\xf7\xc2\x74\xef\x67\x31\xab\x81\xbc\xc8\xf6\x23\xda\xa8\x21\x73\x6b\x40\xb9\x39\x46\x35\xd5\x3c\xe2\x9b\x7b\x99\xb2\xad\x81\x39\x38\x3c\x67\x87\x94\xc8\xb0\x81\x36\x30\x20\x20\x0a\x92\x64\x29\x3b\xb6\xd5\x86\x1d\x7b\xf0\x56\x1b\xf9\x08\x01\x95\xfa\x3f\x2f\xe5\x54\x56\xac\xe7\xbb\xf4\x45\xca\xb6\x8e\x79\xb9\x10\x25\x0b\x69\xda\x88\x9d\x09\x13\xe5\x71\x27\x88\xc6\xc0\x8d\x86\xdb\x58\x57\x34\xc0\x66\xf4\x76\x72\x96\xfa\x54\x8d\x1b\x79\x0c\xf7\xd2\x2f\x3d\x0b\xa4\x9f\x13\xe9\x63\x46\xe1\x93\x7b\xee\xd9\x70\x61\x96\xc8\xeb\x15\x55\x3d\x82\x3f\xcf\x61\x09\xac\xf8\xcf\x61\xa1\xd2\xba\xd0\x5a\x02\xae\x9b\x85\x2f\x21\x5b\x10\x72\x49\x6d\x2a\x3f\xcd\x36\x7a\x06\x91\x68\x95\xb2\xa8\x61\xfb\xe1\xfc\x26\x58\xee\x42\xd6\x70\x0c\x2c\x32\x2b\xd4\xa5\xb8\xa6\x60\x8c\x54\x7e\x20\x5f\xa5\x6c\x2b\x3a\x42\x9e\x8c\xca\x97\xce\x98\xbe\x03\x84\x5f\x2e\xaa\x28\x47\xc8\xf4\xa3\xb2\x04\x32\xba\x2a\x6b\xa2\xf7\x9a\x33\x87\x39\xdc\x71\xd8\xb1\x84\x8d\x18\x9f\x62\x81\x87\xc8\xad\xf1\xf6\xd6\xb6\x6e\x94\xe8\xbc\xb4\x28\x89\x74\x67\x2e\x73\xc8\xe3\x8d\x1a\x61\x52\x07\x90\x4e\x3d\x4c\x27\xbe\x75\x24\x96\x41\x16\x11\x60\x20\xc0\x44\x48\xc8\x66\x3d\x5b\x43\xd8\xd0\x7d\xff\xde\xd7\xf8\x5e\x25\xae\xb0\xb1\x18\x5b\xd9\x26\xe0\x77\x8b\xb5\x5b\xdb\xdf\x4b\xf7\x9e\x86\xa4\x9b\xa1\x78\x0d\x0f\x20\x98\xf6\xe4\xf5\x76\x42\x09\x0e\x87\x03\x8c\x89\x68\x15\xee\x73\x80\xcd\x5a\x34\xee\x17\x28\xf4\x43\x12\xdf\xc6\x26\x96\x95\x5b\xc4\x4e\x14\x24\xca\x54\xcf\x4b\xc1\xb3\xeb\x78\xf9\xe3\x23\xdc\x75\x6a\xf7\xf0\xde\x3f\xe3\x70\xa0\x0e\x72\x2e\x57\xd1\x2e\x5e\xe3\x17\xe0\x70\xd8\xd6\x3b\x09\x70\x6f\x14\x57\xa6\xcd\x88\x7b\xc3\x9f\xa3\x9b\xaa\x1c\x12\xb6\x12\xd5\xb2\xc8\x12\xcf\x04\x06\x47\x6e\x0d\x80\x66\xb5\xc6\xf7\xe0\x4d\x14\xbc\xdd\x8b\x0a\x66\x23\xdb\xe1\x65\xb9\x67\x46\x10\x4c\x7d\x28\x92\xd7\x50\xe3\x55\x5a\xf6\x61\xda\x32\xd1\x24\xcd\xc1\x15\x00\x7a\xcc\xaa\x19\xe2\x95\x55\x44\x51\x93\xe7\xe6\x91\x3a\x17\x9a\x49\xbf\x23\x13\xb6\xce\x6b\x3a\xf4\xde\xdb\x06\xb4\xa3\x73\x3e\x13\x18\xef\xc0\x13\x44\x87\xce\x6c\x9b\x75\xa5\x9d\xdb\x01\xf4\x9a\x22\x8f\x38\xfa\x10\xdb\x4f\x57\x3c\xf7\xc0\x8b\x5c\x31\x7f\x9f\x41\x30\x3b\x74\x5f\xb9\x52\x70\x49\x54\x8f\xbc\x94\xc0\x95\xca\x17\xa6\x9b\xd5\x2d\x72\x85\xf8\x29\x45\x9e\x23\xb9\x4a\x12\x68\x71\xf1\xd5\x61\x27\xd1\x29\x2e\x8f\x35\x9b\x2d\x0b\x39\xc3\xe2\xc5\xe8\x18\x58\xd6\x58\x45\x14\x84\xc4\xb7\x08\x8c\x26\xb3\xa5\xbc\x74\x44\x9b\x21\xc2\x6d\x08\x2b\xc3\x32\x61\x7f\x47\xea\x67\x26\x76\xf1\xb7\x08\x32\x65\xdd\x59\x9a\x5d\xc9\x4c\x18\x99\xee\xba\x3d\x07\xc0\x1a\x2a\xf4\x0c\x36\xcc\xbe\xe5\x0e\xdc\x2e\x4a\xf8\x57\xb9\xb5\xb3\x89\x47\x90\xc7\x4c\xad\x1b\xf8\x04\x13\x2a\x54\x5e\xad\xf3\x6b\xbb\xf7\xc3\xab\xc4\x5e\x9e\x49\x8b\xaa\x83\xb3\x79\x0d\x82\x7f\x13\xc0\xbd\xd4\xba\x6e\x61\x4e\xbd\x34\xc7\xf6\x28\xa6\x91\x05\x20\x2f\x1c\x97\x2f\x17\x53\xd7\x9e\x63\x16\xb5\x01\xd8\x6a\xe6\x8c\x69\xfb\x1f\x39\x48\x08\x5b\x8f\x6f\x89\xba\x56\x2b\xe0\x21\xc2\x9d\x09\xe3\x81\x6a\xce\x23\xe0\xe5\x6b\xb0\x57\xfb\x2d\x9e\xb0\x2d\xfa\x8d\x3d\x86\xdb\x1c\x61\x5c\xd7\xc5\x15\x10\xf4\x02\x20\x32\xbc\x4b\xe1\xbf\xe1\x7a\x9f\x71\x0b\x25\x89\x1f\xd2\x5a\xaf\x7c\xe2\xac\x45\x77\xb3\x10\xb6\xf6\xce\x9f\x5e\x63\x2f\xf9\x2c\x66\xf8\x85\xf1\x00\x0a\x90\x25\xac\x36\x4d\x00\x21\x16\xe8\x78\x73\x39\xaf\xa0\x56\x66\x06\x69\xb9\x2f\x9e\xfe\x8f\x1d\xbb\x5a\x45\x5d\xb9\x60\xa3\x5e\xf2\x12\xad\x8f\xa9\x50\x62\x8e\x78\x4a\x51\x93\x41\xaf\xac\x97\x37\x3c\x01\x0d\x99\xbb\x6f\x56\x6e\xd2\xa9\x06\x12\xcd\x59\xf7\x97\x1b\xe9\xcb\x76\x6f\xe5\x2f\xf3\xe9\x2f\x11\x2e\xb8\xb3\xc9\x62\xb6\x77\x73\xf2\x84\xf9\x14\x85\x71\xa0\x0f\x98\x95\xc4\xdd\xd1\xfd\x03\x3a\x10\xdb\x81\x22\x4d\x12\xbc\x28\x7d\xc1\xce\x4e\x43\x9e\xb7\x87\x6a\x53\x95\x4a\x0f\x6c\x16\xe4\x2b\xad\x73\x7e\x9d\x58\x02\xbe\x24\x24\x99\xe9\x08\xd8\xc6\x72\x6e\xbb\x43\xeb\xdd\x69\xc5\x1d\x1a\x56\x91\xa5\x39\x0e\xe0\xd1\x58\xa0\x73\x03\x3e\x5f\x30\x47\x53\x3b\x47\x78\xa7\x6a\xba\x54\x99\x54\xf3\x52\xaa\x85\xd7\xa7\xf1\xce\x49\x28\x47\xd9\xc8\x72\x91\x03\x07\x60\x31\x6f\x2a\x07\x54\x87\x9f\x60\x6c\xdd\x58\x92\x09\xce\x10\x81\x1b\x9b\x95\x15\x79\x4e\x3c\xd9\xc0\xb9\x60\x44\x9f\xe6\xb9\x48\xa2\xea\x00\x30\xda\xcd\x1c\x16\xba\x8d\x62\xbd\x79\x8a\x02\xdd\x6c\x7b\xb6\x13\xd6\x79\xea\x10\x06\x2d\x42\x7c\xdd\x4f\xf7\x80\x37\x46\x65\x30\x27\x46\x44\x7b\x2a\x00\x4a\x4f\xca\x8c\x7c\x6f\xaf\x3f\x66\x2d\xf9\x95\x6c\x28\x4b\x77\xe5\x56\x37\xbd\xcd\x76\x5a\xd9\x03\x61\x07\x4d\xc7\x10\x7d\x05\xe0\xd4\xab\x10\x47\x45\xba\xb1\xbd\x62\x7b\x08\x94\x0d\xd7\x2c\x68\xa3\xe6\xfc\x81\x22\x1c\x10\xab\x44\x9d\xfc\x9a\x41\x35\x25\x22\xb5\x6e\x7c\xa6\x28\xd9\xb3\x1d\xa2\x52\xc4\xed\x81\xa5\xfd\x20\x0d\xcd\x4e\x79\xc5\x08\x04\x3b\x46\x7d\xdb\xa0\xf9\x5a\xc4\xec\x5b\x8d\x7f\xdc\xf2\xc4\x22\x6e\x73\x47\x90\x41\x6d\xe6\xa1\x5f\xf7\xd3\xfd\x34\xbc\xe6\x49\x40\xd1\xb7\xe3\xfb\xcb\x92\x04\xfd\x0b\x61\x93\xbf\x83\x58\xfb\xa3\x05\x54\xe4\xdc\xf9\x1d\x65\x53\xec\xb7\xb1\x6c\xfc\x53\x82\xdc\x09\x27\xa9\x5b\x6e\x91\x3a\x07\xba\x22\xab\x95\x83\x53\x98\x72\x2d\x5d\x38\x15\x1e\x69\x4a\xb4\x86\x2f\xe0\xb7\x49\xb8\xbb\x09\xb8\xa4\x21\xe1\x6e\x70\x8e\x85\x23\xa7\x31\xf2\xbc\x50\x22\xa8\x55\x09\x37\x38\x8c\xd3\x18\x49\x1d\x3e\xbe\x78\xe6\xec\x5d\x1d\xfc\x7a\x27\x10\xae\xb0\xae\x28\x47\x9b\x32\x34\x90\xbb\x37\x88\x53\x90\x13\x77\x1c\x58\xe7\x92\xc2\x4c\x1b\xc1\xd1\x71\x88\xef\xd8\xee\x6f\x9b\x8d\x3b\x0a\x7a\x87\xd3\xb5\x9f\xee\x5b\x21\x6f\xfe\x79\xa3\x9c\x0f\x3b\x84\x12\x1e\x4b\xf6\x63\x9f\x73\x97\x89\x76\x67\x81\xbe\x7f\x5f\x81\x8e\xb0\x25\x56\xa8\x47\x72\x09\x12\xd5\x8c\x80\xcf\x42\xae\xaf\xd6\x9c\x6e\x90\xf3\x9d\x4f\xde\x49\xd4\x7b\x49\x1a\x5b\xa3\xc5\xbc\x73\x49\x37\x4b\xfd\xfb\x6c\x98\xc6\x55\xb0\x2d\x1c\x86\x6d\xe8\x69\xe9\x78\xff\x4e\x88\x40\x0a\x97\x07\x5c\x6a\xcf\xef\x20\x22\x9a\x7e\x58\xcc\xb8\xd0\x82\x8a\xbd\xef\xd6\x7d\x9b\x5f\x10\xb9\x9e\x87\x1e\x4d\xc0\x6e\x9d\x67\x46\xeb\x26\xe6\x1b\x8f\xc6\xe2\xf8\x7c\x9a\xc2\x18\x6d\xa5\x80\x96\x0d\xe1\xd4\x82\x8f\x5d\x24\x02\x76\xfc\x9d\x7c\xa5\xb7\x20\x40\x04\xdb\xb8\x6d\x46\x07\xc6\x61\x34\x6f\x94\x75\xee\x6f\x96\xec\x4e\xac\x98\x77\x32\x3c\x9d\xe7\xb0\x65\x7a\x26\x16\x7d\x67\x03\xdd\xd8\x9d\x98\x32\xc3\xe1\x81\x3a\xe5\xc6\x70\x0f\x0e\x31\xf3\x1f\x5d\xf3\x84\xf0\x75\x39\xc0\x4d\x07\xac\xd8\xba\x09\xd6\xb2\x69\xec\x14\x66\x70\xc0\x65\xfa\xb1\x55\x1e\x1c\xa4\x45\xca\xde\x5a\xd0\x44\xdb\x5d\x37\x11\x2a\x04\x5c\xb1\x1e\x70\x1c\x89\x43\xfd\x6b\x21\xb2\x74\xb2\xb4\x3e\x4b\x5f\xf8\x3d\xbc\x9f\xb2\x1e\x3a\x37\x1c\x98\x58\x18\xa9\x00\xaf\x69\xe4\xce\xbd\xcf\x3e\xb6\xa9\x38\x0d\xa4\x06\x19\x45\x43\xd0\x8d\x76\xdb\xee\xf2\x9a\x49\x65\xd1\xdc\x88\x18\x57\xc7\x3e\x2c\x3f\xff\x25\x00\x7f\x43\x16\x12\x05\x84\x6e\x0d\x2c\x21\xcd\xec\xb5\xd1\x0c\x60\x4c\xc5\x0a\xb3\xa4\x38\xae\x40\xc7\x5b\xdc\xa8\xf0\xa2\x95\xf3\xe6\x60\x4d\x1f\x6e\x7d\x6f\x62\x13\xc5\x00\xdb\x32\xf6\x36\x39\x06\x8e\xea\x4a\xe4\x97\x82\x6d\xef\xed\xef\xb0\x55\xa1\xaa\xa5\x66\xe8\x29\x75\xf7\xa1\xac\x6c\x6c\x22\x37\x67\x78\x66\x66\xc9\x35\x06\xea\x92\x6b\x4c\xcb\x9f\xd9\xf6\xcb\x46\x43\x3c\x88\x64\xc4\xfb\x38\x0e\x30\x46\x1b\x22\xe6\x57\x8a\xc2\xb4\x08\x9d\xef\x36\x7c\xea\x58\x90\x10\x29\x09\x22\x2d\x30\x46\xa1\x74\x4d\xdb\x98\x5c\xd5\x5d\x27\x10\xa7\x27\x2c\xb9\x15\x97\x42\x59\xc6\xa3\xdb\x17\x57\x1a\xa1\x2f\x15\x15\x09\x41\x94\xb5\x23\x8c\xfc\x2c\x35\xc2\x5f\xa0\x43\xb5\x33\x0c\xec\xc5\x14\xba\x98\x78\x9e\xc7\x22\x74\xd3\x79\x20\xbf\x2c\xac\x31\xc6\x21\xec\x41\xb6\x47\xd8\xb2\x88\xbf\xb7\xbb\xce\x93\xa2\xd3\x3d\x15\x2b\xd9\x7e\xed\x09\x1d\x09\x1b\xe8\x24\x6e\xf4\xf4\x2d\x00\x4c\xb9\x8a\xe0\xf7\x1b\x21\x1b\x9b\x9a\x66\x9d\x6b\x48\x75\x62\xdd\x6b\xb9\x85\xd0\x8f\x4d\x40\xe7\x6f\xa5\x2b\xab\x6d\x86\xa3\x07\xda\xde\x58\x55\x23\x89\xae\x33\x8a\x69\x7d\x7d\xc1\x86\x48\x9c\x0b\x80\x9c\xfa\xb6\xa6\x4b\x6d\x16\x05\xdd\x45\x15\x32\x94\x67\x56\x58\x06\x99\x7f\xa0\x8a\x84\x8e\xb9\x4d\x7a\xe4\xb3\xf4\x79\xca\x06\xa1\x85\x78\x66\x2d\xc4\x13\x80\x23\xd3\xb1\x49\x39\x81\x7d\x77\x06\x4a\x19\x6a\x32\x81\x46\x3a\x98\xb7\xf4\x46\x57\x30\x4f\xd7\x90\xd3\x40\x09\x06\x2b\xdc\xc8\x8f\xf5\xcd\xb6\x6a\x03\x20\xf5\x26\x4e\xc3\x2e\xcb\x31\xba\xba\x8d\xbe\xbe\x67\x66\x69\x3f\xdd\x4f\xa2\xc7\x1a\x9b\xaf\x12\x3f\x57\x54\x28\x66\x2b\x1b\xc2\x23\x1e\xe5\x83\x00\x3b\x57\xc6\xb6\x00\x0f\x7a\x8b\x56\xc8\xae\x0e\x65\x57\x40\xba\xaa\x3d\x00\xa4\xdc\xfa\xcc\x11\xfc\x5a\x2a\xa6\xeb\xf9\x5c\xce\x00\x27\x34\x13\x15\x97\xb9\x9d\x3f\x8f\x1f\x0a\x60\x46\x66\x7e\x51\xde\xdb\x33\x3a\xab\xd2\xe6\x42\x14\x53\x0c\x17\xc2\x94\xf8\x15\xf1\x42\xb8\x79\x88\x1a\x12\x91\x6f\xbc\x90\x1b\x73\x87\x55\x2f\xe6\xbc\xae\xcd\xc9\x23\xee\x03\xf3\x06\x84\xc8\x86\x79\x8c\x8b\x1c\xa3\xa9\x07\x23\x28\x90\xc4\x41\x50\x4d\x65\xd4\x7a\x40\xa3\xa0\x2b\xb1\xd6\x6c\x1b\x51\xdd\xb0\x42\x12\x99\xbd\xc2\x98\xc9\x8a\x4b\x30\xb4\x73\xa9\x11\x28\x52\x89\x2b\xbd\x28\x8b\x7a\xad\x77\x42\x1c\xfd\x19\xcf\xcd\x25\x41\x00\x9b\x48\x48\x46\x50\x77\x57\xcb\xc2\xc3\x4a\xb7\x82\x66\xb0\x30\x4a\x5c\x05\x33\xeb\xae\x16\x9c\x79\xcf\x14\x4c\x3e\x83\x70\xd0\xbd\xb3\xc1\xe6\x33\xf4\xb8\x11\xb9\x8d\xd4\xaa\x40\x85\xa7\x84\xf7\x15\xd6\xf2\xd8\x68\x9b\x99\xb4\xcd\x07\xb2\x98\x37\xac\x42\xab\xeb\xe3\x45\xe7\x26\x26\xc2\x40\x75\x68\x80\x38\xec\xde\xd9\xa0\xe3\xf4\xf0\x5c\x17\xae\xa7\xa0\x0d\x85\xfc\x6e\x16\x53\xcf\xed\x88\x86\xa5\xdd\x20\x19\x08\xbe\x0d\x5f\xe4\x52\x9f\x11\x83\x33\x61\xde\x4e\x83\x4c\xf3\x42\x23\x36\x5a\x8b\x34\xf1\x59\x8a\x24\xde\x68\x1a\x87\x4d\x4e\x45\x2e\xc5\xa5\xe5\xc6\xb8\x69\x15\xcc\x0c\xc5\xdf\xbb\x84\x6b\x9b\x84\xb5\xad\x77\xac\x7f\xa4\xb9\x04\xc1\xd9\x26\xb1\x65\xb3\x3b\x3a\x53\x2d\x36\x04\xac\x8d\x36\xcc\x46\x56\x1e\x22\x5c\xa0\x9b\x2c\x77\x8b\x66\x35\x6e\x12\x94\x92\xfe\xbe\xf1\xf1\x77\x9b\xe9\x04\x67\xb3\x6d\x8f\x80\x30\x91\x2e\x99\xdd\xe6\x99\x98\x2e\xaf\x6b\x22\x32\x0a\xae\xb1\x50\xdb\x8a\x74\x65\x50\x1a\x6a\x81\x91\x64\xed\x93\x3c\x88\xd7\xad\x75\xed\xb7\x1a\xce\x0b\xda\xeb\xee\xbc\x73\x8f\x8b\x89\xd7\x7b\x51\x5e\xef\x50\x3d\x2f\x67\x80\x00\xe3\x72\xf3\x73\x79\x21\x72\xd8\xc1\x79\x51\x20\x05\x2a\x36\x43\xef\x68\x70\x8f\x1b\xd3\x11\x2c\x04\x88\x91\x85\x8b\x6f\xd6\xd5\xda\x38\x3c\xcb\x8c\x9a\x8d\x98\x38\xd8\xa3\x70\xad\x29\x53\x87\x06\x11\x49\x50\x9f\xbf\xe4\x47\x0e\xa7\x26\x5c\xaf\x30\xf0\x49\x05\xde\xad\xa2\xf3\xe6\x7d\x84\xa3\x8f\xb4\x82\x0e\xc3\x2d\xd2\x0e\x5c\xbd\x4a\xee\xa0\x03\x23\x4d\xc1\x0d\x77\xb6\x2c\x0a\x44\xab\x06\xeb\x2d\xb1\x04\xcd\x18\x53\x36\x9a\xa1\x00\xad\x38\x71\xb8\x93\x09\x70\x53\x02\x23\x8e\x54\x99\x58\x29\x02\x82\xce\xa5\x33\xdb\x02\xb4\x43\xd3\x70\x30\xeb\xbe\xdf\x4d\x53\xbf\xc3\xdc\xcc\x0a\xa6\x0b\xb4\xf7\x91\xdb\x19\x46\x48\x05\x8d\x09\x41\x29\x57\xed\xa2\xd0\xb6\xea\x46\xae\xb0\xd0\xb1\xe2\xd7\x08\x20\xa0\x65\xc5\xf8\x54\x17\x79\x5d\x99\x2d\x05\x05\xe7\xe8\x40\x77\x18\xf1\x9f\x32\x7e\xa0\x5d\x82\xac\x85\xcc\x32\x21\x80\xab\xd7\x3b\x18\x28\x3e\x00\xb5\xfc\x78\x47\x41\x93\xf3\x9b\x94\x56\xf4\x35\x44\xfe\x46\x1a\xa0\xef\x83\x54\x80\x72\x78\x83\xfa\x6b\x4f\x4b\xd8\x0e\x1d\x40\x5d\xe7\xe0\x14\xbb\xfb\x90\xd1\x4e\x46\xa6\x87\xb9\x28\xbd\x3c\x7b\xd9\xf0\x5d\x15\xf3\x50\x27\x26\x2f\x5b\x2c\xe2\xf8\x75\x18\x49\x68\xba\xd1\x82\x5f\x63\xca\x8b\xd9\x1e\xd2\xa2\x8e\x83\xe4\x5c\xd9\xfd\xe5\xaf\x87\xbd\xdd\x67\xe9\x0b\x74\x73\xa3\x79\x28\x2c\xe8\x66\xc3\x8e\x49\xac\xe5\xfc\x3e\xc0\xa0\xb2\x02\x05\x6c\x95\x5b\x2d\xc3\xae\x24\x1c\x19\xaa\x40\xb7\xb8\x17\xa2\x94\x1c\x3a\xf2\xce\xf8\x5b\x16\x57\x94\x4b\x65\x65\x02\x0c\x6a\x5e\xe7\x73\x09\x89\x0e\x60\x2f\xc4\x70\xa3\x81\x6a\x47\xc5\x42\x38\x1a\xeb\x11\x99\x15\x4a\xaf\xe5\xac\x2e\x6a\x40\x3d\x0d\x70\x72\xef\x60\xcf\x24\x1b\xac\x19\x08\x27\xe6\xe6\x9b\x92\xe7\x1b\x6c\x9b\x0e\x29\x16\x4a\xac\x96\x7d\xd3\xb5\x3f\xc0\xda\xee\xb0\xb2\xe6\xad\x7c\xd0\x96\x74\xb4\xe6\x4a\x80\xe9\x0b\x42\x06\x73\x7d\x12\xea\x31\x48\x49\x32\x94\x09\xbe\xc2\x71\x52\xf8\x5a\x29\xb7\x76\x71\xe5\x9e\xf5\x31\x74\x80\x93\x6e\x76\x2f\x05\x18\x21\x1e\x70\xd8\x5e\x0c\x1d\x63\xf5\x70\xae\x55\x25\x56\x6b\xd0\x8c\xc0\xf1\x0a\x72\x2f\xb7\x06\x81\x9b\xed\xc7\xda\x59\x5f\xed\xbc\x3e\xdb\xa8\x73\xf5\xd3\xa3\x1a\x4f\x4c\xb5\x6c\x42\x89\xbb\x5b\xf6\xf6\x45\xb1\x13\xde\x26\xf5\xb8\x93\x30\xae\x02\xdf\x28\xd9\x61\x12\x03\x59\xcd\x65\x80\x39\xef\x16\xbc\x50\x11\x77\x83\x4c\xec\xbc\x27\xfe\xd4\x52\xda\xdd\x50\x1b\x85\xf0\x17\x69\x18\xef\x6c\x49\x5b\xf2\xe9\x44\x41\x51\x4c\x3b\x5a\x4d\x31\xc7\x35\x3a\x4a\x41\x44\xe5\x7e\xc9\xd4\x5d\x41\xe2\xf0\x95\x98\xc1\x2b\xd5\x22\x37\x96\xc4\xa1\x03\xda\x03\x4a\x50\xd2\xec\x66\xdc\x11\xe0\xba\xed\xa2\xeb\x52\x74\xca\xff\xd6\x96\xf0\x62\xd2\x1e\xa7\x96\xff\x04\x5c\x27\xee\x5a\x2b\x00\x1a\x22\xbf\x66\x87\xa8\xe6\x8e\x81\xd5\x12\xc4\x89\x47\xb7\x80\xdf\x39\x8d\x1a\xdc\xf8\xde\x9b\x48\xe4\x6e\x98\x3a\x47\x79\x73\x1e\x85\xa7\x7b\x9e\x9a\x34\x07\xba\x58\x61\x48\xc3\x27\xdc\x45\x2b\x42\x3a\x38\x52\x6e\x8a\x84\x39\x5e\xbc\xa2\x84\xdc\x3d\x30\xad\x6c\x6f\x63\xdd\xfc\x15\x78\x80\xc2\xde\x6d\xee\xd6\xcd\x59\xea\x5f\x3b\x47\x58\xe4\xbb\xf2\x11\x20\x5f\x40\x4c\x21\x49\x71\x4d\xa4\x22\x29\x1b\xd7\xce\xab\x82\x57\x9d\xbd\x9b\x5a\xa8\xed\xde\xe7\xb0\xc1\x7d\xf1\xdc\x17\xd5\x86\xbf\x77\x19\x8b\xad\x12\xe9\x96\x71\x44\xa0\xdc\x31\xe5\xfa\xba\x2c\x40\xbd\x27\x47\x94\xdf\x07\x7e\x66\x09\x8b\xbe\x6b\x18\xde\x3c\xcc\xaf\xc9\xf9\x63\x21\x99\x02\xef\x4f\x31\x67\x80\xe3\x6f\xec\x72\x7d\x01\x34\x5b\x48\x96\x48\xc6\x99\x27\xcb\x60\xb2\xb2\xfc\x7d\x8d\xa8\x5f\xcb\xac\x8c\xc9\xbd\x80\x55\x5e\xe3\x8e\x0c\x9d\xc3\xdd\xd2\xc7\x58\xb6\xbc\xaa\xf8\x6c\x49\x9a\x45\x97\xb1\x49\x16\x83\x55\x03\x5a\x27\xea\x65\xea\xf4\xbc\x98\xe5\xc2\x99\xbd\x90\xed\x79\x2a\xae\x5a\xfa\xe0\xa9\xa8\xe4\x07\xa1\xd8\x59\x75\xcd\x8e\xab\x8c\x6d\x6f\xd9\x4f\xb6\x90\x23\x9d\xc0\xb9\x1d\x35\x03\x59\xe7\x4a\x5c\xf9\x1a\xec\xf8\x9d\x5d\x68\xdc\x40\x09\x64\x2f\x29\x8b\x27\xbe\x90\x97\x42\x11\x4f\xa5\x54\x8b\x5a\xea\xa5\x11\x85\xf6\x31\x55\xaf\xa6\x5e\xc6\xbe\x34\xaa\x55\x1f\xf9\x1d\x8a\x79\xe7\x58\x86\x6a\xd6\x38\xb6\xce\xa3\xe4\x21\xc6\xed\x0d\x19\x58\xdc\x0d\xb5\xb2\x45\x02\xce\xf3\x2b\x7e\xad\x3d\x2d\x14\xa1\xbb\xc8\xaa\x5b\xcf\xe4\x2e\x98\x92\x06\x4d\xe8\x22\xb0\x04\xcd\xcf\xe9\xd2\x09\x7a\xdb\xd1\x1a\xde\x3c\xdd\x41\x1a\x3f\xe1\x7e\x74\xd3\x6b\xbb\xa2\x00\x64\x06\x86\xa1\x4f\x55\xb2\x4b\xbb\xe4\x0d\x6a\xb0\xc0\xe5\x48\x98\x60\x3e\xc0\xd9\x30\x6c\x9d\xa9\xbf\x99\x2a\xe9\x25\x86\x54\x4a\x79\x89\x30\xe9\xd1\x95\x18\x39\x0c\x2c\x83\x2e\xf7\x54\x2e\x9b\xe2\xa9\xdb\x78\x8a\xae\x43\xee\xf8\xcc\xe8\x09\x28\x82\x21\x94\xb7\x36\x22\x56\x56\xee\xec\xb9\x3a\x8b\x7b\xd7\x37\xec\x04\x37\xa0\x11\xdf\xa5\x00\x67\x05\x28\xaf\x56\xa3\xd2\x85\xd7\x21\xd7\xcb\x92\x6b\xa1\x99\x3d\x3d\x5b\x09\xdb\x3a\x1d\x8e\x8f\x1d\x74\xff\xac\x50\x73\x48\x63\xca\xaf\x99\x96\x2b\x69\xf6\x1d\xfe\xc8\x02\xf4\x7a\xc4\xe0\xeb\xf0\x2d\x36\x93\xa2\x82\xa7\x84\xc3\x6c\xf0\x4f\xa0\x8a\xa6\xdb\x3a\x9a\xcf\x9d\x8c\xea\x2d\x61\xe7\x06\x2a\x1f\x0c\xaa\xb1\xb3\x72\x4f\x53\x84\x4e\xf0\xcd\x3a\xa1\x70\xdb\x6a\xb8\x16\x2e\xd4\x1b\x2a\x24\x7f\xe9\xfe\x2e\x65\xdb\x47\x12\xd3\xb9\xe8\xea\xb9\x31\x3a\x94\xb4\xb3\x15\x43\x95\xcd\x36\x71\x93\xdb\x28\xe0\x29\xc2\xb7\xac\xb4\xc8\x2f\x85\x6e\x71\xe7\xb6\x12\x67\xa2\x6d\xbe\x43\x4c\x8f\x0e\xbe\x60\xc4\x86\x47\x16\x13\xe1\x3d\x6c\x74\x60\xf5\xec\x1f\xb2\x83\xe1\x61\x8c\xd1\x00\x28\x4b\x0d\x52\xca\x2e\xbc\x34\x4b\x78\x6a\x5b\x0d\x79\x55\x13\xd6\x1f\x40\xf1\x7f\x17\x76\xf0\x7d\x68\x53\x01\xdf\x69\xf2\xb6\xdf\xea\xee\xd1\xa8\x0f\xd5\xfe\x8e\xe7\xd4\x43\x3c\x1c\xf7\x01\x33\x6e\x33\xb0\x03\x50\x9b\x3a\xb4\xb8\xc1\xe9\x1b\x04\xbc\xeb\x9f\x4e\x06\xa3\x3e\x1b\x0d\xc6\xdf\xb2\xde\xd8\x12\x8b\xfe\xaf\xf3\x9e\x83\x8c\x38\xeb\x8f\x8e\x86\xa3\x93\x1e\x51\xa6\x76\xf5\xcb\x8c\x07\xe8\x4b\xd9\xf8\xed\xf0\xfc\x18\x61\x2d\xa2\x87\xcc\x44\xf7\xa9\xdf\x83\xef\xfa\x16\xcc\x60\xd4\x1f\x9f\x01\x4a\xc4\xfb\xe1\x39\xdb\x3e\x1d\xe2\xb0\x07\xa7\x03\x44\x82\xe8\x7f\xd7\x3f\x1e\x9e\x21\x2f\xab\x79\x1c\x59\x5e\x03\x18\xe3\x1d\xd6\x1b\x8f\xcf\x4f\xfa\xd4\xab\xf1\xc4\xae\xc7\x69\xff\xa0\x3f\x1e\xf7\x46\xef\x09\x03\x02\xa6\x7d\xd4\x3f\xeb\x0d\x46\x88\x38\x31\x1a\xf5\x81\xcb\x95\x10\xf3\xba\xf7\x0c\x20\x53\x20\xa8\xc4\xd8\x6c\x06\xb3\xa8\x08\x52\x61\x26\xb8\x49\x63\x9a\xb2\xd3\xa1\xc5\x63\x68\x4d\xc0\x60\x4c\xa0\x19\x83\xef\xfb\x87\xec\x6d\x7f\xd4\xc7\x2d\x47\x84\xae\xc1\xfe\xf3\x5d\xb1\xb2\xf9\x8b\x74\x8f\x4d\x62\x9d\x2c\x24\x5b\xce\x39\x7a\x46\x7c\xcc\xc0\x33\xb9\x78\xa3\xdc\xf2\x23\xa9\x0a\xb0\x82\xac\x2d\xdb\xf3\x58\x9a\x1c\xe8\xa0\x1d\x05\xb2\x2d\xc3\xa0\xc6\x12\x88\x96\x48\x91\x25\x31\xc3\x7d\x50\x96\xe1\x5c\x18\xe4\x40\xb9\xe2\xd7\xf6\xbd\x0d\x56\x28\x7b\x74\x7b\x9e\x05\xac\x74\xc8\x9b\xfe\x43\x57\x4d\x8c\x28\x41\x90\x20\x9c\x89\x0c\x0a\x22\x4b\xc1\x72\xb1\x90\x9a\x74\x7b\xec\x9c\x6e\x8f\xcb\x8a\x79\x2a\x75\x2c\x4a\xcf\x23\xe4\xdc\x0d\x61\x43\x40\x4c\xa2\x09\x28\x06\x04\x94\x6e\xd0\x42\x71\x5f\x96\x82\x3d\xa2\x34\x7f\xbc\xad\x5d\x1a\x50\xac\x9d\xda\xf2\xe6\x80\x71\x3c\xf2\x23\xe2\xb5\xed\xac\xd9\xc4\xff\xb3\x45\xa8\xd7\xc5\xea\x14\x8e\x38\x70\x28\xe3\x9d\x11\x66\x15\xd5\xa0\x07\x7b\x93\x9c\xf8\xf8\x6c\xce\x68\xfc\x42\x62\xe5\x71\x95\x8b\x85\xf3\xc6\xd9\x76\x12\xca\xd5\x89\x7c\xdd\x74\x55\x78\xf8\x78\xeb\xa6\xa4\x97\x39\xbe\x9c\x82\x2d\x8a\x22\xd3\xaf\xc8\x86\x5d\xe7\x7c\x16\x71\xc2\xc1\xb7\x76\xea\x74\x0d\x7a\x44\x31\x0f\x91\xea\xe1\x89\xaf\xed\xef\xb9\x2c\xdd\x48\x82\x6f\xd6\xfc\x3a\x6c\x75\x56\x20\xc0\x13\xbe\xd0\xae\x97\x7b\x97\x51\xef\x1c\x08\x63\xfb\x55\xd4\x9b\x0d\x6d\x06\xa5\xce\xd8\x20\xf6\x4a\x64\x2e\x31\xa9\x35\x0f\x60\x93\x68\x51\x42\x92\x65\x30\x52\xca\xa7\x86\x0f\xec\xb7\x50\xf0\x77\x8f\x3e\xb8\x1f\x6a\x5c\xaf\x0c\x5b\xb0\x34\xa8\x93\xfe\xe8\x64\x70\x0a\x17\x90\x95\x35\x5f\x62\x15\xd3\xef\x46\x8b\x4c\x0e\xe5\x39\x04\xfd\x63\x6f\x00\xea\x2e\x58\x7b\x0d\x6f\x71\x0f\xd5\x25\xe9\xe1\x34\x51\xe6\x71\xa9\xd8\xb3\xa7\x2c\x33\x1a\x7f\x31\x67\x53\x31\x2b\x20\x3e\xcc\xb1\xc4\x21\x9c\x57\x04\x2e\xf3\x29\xfa\xba\xcb\xa5\x1a\x44\x87\x31\x33\x23\xbf\x76\x43\xc3\xfd\x7f\x57\x42\x62\x76\xe6\xa5\x03\x15\xfa\x3a\x7c\x60\xc5\x31\x2a\x18\xe6\x95\x49\x65\xf9\xf0\xa6\xe2\xba\xa0\xc9\xbd\xe1\x05\x71\x77\xfc\x3a\xed\x3b\xff\x23\x66\x9b\x55\xe6\xbc\x56\x36\xfe\x32\xbd\x26\x36\x7f\x74\xa6\x53\x6c\x3c\xcc\x50\xa6\xf4\x8c\x6d\x2f\xc3\x32\x31\xcb\x39\xc8\xf5\x9f\x6a\xc2\x0a\x43\x4a\x52\xbd\xe3\x4a\x4d\xbb\x5d\x87\x71\x06\xfc\x46\x87\x5e\xe4\xcb\xa3\x06\x21\xdd\x03\xb6\x88\xcc\x69\xd5\x89\x07\x15\x32\x64\xa8\xc8\xd7\x48\x19\xcd\xb6\xce\xc0\x3a\x94\x6b\xae\xaa\xad\x1d\x73\x61\x89\x85\x8d\x4a\x34\xca\xd9\xa0\xa1\xe0\xf1\xc7\xdd\x89\xf3\xdd\x79\x55\x6e\x9e\xc2\x5a\x69\x8a\xed\x86\x70\x02\x1b\xf2\x74\x82\xd7\xc6\x04\xb6\x51\xba\x0e\x59\xec\xfb\xe9\x7e\xf7\x8a\x27\xc8\xa5\xf5\x92\x36\x3d\x69\xd0\xa0\xdd\x47\x2f\x70\x07\x6f\x5d\x16\xe0\x38\x23\x1a\x0d\x62\x55\x95\x73\x7b\x7c\x6c\x4b\x98\x83\x02\x29\x20\x6b\x10\x18\xd4\xb4\xe9\x27\x26\x78\xbe\x62\xdb\x72\x87\x9c\xbe\x01\xeb\x6a\x55\x18\x91\x13\xbd\x9d\x13\xaf\x67\x4e\x3e\x62\x30\x4d\x5d\xba\x85\xf0\x98\xdc\xe8\x10\x2c\xd9\x9a\x6b\x84\x6c\xa5\x1c\xe5\x5a\xdf\x90\x14\xde\x9c\x4d\xac\xfc\x94\x72\xc7\x93\x53\x93\xe9\xe7\xf6\x3d\x6e\xea\x2e\xba\xd4\xae\xe5\xb7\x9b\xb0\xf9\x22\x38\x5a\x8d\x69\x73\x13\x95\x80\xeb\xaa\x35\x44\x33\x28\x2b\x91\x41\xc3\xa0\x63\x86\x7c\xaf\x55\x63\xa2\x32\x5c\xdd\x60\x76\x1b\xb4\xbf\x8e\x18\xaf\x31\x34\x32\x9b\xed\x04\x10\xdd\x74\x7b\x27\xde\x7b\x13\xc6\x72\x3b\x90\xe7\x15\x69\x2e\x6b\x19\xb3\xa2\xe3\xc4\xd8\xdd\xb3\x16\xa5\x2c\xb2\x00\x22\xd7\x13\x6e\xfb\x54\x21\xf0\x9b\x50\x31\x42\xc2\x96\xbc\xcc\xf0\x5f\xae\x44\x2d\x09\xfd\x22\x77\x3b\xc3\x9b\x92\x23\x6f\x3b\xc4\x8d\x29\xa3\x39\xea\x3a\xc3\xed\x79\xc3\xb1\x44\xb5\x31\xa5\xb8\x2c\x2e\x44\x16\xd4\xc8\x70\xe7\x81\x83\xd4\x50\x94\x71\x58\x1e\x43\x75\x9e\x46\x97\x2e\xf2\x2c\x44\xeb\xcf\x60\x32\x96\x3c\xa3\xa7\x6e\xa8\x96\x08\xf7\xab\xbb\x15\x9e\xb9\x5b\x01\xc5\xff\x8d\xb2\xdf\x6e\xff\xe8\x44\x87\x42\xf5\x0f\x10\xa3\x14\xc0\xc5\x0a\x25\xbb\xa3\x4b\xa1\x8b\xfc\x52\x64\x3e\x1d\xc6\xd8\x35\x3e\x65\x5f\x8b\xaa\xc2\x4c\xad\x1d\x02\x6c\xa2\x43\x4d\x57\x1f\xed\xca\xae\x91\xfa\x03\x44\x6b\x8f\xba\xa2\x3b\xbe\x97\x3c\xaf\x45\xc3\xbf\x72\xb3\x48\xdf\x98\x7a\xe9\x15\xe7\x8a\x5f\x08\x73\xb8\xcd\xb5\x35\x9b\x15\x35\xa2\x6e\x66\x02\x4f\x95\x33\x11\x56\xf0\x4d\x51\xfa\x4e\xe0\x3c\x5d\x5b\x93\x28\x8f\x3d\x78\x5f\x62\x7e\x2b\x9e\xc7\x4b\xab\xfa\x05\xaa\x43\xa3\x6b\x5f\x62\xd7\xbe\x34\xa7\x1b\x33\xc4\x4c\xff\x04\x42\xb6\x7a\x4f\x55\x40\x3d\x1d\x6a\x03\x76\x4f\x5a\x82\x83\x52\x68\x91\xe7\xa2\xd4\x3b\xa4\x3c\xf9\xac\x02\x20\x0e\x0f\x34\x28\x8a\x3c\x5a\xce\x54\xdf\x52\xa0\x36\xfa\x75\x0c\x06\x10\xab\x5e\xc1\x37\x30\x05\x5f\xa5\x81\xcb\x24\x42\x5e\x84\xaf\xd1\x88\x3e\x1d\xb2\x83\xc1\xe8\xe0\xfc\x64\x3c\xe9\x9d\x1e\xf4\x11\x06\xdb\x7d\x85\x61\x14\xc4\x6e\xf4\x70\x8d\x9b\xc1\x18\x77\x92\x00\xc8\x31\x04\x66\x4c\x08\x0e\xf3\xfd\xf0\x3c\xe9\xf6\x5a\x24\xdd\x3e\x0b\xcf\x66\xe0\x71\xf6\xcd\x58\x42\x77\x81\x7b\x66\x7c\x7e\x76\x76\x3c\x40\xaf\x04\xb4\x46\xa8\x8d\xe0\xe0\xe9\x8f\x93\x0e\xc2\x86\xfe\x68\x3c\x3c\x75\x80\x9c\x9f\xca\xd6\x60\x7d\x18\x6f\x7b\x66\xe8\x80\x68\x79\xa3\xfb\xca\xfe\xce\xbc\xd7\x82\x6d\xbe\x19\x0e\x0f\xdf\x0d\x8e\x8f\x13\xf6\x6e\x38\xfa\x96\x8d\x27\xc3\xb3\xb3\xde\x9b\xbe\x99\xd1\x93\xb3\x73\xd3\xe8\x51\x6f\x70\x7c\x3e\x02\xe7\xd4\x49\xef\xf8\xe8\xfc\xf4\x20\xe2\x7b\x00\x84\xd4\xe3\x63\x37\x87\x27\x27\xfd\xd1\x41\xd4\x4b\x7c\x19\x70\x0d\x10\xe4\xa5\x9b\x9e\xf7\xb4\x40\x9e\x0b\x62\x70\x7a\x34\x1c\x9d\xdc\x05\x0e\x73\x9c\x5a\xcf\x4e\xe7\x6e\xa3\x96\x4f\x87\x13\xd6\x3b\x3b\x3b\x7e\x6f\xe6\xde\x7f\x09\x64\x19\xfd\xde\xe4\x2d\x40\x8c\xc2\x72\xf4\x8e\xd9\xe0\xf4\x9b\xf3\x11\x78\xbc\xce\x8f\x27\x66\x8f\x1d\x8d\x86\x27\x41\x6f\x1f\x8f\x43\x08\x50\xf2\xc3\xf5\xff\x32\xe9\x9f\xe2\x4b\x06\x07\xb0\xca\xc7\xbd\x77\xec\x6c\x34\x7c\x3b\x78\x3d\x98\x8c\xf1\xe7\xbe\x93\x29\x1b\x0f\x4f\xfa\xec\x9b\xf3\xd1\x60\x7c\x38\x80\xb9\x1c\xb3\xc3\x21\x76\xf4\xf8\x78\xf8\x8e\x1a\x3d\x38\x3e\x1f\xc3\x98\x46\x8d\x11\xfa\xad\xb1\x71\x67\x24\x6c\x3c\xc4\xc9\xf1\xed\x98\x75\x0a\x1a\x3a\xe9\xbd\x8f\xe7\xe6\xfd\xf0\x1c\x0e\xe8\xde\xd3\x94\xe0\xfb\x3d\xf1\x43\xdf\x9c\xce\x71\x7f\x34\xa6\x98\x5d\x47\xfe\x10\xdb\x9a\xf9\x52\x52\x59\x89\x55\xb2\x85\x90\x6b\x1c\xd5\x5f\x26\x23\xee\x81\xe7\x5f\xb2\x83\xf4\x28\x1d\xa5\x46\x34\x3f\xdd\x63\xdb\xc3\x59\x95\xb2\xbd\xaf\xbe\x7a\xb1\x93\x40\xca\x0f\xd1\xd7\x14\xf3\xa8\xe1\x16\x28\x14\x52\x21\xdc\xf8\x48\x03\x5e\x7b\xcb\xe2\x1b\x07\x14\x2e\x50\x04\x1a\xf5\x6a\x6f\x3f\xdd\xdf\xdb\x67\xdb\x63\xb1\xb6\xfd\x82\x6a\x7c\xd3\x2f\x4c\x85\xaf\x96\xed\xc7\x4d\x5f\x82\x91\xed\x7f\x91\x7e\xb1\xff\x74\x7f\x77\x8f\x55\xcb\xb2\xa8\x17\x4b\xff\xd1\x73\xb6\xfd\x4d\xad\x84\x1d\xb1\x11\xa8\x4d\xce\x84\xbe\xca\xd8\xb9\x46\xca\x04\xc8\x1c\xe8\x4a\x74\x50\x46\x0d\x84\x94\xf1\x56\x26\x4c\x00\x98\xb6\xb7\x97\xb2\x93\xc1\xf8\xa0\x7f\x7c\xdc\x3b\xed\x0f\xcf\xc7\xed\xd8\x6b\x94\xdd\x2c\xd0\x07\x20\xaa\xe0\xde\x31\xab\x32\x13\x25\x5c\x8c\x0d\x4f\x21\x21\x13\x1a\xa5\x06\x11\xd2\xc8\xd6\xee\x40\xd3\x61\x4b\x91\x5b\xef\x58\xad\x88\x23\x1e\x6b\xae\x60\x4d\xfc\x6f\xdd\x3d\x5d\x8a\x79\x51\xae\x6c\x6d\x65\x1c\xf7\x8e\x32\xc5\x6d\x7c\x26\x68\xd5\x8f\xd3\xfb\x1a\x5d\xc3\x61\x00\x0b\x01\x84\x94\xae\xca\xba\x8b\xb2\x3e\xe7\x57\x2e\x18\x5f\x51\x0d\xd1\x77\x72\x56\x15\xa5\xe4\x98\xb5\x66\x4d\x02\x59\x1a\x25\x73\x06\x79\xec\xba\x9e\xae\x64\x10\xaa\xb7\xd0\x09\x11\xa7\xbe\x4b\x99\xa8\x4b\xcc\x0b\xb1\xed\x42\x9f\x7a\xb5\xae\x4a\x9e\xd3\x7f\x61\xfa\x0f\x3c\xb8\x14\xbc\xa4\xc2\x03\xc1\x73\x8a\x60\x51\x5c\xd4\x3c\x90\x36\x87\x0d\xe7\xcf\xfa\x26\x83\x5c\x43\x8e\x99\x8b\x6e\x34\xf6\x84\xf3\x66\xe4\x5e\xb0\x73\x05\x19\x06\xa7\xa4\xe8\x1e\x14\xca\xe8\x37\xf0\x80\x42\x95\x93\xcf\x2a\xed\xb2\x57\x06\x8a\x28\x23\xa1\xce\x72\xcc\x31\xdb\xfb\x0d\xb8\xdc\x64\xe8\x00\xf7\x3e\xe3\x9e\x42\x57\x79\x9c\x13\x82\x9a\x0c\xb9\xc9\x75\x90\x7d\xc6\xd5\xa2\x26\x7a\xa5\xc0\xe1\xeb\x29\x55\xfc\x82\x92\x12\x0d\x8a\x7e\x89\xc6\xb5\x0f\x68\x61\xf0\xb3\x41\x6c\x8f\x07\x67\x3f\x85\xf8\xc7\xf0\xd4\x5d\x42\xe6\xe6\x00\xdf\x3f\x1e\xa2\x9e\x66\x53\x51\x5d\x99\xa9\xec\xce\xb4\x6a\x98\xb5\x16\x86\x83\xf0\x3a\x74\xab\xc0\x0f\xc1\x3a\x30\x1b\x29\x26\x99\xdf\x5c\x61\x56\xd4\x95\x05\xab\xab\x2b\x99\xcb\x0f\x6e\xd9\xa2\x64\xc2\x56\xba\x13\x98\x20\x36\x6d\x0c\x51\x2b\x8d\x54\xe9\x1e\x48\x38\x08\xf3\x7c\x90\x2b\x45\xd5\x8b\x34\x10\x72\x64\x43\x4a\xa6\xf8\xdf\xb5\xc4\x34\x3b\x00\xc6\x00\x3a\x19\xc8\x54\x20\x97\xa2\xc4\x0a\x2c\x95\x21\x2c\x59\x87\x1b\x1d\x16\x51\x42\x3e\x0b\x22\x3b\x5a\xa2\x98\x62\xee\xdd\xe6\xb8\x58\xcf\x52\x76\x62\x2e\xee\xb3\xe3\xfe\x2e\xc5\x7b\x50\x55\xc3\x1c\xa8\xd6\xa8\x20\x59\x53\x68\xb9\x40\xd7\x4c\x80\xcd\xd0\xf2\x44\x72\xcd\xb6\x4e\xea\xbc\x92\xeb\x5c\xec\xd2\x14\x66\x5b\x69\xd7\x87\x0e\x00\x8f\x76\x69\xfb\xbd\x18\x19\xd2\x10\x90\xaf\x0a\x5a\xb2\x5b\x3a\x80\x2b\x18\x64\x80\xda\xa7\x4e\xcf\x8e\xad\x1f\x82\x7b\x8e\x56\x67\x25\x25\x4c\x82\x54\x4e\x02\xab\x7f\x63\x3e\x9f\xb4\xc4\x65\xcd\x04\xa6\xa0\x7a\xa0\xff\x17\xd0\x6b\x58\x8f\xed\xde\x14\xbd\x7e\xf4\xe3\x8f\x93\x06\x3a\x25\x6c\x3f\x68\x1b\x88\x8f\x42\x04\x9b\x9b\x03\xe1\x01\x8a\x32\x3a\x2e\x1d\xd6\xe9\xce\xd7\x2e\xab\xc1\x1c\x64\xc7\xb3\x00\x6f\xa1\x58\xdb\x86\xec\x56\xe7\x1a\xb6\x79\x26\x58\x39\x15\xd5\xd1\x07\xb1\x78\xc7\x58\xab\x28\x47\x64\x56\xac\x52\x5e\x3f\xb1\xf3\xfc\xe4\x74\x78\x76\xfc\xe4\xd1\xd8\x29\x1d\x01\x28\x80\x4f\x4e\x09\x2e\xc2\x18\x35\xc0\x9c\x15\x1b\xc6\x26\x08\x99\x9b\xc3\xd8\x54\xe5\x4d\x42\x94\x2a\xf4\x73\x69\x84\xe8\x58\x88\x38\xa7\xc8\x06\x67\x2c\x41\x82\x93\x9b\x78\x03\x06\x70\x7a\xc8\x42\xe8\x73\xe2\x5a\x3d\x4f\x1f\x4d\x5a\x78\x46\x52\xb3\xbf\xdd\xe9\x0f\x7f\xdc\xe1\x75\xee\x42\x49\xba\xa1\xd5\x94\x9d\xd9\xa3\x12\x00\xf7\x74\x3f\x4b\x95\x53\x21\x9b\x0a\x7d\xb1\xb1\xf1\x5e\x9e\x13\x63\x16\x1b\x39\x4a\x95\x40\xfa\x6d\xeb\x9d\x57\x77\x1e\x71\x07\x6f\x72\xf7\x99\x20\x30\x89\x5a\x47\x1b\x26\xc8\x8d\x12\xf8\x4e\x9f\xdd\x02\x27\xe1\xaf\x7f\xfb\xdb\xdf\x7e\x60\xee\x3c\x24\x3e\x99\x1d\x80\xa4\xab\xa5\x08\x23\xa3\xc5\x9c\xfd\x15\x7b\xf6\x43\x94\x7a\x1a\xe4\x2c\x99\x7b\x52\xf0\x0c\xdf\x09\x90\x0f\xe0\x23\xb4\x54\x26\x57\x52\x2f\xc1\xd3\x0f\xfc\x89\xe4\x19\xbe\x6e\xa5\xc1\xd8\x51\x6d\xc6\xc3\x10\xd8\x93\x1f\xa2\x0b\xc9\x1c\x62\xd7\x38\x11\x86\x51\xce\xd7\xe6\x77\xf8\xe6\x4f\x87\xe3\xe3\xc4\x11\x31\xe2\x4f\x32\x31\x43\x85\x72\x7a\x4d\xe8\xb9\xe4\xd9\x09\xa6\x05\xb9\x66\xd0\x7f\x02\x01\x4e\x48\x70\xf1\xb2\x82\xdc\xa7\x8e\xc5\x2c\xfc\x6d\x88\x31\x6b\x47\xf5\x43\x94\x7e\x6e\xa6\x8d\x12\x95\x08\xb5\xac\xeb\xf5\x49\x94\x6c\x69\x76\xc3\x5d\x46\x1d\xa0\x8a\x9a\xc1\xdb\x9b\x20\xee\xc4\xd6\xa3\xbf\x9e\x0e\x27\xfd\x57\xa0\xd7\x41\x79\xb1\x6d\xc9\xa7\xf7\x60\xe1\x02\x24\x27\xe9\xdc\x6c\xfe\xfc\xda\x67\x29\xf9\xdf\x08\x47\x23\xda\x91\x9d\x0f\x00\xab\x9d\xa7\x19\xa5\xac\x5e\x42\x71\x9c\xc5\x9a\xdc\xd0\x93\x92\x7b\xef\xb2\x7b\x6c\x5e\xd4\xca\xa5\xd9\xc6\x82\xa2\x01\x90\x81\x77\x64\x0c\x43\xf0\xc3\x1f\x49\x74\x91\x3e\x19\x1c\x9c\xff\x63\xf9\x7f\x9f\x3d\xfd\xe2\x69\x8b\xff\xf7\xc5\xd3\x07\xfe\x87\xcf\xf1\x37\x38\x38\x77\x32\x6c\x97\x99\xff\x02\x94\x75\xbc\x4b\x79\x25\xca\x47\x07\xc3\xb3\xf7\xa3\xc1\x9b\xb7\x13\x9b\xab\x75\x32\x18\x83\x4f\xe6\x74\x38\x19\x1c\xf4\x1f\x05\xd7\xd3\x0c\xc8\xbe\x5e\xec\xee\x3f\xdd\x7b\xde\x30\xa0\x5e\xd7\x5a\x2a\x73\xd7\x9f\xf0\xd9\x92\x30\xe5\xcb\x75\x51\x7a\xc4\x62\x14\x98\x8f\x3a\x29\xc1\xce\x3c\xc3\xa2\x8c\x79\x8a\x45\x96\xb0\xb9\xb1\x01\x8a\x39\x15\x56\xba\x84\x91\xb5\x28\x75\x61\x6b\xca\x31\x48\x1d\x81\x0c\x45\x64\x9c\x01\xfc\x72\xa3\x6a\x14\xc4\x02\x5e\x57\x8e\xc2\x12\xb1\xdf\x32\x81\xe5\x57\x28\x49\x1a\x84\x4e\x16\x37\x08\xc2\x02\x37\xa2\x37\x05\xd1\xb5\x6e\xa6\xe5\x95\x80\x61\x51\xb2\x6f\x8b\x79\xf9\x09\xc1\xe3\x59\x88\x00\x97\x77\x6f\xa3\x60\x94\x45\x8e\x8a\x3b\x4d\x8b\x76\xc0\x37\x51\xef\x8d\x7c\xae\x4b\x85\x39\xc5\x66\x88\x05\xd3\x45\x17\x8b\x70\x37\xc1\x19\x55\x71\xe3\xfc\x06\xb4\x98\xf6\x0a\x72\x99\xae\x7c\x63\x77\x7d\xce\xd4\xb4\xa0\x0b\xec\x37\xbe\x8b\x0a\x2c\x21\xe2\x10\x2e\x6d\xfa\x68\xf2\xb6\xdf\x4d\xa8\x45\xca\xec\xad\xd9\x98\x2d\x5e\xad\x20\x09\xb3\x83\x52\x0a\x9c\xa3\xbf\x91\x96\xd7\xb2\xf2\x86\xa4\xbc\x94\x27\x38\x3a\x24\xb7\x34\x1c\xd7\xf1\x26\x6a\x2d\x7f\xa0\xdf\x0e\x8f\x0f\x31\xf7\x11\xff\x35\xa6\xde\xf7\x0f\xcd\x4f\xc1\x05\x8b\x87\xbc\x83\x87\x0b\xbc\x08\x3e\x8a\x80\xae\x7f\x17\x0c\xb8\xc1\xb9\x6b\x63\x13\xe4\x60\x7f\xf7\xb6\x37\x19\x0f\x81\x01\xab\xe1\xb9\x6e\x31\x6a\x05\x84\x5a\x11\x0f\x56\xef\x94\xf5\x0e\xac\x83\xd9\xc7\x52\x3a\xf8\xae\x20\x0c\x33\x18\x9e\x8f\xe9\x07\x49\x93\x33\x7a\x68\x89\xb5\x4e\x31\x79\x13\x13\x4f\x1d\x0d\xd6\xa8\x9d\xab\x1a\xb0\x62\xa5\x8f\xfa\x2e\x41\x92\xf2\xa7\x83\xec\x39\x4f\x01\xe8\xf3\x9d\x79\xb0\xab\x97\x45\x9e\x45\x8e\x9d\xa9\x77\xed\xf2\xec\x52\x94\x95\xb4\x70\xbf\x3e\xab\xdb\x1c\x6b\x62\x9b\x03\x23\x09\x20\x27\x6b\x0c\x69\x5a\x6c\x3d\x9e\x4b\xb5\xf0\x79\x8b\x2d\x49\x15\x33\xce\x59\xf2\xf2\xc8\x77\xd6\xec\xe5\x03\xd3\xeb\xbf\xca\x5f\xfa\x64\xf4\x56\x1c\x14\x7a\x77\x2f\xdd\xfb\xa3\xd4\xc0\x5b\xf8\xbf\xf6\xf7\x5b\xfc\x5f\xfb\xcf\x5e\x3e\xe8\x7f\x9f\xe5\x6f\x24\x32\xf6\x96\x57\xcc\xec\x01\x76\x06\x19\x8d\x4e\x1f\xbc\xdc\x4b\xf7\x2c\xf1\x57\xff\x08\xa2\xcf\xc3\xd3\xf1\x03\x0b\xd7\x03\x0b\xd7\x03\x0b\xd7\xbf\x33\x0b\xd7\x03\x79\xd5\x03\x79\xd5\x3f\x3b\x79\xd5\xbf\x31\xf1\x13\x77\x04\xe4\x0f\x14\x50\xbf\x89\x02\xea\x81\xf6\xe9\xdf\x81\xf6\xa9\x93\xec\x29\xae\x43\xfb\x6d\xa4\x4f\xb8\xab\x8c\xc6\x68\x95\xf1\xd7\x25\x87\x9c\x02\x94\x4c\x30\xed\x16\x38\xd3\x3e\x12\x52\xdc\x90\x0f\xd0\x06\xe6\x7d\xe4\x29\x48\x72\xc0\x35\xf2\xe8\x40\xb8\xbd\x5c\x98\xe2\x06\x33\x20\xb5\x5f\x3e\xd6\x51\xc7\x22\xf4\x26\xbc\x98\x36\xc2\xa8\x38\x72\x2b\x24\x18\x86\x7a\x55\xcb\x32\x8c\x33\xf0\x4f\xce\x6d\xf5\xe7\xe2\x9d\xfa\x14\x46\x96\x35\x71\x4e\x01\x4b\x63\xc8\xcf\xe8\x28\x1b\xa3\xb3\xdf\x55\xa6\xbf\x81\x6b\x0a\xc1\x68\xcd\xcd\xb0\xbd\x75\x8e\xd9\x22\x5b\x3b\x77\x1d\x6a\xc2\xa6\x75\xc5\x74\x91\x8b\x56\xfa\x9c\x83\xad\xc2\xdc\x3b\xca\xcc\xd7\x1b\xb1\x58\x05\xa6\xe3\x13\x6a\x10\xf5\xe4\xce\x53\x1e\x06\x78\x95\xd9\x70\xc6\xa8\x2d\xa3\xbe\x50\x10\x3c\x7a\xa9\x7d\xcd\xbc\x2e\xdb\x7c\x3a\x38\xab\xce\xce\xbb\x8d\x3d\x09\xc1\x54\x7e\x67\x0a\xa4\x3f\xd9\xee\xff\xd3\x30\x1b\x7d\x8e\x33\xd4\xa4\x87\x0a\xf7\xe4\xad\x24\x3c\x9f\xf5\x84\xdc\xa3\x37\x9f\xed\xa0\x3c\x4b\x7d\x81\x03\x38\xff\x5f\x1f\x0f\xde\xf4\x42\x1f\xd5\x03\x75\xcb\x03\x75\xcb\x03\x75\xcb\xe7\xa2\x6e\xf9\x9c\x2c\x2c\x36\xa6\xdd\xe9\x8e\x7b\xa0\x68\xf9\x67\xa7\x68\xd9\xd8\x3b\xcf\x59\xb0\x01\x02\x60\xde\xd2\x22\x9c\x3b\xdf\x21\xa2\xc7\xa2\x48\xda\xf4\x7b\x63\x0e\xa2\x01\x2a\xb5\x73\x28\x38\xeb\xc7\x81\xd7\xf1\x19\x22\x1e\x04\x23\x28\x1b\x4d\x02\x4a\x22\x77\xd8\x38\xb0\x99\x37\x4c\x89\x77\xa9\x5b\xcf\x78\xd4\x77\x42\xa5\x8a\x96\x13\x67\x67\xc6\x95\xeb\xb5\xed\xa2\x2d\x23\x69\x4f\x41\xf3\xdc\xe0\x3c\x76\x4f\x62\xca\xb6\x29\x5b\x18\xfd\x43\x57\xbc\x14\xe9\xec\x7a\xa1\x6a\x9d\xce\x8a\xd5\x13\x31\x2b\xf4\x93\x9d\x3f\x80\x45\xe7\xfa\x81\x45\xe7\x81\x45\xe7\x8e\x2c\x3a\xb6\x06\x1d\x4c\xcd\x16\x6b\x0e\x5a\x30\xae\x18\xe5\x26\x9e\x1c\x46\xde\x0b\x92\xa7\xf3\x5a\xcd\xf0\x82\x26\x20\xf6\x99\x35\x09\x9b\xf5\x29\x6d\x9f\xf4\x4e\x82\xf7\xd7\xad\x8c\x38\xb1\xdf\xf5\x4f\xca\x88\x63\x86\x42\x55\x05\x9d\x44\x38\x78\xe8\x2e\x44\x3b\x65\xf5\xae\x54\x38\x98\x55\x7b\x6f\x0a\x1c\xf7\xe2\x7f\x47\xe6\x1b\xda\xf7\x65\x4b\x04\xdd\x99\xe1\x06\xca\xe6\xaf\x54\x60\x8d\x3a\xbb\xf5\xd3\xf8\x6c\xae\x23\x46\x8e\xfb\xf3\xd8\x74\x33\xb3\xfc\x8e\x9c\x2c\x89\xcf\x13\xbc\x2f\x41\x48\x72\x47\x86\x90\xcd\x6c\x20\x77\xe7\x49\x49\xee\x49\x94\xf2\xf9\x59\x67\x5a\xd2\xed\x13\x59\x67\xe0\x45\x9f\x4e\x3d\xf3\xe7\x23\x58\xa1\x9d\xfc\x67\xa4\x59\xa9\x1e\x68\x56\x3e\x0b\xcd\xca\x03\xc1\xca\x03\xc1\xca\x1f\x44\xb0\xf2\x40\xa6\xf2\x40\xa6\xf2\x6f\x40\xa6\x62\x8b\x0d\xfd\xf2\x88\xd6\xd2\xe8\x30\xc3\x2a\x96\x7d\x4e\x39\x71\x51\xa8\x0d\xfa\xe2\x6b\xbb\x9d\xe2\x43\x4f\x51\x74\x34\x18\x56\xe6\xec\x4b\x9e\x7b\x47\x90\x3f\x0c\x96\x3a\x65\x23\x07\xcc\x9f\x9a\xfd\xe5\x1f\x45\xfc\x72\x6a\xc1\x8b\x26\x43\x40\x67\x3a\x7e\xcf\x0e\xcf\x01\x86\x68\x3c\xe9\x4d\xce\x27\x50\x5d\x31\xea\xbf\x39\x3f\x86\x10\xce\x9f\x8b\xf7\xe5\x73\xd1\xbc\x18\x93\x6f\x26\x6d\x31\xc7\x86\x77\xf3\x2a\x00\x8e\x36\xbb\x1e\xc4\x0a\xcf\x96\x14\x66\x28\x42\x79\x4c\xd4\x31\xb3\x07\xea\x98\xcf\x44\x1d\xe3\xcf\x91\x05\xd0\x81\x0d\xe0\x27\xa8\x2a\x9c\xbf\x76\x0e\x1d\xbd\x94\xe2\xca\xab\xd3\xe0\x94\xa1\xf2\x1f\xd4\xb8\x28\xcb\x69\x46\xdb\x73\x16\xa4\x3d\xa3\xbb\xba\x56\x95\xcc\xc3\x12\x38\xe9\xe1\x05\x61\x6f\x04\xfe\x61\x2c\x4e\xb7\x27\x55\x86\x74\x4c\xb4\x85\x6f\xda\xf9\x8e\x18\x07\xe1\xc2\x6c\xcd\x55\x88\x51\xff\x39\x78\x71\x92\x5b\x89\x71\xec\x88\xc3\xf8\x5c\x53\x1b\x27\x49\xa8\x5d\x58\x16\xc5\xa1\x8f\xd0\xb9\x07\x1c\x16\x74\x03\xf6\x63\x83\x0a\x6c\xdd\xff\x8e\x2f\x64\x53\xbb\x80\x6b\x19\x67\x64\x91\x8a\x50\x78\x0a\x8e\xa0\x84\x2c\x4c\x63\x0d\x47\x68\x5f\xd4\xd4\x91\x8a\x39\xeb\x4a\x29\x73\x03\xee\xfc\xf2\x37\x0e\xb6\xb3\xcd\x4f\x1d\x28\xa8\x13\x61\x84\x63\x0e\x19\x9c\xe6\xa0\x62\xd6\x35\xe1\x53\x58\x71\x07\xf2\x0f\x81\xd1\x5c\xb4\xc4\xf2\x24\xf5\x47\x63\x40\xab\x23\x68\xbe\x38\xfd\xac\x4d\x93\x14\x4d\xf0\x3f\x03\x17\xd2\x03\x0b\x12\xdc\x01\xb4\x6c\x5d\x2c\x48\x76\x45\x7f\x13\x0b\x12\x41\xaa\x5f\x99\x71\x06\x72\x36\x88\x06\x80\x07\xda\x77\x9a\x7a\xa9\x6f\x26\x49\xb2\xda\xef\x9f\x9f\x1e\xe9\xfa\x93\xe8\x91\xfa\x07\xc3\xf1\x56\xc2\xb6\xc4\x41\xa1\xcd\xff\xd3\x5a\xc0\x3f\xdf\xf6\xcf\x3e\x81\x2f\x89\xab\x6b\x74\x24\x34\x89\x93\xee\xc4\x7d\xd4\x86\x26\xb9\x27\xf7\xd1\x8d\x19\xb3\xff\x92\xfc\x46\x0f\xf4\x46\x0f\xf4\x46\xff\x84\xf4\x46\x31\x0b\x49\x5b\x3d\x7d\x20\x1f\xf9\xb3\x91\x8f\x6c\x06\xe1\xfe\x87\x61\x70\xff\x49\xe0\xb7\xcd\x29\x8f\x8e\xf2\x03\x16\xf7\x03\x16\xf7\x67\xc0\xe2\xee\x4d\x7e\x6f\x2c\xee\x07\x28\xee\x7f\x09\x28\xee\x7f\x17\x24\xee\x78\x90\x9d\x20\xdc\x07\x3c\x97\xf3\xa2\x54\x92\x03\x08\x74\x80\x90\x18\x30\xb9\x06\xef\x0c\x6c\xcc\x9c\x5f\x79\xa4\x5b\x87\x14\xed\xec\x97\x9d\x24\xa0\x01\x94\x15\x98\xe2\xf3\x5c\xce\xaa\xdd\x62\xbe\x1b\xbf\x2b\x65\xef\x1a\x8e\xee\x4c\xea\x35\x54\x09\xba\x30\xa6\x4b\x3c\x36\xe6\xb1\x43\x72\xe6\x6c\x26\x11\xc4\xb6\x98\x63\x7e\xb2\xb2\x75\xa0\xb3\x25\x2f\x2b\xd8\x30\xe8\x0c\x34\x5b\xb7\x74\xf8\x60\x53\x8b\xec\x26\x89\x29\x88\x80\xb6\x01\x6a\x1c\xb4\x99\xde\x4a\x94\x72\xc6\xd1\x51\x4e\xa4\x51\xde\x38\x23\xb2\x22\xcf\x53\x94\x58\x87\x30\xf6\x3b\x8e\xaa\x86\x96\x2f\x4e\x2b\xa8\x49\xc8\x01\x62\x7e\x10\x3d\x7f\x43\xde\x9f\xde\xf1\xcb\x18\x78\xba\xe6\x60\x87\x99\xf3\x37\x95\x58\xd0\xc9\xcb\xa9\xac\x4a\x72\x25\x3b\xff\x7e\x5e\x80\xb3\x09\xa7\x6f\xcd\xaf\x6d\xad\xf7\xac\xd0\x04\x08\xe0\x7f\xf6\xb5\x63\x26\x0a\x3e\x6c\x8f\xab\x03\xe4\x1d\x76\xb9\x54\x6c\xcc\x55\xc5\xd9\x41\xce\x4b\xce\x0e\x8a\x1a\x12\x1a\xfc\x7e\x4b\x02\xd7\x09\xaf\xf5\x1a\x10\x2e\x8b\x39\xfb\xa6\x77\x32\x7e\xd2\x57\xd9\x21\xce\x8c\x0f\x05\x60\x70\xcf\xd1\x3e\xdd\xa5\x27\x0d\x67\x60\x17\x08\xfc\x91\xc8\x20\x5e\xee\xc1\xe0\xcd\xa7\xa7\x05\xd4\xf3\x28\x4a\xa2\x40\xc7\x55\xd8\x77\x98\xd2\x4b\xa1\x6a\xc1\xb0\x12\xfa\x0e\xe3\xed\x5e\x86\x16\x18\xb9\x59\x8b\x9b\xeb\x6f\xcc\x1d\x51\x97\x15\x2d\x1b\x62\xa8\x3a\xe2\x1e\x5e\x55\x45\xa9\xc4\xb5\x66\x73\x81\x65\xb6\x4c\xfc\xbc\x46\x67\xce\x03\xca\xfc\x9d\x50\xe6\xcd\x03\x7d\x8f\x64\x0d\xbe\x20\x4a\xfb\x22\xc8\x80\xa8\x9c\x91\x6b\xb0\x92\x2c\xc2\x81\x37\xa6\x82\x40\x52\xb2\xb1\x38\xe0\xbe\x88\xf3\xe0\xb5\xba\x2b\xe4\x7c\xc2\xa6\x50\x16\x45\x80\x8d\xe8\x97\x45\xb4\x0c\x0b\x63\x18\x5d\xab\xbe\x92\xc5\x57\x7d\x60\x3c\x15\xf6\x3a\x46\xee\x5c\xae\x28\xb8\x95\xb0\x2b\x78\x31\xce\x96\xd4\x95\x24\x00\xee\x75\x99\x74\x73\x3e\xab\x8a\xd2\x56\x71\xb4\x31\xf0\x31\x80\x27\x32\x47\xec\x10\x17\x83\xdf\x09\xec\xde\x82\xd2\xf7\x0e\x0f\x01\xf8\xc9\x18\x54\xfd\xd1\xc9\x38\xd4\x4f\x49\x71\x35\x56\x0d\xe8\x88\x07\xc3\x31\x3b\x3b\x7f\x7d\x3c\x38\x08\xfd\xeb\x16\x35\xbf\xe1\xdd\xf7\x9b\x10\x12\x54\xd7\xa5\xa0\x94\x5a\x1b\xd4\xf3\x5e\x7f\x33\x3b\xde\xc3\x7f\x63\x2d\x7b\x64\xda\x5f\x87\xfe\x4e\xdb\x9a\xbf\x7a\x30\xe7\x10\x92\x90\xb8\xf7\x06\xe7\x1d\x51\x16\x80\x43\x2d\x16\x05\xdb\x8d\x35\x01\x97\xd2\x02\xc6\x75\xc8\xfa\x46\x6e\x6e\xb0\x7e\x4b\x9e\x89\x15\x2f\x2f\x6c\x73\x49\xe4\x41\x34\xed\x26\xe8\x47\xa4\x7f\x52\x29\x0d\xec\x02\xf3\x3b\x4d\xb9\x39\x71\xd0\xb5\x03\xa3\xd8\xe5\x00\x35\x42\x26\x41\x6c\x90\x54\x82\x9c\x5f\x47\x9d\x00\xe1\x66\xba\x80\xef\x33\x56\xbc\xc7\xfb\x68\x65\x47\x6d\xc8\x9b\x71\x16\x3f\xaf\x3c\x00\x4c\x98\x79\x41\x54\x06\x41\xd0\xf1\x00\x0f\xf9\x61\x4d\x9e\x76\x94\x4f\xe6\xba\x1e\xfa\x1c\xc4\xdd\x06\x39\x75\x84\x84\x20\xb5\x65\x11\x76\xe2\x0d\x59\x10\x61\xd7\xb8\xd4\x78\x5f\xd8\x0c\x5b\xa2\x9d\xd1\x16\x1e\xf5\x30\xf6\xe3\xc3\x16\x66\x9b\x2e\x4a\x6e\x29\x23\x5a\x6d\x02\x1b\x5b\x4b\xb7\x36\xc2\x66\x2a\x00\xfe\xc3\x4e\x49\x07\xff\x44\x47\x63\xad\x0a\xbc\xc6\xce\x68\xfd\x04\xb7\xb3\xdf\xde\x24\xde\x65\x06\x1d\x6a\x42\x36\xb5\xc7\x1d\xd0\x23\x3c\xda\xba\x17\xff\xc1\x4d\x28\x72\x9e\xff\x60\xef\x1f\xcf\x7f\x70\x75\x75\x95\x96\x22\x5b\xf2\x0a\x4a\x99\xfe\x5d\x19\x0f\x60\x9d\x76\x59\x7f\x35\x15\x19\x06\x69\xd5\x5c\x2e\xea\x12\x0e\xc4\x70\x2d\x4a\xd4\x07\xc7\xd7\xda\x18\xe0\xbe\x26\xd8\x58\xb1\x02\x2e\xbe\x67\x4f\x13\x63\x73\x7e\xb9\x09\x97\x63\x13\x2b\x82\x0b\xcf\x75\x91\x20\x38\x61\xd4\x62\x3d\x30\xaf\x82\x17\x7e\x95\xb0\xfd\xa7\x4f\x9f\x7a\x49\x3a\x50\xb3\x6e\xd2\x83\xad\x47\x76\x37\xbf\x7e\x74\x16\xe0\x66\x39\x73\x5e\xd8\xd1\xdb\x7b\x89\xe2\xf2\x9f\x30\x41\x3c\x90\xf1\x3e\xe8\xfe\x3b\x0f\x72\xbb\x7b\x0f\xef\x6c\xe0\x7c\x88\xc1\x8d\x09\xce\xf7\x6c\x34\x3c\x3c\x3f\x30\x9b\x74\x6c\x3e\x03\x2f\xbc\x8b\xe1\xbc\x7e\xef\x6e\x72\xf0\xc5\x9d\xbe\xef\x40\x38\x0e\xe2\x2c\x51\x48\xa6\x8d\x76\x4c\xa4\x85\xad\x9f\x75\xc0\x1e\xc3\xfb\x6e\x47\x3e\x1e\xf5\xbd\x73\xff\x70\x13\xbc\x31\x46\x09\x3a\x10\x8b\xad\x6b\xd4\x3b\x49\x43\xdf\xa8\x73\x98\xf6\xff\xd2\x3f\x39\x3b\xee\x8d\xde\xdf\xe0\x2f\xdd\xbe\x65\xe0\x67\xa3\xe1\xc1\xf9\xc8\x61\x33\x8f\xcf\x5f\x53\x14\x04\xbc\xa4\x30\x9d\x18\x56\xe9\x8f\xbf\x6e\xe3\x1c\x27\x01\xd0\xf1\xd7\xe6\xdf\xaf\xcf\xc7\x03\x98\x9a\xc1\xe9\xa4\x3f\x1a\x9d\x9f\x19\x7d\x6c\x87\xbd\x1d\xbe\x03\xdc\xe4\x83\xde\xf9\xb8\x7f\x08\x73\x38\xc4\xb0\x10\x7a\xbe\x23\x2f\x66\x84\x98\xec\x9d\xdd\xe3\xc9\x68\x70\x30\x09\x1f\x1b\xde\xe4\x28\x8f\x9c\xe3\x3b\x0e\x3d\x99\xa2\x51\xef\x7a\xef\x2d\x90\xb2\x83\x4c\x6e\x60\x24\x7b\xd7\x6d\xef\xf0\xbb\xc1\xf8\x2e\xee\xd9\x07\xb0\xe1\x3f\xf0\x2f\x7d\x72\x34\x39\xfe\x87\xf2\x3f\xec\x3d\x7b\xf1\xfc\x79\x8b\xff\xe1\xe5\xf3\x07\xfc\xdf\xcf\xf1\x67\x6e\xef\xa3\x52\x88\xc9\xf5\x5a\xb0\xb3\xb2\x00\xad\xce\xda\x6e\xfb\x4f\x9f\xbe\xdc\xfd\x86\xab\xdd\xfd\x2f\x82\xab\x6a\xef\xab\xaf\x5e\xee\x9a\xb5\x82\x5b\xea\xa5\xb9\xd3\x0e\xf9\xa5\xcc\xd8\xa4\x2e\x95\x28\x13\x36\x2a\xa6\xa2\xac\xd8\x3b\x99\x2f\x45\xbe\x42\x03\xf6\x9d\x30\xdf\xb1\x63\xd0\x1e\x16\x8f\x06\xaa\xc2\xcb\x56\x16\xea\x51\x67\x1f\x1a\x2a\x97\x54\x4c\x8b\x4b\xf0\x2f\x21\x7c\x9f\x60\x6b\x3e\xbb\x30\xf6\xfe\xd7\x94\xcc\x8b\x89\x0f\x61\x1d\x44\x82\xd8\xe9\x1e\xc6\xb3\x0a\xdf\x34\x2f\x54\xc5\x84\x5a\x48\x25\x12\x76\xc9\x4b\xc0\xce\xac\x8a\x22\xd7\x96\x50\x31\xc8\x48\x45\x13\xb2\x14\x50\xc9\x95\xf8\x1a\x69\x56\x15\x49\xdc\x2c\x0d\xc0\x68\x5e\x60\x9a\xb4\xb2\x20\x8d\xd1\x8b\xac\x12\x8e\x17\x86\xf0\x79\x70\x3c\x01\x28\xa6\x4d\x79\x99\x9b\xdf\x38\xe5\x4e\x62\x15\x99\xf8\x79\x9d\xcb\x99\x74\xc5\x09\xa8\x8a\xb9\x17\x82\x0b\xc0\x98\xc5\xb5\xbe\x61\xdc\x18\x9d\xd5\x95\x2d\x18\xd5\x49\x3b\x2d\x1e\x3c\xe2\x16\x37\x15\x1d\x44\x50\x33\x00\x5e\xe4\xc6\x38\xaf\xb8\x31\x1e\xf5\x3a\x24\x15\x7a\x3d\x3e\x4c\x58\xaf\xac\xa4\xae\xe4\x0c\x47\x37\xf8\xe6\x0d\xdb\x1e\xa8\x4c\xac\x85\xca\x8c\x49\xf7\xcd\x59\xff\x0d\x7b\x53\x16\xf5\x7a\x27\x60\x7f\x23\x87\x35\x50\x4a\xcf\x8a\xba\x34\x4a\x30\x98\xc1\xda\x76\x8d\x38\x9c\x80\x02\xc4\xa3\x39\x82\xd1\x60\x03\x39\x10\x7b\x2f\x05\xe0\x18\xf8\xdc\x4b\x9e\xcb\x0b\x91\xb2\x9e\x46\xb7\x18\x66\x6b\xcd\x44\x02\x0e\x76\x88\x64\xaf\x0b\x69\x6c\x1f\x5e\x62\xe5\x2e\x60\x5e\x15\xec\x9d\x31\x87\xd5\xe3\x0a\x01\x02\xb4\xb0\xae\xb6\x90\x50\xe4\x0a\x53\xba\x5c\x39\xe0\x95\x70\xe9\x7e\xe0\xea\x10\xba\xf2\x35\x4a\x17\x52\x01\x5f\xd5\xb4\x36\x16\xe2\xba\x00\xfa\xcb\xed\x1f\xcd\x3c\xea\xc7\x51\x5e\xf4\x0e\xf6\xc0\xa2\x3f\x38\x7b\xc9\xbd\xd7\x58\x0e\x57\x4b\x5e\x99\xb7\x22\xdf\x15\x57\x50\xf1\x06\x56\x22\x58\x1d\xf3\x3a\xb7\x98\x99\xd6\x38\x5d\xf2\x4b\x72\xfe\xae\x81\xb7\xc9\xbc\x3d\x04\x0e\x7b\xcc\x6a\xcd\x17\x22\x78\xbb\xb5\xd8\xc0\x65\x63\x0d\x7e\x78\x5f\x89\x4c\x04\x41\xa7\x5c\x66\x1b\xe6\x0c\xc2\xd1\x81\x08\x0c\x75\x69\x4e\x80\xa9\x08\xb9\x60\xb6\x60\x58\x51\x3c\xf3\xa5\xd2\xe6\x90\xc7\x09\x5f\xf1\x46\x75\x9d\x00\x7f\x0e\xc2\xa4\x86\xdb\x7e\x06\x5e\x92\xed\x1f\x67\xa5\xc8\x64\xa5\x1f\xef\x3c\x7a\xe7\x6d\x2c\x70\x18\x10\x41\x0a\xb8\x42\xdc\x76\xc3\x34\x69\xbb\xe5\x9a\xdc\x31\x49\x0b\x8a\x6f\xd5\x82\xe4\x0e\xb6\xa2\xdd\x7d\x29\x6c\x23\xa9\xa9\x98\x3f\xcf\x6d\xa1\xa2\x11\x11\x90\xe8\x6d\x56\xa4\x53\x2e\x12\x59\x4d\xbd\x12\x4c\x15\x41\x89\x8e\x4d\x85\xae\x8a\xce\xdf\xa5\x8f\x8e\x8c\x1d\x96\x5f\x27\x6c\x85\xe4\x38\xc5\x1a\xea\xf3\x2f\x8c\xc1\xab\x29\xe9\xbd\x01\x7d\x8b\x1f\xe2\x84\x3d\xb1\xdd\xc5\x9c\xc2\x5a\x6f\x28\x16\xf3\xb2\x00\x06\x09\xe2\xc7\xcf\xa6\x25\x8d\x24\xcf\xd8\xbc\xc8\xf3\xe2\x0a\xb3\x76\x7f\xae\x5e\x3d\xda\xda\xda\xf2\x36\x53\x9b\xa7\xa7\x0c\x99\x28\xfe\xdf\xff\x8f\xfd\xcf\x6b\xc1\xcb\xff\xe8\x9e\xa7\x6d\x63\x26\x99\xed\x5b\x5d\xaf\x45\x5a\x94\x0b\xb2\x93\x9a\xdc\x42\x6c\x6b\x6b\xeb\xd1\x19\xc2\x0c\x5b\xfe\x34\x6a\xd7\x79\x1b\x90\x3c\xdf\xa5\xfe\xb9\x77\x59\xbf\x97\x19\x95\x73\x3b\xd5\xc6\xea\x3e\x06\x90\xd5\x89\x28\x57\x00\x65\xf1\x34\x65\x87\x0e\xf0\x54\x63\xd0\x14\x02\xb9\x66\xc7\x84\x73\x96\x04\x49\xa8\x3f\xd2\x85\xf0\x38\x61\x3f\x36\x87\xf7\x18\xc5\xa8\xff\x9c\x2e\xc5\xc7\x0c\x56\xd0\xde\x75\x5a\x54\x0e\xf3\x9a\x40\x3a\xa0\x8f\xe1\xcd\x4a\x42\x1a\x79\x3f\x34\xdb\xbe\xef\x5d\xbe\x63\x61\xd1\xbb\x3a\x39\xa5\x8a\x12\xc5\x57\x04\xc5\x9d\xaf\x97\xdc\x7c\x5e\x71\x10\x47\xe0\x1c\x20\xff\x02\x78\x07\x7f\x7c\x5f\xd4\x34\x0a\xdd\xa8\x65\x41\xdc\x24\xa2\x75\xaa\x75\x40\x85\xf7\x13\x80\xc2\xa2\x74\xf8\x11\xbe\x79\x8c\x31\x4d\xc0\xa9\x97\x33\xca\x1c\x70\x81\x20\x04\x4d\x6e\x34\xf0\x58\x47\xc0\x1c\x5c\x23\x9c\x31\x37\x8b\xa3\x2e\x30\xf6\x0a\x21\x42\x73\x34\x38\xfb\x91\xc4\xd5\x63\xd3\xa9\x1f\x7d\xa9\xda\x63\x0a\x16\xd3\xd7\x88\xb7\x47\xa7\xca\xdc\xfe\x9a\xfd\xe8\x44\x5d\x30\x0a\x37\x79\x78\x33\x3f\xf6\xe4\xcf\x37\xaa\x10\x0d\x1d\xc9\x83\xb1\xf0\xbc\x75\x26\x9a\xb8\xd4\xc1\x68\x13\x36\x95\x8a\x03\x46\x3a\xd4\x92\x45\x99\x0e\xed\x98\x2d\x40\xe2\x64\x11\xe3\xaa\x54\x70\x73\xda\x97\x27\x21\xf8\x22\xce\xd8\xcd\x9d\xa5\x0d\xec\xae\x0b\x48\xa7\x50\x50\x86\x66\x71\x7b\x11\xff\x29\x4e\x5e\xc7\x77\x6b\x57\x1d\x63\xf3\x95\xdd\x79\x72\x77\x89\xf5\x8b\x83\x92\x67\x8e\x2e\xa6\x7c\x53\xa4\x63\x93\x0e\x3a\x6b\x7a\x68\x40\xf5\x7d\xfa\x29\x4a\x6f\xa7\xfc\xb1\x7e\x4e\xae\x43\x8a\x5b\x91\x17\x57\x29\x51\x6f\x9c\x16\xec\x1d\x55\xb1\x43\x47\xdf\xf6\x21\x8d\x75\xf2\xfe\x0c\xb2\x42\xbf\xe9\x1f\x4c\xa2\x4c\xdc\x1f\xc1\x2d\xf9\xf8\x5e\x99\xb6\x9b\xf2\x6c\xbb\x7c\x1b\xbf\xdd\x91\x13\x7b\x6e\xde\x0d\x8e\x8f\x6d\xea\x9b\xf7\xdf\x8c\xd1\xf9\x12\x33\x55\x8d\xbb\xbc\x3a\xe4\x92\x21\x27\xc8\xeb\xf7\x21\x5b\x13\xa6\xed\x05\x95\x87\xe0\x63\xa1\x17\x35\x67\xd1\x82\x14\x8f\x44\xa8\x74\xb5\x8e\x21\x81\xad\x12\xd0\x6a\x17\xce\xea\x5a\x94\x6b\x01\x31\x0c\xa8\x09\x73\x9c\xea\xb6\xe2\x00\xbd\xb6\xae\x22\x10\xa0\x53\x51\x7e\x88\x00\x27\x15\x65\x94\x08\x20\x54\x91\x15\x8e\x2a\x04\x32\x5f\x41\x00\xea\x26\xa4\x6d\x04\x51\x05\xaa\x42\x08\x4b\x83\xda\x77\xa4\x54\xc8\xb2\xa6\x3d\x6e\x59\x81\x8e\xfd\x99\x0d\x3a\x10\xcb\x5a\xeb\x75\x96\x73\xc2\x16\x0b\x13\xc2\xf7\xd7\xb6\x34\xcb\xf2\x48\x89\x00\x8f\x9a\xa0\xd0\x45\x57\xf5\x65\x47\xfe\xad\x54\x49\x33\xd0\xe0\x15\x86\x59\xa1\xd0\xae\x73\x60\xb4\x45\x63\xe5\x9a\x08\xf7\x94\xa5\x8a\x05\xf2\xe1\x8a\x82\x0c\xd9\xfe\xf1\x68\x72\x9c\x4e\xfe\x32\x79\xbc\xc3\x6a\x05\x85\x45\x22\xfb\x3a\xa2\xb4\x30\xb6\x11\x91\x40\x20\x22\x29\xc1\x8f\x51\xdf\x9c\x28\x43\xc9\xec\x10\x0a\x72\xc1\x4b\xc0\x26\x40\x62\x57\x54\xfc\x67\x00\xb1\xaf\xae\xdb\xac\x74\x6c\xb2\x6c\x93\xdd\xb9\x74\x0a\xd7\xb5\x64\xd3\xfb\xd6\x4e\xb4\xb4\x78\xf6\x68\x36\xe0\xf9\x74\xd3\xac\x99\x3d\x81\xc5\x8e\x20\xb6\xa1\x59\x07\x64\xc7\x42\x2d\xd0\x28\xdc\x1a\xb3\x7c\x5c\xbe\x41\x88\xa8\x8f\x01\x73\x87\x0e\x8e\x03\x80\x20\xb5\xcd\x18\xb1\x1b\x72\x22\x8c\xda\x6f\xcb\xb2\xc3\xde\x34\xe6\xe6\x9d\xc0\x5a\xa2\x96\x46\xb9\xae\xcd\xb9\x62\xe7\xa3\xe3\x96\x9d\x7f\x25\xa6\x6c\x8d\x96\x63\x87\xdd\x60\x34\x2e\x48\xa9\x43\xc0\x22\x6d\x4c\xbb\x15\x57\x19\xaf\x8a\xf2\xda\x5e\x0d\x58\x14\x42\xbb\xc0\xe7\x42\x40\x79\x92\xe7\xbb\x29\x7d\x28\xbf\x28\xe3\x74\x81\xf6\x55\x6c\x6e\xb2\x9f\x6a\xca\xb7\x08\xef\x4a\x58\x9c\xd0\x68\x32\x5d\x36\xb3\xb6\xc1\x2e\xaa\x43\x4b\x53\x15\x00\x7a\xa3\x04\xdc\x22\x6c\xcd\x65\x86\x22\xc6\x22\xe6\xf6\x3c\x93\x1c\x84\xe6\x83\x28\xaf\xd7\x25\x49\x15\x8c\xbc\x20\xe6\x03\x55\xa0\x59\x89\x81\x7b\xab\xc4\x87\xc5\x2d\x98\xa7\x80\xc9\x37\xd6\xea\x49\x42\xfa\x3a\x54\xe1\x80\xb2\x8e\x8a\x21\x2d\x33\x80\xab\xc2\xb4\x61\xaf\x98\x97\xce\x87\xb0\x61\x28\xc6\x76\xab\x17\x0b\xa1\x2b\xc4\x3f\x26\x47\x09\x85\x58\x13\x6f\x0d\xc2\x0c\x06\x28\x3e\xd4\x51\x2f\x48\x6c\x89\x12\x94\x93\x3a\xdd\x39\xb4\x3b\xba\xed\x4d\x23\xbe\x02\x5a\x3e\x87\x18\xf0\xaa\x53\x11\xf6\x9f\xf5\x51\xbf\x0b\x3f\xca\xe5\xb4\xe4\xe5\xf5\x63\x98\x1c\xff\x71\x08\x3b\x83\xfa\x60\x4f\x7b\x0b\xd7\x0c\x57\xcb\x85\x12\x59\x87\xc6\x63\xba\x1d\xcc\x07\x4a\xe4\x19\x46\x54\xab\x60\xbf\x70\xdd\x7d\x33\x84\x9a\x8f\xc8\xdc\xe0\x12\x9b\x28\x1a\xbe\x2f\xe0\xff\x30\x13\x6d\x83\xf0\x21\x64\x02\xed\xa8\xc4\x5e\x9e\x70\x68\xc3\x0a\x3c\xb8\x03\x1b\xbc\xa6\xb6\x2c\x4f\x22\xf8\x3f\xe4\x6f\x0a\xa8\x3e\xa8\x6d\x7a\x8f\x9d\x1f\xda\x57\xf8\x83\x96\x46\xed\xce\xdc\x35\xe0\xe2\x64\x16\x4c\xcc\xee\x10\x5f\xbf\x0d\xff\xc3\x69\x02\x04\xb9\x56\xd9\x6b\x98\x1b\xf2\xdc\x95\xa7\x92\x45\x27\xc8\x46\xad\xae\x8a\x06\x98\x5c\x60\x9c\xdb\x5e\xf9\x5b\xcb\x1a\xa9\xff\xa5\x0a\xb5\x50\xb5\xb1\x55\xe9\xbb\x43\xa9\x67\xb5\x36\x9b\x93\xf8\xb6\x1c\x9c\x7e\x90\x79\x06\x9d\xb3\xad\x26\xa1\xd9\x42\x48\xcf\xe0\x4d\xc4\x5b\xd5\xdd\x64\xde\xb2\x82\x9d\x17\x03\x48\x80\xa4\x0d\xd4\xf0\xbc\x28\xc0\xfc\x41\x28\x2e\x82\x51\xd2\x95\x11\xea\xfe\x2a\xd5\x15\x93\x73\xb7\x3b\x8d\x14\x45\xef\x26\x57\xd7\x98\xfd\x53\x15\x6c\x29\xf2\x35\x2d\x42\x3b\xaf\x24\x6d\x4d\xc8\x2e\x50\x88\xdd\x34\x2d\xd3\x7a\xa1\xa3\x21\xa3\xf1\x84\x5e\x36\xc5\x73\xb8\xb1\xcd\x21\x41\x4e\x14\x9d\x04\x41\x75\xe7\x64\x24\x72\xd8\x84\x89\x6a\x06\x9d\x18\xd6\x25\x5b\x1a\x0d\x05\x6e\x0d\xe2\xa0\xa1\xd1\x54\xe6\x81\x20\x10\x1b\x7a\x18\xd8\xee\xee\x2e\x13\xe8\xcd\x23\x65\xc2\x7c\xf4\xa7\x0e\x5f\xa5\x4f\xc6\x6b\xa1\x66\xa2\xdc\xfd\xea\xab\x7f\x0c\xff\xe3\xd3\xfd\x17\xcf\x9a\xf1\x9f\xfd\x17\x5f\xec\x3f\xc4\x7f\x3e\xc7\x5f\x8b\xbd\x9b\x32\x10\xd8\x5b\xa1\xca\x6b\x46\x9b\xa3\xdb\x75\xf6\xe8\x30\xa0\xf8\x6b\x79\xeb\xae\x40\x02\xa9\xcc\xa8\xaa\xa4\x03\x82\xf0\x3e\x28\xf9\x35\xa4\x29\x18\x8b\x1f\x32\x1b\x12\x76\x7e\x7e\xda\x9f\xb0\x03\x64\x09\xb4\x62\x6d\x2c\xca\x4b\x50\x7d\xf1\x99\x71\xad\xd8\x89\x9c\x95\x85\x86\xa4\x0b\xfb\xb1\x91\x5c\x63\x44\xf6\x98\x45\xa4\xe2\xc0\x77\x01\xf7\x3d\xa0\x9b\x76\x25\x8c\x62\x3e\xa6\xae\xf3\xca\x26\xf4\xc2\x3d\x05\xa9\x84\x17\x3a\xb0\x4e\x56\xe9\xa3\x86\x96\x6c\x63\x0f\x52\x85\xc6\x53\xa0\x38\x6b\xb6\x7b\xa3\x6f\x98\xed\x62\x75\x1e\xf8\x9c\x2b\x0b\x3b\xe2\x0d\xa9\x26\x42\x57\x29\x62\x88\x14\xff\x62\x50\xd3\x43\xbb\x46\xa8\x4a\x96\x6d\x1b\x82\xf0\x84\x33\x8f\xa5\x49\xb0\xbd\x00\x43\xc8\x2d\x0b\x1f\xe0\x8a\xc4\x0c\x72\x83\xc7\x70\xe3\x94\x02\x78\xca\x28\x9b\x0d\x81\x0b\xd0\x39\x4c\xb3\x29\xb5\x0d\x62\x75\x43\x2c\x81\x09\x62\xb7\x07\x84\x76\x6a\x0d\xbc\x68\xa8\xc3\x55\x54\x53\x8f\x4e\x9e\x00\x78\x28\x7d\x14\xe5\x10\xc4\xee\x0e\xf2\x77\x3c\xfe\x67\xcd\x59\x79\xdb\x3f\x1d\x01\x81\xf6\xe9\x41\xff\x21\x6d\xe5\x21\x6d\xe5\xf3\xfe\xa5\x4f\xce\xde\x9e\xed\x3e\x4b\x9f\xfe\x61\xec\xcf\xb7\xde\xff\x2f\x9e\xbf\x68\xe5\x7f\x7c\xf1\xfc\xe5\xc3\xfd\xff\x39\xfe\xcc\xad\x77\xf6\xf6\xcc\xa7\x3e\xdb\x98\x96\xd9\x12\x8f\x5a\xda\xc1\x57\x6c\x97\xed\x3f\xdd\xdb\x67\xf6\x77\x10\xb2\xdf\xa0\x1e\xdc\xfb\xca\xbc\x39\x9a\x0a\x04\x84\xfe\xbe\x8c\xaf\xc7\x4d\xce\x41\xb8\x64\x57\x02\xa3\xf7\x7b\x4d\xe7\xae\xbe\xd9\x47\x28\x18\x9f\x16\x97\xed\x9b\x34\x09\x8c\x1e\xa8\x00\xf1\x6f\xa3\x82\x77\xdf\x15\xef\x30\xeb\xf6\x2f\xeb\x4e\x87\x5b\x8c\x61\xf8\x7b\xf6\xe2\x37\x82\x1f\x46\x46\x22\xf9\x94\x26\xd6\x09\xb4\x75\xf6\xf6\x6c\x0b\x07\x40\x08\x66\x96\xad\x54\xa8\xac\x28\xb5\xf0\xce\x9f\x20\x13\x23\x72\x9c\x35\x74\x48\xda\x06\x1b\x5d\x41\x40\x2e\xd9\xfe\x3c\x61\x6b\x8c\xe8\xda\xa0\x0f\xc0\xb8\xff\xd7\x7a\xb9\x4e\x95\xa8\xac\xf5\x7e\x76\x87\x1e\xd8\x54\x87\xa9\x31\x04\x01\xe5\x10\x06\x99\x80\x2f\xcc\x7c\x89\x63\x26\x4c\x1a\x9c\x5b\x89\xc0\xdd\xc9\xad\xdd\xc7\x17\xc6\x7d\x0b\x68\x85\x1a\x8e\x8a\xb2\x91\x60\x82\xf1\x77\xf5\x13\x31\x16\xe0\x1a\x99\x33\x39\xbd\x66\x1a\x2b\x12\xb7\x8e\x0a\x88\x57\x32\xe8\xa4\x54\xba\x12\x1c\xcc\x53\x33\x16\x8a\x68\x9a\x01\xb0\xa3\xa2\x00\x04\x9e\xad\xf5\x72\x3d\x2f\x8a\x2d\xc2\x79\x8b\x4e\xf9\x7d\x91\xb0\xf2\x3f\x04\x09\x0b\x61\xae\x22\x30\xbc\x4f\x82\xb9\x8a\x03\x84\x7f\x2c\xcc\x55\xd4\xdb\x7b\xc3\x5c\xe5\x5d\x30\x57\x55\x2c\x7f\xdb\x60\x57\xd1\x03\xf7\x86\xbc\x8a\x7a\x6c\x93\xd7\x3b\x2a\x46\x08\x5c\xad\x43\xaa\x3a\x56\xf6\xab\x25\xaf\x74\x01\x29\x49\x4d\xe9\xea\xe5\x93\x77\x68\x1b\x99\xf4\x8a\x6d\x4d\xa2\x84\x7c\x4b\x4e\x6b\x06\xe4\x53\x6f\xe6\xa5\x68\x30\xf6\x9a\x9d\xf6\x3f\x03\xef\x0c\x1d\xaa\x27\xf6\x37\x4f\xfe\x63\xeb\x26\x5b\x82\x82\x87\xe6\x2d\x04\xf2\x01\xaa\xf0\xa4\xdf\x3b\xd9\x6c\x67\x44\x28\x45\x7f\x6a\x4b\x63\xe3\xd8\x4c\xff\x27\xe3\x10\xc3\xa4\x33\xd2\xfa\x60\x88\xfc\x93\x1a\x22\x93\xe8\x4a\x23\x54\x0c\x38\xa5\x97\x45\x5e\xab\x8a\x97\xd7\x8d\x74\x57\xa8\x5c\x9d\x5e\x63\xae\x98\xa7\xb7\xd6\x6d\xaa\x02\x2f\x84\x1e\xc5\xb7\x05\xf9\x4d\xe9\x06\x16\x19\xd2\xaf\xad\xb8\xcc\x19\x6f\x5d\xc8\x47\x36\x3c\x13\x32\x86\x14\x4d\x29\x66\xf5\x1a\xf3\x89\xcb\xfa\xa1\x9b\x5e\x0b\xd1\x75\xf4\xff\x23\x7d\x64\x9e\x76\x12\xc4\xfc\xfc\x7b\xa1\x32\x0a\xc3\x74\x08\x11\x5e\x45\xed\x7c\x10\x2a\x4b\x67\xc5\xea\x3f\xfe\x39\xec\xb9\xfb\xfe\xa5\x4f\x86\x6b\xa1\xc6\xe3\x3f\xb2\x06\xe0\x96\xfc\xff\xfd\x67\x7b\xfb\x4d\xff\xef\xfe\xde\x83\xff\xf7\xb3\xfc\xd1\xea\xdb\x0b\xbd\x6d\xf1\x7d\xb9\xbb\xff\xf4\xe9\x97\xa0\x09\xda\x67\x6d\x4a\xe9\x67\xb2\xfa\x62\x37\xe9\x83\xd9\xf7\x67\x31\xfb\xcc\xea\x77\x46\xc0\xd9\x0a\x21\x2f\x20\x66\x28\xc0\xb1\xac\x2d\xa2\x69\x2b\x4c\x80\x14\x4f\x41\x45\xfa\xbd\x95\xc2\x20\x03\x03\xab\x4f\x9d\x82\xdc\xd8\xb0\x60\x09\xd1\x5e\x0c\xbf\x9e\x14\x45\x7e\x21\xab\xb8\xc2\xb2\x58\x0b\xa5\x75\x9e\x16\xe5\xe2\xc9\xce\x16\x59\x8c\xd6\xd2\xd5\x6c\xab\xf1\x63\xc2\x8f\x6a\xbc\xf1\xcf\x69\x0c\xd3\xd0\x76\x67\x45\x29\xfe\x2b\x18\xa7\x45\xf7\xfe\x44\xbb\x98\xc6\xbe\xe5\x4d\x63\xf7\x49\x97\x79\xac\x6f\x37\x8f\x6d\x11\x71\x43\xee\x7c\x66\xa3\xe3\xf7\xda\x5f\x37\x6d\xaf\x5b\x6d\x12\xf7\x2a\xca\xf8\xfc\x17\x31\x47\x9a\xc3\x7a\xb0\x44\xfe\x0d\x2c\x91\xd6\x09\x9b\x95\xd7\xeb\xaa\x58\x94\x7c\xbd\x94\xb3\x40\xe0\x91\x44\x98\x5e\xb3\x7e\x29\x67\xec\x7d\x51\xab\x05\xdb\x16\xfc\xfa\xbf\xe0\x17\xe6\x41\xa3\x9a\xef\xf8\x8c\xfb\x0d\x27\x37\x68\x69\x22\x57\xec\x6d\x9d\xe9\x42\xb1\xed\xea\xa7\x65\xab\x25\x87\x58\x30\x1e\x1f\x0b\x7e\xdd\xa5\x18\x61\x22\xf8\x8b\x5d\xa3\x1d\xdd\xd2\xb3\x47\x9d\x2a\xd2\x24\x8a\x94\x02\x77\xa3\x39\x04\x8e\x5c\x91\x20\x9d\xee\x33\x7c\xd1\xfa\x35\xd7\xae\x05\x0d\x65\x07\xc8\xef\x89\xe2\xd1\xdc\xeb\xa7\xa2\xd2\x33\xbe\x16\xda\xbc\xdc\x95\xf1\x61\x3e\x90\xd4\x58\x52\x17\x67\xf2\x11\x61\x9d\xda\x0d\x3e\x82\x8c\x24\xcd\xf2\x02\x39\x91\x6f\x54\xc8\xf8\x52\x70\x4c\x46\xc3\x2e\x77\x3f\xe8\xb2\x2b\x21\x77\x35\x13\xbe\x4c\x12\xae\xa0\x50\xe8\x43\x81\x89\x44\x35\x70\x74\xf0\x3c\x61\xa3\x71\x2f\x61\xf9\x92\xeb\x65\xc2\x0e\x8d\xd0\x13\xd5\x2c\x4d\xa0\x99\xaf\xe3\x94\x4b\x33\xe1\x58\x12\x36\xa1\xff\x6a\x92\xdd\x86\x14\x25\xad\x37\xb7\x6a\x0e\x04\xd3\x7c\x15\x6a\x6b\xe8\x56\xb3\xd0\x7f\x56\x59\x5d\x16\x79\x66\xb4\x31\x7d\xdb\x46\x0c\x36\x9c\x25\xdb\xf6\xbb\xe0\x31\x15\x89\x5a\x04\x4a\x24\x83\x6a\xa6\x0c\xd3\x35\x84\xd5\x2c\x94\x10\x88\x90\x89\xa5\x58\x15\x50\xfc\x34\x98\x37\xc2\xf6\xda\x61\x58\x72\x7b\x9e\x92\x70\xfb\xe9\xa5\xe5\x69\x24\x77\x6d\x15\xa8\xfa\x3a\x48\xf6\xb3\x97\xb7\x2b\xf3\x0b\xd3\xcd\xcc\x3b\xe8\xd0\x92\x9b\xc0\x5d\xce\xe5\x0a\xa1\xca\x2a\xf1\x33\xa4\xd0\xaf\x84\xd6\xa6\x67\xdc\x95\xa8\x62\xea\x59\xbd\x46\x54\xaf\xc6\xb2\x6d\x17\x2a\x97\x98\xee\x49\x2d\xec\x74\x51\x38\xe1\x70\xff\x35\x8c\x95\x07\x33\xe5\xcf\x62\xa6\x80\xf8\x85\x55\xdc\xa0\x4a\xfe\xd6\x8b\x6e\xcb\x96\x2a\x5d\x15\x65\xc6\x1e\x47\xcd\x3d\xb6\x47\x29\x17\xf3\x0a\x20\xee\x2c\xb3\x64\x51\x4b\x25\xb4\xaf\x5f\xb4\xa7\x10\xf3\x78\xe0\xbc\x5b\xf1\x10\x77\xd0\xa6\xad\xbe\xda\xdd\x71\x3c\x5e\x73\x4a\xe0\x24\x76\x49\x75\xcd\xde\x49\x95\x15\x57\xda\xa7\x56\x3a\xca\x6c\x1e\x96\x8d\x50\xc1\xc8\x8e\xef\x07\x5f\xaf\x75\x40\x0a\xbb\x1d\xc2\x29\x9a\x36\x76\x3a\xe8\xb4\x55\x6b\xba\x6f\x55\xdb\xef\x7c\xf9\xdf\xa2\x86\xf7\x47\x83\x03\xf6\x7e\x78\x7e\xfa\xe6\x9f\x3f\xe9\x28\x00\xca\x19\x8e\x1e\xd4\xed\x7f\x5d\x75\x9b\xc2\x87\x33\xd1\x4a\xf1\xb6\x3c\x4c\x2e\xed\x70\x9a\x53\x1d\xbc\xf7\x85\xbb\x48\x64\x19\x9e\x64\x2b\x1c\x31\x38\xc8\x95\xf5\x03\x40\x39\x54\x96\x32\x99\x8a\xb4\xfd\x84\x96\x80\xf4\x07\x21\x81\xb5\xc4\xd0\x31\x94\xed\x50\xac\x96\x4a\x08\xa2\x2e\xda\xbe\xff\xd5\x17\xae\x1a\xc1\xf1\xe6\xf4\x3c\x42\x99\x9b\x89\xf4\x87\x7f\x49\xef\xfc\x1f\xff\x97\x3e\x19\x9f\x1d\xef\xee\xa5\x4f\xff\x61\xfe\xff\x17\x2f\x5e\x3c\x6f\xfa\xff\xf7\x5e\x7e\xf1\xe2\xc1\xff\xff\x39\xfe\xc6\xe7\xa7\x0d\xc4\xd6\x00\xb0\xf1\x29\x29\xa4\x01\x76\x81\xad\xd2\x30\x3b\x66\x2f\x65\x5b\x07\xde\x12\x3c\xd7\x62\x8b\x18\x09\xe3\x32\xcc\x32\xa6\x62\xb2\xa7\x38\x42\xca\xf4\x32\xc7\x58\x7e\x21\xb6\xa5\x7f\x23\xbe\xcf\xd5\xa3\xd9\x97\x01\x87\x0a\x41\x95\x83\x9e\x8d\xf9\x0a\x58\xa2\x69\x1f\xf7\x65\x9a\xf0\x2d\x79\x17\x4f\xe2\x3c\x67\xfb\xa2\xfd\xf8\x45\x76\x46\xec\x0b\x51\xe9\x5e\x4d\x23\x46\x93\x06\xd6\x61\x42\x5e\xcd\xe8\x0d\xa8\x6b\x4d\xaf\x63\x3e\xff\xc4\x69\xc4\xf1\xc3\x36\x06\x8b\x8c\x9f\x3e\x91\x25\x64\xfd\x75\x5d\x7e\x06\x5d\xf6\x13\x1a\xf6\xb5\x45\x2f\x15\xbf\x87\x12\xe1\x6f\x1b\x11\xf4\xf2\xa4\x85\x6e\x02\xb3\x3f\xe3\x5a\x04\xe0\x02\x6b\x0b\xe1\x61\x8b\x84\xb1\x92\xb0\xc4\xfc\xfb\xac\x55\xf3\xea\x01\x26\x9d\x26\x1f\x18\x3c\x7e\x90\xcf\x53\xb6\xd5\xcf\xc5\xac\x2a\x0b\x25\x67\x31\x2d\xfb\x89\x30\xf7\x8f\xd4\x2b\x3b\x72\xce\x56\xf6\x23\x5b\x3e\x65\xee\x36\xa8\xee\xf2\xf8\x03\x4d\xe7\x2e\x51\x14\x40\x21\x42\x75\xed\xaa\x04\x84\x7f\x6b\x55\x72\xa5\xe7\x08\x71\x99\xf1\x8a\xfb\xee\xbd\x30\xdd\x73\x38\x10\xb6\x1f\x4d\xda\x49\xe7\xa3\x0e\x92\x75\x42\xa2\x53\xd7\xdc\xcb\x94\x6d\xb5\x80\x35\xc3\x75\xf5\x71\x79\xb3\x86\x74\x02\x64\x66\xfe\x01\xa5\xa4\x64\x8f\xb7\xc1\x39\x3b\xe8\xb4\xa9\x44\xc0\xd5\x0b\x1a\x53\xc4\xb2\x8b\xf9\x2e\x7d\x91\xb2\xad\x80\x58\xd8\x4f\x35\x42\x4f\x43\x4a\x3f\xee\x23\xd1\x18\x78\x51\xb6\x77\x05\x2c\xf6\xfd\x98\x8e\x7d\x57\xbe\x4c\x3d\x90\xac\x9b\x13\xa9\xdd\xc6\x0a\x9f\xdc\x73\xcf\x86\x0b\x63\x71\x8f\xc2\xb4\x28\xa8\x4f\x4c\x6e\xe1\xe9\x4d\x1c\x22\x05\x19\xf5\x90\xdc\x46\x67\x46\xd2\x6c\x23\x20\x34\x54\xcc\xd9\xc4\x2e\xd8\x7e\x38\xbf\x09\x16\x96\xab\xac\xa3\x04\x7e\x56\xa8\x4b\x71\xed\x6a\xe0\xfd\x40\xbe\x4a\x5b\x20\xbe\x34\xff\x41\x91\xba\xe9\x3b\xa8\x6b\x58\xa8\xee\xad\x2d\xd3\x8f\x0a\x90\x7a\x4c\xa7\xaa\xb2\x9e\xd9\x8a\x8f\xa0\x06\xb8\x25\x2a\x90\x88\x43\x5c\x02\x38\x5a\x2c\x2e\xd9\xbb\xa5\x50\x2d\x02\x17\x77\x94\x91\x74\x5a\x94\x54\x7b\x6e\xf1\xc3\xa2\x46\x98\x74\xd5\xfb\x8c\xb1\x1e\x82\xdb\xdf\x3a\x92\x10\x96\x98\x63\xf5\x7e\xc0\x0a\xde\x1a\xc2\x86\xee\xfb\xf7\xbe\xc6\xf7\x2a\x71\x45\x0c\xbd\x70\x89\x58\x12\x40\x98\x81\xa0\x80\xfd\x9e\xed\xef\xa5\x7b\x4f\x53\xb6\x15\xfd\x6a\x2b\x4d\x9f\xd0\xd2\x35\xe8\x5a\xdb\xa4\x33\x31\x61\x63\x44\xff\x77\x9f\x33\x6c\x96\xa3\x71\x41\x39\x94\xb9\xa4\xb9\x8f\x65\xe5\xd6\xb1\x23\xe9\xef\x93\x88\x23\xa3\xe9\x30\xe7\xf1\x8c\xc3\x99\x3a\xc8\xb9\x5c\x45\x1b\x79\x8d\x5f\x80\x43\x68\x5b\xef\x24\x4c\x15\x57\xac\xb8\x52\x48\x3f\x62\xce\x04\x72\x13\xf8\xa3\x74\x33\xc1\xc3\x4a\x54\xcb\x22\x83\x72\xaa\x99\xd0\xd6\x71\xba\x5e\xf3\x92\x57\xb5\xc6\xf7\xe0\x55\x16\xbc\xdd\x4b\x0b\x33\x10\x38\xcb\xe1\x6d\xbb\x67\x46\x10\x4c\x7d\xb0\xa0\x08\x28\x14\xc1\x68\x75\xf1\x8b\xcf\x21\x46\x0a\xba\x50\xcc\xc9\x58\x15\x04\x88\x16\x22\xf5\xac\x8a\xac\xce\xa1\x52\xca\xed\xcb\x84\xad\xf3\x9a\x8e\xbe\xd6\x05\x54\x66\xb5\x80\x7b\xa0\x0e\x76\xce\x81\x37\xd2\xaa\x70\xf6\x24\x22\x1d\xb6\x76\x51\x69\x50\x95\x8a\x9c\x70\x47\x3c\xf8\x9f\x54\xba\xe2\x79\xee\x14\x03\xae\x02\xe8\x77\x28\xbb\x0e\x9d\x93\x0e\x95\xdf\x52\x28\xf1\x52\x6a\xf0\xfa\x11\xbd\xc4\xcd\xc2\x06\xef\x44\xa8\xe6\xbd\x50\xc5\x95\x4a\x02\xc5\x30\xbe\x4f\xec\x9c\x3a\x5d\xe8\xb1\x66\xb3\x65\x21\x67\xd6\xa3\x1f\x1c\x0c\xef\x63\xe6\xd0\xa7\x52\x68\x8d\xdb\x09\x51\x87\xb8\x85\xc4\x0b\xfc\xb5\xe0\x9e\x2a\x8b\x75\x29\x11\x6d\xc5\xfe\xce\x99\xc3\xbb\xf8\x5b\xa0\x6b\x08\x40\x2f\xae\x64\xd6\x48\x4a\x05\xd8\x22\x20\xd1\x59\x84\xc7\xc0\x28\x99\xef\x8b\x7a\x0b\x3c\x65\xe6\x5f\xe5\xd6\x8e\x3b\x06\x8d\xbb\x9d\xb3\x1c\x00\xc5\xe8\x8e\x27\x1c\x95\x00\x08\x1c\x4e\x69\x42\x7a\x96\xb1\xb3\xed\x69\x08\xef\x17\x7b\xa3\x26\xf1\x71\x86\xf6\xa9\x56\x7c\x13\xcb\x2c\x94\x4f\xdb\x0c\x60\x4b\xc6\x01\xa4\xc9\x47\x45\x19\x76\x4e\x9a\xad\x85\xe3\x72\x9e\x38\xb3\x47\xa9\xe7\x56\x45\x80\xad\xa6\x13\x8c\xa2\xc0\x7f\xe4\x20\x33\x60\x3f\x49\x0b\x64\x6e\xf4\x30\xf0\x05\xe2\xce\x84\xf1\xbc\x2f\x6a\x7c\xa9\x03\x8e\xb0\x7d\xf5\x5b\x3c\x61\x5b\xf4\x9b\xe0\x60\x6e\xf3\x1d\x3c\x9c\xc5\x95\x99\x2a\xf4\x3b\x86\xcc\x20\x70\xed\xcf\xb8\x85\xb5\xc0\x0f\x69\xb9\x57\x5c\x71\xf4\x37\x82\x37\xbe\x76\x16\x87\xd7\x05\xa6\xd7\x9e\x5e\x25\x34\x79\x60\x48\xc0\x47\x7b\xa5\x44\xa9\x97\x72\x6d\x9a\x80\x64\x47\xd0\xfd\xe6\x72\x5e\x01\xf6\xe0\xcc\xb4\xbe\xfd\xe2\xe9\xff\xd8\x71\x68\x1a\x75\x05\xb8\x04\xb0\xc7\x96\x9c\xfc\xd3\x53\xa1\xc4\x5c\x82\xc9\x15\x35\x19\xf4\xca\x3a\xf3\xc3\x43\xd0\x10\xc4\xfb\xe9\xde\x06\xe8\xf6\x37\x46\xda\x6d\xc2\x75\x37\xf2\xd7\x4a\x44\x8d\xf4\x23\x08\x84\xb4\xdb\x85\x84\xa4\x0a\xb5\x0b\xcc\x35\x5a\x5e\x06\x29\xf7\x11\xa8\x8f\x27\x31\xe8\x66\x6b\x42\x01\x1d\xa8\x09\xc8\x22\x05\x51\xb4\x1b\xe8\x9d\xd8\x76\xa0\x5f\x93\x54\x37\xca\xbc\xc5\x69\xdf\x69\xc8\xf8\xf6\x50\x2d\x2c\x85\x8b\x76\x24\x94\x35\x1f\x40\x32\x39\xb4\xa6\x00\x6a\x29\x72\xb4\x89\x0e\x49\xb7\xdd\xa1\x0c\xef\xb4\xe2\x4a\x0d\x53\x8b\x62\x20\x5c\x3b\x65\x84\xb3\x40\x15\x07\xdc\xa5\x60\x8e\xa6\x76\x8e\xa2\x7b\x96\x49\x35\x2f\xa5\x5a\x78\x2d\x1b\xef\xa0\x84\x80\xe8\x8c\x30\x17\x58\x19\x52\xcc\x9b\xfa\x02\x51\xa3\x25\x08\x3f\x62\xac\xd3\x04\x27\x68\x6d\xf6\x3c\x84\x7c\xcc\x8f\x89\xb0\x06\xd9\x92\x4d\x83\x3c\x17\x49\x14\xc2\x01\x47\x80\x99\xc2\x42\x8b\x6e\xad\xaa\x73\x86\x02\x8d\x6d\x7b\xb6\x13\x96\x46\x78\xd8\x28\x1b\x24\xb6\x22\x6a\x3f\xdd\x33\xdb\xc5\x52\x42\x03\xec\x3f\x00\xe3\x82\x1f\x93\x62\x4d\x46\xc0\xb7\x97\x7f\x2e\x4b\x0c\xf9\x38\x07\x42\xdc\xc7\xce\xaa\x90\xb6\xc2\x63\x7a\x9b\xed\xb0\xd3\xa2\x32\x0b\xeb\x8e\x73\xd8\x41\xd3\xb1\x69\x71\x09\xe7\xc5\x6e\xd5\xdc\xeb\x5a\x34\xb6\x57\x6c\x6f\x87\xe2\xf1\x19\xe9\xa8\xe6\xf8\x81\x7a\x1c\x80\x53\x46\x9d\xfc\x9a\xed\xef\x30\x2d\x40\xd7\xd9\xfc\x4c\x51\xb2\x67\xd8\xb4\xdd\x1e\x2b\x50\xaf\x41\x16\x9a\x9d\x12\x1c\x3e\xc6\x98\xc4\xb9\x8f\x8a\xd9\x37\xe8\xc6\xf1\xef\xe8\x87\xb7\x3a\x1a\xf0\x24\xc0\xe9\x75\x37\x2b\x5c\xb9\x00\x07\xe0\x05\xd8\x7e\x1a\xb1\x47\x91\xdc\x1a\xdf\x5f\xb8\x24\xe8\xc5\x88\xa8\xa8\x7e\xbb\x9c\xfb\xa3\x25\x56\xe4\x42\xfa\x1d\x85\x55\xec\x1d\x0a\x98\x2b\x88\xb2\xdf\x4f\x52\xb7\x20\x23\x0d\x0f\x49\x52\x02\x64\x2b\xe2\x49\x09\x56\xb7\x29\xe2\x1a\x3e\x83\xfb\x89\xbc\x4f\x92\x78\x49\x43\xe4\xdd\xe0\x81\x0b\x07\x4e\x43\xe4\x79\xa1\x5c\x37\x11\x0d\xd7\xed\x6c\x18\xa6\x31\xa4\x3a\x1c\x89\xf1\xc4\xd9\xab\x3b\xf8\xf5\x4e\x20\x6d\x61\x59\x51\xb0\x36\x85\x6a\x20\x88\x6f\x90\xaf\x20\x38\xee\x38\xb0\xce\x15\x45\x4c\xbf\xfd\xce\xd3\x7b\xc7\x76\x7f\xdb\x6c\xdc\x51\xf2\x93\x4c\xd5\x46\x34\x58\xa9\x6f\xfe\x79\xa3\xe0\x0f\x3b\x84\x22\xdf\x4c\xbb\x66\xb1\x63\xbb\xcb\x86\x6b\x48\x78\xb5\x51\xc2\xef\xdf\x57\xc2\x3b\xe2\xb2\xd6\x3c\x2e\xb9\x26\x89\x9f\x79\x71\xde\x31\xa7\x1b\x04\x7f\xe7\x93\xb7\xc8\x7e\x94\xf7\x5e\x90\xc6\xe6\x2a\xd0\xde\xb5\x97\xd4\xb4\xd7\x2d\xee\xef\xb3\x61\x1a\x77\xc0\xb6\xc7\x4a\x0d\x1d\x32\x1d\xef\xdf\x71\x1a\xb8\xbd\x35\xe0\x96\x7b\x7e\x07\x11\xd1\x74\xd7\x62\x86\x8b\x86\x30\xe4\x9d\xbb\x6f\x73\x4f\x22\x0f\xb5\x27\x34\x73\x77\xd8\x33\x63\x41\xf5\x62\x16\xc9\xe3\x10\xcd\x3f\x7e\x1d\x5a\x4f\x80\xff\x8e\x20\xa0\x05\x68\xa9\xc1\xc7\x2e\xdc\x01\x3b\xfe\x4e\x2e\xd5\x9b\xfd\x27\xe1\x36\x6e\x1b\xd6\x81\xb9\x18\xcd\xdb\x8a\x43\xa0\x37\xe6\xcc\xca\xaf\x6f\xd3\x99\xee\x64\x8a\x3a\x07\x63\xcb\x18\x45\xcd\xf3\x7d\x2b\x67\x24\xe0\x04\x0b\xda\x81\x1d\x26\x80\xc8\x20\xe4\x0c\x0b\x87\x07\xfa\x95\x1b\x43\x1a\x61\xdf\xa3\x2c\x46\x1e\xaf\x42\x7b\x1e\x7d\x8d\x17\xdf\x75\xe7\x3c\xc1\x3e\x01\x00\x4f\x8d\x14\x12\x48\x89\xaa\xad\xbf\xc1\x56\xe0\x6e\x1a\xbb\xc3\x2c\x9a\xc9\xb5\x34\xe7\xf4\xb1\xd5\x1d\x8c\xa8\x86\x09\x09\xc0\xfd\x7c\x25\xb9\x4f\x9e\x21\xdf\x2a\xcf\x9d\xab\x08\x47\x62\x3d\xe1\xc1\x03\xd4\x72\xe4\x72\xf4\x3c\x9c\x2f\xfc\x1e\xde\x4f\x59\x0f\xdd\x1d\xc4\x27\x39\x8f\x02\x1a\xe0\x5c\x8d\xbc\xbe\xf7\xd9\xc7\x16\xd6\x34\xe6\xd2\xec\xa2\xc7\xbb\x75\x77\x79\xc5\xc4\xa5\x6b\xae\x44\x26\x39\xb8\xaa\x55\x17\xa1\x61\x51\x42\xd5\x22\x64\x1d\x51\xdc\xe8\xd6\xf8\x13\x01\x83\x1a\xcd\x00\xc6\x54\xac\x02\x2e\xd0\xce\xb7\xb8\x51\xe1\x45\x2b\xe7\xcd\xc1\x42\xe5\xe4\x6d\xef\x4d\x6c\x6e\x1e\x90\x57\xc4\xfe\x27\x47\xf9\x5c\x5d\x89\xfc\x52\xb0\xed\xbd\xfd\x1d\xb6\x2a\x54\xb5\xd4\x0c\xbd\xa9\xee\x3e\x94\x95\x0d\x61\x40\xb2\xc6\xcc\xcc\x52\x40\x61\x1a\x36\xa6\xe5\xcf\x6c\xfb\x65\xa3\x21\xbe\xb1\x92\x3d\x8e\x62\x46\x1b\xc2\x55\xf0\x37\x06\x5e\x15\x44\x85\xea\x36\x7c\xba\x91\xfd\x55\x28\x5d\xd3\x36\x26\x77\x76\xd7\x09\xb4\xb9\xb4\xfe\x1d\x96\x53\xd1\xfc\xe2\xf6\xc5\x95\x48\x0e\x52\x71\xa9\x6c\x28\xb7\x23\x56\xfd\x2c\x35\xc2\x5f\xa0\x8b\xb5\x33\xd6\xec\xc5\x14\x7a\x9c\x78\x9e\xc7\x22\x74\xd3\x79\x20\x4f\x2d\x92\x1d\x42\xb8\xc2\x1e\x64\x7b\x84\x2d\x2c\xf1\x7b\xbb\xeb\xcc\x4f\xf0\x9c\xd1\x3d\x15\xeb\xd8\x7e\xed\xa9\x82\x06\x1b\x48\xbb\x24\x29\x90\x9e\x28\x60\x86\xae\x78\x85\x0e\x31\x37\xdf\x8d\xc8\x8e\x2d\x1f\xda\xcc\xc3\x0b\x7a\x49\x6c\xfb\x39\x0f\x2c\x5d\x59\x6d\xbb\x1c\x7d\xd2\x61\x3a\x50\x08\x40\xdb\x19\xec\xb4\xae\xbf\x60\x43\x24\xce\x27\x40\x8e\x7f\x0a\x9e\xc0\x7f\x6d\x10\x05\x36\x1d\xb2\x99\x28\x1e\x2c\x94\x15\x96\xe8\xbe\x43\x78\xb5\xa2\x8c\xfd\x74\x9b\xf4\xc8\x67\xe9\xf3\x14\x08\xa1\x9d\x81\x78\x66\x0d\xc4\x13\x20\xc8\x0f\x63\x56\x66\x48\x13\xd8\x78\x67\xa0\x95\xa1\x2a\x03\xf9\x99\x4d\x7d\xd1\x43\x05\xe3\xf5\xe3\x34\x4f\x0b\x92\x11\x6c\xe0\xc7\xfa\x66\x13\x15\x02\x7c\x1e\x52\xd6\x01\x7a\x57\x6d\x04\xef\x2e\x83\x31\xba\xb2\x35\xf8\x20\x8b\xd2\xa8\x16\x49\xf4\x58\x63\xd3\x55\xe2\xe7\x0a\xb7\xba\x4b\x0f\x08\x8f\x76\x9c\xd4\x26\x2b\x28\x46\x4b\xd3\x27\xc7\xfd\x37\xbd\xe3\xc7\x8f\x2d\x93\x12\xad\x0c\xa5\x6f\x20\xf1\x0a\x6d\x7e\x52\x6c\x7d\x6a\x0a\x7e\x0d\xc4\x4c\xf3\xb9\x9c\x19\xc9\xc3\x32\x51\x71\x99\xdb\x39\x74\x12\x09\xe1\x4b\xcc\x1c\xa3\xac\xb7\xe7\x73\x56\xb5\x16\x03\x39\x4a\x29\x65\xdf\xaf\x8a\x17\xc0\xcd\x03\xd4\x90\x86\x7c\xe3\x65\xdc\x98\x3f\xc4\x67\x36\x67\x75\x6d\x4e\x5d\x80\xf5\x01\x73\xe2\x08\x1b\x02\x74\xf0\x68\xfa\xc1\x00\x0a\xa4\x70\x10\x74\x53\x19\xb5\x5e\xf1\x0b\x8b\x37\xa2\x2b\xb1\xd6\x6c\x1b\x2b\x11\x20\x36\x48\x28\xbc\x61\x04\x25\x06\xc4\x45\xc8\x18\x0d\x28\x00\x7a\xc7\x93\xae\x5f\xb3\x19\xcf\xcd\x05\x41\x68\xb9\x08\x07\xc0\xaa\xa5\x51\xb1\xae\x96\x85\x67\xcc\x6e\x45\xd4\x60\x61\x94\xb8\x0a\x66\xd6\x5d\x2b\x38\xf3\x22\x4b\x63\x0f\x69\x38\xe8\xde\xd9\xa0\x75\x7c\x1e\x37\x62\xba\x91\x26\x15\x68\xed\x54\x98\xb0\x42\x92\x6b\x1b\x72\xdb\xde\xea\x9d\x0d\xcc\x46\x44\x4b\x74\xf3\xb1\x2c\xe6\x0d\x9b\xd0\x6a\xfa\x78\xcd\xb9\xa9\x51\x62\x26\xb4\xe6\x25\x54\xc7\xb8\x72\x1f\x1c\x78\xef\x6c\xd0\x71\x86\x00\x90\xc6\x76\x1a\x01\xce\x03\x7c\x05\xb2\x6e\xfc\x9e\x68\xd8\xd9\x23\x01\x58\xf2\x24\xe8\x74\xec\x6d\x2b\xed\x97\x08\xfe\x9e\x04\x44\x16\x90\xce\x5f\x18\x15\x7d\x5d\x97\xba\xe6\x0a\x9c\x71\x01\x85\x3b\x18\xe7\x68\x0f\x87\x4d\x4e\x45\x2e\xc5\xa5\x45\x93\xbf\x69\x1d\x90\x3b\x35\xfc\xde\x81\xe1\xdb\xf4\xae\x6d\x24\x2e\x78\x52\xb4\x29\xe6\x83\x43\xed\xc9\xba\x31\x5f\xa3\x2b\x0d\x63\x43\x24\xdb\xa8\xc0\x6c\x64\x85\xe1\x29\xd6\xdc\x04\x97\x66\x56\xe3\x06\x21\x90\x74\x77\xbd\xf8\x90\xbc\xcd\x9e\x82\xe3\xd8\x36\x3f\x60\x37\x4a\x87\x88\x69\xb3\x4f\x2c\xda\x3d\x1c\xb7\xe0\xd6\x0a\x95\xab\x48\x35\x06\x1d\x01\x01\x8d\x64\xa5\x7d\xea\x07\x70\x0d\xa9\xf6\x2d\xdf\x6a\x38\x2f\x68\x9f\xbb\x23\xce\x3d\x15\xbd\xcb\xdf\xdf\xb1\xc4\xfe\xac\xd6\xa2\x24\x32\xea\xa9\x60\xb9\xbc\x10\x58\xd0\x95\x17\xc5\x05\x81\x48\x9b\x66\xe8\x1d\x30\x4c\x6f\x0b\x64\x11\x5a\x7b\xb8\xec\x66\x45\x1d\xd2\x52\x96\x21\x24\x16\xdc\xfd\xd0\xa3\x70\x95\x29\x7f\x87\x06\x11\x09\x4d\x9f\xd5\xe4\x47\x0e\xc7\x24\x5c\xaf\x30\xf2\x89\xea\x41\x7c\xe7\xdb\xb4\xb0\x70\x9e\x71\xf4\x91\x12\xd0\x61\xa7\x45\xca\x80\x2b\x0c\xcc\x91\x4e\xb8\x41\x1f\x1e\x70\xba\x3b\x4c\x29\x30\xd6\x12\x4b\xb2\x81\x41\x65\xa3\x08\x62\xad\x5e\x62\x79\xc4\xae\x13\x8f\xd4\x2d\x55\x26\x56\x90\xcd\x56\x94\x01\x61\x58\xe1\xdd\x11\xd0\x70\x30\xeb\xbe\xdf\x4d\xcb\xbe\xc3\xba\xcc\x0a\xa6\x0b\x34\xef\x0b\xd8\x4d\xc8\x4e\x88\x28\x31\x09\x95\x0c\x56\x6d\xe0\x98\x0e\xce\xe8\x92\x0a\xd9\xbc\x1f\xc5\xaf\x91\xb9\x94\xcc\x69\xe0\x53\x5d\xe4\x75\x65\xb6\x14\x30\x6b\xa0\xbb\x1c\x11\xb4\x66\xcb\x4f\x1a\xbf\x39\x61\x30\xaf\x78\xd8\xc1\xc0\xc8\x0b\x25\xbc\x3f\x81\xa2\x01\x7c\x51\x0a\x62\x82\x87\x26\xe7\x37\xe9\xa8\xe8\x5a\x88\xdc\x8b\x34\x40\xdf\x07\xa9\x66\x75\x59\xde\xa4\xed\xda\xd3\x12\xb6\x43\x07\x50\xd7\x39\xf8\xc0\xee\x3e\x64\x34\x8b\xcd\x80\x60\xb8\x5e\x92\xbd\x6c\xb8\xaa\x8a\x79\xa8\x02\x93\x53\x4d\xfb\xfd\x18\x44\x0c\x9a\xfe\xb2\xe0\x77\x98\xfc\x62\x36\x86\xad\x44\xf2\x90\xbe\xb0\xb3\xfc\x95\xb0\xb7\xfb\x2c\x7d\x81\xfe\x6c\xb4\x03\x85\xc5\x14\x6e\x18\x2c\x89\x35\x91\xdf\x87\x55\x48\xf6\xa4\x1b\xa3\xe4\x56\x13\xb0\x2b\x1d\x47\x86\xfa\xce\x2d\x7e\x84\x28\x39\x87\x0e\xbb\xb3\xf2\x96\xc5\x15\x25\x56\x59\x69\x00\x83\x9a\xd7\xf9\x5c\x42\x8e\x03\x18\x06\xc1\xd1\x8b\xa6\x81\x5c\x6c\x34\x1a\xc7\x20\x53\x28\xbd\x96\xb3\xba\xa8\x75\x7e\xed\x0b\x53\xef\x66\xb8\x24\x1b\xcc\x16\x08\x24\xe6\xe6\x9b\x92\xe7\x1b\x8c\x98\x0e\xf9\x15\xca\xaa\x96\x21\xd3\xb5\x3f\xc0\xac\xee\x30\xa7\xe6\xad\xfc\xd0\x96\x5c\xb4\xf6\x89\xb5\x57\x8a\x39\x8a\x17\x4c\xf3\xb1\xec\xa0\x01\xdf\x2b\xad\x97\xcb\x41\x0a\x80\x2b\xdc\xda\xc5\x25\x99\xd6\x99\xd0\x49\x65\xb8\xc9\x8f\xc4\x55\x50\xd0\x99\x37\x58\xfb\x3b\xc6\x9a\x15\x82\x32\xe6\xaa\x4a\xac\xd6\xa0\x0d\x81\x87\x15\x29\x90\xac\xf6\xef\x66\xfb\xb1\x76\xe6\x56\x3b\xc9\xcf\x36\xea\x7c\xfa\xf4\xa8\xc6\x13\x53\x2d\x5d\x0c\xdc\x39\x92\xe9\x7e\xbd\x7d\x51\xec\x84\xfb\x09\xb4\xa3\xbb\x93\x18\xae\x02\x27\x28\x19\x5d\x12\x23\x56\xcd\x65\x80\x39\xef\x16\xb9\x50\x4c\x74\x83\x34\xec\xbc\x21\xfe\xd4\xf2\xd9\xdd\x4d\x1b\xc5\xef\x17\x69\x18\xd7\x0c\xe4\x2c\xb9\x6d\xa2\xb0\x27\x26\x1a\xad\xa6\x98\xed\x1a\x1d\xa2\x20\x68\x72\xbf\xb4\xea\xae\x30\x70\xf8\x4a\xcc\xe5\x95\x6a\x91\x3b\xa8\x9a\x94\x0d\x94\x55\xe4\x66\xdc\x9c\xac\x78\x8f\x00\x73\x5f\x97\xd0\x6f\xed\x03\x2f\x1b\xed\x19\x6a\x79\x47\xc0\x31\xe2\x6e\x31\xa3\x25\x41\x2d\xd9\x21\x6a\xb5\xe3\x8a\x57\x35\x7a\x91\x47\x62\x51\xe7\x9e\x4e\xc4\x29\xd0\xe0\xa4\xf7\xbe\xc2\xf7\x48\x1a\x85\xa9\x72\x94\x27\xa7\xae\x9b\x79\x72\x1d\xf1\x82\x52\xe8\x35\x25\x17\x74\x70\x98\x45\x8b\x41\x2a\xb7\xc6\xce\x25\xec\xa7\x3a\xa3\xa4\xad\x12\x72\xf5\xc0\x86\xb2\xbd\x8d\x55\xf1\x57\xe0\xde\x09\x7b\xb7\xb9\x5b\x37\xa7\xaa\x7f\xed\xdc\x5c\x91\x67\xca\xc7\x77\x7c\x39\x36\x05\x1c\xc5\x35\x51\x47\xa7\x6c\x5c\x3b\xbf\x09\xde\x6f\xf6\x42\x0a\xaf\xa0\x86\x57\x61\x83\x83\xe2\x39\x12\xfa\x34\x7f\xef\x32\x14\x5b\x05\xef\x2d\x5b\xa8\x4f\x40\x0a\x38\x5c\x3b\xcc\xb2\x00\x6d\x9e\xdc\x4d\x7e\x1f\xf8\x99\x4d\x70\x93\x76\x0d\xc3\xdb\x81\xf9\x35\xb9\x77\x2c\x0f\x43\xe0\xdf\x29\xe6\x66\xc5\xb0\x04\x5e\x5f\xc8\x3c\x27\x0c\x05\xeb\xa0\x0e\xe8\x83\x64\x65\x21\x94\x1a\x31\xbd\x96\xfd\x38\x89\x0e\x81\x27\xf6\x9c\x45\xae\xdf\x6e\x91\x63\x4c\x58\x5e\x55\x7c\xb6\x24\x75\xa2\xcb\xb6\x24\x03\xc1\xde\xfd\xad\x13\xf5\x32\x75\x6a\x9d\x9d\xee\x86\x7d\x0b\xd9\x9d\xa7\xe2\x2a\x50\xff\x9a\x14\x1c\x09\x70\x70\xb0\xed\xad\x71\xad\xb6\x76\xee\x8b\x0f\x7c\xfc\x87\xe0\x03\xbb\xde\xef\xa7\xac\x0f\x1b\xd9\xbc\x2f\x1e\x07\x40\x08\x47\x87\xf5\x93\x20\x84\x9d\x4e\xf1\xfe\x8f\x87\x10\x8e\x7a\x7b\x6f\x08\xe1\xe3\x2e\x08\xe1\x71\xad\xba\x80\x83\xcd\x22\xdf\x17\x2e\x38\xea\xdd\x2d\x70\xc1\xb0\x38\x10\x1e\x71\x05\xc5\x74\xeb\x45\x7e\x00\x8b\xc4\xc0\x99\x4b\x20\xda\x14\x15\xdd\xc6\xd3\x62\x81\x9c\xc1\xe2\xc8\x8c\x12\x80\xa2\x16\x02\x72\x00\x2a\x83\xfc\xbd\x71\x45\xc5\xbd\x2b\x19\x76\x92\x86\x9c\x2e\x05\x38\x21\x40\x35\xb5\xfa\x92\x2e\xbc\x86\x68\x09\xe6\xcc\x29\x49\xb6\xe0\xff\xa2\xea\x65\x2d\x12\xc4\xde\x1e\x9f\x1d\x43\xbe\xb2\xcb\x00\x51\x73\x48\x52\xca\xaf\x99\x96\x2b\x69\x76\x20\xb6\x65\xd9\xee\x3c\xac\xda\x75\xf8\x72\x9b\x27\x51\xc1\x53\x21\x80\xb8\x7d\x02\xf5\x32\xdd\x56\xcc\x7c\xaa\x64\x54\xb2\x09\x7b\x38\xd0\xf3\x60\xac\x1b\x60\xaa\x5d\xe1\xcc\x66\x45\x50\xb0\xf6\x1c\xa4\x6c\xfb\x48\x12\x28\xb9\xba\x3d\xac\x93\xb4\xab\x07\x42\x15\xcc\x36\x71\x93\x03\x88\x1c\xd9\x18\xcc\x37\x8f\xaf\xb4\xc8\x2f\x85\x86\xcc\x05\x21\x56\xe8\x81\x9e\x8a\x76\xc6\x4b\xb4\xa7\x81\x17\xff\x8b\xd4\x03\x2e\x8c\xd8\xf0\xc8\xb1\xee\xc2\x96\x3f\x18\x7e\xd7\x1f\xf5\x0f\xd9\xc1\xf0\x30\x46\x95\x38\x3f\x3d\xec\x8f\xb0\xce\xdf\x56\xdf\x02\x10\x01\xc4\x2f\x2c\xc4\xc4\xeb\xde\x78\x30\x4e\xee\xc5\xe7\x1b\x81\xc0\x45\xe8\x13\xb6\x15\x00\x5d\xe8\x4d\x06\xc3\xd3\x88\xd1\x77\xf2\xb6\x37\x01\x54\x81\x66\x97\x8f\x46\x7d\xc0\x24\x38\xec\x1f\xf5\x0f\x26\xe3\x24\x00\xa6\x38\xee\x27\xec\x68\x30\xd9\x0c\x47\x31\x1c\xb1\xd3\xe1\xe9\xee\xe0\xf4\x68\x34\x38\x7d\x33\x38\x7d\x93\xc2\x2b\xfa\xa7\x93\xc1\xa8\xcf\x46\x83\xf1\xb7\xac\x37\x66\x93\x21\x7c\xfa\xbf\xce\x7b\x0e\xe8\xe2\xac\x3f\x3a\x1a\x8e\x4e\x7a\x80\x9f\x70\xd4\xd9\x2f\x33\x1e\xf6\x7e\x78\x9e\xb2\xf1\xdb\xe1\xf9\x31\x82\x71\x44\x0f\x99\xc9\xee\x53\xbf\x07\xdf\xf5\x2d\xe4\xc2\xa8\x3f\x3e\x03\x2c\x8b\xf7\xc3\x73\xb6\x7d\x3a\x9c\x10\x59\xf0\x00\xf1\x2a\x10\x22\xbb\x0f\xf0\x18\x40\x4e\x0c\xd3\x1b\x00\x65\xec\xb0\xde\x78\x7c\x7e\xd2\xa7\x5e\x8d\x27\x76\x3d\x4e\xfb\x07\xfd\xf1\xb8\x37\x7a\x4f\x48\x15\x30\xed\xa3\xfe\x59\x6f\x40\x58\x1b\xa3\x91\xe9\xc9\xf0\x34\xc5\x85\xef\xde\x37\x80\x9f\x81\xd0\x17\x63\xb3\x21\xcc\xa2\x22\x94\x86\x99\x60\x87\x0e\x41\xbb\x26\x65\xa7\x43\x8b\x1a\xd1\x9a\x80\xc1\x98\xa0\x3e\x06\xdf\xf7\x0f\xd9\xdb\xfe\xa8\x8f\xdb\xae\xff\x97\x83\xfe\xd9\x24\xdc\x83\xbe\x2b\xb0\x6d\xbf\x4c\xd9\xa4\x3f\x3a\x19\x9c\xc2\x3e\xb1\xc2\x1b\xca\x29\x27\x6d\x7b\xb8\x93\xc2\x17\xef\x00\xb8\xc1\x8d\x38\x90\x0a\xcc\x99\xba\x2a\x56\xbc\x22\xb4\x09\xf2\xe5\xcc\x21\xb8\x16\xeb\xe4\x28\x41\xb0\x0c\x12\xde\xe2\x1e\x32\xc6\x05\xdc\x8b\xd3\x12\x5c\xe8\xe6\x71\xa9\xd8\xb3\xa7\x2c\x33\x37\x70\x31\x67\x53\x31\x2b\x20\x20\xc3\x31\x7f\x18\xe5\x08\x3e\x8e\xa0\x40\x3e\x0b\x56\x77\x79\x33\x82\x18\x0c\x46\x41\xf3\x6b\x37\x34\x94\x1c\xba\x2e\x2f\xcd\xf5\x65\xad\xde\x28\xa9\x39\x34\xc0\xcf\xca\xe2\x52\x6a\x9f\xc2\x95\x90\x31\x06\x48\x98\xe8\x8a\x0f\x73\x37\xa4\xa2\x5c\x45\x36\x15\xd7\x05\x4d\xee\x0d\x2f\x88\xbb\xe3\xd7\x69\xdf\x5d\xa9\x98\xd1\x51\x19\x21\x5d\x59\xa7\xe7\x14\x0a\xc7\x04\x70\x1f\x82\x9a\x03\x1a\x75\x98\x05\x48\x61\xd0\x6d\xc8\x6c\xc6\xaa\x6d\x31\xcb\x79\x09\xd4\xb8\xc6\x9e\x01\xdc\x4c\xc6\x31\x9a\xbb\xe3\x4a\xbc\xba\xed\xf6\x38\xcf\x74\xa3\x35\x1d\x19\xd2\xd4\x20\x04\x56\x61\x93\x18\x13\x03\x8d\xce\x99\xf5\xdc\x36\xc8\xf5\xb7\xce\x40\x5f\x93\x6b\xae\xaa\xad\x1d\x63\x5c\x88\x85\x75\x09\x36\x8a\x48\xa0\xa1\xe0\xf1\xc7\xdd\xe9\xa9\xdd\xd9\x0b\x6e\xa6\xc2\xaa\x45\x0a\xa9\x84\xb5\xbd\x1b\xa2\xe2\xc1\x6b\x4d\xc7\xdf\x5b\x1e\xd2\x38\x38\x4e\xda\xf3\x7e\xba\xdf\xbd\xe6\x09\xab\xd7\x85\x62\x2f\x69\xdb\xd3\x75\x07\xb7\x6c\xf4\x02\x77\xf4\xd6\x65\x01\x06\xac\xbc\x14\xf9\xb5\x23\xf6\x97\x73\x7b\x80\x6c\x4b\x18\xed\x85\x60\xeb\x1a\xae\x47\x6a\xda\xf4\x13\xd3\xa8\x5e\xb1\x6d\xb9\x43\x1e\x17\x89\x60\x85\xe4\x16\x5c\xf3\xeb\xe8\xed\x9c\xad\xea\xaa\xc6\xea\x7b\xf3\x38\x32\xa1\xdb\xb0\xa6\xb0\xa9\xf4\xd6\x30\x2f\xd9\x9a\x6b\x24\x49\xa7\x4c\x40\x02\xe4\xea\x4e\xbd\x6c\xce\x26\x96\x5b\x49\x89\x05\x35\x59\xc9\xaf\xac\x66\xe6\x76\x3e\x6e\xeb\xa6\x3d\xbf\x21\x95\xd4\x6d\xc2\xe6\x8b\xe0\x70\x35\xa6\xcd\x4d\x54\x02\x26\x64\x6b\x88\x00\x79\xc3\xaf\xf1\xd8\x94\x25\xb7\x07\xcd\xc2\x6f\xc5\x13\x95\xe1\xea\x06\xb3\x4b\x3e\x1c\x30\x49\x84\x43\x6e\x68\x0d\x8d\xd4\x5a\x3b\x01\xc0\x71\xdd\x95\x9f\x71\xef\x4d\x18\x4b\xee\x40\xa2\x57\x64\x95\xaf\x65\x19\x15\x76\xe0\xc4\xd8\xdd\xb3\x16\xa5\x2c\x32\x0b\x14\x66\xac\xc3\x69\x71\x29\x1a\x41\xf9\x90\x54\x3b\x61\x4b\x5e\x66\xf8\x2f\x57\x01\x92\x84\xd6\xca\xdd\xce\xf0\xa6\x14\xa4\xdb\x0e\x71\x63\xca\x68\x8e\xba\xce\x70\x7b\xde\x70\x2c\x51\x06\x7a\x29\x2e\x8b\x0b\x91\x05\x99\xe8\xdc\x59\xc3\x90\x80\x85\x32\x0e\x93\xd0\xa9\xbc\x2a\x4b\x98\x2e\xf2\x2c\x64\x47\x06\xee\x77\xb6\xe4\x19\x3d\x75\x43\x4e\x72\xb8\x5f\xdd\xbd\xf0\xcc\xdd\x0b\x78\x01\xdc\x28\xfd\xed\xf6\x8f\x4e\x74\x28\x54\xff\x00\x31\x4a\xd1\x13\xac\x03\xb0\x3b\xba\x14\xba\xc8\x2f\x45\xe6\xa3\xd0\xd3\x6b\x1f\x1a\x28\x99\x16\x55\x85\x19\x11\x3b\x84\xbd\x42\x87\x9a\x2e\x3f\xda\x95\x5d\x23\xf5\x07\x88\xd6\x1e\xfd\x96\xee\xf8\x5e\xf2\xbc\x16\x0d\x3b\xe7\x66\x91\xbe\x31\xd1\x89\xee\xea\xa9\x80\x04\x1a\x73\xb8\x91\x99\xbb\xa8\xa1\x53\x2c\x13\x78\xaa\x5c\x3e\xee\x0a\xbe\x29\x4a\xdf\x09\x9c\x27\x14\x22\x45\x19\x51\x52\xc3\xf2\x82\xb3\x14\xcf\xe3\xa5\x65\x66\x0d\x94\x87\x46\xd7\xbe\xc4\xae\x7d\x69\x4e\x37\xa6\x64\x98\xfe\x09\x04\xc2\xf4\x16\x23\x08\x24\xf4\xe1\x86\xfa\x80\xdd\x93\x96\x2e\xbe\x14\x5a\xe4\xb9\x28\xf5\x0e\xa9\x4f\x3e\xa4\x77\xc9\x73\x99\x05\x3a\x14\xb9\xfd\xc9\xd8\x0d\x5a\x0a\x14\x47\xbf\x8e\xc1\x00\x62\xe5\x2b\xf8\x06\xa6\xe0\xab\x34\xb0\x6d\x22\x20\x37\xf8\x1a\xb5\xdd\xd3\x21\x3b\x18\x8c\x0e\xce\x4f\xc6\x13\x63\x5c\x8c\xc1\xda\x70\x5f\xa1\x3b\x13\xa1\xe0\x3c\xfa\xdb\x66\x6c\xb7\x9d\x24\xc0\x85\x0b\x71\xde\x12\x42\xdb\x7b\x3f\x3c\x4f\xba\xcd\x8b\xa4\xdb\xb8\x48\x98\x83\xde\x1b\xdb\xcf\xcc\x58\x42\xbd\xde\x3d\x33\x3e\x3f\x33\x76\xde\xc8\x2a\xff\x16\x04\x0e\x2c\xb1\xfe\x38\x09\x10\xfd\x26\x43\x78\xe2\xac\x3f\x1a\x0f\x4f\x1d\xbe\x9f\xc7\xf5\x73\x58\x7e\x21\xc0\xdf\x46\x30\x3f\x6b\x6c\xbc\xed\x99\xa1\x03\x40\xde\x8d\x76\xa6\xfd\x9d\x79\xaf\xc5\xee\x7b\x33\x1c\x1e\xbe\x1b\x1c\x1f\x27\xec\xdd\x70\xf4\x2d\x1b\x4f\x86\x67\x67\xbd\x37\x7d\x33\xa3\x27\x67\xe7\xa6\xd1\xa3\xde\xe0\xf8\x7c\x04\x56\xe4\x49\xef\xf8\xe8\xfc\xf4\x00\x5b\xa3\xce\x03\x00\xe3\xf1\xb1\x9b\xc3\x13\x63\x98\x46\xbd\xc4\x97\x99\x89\xb0\x08\x7a\x6e\x7a\xde\x5b\x0e\xd6\xde\x77\x7d\xf6\xba\x6f\xbe\x3d\x35\x16\xe7\x5d\xd0\xf5\xc6\xa9\x35\xc1\x3a\x77\x1b\xb5\x6c\x0c\xcb\xde\xd9\xd9\xf1\x7b\x33\xf7\xfe\x4b\x33\x05\x87\xfd\xde\xe4\x2d\x20\x16\xc2\x72\xf4\x8e\xd9\xe0\xf4\x9b\xf3\x11\x98\xa6\xe7\xc7\x13\xb3\xc7\x8e\x46\xc3\x93\xa0\xb7\x8f\xc7\x21\xa2\x20\x19\xcc\xfd\xbf\x4c\xfa\xa7\xf8\x92\xc1\x01\xac\xf2\x71\xef\x9d\xb1\x7a\xdf\x0e\x5e\x0f\x26\x63\xfc\xb9\xef\x64\xca\xc6\xc3\x93\x3e\xfb\xe6\x7c\x34\x18\x1f\x0e\x60\x2e\xc7\xec\x70\x88\x1d\x3d\x3e\x1e\xbe\xa3\x46\x0f\x8e\xcf\xc7\x30\xa6\x51\x63\x84\x7e\x6b\x6c\xdc\x19\x09\x1b\x0f\x71\x72\x7c\x3b\x66\x9d\x82\x86\x4e\x7a\xef\xe3\xb9\x31\x36\x3c\xc0\x8d\x3d\x4d\xd9\x79\x3a\x4e\xd9\x1b\xb3\xd7\x4f\x01\x09\xb2\x6f\x4e\xe7\xb8\x3f\x1a\xa7\x16\xff\xb4\x15\xbc\x67\x5b\x01\x26\xb5\xac\xc4\x2a\xd9\x42\xfc\x23\x8e\xea\x2f\xb3\x00\x01\xe8\x04\x7a\xfe\x25\x3b\x48\x8f\xd2\x51\x6a\x44\xf3\xd3\x3d\xb6\x3d\x9c\x55\x29\xa0\x7a\xef\x24\x96\x20\x89\x4a\x02\xc3\x86\x5b\xf0\x2c\x44\xfb\x70\xd3\x23\x0d\x4c\x0e\xf0\xf0\x59\xdc\x66\xf2\xa5\x96\xc2\xa1\x2e\xfb\x8e\xed\xed\xa7\xfb\x7b\xfb\x6c\x7b\x2c\xd6\xb6\x6b\x90\x81\x67\xba\x86\x79\xa7\xd5\xb2\xfd\xb8\xe9\x4e\x30\xb8\xfd\x2f\xd2\x2f\xf6\x9f\xee\xef\xee\xb1\x6a\x59\x16\xf5\x62\xe9\x3f\x7a\xce\xb6\xbf\xa9\x95\xb0\x83\x36\x32\x15\xe7\x1d\xfc\x9e\x70\xbb\xf4\x55\xc6\xce\xb5\x30\xb2\x1d\xc1\x56\xba\xc2\x8d\xca\x68\x82\x90\x9f\xd9\x8a\x44\x07\x00\x46\x7b\x7b\x29\x3b\x19\x8c\x0f\xfa\xc7\xc7\xbd\xd3\xfe\xf0\x7c\xdc\x0e\x83\x44\x19\x85\x02\x1d\x01\xa2\x0a\xae\x1e\xb3\x30\x33\x51\xc2\xdd\x68\x21\x04\x56\x90\x19\xcd\xb0\x52\x11\xf4\x1a\x44\x2c\x22\x83\xbb\x03\xc8\x82\x2d\x45\x6e\x3d\x7b\xb5\x12\x6a\x5e\x94\x33\x81\xc5\x0d\xb0\x26\xfe\xb7\xee\xaa\x2e\xc5\xbc\x28\x57\xb6\x88\x29\x0e\x41\x45\x49\x99\xd6\x55\x1a\xb4\xda\xf0\x95\xb8\x36\x43\xf7\xf2\x01\xcf\xe5\xbc\x28\x95\xe4\x2c\xe7\x57\xbe\x07\x3a\x74\xe5\x06\xef\x0c\x9c\xef\x39\xbf\x4a\x8c\xfd\xc6\xd5\xb5\xcb\x6d\xd0\xde\x79\xbb\x03\x79\x99\x74\x5b\x4b\xcc\x6a\x9c\xe7\x72\x56\xed\x16\xf3\xdd\xf8\x5d\x29\x7b\xd7\xb0\x88\x32\xa9\xd7\x50\xf8\xee\xb2\x43\x5c\xe9\x47\xa1\x6c\xd6\x34\x1c\xbe\x99\xac\xe4\x07\xa1\x00\x5b\x04\x2e\x74\x8b\xf7\x31\x5b\xf2\xb2\x82\x1d\x83\x41\x39\xb3\x77\xc9\x56\xcf\x0a\x36\xad\xb5\x54\x60\x80\xa2\xbe\x72\xae\x20\x94\x37\xae\x10\xbe\x6f\xce\x7a\x2b\x51\xca\x19\x4f\x28\x2c\xef\xcc\x9c\x38\x0b\xa5\x6b\x7a\x23\x88\x09\xc1\x7e\xaa\x4b\xa9\x33\x39\x0b\x6d\x93\x23\x91\x41\xee\xcb\x41\x51\x07\x10\xe5\xa7\x66\xe7\x8a\x52\x51\x42\x14\x86\x8f\xfc\x02\x51\xfd\xf2\xa5\x50\xb5\x60\x08\xb3\x22\x15\x1b\x73\x55\x71\x76\x90\xf3\x92\x9b\xe6\x20\x19\xab\xf5\x1b\x50\x1e\x0b\xc0\x59\xc0\xa9\x6b\x56\xb0\xcc\x0a\x5d\xe9\xdb\xe0\x8c\x66\xa6\xb7\xf8\x28\x69\x5c\x4e\x4d\xe5\x55\x55\x94\x4a\x5c\xeb\xc7\x6c\x2e\x04\x7e\x2d\x7e\x5e\x83\xb6\x4a\xfc\xf6\xcd\xb0\xa4\x9b\xf3\x53\xb2\x1e\x0e\x0a\x75\x89\xb0\xd8\xac\x50\xa8\xc7\xf3\x59\xa5\x5d\x68\x7e\xa0\x2a\x51\xa2\xba\xc5\x73\x36\xe6\x98\xb9\xfa\xa6\x28\x32\x28\x0e\x10\x3f\x03\x48\x4e\x7e\x4d\xdb\x4e\x64\x58\xfe\x65\xb6\x5a\x1c\xf0\xc6\x0d\xe5\x76\xac\xcf\xa7\xe1\x6a\x51\x73\xcc\x8a\xe6\x1e\x51\xc5\x2d\xac\x11\xce\x55\x59\x1b\xe3\x91\x2c\x13\xb0\x9e\x4a\xf4\x58\x78\x97\xbe\xa3\x11\x68\x05\xa0\xf6\xf6\x53\xf0\xfe\x0e\x4f\xdd\xcd\x6e\xae\x63\xf0\x7c\xa2\x58\xea\x69\x36\x15\xd5\x95\xd1\x5a\xbb\x73\x47\x1a\xbe\x02\x0b\x20\xe0\x4e\x44\x6b\x65\xb1\xd0\x14\xb2\x2c\xf8\x8a\x83\xb5\x53\x4a\x2c\x40\xdf\x54\x1c\x63\x16\x9e\xb0\xb8\xea\x4a\xe6\xf2\x83\x5b\xb6\x28\x3d\xaa\x95\xc6\x01\x76\x9d\x4d\x84\x41\x5c\x3e\xb3\xfb\xba\x07\x12\x0e\x82\x8e\xbc\xcd\x01\xa1\xc2\x2b\x1a\x08\xe5\x4c\x42\x92\x99\xf8\xdf\xb5\xc4\xc4\x21\x28\xe9\x4f\xd9\x69\x51\x41\x28\x96\x3c\xb5\x12\x8b\x48\x54\x86\xc7\xde\x2d\x9d\x0f\xaa\xc0\x22\x4a\x08\xd6\x23\x76\x5d\xc0\xf8\xe3\xb2\x6f\x70\xb1\x9e\xa5\xec\xc4\x68\x43\x67\xc7\xfd\x5d\xf2\x76\xa3\xfe\x8b\x09\x1e\xad\x51\x41\xfa\x99\xd0\x72\x81\xfe\xae\xa0\xac\xbc\xe5\xe0\xe5\x9a\xfd\xe7\x49\x9d\x57\x72\x9d\x8b\x5d\x9a\xc2\xec\x3f\xd3\xae\x0f\x1d\xb8\x17\xed\xd2\xf6\x7b\x11\xf4\x5f\x43\x14\xb2\x2a\x68\xc9\x6e\xe9\x00\xae\x60\x90\xd3\x66\x9f\x82\xa4\x30\x85\xc1\x51\x6b\x6f\x7a\x31\xef\xfd\x27\x1b\xd3\x92\x2c\x9d\x42\x2b\x25\x23\x48\x7f\xf6\x81\xb0\xdd\x76\x38\x8e\x12\xda\x11\x42\x3a\x04\xdc\x83\xfd\x06\xed\xf2\xb2\x25\x66\x3b\xda\x09\xd0\x64\xd1\xeb\x6b\x23\x8d\x5f\xbb\x80\xad\x39\xae\x88\xba\x64\x9b\xa6\x5b\x6f\x43\x56\x9e\xf3\xab\xf7\xa2\xca\xdd\xe0\x8a\x8f\xd8\x1c\x03\xd6\x25\x5d\xab\x74\x56\xac\x9e\xc0\xa8\xe2\x00\xa2\xd4\xec\x6f\xcd\xbf\x4d\x20\x48\x9d\xa8\x25\x71\x03\x29\x3b\xb3\x2b\x1f\x20\x68\xe0\x77\x54\xbe\x10\xf0\xc9\x04\x3f\xeb\xe5\x39\x1b\xe1\x01\x1f\x39\xc2\x98\xe0\x98\x6e\xeb\x9d\x57\xed\x9e\x76\xfe\xa5\x8f\x7a\x7e\x1f\x19\x91\x52\x6d\x5c\x4b\x2a\xd8\xae\x75\x10\xb7\x8f\x72\x15\x04\xbe\xd3\xc7\x98\xcd\x47\xff\xf9\xd7\xbf\xfd\xed\x6f\x3f\xd8\x89\xff\xcf\x9d\xc4\x6b\x0a\x80\x08\x0b\xbe\x4a\xaf\xcc\x14\x73\xf6\x57\xec\xd9\x0f\x51\x02\x58\xa0\xce\x04\x14\xd5\xa8\x53\xa2\x87\xd0\xd2\x0e\x5c\x49\xbd\x24\x6a\x98\xe2\xca\xfa\x85\xaf\x5b\xc1\x68\x3b\xaa\xcd\x35\xe7\x02\x7b\xf2\x43\x24\x39\x89\x1f\x05\x1b\x07\x15\x4a\xdb\x1c\x8c\xcd\xef\xf0\xcd\x8f\xcf\x8e\x13\xcf\xda\x0d\xbf\xc8\xc4\x0c\x55\xc9\xe9\x35\xe1\x58\x92\x5b\x27\x98\x15\xa4\xcf\xc0\xab\x7c\x9d\x73\x24\xd5\x58\xf9\xdd\x4e\xbe\x53\x00\x55\x02\xbf\x67\xf0\xdb\x10\xea\xd1\x0e\xea\x87\x28\xf1\xd3\xcc\x1a\x65\x0b\x10\x52\x50\xd7\xeb\x93\x28\xe3\xc9\x6c\x86\xbb\x0c\x3a\x80\xf2\x1b\x9f\x1d\x5b\x6f\x74\xa3\x0f\x7f\x3d\x1d\x4e\xfa\xaf\xe0\x20\x41\x1d\x9f\x6d\xc7\x4b\x1f\x4c\x18\x86\xfc\x00\x9d\x9b\x9d\x9f\x5f\xfb\x44\x01\xff\x1b\xd1\xe4\xb5\x69\x16\xb9\xe8\xce\x73\x89\xa9\x35\x44\x5b\x63\xb1\xdd\x36\xf4\xa4\xe4\x31\x7f\x36\x16\x1e\x7a\xf6\xa1\xe6\x91\x6f\x54\xa0\xa3\x24\x8f\xeb\x7c\xff\xec\xb8\xf4\xe9\x93\xc3\xdd\xa3\xf1\x1f\x8b\x00\x7f\x33\xfe\xfb\xb3\x97\x2f\x5e\x3e\x6f\xf2\xbf\x3e\x7d\xfe\xc5\x03\xfe\xfb\xe7\xf8\x3b\x14\x75\xa5\x67\xc6\x1a\x2a\x85\x34\x3b\x9a\x9c\x16\xc7\xc6\x9e\xfb\xf0\x68\x7b\xb6\xc3\x4e\xa4\x02\xb3\x4d\xd6\x2b\x36\xff\xf8\x6b\xc9\xde\x49\xad\x85\xd2\xb3\x25\x9f\x83\xa7\x9b\x1d\x15\xa5\x9e\x2d\x6b\xb5\x30\xd6\x53\x56\x2e\x85\x54\xbb\xef\x84\xae\xe6\x3c\x17\x8a\xed\x3f\x7d\xfa\x9c\xf5\x4b\x5d\x89\x3c\xaf\xd8\x65\xa1\x58\xef\x67\x91\xb3\x13\x51\x7d\x58\x08\xa8\x09\x66\x13\x99\xe7\xec\x1b\x2e\x16\xa2\x4c\xd8\x80\x74\x43\x7c\xd9\x48\xcc\x96\x95\x9e\x97\x7c\x21\x14\x33\x52\x07\x3a\x0a\x6e\x6c\x60\x0f\xb4\x87\xd0\xf5\x7c\x97\x6d\x87\x57\xbe\x9c\x97\x85\xd6\x69\x26\xd8\x0e\x4b\x1f\x9d\x95\x1f\x7f\xe1\xab\xa9\xc8\x1f\x8d\x3d\x66\x67\xc5\x56\x62\x59\x32\x9e\x6b\x66\xd4\xd7\x77\xb2\xac\x70\x70\x7a\x51\x57\x29\x1b\x4b\x7c\x28\x93\x46\x22\xcc\x96\x4a\xc2\x84\xbd\x29\x6b\x95\xe5\xc6\x52\x31\xbd\x1a\xf8\xba\x4a\xbd\x00\x27\x38\x36\x91\xb2\x43\x69\x26\xd7\x3e\x37\x11\x32\x5f\xf2\x29\xfe\x47\x2f\xcf\x17\x62\x25\xa4\x5a\x0a\x48\x53\x36\x32\x5a\x5f\x09\x33\xd2\x4b\xa8\x97\xd2\x85\x11\xb4\xa2\x64\xaf\x45\x26\xea\xaa\x56\x8b\x94\xbd\x15\xe5\xc5\xc7\xbf\xaf\x56\xb9\xb9\x66\x73\x58\x26\x29\xca\x4a\xb0\x33\xaa\x42\x15\xec\x4a\x94\x99\x50\x4c\xd5\x25\x93\x2b\x36\x44\x15\xcd\x56\x0f\x54\xa5\x14\x53\xa1\x12\xe8\xc1\x69\x5d\x7d\x10\x25\xcb\x78\x39\x67\x19\xd7\xae\x0d\x76\x65\x8c\x63\xf3\xf8\xc7\x5f\x4c\x17\x14\x53\xc5\x6c\xc9\xae\x84\xac\x44\xb9\x30\xbf\x4f\xd9\x21\xd7\xb4\x4d\x56\x45\x26\xf2\x3c\x5c\x1d\x37\xbb\xdb\xfa\x5a\x15\xea\x7a\x85\x64\xa0\xcd\xc5\xda\xda\x61\x0b\x71\xf5\xf1\x97\x65\x59\xb1\xc1\x52\x99\x15\xe6\x0b\x18\x7f\xbd\x9a\x73\xb3\xcb\x32\xdc\x99\x66\x82\x84\x32\xa3\x39\x5f\x2d\xb8\x5a\xb0\x95\x34\x93\xb5\x72\x1d\xc6\x79\xbe\x79\x37\xb3\x79\x91\x2f\x60\x1d\xb5\x58\x45\x5d\xc7\x45\x6e\x75\x45\xe3\xee\x4b\xe2\xa9\x91\x61\xef\x4a\xf6\x4e\x48\x2d\xd8\x87\x9a\x29\x33\x97\x2a\x65\x7d\x0d\x4b\x89\x8d\x2c\x84\xae\x78\x55\x89\x66\x23\xca\xd8\x8b\x83\x65\x29\x14\xfb\xae\xc0\xb3\x51\x2b\x33\xf0\x0f\x75\x30\xeb\xa0\x50\xb9\xff\x34\x06\x6e\x91\xc1\x91\x89\x3e\x3b\x2a\xca\x15\xfd\xee\x52\x8a\x7c\xfe\xf1\x97\xbc\x92\x0b\xb3\xc4\xf8\xe1\xb4\xc4\xd9\x33\x47\xe6\xe3\xdf\xe7\x73\xa1\x2a\xd8\x3c\x1f\xea\xc5\xc7\x5f\xd4\x82\xfe\xcd\x56\x7c\xb6\x84\x75\x35\xf3\x83\x23\x77\x5b\xa9\x56\x42\x55\x0b\x91\xe3\x0f\x85\x54\x0b\xd3\x81\x7a\x55\xa5\x8f\xee\x30\xef\xa6\x0f\x52\x65\x02\xcf\x10\x9e\x68\x21\x15\xb4\x50\x23\xc4\xb1\x28\x33\xa9\x16\x1a\xd6\xf5\x6c\x6e\xde\x52\xc1\x1e\x95\x02\x96\xf9\xfb\x2b\x31\xbb\x30\xff\xa5\xe0\x53\x0e\xf4\x84\x52\xb0\xef\x65\x79\x51\xe7\x52\x94\x20\x1c\xfc\xfc\x82\x75\x8c\xed\xc2\xfc\xf9\x51\x9b\x89\x38\x2a\x4a\xa3\x03\x5f\xc9\xd9\x85\x9f\x75\x2d\x67\x4b\x51\xaa\x94\xbd\x13\x4a\xc1\x7e\x88\x16\x2c\x98\x47\x58\x83\x4d\x13\x89\xb3\x68\xfa\xa8\x14\x5b\x7d\xfc\xd5\x6c\x13\x68\xed\x27\x91\x89\x15\x9e\xba\xb8\xe1\x42\xd1\x5e\x11\xe5\xd2\x2c\x5d\x62\xe6\x57\xb0\x6f\x8b\xb5\xe9\x83\x59\x8c\xd2\x4e\xe4\x4a\x56\xb9\x14\x73\x73\x1e\xcd\xf8\xcc\xca\x7c\x5f\x2f\x4a\x39\x9f\x33\x5e\xcf\xe1\xbf\x43\x9d\x44\x94\xab\x8f\x7f\x87\x6e\xc1\xbe\x34\xad\xe2\x09\x16\x76\x8e\xd9\x54\x54\xe6\xe7\x55\xc7\x9c\x44\xf3\x99\xb2\x8f\xff\x1f\xb3\xdf\xf0\x2b\xee\x0f\x1e\xae\x91\x19\x60\x38\x23\xcd\xd9\xea\x9a\x21\x3b\x39\x70\x14\x4c\xd7\x5f\x0b\x5d\xc9\xd5\x8a\xde\x1e\x0d\xdc\xac\x36\x33\x92\x61\x2a\x14\xed\xc9\x3b\xed\x3c\x25\x57\xab\x0a\xe7\x46\x0a\x2f\x50\x15\xeb\x19\x79\xed\xc6\x63\x86\x9a\x51\x4b\x38\xb5\xa2\x2e\x8b\xf5\xc7\x5f\x24\x7e\x82\x5b\x96\x8d\x3e\xfe\x3a\xbb\x30\xfb\x24\xb8\x15\x3e\x5c\x09\xa9\xd7\x25\x9f\x2d\xe5\x02\x4f\x7b\x5e\x09\xbc\x16\x33\x6e\x76\x33\x87\x68\x35\xad\x8e\x0c\xdd\x67\xe6\xec\x93\x3c\x66\xbc\xd6\x0b\x51\xc2\xfe\xc4\x48\xbd\xf9\xdf\xff\xfb\xbf\xec\x69\x40\xbe\x22\x14\xc5\x78\xe9\xff\x0e\x8b\x0b\x1f\x58\x78\x05\x02\xf0\xb5\xd0\xb3\x65\x29\xe4\xb4\x86\x6c\x2d\xcd\x7a\xf5\x7c\xca\x6b\x38\x0e\x4f\x60\x25\x20\xf8\x5b\x95\xf5\x45\x55\xe3\x7f\xd8\x85\x94\x30\x19\xf1\x83\x47\xb5\xba\xc0\xbe\xca\xea\xe3\x2f\x55\x73\x53\x24\xac\x56\x7c\xba\x34\x2b\x2b\x17\x2c\xe3\x97\x85\x4a\x58\x31\x65\xda\xcc\xcd\x2a\xc6\xb6\x37\xcd\x2d\x68\xfe\x8d\x16\x50\x2e\x84\x2a\x56\x2b\xb3\x9c\xb2\x74\xc0\x0c\xf4\x7f\xb8\x7a\x38\xa4\x0f\x57\xb4\x08\x99\x13\xda\x66\x1b\xa0\xe2\xe0\x84\xec\x6c\x99\x17\x66\x37\x81\xc3\x41\x48\x35\xe5\x30\x1a\x7b\x4d\x0c\xd4\x92\xe7\x15\x8c\x69\xeb\xd0\x2d\x74\xf3\xb2\xc2\xd6\xb7\xd8\xf4\xc3\x55\x0a\x87\xb4\xa7\x16\x62\x5a\x54\x6c\x29\x45\xf9\xa1\xee\xec\xa4\x12\xcb\x95\x28\x5f\xb1\x6f\x44\x26\x98\xe2\xd5\xc7\x5f\x4b\x38\x70\x38\x62\xf0\x3b\x57\xa8\x30\x9c\x89\x52\x17\x56\xa6\x49\xb7\x45\xb9\x72\x33\xb1\xe4\x55\xe3\x1d\x76\xaa\xb1\x7d\x40\x25\x84\xe8\xd2\xda\x9f\x3e\xae\x41\x84\x64\x6e\x9b\x4a\x65\x14\x8c\xf2\x6e\x07\xcb\x1d\xd4\xea\x66\xb1\xb6\x10\xe6\xd8\x56\x40\x3c\x68\xf6\xb1\x6e\xf6\x34\xd0\x32\x70\xdd\x56\x5c\xcf\x96\x52\x09\x95\x0b\x3d\x85\x0c\x9e\x8f\xbf\x4e\x45\xa9\x45\xf5\xa1\x12\x78\x67\xc5\x12\x26\x6e\xef\xe3\xff\xd7\x75\xe4\x15\x3b\x05\x59\x65\xf4\x19\xae\x40\x3a\x82\x72\x64\xc6\x64\xf6\x24\x4e\xac\x50\x17\xa5\x90\x9a\xb9\x63\x84\xb2\x76\x2d\x4a\xfd\xf1\xef\x0a\x06\x81\xfb\xba\x2e\x21\x21\x5d\x18\xd1\x29\x96\x1f\xff\x5e\xca\xc5\x85\xd1\xbf\x3e\xd4\xd0\x74\xb4\x68\xb6\x71\xfc\xa9\xf9\x7a\x15\x4e\x91\x50\x6c\x52\x7e\xfc\xc5\xa8\xb1\x2b\x59\x09\xa9\xb8\x22\xb5\x69\x6a\x4c\xe4\xae\x79\x0a\xc6\xd5\x21\x15\x71\xea\xc2\x37\x18\xfd\xc2\xe8\x5c\xa8\x33\x86\x37\x9c\xd1\x43\xd4\xc5\xc7\xbf\x97\x6b\x81\x5b\x0e\x35\x01\xa3\x33\x68\x27\xe9\x60\x7f\xbc\x36\x47\xa2\x32\x27\x00\xae\xba\x15\x3b\x2c\xae\x54\x5e\x70\x30\x6b\x0f\x79\x25\x94\x12\xa0\xbb\xc4\x5d\x8d\xb6\xd3\x2b\x76\x28\x4a\x3a\x19\x52\xb0\xf3\x72\x09\x87\x10\xe6\x45\x83\x3b\x77\x01\xee\x72\x78\x18\x66\x9e\xd7\xda\x1c\x4b\x29\x3e\xfe\x37\xcd\x95\xd1\x36\x6b\xb5\xd0\x25\xea\x16\x5c\xc5\x2a\x5c\xfc\xf6\x40\x7a\xe0\xac\x80\x39\x70\x02\x86\x87\x50\xcc\xed\x2a\xa9\x42\x11\x86\xa2\xd8\x0c\xbb\x34\xc2\xd8\x98\x1c\x77\xd8\x6c\xdf\x39\x8d\x8b\x0e\x72\xbf\xc4\x8b\xb2\x56\x8b\x84\x7d\xfb\xf1\xd7\xf2\x03\xc9\x46\xf6\x5a\xf0\x72\x2a\x64\x65\x05\x6c\x20\x0c\xa3\x79\xc7\x65\x8b\x6e\xd4\xf6\x4b\xe9\x8e\xbc\x79\xd5\xe3\x25\xfe\x2e\x52\xf2\xcc\x6c\xea\xca\x5c\x4b\xa2\xf1\x7e\x73\xe3\xc0\xd2\x56\xb8\x41\x69\x0b\x4b\xb8\x73\x8c\x36\x66\xc5\xe3\x5b\xca\xb0\x6b\xf6\xae\xc8\x73\x5d\x99\x59\x91\x66\x7b\xc7\xab\x11\x7f\x80\x79\x4b\x25\x2e\x90\xd9\x1c\x7d\xa7\xd0\xfa\x0d\x13\xce\xdb\x54\x18\x5d\x99\x34\x31\xa3\xba\x6a\x0e\xf2\x0f\xa5\xb5\xd9\xa2\x25\xfb\xf8\x7f\x48\x58\xd8\x89\x1f\x84\x3c\x14\x80\x64\x9c\xd1\xa4\x28\xf6\x6d\xa1\xe6\x72\x51\x63\xee\xa1\xce\x78\xe5\x4c\x44\x2b\xdb\x77\xdf\x89\xf2\xe2\x83\xa8\x41\x2d\xd6\x05\xa8\x50\x20\x09\x6d\xe7\xa7\x42\x7d\xfc\x7b\x25\x17\xae\x57\x0a\x64\x0e\xb7\x26\x1a\x5b\x88\xa9\x51\x58\xcd\x8e\x9e\x2d\xd9\xf6\x87\xf4\x75\xca\xc6\x15\x57\x19\x2f\xb3\xdd\x6f\x81\x34\x43\x94\x3b\x38\xcb\x30\x13\x46\xe1\x2b\x57\x46\x0d\xcc\xed\xad\xf5\xf1\x57\xa3\xf1\x83\x32\x23\x57\x14\x4b\x13\x15\xe3\xd3\xd2\x5c\xd3\x25\xd3\x52\x65\xe1\xed\xbf\x47\x6a\x38\xad\xc9\xf6\xde\x0e\x2a\xa6\x1f\x7f\x2d\xe7\x64\xa1\x44\x66\x49\x87\x5d\xd0\x36\x0a\xee\x68\x11\x90\x39\x60\x5f\xbd\x7f\xc3\xab\x03\x33\x11\x74\x27\x55\xe9\xb5\x39\xe3\x42\x65\xa1\xf5\x62\x63\x01\x42\xfd\xe6\x5e\xb1\x37\xd6\xae\x02\x25\x0c\x74\x2c\xb3\xcb\xbe\x0d\xc0\x66\x63\x69\x59\x58\xeb\xdb\xdc\xb3\x52\x94\xe6\xce\x04\xf5\x8c\x14\x42\x67\x3d\xfb\x21\x3f\xc3\x21\x8b\x92\x24\xa7\x33\x5e\x44\x6c\x0f\x85\x2b\xb6\xef\xad\x17\x36\x15\x72\xe5\x34\xbc\x60\x09\x7f\x1f\x03\x43\x0b\xc9\x84\xee\x58\xf6\x22\xb2\xdc\x2b\x77\x2d\xf8\x1f\xe0\x35\x17\xce\x55\xf7\x4c\xdc\x26\x32\x1a\x56\x8e\x51\xfb\xbc\x85\xf2\xca\x51\x9d\x80\x1d\x66\xda\x58\x89\xf2\xa2\xa5\x19\x3a\x85\x33\xd0\x20\x50\x49\x22\xb5\x5d\x3b\x55\x69\x29\x95\xd1\xb6\x85\xfa\xda\x61\xc0\x7f\x6a\xdb\xa0\x8b\x44\x37\x59\xbc\x5d\x7a\xb5\xbe\xa8\xd5\xbc\x62\x60\x72\x7c\xed\x4a\xf5\x49\xfb\x40\x51\x27\x14\xeb\xaf\xd6\x73\xb3\x34\xd0\x40\x8d\xab\x75\xc5\x97\xa5\x51\x0b\xcd\xfd\xa4\xd8\x5b\xec\x74\x7b\x34\x60\x22\x48\xe1\xc4\x00\xcf\x80\x97\x86\xfd\xcf\xd0\x7d\x95\xed\xce\x75\x9e\x66\x82\xfd\x07\xb3\x9d\x78\x9e\xc2\x9b\x2f\x43\x01\xad\xd8\x44\xfc\x5c\x35\x74\x3b\x90\x6c\x1d\x7d\x22\x9f\x45\x78\xb4\x61\x4b\x4e\x85\x24\x5f\x56\x20\x69\x5b\x56\x35\x4e\x28\xec\x6d\xf7\x79\xc5\xcb\x8a\xde\xba\xeb\x9f\x81\xad\xcf\x17\x7a\x2a\x8c\x6d\x4f\x96\xa3\x5a\x88\x0f\x42\x2e\x2a\xb2\xe2\xe2\x2d\xe4\xb7\x4c\x38\x53\x89\x5f\x6d\x23\x88\x6f\x9a\xd0\x68\x9d\xe2\x27\xed\x76\xf6\x2e\x08\xd2\x6c\x50\x0f\x31\x77\x8a\x46\xe9\x53\xe1\x53\xc1\x4c\x9a\xeb\x0a\x57\xd3\x0e\xd9\xa8\x9f\x5c\x65\x15\x08\x14\x7a\xab\xd9\x29\x73\x9e\xe7\xba\x35\xca\xa6\x48\x71\x52\x54\x0a\xab\x14\x35\x26\x1a\x6f\x1f\x23\xa4\xbc\x3c\x81\xee\xbf\x0e\x27\xd3\xd9\x5e\xce\xeb\x20\x05\xfd\x54\xb6\x34\x7d\x63\x72\x69\xb1\x84\x83\xaa\x9c\xc5\xb5\xfd\x7c\xc7\x5c\x92\x46\x76\x8f\xf1\xfc\x46\x4a\x19\xfa\x22\x22\x4b\xd3\x0b\x44\x33\x7d\x0a\x6a\x97\x34\xad\x44\xe3\xc1\xf0\x22\x58\x49\x23\x30\x41\x36\xf8\xc5\x17\x1a\xc4\x52\x26\x14\x75\x1e\xdd\x3a\x27\x56\x8a\xe0\xc4\x94\x8d\x76\xbd\x7b\x8d\xd7\xf3\x45\x89\xae\x10\xef\x2b\xb0\x6a\x48\xfc\x23\x9c\x16\xe7\x8f\x0b\x85\xf6\x33\xab\xad\x6d\x12\xde\xb1\x38\x75\xd7\x58\x20\xd3\xbf\xeb\xbc\xe6\xe2\x35\xb5\xab\x6e\xe6\xd9\xd8\x32\xb4\xd3\xc0\x40\xf3\x8b\xba\xc1\x3e\xbb\xeb\xad\x50\x98\x5b\x45\xb3\x43\x20\x3d\x47\xeb\x30\xe8\x5a\xa0\x2d\xe8\x85\xd0\x7c\x55\x6d\xdc\xef\x42\x19\xcd\x53\xa9\x58\x07\x78\x27\xcb\x2c\xbe\xb7\xac\x65\x04\x97\x6b\x74\xb5\xa2\xb9\xd4\xbc\x56\xd8\x05\x82\x97\x88\xb2\x4a\xd8\x42\xe6\x1b\x6e\x6f\xdf\x41\xf2\xcb\x8b\x2e\x55\xa2\xa9\x82\xc7\xfb\x09\x70\x9d\x41\x1b\xf6\xe3\xd6\x90\x9c\xb8\xe2\x39\xc3\xb0\x9e\xd9\xca\xe4\xd4\x5c\x08\x65\x05\x2a\x78\xcb\xe8\xc7\x3a\xfe\x35\xc8\x2b\xec\x53\xf0\x03\xc6\xd5\x87\x1a\x4e\x57\xc2\xae\x8c\x30\x15\x1a\xf7\x73\x91\x2f\x04\x98\x82\xdf\x15\xa5\xb1\x88\x50\xa3\x15\x0a\x2f\x2e\x51\xce\x3f\xfe\x9a\xe7\x61\x65\x1a\xf0\xed\xc6\xfa\xb5\x99\x61\x3f\x6b\xe1\x15\x8d\x67\xef\x27\x71\x25\x64\x4e\x57\xfb\x42\x98\x9d\x77\x48\x3a\xf0\x65\x51\x2e\x39\xbc\x5f\x0b\x49\x67\xec\x02\x66\xf3\x75\x20\xc1\x18\xd2\x74\xe1\x42\x4d\xa0\x2d\xa1\xc8\x60\x6c\xde\x97\x46\x39\xb7\xef\xbf\x08\x16\xec\xe3\xaf\x53\xd2\xc6\x41\x07\x8c\x15\xf4\x20\x3c\x22\x94\x6d\x4c\xa8\xe8\x9d\xe6\x7a\x07\x37\x18\x4e\x62\x61\xaf\xa3\x78\x26\x74\x6b\x43\x59\x61\xd9\x21\x60\x60\x7a\x82\xfa\xa2\x7d\x9c\xdb\x96\x90\x0b\x26\x17\xbb\x02\xd3\x8a\xfb\xd2\x2c\xb7\x96\x4a\x99\xfb\xd6\x5e\x04\x34\x99\xb8\xd0\xa5\x7f\xff\xa6\x56\xc1\xc7\x95\xc0\xc4\x7c\xb8\xe2\xc0\xd5\x8a\x01\x16\xb3\x09\xcc\x62\xc0\x21\x32\x0d\x78\x53\x3a\x50\x48\xd9\x3b\xb3\x93\x73\xcd\xb6\x9a\x1d\xd9\xf2\xfb\xce\x6c\xce\x84\x91\xef\x03\xbc\xd9\xd6\x01\x54\xb2\x5e\x3d\x9f\x73\xad\xad\x34\x9d\x8a\xaa\x2c\x8c\x1c\x31\xb6\x0e\x9f\x2d\xc1\x71\x22\x52\xf6\x7d\x0d\x8b\xd2\xfd\xb5\xb1\x80\x96\x1f\xff\x5e\xda\xad\x6b\xbd\x2e\xe4\xd0\x6a\x89\x84\x60\x8f\x4a\x00\xa4\x58\xe4\x42\xce\x96\xa8\x80\x34\x1c\x8b\x8c\xec\x64\x91\xab\x84\xac\xc3\x86\x4d\x70\x07\xe1\x17\x5e\xb2\xdd\x2a\xb6\x73\xe2\x34\x84\xd5\x6e\x20\x5a\xda\x11\x16\xb6\x1b\x5b\xa8\x1b\xc4\xda\xfd\x03\x04\xda\xdd\x00\x25\x50\xda\xbf\x41\x96\xe2\x66\x06\xd5\xf6\x9b\xb3\xe3\x9d\x20\xd2\x47\x9b\xa9\x1d\xb3\x83\xfd\xba\xe1\x52\x31\xaf\x38\x3b\x66\x0b\xb4\xbc\xdd\xfd\x4b\x96\xb0\xd0\x6e\xf7\xb6\xc6\x65\x44\xfb\x56\xc0\xfe\x7f\x05\xc4\xbf\x46\xd1\x96\x4a\x09\xd7\xf2\x54\xe6\x99\xa8\x52\x76\xc8\xcd\xb9\xd5\x45\x9e\x93\x7e\x43\x4a\x58\x87\x3a\x2f\x54\x65\xde\x4e\xce\x72\x70\xcb\xe1\xe2\x34\x34\x3c\x68\x9f\x3c\x87\x56\xa1\x62\xc3\xa9\xd3\x57\xbf\xa7\xd5\x71\x4e\x87\xb0\xcb\x1b\x3b\x6c\x94\x93\x4a\x2c\x2b\xb3\xe1\xea\xd2\x88\xc1\xf0\xd4\x7c\x8f\x09\x29\xfb\x0c\xa0\x93\xe0\x17\x36\x32\xe6\xbd\xa9\x2c\xe7\x75\x25\xaa\x57\x40\x78\x18\xa1\xb9\xab\x6b\x4c\xbd\xb4\xd0\x1b\x61\x62\x25\x70\x17\x02\x0e\x4b\x82\xdf\x43\xd2\x54\x91\x0b\xcc\x00\x45\x6e\x13\x87\xa2\x81\x7c\x88\x04\xa5\xee\xf3\x62\x68\x79\x1c\x45\xaf\xf9\x0d\xf1\xf5\x24\x94\xdc\x4e\xa9\x5a\xc4\xc4\x8b\x6f\xe0\x95\xe7\xa2\xa4\x5c\xa7\x00\xfe\x5b\x0a\x7d\x2b\xad\xd9\x16\xf8\xaa\xcc\x04\x5e\xc0\x45\x38\x5d\x88\xb2\x9e\xbb\xa8\x0c\xed\xbf\xc0\x82\x99\xeb\x79\x5a\x94\x8b\x27\x36\x8f\xf1\xc9\x62\x9d\x87\xca\x67\xf7\x51\x75\x56\x6a\x70\xe9\x2b\xe7\xd1\xb8\xd7\x41\x0b\x83\x70\x0d\xfb\x30\xde\x6e\xd6\xfd\x14\x45\xba\xea\x39\x78\xf8\xf1\x56\xb3\x87\xe4\x90\x57\xf5\x0a\xf6\x85\x7b\x16\x12\xa5\x04\x06\x50\x45\xe9\xdb\x34\x17\x89\x31\x4d\x8d\x22\xc5\x72\x88\x1a\x9b\x8b\x23\x9f\x2d\x45\xf4\xa2\x28\x22\x52\xd3\x54\x66\xe0\xe6\x36\xad\x66\xde\xc8\xfd\x14\x03\x96\x9c\xef\x38\x14\xdc\xc8\xa8\x7b\x75\x07\x70\xc0\xed\x01\x73\x63\xf5\x09\x7a\xc9\x25\xf6\xc1\x5c\xd5\x1f\xea\xf9\xc7\x5f\x17\xa6\xb5\x1e\x9e\x3c\xfc\x89\x76\x07\x5e\x37\x67\x9b\xd4\x49\x68\x1d\x64\x95\x40\xd7\x02\x24\xa2\x5d\x10\x0d\x28\x42\x4b\x99\xd9\xbc\x42\xbd\x09\xd6\x18\xbd\xb1\x73\xf4\x9f\xc5\x0e\x3c\x58\xb7\x20\x8c\x61\xa4\xe3\xcd\x1b\x23\x70\xca\x6f\xbf\x88\x0d\x32\x73\x1b\xa0\xea\xac\x02\x77\x66\x10\xaa\xc6\x21\x0a\xa9\xe6\xbc\xed\xd2\x06\x1a\x91\x68\xc3\x6e\x32\x05\x8c\x0a\xc6\xfa\xe8\x42\x32\xbf\xc8\x79\xe8\x20\xde\x7e\x19\x1c\x0b\x8e\xd2\xbb\xab\xd9\x46\xa3\x22\x50\x59\xc7\xb3\x65\x5d\x7d\x80\x5e\xb9\xc4\x16\x5a\x43\xfc\xd0\xcc\x6f\x09\x3b\x23\x72\x1b\x9b\xe7\x88\x1d\x09\xe6\xf0\x8d\x98\x96\x66\xad\xb4\x91\x6e\xa2\x4c\xfc\x3d\x44\x0b\x49\x6b\x10\xbe\x0f\x26\x2e\x54\xd6\xcd\x46\x8e\x9c\x54\x1b\xe7\x45\x62\x48\xe0\x7c\x35\xe7\x90\x1b\x6f\xee\xeb\x40\x93\x44\x1d\xc7\x1c\x3d\xef\x8a\xe3\xb5\x6e\x58\x2f\xd6\xd7\x81\x71\xfd\xd0\x88\x21\x7b\xef\xf9\xad\xf6\x5e\x9c\x36\x73\xab\xef\xae\x3b\xd3\x86\xa4\x54\x47\x2e\xc0\x87\x5a\x7f\xfc\xa5\xfa\x60\x33\x2f\x30\x32\x8c\xee\x43\x33\x57\x60\x92\x2e\x44\x29\xcc\xf6\x10\xa1\x0b\xc0\x2a\x8e\x91\xb9\xd0\xe1\x0d\x8a\xbc\xf3\x81\xa7\xf9\x66\x59\x49\x12\x07\x6f\x55\x1b\x9e\xb0\xbe\x89\x60\x70\xda\xfb\x95\xec\x15\x1d\xbd\xbf\xe5\xd2\x72\x8e\xbb\x24\x50\x79\x9a\xba\x7d\xeb\x2a\x81\x0b\xa6\x88\x46\xbb\x7f\xeb\x68\x4d\x87\x50\x43\x33\xda\x1d\x6c\x45\x6f\x99\x84\x01\x11\xea\xc9\x6b\xc1\x67\xcb\xca\x6a\xc6\xff\xef\xff\xba\x45\x78\x16\xc9\x15\xd5\xf2\x96\xb5\xaf\xac\x78\x03\xdc\x3b\x41\xe4\x93\x37\xc5\xef\xbb\xfe\x19\xc7\x1d\xf0\x69\x0b\x1c\x79\xba\x3e\x87\x5b\x09\xcc\x9b\x29\xcc\x9c\x60\x7b\x30\x82\xfd\x3f\xb3\xaf\xe9\x85\x73\x8b\xea\xd9\x32\xaf\xb5\x0e\x84\xcb\x89\x6c\xba\x70\xe1\x32\xc3\xd7\x9b\x37\xff\x84\x46\xa3\x55\xd1\x31\x34\x6d\x44\xb6\x4d\x54\x30\xab\xd5\x9b\x52\xcb\x74\x59\xd1\xfb\x84\x0e\x74\x86\x6e\xa7\xe3\x66\xdb\x61\x63\xce\x44\x6e\x5d\xaf\x95\xbb\x81\xef\x14\x32\x72\xb9\x09\xd6\x77\xc1\x95\xb9\xef\xd1\xc9\xba\x10\x46\xd7\xa7\x33\xfb\x1d\x24\x97\x96\x72\x5e\xf9\xa8\xbf\xb9\x71\x17\x62\xf5\xf1\x97\x8f\xff\x1d\x98\x8b\xc5\x52\x09\xf4\x7e\x81\x84\x2a\x59\x4f\x29\xbe\x5c\x35\x93\xa8\xa6\xc2\x98\x4e\xa4\xcd\x53\x8a\x1f\x65\xf4\x55\x36\x1a\xd8\x8f\xd2\x7f\xce\x15\x01\x27\xe0\xd7\x8a\xad\x04\x14\xe1\xba\x95\x40\x7f\x72\x51\x66\x0a\xa7\x2c\x8e\xc0\x47\x6e\xa0\xd7\x62\x5e\x2f\x94\xd4\x5a\xc4\x3e\x9f\xd8\x92\x9b\xe6\x1c\x24\xe1\x87\x9a\x74\x46\xa6\x8b\x2b\xca\x1b\x09\xa2\xab\x46\x5d\x71\x62\xae\xe1\x72\x69\x05\x8a\x31\x7f\xf2\x2d\xaf\xd7\x15\x38\xe9\x59\x0f\x02\xb2\x5a\xaf\x05\x84\x96\xbf\x8e\xc5\x2c\xd7\xf6\x4d\xc2\xea\xe2\x63\x78\xce\x4c\xfe\x45\xb1\x96\x22\xf8\xc1\x33\x0c\xf2\x1e\x89\x65\x6e\xb4\x0a\xf0\x42\xc0\x4b\x83\x67\x9e\xe3\x33\x41\x64\x1b\x5b\x05\xa5\x01\xd6\x52\x2e\x8c\x5a\x52\x18\xb5\x04\xbd\x8f\x2e\xee\xad\x6c\x3a\x5c\x57\x10\xdf\x07\xea\x2e\xf2\x8f\xbf\x98\xf5\x18\x2c\x4b\x61\xcc\x42\x6b\xa7\x7d\xa8\x57\xc1\xb1\x88\xb6\x03\x81\xe5\xdf\x14\x8f\x4b\x6e\x95\xe5\x41\x00\xd4\x86\xcc\x70\x6c\x98\x1c\xda\x8e\x76\xc6\x1a\x7c\x7b\x57\xfb\x13\xea\xec\x56\x48\x9c\x9e\x6a\x5e\x7d\x60\xfb\xde\x55\x56\xa5\xac\x37\xb5\x29\xad\xdf\x0b\x59\xad\x6b\x75\x51\xd9\x7c\x65\x6f\x6b\x1b\x1d\x10\x26\xda\xa5\xe7\x49\x95\xf9\x94\x02\x23\x20\xc2\x4c\xab\x56\x2e\x51\x67\xb2\x55\xe3\xc8\xa1\xb8\xf9\xbe\x5e\x70\xb5\x88\x0e\x20\x2d\x0c\x86\xfe\x65\x57\xf3\x74\x26\xc3\x98\x84\x14\x2d\x91\x17\xa5\x5c\x75\xc6\x65\xdb\xca\x60\x26\x4b\x71\x51\x6d\x48\x91\xa2\xa4\xc8\x73\x23\xbd\x9c\x62\x6b\xba\x89\xf6\xc3\xff\x99\xe2\xcc\xd8\x9b\x81\x5e\x62\x26\xf7\x06\x09\xff\x92\xbd\x16\xc2\x5c\x93\x8d\x9f\x99\xa1\x7f\x5f\x5f\xc9\x4c\x80\x4b\xd6\x1c\xe0\x40\xf6\x43\xda\xc9\x77\xa2\xcc\x29\xe5\xc1\x6c\x61\x58\x9a\x35\xde\xf3\xd6\x1c\x6d\x8e\x0f\x6c\xa2\x20\x79\xc9\x42\x34\xe1\x4a\x06\x3d\xc1\x06\x37\xcd\x53\x28\xb4\x0f\xfd\x7c\xa2\x2d\x54\x6e\xf2\xf1\x8d\x3a\x13\x79\xe2\x94\xd6\xe8\x4e\x9f\xe6\x42\x4e\x83\x08\x7c\xad\xa6\xa2\x84\x11\x84\x33\xf8\x05\x7b\xcb\xe7\x95\x4d\xfc\x78\x83\x69\xd9\xb9\x91\xb9\xf1\x9c\x1d\x81\xd8\x33\x56\x14\x78\xe2\xc9\x4e\x8e\xbb\xce\x96\x7c\x1e\x6d\x12\x17\xf6\x53\x75\xe9\x2c\x49\x2d\x05\xfb\x56\x28\x55\x29\x49\xe9\x74\x66\x72\x68\xbb\x60\x66\x5e\xe5\xf6\x3b\x2a\x6b\x44\xa5\x04\x96\x50\x73\xf6\x6c\xf7\x41\x2e\xa3\x50\x84\xa1\x58\xef\x2e\x3b\x81\x98\x71\xde\xb8\x7f\xbb\x9c\xb7\x66\xcd\x3f\xfe\x37\xcc\xe3\xb4\xb1\xf4\x8b\xc0\x4f\x1b\x66\x3d\x9a\x7b\xc3\x1e\x65\xaf\x3b\x74\x9c\xba\x02\x80\xc8\xd1\x8b\x6d\xce\x81\x2e\xc0\x2d\x11\x65\x50\xe2\x46\x17\x3f\x4b\x5d\x61\xc8\xc6\xf5\x2b\xba\xa5\x47\x46\x2d\xf5\x59\x4e\xb4\x90\x5f\xa2\x6c\x31\xfa\x36\xa8\x80\x64\x5a\x07\x4b\x78\x18\x0a\x29\xd4\x6d\xc1\x9a\xc2\x94\xa1\x0f\x52\x40\x59\xc9\x9d\x86\xe3\x73\x72\xb1\xcf\x41\x80\x83\xb9\x70\x34\x74\xa5\xa3\x39\xea\x59\x73\x21\x9d\xca\x60\x54\x90\x8f\xbf\x18\xd1\x3a\x8e\x42\xac\x54\xf2\xb0\x14\xb2\x4a\xc2\x21\x26\xa4\x34\xdb\x77\xc0\xf5\xd5\x32\xd8\xed\xe9\x80\xc3\x74\x4c\x1b\x1c\xf5\xfe\x9e\xd2\xeb\x12\x98\x98\xc0\x92\xc5\xf6\xe4\xca\x39\x3b\x97\x5d\x55\x10\x0c\x0f\x41\x12\x8c\x15\x48\xb5\xa6\x2e\x39\x2f\xaf\x34\x24\xbb\x53\x62\x5e\xe0\x4c\xc1\x0b\xd0\x08\x29\x2a\x4b\xb8\x55\xf4\x98\x9d\x70\x81\x1e\x2b\x9b\xcb\x40\x67\x0f\x54\x46\x72\xa3\x74\xfc\x8e\x32\xcf\x85\x04\x5b\x0c\x54\x05\xef\xd8\x1d\x44\xba\x53\x10\x32\x75\xba\x36\xc8\xe5\xdc\xc5\x33\x5a\x59\x3e\xee\x94\x05\x33\x7a\xb3\xbf\xe5\x59\x63\x23\x5e\xba\xb1\x8b\x60\xc1\x1b\x25\x1c\xdc\xba\x8a\xc8\x3b\xf5\xa1\xa6\xc2\x98\xbe\x86\x75\xb0\x76\x03\xa4\x7b\x19\xf9\xac\x40\x85\x96\x19\x7a\x00\x3b\x54\x8e\xae\x44\xa7\x50\x83\xe6\x56\x61\xb0\x59\xfc\x4e\x8d\x07\xe7\x39\xf5\x06\xa7\x97\xd2\x5c\x85\x32\x57\x1c\x68\x0d\xbe\x76\xa9\x24\x77\xcd\x8a\x7f\xfc\x6f\xb8\xa0\x9b\x5e\xa0\xf6\x8f\xcd\x4e\x86\x3d\x0c\x95\x5e\xd5\x87\xcb\xa2\x2c\xfd\xde\xf8\x49\x2c\x48\x97\xe8\x19\x11\x71\x29\xca\xa5\x0c\xd4\x21\xf8\xd1\x15\x08\x4a\xbc\x70\xd7\x5c\xeb\xab\xa2\xac\x40\x97\xf8\xf8\x2b\x64\x04\x93\xde\xe0\x8f\x9a\xbb\x87\x43\x83\x85\x34\x2b\x30\x69\x4b\xae\xac\xbf\xcf\x26\xeb\xe9\xb0\x42\xab\x31\x48\xc8\xca\x40\x17\x6d\x20\xa2\xbe\xa2\xcc\x19\xb7\x3d\x37\x09\x27\x69\xad\x03\xb4\x84\x4a\x4a\x75\x5b\xe4\x76\x4a\x29\xf3\x94\x4f\x17\x02\x6c\x89\x94\xbd\x36\x8b\xcd\x8e\x70\xa7\x52\xde\x05\xc3\x30\x58\xa8\x82\xc1\x8e\x81\x61\x80\x19\x85\x59\xab\x09\xaa\x55\x70\xea\x55\x68\x72\x5e\x8a\xf2\x0a\xc4\x9a\xb9\xdd\xa1\xf6\x03\x9e\x98\xc2\xc6\x0a\x5e\x06\x67\x2e\x9f\x0a\x5f\x3b\x86\x97\x70\xca\xfa\x58\xc1\x85\xd7\x8c\x31\x87\x8b\xd9\x12\x75\x20\x3d\x5b\x4a\x91\x09\x48\x23\xb0\x25\x6f\xfe\xe7\x66\x26\x17\x02\x7c\x29\xce\x85\x0d\x5a\xbf\x7b\xa7\x75\xa9\x94\xae\x50\xc2\x6a\x41\x9a\x7d\x2f\x45\x8e\x65\x39\x50\xcc\xa3\xc3\x31\xf1\x15\x3a\xba\x55\x94\x46\x2d\x61\xfb\x5d\x98\xb3\xca\xa6\xa5\x54\x8b\xc8\xb4\x3c\x74\x3f\x2f\x79\x75\xb3\x91\x6a\x5f\x03\x0e\x25\x8a\x46\x06\xfa\xef\x3b\x59\xc2\x66\x53\xa2\x8e\x3d\x93\x61\x26\xd5\xb7\x25\x9f\x57\x4c\x0b\x34\x35\x75\x61\x8e\x20\xcc\x71\xec\xa0\x84\x10\x6f\xbd\xaa\xab\x29\x2f\xc1\xd1\xcc\x4e\x37\xb6\x4a\x6e\x2e\xcc\x4e\x2a\x9d\x4f\x45\x9b\xc3\xdd\x99\x03\x66\xa3\x8f\x10\xc4\x34\xab\x02\x62\xdd\x7a\xd0\x55\xbd\x5a\xb5\xcb\x9d\xb0\x30\x2e\x1c\x5a\xd8\x05\x94\x84\xe4\xb2\x35\xa2\x26\x9c\x19\x3b\x31\xa4\x22\x8c\xe9\x42\x43\x93\xf7\xbb\xe8\x35\x66\xfa\x9c\xfe\x14\xd4\x33\x4c\x29\x57\xd3\x2a\x0a\x74\x65\x4f\xc5\x52\xe4\x73\xc1\xb0\xd6\x0f\x64\xba\x8b\xa3\xb4\x27\xc8\x67\xec\x5f\x42\xa9\xdc\xd2\x5a\xd2\x41\x55\x83\xbd\x53\xdc\x3d\x7d\x43\xca\x55\x70\xa6\xff\xb8\x9c\x59\x9b\xc1\xfb\x94\xf5\x9c\x67\x83\x9c\x0d\x00\x31\xd3\x0c\x86\xce\xa9\x40\x8e\xf6\xb0\xf5\x4b\xe0\x8f\x6b\xb5\x40\x60\x1a\xb8\xf6\x5f\xb1\x77\x60\x1c\x59\x59\x41\xf7\xa3\x08\x32\xe1\xef\x74\x1e\xfe\x13\x00\x11\x57\x41\xa2\xb2\x99\xd6\x0d\x76\x32\xdc\x60\x41\x3d\x59\x82\x12\x4b\xac\xd6\xf3\x62\x99\xdb\x80\xb6\x7b\xbf\xd9\xaa\xd6\xe9\xb1\x6a\x05\x74\x7d\x93\x36\x6a\x06\xce\x90\xad\x08\x14\x83\xed\x3f\xfd\xeb\x4f\x3f\xfd\xc0\xfe\x7a\xca\x57\x68\xf9\x47\xfa\x9e\xfe\x01\xa6\x84\xbc\x38\x3e\xe9\x02\xc6\x01\x3b\xc6\x8f\xcb\xfa\x8a\xda\xc5\x30\x77\x11\x1b\x71\xd0\xdc\xbe\x35\x12\x2a\xad\xa8\xa7\x3b\xb3\x4d\xaf\x76\xba\xf5\xa7\x42\x04\x48\x9f\x1c\x1c\xec\xbe\x7e\xbf\x3b\xee\xed\x3e\xfb\xa3\x20\x00\x6e\xae\xff\x7f\xb1\xf7\xfc\x8b\x56\xfd\xff\xb3\x67\x0f\xf5\xff\x9f\xe5\xef\x00\xe8\x72\x2f\x05\x3b\x28\x56\xab\x42\x69\xd6\xab\x1c\x11\xd3\xee\x78\xc9\x4b\xd1\xcb\xe5\x85\x60\xcf\xd2\xa7\xec\x5c\xad\x8b\x12\xd8\x84\x46\xfd\x1e\x70\x29\x1c\x0c\x4f\x4e\x86\xa7\x63\x76\x30\x1c\x9d\x0d\x47\x88\xec\x38\x18\x23\xb0\x23\xc0\x50\x1e\x0d\x46\x27\x00\xfd\x78\x38\xec\xe3\xe7\xc4\x7d\x41\x20\xab\x48\x91\xd0\x1f\xa7\x1e\xe9\x94\x60\x26\x23\x52\x0c\xf7\x6b\x78\x73\x9f\xf5\x4e\x59\x6f\x32\x19\x8e\x4e\xfb\xef\x77\x0f\x8e\x07\xfd\xd3\x09\x1b\xf5\x8f\xe1\xfd\xe3\xb7\x83\xb3\xb4\xdd\x43\x7a\xed\x18\xdb\x45\x94\x4f\x82\xb4\x44\xc2\x8d\xde\x78\x77\x30\xde\x42\xb2\x8d\x8e\xdf\x9f\xf4\xbe\x85\x2e\x84\x64\x19\xa3\xfe\x9b\xde\x08\xb0\x60\x11\xdb\xd5\xb7\x69\x09\x3e\x12\x1c\x3b\xd1\x2a\x8c\x9b\x00\xa0\x84\x50\xda\xc0\xfb\x1c\x4c\xc6\xec\x7c\xdc\x4f\x1f\x51\xca\xc5\x23\xd3\x3a\xa0\xa3\x6e\xf7\xc6\xec\xb0\x7f\x34\x38\xed\x1f\xb2\xd7\xfd\xe3\xe1\xbb\x9d\x4e\x36\x91\x3e\xd0\x36\x8c\xdd\x2c\xb6\x27\xe3\xfc\xf5\xf1\xe0\xc0\xcd\xee\xf6\xd6\xc1\xc1\xd9\xf1\x16\x1b\x8e\xd8\x16\x7d\xb6\xb5\x83\x1c\x1d\xf0\x5a\x7c\xc7\xa4\x7f\x30\x31\xef\x7d\xcf\x0e\x86\x67\xef\x47\x83\x37\x6f\x27\x66\x74\x4f\x2c\xe0\x6d\x03\x81\x34\x05\x74\x56\xe2\xa4\x70\x4d\xe1\x93\x93\xb7\x66\x01\x23\x5a\x8a\x2e\x26\x94\x51\xf0\x26\xb3\x99\xb0\x1f\x00\x6b\xda\x3f\x4c\x1f\xbd\x7e\xcf\xfa\x7f\xe9\x8f\x0e\x06\x63\x33\x75\xc0\xe9\x61\x1e\x75\x4c\x22\xf0\x42\x37\x39\x6f\xfb\xa3\x3e\x92\x7d\xf4\x0e\x80\xf7\x02\x80\x63\xdf\x8c\xfa\x00\xa4\xfa\xba\xcf\x5e\x0f\xcf\x4f\x61\x78\xed\x09\x74\x2c\x1b\x31\xe4\x6a\xd4\xdb\x93\xde\x7b\xd3\xca\xc1\xf0\x74\x3c\x38\x04\x90\x5e\x6c\xb6\x17\x60\x03\x9b\xdf\xe2\xf3\xc3\x11\x7b\x63\xb6\xd1\x18\x7a\x64\x3e\xa7\xbe\x9b\x87\x7b\xb0\xc0\xa6\xc3\x6c\x70\xea\x5a\x74\x00\xac\xef\x87\xe7\x23\x1a\x84\x65\x46\x01\x8c\x57\xec\xb3\x19\xd6\xc1\xf0\xf4\x70\x00\x87\x01\x31\xd4\xd2\xa0\x88\xd8\xc6\x9b\x78\xca\xb6\x7a\x19\x5f\x63\xc4\x6a\x8b\x00\xce\x38\xa6\x2d\x4d\xb9\xb6\xe8\xf3\xd5\x12\xf9\x99\x00\xd8\x31\xfa\x24\x82\x24\x12\xbb\xe8\x22\x52\x0b\x68\x41\x13\x98\x26\xa4\x1e\x19\x43\x4d\x5b\x36\x36\xee\xde\x99\xb0\x46\x56\x59\x12\x61\xe2\x17\x73\xb6\xaa\xb5\x9c\x01\x35\x28\xbc\x05\x50\xd1\x3c\x0b\x0f\x67\xb9\xb1\x82\x79\x09\xd0\x79\xbc\xac\xcc\xfb\x67\xd4\x52\x51\xb2\xf5\xb2\x50\x2e\x49\x6a\x0d\x5a\xfa\x0a\x80\xc4\x80\xaa\x0d\x29\xe8\x34\x9b\x19\x6b\x92\x57\xe6\xc1\xf5\x52\xce\x82\xfe\x69\x9b\x5c\x85\x6f\x07\x36\x5b\x87\x6f\xe5\x26\x81\x90\xb3\x4a\x31\xe3\xba\x4a\x70\xac\x88\x16\x8a\x50\x98\xa6\x39\x91\x05\xa0\x8e\x44\xdb\x0a\xcd\x95\x62\x56\x2c\x94\xfc\x00\xf4\xee\xad\x1c\x2f\xcb\x69\xee\xb8\xd5\x91\x63\x33\xc8\x2c\xf3\x38\x7a\xc8\x80\x9d\xe7\xc4\xb8\x07\x8c\x2b\x40\xa5\x89\x88\x89\x32\x03\xd4\x39\xae\x98\x5f\x73\x87\xe9\xb8\xae\xcb\x75\xa1\x45\x9b\xb7\xe4\x88\x1e\xe0\x97\x85\xcc\x60\xea\x8a\x39\xcb\x8a\x7a\x5a\x25\x04\xd1\xee\xa6\x01\x60\x40\x61\xbd\x78\x4e\x4b\x10\x4e\x79\xb8\x1c\x88\x43\xa6\xaf\xd5\x6c\x59\x16\x2a\xc0\x35\xf4\x8d\x29\xe0\x81\xcb\x76\x11\xe7\x13\xc6\x53\x2d\x81\x0a\xec\x12\xa6\x70\xc5\x17\x82\x6d\x6f\x41\x1b\x52\x2d\xb6\x76\x1c\x49\xdc\x27\x0f\x96\x8e\xc5\x34\x35\x5a\xa8\x9d\x47\x7f\x2c\x66\x7e\x6e\x01\xa3\x70\xc3\xc6\x0b\xf6\xbd\x50\xb3\xeb\x59\x5e\xac\x45\x26\x31\x0f\x9d\x71\x55\x2d\x8b\xbc\x58\x48\xa1\x93\xc6\x9e\xd4\x89\x9f\x1f\xd8\x77\xd3\xb2\xe0\x99\xd9\x52\xf8\x28\x6e\xc1\xff\x3f\x7b\xff\xbe\xdb\x46\x92\xe5\x8b\xc2\xff\xfb\x29\x02\x02\x3e\x58\x04\xd2\xb4\x25\x57\xd9\x55\xe5\x46\x63\xd3\x12\x6d\xb3\x5b\x96\x34\xa4\x54\x6e\x7f\x07\x07\x98\x20\x19\x14\xb3\x9d\xcc\xe0\xce\xc8\x94\xcc\x79\xa1\xf3\x1e\xe7\xc9\x0e\x62\x5d\x22\x56\x64\x26\x25\xb9\x6e\xd3\xd3\xbb\x0c\xec\x3d\x5d\x76\x32\x33\xae\xeb\xfa\x5b\xbf\x05\x5f\xc0\x96\xa3\x09\xfb\xad\xe8\x87\x80\x8f\x14\xb9\xab\xd3\x16\x8c\x47\x87\xab\x81\x9a\x9b\xc2\xde\x65\xa2\x07\x0d\x92\x87\xf2\xda\x3b\xc3\x53\x84\xd1\xa6\x77\x11\xdb\xd5\x30\x7b\x5c\x26\x29\x1c\xf3\x12\xbc\x90\x45\xdd\x88\xfe\xfb\x2e\xeb\xb9\x2c\xc0\x0c\x19\x7b\x47\xe6\x35\xe0\xcc\xf3\xca\x40\xaf\x55\xd5\x94\xa1\xd7\x1b\x5c\x0f\x5d\x58\x62\x41\x4d\xda\x93\x73\x87\xd3\x32\xb6\x8c\x24\x02\xce\x30\x28\xa0\x08\x36\x5b\x5d\x41\x77\x0a\xb8\xef\x4b\xb3\x05\xbf\xb1\xa6\x35\x42\x46\x2f\xea\xf9\xc5\xcd\x84\x6b\x7b\x63\x50\xd6\x54\x06\xba\x23\x6c\xe6\x05\x8c\xb5\xb6\xe2\x10\x78\x79\xb5\xb6\x05\x30\x10\xfe\x56\x97\xf1\x50\x47\x82\x6a\xd8\xa7\x41\xfb\xc8\x76\xb1\x98\x74\x66\x17\xfe\xcc\xb6\xed\xb8\x13\xbb\xd9\xea\x1a\x18\x48\xe9\xf1\x78\x98\x99\xc4\x0f\xd1\xa7\xe1\xb8\x44\xae\xc4\x05\xbd\x6d\x81\x2f\x03\xfc\xe6\x22\xbc\x30\x76\x4d\xf2\xbf\x0f\xad\x13\xf5\x76\x5b\xd9\x5b\x62\x34\x6e\x0f\x07\x1e\xf2\xbb\x62\x9c\xf3\x5b\x0e\x0d\x44\xcc\xff\x6e\xf2\x5b\x5d\x98\xb2\x6e\x13\xb5\x0a\x16\xdc\x4c\x81\xd0\xdb\xe4\x65\xbe\x69\x36\x99\x9a\x1b\xc4\xd8\xc2\xc7\x69\x28\xd8\x8c\xa6\xd5\x79\x8e\x46\x77\x8b\x52\xca\x79\x27\x92\x56\x32\x83\x95\x80\xbe\x47\x25\x77\xe3\x50\xd4\xf2\x90\x51\xd7\xe3\xa2\xbf\x65\x2d\x74\x54\xcd\xb0\xc3\x8c\xf9\xba\x2d\xf2\x45\x5e\x17\xbb\x40\xff\x89\x9d\x23\x70\x58\x44\x20\x9e\x68\x94\x15\x9d\x3e\xe8\xd2\xd1\x6d\x39\x1e\xa7\xd4\x47\xef\x8a\x6d\x94\xda\x4b\x9b\x70\x1b\x17\xb2\x5b\x6d\x98\x77\x67\x52\x30\xd9\xee\x49\x5a\x0e\xd5\x41\x68\x04\x1f\x0e\x0c\x13\x5b\xc7\xe1\x12\xdd\xe7\x16\x81\xea\x52\x57\xc1\x8a\x2e\xec\x36\x8f\x74\x7c\x70\xf3\x6d\x25\x0e\x7b\x06\x76\x81\x3f\x2e\xdb\x2a\xd7\xb5\xc9\x02\x3b\xb9\xd3\x08\x83\x26\x89\x06\xca\x14\x09\x37\x43\x77\x70\x1e\xab\x19\xaa\x83\xf6\xbc\xc2\x88\xd7\x00\xb9\x28\xec\x1d\xd0\xd2\xe6\x37\xeb\x67\x85\xb9\x35\x45\x6c\x67\x41\x5e\x8e\x81\xa5\x40\xc1\x87\x27\x17\x5f\x69\x2b\x96\x1a\xc0\xe6\x18\xf8\xff\xea\xbc\x2e\x3a\xba\xe3\x27\xe9\x34\x65\x2a\x7a\x4d\x3c\xd4\x55\x18\xaa\xad\xe4\x10\xfd\xeb\x6f\xf3\x65\xe3\x55\x7c\xfc\xdf\x5e\x98\x21\x7b\xb6\xad\xf0\x7f\xe5\x7c\xd7\xa0\x6f\xf4\xa1\x1b\xc4\x75\x7d\x08\xae\x4d\x23\xb8\x19\xaa\x83\xc0\x5d\x38\x6a\xea\x75\x18\x48\xc6\x53\x03\xc6\xce\x87\xcc\xaa\x6f\x1d\xf5\xdd\xda\x06\xfe\x53\x79\x16\xf2\x95\x2a\xad\xf8\x75\xf8\xd1\x4e\x2d\x74\x09\x3d\x82\xbd\xa8\x06\x5d\x90\xc5\xb3\xe6\xd6\xa6\x7a\x43\x3b\xa3\xf4\x72\x99\xa3\xe8\xcc\x07\xdd\x49\x48\xeb\x03\x6c\x98\x05\x12\x35\x3b\xe0\xae\x72\x19\x1a\x2b\x39\xac\x00\xd8\x36\xfe\xef\x84\x45\x0b\xd8\x2a\x9c\x80\x5e\xd4\xf8\x3b\x6f\xb1\x16\xf9\x2d\xe4\xc3\x0d\x70\x3a\x67\x6a\x5b\x68\xaf\xbb\x32\xa4\xf6\xd9\x56\xa6\x0e\xe7\x17\xba\x67\xd2\x38\xee\x31\x19\x60\xee\xc8\x9b\xcd\x32\x62\x65\x8b\x2f\x85\xad\xcc\x1b\x94\x33\xdd\xc9\x05\xd3\x96\xd8\x3c\x97\xcd\x02\x8b\x72\x99\x5f\x94\x58\x4b\x2a\x55\x98\x1b\x5d\xf0\xda\xfa\xd9\x60\x7f\xa1\x55\xfe\xd5\xe0\x21\x74\xb6\x29\x97\xae\xbb\x68\xe1\x16\xe2\x03\x51\xee\x75\x07\x24\x8d\x15\x14\x06\x37\x3a\x18\x76\xc8\x99\xec\x6f\x72\x10\x90\xe1\x79\x3e\x9e\xeb\xa1\x3a\xf8\x04\x65\x1a\xf1\x72\x84\x05\xa3\xfe\x53\xc9\xa2\x85\xe6\xf1\x0f\x9c\xff\x7b\xc9\xd4\xb9\x55\xc0\xb2\xa1\x66\x72\x65\xf2\xe1\x4c\x39\x68\x0e\x9d\xaf\xbc\x5b\x00\x16\x11\x8d\x60\x69\x37\x1a\xea\xbf\xd6\xba\x36\xb7\x44\x3a\x4d\xad\xb5\x37\xd4\x8d\x14\x36\x9d\xf8\xbb\xe3\xee\x8a\xf1\x2c\xf3\x9b\xbc\xd6\x05\x3c\x28\xbd\xa5\xb9\xb5\xde\x78\xd6\x9b\xed\xba\x30\xb5\x38\x92\xd4\x04\xec\x8d\xbf\xa1\xde\xd8\xaa\x8c\xf7\xa6\x00\x80\x99\x29\x67\xaa\x0d\x6e\x78\x34\x15\x83\x5d\xe7\x55\x00\x36\x1a\xf4\x3f\x5e\x56\x1a\x7a\x78\x41\x47\x2d\xfa\xdf\xf6\x99\xb4\xdd\xfd\x53\x8b\xb5\xad\x4c\xf0\x8a\xee\xe8\xde\x1a\x7f\xc8\xbd\x92\xdd\x18\xea\x57\xd4\x6c\xe6\xca\xad\xed\xdd\x1b\x61\xff\x7b\x53\xc1\xba\x3c\x5a\xee\xb6\x0a\xcb\x7f\x67\x2b\x38\x4c\x1d\xc7\x0b\x0d\x29\x2b\xda\x2e\x6a\x87\x6d\x6f\xbd\xf0\xc0\x9b\x42\x0b\x89\x92\x5a\xfb\xbd\x5b\x18\xe7\x8d\x6b\x5d\xd8\x1b\xdb\x60\x0b\x6d\xf9\xde\xdd\x1b\xf6\x97\xbc\xe7\x52\xe9\x3b\xb8\xc5\x5b\x9d\x97\x35\x9a\x16\xd5\x62\x9d\xd7\xbc\x9a\x6e\xd1\x14\x5b\xfc\x9f\xa6\xbc\xa9\x34\x38\x1b\xd0\x62\xa9\x5e\x8b\xf7\x6d\xd7\xf6\xb7\x1f\x76\x7c\x69\x32\x66\xec\x0d\x0e\x67\xcf\xdf\x40\x95\x17\x45\xe3\xea\x8a\xd4\xe8\x46\x6f\x41\x02\x95\x99\x72\x5f\x4c\xbd\x58\x23\x09\x6f\x65\xcc\xb3\x65\xbe\xf1\x26\x08\xd0\xf4\xc3\xcb\xd0\x97\xba\x05\xe5\x7d\x43\x3b\xbb\xcb\x54\x6d\xb7\xe1\x7f\xcb\xd5\x00\x37\xc3\x9f\xff\x05\x1c\x1a\x21\x19\xfc\x7f\x86\x1b\xfc\x46\x4a\x23\xd8\x56\x60\x42\x09\x3e\xdd\x52\xd7\xba\xd5\xbd\x02\x3b\xf2\x6f\x2b\x5b\xa3\xd2\xd5\xe8\x5f\x51\xe4\x1f\xec\x0b\x3c\x84\x60\xee\xc0\xd8\xe9\xeb\xbc\x80\xb7\xba\xca\x0d\x6a\x9a\x45\x5e\x2d\x1a\x17\x1e\xa8\x7a\xbf\x05\x2d\x7e\x83\x44\x96\x26\xf8\x7e\xb1\xcc\xa2\x29\x1f\x42\x75\x57\x30\x9e\xcb\x7e\xad\x65\xbe\x9a\x6a\x01\x8c\xfe\xf7\xd0\xf3\x7b\xf1\xeb\xcd\x65\x3f\x9e\x6d\x65\x6e\x73\xdb\xb8\x62\xa7\x6e\x73\x5b\x04\x0d\xd9\x2f\xc6\xfa\x9a\x15\x86\xa8\x0c\xbf\x16\xda\x35\x7a\x03\x9c\xce\x1b\x1a\xa5\x28\x77\x42\x50\x21\xd8\x37\xb5\xe5\x41\x9b\x7b\x86\xbc\x34\x6e\x9b\x7b\x1f\x2a\x0c\x98\x86\xcb\xfd\xb6\x94\x52\xff\x1c\xaa\x03\xac\x59\x2c\x76\xea\x12\x77\x42\xd8\x8e\xac\x01\xc9\x5a\xac\xcc\x22\xaf\x75\x42\x8a\x1f\xa2\x49\xd8\xff\x75\xd3\x94\xc8\xa1\xdd\x36\x33\xad\x33\x3d\x6f\x01\x4f\xd6\x8b\x72\xfc\xa2\xad\xf8\x82\xc9\x56\x1a\xf3\x9d\xba\xcb\xf1\x54\xfb\xff\x0b\x6d\x2f\xe3\xf3\xf8\x4e\x96\xc8\xd2\x2f\x7f\xf3\xa0\xf5\xfb\x89\xbd\x49\x14\xe1\xea\x4e\x53\xef\xbd\x8d\xd9\xcc\x4d\x15\x26\x49\x8f\x43\x93\xf7\x05\xdc\xff\x7a\x6d\x1c\x35\x3f\xc7\xfd\xd1\x0a\x09\xc0\x41\xd9\xd4\xe1\x3f\xe3\x81\x2b\x76\x5e\x2e\x3b\x53\x12\xe1\xf7\xe6\x8d\x5c\xe0\xb0\x94\xe9\x00\xf7\xac\x4e\x68\x64\x11\x57\x1c\xd4\x75\xf2\x5b\x1e\xbb\x58\x11\xb9\x69\xad\x15\xde\xbf\x8e\x30\xce\x20\x34\x88\xed\x3c\xfe\x77\x18\x79\x32\xd6\xf8\x6e\x97\xdf\xf8\x7d\x66\x53\xa5\xc2\x08\x50\x00\x00\x7f\x19\xaa\x83\xa9\x21\x33\xa8\xed\xb5\xf4\x38\x23\x7b\xbe\xd2\x63\x21\xcc\x77\xf8\x51\x68\xc0\x97\x3b\x7f\xe7\x2b\xb3\xb0\x44\x56\x9a\x34\x3e\x06\xbb\x2d\xff\xaa\x43\x00\xa5\xa2\x11\xf9\x57\xf3\x3f\xec\x5d\x3d\x57\xdb\x2a\x74\x3d\x89\xb2\x71\x5f\x0c\x0d\xe9\x3d\xa2\x01\x11\x15\x3f\xb8\x32\x95\x2d\xfd\x51\x33\xcb\xbc\x41\x5a\xb5\xe3\xa1\x7a\xa7\xf3\x4a\x9d\x1a\x0d\x2d\xd6\xb1\xc3\x40\xec\xdc\x01\xa6\x4f\xda\x26\x29\xb4\xf0\xa8\xad\xaa\x8c\x5f\xd9\x0c\x57\x26\xc3\x4e\x2e\xd4\x1d\xc7\x2f\x64\xe3\x0c\x10\xb2\x52\xeb\xd9\x20\xcb\xe1\x41\x14\x2d\xd4\xee\x04\x1f\x88\x0b\x4c\xc6\xef\xc2\x6c\xf1\xbf\x30\xc2\x59\x19\x6e\x0c\x03\x81\x20\xec\x03\x51\x96\x21\x9c\x42\xae\x6d\xfc\x0e\x2d\x58\x6c\x6f\x18\xff\x89\x3a\xcf\x50\x04\x39\x69\x9c\x84\xe7\xe7\xe5\x30\xcc\xfa\x7d\x05\x7d\x5d\x67\x69\x53\x0b\x6a\xd2\x05\x7e\x6d\x89\x2e\x47\x47\x40\x67\x51\xae\xae\x4d\x65\xe6\xd4\xe6\xd0\x61\x37\x16\xaf\x50\x8a\xe5\x5d\xbe\x34\x19\xb7\x82\x7d\xe6\x97\x2b\x53\xa5\x2d\x9f\x41\xa7\x1c\x97\xdf\x1a\x08\x99\x6e\x0d\x84\xd1\x0e\x39\xf8\xb3\x6c\xd2\x8e\xaa\x62\x0a\x61\x92\x83\x18\xd1\x11\x42\x5d\xf4\x7c\xcd\x65\xd4\xde\x29\x57\x63\x43\x0a\x53\xd8\xbb\x9f\x62\x3e\xa0\xb6\x2a\xdc\x22\x71\x48\x6b\xef\xa8\x2d\x6c\xb5\xb5\x10\x4d\x13\x51\xda\xda\x26\x71\xb9\x18\xf2\x22\x57\xaa\xf7\x85\x7e\x00\xe2\x7d\xc1\xb5\x16\xbf\x7e\x13\x83\xb1\x35\xfb\x8f\xf0\xc2\xf8\xb6\x91\x08\xaa\x84\xb3\x82\xa7\xa7\xa4\x7e\x9c\x32\xde\x10\x2f\x1a\x34\xeb\x8e\x09\x09\x0e\xc7\xe3\x5d\xc9\xa0\x2b\xa7\x93\x4d\x95\x5c\x6d\xb6\x68\x57\x16\x46\x57\xc5\x4e\x15\x7a\x6e\x0a\xef\x00\x6e\x74\x05\x5a\x2a\x71\xf7\xc8\x6d\x25\x15\xb0\x58\x03\xe6\x4c\xdd\x99\xca\x60\xc8\x87\xce\x54\x08\x97\xf8\x15\xc1\x40\xbb\xf9\xaa\x37\xdb\x02\x5a\x31\xc8\xf1\x2d\xa0\x71\xc1\xdc\xff\xbc\xfa\x62\x96\xea\xe0\x4a\xfe\x1c\xfb\xfb\x68\x17\x7e\xc2\xf9\x83\x31\x00\xd3\xa0\x59\xc6\x6c\xab\xcb\xdc\xad\xb3\x03\x34\xa8\x36\xa2\x3f\x01\xbd\x3d\x34\xad\xe8\x79\x79\x08\xef\x71\x68\x76\x78\xf0\x26\xc6\x1d\x6b\xab\x62\xbc\x08\xb6\xa8\x6d\x08\xc8\xf3\x12\xf6\xa0\x7b\x02\xe4\xee\x83\xa7\x19\x23\x52\x8f\xf8\x86\x38\x0d\x22\x3c\xb4\x3f\x7d\x21\x4a\x6f\x72\x2f\x04\xcb\x67\x77\x3a\xbf\x85\xfd\x06\x86\xd5\xc2\xd9\x6a\x17\xc4\xc2\x6c\xb1\x36\x1b\xe3\xa8\xad\xaa\x37\x42\x64\xc8\xcd\xa5\x71\x6e\x94\x3a\x60\xc8\xc0\x8c\xe8\xc2\x63\x08\x07\x83\x5c\x70\x42\x6b\x5d\x37\xd0\x47\x1d\x1a\x7f\x85\x6f\xc6\xc8\xa1\x83\xaf\xaa\x85\x2e\x29\x74\xec\x87\xc8\xd1\x90\x20\x6d\x2a\xec\x11\xe3\xc8\xe8\x25\x49\xd2\x1d\x05\x76\x73\x0a\x43\x59\x51\x6a\x2b\x08\x0b\xee\xc6\xba\x92\x62\x83\x5b\xb5\x76\xed\x42\x51\xd6\x93\xe7\x43\xf5\xe9\x5f\x78\xf5\xf6\x2e\x1d\xfc\xe5\x1f\xbe\x70\xf2\x70\xc3\xea\xe5\x43\xf5\xb3\x2d\x9a\xb2\xd6\x7d\x8b\x76\xb5\x67\xc4\xfb\x17\x0a\x52\x73\xa0\xed\x12\xbb\xd1\x56\x21\xd2\x87\x6d\x81\x43\x2f\xab\xf0\x7a\xcc\xe1\x81\xd5\xca\xdd\xd7\xf0\x52\xfa\xf5\xb4\x0b\x70\xb9\x50\xc4\x2e\x37\xd4\x13\xc2\xa9\xdb\x30\xf6\xf6\xe2\xbb\x4c\xdd\xe6\x9a\x7a\x44\xe3\xcf\x33\xb2\x73\x7f\xc5\x02\x86\x16\xa0\xd8\x37\x87\x9e\xa7\x00\x0c\xbf\x14\xe3\x83\x45\x01\x62\x5d\x63\x2f\x79\xe0\x1f\x72\x61\x71\x4a\x7b\xa7\xbe\x94\xf6\x0e\x62\x26\x5e\x67\x63\x03\xb9\xa5\xb9\xf5\xbf\x1f\x76\x3f\x41\x89\xab\x74\xf5\xc1\xc2\x84\x23\xb2\x49\x9a\x70\x6b\xec\xea\x89\x60\x64\xec\x96\x9e\x34\x8a\xdc\xa3\xa4\xd1\x4a\xe9\x0c\x3a\x31\x49\x38\xa3\xf7\xc3\xe1\x8a\xda\x76\xd2\xef\xbd\x98\x88\xfd\xf7\x44\x9b\xe5\x18\xd2\xae\x0c\x9b\x27\x55\xe8\x2d\x85\x95\x79\x53\xb2\xe7\xb0\x13\xe4\x55\xec\x73\x1d\x5e\x24\x92\x89\x2f\x69\x65\x92\x86\x7f\xa0\xde\x44\x3f\x30\x3f\x7e\x30\xf4\x62\x7b\xa2\x18\x92\xaf\xc4\xe7\x84\x05\xf2\x99\x3a\x82\x9d\x26\x6c\x29\xfb\x55\xca\xfe\x06\x4f\x32\x8d\x1d\xc8\x59\x78\x0b\x35\xf7\x0d\xcb\xb8\x69\xd1\x75\x99\xc3\x9b\xa7\xc6\x61\xe5\xf4\x84\xc3\xcf\x95\x3a\xbc\x9e\x4e\x20\x19\x97\xf5\xf8\xe4\xe6\xd6\x54\xbb\xa4\x0d\x19\x0c\xcc\x7f\xf2\xfe\x49\xc4\xc9\x42\x74\x02\xd8\x66\xc0\xb1\x81\xec\x34\x58\x29\x38\x1b\x61\xba\xc1\x55\x0a\x96\xf7\xfe\x68\x01\xeb\x3d\xee\xda\x47\x57\x2b\x34\x78\x92\x23\xdd\x73\x18\x45\xcb\x7b\xfa\x2a\xff\x78\x4f\x3f\xad\x74\xb5\x69\x5a\x0e\x26\x4d\xb9\x46\x43\xc6\x4e\xd8\x8e\x2f\xc6\x6c\xbd\x15\xa9\x17\xc0\xb3\x1b\xfa\x3b\xd1\x07\x57\x1c\xcd\x69\x35\x38\x24\x13\x6a\x99\x3b\x08\xc1\xa3\xb0\xba\x83\x74\x35\xe6\x1c\x7e\xe5\xbe\x7c\x5a\x9b\xf2\x11\x0f\x0a\x0b\x59\x4e\x59\x6c\x60\x6c\xf3\x0f\x72\x00\x52\xff\x0b\xed\x85\x92\x76\x4d\x65\x1e\xda\x5b\xb1\x7d\x7a\xcf\xe6\x81\x34\xfd\x8c\x1d\x07\x7f\xdb\x5d\x84\xa6\xb5\x7c\xdf\xbf\x3b\xd4\x03\x8a\x44\x3a\x19\x7d\xea\x33\xe4\x64\xe6\x3b\x53\xf3\xa6\xc6\x0d\x5c\x5a\x83\x12\x8a\x5a\x96\xb5\x4c\x7e\xa5\x81\xc1\x28\x44\xa9\xd0\x60\xac\x9d\x29\x56\xc4\x66\xd4\x16\x2f\xf7\xdc\xf7\xc9\x0a\xd6\x84\xfd\x86\x64\x40\x80\x60\xa2\x96\x6a\x41\x17\x05\x01\xc9\x47\x33\x6b\x85\x11\xb7\x95\x5e\xd4\xe8\x75\x65\xaa\x32\x1b\x2f\xfc\xc2\x58\xe5\x2c\xca\x9d\xff\xec\x32\x87\x74\xb2\xec\xce\x16\x97\x72\x31\xc8\xf8\x1f\x8d\xab\xbd\xaa\x69\x8d\xb7\x4c\x3c\x97\xdf\x61\xc0\x02\x75\xf0\x8b\x06\x1c\xbd\xb3\x47\xca\xeb\x14\xe9\xb0\x47\x68\x63\x0e\x3f\xb5\x95\x20\xfb\xa5\x95\xf7\x6b\xba\x9d\xe8\xce\x7e\x51\xaa\xfb\x0d\xa5\xb0\x1e\x9b\x48\x3f\x0c\x5d\xee\x72\x04\x84\xd1\x68\xf8\xdf\x69\x54\x83\x80\x01\x21\x08\xc2\x63\xc7\xa3\x0e\xcd\xf0\x66\x98\xdd\x8b\xbb\x9d\x0d\x06\x7e\xd8\xb7\xbd\xa3\xee\x02\x3d\x42\xe3\x3f\x29\x7b\xc5\x06\xe0\xda\x83\xe7\xbe\xa2\x8c\x17\x01\x3a\x36\xd8\xfa\x17\x6f\xb2\xff\x60\x86\x4d\x3a\x81\xd9\xcc\x6e\xb6\xc5\x2e\xae\xb6\xb8\x7c\x11\xb5\xf0\xb8\x4f\x27\x3f\x07\x84\xdd\xfd\xe3\x18\x10\xde\xc2\x56\xb4\x79\xd0\x7d\xf2\x60\x14\x43\x21\x0c\x71\x79\xe4\x80\x8d\xea\xfe\x56\xdd\x20\xfd\x5e\xb1\x0b\x71\xbd\x68\xaf\xc4\x86\x89\x3f\xa9\xc3\xc9\xe0\x51\x26\xc5\x74\xc2\x46\x43\xef\xe7\x7a\xd4\x14\x60\x98\xc4\x6a\x3d\xac\x84\xde\xa8\xc3\x09\x0f\xe7\xb1\xa6\x84\xf8\xc0\xbd\x06\x45\xef\xa8\x1f\x69\x5a\xc8\x6f\xfc\x46\xaa\xa9\x3b\x18\x98\xbc\xdc\x8c\xc7\x1a\x14\xbd\x33\xfb\xb5\xa6\x85\x4e\xb1\x6d\xad\x55\x78\xdc\x56\xfe\x3c\xf0\xfe\xc9\xa3\xad\x0f\xa9\x27\x7e\xa5\x0d\x72\xef\xa1\xb8\xdf\x12\x91\x20\xcb\xdf\xda\x1e\xe9\xee\x53\xc7\x34\x99\x77\x4c\x13\xa9\xdf\x7e\x2f\x03\x45\x7c\xe3\x5b\xcc\x94\xde\x19\xc5\x70\x1a\x59\x02\x71\xeb\xb3\x07\xfc\x1f\x0c\x46\x8c\x52\xcc\x72\x12\x87\x8d\x16\x42\x53\x42\xd6\x4b\xb3\x26\x17\xa1\x3d\x3f\xe8\x6d\x53\xb9\x46\x97\x89\x8f\xe9\x0d\xbf\xac\x73\xad\x62\x70\x9d\x2f\x18\x07\xab\x43\x22\x8f\x42\xb2\x99\x8c\xa4\xd2\x6a\x60\xa4\x15\x82\xc6\x90\x7f\x81\x08\x79\x65\xa8\x63\x76\x5e\xde\xb0\x21\x60\x54\xe9\x15\x68\xbb\xa9\x2b\xa2\x97\xd4\xa1\xad\xd4\xd6\x99\x66\x69\xcb\xdd\x06\x7b\x63\x87\x95\x1d\xf8\xff\x74\x0d\xa6\xce\x33\x06\x90\xe4\xfd\x2f\xa2\x7f\x0d\x26\x55\x6c\x1e\xae\x4b\xc2\x02\x41\x5b\x77\x5b\x05\x8e\x4c\x52\xd9\x5a\x41\x73\x74\x48\x50\x10\xf2\x33\x63\x9c\x12\x40\x1d\x21\x35\x9c\xa9\x7f\xda\xa6\x2a\x75\x81\x80\x4e\x1d\xf5\xbc\x3a\x3c\x10\x5a\x5f\x5d\xe2\xdb\x0f\x00\x5e\xc3\xc3\x79\xea\x3a\xcb\x9d\xc5\x03\xe5\x7d\xf8\x1c\x53\x43\x73\xc6\xa9\x8b\x15\x27\x80\x97\x5c\x4a\x88\x55\xb4\x27\x44\x86\x56\x9d\x02\xdc\xd8\x0a\x8f\x4b\xc9\xb6\x53\x6a\x6b\x86\x0f\xee\x52\xb3\x93\x94\x60\xec\x5b\x0e\x57\x3e\xac\x33\x77\x31\x77\x74\x73\xb4\x73\x76\x91\x23\x6a\x82\x55\x36\xba\x57\x74\x70\x61\xe8\x5e\xab\x8a\xab\x2a\x44\x7a\x7b\x99\x10\xb8\xc1\x21\xa9\x3c\x12\x50\x27\xa7\x15\xd1\x64\x68\xea\x00\x30\xc0\xc1\x9c\x60\x04\x21\xdc\x71\x38\x1f\x74\x61\x72\xa9\x99\xae\xd9\x8c\xe6\x04\x00\x23\xb1\x1a\x67\x3a\xd8\xf6\x54\x7e\xd0\x69\x3a\x78\x57\x99\x72\xb1\x4e\x82\xff\xad\xa4\x65\xeb\xe8\x62\x44\xff\x60\xb6\xa8\x8c\x29\x01\x87\x86\x75\x1b\x80\x03\x12\xf9\x85\x9e\x9f\x42\x7d\x8f\x9f\x0d\x0e\x3a\xed\x23\x9d\x88\xd7\xc5\x80\x83\x6b\xf9\x66\x8b\x36\x2c\xc9\xd1\x72\x97\x9c\x35\x5d\x96\xa6\x7a\x13\x92\x31\x99\x5a\xdb\x3b\x03\x58\x39\x26\xb9\x4d\x96\x2f\xf1\x08\xaa\x44\x26\x4b\xbc\x2f\xee\x3a\x0d\x13\x80\xd4\x7a\xbb\x35\xba\xc2\x53\xc5\xff\x00\x17\x0b\x24\x13\x63\xc2\xcb\x1b\xa5\x61\xa6\xae\x47\x4d\x25\xdf\xa3\x17\xe2\x3d\x01\x8d\x01\x92\x1e\x7f\xe5\x78\x89\x5c\x40\x1d\xd2\x4c\xfd\x28\x0b\x03\xc9\x6c\xc8\x40\x6d\xf2\xd2\x1f\x1c\x42\x11\xf3\x8f\xf8\xa8\xb5\x21\xeb\x71\x78\xf7\x57\x59\xb0\x56\x47\x9f\x89\x94\xe9\x43\x9b\xd6\x53\xea\x20\xa5\x0e\xed\x04\x4d\xc3\x99\x5a\xd9\xa6\x8e\x6d\xc8\x01\x4e\x21\xe0\x2c\xd0\xd4\x7a\x2f\x40\xa4\x63\x78\x30\x20\x1a\x41\x8d\xfc\x5f\xda\x39\xe0\xd6\x06\xab\xb4\xc0\xf4\x7b\x2b\xa5\x9b\xb1\x34\x75\xeb\x7c\x8b\xc8\x9a\xa5\xad\x1c\x16\x20\x50\x00\xb1\x7d\x01\x12\xb4\xae\x97\xe2\x3d\xf2\xb4\x0b\x36\xb6\xa8\x65\xb9\x61\x77\xeb\x86\x66\x01\x07\x00\x3e\x1c\x15\x11\x64\x11\x54\x53\xe5\x16\xc1\x78\xb5\x29\x25\xc4\xa6\x5f\x51\x3d\x6a\x8c\x02\x7f\x3d\xc6\x52\x1f\xed\x44\x52\x51\xdf\x54\x06\x2f\x1d\x61\x00\x79\x3d\xc2\xab\xfd\xdb\x43\x14\x3c\x01\x9f\x6e\xfc\x38\x11\x37\x95\x24\xbf\xe1\x02\xf9\x65\x08\x39\xd5\xec\xd1\x61\x57\x72\x89\xe7\x3b\xb6\x7d\xf0\xf3\x7c\x6f\x1e\x6b\x92\x60\x57\xfa\xdc\xd5\xb6\xaa\x33\xb5\xf1\x06\x00\xac\x34\x84\xd2\xe1\x04\xd5\xfa\x0b\xdf\x9d\xa5\xa9\xec\x8d\x86\x9c\x8f\x0e\x70\xcd\x50\x1f\x24\x83\x52\x98\x4d\xba\xe3\xbc\xe9\xb6\x32\xff\x6c\x96\xf9\x22\xd7\x05\x3f\xd6\xda\xa2\xa7\x4e\xad\x6d\x89\xab\x58\x99\x6d\x83\xe3\x1e\x8a\x8d\xf3\xeb\xef\x84\x1c\xeb\x66\xb1\x40\x88\xab\xbf\xe9\xad\x2e\x07\xa2\xf2\x25\xc9\x74\xc8\x14\x47\x6f\x58\xdd\xdb\xb2\xed\xe8\xc6\x61\x37\xdf\x20\xd6\x76\x10\xe7\xb9\x34\x66\x83\xa6\xb5\x57\xa6\xbc\xae\x08\x13\xc4\xa5\xc5\xff\x2d\xd3\xbf\x01\x18\xd1\x5d\xdd\x6f\x58\x36\x02\xbb\x34\xac\x0b\xd3\x2c\x9b\x97\xd9\x90\xb8\xf2\x5f\xf3\x3b\x8e\xb2\xa0\xaf\x06\x20\xca\xb0\x10\xcf\x5a\x35\x45\xe1\x6d\x55\x8e\x6b\xc9\x03\x5d\xa7\x70\x08\x6e\xab\x8a\xa7\xdb\x7b\x20\xa8\x99\xc8\x1f\x11\x66\x4a\xd8\x91\x28\xdb\x48\xb4\xdd\xbf\x15\xf7\x6c\x83\xf7\x23\x12\x98\x21\x5c\xe9\xef\x87\x70\xbd\x8c\x63\x66\x50\x97\xa9\x4f\xd1\x9d\xf4\x0b\x77\x1a\x7c\x4d\x60\x63\x38\x3f\x1b\xcf\x66\x58\x26\xfb\x69\x32\x1b\xab\x8f\xd7\x57\xd7\xa3\xb3\xb3\xcf\x58\xaa\x8a\x45\xa5\x58\xa2\x7a\x39\x9a\x42\x15\xf2\xe4\x5c\x7d\x9a\x4e\xae\x26\xe7\xef\xb3\x58\x5c\x7a\xf1\xee\xdd\x78\x3a\x8b\x65\xb0\x50\xdd\x0c\xb5\xa1\xa1\x90\x79\x3a\xbe\x9c\x8e\x67\xe3\xf3\x2b\x2c\x9b\x56\x17\x53\x59\xdb\x7c\xf1\x0e\x2a\x6a\xff\x3e\xc1\x72\xd2\x93\xf1\xf4\x9c\x0b\x9d\xfd\x0b\x33\x35\xfe\x87\xff\xf9\x2c\x53\x93\x8f\x97\x67\x93\xf1\x69\xa6\x66\x57\xa3\xab\xeb\xab\x8b\xe9\x67\xc5\x25\xc1\x7e\x06\x99\x9a\x9c\x9f\x9c\x5d\x9f\xc2\xf8\x3e\x4d\xae\x3e\x5c\x5c\x5f\xa9\xb3\xc9\xc7\x09\x7e\x37\x6b\x7d\xf4\x6a\x72\x75\x36\xce\xd4\xc7\xf1\xf4\xe4\x83\xff\x5b\x2c\x97\xce\xd4\xbb\xc9\xd5\xb9\x5f\x99\x77\x17\x53\x35\xc2\xb9\x9f\x5c\x9f\x8d\xa6\xea\xf2\x7a\x7a\x79\xe1\x3f\x73\x7e\x71\x3e\x39\x7f\x37\x9d\x9c\xbf\x1f\x7f\x1c\x9f\x5f\x65\x7e\x14\x7e\xb8\xa3\xb7\xb3\x31\x95\xc9\x9e\x8d\xa0\x6e\x37\x54\x2c\x9f\x8e\xdf\x8d\x4f\xae\x66\x99\x1a\x9d\x9c\x5c\x4f\x47\x27\x9f\xc3\x8f\x70\x69\xf0\x57\xe2\x05\xe3\xe9\xf4\x62\x3a\xcb\xd4\xa7\x0f\x63\x78\xc1\xc5\x14\xaa\xd2\x4f\x27\xb3\x93\x8b\x9f\xc7\xd3\xd1\xdb\xb3\xf1\x50\xcd\x2e\x3e\x8e\xd5\xdf\xae\xa7\x93\xd9\xe9\xe4\x04\xd7\xf6\xf4\x02\x6b\xe2\xcf\xce\x2e\x3e\x51\x05\xf1\xc9\xd9\xf5\x8c\x0a\x7a\x69\x05\xc5\x4a\x64\x6a\x76\x81\x45\xbd\xf1\xc1\x8f\xa3\xcf\xf8\x92\xcb\xcb\xb3\xcf\xfe\x1c\x7c\xbe\xb8\x86\x43\xf6\xca\x4b\xaa\x80\x58\xb3\xde\x77\x20\x87\x7d\xe8\x7f\x3e\xbe\xbc\x6a\xd5\x2d\x4f\xc7\xff\x71\x3d\x99\x62\x2d\x77\x5a\xb4\xed\x37\xcb\x9f\x8d\xf1\xcf\xfe\xb9\x4f\x93\xb3\xb3\x78\xa4\xde\x8e\xa1\x7c\xfd\x6c\x4c\xdf\xc6\xc2\xf9\xcf\x54\xc8\x7f\xf5\x61\xec\x77\x1e\xb6\xe7\xfc\xb3\x9a\x5d\x8e\x4f\x26\xa3\x33\xd8\xfc\xc9\xa9\x3f\x64\x67\x19\x54\x32\x8f\xff\xe3\x7a\x7c\x7e\x05\xff\x74\x79\x7d\x3e\x81\xb2\xf4\x8b\xa9\x1a\xff\x63\xfc\xf1\xf2\x6c\x34\xfd\x1c\x8a\xe2\x47\x53\xac\xeb\xf6\xc7\xa5\x4d\x07\x40\x9b\xd4\x2a\x2e\xcf\x60\xd8\x6a\xf2\x2e\x8e\xf9\xc3\x68\xa6\xde\x8e\xc7\xe7\x6a\x74\xfa\xf3\x64\x36\x3e\xe5\xc7\x2f\x2f\x66\x33\x3a\x5a\xa1\x7c\x9a\x3e\x0c\x4b\xfa\x7a\xa8\xae\xbc\xa4\x41\x91\x12\xf3\x93\x57\x9d\x5c\x54\x37\xb6\xb1\x36\x95\x41\x61\x02\xa2\xaf\xa6\xf7\x98\xc0\xcc\x88\xe9\x60\x88\xeb\x7b\xf5\x30\xaf\x20\xec\x97\xa6\xc1\xf7\x65\x36\x62\xb9\x4d\xa7\xcc\x06\x2a\xdd\x02\x04\x78\xbf\xfe\x8d\x41\x9a\x3e\x6b\x2e\x18\xed\xa1\x68\x91\x2b\xe8\xf2\x2a\xc6\x67\xc3\xa4\x96\x11\x7c\x05\x86\x7a\xbe\x67\x80\x95\xd9\xe8\x1c\x54\xb6\x17\xe8\x18\x9a\xcd\xc1\xd6\x25\x5f\xcf\x6b\x54\x7e\xfd\x90\xc5\xb0\x53\x47\x99\x3a\xce\xd4\xf7\x99\x7a\x95\xa9\xd7\x08\x2a\xfb\x01\x87\xe6\x9a\xea\x36\xbf\x8d\xe1\x4d\x6e\x43\xb4\xbf\xae\xb7\x05\xeb\x43\x83\xb7\x0f\xdc\x97\xc9\x60\x74\xb2\xaf\x00\x5c\xff\x65\x18\x3d\x89\xc1\x1b\x00\xf0\xd2\xcf\x1c\x18\x0a\xd9\x55\x84\x11\x65\x7b\xb0\x3d\x41\xf7\x54\xc6\xbb\x1d\x02\x4f\x87\xdb\xb8\x84\x86\x25\x5e\x47\x86\xd0\x3b\x9e\x21\x70\x90\x5d\x6d\xb7\xb1\x07\x09\x7f\x10\xc3\x35\x08\x99\xab\xf3\x8d\xe9\xf1\xde\x5a\x98\x3a\xd3\xa9\x69\x85\x21\x42\x01\x44\x5e\xaf\x97\x95\xbe\x6b\xe9\xcc\xa4\x86\x3e\x29\x3c\xe5\xf0\x53\x46\x3d\x4e\x82\x3f\x03\x26\x4c\xd6\xc1\x80\xec\xb9\x15\x03\xc2\x1a\xa6\x29\x21\x72\x06\xf3\xb2\x31\xe1\xd4\xad\x6c\x45\xe0\x6a\x2a\xf9\xa4\xc0\x82\x38\xcd\x11\x1c\x09\x9b\x01\xa7\xe7\x87\xa1\xfa\x98\xbb\x85\x29\x0a\x5d\x1a\xdb\x08\x02\x85\xb1\xbf\xb8\x7e\xe1\xbe\x25\x5d\x4c\x55\x9c\xc2\xdf\x4d\x2d\x79\xbf\x8d\x21\x94\x19\x03\xa4\x5a\x62\x3c\x05\x00\x22\x66\x9a\x7a\x71\xaa\xda\xf5\x1e\xe6\xda\xee\x91\x00\xe2\xbe\x7c\xd3\xec\x5a\xe1\x90\x6f\x9f\x4e\x1a\xb1\xf8\xdd\xe6\x85\x41\x56\x2a\xfc\xc2\x94\x4e\xb7\x66\xcc\xa9\xbc\xbc\xd5\x45\x0e\xb0\xef\xa6\x34\x25\x9c\x1c\x51\xa8\xdb\x71\xa5\x6a\xe5\xd6\x94\x71\x50\x1a\x0f\x97\x1f\x1e\xbc\x24\xd4\x44\xd2\x5b\x5a\x99\x13\x2f\x18\x97\x98\x69\xd8\x7b\xc6\xf1\x88\xb3\x5f\xba\x6a\x2a\x44\x33\x2f\x18\xa3\x0e\xde\x3e\x05\x27\x19\x32\x01\x4e\x8b\x77\x9e\xa9\xb8\x2c\xce\x17\x87\x0a\xa4\x15\x54\x55\xc3\xa1\x59\x8a\xb9\x90\xb1\x9d\x20\x96\x22\xd2\x29\xbe\x08\xd7\x08\x2e\x54\x5c\x22\xe1\xcb\x9e\x5b\x98\x0e\x15\x1d\xec\x59\xed\x30\x1a\x72\x60\x10\xab\x07\x6f\x2d\x2d\x6b\xc7\x85\x2d\x9d\xe1\x1d\x96\xf1\x40\x78\xba\x42\x18\x20\x3c\x12\xdf\x27\xdc\x65\xff\x32\x97\xdf\x94\xd1\x6f\xc0\x10\x28\x3a\x4b\xd8\x0e\x89\xc2\x8e\xfd\x6f\x15\xa8\xd2\xc4\x06\x90\x35\xff\x10\x12\x05\x36\x83\xb8\xf6\x6a\x6e\xea\x3b\x63\xca\x64\x87\xf6\x15\xf3\xc4\x8e\x4d\x5e\xd7\x40\x80\xce\xbf\xab\x32\x7e\x21\xe0\xe0\xb1\xba\x70\x59\xfc\x84\x23\xb7\x55\x7a\x19\xfb\x3f\x01\x22\x9b\x22\xaf\xfc\x9d\x18\x92\x0d\x67\x78\x6e\xd4\x1c\xea\x1e\xa8\x54\x82\x6b\x6d\x75\x21\x52\xa1\x54\xe6\xa2\x77\x14\x42\xe3\xa8\x60\x5a\x50\xc2\xe6\x46\x6b\xe5\x38\x64\x34\x37\x01\x59\x9c\x04\x5e\x36\x0d\xe8\x58\x8e\xb3\xc4\x15\x4d\x90\x2a\xe4\x7d\xfa\xd7\xc7\x5a\xeb\xab\x3d\x38\xc2\x2c\x98\x6c\x2d\xfe\x0c\x88\x23\x9b\x72\xe1\xf5\x5e\xbb\x12\x02\xa0\xdb\xcb\x4a\xaf\xe0\x35\x9c\xa3\x08\x57\x35\x87\x94\x5a\xb8\xce\x6f\x4d\x55\x1a\x75\x62\xcb\x5b\xcc\x60\x87\x58\xdc\x65\xac\x50\xb0\x2b\x75\x26\x6a\x5b\xd5\x88\xcb\xce\xb0\x12\xe8\xd0\xfb\xc5\x1b\x2c\xbd\xb0\xa5\x9a\x99\x6d\x8d\x90\xcc\xe3\x1f\x32\x75\xf4\xe3\xeb\x1f\x07\xa8\x31\xa6\x76\x93\x7c\xc9\xae\xd4\xd1\x8f\xaf\x8e\xf0\x1f\x3f\x4d\x2e\x2f\x54\x64\xd3\xbb\xaa\x8c\x46\x99\x73\xf4\xe3\x8f\xaf\xc4\x23\x97\xb2\xb0\x07\xa0\xd5\x91\x85\x24\xfd\x51\x58\xbb\xeb\xd2\xdf\x0d\xa7\x0b\xf1\x7e\x31\x8c\x43\x80\x8a\x00\x88\xd2\x0f\xff\x6f\x4d\xb1\x53\xc7\xdf\xc1\xc8\x8f\x30\xe8\x1c\xeb\xcd\xe0\x5a\xa6\x5b\x01\x11\x1f\x52\xcf\x64\x31\x79\x83\xe7\x56\x97\x75\x8a\xcf\x48\x60\xc3\x67\x89\xc9\xe3\x6f\x8c\xb3\x0d\xd9\x4b\x73\xc3\xd2\x69\xa9\xf4\x82\x6a\x77\x62\xd2\xa0\xf2\xb7\xc4\xa2\x11\x26\x8e\x36\xed\x67\x88\x79\x0b\xfb\xce\x9b\xaa\x35\xae\x8d\xf8\x01\x0d\x76\x4f\x3c\x02\xb4\x0e\x9c\x3c\xea\x18\xaf\x5c\x93\xd7\x10\x12\xea\x45\xbc\xf6\x5a\x90\x85\xbe\x8b\xbc\x45\xe2\x46\x0a\xfc\xe7\x7e\xdc\x2c\x97\x18\x77\x7e\xe6\x57\x2b\x89\x1d\xb5\xb3\xd8\x21\xdb\xde\x56\x92\x10\xf1\x4d\xaa\x84\x44\xce\x98\x35\x33\xc5\x03\x93\x00\x72\xaa\x3e\x87\x4f\x3a\x98\x96\x73\xc8\xe0\x74\xff\x9e\x3e\xaa\xa3\xf8\xee\x6a\xc9\x0d\x54\x70\x94\x96\xf3\xf6\x3b\x28\xd3\x76\x16\xac\xd9\x3d\x95\x44\x08\x4c\xec\x7c\x4e\x12\xb7\x14\x39\x27\x31\x29\x76\xcc\x6d\xf7\x76\x8a\x1c\x39\xac\xb4\xaf\xd7\xc6\x56\xbb\x80\x13\x5f\x6a\xa8\x54\x13\x63\xc8\x1e\xae\x49\x27\x24\x4a\x86\x92\x1a\x79\x16\x16\x90\x58\xc2\x9a\x53\x50\x4a\xff\xbb\x41\x1e\x95\xf0\x09\x2e\xb1\x4a\xe7\xc8\x6b\x14\x00\x3a\x7d\x9e\xc7\xca\x56\xe6\xc6\xc2\x7f\xdd\x59\x60\xd7\x05\x6d\x8b\xc4\x44\xf9\xaa\xbb\x32\xde\x76\x8f\xd0\xdf\xc8\xd5\xc0\x01\xe1\x84\x4c\x85\x00\xd6\x24\x83\x83\xad\x04\x8e\xa5\xc0\x2f\x43\xa5\xfb\xbc\xc8\x6f\x62\xa5\x1c\xff\x7e\xf8\x84\xc2\xe2\x2c\x4e\x19\x58\x2c\x52\x1c\x54\xc4\x22\x2e\x77\xa8\x1b\xd5\xa2\xc2\x30\x2e\x85\xf4\x2c\x4e\x4e\x2e\xcf\xb2\xee\x34\x43\xa6\x11\x93\x35\xf9\x7f\x99\x90\xd3\x9b\xef\x38\x0c\x4e\x87\x80\xcc\xb7\x4a\x43\x65\xd0\x97\x2e\x25\xcf\x01\x9f\x1a\x88\x5a\xfb\x2b\x13\x9e\xb5\x95\x2a\xec\x8d\xf5\x2f\xe9\x39\x84\x51\x29\xa6\xb9\x07\xb6\x78\x7a\x7e\x35\x54\xa3\x72\x27\xa2\xa5\x0d\x3b\x45\x68\x17\xb5\xfd\xef\xf6\xcf\x9f\x42\x2e\xec\xd9\xa2\xa9\xc0\xa3\x8c\x03\x6d\x9c\xbe\x31\xea\xa6\xc9\x97\xa6\xc8\x4b\x4a\xae\x50\xda\x81\x19\x3a\x40\xee\xe7\xb5\x53\x77\x66\xee\xf2\x76\x81\x54\x9b\xf8\x66\x6b\xcb\x00\x48\x40\x74\x85\xf7\x38\xfc\x0e\xe6\x9b\x07\x28\xc8\xe0\x5c\xc7\xb1\x09\x4c\x79\xdc\x38\xac\x3c\x8e\x09\xbd\xe8\x0f\x74\x16\x9a\xa6\x01\x10\xbe\xc5\xc3\x7c\x48\xc3\x7f\x29\x1e\xd7\x5f\xfa\x67\xf8\xfc\xd3\xd5\xbb\xcb\xb3\xdf\x87\xf8\x95\xfe\xdc\xcf\xff\xfa\xe2\xc5\xab\xef\xbf\x6f\xf1\xbf\x1e\xbd\x7a\x79\xfc\x27\xff\xeb\x1f\xf1\xe7\xf4\x42\x7d\xfa\x30\xba\x82\xa8\xe8\xbb\xeb\x93\xbf\x43\x64\xf7\xd3\xe8\x1c\x62\xc6\x29\x4f\xe8\x13\xe6\x0f\x3f\xce\xd4\xa9\x59\x90\x51\xfa\xe2\xc5\x77\x4f\xda\xb4\xcd\x2f\xbe\x53\x33\xbd\x51\x1f\xec\xc2\xdc\xea\x4a\xfd\xc5\xe9\xcd\xff\x5a\xe3\x7f\x0c\x4b\x53\xff\xf5\xc9\xf8\xd6\x54\x3b\x5b\x72\x3c\x8d\x84\x14\x54\x33\x6d\xd1\x28\x16\xfd\x72\x6f\x4d\x35\xd7\x75\x8e\x90\x21\x76\x15\x64\x55\x77\x14\xe9\x6a\x69\x17\x0d\xfa\xbc\x10\x2f\x58\xeb\xf2\x06\x54\x22\xd0\x40\xe8\xa2\xb0\x77\x18\xe4\x01\x62\x39\x52\x52\x00\x8d\xc9\x1d\x15\x6b\x2e\x87\x4f\xbe\x65\x4d\xfa\x48\x37\x21\x0a\x7e\x72\x71\xf9\x19\x72\x1e\x09\xb1\x2d\x64\x60\x2e\x4e\x27\xef\x26\x27\x90\xfe\xf0\x4e\xcb\x0b\xc4\x51\xff\xb3\x71\xb5\xba\xef\xd3\xbf\x8b\xc0\x19\x3e\x9f\xbd\x9f\x3c\x7b\xfb\xec\xf8\xf7\x22\x7f\x7e\xf8\xfe\x1f\xbf\x7e\x79\xdc\xe6\x7f\x7e\xf1\xe7\xfd\xff\x63\xfe\xcc\xde\x4f\xd4\xbb\xe9\x78\xac\x66\x17\xef\xae\x3e\x8d\xa6\xe3\x90\x64\x79\xfb\xe4\x30\x5c\xf8\xe1\x8b\x0c\x1c\xd1\xa1\x3a\xfa\x21\xf3\x17\xfc\x87\x41\xeb\xd2\xff\x5f\x4b\x5d\xe3\x7d\x44\x7e\x29\xb4\xbd\xc0\x92\xfb\xbf\xd5\x2c\x2f\xf2\x85\x2d\xd5\x7b\xe4\xcc\x71\x99\x9a\x94\x8b\xa1\x1a\x15\x05\x11\x11\xa8\x69\x28\x47\xbb\x8c\x80\x8a\xdc\x25\xc5\xf4\xde\x3b\x07\x92\x01\xbb\xa2\x90\x4d\x86\x75\x66\xbb\x40\x77\x35\xaf\x75\x8e\xbc\x7e\x02\x9f\x9b\x3b\xe5\x98\xd1\x1d\x98\x35\x22\xd0\x8c\xc5\x05\x45\x2a\xf2\xc2\x38\xc2\x96\x33\x07\xfc\xc1\x00\x3e\xb2\x34\xba\x60\x7f\x28\xd0\xc3\xb3\x65\x26\x0c\x8f\x07\x8c\x7b\x91\x2e\xaa\xad\x37\xca\x32\x18\x27\x43\x1e\x32\xb5\x31\x30\xad\xd0\x1f\x7c\x29\x90\xa0\xb1\x98\x2a\x40\x1a\x9d\x41\x38\xa6\x20\xb8\xe0\xd1\x85\x0a\x7c\x94\xaf\x81\xd0\x0c\xa8\x8a\x08\xc4\x1a\x66\x92\x3b\xb5\x6a\xaa\x12\xad\x37\x3f\x5d\xab\x9c\xcd\xda\x38\xd6\x08\x87\x8f\x81\xd8\x9f\x9e\xc4\x42\xc9\x0e\x02\x2f\xae\x05\x64\x49\xf6\x9e\x10\x0c\x21\x8a\x3a\x0b\x81\xaa\x89\x60\x3e\x1d\xe3\x34\x7e\x44\x64\x9a\x59\xe7\x86\xee\x26\x1f\x2e\xec\xe6\xf9\xb6\xb2\x7e\xbc\xee\xf9\xbb\xca\x98\xb7\xcf\x65\x28\x30\xba\xb4\x5a\x2c\x19\x30\xa9\x7a\x4f\x08\x1c\xa9\x2d\xe2\x25\x3a\x4b\x39\x04\x06\xee\x70\x41\x24\xe5\xf6\xc1\x68\xa6\x26\xb3\x83\x98\xd9\xa6\x1c\xee\x67\x99\x40\x0f\xc9\x72\x75\x31\x8d\xe9\xf2\x90\x16\x57\x6f\xaf\xaf\x20\xb3\x0b\x59\x71\xcc\xf1\x43\x4e\x33\x49\x8c\x73\x46\x7c\xf4\xd8\x8c\x38\xe8\x9a\x56\x52\x7c\x98\xe4\x77\x67\x1f\x46\x67\x67\x6a\x36\x39\x9b\x9c\x5c\x9c\xab\xf7\xd3\xd1\xe5\x87\xc9\xc9\x0c\x46\x36\x14\xe9\x5e\xce\xe9\x02\x87\x79\x16\x12\xb4\x21\x8b\x1e\x48\xcd\x63\x5e\x7c\x02\x9c\xea\xa3\x13\xa6\xac\x16\x14\xd8\x17\xd3\xab\x16\x3e\x80\x33\xbd\xef\xa6\x17\x1f\x33\xce\xf7\x5e\x4c\x89\xfb\xfa\x7c\x8c\x6f\xf1\x0b\xac\x92\x7d\x90\x59\xe0\x98\xd1\x1f\x9d\x4d\xce\xdf\x03\x2a\x42\x3e\x1c\x1c\x48\xed\xb8\x46\x87\x03\x1c\x18\x53\x40\x5c\xad\x00\xca\xee\x91\x59\x49\x88\xb4\xe1\x4a\xe3\xe5\xad\xa9\x6a\xf4\xbe\x13\x67\xc7\x5f\xbf\xca\x6e\x6c\xcd\x1c\xa4\x85\xc9\x10\x6f\x16\x81\x37\x40\xc8\xe2\xc2\x58\x3a\xd2\x25\xf5\xf9\xd8\x11\x15\xb1\xd5\xfe\x91\x3e\xd2\x58\x18\x3e\xff\xf4\xf2\xe4\x77\xb5\xfe\x1f\xd4\xff\xdf\x1f\xbd\x7a\xd1\xb6\xff\x5f\x1e\xbf\xfa\x53\xff\xff\x11\x7f\x3e\xbd\x3c\x89\x37\xea\xfc\xe2\x6a\x72\x82\x82\x23\xd8\xb7\xfe\x4c\x02\x11\xc8\xa1\xa0\x4d\x5f\x06\x8d\x9a\xb5\x74\x28\xf3\x18\x4e\xc7\xa3\xd3\x8f\x63\x49\x5e\xcd\x51\x8f\xbc\x36\x1b\x37\xf0\x2a\x07\xe9\x2a\x03\x80\x80\x32\x33\x51\x8b\xac\x6d\xb1\x34\x95\x13\x61\x9a\xa8\x81\x38\x9c\x15\x9a\x24\xbc\xdd\x45\xf5\xef\xef\x18\xa5\x7d\x9e\x5b\x24\x03\x42\x25\x44\x73\xc1\x22\xb1\x43\x11\xa6\x34\x03\xcc\x30\x60\xb0\xc8\xff\x2b\xc1\x29\xf4\x32\xe3\xd4\x8b\xb5\x4b\xce\xc3\x31\x84\x41\x54\x97\xc5\xa1\xf5\xe5\x2b\x13\xbb\x86\xfc\x9c\xa8\xf5\x5b\x0e\x4f\xd7\x64\xc9\x6b\x97\xae\x73\xd6\xe1\x55\x94\xb8\xbe\x2c\x84\x1f\x39\x3e\x96\xa4\x0f\x0d\xc8\x1f\x22\x22\xea\xb3\xb2\x52\x42\x1d\xbf\x1a\x92\xfc\x20\xce\xd4\x96\xca\x6b\x90\xd4\x00\x49\x06\x9e\x1e\x0e\x5b\x45\x1d\xeb\xcf\x84\xb1\x2b\x69\x30\x25\x14\x0a\x68\x58\x40\xde\xbe\x36\x5f\xeb\x60\xca\xd1\x19\x05\x24\x76\x61\xc9\x7e\xb8\xcd\xcd\x1d\x87\x67\x1b\x27\x48\xd7\x2a\x13\xd7\x15\xb2\xb9\xad\x96\x03\xc3\x27\x10\x27\x93\xed\x0b\x12\x36\xf3\x6d\x65\xb7\xa6\xaa\x77\xa2\x24\xcc\x65\x5c\xf6\x82\xa5\x7e\x7d\xbb\xad\x26\x2b\x55\x7a\xff\x16\xde\x4a\xf9\x16\x7f\xd3\x78\x6d\x66\x6b\x5b\xd5\x14\xe6\x56\x6e\xcd\x18\xce\x70\xbd\x0e\xd7\x3b\xff\x5d\x3f\x71\xe0\x4a\xf4\x86\x4f\x05\x0c\x26\xfc\x57\xec\x35\x0f\x60\x5f\xc9\x34\x9d\xdb\xe5\x2e\x44\xdc\xef\x99\xfa\xc2\x2e\xcd\xf0\x09\x7d\x9e\x9e\x67\xae\xa2\xe0\x65\x33\x97\x05\x5b\x7f\xde\x3a\xce\x7a\x6c\xba\x2e\xcb\xd1\x50\x1d\x7e\x82\x64\x3f\xb4\x01\x5b\xc2\x09\xa2\x33\xa5\xae\xa7\x93\xf0\xca\xb0\x7f\xa0\xc7\x62\x3a\x67\x01\x6d\xeb\x1d\x77\x44\x18\x0e\x9e\x44\x94\xa4\x7b\x02\x50\xb0\x20\xb3\xb0\xb9\xcc\xc9\xf5\x47\x46\x32\xf6\xd8\x67\xd9\x01\x79\xe8\xdc\x4d\xe4\xc3\xc5\xd9\xe9\x78\x8a\x5d\x5d\x1e\xc4\x42\x7e\xbb\xf9\xd6\x06\x35\xb6\x6c\x37\xff\x9e\xc4\x7a\x3b\xff\xdc\x67\xbf\x81\x7d\x43\xb1\x00\x01\x75\x93\xf6\x4f\x3a\x71\xc0\xeb\xf9\x91\xb0\xc9\x07\x6f\xbe\xfa\x30\x99\x9e\xc2\xfb\xfd\x57\xae\xc6\xe7\x57\xb3\x2c\x2e\xc5\x2c\x53\x57\xd3\xd1\xe9\xf8\xe3\x68\xfa\x77\x61\xd3\xe1\xbf\x0d\x9f\x74\x97\x2c\x7c\xa4\x6b\x20\x9e\x4e\xa6\x63\x6f\xe3\x4d\xce\xf9\x7f\x11\x0c\x10\x5b\xb9\x08\xf0\xdf\x3e\x94\x5f\xab\x65\xcc\xde\xa9\x0e\x41\x38\x80\xa9\x06\x5e\x0e\xc7\x80\xe1\xde\x77\x15\xc8\x46\xef\x60\xc8\xfb\x4d\x36\x74\x46\xf2\x1a\x5c\x49\x76\x22\xe9\x94\xba\xb6\x45\x46\xf9\xf3\x45\x16\xab\x00\xc0\x46\x8b\x5e\xcb\x50\x5d\x41\x1d\x15\x49\x7a\x01\x00\xeb\x38\xa3\xe5\x6e\xbf\x43\x8a\xf5\x2e\x58\x74\x57\xe7\x9b\x88\xa3\x03\xe1\xdf\x99\x27\xe4\x76\x8c\x43\x9d\x4d\x75\xe9\x3f\xc9\xa6\x64\x77\x2f\x21\x72\x7d\x02\x65\x16\x75\xde\x6c\x9e\x9f\x99\x1b\x5d\x3c\xf7\x86\xd7\xf3\xf0\xba\x67\x3c\xc0\x67\x60\x90\x1d\xbf\x3c\xc2\x37\xae\x6c\xb5\x69\x62\x61\xd2\xa7\x97\x27\x4f\xd9\x74\x26\xb2\x17\x8c\xc1\xcd\xcd\x02\x36\x06\xcb\x4e\x6d\x19\x83\x85\x2f\x8f\x94\x7f\x25\x21\x01\xb8\x9e\x1f\xe9\x09\x5c\x4b\xf9\x07\xbe\x77\xfe\x04\x58\x16\x94\xcb\x11\x11\x3f\x62\x78\x82\x7d\x85\x65\xd9\xe8\xda\x54\x39\x00\x10\x63\x5b\x0c\xcc\xda\xfa\x77\x06\x3b\xe3\xd3\xcb\x93\xcc\x7b\x94\x5e\xd4\x13\x94\x61\x3c\x3d\x99\x7c\xc4\x24\xe3\x9d\xd2\x6a\x6d\x5d\xa4\xdb\xf0\x4f\x87\xe4\x6b\x70\x44\x23\xdc\x86\x0f\x05\x88\xc4\x65\x4a\x56\x10\xcc\x8c\x8c\xb0\xf2\x71\xc2\x7a\x33\xcf\x6f\x1a\xdb\x50\x02\xd8\x3f\x7f\xd0\x38\x73\x30\x54\x17\xec\x45\x50\xa2\x83\xdf\x98\x0b\x72\x01\x8a\x60\x46\x6a\x56\x7a\x06\x6c\x06\x17\x8e\xa7\xb3\xf0\xa4\x77\x46\x0c\xe1\xf5\xd6\x46\x79\x27\x39\x6a\xa4\x77\xb6\x29\x97\xb0\xb9\x4f\x1d\x40\xf4\x9d\x63\xb8\xc5\xfb\xcb\x33\xc5\xdd\x1f\x10\xbc\xe4\xdf\x7f\x31\x9b\x3c\x75\x6a\xe1\x6f\x51\xa8\x27\x88\x96\xda\xc5\x16\x1a\xe9\x01\x97\x4e\x6c\x3e\xf4\xef\x91\x33\xf9\x77\xfa\x33\x7c\x3e\x5a\xda\xb9\x79\xf6\xbe\xd8\x6d\xd7\xbf\x93\x1f\xf8\x80\xff\xf7\xf2\xc5\xeb\x57\x2d\xff\xef\xe5\x8b\x97\x47\x7f\xfa\x7f\x7f\xc4\x1f\x11\xc5\x5d\x0c\xd4\xd1\x8f\x3f\xbe\xce\x8e\x7e\xfc\xf1\x87\xcc\xef\x85\xff\xff\x5e\x2b\x38\x1f\x6a\xb6\x73\xde\x6f\x53\x13\x51\x4d\xff\xfb\xc4\x6a\xbb\x31\xd9\x56\xac\xf4\x57\x04\x47\x5b\x3e\x54\x1a\x21\x05\x75\xe1\x28\xfc\xc9\x22\xb6\xe5\x0c\x01\x57\xd9\x33\x75\x6e\x5b\xfe\x96\x59\x22\xd0\xb0\xa7\x57\x59\x67\x62\x22\x15\x05\xd5\xc7\xf8\xca\x7b\xc2\xa8\x01\xde\xdc\x0d\x8b\x3e\x18\xe1\xec\x99\xf7\xef\x14\x63\xef\xee\x5b\x26\xd8\x5b\xb1\x80\xc0\xde\x95\x6d\x0f\xcc\x45\x4e\x05\x6a\x2e\xd5\x5d\xb0\x5f\xb1\xff\x30\xfb\xd6\x17\x7f\xc9\xc6\xc7\x17\x11\xab\x3f\x63\x91\x02\xf2\x12\x13\x8b\x18\xd3\xe0\xa5\xe9\x92\x16\xf1\x9c\x86\x4f\xf0\x5e\x25\xf1\xc4\x88\x31\x8a\xe0\x22\xf6\xe4\x0b\xeb\x60\x3b\x2b\x73\x6b\xca\xc6\x10\xa6\x76\x95\xd7\xd4\x6c\x02\xf0\x2f\x95\x59\xd4\x12\x2c\x24\x10\x44\x09\x66\x48\x84\x65\xb0\x57\x41\xc5\x28\xa2\xc8\x1e\x19\x6a\xc9\x6b\xef\xaa\x1e\xde\x9b\xd7\x28\xcd\x4d\x91\xdf\x18\x62\xa9\x26\x14\x58\xc1\x65\x48\x58\x5a\x5f\x57\x7a\x11\x7b\xa3\x10\x5a\xca\x56\xd0\x04\x0a\x59\xff\x6f\x2a\xe4\xf7\xf6\x33\x54\xf9\x8a\x24\x4f\xec\x2f\xb5\x24\x54\x61\xa5\xd6\x7a\xc9\xbd\xcb\x6a\x0b\x34\x8e\x81\xa9\xdc\x3a\x97\x47\x88\x35\x18\x8d\x34\x35\x04\x86\xe2\x4b\xa3\x91\x98\x90\x4d\x83\xe9\xc4\x41\x7d\xbf\x02\xb9\x1b\xd2\x2f\xd8\xbe\x83\xe2\x1d\x8e\x06\xc0\x45\x66\x20\x54\x16\x69\x49\x33\xae\x74\x06\x54\x6b\x2c\xf8\xc3\x7a\xd5\xe8\x5a\xb4\x06\x93\xd0\xa9\x53\x41\x21\x23\x9d\xe0\x17\x16\x21\xc7\x0b\x53\xc1\x0d\xdc\x98\xca\xfb\xde\x75\xc0\x94\x57\x6a\x95\xd7\xa5\x71\xc4\x53\x8a\x88\xe3\x45\xe3\xf7\x37\x20\xa5\x2a\x20\x9d\xce\xcb\x55\x95\x8b\xf6\x6e\x50\x02\xb2\xce\xab\x25\x1d\x3b\xca\x52\x55\xe6\x46\x57\xc1\xdb\x6f\x0d\xf7\x4f\x6b\xee\x7f\xfe\x9f\xe1\xf3\xf7\x27\x27\xcf\x02\x03\xfb\xef\x82\x03\x78\x08\xff\xf3\xfa\xbb\x76\xfe\xff\xe5\xab\xe3\x17\x7f\xda\x7f\x7f\xc4\x9f\x89\xe8\xa3\xc5\xb0\xc9\x60\x1d\x04\x54\xf3\xfb\xf3\x6b\x75\x96\xcf\x01\xb2\xfe\x1e\xc1\xa9\x54\x02\x14\xb1\xb7\xf7\xb9\x94\xea\x06\x88\x8b\x77\x50\x9a\x13\xb0\x9b\x49\x44\xbc\xc8\xcb\x2f\x64\x05\x6c\xb6\x79\xd1\x76\xa1\x73\x87\xa6\x20\x90\xce\x2f\xec\x66\x4e\xf5\x7e\x54\xea\xc0\x6d\x68\x11\xba\x1e\x14\x7c\x12\x54\x87\xee\x21\xf4\x44\x50\x62\x18\x29\x8d\xc0\xc1\x85\xdd\x84\x36\x05\xb5\xa4\x6f\xa1\x01\x0c\xd5\xa1\xd7\x22\xfd\x8b\x90\xd0\xda\x7a\x63\x42\x6f\xb7\xc5\x2e\x12\xfb\x52\x41\x86\x7b\x03\xe2\x39\x10\xbe\xd7\x6b\xb3\x53\x0b\x0b\x8d\xa4\x92\xea\xfc\x55\x08\xbc\xb6\x72\x04\x10\x1c\x5a\x9b\x92\x34\x44\xf9\x25\xf4\xa8\x2c\x93\x95\x50\xc3\xc1\x03\x32\x7a\xf8\x7c\xd1\x54\xc5\xef\x9b\x00\x7c\x08\xff\xf3\xe2\xe8\x75\x07\xff\xf7\xfa\xfb\x3f\xef\xff\x1f\xf1\x27\xe9\xe5\xad\x2e\xc7\xd3\x8f\x93\x19\x94\x9b\x63\x9e\xe5\x49\xc7\x3f\x7c\xa5\x9e\xa9\xe3\x17\x47\xdf\x67\xea\x54\x97\xb9\x29\xd4\xac\x36\xe5\xdc\x54\x37\x99\xfa\xcb\x12\xfe\xe6\x7f\xad\xf5\xd7\xaf\x43\x67\xfe\x3a\x7c\x32\x8a\xe8\xee\xaa\x0f\xe1\xd3\x0f\x82\xb9\x37\x1d\xd6\xce\x6c\xb5\xf3\x60\x2b\x63\x1e\x4e\x69\xd5\xbf\xc8\xd9\x12\x55\x4e\xc1\xc3\xfa\xf7\xc1\x86\x50\x95\x7d\xc8\x15\x50\x0a\xa0\x07\x31\x02\xac\x0a\xd0\xba\x7d\x96\x36\x69\xe7\x1c\xc1\xff\xe9\xd8\x11\xdd\x89\xcd\xff\x8b\xe1\x46\x48\xb3\xb4\x47\xf9\xa7\x41\xff\x7f\xdc\x9f\xe1\xf3\x7f\x98\xca\x7e\xfd\xef\xc4\xff\x1f\xbd\x7e\x71\xd4\xc5\xff\x7e\xf7\xa7\xfe\xff\x23\xfe\x74\xf4\xfb\xf7\x19\x6a\x79\x38\x16\xea\x84\x82\xbd\x90\xd3\xec\xc5\xeb\x5e\x13\xba\x84\x41\x36\xbd\x90\xdb\x6d\x85\x34\x6a\xdc\x14\xb2\x1d\x02\xc4\x58\x13\xd4\x02\xb5\x7e\x5c\x09\x12\x33\x2c\x6a\xea\x07\xf6\xda\x8a\xa3\x18\xad\x97\xa7\x34\xcd\xf7\x28\x7e\xbb\xea\xce\x99\x52\x6f\x7e\xec\xd0\x23\x33\x14\xc1\xda\xd2\x28\x6c\x18\x92\xd7\x38\xac\xc4\x36\xef\x1b\x5e\x67\xd2\x1d\x92\x6a\x8d\xec\x86\x5c\x1a\x79\x5d\x82\x9b\x34\xab\x01\x37\x6b\xbe\x6e\x6d\x85\x04\xe3\x95\x2d\xa8\x7d\xd9\x55\xf2\x91\xbc\xd3\x56\x1c\xd1\x0f\x30\xea\x7f\x8c\xa7\x17\xff\x50\x27\x17\xd3\xcb\x8b\x29\xc2\x05\x4e\x27\x33\x50\xcb\x33\x00\xf1\x3c\x1e\xef\xd0\x25\x71\x02\x75\xd9\x65\x31\xea\x83\x3e\x78\xc3\xe3\x61\x2e\x27\x34\x4f\xae\xfc\x97\x66\x57\xa3\x73\xf8\xac\x37\x23\x50\x51\x83\x85\x05\x46\xaa\xb7\x0d\x46\x93\xf3\xf1\xa9\xfa\x30\x9e\x8e\x27\xe7\x19\x32\x12\xb1\x51\x01\x5f\x60\x9b\x63\x3a\x9e\x5d\x9f\x5d\xb1\xb1\xd0\x31\x07\x26\x57\x33\x30\x07\x26\x33\x9e\xfe\xd9\xe7\xb0\x44\x7e\x01\xd8\x3e\x61\x93\x03\x4d\x0c\x69\x9a\x1c\xc6\x35\x3a\x1f\xbf\x3f\x9b\xbc\x1f\x9f\x9f\x8c\x07\xfe\xe5\xb3\xab\xe9\xe4\xe4\x4a\x5a\x3b\x4c\x55\xd4\xdd\x96\xc9\xec\x9b\xd8\x8a\x7e\xe5\xfd\x1f\x3e\xff\x38\xb9\x3a\x7f\x37\xfa\x3d\x15\xc0\x83\xf5\x1f\xaf\x3b\xf8\xcf\xd7\x47\x7f\xca\xff\x3f\xe4\xcf\x9f\xe5\x16\xff\x3e\xe5\x16\xbf\x26\x4f\xf8\xd8\x4a\x88\x53\xa1\xe6\xb0\x7d\x43\x51\x30\x93\x74\xfb\xe9\x84\x1c\x80\xdd\x1e\x42\xdf\x04\x26\x20\xa6\xf2\xd9\x11\x93\x25\x93\xdc\x36\x65\xa8\xf5\x8b\x6b\x4c\xee\x57\x07\x2c\x4a\x4d\xc6\xe2\x0c\x8a\x1d\x66\x60\xb9\xf9\x09\x24\x64\x96\xb9\x03\xad\xb8\x6a\xca\x05\x72\x20\x08\x22\x9e\xf8\x11\xdb\xd4\x2e\x5f\x9a\x76\xee\x14\x8a\x0e\xcb\x55\x7e\xc3\x64\x5f\x1b\xb3\x58\xeb\x32\x77\x1b\xd7\xc1\x30\xc7\x97\x85\x85\x0f\xb3\x91\x38\xa6\x3e\x4e\xcd\x79\x73\xa3\x2a\x03\x3b\x50\xde\x28\xb3\xd1\x79\xc1\x6d\xde\x89\xa3\xa3\xa9\x28\x6f\x45\x25\x33\x95\x81\x3e\xc1\x4b\xd9\x19\x15\xd9\xda\x25\xeb\x35\x27\xc8\x88\x84\x06\x69\x2f\x1c\xf4\x0d\xe1\xaa\x7a\x02\x72\x52\x83\x57\xbf\x6e\x4b\x62\xb4\x29\x76\xff\x3e\x81\x8e\x3f\x43\x1a\xe3\x68\x36\x0c\x9f\xbf\x9d\x9d\x3e\x3b\x7e\x76\x52\xe8\xc6\x99\x67\xe7\xa6\x7e\x3b\x3b\xfd\x8d\x8d\x81\x87\xf4\xff\xf7\xdf\xb7\xfd\xbf\x97\xaf\x5f\xff\x89\xff\xf9\x43\xfe\xa4\xfe\xdf\xf1\x8b\x17\x3f\x40\x96\x1c\xcf\x81\xc8\xe0\x88\x92\xcd\x4e\x40\x17\xbc\x90\x16\x66\x1b\x33\x28\xc1\x10\x08\xcc\xe7\xa8\x0c\x7a\x3f\xe1\x85\xe7\x93\xa9\x49\x1c\x29\x10\x77\x0e\x38\x2b\xa8\x31\x9f\xff\x9b\x79\x5e\x6a\xe4\x58\xd9\xb8\x87\x2a\x21\x12\x0f\xb2\x27\x0c\xdc\xa7\x65\xe1\x47\x1b\x83\x68\x9f\xa3\xa1\x4a\x07\x85\x9d\x17\x70\x34\x30\x6b\x70\xe4\x2a\xe3\x35\xd3\x3d\x0e\x66\xc6\xb8\x55\x04\x95\xca\xaf\x75\xda\x0d\xc5\x6a\x03\xee\xde\xdd\x1e\x42\x5e\xca\x55\xe0\x21\xc8\x5e\xcb\xbf\xe5\x28\xd8\x16\x4b\x0d\x38\xb2\x8a\xa8\x69\x65\x40\x54\x84\x35\x0e\xea\x48\x0e\x7d\xd8\xc2\xef\x4b\x45\x42\xcc\xc6\xe7\xe3\x2b\x38\x19\x17\xd7\xe7\xa7\x44\x12\x0c\x25\x89\x54\x65\x8f\xd5\xf4\x5e\x52\xff\xe7\x7f\x82\xe6\x79\xfa\x14\xfe\xc9\x0b\xe5\xae\x8e\x49\x1c\x5b\x41\x45\xdc\x87\xda\xff\x6d\xdd\x58\xe5\xa7\x17\x3d\xc8\x7d\x6a\x27\x4e\x93\x60\xf2\x71\x7e\x8f\x81\xd8\x4b\x82\xdd\xc0\xba\x1b\xe8\x74\xb3\xfd\xd0\xfb\xc3\x07\x16\xe3\x72\x7a\x71\x72\x3d\x0d\xa9\x81\xd9\xf5\xdb\xd9\xd5\xe4\xea\xfa\x6a\xac\xde\x5f\x5c\x9c\xc2\x12\xcf\xc6\xd3\x9f\x27\x27\xe3\xd9\x1b\x75\x76\x31\x83\x75\xba\xf6\x1a\xec\x74\x74\x35\x82\x0f\x5f\x4e\x2f\xde\x4d\xae\x66\x6f\xfc\xff\x7e\x7b\x3d\x9b\xc0\x72\x4d\xce\xaf\xc6\xd3\xe9\xf5\xa5\x9f\xf1\x40\x7d\xb8\xf8\x34\xfe\x79\x3c\x55\x27\xa3\x6b\xef\xf1\xfa\x75\x25\x5e\x61\x62\x14\xbe\x78\xb7\x47\xa3\x46\x25\xda\xf5\xae\xbd\x2e\xdc\xeb\x91\x27\xfa\x76\x20\xfd\x79\xff\xd9\x4f\xa3\xcf\x91\x73\x58\x14\x5e\x88\x33\x1b\xbd\xf7\x47\x3b\xea\xff\xb2\x91\xf5\xe1\xf3\x93\xd3\xd3\xb3\x67\x47\xbf\x23\xfd\xc3\x03\xfa\xff\xbb\x17\xdf\x7d\xff\x5d\xc7\xff\xff\xee\x4f\xfd\xff\x87\xfc\x39\xb9\xf8\xf8\xf1\xe2\x5c\x9d\x8e\x7f\x1e\x9f\x5d\x5c\xc2\x65\x87\x8a\x2a\x49\x5a\xc2\x8c\x10\x87\xfe\xa8\x0c\x02\x0d\xcc\xd1\xf0\x05\xe9\xc7\x08\xf0\x0f\x9d\x2c\x8e\x86\x47\x43\x75\x70\xc2\x6a\xdf\x56\x07\xd4\xee\x09\xe8\x3c\x23\x4d\x74\x60\x89\xe6\x8e\xf9\x00\x17\x75\xc4\x72\x46\x36\x43\x28\x18\x43\x1e\x26\x74\x66\x3e\x4a\x07\x30\x7e\xf6\x38\xfd\xac\xa2\xd1\xf2\xe7\x09\x61\x32\x4f\xe8\xa2\x85\x1b\x16\x3d\x37\xcc\x9f\x25\x5f\x09\x1e\xac\x56\xf2\x13\x87\xd8\xe0\x68\x10\xf9\x25\xd3\x5f\x41\x50\x76\x4e\x13\x14\x90\x3c\xf1\x8e\x38\xfe\x97\x30\xfe\x5b\x53\x09\xc7\x97\x07\x7f\xa8\x07\xfb\x46\xeb\x87\x31\x1f\xa4\x1f\xc6\xbf\x5d\x0c\xfa\x26\x8d\xc1\x17\xe1\x4f\x77\xde\x89\xea\xbb\xf3\x5c\xeb\x0b\x79\x89\x3b\x0a\x7d\x7d\x62\x30\xa6\x5d\xe6\x19\xe7\xf7\xdd\x50\x1d\x8c\xbf\x9a\x45\x03\x98\x4f\xb9\x2d\xed\x59\x33\x9d\x28\x18\x38\xa2\x96\x87\xaa\x4a\x4e\xa0\x86\x91\x5f\xfb\xfd\x50\x1d\x4c\xfc\x19\xd4\x85\x3a\x35\xb7\xa6\xb0\x5b\x53\xc9\xb7\xef\x3f\x72\x48\x47\x81\xb4\x81\xdd\x55\x10\x54\x65\x7b\x49\x85\x8f\x86\xaf\x86\xea\xe0\x4c\x57\x37\xa6\x02\x96\x39\xfe\xb0\xc6\x14\x04\x56\x36\xe2\x0e\x18\xd7\x9d\x68\x4f\x5d\x2c\x97\x78\x2d\x0d\xf2\x3a\xfa\x9f\x88\xe2\xa5\x7e\x7e\xf8\x30\x9c\xd7\x7e\x38\xd4\x12\x33\xac\x41\x82\x3e\xe6\x27\x7f\x08\x4f\xca\xed\x58\xeb\x5b\xc6\x7c\x06\xde\x71\x08\x0a\x86\xbe\x1c\x1b\xfd\x55\x52\x05\x23\xec\xb6\x30\x11\x3e\x4c\xe6\x35\xb0\xb9\x31\x99\x26\xed\x0f\x55\x3a\x61\xc8\x09\x31\xc9\xc5\x4e\xe9\x05\xd2\x7f\x67\x58\x13\x57\x2e\x31\xb4\x94\xb4\x85\x5f\xd8\xf2\xd6\xec\x88\xb8\x36\x2f\xe3\x34\x7e\x1c\xaa\x83\xe4\x64\xca\xad\x17\x07\x06\xde\x1b\x8f\x1f\x9d\xad\xa4\x09\x69\xb0\x7f\x7f\x8a\x5d\xfa\x47\x98\xe3\xc1\x62\x04\x6a\x8f\xd8\x14\xb5\xe3\x8e\xbc\x12\x43\x97\xa9\xa5\x29\x4c\x2c\x6b\xb5\xfd\xa8\x2e\x02\xbb\x63\x0c\x0d\xdf\x7c\xef\x6d\x04\xbc\x37\x95\x79\x25\x33\x7d\x13\x87\xf9\x16\x87\x59\x9a\x3b\x31\xd4\xd0\x92\x96\x31\xe5\x7b\x65\xde\xde\x6f\xbc\x51\xb6\x8a\x5f\x39\xe9\xfb\x4a\xee\x12\x1f\xef\x5e\xca\xbf\x07\xfa\xb5\x47\x0d\xf2\x62\xa8\x0e\x3a\xa3\xfc\xc6\x9d\x5d\xd8\xcd\xb6\xa9\x4d\x25\x7d\xd1\x65\x1c\x34\xd3\x8e\x17\x3b\x26\xd6\xef\x23\x4f\x15\x63\xf2\x6a\xed\x52\xc3\xa1\x3f\x01\x08\x78\xb8\xeb\xb0\xbc\xf0\x0f\xe0\x35\x1d\xba\x41\x06\x85\x84\x58\x75\x48\x24\x98\x98\x34\x8c\x67\xfd\xbe\xf8\x75\xe6\x7d\xd0\xb5\x45\xf4\xd2\x02\x10\xe6\x70\x2d\xb6\x90\x4b\x6d\x1c\x7e\x07\x85\xb0\xf8\x7a\xbc\xce\x8a\x63\xf9\x52\xc1\x1c\x79\x0d\x29\x16\xae\xad\x5c\x90\xe3\xf0\xa1\xf5\x0b\xf4\xbb\x69\x1c\x56\x57\xbc\xdd\xe5\x12\x14\xd2\xde\xe8\xbf\x0c\x44\x93\xf3\x4e\xbd\xde\x12\xb9\x7e\xe4\xf5\xe1\x67\xdb\x1c\x40\x27\x01\xff\xbf\xaa\x83\x41\x58\xf1\x96\x54\xd7\x54\x55\x40\xd2\x5d\x34\x31\x93\xf4\xb3\xc4\x0d\x07\x89\x57\x5e\x78\x29\x6b\xf8\x54\x66\xad\xe6\x1b\xef\x6c\x25\xdf\x0f\xad\xc5\x70\x68\x91\x94\xb7\xdc\xf1\xc7\x59\xe6\x43\xba\xd6\xef\x91\xe3\xff\x28\x40\x8c\x73\xd7\x03\x3c\x6c\xb4\xe8\x9c\xdd\x85\x21\x01\x67\xf6\x3b\x1b\xa0\xfb\xf1\xa6\x2c\x83\xbd\x95\xa9\x03\xfa\x4d\x7b\x1b\xb7\xf6\xce\x4f\x15\x6b\x42\x54\x52\x1f\x52\x5b\xb5\xd0\x1c\x67\xc7\xbf\x24\x76\x86\x8d\x2e\x75\xac\x09\xc0\x8e\x0f\xd4\xc4\x32\x94\x85\xec\xba\xc5\x1c\x58\xa5\x4a\x26\x48\x2c\xdc\xb5\x2b\xb5\xb1\xd0\x49\x55\x97\x6a\x95\xaf\xb0\xba\x7a\xe1\xdf\x7e\xf8\xfd\x8b\xff\xdf\x80\x17\xdc\x36\x75\x60\xa3\x75\x6b\x5d\xa1\xf9\x37\x37\xa5\x59\x61\xff\xa9\xe4\x95\x62\x54\x1c\x1c\x61\xf8\xed\x7b\x7f\xd6\x83\x2d\x78\xec\x4d\xd0\xab\xb5\x51\x1d\xbb\x00\x1f\xe4\xe7\x4e\x38\x06\xc2\x10\x04\xe8\x0a\xd5\xa6\x48\x0d\x9d\xa1\x86\x47\x6a\x6e\x0a\x7b\x97\xb0\x57\x63\x15\x70\xa8\x9e\xe8\xe7\x90\xe0\xeb\x5a\xf7\x8e\x49\xe6\xde\xa8\x2b\xaa\xb7\x1e\x8a\xe5\xb3\x3b\xec\xa4\x8a\x7c\x1d\xcf\x56\x95\x31\x19\xd4\x70\x98\xaf\x8b\xa2\x71\xf9\x6d\x28\x2f\x16\x1a\xcb\x1f\x03\x3c\x5a\xfd\x63\xa1\x0b\x71\x28\xec\x2a\x12\x1f\xb6\x8a\xf5\xf4\x83\x96\x30\xe9\x8c\x3a\x0b\x89\xb5\x2a\xb6\x91\xe3\xec\xda\x32\x77\xdb\x42\xef\x32\xbf\xeb\x5e\x9c\xc8\x9c\x5a\x17\xe4\xd9\xa7\x90\x0e\x7b\x2c\xa3\x41\x37\xe2\xd7\xb2\x49\x29\x2e\x25\x3b\xd2\x29\x61\x9c\x85\xa2\x3b\x5a\xa9\x39\xaf\x54\x22\xd6\x15\x57\xc8\x04\x9b\x6b\xa3\xbf\x08\x6e\x19\x4a\x07\x12\xe4\xa5\xc7\x22\xa7\x9e\x09\x19\x32\xc9\x78\xa1\x98\xe1\x4a\x51\x93\x54\x93\xc1\x0b\x50\x1a\x61\xd3\xee\x95\x7f\xa9\x2e\x62\xc2\x31\xea\x50\xbf\x96\xd6\x75\xbb\xe1\xde\xbf\x54\x43\x31\xcd\xc5\x00\x2e\x43\xe8\xe1\xd3\x6d\x40\xe7\xfc\x95\xf1\x07\x27\x08\xef\xca\x88\x06\xd2\x94\x50\x05\xca\x8f\xee\xf1\x45\x2b\x3a\xee\xa8\x6b\xdb\x00\x5f\xa8\xe2\xfd\x3e\x13\xbb\xb6\x4a\x27\x17\xe9\x91\xb6\x82\x9f\xdf\x72\xd0\xa1\xb6\xe6\x3b\xeb\xa7\xe5\xa7\x83\xfd\x75\x4a\xcb\x47\xbd\x88\x5c\xe6\xb4\x1a\x3f\xa9\xc3\x23\xec\xd3\x1b\xad\x04\x7f\x15\xc1\xa4\x33\xb1\x2c\x60\x8f\x07\x76\x3c\xa0\x52\xbc\x58\x5c\xe5\x50\xd6\xfa\x53\x14\x1b\x1b\xf7\x19\x84\x7b\x5e\xc9\x8d\x79\x1f\xe3\xb4\xca\x5a\x88\x14\x7a\x74\x9b\x2f\x8c\x10\x8c\xc7\xc3\xc4\x81\xfd\xef\x15\x87\xe0\x3f\xca\xe1\xfc\x4f\x90\x84\x72\xbc\xbf\xa1\x08\x4c\x03\x07\x18\x0c\x01\x01\x04\x5a\x2f\x09\x3a\xf4\x8b\x46\x4a\x09\x63\x21\xa3\xc8\xa1\x43\x2d\x63\x26\x0f\x48\x5b\x68\xf6\xf8\xa5\x7f\x84\x20\xcd\x5a\x92\xf4\x9e\xd0\x89\x9c\x3e\xcd\x53\x17\x80\xc4\xa3\x06\xdf\x65\x72\x4b\x60\xae\x79\xed\x54\x4f\x38\x28\x5d\x3e\xb6\x2a\xc4\xaf\x07\x42\x80\xc3\xe6\xa2\xac\x6e\xcb\x69\x21\xdb\xef\x11\xd9\x28\x55\x1e\x39\xb3\xde\x8d\xa5\x36\xd5\xc7\xbd\xb2\xe0\x91\x2f\xfe\x75\xeb\xf1\xed\xaa\xe4\x98\x55\x89\xff\x9f\xf7\x6a\x13\x39\xa0\x47\xeb\x91\x74\xd6\xfb\x75\xc8\xa3\x75\xc4\xf1\x37\xeb\x08\x6c\x76\xc3\x7a\x22\x11\x61\xda\x91\xce\x58\x46\xa5\xd1\xb3\xee\x6f\x1e\xab\x33\xa2\x30\x4d\x1d\x2e\xbb\xea\x7b\xed\xbd\xaa\xe3\x5b\x8e\x4b\x4b\x97\x1c\x9a\x50\x09\x21\x23\x09\x3d\x23\x18\xc8\x52\x05\xd0\x3e\x6f\x60\x4c\x2f\x1f\x21\x23\xfa\x02\x81\x98\xd1\x74\x86\x3a\x00\x3c\x6e\x0e\xb0\xf5\x2f\x87\x4a\x82\x96\xd4\x45\x6c\x31\xc1\x47\xe3\xa5\xf7\x14\x46\x78\x82\x42\xe9\x78\x4f\x98\x71\x54\xf6\x0c\x2e\xda\x08\x49\x87\xb4\xf4\xc8\x8a\xf3\x99\x97\x9d\x30\x05\x64\x6f\x75\xe1\x00\x25\xd5\x8a\x96\xe4\x49\xc0\x53\x51\xb3\x35\x4a\x60\x77\xfe\x05\xde\x34\x17\x19\x57\x28\x6a\x2f\x1e\x36\xa4\x62\x53\x66\x86\x4a\xb7\x30\x7d\xb1\xb5\x5e\xbd\x56\xe6\xd6\x54\x12\x89\x6d\xba\x23\x09\x47\xa3\xb5\x5c\x8f\x5f\xa9\x64\x4c\xf0\x4e\x01\x1a\xa3\x98\x1d\xa9\xc5\xee\x79\x69\x2f\x31\xf2\x1f\xad\xed\x1d\x55\x5b\x6a\x86\x2f\xee\x7f\x45\x67\x4a\xc0\x39\xd8\x69\x79\x8f\xed\xf6\x55\xbd\xae\x6c\x73\xb3\x56\x5a\x6d\xcc\x32\x6f\x36\x6a\xd1\xb8\xda\x6e\x74\x95\x63\xe7\xf6\x25\x6a\x0d\x7e\xbf\xf9\x8a\x60\xab\x78\x04\x8f\x87\xfd\x29\x8d\xab\x8e\xac\x0b\x27\x8e\xb8\x35\xd0\x04\xc1\x80\x03\xfc\x75\x08\xc4\x81\xcc\x7d\x5c\xec\x18\x7e\x19\xc8\x2c\xe2\x37\xe6\xa6\xc8\xcd\x2d\xb5\x4a\xfe\xd8\x09\xf6\xc0\x5f\x87\xde\x7d\x9c\x9f\x39\x74\x03\xd6\x87\x9f\x99\x4b\xd3\x35\x2b\xef\xce\xfb\x97\x47\x4c\x26\x86\x82\xfb\x22\xbc\xdc\xd4\xbe\x65\xe9\xbf\x1c\xbe\x1c\xaa\x29\x77\x8a\x44\x06\xc3\xb0\x54\x3d\x67\x38\x30\x51\xa3\x99\x89\xad\xdf\xdb\x13\xc1\x60\x20\x37\xb1\x21\x93\xd3\x75\x44\x1b\x1d\x69\xf9\xdb\x61\xd2\xfe\x1e\x31\x73\x10\x89\x2a\x20\xcc\x47\xe5\x0a\x30\xb7\xac\xcf\xac\x64\x2a\x49\x51\x58\x26\xe8\x1c\xdb\xa7\x32\xe3\x0e\x32\xfc\x2b\xbb\x22\xfd\x44\x1e\x29\xd6\x3f\xb8\x45\x95\x6f\x41\xc9\x02\x5b\xe4\x4d\x0e\xc1\x7c\x2d\xda\xce\x13\x8e\x37\x99\x5c\xd5\x1f\x97\x88\x0b\xff\xdd\x50\x8d\xb0\x3a\x81\x35\xc9\x28\x36\x93\xba\xf2\x87\x2a\xd9\x07\x5a\x13\xb4\x98\x90\x0e\x03\x99\x48\x77\x7c\x02\x4b\x1a\xc4\x23\xae\x1e\x76\x21\xf5\x8b\x4a\xed\xee\x10\x02\x4c\x1c\x6a\xb1\x66\xa2\x5d\x33\xce\x52\x8b\x66\x17\x05\xc8\x53\x3e\x70\xa1\x33\x51\xdc\xca\xc5\xda\x5a\x2c\xc2\x83\xc1\x07\x68\x2f\xa2\xa0\x95\x86\x1a\xd3\x95\xad\xb2\xd0\x62\xca\x9b\xf5\xdb\x2d\xb4\xb1\xcf\xcb\xa5\xd9\x94\xc4\xc6\x11\x28\x50\x92\xc6\x46\xfe\xc5\xa5\xc1\xc4\x40\x65\x5a\x52\xad\xbd\x1c\x43\xf5\x81\x5b\xf2\xee\x68\x7c\x00\x17\x46\xb1\xce\xee\x99\xbd\x2b\xd5\xdc\xac\x75\xb1\xca\xa8\x73\x62\xed\xff\x0d\xff\x8a\x0f\x6e\xd7\x69\xa7\x23\x23\x55\x66\xbc\x44\x20\x8d\xf3\xda\xab\x5d\x5b\x34\xb5\x29\xbc\xcb\x66\x74\xbb\x25\xec\x2f\x59\x03\x88\xbc\x43\xbf\xda\x25\x37\x3e\x06\x4b\x3e\xe3\x6e\x7e\xec\x03\x12\x29\xaf\xe5\x57\xae\x76\x7b\x66\x02\x0c\xf2\xa0\x95\x12\x63\x92\xc9\x73\xc2\x18\xf2\x12\x9a\x1a\x05\x61\xd8\xbb\x26\x1d\x67\x4b\x3b\x90\xfc\xae\x29\xc0\xe6\x79\xfc\x94\xf1\xa4\x63\x63\xe7\x95\xbc\x4c\xdf\xb7\xac\x12\xbb\x92\x2a\x8b\x8c\xa8\xce\x85\x6a\x79\x8b\x3d\xe9\x8e\x5e\x9d\xfb\x80\xf2\xc7\x2e\xa7\x9d\x47\xb4\xec\xe1\x86\x41\x80\xb5\x85\xb8\x15\x45\xfe\xf5\x8e\xc5\x16\xfd\x28\xf6\x20\x26\x9b\x57\xf6\x66\x4b\xa1\x77\xb0\xe5\x55\x6f\x33\xaa\xfd\xe3\x0c\x76\x8f\xa0\x54\x0c\xe0\xe5\xf6\x62\xc4\xde\x5d\x75\x6d\x36\xdb\x1a\x49\x26\x36\x48\x98\x84\xf2\x39\x11\x09\x4f\x1d\x8b\x84\x50\x78\xd0\x12\x42\xc1\x90\xa7\xe7\x9c\x81\xfe\x52\xde\xab\x2a\xdb\x8d\xba\x57\x6d\x43\x67\x5f\x86\xbb\x3d\x6c\xea\x90\xd7\xed\xe7\x9c\x7d\xcb\xcd\xc4\xf5\xc3\x7d\xc2\x37\x75\xb7\x04\xd6\xbf\xff\x16\x42\x9d\xf2\x3d\x17\xa4\x23\x30\xfe\xa5\xaf\x6b\x10\x55\x7b\x6f\xe3\xab\xa1\x8c\x6b\x74\xae\x1d\xd9\x59\x49\xf0\x03\x13\x21\xde\xb1\xf2\xca\xb5\xb3\xb3\xc2\x7b\xfa\xb6\x24\x7e\x5f\x54\x48\x7e\x16\xe6\xe6\xf5\x7d\x01\x6c\x26\xcb\x66\x51\x0f\xd5\x84\x89\xd7\x01\x87\xd1\x3e\x29\xae\xa9\x0c\x9d\x75\xb0\x9b\x36\xac\x6b\x3a\xa7\x61\xd5\x14\xab\x1c\x12\x54\x7c\xab\x3a\xea\xc8\x2f\xcd\x77\xc3\x20\xa1\x3a\x6d\xd5\x70\xe5\xbe\xf3\x1e\xd5\xb9\xb9\xeb\x48\xb2\x59\x53\xaa\x8f\xf9\xa2\xb2\x0e\x09\x05\x09\x57\x9c\xbb\x04\x21\xc0\x77\xdb\xd5\xe6\x4e\x57\x4b\xea\xeb\xb8\xe3\x42\x9d\xd0\x60\x94\x6c\xcc\xd2\xdc\xb1\xe6\xef\xce\xab\xa7\xa9\x1c\x74\xb6\x66\x53\x81\xdb\xe2\xdd\xe4\xb7\xa6\x84\x8b\x07\x3c\xe0\x4d\xee\xd6\x7e\x67\xf9\xb1\xb2\xd9\xcc\xbd\x91\x10\xb9\x00\x82\x40\x8b\x61\x0f\xf5\xdd\xf0\x25\x04\x0f\x40\xbf\x4b\xfa\x59\xd3\x99\xd3\x5a\xb7\x1a\xbb\x63\xcc\xb0\xd7\xea\xfd\xce\x7b\x07\x63\xec\x8a\x6a\x57\xbd\x0b\xcb\x67\x55\x17\x77\x7a\xe7\x62\xf3\x73\x0e\x4e\xde\xeb\x73\xf5\x0a\xa7\x07\x32\xf6\xa6\xcd\x71\xcb\x0b\x8e\x4f\x47\x77\x24\x49\xb1\x2f\x0c\xa0\xc3\x7b\x8f\x16\xf7\x48\xed\x5e\xf2\x98\x60\x15\x06\x7d\x7f\x08\x7c\x5b\xd9\x75\x3e\x47\x36\xc6\x9c\x14\x11\x92\xf2\xb5\xe8\xd0\x1f\xc0\x27\xa0\xd0\x60\x7c\xca\x9e\xb9\x8a\x9b\x26\xd6\x97\xbb\x90\xfe\xab\x2c\xab\x60\x12\x8e\xa7\xc4\x59\x61\xe7\xfe\x1e\x27\xe4\x51\x0b\x28\x9a\x46\x92\x50\x6c\x5d\x93\x78\x03\x5e\xb2\x7f\x6c\x96\x9d\xc3\xff\x69\x6d\xca\x60\x52\xe8\x72\x8f\xc2\xf1\x0f\xdc\x69\xe4\x93\x0c\x22\xdd\xcb\x0e\x69\x4a\x80\xa1\xd3\x93\x8b\x69\xeb\x02\x2a\x4c\xd0\xb1\xb0\x6b\x9f\xef\x91\x83\x2d\xf0\x13\x24\x22\x2a\x03\x1c\x21\x72\xa2\x91\x11\x9a\xc8\xa8\x52\x6a\xe9\xc8\x2a\xd2\x27\x44\x38\x20\x57\x5b\x7f\x31\x4c\xd7\x3a\x42\xe5\xef\xba\xda\x9f\x43\xca\xf3\x41\x7b\xab\xf3\x5a\x5a\x13\xf2\x65\x01\x4a\xf4\x18\xf3\x02\xf6\xc6\x9b\xb9\x8c\x80\x9f\xaa\x8b\x77\xa1\x34\x0c\xfe\xf5\xe4\xe2\xe7\xf1\x74\x7c\xda\x5f\x0c\x70\x7d\x7e\x3a\x9e\x22\xf0\x9a\x01\xa8\x80\x0c\x0f\xf4\x8c\x6f\x47\xb3\xc9\xec\xc1\xa2\xb3\x09\xe0\xc5\xa9\x2e\x60\x7c\xda\x5f\x7d\x96\xf5\x14\xb5\x27\x24\xfe\x81\x88\xbf\x6f\xc8\xd0\x3f\xed\xe2\x9d\x3a\x1d\xbf\x1b\x9f\x5c\xcd\x32\x51\x2d\x70\x36\x86\x1a\xb5\xfd\x35\x02\x17\x53\x75\x7e\x71\xfe\x8c\xea\xd3\x26\xe7\xef\x87\xf0\x99\xf1\xf9\xd5\x64\x3a\x56\xd3\xc9\xec\xef\x6a\x34\xe3\x62\xb8\xff\xb8\x1e\x85\xea\x83\xcb\xf1\xf4\xdd\xc5\xf4\xe3\x08\x00\xed\xef\xf6\x8e\x0d\xea\xc4\x3e\x5f\x5c\x0f\xd5\xec\xc3\xc5\xf5\x19\x56\x49\x74\x1e\xf4\x8b\x3e\xa6\xf1\x4f\x7e\x1e\x33\x16\x7e\x3a\x9e\x5d\x42\x91\xc1\xe7\x8b\x6b\x75\x78\x7e\x81\x4b\x30\x39\x9f\x60\x21\x01\x62\x86\xfd\xbe\x4e\x45\x75\xbe\xa8\x60\x18\xa8\xd1\x6c\x76\xfd\x71\x4c\xa3\x9b\x05\x8e\xff\xf3\xf1\xc9\x78\x36\x1b\x4d\x3f\x53\x09\x01\x6c\xc1\x74\x7c\x39\x9a\x4c\xb1\x60\x61\x3a\xc5\x3a\xb7\x21\x1e\x80\xfe\x33\x04\x85\x0d\x58\x93\x30\xf3\x07\xc3\x6f\x30\xd6\x38\xf8\x85\x0e\xb0\x7d\x3a\x3d\x43\x75\x7e\xc1\x70\xfe\xde\x45\x98\xcc\xa8\x04\x70\xf2\xff\x27\x42\x01\x3c\x82\xe3\x7f\x9c\x8c\x2f\xaf\xe4\x79\x8c\xc3\x81\x63\xfc\x6a\xa8\xae\xc6\xd3\x8f\x93\x73\xea\x4d\x80\x32\xe9\x15\xc2\x4f\x3a\xee\x4b\xa7\x37\x7d\x88\x40\xa0\x29\x82\x5d\xe5\x41\xc6\x34\xb5\xdd\xe8\x9a\x38\x47\x51\x8c\xa8\x95\xce\x0b\xec\x2b\x20\xfa\xcf\xc0\x75\x44\x4c\x24\x7c\x25\x3c\xe4\x2d\x3f\xb0\x0c\xe7\x15\xc4\xbf\x28\xb8\xf4\xf2\x85\x5a\x7a\x2b\xc1\xae\xd4\xdc\x10\xe5\x9d\xc6\x6c\x31\xca\x19\x7c\x7c\xa8\x2e\x63\x83\x73\xb8\xed\x19\x89\xe9\xbc\x52\xa5\xae\x1b\x2f\x18\xa9\xf4\x08\xfa\x12\xe4\x25\xf7\x6e\x9f\x9b\x9d\xa5\xe9\xf2\x84\xfa\x64\x23\x96\xc7\xba\xa6\xba\xcd\x6f\x4d\x5c\xb9\xe3\xe0\x41\x69\xe7\x4c\x85\x1d\xbf\x21\x78\x96\xf0\x96\x42\x06\x19\x64\x20\x61\xe8\x96\x66\x51\xe8\x4a\xd7\xb6\xda\xa9\x7f\x36\xcb\x1b\x78\x4a\x63\x46\x6a\xa0\xf4\x8d\x17\x5e\xf5\x9e\x38\x48\x9a\x84\x7b\x8c\xeb\x13\x5e\x08\x15\xde\x62\xb4\x98\x3c\x83\xc1\xe5\xd4\x2c\xa0\xc2\xc2\x37\xed\xd4\xc1\x25\x20\xc0\xf3\xad\x2e\xeb\x83\x81\xd2\x45\x61\x6e\x10\x6c\x4b\xd2\x56\xfc\xbb\x80\x77\x6c\x8c\x2e\x19\x93\xdb\x97\xc0\xbb\xf3\xdb\xdf\xf9\x7d\xee\x5a\x13\x23\xb3\xbe\x07\x3a\xb0\xef\xf7\xbd\x2b\x31\x20\xdc\x58\xb1\x93\xd0\x32\xe0\x3a\xc4\xfd\x91\x78\x48\x40\x3c\x95\x09\xac\xb7\x75\x05\xf6\xbc\x8c\x9a\xad\x73\xfa\x5b\x0c\x6c\x1f\x88\xea\x30\xdf\x6b\x42\x62\x30\xa0\x35\xc1\x41\x18\x91\x58\x24\x06\xe5\x49\x58\x0c\xbb\x1a\xc7\xc3\xe3\xfe\x43\x9c\x21\x58\xe2\x15\xdd\x2c\x32\x53\x41\x2b\xca\x05\x8d\xb7\x7b\x5b\x59\x60\x83\xcc\x6f\xbd\xff\x0e\xc3\x48\xee\x3b\x9d\x06\xf3\x75\x9b\x47\xe6\x1c\x58\x07\xfc\x06\x7f\x62\x6b\xaa\xdc\x42\x97\xaa\xc2\x38\xe7\xc5\x04\x5d\x72\xf9\x2c\x3e\x84\x16\x50\x5e\xaf\x97\x95\xbe\xa3\x90\x0e\x9c\x52\x90\x22\xc4\x4e\xc9\x66\x47\xef\x31\xe4\x13\xdf\xde\x0f\xce\xc7\x37\x65\x5e\xe8\xda\x54\x30\x03\x84\x2e\xba\x86\x4c\x2e\x1d\xc9\xc8\x6e\x2a\x83\x37\x18\x3e\x2c\xde\x13\x45\xc0\x4b\xf0\x6a\x61\x05\x6e\x99\x14\x5c\x08\x92\xd6\x0e\xbd\x1a\x1e\xf9\xcf\xbd\x1a\x1e\x73\x06\x17\x88\x99\xd1\x48\xab\x62\xa6\x1a\x2e\x19\xa4\x23\x80\x52\xfa\x56\x17\xf9\xb2\x08\x84\x17\x1c\x05\xe1\x48\x3a\x1b\xc4\xb2\x81\x3d\xd5\x85\xf8\x45\x12\xc3\x11\x32\xa8\x93\x15\x8f\xa7\xb8\xf5\xd2\x41\x2a\xfe\xe4\x0b\x61\x1d\x5e\x0f\x25\xc7\x8e\x2c\x84\x83\x7f\x46\x85\x74\x7e\xa1\x4e\x26\xd3\x93\xeb\x8f\xb3\x2b\x6f\x0b\x60\x2f\xe2\xf0\x4f\x67\xe3\xf7\xa3\x33\x2a\xa5\x8b\xd5\x73\xf7\xb0\xd5\x64\xa2\xae\x2e\xad\x4b\xc7\x8a\xc5\xcf\x17\xd7\x59\xbf\x15\x90\xf5\xdb\x00\x99\x0a\xa5\x8b\x33\xfe\x3b\xac\x81\x4f\xd5\x6f\x78\x6e\x76\x7d\xe9\xcd\xb3\x29\xeb\x69\x2e\xa4\x03\xe3\x69\x3c\xcb\x44\x55\xe4\xd5\x05\xf6\x4e\x1a\x4f\x67\x17\xe7\xa1\x46\xb2\xd3\x7e\x28\x2d\x92\xdc\x5b\x10\xc9\x76\xc1\x87\x91\x9f\x3e\x14\x19\xde\x6b\x1e\xf2\xef\xfc\x77\xcf\xbc\x71\x43\xe5\x8e\x59\xa8\x86\x7c\x7f\x71\x71\xfa\x69\x72\x76\x96\xa9\x4f\x17\xd3\xbf\xab\xd9\xd5\xc5\xe5\xe5\xe8\xfd\xd8\xaf\xf1\xc7\xcb\x6b\xff\x89\x77\xa3\xc9\xd9\x35\x16\xef\x7f\x1c\x9d\xbd\xbb\x3e\x3f\xc1\x77\xd3\x54\xa0\xac\xf5\xec\x2c\xac\xea\x47\x6f\x59\x26\x63\x86\x4f\xcf\x80\xb4\x89\x6a\x12\xc3\x62\x7d\xa6\x2d\xfb\x30\xfa\x79\xac\xde\x8e\xfd\xbf\x9e\x7b\x93\xf1\x71\xc4\x42\x6c\x3b\xf5\x9e\x3f\x7a\xb3\xb7\x08\x47\x97\x97\x67\x9f\xfd\x4e\xb4\x58\x97\xc6\xa3\xab\x0f\x50\x03\x0a\x9b\x33\x3a\x53\x93\xf3\xbf\x5d\x4f\x3f\xb7\x69\x98\xe2\x68\x9f\xce\x64\x8d\x26\x59\xbc\xe3\x7f\x5c\x41\x49\x9a\x3f\x12\x27\xb0\xe7\x67\xa3\x4f\x7e\xa1\x3f\x4c\xde\x4e\xae\x66\xf8\xf3\x38\xc8\xa1\x9a\x5d\x7c\x1c\xab\xbf\x5d\x4f\x27\xb3\xd3\xc9\x09\x36\xf3\x3a\xbd\xc0\x81\x9e\x9d\x5d\x7c\xa2\x97\x9e\x9c\x5d\xcf\xa8\xe0\x36\x9d\x61\x3c\x28\x7b\xcf\x49\xa6\x66\x17\xb8\x38\xf1\x3d\xd8\x31\x31\xbc\xe8\xe3\xe8\x73\xba\x36\xde\x00\xf7\x57\xf6\x87\xa1\xba\x1e\xce\x86\xea\xbd\x3f\xfc\xe7\x50\x6d\x37\xf6\xd7\x75\x36\x9e\xce\xe0\x81\xab\xde\x28\xb1\x57\xe2\x07\xd0\x4c\xad\x02\x3c\x74\x5e\x9b\x4d\x76\x80\x29\x4a\x8d\x3a\x45\x31\x2c\x1c\xe3\x51\xdf\xfd\xa0\x4e\x86\xef\x86\xd3\xa1\xd7\x5d\x2f\x8e\xd4\xe1\xc5\xa2\x1e\x02\xbd\x1b\x92\xf1\x3b\x6a\x76\x67\x57\xc9\x8b\x3b\x60\xff\x03\x75\xb8\xef\x2b\xba\x16\x5f\xf9\x7f\xff\x1f\x75\xfc\xfd\xf1\xf0\xf8\xf8\xf5\xb3\xd7\x2f\x8e\xbe\x3b\xd4\x83\xc3\xa3\x01\x2a\xd7\x7b\xdf\x9f\x16\x05\xc0\x94\x44\xa4\x16\x72\x17\xae\x3d\xa3\xa3\xe3\xe1\xf1\xd1\xb1\x3a\xa4\x86\xd4\x7e\x4e\x00\x67\xf4\x73\x0a\x3a\xa5\xf3\xb8\x1f\x8a\x58\x95\xe3\xd7\xc3\xd7\xc7\x2f\x8e\x9f\x1d\x85\xc4\x7d\xf8\xab\xef\xd4\xe1\xdf\x9a\xd2\xf0\x6a\x79\x09\x8d\x9b\x06\xe1\x5b\x50\x5b\xe3\x72\xa9\xae\xa1\xcf\x20\x55\x72\xec\x0b\x00\x97\xde\x8a\x01\xe6\xe9\x4e\xce\x80\x4a\x98\xd0\x45\x68\x7f\x80\x68\xf6\x16\xc0\xca\xe1\x57\x3d\x2f\x55\x91\x9b\x06\xca\x12\x10\x69\xb9\x35\x95\x33\x4b\xe3\xb0\x5e\x0a\x83\x8d\xef\x46\xd3\x4c\x9d\xc2\xff\x1f\xe0\x37\xf4\x0e\xec\x17\x81\xc6\x3c\xe5\x09\x02\xa9\x8c\xf8\x70\x4c\x81\x74\xf7\x6a\x4f\x5d\xcc\x8f\x43\xf5\x71\x32\x3b\x19\x9f\x9d\x8d\xce\xc7\x17\xd7\x7c\x90\x85\x81\x14\x60\x05\xa1\xfe\x72\x0b\x70\xda\x68\x07\x88\xa6\x06\x8c\x21\xdd\xe8\xba\x26\x58\xbc\x5d\x81\x3f\x00\x16\x65\x98\x43\x27\xcc\xe2\x3d\xa0\x22\x70\x0d\x95\xa6\x5c\xd9\x6a\x61\x34\x54\xa5\xc1\xa1\x8a\xbf\x0d\xac\x3c\x95\x59\xd9\x6a\xc3\x20\x19\xb2\x7c\xa8\xa6\xad\x34\x0b\xe3\x9c\xae\x76\x8c\x04\x54\x79\xad\xc4\x5b\x5b\xde\x5d\x78\x67\x3b\xcc\x5f\xe8\xd0\x9d\xe2\x9f\x4d\x95\xbb\x25\x51\x8d\x53\x47\x09\xe2\x62\x62\x73\xae\x17\x08\xd0\x03\xf7\x8e\x81\x1f\x31\x64\x91\x09\x2f\xf4\x5d\xa6\xb0\x30\x35\xe4\xde\x5c\x0c\xf5\x0c\x32\x15\x4d\x16\x58\x1d\x39\xb6\xa7\x10\x40\x5e\x15\xf9\xa2\x7e\x66\x57\xcf\xfc\x0c\xc2\xe2\x39\x2c\xff\x2a\xf2\x9a\x93\xb9\x69\x57\x8b\xbe\x25\x69\x31\x5b\x25\xcb\x10\xea\xe1\x9a\xaa\x76\xd8\x12\x92\xe9\x75\x5b\x4f\xfa\x73\x8f\xcd\x4f\x7e\xcd\xd2\x65\x31\xcb\x58\x58\x00\x4e\x50\xc7\x8b\x16\x21\xd2\xc2\xba\x5a\x76\xe4\xc8\x7a\x2b\xb4\x60\xd8\xf8\x2c\x45\xf2\x02\x3c\x48\xd7\xb5\xad\x4a\xb3\x73\x4f\xd5\xca\x10\x75\x93\xf9\xba\x05\xe3\x10\x0b\x53\x74\x0a\xa7\xf0\x43\x22\xd2\xc7\x73\x82\x0a\x9c\xd8\xd2\x5b\xbf\xf0\x40\x89\x3e\x8a\x5e\xd4\x2e\xa4\x67\x26\x65\x6d\x2a\x34\x19\xfd\x14\x75\x01\x1e\xfc\x7b\x6b\x97\xce\x5f\x08\xea\x4c\x52\xec\x68\xb3\x99\x43\x13\x8e\x64\xa5\x2a\x73\xc3\x0d\xfd\x30\x96\x17\xce\x49\x0c\xfd\xe9\xf2\xa6\xd1\x37\x81\xd6\x98\x2a\x7f\xc2\xce\x7a\x5d\x52\x57\x8d\xd7\x07\xe4\x1a\x00\xaa\xb3\xc2\x3a\xb7\xc8\x7a\x8c\x4c\xf8\xad\x03\x82\xb9\x43\xd1\x78\x37\xa4\x20\x41\xf4\x77\x77\xa4\x9b\x28\xee\x25\xc9\xd4\xcb\x4d\x5e\x7a\x3b\x9b\xcf\x27\x4f\xd3\x61\x17\x63\xf2\xab\xda\x7c\x9a\xb4\x81\x37\xa2\xc9\x61\x14\xad\x0b\xdb\x78\x07\xd1\xb8\x01\x32\xef\xfb\xa1\x3e\x1c\x36\x8f\x11\xf2\x3e\xa8\x0b\x48\xca\xa3\x17\x43\x08\xb4\x5d\x9c\x07\x5b\xcc\x1b\x50\x48\xcd\x09\x4f\x8c\x9c\x9a\x9b\xfa\xce\x3b\x2c\xfd\x81\xed\x56\x4c\x80\x31\xf5\x04\xbe\xef\x72\x7d\x71\xef\x9a\x72\xc9\xbd\x71\x94\xae\x72\x44\x63\xf7\xbb\xe2\xc0\x8a\xe6\x17\x24\xaf\x9d\x6a\xea\xbc\x10\x4c\xd2\xb2\xb6\xae\x9b\xca\x14\x3b\x6c\xa9\x1a\xda\xef\x5d\xff\x44\x12\x27\x3c\xed\xdf\x00\x32\x2a\x4c\x84\x00\x25\x80\x72\x8f\x0d\x84\xa8\x61\xcf\xb9\xad\x21\x75\x47\x01\x31\xd0\x9e\x44\x44\x67\xab\x78\x74\x97\x5e\xf7\x20\xb0\xc7\x1f\xe2\xbc\xc6\xdc\xcd\x0e\x8e\x8f\x63\x1d\x13\x72\xd1\xff\xb2\x14\x1e\xbf\xea\xcf\xf0\xf9\xfb\xcb\xb3\x67\xc7\xc3\x17\xcf\x6c\xf5\x0c\x5c\xf7\xdf\x9e\x07\xe4\x01\xfe\x8f\xa3\xd7\x2f\xbe\x6f\xf3\x7f\x7d\xf7\xe2\x4f\xfe\x8f\x3f\xe4\xcf\xfb\xf3\x6b\xf5\x7e\x7c\x3e\x9e\x8e\xce\xd4\xe5\xf5\xdb\xb3\xc9\x49\x68\xfd\xce\x91\xc5\xe3\x4c\xb1\x3d\x7c\x24\xfb\x41\x9c\x0c\xd4\xd1\x8f\x3f\xfc\x08\x7c\xd1\x47\x7b\x5b\xbf\x60\x82\xff\xc9\xf7\xfe\x09\x5d\x7e\x29\xf2\x52\xcd\xea\xca\x98\x3a\x53\xef\xf2\x55\xbd\x56\xef\x0a\x6b\xab\x4c\xbd\xb5\xae\xf6\x4f\x7f\x1c\xa9\x17\xc7\x47\x47\x2f\x9e\x1d\xbd\x7c\x71\xa4\x32\x75\x3d\x1b\x3d\x19\xdf\x9a\x6a\xe7\xb5\x82\x6c\x7c\xcd\xcd\x75\xdb\x80\x89\x5b\x53\xcd\x75\x9d\x6f\x12\xa2\x4e\xd1\x30\x96\x3d\x8e\x0c\x5a\x6c\x01\x0a\x97\x72\xc5\x14\x22\xa4\xde\x7c\xc3\x27\x97\x95\xd1\x9b\x79\x61\x9e\x24\xc5\x0e\x2b\xc0\xed\xb9\x3a\x25\xa9\x5e\x1a\x97\xdf\x94\xd4\xa7\x0b\x24\xff\x9d\xde\xa9\x9d\x6d\x2a\x20\x51\x5d\xda\x8d\xff\x17\xa8\x6e\xc5\xf2\x63\x40\xff\x02\x7b\xf4\x5b\xae\xa8\xe5\x4e\xe1\xb0\x27\xfd\x0d\x66\xa4\x2c\xab\xad\xba\x69\x34\x04\x99\xcc\xc3\x5f\x02\x2a\xd7\xd0\xd9\xf7\x19\x9b\xb4\x01\x1b\x22\x59\xa4\xe1\x59\x00\xe3\x14\x05\x4a\x7c\x07\xed\x85\xc1\xde\xdd\x33\x32\xb0\x65\x30\x69\xb9\x11\x7d\x73\xef\x69\x32\x9b\xb0\xc4\x12\x22\x35\xed\x5e\x73\x07\x9e\x13\xb6\x2e\x70\x50\x23\x9d\x53\x33\x40\xdc\xb1\xa1\x3a\x9c\xd9\x0d\x23\x2d\xf6\x36\x1f\x92\x53\x5b\x90\x0a\x26\xdb\x1c\x1a\x1b\x79\x27\xa8\xda\xbb\xe2\xa5\xab\x8d\x5e\x0e\x07\x08\xad\xd6\x25\x37\xf5\x81\x91\xc0\xb2\xc7\xb6\x43\xb5\xb5\xc3\x27\x90\x8c\xbe\x03\x23\x55\x7f\x01\xae\x15\xb9\xf4\x99\xff\x27\xb4\x6e\x56\xa6\xaa\xc8\x6c\xa6\x9d\x43\xe4\xd5\xb6\xca\x17\x66\xa8\x2e\x9a\x7d\x83\x72\x9d\x23\x27\xf7\x92\x5a\xf6\x43\x94\x13\x08\x2d\xe2\xa9\x10\xd7\x24\xde\x8e\x64\x78\x68\x20\x11\xd2\x15\xad\xcc\xdc\x7b\xad\xd5\x2d\xa0\x2e\x56\xf0\xea\xbb\xdc\xad\x07\x59\xfc\x14\xe1\x0f\x12\x52\x3c\x6f\x66\xe8\x52\xdd\x98\x1a\xae\x16\xfd\x10\x72\x0a\xb5\xf8\xa9\x7f\x86\x4e\x68\x72\x0a\x6d\x05\xe9\xf5\x6d\x6e\x08\xe7\x9c\x43\x03\x6d\x20\x9d\xf0\xe3\xe5\x35\x7f\x13\x41\x81\xfe\x75\xd0\x0a\x90\xdf\x8b\xdd\x1c\xa1\xce\x3d\x2f\x6f\xdc\xf0\xc9\x15\xb4\xd5\xa8\xbd\x27\x02\x1b\x87\x96\x0b\xec\x48\x69\xc4\x42\x26\x6d\x9c\x90\x23\xc6\x56\xf3\x1c\xba\x75\x7b\x31\x04\x0c\xc5\x25\x5c\x6f\xfa\x02\xd9\x40\x18\x18\xd6\xee\x0b\xfe\x93\xf5\x5b\x52\x99\x80\x8d\xc0\xa7\xc0\xf6\x6f\x37\x8b\xaa\x2b\x5d\xba\x02\x3a\x65\x5a\x68\xaa\xac\xf3\x32\x35\x77\x72\x92\x3d\xfe\xcd\xb4\x9c\xbd\xdb\x29\x97\x11\x49\x06\xf0\x61\x82\x17\xe5\xf5\xf0\xc9\x3b\xd9\x7d\xea\xbe\x77\x11\xa8\x8c\x16\x3b\x92\x00\xdc\x78\xcb\xda\x71\xe7\x49\x00\x44\x13\x3c\xb9\x71\x00\x38\x37\x2d\xb8\x35\xb6\x30\x17\x74\xcc\xf2\x94\xb6\x31\xc7\xf1\x1c\xd7\x6b\xb3\x83\x5b\x95\x85\x33\x26\xce\x15\xce\x34\x1c\x39\xef\xda\x2c\xe3\x28\x1c\x15\x7b\x6c\xf8\x10\x40\x48\xc9\x59\x2c\x00\x81\x83\x82\x89\x4c\xda\x95\x27\x9f\x4c\xdf\xe9\x20\x57\xe3\xce\x2a\x57\x9b\xad\xc3\xe2\xaf\xc8\xaa\x98\xae\x36\x17\xe9\x21\xe8\x1d\x8f\x87\x50\x3d\xe8\x64\xc5\x5e\x68\xc8\x26\x91\xf6\x41\x43\x82\xea\x14\x4d\xf4\x9c\x39\x64\x76\xc9\xf7\x86\x4f\x46\x85\xb3\x19\x36\x13\xf3\x06\xbf\x66\x0e\x61\x9a\x07\x3b\xcd\xb6\xa9\xf0\x94\x33\xfa\x05\x96\x99\x4f\x19\xac\xb4\x61\x15\x0b\x66\x3c\x54\xc7\x45\x2f\x10\x45\x67\x69\x03\xf0\x39\x4a\x86\x44\x78\x04\x04\x57\xd2\x92\x20\x94\xa0\xee\x94\xb3\x1b\xe3\x3f\x62\x0a\xf2\x0e\xb6\xda\x61\x97\xd1\x38\xbc\x1c\xb8\x45\xc3\xc1\xe1\xfe\x9e\x30\x96\x3b\x3e\x14\x28\xdd\x44\x4e\x8f\xd1\x50\x19\xee\x30\xc1\x60\xb7\x95\x9d\x17\x06\xea\xcb\x6a\x2c\xcd\x85\x61\x50\xc3\x57\x48\xb7\x63\xdd\x06\x74\x81\xe7\x9a\xc4\x50\xce\x42\x9a\xe7\xa9\xaa\xcc\xb6\xa9\xb9\x2c\xe7\x1d\xa2\xae\x30\xee\x26\x85\x11\x66\x4b\x01\x1f\x54\x22\x5b\x34\xd0\x51\x17\x3b\x9c\x3a\x03\xd4\x20\x27\xea\x86\xea\x93\x01\x41\x0a\x12\xe3\xd6\xe6\x4b\xaa\x87\x2c\x6f\x4c\xc5\x24\x43\x22\x59\xc4\x44\x41\xf2\x7b\x30\x81\x48\x81\xe2\x9d\x36\xac\x69\x4a\x6b\x17\x89\xa6\x0b\x13\xf3\x58\x7c\x0b\xdf\xe2\xd7\x6c\x2b\xbb\xad\x72\x53\xeb\x6a\x37\x54\x20\x23\x31\xe5\xe6\x37\x18\xf6\x25\x54\xb9\xb6\xb0\x41\x82\x74\x86\x0b\xcf\xe8\x93\x08\x20\xe5\x43\xf5\x94\xce\x49\xc3\xfd\x47\xeb\xf8\x1c\xd4\x75\x14\x43\xb0\xb1\xb6\x7e\xdf\xc3\x55\x45\x96\x96\xc0\x4f\x8a\x11\x00\x68\x32\x92\xa9\x0e\x49\x6c\x52\x51\x8f\x14\x4e\xc3\x27\x57\xe3\xe9\xc7\x19\xd3\x86\x9e\x4e\x30\x1d\xf0\x8e\xf8\x9d\x21\xaf\x93\xf0\xdc\xf9\x07\x3f\x5e\x9c\x4e\xde\x4d\x4e\x20\x8e\xef\x7d\xef\x17\x6d\x0c\x47\x34\x73\xe8\x80\xc1\x12\x86\x68\x6b\xc2\xf7\xc5\xc4\x4b\x21\x55\x8b\x34\xdd\x64\x7b\x74\x7b\x44\xe9\x1d\x59\xa2\x1b\xbd\x6b\x57\xf1\xed\xc3\xf0\xf7\x5b\x08\x18\x5f\x3a\xb8\xc4\xe1\x1d\x64\x58\xa3\x9f\xa1\xd1\x11\x46\xcf\x51\x51\x9e\x82\x1f\x3c\x71\x0c\xa9\x03\x98\x49\x6c\x02\xbc\x36\x8a\xdf\xc6\x4c\x7e\x39\x01\x5c\xc3\xbf\xc4\x12\xa4\xb4\x05\x0b\x73\xdc\xf0\x7c\x0b\x7d\xf7\x53\x60\x60\xf2\x5a\x52\xfb\xdb\x84\xcf\x0a\x12\xac\xf6\x9b\xb9\x40\x19\xcd\x81\x50\xeb\x1e\x0c\x7e\x2e\x5a\x6d\x51\x12\xa1\xfc\x0c\x0a\xb6\xd5\x29\x91\x03\x5c\x43\x75\xf8\x01\xe2\x05\x10\xb9\xca\xc2\xf3\x54\xad\x12\xe8\x8a\x7a\xda\x0c\x50\xa4\x11\x12\x24\x07\xf2\xe3\x07\xc3\x01\x62\x8d\xe9\xb4\x63\x2a\x87\xc2\xee\xd0\x2e\xfa\x60\x67\x9b\x03\x0c\xf2\x2c\xea\xfc\x16\xb5\xbc\x00\x0e\x3f\xf2\xc0\x7b\xb9\xe2\x6f\x55\x62\xdd\xc6\x53\xfb\x06\x65\x26\xd8\x55\x44\x6e\xef\xa5\xac\x5b\xd8\x2d\x9d\x14\x8d\xc0\xe2\xaa\x29\x3b\x2b\x1f\xfa\x5c\xa3\xb5\x82\x04\x6d\xd4\x05\xa7\xa9\xb7\x4d\x1d\xeb\x22\xc4\x4f\x78\x24\x10\x57\xcf\x31\x6e\x14\x28\xcf\x64\xbc\x45\xed\x3d\x67\xea\x30\x2f\x97\x66\xeb\xcd\x27\xcc\xff\x13\x2b\x1d\x64\xee\xb9\xe4\xb7\x67\xc4\x83\xa1\xfa\x44\x76\x4a\x38\x63\x55\xe3\xed\x65\xff\x2e\xa8\x3b\xbb\x0b\x58\x1b\xfa\xd4\xd2\x52\x15\xe1\x91\x28\x03\x7b\xac\x73\x19\x5e\x03\x4e\x4d\x34\x81\xb5\x4b\xac\xe3\xbc\x0e\x4c\x5d\x58\x22\xda\xae\x89\xd9\x61\xed\xa6\xdb\xe6\x8b\xc6\x36\x8e\x51\x21\x5b\x94\xcf\x1a\xea\x3c\x18\x01\x6f\x99\x77\x11\x07\x29\x9f\xea\x6f\x0c\x21\xc8\x9c\x45\x05\xd3\x1b\xf5\xc5\x98\xad\xbf\x11\xfe\x04\xb0\x91\xc6\xe5\x85\xa4\x85\xbc\x2d\xd3\x0e\xed\x93\xcf\xd6\x2a\xcb\xf6\x73\x8b\xaf\xf6\xcf\x80\x2d\x18\x3d\xbb\xb4\xd6\x4d\xee\xc0\x9e\x72\x63\x5d\x58\xa6\xe8\x12\x4f\xc3\x56\xc5\x72\xbd\xb4\x2c\x0f\x75\xdb\x7a\xe7\xf2\x85\xd7\xe1\x78\xb2\xe1\x3a\xb3\xc3\xa5\xc9\xca\xd2\x6c\x2f\x6a\x80\xdb\x80\xd5\x67\xb7\x24\x62\xfc\xac\x83\xbd\x23\x0c\x2a\xaf\x4a\xbf\xb2\x53\xcd\xd6\x2f\x33\x51\xf1\x98\xc8\x5a\xdb\x21\x75\x0a\xb6\x82\xef\x3d\x32\x2c\x32\x5b\xa2\xad\x5e\x37\xa0\xf1\x10\x99\xb7\xff\x8e\x64\xa1\xf7\x56\xfb\xa4\x82\x6c\x6f\x71\x05\x54\x52\x1c\x27\xaa\x84\xeb\x17\x8e\x18\x3e\xd3\x3d\x99\x00\x19\xdf\x18\x53\x0b\xae\x34\xc4\x04\x87\xde\x24\x88\xdd\xd1\x83\x68\xcf\x47\x9e\xb1\x60\x06\x22\xa3\x28\x70\x90\x55\x15\xac\xec\x26\x2f\x21\xdf\x46\xa7\xce\xd5\x94\x4d\x0a\x77\x02\x16\x9b\xd8\xc9\xe1\xd7\x2c\x80\x80\x3d\x82\xce\x5d\x5a\x4f\x3d\xef\x0c\x02\xce\xa6\x9f\x7e\x78\x6f\x1a\xb9\x0f\x4d\x60\x50\x68\x78\x21\x61\x0b\x83\x61\x70\x64\x3b\x08\x0a\x1d\x99\xdb\x12\xa6\xfb\xbe\x2d\xf5\xbf\x21\x02\x8f\x8c\xd2\x92\xd1\xec\x01\x72\x50\xf8\x82\xf6\x53\xe7\x53\xec\x35\x13\xdc\x42\x26\x7c\xf0\x47\xe6\x91\x2c\x48\x8b\x01\xdb\xdf\x61\xb1\x59\xb9\x97\xb6\xda\x50\xa9\x80\x5e\x62\x28\x05\x2c\xfc\xbc\xac\x0d\xd0\x51\x01\x08\x0d\x12\x1b\x55\x53\x0a\x5f\x0e\xd7\xce\x1f\x49\xf8\x47\x57\xeb\xca\xab\x50\x16\xbb\x2b\x2e\xbf\x12\x2f\x62\xc2\x7e\x1c\x88\xab\x95\xad\x96\x48\x55\x7f\xa7\xc1\x9b\x53\xdb\x2a\xc7\x3a\x68\xa2\xc7\x01\x01\x56\x96\xb6\x29\x17\x98\x0e\x8e\xac\x88\x8f\x11\x6d\xc1\xbe\xda\xef\xaf\x1c\x7a\x6b\xb4\x00\x1e\x17\x34\xb2\xc2\x21\xa0\x83\xee\x77\x83\x1e\x1e\xc4\x90\x02\xc4\xbd\xe0\x42\x0b\x5b\xdc\x24\xc6\x73\xd8\x9b\xe4\x2e\x90\x8e\x24\x5a\x9b\x1a\x1b\x49\x57\xc8\x3f\x60\xd5\x6d\x6e\xee\xf6\x08\xbc\xa1\x3a\x1c\x73\x33\xf6\x9f\x54\x9e\xca\x8a\xbc\x76\xa6\x58\x71\x10\x90\x97\x7b\xde\xd4\xb1\xd8\x31\x6c\x34\xae\x31\x3a\xf0\xe9\xea\x66\x28\x96\xf6\xeb\xdd\xa0\xf1\xa9\xca\x3e\xec\x58\xeb\x45\xc3\x01\x41\x56\x5c\xab\xb4\x4c\x24\xfb\xc4\x59\xbc\x0b\xe5\x6b\x70\xee\xc1\x59\xe4\xa2\x7b\x48\xdf\x38\x46\xf3\xc1\x9a\x78\x77\x0f\x7e\x41\xb6\xcd\xbe\xeb\x46\x22\x50\x97\x98\xcf\xa7\xf4\xeb\x0e\x51\x2e\x4b\x30\x42\xa4\x1d\x01\xe0\x09\xec\x46\xc8\x8d\xf8\xf0\xac\x6e\x9c\x29\x6e\x8d\x23\xb0\x6a\x5a\xbb\xea\x7f\xe4\x2d\x18\xb8\x7e\x99\x5a\xda\x76\x4e\xd3\x3a\x31\x7c\xb8\x29\xbb\x4e\xf9\x27\x90\x50\xa4\x9f\x1e\xaa\xb7\x4d\xbd\xef\x79\xe5\xf4\x46\xbc\x35\x61\x61\x42\xc9\x81\x7e\x46\xee\xee\xd7\x10\x75\xab\x03\x03\x6b\x20\x7c\x07\x3b\x6e\xb6\xdc\x2f\x60\x32\x8a\xc4\xca\xce\xf0\xab\xe0\xf2\xb0\x71\xeb\x10\x85\x10\xec\x02\xec\x1c\x84\x9f\x61\x9b\xb1\x01\xc9\x8f\xc1\x8a\x50\x02\x0a\xd3\xaa\xcc\x8d\xae\x96\x00\x61\xf5\xf6\xc9\xda\xaa\x3b\xaf\x73\x21\x5e\x05\xa7\xac\xf1\x6e\x6c\x2d\x7d\x7e\x88\x84\xd7\x61\xb0\xb4\x52\xa0\x5a\x00\xd5\x1a\x83\x72\x60\x79\xba\x34\xae\x13\xd2\x91\x04\x4a\xe5\x46\x47\xde\xaa\xdc\xd9\xe6\x8d\xaa\xb4\x9f\x5e\x26\x3f\x85\xee\x0a\xf1\x8a\x1a\x95\x94\xef\x71\x26\xb9\x6f\xb9\x85\x43\x04\xa3\x01\x16\xb2\x76\xfb\xcb\x74\xdf\x60\xd6\xa2\x3b\x3f\x34\x2b\x33\x4a\xdf\xdc\xf8\x95\x8a\xf9\x69\xe1\x76\x42\xd5\x6e\xdf\x85\x6e\x9b\x4f\x20\x0e\x91\xf6\x74\xff\xc1\x19\x40\x7a\x55\xdd\xda\xa2\xe1\xae\xc6\xae\xb6\x15\x60\x01\xaa\x74\x86\xc4\x78\x12\x84\xd0\xbc\x62\xa9\x27\x46\x17\x95\x18\xf8\x1d\xbd\x4a\xec\xe5\xfd\xd6\x77\x7b\x0a\xed\xd1\x7b\x35\x95\x00\x83\xd5\xf1\x00\xf8\x65\x11\x7d\xc2\x71\x69\xd3\x5b\x72\xdd\x67\x0f\x39\x75\x84\x0c\x56\xd4\x4d\x65\x8f\x55\xb4\xa4\x82\xcf\x3d\x04\xd2\x7a\xa0\x46\x8b\x85\xdd\x6c\xbd\x55\x90\xd7\xb2\x4d\x17\x01\xa1\x16\xb6\xc2\x58\x2f\xe8\xbc\x8d\x5e\xac\xf3\xd2\x3c\xf3\xba\x1a\x05\x63\x74\x2a\x42\xf1\x7d\x0f\xd1\xcf\xe3\xe7\x01\x3b\xfb\x28\x9e\x1a\x50\x34\x68\x5a\xbd\x51\xb6\xca\xa2\x79\xd5\x9d\x52\x04\x78\x13\x6f\x06\xc0\xab\xd1\x48\xae\x55\x61\x34\xa0\x43\x2a\x63\xd4\xce\xe8\x0a\xd2\x25\xd1\x3f\x10\x14\x57\x19\xd9\xd5\x64\x12\x95\x56\xd0\xc8\x92\x45\x8d\x09\x26\x36\xf2\x8b\x1d\xf3\xeb\x01\x9a\x09\x57\x4b\x9e\xd0\x0c\xb4\x2d\x2d\x76\x67\x79\x25\x8f\x51\xba\x13\xc9\xc2\xa3\x05\xf7\xdf\xb4\xe0\x8b\x7d\x67\x48\xb6\x78\x13\xde\xe6\x92\x18\x8f\xe0\x12\xae\xc8\x83\x4b\x62\xfc\x7b\xe6\x39\x54\x87\x10\xf0\x02\x86\x84\x12\x65\x16\xfc\x27\x24\x45\xd1\x9f\x5f\x41\x10\xaf\x14\xc0\xce\x4e\x78\x82\xfd\xfe\x64\x48\xd2\x6e\x7a\xf8\x5a\x46\x4a\x68\x1d\x4e\x94\xf7\x9f\x17\x0b\x5b\x51\x73\xa1\x59\x33\x67\xa9\x3f\xc7\x95\x0e\x36\x49\xe2\x89\xaf\xa2\xb0\x88\xe4\xe1\xdb\x50\x98\x23\xc9\x33\xe0\x21\xc8\xf1\x62\xa0\xb4\xd5\x67\xd0\x42\xda\xf1\x1d\x98\xf8\x72\xc4\x18\x3a\x0b\x67\x2c\x69\x0f\x85\x64\xd5\xe4\x5b\x77\x86\x55\x14\xfe\x1b\x8d\x77\x6b\xf2\xe8\x63\x64\x6a\x5b\x34\x58\x44\x23\x28\xb4\xe1\x70\xac\xb4\x3f\xdd\x81\x02\x1a\x5d\x22\x7a\x1e\xc5\x6b\x95\x6f\x6b\x6a\x56\x21\x14\x93\x1f\x5c\x5e\x84\xd6\x4d\x90\xd9\xd4\x45\x91\xc0\xcf\xe2\x8c\x04\xef\x0c\x52\x0e\x6c\x0d\xec\xb4\x61\xeb\x34\xeb\x4c\x47\x5e\x0d\xc8\xa7\x79\x5d\x10\xa8\x98\xca\x1d\xa2\x72\x38\x26\x13\x2c\x55\xf9\xb3\x43\xef\x5d\xe7\x44\x3a\x07\x6f\xb6\x95\x6c\x74\x35\x88\x07\x7f\xa3\xff\x49\x98\x30\x5b\x82\xd5\x79\x88\x13\xf4\x23\xfe\x62\xaa\xd2\x10\xb5\x2e\x50\xe5\x44\xae\xe9\xad\xa9\xd0\xbd\x44\x02\x02\x15\xb0\x6f\xe9\xf4\xbd\x87\xe3\x42\x51\x0d\x11\xe9\xd3\xa7\xd8\x0e\xd7\x74\x21\x73\x62\x24\x14\x8b\x07\xca\x7b\xd5\xb1\x03\xc4\xfb\xbd\xf9\x24\xce\x7f\x1e\x59\xec\xe0\xa8\x83\xef\xb3\x58\xc0\xc7\x09\xe7\x80\xbd\x06\x28\xed\x0b\xc7\x01\xe2\xc9\x64\xb0\x86\x5f\x79\x43\xfc\x56\x17\x58\xf9\x96\xbc\xa0\x73\xfc\xd8\x92\x06\x43\x13\x5e\x86\x30\x37\x30\x36\xfb\x4c\xc6\x44\x1e\x9a\x5b\xb0\x93\x01\x3c\x9d\xfa\xab\x31\x1c\xb9\xd9\x1a\xa0\x93\xe8\x19\x42\x2b\xb2\x23\x16\x83\x39\x26\x24\x8d\x54\xda\xb7\x55\xf6\x66\x95\xc6\x48\x6a\x22\x44\xb2\xc2\x88\x83\x0c\x1a\xbc\x07\xcc\x0c\xd0\x48\x66\x8b\x89\x40\xbe\x90\x94\xeb\x7e\xfd\x9e\x8f\xe7\x4e\xdd\xda\x9c\x82\xa5\x90\xa8\x49\xcb\xbb\x62\x21\x98\x34\x4a\xfb\x46\x15\xee\x21\x2f\xaf\x37\x8e\x21\x25\x13\x04\x2b\x86\x96\xb0\x6f\x27\xe5\xb4\x61\x73\xbd\xf4\xed\xc1\xe5\x85\xc4\x17\x63\x04\x72\x59\x22\xc5\x03\x83\xab\x03\x9b\xc4\xa8\xfc\xd8\x3b\x94\xab\x3d\x57\x4d\x51\x08\x5c\x26\xd7\x7c\x73\x29\x7e\xdb\x8d\xf4\x07\x72\x5b\xb7\x7c\x0b\x97\x97\x0b\x13\x21\x0b\xfe\x37\x04\x6c\xf0\xa2\x36\xcc\xbe\x24\x54\x1f\xe4\x0e\x89\x1b\x18\x1c\xf8\x24\x7d\x4a\x81\xb7\xfd\xfb\x62\x2b\xf0\xe4\xda\xdd\xd8\x39\x29\xaf\x17\x91\xdb\x8e\xa9\x24\x30\xa0\x5e\xe8\xbb\x90\x2b\x27\xff\xaf\x3b\x1b\x78\x0d\x80\xca\x0d\x94\xca\xe2\x70\x88\x9d\x2d\xde\xa8\x56\x88\xfd\x90\x22\x46\xfb\x6d\x71\x8c\xc8\xe4\xe5\xd2\x6b\x22\x3a\x32\xf8\x79\x4d\xa1\xd7\x64\x83\x63\x4f\x61\x2e\x6f\x0c\xde\xeb\x23\xd3\x6a\x38\xe2\x38\xfc\xd6\x12\xb6\xfc\x16\x72\xd2\x5e\x11\xb5\x0a\xb0\xad\xa0\xe6\xbf\xcf\x7a\x7f\x60\xc6\x09\x82\xa0\x75\x7b\xe8\xe4\x3b\x41\x52\x15\xa4\x59\x48\xdf\xe2\xbf\x20\x26\xa3\x93\x56\x4f\x53\xea\x3c\xae\x14\xa8\xbe\x27\x15\x99\x4a\x26\xc1\x6b\xb7\x6a\x2a\x8a\x72\x0b\x64\x07\xf7\xa1\x16\xd4\x73\xc1\x81\x4c\xbb\xdb\xc8\x82\xf0\xbc\x6c\xdf\xa2\x14\xc2\x8b\x75\x08\xd8\xb6\x32\xa0\xa2\xe7\xbb\x96\x20\x6e\xe3\xad\xa9\xaa\x70\xb2\x22\xa5\xbe\xb0\x25\xf2\x73\x2c\x02\xc0\xbb\xa9\xea\x58\x3a\x8d\xf6\x89\xf0\x37\xfb\xaa\xb0\x05\x71\x13\x07\xf9\xb5\xb3\xa5\x3a\xc4\x3c\xef\x26\x27\xb0\x1e\xff\xd6\xb9\xc6\x38\x2c\x43\x92\xfd\x36\x71\x1d\xe1\x1c\xf8\xa3\x73\x98\x34\x9c\xf0\xa3\xb2\x15\x36\xef\x08\x45\x23\x12\x6e\x3d\x88\xcd\x6e\x2a\xbd\xcc\x17\x35\x59\xf3\xe1\x13\x9d\x90\x06\xa4\xc4\xe8\x26\x9b\xaf\x8b\xc6\xe1\x91\x0d\xc7\x68\xff\x6f\x21\x72\x45\x20\x23\x88\x4c\x89\xa8\xbb\x25\xbb\xdb\xe9\x3a\x77\xab\x9d\x72\xf9\xa6\x29\x6a\x5d\x1a\x4c\xe8\x60\x8a\x41\x70\x01\xee\x41\x4d\x0b\x2c\x9c\xa9\x6a\x8c\x8f\x8b\x9f\x71\x45\x75\x7b\x0f\x77\xe2\x5c\xee\xb9\x79\x94\x6f\x57\x6d\x0c\x90\x6e\x13\x1e\x63\x3b\x6e\xc0\xa3\x61\x4b\x73\x49\xbb\x2e\x6f\xb6\xb0\x0f\xf8\x23\xf3\x1d\xd9\xbb\x16\x50\x2f\x36\xe4\xc0\x28\x07\xb2\xaf\xde\x9b\x4a\xb1\x76\xb6\x09\x61\x38\x83\xae\x04\xa1\x29\xfd\x51\x28\x96\x61\x75\xe7\x16\x28\xad\x63\xe7\xf3\xb3\x64\xf0\x73\x90\x84\x95\x59\x55\x5e\x5d\x85\x00\x0f\x6c\xf1\x3d\xc3\x67\xeb\xad\x95\x97\x49\x82\x4c\x5c\x6d\x94\x97\xe8\xe4\x02\x85\x9e\x28\x0e\x12\x2c\x42\xa2\xe3\xdb\x22\xaf\x16\xcd\xc6\x81\xd0\x46\x01\x37\xd7\x45\x94\xe0\x46\xbe\x5e\xe2\x3c\x31\xd2\xc8\x59\x0f\x7e\x48\xe4\x10\x7a\x9f\xf7\x2e\x16\xd6\x2e\x88\xcf\x62\x9a\x73\x92\x04\xd2\xa8\xc1\x4c\x5f\x24\x2d\x2f\xa1\xa1\x2c\xc1\xd9\xf8\xde\x0b\xe4\x47\xe4\xe7\x6e\x51\xea\x73\x95\x01\xcb\x5f\x8c\xc0\xc1\x6a\x11\xc3\x72\x80\x20\xe0\x93\x6f\xd2\x8f\x33\x3f\x96\xf3\xf3\x13\x23\xe4\x54\x1c\x29\x25\x3f\xed\x9b\x4a\x34\x72\x4f\xe1\x8c\xc9\x36\xa3\xc9\x9f\xc5\xb8\x69\xee\x8f\x3f\x35\x77\x9f\x53\x72\x75\x11\x6e\x00\x37\xea\x70\x43\xf5\x11\x26\x6c\xec\xb6\x90\x68\x98\x1b\x53\x9a\xca\x36\xa2\xf5\x15\x3b\x89\xe0\x49\xe6\x4b\xa3\x2a\xc8\x13\x42\xc3\xe0\xf6\x88\xc0\x21\xae\xc8\x7c\xd6\x35\x3b\x24\x80\xfb\x23\x81\x8e\x2d\x81\xb8\xb0\xb1\x53\x2e\x14\x7e\xf4\x86\x22\xa3\xcd\x36\x24\x65\x01\xba\xf4\x7c\x69\x4b\x5c\xff\xa5\x59\x40\xda\x7f\xa5\x40\x43\x2a\xb7\x86\x43\xe3\x2d\x41\x82\xa0\x26\x52\x2c\x70\x5b\x13\xa9\x71\x10\x47\x34\x48\x4c\xbb\x04\x58\x03\x09\x42\x52\x85\x28\x89\x81\x2b\x32\xd6\x02\xee\x39\xd9\x44\x2e\x65\xe1\x3b\x81\xc7\xf0\x8e\x7c\x44\x22\x1f\xe6\xa2\xbe\x8e\xc2\x42\xc5\xea\xea\xde\x60\xe2\x0f\x01\x8e\xd6\x8e\x4e\x3c\x27\x74\x69\x4b\x6a\x61\xa5\x0c\xa1\x1c\xa0\x04\x92\x10\x72\xa1\xf6\x87\x7d\xd3\x79\x72\xfa\xe7\x82\xe5\x57\x3a\xe9\xd4\xea\x27\xb2\x23\xb7\x01\x3f\x5e\x32\x82\xdb\xe5\x92\x71\xf4\xe8\x04\xc8\x50\x2f\x97\x18\x74\xf0\xa7\x20\xaf\xd5\x8d\xf1\x8f\x6f\xd7\x90\xe6\x4e\xa6\x28\xb0\x29\xb1\xc8\x0f\x85\x71\x98\x4a\x04\xca\x25\x3f\x4d\x10\xf6\x18\xc4\x01\x7a\x6b\xbd\xb1\x60\x6b\xf0\x42\xa0\xe8\x68\x9c\x28\x2c\x63\x12\x42\xa4\x20\x4c\x6b\x33\xcb\x85\xad\xb6\xb6\x82\x22\xad\x1a\xd0\xf4\x61\x84\x1a\x39\x2b\x28\x72\x48\x79\xc3\xb9\x5d\x76\x53\x63\x54\x6c\x7a\x75\x0f\xac\xfc\xdb\x58\x02\xcd\x3e\xd0\x77\x0f\x67\xe0\xcc\x4f\x2d\x79\x05\x13\x07\xba\x7c\x93\x7b\xe1\x9e\x97\xca\x6d\xf3\x2a\x0f\x65\x8e\xcc\xa5\x7d\xcb\xa4\xfc\xf3\xa6\x26\x1a\x57\x88\xc8\xe5\xa5\x5a\x9a\x9a\xa8\x7a\x08\x16\x04\x9f\x08\xb0\x45\x4c\x5d\x2c\x4c\x45\x54\x67\x09\x71\x61\xee\x1e\xcb\x59\x38\x49\xcf\x39\x57\x4f\x7a\xf5\x91\x3e\xda\x65\x7b\x07\x49\x29\x40\x6f\xa4\x6c\x0f\x80\xa6\x53\xd7\x08\xbf\x82\x06\xab\x59\x8a\x3a\x0f\x38\x0a\xd1\x50\x3c\x46\x4a\x5b\x4e\x08\x77\x2d\x21\xa1\x16\x98\xd4\x2a\x56\x13\xc9\xa7\xba\xa4\x71\xfb\x8e\x43\x67\xea\x21\x45\x81\x6b\xb0\x7b\x70\x05\x22\xeb\x32\xb1\xe5\xf9\xd1\xf0\x4f\xbc\x63\xfa\x0d\x83\xe1\x6a\xbf\x49\x44\xd1\xa3\x52\x0d\x97\x03\x6c\x85\x0e\x44\x04\xf0\x6a\x28\x7e\x13\xec\x3b\x65\xe5\x92\xfb\xdb\x32\xaa\x03\x8b\x6c\x06\x37\xcc\xa4\xea\x81\xc1\xea\xde\x7c\x8f\x6e\x34\xda\x86\x2e\x12\x03\x91\xb2\x94\x32\xee\x81\xa9\xb6\xbe\xb6\xef\xb1\x37\x50\x26\x61\x37\xc6\x5f\x31\x87\xba\x20\xc4\x17\x5d\x00\x19\x63\x29\x84\xd7\x60\x29\x61\x67\x03\x81\x1c\x26\x53\xbd\xb3\xea\xc6\xea\xc2\xa1\x8d\x60\xa0\x64\x81\xce\x1c\x9a\x04\x35\xf4\x4c\xf4\x07\xaa\x28\x84\xff\x0f\x7f\xc5\xd5\x33\x69\x51\x0a\x5a\x1b\x1b\x1b\x8c\x0d\xb7\xd6\x18\x99\x83\x42\x51\x52\x21\xe1\x27\x37\x28\x4c\x0a\x6c\x39\x72\x7e\x11\x88\xca\x60\xe3\x8f\x86\xea\xed\x18\xda\x9c\x23\xf7\xc6\xf4\xe2\xfd\x74\xf4\x51\x45\x82\xb2\xd3\x40\x24\x77\xf2\x61\x34\x7d\x3f\x06\x9e\x15\xe4\x25\x13\xef\x02\xfc\xaa\x78\x41\xd6\xa2\xca\xb8\x1c\x4f\x3f\x4e\xae\xae\xb0\x9b\x7e\xca\x9b\x31\x64\x2a\xb3\x4f\x1f\xc6\xe7\x91\xda\x45\xcd\xae\x46\xfe\xf9\xc9\xb9\xfa\x34\x9d\x00\x35\x07\xf2\xb5\x5d\x7e\x9e\x4e\xde\x7f\xb8\x52\x1f\x2e\xce\x4e\xc7\x53\x00\xd2\x3e\x67\x4e\x18\xa6\x63\x61\xbe\xbe\x64\x4e\xcc\xd0\xf7\xdb\x50\xf3\xfd\xfe\x9d\xfa\x7f\x05\xe7\x9e\xd8\xc6\x0e\xd5\x9e\xfc\xf7\x16\xc3\x1e\x52\xea\xf5\xb1\xe3\x9d\x9d\x7d\x03\x3b\x1e\x1c\xac\xe3\xa1\xdf\xba\xf3\x0b\x60\x80\xb9\x52\xd7\xe7\x67\x7e\xae\xd3\xf1\x7f\x5c\x4f\xa6\x7d\xc7\x00\xc8\x65\xde\x4f\xc7\xb0\x94\x72\xd7\x3f\x4d\xce\xce\x88\x1a\x2f\xdd\xfa\x2c\x65\xf8\x43\x72\x99\x4f\x1f\x2e\x80\xe8\x04\x10\xd3\x9f\xf9\x70\x4c\xc7\x01\x52\x9d\x9e\x89\xd1\x4c\x1c\xcd\xd1\xdb\x0b\xbf\x06\x09\x93\x8f\x5f\x10\x60\x8e\x61\x9a\x95\xc8\x4f\xe4\x3f\x4d\x45\x8a\xbd\xa4\x3e\xfb\x39\x7d\xb8\xb9\x7f\xbb\xa3\xff\x54\x4d\xce\xf9\x84\x5c\x21\x2d\xa0\x1c\xac\xe0\x46\xea\x9e\xbe\x40\xef\x73\x3a\xba\x1a\x29\x18\xf1\xd5\x48\xbd\x1d\xfb\xa7\xa7\xe3\xf3\x53\xa0\x35\x9a\x9c\x8f\x4e\x4e\xae\xa7\xa3\xab\x71\xe4\xe8\x51\xb3\xeb\xd9\xd5\x68\x72\x8e\x9b\xe2\xe7\x0b\x57\x79\x32\x3d\x0d\xb7\x09\x0e\x68\x20\x05\x4a\x8f\xd8\xd5\x85\xba\xb8\x1c\xc3\x2b\xe1\xa8\x89\x0d\xc1\x27\x66\x83\x16\x0b\x10\xee\x9e\x4a\xee\xec\x67\xf5\x61\x34\x43\x3a\xa0\xd1\xe9\xcf\x93\xd9\x23\xd9\x80\xc6\xe7\xf8\x5c\x0f\xa2\xfe\xc9\x07\x44\x35\x8d\xc0\xe9\xc4\x30\x2a\xb4\x83\x20\xe6\xab\x0a\xf8\x8a\x49\x99\xb9\x27\xa4\xfd\x96\x58\xf8\x4d\x0c\xac\x5b\x89\xe5\x11\x95\x62\x64\xf8\x93\x42\xbc\xc1\xe6\xf0\xb1\xdd\x34\x58\xf1\x6c\x6d\x81\x09\x47\x5e\xb5\x7f\xe8\x4e\xef\x30\xe6\xbc\x86\x06\x26\xa0\xd5\x11\xc0\xc1\x64\x1e\xa9\xc4\x47\x45\x17\x0a\x61\x16\xba\x4c\xe3\x97\xa2\x98\x52\x82\xbe\x6a\xec\x7c\x71\x15\x43\xae\x75\xad\x29\x9f\x14\x4d\x9f\x00\xa9\xb5\x32\x0b\x3a\x24\x47\xdc\xe9\x95\x1f\xb1\x1f\x6d\xf8\xf1\x86\x9f\x05\xcc\x1d\x64\x8f\xfc\xbf\x50\xf6\x04\x3b\x2f\x53\xad\x65\xe8\xaa\x85\xb0\xa7\x5b\xb3\xa3\x7c\x14\x74\xc5\x43\x2b\x2c\x85\xe5\xc2\xab\xe0\x1d\x6e\x0d\xa1\x12\xb0\xdb\x44\x96\xde\xa8\x83\xa0\xef\x0f\x54\x91\x97\x0c\xb5\xdb\x5a\xf0\x6f\xb0\xe3\x0c\x53\x06\x42\x1a\x80\x99\x99\xbd\xe2\x6e\xca\xe5\xf0\xc9\x5f\x00\x15\x01\xbf\xe5\x4c\xbf\x98\xfb\x53\x87\xcc\xb6\x18\xee\x52\xf9\xd2\x68\x44\xfe\x68\xd8\x78\x40\x64\xab\xbf\xb6\x0a\x8e\xff\xa2\x76\xbb\xdd\x4e\xfd\x55\xfd\x25\xd0\xe2\x92\x29\xf3\xd7\x27\xe0\x66\x8a\x52\x9c\x64\x77\xdf\x84\xaa\xc0\x64\x4f\xd1\x9c\x15\xf5\x55\x79\xbd\x8f\x96\xf9\x9e\xaa\x5c\xed\x1e\x6f\x05\xbe\x11\x65\x0b\x58\x5e\xdd\xe1\x94\xb6\x95\x3a\x4c\xe1\xc8\x83\xae\x11\x3c\xec\xcc\x57\x06\x16\xc8\x8d\x5a\xdb\x2d\xb7\xba\xae\x83\xdd\xd4\x38\xb3\x6a\x0a\xf4\x46\x58\x43\x7b\x59\xc2\x5a\xfa\x4d\xa8\x71\xa0\x0c\x1f\xc4\x66\x0b\x80\xf0\x31\x9e\xd2\xae\x3a\x8a\xd6\x56\x8f\xd0\xb3\x33\x63\x1e\x5a\xcc\x15\xf7\x45\x41\xdf\xc8\x0d\x9f\x7c\xb6\x4d\x72\x4c\x23\xc4\x21\x81\x6e\xdc\xb7\x41\x32\xd7\x18\x57\xed\x8d\xf7\x3c\x4b\xdb\x36\x8e\xef\x2f\x65\xcf\xd4\xaf\xa9\x65\x1f\xaa\x51\xe1\xc0\xdb\x4b\x90\x1b\xb6\x64\x6c\x28\x00\x00\xb0\x04\xd1\x1f\x25\x53\x98\x45\x5d\xd9\x32\x5f\x50\xbd\xdc\xd6\x54\x6a\xa3\xf3\x62\xf8\x84\x5c\x1b\x71\x02\x04\x2a\x34\x0b\x42\x8e\x8a\x34\xb4\x5f\xc2\x2a\xe0\x66\x8b\xfc\x0b\x89\x44\x40\x1f\xe6\x35\x8a\x19\x87\x15\x0a\x09\xbe\x74\x63\x97\xe6\xa7\x27\xef\x4b\xbb\x61\xfa\x24\x3e\xba\xaf\x7e\xcc\x54\x7a\x3f\x77\x46\x57\xed\x9b\x29\x7f\xb9\xb0\xde\xd0\x87\x8d\x18\xbd\x9d\x5d\x9c\x5d\x5f\x8d\xcf\x3e\x4b\xf3\xf6\x0d\xec\x3f\x6d\xbd\xaa\x77\x5b\xa3\xfe\x13\x2a\x39\xef\x9e\x52\x25\x56\xfb\x66\x47\x9d\x01\x42\xdc\x14\xfe\x1b\x18\xf7\x4d\x2f\x3a\x55\x21\x85\x98\x0e\x3b\x4a\x6f\xe4\x67\x16\x4f\xe5\x00\xb0\x2c\x6d\xbd\xdb\x7a\xef\x0b\x72\x4f\x11\x3a\xcd\xc3\x82\xcf\x87\x1f\xd3\x39\xe5\xe2\xd3\x04\xbc\x9c\x38\x77\xfb\xea\xb6\x2e\x56\x90\xee\xa0\x0c\x45\xfc\xdc\x0e\xf9\x66\xb8\x34\x6c\xa1\x21\xaf\x0e\xce\x13\xf8\xfc\xa2\x68\xa8\x77\x64\x54\x03\x84\xf1\x73\xb8\xd8\x73\xbf\xb5\x8d\x33\xcf\x16\x45\xbe\xf8\x02\xc1\x86\x8d\x29\x1b\x60\x97\x73\xcf\x9e\x79\x41\x0c\x0e\xae\x6b\x72\x4c\xb5\x86\x4a\xf7\xe4\x4a\x02\x02\xee\xc6\x90\xbc\x32\x9b\x6d\x61\x77\xc4\xc4\x0a\x8a\x3c\xa0\x7e\xe9\xc7\x1b\x53\x41\x73\x40\x78\xdc\x79\xaf\xba\x88\x44\x55\xb5\x85\xdc\x2f\xf2\xdd\xf1\xc1\x8a\xa5\x2b\x07\xb1\xbe\x83\x0d\x06\x7f\x83\x99\xa8\x6b\xa8\x3e\x18\xe6\xcb\x73\x90\xda\x78\x23\x3a\xbd\xf8\x63\xe9\x7e\x7a\xf2\xd9\xee\xec\x72\x57\x1a\xbe\xcd\xd4\xba\x84\x3f\x82\x48\x9d\xf8\x71\xb8\x09\x06\x7a\x8a\x25\xd7\xed\x3f\xc5\xb1\x7e\xaa\x0e\xb9\x25\xce\x17\xe3\xb0\xa8\xd5\x29\x82\x8c\xe4\x85\xa9\xdc\x20\x04\xb8\xe6\x3b\xf5\x37\x3f\x10\xf5\x41\x2f\xbe\x98\xca\x6b\x49\xc4\x73\x34\xc8\xbe\x7c\xb5\x53\x27\xd6\x96\xea\xaf\x2a\x53\x47\x6a\xb4\xad\xf2\x02\x68\x36\xf8\x1f\x32\x75\x59\x19\x97\x73\x4d\xd4\xcf\xf9\xc2\xfc\x1a\x62\x9a\xe1\xf3\xd1\xfb\xcb\xb3\x67\x2f\x87\x2f\x9e\xd9\xb2\xd8\xfd\xf6\xe4\x2f\x0f\xf1\xbf\x1c\xbd\x38\x7e\xf9\xaa\xcd\xff\x72\xfc\xfa\xe5\xeb\x3f\xf9\x5f\xfe\x88\x3f\x5e\x69\x8e\xde\xbd\x1b\x4f\x2f\x1e\xa2\x81\x79\x99\xa9\xa3\x1f\xd5\xb9\xbd\x35\x10\x27\x3b\x7e\xf1\xe2\x75\xcb\x38\xf3\x7f\xf5\x80\xf2\x54\x7f\x59\xd7\xf5\x56\x39\xf5\xd3\xf3\xe7\x2b\xb7\x1a\xda\xea\xe6\xf9\x5f\xff\x25\xf8\x5d\x60\x21\x56\x2b\x53\xd9\x7b\xb8\x57\xb0\xfe\x3a\x83\x71\x15\x66\x55\x27\x9d\x23\xd2\xd0\x11\x88\xe3\x2f\x39\x14\x1c\xae\x10\x2f\x91\x71\xe4\x15\x31\x0c\x92\xbf\xc3\x94\x40\x7a\xb0\xb0\x84\x4f\xe3\xf6\xc5\xac\x02\x9a\x12\xbb\x21\xe1\x5f\x68\x0c\x3c\x95\xa6\x06\xe9\xea\x4c\x75\x2b\x78\x1a\x87\x0f\xf2\xd5\x84\xf1\x51\x86\x4b\x17\x04\xe8\xf8\x15\x4c\x36\x8c\x9d\x74\x2d\x42\x1b\xfb\x00\x8b\xc9\x2f\xa4\xb3\xf1\x42\x5a\x06\xf3\x83\x7a\x69\x51\xdb\xe4\xcc\x4d\xdf\xb2\x1a\x7a\xe8\x6d\xfe\xed\x88\x5b\xcc\xe6\x5f\x90\xb0\x25\xfb\x16\xc2\x96\xc0\x0e\xe7\x42\x3d\xd6\xbd\x07\xea\xb1\xfc\x1d\xc4\xd3\x1f\xb5\x3c\x81\x74\x1e\x64\xf2\x38\xfb\xdd\x98\x3c\x94\x33\xde\x24\xd5\x95\x37\xef\x4a\xb3\xca\x6b\x2c\x1c\x59\x19\x84\x68\xfb\xb3\x0a\xe7\xf4\x69\x38\x17\x39\x77\x2e\xdd\x6c\x2b\x2f\x96\x21\x1f\x89\x34\x0d\x65\xc0\x6f\x9b\x4e\xce\x4b\x9a\x4e\x60\x13\xf2\x69\xb8\xcb\x97\xc6\x6d\x2b\xa3\x97\xc8\x6c\x08\xad\x21\x24\x87\xe1\x4a\xf6\x74\x0e\x1b\x93\x64\x30\x28\x55\x2e\xfe\xbd\x73\x50\xfd\xff\x5b\x1b\x5d\x21\x4b\x06\x44\x23\x4a\x6f\xf2\x6a\xd1\x22\x1e\x9b\xb7\x21\xbc\x29\x88\x44\x01\x06\x6c\x49\xc2\x48\x51\x4b\x08\xa2\x54\x34\x3a\x4a\x47\x52\x4b\x38\x6f\x42\x8b\x36\x1a\x46\xe9\xb9\x6d\x6a\x4c\x2c\xde\xe3\x44\xa2\x66\x72\x0c\x0c\xef\xe9\xfc\xe3\xe7\x52\x98\x3a\xa4\x0b\x08\x4f\x40\x30\xdc\xbc\xc6\x32\x00\x12\xd7\xc2\xc9\xae\x54\x65\x0a\xa3\x89\xd5\x2a\x2d\x22\x4f\xa2\x5b\xc3\xc7\xab\xaa\x20\x64\x12\x9d\x13\x55\x8d\x3f\x39\xb0\x8e\x21\x67\x4b\xe9\xea\x30\x2b\x39\x0a\x3c\x0a\xad\x36\xeb\x89\x72\x82\x50\x16\x61\x3d\x9d\x80\x5a\x53\x0e\xaf\xad\xac\xa0\xa6\x10\x2b\x2f\xdb\xb0\x64\xdb\xaa\x61\xe5\xd5\x15\xa5\xfe\x55\xf8\x3e\x56\x68\x06\x34\x04\xbc\x3c\x01\x61\xd2\x1e\x50\xae\xa6\xbb\x69\x19\x6e\x0a\x3e\x56\xec\x68\xb3\x72\xac\x47\xac\xe0\xb0\xe1\x35\xef\x6e\x28\xc7\xe7\x1e\x1e\xfb\xf0\xc9\xa8\x54\x98\xf3\x0f\xb8\x65\xf2\xe0\xfc\xe3\xf7\x6f\x26\xf8\xfd\x32\xbc\x84\x8f\x67\xea\x4e\xbb\x44\x97\x20\x1e\x1d\x52\xdf\x9c\x93\x86\x8c\x58\x74\x9c\x7b\xdb\x4a\x82\x4d\xd4\xee\xcf\xc5\x43\xba\x3c\x43\x3b\x8a\xfe\x7b\xad\x1d\x9d\x55\x08\xbf\x88\x7c\x78\xf7\x87\xcc\x29\x4b\xd7\xa6\x32\xb1\x55\xb1\x40\x38\x14\x9c\xdc\xff\xa3\x08\x60\x88\xd5\xe5\x34\x14\x50\x60\x6a\xfd\x40\xd2\xbc\x1c\x08\xa2\x14\x9e\xdf\x4b\x19\x67\xba\x77\xc7\xf0\x7d\x27\x31\x7c\x4a\xa5\xf3\xba\x14\x49\xd4\x67\x10\x81\x01\xda\x59\xe4\xd2\xe1\x62\xd2\x3d\x96\x23\xd4\xc1\x38\xe5\xcc\x26\xf7\x6b\xd2\x2c\x6a\xa8\x51\x71\x5f\xc2\xf0\x05\x41\x4b\x4a\xf3\x12\xbe\x19\x2a\x55\x62\x1d\x7a\x1f\xe0\xfc\x31\x94\x25\xea\xe0\x8c\xcb\x3e\x0f\x10\x11\x10\x01\xae\x07\x1c\xa4\x88\xd4\x44\x88\x12\xab\x6e\x74\x49\xc4\xb1\x38\xea\x2b\x4b\x84\x29\xbb\x83\x56\x7d\x8e\xac\x79\xf0\x96\xda\x52\x6f\x89\x78\xa0\x0a\x65\xb0\xa1\x5c\x07\x48\xa0\x57\xda\xad\x91\xed\xd7\xcb\x20\x54\x1d\xac\xde\xa3\x62\xce\xda\x6d\x19\x49\x9a\x03\xce\x40\x99\xaf\x7a\x81\x66\x01\x6a\x83\xa8\x86\xf0\x3b\x8e\x6f\xad\x66\xa2\x97\x78\xc7\x0f\x42\x0d\x8d\xae\x8a\x9c\xab\x1e\x63\xe1\xd1\x01\xc3\x9c\x0f\x3a\x4f\x21\x01\x8c\x3a\x60\xd2\x14\xff\x77\x3d\x2c\x3b\x4d\x19\xbe\x99\xd0\xe2\xec\x05\x51\x87\x35\xde\x56\x76\xab\x6f\x74\x6d\xba\xcb\xbc\xb4\xb1\x34\x07\x4c\xa5\xbc\x26\xdd\xc0\x0a\x4a\x2e\x1e\xe2\x2a\xc1\x68\xc5\x82\xe5\x88\xe3\x64\xfb\x25\x2f\xb0\x81\x2b\xd9\x0b\x09\x54\x98\x40\x91\x91\xa5\x3c\xe1\x04\xca\xb8\x62\x03\xcb\x64\xc8\x6b\x03\xf1\x1c\xc8\xe8\x13\x50\xba\x37\xfa\xf3\x5b\xe6\x05\x80\x6e\x55\x30\x4d\xa4\xe9\xa0\x96\x91\xfd\x22\xe3\x10\xf9\xf9\xa3\x1a\x96\xf2\x63\x90\x05\x25\xdf\xd6\x77\x9c\x65\xc2\x02\x2a\x88\xbf\x09\x54\x14\x9e\x2d\x1d\xa9\x7c\xb4\x53\x77\xa6\x28\xc2\x46\x60\x76\xa6\xb5\x0b\xfe\x8e\xfa\xfb\x4e\x78\x83\x30\x05\x24\x66\x03\x32\x71\x7e\xb5\x00\x76\xc3\x26\x00\x89\xb7\x84\xd6\x0e\xd5\x47\xc3\x55\x84\x58\xcb\xc0\xb5\x99\x40\x40\x10\x00\x7d\x71\x45\x49\x31\x13\x2d\x7a\x69\x03\x55\x0a\x23\xc2\xbd\x15\x4b\xae\x33\x0e\x3f\x2f\x6f\xf0\xc4\x96\x6d\xda\x87\x4a\x56\xa8\x21\xb7\x83\x53\x07\x23\x11\x03\x3d\x03\x43\x99\xfa\xf6\x1f\xb4\xe8\xeb\x39\x53\x21\xda\x7d\xc2\x17\xcb\x9c\x2b\xf7\x03\x5b\x48\xb1\x53\xb7\x39\xc1\xe1\x0d\x06\xcf\xe0\xd7\xde\xba\x0f\x5f\x7e\x80\x3c\x22\x5a\xf9\xb5\x29\x0a\x17\xec\x89\x07\x79\xef\x48\xec\xf4\x73\xf0\x23\x73\x01\xfe\x80\x8b\xa1\xb8\xea\x88\x7d\xb0\x58\x32\x4f\x4d\xb4\x39\x65\x97\x54\x4a\xb7\x19\x08\x1e\xc3\x1e\x41\x49\x81\xb8\x0d\xa1\xf3\x82\x56\x45\x8e\x48\x49\x98\x63\x08\x2c\x5b\x4e\x32\x09\x2d\xa3\x21\x12\x9c\xa1\x57\x4d\xf4\x2c\x39\x81\x53\x11\xbe\xe7\x6a\xe0\x82\x71\xf8\xf9\x45\x95\xd7\xa6\x0a\x18\xa7\xa1\xec\x9d\x1d\xfa\x9a\x1c\x08\x43\xe9\xe0\x37\x2f\xc9\x3c\xb8\x88\x05\x64\x07\xe2\x62\x95\xb6\x7c\xc6\x39\x53\x7a\xa7\x4e\x84\xee\xac\xd6\x5e\x6c\x2d\x91\x4b\xdf\xaf\x59\xfc\xb9\x58\x47\xbc\x8c\x28\x8c\x73\x47\x25\xa9\x39\x94\x44\x3a\x7e\x03\xb7\x46\x99\xef\xa0\xff\xf4\xc2\xde\x94\xf9\x7f\x79\x4b\x9a\x1e\x70\x80\x6b\xcc\x94\xed\x7a\x30\x11\x34\x2a\x9a\x1b\xe0\x1a\x09\xfc\x38\x87\xd0\xa1\xcf\x14\x11\x97\x65\x90\x65\xe5\xaa\x4a\xef\xc3\x71\x5d\x31\x62\x36\x85\x2b\xe6\xa7\x0d\x52\x95\x64\x4b\xe0\x3e\x0b\x5b\x34\x43\x78\xef\x59\x3e\xaf\xb4\x97\x68\x07\x41\x31\x26\x95\xae\x9d\xaa\xce\x8e\x5a\x6d\x91\x7d\xd0\xb9\x3f\xd4\x83\x84\x4c\x8d\x16\x01\x4b\x41\xc3\xfe\x6c\xf5\xe2\x8b\xbe\x41\x01\xff\x11\xaa\x3c\x4f\xb8\xf4\x12\x8d\xd1\x00\x49\x83\xa0\x4b\xb0\x06\x74\xdd\x7d\x9c\x7b\x9c\x82\x2d\xef\x42\x9b\x0f\x94\xaa\x12\x04\x1c\xa9\xe9\xfb\x5f\x84\x68\xb9\x00\x18\x57\x5a\x75\x0f\x0e\x6c\x18\x41\x26\xcb\xf8\x6c\x20\x91\xdb\xa3\x4d\x50\x91\x24\x65\xc1\x9b\xa1\x3f\x9a\xad\x41\x1c\x64\xa1\xd1\x3c\xc0\xe9\xbf\xd6\x19\x9f\x54\xaa\x86\xf5\x46\x5a\x59\x73\xa7\x1d\x2c\x56\x3d\xe4\x62\xd8\xbb\xbc\x5c\xda\xbb\x00\x82\xef\xd6\xc6\xb2\xa7\xd8\x2d\x92\x3d\xc4\xfc\xcc\x60\x6f\xb5\x2c\xac\x1e\x96\xcc\x62\xe9\x3e\x25\x3e\x42\x11\x32\xb6\x2a\x8f\x61\x42\x7c\x2e\xad\x01\x87\x3b\xb0\xad\x4c\x2d\x7e\x57\x35\x65\xa4\x00\x31\xde\xaa\x96\x75\xeb\x28\x66\x12\x61\xd2\xaa\x2b\x87\x33\xb5\xbf\x02\xbb\x34\x86\x63\x8f\x60\xca\xd7\x26\xe3\xba\x68\x3a\x3b\xab\xde\x52\xef\x01\x0c\xac\x55\xb7\xca\xa4\x68\x22\xc0\x83\x53\x8d\x74\x46\x5c\x9b\x9d\xf0\x85\x58\xaa\x3b\x44\x9b\x41\x46\x39\x04\xb1\x0f\xdf\x38\x7e\xeb\x53\xa7\xda\x97\x15\xd6\x94\x40\x88\xcf\xb8\x62\xa2\xb6\x16\xad\xef\x80\x4e\x94\x01\x9d\x16\x9c\x14\x4e\x2e\x87\x51\x84\xb9\x99\x97\x92\x60\xa1\x3d\x62\x71\x27\xb9\x5c\xad\x6d\xa2\xb7\xea\x8d\xfa\x76\x31\x6a\xfd\xfd\x55\xee\xb2\x16\x1e\xe9\x01\x22\x1a\xc6\x25\xca\x39\x92\x14\xb6\x0b\xee\x21\x94\xbc\x54\x05\xaf\x1a\xe6\x17\x76\xa5\xde\x50\x8c\xa4\xc8\xcb\x2f\x5e\x68\x37\xf3\xb0\x32\xa1\x1d\x0a\xbb\x01\x7b\x03\xf9\x14\x01\x89\xaa\x74\xbe\xf3\xf3\xc9\x37\xde\x00\x59\xea\x5a\x73\xc4\x84\xeb\x38\xaa\x70\x10\x56\x85\xbd\x0b\x8d\x3e\x60\x8d\xfd\xa9\x97\xc3\x10\x81\x7b\x99\x4a\x0e\xda\x0c\xbb\x87\xf5\x2c\xed\x03\xd5\xf8\x18\x44\x41\x70\x0c\xdf\x83\x56\xc1\x25\x3a\x62\xdd\x6f\xf7\x7d\xee\xfe\xb1\xa4\x77\xb5\x2d\xf7\x42\x50\x13\x6a\xd2\xc3\xcc\x8e\x87\xea\xad\x76\xf9\x42\x5d\x46\x0a\x22\x54\xe0\xdd\x66\xa2\x7d\x25\x75\x95\x09\xff\xcc\xa7\x04\xe8\x3a\xed\xaa\x1b\x04\x4e\x78\xa5\x20\x45\x51\x55\xe6\xd6\xa2\xc3\x22\x18\x60\x10\x52\x6c\x96\x6d\xcc\xf5\xc6\xd4\x2d\xd2\x58\x2e\xd9\xf0\x77\x6f\xb5\xca\xab\x0d\xa5\xd3\x9b\x92\xcb\x23\xd3\xc8\x31\xcb\x96\xae\xc3\x87\x6e\xa9\xe4\xdd\xe4\xa8\x98\x56\xd2\x7b\xec\x50\xdd\x8b\xd1\x30\x35\x47\x1d\xde\x94\x51\x21\x81\x20\xe9\xcc\x04\x49\xa7\x6b\xbd\xbc\x4d\x89\xbb\xf8\x52\xda\xbb\xc2\x2c\x6f\x8c\x4b\x22\xef\x76\xa5\x56\x3a\xaf\x98\xf6\x17\x4f\x4f\xa4\x27\x80\x1a\xd4\xb0\x9e\xb2\x88\xc6\x3b\x83\x09\xc5\xa3\xf7\x75\x32\x58\x16\x72\x02\xd0\x9b\x4d\x46\x25\x48\xc5\xa9\xaa\x13\xed\xea\xe8\xc8\x8a\x7d\x12\x95\xed\x30\xe2\x50\xcf\x1f\xaa\xfe\x39\x6b\x94\x97\x0a\x8a\xfa\x24\x33\x11\x98\xeb\xad\x6f\x5b\x66\x95\xe6\xf3\xd5\xae\x5b\x23\xf6\x52\x48\xcb\x80\xef\x96\x9a\xb1\x04\xd6\x03\x0c\x1f\xd1\xbc\x67\xa1\x69\xdb\xd2\x50\x1a\xa7\x5e\xab\x95\x5e\x48\x3a\xf8\x18\x15\x85\x5a\x4b\x8c\x16\xf5\xf1\x8a\x8a\x76\xd1\xfb\x78\xbe\xb0\xed\x1b\xb9\x78\xc8\x4c\xa2\xbd\x5d\x8f\xb6\x19\x89\xf8\x74\x81\x89\x59\x84\x36\xce\x9f\x0c\xac\x00\x6b\x42\x9c\x3c\x19\x63\x7b\xcb\x98\xd0\x1e\xe8\x8c\x00\x3f\x99\x2c\x84\x25\xc2\x9f\xb9\x59\xeb\x62\xc5\xe4\x4e\xf0\x57\x18\x7a\xe0\xe8\x1f\x8d\x04\x82\xb9\x38\x35\x98\x39\x57\xf0\xe3\xaa\xc3\x7d\x61\xc7\x1e\xe3\x62\x94\x49\x0b\x3c\x9d\x5c\xdf\x10\xe6\xcd\x7c\xb9\x44\x15\x6f\xa8\x8f\xd4\x3a\xdf\xe2\x5a\xee\x6c\x83\xad\xec\xc3\xb2\xc5\xc2\xcf\x9e\xe2\xcb\x34\xc3\xed\x8f\x88\x37\xd6\x03\xe0\x50\x9e\x50\x94\x2d\xc0\xdb\x3c\x54\x33\xa6\x9c\x00\xf3\x3d\xc9\x63\xbf\x09\xa5\x75\x47\x2f\x08\x80\x02\x60\xa7\x88\x8a\x21\x66\xad\xcb\x58\x38\x79\x8d\x89\x24\x74\xc6\xa9\xd7\xe0\x3b\xbf\x3a\xa3\xb2\xce\x9f\x9d\xc0\x88\xb9\xef\xd8\x19\xdd\xc5\x73\x9b\x4a\x98\x76\x1f\xa5\x40\x4e\x57\x46\x3c\xaa\xaa\xcd\x62\x5d\xda\xc2\xde\x40\x92\x79\x63\x34\xe4\x1e\xe2\x12\xa5\x0d\xeb\xd4\xaa\x29\x56\x54\x91\xd8\x2d\x92\x06\x37\xa8\x30\xea\xe8\x88\x95\xcf\xa7\xc9\xe5\x85\xe4\xe2\xaf\x8c\xae\x77\x4a\x2f\xed\x16\xab\xd7\xd4\xf1\x0b\x75\x6a\x16\x08\x58\x38\xfa\xf1\xc7\x57\x70\xa3\x38\x36\x0e\xb1\x57\x3e\x21\x7c\x52\xb9\x72\xbf\xbc\xa1\x8d\x0b\xed\xd7\xa8\x1b\x02\xcd\x01\xb5\xcf\x27\x66\xee\x23\x99\x90\xca\xc9\x8c\x52\xa8\x4c\x71\x45\x49\x42\x7b\x87\xf9\x0f\xea\x29\xd1\xf9\x4c\xef\x9a\xb9\x56\x94\x01\xb3\x36\xc9\x4f\x73\x47\x0b\x8f\xd2\x94\x48\x06\xfc\x4c\xf6\x77\xe8\xea\x6b\xfc\x9c\x4e\x81\xc1\x75\x8c\x8f\x82\x99\x20\x1d\x1e\x69\x2b\xd0\x61\x2a\x02\x17\x38\x44\xd7\xea\x6c\x17\x3d\x42\x34\xc7\xed\x2a\x92\x18\x64\x49\xf7\x38\x32\x6f\xc1\x2a\x21\xb2\x4a\xac\x04\x8a\xcc\x06\x4f\x69\x31\x23\x97\xdf\xb7\xad\x26\x53\xcc\xc4\x6b\xfb\x33\xc3\x4a\x4e\x30\x8e\x96\x30\x0c\xe3\xee\xfe\x8f\x24\x7f\xee\x32\x3c\xf7\xf2\xec\xf6\x32\x10\x94\xb6\x7c\xc6\x96\xc9\x6d\xc8\xca\x2c\xc9\x73\x97\x44\x5c\x2c\x82\x5e\xa7\xdc\x9f\x7e\x25\xf6\x0f\x80\xd6\xef\x11\xfc\xd1\xde\xc8\x13\xbd\x44\x7e\x35\x55\x34\x30\xf7\xe7\x0b\xea\x46\x40\xff\x3b\xb4\xd1\x20\xa6\xa2\xb8\x29\x60\x45\x48\xb2\x68\x44\x05\xb8\x66\x0b\x3d\x04\x6d\x3f\x51\x74\x4a\x0e\xfd\xbd\x3c\x6c\x1f\xd9\xac\x23\x9b\x98\x30\x56\xbd\xa7\xee\x5e\x6e\x4f\xb2\x35\x3a\x11\x31\x76\xb7\xf3\x2e\x3b\x7b\x08\x3d\x71\xb8\x45\x9e\xda\x1e\xec\x3b\x6f\xed\x77\xbf\x96\x14\xfa\x8a\x85\x00\x11\x0b\x3f\x92\xfd\x39\x3a\xa1\x14\xce\xb9\xc9\x6f\xd1\xe0\xad\x4c\x61\x6e\x75\x59\x03\x0d\xb4\x20\x7e\xfe\x05\x1f\x42\x74\x58\xc8\x6c\xde\xc3\xca\x21\x8d\xfd\x65\x24\x92\x0a\x17\x80\x8c\x63\xc1\x87\xcb\x33\x70\x84\x6c\x88\xff\xe0\xfd\x1f\x5e\x5d\xbf\x6b\x07\x7b\x6e\xca\x81\x60\x78\x0e\xac\xd6\x6c\xb2\xd6\x82\x6a\x15\x25\xb6\x88\xba\xf5\x4c\x04\x93\x82\xb6\x44\x62\x0e\x4c\xeb\x43\x85\xe9\xd6\x3a\x67\x42\xdf\x43\x1d\xd2\x60\x6d\xe2\xa8\x9a\x93\xeb\x78\xd7\x33\x79\xf1\x5a\x3a\x5d\x88\x05\xa2\x31\xd5\x05\x93\xe8\x32\x4b\x02\xb2\x6c\xaf\x5a\x9e\x3b\x43\xb3\xc0\xd9\xcc\x5a\xec\xb0\x04\xae\xc6\x8e\x06\x18\x2d\x34\xcb\xd6\x50\x31\x69\xef\x2f\x77\xe2\x5a\xc9\x55\x0b\xb9\xc3\x60\xab\x01\x41\xf5\xbc\xa9\x5b\x91\x17\x20\xad\xd0\x4c\xaa\x2e\x5e\x48\x28\x29\x40\x6c\x31\xb3\x6f\x64\x27\x5a\x72\xe4\x4a\x29\xb5\x0c\xdc\xdc\xf0\xd5\xb5\x76\xf7\xe4\x4e\xb8\x81\x27\x5a\xc5\xc4\x91\xbd\x37\x8b\xf2\xc6\xaf\x07\x05\x8c\xd2\xc2\xe1\xf6\x57\x44\x90\x19\x2b\xff\x2d\x33\xc5\xdc\xff\x05\xc9\x18\x1d\x42\x09\xc4\xdc\x60\x36\x68\xb7\x53\x38\x5d\x92\x0c\xd2\x29\x12\x36\x23\x26\xdd\x90\x48\x82\x89\x90\x31\x93\x16\x09\x9a\xc9\x85\x49\xe3\x49\x08\x0b\xca\x2b\x45\x40\x69\xb0\x82\x12\x54\x53\xd7\x6a\x49\xdf\xb0\xb0\x9b\x79\xe8\x0d\x0c\xf5\x0e\x14\xa0\x41\xdb\x61\xa3\xb4\x2a\xbc\x72\xa8\x04\x3e\x0a\x2b\xd0\xbf\x8d\x05\x37\x93\x59\xe2\x52\x1d\x30\x61\xaf\x39\xe0\xdd\xe9\xf0\x30\xd6\x2e\xc1\x3b\xb1\xfe\xe6\x91\x73\x28\x14\xed\x2c\xd0\x98\x88\x3f\xb1\x55\x6a\x05\xd9\xce\xfb\xd9\x8a\x52\x73\xb3\xb3\xb0\x24\x9a\xa9\x93\x39\x33\x4f\x8e\x18\x3a\x25\x43\x35\x29\x45\xcd\x58\x3b\xa6\x00\xa5\x21\x61\x42\xf1\x86\x30\xcb\x7f\x4b\xca\x48\x4b\xa0\x27\x74\x14\x5e\xc4\xdc\x61\x51\x3f\x9e\xdb\xf2\x19\xa9\xc6\x77\x16\xca\xeb\xfa\xf4\x62\x7b\x70\x9d\xb8\xef\x7e\x6d\xe6\xd4\x77\xb0\xf6\xdf\xef\x55\x6a\x22\x29\xd7\x21\x8c\xed\x8d\x6b\x3d\x40\xd2\x8f\xc7\x29\xb0\x04\x7b\x61\xaa\x77\x52\x3d\x9e\xc4\x0f\xa6\x41\x71\xd0\xf2\x66\x33\xb7\x4b\x0c\xc5\x42\x5a\x8e\xdb\x5b\xa0\xa2\xaf\xd5\xa1\xa0\xcc\x8f\xff\xda\x73\x3e\x07\x99\xe0\xad\x0c\x78\xbb\xfe\x48\x5d\xfe\x15\x4d\x0e\xad\x96\x4d\x85\xe1\x2f\x7e\xf3\xb7\x72\xd9\x0a\xf5\xfc\xdf\x36\xd1\x6f\xe4\x27\xc6\x7e\xe3\xf1\x11\x27\x43\x46\x6c\x02\x6e\x51\x05\x55\xc4\x33\x0e\xcb\x21\x4c\x43\x0c\x06\x61\x24\x02\x86\xbf\xb1\x4b\x53\x24\xcc\xc7\xac\x89\x49\xfd\x32\x78\x4e\xac\x0c\x65\x1d\x01\xb8\x9a\x54\xbc\xed\x8f\xaf\x86\x54\x47\xd8\x09\x86\x7e\xc2\x28\x38\x5b\xb8\x27\x44\x98\xfd\x46\x9b\xce\x44\xce\x68\x5f\x77\x79\x9c\x45\xb3\xf4\xfb\x29\x9d\x39\xe7\x45\xe2\x21\x18\xad\x58\x2b\x79\x3c\xe8\x63\x3a\xed\x5f\x1c\xe4\x50\x6d\x81\x11\x65\x07\x0e\x61\x6a\xd1\x41\x15\xb2\x32\x75\xfc\xe4\x1e\x11\xc8\x42\xee\x4e\x72\xd8\xda\x80\xc7\xde\xb8\xb9\x7a\x90\x79\xd9\x2e\x16\xda\x81\x19\x45\x0e\x62\x42\xc3\x5c\x90\x9b\xb2\x97\x7c\xb9\x33\xe2\xfb\xe9\x95\x5d\xa4\x57\x7e\x35\x17\x96\xcc\x9e\x1b\xdc\xc3\x5d\xbb\x87\xb3\x56\x1d\xb6\x3b\x48\xe2\xe2\x0f\x68\xfc\xb0\x62\xbd\x44\xb6\x7b\x77\x96\x4e\x38\xa6\x0d\xf4\x4e\x50\x6b\x25\xfc\xb6\xb8\xd5\x4c\xd4\x48\x5b\x0e\xaa\x25\x18\x36\x64\xa1\xb7\x9a\x10\xde\x7f\xae\xee\x21\xb3\x65\xbb\x0f\xbf\x2f\xdf\xd4\xe2\xff\x6d\x1f\xcb\x6c\xff\xe7\x08\x5f\x87\xb7\x34\x20\x3a\xe9\x34\x1f\x62\x28\x06\xaf\x35\x88\x2a\xbf\xc0\x82\x5f\x9d\xb8\x12\x49\x46\x39\xb9\xd0\x04\x96\x12\x41\x66\xa1\x20\xd1\xfb\xcd\x4b\xac\x9f\x04\xa2\xae\x10\x85\x75\xaa\x34\x5f\x43\x08\x49\xce\x8c\x1a\xae\xdc\x31\x6a\x77\x95\x87\x8e\xf5\x7d\x57\x60\xda\xea\x03\x11\x50\xbd\x6a\x6d\x5d\xed\xf6\xfe\x32\xa3\xd3\x0e\xcc\xb4\x14\x3c\x4c\x6a\x6b\x84\x9f\x97\x22\xda\x85\x60\x8f\xe9\x60\x66\x18\xac\x3b\xdd\x4d\xf8\x1e\x98\xbd\xf7\x00\xdb\x13\x6f\x8d\xa9\x9e\xd5\xf6\x99\xff\xbf\x88\xa9\x0a\x28\xba\x64\x45\xb1\x0c\x38\xb0\x3d\x02\x4e\x23\x14\xd6\xb7\xb3\xcb\xbd\xa7\x21\x09\xb0\x55\x46\xcd\x0d\x0a\xc9\x95\x21\xda\x5d\xff\xaf\x94\xfe\x0d\x10\x66\xd9\x74\x88\x5c\x58\x71\xdb\x97\x64\xce\xa3\x95\x0e\x4a\x40\x12\x21\x26\x03\xe3\xee\x20\x32\x8e\x90\x47\x62\xb0\x18\x80\xe8\xbf\x39\xfe\xe0\x27\x99\xec\x5d\x16\xef\xe2\xdc\x24\x60\x91\xa8\x02\x3a\xd2\x4c\x20\x7a\xae\xbd\x33\x75\x89\xaa\xee\x00\x86\x22\x15\xe8\xc1\xc2\x96\xae\xd9\xa0\xa1\x0f\x8f\x84\x9e\x0a\x01\x34\x54\xeb\xf2\x06\xb0\x65\x5b\x53\x39\x70\x5a\x03\xb7\xa1\xc0\x9e\x10\x7f\x79\x50\x81\xfc\x70\xa6\x56\x7a\x93\x17\x00\xf4\x51\x6b\xdb\x38\xb3\xb6\xc5\x92\x73\x41\x2e\x2a\x2d\x4e\xc2\x86\x04\x32\xe8\xd1\x62\x49\xc0\x49\x2e\xaa\x40\x38\xa3\xb7\xa8\xd5\xf2\x0e\x5b\x0a\x01\xdb\xda\xd2\x20\x57\x33\x5d\x2f\xc4\x1e\x06\x1d\x9f\x33\x39\xa8\x9c\x6b\xa6\x96\xb6\x99\xd7\xab\xa6\x40\xc8\x7f\x8c\xe2\x57\xc6\xd9\xe2\x16\x97\x79\xa5\x6f\x11\xb6\x0f\xf6\x01\x34\x47\x7c\xd7\x03\x45\x82\xcf\x04\xfd\x02\x06\x96\x78\xc0\x3b\x1e\x99\x3a\x48\x96\x29\x41\x26\xab\x7a\xb7\x05\xb3\x02\x69\xdc\x37\xb6\x8c\x78\x1c\x0d\xf4\x91\x8e\xc8\x9c\x68\xe8\x69\x10\x80\x13\xb0\x4d\x2c\x6c\x49\x3f\x4e\xf4\x61\x70\x35\xf4\x0e\x3b\x7a\x31\x74\xa5\xfd\xa8\x5e\xd4\x0d\x8f\x12\x37\xc8\x7c\xdd\x9a\x45\xcd\xbd\xbe\xf0\xbf\xf0\x36\x35\x5c\x9b\x4d\x03\x1b\xaa\xd1\xfd\x8b\xde\xe9\x6d\x63\x02\xa4\x97\x9f\x58\x03\xc5\xf6\x1c\xfa\xc5\x12\x7c\x87\x74\x7a\x06\x14\x9c\xde\xba\xc5\x95\x2a\x6d\xf9\x2c\x7c\x00\x47\x4b\x24\xf5\xa0\xcb\xfd\xdf\xa8\xca\x30\xf5\x5c\xcd\xfc\xa9\xfe\x80\x41\x88\x10\xe3\x51\x86\x70\x80\xa2\x26\x08\xa6\x02\x50\xf2\x89\x6c\x0c\x30\x89\x2c\x05\x8c\xb3\x91\xf7\x4b\x5c\x9a\x8d\xa9\xd7\x76\x89\x0a\x63\x61\x96\x4d\xe5\xc7\x86\x1c\x00\x04\xfa\x56\x5f\xcc\x0e\x57\x17\xa5\x9d\x64\x40\x90\x34\xe1\x84\xc0\xc1\xda\x20\x00\xde\x74\x4b\x2a\x5c\xbf\x83\x0a\x47\x27\x19\x20\x99\x20\x9d\x72\x12\x8b\x4d\x29\xf7\x19\x62\x69\x67\x0d\xec\x28\xdd\xac\x56\x39\xea\x70\xa9\x53\x28\x71\x57\xe7\x65\xe3\x05\x41\x53\x82\x0c\x25\x3b\x35\xa9\x06\x69\x29\xfc\xbc\x04\x19\xac\x81\x6a\x14\x5a\xee\xa2\x08\xc0\x30\x0d\x4e\x0b\x41\x2e\x90\x26\x9c\x1b\xf4\xb3\x93\xe4\x8a\x3f\x38\xa1\x21\x26\x13\xd7\xca\x8c\x54\xd9\x11\x93\x32\x28\x18\x58\x39\xd1\xf9\xf2\x9f\xc3\x1c\x99\xc4\xb7\xac\xa8\xb6\x0f\x3d\x32\xb9\xb8\x11\x65\x23\x8c\xf3\xc5\xa2\xa9\x5a\xed\xaa\x40\xfd\xe9\xd0\x3f\x31\xde\x43\x02\x5e\xac\x64\xf0\xd1\xbf\x52\x1c\xcd\x64\x33\x73\x17\x3b\x39\x46\xdd\x16\x59\xc2\x11\xa8\xb4\x35\x75\x03\x8c\xb0\xa1\x3f\x39\x78\xb2\x80\xf8\x38\xec\x0d\x25\xa6\x23\x74\xa0\x18\xf5\xa2\x36\x55\xfe\x5f\x84\xda\xdd\xa3\xbe\x70\xde\x69\xc8\x98\x17\x95\x7b\xf4\xf4\xf8\xdb\xfb\xae\x18\x36\x04\xab\xdb\x11\xe4\x10\x69\x21\x62\xdf\x95\x2a\x49\xa7\xf9\xad\x2e\x89\x7d\x5b\x98\x78\xaa\x32\xd8\xaa\x10\x13\x2c\xde\x96\xdb\xc9\x9b\xd5\x7b\x24\x29\xb9\x90\x2c\x38\xe0\xdf\x02\x6e\x2b\x89\x5f\xc2\xb1\xa3\x17\xa2\xde\x98\x5e\x7c\x1c\x04\xf0\x8f\x1c\xbf\x70\x7e\xf6\xcd\xbc\x8b\x74\xd3\xed\x57\xf0\x25\x93\xaf\x63\x47\x1b\xe8\xfe\xbc\x15\xc8\x99\x18\x38\xc6\xcd\x76\x09\x94\xa3\x02\x73\x04\x57\x36\xde\x9a\xb0\x0e\x95\x98\x4a\x28\x42\xa4\x63\x95\xf1\x49\xea\x9e\x47\x3e\xcc\xf9\x43\x2f\x1d\xaa\x51\x70\x62\xa2\xa5\xcf\x8d\x9e\x0d\x1c\x8e\x3b\xa6\xbc\x4e\xae\x38\x75\x1b\x61\x48\x02\x67\x06\x97\x5e\x90\x19\x84\x14\x81\xa6\xaa\x63\x7b\x93\x68\xa7\xf1\x87\x6c\xa5\x6e\x73\x5b\x04\x02\xd6\xaa\xe1\x3e\x9a\xdb\xca\xd6\x76\x61\x0b\x2e\xb0\x92\xe8\x34\xbd\xa8\xac\x73\xf2\x45\x04\x76\xb8\xe7\x26\xa0\x4c\xd8\xbb\xcd\x6c\xfb\x76\x9c\xcd\xde\xab\x83\x95\x3d\xf0\xe3\x10\xb4\x08\xa5\x7a\x5c\xe9\x6f\x96\x58\xfc\x4c\x19\x88\x36\xf0\xf6\x1b\x50\xb7\xe4\x7f\xc2\xd7\xd9\x0d\x2c\x6d\xe8\x7d\xb3\xd5\xce\xdd\xf9\x01\xdb\xca\xab\x32\x14\x8c\xe5\x56\x2f\xbe\x40\x0e\xbb\x32\x7a\x49\x38\x02\xf2\xa3\x98\x70\x7f\x14\xb3\x1f\x57\x86\xe3\x99\x07\xe2\x6f\x45\x67\xbd\x03\xb0\xe1\x05\x88\xc5\x1f\x71\x02\x1d\xef\x47\xee\xcc\x77\x8c\x6c\x91\x04\x9a\x00\xda\x2b\xa9\xd9\x01\xf2\x8b\x10\xc6\x2b\xb4\x32\xe8\x1f\x04\xd5\xa4\x51\x8e\x87\xb2\x39\x69\x5f\xbf\xc0\x26\xcb\x16\x24\xc0\x2f\xa8\xf1\x14\x77\x85\x31\x3b\x75\x87\xf5\x28\x12\xf1\x9d\xd0\xf0\x77\x8b\x27\x42\x6a\x07\x83\x6f\x9d\xa2\xa1\x42\xdf\x81\x57\xad\xfb\x87\x8e\x32\x92\x91\xde\x12\x89\x2a\x5a\x22\x6a\xc2\xa8\xd2\x05\x04\x1b\x5e\x64\x70\x58\x9a\xb7\xba\x1e\x62\x72\xa8\x67\x11\x18\x2d\x76\xe3\xcd\x91\xb2\x07\x74\xc7\x18\x34\xd4\x3e\x81\x86\xb5\x77\x06\x7b\xa1\x25\x18\x5b\xea\x03\x99\xf4\x74\x30\xae\xcc\xc6\x12\xf0\x64\xcf\x42\x91\x63\xa6\xb9\xbb\x8e\x17\x72\x60\x2c\x71\xf3\x5a\x38\x2e\x43\x75\xb8\xe7\x8c\xd0\xda\x71\x9c\x2b\xa2\x5f\x29\x57\x63\xef\x68\x14\xba\x48\xd8\xb4\xc1\xf1\x08\x4d\x2f\x5b\x68\xe9\xe1\x20\x04\xfa\x29\x62\xd3\xff\x71\xe0\x7a\x46\x89\x98\x51\x26\x96\xc2\x1d\x20\x60\xd3\x25\x4a\xd1\x6b\x90\xae\x63\xba\x03\x88\xc2\xf6\xe2\x27\x04\x23\x2e\xe2\x9f\x6a\xbf\x89\x50\xcb\xc1\x08\xb2\xc0\x7b\x4f\xf4\x56\x9d\x98\x3f\x56\xad\x10\x96\x0c\x72\x0b\xcb\x65\xdf\x00\x79\x0f\x01\x68\x4f\x26\x73\x54\x44\x6d\xe2\xf0\x58\xf0\xcc\xef\x1e\x3c\x4e\x4a\xa0\xa0\xf5\xff\x24\x12\x0f\xa7\x84\xec\x01\x37\x32\x10\xbc\x55\x98\x6f\x82\x4a\x93\x9c\x2d\x88\x10\x6b\x62\x44\x70\x7f\x6e\xe5\xe8\x7b\x10\xa3\x47\xaf\xda\x03\x78\xa3\x6c\x15\x13\x01\xd3\x50\xa9\x49\x7c\xbd\x41\x73\xc5\x12\x18\x11\x22\xc6\x5c\x57\x00\x8f\x54\xcc\x2f\xa6\x6b\xc1\xbd\xcf\x2e\x40\x04\xf0\x55\x1c\x1a\xdc\x9b\xde\xe4\x04\x28\x2e\x38\xe6\xc3\xa8\x0f\x1b\xd6\x20\x8a\x61\x2f\x06\xfe\xce\x07\xc8\xd8\x26\x77\xc1\xd9\x4a\xf4\x2e\x92\xbe\x77\xf6\x09\x5b\x34\x85\x79\xe3\xbf\xf5\x79\x36\x88\x35\xe3\x49\xcc\x8d\xda\xe8\xea\x0b\xca\x4f\xb1\x24\x77\x50\xe5\xe6\x44\x0c\xb0\xdb\x05\x87\xde\x2a\xe6\xb0\x1c\xa8\x33\xde\xdb\x1a\x6b\xde\x30\x7e\x01\x7a\xd1\xef\x33\x87\x2a\x80\x65\x06\xd8\xaa\xec\x2a\xb4\xd3\x11\x6b\x1f\x5c\x6f\x1e\xa9\xf8\x8a\x19\xa8\x53\xb3\x28\x70\x0d\x6b\x8b\xf8\xeb\x16\x14\xad\xd2\x4b\xe3\x27\x86\xe0\xbf\xc8\xca\x0f\x65\x95\xf0\xaf\xf8\xf9\x2c\x3e\x8a\xfe\x23\x99\x7b\xb0\x2a\x4e\x7c\x74\x25\x4f\x55\x5e\x2e\xcd\xa6\x4c\x80\x68\x71\x0e\x60\x43\xc9\x49\xc8\x43\x33\xdf\xa5\x18\x09\x2f\x81\x5d\x32\x51\xe8\x60\xd4\xbb\x73\x79\x4d\x4d\xea\x90\x03\x07\x02\x0b\x4a\x3b\xd7\x6c\x48\x2b\xc3\x30\x84\x4d\xde\x32\x35\xb9\x97\x8e\x78\x86\x94\x22\x02\x6b\x7a\xdf\x19\x0a\x71\xa9\x05\x83\xa5\x0a\x82\xfe\x09\x07\xe4\x3c\xca\xaf\x16\xcc\xab\x0d\xd5\x00\x55\x2c\xba\x29\x1f\xf4\xb5\x39\x3a\x80\x39\x73\xd7\x6f\xa3\xd9\xff\x8d\xd8\xd4\x0e\x17\x7b\x8a\x90\x43\x7c\x8f\x6c\x9d\x4e\xad\xf0\x43\xd7\xf5\xd0\xe6\xbb\x07\xb9\xb3\x57\xef\x4a\x6c\x0a\x3a\x80\x6c\x46\xea\xbe\x76\x4d\x51\x12\x93\xfa\xc4\xb5\x37\xd5\x06\x2d\x8e\x0e\xcb\x94\x1c\x5e\xcf\xfb\xc0\x5e\xe8\x63\x40\xc0\xba\x8f\x04\x32\xdc\x4f\x3b\xdf\xab\x30\xe2\x31\x4c\x27\x9e\xc8\xfd\x58\x67\x2a\x38\xb1\xd2\x6c\x37\xc0\xc0\x7a\x46\x1d\x69\xf2\x9b\xea\x16\x88\x82\xbc\x38\xda\x37\x7e\x19\x76\x80\xe1\x32\xf9\x6f\x0f\x7e\x60\x8f\xc1\x2f\x3a\xce\x53\x53\xc3\x9c\xdb\x66\x11\xc6\x4b\x56\xfa\x64\x80\xc2\xd0\x35\xb5\x81\x5a\xb5\x6d\x29\x61\x3c\xb7\x7a\x74\xd3\xcf\xc1\x1d\x64\xbe\x5a\x6c\xaa\xd6\x9f\xa3\x90\xd6\x6f\x30\xdc\x47\x1d\x2c\x93\xb8\x3d\xb6\x7d\x9f\x32\xb6\x93\x08\xd1\xdd\x42\xdf\x69\x69\x76\xb2\x29\x25\x9b\x1b\xd2\xcf\xa0\x8b\x21\x5b\xf6\x6f\xc8\xaf\xb7\xb7\xbd\x9d\xd7\x29\x36\x70\xa7\x77\xdc\x08\xe5\x8a\x9a\xfa\xb1\x31\x23\x1b\x98\xc5\x72\x8a\x48\x4e\xd4\xda\xb9\xdf\xae\x93\x62\xdf\xc7\xf0\x0a\xff\x26\xdd\x12\x13\x78\x40\xe8\x51\x14\xc9\xd0\xda\x35\x42\x26\x06\x4d\x34\x34\x53\x49\x64\xd6\x11\x46\x33\x3e\x08\x78\x15\x58\xe4\x46\x3b\x62\x20\x03\x97\xba\xd7\xf2\xab\xc9\xbe\xad\xd2\x06\x75\x49\x88\xbc\xd3\x10\x06\xc2\x3e\x10\x32\x40\xa7\x76\x10\x6d\x4b\xcc\xee\x52\xa8\x17\x42\x64\x65\x9d\x17\xbd\xe6\x61\x52\x6f\x54\x2e\xfd\x69\x4e\x17\x31\x2d\x7a\x89\x45\xb2\xfe\xd0\x6a\xac\xae\xcf\x22\x5a\xa9\xf5\xf2\x15\x32\xb3\x02\x74\xcc\xef\x1e\x82\x21\xe0\xd9\xb8\x1c\xf3\x1d\xea\x70\x61\xab\x60\xa0\x78\x5b\xe5\x58\x49\xfb\xea\x85\x5a\x82\xf5\xb2\x62\x7e\x4e\x28\x57\x08\x27\xf4\xa3\xad\x8c\x85\x55\xff\x75\x8b\x28\xe6\xb4\x77\x4a\x30\x93\xdc\xb8\x6f\x9b\x4b\x16\x29\xc5\xfd\x7d\xce\x2b\x57\xc7\xce\x87\x29\x51\x31\x89\x1a\xbb\xda\x7f\x62\xb8\xd2\x74\x47\xf5\xa5\xa9\x73\x26\x87\x1b\xa1\xc8\x8b\x86\xd2\x84\xf1\xad\x61\x7d\x5f\x26\xeb\x4b\x70\x8b\x85\xc9\xb7\x41\x60\xe2\xa0\x30\x5e\x17\xc5\x43\x28\x87\xe9\xde\x31\xbe\x17\x41\x3b\xc4\x5b\x59\x4b\xc6\x41\x28\xe1\xbe\xbf\x55\x69\xec\x54\x7a\x5f\xa3\x52\x6e\x95\x12\x9e\x85\x57\x41\x8c\x4d\x74\x29\x45\x18\x44\x9d\xec\x74\x3c\x00\x99\x2c\x58\xfa\xdf\x8d\x2e\xc0\xd9\x8c\x1d\xe9\x4a\x73\x97\x72\x25\x06\xc0\x40\xd0\xb1\x29\xc2\xf7\xe8\x05\x37\x22\x1a\xc5\x06\x9c\xe7\xb6\x26\xc3\x93\x72\x81\x1f\xb0\xda\xab\x55\x4c\xf0\xc8\x9e\xa8\x88\x3c\x5c\x22\x6a\x84\x07\x8a\x75\x54\x2d\x8c\x49\x28\x0b\x1c\x95\x8b\xbc\x28\x34\x22\x9d\x03\x83\x48\x37\x45\x02\xd1\xf9\x0a\x7b\x7e\x43\x56\xa1\xaf\x0f\xe4\x03\x09\x6c\x39\x2a\x1a\x4e\x91\x7f\x31\x20\xe2\xc3\xd9\xe0\x50\x40\xec\x52\xda\xd3\xcb\x35\x21\x0d\x90\xe0\xdd\x7d\xed\x5d\x7b\x75\x55\xb9\xeb\x94\x27\xca\x56\xae\xa1\x69\x9d\x20\xf5\xfd\x55\x7d\x5c\xc3\x0a\x77\xca\x2e\x7f\x61\x9b\xd6\xd0\x19\x68\xc4\x4a\x8f\x1e\x21\x23\xfa\xd4\xde\x95\xae\xae\x8c\xde\xa8\x69\x00\xa5\xc4\x86\x50\x41\xe8\xec\xa9\x42\xaa\x7f\xab\x46\xaa\x88\xda\xae\x9a\x32\x8b\x6b\x2f\xcb\x31\x91\xfa\x04\xbe\x99\x34\x52\x95\xeb\xfa\xeb\x9b\x9a\x46\xe3\x51\xf2\x6d\x8d\x4a\x75\x60\xca\x1a\xfc\xa5\x98\xcb\x39\x40\x4b\x5f\x66\x77\x42\xfe\x08\xbf\x83\x15\x8c\x58\xb7\x26\x09\xaa\xd0\xf6\x8a\x29\xd9\x02\x5b\x5a\x6a\xe7\x0c\x42\x58\x6d\x69\xf8\x19\xc0\x87\xa1\xc9\xd1\x7d\xc7\xc6\x54\x37\x78\x70\x24\xfb\x95\x97\x6c\xf7\xdf\x54\x84\x04\x33\x84\x0a\xdb\x57\xa6\x93\x23\x94\x38\x26\x7c\x6a\xea\xe6\x26\xa7\x2a\x3a\x6f\xba\x36\x38\x0d\xc0\x22\x85\x13\x0f\x04\xc2\xef\xd8\x0a\xda\xc6\x67\x39\x6b\xbe\x7b\xea\x95\xb8\x59\x42\x75\x21\x06\x57\x02\x45\xf6\x5a\x2f\xd1\x31\x68\x0a\xaa\xdc\x89\x76\xd6\xb6\x32\xb7\xb9\x6d\x5c\x34\xb5\xb8\xc5\x3d\x25\x01\x3b\x15\x08\x7b\x73\x6e\x09\x2d\x0c\x1f\xd6\x3d\x63\x0a\x76\x8c\xfc\x77\xc0\xc5\xd7\x2d\xc6\x53\x2a\x85\x0b\x3a\xde\xac\x56\xb6\xaa\x5d\xc7\x5c\x7e\x64\xbf\xdf\x07\x7a\xfc\x7a\x5d\x0f\xa5\xe0\x7b\x0c\xe8\x84\x2e\x61\xd7\xf3\xf9\x78\x5d\x8d\xc9\xb8\x37\xab\xc8\xad\x0b\x26\x58\x39\x94\x07\x6b\xe5\xd3\x42\x27\xcc\xc7\xe5\x35\x04\xcd\x8a\xbc\xa6\x92\xcc\x14\x85\x0b\x49\xa2\x67\x58\x1d\x88\xdb\x0f\x10\x50\xf8\x6f\x48\xe0\x14\xfa\xce\x35\x79\x3d\xc0\x66\xc2\xc1\x75\x17\x06\x3a\x3d\x1c\x85\xf5\x32\x66\x34\x32\xd4\x47\x99\x72\x88\x7d\xc9\x22\xca\x10\x80\xa7\xba\xc0\x8b\xe8\x57\xa6\xea\xf4\xd6\xe6\x88\x42\x84\x2f\x51\x51\xc6\xd1\xd1\x50\x5d\x62\x13\xc7\xc8\xbf\x46\x6d\x3c\x6d\x75\xc0\x50\x8e\x9e\x96\x8d\x21\x40\x0b\xe8\xfa\x3e\x2f\xa4\xd5\xc0\x2d\x66\x1f\x13\xfe\x14\xd1\x77\x12\xaa\xbb\x86\xb1\x72\x09\x0a\xa8\x03\x49\x5f\xac\x28\x60\xac\x01\x8d\xf2\xa9\x4b\x06\x1d\xa8\xe8\x42\x31\x46\xf2\x64\x64\x87\x91\xab\x4e\x09\x27\x2f\xdc\x92\xbf\x56\xf6\x8e\x20\x49\x24\x24\x0b\x19\x90\x0e\x2f\xce\x22\xf4\xa8\xa8\x8c\x5e\xee\x94\x5e\x90\x71\xe3\x6f\x9a\xa9\x0c\x5a\xa0\xfc\xb7\x19\x6b\x09\x6a\xd0\x9b\x6c\x38\xd8\xd9\x1b\x5d\x96\xd0\xee\x3e\xd4\x49\x77\xe1\xc9\xab\xf6\xd9\x80\x98\x20\x56\x0e\x33\x8b\x41\x6b\x51\x30\x77\x43\x2a\x9f\x73\xcc\x34\xd5\x7d\x43\x82\x24\x52\x9f\x85\xc4\x37\xbf\xaf\xd0\xb5\xe7\xdb\x78\x9f\x65\x54\x15\xe6\x13\xe9\x4d\x32\xda\x47\x5b\x1c\x44\x1e\x94\x08\x90\x08\xe1\x53\xda\x21\xc7\xe5\xe0\x06\x1b\x76\xd0\x9a\xc9\x66\xb1\x01\x8b\x9a\xc4\x07\xfa\x5a\x6a\x8e\xb1\xe6\x31\x0e\x5a\x58\x5f\x1a\x82\x19\xa1\x24\x3f\xf3\xa7\xb3\x58\xde\xe5\xcb\x28\x73\xb0\x1f\x74\xab\x79\x74\x52\xd2\x2e\xce\xe0\x9e\x23\x98\x31\xa1\x5d\x86\xe8\x2a\xbf\x95\x74\xcd\xc5\x1d\xc7\x0b\x1e\x59\x50\x90\xa7\xe1\x1e\x6b\xc4\x30\x9b\x85\x13\x99\xcf\xce\xde\x40\xf4\x8a\x83\x32\xb1\x55\x25\xce\x8a\x74\x15\x84\x9c\x0e\xd2\x49\xa2\x88\x28\x77\x1c\x13\x49\x3b\x93\x2f\xec\x66\x93\xd7\x18\x74\xa3\xfa\x2c\xb5\x34\xa5\x25\xaf\x05\x69\x57\x01\x49\x04\xf4\x12\xb1\xff\xf6\x61\x20\x61\x2b\xc3\x9b\xdb\x46\x30\xf6\x25\x8e\xbf\x81\xef\xdd\x9a\x52\x63\x7d\x23\x00\x58\x55\x43\x51\xfd\x6e\xcb\xf6\xc1\x10\xc8\x08\x61\x9f\x0f\x08\x03\xde\xde\x41\x08\xdf\xa1\x69\x11\xb8\x22\x89\xac\x1c\x21\xe3\x7b\x66\xbb\x77\x5e\xb2\xc2\x1b\xde\xdb\x87\x56\x6a\x59\xae\x5f\x4a\xd8\x0d\xb0\x53\x0b\x34\xbf\xcb\xce\x50\x23\x08\xe9\x41\x6b\x81\x99\x13\x52\xfc\x2f\x46\xfa\x03\x63\x37\x9c\x67\xbb\x8a\xc5\xc2\xcb\x87\x6b\x7b\x22\xaf\x62\x24\x12\x0e\x1f\x69\x55\x1b\x04\x15\x0d\x78\x81\x94\x72\x38\x04\x16\x38\x39\xda\xb8\x5a\xc2\x57\xb9\xd2\x6a\xcf\x5c\xb1\x5b\x9a\xb3\xf1\xe3\x11\x6c\x5a\x61\x2b\x6a\xe8\x05\xbd\xad\xbc\x71\xb6\x83\x3e\x33\xc5\x8a\x97\x48\xf0\x8e\xe3\x26\x25\x07\x82\xbb\x71\xca\xd8\x4b\x60\xf2\x3a\x7c\x19\xbe\x90\xfd\x2a\x89\x04\x92\x00\xc0\x00\x4b\x31\x08\x7f\x52\x0a\xe9\x34\x05\x7f\x28\x82\xf4\x87\xea\xe0\xef\xed\xe3\xc2\x4c\x7e\x21\x22\x43\xa9\x93\x40\x58\x43\x54\xa7\x5e\x33\x84\xce\x32\xad\xc3\x45\xdc\x20\x12\x78\xdc\x89\x6a\x13\x05\x28\xda\x5f\x1c\x6b\xc1\x71\x61\x09\x5e\x5f\x95\x62\xeb\x97\xa8\x7e\x82\xb3\x2a\x61\x1b\xd0\xed\x25\x5f\x21\xa9\x2a\x37\x9e\xe6\x4c\x27\xbd\xa0\xd5\x3f\x00\x0d\x59\x3c\x10\xd0\x43\x3b\x02\x2a\xe8\xde\x65\x5e\x1f\xb9\x46\x23\xb6\x0a\xad\xe6\x85\x2d\x4b\x93\xb0\x86\x7a\xed\x5a\xa4\xf0\x38\x7f\x65\x70\xab\x51\xba\xc9\x22\x79\xe1\x1d\x83\xe7\xb6\xad\xec\xa2\x61\x4f\xeb\xd6\xec\xc8\x0d\xce\x3a\x37\x1d\x0a\xbb\x41\xc5\xf5\x49\x22\xb0\x0b\x24\xca\x17\x40\xae\xde\x6f\xe9\xdd\x12\x36\xd0\x02\xdf\x0e\xa3\x76\xc3\xd8\x82\xca\x08\x79\x0c\x3f\x57\xe6\xbf\x93\x8e\x52\xc7\x95\x2e\xfb\x2e\x87\x5f\x03\x1c\xbe\xd7\x09\x89\x87\x8d\x87\x99\x62\x3d\x29\x91\x41\xdf\xa1\x80\x00\x38\xa4\xa0\x43\xc5\x3f\x19\xac\xa3\xf6\x47\x73\xa7\x0e\x96\xb9\x5b\x54\x39\x28\x15\x5b\xed\xa0\xc6\xb4\x8f\x35\x4e\x24\xe7\xdc\xc2\x6e\x05\x12\x08\x01\xde\x59\x20\x42\x71\x6d\xef\x25\x23\x08\x74\x00\x0d\x45\x1a\x02\xb4\x0d\xa2\x73\xd1\x82\x1a\x09\xb7\x27\xc0\x89\x12\x60\xe9\x7e\x2f\x64\x98\xb8\x5c\x7b\x2a\x3e\x57\xa1\xeb\x97\x8e\x4e\xb0\xd7\x4c\xf1\x74\x86\xcc\x9f\x80\x46\x72\x02\x90\x5b\x8d\x7b\x0b\x92\xd0\xa0\xb1\x8c\x10\x02\x64\xdc\x0c\x02\xc7\x17\x01\x24\xa0\x07\xb7\x7a\xc7\xc0\xc4\x24\x8f\x50\xef\x52\xae\x06\x42\x36\x71\x58\x95\x68\xf3\x76\x08\xaf\x97\x52\x25\x5e\x04\xf9\xbd\xf6\xbb\xd1\x38\xcb\x98\xdb\xbb\x75\x29\xbc\x7b\x82\x82\x84\x03\x74\x9d\x03\xc6\xf1\xd6\x0c\xfb\x86\x8b\xd3\xd3\x3e\x5f\xc0\xd6\xd9\x15\x0a\x69\x11\x5c\xf2\xee\x80\x86\x25\x28\xce\x21\x42\xe1\x72\x43\x7d\x29\xc8\x5b\xc7\x46\xf4\xfe\xaf\x07\xa8\x3d\xe6\x03\xb5\xad\x72\x2a\x29\x44\x9d\xbc\xec\xfb\x74\xb8\xa1\x84\x57\xa7\x0e\xe9\xa1\xde\xd9\xb1\x48\xc4\x1a\xa5\xee\xfd\xa5\xfc\x89\x1f\x9b\x81\x08\xc1\x12\x2b\x2b\xe8\x7c\x0a\xa9\x16\x0a\x37\xd3\x35\xb9\xd3\xc1\x79\xce\x62\xb0\xfd\xf8\x07\xf5\x51\x57\x8b\x35\xb4\x40\x62\xb4\xd0\x3a\x50\xad\x0a\xcf\x30\xa0\xe5\x80\x5e\xad\x6a\x42\x66\x8f\xbc\x69\x89\xbb\x01\xa6\x1d\xea\xbc\x18\x08\xca\x62\x07\x8e\x55\x08\xd2\x24\x1c\xdb\x84\x64\xd8\x09\x1b\x79\x6e\x52\x10\x64\x8c\xb6\x8b\xfc\x26\x4f\x94\xe8\x9e\x8e\x8e\x87\xea\xdc\xaa\x59\x53\x55\x06\x1e\xb5\x2b\x75\x01\x0c\x67\x4f\xa1\xc7\xd3\xd2\x6e\xd8\x80\x6b\xf1\xdf\x61\x84\x62\x49\xe4\x5d\xea\x90\xfd\x43\x60\x78\x6b\x80\x2f\x05\xb3\x18\xd2\x80\x0c\x83\x1d\xc4\x2d\xac\xf4\x32\x5f\x04\x7c\x3d\x7f\xa2\x2f\xd3\xb6\x63\xbf\xce\x7c\x5d\x34\x24\x8e\x43\x64\x68\xff\x6f\x43\x2b\xf6\x85\x2e\xf7\xcb\x19\x6f\x4e\x39\x59\x13\xe6\xf2\x4d\x53\xd4\xba\x34\xc8\xd3\x83\xa0\xbb\x0e\x5d\x55\x2f\x7b\x08\x57\x79\x55\x35\x92\x91\x88\x9f\x91\x72\xe9\x78\x9b\x14\x8a\xf1\x6b\x2d\xc6\x98\xd7\x4a\x03\x47\x48\x2b\x54\xc4\x42\xd1\xaf\x2d\x88\xa6\x98\x0a\xe7\xa2\x38\x06\xc9\x2d\xbc\x4b\xbf\xf0\x0a\x97\x3c\x39\xb8\x79\xa1\x34\x32\xc8\x26\x71\x69\xa1\xe9\x2b\xa5\x6b\x44\x81\xbc\xc0\x55\x52\xb9\x09\xb5\x8c\xa2\x50\x20\x2f\xdc\xdc\x82\x05\x68\x93\x0e\x0f\x29\x40\x8d\x7d\x70\x48\x31\xac\x2a\x7f\x8b\x11\x6a\xc9\x88\xb3\x54\x66\x4a\x92\x9f\xa3\x97\x43\x35\x35\x1b\x5b\x1b\x75\x4e\x16\xf7\x24\xd2\xa0\xbf\x51\xd7\x01\x00\x77\x6f\x9f\x97\x5f\x0e\xf6\xa3\xb5\x17\x80\xc6\xb0\x30\x70\x46\x3a\x25\x28\x88\x77\x10\x94\xe6\xe8\xf1\x86\x56\x3f\x91\xbc\x43\x90\xf3\x57\x30\xc5\x62\x77\x0f\x97\x3b\x37\x5f\x8c\x4d\x66\x43\xad\x27\x78\x6f\x82\x1d\x7e\x00\x31\x6b\xf8\x47\xec\x31\x26\x72\x3b\xf7\xb9\x54\xc9\xdb\xe7\x8c\x06\x10\x95\xbf\xf7\xd5\xea\x3e\x5c\x85\x1d\x3d\x2a\x30\xfd\x02\xc3\x76\xa8\xb1\xd7\xd5\x2e\xf2\x88\x51\xb5\xaa\x0e\x04\x1a\xa1\x48\x9c\xda\x2b\x61\x61\x75\xef\x58\x50\x20\x4b\x76\xdd\xfd\x55\xf5\x94\x9c\x95\x65\xf3\xbd\xdd\x41\xf6\x34\x72\x89\x86\x47\x68\x97\xb4\x4c\x8c\xf0\x34\x04\x11\x82\x0f\xbf\xfc\x44\x06\x77\xa0\x4d\x82\x53\x7e\x21\xcd\x39\xc7\xce\xce\xbb\x1e\x9e\x16\xdd\xdb\x2a\xe4\x5b\x26\x4c\x45\x8b\xe4\x43\x44\x06\x96\xc8\xcf\x9b\xf0\x6c\xa4\xdd\x36\x30\x1a\xba\x0f\xc7\x0a\x3d\x3a\x63\x39\x48\xc2\x35\x02\xe8\xb1\x50\xa7\xd9\x35\x02\x18\xc3\x1d\xa7\x1a\x6a\x38\xc0\xce\x0d\x44\x31\x60\xad\x43\x41\xb1\x84\x59\x7d\xc3\x0a\xa0\x5c\xfa\xce\xcb\xa5\xdb\xdc\xaf\xe1\xcf\x49\x2f\xae\x56\x20\xee\xea\x9e\xde\xc3\x08\x88\x26\xfe\xb7\x8a\xde\x46\x0d\xc5\x44\x17\x9e\xa4\x5b\xf5\xfd\x6d\x85\x50\xac\xe7\xd8\x2b\xd7\xff\xdf\xa1\x9a\x79\xe1\x90\xbc\x8d\x7b\x46\x33\x67\x62\x5e\x2a\xb7\xcd\xab\x3c\x1c\x57\x2e\x34\x4c\x82\xac\x7e\xac\x08\x49\xf5\x3f\xc0\x5e\xba\xb0\x4b\xd8\x47\x86\x3b\xbe\xcf\x0b\xb3\x21\x0b\xae\x5c\x98\xaa\x14\x29\x4d\x5e\xe3\xdc\x11\x35\x2d\xd8\xaa\xfe\x6c\x34\xb9\x03\xc3\x8a\x9f\x28\x9b\xcd\xdc\x54\x1d\x70\x21\x23\x88\xd9\xf5\x08\xe8\x73\x7c\x3e\xad\x03\x7c\xdc\x82\x1d\x30\x30\x53\xb6\xe1\x3e\x40\x13\x8a\xec\xb0\xfa\xff\x63\xef\xdd\x96\xdb\x48\xd2\x34\xc1\xbe\xe6\x53\xf8\xf2\x86\xe4\x58\x10\x12\x29\xa5\xb2\x32\x55\xd6\xb6\x10\x19\x92\xd0\x05\x11\x2c\x00\x94\x5a\xbb\xb6\xb6\xeb\x40\x38\x40\xcf\x0c\x44\x20\xc3\x23\x48\x61\xae\xfa\x1d\xe6\x05\xca\xe6\x62\xa7\x38\x63\x36\x57\x7b\x33\xd6\x77\x4d\xdb\x17\xe9\x27\x59\xf3\xff\xe0\x87\x40\x80\x64\x66\xa9\xb2\xba\x67\x53\x66\x6d\x5d\x29\x05\x22\xfc\xf8\x9f\xff\xef\x4b\x62\x06\x3f\x2a\xc5\xb7\x22\x2a\x88\x2c\xee\xe0\x37\xa2\x30\x0f\xd7\xee\x6d\x0f\x14\x19\x39\xda\x23\x78\x3a\xf5\xf8\xd6\x22\xf9\x32\x3f\x58\xad\x4d\x40\x03\x85\x5f\x7f\xf2\xe2\xf8\x1c\xd5\xfc\xba\xe4\xf4\x18\xbf\x0b\x62\x9f\x4f\x1f\x25\x59\x95\x0f\xee\xe6\xba\x2a\xbf\x6c\x90\x33\x50\xcd\x75\xc6\x84\x7c\x8b\x06\xd0\xa1\x7e\xfe\x65\xb0\x6f\xa2\x36\x90\xc4\x01\xb6\x7c\x81\x5c\x27\x3e\x18\x95\x1b\xc6\x29\x7d\xbf\x68\x61\x05\x4a\x90\x24\x62\x7b\x0b\x57\x06\xde\xce\xbf\xe0\xa0\x53\x68\xc7\x0c\x61\x77\xd9\xe0\x77\x73\xb1\x8b\xbb\xa4\xb0\x5d\x58\xec\x08\x30\x54\x5c\xfe\x1d\x76\x91\x84\xe5\x16\xd1\x0f\x02\x53\xb5\x65\xaf\x43\xb3\x08\x56\xd5\x97\x1d\x95\x55\x60\x9b\x12\x89\x9e\x43\xcd\xb5\xb3\xa2\x12\x6f\x3c\xe4\x90\xf0\x8b\x98\xea\xad\x10\xfc\xa6\xe7\x1a\x0d\xf0\x5c\x7d\xa2\x56\x03\x14\x7d\xef\xd3\x71\x2a\x06\x93\x90\x0a\x1c\x68\xe4\xa7\xef\x53\x71\x39\x1e\xbd\x1b\xf7\x3f\x24\x62\x3a\x82\xff\x4e\xff\x71\x9a\x5e\x4c\xc5\x65\x3a\xfe\x30\x98\x4e\xd3\x73\xf1\xe6\xb3\xe8\x5f\x5e\x0e\x07\x67\xfd\x37\xc3\x54\x0c\xfb\x9f\x7a\x22\xfd\xc7\xb3\xf4\x72\x2a\x3e\xbd\x4f\x2f\xc4\xc8\xbe\xfd\xd3\x60\x92\x8a\xc9\xb4\x6f\x9f\x1f\x5c\x88\x4f\xe3\xc1\x74\x70\xf1\x0e\xde\x77\x36\xba\xfc\x3c\x1e\xbc\x7b\x3f\x15\xef\x47\xc3\xf3\x74\x0c\x8c\x61\xcf\x46\x63\xfc\x21\xf2\xd8\xa7\x13\x3b\x8c\x8f\x83\xf3\x34\x1c\x92\xd8\xef\x4f\xc4\x60\xb2\xef\x78\xf4\xdd\xd8\x47\x6f\x81\x53\xff\x0f\x83\x8b\xf3\x44\xa4\x03\x78\x51\xfa\x8f\x97\xe3\x74\x32\x49\xcf\xc5\x68\x2c\x06\x1f\x2e\x87\x83\xf4\x3c\x11\x83\x8b\xb3\xe1\xd5\xf9\xe0\xe2\x5d\x22\xde\x5c\x4d\xc5\xc5\x68\x2a\x86\x83\x0f\x03\x3b\xce\xe9\x28\x81\xaf\xd1\xb3\xfc\x76\x3b\x98\xd1\xdb\x2d\x02\xfe\xfe\xc5\xf9\x13\x18\xf8\x61\x01\x2f\xa6\x83\x71\x2a\xc6\x83\xc9\x1f\x44\x7f\xc2\xcb\xfa\xc7\xab\xbe\x7b\xcf\x65\x3a\x7e\x3b\x1a\x7f\xe8\x5f\x9c\xa5\xf6\x53\xe1\x94\x07\x13\x98\xad\xf8\x3c\xba\xea\x89\xc9\xfb\xd1\xd5\xf0\x3c\xfa\x77\xbb\x4c\xa9\x38\x4f\xdf\xa6\x67\xd3\xc1\xc7\x34\xb1\x0f\x8a\xfe\x64\x72\xf5\x21\xa5\xd5\x9e\x4c\x61\x79\x86\x43\x71\x91\x9e\xa5\x93\x49\x7f\xfc\x59\x4c\xd2\xf1\xc7\xc1\x19\xac\xc2\x38\xbd\xec\x0f\xc6\x76\x8d\xce\x46\xe3\xb1\x7d\xcb\xe8\x02\xcf\xd0\xab\x1e\x36\x2e\xb8\x74\xdb\x90\x6b\xe4\x51\x68\x5c\xd8\xe3\x93\x7e\xb4\x87\xe3\xea\x62\x68\xd7\x61\x9c\xfe\xf1\x6a\x30\xee\x3a\x22\xf6\xfd\xfd\x77\xe3\x14\x96\x39\x3c\x11\x9f\x06\xc3\x21\xec\x5d\xfb\x58\x24\xf0\x93\x8b\xcf\xc1\xb1\xf8\x2c\x3e\xbd\x1f\x89\x0f\xa3\xf3\xc1\x5b\xbb\x29\x74\x6c\xce\x46\x17\x1f\xd3\xcf\x93\x68\x55\xfa\x93\xe0\xbc\xf6\xdf\x8c\xec\xc2\xbc\x49\xc5\x70\x00\xe3\x99\x8e\x60\x95\xec\xae\x9d\xf7\x3f\xf4\xdf\xa5\x93\xe0\x5c\xc0\x37\x89\x9c\x39\x11\x93\xcb\xf4\x6c\x60\xff\xc7\xe0\xe2\x6c\x70\x9e\x5e\x4c\xfb\x43\x5c\xaa\x8b\x49\xfa\xc7\x2b\xbb\xb3\xfd\x21\xbf\x44\xf4\xc7\x83\x89\x7d\x83\x3d\x9a\xb4\x8d\x57\x93\x14\x8e\xdf\x05\x1f\x9b\xe9\x08\xfe\x2e\x1c\xec\xa1\xff\xf6\xf6\x91\x14\xc3\xd1\x04\xce\xdf\x79\x7f\xda\x17\x30\xe2\x69\x5f\xbc\x49\xed\xd3\xe3\xf4\xe2\x3c\x1d\xc3\x0d\xeb\x9f\x9d\x5d\x8d\xfb\x53\xf8\x98\xfd\x45\x3a\x11\x93\xab\xc9\xb4\x3f\xb8\xc0\xdd\xb0\xf3\x85\xfb\x3d\x18\x9f\xbb\x2b\x06\xa7\xf6\x6d\x7f\x30\xbc\x1a\x6f\x9d\xbb\xe9\x48\x8c\x2e\x53\x78\x25\x9c\xbf\x60\x27\xf0\x89\xc9\x51\x02\x9b\x2f\x06\x6f\xc5\xe4\xea\xec\x3d\x6d\x9b\x88\x2e\xf2\x67\xf1\xbe\x3f\x11\x6f\xd2\xf4\x42\xf4\xcf\x3f\x0e\xe0\x32\xd2\x77\x46\x93\xc9\x80\xd6\x64\x44\x6f\xa0\x75\xc4\xd3\xf7\x6d\x0f\xfd\xc9\x75\xa5\xfc\x09\x9c\x6c\xf5\x3c\x85\xfa\x2b\x8b\x24\x9e\x6b\xae\x02\x9e\xd0\xe8\x20\xfb\x66\x0f\x57\x56\x8d\xd5\xdd\x14\x99\x98\x29\xb2\x83\xf2\x72\x2e\x73\x6a\x85\x42\xb4\x67\xaa\xa9\x27\x11\x8c\x9d\x77\x54\x96\x6e\xed\x44\x75\x8b\x4e\x51\x03\xde\x1f\x38\x3b\x68\x2c\xd3\x9b\xe4\x2d\x77\x21\x99\x5a\xcc\xf3\x12\x5b\x8a\xd7\x56\xfd\x01\x69\x05\xb2\x68\xcd\x4c\x99\x37\xb5\x42\x30\x6b\xb4\x43\xac\x05\xae\x6f\x74\x1e\x8c\xbd\x23\x62\x17\x79\xc1\x5c\xbd\x1c\xb5\x99\xf9\x36\x96\x78\x21\x7c\xd7\x7c\xbb\x76\xc9\xd5\x4d\x14\xa2\x52\x75\x53\x85\x50\xbb\x22\xbd\xc0\x1d\xed\x62\x7e\x7c\x8f\x04\x5a\x7d\x98\x3f\x16\x09\x4e\xb9\x57\xe1\xb3\x55\x66\x17\xea\x96\xdf\x6e\xf6\x28\x36\x44\xfc\x49\xc4\x76\xb9\x0e\xc9\x21\x02\x86\x64\x4a\xbd\xd1\x08\x97\xd0\x0a\x6b\x9d\xfb\x92\x12\x7b\x8d\xd9\xa2\x90\xc3\x94\x9b\xa9\x11\xae\xaa\x14\x72\x7e\x0d\x89\x1a\x57\x55\x4c\x09\x57\xc0\xf0\x0d\x09\x74\xd1\xd6\x51\x4c\x9a\x8e\xbc\x1d\x31\xcf\x30\x53\x34\xbb\xc4\xa5\x71\x0d\x0c\x53\x2a\x3a\x4c\x84\xac\x6b\x49\x11\x66\x6f\x9e\x72\x7f\x9d\xb3\xef\xa9\xc0\x74\x00\xce\x91\x91\x0b\x3b\x62\x3b\x5a\xf7\xe3\x15\x3f\x6b\x6a\x6a\xdb\x81\xb2\xb4\xa0\x61\x03\x49\x71\x4c\xed\x81\xe1\xf3\x0d\x5a\x54\x14\x21\x0f\x30\x27\x63\xf8\x67\x78\x13\xbc\xc2\x5c\x43\x68\x08\xb3\x78\x1e\xad\x4f\x89\xfd\xb9\x27\xda\xcc\xd1\x9b\xcd\xac\x85\x58\x42\x94\x03\x43\x56\x0c\xa7\xb4\x68\x1c\xa8\xae\x9d\xcd\xc2\x1a\x9d\xbd\xbd\xdf\xdb\x55\x84\x9f\x32\x2c\x5f\x30\xf3\x03\x03\x2d\x68\xf4\xd6\x59\xa5\xd5\x42\xe8\x4c\x49\xc1\xe8\x54\x94\x6e\xe9\xfd\x7d\x8b\x0d\xff\xf7\x1b\x25\xab\xbf\x17\xbf\x87\x5f\x97\xdc\xd6\xf9\xf7\x7b\x10\x8a\x58\xfb\xd2\x9f\x68\x6f\xbf\x77\x5c\xd8\xd1\x8e\xea\xba\x45\x1e\xad\xeb\xee\x9c\xf4\x53\x6c\x5d\x69\x9e\x6e\x8c\x27\xec\x95\x6c\x39\xbd\xc3\xa0\x45\xe5\x30\x6e\x3d\x3e\xda\x76\x52\x7a\x5b\xd3\xf6\xb3\x73\x2d\x31\xd7\xe5\xda\xc3\x74\xb1\xe7\xd9\x18\xb5\x68\x72\xf4\x2b\xd9\xca\xb2\xa2\x9f\x2d\xad\xd7\x21\x91\x32\xbe\x87\x63\xe6\x5e\xca\x2c\xb6\x8c\xa5\xb2\x7a\x82\xad\x34\x51\xea\xa9\xce\x34\xa7\xbd\xd0\xd9\x35\xbd\xbd\xcf\x65\x13\x9d\x59\x57\x00\x1f\xcb\xb2\x27\x6c\x57\x08\x2d\xe7\xd7\x10\x9c\xb9\xa2\xac\x13\x61\x94\x12\xbf\xbf\xae\xeb\xb5\x30\xe2\xfb\x67\xcf\x6e\x6f\x6f\x7b\xcb\xa2\xe9\x95\xd5\xf2\x19\x17\x09\x3d\xfb\xfb\xde\x5e\x3f\x37\xe0\x06\x44\xb8\x36\x65\xc1\xac\x82\x90\x33\x41\xea\x74\x60\x0f\xc8\xd5\xbc\xae\xca\x42\xcf\xb1\xaa\x46\xae\x55\x25\x56\x52\xe7\xbd\x3d\xae\xc9\x77\xf2\x68\x2e\x3d\x11\x24\x0e\x14\xa3\x97\x4f\x88\x54\xa2\xdf\x48\xeb\x84\x60\xe2\x31\x21\xbe\xae\x59\x23\xa2\xde\x70\x68\x34\x08\x22\x85\xb5\x9b\x8c\xbc\xdf\x19\x0b\xaf\xc2\x53\x27\xc5\xad\x9a\x71\xd6\x03\x0f\xb8\xae\x43\xc6\x29\x0c\x58\x33\x22\xb2\x14\xfb\x4c\x31\x06\x31\x33\x6c\xaa\x53\x32\x33\x7e\x08\x90\x70\x9c\x5f\x43\x89\x3e\xa7\xc4\x32\x2e\x20\x47\x42\x20\x84\xb5\xdf\x98\x20\x24\x4e\xf0\xa1\x04\x5d\x07\x14\x54\x1e\xc7\xcf\xea\xda\x28\xfc\x32\x53\x75\x4d\xa5\x50\x81\xaf\x47\x8a\xea\x35\x9c\x00\xd7\x9e\xf0\xc2\x77\x31\x70\xb6\x2c\x86\xaf\xfb\xdc\x5a\x71\xbb\x86\xb0\x4e\x6a\xb5\xce\xcb\x8d\xaa\x38\x7c\x1c\x50\x36\x30\xf1\xa0\xaa\x8e\xa0\xd4\xce\x7a\x7d\x39\xac\xb0\x2c\x36\x90\x8c\x34\x7a\x59\x20\xba\x1a\x0b\x41\x6f\xfc\xec\xfb\xe2\x8a\x80\x7b\xde\x13\x94\xc0\xb6\x61\xa5\x43\x7c\x36\xed\x81\x8f\xb8\x2f\xd1\x74\x81\xa6\x26\xf4\x35\xdd\x1d\x02\xa6\xea\x27\x5e\x85\xbf\xfb\xed\x0f\xff\xe9\x3d\xbb\x28\x7f\xd4\xf2\xf8\x8f\xf5\xb1\x6b\x2f\x3c\x3e\xe9\x9d\xf4\xea\x2f\xf5\xd7\xfa\xc6\xf3\xe7\xcf\x9f\xbf\x7a\xf9\xd2\xfe\xff\x93\x6f\xbf\x79\x1e\xfe\x7f\xfb\xe7\xf4\xf4\xe4\xf9\xdf\x9d\xbc\x38\x3d\x3d\x7d\xfe\xfc\xf4\xe4\x9b\x6f\xff\xee\xf9\xc9\xcb\x57\x2f\xbe\xfd\x3b\xf1\xfc\x6b\x0d\xe0\xa1\x3f\x8d\xb5\x5a\x84\xf8\xbb\x1b\x99\xe9\xd5\x03\xcf\x3d\xf6\xef\xff\x4e\xff\xc0\xee\x8b\x3f\xd6\x62\xf8\xee\x72\x28\x52\x3e\x02\x4e\xdf\x9f\xf4\x4e\xf6\xfa\xe8\x03\x74\xe1\x70\xb0\xe9\x67\xaf\xe0\x50\x19\xa3\xaa\x5d\x6a\x8c\x5f\x78\xda\x3b\xa1\x3c\x61\x1b\xad\x1b\x42\x69\xfb\xfb\x1e\xa5\xa9\x61\x30\x64\xc2\x85\xdc\x47\x62\xf1\x20\x7d\x12\xf0\x53\x61\x4a\xe9\x5a\x49\xe8\x51\x04\xa3\x93\xf1\x82\x02\x04\x18\x7a\x93\x2f\x2f\x09\x8c\x2c\x48\x8d\x45\x38\x9e\x68\x61\xb1\x75\xc5\xe1\x2e\x80\x99\x8a\xfa\xa8\x01\x4c\xe3\x50\x1f\xa1\x15\xe3\x87\x60\x5a\x9f\x45\x4b\x00\xfd\xb9\x00\x27\x0a\x4c\x5d\x7c\x05\xbd\x23\xca\x10\xb9\x39\x02\x5b\x3e\xf2\xc5\xd5\xa5\x28\x9a\x95\xaa\x10\x1a\x5b\x56\x72\xa5\x6a\x60\xcb\x01\x8a\x41\x53\x57\xcd\x1c\x22\xa1\xb9\xdc\x94\x4d\x6d\x12\xca\xca\x41\x0b\xcf\x0a\x50\x9d\x12\xa1\x0b\xb0\x79\x19\xb0\x8e\xb2\xb1\x56\x09\x58\xdf\x25\x1c\x94\x3e\x7a\x98\x43\x6c\xc2\xb0\xa1\xa1\x55\xf3\xe4\xe3\xd0\xdb\x8b\x7a\x3d\xb1\xeb\x1d\xf3\x39\xd7\x3a\xe8\x7a\xc6\x92\xd4\x2e\x1c\xbf\x60\x89\xdb\x1d\xee\x88\xa3\x11\x56\x69\x87\xbc\x0e\x65\x8e\xc4\xd9\x90\x30\x8c\xcf\x52\xb8\x6d\x54\x22\x12\x20\xf9\xd1\xbf\x1c\x98\x78\xbb\x43\x24\xc6\xee\x6d\xe3\x93\xd2\xb5\x7b\xaf\xdd\x19\xe8\xde\xc5\xd7\x7e\x3b\xdc\x76\x06\xdb\x74\x73\x24\xcc\x0a\x49\xdb\x70\x83\xdd\x5e\x52\x39\x4d\x6b\xbb\xcb\x85\x58\x58\xab\xc5\xfe\x35\x91\x09\x18\xa8\x8a\xca\x55\xb1\xac\xaf\x7b\x7b\x6f\xb1\x14\x60\x05\x4d\x70\x9b\x5d\xed\x8b\x7e\xa7\x76\x4a\x88\x47\x77\xed\x37\x95\xfc\xb7\xfa\xd3\x7b\xf6\x51\xaf\xbe\xa6\xb2\xef\xf8\xf3\xb0\xfe\x3f\x79\xfe\xea\xd5\x49\x4b\xff\x9f\xbc\x7c\xf5\x9b\xfe\xff\x55\xfe\x7c\x1c\x7c\x10\xc3\xc1\x59\x7a\x31\x49\x21\x6e\x79\x14\xf8\x2d\x45\xb9\xd5\xd9\x16\x15\x48\x06\xf4\xa4\xbe\x26\xf0\xa3\x5e\x31\x5c\x84\x07\x73\x83\x42\x17\x5f\x63\xa1\x8d\x2f\xee\x55\x5f\x6a\xd4\xc6\xd6\x8b\x04\x7f\x24\x50\xc9\xc1\x17\x1c\x75\xc8\x47\xbd\x4a\x7c\xbf\x71\x53\xf0\x10\x55\xf6\xcb\xbe\x8b\xcd\x4f\xa6\x74\x40\xfb\x50\x50\x87\x3f\xf1\xac\xcf\x01\xbb\x68\x58\xc9\x18\x0d\xd1\x4e\x1d\x3d\x3a\x43\xbd\x8d\x18\x14\xb9\x2d\x44\x63\xe4\x52\xb1\x67\x8a\xf2\x18\x9e\x46\x3a\x68\x0c\x19\x0f\x8e\x28\xc8\x16\x0c\x24\x8c\xea\x79\x21\x7a\x08\x5e\x2e\x96\x15\x1f\x85\x22\x15\xd6\xc6\xb7\xe6\x85\xc3\xa7\xf8\x51\x80\x78\x98\x78\xbc\x49\x1f\xfe\x5b\x50\xb5\x7b\x8b\xd0\x96\xe1\xc2\x4e\x8e\xb0\x94\x26\x5c\xc6\x00\xac\x91\x40\xfe\xfc\x9a\x30\x58\xfa\x29\xb2\x72\x45\x4b\xc5\x3f\x6b\x45\x82\x3c\x47\x4a\x38\x2c\xab\xa8\x42\xc2\x14\x84\x2e\xa3\x10\x2d\xc4\x0c\x30\xe2\x09\x2e\xb9\x7d\x3b\x37\x37\x04\xc8\x32\x00\x59\x8f\x7c\xcd\xf3\x4a\xcf\x1c\x67\x40\x44\x1e\xb2\x1d\x0e\xe9\x21\x16\x1f\xe8\x7f\x42\xbf\x87\x5c\xe8\x8f\xe8\xcf\x1f\x12\x83\xd4\xad\xdc\x1c\x31\x99\x41\x10\xe0\x89\xa6\x4c\x44\x8a\x3c\xdd\x60\x6c\x30\x05\xb2\x30\x61\x1e\x11\x6b\x78\xb8\x69\x5b\x70\x96\xc1\xa0\x38\x14\x06\x91\xf0\x69\xfc\x6f\x08\xb1\xd6\x6e\x2b\xe3\x93\x1e\x7e\x9a\xd7\xa5\x5c\x2c\x34\xe0\x5e\xc6\x27\xcc\xae\x07\x61\x07\x45\x9f\xce\x73\x91\x95\x8e\x15\xd5\xbf\x2d\xac\x68\x96\x11\x6f\xd9\xc6\x05\x38\xa2\x33\x60\x44\xa1\x96\x65\x0d\xed\x0e\x5c\xb3\x50\x29\x8f\xaf\x5a\x94\xfc\x00\x9a\x85\xb8\x3b\xfe\x54\x12\xbe\x4f\x14\x80\x4c\xe8\x8e\xfb\x62\x8d\x70\x8c\xb8\x58\x73\xa8\x75\xad\xc3\x59\x69\x23\xde\x54\x72\x25\x3e\x94\x65\xae\x0a\x29\x2b\xf1\x7b\xfb\xdf\xff\xeb\x8d\x5e\xf5\xca\x6a\xf9\xf7\x34\x3c\x44\x0c\xc6\xb5\xf3\xa1\x4b\x59\x14\x65\x53\xcc\x89\x2d\x31\x40\x9f\x03\x88\x23\x23\x0e\x21\x26\x6e\x45\x59\xbe\x11\xf6\x8d\x66\xd1\x2b\x54\x9d\x88\xdb\xdb\xdb\x1e\x7d\x81\xef\xad\xb5\xbd\x7b\x2a\xd3\x75\x59\x99\x23\x3a\x91\xae\x5e\x69\x9d\x2b\x88\xb3\x41\x26\x1f\xf3\x0d\xc1\x11\x8e\x37\x8a\x9d\x2f\xae\x01\x80\xd8\x8d\x2a\x32\x71\x4d\x97\xc6\xcd\x04\x60\x6e\x4c\x4f\x8c\x0a\xe2\xed\x0f\xd6\xc5\xee\xc5\xbc\x2c\xa8\x81\x19\x31\x75\x71\x87\x5c\x9c\x33\x7a\x97\xdf\x6c\x6b\x3f\x62\x7d\x0c\xf6\x2a\xb9\xd6\xb0\x9e\xbf\xd9\x33\x77\xb3\xdb\xa1\xd3\xe8\x36\x61\xd7\xa6\x8c\x63\xc9\xd2\x88\x15\xb2\x7f\xba\x92\x35\x79\xe4\x1b\x05\xbc\x68\xe5\x42\xd7\x38\xcc\xee\x45\x57\x12\xbf\x4a\xd6\x62\x70\xd4\x8b\x24\x4e\x60\xef\x06\xf3\x44\x99\xe8\xbe\x1c\x9c\x38\x2a\x7c\xa7\x23\xe7\xa7\x8b\x98\x82\x00\x67\xcc\xc4\x3d\x8f\x09\x01\xb8\x65\x90\x01\x7a\xaa\xb0\xa1\x1a\x48\x06\x1c\xb6\x52\x76\x0b\x89\x0a\xba\x25\xbf\xd4\x10\x63\xf4\x4a\x99\xea\x56\xe2\xcb\x5b\x3a\xd4\xc0\x42\xdd\xa2\xbb\x4c\x75\x29\x74\x97\x82\xcb\x8f\x39\x49\xfe\x29\x88\x3b\x42\x7f\x00\xc5\xed\x88\xb3\x03\x7a\x66\x0f\x20\x1a\x88\xf5\x87\x64\x92\x5f\xcd\xec\xc8\x63\xa7\x62\xb6\x28\x5e\x16\xaa\xf5\xe3\x26\x5b\x37\xd0\xed\x73\x33\x3f\x4a\x5c\x3a\x26\x3e\x25\x2c\x67\x21\xca\x1a\x63\x08\x87\xdb\xc7\xd8\x03\xed\xb6\xd2\xdd\xfa\x15\xff\x1c\xc3\x12\xe6\x61\xd9\x68\x74\x8c\xfc\x07\x18\x5a\x8e\x4a\x8c\x82\x51\x86\x4f\xd1\x8f\x40\xe9\x76\x2a\x8b\x88\xfa\x18\x84\x65\x91\xb9\x77\x77\xfc\x34\x50\x1c\xd1\x74\x1f\xd4\x1b\x0f\x7c\xb0\xd7\x9a\xbe\x3d\x7a\xc0\x85\x19\xbe\x7d\x37\x4f\x17\x34\x98\xe7\x12\xc9\x12\xbd\x7d\x8a\xb1\xf8\xb0\x98\x37\x3c\x08\xdd\x6a\x1d\x4c\xa4\x95\x62\xe8\xc7\x96\xc2\xde\xbe\x64\xd6\xbb\xdd\x69\x09\x84\xa3\x77\x1d\x58\xc8\x00\xae\xcb\x2d\xed\x0f\xa9\xd4\x48\xbb\x5f\x47\x07\xdb\xad\xcc\x2f\xb6\x63\xa6\x44\xa3\x05\x7f\xb3\x45\x6f\x40\xa5\xae\x8f\x91\xa2\xfd\xa2\xc5\x46\x95\xec\x89\x76\x58\x4f\x05\xd3\x53\x47\x7e\x43\x1e\xa8\x29\x3e\x7c\x77\x39\x3c\xda\x71\x1d\x3a\xaf\xeb\xd6\x96\xf9\xc4\x29\x7c\xe6\x72\xe8\x83\x51\xa2\xab\xc4\x93\xc7\xf8\xe2\x48\xf4\xc5\x4a\x19\x30\xe5\x1d\xb6\x7f\x06\x58\xe6\x6e\xa9\xf8\x0a\x34\xf5\xba\x71\x51\xc7\xfd\xef\x5d\xb5\xe8\xbc\x5c\xad\xb0\x19\xc4\xa5\x3d\x75\x51\x57\xa5\x75\x05\x94\x2a\x12\x8c\x1d\x39\x70\x46\xe4\x31\xe9\x10\xee\xd6\x4d\xa0\x53\x62\x54\x90\x35\xb5\x62\x8c\x6d\x6f\x5c\xcf\x68\x97\x3a\xa4\xdc\xe9\x91\x3a\x02\x55\x46\x9b\xc8\x33\xd4\x06\x5b\x39\xaa\x10\xd6\x4a\x1a\xb1\x90\x15\x42\x7c\x6b\x13\x30\x40\x96\xc5\x22\xd7\xf3\xa0\xc9\xd7\x21\x01\x30\x3b\x4e\xb0\x4f\xbc\xa2\x2f\xd1\x2b\xe8\x3a\x91\xd2\xf8\x0f\xf3\x38\xad\x36\x2d\x32\x71\x7a\x94\x1d\x79\x2d\x02\xd4\x35\xab\xf2\x86\xa0\x2a\xe0\x03\x59\xd2\x76\x05\x89\x9b\xc7\xde\x28\xe8\x78\xb6\x67\x04\xbd\x06\x7b\x64\xd1\xbf\x25\x2f\x6c\xe0\x8c\x8f\x6e\xe7\xab\xed\x6e\xb1\x69\xa1\x8a\x79\xd9\x54\x72\xe9\x48\x62\x9c\xe0\x0c\x3b\xa8\xb7\x2c\xe3\x1d\x57\xbf\x6d\xb4\x79\x3b\xa0\xa5\x73\x50\xdd\xae\x81\x57\x07\x4a\xdc\xb1\x98\x24\x2b\x5d\x1d\xc9\x6c\x23\xd4\xf1\x4a\x6a\x28\x15\x9d\x6d\x44\xb3\xce\x4b\xe9\x5e\x85\x81\x4b\xac\xd3\xa7\x3e\x8c\x22\xa3\x1f\xf0\x33\x57\xe3\xa1\xab\x1d\xf6\x85\xc1\x4e\xea\x1b\x8a\x3b\x1e\xaa\xde\xb2\x97\x84\x6b\xf5\x41\xfe\xa8\xec\x07\x8e\x82\x17\xc6\x66\x06\xfb\x0d\x38\x0d\x1a\x27\xd7\x89\xa3\x89\xd8\x10\x04\xca\xef\xfd\x7a\x38\xfb\x1b\xb6\xec\x23\x3b\xce\xd0\xdb\xef\x2d\x3c\x07\xe1\x1a\x38\xac\xce\x6f\x8f\x84\x25\xdd\xb0\xd8\x81\xe7\x80\x03\x22\x05\xed\xa0\x91\xf1\x99\x04\x47\x81\x1a\x6e\xb7\x43\x3d\xb2\xaf\x26\x7a\x69\x03\xa4\x10\x4a\x66\xfc\xd9\x48\xd1\x83\xa5\x3c\x07\x16\x3b\x20\x63\x89\x4b\x2b\xbe\x7a\xa0\xb4\xf7\x6c\xf8\xee\x72\x38\x1c\xff\x35\x43\x80\x0f\xc7\xff\x5e\xbc\x7c\x79\xfa\xa2\x1d\xff\xfb\xf6\xc5\xe9\x6f\xf1\xbf\x5f\xe3\xcf\xc3\x59\x9a\xb7\x65\x25\x86\xd8\x74\x51\xeb\xb9\x18\x2b\xba\x1d\x7b\x97\x95\x92\xab\x59\xae\xf6\xa6\x21\xf0\x23\x56\xc1\x98\x1a\xf3\x17\x12\xca\x61\x88\xd9\xcc\x8a\x34\xf0\x99\xa8\x33\xb0\x82\xba\xa7\xac\x04\x0b\xca\x5c\x83\x6f\xe6\xcb\xd6\x74\xdd\x13\x6f\x36\xd4\x04\x6a\xea\xa4\x85\x8e\x88\x05\x1b\xdc\x54\xbf\x6c\x24\x34\xe4\xaa\xc7\xdf\x0b\xb5\x56\x76\x70\xc7\xc7\x75\x5c\x6a\xa2\xfc\x98\xe1\xa1\x80\x45\x55\x53\xbd\x09\xd5\x30\x85\x7d\xa7\x8f\x24\xb9\x16\x3b\x96\x2f\x09\xed\x17\x6c\x70\x43\x86\x11\x34\xea\x98\x2a\x33\xf7\x3f\xad\xf8\xa7\xe2\xf8\x98\x79\xd3\xf2\x8d\xc8\xd5\x17\x3d\xe7\xd4\x1d\x14\x68\x48\x18\x67\x47\xf1\x23\x94\x39\x9d\x8d\x2e\x3f\x43\x8d\xf5\xf9\x60\x32\x1d\x0f\xde\x5c\xd9\x7f\x82\x07\xb1\x86\xf9\xac\x6f\xff\xc2\x0a\xd5\xe7\x2d\x3a\xf5\xbe\x6b\xd6\x0d\x86\x6e\x4d\xa5\x8e\xf9\x91\x8b\xb5\x0d\xdc\x0d\x71\x8f\x9d\xac\x06\xbe\xb7\x39\x60\x40\xc0\xa6\x77\xe2\x90\xd4\x8e\xaf\x23\xb4\xc9\x77\x82\xb3\xfc\xa2\xbd\x11\x87\x48\xff\x8c\x78\x5b\xfb\xe1\xc1\xdb\x3f\xea\x61\x77\x12\x1d\x78\x64\xed\x44\x5d\x85\x91\x87\xfd\x4d\xd9\x30\xf8\xd6\x7e\xc7\xf6\x31\x1e\x89\xe4\xe6\x5b\x52\x3e\x78\xf6\x66\xd6\x39\xca\x65\xb1\x6c\xac\xfd\xb5\xae\xd4\x5a\x5a\x8d\xee\xfa\x8f\x59\x17\x62\x77\x9e\xaf\x61\x72\x95\x40\xae\x8b\x6c\xbf\x63\x66\xfb\x89\x98\xa9\xbc\xbc\x4d\x42\x0e\xbe\x62\x83\x06\x27\xb6\xc2\xc1\xb6\xb9\x30\x5b\xe7\x1a\xbb\x3a\x52\x3b\x43\xf8\x55\x04\x76\xd0\xf5\x5d\x9a\x33\x15\x12\xee\x78\x8a\x2d\xef\x4c\x55\xfa\x06\xb9\x6f\x03\xae\x32\x7f\x54\x72\x79\xfb\xbd\xcb\xec\x43\x4f\xf6\x26\xe1\x4e\xc5\x80\xb3\xe1\xa1\xaf\xc4\x58\x70\x61\x85\xe3\x4c\xd6\x08\x61\x07\x2b\x1c\x66\x8d\x5d\xfc\x1c\x80\x50\x72\xb8\x9e\xa6\xae\xa4\x1d\xd3\xa2\xac\x6e\x65\x95\xe5\x94\x27\x96\x05\x1e\x62\xde\xc8\x9e\x38\x7c\xaf\x2a\xa5\x0b\xf0\x9c\x12\xf7\x06\x6a\x6f\x73\x41\x73\xf6\x8e\x83\xc2\x70\x72\x10\x00\xb6\x7e\x3f\x1c\xce\x7e\xef\x08\x18\x84\x86\x6a\xc9\xe0\x99\x2b\x66\xe7\xeb\x38\x76\x8c\xe0\x14\x19\x8a\x1c\xf6\xa1\xce\x4b\xdf\xe6\x4a\x21\x98\x78\xfa\xd0\xdd\x86\x27\x1b\x01\x2c\x20\xdd\xe3\xe1\x5b\x29\x89\x9e\xc4\x76\x15\x18\xb8\x61\xf2\xdd\xb3\xf1\x77\x12\x4f\xbf\x16\x8e\xfb\xa7\x6c\x6a\xa3\x33\x85\xd5\x7d\xf3\x72\x4d\x86\xae\xf5\x13\xca\x85\xa8\x9a\xa2\x20\x0a\x70\x2a\xee\x43\xcc\xda\x5d\xfb\xae\x4d\x14\x72\x62\x96\x2a\x72\xd3\xc0\xb6\x63\x18\x2c\x5f\x2c\xc8\x83\x64\x3a\x65\x06\x10\x03\xec\x16\xc0\x6f\xd0\x35\x3a\x07\x4f\xba\x08\xe2\x50\x17\x99\x5a\x5b\xbd\xe5\x51\xeb\x03\x6c\xa0\xce\x71\x17\x42\x8a\xba\x2c\x73\xa4\xb0\xa9\x10\x18\x42\xd7\x18\x02\xe6\xe5\x27\x5e\xbc\xc6\xea\x5b\xfb\x7e\x83\x38\x83\xec\xfa\xd0\x8c\xda\x35\x35\xdb\x5f\x83\x3a\x66\xe8\x75\xe8\x05\x6c\xfb\xeb\x0d\xd5\x27\x3a\x6f\xc8\x5d\x95\x18\x0a\xa4\xeb\x95\x31\xc9\x03\xdc\x37\x8a\x92\x20\x99\x78\x17\xff\xbe\x5d\xda\xb5\x9e\x37\x08\xaf\x00\xde\xb2\x0f\x9e\xe7\xbe\x0d\xb6\x2c\xb0\x3e\x9c\x86\xb8\x83\xc6\x87\x74\x0f\x4d\xa1\xa3\x1d\xe3\x35\x86\x9a\x34\x3a\xa1\x1c\x81\x75\x75\xf0\x76\x54\x70\x69\xda\x58\xb6\xdc\xc1\x5c\x03\x14\xbf\x61\x68\x40\x8c\x00\x85\x45\xec\x91\x1f\xe9\xc3\xb5\xdd\x2c\x15\x3b\x16\x32\x82\x21\x65\x64\x32\x88\xa4\xb9\xd2\x4a\x66\x69\xa7\x2b\x12\xe1\xdc\x4a\xc2\x36\x0b\xb1\x3d\x5b\x7c\x51\x58\x91\xea\x6a\xa6\xd7\x55\x59\x3b\x72\x48\xeb\x4e\x93\x05\xe5\x3a\x2d\xec\x80\x4e\xfd\x39\xa1\xc2\x74\x42\xcb\x5a\x13\xb2\xd2\x63\xc7\xa3\x0b\x9d\x33\x41\xf4\x4b\xe6\x7e\x7f\xe2\xed\x4a\xa8\x9d\x76\xfb\xb4\x6e\x95\x00\x41\xb1\x4b\xc4\x84\xd9\x51\xcb\x74\x82\x0d\x38\x5d\xe7\x13\xeb\x94\x95\xc2\xc3\x82\xb3\x33\x61\x54\x37\x20\x57\x8a\xb2\x9e\x48\xdd\x01\x39\x69\xe4\xf4\x9b\xa9\x6e\x81\xdd\xf3\x24\x49\x9f\x5d\xf6\xd2\x41\xbf\xa1\xcb\xee\xde\x5a\x5b\x6b\xa5\x42\xe4\x6f\x44\x92\x70\x87\x37\x62\x4a\x81\xab\x85\xf1\x91\xe0\x35\x8c\x9d\x97\x01\xa8\x36\x1e\x5f\x7c\x2a\x60\xc2\xef\x18\xc4\xed\x75\x99\xc7\xe0\x7a\x68\xa1\x38\xb8\x80\x88\x61\x9a\xb0\xaf\x62\x20\xe7\x47\x50\xf5\xd8\x9a\x31\x9d\x1c\x17\xed\x8a\x2c\x5f\xab\x0c\x23\x83\x78\x45\x84\x9b\xe6\xd8\xa9\xb8\xc1\xda\xf1\x65\x5b\xcd\x00\x76\x47\x48\x56\xbd\xfb\x88\x61\xab\xb0\x43\x0a\xde\x84\xdc\x38\xa1\x84\xb7\x0f\x33\xb7\x07\x41\x7a\xa1\x42\x5f\x19\x95\xdf\x28\x93\x04\x99\xcb\x08\x7c\x17\x82\xee\xd8\xc1\xc5\x08\xe5\x31\x8b\x89\x9b\x8a\x23\x51\x8b\xe3\x9d\xc0\xad\x13\x7f\x1a\x89\x45\x77\x3c\x8f\x78\xf7\xee\xad\x11\x75\x2b\xee\xb3\x43\x53\x78\xf2\x6d\xdc\x15\x63\xc1\xf7\x71\xf8\xb4\x2c\x76\xef\x3f\xf3\x8a\x47\x94\x75\xce\x47\x60\x1b\xdc\x38\xb4\xc0\x88\x9d\x10\x3e\xc3\xc8\x90\x0d\xd8\x2f\xa0\x2b\x20\xb8\x05\x79\x33\x98\x62\x9b\x99\xb9\x14\xb7\x56\xee\xb1\xad\x33\xbd\x6e\x4c\x42\x79\x56\xc0\xb5\xc4\x70\xad\xd3\xdf\x01\x29\x82\xbd\x85\x00\x62\x4c\x88\x67\x84\x9b\xab\x4c\x1d\x31\x18\xd4\x25\xd9\xda\xc4\xf4\xe2\xc0\x6d\x10\x31\xeb\xb5\xa8\xa4\x9d\x5e\x12\x7e\x0a\x2d\x5d\x07\xb4\x16\xe5\xef\x19\xc0\xbc\x6b\xb9\x03\x5b\x1a\x46\x83\x1e\xc7\x8d\x6a\xe3\xcb\x3d\xa4\x72\x06\xbe\xf0\x37\x11\x2b\xa8\x0c\x5a\x2e\xed\xaa\x39\xd4\x72\x32\x77\x61\x56\x10\x90\x7d\xcc\x0c\x7a\x48\xcd\x41\x69\x4b\x88\x3e\xf2\xd8\xdb\x8e\x10\x11\xf4\xa6\xcc\x1b\x6a\xb3\x12\xa6\x2e\x2b\xeb\x40\x95\x55\xbc\x22\x68\x70\xf8\x98\xf5\xac\x72\x44\xf2\x7e\x06\x5e\x26\x39\x9c\xbc\x2d\x99\xf4\x82\x18\xbf\xbd\x55\xe5\x5c\xdd\xa2\x8c\x56\x7d\xd1\xd6\x6e\x3b\xaf\xcb\xac\x81\x7d\x0e\xe3\x25\x1e\x9e\xe4\xa1\xc5\x02\x64\xf8\x79\xb5\x59\xd7\x2d\x9b\xbe\x73\xb1\x66\x1b\xc7\x52\x8a\x61\xcd\x99\x62\xb8\x7d\x9d\x63\x08\x3d\xd7\xc5\x8f\xec\x64\x82\xb9\xe6\xc0\xa7\xa5\xe8\x2e\xce\xde\x76\xf9\x08\x4a\x44\x12\xe0\x8a\xb6\x9e\x0e\x31\x94\x24\x2e\x50\xbb\xe5\xeb\x3d\xb4\x3e\xa4\xa6\x90\x92\x41\x2c\x64\x9e\x1b\xe7\x22\x3c\xbc\x5b\x0e\x05\x01\x81\x5d\xd0\xa4\x78\xea\x44\xbe\xf6\xfa\xcf\xb1\x31\x14\x00\x0b\xe7\x3f\xca\xa5\x0a\xe8\xc8\xe2\x83\xb3\xf3\x9b\x4c\x03\xae\x83\x63\x47\x27\xec\x21\x53\xeb\x28\x21\xd1\x82\xfe\xda\xcf\xd9\xcb\x01\x63\x0c\xe2\x88\x9f\x3e\x58\x5f\xcf\xdd\xd2\x37\xfc\xaa\x07\xec\xaf\x97\x48\x22\xb5\xc5\xc6\x48\xa0\x7c\xf8\x7b\xb0\xc4\x16\x80\x97\x05\x6f\xf2\x3f\xb6\x3b\x6f\x5f\x41\x30\xca\x41\x09\xb9\xfd\x9a\xeb\xda\x26\x1b\xcf\x99\xc4\x10\xfa\x61\x54\xa4\xbf\xd9\x29\x41\xa2\x93\xac\x21\xf8\x64\x9c\x6b\xb0\x06\x4f\xd8\xee\xa4\x6d\x05\x47\xeb\xf6\xe4\xce\x86\x60\x6f\xb0\x1c\xa0\x13\xf1\x9c\x5f\xeb\xd2\x7c\x00\xd1\xa5\xaa\x03\x43\xc5\x8f\xe8\x2b\x55\x0a\x28\xab\x85\x2a\x96\xba\x50\x1e\xc1\x3f\x53\xb3\x66\x09\xb4\x00\xdb\xa6\xba\xf7\x7b\xac\xc5\x00\xcd\xb9\x6d\x33\x97\x8a\x61\x9c\x27\xd8\x1a\x94\x9b\xc6\x8e\xb8\x00\xa6\x97\x0a\xea\xb1\x7d\xf8\x71\xb6\xce\x60\x46\x95\xda\x15\xc6\xe8\xf9\x11\x03\x2d\xeb\x66\x87\xdf\xb7\x75\xb5\x32\xc4\xca\xc5\xba\x4d\x8d\xf5\xb6\xeb\x5c\x6e\xcc\x96\x3f\x6b\x82\xea\x81\xa8\x14\xa3\xed\xf7\xf2\x9e\x74\x4e\x67\x55\x12\x42\x2e\x14\x3b\xdd\x2a\x20\x38\x01\x8c\x17\xe8\x31\x9c\x2b\x22\x96\x0c\x98\x42\x2b\x97\x73\xef\x9c\x50\x3f\x37\x65\x30\xb4\xac\x0c\xea\x39\x31\x41\x56\x2c\x43\xff\xa8\x4f\x5d\xfe\x9b\x68\x1d\xdc\x7d\xe2\xe2\xb6\x76\x69\x81\x9c\x5f\xeb\x42\x1d\x5b\x5d\xc6\xdc\xb0\x2e\x10\xf6\x70\x3c\x85\xd3\xa8\x8e\xed\xc4\x15\x68\x58\xe3\x86\x0f\x43\x38\x98\x43\x34\x7e\xbb\xca\x55\x23\xa9\x63\xac\xcf\x58\x64\xe2\x14\xa5\xca\x11\x38\xff\x9e\x7f\x24\xbe\xc6\xe6\x67\x89\x84\xa4\x63\x45\xb6\xd6\xe0\xa9\xd2\x0a\xf6\x3a\xec\x73\xea\x2a\x0d\x36\x65\xab\x08\x01\x32\xe6\x1e\xd9\x70\xd7\xed\x00\x97\x86\xe6\x45\xb0\x08\x5e\x94\x05\xc5\xdc\x5b\x32\xad\x8e\xdb\x6b\xba\xad\x51\x74\x89\xaf\x80\xff\xc4\x34\xba\x26\x32\x36\xbb\x85\xda\xac\x98\xc0\x9e\xb4\xfc\x83\xe1\x14\xd1\xef\x7a\x01\xd4\x3c\x30\x8f\x91\xb6\xce\x3d\xf0\xe9\x83\xcc\x59\xab\x8a\x9b\x9f\x1e\xea\x67\xe9\xd8\x3b\xbd\xf0\xcb\xa8\x91\x17\xdf\x20\x7d\x50\x50\x11\x13\xcd\x3f\x80\x3f\x73\xad\xc9\xc7\x70\x51\x6a\x38\xe6\x6e\x6a\xfc\xa0\xaf\x73\xe0\x1b\x24\x09\x72\xd7\x3e\x1a\x78\xf2\x0f\xdc\x37\xe9\x9c\x12\x08\x05\x25\x8f\x54\x02\x25\x11\x5a\x02\x78\x90\x28\x1e\x02\x96\x5c\x13\x30\x39\xeb\x42\x4c\x9a\x19\xbb\x4b\x2f\x65\xc2\xca\x97\x6a\xa6\x31\x50\x50\x94\xd8\x08\x4c\x9c\x60\xf6\x88\x18\x70\xb6\xd6\xaa\xe2\x88\x10\x96\x9e\x04\xa6\x7d\xcf\x13\x1b\x0f\x16\x9d\x5e\x67\x60\xbb\xc0\xaa\xcc\x36\x9e\x44\xc6\x03\x56\x82\x48\xa3\x44\x7f\x90\x87\x23\x46\x52\x0c\x90\xa9\x9f\x1a\x7d\x23\x73\x70\xf0\xe3\x1f\xd6\x8e\x92\xd3\x4f\xda\x2f\x84\x0b\x2c\xc0\x4a\xc1\x2b\x7b\x9e\x29\xf9\xa3\xaa\xf0\x66\x85\x57\xee\xda\xca\x62\x22\x55\xe9\x86\x0f\x30\xe1\x52\x33\x62\xb1\x2f\x7c\xa4\xdf\x1a\x84\x05\x46\x5d\xc7\xf5\xe9\x21\x4c\x8d\x5b\x1d\x2e\x8a\xfc\x79\xb2\xa9\xf6\x98\xfe\xf1\xd3\x4f\xb6\x9f\x22\x35\x06\x69\x20\x48\x88\x15\x99\x68\x6a\x07\x8b\x03\x29\x2e\x51\x28\x95\x51\x45\x51\xa5\x50\xb4\xb0\xf8\x70\x66\x88\x5d\x6a\x5d\x07\x00\x68\xa0\xd4\x28\xc7\xea\xad\xc1\xa4\x75\x56\x31\x80\x15\xca\x77\xfb\xb1\x08\x47\x5d\x16\x1b\xc4\x75\x66\xb3\xbd\x28\xab\x15\xe6\x6d\x83\x9f\x1d\xea\x82\xb3\x4a\x3e\xce\x39\xd3\x85\xac\x00\xbe\x60\x75\xe4\x2f\xf0\x4a\xfe\x40\xd5\xdd\x65\x01\xd1\xad\x43\xf2\xc5\xaa\x44\xfc\xa8\xaa\x42\xe5\x68\xc9\x19\xab\x48\x8f\x78\x61\x51\x2c\x81\xc5\xb4\x31\xb5\x5a\xc5\xbc\x42\xbe\xed\x43\x54\x4d\x61\x1c\xee\x0e\xb9\xaa\xf4\x29\x8e\x41\x86\x38\x3b\xf1\xaf\xf1\x88\x60\xce\xf5\x5a\xae\xd7\xca\xc9\x19\x6d\xc2\x90\x5c\x00\xd6\x8c\xaf\xe0\x82\x96\xb8\x7b\x08\x09\xcf\x2a\xad\x6a\xbb\x0e\x39\x74\xfe\x39\x48\x3f\x0a\x74\xb9\xe5\x94\x91\x9c\x6a\xcf\xd7\xf9\x97\xfe\xcb\xe8\xe1\x33\xd9\x03\xc1\x26\x59\x3b\x8d\x40\x87\xd5\xca\x85\x3a\xbb\x74\x57\x5d\x2e\x31\x9d\xa2\x8b\xb6\x73\xd6\xaa\xa3\xb6\x8b\xf2\x4d\x1b\x9f\x7e\xbd\x61\x46\x81\x24\x20\xe7\x49\x10\x35\x02\x0b\x79\xca\xaa\xed\x05\x75\x8d\xe3\xeb\x31\xed\x7e\xc5\x41\x7d\x2d\x76\xde\xe0\x46\x3e\x46\x10\x9a\x78\x86\xd0\xe4\x21\x8a\xd0\x76\x53\x41\x58\x6a\x6e\x42\x96\x50\x53\x3a\x55\x0b\x5e\x86\xa7\x91\x80\xaa\x57\x5d\x20\x38\x90\x27\x1e\x84\x8d\x7e\xd5\x26\x2c\x7c\x90\xb7\x33\x11\x46\x33\x64\xb7\x6b\xf5\xa6\x80\x4e\x24\x8f\x98\xff\x52\xe5\x0f\x91\x5d\x7a\x8a\x8a\x27\xec\x51\x59\x81\x67\xd2\x8a\xa9\x98\x36\x19\xa6\x9d\x09\x53\x3d\xa0\xe3\x92\xcb\xdb\xbf\x90\x0f\x73\xab\x0e\x78\xb7\x17\xbc\x79\x62\x54\xef\x17\x12\x69\xe2\x09\x05\x40\x67\x8e\xa1\xb7\x51\x56\x17\x04\x6c\xd9\x4a\x56\xe3\x4c\xfc\xb4\x1e\x58\xe6\x6e\x76\x8e\x6f\x7b\x2d\x32\xce\x08\xc0\xe9\x6b\xad\x4a\xfd\xb5\xa8\x3c\xbd\x84\xf0\xa3\x0c\x24\x43\x40\xaf\xba\x6b\xe8\x11\xc3\xa7\x32\xdd\xa0\xb6\xbd\x5f\x42\x9d\xe8\x19\x52\x0e\x1e\xa3\x51\xbc\x86\xca\x8a\xbf\x1e\xab\xe8\xef\x7a\xc0\x94\xd3\x45\x01\x27\x89\xcd\xe0\x87\x26\x5b\x32\x8b\x01\xf0\x1b\xba\xd0\x48\x07\xf3\x16\x54\x92\xd2\x9e\x3b\x12\x28\x53\x16\xe2\xd0\x8e\x3c\x40\x77\xe0\xdf\x1a\xd3\x00\x4b\xc6\xff\x34\x1c\x0b\x61\x62\xf6\xdf\x04\xb1\x82\x68\x8d\x6a\xa7\x77\xbb\x83\x6e\x61\x8b\xaf\x08\x39\x0c\x98\x91\x5a\xd7\x31\x51\x5e\x20\x16\x1e\xf6\x1b\xed\x5e\x62\xce\x14\xbb\xaf\x3c\x2e\x3f\xa5\xd5\x31\x34\x93\x6f\x90\xbb\xc9\xfd\x17\x83\x6d\x01\xc5\x8b\xe3\x2b\x7a\x8c\x95\xc1\x45\xbf\x7e\x16\x19\xc3\x13\xa7\xc2\xbe\xc6\x56\x32\x24\xc8\x9f\x69\x23\xae\x15\x10\x60\xa1\xdb\x59\x56\xa2\x29\x88\x44\x0e\x4c\x59\xea\xa8\x2b\x36\x11\xf9\xbb\xae\xe6\xcd\xca\x80\x56\x20\x44\x45\x99\x7b\x15\xa1\xc2\xd7\x87\x35\xa3\x90\x50\xf5\xc4\x71\xfc\x94\xcf\x1f\x77\xfe\x00\xda\x93\x91\x1d\x23\xf8\xae\x61\x3b\x39\x48\x12\x12\xd5\x63\x57\x96\x50\x17\x10\x0d\xa1\x8e\x2d\xc7\xf7\xe5\xc9\x50\x8d\x2f\x84\xc4\xb0\x43\xbd\xa1\x7c\x1f\x13\x73\x56\x9c\xf9\x53\xa6\x46\x2f\x9d\x08\x85\x5c\x3d\x1f\x3e\xf9\x3a\xfe\xf8\x35\x85\x19\x8c\x9d\x5f\x30\x42\x2e\xf5\x20\xb5\x67\xa7\xbd\xac\xe8\x8d\x50\x28\x80\xe7\x96\x8b\x84\xc2\x3d\x27\xf7\xc3\xa5\x87\xb5\xbd\x16\x56\xde\xa0\x6d\x41\xe0\xd9\x7c\x33\x98\xb8\xd0\xf4\xc4\x07\x98\xaf\x2a\xd7\xb9\x42\x53\x09\xdc\xf2\xa5\x2a\x54\x55\x36\x01\x4f\x23\x17\x9f\x41\xea\x58\x67\x4a\x20\x8b\x1d\xd7\x4c\xc6\xbd\x59\x78\xf0\x11\xf7\x05\x07\x06\x10\xa1\x24\xf2\xcb\x22\x64\xa3\x0b\xeb\x27\xb9\x22\x00\x7f\xf4\x9a\x12\xbe\xcd\xda\x55\xf7\x40\x3d\xea\xb3\xac\x2c\x70\xe9\x09\x73\x5c\x2f\x04\xa8\x56\x61\xae\xe1\xbc\x58\x53\x94\x60\x58\x03\x79\xe2\x4b\x77\x1d\x0c\x9e\x93\x57\x34\x4a\xc4\x96\x74\x55\xa5\x24\x29\x49\x5b\xa2\xa8\x86\xe0\x3c\xe5\xa4\xe3\x5b\x13\x9e\x52\x6a\x26\x29\xe1\x3b\xf9\x06\x3b\xc5\x08\xa6\xd2\x30\x13\x5c\x46\x8e\xee\x96\x46\x43\xdd\x6b\xea\xce\x34\xda\x77\xbd\x00\xd4\x36\xaa\xf0\x7b\x86\x80\x7c\x0f\x86\x5d\x4d\x50\x7a\x07\x30\xb1\x84\xc6\x8f\xe4\x75\x56\x9a\x91\xbf\x3c\x8b\x6e\xc1\x6c\xe3\x03\xda\x48\xd5\x84\xb1\x30\x93\xc4\x56\x4d\x27\x4d\x2f\x75\x59\xef\x1a\x53\x87\x32\x81\x14\x50\x96\x11\xf3\x66\xae\xe7\xba\x16\x4b\x55\x02\x09\x07\x94\x56\x45\x53\x0f\x0a\x35\x3d\x7f\x13\x93\x5b\xd1\xb4\x7c\x20\x35\xfa\xa9\x36\x01\xbb\x2d\x96\x17\x22\xaf\x1e\x04\xe4\xfd\xa2\xa0\x38\x69\x98\x20\x4a\x65\x3d\x31\x28\xe8\x86\x4b\xd4\xcb\x61\x5d\xbc\x47\x8d\x62\x3f\xdc\x8d\x50\x42\x33\x2a\x07\xf8\x98\xfa\xac\xcc\xb6\x43\xf8\xcc\x45\xff\x35\xd9\x28\x7e\x61\x29\xf6\xff\x9c\x14\x15\x9d\xc6\xb4\x23\x38\xe8\xa6\x60\x08\xb5\x32\xc8\xda\x88\x75\x02\x04\xc8\xfe\x36\x37\xc5\x57\x64\xa3\xf8\xfa\x24\x14\xbb\x0a\x50\x5b\x84\x14\x2d\x1e\x04\x5a\x95\xaf\xcd\x37\x71\x72\xe2\xec\xd4\x5b\x7b\xa6\xb1\xc1\xd9\xc1\xcc\xb9\x5e\xb0\xdd\x79\xa5\xba\x24\x99\x8e\x74\xc8\x1c\xae\xc4\x12\xa6\xe8\xf2\xb7\x4d\xf9\xa2\x23\xb0\x0f\xd5\x4f\x95\xae\x55\xac\x82\xa8\xdd\x18\x5b\xcb\x5c\xac\x00\xf9\x81\x3c\x71\x02\xd3\xb7\xbd\x49\xcf\xfa\x0c\xed\x3e\x1c\x5c\xbc\xbb\x1a\x4c\xa6\x83\x33\x31\x4e\x27\xa3\xab\xf1\x19\xd0\x2d\x10\xf4\xcf\xb9\x78\x3b\x4e\x01\x71\xfd\xec\x7d\x7f\xfc\x2e\x4d\x1e\x26\x64\xe8\x78\xd9\xbf\x25\x72\x86\xae\xb9\xfe\xff\x88\xa8\x61\xc7\x56\x77\x92\x36\x74\x3d\xfb\x57\x24\x70\x78\xd1\xfb\xdb\x91\x34\xf4\x3f\x63\x93\xd3\x67\x3e\x40\xe3\xd4\x75\x41\xed\x3e\x37\xff\x2e\x78\x1b\xba\x06\xfe\x6f\x8a\xc3\xa1\x6b\x80\xbb\xf9\x1c\x26\xa3\xb7\xd3\x4f\xfd\x71\xfa\x57\xe4\x73\x78\x88\x25\xe0\x6f\xdd\x92\xf9\xab\xfe\xe9\x3d\x4b\xdf\x0e\x8f\x4f\x7a\xcf\xff\x8a\x0d\xc0\x8f\xe0\xff\x9e\xbc\x3a\xd9\xea\xff\x7d\xf5\xe2\xc5\x6f\xfd\xbf\xbf\xc6\x9f\xd4\xda\xc0\xb9\x78\x5b\x56\xcd\xca\x87\xfb\x1c\xfa\xef\xde\xa5\xcf\x48\x40\x84\xa6\x52\x33\xcf\xdb\xcc\xb4\xda\x61\xaa\x89\xdd\x80\x28\xa2\x06\x28\xbc\x90\x52\xeb\x42\xce\x3d\xde\xae\x6e\x02\xcb\xa8\x52\xd0\xed\x9f\x89\xa6\xa0\xbe\x05\x7c\x1a\x12\xc4\x5b\x91\xa7\xf0\x1b\x1c\x0e\x75\x05\x15\xd6\x2f\x29\xeb\xc4\x67\xb8\xe1\xf9\x85\xce\x55\xf7\x0c\x11\x18\xdd\x4f\x33\x98\x0d\xe5\x71\x03\x0b\xcf\xda\xe3\x58\xf6\xcf\x98\xe5\x0f\xcf\x96\xea\x41\xe2\x17\x85\xad\x5b\xbb\xea\x4b\xc2\x17\xbb\x12\x2b\x8c\xb1\x20\xe7\xbd\x92\x46\x75\x57\x92\xb4\x7e\xbf\x37\x7d\x3f\x98\x88\xcb\xfe\xd9\x1f\xfa\xef\xc0\x3a\x20\xfb\xe9\xdc\x19\x4a\x56\x28\xb6\x8d\xa5\x1e\x08\x69\xb2\x8e\x02\xdb\x28\xb0\x77\x7e\x65\x33\x49\xf4\xc7\xa9\x38\x1f\x4c\xce\x86\xfd\xc1\x87\xf4\x3c\x36\x2f\x26\xef\xad\x89\x62\x3f\xd8\xbf\x9a\xbe\x1f\x8d\x27\xb1\xe6\xb6\x73\x41\x15\xf2\x96\x6c\x86\xf3\x81\xb5\x56\xec\x14\xfc\xff\x62\x65\x1d\x68\xf0\xf4\x1f\xd3\x0f\x97\xc3\xfe\xf8\x73\xf2\xb8\x06\x1f\x5c\x10\x5b\xc5\xe7\x2d\x65\x6e\xff\xa7\xdf\x84\xbf\x11\x04\x6e\xef\xd9\x85\xaa\xcf\xce\xdf\xfe\xed\xf0\x1f\x9e\xbf\xf8\xe6\xf4\x55\x4b\xfe\x9f\x3e\x7f\x7e\xf2\x9b\xfc\xff\x35\xfe\x78\xce\x9a\x93\xef\xbe\x7b\x71\x7c\xfa\xfc\xe4\xa5\xb8\x2a\x34\x88\x8d\x7a\x23\xce\xc8\x05\x66\xae\xc2\x7e\xbd\x2a\xcd\xfa\x5a\x55\xe8\xfc\x2a\x59\xcd\xaf\x9f\x5d\x15\x3a\x93\xb5\xdc\xbb\x8c\xca\x92\xb5\x09\x18\x8b\x14\x60\x41\x00\x91\x92\xf7\xc8\xe9\x77\x8e\xcf\x89\x6a\x9f\x7e\xe6\xe7\x7b\x7b\x7d\xac\xc3\x82\x72\xa1\x30\xe6\xce\x5f\x27\x8a\x5f\x0e\xa7\x86\x78\x6c\x11\x17\x22\xe3\x54\x32\xc7\xae\x4b\x48\x36\x46\x55\x18\x10\xc3\x1a\x3e\x9f\x7f\x74\x29\xc9\xc4\xf5\x6f\x43\x76\x53\x51\xcb\x0d\x60\x57\x74\x68\xc9\x44\xc8\x1c\xba\xc1\x55\x71\x0d\xc1\xe9\xad\x6a\xed\x60\x02\x89\xcb\x72\xb5\xb3\xfb\x02\x5a\x22\xca\x85\xef\x1b\x23\xa2\x67\x3b\xb7\xac\x9c\x37\x2b\x55\xd4\x7e\xf9\x20\xe6\x4e\x71\xff\xdb\x6b\x59\x9b\x92\x8a\x31\x5a\x25\xdf\xda\x70\x1b\x15\x37\xcf\xae\xd7\x00\xfe\xa5\x0b\xe4\xfd\x8a\xfa\x3a\xfd\x30\xb7\x86\x07\x95\x4b\x3b\x46\xd4\x13\x84\x2f\x9e\x88\xab\xb3\xfe\x18\x6a\x2b\x94\xa9\x4d\xbb\xee\xb4\x52\x99\xae\xe1\x11\x3e\x68\xdc\x41\x8c\x9a\x2f\x24\xfe\x27\x6e\x4a\x0f\xce\xdb\x75\x1c\xca\xca\xbd\x00\xca\xc7\x08\x25\x2a\x36\x0d\x82\xb5\xcf\xed\xbe\x2e\xaf\x1d\x9e\x12\x94\x48\x14\xc1\xd1\xc1\xa3\x51\xc8\x95\x32\x38\x15\x32\x81\x68\xb8\x89\xb8\xe6\xba\x0f\x4e\x37\xce\x7c\xa5\x31\x50\x6e\x66\x37\xaa\xaa\xb5\xa1\x2a\x04\x9c\x17\x91\x71\xab\x22\x2b\x2b\x24\xfe\x5f\x57\x25\xb0\x9b\x07\x43\xa7\xd8\xe4\x6a\xa5\x2a\xac\x6d\x2b\x6a\xfb\x3b\xc6\xa1\x67\x02\x18\x8e\xfb\xae\x23\x5b\xa7\x9c\x91\x7d\x05\xeb\x15\xae\x70\x70\xd8\xc1\x12\xf2\xd7\x82\x16\x3a\xde\x0e\x5c\x13\xe6\x97\xcf\xa8\xe8\xf7\x86\x7b\x73\xe0\x3d\x58\x62\x0a\xf9\x29\x38\x0f\x90\xd2\x26\xbe\x67\x00\x45\xc0\xa2\x5d\x24\x84\xd3\xc6\xb3\xab\x16\x1b\xf1\xa3\x2e\xa8\x21\x09\xfb\xf5\x38\x28\x06\xd7\x8a\x6a\xc3\x08\x6d\x80\xca\x44\xa3\x2a\x11\xb7\xf3\x94\xbe\xd9\x3d\xb6\x66\x9d\xc9\x5a\x11\x73\x9e\xc1\xe4\x71\x1c\xcf\xae\xc4\xfe\xac\x59\x8a\x85\xfe\xa2\x4c\x6f\x1f\xcd\x28\xf6\x57\x23\x3b\xea\xcd\x67\x5a\xa4\x8b\x01\x38\xd7\xa1\x5d\xf5\xef\xd0\x8a\x8a\xe6\xe2\xcd\x28\xb6\x9c\x82\xe8\x06\x9a\x4e\xbb\x2d\x23\xb6\xb5\xe8\x3f\x3f\xbd\xef\x4f\x27\xa3\xf4\x63\x3a\x16\xe3\x74\x72\x35\x84\xf0\xce\xdb\xf1\xe8\x83\x8b\x51\x5c\x4d\xd2\xc4\x05\x2a\x2e\xc7\xa3\xb7\x83\xe9\x24\x11\x9f\xde\xa7\x10\x04\x00\x03\x4b\xf4\x21\xc8\x04\x01\xcc\xd1\xc5\x74\xdc\xb7\xb6\xdb\x45\xfa\x6e\x38\x78\x97\x42\x64\x8c\x43\x06\xd3\xd1\x78\x3a\x18\x5d\x4d\xe8\x07\x49\x3b\xd2\x02\x11\x16\xfb\x8e\x0b\x0c\x5b\x61\x68\x02\x4c\xc8\xb3\xb3\x74\x32\x49\x38\x0e\xb3\x15\x77\x0b\xce\xc1\xbf\x27\x36\x83\xde\xb3\xb3\xb3\xe3\x37\x9f\x8f\x2f\xce\x8f\x4f\xff\x5a\x41\x80\x87\xed\xbf\xd3\x57\xaf\xbe\xfd\xb6\x6d\xff\xbd\x78\xf9\x9b\xff\xff\xab\xfc\x39\xab\x14\x2a\xec\xb3\x72\xb5\xb2\x12\xae\x5f\x3b\xbf\xfa\xf8\xa2\x3c\xb7\x1a\xdd\x88\xd3\xde\x73\x71\x36\x4e\xfb\xd3\xc1\xc7\x54\x9c\x8d\x3e\x7c\x18\x5d\x4c\xc4\xd9\x68\x7c\x39\x1a\x03\x62\x14\x26\x0a\xa6\xa2\x0f\x41\xdb\xb7\x83\xf1\x07\x90\x3b\xe7\xa3\x14\xff\x9e\xa3\xf3\xc3\xf4\x5d\x7f\x48\xa1\xe2\x74\xd2\x8b\x61\xa8\xf8\x1a\x51\x4e\xc2\xff\x1a\xbe\x9c\xc2\x35\x9f\x4e\x47\xe3\x8b\xf4\xf3\xf1\xd9\x70\x60\x65\xd3\x38\x1d\xc2\xf7\x27\xef\x07\x97\xbd\xed\x11\xd2\x67\x27\xf8\xde\xc1\x05\xdc\x58\xfc\x16\x48\x8d\xfd\xfe\xe4\xd8\xca\xe4\x37\xfd\xc9\x60\xd2\xf1\xfb\x0f\xfd\x3f\xa4\x61\x06\xc4\x8a\xd8\x71\xfa\xae\x3f\x3e\xe7\xec\x44\xf8\x4e\x16\xfd\x09\xce\x9d\xc4\xe9\x04\x44\x25\xca\xe2\x20\x4e\xdc\x16\x76\x83\xe9\xc4\x8a\x96\xde\x1e\xc5\x60\xf6\xec\xdb\x3f\x8d\xc6\x7f\x10\x87\xfd\x89\x38\x4f\xdf\x62\xcc\x35\x1d\x8e\x3e\x1d\x45\x7a\xe6\xea\xe2\x3c\xc5\xac\x0c\x06\x33\x79\x15\xb7\x17\xe3\xea\xcd\x70\x70\xe6\x56\xf7\x70\xff\xec\xec\x72\xb8\x6f\x65\xd9\x3e\xfd\xdd\xfe\x11\x66\x1d\xe0\xb3\xf8\x8d\x69\x7a\x46\x39\x1c\x1f\x68\x8f\xf2\x2f\xed\xd4\x8e\x15\xed\xce\xbb\xa5\x57\x91\xe8\x7d\x6f\x37\x70\x42\xbe\xf8\xe0\x7f\x0b\xc6\x1e\x6c\x3a\x81\x94\xe1\x97\xec\x61\xc2\x71\xbc\x1f\xbc\xb1\xba\xaf\xb7\xf7\xc6\x6a\xce\x74\x7c\x86\x52\xdb\x7e\x0d\x1e\x75\xb9\x11\xf8\xa0\x5b\x9c\xf7\xe9\x98\xf3\x17\x67\x90\x72\x02\xed\xfb\x6e\x9c\x42\x00\xe0\x4d\x2a\xde\x8c\xae\x2e\x60\x7a\xdb\x0b\x48\x23\xea\x51\x00\xdb\xfe\xc7\x68\x2c\xde\xd9\x73\x30\x81\x57\xda\xbf\xa7\x8f\x5b\xa5\x83\x51\x71\x4c\x9b\x81\x0a\x99\x0c\xce\x53\xba\x1e\xa3\xb7\xf6\x17\x63\x1a\x05\x2b\x0d\x08\x49\x77\x85\xa0\x19\x83\xe7\x5c\x2d\x74\x81\xa9\x42\xee\x98\xeb\x89\xfd\x33\xdf\xc8\xff\xa9\xac\x7e\xf4\x98\x62\xd8\x6c\x8d\x38\x46\xd0\x62\x0c\x30\xc3\x50\xb8\x00\x75\x84\xd6\x4b\xa8\xaf\xcb\xbc\x5c\x42\xcd\x98\x2a\xe6\x9b\x39\x38\x64\x5a\x42\x8f\xb6\xef\x20\xb0\xef\xc5\x9e\x48\xf6\x04\x90\xdd\x37\x20\xbb\xb0\x56\x56\x12\x02\xd7\xc8\x20\x61\x4d\x45\x52\x61\x11\x4f\xe2\x11\x93\xa0\x8e\x9f\xd1\x29\x10\x08\xd7\xa3\x66\x74\x02\x65\x00\x8c\x9f\x31\x6a\x35\xcb\xb1\x0c\xa4\x0c\x20\xd4\x6e\x14\x43\x7e\xf4\x85\x6f\x38\xf1\xf8\x4c\x76\x29\x5a\x6b\xe6\xab\xc6\x67\x2a\x84\xef\x90\xe2\xdc\xbb\x30\xf0\xe0\xa1\x34\x22\xb3\xdb\x60\xdd\x56\x95\x97\xb7\x1e\xd9\x99\x3c\xa9\x6e\xdc\x12\x21\xc4\xac\x27\xf6\x5b\xaf\x8b\xf7\x8a\x0a\x7e\x9b\x35\xb9\x99\xf0\xc1\xb2\x6a\xfd\x05\xe0\x54\x51\x35\x98\x3a\x56\x5f\xb0\xc6\x00\xd7\x29\xdc\xed\x00\x57\x2c\x11\xab\x86\xb0\x80\x2a\xa8\x97\xb2\x4e\x57\x22\xb2\x4a\xae\x64\xad\xff\x23\x3d\xb3\xc0\xb2\x5b\x99\xbb\xbf\x59\x95\x08\x27\xa7\x91\x76\xca\x15\x4c\x98\xb2\x81\xf6\x5d\xe2\x99\xb6\xfb\x51\xbb\xee\x1b\x02\x0c\x9f\x55\x1a\xeb\x60\xb1\x56\x55\x15\x86\x5e\x1a\x55\xbb\x42\x77\xd0\xf6\x51\x23\x54\xbf\x4a\xcd\x11\xed\x11\xa0\x8b\xca\x6a\xa5\x32\xfc\x7d\x26\xd7\x75\x1b\xd5\x57\x7e\xfd\xcd\x6e\xed\xec\x76\x29\xeb\x5b\x7a\x40\xde\x94\x3a\x63\x1f\x23\x2b\x9b\x59\x9d\x04\x2c\xc3\x78\x7b\xec\x48\x78\x1b\xa0\xe9\xc6\xe8\x9a\x2a\x28\xb6\xd6\x13\xdc\xe8\x4d\x31\xbf\xae\xca\x82\x76\x83\xbd\x6b\xbe\x8a\xb5\x5e\xa9\xec\xb8\x52\x84\x1c\xe7\xfa\x10\x6f\x00\xcb\x61\x05\x8d\xaa\xfb\xf0\x0e\x5d\x2c\xf7\x8f\x5c\x59\xcc\x5f\x34\x61\xee\x1b\xec\x89\xfd\x21\x15\x8e\xef\x07\x60\x72\xba\xc8\xf4\x8d\xce\x1a\x99\xa3\x3c\x01\xdf\x13\x36\x04\x7a\xe5\x8c\x9f\xc0\x53\xa0\x7e\x84\x10\x59\x4f\xec\x8f\xb8\xa8\xab\x0f\x25\x0f\x8f\x7e\xef\xf6\xba\x24\x58\x85\xcc\x7d\xcf\x75\xd6\xf5\xc4\x7e\x78\xef\xa2\x0e\x69\xa8\x2a\x65\xe0\x09\xac\xaf\x30\xd7\x7a\x8d\x63\x7f\x08\x57\x32\x1e\xf3\xa2\x27\xf6\x3f\x97\x8d\xbb\xda\x45\xf7\x30\xa9\x90\xdd\xee\xd6\xce\xfe\x18\xea\x86\x41\x77\x9a\xa1\x83\x81\x1b\xa4\xcc\xdd\xfc\x3a\x07\xc3\xde\xb1\xf5\xf8\x5d\xe1\xd3\x27\xd0\x07\x65\xe5\x5e\xeb\x7a\x6c\xa8\xb7\x28\x8c\x07\x04\xc0\x47\xbe\x43\xc0\x55\xdf\xef\x1e\x72\xa6\xcc\x5a\x03\xb2\x99\xc3\x3a\xc6\xe1\x72\x61\xca\x69\x4f\xbc\x95\xba\x82\xae\xdd\x31\xbc\xa6\x27\x2e\xa8\xff\x45\xc7\xc4\x2d\xed\x72\xc6\x4a\x65\xcd\x1c\xda\x12\x56\xba\x4e\x42\xce\x00\x10\x29\x34\x28\x59\xe1\xb2\xc2\x0c\x16\x12\xe1\x5a\xad\x78\xab\x4c\x2d\x8c\xcc\x95\x08\x40\x83\xb8\x20\xce\xc5\xf6\x88\x7c\xfc\xc6\xcd\xd1\x91\xf8\x72\x60\xb4\xbc\x2d\x54\xd5\x05\x44\x19\x00\x96\x62\x31\x29\x74\xa2\xcb\x5b\xc3\x28\x31\xbc\x46\xef\x2a\x59\xd4\x3d\x31\x89\x3a\x26\xba\xcb\xae\xb6\x2a\xef\xdd\x76\x84\xb9\x37\x83\x0d\x0f\xf6\xf4\xe6\xd9\xad\xce\x54\x12\x15\x99\x27\xa2\x28\x8b\x63\x37\xb3\xc4\xee\xf3\x5a\xd5\xf6\x40\x1e\xf2\x95\xcf\x9a\x2a\x92\x33\xc1\x14\xdc\x24\x8f\x42\xbe\x8f\x6d\xfc\x21\x47\xf8\xf0\x89\xb0\xb7\x80\xd2\x9d\xf4\xe4\xf7\xde\x62\x81\x9d\xe4\x2e\x70\x7f\x30\x5b\x35\x56\x81\xb0\xab\x09\x35\x80\x48\x81\x5b\xf2\x9c\x18\x81\x3b\xdf\x0a\x75\x8e\x21\x79\x26\x8d\xb0\xfd\x8a\xd7\x5e\x47\xc7\xd9\x3d\x0e\x6d\x56\x62\x7d\x5d\x16\x25\xca\x68\xbb\x2d\x89\x23\x85\xe6\x84\x5b\xc2\xc1\xa6\xe0\x6f\x82\x10\x94\x4f\xcc\xcd\x36\x24\x1b\xa0\x6b\x24\xd3\x4b\x5d\x5b\xd5\xdc\x64\xba\x44\x55\xe7\x7a\xbe\xfc\x12\x70\x3d\x69\xc7\x7c\xda\x73\x09\xa4\xf4\xd3\xf4\xd3\xed\x43\xfa\x29\x60\x22\xd1\x3d\x71\x19\x84\xd3\xc6\x70\xc2\xec\xea\x5c\xc1\x5d\x78\x93\xcb\xe2\x47\x55\xf3\x51\x35\x3d\x7f\x56\x6f\xa5\xbe\x71\xed\xa4\xd1\xfd\xc2\xca\x75\x98\x80\x4f\xd3\x7a\x81\x89\xdd\x0c\x37\x5a\xa2\xf9\xea\xbe\x4d\xe7\xcd\x94\x73\x6d\x4d\x51\x40\x9a\x17\xfd\xc9\x59\xff\x32\x11\x6f\x3e\x0c\x12\x31\x49\x27\xfd\xb3\x23\xbe\x06\x9a\xc0\xa8\x51\xb7\x41\xb1\x69\x14\x18\xe4\x18\xab\xdb\x8c\xf0\x5f\xf1\xe5\xb7\x6a\x66\x8d\x91\xa3\x50\x0f\x07\x6c\x15\x5a\xf7\xc4\x07\xc4\x0d\xb0\x0b\x38\x26\x51\x54\x64\x62\x52\xcb\xba\xa9\xcb\x6a\xe3\x17\xec\x6b\xaf\x0c\x6c\x5b\x7b\x4d\x00\x48\xc5\xf5\xac\xcb\xa5\x35\xa6\x71\x2a\xef\x01\x1d\xf0\x6d\xf9\x45\xf4\x97\xd6\xe8\xdf\x5a\x26\x08\x28\xfb\xe3\x8e\x24\x23\xa0\x52\xbd\x5a\x40\x6b\x78\x1f\x10\x4f\x5c\x81\xe9\x51\x2b\x6f\x91\xb4\xba\xc2\x90\xef\x3d\x37\x25\x34\xfc\xa2\x28\x61\x5d\x3d\xdb\x88\x93\x6f\xc5\xd5\xe4\xcc\x43\x2e\x9e\x7c\xc3\xab\x7d\x35\x11\x3e\x33\xd5\x9f\xd7\xd0\x28\x07\x8b\xe6\xdb\xef\x5d\x33\xc6\x0f\x4d\xa5\x0d\xf5\x00\x9b\xa3\xc0\x96\xf8\x84\x7b\x68\xef\xd1\x63\x1b\xf4\x73\x2d\xbb\x2d\x13\xee\xaf\x76\xf6\x8f\x3b\xcf\xfe\xc4\x7e\x3f\x25\x54\xce\x87\xce\xfd\xcf\x3b\xe1\x7f\xe9\x06\xbe\xfc\x5a\x1b\xc8\x48\xd6\x08\xa8\x40\x4b\x40\x6e\x02\x6b\xa2\x8c\xf3\x51\x2b\xeb\xc2\x12\x2b\x7c\xb5\x92\xb5\x71\xab\x5b\x94\xb7\xe2\xc7\xa2\xbc\x05\xb3\xdb\x6e\x23\xd2\xd7\x64\x58\xb2\xde\xdb\xfe\x44\x88\xa5\xe3\x36\x8d\x80\xe2\xb7\x60\x44\x25\xd6\xa9\xd4\x6a\x7e\x5d\x50\x13\xa6\x23\xb5\x7f\x40\x65\xe2\xa4\xb7\x06\x8d\x85\xe9\xbe\x87\x3b\xe8\x22\x0e\xd0\x03\x61\x2c\x2d\x3b\xde\xf4\x44\x3f\xcf\xf9\x21\xec\xd1\xe3\xe6\x71\xce\x54\xce\x36\xfe\x88\xda\x41\x93\x39\x41\xac\x80\x19\x03\x66\x8d\x83\x7e\xcc\x5e\x44\x43\xc5\x2f\xd2\x85\xdb\xef\x17\xb4\x76\x3a\xec\x56\x87\x46\x9e\xe0\x14\xd9\x19\x72\x63\x23\x25\x7e\x7d\xfe\x35\x6c\xff\x0c\x2c\x86\x6d\x76\xee\xc4\xab\x53\xd2\xc3\xc1\xdf\xd0\xd9\x4e\xbc\x60\x87\xc7\xe0\xe0\xfb\x7f\x0e\x7c\xec\x22\xdf\x3c\x66\xde\xa3\x2e\xff\xdc\xc6\x58\x72\xf0\x1b\x89\xa0\x03\x7d\x55\x68\x78\xbb\xab\x05\x1f\x10\xea\x28\xba\xbb\x49\x87\x9d\x1e\x12\xb7\x45\x86\x46\xe4\xf4\x7d\x8e\x70\x07\xbe\xc2\x02\xc4\xcd\xb8\x08\x67\x52\x56\x61\x57\x2e\xad\x44\x60\x89\xa0\xab\x9d\xd7\xf8\xa8\x33\xbf\x77\x3b\x22\xb4\x2a\x3f\xb3\x87\x17\x36\x23\x1e\x9f\x47\x2c\xf0\xfa\xd7\xef\x47\x1b\xb2\xf9\xe7\xc1\x35\x77\x02\x41\x83\x1e\xf8\xdc\xd9\x14\xfa\x55\x4f\x9f\xcb\x36\x82\xdc\x28\xf3\x72\x09\x26\xc4\x4a\x49\xd3\x54\xca\x04\xbd\xb9\x65\xce\x18\x33\x71\x8b\x15\xc7\x04\xa4\x58\xc9\x02\x68\x2a\x8b\xa0\xb3\x6d\x9b\x9f\xbd\xee\x64\x72\x08\xa5\x5f\x8b\x4f\x6b\x97\x29\xbd\x15\x5b\x41\x99\x15\x73\x41\x11\x48\x42\x97\xdd\x2d\x24\xa0\xae\xc6\x46\x05\xe1\x90\x60\x53\x5a\x5b\x7a\xec\x76\xbf\xc5\x60\x11\x1a\x2a\x1d\x43\x83\x38\x1a\xc3\xa0\x01\xaa\x4f\x11\x08\x41\x3e\x4a\x89\x43\x8e\xfd\x02\xcb\x47\x4d\x8a\xd6\x13\x4a\x98\x42\xc8\x0d\x78\x6b\x3e\xd6\x0d\x75\x60\x69\x75\x89\x5a\xc2\x7d\x83\x2e\x43\x2b\xa4\x91\x30\xbb\x95\x32\xb5\xa7\xc8\x9d\xf5\xb6\x79\xa7\xbe\xae\xd4\xab\x3a\x3c\xa9\x9d\x17\x6a\xbb\x24\x93\x0d\x0b\x17\x95\x74\xe0\x4f\xad\xf9\x71\xcd\x86\x83\x48\xf6\x8c\x56\x08\xc1\x6a\x1d\x3b\x70\x88\xb8\x6d\x1f\x50\x7e\xfe\xa3\x55\x08\xd0\xf1\x57\xdc\x28\x07\xc2\x50\xc8\x15\xc2\x24\xac\x8d\x6a\xb2\xb2\xd8\xac\xa0\xe9\xda\x79\xab\xce\x7c\x69\x0f\x42\x2f\x10\x7c\x4f\xab\xec\x35\x1e\x23\x5d\xe7\xad\x2b\x14\x3e\x12\x88\x07\x3a\x09\x01\xc4\x73\x74\x28\x1e\x91\xfa\xd8\x15\x5e\x6c\x12\xbc\xc9\xee\x30\xf8\x1e\x2f\xea\xbf\x34\xd6\xa4\x83\xab\xe5\xae\x2c\x1d\x5c\x2a\xdf\xb0\x67\xe9\x6a\x3c\x08\xaf\xd6\x22\x06\xe0\x8b\xa0\xfe\x4a\x46\x3e\xc1\xd0\x8a\x27\x53\x0b\x77\x8e\x5a\xe8\x68\x8b\xc8\xa2\x0a\xdb\x76\xa9\x26\x25\xd8\x3c\x14\x32\xaf\x5d\x99\x50\x50\xd0\x42\x95\x33\x38\x1e\x69\x08\x18\x61\xeb\x26\x42\xb8\x76\xa5\x0b\xbd\x6a\x88\x68\x81\xbe\x8f\x60\x32\x50\x5d\x44\x66\xb6\x8f\x15\x43\x5b\x54\x05\x23\x08\xa2\x73\xf4\x43\xae\x48\x22\x1e\x3d\x27\x09\x1d\x52\x99\x34\x01\x50\x24\x83\xbe\x3c\xfe\x62\x86\xf7\x19\x2b\x6a\x1b\x64\x0c\x81\x4f\x4e\x49\xc0\x37\xcf\x9d\x06\xb1\x3f\xa0\x46\x16\xdf\xcb\xf4\xe1\x6a\x7a\xd5\x1f\x0e\x3f\x07\xdd\x2b\x94\x64\xe2\x36\x09\xdf\xcc\x92\xf8\xec\xd2\xe8\xed\xdb\x74\x3c\xf1\x89\x2c\xc8\x4f\x22\x3f\x0f\xa7\x22\xc7\xe9\xe5\x38\x9d\xa4\x17\x53\x4c\x7c\x8a\xd1\xb8\x55\x00\xc2\xdd\x4c\xe2\x6c\x74\x71\x96\x8e\x2f\x38\x55\xf9\xa1\x3f\x4d\xc7\x83\xfe\x70\x92\x70\xed\x49\xe2\x7b\x9b\x26\xd3\xfe\xf4\x6a\x3a\x1a\x7f\x76\xa5\x12\x76\x1a\x51\x19\x0a\x17\x03\x43\x19\x4a\x1f\xab\x27\xe2\x2f\x4f\x07\xd3\x61\x9a\xb8\x0a\x14\x6a\xbe\x48\x1e\x2d\x3f\x49\xc4\xc5\xe8\x62\x70\xf1\x76\x3c\xb8\x78\x97\x7e\x48\x2f\xa6\x89\xa0\x46\xb3\xfe\x9b\x49\x4a\xc9\xb2\x61\x1f\xfa\xca\x5c\xe2\x11\xfb\x93\x26\x89\xc0\x26\x95\xb3\xcf\xee\x47\xb8\x3e\xf8\xab\xe0\x05\xe9\x78\x3c\x1a\x07\x85\x23\xa3\x31\x24\x97\xcf\x07\x93\xb3\xd1\xc7\x74\xdc\x7f\x33\x4c\x7b\x62\x32\xfa\x90\x8a\x7f\xb8\x1a\x0f\x26\xe7\x83\x33\x5c\xe0\xf3\x11\xa6\xb6\x87\xc3\xd1\x27\xea\x70\x3b\x1b\x5e\x4d\x28\xad\xd7\x55\xbb\x33\x19\x61\x6a\xcf\x3f\xf8\xa1\xff\x19\x5f\x72\x79\x39\xfc\x4c\x5d\x43\x8c\x2f\x34\xf4\x4d\xba\x65\x21\x86\x5a\xce\x00\xf1\xcc\x75\xc9\xc5\x7d\x75\xbb\x7b\xa5\x92\xa8\x6a\x07\x1a\xa4\xdc\xb9\xda\xea\x58\x1a\x61\x59\x32\xe6\xe3\xa7\xef\x53\xbb\xf3\x1d\xb5\x3c\xbe\xf8\x39\xaa\xe5\x49\xc4\xe5\xd5\xc5\x00\xb2\xcb\xa3\xb1\x2f\x87\xde\xdd\xbe\x14\x27\x78\xa3\x0a\x68\x3c\xe9\xbe\xd3\xc7\x8d\xf9\x17\xf5\xf5\x20\x10\xcf\x94\x60\x9f\x74\x59\x78\x9f\x62\xba\x65\x0b\x3e\x60\x8a\xa2\x60\xf2\xb8\x56\x31\xd2\x0e\x18\x16\x56\x50\xcd\x2a\x80\x9d\x9d\x6d\x40\x93\x91\x6a\xd9\x65\xae\x38\x47\xdf\xb8\xb4\x40\x37\x02\x56\x5b\x4b\xa3\xf9\xf1\xb9\x13\xff\x2a\x90\xc5\x4f\x45\xc2\x72\xd5\x9e\x20\x12\xf5\x8e\x61\xed\xc4\xc5\x62\x65\x65\x7d\x86\xdc\x85\xfe\x3c\x06\x6a\x22\x4e\x13\xf1\x4d\x22\x5e\x25\xe2\x5b\x74\xa2\x7e\x87\x43\x33\x4d\x75\x63\xe7\xc4\x8e\x06\xed\xd0\x03\xe9\xd3\x56\xc0\x1c\x4d\xd5\xae\xb0\x79\x42\xed\xee\xb1\xa7\x0a\xfa\x04\x5b\xed\x7f\x49\xf4\x3b\x8c\x6e\x1f\x41\xce\xc2\xce\x9c\x8b\x83\xfd\x88\x82\xd8\x4f\x37\xc7\x7e\xd8\x98\x11\x64\xc3\xb0\xfd\x3c\x44\x8e\xa1\x93\x03\x1a\xde\xd4\xe5\x7a\x1b\x59\x0b\x6d\x2f\x4c\x7f\xd4\x7a\xa5\x3a\x94\x32\xb9\x6c\x8c\x04\xa2\x98\x66\xcc\x1d\x0f\x18\x22\x00\xcc\xeb\xfa\x3a\xab\xe4\x6d\xec\x1f\x1c\x46\x09\xdb\x88\x9b\x92\xa9\xc1\xc0\xe4\xd4\x26\x82\x43\x9b\xa9\xc4\x2d\xfc\x23\xae\xf5\x51\xd2\x81\x35\xa3\xe1\x90\x15\xb5\x2e\x1a\xe5\x4e\x1d\xa0\xbf\x20\x67\xc3\x62\x61\x4f\x02\x23\x19\xfa\xd3\xec\xd3\x0e\xb0\x19\x8c\xda\xf4\x41\x9b\xb9\xca\x73\xc4\x12\xf2\x42\xc0\x43\x74\xc5\xde\xf5\x13\x6d\xe8\x24\xce\x90\x71\x96\xb3\x8c\x5d\xde\xa0\x6b\x3d\xf4\xa7\xc8\xad\x06\xfc\xcf\xce\xdc\x8f\x34\x9d\xc7\xb8\x2e\x77\xdc\xfd\xd8\x73\xa0\xaa\x60\xac\x5b\xdd\xf2\xfa\x20\xb3\xf6\x30\xb2\x4e\x94\xc3\x02\xd6\x0b\x2c\x9c\x87\x7a\x67\x5c\x7e\x3b\x3c\x8f\x37\xc3\xd0\x5a\x8a\x54\x96\xc7\x10\xb1\xa2\x23\xf3\xcc\xc5\x0f\x04\x58\x1c\x27\x38\xe1\x81\x21\x4e\x1d\x07\x8a\x18\x9c\x8b\x5d\x79\x07\x67\x45\x85\x0f\x7e\xbe\x38\x54\xa8\x21\xc0\xc2\x01\xe7\x72\x90\xd5\x49\x36\x7d\x14\x9f\xf3\x71\x3d\xff\x22\x5c\x23\x38\x72\x7e\x89\x82\x14\xcb\x45\x89\x7c\x6c\x58\x8f\xbd\x63\xb5\xdd\x68\x32\x3b\xdc\x0c\x63\xc2\xf8\xd6\xa2\x64\xad\x01\xe8\x2b\xae\x8f\x2e\x30\xf9\xe1\xe9\x8a\x50\x27\x00\xba\xc2\xbd\x4f\x17\x8e\x04\x0c\x6a\xeb\x11\x5b\x30\x58\xad\x0d\x39\x17\x08\xa7\x4b\x9e\x45\xf7\x5b\x83\x40\x79\xa4\x1b\xc3\x62\x8a\xda\x33\xaa\x78\x28\xb1\x99\xaa\x6f\x95\x2a\xa2\x1d\xda\x95\x7f\xf6\x7c\x40\x56\x1a\x13\x8c\x20\x41\xb5\xb5\xba\x2d\x02\xb4\x32\x23\x08\xde\x35\x30\xc1\x77\x7f\xc2\x03\x46\x68\xf7\x1d\xef\x75\xb9\x33\x3c\x53\x62\x06\x51\xfb\xd9\x86\xaa\xee\xf1\xe2\xc9\xdc\xef\x24\x45\x5f\x00\x08\x06\xbd\x12\x72\x87\xe6\xe5\x6a\xd5\x14\x0c\x18\xc4\x0a\xb9\xb5\x72\x41\x79\xbf\xe7\x25\xa2\x03\x0e\x67\xb1\x01\x2d\xc4\xd5\xf8\x01\x38\xdb\x22\x16\x2c\x14\x7a\xec\xed\x6d\x95\x67\x3a\xf2\x0c\xb7\xd9\xdb\x77\xca\x1e\x6b\xa0\x22\x71\x64\x5e\xbe\xd9\x03\xc0\x77\xca\xa2\x70\x4a\x21\x70\x3c\x7b\x62\xeb\x73\x61\xe9\x4c\xae\xd9\x95\x07\x63\xc7\x63\x71\x6d\x04\x99\x43\xb9\x5a\x4a\xa0\xa2\x29\x11\xe8\x96\xa0\x7c\x57\x12\xf0\xd5\x83\x86\x93\x00\x86\x7d\x9b\xf5\xd0\xfe\x68\x89\x48\x31\x09\x83\xf6\xc2\x4f\x80\xce\x09\x8b\x2a\x1c\x72\x51\xad\x65\xee\x3e\xc1\x95\x00\xf1\x1c\x79\x8d\x72\xb6\xc4\xba\x34\xf9\xa2\xac\xd4\xb2\x84\xff\xba\x2d\xc5\xe1\xe9\x11\xa0\x26\xab\x02\xb0\x86\xf4\x62\x7b\x65\xae\x23\x88\x56\x66\x9a\x02\xa0\x4f\x84\xd5\x35\xf1\x96\x3a\xd3\x32\x90\xac\x84\xd2\xec\x22\xf7\x50\xea\x15\x74\x24\x95\x0b\xf7\xfb\xde\x5e\x8a\xb5\x4f\x6c\xc1\x70\x48\x3d\x28\xdd\x21\xb8\x4c\x82\xa0\x0a\x72\x40\xae\xa3\x86\xf3\x57\xee\x52\x7a\x4d\x7d\x76\x76\x39\x4c\x44\x41\xb0\x2f\xb8\xad\xb0\xfb\x4c\xf8\x55\x57\x32\x53\x2b\x59\xfd\x28\xf6\xdb\x8b\xb1\xcf\xa7\x01\xca\x93\xac\x40\x73\xcf\x96\x95\xc8\xcb\x65\x69\x87\xd7\x71\xb8\xfc\xd5\x58\x57\x9a\x08\x0e\xed\xcd\x60\xb9\xd7\xf1\x2b\x44\xbc\xf5\xe8\x49\x0d\x1b\x0f\x28\x1d\xdb\x76\x6a\xfb\xe7\x07\xf6\x6b\xc5\xf1\xbc\xa9\xc0\xf2\xf2\x03\x6d\x80\xf4\x7e\xd9\xe8\x4c\xe5\xba\x80\xa2\x43\x97\x70\xf2\x58\x32\x25\xd6\x44\xde\xaa\x99\xd1\xb5\x8a\x40\x15\x31\x74\xe9\x49\xdc\xc1\x49\xa0\x28\x5f\x07\x92\xd1\xf6\xd5\xa6\x8f\x11\x1b\x3e\x32\xa8\x5d\xd7\xf5\x5a\x18\xf1\xfd\xb3\x67\x73\x7a\x7c\x4e\xcb\x50\x56\xcb\x67\x5f\xa1\xd1\xa0\xf7\x2c\xb3\x62\x76\x6e\xb7\xed\xff\x1c\xbe\xbb\x1c\xfe\x15\xda\x00\x1e\xae\xff\x7f\xf5\xfc\xe5\xcb\xe7\xad\xfa\xff\x97\x27\x2f\xbf\xfd\xad\xfe\xff\xd7\xf8\xf3\xee\xe2\x4a\x0c\x07\x6f\xc6\xd6\x7d\x27\xac\x92\x56\xa5\xf8\xde\x47\x6a\x21\x3f\x4d\xc4\x3f\x34\x85\x12\x27\xdf\x7d\x77\xb2\xe7\x93\xbb\x87\x67\x47\xf0\x57\x3b\x01\x96\x12\x31\x28\xe6\xbd\xbd\x6f\xec\x13\xb2\xf8\x31\xd7\x85\x98\xd4\x89\x78\xab\x17\xf5\xb5\x78\x9b\x97\x65\x95\x88\x37\xa5\xa9\xed\x93\x1f\xfa\xe2\xf9\xe9\xc9\xc9\xf3\xe3\x93\x17\xcf\x4f\x12\x71\x35\xe9\xef\xa5\x37\xaa\xda\x94\x85\x8a\x41\xd3\x18\x74\xff\x29\xcc\xa4\x41\x81\x19\x77\x20\x62\xde\x02\xb2\xe7\xc4\x85\xc5\x8a\x35\xcf\xcb\x5b\x95\xf5\xf6\xfe\xf7\x29\xb5\xfb\x81\x76\x80\x5a\x32\xf2\xe3\xb6\x48\x1f\x10\xca\x7c\x23\xde\x5d\x0e\x7b\x8c\x03\x09\xa5\xd0\x2a\x13\xa7\x22\xe0\x6b\x5a\x96\x6c\x29\xf1\x1b\x4e\x1d\xa2\x7b\x95\x21\x1c\x80\x7d\xc9\xff\xf1\x18\xbf\xba\xeb\x68\xfb\xba\x1c\xeb\x4a\xd8\xe3\xd0\x8d\xd2\xc6\x60\x55\xbf\x9c\x77\x9d\x07\xdd\xc1\xbd\xee\xe6\xa3\x4d\x4c\xbf\x4e\x64\x3b\x8e\x7c\x3d\x8f\xc8\xd7\x79\xdd\x3b\x07\xfc\x44\x92\xf5\x9d\x10\x77\x71\xf7\x2d\x91\x65\xb3\x53\xcc\xd8\xf5\x08\xef\x45\x51\x64\xc6\x85\xc4\x86\x5f\x58\xe0\xcf\x08\x7c\x4b\xff\x0d\xd3\x82\xc5\x72\x6f\x48\x44\x5d\x96\xbd\xbd\x4f\xd7\xaa\x10\xb7\x30\x44\x09\xf5\xa8\xd1\x8a\x25\xf6\x9f\x10\x11\x83\x09\x5d\xeb\x92\x17\x3c\xa1\x6a\x51\x3d\x57\x3d\x31\x6a\x76\xa1\xec\x99\xad\xb3\x12\x6e\x41\x48\x1b\x51\x13\xe4\x27\x6d\x66\x47\x71\x5c\x6b\x78\xe2\x90\xb6\xba\x72\x1c\x50\x00\x51\x59\xdd\xe8\xb9\x62\x6c\xf1\x5b\x6d\xae\x8f\x12\xff\x29\x06\xb3\x0d\x58\x67\xc0\xb0\x93\x85\x58\x2a\xa0\x8e\xe1\x1f\x4a\xe0\x2a\x08\x7e\x6a\x9f\xa1\x83\x15\x1d\x1e\x4a\x92\xae\xb5\xf5\xf1\xc0\x20\x82\x18\x4e\xa1\x6e\x63\x50\xb6\xd7\x9e\xe8\xc9\xbe\xee\xc7\xa2\xbc\x75\xef\xcd\x1c\x9a\x35\x30\x15\xf5\xf6\xa6\x25\xe3\xa3\x86\xe0\xf6\xb0\x23\xc0\x0e\xc1\x0b\x19\x01\x59\xc3\xbb\x17\x65\x35\x03\x57\x12\xa4\x17\xc0\x86\x16\x88\xbf\x8b\x5f\xf0\x44\x91\x84\xea\x46\x90\xb0\x06\x6c\x13\xb6\xcb\x2a\x2a\x99\x65\x22\xd4\xf0\x2b\xcc\x45\x0e\xd2\x90\x10\x35\x1d\xfa\xb5\x75\xc9\xb9\x1e\x08\xc0\xd4\xdb\xc9\xc5\x56\x1b\x37\x49\x31\x8c\xed\xe0\xb3\x84\xe8\xa2\xeb\xde\x5e\x1b\xf5\xf8\x69\xaf\xe2\x32\x9c\x65\x25\x6b\x6d\x1c\xf8\xb5\x58\xa8\x10\xc1\xc4\xe5\x11\x7d\xd1\x80\xa3\x61\xe6\xc2\x17\x60\xe4\x51\x62\x69\x0f\xe8\xc6\x3a\x5e\x2e\x71\xd9\x3a\xc6\xf5\xb5\xda\xc0\xa5\x4a\xdc\x11\x0b\x8e\x15\x9e\x17\x77\xe2\x5c\xca\x15\x80\xcf\x3d\xf9\xb7\x73\x8b\xdc\x4c\x3c\xdc\x0a\x35\x0f\x3b\x1e\x26\x62\x52\x42\x36\xdd\x76\x28\xc8\x84\x44\x4a\x1b\x18\x46\xa5\xe0\x63\xc0\x48\xb1\xfd\x1d\xac\x4f\x22\x0a\x76\xa6\xa6\xa2\xb7\xb2\x9e\x91\x54\x79\xb6\x5a\xeb\x1c\xb5\x97\x35\x8a\x33\x3f\x46\x73\x5d\xde\xe2\x07\x42\x64\x76\x18\x89\xda\xe0\x79\xc7\xf0\x30\x1d\xae\x3d\x2b\x36\x56\xaa\xbe\x2e\xb3\x16\x1e\x70\xc8\xe7\x00\xf0\xc1\xb7\xa5\x30\xb5\x5a\x9b\xef\xc5\xe1\xc9\x51\x10\x2b\x8d\x27\x51\x64\xe0\x42\x61\x89\x09\x9e\xf8\x40\x09\x63\xf3\xc7\x12\xca\xe4\x60\xf1\xc1\x6d\x8c\xb9\x0f\xda\xd8\xf4\xdc\x53\x1f\x80\xd2\xd3\xe7\x7a\x7b\xc8\x39\x06\x50\xef\x72\x7e\xed\x7f\x54\x56\x07\x26\xe0\xb1\x86\x3b\x0b\xd2\x84\xef\x2c\xdf\x19\xd8\x20\xc5\x76\xc6\x56\xb3\x7b\xcd\x81\xe4\xd0\xa5\x76\x72\x0e\x44\x0b\x8f\x85\xc1\x2d\x79\xab\x74\xc0\xd3\x3c\xdb\x80\x1a\xb2\x9f\x00\xde\x07\xa8\x15\x96\x06\x61\xdc\xfd\xe0\xac\xca\x0b\xce\x4f\x5d\xf2\x86\xd9\x1b\xe0\x4e\x12\x48\xea\x00\x70\xda\x41\xe1\x06\x4d\x3b\x3e\x12\xec\x90\x4c\x75\x51\x63\xc5\x34\x0c\x07\xb4\x59\xe0\xe4\x57\x6a\x91\xdb\xb3\x4c\x91\x4a\xf7\x4e\xd2\x6f\x07\xa2\x52\xeb\xa6\x66\x62\xbe\xb7\xf6\xdf\xb0\xe8\x79\x13\x09\x58\xb4\x9a\xa0\x2c\xa3\x00\x42\x8f\xc2\xae\x66\x8d\x95\xd0\x4e\x5a\x13\xcc\x6f\x4f\x7c\x52\x0e\x73\x13\xaa\x2f\x31\x40\x6f\x4f\x7e\xe5\x29\x6b\x90\x9f\x26\x8a\x87\xc7\x3a\x08\x26\x11\x17\x53\x02\xbc\x41\x0b\x9d\xdd\x10\xbb\xb8\x2e\x38\xa4\xec\x9a\x8d\x1c\x8d\x10\xcf\xa2\x40\xac\x00\x47\x59\xc3\xdf\xea\x09\x50\x0a\xea\x86\x79\x95\x60\xf3\x3c\x8a\xb5\xae\x09\x78\xd9\xaf\x3f\x8e\x81\x29\xe4\x9c\xfb\x0d\x67\x96\xce\xdd\x01\x1d\xa5\x06\x8b\xa8\x90\x0f\xc0\x73\x69\xcb\x3c\xef\xed\x7d\xb0\xc6\x9f\xb5\xd1\xbc\x65\xe0\x43\x29\x60\xe3\x04\x86\x85\x36\x31\x3f\x61\x68\x64\xee\x34\xf3\x12\xba\x9d\xb7\x32\x20\xa3\xb5\xc3\x6c\x13\x31\x51\xe8\x2b\x32\xc8\xc0\x99\x78\xba\x51\xc6\xd7\x2f\xb0\xc6\xdc\xf0\xe3\xd7\xdb\xb9\xfc\xd4\x58\x8f\xdb\x27\x4d\x02\x6e\x0b\x9a\x55\x59\xa8\xd7\x80\x04\x0c\xca\xa0\x04\xa6\x5b\xb2\x01\x16\x4d\x4e\x44\x4a\x59\x59\x1c\xd4\x42\x1a\xd3\xac\x94\xdb\x20\xd7\x8d\x82\x8e\x80\x0b\xd3\x4b\xd7\xe2\xe0\x3e\xc2\x51\x24\xb0\xcc\x89\xbc\x81\x77\x5f\xfa\xb6\xc6\x16\xf2\xf9\x02\xba\xbe\xc2\xfd\xc1\xef\xf0\x75\x9e\xe5\x4d\xc5\x95\x69\xb5\x2e\x28\x38\x67\x0f\x03\x9e\x65\x10\x57\x1c\x77\x8d\xc8\x57\x64\x96\x91\x3d\xe8\xd5\x17\x86\x86\x57\xeb\x7c\x23\x1a\xc3\x1a\x62\xa8\x8b\x1f\x91\xfc\x36\xd2\x72\x32\xd0\xd6\x14\x8f\x71\x6e\x51\x24\xd4\x21\x83\x40\x86\x34\x06\xb9\xc3\x2f\x6c\xc9\x7f\x6d\x84\x2c\x64\x5e\x2e\x4b\x64\xdf\xae\x9a\x82\xb8\x77\x5b\x27\x09\x26\x11\x80\xb1\xd3\x5f\x07\x6c\x39\x50\xdf\x51\xab\x2f\x10\x3c\x85\x72\x52\x50\x18\xc6\x1f\x3c\xe2\x2c\x0e\x88\xaf\x34\xb2\x3d\x00\x93\x6b\x46\x9d\xb1\x5d\xac\xb5\x01\x31\x4a\x30\xf8\xf8\xb2\x74\xa3\x56\xd7\x56\xc0\x19\x40\x5f\xc6\xb8\x7d\x6f\xef\x0d\xb9\x7a\xec\x75\xda\x5d\xb5\xd7\x2f\xd8\xd4\x24\x58\xaf\xc7\xbe\xb0\x28\x43\x57\x23\xd3\x48\x2a\x81\x62\x4b\xdf\x28\x64\x86\x02\x44\x98\x10\xea\xa8\x82\x72\x74\xf6\x3a\xc1\x5d\x64\xe4\xa5\xca\xbf\x85\xa3\x7a\xc1\x85\xfb\x04\xb1\x27\xc4\x19\x67\x83\x4b\xfe\x88\x7d\xbc\x9c\xa2\x5a\x81\xb2\x77\x9f\xc5\xaf\xd9\x83\x59\xab\xaa\xb7\xe7\x76\xac\x29\x02\xb8\xf7\x9c\x0e\x5e\xb9\x80\xb6\xa4\x16\x3e\x32\x70\x4c\x64\x6a\x5d\xb1\x11\x08\xee\x1e\x2e\x21\xb0\xbf\xf3\x93\xe5\x42\x60\x12\xa4\x50\x0b\x1d\x5c\x7f\x54\x03\xb5\xac\x9b\x96\xfd\x49\x84\x66\xd4\x44\xec\x42\xf5\x0f\x89\xa7\x76\x03\x1a\x11\x78\x04\xeb\xd7\x39\x09\x72\xf8\x02\x4b\x00\x04\xf0\xed\xb5\xce\x09\x7e\xbc\xba\x71\xd6\x14\xbb\x56\xd0\xb4\x0b\xf0\x33\xe5\xc2\x25\xa1\xdc\xfb\x02\xff\x26\x7e\x2d\xc9\xac\x4a\x75\xf5\x39\xad\x7a\xe2\xf0\x93\x0a\xb8\xa7\xac\xb8\x00\x63\xb0\x14\x72\x7e\xad\xd5\x0d\x41\x4b\x41\x01\xe2\x52\x56\x99\x71\x46\xa6\x2e\xc4\xb5\x92\xd6\xed\x00\x53\x16\x23\x24\x4e\xb2\xe1\x8f\x33\x3a\xee\x1d\xbf\x85\x74\xf8\x1c\xae\xe8\xa2\x29\xe6\x2d\x7e\x62\xb4\x8e\x8e\xa0\xe2\xf4\xba\x5c\xab\x40\xfa\x11\x71\x82\xc8\xad\xb4\xb6\x6e\xad\x34\x54\xa2\x6f\xd7\x9c\xd3\x23\xf1\x22\xa0\xf4\x5d\x5b\x33\x69\x07\xf1\xd0\x2e\x9e\x27\x82\x09\x8a\x58\x8c\xb1\x1c\xbd\x27\x2e\xe5\x46\xcc\x73\x70\xe8\x6b\xab\xaf\x03\xc2\x68\x56\x3b\x73\x2f\x85\x99\x1e\x3a\x62\x6d\x22\x29\xb2\x4f\x94\x0e\x5d\x04\x88\xfc\x08\x96\xdf\x42\xb2\xb2\xf2\xac\xb0\xe0\x07\x83\x98\x62\x5c\xa6\x96\x43\x65\x8f\x14\xfc\x95\x1d\x63\x45\xbc\x2e\x88\x05\xc6\x14\x76\x6d\xaf\xa2\xb7\x77\x51\x32\x03\x34\x2a\xb8\x75\x69\x3c\x3f\x92\xd3\x00\x9c\x3a\xdc\x65\x34\x74\x5f\x99\x90\x55\x9c\x79\x90\x99\x6a\xb1\x2c\xac\xa2\xec\x40\x38\x80\x62\xa3\xb3\xd1\xe5\x67\x28\x2d\x8b\x60\x40\xa0\xda\x6d\x74\x3e\x78\x3b\x38\x83\x2a\xb3\x3d\x21\xc4\xf3\x56\xa2\xcd\xd5\x30\x87\xe6\x04\x94\x3c\xb0\x20\xe4\x29\xa1\x35\xe3\x49\x77\xb9\x56\x12\xc8\x21\xdc\x1c\xb7\xf8\x23\x7c\x67\x27\x98\xbe\xfa\x3f\xaa\x8c\x72\x22\x46\x6e\x28\x62\x48\xf1\xfa\x6d\x3e\xe0\xae\x94\xf7\x83\x52\xe7\x10\x79\xc7\x91\x65\x7f\x3f\x4c\xe8\xed\x1f\x51\xcd\x82\x23\x07\xb1\x97\x17\x39\x0a\xb0\xf8\x61\x7f\x53\x36\xfb\x90\xca\xed\x8b\x7d\x77\xfc\x18\x66\x80\x31\x12\x30\x58\xe9\x56\xc7\xdf\x50\x46\x6b\x95\x35\x34\xf0\xae\x65\x85\x5c\x79\xd2\xb8\xd3\x50\xdc\xa8\xc2\xfa\x22\xf9\x86\xf5\x2c\x1a\x0e\xdb\x3a\xdb\x30\x57\xb2\x95\x86\x60\x29\x38\x31\x1e\x7d\x11\x3e\x07\x34\xe7\x50\x5d\xe1\xd5\xb6\xe9\x71\xdf\xcf\x3e\x2d\xd9\x7e\x82\xed\xa4\x09\xc6\xbe\xfc\x46\x5b\x81\xb9\xb5\xdb\xc4\xce\x46\xbb\xce\xe5\x2a\xdd\x5b\xc4\x82\xa3\x67\x17\xae\x8b\x7f\x2d\x5a\x4a\xca\x8b\x85\x61\x47\xce\x6f\xc6\xa0\x77\x5d\x8d\xc2\xdf\x3b\xba\x50\x20\xbb\xb2\x46\x06\x3e\xdb\xe2\x3f\x0e\xdf\x1c\x12\x25\xe9\x3a\xe1\x01\xb8\x00\x77\x49\xf7\xbc\xd5\x91\x84\xdb\xe9\x22\x43\x99\x30\x75\x25\xed\x38\x16\x65\x75\x2b\xab\x0c\xa8\x46\x60\x0d\x29\x94\x29\x8b\x65\x23\x97\xaa\x27\x0e\xdf\x03\x97\x1a\x04\x20\x92\x10\x4d\x02\x95\x22\xd9\x05\x1d\xf9\x5a\x12\xfe\x50\x15\xb1\x1f\x0e\x67\xbf\x77\x64\xb7\x73\x7f\xe2\x03\x2e\xfb\x24\x71\x60\xf6\xbe\x27\x7f\x8d\x81\xcd\x16\x7d\xec\x2d\x43\x14\x50\x38\x24\x9e\x2a\x30\x5f\x60\xe3\x5e\x60\xc3\xba\xb0\x4c\x18\x57\xa4\xdb\x40\x21\xa5\xf0\x5f\x38\xce\xbc\x2a\xb3\x26\x57\x60\xcd\xb1\xac\x48\xc4\x3a\x6f\x0c\x56\x0a\xf8\x4a\x6d\x47\x41\x83\xa8\x20\x08\xe9\x40\x0a\x13\x9e\x87\x2f\xcc\x2b\xbd\xae\x89\x5a\x9e\xa8\x9a\xaa\x12\x8b\xe8\x74\xee\xc1\xea\x88\x0c\x3a\xaa\x44\x73\x32\xdb\xde\x68\x6b\xe7\x61\x14\xaf\xf4\x42\xf6\x89\x5a\x8d\xe9\xf0\x76\x70\xd4\xbf\x46\xc7\x03\xe2\xa6\x4d\x6d\x80\xcf\xa8\x36\xc2\xcc\xcb\xb5\xa2\xce\x90\x39\x68\x5e\x6f\xb8\xb3\xc1\xee\x2d\xd8\xa1\x0f\x73\x10\xf3\x1e\x19\x7d\x68\x46\x97\x4d\xbd\x6e\xc8\x54\x43\xa0\x92\x30\x44\xc0\x03\x43\xfe\x9b\x05\x7c\x1e\x48\xad\x0a\xfc\x1f\x54\x84\x12\x83\xa5\xc4\xb7\x53\x1c\x86\xd0\x31\xa5\xe3\xd9\x6e\x19\x1e\xe4\x41\x94\x25\x54\x94\xb9\x0a\x1a\x5d\x1f\xf5\xc4\x27\x0a\x51\xba\x1b\x5a\x35\x2a\xc4\x62\xe6\x90\x8b\x7b\x17\x14\xe3\x43\xe9\x92\xe3\xdc\xa6\x39\xb5\x89\x8e\xfd\xf3\x0c\xe8\xc3\xdd\x45\x4f\x4e\x5d\xb9\xd7\x1c\x98\xee\xa3\x2d\x4d\x14\x4d\xd7\x75\xc2\x15\x2b\xd8\x6b\xd1\x06\xf7\x44\xfa\xb7\xc2\xac\xf5\xbc\x41\x70\x09\xb0\x54\xd6\x18\xe7\x90\x35\x78\x15\x44\xec\x53\x16\x82\x0a\x95\x60\xb4\xe1\x53\xdb\xcd\x07\x34\x9b\xed\xb6\xaa\xcd\xeb\xad\xde\x12\xe8\xeb\xf8\x59\x0d\x5b\x72\x66\x54\x00\x08\xe9\x5f\xdd\x5a\xc4\x90\x1d\x3b\x7c\x93\x87\x29\x0a\xed\x51\xbb\x2b\x6e\x4b\x30\x7d\x01\xb1\x69\xdf\x43\x7b\xbd\x21\x1c\x1d\xbc\x0b\x18\x2b\xa2\x14\x8c\xa4\x20\xa5\xe4\xd0\xab\xdc\x08\x49\x59\x02\x47\xb5\x63\xe7\xe5\x62\x86\x3e\x16\x09\xf1\xa7\x2f\x9c\x1d\xe3\x98\x38\xe3\x65\xf0\x98\x28\xd8\x09\x6f\xe4\x6e\xc1\xce\xd3\xe1\xaa\x71\x62\x9d\x01\x91\x2e\x0e\x6d\x3d\x70\x8d\x12\x32\x9e\xb7\x0f\x65\x47\xd3\x2b\xeb\xd8\x0e\x5b\xc7\xf5\x01\x73\x61\xec\xf6\xd9\x03\x4b\x67\xa5\x14\x1e\x04\xc7\x62\xee\x0d\x77\xd7\x05\x8a\xce\x82\xaf\xa3\x02\x8d\x01\xad\x98\x58\x60\x03\x0c\x66\x6d\x0b\xc0\x95\x44\x1e\xf9\x04\x01\x3a\xc2\x98\xc6\xb5\x32\xde\xbd\xd2\x4a\x66\x68\x8d\xf7\x8d\x22\x7c\x2a\xad\x3f\xe9\x68\xbe\xe1\xce\x20\x00\x7d\xf0\x1a\x8e\x13\x64\xf6\x3a\xd0\xb9\xc4\xa7\x02\xba\xfd\x8e\x41\x20\xbd\x60\xa8\xe2\xd0\xd0\x0a\x83\x7d\x45\xc9\xe7\xd1\xaa\x6a\xb8\x31\x21\x57\xe9\x53\xd1\x74\x80\x0e\x5f\x8a\x85\x9c\x63\xc4\x85\x34\xb5\x5b\x00\x3e\x3d\x81\x69\xe5\x0c\x35\x34\x42\x30\x98\xc2\x6c\x7b\x38\x50\x6e\x99\xc2\x3a\xba\x2e\x3b\xb0\x25\x09\xf9\xfb\x49\xa8\xc5\x24\x40\xe5\xc8\x6a\x09\xf9\x78\x0e\x84\xdf\x32\x5f\xa5\x1f\x33\x14\xae\x96\x3f\x5a\x9d\x02\x6c\x96\x9b\x28\xf1\x23\xc5\xb2\x2c\x33\xb1\x90\xd0\x57\xbb\x58\x94\x55\x8d\xa8\xb9\x2e\x23\x94\xf0\xb4\x31\x5e\xdb\x1a\xb1\x67\x9c\x6a\x80\xe1\x11\x0e\x7c\xb8\x06\xb5\xef\xf9\x72\x63\x32\xb5\x75\x58\x11\x78\x56\x99\x08\xf5\x03\xeb\xdc\x90\x81\x4a\x56\x35\xde\x44\xe3\xaa\xb4\xb0\x34\xd6\x80\x45\xa2\x8b\xe5\xa2\xc9\x79\xb3\x0e\xa3\x0c\x5b\xb0\x0f\xa0\xbb\x02\x0f\x0d\x3a\xf2\xed\xd5\xfc\xa9\x81\x94\x70\x59\x52\x6e\x46\xba\xaf\xb0\x2e\x73\x64\x9d\xb7\x2a\xcf\x8f\x19\xc6\xac\x43\x65\x06\x2b\x12\x31\x3d\x4f\x9a\x19\x33\x0d\x9e\x66\x5c\xee\x6d\x7c\x5c\x3b\xf8\xdd\xb1\x3b\x16\x5b\xab\x87\x76\x10\xdb\x1f\xee\x9f\x39\x1a\x8e\xb2\x52\xe6\xdf\x33\x31\xc2\x43\xfb\xa3\xa9\x50\x21\x98\x7d\xeb\x8d\xb8\x39\x5d\xab\x84\xe6\x28\x27\x52\x1d\x7d\xbd\x21\x72\x4f\x2e\x18\x8e\x24\x8e\x67\x04\x85\xdc\x0e\xd7\xf9\xc1\xb4\x8c\x0a\xc3\x1c\xb2\xa6\x5f\x90\xdd\xb5\xe5\xc4\xc7\xc2\xd6\x7a\xcb\x2a\x6c\x31\x0c\x80\xba\xc2\x1d\x82\x58\x2e\x47\x95\x3b\xc1\xf1\x88\xe3\xb5\x5d\x05\xea\x18\xb0\x13\xc7\xeb\xed\xa7\x69\x4f\x89\x1b\xfe\x2d\x5f\xab\x98\x05\x17\x42\x54\xf1\xa7\x7b\xe2\x4d\x53\xef\x7a\x1e\x43\xe6\xee\xad\xd2\xb8\x1b\xc0\x9c\xaa\x8e\x26\xf4\x41\x5d\x54\xb7\x39\x26\x59\x56\xc2\x3b\xdc\xa9\x29\x76\x0b\xc0\x84\xea\x32\x7c\x4a\x11\xe3\x41\x51\x4b\x83\x32\x58\x13\xee\xbb\x3e\xb1\xce\x19\x3e\xc3\x61\x60\x8c\x5d\x83\x15\x04\x25\xe1\xd0\xb8\xbf\x46\xf8\xbb\xa5\x75\xa7\xa0\x39\x7b\x01\x4d\x3c\xb7\x56\xbb\x33\x1d\xf8\xf4\xba\x31\x49\x50\x57\x54\x13\xb1\x6a\x51\x77\x71\xc2\x82\xd5\x14\x14\x04\x30\xb7\x6b\x98\x7e\xad\x4b\xf2\x6d\xa9\x46\xd2\x5d\xee\x19\x58\x08\xaf\x29\x10\x93\x84\x9f\x42\x8f\x73\x1b\x86\x22\x74\x4a\xba\x96\x3b\x8c\x93\x57\x11\xd0\x62\xcc\x7d\xde\x36\xa6\x06\x85\xab\xaa\x4e\xc4\x0a\x2a\xbd\x97\xcb\x2a\xa0\xc4\x66\xb7\xf3\x96\xeb\xb6\x3b\xad\xfa\xb6\xa1\x06\x3d\x29\x94\xad\xd8\x79\x70\x8e\x90\x39\xe5\xa6\xcc\x9b\x15\xf5\xa1\x9a\xba\xac\xe4\x52\xc5\x1c\xf5\x56\x4e\x60\x1b\xb2\x93\x2d\xb3\xca\x85\xe4\xfd\xe8\xbc\x92\x05\x9f\xa8\x53\xc9\xbe\xf0\xb6\x5a\xb9\x46\xb4\x0b\xbc\x63\xf1\xc9\x7c\x52\xe6\x0d\xbc\x41\x25\xb3\x2d\xe3\x15\xd4\x32\x52\x4c\x7a\xe3\xd6\xaf\xbb\x98\x96\x58\xb5\xa2\x4d\x50\xa6\x80\x90\x0d\x4f\x37\xb6\x93\xb8\x50\x21\x6a\x34\x7e\x52\xda\xf0\xc6\x57\x09\x86\x13\x29\x5b\x5d\x70\x87\x60\x91\x14\xea\x36\xe0\x8e\x04\x7b\xe0\x81\x8a\xb8\xdd\x4b\x06\x6a\x0f\xea\xf4\x23\xf3\xc0\x0a\x57\x66\x90\x8c\xd8\x2b\x79\x64\x41\x4d\x52\xef\x48\x9c\xa3\x78\x44\x7b\xc2\xb7\x1f\x53\x99\x5c\x41\x26\x2a\xad\x21\xec\xfb\x08\xba\xfd\xed\xc4\xf8\x29\x43\xa9\xdf\x22\xda\x2b\x96\x00\xba\xaa\x14\x8c\x81\x63\xae\x94\xd7\xb6\x4f\x98\x27\x2f\x72\x14\xec\x84\x86\xba\x19\x15\xc1\xb3\x57\x00\xd6\x7b\x9b\x84\x01\x06\x46\x5a\x88\xbe\xea\x89\x84\xc9\x51\xd1\x10\xac\x58\x34\xb9\x17\xee\x9c\x93\x87\x33\xc7\x92\x1c\x83\xa5\x59\x87\x83\x1d\x25\x20\xd9\x00\xc1\x56\x85\xd0\x36\x7f\xf9\xb0\x13\xdc\xbe\xf4\x41\x18\xac\x6a\x65\xef\xac\x25\x80\x77\x94\xdd\x8e\xd3\x23\x40\xd7\xc1\x7a\x1c\x2e\x28\x0b\x72\x82\x10\x5b\xda\xed\xb6\x18\xeb\xb7\x14\x99\x38\xa5\x46\xc3\x0e\xe7\x65\x8e\xa5\x08\xd6\x0c\xf1\x42\xca\xf9\xe5\xf3\xb2\xc2\xea\x2b\xc8\xc8\xae\xe4\xfc\x5a\x17\xea\xb8\x52\x32\x43\x73\xc1\xbb\xed\x9c\x65\x67\x65\xf6\x48\x0c\x79\xc7\x00\x91\x29\x0a\x65\xd9\xbc\x31\x75\xb9\x92\x95\x86\x8c\x2c\xe5\xec\x7d\x59\x65\x51\xab\x2a\x70\x4e\x06\x8b\x2d\x91\x1f\x2e\x1b\x9f\xe6\xd9\x06\x3d\x58\x70\x1f\x11\x88\x84\x0f\x04\xe2\x69\x84\xa9\x7b\x88\xa8\xd3\x25\x74\xbf\x0a\xd0\x9e\x5a\x2f\xd8\x8a\xc4\xb1\x99\x04\x56\x04\xbc\x8c\x18\xea\x35\xf7\x53\x7a\x93\xad\x55\x97\xd8\x7a\x57\x02\xa6\xbe\xf0\xb4\x1d\x81\xeb\xe4\xa3\x62\xab\xb5\x82\x78\x7b\xc7\x80\x5a\xe1\x82\x60\x69\x18\x1e\xa0\x1f\x1f\x75\x97\x5f\x28\xca\xd6\x29\xdd\xa2\xbc\x0f\x0c\x9d\x59\x03\x97\x24\xac\xc9\xbc\x75\x00\x31\xe1\x4d\x98\x6d\xc4\x4c\x41\x41\x18\x04\x10\x91\xcf\x2c\x8c\xc5\x43\xd8\xc7\x70\x06\xa1\x3b\xef\x34\x74\x79\xa7\x09\x86\xe2\x30\x29\xae\xed\xe5\x2f\x19\x37\xd8\xdd\xd9\x76\x54\xbb\x3d\x76\xf2\x7e\xd1\x51\x10\x0b\x99\xe7\xc6\xc5\x11\x1f\xd6\x99\x2e\x49\x9c\xbb\x82\x84\x87\x86\xbb\xbd\x1a\x08\xf8\x62\x90\xa5\xdb\x5d\x6e\x16\x39\x5d\x49\x7e\x27\x51\x82\x5a\x6c\xb7\x65\xeb\x88\xb5\xc8\x9b\x13\x49\x94\xd9\x7a\x4a\x2e\x2f\x2e\x3f\xf0\xab\xb3\x23\x02\xeb\x9a\xa6\xc5\x2b\x6c\x61\x25\x7b\x1d\xae\x6e\xfb\x7a\x62\x2f\x6f\x2b\x51\x02\x55\xc3\x8f\x2c\x1f\xfc\xcd\x4a\xd6\xaa\xd2\x32\xe7\x6b\x1b\x24\x7a\xdd\xc2\x85\x22\x3e\xb2\xc5\x43\xc9\xc0\x81\xb1\xdb\x00\xb5\xf9\xb1\xc3\xd2\xba\x8d\xf1\xb5\xc7\x03\x17\x86\x61\xa9\xea\xbe\x6a\x10\x57\xcc\x17\x6d\xdb\x5b\x02\x71\xa8\xa2\x66\x4f\x11\x93\x28\xe8\x4a\x05\xf7\x81\x9b\x8a\x86\x71\x49\x6b\x1d\x60\x5f\x72\x97\x96\xaf\xdc\xb3\x3b\x58\x5f\x57\xca\x5c\x97\x79\xe6\xcb\xfb\x30\xe6\xc1\xc3\x21\x60\x5e\x6b\x4d\x43\x19\x39\x01\x83\x6f\x44\x2e\x6f\x59\xb2\x62\xa4\xbb\x08\x0b\x43\x71\x17\x20\xd0\x5d\x34\x2b\x55\x41\x4c\xd1\x3a\x56\x2b\x55\xab\xca\x7a\x68\xb2\xb6\xe6\x6a\xd5\x20\xf2\x76\x2e\x37\xf6\x32\x61\x6c\x16\xe4\x66\x59\x51\x9c\xc1\xac\x20\x5f\x21\xe7\x55\x69\x82\xbf\xd0\x45\xae\x8b\x30\xcd\x76\x68\x7d\x04\xe8\x64\x02\x61\x61\x45\xaf\x2e\x44\xae\x8a\x65\x8d\x75\xd8\xaa\x68\x47\xcb\xc3\x01\x5b\x83\xa0\x08\xe3\xf9\x6d\x7f\x87\xd0\x0b\xe1\xe8\x40\x3d\x4e\xbe\xd9\x3e\x09\x3d\x71\x98\xfa\x33\x1b\xa7\xbb\x80\x80\xc8\x9f\x2c\x48\x9e\xec\xb8\x8b\x84\x1f\x00\x8e\xbd\x15\x35\x2d\xbd\xff\x0a\x1d\xfb\x11\x77\x62\x25\xed\xcd\x7e\x40\x26\x78\x22\xf1\x96\x3e\xd9\x79\xea\x1f\x88\x7b\xbe\xc2\xe6\x34\xb5\x6b\xca\x2e\x44\x90\x9b\xb2\x73\x22\xbe\x62\x9a\x2a\x00\x5d\x8e\x86\x4e\x77\xa6\x2b\x35\xaf\xf3\x0e\x17\x09\x0f\x34\x83\x8a\xf4\x49\x3c\xce\xd5\x3a\x2c\x63\x70\x86\x04\xc5\x67\x5d\xd8\x1a\xf2\xcf\xa8\x5c\x58\xb7\xfc\x6c\xb9\x8c\xd5\x92\x00\xc7\xbb\x9d\xde\xdc\xb1\xb3\xc9\xb6\x01\xc8\x8b\x44\xeb\xcc\x6b\x8c\x41\xf0\xeb\x52\xcf\xb7\xe2\xca\x7e\x2f\xa8\x5e\x27\xca\x83\xb5\x93\x89\x60\xb2\x81\xb5\xa4\xaa\x03\x23\xca\x5b\xec\xce\xc0\xa2\x6a\x6b\xa4\x2b\xa1\x8a\xa5\x2e\x14\x5a\x30\x20\x8c\xd5\xac\x59\x42\x45\xdc\x76\x3c\xdc\x27\x11\x5c\x29\x7b\x3b\x9c\x4c\xa0\x7f\x2e\x95\x12\xc5\x7e\xdb\xe9\x25\x6d\x1c\x35\x18\x11\xfb\x6f\x3d\xc2\xd1\x1d\x18\xf6\x43\xfa\xc5\x0d\x8b\x82\x67\xdd\xd9\x11\x57\xb4\x0c\x03\xca\x1a\x34\xdc\xe0\x0c\x43\x04\x0e\x81\xc7\xcc\x36\x22\x58\xe0\x6e\x86\xb0\x99\x5b\xa9\x21\x5e\x75\x37\xfe\x55\x89\xee\xf6\x0a\x9a\x2c\x6f\x55\x9e\x63\x9c\xcd\x23\xa9\xe1\x39\x67\xaf\x1c\xaa\xa4\x02\xd4\xab\xed\x19\x60\x09\xb8\x1b\x4e\x46\x00\xd2\x9c\x5e\xc0\x66\x8e\x20\xb5\xd0\x77\x96\xbc\x9b\xf8\x5f\x62\xcf\x6f\x4d\x31\x68\x70\xe6\x70\x30\xd7\x4a\x01\x17\x22\x6f\xb1\xfb\xfa\xe1\x63\x0e\x41\xb7\x0f\x70\x04\x19\xb0\x6d\x81\x17\x99\x46\xa1\xa5\x18\xdd\xbd\xed\x29\x6f\x4d\xf2\x21\x11\x00\xbb\x17\xca\x49\xaa\x3e\x88\x4c\xf1\x20\xac\x40\x84\x7e\xb2\x08\xab\xf8\xc3\x43\x0d\x4a\x89\xfb\x23\x42\x69\xe2\x62\xb2\xc1\xac\x5a\xb5\x13\xed\xa4\x46\x4f\x1c\x62\x2b\x1e\x95\xf3\x97\x65\xd6\x1a\x08\x10\x07\x70\x87\xc5\xb5\xf2\xb9\x67\x08\x80\x39\xe6\x15\x4a\xf7\xe8\x76\x88\x8a\x6a\xe6\x19\x50\xc2\x3a\x5e\xd6\x18\xa2\x16\x79\xee\xcf\x50\x5b\x11\x6d\x2a\x16\x8c\xc6\x1c\x7c\x0e\x75\x19\xa6\xb0\x76\x9d\x52\xe9\x82\x80\xe0\x68\x25\x04\x5a\x01\x79\x44\xc6\x3f\xb3\xa6\x8c\x12\x1b\x25\x2b\xe8\x31\xf3\x4d\x36\xe0\x5f\xe1\x8d\xb2\x43\x20\xcb\xd0\x04\x08\x0a\xba\x08\x03\xff\xaf\x64\xc2\xea\x02\x13\x95\x94\x99\x2a\x4a\x44\x67\x07\xf3\x18\xd7\xcf\x80\x01\x49\x99\x10\xa7\xe5\x43\x53\x36\x48\x8d\x75\xf8\xa0\xe1\x11\xfe\xc5\x0e\x28\xe6\x5c\x1f\x76\x3c\xd1\x7f\xf6\x33\xf6\xab\xd0\xe1\x86\x06\xe9\xb4\x8f\xaa\x72\x31\x25\x77\x8e\x20\x08\x95\xdb\x1b\xb3\xf1\x18\x4e\xa1\xa8\x55\x26\x5c\x67\x8e\xfe\xb8\x7e\x3b\xfe\xad\xe1\x76\x02\x22\x5e\xf4\x91\x1a\xa8\x71\x09\xaf\x74\x12\x3a\xc4\x71\xd1\xcc\x83\x3a\x3b\x86\xb2\x05\x70\x86\x1a\x31\x88\xdb\xe5\xfd\xd0\xdc\x46\x61\x04\x86\xd9\xe7\xab\x16\x86\x54\xec\x72\xe9\x3a\x28\xd6\x06\x41\xce\xf5\x7f\xce\x00\x49\xb6\x0c\xff\x50\xc2\x41\x23\x9d\xbd\x4c\xc1\xd0\xb0\x24\xdf\x07\x92\xaa\x15\x76\x6e\x06\x3f\x3b\xd4\x05\x97\x45\xd1\x9b\xcb\x8a\x59\xb5\xed\x92\x1c\x79\x01\xb7\x92\x3f\x20\x51\xe6\xba\x2c\xe0\x8e\x1f\xd2\xf5\xac\x12\xf1\xa3\xaa\x0a\x45\xdd\x01\xc6\x2a\x0e\x07\x29\x49\xd4\x92\x56\xef\x6f\x4c\xad\x56\x58\x0f\xc2\xcc\x35\xc1\x32\x54\x4d\x61\x1c\x6c\xa3\xeb\x59\x81\x4f\x39\x4f\x63\xee\xdb\x58\xe2\x5f\xa3\xdf\x80\xf5\x84\xd7\x72\xbd\x56\x45\x50\x1a\x1b\x06\x3d\xb0\x55\x37\xd3\xf3\x3a\x06\x0a\x8a\x9a\x02\x1d\xfb\x52\xd8\xb9\xd2\xaa\x1e\xa6\x7c\x90\x5b\x54\x19\xc9\x99\xf6\xac\x5d\xc0\xc0\x7f\x1f\x83\xe8\xb2\x30\x1c\x6e\xe5\x92\xf2\x59\x89\x0b\xbe\x72\xe9\x71\x6f\x1d\x2e\x19\xf0\xbc\xcb\x73\x8f\xd3\x49\x0c\xe4\xc6\xa1\x42\x0c\x07\x71\x12\x94\xf2\xb0\x51\x31\xf4\x43\x45\x42\x46\x67\xea\x78\xb6\x39\xc6\x22\x27\xeb\x31\x1b\x5d\x2c\x73\x15\x64\x55\xc3\xca\xd9\xb0\xc7\x37\xfa\xd8\x03\xd5\x54\x5b\x76\xac\xe1\x25\xa3\x0e\x04\x57\xa0\xb6\x6d\xba\xba\x14\xdb\x4e\x71\xd8\x39\x2b\x28\xb0\x5a\x04\x59\x8b\x8e\x11\x6b\x13\xe0\x53\xb8\xe6\x79\x4a\x58\x6f\x85\x37\x7d\xef\xeb\x6d\xf9\x98\xc9\xd4\x9e\x18\x2b\xa6\xd0\xc0\x05\x11\xfa\x40\xa2\xaf\x29\x7c\x83\x06\x63\x22\xef\x9a\x0a\x15\x00\x3f\x31\x60\xba\xed\xeb\x04\x85\x21\xef\x76\xdb\xe8\x9d\x33\xa3\xf7\x2d\x24\x33\x05\xfb\xc4\xfe\xa3\xb9\x4c\x48\x1a\x7e\x59\xe7\x64\xa8\x10\x93\x40\x29\x16\x9a\xae\x87\xbb\x7a\xf6\x9f\x83\x05\x09\x45\xba\x5b\x47\x06\x37\x0b\x41\xaa\x63\x56\x69\x0f\x9a\x8d\xf1\x35\x98\x56\x12\x25\xc0\xe2\x20\x3b\x31\x6a\x45\x60\x36\xee\x64\x74\x40\x8e\x81\x83\x2b\xeb\x5a\xad\xd6\x21\x56\xbd\xeb\xd8\xfc\xc5\x03\xd1\x46\xdc\x94\x3a\x63\x54\xb0\x3c\x6f\x61\x2e\x7a\x2c\xc6\x30\x29\xda\x35\x42\xa7\x8a\x1c\x36\xd5\x16\xc2\x22\xa6\x4b\x90\x51\x88\xfa\xb9\x41\x93\x6d\x3a\x71\xd6\x9e\x8c\xac\x68\x4a\x01\x91\x63\x86\x9b\xe5\x01\xec\xc4\x52\x84\x0d\xfd\xae\xe7\x70\x90\x03\xf8\x6c\x84\x1c\x98\x13\xdf\x59\x94\xa8\xd3\xd6\x43\x0a\xd8\x01\x6a\xc6\x01\x8b\x14\x71\x41\x1c\x4b\xd0\x6b\x4a\xac\x41\xf6\x47\x71\x9f\x2d\x59\xe2\xbb\xf7\xa5\xac\xc0\xd7\x6c\x67\x95\xb8\x21\x5d\xf2\x25\xab\xe0\x4e\x5d\xeb\x19\x03\xfd\xe7\xf2\xd6\x35\x8a\x53\xfd\xc1\xf6\x6c\xa2\x6a\x93\xd9\x26\x6e\x6d\xdb\x42\x3f\x8c\x32\x43\xc5\xe6\x81\x5c\x30\xfa\x82\x04\x88\x44\x47\x06\x3f\x1f\x31\x43\x07\x29\xd6\xac\x14\xd6\x85\x84\x88\x1b\x01\x4f\xfc\x9c\xbe\x12\x1c\xb1\x1f\x7e\x6b\x09\x5b\x79\x73\x2a\x12\x38\x79\x1e\x22\x12\x62\x1d\xe7\x43\xc9\xb0\x47\xa6\x5c\xc7\x20\x84\xd1\xf5\xa1\xa3\x6f\x02\x6c\xc2\xa0\x81\xd2\xf5\xc0\x79\xea\xaf\x76\x03\x76\x70\x8d\x45\xdc\x87\xed\xd4\x6c\x84\xd6\xb9\xa3\x2f\x27\x16\x5e\x01\xf5\x00\x03\x00\xc6\xc6\x4c\x11\x4f\xea\x69\x64\x02\xba\x68\xdf\x28\x82\x44\xa0\xe4\x2b\x02\xfb\x71\x3e\x85\xd0\xa2\x50\xa1\x07\x99\xa2\x76\xea\x1a\x36\xec\xa4\x27\x06\x0b\x32\x72\x1d\x06\x19\xd5\xa5\x8a\x79\xd9\x54\xb5\xf8\xa1\x41\x1e\x44\x81\xa5\xe5\x41\xf1\x03\x75\x01\xeb\x62\x61\x1d\x1a\xc5\x0f\x2d\x22\xc0\x4d\x6a\x29\x3d\xc4\xfe\x5f\xc4\xf8\xb2\xbe\x30\xfd\xd6\x98\x46\x99\xa3\x24\x82\x8d\xac\x14\x2d\x24\x9c\x09\x7b\x8c\x0e\x39\x8c\x08\x70\xea\x76\x54\x65\x05\xd0\x63\x01\xe4\x5c\x00\x5d\x75\x14\x70\x0e\x80\x7d\xc7\xfe\xf0\x4e\x56\x32\x88\x4b\xd2\xb5\x56\x5f\xe6\x0d\xd1\x95\xb8\x23\xb5\xfb\xb7\x0e\x72\x81\xac\xc6\xd0\x66\xe2\xb6\x13\xcc\xfb\x59\xc3\x6d\xd5\xe4\x35\x62\x78\xe6\x54\x07\x1b\xe2\xa3\x75\x88\x6a\xb8\xbf\x6e\x31\xd7\xaa\xaa\x51\xcb\x07\x3f\xa3\xe0\xf7\xd6\x1e\x6e\x3a\xa9\x1f\x62\x9b\x0b\xfb\xb0\x45\x1b\x0d\x43\xb6\xba\xcc\xa9\xad\x11\xb2\x05\x18\x92\x0c\xe9\xd9\xc2\x5b\xbe\x9d\x17\x84\xb2\x4a\xa8\xdb\x28\x89\x11\x90\x8b\xbb\x29\xc9\xef\x62\xc0\x25\xb2\x07\xd1\x7f\xd5\xd7\x15\x64\x58\x36\x65\x13\x84\xf7\xb1\x3f\x0c\xf1\x80\xec\x51\xc8\x33\xb7\xba\x60\xab\xbb\x18\x63\xa8\xee\xe0\xb1\x19\xc5\x31\x16\x95\xd5\x5d\xae\xda\x08\xb6\xf8\x81\xe1\x73\x16\x64\x2b\xf1\x19\x54\x3c\x69\x23\xae\x55\x9e\x3d\x8a\x48\x4a\xf8\x82\x7a\xde\xe4\xb2\x12\x73\x5d\xcd\x9b\x95\x01\x09\x8e\xc2\x6e\x26\x73\x2f\xce\x55\xf8\xfa\xb0\x89\x13\x4a\x72\x7c\x5f\x2f\x3f\xe5\x2b\xfb\x3a\x7f\xe0\x89\x7a\xc2\xef\x1a\x76\xd6\x82\xb2\xae\x36\x79\x66\x50\xd7\xa5\x0b\x08\x60\x11\xb0\x0b\x5f\xfc\x00\x12\xc0\xf8\x4e\x33\xeb\xaf\xa9\xaa\x26\x5a\x43\x2c\x09\x63\x74\x18\xae\x07\xf3\xd8\xab\x0b\xdf\x05\x85\x4f\xbe\x8e\x3f\x7e\x4d\xf8\x83\xc6\xce\x2f\x18\x61\x80\xed\x51\x53\x9d\xd8\xb2\x0a\xb0\x5b\x63\x50\x85\x68\x9f\xc9\x07\x76\x45\x7c\x21\x69\xc0\x6c\xd3\xee\x78\x27\xc6\x04\x6b\xb9\x7f\x80\xf9\xaa\x72\x9d\x87\x28\x09\x00\xf1\x58\x36\x26\xa6\x09\xe6\x30\xef\xad\xf5\xd5\x80\xbb\x36\x6a\x5c\x0b\xed\x7e\x3e\xf0\x20\xbb\x68\x70\x1a\xe3\x87\x78\x2a\x10\x47\x90\x58\x51\xc2\x10\x1c\xd7\x6b\xe2\x8f\x5e\x93\x21\xdf\xac\x5d\xb7\x01\x34\xfd\x3d\xcb\xca\x02\x97\x9f\x70\x9d\xf4\x42\x80\xb6\x14\xe6\x1a\xce\x8c\x35\x0b\xa9\xf7\x3e\x92\x62\x34\x56\x1e\x9f\x17\x47\x34\x48\xec\x0d\x75\x1d\x7d\x24\x08\x49\x17\xa2\x24\x86\x3c\x87\xaf\xd2\xd9\x71\xb2\xa1\x62\xc9\x0e\xd5\x7e\x27\xdf\x10\xea\xc4\x2d\xc5\x4c\x66\x2a\xc7\x9e\x5d\xa2\x9b\x68\x2b\x2c\xd4\xac\xa6\xee\xcc\xd2\x9f\x9c\xba\xb4\x40\xbb\xcd\xe8\x59\x4c\x46\x13\x18\xf0\x41\xd3\xb7\x2e\x1c\xbc\xc3\xbc\x6c\xec\x06\x2b\xd7\x44\x37\x8b\x4e\xff\x6c\xe3\x33\x06\x61\x83\x15\x81\x7a\x3b\xe3\x64\xab\x47\xd3\x8a\x46\x08\x0c\xc4\xfd\x36\x1d\x4a\x01\x52\x5c\x59\x86\x71\x07\x7b\x0c\x74\x2d\x96\xaa\x5c\x56\x72\x7d\x0d\xa9\xd8\x68\x8a\x41\x6b\x1b\x10\xb8\x11\x46\x68\x09\x6d\x0a\x34\x15\x1f\xd7\x8e\x7e\x1a\x41\xd4\x61\x5f\x13\x16\xd2\x43\xc6\xc3\x2f\x04\x8a\x8e\xc6\xd0\x07\x54\xd6\x13\x83\x82\x6e\xb3\x44\xfd\x1a\x62\x37\xfb\x46\x6f\x0e\xfc\x78\xb0\x54\x63\x8f\x25\x87\x83\x29\x48\x3d\x2b\xb3\xed\x1c\x09\xec\xea\x0b\xcc\x73\xef\x04\x3d\x5b\x49\xdf\xfe\x53\x21\x49\x1a\x6f\x79\xa1\x6e\xb9\x8e\x6e\x2b\x3f\xbb\x0b\xc0\x60\x0b\xf5\x12\x43\x49\xd1\xab\x18\xbc\xd3\xe8\x95\xce\x11\x70\xd7\xac\x75\xa5\x1d\xc6\x2f\xa1\x00\x7b\x64\x9b\x59\x53\x53\xc6\x16\x42\xbd\x80\x20\x52\x4b\x9d\x83\xec\xc6\xde\x58\xf8\x84\x43\xbd\xc1\x8a\xda\xb9\xaa\x28\x5d\x07\x36\xb7\xab\x09\x34\x54\xb0\x27\x09\xa7\x61\xd9\x68\x03\x9e\x13\x3f\x81\x60\x7e\xee\x3e\x38\x7b\xd7\xf1\xb9\xc8\xd6\xa3\x5b\xfe\x05\xca\xcc\xa0\x7c\x8f\xd4\xee\x3e\xa0\xe6\xca\x3a\xa0\x54\x4c\x62\x20\x36\xd7\x48\x14\x90\xa6\xd5\xbb\xc8\x63\xe9\x7e\xb1\x78\x73\x30\x85\x15\xeb\x8b\xe8\x53\x01\xac\x29\xb5\x41\xef\x3a\x16\x5b\x53\xf7\x55\xf9\x54\x65\xe9\xbd\x8a\x78\x25\x7c\x8a\x79\x7e\x5d\xb2\xa9\xcf\x8f\x60\x97\xc4\x93\x07\x01\x07\xf8\xa5\xb3\x1f\xb9\x3e\x31\xe4\x90\xb5\xd6\xc2\xd6\xe1\x44\x3e\x59\xa4\x1f\x8f\xb1\x27\xe0\x4e\x47\x17\xb8\x6d\x56\x17\x10\x9d\xa9\xc1\x75\xe0\x08\x11\xd4\x97\x57\xba\x56\xb1\xba\x60\x14\x37\x6b\xce\x7b\x1f\x1b\x6d\x45\x8f\x52\xc4\xca\x33\x14\x79\x8f\x4c\xbc\xf5\xb5\x5d\x8f\xbd\x06\xfc\xc0\x72\xa5\xec\x45\x33\xa8\x1b\x5c\xfc\xdd\xb8\x82\x16\xc4\x08\xb4\x1a\xcd\x38\x56\x80\x19\x01\xdf\xba\xa1\xd4\xb7\xa5\x58\x96\x90\xad\x58\x84\x00\x16\xf5\x36\xde\x86\x35\x55\x7d\x70\x00\xe3\xcf\x84\x72\x11\xc0\x54\x16\x0c\x2c\xb6\x2a\x9d\xed\xc1\xe8\x21\x98\x79\x27\x8d\xe2\x7e\x42\x08\xd0\x39\x1a\x94\x17\x23\x66\x58\xf9\x0c\xc7\xe0\x9b\x9e\x78\x93\x9e\xf5\xaf\x26\x29\x70\x82\x30\x82\xa9\xe7\x19\x39\x17\x6f\xc7\x29\x50\x8c\x9c\xbd\xef\x8f\xdf\xa5\x89\x7d\x6e\x9c\xda\x27\x82\x77\x01\x0c\x41\xf0\x82\xa4\xc5\xb6\x72\x99\x8e\x3f\x0c\xa6\xd3\x2e\xba\x15\xc7\xcf\xf2\xe9\x7d\x7a\x11\x30\xff\x4c\xa6\x7d\xfb\xbc\xa7\xf7\x81\xf7\x9d\x8d\x2e\x3f\x8f\x07\xef\xde\x4f\xc5\xfb\xd1\xf0\x3c\x1d\x03\x1e\xc2\x33\x47\x66\xc3\xa4\x40\x97\xe3\xd1\xc7\xc1\x79\x3c\xa7\xfd\xfe\x44\x0c\x26\xfb\x8e\x7f\xc7\x8d\x3d\xe0\xfa\x49\x44\x3a\x80\x17\x11\xb3\x4f\x7a\x2e\x46\x63\xcf\xee\x13\xb0\xf8\xbc\xb9\x9a\x02\x13\x0d\xb0\xf8\x00\x31\x11\xac\x4c\x07\x8f\x8d\x7d\x3f\x53\xf9\xf4\x89\x6f\xa5\x7f\x71\xfe\x28\x9b\x4f\x0f\x17\xf0\x62\x3a\x18\xa7\x62\x3c\x98\xfc\x41\xf4\x27\xbc\xac\x7f\xbc\xea\xbb\xf7\x5c\xa6\xe3\xb7\xa3\xf1\x87\x3e\xd1\xf3\xb4\xb6\xd1\xce\x16\x58\x72\xc4\xe4\xfd\xe8\x6a\x78\x1e\xfd\xbb\x5d\xa6\x94\x18\x80\x06\x1f\xd3\x04\x28\x6d\xfa\x93\xc9\xd5\x87\x94\x56\x7b\x02\xc4\x33\xfd\xe1\x50\x5c\xa4\x67\xe9\x64\x62\x7f\x35\x49\xc7\x1f\x07\x67\xb0\x0a\xe3\xf4\xb2\x3f\x00\x0a\xa0\xb3\xd1\x78\x9c\x02\xd3\x0f\xca\x97\x57\xbd\x88\x46\x87\x88\x9d\x76\xb3\xee\xd8\x77\x78\x8e\xa7\x60\xd7\x81\x80\xc7\xee\x4f\x7b\xeb\x81\xa7\xc8\xfe\x83\xdf\xfa\xcf\xe2\xd3\xfb\x11\x90\x04\x01\xf0\xc5\x67\x3e\x1c\xe3\xd4\x21\x63\xc4\x67\xa2\x3f\x09\x8e\x66\xff\xcd\xc8\xae\xc1\x16\xc7\x8f\xdd\x20\x22\xc6\x09\x8e\x00\x7c\x9a\x90\x7e\x93\x2e\xae\x1f\x5c\x95\x80\xed\x67\x37\xad\x0f\xd1\xf8\x8c\xc5\xe0\x82\x4f\xc8\x74\x24\xda\x97\xf2\xd0\x7f\x7b\xfb\xf4\x89\xe1\x68\x02\x47\xed\xbc\x3f\xed\x0b\x18\xf1\xb4\x2f\xde\xa4\xf6\xe9\x71\x7a\x71\x9e\x8e\xe1\x32\x21\xc9\xd3\x14\x3e\x66\x7f\x91\x4e\xc4\xe4\x6a\x32\xed\x0f\x2e\x70\x53\x80\xd3\xc8\x5e\xe5\xc1\xf8\xdc\xdd\x26\x38\xa0\x6f\xfb\x83\xe1\xd5\x78\xeb\x88\x4d\x47\x62\x74\x99\xc2\x2b\xe1\xa8\xf9\x0d\x99\x8c\xde\x4e\x3f\xf5\xc7\xe9\x91\xe7\x24\x02\x8e\x21\xdc\x3d\x11\xdd\xd9\xcf\xbf\x88\xa5\x48\xa4\x17\xf8\x5c\x07\x30\xca\xde\x7b\x44\xeb\xe9\x83\x0f\x8a\x31\xd6\x29\xe8\x7a\xc4\xdd\xaf\xc4\x85\xba\x25\xd5\xa6\x95\xd9\x63\xca\x40\x44\xcb\xc1\xd6\x8a\x18\xcb\x2a\xc0\x50\x25\x4f\x80\xf4\xe3\x12\xeb\x68\x6b\x8f\x06\xd3\x78\xc6\x12\xf4\xe6\x00\xd8\x0e\x4a\x19\x56\x0a\x89\x05\x08\xfb\x24\x16\xef\x31\x7e\x22\x82\x5c\xc6\xd0\x8d\xdc\x19\xeb\x00\x71\x21\xdc\x0a\x9e\x00\xda\xcb\x48\x06\x1b\xe9\xe2\x2d\xa4\x0e\x71\x08\xdc\x89\x79\xad\xaa\x42\x22\x02\x56\xb2\x2b\xfb\xf3\x08\x6a\xcd\x11\x00\xbb\xba\x66\x1d\xfe\x42\x22\x64\x5d\x4b\xca\xef\x7a\x83\xcb\xb5\xcf\x44\x38\x9c\x8c\xf5\x6c\xe4\xc2\xae\xa2\x55\xff\xee\xc7\x2b\x7e\xd6\xd4\x94\x2c\x82\xf2\x2f\x4a\x53\x63\xdd\x6d\x89\xe0\x5c\x21\x9e\x17\x52\x1f\x52\x7e\x18\xb8\xa3\xd1\xf6\x8b\xfb\xdd\xe1\x55\xf0\x0e\x73\x0d\xa1\x1a\x2c\x23\xf0\x95\x1f\x4a\xec\x3b\xfb\x62\x1f\x8a\x40\xc9\xe7\x5c\x97\xe0\x5e\x41\xa5\xb9\x23\xb5\x86\x9c\x04\x65\xc1\xb4\x35\x14\x9a\x22\xeb\xed\xd9\x9d\x84\x5f\x86\xb5\x23\xb9\x03\x23\x00\x5a\x46\x0c\xb6\x09\x9d\x29\x89\x45\xa1\x08\x30\x84\x88\x07\x31\x42\xf8\xc6\x7a\xa6\xf0\x23\x6b\x33\x80\xc1\xc4\x88\xce\xce\x7d\x8c\x0e\xd5\x6b\xd7\xc9\x13\x9d\x25\x34\x9c\x03\x24\x50\x5d\xef\x3a\x02\x8f\xa3\x11\x42\x8f\xe2\x53\xed\xcf\xd7\x01\x04\x4b\xdc\xa9\xe4\xa2\xa2\x65\x25\x0e\x63\x04\x80\xa3\x6d\xb3\xbb\xb7\x35\xef\x30\xa8\x41\x1e\x1c\x60\x64\x31\x60\x13\xdb\x68\xd8\xa1\x83\xfe\x0f\x5b\x03\x56\x6e\xb1\x45\xf0\xda\x15\x3f\x53\xc5\x35\x12\x3b\x42\x2f\x2b\x43\x10\x94\x8b\x2d\xa5\x5e\x56\x4f\xd0\xe9\x13\xa5\x9e\xba\xa8\x88\x52\x0e\x60\xd3\xd6\x2b\x33\xbd\x3d\x7b\xe9\xc3\xa3\xda\x5d\x25\xf3\xa4\x0d\x0b\x3b\x33\xfc\x2a\xbe\xb6\x4e\x70\x51\xd6\x4f\x34\x95\x11\x91\x3e\x11\xbf\x10\x92\x1e\x11\x67\x21\xa2\x10\xb2\x6c\x96\x0e\x6a\x8d\x28\x1c\xe0\x04\xcf\x36\x48\xc1\x55\x95\x85\x9e\x13\xe6\xeb\x1a\x20\x7e\x75\x1e\xad\x0c\xd4\xe0\x2e\x15\x1d\x1f\xb5\x5a\xe7\xe5\x46\x55\xe2\x90\x7b\xd5\x5c\x37\x32\xf9\x2f\x2b\x55\x1d\x09\xc6\x13\x37\xd6\xbd\xca\x03\xe6\xd1\x12\x72\x82\x42\x06\x92\x20\x80\xe7\xd8\x0f\x68\x44\x18\xde\x71\xe1\xb9\x91\x7a\xe2\x3d\x21\xde\x4a\x61\x20\xca\xfd\x9a\x1a\x0a\x6b\x62\x64\x35\xdf\xef\x7d\x2e\x37\x65\xb6\x29\x14\x2f\x26\x11\x8a\xf3\x47\x4c\x8b\x45\x16\x04\x8f\x82\xf2\xa3\xbd\xe0\xc3\xe2\xff\x7a\x5b\x95\xb3\x03\x71\xe8\x7b\xdc\x61\x68\xb7\x0a\x75\xcd\x8f\x45\x39\x33\x47\x1c\xe0\xd8\x9b\x6d\xc4\x3f\xd8\xcf\x8b\xb1\x2c\xb2\x72\x25\xde\xcb\xf9\x8f\xaa\xea\xed\x61\x11\x58\x53\x81\x78\x99\x6e\xc4\x59\x69\xb7\xee\x44\xf4\xd7\x95\xce\xc5\xc9\x77\xdf\x3d\xdf\x73\x7f\x7b\x59\x29\xa3\xb9\xfb\xfd\xa3\x9e\xab\xbd\xe9\xb5\xac\x0f\x1c\x40\x10\xce\x1c\x9c\xf4\xff\xe5\x2f\x27\xd8\xf8\x37\xfe\xa7\xf7\xec\x2c\x3d\x1b\x0c\x87\xc7\x27\x5f\x9d\xf6\xc3\xfd\x79\x98\xff\xe3\x9b\xd3\x97\x27\x27\x2d\xfe\x8f\xd3\x93\x57\xa7\xbf\xf1\x7f\xfc\x1a\x7f\xce\x46\x17\xd3\x71\x7f\x2a\xce\x53\xf4\x9c\xcf\x52\xf8\x9f\xa3\x77\x83\xb3\x41\x3a\x04\x73\x39\x15\x67\xea\x0c\xbc\x99\x1b\x55\xd5\xda\x18\x08\xfa\xef\x9d\x29\x4a\x18\xd6\xc2\x5e\xeb\xa6\xa0\x82\x34\x80\xc6\x12\xc0\x6a\xae\x15\xe2\xaa\x2a\xcc\x5b\x8a\xec\xc0\x3e\x85\xa1\x38\x8e\xb0\x16\x75\xa5\x04\xd0\x13\x34\xb5\x6a\x2a\x23\xe4\x42\x17\xe2\xa7\x46\x89\x5c\x39\xb6\x2f\xc0\x44\x6c\xbe\x40\x96\x37\x33\x62\x5d\xe9\x62\xae\xd7\xca\xfe\xaf\xfb\x3b\x28\xeb\xba\xff\x93\x30\x52\x54\xf7\x77\x19\x56\x24\x40\xe1\xd2\xbf\xfe\xd3\x7f\xa6\x6f\xae\x65\x55\x27\xf6\x89\x79\x09\x12\x5b\xd7\xf7\x77\x42\x36\x22\xab\x4a\xb0\x66\x65\x71\xff\x5f\xa4\x36\x89\xa8\x25\xa4\xce\xa9\xdd\x45\x64\xfc\x88\x9d\x92\xe4\x4c\x32\xf2\xdd\xdd\xdf\x89\xb9\xbe\xb1\x66\x98\x1d\x6d\xeb\x49\xac\xbe\xbb\xbf\xb3\x4f\x59\xd1\x07\x1d\xf4\x8d\xfd\x7f\x42\x05\xcf\x30\x1c\xd0\x4f\xcd\x81\xce\x45\xb9\x58\x54\x4a\xc8\xe6\x8b\x5b\x0c\x55\x8b\x5a\xd7\x4d\x2e\x01\x77\x23\xb3\xff\x67\x3f\x62\xc4\x5a\xd6\x95\x5e\x95\x85\xb6\x4f\x9b\xa6\x12\x4d\xe1\xd6\xbc\xe7\xe7\x2e\x9b\xba\xe2\xd9\x47\xeb\x19\x2e\x62\x86\xf8\x96\x68\x6d\xda\x7f\xe2\x17\xa1\x7e\x55\xe6\x7b\x21\xe7\xf3\xfb\x3f\xdb\x3d\xc2\xe2\x4d\xb4\x63\x13\x1e\xcc\xfd\x5d\xad\x8a\x0c\x53\x39\x8b\xfb\x3b\xbb\x27\x30\x0b\x28\x2a\x35\x12\xa6\xd2\xdb\x1b\x06\x9b\x8c\x0b\xc0\xe7\x05\xcf\xd7\x89\x30\x65\x51\x7f\xbf\x77\x56\xae\x56\x1a\x4a\xaa\x65\x6d\xf7\x35\x3f\x48\x0b\x55\x2d\xb5\x12\xfd\xba\x5c\x69\xbb\xd8\xff\xfa\x4f\xff\x49\x9c\xa5\xfd\xc4\x7e\x59\x5a\xfb\x0d\xcf\x24\xe7\xa0\x32\xeb\x84\x54\x72\x5e\xdf\xff\xd9\x1e\xae\xb9\x46\xd0\x0e\xfb\x4b\xe0\xdc\x87\xff\xa5\x6a\x48\xcf\x59\xd3\x4b\xe5\x89\xc8\xca\xc2\x1a\xd0\xc2\xe8\xfb\x3f\x2f\x15\x1c\x69\xa3\xeb\xe6\xfe\x4e\xbc\x38\x39\x7e\xf1\x42\x20\x2c\x98\x1d\xf5\xdb\xfb\xbb\xec\xfe\xae\x22\x4b\xe2\xdb\x6f\xbe\xfd\xe6\xd4\x9a\x4c\x83\x89\x98\xab\x4c\x7d\x11\x27\xdf\xf4\xf6\xce\xf0\x5c\x5f\x48\x84\x36\xa1\x5f\x8e\xd5\xfc\x5a\x55\xf3\x6b\x25\x26\xe1\x98\x60\x36\x17\xe3\xc9\xae\xe9\xdc\xff\x69\xe7\x74\xec\xf9\xb0\x33\x2a\xed\x96\xfd\xd4\xa8\x07\xe7\x01\x73\xf8\xa0\xe7\xd7\x2a\x3f\xee\x17\x4b\x65\xc7\xfe\xdd\x4b\x71\x29\x2b\x6d\x78\xec\xaf\x7a\x7b\x03\x42\x5e\x8b\x46\xef\x87\xae\x0a\x31\x60\xab\x87\x86\xa0\x0a\xd1\xa7\x6a\x13\x9e\xcf\xe0\x62\x3c\xd8\xb9\x3f\x5f\x69\x42\xe7\xe5\x4a\x5a\x0f\x25\x53\xe2\x63\x99\x37\x73\x25\x9b\x44\x8c\xcb\x39\xa4\xb8\xca\xc6\x9e\xf9\x37\x97\xe2\xe4\xf9\x37\x89\xf8\xf6\x77\x27\xdf\xbc\x10\x43\x25\xce\xae\x95\x29\xe4\x06\xa7\xdb\xdb\xbb\x1c\xa7\xfd\x0f\x6f\xae\x86\xe9\xcf\x13\x67\x38\xa6\x03\xec\x7d\xd0\x0b\xf8\x05\x70\x42\xc0\xf1\x07\xd8\xd0\xf8\xf4\xe3\x69\x9f\xa9\xca\xca\x83\x4c\xc5\x1d\x4a\x28\x10\x5a\xde\x6f\xd6\xf8\x8f\x56\xf7\x77\x4b\x6d\x6f\xb1\x98\xab\xba\x0e\x06\x26\x0b\x63\x97\x66\x2e\xb3\x0a\xa5\xab\x7d\xf1\xfd\x9f\x73\x15\xdf\xe9\x7f\xf9\x6f\xe5\x5a\x15\x74\x6b\xff\xe5\x9f\x7b\x7b\xc3\x03\x2c\xa3\xc1\xc9\x59\xd7\x96\x07\x67\x60\x2e\xd2\x98\xb2\xaa\x35\xfe\x63\x85\x7d\xb2\x99\xba\x29\x75\x65\xe0\x46\xba\x26\x00\x2b\x2d\xa2\x79\x82\xf4\xce\x14\x0a\x66\x55\x41\xe3\x0b\x85\x8b\x6b\x14\x1f\x78\xfd\x4d\x6b\xbe\x46\x34\x79\x7d\x7f\x57\x69\xd5\x54\xd6\x7b\x1c\x1e\x60\xd9\xbe\x66\x51\x1b\x8b\x1e\xbb\x66\xb9\x97\x86\x19\x15\x47\x24\x4f\x5b\xdb\x9f\x1a\x6d\xcf\x6c\x76\x7f\x37\x2f\x1b\xe8\x11\xb0\xfb\xb9\x46\x98\x35\x7b\x71\xb1\x06\xc8\xfe\xb2\x38\xb0\x42\x59\x77\xec\xe8\x4f\x0d\x68\x96\xa5\x44\x5a\x78\x4c\xca\xdd\xdf\xb1\x7c\x2f\x94\x58\x58\xa9\x2d\xd6\xca\xa8\x0a\x44\x74\x7e\x80\xe2\x2f\xdc\x5b\x10\xcb\x4e\xc4\xef\x94\xf0\x34\x5d\xab\x3a\xad\x8a\x03\x62\x91\x06\x17\x68\xe1\x86\xd2\xd6\x4e\x90\x8e\x55\x56\xfb\xf4\xf6\xfa\xf6\xe8\x88\xfb\x3b\xd0\x6a\xf9\x81\x07\x38\xb6\x87\xfb\x20\x98\x18\xee\x7f\x5d\xeb\xca\xce\x05\x86\x6d\x37\x4b\x9b\x9f\x1a\x2b\xbf\x01\x09\x13\xe5\x3b\x9d\x01\xa4\xd3\x02\x39\xcd\xaf\x01\xc1\x88\xe7\xa4\xb5\x19\xcf\xca\x06\xd4\xee\xfd\x1d\xc4\xab\xd6\x28\x16\x54\x4d\x4f\x73\xa7\xc1\xd6\x0d\xb0\x67\x3f\x1e\xa6\x95\x2c\x45\x6d\x6f\x62\x71\x7f\x67\x35\xbb\x59\xdf\xdf\xcd\xed\xb7\x34\xdd\xb1\xf8\xce\x26\xb0\xeb\x6b\xd5\xd4\xa8\x08\x8b\xac\xe2\xbe\xa7\x2f\x60\x3e\xac\x64\xa1\xd7\x4d\xae\x2a\x3b\x1c\xfb\xac\x7d\x8c\x0e\xb1\xfd\x0c\x88\x2d\xd8\x1f\x37\x78\xd2\xd0\xa8\x4d\xcb\x85\x82\x8c\x4f\x61\xf5\xa6\x44\x53\x09\x42\x6b\xb8\x61\xf0\xd4\xbc\x2c\x0a\x69\x75\x5b\x31\x87\x96\x22\x2f\x46\x0d\xa2\x2b\x2e\xca\x22\x83\x6a\xe7\x61\xfb\x62\x59\xdd\x88\xc3\xd0\xc5\x8d\x86\x9b\x6a\xc5\x28\x6c\x41\x85\x62\x13\x70\xb3\xf3\x03\x99\xdd\xdf\xfd\xd4\x48\x5e\xc3\x21\x2f\x83\x5d\x62\x78\xd5\x4c\x99\x12\x6e\xb4\x2c\x0c\x0f\x8b\xb3\x5e\x6b\x55\xad\x54\x8d\x4b\x7b\x20\x8d\x69\x2a\x00\x89\x15\xe6\xfe\x6e\xde\x54\x6e\x69\x71\x48\x1b\x53\xdf\xff\xd9\x7a\x63\xaa\x16\x10\x84\xa4\x7f\xc0\x4d\x81\xbf\x27\x54\xd4\xe5\xfd\x5d\x61\x75\x66\xbe\x7d\x5c\x70\xf4\xf9\x81\xfa\xb2\xce\x4b\x0d\xd0\xdf\x28\xd6\x8c\x58\xdd\xff\xd7\x55\x54\x4b\x66\xef\xbf\x1b\x48\x4f\x04\x32\x1b\x36\xf6\xfe\xbf\xd6\x40\x92\x05\x87\x48\xc3\xb9\x42\x21\x78\x7f\x87\x87\x80\xa8\x83\xcb\xc6\x04\x5b\x0b\x96\x26\xd4\x46\x80\xb8\x52\x85\xc8\x0f\xec\xe9\x02\x83\xb1\x30\x42\xfe\x50\x36\xb5\x28\x34\x74\x51\x56\xb8\xc9\x20\x71\x72\xd9\x18\x88\x74\xc5\xaa\xc3\x34\x06\xb2\x6e\x33\x14\xc3\xe6\x00\xf2\xbe\x3f\x35\xaa\xb2\xd3\xae\x01\x3d\x97\xf7\x84\x95\xdb\xe3\x12\xc0\x0a\x2b\x9d\xe1\x1b\xcb\xc6\xee\x51\xa5\xfc\xaa\x51\x31\x80\x7d\x4e\x9b\x75\x69\x68\xbd\xd0\xac\x04\x5a\x6d\x20\xfc\xed\x57\xb5\x9e\xe7\x4a\x9c\xa8\x4a\x1c\x8b\xf3\xf4\xed\xe0\x82\xc2\xce\xe7\x76\xa6\x73\x37\x91\x04\xd6\xbf\xb6\x87\xc1\x4a\x1a\x7d\x63\x45\x4e\x22\xf2\xb2\x32\xf0\x4e\xa0\xf7\xb2\x63\xbf\xbf\x9b\x57\x76\xac\xf2\x46\xcd\x51\x69\xe2\xc8\xe6\x72\xad\x6b\x09\x40\x5a\x0d\x3c\x68\xcf\x10\x37\xf0\x63\x39\x11\xbe\x55\x59\x83\x0f\xbe\xf9\xbd\x9d\x23\x54\x32\x8b\x9c\x15\x88\xeb\x7a\x41\x9b\x19\xf5\x5e\x02\xfe\x82\xbd\x85\x05\x9a\xd4\xc6\x57\x13\xac\x4b\xe3\xd5\x88\x3d\x00\xb2\x28\xd4\x17\xd0\x28\xb4\xe6\xf1\x67\xdc\x4e\xc0\xa1\x30\x12\x01\xd9\xed\xc7\xce\xac\xb6\x19\xcd\x7e\xb0\xf6\x0d\xc8\x2d\xfe\xbb\x49\xa0\x81\xc4\x5c\xda\x91\xcc\xaf\xef\xef\xec\x95\x31\xd2\x31\x0c\x92\x14\xa4\xb3\x4c\x02\x0b\x54\xe0\xaa\x04\xa1\x07\x82\x97\x6a\x92\xe9\xae\xf2\x4a\xa0\xb8\xa3\xc0\xa2\x15\xb7\x7e\xf4\x62\x50\xe8\x5a\xcb\xd6\x2c\x86\x0f\xcf\xc2\x8f\xb8\x3d\xaf\xbf\x7c\x0a\xf6\xef\xd7\x95\x5a\x69\xb0\xe5\xbc\xcd\x01\x23\x09\x0e\x51\xd6\x08\x9a\x5d\x30\x99\x0f\xa0\x1d\xee\xef\x76\xcc\x66\x45\xff\x0c\xeb\x01\x9f\xd5\x50\xf5\xa9\xf0\x55\xae\xa7\x30\x98\x64\xf8\xa6\x03\x55\x18\xb5\xc2\x6b\x68\x00\xfb\xa9\x6a\xa8\xb0\x98\xa4\x76\x6e\x1f\x34\x68\xaf\x50\x50\x2d\x12\x99\xf6\xfc\x34\x3f\x35\x56\x87\x1c\x90\x0b\x64\x6f\x78\x71\x7f\x07\x91\x32\x7b\x5f\x55\x21\x6e\xd0\x35\xa0\x6e\xce\x2a\x9c\x02\x8d\x0d\x96\x3b\x9a\xa4\x11\x0b\x3d\xbf\xd6\xca\x8a\x63\x5d\xa0\x7b\x67\x9d\x64\x76\x8d\x42\xa8\x68\x58\x3a\x37\xc3\xde\xde\xd4\x09\x8b\x78\xdd\x32\xf0\xc3\xd0\xc2\xd8\x25\x45\xd8\x04\x41\xc5\x2e\xda\xc7\xaa\xb7\xe7\xce\xdc\xa1\x39\x8a\x5f\x0f\x4c\x5d\x91\x56\x3a\x34\x47\xd1\x72\xc9\x8d\x2c\xb8\xcc\xdf\x8a\x5c\xe5\xb7\xdc\x6d\x98\x6a\xaa\xd6\x6e\xf3\x07\x05\x5b\x47\x07\x0f\x6e\x35\x5b\x40\xf1\x5b\xfc\x9a\x40\xad\x65\x53\x43\xbf\x93\xb1\xea\x18\x51\x7c\xad\x73\x01\x94\x76\x56\x09\xb9\x90\xbb\x44\xf1\x1b\xdf\x9f\xce\x71\x03\x36\xed\xce\xc3\x15\x41\x02\x24\xd8\x39\x3e\xe7\x6a\xe3\x4a\x92\x49\x63\x12\x21\x33\xb9\x66\x42\x73\x14\x2b\x45\xd9\xdc\xa0\x10\x5b\x94\x08\xde\x51\xc8\x1c\x15\xbc\x2e\xea\xfb\xbb\x65\x05\xaa\x94\x6d\xfd\x61\x68\x12\xd9\x89\x46\x4b\x9b\x08\x6b\xab\x6b\x8a\x9f\x18\x7b\xc1\x00\xd7\x7c\x52\x93\x99\xd1\xdb\xc3\xbf\x0a\xa6\xd2\x14\x22\x98\x8b\x3f\x97\x68\x69\x1b\x01\xe4\xe7\xeb\x4a\x93\x10\x88\xa4\x83\x35\x94\x12\xd8\xa6\x45\xa9\x0d\x9d\x5a\x6b\x8f\x95\x84\x3c\xac\x84\xfa\x62\x35\x36\xb5\xad\xa2\x79\x01\x26\xf9\xfd\x9d\x44\xed\x9f\x75\x4d\xbd\x6c\xf6\x88\x40\xd2\x20\x7a\xc1\xfd\x1d\x7c\x14\x2e\x8a\x35\x7c\x54\xf3\x45\x2c\xca\xa6\x2a\x10\xba\x26\xbe\x74\x38\x47\x71\xbe\x29\x24\x04\x0c\x82\xd9\x82\xfe\xc5\x7f\x4f\xc4\xbc\xba\xbf\x23\xf1\x92\x07\x27\x0d\x16\x52\x17\xd9\xfd\xdd\x5a\x15\x68\xbc\xf9\x53\x9e\x88\x5a\xe5\xb0\xc0\x73\x45\x2f\x22\x41\x1a\x9c\x22\x2b\x48\xfd\x12\x70\xf8\x2a\x58\x0a\x13\xbd\x1f\xd8\xad\x84\x39\xa0\x07\x40\xb6\x4a\x38\xff\x42\x99\x35\xa0\xcd\x1f\x48\x28\x6c\x93\x00\x49\xe7\x7f\x99\x58\x3b\x0a\x20\x6d\x55\x0e\x87\x99\x42\x3e\xdb\x42\x9a\xde\x0d\xb7\x88\x86\xcd\xa7\xa2\x7b\x79\x1e\x58\x1d\x98\x30\x5e\xd9\xf8\x40\x36\x85\xc8\xb5\x75\x35\xe9\xcd\x60\x68\xe3\x25\x03\xe7\x2a\x43\x60\x95\x5a\x04\x6b\x0b\x13\x40\x6d\x68\x87\x0e\x66\x5d\xf7\xba\x92\x2c\xd6\x39\x48\x61\x3b\x80\x04\xd7\xba\x52\xcb\xaa\x6c\xd6\xe0\xbe\x16\x76\x10\x46\x35\x79\xb8\xdc\xbd\xbd\x4b\x6c\xeb\x08\xa6\xea\x61\x2d\x61\x9d\x22\x51\x84\x1f\xf6\xc2\xc6\x1a\x79\xde\x1e\x3a\x50\x58\x84\x8b\xa1\x42\xa3\x8b\x65\x93\x6b\x20\x7d\xb0\x0a\x44\x36\xd6\xe6\xad\xe0\x20\xb2\xc1\x75\x2a\x8e\xc5\xe8\xcd\x3f\xa4\xd3\xbd\xa1\x13\x2e\x90\x8f\x85\x8e\x06\xbb\x20\x20\xf3\x8b\x39\x99\x97\x7e\xcd\x69\x00\xb0\xd2\x6e\x78\x18\xd4\x1c\x52\x18\xa0\xe0\x4a\x55\xa3\x6f\x14\x51\x37\x2c\xac\xb5\x3d\xc3\x25\x5c\x59\x03\x1a\xa4\x5e\xb0\x5b\x10\x92\xc4\xc8\xe5\xfd\xdd\x42\x17\x5a\x89\xb9\x3e\x96\xeb\xca\x2a\x39\x30\xcf\x25\x8d\xfd\x1b\x1c\x26\x0a\xd5\x5c\x8a\xac\x01\xd7\x10\x95\x26\x07\x30\x43\x85\x53\x56\xe0\x3f\x58\x15\x33\x0f\x6f\x25\x2f\xc6\x0b\x71\x2c\xfa\x67\x67\xe9\xe5\xd4\x11\xbc\xbc\xe8\x9d\xf4\xc4\x30\x32\x87\xda\x36\x10\x7c\x62\xcb\x98\x80\x93\x50\xdd\xdf\xad\x1b\xf0\xbd\xe5\xfc\xa7\x46\x1b\x98\xe9\x42\x6a\xb8\xb7\x60\x9c\xb0\x98\x91\xc0\x71\x40\xf6\x2c\x37\xb7\xfe\xeb\x3f\xfd\x67\x71\xa8\x8f\xc0\x16\x72\x2e\x6d\xb4\x58\x2c\x6b\xc5\xaa\xdc\xa8\x42\x14\x65\x6d\x4d\x85\x02\x0d\xb5\xfa\xfe\x2e\xb7\xf6\x93\xfb\xe5\xfd\x9f\xb0\x6d\xa1\xc2\x90\x0c\xf8\x15\x0d\xb6\xb3\xd9\x75\x29\x1b\x0c\xe5\xec\xfe\x41\xb3\xb6\x6b\xe8\xf4\xd6\xeb\x68\x9c\x38\x50\x9e\x95\x8b\xe3\x74\x2c\x17\xde\x2c\x7b\x65\xe6\x65\x01\x3b\xed\x37\x89\x22\x09\xf6\xc6\x84\xf7\x5b\xd6\x84\x6b\x7a\xda\x13\x57\xd0\xa5\xbd\x5a\x93\x5f\xe2\x96\x3c\x21\xa4\x0c\x89\xcd\xb3\xb4\x12\x56\x08\x85\xf9\x01\x51\x29\x6b\xbe\x2c\xc0\x29\x89\x7c\x73\x13\x4b\x53\xf6\xfc\x5d\xdb\x97\x1d\xb9\x8b\xaa\xb8\xd0\x40\x50\xf3\x7c\xff\x27\xfb\x35\x24\xec\xb7\x83\xdf\x0a\x42\xa9\x2f\x6b\xeb\x03\xd8\x61\x40\xa8\x42\x60\x1c\x7e\xa5\xe1\x64\x07\x1e\x12\x8c\xc4\xad\xd8\x1a\x74\x92\xbd\x35\xbc\x2b\xc6\x3a\x55\xc1\x99\xec\xb8\x34\xd1\x55\x79\xd1\x3b\x11\x73\x6d\x07\x64\x2d\x39\xd5\x12\x2a\x95\x02\xff\xff\xfe\xbf\x43\xc4\x54\xde\x94\xda\x9a\xce\xba\x15\x16\xf0\xf7\xe4\xa5\x38\x16\xe9\xc5\x74\x9c\xa6\x22\xbd\x10\x1f\x07\xef\xae\xd2\xab\xb1\x48\xa7\xe2\xfc\x6a\x9c\xa6\x88\xa6\x79\xd2\xdb\x7e\xc4\xfe\x4b\x20\x66\x30\x14\x6d\xed\x54\xbd\x6c\xc0\x8c\x87\x05\x05\xdc\x7a\xf0\x26\xe3\x39\x6e\x1d\xa4\x8e\x49\xab\x02\x6e\x2c\x0e\xe1\xb4\xe7\x07\x14\x7c\x16\x9d\xf0\x4a\x82\xb3\xa6\x16\x0b\x65\x45\x03\x89\xfc\xb6\x2c\xc9\xef\xef\x96\x32\x7f\x48\xa6\x84\x46\x6c\x28\x60\xf2\x2e\x01\xf3\x8d\x5d\xb8\x69\x7a\x71\x7e\x95\x8a\xf3\x74\x22\xce\xc7\xa3\xc1\x74\x22\xce\x46\x17\x67\xe9\x79\x3a\x21\x19\xcc\x92\x15\xae\xc2\x9f\x33\x15\x89\x58\x0c\x17\xe1\xba\xa8\x24\x8c\x35\xb2\xf4\xd8\x32\xa1\xbd\x94\x84\xa8\x4a\xad\x0b\x67\xe7\xe1\xbf\x05\xb2\xd3\xcb\x2f\x17\xec\x08\xc2\x1c\x5e\x10\x5b\x93\x5e\xea\x3c\xb7\x26\x20\xe8\x30\x61\xff\xcb\x1e\xf2\xa4\xa5\x1f\x3a\x67\x01\x01\x07\x6d\xb7\x7f\x59\xc9\xb9\xb6\x36\x48\x18\x35\x8d\xa3\x07\x59\x83\x41\x1c\x23\x66\x95\xba\x51\x35\x87\x0f\xec\x18\xa0\xa3\xd4\xd0\xfc\x48\x82\x61\x84\x14\xe0\xf9\x31\x96\x68\xf6\xf4\x8a\x0d\xb5\x4e\x9b\x95\xd0\x33\x4f\x7a\xbc\x23\xe7\x07\x57\xd3\xc1\x70\x30\x71\x7a\x60\x18\x29\x61\x83\x5d\xac\x95\x36\x38\x15\x17\x30\x0a\xde\x49\x41\x9a\x50\x7e\xfc\xd4\xa0\xc2\xfc\x22\x32\xcc\x10\xd8\xa9\x06\xfd\x3f\x09\x07\x0f\xfd\x3a\xdb\xab\x3f\x87\xcf\xa0\x61\x47\x1e\x58\x59\xd5\x8a\xb5\xc4\x49\x6f\x2b\x42\x69\xad\x59\x59\x58\x63\x00\x96\xa4\x2a\x6f\xb4\x29\x49\x58\x7a\x1f\xb2\x68\x2f\x5a\x4b\x9b\x28\xb2\x15\xf1\x52\x80\xc5\xc8\x68\x05\xa7\xbd\x58\x29\x59\x6b\x4f\x2e\xac\x85\x2e\x97\xf6\x54\x1e\x78\xa3\x2e\x41\xff\x4c\x98\xba\x9c\xff\x68\x25\x63\x38\x06\xb7\x73\xa4\x5a\xf8\xfd\x2f\x60\x4e\x58\xff\x47\x41\xe3\xec\x40\x15\xa2\x9c\x61\x30\x2c\xc1\xff\xbc\xbf\xab\x9b\x4c\xdb\xff\xb4\x07\xc4\xfe\x0d\x07\x1b\x95\xb7\xdc\x89\x8f\x8d\xe2\xff\xe0\x8b\x56\x2b\x5d\x28\x0c\x20\xeb\x8c\x02\x82\x41\xde\x11\x6c\xde\xb2\x60\x09\x3f\x93\x86\x42\xee\x1a\x57\x1e\x54\x97\x00\xed\xca\x96\x6c\x60\x4f\xbc\xb6\x2f\x9b\xab\xb9\xe6\xb0\x54\xcb\x9b\xc4\xba\xba\x46\xd1\xba\x96\x6b\xce\xd9\xc1\x7b\x82\x25\xcd\xc2\x25\xcd\xa2\x25\xcd\x14\x5a\x53\xdc\x30\x8f\x51\xa0\xce\x25\xc6\xbb\x62\x8f\xac\x2a\x38\x13\x7c\xc0\x63\x80\xa8\xa2\xd5\x8e\x4d\x14\x07\x81\xdb\x70\x4a\xb7\x41\x9c\x1f\xf4\x2f\x2f\x47\xe3\x69\x3a\x06\xa1\x05\x99\x79\x22\xc5\x9b\xd0\xdd\xe0\xf7\x4a\xd8\x45\x32\x6a\x22\x17\xd5\x1d\x5b\x08\x08\x70\x42\x1a\x5c\x50\x5d\xc1\xfc\xc0\x03\xc5\xad\x85\xa2\xb0\xa5\xaa\x70\x5b\xdd\x4b\x71\xc1\xd0\x8f\x88\xe2\xf7\xad\xd0\x48\xf8\x05\x0e\xba\x56\x71\x04\x47\x15\x10\x68\x85\x2e\x5e\x9c\xf0\xc3\x37\xbc\x35\x86\x70\x6a\x91\xaf\xb1\x15\xc2\x5d\xa1\x08\x2a\x60\x62\x4a\x2c\xe4\xfd\x7f\x29\x7d\xb7\x17\xe0\x90\x59\xbb\x6d\x05\xd7\xd1\xde\xfd\x9f\x1a\x97\x8d\x51\x94\x56\x8b\xbe\x86\x26\x39\x2b\x49\xeb\x0a\xf9\xc3\x63\x15\xe2\xf1\x5c\xd3\x06\xbe\xf0\xe2\x2c\x8d\xa9\x0c\xd3\x29\xfe\xd5\xdb\xb7\x57\x13\x2f\xe0\xdc\x9a\x45\x39\x29\x55\xc7\x39\x3b\xb7\x8f\xde\xc4\x6a\xed\x68\x61\x28\x0a\xac\x28\xf9\xb8\x5a\x35\x05\xc6\x99\x63\xa7\x89\xd3\xae\x6d\x29\x00\xb7\x31\x96\x45\x61\xf4\xc0\x7f\x8c\xbe\x43\x0a\x6f\x25\xab\xf9\x75\xa8\x5b\xca\xe2\xfe\xae\xb2\xba\xa5\x6c\x80\xe9\xbf\x41\x68\x6e\xd6\x26\xde\x88\x34\xdd\x46\xf5\xba\x2a\xd1\x16\x7d\xc2\x01\xf1\x99\x3c\x3a\xfd\xdc\x14\x1d\x9a\x94\x2e\x6e\x08\xe1\x15\xcc\x45\x81\xf7\x00\x71\x8d\x9f\xa3\x71\x51\x4c\xda\x3d\x3e\xe9\x85\xe5\xf8\x76\x77\xcf\xaf\x7c\x9d\xcc\xa4\x7f\x31\xd9\x62\xad\xfc\xc5\x93\xa1\x22\x95\xf6\xb4\xe2\x88\x42\x18\xd9\x0d\xa2\xd3\x10\x6a\x84\x19\xbb\xe9\x91\x4e\xb3\x47\xbc\x95\x08\xa5\x7a\x10\x8c\x15\x45\x99\x83\x6d\x0b\x05\x0e\x4f\x8d\xf1\x19\xd4\x59\xba\x66\xf8\x9a\x65\x71\x7f\xe7\x14\x25\xea\x4a\xf0\x64\xba\xfd\x07\xff\xdc\x29\x3d\xd7\xed\x39\x3c\xea\x19\x64\xdb\x39\x4f\xfc\x0c\x1b\x45\xde\x74\xb5\x0a\xfe\xa6\xa1\xe2\x1a\x34\x13\x8d\xf8\x9d\x7d\xc9\x77\xc1\x78\x20\xf3\xa7\x92\x20\xb1\x6e\x44\x79\xff\x3f\x30\x9c\x90\x47\xb1\xf3\x48\x16\x5a\x1f\xd4\xad\xac\x35\x1e\x23\x4d\x44\x39\x35\xfc\xf8\xa2\xa9\xad\x8b\xe2\xfe\x15\x6c\x93\xb9\x1d\xb0\xaa\x10\xef\x88\x14\x69\x14\xf4\x65\x84\xc6\xb6\x65\xa1\x8b\x4c\xff\x44\x51\x4c\x88\x42\x72\xfc\x2c\xa3\x78\xb5\xb3\x75\x30\x64\xd1\xf0\xdd\x9e\x97\xf7\xff\x5c\x3b\xb2\x8e\x42\xe5\xf0\x0b\xeb\x3c\xeb\x8e\x98\xb3\x80\x2a\x8b\x9b\x4a\x8a\x35\x20\x05\xd1\x70\x73\x22\x01\xe7\xd7\xb1\x5c\x5a\xa8\x0a\xe3\xeb\x9c\x08\x0c\x2f\xd2\xe9\x83\x17\x09\xef\x50\xca\xd7\xa7\x4b\xb1\x93\x8e\xd8\x0a\x0e\x87\x0a\x22\x69\x5f\xf0\xce\x02\x8b\xad\x3c\x04\x9a\x23\xd2\xda\x13\x90\x65\xd3\x46\x51\x30\x84\x42\xb1\x74\xfc\xb3\xdd\xd7\xa5\xf7\xf3\x6f\x7e\x28\xad\x79\x24\xbf\xdd\xf6\x27\xde\xf6\xf9\xaf\x7e\xdb\xdd\x61\xf9\x1b\x5d\x7b\xff\xfd\x7f\x97\xf7\xff\xc5\xf6\xfd\x4f\x41\x77\x5e\x0d\xad\xab\xfe\xf9\xa2\xff\x61\xf0\xc7\xab\x74\xf2\xa0\x08\xf0\x45\x18\xf7\x77\xd6\xd4\x68\x07\xfc\xb7\xae\xbf\x3f\xe0\x45\x98\x92\x47\xe6\x39\x4c\x28\x6c\xbd\x24\x28\x19\xc1\xca\x02\xbf\xd5\x78\x3b\x9b\xa2\x23\x3b\x0d\x36\x9c\x35\x88\x8a\x3a\x9c\xf6\xcb\x9e\x38\x1b\x7d\xb8\xec\x4f\xb1\x2b\x2c\x15\xfd\x8f\xe9\x99\x18\xf6\x5d\xd9\xed\xbb\xcb\x21\x3d\x7e\xde\x3a\x8f\x91\xb7\xfb\xa1\x6d\xdb\x60\x4d\x3d\x25\x8a\x28\x36\xc6\x95\x52\x2b\x6d\xb6\x8b\x02\xe2\xda\xcb\x77\x97\xc3\xd6\xb9\x7d\x44\x58\xf9\xc4\x17\x26\xcb\xa2\x57\xf5\x1e\x9f\x82\x9f\x81\x1d\xf5\x9f\x97\x95\xfa\x6b\x8f\xb8\xeb\xdb\x9d\x63\xe7\xf8\xd1\x2b\x71\x2c\x2e\xc7\xa3\xcb\xf1\x20\x9d\xa6\x62\x70\x31\x4d\x87\xc3\xf4\x6c\x7a\x65\xff\x1f\x02\xac\x9f\xf4\xc4\xe4\x6a\x2c\x86\x41\xa9\x34\x94\x52\xf4\x87\x64\xc2\xfa\x7c\x24\xd4\x06\x3e\x9e\x99\xdd\x95\x90\x15\x53\xf0\x84\x82\xd2\xaa\x48\x18\xd0\x63\x58\x78\x82\x1a\x0b\xcb\x97\x7d\xa1\x6f\x78\x0d\xc8\xf4\xfd\x89\xca\x26\xa2\xc4\xa9\x04\xd8\x11\xa3\xbd\x1f\x02\xc0\xaa\x85\xf8\x7f\xff\x53\x73\x83\x6e\x46\xd1\xe4\xe4\x17\x16\x07\xd2\x2e\xdf\x42\xce\xa1\x6e\xaf\x95\xff\x6e\xab\xde\xb0\xbc\x38\xf4\xe1\x7d\xda\xb9\xbd\x6a\xe6\x40\x15\x4b\xeb\x63\x43\x65\x16\x80\x9e\x68\x8c\xa0\xf9\x57\x05\xcb\xa0\x69\x19\x5c\xd5\x41\xf7\xdd\x87\x88\x41\xd2\x8e\xc6\xdd\xd8\x63\xd3\x8a\xe4\xbe\xec\x9d\x12\x96\xfe\x29\x6f\x75\xa7\x4b\x1e\x96\x20\x3e\x50\xf3\xcd\x75\x74\xb1\xaf\x8e\xd6\x06\x34\x0d\x52\x49\x5d\x58\x07\xb4\xab\x0c\xc8\x68\xab\x80\x31\x4e\x2b\x21\x74\xaa\x99\xa9\x9b\x82\x5c\x0c\x2a\xfb\xca\x0a\x5b\x1e\x7c\xb7\x84\x8d\xcc\x14\xcc\xdf\x3f\x26\x5a\xa1\xd9\xb1\xab\x5e\xe9\xf1\x25\xe8\x10\xb2\x76\x4f\xac\xd2\x57\x5c\x5a\xdb\xc0\x31\xfc\x42\xba\x1d\xb6\x0d\xea\x5f\x8d\xe1\xf2\x14\x3e\x01\x34\xc7\x97\x3d\xeb\x75\x5f\x8e\x26\x58\xca\x64\xc5\xec\x87\xab\x0b\xa7\x40\xec\x03\x27\xbd\x78\xa2\xee\x74\x11\xe8\x25\x06\x98\x62\x93\xe6\xfe\x4f\x02\x1a\x07\x30\xff\x5c\x21\xab\x71\xe3\x4f\x79\x86\xf1\x29\x3b\x85\x95\x2c\xb0\xfc\x85\xb2\xc2\x60\x2c\x81\x42\xa6\xc0\xe8\x23\x4b\x63\x2d\x5a\x03\xf1\xb1\x96\x14\x78\x1d\x19\x4f\x20\xd8\x5c\x98\x05\xcd\x52\xe0\xa3\x24\x85\x97\xe9\xfa\xe9\xdf\xe4\x13\xb9\xed\x3f\xf7\x82\x85\x3b\xdd\xb5\x70\x7e\x75\x28\x60\x23\xeb\x1a\x4a\x4d\x13\xc2\x27\x23\x94\xb9\xc6\x41\x94\x51\xb4\x0d\x0e\xf1\x53\xce\x4b\xd6\x84\x42\x94\x2a\xb0\x4c\x94\x86\x36\x94\x1e\x5a\x63\x39\x67\xb2\x55\xcd\x44\x85\x86\x54\xf6\x4a\xc9\x0e\xae\x0b\xc9\x39\x58\x8f\x3b\x65\xa0\x62\x2c\x28\xed\x31\x28\x27\x5c\x11\x64\xdc\x3e\x91\xc1\x0c\xbe\xd6\x44\xbc\xee\xf9\x56\x1c\x13\x52\x41\x3a\x11\xfd\xc9\x64\x74\x36\xc0\xa3\xfc\x2d\x9d\x62\x67\xc7\x1c\x00\xa6\x1d\x24\x63\x64\x33\xb7\x3a\x54\x9a\x56\x52\x80\x6c\x6a\x2c\xb5\x70\xf1\x2b\x7b\xe4\xb9\x06\x05\x8a\x3c\x35\x82\x9b\x05\xcd\x11\xe8\x62\x90\xe0\x85\x7f\x6b\x1f\x90\x33\xe5\xf2\xf7\xd1\x27\xa3\xbb\x8c\xeb\x52\x1a\xac\x02\xaf\x37\x6b\xcc\x38\x51\x61\x07\x56\xb9\x52\x4a\x57\xd5\x91\xcc\x86\x04\x37\x1a\xf4\x9d\x03\xa4\x75\x0c\x1e\x0b\x07\x4b\xc5\x89\xe8\xc8\xb9\x50\x34\xd8\xc5\x54\x56\x21\xad\x1f\x64\xee\xef\xd6\xb2\xc2\x4a\x52\x03\x7f\x65\xda\xd3\xa6\x92\xe5\xae\x21\x14\x74\x17\xe0\x53\x70\x05\x25\xb8\x0e\x8f\x05\x25\xb0\xb6\xd8\xf0\xd2\x10\xd6\xf5\x69\x4f\x9c\x2b\xac\x78\x4d\x30\x2c\x16\xfc\x04\xcb\x1d\x5a\x4b\x9a\xb8\x6a\xbf\xce\xaf\xc2\xd9\x37\x50\xe4\xe6\x7c\x8e\xb0\x60\x1d\xad\x5b\x37\x09\x89\x53\x68\x28\x9c\xee\x1a\x9e\x76\xfa\xcc\xb4\x03\x9d\x8e\x09\xaa\xd9\xae\x40\x1b\x86\xc9\x4d\xd9\x5c\x4b\x5d\x43\xad\x87\xf5\x90\x42\x37\xaf\xe5\xc8\x2c\xb4\xdd\x08\x10\xaf\xc6\xa5\x2b\x03\x2c\xb7\x05\xae\x3f\x36\x63\xd4\xe4\x60\x86\x9b\x4b\xf9\xcf\xf8\x94\xb6\x52\xb3\xfe\xfa\xfd\x4e\x1c\x8b\x71\x3a\xb9\x1c\x5d\x4c\xb0\x3f\x3a\x45\xcc\x65\x6b\xf0\xb5\x62\xce\x6d\x1f\x5a\x05\xe6\xc3\xef\x7a\xa7\x89\x30\xba\xf5\xd5\xc2\x15\xf8\x80\xe4\xec\xc8\xa5\x85\xe8\x96\x2e\xfa\x60\x5c\xbb\x45\x9c\xaa\x4f\xda\x4e\x51\x60\x90\x75\x54\x39\xaf\xab\xb2\xb9\xc1\x6a\xee\x85\xb4\x63\x88\x8f\x25\x21\x64\xd9\x9f\xc2\x32\xe7\x18\x39\xaf\x48\x82\x00\x46\x39\x9d\x01\xeb\x5e\xff\xd0\x64\xda\x11\xb5\xf0\xb6\x36\x33\xaa\xba\xb6\x5b\xa2\x73\x17\xce\x97\xd8\xee\xa6\x1a\x02\xe2\xfe\x1d\x28\x96\xed\x7e\xba\x78\x44\x78\xea\xa9\xab\x02\xba\x20\xe0\xa8\x22\x67\x33\x24\xce\x55\x8b\xcc\x3b\xb2\xf4\xac\xa3\x27\x9b\x4a\x6a\x76\xdf\xe0\xe7\xd0\xa1\x51\x88\x4a\x6a\xcc\x08\x50\x70\xfd\xfb\x43\x7d\x44\x2e\xeb\x6a\x25\x97\xa0\x11\x5d\xe8\x27\x4c\x09\x41\x54\x44\xf9\x6d\xcb\x73\xec\x3a\x31\xad\xdd\x6b\xa7\xd1\x13\x2c\xdd\x88\x3f\x01\x8b\x67\x42\x2d\x69\xb8\x2b\x45\x72\x89\x70\x68\xf9\x93\xea\x20\x86\x0d\xec\x22\x88\xf3\x7c\x33\xbd\xfd\x69\x5f\xb6\x6d\x3d\xdf\xa5\xa6\x5b\x12\xb5\x2c\xb0\x83\xd1\xaa\x87\xa4\xc0\xf9\x02\x88\xf2\xc2\xe7\x73\x14\xd9\x87\x7a\x6b\x52\x5f\x65\x26\xa8\x1a\xa8\x66\x0b\x60\x31\xb4\x2a\x00\xc8\x35\xb2\xd8\x40\x66\x51\x0e\xc1\x1d\x49\x92\x18\x68\xae\x41\x49\x56\x05\x64\x14\x87\x76\x5d\x30\x46\x05\xc5\xa1\x98\xd9\xe1\x10\x45\xe2\xff\x6a\x06\xcd\x0a\x0b\xa4\x38\xa2\xbf\x8d\x52\xe5\xc1\xb3\xf3\x5c\x2b\xeb\xc6\xe6\xac\x33\xed\x07\x65\x91\xd9\x9f\xae\x24\x54\xdd\xdc\xff\x49\x2c\xe5\x12\x32\x53\x75\x55\x36\xc8\x5d\xe3\x46\xe5\xcb\x73\x8e\x7c\xe9\xaa\xa4\x00\x98\xae\x34\x1c\x58\xec\x4a\x6a\x85\x97\xb0\xdc\x0e\x72\x1a\x50\x92\x03\x5d\x7b\xe0\x4c\xd3\x5e\xb8\xad\x80\xdb\x70\x50\x82\x17\x67\x05\x0f\x26\x76\xac\x39\x19\xdc\xeb\xad\x92\x33\x2f\x14\xbf\x13\xc7\xe2\x5d\x1f\x71\xa1\x10\xb1\xbc\x6d\x50\x07\xa5\x2d\xa0\x46\x0e\xa8\x54\x1c\x6c\xa0\x8e\xd6\x97\xb0\xe7\xcf\xb8\xa6\x3f\x6a\x84\x89\x4a\x17\x25\xc8\x41\x7b\x65\x01\x87\x35\xdf\x76\x81\x0b\xc5\x65\xa5\x30\xb7\x20\x3d\x0d\xfa\x40\x15\xe2\xe6\xfe\xae\x42\xa3\x3d\xb0\xf8\x82\xd3\x68\x44\xa1\x5d\xd2\x7a\x8e\x5d\x34\xea\x0b\x00\x87\x42\xe9\xa5\x6b\x35\x80\x33\x6d\x85\xa7\x81\x6a\x35\xdf\x44\xd5\x44\x72\x18\xcd\xc0\xa8\x89\x6a\xae\x10\x7c\xe5\x2f\xe9\xa8\xfa\x8b\xdb\xa9\x82\x64\x35\x65\xde\x49\x3f\x50\x37\xd1\x76\x37\x1f\x46\x6a\x11\xf4\x36\x17\x95\xca\xef\xff\x7c\xa3\x76\x34\x43\x47\x8b\x90\xd1\xa1\xbd\xff\x7f\x72\x82\xe2\xb7\x6b\x6f\x30\xcd\x68\x92\xed\x36\x25\xee\xd9\x21\xa3\x85\x7a\x94\x30\x6f\x3b\xb3\x7a\x3e\xae\x33\xc0\x78\xb0\x71\x2d\x4a\x28\xde\x00\x7d\xa8\x31\x8a\x02\x95\x70\xbd\x49\x2c\x41\xe1\x10\x59\xfe\xd8\x18\xd2\x7c\x11\x33\xad\x08\x12\xf2\x3b\x72\x75\x02\xf5\x63\xc5\x57\x2e\xd1\xe6\x9a\x41\x21\xf9\xa2\xd4\x4e\x95\xf8\xec\x28\x45\xa0\xe3\xd8\x58\xe0\x16\x47\x0e\xbe\xdb\x02\x20\xa0\xa9\xda\x55\x74\x41\x75\x0e\x44\x25\xda\xa5\x98\x47\x34\xd8\x17\x8f\xdc\x3f\x15\x27\xa7\xb0\x50\x5a\xfc\xcb\x7f\xf3\xcd\x4d\xff\xf2\xcf\x1d\x45\xa6\xd8\xef\x04\x01\x1e\x6f\x26\x92\xc4\xc5\xca\x7a\x89\xd9\x74\xaa\x92\xc9\x7d\xa8\x3d\x1a\xe7\x77\xbd\x53\x90\x39\x6e\x5e\xf4\xe2\x79\xd4\x31\x69\xaf\x82\x91\xe2\x46\x52\x71\x30\xcb\x44\xca\xd6\x87\x2d\xc2\xd8\xf4\x65\xac\x1a\xd5\x45\x51\xde\x70\x1d\x25\xe3\x7b\x23\xac\x67\xe1\xe0\xa2\xa1\x58\xa5\x65\x7c\xb9\x2f\xa3\xa0\xe8\x5a\x27\xd0\x0e\x20\x34\xaa\x0a\x8a\xc0\xf1\x58\xf9\xb3\x57\x49\x9c\x0a\xa0\x99\x54\x0d\x71\x1b\x91\x6e\xb5\xff\x1a\xe0\x45\x42\x4b\x94\x5d\xed\x9f\x1a\xbd\xf6\x35\xa5\x61\x8d\x31\x01\x12\xe8\x65\x43\x42\x98\xdb\x91\x72\x65\x45\x12\xbe\xb7\xb2\x1a\x4b\x5b\x1b\x4a\x05\xbd\x7b\x4d\x68\xbd\xc2\x99\x78\xd9\x3e\xc0\xad\x19\x63\x73\x2c\x87\x2a\x76\xed\x6a\xb8\x24\x56\xb2\x42\xaa\xcd\xae\x17\x3b\xf8\x14\x62\x0e\xcb\x4a\xf9\x26\x3c\xe4\x04\x1f\xb0\xae\x8a\xca\xf7\x9a\x82\x8a\xcd\x92\x10\xc0\xc0\x8e\xc9\x15\x2b\xe0\x71\xec\xfa\x46\x4f\xf4\x75\x61\x74\x7b\xa3\xa1\x14\x9a\x6b\x0c\xdd\x61\x93\x20\x62\x16\xba\xb5\x09\x4e\xb3\x1a\x47\x65\xa1\x28\xaa\xaf\xa8\x88\x04\x92\x00\x65\x53\x55\x12\xaa\xe0\x38\x15\x60\x7d\x6f\xaa\x73\xc3\xc0\x1d\x4a\x8a\x96\xcc\x26\x15\x16\x88\xed\xc4\x03\x40\xec\xf6\xae\x7a\xe2\xe2\xfe\x4e\x16\x2b\x92\x81\xa0\x9d\x6a\xb4\xba\x78\x98\x20\xbf\xa1\xfc\x17\xc6\xd0\x61\x22\xb4\x17\x26\x6f\x74\x60\x91\x83\x23\x05\x74\xcd\x21\x24\xc2\x0f\x4d\xa5\x33\xf8\x0f\x08\x7e\x18\xc8\xb4\x2c\x10\xb8\x1f\x7d\xb5\x87\x7e\xe3\x62\xdd\xe8\x6e\xc3\xaa\xcf\x25\x5a\xa4\xf6\xff\x77\xb9\x62\xce\xef\xd8\xaa\x97\xed\x68\x6f\x5f\x57\x65\x5d\xce\x4b\x38\x50\x72\x3e\x2f\xab\xac\x43\x6a\x43\x80\x0a\xb7\xbf\xad\xa3\x30\x57\xd6\x56\xad\xb4\x1d\xd9\xfd\x5d\x51\xae\xa8\x6c\x73\xab\x54\x25\xf2\x17\x45\xbf\x25\xcb\x8a\x03\x48\x42\xc0\xea\xda\x89\x07\x1f\x0a\x2c\x09\x17\xd3\x95\x05\x77\x29\xba\x98\x5f\x51\xae\xda\x05\x56\xd8\x34\x1e\x5a\x22\xf6\x9b\x2b\x59\xfd\xd4\xa8\xa0\x99\xf3\x39\xfa\xac\x83\xe1\xc0\x95\x9e\x9c\x3c\x87\xca\x60\x8c\x09\xe1\xb5\xff\xa9\x51\xae\x64\xbd\xd5\x76\xf5\xe5\x17\xf8\x9d\xc1\x92\xe3\xe5\x00\x5b\x42\xe7\x14\x1a\x5d\xe7\x4a\xb3\x8e\xf4\xbf\x14\x75\x05\xd5\x92\x87\x2f\x9e\x1f\x89\x1f\x00\x0a\x80\xca\x6e\x8a\xb2\xf6\x86\x0d\xb6\xba\xd0\xf9\x89\x04\x66\xa5\x0c\x2c\x2f\x08\x61\x28\x2a\x66\x22\x95\x76\xa4\x92\x3b\x6b\x5b\x7d\x02\x76\x84\xf7\x77\xb4\x5d\xd0\x9a\xdc\x59\x61\x9a\xf8\x38\x6f\x40\x4c\xd6\xea\xed\xf3\x31\xb0\x24\x34\x2c\x29\xa5\xc4\xb1\x0e\xeb\x82\xfa\x72\x7b\x15\xee\xbd\xab\x33\xcf\xdd\xea\x6d\x39\xb2\x10\x4f\x83\x10\x07\x80\xff\x2b\xd3\x72\xec\x7f\x6a\x0e\x48\x2e\xa0\x74\x02\xe1\x4b\x75\x87\x58\x72\x59\xc4\xa0\x37\xa0\x95\x82\x72\x7f\x77\x8c\x4e\xc4\x71\x1c\x48\x3f\x1f\x7c\x4c\xc7\x13\x8c\x3e\x9e\x9c\xd8\x03\x85\x88\xbb\xe9\x3f\x4e\xd3\xf1\x20\xbd\x1a\x83\x33\x40\x37\x21\x0b\xfc\xb5\x42\xa1\x32\x74\xb7\x8f\x15\x40\xa5\x6a\x59\x65\xc2\x45\xee\xc0\x9a\xd6\x39\xb2\x38\x84\xa5\x97\xe1\x0a\x80\xb1\xaa\xc0\x8f\xcf\xee\xff\x99\x33\x9c\x78\xae\x81\x32\x42\xac\xe4\x0f\x76\x35\x13\xfe\x87\x45\x59\xd5\xd6\x96\x04\x36\x27\x32\x09\x85\xfa\xe2\x96\x3d\xf1\xa5\x02\x89\x37\x52\x12\x2c\x6e\x6b\x6e\xa4\x36\x6d\x73\x93\x7a\x1f\x43\xb5\x0f\x3a\x18\xb6\x41\x36\xe2\xfe\x0e\x30\xde\x82\xd8\x29\x75\x85\x60\x51\xde\xdc\x5b\xf0\xd6\xdf\xca\x37\x46\xab\xf0\xe7\xf6\x4c\x92\x62\x55\x60\x2f\xda\xf7\x84\xf0\x00\x09\x96\xa0\xd8\x1d\x2f\x5c\x6d\x3c\x9e\x5c\x88\x92\x2d\x21\xb4\x83\x83\x95\xb9\x32\x54\xff\x22\x6b\x69\xea\xaa\x5c\x5f\xdb\x4d\x01\x7c\xb4\xdc\xfd\xa3\x15\x94\xf7\xff\xb9\x46\x04\x00\x25\x9b\x2f\xd4\xf3\x5d\x81\x01\x8b\x41\x16\x90\xf4\x15\x45\xd6\x17\xaa\xc1\x47\xc0\x15\x36\xd8\xcf\x68\xff\x7b\x59\x59\xaf\xc0\x04\x20\x15\x8b\x1c\x2a\xe5\xcb\xb9\xc6\xf7\x92\x3b\x98\x29\xb1\x6c\xec\xfb\xfe\xf5\x9f\xfe\x6f\x3a\x54\x78\x6d\x17\x52\xd7\x09\x83\x3c\x14\xd8\x6a\x4a\x8d\x6c\xc1\xb9\x4a\x44\x76\x50\x72\xcd\x63\x21\xe8\x41\x7b\x89\x51\x90\x96\xf3\xb9\x34\x0e\x27\x80\x4c\x53\x99\x97\xd4\x57\xd3\x7a\x7a\x47\x01\x4c\x82\x56\x0f\x48\xb4\x28\xb2\x0e\x50\x8a\x50\x5d\x59\xa9\xa2\x2c\xe6\x3a\x70\x9b\x25\x0d\x11\x13\xf1\x2c\xbc\xac\x08\xb5\xee\x67\x30\x8e\x00\xe4\x64\xc5\x66\xeb\xc9\x09\x99\xf3\xae\x2f\xac\x28\xa8\xf9\x0d\x4c\x3f\x39\x67\x6d\x06\xf0\xa0\xb8\xff\x81\x10\x49\xa8\x09\x1f\xe6\x07\xed\xad\x89\x53\xb4\xfe\x4e\x72\xf1\x26\x40\x2a\x94\xdc\xfe\xed\xc3\x06\x39\xe9\x53\x60\x7a\x81\x82\xe5\xae\x37\xcc\x55\x8d\x3f\x76\x1a\x90\x4b\x48\x7c\x6e\x6c\xee\xc1\x08\xb6\xdb\xb5\x8a\x03\x90\x87\x58\x1a\x5d\xb7\xd2\x33\xfe\x5b\xf7\x7f\xa2\x0e\xe0\xec\x00\xed\x2d\x7b\x42\x50\x0f\xe1\x64\x41\x3d\x42\x22\x94\xb5\x93\xdd\x53\xeb\xf0\x22\x6c\x00\x74\x68\x64\xf7\xff\x0c\xb7\xf7\x9a\xf5\xbf\xe1\x05\x7f\xd9\xa3\x12\x85\x83\xeb\xcd\xba\xac\xaf\xef\xff\x6c\x2d\xe1\xfb\xff\xb1\x7d\xa8\x1e\x28\xf5\xb2\xee\xe7\x8d\x35\xa6\x41\x36\x61\xb2\x92\x32\x73\x80\x84\x50\x6a\xfb\x2a\x94\x57\xb5\xfa\x52\xab\x20\x3f\x6b\xdd\x2a\xec\x07\x83\xf0\x1f\x96\x07\x25\x8c\xef\x83\xbf\x84\x6c\x83\xfd\x19\x1e\xa0\x26\xab\xe0\x9a\xd0\x35\xe3\xa5\x5a\x28\x32\x4c\x41\x09\xac\x54\x91\xd1\xe5\xdd\x4e\x65\x19\xe5\x4a\x4b\x2b\xac\x79\x09\xbe\x86\x35\x30\xf0\x41\x2a\x3a\x40\x75\x06\xd7\xb0\xb5\x06\x5e\x29\xf9\xb6\xa2\x30\x7f\x91\x4b\x51\x34\x39\xa5\x21\xe0\xd3\x9c\x2a\xa5\xb8\x6b\x90\x28\x4d\x58\x17\x3c\xb0\xd0\x41\x28\xd7\x9e\x4b\x79\xff\xdf\x0b\x0c\x4c\xf3\x57\xd0\xf2\xf6\xde\x77\x5c\x8e\x77\x72\xd2\xfb\xa6\x27\x86\xfd\x8b\x77\x57\xed\x2e\x25\x32\x0b\x32\xbd\xc4\x82\xaa\x5c\x16\xcb\x46\x79\x44\x38\xc6\xb7\xa2\xbf\x97\xc5\x32\xb7\x7f\x1b\xda\x56\x99\xbe\x51\xd5\x92\x0c\x34\x10\xd2\x76\xbf\x38\x52\x88\xb9\x99\xdc\x53\x44\x04\xaf\x86\x16\xc5\x45\xa9\x03\x25\x7c\x2a\x8e\xc5\xc5\xe8\xea\x63\x3a\x1c\xa6\x13\x61\xf5\x2f\xaa\xe2\x2b\x41\x48\x7d\x44\xce\x72\xc2\x85\x21\xae\xcb\x3d\x2a\x82\x51\x58\x12\xb8\xd6\x14\x05\xeb\xae\x99\x86\x3d\x88\x16\xea\xd4\x0a\xe4\x3e\xf4\x70\xb0\xe4\x22\x58\x14\xe8\x88\xb9\x86\xba\xa6\x39\xea\x03\x3c\x9b\xad\x56\x4c\x6b\xa0\x5b\xc5\x72\x47\x11\xf8\xa0\x7a\xca\x55\x65\x83\x77\x21\x2b\x3e\x5d\xdb\x80\x70\x09\xd7\xa8\x18\x7b\x64\x79\x0c\xad\x0a\x78\x28\x6a\x57\x95\x80\x56\xbf\x12\xfc\x0f\x0a\x1a\x06\x26\xec\x0f\xd0\x60\x0b\x0a\xd9\xf7\xd9\x3b\xb0\x90\x50\xea\xa3\x97\x67\xcc\xfd\x9f\x33\x3c\xd9\xf3\x6b\x09\x02\xae\x01\x2e\x8b\xfb\xbb\xaa\x24\x7e\x90\x79\x8d\xf9\x42\xf7\x9a\x10\xb9\x8a\x53\x8f\x01\x08\x0c\xe5\x87\x11\x71\x48\x61\x65\x3f\x06\x8f\xfd\x90\x80\xaa\xe4\xfe\xce\x81\x01\xd9\x55\x86\xf0\x99\xb5\xe0\x78\xad\xda\xb0\x7c\xbc\x65\x2f\xf0\x2c\x78\xd7\xc1\x81\xde\x50\x95\x9a\x67\xe5\xa0\x68\x77\xeb\x6e\x91\xba\x43\xbc\xaa\x30\x93\x16\x56\xee\x04\xb3\x84\x1d\xe4\x0a\x2a\xd4\x28\xee\x03\xfe\xc5\x64\x7d\x39\xb6\x91\x00\x99\x65\x3b\x3b\xf5\x50\x32\x0d\xcb\xe7\xfc\x1d\x79\x21\x8e\xc5\x70\x34\x08\x91\xf8\xd3\x29\x54\xd7\xa5\x53\x28\xa5\x9b\xa6\xe3\xf1\x60\x3a\x1a\x0f\xfa\x58\xaf\x75\xf2\xa2\x95\x3b\xa7\x5b\x4f\xa0\x6a\xf6\xe0\x95\x3a\xb8\x98\xbb\xb3\x0f\x60\x10\x15\xd8\x79\x03\x6f\xc8\x51\x92\xe6\x07\x72\xa5\x91\x6c\x1f\xa6\x42\x15\x80\x19\x08\xf7\x5c\xd7\x7a\x49\xfd\x4e\xf6\x4d\x19\x47\x12\xfe\x84\x56\x0a\x15\x74\xd8\xa1\x98\x86\xf4\x38\xbc\x93\x0d\x9a\x2d\x79\x06\x55\xd4\x7d\x0e\x46\x3b\x5f\x58\xf0\x20\x38\xcb\x9d\xdd\xdf\xe5\x52\x3b\xfc\x81\xc3\xd3\x23\xab\x56\xb1\xde\x11\x4e\x61\xe5\xe0\x01\x4c\x63\xaf\x18\xe5\xbc\xad\xb4\x5d\x00\xcc\x9e\xa4\xca\xe1\x5c\xdd\x20\x26\x14\xa0\x69\x62\xc3\x46\x83\x5e\x39\xca\xbe\xe4\xa1\x99\xd3\xa5\x40\xe7\xd8\xb4\x6c\x26\x6b\x14\x5b\x47\x8c\x43\x2a\x50\x6a\xca\x25\xad\x53\x2b\xb6\x0a\x6b\x4b\xd8\x01\x63\x19\x1d\x1c\x0f\x40\x2d\xec\xed\x9d\x88\x33\xf5\x3d\x62\x41\x9e\x7d\x4f\x28\x8a\x83\xef\x19\x7e\x70\x38\xfc\xde\xdf\x8a\x21\x24\xd0\x3f\xd2\x71\x3c\xb1\x8b\x7a\x7a\xf2\xec\xf9\xab\x67\xa7\xcf\x9f\xbf\xfc\x9f\x1e\xe8\x77\xc7\x9f\xde\xb3\x7e\x53\x97\xd6\x2a\x38\x76\x64\x31\xc7\xa7\x5f\x17\x0b\xf8\x61\xfc\xdf\xe7\x2f\x9e\xbf\x7c\xd1\xc2\xff\x7d\xf9\xed\xb7\xdf\xfe\x86\xff\xfb\x6b\xfc\xe9\x3f\x40\xd7\xbf\x93\x25\x6c\x09\x4c\x3f\x4d\xc1\xfc\xa4\x31\xa5\x70\x9b\x39\x16\x40\xcf\x03\xbe\x58\x8e\x78\x2b\x61\xe6\x95\x5e\xd7\x01\x8b\x3b\x30\x37\x34\xf5\xba\x01\x6c\x6e\x3e\x99\xc8\x1a\x51\x28\x85\x8c\x9a\xc8\xcb\xd0\x8d\xf7\xbf\x03\x36\xfe\xf6\xda\xfa\x8b\xa6\x8b\x57\x18\x48\xd7\x68\x20\x09\x03\xe7\x03\x6f\x1f\xb1\x57\xba\xf7\x5b\x7b\x27\x1c\x16\x80\xae\x20\x61\x59\x7d\xad\x56\xc8\xac\xf6\xc0\x20\x0e\xdf\x5d\x0e\x8f\x90\x3a\x6b\x59\x5a\x6f\x1d\x00\xc7\x91\x98\x2a\xe0\xd3\x5b\xc9\x5a\x55\x76\x37\x98\x93\x15\xd1\x58\x89\xfa\xcd\x7d\x9c\x00\xab\x7a\x7b\x67\x44\xb3\xd7\x1e\xae\x7b\x92\x10\x33\x61\xf8\x98\xce\x22\xba\x68\x64\x03\x01\x63\x30\x13\x87\x21\x63\x9f\x34\xe0\x6d\x43\x78\x0b\x16\x8d\xd8\x04\x8a\x75\x53\x1f\x21\xa1\xd6\xae\xad\xfa\xa4\xc4\x9c\x80\xd4\x0d\x6e\xe8\x7e\x26\x6b\xb9\xef\xc6\x87\xeb\xe4\x89\x07\x77\x8c\x94\xa8\x1b\x61\x3a\xc8\x3f\x52\x1b\xd4\x13\xea\x8b\x22\x54\x17\xac\x1a\x47\x1a\x3e\xa0\x68\x34\x44\xb0\x45\x2f\xb6\x1f\xf6\xeb\x52\x97\x3c\x60\x5d\x00\x2d\x03\xd2\xbe\xd9\xc9\xb6\x87\xed\x3e\x88\xfc\xed\xed\xef\x29\xb1\x5f\x94\xc5\x71\x7b\x5e\x6e\x1e\x05\x30\x9b\x91\x95\x0d\xf4\x8f\x38\x1e\xfe\x91\x1f\x13\x2c\xa5\x06\x1f\xd0\x8e\x8c\xb8\x21\xb6\xee\x23\x13\x1a\xbc\xbb\x1c\x86\x2c\x72\x21\x1d\x9f\xfb\xb8\xd5\xd5\xc0\x0f\xfd\x28\xa9\xdb\x27\x7b\x2b\x90\x9f\xed\x47\xbc\xa5\xe1\xa5\xe5\x08\x68\xe6\x79\xe4\xfc\x57\x3c\xaf\x9b\x75\x02\x98\x40\xf6\xc1\x71\x3b\x62\xd5\xba\x44\xce\x82\xad\xf7\x4b\x23\x6e\x55\x9e\x27\xe2\x3f\x34\x45\xae\x8c\xf9\x0f\x3b\x9e\x63\x6e\xd3\x75\x09\xf9\x77\x99\xb3\xd4\x69\x2f\x27\xd0\xa1\x45\xd7\x17\xce\xca\x2d\xfd\xbe\xbd\x1d\xfc\x24\x7f\x07\x1e\xb6\xf3\x04\x12\x17\x95\x01\xef\x44\x4f\x1c\x0e\x98\x19\xf6\xb6\xac\x32\x93\x08\x1c\x2d\x0e\x16\x79\x6e\xc4\xaa\x04\x2e\x34\x77\x08\xfe\x3f\xf6\xde\x75\xb7\x8d\x24\x5b\x17\x9c\xdf\x7e\x8a\x18\x1f\x0c\x4a\x3a\x48\xb1\x2c\xf9\x52\xb7\x46\x03\xb4\x44\xdb\xdc\x4d\x4b\xda\xa4\x54\xd5\xc6\x60\x30\x27\xc8\x0c\x8a\xd1\x4e\x66\xb0\x33\x32\x45\x73\x9e\x66\xff\x1b\xcc\x23\x9c\xbf\x7b\xbf\xd8\x20\xd6\x25\x2e\x99\x49\x4a\xb6\xab\xaa\xfb\xec\x5d\x06\x0a\x65\x4b\x64\x66\x5c\xd7\xf5\x5b\xdf\x82\x97\xfb\xee\xc8\xdd\x73\x40\xeb\x94\xfc\x70\x70\x4c\xad\xee\xaa\x34\xb0\xb2\xf2\xed\xe5\x79\xfe\xb4\x1b\x0d\xb0\x10\x17\xaa\xc6\x36\x7b\xd4\xd2\xc5\xb7\xa5\x3d\xb4\x39\xdc\xfd\xbe\xbb\xda\x83\xff\xaa\x96\xd1\x7f\x8d\x3f\x83\x6f\x87\x6f\x26\x27\x67\x83\xd3\xdf\xaa\xf9\xc3\x83\xf6\xdf\xd9\xe9\x8b\xd3\x97\x2d\xfb\xef\xf4\xd5\xf3\xe7\x7f\xd8\x7f\xbf\xc7\x1f\xa7\x8b\x87\x0b\x99\xab\xb5\x5e\xa0\xaa\x20\x73\xe5\xc9\xfd\xe0\x6c\x70\x8a\xed\x87\x7b\x3f\x20\x8e\x40\x11\xd2\xbf\x9e\x1e\xc7\x8a\x09\x74\x1e\x37\xee\x85\xce\x35\xbe\xeb\x93\x5d\xe9\x0d\x7d\xf5\x8a\x3f\xf1\x8b\xa9\x3e\x3e\x3d\xa6\x7e\x9c\x66\x5b\xaa\x2a\x79\xb8\xa9\x9e\x1e\x83\xd4\x83\x58\x78\xde\xdb\x9c\x4b\xe8\xf5\x5a\xe5\x5a\xd6\xd0\xa3\x3c\x69\x95\x1a\x7a\xd0\xd0\x47\xb9\xf7\x4d\xf2\xfe\x1f\x9f\xd0\x4c\xf2\xa8\x9f\x54\xff\xc4\x7d\x03\xa8\xc1\x29\x78\xe3\xc7\xe2\x6d\x25\xb1\x9d\x4c\x68\x7a\xe5\xdb\xdd\xf3\x1c\xb8\x41\xce\x5d\x05\x41\x5f\x67\xd2\x4a\xb7\x36\x45\x7e\xb2\xd5\xb9\xca\x92\x16\xf1\x19\xe8\x88\x88\xd4\x6d\xa3\xaa\x8d\xaa\x1b\x27\xeb\x2d\x98\x95\xee\xe1\x18\x70\xa0\x51\xd5\x46\xe4\x26\x5d\x1b\x2e\x68\x91\xc7\xd8\xca\x1d\xd1\x60\xaa\x3b\x79\x68\xd7\x0c\x9a\x8a\x2b\x4e\xe6\xf0\x95\x0d\x50\xa1\xab\xa8\xc1\x27\xec\xa6\x15\x47\x4f\x2f\xc2\x8f\xdc\x13\xec\xd3\x63\x20\x70\xc9\x45\xb3\x21\x6b\x31\x79\x03\x3f\x77\x71\xdc\x6a\x97\x4d\x0a\x92\x54\x6f\x3a\x2a\x67\x92\xb4\xdf\x93\x36\xa8\xe3\xc7\xe6\x38\x5c\x44\x93\xf6\x3c\x09\x3f\x5d\x60\x03\x35\xfa\x8e\xe2\xa1\x6c\x0a\xb9\x3b\xf0\x1d\x08\xb9\x9c\x45\x9b\x7c\x8d\xbd\xfe\x7f\xef\x1d\xe6\x5e\x77\xd8\x3b\xdb\x37\x88\xdf\x3a\x53\xde\x10\x73\xbd\x29\x8a\x60\xf9\xf9\x71\x79\xff\x4a\xad\xe7\x26\xd7\xa1\xcd\x58\x6b\xb9\xad\x58\x02\xa1\xe6\xaa\xfb\x8c\x8c\xfb\x8d\x67\xce\x57\xc9\x84\x55\x45\x41\x6d\x5d\x97\xaa\x82\x2b\x65\x65\xd1\x77\xb4\xfa\x36\x11\x49\xe6\xa2\x25\xa5\x32\x63\x28\x39\xf6\xeb\x7a\x43\x1e\x9e\x78\x1a\xfd\xfa\xa9\x58\x2b\x59\x5a\xee\x0c\xbd\x54\x55\xa5\x72\xa8\x93\xef\x3f\x43\xd0\x8d\x0c\x7b\x49\x25\x24\xad\x51\x17\x66\x67\xf7\xcb\x7b\xa9\x0b\x8c\x9d\x25\xfc\xa6\xb9\x72\xbe\xe1\xdc\x7d\x9d\x9a\x7b\x45\x9e\x6c\xf2\xa6\xee\x39\x90\x77\x95\x42\x79\x08\xd4\x50\x39\x18\xd5\x72\xb1\xd2\xa5\x3a\xa9\x94\xcc\xc9\xa5\x08\x0d\xd0\xe2\x55\xe8\xbf\x10\xa1\xfd\x19\x34\x01\x8c\xbf\x9c\x7e\x12\xb6\xdc\x0f\x28\xdc\x37\x1b\x0d\x13\xfb\xfa\x92\x63\x89\x52\xab\x36\xc2\xca\x5a\x5b\x98\xa0\x8e\x11\xed\xd0\xab\xb1\x90\x0b\xe8\xd8\xfb\xf8\x69\x80\xab\x95\xb4\x49\xab\x14\x84\x79\x4d\xb5\x13\x95\x92\xd6\x94\x72\x5e\xec\x9c\xf3\x05\xe0\x5e\x74\x4b\xb1\x29\xa4\xd0\xa5\xfa\xb4\x51\xa5\xbb\x1f\xdc\xea\xfa\x5e\x95\x10\x3b\xc5\xee\x10\x6e\x50\xee\x9a\xb9\x4d\x96\x56\xc0\xea\x48\x1b\x66\x08\xcc\xe7\x65\x83\x9b\x10\x09\x9d\xce\x7a\x61\xab\xcc\xb9\x6f\x7e\xce\xba\x83\xdb\x89\x73\x4b\xed\x3d\x13\x71\xb3\xfc\x02\x45\x84\xf7\x32\xa8\xcd\xee\x99\x02\x86\xbd\x63\x31\xe2\x66\x90\x56\xbc\x71\x96\x3a\x6b\x22\xb8\x3f\x03\x71\x49\x9d\x09\x7d\x77\x36\x37\xde\x70\x73\x4b\xd3\xfa\x95\x53\xcf\x0b\x2e\x3f\x33\x55\xff\xbb\xf1\x7b\xc1\x7b\xd5\x15\xd0\x48\xa9\xb5\x74\x52\xd8\xdd\x77\x2c\xe3\x12\xf0\x83\x0c\x9c\x41\x6c\x52\x08\x5b\xa8\xca\xdc\x54\x4e\x9d\x57\xd4\xf6\x99\x22\xdd\x50\x18\xe0\xc4\x81\xbb\xb5\xe8\x10\x69\xdb\x3a\xbc\xbe\x8d\x21\x62\x14\xc5\xa6\xd2\xa6\xf2\x4d\xee\xa3\x68\x53\xd2\x80\xd1\x54\x03\x71\x69\x6a\xd8\x3b\x90\x6f\x51\x03\x76\xbb\x92\xd8\x43\x31\x57\x6a\x8d\x03\x04\x29\x0d\xf3\x83\x3d\xc1\x45\xf0\x13\xcc\xc2\x6e\xd9\x8c\x44\x2e\x71\x39\x2b\x61\xd5\xa2\x52\x35\x2c\x02\xac\x0f\x2c\x7e\x00\x3c\xca\x02\x50\x8a\xaa\xc2\x7e\x8b\xfe\x34\xa2\xe7\x25\x80\x41\x01\x26\x56\xec\x80\x28\x57\xe5\x20\x31\x74\xe9\xc6\xcf\xe2\x9d\xd5\xba\xb6\x38\x52\x1c\x74\x5b\x02\x43\x6b\xf7\x25\x76\xf4\x84\x1f\xa0\x84\xc7\xe0\x05\xed\x74\x4b\x5f\xd0\x49\x91\x25\xf5\xff\x23\xa3\x87\x7e\x9d\xab\xa5\x2e\x51\x41\xcc\x88\x86\xf1\x0c\x86\x45\x5d\xfc\x92\xd1\x80\x5b\x1d\x9d\x89\x78\xae\xf7\xaa\x14\x7a\x89\x8e\x2a\xfe\x9a\x1a\xaa\x17\x4d\xbe\x47\x01\x3d\x62\xfb\x28\xbd\xaa\x58\x4e\x54\x66\xa5\xe7\x3a\x92\x74\x70\xa4\x70\x52\xee\x41\xa8\x31\x73\xed\xd6\x48\x01\x45\x48\xb5\xb6\xd1\xb9\xf3\x7d\x25\xcb\xdd\x41\x01\x0a\xab\xb6\xd5\xd6\xd9\x3f\xa1\xe3\x6a\x10\x9a\xb4\x8c\xc8\x08\x76\x8c\x56\xb3\xa5\xf5\x83\x62\xc2\x1a\x3a\x29\x15\x3b\x61\xd6\xee\x14\xe7\x58\xbb\x7c\x2c\x86\x75\xc0\x7f\x4e\xe1\xb4\x61\xb4\x13\x9c\xf9\x4a\xd5\x52\x97\x19\x2f\x56\x4b\x3d\xb8\x31\x77\xad\x23\x37\x6c\x68\xb2\x0b\xdd\x7d\xb3\xb4\x0b\x23\x9f\x64\x77\x6e\xfc\xc6\xf9\xf6\xb6\x3e\x3e\xf1\x90\x1e\xca\x38\x54\x03\x0d\x29\x7d\xa8\x01\x4e\x40\x58\x7b\xec\x0e\xbb\x23\x15\xba\x81\x41\x42\x1c\x04\x8b\x96\x21\xc8\x50\xe3\xc1\xc7\xe7\x88\xa7\xf1\x6a\x5c\xc2\x33\x07\x4f\xc3\x72\x20\x8e\xab\x3d\xc0\x25\xdd\xc2\x87\x96\x02\x82\x44\xb2\xaa\x76\xd8\x42\x73\x0d\xb8\x71\xd1\x7d\xe3\x7e\xad\x84\xc2\x5f\x54\x6a\xa1\x37\x1a\x6e\x98\x7f\x05\x9c\x07\x1f\x3a\xe9\x97\xe3\xdf\x1d\x8b\x5f\xa2\x36\xac\xd7\x95\xe1\x84\x1b\x98\x48\xbe\x39\xa7\xfb\x25\x7f\x30\xd2\xd6\xd4\xc2\x95\x5e\x9a\xea\x13\xd0\xb2\x79\xaf\x18\xc7\x5f\x38\x63\x09\x77\x9e\x84\x1d\xdf\x62\x5a\xff\xf9\x2e\xbc\xc8\xdd\x53\xb4\x2a\xdb\x76\x24\xfd\x32\x98\xa7\x39\x75\xa5\xee\x6f\xc1\x1b\xdd\x2f\xea\xd8\xaa\x7a\x84\x77\xa4\x88\x8e\xec\x31\xfe\xd4\xd8\x68\x76\x96\xba\xa6\x46\xc3\x1f\x38\x8d\xb8\x4f\x96\x6a\x6e\x7d\x1b\xf4\xf0\xa6\x32\x0b\xa5\x20\x94\x6d\x81\x08\x67\xa1\xb2\x3e\x2f\xc8\xb2\xa5\x16\x9c\xc0\x68\x12\x00\xbb\xf2\xfd\xf8\x5f\x0f\x67\xe3\x19\x0c\xad\xdd\x99\x3f\xe3\x4e\xc1\xac\xbf\x4c\xc5\x8d\x78\x33\x92\x80\xba\xbc\xcb\xbc\x9a\x0b\xd4\xc6\x38\x28\xda\x69\x72\x8b\x2e\xaf\x2e\x4f\xc6\x97\x6f\xa6\xe3\xcb\xb7\xa3\xf7\xa3\xcb\x9b\xec\xcb\x1a\xf8\x3e\xdc\x94\x9f\x3a\x97\x5f\x4d\xc7\x6f\xc7\x97\xc3\x89\xf8\xe5\x6a\xfa\x97\xb4\x15\x3f\x88\xb5\x8b\xf1\xec\x7c\x32\x1c\xbf\x1f\x4d\xdd\x37\x78\xce\x49\xa2\x42\x96\x42\x59\x4b\xb1\xd9\x0d\x35\xc0\x8e\x97\x12\x34\x4a\xe4\xb8\x76\xb6\x21\x3e\x9e\xb8\x13\xa4\x3c\xa3\x6d\x09\xed\x6c\xb1\xa6\xf4\x58\x4c\x02\x47\x34\xe8\x22\x84\x7d\xed\x06\xe2\x16\xbe\x55\x1a\xac\x21\x5b\x63\x29\x37\x9e\xab\x86\x7f\x55\xa8\x3b\x48\xba\x28\x53\xed\x32\xb1\x5d\x29\xd2\xea\xa2\x36\x55\x2d\x8e\xfc\xbe\x89\x52\xdd\x41\xa2\x7a\xa1\x8e\x33\x42\x7d\x2d\x6a\x68\xfe\xec\xb5\x44\x46\x1a\x2b\xb9\x3d\x73\xa7\x6d\xc1\x58\xa6\x08\x09\x42\x77\xbc\x00\xc3\x5a\xbd\xcc\x57\xed\x65\x1c\xb2\x85\x43\x03\x42\xd3\xfd\x1d\xcd\x5a\xab\x80\xbd\xc8\x2d\x70\x2e\xb1\xc2\x89\x0d\xbb\x15\xd4\xcd\x28\x77\x57\x35\x0a\x62\x2b\x00\x8b\xdb\x14\x9d\x8d\x10\x64\x1a\x46\xf9\xa7\x76\x60\xe0\xe0\x71\xe5\x77\xbb\x39\x14\x06\x0d\xe5\x3b\x63\xf2\xad\x2e\x8a\x0c\x23\x3f\xb6\x36\x9b\x0d\x70\xab\x2e\xcc\x7a\xd3\xd4\xc0\x77\xa5\x0b\xe8\xd5\xeb\x5c\xb3\x62\xd9\x20\xd4\x36\x63\x7b\x8a\x7d\x32\x34\x55\xa2\x5a\x49\x3f\x53\x7c\x99\xb2\x74\x24\x8b\x64\xdf\x0b\xde\x77\xda\x84\xd2\xd4\x21\xf3\x10\x7e\xe9\x86\x9c\x2b\x59\xaf\xc0\x44\x85\xad\x90\x85\xd0\xe5\xdf\x1a\xf0\x4c\xdc\x6a\xb9\xc5\x5b\x06\x7b\xdb\x54\xdf\xd8\x68\xf7\x59\xdc\x42\x06\xa4\x8e\xb0\x7d\xa2\x90\x5b\x6f\x9a\x50\xac\x3e\x0c\x71\x20\x66\x66\xad\xa0\x68\xc2\xe6\x9a\x8a\x39\x72\x83\xc3\xf4\x99\xcd\xa8\xfd\x7b\xd5\x9a\x5f\x38\x0c\x7b\xcf\x42\x26\xac\xc1\x7d\x0e\xcf\x71\xab\x1a\x3d\xc8\x99\xeb\xc9\xca\x7c\x30\x0d\x16\x12\x1d\x8b\x21\xd2\x81\xb3\x6a\xba\x81\x72\x0e\x1a\xfc\x78\x09\x02\xff\x91\x11\x1c\xb7\xa3\x6d\xcd\x9c\x05\x8d\x8e\x89\xa7\xa0\x71\x95\x50\xcb\xa5\xbb\x6e\x41\x9f\xa4\x37\xb6\x36\xc2\xcc\x21\x47\x89\x8b\x84\xf2\x55\x82\xb0\x71\x23\x88\x75\xb3\xd9\xaf\x8f\x82\xa5\xa9\x0a\xab\xa0\xa1\x7a\x72\x2b\x8e\xe0\x24\x52\x92\x87\xdc\x0e\xf0\xe6\x01\x61\x36\x57\xf5\x56\xa9\x32\xd2\x98\x65\xee\xe6\x74\x1c\x47\x7e\x5a\x39\x71\x34\x41\x3a\x36\xca\xa1\x90\x19\xdc\x4d\x43\x0c\xff\x64\xa3\xd2\x22\xb7\x94\x78\x64\xac\x9f\x92\x46\xcf\xbc\xf9\x25\xeb\x1a\x8a\xda\x30\x3e\x68\x4d\x5b\x92\xee\x53\xd9\x5f\xba\x06\x3a\x56\xc9\x7c\x0b\xd0\x98\xb8\x1d\xcc\x06\x91\xd5\x52\xc8\x2d\x2a\x3c\xf5\xf7\x46\xdf\x4b\x68\xc4\x58\xc8\x2d\x0c\x85\xef\x7e\xe3\x8c\x03\x77\xa0\xc9\x3f\x07\x07\xa0\xe4\xc6\xa4\xb5\x5b\xd6\x1d\x44\x8a\x2a\xb5\x34\x95\xca\xa0\xdf\x3a\xae\x18\xda\xa0\xfb\xd6\x8c\x0c\x97\xde\xa5\xfb\x40\x05\xf9\x0b\xb7\x67\x1f\x80\x04\x26\xdc\x88\xf6\x3a\x79\x69\xb5\x84\xcc\x23\x2e\x26\x45\x2b\x88\xf5\x82\x6a\x54\x8e\xe3\x9b\x04\xf2\x87\x22\x89\xc3\x05\xde\xad\x9b\xae\xcf\x53\xd3\x37\x80\x8f\x19\x3a\xac\x2e\xc0\x8d\xa0\xe5\xa6\x6b\x0c\x91\x0f\xdf\x0d\xe2\xe0\x59\xa1\x79\xcf\x77\xad\x59\xd8\x28\x69\xae\xd0\x6c\x86\x24\x38\xc8\x00\x2a\x3a\x8b\xac\x17\x21\xc5\xa2\x32\xd6\x9e\x80\x0a\x46\x41\xd4\xb8\xbd\x81\x7f\x67\x42\xde\x49\x5d\xda\x3a\xb5\x1d\xcb\x1d\x2b\x7d\xe5\x96\x4c\xdd\x61\x64\x84\xcc\xd9\xb6\xe2\x59\x56\xba\x84\xca\x5d\xb2\xfd\x68\x7d\xea\x68\x0d\x91\x72\x1d\xda\x8d\xb5\x44\x3d\x2a\x55\x2e\xa4\xf7\x2f\x23\x2b\x92\x1f\x8e\x47\x19\x1a\x1c\xcd\x3d\x5d\x7f\xaf\x20\x03\x03\x16\x0f\xa5\xe5\x5c\xba\xa9\xc4\x4a\x56\xb9\xfb\x3b\xc1\x8c\x8f\xc5\xbf\x44\x62\x3d\x13\x3f\xab\xb2\xc1\x13\xf2\x16\x10\x1f\x6e\x08\x13\xb9\x1d\x88\xa1\xbb\x98\x38\x36\x83\xa8\x3f\xe2\xc1\x74\x0b\x62\xd2\xad\xa1\xc0\xca\xbc\x32\x8d\xbb\x35\xa6\x2c\x76\x6c\xe3\x42\x97\x5b\xd4\xfc\x89\x42\x71\xe6\x0b\xd8\xf5\x89\x01\x82\x7d\xef\xd1\x1c\x2d\x09\x29\x11\x87\xca\x30\x38\xa3\x91\x5c\x63\x2d\xab\x9d\x98\x37\x56\x97\xca\xd2\xf5\x0b\x12\x83\x6f\x29\xec\x5d\xf2\x62\xd0\x37\x70\x40\xa8\xcb\xc8\xb2\xd0\x8b\xfa\xc4\x2c\x4f\x48\x29\xe2\x7e\x11\x0a\x24\x26\xef\xa0\x65\xbf\x2d\x41\x5a\x5c\xd2\x66\x9c\x87\x92\x07\x53\x12\x08\xd2\x8d\x92\x73\x38\xe3\x44\x1e\xcc\x80\x9a\x63\x29\xde\x1a\x93\xdb\x54\x12\xe1\xc0\x54\x8e\x6b\xbf\xd7\xde\x31\x4d\x0d\xfd\xc4\xdd\x6f\xec\xc2\x6c\xba\xf7\xdd\x1d\xac\xa5\xb3\x62\xf8\xb6\xf3\x61\xf4\x41\x0a\xdb\x40\x5f\x60\xd6\x40\x95\x13\x6f\x95\x0a\x80\x92\x8d\x2a\x65\x51\x47\x3a\x13\xe4\x62\x48\x1d\x0d\x9d\xed\x77\xfa\x1d\xfc\xf8\x7c\x20\xfe\xfd\xff\x15\xa7\xcf\x4e\x01\x95\xa9\xfe\x3e\xf8\x3c\x89\xb9\x4f\x5c\x46\xe1\x09\x1c\xb6\x6d\xaa\x7b\x70\xd0\x49\x1f\xf0\xa4\xda\x8a\x13\x21\xc7\x10\xb7\x30\x55\xa9\x76\x56\xbc\x51\xce\x0e\x1b\x23\xa4\x86\xce\x34\xc4\xff\xb0\x36\x6b\xbf\x82\x81\x10\xa2\x82\xc8\x3c\x1b\x76\xe1\x0e\xb8\xf3\x5b\x9b\x8c\xc3\xfc\xf7\x52\x17\x78\x7f\x2b\x6f\xd7\xcd\x15\xd4\xaa\xd4\x05\x4a\xb5\x4a\x2d\xdc\x1d\xa3\x73\x67\x3d\x78\x67\xe3\x5e\x66\x1f\x74\xbc\x22\x1b\x44\xf2\xdc\xbe\x11\x4b\xa5\x58\x98\xbb\x27\xea\x72\xd1\x40\xbe\x01\xf2\x65\x65\x49\x4b\x08\xc2\x01\xcc\xbc\x1e\x39\xe9\x56\x65\xb3\x51\x12\x34\x44\xf4\xa1\xaf\xdf\x86\xe7\xc7\xe2\xbd\xb6\x0b\x55\x14\xb2\x54\xa6\xb1\x2d\x05\x52\x29\x77\xf6\x29\x4e\xe1\xa9\x64\x55\xa4\xc4\xa9\xf4\x96\xe3\xd3\x7c\x6e\xd7\xce\x64\xc0\x2c\x86\x59\x82\xc5\x07\xde\x8a\x97\xb5\xed\x8d\xd4\x56\xac\x54\xc1\x78\xb2\xa6\xa4\xad\xc7\x32\x17\x44\xaa\xb4\xe4\xf4\xdc\x8d\x0e\xea\x50\x72\x94\x67\xa9\x29\x5d\x2a\x28\x5c\xa9\x76\x1c\xf2\x14\x50\xf8\xe1\x9f\x8a\xd3\x7f\x71\x2c\x2e\xd4\x12\x98\x1f\x71\x50\x4f\x3f\x98\xe6\xa9\xdb\x9a\x9b\xc4\xd4\xc3\x1f\xd7\x2b\x90\x9f\xa6\x65\xea\x25\x9e\x5e\xb3\xd9\xa8\x0a\xbd\x8b\xad\x82\x8a\x65\x95\x51\xba\x49\x22\xd7\xee\xbd\xce\x1b\xb4\xbb\x25\x39\x8c\x70\x04\x13\x9b\x83\x14\x2e\x48\xcb\x8c\x0e\xcf\x7a\x53\xec\x34\xa7\x6e\xc8\x5a\x88\x6f\x46\xd6\x32\x4f\xdf\xb8\x41\x84\xe7\xc3\x7d\xe6\xe9\x81\x1c\xc3\xb8\x1b\xbd\x9c\x91\x82\x75\x65\x0a\x77\xd2\x6d\x9a\x0c\x04\xc7\x4a\xd3\x88\x40\xad\x9b\x92\x3f\x81\x23\xda\x99\x06\xdf\xb9\x69\xaa\x8d\xb1\x2a\x5c\xd6\xdc\xaf\x70\x26\x9e\xd2\x77\x38\x05\x77\xa4\x8f\x09\x87\xb5\x85\xb6\x0b\xc8\x35\x03\xda\x85\x3d\x58\x88\xb9\x71\xd4\x0e\x7f\x48\x3a\x6f\x2d\x4b\xe2\x72\xf2\xf7\x02\x67\x13\x76\x64\xbe\xf3\xee\x75\xcb\xbb\x36\x15\xb2\x29\x01\x56\x00\x10\x05\x66\x29\x96\x7a\x59\x83\x53\xbd\x70\x0f\x3d\x7a\xf9\xec\xff\x38\x86\x17\x99\xca\xcb\x7a\x27\xdd\x6b\x89\x98\x46\xbb\x92\x95\x5b\x56\x7c\x96\x3e\x16\x73\x55\xaa\xa5\x06\x47\x33\x79\x6e\x34\x36\x3c\x78\x2f\x8f\x31\x54\xeb\x66\x77\xeb\x76\x8b\x0d\x31\x9e\x68\x27\xb7\xee\x76\x7c\x2b\x77\x50\xe6\x1c\xc5\x92\x99\xec\xda\x27\x70\xd1\x5e\xe4\xc8\x5b\x2a\x2b\xe7\x3b\x34\x98\xdd\x81\xf2\x5a\x1b\x02\x99\x6e\xbf\xdc\x83\x21\x44\x59\xab\x6a\xa9\x2a\x8a\xb8\x61\xd4\x81\xca\x70\x81\x94\x02\x12\xb5\x6e\x42\x0d\xb0\xac\xec\xd0\xed\x23\x2f\xda\x5f\xe7\xa0\x8b\x8e\xce\x8f\xc5\xd9\xb3\x67\xcf\x4f\xce\x9e\x3d\x7b\xe1\x6c\x17\xa8\xff\x11\xa3\x81\x98\x1a\xab\xca\x81\x18\x16\x05\x9f\x78\xca\x27\xe6\x83\x27\xd7\xc1\xf9\x01\xe1\x10\xd2\xe2\x28\xab\x21\x5b\xd8\x02\x1c\xd6\xf1\x18\x58\x42\xc7\x29\x5b\xef\xec\x07\xb3\xc8\xcd\x7a\x1e\x05\x5e\xf9\x6b\xb1\x73\xd8\x9f\x36\x42\x2d\xc1\xb3\x84\xfd\xfe\x2f\x89\x74\x1b\x7c\x3b\x02\xfc\xd7\xaf\x0a\xf8\x6f\xfd\x79\x00\xff\x7f\xfa\xea\xc5\x69\x17\xff\xf5\xf2\x0f\xfc\xd7\xef\xf1\x67\xa4\x97\x4b\x55\x38\xd9\xdf\xac\x83\x4e\xf4\x08\xa7\x27\xc8\x85\xfb\xd0\x7d\x86\x84\x24\xe2\xfe\x09\x1e\x21\xcb\xfc\xdb\x04\x78\x80\xf7\x7b\x23\xa1\x73\x52\x16\xe2\xec\x4e\x77\x31\x4e\xe9\xa4\x93\x22\xc7\xac\x21\xe6\xc1\x20\x28\x8f\xf8\xda\x3c\xf3\xdf\xc0\xc8\x69\xc4\xa2\xc2\x9a\xcb\xbf\x8a\xd5\x89\x97\x12\xa6\x72\x4f\xcf\x82\x2a\x4d\x44\x4f\xad\x3e\x61\x95\xd5\xd9\x9e\x79\xcb\xc2\x9a\x78\xf2\xd1\x1c\x9d\x13\x59\xed\x18\x9b\xcf\x68\x74\xc4\xd1\x23\x88\x3e\x0c\x0c\x0c\x2b\x27\xa8\xd2\x2f\xd1\xa7\x2d\x64\x1b\x7a\x31\xd8\xe9\xec\x76\xa6\x41\x68\x4f\xe9\x9c\x41\x79\x47\x89\x51\xc2\x2e\x31\x1a\x1c\x2b\x0b\x1e\x78\xd8\xe0\xc9\xcd\xbb\xf1\x4c\x5c\x0f\xcf\xff\x32\x7c\x3b\x12\xee\xaf\xd3\xab\x9f\xc7\x17\xa3\x0b\x9f\xf4\x18\x5e\x5e\x74\xd2\x1d\x03\x31\xbc\xfc\x20\x46\x7f\xbd\x9e\x8e\x66\x33\x71\x35\x15\xe3\xf7\xd7\x93\xf1\xe8\x82\x3f\x30\x1e\xcd\x32\x31\xbe\x3c\x9f\xdc\x5e\x8c\x2f\xdf\x66\xe2\xf5\xed\x8d\xb8\xbc\xba\x11\x93\xf1\xfb\xf1\xcd\xe8\x42\xdc\x5c\x65\x90\x78\xe8\x7e\x4d\x5c\xbd\xe9\x24\x3b\xdc\x08\x1e\xca\x76\x88\xe1\x74\x14\xf2\x14\x17\x03\x31\xbe\x14\x97\x57\x62\xf4\xf3\xe8\xf2\x46\xcc\xde\x0d\x27\x13\x78\xe1\xf0\xf6\xe6\xdd\xd5\x74\x26\x5e\x8f\xc4\x64\x0c\x65\x84\x37\x57\x30\x17\xf7\xc4\x0f\xf8\xf4\xcb\x0f\xe2\x62\x3c\x1d\x9d\xdf\xb8\x29\x84\xbf\x9d\x8f\x2f\x46\x97\x37\xc3\x49\x26\x66\xd7\xa3\xf3\xb1\xfb\xcb\xe8\xaf\xa3\xf7\xd7\x93\xe1\xf4\x43\xe6\xd6\xe0\xfc\xea\x72\x36\xfa\xd7\xdb\xd1\xe5\xcd\x78\x38\x11\x17\xc3\xf7\xc3\xb7\xa3\x99\x18\x4e\xc7\xb3\xf1\xe5\x5b\x37\x1e\xf7\xe4\x5f\x86\x1f\x84\x5b\x49\xca\xbc\xdc\xce\x46\xf8\xd7\xb0\x09\xbf\xb9\x4e\x1a\x7c\x7b\x3e\x3a\x1f\x4f\x26\x27\xe7\xbf\x9d\x02\x38\x2c\xff\x5f\x3e\x3f\x3b\xfb\xae\x25\xff\xcf\x9e\xbd\x7c\xf1\x87\xfc\xff\x3d\xfe\x9c\x2b\xdc\x7d\xf1\x66\x3a\x1a\x89\xd9\xd5\x9b\x9b\x5f\xdc\xe5\x81\xa6\x14\xee\x22\xbd\x9d\x8e\x20\xeb\x48\xc9\x71\xb4\x14\x87\xde\x83\xd4\x56\xc8\x56\x85\x09\xcb\xd1\xe0\x66\x22\x72\x8a\x60\x66\x3e\x0d\x95\x6b\xbb\x68\x2c\x82\x9a\x38\x9a\x0c\xd4\x48\x08\x13\x76\x66\xb3\xa9\x72\x84\xb6\xa8\xd2\x36\x15\xb9\xb0\x1a\xa2\xb0\x3e\xa1\x5c\x6f\x0d\x10\x36\x73\x5f\x41\x20\x24\x69\xb4\x0f\x41\xe5\x95\x5c\xd6\x8c\x85\xfd\xef\x62\xa9\x2b\x5b\x17\xbb\xac\xf7\x59\xf1\x23\x7c\xbc\x0e\x3d\x97\x54\xc1\x24\x33\xfe\x91\xc1\x68\xb5\xe1\x0a\xa6\x85\xc9\x55\x26\xe6\x95\x91\x79\x4f\xfc\xb5\xb1\xaa\xb2\x19\x8e\xc7\x2a\x67\xf6\xbb\x01\x81\xcd\x5a\xb0\x83\xb4\x14\x32\x1a\x03\x18\xfe\x6f\x9c\xe9\xbd\xc2\xbf\xc3\x90\x51\xbb\xe8\x9a\x1c\x3e\x24\x52\xad\x33\x31\x37\xce\xc9\x74\xf6\xf8\x9d\xac\x72\xcb\x11\x3b\x10\xf7\xa6\xa2\xc0\x48\x3f\x5c\xc9\x7b\x18\xb8\x1c\xbe\x15\x2b\x6e\x61\x8d\x60\x23\x98\x29\xbe\x84\xf6\xca\x7d\x63\x65\x8a\xdc\xfd\x8e\x5c\x2d\x37\x2f\xb3\xd6\x0b\x9e\x3f\xc4\x66\x38\x74\xea\x3c\x0e\xe5\xbf\x4d\xdf\xc0\xa3\xf8\xef\xff\x33\x9c\xa0\x0a\xbb\x0c\x01\xdd\xb8\x59\x3b\x4d\x2c\x2b\x2d\x89\x35\x64\x54\xaa\xea\x4e\x2b\x31\xac\x0d\x36\x12\x38\xc1\x32\x60\xe9\xdb\xdd\x31\xc7\xe8\x22\x23\xbe\xb2\x85\x2c\x68\xee\x79\xe3\x36\x54\x16\xe0\xb3\xc8\xca\x39\x78\xb6\x96\x00\xfd\x43\x2a\xa0\x95\xbc\xe7\x13\x44\xa7\xc2\x2d\x13\x70\xb1\x98\xa5\x8f\x8b\x0a\x59\x8b\xb3\x97\xa2\x6a\x94\x98\xa8\x79\x21\xcb\x45\x06\xb8\x03\x20\x79\x9d\x28\x71\x6d\x80\xdf\xf1\x22\x13\xdf\xbd\x7c\x76\xfa\x12\x8b\x96\xdd\x4e\xba\x73\x37\xf0\x73\x43\xae\x95\x4b\x0e\xd3\x21\x17\xc2\x54\x2d\x56\xaa\x5a\xac\x94\x98\x45\x64\xa9\x6e\x96\x50\xe4\xdc\x33\x4d\xdc\x38\x37\x53\x03\x54\x01\xd8\x16\xe4\xcb\x66\xf5\x1c\x26\xf5\x5e\x2f\x56\xaa\x38\x19\x96\xce\xd2\xf8\xee\xe5\x77\x3f\xbc\xc0\x29\x88\x85\xca\xd5\x27\x71\xfa\xaa\x33\x97\x31\xa1\x00\x92\xd9\x84\xa9\xa8\x52\x8c\x23\x5a\x23\x22\xd7\x18\x52\x6a\x03\xe7\x47\xb5\xdb\xbf\xf1\x04\x2f\xb0\x35\xac\x1b\xde\xcf\xa6\x68\x16\x4a\x36\x99\x98\x9a\xc5\xdf\x1b\xb4\xa4\xea\x4c\xbc\xbe\x16\xa7\xcf\x5e\x66\xe2\xbb\xef\x4f\x5f\x3e\x07\xfa\x80\x95\xb2\xa5\xdc\xe1\xec\x93\xa9\x5f\x57\x4a\x02\xf3\xc8\x0d\x40\xd3\x21\x88\xe2\xcd\xab\x87\xe4\xa3\xb6\x01\x8f\x08\xb2\x21\x05\xe4\x06\x8b\x5a\x54\xea\x84\x63\x0c\x3e\x0b\x81\x52\x22\x8a\x19\xc4\x58\xb4\x1b\x70\x84\x7d\x68\x8a\x47\xe4\xc1\x7c\x3e\xe6\x20\x8b\x90\x85\x8c\x40\xbf\x1c\x7f\x0b\xf0\x68\x8a\xd4\x11\xb1\x55\xbd\x8b\x2c\x4b\x46\x56\xaf\x65\xee\x3f\x17\x09\x44\xbe\xe7\x7e\xe4\xd6\x08\x60\x41\x0f\x10\x20\x25\xa8\x7e\x4f\xdd\x9b\x02\xa4\x2d\x52\xcf\x96\x58\x0e\x9a\xab\xca\x87\x43\x83\xcc\x6d\xbf\x86\xc5\x57\x80\x75\xb6\x3d\x93\x98\x78\x51\x79\xc9\x4c\x68\xa7\x80\xb6\x87\xad\x70\x03\xf5\xce\x0a\xc4\x2a\x31\x86\x27\xb8\xf8\x79\xcb\x98\x2e\x7e\x2f\xcf\xef\x1b\xd6\x65\x28\xdb\x51\x3e\xee\x11\x8f\x41\xe8\xda\x06\x26\xa6\xef\x79\x24\x20\x21\xdd\x7b\x01\x63\xc6\x6f\xf5\x38\x06\x5e\x20\xdc\x57\x6c\x50\x91\xd1\xfc\xed\x47\xe6\x17\x96\x5c\xbe\x28\x0a\x23\x31\x08\x0e\xe5\xd0\xbc\x2a\x84\xd7\x03\x97\x4d\x01\x97\x30\xd5\x4a\x73\xd1\x88\x8f\x11\xf3\xe6\xd1\x6a\x41\x93\x20\xf8\x37\xa5\xa7\x68\x43\xdc\xcf\xbf\x41\xd2\xd0\x12\xa3\x87\x58\x6d\xeb\x36\x37\xbd\x0f\xb6\x96\x75\x63\x33\xd2\x66\x6b\xb9\xf3\x11\x5f\x54\xd1\x0b\x19\x3b\x99\x5e\x57\x93\x21\x41\x8a\xc9\x42\xec\x4d\x87\x18\x14\xc1\x3b\x60\x2a\xaa\x0a\xb9\x80\x4a\xab\x72\xa1\xf2\x88\xcc\x5c\x16\xd6\x8b\x8d\xf2\x24\x57\x9b\x7a\x15\x90\x2a\x1f\x4b\xb3\x2d\x54\xee\xbc\xb5\x5b\x7f\x1c\x6a\xce\x36\xb7\x9c\x2e\xb7\xb4\x24\xa2\x6c\x4d\x9b\xa9\x6b\xc6\x9b\xb4\x4f\x7f\xaa\xa0\x75\x95\xe6\x89\x30\xc1\xc0\x5d\x13\x54\xe9\x84\x1c\x6f\x81\x5a\x34\x55\x78\xa2\xae\x84\xdd\xd9\x5a\x61\xd6\x19\x76\x50\xd6\x92\x82\xf1\x68\x38\xc1\xa8\x32\x8c\x84\xde\x61\x71\x3a\x58\x1c\xb0\xa6\x58\xc5\xb1\x71\x57\x0b\x56\x9d\xb2\x86\x56\xae\x55\x3c\x04\xb3\xf4\x2f\xa6\x40\x5c\xb0\x02\x29\x43\xb9\xac\x94\x02\x97\x93\xea\x8c\x70\x31\x08\x51\xaf\xf2\xc8\xe9\x47\x9b\x05\x11\x2f\xb5\xaa\xdc\xef\xf0\xfc\x4b\xe7\xf8\x47\x69\x42\x74\x6d\x11\x4d\x27\xf3\x1c\x9d\xf7\x4a\xad\xcd\x3d\x81\xc3\x96\x95\x59\x93\xa4\xeb\x0c\xc9\x43\x5b\xb0\x1c\x0d\xa2\xb0\x7e\xf9\xdd\xf9\xc0\x23\xf7\xe0\xe5\xf4\xc5\xe5\xce\xc0\x6b\xe6\x6b\x5d\x7b\xcc\x54\x8d\x49\x12\x16\x5b\x51\x7e\x13\xa8\x11\x99\xb1\x46\x9c\x88\x8b\xd1\x1b\xe8\x10\x46\x9d\xa3\xde\x50\xfe\xb2\xad\x2b\xfc\x0c\x32\x24\x2d\x48\x6b\xdd\x28\xa6\xc9\x8d\x9e\x31\x3d\x4f\xf2\x68\x21\x37\xba\x96\x85\x28\x54\x0d\xed\x9d\xeb\x95\xe2\x4c\x19\x48\x8e\xf4\x49\x6b\x25\xcb\xa8\x42\x8c\xfe\xe7\xdf\xfe\xa3\xaf\xb2\x89\x22\x23\x32\x8c\x0d\xac\x28\x37\x61\x68\x1d\x0e\xed\x84\xe6\x04\x43\x0a\x55\xe9\x88\x40\x29\xd5\xa7\xd0\x00\x90\xfe\x17\x4c\xe7\x50\xcc\xe3\x77\x46\xa3\x94\xb8\xc2\x64\xd4\x39\x89\x74\x77\xb0\x5b\xb0\xdf\x35\x1e\x6b\xc8\x75\x27\xd4\x6a\x60\xf7\xc7\x65\x3c\x99\x78\x2a\xad\xd0\xf6\x69\x58\xd4\x89\x07\x22\x00\xb4\x83\xd8\x15\x78\x86\xad\xf1\x72\x97\xb5\xbe\x71\xcf\x5a\xe3\x8e\x07\x09\xe7\x1f\x97\x68\xd7\x99\xd4\xd7\xcc\x00\x2f\x10\x38\x33\x51\xfc\x29\xef\x80\x7a\x52\x1c\x8a\x27\x5c\xd8\x33\xcd\xf7\x1c\x20\x3a\x38\x4f\x1f\x46\x9a\xef\x9c\x21\x55\x28\x69\x6b\x61\x4a\xcc\xc5\xdf\x55\x20\xae\xe3\x3e\x67\x9d\xbd\xf7\xeb\xc3\x8f\x67\xa8\xe4\x2c\x68\x4e\x5d\xda\xba\x6a\x08\x1d\x07\xcb\x48\xe1\xb1\x02\xfa\xf9\xd7\x86\x2e\x2f\x99\x01\x20\xf9\x41\x7c\xe6\xc1\xac\x88\x2a\xb5\x66\xde\xf1\x48\xc6\x12\x6d\x47\x3c\x55\x8a\xc8\x2d\x75\x01\x68\x09\x48\xe6\x04\x30\x20\x27\x53\x75\x91\x00\x17\xa2\x79\xb5\xde\xf2\x0e\x84\x4b\xfc\x02\x14\x37\x1e\xee\xbc\xc7\x5b\x42\x7c\x43\x7a\xf2\x5a\x8f\xe6\x53\xdc\xbb\x51\x4e\x07\xbb\x77\x90\x76\xc3\x83\x4e\xf0\xf4\x7d\x47\xe0\x3c\xa0\xb1\xfd\xee\x84\xbb\x42\x4f\x02\x03\xef\x0b\xb6\x9e\xd3\x56\xf1\x68\x71\x71\xb2\x76\x2d\x4d\x9c\x6a\x8d\x13\xad\xee\xb2\xc4\x21\xd7\xf6\x94\x43\xe9\xee\xde\xab\xdc\x3b\x52\x3f\xd9\xa0\x2a\x12\xa3\x36\x13\x0b\x53\x51\xfa\x12\xeb\x80\x4a\x6a\xba\xe7\x6c\xb7\x5c\x6e\xb8\xa1\x16\x89\xaa\x52\x6d\x05\x03\x5b\x91\x37\x96\x5e\xea\xc9\x53\x62\x39\xe1\x6e\x52\x78\x71\xb4\x07\x6d\xc1\x39\x55\x58\x8d\x80\x5d\xf4\xc2\x0e\x59\x85\x69\x54\x78\xa6\xa5\x93\x1b\x40\x08\x68\x26\xa4\x95\x8d\x4e\xd9\x66\xbd\x89\x36\xd1\x1d\x61\x86\x26\x88\xc2\x66\x78\x48\x0f\x0b\x57\xc4\x4f\x31\x14\x84\x81\xf1\xe2\x69\x41\xe1\x59\xa8\xe1\x96\x4e\xd3\xb3\xe1\xb8\xe7\x40\x47\x08\xc9\xb6\x10\xc2\xaa\x35\x0f\xd4\x0a\xf7\x0e\x3f\x96\x75\x03\xfc\x58\x9f\x2a\x64\x6b\xd9\x5a\xaf\x24\x9e\x37\x7c\x0d\xc6\x35\x52\x05\x41\x96\xb9\xaf\x32\x23\xc7\xca\xaa\x44\x1f\xc7\xf5\x6f\xf0\x10\x5d\x0a\x67\x62\x37\x85\x44\x74\xe4\xa6\x68\x2a\x59\x80\xd8\x4f\xac\x83\x33\x71\xc2\x81\x6b\x76\xd9\x12\xab\x40\xa5\xf1\x36\xf7\x03\xf4\x15\x3b\x65\xbe\x26\x1d\x38\x4c\xbd\x55\x65\xcc\xfd\x79\x11\xe8\x52\xe6\x58\x9f\xbc\xd5\x79\x70\x4c\x19\x5a\x35\x8b\x2c\x55\x77\xbe\x96\xa6\xc2\x59\xf1\xc0\x5f\x12\x60\x12\xe1\x50\xfc\xb5\xed\xca\x14\x54\xb7\x4b\xc3\x8f\xe2\x48\x2d\x5f\x2b\x89\x0d\x49\x9d\xa7\xa7\x82\xdf\xf3\x5c\x9c\x88\xe1\xf9\xf9\xe8\xfa\x66\x78\x79\xce\xad\xc1\x9f\x03\x39\x41\x34\xdb\x76\x89\x9f\xb4\xbd\x82\x6f\xbf\x5e\x4c\xec\xc7\xe0\x0c\x2f\x00\xf2\xe3\x91\x9f\x8a\xb4\x2e\xff\x23\xd8\x66\xf7\xce\x70\x8f\x7a\x48\x1e\xe9\x63\xf6\xb6\xd2\xf5\x4c\x6f\x3b\x1c\x6e\xa4\xa1\x9e\x3b\xab\x7c\xbe\x13\xb9\xd9\x96\xfc\x4d\x50\x39\x12\x6c\xde\x1a\x5b\xe7\x91\xb4\x9c\xef\x44\xeb\x33\x9b\xd5\xce\x42\x50\x64\xad\x72\xdd\xac\x7f\x8a\x87\x42\x50\x0d\x1c\x7b\xad\xd7\x2a\x3d\x2a\x0c\x1c\xb5\x07\x90\xa3\xbe\x16\x63\xe0\xb7\xe0\x4c\x5c\x95\x69\xed\x6f\x64\xbf\x3a\xaf\x5e\xea\x12\xc1\xa2\x25\xd7\x56\xc5\x20\x47\x15\x8a\x15\xb4\xad\xf5\xc2\x76\xef\x34\x7d\xae\xed\x6c\x67\x71\xbd\xd3\x52\x2e\x7a\x1d\x41\xc6\x56\x00\x88\x3a\xb8\x7e\xe8\xd7\xaf\xa4\x15\x73\xa5\xca\x28\x13\xd9\xba\x3e\x58\x75\x4a\x96\x7d\x04\x00\xde\x77\x1d\xdc\x89\xa4\x0b\x31\x37\xee\xae\xa5\x82\xc3\xa9\x4f\x4a\x20\x2e\xbc\x5b\x69\x7d\x64\x75\x05\xfe\x20\x39\x90\xb0\xcc\xb6\x36\xc6\x59\xd9\xc9\x5d\x78\x21\x4e\xc4\xe8\xcd\x9b\xd1\xf9\xcd\xf8\xe7\x91\xb8\x18\xde\x8c\x20\x23\x76\x33\x9a\xbe\xa7\x5d\x79\x31\x38\x6d\x7d\x82\x7e\x71\x93\x48\x12\xbe\x2e\x0b\xb3\x56\xc4\x17\xef\x84\x2e\x9d\x7a\x00\x01\x47\x96\xa6\xbf\x42\x89\xcc\x51\x07\x17\x63\xe0\x07\x74\x16\x8f\xaf\x6f\x18\x95\x82\x10\xbe\x2e\x89\xd0\x9d\x65\x89\xd3\xf9\xc0\x42\x0d\xa5\x39\x24\x52\x22\x71\xf2\x90\xf5\xd4\x2b\x4e\x5e\x8a\x13\x31\x3b\xbf\xba\x86\x64\xdb\x74\xfc\xf6\xdd\xcd\x4c\xbc\x9d\x0e\x2f\x6f\x46\x17\x2c\x7f\xf7\x30\x3a\xb4\x4e\x08\xda\x22\xe4\x3f\x64\x2d\x71\xb0\x6f\x28\xbe\xdc\x87\xae\x3f\x44\x35\xdc\x9e\xf3\x9c\x63\xc9\x19\xdd\x26\xda\x98\xb9\xb4\xda\xa6\xe8\xb1\x96\x2c\x0b\xdb\x11\x49\x67\x58\x80\xd7\x88\xff\xcd\x84\x4e\xcb\xa6\x85\xd9\x96\x44\x56\xb5\xa6\x1a\x8b\x6d\x09\x66\x1d\xc3\xa7\xa8\xfe\xd9\x2f\xbd\xbb\xd2\x58\x7d\x1c\xaa\xbb\x54\x6c\x0c\xa4\xd7\x18\xcb\x94\x09\x73\xb3\xde\x98\x92\x8a\xa9\xe3\x31\xc0\x91\xaf\xe5\xc7\x80\x65\x8a\x11\xa4\x2d\x51\x84\xa7\xd0\x86\x81\x31\xdc\x3c\x8a\x9e\xf1\x2e\x59\x8e\x74\x51\x07\x37\x0a\x6c\x85\xb8\x57\x72\x50\x28\x29\x1f\x3f\xba\x0a\x5d\xed\x21\x52\xb1\x6f\xd8\xb5\x09\x8e\x36\x7f\x41\x81\xc5\x34\x07\x0e\x09\x1f\x13\x8d\x9b\x6d\x24\x97\x87\x92\xf1\x95\xbc\xab\xe4\x66\x15\xba\xc7\x9f\xe2\x31\x75\xe7\xf5\x76\x16\x5f\x67\x7f\x0d\x35\xc7\x1a\xf5\xff\xe3\x83\x65\x2d\x49\xca\x96\x1e\xa2\xf0\x7d\x1d\x90\xb4\x2c\xe2\x96\x5a\x15\x39\x82\xc9\x03\x2c\x9b\x22\x6e\xba\x16\x73\x05\x24\x18\x91\xc6\x87\xf2\x34\x2a\x78\x95\x04\xab\x84\xae\x56\x4e\x91\xa4\xcd\x94\x37\xaa\x5a\xcb\x92\x2b\x8f\xd5\x7a\x63\x2a\x59\xed\xd2\x06\x65\xee\xc5\xdd\x43\x75\x48\x6b\x52\x32\x27\xfe\xb9\xb7\xae\xf0\xcf\xd9\x20\x04\x3c\x89\xe9\x05\xfe\x5e\x35\x65\x09\x7f\x71\x66\x6b\x6d\xaa\x8e\x8e\x36\x65\xfa\x36\xa7\x50\xa3\xe7\x3e\x1f\x30\xf6\x18\x33\x9c\x46\x98\x39\xe8\xe6\x4c\xd8\xba\xc9\x77\x38\x4d\x8b\x1a\x09\x83\x6b\x80\x7e\x65\xd7\x34\x57\x88\xee\xc5\x4d\xd2\xb9\x92\xec\xe5\xfa\x0c\xe4\x5c\xad\x34\x95\xf0\xd0\x28\x3c\x59\x7f\x59\x0b\xc5\x2d\x1a\x9c\xd5\x9f\x58\x4e\x04\x2b\x06\xb9\x8a\x11\xb0\x6e\xcc\x63\x21\xab\x0a\xf0\xe7\x74\x1e\xe8\x05\x87\x97\x0a\xce\xb4\x87\xd0\xe1\xba\xc9\x3b\x15\x4d\xaf\x95\x73\x8c\xb4\x38\x29\x39\x68\xd9\x19\x20\xdb\x58\x8e\xed\x06\xd1\xb1\x2d\x5e\x0e\xce\xc2\xa1\x7f\x7f\x75\x31\x7e\x33\x3e\xf7\xdd\x6d\xe8\xf4\x13\x76\x6f\x99\x3a\x2f\x11\xaa\x27\x4a\xa2\xb0\xc3\xa6\xc8\x5b\xcb\x04\x58\x12\x77\x08\x26\x25\x02\xc4\x7e\xd7\x2f\xb8\x43\x3c\x9d\x24\xc3\xd0\xa5\x56\x0a\xc5\x83\x36\x88\x95\xda\x0f\x0c\xea\xf9\xb9\x51\x99\xac\xb2\xf4\x51\x54\x29\x26\xfb\x3c\xa1\xc1\xa3\xae\xfe\xa1\xc9\xb4\xe7\x92\xe2\xb0\x30\xfc\xeb\xf1\xc5\x20\x31\xf5\x42\xa7\x7c\x25\xda\x7b\x21\xf8\x5a\x7f\x02\xd3\xee\x0f\x98\x66\x85\xe8\xbd\x0d\x26\x05\xd7\x7c\xbb\x49\xa2\x13\x8a\x20\x73\xbf\xeb\xcf\xc3\xae\x5f\x8c\x67\xbe\xdb\xbe\x77\xde\xf7\x2c\x1c\xe2\x09\x42\x8e\xbe\xff\x10\x50\x28\xda\x1f\xe5\x9a\xd1\xd9\xd4\xa3\x25\x15\x99\xbc\x56\x14\x31\xe7\x74\x64\x9f\x64\xf0\xe5\x69\x5d\xbb\xbe\x73\x56\xd6\xb2\xfa\xa8\x6a\x5f\x23\xae\xfb\x72\x5b\x62\xa9\xf0\x60\x2e\x2b\xf4\xe3\xb0\x0f\x53\x96\x28\xe5\xb4\xee\xb2\x2d\x27\xe1\xf5\xfb\x0e\xcc\xb2\xa9\x30\xa4\x9e\x1c\x9c\xbd\x35\x9d\xb1\x63\xdd\x94\xeb\x76\x94\x90\x2a\x96\xaa\x9c\x5a\xe2\x82\xb9\x68\xaa\x3c\xb2\xf3\x3f\xd3\x52\xf1\xa7\x61\x70\x3a\x48\xce\x81\x3b\x17\x1e\xa4\xc2\x40\xb4\x1e\xf1\xf0\xe0\x25\x89\x81\x89\x55\xb3\x77\x31\x75\x99\x92\x61\x54\x9d\x08\x6e\x0b\xca\x88\x57\x21\x39\x8b\x98\xc6\x52\x36\x80\xff\xc9\x29\xe6\x1c\x47\xc7\xcb\x87\xcb\x83\xab\xb8\xde\xc8\x12\x63\xad\x91\x42\x45\x9d\x2a\xf7\x38\x5e\xc9\xe7\xce\x06\xfb\x9d\xaf\xb4\xac\xb8\x15\xf8\x80\x62\xe7\x24\xb7\x19\x4a\xa7\xf7\x18\xfd\x56\x7c\x0f\x1f\xfc\x21\x1a\x02\xa7\x75\x3c\x89\x09\xb8\xc9\xb8\x54\x58\xf9\xb1\x52\xc9\x9a\x76\x76\xc0\x26\xd9\xda\xc4\xfe\xc2\x32\x42\xb3\xb5\x91\x03\x93\xe6\x85\x97\x4d\x51\xf4\xd1\x99\x84\xd8\x46\x2d\xa4\x58\xeb\x52\xaf\x9b\xb5\xc8\x1b\x6f\x08\x90\xe7\xe1\xbc\x46\x93\xb3\xf1\xda\xc5\x99\xc6\x5a\xc1\xdb\x48\x91\xf7\xe6\x8b\x1b\x39\x1e\x26\x0b\x28\x25\xc2\x0c\xf6\xdf\x1b\x1d\x59\x1e\x61\x90\xa1\x98\x51\x7d\x5a\x28\x0a\x5c\xf0\xd7\xbc\x2d\xea\xc1\x49\xb2\x96\xad\x5b\x73\xd6\xbd\x35\x78\x49\x46\x17\xfe\xfa\x84\x6f\xfc\xd2\xb1\x0f\xd6\x60\xd0\xca\x72\x5f\xb4\xb4\xab\x12\xf7\x5e\x72\x76\x6b\xfa\xd6\x2e\x28\xca\x4e\xe6\x81\x3d\xd3\xa8\x96\x6e\xdf\xcd\x89\xe3\x36\x83\x2f\xb9\xff\x2b\xd5\x7d\x3f\x9c\xd7\x04\xbc\x50\x41\xe3\xa3\x45\x8d\xff\xfc\xe3\xea\xff\x3a\x57\x3f\x5e\x53\x9a\x4e\xf7\x2c\xfc\x0a\x32\xa0\x07\x87\xd2\x7d\xcf\x57\x0b\x83\xbe\x63\xf4\x55\x52\x21\x1e\xf6\x57\x4b\x85\xe7\x5d\xa9\x70\x31\x9a\x8e\x7f\x1e\x42\xa4\xe8\x31\x72\x01\x8d\x53\xdb\x67\x9b\x52\x05\x5b\xcf\x6f\x38\x32\xde\xcd\x53\xca\x1e\x30\x54\xc2\x4f\x96\x26\xc4\x23\x59\xd0\x87\xde\x8c\xf0\x13\x58\x0a\x05\x26\x60\xb8\x03\xad\x6a\xc7\xbd\x01\x1a\x99\xb0\xa0\x71\xd4\xe8\xd5\xe0\xc5\x00\x71\x36\xe1\x20\x47\x86\x2c\x1d\x80\xbe\xe9\xfb\xc4\x64\x62\x20\x77\xb3\x86\xad\x53\x1d\x47\x16\xa2\x1a\x09\x2f\x03\x1e\x12\xa0\x5b\x8d\xe1\xf0\x0e\x3e\x6c\xbf\xb8\xa8\x57\x7b\x33\x79\x96\x2f\xf1\x63\x5e\xb9\x28\x94\xac\x8a\x5d\x4c\xf4\x05\xc5\x5e\x94\x7f\x0a\xe5\x1b\xf8\xe7\xf9\x20\x9d\x39\x3c\x06\xa9\x50\xf6\xdd\xe9\xc7\x5c\xe7\xec\xf1\xf7\xb9\xef\x2e\xf7\x9e\x71\x28\x9d\x43\x61\x0f\xc4\x76\x2d\xdc\x1b\x9c\x73\x74\xae\x73\x3c\x59\xc0\x0c\xd9\x05\x47\xb4\xad\x87\x9f\x3e\x5b\x4e\x6c\x9a\x6a\xb1\x92\xb6\x4f\x50\xec\x95\x6f\x5f\x2d\x41\x5e\x0c\xa0\xcd\xd2\xf0\x66\x4c\xd5\x18\xc0\x0d\x75\xf3\x6e\x44\xe0\x5d\xc6\x8d\xb7\x64\x88\xec\x19\x0b\x65\x07\x0e\x5a\x19\xad\x42\x7a\x7a\x47\x0f\x1c\x05\xb0\x3c\xf0\xa2\xbe\x0b\x18\x5e\xd5\x4a\x04\x3e\xfe\x05\x2d\xb5\xdd\x8a\xda\x29\x72\x7f\x74\xad\x20\x74\x1b\xc9\x0c\x64\x53\xdb\xe0\xe6\x25\x61\xe8\x57\x00\x75\xbd\x19\x4d\x26\xa3\xf3\x9b\xdb\xe1\x44\x5c\x4f\xaf\xae\x47\xd3\x9b\x0f\xb4\x78\xaf\x06\xa7\xe2\xea\xe7\xd1\x14\x6b\x63\x2e\xc7\x50\x48\xd2\x12\xd2\x37\x3e\x81\x8e\x31\xdc\x83\xc1\xf0\x0e\x94\x00\x98\x10\x42\x18\x9a\xcf\x4d\xfb\x73\x4e\xfd\x3e\x20\x7a\x7b\x2d\x3f\x94\xf1\x01\x63\x45\x03\x5d\x49\x8b\x38\xf7\x8e\x21\xe6\xb4\xea\x96\x29\xeb\x4a\x03\xce\x6e\x6f\xa9\x7f\x04\xec\xf8\x2c\x9b\x13\x0c\xb4\x7d\x88\x8a\x68\x2d\x5b\xa2\xb7\x7f\x55\x40\x4a\x51\xe2\xa2\x6a\xdc\xc8\x3c\x22\xa2\x2b\x69\xc3\x90\xb8\xd3\x7b\x6f\xd6\xe4\xc5\xe0\x6c\xe0\xb7\xff\x2c\xde\xfe\x9b\xd1\xdb\xe9\xf0\x66\x74\x81\x6d\x00\x49\x83\xcf\xfa\xdc\x7b\xc0\x47\x20\xf0\xf1\xe0\xe5\xa2\x20\x0e\xd2\xad\xd3\xd6\xf7\x17\x05\xa4\x07\x09\xca\x83\xa3\xe7\x44\xea\x72\xbe\x6b\xb1\x60\x85\xc9\x3c\x0f\x93\x99\x8e\x26\x30\x93\xf7\x57\x17\xb7\x93\xd1\x23\xe6\xd0\xbe\xb5\x5f\x31\xf2\xd6\x93\x0e\x8d\x9d\x4d\x71\x08\xc1\xb8\x73\xbf\x32\x86\x82\xea\xf5\x0e\x79\x41\x5a\x25\x2e\x78\x56\xa9\xb7\x4f\xc7\x44\x8c\x28\xad\xc2\x49\xed\x31\x34\xd0\x52\xf3\x0b\xf7\x42\x5c\x5e\xdd\x8c\xcf\xa3\x64\x55\xdf\x82\x05\x9e\x93\x70\x76\xd3\x08\x3c\x25\x55\x10\x3b\x99\x85\x0c\x48\xc6\x01\xf4\xb5\x2c\x4b\xc2\x0d\xee\x59\x4d\x5f\x92\x59\xd7\x72\xb1\x0a\x19\x53\xaf\xc4\x92\xb8\x7b\x12\x16\x85\x9b\x47\xdf\xcf\x98\x14\x1a\xac\x03\xc8\x57\xd3\xab\x3d\xab\x4d\x6f\x2c\xa6\x05\xef\xf8\x29\x89\xc6\x87\x22\x21\xd8\x8a\x48\x9c\xc5\xa6\xb8\x7d\x68\x66\x14\xac\x8b\x33\xca\x40\x47\x98\xd8\x50\x2d\x40\x06\x87\x39\x31\x15\x11\xf5\x99\xd1\x56\x28\x69\x75\xb1\x23\xe3\x45\x23\x21\x06\x66\x4d\x90\xc6\xc9\x03\xca\xb0\x70\x9f\xea\x14\x5a\x74\xa6\x07\xc3\xbf\xdd\xbc\x19\xd2\x2c\x14\xbb\x98\x89\x01\x28\x83\x90\xf3\xe8\x11\xd7\x65\x19\xcb\x6b\x02\x34\xc5\xa0\x24\x4e\x46\x06\x93\x99\x92\xf1\xc0\x4e\xdc\x45\x33\xde\x6b\x7b\xf2\x1f\xff\x76\x72\xaf\x91\x5d\xc8\xd6\x72\xb9\xcc\x12\xaa\xbf\xb5\x92\x16\xda\x67\x7a\x63\x39\x6c\x28\x81\xda\xbd\x00\xff\xba\xb1\x27\x3a\xf8\x3b\xe8\x9c\x8f\xe2\x68\x36\x9a\xfe\x3c\x3e\xf7\xf2\xe8\xbb\xc1\xe9\x3e\xda\xc8\xc0\xed\x18\xce\x01\xe4\xf4\x54\x9a\x1b\x8c\x88\xdf\xa3\xfa\x23\x6b\xb5\x25\x26\xb1\x0a\x2a\xd7\x6a\x62\x81\xf5\xf0\xa9\x36\x00\x67\xe0\x71\x84\x5b\x75\xcf\x57\xd4\xbf\xa5\x95\x53\x21\x3a\x68\x60\xca\x22\x31\xc5\x0f\x0e\x8c\xfa\x7d\x00\x18\x34\x6d\x7b\xc6\x99\xf1\x32\x12\x97\xb3\x1f\x71\x16\x51\x1e\xc5\xda\x4c\x0a\xab\x36\x12\xf1\xe4\x00\xe3\x84\xc8\x8c\xb8\x62\x9f\x3f\xe4\x9d\xdd\x58\x21\x4f\x02\xf9\x83\x68\x2d\xe8\x8d\xbd\xcb\xe6\xd7\x09\xdf\x0e\x9c\x3c\x51\x84\x82\xd1\xf9\x03\xbf\x91\x67\x62\xa6\xd7\xba\x70\x2e\x09\x9e\xba\x07\xd6\x0e\xd3\xa1\xcc\x54\x66\xb9\xef\x02\xb6\x34\x2f\x22\x3e\x0d\x78\x61\x26\x64\x04\x4b\x89\x14\x01\xc4\x38\xe6\x80\x26\x85\x50\x38\x40\x8a\x74\x6d\x55\xb1\x0c\xf6\x40\x14\xd7\xe8\x71\x0b\xfc\x3a\xf4\xfb\x37\xa4\x52\xfa\x36\x34\x12\x5e\xac\xc0\x10\xc5\x3e\x10\x33\xb7\xd8\x2d\x20\x0d\x40\x83\xdc\xd2\x6b\x02\x5a\xf4\x9d\x10\xc0\xc1\xc4\xa9\xe1\x0e\xe3\x15\xe4\x2e\x7a\x36\x9f\x7a\xa8\x39\x01\x4a\x95\x9e\xc9\x39\x68\x03\x65\x92\x3b\xfa\xbd\x38\x81\xf2\x6c\x70\x38\x68\x4f\xbf\x1f\x9c\x8a\x59\x6a\xbb\xa7\x41\x35\xff\xe5\xc1\x59\xcb\xad\xee\x35\x28\x91\xc4\xce\x59\xb6\xaa\xb4\x81\x9e\x2f\xb0\xb2\x22\xb9\xa9\xc6\xba\x02\xc8\xf2\xdb\x86\xf0\x8c\x11\x6b\x76\x08\x20\xc4\x7c\xab\x52\x2c\x25\xfc\x15\x67\x1d\x27\xb7\x7d\x5f\xd5\x40\xd6\x1f\x59\xda\x28\x3c\x10\x5b\xe6\x94\xe5\x42\xb5\xf3\x65\xdf\x0f\xce\x12\xbc\xca\x37\x36\xba\x08\x4c\x8c\x1a\x14\xf5\xc2\xac\xd7\xba\xc6\xbc\x31\x60\x78\x23\x36\xdd\x34\x04\x19\x3c\x45\x20\x5d\x27\xd6\xab\xd6\xc4\x92\x34\xe6\x8f\x84\x77\xb3\x56\xe4\x4d\x8a\x2e\xfb\xc6\xb9\xed\x44\x57\x0a\x5f\x90\x85\xa7\x80\xad\x8d\x58\x36\xc5\xd2\xd9\xd2\x90\x2a\x0f\xd0\x88\x0c\x51\x6b\x81\x55\x28\x65\x3a\x85\x37\xb1\x9a\xf5\x9b\xd1\x86\x27\xc1\x50\x7c\x45\x12\x31\xbd\x62\xa1\xec\xa2\xc7\x42\x70\x53\x47\x32\xa0\x76\xad\x0c\xb5\x4c\x68\x0d\x60\x90\x66\x24\xe1\x69\xdc\x36\x38\x98\x64\x60\x26\x52\xb3\x87\xe0\x71\x6d\xd4\xa2\x29\xb5\xac\xe0\x07\xbe\x32\x11\xa6\x75\xa4\x07\x6a\xe0\xf9\x74\x9d\x1f\x9e\xf9\x7f\x6d\x2a\xb3\xd4\xb5\xcd\x38\xed\x5e\xde\xc1\xaf\xc2\x07\x16\x8d\xad\xcd\x1a\x2a\x71\x2b\xac\xa0\x86\x0f\x6f\x4c\x55\x63\xc1\x9e\x73\xf8\x33\xcf\x9b\xd1\x54\x73\x49\x64\xb6\xa1\x3c\x72\x51\xeb\x7b\x60\x9d\x3a\x16\x29\x5a\x09\x91\x58\x81\x4e\x1b\x81\xfa\x40\xfb\x9c\x7b\x10\x4e\xb2\x03\xce\xae\x8e\xb2\x83\x3b\x96\x1a\x81\x2f\xba\x6f\x63\xd3\x33\xc8\x5a\xb4\x05\xb9\x48\xa0\x11\xf1\xd5\xe5\x1b\x99\x20\x76\x59\x24\xfc\x20\x4e\x3c\x75\x05\x5d\xa3\x1f\xda\x58\xd2\x2e\x42\x0f\x62\x2c\x3d\x85\xa8\xa0\x9c\x80\x78\xfc\xc4\x2c\x4f\xea\x95\x3a\x71\xd7\xdb\x23\x2e\x82\xb7\x28\x6d\x12\x00\xcd\xd1\x1e\x26\x58\x35\x1e\x08\xae\xa5\x01\x6a\x26\xac\xdf\xaa\x95\xad\x29\x7a\x76\xaf\x2a\x90\xff\xd8\x97\x83\xf5\x07\x52\xbc\xe1\x59\xf6\x0f\xc8\xd5\x52\x2d\x6a\x7e\x46\xae\x6a\xf0\xb6\x07\xfd\x65\x82\xd1\x2d\xf5\xd5\x7a\x01\x1d\x99\x57\x72\xeb\xd3\x3d\x5f\x5f\x51\x88\xc5\x97\x69\x49\x61\x58\x23\xac\xe8\x40\x93\x2f\x54\xf1\x75\xb0\x9b\xbd\x76\x70\x44\x2c\x97\xb2\x5d\xc1\xba\x21\x94\xa5\x37\x41\x5f\xf7\xd7\xe9\x11\x30\x09\x1e\xa1\x6b\x9b\x54\xe7\xa1\x2b\x71\x67\x0c\xc0\xa7\x3f\x22\xa2\xcc\xb3\xbd\xc1\x98\x9d\xe9\xea\xd9\x4d\x75\x1d\x1d\x66\xe4\x43\x43\xc6\x43\xb0\x72\x11\x07\x80\x0c\xd4\x96\xfa\xa5\x38\x9b\x56\x87\xb2\xa9\x1f\x5a\x72\x9e\x71\x89\x81\xe2\x0f\x9c\x27\x18\xd1\x52\xea\x7a\xb5\x17\x72\x43\x5d\x4f\xc8\x7e\xdd\x1b\x03\x8f\xe8\xce\x75\x47\xc2\xd1\xb7\xfa\x31\xe1\xc7\x61\xcc\xcf\x1f\x73\xa9\xd2\x28\x13\xf4\xc2\xc9\x7d\xad\x53\x1b\xe1\x1e\x63\xd8\x4c\x9b\x62\xbf\x96\x0b\x5d\x47\x86\x4d\x92\x49\x90\x75\x48\xd6\x2d\x91\x00\xd5\x0b\x84\xc1\x19\x96\x61\xb5\x60\x39\xf1\xcb\x42\x36\xcc\xc3\xe5\x22\x5e\xf2\x7b\x59\x34\xe4\x5f\x42\x8d\xa4\xbb\xa4\x56\x2e\x21\x89\x58\x1a\xf2\xe2\xa0\x70\x91\xd4\x7d\x29\xeb\x26\xd8\xf5\xb3\xc8\x23\x6c\x19\xf7\xd0\x2d\xd8\x9d\x1a\x1a\x40\xff\xba\x81\x85\x87\x20\xf0\x72\x27\x54\x55\x61\xcd\x31\x1e\x00\x88\x53\x71\x7d\x27\xcf\x09\xdc\xcd\xaa\xf1\xcd\x9e\xa3\x8f\xce\xb1\xba\x49\xd6\x70\x83\x7c\x88\x2f\x12\x13\x66\x5b\x02\x01\xe9\x26\x98\x0b\x51\xa8\x15\x7a\x3b\x93\x81\x58\x72\xf3\x31\x7e\xf8\x5a\xa9\xba\xfd\xb8\xf8\x66\x85\xc3\xf3\x22\x3d\xf0\x7e\x21\xd2\xd6\x0a\xe8\xe5\xc2\xce\x17\xbb\x03\x8b\xe4\xbf\xee\xbd\x60\xb7\x52\x91\x5a\x3a\xe4\x55\x26\xd9\x53\x66\x23\xce\x12\x1e\xe0\x70\x20\xd3\xaf\x26\xd4\xd4\xe9\xce\x52\xf7\x02\x9b\xf8\xc1\x91\x1b\x63\xb6\x1e\x48\x17\xae\x10\x31\xfa\x1b\xec\xba\x1c\x5b\x13\x91\x4a\xc6\xf3\x1d\x31\x1c\xc3\x7a\x50\x76\x22\xd2\xd7\xba\x8c\x7d\x6b\xb2\x91\xb2\x2e\x8e\xeb\xb0\x8f\x32\x10\x97\xce\x2b\xad\x57\xaa\x00\xa6\x60\xbb\x82\x0e\x39\xcc\xfb\xe9\x47\x95\xbe\xbb\xcf\x56\x68\xad\x10\x8a\x4c\xd6\xfd\x70\x82\xea\x55\x8b\xc9\x03\xed\x91\xc8\x39\x64\x71\xed\x54\x20\x30\x69\xce\x5a\x6e\x6d\xdf\x97\xa2\xd2\x91\x05\xd5\xf9\x43\x41\xad\x55\x27\xf3\xdd\x89\xfb\x3f\xe1\xae\x63\xef\xa5\x63\xbb\x77\xf1\xfe\x9b\xa6\xb2\x8d\x24\x63\x45\xac\xd5\xda\x54\xb2\xcc\x1b\xc8\x11\x50\x9a\x07\xc9\x28\x07\xad\xc3\xfe\xc0\xd9\x68\xe1\x2c\xa3\xbb\x14\xc5\xbd\x4a\xb9\xee\x58\xb8\xd0\x77\xc3\xcb\x32\x6d\xa9\x28\xbf\xf5\x3c\xf5\x49\xdb\xda\x1b\x15\x50\x05\xd1\x56\x14\x7d\x0f\x17\xd8\x84\x6d\xef\x93\x64\x68\x39\x94\x56\x47\x3f\x13\x27\x50\x20\x30\xbe\x8c\x21\x5c\xa7\xcf\x06\xa7\x69\xc2\x15\x9e\x31\xaf\xa0\xf3\x5d\xdb\xd0\x27\xf7\x34\x86\x56\x7b\x4c\x69\xeb\x5c\x41\x69\x78\x42\xa6\x1e\x48\xd6\x5b\xae\x90\x13\x10\xf5\x4e\x1c\x3d\x7f\x76\x2c\x72\xb9\xb3\xc4\xfc\x4c\x09\x65\x6f\x24\x59\x32\x48\xeb\x76\xd9\x18\x16\x75\xac\x25\xc5\x78\x7d\x36\x73\x10\xe6\x78\x26\x86\x49\xdc\xdb\xb6\xcb\xbd\x78\x6c\xc1\x20\x66\xb6\xf7\xb9\xea\x82\xbe\x3d\xcd\x45\x9b\x7c\x2f\x3e\x04\x3e\x90\x14\x31\xb2\x87\x90\x81\x77\x71\x19\x6d\xef\x0b\x61\x3a\x8c\xc4\x7b\x2b\x39\xee\x65\xa1\xf3\x56\x7a\x4d\x57\x5c\x90\x05\x8b\x16\x35\x2f\x78\x74\x4a\x29\xf2\x7e\xfd\xe9\x39\x15\x27\xe2\xfd\x78\x76\x3e\x9a\x4c\x86\x97\xa3\xab\x5b\x0e\xe0\x9d\x9e\x0e\x4e\xc5\xe8\xaf\xe7\xb7\x33\xa0\x76\x03\xf2\x37\xfe\x1d\x37\xcc\xbb\x4e\xe9\xa4\xa9\x3d\x4b\xab\x42\x23\x57\x85\x44\x0e\xdd\xc8\x69\x8d\x5b\x8d\x0e\xe3\x3c\x61\x90\xb4\x92\x5a\x4b\x85\x96\x2f\xe1\x1c\x63\x65\xc3\x5a\xfe\x4d\x35\xe8\x77\x0a\x89\x52\xf8\xad\xc9\x51\x9f\x78\x26\x72\xb0\x17\x29\xf3\x8c\xf9\x0a\xca\x88\x73\xb9\x05\x15\x34\xc4\x2a\x3d\xb0\x30\x39\x8d\x56\xe9\x05\x18\xb6\x95\xa8\xdd\xbf\x3d\xdc\x15\x3e\x58\xaa\x1a\x5a\xba\x66\xfc\x37\x28\x40\x28\x76\x4e\xdc\x85\x6a\x16\x29\xee\x75\xd5\x50\xe8\xff\x63\x86\x2f\x63\x62\xf6\xf9\x8e\x02\xe4\x68\x0f\xe0\x91\x44\xce\x62\x30\x74\x64\xe1\x8e\xa2\xb4\x35\xb8\xa2\x5b\xe9\xae\x10\xda\xbf\x99\x50\xb2\xaa\x57\x7f\x6f\xe4\x47\xf7\xe9\xa5\x76\x8b\x01\x75\x1a\x16\x43\x00\xee\x00\x7f\xa4\xc0\x7c\x21\xe7\x80\x3f\xad\x94\xf3\x5f\xb7\xce\x44\x53\xf5\x62\x10\xb6\xfb\x0c\x12\x9a\xbc\x49\xf3\x9d\x88\x77\x19\x2a\x68\x62\xf8\xac\x59\x2c\x24\xbd\x05\xd0\x22\xf7\xe6\xa3\x4a\x3f\xb0\x6c\x07\x96\xf0\xf8\xb1\x07\xdb\xf4\x47\x87\x5b\x5d\xea\x40\x46\xe0\x12\x6e\xa5\xbe\x47\x5a\x63\x1f\xf1\x47\xf7\x0e\x8f\x21\x89\x30\x0f\x14\xa6\x21\x41\x6c\xd4\x0f\xe2\xc8\x1e\x47\x70\x02\x6a\x4e\x8b\xd3\x7f\xde\x2a\xad\x5a\xb8\xf1\x14\x96\x7d\xae\x42\x2e\x94\x4d\x4d\x06\x75\xaf\x8d\xdb\x54\xfe\x8a\x0d\x64\x99\xcc\x9a\x0b\x31\x04\x59\x64\x89\xea\xe3\x10\x07\x8a\xb8\x7b\x8f\x41\x70\x4a\x81\x4a\x57\x99\xf8\x3a\x34\x85\x0a\xc0\x8b\xe0\x64\x75\xfb\x89\xc0\x6c\xf9\xf9\x11\x62\x07\x57\x01\x9f\x0d\x5a\x2c\xd4\x21\xfb\x5c\x56\x0b\xe3\x7e\x40\x82\x44\x51\xc0\x00\x30\xb1\xbd\x73\xa4\xe6\xfe\xe8\x49\x41\xd0\x4c\x97\xb0\x3a\xec\xce\x5a\x7d\x17\x32\x43\xba\x12\x79\x53\xec\x62\xb9\xec\x7d\x34\x70\x03\x6c\xb4\x61\x2f\xda\x78\x22\x59\x3f\xea\x00\x8a\xad\x42\x21\xc4\xed\x15\x3c\x05\x08\x54\xaa\xc2\x82\x2c\x1b\xe7\x61\xc4\x29\x4d\x62\xd1\x2e\xd4\x9d\x86\xca\x75\xea\xc6\x97\xe1\xd2\xee\xf9\xad\x37\xc2\x80\x81\x3f\x04\x8b\x79\x75\xf0\xd7\x50\x71\x00\x66\x81\x27\x6e\x97\x6b\x55\xe6\x18\x69\x8c\x68\x9e\xd6\x1b\xe6\x4f\x3a\xf4\x52\x24\x95\xf6\xe6\xb4\x07\x5d\xc4\x0a\x26\xa8\xd2\x38\xb8\xaf\x4b\x50\x3c\xe4\xc6\xcb\x36\x67\xbd\x6a\x67\xe4\xa1\xfb\x27\x10\xff\x8b\xed\x4a\xd6\xd6\xa0\x5a\x6c\x3b\xeb\xa9\xa2\x83\x28\x28\x55\x39\x1b\xbc\xee\xf0\xd6\x68\x67\x5f\x8a\xc9\xf0\xf2\xed\xed\xf0\x6d\x7f\xed\xa5\x26\x5a\x42\xd4\x7e\x80\xbe\x24\x72\x3f\xb7\xbe\xa3\xf2\xae\xd0\x16\xff\x0e\xbf\x0b\x84\x2a\x55\xa8\x6e\x6e\xea\x15\xa4\x4f\x53\x65\x78\x26\x4e\xc4\xe5\xe8\x17\xf1\xf3\x68\x3a\x1b\x5f\x5d\xce\x98\x5a\xd4\xf3\x38\xf2\x18\xcf\x06\xa7\x20\x2d\xa9\x07\x59\x17\x1f\xdb\x10\xf5\x52\x9b\xa6\x3b\x4e\xce\xf6\x21\x6f\x4f\xcf\x06\x67\x62\xc6\x5b\xee\x89\x1b\xdd\xc9\xf5\x5d\xf7\xb6\x54\x1c\xd0\x2d\xbb\xd6\xbe\xc6\x90\xa2\x5e\x4e\x97\x72\x22\x25\x26\x1e\xa9\xbb\xfc\x81\x11\xa3\xbf\xe1\x08\x52\x88\x57\x90\xd2\xd6\x26\x27\xa3\x8f\x8a\x41\x44\xb3\xc9\x01\xd3\x48\xa4\x0d\x7e\xb1\xbb\x27\x06\x0c\x4f\xba\x6a\x3e\xc9\x51\x36\xeb\xb9\xaa\x06\x44\x08\xd0\x47\x83\x03\xf6\x26\xf5\x11\x76\x6f\xd0\xd6\x36\xca\x22\x77\x14\xe8\x00\x98\x50\x42\x8a\x15\x2d\xe6\x73\xd8\xa6\xe0\xc8\xf6\x80\x28\xd1\x88\x6f\x21\xcb\x52\x2a\x24\x5e\xc2\x58\x75\xec\x21\x8e\x01\x29\xbe\xf7\x61\xd0\xf9\xa0\x3b\xcb\xf4\x14\x3e\x17\x27\xe2\xed\xd5\xcf\xa3\xe9\xe5\xf8\xf2\xad\x98\x0c\x7f\x81\x1a\xe5\x7f\xb9\x9d\x8e\x67\x17\xe3\xf3\xd8\xc6\xe7\x2a\xfe\xe4\x04\xc4\xd9\xf6\x40\x7a\x89\x3e\x92\x57\x3d\x77\x94\xd5\x52\x65\xae\xe4\xbd\xa1\x0e\xb8\xea\x23\xd8\x52\x6b\x92\x79\x96\x58\xe4\x38\x5a\xec\xcc\x10\xaf\xec\xc8\x44\xde\x90\x76\x22\xc3\xcd\xb9\xd8\x2a\x06\x0b\xf6\x24\x0c\xba\x87\xfe\xf9\xe0\x4c\xbc\xa1\x1e\x25\xbd\x03\x70\xc7\x46\x97\xc0\x56\x7a\x74\x76\x2c\xd6\xa6\xac\x57\x16\x3a\xae\x53\xb0\x5a\x57\x11\xd5\x00\xf7\xdb\x01\xd5\xa3\xd6\xaa\xba\x53\xe5\x62\x97\xb8\xd3\xee\x30\x78\x71\x9b\x31\xdc\x69\xcf\xec\xe2\xae\x1b\xd8\x30\x9d\x74\x24\xb2\x39\x9e\x63\x1b\x21\x52\xe5\x7f\x4b\x5a\x18\xcd\x99\xe1\x0f\x0e\x1f\xb4\xbe\xab\xd1\x60\x19\x3c\xf9\x99\x4e\xc9\xe9\xe0\x19\x94\x77\xe5\xe2\xec\xd9\xb3\x57\x27\xcf\x7e\x38\x79\xf6\x72\x20\x4e\x19\x4f\x07\x5e\x2e\x86\x25\xce\xd5\x91\x3c\x16\xe7\x47\x65\x65\x8f\xc5\xf8\xa8\xac\xb4\x3c\x16\x93\x23\x73\xa7\x17\x5a\x15\xee\xaf\x7a\x5e\xa9\xe3\xff\x8a\x4c\xfc\xff\x98\x3f\x83\x6f\x73\x67\x9f\x00\x7e\xe5\xff\x7e\x7b\x3d\x39\x39\xfd\xf5\x5b\x01\x1c\xe6\x7f\x3e\xfb\xee\xd5\xcb\x36\xff\xf3\x8b\x67\x2f\xbe\xfb\x83\xff\xf9\xf7\xf8\xf3\xf6\xf2\x56\xbc\x1d\x5d\x8e\xa6\xc3\x89\xb8\xbe\x7d\x3d\x19\x9f\x7b\x0c\xaf\xbf\xdd\x99\x78\xa3\xe6\x55\xe3\xcc\xba\xd3\x1f\xbe\xff\xe1\x49\xda\x1d\xc4\xfd\xa8\x45\xe9\xf8\xc6\x34\x65\x4e\x21\xe0\x71\xb9\x18\x88\x97\xa7\x40\x96\xfa\xb1\xd0\xa5\x98\xd5\x99\x78\xa3\x97\xce\xe6\x29\x8c\xa9\x32\xf1\xda\xd8\xda\x7d\xf2\xfd\x50\x3c\x3b\x3b\x3d\x7d\x76\x72\xfa\xfc\xd9\xa9\xb8\x9d\x0d\x9f\x8c\xee\x55\xb5\x73\x16\xb1\x33\x0b\x54\x85\x9d\xb3\xf7\xf5\x0f\xb9\x57\xd5\x5c\xd6\x90\xc6\x4f\x2c\x14\x46\xf3\x32\xfa\x3c\x83\x76\x8f\xd0\x47\x00\xa9\x62\x03\x15\x61\x61\xb6\xd0\xbd\x84\xc8\x5c\x81\xa4\xb8\x03\x06\xb6\x58\x71\x6c\xeb\x38\xea\x8d\xb5\x3a\x56\xd4\xd8\xb3\xe8\xa3\x52\x1b\xe6\x0f\xc5\x18\xe7\x5a\x55\x0b\x72\x7b\xb0\xb9\x31\x7d\x63\x20\x5e\x73\x97\x1b\xe7\xd5\x9a\xa6\x12\x6f\xa9\xde\xf4\x1a\xeb\x4d\xa3\x2e\x4b\x80\x8f\x21\xaa\x92\xbb\x46\x42\x00\x45\x89\x9d\xfb\xd2\xb2\x52\x2a\x77\x9a\xc4\x60\x63\x1b\xf4\x7b\xa0\x59\x02\xa6\x07\x78\xb0\x27\x27\x5c\x22\x4c\x68\xb9\x98\x79\x8f\x53\x09\xe4\x21\x12\x9d\x4a\x45\xc8\xa1\x3d\x03\x03\x1f\x43\x79\x68\xfe\xbe\xa3\xf0\x8d\x8d\xb8\x2f\x11\x2f\x96\x44\xcd\x81\xdd\x0d\x03\x60\x6c\xd8\x21\x5e\x01\x23\x5b\xb8\x57\xd8\x6b\x67\x21\x4b\xa4\x79\xc1\xf4\x1c\x2c\x00\xf7\x5c\x70\xde\xbc\x19\x3c\x01\xdc\xf9\x56\x09\xbb\x51\xf2\x23\x44\x5c\xe2\x45\xc8\xdc\xaf\x30\xd1\xe8\x11\xef\x86\xd7\x30\xa3\x9c\xb3\x5e\x38\xe7\xa2\x93\x9b\xd9\xbf\x3d\xb9\x22\x5f\xb0\xb5\xc2\xb2\x86\x2e\x0d\x81\x85\x31\xec\xd5\x1d\x78\x9e\x5b\xb9\x43\xfe\x2c\xec\xd5\x4e\xa7\xb7\x35\x62\xff\x9c\x4a\x2d\x94\xfb\x5a\xab\x3a\xcd\x2d\xca\x9d\xc2\x9c\xdf\x12\x3e\xb8\x95\xce\x9e\xaa\xa3\xaf\xba\xcf\xd0\xa1\x48\x36\xde\x54\xb0\x9e\x1b\xad\xa8\x8b\x3b\xf2\x80\x02\x89\x59\x05\x54\x38\xb8\xb8\x3f\x05\x9a\x4e\xf7\xb8\x8f\xa5\xd9\xfa\xe7\xe6\xb0\xfd\xe0\x2d\x39\x03\x65\xf0\xe4\xc6\xb0\x2d\x8f\x3b\xc4\x4c\xb7\x5b\x67\xb8\x44\xab\xc4\x4c\x3d\x01\xb7\xb4\x34\xd5\x5c\x03\xf5\x81\xbb\xfc\x00\x5d\x2a\x77\xf0\x22\x7c\x03\x47\xa3\xc1\xe8\x93\xf6\x23\xfe\xca\xb8\xf5\xae\x94\x37\x64\xb9\x55\x38\x5a\xe6\xe9\x5b\x98\x0d\x00\x84\x89\xaa\xa0\xa3\x6c\x02\xeb\xd2\x84\xc3\x73\x4f\xa6\xe5\xdc\x5b\x1e\x1d\xf6\xc8\x54\xfc\x61\x8a\xc2\xea\x7a\xf0\xe4\x0d\xe4\xb0\xe5\x7a\x03\xc4\x8e\x07\x9e\x25\x29\xc8\xc7\xcb\x1d\xa2\x31\x77\x95\xac\x35\x4c\x18\xae\x26\x96\x87\xef\xb8\x8b\xee\x1d\x77\x8c\x8b\xba\xdf\xb6\x32\xbc\xc9\x21\x1c\xb4\x1a\xf0\x86\x63\x5a\xaf\x14\xf0\xc2\x9a\xcc\x9f\xb2\xe8\x64\xd5\x69\x9d\xc9\x40\x0c\xcb\x3c\x8c\xa2\x56\xf8\x4a\xb6\x66\x69\xf9\x9f\xfc\xa2\xfa\x8e\x01\x05\x7a\xb7\x46\xd8\x5a\x6d\xec\x8f\xe2\xe8\xf4\x38\xea\xfe\x92\x2e\x2b\xc0\x72\xce\x8e\x09\x9f\x87\xe7\x20\x6e\x16\x05\xb8\x01\xb7\x0a\x16\x7e\x49\x20\x95\xb4\x01\x2f\x50\x40\x47\xcb\x4e\xd8\x84\xa8\x94\x20\x90\xd3\x0f\x0b\x6b\x30\x40\x00\x2e\x1f\x8a\xa3\x6f\x6c\xcc\x3c\x04\xd4\x72\x4d\x85\xc7\x79\x4b\x39\x1e\x58\x4d\x3e\x4e\xb0\xa0\x8a\x35\x58\x48\xf7\x84\xdc\x37\x4a\xdc\x32\xca\xc8\x20\xaa\x83\xc5\xb0\x6d\x91\xd2\x24\x82\x3a\x76\x86\xad\x59\x2b\xf7\x12\x68\x66\x8c\xcd\xf2\xad\x85\x34\x56\x18\x1e\x62\x18\xe2\xee\xc8\x70\x7b\x61\x2c\x5b\xde\x7b\x94\x51\xa4\x0f\x01\x63\x4f\x9d\xcc\xa8\xa1\x34\x21\x98\x36\x95\x99\x17\x6a\x0d\x0a\x89\xa9\x7e\xe7\x24\xca\x2d\x26\x7a\xdd\x03\x2a\xb5\x2c\x20\xb9\x58\x26\xcf\x62\xf1\xfe\x8d\xa8\xd4\xa6\x21\xde\x44\xec\x08\xe0\x2c\x51\x6d\x0f\x54\x75\xb8\x6d\x64\x86\x92\xa8\x04\xa1\x6c\x15\xd7\x61\xe0\x7a\xf0\x64\xbf\x75\x03\x09\xa7\x19\xf8\xa5\xe7\x57\x97\x17\x48\xcc\x0b\x2d\x5f\xce\xaf\xae\x3f\x40\x9f\x9a\xa4\x56\xd2\x7d\xb0\xcd\x33\xf0\xac\xd5\x70\x31\x0a\x11\x05\x95\x48\xeb\x05\xda\x8d\x9b\xd8\x61\x95\x0b\x1e\xdb\xa8\x38\x89\xd2\x4a\x10\xa9\xf5\x41\x8e\x70\x27\x88\xa3\xd8\x02\x2f\x0b\x27\x6a\x7a\xeb\x2a\xeb\x4e\xcf\xcd\x7e\xa5\x85\x6a\xfd\xe9\x35\x0e\xef\x69\x26\xe6\xaa\x30\xdb\x0c\xb5\xa2\x1f\x3d\x67\x72\x79\x0a\x5b\xe8\xe1\x0d\x59\x49\xf1\x14\x66\x82\x5d\xac\x69\x9b\xf9\x69\x44\xd1\x43\x31\xf8\xe8\x37\x9c\x2f\x87\xaf\x46\x24\x71\xed\x8f\x88\x8d\xa9\x6a\xdf\xae\xcd\x13\x66\x78\x3b\x8f\xf0\x20\x69\x11\xde\x40\x8c\x24\xb4\x5b\x8f\x0a\xbf\x31\xf6\x82\xb1\xf8\xa7\x3b\xd3\x3c\xc5\x36\x7e\xa1\x6f\xdf\xa3\xcd\x49\x3f\x40\x30\x66\x22\xca\x79\x9b\x68\x66\x5d\x87\xaa\x0a\xe2\x07\x49\x2b\xc5\x41\x67\x9a\xd2\x6e\xf4\xa2\x31\x8d\xa5\x7e\xce\x72\xb3\xa9\xcc\xa6\xd2\xb2\x56\x51\x7c\xca\x94\x28\x85\x68\x90\xf1\xa7\x3a\xed\xb2\x78\x12\x90\x3d\xc6\xe2\x18\x96\x2d\x3f\xa1\x51\xaa\xcb\x5a\x2e\x02\x00\x88\x0b\x1f\x60\x54\xb0\xed\x82\xdb\x0f\xef\xb3\xf6\x02\xef\x9e\x9c\x7b\xe8\x59\x8c\x91\x41\x23\x01\x2d\x1b\x6f\xe0\x45\xa2\x27\x5d\xc9\xa4\x96\xfd\xc0\x6b\x0b\xc3\xed\x33\xa3\x2f\x47\x5b\x08\x04\x29\xa8\x1a\x03\x38\x8e\x09\x11\x29\xb9\x96\x94\x38\xe2\x7b\xb9\xd3\x17\x3f\x87\xf4\x01\x68\x2a\x1c\x57\xd5\x7f\x02\xf8\x14\xb7\x0e\x29\xca\xac\xee\x71\xea\x29\x17\xed\xb9\xab\xd7\xcc\xfd\x25\x4e\x05\x91\x08\x76\x0f\x0e\xf4\x1f\xcb\xa9\xb6\x9d\x33\x74\x5c\xec\x23\x8f\xa3\x98\xb5\xd7\x11\xc8\x07\xeb\x19\x97\xa0\x6b\x24\xb0\x71\xf1\xfe\xdb\x9a\xfb\xee\xf2\xe9\xc4\x3e\x6b\x84\x0c\x2f\xa2\xda\x18\xe6\xf1\x01\x44\x2c\x7c\x0a\x36\x9c\xde\x3f\x8f\xdf\x8f\x41\x72\x3e\x1e\xee\xba\xfb\xe7\x47\x4b\x03\x6d\x47\x99\x98\x07\x72\xd0\x25\x7f\xb3\x62\x4c\x56\x10\x93\x7d\x5b\xe0\x3e\x50\x73\x72\x8e\xc4\x04\xf7\xbf\xec\x23\xb8\xc5\x94\xdf\xdc\x3b\x77\x50\xba\x57\x1a\x3e\x44\x9e\x6b\x22\xa6\xb4\xf9\x3c\xc9\x2a\x8e\xa8\xcb\xbe\x9f\x30\x1e\x52\x2c\x21\x63\x18\x9e\xd7\xfb\x71\xa7\x1d\x03\xea\x9c\x93\x74\xc9\x20\xa0\xa2\x19\x8e\x26\x56\x94\x7a\xac\xdd\xe2\x98\x4d\x04\xbf\xe5\x2c\xb0\x4b\x53\xad\x21\xde\x5d\x29\x99\xa3\x4b\x05\x46\x08\xa4\x1f\x01\xe8\xab\x98\x22\xac\x6a\xca\xc8\xaa\xc4\x6d\xd4\x4c\x44\x6f\x6b\x59\x39\x0d\x43\x74\x60\xa1\x91\x68\xf4\x20\x74\xca\xa8\x7f\x80\x76\x06\xaf\xad\x49\x39\xdb\x5a\x34\xb6\x91\xd0\x06\x35\x43\x70\xbb\xc6\x70\x32\x71\x8d\x81\x68\x2b\x4b\xd3\x94\x0b\x0a\x04\x47\x2d\x94\x1f\x16\x7a\x32\xe1\xa8\xea\x35\xae\x8e\x9c\x3d\x57\x40\x2e\x5d\xee\x92\xc3\xce\x18\xa3\x50\xc8\x71\x1c\x1c\x1d\x74\xe3\xdd\xf6\x25\x5d\x43\x28\x33\x07\x6b\xec\xcf\x86\x8d\x8b\xfb\x28\x5b\xa6\x0a\xdf\xb9\x01\x9a\x65\xac\x9c\xd5\x65\xc4\xbd\x56\xdb\xc7\xc9\x3e\xde\xe4\xfc\xf8\xab\xa5\x1d\x0e\x89\x8f\x63\x7a\x98\xc8\xba\xee\x3b\x93\x1a\xfa\xba\x53\x30\x81\x1d\x10\x18\xd6\x7b\x28\xf5\xba\xbb\xab\xd4\x5d\x60\xaf\x2a\x3d\x89\x37\xb4\x32\x74\x9b\xb9\xf5\x3d\xf4\xe3\xfb\x7b\xe4\xc1\x5a\x5c\xeb\x76\x8c\xd0\xab\x7b\x53\x34\x6b\x02\x0d\x79\x9a\xb9\x2a\x35\xfa\x50\xb3\x06\x64\xdf\xdc\x47\xec\x23\x1b\x2b\x4a\x6b\x84\x66\xee\x8a\x2d\x4c\x98\xc2\xf3\xc3\x76\x40\x7b\xbc\x91\x59\x52\x45\x03\x67\xf9\x8f\x2f\x0c\x72\xfc\xec\x18\x1a\x99\xc5\x2c\x27\x15\x55\xc3\x30\xd6\x64\x7d\x50\x13\x58\xa7\x0a\xca\x5c\x9c\xa1\x42\x38\xa0\x0f\x20\x75\xbc\xdc\xab\x16\x98\x52\x66\x17\xa0\x74\x71\x57\x70\xa0\x37\x77\x0e\x70\x8e\x0c\xef\x8b\x95\x2e\xd5\x89\x13\x1a\x94\xc8\x88\x1a\x9b\x51\xab\x16\x27\x25\x1e\xb6\x3f\xf7\xcd\xe4\x27\x61\xaa\x2c\x68\x8d\xee\xf0\x64\x00\x21\xb8\x93\x99\x11\xa8\x08\x0e\x20\x57\x5a\xd7\x2b\xe7\x28\xed\x94\xac\x50\xa6\x7b\xab\x23\x86\x76\x82\x33\xc5\x02\x19\xcf\x6f\xe9\x14\xa0\x2c\xf8\x22\xf1\x15\x62\x2e\x84\xf8\xa0\x1d\xc3\xdd\xa1\x55\xea\xac\x4b\xcc\xc3\x93\x2e\x61\xb2\x62\x84\xc4\xff\xfa\x95\x5a\xec\xdb\x48\xcd\x6d\xb5\x4c\x19\xdb\xa2\x39\x25\x62\xb1\x28\xf3\xe0\x28\xd9\x9f\x30\x73\xec\xb6\x3a\x10\x47\xe0\xde\x40\x8b\x96\x12\x4f\x39\xfc\x13\xc2\xa4\x98\x52\x5c\x42\x2d\x6e\x19\x61\xa1\x3b\x8e\x19\x7c\x8e\xc2\x1e\x7e\x50\xb1\xf4\x7c\xf8\x7e\x38\xe3\x4f\x0d\x8e\x9f\x84\xee\x11\xcc\xc1\xe4\x0e\x89\xbb\xe7\xa1\x9f\xc0\xc6\xa7\xb8\xe0\xab\xb4\x35\xf0\xa1\x25\x32\x3d\xc2\xf9\x6e\x13\x3c\xea\x1a\x1b\xa0\x03\xeb\x61\x78\xbb\x2e\x54\x16\x76\x3f\x59\xac\xa4\x73\x85\x6d\x0f\x0b\x79\x17\x1b\xa0\xe1\x0f\xd6\xcb\x4f\x62\xde\x38\x23\x11\x28\xfb\x37\x0a\x16\x0c\xcf\x25\xc4\xca\x75\x8d\x91\x31\x04\x2a\x23\x7d\x4d\xfb\xc9\xfc\xd4\x50\x2c\x01\x51\x05\x59\xe5\xa2\xd0\xf3\x4a\x02\xaf\x27\x7a\xea\xfe\x9c\x80\x50\xf4\xe5\x42\xd8\x2d\x48\x00\xe6\x81\xb9\x19\x5a\x73\x76\x5a\x1e\x5b\xa3\x83\x9a\xe7\x17\xac\x94\x74\x87\x96\xfb\x62\x44\xcd\xe1\xb9\xe5\x40\xe7\xc5\xb2\xee\xbc\x19\xa4\xee\x8b\x20\x75\x01\x67\x11\x75\xe8\x82\x1a\x38\xdf\x85\x2b\x35\x14\x59\xa7\x25\x62\x99\x6e\xb6\x8c\x6b\xae\xbc\x98\x8c\x4a\xdc\xf6\x39\xc1\xc3\x72\x07\xa5\x2f\xeb\x4d\xdc\x9c\xbd\xd5\x37\xec\xb3\x47\xa5\xad\xb8\x37\x9a\x3a\x1b\x21\xa5\xcd\x1e\xd0\x69\x1c\x16\x8b\xa8\x7b\xaf\x5b\xd6\x45\x88\x34\x44\x08\x4e\x36\x4f\xb7\x2b\x62\x1f\xf6\x57\x0c\xbd\x16\xd8\xc4\xf4\xd9\xfc\x0b\xc8\x3c\xbb\x5b\xf9\xe0\x12\x85\x90\x0e\xc7\xb0\x75\x15\xe1\x46\x23\x84\x2a\x62\x53\x81\x25\x0c\xa2\x06\x34\xba\x88\xdf\xbb\xa1\x6a\x2d\xc4\x7b\xc2\x59\x78\x49\x49\x90\x4e\x68\xa7\x8f\xa9\x39\xd1\xc5\xec\x56\xf4\x05\x20\x8e\x31\x76\x4b\xc5\xf9\xb8\xc8\x11\x8b\x7b\x3b\x3d\x54\x83\x0e\xb5\x26\xf3\x78\x6b\x67\x99\xf4\x05\xa2\x60\xcc\xaf\x28\xd0\x00\x54\xfa\x28\xda\x0e\x19\x0d\x07\x07\x9a\xa5\xc1\xdb\xd6\x39\xa1\x0d\xb5\x11\x5b\x96\x2f\x70\xf3\x21\xb5\x22\xaa\x39\xef\x84\x3a\xd3\x30\x27\x8f\x2b\x05\xe7\xee\x09\xba\xa5\xb7\x54\xaf\xa1\x2b\x85\x9b\x0d\x33\x88\x26\x61\x75\x53\xb6\xc2\xd0\xdf\xf8\xc6\x02\x62\x7f\x4f\x01\x8d\xe8\x91\xef\x30\x1a\xb5\x2f\x7d\x04\x83\xe0\x98\x48\xa5\xee\xb5\x45\x84\xd0\xb7\x7b\x70\x3b\x7b\x4e\x32\x2e\x1d\xf4\x3f\x30\xf0\x7f\xaa\x10\x48\x1e\xc1\x75\x30\x16\x91\x65\x40\x05\xb8\xd1\x95\x8e\x8a\x8d\x01\xd1\xc7\xdf\xc0\x94\xa2\x1b\x60\xae\xc1\x88\xd6\xa5\xc8\x55\x2d\x75\x01\xbe\x64\x84\xfd\xf1\x91\x53\xac\x67\x5d\xa8\x8a\xce\x13\x1c\x26\x46\xdd\x04\x60\x3e\x6c\xa3\x2e\xef\x1a\x6d\x57\xee\x06\xf0\x27\x18\x75\x34\x4e\x63\x12\xcc\xc8\xed\x0e\x4b\xfa\x51\x5e\x96\x34\x66\x1e\xc5\x29\x89\x0c\xf7\x29\x40\xc2\x01\xa2\x4b\x0f\x78\x9a\xa5\xd9\x2b\xef\x2d\x44\xf0\xe0\xbd\x70\x4b\x72\xc6\xe1\xe5\x32\x62\xbf\xaa\x38\x2a\x90\xbc\x2a\xf4\x8a\xe3\xe8\xe7\xbe\xd3\xd0\x99\xb9\x77\x03\x70\x09\x76\x0f\x2d\x40\xd6\x76\xca\xdd\x60\xf8\x1b\x4e\xb4\x7e\xc6\x58\x9e\x40\x25\xb6\x1b\x11\x64\xdd\xdc\x01\x45\xfe\x39\x53\x6d\x0c\x80\xc4\x9c\x1c\xec\x04\x90\xa0\x13\x10\xfa\x2a\x49\x92\x8d\x92\xa0\x2d\x22\x49\xbf\xa4\x88\x02\x83\x7a\x67\xe8\x12\x57\xe9\xda\xd7\x38\x13\x23\x33\x65\xc5\x96\x58\xee\x4c\x59\x10\xb4\x6f\x6c\x5a\x6c\x09\x8c\xed\xe4\x4e\x3f\x3c\xd3\xd6\xdb\xf6\x7d\xec\x27\x48\xbc\x9a\xb5\x72\xf7\xcb\x62\x56\xc4\x5b\x39\xd6\x27\x39\x06\xe2\xaa\xa9\xa0\xe4\xc6\x22\x42\x8a\xf8\xea\x1a\xd0\xdb\x34\x94\x7a\x6b\xc4\x9d\x91\x05\xd5\x3e\x03\xaa\x8f\x4f\x1c\x26\x49\xa0\x7d\xa4\x20\xf2\xf8\xe0\x90\xc1\x8f\x38\x33\x9e\x66\x9e\xb1\x8a\x7a\x6d\x6a\x0f\x5c\x5e\xc9\x2a\x54\xa7\x52\x0d\x4d\x68\xb0\xca\x55\xe0\xbe\xc9\xed\xe5\x95\xaf\x20\x16\x3f\x60\x6b\x85\xd1\xf9\xf0\x76\x36\x02\xac\xe5\xf5\xf4\xea\xed\x74\xf8\x5e\x8c\x67\x9c\x6c\xb8\xc0\xee\xda\x57\x6f\xc4\xf9\xbb\xe1\xf4\xed\x08\xfa\xdd\x4f\xa1\xc3\x7e\xfc\xa8\x37\x57\xd3\xf8\x01\x99\xb8\xb9\x82\x7f\x8f\xfe\x7a\x33\xba\xbc\x11\xd7\xa3\xe9\xfb\xf1\xcd\xcd\xe8\x42\xbc\xfe\x20\x86\xd7\xd7\x93\xf1\x39\x54\x36\x4c\x86\xbf\x0c\xc4\xe8\xaf\xe7\xa3\xeb\x1b\xf1\xcb\xbb\xd1\xa5\xb8\x72\x4f\xff\x65\x3c\x1b\x89\xd9\x0d\x50\x9b\x8c\x2f\xc5\x2f\xd3\xf1\xcd\xf8\xf2\x2d\x72\xb5\x5d\x5d\x7f\x40\x96\xed\x77\x57\x93\x8b\xd1\x14\xd2\x20\xdf\x5e\x4d\xf1\x8b\xd8\x4f\x7f\xe4\x9b\xff\x27\x73\x7a\x3a\x9c\x89\xf1\xec\xa9\xa7\x5e\xf6\x63\xbf\x7a\x03\x1d\xed\xff\x32\xbe\xbc\xc8\xc4\x68\x0c\x0f\x1a\xfd\xf5\x7a\x3a\x9a\xb9\xe9\x5f\x4d\xb9\xbb\x3f\x34\xcf\x9f\xdc\x5e\x40\x86\xe5\xf5\xed\x8d\xb8\xbc\xba\x11\x93\xf1\xfb\xb1\x1b\xe7\xcd\x55\x86\x74\x57\xf8\x59\x7e\xba\x1b\xcc\xd5\x1b\xf1\x7e\x34\x3d\x7f\x37\xbc\xbc\x21\x2a\x08\x48\xc9\xbc\x19\xdf\x5c\x8e\x66\x98\xb8\x19\xe2\xc8\xcf\x6f\x27\xc3\x29\x37\x54\x1a\xe0\x02\x5e\xde\x8c\xa7\x23\x31\x1d\xcf\xfe\x22\x86\x33\x5e\xd6\x7f\xbd\x1d\xfa\xe7\x5c\x8f\xa6\x6f\xae\xa6\xef\x87\x97\xe7\x23\x86\xcc\x46\xdb\x08\x2c\x77\x1f\xae\x6e\x07\x62\xf6\xee\xea\x76\x72\x91\xfc\xde\x2d\xd3\x48\x5c\x8c\xa8\xe3\x4a\xe6\x3e\x28\x86\xb3\xd9\xed\xfb\x11\xad\xf6\x0c\xe8\xcc\x87\x93\x89\xb8\x1c\x9d\x8f\x66\xb3\xe1\xf4\x03\xb1\xcd\xc0\x2a\x4c\x47\xd7\xc3\xf1\x54\x40\xea\x69\x3a\x1d\x01\x3e\x12\x33\x14\xcf\x06\x6e\xeb\x2e\xaf\xb0\x78\x45\xdc\x5e\x4e\xdc\x5c\xa7\xa3\x7f\xbd\x1d\x4f\xfb\x8e\x81\x7b\x06\x20\x7d\xdd\x52\xc6\xbb\xfe\xcb\x78\x32\x81\xfd\x69\x6f\x7d\x06\x5f\xb9\xfc\x10\x6d\xfd\x07\xf1\xcb\xbb\x2b\xf1\x7e\xf8\x01\xf3\x5d\x1f\xf8\x70\x4c\x47\x3e\x21\x96\x9e\x89\xe1\x2c\x3a\x9a\xc3\xd7\x57\x6e\x0d\x5e\x8f\x80\xb3\x63\x32\x72\x03\x71\x0b\xe2\x36\xe8\x62\xf8\x7e\xf8\x76\x34\x8b\x8e\x00\xbc\x9a\x12\x74\x99\x98\x5d\x8f\xce\xc7\xee\x2f\xe3\xcb\xf3\xf1\xc5\xe8\xf2\x66\x38\xc1\x55\xb9\x9c\x8d\xfe\xf5\xd6\x6d\xe2\x70\xc2\x0f\x11\xc3\xe9\x78\xe6\x9e\xe0\x4e\x21\xed\x98\xbb\x80\xee\xa4\x5d\xf2\x09\xb9\xb9\x12\xed\x4b\x79\x14\xde\xdd\x3d\x7d\x62\x72\x35\x83\xa3\x76\x31\xbc\x19\x0a\x18\xf1\xcd\x50\xbc\x1e\xb9\x4f\x4f\x47\x97\x17\xa3\x29\x5c\xa6\xe1\xf9\xf9\xed\x74\x78\x03\x2f\x73\xdf\x18\xcd\xc4\xec\x76\x76\x33\x1c\x5f\xe2\xa6\xb8\xf9\xc2\x55\x1e\x4f\x2f\xfc\x6d\x82\x03\xfa\x66\x38\x9e\xdc\x4e\x3b\x47\xec\xe6\x4a\x5c\x5d\x8f\xe0\x91\x70\xd4\xa2\x0d\xc1\x4f\xcc\x8e\x33\x38\x03\x62\xfc\x46\xcc\x6e\xcf\xdf\xd1\xee\x89\xe4\xce\x7e\x10\xef\x86\x33\xf1\x7a\x34\xba\x14\xc3\x8b\x9f\xc7\x70\xef\xe8\x3d\x57\xb3\x19\x33\x36\x5e\xd1\x13\x68\x1d\x07\x62\x74\x89\x9f\xeb\xc9\x87\x3e\x19\x6e\x36\xaa\xcc\xf5\xa7\x1f\x9d\xc3\xe1\xc4\xfe\x10\x1a\x4a\x20\xa2\xe2\x06\x14\x7e\x6d\x9c\x89\x58\x89\x4b\xb5\x65\xcd\x66\x9f\x90\x2a\xa4\xc2\x7f\x21\xd9\xf6\x41\x54\x03\xc7\x20\x29\x2f\x4d\xc1\x11\xd2\x8e\x77\x48\x31\x5b\x27\x74\x08\xee\x23\xab\x66\x2d\x4b\x5d\x13\x0a\x67\xee\x3e\xb2\x95\xd8\xde\x75\xb1\xd2\xea\x9e\x8a\xf7\xb0\x99\x36\xb7\x10\x4e\x85\x3f\xea\x3c\x9f\x93\x5f\xc8\x32\x35\xdb\x23\xcc\x54\x1c\xd2\xa5\x58\xe1\x4d\xf0\x10\x80\x00\x2d\x8d\xb4\x85\x54\x9a\x89\xa3\x1b\xd8\xf9\xc1\x42\x39\xb8\xc5\x42\x50\xff\xe5\xb5\x67\x33\xad\x89\x13\x06\x12\x7d\xe4\xf1\x83\x1f\x0e\x64\x87\xb6\x0e\xe5\x0e\x05\xa0\xc5\xee\xd5\x8e\xdc\x76\x68\xec\x86\xe6\x58\x9a\x7f\x83\x47\xc1\x33\xa8\x20\x17\x0c\xb8\x28\x70\xa6\xc4\x53\xaf\xfa\x9f\x42\x5b\x4d\x0a\xa4\x6f\x0c\x84\xf4\xd3\xa8\x11\xf8\x6d\x14\x62\x87\xca\xb0\xa6\xcc\x07\x4f\xfe\xe4\x96\x11\xbe\xca\xb1\xb7\x68\xea\xdf\x58\x2c\x13\xc5\xa7\xce\x2b\xad\x96\xd0\xe9\x04\xc6\x4a\xb5\x86\xce\x6c\x1b\xfc\x59\xb4\x11\x85\xbb\x9d\xf8\x13\x97\x98\xa2\x4d\xf3\xe7\x27\x10\x8b\xda\x04\xe7\x3a\xd9\xda\x9f\x3c\x0c\x29\xd9\x50\x34\x6a\x23\x9c\x87\xae\xfb\x13\x39\x4a\x00\x54\x60\x4f\xee\xd1\x3e\xde\x18\xfc\x29\x4a\x53\x33\x7a\xd2\x54\xe2\xa8\x95\xb8\xe9\xda\xbe\x83\xce\x04\xe3\x68\x21\x25\x55\x56\x66\xa3\x3a\xd5\xfa\x8d\x55\xcb\xa6\x40\x1f\x84\xf5\xb2\x93\x20\xac\x9b\x7f\xf2\x39\x30\x75\x4f\xc5\x4d\x7a\x8d\x3c\x0b\x3e\xd8\x6f\x96\x1d\xf5\x6a\xaa\x47\x68\xd7\x99\x52\x0f\xad\xde\x92\xcb\x99\xd0\x23\xb2\x83\x27\xce\xa5\x8c\x0f\x65\x08\x55\x26\xe1\xd4\x43\x3b\x12\x67\x83\xc3\xaa\xfd\x24\xf4\x12\x3b\x3f\x3e\xca\x4e\x45\x70\x6a\x26\x5e\x7d\xf7\x52\xbc\x97\xd6\x8a\xe1\xbd\xca\xc4\xb9\x5c\xcf\x2b\x9d\xdf\x29\x46\xa4\x3e\xff\x21\x13\xb7\xb3\x21\xc2\x82\x9c\x37\x97\xc4\x5a\x4d\xc9\x19\x1d\x08\xf2\x21\xca\x09\x8a\x0f\xa1\xf4\xd2\x94\xc4\x16\xb3\x91\x1b\x05\x7c\x6f\xc5\xe0\xc9\x78\x99\x06\x40\x93\x6c\x5c\xe6\x85\x97\x69\xea\x4d\x53\x0b\xe9\x16\xab\xf2\xd9\xae\x42\x7f\x24\x51\xc7\xfd\xd9\x40\x7c\x58\x66\x55\x8c\xd2\x71\x6b\x93\xab\x1f\x9f\xbc\x2d\xcd\x9a\xcb\xa0\xf8\x54\xbe\xfa\x21\xeb\x5c\xba\x4f\x9f\x44\x7a\xe7\x44\xfc\x4d\xec\x0d\x06\x4b\x3e\x7c\x3d\xbb\x9a\xdc\xde\x8c\x26\x1f\x62\xf3\xf5\x27\x6a\xb9\x0e\x9b\x8c\xdc\x73\xff\xc3\xba\xa5\xd9\x7e\x43\x38\x99\xf6\xa5\x0d\x9a\x00\x84\xb3\x2a\x80\xf1\x1f\x78\x23\xd3\x3b\x8c\x57\x96\x81\x55\xc1\x17\xfa\x29\x7e\xcd\xe2\x9b\x78\x00\x88\x27\x5a\xed\x36\xce\xc1\x42\x96\x49\x9f\xfa\xe4\x61\xc1\xeb\xfd\x97\x99\xb7\x00\x76\x73\xa5\x92\x94\x63\xe2\xbf\xed\x0b\x23\x5e\x2d\xc5\xc2\x34\x95\xa5\x22\x27\xff\x3a\x08\xb1\x59\x15\xe8\xa1\x8b\x02\x42\x65\x6b\x05\x48\xc9\x98\xa7\xa4\x77\x64\x3f\x21\x34\x6b\x01\xc3\x83\x2b\x0c\xb5\x50\x8d\x55\x27\x8b\x42\x2f\x3e\x42\x30\x61\xad\xca\x06\xf8\x87\xed\xc9\x89\x13\xae\xe0\xc2\xda\x46\xd7\x36\x81\xc7\x26\x97\x0f\x12\x47\x77\x8a\x24\x93\x5a\x6f\x0a\xb3\x53\x95\x38\x62\xf8\x28\x50\xf1\xda\x80\x47\x5c\xab\x0a\xf8\xa0\xe0\xe3\xd6\xf9\xcd\x05\x00\x1a\x65\x89\x29\x5d\xab\xef\x4a\x21\x23\xb5\x12\x41\x51\x9e\x46\x8c\x45\x64\x06\xb8\xbb\xca\x05\x2c\x03\xf1\x0e\x32\x89\xc2\x02\x4e\xf2\x27\x4c\x3a\x20\x44\x45\xae\x95\xfd\xf1\xc9\x07\xb3\x33\xf9\xae\x54\x7c\x69\x89\x01\x27\xa2\x4a\x40\xf0\x2c\xbd\x99\xab\x6b\x59\x72\xf2\x5d\xfb\x1f\xd1\x99\xfe\x46\x1c\xf9\xb9\x05\xe2\x4c\xea\xed\x4c\x00\x28\xb8\x8b\x00\xa7\x03\x28\xb7\xfb\xcb\x7a\xee\x7e\x79\xec\xb3\x53\xf3\x9d\xf8\x17\x37\x46\xf1\x4e\x2e\x3e\xaa\x6a\xf0\xe4\x4f\x6e\x21\x80\xe1\xc5\x1d\x99\x9b\x9d\x38\x37\xa6\xfc\x73\x26\x4e\xc5\x70\x53\xe9\x02\x11\xf3\xf4\xe3\x4c\x5c\x57\xd0\x96\x0f\xeb\xc2\x7f\xd6\x0b\xf5\xe4\x66\x25\xeb\x6f\x7c\x6e\x01\x13\xd9\x10\xa1\xf9\xdf\x7f\xfd\xba\x98\xc1\xb7\xc3\xe5\x7a\x23\x2b\xab\x7e\xed\xaa\x8f\xf0\xe7\x70\xfd\xc7\xb3\xd3\x97\xaf\x5e\xb5\xea\x3f\xce\x5e\x7c\xf7\xea\x8f\xfa\x8f\xdf\xe3\x0f\x55\x70\x7c\x9f\xe1\xa9\x9c\xef\xc4\x30\x37\x73\x25\x66\x90\xaa\xb1\xee\xb2\x71\x14\x2b\xc7\xba\x5c\x8a\xe0\x32\x45\x17\xd9\x2d\x60\x69\x92\x84\x73\x42\x1e\xec\xd4\x0d\x33\xff\x27\xdd\x3b\x9c\x4c\xa1\x2c\x01\xa4\xa7\x4f\x8f\x51\x3d\x10\x2b\x7f\xe8\xd6\x50\xeb\xb2\xf1\x4c\x68\x94\x0f\xf3\xa6\x10\xa4\xe6\x00\xbc\xe5\xb1\x2f\x30\x06\x4f\xca\xe1\x91\x30\x84\xc4\x03\xe0\x89\x87\x89\x30\xe1\x69\xda\x3a\xce\xb6\x50\x79\x9e\xda\x77\xf0\xe4\xda\xd8\x7a\xb6\xa8\xf4\xa6\xce\xc4\x05\x41\x56\xe2\x9f\xb9\x69\xe2\xd2\x61\x5d\xc1\x9d\xb6\x58\xdb\xe9\x49\x4f\x90\x98\x72\xff\xea\x3e\x41\xa6\x6f\x88\x43\x00\xe6\xf4\xf5\x68\x72\xf5\x8b\x18\xcf\xc4\x9b\xdb\xe9\xe5\x78\xf6\xce\xb9\xd7\x33\x31\x76\x0e\xb4\xf3\x38\x5f\xff\xcb\xe8\xfc\xc6\xf9\x8e\xce\x6c\x7b\x1b\xda\x61\x21\x5f\x74\x06\xbe\x1c\xc5\x2b\x9c\x9b\xfb\x7a\x04\x9e\xf4\xcd\xf4\x16\x9f\x33\x14\xe7\x57\xef\xdf\x8f\x6f\xde\x8f\x2e\x6f\x20\x94\x70\x71\xf5\x7a\x24\x66\x1f\x66\x37\xa3\xf7\x33\xe7\x82\x5f\x4d\xaf\xaf\x80\x73\x7c\x70\xe0\x77\x14\xe9\x80\x40\xd6\x74\x34\xbb\xbe\xba\x0c\x9e\xe6\x34\xf0\x76\xa2\x09\x79\xf9\x41\x8c\xa6\xd3\xab\xe9\x8c\xdc\x74\xf0\xa3\xcf\xc7\xa3\x99\x33\xb5\xfe\x32\x4a\xa3\x61\x51\x44\x49\x1c\x51\x28\x29\xf3\xa1\xa1\xab\x29\x04\xb7\x6e\x6f\xae\xa6\x1f\x8e\xd1\x6b\x76\xaf\xa7\x15\xb9\x79\x37\x9e\xc5\x4b\x89\x8b\x41\x0f\x99\x7c\x10\x17\xe3\xd9\xf9\x64\x38\x06\x87\x17\x03\x40\xc3\xc9\xe4\x70\xb8\x29\x4b\xac\xe1\xae\x2d\x8c\xbe\xf3\xe5\xd5\xe5\xf8\xf2\xcd\x74\x7c\xf9\x16\xaa\xad\xd1\x01\xe7\x30\xc0\x07\x22\xf0\x1e\xfc\x13\x95\x37\x0e\xbe\x2d\xf4\xbc\xd6\xcb\xe5\x6f\x27\xfe\x1f\x92\xff\x67\xa7\xaf\x9e\xb5\xe5\xff\xf3\x17\x7f\xc8\xff\xdf\xe5\x4f\xe4\x04\x2c\x50\x13\x9c\x9c\xfe\xf0\xc3\x77\x62\x26\xd7\x62\xa2\x96\xcb\x42\x55\x4f\xda\x9f\xf9\xe1\x94\x3e\xa3\x0b\xbd\x30\xa5\x78\x5b\xc9\xcd\x4a\x2f\x2c\x9a\x66\x4f\xae\x93\xc2\x0b\x20\xaf\x49\x13\xe9\x41\x17\xa0\xd8\xb4\x58\x39\xa2\x5b\x05\x62\x80\x0c\xa3\xa2\xbd\x94\x93\x97\xdb\xe3\x6b\x9b\x34\x68\x26\x42\x4a\xe7\xe9\x42\x81\x4c\x0a\x95\x3a\xa2\x16\xe8\x08\xa3\x6a\x83\x08\x19\xdf\xca\x95\x86\x38\x7e\x06\x18\x6e\x36\x0a\xd3\x80\x32\xa9\xd0\x4a\x6a\x32\x50\xcf\x61\x7b\x81\x64\xd8\x9e\x56\xf6\x38\xd8\xb3\xee\xdb\xd1\x12\xc3\x27\xda\xcb\xe9\xd3\xae\xe8\xe3\x7b\x45\x26\xf3\x7b\x55\xd5\x44\x04\x47\x79\x2a\x20\xf8\x69\x37\xf9\x0a\x71\x2f\x5a\x15\xf8\x21\x15\xb4\x65\x44\xeb\xc4\x56\x6c\x34\xeb\x47\x8c\x0d\x95\x95\xef\xc4\x38\xf6\xd9\x82\x0b\xf1\x74\x38\x3b\x19\xcf\x9e\x82\x38\x7c\x20\x4d\xd0\x23\xd4\x7d\xee\x22\x8e\x12\xf3\x63\x20\x52\xeb\x05\xfa\x87\xe4\xb1\xed\xf0\xc5\xd5\xf4\xe1\xf0\xc5\x93\x38\xba\x3e\x7b\xe7\x74\xc0\x6c\xf8\x5e\x4c\x46\x6f\xde\x4c\x30\xba\x3a\x1b\x4f\xc6\xe7\x57\x97\xe2\xed\x74\x78\xfd\x6e\x7c\x3e\x8b\x02\xdb\xac\xd1\x7a\xa2\xd6\xee\xef\x17\xe3\xa9\x53\x46\x7b\xe3\xd7\xc9\x4a\xd0\xa3\xf8\x77\xbf\xbc\x1b\xde\xcc\xae\x46\x3f\x8f\xa6\x4e\xa9\xdd\x4e\x20\x86\xff\x66\x7a\xf5\xde\x07\xa8\x6f\xdd\x02\x71\x94\xfa\x7a\x7a\xf5\x66\x7c\x33\xcb\xc4\x2f\xef\x46\x10\x0d\xbe\x9a\x82\xc6\x3f\x1c\x05\xc6\x97\xa1\x66\x84\x02\x97\x0f\xee\x53\x57\x53\xf8\xa5\x57\xdc\x59\x3b\xd0\x0e\x9a\xdb\xcd\xe9\x12\x33\x15\xa1\x05\x10\x85\xdf\x3b\xa9\x14\x67\xac\xd0\x41\xf9\x67\xd2\x7c\x7f\xfc\xf9\xdf\x40\xff\x4f\xde\x5e\x4f\x4e\xce\x06\xa7\x27\xa6\x2c\x76\xbf\x89\x15\x70\x58\xff\xbf\x3a\x7b\x75\x76\xd6\xd6\xff\xdf\xbd\x7c\xfe\x87\xfe\xff\x3d\xfe\xbc\xbd\xbc\x15\x93\xd1\x6c\x36\x9a\x3e\x44\x03\x70\x36\x48\x89\x00\x7e\xe8\x12\x01\xfc\x70\x9a\xc1\x2f\x1e\x88\xb8\x3e\x49\xe9\x00\x2a\xa5\xfe\xe9\x29\x01\xfe\x4f\x0e\x60\xa2\x9f\x59\x59\x20\x85\x55\x80\xe6\x6a\x71\xe5\x4c\x94\xb5\xaa\x12\x6f\xaf\x27\x90\xfb\x81\x20\x1b\x30\xfd\x00\xdd\x0b\xa8\xe0\x06\xda\xc1\x98\x2a\x8e\x74\x4f\x00\xbc\xb9\x6b\x45\x15\x33\xff\xf4\xb3\x4c\xac\xb8\x05\x40\x1b\xda\x72\x36\x38\x1d\xfc\x5f\xbd\xb4\x05\x96\xc2\xef\x31\x5b\x01\xb2\x48\x85\x52\xf5\x1a\xfa\x85\x6f\xe5\xee\x61\x26\x01\x5d\xb7\xf8\x0a\x0e\xc7\xe9\x11\xac\xf2\x8f\x63\x2d\xc0\xd0\x84\x47\xfc\xc4\xbb\xd3\x3b\xde\x2c\x06\x44\x41\x15\x0e\x81\x74\x8b\x1d\xad\x18\xa1\x1c\xb9\x79\xba\x5c\x7c\x94\x77\xca\x9e\x9c\xd4\xbb\x0d\xc1\xf5\x3c\x08\xf7\xe4\x84\x76\x77\x2f\xa2\x0d\xb0\x28\x51\x1f\x6e\x4b\x7d\xaf\x16\xd0\x31\xc6\x10\xc5\x41\x87\xf2\x00\xca\xb3\xdd\x81\xdd\xba\xd5\xb8\xbb\x53\x16\x73\x0e\x78\x2c\xeb\x95\x2e\x3f\x8a\x85\xac\xd4\xb2\x71\xe3\x91\x73\x67\xf9\x71\x21\x79\x72\xfc\x29\x20\x0b\x64\x5c\xee\xe8\xed\x67\x36\xc0\x8c\x6b\x5d\xab\x4a\xd8\xba\x92\xb5\xba\xdb\xf9\x01\x96\xbe\x06\x8b\x28\xc2\x17\xd2\xad\x64\x82\x74\x54\x9f\x36\x85\x2c\x09\x6d\x0d\x45\xa6\x5f\xc5\xd0\x00\xfc\xb9\xee\x25\x11\x51\xc3\xd5\x5e\xe6\x0c\xdb\x39\xf1\x8f\x24\x67\xe8\x2d\xd2\x4f\x33\xca\x47\x74\x60\x43\x11\x81\xf3\x62\xb0\x41\x8d\xa7\x61\xd0\x76\x75\xfc\xd3\x97\xf3\x37\xfc\xf4\x30\x7f\x03\xb0\x45\x7d\x01\x81\x03\x5e\xcf\xa5\xa9\xd6\x49\x65\xea\x6f\xc2\xe6\xe0\x57\xd3\x60\x64\xfd\x4b\x38\x1d\xec\xef\xc8\xea\x50\x90\x40\xfe\x3a\x4e\x87\xe8\x49\xbf\x36\x9d\xc3\x56\x89\x3b\x77\x6a\x77\xa6\xf9\xd5\x18\x1d\x08\xb8\x51\x38\x19\x82\xa2\x09\x8e\xa7\xaf\x32\xf1\x53\xf1\xa3\xe5\xda\x39\x5f\x24\x41\xb5\x1c\xbe\xe4\x34\x9d\x49\x20\x12\xc0\xa4\x16\x64\xec\xe1\x75\x00\x88\x68\xbf\x88\x08\x97\xa9\x6a\x03\x8f\xbe\x7f\xaa\xff\x0c\x78\xde\x98\xb6\x61\x9a\x98\x84\x9a\x82\x73\x7a\xeb\x04\xe9\x0c\x03\x51\x3b\xe6\x41\x78\x2c\x67\x85\x14\xf5\xd6\x9c\xd8\x5a\x6d\xc4\x5a\xd5\x2b\x93\x23\x77\xc5\x56\xb5\xe8\x2b\xfc\x52\x31\x7b\xc5\x56\xed\x21\xb0\xc8\x7e\x2d\x06\x0b\x7a\x65\x72\x59\x01\x07\x12\xdd\xbd\x2e\x61\x85\x06\x5c\xee\x0e\xbb\xf6\x3e\x48\x4e\x41\x8a\x99\x5f\x25\x90\x2b\x43\xa7\x77\xe6\x33\xf8\x29\x5a\x07\x9d\x52\x93\x9f\xc3\x4d\x11\x50\xd8\xd1\xd1\x6a\xb3\x4d\x40\x9f\x01\x66\x9b\x08\xf5\x0c\x73\x25\x24\x40\x6b\x70\xa0\x1e\x9e\x8d\x74\x80\xb0\x97\xc8\xe7\xdb\xa1\xb9\x18\x3c\x79\xe3\x1e\x5f\xec\xb2\xd8\x1e\xa8\x61\x12\x88\x92\x47\xf6\x5b\xec\x47\x50\x29\xe9\xc1\xe3\x29\x29\x7a\xb9\x4b\x24\xf4\x40\xfc\xa2\x3c\x84\xb8\x75\x97\xa5\xe0\xba\x9a\x85\x2c\xa1\x17\x42\x84\x0a\x62\x49\x28\xb8\xd0\x94\x28\x65\xe2\x87\xc3\xe8\xe7\xcc\xb7\x20\x83\xf4\xbc\x57\x69\x6d\x01\x37\x39\x20\xce\x89\xa4\x8b\xc1\x16\x78\xfc\xb5\xad\x23\x3e\x10\xfc\xb0\xb7\x2b\xa8\x80\x8c\xa4\x5b\xcb\x3e\xe6\x33\xc2\xe5\x83\x6e\x95\x60\x41\xa2\x62\x36\x40\x1b\xa5\xca\xde\x63\xdb\x29\x03\x14\xae\xcf\xe0\xc9\x7b\x67\xdf\x3a\x33\xd4\x46\xdd\xfb\xb9\x7a\x18\xec\x38\x6f\x95\x65\x98\xe4\xb9\x8f\xbb\x45\x05\x03\x68\xaf\x25\x4b\x08\x86\xc4\x94\x04\xab\xfd\xd1\xe6\x24\xeb\xa3\xc8\x8e\x8c\x06\x45\xbd\x46\xff\xde\xe8\x3a\x42\x77\xc7\x85\x1e\x07\x6d\x34\x38\x35\x58\x37\x14\xd9\x77\x40\x98\x42\xaf\x0d\xb5\x61\xba\xc4\x66\x35\x44\x88\xba\xd6\x35\x88\x7b\xc4\x42\xbb\x83\x1b\x7f\xb4\x36\xa2\x34\xe5\x49\x62\x43\x90\xe9\x26\x63\xfc\x8a\x7b\x02\xf7\x03\x92\x5d\x85\x07\xf4\x02\x68\x1f\x03\xd5\x14\x1e\x3f\x30\xf9\xf3\xf0\x69\x42\x4d\xcc\x5b\x14\xf3\xf5\xd6\xc0\x2b\x9c\x4c\x2c\x76\x68\x2f\x72\x49\xb3\xfb\xb0\xca\x99\x92\xa4\x55\x8f\xdb\xaa\x90\x21\x81\x75\xf3\x08\x93\x97\x7b\x08\x2a\x5a\x21\x2a\x67\xe2\x75\xe2\x92\xc6\x3a\xf4\x12\x8f\xc7\xbd\x84\x46\xa3\xb5\x15\x8b\x4a\xd7\xaa\xd2\x92\xed\xc6\xdc\xac\xa9\xd3\xc3\xa1\x63\xe3\xdf\x09\xa8\xa9\x42\x7e\x0a\xcf\x71\x3b\xea\x07\xb1\x5f\x3d\x83\x02\x5b\x48\x8e\xaa\x17\x61\x56\xe2\x29\xbe\xfa\xe9\xbe\x77\xcf\x15\xd7\xfd\x63\x49\xc5\x84\x9a\xae\xb3\x3a\x61\xe9\xf2\x8d\x0d\x96\x32\x76\xd8\x79\xc4\x21\x65\x77\x98\x6c\x06\x1b\x57\x3f\x78\x21\x4a\xa0\x51\x27\xc0\xe0\xe5\x20\x24\x85\xcc\xef\x65\x59\x43\x1d\xf8\x3d\x4c\x7b\xbd\x51\x35\xc2\x2e\xdb\xc7\x93\x4c\xc3\x5c\x5b\xff\x25\x74\x01\x50\xd5\x20\xdb\xb3\xf2\x65\x76\x0f\x9d\x05\xac\x1a\x2d\x23\xcf\x6e\xd0\xea\xc4\x89\x9b\xc9\xab\xec\x27\x17\xbd\x5d\x97\xfe\x22\x72\xd9\x67\x42\x1a\xdf\x32\x28\x4d\x29\x2a\xd9\xa2\xa8\x07\x8d\xcc\x9d\x05\xfc\x53\xd8\xf4\x06\x32\x61\x28\x93\x87\x6a\x57\xf7\xfe\x16\x82\x16\x94\x41\x2a\x0d\x76\x41\x63\x42\xf7\x79\x84\x78\xb9\x5b\x74\xb2\x94\x0b\x67\x7b\x53\xe1\xe7\x40\xdc\xa4\x28\xdb\xac\xbb\xec\x5e\x9e\x73\x7d\x70\x54\xc9\x18\x8c\x05\x3c\xd3\xcb\x8a\xd8\x83\xa1\xb5\x8a\xe6\xb2\xd1\xc4\xb2\xc0\xe3\x57\x33\x21\xf1\xdf\xcc\x5c\x48\x0b\x33\x2b\x76\x98\x0e\xf1\x43\x88\x36\x86\x3b\x9c\xa1\x0f\xea\xcd\x98\x42\xd7\x35\xa2\x69\xef\xdc\xf4\xe7\x3b\xec\x8c\x98\x14\x92\xf0\x7b\xc9\xcd\x8c\xc8\xf1\x4a\x54\xf2\xf1\xa1\x39\x78\x81\x07\x4f\xc6\x25\x5f\x4f\x69\x9d\x78\xdf\xb4\x53\x62\xa0\x61\xbd\xc7\xec\xcd\xa6\xb2\x67\x5d\xb1\x43\x9c\xdb\x17\x84\x46\x57\x51\x41\xd3\x46\x99\x4d\xa1\xc2\x33\x0b\x70\x44\xe7\x26\xdf\x75\x5c\x55\x2c\xff\xf1\x47\xac\x3b\x22\x56\x69\xe7\x3e\x14\x75\x70\x38\x70\x25\xd6\x28\x22\xe3\x41\xd4\x9e\xf7\xc5\x3d\xac\x5d\xfb\x0b\xb5\xcf\x5b\x55\x14\xee\xff\x4e\xc6\xdd\xcb\x4a\xcb\x32\x44\x92\xbe\x9d\xe8\xb2\xf9\xd4\x53\x33\x3c\x2c\xea\x95\x69\xee\x56\x0f\x2f\xbf\xdb\x70\x90\x1c\xcc\x60\x11\xb4\x01\xd8\x45\xdf\x04\xa2\x47\x96\x72\x71\xeb\x68\xfe\x9c\x67\x90\x47\x78\x18\x75\x9a\x8c\x15\x1d\x8c\x84\xd6\x6a\x45\xb1\x3d\x16\x8a\xcc\x96\x03\x08\x6a\xf7\x69\x09\xb5\x80\x55\x13\x9a\x91\x61\x71\x2f\xe9\x42\x6f\x2e\xb7\xa3\x89\xde\xa4\xff\xf5\xe9\xd1\xc4\xb5\x74\x56\x3f\x18\xab\xbe\xf3\x1f\x19\xa9\x6c\x83\x2c\x94\xef\x8a\xd0\xcb\xf6\x45\x47\xf7\x69\xc2\x07\xc6\xbc\x29\x36\xf9\x08\xaa\x3e\x08\x36\x54\x81\xcf\x07\x14\x18\xe8\xed\xb8\x97\x6a\x6c\x41\x38\x91\x8d\x3f\x94\x10\x81\x0a\x86\x23\x6b\xff\xb6\xd3\x18\x9b\x38\x55\x53\x0e\x9e\xfc\x9e\x64\x6f\x5e\x6e\x44\x01\x84\x36\xc9\xe9\x17\x11\xbf\xf9\xe7\x44\x4c\xfd\x48\x70\xf1\x45\x94\x70\x87\xef\xd0\x11\xc6\xad\x11\xab\xfa\x34\x2e\x3e\x7f\x7a\xfc\x78\x8e\xb5\xa1\x78\xea\x0f\x08\x11\x26\x88\x85\x81\x36\x6b\x74\xc6\xfd\x6a\x71\x37\x1b\xeb\xbb\x46\xca\xda\x5d\x3f\xb5\x01\x23\xd1\x37\x91\x40\x8f\xe1\x5e\x95\x1a\x49\xec\x13\xcb\x33\x34\x27\x0e\x02\xeb\x08\x97\x1b\x5c\x08\xc3\x5d\xab\xdc\x99\x4f\xde\x08\xaf\x3b\x06\xe1\x6f\xaa\x75\xc4\x87\x80\xe5\xb9\xc0\x93\x47\x77\xf1\x20\x4f\x5e\xdf\xee\x47\x6c\x7f\xa1\xaf\x66\xdf\x0e\xf9\x5a\x13\xb7\x70\xdd\xbb\x36\x49\x97\x32\x62\xd6\x9b\x84\x97\x01\xcd\x7d\x30\x83\x23\x16\x9c\x70\xa0\x0a\xb9\xfd\xd1\x4b\x34\xa7\xe7\x11\x1a\xd7\x47\xc8\x17\x3f\xf9\x8b\x08\xf9\x7c\x0b\x6b\x0e\xce\xe5\x10\x42\x76\xe3\x58\x9a\x6a\x2b\xab\x1c\x70\x76\xb0\x86\x78\xbc\x0b\x59\xde\x35\xf2\x4e\x0d\xc4\xd1\x3b\x28\x0f\x87\x18\x50\xe6\x9f\x40\x48\x3d\x0f\x08\x64\x74\x03\xa8\x74\xc9\x84\x45\x7c\xe0\xc5\xd3\x78\x38\x4f\x91\x45\xe4\x69\x44\x23\xf2\xf4\xb7\xe1\x11\x09\x22\xec\xd7\xa3\x0f\xc9\xc4\xa6\x68\xa8\x29\x5c\x68\xc2\x0a\x50\xe7\xa5\x5c\xa8\x88\x8f\x03\xc3\x6f\xf4\x79\x78\x03\xc0\x14\x2d\x5a\x4e\x54\xac\x50\x99\x82\xc0\xce\x21\x1f\xa1\x4b\x5b\xcb\xa2\x48\x1c\x30\xef\x55\xb8\x1b\xed\x5b\x03\xc7\xb8\xf5\x47\xea\x1d\x89\xf0\xce\xd4\xff\x0e\x92\x85\x80\xee\x60\x73\x51\xf3\x2b\x70\xbd\x16\x66\x43\x54\x95\xc4\x6c\xc5\x1c\x64\xb2\xa5\x46\xe3\x03\x4b\x81\x22\x0e\x71\x28\x22\xe2\xa0\x9a\x0a\x50\x34\x29\xdb\x6e\x1c\x18\x60\x07\x0f\xfb\x7c\x96\x18\xd5\x89\x3a\x16\xcb\x1e\x36\x07\x7e\xf1\x51\xcc\x7b\x15\xec\x8e\x96\x42\xc7\x3e\xf9\xb5\x31\x05\x6c\x38\x37\x14\xd2\xf5\xf1\x40\xfc\xe2\x93\x35\x74\x43\xab\xc6\xed\xad\x7b\xa6\x15\xd4\xaa\x26\x79\x16\xd8\x30\x40\x33\xc2\xbf\x49\xcc\x16\xaf\x89\xe3\xcf\x7f\x05\x07\x26\x3d\xe6\x1b\xdb\x7f\xb4\xff\x33\x92\x61\x7e\x2e\xfb\x65\x1c\xa6\x4d\x39\xde\xf6\x10\x5a\x4e\xa2\x3b\xf6\x4f\xc7\xf2\xf6\x59\xfc\x98\x2d\x5d\xd4\xd2\x19\xf5\xaa\x01\x53\x75\x4d\x2d\xd1\xf6\x5d\xa3\xcf\x62\xd2\x34\x1d\xb6\x37\x6f\xea\xcc\x68\x72\x0f\xf1\x69\x42\x63\x5a\x77\x10\x3c\x43\x5c\x30\xad\x23\x12\xb5\x9b\x98\x62\x11\x35\x86\xb3\x46\x75\x6d\x55\xb1\x24\xd7\xbc\x65\x01\x0c\x02\xc7\xd9\x87\x94\x5b\xb1\xf6\xdc\x9a\xfe\x91\xbf\x15\x45\x67\x44\x14\xd9\x33\x08\xcf\xd3\xe9\x55\xdc\xaf\x46\x8f\xd9\xe5\x30\x1c\x43\x54\x5a\x2e\xb0\x95\x29\x69\x6a\xbf\x00\x7c\x7a\x22\xd3\xca\x1b\x6a\x68\x84\x20\x4b\x15\xf5\xc5\xa7\x81\xfa\xc6\xd1\x73\x96\x0a\x6d\x3b\xb0\x25\x09\xf9\xfd\x49\x97\x68\x69\xe1\xcb\xd5\x1d\x80\x42\x38\x49\xe1\x7b\xb9\x87\x31\x5b\xea\xcd\x97\x83\xdb\x5a\x86\x44\x13\x04\xec\x65\xd4\x87\x5b\xa8\xe5\xd2\x54\x75\xd4\x0a\xcb\x8d\x23\xe3\x69\x63\xe3\xb7\xd6\x88\x03\x95\x49\x03\xd5\xd6\x70\xe0\xe3\x35\x80\x15\xc8\xd2\x31\xd9\x3a\x6a\xf3\x4c\x01\x65\xea\x5c\x64\x85\x2f\x08\xdb\x50\x9d\xb1\xd3\x6b\x0c\xa2\x45\x6e\x26\x0b\x16\x89\x2e\xef\x96\x4d\x01\x9b\x75\x94\x84\x0b\xa2\x4d\x00\xc5\x15\x05\x4b\x9c\x0e\x80\x7b\xf9\xf7\x06\xf2\xf5\xc6\x40\x2b\x21\xa8\x1b\xa3\x57\xb0\x22\xc3\x58\x69\xb1\x83\x08\xc0\x09\x58\x2b\x60\xbf\x74\xf4\x65\xb4\x1c\x49\xee\x61\xd6\xcc\x2d\x5d\xe8\xb3\x9c\x1b\x47\xdb\x90\x88\x88\xbe\x77\xe2\xcf\x44\x67\xe9\xd0\x08\x62\xe3\xc3\xff\x9a\xfd\x4a\x14\x94\xb2\xf8\x91\x43\xbc\x87\x36\x47\x53\xe8\x22\x9a\x7d\xeb\x89\xb8\x33\x7d\xab\x84\xb6\x28\x27\xb2\x43\x13\x6c\x78\xe1\x8e\xf5\x4c\x2a\x6e\x42\xf3\x39\x48\xd6\x42\xe1\x98\x5e\x62\xdf\x52\x5a\x1a\xeb\xe9\x76\xf0\x1b\x64\x74\x75\x7c\xec\x54\xd2\xca\x12\xfb\x43\x49\x6b\x4a\x39\xc7\x32\x73\x67\x82\x55\xad\x1d\x42\xc0\x36\x35\x3f\x83\xce\xa1\x74\x98\xd7\x56\x15\xf7\xca\xd2\x95\x88\x2f\x7f\xe6\xe1\xdc\x20\x1b\x32\x91\x1b\x44\x57\x85\x69\xba\x53\xe2\x87\xbf\xe5\x3b\x95\x32\x6a\xad\x81\x56\x2c\x79\xf5\x40\xbc\x46\x70\x4b\xdf\xe7\x31\x70\xe8\x9f\x2a\xad\x3f\xfe\xdc\xbe\xcf\x73\xe0\x1c\x54\x44\x18\x0e\xe9\x36\xc0\xc6\x67\xf8\x53\x53\xee\x97\x7e\x19\x51\xfa\x84\xa0\x1b\x86\x6b\xc8\xdf\x21\x3f\xda\x0a\xf5\xa9\x56\xc1\xc0\xa0\xcc\x02\xbc\x86\x3b\x2f\x36\xd8\x55\x4f\x52\xab\x40\xa0\x32\xc0\x69\x61\xdb\xe5\x82\x22\xe6\xdb\x95\x11\x5b\xa7\xda\x01\xad\x00\xa7\xac\xb1\x59\x84\x6c\xab\xa9\x03\x29\xdf\x39\x80\xad\x78\x06\x62\x30\x99\x22\x48\x06\xd8\xc0\xb6\x6e\x33\xd5\xa1\x63\x4b\x00\x72\x7f\xb9\xe7\x60\x1e\xfc\x24\x2a\xe9\xa6\x97\xc5\xaf\x42\x77\xd3\x73\x82\xd5\x71\x73\x3e\xf6\x48\xfa\x96\x3b\xce\xeb\x54\x3e\x82\x70\xcf\x07\xb0\x6f\xdf\x60\xd6\xe3\x52\xc8\x1c\xb5\x78\x26\xd6\x07\xb8\x6a\x61\x26\x90\x10\xee\x33\xe9\x3b\xd1\xbe\x23\x76\x75\x0f\x1c\x9c\xdf\x85\xca\xb6\xa5\x61\x23\x2e\x5b\xb3\x41\xb6\x09\xbc\x63\x6d\xb6\x83\x47\xa4\x3c\xc1\x15\x54\x32\xef\x58\xae\xa0\x93\x91\x9f\x2c\x2e\xd7\x9f\xf8\x04\x1b\xb1\x93\x6b\x1b\xc1\x44\xb0\x9e\xf7\xf1\x96\x76\x0b\x27\x12\x7d\xe6\x51\x83\x4f\x70\x93\xf1\x44\x4c\x8b\x48\xf1\x08\xcc\x91\x52\x6d\x23\xca\x06\x30\x06\xfc\xf7\x3f\x67\xc9\x40\xed\x41\xb1\x48\x62\x1b\x38\xe1\xca\xbc\x64\x09\x0f\x1a\x8f\x2c\x42\x8a\x0d\x8e\xc5\x05\x8a\x47\x34\x26\x3c\x83\x3e\x43\x30\x4b\xb2\x4f\x69\x0d\x61\xdf\xaf\x10\x18\xea\x3c\x58\xfa\x54\xe8\x55\x1b\xef\x15\x4b\x00\x5d\x55\x0a\xc6\xc0\xed\xae\x61\x54\xf8\x09\xfb\xe8\x45\x4e\x22\x9f\x45\x11\xb7\x85\x24\x97\x00\x4c\xf7\x34\x18\x45\x03\x23\x2d\x44\x6f\x25\x11\xa5\x2d\x7b\x29\xda\x12\xad\x45\x10\xee\x0c\x8a\x80\x33\xc7\x92\x1c\x03\xa5\x79\x8f\x77\x0d\xa7\xb4\x1d\xbd\x07\xad\x93\x18\xe6\x2f\x1e\x66\x7f\x8e\x2f\xfd\xa3\xd8\x9f\xd9\xe7\xf8\x52\xee\xe7\x19\xab\xac\x07\x99\x9f\xff\x41\x94\xce\x7b\x06\x08\xf2\x8e\x64\xd9\xa2\xb1\xb5\x59\xcb\x4a\x73\xb6\x6e\x19\x93\xcf\x41\xc8\x2a\xf2\x4c\xc6\xcb\x8e\xc8\x8f\x97\x8d\x4f\xf3\x7c\x87\xee\x2b\xf8\x8e\x80\xa1\xf6\x07\x82\x60\x2b\x11\xba\x02\xa2\xe9\x74\x09\xfd\xb7\x9c\x95\x75\x2f\x0b\x30\x64\xd2\x07\x74\xc2\x70\x6c\x26\x61\x57\x6b\xf7\x30\x61\x65\xad\xed\x52\x93\x0f\x11\x99\x6c\x2d\xb4\x68\xeb\x59\x19\x13\xaf\x50\xfe\x2a\xf6\x9b\x42\x48\x6c\xbd\x51\x10\x6c\xef\x19\x50\x2b\x56\x10\x2d\x0d\xf3\xa7\x0e\xd3\xa3\xee\x73\x0b\xa5\x69\x9d\xd2\x96\x4b\x9e\x18\x3a\xf3\xa6\x6e\xb7\x31\x4b\x79\xdb\xf9\x26\xcc\x77\xd4\xd3\x9c\xa8\x12\xa0\x65\x7d\x1c\x88\x87\x98\x8f\xe5\xf4\x41\x7f\x5a\x68\xe2\xd3\x42\x33\x8c\xc3\x21\x88\x43\xbb\xcb\x6f\x0a\x2a\x17\xf0\x77\xb6\x1d\xd2\x6e\x8f\x9d\x5c\x5f\x42\x6d\x2c\x65\x51\x58\x1f\x44\x3c\xac\x33\x7d\x2e\x9f\x81\x15\x87\x87\xdb\x5d\x8d\x05\x32\x56\xb5\xa8\xa3\x59\xe4\xf4\x81\x52\xbc\x44\x89\xd0\x16\x7e\xcb\x68\x77\xda\xf1\x94\xe3\x8c\x0c\x2a\xf2\x55\x1f\x91\x6a\x8b\x46\x83\x18\x6e\x5a\x9d\x3d\xe1\xd7\x81\x17\x5c\xaf\x20\xd8\xa0\x98\xfe\x76\xd9\xb6\x57\xb8\x78\xbe\x9d\x25\x21\x5c\xd0\xc1\xe5\x83\x9f\xac\x25\xe0\x59\x0a\xbe\xb6\x11\xb1\xb4\x5f\xb8\x58\xc4\x27\xb6\x78\x2c\x19\x38\x2a\x86\xa1\x18\x46\x47\x1c\x3e\x2c\xad\xdb\x98\x5e\x7b\x3c\x70\x71\x0c\x96\xea\x3e\xaa\x06\x7e\xa9\x42\x45\x80\xbb\x25\x10\x84\x2a\x6b\xf6\x14\x31\x83\x82\xae\x54\x74\x1f\xb8\xf6\xd2\x4f\x03\x31\xc5\xfe\x1b\xda\x72\x04\x49\xa6\x38\xa5\x7a\x55\x29\xbb\x32\x45\x1e\xc0\xe5\x18\xf0\xe0\xe1\x20\x00\x1e\xb2\xc2\x50\xa3\x80\x1e\xf5\x7c\x07\x0d\x93\x49\xb2\x62\x98\xbb\x8c\x81\xb9\xb8\x0b\x10\xe5\x2e\x9b\xb5\xaa\x20\xa0\xe8\x1c\xab\xb5\xaa\x55\xe5\x3c\x34\x59\x3b\x73\xb5\x6a\x16\x40\x63\x52\xc8\x9d\xbb\x4c\x18\x98\xa5\xe2\x15\x0a\x32\xd8\x35\x76\x80\x5f\x54\xc6\x46\x3f\xd0\x25\xd0\x82\x85\x1c\xdb\x91\xf3\x11\xdc\xcf\x2c\xb6\x7c\xb7\xe0\x37\x16\xaa\xbc\xab\x57\xc7\xde\x69\x4c\x42\xe5\xf1\x80\x9d\x41\x50\xc6\xc1\xfc\xb6\xbf\x83\xdb\x85\xe6\x0d\x43\xc5\x3a\x27\x61\x20\x8e\x46\xe1\xcc\xa6\xb9\x2e\x67\x7c\x44\x27\x0b\x32\x27\x7b\xee\x22\xe2\x47\xd1\xb1\x77\xa2\xa6\xa5\xf7\x5f\xa1\x63\x7f\xc5\x54\xe2\x59\x7b\xb3\x0f\xc8\x84\xc0\x4b\xdb\xd2\x27\x7b\x4f\xfd\x81\xa0\xe7\x2b\xe4\x36\x57\xfb\xa6\xec\x43\x04\x85\x35\xbd\x13\x09\x08\x3e\xe0\xf9\xaf\x43\x82\x86\x4e\x37\x52\xe6\x14\x3d\x2e\x12\x1e\x68\xe6\xca\x1e\x92\x78\x24\x12\x58\xb6\xe4\xbd\x21\x41\xc1\x59\x1f\xb3\xc6\xa2\x29\xc8\xef\xb3\x6e\xf9\x6c\xb9\x8c\xa8\xb5\xbc\x59\xa8\x9e\xdc\xe6\x9e\x9d\xcd\xba\x06\x20\x2f\x12\xad\x33\xaf\x31\x46\xc0\x57\x46\x2f\x3a\x41\xe5\xb0\x17\x84\xaf\x4c\x92\x60\xed\x4c\x22\x98\x6c\x60\x2d\x01\xaa\xce\x6c\xb1\xd0\x07\x41\xed\xce\x48\x57\x42\x95\x77\xba\x54\x68\xc1\x20\xc7\xd5\xbc\xb9\x83\x52\xb5\x6e\x30\x3c\x64\x10\x7c\x2d\x41\x3b\x96\x8c\x4b\x15\xf2\x28\x49\xe0\xb7\x9d\x5b\xd2\xd6\x17\x9f\x13\x45\x74\xe7\x23\x1c\xdd\x81\x61\x1f\xd2\x2f\x7e\x58\x14\x3c\xeb\x4f\x8d\x78\x6e\x67\x18\x10\x75\x62\xc7\x33\x0c\x11\x38\x24\x5f\xb1\xdd\x12\xfe\xc8\xdd\xe4\xee\x09\x29\x90\x82\xa6\xcf\xab\xee\xc7\xbf\x36\xe8\x6e\xa7\xf0\x24\x89\x5e\x27\x24\x79\xf0\x9c\x27\x7d\x7c\xe8\x08\xf7\xcf\x00\x51\xf1\x7e\x38\x49\x77\x16\x5f\x54\x13\xe5\x15\x86\x49\xaf\x86\xd4\xea\xfa\x02\x7b\xbe\x33\xc5\x00\x87\xf6\xb1\x60\x2e\xa6\xd8\xaa\x2a\xf0\x0b\xf8\xb7\x1f\x3d\xe4\x10\xf4\xfb\x00\xc7\x90\xfe\xea\x0a\xbc\xc4\x34\xda\x83\xa1\xca\x7a\xa6\xdc\x99\xe4\x21\x11\x00\xbb\x17\xcb\x49\x82\x1e\x24\xa6\x78\x5c\x23\x00\xfb\xe8\xd4\x75\x54\x43\x11\x1f\x6a\x50\x4a\x5c\x9e\x12\x4b\x13\x1f\x93\x8d\x66\xd5\x02\x4e\xb4\x33\x1a\x03\x71\x84\x4c\xa0\xd4\x09\xd4\x98\xbc\x35\x90\xed\xca\x84\x0a\x97\x95\x0a\x89\x67\x08\x80\xb5\x3b\x6d\xe8\x76\x88\x8a\x2a\x1a\x98\x52\xcd\x39\x5e\xce\x18\x9a\x17\x44\xa9\x47\xb6\x7a\x27\xa2\x1d\xe1\xf6\xfc\x98\xa3\xd7\xa1\x2e\xc3\xfc\xd5\x2d\x80\x0c\x6d\xa3\x71\xc6\x29\x7e\x5b\xac\x95\x1b\xbd\xb6\xeb\x04\xa6\xdc\xc9\x70\x8a\x61\x78\x42\xf8\x8a\xd3\xbe\x25\x89\xdb\xa3\xd3\x63\xdc\x5c\x59\x23\x60\x4e\xaf\x55\x8b\x1b\xd2\x97\xfe\x14\xee\x64\xec\x3c\x21\xbf\xf1\x46\x44\x45\xe9\xe9\x06\x8a\x16\x09\x7c\x18\x5b\xd0\x84\x59\xf0\x8f\x0a\xa6\x0a\x04\x0f\xea\xc4\x80\x8e\xaa\x78\xa2\x3c\x8b\x3b\x11\x1b\x55\xb1\xfa\xdb\x8f\xe2\xf3\x58\x10\x1d\x70\x88\x0c\xb5\x80\x89\x67\x11\x29\x56\xba\x15\x51\x4f\x00\x0f\xf4\x38\x01\x61\x51\x43\xf4\xc6\xaf\x6f\x14\xbd\xaa\x23\x29\x22\xc9\x77\x76\x9f\x8b\xb2\x80\xfb\x04\xce\x17\x37\x5d\xf2\xae\x32\x0a\x47\x37\x05\x32\xf2\x6d\x5a\xba\x11\xe5\x70\x5e\xc9\x8c\x35\x3f\x26\x9c\x29\xc3\x58\x1a\x44\x96\x7a\x64\x39\xf7\x65\xa2\x8c\x96\x37\xd8\x62\xaf\x24\x4d\x31\xf6\x06\xec\x49\x1a\x7d\x71\x2c\x01\x73\xe7\x87\x63\x08\x18\x0a\x09\x33\x0e\xab\xd0\x13\x51\xe0\x31\xab\x63\xf1\xb3\xaa\x7c\x78\xd0\x1f\x11\x88\x27\xd2\x11\xef\x67\x49\xb5\xf1\x3a\x73\x20\xcf\x17\xb4\xf2\x77\xe1\x6e\xc0\x8a\xc1\x63\xa3\xd6\x97\x9d\x9e\x47\x59\x1c\xdb\x48\xc1\x4f\x07\xcd\xaf\x44\xed\x02\x08\xcd\xb9\x10\x50\x98\x5a\x63\x8a\xd2\x23\xf2\x4a\xa5\x72\x8a\x08\x55\x0a\x85\x2a\x4b\xcd\x38\x3a\xe6\x96\x4b\xd7\x11\xd8\x7e\x5f\xdb\xa4\xf4\xb0\x75\x5b\x6d\x75\x7a\x2a\xc9\x72\x87\xd4\x9b\x21\x2e\x48\x4d\x12\xe3\xaf\x1d\xe9\x92\x21\x6e\xa4\x41\x4c\x25\xe6\x18\x14\x75\xcb\x72\x1c\xee\xde\x5a\xfe\xcd\x60\x51\x82\x29\x41\x64\x1f\x31\x89\x64\x26\x3e\xaa\xaa\x54\x05\x39\x4b\xce\x0e\x38\xf6\xfe\xcd\x63\x5b\x32\x61\x37\xa6\xa6\x04\x6f\x87\x02\x3c\xf4\x2a\xef\x38\xd2\x7d\xe6\xe0\x54\xf8\x36\xba\x81\x08\x0d\x5d\xc9\xcd\x46\x79\x11\xa1\x6d\x12\xc3\xc2\xaa\xfe\x5c\x2f\x6a\x0e\x26\x60\x94\x37\x6d\xf1\xb2\x0c\x60\xd6\x4d\xa5\x55\xed\x56\xa3\xd5\x78\x8a\xd2\x7b\x7e\x51\x0f\x37\xa2\xf2\xf1\x9f\xf0\x7e\xcc\x89\xc8\xd2\x72\xf4\xdc\x3d\xce\x29\xa9\xb9\xa9\x89\x39\x9b\xa1\x0e\xc1\xd8\xbf\x23\x0f\xb0\xec\x0b\xc4\xa4\xd9\x41\xee\x37\xc3\x91\x5f\x8c\xee\x79\x45\x80\x39\xf5\xd0\x47\xab\x3a\x0c\xf8\xb2\x3a\x57\x27\xf3\xdd\x09\x02\xd6\x4a\x77\x46\x75\x79\x57\xc4\x15\x05\x34\x36\xec\x49\x4a\x49\xbf\xce\xcb\x0e\x20\xe3\x3a\x6e\x89\xe5\x25\x23\x08\xb4\x57\x30\x5d\x4f\xc4\x67\x4c\xf7\x8a\xc4\xde\x59\x51\xa3\x8c\x90\x84\xea\x19\xb1\xb6\x51\xbf\x2c\xcf\xc6\x41\xe0\x83\x4e\xb4\x3a\x94\x94\x6f\xcd\x43\x16\x70\x7b\x62\xac\x9c\x62\x1b\x00\xc4\xe8\x81\xbc\x6d\x53\xa6\x08\xf1\x90\x4a\xe9\x4e\x85\xc0\xdd\x8f\x8c\x7f\x77\x5d\xd7\x08\xe4\xf3\x76\xbf\xcb\xd5\x3b\x33\x6e\xd9\x28\x17\x54\x51\x19\x40\x1a\x0f\xa6\xa6\x21\x07\xfc\x69\x53\x90\xdd\x49\x74\xed\x46\x2c\x35\x5d\x0f\x7f\xf5\xdc\xaf\xa3\x05\x89\xc5\xba\x5f\x47\x6e\x64\xf3\xb8\xc6\x6c\x60\x15\xbb\x69\x65\x49\x3e\x33\xcd\x99\x3c\xb6\x35\xdb\xd7\xf4\x62\x7b\xd4\x40\xbe\xac\x1b\xdb\xaf\xd5\x7a\xad\xbf\xd9\xda\xef\xd3\x5d\xed\x07\xdc\x50\x4e\x34\x78\xcd\x0e\x8d\x13\xa8\x47\x71\x92\x77\xd5\xce\xe1\xf5\x26\x04\x60\x5d\x30\x1f\x90\x28\xe3\xd2\xa0\x0a\x85\x9a\x6e\xa0\xdf\x43\x69\x9d\x16\x16\x91\x63\xb5\x7f\x5f\x3a\x1d\x60\x19\xd8\x81\xb0\x18\xb9\x08\x4d\x8f\x36\x95\x59\xe9\xb9\xae\x7d\x80\xd3\x13\x2f\x10\x9c\xa4\x3b\x9b\x04\x3c\x34\xdf\x45\xad\xe4\x92\x90\x76\x0b\x3a\xbc\xbf\x63\x5b\x88\xc5\x3f\xaa\xb7\xdc\xe4\xb3\x7b\xcb\xed\xab\xe2\xe9\xeb\x84\x37\x49\x2b\x0c\x22\x18\x04\x61\x3e\x4e\x9f\x3d\xd8\xa4\xee\x73\xa6\x5c\xff\x96\x4d\xea\xa2\x6b\xdc\xea\x57\xe7\xd5\xec\x3f\x51\xbf\xba\xd6\x8d\x22\x86\x11\xca\xa5\xab\x72\x69\xaa\x05\xa7\xc7\xf0\x26\x92\x42\x8f\x12\x7f\xa1\x79\x41\x9c\x8c\x3a\x3d\x1d\x88\xf1\x92\x4c\xdd\x85\x29\x31\x9f\xbe\xe0\xf2\x4d\xd3\x54\xb5\xf8\x5b\x93\xdf\x81\xc1\x86\x85\x02\x11\x9a\x85\xea\xf0\x75\xb9\x74\x6e\x8d\xe2\x0f\x31\x6d\x26\x77\xe2\x87\x0a\xd8\x23\x37\x74\x28\x99\x40\x59\xc0\xdf\xb5\xb6\x51\xf6\x38\x6b\x77\x1c\xc3\xa5\x84\x53\xe1\x0e\xd2\x11\xc7\x85\xe7\x3b\x1a\x15\x14\x5c\x65\x42\xfa\xb2\x28\xc6\x37\x39\x01\x7e\x1c\xd2\x92\x68\xe1\x71\x80\x83\x5f\xd1\x01\x4c\x41\xa0\x99\x2e\xb6\xfa\xb4\x70\xc6\x1f\x70\x1c\xf1\xa1\xda\xff\x5d\x4f\x62\x42\x76\x63\x6c\x35\x71\x11\x11\x26\x72\x9d\xe9\xb6\x6e\x8a\x5a\x96\x0a\x71\xe7\x88\x93\x9e\x17\xfa\xae\xd5\xa2\xbf\x85\x00\x0f\x8b\xb9\x51\x55\x8d\x7a\x3e\xfa\x1a\x65\x33\x3a\x7b\xb8\x8b\x8e\xe6\x9e\x7b\x28\x01\x84\xdc\xaa\xd5\xd4\xcb\x40\xc8\xe0\xfb\xf7\x01\x4d\x06\xa4\x7f\x30\xc6\x5c\x99\x9d\x2c\xea\x1d\x56\x6b\x46\xf7\xbc\x9b\xe8\x05\x90\x2c\x00\x71\x0c\x34\x02\x34\x1e\xaa\x4f\xa8\x0d\x1f\xd4\x87\xfe\xfb\xfe\x5f\xf5\xaa\x82\x94\xd9\xce\x34\x51\xbe\x06\x92\x48\x44\x1e\x46\x3d\x0a\x78\x75\xc1\x5a\xf7\x41\xe3\x58\xe1\xc1\xc7\xe6\x14\x98\x5a\x56\x4e\x7b\x79\xf8\x18\x6c\xf1\x81\xe1\x73\x5a\xab\x93\xc9\x8e\x20\x6c\x40\x0c\x5b\xe4\x42\x97\x18\xbe\x30\x95\x68\x4a\xbc\x97\x0a\x11\xa0\xb0\xb1\x6d\xe2\xaa\xa8\x24\x9b\xba\x0c\xc9\x22\x08\x74\x15\x3f\x3e\x26\x35\x03\x8c\x95\x4f\x41\xfb\x4f\x05\xa8\x66\xef\x17\x00\x1b\x82\xc8\x9e\xb4\x14\x1c\xdd\xb5\x08\xa7\xc7\x30\xda\x1e\xa0\x9e\x2e\x21\x22\x49\x5c\x49\x7c\xf1\x23\x52\x0e\x9b\x94\x1f\xba\xe3\xba\x23\xc8\x1d\xb5\x4d\x60\x71\x8c\x00\x3f\x58\x2e\x8d\x0d\x61\x7c\x4d\x1b\x7e\xf2\xa7\xf4\xe5\x5c\xf0\x6a\xdd\xfc\xa2\x11\x72\x41\x01\x29\x29\x37\xed\xbb\x8a\x9e\x58\xaf\x54\xbb\xd8\x3f\xde\x67\xf2\x82\x3d\x2a\x53\xbb\xe3\xef\x64\x09\x91\xb3\x20\xf8\x28\xd4\xd9\x3b\xe3\xc0\xad\x98\x78\x0f\xf3\xc5\x32\x64\x30\x5a\x20\xc2\x03\x7d\xfb\x4c\x83\x39\x2f\x7e\x89\x27\x0f\xda\x3a\x6f\xad\x02\xb0\x54\x5c\x86\x18\x5b\xfe\x7c\xe0\x41\x76\xd1\xe0\x34\x06\x84\xf1\x54\x94\x31\x79\x49\x1c\x53\x65\x00\x2e\x7e\xe9\x27\x32\xe5\x9b\x4d\xda\xa7\xf1\xdb\xdc\x94\xb8\xfc\xc4\xf9\xa6\x97\x02\xf4\xa5\xb0\x2b\x38\x33\xce\x30\x24\xe6\xb3\x44\x8a\xd1\x58\x79\x7c\x41\x1c\xd1\x20\xb1\x16\xd7\xd7\x67\x92\x20\x24\x6d\x88\x92\x18\x12\x57\x01\x76\xb5\xe7\x64\x03\x04\xcd\x0d\xd5\xbd\xa7\x60\x8a\xa0\x2d\x45\x4d\xe6\xaa\xd0\xea\x1e\x3f\x39\x57\x5d\x85\x85\xba\xd5\xd6\xbd\xb0\x8b\xd3\x33\x9f\xe7\x69\x17\x8d\x7d\x0b\x1c\x21\x5d\x4c\x97\x8d\xaa\xb9\x62\x4a\x05\x60\x57\x84\xf0\x03\x85\x6b\xe6\xc9\xe9\x9f\xef\x92\x1e\x97\x3e\x8a\x6a\xb3\xd4\x3c\xe9\x14\xdc\x3a\xd1\x08\xa1\x81\xb4\x7a\xaa\x47\x29\x40\xce\x32\xcf\x31\xf2\xb0\x01\x3a\x66\x71\xa7\xcc\x1d\xb2\x25\xb7\xbb\xa2\x47\x85\x8a\xd0\xc0\x2b\x0f\xdc\x2b\x7e\x2a\x21\x51\x91\x7c\x35\x61\xbd\xc4\x2a\x35\x2c\x8b\x80\x14\x56\x58\x08\x14\x1d\x8d\xa5\x17\xa8\x1c\xa8\x11\xf0\x36\x13\x35\x42\x34\xfc\xa8\x55\x29\x87\x7e\xfc\x08\xa5\x75\xc7\x92\x83\xc2\x94\x75\x60\x86\x81\xee\xae\x3e\xff\x75\xbb\xf8\x1e\x2e\x52\xfe\xcf\xd9\xcc\xd7\x1b\xbc\x0f\x34\xf3\x8d\x15\xea\x7f\x92\x6e\xbe\x49\x41\x63\xda\xcd\x97\xc5\x7e\xba\x12\xbf\x76\x1b\xdf\xd3\x17\x8f\xef\xe3\x9b\x60\x4d\xbf\xac\x8f\xaf\x7b\x76\x27\x93\x03\xf5\x02\x7f\x74\xf5\xfd\x5d\xbb\xfa\x46\x8d\x47\xe0\x18\xbc\x1c\x24\x2d\x7d\x27\xe3\xd7\xd3\xe1\xf4\xc3\x97\xb7\xf4\xa5\x07\xfc\x33\xb5\xf4\xe5\x39\xfd\x17\x6a\xe9\x1b\x6d\x63\x6f\x4b\x5f\xfe\xfd\x6f\xd8\xd2\xf7\xd5\x3f\x75\x4b\x5f\x5e\x80\xff\x25\x5a\xfa\xf2\x60\xff\xa9\x5a\xfa\xf2\xa0\xf6\xb7\xf4\xe5\x5e\x08\xff\xa0\x96\xbe\x8f\x6a\xe4\x3b\xe1\x84\x5e\x7f\x27\xdf\x84\xda\xf4\xf3\x3b\xf9\xa2\x4f\xeb\x2c\x39\x60\x93\x04\x68\xca\x5a\x95\x39\x93\x6a\x74\xfa\xf6\x82\xb5\xf1\x98\xb6\xbd\x81\x2b\x1b\xe2\xad\xe0\x08\xa0\xb9\xec\x9e\xdb\x8a\x8a\x74\x68\x57\xc4\x91\xa9\x32\xac\x54\x2a\x25\xd2\x6a\x66\xfb\xd2\x3f\x0f\xb0\xc6\x1d\x03\x07\xab\x2f\xbe\xe2\x37\x3c\xae\x75\xb0\x87\x00\xff\xa7\x6e\x1d\x2c\x7a\x7b\x07\x17\x9e\x5b\x22\xf4\x0e\x2e\xfb\xdb\x06\x8b\x3f\xb7\x1a\x10\xfc\x09\x30\x29\xe2\xcf\xe2\x4f\xed\x46\xa6\x7f\x66\x26\x78\xef\x49\xfe\x06\xdd\x83\x0f\xfb\x2a\x5f\xd5\x44\xf8\x6c\x70\x1a\xac\x4e\x8a\x90\x7e\x4e\x57\xe1\x68\xe2\xff\xab\x75\x15\x7e\xc0\x03\xfc\x9a\xe6\xc2\x0f\x6c\x58\xab\xc7\x30\xad\xe1\x17\xf6\x18\xfe\xf2\x96\x17\xe2\x57\x6b\x3b\xfc\x0f\x6f\xfd\x1a\xc3\xe0\xda\xad\x5f\x21\xd5\xfd\x1b\x74\x7f\x7d\x12\xc3\x05\xff\xc7\x9b\xca\xcc\xa1\xed\xab\x87\x00\xb8\xa1\x6d\x89\x51\xf6\x63\x69\xe6\xa1\xb1\xeb\x13\xdf\xd8\x75\x2a\xcb\xdc\xac\x43\x7f\x57\xd1\xd7\xe0\x55\xfc\x59\xc4\x2d\x5e\x7f\x78\xf6\xe4\x9f\xa4\xc5\xeb\xc1\x3f\x83\x6f\xcf\x47\xe7\xe3\x09\x74\x00\xfa\xad\x5a\x00\x1e\xee\xff\xf3\xf2\xf9\xf3\x17\x9d\xfe\x7f\xa7\xaf\xfe\xe8\xff\xf7\xbb\xfc\x39\x57\x6e\xf7\xd1\x99\xf5\xed\xdc\xc8\xc7\x45\xc7\xe3\xfd\xe8\xf2\x26\x6e\x02\x04\xec\x32\xb9\x38\x7b\x76\xfa\xfc\xe4\xd9\xab\x93\xb3\x53\x71\x09\xba\x1d\x35\x4d\xa0\x45\x84\x0b\x9d\x8a\x45\x8e\xe1\x84\x24\xa1\xa7\xb8\xc2\x50\x71\x53\xc0\x15\x71\xd7\xba\x21\x9e\x04\x66\x9f\xd4\xb5\xf5\x6d\x52\x62\x7e\x47\xa2\x55\x89\x52\xad\x1e\x6a\x53\x6f\x8d\x00\x64\xc4\xa6\xd2\xe5\x42\x6f\x0a\x65\x21\x0e\x81\x36\xa6\x15\x79\x25\x97\xce\x30\x04\x14\xd2\x7f\xc7\xfe\x29\x05\x13\xb6\xb5\x9e\x15\x3f\xc2\xdc\xab\xca\xe3\xbc\xdb\x99\xaa\x64\xc6\x3f\x46\x08\xd1\x04\x85\x3e\xaf\x8c\xcc\xdb\xc9\x65\x44\x62\x57\x36\xc3\xf1\x58\xb5\x30\x65\x5e\x50\xd5\x9b\x8a\x48\x13\x65\x34\x86\x42\x6e\x33\xf7\xd2\x72\xb1\xc2\xbf\xc3\x90\x29\x0e\x54\x53\x4b\x5b\xd0\x1b\xd0\xe7\xc8\xd4\x2b\x27\xd8\xb1\x7a\x8a\x69\x35\xb7\x58\x1a\x5f\x51\x85\x97\x93\x9e\xc0\xb0\xd0\xc8\x22\x64\x8d\xe0\xe1\x9c\xe3\x8a\x68\xa3\xd8\x70\x00\x70\x2c\xc2\x2f\xe1\x25\xb4\x57\xee\x1b\x18\x4f\xf7\xc6\x92\x9b\x97\x59\xeb\x85\x27\x98\x80\x5e\xe5\xcc\x53\x0b\x4c\xa7\xfc\x6d\xfa\x06\x9e\xd2\x7f\xff\x9f\xe1\x04\x55\x0a\x76\xcd\xfd\x77\x6e\xd6\x6b\x0d\x90\x77\x59\x8b\xff\xf8\x37\x51\x7c\xf3\x1f\xff\x5f\xa9\xaa\x3b\xed\x6c\x56\xb3\xd6\x7f\x6f\x94\x50\xb5\x90\xcd\x27\xc1\xbf\xb0\xb1\x95\x6f\xc5\x89\x38\x1f\x0d\x33\x20\xac\x01\x13\xc0\x2e\x34\xd2\xaa\x2c\x32\x51\xab\xc5\xaa\x44\xc2\x2d\x58\x9a\xbc\x71\xfb\x2d\x0b\x68\x80\x2c\xab\xc5\x4a\x28\x5b\x4b\x30\xec\xb0\x95\xd4\x4a\xde\xf3\x01\xa3\x43\xe3\x56\x11\x10\x86\x66\x29\xe6\x8d\xd5\xa5\x3b\x11\xb2\x16\x67\x2f\x45\xd5\x28\x31\x51\xf3\x42\x96\x8b\x4c\xe8\xf5\x5a\x35\xce\x4f\x9a\x28\x71\x6d\x4a\xe7\x53\x5d\x64\xe2\xbb\x97\xcf\x4e\x5f\x8a\x6b\x59\x69\x9b\x81\x0d\x41\x79\x1b\x98\xba\x2a\xeb\x4a\x89\x4b\x89\x8c\x35\x22\x77\xbb\x29\xa6\x6a\xb1\x52\xd5\x62\xa5\xc4\x8c\x27\xe2\xd6\xe0\x44\x9c\x5f\x4e\x67\xbd\xd3\xc4\x7d\x75\x33\x35\x85\xb9\x83\xd9\x7e\xf1\xac\x9e\xc3\xa4\xde\xeb\xc5\x4a\x15\x27\xc3\xf2\x4e\xb9\x29\x7c\xf7\xc3\x0b\x9c\x82\x58\xa8\x5c\x7d\x12\xa7\xaf\x3a\x73\x19\x13\xbb\x5e\x32\x9b\x30\x15\x55\x8a\x31\xdb\x3f\xb4\xa3\xaa\x14\x43\x42\xa1\xe0\xfc\xc6\x65\xa5\xe5\x6f\x3e\xc1\x0b\xe3\x84\x8a\x33\x39\xc5\xcf\xa6\x68\x16\x4a\x36\x99\x98\x9a\x05\x24\xbe\x4c\x53\xd5\x99\x78\x7d\x2d\x4e\x9f\xbd\xcc\xc4\x77\xdf\x9f\xbe\x7c\xee\xb6\xf3\x7c\xa5\x6c\x29\x77\x38\xfb\x64\xea\xdc\xb5\x0b\xd2\x26\xed\x4c\xef\x43\xe2\x13\xad\x06\x90\x1f\xd4\xf3\xa1\x8e\x29\x55\xc8\x6d\x69\x77\xe0\xa6\xbc\x2d\x07\x42\x41\x94\x44\x98\x53\x0f\x31\xd0\xf5\x8a\x9b\x6d\x57\x72\xad\xb8\x94\x56\x96\xc2\x6c\x54\xc9\x02\x2d\x65\x32\x31\xb9\x2a\x3c\x63\x2a\x81\x69\x00\xbd\x44\x33\x22\xfb\xcc\x86\x48\xb8\x2c\x44\xb3\x31\x21\x9b\x17\xe3\x2f\x96\x98\x09\xac\x6c\x80\x6e\x50\xb4\x98\xe8\x2e\x28\x4e\xcc\x9c\x99\x11\x03\x45\xea\xec\x5b\xa6\x83\x61\x56\xa3\xc0\x00\xe3\x05\x74\xdd\x2a\x05\x66\x59\x17\xf8\x6e\x62\x0c\x62\x77\x55\x59\x8c\xcf\x77\x31\x7c\x3a\xa3\x09\x10\x82\x0d\x91\x8f\x08\x9a\xe0\x66\x09\x88\xc1\xf1\x5e\x93\xc7\x11\xd0\x0e\x7d\xc3\x8a\x2f\x23\x6f\x0d\xd9\x80\x7b\x65\x69\x84\x42\xc0\x26\x73\xa1\xb5\x07\x88\x53\xf7\x5e\x70\x8b\xf8\xad\x85\x96\xd0\x19\xc9\xf3\xe5\x10\x2c\xdc\x6e\xd4\x82\xa8\xad\x2a\x6d\x3f\xda\x98\x70\x14\x06\x5e\x18\x99\x03\x48\x0d\xa8\x37\xb3\x08\x9b\xc6\xfc\xbd\x18\x32\x22\xe8\x5a\x1b\xe8\xef\x8f\x1f\xad\x16\xd6\x25\xb8\x7f\x43\xae\xd9\x27\xe7\xa8\x92\xc7\xf3\x53\x67\x94\x4c\x73\xf7\x34\xbd\x1d\x78\x14\x3c\x93\x85\xdc\xf9\xee\x36\xa8\xcf\xa1\x8f\xbb\xe0\x8e\xc4\x5e\xb1\x93\xd5\x41\x5a\x0c\x8b\x18\x75\x68\x6f\x4f\xf5\x96\xbe\x25\x01\x21\x6e\x55\xa5\x55\xb9\x50\x00\x73\x5e\x2a\x30\x55\x64\x61\xbd\x10\x29\x4f\x72\xb5\xa9\x57\xa1\x00\xe9\x63\x69\xb6\x85\xca\xef\xd4\x40\xdc\xfa\xe3\x10\x2a\xf2\x3d\x7d\x3f\x0c\xd0\x2d\x2d\x09\x2c\x0a\xb7\x60\xc1\x14\x96\x51\x74\xfa\x0e\x27\xda\x5c\x57\x29\x95\x98\x4e\x72\x4e\x40\xde\xee\xb7\x40\x2d\x9a\x08\x99\xa1\x19\x3e\x90\x32\x30\x63\x48\x0f\xad\xac\x1c\x8b\xfb\xc0\xe1\xf6\xf9\x93\xcc\xd3\xcf\x97\xb9\x2f\x8c\xc2\xf6\x63\x1e\x5d\x9c\xa2\xb5\xf8\xc5\x04\xba\x0e\x26\x23\x15\xf0\x2f\x2b\x85\x1d\x6d\x36\xdc\x75\x07\x3c\x59\x8e\x9e\x44\x20\xf7\xb8\x53\x23\x74\xdb\xcf\x42\x85\x6a\x49\x7d\x26\xac\xcf\xb6\x51\x50\x45\xe6\x39\x32\x56\x54\x6a\x6d\xee\x09\xd4\xb7\xac\xcc\x3a\xc0\x21\xd2\x21\x79\x9e\x32\x00\x5a\x90\xa4\xf1\xbc\xd5\xa6\x8a\x8a\x36\x0e\x5e\x4e\x82\x79\xa0\x35\xd8\xcc\xd7\xda\x57\xfa\xe0\x51\x40\x7e\x22\xd4\x40\x3c\x70\x2c\xd2\xa1\x7e\x09\xc5\x4e\x48\xfb\x51\xe5\xe2\xef\x8d\xb2\xb8\x9c\x44\x36\x00\x41\x35\xc6\x33\x9a\xe5\x52\x43\x8d\xcc\x56\xcd\xad\xae\x55\x6a\x45\x45\xad\x21\xe5\x5a\x17\x3b\x71\xb4\xaa\xeb\xcd\x8f\xdf\x7e\xbb\xdd\x6e\x07\x0b\xb5\xd0\x45\x31\xd0\xe5\xd2\x7c\xab\xcb\x5c\x7d\x1a\xa8\x72\xb0\xaa\xd7\xc5\xb1\x47\x11\x7a\xc7\x5d\x2c\x0a\x59\xf9\xc2\x63\x64\x07\xae\x6a\xbd\x28\x94\x38\x15\x27\xe2\x62\xf4\x66\x7c\x49\x41\x67\x2a\x34\xea\x03\x33\xf9\xa5\xce\x22\xa6\x45\x1f\x19\x25\xd4\x38\x4e\x15\xa2\xc4\x6c\x94\x4b\xb1\x90\x1b\x5d\xcb\x42\x14\xd0\x98\x90\x20\x83\x76\xe5\x76\x27\x74\xf3\xf3\x4f\x22\x7a\x43\xae\x38\xa0\xff\xf9\xb7\xff\xe8\xa9\x9f\x23\x0d\x28\xc3\xd8\xb8\xc6\xd9\xc7\xb2\x23\x55\xe3\xa1\x06\x18\xad\x2c\xd5\x27\x82\x71\x85\xf7\x04\x87\x20\x30\x4c\x47\x6c\x38\xf0\xe8\x2b\xc4\xb7\x9e\x47\x95\xab\x44\x53\x7d\x4e\x25\xbd\x6b\xbc\x7f\x18\x5a\x25\xbc\x11\x94\x6c\x75\x5a\xa5\x67\xe2\xa9\xb4\x42\xdb\xa7\x61\x51\x27\x0c\x07\x42\xa0\x32\x8e\xc1\xcf\xbf\x35\xde\x71\xa9\x6b\x77\x82\xfa\xc6\x3d\x6b\x8d\x3b\x1e\x24\x5c\x54\x5c\xa2\x5d\x67\x52\x5f\x33\x03\xbc\xe9\xd8\xe2\xf2\x50\x75\x46\x0b\xb1\x40\x27\x7f\xdf\x34\xdf\x73\x95\xe5\xc1\x79\xc6\xad\xcc\x7c\x14\xdc\x94\x6e\xca\x65\xa7\xfc\xd0\x6f\xb8\x5f\x94\x1f\x5b\x64\xdf\xb3\xa0\xd7\x75\x89\x1c\x1b\xfe\xf4\x30\x8b\x0f\x12\x65\x40\x18\x1d\x90\x1d\x68\xa4\x84\x82\xad\x88\x10\x3f\x82\x4a\xcf\xbc\x0f\x95\x8c\x25\xda\x83\x78\x7e\x5c\xca\x06\xe5\xc4\x84\x82\x82\x3c\x49\x04\xb2\x0d\xe4\xe0\x5c\xf6\x12\xe6\xd5\x7a\xcb\x3b\x10\x7d\xf1\x0b\x50\x18\x1e\xd9\xe3\x83\x8e\x9f\xfb\x45\xfb\xb8\xb5\x1e\xcd\x47\xb7\x77\x77\x9c\x85\xe0\xde\x41\xba\x17\x4f\x37\xd1\xe2\xee\xdb\x77\xbf\x71\xc6\x0f\x58\x86\x0b\x42\x4f\x02\x10\xe1\x63\xf7\x7b\x42\x36\x56\x3c\x44\x5c\x91\x4c\x24\xf0\x6b\x5d\xe6\xfa\x5e\xe7\xce\xb5\x06\x1e\x94\x3b\xe7\x8a\x94\x35\x70\xd1\x42\xfb\x57\x7f\xb8\xdb\xf3\xf4\x27\xfd\xc1\x59\x69\x53\xfa\x69\x05\x95\x95\xd0\x44\x64\xc8\x26\xb0\x60\xc0\x72\xe0\xd6\x77\x36\x64\x2e\x37\x75\x4a\xdf\x0f\x9d\x44\xe3\x0a\x69\x75\x57\x31\xfb\xbc\x49\x07\x0a\x1c\xbc\xfe\xad\xd1\x52\xdb\x94\x5e\x21\x7c\x66\x5c\x82\x33\x5e\xb8\xfb\xd8\x14\x1d\xe1\x89\x3f\x0d\x1b\x65\x55\x8d\x50\x0e\x77\x14\x43\x3d\x7c\x40\xd2\x39\x5b\x26\x11\x26\x94\x41\xa4\xd6\x35\xc0\x3e\x01\x0b\x98\xd6\x7d\x9b\x8a\x5b\xb7\x82\xdd\xc4\xcc\x91\x81\xa1\x14\x42\x1c\xc1\xc2\xdf\x73\x5a\x47\x9f\x92\xd9\xf4\xec\x04\x4d\x33\xeb\xe7\x65\x9d\xf9\x26\x76\x81\xab\x40\x5b\xfa\x92\xb7\xef\xfd\x72\x57\x0d\xc0\xf2\x7c\x99\x1f\x23\xd4\xec\x06\x31\x8e\x58\x52\x51\x62\x43\xb0\x16\xaf\x24\xe9\x06\xa4\x74\x81\x4e\x29\x2d\x2d\xf0\xb8\x99\x40\xb5\x40\x89\x5d\x14\xdb\xa7\x21\xa1\x71\x84\xc8\x10\xd6\x66\xaa\xc4\x40\x4c\x06\xdd\x1a\x05\x10\x10\x5e\x4f\xe2\x9b\x75\x80\x93\x30\xe2\x6d\xac\x08\xc2\xdc\x56\xd4\xd9\x67\x25\xe3\xb0\x65\x79\x67\x44\x43\x77\x16\x4c\xdf\xc0\xf8\x37\x87\xc7\xf7\xfc\x37\x1c\xdf\xe8\x36\x1d\xd5\xa8\xa9\xcc\x46\xc9\x52\xdc\x96\xee\x0b\x7b\x46\x74\x3a\x38\xfd\xdc\x31\xf9\x07\x53\x0c\xae\x2b\x17\xaf\xb1\xdc\x05\x47\xe3\xeb\x77\x23\x63\xc4\xd7\xf1\xa2\xfc\x1c\x04\x4a\xe4\xd8\xf6\x23\xcf\x00\x89\x9b\xa1\xac\xa0\x84\x2a\x5b\xc0\xed\x83\xe2\x2c\x1a\xb7\xd8\xce\xc4\x48\x2c\xd1\x33\x71\xc2\x79\x45\x8e\x4a\x24\x16\xa8\x4a\x23\xd6\x88\x5b\x90\x65\xcd\x33\x9c\x44\x35\x4b\xc9\xc0\x21\x0c\x5b\x9a\xf2\x84\x12\xe9\xf7\x2a\xf3\x5c\xfc\x50\x62\x00\x85\x86\xa6\x2a\x72\x40\x9a\xc7\x3d\x19\x93\xfb\x01\x9c\xc6\xd0\x24\x19\x67\xc5\x03\x7f\x29\xfe\xf4\xdf\x80\xb4\xee\xcf\x54\x74\x84\x9d\x70\x3d\xf5\x13\xd4\x15\x40\x83\x13\x9a\x47\x14\x92\x6d\x45\x22\x92\x30\xab\xd4\x79\x2a\xb8\xf8\x85\xcf\xc5\x89\x18\x9e\x9f\x8f\xae\x6f\x86\x97\xe7\x23\xda\xbe\xe7\x83\x53\x6c\x58\xc8\xd3\x46\xfb\x7a\xae\x44\xee\x16\x0d\xda\xfd\xf4\x29\xde\xfd\xc6\x58\xe2\x5d\x41\xe0\x07\xe4\xd1\x62\x01\x7d\x9e\x03\x70\x1c\x4d\x3d\xfe\x47\x70\x08\xee\x9d\x5b\xcb\x56\xbc\x10\xe2\x48\x1f\x73\x2c\xe2\x90\x1a\x82\xcb\x00\x02\x57\xce\x9d\xcf\x3a\xdf\x89\xdc\x6c\x4b\xfe\x26\x51\x3e\x38\x8f\xb0\x56\xa0\x05\x48\x71\xcf\x77\xa2\xf5\x19\xdf\x80\x01\x99\x2e\x7f\x8a\x87\xa2\x8f\xa3\xb1\x23\x30\x39\x5e\x3c\x2e\x2e\x23\x11\xba\xb7\xc2\x0c\x54\xfd\xc0\x6f\xc1\x99\xb8\x2a\x55\x92\xbd\x8e\x9c\xa6\x88\x76\xc6\x37\x92\xaa\x54\x41\xbd\x02\x88\xa3\x68\x25\x2b\xb9\xa8\x55\xa5\x6d\xad\x17\xa1\x84\xd9\x2b\x1a\x0f\x3c\x49\x43\x51\x59\xdc\xef\x22\x14\x28\xa7\x61\x12\x06\xe4\x03\xb1\x73\x08\x8c\x60\xd4\xcb\xf7\x3b\x0a\xe5\xe0\xad\x7b\xb4\xa9\x34\xde\x2e\x48\xf0\x84\x1a\xca\x7d\xf7\xc2\x9d\xc8\x3f\xfd\x37\xfc\xa0\x2e\xef\xfc\xed\x40\x1a\x91\x54\x9c\x38\x5b\x0e\x13\xc5\x72\xe1\x23\x30\xd6\x67\x2c\x56\x10\x3a\xa1\x58\x4b\x44\xcb\x43\xe5\x93\xfc\xc6\x17\xe2\x44\x8c\xde\x10\x16\x50\x5c\x0c\x6f\x46\x80\xa9\xba\x19\x4d\xdf\xd3\x16\xbd\x18\x9c\xb6\x3e\x41\xbf\xb8\x49\xe4\x0b\xdf\x9d\x85\x59\xab\x00\xcb\x61\xaf\x1d\x9a\x36\x44\xbe\x8e\xbf\x4f\x89\x24\x52\x9f\xb1\x32\x03\x3f\xbc\xb3\x78\xb4\x7d\x83\x8a\x4a\x88\x4d\x15\x51\x64\x11\x07\x39\x9a\xa9\x2c\x6d\x22\x49\xf3\x90\x61\xdf\x2b\x69\x5e\x8a\x13\x31\x3b\xbf\xba\x06\xd0\x1c\x40\x17\x67\xe2\xed\x74\x78\x79\x33\xba\x60\x19\xed\xc5\x2e\xed\x1f\x15\x18\xb7\x0e\x0f\x5a\xcc\xe4\xcf\x66\x2d\x49\xb1\x6f\x28\xa1\x1c\x12\x25\x43\xc3\xf4\x0a\x3c\xe7\x58\xa8\x46\x17\x8d\xb6\x69\x2e\xad\xf6\x37\xa8\x57\xcc\x85\xcd\x89\x04\x37\x2c\xc0\x6b\x80\x01\x58\x4f\x03\xe4\x67\x69\xb6\x25\x55\x11\xac\xd1\xed\x33\xdb\x12\x19\xc3\x08\xde\xe2\x3b\x4b\x87\xea\x2a\x68\x56\x52\x25\x34\x99\x91\x29\x9b\xde\x70\x82\xe8\x63\x3b\x23\x26\x29\xc9\xd2\x31\xc0\x05\xa8\xe5\x47\xae\x1e\x31\x54\xc8\xaa\xfa\xa4\xd4\x9c\x61\x6d\x3c\x30\x79\x27\x9d\x33\x1b\x87\x9d\x27\x9e\xd7\x9e\x42\xc4\xea\xd3\xa6\x30\xba\xbf\x98\xd9\x1f\x14\x2a\x05\x88\x1f\x5d\xa9\xd0\xe5\x86\x78\xb5\x7b\x87\x5d\x9b\x10\xf8\xe1\x2f\x28\xb0\xf7\xe7\x76\x51\xe9\xb9\x07\xeb\xc4\x29\x86\xe4\x2a\x81\x7a\x72\x76\x34\x54\xee\xf0\xfd\x79\x39\x38\xc5\x63\xea\xce\xeb\xed\x2c\xbe\xdc\x93\xb8\x07\x5e\x68\xcb\x17\x71\x6a\x05\x21\xcb\x78\x29\xec\x25\x1b\x17\xd8\x90\xf4\x5b\x6a\x55\xe4\x08\x7a\x0f\xb5\x64\x19\x33\xea\x12\xe5\x6e\x6c\x0c\x04\x96\xa1\xe0\x26\xb8\xfd\xad\x9c\x8e\x89\x74\xe4\xe9\x00\x60\x90\xb2\xa4\xba\xdc\x5a\xad\x37\x86\xda\xac\x60\x8c\xd5\x67\x43\xba\x87\xea\x90\x42\xa5\x9c\x68\xfc\x73\x6f\x81\xe1\x9f\xb3\x41\xc8\x14\x10\x73\x1f\xfc\x9d\x5a\x78\x81\x8e\xb5\xb5\xa9\x3a\xea\xdb\x94\xe9\xdb\x9c\xae\x8d\x9e\xfb\x7c\x80\x5e\x73\xe1\xf9\x97\xcd\x1c\xd4\x76\x26\x6c\xdd\xe4\x3b\x9c\x26\xb6\xe6\x61\xca\x19\x53\x86\xa8\x49\xae\x90\x58\x01\x37\x49\xe7\x4a\x72\x00\xc6\xe7\xf9\xe7\x6a\xa5\xb9\xd8\xb7\x22\x80\x11\xe6\x28\xdd\x1b\x55\x41\x11\x76\xe7\x89\x26\x46\x15\x55\xd4\x81\x5c\xc5\xd0\x71\x37\x06\xb7\x90\x15\xd4\x69\xf1\x79\xa0\x17\x1c\x5e\x2a\x38\xd3\x4c\xae\x40\xeb\x06\xed\x04\xfc\xf4\x5a\x99\xfd\x48\xc1\x93\xca\xa3\x26\x2c\x75\x11\xf7\x1a\x72\x83\xe8\x98\x1d\x2f\x07\x67\x00\xb2\xbf\x99\x00\x02\x44\xdc\x5c\x89\xf7\xc3\xbf\x8c\xc4\xf9\xd5\xa5\x6f\x94\x39\x8b\x6e\x42\x48\x3a\xca\x8f\x69\xa4\xc4\xb7\xea\x6b\x65\x27\x7d\x47\x40\x0a\x38\x64\x02\xcc\x8e\x3b\xc4\x36\x06\xf6\xfb\x9e\xe8\x45\xdb\xcb\xcc\xd2\x64\x1d\xd6\x15\x33\x5d\x5f\xc8\xf2\x60\x3b\xf8\xd4\x69\x3f\x7c\x8b\xdb\xa3\x38\xef\x2b\x25\xf5\x67\x36\xe5\xbc\xd1\x75\x98\x78\x5c\x18\x48\x46\x5a\xb4\x25\x75\x28\xf2\xe1\xd3\x14\xbf\x88\x91\x07\x90\xc2\xb2\xc1\x58\x60\xfe\xfb\x4a\x71\x90\x03\x92\x08\x61\x07\x9f\x07\xb1\x15\xf7\x37\xf5\xde\x7d\x54\xfc\x9c\x45\xab\x67\x5a\xf4\x69\xfd\xdb\x47\xce\xa0\x3f\x96\x35\xe9\xc1\xf5\xba\x29\x91\x16\x23\x59\x1b\x5a\x2b\x4a\x1b\x71\x86\xbe\xef\x96\xe3\x66\xf6\x9a\xef\x9d\x5d\x5e\xcb\xea\xa3\x0a\xad\x28\x75\x5f\x82\x57\x2c\x15\x1e\x29\xc0\xfc\x9a\x25\xb1\xcc\x65\x89\x82\x4d\x7b\x98\xb5\x65\x1e\xbc\x7e\xdf\x89\x61\x6a\x89\xf4\xe4\x44\x89\xe1\xf4\xd9\x3e\x9a\x0c\xca\x6b\xdd\x8e\x40\x53\x8b\x8a\x98\x22\x7e\xb1\x00\xb4\xb9\x37\xe7\x3f\xd3\xea\xf0\xa7\x61\x70\x3a\x48\xfb\xdc\x5e\xbd\x09\x98\x2f\xc6\xf8\xb6\xfb\xde\x3e\xe6\x96\xc4\xd0\x82\xaa\xd9\xbb\x98\xba\x4c\x72\x05\xa6\xea\x64\x07\xda\xfc\x55\x70\x15\x5a\x05\x74\x6b\x2c\x72\xc4\x24\x10\x85\xd4\xa3\x44\x5f\xc7\xab\x87\xcb\x63\x23\x82\x34\x77\xb6\x22\xe5\x88\xfa\x51\xee\xf1\xaf\x92\xcf\x9d\x0d\xf6\xfb\x58\x91\x46\x37\xcb\x76\xa0\xc3\x54\xdf\xd8\x34\xc1\xef\xf3\xee\xfb\xcc\x79\x2b\xbe\x87\x0f\xfe\x10\x0d\x81\x73\x9b\xad\xfe\x61\xb0\x54\x90\xda\x77\x3f\x8b\xd7\xb4\xb3\x03\x36\x81\x2c\x24\xb6\x94\xa2\xd6\xed\x36\x72\x4d\x52\x70\x04\x00\xf9\x93\x1d\x5c\xf6\x58\xd6\xce\xd4\xd0\x06\xea\xf1\xfa\x18\x23\x43\x9c\xb3\x8f\xe3\x21\x08\x74\x6f\xf0\xf4\xf1\xa5\x72\x68\x16\xda\x20\xfe\xbd\xd1\x56\xd3\xe1\xb0\x75\x4f\xa2\x82\x74\x31\x51\x89\x28\x0a\x51\xc4\x1f\xc6\x4c\x37\x99\x8c\xad\x4b\x73\xd6\xbd\x34\x78\x47\x46\x17\xfe\xf6\x84\x6f\xfc\xd2\x51\xf5\x6b\xb0\x4d\x65\x2a\xd1\x3b\xfa\x6b\xef\xbd\x66\xaf\xa4\x6f\xb5\x82\x56\xeb\x24\xb2\xd8\xcd\x8c\x58\x73\xf6\x5d\x96\x38\x22\x33\xf8\x92\x2b\xbf\x52\xdd\xf7\xc3\x11\x8d\xd1\x34\x4e\xb7\xa5\x14\xe6\x7f\xdc\xf6\x07\x6f\xfb\xc1\x8b\x9e\x34\x96\x59\xf6\x6f\x43\xf7\xc6\x27\x53\x7c\x4e\x53\x54\x51\x77\xc9\x36\x5a\xe3\xa0\x34\x48\x76\x78\xdf\x18\xbe\x5e\x2c\xf4\x1d\xaf\xaf\x94\x0f\xf1\xc8\xbf\x4a\x3e\x3c\xef\xca\x87\xd1\x5f\x6f\x46\xd3\xcb\xe1\xc4\x09\x8a\xdb\xc9\x68\x76\x48\x3c\xac\xa4\xf5\xf8\x22\xa8\x75\x6a\xa5\x8f\x0e\x88\x86\x6e\x3c\xb5\xdd\x58\x0f\x6e\x54\xcf\x03\xe5\x81\x4e\xf1\x32\xa4\x92\x3a\x38\x88\xd6\xd4\x5f\x0c\xc4\xf9\xd5\xfb\xeb\xe1\x0d\x57\x22\x42\xa9\x23\x96\x2f\x12\x86\x7c\xb6\x47\xa0\x2c\x64\x19\xe8\x58\x71\x17\x18\x0b\x9e\x12\x7d\xb5\x6e\x7b\xa0\x51\xef\x70\x45\x50\x9e\x28\x6b\xa5\x67\x38\x83\x39\xba\xbd\x9e\xf0\x75\x7a\x7f\xd8\x06\xeb\xef\x02\x40\xb1\x30\x18\xeb\x9e\x32\x30\xc8\x65\xb5\xb8\x9f\x1f\x31\xac\x7d\x52\x37\x5e\xa4\x47\x0c\x1b\xc9\x47\x7f\xb7\xb5\xfc\x07\xac\x11\x47\x10\x5f\x89\x13\x31\xbe\xbc\x19\x4d\x26\xa3\xf3\x9b\xdb\xe1\x44\x5c\x4f\xaf\xae\x47\x53\x2c\xde\x87\x8e\x13\xa7\xe2\xea\xe7\x11\xd6\xde\x03\x0a\x69\x38\x69\x2b\xeb\x1b\x9f\xa1\xc7\xf0\xdb\xc1\x38\x66\x07\xa0\x00\x44\x95\x21\x82\xc8\x13\x69\x7f\xae\xb5\x07\xbd\x55\x0a\x7d\x57\x1b\xd7\x2e\xe0\xca\x68\xa0\x4e\x58\x40\x21\x40\x47\x09\xeb\xda\x52\xd5\x56\x99\x8b\x12\xdb\x0d\xf8\x5c\x4d\xec\xf2\x47\x70\x91\xcf\xb2\x37\x40\x94\xec\xc3\x69\x44\x6b\x19\xc7\xe3\x58\x1c\x77\x56\x05\x8a\x0c\x29\xe6\x5c\x35\x05\x76\x18\x46\x9d\xc0\x28\xe4\x28\xf2\xea\x87\xd4\x70\x14\xa7\x2f\xfc\xfd\x62\x70\x26\xfe\xf4\xdf\xdc\x9c\x42\xe4\xfb\xd5\xe0\x2c\x9c\x83\x7d\x91\x0b\x7f\xdd\x00\x7e\x81\xa2\xb8\x63\xb0\x91\x97\x6e\xb6\x65\x80\xf7\xf5\xd7\x49\xa4\x47\x47\xdb\x96\x2b\x6f\xe3\x2e\x3d\x01\x01\xe5\x1b\xf6\xc0\xa8\x9f\x87\x51\xef\xd1\x25\x07\x06\xde\x51\x21\x5f\x33\xf8\xf6\xa3\x0e\x8d\x9f\x8d\x2f\xf0\xb3\xdd\x69\x47\x4a\x16\x38\x6a\x3b\xec\xbe\xd5\xaa\xfc\xc1\x13\x8a\x08\x74\x84\x80\xf5\x10\xba\xbf\x1a\xbc\x10\xff\x72\x35\xbe\xbc\x41\xfa\x8a\xd9\xbe\xed\x0b\x0c\xb3\xe1\x0c\xa6\x41\x50\x8a\x6b\x23\xee\x33\x0b\x41\xe8\xd0\xa0\x5e\x96\x65\xdc\xb2\xb4\xbb\x40\x5c\xaa\x8d\xa5\xd8\x5d\xbc\xc3\x4f\x49\xe8\x33\x89\x43\xc1\x0d\xf2\xad\x4a\x90\xa7\x1a\xfb\xf7\x42\x36\x91\x5e\xad\x99\xf1\xbe\xd7\x85\x8e\x83\x07\xa5\xa9\x7b\x43\x12\xdd\x40\xfe\x1e\x42\x3f\x4f\x17\xf7\xf0\x79\x28\x5b\xc1\xd9\x65\x2c\x95\x48\x4a\xb7\x90\x3e\x94\x39\x94\x1f\x55\x1f\xde\xef\x5e\xdb\x93\xff\xf8\xb7\x93\x7b\x6c\x7d\xe5\xcc\xcf\xe5\x32\xc3\x1e\xce\x44\x91\xba\x56\xd2\x36\x95\xb2\x09\x63\x2d\x55\x7b\x11\x3e\xdd\xcb\xa5\xc3\x83\x7f\x68\xb0\x89\x6a\xf9\x4e\x9c\x88\xe9\x68\x02\x24\x2b\xc8\xe8\xe1\xef\xdc\x77\x83\x53\x71\x0b\x82\xb9\x34\x29\x69\x1f\x1d\xe4\xd4\x15\x81\x2c\x83\x4a\xb3\x15\xb5\x61\x9f\x27\x2e\x2c\xb2\x56\x5b\x62\x8e\x85\x5a\xdd\xb2\x56\x25\xfc\xd3\xc3\x91\xda\xb0\x81\x81\x07\xdd\x11\x1d\x6f\xf2\x96\x56\x94\x17\xdb\x16\x60\xf7\x30\xba\x87\xfc\x60\x6a\x33\xb6\xc7\xba\x04\xbe\xb0\xbe\x71\x66\xbe\xb5\x0a\xf4\x1f\x0a\x23\xce\x82\xd2\x49\x84\x74\x64\x54\x22\xe6\x11\xac\x49\x71\xc5\xbe\x4c\xc8\x84\x71\x4f\x06\xd8\xd7\x78\x2d\xe8\x8d\xbd\xcb\xe6\xd7\x09\xdf\xae\xcb\x45\x53\x45\x4e\x17\x03\xed\x07\x7e\x23\xcf\xc4\x0c\xe9\xc0\x90\xb8\x71\xf7\xd0\xda\x61\x82\xc6\x77\x6a\x66\x5a\x08\x38\xba\xa6\x50\x81\x03\x96\xba\xca\xcb\x28\x87\x1e\x49\x3a\xf0\xdd\xe6\x00\xbd\x84\x80\x1e\xe0\x1f\x90\xc1\x3f\xa8\xb9\x7e\xf2\xce\x59\xc4\x75\xf4\x2d\x7d\xb2\xc7\x2d\x8a\xbb\x54\xb5\x36\x34\x0a\x38\xb3\x84\x46\x40\xfa\x40\xcc\xdc\x62\xb7\xb2\xfe\x80\x63\x70\x4b\xaf\x29\xf5\xdb\x77\x42\x34\x75\x2b\xf7\xc9\xaa\xb0\xfd\x64\xf5\x60\xe3\xe3\xee\xe6\x33\x0c\x2c\xf7\x15\x9e\xc9\x39\x68\x27\xf2\x93\x3b\xfa\xbd\x38\x01\x2e\x1a\x70\x3a\x68\x4f\xbf\x1f\x9c\x8a\xd9\x21\x6b\xd7\x7f\x79\x70\xd6\x0a\x7b\xf5\xda\x49\xd8\x02\x1b\xda\x72\x96\x16\xcd\x0e\x4e\x1c\xa3\x00\x15\x85\xb1\x4e\x78\x51\x63\x85\x7b\x37\x65\xc2\x07\x76\xa0\x7c\xdc\x4e\x8a\x0b\x5c\xa5\x58\x4a\xf8\x2b\xce\x3a\x4e\xb7\x55\xaa\x50\xf7\xb2\xac\xfd\x52\x64\xb1\x01\x89\xc2\x03\x81\x30\x4e\x77\x2c\x54\x3b\xea\xff\xfd\xe0\x2c\xc9\xa0\x7f\x63\xa3\x8b\x00\xd8\x76\x4f\xf9\x8b\x7a\x66\xbd\xd6\x35\x66\xb2\x00\xf0\x1a\xb1\x1b\xa6\x51\x95\xe0\x24\xcf\x15\xde\xb0\x0a\xf1\x3f\xf1\xc4\x74\x9c\x53\xf8\x91\xc0\x39\xd6\x8a\xbc\x49\xa1\x30\xdf\x58\x51\x9b\x5a\xfa\x64\x23\xf4\x82\x94\xba\x68\x88\xbf\xbe\x29\x96\x9a\x68\xb2\x13\x62\x5d\x80\xd8\xd0\xfa\x23\xeb\x1e\xe1\xd4\xdc\x03\xe0\x4d\xc1\xf3\x49\xc1\x9a\x7e\xb7\x61\x28\xbe\xb8\x48\x20\x9b\x1a\x16\xc8\x2e\x3a\x21\x4d\xea\xfb\xa3\xdd\x6b\xdb\x65\x2f\xee\x28\x74\x07\x30\x48\xf3\x2a\xf0\x34\x02\xc1\x45\x16\x0a\xd8\x41\xd4\x5e\x22\x38\x12\x1b\xb5\x68\x4a\x4d\x9c\xde\xbe\xe4\x10\xa6\x75\xa4\x07\x6a\x80\x7f\x35\x4b\x88\x47\x64\xfe\x5f\x9b\xca\x2c\x75\x6d\xb3\xa8\xb5\x86\xfb\x55\xf8\x00\xb7\x97\x43\x32\xd8\x2a\x87\x16\x8f\x66\xb3\x31\x55\xdd\x94\xee\x5c\x2c\x8c\xad\x33\x3a\xdb\xb6\x6e\xaa\x39\xac\x45\x6d\xa2\xba\xc7\x45\xad\xef\xa1\x55\xc2\xb1\x48\xf1\x13\x88\x0d\xd9\x54\x66\xa1\x94\x3b\x99\x88\x6a\xd7\x35\xdc\x6d\x86\x05\x24\x3b\xe0\x0c\xc7\x28\xc7\xb1\x63\xa9\xc1\xe9\x55\x48\x99\x74\x36\x36\x3d\x83\xac\x45\x5b\x49\xe0\x24\x59\x1b\x5f\x5d\xbe\x91\x09\xce\x90\x45\xc2\x0f\xe2\x24\xa1\x7f\x03\xd6\xfc\x16\xf0\xad\x8b\x20\x02\x67\xb6\xa7\xc2\x14\x94\x13\x34\x50\x3d\x31\xcb\x93\x7a\xa5\x4e\xdc\xf5\xf6\x39\xe0\xe0\x04\xc9\x94\x8d\x25\x47\xf3\x90\x60\xca\x78\x20\x22\xe6\x24\xdf\xfa\x53\xd9\x9a\x4a\xa2\xee\x55\x05\xf2\x3f\x13\xa5\x09\xd0\x40\xe4\xb3\xc4\xb3\xec\x1f\x90\xab\xa5\x5a\xd4\xbe\x3b\x8e\xaa\xc1\x89\x1c\xf4\x57\xfc\x45\xb7\xd4\x17\xde\x05\x28\x57\x5e\xc9\xad\x8f\x60\x7f\x7d\x71\x20\xd6\x51\xa6\xd5\x81\xb3\x94\xcf\x50\xa2\xc9\x17\x0a\xf2\x3a\x40\xb3\x5e\x43\xd8\xcb\xf5\x36\x43\x3b\xac\x1b\x26\xd7\x7b\xd3\x8c\x75\x7f\xc9\x1d\x41\x25\xe0\x11\x4e\x32\xc5\x85\x76\x58\xc1\x72\x67\x0c\x80\x3e\x3f\x22\xc6\x05\x19\xd1\x09\x5a\x04\xa6\x6b\x68\x3a\x54\x47\x87\x19\x9b\x00\xe7\x72\x2d\xef\xe0\xd6\x51\x36\x73\xa3\x2a\x4b\xb8\x74\xb2\x69\x75\xc0\xc6\xff\xd0\x92\xf3\x8c\x94\x72\x4b\x09\x7c\xa6\xe8\x63\xc0\x88\x96\x12\xba\x63\xec\x01\x01\x20\xde\x95\xed\xd7\xbd\xb0\xa9\xa3\x80\xb0\xd7\x1d\x09\x47\xdf\x7a\x08\xc9\x7a\x1c\x46\xff\xfc\x31\xd7\x2b\x0d\xa3\x6c\x90\x5e\x88\xeb\x82\xda\x08\xdd\x18\x5f\x83\xf8\x76\x92\xb7\x80\x05\x91\x0b\x5d\x47\x26\x8e\x09\x8d\xe0\xb0\xe9\x0a\x67\x22\x60\x73\xc3\xe0\x7f\x80\xa8\x82\x5b\xc5\x13\x58\xc5\x3f\xfb\xb0\x7c\x9c\x3b\x8f\x5f\x1d\x02\xff\x1e\xd8\x03\x95\x6b\x15\x18\x52\xf7\xb2\x68\xa8\xdc\x09\xca\x20\xdd\xe5\xb5\x72\x09\xf9\x92\xd2\x70\x4b\xd8\x2a\x98\x01\xc8\x33\xc3\xeb\x36\x43\xc4\xcf\x82\x0a\x2f\xe3\xe9\x7b\xce\x54\x1a\x40\xff\x2a\x82\xe5\x87\x48\xd6\x72\x27\x54\x55\x61\x59\x71\xc4\xfd\xc4\x25\x9c\x3c\x27\xe0\xd2\xa9\x1a\xdf\x6b\x2b\xa5\x89\xea\xeb\x44\x17\x89\x0f\xb3\x2d\xa1\x5f\xda\x26\x98\x11\x3c\x98\x85\x29\x97\xfa\x8e\x42\x3a\x28\xc1\x92\x87\xaf\x95\xaa\xdb\x8f\x8b\x6f\x5c\x38\x4a\x2f\xd2\x8b\xe0\x17\x82\xae\x51\xd0\xba\x7c\x0e\x8a\xdd\x81\x45\xf2\x5f\x4f\xd8\xd4\x23\x75\x75\xc8\xdb\x4c\x12\x45\x4c\xda\x9f\x85\x49\x27\xa5\x40\xe9\x57\x93\x5e\x25\xe9\xce\x06\x96\xa3\xc8\x3f\x8e\xdc\x1b\xb3\xf5\x90\x9f\x70\xa1\x2a\x2a\xbc\x6f\x6a\x66\xe7\x65\x2b\x23\x52\xd5\x78\xda\xa3\x76\x11\x71\x6e\x20\xd2\xe3\x40\x7b\xee\x7d\x6e\xb2\x9d\xb2\xb4\xb1\x6d\xab\x20\xbe\xc7\x77\x19\x88\x4b\xe7\xad\xd6\x2b\x55\x28\x67\x9f\x10\x19\x15\x36\xb3\x89\x46\x95\xbe\xbb\xcf\x86\x68\xad\x10\x8a\x52\xb6\x09\xe0\x04\xd5\xab\x16\x75\x07\x95\x5a\x7d\x02\x39\x4a\x48\x7c\x6c\x3d\xb3\xa4\xee\xe7\x2d\x6f\xb7\xe7\x3b\x11\xfa\x7d\x41\x85\xfc\x50\x88\x6a\xa1\x01\x98\xfb\x3f\xe1\x43\x63\x9f\xa6\x63\xd1\x77\x51\xca\x9b\xa6\xb2\x8d\x24\x13\x46\xac\xd5\xda\x54\xb2\xcc\x1b\x80\xa1\x52\x7e\x4b\x82\xc7\x38\x68\x1d\xf5\x07\x4e\x46\x0b\x0f\x16\xdd\xa4\x28\x66\xcd\x5c\x79\xad\x9d\x32\x41\x92\x05\x0a\xeb\xf4\x79\xea\x13\x70\xdf\x93\xa9\x01\x40\xee\xb6\xfa\xe8\x7b\x38\x1c\xc4\x03\x4f\x82\x54\x5b\xae\xd6\x92\x5a\x52\xf9\xaa\xe2\x67\xe2\x04\x80\xcc\xe3\xcb\x18\x9e\x72\xfa\x6c\x70\x8a\x76\x0c\xe7\x49\xe1\x19\xf3\x0a\x78\x0c\xdb\xe6\x3f\x39\xad\x31\x04\xd4\x63\xdf\x5a\xa7\x0a\x6a\xbf\xf7\x74\x89\x6a\x39\x48\x4e\x3c\xd4\x3b\x71\xf4\xfc\xd9\xb1\xc8\xe5\xce\x0a\x04\x68\x52\xf6\xd8\x9b\x4e\x96\xcc\xd4\xba\x5d\x02\x83\x50\x74\xe0\x15\x71\x97\xcd\xe7\x5c\x07\x61\x8e\x67\x62\x98\x44\x7c\x6d\xbb\x74\x25\x6a\x14\x45\x96\x05\xb4\x8b\x52\x15\x90\xf3\xb7\xc1\xa9\xd9\xfe\xde\x4c\xe1\x10\x84\xd6\x8b\x80\x59\xe5\x96\x54\x24\xa6\xbd\xe3\xcb\xa8\x60\x8f\xe5\xe7\xb1\x44\x32\x60\x0f\xe2\x1c\xfb\x73\xa4\x69\x2a\x5d\x71\x4d\x09\x2c\x1a\x3f\x5d\x97\x8f\xcf\x9f\x44\x3e\xb1\x3f\x3d\xa7\xe2\x44\xbc\x1f\xcf\xce\x47\x93\xc9\xf0\x72\x74\x75\xcb\x61\xbd\xd3\xd3\xc1\xa9\x18\xfd\xf5\xfc\x76\x06\xec\xb6\x40\xcc\xcb\xbf\xbb\x24\x1d\x72\x0d\x82\xdf\x5f\x7f\x77\xc3\x8a\x0e\x92\x3c\x57\x85\xc4\xe6\xfe\x91\x2b\x4b\xce\x65\x0b\x68\x90\xc8\x59\x59\xe3\xea\x73\xaf\x5e\x59\x86\x73\x8c\x08\xec\xb5\xfc\x9b\x6a\xd0\x1b\x75\x9e\x98\xfb\xc5\x5b\x93\xa3\x36\x71\x12\x1e\x5a\x0f\x82\x15\x99\x51\x6b\x40\x4b\x16\xbf\x33\x27\x18\x16\x4e\xc0\xeb\x58\xa1\x07\x4e\x26\xa0\x0d\xd4\x0b\x30\x77\x2b\x51\xbb\x7f\x7b\x28\x1f\x7c\xb0\x54\x35\xb4\x99\xca\xf8\x6f\x00\x94\x2e\x76\x16\x38\x3d\x19\x75\x2f\xc5\xbd\xae\x1a\x8a\x8f\x7f\xcc\xf0\x65\xf7\xe4\x42\xcc\x77\x14\xeb\x5f\x53\x07\x29\x77\x24\x6b\xe8\x76\x00\x66\x0e\x36\x4a\x90\xb6\x06\x07\x75\x0b\x44\x96\x68\x15\x67\x42\xc9\xaa\x5e\xfd\xbd\x91\x1f\xdd\xa7\x97\xda\x2d\x06\xe0\xc9\x2d\x06\x06\xdc\x01\x06\x9c\x8d\x93\xda\x72\x0e\x09\xd2\x4a\x39\xaf\x76\xeb\x0c\x34\x55\xfb\x1a\xb9\xd3\x53\x77\x95\xca\x9d\xdf\xa4\xf9\x4e\xc4\xbb\x0c\x48\xff\x18\x1a\x68\x16\x0b\x49\x6f\x01\x3a\xf8\x7b\xf3\x51\xa5\x1f\x58\xb6\xc3\x4d\x78\xfc\xd8\xaf\x6d\xfa\x63\xc6\x73\x0c\xba\x57\x9b\x4a\xd5\x18\x49\x41\x40\x83\x14\x5b\xa9\xef\xb1\x8d\x05\x47\xe6\x2b\x74\xfa\xf0\x18\x92\x08\xf3\x20\x48\x1a\x12\x44\x4c\xfd\x20\x8e\xec\x71\x54\xc6\x47\x34\xe7\x38\xfd\xe7\xad\x12\x90\x85\x1b\x4f\x61\xd9\x13\xc3\x8e\x17\x89\xc1\xa0\xee\xb5\x71\x9b\xca\x5f\x01\x9a\x15\xea\x69\xc9\xed\x82\x2b\x61\x2a\x59\x64\x89\xea\xe3\xc0\x07\x8a\x38\x4f\xf1\x8e\x0d\x70\xb1\x0c\x2f\xe3\xab\x4b\xfa\x9e\xf4\x01\xe4\x91\x83\xeb\x15\xf2\x46\xfc\x78\x98\x2d\x3f\x9f\xba\x2f\xf8\xb8\x31\x3d\x1b\xb4\x58\xa8\xf6\xf5\x09\x9f\xa8\xf5\xf5\x03\x12\x24\x8a\x0d\x06\x18\x8c\xed\x9d\x23\xb5\x67\x45\xff\x0a\x42\x69\xba\x84\xd5\x61\x27\x97\xba\xe8\xe1\xae\xea\x4a\xe4\x4d\xb1\x8b\xe5\xb2\xf7\xdc\x90\x95\x2c\xda\xb0\x17\xa9\x7a\x23\x18\xd0\xc3\x07\x10\x7b\xbb\x23\x47\xe8\xb2\xd0\x8b\xda\x53\x67\x40\xb1\x1d\x36\x07\x6b\x80\xc7\x32\xca\xe4\x49\x8c\xad\x15\xea\x4e\x43\x49\xf8\xbd\x5b\xa1\x4f\xce\x8a\x75\x4b\xbb\xe7\xb7\xde\x04\x53\xf7\x52\x17\x21\x84\xcc\xab\x83\xbf\xa6\x7e\x32\x2a\x22\x11\x91\x6b\x55\xe6\x18\x7f\xf4\xe0\x7c\x10\xf3\x44\x90\x74\xe8\xa5\x03\x31\x74\x0e\x0b\x1b\xd3\x3c\xf9\x44\xc1\x04\x55\x1a\x87\xfc\xa9\x31\x14\x77\x3a\x0a\xdf\xee\x29\xfc\x61\x29\x4f\x8d\xd3\xb6\x2b\x59\x5b\x83\x6a\xb1\xed\xc2\xa7\x8a\x2e\x6a\x00\x85\x61\x17\x7a\x6b\xb4\xb3\x2f\xc5\x64\x78\xf9\xf6\x76\xf8\xb6\xbf\x62\x4c\x13\x49\x21\x6a\x3f\x80\x99\x11\xd5\x9f\x5b\xdf\x51\x79\x07\x7d\x54\x00\x2e\xed\x7e\x17\x88\x48\xaa\x50\xa0\xd9\xd4\x2b\xc8\x31\xa6\xca\xf0\x4c\x9c\x88\xcb\xd1\x2f\xe2\xe7\xd1\x14\x12\xaa\xcc\x2b\x1e\x28\x1f\x69\x8c\x67\x83\x53\x90\x96\x18\x8c\xe8\x01\x02\x36\xc4\xad\xd4\xc6\x83\xc4\x19\xcc\x3e\x88\xe1\xe9\xd9\xe0\x4c\xcc\x78\xcb\x3d\x8d\xa3\x3b\xb9\xbe\xff\xd6\x96\x80\xcf\x5d\xa4\x93\xf6\xb5\x50\x14\x0b\x73\xba\x94\xd3\x2b\x31\x61\x47\xdd\x65\x13\xf4\x14\xca\xd8\xfb\x8c\xe9\xc4\x62\x6c\x3b\x60\xd5\xc8\xe8\xe3\x76\x35\xcd\x26\x07\xfc\xfd\x9e\x56\x35\xd1\x89\x01\xc3\x93\xae\x9a\x4f\x7d\x70\x97\x17\x2c\x6e\xee\xa3\x8f\xa1\x2e\x42\xbe\xbf\x0c\xf6\xe2\x43\x72\x28\xd0\x01\x30\xa1\xa4\x0e\x3c\x5a\xcc\xe7\xb0\x4d\xb3\xbe\x46\x56\xff\x3f\x7b\xef\xb6\xdc\x46\x92\xa6\x09\xee\xb5\x9e\xc2\x8d\x6b\x33\x22\x6c\x83\x10\x0f\x92\xb2\x52\x39\xb6\xb6\x10\x09\x49\xa8\x82\x00\x16\x00\xa6\x52\xbd\xbb\x66\xed\x40\x38\x48\x4f\x05\x22\x90\xe1\x11\xa4\xd0\x57\xf3\x0e\xf3\x02\x6d\x6b\x7b\xd1\xea\x79\x82\xb5\xbe\x2b\xda\xbe\xc8\x3c\xc9\x9a\xff\x07\x3f\x44\x04\x48\x65\x55\x65\x56\xd7\x76\xf2\x22\x93\x22\x10\x1e\x7e\xfc\xfd\x3f\x7e\x1f\x27\x76\xa1\x12\xdf\xc8\xbd\x89\xb1\x8e\x78\x0a\xc3\xab\x63\x0f\xe0\x4a\x57\x22\xcf\x20\xa4\xff\x93\x9d\x75\xe4\x0f\xa6\x24\x39\x9f\x51\xff\xac\xff\x5c\xfc\x97\xff\x99\xdd\x0b\x60\xce\x50\x5e\x87\xdb\xc3\x67\xe2\x48\xbc\x9d\x7e\x3f\x9c\x4d\x46\x93\xb7\x40\x96\x30\x98\x5c\x88\xdf\x5f\xcd\x46\xf3\x8b\xd1\x79\x68\x21\x70\x19\x73\xb4\x7f\x42\xe0\x3b\x0f\xa0\x89\x16\x96\xbb\xb8\xae\x29\x52\xa6\xf2\x54\xc9\x5b\xd4\x6e\x8d\x52\x9f\x40\x13\xdb\x90\xc4\x34\x45\xe6\xd2\x7a\xc9\x89\xee\xaf\x4a\x52\xb0\xb7\x74\xb7\x91\xda\x67\xcd\x73\xc8\x68\xe1\x3b\xb1\x23\x08\xd1\x3e\x32\x67\xfd\x53\xf1\x46\xea\x0c\xaf\x94\x8e\x0e\x30\x66\xdf\x5d\x21\x0e\x4f\x7b\x62\x53\xe4\xd5\x8d\xb1\x47\x8c\x1d\xe0\xba\x0c\x6a\xad\x13\xaa\x7c\x85\x8b\x4b\x6d\x54\x79\xad\xf2\xd5\x2e\x32\xc5\x81\xe4\x92\x85\x75\xc2\x99\x41\x7b\x46\x17\x38\x5c\xb1\x56\x8f\x17\x19\xa1\x1f\xcf\x8b\xba\xac\x5c\xbd\xf8\x8f\x75\xa9\x0d\xb1\x7d\x27\x7c\x52\x11\xcb\x5b\x67\xfa\xda\x2e\x12\xa8\x3b\x7d\x71\xc2\xc8\x55\x60\x05\xa3\xd3\xe2\x5c\x1d\xca\x9e\x38\x3f\xcc\x4b\xd3\x13\xa3\xc3\xbc\xd4\xb2\x27\xc6\x87\xc5\xb5\x5e\x69\x95\xd9\x5f\xf5\xb2\x54\xbd\x5f\x19\x4d\xf9\xef\xef\xa7\xff\x6c\xac\xc7\xfa\x8f\x47\xb3\x6d\x56\x9b\xa3\x93\x5f\x04\x04\xfa\x61\xfc\xe7\xd3\xe3\xd3\x97\x2f\x1b\xf8\xcf\x67\x67\x27\xc7\xbf\xe1\x3f\xff\x1a\x3f\x70\x17\xae\x90\xcc\xca\xca\x23\xf1\xc7\xfa\xfe\xcb\x52\xad\xc4\xff\xf8\xaf\xff\x4d\xcc\xee\xbf\xac\xb4\x95\x06\xba\xba\xff\x02\x8e\x7d\x25\x0e\x69\xbf\xfc\x2f\x3d\x07\x0a\x7d\xd2\x3f\x79\x82\x09\x56\x97\xe5\xfd\x17\xb9\x59\xd6\x99\x7a\x02\xe8\xb4\x15\x27\x11\xaf\x94\x30\x4f\x41\xc7\xfc\xa9\x56\xe2\xfe\x9f\x45\x55\xd4\x95\xc8\xe8\xb8\xba\x0b\xe6\xfe\x8b\x48\x8b\xbc\x12\x56\x63\xd2\x55\x9d\x49\x8d\x9d\x4a\xcb\x42\x57\x22\x7d\x2a\xeb\x4a\xd5\x56\xd7\xb3\x1d\x33\x4a\xfc\x54\x3f\xd5\x80\xe4\x2a\x4c\xfd\x23\x61\xfc\x5a\x6d\x5e\x19\x82\xc2\xfd\x0b\x86\x27\x0e\x57\xfa\x48\x6e\xcb\xfb\x7f\x81\x14\x07\x95\xdd\x7f\x81\x26\xff\xf4\xdf\xff\xf4\xcf\x34\xa6\x3f\xfd\xf3\x9f\xfe\x0d\x43\x1a\xa7\x7d\x71\x71\xff\x65\xad\x73\xb4\x1e\xec\x9f\x2e\x64\x6e\xec\xf7\x6d\x67\xad\x56\xef\x66\x22\xb1\xe3\xdf\x14\x3a\x37\xc2\x4e\x46\xa6\x90\x7d\xf3\xb3\xd5\x11\x9e\xea\x3c\x85\x29\xaa\xc1\x59\x64\x80\x83\xee\xfe\x4b\xc9\x15\xe8\x0a\xc8\x19\xad\xe5\x0d\x99\x6d\x7f\xfa\xef\x60\xfa\xdc\x7f\x49\x65\x5e\x89\x3f\xfd\x9b\x78\xf5\xd8\xd4\x99\xda\xaa\xd1\x6e\xe6\x13\x01\xcc\xa1\x56\x5f\x43\x05\x2f\x57\x22\xbd\xff\x37\xb6\xcf\x8b\x52\x1b\x3b\xec\xad\x2c\xc5\xca\xaa\x94\x65\xae\x55\x69\xfb\x8f\x45\x69\xaa\xec\x1c\xe1\x77\xbe\x6f\xa4\x37\xd4\xe5\x57\xf5\xae\xdd\x99\x07\x3b\x61\x8a\x7a\xa3\xaa\xca\x9a\x2f\x75\x38\x11\x75\xae\x22\xd2\xcf\xbe\xb8\xca\xe3\xce\xc0\x2e\x33\x32\xfa\x96\x40\xc2\x00\x64\x7b\xb3\x2f\x94\xb5\xdf\xa1\xf6\x33\x2c\x2d\xbc\xff\x52\xde\x7f\xc1\x90\x8e\x5d\xa5\xe0\xb5\x2a\x27\x9f\xa6\xdd\x7c\x8d\xc6\x5b\x53\x62\x5f\x08\x53\x12\x9f\x04\x66\xa3\x84\x85\xc1\x0a\x40\xd8\xca\xcd\xcf\x61\xec\xda\x08\x55\x89\x54\x99\x4a\xe7\xf7\x5f\xec\x8c\xdc\xff\x6b\x55\xaa\x60\x10\x22\x85\x5d\xe8\x1b\xe0\x7e\x44\x6e\x7a\x5e\x9a\xb5\xb4\x8b\x61\x77\xc0\x97\x4c\xdf\x96\x90\xcd\x4b\x8a\xbc\x5d\xac\x66\x1b\xb8\xda\xfa\xfe\x8b\x1f\x48\xb0\x72\x3f\xd5\x1a\xc2\xcf\xf7\xff\x02\x59\x25\x1d\xed\xd8\xce\xdb\x6f\x01\x2c\x8a\x3d\x08\x06\xf7\x83\xe1\x49\xbd\xff\x02\xd5\xf8\x76\x8f\x35\x76\x96\x6b\x02\xde\x6c\x5b\xff\x7f\xff\x5b\x7d\x8b\x25\xb8\xd5\xfd\x97\x6b\xde\x2f\x99\x6a\x6c\xb1\x44\x40\xec\xc6\x4a\x8e\x3a\xf7\xec\x16\x22\x7d\x8a\x8c\x3e\xb0\x3b\x14\xec\x8d\x06\x1c\xe1\xb6\xb0\x47\x47\xfe\x54\xc3\xf3\x8f\x6c\x64\xc9\x32\xea\xfe\x8b\x7d\x15\x3c\xe2\xc4\x94\xb5\x95\x9a\x82\x6a\xef\x19\xf2\x32\xf2\xfe\x4b\xa9\x6f\xc3\xc9\xee\xd8\x15\x56\xfe\x66\xf0\x56\x3b\xfa\x3a\xf7\x6b\x94\xd8\xa3\x54\x2a\x16\x39\xfe\xd1\x1a\xbe\xc6\xff\x44\xd3\xc9\x7e\x1d\xd6\xaf\x2c\xd2\x5a\x57\x02\xa8\xe3\xf9\x1f\x99\xc4\xdc\x1d\x90\x9a\xf0\xb8\xe2\x9d\xaa\x37\xdb\xa2\xac\xa4\x1d\x46\xd7\x7e\x69\xbe\x24\xdc\x37\x91\x63\xa6\xd9\x79\x98\x24\xbb\x60\x29\xe0\xbd\xad\x6e\x34\x62\x42\x23\x00\x75\x1d\x8d\xc6\x9a\x4b\xe0\xf5\xa8\x2b\x91\x17\xf5\xad\x92\x35\x3f\xc2\x4f\xd8\xa1\xf1\x19\xe9\x98\x8d\xce\xe1\xa8\x40\xf6\x80\xc8\x3f\xeb\xbb\xdb\x25\x6d\xee\xb2\x27\x88\x00\x69\x04\xac\xaa\x35\x2f\xa1\x7c\x3a\x5c\x70\x77\x19\xa0\xfc\x67\x19\x42\x72\x15\x64\x8f\x1b\x7d\x9d\xfb\x6b\x34\x67\xd6\x58\xc0\xd8\x50\x15\x30\x99\x40\x17\x4a\x95\xaa\x5b\x74\x2d\x66\x76\xed\xec\xdb\x2a\xdb\x7b\x91\x3e\xc5\x23\x56\x86\x67\xcc\xd4\xfa\x16\x40\x55\x1a\x57\x02\xa7\x4c\x9f\x88\x4b\x58\xf0\x52\x85\xcb\x5f\xaa\xaf\x5b\x7f\xce\x83\x3e\x15\xc3\xcf\xf7\x5f\x56\x00\x82\x4c\xcd\xd0\x46\x2f\xbf\x72\x23\x29\x22\x12\x5d\x71\x93\x67\x08\x60\xf6\xb5\x0d\xf4\xdb\xaa\x88\x3d\x89\x38\xd1\x56\x4e\x18\x10\x91\x90\x16\x67\x97\xa8\xd4\xf6\xc6\x91\x99\x42\x31\xe0\x3f\x83\x9c\xdd\xcd\x16\x1d\x73\x63\x9c\x52\xbd\x22\xea\x09\x90\xc3\x62\xe5\xa7\xd7\x2b\x25\xf7\xff\x6c\x3b\x1a\x09\x5c\x12\x4d\xc1\xba\xa7\x35\x95\xa2\xb5\xf6\xb4\xdd\x21\x56\xe8\x88\xd4\xee\x30\x14\xf0\xc6\xee\x2d\x3b\x5a\x6b\x32\xaa\x78\xa9\x21\x2b\xdf\xea\x32\x25\x6c\xba\x08\x37\xa1\x2f\xc6\xd1\x5b\xb7\xaa\xb6\xf7\xbc\x31\xda\xf5\x4f\x45\x9b\x81\x0b\x29\xaf\xed\xfd\x92\x3e\xad\xa1\x62\x68\x8d\xfb\x2d\x7e\x62\x6f\xef\x61\x0a\xd7\xa5\xe4\x14\x8e\xfb\x2f\x20\x54\x75\xa9\x0c\xc9\x24\xd4\x83\x56\xaa\xfe\x2c\xec\xd7\x8a\x9c\x70\x1a\xe5\x1a\xa8\x77\x79\x78\x25\x9d\x9b\x5b\xfc\x52\x63\xca\xfa\xb4\xc6\xd4\x3d\x3f\x57\xe0\x72\xb3\x8d\xe4\x4e\x37\x48\x6b\xb8\xdf\x83\x97\xc1\x9a\x3e\xef\x8b\x8b\x60\x95\x60\x99\x55\x70\x0c\x61\xb6\x82\x51\xa7\xe0\x79\x46\xca\xfc\x70\xc4\x76\x9e\x3a\x84\x5d\x51\x3b\x19\x9e\xe0\x0a\x06\xd2\x81\xc3\xeb\x74\x46\xc3\xc2\x7e\x3c\xa7\xca\x08\x7f\x32\xc7\xc1\x0a\x05\x43\x6d\x2e\x96\xbd\x59\x37\x5b\xba\xa3\xec\x0c\x57\x8d\xfb\x05\x0e\xe8\x5c\xc7\x2b\x2e\xee\xbf\xd8\xf3\xe4\x6f\x82\x2c\x9c\x04\x78\x9d\xca\xad\xae\x80\x0b\xb2\x61\x60\x76\x3b\xc9\xe5\xfd\x17\x54\x57\xed\x2e\xb0\x0b\xbf\xba\x91\xab\xa6\xdc\xe6\x96\x0d\x29\xfb\x92\x92\x5c\x68\xa1\x61\x89\xf0\x96\xa6\xb6\xfd\xc9\x1f\x2b\x63\xbb\x67\x55\xe4\x0a\x7c\x71\x35\x7f\xc7\xd8\x1e\x19\xbb\xc2\xf7\x5f\x2a\x09\x5a\x11\x1f\x45\x7f\xf7\xc3\x81\x90\xe5\x4f\x35\x8a\x61\xca\xcb\x51\xf8\xc1\xb5\x2c\x65\x5e\x21\x2a\x0b\xdf\xca\xb2\xb2\x12\xbf\x02\x85\x0f\x42\x0c\x12\xad\x13\x37\x5b\x39\xec\x35\x70\xcb\x6f\xa5\xa1\x75\xe0\x01\x62\x53\x76\xd7\x97\x7a\x63\xff\xd9\x50\xfd\x57\x0f\x8c\x26\xb7\x1b\x5b\x83\xab\x2a\xf7\xce\x79\x63\x1b\x78\x6c\x77\xd9\x69\xcd\xef\xbf\xd0\x9e\x3e\xe9\xc7\x86\x0e\x88\xc3\x1b\xab\xc7\x88\x75\xa1\x9d\x0d\x12\xac\x30\xef\xf0\xd8\x50\x88\xe5\x15\x1e\x33\x59\x0b\x50\x73\xb6\xda\x9e\x2e\x5d\xb2\xa2\x97\xaf\x10\xb8\xb1\x79\xb7\x08\xa3\xb2\x22\x87\x1d\xfe\xb0\xf6\xd3\x8f\x4f\x1e\x6c\x3a\xfb\x4a\x5d\xb6\xde\xf0\x95\x2d\xa2\xfe\x16\xab\x4d\x9d\x93\x87\x36\xa5\x9b\x84\xfe\x9f\x3b\x5f\xdd\x5a\x55\x43\xdd\xf2\x02\x21\xb0\x6c\x60\xb4\xd2\x98\x7a\x63\xa5\xc1\x53\x9f\xaa\x60\x2f\xf2\x7c\xbf\xdc\x4d\x68\xec\x1b\x99\xeb\xfb\x7f\x29\xf1\x38\xde\xd6\xb0\x4c\x55\x59\x68\xa3\xef\xff\x65\xa3\x84\xcc\xac\xb5\x20\x51\xa7\x92\x0e\x3c\x0e\x77\xcb\x69\x5f\x9c\x07\x3e\x57\xdc\x2e\x6c\xca\x6e\x14\x38\xe9\x8b\xfb\xff\x27\x9e\x01\x53\xd4\x37\x12\xae\x48\xdf\xb5\x47\x37\xe9\xaa\xd8\x2c\xd9\x6c\x09\xbf\x6c\x07\x6e\x95\x64\x8d\x1f\xf8\x05\xf4\xa9\x66\x89\xd8\xd8\xeb\x04\xa4\x87\x86\x33\x68\x54\x69\x6d\x17\x7b\x04\x7d\xca\xeb\x53\x95\x37\xc4\x2a\x6e\x91\xce\xbd\x9c\x80\xa2\x91\xd5\xed\x0d\xe4\x37\x5b\xf2\x35\x9b\x2f\x92\xb2\x41\xa7\x61\x82\xaf\x42\xa5\x16\x6c\x1f\x00\x8a\x64\x43\x82\x14\xbb\xf5\xe3\x86\xfb\xd7\x4c\x93\x9d\x18\xb8\xb3\xb6\x80\x3a\x80\xdb\x41\x66\x85\x2e\x7d\x3f\x61\xec\x7d\x31\xca\xec\xf0\x6d\x67\x52\x25\x36\xf7\xff\xba\x09\xce\x8b\x22\xcb\xe1\x21\x07\x01\x1a\xe3\xe6\x88\x06\xa7\x4a\x56\x71\x7e\xa9\xb1\x21\xcf\x7e\x6c\x94\x2b\x67\x95\x77\xce\x06\x8e\x85\x3f\x40\xb5\x59\x6e\xb7\x65\x51\xdf\xda\x67\x8b\x1a\x28\x68\x50\x70\xb3\xd9\xb9\x17\x74\xb7\xa8\x45\xf6\x74\xba\x55\x0e\xd2\x06\x6b\x5c\x2b\xc0\x81\x65\x1f\x56\xae\xc1\xfa\xb0\xb7\x7b\xe4\x6a\x42\x67\xc2\x66\x2b\x11\x29\xf6\xfe\x9f\xc5\x4a\x59\x95\x7d\x8f\xe8\x22\x1d\x0a\xfa\x0f\x22\x88\x6f\x19\x9d\xa7\x76\xe3\xe6\x45\x65\x6d\xd8\xbc\xf2\x0a\xc2\x79\xb1\xd9\xb4\x91\x7e\xbd\xc3\xee\x58\x1c\x9e\x5f\x8e\x8f\x4e\xfa\xc7\x3d\xa7\x07\x40\x49\x1c\xdc\x9c\x6e\x92\x42\xcf\x03\x4e\x18\x7a\xe2\x93\x88\x99\xf4\xd0\x53\x08\xf6\xdc\x4d\x3d\x5c\x65\x7a\x6b\x54\xb3\x0b\x47\xe2\x16\x5f\x3f\x8c\x5f\xff\xfc\x61\x90\xe2\x24\x42\x29\x3e\x84\xfa\xf3\xdb\xbe\xfd\x07\x37\xf0\xe2\x21\x50\x68\x47\x5f\x27\x0e\xa9\xd4\xfc\xf6\x94\x1f\x7c\xf9\x35\x0f\x9e\xf9\x07\xcf\xe0\xc1\x17\xfd\x18\x0b\xac\xc3\xe2\x03\x6d\x19\x1c\x76\x24\x19\x75\xbe\xaa\x00\x6c\x95\x2a\x1c\xbc\x3d\x80\xce\x1c\xc5\x76\x6f\xe4\xaa\x8a\x5d\x5b\x70\x2a\x21\x13\x1b\xfa\xd5\x74\xef\x80\x20\x74\xcd\xc5\x5e\x86\x48\x30\xc1\xf9\x79\xd9\x17\xef\xdb\xda\x10\xe8\xbd\xd2\x1b\x9c\x4f\xbd\x4d\xba\x02\x0b\x4b\x95\x0c\x42\xc7\x39\xd0\x78\xdd\xfc\xe4\xad\x4e\x90\xc6\xe9\xd3\xba\xd2\x99\x36\x24\x7c\x3b\x14\x2f\xd4\xe1\x79\x70\xa1\x8b\x62\x05\xfa\x1f\xe4\xfb\x9a\x86\x81\x83\x35\xb3\x6b\xcd\xce\xc7\xe2\x96\x2a\x04\x03\x25\x1c\x86\xf7\x4d\x5f\xbc\x65\x9d\x0e\xd6\x47\xd6\x6b\x56\xb0\x70\x8e\x25\xe4\x11\x35\x2c\xb1\xae\xeb\x1c\x4f\x20\x4d\x00\x2b\x8a\x09\x4c\x70\xa9\x0d\x0c\x4b\x55\x62\x6b\xef\xb6\xcc\xd0\xcd\xba\xfa\xa9\xb6\xaa\x70\x5d\xd2\xb9\x6e\xf9\xbf\x12\xfb\x8c\x3b\xde\x56\xe8\x95\xaa\x6c\x39\x68\xb6\xb5\x36\x06\x24\xc8\xb6\xb0\xe7\x9d\xee\xcb\xa5\x32\x45\x90\x85\xae\xd1\xbe\xa6\x2f\x5b\x05\x10\xef\x60\xbb\x1d\xeb\xcc\x2a\xc4\xd6\x86\x5c\x15\xf9\x4f\xa4\xd2\xcc\xd1\xb2\x55\x2d\x43\x14\xb6\xad\xff\xb2\xd3\x26\x12\x51\x6a\x95\x8b\xfc\xa9\xda\x6c\xef\xff\x75\x75\xa3\x1a\x1e\x9a\xa7\xa4\x9f\xd9\x3b\xfe\x29\x08\xfb\x52\x75\xe8\xd5\xa8\x0f\x17\x25\x06\x35\x7f\xd7\x17\x33\x2c\xce\x90\x81\xbe\x11\xe9\x7e\x56\x58\x96\xfc\x9d\x0c\xcd\x70\xab\xc5\x59\x31\xf9\x63\x9d\x02\x3a\x0f\x0d\x32\x47\xe1\xe5\x4d\xf3\xc0\x08\x60\x7b\xbf\xe9\x51\xec\xd3\x0b\x83\x29\xb0\xfa\x84\xac\x61\x0b\xa3\xa4\xad\x54\x5e\xc7\x7d\xa8\xc3\xd7\x9b\x7a\xa9\xf9\xbe\xf3\xfd\x46\xff\x2d\x3a\x7e\x34\x24\xb4\xc1\xd9\xb5\x33\x0b\x1b\x1c\x12\x46\x70\xab\x5b\x4d\x1f\x8c\xaa\xcc\xce\xb0\xbc\x55\xab\xa0\x83\xe0\xe3\xf1\xe3\xb0\x87\x6c\x27\x4c\x91\x7b\x17\x06\x7a\x24\xbe\x05\x3d\xdf\xe8\x4c\x4b\x67\xbd\x76\xe9\xc1\x30\x9f\xf8\x45\x7b\xd1\x59\xab\x2d\x53\xd6\xd0\xc6\x3b\xf9\xfe\x5f\x58\xc5\x7d\xf0\x95\x68\x9f\x90\xd5\x03\xf3\x6d\xff\x48\x54\x93\x68\xe2\x87\xe2\x27\x68\xc2\x54\x7a\x5b\x67\xdc\xeb\x05\x5f\x6a\x89\x30\x60\x87\xa6\xf7\x5f\xd6\xb2\xae\xe8\x8e\x2c\x4b\x7d\xcd\x5e\x6c\x6b\x46\xde\x7f\xc9\x24\xdc\x93\x67\xc7\xe2\xc7\xa2\x2e\x0d\xb9\xda\xb7\x18\x4e\x87\x65\xcc\xa5\x36\x06\x04\x02\xad\xb4\x53\x5c\x54\xce\xcd\x27\xe8\x7b\xb6\x9a\xbe\x79\x2a\xaf\x75\x85\x4b\xaa\x36\xa0\x7f\xf3\x77\xc2\x45\x88\x5c\x46\xa9\x62\xd7\x22\x72\xf8\x39\xd3\x82\x7b\x6f\xea\xa5\xb9\xff\x02\x99\x0f\x2c\x5f\x60\x15\xa8\xf2\x15\xa3\x4a\x91\xf0\x83\x37\xe4\xf7\x5f\x20\xd4\x6e\xf5\x25\xf0\x7e\xc0\x4a\xf8\x5e\xc0\x3e\xd9\xdb\x8d\x93\xe3\xbe\xbb\xb0\x22\x27\x23\x6d\x71\x62\x8b\x4c\x83\x7a\x69\x2b\x3e\xe4\x35\x98\xe2\x2e\x36\x96\x08\x40\x28\xdf\x81\x73\x10\xb7\x69\x3b\x2e\x43\x56\x92\xdd\x47\xd7\xb9\x4a\xac\x9e\x09\x46\x70\xaa\xd7\x6b\xe0\x72\xb3\xfb\xde\x65\xb6\x58\xc5\x13\x14\x45\xb4\x71\xbd\x79\xdc\xba\x96\xd8\xd4\xe2\xeb\xbe\x54\x2b\x75\x5b\x4a\xbb\xf8\x79\xbd\xb9\xff\x52\x16\xa2\xce\xad\xc1\xdc\x17\x73\x1d\xd9\x0d\xa0\xbc\xde\x7f\xf9\x91\xe2\x42\x90\xa8\xe4\xaf\x3f\x90\x6a\xdc\xa8\xd9\x5a\x75\x0c\x58\x31\x13\xb1\x7a\x0a\xae\x3a\x55\x53\x92\x20\xf6\x87\xbf\x6a\x37\xae\x95\x92\x12\x0e\x04\x43\x32\xa2\x4b\x6f\xbf\x04\x09\xfc\x6a\xab\x1b\x6b\x78\x95\xb4\x37\xed\x17\x54\x19\x2f\x69\x0d\xb6\x15\xbf\x50\xae\x2a\x8c\x30\xb8\x39\xe7\x4f\xea\xac\xb2\xf7\x0b\x25\x02\xd7\xe0\x13\x5c\x49\x13\x4b\x1d\x78\x33\xbf\x13\xda\xa6\x80\x05\xb7\x12\xbc\x3a\x23\xfb\xc3\x6d\x28\xdc\x45\x27\x7d\x71\xa1\xed\xd7\xf7\x9b\x7e\x8d\x6d\x5b\xe7\x62\xa3\x73\x6d\x2a\xbc\x27\xea\x5c\x14\xe5\xb5\xcc\xb5\x81\x34\x4f\x04\xfa\x24\xef\x2c\xef\x9f\x4d\x51\xca\x2c\xf0\x9c\xe3\xd7\x12\xb1\x2a\xef\xbf\xd8\xed\x88\x79\x4a\x55\x4d\x2b\x97\x15\xa8\x1d\x3f\x1d\x18\xa3\x36\x4b\x88\xc5\xe6\xc4\x13\xaa\xa2\xbd\xdb\x38\xb3\xe5\xfd\x97\x6b\xdd\x88\x05\x85\xb9\x8e\x3e\x22\x8c\x84\xa2\x2b\x49\x0a\x4a\x5e\x29\xc3\xa1\x1f\x30\xf0\xac\x4e\x90\xdb\x2d\x15\x44\x91\x8d\x2a\x41\xa4\xa9\x3a\x43\xe4\xe5\xfb\x2f\x95\xab\x4d\xea\x94\xbe\xb0\x3e\x78\xab\xf8\xa0\x37\xf9\xa0\x03\xa7\x5f\xa4\x58\x99\x7e\x28\x26\xc3\x8d\xec\x4e\x52\xe8\x05\x8c\xda\x45\x47\xb1\xc8\x8b\x4d\x10\x4a\xa6\xf6\x44\xe8\xad\x93\xf5\xd7\xcb\x07\x45\x42\x4d\x1a\x71\xff\x65\x75\x73\xff\x05\x94\x37\x27\x35\x38\x13\x3d\xe8\x53\xa9\x2a\x6d\x2d\xb4\xb6\x8a\xf7\x95\xaa\x9d\x8a\x0e\xdc\xdf\x3a\x6b\xe2\xff\x3f\x3f\xfd\x67\x93\xe2\x4e\x2d\x7f\x29\xea\x77\xf8\x79\x38\xff\xe7\xf8\xf4\xe4\xf9\x69\x93\xff\xfd\xf8\xf8\xe4\xb7\xfc\x9f\x5f\xe3\x07\x56\x1f\xf9\x78\xb7\x3b\xcc\x7f\x3d\xf9\xf6\x77\xdf\x1e\x9d\x1e\x1f\x1f\x8b\xe5\x4e\x4c\x20\x27\x51\xcc\xe4\xc6\xa8\x1d\xe6\x5b\x53\x89\x17\x17\x64\xf7\x9f\xb8\x36\x7c\x46\xee\x72\xe7\x1b\xec\x8b\x91\xa3\xe9\x44\x31\x7f\x94\x02\x85\x72\x54\x16\x69\x6e\x64\xa9\x3c\xe4\x82\x67\xf6\x8c\x1a\x95\xe2\x1f\xff\xd1\x36\x9c\xa9\x75\xf5\xf4\x69\x50\x16\x90\x69\xca\x2c\x2f\x72\xa6\x09\x7a\x98\x36\x29\xe8\xb6\xbc\x95\x3a\xc3\x82\x1e\xa8\x8e\xa5\x7c\x6f\xa0\x38\x41\x5c\x28\x40\xe6\x07\x30\x4c\x4a\x03\xed\x8b\x8f\x56\x91\x91\xbb\x98\x02\x38\xc7\x26\x73\xca\xfa\xc6\x52\x62\x40\xf7\x70\xf5\xc5\xbb\xa2\x0e\x8b\x9d\x09\x42\x06\x5c\x48\x08\xf3\xcd\x70\x7f\xda\x88\xf3\xe9\xe5\x47\x44\xf0\x5e\xeb\x4c\xf9\x77\x52\xe5\x16\xbe\x0d\xea\x16\x4a\x25\x21\x42\x89\x54\x62\x54\xa7\x13\xbd\xb3\x54\xc0\xae\x4c\x1c\x01\xbc\xd6\x58\xa0\x96\x88\x65\x5d\x51\xad\x22\x20\x79\xd8\x97\x10\xd2\xc7\x4a\x66\x99\x4a\xe9\x5d\x5c\x13\xbc\xd9\xb9\xba\x0f\xd2\x6c\xfb\x4f\xb8\x73\x46\x41\x4a\x3c\x4c\xc4\x1a\x5e\x7d\xa7\xcd\x4d\x1f\x08\x40\xd5\x67\xb9\xd9\x66\x2a\x81\x3f\xbb\x2f\x4b\x71\x7e\x71\x34\x9b\xbe\x0f\x38\xdc\xe0\xf9\x46\x9b\x32\x1a\x5f\x13\x3c\x56\x36\xd0\x48\xed\x2a\xee\x0a\x30\xbe\xfd\x43\xd1\x6a\x27\x02\x59\x62\x03\xb0\x50\x46\x06\xc7\x3c\x5e\xbb\x95\xee\x6e\x0a\xb1\xac\x77\xa6\xab\x2d\xda\x1b\x45\xb9\xa1\xa5\xa9\x4d\x05\x39\xd6\xec\x22\x21\xcc\x18\x28\x61\x08\xfb\x86\xd5\x00\xb0\x4b\x21\x75\x9d\xd3\xd5\x3b\x11\x13\x3d\x1f\x69\xf0\x16\x80\x97\x10\xab\x4c\xc9\x12\x10\x94\x64\x85\x1d\x84\x8e\x01\x58\x04\x42\x19\x2d\xa5\xc1\x2a\x55\xbf\x57\x88\x1c\xb7\x7b\xef\x23\x3a\x7a\x7e\x1d\xbe\x4b\x66\xa6\x00\x4f\x0c\xb2\x11\xcb\x4a\x2c\xeb\x6b\x51\x2a\x6b\xc4\x03\x34\x98\x7f\x33\xa4\xfe\x42\xf0\x19\x52\x7f\x77\x45\xfd\xdb\x5d\xfd\xef\xfb\xa7\xff\x6c\x3a\xbe\x18\x5c\x1e\x9d\xf4\xcf\x7e\x31\x1d\xe0\xe1\xfb\xff\xe4\xec\xf4\xe4\x45\xeb\xfe\xff\xe6\xb7\xfc\xdf\x5f\xe5\x67\x71\xa3\xc4\x74\xab\x72\xbb\x09\x1a\xce\xef\x20\xbf\xf7\x2c\x11\x27\xdf\x88\xdf\xcb\xbc\x96\xe5\x4e\x9c\x7c\xfb\xed\xb7\x4f\xce\x03\x7d\xe1\xdb\xdf\x1d\xd9\xbf\x25\x22\x6a\x2d\xb8\x6b\x41\x6f\x98\xa1\xde\x30\x63\xbd\x41\x4c\x8a\x4a\xbd\x42\xb6\x14\x46\x1a\xd6\xa6\xcd\x87\x79\x30\x28\x2b\x20\x2e\xe3\x8e\x1d\x88\x06\x72\x8e\xab\x05\xbe\x54\x65\x26\x2e\x29\xa9\xcf\xde\x23\x63\x99\x5f\xd7\xd2\x8a\xb3\x81\x81\x02\x3c\xc8\x85\x21\x3f\x05\x56\x1a\x19\x2c\x3e\x4f\x18\x0e\x6b\x9b\xa9\x00\xfa\x98\x20\x0a\x40\xb0\xc9\xb4\xff\xe4\x72\x36\x1c\xbc\x7f\x3d\x1e\x3e\x59\x50\x65\x66\x5e\x39\x31\xcd\x09\x83\x50\x8d\x5d\x90\x8c\xae\x62\x40\xed\x10\xd8\x55\x8a\x4b\xb9\xfa\x24\xaf\x15\x17\x02\x83\x87\x38\xa5\x12\x5e\x87\x4c\xe1\x67\x9a\x20\x0c\x01\x15\x4f\xea\xdc\x2a\x0e\x1b\x6b\xac\x6d\x96\x19\xd7\x8d\x48\x9e\x2b\xf0\x6f\x17\x99\xaf\xc4\x27\xc8\x9d\x8d\xeb\xb1\xb5\x8a\xe1\xf5\xc0\x99\x9f\x29\x7b\x75\x71\x35\x0a\xb2\xb7\xc5\x5f\x8b\x4b\xa4\x98\xf1\xbd\x51\x3b\xce\x23\x02\xcc\xbf\x4d\x51\xaa\xa3\xa2\x3c\x82\xfa\x12\x04\xa1\x02\xc6\x55\x69\x6e\x30\xa5\x32\xab\x1b\xa4\x22\x50\x20\x88\x85\x76\x70\x29\xc5\xd9\x4b\x4f\x2e\x94\x4b\xb1\x7e\xf5\xe4\x80\xde\x75\x80\xe5\x26\xc6\x43\x9a\x01\x38\x07\x55\x25\x21\x3b\x6c\xb8\x5b\x48\x31\x6c\x4e\x2b\x81\x3e\xdb\xdd\x87\x05\x98\x38\x7c\x59\x75\x36\x88\x1a\x97\xbd\x4d\xcb\xa2\xbe\xbe\x81\x72\xc4\x5a\xc6\x34\x35\xfd\x27\x07\xf3\x4a\xe6\xa9\x2c\x53\xf6\xcb\x85\x7d\xc5\x42\x6d\x3f\x63\x6b\xe6\xa4\x43\xcd\x4b\xe5\x4e\x31\x80\x9a\x72\x07\x22\xe0\xd4\x05\x3b\xc7\xe0\xba\x89\x0b\xe2\xad\xba\xe5\xa1\x43\x9b\xc3\xec\x3f\x39\x68\xfe\xe9\xc0\x6e\xd8\xbb\x1b\xa8\x69\x04\xad\x5b\x6e\xb0\x75\x02\x22\xa5\x2f\x03\xde\x1a\xfd\xc3\x23\x52\xd2\xe6\xe8\x3f\x39\xf8\x58\xd4\xd0\xd2\xae\xa8\x13\x52\xfd\x9e\x96\xa0\xc9\xe6\x80\x87\x24\x97\x56\x75\xb4\x4d\x50\x21\xba\x4f\x89\x83\x5d\xa7\x0d\xcf\x45\xff\xc9\xc1\xcc\xef\x01\x7e\x62\xad\x14\xf5\x54\x56\xd0\x55\xab\x44\xae\x64\x2e\x7e\xac\x4d\x05\x48\x06\x0d\x86\xb6\x8d\x4a\xb5\x24\x6c\x33\x2e\x53\x84\xd0\x0f\x68\x79\x26\x41\x86\xc6\x62\x2d\xb6\xaa\xd8\x66\x50\x9e\x59\x64\xb7\x76\xba\x11\xa8\x46\x58\xc9\x75\xf8\x11\x34\x58\x0f\x7d\x17\xc2\x91\xf2\x9b\xb5\x2b\x67\x6b\xef\x2a\xab\x5a\x23\x66\xbf\x43\xdc\xdb\xe2\x90\xa9\xc0\xbe\x42\x56\x71\xdb\x27\x2c\x19\x45\x52\x1b\xaa\x15\xb3\x1a\xd8\x52\x11\xcc\xd2\x5a\xa9\x7e\xef\xc9\x81\xb5\x69\xb2\x9d\x18\xb0\xee\x76\xe0\xb8\x5e\x51\xa3\x5d\x23\x63\x03\x8e\xd3\x13\xdb\xe9\x4a\x6d\x1c\xda\xa4\x55\xe4\xaf\x6f\x10\x3d\x90\xe5\xcf\x5a\x01\xf3\x31\xce\x82\xdd\x00\x37\x32\x4f\x1d\x67\xb0\x7d\x1c\x6c\x39\x50\x08\x83\x37\x96\x0a\x33\x80\x3c\xd6\x2a\xbc\xa9\x65\x1d\xe9\xaa\x59\x3d\x18\xa1\x53\xaa\x1d\x78\x7b\x41\xf8\x13\x05\xe3\x49\x60\xf3\x20\x13\x53\x8a\x0a\xb6\xbc\x93\x3b\x71\xab\xca\xa5\xac\x00\xa5\x31\x04\xcb\x25\x4d\x1b\x50\x17\x18\x79\xa4\x71\x0c\x9d\xc8\xe6\xc3\xc7\x86\x0d\xf3\x59\xa2\x78\x8a\x0c\x8c\x1d\x44\xaf\x5c\xb1\x6b\x96\x71\xe3\x2e\xf9\xba\x69\x56\x61\x4d\x79\x80\x8d\xc6\x70\x2d\x0c\x58\x76\xea\x87\x87\x90\xfd\x56\xb1\x5e\xeb\xcf\x0a\x82\x45\xa5\xc3\x1f\x83\x3f\x41\x63\x58\xeb\x1c\x73\x61\xb5\x2e\x4c\xba\xc6\x2f\xd0\xc8\x06\xe2\x23\xfa\xa4\x25\x0c\xc4\xc0\xdf\x41\x81\x58\x21\xd1\x64\x27\x19\x6b\xfa\x4c\xe5\xf0\x9e\x90\x5e\x89\x48\x12\x9a\x13\xcb\x99\xd1\x3c\x2c\xe8\xef\x9d\x36\x8a\x6d\x56\xb0\x15\x3c\xf9\x46\xb0\x04\x64\x4e\xdd\xc9\x5d\xd7\xcc\xeb\xdc\xa8\xb2\xc2\x4a\xed\x8d\x06\x22\x3b\x02\x57\xd1\x39\xd6\xdb\xa2\xdd\x92\x82\x7c\x76\x74\x16\x37\x05\xa2\x52\x03\xfa\x1e\xc8\x0b\xfa\x16\x34\x6c\xbf\x9a\x30\xef\x7e\x73\xa9\x0b\x8f\x49\x3e\x9d\x0c\x5b\x4c\xb4\x9c\x6b\x21\x7b\x02\x10\x13\x70\x64\xf1\xca\x90\x08\x6d\xad\x47\x30\x2b\x54\x10\xbf\x11\xcd\x33\xed\x81\x3c\x96\x3b\xb1\x2d\x4c\xe5\x41\x71\x9b\x4c\x68\x57\x46\xe5\xaa\x22\x34\x10\x2b\x9d\x6e\x65\x06\xf5\xbc\x44\xa7\x55\x94\xd0\x45\x3e\xc7\xf1\xf3\x80\x60\xb4\x91\x3f\xda\xa7\xcb\xd5\x8d\x3d\x5c\x46\x57\xca\xbd\xbd\xae\x73\x55\xf5\xeb\xba\x9f\xab\x8a\x19\x71\x25\xa3\x7d\x74\xaa\x27\x80\x48\x81\x5e\x8c\xfd\x73\xd2\x7d\x22\x95\xbf\x01\x70\x76\x97\x3d\x47\xa4\xe8\xf6\x27\x6f\x18\x10\xaa\x54\xf0\x4a\xdb\xaa\xdc\x16\x4c\xfc\x55\x52\x0c\xe2\x9f\x64\x88\x25\xbe\xea\x89\x52\x01\x26\x91\xdd\x6b\x79\x91\x1f\x19\xee\x08\xe2\xd1\x12\x43\x7c\xe1\xc0\x8b\x0c\x93\x6a\xc4\x18\x0a\x5d\x8f\x25\xa4\xd7\x79\xab\x79\xe9\x39\xe1\xa2\x7d\x16\xd6\x85\x6f\xac\x56\x9d\x89\xad\x1d\x12\xe0\x04\xda\xcd\xbc\xa7\x67\xa4\x8f\x90\xd9\xcf\xfa\xa6\x81\x6d\xae\x59\xa9\x0d\xb8\x54\x3a\x8f\xa7\x10\x22\xed\xe1\xce\x43\x71\x12\xa5\xa6\x13\x07\x1f\xb6\xeb\x74\x8a\xb6\x16\x81\xf9\xd2\x7c\xce\x1b\x5a\x20\xd5\xd5\x98\xae\x43\x1e\xd1\xd6\x94\xe1\xe0\xba\x38\x81\x7e\xe6\x51\x0c\xfa\x21\xf7\xee\xb1\x70\xa5\x91\x9d\x67\x09\x64\x98\xa0\xd9\x25\xa2\x2a\xae\x09\xda\x04\x88\x37\x01\xb1\x98\x68\x55\x0f\x69\xf7\x86\x6b\x66\xc7\xe0\xce\x5c\x4f\x00\x42\x04\xc1\x6e\x5c\x13\x82\xdd\xbe\x65\x58\xf6\x1c\x51\xd1\x8e\x4b\xab\xfd\x4a\xb8\xc9\xdf\xc8\xd5\x8d\xce\xd5\x91\xb5\x40\xa8\xdc\x1b\x6e\xb8\xf8\xc8\xe0\xf7\xdb\x27\x2e\xd8\xfa\xfe\x65\x0f\xee\x7e\x7e\xb1\x86\x23\x85\x79\x0f\xe0\x95\x6b\x4d\x68\xb4\xf9\x03\xf3\x61\x6f\xd3\xd1\x07\x70\xbc\x08\xff\xa5\xb1\xa5\xb9\xa1\xd0\x4c\xd3\x79\x38\xef\x46\x1c\xc6\x33\xff\xe0\xc2\xfd\x9c\x55\xf9\xeb\x1c\x8e\x17\xfe\x70\xa0\x1e\x06\x38\xc9\x5d\x4a\x6d\x80\x2b\xdd\x84\xce\x0b\x54\xe2\x56\x6b\xf9\x0e\x1e\xc6\x4b\x0d\x88\x16\xc0\xd7\x88\xc9\x35\xfb\x1f\x07\x51\xc6\x1d\xe2\xb7\xc7\x67\x14\x34\xc4\x00\xfc\x6b\xd7\x75\xc8\x1b\x37\xf7\xf5\x75\xa9\xae\x19\x36\x92\xa6\xee\x90\x52\x71\x77\x01\x00\x66\xcf\xcb\x06\x69\x1c\xf0\xb5\x44\xf5\x77\xdf\x23\xa6\x05\x6a\x01\xc9\x67\x5d\x82\x02\xe8\x8f\xd2\x5b\xc2\xeb\x8b\xba\x09\xba\x35\x63\xb8\x16\x6b\x3c\x2a\xc5\x5d\xce\xa9\x70\x0b\xc0\xf3\x2d\xf5\xb6\xea\x10\x0b\x1e\x7e\x54\xda\x9d\xb8\xad\x91\x73\xb6\xa4\x06\xf1\xef\x45\x5d\xd9\x0f\x9c\xf8\xdd\x2b\x06\xb9\xa3\x11\xb8\xdc\xda\x63\x45\x35\x0c\xaf\xf8\x69\x34\x29\x96\x2a\x2b\x10\x66\xf2\xee\xa6\xd8\x80\x3d\x84\xd8\xd4\x44\xc1\x4f\x34\x9a\xa4\xd9\x9b\x22\x4b\x83\x29\xcd\x76\xd1\xa7\x6e\xf5\x9c\x2b\x25\xb4\xc5\x30\x93\xee\x5c\x98\x7a\x59\x16\xd6\x72\x09\x67\x63\xb9\xc3\x88\x06\xcc\x57\xfe\x09\xd4\x47\x64\xb0\x8c\x85\x7e\x49\x9a\x81\xda\xd4\x99\x04\xf5\xc2\x37\x06\x50\xc6\xb2\xd4\x28\x22\x02\x7a\x91\xa8\x95\x08\x7f\x3c\x50\x43\x3d\x78\x7a\x73\x8a\x80\x4d\xd3\xca\x7b\xaf\x12\x01\x44\xb9\x5d\x23\x58\x45\x71\xc9\x54\xcf\xe2\x65\x74\xf1\x10\x42\x8b\xeb\x21\xab\x00\xa0\x3c\xa2\x91\xa9\x6e\xe4\xad\x2e\xca\xa6\x10\xf6\x5a\x2c\x6e\xcb\x3b\x70\x1f\x61\x16\x0d\x5a\x89\x6b\xa9\x09\x69\x57\x5d\x97\x94\x47\x5e\x29\x13\x98\xd4\xe1\xcc\xff\xae\xef\x83\x57\x0f\x4c\x7a\x6b\xd9\xa2\x49\xaf\xcd\x2f\x3d\xe1\xe8\x3b\xf9\xcb\x76\x35\x43\x46\x85\xf7\x85\x3b\x5d\xcb\x1d\x0c\xd5\x8a\x4c\x38\xb7\xc6\x53\x09\x35\x47\x4e\x9b\xda\x85\x57\x22\xfe\xbb\x2e\x4b\xef\xc1\x83\xc2\xb9\x75\x8b\x06\x98\x65\x87\x57\xce\xc5\xcc\xe0\xd5\x08\x1a\x53\x94\x84\x31\x5f\x16\x9b\xa2\x72\x18\xd2\x2d\xab\x4d\x9b\x78\x48\xb6\x8b\x44\xef\xbd\x22\x5c\x45\x8e\xb8\xf9\xfc\x5b\x97\xf5\xb5\x78\x37\x9a\x8b\xcb\xc1\xf9\x1f\x06\x6f\x87\xc2\xfe\x3a\x9b\x7e\x3f\xba\x18\x5e\x88\x83\xc1\x5c\x8c\xe6\x07\x00\x8c\xc3\x0c\xaf\x83\xc9\x47\x31\xfc\xe1\x72\x36\x9c\xcf\xc5\x74\x26\x46\xef\x2f\xc7\xa3\xe1\x05\x03\xa0\x8f\x86\xf3\x44\x8c\x26\xe7\xe3\xab\x8b\xd1\xe4\x6d\xe2\x9e\x1a\x8f\xde\x8f\x16\x00\xbb\x99\x20\xab\x56\xeb\x31\x60\xc6\x1c\xce\xce\xdf\xd9\x7f\x12\x21\x9c\x7d\xef\x9b\xd1\x62\x62\xdf\xf5\x66\x3a\xb3\xe6\xe6\x60\xb6\x18\x9d\x5f\x8d\x07\x33\x71\x79\x35\xbb\x9c\xce\x87\x38\xb7\xc3\x3c\xfd\x2d\x54\xf4\xeb\xff\xf4\x9f\x9d\x4b\xbb\x7d\xe5\x2f\x98\x01\xf2\x48\xfe\xc7\xf3\x6f\x5e\x1e\x37\xe3\x3f\xa7\xdf\x9c\xfe\x16\xff\xf9\x35\x7e\x68\xf5\xc5\x28\x07\x9e\x2f\x8c\x83\x27\x62\x94\xaf\xfa\x8c\x28\x0f\xf8\xab\x86\xb5\xc5\x52\xf9\xe0\x08\x02\xc1\xb6\xd8\xc1\x4d\x84\x2f\xdb\x0a\x12\x38\x0f\x73\x10\x12\x4f\x82\xd8\x3f\xf2\x99\xe7\xd7\x4e\x44\x2e\x75\x6e\xf5\x30\x27\x3a\xd9\xf7\xee\xf4\xac\xa0\x21\x52\xe3\x1a\x89\x00\x68\x97\x3f\x34\x56\x1a\x24\xf5\xdf\x4a\xe1\x06\x51\x8a\x87\x38\xbd\x9a\x8c\x7e\x10\x53\x47\xb5\x31\xdf\x99\x4a\x6d\xc8\x15\xca\xe0\xe9\xe4\x8a\x3e\x79\x79\xf4\x5a\x57\xe2\xf2\xe2\xf2\xe8\xe4\x44\x9c\x5f\x5e\xc1\x6c\xa0\xa9\xd3\xc4\x8f\x3b\x3b\x85\xef\x76\xb6\x9e\x90\xd3\x81\x2f\x04\xaa\xa5\x42\x33\x01\x9e\xc0\xef\x89\xd1\x68\x04\xaf\x08\xff\xf6\x3d\xba\xb3\x6b\x60\x6f\xb5\x1a\x8b\x6b\xdc\x60\xd7\x5f\x3d\x39\x3b\x3d\x5a\xea\x4a\x9c\x9d\x7e\x0f\x4f\x3e\x39\x79\x29\x96\xdc\x97\xef\xb9\x9f\x27\x89\x38\x4d\xc4\x59\x22\x9e\x27\xe2\x45\x62\x35\xa6\x6f\x9e\x3c\x34\xa5\x1b\xa2\x20\x13\xd7\x35\x54\x00\x28\xcc\x4a\x08\x19\x67\x1c\x01\x4a\xb8\x60\x8d\xac\x84\x62\xf3\xd0\xc2\x41\x1c\xce\xaf\x4d\xd3\x05\x8b\xb9\x9e\xca\xc5\x86\xa2\x8d\x01\x7a\xbd\xdf\x1e\x55\x23\x10\x49\xb8\xc3\x7d\x1f\xea\x3c\x3c\xef\x75\xf7\x05\x07\x7c\x7a\x7c\x7c\x72\x64\x85\xd8\x9e\x3c\xa9\x59\x0c\x8e\x0e\xd8\x6b\x98\x63\x14\x24\x00\xd1\x66\x5f\x17\xe5\xc6\xd0\xb2\x07\xdc\x06\xa1\x65\x9f\xc0\x36\x05\x6d\xa0\x42\xf4\xe5\xd0\x1e\xaa\x1a\xf3\xe2\x1c\xed\x40\x23\xa7\xaa\x57\x8d\xee\x20\xe1\x57\x30\x3d\xa8\xd1\x05\x10\x28\xe8\xd7\x72\x79\x44\x4a\xc8\x65\x71\xab\x3a\x92\x89\x68\x22\x91\x3e\x37\x7c\x33\xd3\x4a\xb9\x6e\x79\x87\x78\x73\x76\x40\x3d\x0f\xe6\x82\x5f\xce\x64\x7a\x7f\xed\xf7\xb3\x5f\x32\x1e\x31\xb1\x95\x90\xd7\x5d\x56\xaa\xd4\x32\x33\x7e\xa6\x9d\x0b\x20\xe6\x2d\xb4\xab\xcf\x46\xa8\x7d\x8d\x7f\x92\xaa\x8f\xd0\xf2\x87\xa2\x77\x38\x13\x0e\x8d\x3d\x54\x03\x61\xc4\xa9\x36\xdb\x4c\xee\x1a\xfd\x0e\x12\xc8\x5c\xdd\x1f\x54\x53\xdc\x68\xe3\x4c\x5c\x27\x98\xbd\xf9\xec\x78\x86\x0b\xb0\x7c\x51\xaf\x7e\xe8\x74\x31\xfe\x75\x08\xe5\xfe\xd0\x99\xcf\x8b\x32\xf0\x9c\x16\x6b\x9a\xba\x55\xc0\xb6\x17\xe9\xe7\xbf\x8a\x92\x7c\x35\x1f\x32\xbc\x29\x73\xc0\x7a\x0d\xd9\x6a\xa5\x57\x93\x0b\x60\xdb\x1c\xcd\x99\xb6\x58\xbc\xfe\x28\xce\x07\xe3\x8b\xe1\x6c\x00\x44\xb3\x33\x44\x9c\x1f\x8c\x41\x37\xee\x83\x5e\xeb\xf8\x44\xa7\xb3\xb9\xf8\xc7\x7f\x04\x4d\xfb\xe9\x53\xf8\xe8\xe7\xa9\xd8\xaf\xaf\x16\x62\x32\x25\x15\x7b\x78\x21\x16\xd3\xaf\x51\xb1\x07\x3f\x43\xc5\x16\x76\xc8\x17\xa3\xf9\xf9\x78\x30\x7a\x3f\xbc\xe8\x8b\xd1\x44\x4c\xa6\x08\x75\x2e\xe6\xef\x06\xe3\xf1\x83\xa3\x7d\x3d\x04\xba\xb5\xf1\x10\x5f\x30\xf9\x28\x2e\x46\xb3\xe1\xf9\xc2\x7e\x8c\xbf\xd9\xef\x8d\x2e\x86\x93\x85\x7d\x66\x7e\x39\x3c\x1f\xd9\x5f\x86\x3f\x0c\xdf\x5f\x8e\x07\xb3\x8f\x89\x9d\x85\xf3\xe9\x64\x3e\xfc\xe3\xd5\x70\x02\x6c\xbc\x17\x83\xf7\x83\xb7\xc3\xb9\x38\x7c\x64\x22\x2e\x67\xd3\xf3\xab\x19\x40\xd2\xda\xd1\xcf\xaf\x5e\xcf\x17\xa3\xc5\xd5\x62\x28\xde\x4e\xa7\x17\x30\xbd\x4c\xd3\xf8\x9d\x18\x4f\xe7\x30\x47\x57\xf3\x61\x22\x2e\x06\x8b\x01\xbc\xf8\x72\x36\x7d\x33\x5a\xcc\xbf\xb3\xbf\xbf\xbe\x9a\x8f\x60\xaa\x60\x9c\xb3\xab\x4b\x3b\xd0\x9e\x78\x37\xfd\x30\xfc\x7e\x38\x13\xe7\x83\xab\xf9\xf0\x02\xe6\x74\x3a\x81\x91\x2e\xde\x0d\xa7\xb3\x8f\xb6\x51\xc7\x38\x97\x88\x0f\xef\x86\x40\x72\x3d\x9a\xe0\x2e\x18\xd8\xb9\x98\x2f\x66\xa3\xf3\x45\xf8\xb5\xe9\x4c\x2c\xa6\xb3\x45\x30\x46\x31\x19\xbe\x1d\x8f\xde\x0e\x27\xe7\x43\xfb\x29\x50\x65\x7f\x18\xcd\x87\x3d\x31\x98\x8d\xe6\xf6\x0b\x23\x7c\xed\x87\xc1\x47\x61\xcd\x2e\xda\xb7\x6e\x0b\x8f\xe6\x6e\x0f\x27\xb0\x7e\x62\xf4\x46\x0c\x2e\xbe\x1f\xd9\x6e\xd3\x97\x2f\xa7\xf3\x39\x1b\x60\x30\x65\xe7\xef\x68\xba\xdb\xd9\x78\xfd\x67\x17\x45\x65\xd4\x4f\xf9\xdf\x4e\xff\x3f\x7e\x7e\x7c\xd6\xd4\xff\xcf\x9e\xff\xa6\xff\xff\x2a\x3f\xde\x8d\x61\x95\x9b\x93\x6f\xbf\x7d\x61\xaf\x84\x0b\x2b\xd2\x53\x31\x28\x8d\xca\x95\xac\x9f\xc0\xbd\x02\x81\x55\xce\x14\xc0\x68\x25\x50\xe2\x93\xfa\x11\xf2\x78\xa9\x14\x3d\x70\x3a\x4e\x25\xa6\xd8\x2b\x01\xce\xba\x3b\x05\x53\x15\xe0\x23\x88\x9a\x1d\xaa\xcf\x2b\xb5\xad\xbc\x5f\xd7\xb6\x41\x6f\x0c\x5c\x70\x5b\xb9\x55\xe5\x91\xd1\xff\xa4\x44\xb1\x75\x04\x8d\xff\x07\xdf\xe0\xab\x4c\x1a\xd3\xeb\x63\xdf\x49\x1b\xa4\x6c\x0a\x91\xa9\x35\x10\x1b\xc9\x55\xf5\x1f\x3c\x41\xb5\xff\xcc\x5e\xe3\xd9\xdf\xb2\xfe\xe3\xf9\xf1\xd9\xc9\x6f\xf5\x1f\x7f\xa3\x1f\x58\x7d\x11\x02\x59\x70\xf6\x67\x20\x19\x56\x20\x19\x5e\x62\x51\x08\x3e\x71\xee\x63\xed\x4f\xfe\x1e\x8c\x1d\x21\xc4\xff\xf8\xaf\xff\x97\x78\xc4\xe6\xf9\x65\x2d\x9c\x3d\x7d\xf8\x3b\x36\x74\x68\x44\x5d\x56\x42\x05\xbc\xff\x8d\xad\xd2\xb6\x0f\x08\xed\xf3\x6f\x68\x1d\x44\x3a\x55\xe4\x3c\x7f\x0d\xda\x5f\x50\x85\xf3\x6e\x6a\x75\xe4\x79\x5b\xfb\x0f\xdd\xec\x7f\x87\xba\x3f\xbc\x70\xb2\x18\x8e\x49\x4d\xf7\x03\x7b\x5c\xf3\x4f\x7e\x53\xfd\xff\x4e\x54\xff\xe1\x0f\x97\xb6\x47\xe3\xc1\x87\xf9\xab\xd8\xd8\x1d\x5c\x5c\xcc\xed\x9e\x98\x0d\x71\x20\x40\x08\xb2\x98\x42\x8b\xc1\x53\xb6\xc5\x8f\xd3\xab\x59\x44\xb1\xc0\xd5\x7d\x59\xc8\xd2\x18\x92\xa1\x37\x09\x5d\x80\x77\xf2\x33\x24\x29\x94\xea\xba\xce\x28\x2f\x2c\x28\xca\xd6\x79\xd8\x5a\xc8\x13\xd0\x27\xfe\xfd\xf3\xab\xd9\xcc\xee\x8a\xc3\xf7\x72\x27\xec\xad\xd4\x13\x57\xfd\x79\xbf\xab\xdd\x58\x2e\x68\x23\x54\xa6\xaf\x1d\x13\x2c\x3d\xe0\x3c\xc9\xd0\x0a\x24\xa4\xc8\x1c\x78\xfe\x8a\xbb\x3c\x2b\x64\x8a\x9e\x92\x28\x75\x0f\x1f\x45\x5f\x4a\xa9\xdc\xbf\xee\x8a\x32\x4b\xef\x74\xaa\xc4\xf0\x87\xf3\xe1\xe5\x02\x12\xf4\xa0\x6f\x9b\xa5\x2c\xaf\x0b\x95\x12\x60\x33\xf5\x0f\x7d\x8f\x9c\x30\x77\x5e\x2f\x65\x22\x46\xa5\xfc\x29\x11\x63\xbd\xdc\xc9\x44\x4c\x80\x4f\xf5\x0f\x45\xa9\xf0\x93\x3c\x11\xf3\x5d\xa9\x65\x22\xe6\x75\x6a\xff\x35\x58\x5f\xdf\xc8\x1c\xa8\xf0\x31\xe1\xd4\x11\x4c\x02\x6f\x48\xb9\xc3\x24\x01\x74\x71\xd2\x10\x6f\xa4\x09\x3a\x74\x5d\x14\x29\x11\x2c\x53\xe1\xf7\x7f\x70\xad\xf8\x3f\xce\x4f\xff\xd9\x9b\xf1\xe2\x0f\x47\x68\x71\xd9\x13\xf6\x0b\x18\x02\x8f\xd5\x7f\xbf\x6c\xf3\x3f\x3c\xff\xe6\xe5\x6f\xfa\xff\xaf\xf1\xb3\xb8\x51\xc2\xee\x00\x97\xed\x14\x14\x21\xa7\x41\xae\x56\xe9\x33\x59\xbb\xcb\x54\x15\xc0\xa8\x8d\xa9\x95\x3d\x70\x6a\x87\xe3\xb7\x97\xe3\x9e\xd7\x26\xbd\x82\xea\x36\xa0\x79\xf5\xe4\x7d\x33\xc1\xb9\xe2\x4e\x32\x67\x30\x27\x6a\x25\xf4\x17\x71\xa3\xa4\xed\x93\x4f\xe8\xde\xc8\x4f\x0a\x03\x3c\x58\xee\xb3\x31\x2a\xbb\x55\x54\x77\x83\x29\x72\x32\xd0\x0e\x33\x59\x81\xf2\xed\x73\x7d\x99\x89\x5e\xfa\xc4\xe3\xa2\x0c\xca\x83\xa0\xe0\x15\xc3\x4f\x4c\x2f\x95\x36\xca\x64\x21\x85\x3a\xce\x7e\x5e\x06\xc0\x6f\x3e\xb6\x08\x63\xdb\x96\x05\x24\xc6\x1e\x09\xa3\x88\xc8\x35\xc4\x88\x83\xae\x1f\xac\xb3\xea\xd3\xd1\xb2\xbe\x36\xff\x9b\xfd\xad\x5f\x94\xd7\x07\xfd\x27\x1f\x74\x7a\xad\x5c\x34\x0d\x12\x85\x96\xe0\xfd\x60\xdd\x18\xda\xbf\xa3\x6f\x75\x0d\xb1\x35\xac\xb9\xb5\x0b\x56\x2e\xe5\xa6\x58\xf3\xfd\xec\x0d\x0c\x6e\x2f\x1c\x03\x6f\x22\xc7\xa1\xfc\xd0\x5b\x28\xc2\x44\xdf\xa4\xb2\x9a\x80\xaf\x0b\x88\xb8\x28\x5f\xba\x19\xd0\x85\x6f\xf9\x1e\xa1\xd5\x68\xfb\x93\xb8\x7c\x71\x00\x14\x48\xc3\x7e\x01\xd1\x64\x51\xc2\xa8\x28\xbf\x35\x1a\x95\x6b\xc4\x38\xce\x61\x09\x95\x70\x47\x2e\xf3\x2a\xa0\xbb\xb2\x0d\xf7\x9f\x8c\xb0\xc4\x9d\x9b\xec\xee\x14\xd1\xfa\xf2\x3e\x6a\x34\x02\x95\x87\x54\x6c\x05\xde\x2d\x98\x53\xe8\x37\xfb\xab\x1e\x3b\x7a\xf6\x58\x81\x69\xad\x28\xdf\x15\x63\xb5\x76\x82\x9f\x63\x15\x3d\xad\x3a\xd0\xb5\x06\xf3\x2a\x83\x5a\x0c\xb7\x86\x78\x56\xe1\x90\x3a\x01\xe0\xf6\x16\x25\x9c\x75\xac\x3a\x72\x78\xa7\x50\xf6\xed\x5e\x44\x88\x2e\xbb\x76\xfb\x9c\xb5\x4f\xaf\x80\xd3\x15\xdb\xa4\xc6\xd7\x5a\x2d\x77\x3c\x36\xf1\x32\x1c\x74\xff\x89\xcb\x52\x75\x5d\xa5\x02\x79\x9d\x65\xd1\xdb\xb5\x0b\xb3\xc1\xca\x89\x45\x43\xfe\x00\x32\x01\x16\x6d\x32\x2b\x26\x72\xf6\x91\x2c\xd4\xb9\x40\x60\xab\xa8\x93\x56\x9e\xc8\x4a\x9b\x35\x25\xcf\x05\x0c\xe5\xaf\x9e\xfc\xef\xd4\xa7\x67\xb8\x0d\xfe\x4f\x5f\x91\xcf\xb0\x10\x94\x27\x00\xc7\x21\x5c\x04\x16\x06\x87\x37\x55\xb5\x7d\xf5\xec\xd9\xdd\xdd\x5d\x9f\x4f\x7c\xef\xaf\xa9\x9c\xf5\x9f\xbd\xbf\x1c\x1f\x9d\xf6\x8f\x8f\xf2\xe2\x88\x91\x35\xfe\xca\xea\xc0\xc3\xf7\xff\xd9\x8b\x17\xa7\xcd\xfb\xff\xe5\xc9\xe9\x6f\xfe\xbf\x5f\xe5\xe7\x7d\xf1\x4f\x3a\xcb\xe4\x5e\xc0\xd4\xfe\x31\xd5\xe1\x05\xa5\xb7\x8c\x32\xdb\x3f\xe9\x8b\x83\x73\xef\xbc\xe1\x32\x44\xa8\x60\xd1\x79\xaa\x6f\x75\x5a\xcb\x8c\x98\x3b\x65\x06\xac\xae\x15\x25\xc6\x62\x12\x8f\x49\x82\xfb\xd0\x57\xf0\x42\x06\x10\x48\xc8\x84\x42\xd5\x46\x9c\x17\xb7\x90\x7e\xda\xa2\x3e\xec\x9f\xc6\xdd\xf0\xb5\xb6\x5c\xa3\xa8\x08\x6c\x3a\x22\xa4\x8e\xe0\x5b\x5d\xa8\xda\x88\x43\x0d\x6c\xf9\x3d\x87\x22\x23\x45\xd8\xb8\x83\xd0\x60\x88\x2e\x59\x86\x9f\x3f\x35\x51\xc3\xbe\x93\x67\x61\x27\x83\xde\x35\x87\x45\x7c\xa4\x9d\x8d\xfb\xd6\x9e\x43\x6b\xf1\x93\xdc\x22\xf9\x71\xcf\xed\x5d\xf9\x06\xa8\xa7\x43\xf3\x0f\x16\x51\x66\xd1\x98\xac\x35\x08\x84\xcd\x37\x54\xd6\xe7\x4b\xeb\x86\x9f\x6f\xf4\x52\x57\x62\x80\xf5\xf1\x43\x5f\xad\xf3\x86\xea\x2b\x41\xcb\x69\xbe\x13\xef\x9e\x58\x91\xdb\xff\x5d\x57\xc2\x27\x8d\x0a\x12\xc1\xac\x96\xc6\xb5\xa1\x8e\xce\x1b\x86\xff\xa2\x2f\x0e\x46\x79\x80\xed\xfc\xc1\x5e\x56\x73\xb5\x2a\xf2\xd4\xea\x1f\xb4\x8d\x0d\x4d\x09\x3d\x27\x84\x38\x94\x3d\xef\x31\xfe\x39\x53\x91\x2a\xab\x71\x2e\x51\x74\xf3\xa4\xbc\xf6\x55\xbf\xf1\x52\x7c\x27\x8a\x32\x78\xe9\xb2\x17\x56\xf3\x37\xd6\xfb\x4e\x12\x5d\xb0\x4f\x7a\xea\xb8\xe5\x43\xf8\x63\x28\x12\x2b\x11\xf2\xb5\xc1\x68\xba\x04\xd2\x1b\xaa\x3e\xeb\x68\x46\xb6\x27\xc9\xcf\xea\xcb\xbe\x38\x68\x2c\x30\xef\x29\x06\xba\xe1\x17\xe2\x85\x45\x4e\x5f\x99\xb7\xd6\xd4\x37\xfa\x4d\x5f\x1c\x8c\xb1\xb8\xe3\x43\x51\x7e\x72\x0d\x62\x13\x54\x5f\x6f\x0f\xa7\xea\x38\x0b\x41\x31\x09\x3b\xa5\x13\x84\x16\x70\xe5\x73\x10\x95\x2c\x4a\x57\xbc\x05\x29\x89\xa8\x52\xee\x97\x18\xbf\xb3\x9d\x62\x30\x09\x96\x12\x01\x82\x83\xff\xe6\xb7\xee\x9b\x61\xa1\x75\xc0\x65\xed\xa0\x0b\x20\x5d\x2c\xe1\x1d\xb1\x91\x9f\xf5\xa6\xde\x08\xf5\x19\x20\x22\x18\x94\xde\xf3\x66\xd3\x76\xe0\x12\xf4\x70\x3f\x42\x4b\x80\x89\x15\x90\xb0\x22\x07\xbf\x24\xcb\x80\x9e\xa0\xa8\xcb\xaa\xc8\x6f\xd5\x2e\x48\xe1\x6f\x2d\xed\xc9\x71\x5f\x1c\x44\xc7\x31\x5c\xd9\x7d\x05\x75\x74\x60\x10\x01\x0b\x1d\x73\x6d\xe1\x82\x15\xe0\xa6\xce\x2a\x2a\x3c\x94\xb9\x83\x54\x12\x55\x91\x88\x54\x65\x0a\xc3\xb3\x65\x81\xd5\xa8\x11\xd7\x13\xbd\x1c\x10\x17\xa9\x84\xfc\xf1\xe3\x04\xf5\x6b\xea\xee\x91\x6e\xd9\x36\x01\x27\xc3\x7e\x7d\xff\x6e\x38\xb1\xf7\xd8\xa5\x84\x85\x3a\xcf\xa4\xde\x98\x03\x3c\x2b\xa1\x60\xf0\xb3\xb5\xc5\x6f\x42\x3c\xe5\xd0\xf4\xc2\xd4\x55\x0e\x3b\x40\xee\x28\xc5\xad\x36\xaa\xba\x29\xd2\x04\x59\x55\x0d\xd5\xbb\xc9\x2d\x6c\xdf\xda\x60\x33\x26\xe1\xc2\x11\x6a\xdc\x6f\x39\x50\x7d\xad\xd8\x0c\x3b\x13\x94\x96\x80\x8a\xba\x2e\x75\x7e\xcd\x41\x77\xb6\x8f\x68\x1b\x35\x25\x04\x11\xad\x4a\x6b\xd8\x59\x6b\x09\xfe\x67\x54\x96\xc1\x2f\xc5\x7a\xad\x80\x93\x16\x81\xab\xec\x8e\xa5\xcd\x6e\x65\x54\x42\xbc\x4a\xb0\x8a\x10\xfc\x5f\xa3\x10\xa2\x00\x90\xae\x4c\xf3\x5e\x6d\xfc\xd1\x5f\xcf\xc1\xfc\xdb\x0b\xbc\x25\x97\x9c\x36\xe1\x63\x4b\xfb\x81\xda\x93\x50\x63\x49\xbc\x3b\x42\x19\xab\xb2\x3f\xfe\xcc\x89\x7f\x66\x60\x67\xa0\x78\xf4\x99\x33\xfb\x1e\x2a\xdc\xcb\xac\x6c\x6a\x24\xf4\x16\xc6\xe5\x49\x9b\x60\xa8\x56\x0d\x68\x6e\xd6\x50\x51\x69\x09\xd9\xad\xe3\xd2\xb5\x2b\x82\xcb\xd6\x5d\xe0\x79\xd2\x3f\xb1\x6a\x01\xc0\x70\x1c\x16\x25\xfc\x56\x1e\xf4\xdc\xce\x6d\xa8\x64\x32\x56\xca\x10\x33\x1b\xd2\x15\x39\x89\x9b\xae\x8f\x40\x9e\x00\x88\x5b\xf0\x18\x58\xd4\x04\xfc\xc1\xd9\x86\xe0\xdf\x0f\x15\x3d\x04\xa2\xb1\x5b\xdc\xf0\x3f\x32\x90\x55\x09\x81\x94\xe1\x8b\x56\x48\x59\xc0\xb8\x35\x20\xfa\x3f\x16\x35\xbe\x93\x08\xfd\x7d\x25\x5d\xea\xd4\xd1\x44\x1c\xd0\x33\x3c\x8f\x78\xc9\x2b\xb1\x2d\xee\xac\x61\x98\xea\x52\x21\x7f\xbc\x9d\x00\xfb\x3b\x48\x69\xcf\xd8\x8e\x7f\x24\x8b\x7d\x23\x73\x79\xad\x18\x25\x07\x4e\x1e\x8e\xc6\x8b\x6e\x00\x37\xcc\xab\x92\x58\xe9\x5d\x48\x00\xc6\x63\xa5\x53\x71\x97\xab\xd2\xdc\xe8\x2d\xa0\x90\x00\x1b\x9d\xbd\x24\xd7\x7a\x5d\x01\x91\xfa\xca\xb6\x7e\xf8\xe2\xf8\x3f\xf5\x1c\x86\x44\x5d\x41\x59\x2c\x64\x65\xdf\x48\x4a\x0b\x5d\xaa\x5c\xad\xf5\xca\xde\x09\x51\x93\x41\xaf\x18\x47\x82\x15\xf7\xb7\x94\xac\x9f\xa7\xf6\xcc\xa5\x91\xc2\x7e\x6a\x15\x76\xfc\x02\xfd\x65\x28\x1b\x82\x25\x4e\xf9\xff\x58\xd4\x78\x51\x67\xe9\xd1\x9d\xb6\xc7\xbf\x2c\x76\x32\xab\x76\x47\xeb\x52\x01\xf1\x44\x7e\xe4\xb9\xe8\x68\xb7\x37\x2e\x0f\x5c\x5c\x9d\x03\xa1\xd3\x0a\x30\x72\xb6\x65\xb1\x55\x65\xb5\xe3\x8d\x76\x18\x28\x12\x24\xff\x50\xbc\xa4\x6a\x23\xcb\x4f\xbd\x47\xa5\x61\x81\x05\x07\x2e\x68\x9e\x10\x5a\x88\xc7\x52\xc0\x5a\x84\x84\xd3\x69\x13\xa6\xdb\x4e\x82\xd2\x84\xc4\x23\x6c\x70\x80\x27\x2b\x74\xd5\x16\x6a\x09\xcb\x24\x08\x9c\x8b\x3a\xf7\x7c\xf3\xd2\x68\x4e\x64\x88\x6e\x5b\x14\x15\x61\xc1\x6b\xa0\x13\x7d\x67\x5f\x1c\xdf\x6f\x38\x6b\xd1\x9d\xe4\x16\xbe\x31\x74\x3b\xd4\x04\x27\xc0\x4a\x71\x12\xe1\xb1\xfc\x56\x0d\xe9\x1d\x0f\xd4\x09\xf2\xbf\x40\x8a\x9f\x5a\x2b\x6c\xb8\x5e\xdb\x83\x74\xab\xc4\x85\xac\x14\x7d\xb2\xb8\xf1\x82\x90\x73\xea\xe1\xca\xa6\x33\x77\xda\x3f\xc1\x09\x23\xaa\x1e\x26\x51\x0f\x7b\x20\x96\x6a\x55\x6c\x94\x50\xee\x05\x0e\x29\x21\xfa\x1a\xb9\x53\x52\x06\xde\x0a\x3b\xbc\xd6\xa5\xa9\x82\xe5\x36\x8d\xd9\x8c\x06\x03\xe4\x8e\x7c\x87\x43\xf9\x38\x9c\x1b\x31\x5f\x15\xdb\xc7\x06\x06\xf2\xc9\x8d\xce\x55\xa1\x02\x5c\x05\xed\x78\xfe\x76\x97\x88\x9d\x44\x88\x94\xf4\x00\x78\x2d\xe9\x55\x77\x04\xc5\xa2\x37\xe8\x93\x74\xc1\xcb\xb8\x7e\x9c\x9f\x20\xff\x6d\x4b\xb7\xee\x7e\x77\x65\x97\xc2\x89\xa2\x60\x8d\x40\xeb\x5a\x16\xb7\x70\xec\xf9\x98\xb6\xab\x25\x5a\x06\x73\x43\x1c\x70\xad\x3b\xe2\x60\x82\x53\xb1\x65\x7f\x95\x6a\x53\xb8\xbc\x8e\xc7\x75\xc1\x35\x48\x76\x54\x81\xb0\xac\x04\x44\xbb\xed\xca\x2b\x71\xa8\x7b\x56\x8c\x95\x8d\xc8\x68\x75\xa3\x4b\xac\x64\xdd\x3d\x35\x4d\x44\x94\xf6\x64\xa1\x64\xd7\xba\xd7\xe5\x4c\x68\x1f\x97\xc0\x6c\x71\x91\x67\x4e\x6a\x0c\x84\xc0\x9e\x23\xd5\x6b\x0c\x71\xd5\x2d\x0e\x9c\xd6\x07\x39\xfc\xcd\xd5\x75\x09\x4c\x46\x11\x32\x5c\xab\x9b\x7d\xb7\x8f\xfd\x16\xf0\xfe\x78\xd4\x1e\xed\x8c\xd1\x16\xa4\x16\x9d\x58\x36\x09\x47\x8b\x05\xfd\xd3\x6e\xb9\xe2\xba\x40\x43\x33\x3c\xc1\x76\xf2\xfc\xf0\x29\xc3\x27\x57\x40\x75\x50\xb6\x12\x04\x02\xab\x3b\xf0\xa6\x9a\x50\x66\x9c\xf5\x9f\xf7\xfc\x61\x7d\xde\x17\x73\x67\x29\x39\xdb\x9f\x3e\x9e\x14\xb1\x1a\x0f\x45\x49\xc1\x01\xe3\xea\x36\x03\xf8\x0c\x80\x7e\x5b\xac\x71\xcb\xac\x6e\x0a\xdb\x89\xaa\x68\xc2\x9b\xec\x39\x4b\x32\x30\xd8\x42\x27\x7f\x78\xc6\xc4\xa1\x51\xca\x8d\xe3\xe4\xb8\x7f\xda\x83\x02\x90\xaf\x32\xd5\xc1\x37\xe5\x73\xe0\x3a\x1e\xf2\x13\x74\x16\x4c\xd0\x8b\xbe\x98\xa9\x6d\xa9\x0c\xbb\xad\xf7\x5d\xff\x25\x7f\xcb\x84\x0e\x0b\xff\xf9\x52\x65\x5a\xdd\x2a\xd3\xb1\xe7\x61\xd3\x81\xa4\x62\x34\x2c\x72\xe2\x1d\x9a\x1e\xde\x1f\x70\xb6\x4d\xbd\xb6\x1a\x8d\x9d\x21\xda\x57\x6c\x3a\x87\x06\x6d\x55\x74\xbc\xe1\x31\x2b\xf7\xb4\xff\xb2\x2f\xde\x48\x5d\x8a\x2b\xa3\xba\xf6\x36\xb9\x05\x00\xb5\x31\xc5\x18\x06\x18\x6a\xe1\x2e\xff\xc8\xb1\x0b\x5a\x52\x9f\x95\xe2\xd3\xef\xd2\x62\x55\x95\xe0\xb0\x28\xd6\xc0\x83\x89\xb7\x2f\xfc\x96\x2a\x49\x86\x14\x67\xd3\x79\xf4\x01\xe3\x7b\xfa\x4d\xbf\xad\x9e\xcd\x39\x78\x73\x66\xcd\x91\xb3\xfe\xa9\xfd\xcf\x19\x5e\xd6\x67\xfd\xe7\x30\xc3\x41\x92\x1f\x69\x8e\x8f\x5c\xad\x0c\xc8\x35\x0b\x73\x72\xb4\x3b\x1d\x67\xfd\x93\x98\xf4\x14\x36\x11\xda\x27\xd6\x34\xa1\xaf\x0d\xb2\xac\x85\x4e\xd2\x25\x72\xba\x5c\x7b\x6c\x1b\xdb\x49\x6e\x44\x76\xed\x16\xb3\x13\x4e\xf0\xd5\xa8\xcf\xa0\xab\x12\xfe\xec\x3c\xc3\x89\x8b\x84\xed\x83\x48\x1e\xb7\x20\x92\x35\x50\xd1\x84\xe0\x74\x6e\x4b\xb7\xbc\x05\xce\x25\xdc\x1c\x92\x11\xd7\xf6\x6f\xb9\x87\x8d\xec\x7c\x2d\x2e\xd2\x4d\x71\x27\x00\xc6\x6e\x25\x73\x51\x2c\x21\x8b\x54\xc6\x60\x67\x71\x37\x29\x35\x5e\x56\x95\xda\x6c\x51\xf1\xc9\x80\x28\xb9\x74\xf0\x04\x84\x14\xc1\x63\x78\xda\x90\xc6\xfb\xfc\x6e\x67\x56\x1d\x6b\xae\x6b\xc3\xb7\x47\x5f\x1d\x81\xb4\x0b\x45\x5c\xd7\xca\x36\x1d\xbf\xd5\x8d\xca\x1b\x57\x3b\xa9\x53\x8d\x67\x23\x30\xac\x86\x9f\xb3\x73\xc7\x00\x01\x47\xe0\x6c\xf5\x22\xed\x04\xa7\xf9\x81\x15\xa6\x75\x6c\x76\xf6\xe1\x85\xe9\x74\x4a\xdb\xe5\x0e\x71\x48\xc1\xb0\x84\xc7\x2a\xbd\x51\xd9\xce\xda\x89\x39\x80\x86\x5a\x0d\x86\x00\x75\xf2\x22\xb0\xf6\x50\x53\xc0\xdc\xdc\xe8\xec\x90\x87\xd0\x75\xbb\x43\xfd\xef\x80\xd5\x82\x5e\x36\x07\xf6\xc8\x69\x48\xc8\x89\xe8\xd4\x34\x06\x60\x64\x58\xa5\x0a\x9f\x6b\x82\x6e\x05\x72\xc5\x79\x93\x9a\xaf\x76\x8a\x42\xb0\x7b\x51\x9a\x5a\x0d\x0f\xb6\xf1\xcf\xdb\xba\x5d\x0a\xa9\xdb\xcd\x67\xed\xdd\x1c\x99\x50\xf4\x45\x87\x91\x84\x02\xa5\x51\x7a\x1e\x3d\xc1\xaf\xe3\x79\x0b\x6e\xfc\xe6\x74\x80\x19\x6c\x77\x70\x53\x4b\x89\xd4\x93\xe6\x45\xcf\x13\xd7\xf2\x3b\xda\x13\x07\x2e\xb9\xa0\x33\xda\xc0\x86\x8c\xf4\xca\x6e\x6f\x38\x39\xce\x43\xb1\x54\xe4\x0a\xbd\xaa\xa5\xea\x88\x81\x78\x60\x95\x2e\xf1\x66\x57\xf0\x6b\x22\x29\x49\x3c\x38\x54\x42\xf0\xba\xac\x42\x83\x25\x6b\x6f\xda\xbd\x96\x47\xb0\x6b\xf1\x0c\x36\xdf\x0a\xde\x55\xc0\xe2\x93\x0d\x41\xe8\xdc\x9a\xc1\x1c\x6e\xac\x5d\x8f\x5f\xd4\x25\x95\x04\x25\x62\x5d\x97\x31\x8e\xd7\x83\x2a\x5c\xd4\x29\xe7\x79\x0c\x06\x0e\x07\x6a\x4f\x5f\xfd\x76\x7d\x0e\xa6\x94\x5e\xb9\x7b\x36\x14\xf7\x68\xde\xc4\xc7\xc4\x2a\x8e\x95\xc3\x70\xce\x77\xee\xf8\x31\x92\xe8\x61\x80\x8f\xd0\x84\x19\x4d\xd8\x1c\x73\xff\x0e\x80\x46\x6d\x83\x77\x80\x5b\x56\xed\x28\xfb\x25\xb0\x6b\xd7\x22\xd3\x84\x32\xda\x63\x77\x39\xa5\xfb\xef\x3b\xa6\x7b\xee\xca\x44\x84\x55\x5b\x0e\xd6\x14\x46\xd8\x35\x20\x92\x82\x14\x1f\x09\x41\x75\xed\x81\x4a\x77\xe2\x53\x5e\xdc\xe5\x62\x2d\xd1\x67\xa4\x73\xb9\x5a\xd5\xa5\x5c\x69\xef\x4e\x3d\xb3\x8a\xed\x20\x4c\xb8\x59\x8b\x81\xd7\xec\x17\x76\x1d\x9b\x82\x01\x91\xd2\xaa\x02\xbd\x24\x74\x36\x8a\x16\x22\x5a\x12\xcc\x19\xe5\x8b\x59\x5d\x26\x55\x1b\xc0\xeb\x85\x69\x64\x74\x56\xcf\xcf\x0c\xa3\x0a\x4f\x63\x7c\x35\xb5\x25\x81\x4b\x5e\x71\x02\xbf\x40\xdc\xe1\x0c\xd0\x8c\x3f\x12\x42\x19\xa0\x4d\x65\x6b\xec\xad\xdd\x42\x05\xff\xa9\xc3\xd4\x0a\x54\x20\xf0\x82\x59\xfd\x76\x69\x8a\xac\xae\xa0\x7e\x2e\x43\x2c\x61\xc6\x5d\xb0\x7b\xf9\xa1\xa1\x26\xfb\xc6\x2a\x00\x63\x79\xad\x28\x3b\x07\x65\x64\x91\x2b\x7f\x47\x93\x2f\x11\x38\x5a\x10\x14\x14\xda\x5c\xef\x84\x1d\x73\x6c\x1e\xb2\x5b\xc0\xbf\x49\xe7\xab\xba\xe4\xd4\x9f\xa6\xdb\xab\x61\xad\x7d\xfd\x5a\xe1\xd9\xb6\xbd\x83\xbe\x7b\x3d\x8c\x13\xb0\x03\xcb\x70\xcf\x21\x22\xd8\xad\xee\x43\xe4\x53\x0a\xc9\x8b\x15\x65\xaf\x13\x68\xe6\x28\x97\x3e\x35\xfe\x1c\xef\x94\x8b\x1a\xe6\x68\x5e\x49\x48\x96\x2b\x4a\x31\x73\x49\xec\x4f\x50\x4b\x43\x4a\x1c\xbd\x71\x04\xd7\x76\xd2\x48\x00\x37\x13\xec\xe9\x90\x76\x6a\x05\x2d\x6f\x1b\xa0\xc8\x83\x38\xca\xf6\x6a\xc2\x29\xf6\xcf\x60\xff\x12\x01\xd4\x97\xe0\x98\x2e\x01\xe5\x1a\x54\x56\xee\x30\x26\xb4\xf1\x36\x7c\x05\xda\x61\xf3\xee\xec\xee\xda\xc3\xd1\x53\xd0\x94\x40\x41\x62\x0d\x91\x54\x15\xbf\x18\x7c\xd7\x91\x7f\x49\xed\x84\x04\x9f\x61\x5f\xcc\xed\x26\xc2\xe7\xb6\x1e\xce\x62\xa9\x10\xbe\x37\x25\xe5\x4e\x7d\xae\x38\xa8\x48\x79\x5f\x38\xa7\x0d\x03\xc8\xec\x9d\xa8\x2e\xb7\xda\x90\x24\x63\x24\xf2\xb6\x65\x01\x59\x04\xb4\xc5\xfd\xc2\xfb\x79\x24\x0c\xe0\xae\x4e\x7b\x3b\xda\xde\xb8\xaa\x92\x3a\xa3\x10\x91\x8c\x6f\xc9\xa2\x4c\xb1\xb8\xcc\x7c\xd2\x59\x46\xd4\x33\x88\x25\x4b\x19\x02\xe0\xed\x63\xc4\xed\x17\x7d\x90\x9b\xa4\x86\x30\xb7\xb2\xb5\x12\x17\xde\x3c\xdf\xef\xbe\x44\xe7\x64\x45\x2d\xa8\x06\x16\x9c\x46\x53\x03\x11\xf0\x3a\x37\xad\xd5\x29\x60\x67\x04\xb2\x91\x9e\x22\x17\x30\x3c\xa4\x31\xd4\xce\x69\x93\x8f\x77\x0b\x03\xd3\x7b\xd2\x6a\xc0\xb2\x2e\x95\xce\x21\xf9\x2f\x85\xed\x0a\x1a\xa0\x21\x95\x26\xe1\x92\x65\xa8\x62\xcc\x2b\x9d\xb5\x45\x92\xfa\x6c\xef\x21\x6d\x97\xc3\x7e\x6b\xad\x51\x19\x72\x53\x61\x50\x9a\xa3\xbb\x29\x71\x1b\x19\x43\x08\x45\x7e\x5d\xd8\xab\x9d\xe2\x07\xba\xc3\xd3\x6f\x27\x0d\xee\x17\x7b\x81\xae\x77\x24\xc3\xc8\x59\x96\x1f\xf1\xb4\xac\x30\x44\x62\x67\xaa\x65\xbe\x60\x0d\x5c\x55\x88\x97\xc7\x22\x95\x3b\x23\xe4\xda\xde\xce\xce\xe5\x01\xf3\xbb\x94\xab\x4f\x88\xe1\xe8\x9b\xec\x8b\xf7\x45\xa9\x0a\xbe\xa9\x78\x14\x3f\x6f\x56\x3b\x46\xda\x39\x50\x18\x9f\x56\xe6\xcf\x18\x21\x29\xa9\x9a\x42\xa9\xe0\xf0\x87\x04\x0b\x37\x44\x07\x30\x4f\x0e\xc6\x62\xdd\x6c\xdb\xe3\x09\x46\x7b\xa7\xd9\x4d\x7f\xcd\x35\xf7\xa5\x9f\xe6\xb3\xe6\x34\x97\xf8\xfe\x6d\xe5\xc7\x65\x7b\xd1\x77\xc7\xec\xb4\xcf\xe6\x38\xe6\x82\x00\x11\x49\xc5\x37\xae\x4b\x4a\xf6\x11\x56\x7b\xbf\x1a\xa3\x4a\x80\x73\x92\xac\x07\x86\xde\x70\x4c\x30\x00\xff\x2b\xe9\x8f\xa9\x5a\x65\xb2\x94\x55\x51\xda\xeb\x29\xbd\x46\xae\xde\x15\xc5\xa9\xa0\x66\x48\x95\x47\x9c\x97\x80\xf4\x62\x85\x31\xf4\x97\x9e\x95\x85\xea\x1a\xd3\x5f\x5a\xee\x7b\x47\x3f\x0b\x21\xd5\x6c\x17\x46\x5d\xad\x00\xa0\x8e\x85\x89\x14\xfb\xcf\x71\x55\xe0\x04\xef\xa2\xd4\x97\xf3\xb0\x5a\x74\x9f\x91\x45\x32\x20\x8c\x31\x35\xaf\x1a\x84\xb7\x74\xe7\xd3\x2f\xc2\x99\xbd\xa1\x51\x52\xdf\xb2\xa9\xe1\x45\x62\xdc\xb2\xb1\xb2\xd1\x0e\xf2\x45\xff\x94\xc3\x23\xb6\x59\x85\xe5\xce\x2e\x6a\xe3\x99\xea\x4c\xb4\x14\x7c\xa5\xd8\xb1\x20\x80\x82\x51\x59\xa6\x4a\xd3\x23\x3f\x18\xec\x5a\xa0\xfd\xb8\x95\x99\x4e\xb3\x5d\x18\x68\x81\x13\x42\x3b\x2b\x6a\xaa\x43\x02\xba\x5d\x19\x8e\x85\xc0\xfd\xeb\xf2\x56\xdf\xaa\xf0\x13\xc6\xc4\xbd\xf0\x75\xc3\xc5\x5a\x7c\x20\x15\xc8\x7e\xd8\x65\x4c\xb6\xd2\xd4\x43\xc3\x09\x8e\xff\x81\xb4\xc7\xf3\x20\x0c\x94\x16\x75\xe5\x75\x2b\x52\x67\x3f\xe9\x3c\x75\x51\x56\xf5\x79\x5b\x2a\x63\x54\x9a\x70\xc8\x0b\xfd\x1a\x70\x63\x16\xe5\x2e\x70\x32\x26\x9d\x19\x38\xd4\x3a\xc0\x80\xed\x4d\xc3\xd3\xc6\x31\xa0\xa5\xca\x6a\x0c\x26\x11\x1b\x55\xae\x6e\x64\x5e\x61\x0c\x79\xad\x2b\xba\x60\x03\x81\x47\x89\x09\x02\x04\x57\x7e\x44\x1b\x5c\xe7\xd7\x78\x61\xda\x63\x6a\xc5\xa0\x36\x9f\xac\xd2\x4a\x1a\xc0\x4f\xb5\x04\xf5\x0f\x10\xe1\x31\x10\xcd\xb6\xdf\xbe\xbe\xf9\x74\x88\x39\x32\x12\x75\xa5\x34\x21\x63\x2a\xf5\xdf\xae\x28\x25\x15\x91\xae\x87\x66\xc6\x21\x38\x6d\x62\x9b\xa1\x07\xec\xf3\x1b\x15\x39\xad\x30\xc7\x8a\x83\x34\x18\xeb\x81\x39\x2e\xd5\x56\x6a\xd4\xf9\x00\x1f\x9c\x4a\x33\xc1\xd7\x9e\x46\x1b\xc6\xad\xab\xaf\x03\x81\x4c\x14\xbb\x9c\x39\xe4\xba\x45\x60\xb2\x61\x0c\x94\x72\xf5\x3b\x87\x09\xdc\xce\xd5\x4d\x51\xea\x7f\xea\xde\x6c\x64\x8a\x06\x9f\x34\xea\xf0\xbf\x09\xe3\xbb\xf6\x3d\x63\xd6\xe0\xed\xa7\x58\x64\x9a\x17\x62\xa5\xcb\x55\xbd\x41\xcb\x9c\x6f\x7f\xfa\x08\xb3\x60\xaa\x1b\x05\x3b\x90\x53\x43\xaa\xa2\xac\x42\x5b\x3d\x57\xd7\x99\xbe\x56\xf9\x4a\xf5\x12\x97\x34\x92\x34\xb2\x46\xf0\x14\x36\x96\x84\x93\x8b\x98\x84\x30\x0c\x5c\xb7\x26\x44\x9a\x20\x2c\x44\x62\x68\xa9\xc0\x2c\x41\x45\x0f\xd4\x2e\x07\x33\x8e\x39\x30\x3e\x1b\x06\x8c\x16\x4c\xad\x5c\x41\xc9\x84\xfd\x1d\x56\x37\xa7\x70\x96\x5d\xaa\x54\x6e\x00\x77\x9d\x56\xc5\x9a\xcc\x72\x55\x41\x72\xc7\x83\xc7\x8f\x9f\x5b\x43\x7c\xd0\x80\xe6\xbb\xd6\xf6\x7c\x65\x85\x81\xe6\xae\x8b\x22\xb5\x8a\x63\x82\xbe\x2d\x53\x15\xdb\x2d\x40\x02\x23\x57\x8e\x42\xed\xa7\x46\xa2\xd0\x8d\xcc\xd6\x75\x4e\x14\x2d\x34\x24\x97\x16\x49\x65\xaf\x0c\xdf\xeb\xfb\x0c\xaf\x06\x3f\x96\x15\xea\x4e\xf1\x80\x08\x30\x2d\x80\x17\xb5\xe8\x58\x56\x29\x1f\x48\xb4\x3f\xc8\x02\xa6\x27\xa9\xe5\x3e\xf3\x97\x85\x9b\x29\x30\x07\x1d\x86\x32\x12\xbc\x80\x93\xd4\xd1\xba\x40\x41\x99\x44\xd0\x0b\x64\xc6\x06\x4f\xc7\x8f\x75\xb9\x23\xeb\x16\x32\xf1\x9c\xfe\xc1\xf1\x6a\xbf\xab\x1a\x36\x45\x10\xae\xca\xe4\x9d\x33\x31\x28\xd5\xc1\x77\xb2\x2f\xe6\x56\x67\x09\x8d\x53\x57\x18\x06\xe4\x1e\xd4\xa8\x43\x99\x2c\x1b\x23\xf4\x1b\x65\xef\x3e\x21\xcf\x9d\x36\x41\x3b\xb1\xe9\xec\x03\x20\x3c\x37\x56\xc0\x11\xea\xf5\xd8\xe9\x3d\xf6\x0f\x03\xf0\x0d\x38\x4d\xa8\x54\x19\x22\x58\x32\xd4\x38\x1f\x7c\x8a\x2d\x2f\x81\x94\x8b\x78\x97\x1c\x91\x55\x5d\x56\x14\x59\x0d\x07\xce\xc4\x00\x37\x28\x38\x73\x60\x35\xf7\x14\x6b\x76\xf6\xb6\xa5\x1d\xef\xd6\x8a\x2b\xa0\x7a\x29\xd6\x62\x59\x1b\x9d\xb3\x49\x40\xb3\xeb\xba\x87\xab\xbe\x54\x91\x97\x36\x93\x77\x9e\x52\x2c\xec\x40\x12\x60\x52\x13\xd9\x01\x07\x40\x99\x73\xe4\xa8\x58\x1f\xd1\x82\xa2\x55\x62\xc0\xc1\x78\x63\xa7\xa0\x99\x71\x82\x2f\xdf\x96\xa8\xbc\x48\xb7\x69\x02\x9f\xc3\xb2\x44\x9c\x55\xaf\xd5\xe1\x2a\x86\x9a\x1f\xe3\x5e\xbf\xd7\x66\xa5\xb2\x4c\xe6\xaa\xa8\xcd\x93\x66\x48\x35\x0a\x18\x07\xf4\x79\x9e\x98\x77\x55\xe4\x2b\x55\xe6\x9c\x2e\x6d\x6a\xa4\xff\xd8\xc8\xca\x9e\x6b\x4a\xec\xb7\x5a\x2f\x68\x84\x3c\xbe\x96\xb6\xa6\x8d\xb8\x51\x59\xca\xd4\xa9\xb9\xb2\x47\x74\xa5\x02\xa6\x1c\xff\xac\x9b\xfe\x52\xf1\x39\x0e\xf8\xb7\xe8\xa8\x44\xe9\x07\xec\x28\x0b\x5a\xed\xe3\x9e\x93\x77\x0d\xd7\x06\xaa\x65\xa4\xe9\x04\x0a\x45\x46\x4c\x83\xb8\xc1\x5c\x7e\xa0\xeb\x0b\xdc\x80\x65\x6d\xe5\x33\xa9\xf1\xb0\xe3\x4a\x34\x0e\x22\xac\x75\xc6\x3e\xe1\x47\xe2\x99\xf0\xa5\x89\xcd\xca\x90\x93\xe3\xbe\x47\x6b\x8d\xf3\x7e\x39\x45\xf4\xd8\x5a\xf2\x13\x75\xe7\xbe\x47\x1f\x70\x19\x90\xe7\x6c\x64\x2b\xca\x11\x21\x56\xea\x4e\x96\xa9\x73\x66\xc8\x40\xdd\x0b\xa2\x74\x27\xc7\xfd\x33\xc8\x10\x02\x37\xa8\xcf\xeb\xeb\x68\x0a\xf2\x01\xa2\x14\x7a\x42\x0c\x86\x7c\xcf\x65\xa6\xcd\x0d\xe4\x78\xc7\x79\xb5\x91\x5f\x45\xae\x6e\x5c\xa2\x05\xa7\x45\x5d\x6b\x2b\xe0\x25\x5c\x98\x3a\xbf\xae\xb5\x81\x63\xc2\x5f\xcb\xeb\xcd\x52\xf9\x4a\x9a\x63\x9f\xb7\x66\xdb\xef\x98\x9a\x3d\x14\x37\x5f\x13\x40\xb0\xff\xb8\x8d\xb9\x67\x78\x15\x43\x1e\x48\x54\xe3\x31\x6d\x22\x0b\x48\xd0\xba\xdd\xec\x7b\xb2\x45\xc0\x99\xdb\xca\x3e\xa1\x79\xf4\xe1\xeb\xe6\x72\xfa\x79\x38\xeb\x53\x78\x5e\xa5\xcd\x29\xa0\x22\x57\x8a\xaa\xb9\x94\x26\x48\x13\x8a\xc2\xe3\xcd\x88\x38\xb0\x3f\x43\x6e\x47\xe1\x62\x72\xb0\xa6\x61\x74\x11\x4e\xaf\x71\xe3\xdb\xb5\x63\x78\xc0\x35\xd9\x59\x3f\x1b\xcb\x88\x35\x31\x5d\x03\x06\x51\x38\x5a\x34\xad\x20\xec\x82\xfa\xb0\x23\x95\xa9\x3c\xd3\x53\x23\xa3\xc2\x6d\x53\x07\x47\x07\xf7\xa3\x6a\xd5\x76\xab\xd4\x3d\xd2\x20\x60\xf2\x7d\xeb\x05\x13\xfd\x3c\x8c\x65\xe6\xd7\x7b\x6a\x17\xb4\xf9\xaa\xb8\x5c\x1c\xc4\xf7\xe1\x8d\x60\xb7\xfe\x45\xed\xef\x0d\x31\x77\xef\xeb\xe4\x2b\x6a\xa6\x9a\xcb\xc6\x2e\x4d\x2e\xbb\xea\xfb\xa2\x33\x71\xd4\xee\x3d\x3f\x86\x01\x36\x84\xf7\x6b\x7d\x49\x1b\x77\xd3\xd0\x0a\x47\x87\xb2\xbb\xea\x31\x11\xb7\x7d\x71\xda\x3f\xc6\xeb\x28\xaa\x8c\x7e\x7f\x39\x86\x42\x2d\xbb\xe5\x3b\x98\x67\x09\x1d\x11\x0d\xac\x20\xc9\xc0\x0a\x41\x59\x09\x2a\xe2\xdd\xe0\x5b\xfb\x45\x79\xfd\xec\xfd\xe5\xf8\xd9\x69\xff\xf8\x19\x54\x90\x07\x64\xf7\xec\xdb\x07\xd5\xd0\xe8\x92\x15\xf8\x2d\x11\xb4\xfb\xca\xbc\xc8\x0c\xc5\xb7\x7b\xb7\x7b\x10\xd1\x68\x3e\x95\x15\x14\x2d\x3b\x64\x8a\x37\xe9\x80\x80\xb8\x9c\x46\x5a\x0d\x4b\xdd\x22\x51\xae\xb5\x11\x8a\x72\xd7\x23\x45\x29\xf4\x2f\xbb\x12\x94\x4c\x7f\x52\xa4\xde\x16\xc5\x27\x7f\xac\xa5\x73\x71\xb9\x88\x60\x9a\x86\x41\x16\x8c\xea\x55\x3e\x2e\x08\x48\x66\x8e\x23\x84\xb3\xde\xfb\x4f\xfc\xfe\x39\xfa\xda\xda\xbf\xc7\x76\xc8\xd7\x35\x43\x19\x29\x01\x47\xca\xa3\xfb\xe7\xef\x08\x3c\xa7\xff\x6c\xfc\xf6\x72\x7c\x74\xd6\x3f\x3e\xb2\x4a\xd2\x2f\x82\x03\xf9\x08\xff\xf7\xcb\x17\xcf\xbf\x69\xe2\x3f\x7e\xf3\xf2\x37\xfe\xef\x5f\xe5\x07\xaa\xa4\x86\xf3\xf9\x70\x26\xde\x0e\x27\xc3\xd9\x60\x2c\x2e\xaf\x5e\x8f\x47\xe7\x2c\x13\x1c\x0b\xf8\x59\x22\x4e\xbf\x15\xbf\xaf\x73\x25\x4e\x8f\x8f\xbf\x79\x12\x23\xc7\xda\x3f\x01\x87\xa5\x57\x88\xbc\x2e\x49\xe0\xe0\xff\xc5\xca\x41\x61\xc4\xab\x67\xcf\xd6\x66\x0d\x62\xf0\x7f\x7d\x32\xbc\x55\x25\x38\x39\x74\xe8\xc3\x00\xed\x77\xdb\x22\x8f\xe8\x64\x7c\x0d\x50\xfb\xb9\x7e\x13\x0b\xe1\x00\x4d\x03\x4c\x24\x27\x5f\xc1\xb8\x55\x29\xa1\xc2\x36\xee\xb0\x47\x2b\xc6\xac\x4c\x25\x30\x43\xe2\xbb\xc0\x5b\x05\x7c\xe4\x51\x66\x26\xb7\x7c\x16\xb6\xbd\xaf\xa4\x0c\xd0\x45\xc0\x5a\xf2\x12\x26\x10\x91\x1e\xac\x10\xc1\x1e\xed\x97\x54\x56\xdc\x81\x4a\x71\xdc\x0f\x53\x1e\x82\x22\x7d\x56\x38\x38\x83\xd3\xa0\x59\x61\x45\xb8\xce\x13\x71\x10\x5e\xc1\x21\x2b\x75\x67\xcf\x1f\xa9\xa3\xe3\xa0\xeb\x01\x8c\xf2\x72\xfc\x68\x7b\xdd\x0d\x35\xba\x7c\xb0\x00\xbd\x02\xb0\x45\xc2\x16\xed\xcd\x8c\x4a\x71\x2b\x13\xaa\x91\xfc\xe6\xcd\x0f\x99\xc7\x89\x22\x25\x98\x4f\x50\x76\x9c\x62\xf6\x50\x28\xe4\xdd\xec\x06\xf3\x97\x8b\x83\xa0\x05\x20\xa2\x06\xa2\x2f\x57\xc5\x8c\x99\xe5\xce\x6d\x09\x69\xc6\xe5\x5a\xae\x02\xf4\x16\x5a\xdb\x31\xe3\xa5\xd8\x4d\x4a\xf8\x6f\xb8\x3d\x7d\x4d\x0e\xc2\x84\x50\x3d\x0b\x3d\xc0\x20\x0c\x10\xea\x61\x8c\x1f\xb2\x37\xe1\xd7\xc6\x2d\xc5\x60\x4c\x50\x2e\xa7\xac\x1d\x0c\x4a\x34\x74\x10\xea\x3e\xbf\xaa\x9b\xcd\x89\x10\x07\xd1\xc4\xe1\x4c\x70\xad\xa2\x67\xeb\xc2\x64\x36\x62\xfa\x66\x1c\xa1\xc6\x32\xb8\x64\x00\x37\xc0\x05\xe0\x3a\x3b\xb5\xa6\xa5\x64\xe2\x80\xe0\x39\x0f\x69\x10\x2f\xa4\xab\xa7\xb7\xfd\x82\xac\x3d\x09\xf5\x86\xb0\x41\xc7\x88\x5e\xc3\x08\x11\x8d\xb1\xd9\xb7\x1f\xbc\xd7\xb9\xde\x00\x2a\x40\x44\x7d\x09\xfa\xc3\x01\x05\x00\xe2\x37\xfa\xea\xcd\xae\x67\x82\x18\x55\xf0\x50\x22\x7c\x14\xa8\x49\x80\x62\x1f\x70\xd8\x07\x2e\x26\x10\xbe\xd1\x6e\xb8\x24\xe4\x64\xd3\xd6\x5e\x2f\xb2\x00\x2a\x37\xda\x40\xc1\xa4\x47\x49\x44\x38\xa9\xe1\x94\x74\xcd\x48\x3c\xaa\x70\x01\xad\x3a\xf5\xd8\x9c\x84\x7c\xaf\x04\x33\xdb\x85\xe6\x14\x75\x31\xce\x1a\x4f\x65\x25\xd1\x0e\xac\xd0\x85\xe5\xa0\x7e\x72\xa5\x52\x4a\x7b\xe0\xe2\x3f\x4f\x4b\x1c\x76\xc7\xd5\x48\x45\xaf\xb1\xe7\xcf\x2f\x03\x64\xbb\x21\x65\xce\x98\xf1\xa2\x3a\xa7\x9f\xa9\xc9\x87\x8c\x92\x03\x99\x3b\x9c\xa6\x1c\xc9\xb9\xcb\x31\x7c\xd9\xa5\x9f\x41\x09\x43\x53\x82\xa1\x89\xe5\xb0\x9b\xce\x10\xb7\xa9\x33\x6d\xa7\x00\xe6\x47\x08\xa0\xdb\xdb\x35\xc4\x45\xea\x7c\xf1\x29\xd4\x19\xdc\x2a\xe0\x1a\x6d\x99\xf7\xfd\x27\xde\xb8\x67\xb6\xa6\xc8\xec\x71\x92\x4a\xe6\x69\xe2\x10\x9b\x36\x71\x65\xa3\x14\x6b\xb9\xc2\x85\x09\x85\x34\x3b\xe9\xc1\x94\xb1\x2b\x88\xae\xbb\x90\xc4\xb0\x21\x0e\x40\x8c\xd6\x86\xae\x56\xd7\x68\x58\x1e\x2a\x21\x7c\x24\xcb\x6b\xb8\xe6\xc5\x16\x41\xce\xee\x38\x80\xec\x9e\xd1\xc8\x63\xff\x49\xa5\x3d\x32\x8b\x76\xed\x25\xf0\xe3\x6c\xba\x16\x02\x46\xe1\x76\x74\xa9\x8b\xa2\x18\xeb\x4d\x21\x90\x21\xd6\xd2\x8a\x27\xb5\x5e\x17\x65\x85\x10\xc6\xa6\xc6\xa4\x70\x08\xba\x04\x91\xe5\xc6\xf8\x5d\x4a\x35\xcc\x11\x71\xbe\x34\x66\x31\x89\xc7\x89\x30\x57\xc4\x3a\x45\xd1\x7a\x8a\x28\x1a\x71\x77\x23\x2b\x20\x06\x0d\x0b\xce\x38\x60\x59\xaa\x0d\xf8\xb7\xed\x41\xd5\xf9\xf5\xba\x86\x90\x4f\x40\xbb\xed\xec\x7e\xda\x4f\x54\xd6\x9a\x83\x63\x6f\xfd\x90\x92\xd2\xdc\xb8\x41\x54\xa2\x2a\xb8\x28\x7c\xbb\xe3\xd2\x94\x29\x0a\x08\x30\xcd\x46\x4e\xc1\x82\x0d\x4b\x98\x1f\x78\x7c\x59\xfa\xbf\x43\xac\xbf\x37\x3a\xa3\x54\xd0\x45\x43\xca\x70\x0d\x7d\x63\x7a\xc9\x28\x66\x05\xce\x21\x8a\x70\x1a\x4b\x80\x21\xe8\x5c\x24\x3e\x3c\x19\x5c\x52\x8d\xd3\x0c\x86\x6e\xf8\xfe\x46\x66\xf9\x6e\x6f\x66\x39\x64\xfa\x54\x37\x91\x5e\x99\xfa\x7e\x91\x52\x10\x10\x91\xe5\xf5\x46\x95\x7a\x85\x71\x53\xb9\x51\x95\x2a\x4d\x82\xa7\x0b\xc9\x8e\xed\x46\xcb\xe4\xae\xa8\xa9\x06\x5c\x12\xe9\x17\x56\xe7\x99\x8d\xcc\x32\xb1\x91\xab\xb2\x00\xc4\x89\x4c\xe7\x7e\x87\x51\xee\x9c\xda\x6c\x33\x50\x6f\x0f\x2b\x05\xbb\x6e\xad\xee\x20\x8f\x21\x47\x0a\xe6\x4c\xe5\xd7\xd5\x4d\x2f\x61\xc2\xdd\x65\x51\xdd\xec\x05\x10\x91\x3d\xf1\x56\xdf\xaa\x36\x69\x3f\x6c\x25\xc4\xfc\x09\x8e\x61\x38\x89\xce\xb1\x1e\x68\x31\x35\x41\xa7\x41\xc9\x56\xda\xfe\x0a\xe6\xb1\xa1\x12\x86\xd5\x52\xb7\x9c\x9f\xda\x55\x56\xb0\xec\x89\x41\x44\xbf\x1d\xbe\x9f\x92\xed\xc3\xee\xd1\x41\xa0\x77\x77\x98\x1d\x9c\xe0\x19\xdd\x16\xa6\xfb\x06\x88\xef\xa7\xfd\x5b\x86\x36\x4a\x25\x3f\x59\x19\x47\x0c\xd7\x89\xaf\x84\x06\xd2\x6c\xca\x2b\xa7\x92\xa1\x2e\x78\x95\xa6\x3e\xc1\x53\xe6\x73\xbe\x49\x32\x35\xb4\x62\x70\x9c\x5a\xa9\xa8\x84\xb2\xc6\x94\xf2\xe8\x20\xa9\x5a\xd6\xd7\x60\x5f\xb5\x81\x2e\x13\x76\xc6\x82\x06\x96\x16\xb8\xd6\x7f\xa5\x6d\xd2\xd6\x85\x7e\xed\x8d\xd2\xd0\x38\xff\xdc\xad\x82\xac\xec\x6f\x3a\xd4\x27\xe8\x31\x81\x15\x98\x76\xc6\xbf\x48\xeb\x12\x51\x0b\xd5\xaa\x0e\x55\x26\xce\xe0\x68\xb0\xe0\xb1\x92\xe5\xc6\xbf\x29\x50\xe1\xf1\x09\xf9\xe0\xe6\xba\x53\x59\xc6\xc9\xd5\x1c\x8a\x24\x74\x0c\x52\x90\x20\xa9\x89\x61\xda\x02\x23\xfc\x67\x0c\x39\xed\x89\x0b\x8a\x0f\xed\xc7\x1d\x3a\xee\x91\xe2\x82\xfe\xb6\x07\x74\xf2\xc7\x8b\xa0\x7c\xfd\xcb\x43\x7a\x2c\xfa\x3d\xe1\xee\x30\xb5\xc6\x4a\xa7\x35\x27\xfa\x85\xe7\x13\xd1\xdf\xc0\x55\x91\x44\x73\x52\x2a\x42\xb2\xc2\x90\xa1\xc3\x04\x6d\x99\x3c\xfb\x62\x19\x4d\x65\x9c\x90\x3a\x81\x07\x22\x78\xa6\x61\x48\xd0\xc1\xc5\x82\x34\x4e\x40\xdf\x83\x99\xc9\x8b\xb4\xc6\xa8\x3d\x29\x86\x5d\xd3\xda\xf7\x6b\x71\xd2\x13\x57\x10\x81\x71\xf3\x42\xd8\xaa\x0c\xf7\xba\x51\x2b\x40\x20\xdf\x60\x8e\x07\x19\x7b\x6d\xeb\x6e\xe0\x5b\xf0\x8f\x68\x03\x7b\x01\x66\x15\x00\x43\xac\x02\x28\x2b\x51\xd6\x39\x26\x6f\x76\xaa\xa4\x42\x66\xa5\x92\xa9\xb5\x05\x20\xfe\xcc\xd6\x8c\x5d\x8b\xa7\xc6\x27\x8e\x18\xe2\xcf\xe4\x7c\xdb\xbb\x40\x5f\x22\x20\x12\x97\x82\xfc\xc0\xaa\xe0\x3b\x59\x2b\x70\x36\xf3\x51\xe0\x3f\x0e\x86\xdb\x65\x50\xa9\x9e\xb8\x24\xd0\xd5\x51\x6e\x2a\x99\x51\x3c\x79\x04\xb9\x26\x81\x41\x82\x39\x0b\x28\x3d\xd1\xbf\x1e\x78\x05\x54\x54\x29\xe3\xd0\x71\x6b\x00\x5c\x74\x0d\xc5\x16\x45\x6b\xf5\x09\xff\xa3\x1d\x13\xf7\x91\xad\xb0\x31\xab\x86\x84\xc1\x72\x8d\xdd\x47\x2a\x53\x10\x40\xfb\xa3\x73\x4d\x51\x19\x7a\x08\xf8\xb8\x90\x8f\x00\x0f\x0c\xcb\x99\x3f\xfb\xcc\xf4\xc5\x21\x59\x34\xe0\x8a\x41\xfb\xec\x79\x4a\xa0\x50\xfb\xa6\x9e\xca\x54\x23\x21\xff\xa0\xd0\x41\x80\x9d\x87\xe4\x49\x5f\x74\xf5\xe3\x84\x02\x9c\x35\xe6\x41\xc1\xf2\x3d\xd8\xb1\x5f\xe8\x74\xf7\x28\xd9\xdf\x2d\x8f\x33\x79\x23\x75\x05\xf3\x5d\xf8\x9c\x93\xd9\xe1\x12\x29\x21\xf5\x0c\x6d\xd8\x2e\x7f\x95\x30\x76\x74\x4b\xfa\x3f\xc2\xf6\xe9\xfc\x3a\xf3\x0d\xb2\x3e\x13\x22\x66\x3c\xf4\x32\xab\xe6\x0c\x9a\x40\xd4\xfc\xc1\x9e\x4b\x3c\x61\xf7\xac\xd3\xd5\xb9\xd2\x32\x90\x60\x0f\xa9\xec\x74\x16\xbf\x42\xd7\x8d\x95\x84\xd6\x4b\x3a\xf4\x04\x23\x37\x6a\xff\x04\x26\xa2\xce\x5d\x2b\xbe\x4c\x62\xcf\x34\x25\x1e\x21\xe1\xb1\x2a\x79\xaf\xd7\x3c\xa0\x77\x75\x8e\xc1\x41\x9f\xa2\x3d\x19\x38\xff\xba\x07\x80\x42\x62\x9b\x49\x3c\xe7\x94\x6b\x55\x88\xb5\xa6\x4b\xd9\x9d\x39\xfb\x71\x30\xdc\x10\x08\xcd\xcd\x12\xa7\x25\xcf\xd4\xad\x36\x81\x23\xe3\xab\x7d\xd5\xce\x5e\xdc\x17\xaa\xc0\x5d\x4f\xd9\x27\x25\xbd\x86\xdc\x56\xed\x64\x94\xaf\x89\x19\xa0\xeb\xc9\x5e\x64\x56\xd8\xea\x8d\xa2\x52\xa4\xa8\x35\x4e\x5e\x31\x7a\xa3\x33\x09\x24\x4d\x66\xab\x4b\xed\xc2\xd7\x7c\xcd\xd1\x13\x78\x55\x60\x5a\x0a\xc0\x3d\xe9\x9c\xaa\x80\xa8\x1c\xb7\x54\xc6\xc0\x2b\xb6\x65\xb1\xcc\x14\x67\x78\x41\x2e\x16\x1e\xf1\x28\x79\x46\x9b\xaf\xcc\x9b\x71\xc5\xcb\x7c\x0d\x1b\xca\xb9\xa0\x9c\x15\xed\x38\x97\xdc\xb9\x15\x2b\x55\x42\x34\x1c\x9b\x68\x0b\xf0\xc7\xe7\xf0\xa0\x0b\x68\xef\x20\x24\x77\xb6\xba\x98\xc7\x1d\xbf\x71\x12\xb7\x58\x07\x20\xdf\x7b\x23\x36\x8c\xe7\x45\xd9\x79\x3e\x6b\xc6\xf5\xb4\x74\x85\xb9\x61\x17\xda\xf9\x35\xfb\xf6\xd5\xd7\x4c\x9c\xf7\xff\xc0\x0c\x5a\x2b\x31\x9e\xfd\x9f\x11\x92\xd9\xc5\x05\xaf\xb6\xe7\x3f\x7b\xd6\xd1\x77\xf4\xd5\x23\x24\x67\xe2\xcf\xdd\x1d\xdb\xb2\xf8\x8c\xc8\x0c\xa9\x5a\xd9\x8b\x82\x73\xa9\xd7\x35\xb8\x33\x7e\xfe\x89\xa3\x7c\xea\xed\x36\xdb\x11\x20\x2c\xbc\xe3\xa9\xc1\xc1\xac\x02\x90\x77\xbb\xa8\xab\x95\xda\x46\xb5\xd7\xc1\xa1\xb0\x6a\xbe\x04\xc9\xc8\x09\xe7\x28\x25\xec\x0d\xbb\xa3\xd2\x4b\xca\xb9\xb1\xef\xe1\x27\x1b\xf6\xd6\xbf\xe3\x84\x80\xfe\xb3\xb7\x6f\x2e\xc6\x47\x27\xfd\xd3\xbf\x55\xfc\xff\xf9\x37\x2f\x4f\x5b\xfc\x8f\xdf\x9c\x9d\xfd\x16\xff\xff\x35\x7e\xec\x69\x82\x13\x7d\x11\xd1\x1a\x70\xda\xe8\xf7\x0e\x76\xfa\x34\x11\x93\xe2\x56\x81\x18\xb2\x0b\xd5\x8e\xff\x1f\x27\xa7\xc7\xc7\x27\xf6\x3f\xa7\x8f\x65\x02\xbc\x38\x11\x6f\x4a\x99\x7f\xca\x74\x2e\xe6\x55\x22\xde\xe8\x75\x75\x23\xde\x64\x85\xb5\xb7\x5f\x17\xa6\xb2\xdf\x7c\x3f\x10\xc7\xa7\x27\x27\xc7\x47\x27\x67\xc7\x27\xe2\x6a\x3e\xf8\x5b\xe5\x0a\x60\x98\xfd\x72\x36\x1c\xbc\x7f\x3d\x1e\xb2\x06\xe1\x2a\x7f\xda\x99\xca\x9c\x51\x2c\xad\xda\x5e\xcb\x2c\x81\xba\xe2\x65\x51\x7c\x0a\x70\xa1\xd8\xef\x2a\x33\xce\x71\x5c\xd7\x99\xeb\x95\x38\x58\x97\x4a\x1d\xb0\xfa\x6f\xb0\x86\x6a\x0d\x35\x4a\x69\xb1\x79\x05\xd7\xbc\x81\xc0\x82\xe2\x59\x01\x4b\xce\x23\x24\xe2\x37\xa3\xe9\x29\x55\x30\x41\xf6\xca\xec\xa4\xdc\xdc\xe1\x3c\xb8\x02\x2c\x5f\x4f\x81\x05\x7d\x79\x91\x87\x7f\xea\xbb\xac\x29\x8d\x02\x37\xaa\x3a\x43\x42\x50\x5f\xa9\x47\xdc\x2e\x10\xa8\xa0\xab\xa5\xb4\x2a\xa4\x04\xdb\xf2\x5a\x01\x33\x40\xaa\x1d\x8c\xb1\x2e\x41\xf3\x4b\xc4\xdd\x8d\xce\x14\xa5\x48\x13\xcb\x27\x47\x3f\x1d\xe1\x1c\x15\xc5\xc7\x78\x7e\x10\x0c\x5e\x92\xde\xcc\x11\x83\x78\xc1\x24\x54\x9c\xd9\xf9\x3d\x60\x0e\x8c\x83\x84\x22\xcc\x1c\xc9\x94\x55\x93\xc0\xc6\x5d\x49\x6e\xd1\xc0\xac\x0b\xd8\x86\x88\x29\xd9\xad\xa2\xd5\x63\x0d\xe6\x2e\x8f\x2a\xca\x96\xdf\xb8\xec\xf9\x87\x72\x44\x5c\x9a\x00\xda\x0f\x40\x60\xec\x76\xb2\x32\xfa\x9a\x74\x66\x7c\x9f\x09\x31\xae\x3f\x28\xd4\x8a\xdc\xd7\xe2\xed\x9a\x63\x09\x3f\xa1\xa8\x0a\x9a\x79\xdc\xb8\xa6\xdd\x64\x22\x96\x0a\xa1\x73\xa3\x3f\x43\x28\x96\x4a\xe8\x22\x86\x94\x57\x42\xe2\x5f\x99\xe7\xc5\x60\xfd\x1a\x14\xcd\xc2\xf6\xe3\x57\xa1\x39\xec\x0a\x05\xec\x5c\xd1\x1e\x0e\xd2\xec\xdd\xfb\xac\xb2\xd4\x17\xaf\x21\x2d\xb2\x8d\xf1\x16\xc4\x4c\xdc\x13\xf4\x9e\xef\xec\x10\x89\xdc\x05\xfc\xc4\x5c\x17\x65\xcf\x68\x2d\x33\xda\x6e\xa5\xba\x96\x65\x0a\x55\xdf\x50\xf2\x13\x95\x2d\xd8\x13\x43\x5a\x0a\xca\x0b\xaf\x25\x81\xf7\x74\x5b\x6a\x4c\xe6\x29\x8a\x4f\x7d\xbb\x00\xe0\xeb\xd8\xa8\x3c\x6d\x15\x65\x62\x61\x49\x86\xd5\x40\xb8\xab\xee\x00\x3c\x9a\xe5\x0b\xf8\x9b\x30\xba\x43\x9a\xa8\xf3\xcd\x72\x20\x7a\x70\x79\x39\x1e\x9d\x87\xa4\xa0\x17\xc3\x37\xa3\xc9\x08\x88\x1c\x5b\xfb\x3d\xd0\x9a\xed\xb0\x71\x5a\xbc\x5c\xba\x63\xa7\x22\x7c\xa8\x52\x5d\x6f\x92\x26\x9c\x3a\xdb\x89\x04\x9d\xb0\xdc\x35\xdc\xce\x37\x45\x06\x0e\x28\x49\xa2\xc4\xd1\x29\x06\xa9\xb3\x8f\x22\xb9\xcd\xc3\x04\x52\x87\xd3\xb8\x17\x8e\x98\x8f\x03\x14\xeb\xd3\xf2\x5b\xab\xa8\x2e\xe9\xe6\xa1\x0d\x4e\xd8\xe9\x3e\xe8\x72\x13\xc1\xea\x51\xb5\x3a\xe6\x49\x61\x42\xca\x01\xdf\x8d\x07\x09\xe6\x06\x25\x61\xa0\x9b\x51\x54\xfc\x3c\x82\xa5\x0a\xe5\x23\x1b\x15\xaa\xed\xa4\x7d\xc2\x21\x66\x82\x4b\xb4\x90\xb5\x61\x9b\x0d\x77\xd0\xc1\xae\xa8\x0f\x30\xd0\x88\xea\x29\x3c\x9f\xc5\x79\xee\x76\xba\x93\xa0\x66\xa2\x51\xa0\x00\x43\x04\xa7\x8b\x95\xad\xe8\x36\x04\x56\x0d\x17\xa9\x75\xc0\xdb\xbc\x6c\x99\xc4\xb4\xa7\x01\x73\x05\x04\xa9\x32\x3c\x88\x0b\x27\xeb\x1c\x20\x3e\xbc\x89\x36\x07\x1f\x5f\xf7\x35\x2c\x98\xc5\xe8\x13\xfa\x0c\x82\x7b\x65\x4b\xee\x3c\xb8\xa8\x13\xbe\x88\x1a\xf2\x9b\xac\x6f\x40\x29\xce\x24\x2e\x2b\x4c\x3c\x39\x42\xa8\xf0\x86\x7b\xee\x53\x78\x29\x25\x83\x32\x94\x72\x09\x19\x50\xdb\xad\xca\x53\xfd\x19\xfb\xb5\x2e\x8b\xbc\x3a\xa2\x43\xcd\xee\xb4\xe6\x40\x49\xf4\x5b\x11\xe5\xc0\xae\x63\x14\x30\xe2\x1a\x25\x74\x6e\xb7\xd4\x06\xf8\x64\xec\x8b\x88\x20\xae\xd5\x72\x11\xfd\xfb\xa9\x11\xc5\xad\x95\xfe\x99\x93\x37\x87\x05\x45\x16\x32\x0e\x0d\x57\x50\x1c\x4e\xf6\x2b\x1e\xc7\x9c\x2a\xc1\xe8\x90\x5a\xe9\xba\x46\xc0\x12\x2a\xbb\x77\x70\x4e\xb2\x6a\xbe\xa1\x2f\x0e\x17\x37\xb5\x71\x91\x68\xd7\x37\x10\x3b\xe8\xe9\x91\x4e\x7d\xb1\x23\xd8\x48\x7b\xc1\xc9\x4a\xaf\x20\xf7\xa3\x35\xdd\xae\xaa\x8f\xdc\x3e\x24\x64\xdc\x43\xfd\x1e\x42\x89\x84\xb3\xb6\xe2\x3c\x72\xe9\x24\xec\x5a\xdc\x68\x53\x15\x18\xed\x5e\x15\x79\x4e\xad\xbb\x69\xe7\x29\xe2\x4d\xd3\x98\xa3\x84\x6c\x76\xa8\xd3\x4d\x02\x1d\x26\x11\xdb\x1b\x9d\x15\xa6\xd8\xde\xd8\xb6\x13\xa1\x2a\xf8\x05\xca\x8e\x8a\x4c\x57\x18\x5f\x2f\x8c\xa6\x52\x43\x7b\x0f\xd0\xb6\xde\x38\xff\xd1\xc1\x28\xbf\x95\x25\xe0\x3d\x30\x14\xc0\x01\x86\x12\xc9\xd9\xd1\x9a\x17\x96\xeb\x95\xae\x32\x85\x78\xa9\x78\x23\xdb\x5e\x43\xf4\x0d\xf5\x1a\xa4\x0e\x28\xd6\xa2\xfd\x06\x17\xeb\x21\x99\x88\xfe\x7a\xb9\x0b\xee\xc7\x70\xfd\x4a\x95\x29\x70\xca\x75\x61\xd2\x40\x89\x03\x6f\x79\xe7\x79\x58\x6b\x6c\x06\x19\xc7\x3d\xc8\xbe\x40\x6c\x59\x1a\x11\x24\xd4\xb4\x14\x65\x4a\xf0\xf1\x83\xb2\x63\x72\x83\x40\x51\xea\xa5\x87\x74\xb1\x67\xf1\x4f\xaa\x2c\x3a\x46\xeb\x5c\x26\xee\x21\xd7\x4d\xc7\xeb\x66\xf7\x56\xfb\x49\xc1\x88\x12\xa5\x22\xef\x70\xee\x3d\x7f\xc8\x9b\x24\x16\xea\x73\xd5\x58\x32\x73\x53\x94\x98\x53\xc4\x75\xce\x00\x07\x14\x50\xdf\x19\x5e\xaa\x37\x20\x38\x82\x96\xec\xee\x79\x2d\x57\x9f\xc2\xbf\xfd\x35\x97\x6b\xd0\x7a\x25\xd7\xba\x4a\xab\xb5\x9b\x4a\xbc\xb0\x72\x38\x65\x7e\x91\x66\x67\x9a\xdf\x3e\xa5\xaf\xb3\xd4\x5c\x58\xe9\xba\x95\xa5\xbd\xe5\x22\x0f\x75\x53\xde\x8b\x8d\x5c\xdd\xe8\x5c\x1d\x95\x4a\xa6\x0e\x18\x37\xf1\x95\xa0\x0c\xa5\x84\x21\x0c\xda\xf4\x0c\x8b\xe5\x22\x4a\x1e\x04\x94\x84\xe0\x35\x29\xbe\x78\x49\x7a\x22\x9f\x30\x16\x8b\x0e\x59\xbe\x62\x9c\xd6\x6d\xaa\x52\xda\xfb\x6b\x5d\x94\x77\x56\x67\x23\xd9\x0c\x2d\xea\x15\x2e\xa2\x35\x29\x0a\x94\xc6\x87\x00\x18\x8e\x75\xe1\x56\x05\x2f\x0c\x56\x7a\x6f\xf5\x67\x95\x99\x9e\x7b\x6e\x2b\x35\xc2\x34\x61\xae\x21\x3f\x99\x96\xf2\x4e\xe7\xd7\xa6\x87\x18\x34\x56\x11\xc9\x76\xc1\x78\xe8\x73\x7a\x63\xe2\x13\x10\x9a\x83\xd1\x39\x14\xf5\x14\x04\x3a\x05\xd3\x55\xd1\x8d\xb1\xc6\x5b\x03\xb1\x93\xdc\xd5\x47\x21\x61\x29\xec\x86\x57\x58\x8c\x8e\xcf\x7d\x65\xd3\x76\x1f\xc1\xe2\x62\x82\x2c\x22\xf2\xb8\xe8\x62\xb0\x07\x30\x0b\x2a\x5a\xc2\x8d\x2c\x3f\xd5\x5b\x2c\xb9\xf7\xa8\xe2\xfc\xd7\x1b\x90\x5f\x2a\x17\x80\xf8\x70\xcd\x0c\x91\x77\x10\x29\x00\xdd\x64\x55\xd4\xa5\xbc\x56\x61\x95\x62\x94\xa8\x82\x80\xab\xa9\x9d\x00\x92\x2b\x41\x7f\xac\x3a\x85\x6b\xc6\x9d\x6a\x7f\xc7\x5e\x61\x91\x42\x4f\xa0\x8a\x50\x94\x2e\x37\x45\xcd\x58\x2e\x9f\x2b\x37\x0f\x21\x5d\x54\x7c\x06\xb4\xe1\xc4\xe1\x83\xe9\x56\xfe\x54\x2b\x4c\x16\x1e\x22\x4f\x24\x19\x05\x7e\xca\x61\x0d\xec\x8b\xc3\x0e\x91\xe7\x81\x53\x33\xf0\x3a\x1c\xcc\xcf\x47\x23\x6f\x70\xd3\xfc\x2d\xd4\x67\x9d\xaf\x0b\x5a\x39\x6c\x30\x11\x63\xb9\x50\x3f\x34\xfe\x36\x7f\xfb\x7e\x6c\xa7\xf4\x87\xf7\x63\xce\xe2\xa6\x43\x13\x6d\xc3\x8b\xc5\x05\xee\x3d\x80\xf7\x92\x65\x7a\xb4\x2a\x20\xac\x08\x09\x3b\x1a\xc8\x2e\xdf\x2d\xde\x8f\x13\x71\x59\x98\x6a\x0e\x00\x63\xb6\xd9\xcb\x8b\x37\xb1\x41\x79\x53\x6f\x64\x1e\x2d\x55\x3f\x9a\x85\x2a\x5c\x81\x60\x85\xfc\xb8\x2f\x27\x6f\x13\xf1\xc3\xf9\x1b\xe8\xce\xef\x2f\xdf\xf6\x05\xce\x68\xeb\x8b\xdb\xb2\xd8\xda\x8d\x0d\x71\x2d\xfa\x0c\x95\x1a\x34\x1f\xec\xfe\xc0\x88\x52\xaa\x2b\x2e\xeb\x5e\xee\xa2\xe7\xac\x54\x63\xae\x25\xc8\x7b\x0b\xe7\x0b\x6c\x2c\x97\x37\x7e\xb1\xb8\x60\xe5\x92\x1e\x40\x48\x81\x22\x33\x2e\xa8\x48\x62\x29\x9c\x5a\x9f\x50\xc2\xa2\x10\xbf\x64\x7b\xb4\x6f\x46\xc3\xb8\x37\x8a\x8d\xb8\x9b\xd0\xb3\xa2\xae\xec\x42\x7b\xae\x9b\x3c\xdb\xf9\x6b\x6b\x61\xf5\x06\x71\x29\xaf\x99\x19\x29\x61\x34\x9a\xc0\xd8\xc4\x28\x37\xa8\x18\x62\x6b\xd7\x42\x57\x46\x65\xeb\x44\x6c\xb3\x9a\x50\x20\x7c\x38\x64\x0b\x22\x50\xd2\x60\x31\x95\xba\x2a\xc0\x78\x4b\xac\xde\xa4\x97\xe8\xcf\x09\x52\x25\xab\xb8\xf8\x1f\x52\x11\xd0\x0c\xda\x6e\x15\xc6\xad\xe2\x0e\x20\x7d\x0f\xda\xb5\x3a\x77\xab\x8a\x8b\x10\x92\xd2\x82\x05\xee\xfb\x2d\xb1\xb7\x49\xc7\xb8\xc9\x66\xfc\x5c\x89\x1c\xb1\x2c\x15\x5e\x69\x3e\x8a\x89\x9d\x09\x21\x75\x6c\x07\x9e\x1a\x7c\x41\x22\xb6\xa5\x5a\x29\xe7\x69\x58\xaa\x6b\x9d\xe7\x44\x93\x01\x7f\x28\xd2\x00\x41\xf1\x73\x45\x77\x24\x2b\x4b\x07\xc3\x1c\xda\x49\xc5\x0f\x1f\xff\xc1\xf3\xd9\xa1\x7d\x61\xea\x65\x9d\xeb\xaa\x75\x7b\x06\xba\x9f\xa3\x59\x31\xd0\x11\x6d\xec\xfd\xf1\xc3\xc7\x7f\xa0\x08\x1d\xea\xf4\xf6\xdf\xa8\x7f\xab\x1c\xf2\xb4\x4c\x18\xc7\x72\x6a\x89\x33\x8a\xdc\x13\x2d\xb3\x48\x1c\xbe\xb3\x7a\x90\xfd\x18\x44\x81\xa1\x6d\xe3\x90\x2a\x79\x5c\x50\x03\x6d\x3b\xab\x0b\x57\x05\x43\xd8\x0a\xd6\x24\x1d\xac\x3e\xe5\xc5\x5d\xa6\x52\x62\xd9\x38\x48\xc4\xc1\x85\x4a\x1d\x9f\x5c\x62\x27\x26\x2d\x4a\xe3\x3e\x2e\x4a\x71\xf0\x0e\x94\xf8\xdd\x81\xd5\xfa\x0b\x71\x70\x49\xfe\x40\x98\x1c\x58\xd9\x03\x87\xa8\xe2\xd5\xd1\x3b\x97\xb0\x8d\xc6\x6d\x87\x1e\x82\x82\xbb\x72\x69\xcc\x72\xdf\xf2\xc8\xd5\xaa\x20\xfd\xbd\x68\x52\x47\xb9\xc3\x15\xa9\xa5\x2c\x8d\x18\xed\x2a\x00\xc1\x32\x22\x87\xa9\x2f\x42\xb5\x0e\xf7\x32\xf8\x0d\x9c\x66\xd7\xed\x6e\x09\xc7\x01\xfa\xb0\xd9\xf3\x16\x82\xfa\x67\xff\x26\x2a\xd6\x0e\x91\x72\x19\x54\xb0\x3b\xf8\x8f\x88\x02\x12\x04\x23\x30\xa9\x58\xe3\xc5\xa3\x1f\x41\x08\xde\xa1\x61\xbd\x0a\xd2\x09\x00\x59\x2b\xcc\xc3\xaf\xf6\xf7\xce\x4e\x12\x9c\x59\x6d\xc4\x6d\xa1\x51\x24\xdf\x40\x75\x34\xf9\x9f\x39\x0d\x80\x92\xcb\x3b\xf3\x0f\x4e\xfb\xe2\xfb\xe1\xec\xf5\x60\x31\x7a\x2f\xce\xa7\x97\x1f\x47\x93\xb7\x71\xa2\x6c\xdb\xa5\x1f\x6b\xcc\xb1\x87\xea\xeb\x7c\xd5\x6d\xa4\xf3\x70\xea\xba\x72\x27\x03\xfc\xec\x18\xc2\x98\xbd\x5b\x5f\xb3\xd8\x84\x85\xe8\x6e\x01\xdb\x77\xe0\x77\xdf\x6a\xff\x02\x2a\x25\x90\x69\x0a\xf8\x19\x34\x1c\xe7\x98\xba\xbb\x91\x95\x29\x20\x26\x0b\xad\x77\xc4\x1e\x62\x5a\x01\x70\x76\xa9\xd5\x4d\x0e\x06\xed\x46\x49\x53\x93\xb0\x2e\x96\xe8\x4f\x64\x89\x53\x16\x19\x79\x32\x64\x4a\xd9\x58\x0c\x9b\x6d\xa7\x23\x10\x8d\xa4\xd1\xb8\x92\x87\xc8\xed\x14\x60\x76\x72\xf8\x99\xbc\x57\x56\xcd\x56\xb9\x71\x19\x4d\xea\x33\x32\x9d\x53\xa6\x92\x6d\xd3\xa5\x4b\x45\x80\xed\x19\xc0\x32\xab\xbc\xa8\xaf\x6f\x82\x20\x78\xd8\x0d\xc7\x2f\x80\xf2\xb1\xe9\xcf\xf3\xac\xe8\xe2\x2c\x4a\x6d\x82\x67\x32\x05\x8e\x14\x5c\x06\xef\x0f\x04\xe7\x73\xdb\x29\xc8\x00\x7f\x84\x6c\xe1\x52\x45\x56\x88\x7a\xbe\xcd\x70\xdf\x72\x12\xd5\x59\x9f\x37\xb6\x18\x4d\xc4\x1f\xaf\x06\x93\xc5\x68\xf1\x31\xa8\xb9\xe1\x3c\x13\xbe\xc1\x69\x58\x87\x6e\x52\x6c\xef\xed\x06\x97\x8e\x28\x75\x03\x47\x1b\x4e\x9f\x7f\xea\x16\x7c\x42\x8d\x2b\x27\xa1\xf9\x42\xbe\x40\x66\x25\x38\x39\x3e\xf6\x1b\x3a\x70\x3c\x35\xf6\xb6\xbb\xda\x23\x73\xd6\xcd\xb7\xca\x57\x59\x61\x54\xb8\x25\x74\x4e\x1d\x61\x8d\xad\x2c\x77\x09\xc2\x4d\x13\x24\xaa\xd3\x28\x00\x77\x11\xc4\x4b\xd0\xfa\xab\x2e\x9b\x9a\xaa\x7a\xec\x07\xd8\x3a\xf6\xbd\x69\x68\xf3\x17\x01\xbb\x14\xbe\xd7\x17\xaf\x8b\xea\x86\x7b\xe4\xf7\x48\x47\x7f\xbc\x33\x01\x4e\x9f\x89\xfd\x77\x34\xab\x46\xb9\x6d\xba\x88\x7b\xc4\xa9\x7c\x98\x9e\x03\xdd\xad\xed\xf8\xe0\xa6\x77\xd8\xc1\x60\x6b\x3b\x9d\x02\xb5\x80\x9f\x6a\x10\x52\x81\xda\x92\xa7\xc2\xda\xb7\x80\x3e\x14\xe2\x25\xc4\x0c\xb8\x3c\x5a\x1a\x9c\xf6\x74\xab\x7d\x71\x4e\xc7\x15\x5e\x8c\x67\xcc\x84\xc1\x10\xff\x1c\xb8\x31\xb2\xc2\x9a\x0f\x30\xe4\x9d\x8b\xd5\x05\x7d\x6c\x6a\x31\x60\x4f\x38\xba\x7b\x9c\x15\x3e\x24\x09\x6b\xe9\x15\x00\xb7\x80\xf7\x27\x8c\xc1\xee\x08\xac\x0a\x07\x43\x90\x84\x26\xcc\x1a\xf1\xa9\xad\xb0\xa8\x40\xf1\xc6\x52\xdd\xce\x34\x30\xa9\x15\x85\xb8\x2d\xb2\x7a\xa3\xf3\xa2\x36\x98\x49\x56\xf9\xad\x65\x97\x90\x02\x4c\x8c\x98\x81\x30\xb0\x45\xae\x5c\xf5\xf4\x21\x54\x88\xe6\x70\x43\xae\x41\x87\x20\x18\xd9\x5d\x8f\xe7\x96\x50\xe7\x83\x3d\x67\xe5\xa4\xce\x6b\x45\x3d\x85\x26\x21\xd5\xea\x47\xb9\xc2\x52\xb4\x6b\x15\x15\xd4\xf1\xe1\x8e\x3d\xf3\x64\xf9\xc4\xa9\xf3\x6e\x7e\xf7\x9e\x58\x7f\xf2\x48\x77\x64\xb8\xf2\xb6\x3b\xa6\x61\x80\xee\x00\x96\xfd\x3a\x28\xa5\xf0\x5d\xd8\x39\x20\x4d\x8a\x03\x76\x7f\x0b\x13\x26\x21\x9f\xfa\x28\x57\x15\xb8\xfb\x1d\x8a\x08\xa4\xb7\x79\x9b\x8a\xdd\x38\xf4\xbd\x23\xb4\x50\x29\xf2\x01\xe4\xda\x50\x91\x04\x10\x35\xc5\x5d\x9e\x15\x32\x15\xe1\x77\x8e\xd8\x5c\xe5\x16\xec\xf9\xa8\x8a\x15\xd8\x64\x1e\x5f\xac\x35\xc8\x96\xf0\x63\x30\x4f\x99\xa6\x41\x4d\x55\x94\x94\x0b\x77\x3a\xb9\x9b\x89\x2d\xc2\xcd\x73\x65\x6f\x37\xbf\x31\xc4\xb6\xac\x53\xf4\x35\xa9\xad\x49\xbc\x86\x0a\xc6\x43\x8b\x1b\x29\x5e\x65\x9d\x8b\x9f\x6a\x49\x24\xa2\x71\x41\x20\x5e\xdf\xad\xd1\x40\x3a\x20\xaa\xb6\xa2\xba\xa9\x79\xd6\x20\xc0\xcd\x81\x50\xbc\x92\xdc\x3a\x20\x2c\xb5\xb4\x67\x41\xe2\x7e\x17\x3b\x6b\x1e\x21\xbe\x18\x0e\x95\xe1\x90\x9b\xd7\x6c\x1e\xad\xf6\x61\x08\xde\x5b\xdd\x00\x94\x1e\x66\xc4\xca\x6b\xa4\x32\xb0\xc7\x17\x10\xc7\xdd\xb5\x23\xd1\xc3\x16\xd0\xdb\xe0\x72\xe2\x81\x20\xf7\xe6\x4f\xb5\x42\x07\x2a\xb3\x94\xf3\x81\x4f\xbc\xf6\x03\x06\x10\xd1\x1e\xed\x0b\x9b\x40\x95\xca\x52\xad\x91\x61\x21\x0d\xb1\x94\x30\x43\x0f\xb8\x78\x1a\xca\x02\xcc\xfc\xb5\x46\xf1\xb6\x41\xce\x1e\x42\xda\xe3\x3c\x6c\xc8\xb8\xc7\x2c\x5b\x51\x6f\x53\x98\xdf\x46\xd2\xdc\x45\xa3\xd2\xeb\xfd\xf4\x62\xf4\x66\x74\x3e\x70\x91\xd6\x87\xd4\x57\xd9\xaa\xc0\x6d\x0d\xad\x33\x24\x69\x0d\x24\xf6\x6c\x9f\x22\x1d\x18\xab\x22\xed\x4a\x54\xf2\x22\x63\x06\x7b\xf3\x75\xd8\xbc\xb7\x3a\x63\xf5\xd7\x85\x56\x5a\xcf\xad\x35\xd0\x43\xa3\xec\x2b\xda\x17\x43\x82\xbb\xd4\x13\x4e\x46\x07\xc2\xf6\xb8\xab\x26\xad\xf5\x1a\x60\xff\x42\x15\x77\x0b\x68\x9d\x50\x0a\xe2\x0e\xb8\xae\x00\x99\x99\x6f\xbb\xe0\xb4\xa6\x05\x5d\x47\x10\x08\x73\x14\x43\xcd\x17\x70\xaa\xf6\xa0\x0f\x05\x2d\xf4\x2d\xef\x60\x10\x87\x58\x18\x11\x5d\x93\x1a\x92\x02\x7b\xc0\xfc\x64\xbf\x88\xf9\xb1\xab\x8a\x6b\xca\x65\xcb\xd8\xc7\x0b\x83\x3e\x26\x35\x7d\x5b\xaa\x5b\x6d\x6f\x2c\x97\xce\x78\x48\x76\x23\xdc\x56\x1c\x7f\x2b\x95\xb8\x83\xa8\x45\xbe\x23\x04\x57\x53\xf9\xda\x3c\x32\xa6\xf7\x45\x2a\x7b\x5e\x6b\x60\xf1\x06\x8a\x2c\xf6\x9b\x12\x13\xe2\x6e\x70\xd8\xcf\xb1\xf6\x35\x14\x9f\x20\xa7\xd1\x9e\x1d\x13\x44\x8f\x39\x89\xfc\x75\x5f\x8c\xb5\x71\x26\x9f\x9f\x4d\xd0\x30\xe8\x0c\x27\x11\x2d\x0a\x62\x9d\x82\x20\x61\x1a\xe9\x56\x0e\x0f\x3d\x18\xc4\x54\xe3\xa8\xf0\x9e\x25\x4e\x1a\x35\x05\x4e\x20\xae\xed\xd1\xe7\xe8\xac\xc3\xf3\xdc\x27\x62\x0e\x89\x0b\x23\x46\xff\x74\x83\xd1\x6b\xe6\x33\xc4\xea\x58\xa2\x77\xbe\x55\x3d\x47\x15\x00\x2a\x15\x1f\x46\xbb\x51\x3d\x26\x5c\x40\x1b\xc5\x93\x78\xde\x07\xea\x0f\x15\xcf\x22\x78\xc2\xaa\x06\x3c\x5d\x53\x35\xed\x98\x82\xa6\x12\xcb\x6f\xb9\xe8\x0b\xe7\x80\x21\x25\xbc\xa3\xb6\xb0\x4b\xd4\x09\x21\x86\x80\x34\x03\xe5\xf7\x5b\x74\xb8\xda\xfe\x76\x96\x1a\xb6\x51\x02\xbc\x9e\x44\xd7\x43\xe1\xac\xcb\xe8\xe5\xfc\xb2\x37\xf6\xa4\x83\x8a\x93\x08\xbd\x01\x13\x08\xe8\x6b\xfc\x6d\xd6\x65\xa7\x37\xad\x98\x6b\x7d\xcb\x52\x8b\x34\x90\x20\xf9\xc1\xa5\x83\xec\x95\x93\x7b\x73\x53\x5c\x60\x0f\xab\x05\x6f\x8a\x3b\x57\xa7\x33\x48\x53\x95\xa7\xf5\x26\x06\x91\x79\x1b\x4c\x3c\x07\xe2\x1b\x7d\x75\x96\x83\x3d\xf2\xa6\x3b\xfe\x4b\x39\x7c\xa4\x25\x87\x06\x10\x26\xef\x53\x1f\xf6\x9a\x75\xdc\x9d\x77\x6e\x76\x91\xbf\x1a\x58\x9a\xd0\xfe\x6c\x53\x15\x32\xc2\x60\x30\x04\xcc\x48\x44\x19\xe4\xbc\x6d\xce\xd5\x97\x04\x63\xad\x0c\x6e\x65\x8a\x4a\xa6\x29\xe6\xea\x03\xf0\x4c\xa5\x36\xa0\xc5\xc0\xbd\xcd\xc7\xd4\xd9\x1e\x09\xa8\x2f\x09\xd4\x30\xb8\x73\x17\x67\x0d\xee\xbb\x46\x24\xcf\x47\x4b\x24\x71\x48\x99\xb9\xcf\x1e\x18\x45\x73\x32\x13\xc7\x52\x99\x2b\xd7\xed\x56\x6f\x1f\xee\xa9\xb7\xa3\x82\x1e\xba\x39\x22\xa1\x09\xb1\x6b\x89\x27\x0d\xe6\x88\x60\x14\xf9\x7d\x5d\xc3\x25\x65\x90\xba\xec\x84\x3c\x84\x63\x73\xbf\xee\xbf\x6f\xac\x61\x53\x99\xe7\xcb\x2e\xe9\xde\x4f\x08\x4c\x83\x07\xc9\xab\xf1\xf2\x2b\x94\x71\xc4\x7d\xfe\xa4\x90\x6e\xbc\xe3\xcd\x7b\x76\x30\xbe\xb1\x75\x75\xea\x0a\x50\x7e\xb8\xe2\x88\x5d\xa9\x14\xe2\xf6\x7c\x3e\xb6\x29\xbf\xa0\x86\x81\xea\xf9\x92\x2c\x80\xfb\xb5\xd5\x17\xf2\x8f\x7b\x64\x27\xfb\xae\x20\xc1\xcf\xdd\x28\x56\xca\xd9\x65\x37\xac\x8c\xc6\xfe\x49\x8a\xbc\x14\xe5\x63\x97\xac\x07\x89\xd5\x55\x90\x59\xb6\xef\xc2\xfd\x03\xc6\x54\x20\xc2\xd9\xda\xbe\x2d\x2f\x3d\x78\xe1\x63\x3f\x7d\xdb\x09\xef\x0a\xad\xd4\xca\x63\x04\x6d\x23\x89\xe5\x4f\x3c\xdf\x1c\x9e\xb3\x0e\x49\xd4\xb0\xa0\x3b\x2c\xf4\x5f\x85\x6c\x30\x8d\x8e\x71\xe4\x2d\xf5\x5d\xa3\x3d\x50\x51\xee\x1d\x0d\x77\xdc\x71\x69\x75\x88\xc6\xd6\x9e\xf3\x62\x0d\xfb\xaf\x4b\x8c\x9b\x40\xbe\x9d\xfb\x0b\x24\xe3\xf4\x5d\xee\x12\x5a\x0d\x46\x50\xb2\xb2\xe7\xee\x0d\xaa\x0c\x9d\x5b\x3e\x04\x07\xe1\xc9\xa1\x06\x19\x56\xb9\x2f\x2e\x14\x02\x62\x77\xae\x56\x14\x30\x71\x19\x8f\xa6\x91\x48\x15\xfa\xfe\xf7\xa8\x3d\xfc\xc2\x49\x5f\x5c\x30\x1a\x04\xa9\x7d\xf9\x4e\xa8\xcf\x58\xd3\xe5\x7b\x09\x01\x85\x3d\xfd\x20\x1e\x5e\xc6\x1e\x87\x57\x06\xde\xac\xae\x8c\x1b\x7e\xfd\x34\x5c\xab\x7c\xd7\x19\x3e\x08\x3d\x3e\x2d\x59\x46\xe3\xc4\xd2\xb5\xae\xec\x3c\xcc\xa7\xc3\x24\xbe\x15\xc7\x5b\x80\x4f\x63\x0d\xfe\x9c\x8e\xb4\xab\x20\x57\x0e\x18\x5a\xd9\x8d\x46\xe9\x87\x0e\x1a\xca\x6f\x1d\xe7\xbd\xae\x50\x95\xa1\x5a\x32\x97\xd9\xd4\xc1\x98\x66\x94\xef\xa1\x04\xf0\x21\x97\xf6\x54\xa0\x79\xa2\xed\xad\x90\xa6\xd1\xc6\x63\x6d\x28\xd3\x48\xb9\xd1\xb1\xaf\xf7\x2c\x78\xfb\x6e\x27\x21\x48\x0d\x33\xa8\x6e\x6c\xad\xf8\x78\x4f\xc7\x7e\x8d\x10\x5a\x1f\xdb\xac\x81\xe9\xa9\xab\x76\x2a\x22\x20\x6b\x05\xdf\x77\x45\xb5\xad\x15\x5f\xee\x20\x9b\xc5\xca\x77\x00\x7e\x53\xe6\xe8\x08\x3c\x7f\x98\x62\x90\xf8\x62\x2d\x68\x64\xab\x14\xa6\x01\xa9\x3b\x3c\xa4\xe4\x0e\x81\xa3\xed\x93\x50\xb6\xc0\x84\xc2\x20\x53\x45\x79\x2d\x73\x2e\xdd\x22\xe5\x98\xea\xb9\x2a\x4c\xe7\x8f\x33\xdd\xa4\x4b\x9a\xe8\x98\x18\xca\x0f\xb3\xdf\xab\xb7\xe8\x80\xc4\x7a\x80\x94\x58\xe4\x9b\x7e\x6c\xce\xc8\x6a\x3d\xc8\x39\x58\xf8\x58\xc3\xa9\x9d\xb8\xda\xfc\xdc\xf1\x50\xf0\x36\x09\x35\xbf\x7d\x02\x41\x4c\x91\x44\x52\x85\xef\x6d\xe5\x90\xa1\xbd\x0b\x9f\xed\x4b\x18\x4b\x29\xe4\x78\x18\x78\x83\x28\xc9\x07\x57\x85\xea\x2b\x7a\xb8\xbb\x72\x45\xdc\x54\xed\xf4\x3d\x86\x6c\x70\x87\x9c\x70\xd0\x5c\x96\x52\x18\x7b\x01\xc7\x2b\x5f\xfd\xd9\xce\xf7\x63\x87\xa4\x47\x76\x65\x7d\x2f\x5c\x91\x87\x6b\x81\x08\xb2\xc0\xa7\x5f\x82\x43\x17\xc2\x58\x01\x71\xa6\x3f\xe7\x90\xc4\x08\x1a\x17\x1c\x8e\xef\x60\xfb\xf2\x87\xa5\xc2\x22\x78\xb8\xc1\x33\x98\x2e\x6b\xcd\x3a\xc2\xb7\xd0\xa6\x70\xb2\xc4\xe9\x2c\xfe\xaa\xc7\x34\xc2\x34\x25\x28\x42\x6a\xca\x85\xa0\x71\x3f\x1e\x52\x6e\xaf\x7b\xec\xb0\x1d\xd8\xe1\xb4\x89\x46\x9d\x3b\x3a\xb7\x3a\x0d\x1c\x5d\x82\x05\x69\x02\x05\x8e\xf9\x47\x50\xd6\x23\x87\x18\xa8\x2a\x40\xc9\x17\x1c\x5d\x2e\x8a\xec\xbc\x71\x5e\xf4\xc5\xf9\xf4\xfd\xeb\xd1\x64\x34\x79\x2b\x2e\xa6\xe7\x57\xef\x87\x93\x45\xc3\x0f\x86\x88\x28\xb1\x03\xcf\x57\xfb\x73\x12\xdf\x83\xe9\x8f\x49\xcb\x20\x63\xa4\xcb\x20\xba\xf7\x9c\x92\x56\x7d\x01\x90\x77\xdf\xb5\x18\xae\x77\x40\xb1\x86\x26\x90\xe3\x07\xf1\xec\xcb\x01\x13\x66\xb7\xaa\x11\x7c\xc1\x69\x75\x6e\x28\xb6\xbb\xdc\x03\xd6\x7d\xa9\x2e\x08\x1e\x0c\xd3\x62\xa3\x56\x11\x76\xc0\x15\xfc\x53\x02\xbf\x35\x10\x62\x59\xdf\x88\x18\x6f\x1b\xea\x91\x2e\xf7\x5f\xbc\x8b\xb0\xa8\x1f\xde\x90\x2b\xce\xa4\xe2\x4b\xd2\x9e\xe1\x2e\x53\x10\x5f\xbb\xa9\xb3\x4a\x6f\x33\x45\x71\xb3\x95\xcc\xba\x46\x43\xd2\x83\x0e\x0f\xa3\x17\x30\xfe\x03\xc0\xbf\x79\x5b\x0c\x79\xe2\xa9\xd9\x8e\xc6\x7c\xce\xb7\x3d\xd9\xe0\x0c\xb1\x27\xd4\xb3\x98\xdb\x9e\xe3\xcc\x43\x54\x3a\x0a\x60\x81\x42\x8a\x1c\x03\xb4\x53\xea\x5c\xff\x54\x83\xb4\x90\x69\x4a\xd6\x67\x20\x69\x35\xc2\xf4\x05\xa9\x37\x49\xcb\x09\xe3\x16\x9d\xca\xd9\x3c\x65\x45\xe0\x39\xe3\xf7\xe9\x35\x92\x19\x83\x2d\xa0\x32\x80\xd2\xa1\x3e\x70\x55\xfd\x7b\xee\x36\x8c\x50\xa6\x3f\xd6\xa6\x0a\x4b\x04\xe2\xeb\x9a\xb7\xec\xe3\x6a\x43\xc3\xc9\xe0\xf4\xf2\x60\x03\xa0\x3e\xd6\x3a\x03\x81\x77\x95\xcf\x70\xa0\xc3\x9a\x07\x2c\x66\xbe\xce\xbb\x0e\x06\x27\x20\x82\x11\xbd\xd7\xf6\xfe\xce\x1b\x8b\x8f\xbc\xbb\x23\x29\x09\x2e\xdb\xee\x6f\x87\x66\x50\x40\x93\x9c\x92\x8a\x9e\x65\x5d\x0f\xc5\x3a\x3a\x01\x50\x9c\x4f\xc7\xe3\xe1\x39\x78\xfd\xc5\xf4\x4d\xb7\xe8\xa3\x12\xd0\x55\x91\x65\x34\x52\xb0\x1d\x50\x13\xef\x8a\xac\xfe\x2c\x89\x88\xae\x20\x7f\x35\xe9\x3c\xd5\xb7\x3a\xad\x59\xb1\x6d\xc3\x30\x36\x96\xc7\xbf\xa7\x7d\x36\x03\xa4\xa3\xd8\xee\xf0\x83\xe9\x92\xa8\x41\x06\x46\x59\x67\x1d\x5d\xb0\xb2\xb9\x15\x13\x6e\x18\x8d\xbe\x5f\x94\x25\xd3\x11\x30\xe6\x29\x56\x9f\x91\x65\xc7\x75\xde\xe5\x84\x7b\xd2\x2c\x19\x75\xba\x11\x92\xd1\x55\x30\x71\xd9\xee\x61\xb4\x4f\xbc\x34\xe0\xa6\x94\x9d\x02\x12\x0b\x93\x2a\x04\x54\x02\x72\xb4\x34\x28\x33\x86\xa0\x00\xcf\x50\xbc\x2e\xed\x61\x06\x75\x27\x5d\x13\x86\x35\x49\xa1\x87\xf6\x9b\xbe\x18\xbc\x7d\x3b\x1b\xbe\x85\x58\x94\xf8\x30\x5a\xbc\x13\xa3\xc9\xc5\xf0\x72\x38\xb9\x18\x4e\x16\xe2\xc3\x74\xf6\x87\x39\x26\x32\xae\x8a\xcd\x56\x67\xb2\xb3\xd8\xc9\xaa\x00\x95\x09\x2a\x5d\x4d\x78\x5b\x1b\xb5\x95\x25\xb3\xb2\xe8\x3c\x55\xd6\x0e\x43\x95\x84\x17\x8d\xb3\x3d\x13\x8a\x28\xdb\xdb\x14\x23\xf6\x8a\x55\xeb\x02\xf2\xc0\xc3\xb8\x38\x58\xbb\x94\xc8\xe5\x13\xaf\x81\x2f\xf2\xfa\xda\xce\x44\xa5\x0e\xd8\x8b\xe2\x1d\xbf\x0d\x8a\x34\x12\x60\x6e\x68\x94\xd6\xcd\x6c\x4a\x90\x05\x81\x42\x11\xa8\xfb\x88\x6c\xd4\x8b\x44\x7e\xf0\x29\xe0\x02\x82\x57\x67\x57\xe4\x29\x24\x5e\x35\x8f\x18\x26\xb4\x62\x0d\x7a\x5f\x7c\x60\xfc\xd9\xb8\x7a\xca\x1f\x1d\x99\x0b\x37\x90\x46\x85\xb4\xab\x69\x71\x24\x68\xde\x3d\xee\xd2\x66\xc1\x60\xe1\x06\x28\xda\xce\x0e\x89\xa0\xdc\x78\x5f\x7d\x72\xe4\xca\x1f\x31\x2e\x97\xd3\xf4\x83\x78\x44\x10\x6b\x14\x67\x50\xa7\xd1\xc0\x6e\xf5\x99\x30\x5d\x31\x40\x95\x77\xd5\x91\x51\x3c\x44\xa2\x66\xc1\xb4\xf5\x95\xa7\xc7\x8c\xe6\x26\xf2\x5f\x87\x96\x4e\xec\xde\x2b\xe2\x7c\xa3\x65\x29\x57\x9f\x54\xd5\xd6\x33\x9b\xb3\x97\x38\xdf\x8e\x95\x09\x65\x91\xeb\x55\xe8\xe6\x81\x78\x31\xe6\xd5\x74\x16\xc4\x05\x4f\xd9\xbb\xac\x2f\xa6\xae\x7c\x02\x22\x3e\x98\x6a\x84\xc9\xd0\x45\xde\xc8\xd1\x6a\x77\xf5\xee\xa6\xc8\x82\xce\x31\xf9\xdd\x62\x36\x98\xcc\xc7\x70\x92\x41\x69\x0b\xea\x3f\xb4\x09\x5d\x50\xbe\x70\x3d\x0c\xb7\x00\xf5\xde\xae\x83\xb7\xca\xb7\xd3\x0e\x79\x75\xc4\x3c\x9c\x6a\xdd\x17\x33\xb8\x6a\xec\x59\xdb\xab\x9f\x85\x8d\xbb\xfc\x31\xa2\x96\xec\x32\x92\x74\xd9\xaa\x18\x36\x49\x64\x7a\x39\x4c\xcb\x46\xbf\x43\xf7\x4b\xb7\xee\xc3\x31\x62\x77\x9e\x58\x17\x69\xa0\xc9\x98\x2e\x7d\xb3\xdf\xe2\xd0\x91\x51\x09\x4e\xa7\x5a\xcc\xae\xc9\x58\xe3\x32\xed\x30\x02\xeb\x27\x5d\x2a\x7a\xd7\xa5\x0a\x79\x6b\x21\xba\xa7\x1b\xcb\x30\xbf\x86\x0c\xa3\x7d\x7c\x58\x9c\xe6\xb7\x67\xf0\x45\xd0\x4b\xba\x16\x9d\xa9\x60\x15\xc2\x95\x24\x2e\x03\xfb\x89\x27\xf4\x5b\xaa\xea\x4e\x91\xbc\x0b\x67\x65\xdf\xdb\x5a\xdd\x02\xef\x3a\x2b\xa4\x65\xf0\xda\xa4\xfb\x79\x48\x86\xb1\x06\xb5\xd4\x19\x4b\x30\xef\x9f\x6a\x46\x0c\xf4\x23\xea\x61\xc3\x17\x1e\xe6\xa8\xe3\xfb\x43\x69\x78\xe8\x4e\x40\xcf\xee\xa4\x76\x5c\xcb\x7f\xe3\x84\xb0\x25\xab\xdd\x96\xd8\xee\xa9\x21\x0f\x2d\x52\xf9\xc4\x32\xe8\x20\x53\x2c\x2e\x86\xb3\xf7\xa3\x89\x3b\xed\x61\x0e\x6f\x58\xe3\x9d\x08\x03\xa6\x3b\x91\x5b\xb4\x0a\xbe\xdd\x14\x28\xc7\xd0\x47\xd4\xc9\xd9\xce\xef\xab\x75\xc0\x1f\x17\x15\x18\x3a\xd7\xa0\xac\x2a\xb5\x41\xbe\xb3\x7d\xaf\x7f\xe8\xed\x94\x14\x8e\x1b\x1d\xa6\xc4\x15\xb2\xc5\x8c\xf8\x68\xee\xd2\x35\xdc\xd5\x25\x97\x4d\x4c\x8e\x41\xe0\xc1\x8d\x69\xdc\x39\xb7\xa7\xe0\x86\x12\x14\x2f\x90\xe2\xd5\xe6\x05\x86\xee\xb8\x92\x13\x94\x41\x19\x33\x9d\xb9\x8e\xa5\x56\x7c\x72\x6a\xa4\x23\x5e\xc5\x24\x05\x48\xc9\xd2\x39\x86\x6a\x03\x86\x7c\xe6\x5f\x7c\x73\xb5\xb8\x9a\x0d\xc5\x6c\xf8\xfd\x68\xce\xd6\xc1\xe2\xdd\x68\xee\xe8\x74\x7e\x0e\xfe\x5c\xae\x00\x6a\x00\x41\xe8\xba\x70\xb0\xf6\x23\xf7\xfc\xbb\x84\x9d\x13\x73\xa5\x98\x0c\xed\xee\xee\xae\x7f\x9d\xd7\xc0\x02\xc4\x88\x26\xcf\xda\xc0\x74\x31\xbd\xdc\xcf\xc7\xa9\x73\xdb\xb2\x8d\x3b\xe6\x69\x46\xba\x81\xe9\x82\x7d\xf3\x2b\xe3\xcf\x79\x94\xcf\xc7\xf0\xe7\xe0\xeb\xce\xed\xed\x83\x94\x48\xf2\x6d\xec\x34\x95\x72\x5d\xf5\xbe\x1a\x9e\xae\x5d\x6b\xfd\x30\x18\x5d\x78\x0d\x3e\x80\x39\xd7\x80\x92\xfb\xf9\xdd\x1b\x5c\x5c\x0c\x27\x17\x57\xef\x5f\x59\xa9\xe0\x5d\x9b\x0d\xdb\x12\x24\x8a\xb3\x45\x9e\x2c\x3a\xbe\x06\xb5\xc9\xce\x4c\x74\x4b\x76\x57\xea\xaa\x52\x01\x8e\x76\x13\x75\x38\xb2\xa1\xd3\xd0\x6c\x77\x89\xc6\x6e\x9d\xbd\x5a\x83\xce\xbf\x58\x23\xf8\x11\x54\x44\x97\xc8\xe2\x8b\xde\x5e\x85\x98\x5a\xab\x9e\xf8\x38\x1c\xcc\xc4\xc7\xe9\xd5\x4c\x4c\x06\xef\x87\x7d\x71\xe9\x75\x28\x7b\x0e\xac\xf6\xe0\xe1\xaf\x92\x38\xa3\x13\x62\xab\xae\x7c\x4a\x7b\x73\x7f\x1f\x4f\xe9\xc3\xe2\x24\x11\x01\x12\x98\xe8\x3a\x0d\x5f\x0f\x14\xf8\x1d\x13\x49\x74\x22\x1c\xe4\x45\xbb\x10\x80\x39\x6b\x5a\x89\xff\xae\x8e\xd7\x05\x48\x9c\x98\x68\x7a\x2e\xf8\x9e\x56\x4e\x39\x78\x78\xc4\x07\xc0\xcc\xe8\xf6\x47\x57\x57\xdb\x05\x0b\x5d\xc5\x09\x49\xe4\xa6\x39\xb0\x63\xef\xf7\xfb\xd8\xfd\x03\xe0\x55\xf0\x2c\x92\xaf\x9e\x38\x57\x67\x87\x5e\x8b\xf8\x10\xe3\xd1\x7c\x21\x16\xef\x86\xa3\x99\x58\x8c\x16\xe3\xe1\x3c\x48\xdc\x6c\xf7\xc8\x3f\xc3\x17\x32\x7d\xb5\x55\x43\xe1\xbf\xf9\xd8\xc8\x5d\xf1\x72\x34\x4a\xe0\xf5\xd9\xf8\xcc\x2e\xef\x4d\xe7\xb2\x87\x9b\x52\xa9\x44\x6c\x54\x09\x59\x6d\x50\x3f\x72\x57\x08\x88\xd2\xe7\xe4\x6b\xa8\x0a\xa8\xaa\xc6\x15\xd3\x55\x4d\xc8\x92\xa3\x75\x7c\xb4\xc3\x80\x63\x5e\x95\xfa\xd6\x9a\x18\x2a\x28\x4a\x66\xb0\xa9\x55\x91\xaa\x44\xdc\x85\x00\x4c\xe8\x55\xd3\x0e\xff\xde\x3d\x86\x3e\x5f\x99\x65\x2a\xa3\x43\x12\xd2\x30\x10\xf6\x9a\x87\x93\xca\x3c\x7d\x1b\x56\x48\x56\x8f\x40\x78\x55\x05\x39\x0c\x48\xf1\xa8\x51\x9e\x34\x00\xbb\x7e\x65\xfc\xbf\xfe\xb3\xd7\xf3\x8b\xa3\xb3\xa3\xf3\x4c\xd6\x46\x1d\x0d\x2a\xe7\x90\xf9\xeb\x41\x41\x3e\x8c\xff\x78\x7c\x76\xf2\xbc\x89\xff\xf8\xe2\xf4\xe4\x37\xfc\xc7\x5f\xe5\x67\xa6\x5a\xa9\xda\xb4\x2f\x8d\x07\x3a\xb7\x27\x99\x4a\xf2\xcd\x1e\xcc\x40\xcf\x2e\x56\xaa\x00\x9b\xb1\x59\x6d\x19\xdf\x92\x4e\xff\x81\x00\x90\xaa\x5e\x11\x9e\x59\xdc\x29\x32\xf9\x3d\x65\x18\xf8\x58\xa0\x02\x81\x7c\x3b\x10\xf7\x6b\x26\x84\x26\x0c\xf7\x68\xc8\xab\xe3\xdf\x46\x96\xaa\xef\x8a\xb7\x41\xb9\x34\xb5\xd9\x05\x9d\x87\xb3\xc0\x5d\x60\x72\x86\xbf\x76\x2f\x9a\x7a\x86\xb3\xb0\x9f\x39\x98\x36\x4e\x63\x09\x68\xd8\x9d\x6c\x0f\xbb\xce\x95\x88\x13\xd2\x31\x9b\x91\xac\x16\x68\x5b\x5e\xf8\x2f\x19\xce\x81\x0e\x32\xb9\x9c\x23\x8e\x1d\xab\x14\x2c\x16\x08\xa3\xb0\x29\x90\x58\x21\xad\x57\xec\x47\xf6\x49\x36\xda\x78\xf9\xc9\xdb\xc7\xd5\xa1\x6f\x4b\x6d\x77\x15\x2a\x62\xcd\xbc\xb7\xe7\x9d\xbb\xc2\x6a\x21\xb0\x1e\x41\x71\x6c\x73\x77\xf8\xf9\xf5\x29\x68\x76\x4e\x5f\x89\xa7\x00\x8b\x47\x7d\xf5\x59\x09\x1e\x62\x50\xdd\xaa\xac\xd8\x7a\x8d\xe6\xe0\x2a\xd7\xa0\xee\xa4\x32\x15\xa9\x12\x97\x32\x53\xe5\xa6\x48\xc4\xa0\xbc\xb6\x7a\x45\x2e\x0f\xc4\x61\x60\xdf\x6c\xf1\xf3\xbe\x4a\xeb\x67\xbd\xfe\xd3\x27\x60\x08\xce\xa7\x6f\x16\x1f\x06\xb3\xa1\x18\xcd\xc5\xe5\x6c\xfa\xfd\xe8\x62\x78\x21\x5e\x7f\xb4\x57\x3a\x94\x8b\xce\x46\x6f\xdf\x2d\xc4\xbb\xe9\xf8\x62\x38\x9b\x03\x98\xdf\xf9\x74\xb2\x98\x8d\x5e\x5f\x2d\xa6\xb3\xb9\x38\x18\xcc\xc5\x68\x7e\x00\x1f\x0c\x26\x1f\xc5\xf0\x87\xcb\xd9\x70\x3e\x17\xd3\x99\x18\xbd\xbf\x1c\x8f\x86\x17\xe2\xc3\x60\x36\x1b\x4c\x16\x23\xab\x1a\x8c\x26\xe7\xe3\xab\x8b\xd1\xe4\x6d\x22\x5e\x5f\x2d\xc4\x64\xba\x10\xe3\xd1\xfb\xd1\x62\x78\x21\x16\xd3\x04\x5e\xda\x7e\xcc\x1a\xad\xef\x87\xb3\xf3\x77\x83\xc9\x22\x44\x15\x7c\x33\x5a\x4c\xec\xbb\xde\x4c\x67\x62\x20\x2e\x07\xb3\xc5\xe8\xfc\x6a\x3c\x98\x89\xcb\xab\xd9\xe5\x74\x3e\x14\x76\x58\x17\xa3\xf9\xf9\x78\x30\x7a\x3f\xbc\xe8\x8b\xd1\x44\x4c\xa6\x62\xf8\xfd\x70\xb2\x10\xf3\x77\x83\xf1\xb8\x73\x94\xb6\xef\xd1\x18\x5f\x0f\xc5\x78\x34\x78\x3d\x1e\xe2\x9b\x26\x1f\xc5\xc5\x68\x36\x3c\x5f\xd8\xe1\xf8\xdf\xce\x47\x17\xc3\xc9\x62\x30\x4e\xc4\xfc\x72\x78\x3e\xb2\xbf\x0c\x7f\x18\xbe\xbf\x1c\x0f\x66\x1f\x13\x6a\x73\x3e\xfc\xe3\xd5\x70\xb2\x18\x0d\xc6\xe2\x62\xf0\x7e\xf0\x76\x38\x17\x87\x8f\x4c\xc9\xe5\x6c\x7a\x7e\x35\x1b\xbe\xb7\x7d\x9e\xbe\x11\xf3\xab\xd7\xf3\xc5\x68\x71\xb5\x18\x8a\xb7\xd3\xe9\x05\x4c\xf4\x7c\x38\xfb\x7e\x74\x3e\x9c\x7f\x27\xc6\xd3\x39\xcc\xd6\xd5\x7c\x98\x88\x8b\xc1\x62\x00\x2f\xbe\x9c\x4d\xdf\x8c\x16\xf3\xef\xec\xef\xaf\xaf\xe6\x23\x98\xb4\xd1\x64\x31\x9c\xcd\xae\x2e\x17\xa3\xe9\xa4\x27\xde\x4d\x3f\x0c\xbf\x1f\xce\xc4\xf9\xe0\x6a\x3e\xbc\x80\xd9\x9d\x4e\x60\xa8\x8b\x77\xc3\xe9\xec\xa3\x6d\xd4\xce\x01\x4c\x7e\x22\x3e\xbc\x1b\x2e\xde\x0d\x67\x76\x42\x61\xa6\x06\x76\x0a\xe6\x8b\xd9\xe8\x7c\x11\x7e\x6d\x3a\x13\x8b\xe9\x6c\x11\x8c\x51\x4c\x86\x6f\xc7\xa3\xb7\xc3\xc9\xf9\xd0\x7e\x3a\xb5\xad\x7c\x18\xcd\x87\x3d\x31\x98\x8d\xe6\x54\x9a\x6c\x5f\xfb\x61\xf0\x51\x4c\xaf\x16\xe8\xaf\x18\xda\x01\x39\xd7\x05\xef\xd8\x04\x56\x52\x8c\xde\x88\xc1\xc5\xf7\x23\xdb\x6d\xfa\xf2\xe5\x74\x3e\x1f\xd1\x3e\x81\x29\x3b\x7f\x47\xd3\xfd\xef\x18\xf9\xfa\xb7\x9f\xff\x09\xf4\xbf\xc1\x9b\xf1\xd1\x69\xff\xf8\x17\x41\xfe\xc6\x9f\x87\xf5\xbf\xd3\x93\xe7\x67\xcf\x1b\xfa\xdf\xc9\xcb\xdf\xf0\xbf\x7f\x9d\x9f\xc5\x8d\x12\x83\x95\x4c\xd5\x46\xaf\xd0\x1a\x66\xe8\x6f\xe4\xb2\x47\xe8\xd8\xce\x6f\x88\xc3\x0a\x29\x75\xd1\x5e\xee\x35\x81\x65\x9d\x23\x1f\xd2\x8c\xec\x6d\xed\x4b\xba\xf0\xd1\x29\x7f\x03\x88\x84\x7b\x04\x92\x03\xa4\xff\x51\xe3\x45\x79\xd0\x03\x2f\x17\xc5\xfe\xe2\x6b\x9d\x42\x09\x61\x99\x50\xec\x72\xdb\x4b\x87\x16\xbd\xff\xd5\x13\x1a\x49\x08\x4d\xdb\x3d\x70\x76\x79\x9c\xf6\x8f\x9f\x20\x3f\xd6\xdb\x52\xe6\x94\x9a\xc9\xef\x72\x6e\x6c\x1e\x03\x60\xca\x2e\x77\x8c\x64\x0b\xe0\xae\x7b\xd1\x6c\x13\x6b\xd9\x1e\x39\xbc\xd1\xc4\xea\x43\x5b\x55\x01\x98\xb8\xf7\xc3\x43\x5c\x96\x9d\x1e\x15\x25\x1a\x77\x73\xd3\x00\x8a\x68\xa8\xaf\x46\x83\x47\xf8\x86\xad\x56\xe6\x3b\xcf\x0d\x03\xa5\xb1\x6a\x8b\xaa\x50\x23\xb2\x7c\x78\x70\xe1\xff\x04\x34\x87\x07\x3d\x2a\xc8\xa8\xb7\x54\x77\x13\xbd\xe1\x3b\x4f\x78\x67\x3b\xea\x7d\x55\x71\x34\x39\xee\x95\xd5\x91\x9b\xef\x89\x0b\x8c\xbf\xf3\xa4\x72\x68\x5f\x83\x3a\xd8\x6e\x89\x71\x3a\xbe\xb3\x6d\x7a\x4a\x2e\xec\x0a\x00\x77\xec\x7f\x06\x6d\x82\x60\x91\x2f\x25\xd0\x65\xfd\xda\x2b\xcc\x69\x90\x5b\x7c\x3d\xd8\x0a\x06\x8e\x4b\x1a\x20\xb9\x64\x21\x83\x37\xf5\xcb\x41\x58\xaa\xcd\xb2\x48\xb5\xf7\x8a\x35\xa6\xdb\x88\x75\x5d\xe6\x91\x17\x8f\xdb\x48\x18\xd5\x3e\xb1\x8a\x7f\x22\x8c\x22\x0a\xb0\x02\x02\x01\xf6\x48\x19\x99\x75\x6d\xad\xae\x45\x44\xab\x24\x98\x52\xa2\xd5\x02\x22\x3e\x37\xaf\x0b\x72\x52\x8a\x83\xe0\xe3\x10\x05\x6c\x0b\xd5\x32\x65\x83\x2e\x28\x7e\x3d\xa2\x99\x7f\x42\x50\x85\xb0\x24\x91\x2b\xd1\x30\x76\x1b\x00\x38\x46\x46\x57\x50\x7d\x75\x83\x9e\xe7\x00\x94\x2a\x7a\x53\x7b\x1f\x40\xd0\xd4\x84\x25\xe6\x7b\xe0\x33\xb9\xe7\xe1\x2c\x74\x1f\x88\x06\x96\x43\xf8\x70\xfc\x4d\x58\x72\xd7\x21\x7f\xde\x4c\xd0\x4d\x07\xce\x0f\x71\x4f\x90\x5a\x55\x11\x00\x7c\x68\x23\x8a\x65\xa6\xaf\x1d\x40\x23\xe7\x00\xfc\x8c\x61\x60\xf6\x4b\xc8\x27\x57\x2a\x00\xd7\x2d\xca\x5d\x08\xb0\xb0\x92\xd9\xaa\x46\x04\x5f\xef\x28\xd3\xb9\xfa\xbc\x55\xb9\x3d\x1f\x9e\xc5\x2b\xd7\xe0\x79\xc7\x02\xb4\xe5\x0e\x8e\x19\x94\x6c\x79\x3c\x13\x37\x42\x46\xed\x30\x0d\xa1\xd3\x9a\x2f\xf4\x8e\x2e\x5d\xec\xcd\xc5\x6b\x29\xa6\xc5\xa1\x99\x3d\x03\x81\xa8\xc2\xcf\xbf\x88\xf0\x5c\xc6\x98\x51\xf1\x9e\x02\xdb\xb7\x27\x86\x28\x26\xec\xb6\x7d\x83\x5c\xc8\x28\xf3\xe1\xfc\xb4\x8d\x7b\xe8\xaf\x3f\xb9\x2d\x93\xde\x5e\xcf\x91\x49\xdf\xf5\x6e\x7c\x0e\x6e\xf2\x35\xb9\x2c\xab\xd2\x5e\x87\x12\x52\x8b\x4a\x61\x37\x8f\x1d\x05\xfc\x21\xf9\xcb\xdc\x02\xf1\xe6\x65\xdf\x00\xc5\xaf\xf7\xba\x06\xe2\xf0\x4c\x51\xf6\xc5\x84\x0a\x50\x1a\xb0\x68\xc4\x09\x04\xf0\xc4\x6a\x83\x1d\x04\x29\x0d\xe3\xa3\x18\xb4\x9d\x04\x37\xc0\xc4\xaf\x96\x49\x48\xe4\x9a\x04\xbf\x20\x8c\x5a\x95\x0a\x93\xdd\x02\x08\xb5\xbc\x52\x90\x68\x58\xcb\x8c\xa8\x25\x11\xa2\xd5\xed\xc6\xae\xc0\x7c\x03\x6f\x7e\x52\xb0\x78\x0f\x62\x19\x41\xa8\xa7\x29\x81\x21\x30\xb8\x46\x4c\x30\xf8\x03\x4a\x78\x57\x2f\x63\xbb\xd7\xb8\x2f\x3c\x9b\x7a\x10\x32\x49\xf9\xe3\x20\xb3\x9e\x8b\xe2\x4e\xa1\x5b\xb8\x71\xe3\xde\x50\x0e\x88\xdb\x13\xe1\x58\x6f\x31\x19\x8c\xb0\xf1\xed\xc7\xf6\x02\x6a\x86\x65\x1a\x12\xf4\xd1\xe5\x03\xea\xcd\x6d\xa9\x2a\xc7\x80\x79\xa3\x97\x3a\x90\x74\xb0\xa5\x3c\x10\x05\xde\x98\x3e\x53\x1c\x63\x5e\x7e\xdf\xf9\x5c\x99\xdd\x83\x02\xd4\xa3\xe4\x22\x27\x27\x62\x56\x7a\xa1\x99\x05\xd5\xd2\x2f\x7a\xa8\x35\xfb\x14\x95\x0a\x51\x15\x11\x94\x0e\x5d\xa3\x98\x49\xdc\x13\x81\xc7\x5d\xcc\x60\xb7\x05\x99\xc9\xe8\xc6\x72\xe5\xe6\x8d\xeb\xc1\xf6\xb9\xad\x1d\xd9\x6e\xdb\x06\xb0\x5c\x39\x61\xa0\x39\xdc\xca\xbc\x93\x45\x11\x1c\x66\x17\x99\x74\x69\x94\x8f\xdd\x43\x31\x59\x70\xbe\x0b\xb1\x03\xfc\xdc\x73\xa6\x13\x5e\xa1\x5b\xe8\x24\x94\xfa\x10\xe2\x96\x46\x55\xde\x6e\x7c\x22\xf6\x3f\x08\x67\x63\x82\x75\x6d\x07\x7e\x3a\x90\x77\xa4\xd9\x41\x86\xfb\x7d\x6c\x2a\x20\x52\x2a\xcb\x72\x87\xa4\x63\x04\xba\xd5\x7e\xe3\xfe\x5b\x09\x85\xbf\x28\xd5\x4a\x6f\x35\xd1\xb6\xd0\x2b\x60\x3f\xb8\xb2\x93\x6e\x39\xfe\x4d\xcf\x27\x7d\x59\x2d\xb2\x2c\x6e\x55\xee\x0a\x68\x7d\x1a\x98\xfd\x90\xbf\x18\xdc\xd6\x04\xdc\x18\xa0\x87\xfb\xfb\x44\x53\xfe\x55\x87\x18\x77\x8e\x66\x5a\x79\x12\x76\x7c\x8a\x69\xfe\x97\x3b\xff\x22\x7b\x4e\x51\xab\x6c\xea\x91\xf4\xa1\x57\x4f\xe1\x95\x1f\x83\x64\x9b\x3d\x88\x09\xde\x37\xdd\x16\xde\xc1\x45\xe4\xaa\x9d\x0a\x13\x8c\x0e\x7d\xe5\x51\xf7\xfb\xf6\x46\xdc\x27\x4b\xe9\xb4\x84\xf7\x30\x20\xed\x22\xe4\x2b\x17\xc5\x27\x5d\x56\x50\xe0\x4d\xef\x48\x1f\x02\x1f\xbc\xf3\xc0\xbe\x1e\xcc\x47\x73\xe8\xda\x87\xd1\xe2\xdd\xf4\x6a\xc1\x1e\xd4\x8f\x0e\x8d\x92\xef\x2f\x2a\xac\x82\x7a\x20\x94\x80\x3a\xbf\x4e\xdc\x35\x07\xa9\xc9\xcc\x52\x72\xa3\x02\x88\x4e\x3b\x1b\x93\xe9\xe4\x68\x34\x79\x33\x1b\x4d\xde\x82\x57\x32\x69\xf9\x66\x8b\xf2\x51\xd7\x6c\x1f\x1c\x75\xc3\xc9\x62\x34\x1b\x8a\xd9\x68\xfe\x07\x31\x98\x8b\xc5\x14\xfe\xfa\xc7\xab\x01\xbb\xee\xec\x3f\xa7\xb3\xd1\xdb\xd1\x64\x30\x86\x94\x71\x31\x9a\x63\x2e\xf9\xc7\xe9\x55\x1f\xc5\x9a\x73\xf0\xce\xec\x13\x3c\x66\xc8\x4a\xad\x74\x65\x55\x4c\x3b\x4b\xca\xd8\x89\x86\xd4\x4f\x57\x26\x1d\x26\x77\x4d\x8a\xd0\x70\x6d\x2d\x43\xb8\x3d\x71\x25\xe8\xf2\x0c\x96\xa5\x11\xb5\xf9\x5d\x4f\x8c\xdd\x44\xe2\x5d\x24\x97\x3a\x83\x52\xc4\xab\x1c\x43\x1b\x62\xa5\xcb\x55\xbd\xc1\xba\x75\x13\x50\x7b\xe7\x05\xa5\x85\x57\x37\xaa\x28\x77\x89\xe7\xf7\xc9\x45\x55\x94\x95\x38\x74\xeb\x26\x72\x75\x9d\xe9\x6b\xbb\x87\x7a\x09\xee\x5e\xb9\xaa\x3c\xb3\x97\xbd\x25\x12\xba\xb1\xa2\xd3\x03\x78\x3e\x9c\x4a\x0d\x17\x33\xe0\xe0\x38\x01\x86\xb8\x5b\x09\xe4\x99\xe3\x6f\x94\x3d\x0b\x9b\x06\x84\xa6\xfd\x1d\xd5\x5a\xc2\x50\xb7\x13\x9c\xca\x0d\x13\x16\x80\x62\x77\x23\xa1\xf6\xc0\x9e\x55\x44\xcb\x27\x46\x77\x53\x67\xad\x85\xe0\x6c\xe8\xda\xec\xb1\x38\x1e\xd9\xae\xfc\x6e\x20\xfe\x2e\x50\x51\xbe\x2e\x8a\xf4\x4e\x67\x59\x82\x9e\x1f\x53\x15\xdb\x2d\x40\x5b\x38\x56\xee\xb5\xd4\x59\x5d\x22\x20\x90\xcc\x98\x09\x2d\x61\x7d\x8a\x6d\xb2\xa2\x01\xe9\xea\x47\x8a\x2f\x43\x38\x46\x6d\x82\x1e\xe1\x0d\x44\xeb\x4e\x8b\x10\x65\xd7\xfb\x0f\x01\xcc\x5f\x49\x0c\x66\xe2\x52\xc8\x4c\xe8\xfc\xc7\x1a\x2c\x93\xa8\xb6\x80\xd7\xf0\xa9\x09\x56\xbf\xc1\x9e\x1d\xa4\xca\x67\xf2\xce\xa9\x26\x94\x42\xe8\xbb\xd8\x17\xf3\x62\xa3\xc4\x8f\x75\xa9\x4d\xaa\x29\xa5\x82\x6a\x3a\xa5\x2b\xa0\x51\xac\xf1\xc3\x60\xa3\xf1\xf9\xcd\xb0\x77\x2f\x40\x06\x38\xac\xb3\x6f\x07\x73\x91\x5c\x43\xae\xf0\x95\x67\xe6\x63\x51\x63\x46\x2a\x10\x19\x33\x27\xa6\x7d\x6a\x41\x99\x91\x9c\x28\xf6\x31\xc6\x8f\x7b\xc8\x83\x03\xc9\xbe\x8d\x9b\x39\xf1\x37\x3a\xd5\x48\xb9\x1b\x17\x08\xec\xec\x71\x0b\x80\xd0\xa2\x13\x0b\xe8\xb5\x2e\xb6\xc7\xf2\x55\x1a\x43\xc9\xfb\xe1\xdd\x5c\xec\xbf\x8f\xbc\xa6\x09\xf5\x78\xcb\x26\x8d\xd8\x21\xec\x44\xaa\xc2\x20\xb3\xa3\x9d\x02\xed\x6f\xcc\x3c\xb5\x63\xea\x85\x9e\x9f\xb8\x12\x97\x54\x90\x96\x8e\xf2\x90\xcb\x8c\x8a\x73\xd5\x67\xbb\xfb\x49\x47\xa5\x49\x6e\x5c\xe2\x81\xb2\x7e\x42\x37\xba\x4f\x34\x0f\xf2\x79\xd3\xc2\xee\x8b\x86\x24\xdd\x77\x65\xff\xb9\x73\xa0\x1b\x79\xc7\x70\x0a\x50\x99\xb8\xea\xcf\xfb\x31\xdf\x14\x5e\x78\x41\x01\x46\x26\xef\xa0\x2b\x7c\xf6\x6b\xab\x1c\x30\x48\xf2\x72\x87\x06\x00\xee\x45\x2b\xad\xed\xb4\xee\xc0\x53\x54\x02\x06\x4b\x62\xbf\x43\x33\xc6\x80\x80\xdd\x73\x46\x8a\x4b\xe7\xd4\xe1\x07\x90\x27\xae\xec\x3f\xca\x06\x4b\x6c\x2b\xcd\x3e\x80\x0b\xeb\x4a\xf0\xa4\xf4\xe0\x5e\x78\x92\x40\xfe\x90\x27\x71\x40\xc8\x34\x8b\xb6\xcd\xe3\xd3\xa5\xe3\x34\x6a\x9a\x6e\x3a\xc6\xe0\xf9\x80\x4b\xf2\xd1\xbd\x42\xe3\x6e\x56\x8f\x4b\xcf\x66\x48\x83\x46\xc1\x8b\x32\x00\xea\xe7\x8b\x3c\xd0\x5e\x84\x14\xab\xb2\x30\xe6\x08\xae\x60\x14\x44\xb5\x5d\x1b\xf8\x37\x72\x13\x90\xca\xa6\xf3\x75\xa9\xb9\x50\xff\x50\xf7\x84\xbc\x96\x3a\x37\x81\x75\x45\x04\x4e\x50\xfa\x86\x98\x42\xf4\x68\x5c\x7e\xe4\x22\xf3\x45\x29\x0e\x75\xd0\x10\x80\x9c\x60\xc1\xff\x57\x36\xd5\x3e\x6c\x87\x80\x59\xf1\x99\x87\x17\x24\xb0\xed\x11\x6d\x61\x5d\x5c\xd0\xb1\x1b\x59\xa6\xf6\xf7\x1e\x2e\xfa\x49\x4f\xfc\x3e\x90\xf4\x89\xf8\x5e\xe5\x35\x6e\x9a\xb7\xc5\xad\x2a\x01\x1f\x7d\x2c\xef\x30\x03\x5f\x3a\x92\x3f\x48\x83\x43\x92\xac\x00\xbb\x9e\x57\x8b\x7c\x2d\x4b\x80\x63\x20\xbc\x77\x57\xa2\x59\x97\x64\xfb\x47\x77\x0c\x72\xaf\xeb\x3c\xd6\x49\x4a\x65\x74\x8a\x37\xaa\xce\xa9\xb2\x2c\xf4\x9e\xa1\xbf\x86\x60\xf0\x36\xb2\xdc\x89\x65\x6d\x74\xae\x0c\x9d\x48\x2f\x44\xf8\xe0\x82\x75\x12\xbd\xd8\x4f\x2a\xa5\x92\x00\xae\xcc\x51\xb1\x3e\xa2\x7b\xf2\x56\x1b\xac\xbb\x01\x20\x04\xcf\xef\xcf\xf3\x7e\x95\x83\x00\x99\xd0\x6a\x9c\x83\x17\x10\xbf\x90\xdb\x7f\x81\x02\xe6\x29\x46\x47\x91\x88\x98\x4b\xac\x03\x7f\x5b\x14\xa9\x89\x85\x13\x76\x4c\xa5\x38\xf7\x7b\x55\xa0\xa2\xae\xec\x24\x61\x52\xe2\xaa\xd8\xb6\x45\x40\xc1\x38\xab\x2c\x00\xf8\x8c\x3b\xbf\x05\xb3\x95\xd1\xd6\x0b\x8a\x4c\xc8\xba\x51\xb9\xcc\xaa\xe0\x1a\x05\x51\xe9\xa3\x49\x03\xab\x0e\x9e\x7c\x03\x7f\x3e\xef\x8b\x3f\xfd\xdf\xe2\xe4\xf8\x44\xa8\x4a\x18\xf5\x53\xff\xe7\x09\xd1\x7d\x12\x34\xf0\x58\x60\xb7\x4d\x5d\xde\x6a\xc6\x83\x0e\x06\xd5\x85\x10\x77\x72\x0a\xae\x8c\xa2\xcc\xd5\xce\x88\x37\x4a\x61\x0d\x91\xf4\x7b\x1a\x5c\x82\xeb\xa2\x5c\xa9\x07\xee\x1c\xf0\x2a\x2a\x70\xd6\xb3\xae\xe7\xcf\x80\xdd\xbf\x55\x91\xb0\xe7\xff\x56\xea\x0c\x69\x4c\x4a\xa7\xea\x2d\x95\x4f\xf0\x85\x88\x17\x02\x8c\xe0\xbe\x33\x34\xd7\xe8\x53\x56\xe6\x51\x5b\x2c\x50\x4b\x24\x8f\xed\xa9\x58\x2b\xc5\xf2\xdd\x20\x79\x4d\x5d\x12\xcc\x54\x93\xa7\x0e\x53\x43\xdb\xa2\xd3\xce\xca\x76\xab\x24\x5c\x1a\xc1\x97\xfe\xf2\x65\x38\xeb\x89\xf7\xda\xac\x54\x96\xc9\x5c\x15\xb5\x69\xdc\x29\x8e\xa5\xcb\x90\xac\x20\x3c\x65\x7f\xaf\x53\xb1\x86\xa3\x61\x8d\x89\x4f\xed\x12\x14\x6b\x64\x8f\xcb\x77\xfe\xec\xb6\x2b\xa1\x8d\xb8\x51\x19\x53\x57\xd4\x39\x2d\x3d\xf2\xe7\x60\x4d\x8d\x7b\xd6\x2d\x1d\x5c\xe1\x1b\x86\xa3\x88\xb5\xeb\x5c\xad\x94\x31\xc0\x3e\x47\xec\xca\xba\x12\x41\xab\x38\xfc\xe7\x3d\x71\x11\x41\xf9\x1c\x7c\x2c\x6a\x40\x26\x58\x44\xda\x1f\xfe\x99\xe0\x6c\x8a\xba\x49\x04\x11\x18\x7f\xf5\x76\x8b\x84\xaf\x59\x71\x67\xcf\x92\x34\x90\xc3\x8c\xdc\x97\x61\x49\x30\x68\xba\x68\x43\xd2\x55\x14\xa8\x21\x61\x95\x13\xe3\x89\x6f\xb6\x99\xc7\x6a\x0f\x00\x45\xf8\x64\x24\x0d\x8d\xf5\x8d\xed\x84\x6f\x1f\xce\x33\x0f\x8f\x01\x75\xfc\x3d\xe8\x18\x5b\xcb\x22\x33\x09\x95\x8d\xfa\xf8\x20\xe2\xd2\x19\x47\x01\xba\xd9\x20\x3e\x01\x70\x41\x40\x8f\x76\x45\x8d\xef\xf4\x7c\x44\xeb\x26\x81\x4a\x22\x0e\xe8\x19\x8e\xca\xd9\xeb\x1d\xce\xa7\x9d\xad\x84\x4c\x5a\xbc\x5d\xd8\xa8\x05\x37\x1c\x3b\xf2\xf0\x8f\x74\xe7\x6d\x64\x2e\xaf\x7d\x1d\xb2\xdd\x25\x8a\x60\xb3\x79\x45\x96\x3b\x67\x71\x37\x0c\x6e\xd6\x09\x20\x7d\x80\x71\x63\xd7\x7a\x5d\x81\x9d\x0d\xd8\xa3\x87\x2f\x8e\xff\x53\xcf\xa1\xd0\x32\x94\x47\x5d\x01\xda\x13\xf8\x86\x6e\x64\x49\xe5\x64\x87\xda\x36\xb6\x54\xb9\x5a\x6b\xb0\x3d\xa3\x76\x83\xbe\xe1\xc6\x7b\xd1\x43\xef\xad\x1d\xdd\x55\xc8\xc4\xc1\x03\x6d\x85\xdb\x81\x16\x40\xee\xb0\xc8\xc6\xbb\x97\x4b\x65\xed\x2a\x80\x0e\x28\x02\xfe\x0f\x76\xc6\xc5\xb2\x72\xb9\x43\x1d\xda\x6e\x28\x77\x6b\x83\x6f\xd3\x50\xf5\x0e\x78\x2d\x2b\x55\xae\x15\xa5\x5c\x0a\x74\x44\x34\xe1\x76\x61\x40\xb5\x7d\x0a\x23\x6a\xfd\x27\x8b\x90\x2c\x5d\x1b\xd1\xe2\x7b\x3f\xb3\x6a\x0b\x92\xd0\x0c\xfb\x62\x56\x18\x95\xf7\xc5\x20\x73\x95\xf5\x14\x5d\x4c\xfb\x4f\xe2\xc2\x95\x30\x48\xbe\x9f\xbe\x3d\xe2\x6a\xef\x4a\x35\x76\xa6\xbf\xd7\x88\x08\x2c\xcf\xb9\x61\xf9\xb1\xd0\x54\xec\x0e\x22\xe1\x05\xc1\x03\x84\xa5\xfe\x8f\x91\xba\xd6\x7f\x36\xb8\x9c\x8f\x8f\x4e\x7e\xc9\x04\xb0\x87\xf3\xbf\x9e\xbf\x3c\x3b\x69\xe6\xff\x9f\x7c\xf3\xcd\xf1\x6f\xf9\x5f\xbf\xc6\xcf\xe0\xf2\x72\x3c\x14\x97\x57\xaf\xc7\xa3\x73\x31\x9f\x5e\xcd\xce\x87\xae\x54\xd5\x97\x7c\x1d\x8b\x23\xf1\x5e\x96\xab\x1b\x71\xf2\x32\x11\x27\xdf\x7e\xfb\xad\xb8\x44\x64\x6b\xa0\xe4\x8b\xc4\xd2\x4a\x96\x6a\x5d\x5b\x13\x95\x50\x51\x99\xe7\xc1\x91\x25\xb9\x62\x17\xf1\x7a\x17\x7d\x8a\xd5\x07\xad\xef\x25\x1e\xc5\xcd\xaa\x29\x64\x0f\x59\xf3\xa7\xa8\x73\x17\xa4\xd8\xe3\xe7\x61\x56\x21\xf4\xaf\x59\x91\x2a\x73\x70\x7b\xd9\xa6\x1e\xf4\x11\x25\x62\x8b\x63\xa4\x67\x1d\x5f\x45\x51\x7a\x7c\xf5\x90\x68\xff\xa4\xcf\xb5\x3f\xdf\x05\x5a\x48\x53\x05\x6b\x64\xc9\x71\xa5\x52\xc4\xbf\x4e\x86\xd8\x60\xbb\xcd\x94\x38\x27\xaf\x69\x22\x46\xf9\xaa\x2f\x0e\x0f\xe0\xcf\x07\xbd\x80\xf5\x31\xcf\x8b\x1a\x1d\xda\x26\xb6\x34\xb4\xa1\x46\xa8\x18\x89\xe2\x66\xa1\xeb\x02\x5f\xf5\x10\xb7\x3b\xb6\xc0\x34\x39\x70\x4f\x92\x02\xc7\x3d\xbf\xa3\xec\x21\x9f\xd1\x87\x99\x3a\xc4\x3f\x59\x39\x76\x6a\x4d\x34\xa8\x91\x31\x14\xcf\xfe\x43\xfd\xbd\x0d\x76\xe4\x21\xdc\x5a\x8e\x4b\xd4\x57\xc4\x82\x8a\xda\x83\x10\xa5\xae\x3c\x10\x19\x56\x51\xb7\xca\xa2\xfd\x00\x0f\x7d\x2a\x63\x5f\x0c\x0c\x26\x32\x34\x02\xd1\x9c\x50\x77\xd2\x3f\x11\xb0\x0e\xe4\x51\x40\x3f\x8e\x41\x2d\xe8\x95\x38\x94\x3d\x67\x8e\xdb\x1d\x04\xa6\x37\xcf\x23\xaa\xde\x70\xfd\x61\x59\x2f\x27\x19\x58\xdd\x89\x12\x0d\x84\xf7\x9e\x04\xf6\xb0\xf1\x89\x5c\x79\x01\xf8\x97\xb6\x5d\xb4\x3c\xe5\x8a\xb9\x34\x5c\xe8\x0e\x72\x62\x88\xc9\xb3\x2a\xe8\xf5\x76\x49\x40\x4f\xc2\x64\x4b\x8a\xfa\xa3\x99\xd4\x50\xf6\x69\x4f\x74\x04\xeb\xcf\xa1\xac\xce\x31\xcd\x3d\xa0\xa9\x43\xa6\x82\x4f\x3c\x64\xd0\xdf\x3d\x99\x38\x10\xcf\xe5\x5b\x3b\x74\x1b\x7d\x87\xfd\x5e\x76\x4d\xeb\x47\x12\x0e\x5f\x31\xab\x41\x1c\xf1\xaf\x36\xad\xf0\xfa\xaf\x9f\x54\x9d\xa3\x43\xf1\x7d\x98\x8b\x96\x00\xdf\x4c\x0e\xe9\x5d\x8a\x7c\x31\x61\x05\x25\x28\x6e\xd1\x2c\xf5\xdd\x46\x3c\x25\x46\x6b\x40\x84\x8f\xd3\xe3\x1a\xeb\xd5\x7c\x65\x03\xf4\xb0\x58\x37\x16\x82\x1d\xc8\x8d\xe7\x68\x0d\x21\x71\x06\xfd\x6c\x00\x3c\x89\x14\xff\x86\x0f\xa0\xef\xe0\x99\x38\xb8\x50\xdb\xac\xd8\xb9\xae\xd1\xb6\xd8\x8b\x27\x11\x8e\x27\xcc\x57\xb1\x8a\x2a\x4c\x1e\xb9\x30\x32\xd0\x31\xe1\x5e\x02\xed\x11\xeb\x75\xd0\xcd\x38\xfb\xcf\x17\x3d\xf6\x77\x90\x75\xd4\x65\xe2\x87\xe1\x26\xd7\x6a\x6d\xda\xf0\x54\x0c\xbb\xca\xdd\x22\x6c\x21\xe8\x0e\xbb\xc4\x40\x88\x87\x58\xb3\xe4\x69\xb7\xfd\x9e\xfd\xe7\x0b\x1c\x75\x90\x39\xd1\xb6\x8e\xfc\x9c\x10\x0f\xdf\x83\x7d\xa0\xe4\x37\xba\x49\xaa\x1b\x5d\xa6\xe4\x0d\x21\x72\x44\xcc\x8a\x04\xc3\x2a\xf7\x34\x10\x27\xfd\xe7\xe2\x60\x2c\xcb\x6b\x55\x62\xe6\xb5\xe3\x30\x0d\xee\x1e\x02\xde\x33\x8d\xc5\x28\x5b\x0b\x4d\x5c\x63\xf6\x53\x20\xcc\x05\xa7\xa6\x7a\xe4\x5a\x76\x3d\x79\x21\x0e\xa2\xed\x85\x7d\xc1\x65\xf1\x18\x3e\x09\x62\xf4\x31\x7a\x90\xdb\x83\xc4\x22\xc8\x4e\xa1\x08\x91\xfc\x19\x50\x5b\x95\xf5\xaa\xaa\xd1\xd8\x0b\x07\x42\x98\x5d\xd0\xeb\x90\x7a\x5d\x22\x93\x68\x49\x8e\xb8\xb5\xce\x90\x58\x22\xec\xa3\xd0\x06\x25\x7c\xa3\x93\xb0\x5c\x61\x37\x5d\x76\x83\x4b\xc6\x42\x5a\x6d\x92\xab\x76\x85\xc3\x3e\x7d\xc7\xbd\xb6\x62\x0e\x92\x6a\xd4\x1d\x3e\xe0\x74\x03\xe7\xbe\x71\x27\xd6\x85\x54\xf9\x36\x0e\xe0\x92\x9d\x0b\x00\x2f\x76\xc8\x04\x2b\xab\xd6\x54\xb8\xb5\x78\xd9\xba\xbf\xbd\x28\x69\xa6\x1e\xed\xd1\x5b\xa4\x87\x7d\xcc\x88\x65\xdc\x27\xd6\xba\x9b\xb6\x0b\x65\xcf\x7b\xc7\xf6\x64\x3a\x21\x23\x13\x9c\xb1\x7a\x7b\x5d\xca\x94\xcb\xc5\xbd\x2a\xe2\xd1\xe7\x7e\xd6\xab\x1d\x98\xaa\x03\xd2\xf0\x2e\xe2\x20\x55\xc9\xb5\xc1\xa8\x30\x74\x15\xdd\x00\x6b\x39\xac\x14\xe5\xaf\xc0\xa7\x0e\x5b\x13\xe6\xf6\x9b\xbd\x39\xcc\xc8\xaf\xed\xf2\x68\x39\x91\x79\xdf\x0c\x77\x52\xc9\xef\xcf\x6f\x8e\xdc\x8e\x59\x66\xbf\x02\xc8\x8c\x01\x68\x37\x91\x43\x23\x21\x9e\x29\x56\x9a\x92\x68\x2a\x55\xae\xe5\x2a\xc2\xc6\xa6\xf3\x80\xe9\x5c\xc6\xa5\x7a\xb2\xdf\x28\x44\xdf\x43\xc9\x6b\x2a\x99\x79\xd4\x2c\x69\x67\x56\xad\x6a\xec\xf8\x61\x81\x17\xa3\x3d\x84\x3d\x3f\x53\xbf\x23\xa7\x56\x51\xc2\x2f\xe5\xc1\x5f\xe6\x6d\xfb\x6a\x27\x9a\x7f\x5f\x97\x3b\xcd\x6b\xc9\x7f\xa6\x3f\x0d\x82\x8a\x09\xa9\x2c\x2d\xaf\x99\xfc\x5b\x7a\xcd\x96\x7f\x0d\xa7\x19\xfa\x95\xbe\xce\x5b\x76\x4a\x58\x26\x50\x22\x7e\x65\x94\xf9\x4e\x9c\xfb\xc2\xe8\xff\x2c\x66\xe4\x03\x43\xeb\x69\xde\x65\x2d\x34\x00\x74\x5a\xa6\x1b\x9e\xd4\x56\x3d\x46\x42\x04\xc5\x40\x06\x95\xc7\xe1\x4e\xe2\xaa\x6d\xc5\x76\x9d\xdd\xd7\xa1\x52\x7d\x75\x79\x87\xaf\xe1\x88\x95\xe5\x62\x8d\x5d\x7d\x8a\x86\x4f\x6c\x4e\xd0\x28\x5d\x1a\x1c\x28\x94\x2c\x22\x1b\x3d\x79\xa0\xfa\xe7\xb4\x7f\x12\xba\x23\x93\x08\xd6\xab\xe9\x77\x6b\x34\xdb\x2c\xf6\x6f\xe8\x82\xa6\xc8\x30\xcd\xfd\x6b\x15\xb3\x26\xc2\x9d\xcb\x04\xd1\x39\x56\x34\x80\xcc\xc8\x57\xce\xd2\x12\x02\x4e\x07\x15\x74\x13\xea\x2d\x59\x13\x11\x8d\x72\x5b\x7f\x8d\x53\x24\x3d\xc2\x2e\xb2\x57\xa9\xca\x9a\x28\x7b\x00\xf0\xdc\xba\x38\x76\xd4\x98\xe0\xbe\xb9\x0d\xf2\x54\x7c\x52\x6a\x6b\xc7\x0f\x78\xb4\x98\x75\x14\x02\x00\x36\xbb\x26\x89\xea\xa5\x19\xda\xfd\x2e\x18\x37\x98\x3b\x6d\x38\xa2\x66\x5a\xa5\xba\x55\xe5\xce\x7d\xde\xb8\x3a\x23\xf5\x0d\xb7\x73\x58\xde\x12\xa7\xf2\x24\x8d\xb4\x82\x8a\x92\xcb\x31\x7f\x91\x41\x9d\x48\xa5\xcb\xf1\x5c\x87\xef\x43\x3b\x2a\xab\xf0\x11\x76\x65\x77\x26\x9c\xf9\x44\x9d\xa7\x2c\xaf\x5d\xae\x5f\x12\x64\xca\x7b\x2c\x09\x14\xad\x9c\xac\xf1\x32\xac\xe4\xb2\x93\xb5\xea\xb9\x70\x16\xa5\x47\xc8\xd5\xaa\x2e\x31\xff\xd3\x03\x36\x65\x59\xbc\x87\x3d\xd0\x22\xa6\xf0\xca\xd4\x03\x27\x82\x68\x88\x20\xc4\xdf\x47\x58\x17\x9e\x10\xa4\x0a\x48\x7c\x9a\x31\x64\x98\x19\xe2\x1c\x4d\x13\x9f\x7a\x9c\x85\xf8\x92\xa8\x18\xca\xb2\xf4\xfe\x95\xb0\xd4\xa4\x41\xcd\x18\xda\x62\x22\xad\xd1\x92\x25\x66\x25\x2a\x42\xc9\xc5\xf0\x33\xa6\xc6\x0f\xdc\xd9\x42\x65\xb2\xb3\xd4\x08\x03\x8d\x8d\x11\x3a\x1e\x9b\xd3\xfe\xa9\xdb\x15\x68\xcb\x45\xfb\xea\xcf\x3d\xd4\x5c\x69\xe4\xb9\xe8\x42\x81\xee\xcb\x0f\x4e\x5a\x59\x1d\x7b\x92\xd4\x23\x75\x3a\x3e\x48\x98\x69\x96\x65\x28\xa7\x70\x10\x2a\x6d\xec\x05\xef\x51\x73\x9a\xa3\xce\x9b\xc9\xe6\x1b\x71\xab\x65\x08\x04\x1b\xd9\x68\x87\xaa\x7f\xdd\xf7\x77\x06\xd2\xae\x88\x3b\xb5\x14\x46\x57\xaa\xf7\x68\xd6\x15\xb8\xcc\xe2\x1b\x8f\x8d\x64\xba\xc6\x8c\x02\x8b\xb2\xba\x09\x73\x97\xce\x90\x70\x2e\xc8\xfa\x22\xc3\x44\x66\xf4\xa2\x8f\x31\x3a\x9b\xb5\x57\xe0\x6c\x37\x8e\x55\x50\x7d\xe0\x29\x8f\x0b\x8f\xab\xdf\x98\xf5\x87\x66\xd3\x4f\x62\xa3\x3c\xcb\x1e\x06\xda\x46\xcd\x55\x03\xf1\x70\xa7\xb2\x5b\x25\x0e\x4f\x4e\x7b\x62\x53\xe4\xd5\x4d\x50\x99\xc0\x47\x12\x34\x52\x99\x51\x33\x78\xb3\x80\x8e\x06\x18\x20\xda\x50\x42\xd4\x77\xb1\x80\x80\x61\xd9\x13\xb2\xde\x05\xee\x30\xf6\x30\xb0\xf9\x4c\x97\x09\x95\xfb\x51\xba\xe1\x43\x03\x5d\xee\x1c\x43\xaa\xbd\x23\x69\x09\xad\xd8\x72\xa4\xa9\x4c\xda\x17\x1e\xea\x35\xb8\xaf\xad\xdd\xe1\x21\x43\xa4\xed\x55\x7f\x55\x6c\x9e\xe1\x5e\x44\xdc\x9b\x67\x91\x66\xdf\xbf\xa9\x36\x59\x53\xfc\xa5\x3d\xa1\xd7\xe1\xcc\x46\xb3\xaa\x73\x11\x68\xdb\x49\xa8\x86\xa3\xc1\x91\x67\xbb\x10\xfb\xce\xd7\x47\x30\x8c\x8d\xcb\x2e\x4a\x15\x51\x9b\x85\x9e\x0c\x9d\x63\x9e\x86\x6a\xdc\x2f\x49\xec\xfe\x7d\xe4\xc8\x02\xe0\xb4\xdb\x34\x5f\x55\x52\x10\xce\x67\x91\xc3\x9a\xa1\x53\x5b\x95\x2a\x58\xbd\xe6\x4d\xc5\xa8\x38\xb0\xaa\x50\x44\x47\x98\xb7\x04\xad\xcc\x26\x0b\x9d\x27\xa4\xaa\xc9\x03\x7f\x44\x70\x2e\x5b\xa9\x75\x6d\xbb\xa3\x21\xf7\xa0\x60\x24\x50\x4d\x63\xef\x2c\x4a\xc3\x70\x33\xca\x66\xa9\x70\xa8\x68\x36\xab\x83\x61\x48\x7b\x74\xc9\x87\x0a\xd5\x18\x0f\xbd\xbb\x9c\x18\x74\xe7\x96\x3f\xd7\x63\xc3\xc6\xe0\x83\xbc\x07\xdb\x9e\x4e\x5e\x76\xe0\xb9\xc0\x64\x2a\x4c\xc9\xa9\x88\x17\x91\xb5\x61\x37\xb9\x91\x7c\x32\x70\x1b\xd8\x27\x4e\xfb\xa7\xcd\x23\xb0\x7c\x6c\x66\x31\x19\x7b\x69\x74\xaa\x65\xd9\x39\xb1\xa0\xcd\x77\x29\xf3\xae\x38\x1b\x1b\x2a\x4b\x75\x5b\xac\xba\x8a\xb3\x7f\xdd\xe9\xc7\x73\x4c\xa9\xf5\x3a\x53\x09\x97\xb3\x27\x5c\x0b\xef\xf4\x7c\x48\x4d\x0c\x8b\x94\x0e\xad\x54\x76\x93\xf3\x8c\x90\xff\xc3\xf9\xe9\x45\x3e\xda\x86\xa1\xd0\xe5\xc5\x0e\xdc\x8e\x89\x23\x8b\x72\xcc\x2e\x95\x26\xcd\xba\x85\x4f\xf5\xbc\x2f\x02\x7f\x64\x00\xc0\x4d\x69\xd3\x32\xfc\x18\xad\xd9\xcd\xb2\xed\x41\x0b\x53\x32\x7f\x9e\x43\xb2\x9d\x7d\xa0\xa2\x57\xa2\x5f\x10\x39\x26\xa8\x8a\x15\xe4\x85\xd7\x0c\x59\xc5\x69\x26\xb7\x13\xd5\x7b\x23\xe5\xaf\xf5\xfa\x12\xd8\x5f\xed\x2d\x42\x18\xcd\x5d\x17\x23\xb8\xf0\xd0\xfd\x1a\xb9\xd9\x5f\xf4\x83\xca\x17\xd0\xcc\x9b\x08\x05\x0f\x57\x4b\x39\x4d\x0b\xe0\x37\xc9\x48\x0a\xcb\xad\x92\xce\x4a\x26\xdb\x69\x16\x7d\xce\x39\xc6\x85\xac\x0d\x55\x00\x37\x58\xb8\xc8\x44\xae\x85\x18\xd9\x81\xb6\x12\x97\xbf\xd2\xd5\x8f\x6d\x87\x51\x51\xfb\x34\x1e\x71\xa2\x48\xb2\xa6\x28\x98\x70\xa5\x72\xfb\xea\x25\x70\x16\x73\xcb\x0b\xbb\xf2\xfd\x7d\x8a\x50\xc2\x15\x74\xab\x1b\x20\x90\x97\x62\xad\xe0\x76\x4c\xb8\x1e\x0b\x20\xb0\xb7\x76\x01\xa0\x46\x47\x6d\x72\x5d\xed\xb0\x3c\x83\x6b\x4a\x7c\xb9\xbc\x89\xe1\xda\x9c\x05\x0f\x0c\x30\x8e\x04\xab\x91\x52\xda\xd0\xf5\x7c\x79\xde\xe1\x41\x73\x1c\x07\x00\x5e\x11\xb2\x6a\x07\xa5\x0f\x2d\x6f\xb7\x83\xd2\xe6\xc1\x63\x25\x40\x81\x1c\x71\x78\x96\x8b\x3b\x47\x8e\x46\x97\x1e\xfc\x19\xe6\xd5\xa5\x0b\xc1\x30\x19\x8f\xb5\x8a\xf8\xd4\x70\x61\x02\xfd\x31\x28\xd4\x70\x7d\x7b\x6a\x82\x5c\x43\x34\x17\xf3\x1d\x9e\xa0\xe6\x08\xb1\x0e\x11\x0a\x77\x59\x06\x62\x80\xcc\x5b\xa9\x21\xce\x02\xa6\x3a\xc1\xaa\xc0\x85\xa4\xd6\x0a\x54\xe1\x14\x80\xed\x78\x77\xca\x72\x03\x74\x14\x5c\x73\xe5\x97\xce\xe5\x71\x62\x88\x8f\x62\x78\xc8\x8c\xa6\x52\x97\x6a\x8e\xed\x2c\x19\xbb\x80\xbd\xd3\x9d\x23\x60\x62\x96\xef\x1b\xd0\xdd\x1e\x74\xdd\x6d\x65\x86\xfc\xe6\x38\x35\x6d\x9e\x08\xad\xbb\xc5\xa6\xd3\x86\xf8\x8e\xb0\xb3\x19\xdd\xfb\x2b\x11\xb3\xa7\xf9\xaa\x69\xb5\x76\x20\x4b\xe3\x2d\x17\xc1\x67\xef\x41\xcd\x4e\x02\x12\x38\x6f\x48\x00\xba\xe4\x9e\xe2\x13\xcf\x36\xef\x4f\x29\xd0\x1f\xf8\xa3\x6a\x1f\x87\xb9\x8e\x3b\xda\xd1\x1c\xae\x4a\x2b\x3f\xa0\x39\x89\x11\x6c\x31\xed\xe0\x09\x1d\x2c\x1f\x79\xe4\xdd\xd3\x80\xca\x08\xa0\x40\xc8\x2d\x19\x15\x19\x44\xf2\x1b\xaf\xb2\xae\xba\x52\x66\xfd\x98\x4c\x7d\x35\xe5\x74\x26\xe6\x57\x97\x97\xd3\xd9\x02\xb3\xe2\xe3\xe1\xf2\xa4\x12\x18\x3d\xb2\x88\x60\xd8\x18\x42\x3c\xdb\x52\x1d\x51\x4c\xcb\xea\x25\x95\x32\x15\x84\xb0\x4b\x38\xb4\x98\x9d\x83\x7f\xc4\x70\xc9\x63\xef\x50\x65\x59\x94\x2e\xa0\x54\x67\x29\xf9\xa2\xa9\x8e\xcf\x15\xe4\xc1\xe5\x2e\x2b\x49\x4c\x71\x98\x7a\xa1\x73\x97\x66\x5c\x94\x41\xb7\xd1\x3d\xb3\xd2\x8a\x64\xb2\xbf\x99\x02\xae\x60\x14\x45\x78\xbe\xed\xdb\xbb\x92\xf4\xd1\x05\xd1\x7d\x3f\x82\xa7\x1e\x5d\x12\x24\xca\x40\xdd\x44\xde\x99\x52\x9b\x4f\xfd\xb8\xe6\xf5\x7c\x7a\x11\x23\x33\x86\x78\x8b\xed\x3a\xdf\xab\xcb\xb7\xb3\xc1\xc5\x70\x1e\xac\x97\x98\xbe\x01\x40\xbd\x3f\x8c\x26\x88\xeb\x87\x29\x56\xee\xb7\xa7\xcc\x05\x30\x9d\x1d\xce\x7b\xe2\xf0\xcd\x74\x86\x20\x7a\x58\xa8\x0b\x70\x82\x73\xe6\x16\xfb\x1d\x3c\xf7\x6d\xf2\x48\x23\x83\xd9\xd0\x51\x92\x7d\x3f\x1c\x7f\x14\xb3\xe1\x9b\xe1\x6c\x06\x88\x86\x62\x30\x17\x07\xf0\xd0\x41\x8f\xd1\x22\xc7\x1f\x5d\x15\xaf\x18\x8c\xc7\x21\xf4\xe3\x60\x72\xf1\x0c\xb1\x13\x2f\x46\xd0\x87\xa4\x03\x62\xf2\xcf\xc5\x95\x6c\x35\xde\x85\x34\x69\xa7\x72\xb0\x18\xcd\xdf\x0c\xce\x17\xd3\xd9\x47\x57\x9e\xfc\x75\x08\x94\x93\x0b\x31\x99\x4e\xc2\x7a\x69\xc2\x31\x9c\x5d\xc0\xf7\x3f\x0a\x80\x9e\x9c\xf7\x69\x4a\x2f\xa6\xc3\x39\x74\x9f\xba\x29\x16\xef\x06\x80\xaf\x2d\xde\x5c\x4d\x68\x15\xce\xa7\x93\xc5\x60\x34\x19\x5e\x88\xd1\xa4\x63\xbb\x7c\x18\x8d\xc7\xe2\xfd\x70\xb8\x40\xb0\xf6\xd9\xf0\x8f\x57\x23\x04\x90\x9c\x23\x24\x23\xb7\x38\xbd\x1c\xce\x90\x9e\xab\x59\x6a\xed\xdb\x79\x3d\x14\x57\x13\x87\x15\x39\xbc\xb0\x0d\x0c\x67\xb3\xe9\xec\xe8\xcd\x6c\x38\xf4\xed\x5d\x0c\xdf\x0c\xcf\x17\xf3\x07\x7a\xf4\xda\xee\x89\xd9\x6c\x78\xbe\x18\x5e\x80\x70\x99\xce\x06\x63\xfb\xfc\x87\xd9\x68\xb1\x18\x4e\xc4\x68\xf2\x66\x3a\x7b\x4f\x1d\x9a\x01\xa8\xe3\xf9\x50\xbc\x1d\x7d\x3f\x9c\x88\xd7\x1f\x69\x7e\x00\x80\x93\xb7\xdf\xd5\xe2\xdd\x74\x36\xfa\x87\xff\x8f\xbd\x7f\x5d\x6e\x1b\xc9\xb6\x45\xe1\xef\xb7\x9e\x22\x83\xf1\x75\x58\x5c\x01\xa1\x24\xf9\xd6\x55\x75\xf6\x89\xa0\x29\xc8\x66\x2f\x89\xd4\x22\xa9\x72\x79\x9f\x38\xb1\x0b\x24\x92\x12\xda\x20\xc0\x06\x40\xc9\xec\x37\xda\xcf\xb1\x5f\xec\x44\xce\x4b\xe6\x4c\x00\x94\x64\x57\xb9\xaa\x7a\xb5\xb5\x2e\x51\x96\x48\x20\xef\x39\x2f\x63\x8e\x11\x9d\xa9\x69\x64\xd6\x44\x34\x9e\x0f\xcc\x8a\x23\x72\xcf\xe1\x34\x1a\xcc\x23\x35\xf0\x8e\x31\xc1\x2f\x39\x1a\x9b\x4f\xcc\x22\x68\xf1\x6c\x38\xb9\x72\x1c\x93\xfc\x8d\x90\x52\x31\xee\x00\xb0\x6c\x07\xfe\xf1\x44\xea\x5e\xc0\xad\x61\x75\x4d\x1c\x43\xbf\xf1\xaa\x6c\xde\x31\xdf\x2e\x33\x1d\x97\x6a\x15\x2f\xcd\x5d\x8f\x95\x30\x69\xb9\x2c\xe3\x55\xad\xf2\xf8\x8e\x4c\x36\xf0\xa2\xd6\xdb\x9c\xf3\xfc\xd5\xae\xaa\xf5\x1a\xe1\xe0\x31\xb2\xdf\xac\x56\xe9\xd2\xa6\xf5\x88\x03\xa9\x72\x95\x53\x80\x4a\x82\x1c\x0c\x17\x38\x77\xc5\x82\xf1\x04\xcd\x00\x39\x59\x60\x09\x72\xd0\x2c\x40\x46\x3e\x75\x63\xb3\x69\xb5\xb9\xdd\x55\xa0\xb3\x59\x94\x4a\xe7\x77\x69\x59\xe4\x6b\x2c\xff\xc5\x1a\x19\xd6\x91\x71\xf5\xee\xe4\x14\x7f\x1f\x9e\xa8\x91\x40\x51\xd9\xba\x8d\xce\x66\x2d\xf4\xb2\x58\x13\x19\x14\x47\x20\x8b\x55\xac\xa8\xc0\x6f\xd5\xa8\xe3\xeb\x0d\x20\x93\xa6\x13\xff\x31\xbd\x7e\xe0\xcc\x9a\x40\x01\xe6\xaf\x65\x9c\xa3\x37\x0c\x0a\x19\x04\xa5\x70\x35\xaa\x9b\xb2\x58\x5a\x9f\x09\xad\x66\x87\x28\xa3\x44\x13\x27\x9d\xc1\xa8\x60\xc4\xa8\x56\xdd\x2d\xfa\x11\xe3\xbf\xee\xaa\xee\xfe\x18\x56\x4c\x5b\x8c\xa2\xab\xa9\xa4\x6e\xa7\xf9\xcd\x8f\x90\x2e\x5d\xf6\x45\x51\xe6\x07\xa1\x61\xe3\x04\x77\xf7\xbc\x42\x66\x1f\x25\x3b\x05\x94\xff\x72\xe0\x63\x53\x58\x85\x48\x8b\xc5\x64\x9c\x03\x7e\x9d\x33\x97\xe4\x14\x51\x68\xd9\x22\x03\x20\x2b\xbf\x22\x47\x4d\xaf\x25\x5a\xa4\x0b\x83\xf3\x7d\x78\x8a\x47\xb7\x3d\x99\x2c\xa1\x6c\xa8\xae\xc7\x67\xd1\xd4\x9c\x1d\xc3\xd1\x74\x78\x7d\x39\x9b\x0f\xc6\xc3\x68\x46\xdb\x1d\x0f\x85\x36\x59\x6f\x27\x35\x2f\x33\xf7\xee\x27\xe6\x65\x42\x5a\x62\xa1\x9d\x98\x93\xf4\x62\x30\x37\xbf\x02\xa2\x0a\x27\xa2\x63\xfe\x06\x47\xed\x35\xfe\xf7\x68\xcc\x77\xc7\x7c\x02\xbf\x6b\x9d\x88\x81\xa2\xb6\x99\x1b\xda\x74\x73\xfe\x2e\x9a\x46\x93\x73\xc7\xac\x8b\x3d\x1d\x08\xfa\x5d\x47\xb4\xeb\xee\xfb\xfd\xec\xba\x7d\x60\x0e\x3e\xbb\x36\x67\xb2\x1d\x40\x8f\x72\x57\xd0\xe7\xc2\xc0\xbd\x1b\xcc\xd4\x9b\x28\x1a\x3f\x9d\x4d\x77\x46\xd7\xdb\xdc\x18\x22\x66\x2e\xa0\x0d\x70\x57\x0d\x46\x17\xd7\x53\x38\x4e\xa3\xd9\x8c\x06\x96\xef\x44\x32\x48\xcc\x95\x74\xf6\x01\xc2\x16\x79\x01\xfc\x4c\x35\x95\x5e\xf1\xd2\xab\x0b\x73\xa8\x38\x97\x88\xe2\x99\x2b\x92\x5a\xe3\x8a\xbc\x0e\x66\x14\xfd\x69\xa9\x89\xf7\x26\x5e\x17\x5b\x4c\x6c\x23\x8e\x20\x29\xb2\x2c\x2e\x2b\x75\xf8\xff\x7f\x79\x1c\x1e\x1f\xf7\xad\x54\xd2\xdc\x12\x47\x35\x10\xd2\x56\x7a\xa6\x8b\xa1\x8b\x77\x98\x4f\x45\x86\xb4\x5c\xc8\x6f\x46\xf8\xe8\x80\xfe\xc3\xe2\xa7\xcd\x6f\x2e\xe3\xa5\x9a\xcc\xd4\xcf\xf2\xbf\xd5\x4c\x97\x77\xba\xec\xf9\x6c\x5e\xfb\x9f\xbf\xd0\xe6\x60\x20\x14\x3a\x41\x87\x59\x62\xf4\xce\x6c\x67\x7a\xef\x65\x8c\xac\x98\xa4\x5d\x22\x7e\xf9\x2b\xa8\xd2\x1a\x87\xb6\x19\x4b\xe1\xa6\x78\xf9\xd2\xc5\x8e\x40\x38\x8a\xd2\xb0\x4e\xae\x4a\xc5\x98\x09\x35\x4e\x23\xc9\xf7\xd9\x35\x20\x50\x84\x8e\x21\x6a\x0b\x0a\xf2\x37\xdb\x34\xd1\x19\x5c\x79\x4e\x83\xd2\x9c\x57\x7a\x7f\x1a\x03\xc0\x36\xdf\xb9\x6f\xae\x8a\xf2\x79\x99\x50\x64\x1b\x32\x19\x54\x27\x1d\xaa\x09\x63\x46\xd8\x31\xc6\xa4\x7f\x05\x4d\xe5\x40\x14\xca\xe5\xd8\x3a\x56\x5d\xed\x25\x3f\xda\x8f\x61\xb5\x6a\xf1\xa8\x4f\xda\x88\x60\x30\xc2\xde\xff\x4e\x8f\xd0\xa4\xe8\xe8\xb7\xff\xee\xb4\xc5\x16\xcd\x52\xfd\x26\x22\xbf\xed\xfe\xef\xbb\x27\x03\xe1\xf9\x72\x64\x68\x6f\x03\xba\xa0\x6d\xd8\xc1\x3d\xf4\x67\x48\xb2\xe4\x61\xbc\xfd\x3c\xbd\x88\x92\x51\x2d\x99\xa5\xec\x01\x2d\x73\x58\x44\xa1\x5d\x3a\x1e\xcc\xc3\x8b\x54\x63\x5f\x1a\x12\x95\x12\xe9\xea\x85\x5f\xbb\xe1\xb6\x6e\x74\xf7\x8d\x27\xd6\x21\x87\x1e\x5d\x09\xc3\xca\x4e\xc3\x13\x9f\xc6\x64\xde\xa5\x94\xd8\xc1\x8d\x85\xa3\x8a\xd2\x7e\x7c\xeb\x37\xd2\x39\xfe\x6c\x33\x52\x86\xb9\x86\x5d\xf8\x32\x45\xe6\x94\x15\xc9\xa5\x61\x05\x28\x95\x7f\x12\xac\xc2\x12\x60\x35\x1a\x67\xbf\xb3\x2d\x69\x05\x2c\x4a\x88\x3d\x13\x0c\xf9\xf9\xb1\x4a\xe2\x1d\xf8\xdf\x60\xc6\xc1\x98\x22\x23\xc1\x4a\x7e\xbe\x89\x2e\x11\x46\x08\x53\xaa\xdc\x11\x2c\xa9\xcd\xbd\x42\x54\xa8\x5e\xcc\xb8\x02\x23\x93\xa2\x55\x27\xcf\xc3\x57\x87\x8b\xbe\x31\x93\xfc\xbc\xeb\xe7\x8d\x10\xec\x06\x18\x91\x74\xad\x55\xb2\x2d\xa5\x76\x5a\x3b\xca\xd4\xa6\xa9\xd8\x4b\x3e\xe1\x05\xf1\xc4\xda\x38\x55\x11\x59\x56\x2b\x7f\x95\x5c\x03\x31\x8b\xfb\x0d\xc6\xb4\x5c\xbc\x51\x8c\x5f\x55\x17\x1b\xcc\x7e\x6c\x4b\x38\x91\x1f\xd9\x01\x9d\x6b\xbe\x19\xf5\x87\x1d\xbc\xc7\x5e\x95\x95\x10\xe6\xab\xa2\x34\xdc\xcf\xe9\x7f\x1f\x9e\xd8\xe0\x76\xa2\xab\xba\x2c\x76\x0d\xdc\x54\x57\xb2\x61\xcf\x5b\x0f\xfd\xd7\xd2\x18\x3e\xf8\xf2\xbe\xab\xaf\x48\x73\x14\x55\xda\x00\x7b\x13\xd3\x1b\x91\x43\x85\xd5\xa3\x2e\xe3\x64\x29\x7c\xfc\x93\x00\x6e\x1e\x48\x65\x61\x68\x12\x32\x68\x99\x2b\x28\x45\xb2\x50\xf3\xd5\x16\x11\x03\x97\xd2\xf3\x76\xdb\x57\x4a\x0f\xdc\x7c\x29\x69\x24\x9a\xf7\x05\x94\x3d\x4a\x4b\x95\xc7\xf5\xb6\x04\x82\x2f\x70\xe3\x9c\x24\x24\x19\xe7\xa4\x1a\xfd\x48\xb5\xbe\xdf\x20\x89\xd2\x5d\xe0\xce\xc0\x2a\x05\xb4\x0f\xec\x5e\x7b\x1e\xa8\x97\x81\xfa\x6b\xa0\xbe\x0f\xd4\xc9\x71\xa0\x4e\x4e\x02\x5c\xbe\x66\x76\x4f\x84\xca\x0b\xde\xdf\x1c\x00\x76\xac\x63\xb5\xd5\x96\x5e\xc1\xb8\xaf\x37\x3a\xaf\x62\xe6\x27\x10\x29\x8d\x06\xa7\x58\x55\x94\x35\x83\xfd\x9a\x6c\x62\xdc\x49\x2e\xdb\x93\x4a\x7b\xcb\x65\x51\x26\x60\x71\x60\xb6\x9e\xf9\x71\x68\x3d\x3e\x30\x3e\xdc\x76\x3e\x2c\x36\xa5\xfe\xfb\x36\x21\x67\xc8\x99\x69\x54\xb0\x5b\x9a\x79\xd0\x09\x78\xb6\x72\x08\x88\x14\x21\x6c\x90\x22\xf0\xce\x7f\x1e\x9e\xa8\xe8\xd3\xc6\x74\xee\x22\xbe\x57\x83\xaa\xda\x96\x70\xd6\x85\x1e\x08\x8e\xea\x41\x5c\x91\xb6\xc6\xef\xc0\x6b\x8f\xe8\x1f\x6d\xdb\xc3\x81\xd8\x90\xf9\x3e\xfd\x27\xb1\x20\x21\x9d\xc9\xac\x06\x3c\x7b\x16\xdf\xdb\xfb\xc7\x71\xa8\xf8\xfc\x60\x2e\xc2\xd0\x51\x2e\x15\x57\x94\x69\xd1\x09\x18\xf7\x2e\x32\x8f\x25\x5a\xfb\x58\x06\xdb\xe1\x5e\xba\x5f\xb1\x43\x98\x86\xb6\xfd\xd3\x09\x55\xb5\xd5\x05\x94\xde\x01\xb5\x8e\x65\x11\xb1\x4c\x32\x70\x77\x60\xf9\x02\x30\x98\xe8\xf5\x22\x2e\x6f\x0a\x90\x6a\xdd\xe6\x75\xb9\x63\xc4\x31\xce\x22\x84\xd9\x73\x47\x78\x32\x2f\x75\x5c\x6d\x4b\x40\x99\xc5\x65\x4d\x2a\xe0\xac\x9e\x34\x43\x3a\xbc\xcc\xfc\x99\x90\x77\xcc\x0a\x13\x67\x15\x23\x0b\xe1\x41\xee\xfb\x68\x4a\x00\x85\x9c\x31\x52\xe6\xb0\x15\x8a\x95\x3a\xd3\x79\x1a\x67\x6a\x52\x26\x20\x78\xfc\x66\x27\x02\x09\x0d\xaf\xdd\xac\x05\x5b\x7a\x81\xf8\x12\xcc\x08\x3a\xb8\x1b\xab\xb1\x67\xc5\x92\xb2\xaa\x81\xc5\x82\x63\xb4\xa8\x58\x05\x24\x7d\xdc\x3d\x68\x2e\x8d\x24\x46\xaa\xc8\xdd\xaf\xcd\x28\x88\x95\x7b\x4a\xfc\x41\xd0\xc7\x28\x07\x20\x75\x49\x91\xfc\x16\xa8\x46\xf5\x04\x8b\x5e\x5a\xeb\x75\x0f\xea\x8f\x1c\xd7\xef\xf9\x60\xaa\x4e\xc3\x93\xe3\x93\x50\x3e\xd6\xf2\x1a\xe1\x6e\x5d\xde\xe6\x10\x87\x4a\xe2\x3a\x66\x5b\x89\xae\x83\x06\xda\x08\x71\x44\x58\x1c\x08\x76\x26\xe7\x3f\xb7\x95\xb1\x04\xca\x54\x4a\x12\x7b\x84\xfe\x8d\x76\xf9\xc7\x32\x18\x6d\xfc\x8c\x9d\x64\x06\xcc\xdc\xa1\xd3\x68\x27\x18\xed\xdc\x0f\x49\xf0\x99\xe6\xac\x8e\xd0\x38\xa5\xcc\x58\x98\x53\xf5\xe4\x44\x1d\xce\xed\xc3\xce\xe2\x3a\x46\x67\x0e\xfe\x76\xaa\x0e\xd9\xb1\xb4\x22\x97\xf0\x67\xa4\xbe\xf2\xd7\xdf\x99\x5e\x51\xb2\xa9\x5c\xde\xc6\x40\x3d\x73\x06\x23\xfe\xf2\x34\x3c\x3d\x7d\x7d\xf4\xfa\xf8\xe4\x65\xf3\x5d\xea\xe8\x88\xd7\xad\xe9\xe0\xa8\xd6\xeb\x0a\xdf\x7f\x7a\xfa\x3a\x7c\x7d\x7a\x7c\x7a\xf4\x5c\x1d\x4e\xed\x2c\x88\xcf\xb6\x1a\x66\x96\x52\xfb\x97\x9e\xee\x65\x3f\x54\x03\x18\x87\x34\xbf\xc9\x76\x48\x1b\x0c\x3b\xa9\x6b\x95\x71\x59\x64\x17\xfa\xa2\x35\xe7\x0e\xaf\x48\xd8\x00\xb7\x86\x9f\xab\xa9\x26\x5d\x77\x2a\x15\xb8\x22\xc7\xd0\xb7\xcf\xa5\xf5\x0f\x3c\xa3\xe5\x16\x8b\xb5\x20\xa9\x86\x0e\x84\x8a\x6f\x74\xbe\xdc\xa1\x5a\x34\x39\x92\x81\xfa\x7b\x91\x42\xf2\x2f\xaf\x89\x6f\xd2\x5d\x1d\x5c\x69\x83\xe5\x20\x5c\xfa\x02\x4c\xf7\xc4\x6d\xc7\xa5\x9d\x60\x2e\xba\xac\xb3\x6d\x8d\x3b\x13\x68\x09\x63\x91\x85\xa4\x0f\xb5\x49\x2d\xb0\x20\x00\x3a\x61\x95\xf2\x00\x51\x8e\x94\x72\xe2\x72\x11\xc3\xf3\x42\x8d\xf2\x44\x6f\x74\x0e\x47\xc4\x99\x73\xaf\xf6\x13\x65\x43\xdb\xd2\xf5\x26\x4e\x4b\xeb\x97\xd9\x74\x25\xcd\x5a\xe0\x30\x4b\xe4\xb2\x05\x68\x4f\x41\x1b\xac\x1f\x87\x31\xc4\x3a\x00\xf6\x6e\x5d\x77\xd5\xee\x9a\x05\x5b\x64\xc5\xcd\x8e\x42\x17\x18\xb2\x80\x43\x51\x4a\x71\x00\xd8\xab\x28\xad\xcc\x34\x13\x7e\x56\x2a\xae\x7c\xde\x54\x34\x49\x6a\x4d\x25\x33\x0d\x78\x91\x84\x8f\x04\x0f\xbe\xdd\xc2\x1c\xb8\x7f\x0e\xb0\x86\x9d\xf1\x3a\x22\x86\xfc\xa5\x7a\x1f\xa7\x77\xba\x84\x8a\x14\x2c\x1f\x04\x47\xe0\x9c\x02\xfa\x16\xe7\x22\xe8\xac\x1e\x66\x42\x92\x6b\x97\xc8\xe7\x63\x75\x0f\x2f\x81\x20\xd9\x16\x56\x26\x3d\x6b\x6d\x9d\xaf\xb8\xf6\x57\xab\x7d\x01\x92\x95\x19\xab\x01\xee\x8f\x9b\x2d\xd5\x57\xa1\x7d\x40\xa7\x9b\x20\x89\xce\xe2\xfc\x66\x1b\xdf\x50\xd9\x9e\x2d\x03\xb2\xa4\x4b\x62\x3f\x91\x77\x04\x38\xdb\x12\xeb\x9f\x6d\xeb\x2d\x4d\x68\x67\x1d\xe7\xf3\xf0\x95\x9a\xe9\x3b\x5d\x5a\xc6\x5d\x63\x2c\x8c\x56\x16\x67\x41\x68\x89\x18\xe9\xe9\xb8\x72\x51\x83\x8b\xe6\x59\x3a\xab\x34\x4f\xaa\x87\x87\x34\x10\x65\xa8\x2e\xcf\xdb\xc9\x34\x85\x4b\xd1\x7f\x90\x6e\xd9\x98\xf4\x15\x7b\x13\xad\xe3\x4f\xe9\x7a\xbb\x66\x54\x22\x53\xc5\x18\xc3\xa1\x2a\xa0\x22\xa4\x60\x6b\x1f\x5c\xe6\x65\x91\x17\xeb\x74\x49\xf5\x4f\x04\xf6\x43\xd6\x77\x7e\x25\x05\xbc\x02\x17\x6a\x00\xbf\x21\x69\xeb\x68\x63\xab\x6c\x76\x83\xb5\xe6\x79\xa9\x25\xf4\xe6\x10\xac\xa8\x71\x51\x9b\x9d\x62\x6b\xb1\xb0\xfe\xa7\xd4\x37\x05\x90\x9a\xa5\xab\xfd\xac\xb4\xa2\x40\x03\xc1\xe1\xe0\x87\x23\x36\x80\xcb\x67\x49\x9a\x11\x4c\xae\x06\x61\x95\x03\x64\xf2\xa7\x9f\xe3\x36\x84\x00\x02\x66\x91\xec\x54\x10\x38\x6a\xe5\x09\x9d\x9b\x2b\xc2\x89\x29\x77\x9d\x62\xce\xb9\x16\x2c\x98\x5c\xa0\x02\xf5\x05\xe2\x23\x49\x5a\xd9\x41\x8b\x7d\x3a\xbf\x76\x0d\x4c\xa7\x17\x9c\xd6\x4f\x75\x54\xdd\xb2\x7f\xad\xce\xd2\xca\xdc\xab\x6a\xaa\xab\x22\x43\x48\x23\xee\xd0\xb4\x66\xe5\x14\x8b\x02\x4b\xe8\xb3\xa5\xfd\x6c\xf7\x5d\xb3\x9f\xf8\x91\x48\x41\xe3\x8f\x44\xd0\xc1\xf6\xd7\xb8\x80\xa0\x43\x6e\x9a\x83\xd1\x5e\x63\xf6\xc6\x59\xba\x2a\xca\x3c\x8d\xdd\xe5\xe5\xde\x41\xe0\x29\xe0\x0f\x76\x57\x98\xcd\x43\x7a\xbb\x92\x91\xd0\x77\x1a\xd7\x24\xd5\x5b\xd7\x3c\x23\x2b\x9d\x80\xe6\x31\x91\x4f\x52\x54\x0a\x46\xd3\x36\xa8\x5d\xc3\xe1\x9b\x76\x7f\x0c\xf5\xa3\x9b\xca\xbf\xaa\x08\x61\x21\x03\x06\xa8\xfd\xd8\xa4\xe8\xf4\x8c\x12\x49\x78\x8e\xab\x1d\xbe\xdd\xa6\xc8\x15\xfb\xbf\xb3\x90\x65\x0f\xc7\x5e\x07\x19\xec\x42\xb7\xe0\xac\xd2\x65\xf4\x1d\x4b\x3e\x69\xe0\x9f\xcd\xe5\x40\xbe\x29\xcc\xd0\xa2\x40\xc7\xd9\xfd\x1d\x8e\x0a\xc1\x04\xc8\x9c\x9d\x28\xf0\x10\xdf\xf3\xa8\xbd\xf7\x08\x38\x9c\xef\x83\x5d\x36\xc7\x2e\x11\xe6\xfe\xd7\x56\x2f\xf4\x32\x50\xc3\x38\x8f\x93\x38\xf0\xeb\x14\xd5\x12\xc4\xa7\x99\x19\xe7\x07\x58\x0b\x3c\x60\x6e\x95\xae\x52\x30\x27\xf0\x5a\xdb\xa1\xc5\x52\xea\x7f\x6c\x11\xc7\x44\x7f\xe8\xe0\xe5\x6d\x16\x26\x54\x70\x13\xc3\xfd\x06\x6d\x8d\xf2\x9b\x2c\xad\x6e\x43\x75\xa1\x2b\x57\xff\x91\xd7\x4a\x7f\x4a\x6f\xb4\xfa\xc7\x56\x2b\x40\xfd\xa2\xa5\x87\x17\x68\xad\xb4\x99\xbe\x6d\xa5\x32\x5d\x89\x27\x03\x01\xe4\x27\x10\x91\x05\x95\xa2\x52\x27\xe9\x8d\xae\x94\x36\x7e\xdc\x4d\x16\xa7\x55\xa8\xa2\x9f\xdf\x8d\xde\x8c\xe6\x6a\x10\x1e\xf4\xae\x98\x4c\xc1\x57\xfe\x07\x86\xa5\x4e\xf6\x9f\x41\x96\x91\x4c\x88\x39\x70\x90\x5f\x0d\x57\x8a\xa4\x16\xa8\xda\x59\x10\x73\x42\xb7\x90\xf8\x8d\x4f\x79\x9e\x97\xad\x8a\x27\xc5\x07\x59\x91\xf4\x10\x47\x8f\x64\x8d\x02\x11\xbf\x67\xf4\x97\x67\xfd\x76\x54\xa5\xb6\x2d\xa7\x05\x89\xc4\x27\x9c\xa6\xb2\x18\x59\x17\x98\x43\x4a\x26\x82\x96\xc6\x9e\xec\x94\x9d\xf8\x27\x54\xd4\x50\x25\x69\x9c\x98\x53\x9f\x88\xaa\x04\xf5\x94\x69\x52\x78\xd0\x06\xc5\xf1\x9a\x72\x1a\xc1\xd6\x88\x94\x5c\xb8\x12\xd6\x2d\x3f\x81\x02\x12\xcf\x00\x52\xf6\x4c\x2d\xe2\x2a\xad\x82\x16\xaa\x4c\x02\xc8\x02\x15\x8d\x20\x3d\xdd\x85\xc1\x72\xe0\xb2\x77\xd1\x34\x7a\xe3\x30\x5d\x33\x00\x75\x41\xe2\xb8\x53\x0b\xd8\xbe\xd2\xe5\xfd\x03\x02\xe9\x3c\x20\x01\x1c\x3c\x8e\xbe\x9a\x4c\x5b\x6a\x15\x76\xca\x2a\xad\xbd\xb1\xe1\x23\xdb\xea\x3f\x5b\x43\xf5\xc6\x1e\xba\x42\xfe\x23\x13\x00\xf7\xd6\x40\x87\xbd\x7f\x0b\xb2\xbe\xaf\xf0\x13\x7e\x77\x9d\xb3\x76\xd1\xd7\x22\x00\x7c\x44\xff\xff\xf4\xf4\xd5\xeb\x06\xff\xdf\xe9\xab\x57\x2f\xbe\xf1\xff\xfd\x1e\x3f\x70\x75\x98\x03\xaf\xd4\x9a\x08\xbd\x75\xbe\x04\x44\xb8\x16\x71\x33\x4b\x90\x03\xf1\x5f\x11\xad\x4b\x0a\xe3\xc6\x84\x07\x03\x8c\xe5\xf2\x93\x88\xd4\xd3\xd5\x87\x11\xcc\x3a\x60\x02\x02\xaa\x56\xaa\x74\x86\x8a\x26\x4d\xe6\x4f\xc7\xfd\x47\x2e\x43\x9a\x2b\x3a\xb9\x97\xb6\x0e\x17\xab\x4a\x63\x7e\x5c\x42\x12\xfd\x81\xf5\x3a\x89\xba\x36\x90\x91\x42\x00\x41\xe7\x47\xee\x37\x56\x5a\xc0\x7c\x03\xf8\x38\xc2\x83\x51\xde\xd0\xe7\xa0\x82\xfd\x65\x71\x93\xa7\xff\xd4\xbe\x86\x01\x71\x69\x61\x90\x1f\x1a\x85\x42\xb7\xd6\xb3\x13\x8a\xf2\xa4\x29\x20\x69\xa7\xa4\x8a\x93\x43\x34\xd4\x82\x5d\x50\x75\x8e\xb9\x7a\xaf\xb9\x2c\x17\x48\x79\x13\x36\x9d\xf9\x64\x25\x77\xd4\xba\xa0\x14\x5f\x35\x6d\x2e\x09\x59\x4d\x0f\x4e\x74\x5d\xa6\x1c\x7b\x30\x6e\xcf\xad\x4e\x4b\x38\x77\x0f\xaa\x2d\x08\x2d\x16\x65\x05\x2f\x44\xbc\x65\xeb\x95\xe8\x7c\xc7\xb9\x32\x47\x77\xad\xe2\x25\x89\x71\x64\x69\xfe\x8f\x6d\x5a\xdd\xae\x31\x15\xcb\x65\x74\xe4\x0d\x9a\xde\xcb\xa8\x3a\xc5\x42\x84\x1c\x9f\x37\x7a\x1c\x4f\x17\x43\x1f\x1e\x00\x94\xb4\x4b\x52\x9f\x80\xdb\x8f\xde\xaf\x0f\x81\x9b\x3b\xb0\xcd\x00\xb7\xfa\xb5\xf7\x64\x07\x4a\x79\x9f\x58\x3e\x62\x6e\xbb\x34\xf1\xe1\xaa\x0f\x2c\x34\x8c\xa1\x66\x7b\x64\xe3\x07\x63\x35\x18\x32\xc2\xcf\x41\xdb\x00\xd0\xe6\xa3\xd4\x18\x87\x77\x3e\x9d\x5c\x06\x02\x8d\x87\xda\xf3\x63\x84\xa6\xa3\x28\x94\x37\xf8\x84\x63\x27\x4c\x1e\xb6\xe5\x2c\x1a\x5c\x8c\xc6\x6f\x2d\x4c\x99\x3f\x1c\x1e\x9c\x73\xd9\x92\xa8\xe0\xb5\x8c\x9b\x96\x19\xe3\xff\x22\x43\x6e\x6b\x2f\xa9\xa2\xbc\xf9\xee\xff\xfe\x76\xdb\xff\x56\x3f\xe1\x77\xe3\xf9\xd5\x57\xd4\x7e\xff\xff\x3d\x7e\xff\x9f\x3c\x3f\x39\x6e\xf2\xff\x3e\xff\x76\xff\xff\x3e\x3f\xe3\xf9\x95\x13\xfc\x19\xcf\xaf\xfa\x07\xbe\x27\x7a\x68\xff\xf9\xae\xc8\x12\x5d\x56\xe3\x78\xad\xfb\xea\x10\x54\x68\x5f\x1c\x25\xe9\x4d\x5a\x1f\xed\x74\x5c\xf6\x8f\x0e\xe7\x85\xff\x1b\xc9\xfb\xcd\xb5\xcb\xbe\x55\xd0\xc5\xf9\xed\xe5\x1c\xd3\xba\x6a\x10\xd6\x34\xae\xf6\x16\x41\xd1\x4a\xeb\x36\xc9\x78\x93\xa0\x04\xae\xeb\x45\x71\xd7\x21\xc9\x8b\x59\x99\xaa\xc1\x2d\x64\x9d\xe1\x45\x41\x1e\x69\xfb\x8b\x7c\x2d\x0a\x66\x71\xef\x99\x60\xc2\x60\xfd\x28\xe8\x5b\xf8\x3c\x09\xf6\x0d\x35\x09\xf5\xaa\x43\x0b\x90\xd5\x09\x8e\x3a\x65\x11\x98\x98\x36\x4e\xcc\x65\x9b\x32\x55\x24\xde\xef\x29\x52\x77\x31\xc1\xa0\x94\x3d\x16\x61\x35\x3b\xc8\x3c\x6c\xec\x85\x05\x8e\x20\x1d\x60\x34\xae\x33\x61\x47\x83\x8c\xf9\x01\x50\x79\x9f\x98\xb0\x32\x83\x4b\xbc\xeb\xc8\x53\x47\x78\x62\x6f\x7e\x1b\x33\x19\xaa\x51\xed\xe5\x67\x7b\xb1\xb1\x4c\x7b\x2d\x31\x60\x57\x82\x6c\x0b\x73\xff\x3d\xb8\xda\xbf\xc6\x4f\xf8\xdd\x70\x3c\x1d\x1d\xfd\x6d\x57\xdf\x16\xf9\x57\xba\x07\x1e\x39\xff\x5f\xbf\x7c\x71\xda\xf4\xff\x5e\xbf\xf8\x76\xfe\xff\x2e\x3f\xc4\x5b\x8e\xb1\x66\xaa\xae\x18\xbc\x9d\x46\x58\x39\x97\x56\x5e\x10\x7b\x58\x94\x9b\xa2\x74\xe7\x30\x43\x6f\x20\x14\x09\x6c\x6f\x23\xa0\xe5\xa9\xd3\x3b\x5d\x41\x4e\x99\x52\xf3\xc5\x6a\x95\x22\xea\xfc\xe4\xaf\xdf\xbf\x54\x57\xc6\xc9\x29\x72\xf5\xfe\x36\xad\xb5\x3a\x2b\x01\x01\x37\x85\xdf\x05\xea\xa7\x81\x3a\x3d\x3e\xf9\xfe\x44\x1d\xf6\xcc\xd2\x64\xdc\x35\x46\xf7\x25\xff\xe3\x44\x32\xed\x5a\xf2\x6e\xdd\xeb\x93\x36\xbc\xcf\x28\xff\xb7\x2b\x58\xe2\x82\x42\xfc\x24\xfc\x24\xbc\xca\xa2\x24\xef\x11\x5d\x4b\xbe\x7c\x04\x23\xa6\x7f\x0f\xc5\xe2\xa4\xb2\x45\xfa\x0c\xad\xe8\x61\x95\x03\x71\x1d\x7e\x01\x81\xa1\xcb\x41\x04\xca\x8c\x42\x83\xc9\x90\xfb\xda\x26\x30\x31\xff\xac\xcb\x38\xaf\x56\xba\xc4\x14\xa8\xcf\x63\xe2\xe8\x0a\xa5\xfc\xaa\x60\x14\x89\xf3\x38\xdb\xfd\x53\x07\x50\x1f\x6c\x59\x44\x44\xf2\x7f\x93\x71\xb9\xfa\x32\x33\x8e\x7d\xa9\x37\xe8\xda\x5a\x65\xc3\x7b\xcc\xcf\x37\x69\xe5\x5c\x92\xdf\xa9\x38\xf3\x55\x2f\x78\xaf\x51\x31\xda\x3e\x8c\xe6\xcb\xdd\xe0\x81\xba\x65\x32\x03\xb8\x2f\xcd\xf0\x3c\xeb\x18\x38\x78\x27\xfd\x91\xee\x61\xc8\x3a\x5b\x25\xec\x34\xd4\x61\xa0\x7a\xad\xc8\xfb\xab\x23\x08\xbf\x7f\xd6\x62\xff\xb1\x2b\x30\xdf\x83\xf8\x2f\x58\x0c\x58\xc9\xe0\x72\x23\x33\x1b\xde\x78\xbc\xeb\x3c\xc4\x89\x13\x69\xd6\x98\x79\x1f\x64\x94\xed\xba\xd3\x48\xdf\xa4\xb2\x54\x6f\x21\x95\xb3\x67\x50\x02\xb7\x74\xd6\x31\xd6\xc7\x63\x0a\xab\x91\x91\x01\x99\xee\xc3\x42\x52\x58\xfd\x63\x5b\xd4\x40\x09\xb3\x6f\x22\x00\xa4\x86\xfa\xde\x15\x2f\x14\x80\xe3\x4a\xbe\xbb\xcf\x9d\xf7\xce\xce\xff\xa0\x7a\xbc\x9d\x0f\x7f\x92\xfb\x19\xc4\x27\x1b\xd4\xbf\x9d\x62\x03\x8d\xdd\x97\xe6\x7b\x47\x8c\xce\x46\xb7\xac\xa8\x76\x87\x93\x5d\x84\x5e\xc4\xc4\xa3\xae\x05\x88\xd0\x8d\xe6\x36\x4f\xff\xb1\x45\x12\x21\x66\xff\xb0\xbc\xc2\xa5\x3a\xfc\x98\x17\xf7\xa8\x80\xae\x6e\xe3\x3c\xc9\x74\xff\x07\x38\x27\xc3\xd3\xd3\xef\x4e\x8e\x8f\x5f\x61\x72\x54\x4a\xff\x01\x29\xc2\x42\x5b\xdc\x27\xd3\xcc\x6d\xca\xe2\xd3\x4e\xc1\xea\x2b\xb9\x65\xef\xf5\xa2\xb3\x51\xd7\xd3\x8b\x1f\x38\x4f\x72\x9b\x64\x21\xbe\x3a\xcc\x75\xfd\x9d\xf7\xf2\x1e\x51\x65\x8d\x64\x7d\x80\x5d\x45\x34\x3d\xa6\xed\x8d\x13\xc0\xd6\x23\xa2\xc4\x29\xa6\xc1\xd3\x7c\x49\xdb\x4a\x57\xfe\x52\x60\x63\x30\x46\x28\x2d\x62\x3a\x10\x6a\x49\x62\xae\x96\x82\xae\xf9\x22\x37\xd7\x2d\x24\x61\xe3\x88\x86\x40\x5d\xee\x5a\x2f\xf9\x43\x2a\x22\x10\xc1\x00\x5d\x2a\x80\x97\xf7\xa0\x59\x0b\xe9\x26\xb9\x98\xef\x52\x84\x84\xdc\xc7\xbb\x80\xac\xf6\x5a\xd4\xfc\xae\xdb\x15\x47\x75\xc1\xcb\x6c\x26\x75\x43\x5e\x84\xfe\xae\xe4\xe4\x18\x1c\xfc\xfb\xea\xd0\x24\x64\x9c\x37\x43\x51\xc2\x77\xa8\xad\xae\x7a\xab\xe2\x73\xfe\xa1\x42\x33\xa8\x37\x2e\xef\x58\xc6\x9f\x5b\x64\x89\x15\x44\x61\x58\xa3\xbd\x7c\x9c\xc3\xbb\xb8\x2d\x1d\x6a\x78\xfc\xa5\x67\x55\xc7\x46\x17\x22\x0c\x7b\x16\x4c\xe3\xe0\xb4\xea\x13\x74\xa8\xc0\x35\xc5\xe7\xc2\x11\x3e\xe3\x7f\xb5\x7f\x02\xa8\xf3\x73\x5a\x89\x4c\xa0\x04\x83\x0d\xa7\xc7\x47\x47\x42\xce\xc7\x94\x5c\x60\xb6\xeb\xbe\x1a\x3c\x24\xf3\xe8\x31\x97\x83\xff\x04\x52\x01\xaf\x4a\x1e\xd8\x0e\xa6\x5e\x42\xae\x1d\x7b\x0c\xd5\x1b\x2c\x95\x9f\x9c\xab\xe8\xe7\xc1\xe5\xd5\x45\xd4\x20\x58\xa0\x6c\x9d\xff\x9e\xc1\xf8\x4c\x26\xff\xa0\xd8\x53\xbe\x59\xbc\xf8\xc3\x1e\xca\x05\x2f\x66\x39\xfe\xb0\x27\xbb\x67\xa9\x0c\xae\x67\x11\xd7\xab\xda\x00\x20\xb0\x0e\x98\x86\x72\x5c\x13\x1e\xd4\x41\xbd\x40\xd4\x4c\xd0\x07\x8c\x74\x9a\x6f\xb9\x08\xe7\x7c\xc2\xb6\xa8\x08\x25\x5e\xcf\xa2\xe9\xac\xf5\xce\x07\x6a\x8e\xf7\x57\x1a\x4f\xa6\xea\x62\x32\x9b\xa9\xc1\x4c\x0d\xd4\x34\x9a\x5d\x5f\x40\x8c\xf3\x7a\x06\x7c\x16\x97\x93\xb3\xd1\xf9\x07\xa8\x44\x9e\x9a\x51\x9d\x4f\x47\x6f\xae\xe7\x5c\x69\xcb\x6f\xb6\x15\xc5\x67\xd1\x74\xf4\x13\xb2\x20\xd8\xa2\x62\x5b\xe8\xbb\xbf\xb2\x97\x3e\x1b\xaa\xd9\xe4\x32\x52\xb3\xf9\x60\x1e\xcd\xd4\xd9\x04\x46\x62\x70\x71\x31\x79\x0f\xdf\x90\x85\xd9\x53\x15\xfd\x3c\xbc\xb8\x9e\x35\xab\xb4\xd5\x0c\x83\xd2\x83\x37\x93\x9f\x22\xa9\xce\x7f\x39\xf8\x80\x8f\xbb\xba\xba\xf8\x20\x07\x95\x79\x89\xe6\x9d\x16\x27\xdf\x70\x16\x73\x05\x77\x2f\x4c\xd6\x61\xda\x6f\x17\xae\x73\xc0\x40\x96\x73\xc1\xa7\x09\xd3\xbe\x8e\x6b\x5d\xa6\x71\xc6\x25\x6b\x04\x5c\x71\x07\x4c\xba\xea\x38\x3e\xe9\xc3\x29\x71\xed\x73\x65\x3e\xa9\x37\x2d\xe0\xe0\x5a\x6f\xcc\x39\x0c\x95\x1f\xa9\x4e\x7e\xb4\x12\x80\x55\xfa\xa9\xde\xa9\xc3\x57\xc7\x7d\xac\x8a\x73\x97\x5e\xab\x8d\xde\x86\x5e\xa9\xd8\xb5\x16\x1f\x8b\xea\x01\xd0\x16\x68\xa8\xbb\x3a\xe2\x8a\x30\xc0\xf8\xf6\xae\xaa\x3c\x34\x8b\x4c\x63\x8e\x92\x18\xc2\x32\x69\x91\x30\xdb\xcf\x9e\xc1\xef\x04\xfa\xd8\x72\xd7\x4d\xa9\x09\xb5\x82\xc8\x16\xc0\x11\x55\x02\x0b\x64\xe9\x7d\x19\xf4\xf3\x53\x5a\xde\xa4\x0c\xf9\xb1\xda\xc6\x08\xe7\x21\x34\x8f\x27\xc1\xdb\x04\x16\x77\xb4\x8c\x50\xac\x4e\xd5\x1c\x01\x9e\x3e\x90\xbb\x13\x8d\x5d\x94\x0d\x40\x36\x7b\x97\x30\x17\x4e\xc5\x50\x5b\x4e\x8b\x37\x3b\xb5\xcc\xd2\x25\x9c\xc9\x64\xd0\xf4\x06\xc3\x61\x74\x35\xef\x99\x1b\xa0\x66\x5d\x63\x7b\x73\x23\xcd\x11\x08\x85\x83\xf8\x00\xe0\x20\x8d\xd5\x4f\x51\x32\xe9\x85\x34\x0f\x7a\x61\x1d\x3b\x93\xa0\x5b\x67\xec\xa9\xee\xdb\x9f\x3d\x32\x65\xf5\xff\x4e\xff\x38\xfd\xbf\x97\xcf\x5f\x34\xe3\x3f\xc7\xc7\x27\xdf\xe2\x3f\xbf\xc7\xcf\x23\x48\xae\x50\x9d\x84\xa7\x7f\x84\xb6\x1d\x46\x96\x3b\xf8\xb8\xff\x75\x25\xeb\x4e\x1f\x93\xac\xfb\x0d\x14\xe8\x28\x04\xf1\xeb\x75\xe8\x88\xfe\xb0\x58\x59\xed\xb4\xdf\x50\x7a\x8e\x78\xe4\xfe\x5b\x4b\xce\xfd\xb6\x03\xe8\x89\xcc\xed\x1f\xbe\xaf\x23\x2e\x97\xe3\xc0\x15\x42\x8a\x67\x47\x38\x71\xa4\xa4\x12\x82\xd3\x60\x10\x54\x16\x2b\x0f\x03\x6e\xeb\xb8\xb1\x5a\x0b\xb3\x50\x9d\x3a\x03\x20\x16\xf7\xe7\x56\xb3\x7b\xf1\x87\xa9\xd9\x71\x53\xaf\x18\xa1\x7f\xcd\xe2\x55\x7f\x2a\x85\xbb\x3d\xcd\xfc\x13\xa8\xde\xbd\xfc\xd3\xa8\xde\xbd\xfa\xfd\x54\xef\x3a\x76\x0e\x5e\xcd\xfa\x2e\x2d\xb6\xd5\x17\x6f\xa3\x7d\x0f\x78\xe2\x7e\xfa\xa6\xbf\xd7\xd6\xdf\x7b\xbd\x47\x7f\x8f\xd5\xc1\xbe\x69\xf0\x7d\x89\x06\x9f\xbb\xc7\x81\xfc\xc2\xa9\x60\x38\xd8\x28\x2c\x96\x96\x98\x11\xe4\xac\xbe\x64\x20\x3d\x2d\x3b\x79\x0c\xf2\x84\x52\x69\x5a\xf3\x54\xf3\x15\xee\x84\xb4\x96\x79\x36\x1a\x0c\xb6\x3c\x2b\x50\x1b\x88\xa0\x6a\xa2\x17\x93\x80\x56\x46\x54\x54\xa1\x1a\xc8\x47\x3e\xeb\x7e\x73\x9a\xcb\x17\x2c\xe3\x4d\x0c\x20\x92\xb8\x72\x99\xdb\x32\x50\x7a\x0d\xd2\x27\x3a\x50\x6b\xbd\x5e\x98\xdf\xa4\xa2\x36\x99\xcb\x4a\x09\xff\x7a\xc3\x94\x06\x6a\xe9\xb2\x68\xc1\xfe\x5b\xe4\xf0\x21\x7c\x6e\xdf\x11\xc2\xfd\x63\x1b\x67\xa0\x59\x56\x79\xd7\x8b\x1b\xf0\xef\xbf\xc9\x2c\x3e\x51\x66\xf1\xe4\xf8\x9b\xce\xe2\x37\x9d\x45\xa1\xb3\xf8\x6f\x2b\xb3\xc8\x69\xfb\xaf\x24\xb6\x28\xb0\x15\x7b\xb5\x59\x7e\x5f\x0d\xc6\x6e\x0b\xdd\x47\x48\x3e\xa2\xdc\x66\x2b\xb0\xff\x7d\x74\x19\xbb\xc5\x86\x48\xe6\xee\x9b\x48\x63\xb7\x48\x63\x97\x80\xe0\x67\xed\x8a\x27\xa8\x0d\x3e\x75\xa9\xfe\x9e\x6a\x83\xf6\xa5\x56\x9c\xb1\x79\x22\xa5\xb5\x33\x6b\xe2\xcc\xd8\x25\xe6\x6a\x4d\xab\x9a\xb0\x04\x5f\x2e\xe3\xd8\x15\x01\x82\xb3\xcd\x5e\x6b\x56\x02\x0a\x0c\x0d\xbc\xf2\xca\x72\xd7\x52\x7d\xab\xfc\x48\xa8\xe9\x14\xfa\x9e\x78\x48\xe3\xb7\x9b\x62\x99\x66\xf1\xe1\xa7\x1a\xe2\x7b\xbe\x2e\xd2\xbe\x86\x3f\x5d\x99\xf1\x11\x7d\xb8\xa6\x3b\xf3\x59\x2a\x8a\x7f\x98\x60\x21\x96\x48\x13\xb7\xe0\x06\x4e\xa2\x78\x81\xec\x16\x32\x7c\xf9\x19\x2a\x8c\x4e\xa8\x12\xdc\x98\x47\xf4\x29\xbb\x65\x05\x3f\xfc\x2a\x59\xc1\x8e\x73\xf2\xdf\x42\x5f\x10\xce\xbd\xe7\x4f\xd7\x36\x89\x33\x73\xbf\xdf\xdc\x8a\x70\x39\xec\x77\x11\x81\xe5\xd5\x5b\x4b\xf9\x41\x3c\x58\xd2\xb2\x33\xe0\xd2\x35\x0c\x4d\x46\x2e\x90\xfd\x8a\x2d\xf9\x21\xd2\x3a\xf3\x19\x6b\x1d\x5d\x8a\xea\xc8\xd6\xd8\x82\x05\xef\xf1\xf6\x5c\xe3\x70\x3a\x31\x60\xa0\x25\x56\x3e\x49\x06\x6f\x25\xa8\x8f\xc8\xa2\x7d\x68\x58\xd8\x44\x68\x68\x3a\x09\x02\x73\x8a\xc7\x2f\x40\x93\xae\xe6\x72\x4f\xf9\x02\x87\x3b\xf2\x38\x63\x61\xef\x3e\xd4\x54\xc9\xdd\xa5\x06\x4d\xa9\x48\xe9\x2f\xd5\x8e\x62\x18\x4b\xda\x1b\xfa\x91\xe2\x6e\x95\xea\x56\x55\xb5\x5d\xeb\x2e\x1d\x2e\x88\xbd\x68\xe0\x04\x76\x9d\x79\xb0\xb1\xb9\xd6\x80\xdc\x4c\x61\x7c\xd1\x4d\xd3\x9f\xe2\x35\xf0\x9b\x99\x5f\x7a\xf1\x54\x5f\x8a\x0d\x03\x75\xa4\x63\x5a\x17\xe6\xc8\x2e\xee\x39\x14\xdb\x38\x9f\xfc\xfb\x1a\x53\x68\x28\x95\xd0\xea\x00\x53\xc9\xc1\x5a\xe2\x57\x11\x23\x83\x8b\x03\xd3\xe8\xb5\x02\x67\xbf\xbf\x86\xe7\x1f\x24\xe0\x29\xbd\x94\x27\x4c\xf4\xa1\x48\x34\xe0\x34\xf6\x3f\x57\x5b\x72\x9f\x5d\xf6\xc7\x8b\x7d\xfe\x99\x95\x3e\xff\x3c\xf3\xf4\x4d\xf1\xf3\x9b\xe2\xe7\x37\xc5\xcf\x6f\x8a\x9f\x5f\x5b\xf1\xb3\xc3\x30\xfc\x73\x8b\x80\xc2\x1d\x04\xe1\x18\x69\x42\xfe\x56\xd2\xa0\x80\xf1\x69\x98\xa7\xdf\xe4\x42\xbf\xc9\x85\xfe\xae\x72\xa1\xde\xa3\xbe\x8e\x5a\xe8\xde\x57\xfc\x29\xc5\x42\x5b\xa2\x1a\x5f\xae\x15\x3a\x9c\xfc\x14\x4d\xa3\xb3\x3f\x40\x2a\xf4\x09\x12\x9f\xea\x29\x72\xa2\x7d\x7c\xc5\xc5\x05\x12\xc1\x8c\xde\x5c\xcf\x27\xd3\xd9\xbf\x82\x38\x68\x00\xdd\xe9\x50\x07\x85\x3f\x3c\xc6\xbb\x03\x1f\x1a\x0c\x87\xd7\xd3\xc1\x10\xbf\xf1\x5f\xd7\xa3\x68\xae\xa2\xf1\xdf\x26\x1f\x2e\xa3\xf1\x3c\xf8\x7c\xfd\x50\xf3\x85\x68\x30\x7c\x27\x87\xb2\x2d\x2a\x3a\x78\x3b\x18\x8d\x67\x73\x05\xc2\x9e\xe7\xd1\x34\x1a\x0f\x23\xa4\xd0\x01\x1d\x3b\xdb\x00\xae\x14\x91\x6b\x2c\x78\x92\x24\xa9\xb7\x2a\x1f\x54\x24\xdd\x2f\x47\xda\x7e\xc6\x17\xaa\x91\x76\x3e\xe8\xd7\x8b\x91\x06\x4f\x91\x22\x65\x76\x24\x31\x1d\x7b\xd4\x49\x1f\xd0\x1a\x6d\x46\x0d\xff\x75\xa4\x46\xfd\x4b\xe4\x6b\x29\x8d\xee\xd3\x8b\x24\x7e\xac\xe8\xe7\xb9\x59\xcc\x66\x07\x5c\x4d\x27\x40\x77\x1a\x9d\x99\x69\xbc\x18\xbc\x0f\x3a\x88\xae\x84\xd4\xac\x3f\x73\x7f\x56\x71\x49\x7f\x7f\xfe\xf9\xb4\x25\xe1\x8e\x69\x1c\x4a\x7f\x94\xde\x24\x14\xb8\xfd\xed\x7a\x3a\x9a\x9d\x8d\xe8\xf4\x7a\xb0\xce\x4d\x96\xb6\x4d\xce\xc5\x84\xef\x9d\xdd\x00\x4b\xe0\x60\x0e\xed\x73\x5a\xd5\x6f\x1f\x26\xd7\xbf\x81\xf8\xe5\xa1\x2f\xb7\x48\x66\x8b\x8d\x8b\x2e\x76\x0d\xc6\xf5\xfe\x7f\x57\xb9\xcc\x40\xf5\xfe\x6b\x9b\x2e\x3f\xce\xd3\xb5\xf6\xfe\xa1\x66\x75\xa9\x63\x90\xa0\xfb\xca\xca\x9a\x24\x43\x94\x4b\xa5\x4a\xef\x91\xfe\x13\x5b\x4e\xea\xf8\x2b\xa9\x72\xfe\xb7\x94\xe4\x6c\xe0\x83\x5a\x81\xf3\x2e\x54\x67\x2b\x4f\xf3\xd9\x8a\x9e\xfb\xb5\x3b\x9b\x4e\xf6\x37\xd1\xd0\x7f\x25\xd1\xd0\x6f\x5a\x9d\xea\x77\xd7\xea\x04\x7d\x9b\x6f\xfa\x9c\x4f\xd4\xe7\x7c\x82\x42\x6d\xcb\xde\xfe\x3c\x91\xcd\x6f\xaa\x98\xad\xfd\xf3\x95\x54\x31\x8b\xbd\x82\x98\x9e\x1c\xd8\x7f\x53\x41\x4c\xae\x3c\x79\x8a\x1a\xe6\x37\x4d\xc1\x5f\xa9\x29\xf8\x4d\x4d\xb0\xfe\xa3\xd4\x04\x4f\xff\xdc\x6a\x82\xe6\xe3\xeb\x22\xbf\x81\x1b\x74\x5f\xe6\xec\x0f\x50\x19\x7c\xfe\x4d\x65\xf0\xf7\x56\x19\x7c\xf1\x54\x95\xc1\x2e\xcc\xdd\x37\xe1\xc1\xca\x57\x6c\xfc\x26\x3c\xf8\x4d\x78\xf0\xdf\x4e\x78\xf0\xd5\x37\xe1\xc1\xff\x2e\xc2\x83\xaf\xbf\x09\x0f\x7e\x13\x1e\x6c\x0a\x0f\xfe\x9f\xff\xed\x94\x07\xff\xcf\xff\xfe\x12\xe9\xc1\xff\xf3\xbf\x13\xf3\x98\x2f\x12\x1f\x3c\x3a\x3d\x3e\x3e\x79\xba\x02\xe1\xc1\x9f\x54\x81\xf0\xf4\x9b\x02\xe1\xbf\x97\x02\x61\xd0\x44\x74\x7c\x93\x24\x7c\xf8\x27\xfc\xee\xe2\xea\xea\xe2\xe8\x24\x3c\xf9\xa3\xf8\xff\x9e\x3f\x3f\x7e\x75\xd2\xd4\xff\x79\xfd\xfa\xf5\x37\xfe\xbf\xdf\xe3\x07\x98\xc5\xe3\xb9\xfe\x59\x5d\x95\x05\x1c\xb0\x74\xa6\xd2\x32\x3e\xf8\x1f\x47\x0f\xff\xcf\x81\x59\x3f\xe2\xc8\x3d\xc1\xfb\xe3\xf8\xf5\xd1\xc9\xb1\xd0\x12\x02\x4a\x7d\x78\xd1\x73\x7e\xd3\x41\x74\xa7\x4b\x56\x0d\x84\x62\x22\x74\x84\x84\xeb\x7f\xa7\xcb\x45\x5c\xa7\x6b\x2f\x8a\x9e\xda\x7a\x11\x7b\xfb\x21\x31\x9c\x8c\xde\x93\x59\x9d\x72\x81\x2d\x3c\x3d\x3c\xb8\x9a\x46\x83\xcb\x37\x17\xd1\xc1\xff\xa0\x9f\x83\xc7\x06\x40\x1d\x9a\x0e\xf6\x99\x2e\x8f\xdf\x4c\xa9\x26\x70\x7d\xcd\xef\x17\xe6\x3c\xc1\xe7\x78\x59\x02\xa4\xc2\xe7\xe3\x37\x3c\x10\x45\xd0\x7e\x57\xac\x1a\x0e\xd1\x91\xc0\xc5\xb7\x2b\xb6\x68\x6e\x30\xc7\x2e\xd4\x1e\xa6\xd5\xad\x3f\x4e\x64\xb2\x65\x82\x21\x7e\xa1\x05\xe4\x16\xd2\x89\xc4\x63\x92\xae\xc8\xbf\xa0\xf7\xa4\x95\x9a\xeb\x9f\x8f\xd8\x56\x39\x84\x04\x14\x44\xb4\xb1\x37\x9b\x78\xf9\x31\xbe\xd1\x7d\x1c\xe2\x9d\x68\x7e\x5a\x43\x02\xaa\xeb\x89\xdb\x9c\x9f\x57\x17\xe6\xf1\x68\x65\x57\x94\x86\xfa\x85\x71\x31\xe6\xfa\x78\x37\x79\xaf\xe6\x13\xc7\xb3\x1c\xa9\xab\xe9\xe4\xed\x74\x70\x39\x23\xd8\x8c\xc4\xe6\x3c\x0b\xb8\x40\xf7\x26\xbd\x03\x34\x94\x0d\x9e\x40\xc5\x02\x14\xb2\x91\xaf\x5b\x6a\x4c\x3c\x25\x74\x42\xaf\x84\x30\xe3\xfd\x6d\x01\x37\x23\x97\x8a\x81\x1e\x53\xa3\xd6\x2c\x2d\x1d\xa5\x91\xc8\x92\xb2\x0e\xdd\xc1\x28\xdf\xb7\x16\x7f\x31\x9d\xbd\xc2\xef\x3e\x43\x36\x81\x16\x25\x66\xd7\xad\x2d\x9f\xee\x4d\x28\x76\x56\xd4\xab\xcb\xd5\x27\x5e\xc6\x33\x2f\x1f\xde\x60\xf0\x90\xdf\xb4\x75\x41\x12\x32\xfe\xf0\xe3\x42\xa9\xc1\x82\xf5\xdf\x9d\xdf\x89\x4b\x28\x9c\xc8\xc0\x1f\x89\x4b\xe7\xd8\x6f\x8d\x9b\xa7\x99\x85\xd8\xd6\xdf\xe7\xad\xcd\x5b\xdf\xea\x75\xa5\xb3\x3b\xf2\x27\x98\x45\xa4\x91\x81\xeb\xec\x82\xfb\x2a\x2e\xda\xff\xc8\x8b\xff\xb0\x45\xf3\x4f\x68\xeb\x83\xed\xec\x6a\x45\x9c\xab\x6d\x6e\x9b\x22\x0d\x42\xb0\xe2\xd4\xc0\x7d\x03\x68\x3c\x10\x50\xef\x1f\x75\xa8\x62\x9a\xe9\x1a\x30\xd8\xad\x87\xc9\x66\x43\xe4\x09\xec\xc5\x5c\xeb\x04\xeb\xf7\x6f\xf5\xf2\x63\x8b\xd5\xc0\xb2\xe3\x8b\xb5\x84\x75\x1c\x58\xbf\xac\x33\xb3\xd4\x06\xcb\x3a\xbd\x4b\xd1\xf9\x70\xb8\x15\xaf\x8f\x34\x7b\xcd\x39\x92\x8d\x42\x62\x4b\xe2\xa5\x64\x2f\xd1\xbd\xf7\x47\x62\xeb\x28\x91\xd3\x26\xc5\x2a\x6f\xac\x84\x01\x54\x96\x3b\xad\x48\x4d\x95\x24\x44\xb7\x39\x98\x5d\xf2\x55\x29\x33\x6f\xa3\x7f\x6f\x8e\xd5\xf7\x3a\xa0\x0a\x2e\x79\xc3\xc0\x69\x91\xea\x3b\x01\xec\x14\xc3\x03\x27\x09\xec\x2d\x38\xd6\x60\xba\x4a\xad\x93\x62\x6d\xd5\x26\x1a\x35\x62\x8f\x6e\x18\x66\x7c\x83\x98\x34\xb8\x0e\xf7\xb7\x71\x0d\x15\xfe\x2e\x83\x64\x83\x5b\xd8\x8c\x1d\xc4\xfa\x2b\xf3\xd1\x14\x80\x1d\xa9\x65\xa7\x83\x71\xc0\x7a\x75\xaa\xc2\x49\xf3\x5a\xdf\x94\xb6\x20\xa7\xd4\xa2\x10\xc9\x6b\x4a\xa8\x46\x70\x2c\xab\xa4\x80\xc1\x02\xca\xf2\xe2\x1e\xe3\xf3\xb7\x30\x26\x70\x68\xdf\x14\x71\xc6\x6f\xd6\x9a\xcf\xbe\x4a\x0e\x14\x89\x66\x80\xab\x02\xab\x9f\x0e\x3a\xf5\xcb\x72\x75\x03\x28\xa2\xb0\xd6\x9f\x9e\xb1\xf7\xbd\xef\x26\x5c\xc1\xb6\xba\xb9\xd1\x15\x51\x7e\x4a\xa0\xf7\x58\x10\xed\x4f\xc6\x70\x31\x00\x0d\xff\x68\x08\xbe\x81\xbd\xae\x9f\xf0\x63\xaf\xd8\x2f\xda\x5c\x21\x85\x8d\xdc\xe6\x86\x5d\xc4\xc4\x7d\x1d\xcb\xd0\xda\x16\xd2\xb3\xa4\x4a\x0f\xaa\x8e\xbc\x8f\x77\xcc\x3d\xd8\xb5\x60\x16\x20\x38\xc8\x34\x5b\x8c\xba\x28\xca\x45\x9a\x24\x4d\xbe\x31\x1b\xa3\x47\xff\xb0\xb3\xaf\x1e\xbd\x47\xab\xd5\x14\x50\xc3\xc3\x61\xd5\x8c\x88\x68\xb0\xd6\xc4\x2e\x31\x3b\x76\xad\xeb\x1f\x88\x04\xda\x95\x3a\x6a\x5d\x7b\x0c\x8c\x10\x84\x73\x9b\xab\x28\x73\xcd\xa1\x22\x6c\xc7\x9e\xb3\xb3\xb5\xab\xe4\xd9\x89\x11\x01\x86\xb2\xe0\x8e\x65\x71\xe4\xed\xc2\x1a\x14\xa2\x92\x6a\xe8\x9d\xd6\xe2\xb6\x3a\xef\xb8\xad\x9e\x31\x4d\xd6\x48\xbc\x32\x75\xc6\x8f\xd3\x2a\x4c\x31\xa8\xaf\x73\x34\x81\xfc\x11\x70\x91\xee\xee\xc1\xf8\xb2\xae\xdb\xd0\xc7\xaf\x19\x00\xec\x87\x4d\xd2\xc2\x20\x3c\x13\x95\xf3\xd8\x15\xb3\x64\x1b\xb5\xb0\xfe\x22\xb2\x61\x10\xf3\x2f\x40\x56\x32\x41\x19\x07\x27\x70\x3d\x62\x65\x2f\x49\x05\x79\x8f\x08\xdc\xc0\xf9\x88\x7b\x16\xce\x86\x9c\x2d\xdc\x4e\xfb\x1e\xef\x72\x18\xa8\x8f\x89\x24\x06\x7d\x9b\xe9\xa0\x15\xde\x60\x07\x4f\xad\xc4\x8b\xed\x2e\x11\xa8\x9a\xb9\x63\x6e\x49\xc6\xe1\xd7\xa5\xcd\x77\xf2\x34\x08\x55\x20\xc0\xf6\x67\x3b\x77\x9d\xf8\xa3\x44\x27\x42\xc7\x61\xc1\xb5\xa9\x5d\x4d\x88\x93\xa4\xd4\x55\xe5\x28\xa9\xfc\x87\xae\x2c\x17\x13\x2b\x87\x16\x2b\xae\xb1\x92\xed\xc4\x82\x2e\xb9\xd5\x6f\x90\xb0\x1d\xb3\x67\x3a\xa7\xba\x64\x20\xb8\x32\x8f\x42\x93\x18\x8d\xb8\xbc\x20\xfe\x19\x7b\xff\xb8\x40\xaf\x9d\x03\xfb\xa7\xb2\xb2\x19\x2c\x64\xc8\x93\x19\x2c\xf7\x19\x4f\x08\x89\xd9\x86\xb8\xc8\xd1\x31\x24\x3d\xb4\xee\xb8\x7c\xd0\x41\x08\xe3\x9a\x8e\xc6\xca\xdf\x4f\x20\xb3\xd6\xf5\x46\x3c\xed\x10\x05\x83\x9d\x6d\x81\x77\xbf\x78\xad\xff\x55\xf6\xa3\xe0\x24\xd3\xe1\x00\xa0\xc9\x87\x6f\xfa\x96\x33\x62\xd0\x6f\x5e\x47\x6d\xb3\xee\x90\x38\x27\x83\xcf\xb8\xae\xfa\xaa\x2e\x6e\x10\x03\x60\x9b\xed\xf5\xe6\x47\xeb\x9e\x75\x81\xd7\x5a\xcb\xd7\x62\x5c\x57\x2b\xf4\x8a\x50\x4a\x91\xf5\xfc\xbb\x96\x27\x12\x08\x25\xba\x4a\x6f\x50\x2c\x06\xd2\x43\x74\x58\xda\xe7\x38\xc1\xa5\xe6\x23\xe5\x10\xd8\x19\x81\x5c\x3e\xe6\x99\xcc\x31\x5b\xa1\x2d\x69\x8f\xd4\x00\x3d\x4f\xa2\xcb\x69\x70\x6d\x58\x43\x74\xbd\xd1\x50\x5c\xdf\xf5\xa6\x18\xa8\x9d\xf6\x8c\x19\xcf\xda\x9b\x3e\xa7\xb5\x71\x79\x83\xde\xf0\x6d\x61\x5c\x4b\x9d\xde\x75\xad\x57\x49\x17\xe4\x28\x44\x57\xab\x74\x09\x31\x79\xda\xcb\x6b\xc1\x1c\xd4\xb9\x16\x7e\x84\x4f\x5a\x62\x16\xf6\xba\xb9\x31\xb1\xba\xce\x53\xb0\x31\xa7\x9a\x82\xc9\x17\xc5\x32\x36\xce\xc5\xe1\xf5\xf4\xa2\x8f\xbe\x2e\x10\x3a\xb9\x38\x82\xfe\x04\xa9\x1f\xd8\xb8\xb6\x57\xa6\x2d\x08\x6a\xed\x5c\x92\x40\x4f\x52\xac\xb8\x40\xfe\x90\x16\xb8\xe9\x37\xdf\x58\x30\x65\x78\xe4\xc2\x32\x5b\xfb\x4c\xcd\xbc\xd9\x30\x75\xae\xcb\xdb\x78\x03\xa6\x4e\x5c\x6b\x5b\x09\xdc\x0f\x0f\xc6\x05\x37\x95\x8e\x34\x50\x67\x0e\xd4\x2f\x72\xd5\x3e\x53\x8e\xc3\x19\xf9\x3c\x85\x58\x17\x6e\x75\x29\xd4\x45\x38\x13\x62\xfa\x81\x2f\x50\xa0\x84\x89\x47\x11\x5c\xe5\x78\x1c\x9c\x64\x8c\x67\xb6\xa0\x88\x11\x14\x60\x29\xe6\x7a\x8a\xc1\xa8\xb3\xf7\x80\x35\x1c\x50\x79\x94\x08\x82\xb7\x80\x6e\x12\x4e\x95\x19\xa1\x4a\x67\xab\x50\xfd\x22\x33\x21\xed\x8e\x51\xa8\x60\xa9\x13\x7b\x68\x13\xb6\xa4\xa1\xb4\x27\x4f\xc9\xbc\x59\x7b\xa2\x8e\x8e\x94\x38\x54\x9a\xe4\xd7\xad\x33\x4d\xd1\xb2\xb9\xc9\xa1\x69\x79\x6d\xc1\x0e\x10\x4d\x0b\xf8\x80\xb3\x61\x39\x22\xa5\x6c\x30\xe2\x92\xb7\x08\x32\xa4\x19\xb3\xdc\x16\x2a\xce\x71\x24\x38\xa8\x1e\x1e\x0c\xcd\x25\xc8\x2d\xe1\x93\x36\xb6\x83\xc9\xd1\x19\xdc\xc2\x0b\x67\xda\xfa\x99\x5a\x97\x29\xf1\x8e\x38\x5f\xde\xb1\x11\xaa\x81\x13\x02\x22\x6b\xf4\xe4\x0d\x0a\x4a\xd7\x05\x73\xe2\x21\x17\x35\xc3\x69\xed\x2e\xef\x00\xf8\xd5\x42\x4c\x9c\x5f\x09\xd0\x29\xdd\x92\x2a\xb5\xf4\x43\xaf\x43\x2c\xdb\xb1\xe0\x16\x4b\x0a\xe0\x9d\x27\xd8\x2d\x69\x8d\xc3\x7b\xf8\x88\xb3\x15\x89\x75\x61\xf1\x15\x68\x24\xdd\x02\xe0\x9a\xfa\xc9\x2f\x41\x5b\x1f\x38\xbc\x01\xa4\x61\x77\x46\x7d\x5b\x98\x0d\x6a\xc7\xbe\x2a\xac\xf4\x09\x20\xd4\x8d\x69\x02\x76\x92\x71\x5f\xb9\xfe\x23\xae\x75\xd5\xa8\x93\x27\xb7\xa4\x65\xfb\x0c\xd4\xd4\x0b\xc6\x99\x4d\xe5\x31\xba\xbf\x27\x4c\xab\xf4\xbd\x0e\x8e\xbe\xe4\xe7\x00\x45\xc4\x01\xe5\x95\xa3\xe3\x6d\xeb\xee\x3b\x5d\x30\xba\x4a\xcc\x41\xb0\x63\x4e\x0c\x0b\x45\x00\x88\x38\x03\x6e\x81\x5a\x40\x38\xc9\x34\x19\x2d\x8f\x69\xe5\x09\x18\xd0\x67\xfd\x69\x55\xef\xc1\xe3\x86\x73\x1d\xbe\x8e\x33\x29\x74\x54\x1b\x14\x8d\x88\x86\x82\xfe\xf8\x01\x39\x33\x6d\xb5\xa6\xf5\x0d\x9f\xba\x8d\x37\x1b\x9d\xc3\xe4\x2e\x97\x30\x6d\xe6\x18\xe0\x2b\x64\x55\x94\x37\xba\x6e\x44\x97\xed\xcb\x78\x3b\x81\x94\x5a\x5a\x3b\x82\xd1\xe5\x72\x0b\x23\x09\xc1\x8a\x5b\x10\x13\x21\x87\x91\x4e\x59\x88\x2b\xe0\xbd\xde\xba\x14\xed\xcb\x50\x32\x65\x5b\xf9\xc3\x93\x22\x07\xec\x5d\x5a\x30\xf4\xa4\x45\xce\xe9\xc5\x46\x49\x27\x7e\x5b\x6d\xc1\xb6\x65\xc0\xcc\x02\xab\x7a\xa8\xbc\xa7\x2e\x90\xf8\x15\xfe\xd4\x75\xb5\xb9\x05\x6d\x37\x31\x81\x85\x8b\x5c\x87\xea\x52\x04\x6b\x2d\xbe\xd7\x9c\xf9\x95\x64\xe2\x86\x78\x87\xbe\x8d\xef\xd2\xa2\xb4\x5b\xc0\xfa\x21\x76\xdd\xd4\x68\x03\xa5\xb5\xed\x84\x35\x86\xbf\xd4\x73\xfd\xb2\xdd\x61\x36\x88\x47\x09\xff\x70\x58\xb4\xdb\x9b\xa5\x45\xca\x11\xd3\x66\x68\x57\x37\xe7\xaf\x79\xfa\xb6\x22\x10\x78\xa1\x76\xbe\xcb\x12\x76\x01\x0e\x0c\x60\x21\x7b\xef\x80\x2e\xe1\x90\x87\x5d\x6c\x4c\x4b\xf8\x8e\x7a\xfa\x48\x7c\xdb\x05\x5f\x31\xee\x82\xd4\xbb\x39\x17\x07\x35\x10\x36\x1f\x53\xa2\x9f\x71\x3c\xd4\xed\xe6\x1b\xb3\x52\xdc\x3a\x2e\x1b\x46\x02\xb8\x1d\xcf\x7d\x62\x1c\xdc\x3e\xf9\x81\x85\xd6\x15\x21\xf8\xbc\xd5\x75\x30\x5a\xed\x09\x6f\x81\xad\xe5\xee\x28\x2e\xae\x44\x35\x58\x78\xaf\x73\x7a\x52\x4e\xd8\x75\x06\x5f\xfa\xe4\x50\xf8\xd1\xaa\xce\x45\x43\xbc\xaa\x9f\xb3\x44\xc9\xda\x14\x50\x53\x36\x28\x19\xc4\x8e\x34\xff\x95\xf3\x09\x61\x42\xcd\x50\x83\x8f\x77\xa4\x3a\xa2\x7f\xec\x71\x62\x7f\xdb\xdf\x54\xbf\x84\x69\x5e\x3d\x53\x15\x80\x95\x30\xec\x8a\x10\x40\xc1\xe7\x8f\x0b\xa3\x61\xb5\xc9\x48\xa1\x10\x96\x22\xfd\x33\x11\x15\x20\x92\x6c\x8c\x04\x10\x04\xd9\xb5\xf5\xb1\xd0\x36\xdf\x3d\xfb\x5a\xbf\x4a\x9e\xa9\x43\x9c\xac\x55\x91\xd7\x2d\x09\x83\xbe\x80\x45\x00\x52\x34\x2e\xdb\x74\xf2\x5a\x41\x06\xd9\x0b\xf4\xc1\x7c\x34\x48\x7d\x44\x63\xfd\x1b\xf2\x81\x06\xd8\xb3\x3d\x2d\x9d\xa5\x8b\xb5\xc6\x1e\x87\xb4\xf5\xd3\x4f\x48\x25\xc4\xec\x67\x0c\xd1\xd8\x72\x2b\xcf\x52\xae\xd8\x14\xd6\x39\x72\xc9\x22\xe6\xd3\xf9\x1f\xa6\x39\x95\xc0\xa5\xaa\xb8\xae\xf5\x7a\x53\xcb\x9b\x72\x9b\x37\x3e\x6f\x1d\xcf\xd3\x3e\xde\x97\x8d\x7e\xcb\x66\x78\x91\x01\x6c\xd2\xa1\x19\x87\x34\xdf\x6c\x6b\xb5\x89\xeb\xdb\x4a\x2d\xe3\x5c\x16\x34\x5b\x99\x04\xdc\x1e\x1a\x8e\xa3\x87\x46\x0f\x1c\x9a\x1a\xaf\x59\x78\xc8\x62\xa7\xe6\xfa\xe7\xfe\x6f\xbc\x8c\x96\xab\x9b\x67\xea\x10\x80\x76\x37\xdb\x32\x96\xeb\x67\xef\xfc\x85\xad\x1b\xeb\xd0\x9c\x95\x6c\x14\x18\x4b\xa8\x4f\x99\x16\x8c\x5a\x94\x10\x6f\x43\xf8\xf7\x3a\xce\x13\xb1\x6d\x18\x7b\x80\x0a\xdf\x8e\xa8\xaa\xdd\xa2\xf0\xe0\x8d\x46\x32\xa3\x62\x05\xbe\x11\x27\x5f\xf0\x88\xc7\x15\x63\x59\xc3\xaa\x6a\x8b\x41\x3d\xff\x3c\x0b\xd4\xbc\x95\xa9\x52\x89\xde\x94\x7a\x69\x65\xd1\x9f\x74\xbe\x2f\x8b\xf5\xa6\xc8\x99\xfe\x0d\x5f\x82\x76\x88\x8b\xfc\xb9\x15\xe6\xf4\xd8\x12\xa4\x4a\xe4\x60\x04\x26\x49\x61\x4f\xf9\x0e\x54\x9c\x63\x8c\xfb\x11\x7b\xec\x40\x10\x51\xc9\x44\x8d\xf1\x5d\x4a\x0a\x8a\x5a\x42\x3d\x78\xab\x97\x6f\x21\xa2\x42\xb0\x2a\x5d\x85\x86\xa3\x2a\xbc\x2f\x53\x74\x57\xb0\x08\x8d\x01\x25\xef\x8a\x2c\xe1\xea\x84\x44\x57\xde\x72\xf8\x25\x36\x6b\xf7\x99\x33\xdd\xed\xdb\x29\x0e\x68\xae\x65\xeb\xcd\x12\x36\x17\x29\x37\x2d\xd5\xa1\x2d\x3d\x0c\x3a\x6a\x0f\xd1\x93\xa2\xcf\xf2\xd3\x09\xa0\xb2\xd6\xa5\x59\x07\xde\xd2\x58\xa5\x75\x6e\xa9\xe5\xe4\x12\x23\xa5\x1e\x5c\xcd\x82\x69\x8a\xb0\xfe\xe6\x2d\xa0\x79\x43\xcf\xa1\x72\x97\x98\xc0\xad\x8d\xab\x16\x36\xcb\xae\xd8\x86\x6a\x86\x55\x98\xf2\xef\x66\xa0\x40\x64\x06\xc9\x14\x30\xa8\x44\xd4\xc2\x38\xc1\x15\x4a\xf6\x80\xa3\xc1\x72\x8a\xa8\x08\x0f\xa3\x50\xea\x4d\x9c\x96\x01\xa2\xd1\x4b\xd2\x45\x01\x18\x84\x25\xd4\xd8\xe6\x40\xa0\x07\x40\xe4\x04\x03\xe7\x3c\x7d\xe8\x9b\x74\x4d\xa1\x65\xe3\xc2\x34\x00\x6c\xef\xc6\x1d\xd6\xf4\xd8\xfc\xfa\x14\xac\xec\xbc\x2d\x5a\x89\x30\x91\xb4\x6e\x04\xff\x3c\x4e\x06\x04\x94\x78\x55\xa1\x3b\x22\xfe\xa0\xa2\x4f\x4f\xdd\x27\xe7\xeb\x34\x0b\xf0\x80\x31\xff\x91\xe6\xe8\x6a\x21\x75\x0e\x20\xdb\x81\x47\x2e\x8d\x1d\x73\x48\x5c\x22\x0b\xb4\x59\x90\xac\xa7\x55\xb5\xe6\xd1\x6c\xe0\x2d\xb1\x4e\x0b\x2a\x12\xf3\x49\x2f\x58\xfc\xc8\xfa\xf4\x09\xd6\xa0\x68\x71\xa1\x01\xbf\x68\xac\xb1\x12\x46\x18\x39\xd5\x6a\x2c\x6b\xc9\xa0\xde\x40\x55\xdb\xca\x45\xff\xe3\x1c\xe0\x59\x8d\xfa\x56\x30\x6b\x1c\xe9\x90\x67\x1c\x17\xc4\x86\xa4\x5d\xa9\xbc\xad\x22\x02\x57\xaa\x1f\x58\xd0\x50\xe7\x7e\x36\x56\x5a\x9c\x26\xbc\x18\xf8\x9f\x72\xaa\x2d\xcb\x60\x9c\x20\xf9\x21\xe7\x7f\x8a\xca\xf2\x4a\x73\x25\x3d\x8d\x7d\x78\xf0\xc5\x90\xa3\xcf\x49\x3d\x37\x12\xd1\x10\x6b\xe4\x14\x9d\xcb\x47\xad\xe1\xe2\x80\xd2\xf7\x3f\x0c\xbd\x64\x06\xbf\xb2\x99\x37\xbc\x05\x29\x0d\x05\x95\x90\xbf\xec\x8a\xed\x33\xeb\xb9\x55\xbc\xd9\x87\xb7\x45\x51\x21\x1c\xc3\x27\x7d\x18\x50\x6c\x8f\x51\x83\x9f\xe3\x3a\x58\xe4\x1b\xa5\xcd\x3c\x30\x19\x04\x1c\x62\xe4\x8d\xcf\xe9\x54\x31\x7b\xe1\x3f\xe4\x55\xf5\x1f\x2d\xf7\x94\xfc\x32\xc1\x59\xd1\xf0\x42\xc9\x9d\xa0\x08\x99\xaf\xf8\xe2\xa0\x32\x3b\xd6\x16\xf7\x1b\xb5\xd8\xe2\xe4\xe9\xd8\x83\x87\x78\x9f\xe1\xcc\x95\xa3\xd1\xb0\x63\xef\x63\x00\xb5\xaa\xf5\xa7\xba\x05\x6d\x84\x4d\xb7\x2e\x12\x9d\xf9\xb1\x29\xdb\x7e\x82\xe3\x95\x8e\xe3\x03\x0f\xfd\x46\x7f\xc8\xbc\xf6\xca\x1f\x6f\x38\x79\x91\xae\xe1\xea\xb3\xd9\x8a\x26\x8e\x6f\x0f\xb6\xfc\xea\xea\x82\x02\xae\x16\x0a\xb2\x2e\x92\xa7\x43\x41\xf4\xa7\x4d\x06\x7b\x01\x63\x45\x35\x04\xb3\x91\x53\x25\xa5\x0c\xef\x23\xf1\x1f\x7e\x42\xe0\x27\x4a\xee\x6f\x77\xfe\x4e\xc0\x97\xbb\xa6\xbf\x1d\x5f\xb3\x8e\x75\x0b\xe7\xf9\xf6\xea\xa2\xaf\xee\x63\x2f\xee\x9c\xe6\xf1\x06\x65\x89\x8c\xf7\xa4\xa2\xa7\xe0\x1d\xe1\x9d\x01\x9b\x71\xcb\x2d\x8e\x6f\x9a\x37\x07\xc9\x2c\x81\xaa\xa6\x3c\x6a\xa9\x33\x7d\x17\xe7\x14\xbe\xe5\x7d\x89\xce\x73\x1b\x2c\xd6\xb9\xc1\x91\xb3\xd6\xc1\xfe\x75\xbe\x2c\xb6\x65\x7c\x83\xad\xa2\x4a\x83\xf0\xe0\x1d\xa2\x80\xae\xe1\x42\x71\xbb\x78\xdf\x96\x3d\x98\x17\x2d\xb0\x6a\xe0\x4a\xc0\x80\xd8\x44\x84\x54\xaa\xd6\x0e\x86\xc4\x6c\x8c\x93\x9e\x2e\x41\x10\x8f\xcf\x7c\x2b\x72\xc3\x97\x2b\x7c\x11\xfc\x03\xce\xf4\xef\x20\x0e\x05\x35\x0f\x55\xa1\x62\x27\xaf\xe9\x72\x2f\x4f\x41\xaa\xc9\x1c\x0d\xd6\x9d\x7a\x29\xee\xfd\xd1\xaa\xf0\xe0\x1d\x19\xb1\xd0\x05\x58\x67\xf6\x76\xb1\xc2\xe3\x2c\x1a\x0e\x2d\xfb\xe1\xe0\x2f\x7f\x51\x9b\xf4\x26\x4c\xea\x4f\xe6\x3f\xdd\x1d\x07\x45\x35\x97\xa1\xfa\x10\xaa\x71\xbc\xd6\x07\x7f\x39\xf8\x0b\xce\xc1\xe6\x41\xfc\xa6\xeb\x90\xdc\x86\x07\x7f\xe9\x72\xa5\x1f\x40\x32\xcb\xf4\x0d\x83\xb5\x0f\xfe\xd2\x3a\x78\x8a\x52\x1d\xf2\x51\x50\x6c\xa0\x98\x1f\x97\x96\x4c\xd9\x85\xd0\xf2\xee\x2c\x80\x0c\xf5\xc1\x78\xfe\x45\x16\xc3\x98\x6f\x7c\x3a\xda\x60\x0b\xc3\xa2\xbc\xf9\x2e\xdb\x6c\xb2\xb0\xfe\x54\x1f\xfc\x85\x2a\xfd\x1c\x94\xdc\xd8\x25\xf0\xda\xb4\xb2\xd7\x03\x90\xb1\x89\x29\x17\xce\xcf\x5f\xdc\x97\xbf\xff\xfe\xfb\xef\x8e\x5f\x7d\x77\xec\x9e\x11\xb6\x87\x9b\xb8\xb9\x2b\x7f\x01\xd3\xd4\xa1\xc1\x9d\xde\x84\x69\x5e\x1d\xbc\x05\x4e\xe4\x07\x26\x1d\x9d\x47\x0b\x13\x92\x53\x83\x7c\xca\xed\x1c\x14\x1d\x9d\xf7\x70\x6a\x43\xe8\x89\xa4\xde\x3a\xf0\xc3\xa5\x2d\xc9\xd4\xaa\xbe\xe7\x24\xd5\x2f\xd4\xd4\x67\xd0\x96\x5f\xa8\xb1\xcf\xf0\x0c\xf9\xa5\xcb\xbe\xea\x78\x1c\x09\x79\xff\xe2\xd6\xe5\xb3\xf0\x60\x64\x8d\x14\x3f\x73\xf3\x40\x64\xf0\xe0\x0c\xc2\x07\xf9\x8d\x7a\x4f\xb9\x2e\x5b\xa4\x28\xe3\xd6\x73\xbe\x91\x88\x32\xcf\x5e\xd8\x8d\x19\x95\x66\x25\xd3\x00\xb3\x72\x57\x97\x57\xc0\x69\x01\x17\x9f\x75\x86\x96\x4d\x40\xb8\x04\xfa\x3d\xe6\x42\x94\xc0\xf4\x6b\xa4\xee\xc1\x8a\x5f\x66\xd4\xb1\xe1\x37\xea\x8c\xff\x4a\xe4\x0e\x31\x13\xd8\xb8\x88\x16\x9a\x61\x96\x70\xc6\xf0\xd9\x97\x99\x13\xba\xaa\x59\x25\x74\x5f\x5f\x54\x6e\x4e\xbd\xda\x93\xc9\xa3\x45\x57\xac\xa4\x06\x58\x89\x59\x66\x78\x9e\xca\x4c\xab\xb3\xf4\xa3\x7e\x68\x99\x9b\xd7\xe2\x2b\x4d\x43\xd0\xd1\x5a\xc7\x79\xba\xd2\x55\x6d\x36\x61\x78\xc0\xe5\xb3\x70\xc4\x5b\x2c\x57\xbc\xa8\x34\x79\x9d\x80\x76\x06\x3c\x47\xb1\x04\x96\x94\x0a\x32\x85\x98\xc8\x5a\xe0\xb8\x53\x0e\xfc\xb1\x11\xc6\x68\xb7\xb8\x6f\x17\x3b\xc4\xe2\x22\xe3\x56\x99\xfa\x5e\x0f\xe0\x04\x4c\x67\x31\x66\x80\x81\x5f\x0c\x58\x8f\x3a\x57\x4c\x25\x50\x3f\x0b\x1d\x97\x7b\x63\xc6\x4d\x04\xba\x23\x41\x7b\x24\x0e\x13\x34\x43\xf8\x92\x1f\x12\x7f\xef\x06\xfa\x33\x61\x7a\x1c\xf3\xc6\xb0\xb8\xf5\x08\xb8\xe6\xb4\x73\x87\x08\x65\x2d\x97\x7b\xc3\x9a\x4a\x2a\x16\x16\x43\x27\x63\xe6\x10\xc1\xc2\xfb\x21\x83\xc5\xd2\xfc\x30\x2d\xd4\xd2\x3e\x4d\x2a\x11\x2c\xe3\x5a\xdf\x14\x2c\xdb\xdd\xfa\x5a\x78\x70\xde\x15\xc6\x66\xc3\xd7\xe1\xbb\x6c\xf9\x89\xad\x81\xec\x93\x02\x40\xad\xed\xfd\x2b\x82\x8a\x3c\xa9\x24\x87\x40\x72\xa6\x77\xcd\xa4\x8e\x9c\xda\x90\x06\xbb\x23\xde\xa8\x0e\x1f\x0e\x52\x62\x5b\xf6\xb7\x02\xa2\x1f\xfb\x5b\xf1\xf9\x18\x50\xaa\x4e\xdf\xb7\x62\x1b\x79\x12\x22\xee\xb7\x10\x01\xd9\xd0\x44\x2f\x33\x5a\xff\x3c\x59\xbb\x76\x07\xe4\xc4\x75\xbe\x35\xfc\x97\x28\x6a\xfc\xf6\xf3\xe4\x9f\xf0\xbb\xc9\xec\xe2\xe8\x34\x3c\xfe\x7a\xe5\x9f\x8f\xd4\x7f\x9e\x3e\x3f\x7d\xf9\xb2\x59\xff\xf9\xea\xf5\xc9\xb7\xfa\xcf\xdf\xe3\x67\xb2\xd1\xb9\xbb\x77\xc8\x53\xb8\x0b\xd5\x69\x78\x8c\xf1\xab\xce\x0f\x60\x59\x7d\x8f\xfe\xd5\xeb\x33\x83\x82\xa5\xa2\xe3\x5c\x0d\x68\xa9\x9b\x63\xce\x41\xbc\xf1\xab\xb6\xa8\xfd\x7d\x51\x7e\xec\xf5\xd5\x3d\x5c\x95\xa0\x66\xed\x3d\xbc\x28\x7b\x7d\x88\xf8\x51\x6e\xd3\xcf\xff\xb2\x03\x29\xd8\x58\xdc\x1f\x3b\xed\x27\xb6\x48\xbc\xf7\xff\x70\x70\xc1\xb0\x0c\x17\x2a\xe8\xee\x38\x1f\xd2\x66\x7c\x94\x52\x27\x7d\x54\x9e\x03\x16\x0b\xfb\x2e\xcb\x15\xc0\x7d\x68\x2b\x64\x3f\x5d\xd2\x5a\x28\x92\x49\x71\x2e\xa9\x48\xf6\x90\x1e\x75\xdc\x47\xef\x9f\xb5\x99\x5b\x9d\x47\xc2\x83\x4d\xaa\x6d\xfa\x71\xd1\x47\x40\x99\xde\x60\xf5\x81\x05\x1b\x82\xfa\x87\x3a\xec\x9d\xb9\x5f\x01\x4b\x56\xaf\x4f\xda\x89\xdb\x4d\x91\xb7\xdf\xc0\xcf\x5d\xf6\x1b\x61\x0c\x9f\x1b\xd3\x6f\x15\x0a\xcb\xf9\xef\xf1\x59\xfd\x02\x81\xdc\x01\xa2\xa5\x82\xeb\xaf\x5a\xb2\xd3\xf0\x44\xe0\xd1\x6b\x3e\x90\x69\xbc\x64\x76\x99\x19\x4f\xb2\x27\x2e\x0a\xee\x5f\x82\xe3\x26\x28\xc9\xfc\x06\xb0\x86\xad\x94\xb2\xd3\x3c\x26\x9b\x2c\xde\x3d\xf0\x1d\x2c\x54\x11\xab\xad\xa9\xf7\xf5\x3b\x2d\x35\x16\xbf\x23\xf6\x56\x92\x42\xda\xa3\x58\x57\x5b\x3a\x04\xd6\x0a\x05\xb3\x64\xbd\x28\x92\xd4\xe5\x78\x1a\xf3\x5e\xa9\xd5\xb6\xcc\xad\xc6\x8e\x7c\x46\xc0\x85\x79\x01\x22\xf3\x2a\x50\x87\x05\x78\xff\x8a\x18\x3c\xab\x38\xeb\x5a\xe3\x5d\xab\x09\xab\x60\xc4\x90\x4a\xf5\x58\x8f\x1e\x08\x78\x6d\x7b\xe2\xcf\x3d\x82\xe9\xe2\xda\x03\x8f\x1a\x75\x21\xd6\xdd\x8b\x79\x05\xbc\xc8\x1f\x9b\xc5\x5c\x15\xa2\x4a\x2c\xa7\x87\x4b\xd6\xfa\xfa\xdf\x04\x8c\x30\x5f\xa7\x1a\x3e\xa1\x24\xe4\xbd\xa9\xbd\x0e\x20\x19\x57\x11\x42\x94\x9c\x5f\x02\x33\x1f\x95\x3a\x4e\x28\x37\xec\x4a\x56\x3b\x34\x74\x1b\x63\xe9\xa0\xf3\xe0\x8a\xca\x2f\xfb\x9f\x84\x29\xb7\x0d\x72\x5b\xac\x12\xcd\x2c\x91\x43\xa6\xa1\x94\xc4\x5a\xdd\xe0\x06\x38\x89\x35\xb3\x20\xcc\x45\x80\x76\xec\x93\xbb\x01\x65\x78\x1e\x36\xbf\xd4\x9b\xa2\x4a\x6b\x63\x04\x23\x41\x1c\x88\x2c\x2f\xe3\x6c\xb9\xb5\x71\x5c\x4c\x11\xaa\x34\xd7\x9f\x36\xc6\x0d\xb8\xd3\x5c\x4c\x7d\xa7\xf3\x54\x54\x32\x90\x2c\x59\x43\x33\xda\xf6\x90\xc9\xc1\xaa\x0e\x9d\x54\x6f\xbc\xd0\x09\x5b\x58\x75\x2f\x8b\x33\xc5\xcc\x8c\x05\x18\xee\xe9\x08\xb8\x7f\x9f\x7f\x23\xe2\xbe\x74\xf7\x77\x7b\x4d\x41\x55\x57\xdf\x38\xdd\xe6\x98\x30\xcb\xf6\xbc\x2c\xd6\xf6\x4a\x84\xfd\x13\xaa\xb1\x28\x0e\x40\x88\x4d\xb1\x12\x3b\x37\x2f\x1a\x7f\x02\x9d\x70\xc7\x6b\xd8\xfd\x6e\xfc\x1e\x98\x14\x2b\x8a\x7a\xfb\xf2\x01\x98\xa0\xd6\x40\xb8\x58\x05\xbf\x82\xc2\x3f\xad\x1a\x8b\x97\xb1\x03\xac\x83\x88\x04\xca\x4c\xc4\xc0\xd4\x7c\x4d\x6e\x3f\x94\x15\xe8\x66\xcd\xb4\x17\x0b\xb1\x31\xd6\x45\xa7\x64\x83\xeb\x60\xe0\x66\xab\x0a\xe8\xc8\xad\x02\xd2\x37\xa8\xf4\xb2\xd4\x88\x31\x7a\x4c\xfc\x57\x4c\x84\x10\xed\x6f\xe9\x42\xb2\x90\x23\xd0\x25\x37\x95\x7f\x85\x3e\x6e\xf3\x04\x06\xcc\x09\x25\x9c\xe0\x17\x78\xc2\x5b\xdd\x4b\x4c\xee\x79\xf7\x85\x8c\x91\x88\x8b\x96\xfe\x2c\x38\xa0\x9c\x2c\xbf\x69\x16\x2e\x5c\xbf\x35\x75\x43\xdd\x42\xf6\x95\xd2\x35\x88\x17\x83\x3f\x23\xbe\x0e\x29\xd8\x3a\x2f\xa0\x27\x4c\x1f\x80\x8c\x37\xa5\xae\x7d\xe4\xbd\x7b\x2f\x2c\x29\x47\x1d\x8e\x37\xe6\x1e\x3e\x7d\x8f\x37\x6c\xf7\xe0\x01\xea\x12\x78\x18\x33\x06\xec\x76\xec\x0e\xcd\x4c\x70\x63\xbe\x34\xfb\x15\x28\xe9\xa4\xe4\xbc\xbc\xce\x3a\xfe\x2c\xaf\xb5\x6d\xd5\x09\xa8\x6d\x1f\xf2\x5d\x66\x95\xa8\x7b\x86\xb1\xb7\xb9\x9a\xc7\xbf\x2a\x77\xb0\x83\x20\x88\x05\x03\xf4\xb9\x4c\x7c\xfb\xb4\x67\x36\x49\xb0\x6c\x31\x17\xc6\xbe\x2b\x94\x2d\x48\x64\xfd\x50\x0c\x09\x1f\xc9\x0b\xd8\x92\x7f\x2a\xee\x20\xc1\xbb\x64\x26\xe4\x5c\xd7\xf7\xb0\x80\x06\x94\x2c\xc2\x73\xc3\x69\x4e\xb3\xef\x41\xa6\x59\xb1\xb2\xfb\xab\x21\xfc\x2d\x35\xe1\xf3\x5d\xd7\x44\xf2\x9d\x03\x11\xa4\x46\x7f\x5b\xe7\x4c\xdc\x4a\x91\x75\xd8\xb8\x28\xe8\xfd\x98\x28\x7e\x00\xd8\x99\x52\x8a\x0b\x30\xc0\xe1\xe4\x70\xd9\x97\x9c\xcc\xaf\xfa\x6a\x50\xbb\xb7\x22\x65\x9c\xa8\x97\x44\x9d\x0e\x2b\xfc\xdf\x30\x3b\x4c\xbf\xf7\x5b\xeb\x28\x8e\x18\x30\x8d\x26\x1e\x91\x81\x90\x98\x77\x32\x29\x0c\x92\xb5\xa5\x85\x8f\xd9\x37\xd0\xc5\x7b\xb0\x2c\x31\x7c\xcc\x4f\xb0\xf3\xc5\x72\x00\xe6\x8f\x68\x9a\x6d\xa0\x91\x10\xce\xe4\x82\x62\xf4\x55\x41\xca\x15\xd7\x52\x4f\x8e\xc6\x18\x9e\x19\xf6\x44\x41\x70\xcc\x70\x00\xd9\x40\xc6\x46\x3c\x36\x14\x10\x31\x8f\xcb\x72\xe7\x45\x80\xdb\x6f\xdc\x6f\xed\xa0\x51\x21\x25\x65\xed\x2b\xda\x35\x22\x6d\xfb\xe0\x75\x5f\xbd\x17\x20\xbb\xab\xb2\xb8\xd3\x39\xea\xda\x18\xd3\x9b\xe4\xf9\x91\x81\x95\x3f\x28\xac\x40\x82\xd0\x55\x92\xa8\x83\xed\x94\x3d\x4a\x2d\xd6\xae\x07\x23\x5c\x6a\x17\x37\xa5\x74\x17\x3b\xf7\x22\x08\x26\xdf\xe7\x1d\xfe\x09\xfd\xd1\xb9\x3d\x2d\x2d\xf8\x7d\x4a\xd2\xce\x0d\x6d\x19\x05\xc2\xc0\xb1\x72\x21\xa8\xa0\xc2\xf7\x3a\xa6\x19\x65\xf3\x1f\xd3\x6e\x46\xe0\x86\xb3\xef\xa0\x4e\x10\xa9\x6a\x2a\x6d\x0e\x29\xaa\xbe\x6d\xba\xf9\x02\xf3\xdc\x21\x49\x85\xc4\x80\x2c\x61\xf9\x66\x30\x1b\xcd\xa0\x69\x6d\x21\x4b\x1f\x36\xb9\x0f\x34\xc9\xe6\x93\x23\xc9\xc3\x46\xf9\x60\xc9\x26\x35\x5f\xd0\xa4\xfc\x33\x8f\x7f\x8c\xf4\x0f\x65\x39\xa3\xf1\x7c\x34\x8d\xd4\x74\x34\xfb\x4f\x35\x98\xb1\x12\x1d\xc9\x43\xb2\xd6\xd9\x64\x3a\x7a\x3b\x1a\x0f\x2e\xd4\xfb\xc9\xf4\x3f\xd5\x68\x66\x35\x18\x29\x97\xc7\xfc\x85\xd1\xd4\x7c\xc3\xf2\x21\x4a\xc6\x55\x73\xb4\x57\x15\x61\xfb\x38\x29\xed\x53\xca\x8e\x0b\x19\x99\x69\x4d\x43\x5b\xb2\x86\x8c\x32\x31\x2d\x89\xdd\x31\x58\x68\xde\x17\x7a\xdf\x68\xe3\x58\xc2\xeb\x6b\xf8\x56\x5e\x34\x14\x60\x00\x0e\xcd\x7f\xc2\x82\x81\xfa\x56\x17\x92\x36\xde\x2c\xa6\xa2\xac\x05\x98\x50\xe5\xfa\x26\x4b\x6f\xcc\x1a\xea\x07\x96\xb3\xdb\x67\x4f\x0f\x98\x0b\x58\xee\x9e\x96\xa8\x06\xa5\x95\xf9\x00\x43\x9e\x00\xd0\xd4\xa0\xff\xea\xc0\x4e\x06\xfb\xc1\x93\xec\x30\xdc\xc6\xa6\x41\xe6\xe2\x25\x34\x65\x53\x7c\xa3\x01\x4c\xb3\xa6\x4c\x97\xe9\xf2\xc8\x72\xe5\x77\xaf\x84\x60\xed\x4d\x51\x24\xf7\x69\x96\x05\x18\xda\xac\xea\x62\xb3\x89\x6f\x50\xe5\x06\xcd\x00\x0b\x8d\x34\x36\x45\xc6\x24\xf4\x0e\xe5\x4a\xbe\x3e\x6b\xd6\x5b\x99\x05\xdb\x53\xc6\x62\x5a\x56\x37\x39\xef\x8e\xef\x07\x27\xc1\x63\x48\x77\x7f\x04\xf0\xaa\x8e\xeb\x5b\x2a\xbb\x96\x82\x8f\x34\x5a\x66\xf0\x56\xce\x8f\x2b\xca\x67\x95\x98\x7d\x3e\x6e\xa9\x6e\x69\x2f\x99\x37\x98\x77\xae\x89\xa1\x9a\x15\x6b\xed\x51\x38\x57\xb6\x0c\xd5\xb8\xa1\x9c\x56\x44\x4f\x12\xa5\xd4\x65\xff\x9e\x00\xa4\x0d\xb0\x3e\x35\xad\xc4\x73\x7c\x3a\x4e\x5b\x88\x63\x47\xe6\x43\xb1\x45\xed\xca\xbe\x1a\x2c\xcd\x5e\xb3\x57\x93\x27\x27\x34\x5a\x35\x83\x81\x0f\x85\x28\x01\xcc\xdd\xb8\x99\x03\xc1\x90\x03\x0c\x52\xee\xc6\xd5\x4a\xaf\x56\x66\xbb\xb9\xfb\xc4\xdf\xb1\x8e\x14\x00\x07\x09\xcf\xd7\x18\x0e\x1b\xd3\x02\x79\x37\x17\xfb\xef\x23\xe7\xc1\xe8\xac\xd2\x80\x13\xf4\x76\xc5\x21\xac\x44\x5c\x7f\x96\x57\xb0\xc5\x1d\xed\x6e\x4c\xe4\xef\xee\xcb\x88\xa2\xb8\xe8\x8c\xe1\x81\x26\x48\xcb\x46\x79\x28\x26\x4c\xda\x7d\xfa\x93\x59\xfd\xe4\xfb\xd0\x20\x37\x2e\x71\xa9\x5f\x45\x37\x7a\x60\xcd\x2f\xaa\xaa\xa1\x00\x78\x55\x34\x4f\xd2\x7d\x57\xf6\x97\x8e\x81\x47\xe5\xcd\xbb\x00\x8d\x09\x90\x37\x71\x56\x4b\x16\xdf\xe3\x85\x27\x98\x2f\x98\x32\x9b\xf7\xfe\xd6\x18\x07\x8c\xf8\x5d\xec\xd0\xb1\xb4\x24\xe2\xb5\x19\xd6\x1d\xb8\x6c\x88\x68\x09\x10\x4a\x02\x23\xc6\x50\xf4\xee\x31\x23\xc3\xa5\x73\xe8\xf0\x0f\x44\x68\x03\x52\xd7\xb1\xdb\x11\x5d\x7a\x66\x70\x5a\xad\x9c\x54\x51\x83\x52\xb0\x93\x2f\xdc\xd1\xe6\x4b\x4b\xc5\x7c\x71\x67\xeb\xe4\x98\x71\xe6\x09\x6b\x80\xfa\xc3\x9c\x72\xfc\x2e\x58\x5a\xd0\x05\x3e\x74\xeb\x42\xdd\x16\x1c\x6a\xe2\xac\x80\x1c\x86\x86\x93\x72\x72\xdc\x97\x27\x00\x9c\x9b\x14\x59\x1f\x90\x26\xc7\x83\xbd\xf3\x85\xd3\xac\x44\xc0\x6f\xd4\xbf\xd8\x1e\x3c\x09\x4d\x56\x87\x98\x9a\x57\x9c\xa0\x96\x65\x51\x55\x47\x60\x3a\xe0\x01\xba\x35\x6b\x0a\xfe\x1d\xec\x95\x5d\x3b\x4c\xfb\x56\x83\xc3\x99\xe4\x8d\xb2\xd3\x98\xbf\xea\x8b\xd6\x57\x42\x14\xe8\x30\x15\x0f\x32\xbd\x35\x07\x77\xdd\xae\x8c\xdd\xf3\xa8\xf6\x21\x71\xb8\x80\x00\x1c\x77\x6f\x59\xac\x17\x34\x53\x7b\x8e\x64\x14\x0d\x82\xed\x25\x1b\x76\x1b\x97\x09\x48\x2a\x91\xb0\x65\x5f\xfd\x4d\xdc\x50\x81\xfa\x49\xa3\x78\x43\xd2\xe4\xdd\x1f\x98\x33\x86\x94\x08\x4a\x20\x51\xdd\xaf\x90\x40\x91\x8b\x45\x59\x6c\x41\x82\x2b\x77\x42\x7d\xa4\x4e\x00\xde\xba\x27\x6f\x70\x4f\x2e\x8a\x67\x4b\x95\xba\x82\x92\x26\x64\x74\x42\x1c\x9a\x8c\x26\x63\xfc\xd2\xec\xc7\x4d\x99\x82\x68\xd5\x62\x5b\xa5\xb9\xae\xe8\x24\x71\x87\x9f\xe3\xe8\x8f\x1b\x6a\x27\x6e\x50\x53\xe4\x8e\x07\x9a\xfd\xa3\x62\x75\x44\xf7\x3b\x09\xbd\xfd\x71\xfa\x08\x30\xf6\x7b\x4d\x37\x26\x91\x34\x7f\x01\x12\xc9\x2e\xe3\x0f\x95\x64\xf8\xe0\xf2\x45\xef\x16\x2d\x4a\x79\x02\x24\x62\xd8\x12\xab\xad\xf2\x38\xab\xc5\xf5\x0f\x47\xbc\x4b\xf3\x0e\x8c\x19\x7b\xf2\x1a\x7e\x3d\x0c\xd5\xc9\xf1\x89\xd2\xb5\xaa\xf4\x3f\xc2\xcf\x3b\xf9\xf7\x1d\xfb\xa2\x7a\xc4\x17\xea\xab\x1f\x56\xd1\x23\x71\x4d\x88\xbf\x14\x65\xae\x77\x95\x3a\xd7\xc6\x9e\x1c\x61\x58\x8e\x16\xb4\x10\x12\xda\x7f\x51\x42\x88\x5d\x43\xe6\x8a\x0d\x54\xb7\x01\xcc\xe2\xe5\x62\xb8\x4d\xa9\xef\xe2\x14\xb8\x73\xb0\x4c\xc7\x0e\x33\x1c\x02\x19\xa3\xd0\x81\x1f\x94\x16\x5d\x45\x03\x8d\x09\x16\xaf\xce\xaa\xdb\x22\x17\xb6\x54\xcc\x7d\x7b\xa6\x56\x5a\xf3\xa5\x54\x81\x7a\xd9\x72\x5b\x22\x78\x1f\x45\x11\x68\xab\x99\xa3\x01\xe1\x65\xed\x73\x13\xa9\x73\x74\x9c\x39\x6c\xb7\x3c\xfe\x7f\xc5\x34\x3c\xef\x37\xd4\xf6\xfc\x0b\xc5\x8a\x7b\x55\x74\x50\x20\xef\x97\x30\x46\x84\x1a\x46\xbd\x5f\xb3\x63\xb4\x7a\x44\x0d\x2a\xad\xd4\xad\xce\x92\x6e\xb5\x22\xe8\xb1\xfb\xae\x9d\x3a\xb0\x3b\xd6\x9a\xb8\x1a\x7c\x97\xc0\x15\x09\x32\x5b\x6a\x5a\x2b\xf1\x54\xec\xfe\x8b\xbe\x3a\x73\x65\xc5\xc5\x4a\xf5\x3e\x14\xdb\x1e\x32\xd5\x49\x93\x15\x7f\x5d\xdf\xc2\xe1\x59\x34\x4c\x56\xcf\x63\xdd\x6e\x36\x58\x27\x96\x15\xf7\x66\x2f\xc5\xe6\xef\xcc\x9a\x24\xe9\x1b\xc0\x3c\x47\xc7\x97\xee\x21\x61\x3b\xd1\x05\x4c\x41\x57\x5c\x3c\x9e\xcc\x10\x59\x3d\x72\x67\x04\x0d\x33\xfb\xdc\x34\xc2\x3d\x1f\xf6\x33\x77\x0f\x09\xa6\xe4\x25\xc8\xdc\xb0\x75\x59\x64\x66\xa5\x57\x7e\xb2\x1c\x1c\xc4\x94\x6b\x39\xcc\x35\x4f\x45\x63\x50\xb1\x6d\x2b\x3b\xcd\x3b\xa9\x68\xd4\x6d\x56\x57\xb8\x1d\xa8\x1e\x7d\x87\x63\xf9\xe6\x6e\x87\xfd\x69\x46\x2b\x20\x3f\x1c\xaf\x16\xf6\xc4\x21\x76\xc8\xd1\x47\xfc\x25\x5d\x78\xeb\x38\x8f\x6f\xac\x36\x18\xac\x12\xec\x8d\x9b\x91\xc5\xce\x49\x7b\xf9\x51\x02\x36\x08\x0a\xd6\x90\x56\x56\xe4\x7c\xa3\xcb\x25\x18\x1e\x2f\x8f\xff\xd2\xb7\x20\x52\xa6\xd9\xdb\xd6\x56\x56\xaa\xba\x8d\x4b\x5d\xf1\xb3\xd2\x3e\x29\x5d\x81\xc3\xec\x3d\x57\xb4\x0d\x17\xde\xcb\x3e\x86\x9c\xa9\xd6\xa5\x5d\x75\xd5\x02\xc1\x98\x19\x07\x82\x17\x60\xbc\xb1\xb9\x16\x47\x33\x4c\x1e\x29\xda\xbd\x82\xe2\x58\x9c\x95\x8b\x1d\x1a\xfe\x66\x41\xd9\x2b\x1b\x02\xb2\x15\x89\xb4\x43\xa8\xb5\xd6\xe5\x4a\x97\xac\x71\x58\xe2\x56\xab\x36\x45\xee\x60\xd3\xd0\xa1\xad\xf9\x16\x86\xfa\x1b\x94\xe0\xa9\xa7\xda\x32\xec\xab\xd3\xe3\xe3\xe7\xc6\x66\x29\xc1\x3a\x8c\x42\x35\x2d\x2a\x9d\xa3\x5c\x0b\x2d\xf6\x92\xe5\x5a\xd4\x95\xf3\xdf\xd2\xca\x43\x8c\x08\xba\xbc\x06\xf9\xb1\x57\xbd\xc0\x87\xb3\x0f\xac\x6d\xb1\xd0\x93\xfa\x9c\x8d\x1d\xf3\xd7\xa4\x7f\xdb\x9d\x51\xc5\x0b\x82\x3b\x08\x53\xfd\x0d\x7b\xfa\x15\x7e\xc2\xef\x66\xdb\x9b\xb8\x1c\x4e\x2f\x41\x03\xe4\xf9\xd7\x80\x81\x3e\x8c\xff\x7c\xf9\xfc\xe4\xc5\x8b\x06\xfe\xf3\xf9\xf1\xe9\xf1\x37\xfc\xe7\xef\xf1\x33\xbb\x7e\x3b\x98\x0e\xa7\x97\xea\xea\xfa\xcd\xc5\x68\xc8\x55\xcf\xa0\xaf\x44\x80\x10\x58\x20\x8c\x7c\x83\xd4\x54\x44\x09\xcd\xbb\x13\xbe\xb1\xd5\xdd\x0b\xab\xaa\x93\x5b\x2e\x47\xa4\xb4\x29\x35\xfc\x9e\x99\x39\xd9\x2d\xae\xb6\x9b\x4d\x51\xd2\xb1\xea\x69\x64\x08\x31\x91\xf0\x39\x14\x0c\xf1\x1a\x6d\xd6\x6c\xf2\x27\x0f\x7b\xb3\xab\x8b\x5e\xbf\x55\xd0\x75\x59\xfc\x33\xcd\xb2\x78\xdf\xd7\x4e\xc2\x93\x40\x24\xb6\xc0\x32\xb2\xda\x3f\xdc\xf3\xe1\xf4\x52\x20\x0d\x45\x05\xc7\x1c\xcc\x82\x34\x57\xd1\x27\xcc\xff\xbf\x41\x67\xc9\x82\x5f\xf7\xbc\xfd\x24\x3c\x61\x66\x96\x55\xb1\xcd\x13\x15\xd7\x3f\xc8\x0a\xb9\x35\x7e\x0d\x6a\xe3\x2e\xaf\x2e\xcc\xff\xc1\xde\xbc\xad\xd7\x19\xb1\x70\x3b\x93\xca\xa9\x37\x87\x27\xa1\xea\x09\xa1\x50\x36\x00\x00\xa3\xe5\xd9\x20\x10\xae\xab\x2c\x5c\x0f\x21\x59\x56\x5c\x16\x34\x70\xf1\x10\xf6\xd4\xba\xdc\x8b\x4e\xfd\x17\xf1\x70\x4a\xf4\x80\xf0\xd4\x5b\xfe\xdb\xb0\x48\x74\x40\x70\x1a\x5f\x0f\xcc\x26\xfd\xdb\x8a\xb8\x38\x9b\xf2\xc3\x4c\x55\x8b\xc5\x4a\x8e\x52\x43\x7c\xd5\x35\xf9\x39\x34\xd9\x89\x31\xca\xb6\xfa\xfa\x5a\x6d\x91\xb2\xf2\x49\x3d\x82\x56\x36\x94\x64\xb9\x3e\xd6\xd8\xa8\xc2\xdb\xd8\xb0\xee\x1a\x49\x88\xba\x66\xbe\x08\x55\x2f\xca\xf4\xb2\x2e\x8b\x3c\x5d\xfa\x54\xf4\x97\x7a\x79\x1b\xe7\x69\xb5\xe6\xb6\xc7\x6a\xcd\xbf\x92\x84\x2f\x10\xcc\x73\x99\x42\xa7\x13\xe6\x84\x7d\xc1\xbc\xdc\xe6\x9c\x28\x80\xdb\xd8\xbd\x15\x78\x3b\x57\x98\xaa\x4d\xe2\x3a\x76\xcd\x7b\x69\x9a\xf7\x49\x2f\xb7\x20\x25\xc3\xed\x68\xc8\x74\x63\xc9\x15\x40\x21\x1d\x68\x43\xe4\xb4\xdd\xe3\x5e\x85\xaa\x37\x32\xcb\x18\xa0\x0d\xd0\x3a\x5d\xca\x99\xf1\x8d\x79\x5a\xc3\x22\xc1\x1e\x57\x14\x5b\x68\x3c\xa3\x0b\x53\x90\x73\xfe\x1b\x9c\x7c\x58\x66\xbc\x6f\x07\xae\x49\xaf\x43\xd5\x13\xfa\xbf\x6e\xa8\x21\xdb\xc3\xcc\xe2\x66\x25\xe8\x46\xc7\x9d\x32\xac\x9d\x57\x3c\x35\x96\xf4\xf6\x96\x80\x62\x77\xf0\xde\x36\xe5\xaf\xa1\x03\xd8\xdb\x31\x49\x9d\xe2\x9f\xfc\xe4\x89\xfd\xac\x9c\x98\xdb\xf8\x8e\xbd\x46\x8b\x11\x02\x23\x2f\xd8\xa7\x37\x4b\x75\x7b\xce\xba\xa7\x64\x7c\x9d\x3a\x16\xec\x94\x46\x1b\xa1\x6b\x60\xa9\x2e\x28\x49\x03\xcb\x0f\xc7\x37\xf0\x93\x5d\x5e\xd4\x13\x10\x94\x3b\x07\x38\xb3\x1d\xf9\x3e\x54\x3d\x6f\x0b\xf5\x04\x1d\x2e\xd7\x23\x41\x9a\xa4\x54\x89\xce\x74\x6d\x09\x88\xc9\x33\xae\x6a\x16\xba\x46\x66\x0d\xa2\x28\x11\xc8\xc4\xd6\x66\x47\xaf\x59\xdf\xa5\xc5\xb6\x6a\x1c\x78\xea\xfd\xad\xce\x5b\xba\xf7\x74\x9d\x25\x98\x79\xac\x34\x17\xbd\x41\x25\x55\xa0\x62\x9f\xd9\x34\xad\x18\x88\xaf\x94\xb9\x20\x06\xf9\x4e\xe5\xfa\x5e\x14\xe7\x79\xa5\x8a\x2e\x9f\xdc\xd1\xd4\x3d\xcd\x74\xcf\x1f\x50\xc0\xf2\xb1\x91\x32\xaf\xb4\xe0\xbc\x16\x2d\xf0\x67\xbe\xf7\x24\x3c\x39\x0e\x45\x41\x87\x3c\x5e\x1b\x58\x1b\x9b\x23\xb5\x87\x12\x6c\x0e\xdc\x56\xa9\x24\x80\xfb\xcc\x0d\x6c\xe6\xa2\x71\xbf\x00\x73\xa2\x79\x70\xd0\x5c\xc4\x69\x6d\x27\xb1\x0b\x08\x61\x65\x3d\x4a\x1d\x27\x3b\x7f\xfa\xfd\x2d\xdc\xb5\x6b\x4f\x8e\x61\x33\x52\x0e\x61\x08\x78\x46\xb9\x8a\x25\x0e\xf2\xb0\xea\x07\x2a\x2f\xee\x1d\x7c\xde\x6c\x08\x0c\x5a\xba\x7d\xe4\xee\x8d\xae\x88\x18\x93\xf7\x02\x08\x84\x03\xc0\xf1\x66\x13\x97\x71\xbd\xad\x08\x50\x19\xf0\xb1\xbc\x91\x45\x03\x31\xb1\x54\xc3\x46\x96\x97\xe5\x89\xe9\xc1\x67\xa1\xdd\xbd\x41\x7a\x18\xec\xee\x85\xdd\xb2\xcc\x7c\x64\x0b\x5c\x73\x6e\x27\x04\x6a\x93\x6d\x69\xd3\x93\x8e\xbe\xa6\x28\xe9\x2a\x5e\xea\x16\x4f\x5d\xa0\x10\x83\x55\xb5\x98\xee\xcc\x82\x4b\x89\x48\x11\x23\xad\x82\x59\x11\x4b\x99\xdd\x7d\x06\x51\x06\xa2\x53\x87\x75\x69\x11\x9b\x69\x8c\x8f\x8a\xcb\x14\xe0\x82\x9c\xe2\x78\xf8\x5c\xa1\xec\xa2\xce\x32\xf5\x31\x2f\xee\xf3\x40\xc0\x0b\xfd\xab\x83\x07\xd1\x1a\x2e\xcf\x2a\xb5\xbc\x2d\xd2\x25\xd5\x1f\xc8\x6d\x40\x96\x23\x31\xc7\xaf\x05\x75\x59\x5c\x2e\x6f\xd3\xbb\x18\xf8\x62\xd6\x81\x24\x38\x84\x00\x3e\xb3\x98\xa8\x44\xf3\xf7\x28\xca\x93\xe8\x23\xfc\x2e\x44\x5c\x78\x6b\x02\xa1\x58\xa2\x3d\x0e\x39\x33\xb5\x79\x41\x74\xf0\x62\xc1\x9c\x72\x00\xef\xb0\x28\xe1\xbf\xca\x5e\xff\x8f\x88\xc9\xe1\xf3\x49\xd9\xbe\x49\x4a\xe1\x36\x78\xb5\xb5\x18\x28\x4e\x0c\xbe\x32\xdb\xf6\xf3\x02\x7a\x4e\x67\xe4\x4b\x23\x7a\x1f\xbe\x2c\xa2\x17\xff\x91\x11\xbd\x45\x23\xa0\x07\x91\x3b\xb0\xf1\x3a\x43\x7b\xfb\x42\x7a\x18\xf5\x7a\x5a\x2c\xef\x34\xec\x2c\xcd\xa1\xe5\x77\x6a\xfc\x11\xe9\x8e\x60\x3d\x02\xfd\x75\x26\x73\x3c\x2c\x13\xb1\xdb\x83\x93\xe7\xd3\x12\x8c\x76\xf9\xc8\x5f\x51\x53\xc5\xf1\x30\x77\x4b\x9b\x21\xc4\x35\xe1\xdd\x12\x36\x25\x6b\x0d\x44\x3c\x44\x03\x24\x78\xc0\xd3\x49\xa3\x3a\x41\xd3\x37\xf3\x9d\x21\xd9\x72\x3a\xa2\xe2\x0c\x88\xdc\x90\x4b\x06\x15\x8e\xad\x37\x03\x4b\xd1\x5c\x8a\x1d\x3e\x1d\x6c\x68\x6b\xd7\xf2\xdc\x88\x6f\xf7\xbb\x6a\xb2\x82\x46\x41\x56\x40\x10\xd2\x98\x2e\xe6\xef\x3c\x30\x7b\x92\x56\x1b\x28\xfe\x5c\xfd\xa0\x4e\xfa\x4f\xed\xd8\x61\x87\xc1\xdd\x87\xca\x3a\x75\xda\xef\xf2\xd8\x9e\xf8\xdc\x5f\x37\x1a\xc2\x18\x3b\x5c\xf6\x65\x71\x43\x17\xa0\xa5\x32\x8b\xd7\x6c\x67\x68\x75\x78\x6a\x56\x06\x54\xc8\xad\x88\xa5\xd1\xb2\x06\x98\x73\x5b\x36\x68\x95\x96\x84\x30\x32\x0d\xb5\x18\xb2\xeb\x4a\x77\x5d\xc9\xb2\x55\x49\x5f\x8d\x8b\xda\xf4\xd2\xee\x48\x57\x63\x81\x2d\x40\x32\xe4\xfc\x81\x2a\x10\x98\x28\x86\xf6\xc1\x5d\xd9\x1a\xc7\x5b\x20\xf4\xcd\xa0\x48\xc2\x1a\x9e\x1d\x63\xfa\xa3\x99\xae\x4a\x83\xc1\xa2\x1f\xf9\xe4\xf3\x3e\x09\x76\x38\xec\x42\x85\x07\x9d\xd9\x33\x3f\x28\x48\x75\xb8\x4d\xbe\x6e\x8a\x8d\x77\x4d\xa9\x79\x5e\xfa\xab\x17\x4c\x03\x72\x70\xe8\xaa\x6c\xa4\x45\xdf\xf1\xfe\xbe\x3d\x62\x8d\x83\x9e\x2e\x75\x05\xdc\xfb\x2f\x9e\x70\x44\x34\xfd\xee\xda\xa7\x69\x79\x5a\xf3\xe5\xd2\x88\xf9\xa5\xdd\xa7\x23\x5d\xcf\x92\xe0\xa4\x03\x70\xdf\x6f\x58\x97\x5e\x24\x07\xc9\xfb\x02\x57\x8e\x4c\xe1\xb7\x5d\xc0\x25\xb0\x01\xd7\xcf\xca\x02\xd4\x76\x2a\xa2\x19\x0c\xc2\x98\x16\x0c\x0b\xec\xc9\x47\x4f\x0a\x3e\x18\x11\xf6\x2c\xa8\x94\x49\x12\x5d\xcc\x6a\x23\xa8\x13\x37\x1c\x7f\x3a\xcf\xc4\x54\xc7\x4a\x84\x10\x6c\xb1\xef\xf3\x86\xb4\xe0\xc4\x56\x35\x5a\x57\xea\xb9\xb9\xca\x06\x42\xf0\xb1\x51\x95\x8a\xee\x9d\xe7\x5f\xa2\x11\x22\x0a\x01\x10\x57\x27\x7e\x6d\x43\x7c\x88\x4a\x5c\xe8\x66\xa9\x4b\x9a\x37\x4b\x0e\xd6\x8f\xe2\xe7\xdc\xe8\xd5\xac\xd6\x04\x30\x2f\xaa\x75\x70\x46\xb5\xb3\xc2\x4a\x75\x67\xfe\x9e\xbb\x08\xd5\xa3\x91\x2e\xc2\x12\x9b\xab\x0b\xfa\x54\xac\x09\x3e\x06\xc3\xde\xf5\x16\xdb\x2b\xbc\x09\xd2\x55\xb3\xb3\xa6\x0d\x8f\xbe\x37\xe0\x0a\x95\x35\x70\xea\x78\xe6\x6f\x5c\x2b\xe3\x3a\xd6\xaa\xbe\xd7\xd9\x9d\x56\x87\x27\xa7\x7d\xb5\x2e\xf2\xfa\xb6\x22\xbc\x89\x3d\xb0\xa1\x78\x14\x82\x25\xd9\x4e\x2d\xf4\x12\x78\xed\xf8\x61\x08\x08\xe6\x87\x55\xe9\x27\x75\xf8\xaa\xf1\xa0\x58\x84\x56\x5a\x42\x2b\x22\xe2\xe9\x2d\x08\xcb\x8e\xda\xe8\x78\x5d\xe0\xce\x70\x20\x52\x4c\x89\xc6\x65\x3b\xf7\x08\x5a\x71\x18\x3a\x22\xdf\x59\x2e\x10\x6e\x09\x0e\x4f\x25\xde\xc1\xf5\x76\xe6\x1b\x8f\x4f\x2e\xc8\x8d\x49\xb1\xb9\x58\x9e\xde\x6e\x4f\x98\x8d\xc3\x55\x36\x5d\x71\xe9\x66\x0d\x8d\xf1\x12\xbc\x1d\xba\x6f\x3f\x90\xa3\x18\x5b\xea\x36\x1b\x5b\xb3\xc5\xb2\x44\x01\xff\x81\x57\x9d\x43\xbb\xd2\x41\xea\x1f\x04\x6e\xee\x1d\x5e\x3d\xbf\xd1\xa2\x89\xe4\x48\x78\x65\x3a\x1d\x9c\x86\x97\xfb\x54\xb4\xd0\x98\xcf\x76\xd2\xde\xcf\x76\x01\x5e\x9c\xbe\x13\x6a\x1d\x40\x32\x27\xdb\x61\x52\x74\x89\xd9\x1b\xaf\x85\x08\xd3\xde\xb0\x2a\x3b\x1f\x62\x41\xa0\xab\x66\x2c\x07\x8a\x32\x58\x5a\xc7\xfd\x47\x01\xd3\x65\xfa\x75\xee\xa9\x3c\xcf\x38\x18\x84\x0e\x04\xf4\x0c\xee\x4a\xe9\x29\xec\x33\x74\x9e\x87\xa0\x42\x29\x6e\xb1\x2b\xbe\xc5\x2e\x01\x37\x53\xf9\xe6\xb8\xbc\x2e\x06\x57\xa3\x0a\xf0\x34\xbe\x3f\xee\xdf\x37\x76\x1a\xfd\x1a\x41\x62\x5c\x5b\x63\xf9\x28\xc7\x2b\xcc\xf0\x34\x4d\x23\xa7\x80\x59\xac\x1a\x76\x56\x45\x83\x80\x3b\xd3\x96\x6b\x79\x78\x9b\x74\xcd\xd2\x16\xb0\x64\x06\x57\xa3\xc0\x7b\x05\xea\x6c\x66\x00\x7e\xc5\x96\xd6\x28\x7c\xe6\x2a\xc7\x19\x75\x18\xbd\x1d\x5c\x38\x45\x43\x67\x0a\xcc\x61\x2f\x5e\x81\x25\x85\xe6\x47\x73\x54\x1a\x1d\xc1\x7a\xc5\x86\x42\xbe\xb7\xa7\x9f\x55\x0f\x9b\x16\x10\x5d\xa5\xf0\x9e\x04\x87\x77\x20\x66\xbb\x2e\x7a\xcf\xa3\x37\xb6\x35\x90\x3f\x9e\x86\xa7\x1d\x63\xe3\xf6\x21\x54\xed\xf9\xc2\x8f\xf2\xb4\xf3\x4a\x27\x09\xc8\xd6\x83\x41\xeb\xd1\x3c\xf1\x42\xa5\xcc\x17\x40\x6f\x5d\x5d\x1a\x18\xa2\x4e\xa6\x0e\xff\x0c\x2a\x72\x56\x15\x30\xd1\x75\x9c\x66\x3c\x7e\xf6\x80\x46\xca\x74\x33\xbe\x78\xf5\xf1\x71\xb5\xac\x5b\x13\x81\x65\x03\x54\x8d\xe1\x66\xc4\xdd\x47\xcd\xf3\xa4\x5d\xed\xea\xc5\x5e\xd9\x23\x78\xde\x1c\x3b\x44\x86\x99\xa3\x6b\x63\x0e\x21\x41\x43\xe1\xd6\x11\x63\x69\xa8\x74\xc2\x1b\x7a\x70\x58\xc4\xa5\x24\x02\x9e\xb6\x2a\xb5\x8e\x3f\x72\xc1\x6f\x55\xeb\x4d\xe5\x48\xe1\xcc\xc1\xb2\x82\x70\x90\x8c\x67\xad\x09\x76\x88\xb4\x75\xc0\x13\x7d\x5f\xdd\x94\xc5\x76\x53\xf5\x1f\xad\x77\x6c\x89\x3a\x26\xed\x80\x26\x4c\x4c\xae\xef\xc5\xc8\xda\x5b\x16\x47\x5e\x27\x0d\xc7\x6f\xca\xb0\x3e\xbe\xa3\xe4\x28\x78\x98\xbf\xb8\x0e\x44\x4d\x3e\x94\x7d\x15\xc6\x9f\xd9\x6c\xcb\x6a\x0b\xe4\x95\x85\x98\x8e\x17\xe0\x2d\xa2\x83\x26\x1f\x49\x3a\xe7\x55\xcb\xbe\x6f\x9d\x5c\xe6\x54\xf1\xff\x6e\xf3\xd5\x9c\xfa\x3d\xac\xfa\x6c\xd5\x36\x77\xbb\x58\xb5\x8e\xb0\x00\x33\x41\x5d\x09\x9e\x3d\x61\xf2\xe7\xe1\xcb\x50\x4d\x79\xa7\x63\x65\xaa\xbc\xc7\x93\x2d\x1e\xa9\xb8\xf3\xdd\x75\xe2\xe2\xfd\x9c\x59\x65\xd1\xa1\xc6\xae\x85\x0d\x82\xb4\x89\x20\xc8\xcb\x7c\x94\x75\xa1\x36\xac\x75\x21\x6e\x29\x69\x4c\x79\xa6\x30\xd8\x04\x5b\xcd\xe2\x3f\x36\xa9\x44\xc4\x8c\xad\x5b\xbd\xf5\xe0\xac\xa0\x3d\x67\xd7\x70\x6c\xa9\x9e\xe9\x2e\x2f\xca\x5d\x1f\x71\xe0\x2a\x06\xc5\x48\xaa\xee\x5f\x20\x99\x27\x55\x76\x15\xc5\x47\x07\x0b\x63\x9a\x0f\x5b\xb0\xc4\xee\x8f\xa4\x64\x94\xd3\x6e\x66\xd4\x8a\xe9\x24\x89\xe4\x59\xae\xfc\x6c\x3b\x67\x06\xa9\x13\xde\xa9\xe0\xf2\xa5\xae\xe7\x28\x51\x23\xe6\x4b\x06\x5a\xd1\x1c\xf0\xef\x78\x4e\x38\xcb\x71\xc6\xde\x7b\x97\xbe\x33\x53\x9f\xf1\xaa\xf2\x2e\x7f\x0b\x69\x73\x60\x7c\xcf\x10\xb0\xdd\x5d\xde\x16\x05\xd6\x61\x42\x4c\x2a\xe0\x5a\x62\x92\x34\x8d\xd5\x4a\x83\xd1\x1b\x58\x91\x90\x80\xa1\x29\x50\xad\xa8\xd7\x90\x27\x87\x42\x35\xeb\x95\x39\xd7\x0d\x1e\x2c\x46\x5d\xd4\x68\x41\xc0\x41\x36\xe9\x1d\x8b\x41\x5a\xe1\x1c\x28\x59\x02\x6c\x2d\x17\xb2\x14\xf7\x40\x83\x1e\x67\x24\x92\x06\x58\x44\xfe\xd5\x7e\xcb\x8c\x42\x31\xd2\xb1\x6f\x14\xa2\xa5\xb5\x8a\x17\x55\x91\x6d\xa1\x12\x07\x84\xac\xd1\x87\xb7\xca\x93\x5f\xd2\x7f\xb3\xc3\x60\x5c\x71\xb3\x83\x43\x91\x15\x39\xd9\x84\x50\x3c\x2e\x68\x88\xf0\xdc\x85\x47\xae\x1e\xb2\x49\xcd\x28\xed\xfc\x78\x57\xc1\xfc\xe6\x56\x5d\x87\x51\xde\x7b\xad\x5b\xde\x2d\xf2\x39\x8d\x6a\xd1\xa7\x77\x19\xdd\x60\xa4\x5c\x58\xe9\xd2\x9d\x64\xaf\x1a\x6e\x7d\xb1\x92\x26\x2f\x45\x79\xaa\xb0\x4b\x2c\xa9\x19\xc0\x11\xdf\xc3\xe4\x1a\x0a\xe4\xb5\x8b\x13\x8a\x95\xb8\x12\x4e\x8e\x9e\x87\x2f\xa5\x54\xa9\x66\x9d\xe1\x86\x83\x12\xb0\x4b\x8c\x15\x60\x6c\xff\xd0\x4e\x37\x4e\xc8\xa3\x2e\x5f\x57\xba\x2f\x95\x17\xfa\xa3\xf4\x11\xb2\x56\x29\xf1\xbd\xba\xdb\xe2\x9e\xb2\xb6\x7c\x1a\x40\xa7\x56\xdb\x6c\x95\xa2\x8e\xb3\x71\x04\xc4\xd6\xf3\x86\xe1\x14\x53\x65\xd4\x1b\x0e\x75\x2c\x8b\xbc\xda\xa4\xcb\x6d\xb1\xad\xa0\x1a\xc7\x11\xbf\x3c\xc1\x51\x09\xf6\xb8\x29\x00\x9c\xca\x80\x54\x1c\x8a\x6a\xbb\x9c\x96\x8e\xf3\xcb\x2f\x1c\xd2\x7b\xce\xab\x46\x98\xab\xcb\x7d\x5a\xb5\x90\x27\xad\x73\xb1\xa9\x9b\x5e\xac\xf0\x78\xc1\xac\x22\x2b\xe4\xc1\xf9\x48\x1e\x30\xce\x97\x23\xa9\x69\xd1\xd3\x04\xbe\x64\x9a\x0d\x1e\x60\x36\x61\x93\xa5\xbe\x22\x6e\x77\xdc\x28\x66\x91\x53\x11\x19\xb7\x57\x42\x47\x5f\x41\x24\x17\xd2\xf1\xae\xd0\x13\xd2\xdf\x70\xe2\x65\x6c\xde\xda\xd1\x7e\x56\x59\x5f\xa2\x8d\x20\xf0\x24\xab\x85\xb9\x52\xe1\x8e\xa9\x6f\x9b\x94\x3f\x5d\x05\xc1\x7b\x1a\xba\x57\xee\xe3\x69\xc7\x30\x96\xcb\xe1\x98\x91\x57\xe1\x29\x98\xc8\x21\x04\x4c\x4b\xd7\x91\x0b\x68\xeb\x07\x4e\xc3\xce\x1b\xe2\x4f\x7d\x3e\xdb\xbb\x69\xef\xf1\xfb\x3a\x94\xc1\x56\x71\xce\x52\x98\xc6\x8b\xc5\x62\x6a\x73\xbd\x40\x9c\x8b\xb7\x89\x44\xbc\xf7\xf3\x00\x5b\x5d\xb1\x69\xf9\x4a\x44\x09\xa5\xf9\x4d\x66\xb9\xc7\xa0\x10\x8b\x0c\x39\x2c\x5f\xf1\xd7\x48\x85\x9a\xdf\xed\x43\xbf\xb5\x0e\xdc\xd9\xc8\x7b\xa8\x15\x0d\x81\x40\x88\x10\x92\x1a\x42\x4a\x5d\x9d\xa1\x55\x3b\xab\x63\x60\xb5\x2f\x4a\x35\xd5\x37\x5b\x44\x46\xc0\xf7\xac\x01\xdd\xa0\x73\xff\xe0\xe8\xd9\x59\xf3\x54\xd4\xb5\x3e\x40\x90\x22\xea\x3f\xab\x62\x8d\xa9\x7a\x97\xcf\xf7\x26\x83\x4c\xee\x0a\x1b\x17\xa8\xbf\x6f\x13\x4a\x13\x97\x2c\x18\x56\xda\xd6\xfa\xa6\xf8\x0f\x10\xbb\x90\xad\xdb\xdf\xac\x87\x41\x70\x3f\xda\xb0\x96\x17\x89\x72\xe0\x9b\xca\x7a\xf9\x94\x01\xd3\x3b\x15\x43\xe6\x2e\x54\xb3\xad\x0d\x0c\xe0\xfd\xc6\x17\x52\x93\x7b\x4c\xb8\xcd\x7b\x3c\xf0\x17\xf0\x9a\xd6\xf7\x2d\x20\xa2\xa5\x9c\xd0\xf2\x85\x88\x4e\xc6\x2f\xdf\xf2\x8b\xd7\x2b\xb7\x0e\xdc\xc8\x52\x5d\x58\x57\x37\x9c\x1f\x98\xed\x28\x7e\x41\x8b\x50\x06\x30\x8a\x95\x02\xf5\x54\x50\x92\xfb\x98\x66\x19\x61\xac\x39\x20\x0d\x87\x26\xa4\x21\x41\x99\x46\x29\xf5\x32\x44\xe4\xf9\x72\x7f\x45\x9d\x57\x3e\x27\x78\x0b\x97\x5e\xa8\xb7\xfb\xc8\x31\x2e\x6c\x5c\xd7\xf1\xf2\x96\xcc\x89\x2e\xdf\x92\x1c\x04\xbe\xfb\x5b\x3b\xea\x55\x68\xcd\x3a\x9f\xfb\xcf\xfa\xb7\xaf\x8c\x35\x12\xc1\x52\x00\x92\x1b\x7d\x2f\x0c\xc1\x49\xbe\x6c\x2c\x77\x1b\x4c\x20\xde\x47\x0b\x4e\xf1\x1c\xd3\x86\x0d\x66\x6f\x65\x27\x92\x0a\xc5\x4b\xcc\x36\xc9\x42\x59\xe9\x1e\x32\x84\xd8\xa6\x14\x1a\x3a\xab\xce\x61\x32\x5f\xa7\x13\x5a\xb4\xb6\xe3\x69\x78\x4c\x77\xa7\x2a\x1c\x75\xb2\xeb\xdd\x62\x67\xa1\xf5\x40\x96\xd3\x60\x78\xb3\x68\xff\xdb\xb8\x41\x0b\x2a\xe2\x4d\x44\x45\xe0\x15\x90\x7b\xed\x64\x9f\xb8\x0d\xf1\x73\xd3\x04\xa9\x85\x06\x2b\xac\xef\x53\x2b\x22\x7b\xdb\xc7\xd3\x2f\x39\x25\x70\xe5\x31\xc1\x01\x58\xef\x09\xb0\x0f\xc0\xb1\x05\xc9\x2c\xe0\x23\x49\x6b\xbb\x5e\x2d\xf4\xf1\xb3\x21\x87\x7d\x71\x6b\x98\x23\xaf\x44\xc9\x82\x0f\x9e\x22\x58\xe1\x8c\xad\xcd\x6d\x09\x45\x18\x3d\x1e\xdd\x5e\xa0\xa0\x6a\x42\xd9\x34\x7e\xbe\x02\xa4\x49\xb6\x53\x55\xba\x4e\x41\x9e\x12\xbe\x64\x09\x5c\x36\x1b\x63\xae\xb0\x1a\x9a\xd5\x6c\xd0\xf6\x7c\x71\xa5\x1f\xde\x27\xd0\x96\xe9\xa0\x3c\xec\xdb\x33\xd6\xc1\x41\xd8\x4c\x12\xb6\x11\x74\xaa\xb1\xaa\xf8\xd9\x16\x3e\xbb\xdf\x78\xda\x5b\x3f\x12\xaa\xc3\xf3\x14\x11\x35\x74\x1c\x3f\x98\xff\x08\xda\x28\x3f\x69\xbb\xf0\x23\x1e\x8a\x9c\x08\xd6\x1e\x7c\xcb\xba\xd2\xd9\x1d\x28\x30\x08\x56\x50\x5b\x32\xb7\x94\x5c\x07\x62\x01\xf7\x81\x72\x2d\xdc\x43\x57\x05\xeb\x7b\x38\xf9\x29\x9a\x46\x67\x6a\x38\x39\x8b\xd4\x68\xa6\xae\xa6\x93\x9f\x46\x67\xd1\x59\x87\xc4\xa1\x9a\x8c\xd5\x60\xec\x73\x7f\x05\x2d\xe2\x2f\xf3\x86\xc1\xf8\x83\xfa\xcf\xd1\xf8\x2c\x50\xd1\x08\xe4\x14\xa3\x9f\xaf\xa6\xd1\x6c\x16\x9d\xa9\xc9\x54\x8d\x2e\xaf\x2e\x46\xd1\x59\xa0\x46\xe3\xe1\xc5\xf5\xd9\x68\xfc\xd6\x3d\xe5\x62\x74\x39\x9a\x0f\xe6\xa3\xc9\x38\xe0\x27\x8e\xa2\x99\x9a\xbf\x1b\xcc\x81\x98\xab\xd9\xdc\xf3\x69\x14\x99\x37\x9e\x45\xe7\xd1\x70\x3e\x93\xbc\x60\x17\x51\xa0\xce\x47\xf3\xbd\x74\x60\xa6\x29\x82\x57\x6c\x34\x7e\xfb\x14\x82\xb0\xc1\xf8\x4c\x5d\x45\xd3\xf3\xc9\xf4\x72\x30\x1e\x46\x4c\x18\xd6\x6c\x97\xe3\x0b\x9b\xbd\x9b\x5c\x5f\x9c\xc1\x90\x78\x1f\x32\x03\x1d\x51\xbb\x47\x3f\x45\x6a\x34\x86\xcf\x4c\xa3\xd9\x55\x34\x9c\x07\xe6\xcb\xea\x70\x3c\xc1\x6e\x8f\xc6\xa3\xf9\x68\x70\xa1\xce\xa2\x9f\xa2\x8b\xc9\x95\x99\xc7\x29\x7c\x7c\x02\xc3\x3b\x9c\x8c\x51\xa2\x72\x32\xed\xab\xc1\x6c\x76\x7d\x19\x51\xab\x66\x73\x9e\x8f\x71\x34\x8c\x66\xb3\xc1\xf4\x83\x9a\x45\xd3\x9f\x46\x43\x18\xf6\x69\x74\x35\x18\xc1\xc3\x86\x93\xe9\xd4\xb4\x64\x32\x0e\x71\xd2\xf7\x50\x9c\x0d\x27\xe3\xd9\x7c\x34\xbf\x9e\x47\x33\xb3\x18\xcc\xa4\x8e\xa1\x69\x66\x80\x71\x34\xdc\x8a\x09\xd5\x78\xa2\xae\x67\x11\xb7\xa1\x39\x4a\x83\xeb\xf9\xbb\xc9\x74\xf4\x3f\xa3\x33\xf5\x2e\x9a\x46\xb8\xe4\xa2\x9f\x87\xd1\xd5\x5c\xae\x3f\xd7\x14\x24\x39\x0b\xd5\x3c\x9a\x5e\x8e\xc6\xb0\x4e\xf8\x94\xfe\xab\xb9\x4c\x47\x1c\xb5\x30\x5b\xb2\x36\xbb\xbf\x16\x94\xd0\x71\x55\xe9\x12\x55\x95\x3a\xf9\x4d\x30\xe9\x72\xe8\x38\x2f\x40\x0d\x05\x48\x93\xff\xbe\x4d\x6e\x50\x22\x1e\xb3\x46\x8e\xbf\xa4\xdb\x85\xf2\x91\x25\x7b\x1d\x1b\xcf\xa7\xa1\x07\x42\x12\x07\x88\xa2\x8d\xb5\x27\x48\x06\x30\xef\x45\xb0\x6a\x73\x4b\x54\xaa\x77\x05\x17\x7f\xba\x89\xf3\xba\xd7\x37\x76\x9e\xbe\xe1\xe8\xcc\x0f\x7e\x9e\x0e\x1e\x24\x3e\xfe\xac\x1b\xba\xd6\x9d\x38\xb6\xe3\x24\xd1\xe9\x14\xdd\x96\x05\x1c\x7b\xb2\x6f\xe2\xb5\x3e\x59\xa2\x97\x84\xa3\x5c\xc2\x69\x78\xda\xba\x33\xe1\x38\x0c\x90\xc8\xe7\xd5\xb1\x4a\xa8\xfc\x1a\x94\x1a\xcc\xe1\xed\xbd\xc0\xb2\xee\x6c\xca\x02\x7c\x89\xf4\x4e\x67\xbb\x80\x65\x87\x53\x2c\xb8\x49\xdd\x93\x30\xb3\x04\x89\x9d\x0d\x1c\xb8\xf4\x68\xd3\x4e\x44\xb0\xfc\x40\xdc\x37\xc6\xf9\x15\x62\xc5\x75\xa1\x36\xf1\xce\x7b\x7b\xac\xd6\x5b\x92\x42\x87\x8f\x83\xcd\x21\xf8\x28\x08\x02\xca\x3e\x52\xa9\x36\x71\x85\xcc\xee\x04\x47\x26\x2a\x93\x6e\x58\x56\x73\x34\x5d\xf5\xbc\xe9\x52\x52\xc6\xf7\x7c\xb3\xdb\x75\x8f\x8b\xba\xe9\x5a\xed\x81\x99\xd9\x45\xd8\x7c\x11\x6c\xad\xc6\xb0\xd9\x81\x0a\x7c\xfa\x32\xee\x22\x32\x56\x22\x0f\x2d\x04\x50\x69\x9b\x61\x7d\x67\xdd\x18\x28\x62\x00\x13\xa3\x4b\xee\x34\xd8\xb6\xda\x16\xd8\xb5\xba\x46\x56\x11\x0f\x00\xf1\x47\xb6\x57\xe2\x67\x2f\x42\x9f\xb4\x49\x90\x39\xd9\xc2\xf4\xb4\xf4\x0a\xfd\x70\x60\x78\xf5\x6c\x74\x99\x16\x09\x17\x8a\xea\x04\xf3\x71\xa1\x8f\x28\x00\x93\xd8\x0a\xbe\x33\xff\x50\x80\x70\xfb\x3b\x18\x5b\x61\xf1\x3e\x6d\x0f\xef\x43\x7f\x3c\xb6\x89\xf7\x92\x4d\xb5\xf6\x70\x7b\xdc\xb0\x2f\x1e\x3a\xb5\xd4\x77\xc5\x47\x9d\x08\x94\x6a\x07\x4f\x15\x03\x54\x13\xc4\x05\x27\x81\xaa\x8a\x0c\xf0\x2b\xb6\xd0\x37\x40\x66\xa6\x84\x3e\xf5\x00\x5e\x51\xae\x57\x7b\x2b\x3c\xb7\xb7\x02\x1e\xff\x0f\x9e\xfd\xbc\xfc\xbd\x1d\x2d\x0f\xd5\xaf\x70\x8c\x52\x20\x1b\x31\xc2\xbc\xa2\x4b\x5d\x15\xd9\x9d\x4e\x5c\x42\x70\xb1\x93\xd2\x9b\x95\xae\x6b\x44\x76\xf4\xa9\x44\x96\x36\x35\x5d\x7d\xb4\x2a\xbb\x7a\xea\x36\x10\xcd\x3d\x86\x90\xec\xf6\xbd\x8b\xb3\xad\x6e\x98\xcf\x0f\x1f\xe9\x7b\x01\x15\x8e\x21\xa6\x8e\x3f\x82\xb8\xa5\xb9\xb6\x96\xc0\x6b\x64\x76\x3a\x6b\xfc\x59\x05\x83\x35\xfc\xa5\x28\x5d\x23\x70\x9c\xf0\x10\x29\x4a\x8f\xbb\x1c\xa6\xf7\x85\x95\x1e\x44\x6d\x79\xd3\x6e\xc1\xb5\xd3\x68\xda\x5f\xb1\x69\x7f\x35\xbb\x1b\xb3\xe3\xa6\x7d\x3a\x4f\x30\xa3\x6a\x71\xa4\xcc\xaa\x53\x79\xd6\x00\xaf\x49\x90\xc2\x06\xf1\xed\x4a\x67\x99\x2e\xab\x3e\xf9\x13\x2e\xbb\x72\x17\x67\x69\x92\xed\xe4\xb0\x41\x54\x92\x59\x4e\x2b\xaf\x66\x80\xb4\x52\xec\x3c\xb6\x58\xa8\x2c\x95\x90\x60\xa1\x04\x9e\xca\x50\x58\xcc\xc6\xca\xba\x18\x11\x21\x2e\xfc\x19\x6d\xa8\xf1\x44\x0d\x47\xd3\xe1\xf5\xe5\x6c\x6e\x4c\xd6\x19\xd8\xb0\xf6\x4f\x18\x59\x9a\xbf\x8b\x26\xd3\x0f\x81\x62\xfd\xf3\xf9\x64\x3a\x57\x87\xd6\x40\x57\xe3\xe8\xed\xc5\xe8\x6d\x34\x1e\x46\xfd\x00\xcd\xcd\x81\x31\x52\x27\x53\xb4\x40\xdf\x8f\x66\x51\xa0\x66\xef\x06\x17\x17\xc6\x70\x0d\xba\x8d\xd6\xa0\xdb\x64\x0d\xd8\x98\xb5\x4a\xeb\x13\xb0\x39\xa5\xb5\x68\x3f\x33\xbb\xbe\x32\xde\xc3\x94\x4d\xca\xc9\xb9\x9a\x5d\x0f\xdf\xa1\x7d\x1f\xcd\x02\xf5\x26\x82\x41\xb8\x88\x8c\xe5\x6e\x3e\x71\x15\x4d\x67\x93\x31\xba\x01\xe3\x0f\x6a\x34\x3e\x1b\x4d\xc1\xc2\x36\x86\xf6\x68\x70\x01\x7e\xc8\xe8\x2c\x1a\xcf\xcd\x7f\x83\x29\x3c\x9e\x45\xff\x75\x4d\x76\xed\xd9\xe0\x72\xf0\x36\x9a\x59\x13\xf6\xdd\xc0\x74\x3d\x9a\x3e\xe6\xbd\xf0\xf7\xcc\x7b\x2f\x26\x33\x78\xc0\xdb\xc9\xe4\xec\xfd\xe8\xe2\x22\x40\x5e\xe1\xd9\x7c\x72\x75\x35\x78\x1b\x99\x11\xbd\xbc\xba\x36\x0f\x3d\x1f\x8c\x2e\xae\xa7\xe0\x9b\x5c\x0e\x2e\xce\xaf\xc7\x43\x7c\x1a\x35\xde\xcc\x9c\x19\x63\x1e\xc3\x4b\xe3\xee\x78\xad\xc4\x97\x99\x81\x88\x7e\x8a\xc6\x6a\x24\x86\xe7\x03\x4d\xd0\xbb\xc1\x4f\x91\x7a\x13\x99\xbf\x8e\x8d\x1f\x63\xbc\x32\xf4\x62\xae\x26\xb3\xd9\x88\x08\x95\x79\x60\xe9\xc9\x21\x1b\xf6\x9d\xab\x8d\x9e\x6c\xdc\x95\xc1\xd5\xd5\xc5\x07\x33\xf6\xee\x8f\x66\x08\xce\xa2\xc1\xfc\x9d\x69\x1e\x4e\xc7\xe0\x42\x8d\xc6\x7f\xbb\x9e\x82\xc3\x73\x7d\x31\x37\x6b\xec\x7c\x3a\xb9\x14\xad\x7d\x36\x13\xab\x8e\xdd\xb0\xe8\xe7\x79\x34\xc6\x97\x8c\x86\x30\xcb\x17\x83\xf7\xc6\x97\x7a\x37\x7a\x33\x9a\xcf\xf0\xeb\xae\x91\xa1\x9a\x4d\x2e\x23\xf5\xb7\xeb\xe9\x68\x76\x36\x82\xb1\x9c\xa9\xb3\x09\x36\xf4\xe2\x62\xf2\x9e\x1e\x3a\xbc\xb8\x9e\x41\x9f\xa6\x8d\x1e\xba\xa5\xb1\x77\x65\x04\x6a\x36\xc1\xc1\x71\xcf\x31\xf3\x24\x1e\x74\x39\xf8\xe0\x8f\x8d\xf1\x0c\x91\x57\x32\x44\xb6\xb8\xb7\x66\xad\x8f\x2f\x4d\xdf\x22\xb3\x3b\x67\xd1\x74\x46\x61\xcc\x8e\x3c\xaa\xea\x09\x42\xe0\xb4\xd6\xeb\xa0\x87\x45\xee\x31\x9a\xbf\x2a\xf5\xc4\x31\x5e\xfc\x55\x0d\xc3\xf3\x70\x1a\x9a\xa3\xf9\xf8\x44\x1d\x4e\x96\x75\xa8\x4e\xbe\xff\xfe\x25\x92\x37\x57\xa4\x35\x5b\xac\xbc\x07\xb7\xca\x70\x7b\x70\xea\x3d\xf8\x11\x3f\x05\x8a\xcd\x12\x99\x99\xb8\x24\xc9\x06\xaf\x55\x27\xa7\xe1\xe9\xc9\xa9\x3a\x9c\xe9\x0d\xb7\x0b\x90\x50\xa6\x5d\x08\x70\xab\x6f\xdb\x1f\x37\x6d\x11\x3d\x3b\x7d\x1d\xbe\x3e\x3d\x3e\x3d\x72\x5c\x23\xf6\x57\x2f\xd4\xe1\xdf\xb6\xb9\xe6\x1e\x9b\x03\x15\x07\x1d\x62\x66\x70\xb5\x44\x79\xa2\xae\x2b\x6d\x0e\x76\xac\xa8\xed\x4a\xfb\x00\xb9\x19\x00\xc1\x5a\x19\x41\xc9\x15\x7a\x12\xaa\xcb\xd1\x6c\x18\x5d\x5c\x0c\xc6\xd1\xe4\x7a\xd6\x0e\x47\x7f\x16\x9b\xdb\xbf\x0e\x93\x5b\x17\x07\xea\xc2\x0f\x4d\x0e\xe3\x2c\x5d\x15\x65\x9e\xc6\xca\x27\x90\x94\xe1\xc1\x7a\x1f\xa1\x74\x60\x9c\xb7\x38\xdf\xd9\x1c\x73\xe5\x02\x82\xfd\xe0\x33\xc8\x2a\xdf\x37\xdc\xa1\x24\xad\x36\xc0\x6e\x62\xb3\xf4\x16\x72\x5f\xe4\x0c\xcf\x84\x9d\xb7\x4c\xeb\xf4\x9f\x3a\x87\x92\x52\xb8\xcd\xb9\xcc\x73\x79\x1b\x97\x35\xac\x18\x4c\x8e\x98\xb5\x4b\x8e\x7a\x52\x58\xe6\x4d\x8e\xfe\x11\x2d\xe6\xac\x46\x8a\x95\x95\x1a\xac\x75\x99\x2e\xe3\x80\xd2\xa3\xd6\xc7\xd9\x4b\x23\xba\x8f\x9e\xd2\xa3\xef\x24\x2b\xee\x5c\x27\x80\x41\x18\x5a\x7e\x51\xf3\xdb\xb1\x59\xb9\xba\xcc\x09\x98\x82\x49\x08\x37\x41\x54\xdc\x72\x07\x9c\xa7\x58\x5d\x9b\xe6\x6a\x16\xe7\x75\xac\x86\x59\x5c\xc6\xe6\x71\x00\x8a\x69\x7d\x07\x2c\xc7\xa2\x72\x24\x8f\xcd\xca\x01\x60\x60\x7c\xac\x66\x1d\xd8\x50\x05\xfd\xe3\x23\xac\x8e\xcc\x0e\xf9\x07\x53\x91\x9a\xa5\xe6\x27\x1e\x71\x41\xd9\x15\xeb\x70\x0d\x71\x7e\xb3\x8d\x11\xda\x1d\xbb\x5a\x5a\x3b\xb1\xa0\x26\x50\x6e\x8d\xe7\x48\x6e\x09\xb8\x4e\x25\x86\x2b\x3a\x78\xdd\x3b\xc8\x3d\x43\x08\x28\x4e\xc6\xf6\x5a\x37\x77\x31\x04\xd3\xf0\x58\x1a\x54\x96\xc5\xba\x3b\x87\xdf\x08\x14\x70\xd5\xab\xdd\x11\xad\x99\xc5\x0a\x34\xc8\x76\x13\x11\x28\x51\xf0\xef\x2f\x4a\x30\x13\x4f\x84\x0b\xdb\x3a\xcd\xd2\x7f\xda\x69\xf3\x60\x2a\xad\x74\xba\xd0\xc0\x29\x88\x79\xc5\xac\xbe\xee\x8e\x0c\x1b\x1a\x62\x52\xc9\x11\x0b\x5e\xa8\x23\x84\x5d\x03\xb0\x8f\xfe\xc7\x36\x45\x00\x07\xd4\x7b\x39\xca\x74\xe2\xe3\x4d\x2b\xa7\xf7\x63\x61\xcf\x5e\x8c\x5e\x48\xc2\x23\x3b\x89\x20\xaf\xb3\x28\x08\xa2\x00\x0d\xd5\xa5\x31\x85\xae\x2e\xa2\x23\x0a\xa0\xa2\xf1\x8b\x89\xf6\x56\xaf\x00\x06\xa4\xab\xf4\x06\x83\x5d\xa2\xde\xb4\x95\x29\x8f\x2b\xd5\xbb\xdc\x66\x75\xba\xc9\xf4\x11\x8b\x98\xf6\xc2\xae\x5f\x5a\x12\x07\x5a\xa5\xed\xf7\xa2\xe0\x5d\xc5\x0a\xec\x38\x65\x8f\x34\x00\x67\x50\x60\x8b\x6c\x06\xfa\xea\x82\x23\x3b\x80\xd3\xc9\x31\xc7\xc6\x7e\xa7\x3b\xf1\x5d\x1c\x65\x2f\x52\x84\xce\xd6\x76\x96\x5c\x20\x52\xf7\x51\x84\x01\x89\x98\x3a\x72\x1f\x05\x42\x31\xc9\x80\x62\xa5\xc6\x59\xff\x45\x9e\xba\x8f\x31\x8f\xe1\xe3\x0f\x9d\x14\xee\x8f\x82\x01\xbc\x26\xb2\x49\x7e\x3e\xdd\x84\x7b\x10\x53\x36\x29\xc5\x0f\x20\x31\x80\xd8\xd3\x35\xb4\xfb\xa4\x96\x9c\x61\x95\x69\xe6\xb2\x5c\x87\xcb\x62\xfd\x9d\x19\x7a\xab\x51\x2a\x75\xaf\x5c\xea\x56\xd8\x12\xf2\x03\xbe\x08\x0c\x95\x42\x3e\x9c\x08\xda\xab\x06\x13\xaa\x99\xd6\xde\xcb\xf8\x00\xb6\x14\x6b\xf6\xa0\xbc\xb1\xac\xdb\x42\x14\x47\x22\x2d\x5a\x2d\x0f\x61\x1a\xfd\x7c\x5c\x5a\xfd\xe0\xe6\x4b\xf0\xd5\xc1\x47\x3b\xc2\xf4\x5d\x34\x3b\x69\x25\x58\xdf\x46\xf9\x32\x3c\xb8\xe2\xe5\x2f\x6a\x4c\xed\x5b\x10\x4d\xdf\xe0\xe1\x7c\xd1\x78\xc4\x8f\x07\x83\x2c\x23\x01\x2c\x35\x65\x12\xce\x83\xa1\xa7\x0d\xf4\x83\xfa\x5f\x4f\xfa\x09\x0f\xfe\x9f\xf1\x64\x1e\xfd\x40\x4a\x6e\x9f\x9c\xea\x89\x4b\x32\x22\x8e\x10\x52\xa0\x55\x66\x5e\x9b\xed\x5c\x2e\xd4\x7d\x47\x5b\x69\xab\x0e\xb0\x1c\xc9\xfd\x77\x8c\x11\x2e\xd0\xea\x16\x50\xea\x4c\x32\xb1\xa7\x25\x65\xec\x2b\xfd\x61\xb1\x0d\xb0\xde\x35\xc5\xf7\xe0\xad\x4d\xed\x2b\x38\x58\xfc\x72\xbf\xff\xf7\xe0\xa9\x5b\xfd\xcd\x41\x8b\xad\xaf\x4d\x38\xbf\x2f\x35\x0c\x47\x33\xa3\x38\xc2\x80\x5c\xb6\xca\x53\xe3\x27\xcc\xa4\xcf\x5a\x24\x56\x50\xb3\x81\x47\x6d\xfa\x40\xbc\x59\xc4\x4d\xdf\x79\xbe\xb6\x0c\x80\xd1\x48\x9c\x78\xb0\x59\x8a\x9b\xa2\xed\x8f\x58\xf8\x64\x97\xce\xa4\x9d\x3a\x27\x9e\xe8\xc0\x01\xd6\x46\x10\xbf\x32\xef\xa8\x3e\x5b\x54\xb1\x93\x55\x0f\x9a\x6a\xf1\xf0\xe6\x90\x13\x9c\x55\x80\xf3\x85\x75\x43\x11\x77\x01\xfa\x0d\x64\x69\x51\x27\x1c\xd9\x43\xf2\x9a\x5e\xb4\x8a\x9b\xe5\x89\xb7\xde\x56\x75\x80\x20\x3d\x26\x34\x8a\xeb\x96\xe2\xa1\x2d\x91\x41\x1d\xf3\xc0\xc2\xa7\x0b\xaa\x43\x81\x28\xa3\xab\xf8\xab\x96\xa5\xb1\xbc\x98\x7b\xb9\x77\x55\xdc\x33\x5e\xd3\x1f\x4e\xc4\x3f\x38\x02\x82\x86\x36\x6b\x2a\xea\xab\xa1\x79\x04\x88\xc9\x8c\x77\xd1\x02\xda\xf8\x18\x3a\xd1\x49\xf1\x5a\x3c\x91\x9a\x94\x58\x4d\x95\x47\xe2\xb5\xd8\xec\x90\x33\x9e\xe6\x26\x78\xac\x33\x8c\x0e\x33\xee\x18\x4b\x41\x65\x19\x0c\x0e\x1e\xe9\x0b\x8d\x15\x31\xc6\xf4\xc5\x16\x00\x92\x74\x51\xd4\x75\xb1\x56\x4b\x6d\x06\x10\x08\xdb\xf6\x8e\x69\xd8\x62\xaf\x00\x0b\x03\x63\xbe\x60\x46\xa7\x6b\x9d\x7b\xe0\x2c\xdb\xe0\x37\x7b\x1b\x6c\x9d\xc2\x93\xe3\x57\xea\x93\x3a\x7d\xae\x36\xe9\x27\x9d\x31\x05\x1c\x76\x60\x99\xa5\xcb\x8f\x5c\xf2\xfe\xc0\x28\xa4\x35\x55\x31\x21\x31\x4f\x7d\xab\xd7\x6a\x11\x2f\x3f\x82\x38\x49\xe3\xca\x5e\x15\xe5\x8d\x0e\x8b\xf2\xa6\x63\xa0\x5b\xab\x41\x16\xa5\x77\x0f\x31\x24\x35\x60\x56\x2b\x1e\x60\x1a\x5b\x1a\x8b\x3d\x63\xba\xaf\x97\xcd\x26\x04\x9f\xd5\x39\xb2\x47\xbe\xd1\x36\xff\x89\x7f\xc2\xef\x86\xc3\xa3\x37\x1f\x8e\xc6\xc3\xa3\xd9\xe0\xe8\x24\x3c\xfe\x0a\x04\xd0\x0f\xf3\x3f\x3f\x3f\x79\x71\xf2\xba\xc1\xff\x7c\xfa\xea\xf4\xd5\x37\xfe\xe7\xdf\xe3\x67\x08\x35\x9f\x77\x1a\x58\x84\xcc\xa1\x29\x34\x43\x8f\xc6\x45\xee\xc8\x85\x8e\x66\xb7\x71\xa9\x07\x59\xfa\xd1\x58\x5a\xc7\x6a\x38\x8d\x06\x00\x70\x1a\x4e\x2e\x2f\x27\xe3\x99\x1a\x4e\xa6\x57\x93\x29\x06\xc6\x47\x33\x8c\x8b\x43\x14\xff\x7c\x34\xbd\x84\xc8\xf9\xd9\x24\xc2\xdf\x13\x18\x8d\x72\x54\x88\x5b\x8a\x66\xa1\x4b\x14\x51\x94\x1e\x51\x42\xd3\xc1\xf9\xdc\x62\xd5\xec\x33\xe0\xfd\x91\x1a\x8c\xd5\x60\x3e\x9f\x4c\xc7\xd1\x87\xa3\xe1\xc5\x28\x1a\xcf\xd5\x34\xba\x80\x56\xcc\xde\x8d\xae\xc2\x76\x3b\xe9\xe5\x33\x7c\x3a\xa6\x4a\x28\x2f\xc0\x38\xb8\x23\x8b\x83\xeb\xf8\xfe\xe5\xe0\x3f\xa1\x09\x12\xc7\x36\x8d\xde\x0e\xa6\x90\x50\xc3\x04\x99\x7b\x26\xe3\xee\x02\x1c\x01\x42\x3c\xcd\x9a\x59\x14\x4a\xf3\x34\x92\x26\xa3\xf9\x4c\x5d\xcf\xa2\xf0\x80\x0c\xba\x03\xf3\x74\x48\x31\x1d\x0e\x66\xea\x2c\x3a\x1f\x8d\xa3\x33\xf5\x26\xba\x98\xbc\xef\x77\x82\xfc\x22\x40\x54\xcd\xec\x58\xb6\x07\xc3\xa7\xfd\x3e\xec\x0d\x87\x57\x17\x3d\x35\x99\xaa\x1e\xfd\xae\xd7\x47\xf8\x1c\x2b\x66\x5e\x4d\x27\xf3\x68\x38\x37\xef\xfd\xa0\x86\x93\xab\x0f\xd3\xd1\xdb\x77\x73\xd3\xbb\xef\x38\x6b\xd8\x48\xe3\x84\xe0\x2e\x12\x5c\xcc\x3e\x0a\x3f\x39\x7f\x67\x26\xd0\x43\x8c\x75\x00\x14\xf1\xb5\x90\x0a\x8a\xce\xc2\x83\x37\x1f\x54\xf4\x73\x34\x1d\x8e\x66\x66\xa4\x00\x5d\x67\xda\x60\x31\x7d\xf0\x7c\x3b\x16\xef\xa2\x69\x84\xb0\xbb\xc1\x10\x10\x68\x90\x6c\x7b\x3b\x8d\x20\xf9\xf4\x26\x52\x6f\x26\xd7\x63\xe8\x4d\x7b\xbc\x2c\xde\xcd\xfc\x09\xff\x31\x99\xaa\xb7\x66\xda\x67\xf0\x48\xf3\x7b\x7a\xf9\x70\x32\x9e\x0f\x60\x42\xcc\x1b\xd5\x68\x0c\x69\xa5\xd1\x59\x34\xb5\x59\xa7\x0f\x93\xeb\x29\xb5\x82\x41\x86\x90\xd8\xc2\x97\x9a\x76\x0d\x27\xe3\xb3\x11\x2c\xde\xb0\xcd\xf5\x4d\xc9\xf1\x18\xc8\xac\x81\x45\x81\x61\xcb\x3e\x51\x31\xa5\x01\xc0\xaa\x45\xb4\x4a\xba\x8c\x33\x24\x3e\x0c\x54\x9c\xd7\xb7\x45\x56\xdc\xec\x90\x54\x79\xb9\x5b\x1a\x7f\x38\x49\xe3\xc0\x45\xc9\xcd\xe5\xcf\xba\x18\x69\x5d\x41\x2c\xbc\xd4\x50\xd6\x23\xc9\x92\x90\xa8\x29\xce\x0a\xcb\xd0\xa8\xf2\xed\x7a\x81\x46\x1c\x57\xd3\xe4\xae\x3c\x21\x70\x61\x33\x94\xab\x25\xda\x2f\x24\x22\x49\xf4\x46\xe7\x09\x24\x86\x58\x45\xdc\x21\x64\x03\xf0\x32\xe2\xaa\xd2\xeb\x45\x86\x74\xa0\x05\x84\x46\xec\x38\xdc\xdf\x16\x99\x0e\xd5\x00\x23\x86\xcc\xad\xeb\x74\x5b\x55\x63\xcc\x90\x5f\x81\x24\x2a\x20\x5b\x96\x80\x45\xd7\x16\xd4\x3e\x8c\x5d\xda\x6d\xa1\xb3\xe2\xbe\x6f\x63\x19\x2d\xe6\xc6\x06\xc6\x7c\x11\xaa\x5e\xe3\x71\x0d\x52\xe9\x86\x4a\x22\x8b\x23\xfa\xbf\x30\x03\x84\xe3\xb9\x29\xf5\x91\xfe\x44\x89\x3d\x18\x27\x39\xdb\xc0\xdd\xcd\xd5\x1b\xeb\x6d\x05\xf3\x2e\x30\x5a\x81\x4a\xca\x78\x1d\xd7\x14\x8a\x0d\xd4\x0a\x13\x0a\x71\x66\x7f\xb3\x2e\x90\xca\x24\x5d\x4a\x16\xcd\x40\x55\xe0\xb5\x97\x7a\x09\x25\x1d\x37\x66\x3e\x6a\x4b\xe4\x85\x5f\x8d\x17\x65\x8a\x70\x4a\x98\xe8\x44\xe7\x15\x3d\x94\xf0\x11\xd8\x05\xf0\x64\xda\x4b\x8d\xf4\xd3\x4a\xbd\x8c\x8d\x4f\x86\x34\xe4\x90\xb4\xc2\xef\x27\xf1\x06\x50\x43\x9c\x4f\x42\xba\x8c\xdf\x7c\xb2\x1b\x33\xbb\x6f\x62\x97\x96\x72\xbb\x78\x9c\xb3\x1c\xda\x57\x20\x08\xde\xf6\xf7\x91\x5a\x59\x7e\x51\x22\xc9\x95\x07\xe0\x7f\x3e\xfa\xbe\xfb\xdb\xc2\x86\xab\xf8\x7d\xfc\x3c\x1d\xaa\x9e\x5c\x86\x9e\x9d\x0f\x4e\x33\x0c\xa9\x71\x84\xe1\x65\xc4\xb5\x83\x05\x87\x4f\x6c\xf3\x8a\xf9\x60\xf7\x70\xc0\x3e\xcc\xfd\xda\x28\x1e\xbb\x2d\xa0\x10\x04\x88\x1c\x88\x89\x3a\xdb\xa9\xbb\xb4\xc8\x6c\xff\x9e\x56\x76\xc6\x23\x01\xcb\x89\x1f\x6b\x69\x3f\x38\x82\x29\x74\x68\x6c\xcc\xcc\x4a\xf9\x48\x56\x9a\xfd\x4d\x4e\x74\xb5\x49\x6b\x24\x79\x22\xea\x6c\x6c\x2e\xc3\x7b\x4e\x43\x75\x1e\xa7\x25\xf0\x35\xb2\x30\x3e\x67\x20\x38\x88\x24\x58\x17\x6d\x2a\x02\xca\x92\x90\x37\x0f\xa2\xa3\x54\x0a\x47\x59\x3e\x11\xde\x61\x75\x64\xe8\xc1\xca\xbc\x0a\x78\xf7\x10\x95\x57\x41\xca\x8b\x69\x07\x65\x98\xb5\x60\xe9\x59\x26\x2f\x65\xea\x85\x55\xc3\x1d\x84\x82\x63\xcb\x6c\x2b\x34\x4f\xdd\x73\xfd\x0c\x2f\x46\x7c\x9e\x87\x76\x8c\x90\xa5\xd5\xe7\x67\xd5\x9d\x02\xa3\xed\x22\x72\x3b\x1d\x7b\x79\x59\x1f\xa5\x65\x05\x9e\xc1\x8d\x06\x1a\xa2\x43\xde\xf2\xc9\xd6\xc7\x7d\x8a\x2e\xd8\x4e\xf6\xa5\xb4\x77\x17\x43\x51\x2a\x8f\xed\x8a\x75\xdb\xe1\xda\xf8\xc1\x5d\xe0\x30\x93\x44\x82\x28\x16\x26\x14\xe0\x2e\x8b\x72\x53\x94\x4c\x7f\x42\xd7\x70\x83\x67\xa2\x71\xbc\x55\x81\x2b\x5b\x6b\x3e\xd5\xb4\x42\x3c\xd4\x46\xe8\x9a\x8f\xf8\xd1\x5d\x59\x8e\xe6\x0c\xf3\xb3\xfc\xc8\x66\xb1\xd4\x8f\xee\x30\xf4\x33\x6f\x1c\xa0\x2b\xd5\x06\xf4\x58\xe1\xd6\x40\xbe\x66\x22\x7a\xc4\x72\xb0\x65\xe6\x18\x1f\xc5\x6f\x50\x7d\xd1\xff\xad\x5a\xec\xe8\x38\x81\xb4\x6a\x92\xde\xa4\x35\x44\xe4\x92\xb4\xc0\xcb\xc2\x4a\x12\xbb\x51\xb3\x64\x03\xed\x21\xd8\xd7\xfd\xe4\x4f\xd5\x97\xce\x11\x9f\x73\xc8\x8b\xd7\x1c\x5d\x9d\xbc\x1c\x13\xa6\x60\x22\x4e\xc6\x1c\x2d\xb5\xb8\xae\x2c\xc9\x73\x5e\x20\x9d\x51\xee\xd3\xce\x27\xfa\xce\x7c\x3f\x6c\xbf\xc2\xf1\x88\xc9\x7a\x3c\x2c\x57\x5e\xde\x36\xea\x95\x62\x8c\x09\xd7\x7a\x79\x9b\x13\xcc\xda\x03\x99\xec\xd9\x37\x78\x70\xb4\x1a\xed\x89\x98\x99\x6b\xc0\xa5\xe8\x05\x0c\xd3\x89\x35\x97\x9a\x0f\x06\xab\x78\x46\x95\xd0\x53\x3a\x2a\x9d\xb2\x29\x6f\xe6\x0e\xb5\xe9\xe7\x34\x00\x1e\x26\x00\x70\xc9\x22\x47\x68\x13\x55\x2e\x7f\xb9\x2a\xb2\xac\xb8\x87\x4b\x4d\xbc\x4e\xec\xfd\x36\xd5\x43\xe0\x56\x86\xe3\x41\xe5\xdf\x58\x42\x54\x20\x0a\xb7\x1f\x83\x25\xe3\xfe\x2c\x8c\xc7\x3c\xdb\x3d\x4e\xc4\x61\xb5\x8a\x7d\x36\x34\x4a\x35\x06\x9c\xbb\xbd\xce\x53\x78\xfa\x54\x13\x33\xfe\x88\xe5\x57\x4a\x64\xcd\x69\xdf\xb8\xc8\x0e\x80\x0f\xf2\xf6\x0c\x1f\xab\xd0\x4a\x9f\x56\xe1\x37\x18\x80\xd0\x4b\xbc\x22\x01\x35\x66\x23\x0b\xd2\x5e\xa6\x91\x10\x07\x04\xda\x90\x40\x23\x21\x2f\xd2\xfd\x26\x45\xd1\xe0\x9b\xa8\x9e\xb9\xb5\xdc\x2d\xed\x6c\x61\xc0\x7e\xfb\x04\xb9\xad\x35\xd0\xdc\x7c\x7c\xd4\x7a\x63\xce\xfc\x78\x89\x11\x5d\xce\xd3\x41\x7b\xa1\x54\xa8\x05\x1b\xa2\xe3\x1f\x43\xe0\x15\xa0\x35\xd0\x0d\x23\x8e\x9b\x54\x57\x7e\x0b\xbe\xd2\xea\xb3\x8c\x00\xb0\xf9\x8d\x9f\x09\x3e\xc8\x5a\xc7\xd5\xb6\xe4\x2e\x30\x0b\x7e\xbc\x5c\x52\xd2\x58\x08\xfd\x5a\x3d\x46\xb5\x8e\xf3\x1c\xe2\xd5\xcb\x06\x66\x70\xff\x04\x0d\x18\x69\x27\x8f\x30\x51\x25\xfe\xd0\xa5\xd8\x72\x1a\x02\x27\x9e\x6f\x33\x69\xc4\xc9\xd0\x75\x83\xaa\x18\x18\x80\xad\xd5\x88\x1d\xa9\x2b\x9d\xad\xb8\xaa\xb3\x71\x7a\xec\x37\xa4\x1b\x55\xc8\x1d\x4d\x03\x07\x51\xd6\x4a\x99\x41\xb7\x87\x20\x2f\xa5\xa0\x55\xf6\x1f\x2f\x6b\xb4\x69\x02\x55\xea\xb5\x19\x1e\x41\xba\xdd\xe8\x8f\x31\x28\x35\xf0\x99\x2c\x1d\x83\xac\x7d\x47\xd1\x90\xbe\x18\x50\x72\x2c\x46\x1a\x47\x5d\xd5\xe6\x26\x69\x76\xa4\x71\xa3\x7d\x95\x8e\x34\x7d\xba\xdf\xa2\x23\xce\x3a\xfa\x3a\xe7\x77\xdb\x13\xfd\x53\x1f\xe4\x90\xa2\x6b\xb6\xf8\x8f\x3e\xd4\x9b\xd6\xd2\xef\x7a\xc0\x37\xa6\xe2\x5f\xf3\x0c\x6f\xce\xe8\xbf\xc0\x71\xde\xda\xec\x5f\xff\x64\x6f\xbe\xf2\x0b\x0f\x79\xe7\x3d\xc9\x49\xb5\xeb\x4d\xf0\xea\x74\x97\xf0\x75\x19\xab\x58\xf2\x47\x43\x0d\xb3\x93\x56\x6a\x53\xa6\xeb\xb8\x4c\xb3\x9d\x0b\x25\xac\xf0\xdc\xc3\x3c\x2e\x3c\xf2\x3e\x2e\x41\x71\x87\x6b\x00\xe2\xe4\x2e\xce\x6b\xc0\xb1\x42\x0d\xd3\x1d\x90\xad\x16\xb9\xae\x63\x38\x16\xd6\x1b\x8e\xef\xe1\xe4\xe8\x4f\xc8\x76\xed\x4d\xfc\xca\xc6\x03\xac\x07\xad\x13\x8a\xef\x4a\x27\x88\x5d\xa0\x55\x9a\xe9\xa3\xea\x36\x06\xfa\x71\x4f\x26\xc4\xe1\x62\xfd\x08\x1e\x0e\xfa\x57\xe9\x97\x2f\xa2\x54\x92\x36\x98\x2b\x5b\x43\xa4\x7e\xe7\x57\xbb\xc4\xe7\xeb\xc6\x20\xb5\x46\x44\x84\xfc\x46\x2b\x80\x61\x7e\x2d\x17\x01\xc3\xb1\xad\xe3\x12\x2a\xd7\x9b\x81\x85\xbd\x27\x5a\x13\x1d\xe0\x20\xd6\x36\x66\x7d\xc3\x3a\xf9\x8d\xbb\xd5\x98\x03\x49\x5a\x4b\xe8\x37\xb3\x31\xe9\x24\xdd\xae\x21\xce\x01\x6b\x83\x69\xe6\x10\x8d\x4a\xe5\xc3\x48\x30\xeb\x91\x96\x83\xca\x43\xa5\xb7\x49\x91\xef\xd6\x00\x2e\xb5\xc1\x9b\x7e\x0b\xc6\x46\x8d\x00\x14\x13\x1c\x26\xc9\x8f\x84\x87\xa9\xb3\xc6\xc1\x25\x3f\x42\x81\x13\x90\xf3\x04\xc7\xbd\x65\xcb\xc4\xdc\x31\x52\xa9\xb4\x6d\xec\x38\x10\xbb\x0e\x92\x43\x1d\xde\x84\x81\xea\x9d\x1b\x4b\xe5\x56\x86\xf3\xbd\x6f\x2f\x76\x2d\x63\x05\x78\x5c\x7a\x33\x00\x74\x40\x4c\x02\xf3\x0a\x40\x57\x28\x85\xce\xdb\x5f\xed\xf5\x89\xaf\x8a\x9a\x4e\xc1\x04\x4b\x31\xee\xf8\x12\xc5\x6c\xe1\x01\xf3\xa3\xdd\x20\x81\xba\x65\x34\x17\x1e\x3a\x8f\x0c\x55\xc7\x52\x03\xa1\xbe\x58\xad\xd3\x1c\xe8\xb8\x2a\xd1\x24\x08\xde\x13\xfd\x0c\x51\xe5\xda\x6c\x02\x0a\xb3\x21\xda\xcb\x05\xac\xe9\x8b\xf8\x9d\x8a\x12\x4c\xee\x0e\xb2\x80\x9f\xb8\x12\x44\xfc\x5c\xd3\xf4\xf8\x83\x99\xac\xaa\xc1\xf3\x1c\xa8\xf7\xf6\xa6\x86\x77\x9e\xd9\x6b\xdc\xb9\xff\x6f\x76\x68\xc8\xf0\xd2\xb0\xe7\x24\xee\xdc\x07\xb4\x09\x45\xe4\x53\x54\x1a\x01\x67\x26\xbe\x96\x09\xa5\x69\x2f\x2d\x74\x05\xa7\x14\x7f\xeb\x59\xd5\x22\x07\x17\x53\x9a\xe6\xe6\xfe\xdb\x09\x7a\x89\x34\x14\xa1\x56\x33\x38\x7a\xb9\x85\xa4\x89\x0b\xc7\xc8\x68\xa7\x17\xe2\x71\xa4\xd0\xec\xe7\xd2\x37\x5c\x5d\x2c\x99\x3b\x08\x3b\x27\x5c\xdb\xfd\x6a\x9b\x3d\xd9\xe2\xb2\xd5\x25\x44\x16\x0a\x91\xbe\xdc\xe3\xa7\x25\x26\x07\x58\xbd\x10\x0d\x06\x51\x37\x28\x6f\xcb\xaa\xa2\x74\xb5\xd7\x2b\x6d\xfe\x50\xea\x0a\x92\x14\x95\x9f\xb1\xa2\x13\xdf\xc6\x08\xcd\xd8\xa4\x78\xeb\x41\xcf\xad\x0d\xc1\x05\xd9\x7e\xb8\x3c\x70\x18\x4b\x3e\xb4\x53\xcb\x7a\x1f\xb0\x34\x5c\x16\xdf\x0b\xaa\x63\xf7\x72\x8a\xb8\xe3\x65\x23\xf5\x8d\x50\xc0\x99\xab\x10\x12\xbd\x8a\xd7\x74\x6d\xa5\xf9\x5d\xcc\xc8\x40\xb8\xe1\x96\x3b\x17\x98\xaf\x01\xd0\xbc\x35\x73\xf7\xf7\x2d\x4e\x56\xe3\xc9\xc2\xd7\x21\xd2\x96\xc1\x8c\xa9\x7e\x2e\x3e\xa8\xd9\x7c\x30\x8f\xce\xd4\x68\xdc\x60\x11\x12\x35\xc3\x98\x5f\x87\xcf\xbc\x9f\x8e\x00\xd0\x30\x99\xaa\x69\xf4\x5f\xd7\xa3\x29\x22\x07\x7c\x88\x40\xe0\x41\x0c\x6c\x91\xc4\x53\x88\x89\x46\xae\x86\xb7\x8b\x9a\x48\x10\x13\x3d\x56\xd9\x6b\x1e\xb1\x17\xd3\x31\x9c\x8c\xe7\xd1\x78\x0e\xcf\x1b\x0c\x87\xd7\xd3\xc1\xf0\x83\xc4\x33\x30\x35\xdc\x85\x4d\xa7\x98\xb3\xf7\xc2\x56\x82\xf0\x48\xfa\xf5\xae\x0f\x8d\xc8\x60\x7c\xc6\x5f\x92\x10\x91\xc1\x14\x61\x0f\x00\x10\x71\x28\x92\xf9\x44\x0d\xcc\x7c\x4c\xcf\xa8\x26\xb8\x01\x25\x79\x33\x8d\x06\xc3\x77\xb6\xc5\xae\x9b\xa3\xb1\x9a\x21\x41\x90\x7a\x19\x98\x7f\x8d\x27\x50\x62\x3c\x57\xef\x47\x17\x17\x0e\xf4\xe0\xd5\x5f\x7f\x98\x5c\xe3\xe4\x7c\xf0\xea\xcc\x6d\x31\x76\x67\x09\xb6\x57\x65\x1b\xa8\xab\xeb\xf1\x08\xb0\x28\x13\x33\x59\xd1\xe5\xd5\xc5\x60\xfa\xa1\xd5\x4d\x33\x49\x0d\x34\x86\xf9\x82\xe9\x44\x03\x51\xe2\x2a\xa3\x6d\x9b\xdf\x0d\x66\x58\x10\x3d\x38\xfb\x69\x34\x7b\x5a\x3d\x34\x51\x6b\xcd\x5d\x45\xbe\x3b\xba\xe7\x6d\x2e\xdb\x07\x4f\xa7\x2c\x93\xf4\x22\x1e\xed\x08\x44\x3d\xcc\xbe\x5b\x94\xe0\x4a\x33\x91\xc0\x03\x3c\x9a\xa1\x1a\xd9\x2c\x6a\x65\xd3\xa8\x29\x08\x86\x14\xc8\x51\x60\xb3\x99\x4f\x31\xed\xd0\x9f\x71\x7c\x29\xfe\x55\x63\xef\x73\x9b\x39\x87\x37\xd4\xb7\x3a\x2d\x1d\x7d\x84\xed\x5e\xe2\x6c\x65\xb8\x43\xd3\x3d\x4d\x25\xfc\x6a\x9a\xab\xd5\x36\xcb\x3a\x0a\x61\x8c\x63\xcf\x8f\x0f\x1d\xc3\xc3\x49\xa0\x4e\x03\xb3\x42\x5f\x05\xea\x35\xba\xda\x7f\xc5\xa6\x31\x87\x02\x47\x03\x3c\x95\xf6\x4e\x44\x46\x23\xe9\x88\x9e\x53\x57\xea\x31\xf0\x2e\x30\x39\xc3\xe0\x55\x7d\x59\x06\x51\xde\x99\xfd\x07\xf1\xcc\xe2\xb6\x87\x3c\x46\x83\x0d\x91\x0d\x85\x06\xa2\xa0\x4d\x41\x4c\xab\xa9\x44\x52\xd5\x62\x23\xf0\xde\xd2\x06\x61\x16\xe2\x74\xad\x3b\x0c\x3b\x47\x53\x8c\xfa\x9c\x99\x75\x6d\x68\x79\x40\x13\xa1\x62\x8f\x29\x8b\x7c\x7a\x44\xef\x52\x73\xc1\xef\xb8\xb6\x04\x98\xac\x98\x2a\x45\x60\x16\x3a\xb0\x03\xff\x48\x2c\xac\x4f\x49\x50\x3f\x90\x05\x8b\x8c\x38\x31\x79\xd5\x41\x69\x33\x16\x97\x22\x4b\x27\x51\x48\x89\xd5\xec\x52\xb7\x8e\xde\xe7\xaf\xa1\xba\x4c\xab\xa5\xce\xb2\x38\xd7\xc5\x56\xe0\xb1\x22\xb3\x85\x01\x4d\xdf\xa0\x8b\xfe\x0c\x87\xac\x6d\x0f\x7b\xd0\x03\x86\x8f\x14\x7e\x80\x4a\x90\x7c\xcb\xf0\xb6\x54\x66\xeb\x4c\xaa\x73\x25\x41\x63\x6d\x7b\x04\x4a\x7b\xb6\xcf\x17\x76\xb6\xc3\x5d\xfa\xfc\xce\xf9\xce\xcc\x57\xeb\xe5\xf2\x69\x75\xf8\xc6\xce\xca\x52\x28\x11\xf5\xea\xf0\x99\xbf\xb5\x59\xe4\x5e\xcb\xea\x5e\x5c\x79\x50\x04\x61\x1e\x42\x92\x03\xf6\x29\x56\x00\x10\x47\xc4\x9c\x9a\x89\xab\x5a\x7b\x20\x18\xcc\x46\xf1\x6a\x5b\x22\x10\x63\xc9\x3c\x79\xb5\x60\xdd\xe2\xd8\xa3\xa5\x26\x78\x02\x77\x00\xbb\xe8\xe4\xa1\xed\xa5\x0f\x68\x3c\x08\xc7\x08\x76\x9b\x20\x15\x70\xb1\x8e\x31\x32\xe3\x60\x38\x66\xdf\x68\x37\x4b\x70\xef\x63\xb8\xe7\x50\x23\x83\x2f\x51\x63\x0e\x6b\x9e\x61\xda\xd3\xa4\x6d\x91\xde\x61\x0c\x98\x3e\xe2\x9e\x27\x88\xc9\x40\x83\x28\xbd\x11\x94\xdf\x68\x68\x63\x88\x09\x15\x43\x88\x79\xb9\xfb\xa9\x02\x63\xe5\x99\x0a\x12\x9a\x06\x51\x20\x80\x53\x0a\x5a\x08\xae\xd5\x96\x33\xb4\x0f\xbe\xc4\xab\x19\x2f\x22\xf0\x42\x4a\x4d\xe4\x6b\x82\x52\x39\xcd\x6f\xaa\x40\x32\x1e\x49\xaf\x91\xf2\xf4\x7b\x5f\x01\xe7\xb9\x2d\xcc\xc5\xf7\xd8\xcd\xea\x45\xe2\x16\x00\x0b\x5c\xec\xa8\x0a\xda\x96\xb7\x09\x06\x08\x38\xe3\x81\x5f\xd8\x12\xc8\x22\xe1\xec\x7a\xbd\xcd\xb9\x96\x9f\x6d\x91\xc6\xc8\x71\x50\xd4\x52\xa2\x6a\xb7\xc0\x61\x2d\x02\xd7\x1c\xcc\x60\xad\x73\x31\xa2\x5e\xb9\x6c\x51\x72\x6c\x3e\x3c\x68\x21\xde\x99\x7d\xd7\x4d\x76\x7b\x4f\xa1\x70\x55\x5e\x58\xc5\x10\x75\x7f\x1b\xd7\x55\x01\x17\xe3\x9e\x50\x1f\xe6\x74\x5b\xaf\x93\x40\xc4\x2c\xe5\xd0\x97\x20\x91\x22\xe7\x0e\x07\x09\xe5\xc8\xeb\x5b\x6d\x7c\x55\x66\xd9\xe7\x02\x7c\xd7\x86\x87\x29\x17\xe0\x4b\x37\x3a\xd7\x65\x9c\x51\xc1\xb5\xf9\x8f\x34\x5f\x42\x98\x0a\x31\x79\xb0\x84\x81\xc0\x39\x8d\xb3\x66\x8d\x7f\xa3\x8f\x3c\x46\xcc\xda\xd5\x69\xc4\xac\x8a\x52\xdf\x14\xf0\xaf\xfb\x42\x1d\x82\xcc\x6f\x5e\xeb\x7c\x49\xd5\xdf\xad\x91\x31\x66\x80\x43\x5a\xa4\x9c\x9f\x4a\x38\xbc\x4e\x87\xb9\x87\xfe\xa2\xcc\x8b\x3d\x59\xc1\x46\x15\xf1\x09\x00\xce\xfa\x9a\x21\xfc\xfd\xf0\x80\x88\xd1\x57\x96\x81\x10\x71\x1c\x02\xf9\x69\xac\xd8\xa5\xa7\xda\x41\x41\x1a\x5b\x46\x8f\xd1\xbc\xca\x6d\x4a\x67\xa4\x0c\x87\x57\x17\x81\xca\xa9\x42\x1a\xa7\x15\x66\xbf\x55\x79\xa9\x7a\xcd\xc1\xb0\xb4\xcc\x4c\x43\xee\x3e\x5b\x94\x58\x67\x56\x74\x0c\xa1\xdc\x1a\x48\x3b\xc6\x3b\x83\xcf\xbd\x8e\x6f\x21\xbf\x05\x86\x61\xc0\xcc\x62\xbb\x69\xd1\xa9\xee\xd1\xfc\xfa\x33\xf3\xb6\xfc\x08\xe4\x1e\xf2\x5a\x34\x74\x5b\x41\x6d\xf7\x36\x4d\x74\x96\xe6\x1a\xb5\x73\x29\xba\xe8\xc8\xc0\x0b\x44\x98\xdf\xeb\x45\x95\xd6\xda\x8f\xf9\x37\x64\xea\xc0\x67\xa2\x8c\x2c\x25\x63\x8c\x15\x62\x66\x26\x5d\xeb\x8e\xad\x4d\x2f\x23\xd9\x3c\xac\x3a\xa4\x2a\xb5\x25\x7d\x76\x49\x63\x50\x94\x37\xdf\x85\xff\x7e\xa5\x6a\xe1\x77\x7f\x8b\xab\x2b\x5d\x1e\x9d\x7e\x95\xd2\x2f\xf8\x79\xb8\xfe\xeb\xf8\xe5\xe9\xcb\x57\xcd\xfa\xaf\x17\xa7\x27\xdf\xea\xbf\x7e\x8f\x1f\x9c\xfd\x16\xad\xc5\x69\x78\x7c\x20\x78\x0d\x96\xc0\x6b\x70\x72\x74\x7a\x7c\xfc\x4a\x5d\xa6\xcb\xdb\x58\x67\xea\x2c\xbe\x4b\x13\x35\x48\xe2\x75\xd5\xf8\xec\xc9\xf7\xdf\x7f\x6f\x3e\x7b\xac\x46\xe6\x16\x51\x50\x2b\x4b\x74\x0a\xfb\x3e\x39\x47\x8c\x02\x94\x1b\xa0\xdd\xfb\xc6\x58\x65\xd5\xad\x71\x8b\xb6\xeb\x45\x1a\x1f\x08\x14\xa0\x03\xf6\x5d\x39\xb8\x76\x5a\x79\x80\x60\xe3\xbb\xae\x4a\x8d\xa9\x36\xb0\xdd\x02\x8e\x75\x6e\x74\x59\x15\x39\xf2\x37\xf7\xae\x2b\x5d\xf6\xfa\xc4\xb6\x81\x24\xd2\x8e\x70\x23\xad\x1c\x05\x1a\x90\x21\x57\x55\xb1\x4c\x3b\x44\xa1\x90\x2f\x01\x9f\xc8\xe4\x1b\xbd\x3e\xbc\x31\xd1\x28\x13\x55\x03\xc5\x02\x3d\x8c\x4f\x6a\x81\x11\x7c\xe4\x12\x17\xb1\x26\xd6\x51\x37\xed\x74\x12\xea\x6b\x0d\x7d\xa4\xa3\x35\xf0\x92\x87\x44\x7f\x5b\xe9\x56\xf5\xfc\xcc\xb2\xd4\xfa\xf1\x78\x1c\xa3\x4a\xb1\xf2\xb6\xd7\xfa\xb4\x32\xee\x45\x8e\x27\x38\x32\x61\x55\x45\xd0\xcc\x7a\x3b\x24\xa4\x73\xc9\x7e\xa0\xb2\x26\x97\xce\x6f\xa7\x11\xad\x17\x2f\xb0\xf8\x04\x10\x22\x91\x05\xc2\xb9\x54\x4d\xac\x04\x55\xe7\x08\xe3\x5e\x28\x7e\x89\xae\x97\xa0\x57\x51\xc7\x68\xec\x34\x19\x6e\xb8\x9b\x8c\xd5\x9f\x0b\x65\x80\x58\xb4\xf7\xb6\xc8\x12\xdd\xb0\x87\x81\x05\xaf\x2e\x94\xce\x93\xa2\xac\x28\xc7\x5c\xac\x8b\xda\xca\xff\x58\x35\x67\xa1\x4f\xd0\x5c\x15\x96\x22\xc5\xbf\xc4\xdd\x78\x84\x07\x5f\x85\xcc\x7d\xfe\x2e\x52\xb3\xc9\xf9\xfc\xfd\x60\xfa\x85\x44\xee\xad\x47\xd8\x3a\x3c\x2a\xb0\x73\x25\x83\xef\x26\x17\x67\xd1\x74\xc6\xf1\xfd\x47\x25\x07\x5a\x01\x7d\xa1\x34\xa0\xde\x5c\xcf\xa1\x2c\x14\x02\xfa\xd1\x99\x2d\x05\xf4\x92\x04\x4e\x44\x00\x62\xbf\xa0\x23\x30\x36\xcf\xdc\xab\x25\x30\x18\x9f\xa9\xf1\x64\x4c\x5a\x02\x11\x10\x39\xe2\xf8\xb9\x40\x3b\x94\xff\x85\x5e\xe8\x1c\x69\x33\xbb\xbb\xeb\x02\xe9\x1c\x2d\x87\xb1\x73\x4c\xa8\x18\x3b\xb7\x84\xa6\x0f\x10\x54\x32\xbf\x2a\xc5\xcc\xdf\xbf\x1b\xcc\x67\x93\xe8\xa7\x68\xda\x8c\xfe\x33\x51\xe9\xf5\x2c\x0a\xd4\xd9\x60\x3e\x00\xc6\xce\xe9\xe4\x7c\x34\x9f\x39\x72\x58\x90\x2a\x50\x83\x21\x97\x2b\x3a\x3e\x58\x41\xd8\x69\x8b\x3c\xe7\x93\xe9\x7c\x34\xb9\x9e\xd1\x17\x82\x66\xc8\x7e\x32\xa5\x1a\xc8\x31\xa5\x17\x40\x3b\xc1\x06\xee\xa7\x6d\xb9\x85\xd1\xcc\xae\x1c\x58\x94\x83\xd9\xec\x7a\x4a\xd4\xb6\xd3\xe8\x09\x2b\xc9\xca\x49\xd8\x05\x68\xcb\x85\x79\x06\x31\xfe\x3f\x80\xec\x8b\xed\xca\x68\x3c\x8f\x2e\x2e\xa2\xe1\xfc\xda\xec\x91\xe9\xe4\x2a\x72\x13\x6b\x09\x69\x31\xab\x34\x9e\x8f\xe6\x1f\x42\x05\xc9\x94\x66\x03\x44\x79\x2f\x64\x46\x64\x72\x86\xfa\x3d\x15\x44\x6d\xea\xcd\x74\x72\x6d\xbe\xfd\xe6\x43\xeb\x0d\xea\xcd\x80\x12\x60\xcd\xa5\xf7\x70\x5b\x45\x0e\x2e\x84\xba\x5a\x57\x51\x6a\x5a\x21\xca\x66\x45\xe5\x2a\xd4\xb3\xca\x2d\x1e\x60\xff\xa0\xbd\xe6\x97\xa6\x81\xa0\x3e\x61\x26\xe8\x22\x6a\x72\xcf\xcd\x27\x6a\x16\x0d\xaf\xa7\x91\xe8\xc6\x83\xcd\x1c\x47\x11\x94\x44\x8f\x60\x68\xdb\x67\x86\x99\xb0\xf3\xc1\xf5\xc5\xfc\x68\x3e\xb9\x88\x4c\xeb\x60\x23\x8e\x78\x2a\xe7\xd1\xd8\xac\x03\x33\x94\x66\x2d\x8d\xc6\xea\x72\x34\x9b\x8d\x26\xe3\xa3\xe1\x74\x34\x1f\x0d\x07\x17\x6a\xf6\x61\x36\x8f\x2e\x67\x01\x26\x77\x06\x66\x6d\x98\xfd\x7c\x3d\xe3\xcc\x65\xa4\x4c\x9b\x6c\x69\xee\xf8\x7a\x78\x11\x0d\xa6\xea\x7c\x30\x34\x9d\x02\xca\xe1\xc1\x68\x3a\x84\xe2\xf3\xf1\xe0\xa7\xd1\x5b\xfa\x28\xd2\xf3\x5e\x8f\x47\x43\xfc\x85\x7d\xd1\x60\x34\x55\xf3\xe9\xe0\xfc\x7c\x34\xc4\x9d\x33\x11\xad\xa0\xad\x7c\x31\x3a\x8f\x80\xea\x78\x32\x9d\xab\xcb\xc1\xf0\xdd\x68\x4c\xfb\xf8\x7d\x34\x30\x43\xea\xbe\x31\x1a\xab\xf7\xef\x46\x43\xdc\x31\x96\x3e\xb8\x71\x44\x4f\xa6\xf4\x05\x35\x04\x35\x92\x8b\x68\x70\x46\xef\x42\x42\x5a\xa0\xe7\x0d\x9a\xe4\xbc\xf0\xc6\x99\x39\x28\x22\x75\xf5\xee\xc3\x0c\x46\x6c\x62\xd6\xde\x4f\xa3\xe9\x04\xe8\x6a\xed\x31\xa3\x0e\x7b\xef\x46\x6f\xdf\x91\x6e\xca\x70\x3e\xfa\x09\x46\x87\xcb\xc2\xdb\x9b\x10\xce\xaf\x73\xf3\xc8\x8b\x0f\x76\x47\xc0\xca\xe8\x48\xc9\xca\xa3\x5e\x1e\xc6\x5d\xaf\xfc\x37\x74\xcf\xbe\xfa\x4f\xf8\xdd\xdb\xf3\xb3\x8b\xa3\x93\xf0\xf4\xa8\x28\x8f\x40\xd3\xf4\x37\x77\x03\x1f\xf6\xff\x5e\xbc\x7e\x75\x7a\xd2\xf0\xff\x9e\xbf\x78\xfd\xfa\x9b\xff\xf7\x7b\xfc\xbc\x1d\x5f\xab\x73\xe3\x24\x9d\x79\xde\x0c\xf3\x4d\x38\x9a\xc3\xd3\x40\x8d\x8b\x3b\x0d\xc5\xfd\x66\xa2\x0e\x5a\xb4\x77\xc7\x81\xf1\x11\xcd\xff\x3b\xc5\x47\x5a\xab\xf6\xbc\xd8\xe6\x09\x41\x53\x80\x7e\xea\xe5\x89\x3a\x2f\xe3\xfc\x63\x96\xe6\x6a\x56\x07\xea\x3c\x5d\xd5\xb7\xea\x3c\x2b\x8a\x32\x50\x6f\x8a\xaa\x36\x9f\xbc\x1c\xa8\xe3\xd3\x93\x93\xe3\xa3\x93\xe7\xc7\x27\xea\x7a\x36\x38\x88\xee\x74\xb9\x2b\x72\x4e\xbe\x52\xb8\x0a\xc8\x38\x37\xbb\xa6\x10\xe7\x9d\x2e\x17\x71\x9d\xae\x3d\x77\x47\xd4\xd5\xb2\xfb\x86\x50\x60\x40\x65\x22\xc3\xb0\x93\x63\xcb\x8a\x7b\x02\xfe\x1f\x87\xea\x6a\x1a\x0d\x2e\xdf\x5c\x44\x5c\x80\xb7\xa7\x3e\xdc\x7c\x9b\xf3\x20\x00\x37\xdb\xc6\x59\x00\xbc\x77\x8b\xa2\xc0\xd2\x63\xaa\x82\xdf\xe6\x54\x7a\x0f\x2d\xdf\x56\x7a\xb5\xcd\x6c\xab\x54\xcf\xb8\xae\x3d\xcb\x00\xc6\x2a\xbe\xe6\xb7\x49\xb1\xfe\x01\x75\x82\x40\x29\x54\xf3\xa8\x40\x66\xc1\x8a\x72\xd0\x27\xbd\xe1\x29\xb5\x18\xa0\xb4\x26\x56\xdf\xc2\x01\xa9\xd0\x95\xc4\x71\xb0\xdc\x8e\x0e\x3b\x8b\x14\xaf\x79\x91\xcb\x5f\x41\x92\xbe\xc8\x13\x00\x18\x37\xea\x08\x36\x36\x73\xcd\x41\x56\x84\xd2\x61\x55\x24\xc5\x00\x4b\x15\xab\xfb\x18\x51\x63\xba\x66\xe8\x1e\x7d\x21\x2d\x89\xd2\xe2\xfe\x36\xcd\x34\x79\x59\xe4\x52\x32\x04\xb8\xc9\x55\xbb\xee\x94\x12\x81\x61\xaf\xda\x24\x79\x40\xff\xfc\x31\xcd\x13\xe2\x49\xdf\xec\x32\xbd\xaa\x7b\x56\x24\xd9\xd1\xa6\x26\x2e\x7f\x89\x08\x66\x56\x3d\xe1\x49\x03\x98\xac\xaf\xea\xb6\x22\x69\x21\x9b\xa7\xac\x08\xca\x51\x13\x3d\xf8\xda\xd2\x85\x9b\xbd\xf8\x16\xa3\xf4\x0d\xe6\xc0\xc0\x09\x05\xa2\xff\x69\x5a\xe8\x56\xb2\xa6\xa4\x95\xe9\x3b\xbc\xaf\x92\x0e\xec\x7b\x8d\x51\x71\xfb\xb1\xa6\x48\xbf\x95\x27\x24\xbd\x48\x18\x42\x58\xb8\x55\xfb\x91\x81\x5a\xe8\x65\x6c\x3e\xe9\xfd\x5a\xe5\x5a\x27\x15\xfe\xce\x0b\x8c\xfc\xa0\x62\xfc\xed\xa6\x2c\x6e\xca\x78\xcd\xc4\x91\xcb\x62\x4d\xf1\x64\x7e\x15\x22\x0e\x38\x7b\x80\x9c\x77\xb8\x86\x05\x6b\xad\xe0\xa3\xd7\x55\xa8\xde\x30\x8a\x5f\x4c\xa6\x59\x22\x1c\xca\x07\xb1\x59\xfa\x06\xbd\xe7\x47\x10\x17\x8c\x73\xeb\xac\x73\x56\xc5\xec\x51\xc8\x25\xc1\x72\x2b\xf5\x4d\x5c\x26\x90\x41\x04\x42\x3c\x8f\xab\x1d\xf8\x03\xb0\x90\x16\xcf\x0b\x17\xce\x46\xd2\x95\x32\xc5\xb2\xd4\xa2\xf8\x18\x9a\x09\x28\x21\xce\xac\x9b\xe8\x04\xf3\xb9\x65\xba\x81\x8d\x65\x9a\x81\xab\xea\x1e\x30\x30\x7c\xbe\x40\x9a\xb9\xaa\xcb\xed\x92\xc5\xc7\x6d\x25\x13\x53\xc4\x30\x72\x6c\x64\x95\xec\x80\x1a\x08\x79\x64\x1e\xd2\x4c\xa5\x52\x01\x62\x65\xc0\x73\x09\xbb\xcf\x75\x04\x80\xc6\x0e\x5c\x99\x07\x48\x2d\x5a\xd1\xf8\x4d\x16\x2f\x5d\xb2\xb4\x1d\x18\x89\xe9\x28\xe1\xf1\xee\x26\xa3\xdd\x03\x76\x9a\xa1\x42\x32\xbd\x8a\x6a\xfc\xa9\xbe\xff\xa8\x5d\xe0\xcf\xdb\x01\xf4\xc0\x68\xfa\xd3\xdc\x22\x72\x02\x47\x79\x19\x23\xc1\x8c\x68\x81\x40\x0c\x10\xe8\x83\x78\xff\xe1\xa4\xef\xf1\xdd\xd8\x0b\x30\xc0\x14\xe0\x14\xd8\x21\x24\x2a\x4c\x1e\xc7\x7b\x48\xfc\x0d\x60\xf8\x98\x0c\x47\xa4\x8e\x60\x13\x53\x63\x59\x94\xbf\x52\x71\x92\x94\xba\xaa\x70\x05\xf5\x76\xc5\xb6\x87\x55\x21\xf1\x92\xd8\x4e\x1c\x8a\x21\xc5\xda\x00\x19\xfc\xc3\x92\x07\x4f\x84\xfa\xde\xd6\xdd\x98\xb3\x15\x21\x35\x40\xdc\xee\x62\x6a\x1d\xfc\x0d\x48\x1e\xae\x7a\x97\x9c\x6c\x25\x0b\xa0\xc7\x9d\x38\xb3\x67\x1d\x51\x7b\xec\xf0\x4d\xb4\x38\x78\xfb\xda\x8f\x01\xb2\x85\x02\x6c\x48\x06\x2e\xee\x95\x0d\xe9\xa9\xc2\x45\x1d\xf0\x45\xd4\x2c\x26\xc7\xd0\x25\x63\xe1\x2d\xf7\x4f\x4e\x48\x22\x22\x11\xe6\x96\xf3\x65\xb4\x63\xec\x58\x0f\x47\x3c\x8f\xd7\x66\x70\x37\x1b\x9d\x27\xe9\x27\x6c\xd7\xaa\x2c\xf2\xfa\x88\x36\x75\xa5\x3d\x6e\x7d\xdb\x03\x3a\xfa\xcd\x11\x65\xe9\x23\xa4\xb8\x34\x32\xf9\x17\x39\x11\xa5\xb8\xa9\x36\x57\x1b\x62\x79\x11\x3e\xde\x7e\x72\xe1\xfd\xfb\x59\xa5\x8a\x3b\x73\xfa\x67\xf6\xbc\x39\x44\xd0\x16\x27\x01\xb1\xa5\x55\x9f\x61\x2e\xb8\x1d\x73\x62\x0e\xa1\x4d\x6a\x4e\xd7\x15\x2a\x43\x13\x2d\x3b\xe9\xbb\x21\x0b\x8d\xff\x86\x50\x1d\xce\x6f\xb7\x98\x90\xf5\xda\x06\xc7\x0e\x24\x2d\x55\x6c\xcd\x17\xd3\x83\x75\x6c\x2e\xb8\xb8\x4e\x97\x55\xa0\x62\xd5\x1a\x6e\x51\xc7\xb4\xc9\x62\x5b\x8f\x64\xbf\x14\xf6\x61\x53\x79\xa3\x86\x8d\x5e\xa0\xc5\x54\x13\x09\xe8\x6d\x5a\xd5\x45\x09\xe5\x66\x5d\xe9\x75\x1e\x22\x5e\x34\x8d\x31\x42\x4b\x6b\x85\x09\xf4\x40\xd8\x30\x81\xda\xdc\xa6\x59\x51\x15\x9b\x5b\xf3\xec\x40\xe9\x1a\xfe\x03\x22\xb5\x45\x96\x02\x40\x53\x6d\x8a\x2a\x25\x9d\x06\x73\x0f\xd0\xb2\x5e\x5b\xe9\x96\xde\x28\xbf\x8b\xcb\x34\xce\x6b\x0b\x51\xec\x01\x06\x63\xa9\x4b\x60\xed\x6e\x8d\x0b\x9f\xeb\x50\x63\x82\xfc\x08\x96\xe4\x3d\x81\xd4\x28\xda\x35\x88\x80\x2c\x56\xaa\xfd\x86\xa0\xa1\x31\x8b\xc2\x65\xf1\x4e\xdc\x8f\x72\xfe\x08\x1f\xd8\x29\x81\x0c\xf0\x26\xbb\xe4\x2d\x7e\x7d\x45\x40\x7c\x8c\xcc\x27\x96\x7a\xcc\xb4\xc7\xf5\x08\xd4\xc5\x5a\x86\x32\xc1\x64\x5c\xa7\x4c\x9f\x6c\x27\xf0\x28\x75\xa7\x47\xbc\xe3\x05\xac\xfe\xa9\xcb\xa2\xa3\xb7\xd0\x46\xaf\x4f\x0e\x66\x4f\xd5\x35\xb0\xb6\xda\xdf\x54\x2c\x7f\x66\x71\x31\xb9\x76\x33\x07\x34\xb9\x6a\xae\x3f\xd5\x8d\x29\xab\x6e\x8b\xb2\x56\x9b\xb8\xaa\x00\xfa\x00\x8a\x63\x9f\x98\x68\xaa\x34\xe7\x6f\xc5\x53\x75\x0e\x07\x87\x78\x92\x59\x3d\x6f\xe2\xe5\x47\xf9\xbb\xdf\x72\xba\x06\xad\x57\x72\x72\x3b\x36\x56\x7b\x55\xab\x97\xe6\x1c\x4e\x88\x08\x26\x6e\x36\xa6\xf9\xe9\x53\xfa\x38\x9f\x9a\x73\x73\xba\x6e\xe2\xd2\xdc\x72\x1e\xdf\x7c\xf3\xbc\x57\xeb\x78\x79\x9b\xe6\xfa\xa8\xd4\x71\x62\x81\xad\x81\x83\x16\x71\xc5\x25\x92\x77\xd0\xa2\xe7\x7c\x46\xcc\x7a\xa7\x2e\xa9\x4f\x87\x20\xc1\x53\xe8\x92\x0c\x6c\xe9\x62\xc5\x42\x0d\x2b\xb0\x7c\xee\x10\x8e\xe2\x59\xdd\x55\x5d\xc6\xe6\xfe\x5a\x15\xe5\xbd\xb1\xd9\xe8\x6c\x86\x27\xa6\x4b\x9c\x44\xe3\x52\x14\x78\x1a\x03\x58\x37\x45\x78\x8b\x31\xc1\x0b\xa8\x93\x5a\x11\xe5\x6f\xdf\x7e\x6f\x13\xa7\xa8\x93\x6f\xcc\x56\xf7\xcd\xa4\x8c\xef\xd3\xfc\xa6\xea\xab\x0a\x4d\xd8\xc4\xdc\x06\xae\x3f\xf4\x77\x7a\x23\x43\x52\x3b\x3a\x93\xe6\x9b\x2d\xde\x01\x48\x8a\x5e\xd2\xc9\x65\xde\xb4\xc2\x5b\x03\xf1\xe2\x5e\x19\x18\xb0\xde\x99\x05\xaf\x31\x4b\xca\xc4\x2e\x4f\x7a\xb4\x59\x47\x30\xb9\xe0\x13\xc1\xd9\x2c\xd0\x16\x62\x0d\xa0\x5e\x81\x37\x85\xeb\xb8\xfc\xb8\xdd\x20\x15\xdb\xa2\x82\x42\x7a\xb8\x0d\xf0\xb7\x56\xc3\x9e\xc8\xe6\x08\x2c\x78\x6f\xee\x0f\xb4\x4d\x96\xc5\xb6\x8c\x6f\xb4\x14\x8a\x97\xf7\xbc\x02\xba\x96\x38\x31\x03\x40\xe7\x8a\x68\x8f\x31\xa7\x70\xce\xb8\x51\xed\xcf\x98\x2b\xcc\x33\xe8\x65\x8a\x8f\x15\x08\x71\x4f\xdb\x71\xe0\x89\x31\x8f\xf2\xf7\x40\x5a\xa9\x65\x9c\x65\x3a\x51\xbd\xc9\x26\xfe\xc7\x56\xf7\x60\xab\x44\x9f\x62\xe3\xb4\x91\x53\xe0\x86\x1c\xe6\xc0\xbc\x58\x36\x88\x22\x0f\x5c\x94\x8f\xd7\xe1\x60\x36\x1c\x8d\x9c\xc3\x4d\xe3\x37\xd7\x9f\xd2\x7c\x55\xd0\xcc\xe1\x03\x03\x75\x11\xcf\xf5\xcf\x8d\xdf\xcd\xde\x5e\x82\xb2\xc6\xcf\x97\x17\x0a\xf4\xda\x8d\x7d\xc5\xa8\x5b\xb7\x0c\xcf\xe6\x67\xb8\xf6\x00\x93\x15\x97\xc9\xd1\xb2\xc8\xcd\x33\x80\x78\x11\x8a\xfb\xd4\xbb\xf9\xe5\x45\xa0\xae\x8a\xaa\x9e\x2d\x4b\x90\xc8\x2d\xd5\xd5\xd9\xb9\xef\x50\xde\x6e\xd7\x71\xee\x4d\x55\xe8\x8d\x42\x2d\x67\x40\xcc\x90\xeb\xf7\xd5\xf8\x6d\xa0\x7e\x1e\x9e\x43\x73\xfe\x76\xf5\x36\x54\x38\xa2\xad\x0f\x6e\xca\x62\x63\x16\x76\x8c\x58\x37\xf8\x1b\x1a\x35\xe8\x3e\x98\xf5\x81\x38\xd2\x24\xad\x59\xcb\x6a\xb1\xf3\xbe\x67\x4e\x35\xf3\x8b\xa5\xae\x2a\x90\xb5\x91\xe3\x05\x3e\x96\x65\x1d\x3c\x9b\x9f\xb1\x71\x49\x5f\x40\x9c\x57\x91\x55\x56\xcb\x96\x8e\x25\x39\xb4\x81\xad\xfc\xe0\xa3\x10\x3f\x64\x5a\xb4\x6f\x44\x89\x40\x0b\x65\x36\xe1\xd8\xf0\x9b\x89\x65\xcb\xdb\xda\x4c\xb4\xa3\x94\xcc\xb3\x9d\xbb\xb6\xe6\x50\x9b\x7a\x15\xdf\x68\xa2\xd5\x0b\x70\xa1\x7b\xce\x66\x20\xca\x58\x37\x66\x2e\x10\x3a\x17\xa8\x4d\xb6\x25\x28\xac\x4b\xca\x6f\x10\xe1\x47\x9d\xd5\x9a\x18\xe6\x6e\x41\xa8\x35\xd3\x37\xe9\x02\xe3\x39\xa6\xa3\xb5\x2e\x53\x00\x22\x7a\x6a\x67\x00\xd3\x47\x37\xc8\x42\x3b\xfd\x06\x84\xea\xdc\xfa\xb5\x69\x2e\x68\xa8\x40\xa6\xbf\x70\x75\x25\x58\x79\x60\xdb\x4d\xa5\x98\x41\x47\xbf\xc9\x67\xfc\x54\xab\xdc\xbc\x12\xda\x67\xae\x34\x51\xc7\x09\x8d\x89\x73\xa7\x46\x63\x1a\xf0\xac\xc2\x17\x04\x6a\x53\xea\xa5\xb6\x91\x86\x85\xbe\x49\xf3\x9c\x74\xf2\xe0\x17\x45\xb2\x73\x38\xeb\x4f\x35\xdd\x91\x6c\x2c\xf5\xa2\x1c\x9e\x93\xa8\x9f\x3f\xfc\x4f\x47\xe6\x89\xfe\x45\xb5\x5d\x6c\xf3\xb4\x6e\xdd\x9e\xc2\xf6\x63\xf7\x07\xea\xf2\xf5\x32\xad\xcc\xfd\xf1\xf3\x87\xff\x49\x20\x4c\xb4\xe9\xcd\xbf\xd1\xfe\xd6\x79\x7d\xab\x2b\x88\xa0\xf1\xc4\x39\xb3\xc4\x3a\x45\xf6\x1b\x2d\xb7\x48\x1d\xbe\x33\x76\x90\xf9\x33\x1c\x05\x15\x2d\x1b\x0b\x31\xe0\x7e\x01\xc2\x61\x8d\xca\x59\xcc\x58\xe7\xb8\x45\x7b\x83\xa5\xad\x1d\x85\x90\x55\x2f\x50\xbd\x33\x9d\xb0\x9b\x66\xfe\x19\x21\xe6\x81\xff\x5c\x94\xaa\xf7\x0e\x8c\xf8\x5d\xcf\x58\xfd\x85\xea\x5d\x51\x3c\x10\x06\x07\x66\xb6\x67\xf5\x06\x9c\x39\x7a\x6f\xcc\x37\xe3\xe2\x92\x73\xdb\x61\x87\xe0\xc1\xcd\x74\xf8\x95\xf8\x72\x63\x7a\xe2\x25\x11\x96\x5a\xd0\xaa\xb3\x6a\xed\xe6\xf2\xcc\x52\x3e\x8d\xde\x33\xd4\xd7\x15\xf1\x56\x2a\x87\xa1\x2f\xa4\x59\x87\x6b\xb9\x42\xc5\x37\xb2\xec\xba\xc3\x2d\xb2\x1f\x21\xc9\x89\x74\xbe\x05\xac\xd2\x36\xc5\x01\x61\x59\x16\x92\xcc\x86\xe9\x22\x6d\xa4\x70\xb1\xad\xf1\x60\x04\xf6\x1a\xe3\xbc\x54\x16\x21\x03\xc8\x22\x5b\xa1\xfc\x83\xa8\xc7\x01\xd1\x9e\x25\x03\x8d\xd0\x3a\xdd\xd7\x3a\x33\x48\xb0\x67\xd3\x4a\xdd\x15\x04\xed\x47\x8a\x4e\xae\xa7\x21\xb8\x92\x99\x2b\xbb\xb1\x1a\x55\x16\xa7\xa1\xfa\x29\x9a\xbe\x19\xcc\x47\x97\x90\x44\x1c\x8d\xdf\x9a\x5f\x33\x13\x46\x57\x48\xdf\xb7\x98\xfd\x08\xd5\xd3\x62\xd5\x1e\xa3\x43\x63\xa6\xba\x55\x17\x2a\x77\xdc\x73\xfc\x85\xe6\x9d\xa2\x5b\x4f\x99\x6c\xd2\xcd\xb6\xb7\x80\x87\x46\x12\x26\xa2\x59\xf3\x71\x02\x15\x0d\x96\x3d\x99\x03\x53\x02\x70\x0e\x4f\xef\xe2\xa6\x6d\x6b\x4f\x31\x03\x9f\x60\x6c\x29\x54\xb1\xc0\x78\x22\x9f\x38\x65\x91\x51\x24\x23\x4e\x88\x77\x83\x8b\x47\xcc\x70\x88\xa3\x91\x2c\x1a\xd8\x9b\xf1\x47\xed\x87\x9d\x42\xa7\xe8\xb2\xa3\x76\x50\xf4\xaa\xc9\x8c\x61\x59\x30\x50\x33\x70\x03\xc4\x36\x2d\xca\x0b\x15\xab\x2c\x2e\x6f\xb4\xd2\x39\xe8\x7e\x3a\x6a\x69\xd9\x8c\x6d\x65\x3c\xd0\xaa\xa0\xf3\xb1\x19\xcf\x33\x7e\x1d\x73\xa4\x84\x72\x81\xc1\x77\x32\x0d\x81\x14\x9c\x06\x17\x0f\x84\xe0\x73\x3b\x28\xc8\xd2\xd2\x79\x62\x3b\xd8\x24\xe5\xe0\xde\x10\xdb\x29\x2d\x6c\x35\x1a\xab\xff\xba\x1e\x00\xb2\x03\xe4\x7b\xb0\xab\x14\x25\xb2\x37\x38\x75\xeb\xd0\x0e\x8a\x69\x3d\xd2\x21\x52\x6c\x67\xbd\x86\xad\x0d\xbb\xcf\x7d\xeb\x0e\x62\x42\x8d\x2b\x27\xa0\xf1\x32\xb3\x07\x94\xa1\x20\xc2\x74\x72\x7c\xec\x16\xb4\x08\x3c\x35\xd6\xb6\xbd\xda\x3d\x77\xd6\x8e\xb7\xce\x97\x59\x51\x69\xb9\x24\x00\x28\x7e\x87\x04\xc7\x60\xb1\x95\xe5\x2e\x50\xcb\x4c\xc7\x65\x86\x1b\xd9\x5a\x14\xa0\x51\x02\xc7\x8b\x78\xfa\x0f\x5d\x3e\x35\xe9\xbe\x99\x3f\xe0\xd3\xb1\xed\x4d\x47\x9b\x3f\x08\x42\x24\xf0\xb9\x50\xbd\x29\xea\x5b\x6e\x91\x5b\x23\x1d\xed\x71\xc1\x04\xd8\x7d\x95\x1f\xbf\xa3\x51\xad\xb4\x5d\xa6\x73\xbf\x45\xf8\x70\xf2\x7d\xb1\xb9\x5b\xd0\x60\x31\x37\x3d\xb2\x27\x65\x19\xfa\xda\xd6\xa6\x40\x2b\xe0\x1f\x5b\x2c\x8f\x73\x66\x4b\x9e\xb0\xae\x8b\xdb\xc9\xe6\x38\x20\x5e\x4c\x36\xc2\xac\x38\x0b\x74\x4e\x88\x27\x85\xa0\x45\xc6\xf0\x51\xcc\x69\xea\x4a\x26\x43\xdc\xf7\x20\x8c\x01\xc4\xed\xd8\xe5\x9d\xcd\xd5\x89\x36\x36\xad\x18\xf0\x27\xe2\x3a\xad\xf0\x52\xae\xb4\x57\x2b\x4b\x56\x7a\x4d\xc4\xd3\x71\xe5\xe5\x60\x59\x68\x94\x48\x0d\xb0\xe8\x08\x37\xca\x88\x8b\xdc\xb8\xec\x13\x26\xd5\x9c\x0d\xf6\x54\x37\x23\x0d\x94\xa2\x45\xa1\xee\x8a\x6c\xbb\x4e\xf3\x62\x0b\x87\xd9\x2a\xad\xdd\xd2\xda\x39\x65\xb2\x0d\x95\x41\x20\xe7\x71\x91\xc3\x40\x54\xa6\x61\x87\x50\x86\x90\xc3\x0d\xb9\x92\x24\x34\xbb\x3e\x8f\x6d\xbc\x84\x54\x90\x58\x73\xb6\x86\x14\x5b\x0a\x8f\x34\x76\x6f\xf2\xf7\x78\x09\x7c\x74\xc6\x98\x0e\x3b\x36\xb7\x1f\x99\x27\xcf\xc7\x87\xe0\xda\xf1\xdd\xbb\x63\xdd\xce\x23\xdb\xd1\xf2\xbc\xb5\xc2\x31\x0d\x07\x74\x27\xe9\xf9\xa1\x48\xce\x35\x61\x07\x36\x1a\x1c\x6e\x98\x07\xec\xfe\x14\xe4\x1c\x51\x0f\xfa\x28\xd7\x35\x84\xfb\x41\xc6\xc9\xd6\x6d\x39\x9f\x8a\xc3\x38\xf4\xb9\x23\xf4\x50\x29\xf3\x61\x6c\x04\xe2\x08\x03\xcc\xf0\x7d\x9e\x15\x71\xa2\xe4\x67\x8e\xd8\x5d\xe5\x27\x98\xfd\x51\x17\x4b\xf0\xc9\x9c\xa0\x72\xab\x93\xad\xc3\x8f\x91\xdf\x71\x92\x60\x50\x18\xf6\x8e\xbd\x65\xb8\x04\x27\xa3\x70\xf3\x06\x73\x44\x76\x9c\x6b\x73\xbb\xb9\x85\xa1\x36\xe5\x36\xc1\x58\x93\xde\x54\x81\xb3\x50\xc1\x79\x68\xe9\x67\xf9\xb3\x9c\xe6\xea\x1f\xdb\x18\x28\xcf\x03\x84\x06\x43\xde\xde\x19\x20\xad\xde\x40\xf5\x0d\x55\xca\xd7\xb7\x5b\x1e\xb5\x14\x25\x72\xf1\x8a\xc2\x2b\xc9\xce\xc3\x36\xaf\xd3\xcc\x57\x37\xde\x19\xf7\x08\x69\x5e\xb0\xab\xa6\x5f\xe9\x5a\xb7\xae\xd9\xdc\x9b\xed\x43\x29\xe7\xca\x9a\xdb\xbb\x62\x5b\xaa\xf8\xc6\x15\x12\xd6\x71\x9a\xb9\x6b\x27\xc6\x08\x9b\x10\x70\xc3\xe9\xc4\x0d\x51\x73\x51\xb7\xc6\x00\xaa\x31\x51\x05\xe3\x5a\x12\x38\xeb\x87\x4a\x75\x04\x54\xa0\xbd\x4b\xee\x35\x80\xbb\x57\x05\x18\x55\x5e\x2d\x3b\x94\xcc\x81\xcd\xd0\x34\x16\x60\xe4\x99\x8e\x6a\x6d\xd6\xd2\x6d\x4c\x64\x90\x64\x12\xc2\xfb\x89\xef\x4e\x6d\x37\x09\x8c\x6f\x43\x62\xcd\x5a\xef\x44\x28\x7c\x39\x39\x03\xa8\x9b\xcd\xb4\x3e\x64\xbe\xc6\xaa\x99\x55\x6b\x75\xad\x33\x25\x69\x1c\x24\x8e\x6c\xa3\x3c\xfa\x73\x36\x45\x7c\x6b\xd6\x74\x40\x92\x02\xb4\x5e\x87\x8f\x77\x5e\xa7\x6f\xfe\xda\xd4\x4a\xeb\x7b\xab\x34\xcb\xd8\x5d\x2e\x8b\xf6\xc5\x10\xe0\x2a\x45\x23\xc2\x7c\xd0\xdb\x10\x50\x40\x29\x43\x7d\xf4\xed\xd6\x6b\xb0\xd4\x00\x4c\xdc\x4d\x51\x55\xda\xfc\xaf\xa8\xc6\x48\xeb\x86\x4a\x9a\xdd\xad\x49\x41\xd7\x11\x24\xc2\x2c\x2b\x51\xf3\x05\x4c\x6d\x34\x08\x81\x79\x9f\x3e\xe5\x02\x0c\xea\x10\xca\x05\x73\xef\x9a\x44\x9d\xda\xbe\x8a\xe9\x4e\x4c\x40\x7b\x63\x69\xd9\x00\xe3\x96\xb3\x8f\x17\x06\xfd\x99\xcc\x74\x27\x04\x80\x4d\xa9\xb8\x92\x01\x6f\x2b\xce\xbf\x95\x5a\xdd\x13\xbd\x55\x80\x05\xa2\x95\x60\x6c\x27\x67\x7a\x5f\xa6\xb2\xef\xac\x06\x3e\xde\xb0\x32\x1e\xda\x4d\xc0\x04\xbf\x19\x9c\xf6\xb3\x65\xf5\x0d\xc3\x27\x76\x22\x83\x66\xef\x54\x5e\x05\x02\x0e\xe6\x9b\x50\x5d\xa4\x95\x75\xf9\xdc\x68\xa2\xac\x22\xee\xe1\xc0\x23\xaf\xe7\xd2\x12\x9f\x17\xc4\xc7\xf0\x78\xe2\x13\x14\xe4\x91\x59\xe1\x3d\x53\x6c\xb6\xf9\x0d\x22\x33\x70\x2b\xf3\x81\xb8\x32\x5b\x9f\xb3\xb3\x0c\xbb\xd8\x7b\xc4\x1c\x1a\xa3\x8d\xa4\xab\x5b\x9f\x86\xc9\x4a\x91\xb6\x62\xa5\xef\x59\xdf\xd4\xbc\xa1\x1f\x58\x2a\x09\x63\x52\xf1\x66\x34\x0b\x95\xd6\x83\xa3\xb7\x58\x8b\x82\xf1\x61\x88\x92\xf1\xfe\x28\x42\x24\xac\x16\xc5\x27\x5d\xa6\x69\xc7\x10\x34\x8d\x58\x7e\xcb\x59\xa8\x6c\x00\x86\x8c\xf0\x8e\xea\x9b\xae\xa3\x4e\x29\x15\x85\x6a\x90\x18\x5f\xdf\x38\xb9\x10\x70\x8d\xeb\x0e\x91\x42\x33\x77\x70\x59\x34\x92\xf8\x6c\x27\x79\xfa\x9e\xad\x97\xf3\xcb\xce\xcd\x4e\x07\x13\x27\x50\xe9\x1a\x5c\xa0\x1a\xd2\x2c\xf6\x36\xeb\xf2\xd3\x9b\x5e\xcc\x4d\x7a\xc7\xa7\x16\x59\x20\x02\xfc\x20\x14\x50\xf7\x9c\x93\x7b\xb1\x29\x36\xb1\x07\xbc\x16\xd5\x6d\x71\x9f\xf3\x6f\x06\x49\xa2\xf3\x64\xbb\xc6\xf0\x19\x77\xe7\xad\x18\x78\x4e\xc4\x37\xda\x6a\x3d\x07\xb3\xe5\xab\xee\xfc\x2f\x61\xf8\xc8\x4a\x96\x0e\x90\xd9\x9c\xb6\x0d\x7b\xdd\x3a\x6e\xce\x3b\x3b\xba\x70\xd5\xe5\x40\x90\x8b\xfe\xe7\x6e\x1f\x6d\xce\x48\x74\x01\x11\x89\x78\x06\xd9\x68\x9b\x0d\xf5\x05\xa2\xaf\x75\x85\x4b\x99\xb2\x92\x09\x38\x21\x69\x0d\x8a\x30\xb5\x5e\x83\x15\x03\xf7\x36\x6f\x53\xeb\x7b\x04\x60\xbe\x04\x2a\xd7\xf7\x6e\xdf\xf9\xa8\xc1\x7d\xd7\x48\xcc\xe3\xd1\x3a\x92\x38\xa5\x6c\xa9\x3c\xf7\xf7\xa2\x39\x98\x01\x33\x58\x9b\x83\x8c\x9b\xdd\x6a\xed\xc3\x2d\x75\x7e\x94\x68\xa1\x1d\x23\x3a\x34\x21\x77\x1d\xe3\x4e\x83\x31\x22\x7d\x61\x7e\x5f\x57\x77\xc9\x18\xa4\x26\xdb\x43\x9e\xeb\xed\x79\x0e\xff\xd6\x98\xc3\xa6\x31\xef\x44\xd9\x3b\xd7\x93\x24\x29\x74\x66\x7c\xfc\x04\x63\x1c\x55\x12\x3e\xea\x7b\xd6\x7c\x68\xbe\x79\xcf\x0a\xc6\x37\xb6\xae\xce\xb4\x56\xf7\x71\x65\x19\x2e\x39\x94\xca\xa5\xe5\x08\x4a\xa3\x47\xb9\x09\xa5\xb9\x16\xfa\xea\x6b\xb3\x12\x5b\x6d\xa1\xf8\xb8\x13\x96\x32\xef\x12\x00\x3f\x7b\xa3\x98\x53\x6e\x07\xf4\x92\x64\x8c\xfa\xf1\x49\xca\xbc\x20\xcf\xe8\x43\x97\xac\x76\xb7\x71\x2d\x90\x65\xfb\x2e\xdc\xff\xc4\x9c\x0a\x64\x38\x5b\xcb\xb7\x15\xa5\x87\x28\xbc\x1f\xa7\x6f\x07\xe1\xb9\x1d\xf4\x3c\x5a\xbe\xde\x89\xe5\x76\x3c\xdf\x1c\x94\x5e\x5d\x32\x6f\x75\xae\x2d\x2f\xb8\x8d\x16\x5a\x85\x73\x15\x37\x1a\xc6\x99\xb7\xc4\x35\x8d\xd6\x40\x4d\xd8\x3b\xea\xee\x45\xc7\xa5\xf5\xff\xb1\xf7\xee\xcb\x6d\x23\xd7\xde\xe8\xf9\x5b\x4f\xd1\x87\x55\xdf\x67\x71\x1f\x08\x36\xe5\xdb\xd8\xfe\x67\xd3\x14\x65\x73\x42\x91\xda\x24\x65\x47\x49\xa5\xf2\x35\xc1\xa6\xd8\x31\x08\x30\x68\x40\x32\xf3\x46\xe7\x35\xce\x93\x9d\xea\xb5\x56\xdf\x00\x50\x92\x27\x33\x93\x4c\xc6\xaa\xda\x3b\x1e\x12\x6c\xf4\x75\xf5\xba\xfe\x7e\x2d\xa2\xb1\xb1\xe7\x9c\x58\xc3\xfe\xcb\x02\xe3\x26\x3c\xf3\x3f\x81\x64\x1c\x0b\x33\x46\x56\x83\x32\x30\xe0\x5a\xd4\xde\xf2\xd4\x78\x70\xb5\xcd\xe2\xb9\xe5\x21\x39\x2a\x9c\x39\xd3\x20\xf5\xfd\x22\x66\x67\x02\x0c\xd6\xf6\xd5\x0a\x02\x26\x36\xe3\x51\xd5\x12\xa9\x96\x4d\x76\xed\xba\x10\x30\x2f\x9c\xc4\xec\x2c\x27\xdb\x8a\xd4\xbe\x6c\xcf\x2c\x5f\x9c\x72\xf8\x1d\x4b\x71\xa8\x1f\x04\x14\x96\xe4\xd9\x3a\x95\x09\xc2\x95\x79\xde\xac\xb6\x8c\x1b\xf3\xfa\xa9\xbf\x56\xd9\xbe\x35\x7c\xe0\x7b\x7c\x1a\xb2\xcc\xd6\xf5\x6a\xb1\xdf\x96\x9d\x87\xf9\x74\x98\xc4\x67\xd1\xd4\xff\x5e\xf1\x14\xb2\x81\x54\x5b\xda\x95\x97\x2b\xa7\x45\xbe\x75\xa3\x51\xfa\xa1\x03\xf5\xb6\x5b\xc7\x7a\xaf\x4b\x54\x65\xd0\x3b\xe0\x32\x9b\x30\x84\xab\x3b\x82\x5a\x22\xda\x1e\xb6\x87\x1c\x81\xa1\x4c\xda\x53\x8e\xe6\x89\xd4\xb7\xc2\x6a\x15\x6c\x3c\xa3\x0d\xa5\x12\x81\x5a\x5b\xf6\xf5\x81\x05\x6f\xde\xed\x24\x04\xa9\x61\xc3\x6c\x1d\x5a\x2b\x2e\xde\xd3\xb2\x5f\x7d\x8f\x23\x7f\x68\xb3\x7a\xa6\xa7\x2c\x9b\xa9\x88\xda\xc2\x17\xde\xf3\x7a\x70\x7b\xc7\xe5\xef\xad\xf8\x72\x0f\xd9\x2c\x5a\xbe\x13\xf0\xd1\xc9\x09\x78\xfe\x30\xc5\x20\xc2\xbb\xcd\x36\xb2\x13\x02\xd3\x80\xc4\x1d\x1e\x52\xc3\x64\xae\x8f\xb6\x4b\x42\xd1\x1a\xea\xad\x20\x5c\x22\x96\x17\x37\x3c\x23\x82\x43\xa3\x1c\xe3\x4d\x0d\xb5\xf5\x8d\x4c\x37\x6e\x93\x26\x5a\x26\x86\xf2\xc3\xf4\x73\xd5\x0e\x1d\x90\x58\x0f\xb0\xc2\x58\x7a\xc3\x8f\x6d\x32\xb2\x1a\x3f\x34\x39\x58\xf8\xb3\x9a\x53\xdb\xf1\x5d\x64\x96\x38\xc7\x6c\x13\x5f\xf3\x3b\x24\x10\xd8\x34\x4b\xf7\xa0\xac\x78\xef\x6d\xe4\x90\xa1\xbd\x0b\xdf\x1d\x4a\x18\x5b\x51\xc8\xf1\xd8\xf3\x06\x79\x8c\x92\xb6\xbe\xa2\x8b\xbb\x2b\x13\xc4\xee\xd7\x4c\xdf\xe3\x69\x21\xf8\x6a\xef\x0e\x39\x27\xc7\xae\xc9\x52\xf2\x63\x2f\xe0\x78\xf5\xf8\xfe\x6c\x3f\xf6\x88\x94\xa4\x57\xd6\xf5\xc2\x16\x79\xd8\x16\x88\x62\x70\x4f\xf0\xe1\x3c\x01\x01\xa8\x37\x9c\xd8\xf0\x74\x0d\xd4\x18\x7b\x2f\x5a\x86\x1a\x17\x1c\x8e\x77\xb0\x7d\xcd\x97\x85\x00\x85\x02\x6f\xf0\x14\xa6\x2b\x02\xde\xff\xaf\x3b\xc0\xf1\x6d\x25\x0c\xb4\x3a\x8b\xbb\xea\x31\x8d\x70\x45\x60\xf2\xa6\x29\x1b\x82\xc6\xfd\x78\x4c\xb9\xbd\xf6\x67\xc7\xcd\xc0\x8e\x49\x9b\x58\x86\xfe\x1b\x74\x6e\xb5\x1a\x38\xb2\x00\x0b\x52\x79\x0a\x9c\x9e\x1b\x82\xca\xc7\x4a\x22\x81\x89\x5a\x72\xbb\x4b\xf7\xfe\xd1\x35\xc0\xc3\xad\x37\xce\xcb\x98\x0d\xa6\x17\xef\x47\x93\xd1\xe4\x03\x3b\x9b\x0e\xae\x2e\x86\x93\x45\xcd\x0f\xb6\x5d\xca\xac\xa6\x1a\x61\xd5\x11\xc8\x21\x93\xc4\x77\x6f\xfa\x63\xd4\x30\xc8\x0c\x1b\xab\x17\xdd\x7b\x41\x49\xab\xae\x00\xc8\xb9\xef\x54\x9b\xa7\xcc\xf8\xd0\x0d\x54\x39\xf4\x94\x5b\x15\x87\x66\xbd\x5d\xd5\xf0\x1e\xb0\x5a\x9d\x1d\x4a\xe4\x51\xe4\x1a\xdd\x97\xea\x82\xe0\x87\x7e\x5a\x6c\xd0\x2a\x48\x48\x9a\xb1\x95\x4d\xe0\xd7\x06\x42\x28\xeb\x6b\x11\xe3\x5d\x4d\x3d\x92\xc5\xe1\x8b\x77\x61\x47\x6a\xde\x90\x09\x93\x49\x65\x2e\x49\x7d\x86\xdb\x4c\x41\x82\x42\xab\xd2\x52\xee\x52\x41\x71\xb3\x84\xa7\x6d\xa3\xb1\x64\xae\xa4\x8d\x13\x3b\xb0\x92\xd9\x0d\xa5\x8c\x7a\xb6\x18\x54\xe7\x98\x66\x5b\x1a\x73\x39\xdf\xfa\x64\x83\x33\x44\x9f\x50\x07\x74\xaa\x7b\x8e\x33\x0f\x51\xe9\x20\x80\x05\x0a\x29\x24\x98\x98\x9d\x52\x65\xf2\xef\x15\x48\x0b\xbe\x5a\x91\xf5\xe9\x49\x5a\x59\x46\xb5\xd4\x9b\xa8\xe1\x84\xb1\x8b\x4e\xe5\x6c\xe6\x5c\x05\x9e\x33\xf3\x3e\xb9\x46\xaa\x3d\xb0\x05\x44\xaa\x04\xe3\xa6\x0f\xa8\x6f\xc6\xec\xc2\x74\x1b\x46\xc8\x57\x7f\xab\x54\xe9\x97\x08\x84\xd7\xb5\xd9\xb2\x0f\xab\x0d\x35\x27\x83\xd5\xcb\xbd\x0d\x80\xfa\x58\xe3\x0c\x78\xde\x55\x73\x86\x3d\x1d\x56\xdd\x63\x31\x9b\xeb\xbc\xed\x60\x98\x04\x44\x30\xa2\x0f\xda\xde\xef\x9c\xb1\xf8\xc0\xbb\x5b\x92\x92\xe0\xb2\x6d\x7f\xda\x37\x83\x3c\xb6\xb5\x15\xa9\xe8\x69\xda\xf6\xa3\x50\x47\x27\x94\xef\xc1\x14\xb0\x0d\x46\xd3\x09\xe0\x43\xb4\x8a\x3e\x2a\x01\x35\x0c\xd5\x39\x62\xb0\x91\x26\xde\x16\x59\xfd\x26\x89\x48\xc4\x9c\xf6\x6a\xf2\x08\x76\x6b\x05\xaf\x5e\xa5\x9f\xbf\x3c\xee\x3d\xcd\xb3\x69\xf3\x62\xeb\x76\x87\x1b\x4c\x9b\x44\xf5\x32\x30\x8a\x2a\x6d\xe9\x82\x96\xcd\x8d\x98\x70\xcd\x68\x74\xfd\xa2\x2c\x99\x96\x80\xb1\x99\x62\xf1\xb5\x2c\x80\x8d\xc4\x74\xde\xe6\x84\xc3\x4d\x4c\x69\x65\x7e\xa7\x6b\x21\x19\x59\x7a\x13\xe7\xb1\x6d\xf9\x33\x6d\xc7\x89\x97\x06\xdc\x94\xbc\x55\x40\x62\x61\x52\x89\x24\x65\x05\x22\xce\xad\xc2\xa0\x80\x99\xa1\x70\x5d\x9a\xc3\xf4\xea\x4e\xda\x26\x0c\x6b\x92\x7c\x0f\xed\xeb\x98\xf5\x3f\x7c\x98\x0d\x09\xa6\x02\xb0\x56\x46\x93\xb3\xe1\xe5\x70\x72\x06\x60\xee\xd3\xd9\x1f\xe6\x98\xc8\x98\xe4\xdb\x9d\x0c\x59\x45\xfc\x72\x2d\x69\x10\x8a\x40\x35\x56\xfe\x6d\x7d\x90\xb0\xdd\x2d\x9a\xc9\xf6\x8c\x28\xa2\xac\x6f\x53\x8c\xd8\x0b\xa3\x5a\xe7\x05\x91\xef\x04\x51\x22\x93\xc8\xe5\x12\xaf\x79\xc6\x3a\xfc\xe6\x46\xcf\x44\x29\x3a\xc6\x8b\xe2\x1c\xbf\x85\x50\xfa\xd2\x30\x34\xc7\x24\xc0\xec\xd0\x28\xad\xdb\x00\x32\x41\x16\x04\x0a\x45\xc0\xd4\xac\x53\x1b\xdb\x1f\x3e\x51\xfa\x37\xe0\xd5\xd9\xe7\xd9\x0a\x12\xaf\xea\x47\x0c\x13\x5a\xb1\x06\x3d\x66\x9f\xa9\xdc\xa4\x56\x3d\xe5\x41\x4f\x65\xcc\x0e\xa4\x56\x21\x6d\x6b\x5a\xf8\x4e\x6b\x5e\x81\x7b\xdc\xa7\xc1\x77\x0d\x50\xb4\xdd\x38\x24\xbc\x72\xe3\x43\xf5\xc9\x81\x2b\x9f\xb4\x72\x4f\xd3\xf7\xe2\x11\x5e\xac\x91\x3d\x87\x3a\x0d\x07\x61\x5c\x9a\x20\x5b\x7b\xf2\x02\x79\x2e\x5b\xea\xc8\x28\x1e\xc2\x51\xb3\x20\xed\x9b\x6e\x5c\xc2\xc1\xf5\xe6\x26\xf0\x5f\xfb\x96\x4e\xe8\xde\xcb\xc3\x7c\xa3\x65\xc1\x93\x2f\xa2\x6c\xea\x99\xf5\xd9\xb3\x84\x78\x00\x60\x5e\xe4\x99\x4c\x7c\x37\x0f\xc4\x8b\x31\xaf\xa6\xb5\x20\xce\xfb\x15\xf2\xd3\x4d\x6d\xf9\x04\x44\x7c\x30\xd5\x08\x93\xa1\xf3\xac\x96\xa3\xd5\xec\xea\xdd\x26\x4f\xbd\xce\x19\x94\xf1\xc5\xac\x3f\x99\x8f\xe1\x24\x83\xd2\xe6\xd5\x7f\xe8\xe3\xe1\xd3\xd7\x9b\xc2\x75\x3f\xdc\x12\x31\x95\x5b\xfb\xc5\xcf\x9f\x74\xed\x34\x43\x5e\x2d\x31\x0f\xab\x5a\x03\xd1\x4d\xca\x13\x7d\xd6\x0e\xea\x67\x7e\xe3\x36\x7f\x8c\xc0\x66\xdb\x8c\x24\x59\x34\x2a\x86\x55\x14\x98\x5e\x96\x73\xb8\xd6\x6f\xdf\xfd\xd2\xae\xfb\x98\x18\x71\x03\x36\xdc\xfa\x90\xad\xdb\xa6\xad\xf0\xec\xba\xd6\x01\xde\x64\x62\xaa\xdf\xc5\xc6\x35\x19\x6a\x5c\xaa\x19\x46\x30\xfa\x49\x9b\x8a\xde\x76\xa9\x42\xde\x9a\xcf\xbe\x6c\xc7\x32\xcc\x6e\x20\xc3\x28\xc8\x51\x68\x21\xa8\x38\x30\xf8\xdc\xeb\x25\x5d\x8b\xd6\x54\xd0\x0a\xa1\xe3\x6e\x5a\x49\xd5\x0e\x55\xed\xcf\xca\xa1\xb7\x35\xba\x05\xde\x75\xa3\x90\x16\xde\x6b\xa3\xf6\xdf\x43\x32\x8c\x36\xa8\xb9\x4c\x8d\x04\x73\xfe\xa9\x7a\xc4\x40\x3e\xa0\x1e\xd6\x7c\xe1\x7e\x8e\x3a\xbe\xdf\x97\x86\xc7\xf6\x04\x74\xf5\x4e\x6a\xc6\xb5\xdc\x13\xbd\x2e\xf1\x7d\xec\x77\xc4\xf0\x61\xf8\x04\x2d\xb4\x48\xe9\x12\xcb\xa0\x83\x30\x98\x37\x31\x5b\x0c\x67\x17\xa3\x89\x3d\xed\x7e\x0e\x6f\x08\xf0\xe8\x48\x83\xa3\x96\x82\x6f\x3b\x05\x02\x61\x8d\x03\x34\x65\xbb\xaf\xd6\x79\xd1\x5e\x60\x68\x5d\x83\xbc\x2c\xc5\x76\x57\x1a\xe0\x90\xb6\xd7\xdf\xf7\x76\x4a\x0a\x37\x58\xf4\x69\x5a\x23\x3e\x71\x84\x28\x60\xee\xd2\x35\xdc\xd6\x25\x9b\x4d\x6c\x11\xd1\x1b\x34\x27\x26\xb7\x27\x2f\x2c\x9b\x12\x88\x97\x7d\x2b\xba\xff\xa3\xa9\x4c\x54\x6e\x53\x23\x11\xcb\x9e\x3a\x70\x90\xbc\x04\x91\x18\x9e\xc5\xec\xfc\x6a\x71\x35\x1b\xb2\xd9\xf0\xd3\x68\x6e\xac\x03\x1f\x6c\xd1\xd8\xe0\x87\x00\x72\x5c\x52\xb1\xda\xb0\x4c\x00\xd4\x00\x50\xb2\xd7\x25\x17\xbb\x1f\xb9\xa7\x05\x1e\x19\xc3\x0b\x99\xb8\x73\x4d\x19\x94\x67\x25\xb7\x32\xc5\xf2\x1d\xb5\x93\x85\xb4\x76\xa7\xc9\x6b\xbd\x35\xa9\x05\xcb\xaa\xa4\x5b\x05\xb8\x58\x65\xc6\x56\x90\x0a\x06\x5e\x24\x84\x30\x80\x57\xec\x8a\x7c\x99\x0a\x2c\x9b\x4c\xf2\x2c\x11\x45\x06\x61\x16\x61\xf0\x97\xef\xee\xee\xe2\x9b\xac\x02\xdc\x65\x83\x68\xf2\x14\x4b\xec\xb4\x31\x50\xcb\xbb\xf2\xe0\x3d\x30\x48\xc4\xc9\xb3\x7d\x53\x49\xb5\x21\x2d\x59\xb9\x08\x4e\xd3\xf9\x68\xd0\xec\x0d\x27\x2c\xae\x69\x52\xe9\x61\xe3\x6f\xea\xd9\x5e\xde\xbe\xe9\x50\xbc\x0d\xf0\xb1\xcc\x53\x1d\x3f\xdb\x5f\x52\xd8\xc0\x6c\x2c\x13\x33\x80\x0a\x4d\x5b\xb7\xb3\x39\x40\x53\x41\x59\x9d\xd6\x71\x60\x91\xf7\x6d\x87\x0a\xe3\x87\x0b\xba\x10\xd2\xa7\x78\x41\xca\x63\xd0\x28\x95\x9e\xa6\x82\xaf\xcb\xae\x71\x8d\x1e\xda\x76\xf7\xd4\x5a\x63\x67\xf6\x5a\x8b\x0f\xa6\xb8\x79\x0d\x9a\x6b\x3b\xd9\xe4\x86\x9d\xd7\xfc\x04\x73\xba\xfe\x89\xee\xf5\xcf\xce\x86\x93\xb3\xab\x8b\xb7\x5a\x2a\x38\xd7\x66\xcd\xb6\x04\x89\x62\x6d\x91\xa3\x45\xcb\x63\x50\x9b\x6c\xcd\x44\xbb\x64\x84\xb0\x1a\x35\x19\x94\xc3\xfd\x97\x05\x36\x2a\xf9\x6a\x29\xd1\xd8\x43\xbb\x35\x6a\x0d\x3a\xff\x42\x8d\xe0\x6f\xa0\x22\xda\x44\x16\x57\xf4\xf6\xb6\x06\x8e\x7c\x3d\xec\xcf\xd8\xf5\xf4\x6a\xc6\x26\xfd\x8b\x61\xcc\x42\xa8\x63\x8f\xcb\x04\xc5\x74\x90\xd1\x09\xb1\x55\x5b\x3e\x25\x9d\xb9\xdf\x9e\xdb\xf2\x90\x38\x89\x98\x87\x04\xc6\xda\x4e\x83\xb7\xba\x0f\x2c\xe6\x3b\xd4\x17\xb3\xb6\x9a\xff\x48\x7f\xdc\x28\x04\x88\x0c\xcd\x47\x3d\xf1\xdf\xd6\xf1\xda\x00\x89\x47\xcd\x12\x7a\x2e\xcc\x3d\x2d\xac\x72\x70\xff\x88\x3b\xf1\x11\xa5\x0a\xc3\xfe\x68\xeb\x6a\xb3\x60\xa1\xad\x38\x21\x0a\xdc\x34\x1d\x3d\xf6\x38\x8e\xb1\xfb\x1d\x96\xca\xcc\x32\x5f\x49\xf5\xf6\xc8\xba\x3a\x5b\xf4\x5a\xc4\x87\x18\x8f\xe6\x80\x71\x3a\x9a\xb1\xc5\x68\x31\x1e\xce\xbd\xc4\xcd\x66\x8f\xdc\x6f\x1c\x39\x0c\x3c\xda\xa8\xa1\x70\x4f\x3e\x34\x72\x5b\xbc\x1c\x8c\x32\x2f\x48\x2f\x37\x75\x58\xcb\x80\x88\x4b\x0f\xbf\x10\x82\x50\xaa\x49\xfd\x2c\xef\x72\x64\xe7\xce\xc8\xd7\x00\xd4\xec\x64\xa6\x2b\x59\x56\x78\xfa\xa9\x3f\xee\x68\xfb\x01\xc7\xac\x2c\xe4\xad\x36\x31\x84\x57\x94\x6c\xc0\xa6\x92\x7c\x25\x22\x76\xe7\x03\x30\xa1\x57\x8d\xc4\xb1\x12\xee\x67\xe8\xf3\xe5\x69\x2a\x52\x3a\x24\xe8\x8f\xdf\xe4\xe4\x3a\x0d\x01\xaf\xac\x26\x66\x2a\x24\xcb\x07\x20\xbc\x02\xaa\x4b\x89\x1c\xd9\x5a\x93\x08\x01\xbb\x7e\x65\xfc\xbf\xf8\xe9\x65\xae\xca\x9b\x42\xcc\xff\x67\xfc\x2f\xc2\xff\x3f\x3d\x7d\xd1\xc0\xff\x7f\xfd\xfc\x3b\xfe\xe3\xaf\xf2\xe7\x56\x9f\x9d\xf1\x92\x2f\xb5\xcd\x77\xc1\x33\x4e\x61\xd5\xf9\x5e\x95\x62\x7b\x74\x0c\x04\x50\x45\xba\xc7\x40\x86\xde\xed\xf4\x43\x65\x12\xd6\xdc\x27\x6f\x5e\x76\x8f\x2e\x0d\xa2\x7a\x03\xee\xff\xd5\xc9\xe9\xb3\xde\xb3\x08\x94\x60\xef\xe5\x1f\xd2\x7c\xc9\x53\x76\x26\x6e\x45\x9a\xef\xe0\xdd\x1f\x8a\xbc\xda\xdd\xd3\xd2\x0b\x6c\x64\x26\x6e\x4c\x72\x40\xd9\xe0\x10\x18\xf0\x54\xae\xf3\x22\x93\xdc\x27\x0a\x68\x87\xcf\x6f\x14\x9b\xd6\xb1\xff\xc1\x31\x1a\x82\xfe\x1b\xca\x1e\x2c\xd9\x8f\x1c\xf7\x96\xa8\x91\x71\xf1\x16\x8a\xa2\x16\xbe\x82\x7a\x75\xea\x21\x8c\x7c\x0f\x22\x9f\x17\xfc\xa6\xe0\xbb\x8d\x35\xc0\x3d\x7d\xf3\x2e\x77\xdf\x2b\x9f\x7e\xc9\x16\x9f\xc6\x47\xed\xb0\xe5\x57\x93\xd1\xa7\xe1\x6c\x4e\x04\x99\x83\xfe\x78\x74\x3e\x9d\x4d\x46\xfd\x90\x06\xb4\x3f\xb9\x26\x10\x74\x60\x28\x05\xdc\xe1\xc8\x02\x97\x47\xed\x34\xa0\x87\xe1\xcc\x1d\x9a\xfb\x78\x3a\x5f\x38\x7c\xf2\x06\x17\xa8\xc7\xfd\xe9\x61\x86\x23\x46\xf4\x62\x6e\xc3\x31\xc4\xeb\x6a\x68\x41\xef\x1d\xd7\xb7\x53\x85\xc6\x47\xf7\x36\xd8\x0a\x83\x3c\xaf\x91\xcc\x46\x3e\x27\x6d\x13\xc2\x1e\x69\x71\x6b\x58\xc9\xed\x58\xf6\x30\xf8\x87\xe0\xec\x6b\x48\xdb\x16\x50\xdd\x61\xfb\x8f\xe6\xed\xa4\xbb\xba\xf5\x07\xe7\x6f\x32\x65\xd3\xf7\x63\x42\xca\x9e\xeb\x0d\x42\x6f\x60\x17\x7d\x00\xed\xee\x4f\x06\xc3\xc8\xe0\x5f\x47\xec\xea\xf2\xac\xbf\xd0\x93\x30\x9c\x7c\xd4\x5f\x41\x08\x0d\x36\x48\x50\x57\xf3\x1d\xf7\xf9\x97\xfb\x8b\x9f\x4e\x2e\xc7\x27\xbd\xb8\xf7\x4b\x5d\xfe\x0f\xde\xff\xaf\x5e\xbd\x3c\x7d\x5e\xbb\xff\x7b\xaf\x5e\x9f\x7e\xbf\xff\x7f\x8d\xbf\x89\x28\x55\xc2\x77\xc2\x6a\xab\x23\xb4\xa0\x6e\xad\xb9\xd7\x3b\xea\x5f\x0c\x27\x67\x18\xde\xd6\x17\x6e\xe3\x27\x35\xee\xa0\x5e\xdc\x63\xc7\x9d\xc9\xe5\xb8\xd3\x35\x11\x6f\xe5\x72\xf5\xff\x21\xd3\x94\xdf\xf7\x53\x6b\xa1\xb8\x7b\xac\xaf\x15\x77\xca\x20\x70\x14\x39\xc3\xaf\x1b\xb9\x94\x25\xeb\x9f\x1c\xe8\x51\xcc\xce\x81\x94\xc7\x63\x92\x83\xc6\x3b\x0f\xfe\x12\x71\xe1\x6e\xb4\x79\xe3\x91\x41\x3e\x62\xe0\xf1\x51\xdf\x51\x20\x2e\xd0\xd5\x53\x8f\xa0\x1d\x6a\x07\x7d\xdb\x31\x1b\x02\x84\x86\xc9\xd6\x51\xc2\x67\x55\x34\xd9\x4f\x50\x11\x60\x8c\x5b\xa9\x0e\x76\xed\xe4\xc4\x9b\x3c\x22\xaa\x09\x02\x8d\x66\x41\x06\x96\x8c\x31\x2f\x58\x92\x4a\x34\xb2\x56\x26\xb7\x1b\x34\x06\x30\xf7\xa0\xf0\x64\x25\x0e\x71\xa7\x8e\x46\x31\xeb\x98\xde\x3c\x51\xec\x7d\xc1\xb3\x15\xfd\xc6\x60\xe5\x04\xed\x80\xa2\x63\xbb\xef\xf4\x2f\x9b\x20\x8e\x36\x93\x22\xf8\x66\x28\x1c\x76\x4a\x1a\xf6\xc2\xaf\x2d\xb3\xf4\x73\xc7\xaa\xeb\x45\x4a\x09\xe6\x22\xc5\xd5\xb4\xef\x5b\x56\x65\x2d\x9c\x6a\x79\xfc\xc0\x51\xae\xee\x19\xe8\x28\x76\xed\x80\x9f\x27\xbf\xc9\x9b\xe8\xd2\xd6\x8f\x06\x3a\x1e\x52\xfa\xf9\x24\x4e\x26\x8e\x82\x9d\x56\x6e\xf2\x28\x1c\x61\xff\x9b\x4d\x10\x67\x25\x2f\xe4\x3f\xf2\xac\x43\x1c\x80\x45\xed\xa1\x54\xb7\xbd\xc9\x2b\xbd\x87\xf5\x13\x11\x7c\x97\x88\xac\x14\x45\x27\x62\x9d\x0f\x22\xf9\x92\xeb\x7f\xfc\xc8\x6f\x39\x16\x07\xe8\x7f\x21\x5a\x95\xfe\x7c\xbe\xe5\x45\xc9\xde\x17\xf9\x9d\xb6\x91\x3b\x4c\xdc\x62\x50\x97\x30\x6e\x75\x17\x81\x00\xaa\xe6\x5e\x99\x9a\xa8\x0d\x2c\x6a\x6e\x12\x7d\x29\xd0\x82\x33\xf6\x29\x66\xa3\xcc\x10\xdb\x96\xb9\xde\x73\x7a\x27\x9e\x55\x02\xff\x2b\x83\x9c\x89\x8a\xa7\x6c\x6a\x19\x1b\xe1\x97\x97\x40\x82\x04\x31\x7c\x53\x60\xda\x7c\x67\x5b\xea\x86\x9d\x96\x0d\xf7\x18\x1a\xcb\x8d\x2c\x56\xc4\xc7\x08\x7b\xdc\x2c\xb5\xcc\xd8\x81\xad\x0b\x69\xdc\x94\xd8\x61\x31\x61\x6d\xeb\xd2\x61\x2c\x24\x6e\x14\xe9\x1e\x9d\xf0\x5b\xfe\x05\x72\xef\x2b\x28\x91\xaf\xbd\xda\x23\x37\xbc\xaf\xff\x9e\x5b\x15\xe0\x60\x65\x56\x8a\x1b\xc8\xc4\x80\x66\xa1\x29\x48\x3e\x09\xce\x96\x31\x3e\xd0\xb5\xe3\xb3\x6a\x7b\x47\xc8\x6f\x80\xcd\xf3\xaa\x48\x04\xfe\x5a\xdb\x7c\x51\xb8\xfe\xf0\xd8\x1d\xc0\x2b\x38\xd8\xc0\x65\x80\x55\xd4\x09\x16\xbe\x73\xe8\xf8\x7c\xc2\x12\xdc\x7c\x1d\x6e\x14\xd8\xe2\xc1\x18\x96\x7b\x36\xca\x24\x60\xf8\x91\x71\xe8\xea\x19\x3f\xc5\x3d\x88\x54\x92\xc7\xc5\x7c\xac\x2f\xa9\x1a\xe7\xe7\xdc\xe6\x34\x58\xe9\x67\xe6\x36\x32\xf1\xb2\x32\x58\x61\xe7\x83\x37\x32\xd6\x0a\xd2\xc8\x36\xf7\x29\xc6\x7a\xec\x4f\xf1\x73\xd7\xa7\x53\x4a\x0a\x60\x97\xc4\xf7\x65\x8b\x33\xfc\xd5\x34\x7e\xe6\x60\xb0\x32\x73\x24\x61\xe8\x47\x83\xb4\x09\xff\xd2\xa8\x6d\x4c\x4f\x7a\xd9\x74\x31\x5f\xc0\xad\xaa\xc2\x46\x1e\x88\x85\x15\x4b\x96\xc2\xa8\x84\x29\x54\x5d\x41\x85\xdb\xba\x79\xbc\x9c\x69\x8b\xee\xae\x80\xe8\x17\x3b\xbc\x14\x49\x8e\xe8\x82\x21\x0b\xdc\x3d\x54\xd5\x7a\x22\x8c\xcf\xf6\x60\xbb\x79\xe6\x65\x7a\x62\x63\x5e\x6d\x35\x79\x02\xbd\x75\xaa\x15\x2e\xea\xb5\x61\x7d\xe7\x64\xa4\xef\x65\x76\xd3\xba\x2e\x8e\x98\x5e\x04\xa7\x21\x5f\x1f\x5a\x02\x5f\x27\xb9\xa8\xd5\x28\x27\x79\xb1\xcb\x11\x1a\x90\xca\x9a\x6a\x13\x69\xdf\x1d\x2c\xea\xcf\x31\x95\xed\x2d\xff\x33\x93\xf9\x69\x14\xb3\xb1\x2c\x7d\xc9\xdc\xc6\xfb\xeb\x28\x0b\x83\xa3\xd7\xeb\x19\xd0\x02\x0c\x2c\x5a\x7a\x68\x97\xe9\x96\xda\xc6\x19\x22\x28\xd3\x0f\x8f\x79\x37\x62\xc7\x4b\x4c\x8d\x3f\x4e\xba\xf5\xa8\x4c\x4d\xaf\x41\xec\x6b\xb5\x03\x2d\x02\x71\xa6\x3d\xf8\x37\x7f\x44\xc3\x3f\x7e\x1c\xbd\x1f\x2d\xee\x51\x21\xf5\x53\x9d\x05\xd5\xb2\x39\x3f\x93\x54\x88\x90\xaa\xcf\x5d\x6d\x8d\x1e\xa5\x1e\xc3\xa5\x6d\x94\xcd\xee\xbb\xa0\x12\xc1\x86\xac\xe0\x0d\x24\x9c\x5a\x78\x78\xbd\x19\xf0\x6a\x1a\x81\xc5\xf2\x40\xf4\xca\xb1\xdf\xde\xdd\xdd\xc5\x5b\x54\xfd\x20\x02\x3b\xb9\x1c\x3f\x3d\xb2\xb1\x9a\x76\x98\x7e\x2f\x06\xeb\x3f\x00\xa9\x1f\xd6\x5d\xb0\xe4\x4a\xaa\x87\x98\xfc\x28\xdc\x49\xd9\x09\xa6\xec\x40\x8a\x15\x46\x88\xfd\x97\xd9\xaa\x10\x83\x56\x68\x70\x0d\x49\x3b\x87\x8b\xcd\x51\x3d\xfb\x7b\xaf\xd1\xf3\x18\xcc\x97\x50\x6b\x90\xea\x41\x15\x38\x72\x92\xf5\x82\x17\xc9\x86\x3d\xef\x45\xac\xf7\xe6\xcd\x0f\xd8\x5e\xe3\x76\x6a\x95\x9f\xcc\x57\xd2\x07\x3e\xf3\xb9\xd6\x87\x51\x48\x40\xa0\xd3\xfa\x3b\x13\x82\x51\xf2\xa5\xb9\x5e\x9c\x90\x77\x47\xf7\xe3\xa4\xf7\xe6\xcd\x9b\xc7\xb5\xde\x4f\x53\x36\xc3\xe9\x9a\x59\x0a\xd5\x81\x2b\xd3\x3c\x56\xdd\xb7\xec\xaf\x8f\xfa\x8b\x8f\x3c\xa1\x6a\x80\x42\xdb\x4f\x09\x65\xee\x55\xea\x10\xed\x83\xc0\x77\x5a\x01\x86\xe7\xe3\xcf\x7f\xfd\xeb\x5f\xff\x62\x4d\xb2\x2e\x64\x94\xe2\x75\x97\x18\x84\x13\x4f\x8c\xe4\x6b\xf6\x67\xec\xd9\x5f\xdc\x86\x2f\x84\x6f\x7f\xc9\x4c\x95\x82\xaf\x5c\xfa\x13\x08\x24\x8b\x09\x74\x27\xd5\x86\xe4\x47\x7e\x07\xc7\xd0\xd4\x64\xd4\xf3\x02\x60\x54\x50\x33\x71\x60\x38\x7f\xae\xf5\x03\xc2\x97\xa5\x6b\xdc\x19\x33\x95\x12\xf7\xbc\xc3\x35\x3f\xb9\x1c\x47\x86\x8e\x9c\x7e\xb1\x12\x89\x34\x35\x74\x90\xc3\x6e\xc1\x0e\xdc\xac\xa0\xfb\xb8\x96\x2c\xbe\x75\x02\xc4\x73\x27\xa3\xc2\x11\x08\x66\x52\x18\xc9\xfe\x0d\xd6\xc3\xe1\xf5\x61\x35\x12\x25\xd1\xb7\xbd\x3e\x62\x9c\x15\x22\x91\x3b\x69\x20\x36\x1f\x33\x68\x12\x12\x34\x76\x63\xe9\x84\x7d\xe8\x1c\x3d\xec\x50\x20\x8e\x94\x33\x5b\xe1\xa7\x88\x36\xe5\x99\xd6\x1e\x3b\x03\x8b\x0e\xa9\x15\x52\x63\xa2\x86\x80\x4e\x21\x25\xf9\x17\x33\xcd\x81\xea\x16\x00\x9a\x73\x5f\xd1\x37\x6a\x46\x8f\xde\x67\x0f\x9b\x79\x19\x64\xbf\x53\xbd\x1a\x82\xe7\xc1\xd1\x57\x16\x9e\x91\x0c\x62\x83\xdf\x06\xcc\xe5\x38\x69\x4d\x2b\x0b\x5e\x74\x1a\xbe\xc8\x91\x78\x38\x00\xdd\x96\x00\x6d\x4d\xe1\x43\xea\xd9\x50\xa3\xa9\x48\xbf\xe4\xcc\x6b\xde\x01\x0a\x5e\xb4\x12\x2f\xc1\x98\xbc\x74\x1b\xef\xa7\xae\xcb\xcf\x63\x42\xe6\xaf\x39\x0b\x1e\x36\x2e\xcd\xd6\x78\x68\x44\xd0\xcb\xe0\x97\x20\x51\x60\xf6\x41\xa0\x38\x35\xce\x12\x02\x83\xd2\x96\xaf\x5d\x37\x5f\xc4\xac\x33\x74\x39\xc0\x67\xfe\x3e\xb9\x10\xc9\x86\x67\x52\x6d\x1d\x28\xf0\xd6\x7c\xe4\x03\x49\x03\x26\xa6\x97\x99\x60\xaf\x5d\x2f\xf8\x95\xa0\x10\xa7\x2a\xbd\x5a\xbe\x32\xa4\x5d\xae\xf1\xa6\x59\xf1\x92\xbb\xee\xbd\xd4\xdd\xfb\x2a\x92\x0a\x80\xc9\x5b\x1d\x2e\x84\x9b\x0a\xd0\x25\x9e\x8d\xe1\xe9\xba\xae\xb9\x57\x31\xeb\x34\xee\x37\x7f\x65\xbc\x94\x78\x03\xe6\xb3\xf7\xfd\x6d\x14\x16\x6f\xde\x91\x96\x0e\xdb\x69\xd8\x21\xf4\x24\x6c\x33\xeb\xa8\x73\x5d\x7a\x1d\xb3\xce\x98\x17\x37\xa2\x60\x9f\xf3\xe2\x8b\x9b\x6a\x28\x66\xa3\xeb\x01\x8b\x86\x6a\x03\x07\x7e\x8f\x70\x5d\x09\x27\x91\xde\xde\x70\xf8\xb5\x13\x13\xd9\xae\xfc\x10\x3b\x1d\xce\xce\x89\x97\x6a\xe3\x3f\xd9\xb3\xcf\xfa\x0b\xb3\xe1\x16\xa0\x06\xaf\xf4\x32\x47\x3f\x91\xad\xfe\xdd\xf2\xaf\x72\x5b\x6d\x8d\x55\xba\xcb\x11\x05\x2e\xb2\xfc\x53\xa6\xfe\x59\xba\xe2\x34\x49\xb3\x8d\x1e\x27\xe2\xba\x46\xc8\x7d\xd8\x7e\x06\x74\x0d\x20\x10\x29\x75\x99\x7e\x4a\xaa\x54\x92\x67\xb7\x62\xef\x68\x90\xec\x40\xde\xc4\x0d\x03\xdf\xf1\x00\xf9\x49\xd7\x80\xec\xa0\xaf\x24\xbf\x2a\xd6\x21\x46\x00\xec\x60\x51\x25\x65\x55\x60\x91\x9e\x13\xf6\x8d\xc3\x0e\x01\x56\x53\x4f\x1b\x0a\x3c\xac\xbc\x08\xb7\xb7\x57\x37\xc5\x11\x17\xba\xa0\x6a\x05\xa0\x68\x8f\x2c\x0c\x9b\x25\xa3\xb0\xb0\x60\x8f\x19\x83\xaf\xe1\x70\xbc\xaf\x3c\xea\xa3\x46\xe7\x0f\x74\xdc\x7b\x23\x20\x1d\xe8\x66\x6a\x1c\x5b\x7a\xd4\x1e\xc0\xc4\x37\xb6\xdc\x8b\x7b\xcf\x62\xd6\x09\x7e\x65\xd6\xaa\x66\xd6\x1a\x6c\x47\x27\x88\x12\xe7\x58\x90\x0d\x6f\xf3\xe3\x0f\xad\x9e\xff\xda\x9d\x02\x21\x71\xdd\x70\x54\xdf\xb8\xd2\x15\xbc\xb5\x65\xee\x5a\xaa\x19\x2c\x21\x0f\x96\x3c\x3c\xb6\x6d\x27\xb5\x87\x77\xfd\x25\x87\x43\x34\x48\xb9\xdc\x06\x3b\x77\x87\x5f\x40\x1e\xfa\xb1\xea\x46\x2c\xd3\x3a\xda\x9d\x6e\x33\x2f\xe0\x10\x60\xbe\x9e\x3b\x3b\xf7\x31\xf5\x47\x6c\x2b\xca\x4d\x8e\xe1\xfc\x44\x28\xc3\xc9\xb2\x83\xe2\xa9\x4a\xe1\x7b\x94\x25\x59\xa3\xb7\x3b\xf1\xc0\x4c\x4a\x80\x7f\x41\xf6\xf4\x08\xbc\xa9\xf7\xc5\xf0\x0e\x50\x63\x0a\xf4\x5a\x6f\xcd\x96\x09\x26\x09\x49\xfd\xbe\x20\xb6\xa8\x7f\x7b\x52\xf2\xaa\x1b\x90\x16\x07\xdb\x7c\x05\x05\x7c\x1e\xb6\x03\x71\x08\x20\x6e\xaa\xca\x13\x69\xa8\xb8\x44\xb1\xd6\x7a\xa5\x07\xa1\x40\x07\x4d\x81\x53\x59\xd9\x0a\x2c\x03\x35\xed\x17\x69\x61\x21\x99\x2a\x79\xea\x8a\x2b\x78\xc6\xdc\x1d\x46\x89\x65\x30\x6c\xd8\x97\xd6\x7d\x81\x18\x1e\xdb\x1d\x2f\x24\xa0\xc9\xf1\x1b\xdd\xcd\xf2\x01\x59\x42\x95\x55\x22\x4d\x4d\x51\xae\xd3\xdc\xc2\xeb\xc2\x4c\xa2\x55\x56\x9e\x28\x4a\x06\x43\x10\x60\xff\x18\x10\xf4\x2d\x59\xde\xdb\x1d\x51\xb9\xe9\x37\x16\xc9\x46\xde\xf2\x94\xdc\xa9\x5e\x82\x87\x08\x80\xd4\x56\xc2\xfc\x8e\x54\xce\x95\x38\xc1\xdf\x82\x1f\xc8\x1c\x4d\xa9\x9a\x8c\x33\x6b\xc0\x39\x67\xc9\x46\x5f\x8b\xde\x86\xd1\x5a\xe0\x75\x5e\x75\x00\xba\x41\xff\xab\xe8\x74\xed\xa6\xaf\x5d\xdd\x9c\xaa\xe2\xe8\x0a\x17\x5f\xb5\x4e\xac\x3c\xeb\x1a\xce\xa4\x81\xc2\xdd\xee\x52\x07\x33\xec\x5d\x1f\xe6\xc2\x8c\x5a\x2a\x3e\xd6\x15\x08\xfb\x43\x29\xd6\x52\xa9\xca\x9a\x87\xc6\xf5\xf3\x4a\x1f\xdb\xf3\xbc\xf0\x3b\x07\xf9\xfe\x38\x2e\x07\x24\x91\xed\x4d\xcf\x8d\x06\x00\x5b\x4d\x45\x54\x2f\xe5\x62\x3f\x08\xc8\xa4\x2c\xf7\xdd\x76\x8b\x85\xb9\xb0\x33\x61\x3c\xd7\x79\x85\x2f\x75\x44\x1c\xeb\x3a\x73\x40\xc4\x3a\xf4\x1b\x73\x0c\x8f\x79\x17\x8f\x62\x7e\xa7\xe7\x09\x31\x54\xe1\x5d\x19\xfe\x1b\xae\x74\x64\xce\x84\x14\x62\xf8\x90\xd6\x7a\xeb\x32\xae\x0c\x1b\x82\x20\xbc\x58\x73\xcf\x2f\xf7\x36\xb6\x10\x18\x24\x30\x9e\xe3\x65\x17\xc4\x95\xc5\x4b\x74\xf0\xc1\x6b\xb9\x2e\xf7\x6c\x27\x0a\x40\xdf\x3b\x7e\xf9\xec\x7f\x59\xf7\x59\x5e\x95\xd6\x71\xa7\x36\xbc\x40\x8b\x63\x29\x32\xb1\x96\x60\x10\x05\x4d\x7a\xbd\x32\xf8\xfd\xfe\x09\xa8\xc9\xdc\x53\xbd\x72\xed\xee\x91\x0f\x85\xa5\x03\x6b\x7e\xe9\x27\x44\x29\x24\x40\x3c\xc8\xf8\xa8\xc5\x74\x76\x62\x39\xf9\xfc\x8c\x4c\xcf\x23\xe7\x02\x2e\x5a\x56\x41\x25\x70\x85\xee\xe5\x9d\x80\x30\x0c\x08\x63\xa3\x03\x30\xc6\x78\x4c\x9b\xa3\xfd\x79\x3a\x0f\xc7\x9e\xee\x4c\x02\x1c\x49\x0a\x31\x90\xd7\xad\x89\xf3\xe6\x48\x4d\x12\x9a\xa5\x05\x70\x99\x68\x84\x25\x1f\xe9\x65\x43\xb1\xe1\x95\xde\xb4\x70\x22\x84\x62\xee\xb8\x45\xd1\xed\x36\x98\x7e\x6b\x86\x10\x05\x5b\xb9\xb2\x4a\x07\x67\x9e\x9a\xfd\x4e\x3f\xe0\xa6\x68\x69\xa6\x08\x6f\x54\x45\x57\x2a\x93\xd9\xba\x90\xc0\xfe\x44\x1a\x34\xde\x38\x11\x41\x3c\x6b\x49\x2e\x10\x49\x36\x5f\xd7\x55\x03\x22\x4d\x8e\x30\xeb\x58\xdb\x8e\x11\x4e\xd0\x4e\xef\x79\x40\xbd\xd0\x3f\x46\x11\x94\x43\xf5\x89\x16\x7c\x8a\x13\xba\xe0\xd3\xc0\x4c\xd7\x53\x68\x19\x12\x1e\x35\x43\xb1\x1b\x5e\x12\xfb\xd9\xe4\x2e\xd5\xde\x38\xc5\x8d\x78\x3a\x8d\x7b\x70\xee\xc1\x2d\xbd\xec\x82\xbb\xc9\x11\x30\x13\xfa\x20\x84\x54\x9a\xcb\x8f\xb0\xe4\x7e\xbc\xbb\x3d\x9c\xf9\x80\x15\xc2\x18\x5b\xc5\x0d\x37\x7c\xd0\x41\xdd\x31\x74\xc3\x64\xb9\xd9\xaa\x5e\xa2\x3c\x0d\xee\x2d\xeb\x75\x89\x8e\xc1\x44\xe5\xf5\xe9\x23\xb7\x8e\x55\x7f\x83\x4e\xbe\x63\xa7\x5d\x57\x13\x7e\xe8\x99\xbc\x60\xcf\xbb\x44\x4b\x86\xdb\x03\xb3\x11\x40\x16\xea\x9d\xf2\x96\x49\x94\x9d\x6d\x20\xc1\x8d\x2b\x5c\xd2\xc3\x0f\x9a\xfb\x7e\xdd\xba\xb9\x3e\xe1\x5e\xbd\xf5\x91\x46\x4f\xe3\xd3\xd8\xbf\xe4\x8d\x78\x9a\x7f\xbb\x0c\x89\xd0\x97\xe0\x37\xf6\x33\x88\xb3\x5f\x58\x30\x05\x7e\x9c\x9f\x51\x26\x85\x2e\x1a\xcf\x99\x0d\xf7\x88\x3f\x47\xed\xf2\xca\x94\x44\x65\x08\x51\x6a\x11\x7d\x28\xc0\xe0\x2d\x6e\x5d\x92\xd5\xcc\xfe\x7f\x4a\xb2\x3d\x4e\xb0\x45\x35\xc9\x76\x8f\x1b\xcc\x1f\x38\x0d\x91\xa7\x79\x66\xbb\x89\x71\x1e\xbb\xb1\x61\x98\xda\x34\x6a\xf1\xe6\x85\x13\x97\xdb\x10\xbd\xfd\x75\xd7\x13\xaa\xb0\xac\x28\x3f\xeb\xb2\xd3\x93\xb7\xf7\x88\x51\x90\x0f\x8f\x1c\x58\xeb\x8a\xc2\x44\x6b\x81\xd1\x72\x78\x1f\xd9\xee\x3f\x37\x1b\x8f\x13\xf0\xb6\xc8\xe5\x34\x3e\xb5\xc2\x1d\xfe\x7d\xaf\x80\xf7\x7b\x84\xa2\x5d\xcf\xbb\x62\xa1\x7b\xb9\xcd\x32\x7b\xac\x24\x3f\xfd\x66\x49\xae\xb5\x62\x27\xcd\x03\xb1\xc4\x15\x49\x76\x0f\xff\xb0\x65\x52\x0f\x08\xf8\xd6\x27\x1f\x25\xe3\x9d\x20\x0d\x8d\x50\x00\xb5\x6b\xae\xe9\x61\x71\xff\x2d\x3b\xa6\x76\x07\x1c\xbb\xfa\x68\xdf\xc1\xd2\xf2\xfe\xae\x63\x45\xa7\x5b\x03\x6e\xb3\x17\xdd\x87\x65\x44\xdd\xe5\x8a\xa9\xfc\x96\x36\xf3\x71\xdd\x37\x2c\x42\x81\x97\xd9\xe5\x46\xd9\x3b\xec\xb9\x56\xb6\xfb\x3b\xc7\xe0\x95\xaf\x5d\x98\x66\xd1\x10\xc6\x68\x22\xe9\xcb\xc8\x40\x1a\x17\x08\xbd\x6f\x3f\xb6\x41\x87\xd6\x3c\xc8\x83\x98\xd8\x87\x5d\x22\xfe\x3e\x6e\x5a\xcf\x9e\x4d\x18\xcc\x1b\xc5\x0d\xc3\x68\xf3\xa1\xa0\xdb\x37\xda\x9b\x35\x70\x25\xcf\xe2\x44\x0d\xd3\xa2\x43\xb5\x15\x84\x06\x25\xe5\xe5\x06\xca\x5b\xf7\x41\xc8\xdd\x1f\xde\x75\x40\xb7\x11\x92\x74\xa1\x30\xc6\x08\xb8\x29\x9a\xa5\x41\xa1\x73\xa8\x6d\x9e\xb0\x82\x39\x35\x64\xb1\x85\xd0\x6d\x27\xa5\x32\x4e\x05\x13\xef\xbc\x07\x81\x01\x93\x7e\x28\x26\xa7\x9e\x18\xe5\x41\xcb\x6a\x98\x10\xaf\xfa\xbe\x01\x86\x91\xf9\x69\x3a\xb6\x24\x0f\x46\x62\x61\x0e\xdc\x03\xd4\x72\xe0\x45\xb4\xe9\x58\xf1\x4b\xb7\x87\x4f\x63\xd6\x47\x9f\x06\x66\x08\xe6\xeb\x20\x28\x01\xce\xd2\xc0\x73\xfb\x2d\xfb\xd8\xe0\xa1\xc2\x51\x73\xae\x93\x96\x94\xb7\x07\x77\x97\xd3\x4c\x4a\x03\xd8\x86\x1c\x5d\x5c\x85\xae\x2b\xbf\x7a\xfb\x56\x7f\x9f\xb9\xd8\xcf\x83\x31\x24\x08\x23\x66\x7b\xad\x1a\x20\x2d\xc6\x96\x92\x44\x70\x05\x5a\xde\x62\x47\x85\x37\xad\x5c\xd7\x07\xab\xfb\xf0\xe0\x7b\x23\x9c\x2a\x42\x3a\x08\x9d\x4c\x0e\xa5\xfd\x4e\xa4\xb7\x82\x1d\xf7\x4e\xbb\x6c\x9b\x67\xe5\x46\x79\x05\xcd\x70\x1f\x02\xb0\x16\xd8\x3c\xa9\x3e\xc3\x09\xc0\xda\x39\x06\x55\xbf\x31\x25\xbf\xb2\xe3\x57\xb5\x86\xb8\xcf\x13\x1c\xec\xe3\x30\x96\x18\x6c\x08\x5b\x08\x5f\x1b\x38\x54\x95\x26\x1b\x6f\xc3\xe3\x21\xc4\xac\xb9\x90\x77\x02\xc8\x79\x2c\x9b\x7e\xfd\x28\x9b\x9e\x58\xda\x49\xfb\x0e\x93\x27\xa9\x7f\xf1\xf0\xe2\x4a\x2d\xf4\xa5\x49\xb6\x82\x80\x6a\x4b\xc4\xf8\x79\xac\x85\xbf\x40\x3f\x6a\x6b\xc4\xd7\x89\x29\xf4\x2c\x35\xd2\xb4\x0f\x9d\x07\x72\xc7\x62\xae\x10\x84\x1f\xcc\x41\x36\x47\xd8\xb0\x87\x5d\x9b\x5d\xa7\x7f\x82\xe7\x8c\xee\xa9\x50\xc9\x76\x6b\x4f\x48\x05\xd8\x40\xdc\x26\x49\x1d\xe7\x99\x45\xf7\x75\xf3\x5d\x8b\xce\x20\xaa\x95\x58\x19\x9f\x1a\xf2\x12\x19\xaf\x5a\xba\x27\xc4\x8f\xd0\xf6\xb3\x6e\x56\xba\xb2\x9a\xf6\x37\x3a\x9e\xcd\x8d\x55\xd6\xf0\x1d\x5b\x03\x96\xc6\xc5\xe7\x6d\x88\xc8\xda\xfe\xe4\xcb\xa7\x78\x08\x62\x7e\xb5\x8b\x02\xc8\x48\xf3\x90\xe1\x6c\xc2\x9b\x5b\x28\x23\x2c\xd1\x4d\x07\x23\x03\x55\xc4\xf7\xc7\x1d\xd2\x23\x9f\xc7\x2f\x62\x36\xf2\x2d\xc4\x4b\x63\x21\x5e\x20\x0b\xb8\x53\x38\xf5\x88\x16\xb0\xef\x2e\x41\x29\x43\x4d\xc6\x7d\x3f\x5a\x37\xd4\x46\x0b\xa8\x63\x70\x34\x8c\x02\x8a\x62\x33\xd8\xc7\x4f\xd4\xfd\xa6\xaa\x54\x41\x52\x32\x39\x9d\x85\x1f\x89\x34\x9a\x79\x9b\xe1\x18\xdc\xdc\x0a\x9c\x1d\x79\xa1\x35\x8c\x28\x78\xac\xb6\xf7\x10\x6c\x58\xa6\x5e\x16\x9d\x7f\xc2\x83\xcc\x0f\x03\x15\x30\x1e\x7e\xe8\x8f\x3b\x86\xb5\x98\x16\x87\xf2\x28\xf4\x94\xd9\xfd\x4f\xba\xad\xcb\x11\xc1\xaf\x65\xc6\x54\xb5\x5e\xcb\x04\x32\x60\x0c\x62\x0a\xce\x9f\xcb\x8c\x01\x34\x16\x3d\xbf\x28\xee\xcd\x11\x4d\xca\xb8\xbe\x10\x98\xe5\x47\xe0\x34\x6e\x45\x9c\x0c\xae\x9f\xa1\x9a\x40\xe4\x07\xef\xe3\xda\xdc\x61\x66\xa5\x3e\xae\x3b\x7d\xf0\x3c\x3e\x5e\x98\x12\x9c\xc7\xa0\xa0\x34\x9c\x7a\xb0\x81\x3c\x41\xec\x85\xd2\xb2\x15\xb5\x0e\x54\x6b\xa4\xa3\x97\x62\xa7\xd8\xb1\xa9\xa8\xd7\x87\x69\x0d\x81\x06\x3f\x52\xb2\xe5\x32\xc5\x6c\x51\x85\x78\x83\x99\xb8\x53\x37\x45\x5e\xed\x54\xd7\xa7\x6c\x4b\x78\xaa\xef\x08\xc2\xc8\x90\x40\x7e\x4e\x79\x5f\x77\x9b\xdc\x61\x08\x35\x42\x65\xb0\x30\x99\xb8\xf3\x66\xd6\xde\x2c\x38\xf3\x62\xe5\x59\x6d\xfa\xf4\xfb\x83\xee\x5f\x8e\x0e\x1e\xa1\x27\xaa\x99\x22\x6c\x95\x2a\x4f\x81\x27\xfc\x82\x2d\x72\x26\x9a\x10\x1b\x26\xc7\x1f\x3a\x8f\xf9\xba\x66\x13\xaa\x20\x39\xdc\xce\x4b\x26\x12\xa1\x14\x2f\x20\x57\x16\x88\xe0\x9d\xfc\xed\x5f\x8e\x5a\x0e\x4f\x0d\x82\x0c\xd0\x35\x90\xc9\xdb\x43\xe0\x72\x1b\xc2\x9f\x9b\xa4\xcb\x66\x82\x50\x84\x42\xa3\x85\xb1\xe0\x45\x85\x79\x0a\x01\x7a\x22\x0f\xc5\x0a\x10\xc2\x72\xad\xab\xef\xaa\x42\x55\x1c\x61\x71\xdd\x9e\x7d\x81\x76\x3a\x5a\xc6\x7e\x9b\x4b\x91\x4a\x71\x6b\x20\x7f\xee\x5b\x06\x4c\xac\xf4\xbf\xb7\x30\x64\x26\xdd\x8a\xa0\xb9\x9f\xe6\x45\x63\x0d\xbc\xb3\xed\x6a\x7b\x30\xfb\xa2\x2d\xa9\xe2\x40\x98\x5a\x2b\xc3\x6c\x66\xe4\xe1\x84\x08\x91\x3c\x98\xda\x0a\xf7\x87\xf0\x13\xf7\x64\xe6\xc5\xdb\x4d\x36\x13\xa6\x27\x36\x0c\x11\x10\x23\xb2\x34\xb1\x74\x93\x4b\x02\xc0\x14\x26\x1f\xdd\xbb\xbf\x7c\x35\x2b\x50\x92\x41\x5b\xc0\xa2\x1d\x59\x2a\x97\xc8\x41\x50\x00\x8d\xfb\xbe\xd1\xb0\x65\x5a\xb1\x27\x9d\x83\x3d\x76\xab\x67\x0c\xef\xf5\xbc\xd8\x77\xd9\x1d\xa2\x43\x03\x1c\x27\x95\x9d\x00\x27\xda\x17\x81\x89\xde\x69\x9e\x7f\x41\x47\x16\x02\xbd\x1a\x26\x84\xd1\xda\xb3\x0a\x56\x41\x79\x98\xbf\xec\x7a\x45\x7d\x6c\x7f\xc8\x48\x04\x2d\x00\x7a\xe4\xaf\x72\xc8\xf8\x1d\xc8\x4e\x97\xa3\xe4\x46\x0e\x07\xc6\x5f\xaf\x1a\x00\x51\xb6\x6f\x01\x12\xa8\xdf\x44\x38\xfa\x40\x1d\x68\xb1\xd8\x02\xb5\x80\x3e\xf3\x73\xde\x03\x15\xc1\xc1\xb2\xdb\x5a\x22\x30\xdb\x22\x53\xe6\x87\x31\x64\xad\x12\x0a\x50\x87\x23\x43\x17\x0e\xf0\x6f\xbb\x5d\x5e\x40\xaa\xc0\x4a\x6c\x21\x37\x2d\x2f\x58\x2a\xad\xbd\xe6\x95\xdc\xe8\x86\xbd\x59\x77\xfd\xae\xdb\xf8\x2d\x76\xe6\x2a\x67\x2a\x47\x43\x3f\x87\xdd\x04\x23\x24\xdc\xfe\xc8\xe6\xd2\xfa\x50\xfe\x07\x74\x36\xf2\x81\xf9\x1e\x15\xb7\x46\x00\xcf\x2c\x4b\xc6\x97\x2a\x4f\x2b\x60\x17\x03\x76\x60\xf4\x9c\x03\x82\xb4\xde\x55\x3f\x65\xfc\xfa\x84\xc1\xbc\xe2\x61\x07\x53\x23\x05\xde\x00\xe3\x59\xa0\xb8\x00\x60\x41\xe0\xed\x04\x4d\xae\xef\xd3\x56\xd1\xc9\x10\x38\x1a\x0d\x10\x93\xed\x83\xcc\x92\xaa\x28\xee\xd3\x7b\xcd\x69\xf1\xdb\xa1\x03\xa8\xaa\x14\xbc\x61\x8f\x1f\x32\x1a\xc8\x7a\x40\x30\x5c\x27\xc9\x5e\xd5\x9c\x56\xf9\xda\x57\x86\xc9\xbd\xe6\x01\x6d\x7a\xc1\x83\xba\xe7\xcc\xfb\x1d\x26\xb7\xe8\x8d\x21\x03\xc6\x60\xcb\x0e\x62\x75\xc1\xe7\x71\x2f\x42\x6d\xe6\x79\xfc\x3c\x82\x3b\x02\x78\x33\xe3\x97\xe8\xee\x46\x2b\x51\x18\xd6\x89\x9a\x39\x13\x19\x03\xfa\xda\xa3\x09\xb0\x98\x95\x8e\xfc\xeb\x1e\x03\xb1\x2d\x05\x47\xaa\x96\x72\xbf\x47\xb8\xd3\x38\x09\x00\x6b\x03\x6e\xf2\x3b\xca\xa4\x32\x12\x02\x06\xb5\xae\xd2\xb5\x84\x34\x87\xf2\x9e\x0a\x38\xe3\x80\xa3\xd1\x18\xc7\x48\x92\x67\x6a\x27\x93\x0a\xd9\x36\x42\xf0\xe2\x07\xcd\x9a\xe8\x80\x51\x03\xe1\xc4\x14\x70\xc2\x78\x7a\xc0\xc4\x69\x91\x69\x61\xcd\x8e\x38\x20\xc3\x6a\x01\xa7\x36\x63\x6b\xdd\xc8\x00\x6d\xc8\x4a\x63\xb6\x58\x64\xcb\x35\x8a\x1c\xcc\xf4\x89\xa8\xc7\x48\x65\x81\xf6\x32\xd5\x60\xdb\x2a\x2a\x47\xec\xd8\x84\x0c\xb7\x71\x54\xac\x99\x6d\xad\xe1\x69\xf7\x32\x59\x86\x07\x2f\x50\x61\xaf\x89\x96\xb1\x3a\x1c\x69\x07\xdf\x89\x90\xd7\x00\x94\x6b\x0c\x03\x3b\xdb\x4f\x94\xb5\xc2\x9a\x59\x7d\xa6\x51\xeb\xf1\xa7\x47\x15\x9e\x98\x72\xd3\xa8\x0f\x33\x77\xee\xc3\x8b\x62\x26\xdc\x4d\xa0\x19\xdd\xa3\x44\x73\xe9\xb9\x48\xc9\x1e\x43\x28\xca\xc6\x32\xc0\x9c\xb7\x8b\x61\x4b\x9f\xf2\x2d\xb7\xc6\xbf\xb5\xcc\xb6\xf7\xd5\x41\x91\xfc\x3a\xf6\xc3\x9e\x9e\xec\x25\xa7\x4e\x10\x15\xc5\x74\xa3\xed\x12\xb3\x5a\x1b\x45\xc5\x16\xe4\xed\x5b\x12\xa7\xdb\xa2\xc4\xfe\x2b\x31\x5b\x17\x71\xfc\xa9\xf8\x13\xaa\x7b\x0d\x8a\x3f\xd7\x27\x2b\xdc\x23\xc4\xa3\xdd\xbc\x08\x1a\xfb\xc0\xc9\x46\x73\x86\x1a\xbe\x93\x17\xf7\x96\xa7\xcf\x4b\x5e\x56\xe8\x63\x9e\x89\x9b\x2a\x75\x35\x90\x56\xa9\x06\x17\xbe\xf3\x24\xea\xae\x82\x0d\x0f\xcd\x58\xf2\xb4\x5a\xaa\x5c\x4b\x34\x81\x38\x00\xc0\x6d\xd9\x20\x1a\x0b\x17\x83\xd4\x70\x85\x9d\x8b\xd8\xdf\xaa\x15\xa5\x6e\x15\x90\xae\x07\x86\x95\xe9\x6d\xa8\x9e\xbf\x05\xab\xc9\xef\xdd\xe1\x6e\xdd\x9f\x8c\xfe\xce\x3a\xc1\x02\xbf\x95\x5f\x8b\x67\xfc\x23\x14\x8e\x14\x7b\xc6\x11\xe5\x02\x41\x69\xfd\xfb\xcd\x5c\x48\x75\x84\x01\xcf\xe1\x70\xc0\x77\xf1\x82\xf8\x69\x6a\xbf\xb7\x49\x8a\xbe\x6b\x47\xb5\xda\x47\xc3\xb6\x4a\xf0\x5d\x91\x83\x86\x4f\x5e\x28\xb7\x0f\xdc\xcc\x12\x08\x60\xdb\x30\x9c\x6d\x98\xee\xc9\xf3\x43\x9b\xd0\x77\xfd\xe4\x6b\xbd\x62\x32\xd3\x56\xb9\xfa\x02\x38\xd2\x40\xd1\x67\xdc\xd7\x20\x34\x21\x28\xcc\x64\x69\xa8\x97\x6a\x11\xbf\x86\x4d\x19\xe0\x50\x78\x58\xb5\x49\xe0\x18\x6e\x17\x39\x40\xd5\x5f\x96\x3c\xd9\x90\x3a\xd1\x66\x6f\x92\xd1\x60\xee\xfe\xc6\x89\x7a\x15\x5b\x55\xaf\x56\x8a\x6a\xc4\x12\x24\x78\x4e\xc4\x9d\x7d\xae\x5e\x92\x7d\xb8\x98\x91\x1d\x3b\xa8\x8c\x6e\x00\x9b\x6c\x10\x93\xc9\x5a\x0f\x10\x8f\x6b\x15\xb1\x2d\x28\xc9\x01\xfc\xb0\x01\x48\x7e\x1c\xe8\xb0\x1d\xd4\xa9\x41\x71\xc1\xb2\xf1\xc6\xf0\xa6\x59\x52\x3b\xc8\x2d\x18\xbe\xe6\xa2\xf4\xcc\xf0\x76\x54\x64\x67\x3a\xf1\xf4\x8e\xef\x31\xe1\x55\x66\x28\x1a\x00\xd7\xe2\x00\xea\xab\x63\xf7\x8e\xbd\x26\x54\xee\x99\x87\x95\x29\x27\x6f\x05\x7f\xf1\x5a\xc3\x0b\xa8\x3d\x64\xe3\xe6\x3b\x00\x89\x35\xcb\x17\xb3\x09\x99\x8b\x2e\x73\x29\x40\xee\x08\xea\x63\x3c\x1f\x64\xd9\x02\xb0\x13\xf4\xd3\x78\x00\x0e\x80\x50\xc0\x5a\x41\x88\xc5\xf2\x66\xc0\xdd\x78\x64\x5d\x77\x61\x70\x11\x22\x2c\x0d\x72\xb1\x86\xb4\x24\x66\x77\x53\xd3\x0d\x06\xcb\x2a\x47\x3e\x94\x15\x66\x7e\x62\xad\xba\x2c\xed\x71\xb4\xd5\x16\xdf\x5c\xe5\xd0\xf5\x2e\x45\x2d\xd1\x0b\x01\x2e\x0c\x50\x62\x2d\x20\x40\xee\x74\xc9\xdd\xa6\xe0\x4a\x28\xd6\xa1\xd2\xc9\x4e\xc4\x3a\x17\xd3\x3f\x8d\xc6\xe3\xfe\xe5\x98\xfe\x03\xff\xe1\x21\xd1\x74\x2e\xe8\xa3\xcb\x71\x87\xd9\xd4\x92\x6c\x0d\xe9\x4f\xe9\xde\x02\x88\x63\xe3\xa6\x26\xd4\x01\x0e\xee\xfd\xde\x1c\x3b\xc0\x8d\x2c\x37\xe1\xa4\xe0\x09\x54\xe9\x54\x53\xa7\x73\xb9\x96\x41\x45\x26\x6c\x71\x4f\x45\xbc\x6e\xd4\x96\x3a\x1d\xda\x56\xd8\x1c\xd6\x21\x0f\xe2\x54\xe9\x97\x1f\x04\x9b\x3a\x3e\x97\x98\x01\x46\x17\xd6\xbd\xf1\xa4\xa8\x99\xd8\xe8\x6b\x77\xa6\x89\xfb\xfc\x4d\xe4\x3e\xc7\x2c\x02\xe6\xd1\xc0\x2c\xf5\x2f\xc4\x16\xfd\xde\xcb\x3a\x71\x7e\xfd\xa6\xe8\x12\x7b\x90\x81\x28\x1c\xce\xd8\xf4\xdc\x16\xee\xeb\x2f\x07\xd3\x4f\xc3\xd9\xf0\x8c\x0d\xa6\x67\x43\x36\x9a\x3b\xd8\x40\x84\x0c\xf4\xe1\xed\xdb\xc1\x03\xef\x47\x03\x18\x8e\x16\x1f\x87\x33\x36\xfc\xe3\xe5\x6c\x38\x07\xe4\xc5\x99\x81\x3c\x0c\xe0\x11\x4d\x2b\x00\x8f\x48\xd0\x8e\x1e\x24\xe2\xe2\x63\x1f\x70\x91\x1b\xdd\x3d\x9f\x0d\x01\x2b\xf2\x6c\x78\x3e\x1c\x2c\xe6\x91\x87\x9c\x38\x1e\x46\xec\x7c\xb4\x38\x88\x97\xa8\xbb\x32\x99\x4e\x4e\x46\x93\xf3\xd9\x68\xf2\x61\x34\xf9\x80\x08\x8a\xc3\xc9\x62\x34\x1b\xb2\xd9\x68\xfe\x07\xd6\x07\xa0\x43\xfd\xe9\xff\x5c\xf5\x2d\x12\xe3\xe5\x70\x76\x3e\x9d\x5d\xf4\x27\x83\xa1\x41\x92\xac\xf7\x0b\x28\x9a\xae\xa7\x57\x31\x9b\x7f\x9c\x5e\x8d\xcf\x60\x4a\x82\x87\xf4\x44\x0f\xa9\xdf\xa3\x4f\x43\x36\x9a\xc0\x33\xb3\xe1\xfc\x12\xe0\x35\xaf\xa7\x57\xec\x78\x32\xc5\x61\x8f\x26\x23\x44\xd3\x1c\x7e\x1a\x8e\xa7\x97\x7a\x19\x67\xf0\xf8\x14\xa6\x77\x30\x9d\x2c\x66\xa3\xf7\x57\x8b\xe9\xac\xcb\xfa\xf3\xf9\xd5\xc5\x90\x7a\x35\x5f\x98\xf5\x98\x0c\x07\xc3\xf9\xbc\x3f\xbb\x66\xf3\xe1\xec\xd3\x68\x00\xd3\x3e\x1b\x5e\xf6\x47\x33\x44\xed\x9c\xcd\x90\xf4\x2c\xc6\x45\x6f\xdf\x32\x80\xee\xb9\x18\x2d\xae\x16\xc3\xb9\xde\x0c\x7a\x51\x11\xe8\x53\x4f\x70\x9d\x10\x21\x66\x93\xa9\x41\xf3\x6c\x4c\xc0\x68\xce\xfa\x57\x8b\x8f\xd3\xd9\xe8\x4f\x01\x4a\xe5\xf0\x8f\x83\xe1\xe5\xc2\xdf\x7f\xae\x2b\x96\x43\x87\xe8\x1c\x64\x9e\x91\x3c\xff\x01\x6b\x12\x5a\x18\x52\x6a\xc1\x46\x9b\x05\x43\x94\x1e\x96\xb1\x22\x64\xb2\x20\x07\xd1\x9a\xe8\x0f\x02\x55\x1a\x64\x0b\x56\x4f\x22\xf1\x97\x79\xa8\x2a\xe8\x42\x5d\x16\xe0\xab\x27\x8e\xa2\xe7\xcf\xd8\x4a\x5f\xdd\xf9\xda\x81\xbf\x70\x4c\x59\x46\x09\x82\x8f\x23\x82\x83\xcb\xbc\x55\x6d\x2e\x12\x2f\xec\x83\x11\xd7\xd4\x22\xcc\x92\xcc\x50\x55\x71\x2b\x6f\x5d\xb6\x51\x90\x47\xed\x5b\xf5\x97\xae\x94\x9f\xca\xf6\xd0\xc2\x03\x46\x51\xf4\xf9\xfb\xe9\x22\x32\xa3\xf4\x48\xc3\x9d\x65\x6e\xe9\x03\x2f\x08\xbb\x13\xdb\x75\x3a\xb5\xfe\x04\x4c\x22\x29\x85\x8f\x0d\xb3\xdc\x13\x61\x29\x3a\xc7\x28\xe8\xe5\x27\x1e\x52\xd8\xf5\x18\x92\xa9\xc1\x87\xb6\x12\x49\xca\xcb\xbc\xd8\x6b\x13\xe9\x06\xb1\xfb\xd1\x57\xd8\xb5\x85\x63\xed\xae\x80\x30\xb3\xf5\xa0\x81\x1e\xd8\xe6\xd4\x20\x84\x71\x61\x8b\x68\xab\x05\xed\xd8\xc4\x38\x88\x6d\xc9\x1e\xf0\xaf\xb2\xce\x25\xa8\x79\x72\xc7\xb3\xb2\xd3\xd5\xf6\x8a\xb8\x31\x5e\xc6\xb0\x38\x05\xda\xf1\x9e\x7e\xd2\x9e\x0f\xdb\x9e\x2d\x61\xa7\xc9\x2f\x7c\x34\x18\xce\x5e\x3d\xf0\x81\xf0\xbb\xf7\x5a\xdd\xef\x6b\x4b\xb3\x12\x44\xe1\x49\xf1\x3e\x8d\x4f\xdb\x17\x3c\x62\xd5\x2e\xcf\xd8\x2b\xda\xf3\x74\xcb\xc1\xe5\x1b\xbc\xc0\x9e\xbb\x5d\x91\x83\x49\x4c\x48\x23\x55\x06\x94\x62\x72\x6d\x4e\x8f\x69\x09\x43\xcb\x10\xd9\xdd\xc1\xad\x48\x4d\xeb\x7e\x62\xda\xd6\x5b\x76\x2c\xbb\xe4\xc3\x91\x19\x80\x32\x93\xa3\x71\xc7\xf7\xc1\xdb\x39\xdb\x56\x04\xe3\x06\x8f\x83\x82\x69\xc3\xa8\xc2\xa4\xee\x1b\x53\xbf\x60\x3b\xae\x90\xf0\x81\x32\x0f\xab\x36\x7c\x33\x93\xea\x59\x9f\x4d\x2c\xe3\x92\x12\x0b\x75\x56\x05\xbf\x33\x1a\x9c\xdd\xf6\xb8\xa7\xeb\x1e\x82\x03\xa9\xab\x76\x0f\xd6\x5f\x04\x27\xab\x36\x6d\x76\xa2\x10\xa9\xa3\x31\x44\x60\xb9\xe0\x7b\x3c\x35\x1e\xe9\xb2\xc1\x4c\x0c\x27\x6a\x85\xab\xeb\xcd\x2e\x79\x85\x0c\x8b\x0e\x39\x60\x1a\x43\x23\xed\xd7\x4c\x40\x16\x1d\x48\x04\xf9\xe6\x4d\x78\x88\x80\xc8\xf0\xbe\x7e\xdd\xc9\x22\x28\x24\xc1\x89\x31\xbb\x67\x27\x0a\x99\xaf\x3c\x44\x38\x84\x8d\x09\x8a\x06\xc0\xfc\xa1\x0c\xe3\x88\x6d\x78\xb1\xc2\x7f\xd9\x82\x93\xc8\xb7\x6e\x1e\x77\x84\x0f\x65\x3c\x3d\x74\x86\x6b\x33\x46\x53\xd4\x76\x84\x9b\xd3\x66\x50\xb6\x4e\xe3\x53\x93\xf0\x5e\x88\xdb\xfc\x8b\x58\x79\x89\xef\xdc\xda\xd1\x90\xef\x85\x12\x0e\x73\xde\xa9\x6a\x6b\x15\x31\x95\xa7\x2b\x9f\x94\x64\x05\x93\xb1\xe1\x2b\x7a\xea\x9e\x14\x68\x7f\xbb\xda\x3b\xe1\xb9\xbd\x13\x88\xad\xfa\x3e\xc9\x6f\x76\x7f\x70\xa0\x7d\x91\xfa\x0b\x48\x51\x0a\xc7\x60\xdd\x81\xd9\xd0\x85\x50\x79\x7a\x2b\x56\x2e\xd4\xbd\x74\x38\x6d\x50\x35\x52\x96\x98\x80\xd1\x25\xc0\x15\x3a\xd3\x74\xf1\xd1\xa6\x6c\x1b\xa9\x3b\x3f\xb4\xf6\xe8\x08\xb5\xa7\xf7\x96\xa7\x95\xa8\x59\x3f\xf7\x4b\xf4\x83\x09\x55\x74\x4f\x2f\x05\x24\xeb\x64\x08\x35\xc9\x93\x24\xaf\xa0\x53\x6c\x25\xf0\x50\xd9\xf4\xdf\x2d\x7c\x93\x17\xae\x13\x38\x4f\x7b\x43\x32\x9a\x86\x66\xf8\x0f\x98\xb4\x86\xc7\xf1\x96\x3c\x62\xbe\xe2\x50\xeb\xda\x0f\xd8\xb5\x1f\xf4\xe1\x26\x88\xa1\x34\x05\x02\x67\xc8\x15\xb0\x75\x49\x06\x6b\x5f\x05\xba\x80\xd9\x93\x79\xa1\x08\x1a\x49\x89\x34\x15\x85\x45\x8c\x75\x31\xc2\x5b\x9e\xca\x95\xa7\x3f\x51\x1c\x81\x4c\x60\xaf\x25\x4f\x69\x74\xeb\xe8\x0d\x20\x54\xbc\xbc\x6f\x0c\x0b\x9c\x33\x6b\xb4\x2a\x3c\x1e\x11\xae\xbb\xfe\x16\xf5\xdc\xc9\x94\x0d\x46\xb3\xc1\xd5\xc5\x7c\xa1\xcd\x8a\x39\xd8\x19\xf6\x2b\x74\x8f\x2e\x3e\x0e\xa7\xb3\xeb\x88\x7d\xfe\x38\x04\xad\x7f\x31\x9d\x2d\xd8\xb1\xc3\xd5\x9f\x0c\x3f\x8c\x47\x1f\x86\x93\xc1\xb0\x1b\xa1\x49\xd0\xd7\x86\xc4\x74\x86\x56\xc2\xe7\xd1\x7c\x18\x11\x0b\xc0\xf5\xf4\x2a\x6a\x37\x2c\xa2\x76\xb3\x22\x32\x06\xc7\xd9\x68\x6e\x3e\x03\x90\x78\x4f\xa3\xb7\xcf\xcc\xaf\x2e\xb5\x85\x37\x33\x6a\xbf\x81\xd6\x07\x1b\x6c\x38\x8f\x5a\x78\x06\x86\xb3\xf9\x74\x82\xa6\xda\xe4\xfa\xa7\x92\x0c\x58\x33\xe3\x63\x5f\x0f\x7d\x38\x7b\xc8\xc2\x34\xbf\xd3\xef\x1d\x4f\xe7\xd0\xc0\x87\xe9\xf4\xec\xf3\x68\x3c\x8e\x80\x55\x97\xcd\x17\xd3\xcb\xcb\xfe\x87\xa1\x9e\xd1\x8b\xcb\x2b\xdd\xe8\x79\x7f\x34\xbe\x9a\x81\xfd\x78\xd1\x1f\x9f\x5f\x4d\x06\xd8\x1a\x75\x5e\xaf\x9c\x9e\x63\x33\x87\x17\xda\x24\x0d\x7a\x89\x2f\x03\x6c\x7c\x62\x2f\xb0\xd3\x73\x4d\x0b\xf4\xb1\xff\x69\x88\x94\x05\xa3\x89\xb6\x35\x1f\xc3\x59\x30\x8f\x8d\xf1\xd5\xba\xd9\xa8\x65\x6d\x52\xf6\x2f\x2f\xc7\xd7\x7a\xee\xdd\x97\xc0\xf1\x30\xec\x2f\x3e\xea\xee\xe1\x72\xf4\xc7\x6c\x34\xf9\xf1\x6a\x06\x46\xe9\xd5\x78\xa1\xf7\xd8\xf9\x6c\x7a\xe1\xf5\xf6\xc9\xdc\xdb\x75\xc6\x54\x1e\xfe\x71\x31\x9c\xe0\x4b\x46\x03\x58\xe5\x71\xff\xb3\xb6\x77\x01\x8f\x71\x8e\x3f\x77\x9d\x8c\xd9\x7c\x7a\x31\x64\x3f\x5e\xcd\x46\xf3\xb3\x11\xf1\x6e\x9f\x4d\xb1\xa3\xe3\xf1\xf4\x33\x35\x3a\x18\x5f\xcd\x61\x4c\xb3\xda\x08\xdd\xd6\xb8\x87\x7e\x62\x3e\xc5\xc9\x71\xed\xe8\x75\xf2\x1a\xba\xe8\x5f\x87\x73\xa3\xad\x77\xc3\xfc\x77\x15\xcf\x63\x72\xd2\x21\x0b\x23\x09\x23\x65\x28\xff\x1a\xb9\x00\xac\x93\xb8\xea\x30\x59\x8a\x6d\xd4\x41\xc0\x24\x8e\xba\x2f\x33\x90\x03\xe8\xf8\x79\xf1\x03\x1b\xc4\xe7\xf1\x2c\xd6\x82\xf9\x59\x8f\x1d\x4f\x93\x32\x66\xbd\x37\x6f\x5e\x76\xa3\x1a\xb5\xb8\xdf\x70\x03\xde\xa5\x03\x32\xef\xde\x47\xc2\x30\x3e\x76\xcb\x8b\x2e\xf2\x82\xc0\xfc\x82\x5e\xf5\x4e\xe3\xd3\xde\x29\x3b\x9e\x8b\x9d\xe9\x17\x54\xd6\xea\x7e\x19\x36\xde\xe6\xe3\xba\x2f\xde\xc8\x4e\x5f\xc7\xaf\x4f\x9f\x9d\x9e\xf4\x58\xb9\x29\xf2\xea\x66\xe3\x3e\x7a\xc1\x8e\x7f\xac\x32\x61\x46\xac\xc5\x29\xcc\xf9\x07\x37\xe7\xc3\x6c\xc5\xae\x80\xbb\x99\x90\x5a\xda\x42\x97\x99\xd6\x01\x21\x0d\xb4\x11\xd5\xf6\xe0\x8e\x7a\xbd\x98\x5d\x48\x95\x88\x34\xe5\x99\xc8\x2b\xd5\x88\xa8\x04\x19\x8b\xc8\x20\x8d\x3c\xf2\x96\xe0\x85\x88\x0f\x7d\x20\xd7\x2d\xa4\x60\x33\x82\x15\x03\x2a\xd3\x6c\xef\x10\xf3\x5a\x60\x31\xd8\x46\xa4\xc6\x93\x57\x65\x22\x5b\xe7\x45\x22\xb0\x8a\x02\xb9\x29\xed\x6f\xed\x25\x5d\x08\xe0\xeb\xa1\x6a\xa9\x30\x9a\x15\x64\x7f\x1a\xd7\xa9\xd7\x6a\xcd\x43\x62\xdb\xf4\xdd\xcf\x8e\x55\x87\xa5\xfc\xce\xc7\xfb\x3b\x6e\xc5\x52\xf6\x3c\xf4\x29\xbf\x8b\xb4\xe1\xc6\xb3\xbd\x4d\x93\x50\xce\x99\xdb\x85\xbc\x4f\xba\xa7\x25\x26\x4d\xae\x53\x99\x94\x27\xf9\xfa\x24\x7c\x57\xcc\x3e\xd7\x4c\x21\x8b\xf9\x6a\x13\x4d\x6c\x8d\x49\x9e\x99\xdc\x6c\x38\x78\x89\x2c\xe5\x3f\x44\x06\x48\x25\x70\x95\x1b\xf4\x90\x64\xc3\x8b\x12\x36\x0c\xc6\xf7\xf4\xd6\x35\x90\xd9\x39\x5b\x56\x4a\x66\x60\x79\xa2\xa6\x72\x95\x41\x54\x70\x5e\x22\x5a\xdf\x9a\xf5\xb7\xa2\x90\x09\x8f\x28\xc2\x6f\xed\x9b\x43\x20\xb4\x6e\x7a\x6b\x20\xb2\x7f\xab\x0a\xa9\x56\x32\xf1\x8d\x92\x73\xb1\x82\x34\x9a\x41\x5e\x15\x8e\x51\x61\xa2\x37\xae\x28\x32\xca\xb7\xc2\x90\x93\x5b\x20\xaa\x94\xbe\x15\x59\x25\x18\x82\xb6\xc8\x8c\xcd\x79\x56\x72\x36\x48\x79\xc1\x75\x73\x90\xeb\xd5\xf8\x0d\xa8\x8d\x39\x00\x37\xe0\xd4\xd5\x4b\x65\x92\x5c\x85\x8c\x0c\x6d\x50\x48\x89\xee\x2d\x3e\x4a\xba\x96\x55\x50\x79\x59\xe6\x45\x26\xf6\xea\x09\x5b\x0b\x22\x21\x16\x5f\x77\xa0\xa7\x62\x8e\x12\xaf\x47\x38\xed\x9c\x4f\x6c\x40\x30\xd3\xea\x22\x3c\x90\x59\x0c\x79\x65\xa3\xfc\xa3\x8c\x30\x4a\xa1\x16\x6d\xce\x31\x31\xf6\x43\x9e\xaf\xa0\xfc\xc0\x11\xe4\xe2\xb6\x13\x2b\xac\x33\xd3\x5b\x2d\x8c\x9d\xe3\x86\xb2\x3b\xd6\xa5\xe6\x18\x3c\x5a\x28\x2c\xb7\x10\x2d\x76\x61\xb5\x60\x2e\x8b\x4a\x5b\x8d\x64\x93\x80\xdd\x54\xa0\xab\xc2\xb9\xf0\x3d\x56\x86\x5a\x94\xaa\x77\x1a\xb3\x99\x99\x7a\xcc\x4e\x80\xd9\xb7\xb5\x1a\x7d\x65\x49\x99\xdb\xb3\x50\x6a\x3e\x02\x03\x54\x60\x0f\x44\x63\x61\xb1\xa0\x15\xf2\x35\xf8\x96\x83\x99\x53\x48\xac\x74\x3f\x54\x84\xa3\xd7\x9d\x60\xbc\xaa\x52\xa6\xf2\x1f\x76\xd5\x0e\x32\xfc\xda\x6c\x48\x9b\x52\x83\x18\x7e\x7a\xf3\xb5\x0f\xc4\x1f\x44\x1b\x8c\x7d\x11\x4e\x13\x82\x07\x88\xbf\x57\x12\x53\x90\x00\x3b\x00\x6a\xac\x21\x7a\x4b\xee\x59\x89\x55\x2a\x80\x91\x6d\x4b\x1e\x82\x18\x0a\xac\xa1\x2c\x91\x59\x73\xcf\xf8\xca\x10\x89\xe5\x6b\x97\xc7\x83\x6b\xf5\x3c\x66\x17\x55\x5a\xca\x5d\x2a\x4e\x2c\xe1\x40\x92\xaf\x00\xc6\xa1\x39\x28\xc8\x63\x13\x4a\xde\xa0\x9b\xcb\x2b\x5f\x6f\x38\x75\xb9\x62\x1d\xdb\x34\xcd\xe0\xaa\x13\xb7\x7d\x68\x91\xc1\x68\x8f\x36\xdf\x6b\x48\x35\xf6\x98\xa3\x82\x2b\xf6\x40\x07\x70\x01\xaf\x43\x4e\x44\x08\x96\x39\x78\x56\x8f\xcc\xd1\x9a\x9c\x4e\xde\x3b\x0f\xca\xc1\x54\x27\x92\xac\xcd\x34\x0f\x2f\xcd\xda\x45\xc0\x4e\x0e\x04\xea\xe2\xa3\x6f\xc3\xec\x7e\x04\x2d\xcd\xbf\x1d\x64\xf7\xc5\xef\x18\xb2\xfb\xb1\x08\xd5\xdf\x86\xcf\x7d\xb8\x9d\x36\x50\xee\xf6\x67\x5b\x20\xba\xf1\x8b\xa3\x43\x8d\x7f\xc7\xe4\xfe\xcd\x62\x72\x5f\xfc\x8e\x31\xb9\x2f\x0e\x63\x72\x4f\xa6\x8b\xe1\x5b\xd0\xdf\xa0\xd6\xd2\xb4\xe3\xc4\xb6\x47\x20\xaf\x80\xb0\xc8\x50\xe5\x94\xc1\x6f\x1c\x65\x76\x4b\x8a\x32\x60\x4c\xb6\x1e\x65\x94\xac\x6a\x03\xf5\x42\x96\x61\xa9\xbd\x27\x05\x0f\x59\x56\xb0\x38\x34\xaf\xb2\x03\xc4\x46\x35\xb0\x00\xbc\x0d\x6b\x00\xac\xff\x6a\x4a\xb7\x6f\xfa\x8b\x9f\xfe\x49\xac\x7e\x41\xee\xbf\xff\xeb\x61\xfe\xdf\x67\x2f\x9e\x9d\xd6\xf9\xff\x5e\xbc\x78\xf5\x9d\xff\xef\xd7\xf8\x3b\x4e\xba\xec\x47\xb9\x65\x67\xfc\x16\x80\x35\x7f\xe4\x59\xc5\x8b\x3d\x38\x59\x8e\x6c\x86\xb8\x56\x4c\xda\xe8\x71\x41\x34\xac\x0b\x21\xd2\x3d\xda\x4d\x7f\xaf\x10\x6d\xd9\xc2\x84\x72\x89\xc4\x73\xa6\x78\x6f\x9d\x17\x77\xbc\x58\xa1\x5e\xfd\xa3\xdc\xc6\xf8\xe2\xff\x4e\xf2\x6d\xca\x97\x71\xfe\x35\xe6\x49\x5c\x7d\xb1\x14\xe4\xe0\xa1\x70\x68\x02\xca\x5a\x48\xfa\xd5\x11\xdb\x11\x6d\x11\xc9\xbb\x30\xb9\x1c\xb3\xe3\x7d\xad\x02\x52\xb2\xfe\xcf\x3f\xc4\xea\x24\x51\xbb\x58\x95\xfb\x27\xbf\xb1\xe3\xfa\xb3\xff\xc5\x4f\x07\x83\x93\xf7\xd7\x27\xf3\xfe\x49\x2f\x7e\xf6\xcb\x08\x82\xfb\xcf\xff\xf3\x67\xcf\x5f\x3d\xab\xf3\x7f\x3f\x3f\x7d\xf1\xfd\xfc\xff\x1a\x7f\x03\xa8\x6e\xbe\xc5\x44\x6b\xad\x1d\xf4\x4b\x9b\x23\x7f\x32\xdf\xf0\x42\xf4\x53\xf9\x45\xb0\x5e\xfc\x8c\x0d\x66\xc3\x3e\xe4\xa1\x0d\xa6\x17\x17\xd3\xc9\x9c\x0d\xa6\xb3\xcb\xe9\x0c\x7d\xe3\xa3\x39\xba\xc6\xc1\x91\x7f\x3e\x9a\x5d\x80\xf3\xfc\x6c\x3a\xc4\xcf\x0d\x11\x30\x86\xa9\x30\xbd\x6c\x38\x8f\x5d\xac\x88\x1c\xf5\x98\xcc\x35\xeb\x9f\x2f\x6c\x4a\xa1\x6d\x03\xde\x3f\x64\xfd\x09\xeb\x2f\x16\xd3\xd9\x64\x78\x7d\x32\x18\x8f\x86\x93\x05\x9b\x0d\xc7\x48\x15\xfc\x71\x74\x19\x37\xfb\x49\x2f\x9f\x63\xeb\x18\x2d\xa1\xd0\x80\x49\x57\x3c\xb1\xe9\x8a\x2d\xbf\xbf\xe8\xff\x01\xba\xe0\xa7\x1b\xce\x86\x1f\xfa\x33\x88\xa9\x61\x8c\xcc\xb5\x69\xd2\x23\x91\x34\xd9\x31\x3f\xd7\x02\x29\x14\xe9\xa9\xc5\x4d\x46\x8b\x39\xbb\x9a\x0f\xe3\x23\x52\xa7\x80\x63\x1a\xa2\x4c\xc7\xfd\x39\x3b\x1b\x9e\x8f\x26\xc3\x33\xf6\x7e\x38\x9e\x7e\xee\xb6\xe6\x62\x0e\xd9\x62\x38\xbb\x98\xdb\xb9\x6c\x4e\xc6\xd5\xfb\xf1\x68\x60\x67\xf7\xb8\x33\x18\x5c\x8e\x3b\x6c\x3a\x63\x1d\xfa\xac\xd3\xc5\x2c\x47\x78\x2d\xbe\x63\x31\x1c\x2c\xf4\x7b\xaf\xd9\x60\x7a\x79\x3d\x1b\x7d\xf8\xb8\xd0\xa3\x7b\x6a\x02\x87\xb5\x48\x4e\x0c\x96\xa3\xe5\xe8\xa6\xa6\xf0\xc9\xc5\x47\xbd\x80\x41\x62\x5f\x4b\x1e\x29\xbe\x16\xa2\x41\xc3\xb3\xf8\xe8\xfd\x35\x1b\xfe\x71\x38\x1b\x20\x0f\x38\x24\x41\xea\x3e\xd8\xd4\x4b\x68\x3f\xa0\xb3\xc6\xec\xc8\xfe\x00\x12\x05\x21\xde\xf6\x61\x36\x84\xf8\xd3\xfb\x21\x7b\x3f\xbd\x9a\xc0\x68\x9a\xf3\x65\xd3\x12\xf5\x57\xf8\x1f\xd3\x19\xfb\xa0\x97\x7d\x0e\x4d\xea\xcf\xe9\xe5\x83\xe9\x64\xd1\x87\x05\xd1\x6f\x64\xa3\x09\x44\x96\x46\x67\xc3\x99\x0d\x3c\x5d\x4f\xaf\x66\xd4\x0b\x93\x0b\x0a\xb1\x2d\x7c\xa9\xee\xd7\x60\x3a\x39\x1b\x11\xcf\x75\x83\xaa\xe6\xc8\x66\x7d\x75\x06\x39\xe0\xa8\x98\x24\xf5\x90\xf8\x82\x62\x01\x50\x42\x85\xe9\x2a\x32\xe1\x29\x82\x6a\x47\x8c\x67\xe5\x26\x4f\xf3\x9b\x3d\x92\x74\x24\xfb\x44\x1b\xc2\x2b\xc9\x3d\xf3\x4d\x5f\x8f\x50\x86\x25\x33\x70\xe2\x89\xac\x94\x85\x80\xf2\x34\x1f\x7e\x13\xa1\x3f\x79\x9a\x5b\xf4\x6f\x2a\x7e\x80\x12\x16\xaa\x0a\xcb\x5c\x99\x4d\xe4\x9c\x67\x10\x06\x31\x58\x82\x08\xbf\xb3\x12\x3b\x91\xad\x20\x38\x94\x17\x5f\x8c\x9e\x4f\x79\xcc\x11\x9a\x8a\x4a\x89\xed\x32\x45\xa8\xf9\x1c\xbc\x24\x76\x1e\xee\x36\x79\x2a\x62\xd6\x47\xbf\xa1\xe1\x4f\x20\x57\x1d\x96\xf0\x07\x73\x86\xe9\x9c\x50\xfc\x17\x70\x56\xf2\x7a\x05\x00\x3b\xe6\x2e\xf4\xb6\x14\x69\x7e\xd7\xb5\x6e\x8d\x06\x2a\x78\xad\xa2\x60\x19\xb3\x4e\xad\xb9\x1a\x49\xc9\x12\x71\xe7\x76\x84\x20\x06\x2f\xcc\x8b\xda\x07\xbe\xf5\x27\x4e\xc4\x57\x0a\xee\xc1\x3c\xf9\xab\x0d\x5c\x30\xa6\x0a\x69\x5b\x29\x58\x77\x2f\x49\x2b\x62\xab\x82\x6f\x79\x49\x0e\xd9\x88\xad\x31\xaa\xc0\x53\xfb\xc9\x36\x47\xcc\x11\x99\xf8\x88\x79\x11\x53\x60\x07\x15\x22\x81\xd2\xa4\x1b\xbd\x1e\xa5\x85\x86\xc5\x9f\xf2\x65\x21\x31\x9d\x12\x16\x7a\x25\x32\x45\x8d\x52\x86\x04\x0e\x01\x0a\xb7\x9b\x5b\x8d\x7c\x10\x85\x48\xb8\x2a\x23\xa2\xb5\x81\xc8\x15\xfe\x7e\xc5\x77\x90\x37\x64\x82\x4a\x08\x98\xf3\xb3\x2f\x76\x6d\x65\x0f\x2d\x6c\x62\x29\x5c\xf2\x87\x39\x70\xa0\x7f\x39\x56\x31\xd8\xf1\x3e\x12\xd3\x79\xe5\x13\x77\xf4\xab\x72\xf3\x88\xf7\xdd\x6d\x72\xeb\x9c\x32\xef\x33\xed\x89\x98\x75\xfc\x6d\x88\x4e\x21\x72\x51\x81\x13\x06\xa6\x34\x5f\x33\x0e\x2f\x23\x84\x29\x2c\x9c\x7d\x64\x9f\xd7\x86\x6b\xe0\x00\xbf\xc0\xfd\xbc\x02\xb5\x22\xc8\x4d\x0e\x65\x3f\x00\x52\x42\x2c\x27\xe9\x9e\xdd\xca\x3c\xb5\xe3\x7b\x5c\xf9\xa4\x99\x09\xd8\x4e\xa6\x59\x0b\xfc\x63\x9c\x99\xe0\x0c\x57\x61\xc1\xb3\x59\xe8\x00\x97\xea\x70\x97\x57\x42\xed\x64\x89\xd0\x66\x44\xcb\x82\xdd\x35\x09\x3e\xa7\x31\x3b\xe7\xb2\x00\x10\x58\x74\xf6\xb9\x38\x84\xa9\xa5\xf6\xa0\x5c\x6d\x40\x02\xca\xeb\x10\x89\x19\x1c\xa5\x91\x0f\xf8\xe8\x67\xfb\x51\x80\x06\x47\xb0\xd6\xaf\x02\xc8\x5f\xcc\xcb\x53\x10\xf7\x32\x58\xa6\x01\x41\x27\xe5\x5c\x59\xd4\x69\x03\x2b\xb2\x0e\xb7\x09\x16\xce\x5b\xd6\x04\xf3\x29\xc5\xc9\xb0\xdd\x30\xcc\xab\x0c\x7a\xa9\x99\xa3\x36\x60\x6d\x5b\xc3\x05\xf6\x62\x86\xa0\x91\x2d\x60\x08\x76\x39\x0e\x02\x6a\x3f\x88\xa7\x0d\xc8\xd5\x3b\x01\x40\x64\xc7\xe6\xc8\xaf\xaa\x30\xf1\xd3\x1b\x82\x1d\x64\xd7\x71\xc2\xb6\x63\x94\x49\x5f\x6c\x2b\x84\xb4\xa3\x6b\xe3\xad\xbb\xc0\x61\x25\x09\x56\xdb\xdb\x98\x50\x48\x6e\x69\x62\xfd\x6b\xb8\x86\xa1\x52\x13\x6f\x2a\x72\xe5\x97\xf5\x56\x75\x2f\x02\xee\x59\xea\x61\xbd\x89\x77\xee\xca\x72\xe0\x7e\xe4\x97\xa4\x26\xeb\xa5\x71\xef\x9c\x30\x0c\xe3\x6f\x84\xfe\x95\x17\x6c\xb7\xc9\xb3\x1c\x6f\x0d\xe4\x02\x21\xe8\x70\x2c\xfe\x4b\x52\x87\x21\xee\x7d\x02\x29\xc6\xb5\x4f\xd9\x72\x4f\xe2\x04\x62\xab\x2b\x79\x23\x4b\x7d\xb9\x55\x2b\x99\xe3\x65\x61\x8e\xad\x37\x6b\x16\x34\xa3\x39\x05\x87\x86\xbf\xfa\xb7\x1a\x4b\xeb\x8c\x43\x30\x1c\xdc\xc6\xb4\xe7\xe8\xea\x34\xdb\x71\x65\x40\xd8\x08\x89\x34\x43\x4d\x8d\x97\xca\x12\x88\x64\x39\x02\x9a\x65\x21\xa5\xd1\x0a\x8b\x65\xe3\xe6\x2b\x1c\xe0\x97\x5f\x7d\x89\x65\xf7\xc9\xa6\x56\x55\xc6\x31\x2b\xa8\x14\xc9\x26\xa3\x3c\xeb\x20\xd3\xe4\xc0\xb9\x41\xc1\xd1\xe8\x34\x06\x45\xe8\x31\x7d\x0d\xb8\x38\xbd\x97\x88\x69\x85\x82\x7e\x33\x09\x86\xc2\x46\x50\xb0\xa2\x7f\x46\xa2\x12\x33\x46\x16\x5e\x1d\x60\x13\xf3\x9b\x3d\xa7\x09\x08\x12\x03\x20\x33\xd9\x8b\x17\xda\x98\x95\x73\xc2\x3b\x2e\xed\xc2\x7b\x9d\x77\xf6\x9b\x90\x25\x91\xdb\x19\x0e\x59\xdf\x7c\x62\x21\xf6\x81\x84\xc6\x3e\x06\x5b\xc6\x7d\xed\x29\x8f\x8f\x00\x45\x7e\x08\xd5\x38\x32\xde\xfc\xab\x4c\x42\xeb\x33\x41\xac\x4b\x23\x43\xe7\x57\x20\x22\xd4\xfd\xf0\xc7\xc1\x99\x31\x62\x15\x7a\x19\xc2\x83\xfc\x0c\x13\xf0\x0d\x48\xca\xb6\x13\x0e\x3a\x39\xb8\x48\x0f\xab\x14\x2d\x58\xc9\x76\x2f\x87\xa4\x79\x8d\xea\xb1\xb0\x7f\x1e\x5d\x82\x55\xd0\xdc\x7a\x7c\x11\x62\xa7\x65\x3e\x4f\x20\x51\xdd\x46\x3e\xa0\xbf\x50\x2a\xd4\xc8\x1d\x22\xf1\x0f\xd7\x98\x54\x90\xb3\x81\x66\x18\xe1\x37\x49\xa1\xc2\x1e\xfc\x42\xbb\xcf\x22\x5b\xc0\xe1\xd7\x76\x26\xd8\x20\x5b\xc1\x55\x55\x98\x21\x18\x86\x25\x9e\x24\x14\x3f\xae\xdc\x04\x1a\xbb\x93\xb3\x2d\xcf\x32\xc8\x02\x48\x6a\x79\x83\x87\x17\xa8\x6f\xd2\xed\x7c\x11\xe6\xa1\x1d\xdc\x77\x29\x36\x8c\x86\x88\x2d\xab\xd2\xb0\x38\x12\xa0\x0e\x85\xdc\xda\x6e\x50\xc6\x01\x41\xde\x6a\x8d\x38\x90\x52\x89\x74\x6d\x6a\x6f\x6b\xd2\xe3\xb0\x22\x5d\x2b\x37\x6f\xe9\x1a\x18\x88\x7e\xb1\x94\x9e\x74\x2b\x04\xcd\x56\x8a\x1a\xf0\x15\x40\x9f\x83\x19\x83\x85\xd8\xea\xe9\xf1\x90\xfc\x6b\xe3\xd1\x0a\xa5\x00\x5c\x9e\xc4\xe1\x26\xdb\x77\xe4\x35\x5a\x35\x34\x4e\x80\x73\x43\xcf\x92\x50\xa5\xbe\x49\xea\x03\xa9\xdd\x68\xbf\xc8\x40\xea\x36\xdd\xcf\x31\x10\xa7\x1d\xfd\x32\xf2\xbb\x69\x89\xfe\x5b\x0b\x72\xc8\x19\xab\xf7\xf8\x5f\x2d\xd4\xeb\xda\xd2\xaf\x2a\xe0\x6b\x4b\xf1\xdb\x94\xe1\xf5\x15\xfd\x0d\x88\xf3\xc6\x61\xff\xe5\x25\x7b\xfd\x95\x3f\x51\xc8\x3b\xeb\xc9\x64\x6a\xfc\x42\x1a\x21\x7a\xdf\x1a\xa7\x03\x0a\x95\xeb\x76\xe4\xc1\x0d\xec\xec\x7c\xb3\x95\x8d\xdd\x6c\x5d\x94\x37\x50\xcd\xd4\x14\xa5\x5a\xfa\xaf\x64\xe9\xa7\xfb\x1a\x10\x29\xb1\x92\xd5\x16\xcc\x5a\xb0\x87\x0c\x3a\x1e\xe6\x20\x52\xb9\x28\x62\xe5\x06\xc8\xec\xc0\xef\xa3\x44\xb5\xca\xb3\xfd\x16\x52\x0a\xad\xad\xde\x6d\xe4\x81\x50\x27\xe4\x1a\x20\x2c\x53\x29\x56\xef\x70\x55\x64\x99\xd6\xf6\xa9\xff\x08\xd9\xc9\x90\xca\x04\x76\x5a\xe3\xea\xe2\x66\x60\x44\x72\x6d\xfb\xd8\xb2\xff\xdb\xf6\xcd\xb1\x88\x6f\xe2\x88\x75\xce\xf5\xc5\xb4\xf1\xbd\xb7\xc1\xaf\x97\xfb\xc6\xdd\x04\xb8\x2b\x9d\x79\x52\x08\x91\x81\x09\x8a\x6e\x64\x40\x59\xa4\x27\x0f\xfc\xb4\xd3\x25\x98\x2d\xea\x3a\xd9\x8e\x16\xfa\xd9\xc1\x3c\x7a\xab\x85\x47\xf7\x9d\x85\x32\x8c\xd8\xc6\x00\xb5\x82\x04\x78\x68\xaa\x5a\xb6\x1a\x70\xfe\x72\xb6\x95\x19\xa0\x88\x29\xaf\x4b\xe0\xab\x25\xb8\x18\x42\xfd\xb5\xce\x63\xe4\x78\xc5\x8c\x71\xe7\x9f\xa4\x1f\xe2\x6f\x14\xc5\x13\x9c\xc8\xb1\x99\xff\x5c\x79\x6c\x03\xa6\x8c\xe5\xe1\x86\x0d\xc6\x56\x0d\xbc\x3a\x62\x9f\xad\x60\x86\x77\x9e\x59\xa9\xed\xac\xbd\xf7\xfb\x90\x0c\xc5\x3a\x99\xf1\xe4\xde\x43\x73\xec\x39\xba\xbc\xea\x12\x80\xfa\xc4\xd7\x1a\x70\x6c\x3a\x4b\x4b\xa1\x20\xab\xc9\xfc\xea\x89\x6a\xa0\xc1\x7b\x4b\x2a\x33\x2d\xee\xf6\x1e\x9a\x80\x8c\x3d\xcf\x9a\x9e\x1c\x91\x54\xe0\x23\x77\xd6\xb7\xef\xdc\x0a\x2c\x7a\x87\x6f\x6d\xcc\x9a\x3a\x87\x8c\xb9\xdd\x30\xd9\x98\xb2\xe5\xef\xd6\x55\xfa\xe8\x0b\xd6\x56\x14\x10\xc6\x29\x38\x76\xb2\x00\x6a\x97\x2a\xf7\x61\xf7\x82\xf3\x0f\xd2\x58\xa0\xa2\x29\x55\x79\xe1\x8a\x6d\xd7\x42\x7f\x51\x08\x05\x3e\x69\x15\x06\x28\xa8\x32\xd5\xba\x84\xf4\xdc\x48\xbc\x81\x60\xe4\xf6\xca\x30\x15\xb8\xa1\x77\x34\x72\xfc\x7a\x46\x68\x4b\x4b\x73\x10\x19\x96\xd9\x94\xdf\x79\xa8\xcd\xee\xe5\xe4\x60\xc5\x52\x20\x9f\x23\x0b\x6a\x2c\x6c\xea\xf9\x4a\xac\xf9\x96\xa2\x2b\x32\xbb\xe5\x26\x49\x6f\xa7\xcf\x5d\xb2\x77\x7e\xd8\x12\xb2\x55\x2b\xbd\x76\x7f\xab\x70\xb1\x6a\x2d\x7b\xaa\x2d\x41\xa9\xf4\xe7\x06\x80\x67\x7c\xcd\xe6\x8b\xfe\x62\x78\xc6\x46\x93\x1a\xb6\x8f\x57\x25\x8a\xe1\x54\x78\xe6\xf3\x6c\x04\xf1\xeb\xe9\x8c\xcd\x86\xff\x73\x35\x9a\x61\xa0\x38\x8c\x08\x47\x41\x44\x99\x5a\x3c\x7b\x14\x5c\xd0\xc8\x55\x6d\xb6\x01\x06\x79\x70\x41\x0f\xd5\x72\xea\x26\x0e\x86\xf0\x07\xd3\xc9\x62\x38\x59\x40\x7b\xfd\xc1\xe0\x6a\xd6\x1f\x5c\xfb\xe1\x6b\x83\x68\x37\x76\xa4\x56\x79\xc6\xc6\x36\xfd\xdf\xcc\x64\x58\xe1\x78\xdf\x8c\xf4\x27\x67\xe6\x47\x7e\x46\x40\x7f\x86\x51\x6e\xc8\x07\x70\x49\x03\x8b\x29\xeb\xeb\xf5\x98\x9d\x51\x15\x68\x2d\x73\xe0\xfd\x6c\xd8\x1f\x7c\xb4\x3d\x76\xc3\x1c\x4d\xd8\x1c\x61\x7b\xd8\xcb\x48\xff\xd7\x64\x0a\x45\xa5\x0b\xf6\x79\x34\x1e\xbb\x18\x77\x50\x71\x7b\x3d\xbd\xc2\xc5\xb9\x0e\x2a\x8b\x6d\xf9\x6d\x6b\xd1\x6d\x50\x57\x19\xb1\xcb\xab\xc9\x08\x52\x0f\xa6\x7a\xb1\x86\x17\x97\xe3\xfe\xec\xba\x31\x4c\xbd\x48\xb5\xe0\xbb\xfe\x81\x1e\x44\x2d\x81\xc0\xd5\xc2\xda\x3e\x7f\xec\xcf\xb1\x04\xb6\x7f\xf6\x69\x34\x7f\x5c\x05\x2c\xe1\x5d\x35\xf1\x81\xf8\xcf\x8a\x0e\x04\x46\xae\x3e\x77\x04\xf4\x63\x2a\xc7\xef\x81\xff\x8c\xd9\xc8\x06\xcd\x94\x8d\x9a\x49\x20\x72\xc8\xb1\x28\xdd\x06\xaf\x1e\xa3\xda\xa1\xfa\xea\xf0\x31\xc2\xab\xc6\xde\xe7\x36\x50\x0a\x6f\x40\x74\x1f\x87\x2f\x64\x86\xb7\x72\xa8\xc6\x70\x87\xca\x03\x5d\x75\x50\x40\xeb\x2a\x4d\x5b\x4a\x20\xb4\x1d\x67\x9a\x8f\x5d\x49\x7f\x2f\x62\xa7\x91\xde\xa1\xaf\x22\xf6\x1a\x2d\xab\x1f\xb0\x6b\x8f\x45\x2b\x72\x42\xad\x16\x63\x42\x23\xa2\x2d\xd2\x14\x05\x17\x98\xbf\xc2\x4c\xaa\x9f\x1a\x30\xf2\xef\xcc\x6e\x93\xd2\xd1\xf6\x28\xb8\xed\xc1\x6d\x5d\x83\x3a\x34\x8a\x42\x2d\x80\xdc\x44\x4e\xa6\xdd\x54\x20\x16\x6c\xbe\xf3\xa0\x4e\x7d\x1d\xc4\x80\x27\xcb\xad\x68\x51\xec\x1c\xba\x32\x52\x7d\xa7\xe4\x15\xb7\xdb\x03\xba\x08\x65\x5a\x06\xa2\x26\x84\x3d\x0c\x2e\x35\xe7\xeb\xe4\xa5\x45\xb7\x34\xe4\xeb\x3e\xeb\xcf\x52\x44\x76\xe2\x1f\x70\x7d\x74\x29\xe6\x15\xfa\x2d\x60\x93\x11\xe0\xa5\xd9\x75\x50\xce\x8a\x05\x85\x88\x47\x45\x90\x41\xde\x6e\x76\x91\x3a\x07\xe7\xf2\x43\x4b\xcd\x2f\x0a\x06\x40\x05\x05\xa0\xd0\x1a\xca\xf5\x37\x18\x64\x4d\x7d\x38\x88\x34\x9b\x6c\x81\x3c\xf4\x47\x78\xd8\xe4\xbe\x37\xd3\xa7\x9f\x6b\x8d\xa1\x12\x6e\x66\x7d\x6f\x07\x80\x39\x07\x8e\xcf\x4f\x1c\x6c\x8b\xb9\xf4\xed\x83\x0b\x8d\x99\x5f\x6c\x94\xc9\xe3\x6a\xaf\xb5\x9e\x95\x4a\xa8\x0b\x0c\x6a\xaf\x0d\x38\x6b\xbd\xb0\xb9\xf4\x2b\x3a\x71\xe7\xe9\xee\x41\x23\xc4\x9e\x60\x5b\xb1\x2c\x87\x38\x23\x5a\x6a\xae\x5c\x75\xd2\x3d\xbe\x3f\xa3\x14\xaf\xab\x02\xe3\xee\x89\x81\x45\x2b\x3d\x94\x25\xe3\x6a\xb2\xe5\xe8\x8f\xa8\x17\x37\x26\x3a\x59\x68\x07\x4b\xc6\x6b\x0d\xe1\x1c\xc1\x69\xf3\x0a\xc9\x5d\x74\x75\x82\x50\x28\xb0\x7d\x0e\xce\x76\xbd\xee\xf2\x8e\xc3\x3d\x87\x65\x3a\xe6\x12\xd5\xea\xb0\x30\x2b\x4c\x67\x9a\x68\x3a\xe4\x2d\xba\xfc\xe8\x11\xd7\x9e\x07\x44\x05\xa4\x53\xf2\xc6\x43\x2a\x47\x45\x1b\xdd\x38\x48\x7e\x42\x80\xd1\xed\xad\x7a\x29\x35\x81\xaa\xe0\x67\x22\x81\xcb\x1a\xb2\xe7\x3c\x28\x00\x53\xa0\xeb\xaf\xd0\xa1\x6c\x15\x66\x0b\x47\xf5\x45\x04\x56\x48\x21\x08\x6c\xcb\x43\x82\x96\xd9\x8d\x8a\x7c\x88\x1b\xdf\x6a\x34\x54\xaf\x87\x5e\x01\xf2\xdc\x96\x63\xe2\x7b\xec\x61\x75\x7b\x78\x29\xd8\x12\xb2\xc0\x96\x7b\x2a\x7d\xb5\xbc\x9e\x5e\x45\x11\xc8\x78\x00\x0f\xb6\x80\xaf\x08\x10\xeb\x61\x37\x5b\x5d\xa4\x36\x73\xc6\xb1\x69\x71\x4a\x85\xdb\xe0\xb0\x17\x01\x5b\x0c\x56\xb0\x14\x99\x37\xa3\x41\xa1\x64\x5e\x18\x57\x6c\x7c\xd4\x48\x69\x36\xa8\xba\x6e\xb1\x9b\x67\x0a\x99\xca\xb2\xdc\x92\x9f\xb0\xbb\x0d\x2f\x55\x0e\x17\x23\x54\x72\x66\x99\xbd\x0f\xcb\x8d\x17\xc2\x6b\xbc\xce\xcf\x3b\x4b\xa5\x71\x7d\x79\xa8\x41\x64\xdc\xe1\x24\xa5\xe2\x86\xa7\xba\x39\x6d\xab\x1a\x72\x00\x53\x75\xed\xfa\xf0\x00\xbd\xae\xfe\xd1\x8d\xc8\x44\xc1\x53\x2a\xb3\xd5\xff\x90\x59\x02\x6e\x2a\x4c\xc1\x82\x2d\x0c\xe8\xcc\x92\xa7\xf5\xc2\xee\xda\x18\xcd\x1c\x19\x98\xa6\x56\x25\x66\x9d\x17\xe2\x26\x87\xff\xba\xcb\xd9\x31\x50\x45\x67\xa5\xc8\x12\xaa\xf9\x6d\xcc\x8c\x56\x03\x5c\x60\x5d\x9a\x70\xc4\xca\x78\x53\x49\x98\x07\xc9\x3e\xe4\x68\xb7\x92\x15\x74\x54\xcf\x3f\x01\x79\x92\x21\xd5\x89\xf9\x7d\x7c\x44\x78\xee\x6b\x8b\x38\x87\x61\x7b\x2f\xd1\x8f\xaa\xf7\x3c\xb2\x11\x72\xd2\xd8\xe2\x69\xf4\xe6\x29\x77\x28\x9d\x92\x32\x18\x5c\x8e\x23\x96\x51\x55\x1c\x2e\x2b\xac\xbe\xad\x3a\x33\x5e\x01\xd6\xa9\x4f\x86\x85\x51\x36\xe8\xe9\xee\xd9\xbc\x60\x69\x7e\x93\x03\x90\x43\x73\x73\xb9\xa3\x81\x38\x53\xe6\x64\x18\xb9\xd7\xf2\x2b\xac\xcd\x41\x37\x0c\xa8\x59\x46\x6f\x5a\xb6\x92\x92\xd4\x7f\xfe\x44\xbf\x2d\x3b\x01\x96\x8a\xac\xf4\x3a\x5a\x29\xa8\xea\xad\xe4\x4a\xa4\x32\x13\x48\xbe\x4f\xde\x45\x87\xf4\x9d\x63\x42\xf1\x9d\x58\x2a\x59\xba\x34\x34\xc2\x6e\x0e\x78\x09\xc1\x66\xa2\x00\x5c\x0b\x36\x7b\xf3\x68\xd3\xcb\x88\x27\x51\x5f\x17\xb6\x5e\x3a\xa1\x67\x13\x9a\x83\xbc\xb8\x79\xfa\x7b\xaf\xf6\x69\xfe\xc5\x4f\xc7\x32\xab\xbe\x9e\xa8\xbd\xd2\x66\xeb\x49\x96\x97\xe2\xe7\xae\x02\x7a\xa0\xfe\xaf\xd7\x7b\xf9\xaa\x56\xff\xf3\xe2\xc5\x8b\x97\xdf\xeb\x7f\x7e\x8d\xbf\xc9\x74\x31\xfc\xbf\xf1\x46\x76\xf6\x2b\x78\x3b\xff\x2b\xcb\xcb\xff\x62\x49\xae\x2f\x40\x00\xd5\x23\x4e\x4a\xba\xee\xb5\x0c\xf9\x22\x8a\x4c\xa4\x60\x17\x42\x74\x68\xa9\xaf\xf2\x62\xcb\x53\xa6\xf6\xaa\x14\x5b\xa6\xb7\x94\x62\x27\xc4\x19\xa9\xd8\x56\x14\x40\xe6\xe3\xb2\xb1\xe9\x79\x2f\x7a\x82\x8d\xe2\xad\xec\x75\x64\xad\x65\xbe\x13\xbd\x1b\xc1\x57\x06\xec\x8a\x08\x82\x21\x8b\xb9\x13\xb3\x7e\xaa\x7c\x60\x79\xfd\xf4\x87\xcb\x31\xe6\x63\x32\x7f\x9c\x4e\x0b\x3c\x2f\x84\x60\x16\x4b\xe1\x5c\x6b\x3c\xe4\x68\x5d\x92\xac\x95\x99\xbe\xfa\x10\xf3\x22\xb1\x24\xa1\x92\xe2\xba\xa0\x6d\x1f\xe3\xdd\x95\x55\x5f\x69\x0c\xdd\x96\xb7\x6d\xbd\xba\x6e\x74\xeb\xf0\x84\xc0\x53\xef\x8a\x1c\x88\xb3\xe3\xa3\x96\x11\x40\x66\x00\xea\xd9\x35\x5c\x7b\x3d\x36\xae\xd8\x9a\x17\xe6\xfe\xa4\x65\x81\x97\x03\x00\x95\xbe\x61\x15\xfb\xab\x5e\x85\xbf\xde\x43\x27\x61\x2b\xfd\xa5\x60\xb7\xa7\xc8\x92\x74\x0b\x20\xbe\x05\xbb\x7d\x1e\x7f\xc5\x24\x6a\x5e\x6a\x7d\xa4\x6b\x51\x78\xc5\xd7\x1d\xb8\xbb\xd3\xbd\x27\xd7\xd1\xb2\x8e\x8f\xf4\x74\x28\xb6\xc8\x8b\x5b\x9e\xae\xd4\x77\xe9\xfb\x6f\xf7\x17\x3f\xed\xef\x78\xb2\x11\x27\xbd\xb8\xf7\x4b\x95\x81\x3f\x20\xff\x5f\xbc\x7e\x5e\x97\xff\xa7\x2f\x4e\x9f\x7d\x97\xff\xbf\xc6\x1f\xae\xbe\xb5\xc6\x7a\x71\xef\xc8\x43\x2f\x49\xba\xec\xf4\xd9\xb3\x67\x10\x07\xa3\x27\x5b\xa4\x64\x90\xad\xeb\x12\x70\x67\x22\xe0\xd2\xe6\x88\x87\x08\x5c\xd8\x98\x8f\xa4\x3f\x59\x22\xe7\xd1\x3a\x2f\xb6\x8a\x70\xc7\x72\x17\xf6\xf3\x73\x8c\xb1\x1c\xcc\x29\xb1\x21\xc7\x5e\x98\x86\xeb\x3b\x88\x0a\xc1\xb6\x02\x21\xd4\x7b\x31\x0b\x3b\x05\xe6\x02\xf5\x06\xa4\x3a\x81\xd9\x23\xcf\x9f\xf5\x1c\xd7\xf3\x20\x22\x63\x1c\x61\xf4\xd5\x7f\x1b\x85\x0c\x5c\x57\x5c\x5a\x8f\xa9\x03\xa9\x77\x41\x66\xfe\x2c\x98\x2e\xf8\x39\xfd\x3f\x67\x2f\x8c\x73\x3a\x24\x6a\x24\xb0\x6c\x4a\xc7\xe6\xa5\x28\x24\x4f\x95\x9b\x63\x6b\xf3\xfa\x5d\x37\x05\x1e\x0b\x70\x78\xac\x4e\x40\x4b\xa8\xb3\xda\xfb\x24\x5c\xe8\xe8\xf2\x9b\x70\xd8\x50\x41\x32\x5b\xd8\x79\x9e\x98\xa0\xb6\x6e\x18\x56\xb2\x03\x1a\x0b\x55\xa2\x99\x9f\x29\x0f\xbf\x92\xc0\x7e\xec\x0d\x7f\x78\xf7\xb2\x63\x0f\x60\x89\xc3\x63\x60\x2b\x74\x59\xdc\x01\x74\x35\x42\xd4\x21\x3c\x1d\xa9\x6a\xfd\xa9\x39\x3e\xc0\x5d\x69\xde\x82\x76\x2d\x0d\x92\xf8\x3a\xb5\x3e\x85\x58\x9a\x1b\x59\xac\x4e\xd0\x6a\x0c\x9b\x54\xa4\x16\xa5\xa6\x61\x93\xcd\xbe\x30\xc9\x30\x1d\x1c\x0f\x41\x79\x1e\x1e\x5c\x07\xe7\x95\xbc\x11\x00\xf6\x53\xe6\x7a\xb1\xf2\x02\x53\xdf\x76\x45\xbe\xcd\x4b\x4b\xb8\xa7\x98\x51\xa6\x1c\xf5\x8e\x1d\x8d\x39\x95\xa1\xdd\xe9\xaa\xa7\x62\x76\xde\xfa\xb9\x85\x69\x20\x33\x8d\xe1\x2c\xff\xb7\x9b\x6c\x66\xd2\x2d\x2e\x1f\xd1\x0d\xcf\x63\xa4\xf5\x4b\xb1\x72\xb3\xf1\x67\xf1\x35\x66\x9d\x1f\xf9\x17\x5e\x94\x3c\xea\x98\x2f\x28\x77\x86\xa6\x89\x6c\xc7\xa8\xf3\x17\x3d\xcd\xd0\x5c\xd8\x80\x49\x39\x52\x7f\x09\xd7\x55\x22\x3b\x74\xf4\xe0\x44\x18\x85\xea\x9e\x4d\x17\x1f\x41\xc0\x73\x3e\x3d\x5f\x7c\xee\xcf\x42\x5a\x9d\x27\x4f\x20\x1e\xfe\xe4\x09\xd6\x2d\x4f\xae\x5b\xb9\x71\xbc\x10\x6f\x40\x93\xf3\xfe\x6a\x01\xd5\xf2\x10\xf8\x1e\x9e\xb1\xc5\x94\x60\x9c\x1b\x3f\x63\xd3\x73\x8f\x0b\x67\x64\xb9\x6b\xce\x47\x8b\xc9\x70\x3e\x3f\xcc\x8a\xa3\x3b\x6c\x09\x57\xce\xe2\x20\xa6\x8c\x08\xc2\xfa\x85\xfd\xcb\xfe\xe0\xe3\xd0\x0d\xf1\x7c\x7a\x35\x39\xa3\xc2\xe8\x19\x14\xba\x7b\xe0\xd1\x73\x2f\xfc\x7c\x6e\x71\xa4\x11\xe0\xd9\x41\x3d\xfb\xc1\x66\x1b\x81\xb6\xa1\xe5\x7b\x50\x9f\x8f\x1f\x98\xa0\xcb\xd9\x74\x70\x35\x1b\x5e\xe8\x11\x40\xbc\xf8\x3d\x31\xd8\x00\xd6\x33\xe4\x04\x18\xcc\x82\x77\x16\x06\xfa\x6a\x3e\x8c\xd8\x59\x7f\xd1\x87\x17\x5f\xce\xa6\xe7\xa3\xc5\xfc\x9d\xfe\xf7\xfb\xab\xf9\x08\xa6\x70\x34\x59\x0c\x67\xb3\xab\x4b\x3d\xea\x2e\xfb\x38\xfd\x3c\xfc\x34\x9c\xb1\x41\xff\x4a\xaf\xa5\x9e\x6b\x8a\xb1\x53\x74\xdd\xc7\x62\x76\x20\xde\x58\x57\x4e\x50\xdd\xf3\xc5\x6c\x34\x58\xf8\x8f\x4d\xef\x83\xf9\x0e\x92\x36\xba\x36\xe8\x4e\x4c\x42\x9f\xfb\xd7\x2e\xfe\xee\xc5\xdb\xbd\x9d\xe9\x82\xee\x8f\x0e\xb1\xc7\x47\x8b\xe0\xc0\x52\xf2\x27\x5c\xb6\xb7\x79\x5a\x65\x25\x2f\xf6\x61\x99\xb8\xc5\xff\xdf\xf2\x6c\x1f\x86\x96\xeb\x34\xdf\xf7\xe9\x21\xe7\xa6\x58\x4e\x66\x58\x49\x44\x59\x1a\xf7\xff\xce\xca\x27\x25\x04\x6b\xbf\x0c\x62\x76\x19\x40\x23\xfa\xc3\xd3\xff\xe7\x95\x74\x93\xff\x70\x95\x43\x18\xdc\x3e\x65\xe2\x5a\x60\xe8\x91\x2f\x1b\xd5\x96\x89\x41\x27\x1d\x88\xac\xc4\xdc\x6c\x36\xaf\x76\xa2\x40\x58\x66\x7d\x03\x7a\x4c\x8f\x2a\x62\x57\x99\x04\xcb\x0d\xa3\x47\xa3\x34\x95\x59\x2e\xf5\xe7\xc5\x92\x67\xfc\x64\xb0\xe1\xdb\x1d\x97\x37\xd9\x63\xbc\x5d\xf1\xd3\x3f\x5d\x8e\x7f\x49\xe5\xff\x61\xfd\xff\xe5\xcb\x26\xfe\xd3\xab\xd7\xdf\xf1\x5f\x7e\x95\xbf\x3f\xe5\x0d\x26\x3b\x76\xfc\xa7\xcb\x71\xd7\x07\xbf\xac\x99\x04\xf0\x1b\x8f\x89\xb3\x5d\xff\x47\xa7\x92\xf1\x29\x58\x7e\xcb\x44\x14\xe4\xf4\xe7\x8a\xe5\x3b\x61\xac\x81\xdf\x88\xbd\xe0\x7a\xf3\x73\xd8\x0b\xd1\xbf\x87\xc1\x70\x7f\x37\x7e\x01\x8b\x41\xef\x17\xbe\xba\xd5\x5b\x01\x82\x4f\xee\xf7\xe8\xf5\xf3\x5f\xb4\x45\x78\x67\xa8\x6d\x17\xc0\x39\x56\xd3\x0e\xfd\xe2\x83\x40\x4f\xd4\xf3\x62\xea\x75\x0f\x59\x14\xe2\xa7\x99\x14\xf5\x23\x00\x42\x9b\x76\xab\x7e\xd5\x9f\xd8\x14\x33\x90\x2e\x31\x0c\xa2\x5f\x3a\xcc\x6e\x65\x91\x23\x50\xbd\x6f\x73\xfc\x23\xdf\x89\x38\xc9\xb7\x4f\xbb\x68\x70\x04\x34\x28\x8e\xb6\x93\x3a\xb6\x14\x30\x00\x9a\x3c\x48\xdd\xa6\x9e\x02\xe6\x02\xe8\xd7\xd0\xbb\xe0\x30\x1d\xc3\x72\xb8\x0d\x81\x45\xac\x94\xe6\x40\x36\x5a\x97\x11\x8b\x8c\x54\x2c\x49\x79\x85\x19\x10\x18\x86\x37\x06\xc8\x44\xab\xc5\x8c\x2b\x95\x27\x12\xa2\x56\xd0\x2e\xbc\x2f\x2f\x9a\xb3\xf2\x2b\x1a\x1f\xf8\x9b\x86\x68\x22\xbb\xe2\xc2\x84\x96\x8b\xa6\xfd\xaf\x35\x0e\x38\x48\x5e\xc4\xb7\x7e\xae\x7f\x3e\x63\xf4\x97\xdd\x39\xb0\xfc\xc7\x85\x38\xe9\xb6\x0e\x33\x07\x2e\x6a\x9e\x62\x2f\x4c\x7a\x19\xa1\xe7\x99\x6a\x18\x9e\x41\xe2\x47\xa1\x55\x92\xda\x41\x31\x39\xb0\x21\x77\x93\x1e\xa3\xc8\x92\xbc\x2a\xf8\x8d\x1e\xa4\x16\xc4\xc4\x7e\xbd\xe3\xc9\x17\xf8\xd0\x00\xff\x68\x93\x56\xb1\x1d\x2f\x93\x0d\xe6\xa8\xb4\x76\x49\xc5\x04\x67\x6f\xfa\x0f\xc7\x80\xfa\x09\x3c\xaf\xe9\xde\x61\x09\x61\x4e\x05\xb6\x68\x0b\x76\x6c\x1e\x11\x60\x9b\x98\xfe\x98\xdf\xa6\x7c\x29\x52\xbc\x83\xaa\xcc\x76\x21\x98\xb3\xfa\x28\x89\x28\x96\xfa\xc0\x8b\x62\xef\x6a\x53\xa0\xef\x26\xf0\x69\x86\x4c\x59\x10\x84\x98\xa4\x18\x60\x26\xa1\x8b\x1e\xc9\x73\x21\x41\x2c\xf7\xb9\xdd\xf1\xd8\x29\x93\x91\xe6\x15\x17\x1c\xb6\x16\xdf\x5f\xb3\x3f\x4d\x2f\x87\x01\x18\xdb\xff\xf9\x3f\xbf\x79\x0b\xb2\x31\xa6\xef\x36\xe3\x7f\xb4\xcd\xc8\x0e\xdb\x8c\xed\x96\x62\x43\x90\x62\x1a\xcf\x7d\xe6\x63\x53\x71\x9d\x1b\x8c\x72\x5e\x7a\xaf\xd0\x1d\xd0\x5a\x92\x43\x4e\xe1\x09\x14\x0b\x65\x50\xee\x85\x15\x42\x08\x41\xfa\x5b\xcf\x28\x88\x9f\x4e\x44\x79\x32\x9f\x5c\x5c\xfe\x72\x06\xe0\x03\xf8\x9f\xcf\x5f\x36\xe3\x3f\xa7\x2f\x9e\x7f\xb7\xff\x7e\x8d\xbf\x93\x93\x93\x13\xe0\x00\x64\xbd\xb7\x6c\x70\x71\xf5\xf4\x6a\x70\xd6\x30\x1c\xde\xb2\xe3\xf7\xf3\x33\x96\xca\x2f\xa2\xcb\xf4\x2f\x4e\x3c\x8b\xb0\xf7\xe6\x87\x37\x11\xeb\xbd\x79\xd3\x83\xff\x7f\x8a\x04\x41\x45\x26\x6e\xa4\x60\x17\x22\x4d\xf3\xcc\xf3\x58\x1c\xd5\xcb\x04\x4f\xf4\x8f\x5e\xc1\x4f\x7f\x38\x81\x60\x93\xdf\x74\xf8\xcd\x62\x23\xd8\x4c\xdc\x38\x30\x7b\x51\xf3\x85\x38\x0e\x9b\xa3\x16\x54\xfd\xa3\x4b\xa7\x2d\x22\xca\x7b\x04\x43\x8d\xd0\x6e\x6c\x87\x38\x76\x6e\x9e\x0c\xf2\xd4\x6a\xd6\x89\xc9\xd8\x33\x29\x65\x41\x7e\xae\x20\xfe\x26\x07\x59\x25\x56\x51\x8b\x21\xda\x6e\xae\xd9\xda\x46\x82\xf6\x21\x54\x22\x34\xd5\x78\xc9\x96\x39\x58\x58\x50\x8d\x5d\xff\xa5\xc9\x92\xf7\xf4\xe3\xa0\x51\xb0\x63\xab\x1d\xf0\x7d\x68\x63\x2f\xa0\xfb\x72\xaf\x28\x3d\x1a\xfb\xc1\xc5\x15\x7c\xf1\x0d\x8b\x10\xa8\xfe\x7a\x14\x9e\xc9\x67\x53\xc9\xf5\xaf\x76\xa2\xd0\xaa\x36\x65\xe1\x05\x96\x0b\xbd\xa2\x61\x07\x58\x76\x89\x96\x38\xc4\x91\xee\xab\xbe\x29\x01\xab\x73\xf8\x01\xcb\xba\xe8\xbe\x9a\x8c\x3e\x0d\x67\x73\xba\x81\x06\xfd\xf1\xe8\x7c\x3a\x9b\x8c\xfa\x56\x1d\x01\x62\x3e\x4f\xc5\x01\x9a\x76\x2c\x15\xc3\xda\xae\xe0\xa2\x73\xf7\xa7\xfe\xd9\x37\x6b\x48\x6d\x9a\x8f\xee\x3c\x15\x40\x3d\xb6\xef\x4d\x3d\xc8\xab\xcf\x42\x45\xe8\x1e\x46\x44\xd2\x9c\xe8\x3f\x3f\x7f\xec\x2f\xe6\x53\xd0\x39\x6a\x15\x66\x80\x88\x5a\xd7\x63\x3c\x35\x26\xd0\x3e\xfa\x13\xd6\x1f\x18\x14\x54\xa7\x8a\xb4\x68\x19\xa0\x89\x8c\xa6\x57\x73\xfa\x41\x54\x2f\x0d\x9b\x1a\x75\x66\x42\x65\x6c\xb0\x24\x56\xf9\x98\x35\xc9\xf6\xbd\x25\x8a\x8f\x9c\x88\x3b\x7d\xcb\x26\xa2\x44\xa8\xd1\xbe\xb1\x61\x15\x5b\x18\xa0\x83\x7d\xc4\x46\x59\xd2\x3c\x4e\x5a\xfa\x35\x05\x1f\x45\xc7\x7b\x5a\x36\x3d\x8f\x1e\xd5\x72\xab\x9f\xec\xdf\xcf\xef\xf5\x5f\xff\xf2\x30\x79\xb3\x07\xbf\xed\x28\xf9\x7f\xb1\x89\xc7\x9d\x61\x44\x2a\x78\xff\x1f\xb1\x6d\xb2\xdc\xfd\x4e\x19\x96\xad\xc4\xe7\xc2\xf2\xd9\x5c\xfe\x79\x1f\x8b\x95\xad\x07\x23\xbd\x80\x49\x77\x9f\x49\x8a\x15\xb5\x06\x2a\xfa\xe3\x74\x7c\x36\x9c\x59\xbc\x63\x67\xc0\x1d\x34\x54\x7f\x2b\x66\x6a\xfb\x38\xa7\xb3\xef\x76\xea\x7f\xa8\x9d\xaa\x77\xbe\xbb\x51\x9e\xbf\x65\x03\xbe\x05\x10\x64\xc1\xde\x17\x39\x5f\x2d\xb5\x58\x19\x97\xab\xf8\xfe\x6b\x84\xb1\x66\x44\x11\x44\x2b\x1a\xbf\x07\xee\x98\x83\xef\xfa\x7e\xb1\xfc\x6e\x2f\x96\x85\xaf\xa3\x1f\xda\x1f\x5e\xce\xcc\xaf\x77\x47\x7c\xf3\x05\xf1\x9f\x79\x1d\x7c\x97\xfe\xff\x41\xd2\xdf\x89\xfe\x17\x6f\xd9\xbc\xca\xd8\x85\x4c\x8a\x1c\xcb\x1d\x14\x68\x6b\x0f\x08\x7e\x67\x3f\xfc\x7f\xff\xaf\x16\xed\xcf\x0f\xb4\x12\xb1\x17\xbd\x97\xcf\x8c\x7a\xc8\x06\xb2\x48\x52\x11\xf9\xcc\xbd\x3e\x65\x2f\x7b\xf3\xf2\xd9\xcb\x17\x11\x10\x62\xf7\x0f\xe4\xe3\x5e\x61\x40\xcf\xc3\x29\x0b\xe1\x03\xa0\x40\x82\x72\x77\x82\x8b\x43\x0b\x0f\x93\x99\xe9\x84\x53\x2d\xc5\xd2\x60\xcb\x48\xa1\xe2\xa3\x79\x95\x45\x2d\xe3\xd2\x12\x4c\x7f\x0a\xd5\x6d\x5a\x36\xcd\xf3\x94\x17\x92\xa0\x83\x4d\x59\x99\xaa\x73\x2f\x7b\x5f\xac\x0f\xcd\xb9\x61\x64\x8e\xe7\xb1\x47\x9d\x90\xe4\x95\x56\x92\x75\x97\xbe\x5f\x86\xbf\x87\xcb\xf0\x90\x95\x75\x60\xd7\x7c\x37\xac\x7e\x53\x37\xe9\x77\xc3\xea\x3f\xf9\x6a\x0d\x0c\xab\x97\x6f\xd9\x7c\x07\x59\xdc\x0f\xbb\xe4\x18\x63\x0d\xaf\xdc\x73\x6d\x31\xbd\x89\x82\x46\xbe\x1b\x49\xdf\xef\x05\xef\x5e\xf0\xb7\xc6\xf7\x8b\xe0\xfb\x45\xf0\xfd\x22\xf8\x77\xbc\x08\x5e\xbd\x65\x03\xa9\x92\xfc\xe9\xfb\xab\xcb\xc5\x64\x34\xf8\xf6\xab\xe0\x45\x84\x2d\xe0\x49\xd7\x72\x67\xe4\x55\x07\x58\x03\x0b\x93\xef\xf3\x35\x7b\x2f\xe4\xdf\xb4\x3c\x0a\xa3\x9a\x97\xb9\x22\xb4\x91\x85\x48\x45\x00\x6d\xa3\xbe\xfb\xdf\xbe\x5f\x2d\x61\xac\xdc\xee\xb7\xe8\x27\x6c\xa7\xa8\x79\x1d\x61\xf5\xd9\xbf\xf6\x42\xfa\x7e\x1b\x7d\xbf\x8d\x7e\x87\xb7\x91\xbb\x8a\x5e\xbf\x65\xe7\x7c\xc9\xf5\xd9\x61\xb3\xff\x7d\xe6\x4a\xc9\x3e\x6c\x97\x1f\xd9\xff\x66\x83\x9c\xfd\xe1\xc3\xb7\x64\x0f\x3c\xdc\x5a\x84\x2e\xc2\x5c\xa9\xff\x5e\xd3\xc3\x71\x92\x6f\x09\xd8\xfd\x2d\x7b\x2f\x8a\x6c\xc3\x8b\x15\xbb\x14\xd9\x3f\xbe\xfb\xb8\x7e\x17\x17\x8e\x1f\xf0\x79\xc4\x7e\x34\xa8\xac\x68\xd3\xa8\x6a\xa9\xe4\x4a\xf2\x02\x60\xd2\x97\x05\xf8\x4a\x0b\x5b\xbc\x80\x17\xce\xf7\x68\xd1\xf7\x68\xd1\xf7\xbb\xe3\x67\xbd\x3b\x7e\x78\x0b\x45\xbc\xe2\x9b\x22\x44\x64\xc0\xbc\xf6\x7f\xfa\x1d\x6a\xe5\xf7\x0c\xb5\xd2\x66\x6c\x78\x9b\xe3\xb8\x03\xff\xd1\xe9\xfe\x16\x1d\x5a\xfd\xcb\xcb\xf1\x10\x84\x41\xa3\xce\xc7\x10\x44\xfc\x46\xe5\x3c\x8e\xec\x7b\x01\xd3\x7f\xb6\xb0\x0f\xdc\x56\x6f\xde\xb2\x79\x22\x45\x96\x88\x71\x7e\x23\x93\x88\x8d\xc7\x3f\xc1\x75\xf5\x26\x6a\x69\xe5\xbb\xaf\xe9\x77\xab\xfa\xb7\x86\x31\x1a\x1b\xe4\xdf\x50\xf6\x7f\xf7\x1d\x7d\xf7\x1d\xfd\x0e\xaf\x84\x7f\x75\x75\xdf\xc3\x7f\xf1\xd3\x4f\xd3\xf9\x62\x36\xbd\xf8\x17\xe2\xff\xbc\x7e\xfd\xb2\x5e\xff\xd9\xeb\xbd\xfe\x5e\xff\xf9\x6b\xfc\xd1\xea\xd7\x21\x80\xd6\x79\xc1\xa6\x3b\x91\xb1\x39\x5c\xd8\x6d\x36\xa9\xf9\xe5\xc7\x3c\x25\x2a\x0a\x6d\x82\x60\xfa\x60\xfb\x77\xec\x98\x3e\xef\x06\xe8\x0e\xec\x18\x13\xdf\xeb\xc8\x2f\x00\x9f\x5c\x03\x88\x37\x24\x31\x0e\x37\xc8\xb0\x4c\x94\x00\x2c\xc1\x0d\xfc\x16\x61\x52\xb3\xe5\xde\x74\x26\x66\x03\x82\x1f\x34\xbd\xe3\x96\x40\xe9\xbf\x6f\x73\x55\x16\xf9\x16\x7c\xab\x7a\xec\x35\xfc\x30\x9f\xd2\x08\x40\x40\x8a\x82\x67\x37\x44\xbb\x01\x94\x9e\x3e\x8c\xc7\xae\xc8\x77\x85\x14\x80\x72\xc6\x3d\xe4\xae\x6e\x7c\x74\xe5\x08\x69\x52\x43\x3f\x01\xff\x75\x56\x4f\xb8\xf4\xf9\x30\x8c\x92\x61\x31\x2d\x0c\x70\x33\x94\xbc\x9b\xa7\xe8\x43\x0f\x14\x7f\x27\xc5\x2a\xf2\x2a\x5a\x57\x4d\x8e\x59\x6a\x9d\x28\x7c\x7e\xb2\xad\x7f\xd1\xe8\x04\x00\x9f\xb8\x37\x13\xa9\x8a\xa7\xfe\x35\x91\x7e\x4c\xed\x6c\x80\xea\x62\x54\x25\x45\x25\xbb\xc4\x2c\xd2\xda\xc0\xf1\xdd\x46\xc0\x4a\x49\x8f\x14\x15\x20\xe1\x6a\xbd\xeb\xea\xbd\x52\x27\x9d\x72\x6b\xf2\x8e\xdc\x07\x72\x6d\x7f\x1a\x51\x15\xaa\xed\x7f\xd4\x56\x34\x0b\x08\xa8\x45\x95\x9d\x00\x6d\x81\x48\x69\x87\xa8\x4d\x5e\xa5\xab\x36\xfc\x91\xe5\x9e\xed\x52\x9e\x20\x37\x8d\x63\xc4\x80\x38\x34\x8e\x80\x1d\x03\x58\x28\xec\x6d\x44\x9f\x94\x99\x2c\x81\xde\xc3\x11\x3e\xf2\x9b\x2e\xd1\x7d\xea\x5e\x9a\xdd\x91\x55\xdb\xa5\x28\xde\x91\xeb\x40\xf7\x4d\x45\x66\x40\xfa\x9f\x76\x79\xf2\x82\x20\xa0\x68\xa6\x93\x7c\x8b\x94\x20\x65\xce\x76\xb9\x52\x82\x50\x2d\xf5\x0e\x37\xe4\x1f\xc1\x86\x3d\x34\xdf\x48\x0b\x95\x00\x09\x47\xe9\x68\x71\x0a\xa9\x80\xb4\xd9\x30\x6e\xd8\x57\x44\x58\x94\xed\xed\x48\x83\xb9\x5e\x7f\xe5\x3b\x02\x24\x2a\x43\xe4\xfa\x2d\xcf\x38\x9e\xcb\xe0\x08\x1f\x3b\x44\x56\x37\xc5\xfa\x2d\xe1\x54\x45\xed\x95\xd4\xb4\x2b\xba\x3e\x61\x92\xb6\x5a\xa8\xa8\x39\x4d\xdd\xae\x3f\xd4\xd3\x97\xb1\x95\x3a\xfa\x74\x02\x89\xd2\x36\x80\x97\x31\xd4\xd6\xfe\xb4\x22\x21\x5b\x01\xdc\xd2\xaa\xe4\x40\xdc\x92\xee\x99\x92\x5b\x99\x72\x20\x7b\x6b\x1e\xfe\x96\x1e\x18\x86\x1b\x7c\x2f\xcd\xb1\x12\x69\x6a\xca\xdf\xef\x27\xa1\xf6\x56\x03\x81\x6b\x83\x8e\xfb\xc4\x34\x5b\xfe\x45\xff\x4f\xf3\x21\x9f\xe2\xc3\x9d\x36\xbb\x7f\x0d\x1b\xa0\x43\x56\xf5\x08\x5e\x3d\x16\x77\x33\x9b\xaf\xe2\x5a\xf3\x8e\xfd\x1b\xc5\x94\x3e\x9e\xa9\x5c\x16\x14\xe6\x20\x93\x2b\x14\x16\x5e\x1e\xbc\x63\xad\xf3\x2f\x96\xd4\x63\x28\x22\x92\x6f\x07\x94\x56\x08\x55\xa5\xf0\x36\xc4\x17\xc2\x67\x7c\x81\xd7\xc2\x65\x87\xdc\xc3\x2d\xaf\x90\x6b\x47\x89\x07\xd9\xf4\xbc\x6c\x7b\x0e\xe9\x08\x56\x40\xb9\xa3\x72\x47\x34\x64\x99\xc6\x6a\x17\x49\x64\xac\xcc\x60\xb2\xe0\x4a\x6d\x0a\x3d\x77\x70\x5b\x1e\xc4\x76\xcc\x16\x6e\xbf\x08\xdf\x11\xb1\x66\x96\xfb\x02\x5c\x2a\x9f\x94\xed\xfe\x9d\xe6\xd3\xcb\x99\x1d\xf7\xf0\x29\xc1\x6e\x42\x77\xfc\x9b\xd7\x99\xd6\x88\x91\xc0\x33\x0a\x69\x11\xc6\xd4\xca\x73\x8e\xa0\xa4\xa0\xb1\x7a\xb7\x9c\xa9\xcc\xf3\xef\x85\x1f\xe2\xc0\xfc\xf6\x8f\xf5\x4f\x83\x3b\x38\xfb\x16\xb8\x83\xe8\x3e\x23\x3b\xb0\xce\x9b\xca\x53\x87\x2b\x26\x55\x07\x36\xf1\x91\xe9\xb7\x31\x59\xe7\x35\xdc\x83\xa8\xc5\xba\x8e\x1e\x0d\x86\xd0\x64\xdf\xfd\x69\xf8\x08\x07\xcd\x6d\x64\xcf\x6d\xda\xd8\x66\x58\xbf\x0e\x22\xc2\x3f\x8b\x86\x70\xd8\x5e\xed\x82\xa9\xdd\xb0\x71\x7f\x5e\x64\x04\xb0\xff\xe6\x93\x51\xff\x17\x34\xfe\x1e\xb4\xff\x5e\x9e\xbe\xe8\xd5\xed\xbf\xde\x8b\xd7\xbd\xef\xf6\xdf\xaf\xf1\x37\x5f\x4c\x67\xfd\x0f\x43\x36\x19\x2e\x3e\x4f\x67\x7f\x40\x9f\xc8\xd9\xd5\x7c\x31\xbb\x66\xfd\xf9\x7c\x3a\x18\xc1\xe9\x3d\xba\xbc\x7a\x3f\x1e\x0d\x0c\x41\xf3\x91\x0f\x0e\x8b\x16\xc0\x99\x58\x83\x62\x9a\x67\x2a\xc6\x8f\x7a\xac\x33\xc8\xb7\x5b\x51\x00\xb6\xde\x95\x12\x1d\xb6\x15\x3c\xab\x15\x97\xd5\xe8\xc0\xbe\x18\xfd\x72\x90\xdf\x42\xf5\xd7\x20\xaf\x1b\x80\xbc\xc1\x64\xde\x8b\x4f\xf5\xbb\xac\x83\xd3\xbc\x08\x28\x23\x81\x98\x98\xee\x54\xe0\x04\x13\x8a\xd8\xf0\xe8\x26\xb2\xb7\x0a\x32\x86\xa1\x10\x0e\xb0\xff\xe8\x25\xcf\x83\x97\x18\x80\x5c\xf3\x32\x68\x21\xdf\x2e\x03\x76\x62\xc1\xa6\x46\x2f\x1e\x80\x56\x82\xd2\x3b\x44\x16\x84\xfb\x62\xb9\x07\x82\x58\xdb\xbc\x53\x35\x2e\x9a\x97\xb2\xd1\x11\x3c\x2e\x1f\xef\xa7\xd4\xdd\x17\xba\xbb\x6e\x12\xfd\x7e\x06\x9d\x62\x8d\x0e\x91\xff\xf8\xa1\xd1\x40\x0f\x2f\xea\xca\x20\xce\x7a\xc2\x2d\xb2\x28\x5c\xcc\xa6\xd6\x5d\x2f\xb5\xc8\xd7\xd4\xc5\x97\xac\x33\x4c\x45\x52\x16\x79\x26\x93\xf0\x22\xbc\x10\xc9\x86\x67\x52\x6d\x4d\xbf\x39\xdb\x9a\x8f\x0c\xd5\x61\xba\x27\xe3\xc2\x01\xb5\xd5\x41\x37\xc1\x14\x70\x2e\x02\xc3\x04\x28\xdc\x5b\xcb\x82\x67\x6a\x8d\x26\xd7\x8a\x97\x9c\xba\xf6\x8a\x75\x86\x5f\x45\x52\x95\x7a\xdb\x99\x3e\x04\x9b\xd2\xc3\x77\x34\x76\xd8\x86\x1b\x8f\x09\x3c\x42\x4d\xbd\x66\x9d\x11\xda\x6c\xec\x8c\x8a\x26\x0b\x7f\x35\x1c\x5e\x9d\x25\xd2\x0e\xd8\x11\x89\xd6\xa9\xd1\x86\x19\xb3\xf7\x46\x63\xb6\xf8\xda\xe4\xf0\xeb\x46\x2e\x65\xc9\xfa\xd4\x9d\x1f\x58\x67\xcc\x8b\x1b\x51\x00\x00\x97\x9b\x5e\x50\x64\x11\xe5\x12\x57\x5e\xd4\x06\xac\x75\x98\xda\x3a\x32\xc2\x95\xc5\x37\xb3\x1b\xfd\xb8\xc7\xae\xda\xce\x72\x8e\xdd\x78\xc3\x3a\xf4\x81\x9b\x0b\xe9\xe0\xb5\x8c\x10\x79\x66\x1e\xf3\xd7\x61\xc3\x6f\x8d\x9c\xb0\x64\xd9\xa0\x65\x46\x96\xc2\x96\x7f\xf5\x29\x6c\xb5\x89\x29\x97\xa9\x88\x98\x71\x11\x90\x73\x03\x0c\x75\xda\xdc\x64\x58\x63\x4b\x7a\xb4\xda\xec\x42\xc6\x4c\xd8\x69\x38\xa5\x11\x12\xa1\x66\x2b\x1f\xb8\x93\xe2\x71\x49\x9e\xdd\x8a\x3d\x11\xaa\xca\xcc\x8c\xa1\xc7\x3a\xc1\x31\xb1\x73\xee\x31\xaa\x02\x16\x6a\xc1\x56\x22\x15\xa5\x85\xb3\x85\x1d\x8d\xb6\x5f\x02\xf3\xaf\xca\xa2\x4a\xca\xaa\x80\x3e\x7b\xc1\xa0\xc6\x81\x46\x66\x63\x71\x2b\xf3\x4a\xd5\x84\x19\xfb\xbc\x11\x59\x6d\x2b\x2b\xa7\x15\x83\xa7\x41\x09\x6d\x39\xe9\x97\xac\x65\x0a\x26\x54\xd0\x08\x93\x0a\x3c\x3f\x7d\x64\x96\x7c\x70\x0c\x5a\xd8\x1a\xc0\x30\x0e\x4d\x22\x17\x08\xea\xc0\x8d\xce\x1f\xe8\xb8\x7e\xe3\x7b\x7c\x63\x26\xee\xb0\x19\xc2\x3f\x83\xb6\x94\x65\x57\x6d\x17\x57\xf7\xb7\xdc\x8b\x7b\xa7\xac\x13\xfc\xc2\xac\x93\x7f\xc0\x20\xfc\xb7\xdd\x55\xa5\x28\x7c\xb4\xca\x95\xa0\xa3\xa3\xb7\xb0\x50\x49\x21\x97\x4e\x28\x3d\xf6\x80\xea\xb9\xaf\xdd\x17\x48\x1b\x23\x93\x4d\x54\xdf\xb1\xb2\xb4\x8b\xd6\xc2\x73\x6d\x49\x6f\xd3\x42\xf0\xd5\x3e\x5c\xee\xf0\x98\x36\x4e\x66\xef\x39\xeb\x5c\x72\x38\x37\x83\x94\xcb\x6d\xb0\x5f\x77\xf8\x05\x84\x38\x8f\x55\x37\x62\x59\x7e\xc7\xf2\x3b\xdd\x1a\x31\xb6\xa2\x23\xca\x1d\x97\xfb\x88\x6b\x23\xb6\x15\xe5\x26\x47\x54\xbc\x44\x28\xf2\x43\xf1\x1d\x40\xfb\x56\x0a\xdf\x83\xf7\x8a\xf7\x76\x27\x11\x98\x41\xd6\xb3\xd7\x5e\xef\x05\xeb\x78\x13\xee\x0b\xda\x1d\x90\xf5\x15\xc6\x31\x45\x9b\x24\x98\x9a\x35\x30\xc2\x80\x16\xd2\xb0\x3c\x65\xe9\x0f\x46\x9f\xfe\x6d\xbe\xaa\x52\xa1\x98\x74\x7b\x30\x62\xbb\xb4\xa2\xa3\xed\x60\xb2\x65\x56\x8a\x62\xcd\x13\x7d\x2f\x19\x3d\xc9\x1c\x2d\xbd\x59\x76\xa5\xb2\xd1\x58\xd0\x4c\xf2\x14\xb6\x99\x4c\x9d\x6b\x14\x28\x08\xd3\xd4\xde\xc7\x3c\x63\xee\x86\x02\xe3\xd9\x77\xaf\xae\xe4\x7a\x2d\x0a\x22\xfb\x05\xf0\xd2\x42\x2a\x70\xc5\xdc\xe8\x6e\x96\x0f\x48\x0f\xbc\xd0\xee\x44\x9a\xb2\x2f\x59\x7e\x97\x45\x9e\x0e\x16\x5e\x0a\x66\x12\xad\xfa\xf1\x44\xb1\x64\x93\xcb\x04\x99\xab\x83\xcd\x9f\xf0\x8c\x38\x67\x39\xf4\xa9\x10\x4a\xe1\xc6\xe1\x45\xb2\x91\xb7\x3c\x25\xb8\x64\xcf\x0b\x0d\x90\x85\x60\xd7\xf3\x52\x4f\x9f\xf9\x1d\x29\x8f\x2b\x71\x82\xbf\x45\xa7\x88\x33\x7e\xef\xe4\x0a\xd0\xa6\x6d\xb7\xf5\xd2\x66\x39\xb1\x7c\x9b\xcd\xf2\x92\x75\xae\xf3\xaa\xc3\x8e\xf3\x02\xfe\x55\x74\xba\x76\xb3\xd7\x2e\x66\x4e\x5c\xcd\x74\x41\x8b\xaf\x5a\xb3\x05\xe3\x9e\xa4\x3f\x51\x15\x23\x43\xfd\x76\x97\xee\xcd\x9e\xf7\x6f\x0a\x73\x25\x46\xe1\x71\x85\xf6\xd7\x15\x88\xf6\x80\x96\x31\x38\xd2\xaa\xb2\x8e\xa5\x39\x31\x35\xbf\x8a\x7b\xc8\x7b\xe2\x75\x0e\x9c\x5e\x38\x2e\x0f\x1d\x7e\x6f\x7a\x6e\xee\x78\xd8\x66\xfa\x6c\x29\xf3\x1f\xe8\x92\x86\xbd\x24\x95\x75\x87\x6c\xb7\x79\x66\x77\x25\x8c\x07\x68\xbc\xcf\xc1\xa7\x01\xb0\x97\xee\x8e\x77\xdb\x3b\x62\x1d\xfa\x8d\x39\x82\xc7\xbc\x4b\xfe\xde\x3b\x3d\x4f\x2b\x59\x88\x04\xee\x59\x3d\xcf\xfa\xdf\x70\x7b\x27\xdc\xb0\x27\xe3\x87\xb4\xce\x9e\x67\xd7\x78\xd2\x70\x38\xee\x4a\x5f\x12\xa9\x0c\xc7\x56\xad\x59\x01\xe3\x39\x5e\x76\x41\x4c\x15\x6a\x23\x77\xba\x09\xe0\x89\x01\x8d\x6d\x2d\xd7\xe8\x94\x49\x00\x60\xfd\xe5\xb3\xff\xd5\x35\xab\x95\x57\xa5\xa5\xbc\x56\x1b\x5e\xa0\xed\xb0\x14\x99\x20\xc8\xf0\xa0\x49\xaf\x57\x14\x41\xf0\x37\xbf\x2f\x64\x4f\xe3\x1e\x1c\x8e\xa6\x4e\xf7\x41\x0b\xb3\xf8\xc0\x97\x3e\x94\xa8\x02\x4a\x71\x50\xdb\xd2\xd5\x89\xde\xed\x11\x2b\xf2\x3d\x4f\xcb\xfd\xc9\xba\x10\x42\x4b\xe6\xec\x44\x7c\x4d\xd2\x4a\xc9\x5b\xcf\x87\xe8\x39\x3e\x3d\x43\x0a\x44\x54\xaa\xd5\xe2\x0a\xc9\xdd\x77\x42\x7f\x8a\xf2\x17\x2e\x7b\xbd\x7c\xb8\x25\xda\x1f\xa5\x53\x70\xec\xe9\xc2\x24\xae\xb5\xd2\x6d\x40\x3c\xba\x35\xe1\xdd\x1c\xa4\x81\x66\xb5\x89\x39\x06\x9f\x35\x72\x9e\x42\xf2\x0e\xc2\x60\x8c\xff\xb2\x81\xde\x5a\x17\x6c\xc7\x2d\x0a\x6c\xb7\x91\x06\x55\x33\x68\xc8\x77\x0c\xa0\xf5\xa8\x58\x70\xe6\xa9\xcf\xef\xc0\x99\xa6\x67\x67\x69\x66\x07\xaf\x4e\x45\x77\x27\x93\xd9\xba\x90\xd9\x8d\x53\x8a\xf1\x7a\x89\xc8\x65\xa9\xc5\xb6\x48\x53\xe2\xb2\xad\xdd\xfe\x65\x4e\x2e\x7b\x60\x3d\x47\x0f\x34\xcc\xcd\x4e\x6f\x72\x48\x4c\x42\x3f\x3e\x04\x6f\xb4\xc0\x07\x29\xa7\x78\x2a\xa2\x20\xd1\x08\xac\x6b\x3d\x7b\xb9\x23\xda\x7d\xc4\xe4\xc0\x5e\x3d\x4e\xf0\xd8\x1a\x2f\xbd\xf5\xe7\x4a\x22\x8b\x30\xa2\xe8\x34\xee\xe9\x3d\xa2\xfb\xa2\x67\x03\x68\x01\xc0\x33\xad\xb7\x1f\xb1\x30\xad\xb4\x10\x6f\xae\xf9\x5a\x16\x48\xd6\x61\x6d\xf2\xb0\x77\x2d\xce\xf4\x86\xe2\x72\xbc\xea\x36\x68\xea\xfd\xae\xe9\x2e\x2d\xf3\x5b\x38\x18\x66\x67\xa6\x4e\x5b\xa2\x51\xbd\x65\xbd\x2e\x4c\xa2\x63\xf9\xd5\xe7\x0c\x74\x5a\xe1\x34\xda\xa0\x7b\xef\x18\x70\xdf\x13\x1d\xc1\xa1\x67\xf2\x82\x3d\xef\x9a\xe8\x32\x6c\x09\x8c\x0e\x82\xc0\xd3\xbb\xe3\x2d\x93\x38\xd3\xbe\xe6\x71\x50\x95\x95\xf4\xf0\x83\x56\x3a\x6e\x70\x38\x94\x1e\x1b\x95\x36\x90\x65\x22\x14\x89\xa3\x53\xff\x06\x37\x42\x68\xfe\xed\x92\x22\x42\xf3\xdf\x6f\xec\x67\x10\x5a\xbf\x9c\xf8\x09\x3c\x2e\x3f\xa3\xe4\x09\x1d\x2a\xe8\x77\x02\x09\x00\x77\x84\x3f\x3d\xed\x52\x89\xb4\x33\x50\xfd\x58\x95\xd9\x38\xdf\x92\x2b\x69\x73\x37\xe1\x91\xba\xbc\xaa\x19\xed\x3f\x55\x7e\x3d\x4e\x7c\x45\x35\xf9\x75\x8f\xaf\xca\x1f\x33\x8d\x8e\xa7\x79\x66\x7b\x28\xb3\x60\x2b\xc3\x08\xb5\x8d\xd3\xe2\x72\x0b\xe7\xcc\x5c\xbc\xde\xaf\xbb\x9e\xe8\xf4\xa2\x9d\x75\x09\xe9\x49\xd5\x7b\x84\x25\x48\x84\x47\x0e\xac\x75\x31\x61\x8e\xb5\x88\x68\x39\xae\x8f\x6c\xf7\x9f\x9b\x8d\x07\xc5\x38\x89\x49\xa5\x05\x81\x11\xe1\xfa\x9f\xf7\x4a\x71\xbf\x2b\x28\xbf\xf5\x84\x2b\x16\x3a\x7d\xdb\xac\xac\x47\x88\xeb\xd3\x6f\x15\xd7\x36\x2d\xa4\x31\x77\x1b\xae\x48\x7c\xaf\x9c\x6c\x6e\x99\xc7\x03\x52\xbc\xf5\xc9\x47\x09\x72\x27\x31\x43\x53\x32\x5f\xb7\x2e\xe3\x61\x99\xfe\x2d\x9b\xa4\x26\xe8\x8f\xc5\x57\xc8\xbe\xf0\xce\xff\x81\x41\x75\x5d\x3c\x9e\xae\x06\xb8\xb2\x5e\x3c\x42\x2c\xd4\xdd\xa2\x98\x48\xad\x04\xe5\x6e\x3c\xae\xfb\xa6\xc4\x25\xf0\x02\x4f\x6d\x1e\x80\xa2\xef\x7b\x3e\x19\xa2\x6e\xdd\xa8\x00\xa0\x32\xb7\x51\xf6\xe8\x1b\x07\x05\x30\xdc\x04\xb9\xff\xb1\x0d\x02\xc0\x3e\x7f\x94\xfb\xf2\x7e\x87\x86\xbf\x85\x9b\xf6\xaf\x67\xd9\x05\x73\xd6\x92\x3e\x00\x84\xff\x0f\xa8\x3d\x8f\xb2\x1a\xad\x63\xaf\x61\x37\xa2\xda\xa8\xe7\x21\x20\x5f\xe6\x90\x15\xd2\x68\x07\x76\x97\xb8\x15\x40\xdd\x69\xbe\x0f\x87\x07\x8a\x92\x1d\x43\x8c\x4d\x53\x5c\x1c\x65\xaf\xde\xe3\x5b\x22\x4a\xd8\x9b\x41\xa1\x6b\xa7\x6d\x9e\x30\x01\x26\x2d\x45\xa1\xfc\x3c\x10\x65\xdc\x02\x7a\x1f\xe8\x8b\xfc\xd0\xd8\xc9\xdb\x5f\x88\x44\xee\xa4\x3e\xa3\x4f\x8c\x9a\xa0\x45\x33\x4c\x48\xcc\x3e\xe6\x77\x7a\x58\x91\xed\xae\x9d\x88\xcc\x7a\x36\x79\x6a\x1d\xd3\x38\x12\xe3\x7e\xf6\x1e\xa0\x96\x03\xef\x9f\x99\xed\xe7\xf1\x4b\xda\xbf\xa7\xac\x8f\x1e\x09\x99\x12\x14\x84\x1f\x30\x00\xe7\x66\xe0\x69\xfd\x96\x3d\x6c\x58\xae\x6a\x71\x7f\x19\x04\x25\xd0\xf7\xf5\xd0\xce\x72\xfa\x07\xf8\xa0\xf9\x56\xb0\xad\x58\x49\x0e\xee\x61\xdf\xf1\xe4\xe6\xbe\x60\xb7\xfa\xfb\xcc\xc5\x64\x1e\x8c\xed\x50\xf2\x8d\xd6\x02\x60\x4c\xf9\x96\xed\x61\x11\x70\xf6\x5b\xde\x62\x47\x85\x97\xaa\x5c\xd7\x07\xab\xfb\xf0\xe0\x7b\x23\x53\xfa\x01\x1c\xad\xa1\x8b\x88\x97\x4c\x1f\x98\x92\x95\x77\x22\xbd\x15\xec\xb8\x77\xda\x65\xdb\x3c\x2b\x37\xca\xcb\xb1\x83\x1b\x50\x96\x26\x66\x90\xea\xf3\x9b\xe8\x59\xb2\x8d\x81\x6a\x64\x1b\x53\xf2\x2b\x3b\x7e\x55\x6b\x88\x7b\x11\x86\x70\x0f\x87\xb1\xbd\x60\x43\x58\x26\xcd\x66\x6a\x2c\x5c\xfc\x6e\xb3\xe3\x01\xd4\x82\xad\x10\x6a\x97\x67\x10\x01\x81\x31\x8a\x4c\x55\xb4\x85\xc9\xab\xdc\x76\xfa\x70\x7a\xfc\xe4\x2d\x71\x2b\x32\x3d\xe7\xfa\x17\x0f\x2f\x2e\x64\xa0\xc8\x8c\x52\xe5\x20\xc0\x59\x8f\xdc\x3e\x8f\x9f\xb3\x33\x81\x1e\xd0\xd6\xc8\xab\x13\x4f\xe8\x17\xe2\x69\x1a\x8a\xce\x43\x67\x81\x1c\xa9\xb0\xbe\x18\x2a\x30\x07\xd8\x1c\x5d\xdd\xcd\x1b\xa1\xe8\xd8\x63\x53\x74\xc6\xe8\x6e\x0a\xd5\x68\xb7\xee\xc4\xa6\x87\x0d\xc4\x6d\x12\x74\x57\xe4\x5b\x99\xe9\x65\x55\x25\x2f\xd1\x6d\x65\xe7\xba\x16\x49\x31\x25\x36\xc6\x23\x96\xee\x7d\x9f\x58\xba\x8f\x50\x17\x09\x8d\x3a\xeb\x20\xa5\xab\xaa\x69\x52\xa3\xcb\xd8\xdc\x54\x65\x0d\x10\xb3\x35\x98\x68\x1c\x74\xde\x66\x88\xac\x39\x4f\x1e\x78\x8a\x5f\xc0\x7f\x1d\x10\x03\x85\x48\xc1\xda\x09\xf3\xed\xa4\x2f\xcb\x8c\x90\xf4\xd2\x9a\x41\xfd\xf0\xbd\x69\xad\x5a\xe3\xf3\xf8\x05\x1b\xf9\xf6\xdf\xa5\xb1\xff\x2e\x78\xa9\xef\x89\xd8\xd8\x8a\x0b\xd8\x6a\x97\xa0\x7f\xa1\xd2\x12\xb3\xd1\xba\xa1\x19\x72\x6c\xc6\xd2\x1c\xd2\x9d\x63\x55\x4d\x14\x94\xc1\xce\x7d\xa2\xee\x37\x41\x21\x9a\x46\xe1\x9d\x32\x37\x8e\x62\xe1\x07\x0a\x8d\xee\xdd\x66\x10\x06\xf7\xb4\x02\x57\x61\x5e\x68\x7d\x22\x0a\x1e\xab\xed\xb8\x52\x7c\x2d\x71\x9f\xdb\x02\x32\xff\x4c\x07\x39\x17\xa5\x2c\x81\x36\x7f\x3c\xfc\xd0\x1f\x77\x0c\xb3\x21\x2d\x09\x65\x32\xe8\x19\xb3\xbb\x9e\xb4\x58\x97\x9d\x81\x5f\x03\x89\x10\x90\x27\xea\xfd\xbd\x12\x25\x97\xa9\x99\x3f\x2b\x86\x30\x4d\x51\xcf\x2f\x0a\x78\x73\x30\x93\xb2\xb1\x1e\xf9\x12\xc3\x78\x30\x25\x6e\x45\x9c\xd4\xad\x9f\x9c\x9a\x08\xe4\x07\x6f\xdf\xda\xdc\x61\x22\xaf\x3e\xa4\x3b\x7d\xdc\x88\xfe\x49\xbf\x01\xa6\x04\xe7\x31\xa4\x5d\x0a\xa6\x1e\xec\x1c\x4f\xf4\xda\xb0\x57\x6c\x4c\x69\xff\xf1\xfe\xe5\xe8\x49\x63\xf3\x3d\xa9\xc5\x20\x03\xad\xc3\xd3\x70\x77\x45\x7e\x53\xf0\xad\x49\xc8\xa6\x28\x92\x5e\x98\x07\x77\x72\xbe\xae\xd9\x4d\x46\x23\xc6\x2b\x81\xab\x3c\xe3\xcb\x74\xcf\x32\x91\x08\xa5\x78\xb1\x87\x20\xd7\x76\x97\x7a\xf2\xaa\x7f\x39\x6a\xd9\x76\x3c\x55\xb9\xed\x30\xe8\x0d\x7e\xb6\x35\x59\x00\x6e\x2a\xad\xfd\x39\x13\xbb\x42\x28\x23\x12\x54\x1c\xb4\x5c\x98\x2f\x31\x63\x33\x62\xce\x74\x81\x9a\xca\x5c\x2b\xb1\xbb\xaa\x50\x15\xcf\xc0\x27\xe5\x96\xf7\x05\x18\xad\x68\x2d\xfa\x4d\x2e\x45\x2a\xc5\xad\x50\x0d\x63\xa3\x31\xfb\x7a\x4a\xc2\xef\x6d\x42\xbb\x49\x0b\x3a\x56\x5d\xe3\x26\xa8\x4f\xbd\x77\x0a\xe8\x80\x9b\x84\x84\xd6\xec\x80\xb6\xb0\xeb\xf3\xf8\x25\x9b\x19\xa9\x31\x01\x21\xeb\xdf\x7e\xab\x0a\xb7\x04\x4a\x11\x27\x84\x5d\xec\xd8\x64\xde\xc0\xde\x6d\x2a\xe7\xb0\xff\xb4\xc2\x82\x71\x61\x93\x10\xa1\x3b\xba\xab\x4a\x3c\x72\x9e\x6c\xf7\xd5\x8f\x40\x79\x84\x9b\xb4\x12\x18\x0f\x55\x2e\x21\x01\x0a\x24\xb2\xe6\x5d\xd8\x68\x38\xcd\x13\x93\x94\x6f\x0b\x1b\xb4\x8d\x72\xab\x67\x0b\xef\xbc\xbc\xd8\x77\xd9\x9d\x3e\x54\x8c\x63\x4d\xc5\x9d\x29\xa0\xd8\xe6\xaa\x04\x22\xba\x14\x76\x6b\x9a\xe7\x5f\xd0\xa1\x03\x6d\xd1\x8b\x60\xac\x4e\x65\xd6\xc6\x14\xa5\x37\x17\xa1\x0c\xd1\x4b\x6a\xb4\x7e\xbe\x5a\x69\xe5\xb3\xc0\x6b\x12\xba\xe5\x2f\x33\xe5\x95\xd0\x48\x02\x31\xe3\x12\x6c\xdc\xf0\xe1\x84\xf8\x8b\xe6\xc7\xf1\xf0\x26\x6d\x12\xc9\xd5\x85\x36\x4e\x41\x70\x5f\xb6\x98\x32\xc1\xbd\x69\x0b\xc3\x53\xcc\x85\x2f\xf3\xf0\x0e\xb5\xc3\x4d\x36\xb9\x36\xc3\x90\x81\xd7\x84\x2d\x4b\x13\x1e\xd5\x3a\x93\x00\x5d\x31\x62\x77\x90\xe4\x5d\xee\x23\xc3\x18\xa7\x2d\xe0\x95\xd8\x42\x42\x55\x5e\xb0\x54\x5a\x63\xc6\x59\xeb\xd0\xb0\x37\xeb\xae\xdf\x75\xe3\xb7\xc5\x00\x5b\xe5\x4c\xe5\x68\x01\xe7\xb0\xa5\x60\x84\x44\xe4\x89\x3d\x05\x93\xd2\xe7\xf6\x6c\x57\x6a\xc8\x31\xe4\xbb\x19\xdc\x1a\x41\x15\x86\x2c\x19\x5f\xaa\x3c\xad\x80\x9b\x18\xea\x73\xe8\x0a\xcb\xe8\x6e\xfe\x29\xe3\xd7\xc7\x0c\xe6\x15\x4f\x3b\xe8\xe1\x69\x9e\x09\x67\x72\x93\x57\x9c\xdf\x14\x02\x0f\x13\x36\xb9\xbe\x4f\x9d\x43\xeb\x3b\xf0\xbb\xd1\x00\x5d\x1f\x8e\xc1\x79\x8e\x19\x0a\xc1\x17\xbc\xc0\x60\x35\x28\x93\xf7\xb9\xf0\x83\xcd\x53\x57\xc2\xb4\x1e\x98\x54\x45\x71\x9f\xe6\x69\x8e\xa3\xdf\x51\x3a\xe6\xaa\x4a\xc1\x07\xf5\xf8\x39\x45\xf3\x54\xcf\x18\xcc\x27\xc9\xca\x57\x8d\xac\x79\x4f\x15\x25\x87\x96\x72\x9b\xdd\x73\xce\xd7\x7d\x55\xde\xef\x30\x29\x44\xef\x3a\x32\x71\x48\x8b\xdb\x9a\x6d\xeb\x2e\x9c\xde\x89\x96\xd7\xe0\x3f\x46\x5b\x4c\x94\x74\x82\x6b\x86\x43\x64\xcc\x54\xdd\x15\xa7\xad\x91\x18\xd1\xc6\xc1\x83\x66\x58\x5b\x9a\x8a\x6c\x2b\xa9\x79\x84\xc3\x8a\x93\x24\xb1\xd6\xd6\x26\xbf\xa3\x1c\x23\x23\x6a\x60\x50\xeb\x2a\x5d\x4b\x48\x07\x00\x05\xdd\xab\xc6\xf1\x67\x81\x3c\x5c\x34\x18\xcb\xb1\x9d\x67\x6a\x27\x93\x2a\xaf\x54\x6a\x9d\x29\xab\x47\xda\x0f\xd1\x01\xeb\x01\x02\x72\xa9\xfe\xa6\xe0\xe9\x01\x5b\xa2\x45\x36\xde\xb7\x95\x5b\xb7\x07\x58\xb6\x2d\x56\xcd\xba\x91\x0a\xd9\x90\xb9\xc6\x52\xb0\xf5\x34\x6b\x14\x5d\x98\x0c\x13\x51\x8f\x41\xf6\x92\x61\x8a\xcb\x65\x33\x75\x3c\x8c\x05\xbb\x74\x61\x39\xa6\xb1\xe7\x31\x56\xb2\x4b\x25\xe4\x05\x5a\x85\xbf\xdd\x95\x13\xb0\x79\xa6\x5e\x81\xef\x81\xb1\xae\x72\x41\xb9\x63\x65\x29\xb6\x3b\x62\x0a\xd9\x4a\x08\xa4\x81\x33\x2e\x74\xaa\x3d\x51\xd6\xf0\x69\xa6\xbb\x99\x46\xad\x3b\x9d\x1e\x55\x78\x60\xca\x8d\x8d\x22\x5b\x3f\x2e\xdd\xdd\x0f\x2f\x8a\x99\x70\x37\x81\x66\x74\xdf\x20\xe2\x71\xce\xc8\x04\x92\x18\x20\xaa\x2f\x03\xcc\x79\xbb\x38\x87\x92\x9f\x7b\x04\x61\xeb\xed\xf3\xfb\x96\xfd\xf6\x62\x6d\x17\xed\xaf\xfd\xf0\xa4\x27\xc3\xc9\x35\x13\x44\x2f\x31\xe5\x67\xbb\xc4\x3c\xd2\xe0\x84\x7a\xc1\x90\x6f\x4b\x4f\x6e\x8b\xe6\xfa\xaf\xc4\xfc\x58\x99\xdd\xa4\x16\x25\x25\x66\xa3\xcc\x68\xa0\x09\xd7\xc7\x36\xdc\x80\xaa\x2a\x44\xeb\x85\xd2\xd8\x64\x4e\xee\x9a\x03\xda\xf0\x80\xbc\xd0\x6f\xb3\xb7\xa3\x56\xef\xb6\xbb\x74\xcf\xce\x50\x27\x9f\x97\xbc\xac\xd0\x4b\x3c\x13\x37\x55\x4a\x3c\xe7\x56\xf7\x07\xef\xbb\x73\x04\xea\x7e\x82\x41\x0e\x6d\x60\xae\x5a\xb6\xaf\xe7\xaa\xb5\x04\x02\x0a\xa1\x76\x94\x1a\xa0\xf2\x2d\x46\x22\x5c\x92\x5b\xb0\x12\x64\x2d\x28\xec\x59\xc4\xfe\x56\xad\x28\x77\xaa\x80\x7c\x39\x64\xfb\xa1\xae\x86\x56\xc4\x5b\xf0\xe4\xf8\xbd\x3b\xdc\xad\xfb\x13\xbf\xdf\x59\x3f\x56\xe0\x7a\x72\x81\x1b\x07\xe5\x43\x51\x44\xb1\xa7\xba\xca\x98\xcd\x2b\xeb\x1f\xc1\x8b\xd3\x5c\x75\xfe\xe5\x56\xf3\x1e\x1c\x70\x44\xbc\xc0\x5a\xdc\xfa\xef\x6d\x96\x60\x03\x31\xa9\x61\xc6\x0d\xd1\x2a\xa6\xe1\x9a\x61\x16\x39\xd8\x20\xe4\x52\x72\x9b\xc0\xcd\x6c\x84\x3b\xb4\x6d\x18\xce\x7c\x4d\xf7\xe4\xc6\xa1\x1d\xe8\xfb\x71\xa0\x24\x7d\x85\xf0\x49\xea\x8b\x4c\x53\xdd\x87\xa5\x60\xc6\xfb\x0c\xe2\x18\x42\xb9\x4c\x62\xfa\xfe\xcb\xb8\x1e\xac\x0b\x25\xfd\x22\xd8\xfe\xfa\x49\x2c\xc6\x49\x02\xc7\x6e\xbb\xa0\x01\x8f\x47\x59\xf2\x64\x43\x4a\x4a\x9b\x4d\x4c\x36\x8d\x51\x29\x1a\x67\xe9\x55\x6c\x95\x45\x33\xd7\xbe\x4d\xfe\x2a\xee\xb1\x89\xb8\xf3\x14\x4a\x08\xe8\x95\x79\xc1\x6f\x2c\x73\xab\x96\x3c\xa3\x6c\x55\xa9\xb2\xd8\x5b\x12\x57\xb0\x6f\x75\x73\x9d\xf9\x64\xd4\xef\x74\x41\x82\x41\x01\xa8\xd2\x67\xe7\x56\x2a\x04\x5e\x78\x9a\x17\x90\xcb\x5e\x2f\xdf\xb6\x38\x1c\x70\x15\xc9\x2d\x6e\x6f\xb9\xd5\xeb\xaf\x8d\x7c\x73\x05\x82\x6f\x6d\x29\xd8\x8d\xbc\x15\x19\x5c\x85\x4a\x4b\xef\x4a\xaa\x8d\xee\x57\x58\xde\x4e\x63\x3a\x65\x43\xac\x17\xce\xd7\xb5\xd1\x4d\xb3\xa4\x76\x76\x6d\xb0\x81\xfa\x6e\xc3\x88\x81\x83\xa0\xa6\xa9\x5a\xe5\xc5\x9a\xd6\xe9\x1d\xdf\x63\x92\xa9\xcc\x50\x1a\x00\x54\x46\xd9\xae\xba\x72\x1b\x0c\x89\xbd\x26\x54\xee\xd9\xac\xfa\xe7\x74\xcf\x78\xbd\x6d\x69\x0d\x2f\x9b\xf6\x20\x8b\x9b\x66\x37\x3a\xba\x19\xa0\x28\x92\x4d\xc8\x86\x75\x19\x45\xe6\x3b\x98\x98\xa0\xfc\xc4\xf3\x21\xe2\xcb\xbd\xf0\x64\xcd\x08\xb7\x6e\x89\x66\xda\x3e\x2d\xd1\x73\x56\xa3\xc9\x57\x35\x97\x06\x23\xb4\x11\xde\x40\x00\x68\xc8\xc5\x63\x3c\x45\x7b\x9a\x48\xb0\x6f\x56\x39\x42\x36\xac\x30\xdd\x52\x77\x75\xaf\x97\xc3\x9c\x3d\x5b\xca\xf0\xcd\x25\x04\x5d\xef\xee\xd3\xb2\xbb\x10\xe0\x4e\x01\x45\xd8\x68\x67\x2a\x77\xfa\xe8\x6e\x53\x70\x25\x14\xeb\x3c\xf2\x54\x45\x1d\x3c\x52\x51\x87\xd9\xa4\x8f\x6c\x0d\xb9\x48\x1e\x32\x02\xb6\xaa\x87\x09\x03\xb0\x94\xf7\x7b\xbf\x1b\x26\x35\xa2\x84\xa7\xc8\xf1\x1f\x3c\x81\xfa\xa0\x6a\x2a\x84\x2e\xc9\x31\xa8\x5d\x84\x2d\xed\xe9\x97\x30\xea\xda\x96\x33\x6d\xdb\x9a\x95\xc3\x0a\x28\x6d\xb5\x10\x9a\x27\x66\xc7\xe7\x12\xf3\xad\xe8\xd2\xb9\x37\xac\x13\x35\x13\x07\x7d\xd5\xcc\x34\x71\x9f\x57\x8b\xbc\xe5\x18\xc4\xd7\x8f\x6f\x95\x48\x6f\x85\x82\x8c\x05\x21\xb6\x18\xe5\x58\xd6\x01\x2d\xea\xd2\xbe\x4b\xf0\x00\x16\x23\x6d\xc6\xa6\xe7\xa6\x12\xfc\x3a\x66\x83\xe9\xa7\xe1\x6c\x78\xc6\x06\xd3\xb3\x10\x21\xee\x6a\x72\x36\x9c\x61\xe9\x32\x95\x9f\x22\x5a\x98\x45\x05\x7d\xdf\x9f\x8f\xe6\x91\xad\x39\x37\x4d\xea\xe6\xfb\x93\x6b\xf6\x87\xd1\xe4\x2c\x62\xc3\x11\xd4\x62\x53\x51\xfb\xf0\x2c\x28\x6b\xf7\x50\xd1\x9a\x95\xeb\x91\x5f\xae\xbe\xf8\xd8\x5f\x10\x90\x5b\xd8\xdd\xf3\xd9\x10\x4a\xac\xcf\x86\xe7\xc3\xc1\x62\x1e\x79\x55\xed\xe3\x61\xc4\xce\x47\x8b\xc3\xd0\x71\xd3\x19\x9b\x4c\x27\x27\xa3\xc9\xf9\x6c\x34\xf9\x30\x9a\x7c\x88\xe1\x15\xc3\xc9\x62\x34\x1b\xb2\xd9\x68\xfe\x07\xd6\x9f\x63\xbd\xfd\x90\xfd\xcf\x55\xdf\x56\xc9\x37\xca\xbb\x9b\xfd\x82\x8a\xf0\xeb\xe9\x55\xcc\xe6\x1f\xa7\x57\x63\x04\xce\x0b\x1e\xd2\x13\x3d\xa4\x7e\x8f\x3e\x0d\x0d\x26\xda\x6c\x38\xbf\x04\xb0\xb9\xeb\xe9\x15\x3b\x9e\x4c\x71\xd8\xa3\xc9\x08\x4b\xe5\x87\x9f\x86\xe3\xe9\xa5\x5e\x44\x2c\x96\x47\x2a\x7f\x0f\xc9\xae\xcb\xfa\xf3\xf9\xd5\xc5\x90\x7a\x35\x5f\x98\xf5\x98\x0c\x07\xc3\xf9\xbc\x3f\xbb\x26\x28\x39\x98\xf6\xd9\xf0\xb2\x3f\x9a\x61\x49\xfe\x6c\x86\xd5\xec\x31\x2e\x7a\xfb\x86\x81\xd2\x7d\xc4\xa6\x9b\xeb\xcd\xa0\x17\x15\xab\xf8\xf5\x04\xdb\x62\x77\xda\x31\x31\x9b\x4c\x0d\xac\x5b\x63\x02\x46\x73\xd6\xbf\x5a\x7c\x9c\xce\x46\x7f\x1a\x9e\xb1\x8f\xc3\xd9\x10\xb7\xdc\xf0\x8f\x83\xe1\xe5\xc2\xdf\x7f\xae\x2b\x31\x41\x41\x2c\x86\xb3\x8b\xd1\x04\xf6\x09\x7d\xd4\xab\xa9\x35\x06\x30\x24\x0c\xfc\xd9\xfc\x13\xbc\xc2\xb5\x10\x90\x19\xd8\x37\x55\x99\x6f\x79\x29\x13\x48\x2a\x20\xc7\xd1\x1a\x02\x6b\xa1\x9e\x8e\x72\x03\x0b\x0d\xe1\x2d\xf6\xa1\xaa\xa0\xcb\x71\x59\x40\x44\x40\x3f\x0e\xae\x77\x1b\xf3\xa1\x2a\x32\x0c\xac\x2d\x05\xe1\xfd\x70\x4c\x0d\x46\x49\x82\xbf\x45\xbc\x69\x97\xea\xaa\xda\xec\x42\x2f\xaa\x84\xe6\x64\xba\xb7\xe3\x44\xd9\xa1\xaa\xe2\x56\x5f\x65\xc6\xe0\x0e\xf2\x95\x7d\x8d\xf0\xb2\xc8\x6f\xa5\x72\xc9\x5b\x11\x5d\xc8\xb2\x60\x19\xc7\x30\x83\x9f\xb9\x21\x33\xca\x4d\x64\x4b\xb1\xcf\x69\xa6\xef\x79\x41\xd8\x1d\x5a\xb0\x53\x73\xb5\x62\x2e\x47\xa9\x65\x74\x69\xfc\x5d\x4b\x28\xe3\x12\x45\x89\xde\x33\x8a\xa7\xf9\x79\x7f\x14\x0b\xf5\x6c\xef\x95\x48\x52\x5e\xf0\x32\x2f\xf6\xda\xd8\xb9\x81\xa7\x38\x86\x73\xbb\xb6\xfe\xaa\xdd\x5d\x10\x66\x93\x1e\xb4\xb1\x03\xf3\x9a\x1a\x84\xe8\x2a\xec\x16\x6d\x7f\xa0\x39\x9a\x18\x67\xb4\xad\x7c\xd3\xd7\xbd\x62\x9d\x4b\xd0\xde\xe4\x8e\x67\x65\xa7\xab\x2d\x0f\x71\x63\x1c\x91\x6f\x59\x0e\x57\x37\xb4\xe0\x3d\xf7\xa4\x3d\xfb\xb4\x3d\x69\xc1\x4e\x91\x5f\x35\x48\x31\x22\xbf\x7e\xf6\x40\x3c\xdc\x7b\xad\xee\xb1\x1e\x55\x4b\x58\x9c\x14\xe8\xd3\xf8\xb4\x7d\xa1\x23\x56\xed\xf2\x8c\xbd\x7a\xc6\x56\x5a\xff\xa4\x5b\x0e\x6e\xd7\xe0\x05\xf6\xf0\xed\x8a\x1c\xcc\x5a\x79\x2b\xd2\x7d\xc4\xaa\x2c\x15\x4a\xe9\x43\x48\x47\xc8\xb4\x84\x07\xa7\x10\x89\x90\x3b\xb8\x15\xa9\x69\xdd\x4f\xcc\x9c\x7a\xcb\x8e\x65\x97\x3c\x3c\x32\x03\xb8\x16\xf2\xaa\xec\xf8\x3e\x78\x3b\x67\xdb\xaa\xac\xb0\x98\x5d\x3f\x0e\xc7\xd3\x3b\xa9\x94\x1e\x6f\xcc\xf5\x82\xed\xb8\x2a\xf1\xc0\x63\xe2\x5f\xa5\xee\xc9\xb2\xac\xcf\x26\xd6\x42\x49\x89\x75\x2f\xab\x82\xdf\x19\xdd\xcc\x6e\x79\xdc\xcf\x75\x2b\xff\x40\xd6\xa8\xdd\x7d\xf5\x17\x81\xc2\x5a\x9b\x36\x3b\x51\x51\x28\x8c\xcc\x10\x01\x69\x8a\xef\xf1\xbc\x38\x64\x21\x90\x2c\x5a\xfd\x08\x27\x6a\x85\xab\xeb\xcd\x2e\x29\xef\x44\x43\x6c\xb2\xff\x1a\x43\x23\xbd\xd6\x4c\x40\x16\x1d\xc8\xcc\xf8\xe6\x4d\x18\xca\x6e\x4f\xa6\x13\xfa\xd9\xd7\x9d\x2c\x82\x42\x0d\x9c\x18\xb3\x7b\x76\xa2\x90\xf9\xca\x40\xfd\x68\x03\x71\x99\x5b\x29\xf5\xdc\x48\x29\x14\x47\xf7\xca\x22\xb3\x26\xc1\x36\xf3\x8f\xf8\x2f\x70\xb6\x29\x82\x80\xb9\xe7\x66\x9a\x0b\xa1\xf2\xf4\x56\xac\x5c\xac\x77\xb9\xf7\xf1\xa6\x94\x28\x4b\xcc\x36\xe8\x12\x32\x06\xed\x34\x12\xc5\x34\x55\x6d\x23\x75\xab\x4a\x52\x05\xfd\x6b\x76\x4f\xdd\xf2\xb4\x12\x35\xa5\xfb\x7e\x39\x73\x30\xef\xc6\xe1\xbe\x95\xfc\x8b\xc8\x10\x17\x8f\x27\x40\x2e\xad\xb7\xdf\x4a\xe0\x52\xdb\x9c\xd0\x2d\x7c\x93\x17\xae\x13\x38\x4f\xb8\xb3\x73\x6b\x60\xd0\xd2\xbe\x60\x23\xec\xbe\xb8\x25\x3f\x8b\x7f\x85\xd5\xba\xf5\x03\x76\x4b\x5f\x5b\x94\xf0\xa0\xfb\x26\x0c\xf8\xa0\x2d\x49\xd1\x27\xc4\xe0\x53\xba\x9b\xc9\x43\xfc\x83\xd3\x56\x08\x25\xd2\x54\x14\xaa\x4b\x97\xb8\x0b\x69\xdd\xf2\x54\xae\xbc\x9b\x9c\xfc\xde\x64\x75\x79\x2d\x79\xba\x8c\x5b\x43\x6f\x00\xa1\x0a\xe0\x7d\x03\xc3\x7f\x13\xfb\x20\x51\x3e\xf0\x6f\x4c\x9a\xd7\x64\xca\x06\xa3\xd9\xe0\xea\x62\xbe\xd0\x8a\x2e\x22\x43\xdb\xaf\xd0\xe5\x86\xb8\xc1\x0e\x72\xe9\x1e\x60\xa5\xc8\xc3\x5f\xf2\x41\x81\x23\x42\x90\xba\x9e\x5e\x45\xed\xaa\x6e\xd4\xae\xe8\x46\x16\x2f\x6a\x34\x37\x9f\x21\xcc\x93\xd3\x31\xed\x33\xf3\xab\x4b\x6d\x73\xcc\x8c\x22\x6a\x10\x83\xc1\x2a\x18\xce\x23\x0f\xb8\x6a\x31\x85\x27\x2e\x87\xb3\xf9\x74\x62\x61\xac\x1c\x08\xb4\x07\x68\xe5\xd0\xa0\x0f\x63\x5a\x91\xe2\xfb\xb1\xaf\x87\x0e\xa8\x54\xf7\xda\x3c\xe6\x77\xfa\xbd\x06\xe6\xea\xc3\x74\x7a\xf6\x79\x34\x1e\x47\xec\xf3\x74\xf6\x07\x36\x5f\x4c\x2f\x2f\xfb\x1f\x86\x7a\x46\x2f\x2e\xaf\x74\xa3\xe7\xfd\xd1\xf8\x6a\x06\x16\xcd\x45\x7f\x7c\x7e\x35\x19\x60\x6b\xd4\x79\x00\xee\x1e\x8f\xed\x1c\x5e\x68\x23\xa9\x86\xbc\xa5\x5f\x06\xf0\x63\x04\xb7\x6c\xa7\xe7\x9a\x16\xe8\x63\xff\xd3\x90\xbd\x1f\xea\x6f\x27\xda\xfa\x79\x0c\x14\xf3\x3c\x36\xe6\x40\xeb\x56\xa3\x96\xb5\x91\xd3\xbf\xbc\x1c\x5f\xeb\xb9\x77\x5f\xea\x29\x38\x1b\xf6\x17\x1f\x09\x51\x6b\x3e\x9d\xf4\xc7\x6c\x34\xf9\xf1\x6a\x76\x5d\x47\x04\x73\xbd\x7d\x32\xf7\xe1\xa7\xc9\x78\x1b\xfe\x71\x31\x9c\xe0\x4b\x46\x03\x58\xe5\x71\xff\xb3\xb6\xc0\x3e\x8e\xde\x8f\x16\x73\xfc\xb9\xeb\x64\xcc\xe6\xd3\x8b\x21\xfb\xf1\x6a\x36\x9a\x9f\x8d\x60\x2e\xe7\xec\x6c\x8a\x1d\x1d\x8f\xa7\x9f\xa9\xd1\xc1\xf8\x6a\x0e\x63\x9a\xd5\x46\xe8\xb6\xc6\xc1\x9d\x11\xb1\x39\x01\xb9\xb9\x76\xf4\x3a\x79\x0d\x5d\xf4\xaf\xc3\xb9\xd1\xf6\x24\x14\xd0\x3f\x8b\x91\x72\xff\x83\xde\xeb\x13\x80\x0d\x1f\xea\xd3\x39\x1f\xce\xe6\xe8\x2d\x6d\x84\xad\x59\x27\x71\x05\x42\xb2\x14\xdb\xa8\x83\x08\x37\x1c\x35\x31\x66\xaa\xc8\xd1\x0d\xf1\xe2\x07\x36\x88\xcf\xe3\x59\xac\x05\xf2\xb3\x1e\x3b\x9e\x26\x65\xcc\x7a\x6f\xde\xbc\xec\x46\x10\x6a\x46\x8f\xa7\x96\x9a\x7e\xc3\x0d\x8c\x8e\x0e\xc8\xbb\x7b\x1f\xa9\x21\xba\x42\xb7\xbc\x40\x15\x2f\x1c\xb4\x9f\xeb\x55\xef\x34\x3e\xed\x9d\xb2\xe3\xb9\xd8\x99\x7e\x41\x5a\x9b\xee\x17\x66\x3f\x96\x9b\xe6\xe3\xba\x2f\xde\xc8\x4e\x5f\xc7\xaf\x4f\x9f\x9d\x9e\xf4\x58\xb9\x29\xf2\xea\x66\xe3\x3e\x7a\xc1\x8e\x7f\xac\x32\x61\x46\xac\x45\x29\xce\x38\x38\xe0\xe0\x42\x19\x66\x2b\x76\xa5\x84\x16\xe9\x08\xba\xd1\x16\x09\xcb\xb4\x46\xb2\xc9\x55\x4b\x04\xd6\x07\xab\xe9\xc5\xec\x62\x34\x1f\x0c\xc7\xe3\xfe\x64\x38\xbd\x9a\x87\xc6\x6c\x90\xa2\x27\xd0\x1c\x15\xa5\x77\xdb\xe8\x15\x49\x44\x91\x21\x0c\x28\x56\x8f\x6e\x21\x31\x97\x11\xf0\x93\x56\x63\x10\x9c\x86\x2c\xbd\x16\x98\x03\xb6\x11\xa9\x71\x2a\x55\x99\xc8\xd6\x79\x91\x08\xcc\xa9\x87\xf5\x70\xbf\xf5\x10\x59\x09\xbf\x18\x07\x1a\x04\x47\x82\xfc\x46\xe3\xa6\xf3\x5a\xad\x05\x22\x6c\x9b\xbe\x8f\x73\xc0\x53\xb9\xce\x8b\x4c\x72\x96\xf2\x3b\xd7\x03\xe5\xbb\x11\xbd\x77\x7a\xde\xdf\x94\xdf\x45\xda\x86\xe0\xd9\xde\xc6\xf3\x95\x73\x1c\x76\x21\xd1\x91\x2e\x68\x62\x6a\x58\xa7\x32\x29\x4f\xf2\xf5\x49\xf8\x2e\x3c\x51\xbc\x1e\x52\x11\xec\x2a\x83\xd0\xcf\x84\x94\xff\x41\x9e\x69\x4d\x82\xc0\xab\x07\x84\x89\xa0\x6c\x4c\x71\x94\x95\xa2\xc0\x3b\x98\xa7\x6c\xce\x31\x61\xf0\x43\x9e\xaf\x20\x79\x59\x7c\x05\x80\x8d\x74\x4f\x1d\x13\x2b\xac\x4b\xd1\x9d\x09\x83\x75\xa8\x33\xd8\x31\xb9\x2c\x03\x9e\xdd\x54\x1c\x53\x50\xb9\x03\x65\xb0\x33\xab\xcf\x6d\x59\x54\x5a\xc5\x25\x55\x15\x72\xeb\x0b\xb4\xab\x9c\xbf\x11\x1d\xd3\x58\x7e\x5c\x43\xa9\x39\x8d\xc1\x43\x35\x9d\x58\x89\xaf\xc5\x34\x42\x59\xc6\xac\xaf\xd8\x52\x94\x77\x5a\x8f\x69\x0f\xa7\xd7\xcc\x19\x53\xb7\x4c\x05\xce\xaa\x51\x31\x41\xe1\x71\x88\x0d\xf3\x2d\x07\xdd\x17\x83\xea\x87\xd3\xf6\x01\xc8\x16\x81\x7a\xaa\x52\xa6\xf2\x1f\x76\xcd\x82\x8c\x91\x46\xf0\x19\xb4\x7c\x93\x1b\x80\xa8\x5c\xfa\x08\xb7\x0f\xc4\x1f\x44\x88\xb0\x6a\xca\x41\x68\x20\x94\xa2\x06\x79\x37\xe2\xef\x95\xc4\x5c\x0a\xa8\x27\x8e\xd9\x24\x2f\x21\x60\x44\xee\x24\x89\x19\xee\xd9\x0a\xc1\x59\xec\xba\x39\x77\x2f\xac\xa0\x84\x28\x23\xa2\x58\x19\xbc\xd7\x7c\xed\xf2\x0e\x70\xa5\x9e\xc7\xec\x42\x5f\x91\x97\xe3\xe1\x09\xb9\xe3\x50\x29\x8a\x5b\x86\x04\xe9\x38\x42\xc9\x1b\xb4\xc7\xbd\xaa\xd6\x86\xd7\x89\x2b\xd6\xb9\xa8\xd2\x52\xee\x52\x71\x42\xf3\xb7\xea\xc4\x6d\x1f\x5a\x0c\x20\xda\x9f\xcd\xf7\x22\xd5\x8d\x82\x30\x49\x99\xd3\x7a\x3d\xd0\x01\x5c\x3e\x2f\xc7\xe7\x50\xfd\x19\x24\xcd\x64\x18\xcd\x71\x58\xc7\x46\x24\x38\x7b\xef\x60\x56\x05\xb9\xe9\x9b\x81\xe5\x1a\xb6\xdb\x8b\x98\xf5\x07\x83\xe1\x25\x28\xca\x35\xb1\xa6\xef\x5e\x53\x98\x45\xba\x3c\x79\x17\x11\xcd\x9a\x2a\xa5\xf3\xa2\x9e\xfc\xd0\xc0\x47\x02\xf1\x8d\xc0\x2f\x31\x1b\xfe\x11\x54\x17\xd6\xc7\xd8\x68\x4b\xc0\xe2\x68\x51\x43\x00\x83\x29\x82\xb1\x10\xb6\xf5\xdf\x3c\x1f\x43\x4b\x0b\xcc\xa1\x4d\x3e\xa3\xa8\xaa\x41\x8e\xeb\xbe\xb3\x81\x2d\x2d\x2f\x10\x39\xc6\xb4\x4e\x82\xf9\x40\xb2\x94\xf5\x39\x9a\x10\x23\x56\x1f\x04\xe5\x8f\x2e\x42\xc8\xcb\xa3\xbb\xbb\xbb\x58\x65\x92\xc7\x79\x71\xf3\x54\x6d\xe5\xd3\x95\x59\x1f\xf5\x34\x91\xdb\xa7\x47\x96\x7f\xb3\x1d\x06\xda\x5b\x88\xb0\xd0\x53\x9f\x48\x13\xcb\xa0\xfa\xfe\xfb\x63\x19\x54\x9c\x47\x72\x9a\x8a\x2a\x53\xa9\xe5\xf4\x5c\x88\x30\x80\x4c\x5b\xd0\x72\xf4\x58\xd1\x8c\xb7\x9b\x07\x5f\x84\x50\xe7\x2e\x1f\xa2\xd1\x73\x5c\xc9\x30\x9e\x24\x15\xc3\x8f\x5b\xdc\x94\x6d\x60\x14\x52\xb1\x3f\x6b\x6b\x61\x3c\x5c\x0c\x41\xeb\xfc\x0b\x8b\x8f\x3c\x19\x76\xac\xba\x6f\xd9\x5f\x1f\xf5\x17\x1f\xcd\x04\x5f\x61\x7a\x31\x5f\x6a\x61\x1b\xc0\x59\xf3\x92\x6d\xca\x72\xf7\xf6\xe9\xd3\xfb\x16\x2e\xdf\x89\xec\xaf\x88\x9b\xf5\xf4\x37\x40\xd7\xf2\xb3\xff\xc5\x4f\xc7\x72\xb9\xcb\x6e\x7e\x49\x04\xe0\x07\xf8\x5f\x5e\xbf\x7e\xfd\xa2\xc1\xff\xf2\xea\xf4\x3b\xfe\xef\xaf\xf1\xb7\x30\xfc\x09\xce\x55\xa6\xb7\x03\xb9\x24\x41\x1d\xb4\x29\xa8\x5a\x96\x40\x7c\x1c\x0a\x59\x32\xa0\x1d\x83\xd4\x37\x00\x7b\x25\x2f\xd7\x4a\xaa\xa4\x10\x3b\x9e\x25\x7b\xab\x82\x59\x92\x06\xab\x7a\xd9\xe6\xbd\x8b\x4d\xef\xc2\x0d\xde\xd1\x52\x35\x52\xab\xa8\x5f\xab\x00\xde\x1e\x75\xcd\xd2\x29\x8d\xbb\x42\xdc\x72\x99\xc6\x47\x8e\x67\x6b\x32\x5d\x8c\x06\xc3\xc8\x8b\xdd\x61\x4e\x36\xa9\x22\x6f\x8f\x46\x6b\xbc\x43\x30\x81\x83\xde\xb3\xb7\xb5\xe0\xe8\x6d\x75\x65\xde\xb6\xeb\x5b\x28\x88\x86\x9c\x52\x47\x91\x82\x0c\x69\x42\x5f\x76\x89\x20\x48\xf6\xa4\x0e\xb1\xe9\x24\x2b\xbd\xcd\xfa\x03\xe9\xbf\x6d\x3a\x50\x2f\x3e\x8d\x5f\x45\xac\x5f\xdd\x54\xaa\x64\xbd\x97\xc0\x07\xfe\x22\xb2\x66\x62\x2f\x7e\x11\xbf\x8c\xd8\x99\x48\xc4\x76\x29\x0a\xf6\x46\x3f\xd0\x7b\x16\x51\x3d\x53\x8d\xb4\xe7\x05\xfc\xfc\xd5\x89\x7e\x84\x7d\x48\x45\x96\xb1\x19\x87\xac\xad\x93\x4b\xb1\x29\x94\xa1\x8a\xa8\xdf\x61\x3c\x49\x20\xf3\xcb\x66\x85\x42\x3d\xb8\x47\x74\xe7\xb1\x64\x68\xb5\x0c\x47\x71\xa2\x3b\xff\xd2\x5d\xb8\x6e\x92\x3c\x5c\x3d\xbe\x5a\xa1\x42\x89\xb3\x81\xfc\x7a\xf6\x3e\xd0\x0f\x23\xd5\xb9\x3a\x1a\xe4\x6a\x2b\x33\xb6\x28\xaa\x92\xb7\xcc\xd3\xb3\xf8\x75\xc4\x7e\xac\xd2\x3d\xeb\xc1\x28\x9f\xf9\x93\xa4\xfb\x71\xc2\xa6\x49\x99\xeb\x49\x7a\x0e\x0f\x9c\xc2\x24\x35\x99\x8d\x9e\x9d\xe8\x2f\x7f\x95\xe9\x79\x16\xbf\xba\x7f\x7a\xd4\x37\xcc\xcf\x5c\x6e\xf3\xec\xe4\x52\x8a\x42\x2f\x3d\x5f\x49\x51\x7d\x3d\x1a\x16\x32\x61\xf3\x98\xcd\xf8\x7e\x9b\x67\xab\xa3\x0f\x32\x4d\x85\x62\x9f\xf2\x34\xe5\x59\x79\x64\x19\x77\xc2\x0e\x98\xdd\x6e\xa3\xbd\x6e\x2c\x6f\xf5\x65\x5f\x10\xbc\xa8\x2d\xe3\xb0\x66\x1c\x56\x28\x8a\x42\x58\x55\x0b\x04\x86\xc8\xfe\x96\xef\x0d\x76\x1f\xed\xfb\x42\x1b\xe4\x5e\xf8\xd2\xf7\xee\x83\xa1\xdb\x7c\x0b\xf2\x62\xe8\xf6\xd6\xeb\xbc\x28\xbd\x08\x0f\xb6\x06\xa1\x74\x4a\xa1\x35\x79\xac\x7b\x0c\x99\xd9\x5c\x35\x87\x58\x58\xb0\x4c\x88\x95\x22\x35\xd9\xb4\x21\xeb\x54\x8c\x5a\xac\xac\x79\x95\x96\xca\x41\x72\xfb\x3c\x36\xf9\x9a\x29\x5e\x4a\xb5\xe6\x50\xb8\xc6\xfe\x5e\xf1\x14\x60\x09\x3d\x06\x9b\x48\xef\x91\xaa\xe0\x09\xd1\xa9\x60\xff\x11\xa5\x92\x66\xbf\x52\xa2\x68\x9e\xff\x67\xf1\x1b\xbd\xad\x79\x56\xe9\xbe\xf5\xde\xbc\xf9\xc1\xdf\xd6\xcf\xb4\x6c\xb8\xe0\x45\xb2\x61\xa7\xcf\xcc\xae\x6f\x6e\x6a\xfc\x59\xef\xcd\x9b\x37\xbf\xc2\xae\x7e\x16\xbf\x79\x15\xfd\x6c\xbb\xfa\xed\xd1\x22\xdf\xb2\x31\xcf\xc4\x51\x6b\xd7\x8f\x3e\xeb\x0d\xbd\x65\xb7\x3c\x63\xf3\x64\xc3\xe5\x97\x96\x29\xfc\xe1\x8d\x96\x0c\xe8\x43\x7b\xe5\xe6\x0f\x7b\x7a\xc1\x61\x5e\x5f\x1f\x98\xb8\x57\x30\x71\xaf\x59\x3f\x5b\x15\x82\x2b\x76\x26\x6f\x6e\x44\x71\x74\xf6\x73\x4c\xd4\x0f\x3f\xfc\x9c\x13\xf5\x63\xbe\xc9\xd8\xfb\xfc\x2e\x15\xc5\xd1\x1f\xc4\xad\xcc\xd8\xfb\x82\x27\x62\x7f\x34\xe7\x5b\xf6\xbe\x52\x1b\x91\xa6\x47\x17\xfc\x26\xab\x14\xfb\x98\xa7\xdb\x9b\x42\x64\x47\x1f\x0a\x71\xc3\x66\xb9\x48\xf3\xb5\x82\xa9\x5e\xf0\x2c\x13\x45\xcb\x24\xbe\xb4\x53\xf5\xd2\x9f\x42\x3d\x06\x6f\x7b\xbe\x3a\x30\x8d\x2f\x61\x1a\x5f\xb1\x0f\xd5\x9e\xa1\x4c\x4a\x36\x3c\xcd\x78\x19\xb1\x0f\x45\x5e\xed\xd8\x8b\x53\xe2\x8f\x3b\xa7\x33\xdd\x40\x16\x75\xd4\x4c\xde\x7c\x46\x1e\x24\xbf\x37\x1b\x1d\xdf\x89\x4c\x99\x9a\x6e\x82\x95\x40\xbf\x8c\x9b\xe7\xb7\x47\x6e\x7d\x53\x58\x5f\x7e\x2b\xf4\xc9\x2a\x65\xb6\xe2\xa9\x38\x6a\xf4\xfb\xe8\x92\x57\xa9\xfe\xaf\xad\x5c\x95\x47\x0b\xb9\x65\x9f\xc5\x8d\x9e\x39\x6d\x0b\x5d\x4e\x3e\xb0\x99\x30\x62\x70\xec\x24\x8b\xaa\x20\xc9\x79\x65\xcc\x3d\xe3\x22\x6f\x8e\x00\x06\x19\x4e\x8d\xdd\x52\x20\x92\x48\x28\x02\xd4\x2b\x19\x82\xe8\xac\x21\x53\xd0\xab\xfa\x8a\x5a\x81\x97\xf5\x9c\xb8\x46\x00\x11\x55\x14\xc9\x86\x67\xa5\xad\x1a\x01\x50\x49\xb6\x96\x65\xa6\xcd\xcc\x86\xe9\xff\x2d\x7d\xe7\x4a\x55\x5b\xad\xf7\x79\x55\x29\x6b\xf0\x35\x20\xf0\xab\x83\x80\x95\x59\x02\xd8\xf7\x3c\x25\xd7\x88\xfe\x87\xf8\x2a\xb6\xbb\x94\x17\x88\x4d\x9b\xe4\x19\x25\xf4\x6a\x8b\x93\xfc\x71\x7e\x81\x15\x15\x9b\xd8\x3c\xca\xca\xe1\x90\xb5\xae\x4d\x64\x91\x4d\xf8\x0a\x73\xb3\xe9\x69\x2c\x1f\xb0\x50\x3d\x98\x41\x0f\xef\x8b\x8f\x2e\x03\x92\x23\x1f\xe5\x10\x8f\x2c\xb8\x53\x90\x60\xcb\xa0\x08\x36\x4a\x4b\x80\xb0\xc7\xe3\x94\xf3\x91\xdc\xd0\x61\x1e\xd5\xe7\xdd\xad\xe6\x5a\xd4\xd1\x5c\xfd\x5d\xee\x91\x66\x29\x43\xd3\xb7\xf0\xd0\x36\xd6\x8d\xd7\x63\x6a\x15\x91\x18\x6d\xa5\xb2\xde\x7e\xb1\x32\x84\xfa\xfd\xb4\x04\x5f\x90\xe3\x1a\xa4\x12\x82\x5d\xca\x65\x96\xee\xd9\x96\x17\x5f\xf0\xcc\x61\xc4\xdf\x14\x3b\xb4\xb6\x0a\x09\x01\xc2\x84\xcd\x6d\xc1\x3d\x76\xc9\xe0\x81\xc1\xed\x3c\xa8\xf3\xb2\x79\x74\x4b\x85\xd8\xe6\xb7\x84\x22\x4d\xdd\x83\x85\x87\xd4\x6f\x1c\x9d\xf7\x15\x7d\x12\x92\x2b\x7f\xcb\x4e\x36\x9e\x14\xc8\xf1\x40\xb7\x61\x6d\x49\xe0\x86\xcf\x92\xbc\x82\x84\xe6\x60\xff\xd5\x26\x1c\x6a\x89\x92\x7c\xbb\xcb\x01\x2b\x06\x20\x7c\xa0\x1c\xd6\xcc\x89\xde\xad\x60\x1c\x11\x43\x15\xfa\xb2\x4c\x04\xcb\x90\x34\x43\x50\x45\x5b\x2c\xd6\xff\xe5\xbf\x04\xcb\xf9\xf1\x51\xad\x88\x18\x80\x08\x64\xc9\xc3\x5c\x18\x07\x47\x5f\x95\xae\xd8\x9e\xef\x76\x85\x40\x04\xf3\xf8\xa8\xcf\x3a\xbb\xec\xe6\xaf\x37\xa2\xfc\xab\x15\xc5\x1d\xb6\xae\x32\x9b\x63\xe6\x41\x1f\x21\x80\x2a\x59\x89\xa5\x21\xc6\xec\x80\x9b\xa6\xc3\x96\xf9\x57\xe1\xea\x6d\x52\xf9\x45\xbc\x3d\xda\x15\x32\x2b\xd7\xc7\x9d\xff\xa5\x3a\x51\xe3\x3d\xc7\x93\xab\xf1\xb8\xdb\x7d\x77\xd4\x4f\x55\x1e\xd9\x99\x49\xf3\x9b\x9c\x1d\xcb\x0c\xa7\x09\x66\x28\x42\x80\xfe\xaa\x50\xa2\x1b\x48\x5c\xcf\xd2\x54\x30\x92\x25\x2f\xe2\x5d\x76\x43\x71\x41\xfa\xe0\x6f\xbb\x1b\x76\xfc\xc3\x0f\x5f\x9f\xf7\xba\xf6\xf3\x2c\xbf\xc3\x07\x8f\xdf\xc0\x17\xf1\x11\xba\x4c\x74\xf3\xd3\xf9\x88\x0d\x44\x41\x44\x1d\x1e\x63\x2a\x33\xce\xc0\xf8\x9e\x67\x20\x1c\x9a\xe0\x57\x14\xd0\xd1\xe7\xc7\x7a\xce\xbc\x47\x47\x94\x10\x73\x2b\xe2\x03\x9a\xd0\x8d\xfe\xb4\xd8\x31\x5e\x22\xd5\x63\x8c\x7b\x60\x9d\x17\x37\x22\xce\x44\x79\x54\x37\x12\xc1\xdd\x15\x3f\x5d\xe9\xf3\x98\xe8\x35\xfe\xeb\xf8\xc3\xe5\xf8\xe4\x34\xee\xfd\x3f\x3f\xaf\x37\xe8\x7e\xff\xcf\xab\xd3\x57\xa7\xa7\x35\xff\xcf\x8b\xd3\xd3\xef\xfc\xbf\xbf\xca\xdf\x87\xc9\x15\x1b\x0f\xe7\xf3\xe1\x8c\x7d\x18\x4e\x86\xb3\xfe\x98\x1d\xa0\x7a\x3a\x8d\x7b\x11\x3b\x17\xcb\xc2\xe8\x7a\x6f\x7c\x35\x6f\x00\x6a\x5e\x8f\xcc\x8c\xf3\x42\xb8\x13\xc0\xce\xf3\x2a\x5b\x91\xd6\x01\x3a\xde\xcb\x1e\x3b\x2f\x78\xf6\x25\x95\x19\x9b\x97\x85\x10\x65\xc4\xce\xe5\xba\xdc\xb0\xf3\x34\xcf\x8b\x88\xbd\xcf\x55\xa9\x9f\xbe\xe8\xb3\x67\xa7\xbd\xde\xb3\x93\xde\xf3\x67\x3d\x76\x35\xef\x1f\x0d\x6f\x45\x01\x78\x71\xda\x4e\x03\xe1\x5b\x9a\x80\x14\xb9\x97\xbc\xfb\xf5\x56\x14\x4b\x5e\xca\xad\xc1\xf0\xa9\xd1\xf9\xd9\x78\x3f\xf2\x2a\x02\x9c\x17\x06\x61\x5d\xe9\x4b\x9a\xdf\x69\xe1\xf7\x67\xb8\x85\x24\x69\x92\x00\x76\x6a\xbd\x39\xf5\x9a\x22\xad\x89\x15\xec\xc3\xe5\x38\x66\x23\x02\x02\x81\x54\x31\x65\x34\x51\x55\x25\x89\x50\x2a\xb7\x2e\x72\x58\x04\xd2\x12\xc3\xd0\x47\x64\x5b\x3f\x8d\xd8\x06\x54\x96\xb2\xc1\xf0\xaa\x97\x26\xfe\xcb\xd1\x65\x21\xf8\x76\x99\x0a\xb8\xcd\x6c\xc6\x1b\x10\x5a\xe4\xaa\x74\x59\x0e\xc8\x8e\xa4\xe4\x4d\x46\xa6\x05\xff\x22\x18\xbf\xe3\x7b\xb4\x95\xd7\x85\x10\x2b\xc4\x69\x02\xc4\x7b\xe4\x33\x00\xa8\x33\x26\xcb\x98\xbd\x37\x28\xfb\x0a\xf3\x79\xa1\xf7\x1f\x90\x90\xa9\xd6\x7b\x45\xc5\xea\x14\x49\x2c\x73\x76\x53\x71\x50\x90\xc4\xc3\xef\xd2\xdf\xd9\x4e\x9f\x9c\x98\xd0\xbd\xad\xa5\xf5\xb9\x1e\xe0\xd9\x35\xd5\xa0\x4a\xe4\xd2\x28\x14\xb9\xdf\x3c\xa2\x65\xb7\x3a\xad\xfd\x8d\xfc\x22\x44\x28\x6b\x25\x05\x34\xf5\x82\x92\x2b\xf7\xe6\x1d\x4f\xbe\x68\xd5\xf3\xe4\xa4\xdc\xef\x48\x23\xb0\xb4\xa3\x27\x27\xb4\xba\x87\x0e\x83\x63\xdc\x65\x9c\xd4\x8d\xbb\x4d\xce\x56\x42\xeb\xbf\xae\x46\x0e\x03\x54\x09\xcf\x4c\xcd\x5c\x99\xe7\xb8\x61\xef\xf4\x6c\xdc\xdc\x08\x05\x65\x4b\xb4\x2d\xcb\x8d\xcc\xbe\xb0\x84\x17\x62\x5d\x41\xaa\x2c\x44\x46\x0c\x45\x42\x9d\xf0\x13\xf5\x2e\x2a\xea\x6c\x9f\x14\xb3\xeb\x97\x02\xfd\xac\x65\xc1\x4b\x71\xb3\xb7\x1d\xcc\x2c\xeb\x0e\x79\x58\xb0\x02\x7a\x09\x67\x83\xf0\x23\xc5\xd7\x5d\xca\x33\x8a\x2b\x2d\x45\x9a\xdf\xc5\x47\xc0\x42\x74\x07\x53\xcc\xe1\xca\x0b\x16\x3c\xd2\x5f\x21\x4e\xd5\x5a\x14\x05\x59\xd7\x66\xbf\xe4\x6b\xd4\xae\x01\xc9\xa8\x00\xc4\x9f\x69\x75\x68\x55\x55\x63\xc7\xfb\x1b\x09\x6b\xbe\x30\xef\x11\x0e\xb7\xdb\x92\x9e\x24\x71\x02\x24\xe8\x25\x3b\xa6\x0d\x5b\xdc\x98\x50\x1b\xb8\x7f\x91\x7b\x5c\xa2\x52\x76\x27\xd5\xa6\xfb\xce\xbd\x0a\xd2\xc6\x6f\x03\x32\x69\x30\x6a\x78\xc6\x6e\x44\x09\xd2\x87\x7e\xc8\xb5\x82\x56\x7a\x3f\xd5\xcf\xd0\xf1\x08\x8e\x00\x71\x4f\xb3\x9d\x14\x09\x76\x13\xa0\x29\x91\x26\x49\x77\x98\x50\xc4\xd4\x3b\x87\x06\xb1\xb7\x58\x12\x94\x39\x13\xbc\x65\x05\xe6\x04\xaa\x93\xd9\x8d\x3e\x4a\xb9\x6e\xa4\xd4\xa6\x06\x1c\x5d\x0c\x1a\xc2\x32\x65\xc2\x9b\x56\xdf\xec\xc0\x26\xd7\x79\xb1\x94\xab\x30\xf7\x54\xcf\xae\xc8\xf6\x18\x6e\x87\xf7\x38\x30\x23\xa8\x50\xf8\x62\x22\xf1\xaa\x2a\x0a\x61\xfc\xe5\xf6\x39\x30\x65\x54\xfd\x6d\x05\xcf\x54\xca\x09\xfc\x11\x39\x56\xc3\xfc\x07\x49\x02\x71\x8f\xc1\xef\x7d\x08\x33\xe1\xdf\x12\x81\x8b\x52\x06\x11\x02\x59\xa2\x97\x42\x7c\xe5\xdb\x9d\x56\x76\x1f\xd9\x92\x23\x2a\xb9\x29\x78\x89\xfc\xc7\x58\x63\x0d\x56\xc3\xde\x94\x4d\xde\xc8\x5b\x83\x16\x60\x31\x93\xb4\x5c\xf3\x92\xd4\x61\x5e\xef\x04\xbb\xd1\xbb\x76\x9f\x57\x75\x50\x23\xb7\xb7\xcb\x8d\xd8\x47\x28\x32\xcc\xbe\xf3\xf6\x5a\x19\x72\x9a\x5b\x3b\x22\xd5\x32\xc4\x03\x4f\xb0\x5e\x2a\x3b\x14\xdb\x5b\x72\x96\xba\x5c\xb0\x1c\xed\x51\x54\xb4\xc9\x2a\x75\x23\x89\xfc\xea\xcf\x3d\x74\xa4\x10\xf0\xba\x72\x23\xb6\x8d\x17\x51\xa5\x05\x21\x0f\x1a\xc4\x4e\xeb\x0f\xa3\x67\x20\x91\x19\xe9\x92\xf0\xfe\x8e\x59\x3f\x5b\xb9\x3e\xaa\x4d\x7e\x87\xed\xd3\x9e\x86\x7c\x3e\xe8\x88\xd8\x23\x34\x21\xd6\x18\xd1\xe6\x3a\xfa\x2c\xda\x36\xfb\xff\xcf\xde\xbb\x2e\xb7\xad\x64\xe9\x82\xff\xf5\x14\x39\x8a\x39\xc7\xe2\x04\x44\x5b\xf2\x65\xd7\xb6\x4f\x74\x04\x2d\x51\x36\xab\x28\x52\x4d\x52\x76\xa9\xff\x4c\x83\x64\x52\x42\x19\x04\x58\x00\x28\x99\xf5\x42\x13\xfd\x1a\xe7\xbc\xd8\x44\xae\x4b\xe6\xca\x04\x48\xd1\xde\xb6\xf7\xae\x2e\x2b\xa2\xa2\xb6\x25\x12\xc8\x7b\xae\xcb\xb7\xbe\x8f\xe2\xc1\xaa\x7a\xc8\x8f\xcb\x4a\xaf\x48\xbb\xea\xb5\x3a\x3a\x69\x99\xd9\x70\x11\x2a\x6f\xa8\xa0\x54\xf4\x14\x3e\x81\x24\xc8\xb8\xe8\xe5\xcd\x84\x91\x0b\x33\xf1\x88\x40\x41\x2d\x1f\xa1\xa2\x4c\x06\x8e\x94\xea\xe6\xc2\x03\x51\x78\x4c\xaf\xf4\x36\x2b\xc0\x9a\xc4\xde\x83\x1d\xfb\x40\x25\x0d\x0c\x86\x43\x56\x67\x57\xb8\x5a\x35\x45\xdf\x19\x4a\x00\x07\x0a\xbf\x4a\xa1\x47\x96\xf8\x7b\x26\x29\x5d\x5d\xf2\x74\x03\x57\xa9\xb1\xd9\x74\x4a\x08\xa7\x55\x8c\xd1\x2a\x2e\xbd\x70\x0b\x9d\xa4\xf2\x69\x4e\xcc\x2a\xb7\x6b\x05\x8e\x68\x32\xcc\xbc\x78\x81\xa5\x0e\x92\x85\xc5\xf6\xaf\x78\xb7\x3e\x29\x55\xa1\x57\xeb\x8a\xc5\x05\x08\x60\x66\x9c\x5c\x28\x20\x23\x2d\xfe\x22\x9f\xa6\x7a\x49\x1b\x6c\x09\x73\x09\x34\x0d\x15\xea\x41\xc0\x87\x50\x24\xbf\x7d\x70\x61\x1e\x9f\x6e\x22\x69\x0f\x20\xc6\x05\x09\xae\x11\x23\x85\x1c\x80\x85\x8e\x05\x42\x10\xa0\xa1\x33\x9b\x32\x95\x27\x74\x5b\x7d\xd4\x70\x63\x34\xdc\x53\x18\x2a\x80\x9a\x67\x14\xb3\xb6\xbc\xfc\xe9\xc6\x9e\x84\x36\x99\xc0\x62\x7b\xe2\xe1\xd0\xfa\x29\xcb\xee\xc5\xee\xf4\xbc\x17\xc4\x40\x10\x3a\xe1\x92\x8b\xbb\x3c\x05\x8e\x6c\x48\xc7\x2c\x72\xba\x97\x13\x40\xb7\x3a\x0e\x9d\x80\x9d\x1f\x5f\x61\x19\x24\x6a\x05\xd0\xb8\x46\x24\x5d\x94\xc4\xca\xc2\x12\x5b\xa7\x69\x70\xd9\x0b\x98\x14\x33\x06\xd9\xac\xe9\xa5\xb1\x6f\x8d\x19\xea\xac\x07\x47\x79\x05\x76\x9c\x10\x83\x87\x50\xf2\xbd\x16\x2c\x36\xce\x00\xda\x6a\xc9\xda\x24\x91\x30\x25\xc1\x6a\xdf\xdb\x9c\xe4\xfb\x48\xd8\x91\xbe\x42\xbd\x69\xd8\xdf\xd7\x49\xa5\xeb\x84\x50\x8f\xda\x68\xb0\x6a\x6c\xf0\x47\x72\x3c\xf1\x6b\xed\xbb\xbc\xc2\x7f\xf4\xa0\xe0\xb8\xc7\x88\x93\x59\xb8\xf2\xa3\x50\x1b\x9f\x1d\x7b\x36\x04\x99\x6e\xb1\x5d\x55\xf0\xca\xec\x93\x4d\x98\xd5\x2f\x3c\xe0\x39\x43\xfb\x18\x88\x0b\x70\xf9\x81\xc9\x3f\x77\x9f\xae\x9a\xd5\x6c\xaa\x87\x1c\x5e\x61\xce\xc4\x74\x83\xf6\x22\x3e\x80\x64\x4a\xe7\x00\x92\x8c\x80\xdc\xcc\xb2\x26\xb0\x80\x17\x1f\x03\xf6\xc0\x9a\xec\x61\xf2\x56\xbc\xdc\x2d\x2e\x10\xa2\x99\x3c\x4e\x92\x23\x8e\x52\x81\xb2\xdd\x0b\xf3\x05\x40\xf2\x16\x09\x68\xd0\xb3\xdd\x38\xcf\x97\xf8\xfe\x9d\xcb\xc6\xbe\x13\x90\x4d\x69\xfc\xd9\x3d\x67\x01\xb5\x43\xd4\x88\xed\xd7\x33\x5c\x60\x33\xb4\x19\xc4\x7a\x40\xe4\x1c\xbc\xfa\x70\xdb\xbb\xa7\x1a\x79\xb6\x93\x0a\x79\xc0\xcc\xc7\x61\xa5\xd0\x75\xc2\xa7\xcb\x93\xd2\x59\xca\x4c\x8c\xf1\xe8\x22\x65\x77\xd8\x07\x41\x07\x26\xb5\x03\x67\xe1\xcb\x51\xe9\x30\x9e\xdf\xc7\x59\x05\x90\xe2\x7b\x14\xa5\x5b\x69\x88\x92\xd6\x97\x27\x99\x86\xf3\xa4\xb4\x5f\x42\x17\xc0\x55\x88\x99\x43\x8c\x55\xe6\x1e\x5b\x0b\xa8\x08\x99\x09\xcf\x4e\x30\x56\x0a\x97\x92\x47\xd9\x76\x4e\xbc\x3d\xc9\xec\x46\x24\x8f\x52\xcd\x92\x62\xb6\x5e\xa2\xb2\x6b\x19\x18\x94\x79\xa6\x0a\x28\xc5\x9e\xcd\xe2\x12\x65\x7d\xf0\x46\x26\x9d\x88\xd8\x3e\x85\x4d\x6f\x3f\xdc\xfc\x60\xde\x2f\x38\x5e\x29\xfc\x1c\x07\xa7\xc1\xc6\xdd\x98\x49\x85\x65\xe0\xa6\xd9\x6a\xae\x8f\x21\x99\xad\x80\xcc\x27\x2e\xe6\x6d\x35\xc9\x55\x3c\xbb\x4b\xf4\x3d\x1e\x31\x51\x7d\xd8\xed\x79\x4e\x31\x13\xf6\x0f\xe5\xb2\x54\x1d\x5c\xd3\x8b\x82\xe8\x58\x50\x25\xba\xe4\xeb\x4d\x5a\x16\xb8\xfc\x6c\x3a\xf5\x6f\xf9\x54\xc5\x56\xd4\x11\xca\x30\x6c\x13\xc4\xc4\xf4\x18\x6c\x14\xd3\x29\x8d\x66\x4c\x9a\x54\x15\xf2\xb0\xdc\x9a\xee\x43\x11\xe2\x32\xb1\x51\x76\xef\xbd\xe4\x66\x0a\xad\xac\x0c\x2f\x79\xb9\x68\x76\x6e\xe0\xf6\x41\x2f\xe3\xed\x19\x03\xd4\xd7\xb7\xe4\x90\xb8\x45\x78\xcc\xd6\x6c\xca\x1a\xc6\x55\x43\x3d\xa3\x99\x97\x5b\xa0\x7e\x29\x38\xea\x93\x2f\xd4\x4a\xe7\xab\x54\xbb\x67\xa6\xe0\x88\x4e\xf3\xf9\xa6\xe6\xaa\xa2\x5e\xa3\x5d\x62\xf5\x16\xf1\x95\x76\xe6\x12\x96\xbb\x9a\x03\x5b\x62\x89\x47\xa4\x6c\x04\xac\xbf\xbb\x3c\xc5\x87\x99\x7d\x8c\x7c\x72\xe5\xa6\xac\xf4\x12\xf4\xa9\x40\x55\x34\xc6\x23\xf2\x3e\x2e\x92\x38\x73\x91\xa4\xa7\xfd\x24\x5b\x7f\xae\x7d\xaf\x7d\xd0\x49\xab\x3b\xc8\x39\x3f\x3a\xfc\x66\xc2\xe1\xe4\xa0\x33\x4b\xdc\x06\x60\x17\x3d\xe1\x93\x2b\xb2\xa7\x1c\xe8\x21\x38\x8f\x09\x4b\x29\x61\xc7\xf0\x1d\xc7\xb0\x34\x79\xd1\x21\x34\x16\xc7\x8a\xf9\x80\xf8\x50\xe4\xe4\x06\x54\xc5\x9a\x4f\xc7\xc0\xcd\x50\xac\x49\xd4\x84\x9f\xcb\x77\x61\x33\x8d\x8f\x7d\x3e\xa6\xa8\x20\x1b\x63\xfd\x17\xd4\x19\xcd\x18\xaa\x83\x29\x97\xd5\x86\x4a\x12\x04\x3b\x2a\x24\xe1\x24\x73\x3a\x26\x09\xdb\xea\x2a\x36\x56\x3f\x18\xab\x55\x45\x05\x23\x16\xf1\xb3\xe0\x1c\x29\xa3\xf8\x62\x75\x08\xc5\x08\x5e\x64\x87\x96\x2e\x66\x51\xf8\x13\xd0\xc3\x75\x49\xfb\x97\x3f\x82\x57\x1f\x04\x1b\x0a\x47\x7f\x83\x62\xb5\xa8\x80\xe0\xec\x1d\x69\x41\x40\x5e\x5e\x20\xfd\x9c\xe1\xc8\xb7\x7f\xe8\x34\x4a\x13\xa7\x58\x67\xed\x83\x49\x77\x74\x89\x75\xa3\x67\xc3\xc1\x79\x0f\xeb\xe8\xa0\x5e\x64\x78\x75\x03\x25\x90\xb6\x76\x93\xcb\xdf\x2e\x87\xe7\xbd\x8b\xde\x19\x14\xc0\x1d\x28\xa5\x9e\x05\x70\xfa\x8e\x2d\x79\x12\x46\x1e\xa6\x1c\xe9\xdc\x10\x01\x04\x3c\x0c\x78\xce\x9d\xfe\x2a\xca\x6b\xd8\xfa\xef\x34\x9e\x39\xab\xd4\x79\x93\x68\x84\xbb\xe7\xa0\x47\x93\xfc\x43\xb3\xbc\x54\x19\x6f\x28\x6e\xdd\x20\x24\xb4\x95\x1d\x76\xe7\x1e\x3a\xc2\xb8\x75\x0c\x5c\x84\x87\xb2\xa8\xe1\xb0\x45\x1c\x64\x74\xe1\x61\x1a\x6b\x3e\x27\x04\x42\x5c\xaa\xc3\x4d\xbe\x3e\x84\xf4\x6d\x47\x1d\xda\x05\xc2\x32\xf3\xb3\x1c\xc8\x27\x69\x8d\xdb\xd1\xe2\x44\x62\xc9\x7e\xed\x3c\xae\xcc\xf6\xd3\xab\x18\xd3\xb6\x10\x3d\xcf\xc9\x63\xa0\xc4\x22\xc4\x5b\x85\xe5\x59\xe7\xcd\x2f\x99\xff\x0a\x5c\x88\x9c\x99\x92\xcc\x9a\xf7\xde\x08\xaf\x6b\xc1\xe1\x9f\x17\x4b\xa5\x2d\xdb\x28\x0a\x4a\x4c\xb0\xe8\x00\xbb\x12\x61\x08\x33\xc2\xd8\xa4\x9b\x78\x63\x22\x36\xcd\xbe\x10\xd6\xb7\x7c\x6a\x8d\x33\xc4\x5b\xdb\x5c\x94\x0d\x7b\xad\xef\x0f\xa5\x10\x70\xee\x0b\x38\x5d\xb6\x91\x66\x30\x3c\x85\x85\x7c\x79\x41\xa5\xf1\xc3\x6b\x7b\xa2\x99\x7b\x3e\xde\x44\x28\xca\xf8\x49\xea\xb2\x87\x4f\x66\x68\x02\xc6\x17\x6d\x19\x82\xcd\xb2\xb0\x04\x99\xcf\x03\x45\xd3\x69\x83\x73\x73\x08\x21\x9b\x76\x2c\xf2\xe2\x21\x2e\xe6\x40\x28\x00\x63\x88\xcb\x9b\x2b\x14\xda\xea\xe8\x3d\x94\x23\x41\x0c\x28\xb2\x4f\xa0\x6c\xb3\xc7\x9d\x18\x88\x70\x51\xb2\x17\xca\x49\x0f\x65\x73\x0e\x91\x86\x8a\x05\xc2\x67\x20\x10\x8e\x6e\x2a\xf4\xfe\x31\xad\x70\xf8\xd0\x6e\x8d\x70\xbc\x68\x85\x13\x64\x23\x63\x1e\xd4\x02\x77\x03\x85\xf5\xe4\x5f\x38\x8d\xf1\x4d\xb4\xc5\xe1\xf3\xf0\x86\xaf\x14\x19\xf7\xbc\x0a\xb3\xa3\xcd\x7d\x8a\x81\x54\x41\x8b\xb7\xe7\xbd\xc3\x3c\x1e\x9e\xff\xed\x4e\x96\x37\x18\xe7\x01\x9b\x6b\x5d\x95\xc9\x5c\xa3\xc4\xc0\x2c\x5f\x11\xda\x28\x46\xd6\xc2\x62\x9d\x51\x04\xc3\xbf\x46\xe5\x82\xb5\xc0\x06\x0c\x71\xe8\x39\x89\xe4\xae\xab\xd5\x9a\x1c\x6b\x62\x6c\x15\x6e\x2c\x37\x8c\x1d\x3c\x2a\xc7\xc4\xa8\x8e\x2c\x79\x53\x5b\x77\xa7\x3a\x4a\xb2\xb9\x5e\xe9\x6c\x2e\xe0\xae\x02\x7f\x24\x8c\xab\x58\x55\x79\x0e\x8a\xe7\x96\xc1\x24\xa9\x5a\x6d\xf5\xd1\x26\x6b\x68\x87\x16\x6b\x33\xb7\xe6\x99\xa0\x96\xc6\x21\x31\xfb\x2c\xb0\x61\x90\xc5\x9b\x69\xf5\xa4\xd9\x62\x6f\x62\xf9\x79\x12\x40\x77\xf4\xba\xfb\xe6\x4f\xed\x63\x9e\x94\xcd\x4b\x3b\x2e\xbd\x34\x07\xaa\xe6\xc3\xa2\x5d\xea\x79\xb2\x5e\x86\xa4\xd6\x1b\x14\x6e\x12\x9c\xe1\x60\x4b\x38\xd1\xf7\xd4\x51\x67\xe6\x24\x72\x41\xad\xf5\xa4\xe1\x67\x21\x46\x88\x7a\xc3\x30\x4c\x41\x3b\xff\x46\x7d\xd2\x7a\x65\x76\x8e\x59\x51\xbc\x0b\x19\xd9\x0f\xad\x82\xed\x1f\x96\x9e\x32\xa1\x68\xe5\x0b\x1c\x9a\xbe\xb9\x47\x07\x83\xb8\x45\x4e\x2f\x4e\x73\x56\x87\xf7\xec\x3c\xa5\x84\x44\x83\x2f\xc5\x80\x33\x7b\xb7\x29\x93\x59\x9c\xf2\x5e\x80\x53\x91\x53\x64\x31\x45\x89\x63\x8e\x7e\xc7\x1b\xc5\xa4\x86\x39\x73\xbe\x9b\x7e\xd9\xa0\x2e\xdb\xc8\x78\x68\xea\xcf\x9c\x7c\xe5\xbc\x04\x03\xbf\xb8\x4d\x14\x6d\xa6\x32\x90\xd5\x06\xe1\x78\x0d\xab\x83\xef\xa2\xe0\xce\xa8\xee\xd6\x60\xaa\x22\xe1\xd8\xf6\x6d\xc4\x32\xfa\xf5\x45\x09\xbb\x36\xa0\x1a\x2c\xe4\x3d\xe7\x99\x3a\xcc\xbc\x7b\xc2\x6c\x29\xf5\xb5\x07\x96\xce\x52\xeb\x4a\x30\x18\x23\x41\x23\x99\xd6\x80\x9e\x53\x4a\x81\xa8\x94\x76\xa6\x3a\xde\x18\x20\x76\x52\x95\x3a\x5d\x90\x6b\x1e\x58\x00\x6d\xfa\xf6\xb4\x15\x6a\x99\x39\x3c\x92\x7d\x24\xe8\xdf\x17\xc5\x46\x08\x88\xf1\xaa\xf4\xb4\x02\x60\xcf\xc0\x54\xcd\xc5\x63\x76\x88\x94\x51\x23\x66\x8d\x8d\x40\x7f\x4d\x5e\x71\x68\x68\x91\x85\x37\x37\x6b\x28\xb3\xd2\x20\xe6\xaa\xc6\xd0\x12\x09\x62\x99\xc9\xdf\x47\xa0\x5b\x29\x35\x6f\x41\xfd\xbf\x5a\xc4\x33\x04\x55\xd2\x4d\x6d\x07\x80\x57\x8f\x30\xad\x1c\xc6\x0c\x16\x25\xd6\x2d\xe7\x0b\x34\x10\xb1\xa1\x16\xe5\x35\xdd\x6c\xd1\x4f\x0a\x4e\x42\x7e\x7f\x24\x6f\x31\x94\x36\x8c\x8b\x5b\xd4\x79\xa4\x24\xc5\x03\x93\x0b\xb9\x36\x1b\xe3\xe3\x3e\xff\x64\xee\x14\xa0\x1e\xda\x78\xc9\xb7\x58\xdd\xe6\x39\xd0\xf1\x55\x77\x8c\xf4\x87\x10\x8d\xf5\x31\x23\xee\x36\x12\xfe\x04\x2d\xb6\xfc\xfb\xd0\x2b\xb2\x2b\xe5\x18\x54\x88\xb1\xf3\xda\x54\x56\x89\x59\xbc\xe0\x36\x73\x40\x99\x0a\x10\x4a\xb8\x16\xf4\xbd\x2e\xac\x04\xac\xb9\xd7\x08\x4e\x6a\x55\xfe\x8c\x45\x92\x64\xb7\x8b\x75\x8a\x72\x4d\x5e\xb8\x40\x4c\x02\x8a\xf8\xb8\x60\x09\xd1\x68\xa8\xf2\xef\x6b\xc8\xd7\xe7\x79\x55\x22\x3b\xb3\x7d\x05\x5f\x64\x18\x2b\x4d\x37\x10\x01\x38\x76\x24\x1f\xb5\xfb\x52\x0c\x87\x97\x7b\x18\xaf\xa7\x25\xeb\xab\xce\x19\xb4\x58\xba\x44\x84\xf8\xde\xb1\x5d\x13\xb5\xa1\x53\x24\xd3\x4b\xa5\xc2\xfc\x67\xf6\x2b\xf1\xa0\x8c\xd3\xd7\x1c\xe2\xdd\x35\x39\x09\x85\x2e\x44\xef\x83\x27\xe2\xcc\x34\x8d\x12\xda\xa2\x9c\xc8\x16\xcc\xf0\x82\xf6\x20\x3c\x6e\x60\x5c\x61\xbf\x22\xa9\xbb\x19\xb5\x64\x91\x40\xb7\x4a\xe6\x88\x62\x16\x65\xfc\x06\x19\x5d\x35\x1f\xdb\x3f\x69\xe3\x0c\xb1\xb4\x56\x15\x0c\xf2\x32\x73\x30\x87\xe4\x0c\x99\x0f\x5b\x91\x64\xf3\x02\x2e\xe2\x23\x56\x58\xcb\xc6\x25\x55\x2c\x90\x13\x9c\xb8\x6e\x23\xc1\xcb\xcb\xdd\x34\xab\xc4\x36\xff\x81\xf7\x94\x5f\x88\xbe\x04\x54\xb1\xf7\xea\xb6\x7a\x8b\xe0\x96\xa6\xcf\x63\xe0\xd0\x3e\xd5\x53\x40\xc7\x13\xcf\xd2\x1c\xef\xbc\x88\x30\x1c\xe2\xab\xcd\xb8\x53\xd3\xae\x9a\x6c\xfb\xe9\x17\x99\xcf\x72\x60\xbf\x2c\x6d\xb8\x86\xfc\x1d\xf2\xa3\x4b\xe4\x0e\xb1\x06\x06\x65\x16\xe0\x35\x5c\x7a\xb4\x86\x23\x11\x4c\x20\x27\x0a\x01\xdd\x2a\xf4\xad\xf1\xa5\x28\x62\xfe\x70\x97\xab\x07\x73\xb5\x33\x15\xfb\xe4\x6e\x5d\x46\x02\xd9\x56\xdd\x11\x30\xab\x72\xc0\x64\xda\x59\x66\x4f\x43\x99\x81\x83\x64\x80\x0d\x5c\xfa\xc9\x70\xcb\x4d\x51\x24\x55\xa5\x33\xb7\xb9\xa7\x60\x1e\xbc\x51\x45\x6c\xba\x17\xc9\x57\xa1\xbb\x59\x17\x44\x94\x1e\x49\xd3\x70\xcb\xbc\x4e\x61\x23\x08\xf7\xbc\x00\x9b\xe6\x0d\x7a\xdd\x73\x0a\xbe\x91\x5a\x82\x9e\xd8\xed\xad\x19\x29\x7e\x30\xfb\x9c\xd0\x13\x48\x08\x37\x99\xf4\xb5\x68\xdf\x11\xbb\xba\x3b\x16\x4e\x0b\x2a\xfb\xd5\x7d\x9e\xae\x97\x14\x7e\x2f\x89\xe3\x5a\x72\x2c\xc0\x39\x01\x76\xb1\x3b\x5b\xa6\x56\x5e\x58\xb4\xce\xdd\xb0\xe0\x10\x35\xde\xb0\xcf\x05\x9b\x01\x52\xd2\xd0\x1e\xf3\x57\xe6\x5e\x29\x4f\x70\x05\x75\x3c\x6f\x12\x5a\x88\x89\x70\xde\x67\x4a\xe0\x04\x5b\x8e\xe8\xa1\xa4\x14\x30\x11\xd4\x8d\xd9\xdf\xd2\x0e\x70\x22\xe2\x33\x7b\x35\xde\xc3\x4d\xca\x8e\x04\x54\x32\xea\x08\xcc\x91\x4c\x3f\xe8\x42\xaa\x4e\x67\xee\xfb\x5f\x32\x64\x70\xed\x01\xdb\xb8\x67\x1b\x98\xc3\x15\xd3\xd7\x1b\x8f\xde\xde\xb6\x4c\x20\xc5\xda\x2d\x75\x8e\xc7\x23\x1a\x13\xd9\x86\x53\x09\x04\xc1\xcc\xc8\x3e\xa5\x31\x84\x79\x1f\x22\x30\xd4\x78\xb0\xf4\x29\x62\x00\x85\xcb\xda\xcd\x15\x9f\x00\x49\x51\x68\x68\x03\xd3\xdb\x40\xab\xf0\x13\xe5\xde\x83\xec\x45\x3e\x91\x26\x98\x79\xf6\xc9\x25\x00\xd3\xdd\x0f\x46\x51\xc3\xe8\x16\xa2\xb7\xd2\x11\x95\x94\xec\xa5\x24\x10\xa9\x58\xac\x53\x77\xb8\x33\x28\x02\xd6\x9c\xd4\xb2\x47\x00\x5d\xe8\x5d\xc3\x2a\x0d\xa3\xf7\x70\xeb\x78\x86\xf9\x8b\xdd\x1e\x70\xb8\xe9\x45\x0c\xac\x08\xb2\xcd\xc6\x12\xf0\x25\xd6\x4f\x41\x34\x97\xf0\x50\x0c\xf3\xd3\x81\xde\xd8\x76\x9f\xa5\x54\x40\x2e\xaa\x88\xe8\xb1\xc9\x73\x99\x31\x20\x24\x11\xe0\x09\xeb\x94\xcf\xf2\x02\xd1\x6f\x80\x83\x58\xc6\xb3\xbb\x24\xd3\xc7\x85\x8e\xe7\x68\x2e\xc8\xc2\x23\xaa\x9d\xa2\xcb\xec\x91\xf8\xf1\x96\x06\xc2\x79\x47\x67\xd9\x6c\x5d\x56\xf9\x32\x2e\x12\xce\xd6\x81\x48\xa3\x85\xec\x66\x15\xd6\x9a\x91\x67\xd2\x5b\xd4\x8e\x7c\x39\x6c\x89\xe3\xb3\xb5\xe2\xeb\x31\x60\xa8\xed\x82\x20\xd8\x8a\x40\x57\x40\x34\x9d\x36\xa1\xfd\x96\xb1\xb2\xee\xe3\x14\x09\x99\xbd\x07\xd4\xc2\x70\x6c\x26\x81\x15\x01\x0f\xa3\x3a\xdf\x84\x7c\x08\x61\xb2\x05\x68\xd1\xe0\x59\x54\x5d\x66\xf3\x57\xd2\x6f\x72\x21\xb1\xe5\x4a\xa3\xe0\x5a\xbd\x41\x41\xac\x40\x0c\x8d\x95\x59\xf1\x97\xba\xcd\x2d\x64\x79\xb0\x4a\x03\x97\xdc\x33\x74\xa6\xeb\x0a\xeb\x26\x1d\x52\xd6\xb1\x4f\xc9\x9d\x30\xdd\x50\xd9\x16\x46\x0f\xb1\xf6\x4a\x06\xe2\x21\xe6\x53\x72\xfa\xa0\x39\x2d\xd4\xb7\x69\xa1\x31\xc6\xe1\x10\xc4\x01\xec\x53\x39\x4b\xd6\xd8\x3d\x1b\x86\xb4\xc3\xb6\x93\xeb\x4b\xa8\x8d\x45\x9c\xa6\xa5\x0d\x22\xee\xbe\x33\x6d\x2e\x9f\x81\x15\xbb\x9b\x5b\x1f\x0d\x54\xe4\x00\xdf\x51\x6c\x6e\x3e\x72\x9a\x40\x29\xf6\x44\x11\x68\x0b\x3b\x65\x21\xe5\x14\x9b\x13\x11\x19\x54\xe4\xab\xee\x91\x6a\x13\xad\x41\x0c\x37\x8d\xce\x96\xf0\x6b\xdb\x1e\x5c\xaf\x50\xb5\x9c\xb5\x29\x16\xa1\xbd\xc2\x95\x90\x61\x96\x84\x70\x41\x3b\x87\x0f\x7e\xb3\x8c\x01\xcf\x92\xf2\xb6\xbd\xd3\xb1\x39\x64\xa0\xd2\x8d\x07\x4e\x1e\xf1\x9e\x2d\x2e\x4f\x06\x8e\x8a\x61\x28\x86\xd1\x11\xbb\x17\x4b\xb0\x1b\xfd\x6d\x8f\x0b\x4e\xc6\x60\xa9\xee\xa3\x58\xc3\x1f\xb5\xab\x08\x30\xbb\x04\x82\x50\x59\xc5\x9e\x22\x66\x50\xd0\x95\x12\xfb\x01\xb9\x89\x44\x37\x10\x53\x6c\xbf\x91\x94\x1c\x41\x8a\x7d\x9c\x52\x75\x57\xe8\xf2\x2e\x4f\xe7\x0e\x5c\x8e\x01\x0f\x6e\x0e\x02\xe0\x21\x2b\x0c\x35\x0a\x0b\x96\xda\x4f\xe3\x07\x3e\x59\xa9\x10\x53\x02\x73\x71\x16\x20\xca\x9d\xad\x97\xba\x80\x80\xa2\x71\xac\x96\xba\xd2\x85\xf1\xd0\xe2\x2a\x76\xda\xbe\x2a\x8d\x37\x66\x33\x61\x60\x96\x8a\x57\x28\xc8\x50\x2e\x21\x59\x11\xcf\x8a\xbc\x14\xbf\x48\xb2\x34\xc9\x64\x8e\xed\xc8\xf8\x08\xe6\x77\xe0\x50\x20\xaf\x7a\xa6\x52\x9d\xdd\x56\x77\x2d\x41\xe1\x2c\x42\xe5\xb2\xc1\xc6\x20\xc8\x64\x30\x3f\xf4\x77\x70\xba\xd0\xbc\x61\xa8\x58\x6d\x25\xb4\xd5\x91\xd3\x11\x2c\xfd\x5c\x97\x31\x3e\xc4\xca\x82\xcc\xc9\x96\xbd\x88\xf8\x51\x74\xec\xcd\x51\x13\xdc\xfb\xaf\xd0\xb1\x1f\x32\xc3\x63\x14\x4e\xf6\x8e\x33\x21\xb2\x71\xdb\xe0\x3e\xd9\xba\xea\x77\x04\x3d\x5f\x21\x6f\xa3\xde\xd6\x65\x1b\x22\x48\xcb\xbc\xb1\x23\x0e\xc1\x97\x17\xec\x36\x62\x82\x86\x56\xb7\xa5\x3e\xac\x9d\x8a\xb8\xa0\x59\x65\xab\x43\xc7\xe3\x4c\xaf\x24\xca\xc0\x1a\x12\x14\x9c\xdd\x78\x6a\x4f\x98\xdf\xe7\xbb\xe5\x8b\xcf\x65\x44\xad\xcd\xd7\x33\xdd\x90\xdb\xdc\x32\xb3\x0d\x25\xda\x3c\x48\x34\xce\x3c\xc6\x1b\x29\xed\xe9\x9b\x66\x6e\x2e\x08\x5f\xe9\x25\xc1\xc2\x4c\x22\x98\x6c\x60\x2d\x01\xaa\x2e\x7f\xc0\x42\x1f\x04\xb5\x1b\x23\x5d\x2b\x9d\xdd\x26\x99\x46\x0b\x06\x0e\x63\x3d\x5d\xdf\xde\x22\xc7\x6a\x18\x0c\x77\x19\x04\x5b\x4b\x10\xc6\x92\x71\xa8\x5c\x1e\xc5\x0b\xfc\x86\xb9\xa5\xa4\xb4\xa4\xb7\x49\xe5\x6b\x89\xf6\x05\xfe\x9e\x8a\xae\x60\x6d\x6c\xbd\x5f\x6c\xb3\x28\x78\xd6\x9c\x1a\x81\xc0\x96\x6d\xd0\x7c\x8d\x86\x1b\xac\x61\xe4\xa4\x2f\x57\x29\xca\x89\xf9\xf9\x1e\xe9\x6e\x3a\x6d\xfa\x86\xbc\x10\x8f\xba\x6d\xff\x32\x47\x77\xdb\x87\x27\xc5\xe8\x75\x42\x92\x07\xd7\x39\x7b\xe5\x00\x0f\xa2\x25\xdc\xdc\x03\x44\xc5\xdb\xe6\xcc\x49\x48\x8c\x73\x0b\x58\x54\x23\xf2\x0a\x1d\x6b\xc9\xdb\x8e\xff\x16\x7b\xbe\xd6\x45\x07\x87\xb6\xb1\x60\x2e\xa6\x78\xd0\x82\xd7\xd8\xbe\xfd\xe8\x31\x87\xa0\xd9\x07\x68\x41\xfa\xab\x7e\xe0\x79\xa6\xd1\x16\x0c\x55\xd4\xd0\xe5\x5a\x27\x77\x1d\x01\x30\x7b\xf2\x9c\x24\xe8\x81\x67\x8a\xcb\x1a\x01\x98\x47\x73\x5d\x8b\x1a\x0a\xb9\xa8\xe1\x52\xe2\xf2\x14\x79\x9a\xd8\x98\xac\xe8\x55\x00\x9c\x08\x33\x1a\x6d\x75\xd4\xab\xf0\x1a\x03\x99\xc4\x3c\x9f\x07\x0d\x79\xb8\xcb\x5d\x85\x4b\x40\x99\xe9\x32\xfb\x25\xe5\x7a\x92\x30\x44\x45\x15\x0d\x4c\x76\x6c\x1c\x2f\x21\xce\xc8\xf5\x31\xba\x16\xd1\x16\xb8\x3d\xdb\x66\xf1\x3a\xbc\xcb\x30\x7f\x75\x0d\x20\xc3\x92\xb9\x63\x7d\xfc\xb6\x5a\x6a\xd3\xfa\xa4\x5c\x7a\x30\xe5\x5a\x86\x53\x75\xdc\x13\xdc\x57\xcc\xed\x9b\xd1\x71\x7b\x74\xd2\xc2\xc9\x8d\x2b\x04\xcc\x81\x56\x51\xc8\x52\x87\xb3\x44\xda\x74\x44\x29\xc1\x21\x38\x42\x28\x3b\x86\x6f\x02\x1f\x4a\x0b\x9a\x30\x0b\xf6\x51\xce\x54\x81\xe0\x41\xe5\x19\xd0\xa2\x8a\x47\xe4\x59\x9c\xdc\x11\x05\x03\xb7\xa1\xf8\x2c\x16\x24\x71\x38\x44\x86\x5a\x40\xc7\x61\xe9\x82\x97\x47\x58\xb7\xda\x93\x88\x92\x17\x80\x1e\xc7\x70\x58\x54\x10\xbd\xb1\xe3\x2b\xa2\x57\x95\x38\x45\x62\xf2\x9d\xcd\xe7\x44\x16\x70\xdb\x81\x13\xdb\x78\x2e\xf8\xcc\x11\xca\x40\x60\x3e\xb8\x52\xa9\x8e\x4b\x2c\x67\xd1\x6a\xa3\x63\x63\x03\x56\xb9\x2b\x58\x03\x57\x19\x0f\x47\x50\x62\x45\x23\xbf\xf4\x4b\x37\x44\x0e\xe7\x55\x1c\xf1\xcd\x8f\x09\x67\xca\x30\x66\x39\x22\x4b\x2d\xb2\x7c\x96\x23\xf3\x11\x65\xb4\xac\xc1\xe6\xb3\x78\xc8\x14\x63\x63\xc0\x9e\x4e\xa3\xaf\x8e\x25\x60\xee\x7c\x77\x0c\x01\x43\x21\xae\xc7\x6e\x14\x1a\x22\x0a\xdc\x66\xdd\x52\x1f\x74\x61\xc3\x83\x76\x89\x40\x3c\x91\x96\x38\xe1\x29\xe6\xfe\x4e\x28\xe5\x38\x73\x20\xcf\x16\xb4\xf2\x77\x61\x6f\xc0\x88\xc1\x63\x63\x17\x74\x03\xac\x52\xe6\xad\x74\x11\xdb\xf0\xc1\x4f\x3b\xcd\x2f\xef\xda\x05\x10\x9a\x71\x21\xa0\x30\xb5\xc2\x14\xa5\x45\xe4\x65\x5a\x33\x9d\x64\xa1\xf1\x50\xe5\x53\x53\x46\xc7\x40\xab\xba\x12\x60\x7b\x54\x5e\x26\xe4\xbb\xb5\x25\xa3\x60\xb1\xa1\x83\x24\x2f\x2c\x00\xc9\x9b\xb3\x51\x34\x0f\xe9\xae\x5d\x5c\xb0\x58\x62\x95\xb7\xf8\xda\x51\x92\x31\xc4\xcd\xd1\xc8\x4c\x31\x28\x6a\x86\xa5\xe5\xf6\xde\x32\xfe\x5b\x5e\x38\x22\x97\x52\x1d\xd1\x69\x5b\x44\xea\x93\x2e\x32\x9d\x92\xb3\x64\xec\x80\x96\xf5\x6f\x02\x90\xb3\xb2\x8c\xea\xc1\x50\x14\xeb\xac\xb4\x6a\x54\x14\xe0\x61\xce\x18\x76\x1c\x69\x3f\x73\x70\xca\x7d\x1b\xdd\x40\x84\x86\xde\xc5\xab\x95\xb6\x47\x04\x50\x52\xba\x18\x16\x56\xf5\xcf\x93\x59\xc5\xc1\x04\x26\xfd\x17\x35\xb6\xf9\xc2\x81\x59\x57\x45\xa2\x2b\x33\x1a\xae\x62\x08\x9e\x4c\xe9\x3d\x3b\xa8\xb1\x77\xd6\xd4\xa0\xdd\x1c\xff\x71\xef\xc7\x9c\x48\x9c\x95\x1c\x3d\x67\x6e\xe7\x69\x8e\x03\xee\xf0\xd5\xce\xd8\xbf\x25\x0f\x30\x6b\x0a\xc4\xf8\xd9\xc1\x36\x49\x51\x72\xe4\x17\xa3\x7b\xf6\x22\xc0\x9c\xba\xed\x0e\x14\x58\xef\x00\x7c\x95\xc9\x5c\x1f\x4f\x37\xc7\x08\x58\xcb\x9c\x3a\x78\x1a\xb6\x4d\x68\x92\x37\xbc\x6c\x07\x32\xae\xe6\x96\xb0\xd8\x38\x43\xa0\xed\x05\x53\xf7\x44\x6c\xc6\x74\xeb\x91\xd8\xd8\x2b\x22\xff\x72\x49\xa8\x86\x16\x27\x42\xc6\xc0\xb1\x71\x10\xf8\xa0\x16\xad\x76\x25\xe5\x0f\xf9\x63\x16\x70\xd8\x31\xbe\x9c\xa4\x0d\x00\xc7\xe8\x8e\xbc\xed\x3a\xf3\x11\xe2\x2e\x95\x52\xef\x0a\x81\xbb\xf7\x8c\x7f\xd7\x5d\x57\x01\xf2\x79\xb7\xdd\xe5\x6a\xec\x19\x3d\x6f\x11\xcf\xa8\xa2\xd2\x81\x34\x1e\x4d\x4d\x43\x0e\xf8\x33\x70\x6f\xa1\x6d\x6f\x6c\xf9\x2a\x57\x8b\x84\xb6\x87\xdd\x7a\xe6\xcf\x62\x40\xe4\xb1\x6e\xc7\x91\x35\x2d\x6f\x04\xa3\xba\xcf\x5f\xe6\x84\x20\x31\x5c\x0a\xdd\x6a\xe2\x8c\xb7\xa1\x36\xa4\x60\x8f\xa5\xa8\x84\x5d\x19\x0d\xf2\xc7\x10\xaf\x88\xab\x4a\x2f\x57\x95\x58\x5b\xb6\xfc\xf9\xab\x1b\x92\x94\xea\x3e\x4f\x68\x6d\x82\x0d\xb7\x4d\xac\x4d\xe6\xb8\x9b\x5a\x68\xaf\x23\x0e\xe1\x1b\xbb\x1d\x6e\x5b\x7b\x43\x63\xf6\x0b\x95\xed\x89\x26\x01\x6e\xb3\x8d\x55\x90\x0b\x04\xf5\xc9\x76\x67\x12\x8a\xa4\x70\xfc\x2d\xb6\x61\x70\x7b\xb0\x89\x88\x32\x28\xd4\x00\x27\x86\x09\x75\xb3\x8e\xec\x9e\x05\xb6\x6e\x88\xea\xc1\x63\xfa\x42\x0d\x33\x50\x2e\xf1\xf3\xae\x89\x71\x78\xad\x09\x01\x58\x17\xcc\x07\x78\x97\x71\x46\x8a\x11\x50\xd3\x0d\xac\x77\x78\x5a\xfb\x85\x45\xe4\x58\x6d\x9f\x97\xbc\x80\xd0\x41\x98\x24\xe4\x22\xbe\x98\x37\x19\x6a\x8b\x0a\x8d\xfb\x34\x7e\xb0\xc4\x0b\x04\x27\xa9\xf7\xc6\x03\x0f\x4d\x19\xbd\x08\xd5\x93\x32\xa4\x1d\x40\x87\x8f\x08\xba\xb8\x3d\xb5\x8f\xae\x7d\x92\xcd\x8d\x13\x45\x4b\x06\x5f\x1f\x67\x0d\x32\x10\x15\x64\xc4\xcb\x3c\xb2\xb2\x97\x16\x0c\xb3\x67\x15\x0f\xb6\xd8\x35\x3f\x18\xc2\x00\x06\x41\x98\x8f\x93\x67\x54\xa9\x01\x0e\x14\x62\x72\x77\xe5\x36\x1f\xe9\x72\x25\x2b\xf5\x83\xed\x43\x4b\xbf\x84\x00\xb6\x94\xae\xf7\x4b\x70\xcd\x5f\x90\xe1\x23\x64\x33\x10\xdb\x58\xf9\xa4\x06\xf6\x9a\xf5\x88\x0e\xb7\x54\x41\xf9\x87\x57\xb2\xc4\x4a\xfc\xcc\x78\x77\x05\x1c\xfd\xbe\x31\x93\xf9\x9d\x2a\x9f\x38\x6c\x0a\x1d\x8e\x0d\xb2\xbd\x49\x16\xee\x28\x5f\x2a\x06\x95\x85\x38\x3d\x46\xb2\x13\x78\xa1\x8b\xc4\x1f\x5d\x08\xa1\xac\xcd\x49\x5b\xf5\x16\x11\x13\x03\x12\xcd\xe5\xcc\x0a\xe9\xac\x8b\xca\x49\xca\x62\xa1\x80\x40\xb3\x34\xe9\x24\x32\xc9\x88\xbd\xfc\xa8\x02\xf6\xc8\x34\x1d\x4a\x26\xf0\x2c\xe0\xef\x96\xe5\x5a\x97\x28\xad\xc5\x6b\x12\x32\xb6\x30\x94\xb0\x2a\xcc\x42\x3a\xe2\xb8\xf0\x74\x43\xad\x82\x82\xab\x48\x28\x41\x31\xbe\x09\x34\x8e\x5c\x5a\x12\x2d\x3c\x0e\x70\xf0\x2b\x6a\x80\x29\x08\x34\xd3\xc6\xd6\x9f\x67\xc6\xf8\x03\x8e\x23\x5e\x54\xdb\xbf\x6b\x49\x4c\xc8\x6e\x94\x56\x13\x17\x11\x61\x22\x17\xf4\xe2\xd7\x69\x15\x67\x1a\x71\xe7\x88\x93\x9e\xa6\x24\x2c\xb9\x55\xa0\xc7\x0d\xe6\x0a\x94\x81\xa1\xbb\xee\x6b\x2c\x73\x1b\xce\xa1\x54\x2a\xd9\xb2\x0f\x63\x00\x21\x07\xb5\x9a\xc9\xc2\x11\x32\xf0\xee\x42\x8e\x46\x48\xff\x60\x8c\x99\x34\x54\xb1\x5a\x53\xec\xf3\x7a\xa2\x17\x40\xb2\x00\xc4\x31\x9b\xc3\xdc\x5e\x0c\xd5\x27\xd4\xc6\x16\xd5\x4f\x26\xfd\xdd\xe4\x6b\x91\xaf\x81\x24\x12\x91\x87\x99\xa5\x90\xce\xed\xe8\x82\xb5\x6e\x83\xc6\xf2\xc2\x63\x82\x49\x08\x4c\x2d\x0a\x73\x7b\x59\xf8\x18\x4c\xf1\x8e\xe6\x73\x5a\xab\x96\xc9\x16\x10\x36\x96\x10\x4b\x32\x0c\x5f\xe4\x85\xaf\x23\x46\x13\x1b\x12\x57\x89\x92\x6c\x3c\xee\xa6\x71\xea\x0e\x74\x2d\x1f\x2f\x49\xcd\x00\x63\xe5\xc8\xc1\xf9\x53\x0e\xaa\xd9\xf8\x05\xc0\x86\x20\xb2\xc7\x2f\x05\x47\x77\x4d\xe0\xf4\x18\x46\xdb\x00\xd4\x4b\x32\x88\x48\x12\x57\x12\x6f\x7c\x41\xca\x51\x7a\xe5\x87\x66\xb9\x6e\x08\x72\x47\x8a\x56\x7c\x1c\x23\xc0\x0f\x86\x8b\xc8\x6e\x6d\x4d\x1b\x7e\xf2\x8d\xff\x72\x2e\x78\x2d\x4d\xff\x44\x0b\xb9\xa0\x80\x2e\x29\xd3\xed\xdb\x82\x9e\x58\xdd\xe9\xb0\xd8\x5f\xce\x33\x79\xc1\x16\x95\x99\x98\xe5\xbf\xd4\xac\x3e\xba\x42\xf0\x91\xab\xb3\x37\xc6\x81\x19\x31\x75\x09\xfd\xc5\x32\x64\x30\x5a\x20\xc2\x73\xab\x33\x5d\xe4\x6b\xcc\x79\xf1\x4b\x2c\x79\xd0\x83\xf1\xd6\x40\x62\xd8\x2b\x43\x94\x96\x3f\x2f\x78\x54\xcc\xc5\xc6\x25\x18\x10\xc6\x55\x91\x49\xf2\x92\x9a\x2c\x9b\xfd\xd2\x1b\x32\xe5\xd7\x2b\x5b\x3b\x02\x15\x9c\x4f\xe7\x79\x86\xc3\x4f\x9c\x6f\xc9\x42\xdd\xa1\x2e\xee\x9d\x46\x72\xf8\x34\x25\xe6\x33\xef\x14\xa3\xb6\x72\xfb\xdc\x71\x44\x8d\xc4\x5a\x5c\x5b\x9f\x49\x07\x21\xdd\x86\x78\x12\x43\xe2\xca\xc1\xae\xb6\xac\x6c\x80\xa0\x99\xa6\x9a\xf7\xa4\x4c\x11\xf4\x40\x51\x93\xa9\x4e\x13\x7d\xaf\x59\xa9\xaf\x76\x61\xe1\xdd\x5a\x56\x8d\xb0\x8b\x93\x53\x9b\xe7\x09\x8b\xc6\x9e\x02\x47\x48\x1d\xd3\x55\x8a\x6a\x2e\x49\xa9\x00\xec\x8a\x10\x7e\xa0\x70\xcd\xd4\x5b\xfd\xd3\x8d\x4b\x01\xc9\x72\xb9\x32\xf2\xcd\x93\x5a\xc1\xad\x39\x1a\x21\x34\xe0\x57\x4f\x35\x5c\x0a\x90\xb3\x9c\xcf\x31\xf2\x60\x96\x41\x52\xa9\x5b\x9d\xdf\x16\xf1\xea\x0e\x72\xeb\x5e\x17\x45\xa1\xa2\x53\xfe\xc3\xd3\xd8\x76\xc5\x25\x2a\xbc\xaf\x7a\xac\x97\x58\xa5\x86\x65\x11\x90\xc2\x72\x03\x81\x47\xc7\xba\x14\x0a\x7e\xbd\x8c\x76\x33\x51\x23\x48\x69\xb0\x6c\x96\x17\xab\xbc\x40\xcc\x07\x84\x7e\x6c\x0b\x63\xd4\x3f\xa7\xa0\x30\x65\x1d\x98\x61\xa0\x3e\xab\xcf\x11\xb8\xb0\x95\xf3\x10\xc2\x2d\x54\xcc\x55\x68\xe4\xda\xa6\x29\xcf\xf4\x83\xe3\x95\x0e\xc8\x34\xb7\x50\x73\x80\x35\x60\x8c\x5b\xb3\xaf\x92\xa5\xa6\x58\x92\xf7\x24\xf0\xae\xa6\xda\xdc\xf5\x89\x39\xe5\x81\x83\x23\x29\x12\xcb\xc7\xc4\xb9\x03\x4b\x23\x35\x5d\x57\x94\x81\x87\x78\x2f\x2a\x3c\xc7\x09\x14\xf0\x53\xa1\x33\xbc\xc2\xb2\x45\x21\x42\x7a\xa6\x0b\x4a\xbf\x82\xd1\x2d\x02\xf7\x08\xc0\x8c\x61\x2a\x93\xec\x76\x9d\x94\xe0\x3a\xf9\x2c\x9e\x76\x3b\x58\x83\x97\x62\xc8\xa5\xe0\x50\x72\xd4\x0f\xfe\x85\x0a\x47\xa6\x80\x63\xd2\xad\x7b\x08\xbc\x25\x40\x1a\x41\x4f\x38\x8c\x7c\xba\x43\x5b\x15\xe6\x69\xd8\x6c\xa1\x18\xa0\xed\xc5\xa7\x9b\x4d\x72\x14\x7c\x5d\x78\xaf\xe2\x79\x76\x25\xed\xdb\x56\x45\xad\xeb\xae\xca\x82\x50\xb3\xce\xad\xf0\x47\xc2\x41\x06\x66\x77\x39\xdb\xfa\xfc\x11\x2c\x79\xd9\xbb\x11\xac\xa0\xd7\x5b\x78\x78\x53\xb1\x39\xc0\x58\xa8\x81\x41\x20\x5d\x24\x98\x6c\x6c\x9c\x1b\x41\xff\xde\xfe\x0d\xad\xea\xac\x21\x93\x03\xf5\x02\x45\x82\x34\x86\xee\xb6\x60\x5e\x44\x63\xcd\x3b\x27\x1b\x4d\x45\x7b\x25\xd8\xbb\x53\x9e\x78\x8f\x74\x3c\x78\xdb\xb6\x8f\xbd\x01\xb2\xce\x7c\xa9\xcd\x46\x2b\xf1\x6a\xb0\x41\xf8\xd2\x02\x94\x90\x89\xd3\x5c\x68\xa5\x65\x5a\x9b\x6a\x75\xbb\x86\x90\x0f\x35\xa5\x7a\xc8\xd5\x6d\x0e\x29\x8b\x05\xee\xbf\xe2\xde\x23\x63\x29\xab\xb8\x5a\x23\xf7\x4f\x9a\x8a\xe8\x00\x06\xa0\xd7\x21\x67\x10\x05\x2b\x57\x45\xbe\xcc\xad\xe9\x51\xde\xc5\x98\xdd\x01\x24\x05\x5d\x28\xf6\x2b\xb7\x78\xa4\xa4\x68\x4f\x0e\x86\x56\x6a\x0f\x96\xc1\xcb\xb6\x7a\xdb\x3d\xeb\x5c\x8f\xbb\xa0\xb0\xdc\xef\xbd\x1d\x75\x46\x37\x0a\x14\xa4\x49\xc1\xf2\x62\xd4\xed\x82\xcc\xf7\xfb\xce\xe8\x5d\x17\x24\xc3\x47\x5d\xf3\x09\xf1\x2c\xe0\x98\x10\x0f\x88\x02\x1d\xe8\xab\xee\xe8\xb2\x37\x99\x74\xcf\xd5\xdb\x9b\x40\x14\xba\xad\xba\x7f\x3d\xeb\x5e\x4d\xd4\xc7\xf7\xdd\x81\x53\x29\x57\xe3\x49\xc7\x7c\xbe\x37\x50\x1f\x47\x3d\xd0\x9d\x36\xcf\x73\x72\x57\xef\x87\xfd\xf3\xee\x08\xc8\x2e\x9e\xb2\xbc\x39\xab\x8b\xab\xab\xd1\xf0\x43\xef\xdc\xef\x13\x2b\x0f\xee\x96\x1c\xec\xf6\xe0\x41\xdd\xbf\x5e\x8d\xba\x63\xd3\xfd\xe1\x48\xf5\x2e\xaf\xfa\xbd\xee\x79\x24\xa5\xc4\xdf\x5e\x83\xe2\x16\xaa\x47\x77\xcf\xd5\x64\x48\x62\xea\xf8\x59\x7e\x7a\x0f\x15\xc9\x2f\xbb\xa3\xb3\xf7\x9d\xc1\x84\x95\xb6\x3b\x83\x73\x75\xd1\x9b\x0c\xba\x63\xa4\xe7\xe8\x60\xcb\xcf\xae\xfb\x9d\x91\xba\xba\x1e\x5d\x0d\xc7\xdd\x36\x0e\xe0\x60\xd2\x1b\x75\xd5\xa8\x37\xfe\x8b\xea\x8c\x79\x58\xff\xfd\xba\x63\x9f\x73\xd5\x1d\x5d\x0c\x47\x97\x9d\xc1\x59\x97\xf5\xc1\xc5\x34\x9a\xde\x82\x8c\xb5\x1a\xbf\x1f\x5e\xf7\xcf\xbd\xbf\x9b\x61\xea\xaa\xf3\xee\x45\xf7\x6c\xd2\xfb\xd0\x8d\xcc\x07\x55\x67\x3c\xbe\xbe\xec\xd2\x68\x8f\x27\x30\x3c\xfd\xbe\x1a\x74\xcf\xba\xe3\xb1\xf9\xd6\xb8\x3b\xfa\xd0\x3b\x83\x51\x18\x75\xaf\x3a\xbd\x11\x4a\x6e\x8f\x46\x5d\x10\xee\xc6\xf3\xe5\x55\xdb\x4c\xdd\x60\x08\xf2\xe6\x13\x75\x3d\xe8\x9b\xbe\x8e\xba\xff\x7e\xdd\x1b\x35\x2d\x03\x50\x4e\x7f\x37\xea\xc2\x50\xca\x59\xff\xd8\xeb\xf7\x51\xd1\x3d\x98\x7a\x2b\xb6\xee\xa6\xfe\x46\x7d\x7c\x3f\x04\x15\x6f\x60\x35\xb9\xe1\xc5\x31\xea\x5a\xda\x13\x7f\x4d\x74\xc6\x62\x69\x76\xde\x0e\xcd\x18\x78\xc2\xf4\x66\x40\x40\x16\x9d\x35\xc4\x9d\xd4\xbe\x79\x35\x51\x89\x37\x6a\xd4\x6f\x97\xa8\xef\x8c\x7a\x63\xf3\x04\xb3\x0a\x69\xc6\xcc\x06\x34\x2b\x6d\xc0\x2b\x64\x32\x54\xe1\xa6\x14\x32\xff\xf5\xd5\x67\xb5\xeb\xcf\x3b\x93\x8e\x82\x16\x4f\x3a\xea\x6d\xd7\x7c\x7a\xd4\x1d\x9c\x83\x42\x7f\x6f\xd0\x39\x3b\xbb\x1e\x75\x26\x5d\x27\x40\xaf\xc6\xd7\xe3\x49\xa7\x37\xc0\x49\x31\xfd\x85\xad\xdc\x1b\x9d\xdb\xdd\x04\x0b\xd4\x2a\xde\xfb\x4b\x6c\x32\x54\xc3\xab\x2e\x3c\x12\x96\x9a\x9b\x90\xf1\xf0\x62\xf2\xb1\x33\xea\xb6\x02\x89\x7b\x9c\x3d\xe5\xed\xd9\x1b\xf5\xbe\x33\x46\xad\xfb\xce\xf9\x87\xde\x78\x4f\xa9\xfb\xee\x00\x3f\xd7\xc0\x7a\x73\xf0\x3e\x7f\x30\x27\x7d\x07\x5c\x50\x0c\xb2\x4e\xe0\xae\xaf\x72\x94\xb2\x1d\xe8\x07\xba\xda\x12\x5d\xb2\x38\x1e\x91\xb2\x61\xa9\x8c\x4f\x6d\x2a\x98\x8a\xc9\x11\xa0\xfb\x11\xe9\xaa\x42\x1e\x32\x36\xba\xc0\x92\x03\x36\x49\x80\xa6\x2c\x75\x36\x67\x52\x8d\xa4\x0a\x8e\x77\xb0\x36\x34\x33\xbf\x23\x67\xac\x4f\x84\xca\x65\xce\x96\x2b\x1b\xe2\xad\xe0\x08\xa0\xb9\x8c\x8a\x28\xde\x5d\x5c\xa3\x5d\x51\x47\x79\x11\x49\xb1\xde\x74\x13\x6d\x4b\xff\x3c\xc2\x1a\xd7\x02\x0e\x56\x5b\x7c\xc5\x6f\x88\x54\x5c\x55\xf1\x2c\x54\x7c\xb2\xe5\x50\x1e\xaf\x6d\x9b\xc2\x00\x65\xbc\x30\xa3\x68\xae\x7f\xfb\xe5\xa5\xd5\x9a\xaa\x28\x5b\x04\x70\x3e\xca\x53\x23\x8e\x3a\x47\xde\x77\x49\x12\x0a\xcc\x39\x1b\x4a\x10\xcf\xd2\x35\x63\x54\x7c\xf2\x02\x78\x14\x3c\x83\xd8\x58\x11\x4b\xe0\xe0\x1f\x5a\x1d\x0a\x09\x10\x00\xfa\xa2\xcb\xb9\xca\xc1\xbb\x82\xca\x01\xcc\x45\x31\x99\x27\xa5\xc1\x12\x63\x28\xac\xb3\x79\xfb\xe0\x7f\x01\xde\x07\xbe\x2b\x21\x24\xa9\xe5\x96\xc8\xe2\x25\x47\xdb\x54\x32\xd7\x31\xc2\x7c\x91\xab\x0e\x08\x2c\xd4\xbf\x05\x02\x04\xff\x0b\x30\x29\xea\xdf\xd4\xff\xc2\x2f\x1b\xeb\x01\x4d\xa7\x7f\x3b\x08\x35\xde\xbc\x05\xf6\xc6\x56\x69\x79\xeb\x0a\x8d\x68\xc1\xb1\x9b\x54\xdb\x96\xc3\xa3\x5c\xa0\x50\x7e\xba\xaf\x29\xfa\x46\x50\xeb\xb0\xf6\x82\xf2\x05\x89\x21\xb9\x74\xe4\x73\x3b\xb4\xea\x36\x78\xbb\xd6\x71\x19\xe0\x20\x6f\xee\x2e\x5f\x69\x4b\x03\xc8\x06\x1b\x96\x5f\xa1\x33\xc4\xa6\x81\x39\xc4\xd8\x3c\x78\x63\x91\xed\x04\xa7\xd7\xac\x3c\xe5\xc8\x25\xf2\x45\xed\x86\xcf\x8b\x3d\x2e\x78\x16\x31\x7e\x7c\x54\x51\xdd\x00\x58\x23\x8d\x87\x56\xb6\x0f\xcc\x01\x20\x97\x6d\x33\x6c\x66\x9f\x09\x93\x45\x37\x6e\x0c\xdf\x18\x77\x38\xcb\xab\x3d\xad\x66\x54\xbc\x88\xd4\xd7\x4b\x5e\x00\x96\x14\xa2\x0b\xc8\xd4\x4e\x11\xa6\x4c\xdd\xe1\x49\x0e\xb8\x43\x24\xaa\x36\xeb\x4a\xa7\x7a\x56\x15\x79\x96\xcc\x88\x69\x19\x55\xd5\x93\xd4\x1b\x1a\x00\x58\xdf\x6a\x5a\x3e\x7a\xb9\x4a\xf3\x8d\x2e\xd4\x11\x17\x22\xda\x52\x73\x72\x66\x96\xba\x68\x29\x96\x7f\x2d\x8d\xaf\x95\x3a\x01\xf3\x2a\x87\x0c\xa1\x8a\xc5\xb1\x20\x88\x57\x0e\x2d\x1a\x55\xc2\xe0\x18\xa7\xb8\x69\xab\xf7\xc4\xd2\x18\xab\x12\x22\xde\x6f\xa8\x5a\xd4\x7c\xc5\x6c\xe4\xf2\xf5\xc1\x4d\xbe\xc9\xe7\x9b\x4c\xf3\x70\x92\xda\x16\xbf\x04\x99\x94\xdc\xcb\xe1\x14\xd2\x00\x48\x3a\x90\x70\xc1\xff\xbc\x28\xf2\xe9\x13\x75\xe4\x08\x0c\xa0\x69\x0f\xc4\x28\xfb\x29\xcb\xa7\x65\x8b\x83\x1d\x07\xd3\x8d\xfa\xb3\x79\x3d\x48\xed\xe4\x4b\xf5\x3e\x9e\x7d\xd2\x85\x39\xba\x10\x18\xb6\x2e\xe0\x8c\x99\x6c\xd4\x59\x9e\x67\xea\xdf\x54\xa4\x4e\x54\x67\x55\x24\xa9\x3a\xf9\xf5\xd7\x67\x07\xf4\x87\x48\x5d\x15\xba\x4c\x98\xdf\xe0\x43\x32\xd3\x07\x93\xbb\xb8\x7a\x62\xf9\x9f\xb0\xfb\xe0\xb6\xff\x5f\x3f\x58\x84\xda\xd3\xff\x41\xf9\x9f\x67\xc7\x66\xd1\x1f\x4f\x93\x32\xcf\x8e\xad\x87\xf7\x1b\x24\x81\x1e\xd1\x7f\x3e\x39\x7d\xfe\x8b\xaf\xff\x73\xfa\xec\xe4\xd9\x4f\xfd\x9f\x1f\xf2\xf3\xd6\xcc\xb2\xea\xf2\x2c\x1f\x74\xb6\x60\xec\x6c\x98\x05\x8c\x3a\xa6\x1a\x2d\x44\xd1\x80\x2b\x60\x03\x8b\xa4\x10\x6c\x3a\x0a\xdf\xb2\x8a\x0b\x73\xde\x96\x9f\x74\xaa\x2b\xe2\x07\xfb\xe2\x52\x0b\x01\x82\x70\x5f\x48\xca\xec\x89\x83\xc2\xf1\x8b\xd0\xc5\xaf\x2c\xe3\x34\xd8\x4b\xfc\x72\xc0\x9b\xd6\x50\xb6\x15\x8a\xee\xd1\xd9\xe7\xb7\x97\xd4\xef\x9c\x69\xe8\xcb\x42\x00\x9a\x31\x48\xeb\x85\x3d\xc6\x16\xba\xd1\xac\x5d\xe0\xa8\x65\x47\x99\x96\xfa\x2c\x60\x78\x07\xae\x68\xc7\xde\xe3\x8d\x27\xc5\xdc\xd7\x29\x58\xbc\x38\xee\xcc\x79\xc6\x8a\x0c\x92\xd9\xc7\xd9\x33\x3b\xea\xbc\x5d\x0d\x5b\x53\xb3\xc8\xc6\xa8\xfd\x1e\xb0\xc7\x28\x60\xfa\x88\xbd\x63\x0c\x11\x67\xea\x40\xc5\x3d\xb4\xbc\xfd\xaf\xa8\xc8\xff\x63\x7f\xda\x4f\x3b\x97\xfd\xef\x29\xfe\xff\xf8\xf9\xff\xe2\xc5\xab\x50\xff\xed\xe4\xf9\x8b\x9f\xe7\xff\x0f\xf9\xb1\x1e\xd4\xeb\xba\x5c\xfc\x2b\xb3\x6f\x3b\xab\x55\xaa\xd5\x19\x55\x52\xb0\xfd\xd5\x49\x53\x35\x42\x68\xcc\x08\xa2\xb7\x7a\xde\x3e\xe8\x5d\x5e\x0d\x47\x93\xce\x60\xf2\x1a\x93\x8a\xf8\x55\xa9\xd3\x65\x39\x99\xaa\x9c\xed\xd5\xa6\xe7\xab\xa3\x43\xf8\xf5\x61\x0b\x05\x2f\x91\x88\xc8\xa6\x56\x11\x6e\x65\x81\x26\x35\xe5\x53\x76\xb5\x31\x38\x51\xa0\x54\x94\x24\xb6\x8c\x82\x8a\xbc\xa2\x11\x30\x51\xef\x81\x63\x80\x2c\x6b\x70\x2f\x41\xde\xda\xf3\x61\x69\xa6\xa1\x22\xb8\xcf\xcd\x5b\x81\x7c\x1c\x7f\x4a\xb6\x31\xda\x7e\xa5\xd4\xda\x04\x5c\xe3\x7b\x8c\x50\x3c\x4d\xe6\x9a\xcf\xe1\xc6\xa1\x6a\xc6\x57\x45\xf4\x3e\x81\xf0\x8b\xd5\x4a\x17\x65\x9e\xc5\x29\xd2\xc0\x53\x24\xc1\x69\x88\x70\xd0\x04\xbe\xf9\x44\xe4\x22\x4a\x2b\xdd\x61\x93\xae\xc1\x08\x1f\x41\x70\x01\x7f\xc9\x17\xc5\x61\x2b\x52\x2c\xa7\xcb\xf5\x02\xda\x8e\x11\x46\xf7\x83\x7b\xd7\x7f\x40\x64\x61\x65\x7c\x91\x79\x15\x93\xc0\x39\xc0\x4c\x0b\xe8\xef\x0b\x94\x7f\xf9\x26\x80\x32\xd3\xad\xff\xc8\x3b\xb1\x5e\x92\x29\xcf\x48\x4c\x79\xcb\xeb\x6d\x99\x60\xa1\x21\x9f\x0d\x23\x24\x38\x2c\xc3\x29\xfb\x5c\x05\xd4\x96\x30\xae\xc8\xc0\x32\xbb\x0b\xd6\xb2\x0d\x51\xf8\xed\x6b\xab\x81\xe0\x0f\x36\x5e\x16\x10\xec\xce\xf5\x32\x2e\x3e\x95\x91\xd5\x30\x83\x7f\x42\x09\x6e\x7e\x9b\xc3\xb3\x1a\x37\x2c\x95\xde\x33\xbb\xac\xce\xe6\x79\x81\x0a\x73\x98\x93\xd1\x56\xab\xb6\xce\x43\x16\x0c\x1c\x0f\x12\xeb\xec\xaa\x55\x91\x10\x43\x6a\xa5\x33\x89\x2f\x85\x27\xc0\xb7\xdb\x64\xc1\xfa\x40\x63\x20\x31\x70\x72\x31\x38\xa2\x66\xcd\x32\x12\xce\xf2\x5b\x31\xda\xd6\x4a\x69\x7b\x42\xda\x90\x2e\x22\x00\xa0\x3d\xb1\x10\x09\x28\x85\x66\xa6\x6b\x94\x39\x16\xa0\x3a\x21\x8e\x23\x95\xbb\x68\xb4\x18\xae\x33\x27\xca\xac\xa2\xce\x95\x83\xf0\x05\xc7\x02\x05\x33\xed\x6a\x44\x82\xa1\xb3\xcf\xb5\x19\xcb\x39\x12\xc7\x87\x6b\xb3\x74\x6b\xda\x76\x08\x0c\x48\x9b\x0d\x9a\xc6\x65\x52\xb6\x21\x19\xd1\x55\x97\x9d\xbf\x74\x65\x5e\xab\xd7\x1d\x47\x9c\x0a\x6a\x4e\x04\xd9\x90\x11\x44\xe2\x81\x44\x7d\x47\x1a\x68\x30\x1c\x1c\xf7\x06\x17\xa3\xde\xe0\x5d\xf7\xb2\x3b\x98\x44\x5f\x95\x18\x8a\xd4\xa8\xfb\xae\x33\x3a\xe7\x9c\x18\xb6\x9d\xc3\xed\xd0\xce\xc9\x18\xb2\x07\xe6\x69\x18\x9d\x07\xb6\xf7\xfe\x70\x40\x59\x06\x75\x36\xbc\x7c\xdb\x1b\xe0\xef\x39\x45\x34\x52\x57\xa3\xe1\xf9\xf5\xd9\x64\xdc\x3e\x90\xb9\x9b\xf1\xfb\x4e\xbf\x4f\x6f\x71\xc9\x91\x0b\xca\xbe\x88\xcc\xc7\x79\x6f\xd4\x3d\x9b\xec\x97\x03\x39\x7a\x24\x97\x76\x35\x1a\x9e\x5d\x8f\x60\x94\x30\xee\xff\x76\x3c\xe9\x4d\xae\x27\x5d\xf5\x6e\x38\x3c\x87\xd9\xc0\x3c\x54\x77\xfc\xc6\xe6\x3e\xae\xcd\xe0\x9c\x77\x26\x1d\xc8\x0d\x5d\x8d\x86\x17\xbd\xc9\xf8\x8d\xf9\xef\xb7\xd7\xe3\x1e\x0c\x6a\x6f\x30\xe9\x8e\x46\xd7\x57\xa6\xe7\x2d\x9b\x89\xe9\x0d\x28\xe6\x77\x13\x24\x65\x20\xc5\x85\xa3\xd2\x1b\x0e\x22\x8f\x2d\x9f\xb3\x4b\x1e\xa5\x3e\x7d\xd5\x9f\x93\x48\xbd\x1f\x7e\xec\x7e\xe8\x8e\x14\xa4\x5a\xcf\x61\x62\x3e\xbe\xef\x42\xfe\xe3\x7a\x70\xde\x85\xe4\xe9\x70\x04\x29\x8e\xb3\xe1\x60\x32\xea\x98\x71\x9c\x0c\x47\x13\x99\xf5\x19\x74\xdf\xf5\x7b\xef\xba\x83\xb3\x6e\x2b\x52\xe6\x9d\x67\x13\x98\x0d\xca\x8e\x8c\x5c\xf6\xd4\xa5\x5c\xb0\x21\x5f\x9e\x5d\xf9\xef\xe6\x92\x34\xc5\x7f\xbe\xb1\xfc\xf3\x23\xf6\xff\x8b\x93\x5f\x9e\xbd\x0c\xf5\x9f\x4f\x4e\x4e\x7e\xda\xff\x3f\xe2\x07\xbc\xfe\x47\x84\x9f\x23\xf5\xe7\x75\xa6\x41\xdf\xb9\x26\xf9\xfc\xa7\x5f\x41\xf2\xf9\xe4\x3b\x49\x3e\x47\xbf\xa7\xe8\xf3\x1f\x4f\x50\x39\xc4\x67\xfe\x58\x39\x65\xf4\xea\x1e\xe7\x02\x5c\xe6\xa5\x65\x6e\xda\xb6\x2c\x9e\x94\x3e\x7a\x87\x8c\xa5\x50\x28\x05\x20\x5d\x24\x8e\x3c\xcb\x97\x4b\xcc\x31\x63\x38\xcf\x8c\xdd\xd1\x18\x24\x3d\xe0\x5b\x5b\xa3\x4b\xb2\x6b\x81\xf4\xdf\xe3\x69\x20\xa2\x68\x6c\xb7\x6c\x6a\x99\xd0\xdb\x15\x39\xb1\xb6\xb9\x50\x0c\x9f\xff\x26\x61\xe3\x7f\x26\x45\xe3\xe8\xeb\x15\x8d\xa3\xc7\x15\x8d\x09\x02\xfc\xa5\x82\xc6\xa0\x1b\xfa\xfd\x34\x8c\xe3\x0c\x8e\xa1\xaf\x54\x2f\xfe\x71\xda\xc5\x6e\xb1\xfd\x36\xf5\x62\x5f\x21\xe3\x5b\x0b\x18\xf3\x2a\xfd\x66\xea\xc5\xdf\x4f\xf4\xb7\x7a\xc8\x55\x59\xe9\x55\x89\x62\xbf\xbe\xd2\xaf\x1b\x6d\x26\x09\x69\xd6\xf9\xfd\x56\x32\xbf\x2e\xf6\x83\x34\x43\x50\x74\x06\x94\xd0\x2c\x75\x2b\x54\x1d\x50\xf4\xa4\x28\xeb\xba\xbf\xbc\xca\x7c\x74\x0d\xd1\xd3\xc4\xd9\xbc\x7c\x54\x0b\x38\xc4\x51\x58\x1c\xaf\x3c\x71\xf7\x15\x02\xe6\xe6\x99\xfb\x46\x2c\x9c\x2a\xff\x22\x31\x60\x87\x9b\x07\xdf\x9b\x11\xda\x4d\x0a\xbe\xae\xee\xb6\xd0\x8b\xd4\x4c\x7b\x9e\xf9\x15\x01\x74\xf3\x3c\x11\xd2\xc1\x52\xf7\x37\xd4\xee\x45\x96\x45\x48\x90\x65\x50\x05\x8c\xf2\xbf\x48\x89\x1d\x8a\x04\x7b\x42\xbf\xf1\x7d\x9e\xb0\x74\x43\x76\xcb\xd2\x2f\x22\x90\x93\x37\xca\xf9\x42\x07\x92\x6c\x9e\xdc\x27\xf3\x35\xaa\xab\x82\xf4\x6e\x50\x2c\x86\x11\x2e\xc4\x01\x31\xc6\xaa\x12\x22\x31\x82\xca\x01\xd8\x9b\x57\x05\xea\x12\x20\x85\xf3\x83\xac\xa9\x49\x2a\x29\x13\x2d\xc2\x1b\x5c\x39\x6f\x13\x4b\xb0\x28\x69\x51\x91\x58\x28\x16\x75\x14\x14\x24\x71\xd2\x12\x71\x9a\x7e\x17\x7d\xbb\xef\x21\xfb\x16\x88\xbd\xf1\x10\xda\x22\x2b\xa1\xf5\xf5\xc5\x02\x6f\x5f\x25\xe3\xb6\x5d\xaf\x58\xab\xc3\x2b\x6c\xde\x4e\xc5\x32\xd1\x05\x92\xd1\x15\x4a\x7e\x5e\x29\x30\x3f\xad\xae\x3f\x76\xe5\x9e\xf1\x8d\xf5\xc7\xe4\x93\xbf\x95\xfe\xd8\x8f\x54\x1b\xdb\x5f\x2a\xef\x8f\x24\xac\x25\x47\x7e\x8b\x90\x16\x1c\x94\x42\x4c\x2b\xf8\xca\x6f\x51\xd2\xe2\xc7\x84\x4a\x5a\x77\x31\x14\x09\x80\x7e\x1e\x73\x38\x35\xb4\xf8\x4b\x14\xb4\xf8\x55\xbf\x51\x11\x8b\x1e\x03\x4e\xcd\x4f\x21\x2c\x89\x25\x05\x5b\x50\x16\x9f\xdb\x8b\xdd\x1f\xba\x3d\x65\xb2\xe8\xd3\xff\x0d\x64\xb2\x82\x23\xf3\x4b\x65\xb2\xae\xd8\x24\xff\x43\xca\x64\x35\x68\x4c\x59\x33\xd0\xc2\x50\xbe\xab\xd0\x55\x5d\x6d\xcb\xd2\x5b\x34\x10\x42\x41\xa2\x0a\x77\x16\xf9\xa6\x90\x66\x01\x55\x2c\x28\x00\x04\x4c\x93\xbd\xd0\xcd\xef\x1a\x12\x59\xe1\x94\x9a\xef\x10\xa0\x28\xaa\x29\x6a\xb9\xe2\xf0\x6f\x26\xae\x35\x6b\xb1\xfd\x6d\x07\x9b\x2f\x77\xcb\xc5\x55\xe8\x78\x8e\xa1\x14\xb0\xf0\x01\x28\x19\x33\x3c\x1c\xb4\x16\x8a\x75\x26\x7c\x39\xe6\x27\x8f\xf0\x8f\x00\x37\xd7\x73\x7b\xec\x02\xab\xbf\x59\x69\xe2\x41\x60\xe6\x59\x5d\xaf\xb2\x72\x58\xf9\x87\x18\xd1\xa2\xab\x22\x41\x82\x08\xe2\x72\x85\x03\x2c\xcb\xf2\x75\x36\xc3\x84\xb5\x4b\xaa\xed\x73\xb4\x59\xfb\x6a\xbb\xbf\x72\x64\xac\xd1\x14\xe8\x6d\xe2\x8d\xb7\xb8\x68\xa1\x9b\xd9\xa0\x0f\xb7\x5c\x48\x01\xe2\x5e\xb0\xa1\xeb\xd0\x2e\x56\x9e\x14\x55\x04\x6e\x2f\xd0\x1d\xa9\xa9\x7e\xdb\xf2\xf9\x21\x64\xf7\x3e\xd1\x0f\x5b\xc9\x6f\x8f\x2c\x18\xcf\x0a\x50\xd9\x7b\x15\x01\x6e\x89\x37\x6f\x10\xc6\xb4\x05\x93\x76\xa2\x71\x8c\x99\xfb\x5b\x8e\x6e\x84\xc7\xd2\xf6\x7b\xd7\xde\xf8\x8e\x29\x08\x9f\x16\x3c\xe8\x77\xd6\xaf\xf2\x8f\xc0\x9f\xfa\x55\xdb\x6e\x88\x5a\x89\xfd\x4f\xfd\xaa\x3f\xb2\x7e\x95\x34\x71\x7e\xa3\x7e\xd5\x95\x8d\x13\xf8\xe6\xd3\x6e\xfd\x2a\x36\xa3\x7f\x5f\xfd\xaa\x6d\x6a\x3c\xb2\x0b\x61\xeb\x7f\x0f\x09\x1e\x63\x15\x79\xf4\xde\x0e\xaa\xd3\xc8\x6e\xf8\xcf\xab\xd4\xf3\x46\xe5\x45\xe4\xcc\xab\x7a\x97\xbe\x9a\x3b\x18\x59\x1f\xd9\xe2\xd9\xec\x62\x03\x26\x8b\x9a\xe8\x80\xc9\xc8\x4f\x37\x92\x19\x98\x46\x4b\xae\xd0\x08\xb9\x32\xb7\x70\x8a\xcb\xba\x20\x7f\x26\xbc\x81\xaf\x13\xcb\xfe\xc0\x01\x9f\x6d\x5b\x43\xb2\x28\x48\x78\x9b\x73\x62\xba\x82\x4d\xb8\x20\x0f\xce\x8b\xf1\x6f\xe9\x67\x5b\x1d\x41\xc0\x4b\x94\x41\xc2\x0d\x83\x49\x51\xf4\xe7\x17\x10\xc4\xcb\xa0\x6c\xb3\x00\xd0\x77\x2d\x3c\xc1\x7e\xbf\xd7\x24\x69\x37\x3d\xbe\x2d\xa1\x8b\x56\xbc\x04\x57\x94\xf1\x9f\x67\xb3\xbc\x20\x4a\x4f\xc1\x25\x3d\x25\x22\x4e\xb6\x49\xea\x9a\xea\xdf\x5a\xe1\xdd\x63\x99\xc5\xd0\xd9\x3f\xbd\xd4\xbb\xa0\x0d\xde\x8f\x77\x59\x76\xe7\x27\xe7\xb2\xcf\xb9\x5c\x67\x21\x17\xcf\x37\xe6\xd3\x1f\x50\xe2\x0c\x28\x84\xc0\xd8\x6c\x32\x19\x7f\xa0\xa8\xd9\x8b\x7d\x79\x68\xeb\xdc\xa2\x6c\x22\x7c\x7f\xf2\xd9\x1d\x2f\xff\xd7\x25\x9c\x7d\xf9\x87\x24\x9c\x15\xc1\x99\x3f\x0c\xe1\xac\x67\xcb\x36\xb2\xaf\xb2\x2d\xfe\x87\x20\x9c\xbd\xf2\x33\x45\x75\xc2\xd9\x57\x8f\xf2\xcd\x7e\x49\x8f\xab\xef\xc9\x37\x1b\x90\xcc\x72\xbb\xfe\x9b\x91\xcc\x86\x72\xb7\xc4\x7b\xff\x93\x61\xf6\x5f\x8f\x61\xd6\xe6\x59\xbe\x27\xc3\x2c\xbf\xe4\x9f\x94\x61\xd6\x0b\xbd\xfc\xe1\x18\x66\x7f\x12\xcc\x7e\x1b\x82\xd9\xe8\x27\xc3\xec\xbf\x04\xc3\xec\x9f\xf6\x25\x98\x15\x26\xfb\xef\x4a\x30\x7b\x15\xa4\x94\x7e\x12\xcc\xd6\x27\xf5\xd7\x6f\xcb\x2f\xfb\x2f\x45\x2c\x6b\x8d\xdc\x7f\x3d\x62\x59\x89\xf3\x09\x88\x65\x77\x8f\xc0\x37\x27\x98\x7d\xb6\x3f\xc1\xac\x3d\x97\xbe\x9e\x60\x16\x57\x1a\x24\x7d\x7f\x52\xca\xfe\xbe\x94\xb2\x27\x3e\xa5\xec\xd5\x68\xf8\x6e\xd4\xb9\xfc\x7a\x4a\x59\x7a\xc0\x1f\x89\x52\x96\xfb\xf4\x2f\x44\x29\x2b\xa6\xb1\x91\x52\x96\xff\xfe\x1d\x29\x65\x4f\xff\xd0\x94\xb2\x3c\x00\xff\x14\x94\xb2\xdc\xd8\x3f\x14\xa5\x2c\x37\x6a\x3b\xa5\x2c\x7d\x62\xfc\x47\xa6\x94\xa5\xcb\x6c\x0b\xa3\xec\x4a\x62\x79\x7e\x1b\xa3\x2c\x98\x8f\xe6\x43\x0f\xf1\x06\x63\xce\x77\xc6\x87\xc0\x5b\x1d\x01\x1c\x70\xd1\xd4\x58\x66\xf1\xa2\xdb\x87\x66\xb6\x4e\x1d\x0b\xb5\x65\x1c\x72\xdd\x83\xe2\x95\xfa\xfb\x2f\x49\xf1\xba\xb2\x60\xe9\xaf\xa2\x78\xdd\x6c\x36\x3b\x28\x5e\x45\x29\xce\x77\xa0\x78\xfd\x2e\xdc\xae\xbf\x89\xd9\x55\xf4\xf7\x9f\x8d\xd9\xf5\x7b\x50\xba\xee\xc9\xe5\x4a\xa3\xf6\x63\xb9\x5c\xa1\x96\xbd\xfd\xed\xe8\x5c\xc9\xb5\x11\x2b\x40\xa0\x42\x23\x7b\xc8\x51\x91\x46\x6c\x86\xb0\xb0\xb8\xd9\x34\xf9\x44\x47\x22\xa0\x0f\x93\x0a\x8f\x99\x92\xf4\x73\x25\xbe\x74\x99\xcf\xf5\xeb\x83\x77\x59\xbe\xcc\xef\xd1\x02\xe7\xa5\xfb\xea\xd7\x48\xf9\xfb\x13\x08\x98\x83\x9d\x29\xbf\x39\xcb\x97\xac\x7d\xd7\x79\x3b\x1e\xf6\xaf\x27\xdd\xfe\x8d\x34\x6f\xdf\xc0\xfc\xd3\xd4\xab\x6a\xb3\xd2\xea\x3f\xa1\x92\xf3\xe1\x09\x55\x62\x85\x3b\xdb\xdd\x19\x70\x88\xeb\xd4\xbc\x03\xe3\xbe\xfe\x46\xa7\x2a\x24\x1b\xd3\x61\x47\xe9\x8d\x7c\xcd\xec\x89\x6c\x00\x96\xa5\xdd\x6d\x56\xc6\xfb\x82\xdc\x93\x83\x4e\x73\xb3\xe0\xf5\xf6\xcb\xb4\x4e\xb9\xf8\xd4\x03\x2f\x7b\xce\xdd\xb6\xba\xad\xe1\x02\xd2\x1d\x94\xa1\x70\xaf\x83\x54\x6e\x69\x39\x7e\x66\x31\xe4\xd5\xc1\x79\x02\x9f\x5f\x14\x0d\x35\xb6\x8c\x6a\x80\x30\x7e\x0e\x1b\x7b\x6a\xa6\x76\x5d\xea\xe3\x59\x9a\xcc\x90\x6b\x68\xa9\xb3\xb5\x4a\x2a\xbd\x2c\x8f\x8f\xcd\x41\x0c\x0e\x6e\xb9\x4e\x30\xd5\x6a\x2b\xdd\xff\x00\x54\xc2\xd6\x60\xf8\x81\x54\xc2\xde\x76\xfb\x4f\xb1\xac\x9f\xa8\x23\x42\xe5\xc5\x9f\x74\x89\x45\xad\xa5\x22\xc8\x48\x92\xea\xc2\x91\x0a\x2b\x4b\x2a\xfc\x45\x6c\xc2\x7f\xfa\x55\xed\x60\x13\xfe\x0d\xfc\x1f\xed\xa7\xa3\xab\x71\xff\xf8\xa4\xfd\xec\xfb\x91\x40\xee\xe6\x7f\xf9\xe5\xf9\xb3\x57\x27\x01\xff\xcb\xe9\xb3\x93\xe7\x3f\xf9\x5f\x7e\xc4\xcf\x48\xc7\xe9\x40\x57\x98\xcf\xa7\xb3\x68\x8c\x26\x26\x5f\x9e\xcc\x03\x73\xd2\x7e\x76\x70\x34\xd2\xf7\x6d\x75\x6e\x4e\xb3\xe1\xac\xca\xa7\xba\x50\xa7\x7f\x8a\x94\x99\xb9\x16\x95\xcf\xf1\xc1\x76\x6e\x11\x6a\xe5\xd7\xd7\xd0\xca\xe6\xf1\x86\xf5\x72\xcd\x3a\xab\x92\x6a\x43\x35\xec\xe6\xae\x2c\x89\x2b\xd0\xab\xbc\x8f\xd4\xd1\x61\x9f\xd0\x00\x87\x2d\xde\xa6\xd0\xdb\x74\xa3\xe2\xfb\x38\x49\x21\x69\x07\x58\x9d\x47\x8b\x77\xf9\x49\x5c\xbd\x00\x00\x89\xa6\x5a\x5a\xa8\xf0\x1c\x72\xf8\xff\x2c\x9f\xeb\x43\x84\xa4\xc9\x0a\x27\xcc\xdc\xf8\xc0\x83\x00\x86\xbf\xc7\x24\xdd\xbb\x49\x02\x70\x45\xb9\x9e\x62\xa2\xa4\x0a\xb9\x8d\x5b\x76\x2c\xf4\x61\xeb\x8b\xa0\x3a\x8f\x80\x71\x6e\x6a\x60\x1c\xa0\x6c\x94\xd8\xa9\x06\x5c\x8e\x64\xfc\xf8\x4d\xc0\x9c\x9b\xaf\x03\xe6\x44\x8c\x7e\x69\x44\xe8\x38\x5a\x94\xad\x80\x15\xfe\x48\x2b\x82\x26\x7c\x07\x8c\x4e\xdb\xaf\x03\x00\x53\x07\x48\x45\x1b\x17\x0b\x3f\x7f\xba\x51\x70\xb1\x73\x57\x3a\x38\x28\xd3\x75\x45\xf4\xd7\xf3\xfc\x21\x4b\xf3\x78\x1e\xf6\xb5\xad\x3a\x04\x1e\x4d\xfc\x3a\x18\xc6\xb3\x9f\xb4\x4f\x90\xa3\x33\x99\xc1\xae\xb9\x42\xe0\x00\xf2\xc1\x62\x75\xf8\x6b\x75\x14\xb7\xf8\xca\x9c\xc5\x90\x49\x30\x57\xb3\xdb\x3a\x25\x79\xf4\x71\x56\x61\x98\x9f\x81\x6b\x9c\x36\x5e\xd8\x14\x1b\x6c\x93\xa3\xa4\x45\xeb\xf4\xc1\x34\xde\x3c\x0d\x2a\xb5\x55\x3c\xc3\x45\x1b\xa9\xfc\x21\x23\x7e\x87\x42\xc5\xa5\x23\xc7\xb1\x2f\x05\x7a\x8e\x84\x1f\x44\x56\x43\x02\x39\x2e\xc1\xc4\x88\xec\x42\x0e\x01\x6c\xda\xe9\x6d\x62\x70\x27\xf0\xb0\x40\x84\x2b\x89\xfa\xa3\x29\x8f\x5c\xa3\x04\x61\x75\x6b\xfb\x2e\x2e\xe6\xe8\x88\x42\x2b\xa6\x4d\xa3\xc3\x7b\xf1\x87\x8d\x0c\xbc\x50\x0e\x8a\x1b\x88\xa3\x66\x8c\x46\xab\x69\x84\x20\xc8\x73\xe9\x93\x9a\x56\xf1\x27\x9d\xd1\x48\x61\x0d\x65\x6d\x90\xbc\x41\x6d\xdb\xc5\x75\xaa\x0e\xcf\x9c\x2a\x9e\x7f\xce\x31\xf7\x00\x5c\x00\xae\xe4\xc2\x82\x17\xd3\xa4\xc4\xc4\xa5\xea\x7e\x86\x23\x42\xbd\x55\x58\x7e\x70\x57\x55\xab\xf2\xf5\xd3\xa7\x0f\x0f\x0f\xed\x3b\x9d\x26\x9f\x8d\x65\xbd\xce\x92\x6a\xd3\xce\x8b\xdb\xa7\x54\x9b\xfe\x14\xd1\x54\x16\xdc\xe9\x55\x38\x95\x96\x93\x14\x30\x68\x5c\xbb\x16\x5e\x0a\x19\xd8\x7a\x49\x76\xdb\x56\x83\xbc\x32\x3d\x05\x3a\x15\xcc\x1b\x20\xf0\x93\x77\x2e\xc2\x95\x40\x43\x10\xfe\xb6\xb5\xdf\x48\x36\x02\xa8\x5d\x51\xe3\xbf\xf3\x2b\x16\x68\x0d\x5b\x19\x06\xfc\x8c\xbe\x0a\x8b\x98\x2b\x48\x00\xc9\x50\xe8\x78\x9e\x78\x57\xa1\xf1\x6d\xf1\x79\x67\x04\x55\x5f\x22\x0f\x92\x8f\x03\x32\x37\xed\x96\x80\xc9\xf6\x96\xe5\x45\x63\xfd\xea\x49\xfb\xb9\x99\xfa\x8c\x29\x4f\xe4\x64\x23\xe5\x30\x94\x09\x88\x1b\x1f\xd5\x08\x6c\x89\x17\x5e\x2b\x36\xc8\x06\x7f\xa5\xf0\x97\xb7\x3a\xdd\x0b\x5f\x98\x17\xba\x41\x39\x14\xe5\x01\xde\xea\x8c\x6a\xcb\x1b\x7d\x33\xbb\xa0\xf3\x45\x78\x46\x10\x8a\x2b\xf8\x1e\x45\x9b\xcc\x5f\x0a\x6d\x96\x13\xdc\x74\x84\x32\x2a\xf9\x8e\x76\x0d\x7c\xa9\x0e\xcf\xb5\x71\xa9\x6c\xd3\xe8\x5a\xdd\x0a\x42\xf6\x26\x59\x78\x85\x66\xea\x60\xa3\x82\x47\x63\xda\x59\xe8\x52\xc7\x05\x95\xe2\x51\x3c\x16\x80\x75\x47\xa3\xff\x79\xde\xe2\xa6\x5e\x11\xd9\xb3\xba\xb6\x95\x90\x08\xe9\x2f\x1b\xb8\x30\x70\x9d\xda\x0b\x8d\xdf\xb4\x2e\xeb\x45\x63\xf9\xc2\x6f\xaa\x79\x58\x92\x61\x13\xa7\xe6\x84\x21\x1a\xde\xbc\xb8\x8d\xb3\xe4\x1f\x16\xce\x60\x2e\x31\xd3\x97\xd1\xff\x3c\x57\x58\xd7\xdd\xd4\xcc\x52\x3d\xe8\x34\x45\x1c\x7b\x01\xdc\x3e\xee\x14\x73\x63\x57\xbb\xf6\x1b\xda\x35\xdd\xc0\x31\x49\xc6\xaa\x28\x53\xe2\x4d\x8b\xd5\x23\xe6\x30\xcc\x32\xe3\xd0\xf1\xd4\xbd\x32\x53\x67\x8d\x99\x8f\x79\xf1\xa9\x81\x39\xc5\x9f\xad\x5d\xf4\x29\xd7\x19\x18\x3c\xe3\x0a\x56\xbc\x47\xa6\x22\xa7\x85\x8f\x99\x90\x4c\x05\xfa\x2f\x3f\xe0\x21\xdb\xea\x0d\x09\xd6\xed\x37\xe6\x5a\x09\x06\x06\x83\x08\x76\x5d\xd9\xf6\xb3\x2d\x6e\xf6\x19\xfd\x5e\x34\x7b\x67\x93\xb1\x79\x70\x62\x9a\x4b\xda\xc1\xf9\x6f\xcd\xb7\x32\x91\x38\xde\x55\x52\x7f\xd2\xfe\x45\x1d\x76\x3f\xe3\x32\x4e\x37\xaa\xb6\x17\xf1\x17\xf5\x11\xa4\xb5\x01\x39\x08\x41\xf9\x8c\x15\x19\x7a\x4e\xfc\x76\x7c\x8a\xc3\x55\xe6\xb6\xea\x4d\xbe\x8e\x6c\xf9\x8e\x2d\x50\xcf\x36\xcc\xc3\xc7\xae\x53\xd3\xd7\xf8\xc1\xb2\x01\xb9\x9a\xeb\x34\xb9\x27\x3c\x22\x5d\x75\x3b\x9e\xf1\x60\xe9\x53\xc2\x5e\xf9\x51\x66\x5b\xfa\x4c\x78\xe3\x08\x2f\x13\xe1\x4f\x95\x54\xc0\x6f\x71\x6b\x16\xfb\xb5\x60\x0c\x16\x34\x0b\x22\x25\x6b\x63\xb4\x64\xe8\xe7\xb8\x8e\x88\x21\xb0\xdd\x97\xc8\x5f\xdb\xb7\xc7\xfa\xe5\xe6\xf4\x4f\x6d\x75\xd8\x63\x94\x16\x4f\xa6\x84\x6d\x2d\xd6\xd9\x8c\x16\x3e\x81\x1a\xa1\x77\xb3\x34\x2e\x4b\x51\x7a\x55\x46\xaa\x73\xd5\x2b\x23\x75\xa7\x63\xb3\x45\xa9\x12\xeb\xdd\x75\xef\xbc\x8c\xd4\x87\xe3\x89\x19\x04\x77\xe8\xaf\x8a\xbc\xca\x67\x79\x4a\xd5\x74\xb0\x2b\x33\xe2\x38\x94\x40\x82\x48\x2d\x92\x62\x19\x1a\x8e\x18\x1c\x06\x9b\x05\xfc\x8b\x9c\x4e\x72\xac\x68\x22\x85\x01\xde\x69\x7b\x3e\xd3\x0d\xc9\xaf\xea\xd0\xdb\x3e\x38\x2a\x78\x9a\x93\xe7\xa1\xaa\x3c\x32\x83\xad\x2b\x26\x5f\xb7\x3d\x63\x06\xc7\x9c\x8a\xc2\xd6\x53\x04\x9b\xf2\xdf\xcb\xaa\x58\xcf\x38\xc2\xd5\x70\xb9\x62\x18\x40\xdf\x27\xf9\xba\xfc\xea\x9b\x76\xdb\x03\xf6\xbc\x72\x15\xf0\x76\x72\x31\x56\xa1\x41\x9e\x81\x88\x3a\x4a\x5d\x30\x59\x26\x4e\x71\xec\xbd\x44\x25\x25\x3a\x3c\xc1\x70\xc1\xdd\x22\x07\xcc\x1a\x7d\xcc\x80\x13\x63\x12\x4e\x9c\xd3\x72\xbf\xbd\xe1\xb6\x1b\x77\xc1\x3c\x1b\xe8\x2f\x93\x54\x98\xa6\x85\x26\x94\x99\x1d\x1c\xbb\x93\x38\x18\x01\x34\xf8\x4b\xe7\x2f\xb8\xd0\x06\x93\x94\x04\x67\xa9\x5b\x15\x27\xcf\x6a\xf1\x0b\xdc\x2c\xa6\xb3\xa6\x2f\xd2\x44\x84\xee\x34\x07\x73\x62\xa7\xf8\x90\x6e\xc2\x43\x42\x1a\xcf\x75\xe8\xa3\x64\xd8\x6f\x7a\x63\xb6\x51\xeb\xd5\x9c\xad\xc0\xf5\xea\xb6\x88\xe7\x78\x40\xca\x88\x4c\xe9\x8a\x56\xbe\xf0\xed\x96\x0b\xe4\x2e\x2e\x91\x7a\xca\x15\x93\x6d\xf1\x00\xb8\x5c\x8a\x93\x70\xee\x70\x38\x2a\x5b\x96\x56\xd3\xb4\xc6\x39\x83\x41\x09\x1c\x47\x8e\x89\xee\x02\xbe\x20\x7b\x0e\xe8\xa4\xaf\x1c\x51\x31\xbd\x27\xea\x50\xda\x4d\x3c\xbb\x04\x6c\x0a\xcd\x20\xc8\x0b\x31\xd9\x20\xe0\xb2\xa9\x16\x18\x15\x3d\x14\x95\x2b\x90\x34\xc8\x0a\x6e\x78\x76\x93\xb3\x63\x51\x2d\x4c\x68\xee\xb2\xad\x3a\xf2\x91\x4f\x9a\xdf\x9c\x64\xf2\x05\xb3\x78\x15\xcf\x8c\x03\x80\x77\x4b\xbe\x58\x24\x33\x5d\x44\x9c\x78\xd0\x91\x5a\x6a\x54\x86\x97\xac\x1f\xe8\x68\xcd\xc0\xa1\x2e\x54\x7c\x4b\xd1\x73\x73\xef\x20\xf4\x8e\xf0\x99\x5b\xcc\xce\x23\xd1\x78\xac\x7d\x16\xdd\x69\x39\x54\xe1\xdf\xd7\x71\x0a\xa8\xc2\xd2\xb3\x47\xc5\x88\x9f\xaa\x43\x31\x8f\xd2\xdf\xb8\x5b\x2f\x21\x3b\x4d\x45\xe9\x5c\x93\xbc\x6d\x4b\xb1\x77\x57\xae\x13\x5b\x33\xbd\xa3\x66\x59\x6e\xa3\x6f\x56\x72\xfc\xb5\x95\xc6\x7e\xe9\xf4\x91\x58\xf7\x2d\x31\x54\xcf\xd5\xe1\x4d\xbe\x3e\x34\xfd\x36\xff\x21\xdc\x41\xb9\x0c\xa1\xb2\x1b\x89\x54\xc9\x33\xa4\xea\x2a\x50\xfc\xdd\x5e\x55\x79\x91\x17\xf2\x6b\x70\xbf\x87\xef\xf3\x0c\x52\x7a\xba\x0b\x0f\x17\x79\x5a\x46\x08\x8c\x84\x7f\xa4\x70\x0c\x44\xc4\x0e\xc5\x9c\x87\xcb\x25\xa2\x32\x61\x60\xcc\x1d\x1d\x59\x1b\xab\x00\x90\x05\xfc\x25\x3c\x57\x57\xf9\x83\x59\xc2\x75\xdf\x25\x42\xe6\x2c\x66\xd5\xc2\x5f\x12\x56\x76\x19\x67\x31\xd7\x64\xd1\x21\x83\x8d\x76\x16\xdd\x74\x63\xb7\x82\x67\x44\x21\xe8\x60\xda\x82\x48\x51\x51\xde\x25\x2b\xbc\xec\x16\x15\xb8\xde\x33\xf0\x0a\x5f\x3e\xfb\x1f\x2d\xc5\xd9\x79\xae\xa7\x5e\x57\x36\xba\x01\x9c\xe3\x88\x88\xd7\x99\x5e\x24\xb8\x5d\xe4\x03\x45\x9b\x98\x31\xed\xca\xa2\xcd\xaf\x4b\x5d\xbe\x51\x67\x0e\xc0\xfa\x3f\xd5\x48\x14\xd2\xb5\xd5\xb8\x29\x46\x1e\x20\x89\x6b\xf0\x5d\x7b\x10\x52\x9e\xcf\x05\xab\x23\x87\x9b\xe1\x58\x2e\xf0\x89\x41\x50\xac\x1e\x41\x56\x47\xf7\x49\xec\x05\x4d\xad\xb0\x60\xe8\x88\x38\xdb\x94\xa2\xc1\xe6\x43\x8f\xc4\x83\x5b\xc4\x80\x99\xce\x1f\x12\x63\x12\xc9\x28\x4b\xa8\xb3\x24\x9c\x3f\x5b\xcd\x46\x9c\x3b\x9f\x99\x12\x87\xfb\xed\xeb\x2f\x41\xf0\xa8\xc9\x02\xc3\x68\x74\xd5\x44\x5f\x72\xda\x3e\xb1\x05\x8f\x42\x7f\x89\xb8\xbb\x22\xa6\xde\xf0\x14\x99\xc8\x2d\x92\x03\x13\x72\xca\x25\xc4\x60\x08\x87\x43\x36\xb3\xd1\x65\xa5\x60\x17\xdc\x04\xa2\x48\x08\xb9\xa5\xb7\xb3\xde\x91\xa3\xd4\xf3\x4d\xc2\xca\xa3\x57\x85\xcb\xd2\x56\x28\x11\xd3\xad\x45\x64\x85\x52\x4a\x62\xec\x50\x64\x52\x6f\x8c\x07\xa3\x11\xe1\xdf\x68\xbc\xce\x6b\x2c\x8a\xfc\xf0\xa6\x6f\xec\xa0\x55\x7c\x23\xc6\x40\x32\xd8\x59\x12\x85\x66\x92\x44\x30\xfd\x91\x4b\x89\xff\x1e\x98\x49\xde\x0a\x85\x1e\x93\x0a\x02\x9e\xc9\x37\x1e\xf9\x14\x76\x49\xd6\xb8\x22\x83\x08\x6a\x22\x31\x08\x9e\xfc\xe6\xac\x6e\x9c\x20\x37\x30\xe4\xdd\x73\x57\x0c\xeb\x37\x99\xd2\xf8\xb2\x2a\x96\x96\xa8\xd9\xa7\x70\x78\x46\xa2\x80\xdf\xd5\xa4\xf8\xfc\x3e\xaf\xe4\x88\xcd\xc4\x88\xcd\xd7\xe8\x73\xd6\xb6\x46\x22\xc8\xd2\xe2\xd4\x5c\xb7\xe6\xc6\x48\x58\x7b\x81\x41\x6c\x2e\x80\xdc\xb1\x2b\x15\x2d\xef\x45\xa3\x19\x9a\xa6\x8d\x51\x70\xa4\x26\xfb\x8d\x1c\x88\x37\x5f\xc8\x81\x28\xc7\x64\xde\x0a\xc8\xd5\xb7\x35\xbc\x16\xe4\xd0\xf3\x20\xa0\xd2\x90\x2f\x7d\x84\x98\x30\xb4\xdd\x39\x60\x49\x67\x70\xa9\x21\x92\x57\x81\xa5\xcc\x33\xfa\x9c\xa9\x8a\x17\xb8\xff\x98\x80\x60\x93\xaf\xb7\x06\x5b\x50\xc3\x39\xbd\xd7\xea\xe8\xe4\xb4\xa5\x96\x79\x56\xdd\x95\xce\xe1\xe2\x11\x02\xeb\x05\x32\xd3\xe6\x31\x48\x85\x07\xd7\x39\xc0\x5c\x12\x7c\x97\x2e\x30\x27\x4a\xe8\x16\x24\x89\x01\x42\xb9\x20\x71\x19\x0c\x24\x0c\xe2\x96\x91\x73\x20\x2e\x18\xdf\x23\xdd\xbe\x6d\xdb\x9b\x84\x79\x3d\x1e\xf4\x54\x95\x49\xa5\x5b\xe0\x14\x88\x29\xd4\x2d\x4e\x6f\x36\x9c\xaa\x01\x8f\x4e\x54\x63\xd1\xc9\xb3\x74\x13\x35\x9d\x24\xe1\xa2\x8b\x6c\x42\x2a\x47\x7e\x60\xa0\x38\x71\x71\x54\xac\x4b\x04\x9b\xd0\x3b\x3c\x22\x7f\xb1\x06\xc3\xd2\x14\x42\xda\x7b\xfd\xe0\xc1\xd6\x80\x93\xc3\x3c\xbd\xc6\xa0\x08\x71\x9e\x87\xc7\x90\x50\x15\x90\xd1\x45\x3c\x8f\x71\xc4\xa0\x41\x03\xdc\xf1\xde\x62\xf4\xf6\x3e\x80\x61\xe3\x69\xbe\xae\x0e\xd5\x34\xff\xec\xec\x70\x0f\xdb\x05\xec\x29\xd8\x26\x2a\xba\x0d\xa8\x2a\x29\x75\x0d\x28\x82\x28\x8c\xc5\xc6\xb3\x4f\xf1\x2d\x72\x7f\x55\xba\x48\xe2\xd4\xe6\x28\x4e\xdb\xa7\xd0\x11\xe7\x75\xc6\xb3\x4f\x59\xfe\x90\xea\xf9\x2d\xc5\x3e\x30\x17\x4c\x87\x2e\xf2\xb1\x78\x29\x4f\x38\xbc\x44\x5e\x85\xf7\x9f\x97\x39\xc3\x53\x32\x29\x1a\x63\x24\x4d\x13\xe9\x06\x8c\xa5\xf0\xb2\xdc\x38\x0e\xeb\x02\xca\x8c\x39\x51\x6f\x55\xe6\x6c\x93\x28\x16\x23\x1b\xc4\xc4\x9d\xfe\x1b\xec\x39\x6d\xcb\x8e\xc1\x34\xc6\x6c\xb3\x9d\x05\xe3\xa0\x00\x9f\x9e\xf1\x06\xfc\x12\xe4\x92\xcf\x45\x89\x15\x69\x3f\x32\x38\x6c\x0b\x20\xe4\x36\x89\x41\x7c\x63\xc3\xd9\x52\xa0\xcb\xc0\x3c\xec\x14\x6a\x56\x2b\x4e\xc4\x79\x78\x14\xc7\x8c\xe1\x31\x25\x2c\x1e\x69\xad\x30\x1d\x21\x0b\x1f\x3b\xd3\x56\x10\x0f\xf2\x71\x4a\xdf\x32\xbd\xb0\xd3\x28\x39\x24\xe8\x16\x35\xcd\x26\xe3\xd7\x4c\xcf\x92\x4a\xaa\x3d\x71\x11\xe8\x5f\xa9\x67\xeb\x42\xb2\x35\xef\x6c\x6c\xa6\xf5\x1c\x56\x32\x0c\x71\x13\xa1\x80\xcc\x95\x04\xe4\x02\x10\x61\x13\x60\x13\x63\x72\x72\x9a\xc5\x5c\x53\x11\x25\xb9\x74\x9a\x46\x60\x74\xa0\xa4\x38\xda\x21\xc0\x97\x16\xa7\xba\xb6\x62\x98\x20\x12\xce\xe2\x7a\xff\x28\x1f\x8e\x27\x05\xb5\xe4\xa8\x6c\xb9\x9d\xf6\xfc\x5f\xd9\xc5\x58\xe9\x62\xa5\xcd\x4c\x87\xde\x46\x30\x75\x78\x66\x0b\xf7\x62\x1b\x12\xa4\x71\x2e\x83\x19\x84\xe8\x00\x4e\x6f\x7d\x32\x77\xfb\x0b\x44\x07\xb1\x5c\xa5\x1b\xc7\x22\xb5\x3d\x99\x83\xd4\x92\x85\x7a\x07\x93\x03\x90\x9a\x50\x36\x97\x90\x38\xe1\xb6\x8b\xfc\x83\x92\x77\x18\x1d\x08\xf5\xd8\x02\x3b\x32\xec\xc5\xc0\x17\x6a\x38\x94\x3a\xcb\x73\xec\x8f\xbb\x37\x23\x49\x51\xe8\xfb\x1c\x06\xd9\xce\x1b\xc2\xa0\xfd\x69\x81\x2e\x6e\x9d\x10\xe7\x08\xed\x3e\x86\x00\x2d\xc2\x39\x75\x0e\x6c\xe0\x7a\xb6\x73\xda\x34\x9d\x34\xd3\x38\xa1\xd1\x3e\xce\x62\xa8\x74\xc3\x26\x4e\xdd\x96\xb6\x0c\x19\x40\x8a\x0b\x0c\xa2\x70\x7c\xa3\x55\x1f\x97\x72\x45\xda\xb9\xf2\x9c\x85\x12\x3c\x59\x60\x65\x6c\x9f\x4a\x23\x8b\x5d\xad\xe6\x89\x02\xa5\x84\xf5\xb4\x4c\xe6\x49\x5c\x34\xce\xd3\xe3\x5b\x0a\x1f\xe4\xe6\x30\x54\x4a\xfe\x71\xd3\xb6\x75\x2b\xee\x39\x6d\xd2\x4b\x74\x98\x3e\xa4\xc4\x60\xef\xe6\xc8\x3c\x53\x8e\xe1\x53\xc2\xf6\xc9\x61\x6c\x79\x10\x86\x80\xe8\xb5\xc9\x95\x92\xd9\x76\xf3\x71\xe6\x1c\xa2\x60\x72\x64\xc9\x2a\x96\xeb\xb4\x4a\x56\xe6\x7a\x48\xc8\x9f\x97\xf9\x7d\x3e\xed\xd9\x5b\x44\xeb\x89\x24\xb8\xe1\x81\xd2\xde\xf4\x48\xa7\x6f\x48\x4c\x9c\x62\x11\xc0\xe2\xdd\x60\x19\xed\xa1\x09\x1c\xa7\xb7\x79\x91\x54\x77\x98\x97\x48\xb2\x7b\x63\x36\x58\xb1\x31\x86\xf8\x63\x5c\xd6\x55\xf3\xf8\x2f\xb1\x48\x78\x47\x8d\x12\x97\x25\xb0\x05\xa1\x51\xc9\x4e\x89\x27\x40\x1c\x31\x04\xac\xc4\xcf\x79\x97\x34\x94\x83\x9b\x47\xf0\xf7\xcd\xa4\x05\x5f\x8f\x6f\x63\x73\x02\xef\x32\xe7\x98\xbf\x2f\x48\xf2\x0b\xde\x2c\xc4\xed\xa8\xb8\x86\x03\x80\xf8\xe4\x72\x5a\x4f\x85\x49\x58\xdd\xd7\x26\xf5\x9b\xe8\x84\x6b\x40\x84\x92\xcb\x5f\x6e\x0b\xe4\x58\x44\xdd\x6a\xb8\x30\xb0\x00\x6f\x2d\x2e\xa1\xa8\x59\xba\x2c\xe0\x43\xaf\xb5\xa3\x80\x92\xb9\x45\x02\x7b\x94\x27\xb2\x09\x0a\xc2\x68\x07\x2b\x23\xe0\x47\xf1\x1b\x51\x4d\x2f\x38\x5e\xe7\x6b\x1f\x84\x3d\x6d\x90\x41\x88\x9c\xbc\x48\x43\x40\xe0\x37\x28\x23\x34\x76\xed\x47\xc9\x23\x50\x06\xca\xc7\xf2\xc9\xd8\x12\x9b\x19\x22\x0a\xf1\xa2\x4d\x62\x1e\xa8\x7a\xd1\x18\x3d\x71\x6e\x2c\xcf\x60\x38\xc4\x82\xf2\xda\xdc\x5a\x64\x4d\xd6\x12\xd4\x73\x5d\xce\x8a\x64\xea\xb5\xa0\x54\xa7\xd0\xee\xe7\x11\xf1\xda\xda\xc9\x3d\xdd\x0e\xac\x2b\xdb\x42\x0b\x9c\x12\x3c\x94\xbb\xbc\xd7\x98\xbc\x14\x49\xb1\x74\xc3\xa0\x2f\x21\x6b\x04\xf9\xd4\x86\x24\x5c\x0d\x19\x6f\x46\x74\x07\x84\x28\x0a\x6f\x6f\x76\xd7\xc2\x43\x01\xeb\x10\x4d\x8b\xd7\x25\x5f\x5f\x00\xf7\xf1\x20\x2c\xd6\xc0\x6b\x5a\x49\xb5\x95\x9d\xd3\x2d\xa1\x52\xb3\x68\x6a\xef\x44\x45\x77\xfd\x19\x78\x3e\x9b\xf8\xde\x9a\x26\x04\xb6\x95\x69\x2a\x90\xe2\xf8\x31\x45\x33\xc6\xaf\x7d\xbc\x38\x0e\x7f\xe8\xe7\x0b\x62\x25\xcc\xde\xa5\x49\xf6\x09\xae\x85\x48\x9e\x39\x98\x26\xca\x0b\x9b\x9d\xb7\x4b\x48\x40\x69\xcc\x4a\x8a\x9a\x5e\xca\x0e\xe9\x52\x57\x77\xf9\xdc\xe2\x3c\xcd\x6e\x4a\x37\xb2\xd0\x40\x00\x68\x77\x2d\xa9\x10\xc4\x8a\x49\x82\x42\xdf\xe6\x00\x9f\x37\xfb\xb1\x11\x58\xba\xb3\xa4\x41\xc0\xf2\xd7\xd4\x0d\xd2\x0b\x08\x67\xb3\xa6\x2c\x47\xcc\x6a\x21\x28\xc4\x3c\x62\x74\x35\xee\xa3\xf9\x21\x5b\xd4\xa2\xd2\xe5\xed\x80\x54\xb6\x25\xb6\xed\x8e\x32\xdc\x55\x04\x56\x6c\xd8\xf4\xc8\x4f\x64\xc7\x47\x5e\x04\xb6\xf0\x05\xca\xef\x92\xc7\x50\xb2\xc8\x61\x47\xe2\x29\x00\xce\x05\x2f\xb9\x69\xc6\xab\x1c\x56\x92\x5b\x38\xb0\xfe\x69\xf5\x23\xec\x81\xfe\xe4\xe3\xd2\x1d\x17\x73\x15\x4e\xd7\xd6\x76\x05\x9e\xbe\x0d\x39\x99\x2f\x5d\xe6\xff\x48\xd2\x34\x0e\xcb\x6f\xef\x4f\x8c\xe1\x6d\x5a\x5f\xda\x8f\xc0\x25\x8e\xa7\xbe\xdd\xf0\xb0\xcb\x65\x8e\x66\x9f\x86\x5e\x5e\xf5\x21\xde\x70\x79\xd5\x3f\xb6\x6b\x84\x61\x3c\x5b\xb0\xcf\xf4\xbd\xe0\xf3\x33\xcb\x78\x28\x1b\x95\x17\xbc\x4b\x09\x61\xb5\x71\x06\x48\x68\x76\x5c\x5e\xf5\x71\xfe\x89\x0a\x66\x9b\x44\x85\x39\xc5\x49\x4b\x22\x8b\x99\xc7\xa0\x09\x10\xeb\x6f\x78\x8c\xf1\x15\x4d\x7b\x39\xce\xd8\xf1\x07\x72\xe9\x95\xce\x98\x29\x20\xe5\x69\xe3\xea\x82\x90\x4a\x74\xae\x91\xf2\xd7\xac\x56\xce\x13\x6f\xd8\xd4\x95\xfc\x36\xf5\x71\x14\xc4\xf0\xc2\x91\x49\x5d\x85\x0b\x18\x4b\x4e\xaf\x94\xef\xb0\xe7\xea\xf2\x8b\xc5\x2c\xea\x63\x53\xfb\xed\x4e\x59\x0b\xff\x44\xf8\xb1\xda\x16\xaa\x47\xf5\x49\x04\x55\xac\xb5\x7c\x61\xef\xbd\x58\x92\xd4\xf1\x9d\x60\x4b\x26\x02\x34\x25\x43\xde\x24\xb1\x35\xe1\x95\xe1\x14\xb4\xbb\xf4\x3e\x89\x1d\x83\x2e\x02\xa6\xa0\x1b\x7a\x76\x97\xe5\x69\x7e\xbb\x01\x77\xcc\x62\x6d\xb7\x36\xc2\x29\xf7\x95\x0d\xd6\xfb\x5e\x27\x3e\x51\x44\x77\x99\x9c\xa2\x54\x17\xe6\x0a\xe6\xb3\x02\xe2\x33\x70\xe9\x40\x81\x59\x50\x82\xa4\xca\xbb\x18\x59\x0c\xe6\x5a\x2f\x49\x04\x1d\xdc\x76\x80\xf7\xd9\xb8\x53\x55\xc4\x73\xbd\x8c\xc1\xbe\x70\xe9\xef\x88\x0b\x67\x22\xfc\x80\xd9\x8f\x85\xc6\xc0\xeb\x63\x51\x4f\x99\x16\x6e\x88\x60\x37\x71\x8d\x03\xf0\xce\xd1\xf9\x0e\x72\x22\xc6\x4c\xbc\x20\x12\x8c\x94\x6d\xee\xa3\xef\xa1\xab\x03\xe5\xdd\xe0\x1b\x58\xb7\x43\xf2\x94\x0d\xae\xe2\x1e\x83\x09\x20\x9f\x55\xa1\x2b\x8b\xb7\xc5\xfc\x87\x6d\x09\x58\x49\x0e\x33\x8f\xeb\xdd\x92\x8b\xd1\x4c\x93\x29\xe5\x59\xde\x74\x58\xc2\xc9\xe5\xfa\x65\xfd\xb6\x07\x41\x3e\xe2\xa4\x74\xec\x91\x15\x18\xca\xa1\xed\x28\xa1\x9d\x54\x62\x10\x18\x05\xdb\x5c\x48\xb7\xf0\xb7\xe6\x28\x7c\x1f\x03\xc1\x0f\x18\x3f\x66\x84\xa7\x59\x1e\xbe\xd0\x2e\x0e\x81\x7d\x0a\x1a\xcc\xf6\x9f\xe6\x19\xb8\x58\x93\x0c\xe3\x21\xc6\xbf\x99\x27\xa5\x59\x84\x40\xbc\x36\xc8\x1b\x02\xe5\xbc\x56\xac\x74\x94\x35\x59\x7d\x58\x81\xdf\xfb\xb2\x11\x6a\xfb\x58\x75\x1a\x1f\xd1\x2f\xdb\x27\x6d\x35\xb1\xab\x32\x28\xe0\xb5\x87\x61\xd3\xd6\xe3\x64\xb7\x5c\xd3\x05\xed\x37\x28\xc1\x77\xd5\x68\x76\x64\x5c\x75\xae\xba\x34\xdf\x38\x44\xb0\x19\xae\x67\x4e\xc6\x9d\xb5\x88\x4b\x16\xd0\x07\xfc\x74\xff\xe1\x90\x3c\xce\x6e\x89\xd2\x34\x8c\x4b\x98\xf1\xf5\x5f\xc4\xb1\x16\x46\xb0\xe9\x6c\x9e\x17\xb8\x92\x90\xf9\x4d\x73\x00\xa0\xc1\xab\x0d\x86\xdf\x81\xcd\x3d\xc0\x02\x99\x06\xf6\xbd\x76\x54\xd5\x55\x9e\x26\xb3\x4d\x63\x57\x99\x4e\xbd\xe3\x96\x1a\x50\x2a\x89\x10\x0a\xd2\x11\x1a\x33\x1e\xa5\x51\x48\x91\x33\x54\xc3\x8c\x2c\x69\x8b\x39\xe1\x57\x18\xe2\x33\x76\xee\x32\x03\xd2\xdc\x42\xe4\xb8\x24\x31\x35\x6d\x2d\x42\x19\x33\x7a\xc8\x72\xd1\xda\x0b\x58\x5c\x78\x41\x82\xdf\x1e\x7d\xea\xe8\x30\xec\xc7\x61\xcb\x3a\x20\x84\x27\xf3\x95\x41\xfd\xf3\xcb\x96\x1d\x73\xe7\xa1\x70\x16\x3d\xb1\x9c\x4a\x86\xf2\x87\x4c\x4d\xf5\x5d\x9c\x2e\x38\x8a\x0f\xbf\x6e\x48\x75\x45\xb6\x72\x33\xb7\x5f\xd9\x7d\xea\x8a\x54\x32\x25\x9b\x3d\xec\xca\x93\x52\x90\x92\x5b\x61\x6c\x38\xa1\xc3\x7e\xa3\x06\x2f\x1c\x9b\xf6\xa6\x86\x1a\x49\x87\xb9\xe1\x54\x1d\x57\xf8\xd2\x5c\x41\xac\x5c\x2f\x34\x80\xdd\xe7\xc0\x20\x1b\x24\x32\x01\xff\x23\xef\x8a\xbb\xb8\x58\x82\x7c\x09\xbb\x37\x6e\xa6\x93\x6c\xb6\x2e\x0a\x5b\x13\xca\xcc\x17\x10\xfc\xd3\xf3\xc6\x20\x1f\xf4\x47\x3e\x7e\xba\x61\xa6\x77\xc9\xe5\x5c\x5b\xb1\xc4\x39\xff\x21\x60\x5e\xb5\xa6\x91\x77\x3c\xee\x4d\xdd\x2a\x4e\xa3\x06\xb2\x56\x8f\x27\xd5\xf2\x45\xee\x47\x96\x3a\xcc\x66\xe1\xd6\xb6\xd0\x6f\xc7\xf2\xc4\x4e\xa8\x20\xf7\xb6\xac\xa5\x61\x7e\xd0\x49\x9a\x65\x55\x92\xad\x35\x9f\x92\xdb\xb8\xa6\x1c\x03\xaa\xdb\xee\x10\x87\x72\x7b\xde\x7c\x1d\x86\xdb\x6f\x68\xc3\xe3\x70\x62\x6a\x64\x00\xe1\x20\x7a\xfc\x55\x3c\x25\x70\x60\x06\x85\x34\x2e\xd9\x49\xfc\xdc\xf6\xd6\x16\x72\x0a\x14\xe9\x72\x09\x8d\x2a\xf7\xaf\x62\x0c\x00\x37\xaa\xb0\x10\x75\xb3\xa4\xbc\x1c\x8e\xd4\xf8\xfa\xea\x6a\x38\x9a\xa0\x77\xe5\x87\x1b\x68\x64\x49\x91\xa4\x16\x9b\x5c\x15\xfa\x98\xaa\x39\x22\xb5\x06\x16\x72\x28\x89\x46\x1d\xfa\xc5\x1a\xc5\x58\xa0\x6c\xd8\x11\x0e\x6c\x7f\x85\x2e\x8a\xbc\xb0\x95\x14\xc6\x7a\xc1\x10\xeb\x22\x4e\xd2\x35\xc1\x5f\xd3\x1c\x55\x0c\xe7\x71\x15\xe3\xc6\xa6\x6b\x26\xc9\xac\x42\x14\xe5\x69\xb0\xd5\xf1\x6c\xb6\x2e\xe2\x59\xa2\xe9\x80\xdf\x0b\xec\x21\x18\xac\xfd\xc8\xdb\xd6\xd8\x31\x70\xd2\xb8\x63\x11\x4e\x0d\x0c\xba\x14\x49\xf9\xa9\x4d\x44\x94\x1f\x80\xc0\xf0\x6c\x78\x0e\xd4\xa3\xc4\xef\x79\x6e\x49\x3d\x3b\x83\xf3\x1a\xb1\x67\xa4\xae\xaf\xde\x8d\x3a\xe7\xc8\x60\x48\x73\x25\xd9\x3e\xe1\x5b\xc8\x73\x0a\x54\x92\xee\x1f\x4f\xc6\xf6\x3f\x8f\xc6\x2d\x75\x74\x36\xec\xf7\x91\x23\xb3\x7f\xa3\x46\xdd\x8b\xee\x68\x84\xac\x8b\x9d\xb1\x3a\xe4\x4f\x1e\x3a\x16\x54\x64\x16\x03\x3e\xc6\x31\xb2\x62\x8e\xd5\x9f\xe0\x0d\xbf\xb6\xe0\xff\x3a\xfd\xbe\x3a\x1b\x0e\x90\x93\x72\x38\x1a\x33\xe1\x68\xff\x46\x9d\xf7\xc6\x67\xfd\x4e\xef\x12\x3e\x23\x68\x44\x89\xcb\xd2\x51\x1c\x46\xfc\xa5\x6f\xc0\x51\x5a\x7b\x78\x03\x6b\x69\x04\xdd\xe9\x4c\x7a\xe3\x8b\xce\xd9\x64\x38\xba\x61\x1a\x52\xf8\xc3\x63\x34\x6b\xf0\x21\xa4\x9f\x3c\xc3\x6f\xfc\xfb\x75\xaf\x3b\x51\xdd\xc1\x9f\x87\x37\x97\xdd\xc1\x24\x82\x81\x19\x0c\x07\xbd\xc1\xc5\xa8\x37\x78\xd7\x35\xbf\x44\x1a\x48\x26\xa3\xbc\x51\x40\x00\x3a\x6e\xfb\xb3\xd6\xed\x9c\xbd\x97\xa3\xa9\xce\x87\xdd\x31\xf4\x9c\x7a\xa8\x3a\xef\x3a\xbd\xc1\x78\xa2\x7a\x83\x49\x77\x74\xd1\x1d\x75\x07\x67\x5d\x4b\x8d\x3a\x72\x6d\x60\xd6\x49\xb9\xde\xcc\x98\x75\x26\xf0\xeb\x8b\xeb\x01\x4d\xa6\x79\x1b\x92\x66\xf6\x06\xf5\x15\x0a\x9c\xa5\x97\xdd\xee\x04\x1f\x4f\xac\xa7\xe6\x05\x63\xf1\x34\xe4\xcd\xec\x0d\x07\x4d\x6f\xc5\x67\xbc\xed\xaa\xeb\x01\x34\x7a\x74\x7d\x35\x41\x36\xda\xee\x68\x34\x1c\x1d\x5f\x8c\xba\xdd\x08\xa9\x3a\x3b\x13\xa2\x70\x1d\x6f\x6f\xcc\xdb\x2e\x33\xb4\x76\xcf\xe1\x18\x1b\x8e\x90\xa1\xf4\xe3\xa8\x37\x99\x74\x07\xea\x7c\x78\x76\x6d\x1a\x08\x0d\x32\xab\x08\x38\x65\xb1\x75\x23\x20\xe5\x3c\xeb\xaa\x77\xbd\x0f\xdd\x81\x7a\x7b\x63\x87\x3f\x52\x1d\x31\x15\xd7\x93\xf7\xc3\x51\xef\x3f\xba\xe7\x6a\xd4\x35\x0b\x13\x1f\xf7\xa1\xcb\x44\xad\x72\x8a\xc6\xef\x61\x0b\x8c\xba\x9d\x49\x57\x75\xec\x9e\xa5\x80\x90\x38\x5f\x9a\x51\x58\x09\x63\xb0\x82\xc2\x4d\x28\xcb\xb9\xbd\x83\xa3\x03\xd8\x59\xee\xa9\x8a\xc2\x86\xbc\xa3\x86\xf4\x27\xc9\xd1\x82\x86\x59\x84\xe1\x84\x62\x3d\x43\x1c\x21\x69\xb3\x71\x31\x03\xbc\x91\x71\x2c\xd9\x1a\x95\x01\x16\xf1\xcc\x58\x30\xf0\xa2\x38\x29\x66\x45\xbc\xa8\x54\x16\xdf\x93\xdd\x2a\x7e\xe9\x6a\x25\x9d\xf4\x03\xa5\x3f\x13\x70\x19\x16\x8b\x64\x66\x2b\x33\x48\x14\xb2\xc4\x2b\x24\x21\x1a\x7b\x8c\x75\xe3\xc9\xde\x08\x82\xc3\x1b\x20\xd5\xf1\x1c\xab\x6c\xe3\xea\x2e\xb2\x35\x50\x2a\xc9\xfe\xb6\x2e\xb0\x22\xa4\x34\xe6\x99\x90\xa5\x07\x22\x83\xfb\xa4\xc8\x33\x00\x52\xa6\x6a\x1e\x2f\xa1\x32\xda\xde\xaf\x82\x90\x2c\xdb\xf0\x8d\x40\x18\xec\x1a\x19\xe3\x22\xa9\x32\xb6\xf4\xc0\x2e\x58\x97\xa4\xf4\xf1\x6b\x1b\x0f\x25\xbb\xfc\xfb\x3d\x3a\x64\xda\x01\x73\xb4\xd9\xc5\x57\xa3\xe1\xfb\xde\xdb\x1e\xd1\x47\xf7\x3b\x1f\x23\x8f\x5b\x18\x97\x92\x5d\x86\x0d\x8b\xcd\x51\xfa\x5e\xd0\x5f\x1d\x4d\xaf\xc7\xdd\x7b\xde\x33\x5b\x64\x6f\xe6\x5e\xa0\x16\xee\x77\x90\x9d\xda\x34\xdb\xf1\x66\x9b\xbf\xc1\xe6\xdf\xc5\xec\xeb\x1f\x33\xd4\x34\x73\x4b\x99\x51\x01\x9e\xed\xe1\x45\xa4\x3e\xbe\xef\x02\x51\xee\xf5\xe0\xbc\x6b\xce\xd6\xc9\xfb\xae\x39\x7c\x87\x17\xd8\xc7\xce\xd9\x24\x12\x77\xde\xc4\x5c\x72\x82\x2a\x78\xd0\x7d\xd7\xef\xbd\x83\x03\xcf\x6c\xbb\xc9\xa8\x77\x36\x71\xc3\xdd\x8a\xcc\xe8\x9e\x5f\x9b\xc3\xc3\xfe\xd2\x72\xf3\x7e\xec\x99\x73\x9b\xd9\x7b\xe5\x08\x03\x0f\xaf\x1c\xe2\xaf\xe0\xef\xa5\xf3\x7e\x62\xce\xe1\xf1\xa4\x33\x38\x67\x92\x6f\x41\x35\xdc\x1d\x8f\x69\x0a\xe8\x1a\xe1\xfb\xdb\x1c\xa7\xe7\x37\x6d\x35\x1e\x5e\x76\xd5\x9f\xaf\x47\xbd\xf1\x79\x8f\xce\xe6\xf3\x21\xac\x9a\x4e\xbf\x3f\xfc\x08\xcf\xdb\xb2\xd4\xcc\x3f\xf6\xa0\x6b\x8e\xd4\xd8\x4e\xad\x7d\xce\x65\xe7\x06\x5f\x72\x75\xd5\xbf\x21\xa2\x68\xc8\xc6\x67\x39\x44\xc3\x2a\x0a\x63\x09\xfc\x4f\x95\x57\x20\xff\xd5\x80\xdd\x04\xee\x77\xd8\x6a\xa5\x3a\xf2\x5d\x76\xb2\xd1\x2c\x2e\x71\xba\x91\x16\x6c\x1a\x3f\xb4\x9a\x94\x39\xf4\xe7\x99\x26\x5c\x7e\xbc\xcc\xd7\x14\xec\xd7\x99\x9a\xe7\x69\x1a\x17\xa5\x3a\xfa\xbf\x4f\x9e\xb5\x9f\x3d\x6b\x59\xfa\xff\x21\x57\x44\xd5\x2a\x9a\x6a\x18\xb3\xa6\x82\xd4\x1a\x60\x15\x0b\x64\x90\xb7\x90\xe3\x9c\x55\x52\x31\xba\x4e\xf0\x17\x52\x88\xa0\x46\x4b\x62\xa5\x27\x43\x1f\x4f\x1c\x47\x5f\xfc\x96\x06\xda\xa4\x26\x4a\x14\x27\x7b\x59\x6c\xf1\xc7\x65\x70\xc8\x2b\x51\x6f\x91\xc0\xe7\x5a\x06\xd9\x42\x12\x08\x52\x3a\x9c\xea\x40\x41\xce\x8b\x55\xcb\x50\xbd\xf4\x47\x23\x05\x04\x6d\xb5\x48\x5d\x24\x5c\x31\x8e\x79\xec\x6a\x46\xd3\x3c\x62\x7f\xb7\xc4\x50\x51\xaa\xc5\xc3\xff\xf8\xc5\x33\x22\x04\x04\x52\x2c\xae\x1d\xa8\x34\x8f\x2a\x5f\x2c\x3c\x30\x21\x4d\x47\x81\x7f\x3a\x39\x69\x9f\xc0\xef\x61\x0c\xe5\x07\xc0\xff\x01\x96\xa2\xd0\x49\x44\x71\x18\x82\xb4\xb1\x34\xaa\x93\x8b\x94\x58\x0a\x28\xe2\x08\x79\xff\xa8\x62\xa5\x41\xee\x0e\x07\x08\x66\xcb\x3e\x30\x28\x08\xf3\xa7\x8f\xf1\x0a\x54\xaf\xe3\xc7\x5d\xa9\x5c\x62\x41\xd2\x2a\x12\x24\xca\x95\x4b\x54\x89\x5d\xc3\x89\xd8\xef\xac\x19\x28\x3c\x2d\x60\xc7\x51\xc6\xf7\xf9\x33\x35\x8f\x37\xe0\xdd\x4d\xf5\x2c\x07\xc1\xe9\x18\xa3\xa8\x0b\xf9\xf9\xa0\x92\x2b\x59\x2e\xf5\x3c\x89\x2b\x8d\x82\x3a\x90\xee\xbe\xb7\x99\x41\xed\x2b\x74\x35\xe3\x0f\x4e\x4e\xdb\x2f\x8f\xa6\xad\x37\x2a\x2f\xfc\x9a\xa7\x2f\x1e\x18\x58\xd5\x30\x10\xc9\x52\xab\xf9\xba\x90\xda\x2c\xf5\xf0\x05\x54\x3a\x23\x99\x03\xb1\xf0\xa1\x60\x48\x83\x14\x60\x2d\x6e\x74\x24\xa0\x70\x1b\x35\x2b\xf2\xb2\x3c\x46\x74\x3d\xf8\xbf\x6b\xa0\x12\xc7\x5f\x98\x93\xc3\x9c\xb2\xe5\x3a\xa9\x5a\x41\x09\xd3\x7a\x95\x67\x96\x41\xf5\x77\xed\x59\xc8\x01\x04\xf2\x88\xb6\xf8\xa5\x6e\x3c\x63\x19\xcd\x91\x93\x61\xf2\x42\xf4\x8f\x44\xe3\x5b\xb6\x0d\xa5\x50\x5c\xfb\xea\x41\x15\x5b\xff\x54\x75\x01\x98\x0e\x8c\xb3\x72\xef\x5f\x9b\x91\xae\xdc\x6f\x22\x01\x92\xac\x72\x6f\x1d\x97\x55\xbe\xf2\x64\x2f\x01\x5b\xca\xe8\x51\xfc\xb2\xac\x44\x8f\x7c\xde\x25\x0f\x8c\xb7\x8d\x88\x88\xee\x92\xb9\x2e\xab\x22\xdf\x04\x35\x9f\xb5\x4f\xdb\xfc\x78\x42\x42\xf1\xab\xbc\x2c\x75\xc9\x5a\x42\x64\xeb\xb7\x55\x27\x4d\x05\xf8\xb4\x74\x90\x07\x99\x2c\x02\x27\xc0\x01\xa7\x30\x11\x98\x6e\xec\xb1\xb5\x2a\x12\x4c\x47\x88\xd1\x22\x53\xa4\x5c\x17\xf7\x56\xd7\x5e\xfc\xb5\x96\x16\xbe\x2a\x88\x41\xb8\xc4\xf7\x45\x94\x2d\x48\x0a\x85\x8c\xc0\x11\xd7\xa1\x39\xc9\x5d\xac\x28\x50\x53\xbd\xc9\xe9\x3c\xdd\xf1\x0a\xbf\x41\x8f\x20\x53\x2d\xf4\xec\x79\xa4\x5e\x46\xea\x4f\x91\xfa\x35\x52\x27\xcf\x22\x75\x72\x12\x99\xe3\x07\x11\x69\x27\xcf\x29\x4f\x65\x96\x3f\xc7\x56\x8d\xad\x85\x61\x3e\x97\x47\xa5\x9c\xf6\x4a\x67\x25\xcd\xbf\x97\x76\x60\x2b\x8c\x63\x94\x79\x51\x31\xa7\x04\xa0\xff\x0a\x5d\xae\x53\xb2\xa6\xa8\x7f\xb0\xcd\x3c\x59\x31\x52\x83\x07\x2f\x11\x8b\xc5\x98\x43\x93\x12\x22\x3b\x86\x86\xdb\xce\x27\xe6\xaa\xd0\x7f\x5b\xcf\xcd\xd1\xe2\x75\x03\xe3\x9b\x60\x01\x2d\xf5\xdc\x0a\x17\x42\xff\xad\x00\xcb\x65\x52\xce\x74\x9a\xa2\xce\xa7\xdd\x67\xa7\xed\x13\xf5\x0e\x20\x22\x70\x86\x74\x33\x28\x72\x2f\x9a\x42\x8c\xc0\x59\x7d\x28\x68\x26\x92\x4a\x2f\x0f\x81\xbf\xcc\xa5\x87\x2e\x3a\x23\x75\xda\x3e\x79\x76\xd2\x96\x8f\xf5\x24\x8b\x20\xb1\x89\x8a\x70\x71\x15\xf3\x55\xdb\x90\x15\xb6\xf5\x70\x88\x67\x03\x8b\x83\xd3\x3c\xeb\xd2\xdc\x28\x80\x39\x72\x35\x18\x52\x65\x23\x68\x57\x88\xe8\x4a\xdc\x33\x36\x4a\xf4\x29\x75\xf3\x16\xb4\x13\x85\xda\xa9\x1f\x89\x8f\xc9\x0c\xa7\xd8\x8c\x82\x59\x8d\x27\x27\xea\x68\x62\x1f\x73\x1e\x57\x31\x02\xbd\xe0\x6f\xa7\xea\xe8\x8c\x89\x70\x18\x13\x09\x7f\x46\xe0\xf4\xb9\x36\xf3\xc7\x45\x59\xe7\x7a\x41\x41\xf0\x62\x76\x17\x97\xba\x8c\xd4\x39\x8c\xf5\xcb\xd3\xf6\xe9\xe9\x2f\xc7\xbf\x3c\x3b\x79\x19\xbe\x4b\x1d\x1f\xab\x33\xd7\xb5\x5e\xa5\x97\x25\xbe\xff\xf4\xf4\x97\xf6\x2f\xa7\xcf\x4e\x8f\x9f\xab\xa3\x91\x1d\x7f\xf1\xd9\x5a\xc3\x14\x00\xd6\xc2\x5f\x9e\xcb\x2a\xcb\x56\x5b\x75\x60\x1c\x92\xec\x36\xdd\x20\xea\xee\xba\x3d\x6e\x37\xae\x2f\x5b\xe9\xd4\x90\xfe\xae\xcd\x76\x58\xc7\x27\x56\xef\xa9\x1a\x69\x64\xed\x60\x02\x87\x2b\x4c\x87\x07\x86\x9d\xb4\xb2\x29\xa4\x83\xe6\x20\x32\x30\xc2\x61\x0f\xa4\x2b\xb3\x0d\xaa\x98\x93\x03\x14\xa9\xbf\xe5\x09\x24\x25\x32\x24\x87\x2a\xfc\xe3\x03\xae\x6c\x24\xe9\x60\x46\x92\x04\x7c\x84\xea\xc1\x1c\xc9\x56\x96\x10\x6e\xfe\x1d\xf9\x3b\x97\x5c\xb3\x2d\xb5\xbc\x49\x21\x15\xa7\xe3\xca\xb0\x41\x78\x38\x95\x21\xea\xc2\x17\x19\xf2\x01\x60\x6c\x4a\xd6\xec\xb9\xa1\x7b\xae\x7a\x82\x7e\xe6\xdc\x91\x2b\x6e\x47\x63\x40\xdb\x92\xe5\x2a\x4e\xbc\xf2\x2a\x9b\x5f\xa1\x49\x8d\x5c\xf1\x08\x01\x14\x23\xbc\xa6\xa0\x19\xa5\x15\xd6\x59\x40\xd1\x45\x04\x20\x11\x6d\x65\x4e\x24\xfc\xdd\x61\x20\x30\xdd\x8d\x69\x6e\xb8\x44\xa9\xde\xc3\x01\x4f\xf3\xc2\xea\x1c\x5a\x72\x34\x00\xa0\x7a\x70\x0e\x38\xee\x89\x8b\xac\x46\x99\x59\x47\xfe\xee\x6a\x81\x4d\xf5\x72\x1f\x6d\x51\x0a\x75\xc8\xeb\x8c\x18\xf9\x17\xea\x63\x9c\xdc\xeb\x02\xa8\x44\x6c\x74\xb1\xad\x2e\x28\x8c\xf7\x58\x29\x6a\x4e\xda\xda\x9a\xc9\xc9\x49\xba\xa2\xf1\xfa\xa0\x45\x4f\x60\xa4\x58\x3d\xc0\xab\x21\x22\xb7\x86\x25\x4d\xcf\x5a\x5a\x5b\x3f\xae\xfc\x65\x6e\x5f\xd0\x56\x9d\x0c\xc9\xac\xe1\xae\xb9\x5d\x13\x5f\x0e\x1a\x22\x74\x20\x96\xce\xce\x64\x32\x45\xe6\x31\x22\x56\x17\x8b\xe9\x11\x1b\x91\x6c\x57\x88\xbc\x16\xc8\x0d\x6c\x5b\x8f\x52\xc1\x4d\x42\xe1\x38\x9c\x2f\xd5\x58\xdf\xeb\x82\x42\x29\x6d\x70\xc5\x7a\x0b\x9b\x52\xa6\x0c\x30\x2b\x87\x13\xff\x98\x06\x3b\xf5\x6f\xeb\x22\x29\xe7\x09\x19\xd6\x49\x36\x2f\x77\x0f\x29\x42\x9e\xc3\xac\x15\x62\x44\x3d\x71\x65\xaa\x44\x08\x1e\xa4\x6b\x37\x3b\x7d\xc5\x5e\x5e\xcb\xf8\x73\xb2\x5c\x2f\x19\xb6\xcd\x64\xe5\xc6\x72\xb1\xc2\xdd\x64\x5e\x81\x87\x36\xcb\xb3\x7c\x99\xcc\x88\xce\x86\x2a\xb1\x24\xa4\x53\x30\x1f\x5a\xe7\x16\x0c\xb5\x79\x93\x96\x66\x02\xd6\x2b\xe5\x80\x93\x0c\x55\x93\x78\xa9\xcd\xe9\xcd\x6d\xf0\x17\x1f\xc1\x5c\x27\x8b\x20\x34\x65\x21\x5b\xa5\xa4\xdc\x40\x4e\x76\x70\x94\x30\xcf\xc9\x74\x7c\x92\xc6\x18\xbd\xe3\x84\xf5\x71\xfc\xfa\x03\xf3\xe9\xe7\xb8\x39\xc1\x5f\x2d\x09\xa9\x4d\x53\x41\xb0\x91\x85\x27\xe0\x69\xee\x16\x7e\x4a\xd4\x78\xc4\x39\x1f\xc2\x3a\xfb\x8e\x72\x04\x58\x0a\xc4\x47\xe6\x49\x69\x07\x4d\x54\x27\x34\xba\x0a\xcd\x7e\x42\x52\xed\xeb\x19\xb8\x65\xff\x4a\x9d\x27\xa5\xb9\x90\xd5\x48\x97\x79\x8a\xa5\x63\xb8\x43\x93\x2a\xb9\xb5\x69\x0a\xdc\xc4\x73\xfa\x6c\x61\x3f\x6b\x2f\x29\xa6\xd8\x16\x81\xb4\x94\x4c\xd9\xbc\xc9\x54\xaf\xe2\x4f\xcc\x26\x40\x56\xdb\x58\xc7\x55\x65\x16\xfd\xc7\x18\x10\x0b\x15\xd2\xec\xce\xeb\x8f\x26\xe8\x08\x88\x24\xbb\x9b\xcd\xa6\x23\xbc\xfd\xc8\xe5\xae\xf7\x1a\x57\x23\x95\x12\x54\x3c\x17\x0b\x3d\x07\x04\x33\xec\x6b\x01\x78\x8f\x2b\x33\x32\xc8\xe8\x02\x0b\x86\xf8\x02\xea\x81\xb4\xc9\x9d\xae\x4b\x56\x6b\xe6\xb1\x1d\x90\x0b\x7c\x96\x73\xf5\x9b\xca\x33\x3c\x89\x63\xb3\x72\xb9\xa6\xa6\x87\x1c\xc2\x04\x29\x19\xc7\x48\xc1\xf2\x2e\xcf\xe7\x20\x05\xe4\x32\xe5\x56\x88\xd8\x4d\xe2\x2f\xaa\xfb\xd9\x9c\x27\x4f\x7b\x58\x62\xdc\x8f\x1f\xd8\x74\x91\xc6\xa6\x84\x51\xa7\xa9\x79\x64\x5e\x54\xb2\x34\xd9\x38\xd0\x54\xf4\xe7\xf8\xa8\xe8\x17\x7c\x4e\x5b\x8f\x14\x35\x92\x37\x2e\x91\xb4\xc9\xd7\x56\xff\xbe\x71\xd5\x32\x30\x9b\xbc\x9f\x10\x9f\xad\xb3\x92\x03\x19\x74\x2f\x92\xcc\x01\x36\xd4\xb8\xdc\xc7\xd4\x66\x62\xe8\x69\xa8\xa6\xb6\xdc\xc2\xc8\x28\x46\x77\x2d\x9f\xb2\xa6\xb1\xf7\x49\x2e\x19\xda\x28\x18\x2c\x7b\x1c\xe1\x40\x78\xd7\x13\x5a\x00\xb6\x7a\xc8\x5c\x2a\xac\xc6\x43\xfa\x4f\xc4\xa1\x27\xbd\xa2\x3f\xa9\x2e\xc2\x0e\x3a\x0c\x9b\x7a\x43\x76\xac\xe9\x66\x3f\x0e\x03\x87\x12\x75\x2c\x2a\x45\x1c\xe8\x8a\x37\x9b\x38\x91\x1b\x16\xa7\x2b\x49\x59\xc6\x95\xb9\x04\x99\xf9\x73\xd2\x08\x8a\x0d\xc1\xfd\xd8\x79\x6f\x11\x13\x19\x33\x9f\xfd\xf0\x4f\xf3\x11\xb7\x53\xb9\xd7\x1f\x3d\x82\xff\x34\x9f\xc5\x42\xa6\x0d\x2e\x32\x4a\x74\xfe\xfb\x5a\x4f\xf5\x2c\x52\x67\x71\x16\xcf\xe3\x88\x4e\x7e\xe6\x8b\x9d\xa5\x58\xcf\x87\x85\x24\xaf\x61\x8f\x71\x87\xdd\xee\x5f\x24\x60\xba\xa1\xa1\xb0\x61\xd1\xb4\xbf\xaf\x11\xe5\x42\x7f\x08\x02\x9f\x10\xd7\x0f\xf8\x5d\x4a\xb0\x6d\xc0\x62\x40\x78\x62\x76\x9b\x26\xe5\x5d\x5b\xf5\x41\xe5\x08\x5f\x9b\x67\x66\x25\x26\xb7\xff\xe7\xbf\xd4\xdf\xd7\x5a\xa5\xa6\x3b\xff\xe7\xbf\x4a\xc7\xba\x58\x29\x6d\x26\x60\x5d\xaa\x54\x97\xe2\xd9\xb3\x3c\xcb\xf4\x67\x6d\xf6\x62\x02\x15\xa6\xff\xe7\xbf\xe6\xe6\x31\xa5\xd2\x99\x8a\xb3\xdb\x34\x4e\xca\xb6\xea\xfe\x15\x12\x92\xaa\xd3\x3e\x38\x14\x5a\x63\xb3\x96\x3a\xf9\xf5\xd7\x97\xc7\xa7\xcf\x9e\x9d\x36\xa8\xc4\xc8\xaa\xe3\x94\x8e\xc7\x12\x03\x3f\xe4\x92\x8d\x40\x21\xd8\x1c\x17\x93\x80\x93\x15\x86\x66\x91\xa4\xda\x5d\xea\xc8\xb8\x64\x41\xd6\x4e\x48\x8e\x3e\x56\xd4\xaa\x9d\x00\x5e\x17\xe2\xad\xf4\x3e\x4a\x2e\x1f\xa4\x92\x0b\x70\xcf\x8c\xae\xc6\xfd\xc3\x96\xa4\x55\xde\x5b\xce\xa0\x58\x95\x36\x52\x6f\xe5\xb9\x6d\xd5\x0b\x77\x4d\xe0\xc6\xbc\x06\x9e\xf1\x33\xf7\x68\xe3\xd9\xd7\xb7\x71\x56\xa6\x51\x43\xde\xdd\x3c\x12\x2d\x06\xb0\x51\x03\x2c\x9c\x00\x62\xda\xcc\x07\x64\x50\xac\x6e\x05\xd8\x3d\xb2\x3f\x6d\x8f\xd3\xcc\x6a\x04\xc1\x08\x10\x7e\x1f\x65\x2a\x56\x69\xe2\xc2\x0d\xb6\xae\xcc\xf8\x91\x24\x6a\x46\x80\xf5\xfb\x38\x4d\xe6\xdc\xce\xca\x57\x2b\x0a\xd0\x6f\x62\xb5\x70\xdf\xda\xea\x0a\x50\x69\xaa\x24\x51\x44\xf1\x0d\x7a\x21\x3e\x9b\xaf\x42\x5b\xc1\xed\xc3\x74\x05\xfd\x7e\x49\x87\x16\x60\xf4\x9d\x9d\xe4\xaf\x6e\x9c\x73\xd2\x8f\x84\xce\x27\xa5\x57\x69\xf8\xde\xcc\x95\x3a\x1f\x74\xd4\xc4\x3a\x68\x6d\xbf\x73\x24\xdf\xc2\x15\x72\x45\x0d\x6c\x3e\xb3\x2c\xb5\x0f\xc4\x6f\x2a\x58\x08\xf9\xd8\x63\x7a\xa1\x84\x95\x1c\xe6\xa2\x55\x7b\xef\xbe\x80\x94\x1c\xe1\x76\x5e\x7d\x2e\xd4\xb2\xa8\x27\x00\x60\x7b\xa2\xa6\x71\x99\x94\xd1\x17\x89\x53\x7b\xb0\xaf\xce\xe0\x5c\x8d\xba\x9d\xfe\xa0\x3b\xf9\x38\x1c\xfd\x65\xac\xde\x77\x47\xdd\xb7\x0e\x4d\x36\x06\x38\x19\xa4\xdf\x1d\xec\x4b\xca\x19\xf3\x9b\x5d\x92\x3b\x92\x02\x9c\xcd\x42\xd6\xd1\x1e\xb0\xaf\x00\xe6\x65\x5a\x3d\x18\x0e\x8e\x25\xca\xab\x7d\x20\x9c\xdd\xa3\xb2\xf5\x5a\xfd\xbf\x7b\xfc\x1c\xb8\x85\x60\x0b\x03\xd1\xf6\xff\x4b\x52\xa9\x89\x2e\x2b\x35\x5e\x27\x15\xf0\x1b\xf7\x73\xb2\xf7\x8e\x92\x45\x58\xb4\xc9\x4b\xbf\xf5\xfa\xe0\xb1\x57\x1e\x1e\xd4\x49\xba\x5e\x8b\xa5\x79\x96\x26\x98\x35\xb5\x0d\xe3\x05\xd2\x56\xfe\x3d\xd1\xa4\x21\x66\xef\x0e\xbc\x13\x68\x5d\x16\xf6\x4e\xe0\x5b\xe7\xed\xc1\xf6\xca\x58\xbb\x2f\x1f\x3f\xd4\xb9\x28\x94\xaf\xf1\x34\x29\x2b\x29\x83\x06\xce\x69\x0e\x64\x97\xb3\x86\x5b\xc3\xb2\x64\x20\xd5\x25\x0b\xaf\xbd\x44\xe1\xb5\x88\x0f\xf8\x1a\x27\x90\xe9\x49\x67\x16\xcf\xb5\x71\x62\x41\xd5\x94\xda\x73\xd0\x59\xc5\xb3\x3b\x21\x72\xea\x7e\xbf\x4a\x75\x73\x1f\x0e\x3a\x45\x95\x94\x55\x32\xe3\xe6\x1c\x74\x2a\x97\xbc\xe9\x30\xf1\x97\x1d\x9e\x83\xb7\xe3\x73\xfb\xd1\x33\xe4\xc1\xf5\xeb\x42\x4f\x0e\xba\xc9\x62\xa1\x53\x75\x91\x17\x6b\x5b\x01\x76\xb0\x43\xc7\xf5\xe8\xdd\x55\xbf\x75\x02\x9f\xe8\x27\x53\x50\xce\xc9\x0b\x75\xd8\xd7\x65\xa9\x8b\xc3\xad\xdf\xea\xe3\xd7\x7a\x6f\x2f\x83\x3f\x1d\x18\xef\x22\x55\xc3\x95\xce\xc2\xde\xfe\x39\x9e\x9a\x41\x6e\xfa\xd3\x65\x6f\x62\x3b\x76\xd9\x9b\x8c\xba\xea\x2c\x4f\xd3\x78\x0a\x3c\xd2\xf7\x5a\x7d\x48\x0a\xc8\x90\x43\x94\x6b\x15\x8b\x7b\xf3\xe8\xec\xc3\x47\xcb\xc6\x74\x70\x99\x57\x79\x99\x5b\xbe\x19\x7d\xb0\xa5\x7c\x16\x6e\xd9\xcb\xab\x7e\x6b\xfb\x07\x4e\xe8\x03\x83\xfc\x53\x12\x37\x36\x1a\x7e\xf7\xae\xc8\xd7\x2b\xb1\x5f\xed\x5f\xaf\x36\xd5\x5d\x9e\x35\x89\xde\xda\x8f\x8c\x92\x59\xee\xf3\x7c\x06\x63\x39\x5e\x67\xaa\x97\xcd\xd7\xa5\xf1\x7e\xc6\x55\x9c\xcd\xe3\x62\x5e\x86\xa6\xc3\xd1\xb8\x37\x1e\xf7\x5b\xf0\xe9\xe0\x01\xd7\x59\x02\x0b\x1f\x43\x0a\xbd\x34\x4d\xb2\x3c\x29\x9f\x0e\xce\xc6\x9d\xc6\x2e\x7d\xc8\xef\x93\x79\x5c\x5b\xc4\xea\xbe\x0d\x5a\x85\x1f\x9f\x9f\xd9\x8f\xfe\xb5\x3d\xd0\x95\xfd\xd7\x7f\xe4\xab\x5a\xeb\xff\x91\x26\xd3\xa7\x69\x32\x5d\xc1\xf6\xc4\xdf\x9d\x0c\xf2\x4a\xbf\x56\x53\xcd\x14\x9e\x4e\x51\xd0\x51\x5e\xb0\xa0\x2c\x94\x83\x14\xf9\xcc\xe6\x39\xb0\xc0\x12\x74\xd0\x21\x5a\xb5\x2e\xd0\x33\xcb\x31\xfe\x34\xe7\xe2\x8e\xa6\x82\x73\xe4\x72\x64\x73\x65\xea\x49\xde\x6d\xa3\xbb\xf0\xc3\xb0\x74\x66\xa5\xb2\x48\x02\xa9\xc4\xe0\x6a\x0e\x0e\x66\x27\x3d\x57\x2f\xf2\xe5\xee\xd7\x20\xf1\x90\x4b\xa8\x57\xe6\xef\x7b\x24\x76\xb2\x8d\x32\x7e\xd8\x72\x85\xae\x37\x04\x22\xb3\x3c\x43\xe3\xc7\x33\xea\x64\xe2\xb2\x2e\x3a\x04\x6f\x7c\x77\xd5\x8f\x6a\x65\x06\x5e\x80\x60\x91\x17\xd3\x64\x3e\xd7\xd9\xf6\x52\xe8\x9a\xab\x5d\xb8\xca\xec\x2d\xd7\x00\xd5\x8e\xdb\x92\x38\x74\xa3\xb5\xd4\xf8\x61\x63\x6e\x77\x59\x3d\xf8\x21\x29\xea\xdb\x87\x55\x1a\x70\x5f\xcc\x62\xd0\xec\x05\x71\x75\x15\x57\xaf\xbf\x42\xd2\xcc\xde\x6b\x67\x07\x72\x86\x9e\x88\xa2\xb4\x15\x14\xa5\xb5\xbd\xbf\x53\xae\xaf\x0c\x9c\x51\x51\xe1\x37\xcb\xa1\x62\x16\x25\xe8\xe3\x52\x1d\xd6\xcb\xdd\xca\xc3\xd7\xea\x50\x3e\xf5\x30\xc2\x7f\x5f\xa5\xf1\x46\x17\xfc\xaf\x3f\xaf\x3f\xe9\x69\xfe\x99\xff\x39\x06\xdc\x2e\xff\xab\xb3\x9e\x27\x39\xff\xe3\x43\x32\xd7\xf6\x1f\xc3\x4c\x2b\xff\x41\x97\x7a\x9e\xc4\xe6\x1f\x60\x33\x1c\xfa\x51\xf7\xed\xc5\x89\x5e\x01\xa1\xe7\x3d\xf8\x43\xd2\xd0\x43\x2a\xe8\x3b\xa4\x95\x56\xca\x70\x65\xc3\x78\x34\xd2\x1b\x4f\x37\x14\x64\x56\x14\x63\x13\xee\x08\x82\xba\x00\xdb\x52\xd6\x1d\x8e\x27\x3e\x95\x93\x6d\xd4\xba\x8c\x6f\xb5\xba\x5d\x27\x73\x9d\xc2\x24\xa2\x9b\x05\xf4\x9c\x39\x04\x04\xe2\x4a\x99\x25\x54\xe8\x38\xcd\xb8\xb3\xb3\x7c\xf9\x34\xc9\x16\xf9\x53\x58\x58\x69\x7e\x9b\xb7\xef\xaa\x65\xda\xfe\x2d\x5a\xc3\x3f\x7f\xfe\x78\x3f\xed\xa7\xd7\x59\x62\x4e\xb0\xe3\xf3\x8b\xf1\xf1\xe9\xb3\x93\x97\xdf\x5e\x07\x7a\xb7\xfe\xf3\xb3\x97\x2f\x5e\x3e\x0f\xf4\x9f\x9f\x3f\x3f\x7d\xf1\x53\xff\xf9\x47\xfc\x5c\x0f\x7a\x08\x89\xef\x0d\xce\xda\x16\x51\xdf\x79\x37\xea\x62\x51\xd0\xb1\x3a\xef\x4c\x3a\xea\xa2\xd7\x27\x14\xf9\x78\x78\x31\xf9\xd8\x19\x75\x0f\x68\xdd\x20\x18\xe2\x42\xba\xe8\x04\xb2\xae\x62\xf2\xdc\x9d\x59\x80\xb1\x99\x1c\x68\x14\xcd\xed\x45\x97\xd7\x1a\x1f\x05\xb7\x16\x1a\x0b\x4f\xa3\x6d\x7f\x2f\xb4\xb1\xa2\xca\xa7\x18\x1e\xd8\xf2\xa1\x59\x3a\x2f\x9e\x9a\x16\x3c\x6d\xab\x86\x76\x52\xfc\x9c\x9b\x7b\x75\x7e\x61\x6c\x99\x24\x23\xee\xeb\xd9\x1d\x08\xf5\xd7\x9b\xbd\x79\xa4\xd1\x82\x7e\xcb\x93\x0e\x21\x26\x16\x78\xb8\x2b\xb4\xa4\x28\x08\xb7\x8f\x2d\x66\x25\x44\x7b\x7e\x97\x11\x3b\x18\x0c\x27\xbd\xb3\x2e\x55\x4f\x8c\x5e\xab\xb3\xb8\xd0\x98\x3f\x2c\xa0\xd0\xc5\x77\x65\x11\x9e\xc1\xa1\xf8\xb6\x7a\x7b\xa3\xce\x87\x1f\x07\xfd\x61\x07\x4b\xe3\x7a\x83\xf1\xa4\xd3\xef\xc3\x7f\x9f\x0d\xaf\x6e\xa0\xa8\x43\x54\x3d\xa8\x6b\xa8\xf3\xa0\x85\x08\xeb\xf0\xc9\x58\xae\xba\xa3\x43\xf7\x8f\xc3\x56\xc4\x05\x74\xbc\x10\xd5\xd1\x21\xff\xa7\xf9\xeb\xcd\xf0\x5a\x5d\x0f\xba\xff\x7e\xdd\xfb\x30\x3c\xeb\xf4\xfb\x37\xaa\x73\x76\xd6\xbd\xa2\x9a\x37\x58\xd8\xa6\x67\x6f\xbb\xea\xed\xf0\x7a\x70\xae\xde\xde\x44\x10\xaf\xa1\x22\x8a\x49\x77\x74\x89\x0b\xdd\x2f\xd0\x83\xaa\x04\xbb\x2d\xda\xaa\x77\x01\x6f\xe2\x02\x88\x77\x50\x23\x46\xff\xe2\xee\xdb\xbe\x63\xc7\x23\x75\xde\x1b\x63\x15\x07\x14\x88\x70\x69\x8a\xe8\xaa\xe8\x56\xfb\xc0\x7c\x07\x8a\xf0\xa0\x39\x57\xdd\xd1\x65\x6f\x3c\xee\x0d\x07\x0a\xe7\xe7\xc0\x45\x39\xfe\xf7\x7f\xa9\x93\x5f\x7f\x3d\x81\xe3\x9b\xd7\x13\xc5\xc1\x9b\xa2\x1b\x94\xc0\xc3\x70\x99\x5b\x6a\x13\xf6\x26\xae\xa9\xba\x6b\xcb\x4a\xe1\xd7\x92\x41\x70\xe5\x24\xbf\x93\xd2\xa3\x40\xd6\xf3\x08\x39\x6a\xf3\x05\xd1\x12\x44\x56\xf3\x9d\xe4\x5c\xa7\x2c\x7b\x26\x95\x2d\xdc\x9e\x10\x87\x08\x17\x0f\x08\x69\x22\x5f\xc3\x02\xe3\xd0\x6e\x97\x1f\x02\x5d\x04\x3f\xc9\x03\xc9\xed\xf1\x1c\xde\xc8\x48\x54\x30\xd7\x50\xcd\x85\x7c\x5f\xee\x1c\xc9\x05\x5a\x8b\xdd\x12\x91\x30\xdb\xc3\x6b\xf1\x68\x33\x7c\xad\xf4\x48\x2d\x35\x0c\x19\x9d\x18\x51\xa8\xd0\x01\x99\x7c\x5d\x43\xc4\x36\xb7\xcf\xf2\x43\xa0\xa9\x49\x13\x00\x6f\x7e\xb8\x23\x3e\x8b\x2d\x3d\x43\xb6\xca\x22\xc3\x53\xcb\xc9\x96\x7b\xf4\xcc\x07\x84\xd2\x07\x77\xc5\x97\x5e\x11\x9a\xf0\x04\xdd\x26\x39\x15\x04\xe4\xef\xdb\x81\x03\x82\xd2\x7f\xc9\x1b\x92\x6c\xeb\x3c\x47\x4c\x00\x7c\x34\x6b\x61\x1a\x14\xa4\x9c\xa0\xc8\xd0\x89\x80\x00\xf4\xdf\x12\xdb\xda\x96\x51\x7d\x79\x25\x43\x68\xbe\x54\x02\x9c\xdd\xde\xba\x12\x0d\xb1\x79\x05\xfb\x40\x28\x47\x10\x63\x6e\x51\x3e\xb0\x03\x72\x01\x0f\xb7\x5c\x04\xdc\xaa\xf6\x41\x70\x88\xc8\x5b\x5a\x99\xff\x85\x25\xdc\x8f\xc6\xbe\x77\xd5\x3a\x37\x94\x3a\xc3\x29\xf6\x1b\x83\xd7\x5f\x52\x91\x5c\xaf\x48\xc4\x0a\x3f\x3e\x2e\xdf\x0f\xfb\xe7\x5d\xa8\x9d\xc3\xff\x1a\x53\xeb\xb9\x84\xb8\x37\xa6\x23\xb4\xa1\x5a\x11\x22\xf8\xb6\x40\x90\xea\x15\x1f\x2f\x57\xb4\xdf\xe0\x82\xbb\x8f\xef\x3b\x93\xf1\xb0\xfb\xa1\x3b\x52\xa3\xee\xf8\xba\x0f\x85\x8b\x17\xa3\xe1\xa5\xea\x0f\xc7\x30\x44\xd7\x63\x73\x63\x98\x69\x1b\x8e\xcc\x14\x5d\xf4\x26\x63\x57\x81\xd8\x1b\xa8\xce\x40\x75\xce\xb8\x94\xce\xd5\x1f\xfa\x55\x86\x70\x8d\x42\x25\x62\x6f\x78\x3d\xa6\x2f\x44\x0d\xd5\x93\xbd\x81\x79\xc6\x00\x4b\xe4\xb1\x20\xdb\x8c\x1a\xd5\x4c\x5e\x75\x47\x50\x85\x0c\x4f\xbd\xd8\x79\x2d\x75\xad\xd7\x5a\x2f\x50\x62\x25\x11\xb3\x72\x81\x8e\x87\xb0\x69\xbc\x59\xef\xf2\xd4\xdc\x36\x98\x62\x27\xec\x9c\x55\xab\x9d\xdf\xeb\xa2\x4a\x58\x93\xd9\x45\xb3\x90\x90\x0a\xb8\x78\x10\x8e\x48\x44\xe3\x02\x7e\xa3\xe3\x34\xc9\x6e\x79\xe3\x95\x8f\x1e\xd2\x88\xdd\xe7\x82\x12\x0f\xa7\xe0\x72\x66\x7e\xa3\xff\x9b\x7a\xbe\xed\xa7\xc3\xfe\x79\xe7\xea\xf8\xb4\xfd\xea\xdb\x3b\x7e\xf4\xf3\x88\xff\xf7\xe2\xe4\x59\xe8\xff\x9d\x3e\xfb\xe5\xd9\x4f\xff\xef\x47\xfc\x4c\xee\x34\xc4\xd6\xcd\x22\x08\x43\xe2\x9c\xe5\x3f\x6d\xbf\x8a\xd4\xc9\x0b\xf5\xe7\x75\xa6\xd5\xe9\xb3\x67\x27\x07\x23\xed\x55\xee\x98\x3b\xd8\xa6\x9b\x25\xb8\x0a\x99\x98\xb6\x19\x5a\xc2\xc8\x8a\x08\x9d\xee\xa0\x44\x7e\xe5\x10\x44\xab\x6c\x90\xcc\x17\x86\x08\x10\x32\x8e\xc6\x17\x08\x52\x75\x05\x75\x84\x27\x6d\xe5\x37\xba\x44\x6a\x4b\xe7\x98\x49\xb1\x39\xb7\xf9\x85\x78\x2e\xb1\x46\x25\x33\xaa\xac\x3f\xad\x3f\x32\xc9\xd4\x34\xc9\xe2\x82\x68\xea\xe9\x91\x2c\x5a\x27\xf2\xfb\x8f\xbd\x20\x12\x71\x5f\xc0\xd4\x72\xa7\x44\x56\xdc\x76\xd9\xa9\xd7\x6d\xb1\x3c\x24\x95\x97\x15\x18\x72\xa3\x68\xcd\x91\x1a\x4f\xfe\xf3\x7a\x17\x91\x55\x9c\x98\x6b\x62\x27\x08\xef\x09\xd3\xf1\xfb\x99\x09\x7e\x72\xc7\xe1\x55\x68\xbd\xc7\x76\x08\xc8\x07\x38\x81\x59\x69\xc5\x3f\x78\xe9\x95\xdf\xfc\xb6\xb0\x97\x56\xed\x76\x60\x78\x6c\x64\x6f\x08\xbc\x2f\x9c\x99\xc9\x24\x96\xde\xee\x11\x39\x33\x64\x0b\xbc\x4f\xc2\xa4\xd1\x36\xaa\x2a\xf8\x2c\x79\x50\x82\x9e\x8a\xe2\xc1\x35\x8a\x2a\xce\x0b\x31\xd5\x9e\xed\x01\x39\x73\x5e\x5a\x88\xdf\x6d\xdf\xe1\xc5\x17\xb6\xf1\x44\xb9\x4f\x7b\x29\x68\x63\x6c\xf6\xc6\xce\xbc\x94\x04\x41\x6f\x6f\x98\x6b\x65\x80\xe3\x61\xfc\x6b\xac\xe1\x27\x7f\xda\x71\xf0\xfc\xe7\x7f\x22\x18\xe3\x09\x7a\xe5\x83\x1b\x36\x3a\x91\x78\xa5\x4e\x9b\xf3\xb5\x6c\x3b\x75\x5b\x14\xde\xf8\xb8\x39\x3a\xea\x5a\x40\x47\xf7\x7c\x9b\xcd\xd9\xd0\xd7\x48\xf5\x26\x63\xaf\xb3\xc4\x1d\xd3\x25\xd6\x96\xa3\x71\x0b\x0c\xb7\x8f\x83\x2e\xfe\x37\x9a\x5b\x76\x48\xeb\x36\x29\xda\x9e\x8e\x34\x23\x6a\xe6\xd4\xe8\xfe\xb5\x7b\x79\xd5\xef\x8c\x6e\xa2\xed\xac\x1a\x47\x8f\x8c\xe2\xd5\x68\x78\x76\x3d\xb2\xd6\xf7\xf8\xfa\xed\x78\xd2\x9b\x5c\x4f\xba\xea\xdd\x70\x78\x8e\x96\x60\x77\xf4\xa1\x77\xd6\x1d\xbf\xa9\x5b\xb2\x91\x30\x65\xdf\x98\xff\x7e\x7b\x3d\xee\xc1\x38\x5b\x62\x9d\xde\x70\xd0\x52\xef\x87\x1f\xc1\x32\x3e\xeb\x5c\x9b\x09\x37\x13\x02\x8b\xe4\x46\x10\x6e\x58\xee\x08\xcf\x26\x76\x66\x70\x48\xaf\x81\xa3\xbc\x93\x91\xc3\x86\x9c\x5a\xd6\x3e\xee\x0d\x08\x79\x73\xc3\xa6\xb2\x35\x8a\x29\xe6\xc3\xf3\xe2\xc8\x39\xf6\xa6\xdd\x68\x1f\xd8\xb3\x01\xca\xfb\x04\x67\x25\xa1\xa5\xea\x47\x47\x5b\x84\x75\x4e\x7e\xfd\xf5\xd7\x63\x73\xdf\x6e\x3b\x67\x22\x73\x3a\x3f\xe4\xf9\x5c\x9d\x01\xaf\xe1\x59\x9c\x26\x8b\xbc\xc8\x92\x38\x52\xd7\xe3\x4e\x33\xde\x51\x89\x80\x0d\x14\xc7\xaf\x36\x81\x30\xc6\xdc\x3b\xd5\xad\x67\x2e\xce\x75\x41\x4b\xfa\xdf\xd4\x2e\xfe\x57\xf9\x69\x3f\x3d\x3b\x3f\xef\x1f\x9f\xb4\x4f\xbe\x9b\xf9\xff\x88\xfd\xff\xe2\xf4\xf4\xc5\x2f\x81\xfd\x7f\xf2\xcb\x8b\x9f\xf9\x9f\x1f\xf2\x73\x36\xbc\xbc\x1c\x0e\xd4\x79\xf7\x43\xb7\x3f\xbc\x82\x73\xdf\x1c\xc7\x36\x52\x6d\x6e\x6f\xce\x0a\x1d\x99\xa5\xd2\x3a\x70\xe0\xdf\x13\xb2\xac\xcf\xad\x32\x7c\x29\xf4\xdb\xdb\xea\x50\x60\x0d\x59\xe1\x9c\x34\xdc\xa4\x7e\x3b\x69\x26\x22\xa5\x22\xe0\x40\x4b\x5b\x94\x03\x07\x92\xc5\xc8\x61\x3d\x29\x5a\x25\x8d\xda\x37\x27\xed\x53\xff\xb5\x0c\x55\x96\x4a\xfb\x0d\xc2\x11\x16\xb7\xea\xe2\xa5\x68\xf3\x05\x3c\x2e\x25\x9b\x64\xf2\x15\x47\x28\x81\xd8\x72\xb6\x79\x33\xc3\x0d\xc2\x80\x1c\x61\x68\x28\x99\x04\xed\x7f\x0e\xed\x47\x0c\x8b\xf5\x8f\x02\x75\xf8\x86\xd6\x92\x7c\x7b\x50\x72\x69\x7e\x8b\xe1\xcd\xb0\xd3\x18\x54\x27\x3b\xde\x58\xc3\xb5\x67\xa2\x5b\x50\xfb\x5c\x5d\x95\x0b\x66\x14\x50\xdb\x2e\xdc\x6d\xa1\xbd\x54\x60\xe2\xfa\xf7\xa2\xad\x0e\xbb\x56\xa3\x56\x4e\x4b\xd8\x6b\x4f\xf1\x4b\x50\x35\x49\x8d\x57\xfb\xd8\x97\x6d\x75\xd8\xb3\xfa\xbe\x84\x4a\x96\x4f\xdf\xbe\xe4\x16\x49\x41\xf2\x3e\x65\xc3\x28\xd4\xc5\x6a\x1b\xca\x24\xdb\xaf\xda\xea\xb0\x8f\x72\x1b\x1f\xf3\xe2\x13\xbf\x98\x74\x08\x58\x38\x07\x14\x25\xca\x7a\x47\x5d\xd9\xa3\x1d\x30\x1c\xfd\xad\x42\x13\xdb\xa9\xf5\xa1\x39\xbf\xb4\x19\x9f\x22\x46\x38\xf4\xcb\xe0\x93\x7f\xb2\x9f\x94\xd3\x71\x17\xdf\x7b\x22\xa3\x96\x66\x3f\xda\x56\x4a\x99\x63\x1d\xa5\xab\x9e\x26\xc7\x1c\x9c\x1d\xda\x64\xac\xbf\x8c\xac\xe1\xc0\x54\xc7\xfe\x06\x30\x9d\x22\xef\x56\x84\xe9\x19\x2a\x49\xa1\xaf\x3a\x02\xea\x7b\xbd\x71\x9c\xfa\xb6\x1b\xbf\xb6\xd5\xa1\x4f\x0e\x25\xa6\xde\x13\x6d\xca\xe6\xaa\x1b\x4a\x24\x2f\x58\xef\xac\x6a\xd2\xbf\x57\x4a\x75\x10\xad\x06\x60\x79\x52\x6f\x2f\xd7\x69\x45\x74\x4d\x71\x66\x29\xe1\x81\xe1\x70\xae\x53\x8d\x35\xaf\xe6\xaf\x40\x70\xed\x5a\xd6\x84\xc9\xc7\x1c\xd7\xee\xdd\x48\x35\x98\x49\xbe\x0e\xf4\xa3\x04\x55\xce\x5b\x6c\x66\xa6\x1f\x44\x53\x2d\x50\xd1\x8a\x6e\x6d\x3b\xf3\xb6\xbe\xc3\xe7\x1c\x3a\x6b\x7a\x4b\x52\x8a\xf3\x7a\xee\xbb\xe4\x01\x1a\xff\x11\xb9\x2e\x71\x83\x3c\x6b\xab\xc3\x5a\x2b\xbf\x70\x66\x67\xcc\xab\x60\x83\x52\x4e\x90\x20\x31\xf7\x0c\x3e\x1e\x92\xdb\x50\x8e\xb1\x95\x94\x18\xdb\x64\xae\x35\x92\x67\x3c\x03\x7a\x46\xbb\xd7\x1d\x41\x0f\x44\x63\x8e\xca\x56\xa4\xb2\xfc\xc1\xe9\x32\x9a\x45\x8b\xd5\xd7\x6e\xad\xef\xca\x10\x46\x24\xe1\x04\xa9\xb6\x99\x2e\x29\xf8\x13\xaf\x40\x07\x60\x5d\x12\x6d\xb7\x95\x46\xa4\xb7\xbb\xed\xac\x38\x13\x2b\x2f\x98\x13\x73\x43\x8a\x81\x0b\x2f\x97\x19\x42\xb5\x1f\x19\x3f\x5b\xae\xb3\xf4\xae\x3a\x08\xb9\xc5\x34\x1b\xe6\x42\xda\x1a\xfd\x93\x8a\x15\x2c\xdb\x42\x0a\x24\xf2\x5c\x3f\x31\xf7\xe1\x4d\xbe\x3e\x04\x71\x17\xf3\x5f\xc5\x61\xcb\x8e\x78\x70\xaa\xc7\x84\x46\xa0\xd3\x5d\xc8\x25\xd3\xf9\x41\x8a\xc8\x18\x66\xf2\xca\x9e\xc5\x59\xc3\xab\x32\x0a\xea\x59\x2f\xf2\x42\x3e\x1f\xaa\xbe\xb1\x69\x1e\xd8\x83\x5e\xee\xc4\xd2\x8a\x3c\x2d\x23\xbb\x41\x58\x97\x33\x22\xad\x3c\x5c\x6c\x34\xe8\xcc\x46\x0a\x4d\xba\xc9\xd7\xf8\x52\x52\x78\x14\x6e\x98\xb5\xb7\x22\x75\x48\xdf\x09\xa7\x71\x95\x3f\x98\xae\x52\xbd\x27\xe4\x2b\xf1\xbf\xe1\x08\x67\x40\x33\x03\x4c\x2c\xe9\x6a\x16\x3b\xad\x6a\x98\x0e\xec\x8e\x3b\xd7\xb1\xc2\x10\xb9\x06\xe4\x2e\xb7\x26\x48\xce\xf4\x86\xe6\x11\x40\xed\x0f\xb7\xf6\x22\x59\x54\x90\xf7\x87\x02\x87\xa3\x97\xcf\xfe\x47\x8b\x07\x3c\x5f\x57\xb6\xd0\xbd\xbc\x8b\x89\x44\x1b\x8b\xee\x81\x30\xc5\x7b\xa4\x68\x15\x87\x61\x3d\xed\x18\xa1\x9c\x7e\x82\x11\xba\x9a\x5d\x40\x22\x33\xf4\xb9\x33\x0e\xae\x9a\xad\xbf\x62\x3d\x81\xb0\x0c\x8c\x69\xd8\x9e\xb7\x4f\x90\xdc\x8e\xb8\x07\x25\x8b\xa0\x45\x5f\x36\x4b\xc8\xf0\x76\xad\x1a\xdb\x54\x13\x8f\x66\xb1\xe6\xe3\x26\x69\x59\x5f\xa2\x99\xa2\x73\x01\x63\x1e\x41\xbb\x77\x69\xc6\x4a\x0a\x4c\x27\xac\x6e\x03\x15\xad\xe0\x30\xa9\xb5\x3a\xb2\xd0\x05\xa1\x1a\x2b\xa4\x7d\x03\xf5\xd8\xed\x8a\xaf\xcd\x17\xd2\x51\x83\x65\xd4\x90\x2b\x08\x6c\x52\x56\x85\x71\x55\x6d\xb1\x12\xc6\x99\x94\xfe\x25\x4c\x01\x8e\x94\x77\xac\x5b\xea\x35\x6b\x73\x2d\xe3\x4f\x40\xbe\xb0\xe6\xa0\x73\xa9\x53\x08\x24\xe7\x8b\x26\x8b\xdc\x4a\xee\xa2\x38\x6e\x3c\x67\xf5\xdd\x95\xd9\x3b\x90\x26\x45\x1d\x5e\xa8\x92\x0b\xb4\x78\x65\xc8\x1e\xee\x50\x33\x96\xb9\xab\xe8\xdb\x73\xa8\xda\x3e\x53\xe0\xa4\x89\x63\xd4\xd3\x9c\x6c\x9f\x1c\x11\x8b\x12\x1c\xde\x85\xde\x22\x60\x5e\x5f\xbe\x68\x45\xbb\x19\x2d\x43\x1b\xe0\x13\xe1\xc7\x77\x99\xd8\x55\x1e\x28\xd2\xee\x69\x2b\x10\x4d\x60\xc8\x9a\xc1\x7b\xd6\x74\xcb\x74\x67\x9a\xdf\xc3\xd6\xd9\x2e\xb2\xf3\x5a\x1d\x9d\xb4\x88\xb9\x8c\xad\x04\x12\xee\xd2\x8d\xca\x3b\xbe\x07\x76\x8a\xdf\x95\xcc\x81\x25\x9e\xb5\x66\x15\xbd\x56\x47\x49\x8b\x6a\xbd\xea\x06\xe1\x96\x47\x26\x49\xa3\xff\xd6\x3c\x92\x5b\xf8\x04\xe7\xfa\xde\x66\xad\xe0\x60\x3c\x6d\x7b\x0e\xec\xef\x7b\x1c\xd6\x08\x6d\xff\x19\x4e\xc2\x80\x32\xe8\x5b\x1d\x81\x7e\xe0\x80\x55\x32\x1a\x98\x79\xb7\x1d\x8d\x4c\xc4\x02\x15\xaf\xeb\xcc\x42\x97\xa8\xe8\x55\x2c\x90\xf0\xd0\x6c\xf0\x4b\x7f\xc4\x41\x1a\x05\x27\xe9\x8e\xd0\x89\xa7\x83\x86\xfd\x04\xed\x1c\x27\x54\xe7\xed\x12\xcb\x07\xd8\x10\x0e\xf2\x87\x8f\xad\x0a\xf1\xed\xd6\x7e\x9a\xe9\xe2\x6c\xdf\x71\x64\xe3\xa9\xb2\x67\xcf\x1a\x27\xf6\x0d\x9e\xc9\xa7\x8d\x67\xc1\x9e\x0f\xfe\x6d\xe3\xf1\xe5\x57\xc9\x29\x5f\x25\xe6\x3f\x77\xde\x26\xb2\x41\x7b\xdf\x23\x7e\xaf\xb7\xdf\x21\x7b\xdf\x11\xa7\x5f\x7c\x47\xf8\xf2\x76\xbe\xf4\x52\x49\x77\x86\xa7\x82\x5d\x1b\xf7\x37\xfb\xde\x19\xee\x30\xf5\x1d\x2e\x28\x4d\xab\x3d\x76\xe7\xd5\xf1\x25\xcb\x25\xb8\x4b\x8e\x44\xc9\x92\x88\x24\x34\xb4\xa0\x25\xf3\xed\x70\xfb\xbc\x81\x36\x3d\xdf\xe3\x8c\x68\x0a\x04\x02\x4a\x60\x5a\x6a\x62\x49\xd9\xaf\x0f\x8c\x61\x38\x97\x60\x95\xa1\x63\x4f\xe0\xa5\xf1\xdc\x78\x0a\x1d\x5c\x41\x96\xd2\xaa\x21\xcc\xd8\xc9\x1a\x1a\xe7\x6c\x04\x77\x94\xd7\x96\xac\x58\x9f\x20\xf3\xe6\x87\x29\x00\xe0\x00\xac\x16\xd3\x5a\xb4\x24\xf1\x02\x9e\x24\x6c\x9d\x11\xf4\xa5\xf6\x17\x16\x4b\x96\xc9\x3c\x28\xd3\x7c\xcc\x90\x12\xdc\x5b\x5c\xc4\xe1\x43\x3a\x1c\x85\x57\x75\x47\x5a\x63\x12\xb1\x5d\x6b\x49\x40\xd1\x65\x87\x6b\xff\x91\xf2\xda\x04\xcf\xf4\x35\xe2\x2c\x47\x51\xd3\x7a\x09\x87\x18\xc9\xdd\xee\x50\x3f\x79\x03\xb5\x94\xc4\x20\xb2\xf5\x11\xb5\x2e\x01\xe0\x05\x09\xef\xe0\xc1\xcb\x38\xcb\xf0\xae\x85\xe2\xce\x02\x64\x90\x63\x56\x8c\x95\x2c\xaa\xb0\x99\x17\x12\xc6\xab\x3f\xcf\xee\xe2\xec\x56\xbb\x25\x78\xda\x6e\x4e\x69\x4c\x6a\x67\x9d\x5d\x71\x68\x1f\x90\x2a\x22\x06\x1c\xe0\xd7\x36\x10\x07\x67\xee\x7e\xb1\x63\xf8\xa6\x60\xc5\xe4\x77\x4c\x75\x9a\xe8\x7b\x8d\x56\xe0\x65\x2d\xd8\x83\xda\x7b\x96\xf5\x83\xf2\x33\x47\x48\x85\x6a\xee\xc3\x1b\xa6\x4b\x29\xd7\x0b\xe3\xce\x03\xb8\xc4\xa2\xde\x31\x14\xdc\x14\xe1\x85\xc6\xd6\x2d\xfd\xe7\x6d\xc0\x24\x91\x44\xc3\x40\xc0\xb1\x94\x6a\x5a\xc3\x01\x94\x3b\x5f\x34\x75\x04\x83\x81\x73\x9d\x55\xc6\x58\x22\x93\xb3\xac\x1d\x6d\xb4\xa4\xe5\x77\x7d\x4a\x99\x42\x2f\xf3\x7b\xa4\xda\x4a\x21\xcc\x97\x6d\x1c\x9c\x29\x6a\x32\x2b\x19\xef\x25\xb0\xb4\x42\x5a\x3c\x5c\x95\x56\xda\x8b\xbf\x95\x2f\x44\xad\x39\x33\x7c\x01\x79\xfc\x0a\x2e\xd9\x4a\x7f\xae\xd4\x6d\x02\xc1\xfc\x58\xb0\x35\xd4\xb5\x31\x95\xa5\x5b\x0b\x1c\x3b\x37\xf0\x2f\xda\xaa\xe3\xd3\xb9\x35\x6a\xfd\xf1\x3c\xd0\x98\xa0\xc5\x44\xc4\x64\xa5\xe3\xc4\x2e\xd1\x46\x6d\x3e\xed\x6b\x5b\x0f\xf9\xfb\xcc\xa0\x06\x04\x87\x01\x6f\xce\x36\x79\x3b\x66\xd0\xb1\x07\xc8\x13\x5e\x70\x56\x7d\xe0\xc7\x49\x6b\xee\xa5\x7c\xc9\xc3\x21\xd4\x2f\x37\xfb\xa8\x5f\x6e\x51\xb7\x6c\x8e\x39\xed\x94\xba\x84\xd3\x38\xa9\xcc\xb5\x9b\xa7\x6b\xe0\x62\xc4\xf2\x08\x5f\xe2\xf2\x6b\xc6\x00\x22\xef\x5f\xa7\x82\xb9\xa5\x27\xcd\x0a\x98\xbb\x85\x2f\xb7\x8e\x49\xcd\xd9\x0a\x08\xc9\xf7\xef\x32\xae\x74\xd3\x21\xe8\xae\xdb\x4c\x2f\x03\xab\x24\x5f\xc8\x2b\x8b\xc5\x32\xc3\x0d\x15\x78\x8b\x0d\xe9\x8e\xc6\x3b\xf7\x91\xcb\x7f\x1b\x22\xd0\xda\xbe\x7c\x6a\xce\xee\x72\x88\x5b\x51\xe4\x5f\xa8\x22\x32\xf5\x16\x8b\x99\xd4\xa4\xa0\x83\x72\x21\xcb\xc0\xb0\x85\x70\xab\xb9\x9d\xd6\xee\x91\xa4\x38\xcc\xc2\x13\x0e\x86\x65\x64\x10\x1c\x13\x90\x5b\x71\xe7\x73\x15\xa8\xb8\xfa\xf4\x54\xb5\x43\xc8\x1a\xf2\x35\xe6\xec\x1a\x07\x3a\xeb\xbd\xfb\xf3\xb5\x8f\xa1\xc2\xc2\xa2\x6e\x2c\x2d\xdd\xf3\x17\xec\x4c\xe2\xf2\x80\x79\xc2\x27\x35\xa9\x73\x6f\xd5\xa2\x05\xb0\xed\x8e\x0d\x52\x3b\x30\xfe\xd0\xdb\xd5\x1e\x55\x5b\x77\xe3\xab\xb6\x8c\x6b\xd4\xb6\x1d\xd9\x59\x5e\xf0\x03\x13\x21\xc6\xb1\x32\x97\x6b\x6d\x66\x85\xf7\xf4\x65\x49\xfc\xa6\xa8\x90\x7c\x2d\xf4\xcd\xdc\xf7\xa9\x95\xa6\x06\x35\x2c\xe8\x60\x0c\x38\x8c\x70\xa5\x94\xeb\x42\xd3\x5a\x07\xbb\x69\xe9\x31\x1d\xca\xd5\xb0\x58\xa7\x8b\x04\x12\x54\x0b\xcb\x57\x12\x5c\x47\x84\xe8\xde\x26\xe7\x4b\x23\xf7\xc2\x78\x54\x03\xfd\x50\x3b\xc9\x86\x45\x3c\x43\xc6\x39\x89\x08\xb0\x1a\x4a\x95\x7e\x88\x8b\xb9\x95\x4c\xfd\x03\xc8\x01\xbb\x72\x27\xa9\x49\xc0\x51\x83\x17\xed\xe7\x10\x2c\x08\x44\x72\xe5\xf9\xc4\x7d\xda\xae\x97\x5b\xb7\x72\x5f\x18\x6f\xc0\x29\xb4\x34\x0d\xa4\x23\x43\x7c\x88\x37\x65\xa8\x2d\x1c\xed\xf6\xb1\x1a\x0f\xa3\x47\x32\xf4\x3a\x64\x25\xe3\x01\x27\xed\x26\xeb\x7e\x78\x29\x75\xa0\xbd\x9d\x37\x2f\x25\x73\x4a\x36\x6f\x6a\x97\x50\x15\x06\x7c\x73\xc8\x9b\x89\x91\x00\xd1\x4f\x17\xcf\x54\x53\x59\xc4\x17\xe0\x11\x76\xe9\x24\xeb\x40\xcb\x79\xed\x45\xa8\x68\xb5\xfe\x71\x86\x75\xe8\x72\xb2\xdb\xe5\xa3\xbf\xf9\x0a\xd9\x6b\x00\x7d\x9d\xe9\x86\x6d\xe2\x76\xc0\x73\xf6\x87\xf5\xbc\xb6\xf8\x3f\xde\x31\xb3\x36\x44\xa9\xb7\x5c\x30\x20\xf8\x10\x23\x11\xb6\x3d\xc2\xcd\xd9\x21\x4d\x07\x30\x6c\x1a\x72\x2f\xe1\xd9\x4f\x25\x4e\xb1\xab\x06\xde\xe6\x6b\xa0\x14\xd5\x6b\x48\x3c\x14\x1a\xca\x20\x65\x47\x91\x36\x1a\x1c\x45\x24\xd0\x87\x6b\x7e\xe6\x40\x8e\x5c\x38\xd9\x74\x88\x70\x00\xae\x02\x06\x0b\x5d\xb7\x86\xf0\xb2\x2f\xeb\xb7\x3d\x87\x90\xa7\xad\x70\xaa\x93\x4a\x5a\x0f\xf2\x61\x16\x3a\xb4\x8f\x39\xc1\x35\x31\xb6\x6a\x62\xa4\x86\x17\x4e\x6d\xd6\xfc\x95\x45\x38\x1b\xcb\x47\x50\x73\xd3\x17\xf6\x84\x22\x58\x16\x9e\x7e\xdb\x19\xf7\xc6\x5f\xc6\xdb\xe9\x55\x93\x78\x25\x24\x4d\x1c\x9c\xa2\x6c\xc4\x2a\x07\x37\x35\xf9\x62\xd4\x85\xfa\x00\x92\x02\x8e\x44\x85\x49\xbf\x0b\xa5\xce\xdb\xeb\x4a\x7c\x4a\xce\xde\xe0\x1d\xaa\x6e\x77\x07\x93\xde\xa8\xab\x46\xbd\xf1\x5f\x54\x67\xcc\x35\xd5\x24\xfa\xcc\xfc\x0f\x61\x85\x6e\x53\xdb\x58\x69\xb9\xad\xc6\xef\x87\xd7\xfd\x73\x12\x68\x0d\x3e\x68\x06\xbd\x4b\xed\xef\x7d\xe8\x72\x19\xc4\xa8\x3b\xbe\x82\xfa\x92\x9b\xe1\xb5\x3a\x1a\x0c\x71\x08\x7a\x83\x1e\xd6\x90\x20\x46\xb8\x6b\x75\x5f\xb1\xf6\x58\x94\xba\xb4\x54\x67\x3c\xbe\xbe\x64\xc5\xd5\xb1\x95\x00\x1f\x74\xcf\xba\xe3\x71\x67\x74\x43\xd5\x23\x30\x05\xa3\xee\x55\xa7\x37\xc2\x5a\x15\xd0\x4b\xee\x0d\x07\x6d\x5c\x00\xcd\x6b\x08\x6a\x5a\xb0\x1c\x65\x6c\x16\x86\x50\x2c\xed\x8c\x26\xb6\x62\x83\x56\x0f\x68\x2f\x5f\x3b\x19\xd3\xa6\xd1\x12\x3a\xca\xef\xbb\xa3\x2e\x2e\xc1\xee\x5f\xcf\xba\x57\x13\xb9\x1e\x5d\x73\x60\x19\xbf\x6a\x03\x4d\x48\x6f\x00\xeb\x86\xcf\xa4\x57\x08\x37\xf9\x7a\xbd\xc3\x40\xc8\x6f\x87\x88\x21\x6e\x47\xc4\x40\xfe\x76\xd5\x42\xd3\x44\xfc\xf8\x5e\x82\x64\x54\xd4\xf8\x0d\xe4\xc8\xdc\xc8\x9d\x5a\x8f\x29\x2e\x4b\x5d\x54\x2a\x6e\x14\xe1\x43\x4d\x3b\x21\xa6\x37\xd7\xb3\x34\x2e\x62\xa0\xe6\xf9\xdb\x7a\x7e\x8b\x52\x7d\x98\x81\x6a\x59\xdd\x93\xe6\xb8\x87\x9f\x74\xdb\xc7\xd5\xb1\x0f\x04\xc6\x0c\xd1\x5a\x4c\x96\xa1\xe0\x5e\x89\x27\x7a\x81\x54\x19\x71\xa9\x0e\x41\x33\x69\x96\xac\xe2\xac\x3a\x6c\x35\x08\x06\x8a\xbf\x0b\x38\xc7\x52\xc7\x19\x63\x70\x9b\x12\x76\x0f\x40\x59\x11\x7e\x1f\xea\x8c\x1a\xc2\x7a\x0d\x50\x81\x6d\xdf\x6f\x1c\x89\x96\xa3\xd5\x16\x50\x32\x10\xb3\xac\x0b\x14\x02\xc2\x29\xf3\x60\xbc\xc1\x16\xd8\xf2\x30\xd2\xe9\xe5\x74\xb7\x68\xd8\x36\xd0\xd4\x51\xb2\xd5\x84\x44\xe7\x3f\xe8\x60\xcb\xb6\x48\x0c\x12\x83\xf0\x24\x0c\x86\x5d\x8d\xd3\xf6\x69\xf3\x22\x8e\x10\x1c\xf1\x8a\x76\x96\x14\xa5\x94\x03\xea\x76\xf7\xaa\xc8\x41\x8b\x80\x38\x12\x4d\x33\xbc\xfd\x4e\xab\x41\x7f\x5e\x25\x85\xdd\x3c\x30\x0e\xf8\x0e\x7e\xc5\x4a\x17\x49\x3e\xb7\xa4\xbf\xc9\x82\x37\xb9\xfc\x2c\x7e\x88\x24\xaf\xaa\xbb\x79\x11\x3f\x50\x08\x07\x56\x69\x93\x36\x42\xe3\x32\xe4\x15\x1f\xce\x07\xe7\xdf\xd7\x59\x92\xc6\x95\x2e\xa0\x07\x08\x55\x2c\xd7\x64\x72\xc5\x8e\x60\xc1\x0a\x35\xc0\x8b\xc5\x73\xdc\x11\xf0\xfc\x4b\x8e\x00\x6e\x96\x6c\xd1\x9e\x1b\xeb\x0b\xd6\x31\xed\x91\x70\x77\x97\x79\x6a\x6c\xef\x23\xf4\xb8\x4b\xb3\x5c\x53\x17\x48\x2b\x75\x55\xa5\xd0\xd6\x96\x90\x88\xb4\xbe\x2e\x4f\x6c\x53\xdf\x9c\xb2\x0c\xed\x20\xf4\xd9\x6d\xbe\xe9\x3e\x4e\xd7\xa1\x65\xe8\xf6\x54\xc3\xae\x69\x5a\xd7\xb4\xa6\xad\xca\x45\x15\x7f\xd2\xe6\x20\x07\x81\x31\xd0\x2e\x31\xa7\xfa\x5c\xe3\xc2\xe5\x13\x88\xa5\xad\x0b\xd7\x08\x1c\xa7\xcd\x92\x52\x1a\xa9\xef\xc1\xbe\x6a\xbf\x80\xb0\x44\xe5\x29\xdd\x8a\x9b\x21\x68\xda\x2b\x6c\xda\xab\xf6\x29\xa7\xe0\x41\x8a\x05\xad\xee\xc2\xf5\x16\x26\xd7\xa9\x72\x02\x03\xbf\x10\xe5\xa4\x30\x96\x15\x3b\x29\x3d\x50\x11\xbe\xb3\x51\xb8\x53\x5c\x2a\xb5\x91\x75\xc7\x52\xf0\xd0\x56\xa0\xf7\x59\x05\x32\xcb\xbf\x6c\xd7\xde\x37\x7f\x46\x0b\x63\x30\x54\x67\xbd\xd1\xd9\xf5\xe5\x78\x62\x8c\x3b\xe4\xef\xb1\x7f\xea\x77\xdf\x75\xfa\x54\x16\xeb\x2a\x61\xb7\xd7\xb9\xb6\x22\x51\x23\xeb\x8b\xcb\x63\xd9\xf2\xcd\xf0\x3a\x6a\x36\xeb\xa2\x66\xa3\xce\x51\xdb\x70\x4d\xd8\x70\x84\x8c\x34\xbe\x3d\xe5\x48\x73\xae\xaf\x8c\xbd\x3d\x62\xc3\x8b\x8b\x62\xc1\x1a\xee\x8e\x23\x51\xe1\x3c\x19\xa2\x0e\x7f\x77\x34\x1e\x0e\x6c\xbd\xb3\xab\x73\xb6\xb5\xcd\xb2\xe0\x79\x6b\x71\x33\x1b\x7a\xef\x3b\xa6\xfb\x50\x30\xbc\xd3\xde\xe7\xef\x99\xf7\x72\x2d\xf3\xbb\xe1\xf0\xfc\x63\xaf\xdf\x8f\xd4\xc7\xe1\xe8\x2f\x6a\x3c\x19\x5e\x5d\x75\xde\x75\xcd\xa8\x5e\x5e\x5d\x9b\x87\x5a\xc9\xfc\x91\xba\xec\xf4\x2f\xae\x07\x44\xb9\x43\x8d\x87\x7a\xf6\x7e\xdf\x8e\xe3\xa5\x71\x0e\xbc\x56\xe2\xcb\xcc\x40\x70\x45\xb1\x1d\x9e\x1b\x9a\xa4\xf7\x9d\x0f\x5d\xd4\xf8\xef\x0d\x8c\xd5\xbf\x97\xc8\x7f\xbb\x26\x9d\xef\x49\xf0\xe3\x93\x3d\x25\x7d\xf7\x47\x33\x04\xe7\xdd\xce\xe4\x3d\x91\x01\x8d\x87\x03\xa0\x3d\xfa\xf3\xf5\xe8\x26\x24\x30\x72\xad\x7d\x32\x96\x15\xd6\xe4\xb4\x74\xff\x3a\x81\x2a\x42\xb3\x08\xce\x60\x96\xfb\x9d\x8f\xc6\xe3\x00\xe6\xe1\x31\x7e\xdd\x35\xb2\xad\xc6\xc3\xcb\xae\xfa\xf3\xf5\xa8\x37\x3e\xef\x9d\x21\xe1\x1e\xd3\xea\xf5\xfb\xc3\x8f\xf4\xd0\xb3\xfe\x35\x90\xdf\x99\xe1\xf3\x7a\xe8\x96\xc6\x0e\x76\xa6\xf1\x10\x07\xc7\x3d\xc7\xcc\x93\x78\xd0\x65\xe7\xc6\x1f\x1b\xe3\x43\x99\x4d\xfa\xa7\x36\xe9\x6c\x9a\xe5\x3e\x80\x02\xc9\xae\xd9\xa0\xe3\xee\x68\x0c\x1f\x98\x34\x06\xf6\x9b\xe4\x5c\xa3\x43\xcc\x2a\xc7\x68\x16\xa8\xc4\x13\x51\x7d\xf1\x27\x75\xd6\xbe\x68\x8f\xda\x28\xf1\xaa\x8e\x86\xb3\xaa\x0d\x42\x05\xad\x08\x14\x90\x30\x4e\x69\xce\x51\xf9\xe0\x5a\x7d\xc6\xa1\x3a\xda\xf6\x96\xb8\x12\x6f\xf9\xdf\xff\x9f\xd4\x37\x7d\x71\x14\xb7\x8e\x4e\x5a\x68\x1f\xed\x7c\xbe\x5f\xc7\x01\x5d\x12\xc1\x75\x48\x37\x95\x61\x8f\x58\x92\x75\xac\x57\xdc\x27\x40\xa0\x9a\x3e\x59\xb3\xa0\xf6\x71\xd3\x14\x31\x2a\x2c\xab\x7a\x62\xb1\x16\xf6\x57\x2f\xd4\x11\x90\xd3\xd0\x68\x7d\x99\x38\x6a\x10\xb3\x7f\x5c\x20\x15\xbd\xbc\xf0\x05\x54\x67\x4f\x0a\x4d\x09\xa4\x91\xd2\x44\xaf\xad\xd2\x5a\xb9\x5e\xe9\xa2\xd4\x73\x54\x0b\x64\x26\xea\x8b\xce\x08\xd5\x66\x9d\x94\x26\x3f\x23\x17\xea\x90\x94\xda\x99\xcf\x0b\x5d\x9a\xbb\x49\xbc\xd8\x65\xad\xea\x73\xb5\xa5\x94\xe9\xd7\xb6\xba\xec\x8d\xcf\xba\xfd\x7e\x67\xd0\x1d\x5e\xf3\x42\x16\x36\xae\x45\x82\xd8\x92\xd9\x15\x20\xa0\x9d\x29\x37\xcb\xb3\x19\x49\xcd\x6c\x91\xd5\xea\x2d\x1e\x91\xd0\x04\xbe\xc8\x74\xde\x2c\xf1\x08\x8b\xca\x7d\xd7\x1a\x2c\x85\x5e\xe4\xc5\x92\x71\x4d\x64\x5c\x51\x19\xa2\xd3\x1e\x23\xf0\xa6\x4a\x2a\x25\x9e\xfa\x05\x52\x5f\x6c\x67\x79\xa2\x79\xc4\x0c\x43\x14\x34\x6c\x91\x37\x62\x37\x1a\x10\xfa\x2e\x76\x27\x9a\xec\xeb\x38\xa2\xb4\x63\xb6\x89\x9c\xe0\xa7\x8d\xd6\xb5\x22\xe5\x8c\x14\x18\x1d\xd9\xb6\x27\x90\x03\x58\xa4\xc9\xac\x3a\xce\x17\xc7\xa4\x09\x49\xce\x7c\x4d\xb9\xf0\x11\x11\xc2\x69\x4d\xcf\x2a\xd0\x0e\xa4\x45\x01\xd2\x80\x81\x98\x99\xf7\x49\xa7\x30\xf8\x5b\x86\x2e\x72\x89\xe1\x34\x07\xac\x0b\x42\x21\x43\xfa\xfe\x59\x5e\x56\x52\x2b\x20\x6a\x2c\xaa\x43\xa5\x52\xf8\x2c\x05\x63\xad\x85\x1d\x57\x55\x5e\x64\x7a\x53\x3e\x51\x0b\x4d\x6c\x45\xfa\xf3\x0a\xcc\xc1\xdf\x4f\xd0\xf0\x87\x0a\xc3\x3a\x6e\xbe\x66\x65\x58\x74\xd1\x30\xcf\x6b\x13\xf9\x88\xc2\x6e\x10\x54\x68\xca\xed\xfb\xda\x79\xac\xb6\x38\x37\xde\x46\x59\x15\xbc\x3e\x9d\xae\xe2\x11\xc7\xd1\xe8\xa3\x5c\x24\x27\x54\x19\xed\x98\x70\x29\x2f\x25\x5e\xd7\xc6\xc7\xd7\x65\xcb\x78\x72\x98\x30\x78\x3c\xf3\x21\x24\xcc\x1a\xd0\x49\xa8\xf8\xfe\xac\x0d\xb1\xd2\xe1\xc0\xda\x62\xc6\x80\x42\xf5\x27\xf8\x44\xa7\xb4\x9a\x84\xcd\xb9\x89\x20\xac\xc3\x65\x10\x54\x2f\x51\xd6\x07\x12\x71\xb2\x90\x1c\x26\xe1\xfc\xb8\x48\x10\x40\xdf\xec\xd2\x46\xca\x2c\x7c\x90\x3f\x2d\xd5\xba\x4a\x52\x41\x70\x28\xcb\x21\xeb\xd9\x67\x31\xc3\x39\x15\xb0\x9b\xb9\x6b\xee\x88\x17\x47\xa9\x72\x39\xb6\x2c\x20\x89\x1d\x21\x0c\x10\x14\x26\xe8\xbf\xaf\x13\xc4\x3c\x40\x5d\x82\xd3\xc4\xa6\x98\x26\xdc\x9e\x95\xce\xe6\x98\xba\xb3\x4b\x97\x74\x96\x21\x1c\xca\x92\x90\x18\x67\x9a\x33\xa5\x0d\x40\xe2\x58\xad\x98\xa9\xac\xaf\xae\x47\xe3\xeb\xce\x60\x62\x0c\xbb\x31\x51\x60\xfe\xea\xc2\xe8\x5f\x4c\x81\x81\x92\x81\x73\x5d\xaf\x19\xd6\xca\x7c\x62\x3f\x11\x49\x2b\x17\xe9\x78\x7b\xa4\x1f\xba\xfd\x38\x6f\x7d\x9f\xf3\xfc\x82\x24\x5f\xcf\xf0\x5c\xa7\xdf\x0e\x8c\xe9\xa3\x8b\xcc\xc9\xbe\xfa\x2d\xe6\xd5\x8c\xd2\xb1\x33\xef\xbb\x0d\x3d\xa4\xb3\x1c\x2f\x05\x2c\xc0\x4d\x32\x35\x8e\xb3\x2a\x56\x67\x69\x5c\xc4\xe6\xf5\x99\xcf\x66\xf4\x93\x63\xe8\xbb\xfd\xb4\x9f\x5e\x8c\x2f\xae\xfb\xdf\x8f\xfc\xe7\x71\xfe\xcf\x67\xcf\x9f\xbd\x0c\xf9\x7f\x5e\x3d\x7b\xf9\x93\xff\xe7\x47\xfc\x08\xa9\xbc\x33\x90\x54\x3d\x3d\x3e\xf9\xf5\xd7\x57\xa0\x90\xf7\xa7\xe3\xd3\x67\x27\xa7\x28\x1c\xd7\xa0\x0c\x86\x0c\xf3\x28\xd8\x08\xa2\xb3\xb7\x90\x7d\x02\xf0\xb1\x39\xc1\x81\xfa\x9d\x3d\x91\x37\x78\xc2\x6c\x79\x14\x80\x71\xcc\x7d\x04\x76\x9a\xf6\x18\xbd\x89\xa3\x2c\xaa\x21\x2e\x10\x3e\x93\x54\x3f\x4f\x87\xdf\xf0\xd3\x7e\x7a\x56\xe4\x65\xf9\x90\x17\xf3\xdf\x8b\xff\xf7\xd9\x2f\xcf\xc3\xfd\x7f\xfa\xcb\xe9\xe9\xcf\xfd\xff\x23\x7e\x6a\xfb\x1f\x64\x31\x7f\x55\xef\x74\x31\x57\x03\xbd\xbe\xd5\xd3\x78\xad\x8b\x83\xd9\xc3\x6a\xfd\x8f\x7f\xa4\xba\x3d\xaf\x3e\x87\x8a\xab\xe4\xb6\xdd\xe5\x2b\xe6\x55\xa9\x2c\xca\x6e\x5d\xea\xc5\x3a\x8d\xd4\x74\x5d\xd9\x18\xac\xd0\x3a\xbd\x31\xa6\x1f\xd1\xbf\x42\xa5\xb2\x88\xd8\xc7\x33\xe3\x2e\x97\xa1\x05\x89\xb5\x0b\xc6\xe1\x60\x8f\x0a\xf4\xee\xff\xbe\x46\x10\x4d\xbe\xa0\x02\x7d\x04\xfa\x9a\xcf\x30\x75\x45\x52\x29\xe0\x40\x74\x54\x38\x44\xc4\x45\x04\x1b\x40\x29\x80\xda\xbd\x90\x4e\xb2\x39\x36\xe0\x91\xdd\x94\xaa\xcc\x81\xf7\xa4\x00\xb4\x59\xfb\xa0\x7d\xd0\xbd\xd7\x05\x34\xc5\x55\x07\x36\x1e\x5d\x74\x56\xa1\xb3\x22\xce\x31\x39\xaa\x1e\x42\xda\x93\x38\x60\x08\x5c\xa9\x56\xac\xe1\x61\x65\x2c\xea\xf4\x2b\x42\xfb\x73\x8f\xf9\x6f\x3f\xfd\x8f\x64\x39\x2d\xe2\xe3\x93\xf6\x8b\xef\x75\x00\xec\xde\xff\xa7\x27\xcf\xeb\xfb\xff\xc5\xab\x9f\xfc\xdf\x3f\xe4\x07\x67\x3f\x60\xfe\x8e\x84\xc0\xf7\x0b\x75\xf4\x1f\x57\xe0\xf2\x24\xa5\x6a\xfc\xb4\x3a\x82\xf5\x7a\x68\xc5\xfc\x0f\x5b\x18\xff\x0e\xa4\x81\xf0\x6c\xc0\xf2\xa4\x29\x15\xf1\x62\xd0\x58\x42\x1d\xf1\x15\xac\xd3\x1b\xab\x89\xfe\x0c\x52\x03\xc5\x2a\x2f\x98\x37\x1c\x3f\x73\xd8\xc2\x53\x86\xb6\x8d\x0b\x7a\x56\x39\x94\xca\xdc\x27\xb1\x9a\xe7\x0f\x59\x9a\xc7\x01\x00\x54\x32\x8f\xb7\xd5\xdb\x0d\x9d\x18\x95\xa0\x52\x86\x6a\x9b\xa8\x81\x62\x28\x63\x82\x9f\x23\xe0\xfe\x69\x39\x4f\xb9\x0e\xe9\xb6\x23\xd2\x3e\xe8\x65\x18\xc3\x37\x1e\x96\xf4\xb9\x96\x6b\x66\x23\x58\x26\x25\x45\x9c\x00\x58\xe0\x9e\x86\x6c\x45\x96\xd5\xdc\x85\xa3\x81\x77\x01\x91\x11\x2c\xc6\x8f\x8d\x89\x4b\x62\x31\x2b\x99\xfb\xfc\x1d\x52\xae\x2d\x84\x34\x32\xb3\xbc\x63\xbe\xf6\xa4\x7d\xa2\x8e\xd5\xd8\x77\x12\x1b\xdf\x5f\xeb\x5c\xc4\xcb\xc2\xe7\x6d\xc0\xac\x69\x24\xe0\xb5\x82\xd3\x2d\xa9\xe4\x01\x67\x7c\xfd\x42\x43\xdd\x1e\xd7\x5a\xf9\x73\x11\xef\xe2\x7c\xc0\x7f\x56\x45\x9c\x95\x0b\x5d\xc4\x52\xf5\x34\x38\x80\x23\x88\x47\x81\x68\xb8\x86\xb2\x0b\x2a\x38\x0a\xe0\xf6\x92\xff\x20\xa8\xc9\x04\x3e\x26\x18\xf0\x90\x93\x49\x0c\x07\x94\xfd\x41\x75\x27\xd0\xc1\x79\xdc\x70\x66\x09\x4d\x8b\x64\xee\x58\x96\xbc\x37\x72\x25\xf3\x4d\xbe\xa6\x1c\x92\xc7\xc3\x76\xa8\xee\xb8\x18\x2c\x66\x3e\x3a\x88\xd6\xcc\x6b\x83\x46\xbb\x8d\x8b\x60\x2c\x63\x7b\x40\x02\x27\x33\x56\x10\xf4\xf3\xdf\xd8\x3e\x74\xc4\x9a\xea\xd8\x22\x34\x10\x75\x2b\x76\x46\x3c\xc3\xdc\x94\x2c\x39\x8b\xbd\x5d\x6b\x93\x1b\x4c\x28\x25\xd5\x55\xbd\x96\x50\xf2\x5e\x36\xc3\xb4\x4e\x04\x30\xe0\xab\x82\xa3\x90\x04\x3c\xd0\x38\x98\x26\x90\x6b\x01\xfa\x02\xef\xf5\xcc\xf9\x98\x87\x9b\x13\x51\x6f\x14\x73\x59\x91\x24\x37\x0b\x24\x49\x70\x4d\xf3\x03\x13\x3b\xc2\xb0\xbd\xf5\xdc\xe3\xd1\x07\x0b\x64\xfb\x6a\x11\xc4\x9f\xea\xd8\xae\xae\x9d\x63\x11\x14\x16\x99\xc6\x09\x19\x83\x45\x5e\x2c\xe3\x4a\x02\xd5\x5d\xb5\xe0\xb6\x3a\x30\x6f\xed\xce\x9b\x4b\xc1\x29\xff\xe3\xd5\x84\x77\x7c\x5c\x0f\x4c\x8b\xa7\x21\xa0\x3e\x06\x40\xa3\xaf\xec\xcc\x8e\x26\xe3\x1d\x60\x63\xd5\xb0\x71\xf0\xf4\x2c\xe3\xa5\x56\x0f\x31\x67\xf3\xe8\x30\xe3\x0f\xd2\x99\xd5\x84\x84\x12\x05\x0a\x19\x2d\x5a\xe3\x1f\x95\x91\x0b\x23\x23\x92\x88\x7b\x1a\xd2\xa2\xca\xc0\xaa\x18\x5b\xf3\xc5\x43\x20\x9e\xb0\x4d\xbc\xcb\x75\x79\x68\x3a\x45\xcd\xb1\xa5\x74\x3e\xef\xa5\xf9\x26\x96\x4a\x83\x84\x1f\x56\xb1\x37\x1f\xcf\xde\x48\x70\x6c\x8e\xce\x43\x5c\x80\xf5\x02\xe8\x76\x8d\x15\xa3\x02\x22\xcc\x42\xdf\xe6\x98\x46\xe1\x7e\xef\x6e\x7e\x64\xc7\xc6\x6c\x88\x5d\x11\x47\x97\xd7\xf3\x70\x40\xea\x17\x2e\x2e\xa4\x52\xa5\x12\xb5\x24\x93\x72\x05\x54\x20\x4d\xe3\x4a\xd9\xc3\x47\xe2\x9b\x0b\x8a\x6d\xe6\x45\x2d\x50\x69\x03\x9c\x60\x6a\x08\xa6\xda\xaf\xdf\x90\x74\xcd\xa0\xd9\x81\xed\x6a\xde\x9c\x50\x97\xc1\x06\x8c\x28\x04\x46\x4e\xc2\xd9\xcc\x78\x1f\xe1\xc1\x1e\xb0\x12\x37\xef\x19\xc8\xc9\x30\xb7\xe1\x63\xdb\x17\x53\x5b\xf3\xa0\x1e\x75\xd7\x4b\xcb\xc7\x7b\xc9\xca\xe5\x5c\xd0\xb8\xad\x98\xf4\x37\xd4\x85\x8a\x0e\xf4\x1c\x07\x6b\x58\xfe\xb6\xbd\x4a\xd2\xd3\x18\xc7\x9d\x43\x31\x74\x38\xee\xb7\x8e\x38\x5e\xad\x61\x1d\x84\x5b\x91\xdb\x0a\x2b\x6d\x69\xf6\x74\x63\x77\x8c\xad\x69\x85\x57\xda\x32\x0e\xbe\xb7\xb9\xd2\x5d\x2e\x0e\x78\x65\x9d\xdc\x92\x37\xa5\x58\x0b\xe1\xd2\x11\x30\x39\x3a\x70\x1a\x77\x54\x5e\xec\x7e\x66\x6d\x07\x04\xf0\x3b\x20\xbf\x41\x33\xdf\xab\x96\x3b\x69\x3f\x17\x8c\xcd\xea\x18\xb3\xf1\xee\xbd\xb6\xd7\x58\xa7\x0b\xcb\xc4\x96\xcb\x89\x1d\x86\xa4\xd4\x38\x8d\x85\x86\x7b\xb8\x30\xd3\x6b\x4b\xe1\x21\x69\x75\x94\xb4\x75\x9b\xcf\x13\x27\xf9\x4a\x77\x38\xe6\x8d\x88\xf2\xa8\xb6\xdc\xc1\x54\xa5\x73\xcc\x5b\xf7\x2d\x61\xcf\xba\x72\x52\xac\xac\x62\x3a\xca\x31\x16\x85\x9b\x7f\xb1\x65\x1c\x97\x50\x25\xe8\x0a\xe0\x2b\xb7\xed\x2b\x3d\xbb\xcb\x92\x59\x9c\x72\x35\x39\xd4\x63\xaf\xe6\x31\x11\x9f\x03\x0f\x28\x27\xc8\xb8\xd2\xd8\x0d\x9a\x3d\x29\xe9\x5d\x55\x6e\x06\x04\xe9\xce\x72\x6f\x99\xf3\x25\x6d\xeb\x6c\xc9\x20\x23\xf3\x34\x18\x03\x26\xcf\xe9\x49\xd6\xb4\x2b\x66\x4d\x43\xb4\x8b\xe3\xcf\x51\xc7\x5c\x29\xc9\x51\x19\x7e\xab\x4b\x68\xf3\x2a\x61\xca\x53\x67\xfe\x8b\x15\x72\x02\xf5\x94\xb8\xfc\x22\x87\xc5\xc4\x50\xce\x54\xc7\x45\x0c\x61\x1e\xb9\x9a\x81\xb8\x74\x03\xf9\x50\x38\x38\x30\x19\x86\x83\x1c\x1a\x0b\x14\x0a\xb2\x8d\x82\x02\x87\x64\x69\x93\xfa\xc6\x33\xb8\x8b\xd7\x25\xfd\x77\x59\xe5\xab\x95\x4e\x3d\xf7\x51\x8a\xaa\x4a\x02\x5f\x73\x53\xed\xa2\x98\x8b\xdc\x8a\x35\xcb\x6a\xdb\xb8\x34\x9c\x25\xe4\x58\x59\x01\x57\xc7\x19\x63\x6c\xf2\xcc\xf2\x8c\x34\x9d\xda\x64\xf3\x7b\xdb\x75\x63\xb9\x63\xc4\x59\x49\xd2\x57\x18\xa3\xb2\x92\x55\xc2\x6d\xab\x31\x99\x44\x8e\xc7\x84\x98\x89\x05\xc5\x08\x53\x94\xd8\x3e\x4b\xc2\x5f\xdf\xf3\x10\xe6\x9a\xe5\xea\xb9\xd3\x1b\x21\xe2\xe9\x5b\x65\x70\x6a\xd8\x12\x51\xf0\xc6\x70\x68\x1c\x06\xa0\xa1\x21\xf4\x18\x4b\x94\x20\x44\xa8\x0a\x95\xe6\xb7\x39\xb5\x55\x7f\x4e\xca\x8a\xcd\xfe\x18\xe1\xc7\xe0\xa0\x2e\xe2\x59\xcd\x59\x11\xb4\x34\x7c\x9c\xd5\x8e\x70\x34\xdc\x80\x5e\x47\xaa\xbd\x5a\x57\x6c\xf3\xa4\x84\x9a\xbf\x08\x5a\x11\x79\xfc\x30\x25\x60\x7e\xcc\xb6\x2a\xf3\x14\xea\x06\x4a\x1f\xe4\x24\xcb\x82\x1c\x27\xe3\x29\x97\x69\x9f\x3b\x69\xb0\x7c\xa1\x3e\x22\x6f\x45\xa2\x61\xe3\x7a\xaa\x43\xb2\x12\x8f\x0b\xee\x3a\x83\xf3\x9d\xd5\x76\x6d\xf5\x1f\xbd\xcb\xb7\xa3\x8e\xba\xec\xfc\xa5\x3b\x56\x83\xa1\xa7\xd7\xc4\x58\x65\x2a\xc5\x8b\x5c\x19\xde\x70\xa4\xc6\x93\xce\xe4\x7a\x02\x98\xe6\x51\xf7\x5d\x67\x74\x4e\xaa\xd0\xa3\x6e\xbf\x03\x48\x53\x02\x93\x5a\xd9\x49\x84\x02\x5f\xf4\x40\xd2\x39\xe2\x17\x9f\x0f\xe1\xbd\xb6\x79\xae\x6e\xcf\x76\xec\x63\xaf\xdf\x57\x6f\xbb\xaa\x3b\x1a\x0d\x47\x54\xba\x37\xc2\xdf\x52\x49\x1d\x69\x6d\x5e\x0f\xac\x48\x51\xf7\x5c\x5d\x76\x06\x83\xee\xa8\xcd\xed\x78\x37\xea\x76\x26\xdd\xf1\xc4\xa2\x5b\xfb\xfd\xe1\x47\xd4\xbc\xea\x77\x3e\xda\xf6\xc8\x46\xda\xaa\xb1\x31\xe0\x81\xf7\xd2\xa6\xda\x43\x27\xf5\x88\x41\xc3\xf4\xca\xf7\x9d\xf3\x3a\x52\x18\x21\xba\xf8\x0d\x54\xcc\xae\x69\xab\x42\xa1\x20\x15\xfc\x85\xa3\x8d\x48\xf0\xcb\xe1\x39\xf4\x05\x21\xb9\x66\x2e\xbb\x93\x61\x64\x57\x45\xf8\x65\x2b\x9a\x04\xc2\x55\xdd\x77\xc3\xde\xe0\x1d\xd7\x84\xf6\x9d\xea\x71\xbe\x50\x7d\xc6\x67\x98\xbf\x4a\x61\x2d\x98\x15\xea\xd7\x77\x95\xc1\x12\x8b\x58\xc2\xe8\xeb\x20\x71\x8b\x0b\xb7\x02\xad\x9e\xe8\x55\xa3\xbe\x95\xfb\x0c\x6a\x62\xa1\xf8\x19\x16\x43\x02\x68\xbe\xd5\x24\xc6\x6a\x3a\x59\x13\x6d\x0d\xb7\xc3\xc5\xf5\x68\xd0\x1b\xbf\x07\x44\xbb\x28\x08\x8d\x58\x4e\x3c\xd4\x12\xf3\x0a\x35\x51\x3e\x57\xbd\x33\xcb\x4f\x16\x3c\xba\xad\xda\xe9\xf7\xbb\xef\xba\xe7\xaa\x33\x56\x1d\xf5\x76\xd4\xed\x9c\xbd\x97\xda\xb3\xac\xb0\x05\x4a\xb3\x67\xc3\xc1\xf9\x35\x4d\x42\xad\x0a\x01\x3b\x5d\x5b\xa9\x63\x5c\xa9\x7b\x0b\x68\x8d\x6d\xb9\xa5\x26\xd6\xbb\x89\xab\xb0\x70\x65\x97\x75\x43\x12\x62\x02\x96\x12\xc1\x55\x29\x52\x3e\x07\x82\xac\x59\x95\x88\xe2\xcb\xb9\xd2\x71\x91\x26\xda\x2f\x61\x42\x7d\x40\x3a\x56\x5f\x89\x7a\x45\xbc\x77\x5d\x71\xcb\x0d\xc4\x9b\xf3\x34\xa6\x10\xe2\xd6\xf8\x0a\x19\x69\xc6\x5e\x71\xa5\x61\xcd\x21\xa1\x57\x70\xa7\x18\x5b\xa3\x56\x91\xe2\x8a\x59\x10\xdf\xe3\x1e\xe5\xc5\x8e\xc3\x2a\x4c\xe9\xf0\x89\x3f\x73\xae\x2e\xf1\x74\x2c\xb0\x3a\x1d\x6f\x2c\xaa\x59\xd7\x73\x88\x31\x4b\xaa\x4d\xea\x4f\x5c\x31\x40\x11\xa0\x5d\x1b\x49\x29\xd4\xdc\x37\xe3\x5d\x4f\x76\xb5\x11\x9b\x05\x31\x49\x9c\x3c\xbc\xe8\x6d\x7d\x6a\xa1\x6f\xe3\x02\x0c\xaf\xe0\xf2\x67\x42\x5f\x41\x51\xdc\x8a\xe4\x37\x59\x2f\x93\x48\xd3\xc0\xd9\x30\xff\x8d\x7d\x79\x52\x0a\xfe\x99\x23\x5b\xa0\xf4\x02\x06\xe1\x65\x2b\xf2\x5a\x6d\x5f\xf2\xaa\x05\x17\xf7\x65\x52\xce\x74\x9a\xc6\x99\xce\xd7\xa2\x09\xbf\xb4\x22\x09\xd7\xa4\x02\xdb\xa4\xb9\x74\x68\x4b\x90\xf0\x97\xb6\xff\x74\x0b\xd9\xee\x48\x48\x36\xd5\xeb\xdf\xb1\x57\x24\xd2\x2f\x64\xba\x70\xaa\xa0\x29\xf2\x15\x00\xb9\xeb\x73\xe2\xe3\xd8\xc1\x2c\xb4\x8a\x21\xb3\x7c\xb9\x5c\x67\x8e\x51\xd8\x42\xc8\xf9\x17\xb0\x20\x38\xc4\xc4\x62\x16\xfc\xe8\xd2\x71\x17\x53\x9c\x86\xaa\x07\x23\x8b\xa4\xdc\xd5\xfa\x32\x4e\xe6\x41\xf3\x31\xaa\xc1\xce\x00\xcb\x07\xc8\x87\xb8\x6d\x94\x90\xf1\x97\x2f\x80\xba\x68\xa5\xb3\x39\x0f\x68\x11\xcf\x10\xa0\x89\x9e\x7a\xf3\x12\xf5\x61\xb5\xc4\xdc\x0c\x4e\x41\xa6\xe2\x5b\x9d\xcd\x36\x11\xbc\x95\x74\x0c\x22\xf5\xb7\x3c\x01\x92\x8c\x0c\x8b\xaa\x3d\x87\x8c\x4d\x54\xca\x9f\x91\x82\x46\x02\xc1\xf5\xda\x48\x58\x98\xbd\x59\x41\x91\x8b\x04\x46\x7e\xf9\x40\xdd\x6f\x4c\x4a\xb5\xc8\xd7\x19\xa3\xef\x93\x0c\x6a\xe9\x20\xe7\x1d\x3f\x40\xce\x1e\xf6\xb0\x40\xcf\xf3\xa1\x80\xc8\xf5\xa8\x71\x30\xbc\x81\x00\x03\x9a\x58\x32\x61\x78\x97\x79\x59\xa9\x59\x9a\x97\xc6\x94\xc5\x33\x79\x8d\x6e\x2e\x14\x48\x56\x76\x99\xfa\x87\xd5\x78\x0d\x9a\x61\xd0\xc0\xb0\x9f\x7e\x37\xb9\x0d\xa5\x46\xd8\xae\xa3\xec\x82\x82\x75\x88\xee\x98\xa3\x39\xaa\x49\xea\xba\x8d\xc9\x5b\xd5\xbf\x44\x70\x94\xb0\x09\x00\x0b\xf7\xc7\x05\x5c\x8b\x75\x9a\xea\xb2\xb2\x9a\x48\x56\xaf\x78\x0a\xf0\xed\x76\xe3\x2d\x35\xc5\x8e\x17\xab\x02\xc8\x82\x29\x9a\x2b\x06\x70\x36\xcb\x8b\xb9\x1f\x05\x6b\x04\x91\x9e\xeb\x34\xb6\xb1\x8b\x3a\xce\x3a\x5f\xa8\xce\x52\x17\xc9\x2c\x76\xa8\x78\x3c\x42\x09\x4e\x0b\x58\x53\x58\x76\x80\x35\x4d\xb2\x59\xb2\x4a\x19\xf6\x7e\xdd\x1e\xb4\x7f\x13\xb2\x7d\x1b\xac\x5c\xcc\x72\x47\x46\x7a\x09\xdc\xcc\x18\xe6\x70\xed\x66\xf7\x79\x7a\xef\xce\x6c\xbb\x7f\x30\xb3\xb8\x8a\x0b\xa4\xb8\x42\x89\xa9\x64\x9e\xc4\x85\xd9\xef\x5f\x02\x86\xdd\x3b\x60\xdc\x0c\x68\x3d\x8f\xd3\x14\x28\xd5\x11\xcb\x8a\xa1\x65\x35\xe0\xc8\x06\x07\x47\xe3\xb2\x4c\x6e\x33\x3d\x8f\xfc\xf0\x90\xfd\xfb\x5c\x9b\x43\xa0\x42\x55\xac\xda\xf1\xc3\x1c\x9b\x53\xad\x38\xfd\xe9\x42\x8e\x11\x6a\xf4\xe4\x29\x87\x01\xcc\x81\xe1\x74\x5c\xee\xf3\x74\x9d\x55\xc6\x8b\xcc\x41\xd4\x25\x5f\x89\xcc\x34\x56\xa2\xd8\xc8\xc6\x74\x03\x79\x94\x7c\x01\xac\xe7\xe0\x60\x97\xa5\x36\x47\xf6\x52\x17\xb7\xba\x88\x48\xae\xaf\xcc\xd3\x84\xb1\x81\xbc\xc6\xf0\xd6\x96\x72\xfb\x00\xd7\xc1\x8d\x2e\x83\xa0\xe0\x0e\xaf\x8b\x55\x5e\xc0\x3e\x80\x81\x41\x9b\x89\x06\x81\x0f\x35\xee\xaa\xd3\x6b\xc6\xdc\x1c\x3e\xd5\xce\xf1\x7d\x6e\x76\xea\x14\xeb\xae\x73\x44\x4c\x3f\xc4\xc9\xbd\xb6\x44\xae\xe2\x2e\xae\x2f\x31\xe4\x7b\x8d\xad\x87\x4e\xf3\x06\x25\x18\x64\x08\x35\xc6\x6b\x98\x81\xd9\x01\x85\xe8\xe8\xb0\xd4\xe7\x6d\x75\x11\x27\x29\x1c\xfb\x99\xbe\x4d\x41\x92\x07\x44\x1a\x52\x33\xe7\x1b\x7e\x27\x06\xf2\xe0\x90\xd9\xab\xb5\x66\xe1\x37\x34\x92\x09\x01\x93\xa5\xde\x72\x5d\x81\xd6\x8e\x80\xd6\x9b\x65\x29\x46\x0a\xeb\xb0\xfc\x51\x68\x8e\x54\x65\x73\xf7\x06\x0a\x3b\x99\x65\x23\xcc\x37\x38\x3e\x89\x5f\xdb\xfc\xdb\x2e\x4f\x3f\x2d\x1d\x76\x6d\x55\xe8\xbf\xad\xe7\xc9\x4c\x37\x34\x06\xf6\x30\xb2\xdc\x59\xee\x29\x64\x00\xf9\x89\x0b\xdd\xe3\xa7\xfd\xf4\xaf\x99\xae\xbe\x2b\xfc\xfb\x31\xfc\xe7\x69\x1d\xff\x75\xf2\xea\xe5\xc9\x4f\xfc\xd7\x8f\xf8\x31\x97\xfb\x5f\xdb\x03\x5d\x21\xe2\xca\xa2\x82\x04\x2e\x74\xd6\x52\xa7\xcf\x9e\x3d\x43\x25\x6a\xef\xb3\xf1\x22\xde\xe8\xaa\xd2\x35\xe5\xe9\x03\xa1\x31\x9d\x94\x1e\x30\xc8\x5c\x65\x80\x0c\xcf\x17\x44\xa8\x1c\xb1\x5d\x89\x90\x0b\xe2\x65\x07\xe3\xd9\xcf\x57\x96\x5e\x76\x66\x9b\xb0\x1c\x26\x87\x80\xd0\x47\xc0\xbc\xe0\x25\x73\x1d\xa7\xb5\xf0\xb3\x33\x86\x30\xd3\x06\xd7\xcc\x2e\x59\x3e\x99\x98\x67\x2e\x3d\x1f\x65\x04\xb7\x62\xc4\x5c\x77\x12\xb9\x2e\xf5\x5f\xac\x64\x48\xa9\x31\xba\x6e\x95\xb6\x3d\xe8\x13\x5a\xe8\x68\x4c\x5a\x54\x0a\xf0\xbd\x93\x69\x2b\x21\x3c\x8b\x75\x91\x21\xbd\x9e\xe9\x6e\xae\xca\x3c\x0a\x8d\x1d\xab\x6f\x29\x4c\xe0\xd7\x50\xd1\x04\xc4\x1b\x75\xdc\xa9\x35\x3c\x04\xb2\x95\xfe\x64\x2f\x5b\x19\xdc\x8f\x45\x6f\xd0\x00\xab\xe2\x0c\x2a\xc7\xa4\xc0\x88\x1f\x45\x7f\x2c\x16\xfd\x28\xed\x1b\x06\x99\x9b\xd9\xde\x1a\x94\xee\x21\xf0\xf4\x5b\x43\xb1\x0d\x61\xd5\xb6\x17\xcf\x44\xca\x05\xf3\x2a\x24\x1a\x1b\x63\x44\xf2\xea\x06\x42\x71\xea\xfd\xb0\x7f\xde\x1d\x8d\x1b\x42\x9d\x10\x37\x8e\x24\x65\x04\x86\xf0\x9a\x45\xf1\x3b\x03\xd5\x39\x63\x3a\x04\xc7\xfe\x01\x24\x21\x3e\x05\x08\x47\x18\x2f\x46\xc3\xcb\x48\xc4\x19\x1b\xe2\x91\x61\x1c\xd1\x86\x78\xb9\x2d\xe7\xdd\x4e\xbf\x37\x78\x37\x36\x5f\xf6\x42\xf5\x08\x15\x75\x71\x87\x7a\x2d\x1c\x2d\x12\x72\xdf\xcb\x7d\x6b\xe3\xcc\x42\x6c\xf8\xe8\x36\x3f\xe7\xe7\xfd\xbf\xc7\x4f\xfb\x69\xe7\xf2\xaa\x33\xfe\x3d\xeb\xbf\x5e\x9c\x3e\x7b\x11\xde\xff\x2f\x7f\xf9\x79\xff\xff\x90\x9f\xda\x3d\xff\x4a\x75\x66\xf1\x5c\x2f\xe1\xda\xbd\xcc\xe1\xc2\xbb\x4a\x66\xd5\xba\xd0\xaa\x53\x50\x2c\x78\x3c\x4b\xb0\xda\xe2\xe8\xb0\xd3\xbe\x6c\x5f\xb5\x3b\xed\x71\xfb\xb0\xd5\x56\x57\x7c\xc2\x4b\x31\xe0\x29\x05\xb6\x4a\x15\x97\xa2\x3c\x41\xa4\xd1\x45\x6a\xbb\xb3\xb7\xd4\x5b\x03\x32\x24\xbc\x88\x89\xbc\x75\xae\x8b\xe4\x3e\x36\xbe\x17\x05\x7b\xe0\xce\x76\xb8\x29\x38\x58\x92\xcc\x38\xc3\x8b\x1c\xa2\x43\x0d\x46\x8b\xb8\x46\xb1\x32\x25\xce\x38\x1f\xec\xb2\xbe\x6d\x75\x85\x42\x6f\xfc\x47\x21\x2c\x1d\x2f\x72\xe4\xde\x46\x6d\x3d\x08\x9d\xf0\x68\x94\xf2\x99\xe8\x83\x4d\x21\x38\x47\xe7\x9d\xbb\xb4\x9b\x40\x7f\x80\xf2\xfe\x7f\xd4\x48\x4b\x08\x17\xca\x78\x09\xe0\x8e\xcc\xf2\x57\x5b\xaf\xfb\x88\xfb\x53\x82\x33\x26\x91\x85\x14\x57\x6a\xcc\x29\xa3\xcc\x56\xbd\x0d\x49\x26\x47\x96\xdb\xc0\xf0\x82\x6f\xdf\x0c\x36\xef\x7c\x9b\x50\x6a\xb3\xa9\x65\x5c\xe9\x22\x89\x53\xc1\xe8\x6d\x23\x6b\x1e\x7a\x15\x7b\x14\x22\x6f\xd2\xb0\xb2\xda\x79\xce\x0c\xd1\xdc\x08\xf3\x50\xa6\xf2\x6d\x27\x4b\x86\x50\x94\x84\xa1\x50\xa5\x9e\x15\x1a\x5d\x77\x17\x08\x6e\x46\x93\x98\x1b\xce\x6e\x3a\x65\x65\xc8\x3c\x2e\x01\x4b\x5a\xee\x50\x26\x10\xc5\x62\xe5\x74\x52\x09\xa1\x88\x7b\x25\x58\x87\xc5\xa3\x33\x8a\x81\x08\x42\x05\xbf\xd6\xdf\xb3\xca\x23\x0b\xf8\x2b\x71\x34\x74\x36\xcf\x0b\x4b\x63\xb3\xcc\x2b\x4b\x58\x5f\xe2\x8e\x74\xf1\x59\x69\xdc\xdb\xa8\x0e\x12\x86\xcc\x82\xe8\x91\x30\x42\x6b\x03\x21\xda\x07\x82\x86\xf1\xca\x0c\x5a\x61\xbc\x04\xb2\x4a\x6a\x93\xf7\x85\xf5\xf9\x51\x5d\xe6\x72\x27\x37\x4a\xc5\x42\xf5\xcd\xab\xf5\x35\xb2\x52\x35\x5a\xbe\x6f\x6f\x64\xef\x30\x89\x6c\x49\xd9\xc6\x1e\x48\xc3\x98\x8c\x75\x0b\xd8\x43\x63\x08\x2a\xb4\xba\x35\x4c\x84\x70\xdf\x06\xa1\x60\xe1\x06\xc7\x1e\xde\xe0\xff\x67\xef\xdf\x9a\xdb\x46\x92\xb5\x51\xf8\x5e\xbf\xa2\x3e\xc5\xf7\x46\x4b\x11\x30\xdb\x92\xdd\xee\x83\xaf\x68\x89\xb6\xb5\x96\x4e\x2f\x29\xb5\xc7\x7b\xc7\x8e\x77\x17\x89\xa2\x88\x31\x88\xe2\xa0\x40\xd1\x5c\xbf\x7e\x47\xe5\xa1\x2a\x0b\x00\x25\xb9\xdb\xee\x99\x59\xcb\xba\x98\x71\x4b\x40\xa1\x8e\x59\x79\x78\xf2\x49\x3f\xbc\xc0\xa3\x7b\xda\xa7\x27\xc7\xd1\x66\x44\xd8\x2b\x86\x7b\x35\x96\xfc\x73\x7d\x3a\xf3\x57\x84\x07\x1c\x3c\x32\x5b\xd7\xe3\xab\x93\xdb\x31\x8e\x0b\x22\xd6\x6f\x88\x96\x18\xe8\xe3\xa0\xb3\xc8\x73\x3c\x9a\xbc\x4e\x01\x03\x88\x08\xb8\x1a\x33\x9e\xe0\xb5\xff\x77\x2f\x8a\xe0\x50\xbd\xbf\xfa\x30\xfa\x7d\x34\x56\x27\xc3\xdb\xc9\xe8\x14\x66\xf5\x0a\x79\x9a\x91\x0e\x30\xa1\x77\x4b\x0c\x82\x68\x03\xf8\x19\x3b\xb9\x91\x8f\x5d\x3d\xc4\x1e\x98\x98\x0b\x87\xc1\x5c\x20\x7a\xe8\x0f\xc3\x8f\x6c\x33\x24\x80\x0f\xb1\x83\x23\xa7\xdd\x93\x83\xfc\xdf\xd5\xf4\x7f\xe6\xcf\xe0\xc7\xdc\xac\x6a\x03\x1a\xd9\xff\x79\x77\x7d\xfe\xec\x78\xf0\xfc\x99\x17\xc1\xcf\xe6\xb6\x6a\x9e\xe1\x45\xe2\x2f\xc3\x3f\x61\x20\x3c\xa2\xff\x1f\x1d\xbd\x6a\xfb\xff\x7e\xfe\xf9\xe5\x8b\xef\xfa\xff\x5f\xf1\x53\x54\x40\xb6\xfb\xee\xfa\x5c\xdd\x1f\x0b\x40\xfc\xe7\x06\x34\x85\xbd\xb7\xb6\x6a\x08\xd9\x5b\xd8\x6a\x6f\x08\xd5\x67\xfc\xcd\xac\x4b\x15\x36\x07\xb0\x96\x45\x50\xa9\xd2\x41\xfd\xa2\x50\xea\x1a\xa9\x5b\x21\xe4\xcc\x59\x46\x66\x39\xe5\x54\x67\xff\x4b\x8c\x36\x43\x5d\x26\x93\xb7\x3c\x45\xfc\x08\x20\x9a\xa5\x76\x97\x89\x3f\x06\xbc\xe5\x74\xab\x8a\xc6\x99\x72\x8e\x55\x54\x29\xfc\xeb\xd6\x25\x04\x63\x42\xcf\x50\xcb\x9e\x11\xbf\x13\x5d\xff\xef\x2e\x6f\xd5\x3b\x53\x41\xe4\x2f\xcd\x72\xa5\xe8\x6d\x18\x73\xfc\x1e\xa5\xe4\x71\x80\x9a\xa1\xe5\xa8\x32\x21\xb9\x98\x53\x9b\xc5\x36\xe9\xb9\x5a\x82\xb2\xfb\x65\x3d\x38\xc3\x59\x96\x85\x63\x70\x3e\xb9\x32\x1c\x44\x9e\x69\x52\x63\x4f\x31\x1f\xb6\x6e\x97\xe4\xc0\x57\xa7\xeb\x06\x5e\x67\x58\x32\x05\x21\x85\x07\x31\x7c\x97\x30\xf4\x9b\xc2\x2d\x84\x7b\x91\x4a\xa3\xb7\xbe\x09\xda\xe6\x32\x94\x02\x93\xdf\xff\x2e\xf0\xff\x85\x7e\x06\x3f\x9e\xb3\xd4\xb7\x55\xb9\xfd\x26\x7e\xa0\x87\xe5\xff\xab\xe7\x2f\x5f\x3e\xef\xf0\x7f\xbc\x7c\xf5\x5d\xfe\xff\x15\x3f\x5e\xdc\x9c\x9f\xbd\x19\x0f\xc7\x1f\xd5\xbb\xd1\xe5\x68\x3c\x3c\x57\xd7\xb7\x6f\xce\xcf\x4e\x98\xf3\x6c\x8f\xb9\x00\x8e\x33\xc5\x24\xab\x47\x7b\x1d\xde\x90\xa3\xc7\x78\x82\x7e\xf2\x4f\xe8\xea\x53\x59\x54\x6a\xd2\x64\xea\x6d\x31\x6f\x16\xea\x6d\x69\xbd\xb1\xf6\xc6\xba\xc6\x3f\x79\x31\x54\xcf\x8f\x8f\x8e\x9e\x3f\x3b\x7a\xf1\xfc\x08\x43\x49\x92\x63\x23\x42\x6a\x28\xb3\xbb\x9d\xbe\x7d\x6f\xea\xa9\x6e\x8a\x65\x12\x4e\x49\x40\xf9\x7c\x71\x78\xb9\x07\x49\xda\xc4\x15\xc2\xf9\xcf\x65\x69\x37\x26\x1f\xec\xfd\xdf\x98\x65\x80\xd0\x24\x2c\x4a\x1e\xc8\xde\x5a\x82\xb4\x2c\xa6\xb5\xae\xb7\xfe\x12\x1d\xa8\x33\x6c\x0a\xaa\x87\x99\x5c\x1d\xab\xa9\xc1\x6b\xa8\x68\xd4\x9d\x65\xe4\x1a\xb7\x70\xcc\x6d\xd8\x3a\x47\x37\x89\x6f\xe4\xff\xd9\xbb\xae\x8d\x5e\x4e\x4b\xb3\x97\xd4\x59\x9f\x43\xc9\x50\xd7\x88\x48\x58\x6d\x54\x6e\x10\x43\x12\x22\xe1\x7a\xa3\xb7\x28\x71\xe7\xb5\x31\xb9\xb7\xb0\xad\xb7\x78\x29\x72\x46\xa9\xe9\x45\x03\xd4\x07\x08\x71\x73\x94\x64\xbb\xfb\xf6\x61\x72\x11\x62\xe5\x6b\xac\xba\x5b\x6b\xf0\x8d\x99\xc7\xbf\x95\x50\x41\x3d\x7b\xc6\xe4\xac\xa1\x30\x9d\x93\x21\xac\x1a\xab\xab\x62\x3e\x4d\xe3\x20\x03\xc3\xa5\xf6\x3b\x76\xf6\x9c\xe7\xbd\xb7\xc3\x19\x72\x75\x62\x0e\x95\xb3\x4b\xc3\x7a\x4b\xb9\xa5\x29\x83\x5b\x6e\x27\x25\x95\x6b\x87\xe0\xe2\xa5\x8e\x0b\x0e\x30\x44\x48\x2d\xc6\xfc\x73\xa7\x72\x33\x2b\x72\x2e\xb0\x05\x13\x0c\xc9\x61\xba\xa2\xff\x86\x61\xc1\x64\x85\x16\x32\xd5\x58\x3b\xd8\x83\x82\x56\x1b\xe8\xa2\xfe\x04\xf9\xaa\x72\xc6\x32\xff\x27\xa4\xd7\x9c\x9b\xba\x26\x4c\x09\x4d\x38\x56\x6b\x5c\xd5\xc5\xcc\x0c\xd4\xd5\xba\x7e\x70\xfd\xe4\x5e\x91\x4b\xa0\x51\x09\x00\x62\x7d\xd8\xf0\x71\x31\x25\x5d\x4d\x38\x54\x49\xf7\x90\xa1\x93\xaa\xe3\x22\x18\xac\x70\x40\xb5\x03\xb4\x35\xa8\x3c\x78\xad\xe1\x30\x8b\x9f\xa2\x1a\x66\x89\x87\xd2\xd6\x30\x59\x77\x06\x28\x84\xf8\x45\xa8\x4b\xd2\x88\x57\xfd\x33\xcc\xaf\x20\x37\x8f\x45\x3e\x81\x55\x61\x88\x08\xa8\x00\x1c\x4a\x65\x36\xd8\xdf\x55\x6d\xef\x6a\xbd\x74\xaf\x63\xd2\xa5\x6f\xee\x53\x65\x37\xa1\xdd\x1c\x14\x4c\xd0\x1a\x8b\xea\xce\x6f\x3b\x48\xd4\x6b\xcc\xac\xc1\x95\x63\xff\xdd\xc6\xa8\xca\x88\x89\x14\xe1\x63\xc2\x92\xce\x6d\x3d\x05\xb0\x20\x48\x2f\x08\x3f\x57\x70\x2e\xe9\x0b\x11\xac\x03\x85\x62\x3e\xe1\x9f\xac\x5f\x92\xda\x84\x4c\x7d\x7c\x0a\x50\x78\xae\xfd\x95\x5a\x57\x0e\x21\xe7\x56\xcd\x4c\x0d\x9e\xdd\x84\x2d\xa9\x20\xa1\xe1\x5b\xa6\xe9\xec\x5d\x4e\x21\xc5\x00\x8b\x54\x24\x8a\x66\xd1\x0c\xf6\xde\xda\x5a\x99\xcf\x7a\xb9\x2a\x4d\xf6\xf4\xa6\x18\x6c\x76\x57\xeb\xa6\xe0\x24\x3e\x2c\xa0\x4c\x4a\xeb\xda\x41\x81\x6a\xd6\xd2\x43\x8e\x2b\xa0\xda\x45\x9c\xdd\x4f\xe8\xc6\xa8\x3b\xbf\x41\xb7\x76\xdd\x2e\x53\x1c\xb7\x71\xb3\x30\x5b\x38\x54\x59\xd8\x62\x62\x5b\xb5\x92\x59\x83\x6a\x5b\x16\xd5\x27\xa5\x79\x87\x08\xa4\x25\x8f\x24\x74\x96\xb3\x36\x43\x4a\x35\x65\x3e\x53\x4e\xaa\x6d\x0f\xc4\xd9\xd8\x2f\xe8\x46\x6d\xe0\x63\xcd\xc2\xf4\x7d\x07\x49\x78\x97\xfa\x13\x04\xe8\x61\x93\x87\x56\xf9\x9e\x41\x34\x3e\x66\x5f\xe3\xed\x35\x50\xc3\x2a\x8f\x7d\x74\xc4\x10\xb0\xe4\xbd\x0c\x31\x03\xe8\x89\xd9\xe2\x7e\xc7\x9a\x4e\xb4\xb9\xf6\xbc\xd8\x58\x9a\x66\x61\x73\xa8\x4d\x82\xfb\xdd\x37\x2d\xb6\x3c\x16\xb0\xdc\x58\xe5\x1a\xb3\x72\xbf\xa9\x83\xa3\x43\xe1\xb5\x4f\x07\x51\xe5\xea\xe0\xf8\x90\x6a\x7f\xe3\x8e\x17\x97\x30\xda\x84\x48\xf9\x07\x93\x0f\x38\xe7\xc7\x29\xff\x7e\x84\xeb\x2f\xe7\xaa\xb2\xf4\xb9\xc1\xde\xb0\xf4\x76\x88\xdf\x59\xc0\xa1\x2b\x38\xc4\x7e\x70\x61\x30\x80\x49\x34\xa1\x1e\x20\xec\x1a\x3e\x33\x98\xf7\xc7\x7a\x46\x84\xa9\x47\x52\x65\x26\x48\x09\xa5\x9f\xa3\x9c\x03\xd1\xc2\x7d\xe1\x92\x96\xbc\x54\x85\x8b\xf5\x02\xa7\x5b\xb8\x86\xfc\x27\x4c\x49\x54\xbb\x2b\xed\x1c\x50\x99\xc7\xce\x01\x8e\x2f\xee\x9f\xc6\xf2\x82\xf9\x13\x10\x76\x12\x48\x6a\x51\xe3\x28\x94\xe0\x27\xcd\x22\x0b\x1b\x8f\x28\xd8\xa7\xa5\x59\x02\xab\x2e\x86\x5e\x64\x54\x2e\x80\xf6\x6a\x33\x2f\xa1\xe4\x68\x95\xb6\x49\xf7\xdb\x0f\xaa\x36\xab\x35\xc1\xf9\x07\x7b\x6f\xb1\x1a\x25\x51\xd1\x08\x01\x8b\x5a\x13\xb8\x02\xfc\x55\x03\x48\x43\x5d\x35\xe5\x16\xa7\x80\x0b\x77\x62\x00\x64\xa0\x3e\x98\x60\x52\x6a\x00\x6d\x82\x9d\xec\x77\x3e\xa1\xc6\xfd\x4e\xd7\x95\x97\x2f\x09\xe5\x46\x7a\x07\xc1\x20\x22\x23\x4d\xb9\x25\x1c\x11\x57\xda\x61\x25\xca\xdf\x23\x6b\x27\x72\x82\x10\x4e\x6a\xeb\x25\xf3\x5e\x84\x51\x54\x98\xa4\xbd\xaa\x0b\x03\x40\x59\x17\x33\x50\x2d\xa4\x3d\x20\xa9\x55\x81\xb7\x01\xac\x08\xf0\xf7\xa4\x05\x15\x45\x3d\x21\xc6\x86\x52\x5f\xb0\xca\x2e\xef\xbb\x1f\x68\x2b\x11\xf3\x3f\xa6\xc1\xd3\x73\xc8\x47\x37\xd8\xbb\xf0\xca\x9f\xd7\xd1\xa2\x66\x10\x91\x4a\xa0\xe3\x08\xc5\x02\x38\xe4\x12\xdf\x42\x54\x32\x77\xaa\x79\x01\xfc\x8e\x39\xfc\xa8\x2c\xf8\x6e\x02\x83\x74\xb3\x0d\x97\xe8\x40\x75\x15\x32\x30\x26\x9e\xae\x94\xf1\xf1\x13\xda\x58\xe8\x7e\xda\xbc\x1f\xcb\x3f\xd6\x45\x63\xba\x25\xc6\xc5\xa8\x6c\x65\x5e\x23\xba\x1b\x49\xc0\x6a\xa3\x73\xd2\x01\xe6\xeb\xb2\x24\xae\x27\x5b\xfd\xd0\x28\xed\xdc\x7a\x69\xc2\x02\x85\x08\x5f\x11\x4a\xa0\x41\x3a\xb2\x0e\x69\xc3\xe1\x23\xa1\xce\xd1\x4d\x28\xce\x14\x56\x5f\x2b\x67\x56\x1a\xc8\x05\x56\x38\x6c\x59\x69\x34\x5d\x9f\x90\x72\x02\xc7\x79\x5a\xae\xeb\x10\x80\x2c\x2a\x0c\x25\x6d\xfc\x66\xc0\xbd\x0c\xe2\x8a\xb3\x3f\x50\x06\x52\xf6\x92\xce\x73\xd2\x07\xe3\xf5\x05\x31\xaa\x02\x12\x83\x99\x0b\x71\xa0\xce\x8b\xea\x13\x82\xea\x92\x5b\x4e\x8b\xdb\x9a\x22\x6f\xc1\x2c\x4a\x84\x3a\x56\xb4\x40\x45\x1a\x63\x68\xf2\x0b\x1d\xf9\x5f\x38\xa5\x2b\x5d\xda\x3b\xbb\x86\xc5\xae\xd7\x15\x61\xfa\x5a\x3b\x09\x06\x21\x58\xf5\xe9\xd7\x03\xf5\x9e\xa9\xae\x20\x8d\xa4\x31\x9f\x21\x0c\xea\xdb\xc6\x0b\xc3\xc5\x8d\xe7\x6f\x54\x93\x13\xa9\x17\xa4\x64\x00\x79\x16\xd6\xe7\x36\x39\xf0\x41\x64\x4a\x0b\x20\x40\xb4\xbb\x48\xc6\x25\x9d\x4f\x0f\x4b\xef\x4e\x56\x8d\x17\x70\x0e\xca\xb0\x63\x05\x94\xc1\xde\x1b\x32\xf5\xd8\xea\xf4\xab\xca\x7c\x50\xb4\xa8\x99\x98\xaf\xc7\xbe\x30\xb7\xd2\xd4\xc8\x0b\xe4\x0e\x09\x38\xf2\x72\x1b\xe2\xaa\x41\x0a\x7a\xcb\x0b\x18\x7b\xd8\xea\x04\x73\x31\x67\xc6\xf6\xd8\x0a\x3b\x46\xc5\x81\xfb\x00\xa0\x70\xc2\xf1\x91\xc2\xa5\x3f\x61\xd8\x97\x83\xef\xe8\xb5\x0c\x9f\xc5\xaf\xf9\x8d\xd9\x98\x7a\xb0\x17\x56\x6c\x5d\xb1\xa2\x0a\x67\x1a\x37\x9e\x9d\x03\x80\x23\x51\xc5\xd5\xc6\xae\xcb\x5c\xe5\x66\x55\xb3\x12\x08\xe6\x1e\x4e\xa1\xb7\xad\xc2\x93\x76\xae\x30\x66\x5b\x99\x79\x21\x8e\x3f\x5e\x03\x8d\x6e\xd6\x2d\xfd\xb3\xc0\xbc\xa2\xa5\x33\xe5\x7d\x10\x28\x0f\x8b\xa7\x84\x78\x3e\xa2\x2e\xc5\xfc\xf5\x0e\x82\x0c\x3e\xa1\x09\x80\x00\xde\x2c\x8a\x32\x70\x13\x04\x6d\x8a\x4d\x2b\x28\xe4\x0e\xec\x02\x01\x64\x2f\xda\x13\xf6\x4d\xda\x6c\x42\xa8\xc0\x5c\x26\x4c\xaa\xb0\x1c\xa8\x83\x0f\x24\x8c\x80\x82\xc9\x8b\x0b\x50\x06\xad\xd2\xb3\x45\x61\xee\xc9\x51\xab\x39\x7f\xd2\x05\x25\xb3\xa8\xd4\xc2\x68\x6f\x76\x80\x2a\x8b\x1e\x92\x20\xd9\xf0\xe5\x9c\xb6\x7b\xcf\xbb\x00\xe5\x40\xa4\xc2\x7c\x5d\xcd\x9a\xb4\x38\x3c\x6a\x47\x87\x90\x4b\x04\x3c\xb1\x51\xfa\x15\xa4\x80\x94\x5e\x5a\x7b\xb3\x56\x3b\xaf\x02\xd3\x9c\x73\xe6\x62\x3a\x09\x28\x7d\x57\x5e\x4d\x72\x3b\x78\xb0\xb0\xfa\xc4\x6a\x4b\x15\x12\x04\xb5\x51\x20\x8f\x66\x89\x83\xe0\x9a\x81\xba\xd6\x5b\x4c\x4e\x53\xba\x69\x28\xd1\x89\x03\x0e\x74\xed\xcc\xa2\x14\xd6\x6a\x1f\x68\x66\xa6\x1a\x35\x38\x29\x02\xf7\x11\xa2\x4c\x4f\xc0\x40\x29\x04\x12\x1f\xc1\xc4\x2a\xa8\x65\x53\xc7\xcc\x4d\xb0\x83\x5b\xe8\x88\xc4\xa0\xf2\x5b\x0a\x81\x0a\x98\xa2\x59\x95\x5b\x22\xad\x6d\xec\x1d\x5a\x5b\x6d\xab\x62\xb0\x77\x19\x6a\x45\xe3\x05\xb7\xb2\x2e\x96\x96\x08\x37\x40\x7f\x48\xe4\x31\x29\x55\xeb\x58\xf7\x7e\x4a\x51\x09\x8e\x10\xd9\xca\x5f\x94\xa3\xf1\xc5\x84\x01\x0c\xa7\x67\x48\x27\xf0\x96\x90\xb0\x10\x63\x4f\x4a\x2d\xf8\x07\x25\xf5\xc0\x9e\x52\xea\x79\xab\x70\x8f\x48\x3a\x89\xea\x04\x14\x20\x67\x41\xc8\x43\x42\x6d\x26\x4c\x6f\x28\x3c\xb3\x2a\xf5\x2c\x8e\x31\xda\x31\x0b\x5b\xe6\x58\xf8\x15\x5d\x3d\x44\x2d\xf8\x5f\x26\xa7\xac\x1c\xa7\xb7\xe4\x31\xe4\x14\x2d\xc1\x84\xbc\x8b\x60\xef\x11\xa9\x73\x80\xe5\xd9\x75\x59\x9a\x5c\xed\xcb\xfa\x0d\xfb\x87\x03\x35\xd2\x91\x18\x0a\x2f\x36\xaa\x02\x05\x99\xa6\xfb\x5b\xbb\xde\xc7\x9a\x23\x6a\x3f\x6c\xbf\xa5\xd1\x15\xde\x80\x80\x1f\xe2\x6a\xa2\x3c\x3b\xf1\x84\x92\x59\x95\xeb\xc6\xeb\x05\x5e\x7b\x31\xb9\x37\x1d\xb4\x0b\xbb\xa1\xba\x37\x95\xb7\x45\xca\x2d\xdf\xb3\xa8\x38\x74\xef\x6c\xa7\x0e\x42\xbc\x0f\x35\x85\x20\xc6\x93\x2f\xc2\xe7\x0e\xe1\xb0\xdb\x7a\x29\xae\x6d\x17\x2a\xaa\xed\xd3\x94\xed\x67\x4c\x73\x0a\xbe\xaf\xb8\xd0\x5e\x60\x76\x56\x9b\x08\x9c\x69\xd5\xbd\xc1\x0a\x55\x22\x7b\x97\x88\x05\xc7\xc0\x4f\x5c\xf7\x24\x9f\xa7\x53\x29\x90\x52\xe7\xf1\x63\x50\x0f\x32\xea\x14\xd0\x4a\x9b\xdd\xa8\xd4\x9b\xdf\xe8\xec\xa1\x2b\x52\x7b\x25\x03\x9f\xa5\x7d\xc9\x0a\x81\x6c\x59\x52\x53\x15\x4d\x48\x8e\x0e\x0e\x6e\x4b\xe7\xbc\x45\x00\x8d\xcb\x19\x3c\x43\xb9\x72\x4d\xad\x7d\x3f\xe6\xb6\xde\xe8\x3a\x87\x52\xa7\x30\x87\xe4\xca\xa4\x62\x41\x03\x75\xf0\x1e\xa0\x4a\xe0\x80\xc8\x42\x0b\x94\xc1\x11\xf0\xfd\x3d\xe9\x10\x45\x24\x1c\x50\xfb\xb2\x3b\xfb\x83\x43\xbf\x9c\xfb\x93\xe8\x70\xd9\x27\x89\x03\xa3\xc7\x99\x25\xfe\x1e\xca\x5d\x0c\xf4\x3c\x0b\x9a\x4e\xf0\x79\xa3\x3b\x24\x1d\x6a\x63\x41\xad\x7d\x2b\x25\x58\x16\xdd\x32\x09\xf2\x11\x4f\x03\xb9\x94\x5a\x64\x79\xf0\xfb\xa5\xcd\xd7\xa5\x01\x6d\x8e\x65\x45\xa6\x56\xe5\x1a\xa9\xc2\x45\xae\x49\x64\x02\x82\xa2\x7a\x45\x4c\x39\xa1\xe7\xe1\x0b\x50\x03\xc1\x05\x24\x1c\x57\x2c\x42\x97\x4d\x80\x24\xaa\xc2\x1b\xc6\x65\x99\x10\x02\x07\x99\xed\x4f\xb4\xd7\xf3\xd0\x8b\x67\xa3\x90\x7d\xe2\xad\xc6\x01\xdd\x44\x9c\x47\xc9\xf2\x1a\x0d\x0f\xf0\x9b\xae\x1b\x57\x80\xdd\xea\x94\x9b\xd9\x95\xa1\x52\x57\x98\x0e\x1c\x15\x77\x56\xd8\xa3\x06\x7b\x1e\xdd\x1c\x92\xac\x8e\xd3\x55\xed\xba\x59\xad\x49\x55\xc3\x6a\xb9\xd2\x45\xc0\x1d\x83\x2b\xac\x60\x4e\x60\x48\x02\x77\x49\x7d\x1f\xb5\xf3\x74\xaa\x03\x99\xad\x4f\x33\x28\x38\x65\x43\xff\xc0\x82\xb0\xb6\x44\x3e\x78\xca\xcb\x2c\x9a\xc3\x81\xfa\x40\x2e\xca\x70\x42\xeb\xb5\x5f\x5b\xdf\xa6\x53\x50\x65\x8b\xca\x6a\x71\x5b\x10\xf7\x87\x5c\x47\xfe\x0b\x8f\x29\xbd\xe7\xe5\xf3\x03\xa2\x61\xfe\x48\x71\xfa\x27\x87\xae\x42\x33\x50\xde\xad\x67\x6b\x6b\x97\x78\xd3\xbd\xa4\xa0\xd4\xcb\xa5\xc9\x8b\xf5\xb2\xcd\xaf\x08\x7e\x6e\x5b\xb9\x55\x31\x5b\xdb\xb5\xe3\x4a\xd4\x11\x28\xe9\xad\x0a\xcc\x5b\xf2\xa3\x07\x87\x1a\xf5\x56\x3e\xd5\x9f\x25\x94\x27\x20\x47\x76\x95\xbd\x56\x9f\x8c\x59\xf9\x93\xe3\x77\x14\x9f\xc2\x84\x1f\x0c\x8e\x7f\xa7\x76\x91\xa0\x82\xd6\x53\x67\x04\xa2\x3a\x36\xdd\x9a\xc4\x56\xc6\x58\x68\x29\x92\x61\x4a\x7d\xd4\xaf\x4a\x58\x12\x0c\x5f\x80\x6f\x3a\x64\xb4\xaf\x16\x5b\x07\xcc\x7c\x74\x16\x42\x96\x75\xcc\x4e\xc3\x9d\xce\x00\x0c\x4d\x51\x02\xbb\xa2\x33\x0d\x79\xca\xec\x33\x8c\xbe\x48\xf0\x3f\x7d\xe6\xe8\x18\xfb\xc4\x99\x40\x90\xfb\x44\xce\x4e\x68\x11\xc7\x55\xf7\xef\x8e\x90\x42\x9b\xde\x19\xe0\xe9\x62\xd7\xd6\x03\xc7\x28\x23\xe5\xb9\xbb\x29\xe1\xd4\xa6\x72\x97\xef\xd8\x1e\x5d\x27\xb0\xf8\x71\x0d\xe7\xee\xde\x03\x4d\x67\x69\x4c\xc3\x4c\xe0\x78\x13\xb7\xb0\xec\x4a\x29\x8d\xc6\x42\xf0\x9e\xe2\x8d\x01\xac\xc4\x08\xee\x81\x34\xe5\xb6\x06\xc0\xfc\x32\xd3\xc3\x18\x20\x88\x28\x20\xf4\xd1\x87\x26\xbd\x64\xd6\x75\x8d\x66\x74\x51\x41\x01\x49\xda\x95\xde\x9e\x0c\xb5\xc4\xe1\xcc\xc0\x52\xe5\xa2\x19\xf6\x13\xe4\x04\x12\x8e\xac\xdf\xdc\x89\x59\x6f\x27\x28\xe7\x59\x5c\x71\xa8\x68\x49\x67\x5f\x65\x79\x3f\xfa\xab\x1a\x4e\x4c\x51\xe7\x81\xb7\x64\xb7\x9a\x99\xd4\xe0\xce\x0f\x81\x1b\x44\xcd\xf5\x0c\x3d\x2e\x74\x53\x87\x09\xe0\xdd\x23\x54\xab\xa0\xa8\xa1\x12\x82\xce\x14\x3b\x47\x05\x91\x99\x76\x41\xe7\xce\xb1\x20\x76\x9f\x1e\xd8\x92\x84\xfc\xfd\x4c\xde\x62\xde\xfc\xf5\x97\xd4\x1d\xc2\xa1\xc8\x11\xbe\xe1\xb2\xe7\xb1\xcf\x0e\xd8\x1e\x3e\xf9\x3b\x05\x8a\xa2\x6f\x53\x72\x57\x75\x67\x6d\xae\xe6\xda\x9f\x6d\x33\x9f\xdb\xba\x41\xec\x79\x88\x08\x65\x3c\x6c\xf4\xd7\xb6\x7a\x1c\x50\x5c\x30\x2a\xd2\x2b\xe5\x1c\x34\x58\x8d\x34\xe9\x93\x6b\xbc\xc1\x8a\x8c\x09\x9c\x52\xb2\xc2\xbc\x0f\x07\xd7\x02\xe0\xc1\x38\x9f\x1d\x18\x29\xa8\xc2\x08\xd2\x90\x38\xd0\x48\x8a\xea\x6e\xbe\x2e\x79\xb1\x0e\x92\x08\x9b\x58\x07\xb8\xbb\x84\x85\x46\x45\x5e\x95\xfb\xc7\x1a\x42\xc2\xd6\x52\x6c\x46\x87\xaf\xf0\x5d\x16\x88\x51\x37\xa6\x2c\x9f\xc5\x5a\xc3\x9d\x2b\x53\xcc\x08\xdc\xfd\x50\x63\xd5\x64\x6a\xb2\x9e\x3a\x3a\xd3\xc7\x79\x64\x1a\x0d\x7e\x6d\xf1\xde\xb3\xb0\x2d\x3a\xb3\x87\x7a\x10\xeb\x1f\xe1\xcf\xec\x0d\x47\x59\xa9\xcb\xdf\xbc\x12\xd0\xea\x4d\x67\x7d\x0a\x02\x2a\x88\xd1\xb7\x5a\xc4\xc5\xe9\x9b\x25\x54\x47\x39\x90\x0a\x63\x59\x62\xb0\x31\x52\x92\xb4\x25\x0e\xcc\x2b\x1c\x59\x88\xed\x14\x7e\xd6\x8a\x79\x01\xc3\x72\x46\xba\x39\x74\x43\x6f\x90\xde\xd5\x31\xe2\x53\x61\xeb\xad\x65\x51\xdd\x7f\x2b\xf9\xe3\xe5\x0a\x81\x2f\x97\xbd\xca\x68\xe8\x93\xaf\x07\xfd\x5a\x74\x2a\xe4\xf9\x27\x07\x6c\xe3\x98\xeb\x86\x80\x7b\x62\x98\x7e\x97\x84\xee\x6f\xf8\x58\xa5\x75\x10\xc0\x45\x95\x7e\x7a\xa0\xde\xac\x9b\x5d\xcf\xa3\xcb\x3c\xb4\xaa\x5d\x38\x01\x34\x83\x64\x96\x81\x6b\xf6\x81\xbb\xa8\x9d\x87\x93\x92\x45\x84\x5d\x53\xed\x16\x80\x19\xe1\x32\x62\x48\x11\xfd\x41\x8c\xde\x60\x32\x74\x86\x4b\x52\x41\x5e\x24\xcc\x82\xcf\xb0\x1b\x18\x7d\xd7\xa0\x05\x01\x66\xf5\xde\xd4\x44\x54\x81\x2e\x30\xa0\x93\xf3\xba\xce\xc2\xaa\x8d\xbf\xdd\x21\x58\x0e\xbb\x6c\xed\x32\x81\x2b\x6a\xba\x04\x47\x7c\xb2\xfc\x99\xf6\x5a\x93\x00\x04\x80\x1a\xec\x12\xc4\x41\xac\xc5\x49\x89\x30\xe1\x70\x4f\x41\x43\x78\x4d\x8e\x98\x4c\x7e\x0a\x2d\x4e\xa2\x8a\x36\x31\xa0\x2e\x8d\x92\xbe\xe9\x96\x7e\xf2\x3a\x38\x11\xee\x79\x03\xf6\xad\x1b\x8c\x3a\x61\xe1\x5e\x1a\xa0\x1f\xbb\xab\x89\xbc\x05\x2f\xc9\xc0\xa7\xff\x09\xc1\xba\x7d\x5a\x7d\x5b\x51\x53\x07\x6c\xed\x3e\xb0\x71\x0e\xa1\xb6\x28\xf0\xda\x2c\xa9\xf6\xad\x6b\x6c\x0d\x85\x70\xd3\xb2\x04\xa4\x1a\x0b\xc4\x70\x1d\x5c\xf2\xb1\x77\xf1\x92\x05\x9b\xa8\xf7\x92\x7d\x11\x75\x35\x8b\x95\x9d\xe9\x8c\xa5\x3b\xf3\x49\x91\x37\xb0\x06\x8d\xce\x3b\xca\x2b\x5c\xcb\x77\xc5\xbd\xa9\x12\x92\x5f\x9e\x77\x75\x63\x11\xb5\x52\x38\x01\x53\x00\x20\xf5\x17\x28\xdb\x59\x0a\x54\x10\xcf\x3c\x31\x6c\x78\x1f\x51\x82\x72\x20\xed\xea\xc1\x07\xa0\x91\x54\x66\x63\x22\x1e\x19\xf4\x81\x07\x10\x71\xbb\xa7\x6c\x81\x49\x5e\x46\xd7\x89\x7a\xe0\x85\x2b\xa6\x8f\x6d\x71\x4c\xdc\x38\xf7\x4c\x60\x92\x06\x87\xea\x14\xc5\x23\xea\x13\x31\xd9\x8d\x60\x72\x15\xa9\xa8\x34\x87\xb0\xee\x57\x90\xa6\x09\x55\xba\xe8\x29\x47\xa1\xdf\x2a\x59\x2b\x96\x00\x45\x5d\x1b\xe8\x03\xfb\x5c\x29\xae\xed\x9f\x70\x4f\x9e\xe4\xc4\xd9\x09\xdc\x81\x81\xf1\x86\xac\x02\xd0\xde\x53\x7f\x14\x75\x8c\x6e\x21\xfa\x6a\xac\xf7\x4e\x86\x4a\xe1\xa8\x52\x5b\x14\xee\x1c\x93\x87\x3d\x27\x4b\xc6\x20\x54\xab\x6d\x60\x27\x01\x48\x56\x40\xb0\xa2\x8c\xd4\xcd\x5f\x3e\x6c\x04\xb7\x0f\xbd\x70\x83\xd5\xad\xe8\x9d\xd7\x04\xd2\xe2\x11\xc7\x87\x7e\xfe\x65\x25\x02\x50\xa9\x42\x4c\x10\x7c\x4b\xbb\xcd\x16\xe7\xed\x96\x2a\x57\xc7\x94\x92\xda\x63\xbc\xcc\x10\x8a\xb0\xc5\x0a\x77\x24\xa4\x44\x71\x85\x1a\xd1\x57\x10\x91\x5d\xea\xd9\xa2\xa8\xcc\xb3\xda\xe8\x1c\xd5\x85\x68\xb6\x73\x94\x9d\x2f\xb3\x47\x7c\xc8\x3b\x3a\x08\xf2\x8e\x64\xd9\x6c\xed\x1a\xbb\xd4\x75\x01\x11\x59\x8a\xd9\x47\x58\x65\xd5\x98\x5a\x18\x27\x67\xf3\x8e\xc8\x97\xd3\xc6\xbb\x79\xba\x45\x0b\x16\xcc\xc7\x50\x8c\x02\xd6\x0d\xf6\x93\x96\xa1\x7b\xf0\xa8\xd3\x21\x0c\x6f\x79\x2d\xeb\x5e\x97\x48\xca\x94\x34\xd0\xf1\xc4\xb1\x9a\x04\x5a\x04\x34\xa6\x9c\x6e\x0a\x37\xa7\x38\x9e\x54\xd9\x5a\xb8\xc4\x56\x5b\x19\xa8\xfa\x5e\xcb\x59\xdf\x2d\x5a\xa6\x53\xf4\x8a\x2d\x57\x06\xfc\xed\x3d\x1d\x6a\xb9\x0b\xc4\xd4\x30\xa1\xf1\x30\xdd\xea\x21\xbe\x50\xd9\xd6\x2e\xed\x29\x32\x10\x14\x9d\xe9\x1a\x0e\x89\xc4\x64\xc6\x6a\xdb\xf2\x24\x4c\xb7\x6a\x6a\x90\xb1\x25\x56\xdc\x90\xbe\x78\x70\xfb\x38\x8e\x20\xf4\xc7\x9d\xce\x43\xdc\x69\x82\xae\x38\x0c\x8a\x43\xb5\x6d\x5b\x12\x52\x3b\x9c\xd9\xb6\x57\xbb\xdd\x77\xb2\x7e\xd1\x50\x50\x73\x5d\x96\x2e\xf8\x11\x1f\xbe\x33\x43\x90\xb8\x0c\x80\x84\x87\xba\xdb\x9d\x0d\x4c\x32\x02\xf3\x51\x1c\x6e\x16\x39\x7d\x41\xfe\x20\x51\x04\x16\x3b\x2c\x59\x9b\x94\x86\xd5\x89\x2c\x89\x6c\x3d\x25\x96\x97\xc2\x0f\xe2\xec\xec\xf0\xc0\x0e\x22\xb3\x30\xa6\xcb\x90\xbe\x0e\x47\xb7\x7d\x3c\xc1\x2e\x6d\x07\x4a\x00\x35\xfc\xc8\xf4\xc1\x6f\x38\xe5\x9d\x8f\xad\x08\xf4\x86\x89\x93\x22\x3e\xd1\xc5\x5b\xa5\x5d\xa2\xdf\x82\x39\x0c\x1f\xd9\x2c\xad\xd3\x98\x1e\x7b\xdc\x70\xd2\x0d\x4b\xa8\xfb\x7a\x0d\x7f\x34\x11\xb4\xed\x4f\x09\xf8\xa1\xaa\x86\x2d\x45\x0c\xa2\xa0\x29\x25\xce\x03\xf3\x0e\x9e\xa7\x90\xd6\xf0\x86\xff\x04\x3a\x91\xe2\xe5\x04\x2b\xd8\x2c\x6a\xe3\x16\xb6\xcc\x23\xbc\x0f\x7d\x1e\xdc\x1d\x84\x5a\x43\xd8\x19\x60\xe4\x68\x51\x13\xbf\x27\x49\x56\xf4\x74\x57\x12\x18\x8a\xab\x00\x8e\xee\x6a\x8d\xec\x34\xa5\x9f\x70\xbd\x34\x8d\xa9\xbd\x85\xa6\x1b\xaf\xae\xd6\x6b\x24\xda\x28\xf5\xd6\x1f\x26\xf4\xcd\x82\xdc\x0c\x0c\xb4\x6e\x09\xf1\x0a\x3d\xab\xad\x13\xbf\x28\xaa\xb2\xa8\x64\x98\xed\xc0\xdb\x08\xfe\x77\x58\xdf\xc0\x8b\xde\xa2\x52\xa5\xa9\xee\x1a\xc4\x61\x93\xa3\x45\x78\xcb\x65\x87\xbd\x42\x50\x49\x7f\x7e\xdb\xde\x09\x25\x55\x0b\x87\x78\x9c\x72\xdb\xdd\x09\x03\x75\x30\x8a\x7b\x36\x0d\x77\x79\xe5\x43\xec\x2c\x08\x9e\xec\x38\x8b\x44\x95\x0c\x86\xbd\x17\x35\xad\x7b\xff\x15\x1a\xf6\x57\x5c\xa0\x23\x6b\x2f\xf6\x03\x32\x21\xe6\xce\xb5\xee\x93\x9d\xbb\xfe\x01\xbf\xe7\x2b\x64\x99\x34\xbb\x86\x1c\x5c\x04\xa5\xb3\xbd\x03\x89\x88\x69\x42\x00\x86\x18\x0d\xed\xee\xbc\xa8\xcd\xac\x29\x7b\x4c\x24\xdc\xd0\x4c\x98\x3e\x24\xf1\x28\x52\x00\xfd\xc3\x41\x91\x20\xff\x6c\x70\x5b\x43\xfc\x19\x2f\x17\xbe\x5b\xbe\x58\x2e\x23\x5a\x12\xcb\x86\x74\xc2\x9b\x3b\x56\xb6\xa7\xfe\x22\x4f\x12\xcd\x33\xcf\xf1\x76\x77\xcd\xa8\xb8\x16\x84\xd7\x49\xe2\x60\xed\x60\x22\xa8\x6c\xa0\x2d\x99\xfa\x07\x07\xe5\x82\xd6\x14\x6c\x40\x25\xdd\x28\x53\xdd\x15\x95\x41\x0d\x06\x84\xb1\x99\xae\xef\x00\x11\xd7\xf5\x87\xc7\x20\x42\x80\xb2\xb7\xdd\xc9\x38\x55\x31\x94\x92\xf8\x7e\xdb\xe1\xa5\x82\xc2\x86\x08\x46\x0c\x89\x0a\xf2\x11\xf6\xee\x40\xb7\x1f\xba\x5f\x42\xb7\xc8\x79\xd6\x1f\x1d\x09\xa0\x65\xe8\x50\xbe\x46\xc5\x0d\xf6\x30\x78\xe0\x0a\xb7\x2a\xf5\xb6\x5b\x90\x58\x9a\x9b\x5c\x29\x30\x05\x53\xd0\xf0\x79\xd6\x43\xff\x97\x16\xcd\xed\x25\xb0\x74\x6c\x4c\x59\xa2\x9f\x0d\xac\x4e\x88\xf3\xe0\x3e\x67\xab\x1c\x50\x52\xb4\x85\xfb\x47\x80\x10\xf0\xad\xa8\x79\x68\x2b\x13\xc3\x0b\x98\xcc\x21\x42\x0b\xc3\xa0\xc9\x87\x81\xff\x19\x7d\xbe\x33\x44\xc1\x1f\xc8\xee\x60\xc6\x4a\x6d\x4c\x6d\xc2\x12\x87\xaf\x1f\x3c\x66\x10\xf4\xdb\x00\x87\x10\x01\xeb\x0a\xbc\x44\x35\x92\x9a\x62\x72\xf6\xba\x43\xee\x0c\xf2\x21\x11\x00\xab\x27\xe5\x24\xf3\x19\x4a\x55\x5c\xb8\x15\x70\x1d\xfd\x75\x2d\x50\xfc\x72\x53\xc3\xa5\xc4\xf9\x11\x52\x9a\x04\x9f\xac\x18\x55\x0b\x3b\xd1\x0e\x6a\x0c\xd4\x01\xa6\xe2\x11\x9c\xdf\xda\xbc\xd5\x91\xcd\xc2\xc6\x0c\x0b\x2c\x23\x8e\xb1\x67\x70\x80\x71\x70\xdf\x51\xb8\xa7\x68\xbb\xa8\x08\x33\xcf\xd5\x78\xbc\xe1\xe5\x95\x21\xe2\x03\xe7\xfc\x0c\xd3\xf1\x68\x13\x58\x30\xe9\xb3\xf8\x1c\xde\x65\x18\xc2\xda\xb5\x4b\x75\x70\x02\x82\xa1\x95\x11\x2d\x39\xc4\x11\x1b\x55\x1a\xed\x1a\x50\x65\x8c\xda\x1a\x5d\x43\x8e\x59\x4c\xb2\x01\xfb\x0a\x4f\x94\xef\x42\x20\x43\x22\xbe\x1d\xaa\xd8\x16\x1d\xff\xaf\x74\xc6\xd7\x05\x06\x2a\x29\x32\x55\x59\xb5\xb4\x18\x63\xa9\x68\xfe\x90\xab\x89\x22\x21\xe1\x96\xef\x70\x2a\x61\x68\xac\xc7\x06\x95\x5b\xf8\x0f\x1b\xa0\x18\x73\x7d\xd8\xf0\x44\xfb\x39\x8e\x38\xce\x42\x8f\x19\x2a\xc2\x69\xbf\x9b\x3a\xf8\x94\xc2\x3e\x02\x27\x54\xe9\x4f\xcc\x96\xe3\xf0\x79\x22\x6a\xbd\x04\x8a\x5f\x60\xef\x4f\xc8\xb7\xe3\x77\x1d\xa7\x13\x60\xb3\x3a\x7a\x6a\xde\x52\xe1\xe9\xb0\xf9\x33\x69\x10\xa7\xa0\x99\x07\xef\xec\xb4\xaa\x6b\xb5\x45\xbd\x13\x18\xd1\x5a\xf0\x7e\x48\x6e\x23\x37\x02\xf3\x75\xf1\x51\x93\x2e\x15\x3f\x5d\x45\x23\xc0\xda\x7a\x07\x43\x44\x5b\xf1\x97\x12\x0e\x12\xe9\xa8\x3c\x1f\x77\x0d\x21\xf9\xd1\x91\x54\x2f\x31\x73\x53\xbc\x76\x50\x54\x0c\x8b\xa2\x96\x6d\x2d\xd9\xc6\x0e\xa3\x80\x5b\xea\xbf\x83\x23\x7b\xb9\xb2\x15\x9c\xf1\x03\x3a\x9e\x75\xa6\x3e\x99\xba\x32\x94\x1d\x00\x95\x72\x0f\x83\x42\x8c\x9c\xe8\xfe\xde\xdf\xba\xc6\x2c\x11\x0f\xe2\xe5\x74\x6b\x1a\xea\x35\xd6\xb7\x00\xf5\x38\xe4\xac\xc0\xa7\x82\xa5\x31\x8b\x69\x2c\xe9\xdb\x68\x37\x20\x9e\x70\xa1\x57\x2b\x53\x09\x68\xac\x74\x7a\x60\xaa\x6e\x5e\xcc\x1a\xb6\x3e\x09\x81\x29\x93\x02\xed\x9c\xfc\x97\x32\x73\xa5\x85\x1e\xa6\x78\x50\x98\x54\x9d\xc8\x99\xf6\xa8\x83\xc3\x20\x7e\x1f\x9d\xe8\xba\x72\xec\x6e\x65\x48\xf9\xd4\xe2\x84\x2f\x43\x78\x3c\x6a\x87\x84\x4e\x05\x78\x4a\xc7\x72\x4f\xc3\x49\x5c\xf0\x84\x5d\x85\xe8\x0e\xe2\x20\x28\xc5\x61\x13\x30\xf4\x43\x20\x21\x57\xe4\xe6\xd9\x74\xfb\x0c\x41\x4e\xde\x62\x76\x45\x75\x57\x1a\x11\x55\x95\xc8\x59\x99\xe3\x9b\x7c\xec\x01\x34\x55\x47\x8f\x75\x3c\x65\x94\x81\x10\x00\x6a\x5d\xd5\x35\x84\xd8\x76\x8a\xc3\xde\x51\x01\xc0\x6a\x2e\xa2\x16\x3d\x3d\x2e\x9c\xa8\x7a\x1f\x92\xe7\x45\xc1\x8b\xc4\xbd\x19\x73\x5f\x37\xf6\x31\x95\xa9\x3d\xb0\x58\x69\x36\x2a\xb8\x58\x80\x79\x77\xa0\x6f\x5d\xc5\x04\x0d\x78\xbb\x95\x60\x2d\x87\x42\x00\xe0\x27\x3a\x4c\xbb\xb6\x8e\x00\x86\xbc\xdb\xad\xa3\xf7\x8e\x8c\xe9\x52\x34\x90\xd8\xeb\x46\x04\xf6\x1f\x8d\x65\x42\xd0\xf0\xf3\xaa\x24\x45\x65\x03\x99\x84\x8d\x55\xf3\x82\x8e\x47\x38\x7a\xfe\xcf\x62\x42\xa4\x48\x0f\xf3\x08\x83\xf8\x25\x1e\x0b\xdc\x90\x92\xf0\x52\xb2\x4b\x83\x1a\xe5\x87\x95\x25\x01\xb0\xd4\xc9\xde\xc7\x14\x18\x76\x86\xa0\xf9\x8f\x9a\x76\xb5\x05\x78\xfc\x72\xd5\x88\xbd\xd5\x29\xb4\xff\xc5\x1d\x29\x1c\x54\x6c\xc8\x62\x19\x01\xbd\x6e\xec\x52\x37\xc5\x0c\x64\x54\x2c\x71\x25\x83\xa2\x7d\x3d\x0c\x57\x51\xa8\x15\xb4\xb0\x78\xd3\x86\xdb\x19\xc3\x25\x59\x2c\x74\x9b\x05\x9a\x9a\x9e\x26\xa3\xb2\xc7\xf9\xf1\x45\x1d\x49\x19\x44\x09\x31\x67\x15\x78\x8e\x29\x21\x28\x74\x00\x51\x1f\x9c\x87\x26\x0a\x1b\xc3\x82\xfe\x3a\x48\xca\x66\x87\x5b\x3d\x10\x8d\xb6\x03\x75\x85\xb7\x90\x82\xfa\x00\xe0\x08\x74\x20\x27\x17\x71\x45\xbc\x95\x90\x6b\x0a\xcc\x94\x28\xad\xd3\x3c\x5b\xd2\xc4\x77\xaf\x0b\x55\x96\x68\x47\x95\x38\x21\x5d\xf3\x21\xab\xe1\x4c\x2d\x8a\x69\x11\x2b\xde\x84\x44\x71\xc2\x1f\x74\x47\x93\xa0\x4d\xa6\xdb\x34\xb5\x2d\xc9\xf6\xec\x44\x86\xaa\xed\x03\xb1\x60\xb4\x05\x99\x5d\x15\xb7\x4c\x0f\x6b\xab\x08\xb1\x12\x9b\x11\x17\x3b\x0d\xe8\x89\x27\xe6\x95\x60\x8f\x63\xf7\x5b\x53\xd8\x8a\x9b\x13\x48\xe0\xe8\x39\xa1\xfb\xa1\x3a\x07\xe2\x38\x1f\x0a\x86\x3d\x32\xe4\x46\x66\x9e\xb7\x8e\x0f\x6d\x7d\x27\x0a\x71\x8b\x04\xca\x90\x03\xe7\xff\x82\x84\x04\xed\x04\x6c\x71\x8c\x55\x9a\x87\x1d\xae\xd9\x84\x15\x73\x47\x5e\x4e\x2a\xbc\x8a\x25\xe0\x95\x20\x81\x78\x5d\x13\x61\x96\x54\x66\xaa\x74\x50\xee\x87\x08\x66\x48\x2b\xe4\xcb\xca\x78\x45\xd5\x3e\x51\x44\x89\x40\xc1\x57\xac\xaa\xc2\xf1\x14\x2a\x31\x8e\x17\xba\x88\x14\xb5\x43\xd7\xb0\x60\x47\x03\x75\x36\x27\x25\x17\x2a\xce\xfc\x63\x1d\x70\xa9\xc8\xf9\xa9\xfe\xbe\xce\xef\xb8\x70\x89\x2e\x4b\x01\x7e\xa0\x2c\xe0\xa2\x9a\x7b\x83\x26\x54\x37\x49\xab\x31\x53\x4a\xe9\x41\x28\x83\x4d\x99\x68\xf4\xae\x73\x6b\xe3\x0e\xb3\x84\x10\xb7\x36\x34\x91\xb0\x27\xfc\x36\x3a\x60\x37\xe2\x74\x4b\xbd\xb2\x75\x0e\xda\x79\x52\xdf\x86\xc5\xf7\x61\x8c\x62\xa1\x7e\xc7\xf6\x30\x7f\xa2\x83\xaf\x01\xbf\x24\x1d\x6b\xf3\x79\xe6\x55\x3f\xff\xdd\xb0\xa5\x76\xbf\x1b\x28\x17\x48\x6b\x94\x3a\x13\xa7\x9d\x60\xdc\xcf\x2b\x6e\xcb\x75\xd9\x60\xb9\xbb\x92\x70\xb0\xb2\x48\x52\x8f\xa8\xe6\x4a\x42\xa4\x03\x9b\xba\xc1\x5b\x5e\xbc\x46\xce\xef\xce\x1a\x6e\xc5\xc6\xdc\x71\x0a\x29\x0f\x5b\xb5\xd9\x30\x74\x2b\xcb\x9c\xd2\x1a\x21\x5a\x80\x2e\x49\x49\x64\x2d\x4f\x79\x37\x2e\x08\xb0\x4a\xc0\x6d\x58\xe0\x4a\xb0\x01\xdc\x4d\x41\xfe\xe0\x03\x86\xb2\x4e\xe1\xbf\x9a\x45\x0d\x11\x96\xad\x5d\x0b\xf7\x3e\xe6\x87\x21\x1f\x90\xdf\x0a\x65\x1e\x66\x17\x74\xf5\xe0\x63\x94\xd7\x1d\x3c\x36\x25\x3f\xc6\xbc\xf6\x77\x57\x40\x1b\xc1\x12\x3f\xd0\x7d\x8e\x82\x74\x02\x9f\x02\xf1\x04\xec\xda\x65\x1e\x4a\xba\x75\x0a\xcd\xc5\x1a\xeb\x70\x1a\x67\xeb\x52\xd7\x6a\x56\xd4\xb3\xf5\xd2\x81\x04\x47\x61\x37\xd5\x65\x14\xe7\x46\x36\x2f\x93\x38\x01\x92\x13\xf3\x7a\xf9\xa9\x88\xec\xeb\x7d\x01\xa0\x04\x08\x04\x11\xdf\x75\x6c\xac\x09\x58\x17\xa3\x2e\x7b\x70\x5d\x45\x05\x0e\x2c\x22\x76\xe1\x83\x2f\x28\x01\x5c\xcc\x34\x4b\xab\x85\x23\x24\x8c\xd9\x61\x18\x0f\x26\xeb\x27\x85\x2c\x28\x7c\xf2\x75\xfa\xf1\x85\xa6\x54\x14\x3f\x3e\xd1\x43\xc1\xed\xd1\x10\x4e\xec\xae\x16\x15\x99\x52\x52\x85\x64\x9d\xc9\x06\x0e\x20\xbe\xc2\x6f\x7f\x2f\x4b\xf0\xbe\x6f\x65\xbc\xaf\x6a\xaf\x1a\xf8\x19\x53\x17\x58\xdc\xc5\xae\x4a\xc9\x92\x70\x67\x2a\x53\x63\xdd\xc8\x4a\x10\x86\x93\x9b\x77\xe3\x6d\xb5\x1a\xb0\x35\x32\x71\x4d\xea\xfd\xbc\xe1\x41\x76\x51\xe7\xb0\xfa\x3b\x4a\x74\x8b\xa5\xc6\x0a\xd7\x84\x44\x41\x19\x12\x08\x2f\xbd\x26\x45\x7e\xbd\x0a\xd9\x06\x90\xf4\xf7\x63\x6e\x2b\x9c\x7e\xe2\x75\x2a\xe6\x0a\x6e\x4b\xe5\x16\xb0\x67\xbc\x5a\x48\xb9\xf7\x89\x14\xa3\xbe\x72\xff\xa2\x38\xa2\x4e\x62\x6e\x68\xc8\xe8\x23\x41\x48\x77\x21\x4a\x62\x88\x73\x44\x94\xce\x8e\x9d\x0d\x88\x25\xdf\x55\xff\x9d\x72\x4b\xac\x13\x1b\xf2\x99\x4c\x4d\x89\x39\xbb\x5c\xd3\xab\x75\x61\xe1\xcd\xea\x9a\xde\x28\xfd\xd1\x71\x08\x0b\xb4\xd3\x8c\x7e\x24\x9e\xa5\x36\x04\xc8\x89\xfc\x1f\xbf\x10\x4c\xef\x30\xb3\x6b\xbf\xc0\x26\x24\xd1\x4d\x93\xdd\x3f\xdd\xc6\x88\x81\x4c\xb0\x72\x59\xaa\x9c\x74\x72\x34\xbd\x68\x04\xc7\x40\x9a\x6f\xd3\x73\x29\x40\x88\x2b\xcf\xd1\xef\xe0\xb7\x41\xd1\xa8\x3b\x63\xef\x6a\xbd\x5a\x40\x28\x36\x19\xa2\x48\x6d\x83\x62\x03\xc8\xaf\x00\xd2\x38\x0c\x25\xfa\xb5\x93\x57\x13\x8a\x3a\xcc\x6b\x42\x20\x3d\x44\x3c\xe2\x44\xa0\xe8\x58\x3b\xfa\x80\xc9\x07\xea\xac\xa2\xd3\xac\x1d\x93\xdf\x47\x60\x60\x48\xf4\x66\xc7\x4f\xe8\xa1\x76\x7e\x5b\xb2\x3b\x98\x9c\xd4\x53\x9b\x77\x63\x24\xb0\xaa\x2f\x30\xce\xbd\x93\xf4\x0c\x9c\x2d\x94\xfe\x53\x9b\xfb\xc2\x61\x49\x4a\xbf\xe4\x95\xd9\x30\x8e\xae\x13\x9f\xdd\x45\x60\x00\xea\x80\xd7\x6d\xfd\xc1\x2a\x96\x86\x5c\x49\x49\x53\xa1\x64\x67\xb1\x2c\x4a\x2c\xf7\xef\x56\x45\x5d\x04\x7a\x75\xaa\x22\x1b\x99\x6d\xa6\xeb\x86\x22\xb6\xe0\xea\x05\x06\x91\x46\x17\x25\xc8\x6e\xcc\x8d\x85\x4f\x04\xd6\x1b\x44\xd4\xce\x4c\x4d\xe1\x3a\xd0\xb9\x03\x26\xd0\x11\x60\x4f\x13\x4f\xc3\xdd\xba\x70\x60\x39\xf1\x13\x48\xe6\x17\xce\x43\xd0\x77\xc9\x7d\xec\xef\x91\xf4\xd1\x8e\x7d\x81\x32\x53\xc0\xf7\xe8\xda\xdd\xf7\xb2\xa1\xd4\x4d\x04\x43\xee\x67\x29\x11\x5b\x48\x24\x92\x25\x20\x16\x3b\x72\xde\xb9\x80\xee\x3c\x45\x3d\x46\x1a\xff\xe4\x53\xbc\xd0\x31\x0d\x7a\xd7\xb6\xe8\x0c\x3d\xa2\xf2\x09\x65\x19\xad\x8a\x74\x26\x62\x88\x79\xb6\xb0\xac\xea\xf3\x23\x98\x25\xf1\xe4\x4e\xc0\x06\x7e\x19\xf4\x47\xc6\x27\x8a\xd3\x01\xda\x42\x67\x73\x02\x36\x91\x2a\xeb\xa6\xdc\x13\x70\xa6\x93\x03\xdc\x56\xab\x2b\xf0\xce\x34\x60\x3a\xb0\x87\x08\xf0\xe5\x75\xd1\x98\xf4\xba\x60\x16\x37\xaf\xce\x47\x1b\x1b\x75\xc5\xc8\x52\xc4\x97\xa7\x14\x79\x8f\x0c\xbc\xf5\xb5\x5d\x8f\xbd\x06\xfe\x40\xbb\x34\xfe\xa0\x39\xbc\x1b\x82\xff\xdd\x05\x40\x0b\x72\x04\xfa\x1b\x2d\x29\x98\x7b\xb7\x06\x8f\x0f\x75\xa5\xd9\x58\x75\x67\x21\x5a\x31\x97\x04\x16\x4d\x97\x6f\xc3\xab\xaa\xa2\xbe\x0a\xf8\x9f\x89\xe5\x22\x2d\xd8\x86\xca\xc7\xd2\x06\xdd\x83\xd9\x43\x30\xf2\x4e\x37\x4a\x78\xe5\x0e\x45\x4a\x89\x0a\xe5\xe5\x55\x28\xfc\x05\xdb\xe0\xa7\x81\x7a\x33\x02\x62\x7c\x60\x97\x67\x06\xd3\xb3\x09\xb3\x96\x9e\xaa\xb7\xe3\x11\xf0\xd3\x9f\xbc\x1f\x8e\xdf\x8d\xa0\xc4\x01\x56\x58\x10\x6d\x01\x0d\x81\x68\x20\xe3\xd2\x60\xa3\xbf\xdd\x8c\x2e\x6f\xd4\xf5\x68\x7c\x71\x76\x73\x43\xd5\x18\xae\xaf\xcf\xcf\x4e\xa0\xe6\xc0\xf9\xf0\xc3\x40\x8d\xfe\x76\x32\xba\xbe\x51\x1f\xde\x8f\x2e\x23\x69\xbe\x9a\xdc\x0c\xfd\xf3\x67\x97\xea\xc3\xf8\x0c\x6b\xf7\xbf\x1f\xf5\x14\xfd\x1a\x5e\x9e\xfe\x18\x6a\x69\x41\x15\x85\x51\x28\xfe\x90\x8c\x89\x0b\x3d\x3c\x52\x00\xed\x0c\x1a\xa2\x2a\x10\xa3\xd3\xfe\x4a\x68\x7f\xb2\xf8\x03\x70\x33\x3c\x56\xff\x61\x80\x13\x78\x79\x73\x36\x1e\xa9\xf1\xd9\xe4\x3f\xd5\x70\xc2\xd3\xfa\xbf\x6f\x87\xa1\x9d\xeb\xd1\xf8\xed\xd5\xf8\x62\x08\x65\x07\xde\xb6\x97\x11\x6a\x90\x7d\xbc\xba\x1d\xa8\xc9\xfb\xab\xdb\xf3\xd3\xe4\xef\x7e\x9a\x46\xea\x74\xf4\x76\x74\x72\x73\xf6\xfb\x28\xf3\x0f\xaa\xe1\x64\x72\x7b\x31\xa2\xd9\x9e\x40\x95\x82\xe1\xf9\xb9\xba\x1c\x9d\x8c\x26\x13\xff\x16\x96\x64\x80\x59\x18\x8f\xae\x87\x67\x63\x2c\x00\x31\x1e\x63\xd9\x33\x94\x2f\xaf\xd2\xca\x14\xb7\x97\xe7\x7e\xac\xe3\xd1\xff\xbe\x3d\x1b\xf7\x6d\x03\xdf\xc6\xf0\xdd\x78\x84\x55\xe5\xc4\xaa\x7f\x38\x3b\x3f\xa7\x32\x16\xe9\xd2\x43\x09\x06\xff\x87\xb8\xf4\x1f\xd5\x87\xf7\x57\xea\x62\xf8\x11\x89\x2f\x3e\xf2\xe6\x18\x8f\x02\x33\x46\xba\x27\x86\x13\xb1\x35\x87\x6f\xae\xfc\x1c\xc4\x8a\x18\x37\x57\x30\x21\x7e\x81\xa8\xa2\x85\x2c\x86\xe7\x3f\x4d\x4c\xbf\xa2\x2c\x46\xac\x95\xb1\xbb\x2c\x06\x97\x83\x68\xd7\x80\x18\xab\xb3\x4b\xde\x21\x37\x57\xaa\x7d\x28\x0f\x1e\x2c\xc4\xc7\xe5\x31\x4e\x87\x37\x43\xa8\xf2\xe1\xff\xff\xcd\xc8\x3f\x3d\x1e\x5d\x9e\x8e\xc6\x70\x98\x86\x27\x27\xb7\xe3\xe1\x0d\x7c\xcc\xbf\x31\x9a\xa8\xc9\xed\xe4\x66\x78\x76\x89\x8b\xe2\xc7\x0b\x47\xf9\x6c\x7c\x1a\x4e\x13\x6c\xd0\xb7\xc3\xb3\xf3\xdb\x71\x67\x8b\xdd\x5c\xa9\xab\xeb\x11\x34\x09\x5b\x2d\x2e\x08\x97\xb2\x38\x8c\xb5\x2c\xa0\x5a\x05\xae\x9e\x4a\xce\xec\x47\xf5\x7e\x38\x51\x6f\x46\xa3\xcb\xa7\xd7\xbb\x98\x0c\xd4\xe8\x12\x9f\xeb\x21\x46\xd9\x7b\x8f\x6c\x3d\x43\xb0\x41\xd1\xc7\x7a\x03\x77\x7d\x63\xd5\x47\x2f\x59\x2f\xcd\x86\xae\xb6\xc2\xb8\x3d\xa6\x66\x47\xb6\x1c\x4c\xad\x48\xb9\xac\x04\x87\x2a\x59\x02\x74\x3f\xde\x21\x8e\xb6\x89\x6c\x30\x6b\x17\x6e\x19\xb4\xe6\x80\xd8\x0e\xa0\x0c\x4b\x53\xe5\xcc\xc3\x00\xec\x4b\x26\xb1\x74\x24\x7f\x22\x92\x5c\xa6\xd4\x8d\x9c\x19\x1b\x08\x71\xc1\xdd\x0a\x96\x00\xea\xcb\xbe\xdd\x96\x5b\xa4\xc3\xd4\xa1\x0e\xa0\xae\x4f\x49\x55\xc6\xef\x4d\xb9\xcd\x76\x45\x7f\x1e\x61\xad\x39\x04\x62\xd7\x90\xac\xc3\x5f\xc8\x94\x6e\x1a\x4d\xf1\xdd\xa8\x70\x85\xf4\x99\x84\x87\x93\xb9\x9e\x9d\x9e\xfb\x59\xf4\xd7\x7f\x78\x79\xc9\xcf\xba\x86\x82\x45\x00\xff\xa2\x30\x35\xe2\x6e\x2d\x92\x73\x49\x3e\x2f\x20\x5b\xd9\x52\x7c\x18\xea\x9c\xa1\xee\x97\xe6\xbb\x43\x53\xd0\x86\x5b\x80\xab\x06\x61\x04\x11\xf9\x61\xd4\x7e\xd0\x2f\xf6\x01\x04\x4a\x36\xe7\xca\x82\x79\x05\x48\x73\x0c\x45\x51\xd9\x7a\x8e\x82\x41\x45\x81\x75\x95\x0f\xf6\xfc\x4a\xc2\x9b\x12\x3b\x52\x06\x32\x02\x28\x17\x85\xce\x36\x55\xe4\x46\x23\x28\x14\x09\x86\x90\xf1\x20\x65\x08\xdf\x7a\xcb\x94\x6b\x4c\xa1\xc2\xc4\x8c\xce\xc1\x7c\x4c\x36\xd5\xeb\x90\xc9\x93\xec\x25\x54\x9c\x05\x13\x68\xd1\xec\xda\x02\x8f\xb3\x11\x42\x8e\xe2\x53\xf5\xcf\xd7\x82\x82\x25\xcd\x54\x0a\x5e\x51\x5b\xab\x83\x94\x01\xe0\xb0\xab\x76\x0f\x3a\xe3\x96\x4e\x0d\xb2\xe0\x80\x23\x8b\x09\x9b\x58\x47\xc3\x0c\x1d\xb4\x7f\x58\x1b\xc0\xba\x3c\xa8\x11\xbc\x0e\xe0\x67\x42\x5c\x83\x5f\x18\x72\x72\x03\x05\x81\x9d\x77\x2e\x75\x5b\x3f\xe1\x4e\x9f\x18\xf3\xd4\x49\x45\x96\x72\x20\x9b\xf6\x56\x99\x1b\xec\xf9\x43\x2f\xb7\x6a\x3f\x4a\xe6\x49\x0b\x26\x33\x33\xe2\x2c\xbe\xf6\x46\x70\x65\x9b\x27\xaa\xca\xc8\x48\x9f\xa9\x3f\x48\x49\x8f\x8c\xb3\xe0\x51\x28\x2a\x28\xf6\x87\x36\x5a\xa0\x5a\x03\x68\x1a\x12\x46\xfb\x5d\x65\x4a\x33\x6b\x6a\x5b\x15\x33\xe2\x7c\x5d\x01\xc5\x6f\x51\x26\x33\x03\x18\xdc\x3b\x43\xdb\xc7\x2c\x57\xa5\xdd\x9a\x5a\x1d\x70\xae\x5a\xc8\x46\x26\xfb\x65\x69\xea\x43\xc5\x7c\xe2\xce\x9b\x57\x25\xfa\xa2\x2b\xe0\x3f\x86\x98\xa0\xd2\x42\x12\x08\x7a\x8e\xfd\x00\x58\x8c\xf4\x8e\xf3\x00\x65\xdb\x0e\xd4\x7b\x62\xbc\xd5\xca\x81\x97\xfb\x35\x25\x14\x36\x54\x29\xce\xfd\xb6\xf7\xd1\x6e\x6d\xbe\xad\x0c\x4f\x26\xd5\x4b\xe4\x8f\x38\xae\x03\x4c\x1f\x07\xc1\x63\x00\x7e\xb4\x27\x3e\xac\xfe\xdf\xb7\xb5\x9d\xfe\xa0\x0e\x62\x8e\x3b\x74\x6d\x63\xf0\xae\xf9\x54\xd9\xa9\x3b\x64\x07\xc7\xde\x74\xab\xfe\xc3\x7f\x5e\x8d\x75\x95\xdb\xa5\x7a\xaf\x67\x9f\x4c\x3d\xd8\x43\x10\xd8\xba\x06\xf1\x72\xb3\x55\x27\xd6\x2f\xdd\x91\x1a\xae\xea\xa2\x54\x47\xbf\xfe\xfa\x7c\x2f\xfc\xf6\xba\x36\xae\xe0\xec\xf7\xdf\x8b\x99\xd9\xbb\x59\xe8\xe6\x87\x40\x10\x84\x23\x07\x23\xfd\xff\xf7\xdf\xbe\x54\xc9\xe0\xc7\xb3\x37\x17\xcf\x56\xc5\xd4\x7d\xbb\x12\xb0\x8f\xd5\x7f\xfa\xe9\xf9\xab\x76\xfd\x8f\xe3\x9f\x5f\x7e\xaf\xff\xf1\x57\xfc\xa0\x7b\x59\xe0\xf2\x02\x69\x1a\x38\xe9\xf5\xbd\x2e\x4a\xc6\xb4\x92\x38\x3b\x7b\x73\x01\xa9\x87\x95\x1a\x4e\x9e\x9d\x4d\xd4\x54\xbb\xc2\x01\x30\xc4\xeb\x0c\x28\xdb\x03\xf8\x93\x9a\x8e\x54\xbe\x8c\x2a\xf1\xad\xc4\x7a\x98\xb1\x66\x02\xd3\x17\x6d\xf4\x56\x78\xdb\x73\x63\x96\x4e\xcd\x91\xde\x88\x7d\xb2\x14\x86\x87\xec\xb7\x18\x79\xf7\xff\x25\xb9\xd1\x33\x72\x30\x24\xb1\xfa\xa2\xe1\xdb\x9c\x03\xda\x7c\x75\xa6\xe0\x7e\x75\x69\x83\x67\x2b\xf6\x5b\x78\xaf\x29\xee\x27\xa2\x0b\x4e\x85\xac\x21\xbe\x7d\x3b\x2c\x83\x81\x44\x78\x58\x6d\x03\x07\x68\x5a\x06\x93\x6e\x85\x48\x46\x8e\xea\x00\x4c\x1b\x06\x0c\x98\x89\xbe\x31\xb3\x45\x05\x6e\x6c\xb7\x5e\xad\x6c\xdd\x88\x1a\x0c\xd2\x01\x13\x50\x2c\xc0\x3b\x91\x86\xc4\xa9\x84\x28\x87\x07\x9c\x28\x98\x15\x62\xba\x92\xd9\x36\x50\x61\xc3\x08\xa8\x70\xff\x66\x61\x03\x43\x92\x4b\x96\x9f\x93\x71\xfb\xf8\xf2\x3a\xf9\x03\xc9\xce\x48\xcb\xc1\xae\x74\xad\xc1\x6b\x1f\xc3\x79\x2b\xbf\xe1\xd0\x45\xbf\xb1\xf1\x81\x00\xd8\x0e\x94\x4d\x80\xcf\xe1\x5e\x47\xa3\xfc\x4c\xbd\x51\x17\xea\xe4\x6a\x7c\x7d\x35\x06\xbe\x49\xe5\xc5\xd0\x5e\x70\x23\x5d\x0c\x6f\x46\x63\x6f\x05\x3f\x53\xd7\xe3\xab\x77\xe3\xe1\x85\xff\xff\xeb\xd1\x18\x0d\x3b\x78\xfd\xdf\xf8\x96\x18\xfc\x78\x71\x76\xf3\xcc\x54\x95\xfe\xa7\xc9\xff\x17\xc7\xcf\x3b\xf5\x9f\x8e\x7f\xfe\x5e\xff\xef\x2f\xf9\x49\xad\xb4\xe3\xe7\xcf\x9f\xab\x13\x5d\xbb\xc6\x54\xea\xbd\x2e\x9a\xff\x2a\x21\x0e\x9f\xab\x7b\x5d\x17\x49\xb0\xd6\xd6\x4e\x1d\x38\x63\xd4\xf0\xf6\xe6\xfd\xd5\x78\x72\xb8\x77\x1d\x81\x65\x3d\xe5\xb3\xc1\xb8\xb3\x73\xca\x1e\xc8\x98\xc7\x93\x44\x07\x72\xf5\x47\x56\xb5\xae\x3c\x04\x5b\x33\xf2\x30\xa6\xf5\x9d\x31\x45\xe3\x00\x2c\x5f\xd6\xf7\xf7\x0f\x33\x8c\xdd\xea\x92\x65\xc1\xa4\x5d\x63\x58\x80\x8d\xe4\xc5\xd2\x43\x72\x29\xa0\x46\x78\x55\xb5\x4b\x8d\x2f\x0d\x0c\x8b\xcc\xc9\x14\x39\x25\xc1\x90\x9c\x23\x63\x50\x3b\x16\x5c\x6e\x93\x76\xc1\x21\x82\x8e\xe0\x14\x21\x01\xcc\x82\x64\xf1\x44\x16\x4c\x5a\xd7\x15\x5a\xb0\x11\xc6\xd6\xaa\x50\x1c\x5d\x19\x92\x68\xed\x66\x67\xf5\xed\x88\x09\x11\x68\x41\xfa\x53\x28\x9d\x1c\x38\x41\xfd\x8d\xbd\x73\x34\x21\x5b\xed\xa4\x9d\x3e\x36\x90\x74\x31\xe4\x70\x2a\xb7\x61\x65\xa1\x44\xfa\xa7\xca\x6e\x4a\x43\x80\x2a\x06\xff\x62\xb8\x2e\x62\xe4\xc3\x1e\x09\xba\x0b\xa6\x57\x79\x93\x30\xbd\x81\xda\x9b\x8a\xf3\x4c\xa2\x9a\xc3\xdd\x20\xbc\x31\x8d\xd1\xb5\xba\x82\xf5\x23\x50\x81\xe8\x8c\x2b\x53\x17\xba\x5a\xeb\xd2\x65\x64\xbd\x16\x0d\xa2\xb5\x2f\x74\xfd\xc9\x24\x45\x28\x43\xbd\xef\x74\x3b\xa7\x75\xc9\xa9\x80\x47\xbe\x9e\x35\x9d\x0c\x5a\x51\x92\x42\xc6\x1b\x43\x7c\x2e\x50\x3e\x25\xe4\xc8\x30\x75\x65\x51\x7d\x6a\xb9\xb4\xfc\xf2\x85\x6f\x07\x2e\xe7\x50\xe5\x09\x48\xf1\x10\x4e\x68\x6b\x95\x6f\x2b\xbd\xc4\xff\x3c\x44\x9f\x04\x04\xbc\xd9\xef\x15\xca\x7c\x50\x7b\x83\xbd\x6b\xa8\x9e\xa6\x1c\x79\x12\x88\xfd\x79\x70\x7d\x3e\x3c\xbb\xa4\xd4\x22\x00\x4a\x3f\x33\xd5\x1d\x04\xa0\x01\x38\x5d\xe9\x04\x42\x24\xf6\x67\xe1\x6d\x36\x24\x3a\x1a\xec\xdd\xbc\x1f\xf5\x97\xd1\xa6\xf0\x49\xf6\x58\xfc\xa4\x53\x3e\x5b\xfa\xcc\x7b\xfc\xd6\xfe\x83\x7f\xb2\x52\x36\x17\xca\x96\x75\xb2\xfb\x0a\x63\xfb\x4f\x91\x94\xed\xa9\x7b\x0d\x15\xb5\xb3\xe0\xa4\x0f\xfe\xe9\xfe\xd2\xd0\xc3\x4b\x35\x84\x70\x07\x84\xc6\x42\x9d\x68\x28\x09\x2d\x8b\x3f\x67\xc1\xdb\xff\x76\x7c\x75\x91\xb1\xcf\xff\x8a\xeb\x4b\x5f\x62\xd0\x04\x9d\xe7\xc9\xe4\x53\x44\x8d\x22\x03\xd8\x97\xd3\xd1\xf0\xfc\xec\xf2\xdd\xc4\xbf\x2c\x1f\xfe\x5e\x0a\xf4\x9f\xfd\x33\xf8\x71\x3c\x39\xb9\x3e\xff\x76\xca\xdf\xa3\xfa\xdf\x4f\x47\x47\x47\x3f\xb7\xf4\xbf\xa3\x57\xc7\xcf\xbf\xeb\x7f\x7f\xc5\xcf\xb8\x98\xd9\x85\x22\x86\xee\x13\x7f\x49\xa6\x1e\xd7\x50\xfd\xf3\x68\xf0\x9c\x48\x8c\x4f\x45\xb2\x2a\x65\xd5\x1c\x0d\x8e\x06\x6a\xff\x24\xea\x86\x81\x36\x5d\xcf\x16\x80\x1d\x6d\x28\x6b\x92\xc9\x5b\x88\xe4\x0e\x35\xa4\x70\x0d\xc1\x5f\x49\xdc\x5f\x74\xb2\xec\xe1\x43\xc7\xe9\x87\x14\xf5\x6f\x5f\xb0\x89\x63\x12\x4d\x92\xfd\x7f\xc5\x28\xb2\x13\x48\x4a\x5e\xd5\x85\xad\xd3\x2f\x04\x92\x4a\xad\x44\xf3\xd1\xce\x4c\x1f\xe6\xec\xd4\x90\x0f\x44\x18\x55\xf1\x6a\xec\xf2\x8b\x81\xda\x1f\x45\x1f\xf0\xa9\x0c\x72\x5d\x98\xd9\x42\x57\x85\x5b\x46\xce\xfe\x8d\x99\xba\xa2\x09\xf6\x32\x22\x57\x96\xfc\x5c\x04\x46\x50\x42\x43\x0c\x1a\x44\x94\xa4\xa8\x9d\x31\xb3\xcb\xe5\xba\x2a\x42\xc5\x32\x23\xdd\xd1\x6c\x1c\x33\xc3\x6b\xec\xf3\x4b\xdf\xe7\x98\xa3\x77\x02\xdc\xed\xd8\xc3\x77\xf6\xde\xd4\x95\xc9\x71\xbb\x90\xbb\x06\xf3\x95\x22\x5f\x8e\xd8\x51\xb1\xd1\x9f\x06\x6a\x3f\x79\x5b\xae\x5a\xb2\x44\xaa\xb3\x3c\xcc\xdc\xf0\xc8\xda\xa2\xa2\x25\xdf\x04\x8a\x23\x24\x5f\xd0\xce\x08\x2d\x3f\x50\x52\x80\xcf\xd7\xce\x63\x3f\x5f\x0d\xd4\xfe\xb9\x37\x53\x6a\xf5\xc1\xd6\x9f\xc4\xd2\xc4\xe2\x02\x94\xa9\xd5\x9e\x0e\x5b\x77\xda\x45\x2d\x0e\x14\x50\xaf\x92\xdd\xf1\xf3\xd3\x0e\x4f\x60\x97\xc2\xf7\x68\xf0\xb3\xef\x0b\xfc\xd2\x2f\x84\x9c\xb0\xc0\xe4\x08\x36\x56\x16\xf8\x4b\xf5\xe7\x62\xb9\x5e\x22\xb9\x65\x0c\xee\x46\x6a\x11\x66\xcc\x28\x96\x21\x14\x0c\xe7\x59\x97\xd8\x12\xf8\xdc\x02\xb5\x1c\xec\x33\xcc\x48\xc2\x4a\x6f\x9c\x21\x93\xe6\x5f\x60\xe4\x32\x26\x60\x84\xfe\xff\x12\xfa\x2f\x3a\x5f\xb8\xa0\xf1\xc6\x27\x7f\x1d\xa8\xfd\x64\xe5\xc2\xbc\x57\xdb\x68\x27\x34\x16\xa9\xe0\x4a\x83\x96\x5f\xc8\xd7\x5e\x4f\x1d\x25\xf7\xd4\x82\x49\xc7\xce\x65\xe9\x86\xce\x1e\x43\xdd\xda\xdc\x83\x6d\x9b\x4a\x1c\x64\x57\x6a\x6d\x76\x17\x8b\x00\x63\xa2\xb3\xa9\xb9\x22\x2a\xd6\x00\xd0\x49\x2b\xaa\x08\x19\x94\x4a\xa9\x03\x7d\x88\xe9\x73\x8f\x8d\x45\x32\x11\x68\x8c\xf4\x0a\xc5\xbf\x33\x88\x1d\x03\x10\x1f\x9e\xe2\x87\xa1\x12\x6a\xe0\x7c\x8a\x45\x51\xaa\x94\xe0\xef\x0b\x3f\x70\x34\x38\x7a\x3e\x50\xfb\xc9\x5b\x72\x9f\xee\x5f\x97\xba\x01\xf9\xe0\x25\xd0\x99\x88\x98\x0d\x85\xd7\x74\x3f\xb9\x84\xb4\x98\xe8\x1e\x40\xef\x74\xab\xc6\x93\xdf\x45\x07\x8e\xd4\xfe\x35\x7a\x62\x4f\x20\xf8\x24\xb7\x0e\xb9\x68\x21\x2a\x75\xe0\x0e\x33\x55\xd9\x8d\xb2\x9b\x0a\x69\xd4\xfc\x7e\xc5\xa2\x9b\x71\x9b\x3f\xe4\x09\xc8\xa8\x50\x26\x64\xf2\xce\x8c\x23\x5a\x26\xbd\x82\x24\xde\xb5\x23\x38\x7e\xa0\xe1\xa7\xaf\xc7\x23\xcc\xe7\x1e\xce\x1a\x41\x33\x83\x8f\x19\x44\x46\x63\xc5\xc8\xfc\x7d\x37\x9e\xfc\xce\x03\xa2\xfb\xba\x28\x8b\x99\xad\xd4\xef\xba\x2c\xcd\x96\x23\x70\x5a\x9d\xe8\xb2\x98\xdb\xba\x2a\xb4\x62\x50\x24\x82\xfc\x9a\x85\xb2\xf3\x39\x80\x18\x74\xa3\x8e\x7f\xf9\xe5\x58\x4d\x7c\xb7\xdf\x17\x65\xa9\xc6\x56\xe7\x99\x9a\x40\x7d\xbd\xa3\xa3\x9f\x32\x75\x61\xaa\xd2\xaa\x6b\x5d\x7f\xca\xd4\xc9\x50\xfd\xfa\xf2\xf9\xf1\x4f\xcf\x7e\x7e\x7e\x7c\x2c\xfa\xe5\x2f\x35\xb1\x62\xfb\x8f\x56\xf3\x48\x4f\xd2\xc3\x65\x3d\xe4\x12\x7c\xb5\xf2\x1c\x7f\xb4\x2a\x47\xeb\x1a\xcc\x14\x55\x1c\x41\xe4\x7c\xca\x69\x40\xc5\x09\x0b\x8d\xcd\xea\xba\x00\xd7\x8d\xbe\xf3\x5d\x6e\x1e\x11\x45\x44\x3e\x6b\xca\x12\x4a\x7e\x56\x99\xf0\x4b\xb4\x6e\x19\x9c\x52\xa1\x6d\xfc\xe0\x38\x69\x00\x00\xde\xf2\x2c\x11\x3f\x1a\x24\xbe\xfb\x4e\x51\xed\x20\xff\xc9\x7a\xb6\x28\xee\x35\x54\xc5\x48\x2b\x45\x98\xa4\xd8\x43\x6e\xf8\xbd\xc0\xc4\xf9\x0c\xdf\xc5\xba\x93\xd1\x9b\xb2\x29\x72\xe3\x6f\x8c\xd0\xef\x39\x10\x59\x91\xd7\x4f\x6c\x1f\xaf\x5f\x7c\xb4\xeb\x78\x4e\x45\xed\x4e\x9a\x60\x28\xf2\x47\xba\x23\x65\xfd\x01\x4a\x48\x64\xfe\x72\xe1\x82\xe5\xaa\xdc\xf2\x71\x95\x97\x13\xdf\xad\x2d\x40\x3d\xd6\x5b\x58\xc3\x05\x91\xd4\x72\x97\xa0\x7b\xe7\xd6\x6d\xf2\x1d\xf5\xca\xeb\xb9\x6f\x81\x4f\x2d\x74\x0e\xb2\x01\x70\x2c\xd1\x5b\x54\x6d\xb9\xe7\xb1\x00\x55\x6d\x4b\xae\xca\x09\xff\x51\x82\x0e\x80\xe4\x74\x2e\x94\x0d\x5a\x2e\x11\x86\x0c\x5b\x13\xc6\xf3\xd1\xae\xf1\xa3\x94\xc6\x13\x95\x85\xb8\xc7\x33\xb5\x4f\xef\xf0\x8c\xfa\xcb\x06\x0e\xa3\xdd\xf8\x79\xc2\x34\x31\x99\x32\x96\x61\xfd\x03\xe6\xa2\x21\xc6\x25\x5c\xdf\xa5\xae\x34\x27\x28\x32\xf7\x20\x0c\x27\x6a\x11\x53\x2e\x1d\x3f\x4b\x73\x09\x11\x05\x33\x3d\x04\x09\x5b\xbb\x45\xb1\xc2\xdb\x71\xde\x80\xb3\x77\xe6\xdb\x3c\xf8\xe9\xf9\xff\x3a\x54\x0c\x13\x61\xc4\xd6\xba\x81\x38\x17\x6c\xa9\x85\xae\xd1\x48\xc0\x72\x7f\x58\x4c\x4c\x36\x28\xfa\xc4\x55\x33\xe4\x9e\x6f\xa9\x51\xc7\x7e\xdd\xde\x81\x72\x03\x97\xac\xbf\x3c\xfc\xff\x24\x5e\x6a\x87\x49\xa3\x5e\xc9\x2b\x73\xbf\x91\xb3\x24\x6b\x2f\x83\xc2\x7f\x04\xcb\xba\x37\xb1\xf2\x69\xe2\x6b\xe5\x0c\x52\x80\x9d\x1b\xe0\xcd\xf6\x3b\x3a\x24\x77\xe1\xed\xd0\x52\x0a\xd8\xa3\xcc\x44\x2b\x26\xba\x95\xd1\x5e\xea\x92\xfa\xfa\x3d\x4d\xcc\x5c\x19\x33\xee\x48\x47\x73\x1f\xb1\x6e\x2a\x72\x0e\x7a\x54\xd5\xc3\x4e\x38\xb4\xa5\x4a\xfb\x93\x23\x79\xdd\x85\x96\x0c\xd8\xb4\x54\xe7\xc0\x3d\x9d\x5c\xcc\x21\x09\x2e\xe8\xbf\x78\x0b\x70\x5d\x4c\x72\x8d\x53\xbd\xc8\x96\xd9\x46\x29\x4f\x59\xcc\x22\xcb\x70\xe2\x38\xd9\x2c\x83\x97\xa9\xf8\x10\x24\x87\x00\x0d\xae\x2e\xa3\xe3\x3d\x72\x16\xf8\xe9\xb3\x31\x8f\xe9\x09\xb3\x13\xb7\xd3\xf1\x40\x0a\x5f\xdc\x5a\x94\xcb\x2d\x7f\xff\x3f\x6a\x7b\xa5\xf6\x1a\xb6\x8c\x55\xaf\xd7\xad\x69\xe9\xdf\x7a\x9c\xbd\x02\xd0\x82\x75\x15\xeb\x66\x6b\x07\x25\x96\x23\x37\x4b\x6b\x53\xea\x1e\x23\xec\x9b\xee\xd2\xac\xb5\x4d\x1f\xf0\x0d\xc8\x61\xd3\x00\x75\x69\xab\xc0\x95\x06\xf9\x71\xd1\xa4\x25\x36\x5f\xa7\x7a\x5c\x1c\xe9\xb4\xb1\x0c\x14\x6f\x1f\x8a\x13\x02\x0b\x8e\x87\xa1\x7d\x10\xc4\xe1\x79\xe0\x4c\xfc\xa6\x0e\x8a\xc3\xa7\x8e\xac\x77\x41\x11\xac\x7a\x50\x14\x87\x7d\x96\xfb\x13\x5b\xfe\x73\x13\xc2\x24\xfd\x89\xcb\xe5\x2a\xa6\x82\xf3\x81\x7e\xe1\xef\x87\x61\x9a\x21\x2a\x19\x2a\x5a\xbd\xc5\x3b\x1d\xa0\xcc\x78\x7e\x2c\x41\x6a\xc3\xaf\x83\x6b\x0b\xd2\x88\x9e\x64\xf2\x3f\x12\x80\x0c\x24\xe7\x5e\xf6\xb4\x55\x3c\xa1\xc4\xa4\x27\xa1\xa7\x46\x25\x44\x69\x1e\xa9\x20\xf4\x24\x0d\xa9\x65\xa0\x09\x1d\x09\x05\xf0\xc7\x36\x39\xe4\x8e\xe2\x5c\xc8\x8e\x09\x95\x35\x24\x1a\x54\x8e\xef\x63\xca\x0e\x95\x70\x48\xe0\xf6\xf6\x47\x29\x92\x49\xd0\xa0\xd0\x02\xeb\x9b\x28\xe4\x8d\x2a\x1b\x28\xe9\x1b\x49\x27\x1c\xab\xbe\x7e\x23\x78\xf5\x75\xd7\xd8\xc9\x1b\x25\x89\x29\x48\x2f\xf5\x9b\x1f\x26\x44\x50\xb1\x70\x77\x23\xbd\x59\xf0\x01\xe8\x32\x78\x42\x22\xd5\x1d\x74\x22\x3e\x40\x2d\xe7\xc6\x5b\x30\x53\x22\xe8\xa3\xd9\x7e\x31\xf8\x29\x6e\xe2\xe3\x81\x1a\xa2\xe6\x8d\x64\x6e\x76\x9e\xf8\xe1\xc0\x07\x90\xb8\x27\xbe\x64\x23\x73\xf4\xb5\x15\x30\x2d\x12\x5f\xdf\x4e\x8e\xfd\x64\xf6\xa2\xa4\x6f\x98\xde\x68\x69\xf2\x42\x53\x51\xa8\x96\xc1\x25\xf3\x18\xef\xfd\x43\x95\x7a\xd4\x9b\x4a\x21\x4f\x8b\xf8\x75\x08\x9b\x63\x22\x22\xce\xfe\xae\x2f\x84\x61\xa1\xec\x2a\xe6\xed\xd1\x3e\xf5\xfb\x19\x4e\x17\x11\xff\xa4\xe6\x50\x04\xea\x6f\x4c\x79\x6f\xd4\xc1\xd1\xf1\xa1\x5a\xda\xaa\x59\x38\x85\x9e\x88\x86\xcb\x8a\x01\x1c\x0e\x5c\x73\xc0\x2e\x39\x03\xd0\x3d\x37\x86\xda\x18\x37\xe6\x8a\xcf\xea\xe0\x55\xab\x21\x2d\x6b\x44\x24\x7b\x39\x75\x5b\x27\x9b\xe2\x01\x04\x20\x08\xd8\xb8\xe9\x23\xcd\x4a\x97\x62\xc5\xad\xeb\x40\xe0\xd7\x3e\xce\xdc\x13\xae\x86\x15\xbf\x01\xc0\x75\x22\x33\x7d\x7c\x91\x21\x7c\x5f\x80\x3f\x80\x7d\xf7\x42\x45\x8a\xe7\xc2\xdf\x00\x06\xcd\xff\xde\xe0\x42\xbb\x4c\x9b\xb7\x20\x53\x39\x1a\x0e\xc5\x36\x3d\x14\x0c\xf6\x06\xe3\x1a\x5c\x6b\x7c\x9a\xf9\x1c\x33\xc3\xe8\x47\xde\x7e\xfe\x15\x3c\x6c\x30\x37\xe9\x77\x1e\x28\x2a\xd7\x27\x4f\x23\x8b\x19\x10\xc8\x63\x69\x04\x9e\xf1\x96\x23\x92\x0b\x52\x65\x3b\x08\x44\x88\x02\x2b\x55\x83\x25\x1a\xc0\xdb\x4b\xe8\x1f\x89\x49\xf1\x26\xe4\x74\xf8\xbf\x16\x55\x30\x3b\xc5\x72\xe3\x6d\xe0\x35\x2d\x72\x89\x71\xae\x49\xf5\xc8\x61\xaf\x4d\xd9\x83\xf5\x29\xa4\xd8\x62\x99\x28\xa8\x02\xc0\x1a\x95\xa6\x62\xc7\xf9\x14\x37\xc6\xcb\x81\x3a\x93\x7a\xf4\x35\xeb\xd1\x17\x50\x5d\x5b\xfa\x50\xfd\xc3\x47\x00\xb3\xa8\x73\x75\x0d\x2a\x38\xea\x8a\x90\x90\xfc\x91\x73\xb6\x19\x25\x42\xab\xab\x49\x5b\x67\x48\x7c\xb5\x43\x6f\x67\x8c\xbc\x3c\x94\xcc\xe5\xae\x51\x96\xd7\xe8\x63\x3a\x20\x42\x2e\x20\xec\xfc\x2f\x9d\x64\x4a\x45\x11\x7b\xd8\xc3\xcd\xac\x55\x63\x3e\x13\xbd\x7b\x60\xbb\xeb\xa5\xe4\x84\x1b\xb2\x68\xa0\x1a\xf5\xf9\xe8\xdd\xf0\x7c\x9f\xa6\x9c\xa7\x9b\xe2\x6c\x50\xb5\x2a\x00\x31\x61\xa0\xe4\xd3\x8b\x7f\x2e\x2a\xe5\xd6\x73\x6f\xc2\xfb\xcd\xc9\x89\xfa\x38\x37\x91\xac\x0a\xb0\xa9\x7e\xee\x08\xe2\x14\x72\x28\x42\xba\x37\x22\xc4\x50\x02\xc5\x49\x46\x31\x87\x67\xeb\x93\xc1\x04\xb9\x64\xdf\x47\xd1\xa2\x77\xde\xa0\xc7\x78\x43\x23\xb0\xc9\x1f\xa9\x95\x3f\x1c\x92\xe1\xca\xcf\x01\xf1\xe2\x27\x58\xa7\xf0\x61\x21\x25\x85\x43\xb9\xca\xa9\xd1\xc6\x3f\x43\x1c\x20\x8d\x59\x39\x75\x80\xfc\x90\x88\x67\x41\xdc\x32\x1f\x2f\xe9\x78\x5b\x6a\x44\x31\x97\x85\x43\xac\x50\x65\x36\xee\xae\xb6\xeb\x95\x3b\x4c\x6a\xc7\xe9\xd2\xef\x19\xe2\x8a\xc2\xa4\x94\x2e\x81\x50\xde\xe3\x87\x85\x95\xa8\xcc\x46\xcc\x69\x90\xff\x38\xe5\x44\x4e\xd1\x84\x0a\x8a\xf0\x0a\x0b\xfe\x56\xb4\xf4\x23\x70\x98\x31\x63\x03\x96\x5f\x8c\x14\x83\x90\x1b\x62\x05\xf5\x75\x9c\xd8\x0c\xf3\x58\x52\x3d\xdb\x7f\x00\x93\xa9\x02\x09\x08\x05\x88\x1d\xd2\x5e\x53\xc8\x6b\x4a\x2c\x26\xf0\x6c\x18\x88\xb7\xa8\x13\x93\x19\x88\x7a\x2b\x3a\x8c\xea\x20\xca\xb1\xe9\x1a\xc0\x5b\x92\x6f\xeb\x21\xf3\xfa\x10\x25\x13\x51\xbf\x74\xfb\x3d\xe8\x99\x86\xee\x3e\x22\x57\x61\xa0\xde\xa6\x6c\xa9\x40\xd5\x10\x35\x4d\xdb\x26\x46\x93\x1e\xef\x08\x11\x23\x73\xb7\xa7\x3f\xa9\x14\x6b\xf9\x2e\x86\xd7\x67\x41\x86\xd5\x9d\x4b\xa3\xbf\xc0\x27\x90\x3b\x47\x5f\x3b\x6b\xfb\x76\x53\x85\xc0\xbe\x2d\x03\x4c\x9e\xd8\x2f\xea\xa4\xdc\x61\x48\x36\x82\xd9\x66\x2a\x21\x9c\xab\xe1\xf5\x59\x52\xca\xcc\x59\x01\x10\x07\x54\x5e\x8c\x21\x75\x76\x52\x94\xee\x3f\x0d\xd4\x98\xc9\x14\x2f\x19\x73\x18\x6e\xd1\x7c\x8d\xc3\xc2\xbb\x23\xde\x49\xa3\xcf\x40\x62\xa8\x86\x21\x6e\x0c\x0b\xd6\xb5\x4a\xb2\x2e\x73\x16\x5d\x70\x2d\x70\x2a\x19\x0b\xc9\xab\x98\x7e\x99\x5c\x61\x3d\xc6\x84\xdc\x67\xe9\x15\xc6\x97\x0e\xbb\x59\x80\xee\x9e\x1c\xaa\x72\x0d\x21\xe0\xc5\xf6\x87\xce\x73\xdc\x1e\x98\xbd\xe9\xd2\xd3\xcb\xa7\x89\xa6\x22\x11\x96\x61\x52\xb0\x0a\x66\xe0\xbf\x0a\xa9\xc3\x8d\x55\xab\x75\x83\xe2\x59\xdc\xef\xf2\x3e\x4b\xcc\x04\x50\x95\xd6\x06\xc3\x3d\x2e\x06\x6c\xdb\x45\x5e\x79\xdd\x3b\x0d\x97\x96\xb6\x64\x10\xa5\x1a\x2c\xd2\x7b\xed\xaf\x19\xd0\x69\x6c\xbd\x85\x0f\x1d\xd2\x6c\x6b\xe2\x7d\x67\x7a\xb3\xb2\xf8\x64\x10\xb1\x58\x5a\x8b\xc4\x1d\x44\xdb\x8b\x1f\x12\xa5\xca\x90\xbc\xa4\xb1\x4c\xb8\x4e\x08\xdd\x76\xd1\xe8\x2c\x24\x5a\x66\x9c\x8c\x91\x41\x35\xcf\x65\x45\x77\x78\x59\x04\xe3\x4c\x10\xd9\x35\x36\x59\xc0\xb8\x13\x3a\x16\x7d\x8f\x55\x89\xa9\xd4\x60\xd6\xdb\x0a\x4f\xb1\x3f\x88\x53\xb3\xd0\xe5\x1c\xbb\x0a\x76\x32\xff\x8a\xb5\x35\x0a\x7f\x4b\xc8\x4a\x3c\x1d\x70\xab\x15\x8d\xd2\x53\x67\xcb\x35\x94\x05\x47\x76\x29\xac\x86\xc4\xdc\x63\x7f\x64\xb8\xc0\x4a\x0c\x81\x32\x50\x2b\xe1\x26\x29\x6d\x65\xa2\xd7\x80\xdc\xa6\x40\x56\x48\x34\x6a\xbe\xc9\x79\xd4\x41\xd1\x5d\x20\x37\x2f\x67\xb1\xc4\x2f\x16\xd5\x6c\x5d\xd7\x51\x77\xe5\xe5\x95\x6f\xd1\xb6\x71\xeb\xb2\x91\x79\xd6\x8f\x0f\x07\x0d\x5b\x10\x7a\x7e\x28\x51\xe8\xbc\x6a\x79\x9b\xba\x01\x44\x76\x5f\x09\x2e\x4c\xe1\x49\xed\xa0\x6b\xda\x6f\x63\x4c\x95\x6a\xe6\x37\x8b\x56\x29\x5b\x51\x8d\xe6\xc5\xe0\xe8\xd9\x8b\xc1\x4f\xa8\x97\xa2\x41\x67\x9a\x58\x7d\x30\xf9\x50\xc6\xf6\xee\x47\xa0\x4d\xed\xda\x17\x0c\xfe\x96\x75\xb1\x77\x99\x75\xbd\x01\xdf\x42\x9a\x79\x8f\x38\x08\x92\xf0\x2f\x09\xa2\x60\xba\x2d\xec\x86\xca\xef\xb3\x04\x85\x01\xce\xd7\xe5\xbc\xc0\x82\x6e\x50\xbd\x27\x1e\xae\x64\x4a\xc8\x79\x46\xc3\x61\x9f\x46\x5a\x11\x3f\x01\xb6\x3f\xd1\x5e\xc9\x76\x58\x2b\x54\x3e\x55\x37\x90\xcd\xdc\x6f\xbb\x3c\x22\xf8\xbb\xf6\x4b\xdf\xbe\x01\x8b\x79\x97\x2d\xd5\x76\x0b\x12\xbf\x62\x54\x32\xe8\xf6\xe7\xfa\x3a\x54\x8c\x44\x6f\x83\x75\x8b\xeb\x14\x02\xdc\x8c\x55\x91\x6b\x96\x12\x8a\xb3\x82\x88\x0e\x6e\x66\x59\x0d\x76\x47\xbf\x63\x28\x29\x77\x53\x8a\x7c\xf2\x87\x46\x17\xc1\xee\x44\x4b\xed\x05\xba\xd7\xe4\x90\x81\x95\x1d\x2a\x61\x96\x7f\x70\x3c\xcb\x21\x2d\xa4\xbb\x87\x03\x16\x87\x1e\x75\x78\x74\x9a\x05\xbe\xd4\xe2\x33\xfd\xd8\x2d\x86\xbc\xab\xb7\x3c\xf5\x71\x2a\x79\x9c\x4f\x92\xbd\x8d\xf0\x6f\x92\x4d\x86\x2c\x68\x9d\x05\x81\xd9\xef\x97\xb3\x90\x04\xb8\x7d\xf0\x12\xf8\xa7\x89\xe0\x70\xb5\xec\x94\xb0\x3f\x0f\x64\x40\x47\x48\x51\x72\xab\x24\xf1\x1e\x8c\x53\x2f\xa7\x08\x9d\x4a\x4f\x81\x88\x28\x7d\x19\x3a\xaf\xb7\x6a\xa9\xf8\x26\x42\xc3\xb0\xc6\x00\x65\x6e\x44\x82\x3f\x4d\x14\x7f\xe9\x72\x53\xb9\xfa\xae\x34\xef\x2c\x69\x14\x74\x7c\x30\xba\xce\x0d\xf0\x6b\x84\xab\xca\xaa\x13\x40\x48\xa8\x53\x54\xb8\x26\x8d\x6e\xd6\xe8\xec\x1d\x9b\xbb\x75\x19\xe9\xd5\x82\x6e\x07\xbe\xf4\xe8\xce\xfb\x88\x04\xa6\x08\xb4\x10\x64\xfd\x20\xe8\xfb\xa7\x08\x1e\xaa\xa1\x7c\x1f\x9c\x48\x67\x97\x86\x28\x91\xfb\x2f\x08\xd2\x06\x5d\xec\x5c\x1d\x3a\x87\x4a\x21\xcf\xd8\x6f\xe0\x65\x92\x9d\xd9\xbd\x52\x0f\x83\x22\x5f\x07\xd7\x54\xe2\x48\x8a\x61\x17\x17\xdc\x1b\x33\xb4\x96\xcd\x56\x69\x20\x6c\x21\x2a\x43\x79\x39\xf1\x6d\x22\xef\x8f\x96\xd9\xb7\xc3\x03\xf1\x12\x3e\xd3\x79\x3f\xc0\x59\xa4\x67\xc6\xf5\x98\x22\x03\x35\x42\x23\x9b\x4b\x99\xd3\x30\x13\x42\xf6\xde\x99\xcd\x70\x53\xf6\x0d\x23\xba\x6d\xa0\xd4\xa1\xb7\x4e\x69\xd3\x49\xcf\x8d\x9d\x47\xae\x1d\xf7\xa9\x28\x4b\xa6\x1b\x25\xab\x40\x24\x30\x13\xeb\xf9\x4f\x03\x75\x53\xeb\xdc\x2c\x75\xfd\x49\xdd\x3a\x1d\x71\x41\x3f\x41\x18\x2e\xbf\x37\x75\x83\x58\x9f\x0b\xae\x9a\x33\x50\xc3\xb2\x54\x5a\xfc\x29\x16\xd4\x01\x6f\xab\x85\xf3\x3d\x37\x40\x02\x01\xae\x12\x41\x51\xda\x8a\x89\x81\xf5\x87\xc1\xed\x56\x76\x5c\xcc\xf2\x82\x03\xf8\x9b\xda\x87\xb4\x2a\xce\xbe\x0a\x46\x7b\x1b\x69\x4d\x12\x6e\x27\x36\x6f\x3f\x0c\xf0\x78\xa0\x46\x55\x6e\x6b\x87\x27\x9c\xb4\x11\xa0\xb4\xd8\x87\xf7\xb3\x7d\xfa\x47\xbb\xa1\x7d\x64\x8c\x44\x2c\xa0\x1f\x02\xa5\x72\x33\x9c\xcd\x60\xb3\x88\xd7\xb4\x4b\xdb\x98\xbe\x98\x29\x4c\x8d\x14\x9f\x49\xc1\x4c\xc4\xc5\x33\x9b\xa8\xc8\xfd\x43\x93\x21\xae\xd3\x8b\x81\xba\xa6\x49\xb9\xf4\x9d\x1f\xf4\x7f\xcb\xf7\x38\xf9\x18\x07\xed\xbc\xce\x85\xc5\x6a\x71\xb0\xfb\xaa\x02\xd8\x51\xa8\x74\x15\xff\x80\xf5\xbd\xe9\x2c\x15\x35\x4d\xd6\x97\xf6\xfa\xd5\x40\xcc\x40\x42\xdb\xc3\x83\x02\x6c\xd7\xa5\xd9\x08\xf5\xdc\x5f\x59\x5f\xcc\x88\xba\x93\xfa\x34\x61\x1d\x0d\xbc\x8b\x4f\xa2\x1e\x0d\x5d\xf4\xdb\x07\xc4\x8f\xff\x5e\xda\x59\xa8\x49\x9e\xee\xf4\xe0\xc9\x8b\x24\x47\xac\x7e\x08\xbb\xbc\xa5\xb6\x07\x7d\x2e\x78\x0d\xca\x0d\x96\xff\xab\x9a\xa2\x42\x21\x4d\x54\x0d\xbd\x6a\x7c\x24\x1e\x1d\x88\x26\x9c\x15\x46\xb4\x7f\x1d\xc4\x4e\x9f\x56\x9a\x34\x87\xda\x40\x7f\x08\x2b\x4e\x76\xc2\xe1\x04\xd8\xae\x4b\x32\xa8\x63\x42\x02\xa0\xbd\x74\x0b\x39\x2f\x7c\xbc\x44\xa8\x1a\x43\xbf\x6d\x97\x4b\x70\xb5\xf4\xd4\x1c\xa1\x72\x45\xa7\x81\x60\xc7\xf7\xf0\x03\x19\x93\xf0\xd7\x77\x57\xbf\x8f\xc6\x97\xa3\x53\x75\x72\x75\x9a\x26\x28\xde\x5e\x9e\x8e\x80\xb9\x2e\x70\x57\xaa\x2b\xc8\xd3\x63\xe2\xc7\x37\xc3\xc9\xd9\xe4\xd1\xfc\xc5\x27\xf2\x3f\x72\x2b\x90\xc9\x08\x7c\x07\x99\x4c\x63\xbc\x79\x3f\xbc\x81\x0c\xbd\x4e\x7f\x99\x4e\x13\x59\x17\x27\x99\x48\x77\x3c\x1f\x41\xae\xe3\xee\x3c\xc7\xab\xb1\xba\xbc\xba\x7c\x46\x79\x8e\x67\x97\xef\xfe\x04\x47\x64\xa7\x63\x1d\xa6\x48\x20\x38\x4c\x9e\x6a\xf1\x45\x62\x1e\xe4\x47\x35\x1e\x4d\xae\x47\x27\x37\x48\x1f\x79\x70\x79\x75\x03\x9b\x24\x61\x67\x84\x0c\xc9\xb3\x37\xb7\x37\x57\xe3\xc3\x5e\x86\xc9\xcb\x8f\x5f\xc0\x30\x89\xab\x7c\x7a\x36\x81\x9c\xcd\xd1\xd8\xb7\x10\x96\xf3\xe4\xea\x72\x72\x73\x76\x73\x7b\x33\x9a\xf8\xd5\xf7\xab\x88\xf4\x8b\x7e\x42\x71\xf4\x71\x8b\x0c\xd4\x25\x12\x2d\x52\x1f\x3a\xb3\x82\xf9\xa2\x67\xff\xd7\xe8\x54\xbd\x1f\x8d\x47\xb8\xc9\x88\xb1\x54\xec\xb8\xd8\x17\xae\x2d\x74\x43\xe5\x6c\x44\xb1\xbe\x5f\x28\xf0\xd5\xb6\xd3\x7a\x8b\x6f\xe0\xe9\x00\xf1\x16\x4b\xf6\xa4\xb5\x48\xc8\xcd\x30\x27\xca\xe6\x44\x91\x83\x53\x88\x39\x24\xf0\x95\xf0\x90\xd7\x8f\x41\x66\x4c\x6b\x70\xca\xfa\xc7\x8b\x4a\xbd\x78\xae\x72\x2f\x9d\xec\x5c\x4d\xcd\xcc\x82\x63\x5a\x6f\x74\x84\x95\xe2\xe3\xa8\x3f\x44\xfc\x9a\xeb\x35\xac\x85\xa7\x1a\x5d\xfe\x65\x20\x30\xa0\x40\x8e\x5b\xd7\xf7\xc5\x7d\x04\x99\x14\xad\xf4\xe4\x60\x14\x5e\x7b\x63\xd8\x45\xb4\x50\x46\x06\x05\x5c\x60\xe8\xe8\x94\x08\x81\xa2\x22\x1e\x40\x35\x35\x5b\x4b\xb3\xfb\xc0\x07\xd2\xee\xc4\x85\x3a\x0e\xe6\x28\xe2\x06\x80\x13\xb9\x5b\x75\xa4\x2c\x1a\x76\xc6\x31\x34\x9d\x8d\xc1\x14\xd7\x45\xbf\x6d\x81\xcd\xc3\x4b\x10\xac\x83\xb5\x04\x36\x42\x30\x6f\x02\x53\x7d\xc8\x02\x00\x62\x64\xb5\x7f\x0d\x57\x4e\xb1\xd2\x55\xb3\x7f\x88\xa5\x51\xd8\x95\xd4\x02\x2c\x42\x43\xe2\xf1\x1f\x5c\x17\x2e\xdf\x87\x07\xdb\x51\x19\x83\x87\x2e\xd3\x41\xb8\x08\x88\x48\x68\x6a\x6d\x66\x06\x2e\x8a\x7e\x10\x07\x67\xbb\x22\xeb\xf1\xe0\x88\x55\x82\xe3\xc1\x71\xff\x52\x65\x6a\xbd\xb2\x95\x7a\x45\xdb\x95\x2b\xe3\x7a\x2d\x21\xf9\x40\x38\x32\xab\xda\x82\xed\x14\x68\x2e\xb1\x84\xf7\x9c\x37\x3e\xb7\x84\xa1\x46\x88\xf0\xad\x40\x2b\xa0\xa6\x7d\x3f\x11\x67\x83\x48\x3e\xb4\xe4\x8b\x0a\xf4\x24\xf2\x2c\xad\xf4\x36\xf9\xba\x56\xcb\x75\xb3\xc6\xdc\x42\xff\x38\xd6\x36\xe4\x98\x8d\x61\xbc\x2a\x9b\x84\xb5\x5a\x69\x87\x44\xe6\x04\x15\x5b\xef\x82\xd3\xd2\x1e\xea\x07\xfd\xb5\xa7\x19\x21\xe4\x45\x81\x68\xe4\xbc\xd6\x1b\xfc\x9a\xd8\xb5\x18\xc2\x6b\xdb\x98\x3b\xbf\xdb\xb7\x59\x78\x0f\xb7\xbf\x0e\x27\xa8\x35\xc9\x61\x5a\x33\xb0\x7d\x3a\x13\x82\xb4\x7e\x5b\x38\x5b\x70\xeb\xd3\x39\xe3\x0a\x44\xe9\xb4\xe6\xb8\x17\xc4\x5a\x90\xb3\x81\x4b\x0f\x05\x6e\xbe\xd6\x78\x29\xe8\xc2\xb3\x42\x55\x35\xbb\xfb\xf6\x8b\xb7\xec\xae\x52\x6b\xe4\x89\x33\x9f\x57\x45\x9d\xe4\x5c\xe2\xc4\xf0\x5e\x5b\x99\xba\xb0\xb9\xa8\xa7\x9a\x94\xdc\x23\x98\xad\x64\xa0\xc8\xd4\x42\xd7\x39\xfe\x0b\xd2\x49\xee\xa1\x99\xe0\x40\xc4\x3e\xd3\xac\xa4\x3b\x23\x6a\x74\x7f\x50\x4a\xec\xc2\xbf\x3c\x26\x26\x5a\xd3\x1c\xfb\xd8\x91\x12\xdd\xb9\xc6\xf1\xe7\x7e\xae\xe1\x9f\x10\xe3\xb9\xb7\x9f\x4c\x1e\xe9\x5f\xa1\x98\xf2\x3c\xa2\x7f\x50\xac\xd6\xe0\x20\x22\xa0\x7b\x9e\x29\x67\xcb\x5c\x92\xcb\xe4\x30\x81\x0b\x9d\xd3\x53\x5f\x70\xec\x40\x55\x97\x1b\x3f\xdc\x22\x2f\xc2\x2d\xa2\x9d\x33\x75\x13\xeb\x1b\x25\xb7\x08\xe1\x3f\xe8\x1c\x25\x82\x44\x0a\xf7\xbf\x42\x9c\x53\x34\x20\xd6\xc3\xa1\x72\x24\xb6\xbc\x37\x79\x0c\x11\x4e\x93\xb8\xba\x33\x4d\x83\x61\xe7\x43\xb2\x21\x49\x86\xd0\xdd\xf9\x40\xd9\xae\x78\x34\x45\xad\x25\x21\x18\xee\x75\xb9\x0e\xa2\x30\xe8\x1c\x0f\x5d\x2d\x3d\x07\x94\x0e\x67\x20\xdc\x69\xf4\x27\xa8\xf1\x81\x85\x01\xed\x1a\x3a\xa5\x72\x83\xe7\x35\x00\x47\x97\xf0\x17\x5b\xc7\x4e\xe0\x3c\x6d\xb9\xee\x57\x99\x1a\xbe\xbf\x20\x0c\x4a\x20\x3c\x7c\xbf\x85\xee\xd1\xea\xda\x2f\xd8\xb5\x5f\x06\xc7\x5c\x17\xda\xf7\xcf\x54\x39\x86\x57\x43\x86\x00\x97\x1a\x73\xea\x20\xd6\x51\x09\x3b\xd7\xd6\x8e\x88\xf9\x9c\x29\x4b\x53\xbb\x43\xd2\xbe\x62\xb8\x0a\xaa\x1d\x09\x15\x8c\x9c\xd8\x4c\x99\x13\x5b\x12\x8a\x67\x5c\x47\x31\x80\x54\x77\x6b\x5a\x1a\xee\xaf\x03\x75\x1e\x71\xd6\x80\xfc\x26\xd7\x29\xfc\x19\xb5\xe5\xcb\x2b\x75\x72\x36\x3e\xb9\xbd\x98\xdc\x78\x6b\x04\x69\xbb\xc3\x9f\xd0\xc3\x77\xf3\x7e\x74\x35\x16\x74\x2b\x40\xaa\x22\xd8\xcf\x2f\x47\xef\xce\xcf\xde\x8d\x2e\x4f\x46\x87\x99\xe0\x5e\x49\x69\x57\x90\xf2\x65\x3c\xf9\x3d\x23\xf6\xf8\x60\x80\x04\xe2\xf8\x40\x0a\x7f\x05\x16\x44\xa2\xfb\x87\x87\x26\xb7\xd7\xde\xfa\x1b\xb3\x85\xc0\x24\xe4\x44\x8e\xde\xc3\x17\x9f\xd2\xd2\x8f\xc6\x93\xab\xcb\x40\x32\x73\x7a\x36\x06\x4b\xe9\xec\x92\xff\xd5\xc3\x1c\x9f\xed\xa6\x8e\xa7\x4e\x9c\xbc\x1f\xfa\x31\x03\x15\xcd\x83\x26\x29\xbf\xf7\x96\xf8\xde\x71\x9c\x57\xa7\x1f\xce\xce\xcf\x33\xf5\xe1\x6a\xfc\x9f\x6a\x72\x73\x75\x7d\x3d\x7c\x37\xf2\x53\x79\x71\x7d\xeb\x1b\x0d\x5c\xef\x63\x75\x31\x3c\x7f\x7b\x7b\x79\x82\xad\xd1\x20\xfc\x92\xf9\xc9\x65\xd3\xee\xc2\x9b\xb0\x49\x2f\x99\x5c\xbe\x45\xfd\x8e\x54\xef\xb8\x32\xef\x87\xbf\x8f\x90\xf1\xfd\xec\xd2\xdb\xa6\x4f\xa4\x7c\x27\xe3\x8d\x47\xe8\x1f\x08\x04\x3d\xd4\xb2\x37\x40\x87\xd7\xd7\xe7\x40\x4e\x1f\xff\x08\x34\xfe\xa3\xe1\xcd\x7b\xdf\x3d\x5c\x96\xe1\xb9\x3a\xbb\xfc\x8f\xdb\x31\x98\xb0\xb7\xe7\x37\x4c\xd3\x23\x7a\xfb\xc3\x44\x6c\xb7\x56\x55\x8b\x56\x05\x83\xeb\xf1\xd5\xfb\xb3\x37\x67\x37\x13\x7c\x3d\x76\x72\xa0\x26\x57\x17\x23\xf5\x1f\xb7\xe3\xb3\xc9\xe9\x19\xcc\xe5\x44\x9d\x5e\x61\x47\xcf\xcf\xaf\x3e\x50\xa3\x27\xe7\xb7\x13\x18\xd3\xb8\x35\xc2\x27\x14\x15\xc8\xd4\xe4\x0a\xbd\x0e\xb1\x1d\xbf\x4e\xa2\xa1\x8b\xe1\xc7\x74\x6e\xc0\xd8\x4f\x87\x04\x2d\xf8\x35\x16\xbd\x79\x1b\x0b\x17\xbc\xf1\xf6\x3f\x94\xfe\xb8\x51\xbf\x0f\xcf\xcf\x4e\xa9\x64\xc4\xbb\xf1\x68\x84\xef\x4a\xd6\x25\x28\xdd\xe0\x2d\x9f\x1f\xd4\x44\x2c\x04\x9e\x76\x28\xcb\x70\x3e\x0c\x2c\x50\xde\xd6\xf6\xcd\x5c\xf8\x37\xbd\x81\x3d\x3a\x55\x6f\xcf\x7e\xf7\xcd\x5e\xdd\x4e\xfc\x50\x4e\xaf\xce\xcf\x87\xe3\x89\x3a\xf8\xff\xff\x94\x3d\x7f\xfe\xfc\x70\xd0\xef\xc7\xf0\x7d\x3b\xbb\xbc\x19\x5d\x9e\xfa\x16\xae\xc6\x60\xde\xf7\x90\x2d\x81\xcb\xe1\xf6\xe4\x7c\x34\xce\xd4\xf0\xf7\x33\x3a\x30\x17\xc3\xc9\x44\xdd\x8c\x87\x97\x93\x33\x20\x72\xba\x18\x9d\x9e\x9d\x0c\xcf\x79\xad\x6f\x68\x7d\xe2\x01\x3f\xbb\x7c\x3f\x1a\x8f\x2e\x6f\xce\x3f\xaa\xd3\xe1\xe5\xbb\xd1\xf8\xea\x76\x92\x3c\x0d\xd3\x72\x02\x1e\x15\xdc\x65\xbe\x33\xb0\x11\xb3\xf6\x36\xcc\xd4\xc9\xf0\x66\x38\xb9\x19\x5f\x5d\xbf\x3f\x3b\xa1\x69\xc7\x53\x38\x99\xa8\xd3\xd1\xe4\x66\x7c\x4b\x47\xd1\x4f\x48\x6b\xea\x2f\xc9\x77\xe5\x67\xfc\x92\x49\xad\xa2\xd8\x93\xe7\xce\xff\x29\x2e\x08\xfb\x5f\x86\x37\xfe\xd0\x0f\x27\x6a\xc8\x3d\xa5\xbf\xc0\x7e\x26\x2f\x49\x67\xce\x43\x05\xd6\xdb\xc1\x64\x40\x7e\x00\xb8\x21\x47\x55\xae\x6e\x1d\xa3\x7f\x6f\x7a\x91\x0c\x6a\x1f\x6a\x22\xd4\x90\x98\x5a\x34\x66\x99\xed\x43\xed\x4a\x88\x5d\x9b\x7a\xa9\x38\x3b\x17\x23\x3d\x2f\x7f\x51\x27\x83\xb7\x83\xf1\xc0\xdf\xeb\xcf\x8f\xd4\xc1\xd5\xac\x19\xa8\xa3\x5f\x7f\xfd\x09\x4b\x79\x3a\xf4\xfe\xfa\xcb\x47\x36\x3c\xb3\xcb\xd5\xba\x31\xb1\x7e\x10\xc5\x00\x1e\x7a\x24\xc5\x1f\x60\xb7\x44\x3c\x55\xd7\x14\x31\x48\x7a\x75\x74\x3c\x38\x3e\x3a\x56\x07\x13\xb3\xe2\x7e\x81\x47\x9f\x8b\xe7\x81\xa1\xd5\x79\xdc\xf7\x45\x8c\xec\xf8\xe7\xc1\xcf\xc7\xcf\x8f\x9f\x1d\x85\xca\x77\xe1\x57\x2f\xd5\xc1\x7f\xac\x2b\xc3\x23\xf6\xb7\xf1\xce\x59\x67\x1e\x86\xde\x60\x2d\x30\xcc\x01\xae\xb5\x13\x97\x17\xc4\x23\x47\x47\x03\x75\x51\xb8\x99\x29\x4b\x2c\x1e\x1a\x2b\xe9\xc5\xe4\x25\x42\x67\x06\xca\x20\x44\x61\xc6\x02\xa9\x54\x31\x0c\xd2\x91\x29\x05\x73\x09\xa8\x70\x45\x74\x31\xa1\xca\x25\xbb\x7a\x7a\x72\xc8\xb1\xce\x25\x46\xc4\x92\x12\x97\x14\x77\x8b\xef\x06\x2d\x0f\xaa\x21\x2f\x39\x51\x2b\x0d\xe8\x25\xa0\x49\x86\x09\x88\x56\x5b\x6e\xba\xd0\xa6\x8c\x6a\x0b\x8e\x88\x52\x6f\x62\x0f\x50\x4d\xeb\x06\x11\x85\x4b\xbc\xd4\x9b\x48\x31\x4f\xd6\x9a\xa8\x30\x7f\x98\x89\x82\x79\x05\x92\xc2\xcc\xcb\x62\xd6\x3c\xb3\xf3\x67\xe9\xb7\x30\xee\xc5\xf6\xae\x5b\x4f\x97\x58\x9d\x04\xb9\x2e\x75\xa9\xfe\xbe\xae\x0b\x97\x13\xdc\xb5\xa8\x64\xaf\xd1\xdf\x80\xd5\x82\x09\x9f\xc0\xb8\x08\x4c\xdf\xf0\x1a\x2f\xe1\x64\x6b\x0c\x16\xa2\x6e\x28\x52\x0a\xb8\xb8\xef\x30\x2c\x77\x98\xab\x29\xec\xdd\x86\x83\xb7\x6f\x4d\x0e\xd0\x9d\x13\xbb\x16\xb5\xc5\x2e\x2d\x7c\xbf\x22\xac\x17\xc6\x63\x62\x1f\x29\x5b\xf5\xde\x54\x6b\xa3\x90\x9a\xa0\xa8\xd4\x44\x57\x8d\x56\x27\xa5\xae\xb5\x6f\x0e\x70\x66\xf1\x1d\x9c\x92\xd2\x42\x87\x11\xb0\x2c\xf6\x44\x9a\x5e\x33\xb3\xae\x71\x8f\xf1\x94\x60\xe1\x5f\x78\x94\x34\xed\x60\x9e\xe8\xa6\xb1\x75\x65\xb6\xea\x07\xe5\xd4\xdc\x18\xc7\x85\xea\xc1\x4e\x19\xa8\x4b\xdb\xf8\x16\x43\x3e\xbe\xae\xb6\x58\x4c\x9c\x79\xba\x20\xf3\xbf\xde\xd2\xa1\xcb\x42\xa4\xcc\x19\xf3\x49\x15\xd5\xdf\x21\x75\x01\x2a\x3d\x94\x85\x99\xcb\x69\xd7\xec\xc0\xe5\xc3\x12\x97\x80\xe0\x56\x54\xb0\x78\x0e\x87\xd2\xc0\x1e\x94\xbb\x01\xe7\xa9\x53\xce\xd3\xa8\xdb\x0a\x22\xdd\x97\x64\xe6\x9e\xd8\xea\x1e\x23\xc3\xca\x56\x68\x5f\xea\x59\xe3\x02\x6a\xe2\xac\xa2\x3a\x32\xb0\xdf\x26\x1a\x31\xbe\xef\xac\xcd\x81\xc1\x3b\x96\xc3\x8f\x35\x1a\x87\x15\x96\x35\x4f\xb1\x09\x68\xb6\x84\xe3\x10\xf1\x4b\xba\xba\x5b\xeb\xbb\x50\x1c\x9a\xc8\x12\xc2\xa2\x7a\xb9\xdf\xd4\x6b\x93\x07\x13\x1a\x6c\xff\x1a\x3d\x7a\xf8\x58\xc2\xe1\xd9\x5b\xa4\x73\xcc\x5b\x03\xc1\x1e\x7e\x74\x94\x97\x02\x95\x0e\xf1\x44\x17\x15\x80\x4e\x1c\x03\x61\x89\x6a\x24\x49\x55\xd7\x0e\x9c\xed\xcc\x8d\x12\x7d\xf2\x02\xa6\x90\xed\x4c\xf8\xca\xf5\x52\x83\x49\x8e\x27\x6e\x77\x92\x91\xdf\xa5\x0c\x37\x93\x39\x2c\x76\xbe\xbb\xa6\x7f\x96\x56\x3c\x8f\x45\x16\x23\xe5\x6c\x7a\x59\xc4\x5c\xbf\x98\x2c\x87\x16\x3a\x1c\x49\x47\xb5\xd6\x29\x2b\x02\xbc\xb0\xd8\x17\x94\xf6\xb3\x05\xf5\x85\x98\x04\x08\x7f\x4f\xe0\xe2\xb9\x9e\x79\xeb\x95\x92\xdf\x18\x20\x85\xd4\x60\x00\xd8\x00\x8f\x8e\x49\x2a\x89\x0b\xb0\x50\x9d\x2e\x18\xa6\xbb\x9b\x7f\xac\x0b\x04\x8b\x11\x9b\xfe\xe8\x6f\xa0\x93\xab\xe1\xde\xfe\x4d\x8b\x11\x0a\x66\x06\x1c\xee\xc0\x13\x9f\x32\xfd\x3e\xc6\xe7\xa7\x04\x9f\x1f\x11\x26\x33\x3b\xd7\xe1\xeb\xa4\x04\x36\x12\x83\xf0\xa7\x4c\xdc\x48\x3d\x68\xbe\x10\xf6\xe0\x80\x2f\x65\xeb\xa4\xf5\x5d\x42\xf4\xa8\x51\x8b\xa6\x59\xfd\xf6\xe3\x8f\x9b\xcd\x66\x50\x17\x98\x83\x34\xb0\xf5\xdd\x8f\xe3\xeb\xf3\xbd\x49\x5f\xb1\xdf\x18\x1b\x16\x97\x6b\x9a\xd6\xec\xe7\x91\x63\xa6\xc4\x19\xf0\x70\xcc\x94\xd2\x50\xe9\xa4\x53\x0a\x71\x59\xf8\x93\xce\xe5\x6e\xce\x5b\x18\x44\x72\x71\xce\xe2\xe1\xc6\xab\x55\x10\xd3\xf8\x1d\x23\x01\x44\x9d\x9e\x53\x01\x20\x00\x14\x6d\xb4\x13\x19\x9e\x4f\x44\x93\xa8\x6b\xce\x79\x17\x24\x0b\x0f\x3c\xee\xe7\x32\xe5\xf9\xf6\x7a\xd8\xb3\xa3\x5f\x7f\xfd\x15\xe3\x62\x63\xec\xf9\x18\xea\x3c\x9a\x7c\xb0\x27\x04\xc3\x81\x3b\xfc\x4d\xfd\x9f\x27\xfd\x0c\xf6\xbf\xd3\xb9\xfe\xbb\xfd\x0c\x7e\x3c\x39\x79\xf6\xe6\xe3\xb3\xc9\xf0\xd9\xf1\xe0\xf9\xb7\xa1\x81\x7d\x98\xff\xf5\xc5\x8b\x97\xaf\x8e\xdb\xfc\xff\x2f\x5e\x7c\xe7\xff\xff\x4b\x7e\x4e\x20\xa1\xee\xde\x0b\x88\xe5\xd2\x8b\x94\x61\x13\x90\x86\xcf\x26\x0b\x5d\x9b\x61\x59\x7c\x32\xea\x78\xf0\x5c\x9d\x8c\x47\x43\xc0\x4f\x9c\x5c\x5d\x5c\x5c\x5d\x4e\x92\xaa\x19\xe4\xc1\x18\x82\x4b\xe9\xed\xd9\xf8\x42\xa1\xef\x63\x84\xbf\xe7\xca\xa6\xe8\x29\x45\xa0\xc4\x68\x32\x88\xbe\x4c\x72\xd9\x24\x38\x98\xf0\x36\x7c\x79\x04\xe4\xd5\x37\x37\x57\xe3\xcb\xd1\xc7\x67\x27\xe7\x67\xa3\xcb\x1b\xf4\xc5\x9c\x5d\x5d\x4e\xde\x9f\x5d\x0f\xba\x3d\xa4\xcf\x4e\xb0\x5d\xf4\xd8\x91\x33\x84\x31\x36\xcf\x02\xc6\xa6\xe7\xfd\x8b\xe1\x7f\x8e\x64\xc5\xd8\xb3\xd1\x44\x8d\x47\xef\x86\xe3\x53\xae\xec\x2a\xdb\x64\x4c\x0f\xba\x39\x18\x5b\x31\x69\x3b\xf3\xc8\x2b\xd5\xf2\xdd\x9d\xdd\x4c\xd4\xed\x64\x34\xd8\x63\xe6\x5d\x60\x18\xbf\x1a\xff\xa7\x3a\x18\x4e\xd4\xe9\xe8\x2d\xd6\xba\x1c\x9d\x5f\x7d\x38\xec\x05\x10\x8d\xa8\xa0\x24\xcf\x62\x77\x32\x6e\xdf\x9c\x9f\x9d\x84\xd9\x3d\xd8\x3f\x39\xb9\x3e\xdf\x57\x57\x63\xb5\x4f\xbf\xdb\x27\xe7\x14\x7c\x16\xbf\x71\x33\x3a\xa1\xfa\xb7\xb1\x66\x4a\x52\xbb\xb6\x5d\x16\xd7\xdf\xaf\xc2\xe7\x02\x4d\xe1\x93\x37\xef\xfd\x02\x26\xd8\x94\x3e\xf0\xd3\x58\x7c\xc9\x6f\x26\xec\x07\xa8\x43\xa3\xd3\xc1\xde\x9b\x8f\x6a\xf4\xb7\xd1\xf8\x04\xd9\xc9\x01\xc7\xe3\x1f\x0d\xf8\x21\xf8\x60\x98\x9c\xf7\xa3\x31\xd7\x87\x3d\x01\xf0\x0b\x38\x81\xd1\xf9\x74\xa5\xde\x8c\xd4\x9b\xab\xdb\x4b\x18\x5e\x77\x02\x03\xd6\x06\x0b\x87\xfa\xff\xb8\x1a\xab\x77\x7e\x1f\x4c\xa0\x49\xff\x7b\xfa\xf8\xc9\xd5\x25\x55\x23\xc5\x32\xc3\xe0\xb7\x9b\x9c\x9d\x8e\xc6\xc1\x1b\xfa\xf1\xea\x76\x4c\xbd\x60\x40\x13\x38\xa8\xfa\xca\x80\x0e\xba\x5c\xcb\x14\xad\xd1\xc0\x7f\x0c\xa9\xa9\xfe\xd8\x76\xf9\x69\xc9\xb3\x80\xa5\xe2\x20\x30\x0b\xb5\x81\x80\xcf\xce\xeb\xb3\xcd\xc2\x96\xf6\x0e\xf4\x72\x53\xcd\xb6\x33\x50\x38\xbc\xc9\x1a\x92\x53\xbc\xae\x02\x38\xf6\xa2\x02\x33\xde\x5b\x51\xb5\x01\x38\xbf\xe4\x65\x42\x4e\x28\x51\x91\x4f\x0b\xcd\x9c\x61\xf5\x55\xc4\x2d\xa3\xa7\xab\x29\x1a\x2c\xc1\xe4\x0c\x30\x66\x12\x97\x7f\x95\x9b\x95\xa9\xa0\x2a\x1b\x32\x50\xa1\xf9\xbd\x74\xa6\xbc\x07\x5e\x55\x6f\xb6\x38\x67\x96\xd3\x12\x69\x1e\x2d\x28\x97\x61\x1e\x36\x0b\x5b\x9a\x81\x1a\xa2\x1e\xce\xfc\xa6\xf8\x35\x83\x89\x8e\xc9\x9c\x25\xd5\x90\xc0\x03\x97\x43\xa2\x84\x56\xa7\x91\x0b\x0b\x1e\x3c\xd0\xd1\x95\x37\x35\xa5\xdd\x1c\x06\x6d\xb0\x43\xc8\xd7\x82\x94\x4e\x07\x6a\xbf\xd5\x5c\x8b\x4b\x18\xed\x1a\x80\x03\x84\x59\xb7\x75\xeb\x17\xd1\x06\x59\xd5\xe6\x99\xf9\x4c\xce\x42\x98\x27\xb9\xda\xc0\xe6\xcc\xb0\xee\xe5\xda\xc1\xba\x0b\x38\x42\xe6\x8d\xcb\xa5\x6e\xc8\xe4\xca\xd4\xbc\x60\x82\x01\xfe\xcd\xd2\x62\x9a\x6f\x31\x93\xd4\x3f\x99\x72\x76\x0d\x1e\x84\x19\x60\xbd\xef\xfc\x7a\x34\x81\x4f\x0c\x5f\xd5\xd3\xba\xc0\xea\x18\xb0\xd0\xb9\xa9\x1c\x35\x9a\x10\x59\x43\xfa\x5a\x77\xab\x11\x51\x51\x6d\x66\xda\x35\x19\x11\x53\x83\x1f\x0c\xdf\xcf\xf5\x0a\x82\xdd\xec\xa2\x42\x02\x81\xaf\xbe\xd8\xad\x95\xed\xe2\xba\xde\xd2\x03\xfa\xde\x16\x39\xd2\x0d\xcf\x55\x6e\xd7\xd3\x26\x13\x25\x55\xf1\xf4\x38\x00\xd4\xe0\x32\x78\xab\xc9\xba\x82\x73\xc2\x3a\xf3\x09\xc6\xc5\xb6\x9a\x2d\x6a\x5b\x09\x93\x58\x1e\xc5\xa6\x58\x9a\xfc\x19\x66\x86\x31\x55\x98\x56\x4b\x0b\x24\x9c\x85\x37\xbf\xd5\xc1\x3e\xb4\x51\x54\x77\xfb\x87\x01\x62\xfc\xa7\x06\x4c\x3b\x79\x16\x58\x9c\x23\xb7\x3b\x46\xca\x25\x69\xa7\x24\x7a\x87\xa4\x1d\x17\x07\xf0\x48\xca\x1f\x7f\x28\x97\x4c\xc2\x43\xa8\x13\xfb\xe8\xf7\x36\x0b\x1b\x2c\x21\xfe\x1e\xb7\x67\x06\x6a\x5f\x9e\xbb\x46\xd6\x61\x03\x83\x1b\xf6\x50\x28\x4a\x4b\xa4\x21\x98\x35\xf5\xc4\x3e\xcf\x1f\xe1\x32\x7d\x98\xc3\xb4\x95\x36\xb3\xb0\xe0\x8a\xc1\x02\x6f\x48\xbb\x5c\x6e\xd5\x7d\x61\xcb\x30\xbe\xa7\x25\xdc\xf0\x4c\xc0\xf9\xe1\x66\x83\xcf\x83\x8d\x5e\x81\x96\x0f\x29\x6f\xbc\xd0\x90\x55\x80\x9d\x36\x0f\x74\x39\x37\x6e\x55\x34\x98\x2e\x4a\x3c\xd1\xd8\x5d\x01\x21\xbd\x8b\x2c\xe0\x6a\x84\x98\x0b\x27\x97\x24\xa6\x60\x2c\x8a\xbb\xc5\xb3\xd2\x1b\xc2\x11\x49\xd0\x84\x3a\x01\xda\x29\x07\xfc\xf5\x68\xf4\x86\x9e\xd2\x1d\x02\xf9\xfc\x21\xef\x06\x28\x4c\xda\xf3\xf4\x9b\xd4\x70\x33\x15\x55\x5c\xa6\x11\x7d\xab\x8b\x5a\xdd\x3a\x43\x56\x31\x38\x43\x17\xe4\xc1\xa5\x9a\xb3\xc1\x01\x01\xd5\x67\x08\xb1\x54\x1b\xa4\x56\x04\xdb\x3f\x93\xac\x62\x12\x3e\xc4\x1e\x69\x98\xec\xb9\xff\x14\x30\xf5\x21\xd0\xc7\x81\x13\x92\x09\x1f\xa4\x13\x81\xae\x83\x48\x0f\x49\xcd\x91\x88\x88\xf5\x9b\x80\xf9\x26\x90\xc9\x86\x7a\x83\xe8\xb4\xc4\x76\x53\x87\xbe\x63\x8e\x3c\x5e\x1e\xe2\xb2\x9c\xa4\x7e\x25\x8a\x1e\x01\xdb\x2e\x57\x90\xea\xa6\xed\x86\xf5\xf8\xe3\xc4\x97\x40\x37\xb9\x32\xc0\xbb\x71\xc0\xd2\x29\x5f\xa7\xf0\x33\x31\x84\x30\xc8\xc3\x48\xa2\x2d\xb6\xad\x00\xc8\x15\xf2\x4a\x75\xc8\x98\x44\x57\xfa\x6f\x51\xb9\x82\x95\x24\x9e\x4c\x71\x86\x20\x05\x92\x39\xb5\xa5\x90\xaf\x5a\xb9\xfb\xad\xab\xc7\x05\xae\x80\x6e\xab\x0a\x9c\x3f\xa1\xd1\xb0\x6f\xdb\x4d\xbc\x8e\xea\x44\x24\x8f\x42\x8f\x3e\x37\xd9\x12\xeb\xe1\x95\xd9\xa0\xe5\x7d\x64\x8f\x69\xad\x56\x0b\x5b\x59\xbc\x81\x12\xbe\xcf\x50\x02\x2b\x10\x7f\x8a\xdf\x00\xd0\xb1\xf5\x5b\x7f\x10\xf1\x24\x83\xa3\x3b\x2f\xee\x8a\xc6\x2b\x1e\xeb\xbc\xa0\x7a\x90\x2c\x61\xc4\xac\x85\xf4\xee\xee\x14\xec\x1a\x7e\xfe\x2f\x35\x96\xf6\x8c\x8b\x0b\xe7\x69\x3a\xc2\xe6\x21\x1d\x41\x00\xa2\x8b\x81\xba\xc6\x5e\x42\x53\x63\x38\x3a\x7e\xdc\xb7\x70\xc8\xdf\x94\xba\xfa\x64\x98\x60\xde\xb8\x41\x3c\x84\x1b\x5d\xdc\x13\x55\x53\x4b\x70\xa0\x8b\x1f\xa6\x39\x32\x3a\xc7\x4b\x0b\xbd\xf6\xc0\x75\xc7\x33\x04\xdf\xe6\x98\xab\x9d\x15\xde\x1c\x38\x30\x83\xbb\x81\x1a\x4e\x4e\x86\xd7\x99\x7a\x73\x71\x96\xa9\xc9\x68\x32\x3c\x39\xe4\xf3\xed\x3b\x19\xf5\x0b\xf0\x42\xcb\xd6\x80\xd1\x1a\x7e\xcb\xd3\x2c\xff\x8a\x8d\x6f\xcc\xd4\x2b\x84\x87\x52\x17\x12\xb8\xd2\xa2\x18\x30\x1d\x9c\x9f\xc0\x71\xf4\xc0\x62\x8e\xab\xad\xb7\x71\xc2\xbe\xf6\xcc\xc0\xb2\xb5\xe7\x04\xd0\xac\x58\x8d\x1a\x02\x3b\x40\x77\x0d\x43\x79\xaf\xeb\x7a\xab\xde\xda\xcf\x6a\x78\xe7\x0d\xaf\xce\x34\x41\x2c\x39\x6e\x64\x49\xcb\x18\xae\x66\xb4\x48\xf6\x67\xf6\x3e\x16\x94\xdf\x3f\x6c\xe5\x23\x77\xca\xff\x01\x48\xa0\x74\x7e\x36\x58\x46\x0a\xcf\xf1\xd1\xcf\xea\x76\x72\x12\xc2\x3c\x47\x47\x3f\x85\x88\xda\x44\xf8\x8d\x87\xb3\x06\xc8\xc7\x60\xd2\xfe\xb1\x2e\xee\x75\x49\x41\x3b\xbc\x56\x64\x8c\xce\x1d\x0a\xdd\xe8\x03\xae\x21\x70\x5c\x3d\xb2\x40\x5f\xaa\x5d\x77\xd4\xe8\x6f\xb6\xf7\x9f\xf5\xee\xfd\x89\xff\xfe\xe8\x33\x32\xf4\x3d\xb4\xef\xbf\x6c\x87\xff\xd9\x05\x7c\xf9\xb5\x16\x30\x56\x88\xa4\xe1\x93\x99\xc6\xd7\x6b\xa8\xfd\x48\xf4\x9d\x15\x7a\x05\x34\x90\x3e\xe1\xcc\x56\x16\xb9\xc5\xaa\xb4\xd8\x46\x8e\xa9\x94\x83\xee\x27\x64\x29\xe0\x98\xa8\x87\x39\xf2\xb3\x45\xab\x5a\x84\x46\x44\x4b\x28\x81\xdc\x26\x96\xda\xa1\x07\x70\x4d\xa5\x56\xa7\x31\x1a\x42\x8f\x79\x0d\x3c\x06\x81\x05\x06\x35\x2a\x9d\xb5\x61\x45\xa7\x0e\xa1\x13\xcc\xbe\x1f\x47\xb2\x2e\xc2\x3a\xf0\xba\x71\x43\x32\xff\x9b\x26\x20\x89\x3a\x43\xf8\x52\x6c\x83\x10\x56\x8a\xdc\x04\x51\x69\x16\xdc\x60\x4e\xe8\x32\x5d\x9a\x90\x4c\xd4\xd9\x0c\xf4\xde\xfc\x9b\xc0\xf3\x1d\x24\x33\x3c\x06\x3b\x37\xfe\x59\x38\x2a\x9e\xc0\x24\xfc\x18\x15\x70\xc6\x18\xf5\xdb\xaa\x80\xd6\xc7\x86\x28\x09\xcf\x72\x6f\x37\xcd\x0b\xf4\x19\x64\x8f\x70\x06\x27\x3a\x40\x62\x39\xa7\xdc\x1c\x5f\x61\x02\xbe\x80\x7e\x38\x74\x22\xf2\x0d\x27\x86\xc1\x6e\x6b\xae\x87\x60\x38\xec\xe5\xb4\xf2\x52\x27\xf9\x2e\xed\x9f\xe0\x6c\x0f\x17\x68\x5c\x8f\x4f\xc6\xac\xbc\x0e\xab\x67\x00\xda\xe7\x12\xa6\xd8\x5f\x48\xe0\x6a\x03\x0f\x58\x9d\x05\xb5\x3c\xc9\x77\x25\xf2\xa4\xc2\xb8\xb4\x07\xdf\x68\xf7\x05\x16\x0a\x38\xfc\xb6\xb4\x77\xa0\x03\x2c\x8d\x76\x40\x01\x10\x6a\x1c\xd5\xb6\x84\x52\x69\xae\x4d\x0b\xc0\x8e\x15\xad\x96\xba\xaa\xe0\x16\x98\xb5\x30\x6f\xbb\x17\x28\xc0\x56\xa4\x08\x03\xbb\x24\x26\x17\xee\x52\xf2\x3b\x0e\x2a\xac\x9f\x4a\x75\xb1\x88\xcd\x86\x88\x40\xfa\x2c\x02\xa5\x81\xec\x2f\xd5\x0a\x8a\xc6\x99\x72\x4e\x58\xb3\xb6\xf4\xd8\xed\xc3\x48\x89\xe4\xfa\xba\x06\xce\x48\x99\xb0\xe6\x27\x3d\x08\x41\xde\x4a\x59\x87\x7b\x02\x4a\x32\x20\xf6\xa2\x36\x4b\x3f\x3d\xa1\xc3\x9d\xf1\x78\x03\xd9\x00\x1f\xce\x2c\x12\x0d\x87\x6f\xd8\x56\xc9\x1c\xf4\x0b\x65\x58\x25\xea\x1f\x6b\xe3\x1a\x20\xa9\x6c\x0d\xa4\xa5\xa1\x7f\x93\x81\xb4\xdd\x69\x5f\x63\x20\xd1\xda\xfb\x36\xf2\xbb\xeb\x04\x7c\xa2\x20\x57\x40\x63\xb5\x93\x13\x3d\x72\xca\xea\x65\x44\x4e\xb0\xb7\x07\xe1\xb1\xb2\x3d\xcc\x36\x6d\xc7\x1f\x0b\xfe\x47\x94\x5a\xb2\x56\xd9\x93\xdb\x67\xeb\x64\x77\x38\xf3\x3f\xf4\x4a\x57\x87\xbd\xbc\xca\x7f\xee\x72\x12\x1e\x1c\xc2\x61\x86\xc4\x38\xb2\xf0\x83\xa3\xcc\x99\xaa\x31\x01\x4a\xf3\xe0\x85\x06\xa0\xb9\xf6\xca\xfd\xb3\x2f\xb7\xb6\x15\xfc\x97\x5e\x74\x2d\xdd\xe2\xdf\xf3\x2e\x6b\xaf\xe8\xbf\xc1\xb5\xd6\x11\x7a\xdf\xfe\x86\x6b\x7f\xf2\x0f\x5e\x76\xd1\x2b\x46\xac\xd2\xdf\x4a\x33\x46\x6b\xbe\x73\x3a\x20\xd1\xb1\xed\x1f\xdc\xb9\x81\xdb\x55\xf9\xa3\x55\x19\xc2\x82\x77\x90\xd0\xd6\xbd\x52\xfc\x2d\x98\x17\x8d\xc4\xfc\x32\x13\x96\xc9\x8b\xf5\x12\xdc\x95\xe0\xe7\x62\x40\x67\xc4\x3f\x62\x65\xaf\x7b\xb3\x4d\x28\xde\xa1\xd6\x8a\x33\xeb\xdc\x56\xdb\x25\x80\xc0\x83\x0f\xf6\xb0\x93\xf3\x4d\x9d\x28\xe6\xc0\xa3\x59\x16\x26\x7f\xdd\xf6\xc8\xf3\x42\x26\x8f\x24\x17\xaf\x20\x0b\x4e\xee\xe0\x47\x04\x72\x44\xa8\xc3\x51\x09\x77\x2f\x0b\x61\xc7\x04\x55\x2d\x0e\xe5\x68\x7c\x53\xae\x3d\x5c\xdd\xb7\xe3\x33\xb9\x61\x83\x10\x31\x9d\xd5\x89\x99\x95\x18\x2c\x88\x14\xc5\x72\xd5\xa8\xb0\x04\x4a\x4f\x28\x48\x0b\x8e\xc6\x8e\xae\xa2\x79\x05\x0b\x1c\x58\x58\x8c\x9e\x83\xde\x77\x40\xe0\xf6\xcb\xd4\xfe\x5b\xaf\x89\x2c\x64\x68\x38\x79\x7b\xba\xed\x28\x23\xfb\x7e\x20\xfb\x93\x59\x6d\x4c\x05\x3e\xd4\x80\xbd\x0d\x2c\xdc\x3b\x5e\xdd\x3f\x24\x52\x34\xea\x3a\x39\x0b\x02\xb9\x73\x64\xd4\x14\xdb\x12\x65\xd4\xeb\x90\xfc\x9d\xa9\x05\x13\xdc\xc2\xfa\x3d\x36\x55\x3d\x67\x2a\x53\x10\x1c\x5e\x16\x15\x70\xbe\x39\xd1\x25\x88\x89\x12\xa3\x14\x63\xa1\xb7\x01\xac\xb0\x5c\xe9\x1a\xf1\xf1\x31\x16\x48\x2f\xe2\x3b\x8e\x57\x2f\xc8\xd6\x50\x7f\x43\x3b\xc1\x96\xca\x39\x37\x8f\x37\xcc\x8c\x68\x63\xce\x47\xe1\xa2\x56\x1f\xc2\x0d\x04\xdf\x8c\xd4\x42\x98\x93\x7a\x3e\x9a\x4c\x62\xda\x28\x22\x5a\x20\x23\x8d\x90\x2c\x94\xe6\xa9\xce\x2e\xd5\x87\xf1\xd9\x0d\x24\x5a\x06\x08\xcb\xd5\xdb\xb7\xa3\xf1\x24\xa2\x65\x00\x04\x05\x08\x94\x80\x77\x1a\x8f\xae\xc7\xa3\xc9\xe8\x12\x73\xf0\x20\x35\x52\x40\xa0\x04\x8c\x56\x9d\x5c\x5d\x9e\x8c\xc6\x97\x8c\x87\xba\x18\xde\x8c\xc6\x67\xc3\xf3\x49\xc6\x64\x44\x59\x24\x22\x9a\xdc\x0c\x6f\x6e\x6f\xae\xc6\x1f\x5b\x49\xaf\x4f\x27\x28\xba\x7a\xab\x6e\xce\x6e\xce\x47\x91\x7f\x88\x52\x2e\x81\x82\xe8\xd2\xcf\xca\x2e\x1a\xa2\x4c\x5d\x5e\x5d\x12\x07\x11\xa4\xeb\x41\x62\xa8\xef\xf3\xf0\xcd\x64\x44\x88\x9c\xf3\x21\xe4\x13\x06\x74\x53\xa0\x3b\x1a\x9e\x9c\xdc\x8e\x87\x27\x1f\xc3\x4b\x38\x3f\xf8\x96\x68\x60\x34\x1e\x5f\x8d\x27\x31\x09\x18\xb8\x8f\x6e\x00\x0c\x76\xf5\xfb\x68\x3c\x7c\x73\x3e\xfa\xe2\xbc\xca\xb7\x3c\x83\x62\x26\x20\x71\x12\xf0\x43\xf1\xc1\xde\x4c\x49\x62\x3f\x93\x29\xce\x95\x48\x71\x66\x52\xa0\x34\x9f\x72\x3c\xfa\xdf\xb7\x67\x63\xc4\x7d\xa5\x00\xaf\xac\x9b\x2a\x19\xf6\x55\x37\xa5\x18\x89\x96\x64\x7a\x74\x48\x29\xee\x4d\x20\x4e\x72\x44\x33\x75\x7d\x7b\x79\x06\x10\xb6\xab\xb1\x1a\xfd\x6d\x74\x71\x7d\x3e\x1c\x7f\x8c\x69\x9d\x63\xc4\x80\xf9\xed\xd2\x86\x0e\xd2\x22\xb5\x80\x68\x31\xaf\x37\xf4\xf9\xfd\x70\x82\xe9\xbc\xc3\xd3\xdf\xcf\x26\x4f\xcb\xe6\x25\xba\x2f\x41\x95\x14\x7d\x6e\x5f\x91\x27\x09\xec\x55\x2f\x9f\x28\x63\x86\xf3\xdf\xe7\x0f\x9a\xf3\xc1\x93\xed\x02\xf6\xa0\x80\xcc\x0f\x8b\xa9\xf5\x01\x02\xf0\x14\xed\x04\x35\xb0\x48\x20\x92\x5a\x70\x41\x52\x07\x7c\x0d\x7c\x01\x69\x8e\x22\xd3\x12\x0f\x2f\x8f\x0c\x1f\x20\x1d\x8b\x1d\x5d\x8d\x9c\x48\xf3\x75\x59\xf6\x24\x1c\x78\x53\xa4\x0c\xf1\xae\x40\x4c\x70\x94\xa9\xe3\x4c\xfd\x94\xa9\x57\x99\xfa\x19\x8d\x83\x5f\xb0\x6b\x4f\xa5\x6d\x8a\xa6\x77\x2b\xfc\x8d\x7a\x70\x5f\x10\x1c\xf5\x91\xb6\x77\x17\xae\x96\xc2\xfd\xd1\x58\xb6\x8c\x55\x1f\x76\xd3\xb1\x42\x8f\x44\xc0\x83\x3c\xd0\x2d\x82\x3b\xaa\xd1\xd6\x86\xe1\x74\xc9\x87\x69\x37\xd5\x48\xc1\x6a\x57\x82\x72\x94\x3e\x88\x3a\x27\xf1\x0f\x17\x4b\xd3\x73\x65\xc7\x44\x3c\x2c\xcf\x5a\x92\x83\x3b\x6c\x0f\xe8\x22\x64\xcb\x30\xb1\x4f\x6a\xb2\x27\x48\xb1\xc4\x01\xc0\x54\x86\x5c\x2e\xb7\xe6\xc2\x0e\xa0\xcc\x65\x61\xe2\x1f\xf1\x62\x1c\xf6\x14\x6d\x80\xde\x05\x76\x43\xde\x75\x90\x53\x89\x69\x71\x48\xcc\x45\x5a\xa1\xd8\xcd\x11\x44\x10\xf9\x6e\x7e\x69\x65\x9e\x46\xc1\x00\xf4\x8f\xc0\x08\xd9\x62\x8b\xfe\x02\x9b\xa2\xab\xe9\x24\x78\x1d\xc6\x5c\xd9\xd4\xa4\x96\xf5\xc5\xad\x74\xdf\x47\x6f\x4a\x2f\xbc\x83\xd8\x12\xdb\x7b\x3b\x61\x14\xda\x71\x7c\xfe\xe0\x60\x7b\x14\xe1\x2f\x1f\x5c\xaa\xa6\x7e\xb3\x51\xce\x9e\x96\x00\x5c\x54\x40\x63\x02\x36\xba\x4c\x00\x66\x26\xce\x76\x76\x6d\x23\x33\xff\x70\xe7\xf9\xee\x41\x23\x54\x85\x20\xb4\x12\xaa\xfc\xe1\x8c\x78\xa9\x99\xa3\xff\xe2\x91\x78\x0c\xa7\x8b\x86\x34\x5a\x3c\xa7\x2d\x1a\x2a\xf6\x96\x84\x9c\xe8\x27\x24\x2d\xb3\x95\x49\xba\xf7\xce\xbc\xe5\x56\x43\x38\x47\x70\xda\x44\x36\x73\x04\x7e\x5c\x22\xa1\x0b\x91\xdb\xee\x98\xed\xd0\x9b\xdc\x77\x37\xc7\x18\x70\x4e\x05\x30\xf8\x12\x9d\xd9\xca\x19\x5e\x61\x69\xe9\xc1\xd3\x35\xd5\xaf\x71\x49\x4a\xb0\x60\xea\x82\x9a\x4e\xc5\x9d\x60\x08\xc7\x54\x5d\xb4\x29\xb1\x1e\x08\x19\x94\xfd\xad\x0a\x9c\x48\xa2\x2a\x48\x00\x2b\x18\xc1\x00\xba\x16\xf9\xe8\x53\xd3\x6c\x0c\x31\x0d\xf1\x0a\xed\xc2\xfc\xf1\x6e\xc6\x8b\x08\x5c\x39\xb5\x21\x36\x32\xc1\xc8\x5c\x54\x77\x2e\x93\x44\x3d\x70\x8f\x24\x86\xc8\xee\x4f\x80\x3c\x0f\x8e\x4d\xfc\x4e\x34\xb6\xc3\x1e\x9e\x1a\x35\x85\x28\xfd\x74\x8b\x6c\x7b\xb1\xae\xa5\x48\x3d\x07\x19\x0f\x4c\xb1\x81\xed\x17\x53\x81\x97\xcb\x75\xc5\x79\xbe\xac\x8b\xb4\x66\x4e\x70\x0a\x07\x6c\xba\xa4\x07\x46\xf2\xb5\xc0\x0f\x1c\x67\x34\x49\x4b\x24\x10\xa1\x6f\x7e\xaf\xeb\x94\xa6\x02\x03\x71\xb1\xbb\x67\xca\x6f\x6b\xff\x58\x28\x22\xa2\x36\x0b\xdd\x38\x0b\x17\x23\xe4\x4d\x56\x55\xb8\x0f\x85\xbf\x61\xd0\xf5\x81\x4b\xb8\x72\x59\xb0\xf7\x46\x70\x1f\x61\x37\x48\x3b\xc4\x5a\xf4\xcd\xc2\x40\xbd\x1b\x66\x47\xa2\x7c\xdc\xd8\x87\x47\xea\xcb\xfa\x97\xee\x4c\x65\x6a\x5d\x66\xb8\xae\xfe\x1f\x45\x35\x03\x07\x04\x02\x59\x61\x0b\x03\x13\x6f\xa1\xcb\x76\xca\x6f\x6b\x8c\x3c\x47\x4c\x36\xd5\xab\xc4\xcc\x6d\x6d\xee\x2c\xfc\xd7\xc6\xaa\x83\xe3\xc3\xe0\x10\x77\xe0\xc6\xe9\xcc\x8c\x57\x03\x62\x8c\xbc\x60\xa7\x4f\xce\x0e\x41\x12\xe6\x09\x0e\x91\x7c\xc5\x41\xb2\x82\x8e\x2a\x08\x1f\x01\x5e\x9f\xd6\x0b\xe1\xf7\x07\x7b\x94\x40\x3d\x0f\x94\x7c\x18\x81\x17\x70\x69\x82\x9d\x8a\xec\x78\xc2\x7c\x84\x44\x70\xc6\xab\x84\x43\x19\x95\x94\x93\x93\xeb\xf3\x4c\x55\x94\x89\x8a\xcb\x0a\xab\xcf\x65\xf9\x9b\xc0\x94\xbe\xdf\x9e\x8c\x7d\xde\x0d\x21\xbb\x3e\x3c\x6b\x6b\x55\xda\x3b\x0b\xa4\x04\xdd\xcd\xb5\x8b\x39\x9b\xe5\x5e\xcf\x5b\x98\xfb\x0e\x60\xe1\x06\xd4\x2c\xd6\x9b\xa6\xbd\x15\x3e\xda\xaf\xff\xe0\xbf\x56\x3d\x83\x62\x10\x55\x23\x3a\xba\x76\x90\x43\xbb\x2e\x72\x53\x16\x95\xc1\x62\xde\xe4\x37\x8a\xac\xce\x16\xf3\x50\x36\x66\xea\x8a\x26\xc6\x57\xa0\x62\x75\xab\x48\x29\xd8\x4c\x14\x4b\xeb\x21\xe1\xee\x1e\x6d\xfa\x18\x95\x1b\xf4\xd7\x45\xc8\x4e\x9e\xd1\xb3\x33\x9a\x03\x5b\xdf\xfd\x38\xf8\x6f\x96\xe2\x3a\xf8\xf1\x6f\x47\x47\xdf\x26\xed\x33\xfc\x3c\x9c\xff\xf9\xfc\xf8\xe5\xab\x97\xad\xfc\xcf\xa3\x17\xcf\x7f\xfe\x9e\xff\xf9\x57\xfc\xfc\xed\xe8\x88\xaf\xb1\xbd\x4e\x8e\xf8\x2b\xf5\x37\x60\x01\xb2\x75\x53\xac\x97\x7b\xd7\x31\x57\xa0\x70\x09\xc4\xdb\xdb\x80\xf3\xda\x80\x3c\x44\x1d\x28\xa3\x0a\xcc\xc4\xe8\x42\x84\x00\x58\xd0\x29\xa9\x02\x1e\x78\x8b\x80\x86\x37\xfa\xe4\x5b\x35\xf4\x8a\xd2\x38\xe2\x2b\x60\x7e\x80\x7d\xac\x77\x9f\x1b\x2c\xac\xd4\x40\x49\x0c\x6a\x8c\x85\x9c\x00\x46\x3d\x72\xff\x09\x37\x0d\x32\xd4\x67\xd0\xcf\x8c\x38\xe2\x33\xb5\x34\x30\x2c\x92\x4a\x59\x1b\x6f\x59\x0a\x5d\xe0\x47\x20\x97\x8c\x65\x42\x43\xc1\x0e\x66\x3f\xa5\xb8\x23\xca\x53\x9a\x22\x17\x2a\x55\x27\x23\x29\x9c\xd7\xd2\x2b\x14\x84\x7e\xb8\x56\x39\xdb\x01\x08\x46\x28\x58\xb4\x6c\x7e\xdb\x8b\x11\xbc\x4e\xb0\x22\x58\xc1\x22\x01\x84\x6b\x7c\x45\xb5\x57\xd4\xc1\x12\xa3\xa9\x81\x92\xbf\xd1\xa8\x06\xc8\x02\xfc\xb2\xe7\x03\x48\x60\x9d\x5c\xbd\xbd\xf9\x30\x1c\xa7\x94\xf7\xc4\xd2\xf0\x28\xa7\x3d\xfa\x8f\xfb\xa9\xec\xd5\x9b\xdb\x1b\x70\x76\x82\xa3\x98\xd9\xd8\x46\x2d\x5f\x71\x24\xa9\x7f\xa2\x93\x18\xbc\xe0\x2d\x3f\xf1\x20\x71\x79\x22\x1d\x99\xff\xd4\xdf\xc0\x5d\x79\x35\xbe\x39\xbb\xbd\x10\xbe\x4f\x76\x70\x42\xf2\x6f\x26\xc9\x05\xd1\xa5\x1c\xb2\x81\xa3\x93\x18\x08\xe9\xd5\xf0\x84\x53\x45\x23\x39\x24\x70\x48\xa6\xce\x72\x76\x7b\xbe\x1d\x5f\x5d\x64\xec\xfc\xbc\x1a\xf7\x71\xc5\x25\x2b\x20\x5d\xa2\xd1\xbd\x3d\x3c\x3f\xbb\x7c\x07\x71\x02\xf9\x70\x50\x7c\xb4\x63\xec\x05\xa3\x17\x0a\x17\xb8\x90\x1b\x51\xff\xd9\xff\x5b\x4a\x8b\xd4\x04\x60\xca\x31\x59\xc1\x25\xb9\xc6\xfd\x69\xa0\xaa\x25\x68\xae\x97\x48\x79\x1b\xc1\x14\xfe\x9c\x7b\x83\x25\xf4\xa2\x73\xd8\x53\x6d\x06\x43\x2d\x9c\x4b\x17\x22\xc9\xb2\x8f\x83\xbd\xbf\xa9\x0f\x45\x95\xdb\x8d\x9a\x6c\x5d\x63\x96\x88\x2a\x16\x7a\xd4\x3c\x79\x1e\xf9\x34\xfe\x5b\x69\x00\xcc\xff\xf0\xe2\x5b\x91\x3f\x3c\x7a\xff\xbf\x7c\xf9\xe2\xa7\x57\x6d\xfe\x87\xe7\x2f\xbe\xdf\xff\x7f\xc9\xcf\x43\xfc\x0f\xea\xc5\xe0\xb9\xba\xad\xbc\x80\x37\xf9\x77\xf6\x87\xef\xec\x0f\xff\x43\xd9\x1f\x5a\x4c\xb3\xa2\xb7\x17\xc3\x8f\xbe\x15\xa6\x7a\xa0\x08\xfc\x48\x0d\xe5\x0d\xfe\x2f\x46\x1e\x31\xcc\xf5\x0a\x75\xde\xc7\xb9\x08\xb2\xaf\x44\x46\xa0\xc3\x37\x33\x95\x47\x0f\x3f\xd2\x55\xc8\x82\x09\x76\x4e\x69\x55\x31\x5b\xb5\x6c\x4c\x1d\x3d\x33\x5a\x95\x85\xff\x45\x0d\x9e\x70\xed\x75\x89\xa6\x98\x51\x4b\x0c\x9a\xbc\xab\x35\xba\x8a\x45\xb6\x0d\x02\x37\xb8\xe8\x7a\x51\x99\xa5\x6e\xfc\x83\xab\x45\x31\x13\xfd\x73\x5f\x91\xad\x40\x18\x1c\xe4\xcf\x84\xe6\x6a\x33\xb3\x77\x55\xf1\x5f\x80\x6c\x82\xd9\x60\x0e\x3a\x19\xbd\xf8\x52\xaa\x03\x19\x66\x6b\x25\xfd\x57\x2a\xae\xf9\xb7\x63\x38\xc0\x25\x68\x27\xf8\xf1\x72\xfc\x65\x0c\x07\x5f\x34\x58\xc1\xd3\x11\xe7\x31\x1e\x8b\x59\x9c\x5b\x3b\xdf\xbd\xf1\xc4\xbe\x97\x8c\x2a\xe8\x59\x64\xc2\x95\xc2\xb8\xac\xb5\x27\x5d\x16\xe7\x07\xf6\xdd\xb4\xb6\x3a\xf7\x5b\x0a\x1f\xc5\x2d\xb8\xe1\xd8\x7c\x8b\x85\x56\x54\xc2\xc0\x47\xca\xc2\xb5\x12\x8b\x8e\x0e\xe6\x87\x98\xe0\x9c\x89\x2a\x44\x08\xbe\xe2\xb9\x77\x21\x4a\x0b\xbd\x4d\xcf\x22\x46\xf2\x99\x7c\x50\x10\xb8\x18\x48\x7d\x87\xd9\x59\xeb\x12\x31\xf7\x18\x0d\xef\x61\x91\x71\x89\x25\xf9\x08\xa3\x8c\x24\x94\x91\x79\xd5\xbd\x84\x32\x21\xa2\xf3\x07\x59\x65\xa8\xa7\xf6\x0e\x73\xd5\xbe\x1a\xc9\xcc\x53\x0f\xa3\xe4\x96\x01\x43\xfd\xe9\xdc\x32\xb3\x81\xda\x0f\x85\xc6\x4d\xe0\x52\xa0\xf0\x5a\x74\x88\xb6\x7d\xd2\x22\x3e\x8a\x81\x50\xe9\xa1\xe0\x40\xf3\x50\xc8\x6b\x0d\x55\xf1\x6a\xbb\xaa\x0b\xdd\x80\xd1\x87\xe4\xce\x29\x59\x01\x8a\x40\xe2\xfe\xd9\x54\x06\x30\x6e\x92\xd4\xe3\x61\xf6\x90\x4c\x82\x41\x32\x66\xcc\x90\xa0\x90\x48\x2a\x72\xe0\x0e\xdb\x78\x86\x47\x11\xbf\x66\x27\xad\x48\xd6\x45\x18\x3e\x70\xc3\x7c\x69\xaf\xfb\xa8\x49\x14\x22\x63\x2b\xdb\x4f\x13\x32\xd3\x15\x38\x5f\x42\x6c\x23\x8b\x0b\xe8\x16\xa6\x0e\x08\x52\x8e\xa4\x41\x79\xa7\xce\x20\xa4\x20\x06\x71\x0e\xa4\xa5\x19\x94\x25\x36\xfe\x1f\x20\xb7\x0b\x98\x01\x10\xf3\x75\xc2\x76\xca\x3e\x29\x3f\x00\x3d\x6b\xf0\x3d\x7f\x79\x97\x05\xc4\x92\x72\x03\x70\xc4\x4c\x01\x44\xb4\x00\xef\x5a\x63\xea\x55\x6d\x9a\xd4\xb0\xe7\xd0\xfe\x6e\xe9\x09\x63\xc7\x98\x0e\xdf\xf2\x73\x5b\x7e\x2a\x6d\x6d\x5e\x63\x19\xa8\xee\xe0\xc2\x2d\x8f\x51\x0c\x20\x41\xa8\xd5\xd4\x70\x60\x89\xbd\x8e\x35\x45\xc7\x04\x53\x0c\x52\x6d\xcc\x8b\xcf\x14\x68\x85\x1c\x62\xd7\x9d\xb4\xb0\xb5\xf1\x01\x98\xf6\xcc\xf7\xa7\xdb\x21\x29\xb7\xf1\x84\xdd\xe9\x70\xc7\x61\x18\x08\xa9\x03\x88\x6d\x3c\x3c\x2f\x19\x64\xda\x2c\x35\x61\xc2\xc8\xa1\x98\x4c\xda\x53\x29\x6a\x1e\x8f\xf9\x45\x0a\x27\x1e\x15\x7f\x38\x53\x0e\xaa\xff\x02\xdf\x29\x5e\x0e\xd4\x83\xdc\x2e\xb5\x5f\xf2\xcd\x42\x37\x10\xde\x24\x7d\x08\xa2\xad\x54\xd0\x07\x16\xdd\xce\x51\xdc\x87\xd5\x15\xfd\xe1\x94\x68\x04\xd6\x47\xc5\x71\x6a\xad\xd7\x23\xf4\x72\xb5\x28\x4d\x23\xb6\x24\x85\xe0\x5f\xfb\x13\x6a\x66\x58\x43\x4f\xe7\xb9\x6f\x39\x53\xce\xd4\x4b\x5c\xf0\x78\x6b\x86\x2b\x4e\x2f\x0d\x55\xdd\xf3\x2f\x13\x09\x16\xe8\x98\xfc\x6f\xfb\x4c\xaa\x31\xfe\xa9\xd9\xc2\xd6\x26\x28\x88\x1b\x3a\xb7\xc6\x6f\xf2\x46\x17\x15\x13\x56\xe7\xeb\xe5\x54\xb9\x85\xdd\xbc\xde\x41\xf6\x84\x17\x59\x1d\xa6\x7f\x63\x6b\xd8\x4c\x1d\x1d\x14\xef\x14\x2b\x6a\x10\x6a\xe7\x8a\x65\x81\xb1\x3d\x3c\x29\x34\x91\x08\x3e\xd0\x7e\xed\x20\xff\x43\x57\xba\xb4\x77\x76\x0d\xf2\x3f\x69\x77\xfb\x9a\x55\x47\xaf\xc4\xd5\x7a\x03\xa7\x78\xa5\x8b\xaa\x21\x1a\xaf\xd9\xa2\x68\x78\x36\xdd\x6c\x5d\xae\xf0\x9f\xa6\xba\xab\xf5\x3d\xb9\xe9\x4a\xdf\xf7\xd8\xde\x6a\x61\xbf\x7e\xb7\x63\xa3\x49\x9f\x31\xf5\x04\xf6\xde\x6b\x60\x56\x2a\xcb\xb5\x6b\x6a\xa6\x2b\xd3\x2b\x90\x40\x55\xa6\xdc\x27\xd3\xcc\x16\x98\x4e\x54\x1b\xf3\x2c\x2f\x96\xa6\x72\x08\x34\x80\xc6\x50\xad\x44\xf8\xd9\x1d\xad\xec\x36\x53\x8d\x5d\x85\x7f\xcb\xd9\x00\x8d\xcb\xef\xff\x19\x6c\x1a\x21\x19\x5e\x03\x87\x39\x9d\xe0\xd7\x52\x1a\xc1\xb2\xda\xe5\xaa\x88\x48\xfb\x5c\x37\xba\x95\xd7\x80\x15\xd6\x57\xb5\x6d\x90\xc7\x48\x3b\x8a\x89\xa4\x9c\x54\xaf\x11\xf1\x05\x7d\xa7\xaf\xf3\x04\xde\xeb\x9a\xc9\x26\x66\x45\x3d\x5b\xbb\xf0\x40\xdd\xfb\x2d\x48\xe5\x0a\x12\x39\xe1\x03\xdb\x29\x96\x25\x73\xd3\x77\x72\xab\x07\xc9\xad\x16\x03\xb5\x7f\xcd\xa0\x36\xe2\x6a\x11\x0a\x59\xca\x31\x03\xc8\xb5\x46\x27\x21\x93\x60\x58\x23\xf3\x3a\x41\x5e\xba\xba\x9b\x75\xa6\xa7\x95\x8c\xa1\x35\x44\x5c\x53\xf3\x01\x93\x11\xaf\xe9\x56\x6d\x0a\xdc\xd5\xfe\xff\x01\xf6\x14\x9f\xdf\x49\x52\xe1\x5e\x3f\xaa\x52\x7e\x60\xc5\x1a\x45\xb8\xda\x68\x62\x80\x5b\x9a\xe5\xd4\xd4\x61\x90\xf4\x38\x80\x7c\x30\x6d\xad\x59\x18\x97\xe0\x8c\xb5\x3f\xcb\x64\xab\x83\xd1\x8b\xff\x99\x90\x73\xcc\xfc\x2c\x30\x54\x6d\xf9\x5a\x4e\x70\x98\xca\xb4\x83\x3b\x66\x47\x54\xf6\x97\x20\xa3\xf4\x5d\xee\xbb\x98\x91\x94\xa8\x23\x99\xe1\xdd\xf3\x08\xfd\x0c\x42\x83\xc8\x9b\xe2\x7f\xcb\x7c\x9c\xd8\xd7\xd8\xb6\x2b\xee\xfc\x3a\xb3\xaa\x52\xa3\x31\x1c\x38\x87\x8a\x81\xda\x1f\x33\x17\x54\xdb\x14\xe8\xd1\xf0\x77\x7c\xa5\x47\x43\x98\x6e\x89\x63\x05\x38\x51\x9c\x3f\xf3\x81\x6d\xc5\xa5\xf0\x76\xd0\xdb\x8a\xcf\x3a\xd8\x92\xcc\x4e\x05\x74\x67\xf4\x87\x9d\xb3\xe7\x1a\x5b\x87\x5a\x09\x51\x36\xee\x72\x27\xc0\xd5\x2b\x14\x88\x78\xf1\x83\x39\x5b\xdb\xca\x6f\x35\x48\x75\x4b\x78\xdd\x4e\x31\x88\xb4\x93\xdb\xed\xfc\x0f\x71\xbb\xad\xbd\x9d\x06\xf1\x6f\xd8\xc6\x82\x8d\xad\xee\xe5\x7d\x4b\x98\xdd\x6a\x72\xf4\x44\x1c\x1c\xd5\x1f\x46\xa4\xfc\xdc\xee\x44\x8f\xc5\xef\xd0\x84\xc5\x62\x7d\xdf\xa9\xdf\xfe\x18\xf5\xdb\xf8\x6b\x50\xbf\x81\x4c\x26\x71\xde\x6d\xf0\x31\xd6\x37\x5b\xed\x26\x7c\x8b\xad\x0d\x85\xc7\x32\xd6\x4d\x4d\xe0\xf7\xd2\x88\x17\x84\x6b\xd5\x36\xc9\x06\x24\xcf\x24\x9e\x95\x0c\x6a\x4c\x3a\x99\x9f\xe7\x1a\xb3\x42\xbd\xb2\x34\xba\x2e\xb7\xaa\xd4\x53\x53\x7a\x03\x70\xa9\x6b\xb8\xa5\x12\x73\x8f\xd3\x15\xc9\x3b\x02\xc4\x48\x4e\x6d\x4c\x4d\x48\xad\x3e\x8c\x36\xfa\x1c\xcd\x67\xbd\x5c\x95\xc0\x33\x20\xfb\x37\xb3\xeb\x32\xc7\x2c\xdf\xfa\x93\xc9\x15\x94\xc3\x08\xaf\x63\xd5\x0d\xed\xc2\x2b\xec\x4a\x1d\x55\x77\xde\x5c\xf6\xdf\x9b\xac\x74\x55\xb8\x05\x26\x36\xea\x84\x40\x88\x5a\x67\xe6\xc8\xbe\xc6\x39\xf1\x20\x60\x4b\x07\xfb\x29\xb9\x5e\x74\xc2\xc0\x12\xb5\x15\x01\xb9\x5f\x9e\x40\x7a\xe7\x57\x1f\x2c\xcd\x84\xf4\xee\xb1\x6f\x88\xdd\xf0\x24\x1e\xba\x94\x5e\xee\xd2\x56\xcf\x36\xba\xb8\x87\xf5\x3e\x89\x54\x53\x2c\x16\x26\xb3\x85\x59\x1a\x47\x45\x42\xbd\x12\x92\x50\x45\xa5\x2e\xbf\x36\xc7\x96\xe0\xc4\x62\xcf\x11\xec\xd0\x40\xff\x65\xeb\x2e\xbd\x15\xdc\x08\xf0\x55\x35\xd3\x15\x79\xd1\x10\xce\xdd\x4a\x79\x48\xd2\x5e\x76\x33\x7d\x51\x51\x97\x0e\xdf\x5a\x10\x16\x69\x6e\x55\x2b\x5f\xab\xab\x17\xbe\x4e\x39\xe8\x3e\xfc\x0b\xcf\xde\xce\xa9\x7b\x12\x45\xda\x57\x9f\x38\xb9\xb9\x61\xf6\x8a\x81\xfa\xdd\x96\xeb\xaa\xd1\x7d\x93\x76\xb3\xa3\xc7\xbb\x27\x6a\x27\xa9\x5b\xf0\xf4\x61\x91\xdb\x00\xcf\x0d\xcd\x63\x38\xc3\x30\x85\x79\x74\xfd\xfa\xf9\x24\xde\x37\x14\xb1\xf9\xb2\xa8\x0a\xd7\x78\xed\xf6\x3e\xf4\xbd\x3d\xf9\x2e\x03\x1a\x39\x2c\x81\x8c\xaf\x67\x91\x77\xe6\x8f\x4e\xe0\xff\x4c\x5e\x36\xa1\x92\x70\x70\xe3\x97\x83\x39\x95\x12\xfc\xef\x47\xd8\x76\x9a\x24\x4c\xed\xbe\x52\x9e\x42\xdc\xf3\xa7\x09\x6e\x0e\x6e\xc7\x67\x87\x4f\xe1\x60\x6b\x91\xae\x3d\x3c\x88\x3f\xcc\xa2\xf6\x74\x4e\x99\x4e\x82\x14\xa7\x8c\xc9\x9e\xee\xd8\x8c\x22\x0d\x8c\xbe\xca\x2f\xf7\x4e\x77\x4f\x09\xac\x7f\x16\xf9\xda\x9f\x5e\x97\x0f\x0b\x53\x3d\xe1\x41\xa1\x21\xcb\x21\x8b\x05\x8c\xa5\xed\x77\x70\xd9\x3c\xbc\xb6\x62\xf9\xf4\x8e\xc5\x0b\xd9\xc9\x5f\x7d\x15\x21\xc3\x88\xcf\xfb\xcb\x03\x7d\xf8\xe5\xdc\x6e\x5e\xef\x7e\x1a\xe9\x8d\x37\x98\xff\x02\x46\x37\xdf\xa1\x6f\x48\xe6\x46\x01\x05\x26\xcc\x10\x39\xba\xd3\xad\x98\xca\xe9\xe1\x23\xc4\x6d\x55\x62\xb9\x7c\x83\x0e\x8b\x00\xec\x1f\xea\x70\xb4\xce\xa8\xe7\xa7\x02\x0a\xfe\xb0\xbc\x46\xe5\x69\x98\xc2\x4d\x12\xbb\x31\x8e\x88\x92\x13\x75\x48\x67\x89\xa6\x88\xdf\x0b\xab\x75\xed\xd6\xba\x4a\xee\x44\xbf\x51\xb3\x3f\xc2\x23\x44\x26\x64\xf6\x47\x08\x83\x7e\x83\x00\x64\x1b\x0b\xdc\xe6\x02\x4a\xf8\x83\xb2\x36\x81\x90\xa0\x01\x0a\x08\xfa\xa2\xbf\x21\xfa\x6b\xd8\x02\x81\x6e\x39\x94\xb5\xa4\xec\xb8\x3a\xa4\x49\x12\x19\x8e\x56\x50\x79\x11\x1c\x2a\x14\xb4\x0f\x78\x7e\x7f\x29\xa3\x2b\x3b\x53\x7f\xb7\xeb\xba\xd2\x25\xc6\xe2\xb5\xc0\x43\x1e\xec\x4b\x74\xe4\x35\xb6\xbe\x0f\xe1\x40\xee\xce\x0f\xae\x33\xdd\x59\x3c\xa7\x5e\xe7\x20\xaa\xa0\xe9\x36\xd4\x95\x8c\x5c\x38\x18\x90\x96\x53\x89\x79\xb2\xad\x01\x51\x58\xb4\x79\x9c\x51\x09\xc3\x95\x5f\xc0\xab\x34\x3e\xfb\x77\xe0\x4f\x3a\x28\xee\x63\xe1\xec\xc0\x6a\x16\xd4\x33\x38\xb2\xed\xa0\x71\x2a\x56\xbe\x94\x5f\x49\x82\x36\xfe\x49\xd4\x4a\x50\x07\x94\x69\xbd\xa2\xa0\x6a\x92\x9b\x4a\x1d\x4c\x0f\xbf\x11\xf1\x92\x98\x82\x44\x68\x3d\x8d\x6e\x09\xb7\x15\xff\x01\x4e\x16\xd1\x2e\x04\x96\x09\x22\x47\xe2\x59\xdc\xf5\x3d\xe6\x62\x82\x1d\x5b\x01\xf1\x92\xae\x59\x2f\x70\x3c\x47\x5f\x40\xd5\xd4\x2c\xe2\x4b\xbc\xd7\xda\x70\xa3\xd8\xbd\x87\x11\x72\xa1\x00\x2a\x68\xe6\xa4\x8d\x3c\xb6\x6a\x3d\x30\x35\x29\x76\x68\x25\x68\x18\xce\x34\x50\x44\x97\xa8\xf9\xaa\x1c\xe2\x3f\x22\xfe\x06\xa5\x75\x1f\xa8\xa5\xdb\xd2\xd6\xca\x62\x56\x50\x9d\x5e\xf3\x39\xfc\x97\x76\xce\xd4\x0d\x69\xe4\xe5\x96\xb2\xb1\x13\x1f\x74\xc6\xe2\x14\x6b\xe6\xd4\xca\x54\xb9\xad\x1d\x65\xab\x6f\xfb\x84\x77\x96\x24\x5b\x7b\x31\xde\x23\x50\xbb\x90\x23\xac\x17\xac\xf0\xbe\xef\x70\x1d\x66\x49\x4a\x2b\x03\xc0\xb2\x18\x05\x4c\xd2\x42\x44\x4c\xb0\xff\xa6\x7a\x52\x1f\x05\x0a\x2b\x26\xca\x44\x2f\x28\xe4\x98\xe7\x92\x37\x80\xe6\x43\x32\xc1\xc6\x4c\xd7\x04\x2d\x43\x19\xb6\xd3\x6d\x5f\xe5\x75\x3f\x0d\xc1\x09\x9c\x3d\xd9\x4e\xa4\xfc\xe2\xe9\x96\x75\x4a\xfc\x3c\x9f\x9b\xa7\xea\x24\x81\x02\xd3\xd6\x4d\xa6\x96\x5e\x03\x80\x99\xc6\x14\x39\x30\xbb\xf4\x27\x13\xf2\x75\x6a\x7b\xa7\xc1\x49\xa5\x03\xbe\x24\x60\x3b\xa5\x16\x8d\xee\xaf\x0d\x3b\x7a\x57\xb5\xf9\xfb\x3a\x2f\x66\x85\x2e\xf9\xb1\xd6\x12\xfd\xe0\x14\x70\xa3\x12\x5f\xc1\x1a\xfb\x2d\xe8\x07\x60\xfe\x9d\x90\x63\x5d\xb7\x1b\xd2\xc3\x22\x07\xac\x40\x2d\x26\xae\x19\xe9\x93\xe9\xf5\x03\x78\x61\xdb\x36\x3e\x0f\xba\x0e\x12\x31\xb7\x87\x71\x9c\xc4\x52\x41\xb7\x29\xcf\x2b\x15\x6f\x6b\x8a\x50\xc8\x4d\xfa\xab\x45\x36\x54\x7b\x76\xbf\x60\xda\x28\x3a\xb7\xe6\xcb\x30\x75\x0b\x7a\x99\x0d\x9e\x36\xff\x35\xa0\x3d\x00\x59\xd0\x87\x04\x8c\x32\x2c\x28\xe0\xf3\x75\x59\x7a\x65\x95\x15\x71\xb9\xa1\x5b\xf1\x9b\x50\x7c\x1d\x76\xb7\x37\xe1\xf0\x66\x22\x83\x4e\xe8\x29\x61\x45\xa2\x6c\x23\xd1\xf6\xf0\x52\x3c\xb0\x0c\xde\x32\x4b\x70\x11\x5f\x89\x89\xef\xe2\xf6\xe6\x76\x78\x7e\xfe\xf1\x5f\x88\x92\x8f\x98\xcf\xbe\xb3\xf1\x7d\x67\xe3\xfb\xce\xc6\xf7\xaf\xca\xc6\xb7\xfb\xfe\xfd\xce\xc1\xf7\x9d\x83\xef\x3b\x07\xdf\x37\xe0\xe0\x7b\x72\x94\xa5\x6e\x39\x51\x9b\x7f\x07\xd2\xbd\x47\x46\xd7\xf2\x87\x7c\xa7\xd9\x83\xee\x7d\xa7\xd9\xfb\xef\x42\xb3\xf7\x9d\x5d\xef\x8f\xb2\xeb\xed\x20\x28\xfc\xfa\x34\x7b\x21\xf7\xe5\x66\x07\xf0\x21\x0b\x2a\x5b\x2b\xf7\x31\x94\xd8\xc9\xb3\x0e\x74\x13\xb0\x66\x79\xad\xe7\xd0\x4c\xa8\x6a\xc0\x47\xb5\xa8\xa8\xfc\x3d\xf6\xea\x8d\xa9\x2b\xa3\x4e\x6c\x75\xef\xb7\x84\xf0\xc5\x5d\x47\x48\x25\x10\xc2\xc5\x64\x1c\x35\x64\x9c\x3c\x42\x97\x0f\xbc\x5d\xbc\x44\xac\xa8\xad\xd4\xc4\xac\x1a\xc4\x90\x1c\xff\x92\xa9\xa3\x5f\x7f\xfe\xf5\x10\x6f\x8c\xb1\x5d\x26\x5f\xb2\x73\x75\xf4\xeb\xab\x23\xfc\xe3\x87\xb3\xeb\x2b\x51\xab\xef\xa6\x36\x1a\x65\xce\xd1\xaf\xbf\xbe\x12\x8f\x5c\x4b\x24\x32\x60\xc1\x62\x06\x69\xfa\x52\x98\xbb\xdb\xca\x9f\x0d\xa7\x4b\xd1\xbe\xe8\xc6\x01\xc4\xb6\x00\xf5\xe1\xbb\xff\x1f\xeb\x72\xab\x8e\x5f\x42\xcf\x8f\xd0\xeb\x1c\x01\xf2\x70\x2c\xd3\xa5\x00\x8f\x0f\x5d\xcf\xa4\x31\x79\x85\xe7\x5e\x57\x4d\xe2\x71\x49\x71\x4e\xe7\x89\xca\xe3\x8f\x8e\xb3\x6b\xd2\x97\xa6\x86\xa5\x53\xae\xf4\x8c\xc0\xc6\x31\x6a\x50\xfb\xe3\x62\x51\x09\x13\x7b\x9c\xd6\x33\xf8\xbc\x85\x7e\xe7\x55\xd5\x06\xe7\x46\xbc\x40\x9d\xdd\xe1\x8f\x80\x5b\x07\x76\x9e\x3f\xca\xba\xf6\xe3\x06\xee\xb9\x79\x3f\x44\xa7\x57\x83\x2c\xf5\x26\xe6\x9c\x8b\xa3\x29\x00\x2b\xbb\x81\x3e\x9c\x13\xd5\x79\xcd\xcf\x56\xe2\x3b\x92\xd9\xb5\x62\x72\x5f\x77\x2e\x49\xf0\xf8\x26\xb0\x66\x11\x6e\xe7\x9b\x99\xfc\x81\x89\x03\x39\xbd\x3e\x7b\x58\xf4\x2e\x21\x84\xf3\x9d\x38\xf3\x3b\x71\xe6\x5f\x4a\x9c\xd9\x19\x66\x08\x35\x32\xfb\x93\x09\x41\xbd\xe9\x56\x25\x34\x9b\xac\xbe\x7d\x27\xd8\xfc\x9a\x04\x9b\x0f\x06\xc7\x60\x5f\xc7\xbe\x09\x10\x5c\x5c\x38\x4c\x95\x0a\x01\x3d\x69\x10\x7c\xe7\xee\xfc\xfa\x3f\x83\x1f\xaf\x4e\xa7\xe7\xcf\x8e\xbe\x21\xfd\xd7\x23\xfc\x5f\xaf\x8e\x8e\x8f\x9f\x77\xf8\xbf\x9e\xff\xf4\x9d\xff\xeb\xaf\xf8\xb9\x3a\x3d\x51\x57\x2b\x53\xa9\x53\xdd\xe8\xa9\x76\x51\x35\x3b\xf0\x1b\xe3\x50\x5d\xd7\x46\x2f\xa7\xa5\x01\x32\xc9\x07\x9f\x04\xf8\x34\x6b\x11\x51\xfd\x97\x0a\x87\x2e\x4b\xbb\xf1\xb2\x0d\x3d\x0c\xf3\xda\x98\x72\xeb\x6f\x97\xda\x44\xa2\x4d\x7f\xad\x60\xe4\xbc\x70\xf1\x63\x9b\x45\x01\xa0\x85\xa2\x62\x22\x51\xa4\x0f\xd5\x4b\x03\xed\xe4\x76\x09\x97\x0d\x08\x2e\x37\x50\x17\x78\x99\xe3\xdb\xa8\x34\x41\xd5\x74\xb4\x28\x83\x8e\x16\x4c\x0c\x30\xad\x0d\x83\xf5\x90\x7b\x54\xf8\x4f\x85\x16\x3c\x50\x13\xaf\xc9\x27\xe1\xc4\x0c\x7a\x56\x6e\x59\x05\x1b\xad\x6b\xbb\x32\xba\xf2\xca\xb7\xad\x32\xbc\x3a\xc9\x9e\x0b\x35\xe3\x89\x40\xc4\xab\x39\xa1\xa3\xd8\x1f\x47\xf1\xbb\xd3\xe9\x39\xa7\xb8\xb7\x3a\x91\xa9\xc6\xda\x81\x7a\x5b\x54\xba\x2c\xb7\x59\x7c\xdc\xaf\x42\xe9\xac\xd2\x55\xb2\x06\x08\x65\xd0\x33\xbc\x91\x71\x05\x58\xc0\x86\x39\x6e\x80\xeb\x01\x9e\xc6\x2c\x77\xb5\xd1\x5b\x87\x71\xdb\x66\x5d\xa3\x71\x84\xc9\x9b\x61\x01\xf8\xe5\xc1\xde\x69\x98\xec\x99\xae\x98\x35\x52\x69\xb5\x29\x72\x13\x53\x96\xe7\xaa\xd9\xae\x30\x1f\x91\x78\x65\xd4\x01\x66\x33\x66\x4a\xaf\xf3\xc2\x52\x9a\xe1\x52\x37\xa6\x06\x55\x0a\x27\x04\x32\x1f\xbd\xf2\x51\x08\x4f\x13\x4f\x5b\x06\x3d\xa3\x0c\xa2\xc3\xee\x1c\x02\x1a\xe3\xce\xcf\x74\xe5\x64\x08\xc0\xde\x93\x3a\x71\x1a\x1a\x42\x37\x46\x43\xc6\x06\x12\xdf\xb0\xae\x10\x26\x4a\x66\x16\x44\xbb\xdc\x29\xb7\x80\xe0\x2e\xe3\x3e\xe0\xdb\x81\x5d\x86\x2a\x3b\xa6\x8e\x55\xd6\x8f\x22\xc7\x0e\xc1\xde\xc2\xb7\x51\xeb\x02\xfe\x8d\xd2\x20\xfa\x63\x9e\xec\xa0\x35\x62\xb7\xcb\x2d\xee\x25\x9c\x25\x9b\xb6\x12\xcc\x99\xb4\xd9\xe5\xba\x6c\x8a\x15\x36\x0b\xa3\x8c\x4e\x69\xde\x66\x9d\xc1\xe5\xc6\xcd\xea\x62\x6a\x40\x43\x0e\xc6\x10\xcc\x2d\xfe\x2a\x7c\x22\x8c\x9c\x96\x4c\x24\x8e\x73\x59\x53\xf8\x9b\xf3\xc7\x89\x68\x1b\x38\x79\x78\x56\xea\x1a\xd1\x66\xf2\x33\xde\x0e\xd9\x0e\xf6\xfc\xf9\xf3\xda\x86\xeb\xac\x92\x16\x5b\x82\x7d\xfd\x61\xd1\x40\xd3\xcd\x38\x27\x46\x48\x03\x02\xe2\x45\xab\x8c\xcf\x1c\x05\x11\x0e\x98\x9d\x62\x05\xd4\x65\x26\x1c\x26\x97\xa1\x3a\xa3\x50\x29\xe4\xdd\x54\xe9\x25\x7e\x1f\x9e\x9f\x05\x63\xea\x47\xa4\x03\x10\xd9\x9a\x72\x1f\x4a\xc8\x1b\x83\xaf\x68\x68\x71\x4b\x6f\x09\x7d\xa9\x73\xb4\xd8\x61\xb2\xb6\x84\xe8\xc1\xc8\x8f\x05\x3d\x73\x5d\x36\x0c\x15\x20\x69\x06\x0e\x28\xc8\xe2\x4b\x07\x3c\x45\xc9\x97\x83\x39\xa1\x67\x4d\x71\x8f\x21\x20\x3f\x11\x62\x92\x52\x5d\xec\x19\xfc\xec\x25\xe9\x39\x92\xcd\x08\x72\x2b\x0f\xf7\x74\x95\xef\x79\xf3\xab\xef\x4f\x5e\x3a\xf9\x49\xc5\xac\x08\x4c\x83\x38\x1a\x3c\x97\xb4\x75\xa0\x29\xeb\x55\xd1\xe8\x12\x46\xfb\xc1\xd6\x39\xb8\xf3\xf7\x45\x21\x1c\x3e\x95\xfb\xea\x99\xba\x20\xfa\x14\x29\xd5\xfa\x38\xa6\x04\xf6\xa5\xc5\xf2\x25\x39\xa3\xe2\xf5\x91\xf0\x46\x91\x81\xf2\xd5\x59\xa3\xc4\x58\x76\xd2\x47\xc9\x02\x39\x51\xf4\xe2\x8c\x54\xf7\x66\xeb\x27\x61\xe8\x1b\xbd\x37\xf5\x34\x23\xc8\xee\xad\x63\xbb\x51\xc8\xb9\xbe\x96\xc2\xa1\x09\xfd\x48\x66\xaa\xaf\xa3\xe4\x4b\x0c\x07\x17\x31\x1c\xbe\x07\xd7\xc8\xc1\xc3\xae\x68\xf0\x7e\x42\xb0\xb3\x95\x92\x1e\x9a\x82\x38\x4b\xdf\xf8\xd0\x5d\x05\x10\xcd\x60\x27\x70\x2e\x0b\xd0\x0e\x69\xe1\x1e\xd0\x70\xbb\xc5\x74\x39\xcc\x8f\x6b\x4c\xad\x2a\xd3\x04\x9e\x40\xb4\x0f\xc8\xd3\x8c\xf3\xa3\xd5\x35\xe2\xaa\x72\x86\x95\xc1\xe1\xaf\x6c\x42\x6e\xa5\x93\xa4\x8a\x47\xfb\xae\xec\x6c\xb6\xf6\xfa\x88\x5f\x1f\x38\xcb\x7e\x85\x6e\x3a\x97\x8b\xd8\xb0\x4c\x4b\x16\x3c\x47\x28\x3b\x83\x70\xc8\xba\xbc\x66\x82\x2e\x8e\xef\x4d\xde\x81\xbc\x25\x65\x6f\x5b\x09\xb7\x0f\x5e\x75\x21\xff\x76\xae\x91\xeb\x0d\x44\x98\x65\x5e\x3a\x96\x8c\x0f\x5f\xe1\x8d\xf9\x8c\x69\xf3\x78\x8f\xe3\x86\x95\xe7\x76\xd8\x3a\x85\x61\x14\x80\xa6\xe2\xa9\x3b\x64\x7e\x3a\x02\x76\x3a\x20\x6d\x66\x2e\x9f\xa5\x69\x16\x36\x47\x12\x1f\xbd\x65\x02\xb8\x98\x01\x48\x8a\x8b\x37\x62\xa7\x5b\xc9\x13\x10\xe7\x0e\x29\x22\x9e\x46\xad\x94\x0e\x42\x9d\x16\x35\x1e\x8d\x28\x86\xc2\xaf\xd4\xaf\xaf\x7e\xfc\xf5\xc7\xd1\x09\x4f\x6e\xd0\x0e\xaf\x75\x5d\x16\x1a\x54\x34\x70\xa6\xe0\x9f\x4f\xec\xba\x9a\x15\x70\x87\x1f\x1d\xa9\x0b\x5d\xcf\x16\xe8\xd1\xa5\x20\x1b\xfa\xad\x56\x89\x83\x5a\x2a\x90\xc2\x1d\x5d\xfb\x05\x9a\x19\x93\x53\xda\x42\xec\x2f\x30\x20\xc4\xbe\xd2\x5d\x50\x1b\x7f\x71\x04\xa2\x02\xe8\xcd\x42\xaf\xfc\xe9\x39\x3b\x3b\x53\x07\xfb\x6e\x5d\xa0\xb7\xab\x70\xfb\x87\xad\xf4\xfa\xee\x5c\x24\xbe\x71\x24\xf8\xc7\xc3\xb4\xb2\xc4\x06\x44\xe9\x96\x10\xc3\xf5\xd7\x5c\xcf\xd6\x1f\x7d\x6e\xf8\x80\x63\x0e\xfc\x33\xf0\xea\xbb\x24\x82\x0f\x42\x16\x4f\xe1\x44\x92\xd3\x47\x64\x70\xd8\x45\x30\x43\x1b\x53\x96\x30\x53\xd5\x56\x21\x5d\x51\xa4\x6a\x08\xbe\x8e\x07\xfd\xd9\x29\xfe\xec\xe8\xf9\xe0\x25\xcd\x70\x57\x08\xc4\x69\x8e\xfa\x49\x9b\x6e\x35\xd5\x40\xa3\xd7\x38\x4d\xd7\x4f\xa9\x54\x05\x5b\x63\x8a\x13\xcc\x52\x16\xd3\xc8\xa1\xda\x27\xb7\x40\xa8\x3d\x36\x69\x14\x0c\xe2\x7e\x61\x66\x13\x79\x77\xd9\xb7\xd7\xd8\x2c\x2c\x16\x12\x47\x85\xb5\xe2\xfb\xe7\x0b\x96\x09\x8f\x78\x65\x36\xad\x7b\x2e\x6e\x07\x79\xe1\x23\x74\x56\x03\xa4\xdb\xdf\x61\x66\xb9\xb2\x10\xb0\x49\x64\x77\x59\x3e\xf1\xdb\x90\xbf\x19\xb3\x51\xd7\xcb\x0e\x8b\x8c\x60\x74\xc5\x7e\x91\x58\x68\x69\x21\x5d\x7b\x18\x96\xd7\xa9\xa9\x85\xbb\x4a\x78\xdd\x69\xfb\xb1\x44\x8d\x61\x04\x40\x1d\x26\xe7\x96\xa9\x45\xfb\x4d\x3c\xd9\x1f\x5b\xa7\xb3\xc4\x97\x72\x60\x53\x74\xe9\x7e\x78\x92\xd0\xc3\x46\xe4\xae\x06\x76\x35\xf4\x75\x93\x74\x0a\x04\x7c\x5a\x4d\x6d\x0e\x17\x26\x73\x0a\x46\x2e\x0d\x5b\xcb\xfc\x39\x6a\x5c\x5e\xc2\xfe\x1b\xc4\x81\x15\x94\x70\x5d\xe1\x6d\xf3\xc4\xcb\xe6\xb0\x2d\xd4\xd6\x7f\x68\x37\x1e\xdc\x17\xda\x5f\x39\x06\xc4\x71\xb8\x32\xfe\xb1\x36\xf5\xf6\x90\xa5\x65\x72\x8b\x3f\xa4\x61\x49\xfd\xf4\x31\x15\x8b\xa6\x85\x00\x1c\x7e\x46\x02\xc1\xcf\x35\xcd\xa8\xe0\x82\xa5\x60\x07\xae\x23\xc0\x65\x61\x5b\xd8\x52\x38\xc0\x97\xe8\xe9\xd0\x95\xfa\xe9\xf9\xff\x8a\x74\x9d\x94\x96\x04\x87\xc9\x6e\x30\x53\x27\x07\x51\x4e\x70\x32\x61\x1c\x1c\xc4\x6d\x5a\x85\x13\x4f\x16\x6e\xa2\x9f\x90\x2d\xa2\xab\xe6\x10\x07\x92\xca\xef\x38\x9c\xc0\x8f\x0c\xd7\xff\x27\xd0\xc8\x76\x50\x4e\x3d\xfd\x1c\xd3\x70\x22\x90\x0a\x45\x20\x2a\xa0\xc4\x86\x4b\x54\x78\x53\x48\xda\x28\x2a\xc1\xfc\xe8\xbb\x83\x47\x00\xe9\x1b\x21\x6d\x00\x47\x21\xbe\x1c\xcf\x81\x2c\x8b\xe2\xef\x0e\x3e\x41\xff\x58\xeb\x40\x0d\xfa\x8f\xb5\x2e\xe9\x9f\xa0\x9a\x4e\x05\x0e\xce\xcb\x04\x8a\x86\x9b\x15\x92\x86\x82\xd9\x17\xd5\x1c\x71\x17\x4a\xf1\xaa\xa3\xf5\xe2\x5a\x53\xe2\x3a\x73\x02\x40\x80\xa5\x5d\x57\x01\x71\xf0\x58\xab\x4f\xb8\x1e\x60\x52\x6e\x49\x99\x6b\xdb\x1f\x64\x5a\x56\x80\x55\x27\x54\xbe\x0b\xee\xff\x96\x47\xce\x77\xa1\x2d\xed\x22\xa3\x43\x0a\x3d\x8a\xb9\x89\xe1\xb2\x7b\x9d\xde\x9f\x3d\x01\x3b\x89\xaa\xc3\x22\x3f\x48\x8a\xc8\x08\x29\xe2\x9c\x4a\x7f\x99\x17\x6e\x55\x6a\x7c\x12\x13\x26\xcd\x4a\xd7\x60\x91\xa4\x7c\xe6\x1d\x0d\x3a\x51\x37\xd0\xc7\xd9\xb6\xc6\x44\x4c\x66\x27\x63\xc2\x1a\x3c\x18\x78\x29\x46\x2f\x8d\x64\xdb\xd4\x24\xf8\x81\xad\x2f\x8a\x66\x92\xf8\xff\x04\x82\xbe\x44\xe6\xfd\x53\x49\xfa\xc0\x6f\x10\x3c\x87\x45\x75\xb7\x2e\x01\x06\x13\x19\x2d\x56\x25\xdc\x5f\x7e\x69\x21\x43\x13\x10\x13\x44\x1d\xf6\x5c\x7d\xc0\x88\x64\x02\x28\xf2\x4f\xe0\xdf\x8f\x06\xea\x1c\x59\x66\x11\x06\xc1\x73\xc3\x8e\x97\x16\x90\xa6\x90\x8c\x0f\xc3\x24\xee\xde\x07\x22\x00\x87\xa4\x29\xee\x16\x53\xbb\xae\xe3\xf2\x09\x8e\xa8\xa4\x8d\x64\x5f\xc1\xf1\x81\x13\x11\xd1\x74\xc3\x5d\x8e\x61\x86\x40\x41\x82\x2f\x61\x47\x62\x3c\x17\x46\x7a\x4c\x03\xa5\xa5\x20\xef\x50\x07\x6b\x75\xcf\x6a\x45\x29\x9f\x2e\xda\x8a\x6e\x08\xab\x8b\xf9\x08\x10\x15\x0c\x88\x26\x52\xa1\x67\x16\xda\x8d\x52\x96\x64\x44\x60\x70\xe4\x38\x51\xa8\x85\x23\xd2\x94\x0c\xce\x6a\x9f\x5a\xaf\xe0\x06\x6f\xc3\x2c\xf8\xf6\x44\x8f\xf8\x57\x42\x63\x8d\xf7\x5e\xdb\xaa\x1f\xa8\x89\x31\xc1\x5c\x38\x1e\xbc\x04\xd7\x6f\x6e\x1a\x5d\x94\x4e\x8c\x1b\x40\x23\xe0\x2d\x77\x61\x45\x5a\xa1\x06\x52\xbd\xcb\xe2\x93\x29\xb7\xe8\xef\xbb\x37\xf5\x6f\xe9\xd2\x7b\xc9\x50\x22\x89\xe9\xc2\x2c\x75\xb0\xac\x88\xf4\xb8\xa9\xd7\x4c\xa1\x2b\x8d\x08\xb0\x42\x81\xbd\xd8\xf5\xda\x0b\xf8\xc4\xcc\x6b\x9e\xa5\xb3\xc9\x09\x8a\x51\x04\x72\x00\xf9\x2d\x44\x66\x54\x6e\x3e\x03\x95\x24\xb9\x63\x95\xa9\x1a\xc2\x52\xd9\x75\xb3\x5a\x37\xca\x2d\x8c\x69\x90\xf9\x0a\x9e\x7a\x5b\x98\x32\x07\x3f\x2a\xfa\x00\x79\x86\x5d\x63\xeb\x08\x74\xe1\x4f\x8a\xb3\xd0\xba\x39\x3a\xbf\xc0\x50\x00\xe0\x25\xf3\x9e\xeb\xef\xab\x18\x98\xdd\x8f\xc2\x84\xad\x56\xfe\xcb\xf7\xa6\xf2\xd7\x59\x85\x31\x27\x34\xa1\xfa\x36\x55\xdc\x37\xbd\x8d\x41\x88\x07\x5a\xe4\xc6\xe2\x24\xe9\xda\x10\xe7\x81\xa8\x2b\x11\xef\x1a\x60\x72\x66\xe2\x7f\xb6\xcb\x13\xbf\x4a\x70\xe6\x61\xae\x1a\xba\xdb\xe6\xfe\xd8\x21\x7c\xbf\x4f\x4e\xb5\xa4\xcc\x09\xdb\x22\x64\x37\xba\xd4\x5a\x79\x48\xd6\x88\x28\x53\xfb\x26\x01\x12\x2d\x8a\x45\x81\x27\x1c\x7c\xc8\xfe\x04\x50\xbc\x2a\x65\x28\x84\x44\x51\x82\x07\x52\x83\xda\xf9\x2d\x57\x26\xe5\xcc\xa4\x6d\x73\x3c\x78\xc1\xf3\x2c\xfc\xdf\x83\x1d\x19\x25\x11\x6e\x02\x4b\x81\xf4\xad\xe8\x6c\x5c\xd5\x84\xca\xe3\xd2\x67\x80\x91\x44\xbd\xd6\x2b\x98\xab\x1d\x16\xb9\xd8\xcb\xfd\x9f\x42\x51\x84\x60\x26\x72\xd9\x75\x04\x51\xcb\x8b\xdb\x5a\x9b\xc7\xda\x0d\x08\x0d\xd7\x9b\xe4\x9f\xd8\x25\x5e\x90\x8d\x29\xa9\x13\x6c\x88\xc6\x26\x16\x7c\x57\x38\x0b\xe1\x5b\x34\x66\xd9\xd5\x4f\xbb\xf5\xe6\xa2\x50\x63\xc0\x47\x6f\xe8\x46\x02\xb5\x44\x80\x17\xa7\x29\x6b\xc7\x5e\x32\x8e\xce\x70\x59\x0e\x67\x2b\x54\xcd\xb9\xb5\x4e\x96\x42\xcf\x5c\xd1\x35\x74\x20\x2c\xb0\x8e\xc4\xa9\xe5\x35\x0b\x6c\x11\x62\x0e\x76\x0d\x7b\xa7\xb7\xb6\x98\xe3\x96\xf2\xd2\x4a\xf8\x71\xe6\xe4\x82\x6d\x79\x4c\xdb\x9c\x4d\xe1\x40\x8b\x1d\x9b\xc8\x1e\xb9\x3c\xe4\xd3\xc5\x9b\x03\x1d\xc1\x22\xb9\xc8\x6e\xaa\x58\x6e\x83\x23\xe5\xe8\x89\xae\x0c\xc7\x2b\x4b\xa9\x14\x80\x15\x10\x83\x93\xed\x20\xac\x20\xb5\x7d\x31\x78\xce\xd3\x47\x08\x49\xfc\xed\xd1\x1f\x23\x27\x4d\xc4\x0b\x31\x93\x12\x30\xf0\xe9\xe4\xa4\x94\x75\xe2\xa5\xde\x81\xbf\x82\x05\xf9\x16\x5f\xeb\xbf\x26\x4c\xa4\xb7\xae\x75\x33\xf6\xa5\x1f\xed\x92\xa7\x7d\x5e\x9f\x16\x1a\x57\xa4\xeb\xf3\x45\x3c\xb3\xcb\xa5\x57\x97\x75\x89\x25\x4c\x7d\x23\xb9\x25\x6a\x34\x22\xff\xf2\x76\x36\x5c\xaf\x76\xae\xbc\xb2\xa2\xef\xed\xba\x1e\xa8\x9b\x94\x40\xc7\x92\xab\xfc\x21\x1f\x68\x96\x40\x12\xfe\x2c\x09\x1d\xd7\xc9\xa0\x2f\xce\xd7\x5e\x3f\x09\x74\x77\x2d\xd4\x2d\xec\xa7\x24\xec\x2f\x94\xc8\xaf\x7d\xa1\x0b\x99\x7c\x42\x95\x6e\xfc\x23\x3d\xee\x1d\x27\xb8\x41\xe5\xa3\x3d\x6e\x9d\xf0\x68\x9e\x3e\x1a\x5d\x97\x28\x96\xc8\xa9\xc9\x6c\xca\xb8\xc3\x13\x6f\x24\x13\x5d\x90\x03\x85\xb2\xd9\x69\x74\x45\x05\x43\x92\xb2\x91\x76\x5d\x5f\xf7\x89\x18\x40\x87\x69\xe8\xed\xb8\xb8\x4e\xbc\x7e\x22\x9c\x2b\x59\x9a\x54\x90\xb1\xdd\x9c\xa9\xd2\x00\x7a\x35\xeb\xf8\x76\xda\x55\x91\x1e\x62\xef\xfe\x7a\x23\x7d\xd2\x40\x49\x14\x1d\x4b\x5a\x4f\x3e\xdf\x8e\x19\x2a\x1f\x67\x59\xd5\x2d\x8a\xd5\x0e\x61\xa7\x68\xed\x3b\xc5\x6a\x9b\x62\x75\x2a\xe8\x55\xff\x05\x67\xee\x5f\x98\x5e\x75\x26\x99\x55\x3b\xf3\xf5\x9d\x59\xb5\x2f\xe3\xf0\xc5\xe0\x45\xbc\x6e\xda\xd9\xbb\xad\x28\x49\x74\xc3\x81\x16\x92\xed\x4c\xdd\xb5\x75\x8f\x47\x3b\x75\x85\xb8\xc8\x48\xaa\x2e\xb1\x0a\x32\xbb\x9c\xda\xda\x2f\x83\xb6\x9e\xb1\x73\x23\x80\x83\x3e\x26\x38\xa0\x85\x51\xb3\x85\x2d\x50\x20\x61\xd0\x03\x02\x81\x15\x4a\xc2\x80\x6d\x9c\xb7\x23\x12\xbd\x74\xab\x47\xcf\x07\x2f\x91\x6e\xb5\x83\x96\x7a\x9c\x74\xb5\xc5\xb6\xfa\xdc\xdf\xac\x42\x59\xbb\x75\x06\xff\x70\xd4\x77\xd5\xf7\x10\xaf\xfa\x36\x77\x33\xaf\x52\xd4\x63\xb9\x2a\xb7\x21\x2a\xd1\xec\x28\x92\x4e\x66\x22\x6b\x56\x50\x71\xdd\xdf\xbf\x5e\x1d\x78\x50\xa5\x84\xab\x08\x09\x79\xe6\xba\x00\xca\x15\x6c\x1f\x80\x42\xc8\x99\x23\x00\xfc\x01\xd0\x40\xf9\x91\x54\x19\x09\x36\x0e\xcd\xca\x31\x65\xd1\xb8\xc0\x2b\x18\x92\x76\x11\xff\xd2\x09\x30\xf5\x5f\x6d\x5f\x0e\xe2\x21\x26\x2d\xa6\xf9\x11\xf7\xd6\xa9\xf5\xfb\xea\x29\x34\xb3\xe8\x84\x4f\xc1\x8d\x22\x9d\x21\x51\x93\x5f\x0e\x5e\x0a\xe9\x7e\xd6\x66\xa5\xed\x24\xa4\x33\xf5\x4c\xc9\x54\x75\xfa\x29\x9f\x38\x04\xa5\xa0\x71\x4f\x20\xb7\xed\xd8\xb6\x10\x84\xe8\x9b\x5a\x51\xef\xc3\x36\x8b\x0e\xf2\xa1\xff\x35\xa9\xb7\x04\x45\x9a\xbd\xc3\xa0\x28\xb5\x2c\xf4\xff\x94\x0c\x8e\x6d\x37\x68\x6a\x14\x04\x4e\x47\x02\xae\x3e\xc2\x20\x2b\x92\x7d\xcf\xe6\xa2\x3c\x50\xd0\xf7\x1b\xab\x56\x94\xbc\x12\xf2\xfb\xb9\x59\x70\x0e\x41\x76\xec\x0c\x1c\xe8\xf3\xa2\xf4\xc6\x0c\xbc\x54\x80\x77\x2e\x78\x15\x93\x0d\x95\xf8\x09\x93\xc6\x4a\x4b\xd9\xa7\x31\xba\x2b\x66\x08\x62\x8f\xb6\xde\x1e\x12\x14\x0b\x61\xcb\x81\x40\x29\x3a\x40\x4b\x6b\x3f\x61\xa5\x8c\x86\x0e\xd3\x0b\x3a\x4c\x04\x77\x06\x29\x8c\xae\xc6\x83\x60\x1b\xb3\xde\xfd\x10\x0a\xac\x9f\xb8\x95\x18\x0b\x85\x64\x7a\x39\x38\x1e\xa8\xf7\xcc\xc5\x51\xcc\xc1\x3d\x15\xce\xaf\xb7\x04\x3b\xf0\xb2\x1e\x5a\x66\x6a\xb7\xcf\xeb\x92\xf6\x4a\x70\x23\xcd\x74\xe9\x57\x83\x52\xad\xb1\x54\x4f\xb5\x4d\x02\xfd\x6b\x87\x57\xa6\xd9\xb8\x8c\x1c\x61\x90\x27\x46\xd0\x39\x47\x74\x6e\x78\x51\xc7\xcc\x1f\xf3\x19\x61\x3a\xa4\x90\xa7\x3d\xd0\x50\x7a\x1f\x9a\xa7\x09\x85\x3a\x0c\x76\x4a\x4e\x8c\x8e\xe3\x31\xfb\x5a\xb2\x0a\xdd\x32\x9a\x8b\x5b\x89\xd4\xa4\x9d\x24\x02\x60\x13\x82\x95\x48\x53\x8c\xea\x4f\xbc\x10\x1a\xf3\x99\xd8\x0a\xbd\x91\xe8\xe6\x5b\x5e\x8a\xb6\x54\x79\xc1\xc2\xf1\x04\xdd\x35\x2e\x65\xaa\xf4\x83\x3e\x1d\xde\x0c\xdf\x0c\x27\x23\x75\x39\xbc\x18\x09\xbf\x7b\x2b\x91\x0a\x77\x74\x10\xaa\x0f\xa5\x56\xf0\x30\x92\x96\x19\x8f\x0d\xb4\x00\x50\x28\x49\xec\x16\xc9\xc4\x9a\x7a\x7e\xd5\x62\xbb\x32\x75\x59\x54\xa1\x4c\xd2\xed\xf8\xac\xfd\xe8\x40\xed\xf7\xf6\x67\x9f\x3f\x1a\xd1\xfd\x0f\x35\x07\xb3\xda\x47\x4f\x1c\x5e\x72\x94\x36\x1f\x05\x10\x9e\x0b\xfa\x4c\x1a\xa1\xd3\x10\x53\xff\xdc\x44\x2a\x06\x92\x4f\xb7\xe3\xb3\x1f\x5c\x1c\x3c\xea\x08\xbc\xd0\x2f\x07\x2f\xd5\x64\x01\x20\x5d\x2f\x30\xc4\x96\x18\xee\x30\x0d\x61\x73\x7d\x6c\x9f\x5f\x38\xaa\x53\xb3\xeb\x32\x4c\x4b\x6a\xdc\xec\xae\x15\x31\x54\xfe\xb0\xd6\x10\x61\xec\xa5\x57\x20\x34\x5a\x51\x29\xb7\x2a\xea\xa2\x69\x8b\xf0\xd7\xca\xd6\xad\x02\x0a\x43\x50\x77\x74\x03\x12\xbc\x4c\xf7\xbe\x52\xac\x4e\x48\x2a\xf2\xbe\x71\xe3\xa0\xa0\xa2\x0d\x4e\x70\x50\x11\x97\x98\x2b\x8e\xca\x18\x70\xca\x0a\xf1\x85\x9a\x56\x9c\x7e\xa1\x1e\xe8\xa6\xdd\x9b\xe9\xc3\x19\x82\x8f\x21\x11\xbe\x1c\x43\x06\x68\xec\xca\x6c\x44\x1e\x80\xdb\x01\xd5\x85\x64\xe4\xf6\x88\x84\x42\x21\x28\x49\x7a\x7d\x27\x90\x8e\x2f\x85\xa4\xf3\x2b\xd3\xf7\xa5\xc2\x25\x7b\x2b\x67\x05\xfe\xc1\xaf\x23\x81\x6a\x2a\x85\xd9\x67\x16\xa5\xed\x13\xbe\x26\x74\x00\x3c\x18\x43\x7f\x30\x50\x3c\xc4\x6c\xf3\x18\xcd\x7a\x94\xef\x94\xa9\x21\x75\x9e\x27\x10\xba\xde\x59\xea\xe8\x69\x4a\xc7\xb2\x57\x45\x25\x36\x72\xd8\x51\x4f\x33\xdd\xd0\x1b\x75\xd2\x39\x08\x4e\x66\xe8\x00\xf8\x05\x73\x83\x1d\x02\x06\xec\x67\x50\x21\x72\x83\xfe\x5d\xd3\x73\x94\xfa\x3b\x0d\x27\x0f\xd3\x6a\xb6\x2a\xf7\x8a\x32\x7a\x00\x42\xf3\x39\xb6\xfe\x83\x63\x5f\x16\xa0\x5c\x99\x13\xc3\xdf\xc3\xab\x86\xa7\x53\xf7\x7c\x56\xd6\xd0\x12\x28\x09\x02\x83\x60\x30\xba\xf7\xd4\xbf\x1c\xfc\x84\x0c\x73\x70\x0c\xc5\x1a\x33\xb8\x08\xe4\x66\x88\x7b\xcb\x61\x91\xb3\x18\xa3\x03\xec\x89\xe5\x6b\x52\x18\x06\x8f\xed\x09\x16\xeb\x92\x23\x8a\x87\xd5\xe7\x6a\xeb\x83\x75\x90\x79\x95\x16\xdf\x92\x06\xf1\x4e\xd0\x7d\x48\x9f\xe9\x61\xe2\x0f\x72\xb6\x21\x72\xe2\x52\x92\xf0\x3c\xde\x76\xe2\x35\x6c\x16\xbd\xc3\x11\xd6\xcd\x6d\x37\x55\xee\xeb\x41\x03\x65\x79\xb0\x5d\x7a\x6b\xf8\x7b\xdf\x60\xe6\x50\xfd\x31\x56\x1a\x97\x16\x5a\x6a\x92\xdc\x32\x0d\x74\xff\x7c\x83\x5f\xa1\x24\xb1\x05\xa6\x4e\x8a\x23\x20\x33\xa3\x85\xe3\x4b\x52\x2f\x63\x0a\xb8\x2e\x4b\x71\xc3\x3e\xb0\x5d\x69\xb7\xbf\x52\xc3\x10\x2e\xee\x93\x39\x5d\x83\x1a\x15\xf2\x5d\x7e\xe1\xd6\x54\x52\x6d\xca\xde\x25\x0b\xf2\x0f\x22\xf2\x58\xc6\x04\xbc\x46\xc4\x9b\x15\x81\x25\xfd\xdf\x6a\x29\xd5\x68\x02\x13\x6b\xf5\x6c\xe1\xc5\x51\x6d\x74\x0e\x0a\x23\x81\x23\x7f\x93\xb1\xe8\xc0\x64\xd4\xd3\xbc\xd0\x13\x00\x24\x04\xd6\x1a\x29\x6e\xad\x48\x5c\x04\x88\xbb\xa4\x4c\x9b\xec\x29\xc4\xaf\x21\xc5\x42\x20\x34\xdb\x2f\xb7\xdf\x93\xa0\x5d\x5d\xde\xd9\xba\x68\x16\xcb\xc3\x76\x3d\xba\x9e\x5b\x27\x63\xd2\xa2\x4f\x46\xad\x57\xd0\x57\x04\x72\xce\x89\xf9\xc7\x25\x94\x4d\xc9\x1d\xbe\x63\xba\xf9\x92\xb8\xd9\xb1\x1a\x07\xc4\x75\x32\x00\xc7\x81\xc0\xcc\xc3\xc4\xd1\x5f\xa7\x83\xc3\xa0\x09\x46\x5d\x5e\xfb\xfb\x4f\xc0\x6a\xb5\x24\x5a\x17\x15\xb6\x67\xd6\x61\x02\xee\x6a\xb1\xc5\x52\xd1\x12\x99\x8a\x1a\x04\xd4\x91\xb4\x73\x22\xb9\xf2\x42\x30\x3c\x63\x72\x11\x2c\x85\x23\x67\xd8\xde\xfd\x59\xdd\xf4\xd7\x58\x69\xdd\xea\xa0\x9c\x3d\x8a\x66\x00\x3f\x16\xd1\xf0\x52\x41\x97\x03\xac\x52\x29\xfd\x6c\xf1\x20\xfe\x0c\xf3\x22\x8a\xf6\x10\x90\xe0\xc1\xb2\x2f\x4f\xcd\x45\xfb\x12\x7d\x0f\x15\x09\xbf\x74\x4a\x16\xe9\xdc\xe9\xb5\x0a\x89\x12\xbd\x2a\x06\xd5\xfa\x0c\xee\x54\xc6\xf7\xd5\x98\xd4\x8e\x99\xb8\x4c\x62\x11\x38\x21\x63\xd5\x1a\x64\xf4\xa0\x24\x38\x51\x9f\xc6\xc6\x5c\xf2\x78\x40\xaf\x75\xad\xcb\xd2\xa4\x5b\x22\x96\x13\xa2\x65\x88\x1c\x91\x7f\xf9\xdc\x1e\x68\xb5\x3f\x8e\x98\xdd\x90\xdc\x72\x18\xe1\x0d\x82\xda\x4a\x6c\x8e\x97\x7e\xa7\x81\xd9\x44\x37\x3a\xc8\x4a\xf4\x54\x7c\x61\x36\x5d\x07\x11\xde\xa9\x0b\xd4\xd3\xc3\xb6\x69\xa6\x5b\x7e\x03\xc6\x08\x8b\x63\x32\x37\x6d\xb3\xad\xfb\x1a\x4a\x69\x44\x20\xc3\xbe\x13\xe7\xe7\xdf\x66\x03\xaa\x03\x5d\xa9\xfd\xdb\xaa\xee\x5b\x58\xa9\x02\xb0\xa9\x79\x03\x8c\x62\x3d\x8f\xc3\xe4\x88\x12\x0b\x22\xdd\xae\x4b\x26\x09\x3a\x14\x15\x1f\x29\x99\x4a\x8c\x38\x88\x7a\x56\x50\x58\x5e\x4f\x29\xbe\x80\x65\xa3\x9f\xae\x2b\x7a\x89\xbd\x6e\x16\x7e\xf3\xce\xc0\x9c\x32\xd5\x7d\x51\xdb\x0a\x31\x91\x53\xb3\x28\xc0\x73\xb2\xd2\xce\x6d\x6c\x9d\x23\x9e\x99\xf4\x9c\x60\xaf\x13\xc0\x8c\xb3\x2d\x28\x42\x98\xd6\x66\xf5\x1d\x64\x0d\xfb\xe9\x7b\xe4\x91\x2d\xf2\x57\x88\xa8\x97\x83\x5f\xa8\x37\x14\x56\x67\x9a\x8d\x07\xaa\x9d\x45\x67\x52\x4a\x4c\x9a\x54\x38\x5f\xb4\xa2\x10\x51\x22\x3d\x9e\xc6\x47\xd3\xd2\xeb\xc2\xb1\xfe\x4f\xb6\x32\xca\x94\x49\x92\xf2\x1f\x25\x6f\x8d\xfb\xe8\x49\x44\xa7\xed\xf2\x7b\xd1\x1c\x82\x9a\x19\x05\xe9\x73\x44\x74\x87\x21\xa9\xc0\xf0\x84\xc9\xf6\x75\x9e\x12\x51\xa6\x52\xc3\x9b\x33\x3c\xf7\xc4\x96\x27\xf7\x48\xd8\x6d\xb0\x31\x10\xad\xd6\x9f\x5a\xcd\xbd\x73\xb6\x34\xe5\xb6\xd3\x41\xc0\x5e\x24\xa5\x1d\x77\x1a\x01\xa0\x38\x72\xcc\x35\x06\x83\xc8\x11\x8d\xfd\xa9\xc9\xa9\x9f\x5c\x6d\xad\xb2\x71\xcc\x96\x2a\x6b\x24\xf2\xb4\xf7\x96\x66\x88\x47\xc2\x7f\x76\x3e\x2f\x80\x22\x75\x87\x97\xe0\xa7\xc1\x73\x75\x61\xeb\x00\x4b\xc7\xdf\x1d\x25\xbf\x23\xbd\xc8\x19\xd6\xda\x00\xd0\xbe\x14\x4f\xb4\x35\x58\x9e\x76\xe4\xe3\x8b\xec\x6a\x24\xd2\xd0\x25\xd0\x77\xcd\x35\x56\xd9\x08\x68\xf3\xa6\xda\x32\x84\xd0\x31\xd0\x21\x8a\x83\x50\x85\x07\x23\xda\xa4\x9a\x0e\xeb\x6e\x51\x87\x24\x03\x54\x94\x8b\x08\x1f\x69\x59\xf3\x29\x6c\x42\xb3\x67\x9c\x99\x55\xe7\xad\xf1\xb7\xa1\x03\x00\xf4\x12\x4f\xb4\xaa\x47\x85\xb0\x74\x3b\x62\xb6\xa3\x6c\x84\x8d\x99\xda\xe0\x89\xd4\x9b\xe8\xf5\x7d\x5a\x36\xee\xeb\xa4\x4c\x5b\xff\x30\x5a\xaf\xf9\x7d\xa0\x1f\x61\xb1\x74\x2d\x6f\x75\xbb\xe6\x08\x59\xb9\x54\x3f\x07\x8f\x8f\xf8\x60\x07\xdf\x8d\x44\xc1\x71\x0e\xa1\xb6\x04\x44\xc7\xd2\xd9\xfc\x66\xd3\x94\x9a\xf9\xdd\x9d\x10\x0c\x02\xb9\x1b\xea\x14\xce\x9d\x0e\xfa\xd1\x19\xf6\x43\x9e\x4a\x67\x19\x6c\x8f\xda\x40\x48\x01\xc1\xa5\xdd\x49\x63\x88\xb7\x86\x1c\xa3\x4e\xc2\x06\xab\x08\xd7\x08\xd7\xa8\x02\x86\xc2\x75\xc8\x9a\xe2\x15\xec\xcd\x1c\x06\x65\xee\xda\xe8\xec\x9a\x95\x1d\xf2\xdd\x45\xff\x91\x5b\x4f\x5d\xe1\x7a\x70\xfb\x81\xd8\x26\xf9\x34\xd5\x7f\x78\xae\xde\xea\xc2\x9f\x4a\x5d\x02\x26\x2e\xbc\x84\x46\x56\xac\x20\xdf\x65\xa6\x81\xfb\x1d\xe1\xb0\xaf\x00\x2f\xd1\x6b\xc0\xa1\x16\xd0\x77\x21\xa0\x58\x08\x37\x23\x98\x16\x31\x6d\xa5\xa4\x53\x4a\xa6\x70\xd5\x2e\x42\x94\x84\x18\x43\x1d\xa6\xc4\xb7\xf5\x10\x59\x66\x82\xd1\xe4\x91\x76\xae\xd8\x31\xd1\xef\x73\x76\x50\x12\x15\x10\xc9\x20\xe0\x97\x01\x90\x6e\xe4\x72\x88\x0e\xc5\x39\xf3\xef\x34\xa1\xb0\x96\x4b\x02\x0c\x6d\xdf\x57\x51\x96\x6b\xd7\xd4\xa2\xe6\x9c\x01\x17\xcc\x1d\x66\xd1\x14\x28\xd4\x67\x00\x66\xd1\xf5\x6c\x81\x2b\xf4\x60\xc4\x02\x3f\x81\xbe\x5f\x33\x5b\xd7\x9c\xf8\x59\x05\xa0\x53\x8d\x97\x28\x9c\x3a\x2a\xde\xb3\xaa\xed\xcc\xe4\x8c\x7d\xa5\x98\x49\xb2\x5d\xe6\xfe\xbf\xd6\xc2\x78\x20\xd8\x85\xb9\x03\x17\x5c\x6d\x66\xf6\xae\x02\x07\xb4\x48\x7b\x04\xa4\x2c\xcd\x39\xd8\xf5\x94\xd1\xc1\xfe\xe8\x04\x63\x40\xbc\x01\xc9\xda\xf3\xe6\x3d\x7e\xf2\xa6\xb3\x73\xff\xde\x7c\x5d\x46\xca\x37\x9a\xae\x14\x97\x6b\x9e\x92\xb7\x9a\x29\x73\xaf\xcb\x35\xe8\xe7\x94\x50\x0b\x73\x57\x8a\xb4\x5a\xfa\x45\x16\x54\x97\xb0\xbe\xfd\x74\xae\x91\x05\xa6\xdf\x23\x24\x9c\x1d\xc9\x49\xec\x64\x5c\x64\xca\xa5\xd9\x5d\x87\x7f\x4d\x1e\x2f\x17\x7d\xf8\x26\xf9\xbc\x3f\x0f\x9e\x3f\x5c\xfc\xe8\x67\x02\x6c\x49\x13\x30\x64\xdc\xb5\x2b\x9e\xed\x6b\xa7\x0a\xb7\x9f\x10\xe3\xa3\x52\x4e\xac\xbf\x64\x8e\x7c\x2a\xaa\x3c\xe3\x4c\x75\x02\x79\x65\x58\xa8\xce\xa0\xe9\xc5\xbc\xb9\x53\x46\x6a\x9a\x4c\xcd\xd6\xae\xb1\xcb\x4c\xcd\xec\xba\x46\xb1\x14\x4e\x8b\x3f\xc9\x40\xd2\x05\x5c\xa8\x83\x4e\x45\x4b\x4c\xb6\xe5\x72\xca\x98\x21\x08\x5e\xb3\xb2\xe4\xcf\xca\xf2\xca\x48\xe7\x2b\x71\x61\x45\x53\x52\xb6\x80\x3c\x53\x80\xb4\x58\xd7\x7a\x16\x50\xa4\xa5\x69\x4c\x05\xa3\x01\x1f\x38\x10\xc1\x63\xdd\x4b\x3d\xa5\x7f\xce\x95\xa9\x6b\x5b\xbb\x4c\xcd\x8b\xc6\x3f\x8b\x3b\x59\x82\x6e\x68\x4b\x67\x6a\x69\xea\xd9\x42\x57\x0d\x99\x73\x59\x42\xdb\xda\x47\x52\x98\xde\x7b\x02\x98\x4a\x7b\xae\x33\xd6\x0c\x49\xf4\xa0\xcc\x39\x3f\xc8\x0a\x7b\xc8\x1f\x61\x2a\xf7\x5f\x06\xcf\x93\xb2\x46\x73\x60\x60\x86\xae\xe1\x9f\x93\xdc\x0d\xe0\x5f\xe6\xbf\x47\x82\x7a\xc2\x21\x53\xae\x02\x28\xf4\xa2\x86\x3a\xd6\x09\x6b\x01\x4b\x91\x81\x84\x3d\xe4\x28\x94\x23\x36\x90\x5a\x72\x08\x5d\x8c\x5f\x9c\x03\x83\xaf\x83\xe5\x44\x3e\xe6\x78\x96\xfc\x06\x5d\x98\x0a\xfe\x63\xa6\xd7\x04\x81\xa1\x5b\x93\xf0\xe8\x6b\xd7\x87\x37\x89\x08\xd9\x68\x07\xe1\x0b\x7c\xe1\x66\xdc\x3c\xd6\x97\xc4\xd6\xa9\xcd\xb9\x06\xd2\xb6\x58\x84\x40\xb5\xa9\xf3\xb1\x20\x1b\x99\x27\xc9\xe2\xc5\x91\x3d\x4a\xd1\x02\x08\xe7\x2e\x4f\x75\x96\xb2\x54\x67\x6a\xb5\xae\x8a\x06\x32\x5f\xe0\xea\x30\xcb\x55\xa9\xeb\x48\x90\xcd\x9e\x7d\x9c\xc5\xb9\xaa\xcd\xbd\xa9\xd6\x06\xf3\xac\xfc\x57\x9a\x62\x56\xac\xb8\xe4\xd0\xbc\x60\x5d\xaa\xb4\xae\x51\xd3\xb5\x2b\xfc\xf6\xee\x0c\x85\xe3\x71\x90\x27\x59\xb4\x86\x1f\x0a\x20\x33\xfb\x1d\xcd\x0f\xaa\xc1\xc1\xa9\x01\x3d\xa3\x6e\xd2\xd6\x3c\xf6\x36\x40\x9c\xa3\xbe\xad\xc6\xfb\xab\xa0\xe4\x5a\x9e\xb0\xff\x8f\xbd\x77\x4b\x6e\x23\x49\xd7\x04\xe7\x59\xab\xf0\x86\xd9\xb4\x08\xb3\x20\x44\xea\x96\x95\xa9\xb6\xb6\x81\x80\x20\x85\x2a\x10\xe0\xc1\x45\x4a\x9e\x97\x6e\x27\xe0\x20\xa2\x14\x88\x40\x85\x07\x48\xa1\x9e\xce\x1e\xce\x16\xc6\x6c\x6c\xb6\xd1\xb3\x93\xb3\x92\x31\xff\x2f\x7e\x89\x08\x80\x54\x56\x66\x56\x9d\x6a\xea\xa1\x2a\x49\x02\x11\x7e\xf7\xff\xf2\xfd\xdf\x27\x88\xf7\x0a\x4a\x69\x90\x0d\x63\x95\x64\x32\x83\xbb\x1a\x3a\x1f\xca\xeb\xe2\xf7\xdd\xcc\x6e\x0b\x28\xc4\xcc\xd4\x5d\x9a\xdc\xe1\x2e\x3f\x3c\xc3\xd0\xdc\x1f\x3b\x67\xbe\x9a\x95\x40\xf9\xcb\x23\x9a\x9e\xf8\xa5\x73\x00\xb4\x1c\x51\xa7\x3a\x5e\x25\x55\x91\xbb\xb2\x1a\x3b\xba\xa1\xd0\x3f\xd9\x40\x4d\x4f\x69\xe3\x4d\xfe\xa1\x4e\xc8\x29\x3a\x1a\x8e\x06\xec\x98\xbf\xa4\x2e\x87\x75\x24\x30\xf4\x14\x86\xa7\xa6\x2c\xe0\x2f\x20\xb7\x3b\xa2\xbc\xf5\xfd\x7a\x5b\xf8\x91\x1d\xeb\xd5\x1c\x12\xd6\xaa\xc4\xfd\x6a\x8a\x39\x55\x28\xc2\x1f\xea\x08\xab\x8a\x1a\xd7\x0f\x91\xf8\x43\x24\x7e\x84\x49\x3a\x3f\xfb\x7e\x35\xae\x1f\x71\xfb\xf8\x71\xac\x24\xf3\x80\xcc\x47\x82\xdb\x65\x4d\x59\x12\x5c\x45\x2b\xb1\x56\x5f\xd7\x84\xe0\xfc\xb1\xf3\x46\xcc\x6b\x6a\x4f\x95\x6a\xbb\xce\x79\x54\xd3\x38\xa8\x08\x0b\x35\x96\xdc\x39\xb3\xf6\x00\x8b\x00\xb6\xe0\xad\x98\xa8\x24\x0b\x40\x1b\x1c\x1f\x1a\x20\xc0\x73\xa1\x24\x05\xad\x9a\x46\xe3\x09\x55\x89\x50\xc6\x5c\xe0\x52\x38\x42\xcb\x91\xb0\xfc\x0f\x35\x67\xe9\x39\x52\xd7\x2c\x69\x81\x24\x77\x9e\x42\x47\x99\x7b\xf5\x63\xfe\x24\xef\xb2\x32\xc1\x7c\xea\xfb\xb3\xd2\x1c\x95\x7b\x21\x57\x25\xf8\xd8\xda\x59\x89\xd8\x25\x2f\x8c\x72\xcd\x0f\x4b\xf7\x7c\x86\x3d\xfe\x7d\x16\xff\x71\x61\x2c\x0f\xbb\x6a\x8e\x0a\x88\x93\x55\x8c\x45\x2f\x75\xbd\x08\xdf\x9b\xac\x9e\xf2\x7d\x9e\x07\xcb\x02\x42\xeb\x84\xd8\x0f\x56\x49\xa1\x4b\x17\x90\x0e\x4f\x1e\x56\x23\x5f\xb9\x6f\xd7\x8e\xca\x1a\x51\x49\xc4\xaa\x36\x62\xb1\x23\x8c\xb0\xfb\x36\x8a\x00\x94\xb9\x78\x73\x66\xc6\x4a\xd3\x60\xc1\xcc\xc3\x6b\xb7\xf6\x04\x23\xd0\x22\xc7\x32\xe8\x78\x7c\x74\x42\x1d\x7b\x18\x6f\x50\x95\x26\x77\x9c\x7b\x01\x79\x59\x2f\xb6\x0d\x81\x42\x64\xe2\x74\xc7\x4b\xed\x58\xa1\x4d\xf0\xee\x57\x52\xbe\x3b\x58\x3b\xf3\x34\xf5\xbb\xc7\x4a\x68\x3a\x62\x02\x2f\xab\x51\xeb\x3c\xfa\x3a\xf3\xae\x2d\x7f\xad\x4a\x14\x15\x3c\xca\x9e\x5f\xff\xb4\xca\x79\xe7\x67\x9d\x33\x71\x89\x62\x26\xf4\xf3\xf9\x93\xe4\xd7\xd6\x2a\x75\x6a\x34\xcd\x4a\x6c\x8c\xe8\xb0\x60\xc1\x5f\x41\x75\xed\x31\x8b\xc6\xf4\xdf\x9c\x41\xf8\xf5\x40\x31\xa8\x8e\xbb\x65\x19\xb2\x9a\x48\xda\xf2\x29\xda\xc6\xa0\x8b\x83\x43\xf6\xba\xca\xf7\x83\xe6\xe1\x2f\x95\x1c\x6b\x90\x2b\x6d\xa2\x09\x19\x94\x8c\x03\x47\x17\x56\xc9\x22\x4d\x54\xf1\x2b\x08\x92\x05\xd7\xe2\xf9\x59\xe7\x8d\x6f\x0d\x3c\xd5\x12\xb0\xf5\x50\x6c\x77\x67\xe0\x37\x93\x0e\x91\xbb\x51\x0e\x66\x40\x89\x5c\x03\x50\xe0\x14\x2a\x70\xb6\x6e\xcd\x86\x3e\x3f\xeb\xbc\x15\x3d\x5b\xfe\x06\x8a\x4e\xc1\xac\x94\xa0\x3a\xe4\x84\xab\xd0\x82\xc5\x15\x80\x6c\xe6\xee\x5a\x49\xe5\x83\x3e\x1e\x57\xff\x25\xe2\x56\xbf\x9a\xc4\x54\x13\x3f\xe4\x23\x52\x5c\xbf\x58\x93\x0a\x0b\xfe\x9b\x45\xa9\xbc\x82\xbd\xf0\x7c\xc8\x44\x5e\x2c\x11\x18\xb7\x51\xea\x48\xa6\xfb\x59\xa1\xe5\xf7\xfe\xd7\x79\x75\x73\x3d\x3c\x3d\xef\x9c\xff\x76\xf2\x2f\x8f\xe8\xbf\xbc\x3e\x7f\xfb\xfe\x5d\x45\xff\xe5\xfc\x87\xb3\xf3\x67\xfd\x97\xdf\xe3\xdf\x8d\x5c\xe7\xf9\x7f\x21\x60\xac\xdb\xe6\x9f\xa9\x38\xe5\xbc\x73\x2e\x4e\x6e\xae\x87\xed\x17\x70\x78\x36\x7e\x5a\x9c\xc0\x16\x6e\x75\xf9\x62\x69\xb1\x16\x0c\xb0\xbf\xb9\x0b\x0f\x41\x52\x24\x1f\xa1\xbd\x53\x80\xd4\xb7\xe1\x00\xa5\x57\x0c\xb2\x45\x07\xc1\x6b\x29\x56\x9a\x31\x06\xdc\xb4\x6a\x2d\xef\x41\x37\xad\x04\x45\x86\x6c\x91\x6c\x65\x4a\xa0\x1f\xe3\x77\x50\x6c\x49\xc8\x52\xfc\x70\x76\x2e\x2e\xc0\xda\xef\x52\x74\x6a\xba\xcb\xb2\xfd\xbd\x34\xf6\x48\x4f\xa6\xc9\x2a\x2f\xb2\x44\x8a\x1f\xdf\x9e\xfd\xe1\x47\x71\xd2\xc2\xb7\xb7\xda\x78\x15\x90\xeb\x2e\x74\xbe\x2a\xb1\xdc\x0d\x05\x18\xee\x13\x29\x96\xf9\x43\x96\xe6\x72\x19\x44\x5d\xc5\x49\x6b\x4a\x9f\x6d\xb5\x3b\xe2\xe3\xde\x23\x9b\xe5\x3f\x44\xe6\x11\x11\xd1\xa4\x32\xd5\x0e\x26\x85\x14\xb2\x84\x9e\x00\x85\x63\xdb\xb1\x5b\xd5\xcf\x4b\x3b\xd6\x9d\x17\x83\xcc\x0a\x04\x04\x65\x32\xa4\xc7\xb9\x2d\xf2\x4d\xc2\xd5\x29\x96\x6d\xba\xd1\x7c\xd2\x0a\xc0\xa9\xe5\x1a\x25\x1a\xa2\xc0\x32\x39\x20\xd7\x20\x2e\xcd\xa1\x8f\x69\x39\xbe\x93\xbc\xa8\x14\x7c\xe6\x5c\x9c\x7e\x17\x6d\x4f\xd7\x09\xe1\xd2\x6a\x30\x36\xcf\xed\x3e\x64\xee\x89\xfc\x24\x25\x85\xeb\xa9\xaa\xda\xd7\xf0\x2e\x55\xa1\xb4\xbd\xe1\xe9\xf5\x6e\x2e\xe4\x71\xce\x1f\xf3\x23\x33\x48\x4b\xbf\x34\x83\x88\x93\x9c\x6a\x91\xb1\x4d\x12\xb3\xaa\xd4\x37\xb5\x80\x94\x04\x06\x0c\xad\x08\xb3\xff\x5e\xf8\xdb\x95\x0f\xab\x71\x71\x32\x3f\x25\x59\x1d\x0e\xa8\x05\x5e\xcb\xec\x4e\x61\x24\x97\xae\x61\xf8\x01\xd2\x08\x45\xb2\xbc\x0b\x54\x57\xed\x1b\x7d\x74\x0e\xec\xce\x96\xff\xfe\x0f\x2d\x27\x24\x8f\x04\x41\x29\xfa\xc6\x72\x59\x1b\xb4\x0a\xd8\xd1\x96\x02\x92\xbc\x62\xed\xcd\x56\x03\x32\x78\x63\xa7\x65\xd7\xc7\x6b\x71\xea\x5b\x94\xe1\xce\x60\x32\xf1\x4c\xdc\xaa\xb5\x4c\x57\x5c\x2c\xe3\x4e\x03\x9b\xae\xc4\xed\x13\x61\x50\x69\xe7\x40\x42\xb6\x25\xe4\xa0\xf9\xcd\x30\xad\xab\x52\x07\xd0\xf1\xe2\xe0\x09\x09\x29\x0f\x27\x19\xa9\xe6\x57\x5e\x4f\xfb\x96\x6b\x48\xdc\xe6\xc4\xe0\x0c\x13\x92\x51\x9d\x09\xd3\x60\x13\x82\xf0\xc8\x03\x13\x3b\xc2\xac\xff\x11\xf8\xa7\xd5\x04\x76\xf5\x64\xe0\xf1\x7d\x23\x4e\xed\xea\x3a\x3a\x16\x00\x4f\x74\x2b\x16\x10\x0c\x50\x30\xbf\xc8\x97\x8a\xc8\x9b\xbc\x92\x87\xe5\xe3\xe4\x00\xc1\xda\x5d\x36\x95\x3c\x73\x62\x2c\x2c\xfe\xb7\xdf\x43\x87\x84\x90\x63\x3e\x2e\xfa\x4b\xc5\x51\xf9\x85\x9d\x39\xd2\x64\xbc\x03\xfc\x3c\x57\xa0\x3d\x85\x24\x89\x0e\x93\xed\x3e\x88\x67\x56\x93\x27\xc5\xa3\x0f\x6c\x35\xa4\x78\x94\x17\x4b\x64\x56\xc9\xec\x0e\x08\x22\x1f\xc1\x31\xe1\xdb\xe4\xfe\x31\x99\xef\x44\x0b\xdc\x08\xdb\xc4\x75\xae\x74\x0b\x52\x07\xd8\x1c\x9f\x8f\xda\xf3\x2a\xcd\x37\xe1\x58\x85\xf9\x59\x53\x5e\xb0\x19\xd8\xe8\x8f\x04\xd7\x59\xd0\x79\x88\x0b\x10\xa6\xa9\x72\xac\x1d\x55\x2f\xf5\xfa\x7d\xbc\xf9\x61\x51\x99\x0e\x2f\x93\xc0\xb7\x71\x0e\x7e\x18\xd1\xfa\x81\x2b\xb1\x29\xf6\x82\x68\xab\x65\xa2\xb7\xa0\xc2\xd3\x34\xae\xe4\xaf\x1d\x7b\x5b\xbe\x12\x2b\x65\x6e\x5e\xa4\x5a\x2d\x51\x1c\x6a\x47\xe9\xfa\x2c\x07\x24\x63\xe6\x59\x1a\x6e\x57\xbe\xfd\xe5\xbb\x92\xee\x1a\xb4\x3d\xb0\x71\xcd\x3b\x14\x80\xf6\x6c\xc5\x78\x35\x49\x48\xd4\x1e\x50\x6c\xfa\x4d\x08\x0f\xc8\xa6\x8d\x23\x64\x9a\x5b\xc2\xf7\xc7\xf6\x30\x42\x21\x9a\x42\x6b\x87\x5e\xaa\x1f\xef\x25\xb3\xe1\x90\x11\xe0\x53\x20\x23\xff\x0b\xf8\xfe\x51\x03\x00\x9b\xa2\x16\xf5\xcc\xcb\x61\x23\xcb\x6c\x57\xbe\x6c\xbd\xe1\x45\x24\xd4\xad\xce\xd3\x5d\xa9\xd2\x3d\x89\x6b\x61\x0d\x4a\xb6\xaf\x84\x1a\x61\xfb\x90\xd8\x2d\x9c\xf9\x07\x47\x1c\xef\x57\x88\x58\x7a\xc2\x02\x6e\x59\xc2\x77\x48\xa4\x86\x6e\x74\x33\x1d\xca\x6a\xd7\x99\x5f\xd2\xb6\xb1\x64\x09\xf0\xca\xb4\x8a\xd9\xb1\xe0\x73\x6f\x71\xc0\x2b\xeb\x74\xe1\xbc\x33\xbd\xb5\x50\x5d\x3a\x1e\xfd\x0f\x9d\x3a\x8d\xdb\x2a\x2f\x8e\x3f\xb3\xb6\x03\xfc\xe7\x9a\xce\x6a\xeb\x45\x04\xec\x40\xe7\x9d\x37\x6e\x7b\xbd\x03\x99\xa5\xe0\xbd\xb6\xd7\x90\xdc\xf5\x72\x4f\x28\x74\x60\x77\x98\x31\x7e\xb4\xab\x49\xc6\xc0\x5d\xba\xc7\x2f\xe4\x0f\x19\xe9\x51\x24\x1d\xd5\xe1\x43\x85\x90\x15\x7e\xa9\x2a\xd8\x43\x79\xd1\xb8\xdc\x99\x83\xd7\x7c\x27\x58\xf7\x6d\xcf\xa8\xc5\x65\x03\x39\x85\x75\x9e\x5b\xbe\x55\x31\xdd\x6d\xcd\x73\xcd\x4f\x6c\x1e\x03\x65\xbb\xa7\xc5\x0c\x66\x06\x6d\x7b\xcb\x28\x2f\x34\x7e\x11\x22\xb3\xdb\x25\xa6\x76\x29\x49\x3b\xca\xcb\x35\x49\x51\x57\x26\xcb\x1e\x97\xf4\xae\x32\x37\x03\x02\x1c\x60\x16\xc6\xe1\x65\x86\x39\xe7\xe6\x02\xe1\x8a\x6c\xd4\xca\x18\x10\xdb\x96\x18\x64\xa5\x82\xc4\xab\x31\xf6\xae\x8b\x7c\xab\x8a\x72\x4f\x51\x2c\x9a\xcc\x37\xe0\x41\xd4\x04\xa5\xf1\xad\x75\xf2\x29\x1c\x41\xdf\x07\xf0\x56\xc8\xb9\xb1\xe9\x2d\xb6\xd3\xe6\x6b\x91\x75\xf8\x56\xc9\x82\x94\xf5\xbd\xd5\x4c\xf0\x54\x59\x20\x50\x0d\xd5\xa0\x7d\xa5\x6e\xcf\x62\x20\x5c\x87\x6d\x14\xc8\x4a\x00\xb0\x86\x09\x11\xd5\xb7\xb5\xdc\x69\xfa\x6f\xc8\x3d\x20\x4d\xb7\x87\xdc\xe9\xa6\x8d\x30\x73\xd0\xbe\xf4\x06\x6b\xcb\x83\x65\x15\x41\x79\xc5\x36\x93\x72\x35\xee\x45\xf3\x71\xf2\xae\x02\x92\x2e\x22\x3e\x3c\x85\x93\x8f\x18\x88\x9a\x4e\x6d\x32\xfc\x83\xed\x0a\x99\x51\xa8\x3a\xf6\xce\x4a\x42\xf7\x12\x4a\x1d\xab\x5e\xa3\xc0\x79\x6b\xa0\xec\xb5\x4c\xc4\x78\x90\xc9\xd2\xdd\x20\x01\xd5\x11\x51\x07\x04\x2a\xf8\xce\xff\xf0\x8c\x36\x56\xff\x83\x9a\x7d\xb9\xdd\x2a\x59\x54\x3f\x5f\x51\x3a\x72\x58\xad\xe2\xde\x65\x90\x1b\x1a\x62\x8b\xe5\x51\xc2\xc4\x23\x51\x26\xb1\x70\x6a\xab\xfa\x96\xe8\xd2\x95\x0f\x81\x58\x1d\xb8\xa9\x2b\x8a\x5f\xd4\x76\x09\xd1\xd2\xd1\x79\x56\x3b\xc3\xd1\x7c\x33\x03\xed\xb0\xe2\x3b\x4a\x4b\x83\xd4\xf9\x4b\x4d\x8a\x94\xa6\x15\x0e\x0f\x07\x8d\x8b\x04\xd7\x75\x62\xfd\x87\x39\x49\x7c\xd9\x89\x26\x32\x8a\x37\x9d\xd7\x54\x14\xe4\xe1\x01\x4d\xcb\x1d\x58\x10\x58\x5b\x3f\xc5\x62\x3a\xbe\x98\x7d\xe9\x4e\x62\x31\x98\x8a\xeb\xc9\xf8\xf3\xa0\x1f\xf7\x45\xab\x3b\x15\x83\x69\x4b\x74\x47\x7d\xf1\x65\x30\xfb\x34\x9e\xcf\xc4\x97\xee\x64\xd2\x1d\xcd\x6e\xc4\xf8\x42\x74\x47\x37\xe2\x4f\x83\x51\xbf\x23\x6e\xba\x9f\xc6\xe3\xff\x22\xae\xba\x7f\x8a\xa7\x62\x34\xe6\x4f\x0d\xe2\x69\x24\xbe\x7c\x8a\x67\x9f\xe2\x89\x88\x7f\xbe\x9e\xc4\xd3\x69\x24\x06\x57\xd7\xc3\x41\xdc\x8f\xc4\x78\x22\xa6\xb3\xee\x6c\x3e\x1b\x4f\x6e\xc4\x24\xbe\xec\x4e\xfa\x83\xd1\xa5\xf9\xf5\x24\x1e\x76\x67\xe6\xbf\x67\xe3\xa0\x79\x1d\x31\xbd\x8e\x7b\x83\x8b\x41\xaf\x3b\x1c\xde\x44\xfc\xde\xfe\x18\x5e\x6b\x5b\x27\x66\x9f\xba\xb3\xb0\x5f\x5f\x06\xc3\xa1\xf8\x18\x8b\x78\x32\x19\x4f\xc4\xc5\x24\x8e\xcd\x7b\xe0\xb7\xd7\xf1\xe4\x62\x3c\xb9\x12\x83\x91\xe8\x8e\xc4\x7c\x34\x18\xcd\xe2\xc9\x64\x7e\x3d\x8b\xfb\xe2\xaa\x3b\x1a\xc5\x93\x0e\xb7\xe3\x72\x12\x77\x67\xf1\x74\x26\xe2\x9f\x67\xf1\x68\x26\xba\xc3\xe1\xf8\x4b\xdc\x17\x1f\x6f\xc4\xb0\xfb\xc5\xb6\xc7\x6f\xa4\xe8\x0f\xa6\xbd\x61\x77\x70\x35\x35\x9f\xe6\xce\x7b\x23\x64\x46\xf2\x2a\x9e\xf4\x3e\x75\x47\xb3\xee\xc7\xc1\x70\x30\xbb\x89\xc4\xc5\x60\x36\x8a\xa7\x53\x71\x31\x9e\x88\xae\xb8\xee\x4e\x66\x83\xde\x7c\xd8\x9d\x88\xeb\xf9\xe4\x7a\x3c\x8d\xc5\x49\xfc\x39\x1e\x89\xc1\x05\xbf\xf2\x53\xb7\x2f\x3e\xc6\xe6\x57\x23\xd3\x99\xb8\x6f\x1e\x3b\x9d\xf7\x3e\xf1\x37\xda\x11\xcc\xe3\x68\x3c\x1a\x8c\x2e\x26\x83\xd1\x65\x7c\x65\x7a\x60\xe6\x55\x4c\x62\xd3\xe2\x59\x75\xb4\x23\x98\xe1\xab\x71\x1f\xfa\x32\x1b\x8c\x47\x53\xf3\xf7\x49\x3c\x1b\xdb\x35\x51\xfd\xee\x7c\x1a\x9b\x37\x9b\xff\xbc\x18\x4f\xe2\xcb\xf1\x60\x74\x49\xf5\x3c\x15\xd4\xe1\xd0\x47\x1d\x0e\x46\x66\xd9\x98\x3e\xcd\x70\x52\xa8\x5b\x1f\x63\x31\x1c\x74\x3f\x0e\x63\x1c\x89\x91\x19\xce\x49\xdc\x9b\x45\x62\x30\x72\xff\xd5\x1b\xf4\xe3\xd1\xac\x3b\x8c\x70\xe4\xcd\x7f\xc4\x3f\xc7\x57\xd7\xc3\xee\xe4\x06\x96\x59\x6f\x3c\x9a\xc6\xff\x32\x8f\x47\xb3\x41\x77\x28\xfa\xdd\xab\xee\x25\x0e\x3c\x2f\x61\x71\x32\x18\xf5\x86\x73\x58\x7f\xbc\xd4\x87\x83\xab\xc1\x0c\xba\x2d\x86\xe3\x29\x7c\xfc\x7a\x32\xbe\x18\xcc\xa6\x91\xfd\xc5\x7c\x1a\x47\xe2\xe3\x7c\x3a\x80\xd9\xb2\x2b\x67\x30\x1e\xb9\xcf\xf4\xbb\xb3\x6e\x24\x7a\xe3\xe9\xcc\xfc\xd4\x1b\x7f\x8e\x27\x6d\xd3\xe1\xde\x78\x34\x8a\x7b\xf0\x7c\x18\x49\xd3\xc1\xc9\x60\x0a\x5b\x60\x0e\x9f\x6d\xd8\x09\x17\xf3\xc9\x68\x30\xfd\x34\x18\x5d\x46\xbc\x70\xbb\xa3\x1e\x2c\x66\x6f\xe8\xed\xb2\xa7\x41\x1b\xc3\x0e\x9c\x0c\x2e\x3f\xcd\xa6\xe2\xd2\x2c\xbc\xb8\x2f\xcc\x4c\xce\x47\xfd\x78\xe2\xf6\x68\x77\x38\x8c\x2f\xe3\xbe\xe8\x4e\x45\x57\x7c\x9c\xc4\xdd\xde\x27\x6c\xf3\x68\x36\xe9\xf6\x66\xe6\x71\xb3\xf1\x64\x36\x18\xcf\xa7\xe6\x97\xfd\x39\x8d\x3f\x8d\xdc\x28\xbe\x1c\x0e\x2e\xe3\x51\x2f\xc6\xc5\x56\x5b\xa3\x53\x5c\xa3\xdd\xfe\xe7\xc1\x14\x97\xa8\x69\xed\xf5\x78\x3a\x1d\xe0\xca\xb7\xab\x96\xe6\x88\xa0\xec\x00\xb3\x83\xab\xc5\xc3\xdb\xd1\x91\xfb\x1e\xac\x8e\x59\x43\x48\xc0\xcf\xb6\x87\xe9\x75\x88\xb1\x22\xb8\xc6\x25\xda\x39\x11\xbb\xdd\x15\x7a\x27\x33\xc7\xe7\xc4\xe7\xe9\xfb\x8e\x7d\x25\xdd\xb8\xa5\xe5\x52\xbd\x81\x70\x33\xc8\xef\x1c\x0f\xaf\x90\x79\x66\x2c\x15\x07\xaf\x6a\x8e\x08\xbd\x87\xcb\xa4\x0b\x78\x58\xb2\x7f\xfc\xe4\x32\xda\x09\x98\x0e\x77\x8f\x0a\x42\xc7\x55\xb4\x98\xef\xea\x79\x7f\xf6\xf8\x2f\xbd\x50\xa5\x5f\x21\x80\xe6\xc0\x46\x2d\x21\xc4\xec\x17\x77\x53\x7f\x24\xa6\x38\xf3\x42\x18\x3b\x14\x21\x02\x4d\x86\x8c\xeb\x9b\xf1\xab\x67\xc7\xda\xe8\xd2\xd0\x1e\x04\xc1\x86\x0d\xb4\x28\xd4\x9d\x2c\xc0\xe4\xaa\xdc\xfa\x5c\x31\xed\xee\xc1\xf3\x76\xe4\x7f\x93\x31\xe4\x04\x58\x01\x37\xc3\xfc\x37\xf6\xe5\xa5\xf6\x10\xa8\x27\x16\xa3\xf7\x16\x06\xe1\x5d\x3b\x0a\x5a\x6d\x5f\xf2\x1e\xd8\x28\xae\x12\xbd\x50\x69\x2a\x33\x95\xef\xbc\x16\xfc\x60\x15\x33\xbd\x56\x04\xf8\xbe\xe3\xb3\x85\x20\xfe\xf0\xe9\x48\xb8\x1e\x0c\xd8\x82\xb9\xee\x1a\x71\x0c\x0c\xc2\x3d\x02\x61\xe0\x10\x0a\x15\x7a\xd7\xa7\x04\x61\x6b\x5b\x55\x68\xb5\xa4\xd0\x8c\x95\x72\x0a\x18\xc5\x75\x54\x85\x2c\x44\x15\x84\x03\x5a\x8a\x16\xe4\x60\x4b\x09\x72\x0a\xd2\x3c\x14\x49\x59\xaa\x2c\x7a\x12\xfe\x42\xcb\x64\x59\x69\x3d\x17\x76\x78\x9a\x17\x95\x11\x70\x9b\x28\xd1\xac\xb4\x58\xd5\xc4\x83\x02\x0d\x00\xfa\x5b\x44\x4f\xc3\x02\x25\xf1\xe7\xb2\xd8\x21\x60\xc7\x53\x2d\x16\xf2\x4e\x65\x8b\x7d\x04\x6f\x25\x01\xbf\x48\xfc\x39\x4f\xb2\x52\x98\x93\x63\xe7\xa2\x49\x4e\xcc\x0e\xa0\x10\x98\x95\x23\x8a\xc9\x04\x02\xeb\xb5\x81\xe8\x30\xea\xc7\xac\x9f\xc8\x45\x01\x49\xd5\x9c\x43\x6c\x75\x77\x31\xd1\x62\x95\xef\xb2\x0a\x18\xc8\xcc\x11\x55\x02\x55\x61\x41\x7c\x20\x20\xa6\x26\x6a\x1c\x8a\x60\x18\x88\x1c\x27\xcb\x14\x85\x5a\x36\xb9\x2e\xc5\x22\xcd\xb5\xb1\x5f\xf1\x3c\xde\x11\x6e\x59\x79\x55\xf0\xd5\x83\x6a\xba\x03\xa1\x59\x44\xfb\x54\xba\x19\xf6\x92\xdb\xa0\x15\xca\x8e\x58\xf4\x9f\x83\x15\x11\x01\xb4\x1f\x2d\xcd\x96\xde\xa6\xe4\x6d\x1a\xde\x1f\x38\x46\x35\xbc\x91\xcf\x6f\xf1\x18\xe4\xa8\xf1\x82\xba\x25\x7a\x98\x6d\xa1\xb8\xf6\x28\x1c\xbf\xc5\x22\x2f\x96\x61\xe8\xcb\xc7\xb8\x4c\x21\x8e\x09\xda\xeb\x36\x43\xca\x01\xdf\x79\x06\xb8\x78\xf8\x08\x7c\xa1\xbb\x51\x45\xb2\x90\x91\xc5\x7f\xe3\xf9\x89\xce\x43\xb6\x4a\x13\x54\x44\x33\xa7\x38\x25\x6b\x53\xa6\x1f\x9f\x77\x46\xa4\xed\x4d\xb4\x21\x99\xd5\x0d\xd2\xd6\xd1\x1f\x64\xc4\x59\x0d\x70\x93\xa9\x4c\xa1\x65\x97\x79\xbe\xd4\x74\x49\x05\xe5\x28\xd5\x69\xee\xfa\x51\x5e\xae\x1c\x32\xcd\xac\x1f\x42\x49\x76\x9f\xa7\xf7\xee\xc0\xb6\xfb\x07\xb3\x8a\x50\xea\xb9\x4c\x50\x9a\xcb\xa2\xc5\x1e\x89\x0e\xc3\x1c\x7e\x57\x84\x18\x07\x52\x40\xba\x5a\x60\xc4\x30\xc9\xc4\x54\x66\xa5\x14\xbd\x54\x16\x12\xf4\xa1\xcb\xbd\x9f\xbf\xee\x88\x51\x5e\x51\xe1\x90\x5a\x27\x77\x99\x5a\x46\x61\x64\xc8\xfe\x7d\xa9\xcc\x41\x50\x32\x7b\x78\x65\x28\xbc\x02\x09\x4e\x7f\xba\x68\xe3\x01\xd9\x05\x0e\x7e\x38\xde\x76\xac\x7e\x09\xa4\x8e\xb0\xc4\xc2\x91\x28\xa3\x72\x7c\xbe\x12\x9a\x26\x56\x6a\xad\xcc\xa9\xbd\x51\xc5\x1d\x56\x1a\x9b\xa5\x9b\xa7\xc9\x92\x02\x28\xbc\xcc\xf0\xd6\x4e\xdc\x89\x8e\xf5\x2b\xb8\xd9\xfd\xf0\xa7\xad\x03\x2c\x10\xf6\x68\xc6\x05\x6d\x26\x1a\x03\xda\xf0\x56\x29\x98\xdf\x40\x99\x39\x7c\xa8\x83\x07\xe6\x66\xb7\xde\x8a\x24\x33\x3b\x1d\x59\x44\x5d\xed\x70\xc5\x96\xa8\x2f\x32\x16\x5c\x66\xcf\xbc\xb0\x22\x41\xd6\x0e\x6a\x0c\xd4\x30\xe9\x94\x19\xfa\x02\xcd\x0a\x82\x93\xc1\x89\x97\xdc\x2b\xa8\x12\x4d\x81\x7d\x39\x53\x77\x29\xd1\x80\x2c\x55\x6a\x26\x7c\xcf\xaf\xc4\x00\x1e\xe2\x43\x9f\xd2\x58\xb3\xf2\x1b\xda\x48\x21\xee\x32\xd9\xa8\xe8\xc0\x7d\x65\x66\xdf\xac\x33\xf3\x15\x0b\x43\x76\x23\x05\xa3\x5b\x19\x85\xe6\x10\x15\x23\xf3\xa8\xf0\x80\x98\x3c\x9a\x01\xa4\x55\x8a\xd0\x20\x29\x5d\xed\x9b\x23\x54\xa8\x37\x06\x36\xb4\xfc\x0a\x1b\x9c\xaa\xa2\x04\xd6\x54\xfe\x53\x81\xd4\x3a\xaf\x06\x7f\xbc\xfc\x0d\xb1\x5f\xff\xc7\xa3\xf8\xaf\xf3\xb3\xd7\x67\xaf\xab\xf8\xaf\x37\x6f\xde\x3e\xe3\xbf\x7e\x8f\x7f\x03\xcf\x2c\xfd\xe3\x75\x7c\x29\x2e\x8b\x7c\xb7\xb5\xd0\xae\x61\x7c\xd9\x1d\x8a\xc1\x74\x3a\x8f\xa7\x2f\x06\x19\x91\x30\xc7\xd9\x5d\x9a\xe8\x35\x43\x80\xbe\x28\xb1\xcc\xb3\x97\x25\x63\x8d\x3c\xed\x0a\x8b\x9c\x7a\x40\x3a\xdc\x93\x8f\xbb\x92\xd9\xd1\x57\x09\x1d\xce\xb7\xbb\x3b\x1d\x89\x2d\xd6\x0a\xa4\xaa\x14\x3b\x0d\xaa\x50\xff\xa5\x4d\x19\x0f\xc8\x81\xc8\x8c\x68\x4f\xfd\xc7\xae\x40\x59\x56\x96\x50\xab\x69\x1e\xfa\x20\xcd\xa5\x8f\x3c\x4b\xa6\x49\x58\x9c\x95\x8b\xad\xdc\x8b\x1d\x0b\xfa\x04\xcc\x33\x60\x24\x71\x96\x0c\x1e\x51\xe4\x65\xe5\x3d\xb6\xe0\xc7\x57\xe1\x25\x85\x3f\xc0\x73\x51\xba\x75\x61\x9a\x9d\xaa\xe5\x9d\x02\xee\x07\x64\xad\x4f\xa8\xc8\x27\x20\xfc\xb7\xaf\x7b\x79\xaf\x50\xcf\x0d\x6c\x9d\x3f\x5e\x42\x16\x0c\x50\x5d\x60\xa8\x2b\xad\x7e\x7a\x31\xb3\x48\x14\x8d\x39\x47\x17\x0a\xbd\xa9\x83\xb8\xab\xc5\xd3\x70\x8a\x73\xf9\x74\xdd\x3b\xf3\xba\x19\xc1\x69\x4f\x0a\xd5\xae\x7e\xb9\xb9\xd4\xf8\xb1\x02\x65\x26\xd1\xf1\x60\x40\x36\x17\x4b\x11\x60\xbc\x9f\x01\x0e\x67\x5e\xbc\xd3\x00\x3f\xd2\x7a\xb7\x51\xbe\xab\x59\x24\xfa\x2b\x04\xed\x73\xbf\x7d\x78\xb7\x53\x13\x3b\x2f\x6a\x2f\x73\x09\xa0\x93\x5e\x5b\x9c\xff\xf8\xe3\xf9\xe9\xf9\x8f\x3f\xfe\x21\x12\xb3\x75\xbe\x91\x5a\x5c\x76\xc4\x50\x66\x94\x6e\x21\xd4\xf4\x84\x52\x20\x1c\x14\x97\x9a\x8b\xc4\x8d\xf1\xa3\xd2\xfc\xa1\xf3\xe2\xda\x31\xf1\x26\x3a\x40\xa6\xe1\x35\x07\xbc\x0c\x21\x36\xac\x86\x04\xf3\x9b\x7a\x62\x2e\x22\xcc\x13\x82\xcb\x52\xa8\x7c\xd5\xae\x12\x18\x38\xb3\x67\xa5\x54\x54\x31\x3a\x41\x5e\x8f\x1d\x0f\xd8\x94\x27\xe7\x6d\x5b\xb6\xe1\x41\xb2\x2a\x79\xfc\x4a\x43\x12\xed\x33\x4d\x52\x79\x1a\x7c\x64\x12\x77\xfb\x57\x31\x82\xc2\x9c\x1d\x82\xe9\x96\xc8\xab\x5b\xac\x88\x16\xe7\xa7\xb6\xb6\xdf\xb2\xe9\x03\xed\x99\x5a\x7e\xb0\x96\x19\x07\x86\x34\x9a\x63\xf4\x9f\xc6\xec\x03\x9c\x9b\xc5\x27\x58\xcd\x6f\xcc\xce\x72\x33\x20\xe5\x9e\xa2\xa4\xef\x82\xe5\xe3\x8c\x7f\xb3\xd9\xca\x0c\x8c\xe7\x60\xdb\xc1\x01\x70\xf2\x1a\x46\x87\x94\x60\xd5\x62\x57\x12\xa8\x7e\x79\x70\x10\xd4\x91\x67\x62\x5b\xd0\xb2\x87\x5d\xdd\xaa\x8d\xeb\xad\x24\x39\x3c\x9c\x0d\x7c\x22\x64\x91\x69\x66\x9a\x8f\xe1\x16\x36\xf7\x4d\x5b\x78\x8b\x0e\x05\x2d\x1c\xf3\x8a\xff\x1e\x9b\xb2\x24\xb2\x45\xf3\x68\x48\x30\x21\xd9\xb4\xa6\x42\x43\xe6\xf8\x72\xa5\xf0\x50\xd2\x9e\x2d\x95\x4e\x0a\x1a\x0b\x2a\x05\x5f\xb0\x6e\x2f\x9f\x3f\xf8\x24\x73\x02\x0d\x07\x94\x56\x40\x25\x63\x2a\x0b\xf7\x58\x1c\xcc\xa6\x0c\x17\xa7\x73\xd3\xa0\x08\x9d\x5b\x0e\x12\xea\xec\x58\x1b\xb3\x51\x92\xc0\xa5\x7f\x26\x46\x70\x5a\xff\xd9\x8c\x35\x2d\x89\x5d\x86\xcc\x64\xc0\x73\x72\x5b\xc8\x62\x1f\x9c\xd3\xe6\xcc\x7d\x00\xa5\x0d\xf3\x1b\x5b\x81\xe1\x1f\xd2\xe6\x46\x08\xf7\xf3\x68\x3c\xb3\xa3\xc8\x1e\x28\x8d\xb6\x69\xb2\x69\x8c\x25\xde\x42\x91\x05\xe4\x76\x30\x7f\x84\x9f\x21\xd6\x79\xaf\x8a\x92\x3c\x4d\x26\x80\x01\x61\x51\x08\x1a\xa1\xe5\x1e\xce\x1d\xc6\x1b\x96\x3b\xe3\xf8\x06\xa3\x91\x94\xd5\x73\x94\xfc\x37\x50\x77\xa1\x12\x32\x98\x6e\xa9\xcd\xc2\x3b\xb4\x94\x5e\xba\x27\xb4\x3a\x2f\xbe\xa8\x90\xfc\x02\xc3\x0a\x14\x83\x30\xde\xa9\xbc\x53\x7e\xd7\xc3\xc6\x12\xa9\xd9\xad\xd4\x89\x46\xe6\x18\x2b\x3a\xc9\x9d\xa8\xe2\x6e\x8c\xef\xe4\x88\x3e\x0a\x2f\x10\xca\xa4\x1b\xf0\x5c\x73\xf2\xdb\xaa\x1b\x7a\x96\xf1\x84\x97\x79\xd1\x79\x21\x33\x9d\xbc\xfe\x9a\x15\x9d\x85\x70\xf9\x59\x57\x6d\x12\xe0\x8b\x6e\xf7\x3e\x63\x7a\xbe\x12\xc3\x8e\xb8\x56\xa5\x2a\x44\x5f\xed\x4a\xbd\x58\x47\x90\xf0\x84\x1c\x7a\x91\xa8\x12\xbd\xb2\x10\x3b\xbc\xce\xd3\xa5\xb9\x90\xba\xa9\x39\xa3\x8c\xd5\x03\x21\x95\x84\xd0\x96\x57\x2a\x4b\x73\x71\x0d\xc9\xe9\x5e\xb7\x23\xc2\xe6\x99\x75\xe4\xc9\xd4\xda\x9a\xc9\xca\x19\xe9\xb6\x06\xd1\x35\x64\xba\x54\xd2\x7e\x65\xa7\x77\x15\x8e\xe0\x10\xc4\x77\x51\x28\x2f\xd1\x7d\x91\xef\xb2\x25\xc9\x09\x59\x5c\x7c\xba\x8f\x9c\x69\x13\x60\x2f\xfd\xdb\x80\x4c\xb2\x42\xf9\x40\xb3\xb2\x23\x4e\xa6\x4a\x51\xc9\x6c\xaa\xfc\x2e\x9a\xbd\x01\x87\x09\x2b\x98\xb7\x9d\xfa\x8d\x4e\xb2\x85\xaa\x8c\x87\xd9\xbb\x99\x52\x4b\x8c\x63\xda\xaa\x7b\xac\x2b\x34\x66\x94\xb8\x83\xb2\xc3\x40\xcc\xc0\x6d\x7d\xd2\xd3\x0f\xf0\x3b\xd0\x21\x4b\xb9\x1c\xe0\x0a\xcd\x0b\xe4\x5d\x21\xb7\x6b\xf3\x2d\x38\x87\xc4\x3c\x4b\xbe\x41\x44\x2a\xb9\xe3\x5a\x70\xbd\x28\x92\x6d\x29\x5a\xfc\x5b\xd5\x02\x0d\x9b\x2d\x73\x72\xc3\xcd\x76\x39\x9a\x8b\xee\xae\xcc\xcd\x87\xa0\xca\x2e\xb8\xe8\x68\xa2\x0e\x4d\x04\x73\x70\xac\x0a\xa5\x90\x64\x06\x47\xd7\x1c\xb2\x18\x03\x03\x58\x82\x59\x6a\x9a\x04\x8c\x34\xe3\x74\x50\xef\xce\xb4\x50\x8b\x13\x6c\x62\xe7\x6e\x07\xfc\x31\xf4\x93\xde\xdd\x46\x22\x2d\xf1\x27\xf3\x5f\x1b\x99\x64\x1d\xbd\x6e\x77\x44\x97\xd8\x17\x19\xf3\x83\x0f\x8a\x60\x81\xc9\x34\x3d\xd5\xeb\xa8\xd6\x91\xab\xce\xa0\x33\xeb\x70\x93\x01\x3b\xd8\xd8\xee\x17\x83\x92\xb0\x13\xda\x69\xfd\x49\xa0\xf6\x56\x65\xb2\x30\x53\x06\x47\xdf\xd6\x0f\x82\xc1\x51\x64\x0e\x1d\x7c\xad\xdd\x19\x56\xc4\xfa\x81\x0a\xee\x06\x1f\xaf\x22\xd1\x9d\xfd\xd7\x19\xda\x4d\x57\x49\xa9\x77\xb7\x89\x5e\x27\x1d\xf1\x09\xe8\x33\xea\x6f\x22\x01\x4b\xe6\xbf\xba\x25\x8b\x9a\x4d\x26\xd4\x24\x42\x14\x39\x1c\xb5\xb0\x6a\x9c\x3a\xc4\x05\x9b\x42\x58\x59\x1e\xd9\x41\x5b\x21\xd9\x50\xe5\x6d\x96\x85\xa4\xa6\xb1\x0e\xd4\xdd\xd8\x51\xeb\x38\x9c\x4c\x93\xe6\x46\xd3\x01\x49\x8a\xf4\x52\x6c\x64\x81\x06\xce\x1d\x54\x38\x72\x81\xe7\x2e\xc3\x11\x52\x4b\xf1\x69\xb7\x5a\x6d\x64\x06\xd2\xfe\xcc\x53\xb2\xcb\x58\x05\xcb\x4c\xc4\xbd\x2a\xf6\x62\x63\x76\x95\x31\xf8\xd5\xc6\xaf\xeb\x4c\x1d\x00\x2c\x29\x3b\x6d\x31\xcd\xc5\x4a\x02\xe9\xee\x03\xea\xde\x49\x74\x01\x50\x97\x1e\x61\x44\x34\x3b\x8d\x54\x9c\x2e\xf8\x8d\x1e\xcb\x8c\x36\x6c\x15\xa2\xbe\x51\x85\x13\x28\x5e\x5a\x90\x5f\x61\x8e\x39\x08\xed\x14\x49\xa9\xc4\xe5\xe0\x02\x2d\x3b\x10\x22\x06\xae\x10\x63\xfe\xcb\xec\x2e\xf5\x70\xe0\x14\x80\xd6\x7b\x2d\x86\xff\xfa\xc5\xc2\x84\xcc\x97\xcd\xf3\x60\xc7\x50\x1f\x6b\xb3\x24\xd3\x32\xbf\x83\x08\x65\x64\x83\xd9\xe6\x8b\xf0\x7e\x8f\x5b\x46\x83\xaf\x04\x56\x05\xa2\xe8\xcc\x59\x20\x5a\x3b\x50\x26\x31\xfe\x94\x5a\x9a\xef\xe9\x16\x5d\xcc\x88\xaf\xfb\xcb\xce\x43\xe4\xb0\x3c\x87\x69\xa3\x65\xbd\xff\x40\xa3\xa6\x77\x29\x6c\x6d\xdb\x63\x18\xeb\x54\x42\xb8\x13\x8e\x32\x38\xf5\xf1\x3e\x40\xf1\x44\x12\x00\xb8\xdd\xc3\x3d\x6a\xcb\x45\xcd\x13\x96\xca\x0c\x68\xa1\xe1\x4e\xc7\x4f\xbb\xd2\x72\x67\x93\xbe\x68\x99\xe9\xb9\x34\x27\x62\xb2\xd0\x18\x53\xa7\x42\x92\x0b\x80\xd3\x9e\x2c\xda\x5c\xa8\xec\x0a\x79\x2c\xc2\x0c\xca\x7b\x36\xdb\xdd\xd4\x78\x47\x62\xe0\x50\x8e\xcb\x8e\x69\xc5\x89\xde\x50\xc9\x97\xf9\x80\x31\xf4\xaf\x64\xf1\xf5\x49\x5f\x6f\xfd\x33\x05\xd3\xfe\x13\xfe\xeb\xbc\xfa\x79\xfa\x55\x96\xbf\x69\x04\xf0\x78\xfc\xef\xec\xfc\xec\xcd\x9b\x5a\xfd\xe7\xbb\x1f\x9e\xe3\x7f\xbf\xc7\x3f\x38\xc2\xd8\x04\x23\x43\xc5\xde\x5e\x1f\x10\xca\x29\xb3\xaa\x61\x48\x76\x41\xe7\xc5\x1c\xe3\x61\x68\x5e\x22\x38\xba\x48\xf4\xd7\x0f\x74\x8b\x80\x21\x6c\x43\x55\x9d\x17\x13\x55\xad\x02\xb0\x1e\x1c\xc9\xa1\x01\x47\x8b\xcb\x72\x86\x5e\x44\x79\x48\xc4\x15\xfc\x22\x55\x72\x40\xb2\xeb\xa3\x49\xc5\x7f\xf5\x5d\x01\xab\x96\x59\x58\x54\x27\x21\x5e\x5f\x77\x64\x5b\x8c\xcd\x5d\xcc\x91\x07\x7b\x94\x42\xa1\x95\x5c\x7c\x95\x77\xec\xd2\x91\x79\xc6\x85\x75\xf0\x00\xa4\xac\x79\xdd\xb9\x6d\xb3\x95\x48\xb1\x09\xa2\xd9\x78\x58\xe7\x22\x95\xba\xa4\xe7\x2f\xd9\xc9\x31\x43\x8f\xb6\xa0\x37\x0f\x85\x32\xde\xe4\x92\x29\xab\x58\x2c\x2e\xdb\x81\x86\x72\x62\x3d\x00\xc8\xea\x7f\xeb\xec\x3b\x7f\x8d\x48\x24\xf3\x5b\x67\xcf\x27\x79\x20\x31\xe7\x85\x50\xf8\x3d\xe6\x1a\xfc\x2b\x1c\xdc\x99\x90\xc5\x6d\x52\x82\xec\xbc\xde\xad\x56\xc9\xb7\x7f\xaa\x2c\xc7\xf3\xbf\x43\xff\x3a\xaf\x06\x50\xff\x7f\xf6\xf7\xab\xff\x7f\xff\xfe\xf5\x79\xf5\xfc\x7f\xff\x7c\xfe\xff\x3e\xff\x06\x1f\xaf\xaa\xe5\xfc\xae\xf6\xff\xec\xc5\xec\x53\x2c\xba\xbd\xde\xf8\xea\xba\x3b\xba\x19\x8c\x2e\xc5\xf5\x64\x7c\x39\xe9\x5e\x05\x78\x6e\x00\x7b\x02\xe2\x72\x16\x4f\xae\xa6\x08\xbf\x1c\x4c\x8d\x27\xf7\xe2\x7a\xfe\x71\x38\xe8\x89\xe1\xa0\x17\x8f\xa6\xb1\x38\x69\x75\x2f\x27\x31\x40\x84\x5b\xc6\x4b\x1d\xdd\x20\xd4\x75\x12\x5f\x4f\xc6\xfd\x39\xa2\x56\xc7\x13\xd1\x1f\x4c\x67\x93\xc1\xc7\xb9\xf9\xf9\x05\xc3\x39\xe9\xd5\xbd\xf1\x68\x3a\x1b\xcc\xe6\xb3\x78\x2a\x26\x71\x6f\x70\x3d\x88\x47\xb3\x97\x53\xd3\xce\xf8\x7a\x86\xa8\x55\x6a\x81\x7d\x59\x87\x6e\x86\x7e\x7c\x31\x18\x0d\x00\x72\x6c\x7e\xd3\x02\xb8\x09\x5d\x47\x2d\xb1\x51\x92\x02\xe8\x48\xad\xc6\x32\x72\x12\xa3\x60\x21\x12\xe5\x23\xd3\x0c\x5c\xa1\x50\x97\x16\x3d\xaf\x88\xf7\xa4\x35\xf8\x78\xd5\x6a\x63\x81\xe9\x98\x0f\xde\x6b\x4e\x19\x39\xce\xf5\xdb\xda\x6b\x80\xd3\xc6\x36\x2c\x2f\xa2\x40\xbe\xa6\x12\x16\x6f\x78\x22\x09\xd6\xd8\xc0\x7a\xe5\xa3\x1f\xe8\x9e\x40\x74\x03\x3d\x4d\x66\xcb\x57\xc6\xd9\x3d\xf0\x1d\xbe\x3a\x4a\xc5\x32\xfb\xcb\xb0\x50\x95\xa3\x5c\xb2\xf4\x33\x41\x5e\x27\x3a\xa2\x2b\xfc\xc1\x16\x2f\xed\x23\xf5\x4b\x56\x58\xf3\x3e\x2f\x12\x50\xa7\x7e\x90\x40\x52\x13\x88\x10\x43\x83\x6e\xf7\xd8\x81\xe0\x2b\xa5\x56\xe9\xca\x63\x38\x77\xb5\xe3\xd5\xcf\xbe\xd4\x54\x4e\xde\x09\x5a\xa5\xbd\x42\x2e\xac\x4f\x3e\x34\x20\x00\xe7\xf2\x84\x85\x84\x10\x27\x49\x1b\xc9\x7e\xd4\x56\x42\x05\xd8\x26\x5f\xee\x52\x0c\x16\xba\x50\xb7\x37\x62\x28\x9b\xf4\xe7\x5d\xb6\x20\xb4\x6c\xb9\x0e\x1e\xe8\xbf\xcf\x16\x58\x27\x68\x65\x71\x15\x88\x0c\x0b\xac\x4f\x12\x6a\x44\x96\x97\xc1\xb3\x96\x8e\x10\x13\x52\xb1\x6c\x13\xd0\xf3\x3b\xe1\x6e\xc8\x0b\xda\x0c\x66\x0f\xdb\x54\x8d\x5f\x65\xcf\x45\x8a\xdc\x1b\x5d\x7f\xda\x90\x99\xa0\xaf\x29\xc4\x83\xcf\xe4\x98\x02\x05\x7e\xb1\x23\xd6\xbf\x0d\x26\x14\x31\x73\xd0\x1d\xaa\x49\x49\x20\x94\x80\x24\xcb\x5e\x94\x14\xa2\x3a\x8c\x20\x4a\x4a\x1d\x2e\x35\x2c\x8e\x84\xe7\x01\x4a\x68\x73\x0b\x0a\xd5\xbe\xb4\xb6\x6b\x75\x75\xaf\xf2\x40\x04\x06\x54\xc5\xb0\x72\x91\x71\x3f\x49\x54\x85\xb1\x68\xe6\xc3\x73\x61\x2e\x07\x84\xf2\x82\xb1\x51\x50\xed\x0a\xb9\x43\x3f\xdd\x04\xea\xe2\x32\xdb\x63\x73\x1b\x5a\x59\xed\x01\x3c\x22\x58\xe5\xf8\xd5\x09\x97\x7c\xf2\x97\x69\xd7\x18\x3b\x95\xf8\x01\x75\xe3\x1a\x0c\x81\xe7\x61\x85\x9a\x37\x7d\x9a\x0b\x16\xa1\x30\xc0\x9c\xc9\x58\x28\xe0\xce\xd7\x46\x52\x90\x06\x6c\x7b\xf5\x44\xac\xf0\x81\x4c\x3c\xd9\x9e\x0a\x7f\xc7\x43\x5e\xa4\xcb\x87\xc4\x0c\xaa\xcf\xf3\xe1\x13\x68\x39\x42\x0f\xaf\x2e\x6d\x5b\x98\x4d\xac\x9a\xb6\x4d\x44\x09\x1d\x0c\x8b\x6e\x53\xb9\xf7\x7e\xb3\x55\x85\xb1\xc8\x23\x3f\xdd\x4b\x94\x9c\xbe\x34\x52\xb0\x3c\x19\x0b\xe5\x1f\xf9\x34\xc7\xa4\x3e\x01\x7c\xc6\x95\x96\x44\xd5\xc2\x6c\x90\x8b\xa8\x94\x49\x7b\x0a\x02\x7f\xbf\xb1\xa6\xfd\x1e\x12\x4d\xd6\x0e\x07\x12\x96\x88\x30\x7f\xae\x55\x9a\x46\x4e\x4e\x13\x7f\x4c\x36\x10\xd9\xb3\xba\x18\xc0\xb8\x63\x51\x7b\xdf\x37\xae\x4f\x19\x3c\x8c\xef\x55\x9a\x8f\x38\x40\x0f\x6e\xaa\xe8\x44\x09\xc8\x77\xc2\xf3\x87\xa2\x8d\xbc\x8f\x92\x55\x24\xc8\x9b\x05\x0e\xd2\xda\x17\x12\xbe\xf4\xe8\x80\x0b\x7a\x80\xbc\xdb\xcb\xb0\xaa\x36\xf8\x3a\x70\x4f\x6b\x86\x2f\xba\xb6\x21\x06\xaf\x92\x95\xaa\x4e\x04\x79\xa2\x4d\x9d\x0e\x70\xb6\xee\x42\xf0\x5e\xa1\x59\xed\xde\xd3\x6d\xf7\x9b\x06\x38\xd5\xb5\x2c\x96\x70\x5a\x6e\x55\x21\x2a\xa2\x01\x16\x3a\xef\x29\xbe\xb9\x25\xe7\x80\xfe\x4e\xe9\x71\x9d\xef\xee\xd6\xf5\x55\xcb\x54\x41\x6b\xa6\x21\x72\xd4\xcc\x79\xed\x86\xf0\xa9\x8f\x4c\x0b\x92\x0c\x50\xb3\x52\xeb\x9d\xab\x07\xa6\xe7\xd8\x88\x04\x91\xb6\xfb\x2f\xb5\x41\x0a\x9e\x69\x1b\x11\xe6\x3b\xcb\x6b\x10\x0d\xb1\x65\xaf\x39\x56\xdb\xcb\xb9\x32\xff\x06\xe6\x11\x8a\xab\x5d\x0f\x95\x0c\x3c\x92\xfd\xdc\x1b\xca\x55\x5e\xd0\x0d\xcc\x47\x44\x81\x19\x72\xea\x56\x70\xd7\xdb\x7c\x7c\x55\x33\xc4\x6f\xb3\x1b\x9f\xb0\xe5\x61\x69\xb3\x06\xba\x88\xcc\x15\x03\x79\x44\x03\x6e\x6c\xbc\xea\xa0\xc3\x25\x4a\x74\x56\xb9\x3e\xd1\x49\x85\x69\x64\xee\x17\xa4\x79\x2b\x88\x07\x38\x51\x80\xa8\xd7\x75\xf5\xd8\xf0\xd3\xa3\x30\x7f\x69\xef\x5f\xc8\x1b\xa9\x6f\x72\xb3\x4d\x15\xfe\xd2\x93\x6d\xdb\x57\xb7\x50\xc2\x4f\xf1\x03\xf4\xa8\xc4\xe0\x7a\x10\xf2\x10\x04\xf6\x3d\xa4\x7b\xe8\x11\xf6\x0b\x2f\x75\x43\xd7\xe4\x02\x5e\x10\xc8\xef\x8b\x5b\xd0\x58\x66\xe1\x77\x9f\x5f\xa6\x6a\x01\xa1\x30\x7c\x6d\x55\x59\x8c\x19\xe7\xfc\x70\x1b\x39\x2c\x45\x02\x39\x17\x1e\xf5\xdd\x6a\x95\x80\x64\x8e\x77\xd5\x3a\xd2\x87\xea\x06\x74\xe7\x72\x99\x53\x3d\xb3\x5b\x0c\xf5\xbb\xda\xed\xd6\x5a\x01\x0a\x23\xfc\x26\xf1\xbf\xcc\x07\x13\xf0\xfd\xc0\xe0\xe8\x06\x9d\xd9\xc8\x3d\x91\x2a\x1c\x1e\x72\xa0\xad\xac\x5c\x09\x96\xa3\x5c\x1f\x32\xc2\x83\x80\xa5\xef\x4a\x92\xae\xbf\x27\xe7\xf7\x54\x16\xb4\x0f\x15\x6f\xb1\xd4\xf5\x17\x87\x12\xa7\x16\x12\x1e\xe8\x9a\x84\x14\x5a\x15\x5b\xcd\x47\x68\xb0\xd8\x8b\x0f\x4e\x60\x2c\x21\x70\xf4\x30\x98\xd0\x93\x7a\x7a\x4c\x1f\x85\x10\x61\x35\x89\x14\xf7\xb8\xa3\xcf\xa8\x00\x10\x51\x28\xf9\x11\x00\x62\x45\xc0\xd5\x1f\x14\x56\x05\x79\xc2\x98\x84\x92\x21\x84\x72\xf2\xbb\x8e\x9a\x10\x11\x20\xd0\xf0\xbf\x1a\xc4\x35\x6c\x0d\x8e\xd5\xd7\x70\x8f\xf2\x84\x34\x4a\x96\xca\xf8\x50\x51\x5d\xd5\x25\x55\x34\x11\xee\xde\x2f\xf7\x43\x02\x92\x27\xd3\xc5\xc0\x33\xfc\xcd\x50\xe3\x8e\x71\x87\x22\x9c\x64\x55\x15\xd8\xfb\xb0\x39\x75\x50\xa1\xb7\x85\xfc\xa2\x4e\x68\x5b\xdd\x22\x43\xd6\x27\xb3\xbb\xb4\xc7\x26\x05\x4c\x54\x39\xa5\xee\x2d\xe4\xd6\x53\xd5\xa6\x0a\x30\x2a\xdd\x58\xc3\xed\xe5\xf4\x78\x51\x0e\x08\xfd\x45\xc0\x02\x98\x96\x59\x37\x4d\x7d\xc3\xb8\x07\x1c\x16\x5f\x18\xe1\xe7\x35\x1a\xc8\xf2\x02\xa5\xdf\x2a\x05\x52\xb8\xb5\x19\x8d\x58\xf9\x5e\x93\xc3\x54\xd9\xcd\xf2\x10\xef\x59\x15\x67\x89\xa7\x06\xdc\x78\x3e\x17\x87\x7f\x72\xd7\xce\xec\x00\xee\x13\x26\x4f\x60\x38\xcd\x82\xdc\x26\x8b\x5d\xbe\x33\xab\xcf\xf1\x3d\x79\x0f\x86\x7e\xf6\xaa\x50\xda\xf7\x91\xf9\xdf\x1f\xbf\x2b\x22\x66\xcd\x76\xdd\x08\xb9\x85\x1e\x04\x34\x4b\x35\x9b\x0e\xbb\x83\xe2\x9a\x7b\x8e\xf6\xc8\xc0\x35\xf7\x80\x5c\xcd\xf7\x4b\xad\x7a\xd0\x53\x13\x80\xdb\x58\xfb\x05\x1f\x13\xc7\x8a\x64\xee\x3b\x7e\x75\xfd\x85\x35\x43\x97\xf8\x31\x7a\xe3\xab\xab\x78\xd2\x03\x76\x00\x3f\xa4\x09\x83\x6a\x51\x73\xf6\x02\x32\x87\x8e\x1f\x2d\x02\xde\x19\x04\x5c\xb2\xfc\x61\x70\xdf\x37\x95\xac\xaa\x6c\x89\x72\x6b\x91\x63\x42\xe5\x1a\x51\x8f\xb6\xed\xab\xea\x88\x2f\xeb\x24\x25\x38\xb2\x33\x53\xb0\x64\x92\x42\x6e\x2b\xb9\x48\x40\x57\x4d\xb1\xa7\xc3\x6d\xf6\xf8\x15\xad\x8d\x52\xf1\x55\x20\x92\x10\xf0\xa8\x78\x57\xab\x6c\x80\x0d\xe2\x31\x05\xe1\x90\x35\x68\x9f\x22\xc3\xa0\x3f\x67\x4c\xb7\xc4\xe4\x93\x40\x33\x23\xb6\x79\x49\xa7\x6a\x78\x5c\xe3\x29\x16\xc4\x24\x8c\x7b\x53\x80\x31\x44\x36\x5b\x10\x41\xfc\x25\x8d\x8d\xea\x91\xc8\x93\x96\x37\xbb\x7e\x54\xad\x6d\x8d\x54\x54\x0b\x35\xd6\x87\x5a\xa9\x6c\x49\xc7\xe0\x52\x6d\x32\xb3\xc2\x14\x20\x79\x6a\xcd\x17\x27\xad\x01\x7d\xc6\xdc\x98\xe1\x93\xe5\x9d\x4c\x32\x4d\xd4\x63\xb9\x06\xc5\x1b\x46\xe5\xe2\xf5\xa3\x11\x49\xc6\x3a\x37\xe9\x5e\xb4\x86\xf0\x41\xf3\x6d\x2a\x8d\x84\x53\x1a\x2d\x86\x08\x8a\x42\x77\x09\x59\xe2\x9e\xc8\x20\x55\x42\xe9\xc0\x6b\x08\xac\x5f\x6e\x0c\x23\x52\x1b\x9a\x5c\xd1\x4d\x72\x8a\x49\x08\xb7\x26\xdf\x81\x12\xb7\xda\x73\xe7\x9b\x46\x96\x82\xa9\x99\x72\xb1\x54\x38\x05\x9a\x58\xe7\x9e\x3a\xb1\xe8\x0a\xfb\xb5\x93\x6c\x6e\xb2\x32\x30\x0b\xaa\xf9\x4e\x31\x5b\x5b\x85\xc0\xb1\x0d\x50\xbf\x80\x78\x47\x1f\x03\x6e\xde\x54\xdd\x41\x20\xb8\xc9\xf7\xf0\x2d\x25\x24\x8c\x64\x12\x75\xa8\x80\xc0\xc2\x82\x83\x83\x6b\x0e\xcb\x9f\x84\x6c\x43\x51\xce\xb6\x64\xb1\x14\x0e\x28\x1c\x1a\x43\xae\x2d\xe4\xd1\x86\xde\xe0\x25\x7d\xdb\xf6\x94\xe3\x0e\x3c\x01\x8b\x7e\xcb\x22\x4f\x23\x5a\x73\x58\xfd\xe9\x15\x1a\x1f\x7c\x37\x9e\x1f\xb0\x1d\x48\xbb\x01\x88\x22\xcc\xe8\xa9\xa5\xb1\xf9\x4b\x82\x82\x65\xea\x2e\x2f\x13\x26\x98\x9c\x1d\x59\x61\x20\x06\x0f\x86\x21\x28\x91\x71\xf5\xa0\xeb\x99\x90\xa5\xb5\xe6\xd5\xb7\xad\x95\x3c\x0a\x5c\xbb\xf0\x8c\xd8\x78\xea\xa4\x35\x87\xe1\x91\x83\xe2\x9a\x7e\xf3\xb3\x69\x76\xc5\x0c\xc3\x9c\x7d\x06\x6f\x6b\x1a\x21\x92\x0b\x80\x6f\x35\x8f\xbd\xf9\xf6\x06\x64\x0d\x28\x0c\x09\x15\xde\xbc\x97\x9d\xda\xb9\x67\x68\xf3\xe8\x96\xb9\x6b\x5b\x44\xb4\xa6\xf5\x87\x90\x56\xb1\x73\x12\x38\x8d\xd4\xdc\xa2\xba\x77\x0a\xa6\x66\x47\xcc\x9d\x5d\x44\x3b\x29\x3a\xb6\x34\x50\x07\x9b\x2b\xb9\xe8\xbc\xe4\x16\x79\xe7\x4c\xfd\xb4\xf7\xfb\xf7\xc4\x4e\x91\x41\x8a\x24\xc3\xbb\xc2\x23\xc0\x73\x66\x71\x65\xc5\x6f\x25\xda\xcc\xf6\xb0\xd5\x60\xaa\xea\x5d\x5a\x1e\xed\x17\xd8\x33\x5b\x4b\x23\xeb\x2b\xd6\xbd\xeb\xf8\xc0\x19\x30\xee\x7e\xee\xc5\xd7\x33\xd1\x9d\x32\xe1\xd5\xf0\x46\x4c\xe3\x99\xb8\x18\x4f\x66\x9f\xc4\x60\x54\x49\x78\x46\x41\xca\xd4\xcf\xd6\x8e\x81\x8e\x8a\x39\xb8\x3e\x76\xa7\x83\x69\x54\xa5\xe1\x02\xfa\x28\xa0\x37\xea\x63\xb2\xd4\xe7\x34\x8a\x44\x3c\xf0\x99\xb7\xcc\x27\x99\x7e\xca\x72\xf6\x44\x0d\x74\x47\xc8\xfb\x74\xec\x15\xb3\xc1\x6c\x18\x47\x62\x34\x1e\x9d\xfa\x6c\x52\x51\x95\xc8\xca\x7c\xf3\x31\x2a\x2b\x8a\x61\xb8\xe0\x0a\x94\x30\x34\x8a\xdc\x2f\x15\xd2\xa4\x58\xd6\xe7\x2d\xd6\x05\x48\xd4\xeb\x34\x87\x21\xf2\xb8\x07\x85\x5c\x95\xe0\x09\x9e\x58\x18\x7b\x02\xcf\xb1\x48\xf4\x57\x6d\x89\x36\xd8\x82\x37\xa7\x8d\xaf\x62\x7f\xa4\xf2\x39\x28\x94\x47\x61\x3d\x5f\x97\x10\xe0\xa4\xf8\x0e\x7b\xbb\xe7\x2b\x0b\xee\x61\x21\xd1\x2a\xcf\x69\x45\xd4\x97\x6d\x04\xf0\xb6\x0a\xab\xe6\x88\x22\x8e\xf4\x2c\xcd\xfc\x3b\x5b\xe7\xb5\xef\x32\xf2\x73\x48\xa7\x87\x48\xec\x8a\x9d\x45\x7d\xdb\xba\x7f\x16\x0e\xb6\x94\x65\xf1\xc4\x4c\xb6\xad\x1f\xfa\x45\xcb\x7b\x44\x8b\xd0\x22\x00\xc4\x88\x48\xa9\x80\x55\xca\x18\xda\xe3\xc9\x54\x4c\x3f\x75\x87\x43\xf1\xa9\xfb\x39\x86\xbf\xb9\x9a\xa5\xdf\x80\xf7\xeb\x51\xae\xaf\x19\x13\x7d\xb5\x23\xf1\x69\xfc\x25\xfe\x1c\x4f\x44\xaf\x3b\x9f\xc6\x7d\xa0\xb5\x82\x9d\x79\x63\x36\xee\x78\x72\x13\x8c\x90\x63\xd2\x42\x7e\x2f\x60\xcd\x8a\x84\x71\x28\x7a\x33\xff\x63\x44\xa4\xe5\x37\xc5\x91\x67\x99\xbf\x02\x63\xd7\x97\xc1\x34\x6e\x5b\x52\xb0\xc1\x88\xf6\xe5\x0d\xf3\x83\x59\xc2\xb5\x10\x88\x21\x2a\x40\x8c\x31\x82\x3e\xe2\x9f\x8d\x87\x83\x24\x61\xe6\x41\x87\xe9\xc0\x98\xb7\xeb\x3b\x79\xba\x7e\xe8\x88\xcb\x78\x14\x4f\xba\x43\xf0\x11\x0f\xc9\x51\x05\x24\x34\x87\x54\xa8\xea\x5a\x3a\x2c\xfa\xe9\xe5\x38\x7e\x05\x65\xaa\x03\x04\xe8\xb6\x8a\x73\x57\xa0\xc2\xf6\x82\xcb\x95\xaa\x04\x42\x65\x4e\x7e\x85\xeb\xa8\xa5\xa0\x00\xff\x65\xe3\x4e\x01\x73\x74\x6d\x76\x1b\xb6\xa4\x03\x02\xc7\x0d\x72\x18\x04\x0f\x6a\x64\x9c\xe9\xd0\xe0\x7a\x07\x66\xa6\xcb\xa4\x84\xe4\xbe\x0d\x66\x97\xcc\x30\x6b\xbd\x8d\xf0\xaa\xae\xb2\xb2\xf3\x37\xbd\x01\x2f\x73\xaf\xf8\xd5\xcb\x1e\x8b\x45\x91\x6b\x7d\x8a\x76\x19\x44\x00\x77\x00\x53\x87\x9f\xc1\xb6\x22\x77\xa4\x4d\x65\x99\x58\xde\xea\x47\xd9\xb5\x4f\x15\x5c\x0b\x74\x31\xf1\x72\x25\xa1\x54\x5d\x3d\x55\xe6\x33\x69\xc1\x12\x4b\xf3\x23\x11\x29\xdb\x81\x48\x34\xc0\xf8\x97\x15\x92\xe8\xe4\xfb\x47\x32\xdb\x5b\x05\x90\x5f\x34\x2c\xe8\x4f\xe0\xb5\x54\x49\x44\x51\xb0\xe4\x04\x03\x9f\x88\x9e\xf5\xb2\x76\x15\xc7\x08\x66\x91\xea\x87\xbc\x0a\x45\x4e\xdc\xb5\xad\x6b\xa2\x2b\x03\xfa\x92\xfb\x77\xa2\x79\x92\x6a\x1f\x68\xd4\xb6\xb2\xca\xe9\x27\xb7\xed\x5f\x3c\x01\x10\xe7\x4f\xd3\xa6\xb7\x3d\x69\xa2\x11\x72\xb4\x92\x49\xaa\xab\xd4\xa7\x44\x03\x04\x9b\x4d\x96\xaa\x30\xa6\x9c\x55\x10\x3c\x16\xbc\x27\xfc\x06\x87\x2b\x76\x6c\x31\xaf\x90\xaa\xa5\x16\xd6\xdc\xaa\x22\xc9\x51\xd8\x38\xd9\x28\x52\x8a\xbc\x55\x8b\x1c\x48\xe5\x50\x0a\x87\x7d\xb3\x2c\xcf\xdc\xe5\x8e\x8c\x5d\xdf\xd1\x7b\xdb\xef\xc8\x4f\xea\xdb\xb0\x04\x4a\x9b\xee\xc8\x13\x3b\xe6\x46\x4b\x63\x57\x99\x75\xac\xfd\x60\xda\x16\x14\xe8\x17\x58\xe8\x66\x4b\x03\xfd\xc6\xf9\x8e\xf5\x41\xe2\x17\x8f\x60\x3a\xd8\xdc\xae\xc9\x61\x51\xad\x6b\x16\xce\xae\xe5\xda\x42\x20\x05\x90\xe2\xe1\x49\xf7\xf1\x0a\xdd\xc3\xdd\x6d\x9a\xe8\xb5\xc8\xd4\x83\xc3\xa0\x7b\xfb\xaf\x50\x14\x68\x6f\x37\x4c\x2e\x86\xdb\x21\x87\x9f\xc3\xff\x93\xd1\xe9\x3d\x8c\x47\xab\x4e\xd1\x75\x97\xdc\x83\xbb\x67\xc6\x36\xc9\xee\x76\x89\x06\x0a\xee\x10\xea\x8d\xfe\x2d\xf7\xc9\x6b\x57\x90\xbf\x6e\x63\xa4\x30\x7d\x90\x7b\x0d\xa4\x3b\x1e\xca\xac\x42\x50\x75\xb0\x59\xbe\x08\x13\x21\xef\x58\x13\xb5\x72\xb4\xe1\xa2\x94\xc7\x7b\x99\x68\x1e\x5a\xb5\x8c\x6a\x4e\xb9\x4a\xa9\x49\x07\x72\x6f\x5e\x47\x6b\xc9\xfa\xb6\xa7\x36\xe2\x35\x01\xb0\x05\x00\xf4\x82\x83\x0b\x2a\xa9\xcc\x24\xaf\x65\x45\x95\x14\x59\x19\x6a\x44\x61\xb1\xa5\x7c\x70\xd4\xd9\x84\xdc\x77\x0c\xe2\x5a\xbc\x3e\x91\x6d\x58\x4c\x70\x54\x91\x0e\xaa\xbf\x1a\x09\x38\x65\x59\xc6\xb1\xdc\xd9\x81\x0f\x4a\x62\xa5\xab\x07\x7c\x28\xc9\xef\x8f\x55\xb3\x5b\xf0\x14\x9a\xf1\xc7\xa8\xc5\x2b\x71\xfe\xef\xe5\x0c\x0f\x4a\x27\x66\x35\xf3\xeb\x98\x82\xa2\x65\x97\x1b\xa9\x07\x71\x93\x17\x5f\x6d\x54\xba\x79\x58\xfc\xef\x1e\x62\x9f\x83\xc9\xb7\xfc\x56\x8d\x1c\x82\x05\xde\xa6\x7e\xfc\xf2\x00\xd3\x96\xad\x29\x36\xab\x69\xaf\x64\x41\x2b\x1e\x41\xba\xcc\x06\x80\x4f\x90\x05\x50\x9d\xc0\xae\xc7\xf7\x03\xc3\x95\xf6\x79\xb3\xc0\x0e\xfa\xf3\xce\xd8\x63\x70\x71\x50\x14\xca\x95\x02\xba\xcb\xec\x77\xaf\xba\xe8\xbc\xea\x6e\xe5\x62\xad\x7e\xcb\x12\x80\x47\xea\xbf\xde\xfe\x50\xc3\xff\xbf\x7e\x7b\xfe\xac\xff\xf7\xbb\xfc\xf3\x52\x7b\x0b\x48\xed\xbd\x3b\x85\xcc\x9e\xb9\x75\x70\x65\x20\x7f\x44\x70\x74\xb8\xcd\x5f\x29\xe8\x92\x98\x7b\xf2\x12\xa6\x10\x38\x4e\x32\xe3\x8c\x40\x8a\x97\xe8\x62\x72\xc7\xb2\xb7\xf1\xa4\x03\x22\x41\xb8\xb0\xbf\xa9\xfc\x2b\x6c\x14\x65\xd4\x5c\xfa\xd6\x97\x23\x68\xe2\x65\xc0\x12\xb1\x88\xf3\x62\xba\x44\x8e\x8b\x80\xd9\x33\x6c\xca\xd2\xb2\xe0\x33\xe4\xb5\xda\x84\x24\xf3\x47\x81\x9b\xc0\xc5\xc5\xbf\x76\x2b\xf8\x6c\x0f\x69\x6a\x08\xe3\x8f\xd7\x23\x5b\xb1\x1e\x29\x93\x8d\xd0\x07\x42\x5b\x84\xa7\x31\xb3\xef\xf3\x9a\xb8\xef\x6f\x90\xbc\x13\x72\x47\x4a\x96\xbb\x02\xf1\x1b\x8d\xcc\x21\x28\x1b\x86\xa8\xd9\x4a\xeb\x1d\x2d\x0b\xe0\x59\x44\x8b\x2b\x13\x21\x28\x6d\x13\x73\x1e\x67\xcc\xbd\x4a\xf3\xad\xbb\x62\xfc\xd5\x6a\x49\x72\x68\x20\xe8\x6f\x9f\x66\xb3\x6b\x01\x4b\x17\xe8\x56\xc0\x2c\x3a\x59\x97\xe5\xf6\xa7\x57\xaf\x1e\x1e\x1e\x3a\x12\x3e\xd6\xc9\x8b\xbb\x57\x6d\x81\x02\x75\x6f\xd1\x00\x03\x6a\x97\x16\x3d\x06\xca\x98\x8b\x16\x4c\x41\xcb\x7f\x6d\xcb\xa9\x5b\x33\x07\x01\x26\x64\xf3\x42\x33\xc7\xcb\x26\x2f\xd5\x01\xae\x97\x0a\x63\x1a\xed\x8f\x90\xe3\xd2\x95\x32\x22\xfe\xac\xfe\x7b\xcb\xa4\x06\xac\xcd\x0b\xe3\x7a\x9b\x16\xfe\x5f\xae\x73\x82\x43\xcc\xd7\x4f\x68\x86\xc7\x04\xba\x30\xfe\xa5\xed\x72\x4b\x64\x64\xcc\xd9\x5f\x04\x82\x1a\x49\x41\xaa\x13\x8f\x75\xc4\xda\x8e\xfe\x04\x72\xc8\xb0\x61\x2f\x83\x3e\xa1\xd9\x45\x0f\x6b\x59\xea\x1c\xa8\xdf\xaa\x7b\xfa\xe0\xba\x02\xe4\xfb\xdf\x7d\x69\xbd\x80\x68\x66\xa3\x38\xc6\x47\x08\x00\x8a\xee\x75\xb7\x07\xc2\x10\xe3\xf9\xb5\xf8\x9f\xff\x13\xa2\xf5\x2f\x5f\x42\x98\xb0\x3b\xba\xe1\x20\x69\xdc\xf7\x83\xef\xbe\x3a\x86\x17\x88\xff\x38\x9f\x01\x1d\x0d\xc4\x22\xe3\xbe\x98\x8d\x31\x39\xf0\x24\xc9\x08\x78\xe3\xa3\xaa\x11\xa6\x13\x36\xb8\xdb\xef\x04\xb2\x0b\x18\x81\xad\xf5\xc9\xb4\x7b\x36\x0d\x83\xb5\xbf\xa9\x2a\xc3\xc9\x23\x43\x72\x3d\x19\xf7\xe6\x88\x18\xc4\x28\xe4\x47\xaa\x32\x13\x97\xe3\x71\x1f\x92\x15\xd3\x78\xf2\x79\xd0\x8b\xa7\x1f\x42\x9d\x06\x14\x62\x18\x4f\x38\xba\xfb\xc1\xfc\x77\xa3\x78\x43\xfb\x3f\x47\xd8\x97\xaa\xe7\x9c\x5e\xc7\x77\x07\x6e\xab\x7c\x7c\x20\x61\x49\x09\x0a\xc7\x0f\xbc\x08\x30\xd8\xac\x50\x8a\xfc\x25\x56\x01\xb4\x02\xd2\xab\xed\x47\x4c\xdf\x69\x5b\x9c\x93\x7a\x78\x65\xac\xcb\x10\xcb\x7c\x23\xc1\x24\xe1\xa3\x95\xce\x20\xb2\x29\x46\x0c\x60\xea\xa1\xb2\x95\xd9\xe1\xd3\xdd\x56\x15\x8b\x7c\xb3\xc5\x3c\x4f\x77\x6b\x7d\x2b\x1d\x19\x2f\x04\x9c\x4e\xf4\xd9\x06\x69\x9a\x64\x79\x62\x7e\x5f\xdc\xca\x4c\x9e\xf6\xd6\x72\xb3\x95\xc9\x1d\x1d\xd1\xe0\x4f\x20\xc2\x4d\x32\xcd\x75\x63\x2f\x8e\x1f\x27\xf6\x5c\xd7\x4a\x89\xff\xd6\x7c\xb4\xfc\xf7\xef\xf6\x1f\x3a\xaf\x7a\xbd\xd3\x8f\x37\xa7\x6f\x7f\xc3\x0a\xe0\xe3\xf6\xff\xdb\xf3\xf3\xb3\xb3\xaa\xfd\x7f\xf6\xfa\xec\xd9\xfe\xff\x3d\xfe\xf5\x40\x51\xe0\x1e\x73\xd4\x66\x17\x76\x3d\x69\xab\xb7\x9d\xb3\x0a\xc4\xaf\xf6\xf1\xb0\xe6\xb5\xfa\x67\x54\x02\x47\xf5\xdf\x54\x3e\x88\x55\x42\x72\x2b\x36\x22\xca\x2a\x75\xe8\x96\x6b\xa4\x8f\xc1\x98\x09\x3a\xea\x4b\xf3\x0b\x10\x9a\x0a\x02\x90\xb5\x86\xd0\x56\xb7\x91\x96\x2a\x44\x0c\x1a\xb0\x57\xc5\xe9\x22\x4d\x82\xba\x0b\x5f\xc9\xa1\x53\x7f\x2e\x02\x2a\x3c\xd0\x35\x8b\x96\xa4\x14\x1a\x72\xfb\xda\x01\x3f\xc1\xda\x16\x2d\xa9\x4f\x13\xdd\x42\xa2\xbc\x86\x47\xdf\x71\xa0\x28\x00\x64\xb0\xf8\x88\xff\x4a\x14\x4a\xb3\x91\x67\x5b\x2e\xe3\x57\x85\x36\x81\xc9\x23\xe6\xc0\x6e\x68\x6e\x43\x83\xbc\xca\x91\x43\xc8\x67\x2f\x6a\xc1\xb4\x57\x09\xda\x43\x07\x04\x0b\x72\x0d\x79\xf6\xce\x8b\x39\xf8\x0d\xb5\x77\x86\xc5\xe7\xfa\xc5\xa3\x13\xcb\x2b\x46\x3a\x22\x24\xad\x90\xe2\xb4\x09\x4e\x0f\x9e\x23\xac\x81\xbc\xf0\x71\x6c\xe4\xca\x22\xc9\x1f\xb2\xe2\x53\x2f\xf4\x1a\xf3\x1d\x54\x45\x69\xcb\x65\x89\x01\x73\x9d\x6c\xbd\xc7\xd8\x39\xf1\xc2\xac\x15\x8a\x3f\x02\x6e\x06\xaf\x75\xac\xb2\x64\x46\x86\xbd\x24\xae\x59\x70\x3d\x02\x8f\xd7\xc9\xbc\xa3\xd7\x0b\x94\x71\x6e\x4e\x65\xea\x09\x42\x67\xe9\x3e\xf2\xe4\x00\x51\x76\xf0\x9e\x85\xc9\x11\xb9\x06\x76\x34\xb3\xf1\xe5\x3b\x17\xa9\xec\xbc\xe8\x85\x6f\x5b\xd9\x30\x66\x5e\xe8\x9f\xc4\x78\x57\xd4\x66\x06\xc5\xf6\x08\x3c\xca\x66\xf2\x2d\xc3\x5b\x48\x4a\xfb\xaf\xe8\x14\xdd\x81\x38\x8d\xeb\xb8\xe7\x0e\x90\x7c\x9d\x1d\xd9\x24\x13\x10\xd7\x76\x35\x7f\x4c\x47\x86\x16\xfa\xe3\xc3\xdd\x81\xe6\x86\xed\x2c\x0a\x75\x9f\x53\x7a\x62\xc8\xfd\x62\xdc\xa9\x25\x27\x73\x15\x67\x8f\x14\x6c\x78\xca\xf0\x6b\x65\x8b\x4b\xb0\xea\xc6\x49\xbf\x26\x65\xc3\xcb\x80\x68\x8f\xeb\x91\x5c\x90\xc5\x65\x71\xab\x4f\xf1\xe7\x49\xe8\xdc\x05\x47\x68\x2c\x91\xb0\x87\x49\xc8\xec\x38\x62\x64\x5b\x2d\x80\xb5\xab\xd6\x0a\x26\xab\xd9\x48\x08\xc8\x7a\xa7\x4d\x83\xe2\x32\xbd\xbd\x2a\x95\x48\xe8\xa8\xde\xa9\x3d\xa0\xf8\x21\x11\xaa\x68\xd2\x13\x77\xee\xec\x92\x19\x71\x2d\x93\x08\x43\xea\xb4\xdc\xfc\x9d\xd4\x11\x57\x39\x9b\x91\x07\xd6\xa4\xf8\x49\x3c\x24\x5f\x93\xce\x82\x0e\x90\x05\x9e\x1f\x60\x17\x85\x6b\xf9\x7f\xac\xf2\xe2\x7f\xd8\xef\x35\x2d\x74\x37\x98\x3f\x89\x8f\x7b\x02\xff\x40\x6e\x01\x77\x49\x65\xe5\x47\x56\x7f\x38\xa8\x3c\x3c\xbc\xb6\xbd\x31\x5c\x7a\xc3\x82\xc2\x5b\xf6\x68\x68\x5a\x6d\x84\x02\x54\xf6\x7d\x2f\xb5\xff\x7c\xcb\xb4\xc9\x6b\x67\x65\x2f\x00\xa9\xf3\xec\x3f\xfe\xed\xdf\x57\x3e\xb2\xf1\x56\xb9\x78\x76\xb6\xf7\x93\xf4\x4f\x99\x94\xff\xf8\xb7\x7f\x27\x7a\x64\x89\x9c\x77\x09\x8b\x0a\xdf\xed\xf0\xba\xe1\xe8\x3f\x2f\x97\x60\x1b\x62\x9d\x17\xb0\x1f\xba\x1e\xe8\x9a\x7c\xeb\xc1\x33\x14\x8b\x61\xdc\xc0\xaf\xa5\x0e\xf5\xfa\xe1\x05\x1d\x31\x77\x48\xf5\xfa\x98\x9b\x73\x5f\x97\x09\xe3\x2a\xec\xb9\xb2\xf2\xec\x03\x33\x72\x41\xc9\x8f\x1d\x36\x28\x67\x40\x64\xa2\x6b\xb0\xfb\x66\x90\x68\xe1\x57\x76\x44\xd7\xb5\xd9\xbc\x1e\x11\x1a\x58\x33\x04\x68\x43\xa5\x4b\xaf\x2c\x48\xea\xaf\x36\xa5\x0f\x19\x4d\xa2\xec\x80\x72\x93\xe2\x2b\x72\x44\x59\x3d\xe4\x8e\xe8\x72\x4d\x2c\x4e\x05\x15\x1b\xde\xee\x83\x63\x03\x39\x91\x51\xdd\x98\xf8\x7e\x97\x58\x02\x4f\xd0\x0d\x38\xb2\xb9\x31\xc4\x18\xe2\xd2\xd4\x87\xb7\xa3\xb7\xec\x7f\xc9\x7e\x54\x4a\xd7\x4d\x84\xe3\x26\x69\x68\x40\xbc\xf8\xb8\xaf\x94\x94\xba\x0a\x67\xaa\x38\x39\x59\xaa\x15\x10\x40\xc0\x25\xdb\x26\x69\x79\xac\xb2\xb0\xda\x61\x54\x2c\x7d\x0b\x5a\x56\xb4\x8c\x8f\x96\xeb\xfd\x4d\xad\x16\x27\xad\xf0\x17\xad\x36\xf0\x60\x7a\xf0\x78\x78\x49\xe5\x5b\x44\x05\x1d\x68\x3d\x51\x81\x2d\x88\x28\x39\xd5\x7c\xcb\x4f\xdf\x30\x1e\x88\x9c\x77\xf3\x21\x58\x42\x1d\xc7\x04\x90\x83\xb8\x7f\x74\xf3\x18\x38\x3e\xcd\x61\xe5\x10\x34\xaf\x87\x75\x5c\x1c\x7e\xd5\xad\xca\xd4\x2a\xa1\x13\xd3\x3e\xc0\xe6\x51\xc1\xca\xdc\xc8\xaf\xb5\xd9\xbc\xb2\xf7\x5a\xad\xde\xea\x50\x43\x3b\x2f\xac\x10\xb4\xf8\x8f\x7f\xfb\x77\xd1\x37\x0b\x21\x71\x10\x45\xd9\x11\xdd\xa5\xdc\x96\xfe\xd3\x91\x1a\xa3\xc9\xcc\xeb\x05\x47\xd4\x34\xd9\x24\xa9\x2c\x78\x50\x61\xbb\x26\xfa\x00\xb5\xb9\x15\x53\x6c\xe8\x0d\xd4\x81\x50\x1e\xbe\xf9\x23\x89\x46\xd6\x83\x94\xe4\x9b\x90\x52\xdf\xd8\x7a\x05\x10\xcb\x45\x44\x8a\x00\x18\xb1\x28\xc8\x00\x3b\xbe\x3d\xbf\xa8\x06\x4f\x09\x20\xa5\x75\x57\x89\x4b\xb2\x1f\xed\xe8\x5a\xa5\x15\x2e\x81\xbc\xc0\xb8\x87\xb3\x44\x57\x4d\xab\x97\xf9\xea\x0e\xf6\x51\x8a\xcd\x4e\x83\x70\x39\xb2\xb8\x7b\xd0\x6d\xe8\x94\x86\xbd\x59\xa8\x45\x0e\x0e\x53\x54\x9f\x3b\x60\x31\x06\xdb\xd1\x51\x3a\x1f\x7f\xa7\xde\x67\x8b\x35\x59\xe5\xc9\x46\x2d\x9d\xd8\x37\xc2\x80\xc4\x26\x07\x81\xb0\xc4\x38\x43\xb0\x66\x6e\x79\xcd\x98\x9b\xd8\x6e\x4c\x4b\xc6\xc2\x56\x21\x6c\x44\x2e\x13\x81\xdd\x75\x74\x54\x93\x0c\x3f\x14\x46\xc8\xca\xbc\xa1\x8f\xcd\x72\x6e\x47\xcf\xaa\x70\x22\xa0\x1b\x8b\xce\xf1\x06\x61\x8f\x82\x5b\xf9\x95\x99\x03\xfa\x14\xed\x6f\x56\xe1\xf3\x60\xf7\xbe\x0e\x3b\xdd\x9f\x2e\x25\xe0\x0c\x8b\xca\xf4\xde\x16\xb9\x5c\x2e\xa4\x2e\xa3\xfa\x34\x43\xeb\x76\x89\xb8\x54\x99\x2a\x12\x2d\xfa\xb2\x94\x66\x5b\x51\x53\x9b\x84\xe8\xd6\x54\xb5\xc2\xbc\x02\x40\xb8\x7b\xab\x52\xbc\x3c\x17\xb2\x54\x77\xe8\x9a\x3c\x71\xe5\x7a\xcf\x0a\x3c\x39\x1f\xc6\x76\x72\xde\x3e\x3d\x79\x6d\xd9\x98\x8e\x0e\x2f\x4c\xc1\xb2\x23\x62\xae\x51\x16\x33\xb5\x58\x67\x79\x9a\xdf\xc1\x06\xb8\x52\x52\x43\x62\x8d\x17\x56\x8e\x8b\x0c\x7f\x69\xce\x9a\x48\xd8\x6c\xa6\x56\x74\x62\x23\x82\xc2\xd9\x44\x51\x90\xcc\x49\x8a\xc5\x6e\x73\xaf\x3c\x98\x07\x00\x2d\x56\xbb\x74\x95\xa4\x29\x18\xbc\x35\x80\x56\xb7\x28\x93\x45\xaa\xc4\xf9\x39\x5b\x54\x5f\x06\xd7\x63\xaf\x6b\x33\x73\x0b\xee\x85\x5c\xe6\x5b\xd4\xa1\x10\x7d\xb5\x50\xc0\x59\xf9\xfa\x2c\xa2\xd2\xd1\xca\xda\x49\x82\x8b\xd1\x29\x77\xc2\xa0\x28\x06\xe6\xd8\xa4\xa7\x53\x7b\xe6\xe1\x58\x49\x0c\x41\x44\xf8\x5f\x4b\x25\x53\x5e\x28\xaf\x02\x09\xcc\x23\x46\xed\xe3\x87\x39\x18\xc7\x08\xe1\x81\xad\xe9\x15\x40\xd6\x8e\x12\x68\xfa\xaa\xd3\x70\xc6\xb8\x93\x41\x16\x65\xa2\xcb\x64\x81\x6d\x29\x15\x70\x6f\xe2\x49\xb7\xa4\x15\xed\xce\x6e\x0f\x75\x98\xd7\xee\x86\x9c\xf0\xcc\x6a\x79\x70\x7b\xdf\x75\x6a\xd7\xbe\x6b\x49\x05\x91\x89\x1d\xac\xba\x7c\xdf\x71\xa0\x44\x1e\x71\x97\x57\xaf\x80\xe5\xf5\x4f\x19\xe6\xfd\x93\x06\x99\xac\x0e\xf2\x7d\x87\x07\xdd\x80\xd4\x1b\x87\xb5\xf3\x7c\xbd\x01\x70\xc9\x86\x13\xdd\x46\xa8\x77\x99\x94\xfb\x93\x44\xe9\x36\x0e\x0b\x20\x01\x6b\x60\xca\x86\x81\x4e\x3a\x62\xba\x46\x3c\x82\xc4\x13\x9b\xe3\x55\xfe\x0c\x7a\x56\x32\xd5\xdb\xe3\xc7\x31\x45\x6c\x7c\x37\x2e\x4e\xa6\xda\xa3\xc6\x7b\xb9\x32\xa3\xce\x65\x60\x64\x01\x1d\xac\x94\x04\x09\xc9\xaa\xc2\xf3\xd6\x4f\xb2\xc2\x4f\x5a\xb1\x6c\x70\x14\x0a\xf0\x46\x24\x27\x95\x17\x7c\x70\x4b\x54\x7b\x05\x37\x66\x53\x37\xca\xc2\xee\x7a\xb8\x3e\x0a\xeb\xa0\x86\x2b\x9c\x11\x36\x96\x42\x1f\xe6\xf2\x67\xad\xc3\x48\x06\xd1\x05\x6e\x53\x49\x08\x13\x70\x04\x01\x87\xe9\xa6\x12\x88\x7c\x73\xad\x18\x5d\x8f\x35\xf2\x7f\xee\x1c\xbb\x3b\x68\x1a\x18\xb8\xe7\x80\x84\x1e\x89\x49\x18\xff\xec\x03\xe7\x83\x39\xb1\x7f\x7c\xff\xea\xc7\x57\x71\x8f\xbb\x10\xef\xcc\xe9\x2b\x33\x71\x2d\x8b\x34\x91\x16\xd0\x6a\x8b\xc5\x77\xd9\x22\x49\xcd\x8f\xe7\xe7\xe2\x4a\x16\x8b\x35\x9c\x8e\x9c\x1c\xc2\xe8\xf7\xb6\xc8\x4b\x65\xb5\x44\xf9\x58\x30\x06\xb7\x16\xe6\x91\x4b\x54\x77\x85\xd3\x74\xb7\x58\x10\x3f\x0d\x50\xfa\xa7\x10\xf0\xa1\x73\x4f\x6b\x2c\x8f\x4e\xf7\x50\xc6\x73\x2f\x53\xc0\x2a\x32\xcb\xce\xde\x0a\x95\x95\xa8\x4b\x94\x22\xae\xef\x2b\x29\xa5\x35\x6c\x14\xb7\x4b\x1e\x73\xb7\x0e\xef\x17\xdc\xe2\x6b\x72\x59\x0a\xac\xca\x82\xb5\x61\xde\x98\x64\x77\xce\x5e\x7f\x0d\xf6\xfa\x74\x91\x6f\x15\x5b\xea\x6c\x6b\xa1\x97\x4f\x8c\x0a\xe7\x07\x88\xce\x9e\x78\x6e\x85\x07\x49\x40\x7c\x06\x06\xdc\x21\x8e\xb3\x08\xa8\x4d\x2c\xc9\x9b\x59\xf7\x51\x95\x1e\xcd\x8b\x38\xfa\xa4\x73\xb6\x16\xec\x80\x6b\xd6\x7c\xf4\x95\xb9\xc7\xf8\xd2\xed\x78\x58\x22\x38\x57\xe1\x04\x6a\xfc\x66\xa3\x76\x6b\x85\xe1\xe3\x63\x47\x58\x22\x3c\x8f\x13\xcf\x3d\xb9\x6a\x84\xf2\xe8\xbf\x3e\x76\x59\xb3\xce\x86\x42\x75\x07\x76\x2b\x97\xf9\xee\xb6\x64\x5f\xe0\xc8\x55\x5f\xbb\x17\xa2\x46\x97\xd8\xa6\x7d\xe0\xf3\xd8\x68\x54\x03\xb4\x12\x34\x55\x6c\x3f\xf8\x9e\x8d\xde\x22\xf6\xea\x0d\x8a\xda\x63\x34\xde\x7c\xf0\xc0\xf2\x01\xff\xa1\xc9\x1a\x7c\x7f\x22\xdb\xfc\xb0\xb7\x1d\x71\xa5\x96\xa4\xa7\x8c\x71\x7b\xfd\x81\x34\x24\x8c\xa5\xe7\xa3\xe1\x34\xd6\x5b\x1b\xab\x74\x16\x5c\xf6\x1c\x49\xc7\x55\xf9\x84\x45\x64\xae\xde\x4d\xf5\xb5\x16\x46\x9c\xe5\x0f\xc0\xe3\x04\x66\x91\x99\x07\x84\xbb\x62\xe2\x6c\x19\x1e\xf0\x87\x5a\x1a\xd4\x1c\x01\x6d\x43\xa5\xd1\x04\x8b\x65\x9b\x0c\xeb\x0c\xcc\x94\x94\x40\xb4\xa6\x0a\x2c\x80\xb1\x21\xb4\xe0\x0a\x5f\xe5\xc5\x6d\x82\x13\x19\xc4\x03\x9e\xd2\x98\x63\x63\xe3\x07\xf5\x9e\xf4\x30\x67\x35\x3f\x6a\xab\x3f\xd1\x95\x00\xb9\x91\x3d\xf7\xa8\x32\xfd\x2e\x65\x72\x4b\x80\x75\xe7\x61\xc8\xf6\xc9\xdb\xb6\xc8\x14\x41\x04\xcc\x1e\xd5\x07\x77\xe6\xbb\x8e\xe8\xe7\x0f\x99\x2e\x0b\x25\x37\xc6\x99\x22\x5a\x93\x4e\x70\x8a\x8c\x7d\x0e\x21\x6f\xee\xcc\xd9\x5b\xb7\x71\x45\x0c\x24\x15\xf6\x61\x47\x0c\xb5\x5d\x99\x6f\x64\x49\x62\x63\x36\xb4\x23\x33\x62\x78\xac\xbf\xf1\xb1\x35\xed\x8c\xa0\xef\x75\x74\xed\x11\x37\x32\xeb\xd4\x1b\x12\xa7\x70\x13\xea\x83\x62\x13\xc9\xe8\xd1\x2a\x10\x2d\xc4\x7b\x10\xb9\x97\xb8\xa6\xa6\x56\x12\x84\x26\x13\x9e\x5f\xe6\xcb\x8f\x3a\x79\x65\x1e\x1d\x8a\x50\x98\xf3\x12\xe9\x62\x6d\x8b\xc3\x72\xe2\xa6\xc1\x22\x13\xf3\xf1\x89\xe2\x01\x7a\x0f\xa3\x43\xb8\x45\xac\x8e\x18\xe5\xe5\x9a\xac\xb6\xa6\xa3\x0f\x54\x9f\xa9\xc2\x8d\xc2\xda\x81\x16\xb4\xd4\x95\x2c\x08\x6d\x79\x92\x26\xa5\x62\x3d\x8a\x56\x46\x82\xb9\x14\x1f\xf7\x01\x12\x54\xc3\xca\x20\xad\x05\xe7\x39\xc6\x86\xb6\xb9\x59\x47\xe6\xf4\xa2\x6e\x60\x20\xcc\x0a\x24\x02\x3d\x9d\x04\x31\x9d\x72\x67\x86\xa8\x72\xf9\xb3\xe3\xa5\xc5\x52\xe9\xe4\x2e\xe3\x70\x06\x2d\x5e\x21\xbd\xe8\xae\xf4\x40\xb4\xde\xb1\xff\xc6\x6c\xd1\xf3\xf6\x49\xb7\x7d\x92\xb4\x39\x56\x34\xf6\xd3\x92\xce\x68\xb9\xca\x0b\xc9\x99\x3f\x67\xc7\xbb\xb2\x15\xe2\x5a\xbc\x43\x37\x9e\x43\x0a\x35\x1c\x40\xc3\xf9\x92\x81\x86\x95\x72\x2a\x84\x91\xd8\x16\xc9\x3d\xc8\xba\x06\x88\x60\x76\xc7\xb7\xaa\xd0\x66\x65\x27\x96\xfe\xf0\x83\x58\x73\xfd\x56\x48\xd9\xc2\xc9\xfd\xca\xd8\x3d\xf1\xa8\xf7\x03\xc3\x4d\x51\x44\x97\x6c\x44\x17\xb2\xa9\xba\x15\x09\x49\x9e\x70\x0b\x46\xb6\x82\xde\x55\xc3\x38\xab\xe5\x9a\x8a\x54\xcd\x45\x57\xc8\xa5\x82\x24\xa8\x17\x2c\x7a\xda\x60\xfb\x06\xc3\x77\x8d\xd3\xde\x15\x27\x11\x3b\x0f\x59\x97\x09\x07\xc0\xe1\xe6\x23\xf3\xe9\x91\xed\xee\xca\x83\x90\x8f\x2e\xdd\x87\x0c\x69\xcc\xff\x03\xa7\xc8\x22\x51\xe5\xde\xa6\x62\xf7\xa1\x76\xbf\x69\x1f\x98\xab\xb0\x49\xca\x1c\x7f\x0b\xa0\xb8\x54\x9b\x9f\x70\x48\x50\xa7\x6e\xad\x36\x0a\xeb\xc4\xd2\x94\x89\x61\xa5\x56\x95\xb0\xbe\xab\x30\xa2\x1a\x82\x03\xdd\xc7\xb5\xc1\x63\xe0\xfc\x80\x37\xfe\x5d\x24\x7a\x9e\xad\x06\x47\xc5\x63\x27\x61\xe2\x17\x77\x01\xde\xb0\x12\xe5\x68\x2a\x2f\xb0\xa9\x81\x32\x44\xc5\xe3\xce\x1d\x40\xb2\xe4\x98\xc9\x1d\x14\xb3\x65\x2e\x02\x6f\xcc\x30\xca\x3e\x01\x59\x4f\xc5\xa0\x6f\xc0\x32\x63\x81\x6a\x82\x0a\x81\x10\xef\xa9\x6e\x19\x1b\xff\xad\xb5\x22\xe4\xaa\x4f\x3a\xcc\x66\x46\xc6\x06\x8f\x18\x21\x65\x4e\xb8\xdc\xf1\x50\xdc\xc5\x06\xd5\x9e\x70\x40\x46\xae\xe2\xa9\x4a\xdf\x47\x19\xc6\x86\x9e\x78\x83\x76\xbb\x17\x5b\xad\x76\xcb\x3c\xdb\x6f\xe0\x0a\xb4\x2f\x6c\x7f\x08\x7b\x95\x30\xa1\x9e\x5f\x43\x51\xfd\x0c\x7c\x88\x04\x89\x29\xca\x02\xb4\x38\x5c\x38\x16\x6e\xea\xca\xb7\xef\x8f\x7d\x59\xf9\x35\x18\xf9\xca\xc3\x75\x85\x4f\x81\x87\xcc\x27\x03\xb0\xb7\xf7\x5b\x55\xa4\x49\xf6\x95\x1f\xd1\xe4\xec\xf9\x87\x49\x73\x8d\xed\x87\xc0\xb6\x61\x35\x64\x33\x5a\xb0\xbe\x78\xcd\x1d\x9e\x50\x5a\x70\x32\xe3\x2f\xd3\xa2\x40\xae\x05\x75\x9f\xe4\x3b\x1d\x9a\xa7\x15\xaf\xb1\xe7\xbd\xf6\x60\x7e\xe5\x29\x37\x16\x66\xc0\x1c\xbd\x52\xa9\xbe\x95\xc0\xbb\x4e\xe7\x5f\xc3\xc0\x35\xfa\x82\xde\xf9\xce\xf6\x9c\x96\x65\xa2\x89\x03\xcb\x33\xd1\xea\x97\xf6\xe1\x15\x1b\x68\x13\x23\xdb\x64\x84\x11\x12\x66\xbc\xca\xa0\xc1\x36\x87\xf7\xc8\xe9\x50\xa5\x11\x2e\x9d\xc0\xaf\x7d\x75\x99\x1f\x6a\xf9\x2d\x11\x61\x10\x55\x40\xd3\x9a\x02\x2a\x22\x2c\x7f\xc2\xa4\xa4\xcf\x71\x67\xf1\x01\x3e\x30\xd0\x5d\x63\x83\xd5\xe1\x1d\xea\x4e\x2e\x92\x58\xf4\x8b\xe4\x7d\x58\xa4\x8f\x41\xa8\xdb\x46\x4f\x5a\xdd\x9e\xf7\x1c\x9c\xb7\xb5\x6c\x98\xf9\x93\x0d\x58\x00\x9e\xba\x96\x9b\x73\x99\x38\x5b\xac\x63\xd6\x37\x15\xef\x32\xdd\x23\x23\xcd\xab\x2f\x40\x7a\x3c\x88\x1e\x00\xef\xad\xd5\x3e\xaf\xae\x3d\xee\xe9\x5b\x8c\x5c\x1d\x8e\x39\x76\x5e\x7c\xa9\xe7\x24\xad\xeb\x8e\xdb\xe0\x58\xc8\xf2\x3b\xa3\xe6\x3f\xd1\x6d\xb6\x3a\x12\x8c\x09\x9c\xcc\xf3\xb6\x1f\x02\x2b\xfd\x4a\x6a\xf5\x8d\x60\x06\x80\x36\x3b\x10\x2c\x02\x7b\xa0\x10\x12\x78\x35\x4b\x89\x34\x8d\x24\x78\x6f\x6f\x1d\xb3\x69\xbc\x61\xe7\x48\xe7\x07\xb2\x9a\xe9\x18\xb3\xaa\x2c\x4f\x78\x24\x3f\xc2\x3d\x1b\x32\xde\xf6\xd7\xc1\xfe\x04\x04\xcf\xd1\x9c\xa2\xd5\x81\xff\x65\x0f\x10\x27\x6c\x7e\x26\xd0\x12\x1b\x46\xe5\xd6\x01\x50\xba\xba\xda\xec\x09\xbb\xe8\xb8\xcd\xe6\x87\xae\x8e\x9f\x63\x3c\x6c\x7f\xfb\x3c\x74\x5e\x1c\x8b\xdd\x05\x81\x89\xb7\x68\x9c\x60\x0a\x2f\xc4\x7a\x17\x0a\x23\xf6\xb0\x46\x0f\xb0\x3f\x54\xfc\xca\x86\x74\x7d\x65\x6b\x30\x23\xdb\xb1\xe4\x2a\xb7\xed\x1d\xa2\x3e\x82\x3b\xfa\x4b\xc8\x79\xed\x42\x8e\xa0\x1a\xce\x10\x68\xb6\x01\xe7\x59\x0a\x84\x60\x16\x4f\xc1\x62\x3f\x29\x59\xd1\xa5\xfc\x6a\x33\x0e\xde\x51\xf9\x24\xbf\x89\xe8\xf9\x0e\xdc\xd1\xfa\x34\xd1\xc4\x31\x76\x6a\xb3\x2b\xb8\xd1\x10\xa3\x9e\xe5\x8e\xa4\x9d\x79\x5d\x8a\x80\x55\xdb\x49\xf3\x9b\x99\x5e\xa8\x22\x3b\x88\xaa\xa9\x91\x0c\x44\x8e\xf6\xdb\xba\x03\x2e\x3f\x59\x41\x82\x36\x67\xf8\xc3\xa6\x00\x2d\x78\x54\x65\xf6\x8e\x1e\xa5\xf5\x8e\x9a\x68\xc4\x5d\xd2\x3b\xad\xc8\x2a\x2c\xd5\x4a\x81\x20\xbd\x5c\x2c\x76\x05\xb8\xbd\x0c\x53\x83\xa1\x5a\x40\x20\xdc\x7b\x00\xf3\xa6\x71\xff\xf3\x02\x16\xaf\x0d\x90\x1a\x13\x2f\xbf\x57\x05\xe2\xe0\xf0\xec\x76\x66\x9f\x0e\xed\x3e\xeb\x3d\x52\x24\xd7\x6c\x51\x90\x4d\x77\xc1\xf7\xc8\xca\xd7\xf3\xaa\xe4\xc8\x93\x7f\xa8\x73\xfc\xe0\x90\x63\x99\x64\x66\xfe\xf1\x1a\x03\xbe\x83\x60\x65\xdd\x2a\x40\xf3\xa3\x29\x61\x8e\x84\x1c\xcd\x1b\xcc\x32\x95\x6b\x65\xbc\xb9\x93\x47\x00\x1a\x99\xba\x4b\x93\x3b\x33\x4c\xed\x10\x53\xc4\x18\xd3\x06\xfe\x73\x47\x8e\xce\x4c\xe8\x51\x48\x83\x1e\x89\xed\x2e\x4b\x10\x97\xae\xbe\xa9\xcd\x36\x95\xfe\xba\xb2\x44\xb6\x40\x6f\x17\x31\x47\x27\x16\x36\x58\xbe\x45\xa2\xae\x05\xad\xef\xe6\xd0\x7c\x7e\xfc\x52\x8c\x60\xe4\xcc\x79\x59\x4b\x25\x83\x26\xb4\x5c\xde\x27\x60\xf6\x51\x7a\x12\x86\xdd\xd2\x80\x21\x21\xd1\xe3\x0d\xe5\xd5\x22\x7d\xec\x81\x59\xb2\xb6\xd0\x82\x8b\x65\x1e\x5b\x2c\xde\xf7\x0f\x2e\x96\x05\x06\xe0\x0f\x79\x24\x24\xae\xd1\xdc\x0e\x1b\xce\xc2\xaa\x74\x4b\x3c\xe6\x23\x0d\xab\x4c\xda\x87\x0f\xb9\x4d\x6e\xae\x2d\x82\x06\x01\xb7\xe2\xb7\x64\x03\x04\x1e\x32\x33\x3b\x2f\x4f\x77\x65\xd0\x50\x2c\xe9\x4b\xee\xb1\xcd\x41\x2d\x8a\x3b\xcc\xdf\xc3\x61\x3e\x53\x54\x51\x34\x23\x3a\x23\x36\x60\x25\x1d\x49\x95\x85\xc0\x28\x0e\x36\x7f\x5c\x3e\xe7\x11\x9c\x5b\x20\x51\xe3\x31\x1a\xd1\x1d\xbb\x92\x49\x5a\x4d\x2c\x1d\x4a\x31\x12\xb6\xeb\x31\x3c\x81\xcf\x80\xe5\x07\xd0\xf9\x28\xc0\xc5\xe4\x1e\xe5\x83\xcb\xeb\xf7\x07\xd0\xe0\xf0\x03\xab\xb4\x5b\xef\x4f\x64\x1b\x7c\x8f\x42\x25\x19\x92\xfb\xff\xe4\x42\x1c\x61\xf8\xbe\xc2\xc6\x65\xfe\xe3\x3e\xc9\x53\xcb\xc5\xb5\xd8\x41\xd8\xd5\x45\x44\x4b\xfb\x5b\x18\x96\x24\x13\x6f\xce\xc4\x12\x2a\x3a\x08\x68\xca\x47\xaa\x75\x1f\xec\x03\x3f\x90\xaa\x2e\xba\x71\x00\x9b\x64\x25\x0a\xdb\x54\x48\xad\x57\x11\x88\xb4\x03\x9e\x6c\xb6\xbc\x3f\xb9\x6d\x7b\xc9\x43\x64\x00\xf4\x42\x53\xfe\xb1\x60\xb6\x1c\xb3\xd1\x6a\xa5\xbe\x1a\xff\x47\x2d\x79\x55\x41\x8f\x6c\x07\x8e\xe6\x22\x96\x8f\x35\xb0\xf2\x52\xa8\x14\x21\x51\xac\xc6\x49\xa6\x0a\x02\x16\x20\x6c\x4c\x47\x14\x42\x97\xf9\xb6\x4e\x63\xda\x60\x72\xe0\x08\x94\xc9\x46\x79\x21\x60\x9b\x80\x80\x6b\x06\xc2\xba\x76\x9d\x1e\xea\xa8\xea\x38\x02\xa5\xf3\x48\xbc\x8b\xc4\xfb\x48\xfc\x80\xc6\xcb\x1f\x98\x96\xcb\x3e\xc7\x27\x75\x3c\xe4\x56\xfd\x00\xbb\x1f\xa3\xe9\x33\x9b\x02\xea\xd5\x82\x76\x41\x0e\xd2\x51\x3c\xfa\xd0\xee\xef\x4d\xe8\x38\x38\x0c\xfa\xb4\x66\xfb\xef\xd0\x2e\x74\xc1\x45\x88\x7a\x2f\x2d\x42\xd4\xbc\x02\xd1\xb9\x60\x17\x47\x5e\x61\x51\x92\xdd\x51\x9d\x9e\x45\xbe\x79\x55\x80\xcd\x33\x03\x25\x39\xc8\x4d\x85\x7a\x55\xa1\xf0\xa4\xd5\xe8\x4c\xb2\xa5\xda\xaa\x6c\xe9\x25\x7d\xbe\x2b\x5f\xc6\xa3\xfd\x07\x18\xed\x01\x9f\xfe\xc1\x29\xfb\xe8\x16\x3b\x90\xa1\x27\x6d\x3b\x7f\x4a\xfc\xeb\xa5\xcc\x8d\x3f\x89\xce\x24\x5c\x53\x91\xcd\x78\x45\x5e\x36\x2e\x48\xb4\xc1\x54\x1e\x4d\x17\x61\x35\x20\x14\x3c\xa5\xf2\xc1\x5c\xae\x7b\xab\xdb\x61\x79\x2a\xea\x58\xab\xe6\x55\x7d\xcc\x1c\x3b\x44\x52\x5a\x87\x0c\x2c\xcd\xa4\x2f\x43\x96\x52\x8f\x90\xf4\x56\xd5\xd2\xa7\xdf\x49\xfe\x99\x94\x01\xcd\x27\x17\x10\xb9\xb6\x2d\x64\x46\x13\xc0\xcf\x0e\xdf\xaf\x15\x2a\xc6\x39\x76\x90\xaa\x97\x46\x23\x87\xc7\x26\x2f\xdb\x63\x7c\xa9\x98\x70\x3f\x80\xb9\x58\x40\xfa\x11\x6f\x66\x6f\xe7\x1d\x1a\x43\xe6\xd3\x03\x8b\x61\x49\x42\x36\x96\x60\xd1\xdd\xc9\x60\x77\x32\xc2\xf1\xc0\x86\x85\xb2\x8f\x86\xab\x64\xf9\x0b\x33\xa0\xb5\xd2\x0c\xcf\xe2\x32\xb7\x59\xc4\x79\x16\x30\x75\x22\x5a\x34\xc9\x7d\x92\x2a\x96\x6d\x48\xe0\xb4\x01\x93\x2d\x0c\xf5\x54\xf3\x95\x37\xf9\xce\xc7\x33\xd8\xa4\xba\x85\x92\x99\x85\xe1\xdc\xc0\x3f\xef\x8a\x44\x2f\x93\x05\xe3\x61\x2d\xe0\xa2\x53\xaf\xc1\xb5\x45\xdc\x96\x62\x2d\x29\x6b\x95\xb9\x30\x44\x66\x29\xf0\xb1\x16\x35\x55\x53\x7b\xdc\x7f\xd8\x13\x2a\xab\x6b\x78\x20\xae\x60\x0e\x1e\x97\x96\x4f\x50\x73\x91\x04\xe2\xa0\xc1\x0c\x00\x95\x3e\x5e\x09\x5c\x63\x42\x01\xef\x96\x9d\xca\x16\x61\x78\xbe\xd9\xe3\xf0\xd1\x72\x63\xd8\xa1\x4b\x3a\xed\x43\x2c\x23\xd1\x4a\x78\x85\x12\xbd\x33\x5e\x16\x7d\xfc\x5b\x5f\x71\x2c\xdd\x12\x0c\xb2\xe5\xc9\x69\x4d\x72\x6b\x31\xc5\x8b\x9f\xe6\x72\xaf\x8d\x5f\x99\xb0\x96\x85\xab\x9a\x7c\xac\xdd\x30\xa1\x7e\x9c\xc2\x71\x6a\xb1\xa6\x64\xed\x01\x79\x9a\x2c\xcc\x2a\xb3\xb4\x8d\x82\x2b\xa7\x2b\xd5\x5b\xfc\xc9\x86\xf9\x75\x16\x14\x43\x57\xe0\x65\xde\x99\xec\xf2\xab\x75\xb6\x00\x11\xa0\xb5\xdd\x27\x81\x97\xfc\x2e\x6f\xac\xfb\xe7\xb3\x07\xd6\x4f\xc0\x30\x44\xfb\xfd\xb1\xba\x83\x06\xe1\x10\xb8\x46\x32\x0f\x7d\x13\xc2\x72\x58\xfd\xb2\x79\xd1\x06\x7d\xf8\x9e\x4b\xdf\x0b\xc9\xd0\x78\xd5\xca\x15\x9f\x70\xdb\x1a\x13\xe0\xae\x90\x5b\x4f\x24\x27\x28\xf2\x2e\x6b\xc5\xe6\xba\x61\xc3\x3b\x00\x47\x29\x01\x59\xd1\xbc\x14\x7e\x77\xba\xc2\xe7\x7f\xbf\xf2\xbf\xce\xab\xf1\x74\xf8\x5b\x92\x3f\x3e\xca\xff\xf2\xfa\xfc\xcd\xbb\xd7\x15\xfe\x97\xf3\xf7\xef\xdf\x3e\xf3\xbf\xfc\x1e\xff\xcc\x7d\x38\xde\xaa\x4c\x4c\x99\x1c\x89\x0d\x9a\xfb\x8e\x38\xef\x9c\x21\x8f\x53\xf3\x27\x4e\xbc\xcb\x55\xb5\xda\x7e\x85\x0c\x9c\x80\x3e\x83\x46\x85\x40\x03\xbf\x6a\x95\xca\xbf\xe4\xc5\xd7\x56\x5b\x3c\xc0\x7d\x9e\x3f\x64\xaa\x08\x1e\x8e\xc2\x59\x52\x23\xe2\xbf\xca\x7b\x48\xd9\xf8\x64\x03\x08\x57\x08\xc5\xbb\x3f\x62\x56\x23\x04\x04\xd8\x2b\x38\x78\xff\x4f\x2f\x9c\x62\xbd\xbb\xd2\x0f\x8c\x0d\xb1\x1e\x9f\x77\xce\x5a\x2f\xf8\x97\xe0\x86\x02\x05\x65\x5b\x5c\x62\x6d\xfb\xca\x8b\x29\x59\xd4\xfb\xe3\x00\xf3\xd3\x43\x08\x73\x0f\x4e\xbe\x55\xc5\x56\x95\x3b\x99\x56\xb0\xe7\xaa\x0a\x30\x5f\x56\x90\x2d\x56\xb9\xb0\x2d\x7c\xcd\xf3\xfa\x80\xe0\xcd\xb8\xf5\xd0\x0b\xb7\x6d\x2c\x68\x39\xa0\x8d\x7e\xd2\xea\xbb\x5f\x99\x27\xe8\x56\xbb\x5a\xf0\x1a\xbc\x81\x9f\xbb\x68\x57\xa8\xa0\xf1\xb5\x7c\x5d\x85\xad\x32\xb6\x5f\xf5\x3d\xa1\x61\x16\xb9\xe4\x18\x3a\x39\x39\xfb\x7d\xfc\xd4\xf0\x89\x79\xd1\xf0\x40\xc6\x23\x7a\xad\xb2\x0e\x51\x9d\x7f\xa7\x79\x9d\x70\xff\x96\x38\x6e\x58\x70\xd3\xd0\x25\x96\x8f\xf7\x11\x15\x8a\xc7\xc4\x72\x65\x36\x7f\x07\x19\x47\xbd\x15\x47\x58\xb6\xbf\xc7\x72\x23\x0b\x87\x35\x0e\x58\x09\xed\x21\xa3\x3a\x4b\x54\x06\x4b\x1b\xd0\x3e\xe8\xd9\x14\x4a\xa8\xcd\x6d\xbe\xf4\x78\x71\x2a\x73\xaf\xc5\x6a\x57\x64\x68\x9d\xd6\x10\x43\x6e\xff\xf6\xe0\xcd\xad\xb6\xa8\xab\xca\x53\x11\xce\x8a\x78\xde\xb4\x4c\x1b\x96\xfe\xef\xbb\x49\x1b\x2a\xba\xb0\x03\x4f\x6c\x7e\x75\xf1\x22\x67\xab\xb7\x24\xa6\x08\xff\xe8\xe5\x4b\xe5\xd6\x85\xad\x66\x68\x79\x7f\x6e\x79\xc5\x3e\x5b\x80\x36\x15\x84\x54\x6b\xde\x8c\x2b\x70\x75\x1b\xa0\xeb\xe0\x22\x62\xba\x32\xf5\xab\xc1\x42\x4a\x5a\xa2\xad\x30\x5f\x27\xc1\x57\x2a\xf7\x82\xac\x26\xf3\xb4\x3f\x3a\x39\x4e\xb5\xc0\x91\x43\x6d\x50\x83\xf4\xb4\x50\x72\x09\x6f\xf6\x55\x53\xfd\x01\x69\x3e\x64\xd2\x9c\xd1\x1d\x35\xc9\xd5\xf0\x93\xb0\x72\x6d\x83\xdc\x69\xa1\x3b\x3e\x99\x01\x61\x1d\x03\xf4\x84\x83\xf4\x24\xbe\x18\x02\x60\x7a\x52\xb9\x40\x44\xcf\x93\xbb\xc1\xd8\x2d\x1f\x77\xb3\xcd\x75\x02\xb0\x4d\x0f\x55\xb3\x90\xe9\x62\x67\xab\xb3\xd1\x2d\x14\x49\x86\xf9\x2a\x00\xee\x61\x40\xe6\x5e\x65\xa8\x08\x81\x13\x42\x71\xce\x15\xfa\x95\x30\x3a\x52\xbb\x1e\xb2\xcc\x82\x6e\xe0\xf4\x0f\xc6\x8b\xa4\x04\xad\xee\x82\x95\xdc\x5a\x2e\x0b\x92\xda\x22\x94\x52\x63\x47\x20\xe9\xf4\xfd\x17\x7e\xb5\x80\xb7\xbe\xa6\x80\xeb\xb7\x6d\x7c\x74\xb3\x77\xcd\x0a\xbe\x28\xf2\x8d\xbd\xf0\x2f\x91\x4a\xa6\x1a\x03\xe2\x3f\xdb\x9b\x81\x82\x79\x56\xc5\xdc\x66\x10\xf0\xb5\xec\xd1\x42\x9e\x90\xda\xa8\x23\x3a\x2f\x75\x84\x1f\x10\x5a\x2d\x0a\x55\x56\x3c\xc9\x83\x92\x01\x1e\xb6\xf6\xa0\x80\x01\x06\x89\x89\x24\xbf\x22\x4b\xef\xd7\xfd\x56\x0f\x1b\x06\x25\x60\xa6\x23\x4d\xe9\x78\xde\x30\x46\xc4\x53\xe0\xe1\xc3\xde\xd5\x4c\x36\x1d\x68\x4c\xbd\xe2\xd7\xca\x43\xb3\x88\x22\x20\x68\x4d\x10\x2e\xd0\x61\x5f\x29\x5d\x0b\xa9\x57\xfc\x33\xb2\x8f\x91\x58\x72\xd3\xed\xf1\x84\xe9\x0b\x03\xd0\x66\x98\xd7\xc9\x6d\xe2\xed\x6f\x08\xaa\x39\xd8\x33\x9e\xdc\xd5\x74\x81\x8b\x93\xda\xac\x63\xb6\x3f\x7a\x6c\xb8\x38\x8d\xa7\x75\x28\xdd\x51\xe1\x97\x30\xbf\x33\xab\x14\x2a\xe6\x53\xd1\x57\xdb\x34\xdf\x63\x85\x86\x3b\xcf\x1b\xfe\xec\x9f\xeb\x3b\x0c\x0f\x35\x49\xba\x3c\x6e\x17\x11\x2e\xf2\x41\x12\x7e\xdf\xd6\x5f\x3f\xfe\x55\x8a\x29\xe0\x81\x82\x16\x01\x2b\xbe\xca\x6c\x5f\x51\xee\x80\x60\x26\x43\x30\x9e\xf6\x7c\x59\x84\xc2\x27\xbe\xe6\x23\x32\x38\x55\xe4\xb9\x25\x26\xa0\x1d\xb5\x6b\x9d\xbd\x2e\xbf\x87\x68\x1b\x12\xc1\xaa\x42\x64\xaa\xc4\x12\x7d\x6e\xbc\x77\xe7\xf8\xe4\x95\x6e\x42\x97\x2a\x85\xe8\x2e\x41\xab\xc8\x39\xaa\xf7\xb6\x23\xba\x1a\xd9\xd0\x30\xbd\xe9\xc2\xde\xec\xad\x90\x09\xe2\xe2\x42\xb0\xad\x61\x09\x12\xd1\x0f\x12\x17\xb1\x46\x7c\xc3\x32\xe0\x63\xbc\x7a\x5e\x49\x51\xa3\xf1\xaf\x1b\xbb\x54\xc2\x5f\x2d\xbd\xe2\xa8\xbc\xc3\xef\x6a\x80\xd6\x20\x1f\x15\x48\x01\x30\xe9\xce\xc9\xa2\xcd\x47\x11\xd0\x7b\xb7\x19\x7d\x85\x82\xfe\x8d\xc0\xac\x7d\x47\x0c\x07\xbd\x78\x34\x1d\x4f\x98\xa9\x7a\x2a\x66\x9f\xba\x33\x60\x20\xee\x8d\xaf\x6f\x40\x6f\x0e\xe9\x8c\xfb\x62\x36\x86\xdf\x8f\x27\x83\xcb\xc1\xa8\x3b\x14\x5f\xc6\x93\x3f\x89\xc1\x54\x8c\xbf\x8c\x1c\xb9\xb6\x7d\x20\x28\xd8\xd1\xa3\x6a\x5f\xb1\xd2\x77\xf8\x45\xfb\x25\x10\xb3\x13\x5d\xf1\xb9\x3b\x1c\xf4\x45\x6f\x3e\x99\xc4\xa3\x19\xfd\x39\x16\x17\x93\xf1\x55\xa5\x69\xe6\xdd\x93\x4e\xb3\xc4\xe1\xac\x3b\x03\xd9\x4c\x62\xe4\xbe\x8a\xfb\x83\xee\x2c\x1e\xde\x88\xeb\x49\xdc\x8b\x63\xa0\x72\x9e\xc6\xa3\x59\x3c\xea\xc5\x51\x73\x3b\x2d\x75\x38\x36\x0c\xa8\x9b\xb9\x35\x4f\x11\xfb\xbc\x39\x22\xe8\x19\x3d\xa6\xe8\x69\x5a\xc4\xcf\x11\xe3\x8b\x9a\x74\x27\x4c\x8a\xc7\x30\x7e\x78\xb8\x1d\xf1\xf8\x30\x26\x7d\xcf\x23\xda\x9e\x20\x3c\x38\x9a\x0d\x26\xb1\x98\x0c\xa6\x7f\x32\xa3\x4a\x53\xff\x2f\xf3\x2e\x13\x52\x37\xbe\xc7\xf4\x42\xdc\x8c\xe7\x1d\x1c\xa9\x50\x93\xd2\x76\xa5\x37\x1e\x11\xfd\xf7\xd4\x8c\x60\x3c\x9d\x12\x9d\xb8\x69\x8c\x65\xc8\xa6\x61\x06\xb1\x56\x1e\xf2\xd9\xb8\xfe\xce\x9a\x16\x22\x2f\x06\x6f\xca\x5c\x43\x50\xf4\xb0\x7d\x10\x8b\x48\xdf\x1a\x8d\x45\x6f\x30\xe9\xcd\xaf\xa6\xb3\xee\xa8\x07\xed\xec\xbb\x3f\x0d\xe3\xcb\xee\x90\x48\xc5\x1d\x8f\xf8\x61\x96\xf0\x76\xe4\x31\x8c\xfb\x8c\xe1\x91\xc7\xe0\x6e\xf7\x80\x63\x6a\x9f\x8d\x81\x46\xfc\x3a\x9e\x4c\xc7\xa3\x23\xbc\xed\x96\xab\xdd\x27\x70\x3f\x48\xd6\x4e\x52\x92\xbd\x4f\x5d\xd3\x20\xb3\xdd\x88\xb5\xbc\x3b\x15\x5d\x31\x89\xa7\xf3\x61\x6d\x16\x58\x8f\xd2\x52\x98\xd7\x26\xff\xf8\x52\xe6\x77\x9b\x3e\x30\xbf\xfb\xe5\x78\xdc\xff\x32\x18\x0e\x23\x7c\xc2\x74\x36\xbe\xbe\xee\x5e\xc6\x66\xac\xae\xae\xe7\xa6\x61\x17\xdd\xc1\x70\x3e\x81\x97\x5f\x75\x87\x17\xf3\x51\x0f\x9f\x46\x03\x01\x84\xfd\xc3\x21\x0e\xa7\xf9\x96\x59\xe6\x41\x4f\xf1\x65\xf1\xd4\xb1\xac\x03\x8f\x3a\x0d\xa8\xa7\x5f\xfa\x31\x36\x7f\x1e\x5d\x8c\x27\x57\x4f\xd3\xce\xe4\xd1\xb1\x12\xa4\x3e\xb7\x3c\x3d\x79\x34\x9e\x89\xee\xf5\xf5\xf0\xc6\x4c\x64\xa8\x8e\xda\x8f\xbb\xb3\x4f\x40\x6b\x0f\x4d\xe9\x0e\xc5\x60\xf4\xc7\xf9\xe4\x86\x86\xdf\xcc\x06\x1c\x76\xd8\xdc\xee\x64\x76\xf3\x72\xea\xd3\xce\xd3\x7e\x8c\x7f\x9e\xc1\x39\x70\x7d\x3d\x1c\xf4\x60\xc9\x0c\xbb\x5f\xcc\xa1\xf5\x69\xf0\x71\x30\x9b\xe2\xd7\x5d\x23\x3b\x62\x3a\xbe\x8a\xc5\x1f\xe7\x93\xc1\xb4\x3f\xe8\xa1\x34\x70\x7f\x8c\x0d\x1d\x0e\xc7\x5f\xe8\xa1\xbd\xe1\x7c\x0a\x7d\x9a\x54\x7a\xe8\xd6\xd7\xc1\xe5\x15\x89\xe9\x18\x07\xc7\x3d\xc7\x4c\x94\xf7\xa0\xab\xee\x4d\x38\x36\xe6\xc4\x30\xfb\xf2\x0f\x6d\xd1\x75\xbc\x78\x55\xe4\x99\x35\x31\x55\xaa\x15\x94\x1c\x06\x76\xe0\x09\x98\xf4\x78\xf1\x5b\x12\x7a\x2b\x3c\x75\xab\xca\x07\xa5\x32\xaf\xd0\x1f\xc9\x0b\x02\x00\x7e\x58\x46\x4b\xe4\xd6\x35\x5b\xe8\x58\xd4\x2d\xb2\x05\x5c\xb2\x2c\xd5\x66\x5b\xda\x92\x7d\x76\x21\x1e\xb9\xe2\x7f\x71\x37\x82\xf2\x3b\x36\xae\xd1\x02\x9c\x77\xa6\x1d\xcf\x6f\x03\x51\x56\x00\x11\x38\xba\x12\xd6\x01\xa3\xe2\xc2\x7c\x97\x95\x85\x15\xec\xbe\xdd\x57\x78\xa4\x4a\x60\xa2\x02\xb3\x18\x50\x0d\x0a\x34\xd2\x3c\xae\x12\xaf\x5a\xa5\x99\x00\xc9\x57\x7d\x3b\x47\xc9\x37\xb2\x5e\x22\xfa\x3b\x55\x3b\x35\x92\x25\x06\xd6\x3f\x46\x41\x28\x61\xd8\x4c\xeb\x3a\x5b\xbb\xf2\xa8\xba\x32\xa5\xe7\xea\x9a\x2f\xee\x6d\x7d\x3a\xb8\xe2\xca\xab\x7c\x7c\xb4\x5b\xcc\x24\xc0\xad\x83\x45\x02\x5d\xf0\x20\x13\xeb\x3c\xb3\x28\x69\x8c\xa0\x7a\x1e\x5b\xd5\x8e\xfb\xb1\x2d\xae\x76\xe0\x97\x7a\x5b\x01\xcc\x56\x8a\x45\x76\x17\xb8\x39\x66\x75\xa7\xeb\x00\xc6\xd1\xf2\x76\xfc\x5a\xbd\x64\x98\x66\x92\x2a\xa7\x98\xca\xde\x0c\x0a\xbd\x87\xea\xa9\xe0\xb2\x4d\x07\xa2\xa7\x8a\x12\x6b\xe7\xf2\xad\xb2\xb2\x56\x56\x4a\x82\x79\x1e\x2b\x21\x61\x4f\xb6\x12\x93\xa8\x2c\x2e\x9e\x68\xd1\x7a\xca\x60\xb5\x8c\x43\x8d\x32\x33\x2c\xb5\x5a\x77\xb6\x5d\xd4\x94\x09\x7e\x1c\x06\x54\x96\xb6\x91\x30\x49\xe7\x67\x6d\xf1\x47\x0f\xf2\x11\x89\xcf\x8a\x75\x31\x2f\x41\xad\xcf\x34\x70\x28\x1f\x3a\x4d\xbe\x04\x0f\x18\x43\xad\xb1\x97\x79\x51\x51\xdf\x6c\xf2\xa9\x37\x32\x81\xfe\x3b\xaf\x1c\x86\xdb\x46\xf7\x03\x1c\xca\x03\xc1\xd9\xca\x90\x0b\x54\x27\x4b\xf4\xab\x6c\xd1\x8d\x1f\x79\x42\x0d\x23\x02\x00\x6c\x80\x31\x7b\xa7\x93\x0c\x8a\x16\x2c\x89\x37\x62\x2e\xac\x94\xa0\x2c\xc3\x17\x3b\x61\xdc\x04\x53\xf1\xab\x34\x59\x94\xa7\xf9\xea\x34\x95\x0f\x0e\x2b\xa5\xd1\xcf\xf6\x7d\xc6\x50\x99\x70\x44\xf1\xcf\x1e\x44\xd0\x4a\x92\xfb\xe8\x11\x21\xab\xc3\x1d\x87\x6c\xb0\x53\x99\xc2\xb1\x71\x99\xe7\xcb\x4a\x95\x32\x36\x0c\x88\x7d\x43\x70\x5b\xc5\x21\xde\x95\x66\x90\xe0\x2f\x7a\x91\x6f\xeb\xa7\x50\xce\x32\x86\x7c\x06\xf1\xda\x73\x38\xaf\xb0\x16\x9a\xea\xf6\x5c\x21\xcf\x56\x65\x54\x93\xce\x7d\x36\x87\xb6\xcb\x70\x75\x17\x65\x24\xce\x7f\x80\x5f\xf7\x3a\xe2\x7f\xfd\x3f\xe2\xfc\xec\x5c\xa8\x52\x68\xf5\x97\xce\xf7\x1d\xe7\x87\xce\xf2\x44\x5b\x6f\x12\x9b\x6d\xb1\xa3\xeb\x66\xfc\xa8\x8f\xd7\x3b\x3f\x6f\x8b\x6e\x59\xe6\x45\xa6\xf6\x5a\x5c\x28\xa5\xb1\x60\xdd\xdc\x84\x0b\x26\x02\x24\xd4\xda\x91\xdb\x2f\x2f\x00\xf5\x0b\x92\x6b\x56\x14\x81\x77\x01\x4b\x77\x53\x00\xfd\x5e\x26\x40\xa5\x88\xb8\x29\x3b\xd2\xc0\x9c\x95\xda\x82\x69\x88\x32\xe0\xba\xd3\x34\xd6\xae\x7e\xe0\x11\xf8\x8a\x57\x26\x2a\xb9\x6f\x2f\xc5\x4a\x29\xbe\x62\x34\x16\x4b\xed\x0a\x2c\xf3\xac\x81\x5d\x90\x6c\x62\xc1\x60\x18\xab\x3b\x8d\x7c\xe0\x4a\xa6\xb6\xc4\x41\xfa\xc7\xf8\xdf\x30\x0d\xaf\xdb\xe2\x2a\xd1\x0b\x95\xa6\x32\x53\xf9\x4e\x57\x2e\x06\x5b\xc4\xa4\xe9\xb4\xd8\x6c\x53\x65\x2e\x08\x6b\x61\x54\x8a\x97\x78\xdd\x6e\x8c\x3d\x83\x49\x81\x7c\xd5\x39\x2c\x14\xef\x81\x2f\x81\x77\x02\xa9\x9e\x2b\x00\xcc\x47\xb5\xd7\x81\xb8\x3c\x2c\x79\x78\x14\x7b\x09\xdd\x7f\xd3\xf6\x88\x87\x4d\xa3\x5a\x37\xf9\xae\x65\xa6\xc6\x1f\x86\x0e\xfd\x9a\x88\x1b\xf2\x8a\x29\xe9\x82\x63\x49\x26\x76\xdb\x2d\x9e\xc6\x69\xfe\x40\xbc\x0b\x54\x93\xcc\xf5\xdc\x8e\xb4\x8d\x15\x50\xeb\xe4\x6d\x7e\x3d\x02\xd7\x32\x07\x75\xae\x64\xc3\xf8\x3b\x23\x0a\xa7\x17\xe0\x49\xde\xf3\x61\x3f\x73\xf7\xa8\xec\xd8\x93\x39\xa7\xac\x2c\x64\x05\xcd\x4a\xd7\x61\x8a\x10\x71\xbe\x8e\x11\x7e\xb3\xc9\x33\xfe\x04\xb6\x68\x9f\xef\x0e\xd0\x2c\x2d\xed\x08\x47\xa2\x45\xdf\xe1\x20\xe8\x49\xd2\xa6\x32\x9e\x07\x00\xb4\x43\x8d\x12\xde\x2e\x5c\xaf\x64\x4c\x6b\xc9\xc5\x14\xf8\x4b\x82\x49\x6e\x64\x26\x11\xd0\x65\xf7\x05\xf6\xc6\xcd\xc8\xed\xde\x32\x70\x07\xb1\x40\xe8\xcf\x49\x92\xb4\x11\xe2\x00\x40\x88\x7c\x25\x56\xc9\xaa\x04\x0a\xfc\x85\x79\xe8\xc9\xbb\xb3\xff\x13\xea\xab\x40\x36\x8a\x86\xdb\x9c\xee\x04\x1b\x43\x20\xa0\xe6\x67\x25\x6d\x22\xd0\x06\x36\x9b\xe0\xb9\x5e\xdb\x48\x8e\xcb\x0b\xfa\x7b\xba\x9f\xbd\xb6\x78\x7d\x76\xf6\xda\xdc\xfd\x05\x14\xc1\xc5\x1d\x31\xc9\xb5\xca\x9a\x35\x3f\xc5\x75\x20\x37\xe0\xe7\x47\x1d\xe3\x6f\x28\x1a\xae\xb8\x6a\x29\x84\x0b\xfb\x19\xc3\x8a\x01\xec\x11\xd5\x5a\xee\x02\xfe\x1a\x6e\x38\x8c\x92\x36\xab\x09\xe2\x51\x6a\xf9\xf8\xcd\xa0\x3c\x23\xd5\x9a\xff\xb1\xfe\xd7\xa8\x77\x3a\xed\xfe\x46\x2a\x60\x8f\xe8\x7f\xbd\xfd\xe1\xfd\xfb\xaa\xfe\x97\xf9\xf8\x33\xfe\xeb\x77\xf8\x77\x4c\xb6\xe0\x74\x94\x67\xe6\xd7\xe6\x86\x90\xe9\x29\x94\x91\x77\xd3\xe4\xab\x7a\x16\x06\x7b\x16\x06\x7b\x16\x06\x7b\x16\x06\x7b\x16\x06\x7b\x16\x06\x7b\x16\x06\x7b\x16\x06\x7b\x16\x06\x7b\x16\x06\xfb\xed\x85\xc1\xea\x16\xc0\x2f\xb4\x55\xff\x13\x28\x86\xfd\xf2\xee\x3c\x4b\x89\x3d\x4b\x89\x3d\x4b\x89\x3d\x4b\x89\xfd\x5d\xa5\xc4\x38\xa0\x64\x8e\xb6\xad\x2c\x8d\x9f\x57\xe9\x90\xb4\xdd\x49\x13\x7d\xb8\xc0\xf4\xd5\xc2\x3e\xc0\xb3\xa9\xb6\xc6\xd5\xc3\xbb\xab\x76\x88\x1a\x63\xd6\x93\x3b\xa9\x24\x9d\x8e\x93\xb1\x3c\x2b\xa0\xfd\x7d\x15\xd0\xd4\xb3\x02\x5a\x5d\x01\x6d\xf5\x9f\x57\x01\xcd\xa9\x8e\x89\x98\x19\x21\xeb\xe7\x19\x33\x45\x2b\xcd\x67\x01\x4d\x64\x26\x37\xe8\x81\x3c\x16\x1c\xf2\x69\x7e\xbc\x57\x1d\xe0\x0b\x01\xe2\x58\x9f\x9d\x3a\xb0\xb5\x3c\xea\x52\x30\xb8\x42\xd9\xb0\x7f\x00\x29\xb7\xe4\x59\xca\x8d\x95\xbc\x1c\x39\xd6\x6f\x21\xe5\x06\x05\x23\xde\xca\xa0\xb7\x60\x70\x3a\xd9\xc8\x22\x49\xf7\x61\x58\x2b\x67\xce\x7d\x18\xa5\x07\x59\x2c\x91\x2d\x8a\xbe\x2f\x97\xf7\x32\x2b\xe5\x9d\xc2\xf4\x5e\xa6\x80\x68\xdf\xdc\x70\x2a\xd3\x14\x7a\x7d\xf2\xe1\xab\xbe\xa1\xbf\x77\x78\x4c\x57\xf5\x15\xf7\x54\x93\xf3\x76\x2f\x96\xc9\x5d\x52\x9a\xa7\x24\xa9\x3a\xd5\x6b\x09\x36\x9d\x77\x66\xe1\x60\x24\xba\x32\x46\x96\xf6\xad\x44\x49\x31\x08\x63\x6f\xe5\x9e\x13\xa6\x8d\xdd\x6e\x82\x25\xf8\x7d\x84\xe9\x48\x9f\x95\xf5\xfe\xa1\x95\xf5\x36\xcf\xca\x7a\x4f\x57\xd6\xcb\x9e\x95\xf5\xfe\xb7\x50\xd6\x8b\xe0\x14\xae\x1c\x91\x7e\x22\xe6\x6f\x95\xde\x7b\xec\xf9\xcf\xd2\x7c\xea\x59\x9a\xef\x59\x9a\xef\x59\x9a\xef\x90\xe1\xfd\x8f\x28\xcd\xd7\xf5\xd8\x58\x8f\xf4\xbb\x36\xa2\x4d\xdd\x6e\x56\xf0\x80\x3b\xe7\x57\xef\x3a\x5d\x2a\xb5\x57\xba\x21\xa9\x67\x87\x8f\x08\x94\x74\x02\x71\x9d\x67\xbd\xc2\xe6\x20\xc3\xb3\x5e\xe1\xb3\x5e\xe1\xb3\x5e\xe1\xb3\x5e\xe1\x3f\x90\x5e\xa1\x6f\xbb\x3c\xb0\x70\x50\x63\x92\x08\x00\x2f\x9e\x37\x7c\xd8\x9a\x7f\xd6\x40\x7c\xd6\x40\xfc\x67\xd2\x40\x7c\x16\x44\x7c\x16\x44\x6c\x36\xea\x9e\x05\x11\x1f\x5f\xdd\x6c\x9e\x79\x79\x2a\x73\x95\x91\x99\xcf\x8f\x38\x3c\xa3\x51\xa8\x0d\xf7\xb8\x8e\x62\xd3\xa5\x80\x00\xd5\xc0\x55\x39\xc7\xd0\xc2\xa3\xaa\x8b\xb7\xaa\x29\xab\xe7\x17\x08\xc1\x5b\xb5\xdc\xd4\xf3\x7a\xb4\xb6\x99\x83\x35\x2f\x40\xf3\xab\x40\xaf\xe5\x18\xf4\xa0\xba\xfe\x4d\x43\x7e\xc1\xbe\x3a\xee\xb3\x35\x6c\xad\xc4\x67\x73\xfa\x2d\xf6\xd1\xa1\xd0\xc2\x9b\x7f\x04\xcf\xb0\xb6\xb6\xe8\xca\x40\x6f\xb0\x66\xae\x54\x32\x98\xce\x75\x3e\xea\x28\x3f\xab\x6d\xfe\x0a\x2a\x8f\x8f\xc6\xaa\xff\xf7\x56\xe3\x0c\xc4\x35\x2a\xf1\x43\x77\xb6\xde\xb6\xff\x81\x54\x3b\x85\x78\xba\x02\xd6\xb3\x70\xe7\xb3\x70\xe7\xb3\x70\xe7\xb3\x70\xe7\xb3\x70\x67\xad\xa1\xcf\xc2\x9d\xcf\xc2\x9d\xe2\x59\xb8\xf3\x77\x13\xee\xfc\xc7\x56\xed\x7c\x54\x56\xf4\x9f\x45\xb5\x73\xf9\xac\xda\xf9\xac\xda\x59\x01\xef\x3c\xab\x76\x3e\xab\x76\x3e\xab\x76\x3e\xab\x76\x3e\xab\x76\x3e\xab\x76\x3e\xab\x76\xfe\xe7\x57\xed\xec\xbc\xba\x9a\x0d\x87\xbf\xa1\xf8\xe3\xa3\xfc\x5f\x67\xef\x5f\x9f\x9f\x57\xf5\x1f\xdf\x9d\x9d\x3d\xf3\x7f\xfd\x1e\xff\x6a\xd2\x86\xe6\xa0\xbb\x9a\x0d\x5f\x78\x04\x81\x0b\x20\x08\xfc\x01\x4e\xe1\x59\xb1\xd3\xa5\xc2\xfb\x68\x90\x2d\x13\x99\x49\x31\xcf\x12\x48\xc6\x99\x4b\xe8\xf5\xd9\xd9\x1f\x44\xbf\x50\x7a\xa9\x32\xef\x0f\xe6\xe3\x36\x47\xb4\xb7\x45\xfe\x8f\x3f\xed\xfc\xcc\xf8\xf3\xbb\x51\x7e\x2f\xc5\xfc\x52\x9c\xac\xe5\xaa\xdc\x65\x77\xfa\x56\xe9\xc5\xba\xf8\xff\xfe\xef\xec\x6b\xd9\x8e\xc4\xc3\xc3\x43\x47\x27\x9b\x5d\x96\xdf\xcb\xce\x22\xdf\x74\x5e\x34\x31\x17\xbe\xe8\x22\x51\xd3\x4f\xe2\x5a\x95\xaa\x10\x97\x79\x59\xea\xc5\x3a\x45\xba\xd3\xa5\xe8\x66\xcb\x42\x3d\x88\xe1\x6e\xa3\x97\x32\xc9\x14\x92\x26\x02\x65\x34\x6e\x51\xbb\x15\xaf\x64\x59\x24\xdf\xc4\x0c\xc2\x5e\xa5\x19\xbc\xdb\x42\x16\xfb\x17\x8f\x76\xfc\xf4\x54\xe8\x75\x5e\x94\x62\x36\xef\x9b\x1f\xcc\x6b\xeb\x1d\x77\x1f\x1b\xcc\xcd\x7f\xa3\xdb\x8a\x05\x51\x58\xf4\xe0\x89\x4a\x39\x7a\xa1\x84\x8b\xd3\x7d\x06\x77\x97\xb8\xb5\xc5\x73\x13\x55\x53\x7b\x41\xa6\x69\x66\xb7\x06\x42\xf5\x24\x23\x9a\x98\x0d\x45\x85\x05\x61\x6b\xaa\xd4\x8d\x88\xef\x73\x57\x95\x57\x02\x46\x05\x7d\xcd\xc9\x63\x28\xe5\x42\xc8\xcf\x39\x51\x4d\x06\x0d\x83\x55\x41\x2d\x5a\xe4\x4b\xc5\xa9\x75\x0b\x0a\xc2\x18\x57\x15\xea\x12\xd1\x3d\xad\x4b\x8f\x9b\x8b\xa1\xb9\x96\xbc\xcb\x7b\xae\x0d\xcd\xe1\x37\xfc\x26\xd2\x32\xf5\x22\x5c\x7e\x85\xaa\x83\x6f\x40\x66\xec\x75\x73\x27\x92\xcc\x1f\x4b\xee\x84\xaf\xba\x79\xb8\x1f\x7f\x63\xb3\xb8\xd7\xa1\xe8\x5e\x80\xa2\xe4\x3b\xca\x83\x84\xda\x1c\x95\xdf\x0f\xe8\xe1\x1b\xf4\x89\xc3\xc7\x59\xcd\x2d\xcb\x11\x5b\x1d\x81\x5a\xa2\xdd\xad\x07\xb9\xf8\x9a\xe5\x0f\xa9\x5a\xe2\x6d\x0b\x8b\xa1\x35\xf3\x57\xb2\x45\x67\x58\xca\xf5\xa5\xba\x57\x69\xbe\xc5\xeb\xad\x44\xea\x6d\x6f\xb7\x8d\xf2\xb2\x50\xa2\x2f\x37\xb4\x12\xae\x55\x71\x2f\x75\x90\xa4\xde\x8b\xa1\xbc\xd5\xe6\xeb\xf5\xbd\x87\x0e\xee\x63\x1b\x99\xae\x74\x5b\x97\xe0\xc3\x3b\xe8\xfa\xad\x1d\x27\xdc\xdc\xef\x6c\x10\xbe\x4a\x2e\x8d\xc7\xa8\xcb\x02\x6f\x7c\x8c\x01\xe3\x24\x03\x1c\x85\x62\x1c\xf8\x66\x4c\x97\xdf\x1b\x43\x63\x29\x26\x4a\x2b\x28\x82\xc3\x60\xab\x7d\xe3\x80\x3d\x1f\xf3\xda\xf3\xf3\xb3\x33\xf1\xc5\xac\x85\x07\xb9\x17\x1f\xd3\xfb\x65\x87\x9b\x62\xec\x46\x1d\xd9\x86\xbd\x7d\xff\xfa\xec\x75\x24\xb6\x6b\xe3\x01\xbc\x39\xff\xe1\xf4\xf5\x0f\x6f\x4f\xdf\xfd\x78\xf6\x2e\x12\x2b\xf9\xcd\xff\xcd\xeb\x4e\xcb\x4c\x67\x37\xa5\xe2\xf6\x7b\x95\xee\x69\x51\x57\xa6\x1d\xc3\x64\xdb\xad\x82\x5a\x78\x44\x7e\xf0\x6c\x27\xa5\x56\xe9\x0a\x67\x05\x92\x8a\xc6\xe9\x22\xe9\xb1\xa4\x58\x9e\xa2\x6f\xe3\x1e\x88\x56\x59\x66\x66\x23\x4d\xf9\xa9\x28\xef\x87\x71\x25\xa8\x2a\x6f\x5d\xcd\x86\xad\x30\x8c\xc1\x72\x5e\x84\xbf\xa6\x8a\xd1\x4d\x5e\x2a\x5e\x8b\x15\x0a\x16\xe8\x89\x6d\xa7\x8d\x43\x04\xd6\xac\x17\x95\x80\xef\x0c\xe6\xe6\xb9\xb3\x79\x1f\x67\xb5\xfe\xb1\x48\x6c\x53\xc5\x89\x72\x33\x97\x0d\xb7\x43\x7d\x6a\xff\x6b\xe3\xc4\xa2\x5c\x5c\x47\x5c\x3f\xa1\xf9\x3e\x2f\x82\x04\xfe\x65\x18\x22\xc4\x63\x9b\x3f\xe2\x88\x05\x93\x94\x14\x30\x98\xd1\xe3\x7d\x6f\xbc\xde\xbf\xa3\x1f\xe6\xb6\x84\xab\x72\x6e\x8b\x7e\x21\x69\x2a\xb5\xde\x15\xe8\x45\xda\xcb\xc6\xbf\x31\xec\x99\x66\xad\x6a\x4e\x3f\xa2\x45\x6d\x53\x8e\x8f\xe9\x2c\x72\xdd\xea\xca\xe7\x52\x40\x6a\x65\xe1\x35\x8e\x4f\x64\xd2\x7f\xe0\x20\x0a\xb9\x1e\xae\xa0\xc1\x18\x59\x44\xa8\x79\x0b\x38\xe7\x92\x43\x9a\xfe\xa3\x1d\x24\xc8\x4f\x9a\x32\xb6\xfe\x70\x23\x0b\x1f\x33\x4e\xe2\x48\x31\x2a\x43\x4d\x67\xdd\x51\x9f\x54\xb8\xa6\xe3\x8b\xd9\x97\xee\x24\x0e\x34\xc4\x58\x2a\xec\x62\x3c\x11\x5f\x3e\x0d\x7a\x9f\xc4\x68\xec\xeb\x77\xa1\xce\x56\xaf\x7b\x8d\x4a\x41\x03\x54\x30\xea\xf6\x7a\xf3\x49\xb7\x77\x23\xcc\xe3\xae\xba\xfd\xb8\x23\xfa\x93\x78\xda\x8f\x47\x62\x3e\x1a\x7c\x8e\x27\x53\x56\xe4\x8a\x7b\x9f\x46\xe3\xe1\xf8\x12\x95\x91\x06\xa3\xfe\xa0\x3b\xea\xfa\x1f\xba\x1c\x7c\x8e\xab\xef\x1c\xf5\xc5\x55\xf7\x4f\xf0\xeb\x49\x7c\x3d\x89\xa7\xf1\x88\x64\x7a\x6a\x1d\xb9\x98\xc4\x31\xaa\x00\x79\x1a\x64\x28\x14\x35\xe9\xa3\x4a\x91\xb8\xee\xce\xe2\xd1\x2c\x72\x0a\x6d\x4e\xf0\xca\x0c\xc4\xf5\x64\x10\xcf\xba\x93\x1b\x01\x7f\x9b\xfe\xf2\xae\x70\x9b\xab\xf2\x67\xb5\xf6\x82\x8c\x52\xeb\xe3\xfc\x72\xda\x8a\x44\xeb\xf3\x60\x32\x9f\xc6\xf0\x9f\xb3\xc9\xf8\x8f\xdd\x91\xf8\x34\x9e\xd8\x5f\x74\xaf\x45\x7f\x3c\x9e\xc0\x4f\x5f\xc6\x93\x2b\xf3\x1f\xb6\xf5\x9f\xba\x93\xab\x8b\xf9\x50\xf4\xc6\x66\x0a\xec\xd4\x77\xa7\xd3\xf9\x15\xbc\xfd\x90\x68\xda\x75\x3c\xb9\x18\x4f\xae\xba\xa3\x1e\x8c\x9e\x6d\x61\x77\xd4\x7f\x65\xe6\x77\x3a\x1d\xf7\x06\x20\x55\x77\xd5\x9d\xc5\x93\x41\x77\x38\x8d\x7c\xbd\x3d\xff\xfb\xe6\xd7\xa0\x8d\x47\x03\x85\x92\x55\x38\x5f\x97\xf1\x28\x9e\xc0\x73\xe6\x20\xe7\xc5\x2f\x7a\xa6\xe7\xfe\x3b\xfd\xeb\xbc\xea\x8d\x26\x83\xd3\xeb\x7d\xb9\xce\xb3\xd3\xcb\xeb\xe1\xa9\xc3\x4d\xfe\x5a\x51\x81\x47\xfc\xff\x1f\xde\xbf\xaf\xfa\xff\xef\xde\xbe\x3b\x7f\xf6\xff\x7f\x8f\x7f\x66\xf6\xc5\xf8\x3a\x1e\x89\xe9\x78\x3e\xe9\xc5\x02\x96\xc0\xf8\xea\xba\x3b\x1b\x80\x56\x1b\x69\xeb\x75\x2f\x27\x31\x1c\xa6\x2f\x06\x57\xd7\xe3\xc9\xac\x3b\x9a\xfd\x24\xae\x87\x71\x77\x1a\x8b\x49\xdc\xed\xc3\x29\x70\x31\x1e\x0e\xc7\x5f\x40\xa6\x8f\x3f\x2e\x7a\xdd\x49\x7c\x31\x1f\x0e\x6f\x3a\x2f\x3e\xde\x88\xde\x70\xd0\xfb\x93\xf9\xc0\x78\x24\x5a\xdd\x5e\x2f\xbe\x9e\xb5\xc4\x97\x4f\xb1\x39\x0c\x47\xfd\x41\x0f\x8e\x86\x8f\xf1\x70\xfc\x05\x4e\x35\xf3\x8d\xf1\xf5\x0d\x48\xf6\x0d\x46\xd3\x59\x77\x38\x84\x2f\x7b\xf2\x84\x74\x90\x5c\xdf\xcc\x3e\x8d\x47\xe2\xbc\xf3\xbe\x73\x6e\x4f\x95\x48\xdc\x8c\xe7\x70\x27\xf5\x4d\x6b\xe0\xb4\x02\x29\x3d\x68\x9e\x3d\xbc\x66\xf1\xe4\x0a\x6f\x99\xde\x78\xd4\x1f\xa0\xe4\x5c\x55\x5c\xd0\xf6\xa8\xf3\x82\x71\xce\x89\xae\xff\x55\x24\xda\x0a\xa0\x21\x34\xc1\xd1\xa0\x03\xbc\x92\x59\x9e\xac\xcd\x33\xc8\x92\x32\x01\xf3\x58\x47\xc6\xd3\xc7\x68\x04\x56\xfc\xa1\x6d\xfe\x87\x1f\xdf\x89\xeb\x42\xe9\x32\xcf\xc4\x97\x75\x52\x2a\xd1\x2f\x00\x77\x33\x81\xdf\x45\xe2\x73\x57\xbc\x3e\x3b\xff\xf1\x5c\x9c\xb4\xcc\x7c\xb6\xda\x8e\x46\x71\x10\xf0\x4a\x8c\x8b\x3b\x99\x25\x7f\x65\x56\x76\x8a\xf9\xa8\x56\x9b\xc8\x40\x38\x12\xe2\x22\xd0\xc8\x70\x8b\xc7\x03\x8d\xae\x33\xcd\x6d\xc0\x20\x2f\x02\x1f\x17\x02\xfd\xa5\x16\x52\xeb\x7c\x91\x40\x0c\x3e\xf0\x19\x3b\xe4\x2e\x7f\x0f\xa1\x04\xc7\xa7\xba\x1c\x7a\x8d\x04\xac\xdd\x90\x4b\x82\x7b\x04\x05\x2a\x99\xc7\x11\x11\x72\x4a\x38\x01\x7f\x9f\x30\x22\x00\xd4\xca\x74\xff\x57\xe3\x41\x2a\x5d\x5a\x66\x36\x76\x9d\x89\xf0\x85\x22\xb2\x29\x94\x28\xaa\x2d\xfa\xa6\x56\x88\x0f\xe8\xc1\x3d\xfe\x17\x82\xfc\xf9\x43\xab\xc2\x81\x95\x29\x64\x55\x0a\xc6\x88\x7b\x0f\x23\xb0\xbb\x43\x67\x44\x5e\x8d\xa3\xb1\x7c\xcd\x58\xbc\x6c\x18\x25\x4c\xb0\xe3\x1f\xa9\x64\x07\x82\x09\x14\x6b\x88\x44\xd2\x51\x9d\x48\xb4\x5c\xb8\xef\x7f\xfd\xbf\xe2\xfc\xc7\x1f\xdf\x9d\xbe\x3e\x3b\x3b\xff\xbe\xe5\xfb\x01\xe2\x1f\x04\xbb\x99\x50\xd4\xad\x05\x81\x1e\x8c\xda\x60\x84\xe2\x3b\xfb\xcc\x63\x0b\x39\x10\x9e\xdf\x8e\x75\x2b\xc1\xa9\x4c\x32\x91\x26\x6a\x07\xa9\x86\x03\x03\x11\xb9\xb5\x01\xe8\xfc\xdd\x2d\xbb\xbf\x61\x44\x02\xd2\x4c\x27\xf9\x26\x29\x6d\x4a\xf4\x2f\xbb\xbc\x54\xba\xfd\x93\x68\x05\x4d\x4f\x74\x55\x50\xfa\x29\x3c\x5b\x49\x76\xb0\x89\x74\xa6\xb8\xb9\x2b\xf3\x3b\x84\x32\x42\x68\x25\x78\x39\x85\xfa\xd3\x1c\x53\x5c\x54\x36\x80\xc4\xb0\xaa\xa4\x6d\x1b\xf6\x6c\x97\x25\x7f\xd9\x29\x58\xcc\x3a\xd1\xe0\xf9\x70\xfd\x9b\x2a\xc4\x09\xe2\x24\x21\xdd\xb9\x96\xd9\x32\x55\xed\x9f\xe0\xe8\xe9\xbc\x7e\xfd\xea\xfc\xec\xfc\x4d\xad\x75\x16\xdb\x72\xab\x44\x7e\x4b\xf3\xcb\x04\x42\x45\xfe\x6d\x0f\xaa\x0d\xaa\x78\x52\xe3\xe6\x93\xe1\x4f\x62\x5d\x96\xdb\x9f\x5e\xbd\x5a\x2f\xd3\x0e\x36\xa1\x93\xa9\xf2\x95\xdf\x88\x56\x87\xe2\x50\x03\x7c\x26\xe2\x26\xed\xcc\xd2\x52\x31\x7d\xa8\xec\x44\xcb\xa2\x6a\x7d\x2a\x58\x73\x0b\x5a\xdf\x4a\x87\xc3\x4b\x2e\x21\xc4\x7c\x4b\x14\x94\xa2\x10\x04\x72\x78\x33\xe5\xc6\xba\xb6\xe5\x43\x7e\x26\x2a\x0f\xf4\x2b\xae\x59\x42\x12\xf0\x64\xb6\xe5\x74\x8c\x51\xf1\x71\x99\xdb\x78\x19\xed\x0b\x88\x78\xe0\xf3\xc5\x6d\x91\xa8\x95\xd0\xbb\x0d\x68\xdd\x31\x08\x9c\xd8\x9f\x61\x49\x96\x79\xd0\x1d\x0e\x7f\xc0\x81\x09\xcb\xf6\x6b\xed\x54\x0f\x9a\x6d\x9b\x45\x7a\x15\xe4\x14\xb2\x5e\x85\x79\x8c\x71\x6e\xa6\x75\x8f\x0c\xdc\x41\xe7\xf0\x44\x0d\x9a\xd2\x1d\x73\xad\x7f\xe9\x82\x6f\x10\xff\xdc\xbd\xba\x1e\xc6\x91\xf8\x38\x9f\x81\xde\xaa\x2f\xc8\x1b\xbe\xc7\xdc\xcf\xac\x91\x3c\x05\x6d\xdd\x8a\x2f\xe8\x5e\x0c\x8f\x76\x7a\xd2\xa4\x8e\x0b\x92\xd2\x23\xd3\x16\x56\x29\xae\x0b\x4b\x07\x8a\xe0\x24\x24\x1c\x98\x16\x5f\x06\x24\x9a\xcb\x0e\x26\x3c\xc8\xf7\x2e\xc9\x6b\xa4\xd8\x0b\xf4\xc1\x49\xed\x06\xba\xc9\xd6\x3f\xa3\xe6\xa0\x0f\x37\x9f\xc6\x93\x69\xed\xbd\xdc\x64\x5f\x3d\xd9\x4a\x2a\x1f\x96\x51\x26\x25\xe3\x8a\x6a\xf2\xd5\xb8\x3f\xb8\x40\xab\xca\x8a\x9c\xc3\x4f\x8f\x18\x56\x56\xd5\xb8\x1f\x4f\x06\x9f\xbb\x33\xe3\xaa\x9b\x8f\xc7\xe3\x0b\xa7\x5e\xdc\xed\x7f\x1e\x4c\x9b\x05\x8a\xe9\xb3\x28\xfe\x5e\x51\x7d\x73\xe7\x0a\xe0\x01\x42\xf4\x8c\xc3\xaa\x01\x92\x50\xba\x1c\xfb\x6d\xa1\xe4\x62\x2d\x8e\x49\xab\x82\x9a\xf6\xc1\xb7\x59\xbc\xcc\x1d\x88\x60\xba\x54\xfb\x4a\x2d\x55\x01\xa1\xdd\xa6\x58\x4b\x2a\x1f\x44\xa8\xfc\x38\x05\xf4\x65\x50\xfa\x5d\xcb\x5b\x07\x0f\xae\xa8\xdd\xca\x6c\x59\x45\xe2\xc2\xa6\x07\x91\x45\xfe\x8e\x79\x6d\x95\x47\x89\xb9\xf4\x5d\x8b\x30\x1f\xfc\xa0\x64\x5a\xc2\xd0\x7c\x4e\x8a\xbb\x24\x4b\x64\xe4\xc9\x5c\xf2\xef\x5e\x3a\xb5\x4b\x44\xe1\x87\x6a\x97\x15\x70\x08\x9d\xda\x85\xba\xcb\x6d\x6a\xde\x63\x99\xad\x9a\x3f\xee\xb4\x0d\xce\x1a\x2e\xbb\xe4\xc3\x17\x39\xbe\x00\x07\x87\x05\x71\x3e\xee\xeb\x01\x0e\x4f\xac\xb7\x4d\xf7\x9e\x3d\xe5\x17\x87\x5d\x8e\xe6\x58\xec\xd3\xc0\x87\x7e\x79\x3d\x6c\x47\x4f\x1d\x22\x5a\x0f\xb8\x18\x0e\x58\x9e\x28\x4d\x20\xf1\x98\xd6\x7a\xe7\x21\xd9\xad\x2e\x2a\x0d\x0c\x91\xe6\xe7\xe2\x9a\x13\xfc\x5a\xbc\x05\x28\xa5\x59\xa4\x3f\x1c\xb6\x6e\xeb\xc8\xa5\x23\x4b\x97\xc0\x68\x4e\x0f\xda\x2a\xfb\x90\x7c\x11\x04\x2e\xef\x54\xb6\x30\xa6\xaa\x2c\x4a\x52\x89\x03\x2c\xc3\x9f\xf3\x24\x2b\x85\xb9\x47\x77\x85\xb2\xbe\x0b\x9c\x5b\x58\x57\xc3\x16\xd7\x81\x0d\x64\x97\x23\xca\x36\xd4\x35\x2d\xe0\x51\x16\x16\x02\xf1\x49\xf8\x09\x23\xf1\x80\x46\x77\xa0\x11\x6d\xd9\xdb\x8e\x84\xe1\x41\x81\x93\x05\xa1\x56\xb6\x89\x56\xd4\x08\x32\x03\x88\x7a\x42\xcd\xee\x8e\xf8\xb8\x17\x8b\x34\x59\x7c\x45\xbd\x0e\x04\x18\xb1\xff\x79\xbb\x2b\x4b\xd6\x9e\xb5\x25\xdb\xc8\xbf\x42\x2a\x32\xb0\xd6\x01\xb1\x44\xbc\xc0\xc5\x51\x17\xc9\xb3\x35\xdd\x85\xfe\x5d\xda\x00\x0d\xeb\x01\x5b\xfb\x6b\xc7\xc9\x3a\xaf\xc6\x57\xbf\x31\xfc\xe3\xb1\xf8\xcf\x9b\xd7\xaf\x7f\xa8\xe2\x3f\xde\xbc\x7f\xf3\x1c\xff\xf9\x3d\xfe\xc1\xa6\xbe\x90\xba\xec\x5d\x0e\x02\x59\xe3\x14\x21\x0d\x3e\x24\x20\x47\xef\x06\x32\x2b\x27\xb0\x83\x18\x3d\xd2\x6a\x5b\x9f\x3f\x4c\x0e\xe3\xc7\xfa\xfe\xef\x5a\x48\x08\x6e\x6f\x3f\xbc\x71\xc7\x5b\x95\x89\x2b\x59\x7c\x55\x65\x24\x06\xd9\x42\x9c\xb4\xbc\x5f\x81\x86\x45\xc5\x4d\x83\xdd\xc3\xa8\x4a\x73\x10\xae\x92\x54\x05\x31\x07\x9b\xc8\xb6\x20\x17\x48\xed\x06\x0d\x74\x88\x52\x60\x1b\xc2\x0b\x06\xb3\xea\xe0\xac\x7a\xc5\xa1\xf0\xfc\xce\x0b\xaf\x59\x04\x7a\xd0\xa0\x99\x82\xa7\x5d\x04\x1d\x8b\x10\x20\xb1\xaf\xbb\xff\x01\x5a\x23\x68\x97\x69\x68\xd8\x36\x2e\xcf\xb2\xf5\x73\x21\xb2\x42\x7d\x4b\x74\x89\xa0\x8a\x10\x39\xa0\x6b\x2e\x37\xc8\xc3\xe4\x5b\xae\x1e\xa2\x5c\x59\x62\x43\x02\xae\x02\x70\x69\xdc\xee\x5b\x59\x26\x1b\xeb\x91\xfb\xb9\x7c\xc0\xf8\xd6\x24\xff\x23\xee\x16\x9c\x99\x14\x6a\x11\x2b\x05\x0f\xb6\x6c\x07\xdc\x1d\xba\x81\x3d\xa0\xde\x0e\x70\xa8\x57\x55\xb8\x5e\x7d\x8c\xc2\xf1\xb1\x70\xb7\x60\x25\x61\x62\x92\x71\x1f\x80\x2b\x56\x6a\x49\x90\x3a\xa0\x5f\x2a\x2d\xf9\xb8\x5b\x49\x56\x27\x87\xca\x84\x06\xab\x3a\x7c\xf0\xb1\xf6\x00\x4c\x27\x53\x0f\xd5\x87\xa3\xf1\x61\xfe\x80\xef\x62\x06\x04\x56\xd6\xb2\x57\x0e\xdf\x4c\xab\xa4\xd0\xa5\xd8\x4a\x64\x77\x06\x03\x17\x50\x48\xb6\xa8\x76\xcf\x75\xef\x10\xb9\xbd\xea\x4e\xfe\x14\xcf\x9c\xa7\x54\x77\xb9\x9c\x63\xf4\x65\x30\xfb\x64\x3c\x81\xeb\xb8\x37\xe3\xf8\xa7\xcd\xf6\x80\xf3\x13\x8b\xfe\xb8\x37\xbf\x62\xb7\x2a\x32\x2e\xc7\x70\xde\x37\xbe\x80\xf9\xf2\x78\xee\x3b\x69\xe0\x0d\x7c\x8f\xd7\xd5\xe0\x73\x75\xc4\x60\x04\xcd\xfe\x1c\x8f\x66\xe4\x2b\xf9\xfd\x0a\x7c\xa6\x9b\xf1\x9c\x9d\x10\xdf\xe9\x62\xf7\x88\x1d\x9f\xee\x64\x00\xde\x0b\x64\xd6\xc6\x13\x31\x89\x87\x5d\xe3\xe2\x60\x97\x07\xd3\x27\xf7\x39\x6a\xe8\x74\x44\x9e\x58\x7f\x30\x89\x7b\x33\xeb\x87\x1d\x75\xc3\xa6\x83\xab\x81\xe9\x33\xfd\xca\x1f\xd5\xe1\x78\x3a\x13\xd7\x93\xf1\xc5\x60\xc6\x1e\xdb\x4c\xf4\xbb\xb3\xae\xf3\xa9\xfc\xe1\xf8\xd4\x9d\x8a\x8f\x71\x3c\x3a\xe6\x68\x8d\x2f\xc4\x74\xde\xfb\xc4\x6f\xeb\x84\xd3\x0c\x9e\xb4\xdf\x5f\x08\x91\x57\x53\xc0\x9d\xda\x5b\x47\x63\x98\x08\x7c\xc5\x60\x64\x3a\x3b\x9b\x74\xcd\x08\xcc\xc6\x93\x59\x24\x46\xf1\xe5\x70\x70\x19\x43\x0e\xd1\x77\x24\x79\x32\xcc\x28\x72\x58\xfd\xe8\xf8\x3f\x67\x03\x7f\xb7\x7f\x9d\x57\xdd\x65\x7e\xab\x4e\x5f\x9f\x9d\xbd\xff\xad\xcc\xc0\xc7\xec\xbf\x37\xef\xde\x54\xf5\x7f\xdf\xbc\x79\xb6\xff\x7e\x97\x7f\x30\xfb\x62\xba\xd7\xa5\xda\x68\x63\x78\xb1\x4f\xbe\x3c\x29\xda\x62\x8a\xc6\x5f\xcf\x58\x7c\x35\x97\xc4\x41\x84\x09\x21\xfc\x5e\x1c\x7e\x5a\xb3\x96\xf8\x8b\x6b\x04\x3b\x81\xac\x26\x5d\xaf\x47\xde\x28\x16\xb2\x50\x5c\xfe\x05\xd2\x97\x2e\x94\xec\xc1\x7e\x3a\x2f\x0e\xb7\xc3\xaa\x30\xe6\x28\x74\x67\x4c\xb8\xad\x2a\x77\x40\x9c\xe0\x28\xc8\x2b\x0c\xe3\x59\x7e\xba\x58\xcb\xe2\xae\x96\x48\xf2\xa9\xc7\xbd\x78\x8e\xad\x19\x0e\x92\x4a\x87\x92\x44\x50\x43\xc4\xb9\xa4\xaa\x9a\x00\x8a\x20\xae\xf2\x62\x13\x35\x8a\xaa\xfb\x70\x27\x28\xcd\xdb\x2d\xd6\xf5\x37\x04\xa9\x3a\xdf\x8e\x87\xb4\x96\xad\x04\xcb\xf6\x01\x51\x28\x99\x6e\xa4\x45\xe3\xc0\x73\x87\x87\xb7\x85\xc6\xcd\x2f\x87\xd4\x85\xf8\xad\xc7\x80\x65\x40\x79\xe8\xe4\xf7\x92\x6c\xa9\x36\x19\xd8\xdd\xeb\x3c\x5d\x8a\xb5\x2c\x36\x60\xde\xc3\xc0\xa9\x95\xca\x96\x47\x96\xa8\x2b\xc0\x94\x77\xd2\x38\xfb\x88\xe2\xca\xb5\x8e\x88\x08\x20\x62\xd0\x56\x8e\x52\x41\xbb\x24\xe4\xa9\x96\x65\x99\x17\x99\xda\xbf\xd4\xc6\xf8\xe5\xca\xaf\x22\xc1\xae\xa3\xbe\x01\xbe\x65\x6f\x89\x83\x8a\xc0\xc0\x66\xe3\x38\x58\xcd\x74\x61\x42\x7a\xbe\x37\xee\x37\x03\xb6\xcc\xa5\xde\x02\xeb\xce\xd8\x4f\x17\xdd\xf9\x70\x36\x6d\x39\xeb\x05\x0c\xa6\xb8\xf7\x69\x34\xe8\x75\x87\x62\x3a\xbf\xbe\x1e\x4f\x66\x6c\x49\x91\xc1\x68\x6c\x89\x9a\xc9\x38\x08\x8c\x95\x4a\xa0\x1e\x72\xe8\x11\x5c\xe0\xf5\xaf\x35\x99\x83\xa6\x95\x8f\xd9\x83\x98\xb0\xa7\x48\x7f\xdc\xef\x88\xee\x70\x8a\x2f\x41\xc8\x94\x43\x54\x81\xa1\x33\x1a\x8f\x4e\x7d\xb4\x57\x24\x66\x83\xd9\x10\x0c\x8b\x7f\x99\x0f\xe2\x99\x88\x47\x7f\x1c\xdf\x40\xe6\xbe\xc1\xd0\xbc\xea\xf6\x26\xe3\xab\xb8\x3f\xe8\x42\xdf\x67\x53\x18\x9b\xe1\x20\x9e\x4c\x3d\xc3\xd3\x9a\x97\x64\xf1\x39\xdb\xaf\x31\x1e\x1f\xff\x1c\x5f\x5d\x0f\xbb\x93\x9b\x23\xa1\xf9\x93\x47\xc6\xf4\x7a\x32\xee\xcd\x27\x16\xbf\x36\x9d\x7f\x9c\xce\x06\xb3\xf9\x2c\x16\x97\xe3\x71\x1f\x6d\xca\x78\xf2\x79\xd0\x8b\xa7\x1f\x30\xc8\x3f\xbe\x10\xf3\x69\x1c\x91\xe9\x38\x9e\xb0\x4d\xf9\x01\x90\x14\xf3\xe9\x00\x46\x7d\x30\x9a\xc5\x93\xc9\xfc\xda\xd8\x59\x6d\xf1\x69\xfc\x25\xfe\x1c\x4f\x44\xaf\x3b\x37\xd3\x6f\xa6\x87\x8c\xfa\xd9\xa7\x78\x3c\x81\x01\xb6\x36\x5f\x24\xbe\x7c\x8a\x21\x47\x11\x18\x7f\xd3\xd9\x64\xd0\x9b\xf9\x1f\x33\x36\x9d\x59\x5e\xae\x8f\x87\x6c\xc3\xb6\x35\x0e\x07\xec\x4b\xdc\x38\x3b\xd1\xa6\x60\xaa\x3b\xe0\x49\xd9\x86\xd0\x08\x7e\xb6\x29\x1b\xff\x75\x5e\x5d\x5e\xf4\x87\xa7\xe7\x9d\x37\xa7\x20\x17\xf1\x5b\x98\x80\xc7\xed\xbf\x77\x6f\xdf\xfd\x50\xb3\xff\x7e\x78\xfb\x5c\xff\xf5\xbb\xfc\xbb\x1c\xcd\xc5\x85\xb9\x3e\xc3\x50\x06\x99\x5e\x2f\x3e\x13\x06\xe3\xbc\xf3\x26\x12\x6f\xc4\x28\xbf\x67\x29\xbb\xb3\x3f\xf8\x25\x62\x3d\x30\x00\xcf\x22\xf3\xbf\xe7\xf0\xbf\xaf\xe1\x7f\x7f\x80\xff\xfd\x03\xbe\xc2\x86\x4e\x2e\xf2\x5d\xb6\xa4\xda\xa1\x41\xb6\xe8\x88\xff\x46\x99\xff\x95\x5e\x41\xad\xea\x7f\x7f\x01\x4c\xfe\x79\x86\x95\x57\xb6\xb4\x88\xd4\x14\xab\x86\x90\x0d\x59\x51\x8c\x8b\xa3\xe8\xa9\x25\x2f\xc0\xbe\x21\xa9\x36\x64\xca\x51\x74\xbd\xc2\xdb\x03\xc9\x82\xb3\x8e\xb8\x9e\xc4\xdd\xab\x8f\xc3\xd8\xfc\x38\x83\xca\x4b\x5b\xec\x1b\x44\xe7\x13\x87\x04\x00\x46\x1d\xb0\x22\x4b\xf5\xad\xbc\xcd\xf3\xaf\x1e\x17\xd2\x6a\x97\x2d\x08\x37\x43\xc5\x56\xab\x5d\x6a\x5b\x25\x5a\xc6\x96\x6c\xd9\xca\x07\xac\x04\x5e\x09\xf3\xdb\x65\xbe\xf9\x89\x68\xc8\x77\x05\xc0\x1d\x70\x54\x20\x49\x68\xd9\x17\xe9\x93\xc1\xf0\x78\x45\x38\x4a\x24\xe5\x81\x12\x2e\x12\x9f\x8f\x84\x4a\x90\x02\xdb\x52\xff\x21\x0d\x77\x96\x67\xfe\xaf\x80\x10\x24\xcf\x96\xa0\x7d\x16\x85\x83\xb1\xb5\x0c\xd9\x96\xec\x10\x62\x70\xd0\x1a\xae\x4e\x2e\x84\x14\x0f\x12\x45\xb8\x15\x14\xa7\x2e\x13\x5b\x5c\x9d\x14\x24\x9a\xf7\xb0\x4e\x52\x45\x46\x24\x55\x8d\x71\x65\x38\x4a\x19\x01\x5f\x03\x7c\x2d\x0c\xd2\x01\xf8\xe1\x96\x59\x99\x3b\x38\x7f\xe1\x84\x49\xa4\x51\xcb\x57\xa2\x65\xc6\x2a\x55\xab\xb2\xc5\x2a\x77\x2c\xc7\x24\xcb\x26\x1b\x3d\x28\xa5\x42\x3b\xb7\x5c\xab\x8d\x56\xe9\x3d\xaa\x6e\x9b\x69\xb0\xb3\x68\x0c\x65\x8d\x62\x4c\x03\xa2\xff\xa3\x8a\xe1\xe3\xf9\x4a\x6e\x4b\xa2\x89\xc6\xd9\xb4\xd0\xad\x64\xa0\x7d\xa6\x60\x2a\xbc\x8f\xd1\x78\xd0\xd9\x2f\x0a\x83\x90\xf6\x63\xe1\x72\xcd\x44\x5e\x40\xc6\x14\x13\x73\x34\xf2\xb8\x70\x75\xfd\x91\x4e\x06\x3e\xf8\x35\xc4\x53\x35\xfe\x2e\x88\xf6\xff\x24\x24\xfe\x76\x5b\xe4\x77\x85\xdc\x08\xbd\x06\xce\x8e\x45\xbe\x21\x4e\x57\x7e\x95\xa3\xe8\xb5\x63\x45\x6b\x38\x28\xe4\xe0\x82\xaf\x5c\xe9\x8e\xf8\xb8\x2b\x6b\xbb\x0f\x79\xee\xad\x2c\xa1\x57\xcd\x02\xef\xf9\x60\xba\xb8\x90\x99\xf5\x45\x38\x04\x6d\xf6\xe8\xce\xaa\x01\x63\xfe\x1a\xf9\x01\x57\x16\xc4\xb5\x91\x65\x49\xb9\x5c\x22\x94\xc3\xf3\xc2\x2b\xb4\xd7\x80\x74\x4a\x80\x9d\xc2\x6c\xf9\x8e\x99\x80\x02\x4a\xad\x55\xb6\xac\x6e\x8f\x24\x5b\x24\x5b\xd8\x58\xa6\x19\xb8\xaa\x1e\x80\x0b\x81\xcf\x17\x08\xc3\xeb\xb2\xd8\x59\x7a\x07\x60\xd6\x56\xd9\x42\x31\xea\xb4\x6b\x8c\xd3\x9e\x6f\x4e\xf7\xe3\x8b\xc1\x08\x41\xab\xb5\xf5\xee\x29\x76\x82\x14\x1e\x0c\x8b\x3b\x97\xb0\xfb\x14\xe7\x67\xca\x59\x22\x5b\xc9\x4a\xe3\x03\x39\xa2\x6f\x60\x80\xb4\xc9\x4b\xe7\xeb\x1a\x47\x4b\x15\x42\x4b\x3a\x4a\x78\xbc\x9b\xf3\xf4\xc4\xcc\x13\x9e\xa3\x1d\x31\x05\x01\x09\x7e\x15\xb9\xe8\xd2\x83\x69\x86\x7e\xb7\x73\xb0\x77\x19\x4f\x7f\x92\x89\xe5\xae\xa0\x4b\xc5\x12\x6a\xc9\x12\x41\x53\x8d\x0a\x2c\x01\x17\x0f\x26\x98\x6c\xaa\xaa\x15\xa1\xd8\x7b\xe4\x91\x9b\x5b\x1c\x96\x1b\x47\xf3\x70\x2c\x8a\x44\x9d\xbd\x4a\xad\x7e\xe2\x09\x1d\x33\x91\xb7\x16\x72\xb9\x2c\x94\xd6\xb8\x82\x5a\xfb\x7c\xd7\xea\xf8\x8a\xf2\xa5\xa7\x8d\x9a\xac\x20\x4c\xe1\xe7\x94\x02\x97\x11\x6f\x02\xe8\x22\x24\xd2\xcd\xd9\x7a\x44\x82\x3b\x80\x9c\xc0\x92\xea\x8a\xd6\x15\x73\xa1\xd3\x65\xdf\xe2\x4e\xf4\xed\x59\x87\x92\xcd\x19\x8a\x9a\xf2\xe2\xe0\xed\x6b\x3f\x86\xbc\x8f\x8e\x9b\x34\xb8\x57\xb6\x89\x97\x5b\x8a\x2c\x44\xa2\xa2\xaa\x84\xf8\x5a\x27\x49\x2e\x92\x0c\x06\x9e\x38\x05\x65\x76\xb7\x63\xb5\xec\xae\x68\xf1\x65\x64\x69\xb4\x5b\x38\xe2\x99\xdc\x98\xc1\xdd\x6e\x55\xb6\x4c\xbe\x61\xbb\x56\x45\x9e\x95\xa7\xb4\xa9\xb5\x93\xfe\x0b\x7a\x40\x47\xbf\x39\xa2\x6c\xf4\xc7\x67\x6d\xad\x62\x2a\xec\x54\x6b\x80\xf9\xe5\x2e\xef\x54\x7b\x72\x1e\xfc\xfc\x52\x0b\xa0\xa2\x4c\x9d\x26\xe7\x09\x2a\x88\xb0\x70\x34\xb6\x54\xb7\x2d\xf7\x33\x6c\xc7\x8c\x40\x21\x1e\x23\xd2\xca\x3c\xc4\x4a\x67\x10\x51\x1b\xfc\xbd\xf2\x86\x8e\x38\x99\xad\x77\x3a\x62\xb6\x44\xdb\x36\x38\x76\x10\xeb\x28\xad\xf9\x02\x62\x9d\xd2\x5c\x70\xb2\x4c\x16\x3a\x12\x52\xd4\x86\xdb\x56\x0d\xaa\x6f\xdb\x54\xf2\x39\xe2\xbe\xd4\x69\xc3\xa6\x0a\x46\x0d\x1b\x7d\x8b\x16\x13\x9e\xb0\x2b\xb1\x4e\x74\x99\x17\x50\x49\xdb\xa4\x03\xca\x43\xe4\x70\x35\xc1\x18\xa1\xa5\xb5\x42\xca\x9c\xc8\xb3\x61\x22\xb1\x5d\x27\x69\xae\xf3\xed\xda\x3c\x3b\x12\xaa\x84\xff\x80\x40\x54\x9e\x26\x00\x2f\x13\xdb\x5c\x27\x14\xee\xf2\xf8\xbb\x36\x1d\xb6\xfe\x5a\x83\xec\x5e\x16\x89\xcc\x4a\x4b\x87\x86\xa0\xe6\x85\x2a\xa0\x16\xbd\x36\x2e\x7c\xae\x03\x53\x2a\x66\x63\x9d\x5e\x03\xa8\x48\xa2\x5d\x83\x4c\x38\x50\x1c\x59\x7d\x83\x55\xb3\xf6\x75\x16\xb4\x55\xf5\xac\xce\x5f\xa1\x20\x90\x1a\xc8\x08\xd8\xd3\x75\xb0\x12\xd2\x2e\x79\xc7\x2f\x92\x94\x5e\xf5\xf9\x52\xad\x92\xcc\x12\x36\xb9\x1e\x01\x4a\xb5\x66\x28\x13\x9e\xc5\x53\xbd\x90\xda\x75\x02\x8f\x52\x77\x7a\xc8\x3d\x2f\x60\xf1\x57\x55\xe4\x0d\xbd\xb5\xf4\x56\xf6\x4b\xae\x60\x13\x21\xca\x58\x1d\x59\xff\xa6\x60\x2a\xe8\x42\x11\x65\x6b\xa6\xdc\xcc\xf5\xcc\x16\x10\x33\xf5\xad\xac\x4c\x19\xb2\x2b\x6c\xa5\xd6\x40\x44\x6a\x76\xab\xfa\x56\x72\xc0\x8e\x45\xe9\x61\xaa\x2e\xe0\xe0\xf0\x9e\x64\x56\xcf\x47\xb9\xf8\xea\xff\xee\xd7\x9c\xae\x6e\xed\x95\x9c\xe9\x96\x25\x52\x72\xbe\x33\xe7\xf0\x92\x78\xe1\x65\xb5\x31\xd5\x4f\xbf\xa6\x8f\xf3\xa9\x39\x33\xa7\xeb\x56\x16\xe6\x96\x43\x7f\xe1\xc0\x79\x2f\x36\x72\xb1\x4e\x32\x75\x5a\x28\xb9\xb4\x21\xee\xc8\x91\x15\x33\x99\x28\xd6\xbe\xd3\xa2\x27\x9d\xc5\x85\xe5\x95\xac\x09\xd6\xde\x91\xe1\x8b\x97\x64\x64\xa1\xd9\x7a\x97\x94\x92\x0d\xfb\x42\xdd\x3b\xe5\x53\x6b\x75\xeb\xb2\x90\xe6\xfe\x5a\xe5\xc5\x83\xb1\xd9\xe8\x6c\x86\x27\x26\x0b\x9c\x44\xe3\x52\xe4\x78\x1a\x9f\xac\x80\x73\x0e\xe6\xd8\x98\xe0\x39\x71\xc1\x6e\x93\x6f\x2a\xd5\x6d\xfb\xbd\xad\x4c\xb2\x92\xcd\x56\xf7\xcd\x65\x21\x1f\x92\xec\x4e\xb7\x85\x46\x13\x76\x09\x44\xa8\xb6\x3f\xf4\x77\x7a\x63\xe4\xb0\x15\xd5\xce\x24\xd9\x76\x87\x77\x80\x69\x20\x0e\x57\x49\x37\xc6\x0a\x6f\x0d\x44\xbb\xda\xab\x8f\x65\xc7\x84\x59\xf0\x0a\xe9\x07\x58\x1c\xf2\x49\x8f\x36\xeb\x08\x26\x17\x7c\x22\x14\x32\x71\x98\x35\x6f\x0d\x20\xb4\x20\x98\xc2\x8d\x2c\xbe\xee\x10\x1d\xe8\xf1\x2b\xf3\x6f\x1d\xb9\x2e\xd2\x24\x11\xc1\xd6\x83\x44\x7d\x34\xe0\x04\xdd\x15\xf2\x0e\xce\x6d\x22\x0c\x0e\xee\x79\x63\x44\x9a\x25\x65\x06\x80\xce\x15\xaf\x3d\xc6\x9c\xc2\x39\xe3\x46\xd5\x3f\x63\xae\xb0\xc0\xa0\xf7\xd9\xd1\xe5\x26\xdf\x11\x73\xa2\xfa\x56\xda\x71\xe0\x89\x31\x8f\x0a\xf7\x40\xa2\x6d\xcd\xfb\x78\x2b\xff\xb2\x53\x58\x65\x10\xa3\x04\x09\x39\x05\x6e\xc8\x61\x0e\xcc\x8b\xfd\x06\x51\xe4\x81\x51\xfb\x78\x1d\x76\xa7\xbd\xc1\xc0\x39\xdc\x34\x7e\x33\xf5\x2d\xc9\x56\x39\xcd\x1c\x3e\x30\x12\x43\x39\x53\x3f\x57\x7e\x37\xbd\xbc\x1a\x9a\x21\xfd\xf9\x6a\x48\x99\x2e\xe9\xb2\x42\x6e\x19\xf6\x67\x7d\xa2\x65\x2c\xa5\x39\xb5\x97\xa7\x8b\x1c\xf8\x28\x80\xf2\x33\x31\x9d\x10\x9f\x66\x57\xc3\x48\x5c\xe7\xba\x9c\x2e\x8a\x64\x0b\x33\x75\xdd\xbf\x08\x1d\xca\xf5\x6e\x23\xb3\x60\xaa\x3a\xc1\x28\x94\xfe\x0c\x78\x33\xe4\xfa\x7d\x3d\xba\x8c\xc4\xcf\xbd\x0b\x68\xce\x1f\xaf\x2f\x3b\x02\x47\xb4\xf6\xc1\x6d\x91\x6f\xcd\xc2\xe6\x9a\x31\xc9\xda\x0a\xe4\x3e\x40\x46\xd0\x3c\xc4\xec\x2d\x40\xc6\xa4\x7b\x12\x77\xb1\xdf\x33\xa7\x1a\x33\xe4\x01\xf3\xb7\x3f\x5e\xe0\x63\x59\x75\xfd\xfe\xac\xcf\xc6\x25\x7d\x01\x8e\x96\x3c\x4f\x1d\xd3\x37\x1d\x4b\xfe\xd0\xba\x3a\x3a\x3e\x0a\xf1\x43\xa6\x45\x87\x46\x94\xd2\x7d\xe0\x2a\xe1\xb1\x11\x36\x13\x75\xd9\x77\xa5\x99\xe8\xba\x54\x2f\x5c\x5b\x33\x63\x37\x88\x6b\x79\xa7\x5a\xac\x00\x42\xa4\xea\x9e\xb3\x89\xa8\x22\x30\x31\x10\x2a\xc4\x4c\x19\xdb\x74\xa7\xd1\x4f\x71\x70\xb9\x2d\xf2\x6d\x53\x67\x41\xcd\xda\xec\x5a\xe3\xbc\x45\xc6\x6e\x4a\x6e\x53\x52\x14\xf4\xc0\xd7\x9e\x23\x69\xe5\xd2\x91\x00\xd0\x23\xea\x70\x0d\x20\x4a\x0b\xce\x37\x3a\x29\x5b\x33\x09\x24\xf2\x0b\xd1\x09\xa4\xa7\xb5\xed\x96\xd8\xda\xa8\xa1\xdf\xe4\x33\x7e\x2b\x45\x66\x5e\x09\xed\x33\x57\xda\xb6\xc8\x37\x49\x06\xe5\x6d\xd0\x18\xa6\x54\x63\x67\xe8\xa5\x66\x96\xfa\x6d\xa1\x16\xca\x46\x1a\x6e\xd5\x5d\x92\x81\xe3\x42\x1f\xbe\xcd\x97\x7b\xc7\xb1\xfa\xad\x74\x73\x60\xcd\xfa\x96\xe7\xfe\xa0\xd6\xa0\xa7\xd0\x8d\x0e\x83\xf5\xc6\x74\x10\x81\xac\x9b\xff\xb8\x79\xe9\x22\x66\x8b\xac\x15\x67\xd0\xd8\xa5\xf8\xf9\xe6\x5f\xed\xdb\xc8\x89\xd1\xbb\xdb\x5d\x96\x94\xb5\x07\x7a\x06\x26\xfb\x58\x40\x9a\xa3\x16\x09\xb0\x75\xff\x7c\xf3\xaf\x44\xc3\x89\x8e\x83\xf9\x19\x8d\x7c\x95\x95\x6b\xa5\x21\x4c\x17\xd4\xbc\xa1\xa1\xc2\x9e\x97\xfd\x46\xcd\xf7\x12\x27\x9f\x8c\xb1\x65\xfe\x0c\xe7\x0d\x13\xfe\xf3\xbd\x6f\xfb\x05\xb9\x62\xd3\xd8\x24\x87\xb2\x0a\x74\xa7\x59\x2b\xb2\xd5\x0d\x39\x60\x74\x2b\x12\x2d\x47\xbc\x08\x3f\xc6\x4e\xd1\xd3\xfc\x9c\x17\xa2\xf5\x09\x3c\x85\x7d\xcb\xb8\x16\xb9\x68\x5d\x53\xd0\x11\xd9\xc4\xcc\x68\xb4\x2c\xb1\xbb\xb3\x79\x41\x83\x6f\xcf\xb2\x5f\xfb\x26\x63\x07\x6f\x87\x92\x88\x4e\xb5\xf7\xe5\xca\xf4\xc8\xc5\x22\x27\x27\x81\x10\x81\xce\x74\xb6\xab\x27\xb0\x7d\xf9\xc8\x23\xc1\x8a\xbd\xa7\x63\xa1\x45\x06\x43\x9f\xfb\xb6\x23\x6e\x18\x24\xf3\xf6\xa0\x9a\x0d\x31\x1d\xbf\x1f\x60\x74\xeb\x03\x6f\x41\xc0\xad\xa3\xd7\xcc\x91\xe5\x94\x10\x9f\x70\x1d\x53\x9c\xa9\x5a\x6e\x80\x21\x73\x2e\x78\x40\x0f\xc9\x69\x1e\x40\x95\x8b\x65\xa6\xff\xc9\xa7\x51\xd9\x38\x28\x31\x9b\xc0\x87\x5a\x67\x99\xb9\x13\x2d\xee\xf3\x04\xcf\x7d\x63\x65\x64\x39\x05\xb9\x9d\x2c\x92\x74\xbb\xd7\xb3\x99\xa9\x9e\xf8\x73\x3c\xf9\xd8\x9d\x0d\xae\xb8\x68\xdc\xfc\x9a\x05\x90\x9a\xf2\x06\xa1\x59\x1e\x86\xc1\x9e\x16\x10\xaf\x62\x72\xc3\xa1\x0b\x23\x65\x04\xce\x75\x77\x0a\x07\x79\x68\xde\x29\x84\xf6\x94\xc9\x26\x80\xaf\xbd\x6a\x02\x88\xaf\x67\x87\x02\xc4\x65\x09\xcc\xba\x24\x71\xe9\xa2\x5f\x0f\x6b\x59\xea\x1c\xe8\x94\xe0\xe9\x0d\x09\x8e\x50\x3e\x0a\x22\x6a\x4e\x89\xdb\x69\x3c\x89\xfc\x16\x83\x96\x7c\xe2\x14\x79\x4a\xe1\x12\xb9\xa4\x72\x89\xd5\xae\xe0\x40\xd0\xde\x3b\x7f\xe9\xb8\x84\xbd\x29\xbf\x86\x70\x08\x9f\xac\x7f\x4f\xed\xa0\x10\x99\xb1\xe5\x55\xa6\x99\x80\x4c\xa8\x6f\x58\xfe\x88\xc4\x3a\xf0\x4c\x70\x29\xcd\xd7\xbc\xf9\x96\x22\x95\xc5\x9d\x12\x2a\x03\x6d\xd1\x6c\xc7\x21\x3b\xbf\x19\x3b\x5d\x62\x59\xab\x87\x16\x0e\xeb\x77\xf9\x64\x78\xd3\xf1\x17\x18\x7c\x27\x55\x10\xad\xc1\x69\x70\x41\x47\x88\x70\xd7\x23\x8f\xe0\x7a\xe3\x74\x71\x07\xab\x30\x20\xee\x0d\x95\xbd\xd2\xc2\x16\x83\x91\xf8\x97\x79\x77\x34\x1b\xcc\x6e\xcc\x5f\xa8\xab\x74\x67\x59\x33\x81\xba\x75\x62\x07\x05\xb4\x37\x41\x6c\x9e\x02\x48\x9b\x0d\x6c\x6d\xd8\x7d\xee\x5b\xf7\x10\x78\xaa\x5c\x39\x11\x8d\x17\x6a\xa1\x03\x0e\x59\x66\xe2\xfc\xec\x2c\xaa\xc1\xd7\x5f\xea\xea\xda\xb6\xf6\x43\xe0\x33\xdb\xf1\x56\x19\xa8\x4c\xf8\x4b\x02\x08\x5e\xef\x51\x56\x07\xcc\xc2\xa2\xd8\x47\x16\x32\x0d\x50\x7a\x36\x5b\x24\xaa\xa6\x80\x18\xaa\x7d\xfa\x4f\x4d\x8e\x3b\xc1\xab\xcd\x1f\xf0\xe9\xd8\xf6\xaa\x37\xcf\x1f\xbc\x95\x8b\xaf\xf8\xb9\x8e\xf8\x98\x97\x6b\x6e\x91\x5b\x23\x0d\xed\x71\x11\x0b\xd8\x7d\x3a\x0c\x12\xd2\xa8\x6a\x65\x97\xe9\x2c\x6c\x11\x3e\x9c\x1c\x6c\x6c\xee\xce\xf4\x0f\x6e\x7a\x4b\xb1\x07\x0e\xbd\x35\x5c\xd0\x0a\xf8\xcb\x0e\x0e\x29\xcf\x36\xca\x96\xc2\x38\xd1\xc0\x1f\x6e\x97\xe9\x72\x59\xa1\xfe\xe3\xde\x52\xe7\x12\xa7\x23\xd8\x01\x65\x0d\x2e\x65\xb4\x25\xc6\x5e\xc6\xc5\x7d\x0f\x62\x25\x69\x6e\x7c\x14\x8d\x10\xf5\xad\x7f\x37\x63\x1b\xab\x56\x0c\x38\x2d\x4e\xc8\x31\x60\x86\x8f\xd8\x15\x28\xa1\xa6\x0d\x42\x4c\x7e\xa2\x77\x4f\xc5\x71\xd8\x19\x2a\xb5\xc3\x8d\x32\x60\xd2\x72\xaa\x3c\x28\x61\x52\xcd\xd9\x60\x4f\xf5\x7b\x85\x32\xd3\x65\x9e\x83\x88\xf0\x26\xc9\xf2\x1d\x1c\x66\xab\xa4\x74\x4b\xcb\x4c\x21\x65\xb1\xc0\xcd\xb6\xe0\xfc\x3c\x53\x9a\x59\x17\x4f\xa4\xb9\xc3\x32\xb8\x21\x57\x89\x2f\xd9\xd8\xe6\xb1\x95\x58\x3e\xea\xad\x39\x73\x4e\x26\xd9\x4e\x51\x4b\xe1\x91\xc6\xb8\x5e\xfe\x59\x2e\x80\x95\x1e\x84\x67\x1a\x36\x77\x18\xfe\x27\xf7\xea\x80\xd9\x79\x70\xc7\xba\x9d\x47\xb6\x23\x6b\xb9\xd5\x63\x3e\x15\x2f\x77\x0f\x94\x0d\xb4\x22\xa0\x34\xc1\x35\x01\xf5\x7f\xe0\x70\xc3\x64\x63\xf3\xa7\x20\xb1\xb9\xd9\xee\x4a\x55\x9c\x66\xaa\x84\x9c\x02\x10\x19\x58\x9a\x3c\xe7\xb8\x71\xac\x88\x3e\x77\x8a\x6e\x30\xa5\x57\x8c\x8d\x80\xc4\x25\x50\x7c\x9a\x3f\x64\x69\x2e\x97\xc2\xff\xcc\x29\xfb\xc4\xfc\x04\xb3\x3f\xca\x7c\x01\x8e\x1f\xa5\x65\xcb\x86\x4e\xd6\x0e\x3f\xc8\x3b\xe5\x2b\xb3\x37\x02\x6a\x67\x9a\x1d\xd6\x6f\x49\x29\xa6\xbd\xc5\x44\x94\x1d\xe7\xd2\xdc\x6e\x81\x96\xe7\x6e\x89\x01\x2d\xb5\x45\xcd\x2a\xb4\x50\xc1\x43\xa9\x41\x02\xc3\x59\x4e\x32\xf1\x97\x9d\x04\x07\x24\x42\x78\x25\x80\x03\x9c\x01\x52\xeb\x0d\x94\x54\xa3\x69\x2b\xca\xf5\x8e\x47\x0d\xb2\xe8\x9c\x6d\xc5\x2b\xc9\xce\xc3\x2e\x2b\x13\x10\x13\x49\x95\xc4\xf5\x2e\xf6\xc6\x07\x93\xab\x92\x2e\xb5\xd4\xfc\xbe\x4c\x36\xaa\x76\xcd\x66\xc1\x6c\x9f\x34\xe9\x7a\x03\x00\x52\xde\xa1\x6c\x5d\x81\xc5\x4a\xa9\xbb\x76\x24\x86\xf1\x3c\x2d\x53\xcf\x75\x1a\x94\x5c\x57\xa4\x30\x4a\xcb\x6a\x7e\xbc\xe1\x23\x67\xfd\xf8\x94\x98\x87\x72\x33\x0f\x0a\xca\x68\x01\x50\xec\x73\x97\x02\x19\xce\x9e\x6c\x86\xaa\xb1\x00\x23\x7f\x97\xe0\xf1\xb6\x31\x6b\x69\x0d\x5e\x68\x99\x5b\x8a\x42\xf3\x7e\x62\x26\x17\xbb\xed\x12\xc6\xd7\xaa\x96\x86\x6d\x60\x86\x06\xa8\xcc\x1f\xf4\xba\x36\x9d\x7b\xcc\x7c\x95\xa2\x9a\xba\xab\x75\xad\x31\xef\x69\x1c\x24\x0e\x9f\xbf\x86\x87\xbe\x61\x53\x24\xb4\x66\x4d\x07\x28\x54\x0d\xcf\xa8\xbd\x0e\x1f\xef\xbc\xce\xd0\xfc\xb5\xf9\x9b\xda\xf7\x56\x09\xd6\xd1\xc2\xd9\x97\xd7\x2f\x86\x08\x57\xa9\xab\xa3\xaa\x11\x16\x07\xf1\x44\x66\x65\xae\xbe\xa6\xcc\x8d\x9f\x0c\x26\xee\x16\x54\xbe\xb4\x62\x54\x05\xe6\x27\x51\x00\x9e\x6e\x3b\x6f\xb7\x2e\x73\xba\x8e\x20\xdb\x66\xd9\x83\xab\x2f\x60\xa9\xa5\x6e\x47\xcc\x1d\xdb\xae\x8b\x62\x88\x13\x28\x9b\xcc\x82\x6b\x12\x45\x46\xda\x42\xd2\x9d\xb8\x84\x2a\xbe\x45\xc9\x08\x68\x59\x73\xf6\xf1\xc2\xa0\x3f\x93\x99\x6e\x15\xa8\x69\x41\x69\x71\x42\x7e\x23\xdc\x56\x9c\xe4\x2b\x94\x78\x80\xd4\x48\xb6\x8f\x50\x4c\xce\xf1\x04\x2b\x41\xce\xf4\xa1\x74\x68\xdb\x59\x0d\x7c\xbc\x81\x21\x8b\xed\x26\xf4\x43\xd8\x0c\xce\x2d\x5a\x9e\xe5\x8a\xe1\x23\x4b\xfb\x49\xb3\x77\x74\x80\xe5\xb6\x6a\xdd\x43\xe0\x3c\xae\x8e\x26\x58\x18\xb4\x87\x23\x41\xb4\x41\x70\xaf\x61\x58\x46\xdb\xb8\x8c\x39\x24\xab\x40\x21\xfa\xa2\x97\xb8\x0d\x53\xcf\x07\xa6\x38\xaa\x90\xf0\xd8\x03\x71\x65\xb6\x3e\xa7\x80\x19\xdb\x71\xf0\x88\x39\x01\x1d\xcf\x15\xeb\x1d\x84\x9f\x8e\x48\xd4\xde\x5c\x67\x2b\xf5\x80\xb2\x6c\x19\xbc\xa1\x1d\x71\x85\x2a\x98\x54\xbc\x19\xcd\x42\x75\x24\xae\x1e\x4c\x9f\x07\xb1\xd7\x41\x3e\x8a\x70\x14\x21\xdc\x56\x32\x8c\xbf\x9a\xbf\x3e\xb4\x8d\xa2\x9a\x11\xcb\x6f\xe9\x77\x84\x0d\xc0\x90\x11\xde\x50\x8c\xda\x74\xd4\x09\x21\xe2\x8e\xe8\x2e\x97\xa0\x24\xb7\xc5\xa8\xae\x69\x6f\xf5\xeb\x30\x77\x70\x59\x54\x90\x02\x6c\x27\xd1\xf5\x90\x5b\xef\x32\x78\x39\xbf\xec\xc2\xec\x74\x30\x71\x22\x91\x6c\xc0\x05\x02\xe9\x4f\x77\x9b\x35\xf9\xe9\x55\x2f\xe6\x2e\xb9\xe7\x53\x8b\x2c\x90\x3a\xdb\xc1\x91\x73\xf2\x20\x00\xc6\x66\x0f\xa1\x1a\x43\xaf\xf3\x87\x8c\x7f\xd3\x5d\x2e\x55\xb6\xdc\x6d\x30\x7c\xc6\xdd\xb9\xf4\x06\x9e\xb3\xfd\x95\xb6\x5a\xcf\xc1\x6c\x79\xdd\x9c\x64\x26\xa0\x20\x59\xc9\xbe\x03\x64\x36\xa7\x6d\xc3\x41\xb7\xae\x23\x3e\xd9\x71\x85\x4b\x2e\x93\x69\x09\x11\x26\x67\x43\x55\xa2\x34\xe6\xfa\xf6\x1a\x8f\x80\x47\x3c\x7d\x6c\x9c\xcd\x06\xf9\x22\xaf\x97\xa5\xc6\x45\x4c\x49\xcf\xe5\x12\xf5\x6c\x40\x9f\xbf\x54\x1b\xb0\x5f\xb0\x06\x83\x36\xa8\xf5\x3a\x22\x30\x5c\x22\x28\xc0\xb5\x3b\x2e\x04\x25\x1e\xba\x40\x24\x8f\x44\xed\x30\xe2\x8c\x75\x41\x38\xb4\x23\xbd\xa8\x0e\x63\xc4\x2c\x1d\xe6\x08\xe3\x66\xd7\x5a\x7b\xbc\xa5\xce\x83\xf2\x5a\x68\xc7\x88\x8e\x4b\x48\x8d\x4b\xdc\x63\x30\x46\x54\xe4\xcc\xef\x6b\xea\x2e\x99\x81\xd4\x64\x7b\xbc\x43\xb6\x97\x61\x68\x42\x88\x3f\x56\xe6\xb0\x6a\xc6\xf3\x35\x17\x35\xaf\x24\xd2\x4f\x86\x2d\xe4\x0c\x78\xf9\x04\x33\x1c\x6b\xe8\xbf\x2a\xc8\x62\x36\xbd\xf9\xc0\xda\xc5\x37\xd6\x2e\xcd\x04\xf9\x65\x98\xa6\x86\x83\xa8\x94\x41\x27\xcc\x1b\x3d\xca\x4d\x28\xcd\xb5\xbb\x1e\xf3\x8d\x59\x89\xb5\xb6\x50\x64\xdc\xf1\x8f\x01\x97\x8d\x2f\xd4\x43\x77\x89\x39\xdf\xcc\xb4\x6b\x36\x43\xc3\xc8\x24\x25\x76\xf2\xe2\xb1\xeb\xd5\x91\xe6\x81\x1b\xca\xc0\xb5\x43\x57\xed\x9f\x88\x5b\x3e\xdb\x37\x2c\xdf\x5a\x7c\x1e\xe2\xef\x61\x84\xbe\x1e\x7e\xb7\x05\x4c\xf8\x3c\x5a\xbe\xc1\x59\xe5\x76\x3c\xdf\x19\x94\xbd\x25\x9a\x89\x92\xb4\xa5\x98\xd8\x89\xac\x57\xb4\xff\x4c\x73\x2b\x0d\xb3\xac\x8c\xae\x69\xb4\x06\x4a\x82\xf6\x51\x77\x87\x0d\xd7\x55\xc3\xa1\x58\x5b\x73\xee\x58\xb3\xbc\xe7\x90\x31\xb1\x7a\x56\xf0\x1b\xc0\xfa\x58\xc5\x44\xf2\x17\x34\x6b\x16\x9b\x43\xf6\x5e\xa6\x1c\xbb\x35\xde\x8a\x17\x90\xf7\xb5\x45\x78\x70\xe8\x81\xd4\xf6\xab\x8e\xe8\x2b\x70\x55\x9b\x67\x2b\x48\x95\x58\x40\xa5\xae\xe0\xb4\xfc\xa8\xff\x01\x83\x87\x5f\x38\xea\x88\x7e\x4e\x5e\x15\x19\x7c\xd9\xde\x71\x4e\xd8\x56\x42\x2a\xe1\x40\x3b\x04\x42\xda\x2c\xbf\x54\x92\x05\x71\xac\x26\x40\x0f\xbf\x7e\xec\xcf\x55\xb6\x6f\x4c\x1c\xf8\xb1\x9e\xda\x59\x66\x75\x23\xcc\xb1\xdf\x04\xfe\x43\xb8\x1e\x62\x04\x2d\x81\xfc\x5f\x76\x32\x05\xb0\x91\x6e\x42\x75\x79\x50\x3c\x73\xe4\xdb\x00\x1a\xa1\x1b\x6d\x09\xa3\x5b\x3a\x36\x6e\x5d\xa2\x11\x83\x71\x01\x07\x9c\xc2\x0c\xb1\x69\x08\xda\x87\xe8\x75\xd8\x16\x4a\x63\x97\x3a\x54\x55\x8e\x8e\x49\x62\x6e\x85\xe5\x32\x58\x78\x6c\x07\xb1\x5c\x48\xc3\xba\x3e\x30\xe1\x0d\xb7\x3a\x1e\x82\xf4\x60\x66\xab\x08\xfd\x14\x97\xe9\x69\x58\xaf\x7e\xac\x51\x3e\xb6\x58\x43\xc5\xd9\x1a\xd2\xd1\xf8\xf6\xca\xfb\xbc\xe9\x1c\x0c\x65\x6d\xc6\x6f\xf7\x00\x96\x31\xe7\x3b\x88\x8f\x2b\x7d\x7a\x0a\x31\x3f\x44\x30\xa0\xfc\xb9\x7b\xc8\x56\x29\x44\x19\xa9\x07\xdc\xa4\x14\x08\x81\xad\xed\x30\x2e\xc6\x36\xbd\x57\x24\x39\x2a\x72\x9f\x40\x97\xcc\x62\x96\xe0\xc3\x6a\x81\x10\x48\x27\x2d\x26\xa3\x61\x60\x08\x7e\x66\x3e\xb7\xdb\x62\xe8\x11\xcb\x0d\x96\x98\xaa\xaf\x45\xb0\x19\xf0\x55\xfb\x22\x43\xbc\xf0\x6b\x95\x70\xb6\x63\x95\xcb\xac\x10\x36\x2f\x13\xdf\xe6\x3b\x74\x20\x88\x71\x46\x82\x7f\xde\x7b\x6b\x10\x35\xf4\x74\xe1\x6f\x87\xf0\x68\x4b\x4a\x36\x9e\x78\x71\x20\x5f\x6a\x8d\xcb\x37\xda\xb8\xba\x32\x65\x25\x16\xaa\xe8\x40\x99\x16\x4a\x2e\xf7\x6e\x93\x4b\x0a\xe9\x32\x08\xca\xcf\xba\x40\xc8\xd5\x63\x90\xb3\xed\x30\x9b\x13\x39\xbe\xbc\x56\xd8\x1a\x12\xfb\x04\x4a\xf5\x43\x34\xbf\x80\x50\x2e\x91\x88\xdd\xaa\xb5\x4c\x57\x50\xbd\xbd\xf7\xf2\x64\x68\x71\xc1\xe6\xf8\x00\xcb\x97\xff\x58\x28\x30\x28\xf0\x06\x4f\x61\xb8\x8c\x1f\x6b\xc9\x87\x6a\x6a\x21\x81\x09\xe6\xae\x7a\x44\x29\x2e\x97\x24\x94\x48\x8f\xb2\xc9\x67\x5c\x8f\x27\x04\x1d\xb6\x5f\x3b\xa9\xa7\x74\x18\x95\x71\x1b\x46\x6e\x30\xac\xd5\xe8\xda\x90\xe4\x87\xf6\x0c\x38\x33\x36\x2b\xd4\xb2\xc4\x42\x25\x85\x38\xb0\x04\xe4\x3b\xbd\xad\xcb\xea\x19\x8d\x37\xce\xbb\x8e\xe8\x8d\xaf\x3e\x0e\x46\x83\xd1\xa5\x25\x03\xa9\x44\xc0\x36\xb7\x49\x56\x31\x8d\xb0\xa8\x09\xce\x21\xc6\x08\x1e\x45\x57\x46\x35\x57\x0c\xf6\x2b\x5e\x87\x7c\x50\xbd\x25\x4c\xac\xab\x2f\x72\x81\x3b\xdd\x14\x23\xf3\xb8\x5a\xd1\x58\x31\x2d\x95\xd6\xc4\xa1\x51\x6f\x36\x35\xbc\x0f\x58\xab\xce\x76\xc5\x34\x97\x5b\xc0\xb6\x2f\x95\x1d\xc1\x17\x7d\xd4\x6d\xf0\x54\x38\x21\x69\xc4\x96\xb6\x3e\x20\x29\xab\x67\x7d\x25\x57\xbc\xad\x98\x47\x49\x71\xf8\xe2\x9d\xd9\x9e\xf2\x1b\x80\x67\x09\xf2\x89\x7c\x49\x9a\x3d\xdc\xe4\x0a\xe2\x6b\x37\xbb\xb4\x4c\xb6\xa9\xa2\x8c\xd9\x42\xa6\x4d\xbd\xa1\xd3\x83\x36\x0f\xcb\x4c\x09\x9d\x64\x77\x84\x48\xf5\x7c\x31\x28\xfe\xe1\xc7\x36\x3c\xcc\x41\xca\xcd\xce\x86\x30\x88\xd9\xa1\x4e\x3a\xda\xb4\x1c\x47\xde\x12\xfc\xda\xd4\x15\x18\xa4\x00\x2d\xe1\x95\x82\x94\xca\x70\x82\x2c\x89\x01\xc0\x3f\x69\x93\x32\xaa\x80\x6e\xa2\x5a\xf8\xc5\x4e\x3a\x55\xcb\xf1\xbe\x0a\x62\x66\xfc\xbe\x64\x25\x80\xa6\x19\x7c\x01\x95\x6a\x25\x24\xb7\x01\xed\xcd\x8e\xb8\xe2\x66\x43\x0f\xe5\xf2\xcf\x3b\x5d\xfa\x10\xa4\xf0\xba\xe6\x25\xfb\xb8\xd9\x50\x09\x2f\x58\xbb\xdc\x5b\x00\x68\x8f\xd5\xf6\x80\x17\x57\xe5\x3d\xec\xd9\xb0\xfa\x88\xc7\xcc\xd7\x79\xd3\xc6\x60\x7c\x23\x38\xd1\x07\x7d\xef\x0f\xce\x59\x7c\xe4\xdd\x0d\x70\x24\xb8\x6c\x9b\x3f\xed\xbb\x41\xe4\x06\x42\xdc\x98\x4c\xf4\x34\x6d\xfa\x52\x68\xa3\x13\x09\x6e\x6f\x3c\x1c\xc6\x3d\xab\x39\xd0\x78\xf4\x51\x85\xe9\x22\x07\x1e\x5a\xd2\x18\xd3\x64\x89\x37\xe5\x54\xbf\xeb\x44\xc4\x20\x90\xbb\x9a\x3c\xca\xbb\x4a\x3d\xed\x30\x94\x95\xe3\xe9\x71\xef\xa9\xef\x4d\x0b\xbb\xad\xfa\x1d\xae\x33\x4d\x27\xaa\x87\xbd\x28\x76\x69\x43\x13\xcc\xd9\x5c\xcb\x06\x57\x9c\x46\xd7\x2e\xc2\xc7\x34\xa4\x8a\x79\x88\xd5\xb7\xb2\x90\x8b\xd2\x35\xde\x42\xce\xe1\x26\x26\x40\x99\xdf\xe8\x4a\x32\x26\x29\xbd\x81\x4b\xf7\x8d\x23\x6d\xfb\x89\x97\x06\xdc\x94\xb2\xf1\x80\xc4\xba\xa7\x12\xa9\x80\x0b\x14\x73\x5d\x86\xe9\x00\x1e\xa1\x70\x5e\xea\xdd\xf4\xca\x5a\x9a\x06\x0c\x11\x8c\x7e\x6c\xf6\x87\x8e\xe8\x5e\x5e\x4e\xe2\x4b\xe4\x06\x03\x4e\x91\xc1\xa8\x1f\x5f\xc7\xa3\x7e\x3c\x9a\x89\x2f\xe3\xc9\x9f\xa6\x08\x61\x5c\xe4\x9b\x6d\x92\xca\xc6\x5a\x2a\x63\x02\x30\xbf\x0b\xea\x03\xf8\xb7\xb5\x55\xbd\xaf\x0a\xde\xbb\x49\x63\x30\x69\x44\xb9\x64\x20\x7e\x86\x5c\xbd\x62\xd3\x3a\x07\x98\x79\x95\x43\x85\x21\x5c\x0e\xd7\x2d\x33\xd1\x92\x77\x77\x66\x24\x4a\xd5\xe2\x28\x8a\x0b\xf9\x22\x35\x4b\xa0\xbf\xed\x77\x8d\x50\xe3\x4c\x67\x03\xf8\x07\x3c\x14\x41\xa4\xdb\x89\x83\x55\xbe\xf8\x52\x9b\xef\x40\x54\x67\x9f\x83\x7e\x1d\xdd\x0f\xde\x16\x43\xbc\x2c\x96\xb8\x77\xc4\x17\xaa\x66\xa9\x14\x67\xb9\xad\x23\x33\x61\x3b\x52\x29\xc0\x0e\x79\xa1\xc3\xc0\xb8\x45\xe5\x82\xc3\xc2\x0f\xa0\x3c\x3b\x07\x24\xbc\x6a\xe6\x43\xe5\xcf\x41\x10\x7f\xc0\x54\xca\xd6\xd2\xf7\x32\x11\x5e\x96\x51\xbc\x81\x32\x10\x24\x17\x75\x75\x20\xfa\x10\x6c\x81\x22\x97\x0d\x65\x6a\x94\x09\x91\x68\x59\x90\xf5\x4d\x37\x6e\x99\x14\x2a\x1c\x9b\x20\x72\xed\x7b\x3a\x61\x78\x2f\x0f\x91\x46\xb7\x85\x5c\x7c\x55\x65\xdd\xce\xac\x8e\x5e\x64\x63\x3b\xe6\x4c\x28\xf2\x2c\x59\xf8\x61\x1e\xc8\x14\x23\xa2\xa6\xb1\xde\xce\xfb\x96\xb9\xcb\x3a\x62\x6c\xab\x33\x20\xd7\x83\x20\x23\xc4\x5a\x83\x0a\x86\x8f\xce\xaa\x37\xf5\x61\x9d\xa7\x5e\xe3\x98\xf7\x78\x36\xe9\x8e\xa6\x43\xd8\xc9\x60\xb4\x79\xe5\x25\x89\xf6\x43\x50\xae\x2e\x3e\xd4\x76\xd5\xb9\xf5\x5f\x7c\xe4\xa4\x7b\x4e\x3d\xd9\xd5\x90\xed\xb0\xa6\x75\x47\x4c\xe0\xaa\x31\x7b\xed\xa0\x7d\xe6\x3f\xdc\x22\xc7\x00\x5f\x2c\xd3\x26\x27\x29\x29\x6a\x05\xc9\x3a\x0a\x5c\x2f\xab\x3e\x5a\x69\xb7\x1f\x7e\x69\xb6\x7d\x38\x3b\x6c\xf7\x13\xdb\x22\x36\x86\x6c\xc3\x36\x4d\x75\x6d\x37\x95\x06\xc8\xa0\xc2\xa7\xd1\x2c\xe6\xd0\x64\x68\x71\xe9\x7a\x1a\x81\xed\x93\x26\x13\xbd\xe9\x52\x05\xc4\x9a\xaf\xc3\x6a\xfb\x12\x67\x77\x80\x2d\x0a\xd0\x09\x3e\x0c\x95\x00\x7e\x07\x3a\x9f\x7b\xad\xa4\x6b\xd1\xba\x0a\xc6\x20\x5c\x48\x4d\x47\xf6\x32\xd1\x96\x35\x36\xd0\x49\xf2\x47\xe5\xd0\xdb\x6a\xcd\x82\xe8\x3a\x1b\xa4\x85\xf7\xda\xa8\xf9\xfb\x00\x83\x31\x0e\xb5\x4c\x52\x3e\xc1\x5c\x7c\xaa\x9a\x31\x48\x1e\x31\x0f\x2b\xb1\x70\x1f\x9d\x8e\xef\xf7\x4f\xc3\x13\xbb\x03\xda\x40\x07\x5f\xcb\x6b\xb9\x4f\x9c\xb7\xb1\xa1\xe5\x7e\x4b\xf2\x07\xf4\x20\xc7\x5c\x52\x3a\x48\x19\x34\x10\x3a\xf3\x63\x07\x94\xac\x06\x23\xbb\xdb\x7d\xf4\x6e\x48\x4b\xac\xc1\x75\xb7\x94\xbd\x87\x30\xd1\xea\x1b\xc0\x6d\x25\x10\x24\x17\x4a\x6b\xc4\x17\xe2\xba\x6a\xac\x5d\x44\x06\x39\xb5\xd9\x96\x5e\xb5\x19\xf1\x92\x3c\xe5\xf5\x58\x6a\x7a\x9f\x27\xe4\xef\x1e\x15\x83\x00\x2f\x97\x6e\xdf\x86\xd6\x98\x21\xb0\x08\x62\xae\xa4\x87\xfc\xb9\xd9\x62\xf7\x49\x7e\x68\x17\x96\x84\xc6\x2a\xec\x1e\x64\x59\x1b\x59\x94\xc9\x62\x97\xca\xfa\x81\x83\x90\x24\xe0\x88\x47\x4c\x60\xdb\xe9\x28\x20\x52\x9c\x12\xf9\xc0\x00\x03\xe0\xaa\xb2\x89\x48\xc1\x63\xa2\x06\x33\x2f\xc9\xc2\x4e\xeb\xa0\x61\x38\x48\x27\xb7\x6d\x38\x16\x65\xa6\xb2\x12\xf4\x90\xaa\x06\x0e\x3d\x7c\x25\x93\x14\x42\xc5\x66\xd3\x10\x42\x95\x13\x47\x76\x38\xb8\x6e\xc9\xa2\xd5\x14\xd5\x48\x20\x0b\x5f\x99\x8b\xf7\x67\x62\x29\xf7\xda\xcf\x9e\x2b\xad\x9d\xb4\xd7\x55\x5e\xa8\x9c\x71\xdb\x7f\xc3\x20\x7a\x7d\x3a\xd8\x25\xe8\x09\x83\xb7\x9f\xdc\x17\x32\x9d\x12\x8c\xe0\x22\xa4\xd3\x42\xd9\x00\x0d\x5d\xa8\x85\x02\x62\x42\xe7\xf0\x1e\x5c\x31\x58\x2d\xca\xfc\x08\x6d\x0f\xc9\x53\x6d\xae\x03\x7b\x2f\x76\x94\xe6\x73\x4f\xb5\xe3\xfb\x26\x18\x5f\x5c\xe5\xa6\x39\x5b\x9b\x24\xa2\x48\x3d\x5c\xe9\xb4\x32\xa8\x5d\x07\xf6\x44\xad\xfc\xdb\xed\x22\xef\xae\xc1\xc0\x38\x06\xcf\x8d\x45\x51\x19\x0a\x36\xd7\xec\x0b\x98\xcb\xf0\x50\xd9\xb9\xdf\x18\x78\x14\xc4\xd4\xed\xab\xb1\xd2\xc3\xb4\xc6\x9f\x69\xb7\x00\x22\xbf\xdb\xce\x51\xaa\xe7\x4c\x30\xd8\x61\xf3\x31\x4e\x92\xc2\x18\xb0\x70\xf5\x65\x7b\x4f\x32\x1f\xc9\x6f\x90\x52\xe5\xac\x23\x2e\xe6\xb3\xf9\x24\x16\x93\xf8\xf3\x60\xda\xa4\xfd\xc7\xd1\xae\x43\x24\x56\x0e\xb8\xaf\xd7\x22\x53\xc0\x19\x72\x9f\x68\x2f\x68\xc8\xcd\x3c\xce\xb6\x45\xeb\xc6\x2c\x43\x63\x6c\x24\x1b\x66\x46\xc9\xd4\x83\x7b\x14\x9c\x88\xb7\x4a\xe8\x64\x93\xa4\x58\x87\xa7\xb7\x49\x91\xb8\x22\x33\xc2\x8e\x5b\xcd\xb8\xdb\x5d\x49\xf6\xdb\x6a\x05\x58\x5f\xb1\x04\xb8\x25\xc4\x6b\x91\x8b\x04\x5e\xb1\x2d\xf2\xdb\x54\x61\xfd\xf3\x22\xcf\x16\xaa\xc8\x20\xa1\xa9\x58\x98\xeb\xe1\xe1\xa1\x73\x97\xed\x80\xa2\x8b\xa9\x89\x5e\x61\xad\xac\x71\xbb\x2b\xd8\x46\x8f\xa7\x07\xd3\xb1\x92\x72\x48\x77\xbb\x44\xaf\xc9\x1f\xd5\x2e\x57\xfa\xff\xb3\xf7\xef\xbd\x8d\x23\xd9\x96\x28\x3e\x7f\xfb\x53\x04\x84\x5f\x23\xad\x01\xcd\xb4\x9d\x8f\xea\xaa\xc4\x00\x3f\x59\xa6\x33\xd5\x2d\x4b\x3e\x92\x5c\xd9\xbe\x83\xc1\x2d\x4a\x0a\x59\xec\xa4\x48\x1d\x92\xb2\x53\x73\x71\xbf\xfb\x45\xec\x47\xc4\x0e\x92\xb2\x33\xbb\xab\xb2\xcf\xa0\xed\x03\xf4\xa9\xb4\x25\x32\xde\xb1\x1f\x6b\xaf\xd5\x0c\xf3\x53\x49\x99\x65\xd2\x94\x47\x07\x7e\xa7\x8e\xa8\x14\x7b\xb2\x43\x5b\x32\x35\xab\x82\x3f\xd5\x91\x15\x35\x09\x25\xe8\x60\x65\x82\xc1\xb0\xe5\x5d\x24\x6a\xe3\x0e\x49\x75\x10\x72\xda\x86\xe8\xa8\xad\xa2\x41\x05\x47\xbc\xbd\x26\xe0\xc7\x6d\x82\xc9\xc1\x01\x8e\xc1\x77\x03\xed\xb2\x22\x5e\x55\x5d\x4e\x42\x1c\x5a\x76\x4f\x90\x26\x60\x63\xf6\xc6\x5f\xf6\x86\xb8\x79\xd5\xb1\x81\xbc\x58\xe7\x79\x89\xc1\x31\xfe\x0a\xe2\x26\x7f\xc7\xe6\x35\xa7\x13\x54\xe2\x16\xb1\x59\x90\x8b\x64\xc9\xfe\xe8\x6a\x07\x52\x34\xfe\xe6\x11\x33\x2b\x18\x9d\x08\xe9\x0b\x0f\x7a\x55\x32\xa4\xc4\x26\xfa\x60\x02\xa0\x64\x88\x2b\x44\xdd\x88\xc8\x23\xc7\x6a\x11\x58\x29\x07\x1a\x0f\x0f\xb1\xc8\x79\x25\xcf\x09\x3e\x3b\x0b\xd5\x24\xc2\x93\x82\x4a\xce\x3a\xd7\x71\x09\xfa\xfe\xd7\xbb\xb4\x4a\x28\xae\xdb\xcf\xd3\x34\x9e\xb3\x96\xe2\x34\xa9\x74\x07\x12\x61\x9d\xeb\xeb\x3e\xfe\xb3\x2b\x0a\x4d\x3f\xe7\x45\xba\x54\x9f\xcd\x98\x7c\xd6\x73\x16\xd2\xc3\xbe\xd2\x8c\x94\xee\x72\x81\x7b\x0d\xfd\x74\x74\x20\x4a\x0b\x42\x2e\x45\x3d\xc8\x2a\x5e\x24\x29\xa2\x23\xe9\xbe\x82\xf2\xd7\x2a\x07\xac\x35\xd9\xf1\xf0\x98\x50\xf5\x78\x2c\x1f\x93\x2f\x09\xcd\x17\x7d\xde\x0c\x3f\x7c\xc1\x38\xf5\x19\xa7\x57\xbd\xb2\xcb\x02\x4a\x66\x7a\xdf\x30\x12\x6e\x10\x3a\x5d\x4e\x1b\xb8\x20\x61\x99\x54\x5a\x8c\x4a\xa9\xc9\xad\x6e\xf6\x1b\xf0\xc2\x6e\xb1\x12\x5e\xcb\x8c\xad\x79\x06\xcc\x54\xa7\xdf\x3f\xb9\xb8\x3b\x99\xf6\x64\x71\x71\xbf\xd0\x18\xe6\x40\x41\xa8\x52\xf5\x1c\xff\xf1\xc9\x74\x6d\x96\x74\x2f\x4d\xbe\x68\xf5\x26\x3c\xb5\x86\x8c\x7b\xcf\x7c\xdf\x7c\x82\xd0\xcc\x0c\xd0\x3f\x39\x59\xe5\xc5\xc9\xb6\xc8\x57\x90\xe0\x76\x8a\x9a\x14\x2e\x75\x80\x50\x0c\xc2\xe6\x2b\x35\xdf\x95\x49\x66\xce\xe5\x24\x53\xd3\x38\x53\x57\x45\x9c\x2d\x92\x72\x91\x07\xaa\x1f\xa7\xc9\x2a\x2f\x40\xce\x2b\x2e\x11\xbc\x1e\x97\xbc\x69\x2c\x63\x9c\xbf\x7b\x04\x3e\xd0\x6b\x3c\xf1\x94\xc0\x7d\xea\x32\xdb\x38\x5c\x82\x1b\xd9\x8e\x58\x2e\xcb\x50\x0a\xcd\xff\x88\x85\x57\x9a\x64\x14\x8b\x40\x51\x4f\x73\x64\x43\x43\x19\xe3\xc2\x05\xc5\xde\x2e\xea\x65\x30\x57\x49\xa9\x3a\x3a\x4d\xee\x13\xc7\x02\x62\x31\xe0\x1d\x42\xc9\x3a\x5e\xc7\xc3\xe1\xec\x64\xc5\x55\x52\x5f\xe8\xb0\x01\x14\x34\xe9\x6a\xd8\x01\x68\x7e\x1d\x6c\x0b\x94\xd9\xc0\x56\x42\xb0\x09\x3e\x71\x7d\xdd\x27\x96\x05\xcb\x6a\x01\xda\x1d\x82\x40\xba\xa5\xeb\x2e\x90\x0b\xdf\x3f\x3e\xeb\xaa\x75\x0c\x05\x99\x2e\x61\x5d\xe2\xe7\x39\x78\x50\x5a\x0a\x20\xb0\xed\xcf\xbb\xd8\x78\x58\xe1\xde\xeb\xac\xbd\x68\x69\x39\x91\x7a\xf3\xcf\x36\x3f\x97\x6f\x75\x11\x57\x7c\x11\x29\x3e\x6a\x38\x1b\xcd\xb3\x87\x7f\x69\xdf\x7d\x38\x46\xbc\x75\x78\x63\x21\xbd\xa1\xf9\x3b\x1e\x0c\x68\xb5\x10\x78\xad\xb7\xbb\xdf\x95\x15\x35\xe6\x67\x2f\x12\xa1\x79\x9a\x0f\xcd\x72\xa8\x7a\x97\x97\xd1\xe8\xf2\xf6\xfa\x17\xe3\xbb\xb9\xd4\x73\x2d\xf6\x0f\x96\xa5\x8d\x15\x1f\xcd\x5a\x3e\x06\xd4\x34\x36\x8c\x6f\x2f\x7a\x62\x11\x0f\x44\x48\x46\x42\x0d\x6b\x39\x8e\xa5\x4c\xab\xd8\x12\x30\x6b\x1d\x38\xfb\x5e\x8a\xfb\x70\x2c\xe4\xef\x10\xc2\xb3\x4e\x92\xe3\x3c\xf8\x45\x72\xa7\x2e\xba\xea\x2e\xea\x4d\xd4\xdd\xf8\x76\xa2\x46\xbd\xeb\x28\x54\x37\x2e\xc6\x65\xac\xa7\x22\xce\x04\xfb\x69\xe0\xd7\xda\x00\xf6\xcd\x16\xb6\x27\x2e\x1d\xd3\x8e\x3a\x7e\xce\x08\x0d\x94\xe0\x7c\x55\x6d\x36\x54\xfd\x04\x39\x6c\x02\x7c\xc0\x13\x2e\x6b\xa3\x7c\x0a\xcc\xaf\x1b\x25\x9a\x01\x79\x04\x8d\x92\x4c\x4b\xe3\x62\x01\x2c\xd6\xb8\xac\x67\x96\xd8\xd5\xd1\x36\x78\xf3\x74\x8f\x3b\xe1\x11\x15\x71\xc1\xfa\x68\x6b\x6a\xb3\x94\xb4\xad\x6c\x34\xf0\xd2\x68\x1d\xd3\xf7\x30\x0c\xb1\xf9\x1d\x95\x26\x99\xe6\xfc\x73\x52\xfe\x72\x64\x53\xd1\x2d\x71\x47\xa4\x07\x1b\x0e\xa6\x20\x44\x3a\x98\x20\xa5\xf9\x54\x94\xd4\x34\x5b\xe4\xbe\xc3\x91\x13\xfa\x68\xa3\xba\xd5\x7d\xf2\xb9\x9e\x5b\xee\x1a\xaf\x97\x79\x41\x2e\x18\x57\xc8\xcf\x85\xff\x09\xcb\x6d\x0d\xe2\x08\x1b\x5d\x40\xbd\x01\x18\x52\x8f\xb9\x8a\x49\xb2\x19\x72\x41\x55\x0e\xa4\x3a\x7c\xd0\xec\xe8\xe2\x61\xa7\xd1\x2e\x62\x01\x08\xcb\xaa\x22\x79\x30\xfe\x9d\x16\x9c\x34\xcc\x35\xba\xc8\x97\x3a\x50\x8f\x92\x7f\x13\xb3\x9e\x64\xc4\x97\xda\x7d\x0d\xcf\xe6\x38\x4d\x75\x4a\x9b\x04\xf1\x12\xeb\x9c\x3c\x7d\x9f\xef\xd4\xc6\x5a\x98\xbb\xa2\x7a\x86\xc1\xd5\x5c\x93\x90\xd0\xa1\xe0\xf4\x0e\xcf\x93\x1a\x5f\xeb\xbf\x9a\xfa\x19\x7e\xc2\xd7\xd3\xeb\xe1\xe8\x2f\x7f\xa8\x02\xe0\x33\xfa\x2f\xe7\x67\x6f\x1a\xfa\x7f\xef\xcf\xde\xbf\xf0\x7f\xff\x88\x9f\xe9\xac\x37\xba\xec\x4d\x2e\xd5\xf5\x10\xc4\x14\xa2\xcf\xea\x2f\xd1\x64\x1a\xdd\x01\xd5\x00\x68\x19\xab\xd1\x78\x36\xe8\x47\x01\x87\x43\x3c\x25\xe6\x68\x12\xd6\xee\xb2\xf3\xd3\xd3\xb3\x93\xf3\xd3\xb3\x33\x73\x3b\x40\xd8\x44\x9b\xdb\x92\x2b\xaf\xa6\xd7\xc3\xd7\xa3\xbf\xd4\xbe\x73\xf6\xf3\x9f\x7f\x46\xc1\xf9\xf9\x5e\x0d\x77\x50\xd8\x33\xd3\x8b\x75\x96\xa7\xf9\x7d\xa2\xcb\xa3\x9b\x3a\x18\xad\xae\xb3\xd7\x2e\x8d\x22\xa4\xda\x9a\xda\x84\x35\x79\x3d\x7b\x68\x9a\xf3\x8e\xb4\xeb\x48\x95\x9b\x2e\xe0\x26\xd9\x07\xb3\x27\x36\xaa\x96\x1c\x47\x52\x9b\xf4\xde\x3c\xa7\xa3\xb9\xf9\x3d\xa6\x0d\x16\x59\x2e\xf1\xa7\x47\xce\xf4\xb8\x54\x87\x78\x55\xb9\xdb\x02\xfb\x6a\x76\xef\xf7\x34\x90\xa2\x7f\x0e\x7d\xd4\x32\xce\x81\xba\x30\xee\xc4\x30\x9e\x97\x7c\xf5\xd3\xa7\x08\x04\x29\x85\x5d\x20\x39\xf6\xa0\x8b\x0a\x79\xfa\x3c\x40\xe0\x16\x79\x16\x89\x26\xa7\x5d\xe1\x84\x26\x87\x87\x9c\xf9\x83\x02\xa7\xf3\x02\xf6\xad\x2c\x5b\xa0\xc6\x70\xef\x4b\xb4\xf2\x2d\x01\x4d\x5d\x8e\xd8\x5b\x05\x9e\x50\x4b\x9a\x22\x43\x8d\x5e\xca\xaf\xe7\x2b\x73\x67\x2d\xd6\x71\x56\xc5\x73\xe3\x2a\x73\x0c\xbe\x32\xbe\x18\xa4\xb2\xb2\x9c\x34\xe7\x51\x7c\x97\x1a\x04\x95\x95\x96\x92\x0f\x5c\x55\xcc\x56\x06\x90\xea\x2f\xb4\xe5\x46\x21\xcf\x01\xa2\x94\x31\x12\x13\xd2\x37\xf8\x9f\x82\x97\xa5\x06\x4b\x48\x73\x64\xa8\x86\xe5\xbf\x8c\xab\x98\x04\x75\x56\x20\x43\x63\x59\xaa\x11\x24\x60\x2b\x3a\xa1\x74\x22\x5e\x54\x81\xca\xf4\x7d\x9a\xdc\x23\x9d\x1f\x53\x40\x57\x40\xd7\x0b\x15\xe1\xb4\x54\x48\xc9\xd8\x4c\x49\xbe\x22\x4f\xa6\x8d\x94\x95\xd4\x6b\x48\x9c\xc8\x31\x70\x89\x21\xff\x2f\x72\xc7\xbd\xfc\x1c\xfe\x09\x5f\xdf\x67\xbb\x6d\x9a\x57\x7f\xa0\x05\xf0\xdc\xfd\xff\xee\xfd\x79\x5d\xff\xe3\xed\xf9\xbb\x97\xfb\xff\x47\xfc\xb8\x7b\xf8\xec\xe7\x3f\xbf\x57\x27\xea\xec\xe7\x9f\xdf\x04\xe6\x7f\xff\x0c\xee\xfb\x5b\x35\x5b\xe7\x9b\xb8\x54\x9f\x93\x34\x4d\xe2\x4d\x19\xa8\x7e\x9e\x26\x99\xfa\xab\x4e\x53\xbd\x3f\x7c\x31\xff\x0e\x17\x72\x5d\xb1\xe2\x87\x5c\xca\x5e\xd2\xee\x1b\x6e\xe5\x67\x6f\xdf\xb0\x36\x46\x82\x83\xce\x8e\x87\x73\xf2\x1d\x99\x05\x20\x08\xa0\x15\xf2\x06\xd5\x16\x63\x06\x48\x53\x0b\x4f\x97\x82\x61\x35\x25\x5d\xa4\xb9\xa9\x73\xf2\x43\x44\xae\x5a\xac\x5d\xe9\x90\x05\x89\x3e\x70\xe1\x87\xdf\x70\xd1\x06\xe3\xf0\x15\x09\x06\x97\x2d\xd9\x25\x02\xdf\x90\x6c\xc6\x6b\x55\xe9\xf5\x4f\x82\x20\x49\xd4\xa0\xd1\xbb\x02\xab\xf7\xe1\xae\xa6\x9e\xf9\xe5\xdf\x16\xa6\x57\x6f\xb4\x57\x49\x0d\xf1\x7e\xe8\x25\x92\xdc\x0a\xe6\x1a\xf3\x19\xee\x45\x40\xf4\x71\xf1\x72\x69\x51\x46\xf6\x71\x48\xe6\x64\xa9\xec\x72\x99\xc3\x42\xb7\x51\xbc\xb9\x0e\x16\x9a\xa3\xb8\x21\x16\xed\xfb\xa9\x98\x80\x18\xbd\x04\x59\x08\xd6\x56\x70\x7d\x33\xa4\xe5\xb8\xf2\xbe\x48\x36\x71\xb1\xb7\x6c\x26\xb6\xc2\x05\xd7\x9c\xcd\xfb\xd6\xab\x15\x60\x1b\x12\xb5\x08\xea\x41\x2b\x2c\x0c\xc0\xc7\x24\x19\x92\x74\x52\xeb\x9d\xe1\xb4\x2b\x2d\xc2\x1b\xba\xe0\x2e\xf4\x83\x4b\xa2\x75\x32\x9a\x6a\x76\x72\x0e\xbe\x61\x9e\x9f\x9a\x4d\x11\x19\x83\xc7\x41\x4c\xd2\x62\x2e\x4a\x75\x6e\x8b\x8c\xde\xc2\x80\xc1\x74\xd7\xf5\xac\x8f\x66\xde\xc1\x94\x94\x6e\x7d\x76\x62\xb3\x70\x3b\xf6\xf8\x21\x08\x0c\xd7\xb6\x08\xdb\xd1\x82\x2d\xf5\xd7\x0a\xb8\x9b\xac\x60\xd1\x7c\x2f\x71\x8f\x20\xba\xf0\xaf\x3e\xf1\xfd\x9f\xf0\xf5\xc7\xe1\xf9\xcd\xf4\x5f\xe9\xff\x9f\xbd\x3f\x3d\xad\xfb\xff\xef\xde\xbd\x7d\xb9\xff\x7f\xc4\x0f\xcc\xbe\xf5\xec\x39\xf4\x7b\x1e\x78\x52\x5f\x6f\x9a\x52\x5f\x6f\x02\xd5\x5f\x17\x49\x59\xe5\xdb\xb5\x56\x1f\xf5\xee\x7f\xc7\x49\xa6\xff\x6b\x9a\x03\xff\xb5\x0d\x81\xda\xc8\x34\x0a\xce\x1a\x5e\x55\xfb\x6d\x6a\x1a\x0c\x7c\x44\x67\x5d\xe8\xf4\xa6\x61\x03\x34\xb2\x66\x4c\xe7\x83\xe8\x86\xd2\x7f\xcb\x07\xb8\x14\xbb\x8e\x9a\x53\xd0\xf8\xd7\x8e\x74\x42\x39\xd4\xf4\xf2\x19\x75\xea\xfa\x66\x49\x55\x65\x12\x09\xe9\x28\xe3\xb2\x49\x22\xb6\x57\xfa\xab\x5e\xec\x30\xcb\xeb\xb4\xd4\xe8\x2a\xa8\xf9\xf6\x79\xa1\x1e\xcc\x73\xd4\x46\x1b\xff\x3d\x29\x37\x92\xcf\x1b\x20\x00\x22\x43\x60\x95\xa5\xf4\x83\x4e\xf3\x2d\x05\x9a\x37\x9b\x5d\xc6\xd5\x8c\x35\x5c\x37\xc0\x53\x57\x08\xa0\x30\x9e\xf7\xef\x74\x6f\xfc\xeb\x6f\x83\xf0\xf5\x7f\xac\x77\x69\xfa\x2f\x8d\xff\xbe\x6d\xc4\x7f\xcf\x4f\xcf\x5f\xf4\xbf\x7f\xc8\x0f\xcc\x7e\xa0\xea\xe1\xd8\x9f\xdf\x9c\xc0\xb9\x3f\x5b\x6b\x35\x82\x1d\x1d\xa7\x6a\xba\x48\x34\x93\x74\xd8\xa8\xe1\x5e\x4d\x74\xa9\xe3\x62\xb1\x56\x7d\x9d\x55\xb8\x43\x55\x1f\xf8\x1d\x1d\x9c\xfb\xd7\xa4\xdc\xc5\x29\x17\xce\xe7\x2b\xf5\x51\xe7\x1b\x5d\x15\xc9\x42\x4d\x81\x3a\x18\xa8\x84\x8f\x67\x70\x97\xc0\x5f\xf6\xf4\xb8\xae\xba\xcd\x12\x38\x0b\x51\x04\xe3\x3a\xc9\x32\x5d\xe6\x55\x7c\xa4\x37\x71\x92\xfe\xa2\xfe\xd3\xf4\xe0\xff\x0f\xff\x1b\xe6\xc5\x7d\x7d\x63\x72\x85\x38\x74\x14\xfd\x86\x96\xb7\x84\xf4\xf7\x44\xa0\x6a\xd0\x49\xca\x72\xcb\xd4\x2b\x3e\xe4\x27\x88\xa0\x98\x15\x6b\x4a\xf2\x39\xe5\xd0\xcd\x69\xb4\xae\xaa\x2d\x11\x5a\x3e\x3e\x86\xb6\x89\xa0\x08\x48\x9f\x37\x0f\x4a\x89\xe5\x77\x19\x28\xbf\xd8\x57\x6a\x38\xca\x63\x5b\xe6\x9f\x19\x8f\xf6\x0b\x0b\xc4\xe1\x8d\x56\xe3\xe0\x82\x62\x12\x22\x80\x4c\xd8\xf8\x87\xdb\xcf\x98\xd2\x25\x13\x68\xf7\xfc\x62\x34\xac\xa6\x37\xb6\xb6\x24\x81\xb0\x1e\xa4\xb3\xe4\xcd\x61\xed\x6a\x79\x70\x94\x04\x83\xa0\xfb\xd6\x07\xc2\xdd\xf2\xac\xd0\x97\xec\x67\x21\x0f\xe9\x06\xc1\x11\x17\xbb\x4c\x5f\xe9\xee\x02\x3b\x01\x56\x4d\x1c\xab\x0d\x29\xb1\x8f\x27\x1b\xf9\x59\x94\xe8\xa4\x4b\x97\x96\xbd\x2d\x4c\x75\x58\x80\x26\xd5\x97\x47\x96\x86\x02\x00\x14\xf4\xe4\x4f\xf8\x15\x33\x00\x1b\x00\x7e\xa7\x7a\x2d\x0d\x17\x36\x20\x1a\x19\x36\x0a\xea\xc9\x49\xc5\x0d\x72\xd7\xa0\x12\xcc\xe3\xa2\x6c\xb5\x0c\xa8\x23\xdf\x35\x24\xa2\xdf\xec\x7d\x4a\xd9\x22\xaf\x74\x42\xde\xf3\xf5\x25\x5e\xdb\x1d\x54\xc6\x3f\x13\xa4\x58\xd6\x3f\xb2\xed\xbb\xdf\xc5\x60\xba\x60\x9a\x15\x03\xeb\x30\x10\xd4\x32\xd2\x58\xe4\xbb\xb4\xcc\x53\xb3\x3d\xe8\x4a\x0d\xd5\xc5\xee\x5e\x15\xda\x98\x57\xa8\x9d\x93\x7c\xd5\xb6\x9c\xab\xa4\x2a\x67\xd8\x67\xff\xf7\x7c\x77\xef\x0e\x85\x0f\x18\x16\x22\x72\x3e\x60\x6c\x2a\x1c\x5f\x83\xe5\x97\xdf\x58\xee\xe2\xa5\x2e\x93\x7f\x8b\xf8\x75\xf8\x3a\xba\x19\x9e\x9c\x87\xa7\xff\xb2\xf8\xef\x9b\x37\xef\xde\xbe\x6b\xe4\x7f\xdf\xfd\xf4\x72\xff\xff\x88\x9f\x68\x91\x26\xdb\x52\xd7\x20\x0c\xea\x44\x3d\xa8\xf3\xf0\xf4\x68\xf6\x29\x52\xbd\x7e\x7f\x7c\x7d\xd3\x1b\x01\xf1\xfc\xcd\x64\xfc\x71\xd2\xbb\x56\x83\xa9\xf9\xcf\x5f\x07\x97\xd1\xa5\xba\x1d\x5d\x46\x13\x90\x5f\x9f\x45\x93\x6b\x07\x9f\x8f\xfa\xc3\xc1\xcd\x34\x52\x37\xb7\x17\xc3\x41\xdf\x3a\x99\xc7\x9d\xde\xc7\x49\x04\xca\xf6\x9d\x6e\x08\xaa\xef\xa0\x5b\x3f\x89\x6e\x26\xe3\xcb\x5b\xa8\x85\x57\xe3\x89\xba\x1c\x4c\x67\x93\xc1\xc5\x2d\xfe\x9b\xf4\xdd\xe9\xf5\xfd\xf1\x88\xe4\xf0\xa7\x6a\x12\xf5\x07\x37\x83\x68\x34\x7b\x35\x35\x6d\x8d\x6e\x66\x3d\x90\x99\xa7\x56\xd8\x97\xb1\x84\x6a\x4d\x30\xb5\xd3\x67\x6e\x31\x80\xa3\x02\xd0\x91\x89\x5d\xe3\xae\x2d\x57\x8f\x5d\x48\x0c\xf8\x7d\xe2\x54\xf5\x1d\x29\x59\xe0\xfd\x81\x48\x24\xd4\x65\xcb\xed\x9d\x94\xaa\xc7\x15\x70\x36\x3c\xa7\x94\x9a\x37\x5e\x45\x74\x13\x56\x42\x4b\xbc\x8e\xdb\xa7\x94\x4a\xba\x96\x97\x9d\x82\x50\x37\x78\x4f\xca\x87\x9b\xcf\x25\x5d\x1b\x9e\xac\x7f\xf4\x03\x7d\x0c\x81\x8f\x70\x25\xf1\x33\x09\x5f\x76\xe8\x9b\x7c\x51\x54\x5c\xdd\x93\x2d\xc1\xd7\x94\x3d\x67\x98\xa9\x00\xef\x8b\xae\x18\xa3\x43\xce\x80\xea\xd8\x47\x96\x1d\x2e\x19\x12\x9f\x27\x14\xe8\x63\x5c\x32\x05\x8e\xdf\xa0\x39\x69\xb4\x7a\x5f\x01\x02\x3d\x4a\xb4\xe6\x99\xe4\xf0\xa9\x7f\xf6\x55\x49\xb4\x3e\xa1\xd7\xaa\x92\xa9\x72\xf8\x22\xe5\xf1\x79\x6a\x6c\xac\x9a\xa0\xf9\xa2\x65\xbd\xf9\x0c\x00\x6b\x7f\xe5\xe5\xdf\xa0\x32\x74\x29\x54\x86\xc4\x5b\xf0\x49\x43\xf6\xed\x6f\xe2\x0a\xa9\xd7\xcc\xe3\xd4\x16\xfe\xa5\x28\x59\x8e\x01\x00\x70\xa7\xe7\xfb\xda\xa8\x8a\x4a\x70\x0d\xc5\x5c\x45\x02\xe8\xd6\x55\x91\x80\xc4\x1b\x21\xfd\x28\xe9\x5b\xc6\x08\xf8\x4e\xaa\xd2\x9f\x3c\x63\x13\x6a\xd2\x4c\xce\x04\x3b\x08\x87\xdc\xbd\x46\xd3\x3f\x3c\x38\xb6\x37\xe6\x72\x15\x19\x73\x15\xa4\x77\x20\xd3\x6c\x71\x74\x6e\x33\xe1\x33\x27\x7a\x91\x6c\x13\x90\x75\xb3\x03\x6a\x9a\xf4\xb8\xce\xb9\x8e\xc9\x1b\xbe\xd6\x7d\xc9\x29\x79\x47\x01\x67\x0b\xbd\x62\x59\xc8\xde\x95\x98\x02\x31\x9a\x34\xbd\x97\xae\x88\x1e\x26\xbd\x43\xa0\x01\x98\x1a\xae\x16\xf3\x12\xf7\x53\xb4\xb6\xfa\x10\x55\x91\x11\x0f\x27\x92\xc8\x54\x95\x80\x9b\x87\x32\x7d\x62\x9e\xeb\x7a\xdd\x42\x8a\x08\x29\x81\x86\x22\x85\xe6\x78\x42\x69\x45\x42\x18\x67\x39\xba\x69\x65\xa0\xb4\x83\xe5\x97\xc2\xa4\xf4\xe3\x3a\x56\xfc\x11\xe9\x98\x11\xf0\x1c\x20\x37\x1a\xd9\x8c\x40\x06\x94\xaf\x04\xe5\x32\x8e\x87\xbf\x05\x5a\x47\xe3\xc9\x41\xc0\x31\x40\x50\x44\xc9\xe7\x8d\xcc\xb9\x04\x48\xc0\xc2\xa5\xe1\x81\xaa\x09\xc4\x4b\x36\x49\xa6\x81\xf3\x4e\x4c\x3b\x9b\x01\x11\x5c\xb1\x3c\xdb\xca\xec\xa1\x02\x01\x21\x7b\xa4\x14\x84\x14\x84\xdf\x5a\xd7\x48\xa7\x9f\x9d\xed\x0f\xbd\x2e\xac\x9d\x09\x34\x1e\xf2\x94\x11\x00\x76\x47\xa9\x94\x1a\xf3\xd4\x34\x87\x67\x2a\x31\x1e\xec\x2a\x06\xce\xe2\x6a\xbf\x35\xff\x6f\x91\xc6\x25\xd0\x0d\x95\xd6\xbb\x0e\xd0\x60\x4e\x75\xbd\x1d\x6c\x64\x27\x19\x5e\x39\x70\xff\x48\xad\xf8\x34\xc9\xbe\xc0\xe8\xce\x93\x0c\x4e\x02\xe3\x11\x21\x0c\x74\x37\x87\x37\xd5\xae\x84\x7a\xc7\x80\x9b\x29\x5f\xd1\xae\xb0\x9b\x5a\x6e\xfc\x78\x81\xe3\x13\x77\x7d\xa7\x27\x2f\xcc\xcd\xb8\x89\xbf\x00\x6c\xc7\x86\x20\xad\xd6\x70\x96\x71\x5d\x8c\x86\xf2\xce\xd2\x55\x93\x53\xb8\x0e\xe1\xdd\xf8\x6e\x31\x59\xf2\xe5\x2e\xbd\xc4\x7d\xd8\x02\x79\x6a\x41\xba\x88\xf4\x7a\x6f\x23\xc8\xad\xcf\x29\xdb\x36\x29\x7a\xe1\x40\x05\xb5\x00\x37\xfe\xc9\xca\x81\xac\x92\x7b\x12\x30\x17\x4e\x79\xa7\x71\x06\x71\xc3\x29\x96\xfa\x1c\x16\xd5\x86\xf4\xc3\xd3\xa0\x15\xce\xdd\xa8\x10\xf1\x80\x52\x10\x85\x5d\xe8\xad\x63\xcc\xa4\xed\xe6\x31\x31\x20\x53\x25\xa5\x4a\xdd\x6d\xd1\x62\x28\x71\xa4\xe1\xe3\xa4\x37\x9a\x19\x1b\x0d\x20\x86\x53\x67\x6f\x4d\x49\xeb\x99\xee\x52\x9f\x2f\x5b\x58\x4e\xb0\x54\xe5\x0d\x26\xf3\x00\xa5\xb2\xf7\x00\xb8\xf4\xd9\x89\x95\xf3\x0e\x50\x55\xbe\x45\x54\x5e\x88\xa3\xd3\x69\x0f\x72\xdc\x94\xe2\x06\x0a\xc1\x2d\xd8\x36\xb5\x63\x1d\x08\x00\xeb\xba\x4d\xe2\x37\x14\x2c\x08\xc4\x75\xc6\x75\x24\xf6\x45\xb5\xab\xcf\x16\x53\x79\x26\x26\x53\x2a\xe3\x97\x17\xeb\x46\x4b\x42\x67\x4b\xfe\xeb\x86\x91\x6c\x0e\xee\x1a\xde\xaf\x75\xfb\x04\xf2\x1f\xf1\x17\x1d\x60\x8e\xa8\xd4\x10\xc4\x80\xf2\x54\xb3\x79\xe0\x9f\xc9\x06\x72\xdb\x96\xcf\x0a\xa9\x04\x78\x67\x7f\xdf\x90\x3d\x75\xad\x84\x0a\x42\x86\xb5\x76\xe3\x61\xec\x51\xe9\xb4\x20\xdd\x7d\xe3\x87\xc2\x3b\x7c\x88\x24\xab\x80\x09\xe1\xb0\xa8\xb7\xfe\x85\xa4\x74\x64\x94\xde\x1f\x4d\xd3\x11\x6c\xce\x97\x5b\xdb\xfb\x16\xf1\xce\x5c\x4e\x68\xaf\x8b\xb6\x21\xd8\x03\xea\x8b\xdc\xb3\xeb\x33\x80\xc2\x53\xad\x9d\xf6\x38\x84\x1c\xd1\xab\x78\x05\xab\x7a\x4a\x32\x11\xd9\xb4\x50\x8d\x72\xb5\x8e\x8b\x25\x86\xa2\x80\xef\xc9\x2b\xdc\x32\xab\x0c\x56\x06\x2f\xd9\x45\x57\xac\x35\xf8\x0b\x89\x4b\xa2\x11\x9d\x56\x6b\xc8\xe4\x37\x96\x2b\xad\x53\xaf\x86\x1d\x4a\x7b\xcb\x9a\x2d\x59\x6a\x80\x4d\x54\x6b\x85\xa4\xd0\x50\x7f\x12\x97\xe5\x0e\xc4\x43\x31\x43\x66\xc3\x4e\x73\xbc\xe7\xe5\x8b\x6c\x68\x8c\x67\xd7\x29\x94\x93\x91\x8c\x01\x42\x1c\x50\xbb\xc0\xcc\xdd\x0c\x9c\x61\x3b\x73\x60\x16\xf9\x56\x17\xd5\x5e\x30\x46\xb9\xe1\x65\xae\xd3\xa8\xde\x45\x81\x76\x35\x67\x77\xc2\xd0\xd4\x2a\x17\x43\x06\xc2\x77\xf8\xa9\x39\x80\x1e\x2a\xee\x84\x7c\xba\xb3\x1e\xb9\xd1\x5c\x25\xfb\x74\x3b\x0b\xb7\x03\x43\xd5\x43\xba\xd5\xcc\x41\x5d\xf4\x57\x5d\x2c\x9c\x5a\x37\x7d\x4b\x54\x44\x39\xa4\x86\x9d\x78\x3a\x7a\x5c\x0f\xe8\xe0\x31\x53\xb2\x31\xab\x3a\x4f\xb5\x13\xf1\xb0\x3d\x2e\x35\x10\x27\x08\xa1\xc9\xa7\x1a\x8e\x4a\xb7\x7c\x0c\x20\xdb\xb9\xa5\x03\x36\xbf\x34\xe7\x61\x81\xfc\xdb\xfb\xfa\x66\x70\xca\x1a\x70\xa3\x83\xf4\xbd\x68\x6f\x95\xcb\x03\xdd\x37\x23\xc1\x52\xb7\x1f\x7d\x55\xb6\x74\x24\x5e\x20\xa7\x8b\x57\x9b\x49\x05\x74\x9e\x05\x54\x77\x9b\x94\x52\xcb\x6e\x73\x95\x58\xbb\x9c\x35\x43\x71\x13\x58\xd6\x1a\x16\x18\x29\x77\xab\x55\xb2\x48\x98\x61\x9f\xf8\xcf\x70\xb8\x88\x22\x54\x6e\x1c\x77\x84\x56\x39\x4e\x62\x2d\xa5\x6e\x8f\x0e\xbb\xbf\x58\x41\xd4\xf7\xcc\x94\x52\xba\xab\x46\x79\x65\x5c\x37\xd8\xdb\x7e\x75\x3d\xed\x85\x86\xb9\x03\xfb\x54\x76\xd4\x5c\x1b\xa5\x34\x43\xf8\x08\xc0\xb3\xca\x4d\xd0\xb1\x57\xc1\x99\x3f\xdd\xc6\x2e\x7a\x33\xe8\x5c\xd8\xbb\xc4\x9f\x42\x8f\x81\xa3\xee\x3f\xca\x7e\xb4\x39\x8e\xc9\x4a\xc0\x82\x5a\xbe\xc4\xbc\xf1\x6f\xba\x9c\xb1\x98\x44\xff\x71\x3b\x98\x44\x96\x0d\x12\x7e\x7b\x86\x9c\x45\x72\x40\x0e\x04\x06\xd8\x46\x66\xf7\x51\x67\x22\x6a\x14\xfb\xde\xa2\x13\x34\x9c\x6b\x24\x40\x76\xa6\x76\x5c\xca\xab\x33\x68\x73\xc4\x9d\x20\xe6\xb9\x4b\x72\x78\x73\x06\xcf\x5f\x2c\xf2\xcd\x16\x8a\x45\xc5\xab\x99\x32\xd2\x96\xec\xdb\x83\xb6\xe6\x59\xf9\x7d\x2b\x45\x0b\x0f\x86\xd6\x08\xe0\x26\xb6\x62\xa9\xd6\x58\x54\x8a\x49\x0c\x64\x6d\x84\x79\x77\xfc\x30\xe8\x53\x60\x00\xc6\xd2\x54\x13\xa9\xa0\x5a\xec\xca\x2a\xdf\x60\x74\xc4\x2a\xd0\x5b\x63\x9f\x75\x48\x3f\xf8\xb1\xb7\x79\xb7\x39\x22\xf1\xfe\xc0\xf1\x41\xdd\x71\xe2\x33\x8e\x9c\xd6\x15\x23\x8b\x7e\xfa\x78\x17\x58\xb6\xf4\x4d\x31\xdf\x18\x28\x44\x31\xdd\xe4\x41\xa7\x7b\x71\xab\x48\x26\x6b\xc1\x1f\x29\xe3\x19\xf5\x3a\x0b\x9f\x0a\x23\xb0\x10\x07\x18\x73\xc4\x38\x48\x2f\x42\x96\x58\x14\x35\x25\x32\xd6\x16\x58\x82\x7d\x29\xaf\xa5\x40\x3e\xee\xc9\x67\x3c\x51\xb4\xc1\xc2\xe9\x2e\xf6\x48\x4e\xfd\x07\x7f\x70\x6a\xa3\x03\x76\xee\x52\x7f\xfb\xe0\xb8\x6b\xd9\xbc\x90\x6a\x39\xe4\x18\x60\x15\x88\xab\x07\x09\x64\x89\xc8\x02\x7c\xa7\x38\xe5\x81\x6d\x56\x89\xb8\xe2\xc3\x94\x04\xd0\x57\x49\x55\xd6\x3b\x91\x74\x05\x0b\x24\xd1\x70\x59\xc2\x4a\x60\xcc\xe1\x5a\xe4\xc2\xee\x88\x57\xe2\xf4\xaf\x6f\x3b\x5c\x8a\x62\x7b\xd7\x16\xb6\x79\xe9\x43\xd7\x71\xf4\x41\xe5\x8b\x8b\x58\xb7\xd5\xfd\x88\x38\x2d\xc4\x3a\xe1\xe6\x45\x8b\xb5\xbe\xf0\x89\x9c\xa0\x4a\x4a\x22\x0d\xf1\x28\xd5\x04\x30\xca\xd3\xe3\x85\x63\xf2\xdc\x31\x69\x8a\x23\xe3\xd2\xc7\x3f\x8b\x9e\xfa\x47\x63\x52\xd9\x84\x77\xed\x30\x6c\x3f\x6a\x9c\x30\x0b\xbf\xec\x38\xe9\x22\x96\x40\x06\x40\x6b\xb2\xab\x70\xf0\x58\x1e\x54\x88\x27\xd9\x08\x4d\xeb\x6b\x5b\xee\x15\xe2\x08\x30\x13\x7f\xc0\xe1\x36\xeb\x20\x5e\xac\x5d\xa0\x5c\xce\x6f\xe5\x54\xc7\x49\x1b\x08\x23\xad\xd1\xd7\x75\x32\x4f\x2a\xd5\x6b\x73\x19\xab\xfa\xc8\x52\xfe\xf5\xc0\x50\x49\x16\x48\xb3\x84\x1b\x7d\x28\x83\xc6\x69\x59\x23\xc5\x75\x81\x59\x9e\x16\x5b\xf3\xed\x04\x46\x65\x75\x78\xcd\x5e\x7a\x13\xbe\xf1\x77\x2c\xa7\x7e\x0b\xbd\xc9\x1f\xb4\xdb\x19\x84\x63\x40\xd3\x26\x20\x83\x30\x30\x4e\xe7\x52\x6f\xe2\xe2\x8b\xf1\xe7\xdc\x8a\xb6\x42\x61\x82\xef\xd0\xb4\x80\xb3\xde\xb0\x30\x60\xef\x39\xc2\x49\x77\x4e\x1c\x77\xe8\xfb\x1e\xf1\x89\x20\x1a\xe5\xe1\xb5\x7a\x1b\x2d\x3d\x74\xf1\x5d\x79\x9d\xd4\x2f\x85\x46\xdf\x9d\x7a\x48\xfe\xe8\xeb\xaf\x49\xdd\xb4\xb7\xc0\xc9\x7f\x1d\x4d\xfa\x83\xde\xd0\x4b\xc7\x99\xbf\xf6\xad\x0c\xba\xdb\xe7\x24\x7d\x67\xef\x43\x29\xd9\x8d\x15\x81\xbe\x25\x2c\x6a\xf6\x80\xac\x18\xd5\x4c\x97\xc8\x9a\x1b\x38\x16\x14\x73\x4a\x64\x20\x64\x6f\xa5\xd3\xbf\xe8\x50\x7d\x5e\x27\x29\x61\x49\x3d\x3e\x80\x4a\x67\x94\x19\x22\xca\x9b\xd8\xd5\x4d\x70\x9b\x05\xc4\xdd\xda\xed\xf5\x4b\xfa\x71\x9d\x3b\xa8\x4a\xdd\xb4\x92\x0f\x23\xb0\x05\x46\x30\x00\xcc\x8e\x9a\xc1\xcb\x5c\x01\xe5\x26\xe8\xea\x82\x59\x81\xf3\x65\x0f\x69\x52\x02\xdb\xe6\x15\x1d\xf7\xfe\x3d\xd2\xbc\x6c\x08\x5f\x61\xdc\x04\xf2\x60\xbc\x44\xd7\x3f\xd2\xd8\xa0\x99\x30\x3b\xee\x88\xd9\x95\x59\xaa\xae\x75\xd3\xcc\x96\x44\xd9\x5d\xbd\xd2\xd9\xd2\xf2\x38\x6f\xb2\x64\xb5\x07\xee\xa8\x7d\xb3\xf9\xea\xb8\x33\xa0\xcf\x24\xa0\x38\x27\x9f\x1c\xdf\xc7\x49\x56\x22\x9d\x48\x9a\x63\xf8\x9a\x8b\x22\xf1\x5e\x2c\xab\x52\x1d\x33\x07\x37\xdc\xd3\x9d\x21\x7c\xd0\x7c\x9b\xea\x16\x61\xb7\xa0\x65\x13\xa8\x34\x7e\x2c\x77\x09\xf9\xa2\xd8\x1a\xa4\x6c\x8e\x99\x68\x41\xf8\xca\x9e\x2f\xc8\x8d\x41\x82\x86\xd6\x26\xd7\x40\xff\x10\x8d\xb1\xe1\x16\x8c\x67\x17\x2a\xb7\x11\x52\x17\x9f\x6a\x1b\xd9\xb6\x2a\x4b\x80\x44\x3f\x71\x85\x3e\x37\xb1\x18\xe2\xc9\xe7\x69\x72\x2f\xcb\x29\x3c\x36\xc0\x66\xb0\x87\xad\xc2\x42\xe1\xd8\xaa\x42\xa7\xa4\x51\x87\x1f\x20\xe2\x51\x24\xe0\xd3\xf7\x70\x63\xb4\xf9\xe0\xd2\x96\x83\xda\x59\x9b\x50\x20\x95\x25\xc8\x1a\x1d\x1a\x5c\x73\xd2\xff\xa2\x90\x45\x73\xb3\xad\xd2\x3d\x73\x56\xe2\x26\x3d\x34\x86\x8f\x45\xc2\xac\xf8\x18\x17\x33\xbd\xc1\x5b\xd2\xdc\x2b\x96\x55\xfe\xc0\x13\x50\xad\xaa\x2a\xf2\x94\xc3\xf2\x48\xa1\xa3\x5d\x0a\xf3\xe0\xbb\x09\xf9\x65\xb6\x03\x55\x93\x03\xeb\xa0\x19\x3d\xbd\x34\xbe\x67\x95\xe2\x25\x96\xe9\xfb\xbc\x4a\x62\x62\x08\x9e\x3d\xb1\xc2\x80\x58\x10\x4c\xd7\x64\x4b\xa2\xda\x68\x62\x71\xcf\x54\x0c\xf2\x70\x70\x8c\xeb\xaf\x5b\x4b\x7b\xea\x05\x3a\xfc\x33\x62\x03\x6e\xbb\x8c\xdc\x7d\xfb\x41\x71\x43\xbf\xf9\x9b\x69\xb6\x7f\xb1\x10\x97\x66\x06\x6f\x6b\x1b\x21\xe2\x83\x83\x6f\xb5\x8f\xbd\xf9\x36\x7a\xf7\xb2\xa8\x98\xf7\x32\xb0\x18\x81\xa2\x9d\x70\x05\x78\x74\x81\x52\x97\xda\x16\x90\xb7\xdf\x7c\x88\xac\xa1\x4f\x28\xe6\xf7\xc4\x9e\x6c\xc6\x6d\x20\xbd\x1d\xaa\xdb\x06\xaf\x66\xf0\xd4\xd2\x78\x84\xbb\x00\x59\x06\xed\x79\xc9\x2d\x12\xe7\x4c\x8b\x6b\x21\xfa\xf7\x8d\x9d\x72\x04\x58\x6a\x91\xef\x8a\xca\x37\xce\x9b\x27\x72\x95\xab\x6d\xbc\xf7\x2a\xd0\x45\x24\xe4\xc9\x7e\x21\x82\x30\xde\x53\xd3\xe8\xeb\x8c\x03\x1c\x8d\xd5\xe7\xde\x64\xd2\x1b\xcd\xee\x80\x21\xf2\x6f\xfd\xe8\x66\xa6\x7a\x53\x15\xfd\xed\x66\x12\x4d\xa7\xc3\x3b\x35\x8d\x66\xea\x6a\x3c\x01\x7d\x81\x1a\x58\x27\x00\x96\x89\xd9\x18\x50\x3f\xd1\xdf\x66\xd1\x68\xa6\x6e\xa2\xc9\xf5\x60\x36\x8b\x2e\xd5\xc5\x9d\xea\xdd\xdc\x0c\x07\xfd\xde\xc5\x30\x52\xc3\xde\xe7\xc0\x43\x07\x49\x70\xd2\x78\xa4\x7a\x23\xd5\xe9\x4d\xd5\x60\xda\x51\x17\xbd\xe9\x60\x1a\x80\xa6\xc1\xf8\x76\xc6\x0d\x1c\x44\x53\x35\x9e\xa8\xfe\x78\x74\x39\xb0\x4a\x1c\xbd\xd1\x9d\xfa\xeb\x60\x74\x19\xa8\x68\x30\xfb\x14\x4d\xb8\xdd\xe6\x93\x83\xeb\x9b\xe1\x20\xba\x54\x83\x51\x7f\x78\x7b\x39\x18\x7d\x74\x8f\x1c\x0e\xae\x07\x33\x60\x60\x0e\xe0\x11\x4f\xbd\x02\x58\x7d\x02\x35\x1a\x8f\x4e\x06\xa3\xab\xc9\x60\xf4\x91\xfa\x6e\x6c\xae\x4f\xbd\xd1\xac\x77\x31\x18\x0e\x66\x77\xe6\x9b\x57\x83\xd9\xc8\xbc\xfd\x6a\x3c\x51\x3d\x75\xd3\x9b\xcc\x06\xfd\xdb\x61\x6f\xa2\x6e\x6e\x27\x37\xe3\x69\x44\x81\x63\x17\xfe\x4a\x4a\x4e\xec\xd6\xa5\x90\x97\x1a\x19\x58\x2d\x93\xb4\xb3\xff\xc0\xda\x02\x8a\x01\xcc\xfe\x2d\x0f\xc6\x22\xf1\x80\xa3\x60\xad\xf1\x80\x8b\xa4\xfc\x62\xd6\x4e\x99\x2f\x92\xd8\x16\xe5\x99\xc3\x89\xc2\xc3\x60\x6f\x35\x99\x69\x85\x67\xf1\x64\x46\x15\x23\xcb\xe5\x17\x69\x0c\x08\xfe\x1f\x5d\x14\x20\x97\x0a\xa5\xb1\x89\x8b\x4d\xf9\xe5\x77\xd6\xa4\x80\x18\x50\x61\x29\x15\x96\x71\x15\x07\x1e\xc2\xd8\xec\x9a\xad\x0b\x43\xec\x32\xf2\x6c\xf0\x20\xc8\x31\xf0\x5c\x14\x3b\x4b\x19\x8a\x17\x05\x16\x15\xa2\xb4\x8b\xe3\x48\x31\x93\x3d\x1c\xd0\x6c\xfe\x88\xdd\x30\xa2\x35\x6b\xb1\x71\x6a\x64\xd6\xcd\xe8\xce\xac\x40\x34\xe3\xc7\x93\xa9\x9a\x7e\xea\x0d\x87\xea\x53\xef\xd7\x08\xfe\x66\x9b\x88\xab\x6c\x74\xa7\x2e\x07\x93\xa8\x3f\x0b\xd4\x60\xe4\xfe\xab\x3f\xb8\x8c\x46\xb3\xde\x30\x50\xd3\x9b\xc8\xb8\x06\x81\x8a\xfe\x16\x5d\xdf\x0c\x7b\x93\xbb\x80\x16\xf9\x34\xfa\x8f\xdb\x68\x34\x03\xbf\xa1\x77\xdd\xfb\x18\x4d\xd5\xb1\xdd\x2c\x2d\x7b\x45\x0d\xc7\xd3\x99\xd9\xb4\x57\x83\xd9\xb4\x1b\xa8\x4f\xe3\xcf\xd1\xaf\xd1\x44\xf5\x7b\xb7\xd3\xe8\x12\x7a\x0f\x1b\xf9\xce\x8c\xc0\x78\x72\xe7\x0d\x68\xa0\x3e\x7f\x8a\xa0\xbb\x83\x11\xf6\xaf\x67\x5a\x6a\xdc\x95\xfe\x4c\x7e\x6c\x3c\x51\xb3\xf1\x64\x26\x9b\x32\x8a\x3e\x0e\x07\x1f\x23\x00\x0c\x4e\xd4\xd8\x3c\xe5\xf3\x60\x1a\x75\x55\x6f\x32\x98\x9a\x0f\x0c\x46\xb4\x8d\xef\x94\x69\x32\xe1\x10\x6f\xa7\xd1\x73\x10\xc5\xf1\x84\x66\xcb\xf8\x4f\xd3\x88\x8f\x14\xcc\x77\x63\xfe\x3b\xba\x54\x9f\xa2\x49\x04\xf8\xc9\x40\x45\xbf\x46\x23\x35\xb8\x52\xbd\xcb\x5f\x07\xa6\xd3\xfc\xbc\xf1\x74\x3a\xe0\x73\xe0\x4a\x4d\x6f\xfb\x9f\x78\x4c\x59\xae\xe5\x63\x34\x8a\x26\xbd\x21\x33\xda\x67\x7b\x57\x06\xdb\xe2\x43\x27\x28\x2a\x99\x26\x4b\xb3\x8c\x77\x99\xce\x56\x79\xb1\xd0\x32\xd0\xe0\xed\x19\xc8\x67\x88\xcc\x20\x84\xc9\x60\x3b\xc2\x43\x68\x3b\xd8\xa7\xd0\x06\x59\x51\xbc\x66\x13\x27\xf0\x4c\xa6\x06\x3b\x94\x88\xf6\xd8\x77\x76\x05\xdc\x53\x44\x62\x42\x26\x35\xf3\x52\x1b\x0f\xa4\xca\xc9\x6b\x71\x1d\xc5\x16\x82\x52\x98\xb9\x21\xdd\xa1\x61\x4e\xba\xcd\x6e\xc3\x76\x3a\xe3\xdb\xf6\x9c\x83\xae\x3f\x08\x87\xc6\xb4\x47\x8c\x0c\xcb\x05\x88\xf3\x35\x2b\xab\xa4\x82\xa8\xbb\x4d\x1c\x55\x64\x69\x7b\xbe\x0c\xa5\xde\x8e\x05\xaa\x42\x2d\x8a\xbc\x2c\x4f\xd0\x84\x83\x70\xe6\xce\x9c\x26\xf8\x6f\x30\xc3\xc8\x73\xe9\xa2\x8d\x8d\x67\x6f\x2d\x01\x49\xa8\xc6\x63\x8c\x55\x62\x35\x88\xc8\xd0\xd6\x03\x05\x42\x7b\x87\xdd\xf3\xbc\xb0\x49\xda\xae\x35\xd7\xcb\x66\xea\x03\xfb\x77\x5c\x76\x29\xf8\xd3\xcc\x8d\xe0\xa9\xce\x49\x3e\x5c\x45\x9c\xd1\x38\x3f\x9e\x77\x69\x76\x1c\xe9\x78\x6c\x1b\x08\xa5\x12\x14\xb6\xb6\xe3\x97\x94\x10\x08\x43\xd5\xcc\x5e\x9a\xb6\xbd\xad\x15\xb9\x57\x7f\x0f\xa2\x45\x2d\xef\x3d\xdc\x0e\x7b\x57\xb4\x42\x6d\xb0\x31\x39\x5a\x9e\x8d\x20\xb5\xff\x12\xb8\x17\xad\x0b\xbf\x63\x2b\xd2\xbc\x65\x57\xe8\x46\x46\x61\xab\x8b\x24\x47\xe9\xcd\x64\xa3\x89\x10\x72\xae\x17\x39\x14\x90\xc4\x38\x15\xe4\xaf\x64\x79\xe6\x6e\x30\x30\x99\xe3\xef\xe8\xbd\xed\x77\x20\x91\x1b\xd6\x55\x47\xf1\x83\x1d\x79\x27\x4f\xb9\x96\xb1\x31\x1e\x50\xe2\xd4\x76\xc4\x9c\x2a\x66\x47\xc2\xc1\x10\x3a\x65\x05\xd9\x38\xe9\x6c\xb6\xb6\x90\xdd\xa2\x46\x62\x78\x2e\x53\x77\xd2\xe5\xf4\x90\x6a\x6b\x2c\xd8\xcd\xaa\x24\xdb\x31\x8a\xa6\x78\x48\xa8\xfa\x24\x7a\xd0\x05\xa0\x3d\xb9\x42\xb7\x12\xb4\x99\xf5\x42\xdb\x9a\xb6\x99\x38\x8a\x8c\xf1\x21\xf1\x6f\xf1\x43\x9e\x2c\x81\x7a\x15\x44\xd7\x74\xb6\xc0\x03\xc9\x3b\x52\xbd\xb2\x31\xaa\x07\x03\xac\xde\x5c\xd4\xf4\x5a\x3a\x03\xae\xdf\xc2\xa8\x10\x3a\x81\xee\x71\xd3\x4a\x3f\xc6\xc5\x52\x91\x48\x48\xe9\xb2\xea\x92\x81\xd7\x63\x85\x17\xa7\x8b\x85\x77\x76\x5b\x96\x6e\x0b\xc5\xfc\x28\x47\xe1\x56\x99\x2d\x6d\x6b\xcd\x3a\xae\x35\x44\x92\x8e\xba\x64\x2f\xf4\x85\xcb\x0a\x04\x49\x3e\x69\x2d\x70\x88\xba\xf1\xfc\x83\x5f\x84\x20\x62\x59\x26\xf7\x19\x5d\x29\x4d\x4c\x00\x48\x56\x96\x07\xda\x0d\xca\xf2\xe6\x30\x85\xcd\x68\x03\xee\x1e\xde\x42\x8c\x25\x6f\x05\xf7\x20\x66\xdc\xff\x46\x16\xfb\x99\x97\x07\x68\xe2\x83\x71\x6a\xa0\x57\xe9\x63\xbc\x2f\xcd\xa3\x65\x66\xa2\xf4\xa1\x5b\x07\x9b\x85\xfb\x8b\x80\x38\x88\x88\x67\xa5\x06\x08\xb7\x70\x8a\x3c\xa0\x13\x27\x7e\xba\x97\x89\xe0\xcf\x0e\x1a\x51\x08\xa8\x85\x3e\x8c\x79\x90\x1d\x6d\x60\x6f\xba\x22\x17\x20\x9a\x80\x5b\xb6\x45\x61\x86\xd4\x3f\x92\xcc\xf1\x90\x9e\x1f\xc7\x28\x67\x0b\x97\x09\xd4\x9b\x05\xde\x79\x41\xc8\xee\x2c\x17\x98\x15\x09\x08\xc2\xa5\xd7\x16\xa6\x22\xe0\x81\xec\x70\xbb\x77\xc2\x38\x6d\xdb\xd0\xc0\x1c\x5a\x90\x9f\xe4\x02\x3f\x5d\x56\xf9\x76\xab\xd3\x3a\x62\x26\x4d\x6b\x49\x36\x1e\x36\x73\x81\xb8\x8e\xfb\xf7\x67\xfd\xe4\x2c\x34\x1f\x08\x4b\xb3\x69\x51\x1e\xbb\x01\x64\xa8\x47\xc0\xe7\x5a\x9a\x31\x9c\x76\x93\x85\x05\xa4\x6e\xe7\x47\x89\xf2\xc2\x0d\x2f\x1c\x11\x10\x1c\x3d\xc1\xe0\xe8\x5c\x67\x7a\x95\x2c\x12\x63\x44\x31\xd8\xa7\xd0\x14\xcc\x6e\x6f\x3e\x4d\x36\xa7\x95\x4e\xd4\x15\x61\x6e\x9b\xe9\x20\xd3\xb7\x64\xa1\x01\xfd\x0a\xc8\x3c\x99\xb1\xc2\x6d\xd3\x0a\x54\x68\xab\x8f\x6d\x79\xfa\x23\xa7\xaf\xc4\x15\x6f\x2b\x31\x3d\x27\xaf\x06\x17\x71\x87\x53\x1d\x63\xfb\x10\xaa\xf3\xf0\x14\xc3\x49\x94\xae\x5c\xfe\xa2\xfe\x1f\x28\x1c\xa5\x45\x08\xc6\x13\x2d\x7c\xf8\x6f\xb0\x2f\xbf\x05\x59\x6b\xcc\xdd\xff\x37\xec\x98\xe1\x98\xa2\xa6\xb2\x67\x48\xb6\xe6\xc9\xa4\x2b\x0d\x7f\x71\x23\x4f\xb3\x2d\x60\x40\x90\x20\x76\x38\xd4\x66\xfe\xb7\x39\x88\x6c\x0d\x27\x76\xf5\x6c\xf3\x12\x03\x0c\x10\x5f\x28\x93\x82\x85\xfe\x98\x33\x9b\xd2\x8c\x60\x1b\x89\x6c\xbc\xb1\xf2\xc8\xaa\xac\x4b\xa5\xd5\xbf\x95\xe6\x84\xe2\x3f\xe6\x54\x78\x6c\x6b\xca\x18\x8d\x1f\x03\x07\xd1\x43\x0c\xc9\xe7\x42\x2f\xaa\xbc\xd8\x77\xa9\xae\x29\x76\x49\x6f\x0a\xc9\xcd\x31\x91\x84\xb1\xef\x34\xcf\xbf\x88\x85\x20\x25\x76\x3c\xd9\x76\x37\x4b\xf1\x62\xb1\x2b\x44\xd2\xcc\xd3\x26\x50\xf9\x63\xa6\xa9\xf8\xe1\x5f\x5d\xe4\xf7\xc4\x4f\xf8\xfa\x62\x7a\x79\x72\x7e\xd2\x4f\xe3\x5d\xa9\x4f\xae\x0a\xad\x2f\xa6\x97\xbf\x6f\x31\xe8\x73\xfc\x0f\x3f\xbd\x7b\x5f\xab\xff\x7c\x7b\xf6\xe6\x85\xff\xe1\x87\xfc\xb0\xae\xd1\xc5\xf4\xd2\x91\x40\x1c\x49\x56\xc0\x9f\xcf\x4f\xce\x4f\xcf\xce\x95\xfc\xe4\x4d\x91\x1b\x13\xc5\xbb\xd9\xec\xdd\x74\x34\xd1\x9e\x6b\x11\x63\x42\x17\xa8\x71\xf0\x6c\x81\x6c\x0c\xb2\x71\x01\x3e\x2b\x68\x70\xfb\xd4\xea\xe6\x0b\x2d\xec\xf9\x26\xc1\x4f\x1b\x1f\x02\x4a\x81\xeb\x8a\x79\x11\xfc\x46\x51\x9a\x5a\xd4\xb6\x23\x41\x02\xa4\xa8\xab\x83\x14\x82\x01\x27\x9b\x4b\x12\x22\x71\x6f\xa3\xc4\xb4\x6b\x8a\x03\x05\x70\xcd\x43\xbd\x09\x49\x26\x47\x81\x9b\x40\xf5\x06\xbf\x7b\x2b\xea\x8a\x06\x96\x9c\xe3\xb5\xab\xf4\x22\x37\x58\x14\xe0\xdb\xb4\x97\x6c\x7a\x78\x04\xe1\xc9\xe9\xf8\x6a\xf6\xb9\x37\x89\xbc\x78\xfb\x05\x84\xe8\xd4\xd5\x24\x8a\x60\xa5\x4c\xc6\x7f\x89\xfa\x33\xf5\xdb\x6f\x10\x81\x7f\xf5\x0a\x62\x79\xbd\xd1\x5d\x5b\x38\xdd\xc5\xca\x03\x19\x5a\xbf\xb8\x05\x0e\x6a\x0c\x17\x46\x97\x6a\x36\xc6\x70\x7f\xf3\x6b\x6a\x7c\xd5\x88\x9d\x9b\xf7\x3d\x17\x3c\x57\xa6\x17\x36\x5c\x7b\x19\xaa\xc1\x48\x8d\xc6\x10\x91\x9b\x51\x90\xb4\xad\x53\x18\xeb\x74\xe1\xd4\x8b\x08\xa2\x8d\xc3\xe8\x8f\x8d\x9f\xb6\x8f\xc8\xcd\x64\xdc\xbf\x45\xb8\x28\xc6\x09\x2f\xa8\x42\x5a\x7d\x1c\x8f\x2f\x61\x9c\xa7\xd1\xe4\xd7\x41\x3f\x9a\x7e\x50\xc3\xf1\x14\x06\x0b\x0a\xaf\x2f\x7b\xb3\x1e\xbc\x98\xe2\xaf\x1f\xcc\x7f\x5f\xdc\x4e\x07\x30\x66\x83\xd1\x2c\x9a\x4c\x6e\x6f\x66\x83\xf1\xa8\xfb\x7f\x46\x60\x96\x2a\xbf\x79\x7d\xfe\x03\xa1\xd5\x10\x98\x6f\x1e\x12\xfd\x68\xc1\x8e\x50\xf8\x62\x36\x59\x53\x27\x45\xf2\xc0\xd4\xb6\x57\xc1\x02\x08\xe4\x6f\x31\x07\x05\x84\x2e\x10\x24\x42\x9c\xda\x90\x4f\xd8\x16\x9a\xc0\x69\x16\xcf\x8d\xd9\x6c\x30\xb7\x53\xb5\xcd\x53\x63\xb5\x95\x96\x4a\x8b\x9c\x07\xbd\x14\xf4\x52\x01\xbf\xac\x7e\x5c\xb7\x18\x22\xe1\xeb\xab\xe9\xd5\xed\x70\x38\xf9\xd7\xf1\xff\x9e\xbe\x79\x77\xd6\xe0\x7f\x7a\xfb\xc2\xff\xf7\x43\x7e\xbc\x9b\xfe\xfd\xc9\xf9\xe9\xe9\xfb\x83\x72\x2e\x81\x1a\x64\x0b\x62\x3e\x63\x06\x4e\x8f\x08\xe9\x83\x5d\x75\xad\x32\x89\xf7\xe0\xa2\xef\x32\x4e\xea\x6d\x3d\x3a\x3c\x8e\xd1\xbd\xae\x0b\xc2\x3e\x6d\x1d\x94\x01\x82\x62\x8d\x37\x44\x14\x76\xec\x34\x94\x28\x85\x88\x46\xc9\xbf\x7a\xa0\xff\x8b\xfe\x84\xaf\xfb\x97\xc3\xde\x09\x33\x13\x3e\xe8\x93\xb3\xdf\x9d\x0b\xe6\xe9\xfd\x7f\xfe\xf6\xed\xf9\xdb\xba\xfd\x7f\xfa\xfe\xec\x65\xff\xff\x88\x9f\xbe\x65\x3d\xbc\x8c\xab\xd8\x96\xab\xb8\x70\xd2\x89\x72\x6b\x43\x9d\x08\x71\xa8\x53\x3c\x08\x92\xd2\x42\x44\xbe\xf9\x39\x52\x63\xea\x54\x1d\x77\xec\xa7\x3a\xdd\x10\xbf\x2f\x39\xa0\xaa\x1c\x1c\xf0\xd6\xa0\xd8\x7c\x8f\xe0\x5f\x96\xa0\x37\xdf\xbd\xc1\x2f\x16\xa8\xbe\x5e\x78\xf0\x03\x91\xf3\x11\x55\x6a\x32\xdc\x62\xf3\x11\x3a\xcd\x1f\x01\x8b\xcf\x59\x3e\x78\x98\x50\x93\x84\x54\x86\x4b\xbd\x40\x48\x6a\x6e\x4e\x3b\x4e\x58\xb6\xca\x86\x36\x62\x35\x68\x6a\x60\x48\x8d\x8b\xb7\xa0\x4f\x5e\x67\x5c\x88\x13\x22\xf8\x54\x91\x0e\x1f\x11\xa5\x3a\x4c\x61\x7a\x07\xb4\x6b\xf0\x05\xfc\xfc\x25\xa9\x45\xb8\x42\x5a\x1b\x2d\x2b\x0f\x34\xd4\xe6\x53\x97\xa6\x9d\x4b\xbf\x70\x2c\x2b\x4d\xa3\x1c\x4f\x2b\x57\xd1\xfb\xf2\xc8\x22\x29\xd0\x83\x92\xa1\x24\xbb\x4f\xf7\x81\xdf\xb3\xe3\x12\x23\xbb\xa6\xcd\xc7\xe6\x39\x9d\x1b\x4c\xf4\x02\x24\xd4\xdc\x25\x71\x49\x0e\x0d\xf2\xf2\x70\x5e\xf1\x2c\x54\x97\x7a\x05\xf9\x84\x3c\x2b\x09\xea\x7d\x16\x9e\xa9\x4e\x6f\xb9\x14\x8a\x85\xe5\x6e\xbb\x25\xe4\x1d\xbc\x18\x6e\x13\x98\xcc\xfc\x31\x63\x31\xab\x3c\xd3\x4a\xa7\xa5\x7e\x55\xc2\x87\x02\xa1\xbd\x91\x64\xf8\x69\xf3\x58\x7c\x57\xd8\x51\xf6\xbf\xeb\xc4\x30\x13\xa4\xa7\x08\x6d\x7b\xce\x55\x47\xb0\x21\xc6\xa9\xba\x75\x35\xfc\xb8\xa4\xb2\x38\xdd\x97\x49\x69\x7a\x8f\xd5\x46\x15\x33\xad\xac\x20\x61\xe9\xbe\xba\xd4\x0f\x18\x68\x12\x33\xd9\xf5\x8b\x4d\xc1\x84\xb4\xd3\x60\xfa\x12\xaa\x8b\xbd\x7a\x8c\x61\xe1\xb3\x58\x27\xeb\x2e\x3b\x74\x7a\xd0\xda\x4c\x0f\x50\x4c\xb0\x00\x7e\x36\x42\xd2\xe5\x57\xa0\x27\x20\xd3\xae\x2a\xbd\x58\x67\xc9\x7f\xee\x30\xb8\x67\x39\x7c\xf3\x15\x27\x2c\xe8\x91\xdc\x77\x7a\x1e\x6e\xfe\x4c\x2d\x93\xfb\xa4\x8a\x53\x62\xd4\xc8\x89\xcb\x15\x10\x90\x6e\x99\xc5\x73\x63\x0c\xc0\x57\x38\x22\xb8\x8d\xab\x4a\x17\xa0\xef\x5d\xe8\x6c\x09\x78\xa0\x02\xb3\x89\xc4\xd9\x00\xa5\x54\x0b\xac\xcd\x29\xdd\x11\xc0\xb8\x7e\x2d\x66\xee\x8d\xea\x98\x87\x4b\xa6\x08\xf9\x7a\x91\xf2\xf0\x15\x49\xc5\x87\x5c\xd9\x4e\x62\xc5\x5e\x2a\xfd\xb5\xea\x9a\x86\x09\x1c\x33\xe0\x89\x96\xc9\x43\xb2\xdc\xa1\x58\x3c\x27\x1b\x38\xa6\x9e\x17\xea\x3e\x06\x1e\x0d\xac\x4e\xae\x9d\x0e\x40\xec\xa0\x22\x8c\xea\x3b\x76\xa3\xa4\x62\x3a\x23\xa8\xdf\xc4\xa1\x17\x11\xfb\xa7\x12\x0e\x6e\x1c\xde\xe2\x38\xd8\xb7\x49\xae\xa2\xa8\x09\x6e\xc8\xf6\x4a\x6f\xb6\x69\xbe\xd7\x9a\x32\xe9\xa0\x3f\x83\x2a\x94\x30\x1c\xdc\x4e\x56\xdd\x45\xfc\x26\xa5\x35\xf1\xa8\x92\x65\x57\xe2\x3b\x5d\x3c\xdf\x6e\xac\x06\x2e\x7c\xba\xf5\x6a\xb0\xea\x98\xb0\xc9\x26\x70\x1a\x62\x7a\xca\xf5\xec\x9d\xea\x44\xd9\xda\x9c\xe6\x4b\x55\x9f\x6a\xa8\x63\xaa\x78\x13\xb9\x73\xf5\xc6\xaa\x66\x2e\x6d\xfe\xc4\x6c\x83\x1c\x9c\xb0\x15\x28\xff\xc3\x2b\xdd\x11\x41\x56\xed\xf1\xbc\x5b\x93\x66\xa8\x72\x7c\xf8\x5d\x43\x75\xfe\xe9\x19\x79\x6f\xda\x6d\xc6\x43\x4e\x45\x16\x57\xbb\x02\x93\x07\x44\x1f\x25\x35\x5d\xe9\x62\xf9\x9a\x94\x02\x3c\x80\x98\x38\xbe\x11\xff\xbe\x2b\x92\x72\x99\x2c\x58\x0f\xc0\xa6\x16\xcd\xfe\xc4\x47\x81\xe2\x72\x7e\x8f\x6b\x13\x51\x14\xb6\x26\x0e\x72\x4a\x96\xcd\xd3\xc1\xa8\x0b\xcd\xff\x48\x61\xf1\x22\x0d\x49\xc1\x57\xd0\x02\x64\x73\xf9\x23\x1c\x70\x8a\x2b\x9b\xa0\xbd\xa2\xfb\x45\xb2\xf1\xa0\xd0\xa5\x3d\xfd\x03\xd5\xa1\xef\xf3\x80\x1c\x53\x85\xeb\x36\x7f\xd4\x45\x40\xc9\x00\xb7\xd1\xf0\x5f\xb0\x29\x00\xb7\x4f\x21\xae\x82\xae\x16\x48\x7a\x66\xb1\x2b\x8f\x87\x25\x88\x0d\x72\x7b\x73\xbe\xb7\x8b\xdb\x3b\x91\x03\x98\x69\x40\xf4\x72\x0e\x00\xb9\x40\xb1\xdc\x3b\x53\xab\x64\x85\x1a\x59\x20\x1e\x75\xfc\xee\xf4\x4f\x5d\x9e\x83\x7c\x57\xd9\xe2\xe8\x72\x1d\x17\x78\x64\x40\xd5\x7b\x82\xf0\xde\xe3\x05\x3e\xdb\x26\xe1\x52\xff\x35\xa2\xa9\x2a\x2f\x02\x75\xbc\xec\x52\x2c\xd1\xd5\x9e\x6f\xb7\x79\x22\x53\x9a\x5c\xd0\xc1\xe4\x57\x54\xff\x84\xd0\x98\xbf\xe7\x05\x21\xba\x38\xa5\x42\xc7\x35\xed\x49\xb7\x2c\x7f\x22\x8e\xa7\xbd\xb8\x7d\x81\x91\x49\x07\x4a\x17\x31\xb2\xc1\x17\xac\x86\x55\xe8\x13\x40\x2d\xdf\xeb\xb6\x2b\xb7\xe3\xed\x94\xb0\x53\xdb\x39\xcf\xdd\xba\x7f\x56\x1d\xda\xa8\xa2\x2d\xc8\x63\x9e\x62\xed\x42\x7d\x83\x8b\x23\x0c\xb6\xaf\x77\x30\x74\x0f\x72\x0f\xe1\x26\x61\xf2\x21\x73\xe0\xde\xfa\x14\x3a\x73\x42\xe3\x79\x09\xbb\x4c\x6d\xd7\xfb\x12\x6e\x4a\x24\x40\x87\xf1\xd8\xe4\x95\x06\x0b\xb3\x2c\x71\xd9\x73\xfd\xb6\x69\x64\x44\xab\x8f\xcf\x1c\xee\x8f\xb5\x7b\x05\x41\x3b\x16\x6a\xb8\x1b\x05\x2b\x99\x30\x53\x47\x67\xb3\xe3\xe5\x8b\x78\xad\x28\x9d\xdd\xc7\xf7\x18\x7e\x8a\xbd\x73\xbb\x50\xf1\x3d\x19\xb9\x04\x40\x27\x92\xaf\x4c\x3e\x42\x70\xe7\xf5\x68\xf8\x17\x24\xf2\x9d\x2f\x16\xbb\xa2\x44\xbb\x16\xd0\x27\xf2\x24\x05\x23\xc5\xce\xdc\xcf\x40\xe2\x66\x4e\xc1\x8e\x79\x31\xff\xa3\x14\xf3\x08\x47\x25\xa8\xe7\x13\x24\x03\x86\x8c\x4f\xd3\x00\x32\x85\x29\x6e\x76\x1c\xd4\x54\x2c\xd2\xb3\x53\xf3\x4c\x58\x2e\xf2\xb8\xcf\x77\xd5\x22\xdf\x90\x6d\xb5\xab\xb6\x3b\xb6\xc5\x4d\x4b\xa9\x5a\x1c\x4c\x69\x58\x1c\x0d\x53\xc9\x19\x5b\xf4\xec\x16\x36\x2f\x77\x00\xc4\x6a\x49\xb8\x44\xe3\xe8\x80\x04\x5b\xe6\xf9\x30\x79\x26\x98\xdb\x9a\x2f\x63\x1e\x38\xd1\xab\x33\xd5\x99\xee\x12\xa4\x81\x4a\xf0\x5e\x04\xe9\x96\x09\xdc\xf6\xdc\x53\xbc\xfb\x03\x09\xf6\x11\xf5\x8e\x35\xbd\xb9\x4b\x3c\x0f\x1f\xb4\xfa\xf9\xfd\xeb\x9f\x5f\x47\x7d\x6e\x62\xb4\x2b\xf2\xad\x8e\x33\x75\x13\x17\x69\x12\x5b\x60\x97\x25\xa9\xd9\x65\x8b\x24\x35\xff\x3c\x3b\x53\xd7\xc0\x0d\x7e\xf6\xf3\xcf\xef\x99\xf7\x1f\x4b\xb0\xb6\x45\x5e\x69\xab\x52\xb7\xa4\xf6\x62\x38\xc7\x3c\x72\x89\x40\xaa\xd7\x98\x91\x5d\x10\x93\x87\x50\x3c\xa7\x5b\xe7\x3f\x77\xc9\x43\x9c\x02\x0a\x84\xcd\xb9\x3d\x26\x7c\x29\x3c\x0b\x44\x45\x62\xa4\xce\x55\x47\x98\xe0\x88\x74\xaf\x9f\x00\xb8\xa2\xa0\xe6\xc5\x8c\x0f\x56\xc9\x55\xbb\x25\xfe\x57\xa1\x1f\x12\xfd\x08\xff\x19\x2f\xe3\x6d\x85\xff\x65\x4c\xd9\xff\x0d\xff\xa9\x1f\xe2\x74\x17\xe3\xaf\x1d\x7d\x58\xeb\x9a\x49\x8c\x29\x48\xb1\xdc\xb9\x39\x54\x16\xeb\x24\xc3\x55\xb8\xde\x6d\x62\x22\xe2\x8b\xeb\xdc\x43\xf3\xbc\x5a\x8b\x2e\xbd\x51\x9d\xbb\x7c\x87\xfb\xc5\xac\xcf\x16\x0b\x0d\xd6\x32\xef\xa5\xc3\x66\x53\x28\x3d\xac\xf3\x10\x97\x0f\x4c\xee\xd0\x91\x62\xdd\x12\x82\xd0\x59\x6d\xd4\x94\xf3\xf0\xac\xce\x3c\x25\x3d\x4a\x89\xa7\xb0\x7c\x17\x6d\xe8\x85\x86\x83\x28\x59\xa9\xcc\xbf\x29\x26\x10\x4b\x16\xaa\x1a\x3f\x55\x52\x14\xfa\x21\x47\x14\xf3\xb1\xb6\x30\x23\x1b\x56\x10\x6d\x78\xd7\xb5\xa0\xb6\x5f\xc0\x72\x30\x1d\x34\x6d\xf8\x80\xe5\xd5\xf3\x6e\xeb\x59\x75\x1e\x9e\xab\x99\x57\x03\x68\x33\x92\xec\x6f\xe3\x08\x80\xe7\xcb\xfe\x00\x20\xa9\xc8\xc8\xa0\xfb\x8f\xad\x0c\x11\xfa\x30\x5b\x03\xcd\x7e\xfa\x87\x80\xb8\x88\x1d\xfb\xc4\x96\x17\x0c\x8e\x00\xe2\x6e\x8c\xa9\x45\x59\x9b\x71\x87\x41\xb5\x04\x12\xdc\xfc\x6f\x6c\xba\x53\x61\xb1\x04\x4f\x3c\x41\xb8\x4a\x88\x84\xd3\x38\xd8\x70\x15\x3d\xbf\x0e\x21\xaa\xc0\xeb\x4c\x5c\x25\x41\x1d\x1e\xf7\x0f\xac\x2f\x37\x7f\x6f\x18\x7f\x46\x31\x8c\xb2\x9d\xbc\xa8\x81\xd0\x02\x52\x9a\x6f\xe0\x1f\x92\x3e\x96\x39\xc7\xd6\x0c\x3b\xa1\x4c\x8d\xb7\xdb\xde\x00\xe5\xac\x8d\x13\x65\x34\x8f\xea\x23\x3e\xc0\xa7\x80\xa9\xdf\x9f\xf0\x0b\x1a\x56\xf3\x2a\xcf\x7a\x11\xec\x06\xe4\x9d\x00\x9c\x05\xab\x93\xeb\xac\x0b\xf9\x0a\xaf\x38\x52\xc3\xf6\xb3\xed\xe6\xab\xe6\xce\x95\xb4\xaa\x13\x49\xab\x0a\x6d\xe1\x7b\x92\xa2\x60\x5f\xab\x03\x34\x02\x82\x5a\xbf\x0e\x12\x06\xd2\x61\xb5\xde\x6f\x75\x01\xf4\x93\x2e\x47\xad\xab\x75\xbe\x94\xa8\x64\x07\xe1\x61\x36\x7b\x5f\xd1\xbf\xbd\x01\x35\x26\x0b\xb3\xc7\xef\x98\x15\x1f\x5d\x02\x1b\x8f\x40\x4a\x06\x4a\xfb\x99\x93\xdc\x1b\x5c\xf4\x21\x8a\x02\xcc\xbc\x4d\x92\x41\x8d\x01\x01\x82\xec\x98\x81\xc5\x82\xdc\x30\x4b\x4a\x08\xc2\x53\xeb\xad\x58\x74\x9f\x9b\xdc\xc0\x35\x93\xb3\x1b\xa8\x62\x54\xe8\x25\x91\x7c\x08\x8a\x02\xda\x24\xf5\xbd\x1f\xaa\xa9\xd9\xe6\x88\x77\xd0\xcb\x03\x5f\xb6\xc1\x1f\x11\x35\x75\xc8\x82\xaa\x76\xf2\xe9\x3d\x7a\x97\x66\xf3\xa1\x3d\x5a\xba\xae\x4f\xd8\xaf\x4d\xaa\x5f\xe8\xfe\xb7\xa0\x29\x98\xd3\x78\x09\xc7\x6d\x4d\x6e\xaf\x2d\xac\x7b\x5c\x76\x3f\xc0\xf5\xc8\x6b\xc3\xb9\xd1\x7e\x93\x58\x4a\x00\x31\xeb\x29\x38\x23\x66\xc5\x4b\x96\x10\xde\x0a\x76\xe5\x38\x74\x17\xa4\xa1\x98\x79\xc7\x02\xe4\xda\x22\xa5\xe6\xf0\x00\x1a\x43\x06\x6f\xe0\x41\x25\xf3\x58\xb6\x33\x60\x2c\x8b\xd5\x83\xac\xac\x39\x53\x4f\x78\x97\x3c\x8e\x62\xb6\xac\xad\x37\x49\xbb\xdb\xd8\x9d\xad\x87\xa6\x7d\xb5\xe5\x23\xc1\x03\xde\x06\x83\xb1\xe4\x80\xc9\x18\xea\xc7\xaa\x85\xe3\xc2\x0e\x22\x3b\x40\x72\x6b\xf0\x49\xdf\x12\xb6\xc6\x08\x6e\xb3\xdf\xc2\x3c\x06\xae\x42\x0c\x28\x1b\x93\xcf\xd2\x07\xff\xdd\xf8\xa8\x82\x44\xd8\xd8\x47\x0f\x49\x51\xed\x2c\xf5\xb4\x0d\xec\x99\xbf\xf2\x22\x68\xc8\x5c\x35\xea\x0f\xdc\xab\xa9\x36\x96\x0d\x30\x58\xe7\xb6\x82\x01\x9c\xdc\x05\x94\xe6\xd0\x7a\xb7\x17\x7a\x56\xd2\x8d\x6d\xcf\x08\xee\xb0\x1b\x96\xb7\x48\x2b\x29\x80\xb9\x1b\x0c\x5f\x98\xab\x43\x94\x49\x80\x93\x62\x96\xc9\xc2\x1e\xfc\x76\x1e\xf3\xa2\x3e\x8d\xd2\xd1\xe5\x8b\xe3\x6d\xd8\xd8\x21\xaf\xd4\x84\xf1\x03\xb1\x0c\x8f\xbf\x0d\xcf\x10\xf0\x5e\x4f\x2e\xd4\xc8\xe3\xea\x9b\x0e\xc0\xff\x9c\x48\x59\xca\xe2\x96\x05\xc8\x6f\x55\xc4\xa5\x88\x53\xfd\x8b\x0d\xbf\xa0\x45\x23\x03\x76\x8f\x71\xe9\x05\x35\x29\xb0\x0b\xee\x28\x1e\x41\xe6\x13\x56\x63\x04\xae\x12\x58\xa8\x62\x71\xda\x0a\x04\x3e\x24\xed\xab\xda\xe6\xbc\x66\xc4\xb9\xb1\x74\xa6\x8e\x2d\xe6\x79\x48\xf2\x34\x26\xf5\xb1\x6d\x91\x3c\xc4\x8b\x3d\xc5\x30\x57\x78\x34\xc5\x58\xdd\xe6\x16\x09\xbc\xb1\x8a\xbf\x68\x5b\xa7\xd6\x5c\x0f\xd6\xce\x0c\xd5\x8c\x2a\x74\x92\x3c\xa3\x29\x79\x17\x9e\x01\x8c\x8e\xef\xdd\xa7\xea\x7b\xa0\x12\x41\x14\xf9\x50\xde\xa4\x70\x23\x62\x6f\x09\xb9\x7c\xe4\x08\x71\x31\x83\x31\x8e\xbf\xe0\x1c\xb8\xf2\x94\x15\x1d\x88\x08\x03\x4b\xf7\x50\xd2\x54\xaf\x9b\xfa\xf6\xd4\x96\xcd\xeb\x50\xb4\xe6\x8f\x2e\x95\x7a\x76\xfc\xc4\xd0\xc1\x99\x85\x87\x13\x17\x46\x4d\x90\xe1\x2f\x38\x74\x84\xa2\x7f\x6f\xeb\x9e\x30\x85\x24\x76\xb2\xa5\x7c\x78\x26\xb3\xb8\x3f\x9c\xcf\x94\x85\x4f\xad\x61\x67\xc0\x3f\x52\x60\x1b\x46\xa1\x72\x0b\x0a\xe7\xf6\x60\x75\x14\xac\xb5\x73\xb6\x2f\x6c\xf9\x62\x6b\xd9\x62\x5b\x7a\xe1\x80\x09\x6f\x57\xd6\xc1\x02\x47\xbf\xa0\xd1\x52\x90\xf2\x17\xbd\x68\x44\xcc\xbc\x16\x65\xa9\x51\x43\x71\x5e\xb8\x0c\x6f\x0b\x11\x95\x18\xf0\xad\xf1\xcb\xf3\x9d\xac\xa4\x20\x37\xa4\xbe\x31\xec\xe4\xb2\x81\xf5\x0d\xbb\xed\xbb\x4a\x16\x79\xc7\xbf\x0f\xd5\xa5\x43\x60\xe6\x2b\xf5\xd9\x27\xd1\x1b\xda\xfc\x9b\xf9\xe3\x90\xc9\x7f\x68\xba\xde\x9b\xd3\xfa\x7b\x2b\xc5\x67\x9f\x22\x40\xf4\x49\x30\x5d\x34\xfa\xd4\x1b\xf5\xa3\x4b\xf8\x43\xf7\xdf\x93\x1f\xc1\x8e\xe9\xb9\xad\x8e\xbf\x1b\xdf\xda\xba\x78\x18\x32\x1a\x95\x97\xca\xf8\x3f\xa4\x32\x1e\x86\xf8\x47\x95\xc5\xf3\x0e\xfc\x29\x54\xd7\x49\xb9\xd0\x69\x1a\x67\x3a\xdf\xb1\x21\xf4\x53\x78\x26\xaf\x00\x88\xa9\x4b\xce\x0c\xbc\x4a\x1a\xa5\x86\x5e\xfd\x30\xf1\x83\x0b\x76\x09\x26\x33\x63\x1d\xed\x27\x0c\x39\x3c\xf9\xfc\xb4\xa9\x78\x1a\x19\x1f\x01\x04\x46\x45\xac\x34\xe0\x5c\xd0\x9e\x2a\x88\x80\x23\xdd\xbc\x3b\xf4\xaf\x34\x63\x92\xc8\x9b\xb5\xac\xf4\xb6\x24\x3b\x2d\x69\x39\xe2\x57\xbb\x74\x95\xa4\x29\x16\x90\xd6\x28\xda\xea\x1d\x7f\xba\xd3\x87\xfb\xeb\xdc\xc0\x06\xff\xf7\x4f\xe4\x8c\x99\x4e\xd5\x8d\xd9\x5a\xae\x9c\x98\xc6\x64\xb2\x3c\xc6\x90\x04\x46\x0d\x60\x04\x40\x41\x3f\xa7\x6b\x24\x78\x4a\x9f\x1b\x82\x63\xa8\x5f\x5b\xc4\xb6\x9a\x01\xa2\xfe\x05\xba\xb5\xeb\x3c\x5d\xb2\x57\xeb\xda\xfb\xa6\x6e\xdf\x1b\x23\xd1\x98\xa9\x5e\x0d\x62\xa1\x37\x7a\x69\xc6\x70\xb7\xcd\xb3\x76\x75\x9f\x5a\xe1\x2d\xa1\x5f\x18\xcb\x9f\x14\x4c\x8e\x67\xfa\x68\xfe\x0d\x7c\xab\x7a\x01\x04\x41\x01\xc6\xc6\xcb\x92\x31\xc5\x58\x28\x5b\xba\x66\xbe\x85\xc2\x8d\x46\xf0\x8f\x43\x07\xdc\x58\x68\xcf\x57\xf3\x1a\x3b\x63\x87\x96\x60\x9b\x41\x4c\x39\x31\x67\xb2\xc0\xc0\xf1\x15\xdb\x1a\x68\x66\x43\x64\xb1\xce\x73\x0c\x2b\x3f\x7b\x23\xa3\xd5\x56\x26\x9b\x24\x8d\x8b\x94\x03\x58\xb0\xfc\x4c\x3f\xa0\x4b\x31\x37\xb1\xd6\x1b\x61\x27\xb8\xbe\x1d\xe8\x0a\xea\x2d\x79\xb3\xfd\x0e\x86\xf1\x59\x94\x9b\xf1\x5d\xef\x8b\x7c\xb7\xa5\xf6\xcf\x80\x79\x3f\xdb\x7d\x6d\xa9\x84\x2e\xa9\x3e\xb9\x69\x36\x1f\x77\xa8\x76\xb9\xd3\x3d\x54\x9e\xfd\x5c\x51\x36\xa8\xd7\xb4\xd4\x89\xb7\x40\xb3\xc0\x1f\xe4\xb2\xe0\xef\xac\x75\xe6\xf8\x49\xab\x51\xd5\xdc\xed\x6d\xa4\xa0\xdf\x5c\xe3\x8c\x5b\x12\x35\x86\xd2\xbd\x7b\xba\xb0\x23\x5b\x5f\x50\x23\xa5\xe5\x77\xd9\x62\x67\xf6\xdb\xb8\x0e\xfd\xdf\x0a\x2a\x1c\xbe\x9e\x7e\x1c\x9c\x5c\xfc\x01\xa8\x5f\xf7\xf3\x8c\xfe\xe3\xf9\xdb\xd3\x26\xfe\xff\xfc\xdd\x0b\xfe\xf7\x47\xfc\x4c\x3f\x0e\xa0\xac\xc9\x15\x73\x71\x49\xed\xc5\xd1\xb1\x44\xe9\x9e\xbd\x3e\x7f\xf7\xfa\xfc\xf4\xf4\xb4\xcb\x32\x8a\x0e\x7b\x19\xd6\xc0\x97\x1c\x42\xc5\x42\x6e\xbc\x77\xe0\xf8\xe1\xbc\xa4\xa7\x6d\x82\x79\x13\xfa\x84\x42\x81\x35\x92\xd2\x37\xdb\x72\x64\x4b\x80\xc7\x2c\x30\x26\x6a\x93\xcd\x27\xd6\x3a\x06\x13\xea\xc9\x57\x63\x05\x35\x23\x32\x7b\x37\x03\x97\x23\xf5\x80\x8d\xc4\x01\xb6\x41\x18\x0a\x09\x6b\x29\x5d\x56\xb1\x38\x2e\xcc\xa8\x21\x61\xe7\xdf\x77\x99\x60\xec\x34\xad\xf1\x5a\xe9\x81\x09\xfb\xa4\xc8\x52\x97\x9f\xf2\xfb\x65\xe5\xb3\x16\x2e\x40\x58\xb5\xab\xcf\xf8\x5f\x34\xe7\xef\x75\x5d\xa2\xca\x93\xf4\x62\x5b\x93\x10\x07\xbe\x30\x17\x43\xfd\x3e\x11\x23\x90\xa7\x48\xc8\x60\x15\x04\xa0\x92\x28\x0b\x40\xa1\x4b\x95\x64\xdb\x1d\xf2\xd0\x1b\x43\x44\xdb\x5f\x94\x55\x5e\x58\xda\x6e\xc4\x44\x20\x5f\x9b\x4d\xad\x93\xc5\x46\x41\xec\x92\x70\x17\x1e\x3c\x6f\x18\x17\xf7\xba\x00\x79\x23\xdb\x20\x8c\x10\xe3\xa5\x40\x11\xed\x52\xc9\xc1\x85\xdb\xaf\xd6\x47\x9c\x20\xa8\xf5\x34\xb6\xe1\xbd\xf9\x78\xa6\x6b\x58\x6d\xbe\x1d\x6b\x31\x6e\x00\xdc\x0d\xad\x7a\x22\x37\x64\x1d\x3f\x78\x92\x27\x56\x22\xc3\xda\x9b\x9b\xf8\xab\xa4\x9e\xe2\x22\x79\x07\xbc\x92\xf2\x40\x35\x75\x51\x14\xdb\x40\x91\x35\xba\xbb\x8c\xf1\x8b\xb2\x21\x4b\x34\x59\xc1\xe2\xc3\xd8\xa1\x80\xb4\x2f\xf2\xec\x41\xef\xe9\xde\x4d\x32\x0f\x9f\x55\x13\x11\x43\x1c\x1d\x95\xac\x79\xe8\x29\x6f\x25\xc9\xb5\x20\xf4\xf6\x2c\x4e\x12\x01\xf1\xa6\xad\x2c\x37\x77\x70\x89\xbe\xa6\x5c\x87\x7c\x0c\x70\x06\x08\xe1\x3e\x1b\xc9\xf1\xd7\x33\x89\x62\x7b\x33\x0d\x22\x2d\xa9\x86\x98\x12\x24\x46\x4a\x5d\x10\xad\x0f\x24\xd8\x02\x15\x7b\x0f\x51\x49\x29\xb2\xa1\xbd\x50\xf5\x5a\xba\x24\x05\xfb\x30\xfd\x27\xb3\x7f\xbf\x6b\x97\x5c\x5b\x2e\xb0\x2d\x56\x5b\xb0\xa9\x23\xb8\x8d\x8b\xaa\x7d\x5c\x61\x13\x3d\xf5\x7c\x80\x55\xe1\x99\xe8\x41\x46\x0f\x9c\xad\xa0\xe0\xef\x46\x39\xc0\x82\x44\xd2\xc2\x99\xb3\x0b\xd6\xe0\x5a\x6c\xdf\x3b\x67\xa7\xaa\xe3\x3d\xde\xde\x02\xa2\xfe\xda\x42\xdd\x25\x3f\x19\xfc\xc5\xe2\xc5\x3d\x86\x7a\xac\xbb\x74\xdf\xa7\xf3\x5e\x36\xd2\x71\x5e\xc4\xa5\xdf\x3f\xa2\x74\xdc\x2e\xe3\x8a\x1c\x2d\x60\x8f\x64\x70\x22\x66\xbd\xb6\x7a\x01\xe3\x68\x6c\xcd\x0a\x39\xe7\x7c\xb8\x55\x8b\xd4\xa8\x84\xdc\x41\x02\x1b\x53\x9d\xe4\xe8\x09\x99\x24\x19\xa4\x66\xa6\x61\xe3\x60\x27\x56\x51\xdf\xed\x6a\x3e\x9a\x02\x6f\x7c\xf1\xf9\xab\x1d\x6c\x36\xcf\x7e\x16\x9f\x49\xca\x72\xd7\xe0\x63\xfb\x33\x62\x0b\x45\xd3\x00\x57\x2a\xfb\xe3\x65\x7e\xa9\xf5\x7c\xde\x02\xcc\xd6\xdc\x2d\x65\x0b\xac\x37\x29\x9f\x40\xf5\x0a\x42\x99\xab\x9a\xba\xe6\x13\x78\x5e\x84\x9a\x52\x23\x9e\x00\xf7\x4a\x68\x2f\x1c\xc0\xee\xd7\x88\xe5\xf5\x41\xbc\x84\xc7\xf6\xa0\xb3\xad\xb8\xdc\x02\x71\x7b\x4f\xe2\x73\xbf\x01\x8b\xeb\x01\xd0\xa6\x1f\xad\xf9\x31\x4d\xd2\x64\x91\x67\xea\x63\x11\x6f\xd7\xc9\xa2\xa4\x22\x4b\x64\x0c\xe0\x79\x04\x08\x08\x2c\x93\x89\x48\x15\x86\x02\x75\xe5\x7d\x32\xac\x83\xb0\x84\x7d\x55\x5f\x22\x9c\xb4\x90\xe4\xe7\xed\x98\x16\x26\x62\xe6\x7a\x9f\x25\xab\x55\x1e\x94\x0f\x73\x31\x03\x63\x14\xac\x31\x95\x4e\x9b\xb7\xb6\x21\x8d\x45\x75\x58\x7a\xf0\x80\xd6\x60\x0d\xf3\xe5\x04\x2c\x31\xd5\xef\xe1\x15\x7e\x01\x4d\x8e\x1a\x80\x8a\x87\x81\xa9\x91\xa6\x1f\x07\x41\x4d\xf5\x71\x29\x54\x15\x88\xad\x7f\xe9\x64\x17\x51\xa0\x15\xc5\x66\xe3\x6c\x59\x0f\x34\xb9\x48\x59\xc0\xc2\x90\x9c\x16\x22\xad\xd8\xc6\x0d\x09\x02\xca\x7c\xa9\x94\xf6\xcc\x8f\x95\xb0\x84\x3e\x38\xd5\x0f\x42\xef\x64\xfb\x9a\xd6\x73\xa3\x5f\x78\xcc\x6d\xe6\xf9\x52\x10\xd1\xd5\x26\xc1\x8a\x32\x02\x66\x63\x13\x2f\x59\x9f\x91\x40\x14\x56\xa9\x11\xc1\x9e\x2b\x14\x50\x04\x35\xe8\xc0\x63\x92\x00\x50\x81\xe9\xb0\xa8\x7c\xf7\xed\x62\x39\xbd\x64\x47\x3e\x9b\x57\xe4\x25\x3b\xdf\xdb\xac\x2b\x47\x4e\xb9\xba\x7e\x95\xa3\x38\x4c\x92\x1b\xdb\x2e\xae\xef\x93\x73\xb9\x7f\x54\x9e\x91\x18\xa2\xbd\xb3\x5a\xf5\xc9\xfc\xcd\xe3\xb0\x91\x67\x66\x02\x00\x09\xd6\x14\x8e\xa3\xfc\xd3\x2f\xea\xac\x2b\x24\x5e\x80\x7b\xaf\x3e\x14\x1f\x54\x96\x17\xea\xbc\x0b\x43\x29\x39\xf3\x4b\x21\x29\x60\xd6\x6e\x9b\x92\x71\x6d\x02\xcd\xa1\xc6\x5a\x30\xcf\xfa\x0b\x07\x18\x41\xd9\xfe\x97\x28\xb9\x51\x6e\x07\xff\x4a\x7c\x44\x0d\x36\x54\x59\x27\xc9\xec\x1b\xd4\x8e\x02\x8d\x67\x8e\x2a\x56\x44\x17\x61\xe4\x2a\x07\x44\x9c\x7b\x94\xf9\x8e\x7d\x0b\x4f\x6e\x7a\x9f\x17\x49\xb5\xde\x94\x4f\xaf\x63\xd7\xf0\xb7\x35\x4f\x4a\x9e\x79\xbd\x9b\x01\x20\x72\x39\x7d\xec\x7f\x12\x5e\x9b\xa5\xfb\x3a\x9a\xc4\x9b\xfd\x6e\x6d\xb7\xc3\x69\xdf\x7c\xce\x6a\x67\x4c\x08\xb6\x95\x2a\x47\x3e\x6a\x9a\x10\x97\x2c\x9f\x23\xe4\x73\x93\x4c\x3d\xe5\xca\x36\x7d\xe4\x66\xff\xdf\x34\xe8\x66\x78\x58\x7a\xe6\x2f\x15\xee\x11\x33\xb4\xf8\xf8\xd7\x7d\x42\xcc\xd9\xad\x30\x73\xbe\xb7\x07\xac\xb4\x66\x55\x80\x35\xb2\x81\x15\xe5\x59\xe4\x59\xb9\x4d\x16\x3b\x4c\xc1\x5a\x70\x99\xd3\x25\x59\x72\x9c\x98\xfd\x96\xa2\x49\xca\x23\xed\x4e\xb4\x13\x1a\x1f\x41\x8c\xb9\x74\x02\x32\xcf\x16\xb4\x8a\x77\xdc\x7e\x94\x9f\xb3\x23\x86\xe2\x24\xc2\xc8\x8e\x2d\xd6\x4d\xc5\x08\x17\x04\x15\x04\xb3\x05\x57\x89\x4e\x97\x1f\xe0\x5b\x10\x73\x8f\x89\x44\xdd\x7f\x01\xf4\xc7\xe7\x62\xe3\xb5\x56\x7b\x37\x13\xfa\xfb\x34\x21\x60\x7b\xa6\x20\xcb\x0c\xc5\x1a\xba\xc0\xba\x8e\x16\xde\x57\x89\x10\xf0\x06\xc1\x2c\x35\x6b\x22\xa3\x2f\xf1\xe4\x22\x22\xc5\x7f\xb8\xb2\xd3\x3d\x35\xb1\x6c\x5d\x51\xbe\x3e\xe0\xef\x31\xb1\x47\xce\xe7\x49\x2b\x5d\x64\x78\x9b\xda\xb5\x77\xe3\xc1\xda\x3c\x4e\xfb\x56\xb7\xe3\x80\xff\x2e\x29\x22\x01\xf0\xea\x73\x57\xca\x35\x43\xb7\x97\x98\x64\x47\xd6\x57\x6f\x3d\x9d\x05\xc7\x67\x5d\xef\x6d\x1f\xd4\xf1\x79\x57\x00\x69\x71\x43\x13\xf2\xd0\xbf\xc0\x76\x88\x38\x86\x13\x06\xc5\x3c\x00\x1a\x8a\x3b\xdb\x1c\x8f\x96\xa3\x5a\xf2\xd0\x82\x04\xfd\x6a\xef\xaf\x8a\x1c\x25\x1a\xf1\xa5\x58\x63\x59\x0b\x02\x31\x6b\xc6\x52\x17\xf9\xbd\x97\x0f\x31\xd7\xd9\xc7\x81\x5d\x5b\x1f\x6c\xa1\xe2\x9b\xae\x0f\x08\x96\x6f\x84\x7c\x0d\x55\x46\x58\x9f\x18\x87\xdf\xe1\x25\xe9\xaa\x93\x53\xd1\xa4\xed\xf2\x41\x95\x8e\xf6\x2f\x29\x05\x7a\xdb\xac\x28\x4b\x03\xfa\x36\x50\xef\x03\xf5\x53\xa0\xce\x4e\x03\x75\x46\x62\x93\x67\x6f\x02\x2e\x96\x81\x07\xb1\xb8\x97\x24\xde\x85\x30\xca\x56\x17\xa5\x16\xf2\xbe\x94\x52\xf1\xd4\xc9\x52\x5e\x82\x1e\xd7\x37\x00\xdf\x21\x0f\xca\xc0\x60\x3b\x38\x32\x2d\x73\x60\xe5\x99\xcd\x03\xa5\x5a\x49\xa5\xe2\x79\x99\xa7\xbb\x4a\x9b\x1b\x21\x35\x67\x02\x86\xd2\x70\x32\xa0\xfe\x1f\x9a\x43\x32\x51\x09\xda\x58\xf5\xc1\xc4\xeb\x09\xc6\xba\x46\x9c\x0c\xe6\x63\x60\xcb\xbb\xd1\xf4\xe3\xdd\xd6\x0f\x59\x68\xa6\xda\x87\x2d\xca\xbb\x96\x27\xda\xe9\x38\x19\xc3\x91\xd1\xa9\x4e\x9a\x2a\xc9\x16\xbb\xa2\x70\xa1\xd0\x9a\x74\xaa\x95\xa8\x89\xc5\xde\xf6\x27\xdb\xbd\x1c\x35\x5d\x58\x6f\x4c\xc0\xe3\x48\x96\x5b\xde\xd9\x22\xc6\xd5\xd0\x13\x6e\xa0\x75\x76\x55\xbe\x89\x2b\x72\xe0\x13\x39\x9b\x88\x28\x22\xef\xd6\x7c\x83\x02\x65\xa8\x1b\x69\xa9\xc2\x2d\x58\x8d\x10\x48\x24\xcd\xf6\xe6\x54\x2d\xe3\xbd\x8b\x9d\xc2\x49\x2b\xb5\xdc\xf3\xe6\x05\xc5\x35\x7b\xe8\x19\x09\x7c\x12\x42\x51\x09\xa5\x65\xdb\xe3\x99\x6d\x72\x51\xc5\xf3\x52\xc2\xd8\x04\x39\xbe\xbf\x8a\x5d\x73\x42\x79\xe4\x9b\x66\x04\xf4\x8d\xa4\xc0\x82\x61\x1d\x30\xf1\xdc\x06\x04\x51\x33\xd2\xc1\x54\x73\xbd\xcf\x69\xcc\x9f\x6c\x93\xd7\x05\x2b\xfe\x92\xab\x19\x8b\xe6\xa9\x71\xa1\xc6\xb0\x4d\xb0\xa0\xa1\x36\xb1\x16\x7b\x79\x4f\x4e\xae\xcd\xd3\x42\x35\x4e\xd2\xc5\xf5\x64\x39\xb6\xc0\x23\xb2\xa6\xb4\x1f\xa6\xca\xa0\xc8\x02\x80\x19\x76\x7f\xb7\xf0\x01\xb7\xb3\xee\xba\xa5\x14\x17\x09\xba\x19\xcf\x93\xfb\x36\xe4\xeb\xea\x8d\xfa\x80\x16\x39\x4c\xad\x19\x11\xa8\x79\x10\x92\x82\x58\xde\x5b\x40\x58\x1d\xfe\xfd\xb8\x8e\xab\x32\x47\x88\xa1\x90\x50\xa5\x43\xdc\x11\x36\x78\xea\x52\x18\x7f\x5e\xd5\xa2\x2a\x3a\x5b\xe6\x45\x69\xab\x7a\xb7\x45\xbe\xc9\x5d\x76\x1f\x90\xea\x25\x7a\xb3\x8c\xb4\x6d\x0e\x29\xbf\x18\x51\x87\x8f\x45\x52\x55\x3a\x93\xd4\x4d\x78\x89\x7c\x20\xdf\x83\xbb\x0a\xaa\xae\x18\x07\xf5\x22\x22\x2d\x4e\x0b\x9e\x75\x34\x6d\x15\x98\x0f\x55\xb2\x01\x71\xa7\x0d\xc4\x3e\x61\x88\xcd\x39\xd6\x42\xa4\xec\xdb\x29\xcf\xd2\x29\xcb\x03\xd4\x71\x43\xa1\x5c\x4b\xbf\x66\x56\x0c\xe3\xc7\xf2\x83\x1a\xe5\xd9\xc9\xc0\x53\x32\x6b\x95\x2c\x2f\xb8\xda\xc3\x6a\x65\x3c\x03\x15\x0a\x54\xa1\xef\x77\x96\x98\x02\xc1\x3c\xc6\xf8\xc0\x02\x9e\x25\x08\x20\xb6\x88\xc2\x49\x2b\x0b\x3d\xec\xa4\xd5\xc4\x7a\x5a\x4d\x27\x80\xef\x23\x7a\xc8\xb4\xe4\x84\xff\x93\x24\x77\xf3\xc2\x56\xf0\x7f\x7b\x6b\x69\x7a\x6f\xc3\x69\x48\xf9\x15\x57\x19\x8a\x64\x16\xf9\x2e\xab\x8a\x44\x97\x61\xcd\x30\x33\x8d\x13\xc6\x59\xf3\xec\x04\x3d\x55\x5c\xf2\x8f\xf1\x5e\x68\x55\x1c\xcb\xca\xfe\x85\x23\xb0\x4e\xd2\x7d\x57\xde\x17\x02\x9c\xca\xaa\x9e\xa2\x8c\x0e\x77\x66\xa9\x17\x85\xae\x6a\x7b\xf3\xdb\x65\xfc\xbf\x24\xd9\xb2\xab\x3c\x4d\xff\x26\xd6\x87\x1c\x74\xef\x0a\x2a\x3c\xa8\x3e\x42\xe0\x59\x41\x94\x56\x73\x60\x75\x90\x21\xc9\x12\x57\xa6\x8f\x7b\x47\xea\x11\x88\x40\x50\x8b\x7a\x0b\x6a\xbe\x39\x2e\x1f\xaf\x86\x9a\x0a\xea\x58\x4c\xa6\x4f\xfa\x7f\x2b\xe5\x2f\x7b\xcf\x20\x32\xa6\x4b\x66\x7b\x2e\x63\x87\x08\xdf\xb5\x56\x8d\x58\xa2\x0d\x33\x9a\xac\xcd\x15\xa5\x50\x11\x7e\xf3\xb8\xce\xa9\x74\x1b\x58\xa2\xf1\xf6\xb6\xd3\x0d\xb7\x91\x7b\xdb\xab\xf2\xc9\x99\x91\x56\x18\x98\x07\x75\x2d\x41\x63\xbc\x78\x4a\x81\x30\x08\x7f\x0e\x99\x9f\xca\xba\x9b\xd6\x33\x31\xdf\x80\x82\x21\x02\xba\x80\xd8\x82\xab\x54\x6e\x62\x6d\xec\x77\x9b\xd2\x0b\x81\xb2\x76\xc5\xf3\x48\x9b\x71\xb6\xa8\x6d\x8c\x75\x5c\xe2\x04\x3a\x24\x0b\xd7\xf2\x09\x82\xed\x1a\xb4\xa6\xdd\x33\x6a\x0f\xea\x0a\x1b\x3d\x70\xb0\x72\x32\x82\x93\xaa\x1d\xcc\x13\x5b\x84\x0d\x84\xa3\x1c\xba\xcb\x7c\x89\xc4\xf6\x1a\xae\xd4\x77\xe3\x75\xe0\x36\x78\x32\xc8\x6d\x7d\x06\x74\x21\xde\x36\x0d\x17\xf0\xbe\x78\x3e\xad\x96\x85\x8d\x41\x7a\xd1\x29\xaf\xcd\x2d\x3c\xf7\x32\xe9\xf5\x73\x5d\xf9\x8b\x65\xf0\x42\xd5\x1f\xff\x1a\x4d\xa2\x4b\xd5\x1f\x5f\xfa\xac\xb9\x88\xbf\x0e\x3b\xaa\x37\x1c\x5a\x20\x75\x6f\x74\xd9\xc6\x71\x6b\x7e\x2d\x70\xd2\x3e\x75\x6d\xf0\x2d\x98\xeb\xe7\x1f\xda\xe4\xd1\x0d\xd4\xb4\x37\x1b\x4c\xaf\x7a\xfd\xd9\x78\x72\xa7\xfe\xe3\xb6\x87\xbf\x7d\x0e\x77\x8d\xd2\x65\x75\x08\x37\x6e\xa4\xde\x74\x7a\x7b\x1d\x4d\xd5\x68\xac\x26\x83\xe9\x5f\x55\x6f\xca\x1a\x67\xf4\x78\xf8\xee\x4d\x34\xb9\x1a\x4f\xae\x7b\x80\x44\x46\xf0\x2f\x83\x55\x42\x35\xfd\x34\xbe\x1d\x5e\x7a\xbf\x84\x51\x8d\xd4\x65\x74\x15\xf5\x67\x83\x5f\x23\x06\x2a\x4f\xa2\xe9\x0d\x00\xb5\x6b\xaf\xee\x8f\xa7\x40\xe5\xeb\x63\xbc\x91\x2b\x17\x86\x71\x12\xdd\xf4\x06\x13\xc4\x6f\x4f\x26\xe6\xa1\xe3\x51\x88\xb8\xfb\xf6\x89\x36\x53\xdb\x1b\xa9\x68\x3a\x25\xa4\xb7\x19\x16\x4b\x4b\x4b\x00\x1b\x50\x48\xbc\x75\x08\xe8\xfa\xda\xe8\xdd\xce\x3e\x8d\x27\x83\xff\x4b\xa2\xa1\xb9\x1a\x60\x7a\x7b\x01\x04\xc4\x30\x5a\x5e\x33\x60\x05\x9e\x9d\x86\x12\x41\x2e\x11\xe1\xa1\xc2\x07\x99\x7e\x0f\x26\xfd\xdb\xeb\xe9\xcc\x0c\xec\x14\x70\xf0\xc3\xe8\x63\x6f\x48\x38\x72\x07\x1d\xaf\x01\xc3\xdb\x97\x95\x8f\x16\xaf\x03\xcc\xbb\x81\x40\x9f\x4b\x34\x79\x40\x40\x7b\x33\x25\x04\xac\x37\xff\x89\x43\x34\x9e\x7c\x13\xa3\xb2\xc5\xda\x4b\x00\xfe\x41\xb0\x3d\x8f\xf6\xa7\x9e\x69\x0d\x20\xe3\x9f\xec\x18\x7f\xcf\xbc\x9f\x59\x93\x3f\x8e\xc7\x97\x9f\x07\xc3\x61\xa0\x3e\x8f\x27\x7f\x55\xd3\xd9\xf8\xe6\xa6\xf7\x31\x0a\xec\x07\x90\x51\xb9\x3f\xbe\xbe\xb9\x35\xaf\xb8\xea\x0d\x86\xb7\x13\x18\x99\xeb\xde\xf0\xea\x76\xd4\xc7\x67\x53\x97\x80\x11\x7b\x38\xc4\x51\xf1\x24\xb7\xb9\xcd\xf8\xea\x68\xea\xd0\xf0\x80\x77\x37\xcb\xea\x4e\x96\x2a\x5c\x44\xe6\xaf\x23\xb3\x5d\xbe\x0d\x29\xcf\x2b\xb2\x75\xad\xd0\x93\x47\xe3\x19\xe8\x0b\xde\x99\xe5\xe6\x6f\x92\xcb\xa8\x37\xfb\x04\xcc\xd1\xd1\x64\x3a\x1e\xf5\x86\x6a\x30\xfa\xcb\xed\x04\xf6\xda\xed\x70\x36\x18\x7d\x54\x57\x93\xf1\x35\x45\x99\xc4\x1a\xf1\xa5\x0c\x7d\xf5\x42\xb3\x7f\x3f\x0d\x2e\x06\xb3\x29\xb6\xd5\xb5\x2e\x54\xd3\xf1\x75\xa4\xfe\x72\x3b\x19\x4c\x2f\x07\x7d\x3c\xaa\x2e\xc7\xd8\xc2\xe1\x70\xfc\x99\x1e\xda\x1f\xde\x4e\xa1\x33\x93\x5a\xd7\xdc\x0a\x39\xb8\x40\x02\x35\x35\x6d\xeb\xcd\xc4\x73\xcc\x04\x89\x07\x5d\xf7\xee\xfc\x41\xb1\x2a\x8b\xb8\xfb\xce\x0e\xc4\x59\x2c\xa3\xe2\x21\x5d\x4e\xd6\x5f\x45\x29\xeb\xc3\xac\x55\xc6\x1f\xa3\x70\xd1\xae\x4a\x52\x66\xf8\x6a\x95\xd7\xb4\x96\x4b\xcd\x14\x42\x19\xda\x40\xc4\x7a\xcc\x35\x09\x50\xf7\x75\x5c\x6c\x52\x5d\x1e\xca\x4d\xb3\x20\xfd\xb2\xa1\xd8\x1d\xb8\x18\x91\x95\xee\x0e\x58\xaa\xb3\x60\x81\x62\xcf\x18\x87\x8b\x3b\xde\x33\x03\x86\x28\x58\x88\xab\x2a\x2f\x32\xbd\x2f\xd5\x4a\xeb\xd2\x09\x7c\x53\xe7\x65\x48\x12\x72\x94\xbe\x64\x80\x2c\xc5\x3e\xa8\x76\x56\xc7\x8c\xd1\xa3\x9f\xb6\xc9\x51\x76\x46\x46\xdd\x70\xd6\xcf\x43\xf4\x7c\x3e\x3a\xcf\x27\xca\x96\xea\xb6\xd4\xa4\xda\xde\x00\x2e\xc5\xaa\x23\xd4\x96\x93\x4a\x6f\x3a\x8a\x34\xc6\x48\xc2\x5a\xfe\xbd\x01\x8f\xe9\x80\x4a\xdb\xce\xc6\x3d\x31\x01\xb0\xb2\xcc\xe4\xe0\x82\xbf\xfd\xb3\xeb\x2c\xc2\x6c\xae\xf4\x12\xb2\x0c\x13\xe7\xd0\x59\x87\xf2\x60\x07\x18\x77\x86\x46\x93\xf0\xab\x6a\x1a\x39\x75\x60\x01\x84\xd0\x3c\x2b\xed\x30\xd0\xee\xec\x4d\xad\x54\xa7\x16\x28\xf2\x8a\x94\xa9\x66\x5d\x57\x5a\x30\x97\x2d\xf2\x6c\xa1\x0b\xab\x6b\x6b\xf6\x07\xbf\x7d\x03\xc4\x90\xe1\x61\x7d\x4c\x07\x99\x51\x6b\x9d\xb2\x74\x92\xa7\x8e\xf9\x0d\x92\x93\x65\x0e\x2c\xd4\xb9\x8a\x17\xeb\x44\xa3\x2a\x59\xa6\xa1\x58\x21\x2e\x9d\x48\x0e\x64\x1f\x40\x1d\x08\xd5\xe8\x8d\x3b\xbd\xc8\xb3\x7c\x93\x2c\x38\xfc\x46\xb8\x7e\x06\xbc\x8b\xb7\xda\x48\xa8\xaf\xad\x29\xfa\x00\x1b\xbc\x1e\xd0\xab\x8d\xa6\x6d\xbb\x44\x42\x52\xe2\xbd\xac\x8a\x1d\xe5\x74\x80\xb6\xd5\x4f\xb5\x48\xca\xc0\xdb\x0c\x02\x0a\xd3\xca\x22\xa9\x10\x49\x1f\x57\xb0\xd6\xfa\x71\x9a\xac\xf2\x22\x4b\x62\xca\x59\x82\x0b\x6b\x86\x87\xe7\xac\x34\x9e\x31\xec\x8a\x24\x03\xa2\x18\x1e\x79\x82\x48\xe8\x25\xb8\xce\x85\xa6\x50\x4a\x92\xc9\x87\xce\x75\xf5\x68\x3c\x20\xf1\xab\x42\x97\x90\x78\x29\x31\x30\x2b\x0a\x34\x7d\x51\xc1\xb6\xa1\xa8\x2d\x55\x07\x2c\xf1\x98\x11\x99\x5c\x9f\xf6\x51\x3f\xdf\x15\x95\x1d\x90\x51\x0e\xa4\x3a\x19\xe9\xa4\x81\x7a\xba\x6c\xde\x71\x5e\xd8\x30\xae\xbf\x36\x1b\xf4\x8b\xe8\x95\xc2\xd3\x03\x5a\xf1\xf2\x4d\x2d\x83\xdc\x25\xaa\xf4\x07\x6d\x1c\x35\x44\x93\xd9\x4e\x80\x1f\xad\xa6\x71\x56\xc5\xc6\xc7\x2f\x62\xe0\xe9\x32\x27\xb5\x7b\x40\x20\x66\x19\x92\x3c\xe4\xd4\xd7\x6f\x2a\x38\xd2\x9f\x0e\x4f\x06\x24\x3f\x8e\xa7\xbf\x99\xd7\x83\x67\x3b\x57\xb2\xa1\xb4\x14\x1c\x95\x35\xaa\x59\xb1\xd4\x46\x74\x64\xf5\xf3\xec\x81\x93\xd8\x19\x4a\x97\xc5\x8b\xaa\xb4\x8e\xec\x20\xa3\xdc\x03\xa4\x3f\xa7\x71\x0a\x63\xf5\x31\xcf\x97\xc0\x59\xed\xa2\x84\x28\x9f\xca\x29\xd3\x34\x7e\xc4\xb2\x2d\x3e\x1c\x29\x3c\x69\x31\xca\x2e\x7b\x15\x67\xf7\xbb\xf8\x1e\x69\xa5\x1d\x11\xa4\x5d\x4c\x6e\x1f\x49\x8d\xf7\x65\x81\x35\xed\x42\x4f\x77\xbb\x45\xf6\x1a\xff\xba\xb6\x69\xf6\x23\x5b\x65\x44\x1e\x29\xdc\xaf\x21\x33\x17\xd5\x2a\xdb\x18\xf5\xcc\x47\x02\x64\xb9\x41\x0a\x07\x22\x5c\x6e\x81\xc7\x59\x6b\x7a\x26\x96\xca\x99\x14\x63\x85\x1a\x01\x8f\xd4\x9f\x9b\x74\x51\x63\xf2\x36\x9f\xb6\x10\xe3\x6e\xd0\x00\xd3\xfa\x4d\xe2\xd6\xe0\x9d\xd2\x8e\x54\x13\xa1\x17\xae\x35\x32\x83\x86\x94\x9d\xfc\x30\x62\xf7\x3a\x90\x1a\x6e\x3c\x80\xd8\xfc\x7c\x96\x20\x7b\x6d\x55\x07\xcc\x9e\xc0\xac\xda\xec\x17\x35\x84\x23\x7b\x8a\x21\xfb\x32\x50\x67\xef\x4f\x4f\x55\x6f\xb3\x4d\xaa\xb5\x8e\xab\x02\x0a\xf8\xbe\x3c\xc6\xfb\x40\x5d\x9b\xfd\x65\xde\xf4\x6b\xa2\x1f\x03\xd5\xef\xa9\x9f\xdf\x9e\xbe\x7d\x73\x72\xf6\xe6\xdd\x19\xd2\xba\x55\xbf\x1c\xad\xab\x6a\xfb\xcb\xeb\xd7\x79\x59\x86\xe5\x7d\x12\x2e\xf2\xcd\xeb\x2d\xca\x75\x94\xaf\x41\xbf\xe3\x68\x94\x57\x9a\x52\x37\x35\xfe\x32\x2f\xa0\x03\x33\xc5\x13\x94\x94\x22\x9e\x0a\xd5\xf6\x71\x66\x8b\xbc\xe7\x71\x99\xb0\xe6\xd2\xf7\xc7\x1b\xfe\xcf\x8b\x35\x1c\xd5\xa0\x67\xb3\x46\xde\x20\x29\x7f\x51\xff\xd3\xb2\x51\xd9\x5c\x53\x50\x8b\xc2\xa9\x80\x0e\x32\x00\x9c\x23\x0d\xc0\xff\x52\x81\x5a\xea\x07\x9d\xe6\x5b\x0a\x4d\xb5\x1b\xcd\x6d\x2f\x75\x8a\x5b\xc0\xfc\xf4\x3f\x15\x02\x92\x01\x89\x5a\x94\x15\x86\xbc\xac\x08\x16\x83\x7e\xac\xec\xa3\xac\x8d\x69\xe6\x42\xfe\xd7\xa1\x96\xb8\x97\x52\x44\xdd\x1e\x1a\x1c\xd8\x9a\xcb\x90\x6e\xa2\xe1\xc0\x8c\x4b\x70\x41\x16\xf0\x01\x9d\x96\x1a\x51\x2a\x54\x62\x80\x1a\xcd\x68\x12\x4e\x6c\x5e\xe5\x29\xfc\x89\x19\xf0\xc3\x65\x40\x81\x4a\xc0\x50\x0b\x9e\xaa\x07\x6a\xf6\xf9\x3b\x6b\x82\x3a\xea\x7f\xfd\x5b\x15\xfb\xb5\xfc\x84\xaf\xfb\xfd\x93\x8b\xbb\x93\x51\xff\x64\x74\x79\x72\xfe\x87\x54\x01\x3e\x53\xff\x77\xfa\xbe\xa1\xff\x77\xfe\xfe\xcd\x8b\xfe\xc7\x0f\xf9\xe9\x9b\x2d\x6f\x0c\x80\x3e\x00\xf6\x4b\xd5\x73\x04\x70\x27\xa3\x3c\xeb\x5b\x07\xf4\x64\x94\x5f\xea\x22\x79\x28\x41\xeb\xb4\x3f\x89\x7a\x10\x5c\xed\x8f\xaf\xaf\xcd\x29\xde\x1f\x4f\x6e\xc6\x13\x0c\x90\x0c\xa6\x18\x1f\x81\x68\xce\xd5\x60\x72\x0d\xe7\xf2\xe5\x38\xc2\xdf\x53\xd4\x9b\xc2\x8d\x2c\x4a\x16\xb6\x70\x46\xb8\x68\xa9\xfb\x36\xbc\x39\x52\xbd\x91\xea\xcd\x66\xe3\xc9\x28\xba\x3b\xe9\x0f\x07\xd1\x68\xa6\x26\xd1\x10\xde\x3f\xfd\x34\xb8\x09\x9b\x2d\xa4\xd7\x4e\xf1\xb9\x18\x25\xa3\xc8\x10\x73\xa0\x9c\x58\x0e\x94\x96\xef\x5f\xf7\xfe\x8a\x01\x63\x71\x95\x4d\xa2\x8f\xbd\x09\xd0\x65\x80\x20\x9d\x78\x26\x87\xf6\xf1\x4e\xe2\x4b\x73\x5a\x0f\xa0\x51\x84\xaf\x16\x2f\x1b\xcc\xa6\xea\x76\x1a\x85\x6c\xfb\x1d\x99\xa7\x43\xac\xf1\xb8\x37\x55\x97\xd1\xd5\x60\x14\x5d\xaa\x8b\x68\x38\xfe\xec\xb3\xb9\x60\x70\xd7\x7c\x7a\x16\x4d\xae\xa7\x76\x14\x9b\x83\x71\x7b\x31\x1c\xf4\xed\xe8\x1e\x77\xfa\xfd\x9b\x61\x47\x8d\x27\xaa\x43\xbf\xeb\x74\x43\x65\x5f\x8b\xef\x98\x45\xfd\x19\x4a\xfc\xf5\xc7\x37\x77\x40\xd9\x61\x7a\xf7\x9a\x23\xba\xb5\x40\x5e\x08\x06\x80\x55\x64\xa3\x47\xe1\x27\x67\x9f\xcc\x04\x7a\x51\x6e\x6e\xbb\x98\x74\x08\xd2\xf1\x9b\xcc\x62\xc2\x76\x40\x74\x30\xba\x0c\x8f\x2e\xee\x98\x48\xc4\x0c\x9d\xe0\x11\xa1\xf8\x22\xbc\xd0\x0e\xce\xa7\x68\x12\x05\x40\xfa\xd2\xeb\x23\xa9\xce\xe8\x12\x99\x73\xcc\xe7\x2f\x22\x75\x31\xbe\x1d\x59\x05\x43\x7f\x00\x6d\xd0\xde\xfc\xc9\x86\xa7\x81\xae\x64\x0a\x8f\x34\xbf\xa7\x97\xf7\xc7\xa3\x59\x0f\x66\xc8\xbc\x91\xa8\x57\xa6\x83\xcb\x68\x62\x03\x91\x77\xe3\xdb\x09\xb5\x82\xf3\x1a\x10\xeb\xc4\x97\xfa\x06\x52\xd8\x2c\xb8\x25\x40\x57\x1c\xaa\x4e\xdf\x52\x63\xb4\x14\x49\x3a\xf9\x89\x98\xa8\xb5\x00\x8f\x08\x65\x41\xc6\x96\xa9\xd6\x79\x9a\xdf\x13\xf7\xf7\x62\xbf\x00\x23\x26\x01\x5e\x12\xc1\x3f\x6d\x9e\x6b\x7e\x93\xa0\xb7\x9e\x14\x1a\x69\x12\x76\x99\xc5\xd7\x21\x22\x36\x06\x19\x2e\xca\x67\x92\xc9\x94\xaf\x6c\xf2\x5f\x48\x82\x07\x4e\x59\x07\x2a\x69\x18\x22\x4f\xdc\x1e\x7a\xab\xb3\x25\xf3\x29\x30\xd6\x63\x53\xea\xf4\x01\x2a\xfa\x0a\x0d\xc4\x1e\x9b\x79\x6a\xe3\x06\x82\x22\x04\xb9\x11\x43\xd5\xc3\x3a\x51\xae\xa3\xb3\x3a\x3e\xc6\xf1\xf5\xc6\x0c\xe3\x25\x6d\x54\x84\x97\xae\xd2\x03\x3e\x78\x1c\x97\x36\xc4\x06\xe0\xe7\xae\xf5\x37\x1b\xd5\x4c\xb5\x3a\xb8\x79\xa8\x3a\xb5\xc7\xd5\x0a\x5a\x91\x18\x0b\x78\x42\xec\xa8\xe7\x45\xed\x17\x0e\x4c\xb1\x05\xd4\x06\xc5\x0a\x61\x9c\xe4\x6c\x57\x45\x9c\x95\x29\x99\x8e\x9b\x1d\x56\xef\x0a\xce\xde\xc0\x78\xa2\x9b\xb8\xa2\xd8\x71\xa0\x56\x09\x27\xe1\xf9\x37\x84\x15\xda\x26\x0b\x59\x63\x16\xa8\x12\x34\x8e\x0a\x4d\x82\x3e\x66\x3e\xaa\x1a\xf5\x65\x3c\x2f\x92\xe5\xfd\x86\x60\x16\x66\x2a\x4b\x7a\x28\x61\x09\xb1\x0b\x50\x03\xd3\x5c\x6a\x04\x88\x2f\xf4\x22\x2e\x11\x8e\x91\x95\x18\x0b\xc2\xef\x2f\xe3\x2d\x70\xf0\x92\xdb\x87\x58\x83\xdf\x7f\xb2\x6b\x33\xdb\x98\x58\x2b\x4c\x11\x3f\xe4\x09\xc6\xc8\xf2\x95\x5a\xe6\xbb\x39\x2a\x2b\x10\x86\x1b\x77\x8f\x69\x09\x4f\x03\xaa\x85\x24\x1c\x58\x6e\x8c\x27\x44\x07\xf7\xd9\x62\x5d\xe4\x99\x88\xed\xcb\xad\x58\x25\x1b\xbd\x3c\x61\xfe\x4b\xde\x72\x9b\x1c\x15\x4e\x36\xf1\xbd\x56\xc7\x1d\x78\x46\x92\xdd\x77\xba\x96\xd6\xe3\x9f\xea\x30\xad\xe4\x45\xc8\x3e\x7e\x5e\xf8\xda\x38\xb2\xf6\x51\x2a\xcc\x23\xc6\xd3\x75\xa0\x15\x38\xd0\x7c\xd1\x32\x14\x85\xa3\x3d\xe0\x01\x7d\xf6\x7d\x8f\xeb\xdc\xba\x31\xfc\x3e\x7e\x9e\x0e\x55\x47\xee\x3b\x8c\x4e\x48\xe5\x1e\xa6\x1e\x15\xa4\xa3\x0c\xb3\xfd\xc6\x36\xaf\x42\xa2\x62\x3f\x50\x12\xfa\x74\x29\x68\x2d\x8c\xbb\xce\x01\xe4\x01\xfa\xea\x8e\xdb\x8e\x38\x2a\x97\x87\x1b\xd3\x0a\x4a\xfc\x0c\xf7\x41\x5e\xd8\xc7\x5a\xad\x19\x8a\x85\x49\x50\x9f\x05\x03\xf2\x44\x9b\xa7\x58\x21\xb5\xc3\x4d\x5e\xea\x72\x9b\x98\x73\xdc\xd5\x23\x63\x73\x41\x35\x18\x8b\x1a\xaf\xe2\x04\x49\xb1\x18\x0e\x3a\xca\xab\xb5\x75\x6a\x93\x52\xd6\x51\x25\x59\x85\x4a\x00\x50\x94\x87\x15\x79\x10\x63\x0c\x24\x6f\xaa\xc7\xba\x48\x69\x22\xe8\xc1\xca\xbc\x0a\xb2\x43\xe8\x50\x97\x31\x2a\xd4\x13\x2d\xba\x0d\x56\x96\xcc\x47\xe8\x42\xbe\x0e\xdb\xe5\x2d\x13\x44\x33\xd6\xeb\x08\x39\x6c\x88\xcf\xad\x21\xfd\xb8\x1e\xe7\xe9\x12\xcd\x6f\xa9\x7c\x0b\xdc\x74\xf8\xb5\x92\x0d\x2e\xfc\x27\xaa\x24\x03\x33\xcf\x5b\x0d\x78\xa9\xe3\x43\xb0\x1f\xd1\x05\xdb\xc9\xae\x12\x10\x67\xbb\x16\x44\x2e\x28\x91\xf7\x94\xe5\x0d\x86\x7b\xf2\x17\x67\xb1\xc8\xf2\x4a\xb1\x30\x01\x76\xbe\xc8\x8b\x6d\x0e\x86\x80\x38\xec\x2a\x22\x40\xa2\x42\xdc\xda\x79\x4e\x68\xc4\xd6\xa7\x62\xd0\xc2\x3e\xd4\xc6\xcc\xea\x8f\xf8\xe0\xee\x68\xa8\x1b\xb6\x40\xc4\x45\xbe\x4d\xb0\xc2\x77\xbb\xce\xb3\x1c\xcf\x68\xac\xc5\xe6\x72\x4e\x8c\xd1\xa4\xfb\xc0\x16\x75\xba\xdf\xc8\x52\x4f\xfe\x2d\xa8\x3c\xc0\xd9\x00\x71\x63\x16\x3a\x8b\x77\xcb\x24\xc7\xab\xce\x6a\xa2\xba\x21\xb0\x24\x71\xcd\xfe\xb4\xf6\x65\x66\xb5\xc3\x69\x6a\xe8\x4a\x75\x0c\xbe\x49\x06\x09\x3f\x14\x9f\x01\xdc\x3b\x48\x96\x95\x96\x99\x22\xcb\x1f\xd5\x97\x8c\x14\xf2\xcc\x6a\xc3\xb8\xf5\x12\xf1\x6e\x61\xf3\x15\xae\x7e\x43\xb2\x51\xc5\x5f\x08\xf5\xb5\xf1\xeb\xe2\x30\x5d\x89\x2a\x71\x08\xd1\x77\x35\x2f\x87\x97\x17\x53\xc0\xd7\x1a\x1d\x00\xc2\xd5\x61\xb2\xf7\x4c\x3b\xee\xa8\xd8\xb8\x2d\xb5\x3b\xaf\xf4\x30\xc5\xed\xf0\xe1\xf9\xde\x6d\xbb\x98\x42\x5e\xf3\xbd\x85\x0f\x3f\x0d\xb4\x3d\x98\x2b\x75\x35\x2d\xc7\x4b\x14\x40\x7c\x7b\xac\xbb\x5c\x07\xe1\x95\x79\x8b\xa2\xca\xb6\x9a\xca\x37\x34\x0f\x5e\x56\xa3\x19\xee\x5f\xda\x56\x51\xc9\x80\xa3\x72\x97\xfc\xd3\x62\xa7\x5a\x9d\x00\x51\x02\x6d\x97\x31\xad\x7f\xf1\x1b\x5a\xe9\x81\xe5\x1e\xc3\x8f\xc1\xfa\x76\x7f\x16\xb6\x6d\x96\xee\x9f\xbb\x56\x2d\xc5\x31\x16\x29\xb8\x2a\x3d\x0a\xdd\x07\xcc\x8e\x73\x9b\x25\xf0\xf4\x89\xa6\xaa\xae\x01\x97\x53\x82\x99\x19\xb4\xdc\x8f\x58\x06\x88\x0f\xf2\x36\xb8\x67\x6c\x01\x7d\xf1\xef\x39\x00\x7e\x22\x03\xab\xa8\x51\xbb\x3b\x2f\x5d\x09\x88\xbd\x91\x3e\x5b\xb3\x16\xd2\x35\xde\xb5\x77\xd8\x00\xa0\x51\x29\x18\xa2\x50\xbe\xf2\x64\x50\x9f\x2a\xa4\xf1\xdb\x27\x0b\x5b\xd8\x9c\x72\xf3\xf1\x45\xeb\xad\x39\xa1\xe3\x05\xe2\xf6\x3d\xdd\x83\x42\xaf\xb0\x6e\xad\x01\x0b\xa0\x6d\xb1\xf4\x98\x71\x1f\x2d\x33\xae\xdf\x82\x3f\x68\xf5\x59\x30\x3d\x9c\x41\xc6\x0d\x26\x35\xae\x58\x80\xf9\x19\x02\x4f\x02\x53\xc8\xf3\x5f\xb7\xc5\x63\x96\x02\x33\x47\x33\xa0\x37\x34\x57\xf9\x1e\x9e\x20\xc1\xbf\xe7\x4e\x52\x4c\x90\x97\xd2\x62\x6b\x3b\xf2\x1b\x3e\x0d\x9e\x7f\xc4\xe5\x43\xf5\x2d\x4c\x6d\xdf\x72\xdf\xd5\x6b\x68\xb0\x23\x55\xa9\xd3\x15\x25\xdf\xeb\xa7\xc7\x61\xb3\xd7\xb2\x38\x22\x35\x42\x4b\xd3\xc0\x7f\x25\xa2\x19\x42\x0e\x89\x03\x95\x97\x52\x83\xa2\x93\x64\x1b\x00\x76\x51\xe8\x4d\xfe\xa0\x65\x85\x4a\xad\x3f\x00\xd8\x21\x65\x4f\xcb\x8c\x6d\xdf\x41\x9b\xa1\xe6\x4a\x58\x52\x1b\x5d\x56\x4e\x49\x6b\xee\x2f\x3e\xbb\x69\x9a\xc2\xc1\x35\x8a\xe9\xb6\x03\xd9\x13\x8a\x73\x35\x60\xc9\x26\x2e\x92\x74\xef\x8c\xdb\x15\x36\x12\x01\x5e\xf0\x48\xe0\x76\x14\xe0\x9f\x78\xf9\x10\x67\x15\x64\x9b\x0b\x24\xaf\xac\xb4\xda\xe4\x99\xae\xe2\x02\x6b\xcb\xd9\xc5\xc6\xf5\xa4\xbf\x62\x45\xa9\xb7\x56\x57\xd6\x42\xb5\x36\x9d\x5e\x52\x88\x45\x5a\x25\x56\x7c\x35\x49\xf5\x49\xb9\xc6\x8c\x93\x57\xf4\x74\x48\xbc\x01\x57\xcf\x1f\xd2\x2f\xaf\x80\x54\x63\x8a\x13\xa8\x17\x2c\x76\x0c\x39\x5c\x5b\xbe\xda\x56\x46\x53\xd5\x06\xa9\x31\x22\xc2\xdb\x1d\xac\xc0\xa2\xf8\x63\x0e\xa2\xe0\xf0\x69\xea\xdc\x0b\x3e\x57\xd9\x5c\xb7\xa1\x20\xd0\xe2\x69\x59\xdc\xac\xe8\x22\x30\x17\x4c\x49\xa6\x97\xc9\x6e\x83\xaa\x2b\x24\x41\x8c\x62\x9c\x00\x24\x24\xc1\x42\x64\x10\x63\x1c\x15\xe4\x45\x8f\x4d\x77\x4a\xbd\x5b\xe6\xd9\x7e\x03\xd9\x39\xeb\x22\x74\x1b\x85\x5d\xd4\x88\x64\x85\xe2\xcb\x89\x5e\x7e\xc0\x33\x04\x30\x69\xde\xf9\x29\x3f\x22\xee\x06\x3a\x06\x84\xcc\x8f\x77\x22\x3c\x73\xe5\xbb\xf4\x21\xec\x3a\x7b\x12\x10\xa9\x13\x1e\xb1\x73\x88\x22\xe6\x8b\x04\xce\x55\xbb\x2a\xe8\xd4\xca\x00\x01\x09\x07\xc9\xed\x64\x20\xcf\x55\x7b\xab\xe9\xc6\x0c\xb9\x2a\x43\xf4\x67\x9d\x58\xb0\x9c\x39\x52\xdf\xa1\x29\x62\xfa\x07\xe6\xbf\x70\xc5\xf4\x62\xf2\xf0\x0c\xf9\x60\xf7\x40\xa0\xd6\x2c\x43\x80\xe7\x0a\x1a\x0b\xc0\xf3\x07\x7e\x45\xe3\x18\x86\x18\x19\x48\x0e\xee\x36\x04\x2d\xc2\xf7\x43\x68\x88\x52\xac\x18\xb5\x72\x01\x3a\xb3\x8b\xe2\x02\x21\x3b\x2e\x24\x42\x5f\x64\xc6\x00\x22\x03\xb3\xd7\x60\x0c\xe5\x41\x25\xab\xad\x91\x24\x12\x63\x15\x9f\x7f\xb0\x08\xff\xfc\x0e\x11\x36\xc1\xf6\x96\x84\xea\x06\x77\x5f\x9c\x2d\x56\x6a\x02\x3e\xb2\x59\x0c\xb7\x60\x84\x5e\xa4\x71\xf6\x45\x5b\x32\x98\x32\x74\xeb\x86\x6c\xfd\xb2\x2d\x46\x80\xec\xd8\x30\xda\x8e\xd7\x4f\xf2\x53\x9b\x45\xf1\x60\x1c\x16\xde\xfb\xd0\x11\xf6\x09\xf2\x45\xa2\xab\xbd\x3a\xd6\xe1\x7d\xa8\x7a\xd3\x7e\xef\x26\x50\x17\xd7\x83\x40\x4d\xa3\x69\xaf\xdf\x65\x57\x3e\x11\xbb\x1f\x4f\x15\xef\x69\xf6\xac\xb1\x87\xb7\xfc\x2b\x3e\xfc\x51\xcf\x17\x71\x59\x75\xeb\xfb\x0f\x16\x90\xfc\xf8\x0f\xb8\xa4\xc4\xa4\x24\xa1\xba\xd6\xe6\x20\x86\x99\x9b\x38\xed\x8c\x29\x97\xb9\xb9\x99\xfa\xfd\xa7\x04\x56\x8c\x8d\x1d\xdd\xeb\x0c\x49\xa1\x97\xba\x4c\xee\x33\x38\x18\x50\xf9\x14\x87\xf0\x13\xe8\x7c\x5d\xe5\x5f\x55\x0f\x3e\xda\x98\x1e\x24\xcb\x74\x9e\x84\x30\x8d\x7c\x73\xeb\xb8\xb3\xc8\x1f\xb4\x2d\xcf\xea\x74\x7d\x90\xb2\x6e\xd1\xb9\xdb\x6c\x77\x69\x69\x86\x83\x0d\x72\x01\xd7\x38\xfb\x49\xdd\x4e\xfb\x4e\x1a\xff\xec\x9d\x85\xcd\x4d\x05\xe0\xa3\xb7\xa8\xe0\x20\x87\x31\x73\xc2\x99\xd6\xb3\x96\x10\xc4\xb2\x1b\x90\x20\x4c\x53\xc7\x8a\xa0\x89\xa2\x03\x3f\x70\xd1\xe8\x50\x7d\xc6\xa5\x6c\x0e\xd9\xe7\x16\xcc\xf7\x1e\x21\x8d\x68\xfc\x1f\x78\x08\x9c\xb4\x1e\x02\x53\xd3\x82\x88\x6c\x93\xa7\x0e\x80\xef\xdb\xea\xff\xec\x8a\x7a\xfb\xbb\xae\xa8\x27\xba\xf0\x83\x56\xd2\xbb\xb0\xae\x91\x15\xd4\xd5\x59\x9c\x74\x8b\xf9\xc2\xed\x68\x08\xf2\x26\x5c\xbb\xa4\xae\x6f\x67\xb7\xbd\xe1\xf0\x0e\x73\xc8\x36\x71\x0c\xb8\xb4\x68\xaa\x06\x23\xf5\x79\x32\x98\x01\x3a\xce\x66\x8c\xc7\x57\x57\xd1\x64\xea\x92\xd3\x80\x39\x80\x84\xaf\x85\x17\x4c\xa2\x9b\x49\x34\x8d\x46\x88\xa2\x83\xea\x1f\x29\x92\xe2\x94\x57\x54\x7f\x3c\xea\x47\x93\x11\xc3\x0f\xcc\x03\x03\x46\xf3\x05\x8c\xbc\x0b\xd4\x74\xd6\x9b\xdd\x02\x92\xce\x2f\xbd\x7a\x06\xbd\xe7\xbf\x94\xb4\x58\x18\xa9\x37\x60\xa4\xde\xf3\x98\xbc\xd1\x78\xe4\xab\xb7\x90\x04\x48\xef\x62\x1a\x51\xee\x7b\xd8\x83\x3a\x20\x8b\x23\xc0\xda\xbd\x69\xa0\x7a\xfd\xfe\xed\xa4\xd7\xbf\xb3\x5f\xc2\xa1\xc1\x6f\x89\x07\x44\x93\xc9\x78\x32\x75\x35\x6b\xe3\x09\x60\x45\x2e\x07\x53\x28\xab\xeb\x5d\x0c\xa3\xef\x2e\x1e\xba\x6a\xc1\x2e\x42\x75\x10\x64\xea\xdd\x07\x1b\xe5\x40\x77\xe3\x5b\xe6\x14\x90\xfa\x3e\x99\xd3\xf7\x09\xb9\x90\xcf\xaf\x83\x9a\x44\xff\x71\x3b\x98\xe0\x4a\xf2\xa1\x14\x66\xb2\xcc\xda\x88\x7e\x35\x9f\xfb\x3c\x18\x0e\xdb\x6a\xe4\xf0\xdd\xac\x07\x23\xab\xf9\x6c\xf9\x5c\x6b\xb1\x9c\x57\x08\x15\xa8\x9b\xdb\xd1\x00\xc0\x22\xe3\x89\xd3\xaf\xb1\x50\x15\x96\x7f\xb1\x9a\x2f\x3e\x5e\xc3\x6a\xc0\x5c\xc9\x35\x49\x55\x6b\xb6\xcd\x9f\x7a\x53\x2c\x56\xfb\x4e\x55\x97\x9f\xda\x14\xd4\xe2\xdf\x95\x2a\xc6\x0a\x75\x10\xed\x0b\xc9\x75\xd5\xc8\x58\xeb\x51\x10\x7b\xd4\x97\x36\xcb\x07\x7a\x8a\x6b\xaa\xb4\xb7\xc9\xb6\x7a\xbc\xde\x89\xa5\x36\xd3\x69\xc2\xca\xb7\x59\x6b\x78\x1a\xf2\xb7\x58\x3e\x13\xdb\x95\xa5\x73\x92\xe1\x8a\x4e\x0e\x34\xcb\xd5\x86\xac\x76\x4c\x55\xe1\xa1\xa6\xf3\xd2\xf1\xf8\x85\x2e\x56\x7d\x16\xa8\xf3\x40\xbd\x63\x16\x26\x33\xd0\x7f\xc6\xa6\x7d\x23\x85\x8d\x08\xb3\xd4\xf2\x5f\x18\x32\x69\xcb\x82\xa1\xb7\x57\x0f\x80\x73\x0c\xe0\x1f\x4c\x66\xc9\x64\x55\xb7\x9d\xf7\x11\x5a\x74\xe8\xfe\xb7\xb7\x3e\x83\x81\x6b\xc9\xed\x43\xd2\xa1\xa4\xdc\x56\xe5\x5b\x61\x54\xd1\x0b\xd1\xab\xaf\x88\x40\x65\xa3\x5b\xdc\x3d\x47\xac\x80\xd4\xb2\xa9\x8d\x69\xd0\xf2\x40\x55\x97\x0a\x55\x51\x96\x45\xfc\xe8\x87\x1d\x8f\x3d\xfc\x85\x8b\xec\xc6\x95\xa5\x13\x60\x1e\x5f\x4b\xa5\x0c\xae\x72\xd0\x60\x53\x39\xb0\x17\xba\x94\x8f\x6b\xd4\x23\x59\x02\x01\x5e\x75\x50\x57\x85\xb5\x1f\x58\xf2\x44\x3e\xb7\x58\xcd\x2e\x8b\x08\x93\xc1\xec\x0c\x6d\x82\x4e\x31\x09\x99\x00\xc1\x82\x1f\xb4\xff\xe6\x84\x44\xd1\xe6\x38\x7b\x59\x70\x46\x32\xe4\x7e\x78\x5d\xb0\xa5\xc9\xd8\x2d\x85\xf0\xa1\xd2\xab\x35\xbf\x4b\x45\x5e\xf5\xb5\x4d\x21\xc5\x03\xfc\x02\xb8\x7d\xbe\xa5\x90\x2d\xc9\x1e\xe2\x34\x59\xa2\x2e\x8a\x28\x64\x63\x9e\x88\x26\x51\x88\x28\x4b\xc1\x39\x31\xcd\x83\x87\x10\x7b\x89\x7d\x0a\x32\x81\x71\x48\xd4\x2f\x45\x7b\x32\x99\xc3\xa5\x42\x56\x7e\x7c\x21\x79\xac\x18\x71\xce\x69\x83\xd8\x69\xff\x3c\x5b\x7c\xc7\x11\x2e\x0a\x72\x50\x08\xc9\xcb\x2b\xba\x7c\xa4\x7b\x10\x8e\x11\xac\x43\x37\x44\x22\xfc\x37\xca\x91\x24\x8c\x95\x0a\x5a\x47\xdb\xb6\x86\x18\x56\x40\x92\x6a\x49\x44\x6c\x7c\x95\x90\x70\x2c\x36\x55\x46\x98\xe0\xd3\x05\x51\xd8\x94\x5e\xad\x70\x92\x01\xe9\x12\x12\xdd\x2e\x95\x71\x4b\x5d\x0a\x0f\xab\xb3\x30\x96\xb5\x58\xc7\xc5\x3d\x07\xb2\xda\x9f\x2a\x22\x2b\xde\x85\x29\x01\x53\x60\xc8\x03\xc8\x4f\x14\x56\x72\x9d\x9d\x9c\xa1\x43\x18\x13\x47\x99\x6a\x8e\x68\x08\x47\x17\x9a\x48\x5f\x71\xe1\xf1\x29\x5b\x06\xb2\x0e\x30\x2f\x6a\x45\xb7\x4f\xbc\x02\x4e\x3a\x8a\xe5\xf1\x7b\x5c\x90\x4f\x06\xa7\xe7\xe0\xce\x11\xe1\x5f\xbb\xe2\x08\x9c\x7e\x9b\x78\x2f\xea\x0c\x48\x8c\x79\xb3\xcb\xb8\x08\x8d\x6f\xe9\xda\xc8\xb5\x71\x0d\xf2\x02\x87\xb5\xb8\x83\xab\x89\x69\xb3\xdc\x88\x7a\x55\x47\x70\x28\x43\xb0\x20\x3c\x6a\x00\xb2\x13\x8c\x3b\xc6\x6e\xb2\x9b\x7b\xca\x2c\x6b\x08\x87\xdb\x22\x65\xc7\x22\x76\x28\xfa\x8d\x91\xc8\xc6\xeb\x24\x3c\x2e\x4d\x38\x72\x4c\x72\x68\xac\x42\xb0\x57\x64\x23\x61\xfd\x6a\xb5\xd6\xc6\x8b\xe4\x00\x08\xd7\xb1\x7f\x17\x93\x19\x0a\x01\xa7\x01\xce\xab\xf9\x8f\x24\x5b\x40\x25\x27\x02\xa7\x60\x09\x03\x23\x8c\xf1\xf5\x6a\xa5\xf2\xb5\x3e\xf2\x18\xa5\x4f\xd1\x3a\xaf\xf2\x42\xdf\xe7\xf0\xaf\xc7\x1c\xa8\x3b\x61\x6f\x66\x50\xd4\x95\xac\x9a\x23\x83\x12\xc8\x9c\x60\x97\x74\xbd\x98\x3a\xa3\xc3\xdc\x83\xe8\x10\xc1\xbf\x3d\x59\xc1\x7a\x8b\x1d\xe2\x00\xe0\x9c\x52\x0c\x7a\x65\xbf\x1f\x1e\x51\x85\x1f\x9b\x35\x9c\xbe\x17\xf0\x3c\xaa\xc8\x11\x72\xec\xe4\x57\xdb\x2a\x45\x0e\x6c\x34\x54\xb1\xb5\xea\xf7\x6f\x86\x81\xca\x48\xfb\x1a\xa7\x15\x66\x7f\x47\xe6\x8c\xe3\xc1\xea\xd4\x07\xa3\xc3\xab\x81\x09\xe8\x3c\xce\xac\x34\xbf\xcf\xa1\x32\xb5\xb9\xb8\xdc\xd6\xf0\x09\xe5\x84\xa6\x76\xfd\x5b\x58\x98\xe9\xaa\x12\x77\x6c\x51\xe0\xe9\x58\x37\x5e\xeb\x5f\x7f\x65\xde\x96\x9d\x00\x63\x65\x56\x89\x86\xee\xca\xf8\x5e\xab\xfb\x5d\xb2\xd4\x69\x92\x01\xb0\xd8\x02\x65\x1c\xd9\x50\x8e\xb8\xe7\x47\x3d\x2f\x93\x4a\xfb\x69\x30\x48\x93\xc6\x0f\x71\x92\xe2\xad\xba\x85\x2a\x63\xc8\x28\x36\xd9\x9e\x5a\xb6\x36\xbd\x0c\x78\x54\x21\xa8\x61\xcc\x30\xac\x07\x5c\xd0\x67\x17\x34\x06\x79\x71\xff\xfa\x8f\x50\x26\x0b\x5f\x5f\x4d\xaf\x7a\x37\x7f\x98\xf6\xd7\x7f\x7b\xb6\xfe\xe7\xf4\xf4\xcd\xdb\xd3\x5a\xfd\xcf\xd9\xbb\xf7\x6f\x5f\xea\x7f\x7e\xc4\x4f\x3f\xdf\xee\xd9\xb6\x68\x52\x64\x50\x81\x2d\xd5\x8a\x9a\xed\x4a\x1b\xd8\x27\xdb\x30\x97\xbb\x57\x35\x0c\xa9\x58\x4c\x34\xf2\x37\x08\x91\xe8\x65\x71\x9b\xf9\x33\xeb\x3a\xf0\xbf\xcd\x93\x2d\x51\x23\xde\xbd\x50\xf2\x9b\x94\x16\x99\x1b\x97\x27\x89\xa0\x39\x46\x8e\x40\xbc\x06\xff\xbd\xb4\xfc\xfe\x91\x1f\x5b\xff\x77\xf9\xc7\x49\x00\x3e\xbd\xff\xcf\xdf\xbe\xf9\xa9\x51\xff\xf7\xe6\xcd\xcb\xfe\xff\x21\x3f\xcf\xd4\xff\x51\xc5\xdf\xd9\x8f\xac\xf8\xbb\x9c\xf4\xae\x66\x2f\x75\x7f\xff\xce\x75\x7f\x2f\x65\x7e\x2f\x65\x7e\x2f\x65\x7e\x2f\x65\x7e\xff\x15\xca\xfc\x5e\xaa\xde\x9e\x6f\xf3\x4b\xd5\xdb\x4b\xd5\xdb\x4b\xd5\xdb\x4b\xd5\xdb\x4b\xd5\xdb\x0f\xac\x7a\xfb\xe7\x4b\xd7\x5a\xab\xcd\xd4\x4b\xb9\xd9\x4b\xb9\xd9\x4b\xb9\xd9\x4b\xb9\xd9\x4b\xb9\xd9\x0f\x29\x37\xfb\x43\xab\x8b\xd8\x11\x6b\x9a\x0f\x2f\x55\x47\xf8\x91\x97\x62\x9c\xe7\x8b\x71\xbe\x1b\x2a\x8d\x17\xfa\xc5\x1e\xef\x1b\x0f\xdf\xb6\x72\xa5\x2a\x0c\x9d\x6b\x03\x3e\x0a\xd4\x9d\x65\xfd\x06\xf4\x10\xbe\x96\xb5\xec\x68\x79\xcd\x75\x59\xc9\xdc\xf9\xab\x12\xac\xb8\x54\x2f\xef\xb5\x42\x13\x4e\xcc\x5f\x92\x99\xb3\x6a\xef\x57\x06\x39\x1f\xc3\x0c\x8e\x5e\xec\x20\x5a\xd0\xd0\x1b\x43\xf8\x89\x34\xda\x50\xb6\x4e\xc2\xb8\xe8\x1b\x42\x4f\x0e\x2f\x21\x4c\x91\xe1\x47\xe3\xc7\xd5\x2e\xfd\xe6\x4b\xd2\x26\xb7\xee\x90\xd9\xc0\xca\x5e\x5b\xe8\x00\x3c\x3f\x46\x98\x8b\x2d\x18\x08\xda\x30\xfe\x2b\xad\x41\xce\xab\x74\xb8\x50\x21\x58\x85\xe5\x94\xd6\x37\xa0\x02\x9d\x19\xf7\xdc\x9e\xf7\x2c\xc9\xe4\xfb\x89\x42\x3b\x8b\xcf\xac\x44\xa8\x31\x61\x32\x1b\xdc\x46\xa7\xca\x57\x53\xea\x6b\xd3\x94\x22\xf8\x07\x06\x7b\xd4\x52\xaf\xe2\x0d\xc5\x99\x92\xec\x21\x2e\xad\xa2\x5d\xf2\x10\x63\xf9\x0e\xa9\x72\x02\xaf\xe9\xce\xcc\xdd\xdf\x77\x38\x59\xb5\x27\x8b\x63\x98\x00\xd9\xbd\x29\x03\xe8\x87\x77\x00\x9c\x8f\x2e\xd5\x60\xd4\x40\x39\xbb\x22\x00\xc2\xfe\x3b\xb0\xbf\xf9\xf3\x53\x40\x6e\x19\x5b\xa7\x27\x5e\xba\x4c\x84\xb2\x99\x08\x07\xca\x6f\x47\xff\x07\x2a\x1a\x40\x48\x9d\xe9\x7b\xc7\x13\x0b\x58\xff\x06\x5e\xde\x83\xc9\x8c\xfe\x78\x34\x8b\x46\x33\x78\x1e\xc3\xef\x65\x20\xff\xf7\x87\xb6\xf7\x46\x97\xfc\x25\x99\x1b\x61\xa0\x39\x64\x46\x5c\xfa\x64\x36\x56\x3d\x33\x1f\x93\x4b\xd2\x3f\xa9\xe5\x50\x2e\x26\x51\xaf\xff\xc9\xb6\xd8\x75\x73\x30\x52\x53\x14\xef\x51\xef\x5e\xf0\xf4\x2f\x78\xfa\x17\x3c\xfd\x0b\x9e\xfe\x05\x4f\xff\x82\xa7\x7f\xc1\xd3\xbf\xe0\xe9\x5f\xf0\xf4\x2f\x78\xfa\x17\x3c\xfd\x0b\x9e\xfe\x05\x4f\xff\x82\xa7\xff\xb7\xfa\x09\x5f\x5f\x4c\x2f\x4f\xde\x9c\xf4\xd3\x78\x57\xea\x93\x51\x7e\x32\xda\x2d\x52\x1d\x17\x27\x9f\x19\x43\xfd\x4f\x63\x82\x9f\xc1\xff\xbf\x39\x3f\xaf\xe3\x7f\xdf\xbf\x7d\xff\xe6\x05\xff\xfb\x23\x7e\x7c\x05\xa2\xf3\xd3\xd3\x37\x27\xe7\xa7\xa7\xef\xd4\x74\x97\xa9\xeb\x64\x51\xe4\xe5\xbe\xac\xf4\x86\xb5\x83\x5a\x65\x7e\x26\xda\xab\x1c\x30\x67\x30\x28\x84\x67\x8a\x92\xa3\xe6\x37\xf3\x24\x8b\xf1\x4e\xdb\x94\xdf\x57\x4f\x20\x2a\x06\xe8\x10\x76\xa9\x64\x69\xfb\x17\x5a\x6d\x74\x05\x51\xdd\x13\x55\x6b\x13\xa8\x3a\x41\x5b\x16\xf9\x52\x63\xe2\xa3\xd0\x20\xce\xe5\x9c\xe5\x7a\xe6\x23\xe0\x5b\x0f\x83\xcb\xf2\x5d\x14\x11\x71\x0d\x71\xc9\xc5\xb0\xb5\x01\x49\x26\x47\x80\x1b\x20\xa1\x1b\xbf\x67\x1b\xd8\x1b\x5f\xe6\x8b\xdd\xc6\x8a\x98\x92\x46\x3d\xc1\x09\xe2\x4a\x17\x49\x9c\x0a\x45\x31\x6b\xca\xc8\x96\x53\x77\x46\x74\xad\xd9\xcc\x4c\xbe\x3a\xb4\x46\x72\xf7\xa9\x92\xda\x8c\x4f\xcb\x0b\x7b\x44\xef\x4a\x34\xda\x75\xb6\xcc\x8b\x92\x18\x5b\xf2\x4d\x5e\x81\x02\xdc\x72\xb7\xa8\x4a\xb5\xd4\x05\xd8\xfc\x94\x87\x4b\x4a\x27\xcc\xc5\xcb\x86\x6c\xd6\x45\xed\xf2\x73\x90\xae\xf0\x68\xe6\x7d\x31\x11\xdd\xc5\x68\x6b\xd0\x71\x95\x23\xce\xdc\xa3\x20\xf4\x97\x24\x5b\x86\x9e\x46\x9a\x08\xb2\x3a\xe8\x6e\xd0\xe0\x6c\xe9\x8d\x7c\xd6\x10\x1b\x90\x6d\xd3\x44\xbb\x6b\x95\x40\x7b\x8e\x58\x05\x39\x4e\x7c\xa9\xb3\x00\xd4\xe0\x3f\x45\x93\x08\x20\xd3\xe6\x9d\xd1\x65\xa8\xa6\xb7\x23\x75\x3d\xe8\x4f\xc6\xd3\xbb\xe9\x2c\xba\xc6\xf6\x84\xea\xb8\x33\xbd\x1d\x75\xba\xa8\xfb\x36\x9b\xda\x68\xe2\x54\x08\x3f\xb7\x08\x70\x53\xdc\x72\x7a\x7b\x75\x15\x51\x44\x97\xe2\x95\x11\x20\xbb\x29\x20\x6b\x3a\x75\x3b\x85\x18\xf4\xf5\xf8\x72\x70\x75\x47\xb1\x71\x87\xf9\x87\x80\xf3\x60\xea\x84\xdb\xcd\xe0\xce\xa6\xea\x32\x9a\x0c\x7e\x05\xd8\xfa\x34\x6c\xc6\x69\x4d\x67\xe8\x83\xae\xc1\xcd\x66\x0e\xc7\xd3\x99\x9a\x98\xef\xdd\x46\x81\xba\x99\x8c\xaf\x06\x40\x30\x83\xd2\xdc\xe3\x09\x86\x9a\x0f\x8b\x89\xd7\x62\xb8\xbe\x72\xb4\x8d\xe8\x5a\xd1\xe8\x4f\xe3\xcf\xd1\xaf\xd1\x44\xf5\x7b\xb7\xd3\xe8\x12\x86\x14\xc3\xea\xc8\x19\x84\xd1\x58\x8a\x1d\x4b\x8d\xed\xa0\x19\xff\xb5\xf1\x5e\xd3\xcb\x91\x08\x7b\x9b\x5f\x7b\x03\x26\xe5\xc0\x47\xff\x58\x0c\x18\x12\xb1\x0b\x97\x2c\xa3\x33\xb6\xb6\x67\x00\x18\xa1\xc9\x57\x06\x31\x6a\xc1\xca\x44\x67\x3d\x1c\x1c\xf0\x99\x80\xb5\x2f\x09\x26\x9c\x6f\x75\x61\x65\x94\x37\x31\x7c\x99\x99\xb8\xcc\x2e\xcb\xd0\xe2\x50\xab\x78\x81\x29\x84\x17\xbb\xec\x87\xfd\x84\xaf\x7b\xd7\x97\x37\xc3\x9b\xde\x1f\x58\x01\xfa\xb4\xfd\x77\x76\x6e\xfe\xbb\x56\xff\x75\x7a\xf6\x62\xff\xfd\x90\x9f\x86\xfd\xf7\x3e\x30\xff\xfb\x93\xea\x2d\x1f\xcc\x1e\x5d\xe2\x0d\xaf\x2e\x35\xc9\x9d\x9a\x2b\xfe\x48\x00\x0f\x8b\x6f\x30\x03\xcd\x26\x07\xb3\x87\xa3\x7c\x6c\x7c\xa0\x48\x38\x86\x5d\xcd\xa5\xaf\x80\xda\x17\x1c\x71\x0e\x6f\xb8\x63\xc8\x9a\x93\x79\x51\xb3\x26\x65\x41\x8a\xf0\xa1\x3d\xeb\xe7\x69\x9b\x53\x1d\x77\xbc\x86\x75\xba\x01\x25\x43\xfe\x41\x23\xd4\x1f\x8c\xb2\x6e\x80\xd2\xc9\x67\x3b\xf7\x6d\x06\xa9\xd5\x69\xf7\xc3\xc1\x52\xbb\x37\x2e\x2a\x87\xde\x5e\xea\xfa\xac\x94\x75\x43\xf4\x40\x43\x9e\x37\x4c\x9f\x69\x8b\x45\xcd\xb4\x4c\xc5\x01\x43\x34\x3c\xaa\x1b\x99\xe6\xe2\x29\x5c\x84\x01\xde\xf2\xd4\xba\xe4\x20\x8a\x6b\xeb\x3a\x4f\x97\xba\x28\x29\xe0\xf5\x3b\x99\xa1\x76\xf5\x7e\x87\x19\x4a\xda\xa3\xf1\xdc\x7c\xbe\x2e\xb3\xcf\x08\x4b\xbd\xa4\x5d\xf5\x0b\x46\x45\xed\x8b\x92\xba\x95\xde\x99\x44\xc6\x8a\x82\xb2\x3c\x2c\x47\x0b\x3b\xea\xb6\xd4\x81\x5a\xee\x84\x72\x76\x81\x3e\x41\x5e\xee\x0a\xcd\x31\xee\xfa\xcb\x93\xb2\x0e\xbd\x83\x6c\x12\x45\xfb\xf3\x95\x07\xd7\xf5\x35\x2c\xae\x7a\x93\x77\xe7\xe1\xf9\xf9\x4f\x08\x01\xba\xea\x4d\xa6\xe7\xf4\x0b\x5d\xa9\x52\xff\x67\x68\x2b\x81\xca\x1d\x60\x1a\x11\x1e\x27\x12\x25\x4e\x68\xbb\x0c\xa1\x3c\xa2\x71\x44\x1c\x68\xb6\x57\xfd\x63\x0d\x18\x19\x0b\xde\x16\xf9\xb6\x48\x90\xfd\xd1\xd5\x35\x3c\xb9\x7e\xf8\x38\x6a\x2e\x20\x4a\x34\xd9\x15\x14\x1e\x19\x23\xd3\x61\x0d\xcc\xbf\x66\xd1\xe4\xba\x91\xc2\x47\x53\x9a\x4c\x62\x40\x92\x44\x6a\x70\x7d\x1d\x5d\x0e\x7a\xb3\xc8\x18\xa8\xe3\xbe\x2d\x17\x84\x4f\xda\xca\xc6\x49\x64\x4d\xe5\x08\x98\x10\xc9\xff\xb0\x66\xe0\x75\x6f\x16\x4d\x06\xbd\x61\x78\xe4\xfd\xd3\x2b\x0c\xbd\xb8\x33\xe6\x60\x6f\xd4\x8f\x2e\xd1\x05\x50\x97\x11\x14\xdf\x92\x0f\x00\xb5\x91\x23\x59\xd8\xf9\x69\x3c\xbc\x8c\x26\xb6\x3a\x11\x1b\x60\x6c\x6c\x46\xa7\x0c\x46\x60\x7c\xf7\x6f\x27\x13\x63\x94\x5b\x37\x08\x9d\x1e\x82\x9b\x40\x91\xa6\xef\x14\x05\xea\xe3\x6d\xcf\xf8\x3b\x51\x14\x08\x52\xcb\x3b\x8f\xd2\x12\x6c\x5e\x02\xa8\xdc\x61\x65\x6f\x74\x69\x46\x63\x7a\x7b\x73\x33\x9e\xa0\xad\x1e\x5d\x8f\xc0\x74\x06\xd6\x47\x75\x35\x89\xc0\x75\xb8\x1d\x0d\x46\xb3\x68\x32\xb9\xbd\x31\x5f\x19\xdf\x50\x1d\x26\x51\x47\xf6\x66\x6a\x30\x33\x43\x03\x1f\x07\xa4\x08\xb1\x4c\x9a\xbf\xff\x3a\x98\xdc\x4e\x8d\xbb\x61\xa6\x60\x7c\x31\x1c\x7c\x64\x47\xce\xf9\x53\x4e\xf8\x5a\x9d\x58\xa2\xc9\x26\xdb\xe6\x78\x22\x08\x37\x4f\x24\x14\xe7\xe2\x76\x06\x3e\x15\x40\x71\xa0\x57\x07\x25\xb2\x9b\x84\x9b\xdf\xec\x17\x4a\xd2\xcc\xfe\xf8\xfa\x66\x18\xcd\xa2\x11\x34\x11\x86\x84\x1f\x43\xa2\xda\xe0\x11\x60\x3d\x76\xd0\xe6\x51\xfa\x0e\x18\x2e\xe6\x27\x17\x14\xb9\x5f\xcd\xf5\x04\x5a\x9e\x62\x39\xb5\x78\x96\x0d\x6f\x4c\x82\x6a\xac\x67\xc6\xce\x57\xe0\xc0\x34\x01\x3d\xdd\x79\x6c\xd6\x4d\x3d\x7e\x66\x02\x6e\x26\xe3\xfe\xed\x04\xfa\x8a\xde\xd1\xc5\x74\x36\x98\xdd\xce\x22\xf5\x71\x3c\xbe\x84\x66\x73\xbd\xfa\x07\xe3\x54\x4e\xd1\xaf\x8d\x02\xe7\x5c\x5a\x97\x12\xbd\xcc\xe9\x07\xf3\xdf\x17\xc6\xf7\x35\xf3\x64\x17\xe5\x60\x3c\xea\xd6\xfd\x44\xf3\xc1\x9e\x05\x80\xdd\xb5\x79\x88\xd6\x41\x6c\xdf\x17\xde\xd6\x77\x0e\xe1\x37\xfb\x80\x58\xea\x6c\x06\x6d\x12\x51\xa5\xf4\x47\xe3\xb9\xce\x22\xd1\x84\xf1\xd5\xef\x76\x8a\xb8\xd0\x42\xf4\xb7\x7e\x64\xfa\x10\x8d\xd4\xe5\x78\x38\xec\x4d\xa6\xea\xf8\x76\xaa\xfe\x7f\x67\xa7\xe1\xe9\x69\x17\x8a\xc8\xc7\xa3\x48\x1e\x83\x14\x41\xc0\xa3\x90\xfe\x01\x21\x06\x7f\x14\xa8\xe2\x9a\x0a\xfe\x7b\xc3\xa1\x38\x62\x27\x83\xe9\x5f\x5d\x41\x38\x9d\xb3\xc3\xa8\x37\x8d\x7e\xb7\x1e\xc2\xd9\x62\x3e\x0b\xdf\x01\x64\x19\x8e\x23\x44\x82\xc4\xe1\x12\x28\xe4\x06\x80\xb5\x73\x19\x5d\xf7\x46\x97\x80\x52\x33\x03\x43\x41\x83\x43\x63\x63\xe6\xec\x6a\x3c\x89\x3e\x8e\x21\xa6\x34\x89\x54\x34\x9d\xd2\xca\x6f\xad\x68\x37\x8d\x09\x60\x61\x8c\x18\xcd\x37\xe5\xe2\x77\xf3\x75\xb3\x79\x66\x93\xdb\xe8\x52\xf5\xa6\xea\x76\x14\x8d\xae\xc6\x93\x7e\x64\xb6\x67\xa0\xae\x7a\x83\x21\xb4\xcb\xbe\xc2\x1e\x35\x00\x97\xeb\x8f\xaf\x23\xf5\xeb\x78\x70\x89\xfd\x98\x4d\x06\xd7\x18\x29\x99\x8d\x7f\xa7\xb3\x82\x4f\x88\x49\xd4\x9b\x9a\x13\x7d\xf6\x29\x1a\xfd\xa3\xb7\x25\xad\x40\xd3\xf5\xc1\xc8\x2c\x73\x7b\x1b\x0f\xef\x42\x75\x3d\x9e\x44\xe3\x5f\xa3\x49\x50\x1b\x62\xfc\xd2\xf4\x76\xf2\xeb\xe0\xd7\x08\xda\x12\xfd\xed\x66\xc0\x95\xfe\x13\xfb\xb8\x36\xe9\x6a\x6a\x3c\xac\xb8\x6b\xe2\x39\xf6\x1b\x78\x68\x3f\x87\x47\xa3\xf1\x6c\xd0\x07\x42\x04\xba\x85\x7c\x7e\x89\x8b\xbb\x7f\x64\x7f\xc0\xf6\x77\x4f\xee\xf5\xff\x3a\x1a\x7f\x1e\x46\x97\x1f\xcd\x63\xe1\xaa\xf4\x3f\x7f\xdd\xbb\x33\xc7\xf5\xf4\xf6\xe2\x2f\x51\x7f\x86\xa3\x8d\xe6\x27\xdc\x91\x8e\x7c\x62\xd8\xfb\x3c\xe5\xd8\xd7\xed\x90\xf9\xab\x29\xa8\x35\x82\x33\x17\x30\xb5\x53\x47\xf5\xdc\x1f\xdf\x9a\x89\x8e\x80\xbc\x79\xd0\xff\x44\x17\x66\x04\x87\xb5\x59\x99\xf5\x03\x1b\x0c\xc1\xe8\x6f\xc6\x18\xc0\x45\x32\x1e\xe2\x7b\xa1\x57\xbd\x29\xa1\x4e\xe1\xef\xbd\xcb\xeb\xc1\xc8\x8c\x0e\x4e\x8c\x6c\x95\x69\x25\xce\x17\x30\x92\xf4\x6f\x27\xe6\xa0\xa3\x07\x4e\x95\xa0\xdb\x30\xcd\x8c\xa0\x8f\x81\xf9\xf5\xe7\xc8\x5c\x81\x53\xec\x88\xba\x8c\xcc\x0d\x7c\x4d\x86\x10\x7e\xd7\x8d\x07\xb4\xf5\x1a\xee\x2b\xf3\xce\xe1\x60\x3a\x0b\x5b\xc6\x96\x02\xad\xe6\x46\x08\xf8\x38\x32\x33\x31\xe9\x8d\xa6\x57\xd1\x64\x62\xfe\x31\xb8\x36\x3d\x32\xff\x85\x7d\xc3\x20\xe3\x6b\x00\x1b\x9f\xb8\xdf\xd1\x25\x71\xdd\x1b\x8d\xa2\x89\x20\xd1\xa0\x46\xc1\x3a\xf4\xe0\xb7\x5e\x70\xfa\xe0\xd8\x3a\x88\x30\x5c\xc3\x57\x83\x3e\x10\x9f\x5f\x46\xd3\xc1\xc7\x11\x2c\xdd\x9b\x68\x32\xc5\x33\x8d\x27\xd4\x1b\x62\x58\x06\xee\x4f\x62\x29\x1d\x9e\x84\xdf\x6d\x37\x42\x3c\x58\x6c\xc6\x7f\x64\x23\xce\xa4\x77\x0b\x71\x87\x76\x68\x4f\xa1\xef\xe3\xc2\x82\x22\xd8\xb3\xda\xc4\x55\xa5\x11\xc2\x00\x1e\xf7\x52\x95\xbb\xad\x2e\x4a\xbd\x34\xee\x4b\x0a\xf8\x99\x6d\x5e\xc6\x29\x7a\x1a\xe8\x47\x1a\xdf\x6d\x57\x96\x36\xdb\x43\xb8\xa5\xf2\x1b\xe0\x43\xe6\x45\x55\x4e\xe0\x1a\x6e\xb5\x05\xef\x13\x16\x0d\x80\x8b\x8f\x99\x86\x7a\x8f\xc0\xa2\xf4\xa1\x5c\x26\xe0\x30\xaf\xf1\xfe\x54\x92\x51\xe5\x79\xca\xe0\x88\xc0\xf7\xd2\x2c\xaa\xab\x19\x09\x58\xc4\x99\x07\xe7\x31\x0e\x32\x80\xb9\x82\x1a\x9a\xeb\xc0\x17\xf5\xd7\x85\x71\xd3\xad\x24\xcf\x32\xcf\xb4\x2a\x73\xac\x72\x61\x28\x97\x83\x71\x99\xc1\xc4\xfe\xe9\x25\x0f\x0e\x43\x19\xb5\x08\x41\x89\x72\x7b\xa6\x25\x49\xf7\x1e\x62\x8d\x21\x81\x87\xbe\xb6\xd4\x88\xac\xb4\xba\x57\x79\xa1\xe6\x7a\x91\x6f\x74\x59\x83\x07\x9a\xa1\x4c\x01\xda\x43\xa8\x3b\x78\xe4\xf7\x03\xee\x12\xe3\xd2\x2f\xb1\xc4\xd4\x6f\x0e\x00\x67\x19\x83\x4c\xf0\x4f\x33\x40\x8b\x45\x5e\x2c\x1d\x96\x23\xa9\x4a\x06\x4e\x96\x6e\x46\xe6\x84\x7e\xc5\x76\x58\x15\x31\xf1\x78\xdb\xd4\x7b\x70\xc0\x69\xa4\xd1\x25\x2e\xab\x62\x47\x65\x52\xb5\xb7\x51\xa1\x8b\xa5\x13\x98\x56\x71\x05\x0e\xfe\x4c\x7f\x8d\x1d\x78\x05\x77\x0c\x74\x61\x97\x6a\xa8\x44\x5d\xe4\xd9\x2a\x4d\x16\xe8\xb1\x03\xcb\x00\x85\xa9\xf0\x09\xbe\xac\x84\xa8\xc9\x35\x73\x3e\x22\xe8\x4f\x3f\xcf\x1e\xcc\xee\xc4\xfa\x04\xf3\x81\x81\x59\xce\x88\xa3\x8e\x53\x35\x8d\xb1\x28\xec\x63\x9e\x2f\xa9\x96\x7a\x99\x94\x5b\x0c\x28\x10\x0c\xca\x34\xaf\x3e\xf3\x76\x2c\x6a\x51\x13\xbf\x49\xd8\xe3\x95\x5e\xea\x82\xc2\x9c\xd8\xf6\x45\xbe\x2b\xb0\x9a\xa8\xb7\x2b\x2b\xb3\xaf\x60\x30\x02\x1b\x4e\x5b\xea\x15\x82\xd0\x45\xbd\x36\x81\x1f\x17\x79\xb6\xd0\x45\x66\x1a\x66\xce\x0e\xe8\x85\xf7\x56\xf3\x8c\x07\x9d\xed\xb8\x9e\xa8\xe4\xf7\x1d\xce\xa8\x84\xaf\x87\x37\x37\xc3\x93\xb3\xf0\x4d\xfc\x87\x65\x00\x9e\x8e\xff\xbf\x3d\xff\xe9\xfc\xa7\x7a\xfc\xff\xec\xdd\x4b\xfc\xff\x87\xfc\xcc\xd6\x5a\x0d\xe3\x99\xfe\x9b\xba\x29\x72\x58\xce\x37\x88\x78\x63\x06\xb2\xff\x71\xf2\xf4\xff\x1d\x99\xf5\xa3\x7e\x25\x15\x20\xb3\x8e\xd4\xf9\xe9\xe9\xdb\x93\xb3\xd3\x93\xd3\xb3\x23\x97\x5e\x38\xfb\xf9\xe7\x9f\xcd\x5f\xce\x4f\x4e\xdf\xe2\x1b\xdf\xf0\x2b\x8f\xa2\x07\x5d\xec\xcd\xb1\x9e\xc0\x65\x98\x3f\xe2\x59\x28\x10\xe7\x0f\xba\x98\xc7\x55\xb2\xb1\xdc\x14\xb5\x4d\xc9\xf1\x65\x2c\x4d\xf6\x22\xfb\xf9\x4a\x25\x95\x45\x7d\xe2\xd3\xc3\xa3\x9b\x49\xd4\xbb\xbe\x18\x46\x47\xff\x83\x7e\x8e\x9e\x1b\x09\x75\x6c\x7a\xda\x35\x4f\x22\xb8\xdd\x26\x16\x65\x75\x54\x09\x63\x29\x8e\x2a\xfb\xb8\x2f\xe6\xc4\x4c\x2d\x5e\x63\x1e\x97\xfc\x97\x6d\xbc\xf8\x42\xb0\x4b\x01\xba\x30\xcd\xe3\x8a\x74\x84\x0e\xfa\x96\x07\x32\x5c\x12\x67\x0f\xbe\x10\x04\x8f\xf3\xb4\x4e\xaa\x09\x46\x83\xfd\xc0\x63\x52\xae\xfd\x61\xad\x9d\xf2\x8c\xd5\x33\x97\xe6\x62\x97\xc6\x45\x6a\x2e\x86\x04\x49\x82\x12\x28\x53\x2e\xf0\xc5\x49\xa9\x66\xfa\x6f\x27\x1c\xdd\x3f\x76\x84\x54\x5e\xc7\xba\x38\x1d\x7b\xd1\x99\x84\x4a\xd5\xcb\x0d\x10\x71\x78\xf4\x18\xfa\x41\x67\x8d\xf7\xec\x32\x0b\x89\xcc\xcd\x4b\x43\x98\xa8\x92\x90\xa9\xbf\x71\x1c\xce\xd8\x9a\x9f\xc6\x9f\x8d\xe1\xe6\xfc\x40\xa8\x96\x9a\xb6\x10\xcc\xbd\x0a\x90\xa0\x25\x80\x52\x66\x73\x1c\xdb\x74\x75\x19\x28\xfd\x35\xde\x6c\x53\x4d\x87\x72\x01\x98\x41\x9d\x2d\xa9\x95\x30\x03\x58\x26\x0b\xe5\x48\x66\xee\x98\x60\x8a\x50\x38\x5e\x19\x4a\x52\x10\xbd\x99\x28\x3f\x60\x20\xad\x6f\x55\x62\x5b\x44\x36\x49\xae\x29\x62\xbe\xa2\x39\x12\x8b\x05\x01\xcb\x74\x97\x03\xe6\xf2\x51\x1b\x1b\xe8\xe0\x93\xec\xbd\x4f\x54\x5f\xb4\x9b\xe2\xea\xd0\x1b\xc2\xa3\xcf\x24\xb9\xe8\xef\x5b\x18\xc4\x44\x3f\x68\x97\x14\x13\xaf\x84\x01\xc6\x52\x71\xb3\x00\xe0\x3a\x2c\xb4\x5e\xe6\x1b\x5b\x38\xe0\x4b\x9e\xb5\x37\xcc\x2d\x06\xa6\x48\x80\xbc\x15\x2c\xa2\xc7\x75\x5c\x61\x15\x0f\x33\xaa\xd8\x54\x0c\x4d\x96\x5d\xf7\x8f\xeb\x04\x2a\xb7\x93\xac\x8a\x93\xcc\x96\x24\x21\xd6\x14\x50\x07\x01\x98\xbb\xf7\x05\xfc\x27\x4e\x7c\x9a\x78\x75\x19\x34\x42\xae\x64\x3f\xa7\x12\x21\xad\xd6\xf9\x23\x94\x97\x2e\xd6\x30\x1e\xd0\xe8\xfb\x3c\x4e\xf9\xbd\x5a\xf3\x72\x28\x75\xbd\x14\x2b\x53\x85\x8e\x97\x1e\x5e\x4b\xfd\xb6\x58\xdd\x03\x92\x36\xac\xf4\xd7\x57\xd0\x9c\xdf\x36\xf9\x52\xfc\x8a\x12\x85\xe2\x34\xf1\xb2\xaf\x66\x95\x96\xbb\xfb\x7b\x5d\x62\x6e\xe5\x08\xbc\x59\xf4\x43\xed\x99\x67\x8e\xbd\x41\xd6\x7e\x92\xd6\x72\x9c\x64\x35\x16\x98\x33\xfb\xe5\xe8\xb7\xcf\x79\xf1\xe5\x15\x20\x89\x91\xd5\x4e\x7b\x6b\x5f\x00\xa3\x65\x59\xdf\x6f\x97\x94\x4c\xab\x7d\x1b\xc6\x96\x6b\xa5\xf7\xb5\x42\x1a\xb4\xb5\xbd\x24\x1c\x33\x9c\xfd\x76\x2d\x0e\x10\x7c\xde\xb6\xc8\x17\x7a\xb9\x2b\x68\x51\x52\x22\xb3\x64\xe2\x37\x7a\xf7\xe1\x97\x9d\x9c\xc0\xd8\xd1\x19\x10\x70\x26\x89\x38\xef\xb0\x9e\x1f\x18\x88\x01\x65\x8c\x4b\x29\x36\x36\x28\x91\x10\xc0\xdf\x0e\xe9\x8a\x62\x49\x94\x71\x56\xa0\xd5\x59\xa5\xb6\x50\xa3\xec\x44\xf5\x62\x22\x5c\xa6\x4c\xa8\xbd\xf7\x28\x6f\x5d\x27\x14\xc2\x44\x2a\xb3\x00\x5a\x9a\xc4\x8c\xea\xd1\xe2\xec\x7e\x17\xdf\x6b\x1e\xa8\xfd\x2b\x35\xcb\xa1\xc3\x7b\xce\xba\xff\x33\x63\x65\xe6\x53\xac\xb9\x57\xea\x3a\xfe\x82\xf9\x70\x77\x47\x73\x15\x9e\x05\x75\xc3\x0c\x9a\xbb\x1e\x4d\x58\xe5\x9a\x4b\x74\x94\x39\x39\x4c\x19\x5c\x44\xa1\xba\xf4\x61\x94\xc0\xc8\x53\xaa\x63\x73\xb1\xd0\xa5\xee\xd4\xf6\xbb\xe6\x5c\xe1\xe2\x78\x28\xe6\x2b\xf2\x2c\x59\xa0\x1e\x68\x86\x65\x31\xb2\x55\x90\x93\x4c\x4c\xb3\xe6\x7b\x9c\x39\x64\x21\x04\xde\xc5\xbc\xca\x17\x79\x5a\x5a\xb6\xc5\xab\xd9\x8d\x69\xd8\xa7\x19\xfe\x7f\xe3\x35\xad\xe3\xc2\x2c\x4a\xf3\x45\xc2\x40\xda\x4f\x4f\x77\xd9\xab\x52\x8d\x74\x05\x0b\xfc\xca\x7c\x64\x0a\x1f\x51\xc7\xa3\xab\x69\x37\x3c\xfa\xad\x9f\x6f\xb6\x49\xea\x36\x83\x95\x52\x94\x4d\xf4\x4a\x09\x71\xc2\xca\xd2\xd1\x61\xe2\x59\x88\xb5\x9b\x30\x1e\xa8\x8f\x97\x9a\xcb\x16\x5d\xcf\x0c\xd8\x8b\x36\xc6\xaf\x29\xa8\x91\x74\xed\xd3\xc3\xcc\x70\x99\x33\x9f\xc9\x8e\x76\x54\x00\x52\x56\x71\x9a\x52\xb1\x0e\x02\xb3\xcc\xa4\xda\x34\x34\xa5\x65\xa9\xa6\x8f\xb9\x1b\x63\xc1\xe0\xc6\x7f\x5c\x10\xc5\x38\x40\x41\xdb\xe6\x21\x10\x24\x72\x8b\x2a\x79\x48\xd0\x67\x1f\xe5\x15\x2d\xcc\xba\x3d\x67\x66\xf7\x7b\x1a\xe8\x25\x8b\xeb\x0f\x13\xa7\x49\x9f\x6a\x1a\xae\xe9\x9a\xd0\x85\x99\x16\x5a\xa8\x79\x41\xff\x65\x16\x9d\x2c\xa8\x84\xd2\xb0\xa4\x5a\x8b\x0a\x58\xb8\x22\xa4\x4c\x35\x56\x97\x7e\xdd\x02\x21\x02\x7f\x9f\xe8\xce\x32\x9a\x3a\xf3\xe5\xdf\x9c\xc1\xfc\x09\x32\xcf\xaf\x0e\xef\xbe\xa3\xdf\x2e\xcc\xe1\x0f\x5e\xed\xb6\xd0\x15\xb5\xb6\xc8\xef\x8b\x98\xab\xeb\x80\x47\x88\x95\xc7\x33\x33\x41\x48\x3a\xa6\x19\xbc\x57\xec\xb2\x8c\xe4\xbd\x13\x7e\x10\x6c\x20\x82\x92\xa0\x6b\x4d\xbb\x52\x0c\x96\xea\xa9\xfa\xdb\x91\xbc\x0b\x38\x5d\xcd\xb2\xd3\x5f\xc1\xdb\x4e\xe5\xa4\x23\x6f\x90\xb9\x03\xb1\x7e\xad\x92\xd4\x9c\x12\xbb\xd2\x78\xb6\x8f\xbf\x81\x78\x51\xf3\x05\x0a\x70\x84\xb2\x98\xa8\xe4\x62\xa2\xc7\xb5\xce\xb0\x7a\x0b\x86\x62\x47\x7b\x48\x03\xef\xcf\x83\x4e\xf7\xa1\xba\xc5\xf8\x12\xcf\x92\x31\x7e\x6d\x49\x9c\xf9\x3a\x1e\x9c\x6c\x3a\xb4\xd4\xa7\xe2\x65\x01\x3c\x63\x62\xaa\x1a\x5d\x01\x99\xd1\x0e\xdc\xd9\x27\x57\xb0\x67\x3a\xe1\x91\x03\x13\xab\xf1\xc8\xe7\xc5\x06\x71\xc8\xf1\x25\x04\x5d\xcd\x2f\xe4\xf5\xfd\xdc\x0f\x71\x0a\xf7\xec\xb6\x62\x6a\x8c\x75\x9c\xa9\x3a\x5c\xeb\x35\x90\x0d\xb6\xef\x0e\x31\x61\x0f\x30\x5b\xb0\xbd\x9c\xdd\x00\x4c\x3b\x7b\xf8\x54\xbe\xab\xcc\x94\x42\xb0\xa9\x5c\xe4\x5b\x28\xe7\x17\x5e\x05\x0e\x53\xbc\x40\x70\x09\xad\x3f\x59\x5b\x85\x7c\x52\x16\x12\x43\x51\x42\xaa\x9f\xc6\xe2\x46\x80\x2a\xc5\x4b\x2d\x63\x22\x28\xd1\x0f\xf5\xc4\x39\xf2\xfb\xe4\x45\xe5\x0b\x6f\x13\x17\x67\x93\x69\x8e\x0e\xc9\x54\x57\x3a\x90\x84\xc7\xc4\xfb\xa6\x24\x3f\x96\x31\xfd\x2c\xfd\x40\x52\xbf\xa1\xf2\x15\xae\x00\xb9\x9a\xb9\x63\x62\xb1\x1f\x1a\x67\x1b\x14\xb5\x05\xf1\xa2\x91\x64\x21\x78\x97\x33\x99\xeb\x71\x59\xee\x36\x4f\x54\x93\x2f\xa0\xbe\x87\x49\x39\x5b\x07\xc0\xbb\x8f\x6a\x17\x0f\x56\x13\x56\x6c\x81\x7d\xc7\x68\x35\x4d\x42\x2c\x35\x52\xe7\x4c\x08\x10\x97\x0a\xf0\x7b\x31\x9d\x54\x7e\x3b\x12\xff\x11\x49\xc6\xa3\xf0\x18\xef\x9d\xdf\xe1\x98\xe7\xe8\x2e\x83\xcb\x01\xcb\xf2\xbc\xc7\xe1\x91\x9b\xf0\x55\x68\xec\x3c\xb8\x2e\xe3\x12\x5c\xd3\x7c\x97\x2e\xb1\xa8\x10\xba\x4d\xcf\x31\xef\x5d\xe1\x02\x77\x03\x51\x1f\x30\x7b\xf3\xd6\x6c\x54\xa4\x58\x24\x97\x21\x66\x8a\xb4\xc6\x4d\xe3\x2f\x02\x72\x99\x03\x11\x24\xb5\x20\xac\x00\x17\x8f\x77\xff\xae\x77\x25\x72\xa2\xe1\xd9\x2d\x57\x88\x9b\xed\x38\x2d\xbd\xe5\x64\xbe\xef\xad\xa5\xd6\x97\x39\x28\xa6\xd7\xdf\xb2\xbe\x26\xea\x4f\x0b\xbd\x7f\x35\x66\x91\xd2\x07\x40\x52\x45\x57\x75\xcb\xa0\x48\xe7\xda\xc6\xd9\x77\xdb\x25\xbc\xd6\xf7\x5f\xc5\x78\xbf\xf3\xc6\xdb\x1c\x27\xdf\x31\xe6\x3c\xba\xe0\xc3\xd5\x57\xf4\xd3\x43\x4d\xdc\xde\x82\x4a\x31\xa0\x28\x39\x0c\x1c\xf6\x59\x7e\xa1\xf9\x38\x7f\x4d\x79\xcf\xf3\x06\x97\x48\x78\xfe\x89\x6e\x7a\x7b\xdf\xeb\x85\x27\xd1\xf2\x14\xcc\x15\x3d\x25\xe2\xb5\xe4\x3b\x58\xee\x7f\x66\xa0\x40\xcf\xbd\x7e\x4b\x43\x44\xdc\x32\x6b\x35\x00\xa6\x68\xb6\x54\x48\x34\xaa\x37\x5b\x4b\x21\x88\x61\x00\x6c\x4b\xa8\xc6\xe6\xb4\x3d\xd0\x71\x3f\x9e\x18\x2f\x89\xc6\x05\x5e\xbc\x61\x33\x14\x1f\x4e\x75\xce\x71\x7b\x4f\x42\xc7\x8a\x31\x58\x35\x3f\x54\x9b\x56\x4e\x5d\xc5\x74\x28\xa8\x42\x6f\xd3\x78\x81\x09\x42\x88\x1f\x1d\x18\x2f\x30\x33\x6a\xa3\xc5\xd6\x8a\x75\x24\xeb\x06\x05\x06\x11\x48\xcd\xfc\x81\x7d\xee\xf6\x17\x34\x0d\x23\xb2\x5f\x76\x25\xc4\x87\x74\xd6\x62\x1a\xf1\xab\xe3\xaa\xfd\xdd\x5e\xf7\x9e\x1b\x19\x9a\x7b\x40\x87\x67\xf1\x66\x9e\xdc\xef\x90\xe0\xbb\xd9\x34\x08\x28\xd6\x83\x42\xee\x46\xb3\x2f\xfa\xe7\xba\x20\x39\xc0\xda\x97\xb2\xdf\x01\x74\xfb\x25\x9b\x1e\xf3\x24\x2e\x75\x15\x27\xa9\xe3\x2f\x04\x3e\x7d\x06\x63\x83\x9a\x3b\xf1\x70\xc8\xf9\x45\x84\xac\x78\x9a\xc7\x2c\xc9\x9e\x3c\xfa\xa6\x64\xc7\x7b\xc1\x3f\x1f\xf3\xed\x35\x15\x23\xce\xc4\x2b\x0a\x6d\x76\xf7\x36\xe6\x9b\x16\x8b\x1d\xf0\x4e\xa7\xf9\x7d\xad\xa1\x3e\x5f\x47\x92\x59\xe7\x8e\xb7\xab\xf7\xa6\x64\x43\x4c\xa2\xcc\xa6\x43\x9e\x92\xbc\x3d\xc0\x63\xaf\xbb\xeb\x60\x09\x52\x30\x95\x1a\x60\x23\x29\x2d\xee\x70\xc0\x67\x13\x61\x8a\xc1\xc4\xfb\xa6\x97\x14\x1a\x22\x2d\xc4\xfa\xb1\x8e\xb3\x65\x4a\x3e\xa9\x2e\x8a\xbc\x28\x03\x4c\xa1\x5a\x2b\xa2\x6d\x3c\xed\x69\x96\x97\xda\xfa\x82\x60\x2c\x10\xa9\x8e\x70\x1d\xd8\x32\xd9\xab\x65\x6e\x1b\x8d\x87\x4f\xcd\x30\x6d\x1c\xeb\x48\x28\x52\xa3\xdc\xb1\x3c\x8e\x40\x0a\xbe\xaa\x1d\xcd\xf6\x6c\x90\x0f\x13\xfc\x86\xc6\x05\xf8\x36\x93\xed\x83\x0d\xc0\xd7\xeb\x67\xc5\x56\xf4\x0e\x27\x30\xc3\xe7\x82\xea\x91\xd8\x6b\xab\x1c\x1f\x0e\x19\xed\xe6\x37\xc9\x8e\xc4\x8a\x31\xa4\xda\x32\x67\x08\x45\x44\xed\xc3\x8c\xd1\xff\x10\xa7\xc0\x09\xd4\x7c\x2e\x32\x4a\xb2\xf5\x01\xbc\x40\x79\xa1\xca\x7c\xa3\x55\x99\x6c\x92\x34\x2e\xf0\xa9\x10\x80\x2d\xf9\xdc\xa0\xab\x23\xc0\x84\x83\x31\x79\xee\xd7\x82\x15\x30\xa1\x84\x0c\x7a\x3b\x9b\xad\x06\x03\xb0\xf1\x5a\x51\x74\xd2\xde\x45\xc1\xa1\x78\x6e\x5c\x20\xb7\x85\x78\x23\x97\xbb\xd5\x2a\x59\x24\x74\x86\xe5\x73\x28\xff\xf8\x46\xdb\x9a\xe9\xdb\x7e\x2f\x0b\xc0\x37\x3c\x1a\xf6\xbe\x6f\xb5\x78\x26\x7b\xfd\x2c\xf0\x0f\x28\x73\x88\xa5\x69\xcb\xd6\xf2\x5e\x48\xf9\x6f\xff\xb1\xbe\x24\x00\xb9\x0d\xef\x03\xeb\x37\x90\x11\x42\xc8\x17\x06\x11\xb4\xee\xa9\x3f\x23\x87\xa5\x34\x61\x90\x02\x99\x86\x4d\x2a\x2e\x6c\x8b\x7c\x9d\xcc\x93\x0a\xdb\xb4\x86\xa3\x98\x42\xfd\x18\x3a\x45\xf4\x8b\xae\x15\xad\x13\x27\xce\x46\x57\xeb\x7c\x19\x70\x98\xca\x2d\xf8\x32\xb7\x16\x0d\xa3\x44\xf0\xca\x5b\xc4\x29\x1e\xf5\x75\xc3\xd6\x66\x1d\xda\xef\x72\x74\x59\x6a\xc3\x7d\xd8\x94\xf6\x9c\xaf\xb7\x81\x60\x00\xfb\xb9\xe9\xc2\x56\x35\xfe\x60\x7f\x86\x33\xd3\x58\xe0\x07\xcf\x90\x80\x03\x97\x36\x99\x20\xde\x97\xa1\xfd\xde\xb7\x8f\x5b\xa2\xbc\x9c\x55\xcd\x38\x06\x8d\x00\x13\x8e\xb7\xc0\x86\xb6\xd1\x2c\x1a\x47\x7e\xa7\xa0\xa0\x4e\xe3\xaf\xe6\xa1\xd9\x2e\x4d\x8d\x05\x0f\x77\x04\x53\xed\xb5\x14\x4b\xc1\xf1\xbc\xd5\x05\x56\x5d\x31\x05\x59\xb9\x4b\x71\x91\x8a\x70\x0f\x06\xc7\xcd\xeb\x51\xa5\xe9\x54\xd8\x83\xbd\x56\x7f\xbc\xe9\xf6\xc6\x2d\x1c\x76\x7e\x54\xcb\x62\x8b\xd0\xfc\x01\x86\xf8\xc6\x4e\x48\x93\x92\x35\x10\x68\x43\xf0\x7e\x48\xb2\xda\x2e\x60\x0f\x03\xce\xb7\xa4\x72\x23\x85\x9c\x87\x39\xbe\x81\xbb\x2d\xea\xc6\xec\xcb\x6a\xda\x24\x35\xba\xb4\x27\xf7\x7d\x33\xdb\x19\xb4\x2c\x06\x28\x37\x73\xd7\xa3\x3d\x0e\x6b\xf5\x62\xce\xc8\x71\x56\x2b\x18\xf6\x18\x09\x74\xbc\x71\xbc\x63\xbc\x97\x34\x7a\x6a\xab\x99\x5a\x46\x51\x04\x94\xd8\x66\x6b\x3a\xf4\x67\x67\xb5\xd4\x39\xdc\x32\x25\x86\xa9\xc4\xf3\xf3\x8c\x72\xbf\x68\x18\x15\xda\x4f\x67\xbb\x49\x32\xad\x83\xe9\xa9\x1a\x4f\xa5\x3a\x3a\xff\xa9\xf1\xfd\xbd\x99\x6b\xc4\xbe\x41\x00\x1a\x5e\xe3\x27\x9b\xec\x89\x14\x67\xb4\x6e\xcf\xbf\x55\x76\x26\xc0\x52\x6d\x59\x24\x17\x80\xb8\x0d\x9b\xf8\x60\x43\x0a\xaa\x20\x42\xde\x79\x68\xc4\x18\xb9\xac\x7d\x55\x18\xa7\xa3\x77\xe7\xe5\x21\x67\x22\x5a\x6e\x69\x18\xbc\xe0\x9d\x22\xfe\x26\x30\xf1\x1d\x69\x10\xd9\x5e\x8e\xd7\x2d\xa0\xeb\xc5\x0f\xa4\xf3\x2a\x13\x82\x4c\xbf\x99\x13\xb4\x7c\xe5\x82\x2c\x6d\xf4\x0f\x36\x15\x47\x54\x55\x54\x00\x0f\x06\xef\x52\x98\x9e\x08\x75\xf0\x4d\x4f\x6c\x09\x7d\x56\x28\x0e\x98\xe7\x6f\x74\x61\xd6\x57\xc5\x19\x66\x10\xf6\x48\xaa\xcc\x1c\x71\xe8\x22\xba\x88\x29\x53\x54\xe1\x25\x46\x90\xd3\x22\x29\xe1\x0e\xa0\x75\xf4\x9f\xbb\xd8\x3e\x87\x98\x18\xb9\xc6\x5e\x86\x20\x61\x62\xf6\xf9\x2e\x54\xd3\x35\x04\xbb\xec\x1f\xcd\xf8\x00\xb9\x32\xb2\x35\xa2\x99\x80\x61\x45\x3a\x16\xf0\x88\x00\x32\x38\x0b\x49\x2c\x75\xf1\x90\x2c\xa0\xff\x85\xde\xc6\x49\x11\x60\xad\x65\x51\xe0\xc1\x1b\x1e\x0d\x32\x33\xa5\xb8\x72\xc8\x82\xb6\x54\x98\xf3\x46\xfa\xd5\xf4\xfc\xbe\xd0\xb8\x3f\x04\x57\x1f\x10\x54\xcd\x5a\xe6\xd5\x56\x18\xa2\x1b\x01\x75\xa3\x4b\x17\x53\x38\x98\x6f\x92\x9c\xd7\x05\x49\x68\xd5\x8d\x22\x11\x12\xdf\x7b\xf7\xae\xab\x0b\xa6\x53\xc3\x23\x77\x33\x03\x67\xa6\x90\x48\xd5\xa4\x7f\xf2\xcf\x33\xb3\x11\x24\xd1\x3c\xa8\x2e\x0e\x91\x17\xfc\xd7\x24\xe3\x65\x55\xe5\x96\x7e\x8c\x6f\xdf\x27\x17\x6c\x9a\x97\x30\x56\xcb\xb8\x8a\x03\xf8\x5f\x4a\xed\x17\xe6\x68\x28\x60\x68\xd9\x6d\x0c\x90\x9b\xac\x2c\xb5\x31\x65\x4b\xb0\x33\x98\x1b\xd0\xb8\x29\xe0\xbf\xe3\x85\xca\x4d\x5e\xc5\x49\x2a\xbc\x62\x3e\x9e\x91\x21\x42\xbb\x12\x6e\xd6\xbe\x83\x5c\x56\xd9\x0d\x2c\x36\xa8\x75\x6b\x1b\x9b\x3f\x4e\x96\xbc\x04\xf8\x9f\x72\x7a\x6d\x24\x3b\x5e\x82\x94\x8f\x2d\x12\xcd\xcb\x32\x71\x20\x0f\x38\x4b\x69\xc8\xc3\xa3\xeb\xde\x60\x34\x8b\x46\x2c\xdd\xc8\xfc\xcb\x87\x12\x30\x47\x96\x26\x7d\x4d\x16\xac\x39\x9b\x76\xa5\xfa\x0d\x1b\x76\xc2\xf0\x13\xbd\x7c\x75\xb0\x2f\xc2\x87\x44\x24\x38\xc5\x05\x5c\xbc\x2c\xd3\x31\x29\xd6\x11\x04\xad\x11\x39\x4b\xea\x5a\x2e\x2e\x11\x1a\x67\x98\x9e\x98\x3b\x30\x8c\xb0\x1a\xdb\x06\xd6\x1c\x5f\x7b\xeb\xb2\xb4\x74\x25\x3c\xdc\xef\x66\x87\xf1\x8c\x8f\xdb\x0c\x54\x56\x68\x23\x12\x3e\xb7\x8b\xbd\x7e\x60\x8e\xc9\x1c\x07\xc4\xd2\x47\xa9\x18\xf4\xe3\xc9\xcf\xaf\x69\x56\x1c\x7b\x88\x8e\x39\x46\x0e\xd0\xb6\x8b\x89\xae\x54\x9b\x1e\xa5\x2a\x5e\x2e\xcd\x21\xdf\x0d\xd5\xa0\x72\xa9\x28\x3a\xad\xf8\x99\x2d\x6d\x07\xec\x8f\x63\x51\xc9\x21\x93\x6d\x35\x1d\xcb\x5a\xeb\xc4\x88\x79\x36\x46\xdb\xb0\x55\xb9\xfa\x6d\x97\x1d\x1a\xc8\x2c\x6f\x69\x8d\x55\x29\xa2\xcc\x35\xdd\x90\x18\x3c\x3f\xec\x1c\x3e\xd2\x02\x21\xb2\x4a\x00\xe5\x83\x69\x5a\x90\x83\xac\xc5\xd4\x58\x31\xaf\x1a\xad\x27\xde\x5c\xa0\x41\x0a\xfb\x29\xf9\xaa\x36\x79\x56\xad\x59\xb0\x4c\x92\x97\xe2\xfe\x94\x68\x18\xf3\xdf\x68\x7b\x23\x63\xb0\x20\x8b\x41\x4c\x24\x06\x56\x8d\xf7\xf4\x0d\x9e\x2e\x1c\x45\xb6\x30\xc3\x9e\x2d\x56\x4d\xb3\x7d\x1e\xab\xf8\x8b\x56\xb9\x8d\xa3\x16\x79\xaa\xc3\xa3\x81\x7f\x8b\xca\x09\xc1\x8b\xf2\xfb\x1a\x26\xc7\xd4\x45\x71\xca\x4a\x6f\x51\x10\xeb\x2c\x54\xd7\x00\x90\x93\xb2\x15\x71\x55\x41\x14\xbc\x02\xc5\xb4\xc5\xc1\x17\x1d\x33\xd2\xb4\x79\x55\xd2\xa1\x53\x3d\xe6\xe4\x8c\x74\xbd\xa6\x38\x85\xb6\x8c\xc0\xf2\xba\xa2\x33\x00\x62\x29\xa5\x8e\x8b\xc5\x9a\xb3\xa8\x03\xf2\xa8\xf0\xb7\x18\xcf\x80\x10\xcd\x6a\x97\x52\x18\x47\x67\xa8\x0a\xc4\xf2\x6a\x72\x0c\xcb\xca\x5c\xe9\x6e\x1c\xfd\x10\x3b\x7a\xb6\x78\xf5\xc8\xb1\x86\xc7\xc6\xe5\x97\x27\x36\x22\x7a\xd1\x94\xe6\xf3\x97\x27\xdc\x67\x84\xd5\x30\x37\x14\x2c\x4d\xdf\xab\x81\xe3\xcb\xf6\x68\x97\xb9\x3e\x81\x6b\x99\x33\xbf\x32\x9c\x3c\x60\x1c\x35\xd7\x2a\x78\xb3\xf1\x17\x9d\x1d\x76\xc7\xb9\x27\x59\x96\xef\xb8\x60\x82\x8e\x3b\xe3\x91\x62\x28\x98\x1a\x5f\x51\x32\x0a\x9e\x6f\x09\x59\xed\x32\x95\x9b\x44\x1d\xd7\x56\x2a\x23\x72\x1f\xc9\x17\x84\x00\x98\xb1\xfb\x8c\x8f\x9a\x67\x3a\x50\xf5\xb3\x71\x9b\x97\x4c\x80\x6a\xcc\xa7\xb0\xd2\x5f\x2b\xf3\x3f\x61\x97\xc6\xe9\x4d\x6c\x07\xaa\x3d\xe5\x02\x27\x07\x2e\xd9\x6c\x89\x3b\xb0\x44\x7d\x92\xb2\xac\xf3\x3f\x49\x2b\x60\x9f\xef\x68\x58\xa0\x9d\x15\x90\xf0\x72\x31\xcb\x06\xf4\xef\xa0\x48\x87\x14\x05\x70\xe4\x36\x82\x87\x79\xfe\x4c\xc3\xf0\x34\x97\x8d\x6b\xbd\xf5\xb8\xc5\xc8\x63\xdc\xde\x5c\xc0\x49\x97\x44\x1f\xf2\xcf\x35\xdc\x65\x87\x09\x14\xab\x7e\x73\x33\x2d\x3f\xfd\x0a\xf2\xe9\xba\x5c\x14\xc9\x1c\x6f\xc7\xf3\x79\xc8\x81\x2c\x33\xd2\x20\x74\x53\xad\x0b\x4d\x2b\xbb\xac\xaf\x1b\x33\xfb\xeb\x38\x4d\x75\x76\xaf\x97\x96\xaa\xf6\x70\xcc\x28\xcb\x8b\x83\xb6\x01\xfd\x8d\x8c\x2c\x9d\x33\x5a\x32\xb3\xf1\x45\xd2\x21\xf6\xef\x62\x4b\xae\x0d\x4d\x28\x73\x72\x61\x80\x53\x10\x3d\x0e\xf8\xec\x71\xa6\x1f\xbb\x2d\x4d\x12\xf9\x5d\x34\x81\xac\x40\xac\xf1\xac\x79\x6a\x5b\xba\xc2\x31\x37\xf7\x21\xe3\xe8\xa3\xb8\xa6\xdd\x7c\x62\xe4\x20\xe2\x8d\xcd\xb4\x0e\x6f\x2b\xbc\xe2\xcd\xbc\x6b\x4e\x86\xb7\x5d\xbb\x04\xe2\xaa\xad\x01\x10\xea\xa0\x2b\x02\x4c\x81\x0d\x93\xfd\xb4\x05\xeb\x24\xf5\xad\xcc\xc7\xee\xf1\x25\xdf\x7f\xc6\xf5\xb8\x33\x87\x5f\xca\xf1\xa1\xc0\x05\x5a\x02\x92\x01\x84\x8b\x2a\x5e\x54\x4d\x22\xe4\xb6\x98\x8f\x56\x50\x14\x62\xa3\x46\xb4\xbc\xbf\xf9\x7e\xc4\x2b\xb5\x44\x07\x55\x6e\x20\x1a\x89\xa0\x8e\xb7\x0b\xbc\x0c\x5a\x2d\xb7\xe8\xd2\xbd\x16\x4f\x4e\x86\x56\x5c\xb6\xad\x30\x48\xbd\xd0\xcb\x01\x32\x61\x0f\x69\xf8\x6e\xa6\x1f\xf9\xfb\xe4\x7a\x43\xde\xa1\xed\xd4\x06\x63\x56\x9d\xcf\xbb\x1c\x6c\xfd\xc7\xaa\x15\xbe\x07\xf0\xe5\xbb\x23\x70\x3b\xe3\x7d\x65\x73\x80\xc9\xc6\xd8\xa0\xc6\xda\xfa\x57\x55\x3d\x18\x3f\xbe\x74\x79\x3f\xd0\x79\x47\xbb\x1b\x13\x9a\xbf\xed\xf3\xdd\x2b\x1b\xa0\x2a\x39\x90\xd0\x5f\xe7\x39\xb8\xc0\xb3\x9a\xf4\x64\x8f\x92\xa4\x5c\xb2\x74\xf2\x8d\x3f\x66\x5d\xae\x04\x0b\xbb\x5f\x6e\x00\xa5\x03\x66\x98\xcc\xb5\x4f\x01\x09\xe3\x4a\xff\x77\x99\x18\xfb\xef\x32\x5a\x0a\x7b\x03\xed\x2a\x69\xd5\x3a\x48\x50\xce\x4c\x89\x7e\x50\x54\x67\x9c\x5f\xf0\x35\x2c\x6d\xa8\x3a\xdb\x13\xc4\x37\x13\xed\x9b\xef\x20\xf3\x59\x56\x3a\x5e\x06\x32\x6c\xe1\x3e\x72\x30\xf0\xec\x30\x41\x96\x9b\x5c\x7f\x6d\x96\x3a\x72\x02\x5e\x83\xb8\x08\x3e\x38\x7f\xcc\x5c\xdb\xa9\xba\xa7\x10\xc5\x91\xb0\x6d\x6a\x7d\xa1\xf3\xc0\xe3\xfa\xb6\x1a\x82\xc9\x06\xe2\x6a\x36\x2f\xe6\x55\xff\x1c\x3e\x5d\xd0\x87\x72\x05\x13\xdf\x55\x1d\x61\x9c\x6c\xd8\x0c\x98\xc6\xa9\x40\x10\x3e\x37\x16\xfc\x3a\xc9\x96\x2d\xc9\x27\x7f\xfd\x0e\x2a\xfb\x84\x9a\xfd\xf4\xb8\xde\xfb\x5b\x01\x5f\xee\x9a\xfe\x71\x74\xab\x3e\x62\x00\xa8\x51\x5f\xf6\xf1\x66\xd8\x55\x8f\xb1\x87\x13\x4c\xb2\x78\x8b\x44\x56\x71\xa5\x01\xa1\xf0\x4c\x89\x14\xbc\x10\x03\x8f\xae\x7e\xdc\x8c\x47\x6d\x84\xcc\xe4\xa3\x09\x0e\xbe\x5e\xaa\x1f\xe2\x8c\x52\x5e\xbc\x31\x31\x1e\x4c\xb6\xa0\x8f\x1b\xab\x6d\x6f\x90\x2e\xe0\x45\x53\x68\xa5\xb3\x45\xbe\x2b\xe2\x7b\x96\x30\x8f\x01\x28\x79\xd4\x53\x13\xef\x58\x51\x79\xa6\x64\x05\x87\xfa\x4c\x81\x58\x99\x8e\xfa\xe6\xed\x5c\xdb\xdb\x15\x86\x3b\x4b\xad\x10\xf8\x5b\xe5\x1c\xc9\x3b\x80\xbe\xa1\x20\x93\xb7\xd2\x6d\x9d\x2d\xc8\xa9\x5b\xa2\x60\x73\x2b\x88\x9a\x1e\x4b\x91\x67\x97\xcc\x2a\x2f\x9a\x7a\x44\xcd\x14\x71\xa8\x3e\x43\x7d\x10\x58\x4c\x24\xa3\x64\xc6\x1c\x77\x42\x8b\x82\x34\xaa\x49\x40\x7f\xfc\x24\x93\xb9\xb3\x2b\x36\x40\xe1\x53\xeb\x78\xbb\x45\x0f\x24\x5e\x60\x78\x51\x9d\x9c\x58\xdb\x6c\x95\x17\xf7\xba\xb2\x3b\x0e\x53\x42\xb6\x81\x7e\xd6\xf1\x03\x44\xbc\x2b\x27\x22\xbc\x58\xec\x0a\x0e\x74\x22\x32\x9a\x5d\x58\xd8\xdf\x25\x86\x43\x08\x7b\xde\xac\xeb\x72\x6f\x45\x38\xe4\xae\xf4\xc7\x2a\xc1\x2b\x9c\x24\xf4\x69\xf0\x0e\xef\x47\x08\x13\xc7\x7b\x0b\x33\xb3\x10\x4e\x14\xd3\x80\xf0\xbb\x28\x98\x09\xcc\xca\x35\xb3\xb9\x80\xc4\xcf\xb6\xc8\xe7\xa9\xde\xb8\x88\x91\xbd\xbe\x39\x06\x04\x31\x8b\x55\x0e\xa5\x4f\x3b\xc0\xcf\xf3\x39\x3c\x47\x6e\x04\x22\x49\xa8\x72\xd4\x52\x6d\x05\x0e\x8a\x5c\xaf\x4d\xd2\x90\xb6\x44\x9e\x69\xe3\xee\x53\x2d\x94\xad\x60\xa0\x3e\xe5\x56\x15\x18\x0e\x34\xbd\x8e\x1f\x92\xbc\xf0\x4b\xf6\xdc\xba\xac\x08\x82\x01\x50\x68\x40\x60\x5b\xa1\x0a\x17\x0b\x0f\x8f\x3e\x61\xb9\xda\x6d\xa9\xbd\xcb\xf4\xd0\x56\x3b\x9a\xe5\x8d\x4a\xd4\x80\xb2\x53\x49\xa6\x1c\x7b\x43\x3d\xe2\x2e\x6e\xab\x1c\xa2\x2f\xae\x06\xa2\x25\x68\xc9\x41\x72\x34\xb3\x8c\x51\xc5\x2e\xda\x9e\x43\x9e\xd8\x5d\x73\x2f\xc1\x19\x85\xe8\xf0\xd7\x79\xa1\xd2\xb8\x04\xf5\xe8\xd2\x58\x36\x09\xcc\x12\x2f\xbb\x50\x0d\x58\xc7\x1b\xac\x39\x61\x0f\x5a\x6b\xf6\xdb\xa0\xf0\x75\x5c\x1e\xb2\x1f\x78\x21\xd4\xa7\x92\xa7\x9f\x38\xfa\x99\xf1\x85\x21\xca\xbe\x04\xab\xa6\x6d\xdf\x2f\x47\x7f\xfa\x93\xda\x26\xf7\xe1\xb2\xfa\x6a\xfe\xd3\xf9\x60\xe7\xa7\xa7\x6f\xd4\x75\xa8\xee\x42\x35\x8a\x37\xfa\xe8\x4f\x47\x7f\xc2\x99\x7c\xa2\x48\xd4\xf5\x49\x5e\xa6\x47\x7f\x6a\x6c\xad\xa7\xeb\xa0\x65\x6d\x1a\xd7\x7c\x1f\xfd\xa9\xb1\x29\xf3\x42\x1d\xf3\x6d\x9e\x03\xbc\xb2\x8b\xd7\x44\x5c\xb9\xef\x86\xd0\x6c\x0d\xbf\x2c\xab\x06\xc4\xcf\xcb\x4d\x1e\xfd\x89\xb5\x3c\x1e\x1f\x1f\x43\xf3\x8d\xaf\x27\x5b\x6c\x21\xa8\x79\xa4\xdb\x6d\x1a\x56\x5f\xab\xa3\x3f\x11\x0f\x82\x6d\x1d\xa4\x29\x62\x2a\xbd\x60\x43\x2f\x46\xbe\x07\x9f\xa2\x15\xfa\x7d\xf4\x27\xfb\x65\x33\xcc\xaf\xcf\xce\x5f\x9f\x9e\xd9\x67\x84\xb5\xb1\xe6\x90\x37\x58\x38\x32\x5a\x40\x3e\x42\xc7\x45\xaf\x3a\xe2\xbb\x87\x1c\x20\x7e\x6c\x52\x8a\xe9\xad\xbf\x93\x74\xbf\xed\x74\xad\x92\x54\x97\xbc\x50\x30\x6d\x90\xdc\x87\xc6\xbe\xf9\x93\xdd\x42\xb6\x82\xd2\xdc\x37\xe6\xcf\x65\xb5\x0f\x8f\x3e\x26\xe6\xca\x7b\x62\x09\x22\xcd\x0a\xd6\x24\xd6\xd6\xf7\x3d\x7c\xb7\x9e\x47\xb6\x16\x19\x62\xe9\x01\x44\x11\xb8\x33\x8f\xea\x46\xc1\x38\x2c\x84\xce\x0e\xfa\xde\xd8\x91\xdf\xa8\x27\xaf\x02\xfc\xcf\x24\x2b\x5f\xa1\x65\xf2\x1b\x35\xfc\x95\x3a\xae\x60\xd9\x80\x4b\x6d\x1e\x53\x03\x2c\xd9\x47\x50\x39\x9b\x7d\x0e\x7a\xe9\xaa\xa5\x74\xca\x6b\x92\x59\xa9\x7e\x89\x0e\x36\x00\x8e\xb1\x96\x22\x2d\x68\x5c\x5b\xf9\x58\xa3\xa3\x14\x93\xff\xcd\xcd\xee\x2b\xeb\x20\x93\x17\xf0\xc8\x82\xc2\xd7\x72\x39\x69\x5b\x80\x0a\x4b\xad\xca\x2d\x1a\x09\x37\x19\x15\xdb\xa1\x93\x2f\x57\x1d\x59\x27\x50\x31\xd8\x69\xa4\x6f\x3a\xa1\xfa\x64\x45\x31\xb5\xf3\xfb\xdc\x25\x6d\x4e\x7e\xff\x79\xe5\xc1\xd6\xc1\xd1\xbc\x5c\x62\x74\x0a\xb9\x6a\x80\x5e\xb7\xb4\x45\xa6\xb6\xad\x14\x01\x01\x74\xf3\x6a\x97\xf2\xf8\x38\xef\x19\xac\xb1\x47\x0e\x28\x2d\x62\xc8\x23\xa7\x79\x76\xcf\x31\x4f\x40\xcb\x21\x95\x12\x20\x2a\x13\x7c\x7a\xa9\xd3\x55\x78\x34\xb0\x6e\xae\x6f\x73\x96\x87\xed\xc9\xa3\x4b\xbd\xc2\x82\xde\xcf\x58\x87\xe2\xab\xb8\x99\x46\x23\x4b\x84\x19\x7f\xca\x0a\x59\xaf\xaf\x76\x92\x54\xa2\xf4\x10\x1b\x4a\xe5\x28\xb8\xc4\xbd\x52\xba\xba\x99\xe1\x3c\x74\x3b\x07\x16\xf6\x0a\x65\x2f\x4e\xc1\x0a\xf6\x1c\x24\x9d\x2d\x1b\x11\x55\xf9\xe3\x7b\x84\x6c\xb2\x7b\xdf\xcc\x46\x81\xeb\xd1\x5f\xcd\x15\xec\x70\x9f\x89\x54\x64\x4a\x29\x93\x83\xbd\x70\x59\xc9\xc6\xc5\x9e\xaf\xd0\x42\x80\x93\x07\x83\x86\xb8\x29\x63\x95\x9a\xf6\x52\xc5\xec\x2f\x07\x8f\x38\xf3\x52\x7c\xa1\x03\x3f\x6d\xe2\x2c\x59\xe9\xb2\x32\x27\x7e\x78\x94\x90\x4d\x09\x26\x09\x94\x9b\xa1\x55\x5e\x6a\x2b\x33\xa0\x76\x19\x60\x49\x73\x63\x82\x81\x9c\x8a\xb1\x68\xa1\x9d\x28\xf8\x9e\x53\x25\xf0\x73\x83\x1b\x57\xb5\x52\xae\xf9\x1e\x09\x0e\x30\x5e\x5e\x24\x32\xdd\x0e\xf6\xa6\xab\x59\x5a\xc4\xe4\xf1\xbb\xa7\x3f\x72\x34\x1e\xc4\x64\x09\x69\x0a\x81\x60\x91\xfa\x59\xe4\x99\xb9\xe7\x76\x66\xbd\x61\xbc\xd4\x9f\xe4\xda\x6b\xbf\x43\x40\x21\x7c\x3d\xca\xbf\x24\x7f\x1c\xf7\xcf\x7f\x7b\x96\xff\xe7\xdd\xe9\xbb\xf7\x0d\xfe\x9f\xd3\xd3\xf7\x2f\xfc\x3f\x3f\xe2\x07\x66\x5f\x8d\x8d\xa7\x38\x45\x7e\x7a\x1b\x8e\x18\x8d\xff\x3a\x9e\x5a\x19\xda\x23\x47\xf1\x73\x1a\xab\xb3\x50\x09\x42\x89\xf0\xa8\xd3\x5b\xad\x92\x34\x31\x66\x5c\x07\x43\xe7\x08\xbb\x40\xb2\xac\x8d\x8e\x01\x32\x0a\x4b\x7c\x7f\xa4\x94\x8a\xbb\xb4\x82\x65\xc9\x3a\xe0\x41\xed\xbf\xc8\xed\x49\x2d\xc4\x0d\x9e\x08\xa0\xea\xb9\xf8\xb6\x0b\xad\x40\x18\x96\x0a\x6e\xc4\xa3\x1c\xc5\x9d\x65\x81\xcf\x53\x5b\xb8\x8d\x0f\x55\x79\x61\x9e\xbb\x78\xbe\x55\xe6\x61\x4b\xf1\xa0\x54\xf0\xa7\x91\xa4\xfc\x15\x1e\x20\xc6\xb7\x44\xd8\x16\x84\x54\xa9\xf3\x8e\x3e\xac\x2a\x34\x97\x90\xa3\x09\xe3\x3f\x91\x2b\x3f\x12\x72\x3c\xf0\x5f\xf4\x10\x63\x74\xae\x92\x55\x05\xf0\xd5\x85\xb1\x39\x8e\xdf\x9d\xfe\x09\xf2\x10\x90\xd0\xa0\x83\xf9\x21\xa7\xfa\x2a\x2c\x3f\x87\xef\x82\xae\x01\x23\x95\x68\x84\x8c\x9f\x18\xaf\x56\x71\x52\x38\x4a\x09\xdf\xef\x04\xb7\xa7\x4c\x1c\xa1\x52\xa9\xe6\x79\x5c\x40\x8e\x1f\x1f\x92\x23\xcb\xbe\xc0\xeb\xcf\xf3\xe5\x3e\x3c\xea\xf4\xcd\xe5\x5b\x2c\x92\x38\x35\xfe\x66\x47\x2e\x09\xbf\xc4\xc0\x57\x02\xfc\xc2\x8e\x7f\x9f\x0a\x8e\xa7\x2c\x51\xe0\xb8\x24\xa0\x5e\xcb\x93\xf3\xef\xf4\x1d\x47\xbb\xf7\x2a\xac\x18\xc7\xd1\x43\x47\x0e\x86\xdf\x57\x06\xd0\x36\xa4\x8f\x15\x79\xd8\x59\x19\xa1\x2a\xfd\x57\x30\xef\x95\xf7\xaa\x24\x83\x73\x9e\x21\x4f\xf2\xe3\x34\x94\x73\x4f\xcd\x5b\xab\x31\x97\xbc\x70\x1f\x03\x62\x80\xf4\x5e\x8d\x40\x4c\xb3\x34\xe4\x33\x2d\xae\xa2\xf6\x61\x2e\xcb\xc0\x7b\xd1\x41\x09\x65\x73\xcc\x37\x45\x6b\xf1\x2c\x30\xb6\x0a\xe9\xba\xb6\x37\x4e\x2a\x7a\x48\x6c\x1b\x82\x19\x8a\x8d\x59\xd1\xd1\xd7\x85\xde\x55\x28\xfc\xdb\xa9\xcf\xa0\x37\x5a\xed\xaf\x68\xf4\xfd\x3b\x06\x0f\xba\xe5\x7d\x3b\xb0\x51\x0a\xe8\xaa\x6b\x32\xb1\xaf\x90\xf1\x95\xaf\xc2\xa3\x4e\xe4\x58\x43\x3c\x50\xfc\xb5\x36\xa6\x75\x52\x6e\xbc\xd6\xc7\x6a\xc3\xbf\x67\x5c\x5f\x0a\x01\x37\xbd\x15\x00\x26\xab\xae\xb1\xd4\x0f\x3a\xcd\xb7\x1b\x3f\x4d\xc4\x16\x87\x20\x2c\xb1\x34\x24\x04\xc5\x33\x0d\xfb\xaa\x17\x38\xa4\x5e\x0b\x1a\xdb\xc3\xd3\x5b\x71\xc5\xfe\x74\xba\xf7\x41\x14\xa4\x03\x53\xed\x3d\x07\x27\xbf\x9f\x17\xdb\xbc\xb0\x2a\x1d\xb0\xd1\xdd\xd1\x1e\x1e\x75\x86\x71\x61\xec\x6f\x63\x65\xd4\x06\x02\x11\x06\x78\x7e\xe2\x34\xe9\xb2\xd9\xba\xbc\x68\x0c\x3a\x3a\x87\x20\x8b\x62\xbc\x1f\x49\x31\x59\x1d\x92\xbe\x36\x2d\xc1\xff\xaa\x2d\x26\x73\x72\x93\x07\x6a\x3f\xd3\x18\xb3\x75\xfc\xc0\x0b\xd6\x96\xd9\x83\x56\x78\x60\x29\x38\xe3\xaf\x92\x82\x93\x8d\xc3\xc0\x22\x59\x28\x6e\x04\x82\xa4\xb4\x10\x93\x2c\x01\xc4\x26\x3c\x09\x60\x33\xbb\x39\x01\x39\x61\x4d\x20\x8a\x2c\x40\xb0\x2a\xb1\x3d\xb2\xde\x37\xca\x53\x2c\xf2\xec\x41\xef\x49\x81\x39\xc9\xc2\xa3\x8e\xb7\x8c\xfd\x01\x17\xfa\xcb\x00\xa1\x2c\xd4\x52\xa7\xba\xb2\xe2\xca\x15\xd2\xcf\x96\x15\x62\x17\x0a\x85\xc9\x3e\x42\x5f\x0a\xa5\x95\xd6\xdd\x87\xf4\x40\x98\x5c\xaf\x9d\x80\xea\xb3\xf1\xc9\x9a\xeb\xae\x64\xed\xfe\x25\x26\x8e\x4a\x5d\x10\xd6\x19\xcc\xd4\x40\xc5\x7e\xb0\x3f\x41\xac\x53\xdc\x05\xde\xa6\x67\xfb\x62\x4e\x69\x8e\x2b\x36\x29\x98\x5a\x3b\x71\xa0\x03\x64\x42\x98\xb7\x66\xfa\x51\xd4\x56\xba\x3a\xc9\xcc\x27\x70\xf8\xae\xa7\x77\x1a\x9f\x6e\x1c\x78\x62\x33\x32\x2d\x0e\xf2\xf3\xf0\xe3\x61\x37\x38\x5b\x44\x62\x3e\xea\xdf\x27\x2f\x4b\x62\xaa\xa3\xaf\x50\xc0\xa4\x7a\x66\x22\x5a\x2e\x17\xcb\x0b\x18\xd4\xd7\x71\x52\xd9\x59\x6c\x21\xf0\x72\x2c\x8a\x85\x8e\x97\xfb\xe6\x1a\xf0\xf7\xae\xb7\x5d\x6f\x62\xd8\x49\xfd\x34\x4e\x36\xcd\x95\xbc\xc5\xbf\x82\x7c\xe5\x71\xd9\x0d\x54\x96\x3f\x3a\x5b\xcb\x6c\x07\x04\xb7\xb8\x5d\xf4\x94\x00\x76\x60\xab\xb0\xa8\x6a\x87\xf2\x5a\x5b\xe0\xf9\xdd\x95\xf8\x1e\xbc\x16\xc4\xdb\xdd\x69\x61\xda\x0f\xdb\x38\x2f\xc2\xa3\x8e\x18\xed\xc6\x4c\x6e\x31\xc0\x83\xe8\xd0\x8d\xab\x6d\xab\x0d\xcc\x0a\xca\x29\xc0\xa6\xf1\x13\x3a\x55\xae\x92\xff\x8f\xbd\x7f\x5b\x6e\x23\xc9\xd6\x04\xe1\x7b\x3e\x85\xff\xb4\xdf\x4c\xa4\x59\x08\x29\x52\x99\x59\x95\x52\x5b\xdb\x40\x64\x50\x42\x15\x08\xb0\x00\x30\x95\xec\xb1\xb1\xee\x00\xe0\x20\x3d\x15\x08\x47\x86\x47\x90\xc2\xbe\x9a\x77\xe8\x17\xa8\xcb\xad\x9e\x27\x18\xeb\xbb\xa2\xcd\x8b\xcc\x93\x8c\xf9\x3a\xf8\x21\x22\x40\x52\xb5\xb3\x32\x77\xf5\x26\xad\xac\x2c\x45\x02\x11\x7e\x58\xbe\x7c\x1d\xbe\xf5\xad\xa8\x82\x95\x68\x11\x81\x09\x57\x79\x91\x4c\xc4\x26\xaf\x51\x30\x03\x72\x31\xc8\x3d\xac\xb2\x05\xe0\xf6\x41\xff\xd8\x13\x83\xa7\xcd\x8a\xcc\xa6\x32\xae\xc7\x11\x9b\x73\x48\x46\x10\xa8\xf8\x90\x48\x09\x5d\x65\x7f\xd5\x24\x58\x4f\xe9\x1b\x57\xb9\x54\xb2\x22\xe2\x9d\xac\x54\x50\x07\x9b\x5d\xdb\x61\x56\x4f\x50\x2c\x78\x29\x01\x49\xe1\xa7\x42\xdf\x15\x49\x60\xd1\xb5\xef\x0b\x5e\x50\x67\xb5\xbc\x30\x62\x71\xa3\xd5\x82\xaa\x21\xc2\xa3\x40\x65\xf7\xae\x88\xd2\xd7\x6b\x64\xe5\xe2\xc6\xda\xa5\x64\xb4\x44\x0c\x07\x41\x82\x55\x2c\x25\x7f\x8f\xfb\x27\xc9\x97\xf8\xdd\xb8\x17\x99\x11\x77\x6a\x29\xad\x5a\xf7\xc4\x66\x08\x0f\x5c\xdc\xd8\x1b\xb2\xb7\xb7\x7f\xa5\xeb\x7d\x71\xa0\x4b\x61\xff\xab\xdc\x3f\x6c\xf8\x42\xd6\xa7\xb8\x55\xcb\x1a\x31\xff\x19\x25\xab\xc8\x42\x95\x9f\xad\xc5\x0c\x41\x12\xba\x1a\xa8\xf1\x39\xb3\x49\x20\x78\xd9\x55\xd9\xd0\x2a\xf1\x55\x99\xc4\xa7\x16\x9e\xbf\xaa\x41\xf5\x37\x43\xec\xfe\x64\x9b\xda\xa5\x05\xa6\x14\xcd\xfb\xbe\x77\xd4\x13\xd6\x9d\x09\x06\xa7\xac\x6c\xe1\xe4\x1c\x19\x9b\xb7\x10\x5c\x42\x03\x27\xd2\x13\xc7\x3d\x31\x1d\x5f\x4e\x4e\x52\x71\x32\x3e\x4d\x19\xd1\x42\x10\xd2\x23\xb2\x3a\xde\xdb\xa3\x06\xbf\x9b\xc6\x9c\xca\x9d\x77\x7f\x42\xdf\x22\x72\x64\x38\xa7\x06\x00\x0d\x60\x84\xe4\xcb\x97\x77\x80\x11\x2a\xf5\x36\xcb\xab\xed\xcb\x55\x29\xa5\x55\x28\xc5\x4b\xf9\x79\x91\xd7\x46\xdd\x4a\x9f\xc4\x8a\x48\x9c\x9d\x23\x01\x07\x2b\xb7\xe6\x98\xdd\x1f\x2b\x1e\xd2\xfe\x16\xd5\x06\xd7\x55\x67\x87\xb4\x5c\x2e\xe2\x65\x1a\x2a\x04\xc7\x89\xb8\x91\xc4\x77\x55\x63\x02\x17\x40\x6d\x6c\xf2\x6c\x9b\x70\xc5\x0e\x8c\xc7\xc3\x3e\x96\x4d\xb6\x96\xf6\x89\x3a\xe8\x30\xa8\x0e\x5b\xad\xee\x1a\xd6\x30\xf9\x78\x41\x59\x5d\x26\x02\xc3\x8e\x0b\x97\xe7\x87\x04\xa5\xb2\x93\x44\xfd\x6d\x48\x81\xbb\x0a\x20\x05\xe9\xd0\x55\xa9\x00\xce\x47\x26\x1b\x6a\xba\x84\xc2\x7c\x56\x83\xc8\x9c\xcb\xed\x3b\xae\x23\x0a\x78\x25\x94\x84\xce\xec\xe6\xc1\x8a\x6d\x80\xbf\xc1\x2e\x98\x7d\x00\x4a\x3f\x54\x86\x23\xbd\x65\x96\xcb\x24\xea\x25\x07\xae\xa3\x5d\x53\xed\x2b\x63\x9e\xb8\x64\x8e\xef\xe0\x10\x13\x52\xb8\x07\x06\xa5\x2b\x60\xac\xe1\xa3\x71\xdc\x3b\x3a\xc8\x70\x7d\x0e\xec\x3a\x95\x92\x00\x9f\x56\xba\xc8\x73\x02\x88\x1e\xca\xc0\x4a\x95\x26\x88\x12\xcb\x8e\x6b\x79\x27\x75\xd3\x30\x2e\xbe\x5c\x1e\x8a\x91\xae\xec\xce\x5a\xd3\x0e\xee\x8c\x70\x50\x0c\x36\xb3\x12\xcf\x17\x5b\x90\x47\xa3\xf9\xbc\x11\x47\x87\xb0\x88\xa0\xd4\xc1\xf8\x01\xc2\x01\x09\x75\x7d\xce\xe6\x6a\x0d\xf2\xad\x38\x3e\x74\x7c\xf9\x0f\x7e\x4e\x97\xe2\x35\xbe\x82\xc5\x03\x09\x57\x20\xeb\x6e\x25\xe5\x8d\x50\x87\x01\x3c\x60\xf1\x88\x53\x67\x1f\x44\x5f\x78\x92\x13\x88\x47\x00\x2b\x0c\x82\x67\x2c\xb1\xdf\x1b\x29\xa0\xe3\xc8\x1d\xfe\x3a\x35\x44\xa9\x87\xaf\x56\x1f\x09\x7a\xa2\xe1\x8b\x7f\x05\x4d\xf6\x64\x9d\x14\x85\x0e\x7e\x45\xd5\x14\xbb\xeb\x0b\x0a\x6e\x71\x68\x2c\x9c\x6d\xb7\xca\x22\xbb\x01\x8c\x92\x90\xf7\x60\x9e\x19\xe5\x1a\xc6\xc3\x47\x9a\xca\xac\xc3\xcb\x7c\x4c\xc1\xd9\x0f\x78\x25\x17\x2a\xb8\xaf\xd7\x6f\x49\x43\xc1\x3d\x10\x86\x09\x57\x81\xe6\x9b\xe5\x50\x29\x87\xe3\x55\x45\x24\xdb\xae\x65\x43\x47\xc4\x29\x5e\x45\xbe\x75\x83\x6f\x1f\x06\x7a\x15\xf6\x18\x55\x68\x53\x7d\x06\x2a\xf7\x01\x4d\x0a\xea\xe2\x89\x13\xeb\xdc\x5e\x58\x71\xab\x3b\x3a\xce\xef\x13\x9f\xfb\x6f\x5b\x8d\x27\xe8\xf7\x29\x53\x05\x1c\xf7\x8e\x59\xb7\xdb\xff\x7c\x50\xbd\x87\x83\x41\x25\xbf\x06\xf4\x7f\x1c\xf5\xdc\xe5\x17\x3c\x49\xa7\x1f\x7f\xad\x4e\x47\xde\x09\xd6\xeb\x91\xa2\x81\x02\x02\x84\xb2\x3b\xe5\xdd\xb1\x9e\x3b\xd4\x7c\xe7\x27\x9f\xa4\xe5\xbd\x6a\x8c\xdd\x1f\xbd\xea\xdc\xce\xdd\xca\xfe\x6b\x84\xa5\xa1\xfd\x0f\x24\xd6\x8f\x37\x28\x93\x3a\xde\x7f\xe8\x09\x69\xe9\xbe\x78\x8b\x10\xff\x4e\x55\x11\xa9\x87\xae\x70\x5c\x23\x17\xf9\xb4\x29\xf4\xc4\xeb\x5e\xcc\x03\x1a\x74\x8e\x23\x1e\xc7\x23\xd1\xdf\x04\xdd\x5e\x57\x91\xa9\x30\x6b\x29\x65\x8c\x27\x40\x19\x1d\xa8\x67\x81\x71\xfe\xe0\xd7\x2e\x10\x2e\xda\xde\xfc\x4e\x6b\xfc\x21\x4f\x3c\x14\xe3\xb6\xbf\x16\x38\x23\xad\x75\xeb\xc0\x30\x41\xe1\xea\x23\x56\xd2\x93\x9c\x1d\x17\xa7\x6a\xb9\x3b\x68\x63\x02\x38\xba\x06\x6c\x1f\x01\xc7\x02\x3c\x5f\xf0\x1c\x90\x32\xe6\xbf\xf3\x78\xbf\x70\x8a\x31\x8d\x93\xc7\x5d\x03\x8e\x12\x74\x31\xb2\x09\x68\xc4\x79\xf3\xa4\x30\x2e\xd1\xb5\x56\xc8\x24\x91\x57\xd4\xd5\x98\x89\x21\x0c\xbb\xb2\x5c\x4c\xbf\x6b\xee\x8e\x06\x83\xf9\x78\x5e\xb0\x8b\x69\x55\x35\x2c\x48\x80\x08\xe1\xe1\xba\x85\xf0\xc9\x81\x2c\xf7\x58\x1f\x47\xd7\x04\x83\xf0\x1f\xa0\x27\x47\xf1\x2b\x5e\xed\xd7\xbd\xef\x48\x8c\x8f\x45\x3f\xe0\xe1\xb7\x23\x8e\x82\xd5\x42\x40\xa8\x2e\x8a\x1d\x7e\x8d\x28\x53\xe1\x0d\x9e\x34\xef\xaf\xab\x28\x26\x8e\xe1\x9b\xc7\x84\xcb\x1b\x29\x2e\xe1\x08\xc5\x29\x10\xf0\x0c\xe3\x26\x7e\xf9\x4b\x71\x6b\xff\x5e\xf8\xa4\xc0\xa3\x19\x06\x02\x20\x59\xc3\x00\xe6\xa4\xd7\x04\xdb\xc5\x0d\xe8\x78\x8b\x9b\x15\xde\xb3\x6a\xd5\x9c\xac\x1d\xc3\xa3\xef\x4d\xb8\xfb\x37\x54\x26\xc5\x91\x0d\xc7\x3f\x56\xdd\xc9\xfc\x56\x8a\x83\xa3\xe3\x43\x2e\x95\xe2\xba\x33\xba\x12\x55\xc5\xa1\x70\xa8\x33\x5f\x00\x90\x93\x1f\x86\xdc\x0b\xfc\x30\xa3\x3e\x8b\x83\xef\x1b\x0f\xca\x82\xc0\x79\x8b\x0a\x29\xc8\x64\x45\x02\xe1\xea\xfb\x1b\x13\xaf\x34\xf7\xb6\x62\x79\xc7\x33\x68\x55\x4c\x29\xcd\x46\x17\x1e\xf5\x01\x30\x25\x47\xf8\xd3\x3c\xc9\x3c\x12\x86\x2d\xf9\x77\x84\xdc\x04\x8f\x6f\xae\x32\x8d\xca\xfb\x46\x0a\x13\x8e\xc4\x6b\x71\x2a\x31\x80\xd7\x9d\x84\x14\xc2\x2b\x29\xc4\x31\x67\x79\xde\x56\xa2\xbb\x8e\x04\x85\x03\x33\x07\xee\x73\x47\xd9\xc1\xad\xa9\x2e\xfd\x8a\x05\xcf\x7e\x05\x8f\x1a\xdd\x54\x6d\x93\xdb\x8b\x00\x93\x5f\xc1\x43\x7a\x5d\xfa\xd4\x57\x6b\x75\xa0\x71\x1b\x69\x02\xc6\x2e\x26\x3b\x92\xf2\x09\x5a\x28\x6d\x1f\x30\xe4\x82\x47\x3f\x1c\x03\x9e\x61\xc6\x12\x70\xc6\x61\xf2\xd3\x9a\x7e\x8d\xbd\x4f\x9c\x9f\x4f\x01\x63\xcf\xb3\xb0\xf3\xd4\x77\x77\xbe\x57\xa1\xea\x62\xb5\x08\xaf\x43\xda\x43\x30\x3c\x3c\x5e\xe1\x01\xab\xf1\x75\xef\x5b\xc0\x2f\x3a\x37\xf3\x82\xdd\xcc\x73\xe8\x35\x68\xc8\xb4\xb4\xd3\x99\x81\x7c\x5d\x80\xfd\x85\x46\x0b\x14\x50\x36\x2d\x43\xcf\x5f\x80\x97\x4c\xa3\xb7\x51\x24\xa7\x2f\xcc\x0e\x27\x97\x54\xbe\x0a\x58\x5e\x2a\xcd\x01\x4d\x19\x66\xbb\xd8\xf4\xee\xf2\x11\xa3\x8b\xd9\x40\xa8\x50\x97\xd6\x88\x48\xa2\x8f\x35\x84\x0a\x8a\x98\x40\x9c\x1d\xde\x34\x3c\xc1\x11\xdc\x80\xc0\x56\xfb\xc3\xf4\x7d\x7f\xb8\x4f\xbb\xc2\x3b\x42\xac\x5b\x76\xa9\x9c\x60\x93\xf9\xea\x81\x09\xf8\x67\x40\x57\x78\xde\x2a\xa0\x00\xe5\xf5\xf3\xbc\x54\x50\x91\x61\xd7\x17\xd5\x39\x9f\xbf\x45\xd5\xda\x08\x64\x01\x24\x74\x8a\xdf\x11\xaf\x63\x9b\x87\xa3\xa1\xf0\x9a\x25\xc2\xfe\xba\x6d\xac\x1d\x86\xa3\xed\x39\xdc\x54\xf9\x36\x64\xb9\x81\x25\xc1\x75\x24\xe0\x22\x75\xf4\x88\x96\x1e\xdc\x9c\x40\xd1\x06\x49\x9a\x62\x49\x4f\xc7\x22\x75\x34\xc3\x2b\xb9\x31\xbe\x53\x94\x3d\x41\x2b\x64\xe0\x08\xc2\xef\x6b\xe2\x4f\xcd\x11\xfa\x07\xc5\x96\xe6\xba\xd4\xf5\xc6\x1c\x7a\x3c\xdc\x56\x2c\xb2\xdc\xde\x01\x15\xd3\x04\xc1\xe5\x8d\xf5\x75\x77\x37\xda\xb3\xb3\x77\xe6\x62\x60\x73\x0a\x79\x17\xac\xae\xbb\x3d\x70\xf5\x3d\x19\x81\x3d\xf3\xe1\xac\xfb\x17\x83\xd6\xd9\x79\xd1\xc8\x00\x46\xc6\x52\x60\x9f\x13\x9b\xcd\x1a\xd9\xb7\x38\x71\x63\x17\x6b\xf7\x41\xd4\xab\x86\xbf\xc7\x56\x3c\xde\x5f\x6e\x41\x3c\x21\x93\x5d\x8f\xf5\x26\x0f\x34\x6a\xff\x62\xd0\x71\x6a\xa0\x16\x82\x47\x0a\x46\x4e\x07\xc9\xab\x97\x04\xb7\x20\x8b\x43\x31\x91\x9b\x52\x1a\xd6\x69\xa6\x17\x3d\xbc\xe4\x3f\x22\x32\x36\x11\xde\xeb\x5a\x2a\xb3\xc8\xb5\xb5\xbb\x37\x75\x69\xea\x0c\x69\x2f\xbd\x80\x7e\x0b\x5e\x37\x3a\xba\xe1\x23\xa9\xcb\x94\x69\xf9\x48\xad\x95\xb7\xab\x12\xff\xdd\xb1\xc9\x32\xa2\xe7\xc0\x1c\x72\xa4\xa3\xb9\xec\xc1\x39\x26\x15\xc5\xb8\x80\xce\x24\x7d\x2b\xc7\x09\x5a\xf9\x3b\x31\x61\xbd\x37\x42\x5e\xe0\xf8\xb6\x5e\xd6\x28\x11\xa8\x0a\xfd\x45\xe2\x73\xb6\x8c\x55\x41\xbc\x6c\xcb\xa5\x08\xe8\x31\xac\x13\xe1\x70\xab\x95\x16\x9b\x9a\x8a\xc6\x82\xfb\x29\xb4\x98\x22\x7b\x17\x6e\xfd\x5a\x62\x06\xd2\x78\x74\x00\x55\xa4\xb6\xee\xec\xd6\x83\x73\x4d\x82\x1d\xb4\x7f\xe3\x42\x42\x07\x0a\xdb\x1e\x12\x29\x64\x46\xfc\xcc\x0c\x77\xcd\xd5\x27\x89\xe8\xf5\x5c\xeb\x4f\xd4\xaf\x2a\x28\x43\x80\x69\x7a\x03\x7f\x89\xc4\xb7\x84\x6f\x0b\x77\xdd\x6e\xa8\x63\xb8\x5f\x2e\xc3\xea\x21\x13\x43\xa5\x38\x9c\x4b\x93\x88\xd4\xa4\x5b\xfe\xc0\x5a\x41\xbe\xfc\x60\xbf\xc2\x7c\x19\x1a\x02\xf1\xed\xce\x40\x9e\x70\x9d\x71\xf6\xd1\x75\xdf\xe1\x7b\x45\xd7\x3e\xfd\x2e\xe8\xb6\xdb\x36\x01\xdc\x94\x17\x37\x5a\x63\x1b\x12\x70\xc2\x08\x0e\xc6\x79\x48\x6b\xde\x49\xb0\x6e\x13\xc7\x6e\x97\x84\xc4\xc9\x4b\xb9\x06\x0c\x92\x2e\x45\xd0\xed\x6c\x9e\xab\x6b\x9f\xa0\x0e\x57\x3e\xe6\x71\x6d\x0f\xab\xe5\x39\x2e\xb5\x30\x1a\x5d\x77\x0d\x52\x85\x85\x95\x73\x79\x93\x01\xbd\x40\x81\xd5\xc2\x9a\x7f\xe5\x6d\x31\x8a\x64\x45\x31\x11\xb7\x37\x80\x90\x56\x95\xc8\xe6\x46\xe7\x35\x90\x03\x00\xb5\xb8\xa7\xa0\x46\x5a\xc4\xbf\x63\xce\xf6\x64\xc1\x5a\xe2\x19\x07\x6f\x21\x07\xaa\x14\x8e\x0d\x50\xbc\x1e\x78\x42\xf0\x02\x82\x47\xae\x42\x2b\x13\xc3\x02\x51\x78\x50\x73\xa1\x2c\xbf\x53\x15\x8b\xba\x2c\x43\xfb\x94\x4f\x41\x84\xd2\x8b\x69\xd4\x9e\x3e\x25\xf4\x61\xed\x80\x61\x3a\xa4\xa0\xbe\x6f\x91\xbd\x06\x06\x2c\x05\xc0\x02\x9d\x15\x53\xe2\x75\x85\xb7\x82\xaf\x23\x06\xc2\xee\x35\xb9\x43\x51\xd3\x16\xeb\xd8\x3b\x65\x7f\xf4\xd2\xea\x4a\xdf\x6a\x83\xdb\x09\x74\x7a\x17\x09\xbb\xb5\x76\x48\xde\xde\xa3\x83\x6c\x3d\x88\x47\xdd\xb6\x5d\xc8\x0c\x15\x1a\x31\x8f\xf8\xff\x11\x4e\x83\xce\xb3\xf3\xd0\x6e\xf4\x1d\x01\x6b\xf8\xc0\xc3\xe4\x56\x75\xbe\x52\xc8\x20\x6d\xad\xfc\xe0\x64\x45\xcb\x41\xd1\x31\x9a\x11\x87\x2c\x16\xba\x30\x1b\xb5\x60\x86\x7c\x9c\xf8\xf2\x89\x5e\x48\xb2\xc3\x07\x81\xac\x5f\x0e\xc5\x6c\x59\xbe\xc3\x23\xe9\x50\x51\xa1\x3a\xea\xf4\x4a\xba\xe4\x05\x5c\xe2\x0e\xff\xa8\x23\xe0\xd7\xa5\x02\xd9\xf1\x70\x45\x85\x2b\xd4\x20\x08\x00\x61\xb4\x21\xa8\x41\x72\x67\x71\xdf\x3c\xe1\x01\xc5\xae\xc3\x3d\x8c\x49\x77\x39\x18\x80\xb9\x17\xa6\x33\x75\xfe\xc3\xee\xd4\x9f\x93\xb6\xb0\x35\xeb\x8e\xf9\xfa\xce\xeb\x9e\xc3\x0b\x82\xa4\xa0\xe4\x1c\xc3\x8a\x5b\xf5\x17\xc6\xf9\x51\x6d\xc0\x17\x3f\xd4\x85\xe5\xe9\xa3\x06\x4f\x50\x75\xe3\x92\xd5\xae\xef\x22\x5d\xa5\x8f\x6f\xcc\x6e\xaa\xe2\xaf\xd0\xbc\xb8\x66\xe4\x51\x21\x1d\x46\x6b\x1b\xb0\x53\x54\xa7\x96\x05\xfe\xb9\xed\x23\x97\xc0\xef\xaa\x82\xdd\xf5\xd2\xad\x61\xff\x10\xe6\x1a\x63\x55\x4a\x21\x94\x28\x1b\x69\x5f\x8d\x59\x0e\x6c\xb2\xd3\x38\x17\x5d\xa9\x8c\x27\xe3\x64\xbb\x32\xb5\xe1\xab\x11\xa8\xa9\x8a\xeb\xdc\x75\xb9\x84\xf2\xa9\xa8\x5e\x29\xde\x7a\x2a\xe5\x6b\xeb\xf6\xd6\xf6\x7a\xd5\xe7\x98\x13\x5b\x3a\xe3\xdb\x9e\x18\x8c\xfa\xef\x06\xc3\xc1\xec\x4a\xcc\xc6\xe2\x64\x7c\x7e\x31\xbc\x12\xa7\x97\xa9\xfd\xd7\x74\xd6\x9f\x5d\xce\x52\x31\x9e\x88\x49\xfa\xfe\x72\x08\xd9\x0f\x28\x97\x44\x03\xb8\x51\xb6\x75\xe5\xcb\xb0\xb8\xe5\x07\x55\xc2\xef\x5e\x20\x62\x8f\x37\x1b\x4a\xe3\x1b\xe2\x67\x0a\x60\x55\xad\x2d\x21\xb3\x19\x2a\x7c\x2b\x99\x88\x9f\xeb\xa5\x82\x54\x1f\x54\x3c\x26\x18\xfe\xb9\xae\xf3\xa0\xc5\x1f\xaf\xe1\x1b\x08\xc8\x84\x23\xdc\x3d\xb4\x87\xb1\xc8\x6f\x5d\x50\x2a\x8a\x23\xf9\xdc\x8b\x71\xa1\x0b\x4a\x06\xca\xad\xc8\x20\x89\xd9\x13\xd3\xda\x45\x3b\xf0\x02\xe3\x1b\x27\xbc\x63\x1a\xb1\x80\x1d\x61\x85\x6f\xb1\x01\x71\xf3\xfb\x0e\x9b\xd6\x59\x1a\x19\x05\xf8\x89\xd7\x99\xa6\xcb\xd3\x24\x16\x7e\x0a\x10\xe1\x52\xc7\x2b\x9b\x10\x5d\x6b\xc7\x34\xbc\x2b\x97\x6f\x29\x28\x43\x62\x98\xc5\x6c\xe1\xba\x5c\xaa\x02\x88\x8c\x3f\xa9\x3c\x27\x76\x32\x8e\x1c\x83\x36\x84\x8c\x2c\xf4\x79\xfb\xae\x27\xfa\x17\x17\x43\x6a\xc3\x87\x8c\xb0\x9e\xa5\x89\x9a\x39\xbb\x03\xb0\xa1\x96\x28\x9a\x96\x9f\x43\xb1\x04\x5e\xb3\x27\xaf\xaa\x98\x62\xb3\xdb\x13\x24\x53\x9e\xaf\xf1\xf6\xe9\xf9\xbe\x27\x7e\x4c\x27\x53\x6c\x1b\x88\x04\xb5\x21\xc2\xee\xfb\xde\x91\x18\xc9\xbb\xd8\xaa\xc3\xf7\x5b\x65\x04\xfc\x13\xc6\x4a\x3f\x52\xe2\x92\x5b\x5c\xc8\xbb\x56\x6b\x2d\x9e\x15\xea\x71\xb5\x46\xe1\x54\x6b\xd9\x13\xa9\xf5\x55\xf9\xfe\xb8\x23\x42\x19\xac\x0d\xcf\x60\xf3\x55\x71\x5d\x2b\x03\xa4\xe3\xfc\xb1\xa2\x5e\xcf\x49\x5d\x7e\xdf\x3b\x16\x29\x52\xe5\x59\xcb\xbf\x39\xda\x71\xb1\xe8\x38\x80\xbe\x21\x2a\x4e\x21\x20\xd9\x0f\xdc\xdd\x86\xe9\xe7\x0c\x00\xdf\x0f\x0d\x28\x36\xac\xe9\xa0\x0a\x3c\xd2\xd4\xa2\xbc\xd3\x0e\xcc\x5c\x36\xa2\xd1\x52\xcd\xbb\x60\xf6\xeb\x74\x79\x34\x46\xdc\xf1\x44\xbc\x45\xba\x33\x1d\x7e\xc5\xfd\x0c\xf9\x86\x82\x8e\x3c\xe0\x93\xf9\xea\x0e\x2f\x54\x51\x51\x43\x10\xd4\xa3\x06\xce\x3e\x41\xd8\xe1\x55\x3a\x5f\xbb\xab\x77\xf3\x1f\x20\x1d\x7d\x32\xec\x0f\xce\xd3\x89\x95\x36\xa6\x71\xef\xed\x9d\x8c\x7f\x4c\x27\xe9\xa9\x98\x8e\xcf\x66\x1f\xfb\x93\x54\x0c\xa6\xe2\x62\x32\xfe\x71\x70\x9a\x9e\x76\xf0\x99\x09\x68\x6a\x29\xf6\xfb\x53\x31\x98\xee\x8b\x77\xfd\xe9\x60\x9a\x88\x8f\x83\xd9\x87\xf1\xe5\xcc\x3d\xd6\xbe\xa2\x3f\xba\x12\x7f\x1e\x8c\x4e\x13\x91\x0e\x80\x38\x2d\xfd\xe9\x62\x92\x4e\xa7\xe9\xa9\xbd\x12\x06\xe7\x17\xc3\x41\x7a\x9a\x88\xc1\xe8\x64\x78\x79\x3a\x18\xbd\xf7\x4f\x19\x0e\xce\x07\x33\x38\xa7\x09\x3f\x71\x90\x4e\xc5\xec\x43\x7f\x06\xc7\xa4\x6b\xc8\x67\x93\x14\x78\x9e\x4f\xd3\xb3\xf4\x64\x36\x4d\xc4\x79\x3a\x39\xf9\xd0\x1f\xcd\xfa\xef\x86\x69\x22\xce\x06\x33\x71\x36\x9e\x88\xbe\xb8\xe8\x4f\x66\x83\x93\xcb\x61\x7f\x22\x2e\x2e\x27\x17\xe3\x29\xdc\x50\xa3\xf1\xe8\xe5\x60\x74\x36\x19\x8c\xde\x0f\x46\xef\x7b\xf0\x9a\x74\x34\x1b\x4c\x52\x31\x19\x4c\xff\x2c\xfa\x53\x7b\xa5\xd9\xdf\xfe\xe5\xb2\x0f\xf7\x5d\x7f\x74\x2a\x2e\xd2\xc9\xd9\x78\x72\x1e\x72\x4c\x77\x8d\xcd\xce\x4b\x5c\x8d\x2f\x7b\x62\xfa\x61\x7c\x39\x3c\x85\xa5\x69\x7d\xd0\x2e\x7a\x4a\xe3\x1f\xfc\x98\x8a\xc1\x08\x3e\x37\x49\xa7\x17\xe9\xc9\x2c\xb1\x0f\x10\x07\xa3\xf1\x4c\x8c\xc6\x7f\x1e\xf4\x13\x31\x98\xf1\xa6\x8c\x27\x53\x3b\x87\xfe\xd9\xd9\x60\x38\xe8\xcf\x52\xfc\xd7\xe8\x4a\x8c\x61\xdd\x4f\xc6\x23\x04\x22\x8c\x27\x87\xa2\x3f\x9d\x5e\x9e\xa7\x34\xd4\xe9\x8c\x37\x6a\x94\x9e\xa4\xd3\x69\x7f\x72\x25\xa6\xe9\xe4\xc7\xc1\x09\xec\xc7\x24\xbd\xe8\x0f\x26\xf6\x61\x27\xe3\xc9\xc4\x0e\x6b\x3c\xea\xa1\x34\x74\x4b\x93\x7d\xd5\x74\x36\xb0\xd7\xfe\xd4\x4a\x89\xdd\xed\xd1\x6c\xd0\x1f\xc2\xaa\xb7\x94\xae\x18\x8d\xc5\xe5\x34\xe5\x31\x74\x2d\x5d\xff\x72\xf6\x61\x3c\x19\xfc\x97\xf4\x54\x7c\x48\x27\x29\xca\x63\xfa\xd3\x49\x7a\x31\x0b\x85\xd3\x0f\xa7\x07\xed\x62\xd2\xc9\xf9\x60\x44\x06\x07\x74\x90\x39\x8a\x89\xe7\xf8\x72\x6d\x64\x33\x5c\x16\x1d\x75\x21\xd6\x8d\x83\xcd\x57\x57\x7a\x9d\x01\x05\x10\xfa\xc7\x56\x87\xac\x20\x5b\x10\x9b\x2c\x78\x52\xb1\x04\x08\xdb\x02\xf0\x87\xac\xe5\x05\xea\x65\x0e\x2c\x96\xcc\x82\xf8\xfa\x95\x58\x5a\x45\xa6\x57\x48\xb1\x08\xee\x69\x88\x9e\xc7\x8f\xf7\x44\x3f\xcf\x03\x14\x9f\xd9\xe5\xc9\x05\x21\x66\x4c\xeb\xe4\x5b\x37\x3d\x8c\xeb\x9b\xba\xbc\x55\xb7\x1e\xb1\x10\xa1\x31\x43\xa5\x71\x61\x7d\x2d\xe3\xd1\x27\x09\x59\xab\xaa\xa4\xfe\x68\x71\xce\x59\x15\x4c\x9b\x3a\x97\x5b\x4d\x0b\xfc\xc0\x0b\xe2\xe1\xd0\x3e\x1d\xb3\xbb\x83\x59\xe8\xca\xda\x44\x15\xc7\x76\xe6\x50\x3f\x21\x4b\xd7\xe4\xb8\x42\x92\x13\x0f\x5e\xa2\xbc\xce\x01\x40\x2c\xc1\xd5\x5f\xca\x45\x9e\x55\xba\xdc\x5a\x43\xef\x7a\x8d\xbd\xa8\xc0\x9c\x39\x74\x65\x0f\xde\x5b\x89\xc1\x70\xee\xf7\x91\x3b\x41\x5f\x82\x5c\x10\x88\x01\x74\x10\x07\x9b\x7b\xc1\x21\x28\x57\x58\x52\x01\x47\xea\xfe\x05\x5c\x6c\x6a\x93\x15\xd5\xfe\xa1\xb5\xac\xe4\x35\x07\x3d\x02\x44\x3a\x3c\x24\xf8\xe8\x8b\x6e\xbc\xdc\x8e\xea\x66\x5e\x07\x13\x94\xc5\x38\xa6\x62\x5f\xb5\xb6\x23\x81\x17\xbc\xd6\x0e\xda\x4e\xac\x23\x8f\x47\x56\xc6\x71\xef\xb8\x7b\x37\x13\x24\x3f\xfd\x9e\x84\x9a\xec\x22\x30\x3c\xa2\x17\xb8\x83\xb5\x29\x35\x58\xef\xd0\xe8\x2f\xe1\x1e\x13\x6a\xc5\xc7\x83\x9f\x84\xc9\x29\xc8\x0d\x6d\xc0\xd8\xa0\x47\xdb\x71\x22\xb0\xe3\x8d\x38\x50\x87\xe4\x53\x06\xbd\x27\x80\xba\x78\x1b\xbd\x3d\x13\xeb\xba\x42\x32\x30\xf8\x38\xdc\xa8\x01\x61\x03\x21\x76\xd9\x2b\x29\xc5\x26\x33\xc8\x6a\x46\xd0\x24\xea\xdd\xd0\x8d\x05\x6b\xae\x26\x78\x14\x07\x4a\x21\xb0\x7f\x59\x66\x77\xf8\xd0\x40\xae\x51\x68\x9b\xce\xcc\x0e\x7c\x9b\x13\xc0\xe6\x8b\x20\x52\xd0\x58\x36\xb7\x50\x49\x4c\x47\xce\x53\x04\xba\xa1\x6c\x8b\xc7\x02\x19\x7f\xe9\xbf\xd1\x4f\x8d\x17\x6a\x89\xbb\x1b\xac\x2e\xb9\xaf\xdc\x39\xc6\xb1\x6f\x34\xa6\x46\xe9\x0e\x5e\x80\x22\xd9\x91\x4a\xfe\x6a\x21\x8c\xf5\x72\xa0\xaf\x2b\x72\x47\x36\xaa\x8c\xb0\xe6\xb8\x30\x2c\x3d\xc4\x75\xef\x5b\x85\xfb\xbe\x5a\x5c\x42\xb1\x75\x8e\x7b\x22\x6e\xb2\x72\x89\xff\xe5\xc0\xe8\x49\x68\xc8\x3d\xed\xfc\xee\x42\x42\x3c\x76\x80\x1b\xcb\x45\xeb\xd3\x75\x7e\xdb\x6b\x76\x30\x6f\x41\x62\x4b\x79\xab\x3f\xc9\x65\x00\x8d\xcd\x9c\xc7\x00\x38\x10\xd4\x6d\x88\x8a\xa5\xaa\x8e\x65\x22\x8c\xce\x23\xc6\xd2\x25\x2c\xc6\x4d\xb6\xa4\x4f\x3d\x00\x90\x0c\x65\x15\xb5\xfd\x6b\xd6\xf6\xa8\xd6\x1f\xd4\xe9\x2c\xf6\xd1\x49\x0e\x15\xe9\x3f\x40\x7d\x52\x3c\x18\x01\xc9\x2c\xc9\xa5\x34\x3a\xbf\x95\x4b\x9f\x3a\x9b\x6f\x43\xe6\x34\x23\xab\x0a\x53\xb8\x87\xc4\x04\x40\x87\x99\xae\x34\x92\xc6\xae\x99\xfa\x83\xe3\xf8\xa8\x23\xcd\x74\x9b\xe5\xb5\x33\x0c\x5a\x30\xe8\xa7\x89\x02\x61\x31\x02\x2e\x0b\x20\xbb\x07\x86\xa9\x6c\xb1\xd0\x35\xf2\x86\x31\x6b\x8e\x03\x06\xae\xe1\x2f\xba\xf4\x83\xc0\x75\x42\xe5\xa1\xcb\xa8\xcf\xd8\x1f\x01\xe0\x82\x67\xf0\x96\xa9\x3a\x03\x53\xa0\x31\xac\x3f\xe2\xb0\xec\xf5\xcf\xfd\x01\xf3\x5c\xc8\x62\x89\x79\x47\x57\xb9\xc0\xfd\x20\x4c\x74\xc3\xb3\x2c\x6a\x64\xc0\xb0\x1b\x24\xf3\x5c\x96\x86\x19\x41\x7c\xa2\x02\xfa\x85\x04\x16\x11\x05\x2f\x29\xb2\x18\x3c\x29\x30\x05\xfd\x1e\x06\x13\x88\x4d\xa9\xe0\x2f\x3d\xf1\x43\x2f\x70\x60\xac\x6d\x3b\x1c\x50\x8c\xac\xb7\x87\x26\xeb\x68\x2c\x4e\x06\x93\x93\xcb\xf3\xe9\xcc\xba\x0e\x53\xf0\x25\xdc\x9f\x30\x6a\x33\xfb\x90\x8e\x27\x57\x89\x60\xd6\xe9\xd9\x78\x32\x13\x07\xce\x59\x12\xa3\xf4\xfd\x70\xf0\x3e\x1d\x9d\xa4\x87\x09\x5a\xf8\x7d\xeb\x24\x8c\x27\x68\xf4\x7f\x1c\x4c\xd3\x44\x4c\x3f\xf4\x87\x43\xeb\x38\x24\xec\x34\x74\x7a\x05\x09\xfb\x0b\x0e\xb2\x3c\x06\xb3\xbe\x69\x90\xbb\xcf\x4d\x2f\x2f\xac\xf7\x36\x61\xcb\x7d\x7c\x26\xa6\x97\x27\x1f\xd0\xb7\x4a\xa7\x89\x78\x97\xc2\xac\x87\x10\x08\xb4\x9f\xb8\x48\x27\xd3\xf1\x08\x5d\xb0\xd1\x95\x18\x8c\x4e\x07\x13\xf0\x6a\xac\x73\x33\xe8\x0f\xc1\x0f\x1c\x9c\xa6\xa3\x99\xfd\x6f\xf0\x38\x46\xd3\xf4\x2f\x97\xe4\x3e\x9c\xf6\xcf\xfb\xef\xd3\xa9\xf3\x14\x3e\xf4\xed\x74\xd3\xc9\x63\xde\x23\x7f\xcf\xbe\x77\x38\x9e\xc2\x03\xde\x8f\xc7\xa7\x1f\x07\xc3\x61\x02\x9c\xdd\x62\x3a\x1b\x5f\x5c\xf4\xdf\xa7\x09\x84\x2f\x2f\xed\x43\xcf\xfa\x83\xe1\xe5\x04\xfc\xc2\xf3\xfe\xf0\xec\x72\x74\x82\x4f\xa3\xc1\xdb\xdd\xb2\xeb\xca\xeb\x78\x6e\x5d\xcd\x68\x94\xf8\x32\xbb\x10\xe9\x8f\xe9\x48\x0c\x82\xe5\xb9\xa2\x4d\xf9\xd0\xff\x31\x15\xef\x52\xfb\xd7\x91\xf5\x21\xad\x57\x8c\x1e\xe4\xc5\x78\x3a\x1d\x50\x50\x95\x17\x96\x9e\xdc\x63\xff\xa9\x53\xbc\xe8\xc9\xd6\x45\xec\x5f\x5c\x0c\x21\x24\xeb\xff\x68\x97\xe0\x34\xed\xcf\x3e\xd8\xe1\xe1\x76\xf4\x87\x62\x30\xfa\xd3\xe5\x04\x9c\xcc\xcb\xe1\xcc\xca\xd5\xd9\x64\x7c\x1e\x8c\xf6\xc5\x34\x90\x34\x76\x81\xd3\x9f\x66\xe9\x68\xc6\xf1\x34\xbb\xcb\xc3\xfe\x47\xeb\xbf\x7e\x18\xbc\xb3\x5e\x29\x7c\xdd\x0f\xb2\x27\xa6\xe3\xf3\x54\xfc\xe9\x72\x32\x98\x9e\x0e\x60\x2d\xa7\xe2\x74\x8c\x03\x1d\x0e\xc7\x1f\xe9\xa1\x27\xc3\xcb\x29\xcc\x69\xd2\x98\xa1\x17\x8d\x9d\x92\x91\x88\x77\x97\x33\x71\xde\xbf\xa2\x27\xfa\x79\xcf\xc6\x28\x8d\xe7\x83\x59\x7a\xfa\xd6\x7a\xd5\x30\xbc\x93\x3e\xec\x4f\x9f\xa6\x69\xd0\x9f\x4e\xcf\x2f\x86\xe3\xab\xd4\xfe\x65\x87\x6b\xfd\xa2\xb5\xde\xfe\xe9\xf6\x5d\x97\xbd\x69\x4f\xfc\xff\xbf\x7b\xe5\x9b\xf5\x51\x76\x2b\xa8\x43\x8c\x1d\xa0\x4d\x29\x21\x06\x8d\x21\x60\x0c\x96\x5a\x7f\x85\xd1\x05\x2b\xc7\x68\xb0\x15\x4b\x99\x01\xc6\x2a\xc3\x76\xd0\x85\xa9\xd7\xb2\xec\x89\xa3\x57\x3d\x71\x3e\x98\x9e\xa4\xc3\x61\x7f\x94\x8e\x2f\xa7\x8d\x78\x66\x84\xeb\x91\x41\x1f\x69\xd7\x60\x27\xe8\x9c\xc8\x65\x71\x6b\x80\x22\x0a\x22\x57\x01\xff\x33\xce\x6b\xb5\x5c\x4f\x6b\xe3\x51\xa7\xbd\x40\xc7\x76\x50\x11\x10\x80\x57\x96\xb7\x72\xd9\xee\x6a\x18\x2f\x0f\x62\x78\xc0\x48\xf0\x46\x10\x85\xeb\xc2\x04\x41\x99\x2d\xe5\x3a\x2b\x3f\x99\x16\x08\x81\xa8\x11\x7c\xa1\xb3\xef\x48\x46\x7f\xc6\x7c\x90\x7f\x02\xe6\x14\xe3\x84\x2d\x97\x9d\xec\xaa\x57\x8b\xf3\xb4\x00\xcc\x69\xec\x82\x32\xad\xbc\x4f\x9e\xdd\xc1\x78\xcf\x54\x91\x43\xd6\xcb\xdd\x6a\x0a\xd1\x4a\xab\x5c\x2d\xaa\x97\x7a\xf5\x32\xcf\xee\x30\xf9\x89\xe1\x55\xd8\x8e\xa5\x32\x1b\xa8\x47\xe5\xfe\x72\xe0\x68\x31\x7e\xd5\xa5\x7b\x95\x11\x7d\xb7\xd1\xee\xda\x47\x33\x85\x40\xcc\x94\x45\xca\xca\xb9\xaa\xca\x0c\xdc\xdc\xcd\x46\xab\x22\xec\x4a\x2b\x8b\xaa\xcc\x72\x71\x72\x93\xad\xe7\x48\x6e\x43\x75\x52\x32\x98\x01\x66\xc2\xf9\x39\x84\x9c\x5b\xc8\x25\x44\x3f\x3c\xac\xd0\xd1\x0f\x7f\x90\xb9\x51\xc5\x27\x95\xb8\x25\x20\xe1\x4a\x8b\x6b\x88\x6f\xe7\x59\x71\x5d\x67\xd7\x98\x07\x8d\xa9\x3d\xa2\x79\x29\x23\x56\xba\x2e\x96\xe2\x56\xab\x25\x95\x3e\xcb\x62\xa5\xcb\x85\x44\xe8\xba\x22\x20\x27\x64\x72\x31\x4e\x61\xdf\x03\x16\x01\x55\x2e\x40\xb8\x25\xcb\xc3\x7e\x31\xee\x05\x9c\xaf\xc6\x49\x50\xc8\x03\xdb\x8f\xc1\xc6\xf9\x57\x81\x15\x55\x32\xf5\xba\xdd\x47\x08\x0a\xf5\xa0\xf1\xe8\x24\x9d\x5e\x8c\x47\x4e\xbf\x5b\xa5\x0c\x81\xab\x69\x6f\xaf\x6f\xc4\x5c\x56\x77\xd6\x4c\xf1\x69\xd0\x86\x13\xc8\x05\xa8\x54\xa9\x6a\x5a\x30\x78\x2c\x53\xc5\xcc\x61\xdc\x7c\x70\x37\x00\x9b\xfb\x0e\x56\x46\xd4\x95\xca\xd5\xbf\x38\x1b\x35\xca\xe4\xb7\x52\x93\x70\x26\x39\x87\xeb\xb8\xac\x83\xc1\x87\x03\x6f\xd0\xd0\x13\xae\x9f\x06\x4f\x28\x1e\xe4\x99\xfb\xa5\x56\x98\xd7\x86\xea\x51\xaf\x1e\x28\xa8\x16\xf6\x3a\x75\x48\xd8\xb9\x14\x4b\xbb\x4f\x4c\x96\xc1\xbc\x99\x48\xb4\xb3\x56\x86\xa3\xf3\x2e\x79\xdc\x13\xe9\x4f\x70\x5d\x89\xfe\xde\xac\xc1\x50\x03\x33\x85\xb0\x4e\x06\xd6\x7f\x54\x4f\x1c\x31\xeb\x89\x80\x58\x0f\x69\x6d\x1d\xb5\xd1\xe1\x5b\xc7\xd7\x6e\x45\xce\x51\x70\xc3\x73\x09\x57\xb9\x03\xb7\xe0\x40\x89\x3e\x69\xd9\xdd\x4a\xc1\x2b\x96\xb8\xd4\xca\xae\x23\x47\xe8\xa9\x06\xf7\xe1\x08\x7d\xdc\x26\x35\x68\x92\xda\x13\x53\x29\xe3\x2c\x12\x39\xf9\xe4\x34\x2f\xdc\x09\x25\xe5\x16\xf0\x5e\x58\x19\x08\x53\x9a\xad\x91\x63\x1f\x88\x0e\x92\x32\xb3\xf7\x5f\x9f\xf4\xd3\xdb\xf3\x74\xbe\x7f\xfb\x22\xfe\xd3\x56\x66\xe5\x7f\x0e\x24\x10\x29\xed\x51\x5b\x4e\x70\x50\x13\xbe\x77\xf6\x02\xf1\x3c\x30\x87\x6f\xc4\x53\x5f\xf9\x7b\xd3\x3e\xba\x9f\xde\x37\x4b\x7b\xb1\x43\x53\xbf\xff\xfa\xfe\xec\x74\xf8\xf2\xa8\x77\xf4\x2b\xb3\x81\x3e\xcc\xff\xf9\xed\xeb\xe3\xa3\x26\xff\xe7\xb7\x47\xaf\x5f\x3d\xf3\x7f\xfe\x16\x3f\xef\x47\x97\xe2\xcc\xea\xdf\xd3\xc8\xf6\xe0\x86\x00\x5e\x37\x1d\x25\xe2\x1c\xba\xe2\x1d\xbf\x7a\xf5\x2a\x38\x32\x07\x27\x87\xf0\x2b\x7c\x8a\x3b\x7e\x67\xf6\x22\xa5\x30\xc4\xa0\x58\xf4\xc4\x77\x47\xe2\xac\xcc\x8a\x4f\xb9\x2a\xc4\xb4\xb2\x77\xf5\xaa\xba\x11\x67\xb9\xd6\x65\x22\xde\x69\x53\xd9\x4f\x9e\xf7\xc5\xab\xe3\xa3\xa3\x57\x2f\x8f\x5e\xbf\x3a\x12\x97\xd3\xfe\x5e\x7a\x2b\x4b\xa8\x84\x53\x61\xd7\x5d\xd0\xd0\x9b\x6d\x13\xdd\x72\x2b\xcb\x79\x56\xa9\x35\xd7\x2b\x34\x79\xe4\xd9\xbe\xc2\xc6\x35\x50\x9d\x44\xfd\x26\x1c\xb1\x55\xae\xef\x08\xfd\xff\xaa\x27\x2e\x26\x69\xff\xfc\xdd\x30\xe5\x72\x5a\xe2\xf3\xec\x20\xcf\x71\xa4\xbd\x99\x58\x67\x45\x9d\xe5\x09\x14\xa3\xcc\xb5\xc6\x6e\xc3\xc4\x79\x54\xda\xe1\x17\xbe\x6e\x72\x7f\x55\x4a\xb9\xef\x68\x02\x19\xe3\x66\x7f\xbb\xd4\xeb\x37\x18\xfa\x07\xc0\x8d\xe4\x75\x80\x78\x88\x8b\xb7\xd1\x27\xa3\x05\x29\x65\xb0\x24\xaa\x4a\x5a\x6c\x30\x98\x15\xc6\x99\x3b\xbd\xbd\x70\x05\xeb\x78\xbb\x17\xba\x08\x7f\x65\x95\xf8\x42\x17\x4b\x60\x44\x68\xf0\x0b\x6d\xc8\x0e\xf7\x3d\x34\xa8\x11\x2f\x84\x86\x29\x7f\x5d\x12\x77\x75\xa5\xc5\xb5\x04\xfa\xcd\xa5\x62\xc4\x27\xb7\x93\x01\x03\x29\x47\x27\xc0\x71\xa2\x32\xcd\x72\xd3\x4c\x59\x77\x46\x09\x49\x5b\xe3\x8e\xc5\x5b\x94\x41\x3f\x6f\xbb\xbe\xfb\x76\xad\x72\xb9\xaa\xf6\x1d\x84\x10\x3a\x5f\x22\x95\xb7\x2c\xa1\x1d\xd0\xad\xa4\x7e\x1c\x1c\xd0\xe4\x4d\x83\x84\x55\x75\x23\xd7\x46\xe6\x76\xd2\x73\xdc\x06\xb7\x8b\xd9\x9a\xb6\x12\x98\xbd\xd1\x51\x5a\x3b\xc7\x69\x77\x03\xa0\xc4\x13\xbe\x61\xbd\xb1\x1d\xa1\x97\x5d\x69\xd4\x75\x41\x20\x16\x78\x9f\x09\xcb\xc1\x3e\x4a\x0c\x51\xb9\x8f\x35\xd1\xea\x8e\x8c\x9d\x20\x0e\xc8\x48\x66\x45\xd5\xb4\x1f\x99\x40\xdd\x66\x6d\x64\xfc\x6b\xe8\x83\x65\xf0\x77\x91\xaf\xf2\x46\x64\xf8\x5b\xaa\x71\xe1\x3e\x50\xd0\xef\x0d\xc4\x8f\x5f\x85\xe0\x4b\x8e\x08\xc2\x5a\x91\x0c\x1b\x8f\xa8\xf4\x7c\x99\x5a\x9a\x9e\x78\x57\x57\x9d\x34\x74\xbe\x6f\xb5\xff\x06\xbd\xe7\x2d\x70\xa7\x21\x1d\x18\x30\x11\x30\xf2\xcf\x9e\xca\x3a\xcb\x49\xdc\x4a\x79\x9d\x95\x4b\xc8\x17\x81\x0b\x17\x79\xad\xf6\xc4\x10\xdb\x23\x6a\x08\x0f\xc5\x00\xdf\x79\x53\x92\x73\xa3\xf5\xa7\x9e\xdd\x80\x90\x3b\x3f\x3a\x1e\xaa\x58\xa8\x0d\x1c\x2c\x3b\x0c\x6a\xd5\x0f\xd5\x4a\xac\x51\xc0\x22\x75\xdd\xd8\xd0\xff\x02\x00\xe6\x02\xb7\xf7\xc8\x41\x8f\xc8\xea\xef\x8f\x4e\x43\x06\xe6\x96\xbc\x07\xf0\x23\x3b\x6d\x5c\x96\x40\x13\xb9\x96\xca\x9e\xf3\xd0\x65\x34\xac\x63\x15\x34\x34\x61\x4d\x7f\x83\x7d\x1f\x4d\x46\xaa\x83\xd7\xb7\xdb\xb0\xec\xe6\x30\x02\x35\xba\xcf\x77\xcd\xbe\x95\xb3\x5c\xdf\x25\x38\x5b\x37\x5a\x6c\x7c\xe4\x86\x7c\x07\xac\xf5\x7d\x3b\x0d\xc9\x7e\x63\xe5\xfb\xe7\xc0\x79\x61\x3e\x75\x42\x8a\x9b\xb8\xa3\xdc\xfe\x56\xd7\xfb\x58\x49\x2e\x88\x53\x53\x2e\x3d\x79\x2f\x3d\xef\xd4\x9d\x70\xd0\x06\xdc\x91\x27\xa4\x99\x8c\x3e\x86\xbd\x8e\x91\x75\x04\xbd\x9f\x40\x9b\x6e\xa8\xe1\x11\x5c\x48\x09\xab\xdf\x86\xd6\x62\xb2\xe5\x32\x2b\x4c\xce\x8c\x7e\xda\x71\xe4\x39\xc7\x95\x46\xce\x2a\x78\xcb\x61\xef\x7d\x9c\x3c\xf6\xbc\x87\x7e\x4f\x4b\xf5\x99\x28\x10\x4a\x5d\x54\x2f\x49\x94\x83\xe6\x11\xd1\x0c\x48\xe1\xd9\x83\xe9\x18\x85\x42\x5c\x22\x06\x01\x74\x11\x56\xa3\x3a\x85\x0e\x36\x3e\xf7\x0a\x6b\x3d\x59\x47\xff\x7e\x61\xa0\x57\x2d\x06\xbc\xf1\x94\x1d\x60\x44\x9c\xc1\x6d\x38\x52\x2c\xce\xf2\x42\x59\x90\xe3\x16\xb4\x76\x5a\x21\xa8\x90\xfc\x50\xd7\x08\x32\xab\x9a\x6f\xe8\x89\x83\xb3\xb0\xbb\x81\x6a\x0c\x11\xce\x1c\xc6\x02\x32\x77\x5b\xdb\x89\xac\x33\xab\xdd\xb3\x4a\x2d\x80\xb4\xb4\xb5\xea\xce\x21\xa3\x26\x70\x74\xc2\xdc\x97\x7a\xc8\x31\x13\x2d\x9e\x6b\xba\x9b\x39\xf5\xb2\x12\x37\xca\x54\xba\x84\xa6\x50\x0b\x5d\x14\xdc\x43\x83\x57\x9f\x57\x8a\x65\xa7\xb1\x54\x68\x58\xac\x90\x9c\x2f\x09\x2e\xf0\x44\x6c\x6e\x54\xae\x8d\xde\xdc\xd8\x67\x27\x42\x56\xf0\x1f\x48\xbe\x9b\x2b\x6c\x43\xe5\xf8\xbc\x51\x09\x92\x74\xaf\x1d\x77\xc8\xfe\xa0\xb8\xcd\x4a\x95\x15\x95\x4b\xb2\xec\x63\xdb\x47\x59\x02\xd4\xbe\xb5\x2e\xac\xd4\xa0\xb4\x16\x23\x60\x78\x1d\x65\x90\xe3\x73\x44\xe7\x58\xa8\xa9\x57\xa2\xfd\x86\x84\x6f\x51\xd2\x45\x98\x94\x73\xcd\xbd\x9a\xfb\xd7\x20\xf2\x68\x95\xe3\xc1\x3c\x20\xda\x26\x66\xf2\x73\xd5\x98\x80\xb9\xd1\x65\x05\x6d\x7c\x21\xc8\x01\xf9\xa5\xcf\x74\x28\xec\xe7\xb0\xdb\x04\x0c\xfc\x0c\x4e\x53\xf0\x24\xbb\x96\xef\xb2\xc5\xa7\xf0\x77\xbf\xf2\xe0\xfb\x62\x7f\x66\x15\xc3\x26\x2b\xad\xae\x8c\x28\x46\x9a\xaa\x4a\xac\xb3\xc5\x8d\x2a\xe4\xcb\x52\x66\x4b\x6a\x19\xb1\xd9\x26\x3e\x6a\x4b\x41\x48\x81\x25\x9e\xb4\x51\xec\x7f\xbb\xb2\xa7\x88\x37\xc1\xbe\x87\x38\xad\x49\xd5\x26\xf4\x3d\x17\xe8\xa0\x1b\xe0\x56\xc9\x3b\x49\x41\xac\x25\x5c\xc9\xee\x7c\x62\x33\xa1\x32\xb3\x37\xc8\x4a\x97\x77\xf6\xba\x25\x05\x03\xcf\x56\x0b\x5c\x74\xfb\x3d\xa2\x90\x87\x6e\xfd\x0a\x03\x4f\xc8\x3b\x2f\xc1\x6a\xdb\xa8\xcf\x32\x37\x87\xee\x7b\x9b\x4c\x21\x4e\xd8\x5a\x1c\xfe\x9b\xcb\x32\xbb\x53\xc5\xb5\x39\x44\x28\x77\x8b\xa7\x93\xfe\x4e\x6f\x4c\x7c\x2d\x07\x34\x30\x57\xae\x90\x49\xa8\x62\x53\xa3\x22\x83\xb2\x72\x58\x38\xa6\x5d\xa1\x76\xa8\x08\x1c\x70\xfa\x9b\xa2\xb6\x99\xb0\x62\x2d\x31\x20\x88\xdf\x7b\xe2\xa3\x7b\xa2\x8f\xdb\x0c\xe6\x2c\x16\xf6\x78\x3e\xae\x40\x1a\x30\x04\x14\x6d\xe6\x3a\x2b\x3f\xd5\x1b\x0f\x8d\xf5\x96\xa0\xdd\xca\x3b\x08\x79\x42\x53\x42\x6a\xcd\x18\x62\x4f\x23\x0a\xbe\xf9\x16\x3a\x36\xda\x99\x92\xa1\x15\xbc\xd8\x8d\x90\x97\xcc\xfe\x3d\x96\x53\x65\xe5\x02\x60\xff\xfb\xe3\x4d\xf6\x4b\x2d\xf1\xe6\x4d\xa9\xbf\x2c\x5a\x5a\x7e\x31\x60\x75\xec\xa2\x84\xd3\x23\x07\x8e\x4b\xbd\x50\xcd\xf6\xa7\x27\x83\x81\xf7\x62\x60\xbe\x89\x3d\x7a\xaa\x58\x69\x5a\x53\x7c\x60\x42\x1d\xcc\xe2\xdf\x4d\xdf\x9f\x43\x13\xd2\x9f\xce\x87\xae\x03\x0d\x0a\x76\x24\x20\xa7\xb3\xd3\x84\x9b\x60\x59\xfd\xb6\x7c\xb9\xd0\x50\x1a\x0d\x99\x0d\x28\xae\x16\x1f\x66\xe7\xc3\xd8\x24\xbf\xa9\xd7\x59\x11\x2d\x64\x4f\xe0\xf4\xdd\x24\x79\x36\x17\xda\x54\x53\x80\xac\x27\xe2\xe2\xf4\x0c\x2a\x92\x36\x56\x60\xac\x2e\xe5\x0f\xe3\x8d\x87\xe7\x0b\x1a\x68\x06\xa7\x0b\x2a\xec\xe6\xdb\xe8\x7b\x77\xba\x5c\x32\xdd\x31\x04\x79\xc3\xd9\x82\xd9\x09\xce\x05\x28\x8f\xd9\x29\x5b\x1e\xf4\x05\x0c\x34\xeb\xdc\x38\xd4\x4e\x40\x66\xef\xa9\x5b\x38\x9a\xcc\xca\xc6\x37\xdd\x82\xf5\x20\x0e\x41\x44\x11\xc0\xd9\x8b\xc7\x04\xc3\xd0\x75\x65\xf7\x84\x5b\x63\xc0\x5c\xbc\xae\x9e\xd9\xab\x43\x5c\x64\xd7\x72\x1f\x55\x5b\x42\xa0\xfd\xd0\xd8\x46\xe8\x0f\xdc\x32\x62\x63\x25\x99\x7b\x55\x03\x45\x32\x18\x8f\x2b\xcd\x1d\x29\x37\x18\xc0\xa6\x99\x49\xb9\xc4\x13\x71\x03\x18\x94\x5c\x5e\xab\x39\xfa\xb3\x76\x56\x95\x2c\x55\x96\x37\xb9\xa2\xb8\xcf\x13\x34\xdc\x92\x59\xc9\x5a\xde\x0f\x00\x49\x72\xd1\xae\x57\x85\xdb\x42\xaa\x80\xc2\xa6\x5e\xe0\x9d\x81\x07\xe2\xc7\x4d\x4d\x48\x92\x8e\x79\x93\x0d\xfd\xb9\xf2\x8d\x95\xd6\x1a\x7b\x81\x73\x97\x6b\x18\x4c\x98\x68\xb0\x03\x78\x61\xf0\x05\x56\xa8\xe4\x42\x3a\x4f\x6b\x2e\xaf\x55\x51\x10\x45\x21\xfc\x42\x2f\x83\xca\x98\xcf\x15\x31\x62\x8a\x1f\xd3\xc9\xbb\xfe\x6c\x70\x2e\x4e\xc6\x17\x57\x83\xd1\xfb\xa8\x7a\xa9\x23\xe6\x12\xdf\x6a\x64\x0b\xc9\xa5\xaa\xd7\x4f\x0d\x2d\x34\x2b\xf2\xe2\x6a\xbd\xaa\xa3\xa5\x94\xf1\xa2\xc8\xee\x31\x97\x82\xa2\x73\x52\xed\x70\x85\xa2\xc1\x62\x06\xd1\x09\x6d\x44\x75\x11\x5c\x0b\xd0\xa7\x74\xb9\x14\x85\x26\xdf\x29\x68\x81\x77\x77\x93\x55\x46\x73\x7b\x59\x67\xd7\xc4\x2e\xcf\x55\x33\x84\x2f\x17\x37\x05\x98\x60\x6b\x99\x99\x9a\x64\x4b\xcf\xd1\xfd\x0b\x9b\xd4\x10\x74\x67\x49\x2c\xba\xab\xba\x64\xe7\x62\x1b\xec\x24\xe9\x4a\xcc\x14\x7c\x92\x22\x6c\x3d\x1b\x56\x64\xbb\xb6\xfc\x40\x44\x05\x57\xab\x2c\x8c\xe3\x7b\x90\x9f\xa9\x77\x1c\xd2\xc2\xda\x67\x42\xc2\x6c\x1b\x17\x0e\x66\x22\x87\xc2\x72\x59\xe8\xfa\xfa\x86\x2a\x39\x90\xc4\xde\x0f\xc3\x55\xcf\xe3\x39\xa4\x61\x86\x9d\x31\x8d\xab\x1f\x0a\x05\x0c\xbe\x93\x4b\xf0\x00\x70\x1b\x1a\xed\x7d\x82\x87\x00\x6f\xd0\xd2\x81\x7d\x8a\xa5\x9b\xa0\xd3\xe9\xc4\x61\xca\xb3\xc1\xea\x3c\x16\x6c\x31\x18\x89\xbf\x5c\xf6\x47\xb3\xc1\xec\xca\xfe\x85\xa6\xca\x45\x31\xac\x70\xc2\x50\x62\x20\x3c\x38\x6f\xe4\x73\x47\x4e\x91\x42\x1c\xbd\x7a\xe5\x05\x33\xf0\x7c\x1a\x32\xea\x34\x4a\x64\x3a\xba\x75\x93\x05\x90\x64\x84\x5b\x0b\x39\x9e\x5b\x70\x90\xf1\x56\x28\xcb\x6d\x82\x55\x97\x64\x62\x39\x45\x46\x0d\xda\x8c\x0c\x9f\xfe\xa6\xcb\x7e\x45\x25\x06\x6e\x22\x3e\x1d\xc7\xde\x34\x6a\xf9\x83\xf3\x6c\xf1\x09\x3f\xd7\x13\xef\x34\x34\xec\x80\x11\xf9\xbd\xee\x18\x0f\x75\xbd\x5d\x61\x87\x34\xaa\x4e\xf1\x11\x41\x5c\x54\x23\x9d\xb8\xcd\xe2\x11\xe1\xc3\xc9\x82\xc5\xe1\xd6\x76\x7e\xa0\x2c\x5d\x81\x99\xbd\x65\xdc\x06\xe1\xdf\xe4\x2f\x08\x39\x0d\xb4\x25\x34\x14\x86\xe8\x61\x2f\xa2\x8b\xc0\x33\xed\x74\x3f\xcd\x96\x26\x17\xf4\xc2\xe9\x41\xf7\x55\xc7\xba\xce\xfc\x58\x41\x0c\xca\x7f\x0f\x5c\x86\x5c\x23\xc8\x02\xea\xee\x38\x44\x1a\x8c\xb1\x29\x51\x60\x71\x64\x95\x32\x58\xb0\x63\x42\x61\x4f\xd8\x12\x08\x9a\x46\x85\xc1\xee\x2d\x61\x1f\x70\x32\x04\x00\x46\x81\x1f\x44\x85\xf8\x4b\xd0\xf5\x78\x13\x3b\xed\x6c\x57\x1a\xd9\xc2\xb4\xb8\xd5\x79\xbd\x56\x85\xae\x41\x29\xad\x54\xe5\x45\xcb\x6e\x21\xc5\xf5\xc0\x7a\x85\x36\x80\xa5\xa9\x84\x2e\x7c\x6b\xbe\x83\xcc\x88\x35\x76\x29\x80\x6f\x7b\x8e\x9a\x43\x5e\xdb\x0c\x19\xa3\x02\x99\xf3\x15\x58\x30\x52\x78\xa4\xbd\x6e\x97\x3f\x67\xd0\xdc\x0a\xee\xf0\x5e\xc7\x21\x8d\x54\x1d\x9b\x5b\x5f\x7b\x62\xfd\xc9\xc3\x05\xf1\xfc\x02\x2d\xa7\xaa\x61\xa2\x6e\xa1\x64\x99\x24\x02\x92\xea\x7e\x08\x5b\xe4\x05\xae\x80\x11\xaf\x70\x3e\x7c\xf3\x53\x81\x09\xfa\x12\x5b\x66\x2b\xf4\xde\xb0\x23\xc8\xcb\x42\x56\x10\x83\x72\x64\x2b\x41\x30\x2a\xf3\x28\x9c\xd6\xc0\x1a\xb3\x4f\x30\x3c\xab\x57\xd4\x9d\x93\xe5\x3d\x09\xcc\x42\xf6\xf5\xe8\x95\x2f\xd1\x44\xa6\x20\x1b\xd4\x2b\x52\x4b\x6f\x2d\x96\xfa\xae\xc8\x35\x18\xa5\xba\xd8\xae\x91\x9e\x20\xab\x7c\xff\x03\x11\x7e\xf9\x25\x1b\xd2\xfc\x68\x7b\x2e\x2b\xbd\xd0\xb9\xbf\x61\x6a\xd2\x78\x39\x05\x47\x36\x98\x3a\x72\x7b\x53\x45\x1d\x11\xed\x81\xaa\x97\xc8\x1e\x27\x37\x26\xf1\x6d\x42\xc1\xce\x69\x34\x16\x5b\x35\x24\x43\x15\xe2\x97\x3a\xa3\x6e\x68\x8d\xf6\xa4\x70\x75\xb7\x56\x13\x50\x1f\x04\xd8\x80\x7e\xe5\xc1\x56\x71\xcc\x1a\xaf\x23\xb7\x4f\x75\x51\xa9\xdc\x33\x1d\xea\x82\xba\x58\x7b\x22\x2f\xe8\x5e\x0b\xb5\x94\xcd\x2b\xb6\x88\x24\xe4\x20\x04\x5d\x54\x37\x25\xdc\xbb\xc0\x72\x93\x5d\x23\xdc\xc0\x1e\x79\x28\x71\x2d\xcd\xa1\xab\x55\x94\xbe\x9f\x8e\x0f\x96\xe2\x21\xaa\x98\x9e\x4d\x62\x80\x63\x5e\x83\x65\xe5\x94\x44\xe2\x2d\x1f\xa2\x29\x0b\xb2\x3a\xed\x93\x05\xad\x3c\xe6\xd8\xbb\x34\x48\x3e\x71\x23\x72\xb4\x17\x9a\x86\x02\xac\xfc\xb5\x42\x95\xb8\xb6\xb2\x7c\x03\xb6\x6c\xa5\x5d\xb3\x53\x68\x2f\x8f\x45\xdc\xa2\xde\x2c\x61\x7d\x1b\x55\x92\xa7\xae\xd7\x93\x10\xe2\xdb\x9e\x38\x1f\x9f\x0e\xce\xa8\x40\x77\xfa\x98\xe9\xca\xfd\x88\x7c\x28\xb8\x35\x35\x6f\x7e\xc4\x4d\xb2\x8d\x43\x43\xc3\x43\x5f\xb3\x19\x12\x5b\xb2\x76\x02\xdc\x4d\xa7\x72\xd4\x6d\xc1\xeb\x18\x1d\x2c\x17\xca\x00\x1b\x52\x64\xfa\xba\x40\x60\xeb\x7b\x2b\x85\x74\xe3\xa0\x2f\x75\xfb\x32\x49\x50\x4a\xd1\xf0\x88\x00\xce\xdc\xf5\xa5\x8b\x74\xbf\xf5\x1a\x64\x1f\x05\xf3\x76\xa3\x8d\x91\xf6\x7f\x01\x17\xae\x42\xae\x00\xbe\x21\x83\xd3\xba\xd4\x74\x85\x41\xf4\xd6\xa1\xfd\x9a\x2f\xe0\xba\xa5\x7e\x0f\x48\xb2\xe9\x53\xde\x17\x12\x07\x00\xc0\x28\xa2\xab\x15\x21\x77\x87\x22\xa3\x7b\x14\x4b\x8c\x17\x8e\xea\x23\xab\xda\xab\x01\x85\x37\xf8\x67\x32\xd1\x5d\xf3\x26\x57\xe9\x7c\xc0\xe0\x2c\x6c\x8c\x8b\xd1\xe2\x52\x8a\x3b\x60\xaf\x2a\xb6\x09\xb2\x56\x99\xa0\xaf\xdb\x07\x88\xdf\x6e\x77\x85\xd7\x0f\xbd\xa5\xc1\xea\x0d\x8c\x58\x1c\x37\xe5\x90\xe2\x61\x70\x90\xda\xd1\x96\x35\x8c\x25\x5f\x83\x0c\x67\x87\x72\xe2\x06\x7b\xa9\xe3\x62\xbe\xeb\x89\xa1\x02\x8d\xd3\x58\x4d\xb0\x4a\xe8\x0c\x27\x11\xa9\x13\xf6\xa4\xc6\xfe\x8d\xd4\xe3\xa5\x95\x6e\xa5\x2f\x06\x89\x80\x75\x83\xf4\xae\x73\x8b\xed\x31\xbf\xc6\x24\x1a\x1e\x65\x56\x88\x2b\x60\x52\xa7\x94\x02\x67\xc8\x76\xaa\x98\x03\xa2\x63\x50\x95\x69\x7f\x1a\x36\x4b\x55\x70\x47\x41\x2e\x0f\xee\x76\xfb\x02\x47\xfb\x7e\xd2\x13\x53\xb8\x8a\xa3\x55\x01\x27\xbc\x0a\x48\x40\xbb\xcc\xd3\x8e\x29\x35\x0d\x59\x7e\xcb\x69\x4f\x5c\xb0\xa1\xc7\x9d\x92\x5b\xbe\x6b\xa7\xea\x12\x42\xa4\x3d\xd1\x5f\x2e\x89\x34\xd0\x31\x22\xb6\xba\x29\xdb\xbd\x00\xe5\xdf\xc8\x24\xb1\xad\x44\xea\x5e\x3b\x4f\x31\x7a\x39\xbf\xec\xcc\x9e\x5c\x30\x73\x12\xa1\xd6\xc0\x61\x0c\x4c\x2e\xfe\x76\xea\xf2\xb9\x9b\x9e\xcc\xb5\x72\x7d\xf4\xc8\x4c\xf0\xe2\xc8\xa9\xe6\x07\xf4\xde\xce\x34\xa1\x0b\xa4\x03\x9f\x94\xb9\xd1\x77\x8e\x91\xb0\xbf\x5c\xca\x62\x59\xaf\x31\x71\xc8\xd3\x79\x1f\x2c\x3c\x67\x83\x1a\x63\x75\xde\x43\xce\x6d\xa5\xdb\xd9\x07\x82\x4f\x90\xa5\x1c\x3a\x41\x41\xaf\xfb\x07\x5c\x3b\x1e\xce\x07\xb7\xba\xd8\xcc\x02\x18\x7e\xd0\x97\x6c\x91\x88\xf3\x77\x06\xc1\x14\x10\x0c\x82\x3a\xc5\xb5\x85\xde\x27\x6d\x43\x9d\xe8\x01\x14\x8a\x91\x1e\x28\xcb\x5c\x22\x15\x66\x05\xbd\xa5\x2a\xb9\x76\xac\x58\x9e\xb9\x99\x5d\x8f\x04\x2c\x91\x04\x88\x1e\xdc\x11\x8a\xb1\x1a\xbb\x6e\x84\x8c\x97\xa2\xa5\x5d\x7a\xe4\x69\x94\x94\x9e\x7f\x60\x02\xcd\x75\x4c\x1c\x89\x77\x11\x92\x79\x35\x46\xfb\xf0\x48\xbd\x1b\x15\x8c\xd0\xae\x51\xa8\xff\xb0\x0e\x0e\x0f\x19\xac\x11\x51\x9a\xf0\xfb\xba\xa6\x4b\x76\x9d\x72\xed\xde\x50\x5f\x43\x4e\xa5\xf0\x5b\xfe\xa7\xc6\xf6\x35\xed\x76\xbe\xb7\x92\x6e\x51\x82\x63\x4d\x67\xc8\x9b\xd9\xd9\x13\xec\x7a\x04\x48\x7e\x92\x77\xcc\xae\xdb\x7c\xf3\x0e\xe1\xc5\x37\xb6\x6e\x41\x55\x41\x0f\xff\x39\x24\xa6\xac\xd7\x3b\x83\x7b\x9c\xd8\xf8\x09\x1a\x40\x8f\xf2\x1b\x4a\x7b\xed\xef\x3b\xbd\xb6\x92\xd8\x1a\x0b\x05\x73\x3d\xfa\xc0\xbe\x2b\x80\x55\xb8\xcb\xc1\x2a\x38\xbb\xed\x86\xed\xca\x38\xcc\x48\xf1\x5e\x5d\x3e\x76\x5f\x7a\x66\x2b\xf0\x45\x19\x64\xb0\xeb\xee\xfc\x33\x1a\x34\xc5\xb6\x43\x7a\xfb\x0b\x47\xcb\x0a\x68\x9e\x7d\xfb\xfa\xfd\x53\xb9\x74\xed\x39\x93\xd8\xcd\xa7\x47\xbc\x88\xce\xe9\x26\x52\x53\xfe\x98\xf3\x75\xe1\x3b\x76\x22\xf9\x4b\xe1\xfb\xe7\xbb\x70\x5f\x50\x48\xde\x18\x93\x2b\x24\xf0\xa3\xa2\xdd\xaf\xb8\xa5\x28\x4e\x74\xd8\x71\x53\x75\xe8\xc3\x96\xb4\x79\x5d\x86\xe3\x57\x25\x06\xa9\x3d\xea\xde\xfe\x06\xf2\xbf\x3d\x97\x2e\x47\xd3\xdf\x95\xf6\x06\x2d\xa2\x39\xdb\x10\xc0\xbc\xc2\xd6\x1c\xbc\x38\xf4\x40\x1a\xfb\x79\x4f\x9c\x62\x9f\xaa\xee\x8d\x4a\x8b\xa5\x2e\x0d\x6d\x12\x51\x1d\x65\xee\x73\x1c\x89\xed\xe0\x3a\x6a\x1e\x7f\x7e\xe1\xa8\x27\x4e\x35\x39\x48\x64\xbb\x15\x5b\x21\x3f\x23\xb7\x8d\xdf\x42\xd3\x78\xb7\x70\x7d\xb4\xa1\x04\x03\x5e\x13\x84\xae\x8a\x6d\x7b\xc9\xc3\x90\x4d\x4b\x1b\xb9\x7e\x7b\xd0\xb5\xb4\x03\xdf\x81\x88\x0c\x84\x81\x2c\x98\x2f\xf7\x97\x3a\xcb\xd5\x0a\x02\x32\x1d\x19\xfb\x00\x6d\x61\x95\xb6\x8b\x83\x11\x80\xc5\x71\xcc\x79\x11\x70\x61\xe4\x0a\xed\x10\x74\xd5\x7d\xa6\xbf\x83\x41\xcb\x48\x3f\xc2\xcc\x9a\x8a\x34\xeb\x9e\x98\x69\xf4\x15\x94\xd5\xeb\xcb\x65\x24\x40\x6c\xca\xe4\x60\xcd\x76\xde\xd7\x3b\x36\xae\x7d\x31\x93\x1a\xa3\x07\x33\x4b\x54\xec\x3a\x40\x21\x0f\xf2\xac\xb5\xe5\x2e\x0c\x19\x66\x8f\x09\x5d\xe0\x07\x06\x2d\x3c\x1d\x98\xc5\xba\xdb\x32\xf8\xbc\x9d\x1c\x2c\x65\x6b\xc7\xe7\x5b\x48\x25\x5b\x0d\x4d\xf5\xf1\x2f\x5f\xae\x42\x4c\x8b\x23\xcf\x87\x87\x6c\x24\x44\xff\x6e\x95\xbc\x13\x4c\xa5\xe9\xf2\x48\x2e\x31\x0c\xe6\xe5\x2d\x77\x99\x17\xba\xbc\xce\x0a\x2e\xd8\x20\xcb\x16\xef\x5a\x00\xdd\xdf\x46\xbd\x45\xa1\x93\x16\x87\x73\x3a\x16\x86\xc0\x14\xf6\x73\xf5\x06\x23\x88\x88\xa3\x5c\x62\x0e\xae\x15\x88\x26\xeb\xa5\xfd\xc5\xe3\xef\xc2\xaf\x35\xa2\xd2\xae\x4f\xb3\x44\x40\x67\x28\x26\xa1\xd9\xb6\xeb\x60\x8b\x31\xf2\xd1\xca\xf0\xbd\xcd\xa1\x21\xfa\x1f\x15\x70\xe3\xfd\x7c\x1f\x62\x30\x6d\xbe\x45\x30\x13\x85\x66\x02\x12\x04\x87\x4b\x45\x1a\x00\xfb\x30\x6e\x8c\x39\x68\xda\x2d\xd4\x53\xd7\x1d\xf2\x8c\x22\xb3\x0c\x11\x08\x93\x20\x10\x39\xe5\xcb\x3b\xdf\xfa\x71\x6c\xb1\x12\xd9\xee\x6c\x40\xc5\xe0\x4b\xe8\xe9\x09\xd4\x66\x74\x4b\xdc\x97\xd9\x02\x14\x59\xc8\xc1\x9b\x44\x95\x27\x68\x33\xc1\xe1\x78\x0b\xe2\xcb\x7f\x2c\x25\x96\x61\xc1\x1d\x9c\xc3\x72\x59\xd7\x12\x90\x51\x6a\xa1\xaa\xd0\x21\x70\xba\xc4\x59\x1d\xfe\xb2\x46\xcc\xcd\x92\x5b\xb2\xd2\xa3\x5c\x5e\x18\xe5\x91\xa8\xbb\xfd\xd7\x0e\x38\xdc\x15\xac\x23\xa5\x5b\x1b\xe4\xdc\x18\x69\xea\xf4\x4e\x14\xb2\x45\x9b\xc0\x04\xe3\xa6\xec\xa8\xbf\x89\x58\x80\x0a\x5a\xb6\xe1\xd1\xe5\xca\xca\xce\x9b\xe3\xbb\x9e\x38\x19\x9f\xbf\x1b\x8c\x06\xa3\xf7\xe2\x74\x7c\x72\x79\x9e\x8e\x66\x8d\xa0\x14\xb4\x49\x6f\x44\xd3\x3c\xdf\x23\x63\x6c\x1f\xc4\x0a\x25\x2d\x6f\x0a\xce\x2b\x5e\x6b\xac\xa8\xbe\xc5\x00\x55\x00\x9c\xf6\xb1\x34\xd3\x15\xb6\xe2\x20\xb8\xe2\xe0\x8b\xef\xc2\x15\x30\x23\x76\x9b\x0c\xc1\x07\x9c\x5d\xe6\xa6\x92\x04\xcd\xfd\xd8\x7a\x25\x3c\x35\x7c\x31\x33\x3b\x9e\x0a\x1a\x92\x56\x6c\x89\x26\xa4\x42\x13\xbf\xc3\x09\x9b\xb9\x31\xf3\x67\x0b\xc9\xc0\x09\xbe\xee\xec\x69\xec\xf2\xc8\x12\x22\x34\xcc\x2b\xb5\xc9\x25\xa5\xb0\x16\x59\xde\x35\x2e\xd2\x03\x74\x0c\x98\xf5\x90\x6b\x21\xed\xd3\x03\xbf\x08\xf0\xc9\xfc\xd8\x8e\x87\x79\xe0\x9f\x3d\xa3\x10\x93\xb0\x67\xcd\x73\xb1\x32\xee\x2a\xc1\x44\x6f\x94\x4b\x02\x13\x11\xb0\x0f\xbc\xe7\x75\xa1\x7e\xa9\xe1\xdc\x67\xcb\x25\x79\x82\x81\xce\xc4\xb6\xd3\x02\x9d\x0b\x7b\x3b\x9a\xa4\x15\x0b\x71\xdb\x47\x80\x7e\x3e\x21\x51\x40\x8a\xdf\xa7\x56\xdc\xcf\xd9\xde\x50\xb9\x01\xce\x77\x1c\x03\xf1\xfd\x89\x73\x1e\x36\xcc\x30\x5b\xfe\x5c\x9b\x2a\x84\x8b\xc6\x17\x2f\x0b\xdf\xe3\x06\x40\xc3\xd7\x77\x96\x72\x20\x00\x68\x59\xb5\xa4\x39\x08\x5a\xf2\x69\x0c\xac\x4a\xf3\x80\xf7\xca\x17\x73\x97\x88\x33\x5a\x08\x1c\xda\x9d\x7e\xf0\x5b\xef\xb8\x3d\xf2\xee\x96\xef\x41\xd7\x66\xf7\xa7\x43\x9f\x24\xa0\x4c\xa7\xe6\xae\x80\x90\x6d\x7f\x29\x34\x60\x7a\xfb\xc8\xcc\x28\x4e\xc6\xc3\x61\x4a\xd5\xf6\xe3\xb3\x6e\x25\x46\x65\x2f\x0b\x0d\xbd\x60\x28\x45\x65\xc8\x36\xee\x4a\x72\x7e\x95\x6e\xc3\x88\x8c\xbf\x64\x82\xb6\xd9\x8d\x22\x9f\xa0\xd6\x21\xdc\x1e\xff\x9e\xf6\xd9\x74\x20\xb6\xa6\x27\xe0\x27\xd3\xa5\x1b\x03\x50\x43\x59\xe7\x1d\x43\xb0\x5a\xb6\x95\x9e\x6d\xb8\x71\x7e\x5c\x04\x3c\xe9\xc8\xdd\xf2\x12\xcb\xcf\x55\x99\x2d\x2a\x3f\x78\x57\x8b\x02\x77\x2a\x93\xf5\x06\x83\x6e\x64\x3a\xa0\x25\x17\x2f\x5c\xd0\x44\xaf\x93\x16\x1b\xd5\x3f\x91\xe9\x74\xf6\xbd\x03\x90\x7a\x85\x5c\xad\x76\x60\x01\xc5\x38\xc5\xda\x79\x85\x1a\x1d\x13\x5a\xd3\x0c\xc0\xc7\x5d\x0b\x86\xf8\xf4\x30\x50\xfa\x87\x9e\xe8\xbf\x7f\x3f\x49\xb1\x11\x22\xd2\x22\x0e\x46\xa7\xe9\x45\x3a\x3a\x4d\x47\x33\xe0\xe3\x98\x22\x7a\x36\x6c\x74\xdf\x94\x43\x7b\x99\x57\x26\xa8\xf5\x31\x11\xcf\x32\x77\xbe\x44\xb7\x76\x29\xad\x47\x85\xc6\x05\x6f\x1a\xe3\xbd\x12\x4a\xee\xda\x7b\x11\x93\xe7\x92\x8d\x64\x0d\x28\xcb\x30\x45\x0d\xfe\x27\x61\xa3\x3c\x25\xb8\x35\xf5\xee\x6e\x34\xc8\x64\x5d\xd0\x2f\x1e\xcb\x4c\x05\xfb\x55\xe8\x68\xaa\x3e\x70\xab\x0c\xd6\x72\x07\x04\xcc\xc1\x07\x9d\x67\x1c\x7e\xd9\x63\x37\xb3\x42\xec\x67\xd7\xd7\x76\x7f\x2a\xb9\xcf\xb8\x96\x60\x3f\xfd\x04\x36\x1b\x6c\xe4\xe1\xe3\xce\x46\xe6\xab\x97\x9e\xb4\x02\x91\x71\x90\x92\xc2\x97\xf1\x4d\x19\xcf\x48\x17\x8e\x3d\x08\x67\xab\x4a\x87\x18\x0f\xbe\xca\xb9\x99\xad\x0b\x1f\x04\xc5\x58\xbb\xaa\xb7\xa2\x68\xfb\x20\xe0\x75\x46\x7b\x3e\xe0\xb2\x0e\xd2\x7b\xe2\x35\x80\xa2\x23\xce\xd4\x10\xb0\xd2\x95\x76\xf3\xad\xe0\x42\xac\xb7\x4f\x4b\xd8\x2b\xe1\x97\x3a\x2b\x2b\x1f\xa2\xb2\x4a\xd8\x9a\x07\xbc\xda\x49\x33\xca\x1c\xba\x34\x71\x24\x4e\xc7\xc8\x20\x53\x97\x25\x30\x18\x80\xa1\xd3\x32\x2b\xb9\x17\x29\xbf\xa8\x27\xc6\x0e\x5c\x0c\x0b\x8a\x60\x1e\x44\x39\xfa\x47\x67\xf8\x4c\xfb\x55\x94\x53\xff\x00\x24\x6a\x12\xb3\x49\x7f\x34\x45\x76\x6e\xb0\xbe\x02\x3c\xb4\x32\x61\x74\xc7\xd7\xe0\x85\xe9\x8b\x44\x18\xed\x5c\x8a\x10\x5b\xe8\x9f\xd3\x4e\x09\x75\xe4\x10\x9c\xb5\xdb\x13\x13\xb8\x33\xac\xec\xec\x34\xb4\xc2\x87\x3b\x4c\x16\x40\xe2\xb3\xbc\xcb\x6f\x51\x65\xab\x18\xca\x24\x91\x37\xe4\xda\x29\x35\xc6\x1d\x46\x44\xba\x8d\x18\xce\xa1\xba\x63\xc4\x46\x45\x83\x88\xd9\x74\x19\x8e\xbd\x76\x9b\xce\x08\x92\xde\x54\xdf\xed\x1b\xad\xd1\x0c\x2a\x78\x3f\x73\x68\xec\x68\x27\x0a\xf1\xd2\x45\x66\x48\xe9\x2d\x95\xf1\x7c\x30\xcc\x44\x51\xdd\x44\x2b\xe2\x10\x72\x4f\x7d\x47\xf2\xf0\xa7\x01\x9b\x61\x5d\xca\x4c\xe5\x20\x8f\x3f\x44\xe4\xad\xe1\x3d\x8a\xa1\xc6\xcd\xd6\x77\x39\xf7\x6c\xa8\x49\x03\x4c\x14\xc9\x9a\xef\x61\xe5\xb9\x69\xdc\x2a\xae\x5c\xbf\xba\x78\x65\xfa\x2e\x9e\x14\x74\x7d\xd8\xf5\xfa\x87\xde\xae\x0c\x30\x92\xa0\x0e\x86\xe9\xee\xe2\x2c\x04\x1f\x69\x27\xe3\x46\x80\x05\x65\xb6\xc5\xbb\x1b\x8d\xc8\x64\xd7\x32\x8d\xd1\x19\x9a\x1f\x44\xdd\x15\xb7\x8e\x48\xb1\x41\x9f\x4f\x7c\x28\xf0\x14\x3c\x25\x9e\x5f\x96\x07\xb6\xb4\x07\x9c\x01\x71\x60\xae\xf0\x00\x3c\xf1\x2b\x24\xe7\x3c\x95\x05\x96\x3d\xbe\xea\x89\xb3\xcb\xd9\xe5\x24\x15\x93\xf4\xc7\x41\x40\x74\xee\x29\x80\xd9\xdd\xdb\x55\x7f\x1e\x51\x9d\x17\x12\x8a\x0d\x91\xef\xbc\x49\x72\xfe\x70\x2d\x7c\x17\xf7\x39\xdc\xa0\x11\x5f\x3a\x13\xa0\x1b\xb5\x56\x39\x62\xc5\xcd\x46\x95\xca\xb9\x38\x8c\x66\x74\x4d\x5a\xe6\x75\x45\x7a\x0f\x3a\x65\x20\x6f\x1e\x31\xfe\x52\x11\x23\xbc\x62\x53\xea\x79\x2e\xb1\xd0\x85\xa8\x96\x0c\x52\x6b\xdc\x54\xd5\xe6\xcd\x37\xdf\xdc\xdd\xdd\xf5\xae\x8b\xba\xa7\xcb\xeb\x6f\xb8\x7c\xf8\x1b\x2c\xbd\x08\x29\xda\x1b\xfc\xe2\xca\x3c\x91\xac\xbd\x15\xb1\x62\xca\x4b\xc3\xed\x0e\x03\xea\x75\xfc\x4e\x13\xaf\x13\xc8\xcd\x3e\x77\xe2\xc8\xec\x45\x78\xcb\x95\x98\x01\x56\x5b\x51\xac\x99\x05\x8b\x03\xcd\x50\x53\xc3\xe8\x7e\xaf\xfe\x29\x90\xcd\x18\x1d\xee\xd4\xcb\x3e\xaa\xa3\xe7\x0c\x5a\x74\x52\xf0\x26\x1a\x02\x7e\xbc\x83\x5f\xfe\xc0\xd9\x6a\xcb\x32\x5b\x55\x87\x1c\x4f\xdb\x25\x76\xed\xf5\x72\x06\x13\x0e\x66\x6b\x0d\xc6\x68\x89\xdb\x8a\x6f\x1b\x37\xf9\xb2\xa3\xe5\xaf\x20\x2a\xe7\xdf\x30\xbc\xfe\xe9\x69\x3a\x3a\xbd\x3c\x7f\x63\xb5\x82\x8f\x87\x35\xdc\x18\xd0\x28\xce\xec\xdd\x9b\x75\x7c\x0c\xea\xca\x9c\x47\xe2\xb6\x8c\xc8\x0e\x92\xce\x26\xda\xb2\xe9\xae\x2d\x43\x0f\xd1\xc1\x4b\xdd\x3e\xfb\x8b\x17\x23\x46\xa1\xbb\x6f\xc4\xcf\x60\xb6\x38\xe8\x82\xaf\xb0\x78\x13\x12\x55\x2c\x0e\xc5\x55\xda\x9f\x88\xab\xf1\xe5\x44\x8c\xfa\xe7\x69\x4f\x5c\xf8\x5b\x5e\x45\xb4\xa8\xa8\xa6\x23\x4c\x1e\x24\xd6\x1c\xa1\xbe\xf2\x9e\x65\x37\x9a\xe1\x31\x75\x92\x04\xbc\x3f\x47\xa2\xeb\x34\xc4\xd4\xff\x0f\x6d\xe6\x5b\x6f\x4d\x77\x98\x17\x68\x42\x0f\x07\x53\x60\xbe\x1f\x4c\xc4\x6c\x30\x1b\xa6\xd3\x00\x5f\xd6\x46\x87\xfb\xef\xf0\xad\x43\x1f\x6d\xc1\xc3\xfd\x27\x5d\x69\x58\x4c\x2e\xda\xe5\x5f\xb7\x63\x22\x0f\x2f\xd6\x3e\xf4\x7c\x71\xa2\x55\xe8\xce\xd2\x51\x2b\x71\x52\xec\xc3\x58\x3b\x3f\xb2\x0f\x45\xf6\x32\x03\x03\x94\x4a\x45\x10\xf5\x05\x10\x66\xa4\x6c\x73\xb9\xa9\xc6\x1b\x5b\x8b\xe4\x5e\xd8\xf5\xc7\xe8\x55\xfb\x0f\x2d\x70\x18\x06\x5a\x75\x54\x95\xf2\xd4\xfd\x31\x0c\x33\x4a\x45\x55\xaa\x5b\x6b\xb0\xca\xa0\xbc\x8e\x59\x18\x16\xd0\xbb\xf8\x2e\x64\x26\xc0\x60\x0b\xa9\x4e\x23\xfd\xd7\x30\x14\x68\x7d\xbf\x9c\x04\x7a\xeb\x3b\x6d\x31\x29\x89\xe7\x59\x70\x56\x13\x13\xd8\x56\x8f\x70\x5b\x54\x9a\xf8\x5b\xc8\x48\xa8\xf1\xec\x37\x98\x2c\x7e\x6f\x3a\x9c\xff\x70\x3f\x5d\xfc\x4f\xc7\xbf\x2d\xff\xd3\x1f\xbe\x3f\x3e\x6a\xf3\x3f\x7d\xfb\xcc\xff\xf4\x5b\xfc\x3c\x99\xff\xe9\x38\x11\x23\x7d\x8b\xfc\x1b\x76\xa3\x3a\x28\xa0\x92\xe3\x57\xaf\x8e\xec\xff\x1d\x3f\x93\x41\x3d\x4e\x06\xb5\xaa\x0b\xb8\x95\xb2\x1c\xa9\x26\x8d\x5c\xd5\xf9\x33\x35\xd4\x33\x35\xd4\x33\x35\x54\xf5\x4c\x0d\xf5\xfb\x52\x43\x25\xcd\x4a\xee\xdf\x83\x2a\x6a\x1a\xb6\x03\x47\xe7\xcc\x20\x78\x34\x5f\xbe\xbc\x53\xd6\xb4\xa5\x1e\x24\x2f\x41\xc0\x72\x8f\x87\xe0\xed\x57\x85\x58\xd6\x25\x77\x43\x60\xdf\x35\xab\x10\x12\xd0\x59\xdc\x43\x78\x5f\x82\x4b\xfe\xae\x7c\x55\xc8\x8e\x8b\xd5\xda\x91\x43\xb5\xa2\xd2\x2c\x1f\x4a\xec\x08\x1f\x32\x42\x02\x75\x2b\x06\xb8\xa1\x26\xcf\xfb\xbc\xb8\x00\x7e\xdb\xf2\xec\xee\x99\x24\xab\x4d\x65\xf5\xbf\x38\x49\xd6\xec\xa6\x36\xcf\xec\x58\xff\xc1\xd8\xb1\x80\x0a\xdd\x89\xbc\x0b\x4d\xae\x14\x95\x7a\x02\x5a\x2c\x06\x7e\xfa\x19\x61\x96\xb3\x69\x28\x53\xf3\x54\x3f\xa9\x08\xcb\x85\xaa\xd4\x6b\x8f\xa0\x67\xf7\xbf\xc8\xb2\x2b\x5a\xf3\x40\x04\xd5\xd1\x0a\x74\x82\xa8\x8d\xe0\xc6\x37\x04\xba\x2a\x42\x2c\xe1\x3f\x25\x1f\x98\xe8\xb7\xe1\xa9\x8c\x41\xad\x90\x19\x86\xf0\xb2\x0c\xa8\xdd\x85\x58\xa5\x4f\x33\xbc\xf6\xdf\x2d\xd3\x58\x27\x25\x17\x64\x6e\xf8\x8a\x71\x56\xf7\x33\xbf\xd8\x6f\xc7\x2f\x06\x6a\x35\x9b\x1b\x49\xbc\x43\xfc\x5b\x8f\x2e\x47\xdc\xf1\xaf\x4f\x3b\x56\xe0\x9e\xf1\xa0\xda\x9f\xb1\x57\x58\x64\xd0\x53\x2d\x4d\xa5\xac\x8b\xbd\x76\xb8\x12\xf9\xf9\x99\xc5\xcc\xb3\x98\x25\x01\x1d\x99\x7d\xec\xc5\xe9\xd9\xe3\xc4\x66\xe1\x2a\x54\xe1\x0e\x04\x3b\x14\xf0\x9d\x8d\xde\x27\xe2\xa7\x93\x33\x18\xce\x9f\x2e\xde\xef\x24\x46\xfb\x5f\x83\x07\xad\x6b\x45\x9f\xa9\xd1\xfe\xd9\xa9\xd1\xfa\xce\x58\xda\x4f\x39\x6b\xf5\xd3\xd5\x7f\xd9\x77\xf7\x22\xfa\x17\xa6\x9e\xd7\x85\x6a\x51\x10\x84\xb6\x9f\xe3\x99\x31\x01\xf3\xc3\x4f\x57\xff\x85\x99\xbf\xc0\xa6\xb7\xff\x8e\xd1\xd9\x61\xd6\xdb\x99\x25\xce\x29\x72\xdf\x68\xb9\x45\xe2\xe0\x83\xb5\x83\xec\x9f\x41\x15\x18\x12\x1b\xd7\x7c\x83\xe7\x05\xc0\x6f\x3b\x58\xa5\xa1\xbd\x10\x7a\xba\x9c\xdf\xe9\xc2\x20\x37\xaa\x1f\x9b\x45\x50\xba\xf4\x58\x67\x6b\xf5\x6b\xb1\x1f\xd5\xc8\xc2\xce\xee\x0b\x6e\x9e\xe4\xcd\x51\xc7\xe6\x12\xf4\x2f\x6f\xd8\x21\xa8\xb8\xb9\x71\xb0\x09\xbe\xdc\xd8\x9e\xa8\x93\x0e\xe6\x6d\x9d\x55\xeb\x0e\x57\x64\x96\xb2\x36\xfa\x08\x57\x59\xb5\x15\xa7\xca\x20\x8e\xb2\x34\xa2\x80\xa5\xd7\xa1\x59\x47\xbc\x11\x15\xec\x42\x8b\xc1\x6e\x17\xfd\x1c\x97\xa4\x75\xbe\x05\xac\x52\x1f\xdf\x44\xc3\xda\x25\x51\xe1\xa6\xa4\x10\x50\xb3\xe3\x15\x46\xb3\x41\x31\x66\x8c\xae\x85\xd6\x2e\xf0\x6c\x48\x78\xe2\x0b\x95\x34\x6f\x82\x92\x37\xe8\xd5\x42\x37\x31\x5b\xa7\xbb\x46\x67\x17\x09\xce\x2c\x01\x93\x40\x1f\x5a\x03\xa0\xd0\xdc\xbe\x99\xca\xc3\xed\x5e\xb9\x83\xd5\xa8\x79\x7f\xe6\x1a\x7c\xe6\x1a\x7c\xe6\x1a\xec\xe2\x1a\x3c\x70\x8b\x62\x47\x0f\xe4\x1c\x1c\xdb\x59\xaf\xe1\x68\xc3\xe9\xf3\xdf\xba\xf5\xc4\x4f\x21\x18\xf9\x99\xa3\xf0\x99\xa3\xf0\x99\xa3\xf0\x99\xa3\xf0\x57\xe0\x28\xdc\xcd\x47\x08\xa8\xd8\x7f\x1b\x89\xe0\x13\xb9\x02\x7f\x0d\xbe\xc3\x67\xbe\xc1\x67\xbe\xc1\x67\xbe\xc1\x67\xbe\xc1\x67\xbe\xc1\x67\xbe\xc1\x5f\x85\x6f\x70\x25\xef\x90\xbe\x82\x08\x07\x01\x7d\x80\xc5\x7e\x72\xeb\x0e\x23\x54\x0d\xa3\x3c\x28\x13\x16\x1b\x3e\xf3\x13\x3e\xf3\x13\xfe\x73\xf3\x13\xa6\x1d\xfc\x84\x7e\xae\x4c\xc0\xf7\xef\x9d\xa4\xb0\x3d\x8b\x67\x92\xc2\x67\x92\xc2\x7f\xb7\x24\x85\x67\x9c\xe1\x6c\x89\xef\x53\x58\x0a\xdb\x41\x78\x11\x13\xee\x3d\x53\x15\xfe\x43\xa9\x0a\xd3\xdf\x9d\xaa\x10\x13\x0a\x3b\xc6\xf1\xf7\xd2\x16\x0a\x21\xc6\xe1\x5e\x15\xdb\xce\xf4\xc1\x33\xc5\xe1\x3f\x15\xc5\xe1\x0e\x21\x79\xa6\x38\x7c\xa6\x38\x7c\xa6\x38\x7c\xa6\x38\x7c\xa6\x38\xfc\x1d\x28\x0e\x1b\x19\xe3\x4d\xc3\x3c\x52\xe5\xee\x8b\xf7\x99\x18\xf1\x99\x18\xf1\x57\x21\x46\xdc\xed\x31\x7f\x2d\x31\x62\xfb\x49\x8f\x11\x23\x3e\xe0\xee\x74\x10\x23\xa6\x7f\x0f\x31\xe2\x2e\x1b\xfd\x99\x18\xf1\x99\x18\xf1\x99\x18\xf1\x1f\x49\x8c\xb8\x8b\x82\x90\xa3\x28\x3e\xf0\x5b\x4a\x63\x2f\x8d\xe2\xda\xdb\x5d\x0d\x2e\x43\x82\x41\x41\xd4\x11\x50\x10\xa8\x14\xe5\x75\x96\x33\x4d\x96\x57\x89\xfc\xc5\x17\xc6\x7e\x07\xa2\x3a\x5b\x5d\x2c\x01\x78\xd5\x3c\x62\x08\x68\xc5\x1a\xf4\x9e\xf8\x48\xe5\x26\x8d\xea\x29\x7f\x74\xb2\x22\x66\xf7\x7b\x22\x8d\xa2\x83\xcd\x56\x21\x6b\x1f\x65\xdb\xff\x59\xc9\x0f\xc9\xfa\xa6\x1b\xf7\xd7\x62\x3e\x9c\x97\xd9\xe2\x93\xac\xda\x76\x66\x73\xf5\x12\x17\xdb\xb1\x3a\xa1\xd4\x85\x5a\x84\x61\x1e\xc8\x17\x23\xae\xa6\xb3\x20\x2e\xf8\x96\xbd\xcb\x1e\x63\x50\x8c\x31\x5a\xed\xa1\x3e\xf3\x29\xfe\xf3\xf3\x29\x92\xc9\x41\xa1\xc9\x26\x37\x55\x2b\x8d\xc0\xf6\x49\x97\x89\xde\x75\xa9\xfe\xdd\xdc\x8c\x6d\xa2\xc5\x78\xf2\x3a\x18\x25\x5d\x8b\xce\x55\xf8\x35\x68\x1d\x77\x0d\x0b\xa2\xeb\x6c\x90\x96\xc1\x6b\x93\xee\xef\xb7\x08\x1e\xa3\xd2\xc5\x66\xc6\x40\x3d\x62\x1e\x36\x62\xe1\x21\x46\x1d\xdf\x1f\x6a\xc3\x03\x77\x02\x0e\xad\x24\xb5\xf3\x5a\xfe\x13\x47\x87\x38\xd0\x6a\xbb\x21\x5a\x46\x7a\x90\xa7\x16\xa9\x3c\xb0\x0c\x06\xf8\xcc\x56\xf9\xcc\x56\xf9\xcc\x56\xf9\xcc\x56\xf9\xcc\x56\xf9\xcc\x56\xf9\x4f\xc4\x56\x79\xfc\xeb\xb0\x55\xee\x20\x71\xec\x66\x5a\xb4\xeb\x58\xe8\x36\x37\xe2\x6f\x46\x39\xd9\x35\xd4\x76\xc1\x42\x57\x71\x42\x12\x85\x69\x80\x9d\xb2\xd7\xeb\xe1\xf0\xf7\x45\xae\x0a\xc9\xf1\x4d\x65\xde\xec\xfd\xbb\x20\xf2\x7c\x64\xe6\xae\x78\x39\x9a\xa5\x2e\xc9\x2e\xe7\x3a\x2c\x17\x4d\xe7\xb2\x87\x9b\x52\xca\x44\xac\x65\x09\xa8\x36\xa8\x1f\xb9\xd3\x02\xb2\xf4\x05\xc5\x1a\x2a\x0d\x55\xd5\xb8\x63\xaa\xaa\xf1\xf4\x3f\x33\x60\xfe\xc3\x7e\x7a\xdf\x0c\xdf\x5f\x0c\x5f\x1e\xf7\x5e\xbd\xd4\xe5\x4b\x38\xd1\xbf\x32\xfb\xe3\x63\xfc\x8f\xdf\xbf\xfa\xf6\xdb\x57\x0d\xfe\xc7\xd7\xdf\x1d\x1d\x3f\xf3\x3f\xfe\x16\x3f\x56\x60\x87\x83\x77\x93\xfe\xe4\x4a\xbc\x4f\x47\xe9\xa4\x3f\x14\x17\x97\xef\x86\x83\x13\x67\xb1\xb2\xe6\x3f\x4e\xc4\x9f\xea\x42\x8a\xa3\x1f\x7e\x38\x6a\xb0\x3f\xda\x5f\x3d\xc2\xf9\xb8\xf7\xf5\x9c\x8f\xc9\xef\x49\xfa\xf8\xbf\x03\x67\x9a\xc2\x63\x8d\x35\x44\x2e\x1e\xdf\x30\x4e\x73\x35\x2f\xb3\x72\x2b\xde\x5f\x0c\x7b\x54\xec\xe0\x2c\xca\x63\x47\x97\xa7\x2a\x71\xad\x39\x9c\xca\x4f\x38\xf6\x09\xa5\xa5\x2a\xf8\x21\xff\xc7\xde\x45\x29\xb3\xf5\x3c\x97\x7b\x33\x7f\xab\x19\x4a\x6d\x9a\xca\x2b\x21\xcf\x22\x44\xf5\x5d\x90\x73\xb8\xcb\xb6\xa8\xbb\x02\x0e\x48\x73\x03\x9f\xb7\x76\x27\x96\x5e\xaa\xaa\x27\xde\x61\xd2\xaf\xcc\x0c\x86\xef\x1e\xd0\x5f\x4c\x8f\x5c\xc9\x82\x78\x02\xae\xeb\x0c\x4c\x10\xf9\xf8\xbb\x22\x1d\xf7\xf2\x25\xf3\x63\x52\x19\x4c\xa0\x54\x15\x51\x08\xae\x28\xba\x63\x1d\x6d\x08\xc6\xf6\xf6\x66\xc1\x3e\x26\x64\x94\xd1\xba\xef\x50\xb8\x81\x79\x0e\x37\x13\xc5\xa2\xf2\x6d\xc8\x51\xb4\xd3\x11\xf3\x84\x87\x08\x6f\x0b\xc0\x33\xb8\xe1\xe4\x91\x1a\x5f\xa8\xb2\x94\x0b\xb5\x94\x9e\x49\x11\x03\x49\x8b\xac\x08\x99\x15\x61\xb1\xdc\x13\xec\xb5\xa0\x7b\x7b\x10\x41\xbe\x83\x21\x66\x9f\x5a\x77\x0d\xdc\x60\x58\x42\xbc\x92\x65\x49\xc5\xec\xb4\xe0\x09\xc8\xed\xa6\x04\x0c\xd0\xb8\x2e\x1f\xdc\xbf\x50\x56\xc2\x2d\xc8\xaa\xd8\x7b\x09\x36\x33\x38\x5d\xfe\x50\xc5\x57\xe1\x01\x6d\x75\x49\x15\xbd\x70\xe4\x8c\x2c\x6f\xed\xc5\x49\x6c\x75\x77\xca\xdc\x1c\x26\x61\x9d\x0a\xb8\xf0\xc2\xe8\xba\x5c\x48\xb8\xa8\xc1\x57\xcc\x0a\x20\x01\x55\x95\xfb\x62\x06\x60\xca\xb0\x46\x28\x2b\x58\xb0\x22\xe1\xd1\x78\xa7\x6e\x94\x24\x18\x3b\x64\x77\x08\x4a\xe6\x19\x28\xcd\xdb\x38\x7d\xfe\xa9\xd0\x77\xee\xb9\x8d\x4a\x92\x9e\xf5\x21\x36\xa5\xae\xe4\xa2\x0a\xe3\x15\xb0\x23\x90\x39\xe7\x85\x2c\xa5\x5d\x26\xc7\x3f\x95\xc1\x66\xcf\xa1\x38\x1e\xc9\x59\xb5\x58\xca\x02\x01\x29\xf8\x06\x4e\x40\x10\x02\xe3\x13\xfe\x49\x43\x13\x1f\xe9\x8c\x74\xfc\x14\xa3\xbb\xe2\xb7\x30\xf9\x03\x68\x43\x22\xb1\x72\x75\x14\x2a\xc7\xc2\x0a\x92\x39\x5e\xce\xce\xed\x0c\xb4\x18\x03\x56\x03\xfa\x05\x55\xf5\xf6\xce\x42\x48\xd6\x93\x1f\xc5\x24\x99\xd7\x65\x56\x29\x4f\x6c\x24\x56\x52\x06\xf9\x65\xae\xca\xb2\x32\xa1\x36\x0a\xd1\xa1\x14\x4e\xa5\x45\x42\x1c\xae\x14\xd7\x56\x40\xb7\xba\x0e\xb2\xb7\x0d\x31\xae\x6e\x24\x54\xd9\xe9\xc4\x89\x58\x20\x56\x28\x2f\x4e\xe2\x5c\x39\x60\xae\x8a\x4f\x50\x1e\x83\x66\xa3\xb3\x92\xdd\x4c\xdc\x60\xb9\x58\xcc\x95\x22\x6a\xa4\xa1\x5b\xa9\x00\xcf\x17\x4c\xc4\x68\x3f\x2e\x18\x46\x29\xe1\x65\x80\x06\x69\xbf\x07\xfd\xc2\x75\xf6\x09\xfc\x48\x2a\xe0\x75\x28\x41\xd4\x77\x98\xfa\xc5\x8c\x15\xde\x5e\x3d\xd1\xe7\x9a\x74\x3b\x46\x73\x83\x59\xd8\x35\xcb\x32\x38\x7a\x30\x12\xb9\x45\x79\x47\x13\x94\x84\x6b\xcf\xaa\x8d\xb5\xac\x6e\xf4\x92\x8c\x67\x2b\xef\xf6\xd1\x61\x88\xee\xc6\xda\xb8\x77\x1a\x4b\x20\xdf\x88\x83\xa3\xc3\xc0\xd1\x8d\x27\x51\x2c\xc5\xc1\xf1\xa1\xd0\x10\x23\x42\x89\x0f\x2e\x61\xcc\x5f\x21\xbc\x19\x16\x1f\xf2\x71\x31\x72\xe9\x51\x97\xd6\xbd\xae\xb7\xd7\xcf\x8d\x46\x32\x1c\xc8\x23\xbb\x2f\xe9\xf2\x85\x71\x93\xb1\xd6\xc5\x9d\x44\x6d\xc2\x67\x96\xcf\x0c\xd6\x2f\xb2\x9d\x01\xb6\x3f\x51\xa5\xf0\xd6\xb9\x82\x81\x3b\x8e\xda\x3b\x3d\x47\xdc\xa3\x38\x16\x0e\xa3\xf0\x56\x29\xe3\xb1\x48\x44\xfd\x03\x08\xb9\x9c\xc2\xf3\x9b\xcc\x20\x86\xdd\x0f\x4e\x41\xf2\xd7\xc9\x4f\xa5\x79\xc3\x80\x89\x8b\x25\x89\xf9\x37\x28\x03\xd8\x8a\x9a\x27\x4e\xf0\xec\xb5\xe5\xa2\x71\xaa\xa8\x02\x26\x22\x64\x44\xf6\x51\xd1\x52\xae\xf2\x80\xbd\xa3\x01\x72\x31\x2f\xac\x27\x5b\xa3\x9b\x6c\x7a\x7b\x67\xf6\x6f\x50\xcf\x5f\x6c\x63\x8a\x5f\xb0\x9a\xa0\x5a\xa2\x80\x18\x6d\x01\x34\x5c\xc8\xd5\xe4\xb4\xf5\x26\x03\xc8\x0e\xd0\xe3\xda\xcb\x01\xb4\x20\xd0\x89\x40\x84\xc5\x4a\x7e\xe9\x68\x0f\x36\x59\x61\xf5\x4b\x54\xeb\x19\xdf\x41\x30\x89\x28\x97\xaf\xe7\xb0\xb9\xf8\x1e\x67\x44\x51\xa9\xa2\x2a\x98\xaa\x04\xb4\x28\xe3\x52\x30\xe6\x49\xb3\x28\xb0\x36\xd4\x51\x4b\x39\x27\x4d\xc0\xa5\x20\x6f\xb1\xe2\x5f\xe1\x6d\x00\x3b\x82\xbc\x6a\x15\xf2\x0c\x04\xeb\x8f\x63\x60\x50\x2e\x8d\x05\x83\xf1\x2c\x77\x2f\x48\x94\x6a\x0c\xaf\x23\x8b\x31\x7d\x2e\x03\xc3\xb4\xb7\x77\x6e\x8d\x3f\x6b\xa3\x79\xcb\x00\xe3\x1c\x00\xee\xb6\x36\x4e\x60\x58\x40\xa6\xf0\x16\xac\x50\x8a\xc8\x78\x23\xf3\x51\xa6\xe9\xbb\xcc\xc4\x34\x60\x75\x65\x2f\x94\xad\xbb\x44\x7b\xa2\x6d\x90\x81\x33\xf1\x74\xa3\x8c\x8f\x5f\x60\x8d\xb9\xe1\xc7\x8f\xb7\x73\xf9\xa5\x56\x95\x0c\x30\x5f\x2e\xe7\xef\x66\xa5\x0b\xf9\x16\xa2\xd9\x70\x19\x68\xa4\x0b\x43\x1b\x60\x55\xe7\x39\x81\x3f\x74\xf1\xa2\x02\xea\xf4\xb5\x74\x1b\x84\xa0\x65\xc5\xa4\x96\x1e\x88\xe5\xf2\x77\xee\x25\x39\x97\x45\x21\x89\x69\x66\x74\xe1\x76\x3f\xf3\x00\x09\x2a\x93\xc9\x83\xe0\x64\xbc\x3f\xf8\x1e\x3e\xce\xf3\xbc\xc6\xeb\x9e\xf1\xda\x0a\x1f\x5b\x1b\x94\x65\x50\x57\x9c\x79\xf3\x24\xed\xf6\x32\x5d\x32\xb9\x91\xbf\xbe\x80\xa6\x01\x91\x9c\x58\x5b\x6f\x6f\x88\xa1\x2a\x3e\x11\x5b\x5c\x78\xcb\x65\xc1\x6d\x4d\x61\x9d\x28\x61\xe5\xfe\x8a\xf9\x6f\x34\xa4\x61\x4e\xd1\x1b\x5a\xfa\x5f\x19\x91\x15\x59\xae\xaf\x89\xa6\xa1\xac\x91\x63\x2b\x6b\x4a\x12\x01\xfa\x1d\xfb\x10\xfd\x3a\x48\xff\x40\xc8\x96\xd9\xb9\x89\xb9\x23\xcb\x71\x14\x09\xbd\xb9\xf8\x24\x97\x42\x7e\x96\x8b\x1a\x29\xf9\x88\x29\x3d\xc0\xb9\x25\x22\x0b\x01\x12\x4d\x20\x5f\x34\xf8\xf8\xb0\x74\x4a\x32\xd2\x5c\x40\x2d\x12\x65\x89\x7a\x7b\xef\xc8\xd5\x63\xaf\xd3\xee\xaa\x3d\x7e\xc1\xa6\x26\xc1\x7a\x3d\xf6\x06\x2b\x34\x5e\x5e\x96\x6a\x89\xb4\xba\xcc\xf0\x4f\xdc\x21\xba\x0a\xb4\xa0\xf5\xbc\x54\x71\xed\x49\xda\xc1\x5d\x5c\xca\x5b\x99\xeb\x8d\xd5\xf5\xfc\x14\xc7\x7f\xe0\x0f\xdc\x47\x28\xd8\xa1\xa8\x29\x19\x5c\xd9\xa7\x98\x84\x68\x0d\x97\xbd\x7b\x2d\xbe\xcd\x0a\x66\x25\xcb\xde\x9e\xdb\xb1\xba\x60\x43\x15\xce\x34\x0a\x9e\x5e\x89\x42\x17\x2f\x23\x53\x5c\xdc\x01\x57\xc7\x52\x6e\x4a\x36\x02\x11\x7b\xe3\x32\xd4\x9e\x7f\x13\x51\xb7\x73\x59\xc8\x95\x0a\x8e\x3f\x5e\x03\x55\x56\xd5\x0d\xfb\x13\x73\x3d\x0c\x8e\xe9\x31\x09\xfa\x43\xea\x09\x85\xdc\xbb\xb8\x14\xaf\x0b\xd6\xaf\x73\x12\xe4\xf0\x05\x96\x00\x28\x60\xec\x58\x40\xe8\x5c\x67\x4d\xb1\x6b\x05\xe9\x0f\x3b\x59\x47\x80\x16\x3e\x2f\xf0\x6f\xe2\xc7\x7a\x3a\x5a\x55\x2c\x74\xb9\xd1\x65\x50\xfa\xb7\xee\x89\x03\xa6\xfb\x87\xdc\x8d\x55\x17\x37\x98\x30\xc9\x16\x37\x4a\xde\x52\x36\x24\xe0\x06\x63\x23\x53\x15\xe2\x06\xf8\x37\xd1\x94\xc5\x08\x89\xd3\x6c\xf8\xe5\x25\x89\x7b\xc7\x77\x83\xe4\x36\x77\xb6\x30\x3e\x7b\x82\xd6\x11\x32\x3f\xdf\xe8\x8d\x0c\xb4\x9f\x22\x03\x24\xb7\xda\xda\xba\xb5\x99\xb1\x26\x30\xad\x39\x83\x92\xe2\x45\x40\xed\x4b\x3c\x06\xdd\x29\x35\x62\x96\xda\xc2\x69\x78\x98\x8e\x00\x13\x37\x3d\x71\x91\x6d\x05\xf2\x1a\x65\x55\x85\x3c\x78\x6c\x7a\xf3\xb5\xb3\xf0\x5a\x38\x13\xfb\x80\x9f\xe6\x2a\xc4\x50\x05\xee\x53\xc9\xc7\xbe\x2f\x22\xac\x0d\x8a\xa3\xfb\x08\x31\x09\xe9\x72\x2d\x03\xde\x3f\xf0\x83\x41\x4d\x85\xa5\x49\x81\x43\x65\x45\xaa\x0a\x88\x4b\x8a\x7c\xcb\xfd\x75\xa3\xc2\xf7\xc8\x42\x1e\xe9\x4a\x3a\xca\x3c\x65\x80\x5d\xc1\x57\xda\x3b\x6b\x15\xcb\xc2\x76\x1a\x0d\xdd\x47\xa6\xcc\xaa\x1b\x2e\x81\xe7\x92\x04\x46\xfd\x40\x81\xc3\x2c\x9d\x9c\x4f\xa1\x2b\xc1\xc9\x78\x74\x8a\x4d\x09\xc4\xd9\x78\xc2\xe4\x58\x89\x38\x1d\x4c\x67\x93\xc1\xbb\x4b\x40\x2e\xda\x0f\x86\xb4\x1a\xd4\x7e\x25\x6a\x61\xd0\x77\x68\x94\x46\x33\x83\x20\x3a\x8f\x53\x42\x6b\xe6\xab\x3b\x17\xb8\x6e\x08\x54\x26\xf4\x2f\x54\xee\xb7\x0d\x7a\x1a\x10\x1e\xed\x69\x3d\x0d\x1e\xd4\x3a\x07\xc8\x4d\x45\x74\xb3\x61\xba\x72\xff\xb0\x87\xf9\x70\xee\x17\xb0\xa3\x55\x00\xb1\x38\x3b\xf1\x63\x52\xca\x00\x7c\x0c\xb8\x29\x5a\x1d\x7f\x42\xb9\x0a\x33\xab\x80\x1c\x62\x93\x95\x08\x7f\xc8\x8c\x93\x86\xe2\x56\x16\xd6\x17\xc9\xb7\x7c\xcf\xa2\xe1\xd0\xbe\xb3\x1d\xa9\x85\xd5\x86\x98\x0c\x62\x35\x1e\xbd\x11\x5e\x07\x88\x1a\x28\xa0\xf7\xd7\xb6\xaf\x51\xd8\xa7\x25\x7b\xb0\xe5\x42\x6b\xb7\x09\x7c\x4a\xbb\xee\xf2\xe2\x9d\x5b\xc4\x8a\xa3\x67\x17\xae\x7d\x92\x87\xf1\x52\x52\x86\x3e\x0c\x3b\x52\x16\xb4\x01\xba\xec\x6a\xaa\xf0\xc6\xe1\xa9\x2b\x6d\x05\x28\xe1\xf2\xe2\x46\xd3\x84\xf0\xc9\x3b\x7a\x26\xb8\x00\xf7\x53\x7b\x25\xb4\xc9\xb1\xbb\xbb\x27\x20\x4d\xa8\x2a\x20\x00\x91\x44\xc8\xae\x30\x9b\xca\x36\x22\xa0\x69\xb3\x10\x81\x65\x17\x53\xec\x87\xc3\xd9\xef\x1d\xda\xed\xdc\x9f\xfa\x80\xcb\x7e\x58\x5c\xed\xd9\x5c\x37\x18\xd8\x44\x57\x63\x2d\x02\xd2\x56\x6a\x46\xf3\x09\x39\xb1\xc2\xa9\x02\xe8\x82\x4a\xa1\xbd\x82\x74\x61\x99\x30\xae\x48\xa7\x81\xeb\x96\x83\xbf\x70\x9c\x79\xad\x97\x00\x58\x0f\x6a\x19\x89\x33\x17\x79\xc2\x8c\x5e\x28\x6e\x3d\x21\xcb\x55\xb6\x88\x4a\x06\xe9\xc2\x84\xcf\xc3\x1b\x80\xfb\xd7\x38\xe8\x31\x73\x2c\x86\xe8\x64\x44\x50\x9b\x2a\xcb\x63\x24\xb6\xd3\xd9\xf6\x44\x5b\x3b\x0f\xa3\x78\xda\x2b\xd9\x27\xde\x6a\xbe\x60\x39\x50\xe7\x5e\xb3\xbc\x15\xae\x85\xba\xae\x2b\xa3\x96\x88\x6a\x33\x0b\xbd\xc1\x5a\x52\x7b\x9b\xdb\x41\x79\xc3\x9d\x0d\x76\x6f\xc1\x0e\x7d\x98\x03\xe3\x07\x6c\xf4\xa1\x19\x4d\x84\xc6\x21\x16\x3f\x08\x11\xf0\xc0\xe0\x0a\x53\xc8\xb5\xc2\x85\x3c\x18\x34\x50\x15\xd2\x26\xed\x3c\x9d\xe2\x20\x04\xa1\xd3\x0a\x3a\x0b\x3c\x18\x1f\x78\x10\x5a\xe7\xc8\x00\x5d\xaa\x0a\x75\xf8\x21\x60\xb7\x2b\x57\x9e\x67\x4f\x68\x59\xdb\xbd\xb5\xcf\x04\x5e\x41\x87\xfe\xe6\x67\x01\x30\x26\x0b\x71\xe1\x3c\xa7\xf8\x9e\x0f\x3f\xcf\x8d\x7a\x1e\x62\x87\xea\x4c\x5d\xb9\xc7\xbc\x30\xdd\xa2\x9d\x99\x28\x9a\x4e\xb5\x4b\x21\x31\x6a\x1b\x51\x6a\xd7\x76\xa3\x16\x35\x15\x56\x16\xcb\x90\xd1\x25\xf7\xf0\x33\x5d\x60\x40\x8d\x46\xfb\x30\xef\x4b\x8c\x20\xb5\xa3\xe7\x50\xd9\x5b\xf1\x49\xca\x8d\x3d\x39\x50\xaa\x41\xa7\x90\xd1\x30\x30\x2a\x38\xfe\x8e\xa0\x37\xc2\xaf\xa2\xfd\x15\x30\xce\x43\xc7\x19\xf7\xe8\x16\xc5\x56\x67\x5d\x46\x40\x81\x17\xda\xa3\x51\xa1\x22\xa6\x2f\x20\x36\xed\x6a\x51\x37\x37\x5b\x03\x15\x6e\x74\x16\x30\x56\x44\x29\x98\x8c\x82\x94\x21\x1d\x68\xa3\x62\x1c\x03\xa0\x2e\x66\xe8\x63\x91\x2d\x12\x54\x78\x2f\xf3\xe2\xba\x0a\x22\x0c\x76\x52\x59\xe0\x66\x2b\x3c\x31\x68\x43\xc0\xe9\x2e\x6a\xdc\x19\x10\xe9\xe2\xd0\xd6\x03\xc7\x88\x19\x0e\xdb\x42\x89\x9d\x8d\x22\xbd\xcb\x77\x6c\x87\xad\xc3\x2c\x0a\x47\xbb\xe9\xc9\xc0\xd2\x59\x4b\x59\xc5\xb5\xf3\xde\x70\x67\x8e\xae\x0c\x9d\x05\x17\x3d\xc5\x1b\xa3\x36\x4c\xac\x81\xdd\x62\x9a\x16\x00\x13\x11\xcc\x0f\x7d\x82\x00\x1d\x61\x4c\xe3\x42\x69\x3c\x3f\xd2\x6a\xe6\xac\x2c\x43\x0a\x4e\x96\x4a\x4f\xf0\xc2\x67\xe6\x86\xba\x1a\xb8\xc7\x70\x9c\x60\x09\xa4\x30\x28\x97\xf8\x29\x1e\xc4\xa2\x73\x10\x08\xf9\x0f\xaf\x38\x34\xb4\xc2\x60\x5f\xa1\x59\x1e\xed\x55\x0d\x27\x46\x95\x4b\x07\x43\x7d\xac\x75\x16\xbd\x7f\x79\x88\x50\xe9\x55\xb6\xc0\x88\x0b\xdd\xd4\x6e\x01\x58\x7a\x02\xd3\xca\x19\x6a\x68\x84\x60\x30\x45\xaf\xd0\x40\xc4\x81\x9a\x1a\x6c\x6e\x2e\xae\xef\xb0\x03\x1b\x9a\x90\xdf\x9f\x84\xb7\x98\x75\x7f\xed\x25\x75\x8d\x80\x1e\x0a\x84\xdf\x71\x25\x8d\x1f\x33\x90\x29\xe8\x4f\xc8\x12\xc8\xbc\xe0\x2e\xf1\x93\x89\x6b\xad\x97\x62\x95\x01\x71\xe5\x6a\xa5\xcb\xaa\x41\xb1\xe8\xc8\x9a\x30\x5e\xdb\x18\xb1\x87\x39\xd6\x50\x7f\x83\x14\xf9\xc1\x1a\x54\x48\xf9\x1f\x8d\xc9\x54\xd6\x61\xd5\x1b\x20\xfd\x67\xb2\x1f\x59\xda\x93\x86\x3c\xcd\x08\x77\x24\x7a\x10\xe0\x10\xa3\x66\x6e\x4c\x57\x4e\xc4\xd8\xab\x3a\xe7\xcd\x3a\x88\x32\x6c\xc1\x3e\xc0\xdd\x15\x78\x68\x44\xc5\x29\xcc\x2f\x35\xa4\x84\xb5\xa6\xdc\x4c\xe6\xde\xc2\x77\x19\x96\xd7\x58\x07\x51\xe6\xf9\x4b\x5f\x33\xdd\xba\x32\x83\x15\x81\xbb\xbf\x04\x3e\x9b\x44\x4c\xeb\x39\xe3\xe6\x8e\x97\x01\xdf\x3f\xc7\xb5\x83\xef\xbd\x74\x62\xd1\x5a\x3d\xb4\x83\xd8\xfe\x70\x7f\xe6\x68\x38\xea\xca\x2c\x7f\xc3\x25\x37\x0f\xed\x8f\x22\xa0\x42\x30\xfb\xc6\x13\x71\x73\xba\x56\x09\xcd\x51\x4e\xa4\x3a\x94\xbf\x89\x4b\xaf\x62\x8d\x03\xeb\x0a\x47\x16\x72\x3b\xc4\x15\xac\x60\x5a\x26\xe2\x9e\xe1\xae\x72\x6c\x77\xb5\x9c\xf8\x58\xd9\xba\x8e\x16\xcc\x30\x1a\x54\xf5\x84\x3b\x04\xb1\x5c\x8e\x2a\x87\x05\x61\x14\xd7\xa2\x53\xd1\x2e\x48\xb1\x62\x07\xea\x21\x61\xc2\x80\x60\x9a\x3a\xe4\x2b\x71\x64\xa6\x31\xa4\x1f\x42\x54\xf1\xab\xb1\xe1\xe2\x8e\xcf\x73\x7b\x4b\xcf\x82\xc2\x27\x80\x56\x30\x6c\x62\xf9\xc0\x5d\xc4\x61\xf0\x90\x50\xd5\x2b\x4e\x27\x35\xc5\x6e\x05\x98\x70\x0b\x45\x97\x52\xa4\x06\x1b\x84\xde\x40\x57\xda\x08\xf9\xb9\x92\xde\xc6\xa0\x62\x34\x78\x0d\x87\x81\x31\x76\x0d\x56\x10\xf4\x1d\xb9\x95\xf6\xba\xb0\xd3\x8a\xfb\x43\xde\xdd\x68\x71\x67\x6f\x77\x48\x96\x83\x94\x41\x53\xb5\x2a\xcc\xd1\x41\x64\xb1\x72\x83\x0d\xc8\x78\xc0\x6a\x0a\x00\x01\x60\x06\x9b\x08\x71\x00\xe4\x98\xe0\xdb\x22\x52\xd9\x1f\x6e\xe4\xc4\x78\x4b\x81\x98\x24\x7c\x15\x7a\x9c\xf2\xb3\x2c\x17\xcc\xbc\x45\xe9\x5a\x1d\x11\xbf\x37\x97\x3b\x8c\x93\x97\x2e\x88\xe0\xca\x0a\xbb\xf6\x8d\xcb\xc8\x3d\x3b\xe7\x5a\x06\xa5\x7d\xcc\xac\x52\xf8\xca\x46\x24\xb1\xe8\xb2\xea\x9b\x86\x1a\x70\x8f\x50\xb6\x62\xa7\xe0\x1c\x7e\x6d\xa9\xa9\xd7\x2d\xf3\xd2\x85\xe4\xfd\xe8\x02\x36\x78\xeb\x13\x75\x5e\xb2\xaf\x03\x32\x31\xac\x98\xa1\x33\xd6\x44\x57\x3f\x21\xf3\x16\x36\x8c\x8f\x8c\x57\xb8\x96\xb1\xea\x21\x86\xa4\x53\xca\x39\x24\x18\x0a\x18\xf1\x2b\x59\x7e\x85\xb1\x9d\xc4\x40\x85\xe0\x33\x4f\x4c\x1b\xde\x7a\x94\x60\x38\x11\xdd\xa8\xe9\x39\x00\x8b\xa4\x00\xd6\xcc\xa0\x88\xa1\x78\x08\x11\xb7\x7b\xc9\xe0\xda\x83\x62\xcb\xc8\x3c\xb0\xca\x95\xcb\x16\x22\x0e\x53\x1e\x59\x80\x49\xea\x1d\x32\x63\x16\xda\x13\x0e\xe4\xc5\x30\xb9\x82\x4c\xd4\x90\xa1\x72\x0c\xcc\xc1\x76\x62\xfc\x29\xe3\x5b\x6a\x05\x7b\xc5\x1a\x40\x95\xa5\x84\x31\x70\xcc\x95\xf2\xda\xf6\x13\xe6\xc9\x8b\x1c\x05\x3b\xb1\x85\x23\x77\xd2\x22\xaf\x00\xac\xf7\x66\x11\x30\x0c\xcc\x93\xd5\x02\xf7\x86\x6b\x0a\x4b\x8e\x8a\x32\xdc\x80\xda\x29\x77\xce\xc9\x83\xcc\x85\x54\x67\x08\xd5\x6a\x3a\xd8\x51\x02\x32\x6c\xab\x95\x45\xb6\xf9\xb7\x0f\x3b\xc1\xcd\x43\x1f\x84\xc1\xca\x46\xf6\x4e\x55\x4c\x0b\xc3\x6e\xc7\xf1\x21\xd4\x9c\x23\x1e\x87\x01\x65\x41\x4e\x10\x62\x4b\xbb\xdd\x16\x63\xfd\x96\x62\x29\x8e\x89\x48\xa6\xc3\x79\x59\x20\x14\x61\x0b\x0c\x84\xac\xa4\x9c\x5f\xbe\xd0\x25\xa2\xaf\x20\x23\xdb\x22\x66\x0f\xdc\x76\xd7\x5b\x3a\x60\xe9\x7a\x20\x86\xbc\x63\x80\xa0\xef\x48\x97\x2d\x6a\x53\xe9\x35\xb4\xe0\xf6\x4d\xd0\x3c\xac\xb2\xa8\x64\x19\x38\x27\x83\x55\x4b\xe5\x87\xcb\xa6\x82\xa6\xd9\xd6\x83\x05\xf7\xd1\x11\x3e\xc2\xbe\x21\x9d\x58\x98\xba\x87\x88\x3a\x1d\x42\xf7\xad\x90\x40\x2f\x7e\x40\x2b\x12\xc7\x66\x12\x58\x11\x58\x30\x81\xad\x06\x28\x8f\x17\x15\x66\xc6\xb8\xc4\xc6\xb3\x12\x30\xf5\xad\x95\x53\x5f\xdf\x34\x5c\x27\x1f\x15\x5b\x6f\x24\xc4\xdb\x3b\x06\xd4\x08\x17\x04\x4b\xc3\xac\x47\xfd\x58\xd4\x83\x72\x84\x86\x94\x36\xbc\xf2\xc8\xd0\x99\xd7\x70\x48\x42\x4c\x26\xde\xf0\xcd\xeb\x6f\xbe\x75\x3d\xcf\xd7\x1b\x65\x07\x0d\x99\x61\x1f\x8b\x87\xb0\x8f\xe7\x4d\xe8\xcc\x3b\x0d\x5d\xde\x89\x68\x06\x5d\xa3\x67\x65\x74\xce\xfc\x9f\x7c\x66\x9b\x51\xed\xe6\xd8\xc9\xfb\x45\x47\x01\xda\xcd\x1a\x17\x47\x7c\xf8\xce\x74\x49\xe2\xdc\x01\x12\x1e\x1a\x6e\x7b\x35\x90\x87\x15\xdc\xc7\xe0\x70\xb3\xca\xe9\x4a\xf2\x3b\x8d\x12\x60\xb1\xdd\x96\xd1\xee\x34\x43\x2a\x87\x49\x94\xd9\x7a\x4a\x2e\x2f\x86\x1f\xf8\xd5\xd9\x11\x81\xf5\xac\x93\xdf\xbb\xee\x51\x70\xe2\x57\x4d\x7b\x85\x13\xc4\xcd\x44\x09\xa0\x86\x1f\x59\x3e\xf8\x8d\xe3\x3c\xa4\x63\x1b\x24\x7a\xdd\xc2\x85\x2a\x3e\xb2\xc5\x43\xcd\xc0\x81\x31\x8c\xc6\x10\x43\xdc\x23\xc2\xd2\x38\x8d\xf1\xb1\x47\x81\x0b\xc3\xb0\x84\xba\x2f\x6b\xf8\xa3\xf4\xa0\x6d\x7b\x4a\x20\x0e\x85\xad\x1e\xdd\x30\xc8\x95\x0a\xce\x83\xae\xab\x78\x1a\x9e\x83\x15\x49\xb5\x0c\x07\x91\xfc\xe5\x04\x3b\x58\xdd\x94\xd2\xdc\xe8\x7c\xe9\xe1\x7d\x18\xf3\xe0\xe1\x20\xd4\x9a\xe9\xf3\xd9\xa3\x9e\x6f\x5d\xeb\xec\x01\x37\x33\x2b\x42\x60\x28\xee\x02\x04\xba\x8b\x7a\x2d\xb1\xa9\xb1\x75\xac\xd6\x12\x7b\x15\x43\x78\x05\x9b\x32\xd5\xa5\x14\x79\xb6\xb5\x87\x09\x63\xb3\x0b\xd7\xca\x10\x7c\xc1\x35\xe4\x2b\xb2\x45\xa9\x4d\xf0\x0b\x55\x40\x25\x99\x4f\xb3\x1d\x58\x1f\xc1\xfe\x0e\x1c\x0a\xf0\x53\x54\x21\x72\x59\x5c\x57\x88\xc3\xa6\x40\x4b\x10\x2d\x0f\x07\x6c\x0d\x82\x22\x8c\xe7\x37\xfd\x9d\xb0\xfb\x3d\xe0\x71\xf2\x6d\x5b\x12\x7a\xe2\x20\xf5\x32\x1b\xa7\xbb\xac\xf1\x11\x48\x16\x24\x4f\x76\x9c\x45\x04\x08\xa0\x63\x0f\x9d\xad\xe3\x7b\xff\x7b\x74\xec\x1d\x13\x47\xd2\xdc\xec\x07\x74\x42\xd2\xc9\x93\xf1\x90\xd4\x3f\x10\xf7\xfc\x1e\xcb\xe8\xe5\xae\x29\xbb\x10\x01\xb4\xab\xea\x98\x88\x47\x4c\x13\x02\xd0\xe5\x68\x48\xba\xa3\x96\xde\xb1\x05\x06\x02\xcd\xfc\x54\x7d\x52\x8f\x0b\xb9\x09\x61\x0c\x9e\x13\x15\xe3\xb3\xdb\xb0\x17\x16\x5d\x2e\x7c\xb7\x7c\xb5\x5e\x46\xb4\xe4\xb2\x5e\xc8\x8e\xf4\xe6\x8e\x9d\x6d\x11\x32\xb5\xba\xf3\xf3\x1a\x07\xb5\x78\xed\x26\x6e\xbc\x17\x84\xd7\xe9\x6a\x36\xe1\x92\x89\x60\xb2\x81\xb5\x24\xcb\x17\x46\xe8\x3b\xac\xce\x40\x50\xb5\x35\xd2\xa5\x90\xc5\xb5\x2a\x24\x5a\x30\xa0\x8c\xe5\xbc\xbe\x06\x44\x5c\x3b\x1e\xee\x93\x08\x0e\xca\xde\x0c\x27\x07\x5d\x75\x42\x07\xce\x2f\x6e\x23\x95\x06\xf6\x1b\x82\x11\x5d\xa1\x42\xf8\x11\x8e\xee\xc0\xb0\x1f\xba\x5f\xdc\xb0\x28\x78\xd6\x9d\x1d\x71\xa0\x65\x18\xd0\xb2\x46\xc3\x0d\x64\x18\x22\x70\xd8\xd8\xcc\x74\x31\xee\x3b\x77\x33\xe4\x27\xe9\x6c\x09\x10\x8d\x7f\xad\xa9\x9d\x3a\xb4\x2a\x80\x76\x2e\x10\x67\xf3\x5d\x0d\x51\xce\xd9\x2b\x07\x94\x94\xeb\x5e\xd5\x35\x03\x84\x80\x87\xfd\x40\x88\xd5\x34\x2c\xe6\x08\x52\x0b\x7d\x67\xc9\xbb\x89\xff\x5b\xec\xf9\xd6\x14\x3d\x2a\xd7\x85\x83\x19\x2b\x05\xfd\x3d\x78\x8b\xdd\xdb\x0f\x1e\x73\x08\xba\x7d\x80\x43\xc8\x80\xb5\x15\x5e\x64\x1a\x85\x96\x62\x74\xf6\xda\x53\x6e\x4d\xf2\x21\x15\x00\xbb\x17\xea\x49\x42\x1f\x44\xa6\x78\x10\x56\xc0\x7d\x5c\x70\x37\xe1\x6d\x4b\xa8\xe1\x52\xe2\xfa\x88\x50\x9b\xb8\x98\x6c\x30\xab\x06\x76\xa2\x99\xd4\xe8\x89\x03\x2c\xc5\x23\x38\xbf\xd6\xcb\xc6\x40\xee\x6e\xb4\xaf\xb0\x20\xb6\x72\xa6\x19\xf6\xc9\x7d\x43\xe9\x1e\xd5\x0c\x51\x11\x66\xbe\x90\xf6\x7a\x46\xc7\xcb\x1a\x43\xc4\x94\xc5\xf5\x19\xb2\x15\xd1\x0e\xfa\x4e\xb8\x31\x07\xaf\xc3\xbb\x0c\x53\x58\xbb\xa4\x34\x73\x41\x40\x70\xb4\x12\x71\x9b\xe5\x8a\xfa\x5e\xfb\x46\x0a\xa5\xc4\x16\x50\x71\xeb\x23\xf4\xaf\xf0\x44\x05\x9d\x7d\x4d\x40\x3a\xa1\x8a\x30\xf0\xff\x7d\x96\xf0\x75\x81\x89\x4a\xca\x4c\x15\x3a\x68\x52\x86\xeb\x87\x6c\x94\x94\x09\x71\xb7\x7c\x68\xca\x06\xa9\xb1\x0e\x1f\x34\x14\xe1\xbf\xdb\x01\xc5\x9c\xeb\xc3\x8e\x27\xfa\xcf\x7e\xc6\x7e\x15\x3a\xdc\xd0\x20\x9d\xf6\xa3\x2c\x5d\x4c\xc9\xc9\x11\x04\xa1\x88\xda\xd8\x11\xd3\x44\xf4\x11\x26\x5c\x67\x8e\xfe\xb8\x7a\x3b\xfe\xae\xe1\x72\x02\x7c\x6c\xe6\x23\x35\x48\xf7\x1f\x08\x7f\xc4\x54\x14\x83\x66\x1e\xbc\xb3\x23\x5d\x0d\xe0\x25\x6b\x77\xda\xa3\xd7\x84\xf7\x73\x3f\x68\xec\xba\x8f\x27\x91\x8f\x5a\x18\x52\xb1\xcb\xa5\xaa\x00\xac\x0d\x8a\x9c\xf1\x7f\xce\x00\x49\x5a\x86\x7f\xa8\xe1\xa0\x90\xce\x1e\xa6\x60\x68\x08\xc9\xf7\x81\xa4\x72\x8d\x95\x9b\xc1\xd7\x0e\x54\xc1\xb0\x28\x7a\xb2\x2e\xc5\x1c\xa3\x68\x76\x49\x0e\xbd\x82\x5b\x67\x3f\x43\x20\x7b\xbd\xd1\x05\x9c\xf1\x03\x3a\x9e\x65\x22\x3e\xc9\xb2\x90\x54\x1d\x60\xec\xc5\xe1\x18\x97\x31\xc3\x07\xf7\xfe\xd6\x54\x72\x8d\x78\x10\x6e\x75\x17\x2c\x43\x59\x17\x26\xe8\xfc\x43\x35\x2b\xf0\x2a\xe7\x69\x2c\x7c\x19\x4b\xfc\x6d\xee\x91\x86\x6d\x75\x37\x1b\x59\x04\xd0\xd8\x30\xe8\x81\xa5\xba\x4b\xb5\xa8\xd8\xfb\xe4\x3e\xdc\x41\x51\xa0\x5e\x51\xfc\x32\xac\x5c\x69\xa0\x87\x29\x1f\xe4\x16\x35\x8b\xf4\x4c\x73\xd6\x2e\x60\xe0\xdf\x8f\x41\xf4\xac\x30\x1c\x6e\x65\x48\xf9\x5c\xe3\x82\xaf\x5d\x7a\xdc\x5b\x87\x84\x4e\x45\x3a\xc4\xa6\xe7\x1e\xa7\x93\x98\xd1\x92\x43\x85\x18\x0e\xe2\x24\x28\xe5\x61\x23\x30\xf4\x43\x20\x21\xa3\x96\xf2\xe5\x7c\xfb\x12\x41\x4e\x85\x67\x0b\xcd\x9b\x63\x0b\xa8\x2e\x3b\x5e\xf6\x00\x9a\xaa\x65\xc7\x3a\xea\x51\xaa\x40\x70\x00\xb5\xb6\xe9\xea\x52\x6c\x3b\xd5\x61\xe7\xac\x32\xcf\x0b\xbf\x73\xc4\x8a\x80\x63\xc0\x4f\xe8\x8a\xe7\xb9\xbd\x47\x33\xbc\xe9\x6b\x5f\xef\xf4\x63\x26\x53\x73\x62\x7c\x31\x85\x06\x2e\xa8\xd0\x07\x12\x7d\x75\xe1\x0b\x34\xb8\xb5\xc4\xae\xa9\x10\x00\xf8\x89\x01\xd3\xb6\xaf\x13\x00\x43\xde\xef\xb6\xd1\x3b\x67\x46\xcf\x5b\x61\x5b\xc2\xac\x0a\x12\xfb\x8f\xe6\x32\x21\x69\xf8\x79\x93\x93\xa1\x72\x07\x95\x84\xd0\x33\x80\x8e\x87\x3b\x7a\xf6\xcf\xc1\x82\x84\x2a\xdd\xad\x23\xd3\x43\x3e\x8d\x21\x0e\xcc\x28\x3b\xad\x2e\xb2\x38\x17\x9b\x79\x88\x2b\x6e\x17\x4f\x1c\x33\xc4\x79\xd9\x7a\x80\x2b\xee\x89\x03\xf9\x8f\x4b\x1b\xf7\x03\x6e\x28\x47\xa6\x7d\x17\x5c\xcd\xed\xb3\x1b\x89\x3a\x65\x3d\x24\x67\x3e\x00\x38\x02\x03\xc8\xd1\x45\xcc\xad\x38\xa0\xd6\x14\xc8\xa2\x50\x5b\xc7\x75\xb6\x64\x89\xef\xde\x97\x16\x21\x30\x23\x01\x10\x47\x91\xf1\x21\x2b\xe1\x4c\xdd\xa8\x39\xb4\x1a\xc6\x88\x98\x2b\x14\x27\xfc\x41\x7b\x36\x11\xda\x64\xbe\x8d\x4b\xdb\xa2\x6a\xcf\x56\x66\xa8\xd8\x3e\x90\x0b\x4e\x88\xac\x19\xa8\x1e\x49\x64\xf0\xf5\x59\xb1\x68\xc5\xa5\xb1\x1b\xad\xb0\x2e\x24\x53\x79\x3a\xf4\xc4\x13\xeb\x4a\x70\xc4\x7e\xf8\x8d\x25\x6c\xe4\xcd\x09\x24\x70\xf4\x8a\xd0\xfd\xae\x2b\x6b\xd0\xce\xb4\x23\x19\xf6\xc8\x94\xab\xb0\xf2\xbc\x71\x7c\x48\xf4\x4d\xd0\x24\x2f\x28\xa0\x74\x35\x70\xf6\x2f\xdc\xfe\x27\x2e\xc0\x0e\x8e\xb1\x88\xeb\xb0\xdd\x35\x5b\xa3\x2b\xe8\x78\x82\xbb\xd6\x2f\x56\x5e\x6a\xbd\x61\xa6\x38\x6e\x38\x1f\x1b\x33\x45\x3c\x29\xf3\xc2\x83\x19\x48\x39\x92\x22\x60\x36\x34\xea\x1d\xd5\x38\x51\x71\x6b\x49\x59\xac\x74\xb9\xe0\x7c\x0a\x9e\x44\xba\xd0\x83\x4c\x51\x33\x75\x0d\x1b\x76\xd4\x13\x83\x15\x19\xb9\x0b\x5d\x60\xfa\x95\x70\xa9\x62\xa1\xeb\xb2\x12\x3f\xd7\xcb\x6b\xa6\xd2\xce\xf2\x3c\x00\x3f\x50\x15\xb0\x2a\x56\xd6\xa1\x91\xfc\xa1\x15\x6d\x2d\x13\x80\x43\x49\xe9\x01\xd6\xff\xba\xc6\xdd\xfc\x5d\x63\x6a\x69\x0e\x93\x50\x22\x21\xc1\x07\x0b\x09\x32\x61\xc5\xe8\x80\xc3\x88\xf3\x2d\x8d\x4a\x97\x4b\xb0\xce\x5d\xe1\x0c\xc3\x61\xac\xfa\x3e\xf4\x59\x2c\xb4\xef\xd8\x1f\x0e\x3a\xd0\xc6\x3a\x08\xe2\x92\x74\xac\xe5\xe7\x45\x1d\xf7\xb8\x7c\xe8\xbb\x8e\x72\x81\xac\xc6\xd0\x66\xe2\xb2\x13\x6e\x31\x6e\xd4\xba\xce\xab\xac\x90\x88\x54\x46\x64\xed\x3c\x57\xd7\x04\x45\xed\x50\xd5\xcc\xae\x4b\x36\xb0\x2c\x2b\xbc\xe5\x83\xaf\x71\x8b\xbd\xe6\x1e\x86\xdd\x60\x76\x9c\x42\xaa\xc3\x16\x4d\x36\x8c\xac\x51\x65\x4e\x65\x8d\x90\x2d\xc0\x90\x64\xa9\xb7\x59\x5e\x6d\xb1\x70\x30\x6c\x5a\xdc\xca\x0b\x02\xac\x12\x70\x1b\x1a\xb8\x12\xb4\x03\x77\x53\x92\x3f\x6c\xcf\x6c\x35\x1c\xfd\x2b\xe8\xd4\x1c\x84\xf7\xb1\x3e\x0c\xf9\x80\xac\x28\xe4\xbe\x81\x3b\xd8\xea\x2e\xc6\x18\x5e\x77\xf0\xb1\x39\xc5\x31\x56\xa5\xbd\xbb\x1c\xda\x08\xb6\xf8\x81\xe1\x3b\x86\xde\x66\xe2\x33\x40\x3c\x29\x23\x6e\x64\xbe\x84\x2e\x59\xb9\x82\x6c\x66\x5d\xe0\xa9\x94\x08\x18\x84\x8d\xc5\xca\x79\xc7\xd2\xb9\x50\xe5\xa2\x5e\x63\xcb\x39\x54\x76\xf3\x2c\xf7\xea\x5c\x86\x8f\x0f\x8b\x38\x01\x92\xe3\xeb\x7a\x5d\x1b\x3b\x87\xec\xeb\xfc\x82\x6f\x55\x1f\xbe\xd7\x04\x0d\xad\x19\xd6\xc5\xa8\xcb\x0e\x5c\x97\x2a\x20\x80\x45\xc4\x2e\x7c\xf0\x03\x4a\x00\xe3\x2b\xcd\xac\xbf\x26\xcb\x6a\x4b\x08\x2d\x80\x84\x19\xdf\x8b\x0d\xf0\x60\xb0\x5c\xd6\x4d\xa7\xcc\x32\x58\x19\xf8\xc9\xb7\xf1\xcb\x6f\x88\x90\xce\xd8\xf9\x05\x23\x0c\xb8\x3d\x2a\xc2\x89\x5d\x97\xf4\xc4\xea\xa6\xc1\xd4\x14\xef\x33\xf9\xc0\x0e\xc4\xa7\xac\xf8\x5b\x5d\x82\xf7\x7d\xa3\xe2\x7d\x53\x5a\xd3\xc0\xae\x98\x38\x87\xf9\x4a\xbd\xc9\x43\x96\x04\xe8\x14\xaf\x6b\xe3\xbb\x04\x72\x59\x0f\xf8\x3d\xd6\x57\x83\xf6\x4e\x51\xe1\x5a\x68\xf7\xb3\xc0\x23\x65\x2a\x0e\x4e\x61\xfc\x10\xa5\xc2\x35\xdc\x70\x85\x82\x61\x4a\xc0\x7d\xe9\x2d\x19\xf2\xd8\x94\xab\x72\xbd\x98\xbe\x59\xea\x02\x97\x9f\x78\x9d\xd4\x4a\xc0\x6d\x29\xcc\x0d\xc8\xcc\x1d\x77\xc5\xd6\xb1\x16\xa3\xb1\xba\x66\x59\xbe\xe9\x1a\x0e\x12\x6b\x43\x5d\x45\x1f\x29\x42\xba\x0b\x51\x13\x43\x9e\xc3\xa3\x74\x76\x48\x36\x35\xbb\xd1\xf0\x9e\x7c\x4b\xac\x13\x77\x14\x33\x99\xcb\x1c\x6b\x76\x31\x85\xd9\xba\xb0\xf0\x66\x35\x55\x67\x96\xfe\xe8\xd8\xa5\x05\x9a\x65\x46\xdf\x10\xcf\x52\x13\x02\x64\x82\xfa\x1f\xbb\x11\x4c\xef\xb0\xd0\xb5\xdd\x60\xe9\x8a\xe8\xe6\x91\xf4\xcf\xb7\x3e\x63\x10\x16\x58\x99\x06\x1d\x78\xab\x46\xd3\xaa\x46\x08\x0c\xc4\xf5\x36\x1d\x97\x82\x6b\xde\x16\x74\xed\xba\x96\xfa\xba\xcc\x36\x37\x90\x8a\x8d\xa6\x18\x94\xb6\xc9\xcf\x1c\xc6\x47\x6d\xec\xa6\xe2\xe3\xda\xd1\x57\x23\x8a\x3a\xac\x6b\x42\x20\x3d\x64\x3c\xfc\x42\xa0\xea\xa8\x0d\xbd\x40\x2e\x81\x70\x1d\x4f\x73\x66\x9a\x2d\x22\x82\x42\x6f\x0e\xfc\xb8\x11\x66\xd0\xa8\x80\xc3\xc1\x14\xa4\x9e\xeb\x65\x77\x1f\xdf\xa3\xd7\xbd\xa7\xb3\x4f\x33\xf1\x34\x6d\x79\x44\x1c\xdd\xd8\xfb\x5d\x04\x06\xff\x0e\x39\xa8\x5b\x0c\xd3\x5f\x4d\x29\xed\xec\x5d\xc7\x28\xfd\x18\x35\x32\x77\xec\x08\xe9\xa2\x41\x0b\xec\xb7\x49\xa5\x7f\x45\x1a\xe9\xc7\xc8\xa3\x9f\xcc\xd8\xdb\x9a\x7a\x07\x39\x34\xeb\xfd\x78\x25\xbe\x86\x14\xfa\xb1\x41\x80\x00\x7f\xeb\xec\x47\xc6\x27\x06\xa7\x03\xac\x85\x96\x70\x02\x36\x11\x15\x70\x83\x7b\x02\xce\x74\x74\x80\x9b\x66\x75\x01\xd1\x99\x0a\x5c\x07\x8e\x10\x01\xbe\xbc\x54\x95\x8c\xaf\x0b\x66\x71\x83\x1e\x7b\xbe\x69\x2f\xd8\x8a\x9e\xa5\x88\x2f\xcf\x50\xe5\x3d\x32\xf1\xc6\xdb\x1e\xa0\x55\xc6\xa2\x6b\x7b\xd0\x0c\xde\x0d\x2e\xfe\x6e\x1c\xa0\x05\x39\x02\xed\x8d\xe6\x9b\x2b\xcc\xa5\xb8\xae\xd5\xd2\x0f\xa5\xba\xd3\xe2\x5a\x43\xb6\x62\x15\x12\x58\x54\x6d\xbe\x0d\x6b\xaa\x86\xdd\x82\xf4\x4a\x30\xcb\x45\x40\x53\x59\x30\xb1\xd8\x5a\x3b\xdb\x83\xd9\x43\x30\xf3\x4e\x37\x8a\xfb\xca\x35\xaa\x94\x1c\x0d\xca\xd1\x58\x7c\xec\x4f\x26\xfd\xd1\xec\x0a\xc4\xe0\xbb\x9e\x78\x97\x9e\xf4\x2f\xa7\xa9\x98\x7d\x48\x1d\x83\xa9\xe7\xd9\x3f\x15\x67\x93\x34\x15\xe3\x33\x71\xf2\xa1\x3f\x79\x9f\x26\xf6\x73\x93\xd4\x7e\x22\x78\x16\xd0\x10\x04\x0f\x48\xc4\x6c\x0c\xff\x4e\x7f\x9a\xa5\xa3\x99\xb8\x48\x27\xe7\x83\xd9\x2c\x3d\x15\xef\xae\x44\xff\xe2\x62\x38\x38\xe9\xbf\x1b\xa6\x62\xd8\xff\xd8\x13\xe9\x4f\x27\xe9\xc5\x4c\x7c\xfc\x90\x8e\xc4\xd8\x3e\xfd\xe3\x60\x9a\x8a\xe9\xac\x6f\x3f\x3f\x18\x89\x8f\x93\xc1\x6c\x30\x7a\x0f\xcf\x3b\x19\x5f\x5c\x4d\x06\xef\x3f\xcc\xc4\x87\xf1\xf0\x34\x9d\x00\x1f\xc2\x37\xe3\x09\x7e\x51\x5c\xf4\x27\xb3\x41\x3a\x15\x17\x93\xf1\x8f\x83\xd3\x78\x4e\xfb\xfd\xa9\x18\x4c\xf7\xa1\xa3\xd3\xf8\x72\xe6\xc7\x3e\x3e\x13\xfd\xd1\x95\xf8\xf3\x60\x74\x9a\x88\x74\x00\x0f\x4a\x7f\xba\x98\xa4\x53\x3b\xfd\xf1\x44\x0c\xce\x2f\x86\x83\xf4\x34\x11\x83\xd1\xc9\xf0\xf2\x14\xa8\x16\xde\x5d\xce\xc4\x68\x3c\x13\xc3\xc1\xf9\xc0\x8e\x73\x36\x86\x95\xe1\xcf\xf2\xd3\xed\x60\xc6\x67\xe2\x3c\x9d\x9c\x7c\xe8\x8f\x66\xfd\x77\x83\xe1\x60\x76\x05\xdc\x0c\x67\x83\xd9\x28\x9d\x22\x83\x43\x1f\x47\x7e\x72\x39\xec\x4f\xc4\xc5\xe5\xe4\x62\x3c\x4d\x7b\xb8\x80\xa3\xd9\x60\x92\x8a\xc9\x60\xfa\x67\xd1\x9f\xf2\xb2\xfe\xe5\xb2\xef\x9e\x73\x91\x4e\xce\xc6\x93\xf3\xfe\xe8\x24\xc5\x26\x09\xd1\x36\x42\xff\xaa\xab\xf1\x65\x4f\x4c\x3f\x8c\x2f\x87\xa7\xd1\xdf\xed\x32\xa5\xe2\x34\x3d\x4b\x4f\x66\x83\x1f\xd3\xc4\x7e\x50\xf4\xa7\xd3\xcb\xf3\x94\x56\x7b\x3a\x83\xe5\x19\x0e\xc5\x28\x3d\x49\xa7\x53\xfb\xad\x69\x3a\xf9\x71\x70\x02\xab\x30\x49\x2f\xfa\x83\x89\x00\x0e\x8a\xc9\x04\x1b\xb9\xa1\x7e\xf9\xbe\x67\xb7\x6e\x34\x16\xe9\x8f\x56\x00\x2e\x47\x43\x3b\xd7\x49\xfa\x97\xcb\xc1\xa4\x4b\x0c\xec\x33\xfa\xef\x27\x29\x2c\x65\xb8\xeb\x1f\x07\xc3\x21\xec\x4f\x73\xeb\x13\xf8\xca\xe8\x2a\xd8\xfa\x2b\xf1\xf1\xc3\x58\x9c\xf7\xaf\x90\xf8\xe2\x8a\x85\x63\x92\x3a\x66\x8c\x58\x26\xfa\xd3\x40\x34\xfb\xef\xc6\x76\x0d\xde\xd9\x3f\xc3\xb0\x66\x63\x58\x10\xbb\x41\xa7\xfd\xf3\xfe\xfb\x74\x1a\x88\x00\xbc\x9a\x98\x7e\x13\x31\xbd\x48\x4f\x06\xf6\x3f\x06\xa3\x93\xc1\x69\x3a\x9a\xf5\x87\xb8\x2a\xa3\x69\xfa\x97\x4b\xbb\x89\xfd\x21\x3f\x44\xf4\x27\x83\xa9\x7d\x82\x95\x42\xda\x31\x7b\x00\xad\xa4\x8d\x58\x42\x66\x63\xd1\x3c\x94\x07\xfe\xdd\x6d\xe9\x13\xc3\xf1\x14\x5b\xe8\xf5\x67\x7d\x01\x23\x9e\xf5\xc5\xbb\xd4\x7e\x7a\x92\x8e\x4e\xd3\x09\x1c\xa6\xfe\xc9\xc9\xe5\xa4\x3f\x83\x97\xd9\x6f\xa4\x53\x31\xbd\x9c\xce\xfa\x83\x11\x6e\x8a\x9d\x2f\x1c\xe5\xc1\xe4\xd4\x9d\x26\x10\xd0\xb3\xfe\x60\x78\x39\x69\x89\xd8\x6c\x2c\xc6\x17\x29\x3c\x12\x44\xcd\x6f\xc8\x74\x7c\x36\xfb\xd8\x9f\xa4\x87\x09\xc8\x80\x18\x9c\x89\xe9\xe5\xc9\x07\xda\x3d\x11\x9d\xd9\x2b\xf1\xa1\x3f\x15\xef\xd2\x74\x24\xfa\xa7\x3f\x0e\xe0\xdc\xe1\x7b\x2e\xc6\xd3\xe9\x80\xd6\x64\x4c\x4f\xa0\x75\xec\x89\x74\x84\x9f\xeb\x20\x46\xd9\xa3\xf6\x06\x7d\xf0\x41\x31\xc6\x3a\x83\xbb\xbe\xd2\xe2\xca\x6a\xd6\x91\xbc\xa3\xab\x4d\x49\xc3\x4c\xed\xc4\x96\x83\xa5\x15\x31\x97\x55\xc0\xa1\x4a\x9e\x00\xdd\x8f\xd7\x88\xa3\xad\x3c\x1b\x4c\x6d\xdc\x2d\x83\xde\x5c\x83\x3a\x9d\x78\x18\x80\x7d\x49\x46\x9e\x4e\xc8\x9f\x88\x24\x97\x31\x75\x23\x57\xc6\x3a\x42\x5c\x08\xb7\x82\x27\x80\xf6\xb2\x7d\x6e\x23\x2c\xd2\x62\xea\x10\x07\xba\x4c\x42\xbe\xf8\x7c\xdb\xee\x0c\xdb\xaa\x1e\xe9\x34\x4d\x0f\x81\xd8\xd5\x15\xeb\xf0\x1b\x12\x91\x55\x55\x46\xf9\x5d\x6f\x70\xb9\xf2\x99\x88\x87\x93\xb9\x9e\x4d\xb6\xb2\xab\x68\xaf\x7f\xf7\xe5\x35\x7f\xd6\x54\x94\x2c\xc2\x36\xa4\x98\xa6\x46\xdc\xad\x46\x72\xae\x90\xcf\x0b\xc8\x56\xb6\x94\x1f\x5e\xe4\x35\xb3\x4c\xc7\xf5\xee\xf0\x28\x78\x86\xb9\x81\x50\x0d\xc2\x08\x3c\xf2\x43\x8a\x7d\x67\x5f\x50\x8b\x01\x6a\x41\xad\xc1\xbd\x02\xa4\x39\xa6\xa2\xec\x3c\x6b\xcc\x6e\x00\x59\xaf\x35\x14\xea\x62\xd9\xdb\xb3\x3b\x09\xdf\x0c\xb1\x23\xb9\x23\x23\x80\x66\xa8\x18\x6c\x13\x6a\x29\x33\x04\x85\x22\xc1\x10\x32\x1e\xc4\x0c\xe1\x5b\xeb\x99\x72\x07\x55\x34\x98\x98\xd1\xd9\xb9\x8f\x91\x50\xbd\x75\x95\x3c\x91\x2c\xa1\xe1\x1c\x30\x81\xaa\x07\x3b\x5a\x3c\xe2\xa0\x64\xe6\x6b\xda\x56\x78\x0a\x96\xb8\x52\x69\x18\xf4\x64\x3a\x88\x19\x00\x0e\xdb\x66\x77\xaf\x35\xef\x30\xa8\x41\x1e\x1c\x70\x64\x31\x61\x13\xdb\x68\x58\xa1\x83\xfe\x0f\x5b\x03\x56\x6f\xb1\x45\xf0\xd6\x81\x9f\x09\x71\x0d\x71\x61\xa8\xc9\x75\x14\x04\x7a\xd5\xba\xd4\x75\xf9\x84\x3b\x7d\x2a\xe5\x53\x17\x15\x59\xca\x81\x6c\xda\x7a\x65\xa6\xb7\x67\x0f\x7d\x28\xaa\xdd\x28\x99\x27\x6d\x58\x58\x99\xe1\x57\xf1\xad\x75\x82\x0b\x5d\x3d\xd1\x54\x46\x46\xfa\x44\xfc\x9d\x94\xf4\xc8\x38\x0b\x11\x05\x55\xac\x74\xb9\xa6\xa8\x92\xa3\x5a\x03\x68\x1a\x12\x46\x5b\xa9\x0a\x7a\x06\x22\xe7\xeb\x06\x28\x7e\x55\x1e\xad\x0c\x60\x70\xaf\x25\x89\x8f\x5c\x6f\x72\xbd\x95\xa5\x38\xe0\x5a\x35\x57\x8d\x4c\xfe\xcb\x5a\x96\x87\x82\xf9\xc4\x8d\x75\xaf\x72\x8c\x45\x17\xc0\x7f\x0c\x39\x41\x91\x05\x9a\x20\xa0\xe7\xd8\x77\x80\x45\x4f\xef\xb8\x72\x50\xb6\x6d\x4f\x7c\x20\xc6\xdb\x4c\x18\x88\x72\xbf\xa5\x82\xc2\x8a\xfa\x20\x9b\x37\x7b\x57\x7a\xab\x97\xdb\x42\xf2\x62\x5a\x7d\x32\xdf\xba\x97\x20\xdf\x8e\x7f\x39\x28\x1e\x09\xf0\xa3\xbd\xe0\xc5\xe2\xbf\x9d\x95\x7a\xfe\x42\x1c\xf8\x1a\x77\x18\xda\x9d\xc4\xbb\xe6\x53\xa1\xe7\xe6\x90\x03\x1c\x7b\xf3\xad\xf8\x13\x74\x32\x9f\x64\xc5\x52\xaf\xc5\x87\x6c\xf1\x49\x96\xbd\x3d\x04\x81\xd5\x25\xa8\x97\xd9\x56\x9c\x68\xbb\x75\x47\xa2\xbf\x29\x55\x2e\x8e\x7e\xf8\xe1\xd5\x9e\xfb\xed\x45\x29\x8d\xe2\xea\xf7\x1f\xd5\x42\xee\xcd\x6e\xb2\xea\x85\x23\x08\xc2\x99\x83\x93\xfe\xff\xfb\xad\xdb\x71\xfc\xe6\x3f\xbd\x6f\xc6\xc3\xd3\xfe\xc5\xcb\xe3\xde\x1f\x7f\xf5\xbe\x1f\xfc\xf3\x70\xff\x8f\x57\xdf\x1e\x1f\xbf\x6e\xf4\xff\x38\x7e\xf5\x87\xef\x9e\xfb\x7f\xfc\x16\x3f\xb3\x1b\x29\xc6\x1b\x59\x58\x21\x68\x28\x5b\xdf\xf8\xa3\xf7\xc7\x44\x1c\xfd\x41\xf4\xeb\xeb\xda\x54\xe2\xf8\xd5\xab\xd7\x7b\x13\xd9\x62\x9f\x0a\x99\x4f\x23\xcf\x3f\xa0\xcf\x5a\x46\xad\x96\x0e\xf6\x59\x39\xef\x1f\x26\x2e\xb5\xcc\x97\x58\xdc\xd1\x14\x00\x06\x2e\xb6\xda\x46\x51\x85\xdd\xb7\xa2\x18\xce\x5a\x56\x6f\x88\x7e\x29\x1e\x34\xf1\xd9\xa2\x45\xa6\xcb\x35\x82\x8b\x4a\x49\x41\x6b\x56\x5c\x50\x9a\x45\x3c\x11\xd0\x85\x0a\xb1\xef\x44\xd5\xd3\xf1\xc8\x00\x81\xc8\x8f\x74\x48\x66\xdf\x4d\xf7\xd1\x17\xf0\x05\x67\xa8\x29\x2d\x4f\xca\x67\xb2\xfc\x94\x03\xe2\xa5\x46\x87\xb2\x2c\x8c\xda\x63\x10\xcc\x43\x51\xdd\x2a\x3a\xf0\x53\x38\x19\x78\x11\x55\xb9\x37\xa7\x49\x7d\xe1\x01\x81\x8d\xe1\x4f\xdf\xa2\xda\x09\x81\xef\x4f\x1d\x49\x59\x23\xdc\x8c\x61\xe6\x98\x21\xbe\x23\x70\x0c\x31\x5b\xf8\x2c\x05\x6d\x83\x60\x2d\x71\xd1\xb4\x02\xb6\x0c\x35\x70\x4d\xe0\x9c\x2d\xd0\x28\x2e\x89\x5e\xee\x5e\x12\x74\xca\x0c\x4c\x4b\xcc\xbb\xb9\xca\x6b\xff\xe9\xa8\x05\x59\x6f\x0f\xba\x3e\xb2\x33\x29\x06\x2e\xb8\x03\xfe\xaa\x75\x11\xc7\x17\xe9\x08\x17\x64\x7c\x39\x3a\xed\x3b\xf2\xcb\xc1\x6c\x6a\x1d\x42\xf4\xfb\xc7\x93\xa9\xf8\x6f\xff\x0d\x42\x40\x2f\x5e\xc0\x9f\xad\xc5\xd7\x15\xe6\x09\x42\x37\xbf\x71\xc4\x47\xd8\x09\x9e\x0e\xa6\x27\xc3\xfe\xe0\x3c\x3d\x8d\x23\x28\xd3\x0f\xfd\xe1\x70\xd7\x7c\x93\xd6\x64\x13\x41\x11\xb9\xfe\xe5\xec\xc3\x78\x72\x30\x3d\x04\x8f\xfb\xe3\x28\xc5\xff\x46\xef\xda\x2d\xab\x0f\x7a\x9c\x51\x54\xe5\x74\x30\x49\x4f\x66\x76\x05\xfc\x7f\x71\x68\x23\x88\x77\xa4\x3f\xa5\xe7\x17\x43\x08\xf9\xed\x8c\x77\x1c\x3c\xb2\x8a\x17\x93\xf1\xc9\xe5\x24\x3d\xb7\xd3\x04\x1f\xff\xdd\x74\x36\x98\x5d\xce\x52\xf1\x7e\x3c\x3e\x85\xf8\x03\xc6\x9c\xd2\xe9\x5b\x17\xe7\xb8\x9c\xa6\x09\x04\x39\xe0\xc5\x17\x93\xf1\xd9\x60\x36\x7d\x6b\xff\xfb\xdd\xe5\x74\x00\xeb\x3c\x18\xcd\xd2\xc9\xe4\xf2\xc2\xae\xd0\xa1\xf8\x30\xfe\x98\xfe\x98\x4e\x04\x44\x3b\x4f\x61\x43\x40\x50\x40\x88\xc6\x13\x08\x2f\xd8\x35\x80\xfd\x4a\xc4\xc7\x0f\x29\x84\x27\x06\x23\x5c\xd7\xbe\x5d\x82\xe9\x6c\x32\x38\x99\x85\x1f\xb3\xab\x3c\x9e\xcc\xc2\xe0\xcc\x28\x7d\x3f\x1c\xbc\x4f\x21\x1e\x37\xf1\x11\xcd\x43\x17\xf7\x19\x8c\xc8\xdd\xb8\x6a\x85\x80\xa8\xc9\x29\xef\x8b\x0f\x9d\x3c\x39\x2c\x82\x4a\x02\x6c\x4b\xc7\x4a\x44\x6d\x75\x98\x9c\x2c\xea\x14\x8d\x2a\x08\xd8\x3b\x7c\x39\x4d\xb6\xbc\x95\x65\xa5\x0c\xc1\xb1\x22\x7c\x22\x93\x56\x23\xa2\x32\x97\x09\x33\xed\xa3\x56\x5c\xca\x2c\x27\x12\xf8\x58\x55\xf0\x75\x44\xe9\x9e\x45\xe2\xb2\x6d\x9b\x52\x35\x62\xfd\xd8\x13\x98\xd0\x53\x6c\xf7\x36\x9e\x67\x6e\xac\x9d\x99\x11\x13\x1e\xc4\xea\x09\x1f\x08\x5a\xb8\x35\xd1\xde\x9e\xd3\x9c\x0a\x8b\xa4\xae\x95\xa9\x00\x84\x5c\x95\xd9\x52\xae\x33\x5f\x71\xdb\xa1\x63\x43\x47\xfc\xe8\x87\x1f\x7e\x78\x69\xaf\x6f\xb1\x43\x21\x27\x56\xd1\xdf\x69\xbd\x14\x27\xc0\xd7\x75\x92\xe5\x6a\xa5\xcb\x42\x65\xe8\xf8\x88\x7e\x9e\x8b\x09\x22\xae\x26\xd8\x0b\x79\x19\xf5\xa5\xfc\xca\xb6\x5c\xcb\xa0\x69\x30\x21\xb8\x7e\xf3\x0e\x78\xff\xb1\x7f\x7a\xdf\xbc\x7a\x37\x3d\xfd\x87\x99\xfe\xf0\xf3\x88\xfd\x7f\x74\x7c\x7c\xdc\xb0\xff\x8f\xbe\x3d\x7a\xb6\xff\x7f\x93\x9f\x38\x4a\x77\xfc\xea\xd5\xf7\xd6\x94\x9a\xe8\xb9\x18\x66\xc5\x32\x97\x5b\xf1\x9f\x4a\x3d\xff\xdf\x72\xfc\x47\xaf\x90\xd5\x7f\xde\x8b\xcf\x7b\x6d\x64\xd2\x00\x7f\x33\xa9\x74\x08\xa2\x0b\x9d\x02\x46\x3c\x32\x2e\xa9\x69\xf9\xaf\x90\xe7\x9a\x22\x0a\x4e\x31\x44\x37\x7f\x68\x50\x71\x8a\xcc\xde\x8d\xde\x76\x70\x26\xc9\x14\x12\x41\x81\x9d\x03\x11\xff\x49\xfa\xbe\x3f\x39\xc5\xcc\x54\x64\xa9\xf9\x4c\xc9\x70\xf8\xf5\x56\xd2\x2e\xeb\x87\xc6\xd4\x36\x58\x9c\x49\xd2\xb6\x5c\x76\x5a\x26\x6c\xeb\xd0\x3f\x3f\x7e\xe8\xcf\xa6\x63\xb0\x12\x26\xe9\xf4\x72\x08\x09\xa8\xb3\xc9\xf8\xbc\x6d\x75\x04\x46\x47\x64\x2b\xf4\x47\xa2\x0f\x69\x30\x48\x99\x3a\xc3\xa1\xc3\x26\x00\xbb\x61\x30\xbe\x9c\xd2\x17\x92\x66\x5e\x68\xcc\xc6\xc7\x08\x13\x6b\xb8\xdc\x41\xb6\xa8\x95\xf9\x0b\x96\xff\x59\xfd\xff\xb6\x3f\xbd\x6f\xfa\x67\xc3\x97\x47\xbd\xe3\x7f\xe0\x15\xf0\xb0\xfe\x3f\x3a\xfa\xee\xd5\xf7\x4d\xfd\xff\xfd\xeb\xd7\xcf\xfa\xff\xb7\xf8\xe9\x2f\xac\x09\xa9\x16\x18\x2b\x6f\x46\x7e\x8e\x7a\xc7\x08\x40\xec\xfc\x58\xb3\xf9\x82\x83\xea\x31\x09\x0c\x19\xf0\x37\x6a\x23\x0e\x20\x2b\x35\xe6\x4f\x7c\xd4\xe5\xa7\xfd\x43\x42\xe0\xe8\xbb\x42\x96\xf4\x89\x21\x95\x20\xec\x1f\x02\x84\x95\xda\x34\x74\xa5\xe3\x84\x5a\xaf\xe5\x92\x28\xab\x63\x70\xd4\x4e\x06\x82\xe8\xfd\x6f\xf6\x86\x4c\xb9\xeb\xdd\xfc\xee\x89\xde\xfa\xf5\xd8\x7b\x6f\xaf\x23\x3b\x3b\x07\x68\xe7\x31\x47\x17\x96\x5b\x95\x8d\x2c\x8d\x2e\xa8\x1b\x99\xe7\x8d\x76\x26\x7b\x38\x24\x71\xb0\x7f\xa5\xeb\xfd\x43\x2c\x2a\xcb\x97\x2f\xef\xd4\x52\x26\x11\x78\x3c\x81\xfe\x33\x94\x1d\x04\x8e\x65\x59\x6e\x64\x55\x67\x39\xfe\xc5\x17\x5e\x51\xed\x3f\xb5\x98\x38\x3a\xdc\x71\x59\x43\x3f\xee\x84\xf3\x60\x09\x97\x6f\x77\x35\xdf\x33\x12\x43\xfa\x01\x01\x75\x3c\xfc\x4e\xfe\x39\x08\xa9\xeb\x95\x6f\x0b\x88\xab\x4d\x88\x79\xc6\x39\xdf\x15\x48\x6b\x45\xb4\x94\xb9\x4f\xc8\xb9\xe5\x75\xc5\x9e\x72\x3d\xd7\x4b\xe5\xb3\x65\x8d\x41\x18\xb1\xaa\xcb\x22\x4a\xea\xf1\x33\x12\x86\xcd\x26\xb8\x14\x30\x23\x44\x27\xad\x24\x96\x62\x58\xdf\xf0\xab\xa7\x16\xd7\xbe\x74\x06\x23\x7b\x7b\xfd\xca\x07\x4c\x27\xd4\xd6\xd3\x51\x74\x60\xdc\xd1\x91\x15\x53\xcf\x84\x13\xe2\xda\xb3\x82\x74\xea\xdf\xfe\x91\xde\x9e\x55\x98\x50\x87\x4c\x7e\x12\x67\x5c\x12\x5e\x61\xec\x07\x41\x8e\x22\xa7\xb2\x5d\xa5\x46\xe3\x45\xad\x89\xc7\x14\x1d\xc5\xd6\x3d\x41\xaf\x48\xb8\x18\xc3\x85\xcd\x30\xb0\xf7\x01\x24\x8c\xe5\xe7\xca\x11\xe6\x4a\xa2\x0b\x53\xcc\xfc\xbc\x1f\xae\xc6\x08\x9e\xd9\xdb\xef\xe2\xcb\x0e\x07\xc8\x86\xe3\x63\x4b\xe1\xa9\xbd\xb3\xa0\xd2\xb3\xfd\xc6\x88\x7f\x37\xcb\x17\x35\xf6\xcc\x40\xac\xbe\x2e\xd7\x51\x23\x46\x7e\x05\x42\xd8\x1d\x89\x78\x73\xc1\x7a\x7b\x29\xa7\xee\x69\x99\x59\x8b\x80\xe6\xe8\x89\x51\xd0\x4b\xc4\xc5\x3b\xbc\x80\x16\xba\xf1\x27\x20\x16\x67\x8c\xbc\x2e\x1d\x0c\xa1\xb1\x4d\x05\x97\x11\xad\xa8\x42\xd1\x6d\x3a\x00\x60\xb9\x1d\x2f\xfc\x22\x61\xee\x2e\xee\x50\x21\x8b\xa5\x2e\x31\x1c\xc2\x71\x12\x8c\x59\x73\xe9\x9f\x27\x32\x56\xa6\x71\x32\x5c\xd2\x19\x0b\x48\x29\x2c\xe2\x82\x24\xde\x59\x88\xd2\xe5\xba\xec\xed\x7d\xe4\xac\xb4\x15\x9f\xd3\xa8\x79\x00\xff\x29\xd0\xae\x94\xc3\xf6\x6d\xf3\xe2\x28\x4b\xd0\x2d\x20\x1e\x9f\x62\xed\xd2\xd4\x27\xac\x52\x3a\xbf\x12\x26\xe5\xe7\x5b\xff\x25\x2a\x4d\x21\xca\x8d\x05\xf4\xea\xad\xda\x35\x75\x7e\x68\x70\xbb\xf5\x44\xda\x51\x68\x0b\x91\x7f\xa7\xc5\xc2\xfb\x6c\x53\xea\x85\x94\xd8\xd6\x51\x16\x95\x74\x25\x2f\xad\x71\x3e\x50\xac\x0b\x04\x91\x85\xf3\x8e\xde\xf5\xa7\x83\x29\x2c\x53\x13\x4a\xe8\xba\xcb\xf0\x16\xea\x92\x91\x03\x41\x83\xc9\xa4\xa3\xf9\x0b\x0e\x8a\x76\x86\xae\x85\xd1\x78\xf4\x72\x30\x3a\x9b\x0c\x46\xef\x21\x36\x9a\xfc\x7d\x88\x83\xc7\x51\x84\x14\x53\x1c\x4f\x06\xef\x07\xa3\xfe\x50\x7c\x1c\x4f\xfe\x1c\x63\x07\xc1\x76\x71\x91\xe9\x89\xfd\x86\x83\x4f\xfa\x0e\x23\xc8\x97\x63\xec\x42\x2b\xe4\x65\x6b\xd7\x44\x88\x91\x76\x9b\x5c\xe9\xf6\x36\x84\xf5\x87\xb8\x13\x54\x59\x1d\x6c\x8b\xcf\xd2\xf4\xf6\x86\x1e\xc2\x0f\xa7\x3f\x83\x7e\xcd\xdb\x9e\xb8\x84\xcf\x17\x3a\x2e\x3b\xc2\x04\x1b\xff\x09\xfb\x1f\x56\x37\x52\x87\x4d\x96\xad\x18\xe9\xb2\x12\x07\x9e\x7c\xa8\x90\xd7\xb9\xba\xb6\xd2\x83\x25\x83\x55\x99\x2d\xaa\x24\x0a\x8d\x26\x14\x90\x8c\x4e\x06\xd0\xe9\x31\x95\x4d\x60\xc4\xb0\xfe\xc5\xa2\xb3\xc4\x95\x9f\x25\xcc\xf8\x01\xe2\x02\x3a\xdf\xfe\x37\x5e\xe7\x94\x29\xb1\x4b\xbb\xcc\xd6\xd9\x75\xa0\xd5\x6e\x32\x3b\x20\x7b\x9e\x4a\x0c\xda\x12\x0d\x94\xa9\xf3\xd6\x16\x08\xd2\x8b\x41\xe9\x49\x63\x17\x1e\x16\x54\x7e\x37\x74\x55\xd4\x48\x63\x77\xad\xf5\xf2\x4e\xe5\x79\x82\x26\xab\xa9\xf4\x66\x93\x5d\xcb\x84\xe9\xe3\x4b\xb1\xca\x54\x5e\x63\x6f\xf1\x75\x96\x33\xbd\x5e\xc2\x0d\x37\xb8\x5c\x98\x2a\xc5\xf4\x7a\x2d\xcb\x45\x34\x53\x7c\x59\xd0\xd0\x34\xdc\xf7\x9c\xf7\x9d\x36\x21\x62\x69\xf7\x7f\x44\x0e\xb2\x0c\x83\x24\xb8\x15\x59\x2e\x54\xf1\x73\x0d\xcd\x1b\xec\x6a\x61\x43\x5c\x77\xd9\x40\xeb\x63\xbf\xfb\x8e\xe2\xfc\x73\x58\x0b\x05\xf6\x61\x76\xe7\xea\xb6\xa9\x6a\xdd\x0f\xb1\x27\xa6\x7a\x2d\xc5\xcf\x75\xa9\xcc\x92\x6b\x72\xb9\x98\xdb\x5a\x38\x4d\xa4\x5a\xd9\x98\x9f\x17\x86\x9d\xb2\x40\x95\x34\xca\x04\xcf\x81\x1e\x9f\xfe\x41\x5c\x94\xe9\x56\xe6\x4a\xd7\xbd\xbd\xa0\x76\x3b\x30\x11\x88\xc7\x11\x7a\x51\x05\xbf\xde\x7f\xb4\xd9\x54\x2c\x4b\x0f\x77\x9d\x72\xdb\x9e\xdd\x66\x2a\x87\x75\x8c\xf3\xad\x68\x06\xcd\xed\xd7\x09\x12\x14\xd4\x4b\xc7\xd6\x42\xcb\x7b\x80\x12\x5d\x43\x19\x0b\x68\x35\x9e\xb5\x69\xb9\x42\x0f\xe2\x31\x0b\x2e\x04\x4d\xb5\x48\xe8\xe2\x4f\xc2\x75\xe8\x06\xe4\xaf\x40\x13\x0c\x13\xab\x01\x98\x93\x97\xd9\xe4\xb9\xa8\x94\x78\x1d\xb9\xd8\x16\x10\x9e\x79\xb6\x40\xbf\xe7\xc9\xd3\x40\x8e\x98\x10\x5c\x55\xca\x8d\x36\xaa\xd2\x20\xf0\x3b\x6c\x36\x2a\xb5\x55\x85\xfc\xbc\xb1\x76\xe9\xad\xe4\x02\x19\xea\x60\xc7\x54\x50\xf3\x2d\x18\x72\xa0\xcd\x8c\xa3\x6c\x70\x33\xb4\x8a\x52\x15\x35\x6e\x42\xa3\x12\xb8\x69\x1b\x17\xbe\xf6\xd1\xdc\xb0\xff\xc9\x45\x48\x5c\x88\xb3\x63\x22\x90\x3a\xff\x7a\x67\x16\xdd\x20\xef\x7a\x77\x58\xa0\xe7\x35\x34\xe2\x9c\x11\x35\x85\x22\xd5\x7d\x81\x0e\x41\x7f\xc1\x8d\x3e\x02\xed\x4a\xb7\x80\x63\xd9\x88\xe9\x03\xec\x3c\x7d\xe1\x3e\x2c\x19\x5c\x71\x54\x8b\xef\xed\xce\x66\x3d\x3e\x9e\xd6\x26\x5d\x8e\x50\x2b\xdc\x01\x95\x5b\xf1\xce\xb3\x3b\x53\xab\x8a\x3b\x57\x61\xc5\x3a\xd4\xce\x3b\x0e\x28\xfb\xfb\xf1\x74\x20\x4e\x64\x49\xee\x84\xde\x48\x07\xdf\x88\x91\xc8\x3e\x97\xbf\x0c\x2a\x89\xf9\xf6\x6e\x92\x90\xee\x3f\x65\xb1\xf6\xad\x9f\x0a\xcc\xc1\x54\xc3\x6b\xc2\xbe\xde\xe4\xc3\x7a\xff\xd4\xd9\x12\x8e\xec\x2d\xab\x7c\xfb\xf0\xbd\x09\x9f\x9a\x4b\xc7\xd2\xe8\x50\x0a\xed\x5b\x0d\x34\xcd\x5d\xb6\xc5\x8a\x2b\x9f\xd3\x0c\xaa\x2d\x75\xd0\xa4\xb7\x4d\x4e\x44\x55\x96\x79\x76\x87\x02\xeb\x04\x1d\x5c\x23\xc3\xf5\x88\x9a\x6a\x2f\x65\xe9\x23\xf2\xd0\xa2\x24\x66\x4f\x80\x3b\x02\xa8\xc5\xf0\x18\x39\x3c\xab\xeb\xa0\xdb\xca\x29\x1c\x8b\x61\x76\x87\xc4\x8e\x69\x4f\x4c\xb4\x91\x05\xa6\x12\x49\x58\x4a\x4e\x25\x86\xa9\x85\x56\x02\x60\x57\x72\x31\x02\x6f\x74\x81\x87\x1a\xbd\xc4\xf9\x3a\x99\x87\xbd\x5e\x02\xd6\x60\x36\x82\xbb\x3d\x18\xec\x52\x17\x1b\xf7\xff\xc4\x31\xeb\xde\x37\x27\xa3\xc9\xe0\xe5\xc5\xb6\xba\xd1\xc5\x3f\x28\x06\xfc\x48\xfe\xef\xfb\xef\x5e\x7d\xdb\xc4\xff\xfd\xe1\xdb\x3f\x3c\xc7\x7f\x7f\x8b\x1f\xbb\xfb\x80\xcc\x11\xd3\xf1\xe5\xe4\x24\xe5\xfa\x39\x2c\x6a\xb2\xee\xdb\xde\xe0\xfc\x62\x3c\x99\xf5\x47\xb3\x37\xe2\x62\x98\xf6\xa7\xa9\x98\xa4\x7d\x4c\xb4\x9d\x8d\x87\xc3\xf1\x47\xc8\x95\xf1\xc7\xc5\x49\x7f\x92\x9e\x5d\x0e\x87\x57\xbd\xbd\x77\x57\xe2\x64\x38\x38\xf9\x33\x24\x87\x46\x62\xbf\x7f\x72\x92\x5e\xcc\xf6\xc5\x47\x2c\xc5\x1b\x9d\x0e\x4e\xa0\x58\xee\x5d\x3a\x1c\x7f\x84\x74\xd7\xbb\x2b\xdf\x15\x78\x30\x9a\xce\xfa\xc3\x21\x7c\x39\xc0\xa3\x88\x4b\x48\x36\x5d\x5c\xcd\x3e\x8c\x47\xe2\xa8\xf7\x7d\x22\xe6\xb2\xca\xc4\x51\x80\x3e\x81\x7a\xb0\x49\x2a\x4e\xed\x98\x20\xc7\xf7\xa1\xff\x63\x1a\x14\x6a\xd9\xc1\x77\xf6\x25\xe6\x7c\x54\x6b\x19\xb8\x85\x23\x5e\x9a\xcd\xbf\x62\xbd\x3d\x36\x86\xb6\x3a\xe4\x84\x4a\x52\xf9\x32\x19\x65\xd8\xe3\x0a\x50\x13\x59\xb9\xb8\x11\x83\x42\x55\x0a\x6b\x26\x13\x71\x93\xdd\x62\x14\x4d\xe8\xd5\x0a\xba\x29\x56\xe2\xe8\x8f\x3f\x7c\x07\x58\xe5\x4a\x17\xe2\xe3\x8d\xaa\xa4\x38\x2d\x21\xe2\x3b\x91\x88\x4c\xff\xb1\x2f\x8e\x5f\x1d\xfd\x70\x24\x0e\xf6\xed\x36\xee\x1f\x7a\x68\xe0\xa0\x58\xaa\x5b\xb5\xac\xd1\xf0\x1e\x97\xd7\x59\xa1\xfe\x85\x41\x97\x74\x2d\xc8\xfd\x43\x32\x88\x38\x82\xe7\xef\x16\x6c\xf1\x89\x5a\x21\x5a\xe3\xa0\xa5\x44\x37\xe9\xa2\x63\x27\xde\x85\xfa\x4c\xb0\x81\x78\x2e\x33\x6a\x76\x07\x11\x84\xbb\xbb\xde\x06\x75\x90\x2e\xaf\xc5\xc0\x5e\x44\x85\xac\x84\xb1\xd3\xd6\x05\x43\x4f\xbf\x4d\xec\x75\xf2\x4a\x1c\xec\xfb\xa1\xcd\x8f\xf6\x0f\xb9\x71\xe2\x34\x0e\xc3\x76\x16\x49\x37\xdd\x4a\xd7\x4b\x3a\x11\x70\x18\xe2\x20\x3e\xaf\x15\x58\x6a\x51\xdc\x3d\x0e\xca\xfb\x70\x7d\x18\x26\x70\xc8\x4f\xbb\x33\x59\xbe\xfd\x17\x99\x88\x4a\x9a\xca\x45\xd9\x83\x54\xf9\x26\xe7\xda\xfb\x45\x0e\x3c\x81\xd0\x8c\xb9\x15\x73\x8e\x39\x99\x9a\xbb\x26\x45\xb8\x30\x60\xf9\x4b\xe4\x89\x69\xf6\x2a\x76\xd5\xf4\x1c\x40\x4a\xac\xab\x82\xd4\x61\x60\xae\xd8\xc5\xe8\xea\xb8\x0d\x3c\x0f\xd6\x82\xc2\xc8\x55\xf8\xbe\xe4\x09\x2f\xf4\x5d\xa6\x5d\x54\x8d\x1a\x5f\xf6\xa9\xb0\x0b\xca\xba\x54\x21\x72\x25\x6b\xbb\x5b\x3b\x06\x92\xf8\xbd\xb1\x37\xba\xa9\xe7\xdc\x30\x36\x8e\xc0\x43\x18\xfa\x40\x73\x91\x99\xfd\xe3\x2f\xb5\xae\xa4\x39\x7c\x23\xf6\xdb\x12\x9e\x38\xf2\x59\xef\xdc\x99\x27\x88\x95\x2a\x76\x0d\x94\x74\x86\x5f\x41\x8a\xbd\xe6\x7a\x91\x55\x9e\xc7\xcb\xc9\xbc\x6f\xaf\xeb\x27\x51\x17\xea\x97\x1a\x93\x3d\x4c\x68\xe2\x22\xeb\xa5\x38\xf8\x54\xe8\x3b\x62\xb4\xb9\x01\xa4\xc6\xe1\x1b\xd0\x1f\xbd\xe3\xe3\x6f\x8e\x5e\x1d\x1d\x75\x0e\x01\x0a\x4e\xe6\x92\x32\x53\x1c\xe0\x85\x80\xf9\xe7\x2d\xc4\x8b\xa1\xbf\xfc\xae\xc1\x5d\x4e\x86\x6f\x6e\xaa\x6a\xf3\xe6\x9b\x6f\x6e\x96\x79\x0f\xdf\xdb\x2b\x64\xf5\x4d\xf8\xe6\x7d\xee\x93\x35\x08\x9b\x30\xba\x9d\x23\x61\x30\x1d\x4d\x24\xd8\x94\x77\x64\x67\x20\x55\x01\x13\x46\x24\xe9\xda\xd3\x05\xc5\x09\xa7\x3b\xce\xc5\x11\x59\x4a\xeb\x44\x05\xfb\x1c\xd5\x3e\x42\x71\x18\x07\x57\x31\x75\x41\xbc\x4a\x6e\xf4\x2d\x8f\xdd\x11\xce\x91\xf8\x83\xad\x4c\xb3\x91\xc2\x57\xa8\x54\x8e\xfc\x99\xe3\x0a\x20\x71\x95\x8e\x26\xc5\x0d\x93\x40\x2d\x81\x54\x7e\x8a\xb5\xb2\x3d\xe1\xe1\xe0\xdd\xc0\xe2\xc0\xef\x3c\x33\xca\xd0\x63\xce\xfb\x7f\x4e\xa1\x04\x7e\x92\x5e\x4c\xd2\x69\x3a\x9a\xf5\xe9\xe2\x9b\x44\x00\x62\x42\x18\x07\xf8\xe2\x9e\xbd\x9c\x01\xfb\x79\x26\xd2\x9f\xfa\xe7\x17\xc3\xb4\x01\x8b\x25\x48\x6f\xfc\x1e\x7b\xbf\x06\x40\x9c\xd1\x55\xe3\xcd\xc1\x8b\xaf\xba\xa0\x35\xe3\x49\x1c\x2b\x1e\x5d\x75\x21\x90\x01\x34\xdc\x9f\x85\x80\x54\x6f\x20\xcc\x8f\xb0\x1a\xdb\x0e\x94\x03\xd3\x04\xa0\xe5\x72\xe1\x2b\x01\x25\xda\x53\xee\xef\x03\x73\x40\xf0\x8e\xfd\x56\x54\x5b\x4d\x97\x7f\x1a\xd7\x71\x5f\x4e\xd3\xc9\xb4\x85\x4f\xe6\x21\x77\x62\x90\x1f\x82\xf7\x00\x70\xa7\x3f\x15\x7d\x42\xf4\x20\x88\x07\xec\x22\xac\x11\x27\xb3\xc8\x15\x88\xc7\x36\x91\xd5\xc5\x0c\x12\x4a\x27\x83\x1f\xfb\xb3\xc1\x8f\x29\x52\x20\x8c\xcf\x9e\x84\xce\xa5\xcf\x72\x43\x89\x59\xe7\x95\xf9\x30\x51\x67\xbd\xc1\x0e\x55\xdc\x7c\x66\x5e\x42\xf8\x89\x9c\xa8\x4e\x76\x40\xe2\xfd\xdd\xf1\x36\x8c\x51\xcc\xa5\xb8\xd6\xb7\x56\x1d\x51\x0b\x5a\x22\x0d\xda\x94\x92\xb2\x29\xf6\x53\x25\x74\x8e\xa9\x0c\x67\x7d\xf2\xec\xce\x45\x9a\x2a\x6a\xd9\xfb\xa3\x2a\xaf\x15\x80\x5b\x3d\xd1\xcf\x42\x17\xab\x5c\x61\xbb\x67\x0a\x8e\x22\xc0\xdf\xf4\xc4\x88\x28\x35\x55\xb1\xc3\x84\xf0\x23\x5c\xda\x5f\xa0\xcb\x8a\x19\x49\xab\x0e\x4a\x89\x7d\x96\x00\x11\xa1\x57\x22\xbb\x96\xc5\x62\x8b\x44\xa5\x85\x04\xa0\x04\x44\x96\x7f\xd6\x0a\xf8\x6e\x0a\xd0\x17\x6c\x57\x82\x4c\x7a\xff\x5d\xca\x9d\xeb\xe4\xe8\x59\xc0\x88\x69\x30\x7e\x5a\x23\x01\x1e\x15\xe7\x07\xe1\x5f\x58\xa1\x8b\xdd\xd2\x5d\xca\xd8\xb0\x35\xf3\x50\x92\xd0\x67\x18\x83\x74\xa6\x94\x2e\x50\xee\xb9\x15\xb7\xcc\x62\xfb\x6e\x2b\x16\xb9\x5a\x80\x4e\xa3\x6b\xc6\x79\x08\xf3\xba\xaa\x80\x6c\x1b\xaa\xf1\x48\xab\x2e\x93\x80\x2f\x0a\xe2\xfc\xd4\x40\xbf\x05\xf7\x6e\x9a\xaf\xf6\x38\x78\x4b\xce\xa9\xeb\xb9\x14\x73\x5d\x17\x9e\xf6\xe4\xab\xec\xc5\xde\x1e\x8e\xf6\x9f\xd8\xfb\xb7\xfe\xff\x50\x0d\xd5\x5f\x5e\x5e\xbc\x3c\xea\x1d\xfd\x2e\xfe\xff\xd1\x77\xaf\x8e\x5a\xfe\xff\xeb\xe7\xfa\xbf\xdf\xe6\x07\xa4\x7a\x81\x64\x49\x52\x2c\x6b\xf1\x97\xfa\xfe\xcb\x5c\x2e\xc4\xff\xfb\x7f\xfe\x77\x07\xec\xbf\x95\xe2\x80\xc4\xe4\x30\xc0\x86\x1d\x91\x4b\x7c\x51\xde\x7f\xc9\xd6\xf3\x3a\x97\xf6\x17\x27\xb2\xaa\xc8\x09\x5a\x48\x61\x5e\x40\xa4\xfa\x97\x5a\x8a\xfb\xbf\x8a\x0a\x92\x72\xfa\x5a\x2d\x94\xf4\xac\x6b\xf7\x5f\xc4\x52\x17\x95\xb0\x46\x8c\xaa\xea\x3c\x53\x38\x94\x65\xa9\x55\x25\x96\x2f\xb2\xba\x92\xb5\xd5\x39\xf7\x5f\x20\xda\xfc\x4b\xfd\x42\xe5\x42\x42\x5f\x9b\x9f\x65\x25\xb2\xfa\x33\x1c\x5d\x69\x84\x75\xbf\x32\xf1\xd5\x93\x12\x07\x0b\xf5\x32\xdb\x94\xf7\xff\x8a\xfd\x44\xf3\xfb\x2f\xf0\xa0\xbf\xfd\x5f\x7f\xfb\x2b\xcd\xe4\x6f\x7f\xfd\xdb\xff\x74\x7e\xe6\xe9\xfd\x17\xd7\xb0\xc3\xfe\xea\x34\x2b\x8c\xfd\xbc\x1d\x22\xe4\xeb\x79\xfe\x89\x9d\xf5\x5a\xab\xc2\x08\xbb\x04\xd4\xb6\x44\x7e\xae\xa4\x28\x5e\x58\xbd\x66\x7f\x5b\x17\xa0\x63\x81\xcf\xec\xfe\x4b\x09\xbe\x8d\x06\xca\x4d\x09\xe5\xe2\x25\xd4\x2f\xda\xb1\x2c\x74\xb1\xb8\xff\xb2\xcc\x8a\xca\x0e\xe7\x6f\x7f\x7d\xf3\xd8\x9a\x99\xba\xb4\x1f\xe1\x25\x4f\x04\x30\x51\x5a\x27\x09\xd3\x88\x85\x14\xcb\xfb\xff\xb9\x66\xbe\xe0\x52\x19\x3b\xf3\x4d\x56\x8a\x05\x18\xca\x85\x75\x2f\xee\xff\x0a\x34\xe5\xe5\x52\x96\x9d\x93\x7c\x1b\x0c\x8f\x3c\xd3\xba\x7c\xe2\x00\xdb\xe3\x79\x70\x1c\x46\xd7\x6b\x59\x55\xa5\xfd\x98\xf0\xab\x21\xea\x42\x46\x3c\x92\x3d\x71\x59\x88\x70\x38\x28\x61\x26\x8b\x3e\x25\xb0\x1e\x1d\x7d\x0a\xfb\xc2\xac\xf6\xd2\x29\xb1\xc2\xd1\xa8\xe5\xfd\x97\xf2\xfe\x0b\x26\x77\xed\x5e\x05\xaf\x85\x76\x35\xd7\x59\xb9\xb4\x82\xd7\x78\x78\x7b\x55\x94\x2e\x78\x55\xe2\x83\xc0\xc0\x49\xd8\x1e\xe4\x1f\x06\x49\x6e\xfe\x1d\xa6\xaf\x8c\x90\x95\x58\x4a\x53\xa9\xe2\xfe\x8b\x5d\x94\xfb\xff\x51\x95\x32\x98\x87\x58\x82\x38\xfa\x07\xb8\xa1\x84\x45\x9c\xc1\x06\xad\x32\xbb\x25\x56\x14\xbe\xe4\xea\xb6\x94\x25\xad\xe7\x46\xc1\x96\xb5\x1e\x83\xfb\xae\xee\xbf\x84\xd3\x09\xb6\xf0\x97\x5a\x01\xa9\xcc\xfd\xbf\x2e\x65\xf7\xa3\xec\x14\xec\xa7\x20\x83\x64\xcf\x85\x41\xc1\x30\xbc\xba\xf7\x5f\xa0\x23\xa1\x95\xb7\xa6\x94\xf1\x33\xf8\xe5\xf6\x05\xff\xcf\x7f\xaf\x6f\x91\x81\xbc\xba\xff\x72\xcd\xb2\x93\xcb\x86\xb8\x25\xa2\x92\x79\x0e\x1a\xa4\x2e\x3c\x91\x82\x58\xbe\x40\xbe\x18\x90\x14\x09\x72\xd2\x88\x59\x6d\xb4\x3d\x49\xd9\x2f\x35\x7c\xff\x11\xa1\xce\x58\x57\xdd\x7f\xb1\xaf\x82\xaf\x38\x75\x05\xb9\xb5\x86\xc2\xda\x7d\xa4\xbc\xb2\xbc\xff\x52\xaa\xdb\x78\xc9\x3b\x24\xc4\xaa\xe2\x1c\x5e\x6c\x17\xa0\x2e\x84\xdb\xab\xc4\x9e\xac\x52\xb2\x1e\xf2\x5f\xad\xe1\x63\xfc\x4f\x74\x4b\xed\xc7\x61\x17\xad\x7d\xa7\x2a\x01\xd4\xe4\xfc\x8f\x3c\x13\x95\xae\xb2\x5c\x55\xf7\x5f\xf0\xeb\x92\xa5\x56\xad\x37\xba\xac\x32\x3b\x93\x4e\xc1\x69\xbe\x25\x16\xa0\xa8\x6f\x5b\x73\xfc\xb0\x54\x76\xdb\x96\xd2\x88\x95\x5a\xdc\x28\x59\x1a\x8e\x41\x86\xa2\xa5\x6b\x21\xed\x59\x90\xb8\x46\x85\xae\x6f\x65\x56\xf3\x57\xf8\x1b\x76\x76\x7c\x64\x3a\x16\xa4\x73\x46\x32\xd0\x46\x1c\xd7\xe0\xbb\x66\xd9\x94\x35\xfb\xf7\xa9\xae\x8d\x80\xbd\x2d\x6f\x25\x0c\x3c\xda\x76\x77\x49\xe0\xbd\xc0\x5a\x85\x94\x2d\x68\x23\x37\xfb\xba\xf0\x97\x6a\xc1\xd4\xa4\x70\x8b\xc9\x0a\xa8\x33\x60\x08\xa5\x5c\xca\x5b\x44\x0c\xe5\x76\xfb\xec\xdb\x2a\x3b\x7a\xb1\x7c\x81\x67\xad\x0c\x0f\x9b\xa9\xd5\x2d\xc4\x47\x1a\xf7\xc4\xdf\xfe\xca\x8d\x3f\x8e\xfe\xf6\x57\x71\x01\xfb\x5e\xca\x50\x0a\xa0\x49\xe5\x13\xc4\xe0\x2d\x3d\xe7\xf8\x6f\x7f\x15\xe9\xe7\xfb\x2f\x0b\x40\xd5\xd0\x83\x48\xe8\xcb\x27\x4a\x94\x24\xca\xca\x05\x3f\xf4\xb5\x1d\x9c\xfd\xcd\x53\x1f\xc1\x5f\xfc\xf6\x6f\x7f\x85\xbd\x79\x49\xeb\x8b\x62\x61\xe0\x4b\x78\x4a\x78\xa9\x61\x65\x13\x6b\x14\x94\xba\xbe\xb5\x8a\x45\xd7\xc0\x6c\x0b\xe2\x2b\x59\x47\xed\x24\x54\xd5\xb5\xc8\x5f\x8c\x37\xb2\x60\x7c\x83\x8f\xfb\x83\x04\xb5\x2d\x26\xab\x28\x50\x02\xec\xf3\x0d\xa8\x72\xe0\x81\xb7\xb2\x53\x2a\x7b\x39\x66\xb9\x44\x2d\xe5\xff\xb6\xb4\x7f\x5e\x6f\xd0\x83\x1e\xe2\x5e\xab\x85\xeb\xec\x86\xb2\xeb\xf6\xdd\xdb\x4e\xf7\x7f\xb5\xc3\x8f\xb8\x1c\x48\x73\x06\x02\xb9\xac\xb1\x67\x53\xfb\xb0\x59\xd1\xb5\x3a\x51\x2c\xad\xe8\xe3\x45\xe4\x56\x72\xa5\xcb\xb5\x8c\x65\x70\x6b\x57\x52\x97\x15\x14\xdc\x9a\x46\x27\x45\x31\x8c\xde\xba\x91\xb5\xb5\x4a\x8c\x51\x6e\x7c\x32\x92\x52\x6e\x9e\x72\x6d\xef\xc1\xe5\x8b\x1a\x3a\xfe\xad\xf0\x20\xc4\xdf\xd8\x39\x7a\x58\xc2\x55\x99\x29\x83\x3d\x12\xef\xbf\x80\xce\x57\xa5\x34\xa4\x2f\xd1\x70\x5b\xc8\xfa\xb3\xb0\x1f\xd3\x45\x81\x8d\x3d\xb3\x15\xf0\xce\xf2\xf4\x4a\x3a\xd0\xb7\xf8\xa1\xc6\x92\xf5\x68\x8f\x69\x78\x7e\xad\x00\x45\x6a\x1f\x52\x38\x33\x66\x59\x83\x29\x12\xbc\x8c\xe3\x80\xa7\xc1\x2e\xc1\x36\xcb\x40\x3f\xc0\x6a\x05\xb3\x5e\x42\xf3\x51\x24\x8c\x0f\x67\x6c\xd7\xa9\xad\xed\xad\x9c\xf2\x0d\x93\xe0\x0e\x06\x6a\x8b\x83\x29\xa4\x3c\x02\xe7\x98\x14\x88\x34\xe2\x0d\x4b\x33\x29\x8d\x61\xb0\x4f\xc1\x84\x9b\x5b\x66\x2d\x80\xf5\x86\x2e\x52\xbb\xce\x55\xe3\x12\x24\xdd\x31\x55\xf1\xce\x8b\xfb\x2f\xf6\xa0\xfb\xdb\x2a\x0f\x17\x03\x5e\x28\x0b\x6b\xd8\xe0\xc6\xd8\x5d\x45\x14\xa0\x84\xcb\x16\xed\x6c\x2b\x0d\x56\x00\x16\x37\xd9\xa2\x79\xb1\xf0\x93\x0d\xf9\x26\x19\x87\x6f\x71\xc3\x61\xab\xd0\x98\xa0\x67\x87\x4a\x69\x28\x8d\x1d\xa0\xb5\xee\x2b\xbb\x38\xba\xe6\x4f\x19\x3b\x26\x63\xf7\xfa\xfe\x4b\x95\x81\x1d\xc7\x87\xd2\x1b\x29\x70\x34\xb2\xf2\x97\x1a\x6f\x0a\x82\x15\x4a\xfc\xc3\x75\xe6\xb0\xb6\x35\x9b\x0f\x59\x65\x2f\xa5\x0a\xac\x54\xe0\x39\xce\xd0\x9d\x72\xeb\x55\x80\xd4\x41\xec\x7d\x93\x19\xda\x0b\x9e\x22\x3e\xca\xca\x7f\xa9\xd6\xf6\x9f\x0d\xaf\x65\xf1\xc0\x6c\x0a\x2b\xe2\x0a\xdb\x5a\x78\x58\xa1\xb1\x0f\x78\x4c\xce\xec\xc2\x16\xf7\x5f\x9c\x1a\xfc\x0e\xfe\xeb\x24\x64\x83\xef\xb8\x43\xe1\x98\x83\x6b\x44\x1d\xb3\x54\xb1\xa8\x64\x42\x16\x44\x64\xdd\xa3\xb5\x2c\xd9\x92\x88\xdc\x81\xd8\x7d\x00\xeb\x0e\xf0\xa3\xe0\xda\x36\xed\x67\x61\x64\x99\xb9\xc7\xc5\xd6\x5b\x24\xb1\x1c\x2d\x3d\x6f\x6f\x1e\x1c\xd8\xcc\x5f\xe1\x2f\xfc\x2d\xbf\x80\xbb\xca\x07\xe9\xb8\xe7\x81\xba\xff\xd7\x92\x8c\x69\x52\x32\x60\xa7\xbf\x80\x5e\x7d\x86\x0e\x63\x87\x9c\xa0\xf2\xe1\xc9\x85\x76\xdf\x02\x04\x16\x3a\x0c\x99\x86\x66\x0e\xd2\x49\x60\x90\xea\x5b\x59\x00\x8d\x7e\xa0\x3d\x38\x3c\xfb\x9e\x45\x10\xf6\x27\xab\x57\x2c\x0f\x84\x31\x56\x65\xcb\xa6\x71\x9a\x29\x5e\x57\xbb\xd0\xb4\x00\x2c\xd7\x09\x2c\x70\xa9\x0c\x4c\x4b\x56\x62\x63\xe5\x25\x47\x9b\xe9\x45\xb6\xf8\xa5\xb6\x67\x17\x38\x8c\xed\x48\x5b\xae\x45\x62\xbf\x63\x0f\x0b\x3e\xdc\x98\xda\x3a\x34\x4d\xab\x77\x53\x2b\x63\xa4\x95\xab\x8d\x2e\x96\xa5\x24\x81\x9d\x4b\xa3\x55\xb0\x03\x68\xab\xd0\x87\xad\xbc\x82\x6f\x04\xe2\x58\xe7\xf6\xfc\xda\xcb\x6f\xa1\x8b\x5f\x6a\xdc\xfb\x29\x5e\xc9\xb2\x75\x83\x82\xd8\xfa\x0f\x8b\x75\x56\xc0\xf6\x26\xa2\x54\xb2\x10\xc5\x0b\xb9\xde\xdc\xff\x8f\xc5\x8d\x6c\xd8\xbc\x2f\xec\x95\xa1\x60\x14\xd6\x82\x5b\x00\x18\xb9\xad\x06\xf0\xf8\xea\xb2\xe2\xe0\xea\x04\x51\x5b\x88\x20\xbe\xff\xd2\xba\x2e\xa4\x71\x7d\x71\x10\xbf\x4a\xd6\xb2\x55\x8e\x3f\xd7\x4b\xa8\x8d\xa1\x49\x16\x15\x2e\xbd\xb3\x29\x02\x9d\xc5\x86\x4a\xd3\x59\xeb\xd1\x0b\x83\x25\xb0\x9a\x22\xab\x41\x84\x51\xfd\x54\xb2\xa8\x9b\x63\x58\xea\x35\xe2\xa6\x4d\x3d\x57\x86\x4d\x11\x3f\x6c\xf4\x8f\xd1\x92\x56\xd0\x39\x1d\x8e\xae\x5d\x58\x90\x6f\xc0\xe8\xa1\xa4\x5b\xbd\x04\x97\x40\x6e\x17\x38\xbb\x95\x8b\x60\x7c\x60\x34\xfb\x69\xd8\x33\xb6\x15\x46\x17\xde\xf4\x32\xdc\x9b\x6b\x72\xff\xc5\xa8\x5c\x65\xee\xd6\xed\x70\xd7\xd0\x68\xa3\x34\xc8\x2f\x35\x46\xe1\x4b\xfc\xa2\xbd\xcc\x97\xf7\xff\xca\x01\xa0\x07\xdf\x89\xea\x94\x94\x34\xac\xb7\xfd\xe5\x42\x03\x7e\x14\x6d\x93\x50\xfd\x04\x8f\x30\x95\xda\xd4\x39\x0f\x7b\x66\x95\xe1\x4a\x2b\x93\x08\x03\x17\xe7\xf2\xfe\xcb\x2a\xab\x2b\x0a\x6a\x94\xa5\xba\xe6\x30\x81\xbd\xf7\xee\xbf\xe4\x99\xb2\xcb\xff\xfa\x95\xf8\x59\xd7\xa5\xa1\x70\xc6\xa6\xb4\x6a\x02\x34\x4b\x51\x64\xca\x18\x50\x08\xb4\xd3\xce\xdb\x97\x05\x3f\x3e\x41\xb7\xfe\x85\xca\x85\x79\x91\x5d\x2b\xb0\x1c\x37\xa5\x5c\xdb\x03\xe1\x3e\x13\xee\x42\x64\xeb\x2e\x25\x3b\x6b\x30\x89\x0b\xbb\xb3\x20\x94\x3c\x7a\x53\xcf\xcd\xfd\x17\x40\x90\xb3\x7e\x81\x6d\x80\x75\x91\x9f\x31\x7e\x17\x29\x3f\x78\x43\x71\xff\x05\x88\x0d\xad\x2d\x00\x66\x1b\xec\x84\x1f\x05\x08\xca\xce\x61\x1c\xbd\xea\x09\x8e\x79\x46\x6e\x1b\x89\xf8\x89\x2c\x2a\x34\x5e\x5c\x02\xc4\xaa\x8f\xec\x1a\x6c\x07\x17\x7b\x4c\x84\xb1\x56\xe3\x16\xdc\x2d\x94\xd3\x76\xec\x0b\xd7\xce\x4a\x82\xba\x2e\x20\xdd\x5f\xc3\x9d\xbd\x54\xab\x15\x34\x85\xb5\x82\xef\x3a\x27\x94\xf7\x5f\x6e\x21\x50\x86\x57\xb2\xbf\xcd\x5b\xd7\x92\x38\xb9\xc9\xec\xa4\x19\x83\x51\xca\x85\xbc\x2d\x33\xbb\xf9\x45\xbd\xbe\xff\x52\x6a\x42\x18\xf4\xac\xa1\x15\x5e\xdc\x76\xfd\x96\xf7\x5f\x7e\xa6\xd8\x9b\x32\xd1\xf5\x07\x5a\x8d\x1f\x6a\x36\xf7\x5f\x16\x6a\x85\x40\x85\xc5\x0b\xf0\x31\x64\x9d\x53\xef\x52\x18\x0f\x7f\xd4\x0a\xae\xd5\x92\x19\x1c\x08\xee\xb8\x85\xbe\xc8\x6e\x0d\x12\x38\x04\x8b\x1b\xad\x8c\x2a\x49\x36\xed\x07\x64\x19\x6f\x69\x0d\x01\x59\x7e\x61\xb6\xa8\x30\x72\xe3\xd6\x9c\xff\x52\xe7\x95\xbd\x5f\x64\x0d\x6e\x5e\x0d\xce\xcc\x22\x33\xb1\xda\x81\x37\xf3\x3b\xe1\xd9\x14\x08\xe2\xa7\x04\xaf\xb6\x7e\x77\x24\xd7\xae\x73\xd8\xa9\xb2\x1f\x0f\xe3\xc5\x6b\x69\x00\x11\x70\xff\x7f\x37\xee\x0b\xfb\x80\xba\x10\x6b\x55\x28\x53\xe1\x3d\x51\x17\x42\x03\x8e\xcb\xac\x1d\x44\x81\xfd\x5c\x96\x9f\xb5\x2e\xb3\x3c\x88\x45\x30\x8b\xf3\xa2\xbc\xff\x62\xc5\x51\x16\x76\xc4\x55\x4d\x3b\x97\x6b\x85\xaa\xbd\x6f\x8c\x5c\xcf\x21\xea\x5d\x10\x52\x4d\x46\xb2\xdb\x38\xb3\xe5\xfd\x97\x6b\xd5\x88\xb1\x05\x45\x25\x99\x8f\xb8\x4b\x50\xc1\x76\x41\x97\x92\xdb\x18\x51\x48\xcd\x6e\x3d\xd8\x04\x85\x15\xa9\x20\x4a\x6f\x64\x09\x2a\x4d\xd6\xb9\x01\x07\xf6\xfe\x0b\x74\x8b\xe9\xed\x54\xbf\xb0\x3f\x78\xab\xf8\xa4\x02\x39\xcf\x81\xb7\x12\x19\x56\xa6\x17\xaa\xc9\x50\x90\xdd\x49\x0a\x1d\x97\xe8\xb9\xe8\xe1\x8a\x02\x5a\x61\x71\xd0\x9e\x9e\x27\x42\xf7\x22\xab\x9f\xae\x1f\x24\x29\x35\x6b\x9f\x7f\x59\xdc\xdc\x7f\x01\xe3\xcd\x69\x0d\x54\x1a\x49\x38\xa6\x52\x56\xca\x3a\x8b\x6d\x13\xef\x89\xa6\x9d\x8c\x0e\xdc\xef\x9d\x8b\x7a\xfe\xf9\xed\x7f\x7a\xdf\x8c\x86\x17\xc3\xdf\x95\xff\xe9\xd5\xb7\xaf\x8e\x5a\xfc\x4f\x7f\x78\xf5\x9c\xff\xfd\x2d\x7e\x46\x63\xc4\x6e\x89\x8b\xcb\x77\xc3\xc1\x09\x83\x9b\x5c\x96\xf7\x55\x22\xfe\x64\x75\xe3\xf1\xab\xa3\x63\xf1\x5e\xe5\x56\x69\x0f\xfb\xe7\x83\x49\x7f\xb8\x37\xcc\xc4\x3b\x95\xe7\x99\x32\x7b\xaf\xbf\xfb\xee\x8f\xaf\xc4\xbb\xac\xce\x75\xb1\x77\x56\x82\x76\xd9\xf5\xe8\xd9\x57\xb4\x55\xb5\xf7\x44\x94\x15\x40\x38\x89\xef\x6c\x0b\x77\xc2\x2b\x2a\xcf\x5d\x63\x8b\x83\xa5\xf6\x9f\xf1\x54\xe1\x77\xcc\xe2\x10\xd6\x8b\xfc\x87\x57\x7a\xbd\x6f\xfa\x65\xa5\x4c\xa5\x16\x2f\x8f\x7a\xaf\x5e\x5e\xc8\x32\xff\xd5\x95\xc1\x23\xf8\x8f\xd7\xdf\x1f\x37\xf9\x7f\x5e\xff\xe1\xe8\xfb\xe7\xf3\xff\x5b\xfc\xcc\x00\x75\x45\x22\xc0\x18\xa7\xfd\xbd\x8b\x52\x66\xeb\x79\x2e\x81\x94\x13\x5a\x0e\x56\x9d\xa4\x8d\x95\x46\x12\x03\xaa\x54\x74\xc7\x19\xcb\xee\xa8\xed\x99\xb8\xc8\x16\x9f\xb2\x6b\xc9\xc0\x67\x08\xd9\x2c\x13\x44\xc7\x3a\x06\x06\x5f\x35\xf6\x01\xfb\xfb\xad\x33\x05\x95\x7a\x06\xba\x5a\x09\xb0\x50\xb9\xdd\x67\xc6\x23\x26\xba\x18\xa1\x6f\x89\x51\x83\x3a\xa1\xac\xdd\x88\xad\x99\x0a\xaf\x4f\xec\x78\x72\x29\xae\x95\xeb\x65\x65\x7d\x2a\xd3\xf8\x58\x5c\xd7\x5a\x53\x4f\xd9\x46\x19\x28\xcf\x08\xa0\x72\x6b\x5d\xca\x97\xba\x7c\x99\x4b\x63\xc4\xa2\x36\x95\x5e\x63\xf3\x7a\x73\x83\xb9\xe3\xbc\x6e\x54\xcb\x02\x16\xd9\xd5\xb1\x36\xb0\xc0\xbd\xbd\x53\xe9\xd0\x25\x6f\xf6\xf6\xe9\x5d\xfb\x02\xea\x96\x5d\xc9\xe7\x42\xe7\x39\xb5\x85\xd4\x2b\xa8\xa4\x6c\x91\x56\x74\x2d\x6b\xd2\x60\xb2\xf1\x55\xaa\x5d\x0f\x44\xf0\x62\xd0\x6b\x53\x7e\x86\x62\xc9\xa8\xbc\x6e\x6f\x7f\x5a\x65\xc5\x32\x2b\x97\xec\x28\x87\x63\x85\x5d\xf6\x32\xa0\xa0\x6f\xfe\x4d\x66\xa8\x06\x4f\x16\xae\x0a\x0f\xe0\x7d\xf6\x2f\xd1\x6f\x61\x8d\xc1\x97\x82\xcd\x77\x54\xd5\x77\xca\xdc\x78\x1e\xa2\x96\xf4\x64\xc6\x35\xe8\x5b\x8a\xb9\xcc\xf5\x5d\x6f\x6f\xbf\xf9\xa9\x7d\x68\xe3\x79\xa3\xa1\x13\x9d\xc2\xae\x26\x8e\x8f\x23\xa8\xf2\x2b\xfd\x3f\x8c\x23\x93\x22\x79\xe9\xed\x01\x67\x93\xfd\x3a\xb4\xde\xc5\x7e\x0d\x2f\xa0\x18\x55\x15\x80\x6e\xcc\xe6\xba\xae\xf8\x7a\xeb\xe8\x6c\xae\x0c\x2f\x4f\x6f\x6f\x7f\xe2\xc5\x82\xbf\xb1\x92\x92\x46\x9a\x55\x30\x54\x6e\x8d\xf2\x73\x6d\x2a\x68\xdf\x4e\x7d\x1f\x33\xa3\x60\x45\xa0\x96\x58\x2c\xb4\xa9\x12\xb1\xac\x7d\xe3\xd3\xc5\x4d\x56\x42\xcd\x3d\x70\x6b\xeb\x15\x77\x65\x55\xc5\xad\xce\x6f\x25\x75\xdf\x37\x5a\xe8\xa2\x27\x0e\xae\xa0\xcb\x1e\xd1\x12\xcc\x65\xd4\x99\x9e\xdf\xec\xdb\x34\xb6\x05\x6d\x5e\x57\xd8\x04\xd3\x49\xec\x7a\x83\x53\x5e\xe8\xf5\xba\x2e\x54\x05\x1d\x95\x73\x3b\x26\x2c\x5e\x58\x67\xe5\x27\x59\xa1\x38\x02\x0d\xd0\x5c\x66\xb8\xd8\x2b\x29\x7b\x87\x7b\xfb\x67\xa5\x94\xf9\x56\xf4\x19\xf5\xee\xeb\xfa\xb3\x4a\x14\x9a\x99\x23\x71\x9e\x4b\xb7\x55\x0a\x7a\xc3\x56\x46\xe6\xab\x44\x54\x37\xd4\x36\x56\x96\x4e\x25\xad\xa4\x34\x6e\x15\xac\x00\x40\x39\x83\xeb\x92\x5b\xc9\x35\x74\xfb\x81\x92\x89\xe0\x8d\x01\x3d\x10\xc9\x21\xbc\x09\x69\xcd\xe3\xae\x35\x9e\x62\xcc\x64\xeb\x48\x57\x42\x2f\x6d\xd7\x12\x85\x5b\xc3\xfb\xba\x60\x50\x16\x76\x5f\xa0\x0d\x4f\x76\x97\x6d\xbb\xf9\x74\x65\x44\x66\xef\xb1\xce\xd1\xc9\x74\x5a\x9c\xcf\x23\x57\xbe\x06\x7d\xd7\x93\x06\xbd\x3e\x34\x98\x22\x29\x92\x48\x77\xc1\x4d\x96\x5a\xbd\x59\x99\x1d\xaa\xc9\xfb\xef\xa8\x4f\x0c\x63\xe8\x78\x7a\xc8\xea\x30\xaf\xaf\xc5\x4a\x7d\x96\x10\xd1\x2d\x2b\xc7\x7c\x61\x7f\xe5\xab\x9c\x1a\x45\x13\x0d\x66\x22\xc9\x0d\x0c\x4e\x35\xf0\x29\xeb\xd2\xff\xa5\x29\x9d\x3d\xd1\xf7\xd7\x52\xa0\x69\x48\x5b\xd9\x45\x46\x2c\xb7\xa9\xa8\xfb\x0e\x62\xc1\x90\x77\xb9\x63\x61\x19\x0f\xc2\xd3\xf2\x60\x64\xa2\x7e\x80\x3e\x2d\x11\x3f\x7e\x78\x89\x14\xd0\xa5\xbb\x6b\xe5\x55\x61\x64\x59\x45\x44\x56\xcc\x19\x50\x10\x9f\x03\xf4\xd6\x5a\x52\x4b\xa8\x2a\xab\x98\x77\x02\xea\x5f\x6e\x24\xf6\x84\xe7\x4f\xc1\x83\xed\x47\xf1\xb0\x77\x6c\xb5\xf6\xbd\xa4\xc6\xa3\xd4\x75\x86\xe6\x62\x24\x86\x86\x64\x87\x48\xcf\xf7\xff\xb1\xf7\x6e\xc9\x6d\x24\x69\xba\xe0\x3b\x57\xe1\x07\x6d\x33\x49\xcc\x04\x21\x92\xba\x95\x52\x65\x65\x0d\x91\xa0\x84\x2a\x8a\x60\x03\x64\xaa\x74\xda\xda\x4e\x3b\x10\x0e\x22\x4a\x81\x70\x9c\xf0\x08\x32\x51\x4f\xb3\x88\xd9\xc4\x59\xc3\x3c\x8c\xd9\x59\xca\x6c\x60\xb6\x70\xcc\xff\x8b\x5f\x22\x02\xa4\x32\x53\x52\x56\x65\x92\x66\xdd\x95\x22\x81\x08\xbf\xfb\x7f\xf9\xfe\xef\xc3\x9e\xc5\x33\x43\x47\x68\x6b\x3e\x82\x51\xa1\x72\x9c\xb5\x68\xee\x69\x32\x0c\x24\x40\xf7\x37\x1a\x58\xfe\x85\x91\x59\xda\xa6\xe2\xb8\x36\xaa\x50\xa8\xb4\x5f\x08\x7b\x3a\xdd\xca\x1c\xca\x9b\x54\x9a\xd5\x6b\xb8\x4f\x98\x7d\xa2\x5d\x72\x43\xc5\x09\x7f\xb3\xdf\x2e\x17\x2b\xbb\xb9\xa0\xdc\x90\xdf\x5e\xd7\x85\xaa\x06\x75\x3d\x28\x54\xc5\xc8\x73\x19\x32\x33\xb4\xee\x1c\x54\x23\xcd\xeb\xf4\xbe\x31\xe9\xde\x91\xca\xdf\x00\x38\xba\xf3\xbe\x23\x04\x70\xeb\x93\x17\x0c\x8a\xba\x67\xf6\x7e\xe1\x65\xe5\xcb\x4d\x81\xd8\xca\xd7\x7b\xf2\xf3\x16\x7d\x51\x2a\x52\xed\xda\x22\x53\x20\x37\x44\xfd\xa8\x16\x75\x85\x79\x5b\xa3\x03\xf2\x31\xa2\x7a\x71\x25\x11\x70\xf7\x76\x7d\x2d\x21\x53\x0f\xce\x6c\xae\x2b\xf3\x85\x85\xc1\x3a\x13\x52\x18\xb5\x91\xa0\xd6\xba\x96\x45\x0d\x7c\x4b\x37\xc8\x2c\x00\x8b\x79\x47\xcb\xc8\x44\xc9\x95\x2c\xf3\xad\x33\x41\x0d\x2c\xf3\xac\x22\x29\xe0\x90\xd6\xae\x6b\x7b\x0a\x21\xd2\x3e\xae\x3c\x22\x7d\x8f\x34\x4c\x4a\xd0\x1b\xc7\xe7\x3a\x33\xa3\x75\x70\x10\x18\x83\xf7\x79\xc3\x30\x74\xe2\xb2\x1d\x9b\x5c\x63\x15\x21\xe0\x42\x74\x19\x76\x0e\x09\x17\x7f\xd1\x56\x0c\xd9\x1a\x77\xae\xb1\x70\xa6\x91\x64\x87\x24\x97\x32\x98\xc4\x4a\xdf\x20\x95\x14\xf4\x3e\x2b\x4c\x55\xd6\xc4\xfa\xb3\x4f\xab\x37\x9c\x33\xdb\x07\xb7\xe7\xfa\xc2\xd5\x6b\x54\xa8\x63\x75\xdf\x34\xcc\xfb\x8c\x04\x29\xb6\x2d\xe1\x11\x3f\xf8\x2d\xc2\x18\x2e\x39\x8e\xb6\x0c\x7e\xbe\xbd\xe3\x82\xa5\x0f\x57\xe7\xce\x45\x1f\xfd\x01\x96\x3e\xae\xd9\xe6\x72\xa3\x96\xda\xa5\xa6\x00\x63\x97\x15\xe1\x80\x80\x40\x61\x38\x24\xf7\x8e\xe8\x4f\x19\xae\x2f\xb3\x6a\x9f\xfb\x55\x8b\x06\x12\x70\x6d\x75\x59\x9b\x01\xd1\x57\xf0\xaa\xc6\x92\x6e\x3f\xad\xd8\xc2\x97\xf1\xb6\x01\xb9\x67\x24\x0c\x81\xcc\xf4\xee\xaf\xc3\x19\xc3\x0d\xe2\xb7\xc7\x9b\x07\x4c\xb7\x81\x78\xc7\x15\xca\xdb\xae\xdd\xd7\xb8\x52\x6f\x6e\x4a\x75\x63\xcf\x19\x24\x33\x81\xa1\xdb\x27\xad\xcb\x6d\xc0\xd5\xd5\xf7\x9b\x56\x1a\xc7\xfe\x26\xd1\x2e\xdd\xf5\x15\x57\x07\x1f\x43\xe7\xba\x76\x30\x50\x57\x91\x30\x45\xa3\x99\xac\xe7\x96\xd6\x58\x70\x86\xca\x81\x77\x85\x1f\x1b\xb5\x9e\xab\x34\xfa\xd2\x77\x26\x28\x77\x2b\xf9\x1a\x00\x69\x7b\x77\x9e\xd0\xa3\x8c\xd8\x9f\x6f\x45\x8e\x5e\x48\xff\x35\xb1\xb0\x73\x89\x1a\x10\xe0\x95\xb5\x4a\xc9\xf6\x56\xa5\x37\x1d\x79\xf0\x3a\xac\x41\xb6\xe4\x73\x55\xed\xbe\xcc\xc2\x16\x02\xf3\x3b\x76\x24\x55\xa9\x2f\x28\x54\x02\xb9\x42\x3b\x8e\x22\x04\xe3\x65\xd8\xb4\xac\xd8\xd4\xe0\x65\x60\xdd\x59\x5a\x2f\xf0\xf7\xba\xae\xec\x1f\xdc\x91\xbf\xf3\xe8\xe5\x39\x88\xca\x14\x97\x76\x14\xbc\x51\x1e\x38\x7b\xf1\xb7\xd1\x8d\xb1\x0e\xa4\xbd\xf5\xb5\xf3\x16\x51\x9f\x1a\x7d\x63\xb5\xc6\xf3\x82\x9c\x09\xa3\xf3\x34\x58\x2c\xf9\x36\xfa\xab\x5b\x97\x69\x10\x9c\x74\x7b\x62\xbc\x44\xfb\x83\x87\x06\x28\xd5\xc2\x91\x01\x51\xad\x7b\x1e\x21\x6e\x33\x49\xce\xc0\x81\xed\xa9\x4a\x45\xaf\x2e\xd2\x7a\xbd\xe9\xd9\x87\xf5\xea\xc2\xae\x13\xeb\x37\x55\x2b\x9d\x92\xc0\xb7\x1d\x54\xa4\xe8\x22\x26\x87\x60\x2d\x65\x6b\x18\x05\xa8\x7c\x6e\x1e\x07\x68\x2a\x15\xf8\x19\xe6\xb0\x23\x2e\xc9\xf6\x0a\xbb\xef\x30\x01\xfa\x52\x7c\x40\x56\x35\x27\x27\xf0\x4d\xa0\xc1\x97\xb2\x94\x37\xa5\xdc\xac\x8c\x78\x0a\x43\xfb\x6c\xc7\xe5\x69\xa7\xbd\x54\x20\x60\x5e\x54\xae\xb5\xcd\xce\x61\xeb\x1e\xf2\x94\x18\xfc\x74\x22\x4c\x3d\x2f\xb5\x75\x64\xe9\xc4\x87\x7b\xac\x94\x74\x44\x6c\x32\x3b\xe6\xe1\x67\xec\xd5\x0f\x43\x92\xcb\xe2\xa6\xb6\x17\x45\xdf\x2f\xf0\x39\x78\x06\xb4\x05\x8a\x4f\xe0\x85\x54\xba\x6d\x3b\x94\x64\x60\xaa\x35\x10\x9e\x45\x2f\xb0\x5f\xbe\x95\x65\x86\xb7\x19\x0b\x51\xd1\xcb\x44\xaa\x96\x59\xc8\x0a\xc5\x4f\xf5\x94\x83\xb1\x77\x13\xf1\x5f\x46\xbb\x40\x92\x62\x6c\x60\x69\x03\xc9\x9f\xdd\x86\xb0\x51\xfd\xcc\x88\x17\xd1\x94\x28\x13\xb7\x98\x2d\x4b\xf0\x49\xe2\xe6\x7a\x6f\x08\xa7\xf2\x0e\xd4\x31\x11\x31\x81\xd1\x86\xa5\xcc\x72\x5a\x17\x37\xa5\xa2\xc2\x56\x65\x82\xd0\x0c\x3f\x8c\xd1\x50\x43\x7f\x9c\x75\x3a\xc0\xc0\xc9\xed\xb9\x1b\xc3\x75\x9a\x19\x21\x73\x60\xdf\xba\x4f\x7d\x2e\xd4\xbe\x73\xb3\x66\xdc\xa1\xf7\x9a\xd9\x0c\x12\xf4\xc7\x0a\x0d\x01\xcb\x4a\xc8\xaa\x52\xeb\x4d\xe5\x38\x27\x3c\x4f\x41\xfb\xc0\x5f\x4a\x6b\x72\xdc\x66\x48\xc5\xc5\x8c\x8e\x28\xbc\x57\xf2\xac\xef\xe8\xc6\x40\xcc\x88\xb6\xab\x3d\xed\x9f\xb9\x43\x19\x0f\xc5\x32\x4d\x3b\x23\x6f\x01\xbf\xd6\xcf\xa3\x17\x36\xbb\xa4\x97\x76\x52\x0b\x3b\xa0\x0e\x70\xf7\x5c\x0e\x4f\xfe\x32\x7c\xbb\x5b\x22\x24\xd4\xce\x6d\xf3\x1c\xec\xd2\x51\xe3\x6f\x85\x54\x07\x0f\xeb\xa8\x8d\x7f\x9a\x72\xfe\x4a\x89\x51\x91\x7e\xc3\xa4\xd4\xe0\x49\x6a\xcf\x47\x28\xaf\xfe\x6f\x6f\x2f\xcf\x0f\x9e\x0e\x0e\x0f\xec\xb8\x1f\xbc\x3d\x39\x39\x40\x0e\xdb\xec\x17\x32\x83\x3d\xc8\xff\xf5\xfc\xb0\x91\xff\x79\xf9\x58\xff\xfb\x8d\x7e\xfe\xff\xff\xe7\xff\xa5\x00\xd3\xdb\xcb\x73\x71\xfb\x14\xe9\x72\xc0\x2f\x79\x7b\x72\x22\xa6\xd7\x17\x57\xe3\xf7\x5e\x36\x7f\xf4\xd7\x93\x11\xe8\xd2\xb9\x04\xf1\xd3\xc1\x51\x22\x9e\x1e\x89\xf7\xc0\x6a\x75\x7c\x78\xf8\x6a\x8f\xb5\x9b\x03\xda\xcb\xef\x05\x51\xc5\xdc\xdd\xdd\x0d\x6e\x8a\x7a\xa0\xcb\x9b\x27\x94\x83\x35\x4f\x6e\x16\x8b\x60\xa9\xad\xaa\x75\xbe\xd7\xe2\x10\x7c\xf5\x80\x9a\xb3\xf8\x23\xbd\x61\x69\x96\xf0\xf4\x3f\xed\x8d\x58\x91\x3e\x0b\x0f\xef\x9f\x28\x51\xc6\x6c\x4e\xec\x03\xe2\x4d\x08\x17\x17\x69\xe1\x67\xc6\x13\xe2\x82\x4c\x91\xfd\x1a\x0c\x5e\x5d\x40\x9c\x9d\x35\xad\x47\xdc\x45\xb1\xdf\x73\xff\xdd\xeb\xc3\x15\x53\x08\x99\x62\x40\xd8\x3a\x93\x1e\x0b\x8e\x46\x90\xa1\xbc\xcc\xcb\x50\x2a\xbb\x5b\x22\x3b\x71\x30\xa6\xa7\x62\xbf\xf7\xf6\xf2\xfc\xf6\x69\xaf\x8f\xc1\xeb\x40\xad\x03\x1c\xe2\x02\x23\x86\x28\xbc\xd1\x68\x6c\xaf\x8f\x57\xd6\x5c\xc9\xd2\x78\x9a\x52\xd2\xe3\xa0\xdc\x52\x53\xab\xce\xc5\x27\xc2\x40\xa4\x57\x68\xb5\xbf\xcd\x4c\x44\xde\x01\xed\x6b\xa9\x7a\xbb\xc1\x19\xec\x7d\xe0\xf0\xa5\xbd\xba\xec\xa0\xc2\xf4\x81\x91\xe5\xa5\xb0\x13\xf8\x0b\x78\xa2\x7a\x3d\xcf\x0a\x05\x31\x64\xb6\x16\x17\xaa\x04\x99\x52\xfb\x99\x95\x92\xb6\x9d\x64\x4a\x17\xa9\x28\xa9\xdb\x68\x64\xdb\xe1\x71\x3e\xb4\xb3\xe5\xe8\x2d\x78\x3c\xb3\x66\x15\xaf\x0f\x3f\xa9\x98\x0e\x45\x5e\x64\xfc\xae\x33\x38\x0a\x5d\x1c\xd8\xfd\x15\x50\x73\x6f\x4a\xbd\x29\x33\x55\xc9\x72\x1b\x38\xa0\x2c\xd1\xc1\x0c\x23\x10\x13\xb6\x8d\xf9\x8c\x86\x2f\xec\xb8\x06\x76\x5e\x30\x8a\x88\x91\x08\xd2\x8a\x48\xb8\xe5\xa6\x44\x16\xa2\x37\x2e\x52\xb5\x51\x05\x08\x63\xbf\xd7\x69\x9d\xab\x1e\x25\xeb\xc8\xa0\xa7\xf4\x0f\xa6\x32\x9b\x6b\x7b\xe9\x02\x5a\x10\x94\x58\x02\xa9\xb7\x38\x09\x86\xe1\xb2\xd4\x0b\x65\x4c\x82\x54\xda\x9f\x94\x61\xa3\x09\x98\x7e\xc9\xbe\xf1\xa6\x15\x2d\xb1\xc6\x7b\x70\xf7\x65\x4d\x2a\x54\xc7\x11\xd5\xf1\x15\xe8\x6a\xef\xed\xc9\x09\xe7\x8a\x3c\x2a\x34\xd8\x4c\xd8\x52\x55\x8a\x13\x97\x05\xbd\x5f\x91\xd8\x24\xd1\x42\x0e\x36\x9d\xb6\x3d\xf7\xb9\xc7\x48\xfc\xbf\xff\xf0\x06\x16\xfb\x6f\x2f\xcf\xfb\x7e\x19\xea\x0d\xaf\xa2\x9a\x88\xfa\x22\xfd\x59\x87\x06\x26\x0e\x62\x3f\x74\x67\xb3\x33\xea\xfb\xe5\xf9\x01\xf8\x28\x15\x58\x8e\x4e\x73\x59\x44\xb6\x16\x48\xf1\xc4\xbc\x27\x76\x8d\x4a\x8e\x02\x44\x30\x1c\xd6\x7b\x46\xe3\x9c\x88\x97\x71\xf3\x49\x1f\xc2\xb3\x3b\xce\x65\x6f\x7d\x8f\xf8\x48\xd5\x4b\xfb\x09\x6c\xe3\x95\x2c\x6f\x54\x45\x5c\xdd\x3e\x79\x1c\xfa\xf8\x48\x0d\x4c\xd3\x04\x01\x2a\x51\x2a\x24\x38\xbc\xcd\x4a\x48\x4b\x57\xf8\x94\x0d\x2e\x35\x0e\xec\x57\x6a\x51\x01\xbc\x37\x2b\x9a\x41\x57\xe0\xad\xa9\x33\xf7\x0b\x1f\x6c\xb0\x27\x32\xa2\x62\x55\x99\x88\x5c\x4b\x48\x69\x82\x8b\x56\x32\x6b\x9f\x5f\xf0\x9b\x95\x44\x91\x80\xca\xf6\x12\x62\x89\x7c\xf6\x25\x22\xe8\x9b\xa7\xe6\xe1\x44\x41\x2a\x2b\xc9\x3e\x0f\x5e\x97\x8e\xf9\x0c\xac\x67\xb0\xcb\x5d\xb7\x61\xa3\x10\x53\xb4\xf7\x6c\xa5\xe3\xa4\x87\xaf\x2c\x5d\xa0\x84\xe5\x86\x1e\xfe\x36\x96\x0d\xd8\x8b\xa0\x63\xcf\xf6\x44\x55\xca\xc2\xd8\xe6\x19\x0c\x5f\xab\xa2\xca\x4a\x95\x6f\xfd\x53\x30\x7d\x66\x0f\xba\xe8\x2d\xce\xe5\x15\xa9\x02\x50\x3b\x36\x6f\x55\xaf\x65\x71\xc0\x86\xbc\x7d\xa4\x53\x0d\xcc\x0a\xf1\x67\x79\x2b\xc5\x0f\x34\xa7\xef\x31\x06\x2c\xe6\xdb\x4a\xd1\x27\xc1\x43\x0e\x46\xd5\x9e\xcc\xb5\x49\xe8\x10\x92\xeb\x8d\x53\x77\x5d\x72\xc4\x18\x5a\x4d\x31\x1b\xd6\x94\xdd\x40\x31\x33\xae\x14\x23\x0a\xa5\xd2\x7b\xbd\x61\xd5\x7d\x9c\x99\x0c\x08\xf6\xbb\xff\x0c\x59\xfa\x39\xe9\x4d\x9b\x4a\x6b\x98\x50\x6b\x72\x56\x01\x3a\x4d\xf1\x3a\xa7\xf7\x04\xed\x84\xa9\x0c\x9a\x49\x07\x77\xd7\xab\x32\x23\x7a\xa3\x3c\xbb\xc9\xe6\xfe\xe8\x06\xb8\x4e\xc1\x84\x48\x6f\x4f\x4e\x02\x8a\xc6\x20\x2c\xda\x38\x21\xf8\x50\x80\x25\x15\x3f\x88\x8f\x42\x7f\x16\x01\xae\xce\x1d\xc0\x76\x43\x8b\xb3\x78\x1e\x50\xb3\x0b\x6e\xc0\xae\x73\x08\xf6\xf9\xa6\xca\xd6\xd9\xdf\x31\x86\x8c\xc7\xc6\xce\xa5\x6a\xe8\xd4\xb1\x73\xf5\xdf\x6b\x99\x67\xcb\x2d\x69\x0a\x71\xef\xbb\x86\x87\xb3\xea\x4e\xbe\x6b\xe8\xed\xad\xcb\xd8\x91\x74\x22\x3f\x31\x71\x16\x9f\x86\x0a\xd5\xb9\x40\xe1\x2c\xdc\xda\x50\xee\x9c\x22\x3f\x95\x3d\x08\x39\x4d\xd8\xbc\x2a\x61\xdc\xdb\xb7\xad\x49\x80\x1c\xd1\x8e\x37\x04\xaa\x82\xc3\x97\x3a\xec\xef\xbb\xdb\x4c\xe7\x8c\xba\x72\xc2\xe4\x60\x4b\x35\x03\x61\xd6\xd7\x0f\x1b\x79\x27\x4d\x10\xba\x9c\x6f\xef\x1d\x33\x65\x7c\x20\x1a\xe2\x7f\x40\xa5\xbf\xe5\x24\x79\x78\xde\x37\x04\xd5\x31\x2b\xb9\xd2\xd9\x02\xc4\x34\x0a\x26\xad\x6c\xdc\x01\x00\x87\x59\x32\x63\x6d\x73\x40\x18\x29\x70\xa1\xc5\x07\x25\x3f\xa9\x82\x3e\x6e\xd7\x87\xf5\x0f\x72\xb5\x24\x6d\x79\x62\x41\x44\xcc\x40\xdb\x32\xf3\x87\xee\x7a\x03\x64\xf6\x5b\x1a\x83\xdc\x6e\x2e\x53\xaf\xf1\x63\x64\xa9\x66\x65\x7a\x00\x44\x65\x01\xd9\xad\x11\x75\x21\x97\x4b\xb5\xa8\x62\xeb\xd7\x36\x81\x0d\xa3\x75\x88\x03\x69\xde\x71\xbf\xb6\x9f\xb7\xeb\x67\xf0\xe4\x9d\x34\x9f\x54\x9e\x4f\x15\x94\x0f\x7e\x0d\x20\xf8\x43\xfa\xbf\x47\xc7\x2f\x9b\xf8\xcf\xe7\x47\x8f\xf8\xef\x6f\xf2\x83\x46\x49\x13\x47\xe3\x12\x9e\x3d\x5c\x16\x6c\x5a\x5f\x12\x63\x8e\xdd\x88\xe7\x74\xb3\xef\xd1\x02\x12\xc7\x87\x47\x87\xbd\xa4\xa9\x9d\xe5\xa3\xf8\x9e\xcd\x96\x36\xc7\xf7\xa1\x97\xbf\xe8\xc3\x03\xc4\x2c\x5b\xeb\x42\xbc\x97\x65\xae\xef\x70\x6f\x93\x0a\x7c\x86\x74\x58\xb0\xb5\xa9\x55\x40\xe1\xc7\x89\x19\x8c\x86\x5a\xb3\x44\x70\x8b\x1c\xcc\xcc\xe1\xda\xee\x54\x27\x27\x62\x57\x40\x20\xab\x9a\x3a\xc5\xcd\xb3\x35\x23\x32\x64\x97\x94\xca\x0a\x60\xb6\xc4\x56\x54\xdb\x40\x3b\x0b\x9b\x4d\x32\x77\xf6\x7c\x43\xdf\xc0\x19\xef\x7c\x66\x51\xc7\x42\x7a\x5e\x44\xcb\x36\x5a\x97\x3e\xd4\xb6\x08\x37\xc2\xce\x49\x66\x5c\x4a\xdb\x5b\x6d\x12\x65\x7f\x98\x3b\x1c\xfb\xe5\x4e\x4c\x40\x6d\x11\x57\xa2\xc4\x54\x42\x56\x05\xbe\x53\x38\xf9\x6e\x49\xfc\xe3\x1e\x77\x8f\x3f\x8d\x9f\xc1\x93\xc9\xf9\xe9\xf0\xf2\xe0\x78\xf0\xf4\xab\x15\x01\x3d\x70\xfe\x3f\x7b\xfa\xec\x69\x93\xff\xf1\xf0\xe5\xa3\xfe\xef\x37\xf9\xb1\x27\xec\x64\xa3\x0a\xbb\x08\x1a\x81\x08\x17\xe2\x3d\x1e\x3c\x4d\xc4\xf1\x1f\xc4\x9f\xeb\x7c\x0b\xfc\xfb\x7b\x53\x15\x63\x50\x28\x1a\xc0\xa7\x98\xb3\x9b\x9a\x28\xd0\x48\x24\x6b\xbf\xe7\x22\x11\xfd\xfb\x63\x2d\x09\x64\x1e\xef\xcb\xbf\x75\x09\xae\xc2\x97\xd6\xaa\xfa\x9e\x2c\xff\xb8\xd1\xa6\xe9\x1c\x06\x2a\xac\x41\x60\x13\xaa\x1b\xd0\xb2\xb3\x9d\x21\x78\x2b\x5b\xa6\xcd\x47\x66\x45\x24\x85\x40\x8f\xa4\xfb\x21\xac\x90\x7d\xe8\x05\x09\x07\x9f\x0d\xf8\x2a\xbe\x53\x5e\xe2\xc1\x77\xd9\x83\x6b\x19\x63\x18\x0f\x34\x39\xd6\x84\xa0\x25\x36\xe6\x80\xdc\xdc\x19\xe5\x51\xc6\x90\xf0\xac\xcd\x2e\xa2\x3a\x2b\x6a\x28\x61\x28\xcd\x85\xcd\xb7\xad\x12\x11\x06\xcb\xb9\x9c\x61\x8f\xd7\x5a\x0f\x1f\xf4\x8b\xf2\x84\xb3\x66\x9e\xf0\x21\xe5\x51\xb7\xd0\x7d\xf2\x80\x81\x51\x97\x9f\xf1\x9a\x20\xb1\xc9\xc8\x0a\xdf\x9d\x42\x63\xe6\x33\xf8\x95\xdc\x6c\x94\xe4\x39\xc9\x4a\x02\x55\xfe\xd2\xc6\xbe\x18\x88\xd3\x5a\x89\x45\xa9\xd2\xac\x12\x66\x05\xae\xe1\x5c\x51\x44\x9f\xf5\xc0\xdc\x96\x2e\x35\x80\x0e\xf7\x83\xfc\x8b\xde\xa8\x22\x4f\xe5\x06\xd2\x24\x7d\xcf\xb9\xdd\xf9\x4e\x02\xb3\xdf\x3a\xec\x52\x2c\x75\x6a\x1d\x5b\xfb\xce\x6c\xad\x06\x62\x24\x17\x2b\xfc\x2c\x59\x1b\xc8\xcf\x73\x53\xbb\xb8\xa4\x8f\xbd\x16\xf5\x7a\xae\xca\xb6\xfa\x95\x1b\xed\x86\x47\x19\xbd\xdb\xbd\xc3\x09\xb2\x46\x9e\x70\x23\x44\xea\x3f\x1d\xf9\x66\x83\x3d\xc8\x16\x3b\xae\xf6\x30\x5d\xfc\xe6\x23\x4a\x8b\x5e\x8e\x2e\x70\x3c\x26\xd7\x17\xa7\xc8\x57\x4f\x82\x31\xc8\xba\x3e\x99\xce\xc4\x7f\xfe\x27\xe4\x96\xbf\xfb\x0e\xfe\x14\x24\x95\x47\xa7\x9f\x91\x56\x8e\x18\xf4\x41\x9c\xe6\x73\xd2\xca\xc3\x9f\x90\x56\x46\x25\x1c\x16\x41\x3d\x1d\x88\xf1\x85\xb8\x98\x00\x07\xfc\x15\x71\xdc\xef\xea\xab\x6d\xfe\xd5\x2c\xee\xae\xe7\xc2\x67\x72\xfb\xd3\xf1\x74\x74\x72\x95\x80\xa0\x0f\xff\x57\x07\xdd\xfd\xe8\xaf\xa3\xf7\x97\xe7\xc3\xe9\xc7\x7b\x98\xef\xf7\x1f\x18\x99\xcb\xe9\xe4\xe4\x7a\x8a\x92\x3b\x93\x33\x31\xbb\x7e\x33\xbb\x1a\x5f\x5d\x5f\x8d\xc4\xdb\xc9\xe4\x14\xd2\xf8\xb3\xd1\xf4\x87\xf1\xc9\x68\xf6\x1a\x39\xf4\x81\x37\x7f\x94\x88\xd3\xe1\xd5\x10\x5e\x7c\x39\x9d\x9c\x8d\xaf\x66\xaf\x41\x6e\xe8\x7a\x36\x86\xb1\x1b\x5f\x5c\x8d\xa6\xd3\x6b\x48\x6d\xf6\xc5\xbb\xc9\x87\xd1\x0f\xa3\xa9\x38\x19\x5e\xdb\x49\xb4\x83\x0c\x13\x0f\x8b\x62\x32\x05\x9d\x02\x3b\x06\x30\x07\x89\xf8\xf0\x6e\x04\x12\x00\xe3\x0b\x1c\xa9\xa1\x1d\x82\xd9\xd5\x74\x7c\x72\x15\x7e\x6c\x32\x15\x57\x93\xe9\x55\xd0\x47\x71\x31\x7a\x7b\x3e\x7e\x3b\xba\x38\x19\x45\x12\x47\x7d\x31\x9c\x8e\x41\xe5\x68\x8c\xaf\x05\xd9\x85\xeb\x2b\xe6\xe9\x27\x85\x83\x68\xf9\x7e\x16\xa9\x3f\x0c\xd9\xc9\x3b\x1a\xee\xc1\x9e\xdb\xef\x99\x89\x28\xdf\xef\x3b\x82\xbc\xcf\x76\xf4\xea\xd5\xab\x03\xd0\xe3\xd9\x71\x76\x24\xf6\xf6\xb8\xd3\x3a\x15\x27\xe0\x84\x9d\xc8\x3c\x5b\xea\x12\x18\xf7\xaf\x67\x43\xd4\x80\x43\x25\x74\x10\x46\x02\x0d\xb8\x20\x1a\xb7\xc3\x35\x4b\x77\x26\x6b\xc3\xd2\x44\x52\x8d\x7b\xf4\x45\xee\xfd\xf1\xf6\xff\xe1\xaf\xc4\xff\x7e\xf8\xf4\xe5\x61\x13\xff\x71\x7c\x7c\xfc\x68\xff\x7f\x93\x9f\xcf\xb3\xff\x0f\x07\x47\x89\x38\x3e\x12\xa7\x6a\xa1\xec\xb5\x0d\x5b\xbf\x71\x12\x24\x5f\xf4\x14\x78\x74\x31\xba\x2d\x6f\x88\x0a\x79\xf3\x7b\xb7\xd5\xfd\x93\xbd\x13\xdb\x47\x39\xd7\xb7\x6d\xc5\xd9\x9d\xce\xc8\xb7\xf6\x45\xfe\x81\xdd\x08\xc8\x79\xb5\xbf\x92\x88\x0d\x08\xdd\xe1\x94\x2d\x2a\xb1\x74\x5f\xf9\xd7\xd0\x0c\x67\x47\xe9\x9f\xc3\x0d\x11\x3f\xc7\x6e\x40\x3f\xeb\x0b\xbb\x2e\x8f\x16\xfc\xa3\x05\xff\xbb\xb6\xe0\x7f\xe9\xfd\x3f\x78\x72\x5d\x64\xf6\x72\x3a\x38\x3d\x9b\x1d\x1c\x1f\x1e\xbd\xf8\xf2\x46\xe0\x03\xf6\xdf\xf3\x67\x4f\x9b\xfa\x3f\x4f\x9f\x1e\x3f\x7b\xb4\xff\xbe\xc5\xcf\xf5\xc5\xf8\x64\x72\x3a\x82\x0d\x3f\xe8\xd0\xb5\x3d\x80\x6d\x27\xce\xc6\xe7\x23\xd4\xca\xe5\xd5\xba\x47\xeb\x46\x9c\xca\x4a\x8a\x33\xc0\x25\x32\xa6\x49\xe6\x39\xe2\x9a\x10\xae\xe8\x23\x34\x69\x56\xaa\x45\xa5\x01\xae\x18\x9c\xea\x35\x3e\x0a\x0e\x75\xb4\x41\x9f\x24\xbb\xfe\x5e\x42\x86\xcc\xec\xfe\xc0\x22\x4f\xcb\x27\xf6\xed\xfe\x23\x44\xc2\x9e\x2d\xea\x83\x0d\x5e\x2a\xee\x51\xe6\x49\xb6\xa8\x9f\x60\x54\x75\xc7\x03\x81\x6e\xb9\xda\x3e\xa9\x4a\xb9\x78\x32\x2f\xf5\x9d\x51\xe5\x93\x41\x57\xff\xa9\xaa\x85\x87\xe1\xf2\xf4\x4c\xe8\x22\xcf\x0a\x32\xff\x16\x2b\x59\x56\x5d\xc3\xb1\x7d\x60\x30\x06\x7b\x33\x2f\xbb\x0b\xcf\x46\xf9\xf9\xd0\xb6\xf4\xf0\x3f\xb2\xbb\xb8\x7d\xae\xae\x29\x8a\x95\xfd\x96\x66\xe2\x62\x72\x35\x3e\x01\x69\xc6\xeb\xd9\x68\xfa\xbd\x38\x91\xa5\x5a\xd6\x39\xa0\xd3\x64\xd3\x40\xcd\xd5\x8d\xcc\x51\x03\x0e\xc5\x59\xdf\x7c\x14\xa7\x93\x0f\x17\xe7\x93\xe1\x69\x43\x76\x3a\x61\x2d\xea\x2e\xfd\x69\xda\x38\xb0\x6f\xbe\x9b\x85\xbb\x64\xbf\xe7\xff\x61\xdd\x8e\xe1\xc5\xe9\x13\x7b\xab\xb1\x95\xb2\xdf\xe3\xff\xb4\x7f\xfd\x38\xb9\x16\xd7\x17\xa3\x7f\xbb\x1e\xff\x30\x39\x19\x9e\x9f\x7f\x14\xa8\x2a\x97\xa0\x2d\x62\x37\xa2\xed\xd9\x9b\x91\x78\x63\x6f\x75\xf1\xe6\x63\x22\xec\x85\x4f\x77\xc3\xbd\x22\xd6\x5e\xbc\xda\xde\x2a\xf6\x4d\xa7\x13\xb8\x90\xe1\x0f\x09\xff\x8b\xbb\xef\xfa\x8e\x1d\x4f\xbc\xb8\x24\x5c\x6e\xf6\xce\xb2\xaf\x0c\xba\x1a\x74\x6b\xb0\x67\xbf\x03\x2a\x9a\xd0\x9c\xcb\xd1\xf4\xfd\x78\x36\xb3\x36\x08\xce\x4f\xe0\x2e\xfe\xcf\xff\x61\x3d\xc6\x23\xb8\x6e\x78\x9d\x12\x8a\xdf\xfa\x82\xc4\xb3\x53\xba\x88\xd0\x69\x27\x9e\xe0\x8a\xc3\xbd\xd7\x06\xaa\xc6\x76\xad\x42\x7e\x2d\x14\x16\x0c\xf6\x82\xf0\x52\x66\x22\xb5\x67\x95\x26\x62\x59\x2a\x70\x32\xb1\x1e\x39\x41\x24\xe8\x96\x18\x56\x49\x2a\x97\x51\x95\xec\x7a\xf9\xbd\x16\x1c\x7a\xe0\x97\x16\xdb\x7b\x7c\x53\x80\xdd\xfb\xd3\xa3\xd7\xb7\x3b\x94\x9f\x14\xfb\xb7\x0f\x3f\xc7\xfb\xb9\xc0\x80\xa7\xa0\xfc\x02\xda\x16\x9c\x4f\xba\x6c\x3b\x3b\x11\xef\x8b\xc7\x2b\xf0\x9f\x81\x54\x4f\x12\x3c\x4a\xf1\xd4\x30\x4c\xdd\x8e\x01\x21\x83\xed\xff\x2a\x18\x32\x3a\x89\x5a\x42\xd5\x4f\x40\x23\x12\x60\x19\x21\x69\x4d\x77\xfb\x28\xcf\xa5\x19\x5b\x8c\x13\x60\xa8\x02\x77\x7d\x5f\xcf\xec\xff\x2d\xeb\xb2\xc0\xd3\x10\xf9\x00\x8d\x6e\x02\x24\x10\xd4\x6e\xbd\x92\x7d\xd9\x47\x0f\xcb\xfb\xbd\x80\x0e\xf5\xeb\x84\x8a\x1f\xc8\x91\xc2\x82\xc1\xcf\xee\x87\xc6\x97\xcc\x7f\xda\x4b\xb2\x22\x9c\xf1\xd3\x70\xc6\xad\xd7\x33\xda\x75\x2d\x83\xab\xd0\xac\x7a\xf3\xc5\x6b\xa1\xd2\xae\x35\x4b\xff\x32\xbe\x38\xed\x12\xfb\x0d\x1c\x9c\x0e\x2b\x1e\x8e\x81\x7b\xdd\x9a\xe4\x33\x7c\x9a\x8b\x53\x71\x31\xb9\x60\x41\x5e\x76\x08\x3a\x34\x79\x77\xb8\x3b\xfe\xbc\x79\x37\x39\x3f\x1d\x4d\x6d\xf3\xf1\xbf\x66\xd4\xfa\xd1\xa9\xfd\x2a\x1c\x85\x74\x47\xb4\x5d\x1f\xf0\xa9\x9c\x58\x2e\xb9\x3a\xce\x11\xda\xe9\xe7\x78\x79\x5d\xf2\x7b\x3e\xbc\x1b\x5e\xcd\x26\xe0\x74\xa0\x62\xaf\x1d\xba\xb3\xe9\xe4\x7d\xdb\x89\x09\x7c\x98\xc8\xf5\x18\x5e\x88\xe1\x09\x7a\x6d\x67\x81\x1f\xd2\xe1\x62\x80\x1b\x32\x9e\x5c\xcf\xe8\x0b\x89\x73\x37\xc8\xc7\x98\xb0\x2f\x73\x31\xc2\x27\xda\x05\xe0\x3d\x8f\xa9\x3d\x9e\xcf\x26\xd3\xf7\x43\x78\xea\xd9\xbd\xe7\x3a\xe2\x28\x85\x34\x1c\x77\x62\x1b\x03\xcb\x30\x28\x40\xe4\x8b\x42\x65\xbb\x2e\x28\xaa\x39\x85\x28\x8d\x5d\xdf\xc4\x89\xd0\x52\x6f\x45\xac\x2d\x84\x6d\x90\x2f\xcb\xc1\xb9\x39\x70\x64\xcf\xb7\xac\xb8\x61\x4e\x1d\xf3\xe0\x29\x17\x47\x39\x10\x52\x46\x04\x39\xbe\x72\x36\x6e\xf4\xef\x23\x71\x30\x78\x32\x99\x41\xd1\xe7\x57\xa4\x00\xbe\xdf\xff\x3b\x7e\x76\xf4\xb4\xc9\xff\x79\xf4\xe2\xe5\xd1\xa3\xff\xf7\x2d\x7e\x48\x9a\x8c\xb6\x0b\x97\x20\xdd\x0e\xc4\xd3\xc1\xa1\xd8\xa7\xb5\xd1\xc7\x9a\xc6\xee\xcf\xa2\xfd\xc1\xcc\xa1\xfd\xa8\xcc\xb0\xd8\x7a\x8e\x38\x86\xcc\x13\x9e\x73\x95\x6d\xe8\xab\x13\xfe\xc4\x07\x5d\x7e\xea\xf5\xa9\x12\x49\xdf\x15\xaa\x8c\x1e\xae\xcb\x5e\x1f\xe8\x21\xa9\x08\xb1\x0b\x53\x8a\xa5\x06\x78\x91\xa6\x7f\x93\x0b\x20\xed\xd1\x8d\xfd\x4d\x1f\x60\xb2\x80\xe8\xfd\xdf\xef\x51\x4f\x42\x4b\x73\xc7\x20\xb9\x0a\xd8\x43\x08\xff\xf7\x7d\x6d\x81\x37\x75\xe9\xc3\xa4\x13\x68\x74\x89\xa6\xa6\x01\xdc\x03\xd4\x11\xe4\xe9\x5d\x66\xcd\xdf\x52\x6f\x65\x5e\x6d\x0f\xac\x05\x9a\x40\xbd\x84\x93\xf8\x4b\x84\x01\x5f\x4c\x91\x50\x4a\xce\xa5\x9e\xdc\x85\xb4\x2e\xbb\xcf\xb2\x84\xec\x9f\x5d\xac\x51\x95\x6e\x64\x00\xa2\xc1\x10\x98\xa7\xc8\xa0\x36\x01\x8b\x00\x5d\xf5\x48\x44\x95\xc3\xd4\xa1\xb7\x0a\xa6\xf9\xb5\x67\x79\xb2\x83\x5f\xca\xc2\xe4\x12\xac\xc0\x54\x6e\xaa\x44\xc8\xbc\x52\x65\xe2\x8b\x8a\xbc\x09\x09\x25\x5b\xa5\x23\x85\x88\x5a\x03\xb7\x0c\x58\xeb\xc0\x4a\x0a\xd9\x06\x47\x63\x0a\xef\x35\xd6\xf7\xf2\xbf\xb2\x5f\xb2\x66\x35\x16\xa7\x80\x1a\x7d\xeb\xa1\xaf\x3d\x47\x94\x1d\x29\x0f\xff\x45\x5e\x8f\xb5\xf5\x24\x64\xa5\x1a\xb6\x5e\x3c\x4a\xd6\x90\x6b\xbe\x96\x57\x1d\x2b\x30\xb8\xbc\x06\xea\xc9\x6b\xa6\x5c\xe5\xa7\xc6\x4f\xd4\x65\xc7\x03\xed\x17\xec\xaa\xd9\xdd\x48\x47\xed\x93\x37\xd7\xf0\xae\xdd\xfb\xda\x13\x4c\xa1\xad\x0d\x99\xa1\x76\x17\xb1\x1b\xf9\xf6\xb5\xed\x2c\x7d\x47\xf1\x90\x6d\x72\xac\x0f\xd9\xf1\x1d\x4c\x47\x05\xbb\xe3\x52\x42\x2d\xc8\xd7\xdd\x1a\xd8\xf3\x0d\xbe\x0a\x52\x52\x06\xce\x94\x14\x07\x0d\x58\x83\x73\x5f\xcc\xe1\xda\x80\x55\x33\xa5\x12\x6a\x3d\xd7\x69\xe6\xe3\x29\x8d\x39\x37\x81\x8f\xd1\x78\xc6\xee\x7d\x89\xcd\x01\xa6\x35\xa8\x81\x4d\xd0\x8d\xb2\x5e\x51\x22\xf4\x72\x49\x85\x8d\x68\xf1\x40\x09\xd2\x5a\x52\x69\x1c\xa9\x58\x7e\xe6\xf2\xc3\x8c\x59\x30\xe6\xa4\x3e\x09\x70\x7f\x37\xf0\x57\x04\x9a\xb2\xee\xa3\xfb\xb3\xa7\x54\xb5\x8b\x55\x2d\x55\x59\x22\xdc\x7c\xdd\xbd\xfa\x97\x58\xcf\x6b\xb7\x63\x8b\x9f\x31\x43\x2f\xc7\xae\x4a\xc9\xf4\x8e\x0d\xf7\x35\x55\x66\x51\x66\x73\xa6\xac\xb4\x03\x83\x7c\x99\xad\x37\x05\x0b\xc5\x4b\xf8\x7b\x5a\xc1\x16\x57\x5c\xe8\xa0\x87\xdd\xef\xde\xc3\xbe\x04\x1d\x39\x35\x83\x2f\xc7\x9f\x84\x05\xe2\x5a\xe2\x37\xa3\x09\xda\x47\xa1\x8b\x06\xeb\xb3\x91\x55\x66\x96\x54\x9d\xad\xe7\x79\x46\xd5\x5d\xf3\xad\x63\xa9\xfc\x09\xdd\x40\xd2\xaf\x80\x63\x41\x40\x14\x2d\x83\x78\xa2\xa3\x75\xdb\x8a\x85\xcc\x17\x40\x19\x14\xba\xd3\x59\xa1\x7e\xdc\xd8\xfb\xf2\x56\x31\x13\xff\xad\x2a\x40\xc7\x4f\x2e\xa0\x9a\x70\xbe\x85\x7d\xb8\xc4\xa3\x1e\x46\x47\x1a\xdf\x43\xbb\x83\xb2\xa2\xc6\x49\x68\x70\x20\xc6\xb3\x06\x99\xcd\xbe\x18\xfd\x48\xea\x7a\x46\x9c\x95\x7a\xed\x6e\x51\x58\xa1\x03\x71\x41\xf7\x4b\xe5\xc8\x27\xf5\x32\xd8\x50\x85\x6e\xfc\x09\x8b\x81\x49\xd0\x4f\x7b\x56\xec\xc6\x8d\x51\x50\x95\x04\x8e\x5f\x56\xfa\x5c\x25\xf8\x09\xa4\xc8\x02\xbc\xc3\x26\x61\x86\xae\x9f\x97\x46\x8e\x57\x09\x3b\x1e\xea\xc7\x4d\x69\x87\x13\x1d\x90\x76\x7a\x95\xbb\x38\x10\xde\xcd\xa2\xef\xe4\x5b\x84\x06\xa4\x10\xa4\xca\x0a\xdb\x1b\x14\x35\x60\xef\x8b\xc7\x90\xce\x4d\xdb\x51\x46\x48\x56\xda\x3d\xfa\x3b\x13\xf4\x3a\x09\x98\xac\x93\xe0\x3c\xb2\x1f\x10\x46\x2d\x4a\x85\xa4\x63\x30\x68\x30\x23\x59\x01\x32\x97\x0b\x28\xc6\xdd\x94\x7a\xa3\xca\x6a\x0b\x45\x79\x74\xb8\xf2\x2b\x3d\xe6\xea\xa7\x1e\x6f\xba\xe4\xd3\x0d\x0f\x5d\x57\x49\x07\xa1\xb7\xf8\x08\xa7\x55\x22\x8b\x10\xca\x99\xf2\x9f\x99\xeb\x2a\x2b\xc4\x8c\x38\x33\x8e\x49\x1c\xa2\xab\x91\x80\x1a\x0d\x56\x84\x5f\x72\x71\x2d\x26\xfe\x39\x88\xbf\x77\xdf\x0a\x50\x00\xde\x39\x43\xee\x66\xf6\xc4\x78\x29\x1d\x5f\xab\x6c\x9e\x05\x07\x0a\x2c\x28\x6f\xcc\x86\x28\x58\x66\x9e\xac\x82\x55\xc7\x2f\xb0\x23\x75\xdf\x39\xe5\xbd\x6b\xac\x25\x85\xd1\x97\xfe\x6c\x72\x98\x58\x21\xc4\x73\xbb\x5b\x2b\x55\xda\x47\x9d\xaa\x4d\xae\xb7\x18\x29\xf7\xd7\x45\xc7\x9f\xc3\x6b\x03\x75\x8a\x22\x11\x8f\xc8\x52\x09\xe1\x05\x0f\xda\x3d\x01\x1f\x58\x2c\x18\xf0\xf0\x57\xc3\xfd\x3c\x87\xba\x4f\x30\x5e\xfd\x12\xfa\xa8\x6b\x60\xe4\xa2\xdf\x68\xc3\x76\x64\xc4\xec\xc8\x36\x83\x33\xb4\x68\xed\x68\xa3\x5c\x5c\x12\x2e\xc1\x54\x05\xd7\x1c\x96\x24\x13\xe6\x1f\x09\x42\xa0\x82\x8d\x6a\xb7\x20\x9e\x71\x0b\x2c\x19\x85\xaa\xee\x60\xf5\x0c\x0d\xd2\xd3\xe1\x91\xe1\x70\x36\xce\x9c\xa0\x7d\xae\x97\x6e\x39\xdb\x93\x01\x96\x48\x82\x40\xea\xda\x54\xa2\xb2\xd6\x31\x8c\x59\xc7\x34\xf1\xb9\xbe\x6b\xf8\x65\x73\x14\x3b\x88\xc1\x62\x4e\x9a\xa3\xfd\x05\x62\xc8\x5f\xf4\xc5\xb0\xf2\x9f\x42\x44\xd7\xc0\xb7\x0b\x81\x4f\x89\xe3\x41\x8e\xaf\x64\xdb\xde\xdd\x36\x2f\xea\x10\x24\x1c\x76\x65\xe7\x06\xcf\x06\x58\x5d\x1e\x84\xc2\x14\xe4\x9e\x0b\xf8\x81\xcb\x3f\xb1\x7d\xbc\x53\xd6\x48\x31\xc4\x8e\x8c\x4f\x70\x03\x8d\xb5\xee\x18\x88\x47\x83\x65\x03\xad\x04\xb2\x24\x27\xaf\x95\xa2\x83\x02\xa1\x5b\xa0\x54\x09\x87\x83\x6a\xff\x7a\x7e\x3c\x90\xd2\xae\xd9\x40\xae\xeb\x7b\x68\x2c\x00\x1b\x2b\xcb\x72\x1b\x31\x83\xb7\xdf\xb8\xdb\x14\x40\xd3\x21\xe4\xb0\x77\xaf\xc0\xb3\x99\xcb\x07\xbb\xef\xf4\x97\x7d\xf1\x01\x7c\x35\x2c\xb9\xbe\xf4\xb2\x62\x60\x90\x7a\x1c\x98\x5e\xba\x0f\x06\x26\xd2\x1d\xfe\xca\x84\xa4\xa2\xec\x34\x67\x05\x47\xff\xbb\xad\x5d\x6f\x4a\x73\x42\x82\xcf\x74\x1a\xff\xf9\x36\xb0\x15\x4b\x45\x86\x7f\xd3\xd4\xa7\x3f\x3a\x07\x02\x87\xe5\x23\x88\xea\xb5\x6a\x0a\xa2\xd3\xd6\x7b\x73\xad\x0b\x3d\x30\x4a\xf6\x0d\xd1\xbd\x20\xb3\x8a\x13\x90\x80\xc0\x7f\xd8\xfc\x7b\x2f\x7f\xda\x2e\xd9\x9a\xd8\x10\xb0\x78\x73\xa1\x20\x4d\x03\x35\x9c\x05\x47\x60\x1b\xce\x7b\x00\xab\x0b\xfc\x40\xee\x03\x80\xf1\x1c\x2f\xde\x9b\xe1\x6c\x3c\x83\x96\x35\x53\x05\xce\xf5\xe7\x73\x09\x6f\xeb\x1c\x04\x3b\x5c\xc2\x28\xe9\xc8\x18\x61\xa3\x68\xa2\xc9\xcf\x45\x82\x90\x65\x99\x11\x67\x31\x64\x8d\x16\x2b\x59\x38\xca\x7f\x7b\x07\x66\x55\x61\xdf\x84\x24\x2f\xac\xda\x27\x4b\x2e\x76\x1d\x40\xbc\x7a\x74\x71\x35\x9e\x8e\xc4\x74\x3c\xfb\x8b\x18\xce\x38\x2d\xf1\x6f\xd7\x43\x06\xca\x00\x26\x6a\x3a\x7e\x3b\xbe\x18\x9e\x8b\x0f\x93\xe9\x5f\xc4\x78\x86\x81\xf0\x8f\x93\x6b\x7b\x9d\x65\xc6\xa3\xaa\xa6\xf6\x1b\x2e\x3d\x02\xbc\x88\x59\x65\xcd\x7a\x38\x92\x8d\x1d\xe8\x0c\x78\x9e\x03\x72\x4c\xe7\x48\x05\x06\x46\xe7\xa2\x0d\xac\x0e\x66\x67\xe2\x69\x40\xde\xb3\x70\x82\x3c\x84\x12\xe9\x2b\xfb\xe2\xdc\x27\xe1\xc0\x44\xa1\xa1\x1a\x88\x6b\xf8\x56\xa1\xc5\x22\x2b\x17\xf5\xda\x54\xb2\x60\xf1\x85\x9a\xff\x84\x09\xef\x6a\xa5\x74\xb9\xf5\x97\x9d\x5d\x55\xd6\xe0\x0a\x18\xa9\x0a\x75\x93\x67\x37\x76\x35\xf5\x13\x12\x72\x5e\xe0\xd9\xea\x8c\x87\x84\x0c\x99\x68\x1b\x41\xbc\x41\x12\x27\x25\xdd\xb1\x7c\x8a\x65\x05\x02\x0d\x12\x24\x44\x92\x39\x2c\x19\x38\x31\xed\x7f\xa3\x23\x41\x75\x3a\xc0\x59\x29\x51\xfe\x97\x2d\xfc\x95\xb4\x8d\xb0\xb7\x64\x89\x89\x02\xb8\x8d\x4a\x65\xea\xbc\x35\x0d\x82\x6e\x49\x07\x13\x6e\x47\xb3\xee\x5d\xac\xfc\x6e\xdb\xf6\x5c\x1b\x68\xc4\x8d\xd6\xe9\x5d\x66\xcd\x57\x08\x5f\x9a\x4a\x6f\x36\x40\x87\x8a\x5a\x26\xd6\xa0\x95\x19\x68\x32\x83\x01\x90\x2f\xeb\x62\xe1\x0c\x1e\x48\xdb\x92\xfb\x8b\x46\x47\xc8\xce\xc9\x3d\xc5\x97\x81\x1c\x25\xa2\x6c\xc3\xb9\xce\x79\xae\x83\x14\x0a\x0a\x66\x70\xc5\xfb\x8f\x70\x8e\x04\xa5\x85\xb9\xbc\x73\x66\x25\x96\x76\x07\xcf\x44\x12\xcf\xbe\x18\x2e\xec\xaa\x73\xa7\xf5\x95\x3d\xc6\x0a\x02\x77\x8e\x97\x89\x20\x03\xa2\xca\xd6\x0a\x2d\x0b\x7f\x2c\x49\x43\x85\xe3\xcc\x52\xeb\x88\xe7\x30\x74\x02\x7f\x86\x89\xb7\xa6\x92\x21\x2a\x90\x5c\xc9\x12\xc3\x18\x65\xa9\x6e\x35\xe9\x84\xfa\x56\x34\xe7\xd2\x8d\xdb\x12\x4a\xea\xab\x0e\xcd\x38\x20\x4b\xbe\x3f\x20\x76\x5f\xd4\xae\xcb\xd8\x09\xac\x28\x54\x5d\x09\xf9\xd1\xd5\x72\x69\x77\x4c\xc0\x19\x1d\x6d\xba\x4a\x13\x3c\x80\xe6\x05\x0f\x4b\x1a\x0e\xbd\x8c\xee\x59\xbd\xfb\x6e\xa1\x65\xc0\xe3\x10\x80\xad\x61\x20\x83\x04\xbc\x6d\x47\x45\x2a\x1a\x42\x2e\xaa\xec\x36\x83\x53\x36\xcf\x4c\x15\xbb\x40\x47\x61\x66\xdf\x3f\x06\x4c\x08\x34\x26\x5a\xd6\xc6\x7d\x31\x53\x92\x90\xd2\x70\x01\x69\xb7\x97\x56\xba\xd0\x25\x91\xde\x18\xd5\x39\x65\x74\x27\xc1\xda\x64\xaa\x1c\xbe\xf4\xed\xba\x85\x05\x52\x80\xd1\x4a\xd4\x3c\x60\xcc\x6e\x77\x3b\x56\x99\xf1\x66\xb5\x3d\x7e\x80\xa3\x25\x78\xaa\xa3\x95\x64\x96\x71\xde\x09\x26\x3c\xfa\x7a\x4b\x99\x81\x49\x8e\x1c\xd9\xf0\x2f\xca\x31\xf6\xfa\x8d\x19\xa1\x13\x90\x76\x4c\x7c\x31\xdb\x57\x78\x56\x7b\x88\x9a\xc0\xc5\x69\xf7\x3c\x39\x69\xb4\x16\x1b\x76\x0b\xd9\x1d\xcd\xcb\x01\xc6\x1f\x26\x8c\x8f\x99\x4a\xe3\x38\xb3\xad\xe1\x06\x36\x98\x6d\x36\xc8\x8f\x0e\xfb\xe1\xce\x86\x83\x8d\x62\xaf\xc3\x05\xee\xf5\x7b\x7b\x16\x13\xa6\x7f\xe9\xbe\x49\xb7\x2f\x53\xfb\x32\xb0\x6c\xed\xf1\x88\x67\x12\x2c\xe8\x18\x92\x22\xc5\xa2\xd4\xc6\x1c\x20\x25\x05\xec\xf4\xda\xae\x15\xf8\x77\x22\xe4\x8d\xcc\x0a\x53\xc5\xe6\x9d\x8f\x88\x00\x2a\x51\xdd\x44\x8c\x94\xcd\xeb\x01\xcd\x12\xe0\xe4\x87\x61\xa2\xf1\xa9\x82\x31\xc4\xf0\x3d\xc8\x5d\x37\x0e\x64\xbc\xf2\xa8\xdd\xfe\x65\x64\xe8\x85\x36\x8f\xa7\x88\x92\x95\x67\xff\x68\x36\x27\xa0\xe7\x72\x60\x20\xd0\x47\x2b\x53\xfb\xdf\xa4\x2a\xdd\x17\x7f\xae\xcb\xcc\xa4\x8c\xe0\xf9\x41\x15\x35\x9e\x9e\x6f\x81\x9d\x10\x99\x5a\xee\x06\x62\x68\x2f\x23\x52\x77\x43\xce\x3b\x51\xaa\x9c\x28\x3a\xe3\x93\x9c\xfd\xe6\x39\x68\xbe\x91\x86\x97\x13\x45\xab\x4b\x8a\xcd\x88\xbf\x05\x6f\x46\x2d\x0b\xfa\x50\x18\x07\xcd\x52\xbc\xe4\xb2\x82\x34\x62\xc2\x10\x22\xc6\xd2\xec\x01\xbf\x29\x33\x10\xcd\x9b\xd7\x26\x2b\x80\x57\xcd\x1b\x31\x10\xe8\x91\x77\x5e\xa9\x2e\x7a\x31\xa4\x02\x52\xe4\x62\x35\x4e\xab\xe6\x40\x2f\x0f\xe8\x26\xc4\xf9\x32\x18\xbf\x08\xfd\x71\x0f\xde\xb2\xcb\xf4\x82\x26\xe3\x04\x42\xa1\xf8\x81\xc2\xfe\x0b\xec\x20\xcf\x2d\x3e\x8e\xce\xa7\x99\x44\xb9\x85\xb7\x5a\xa7\x70\xbc\xf9\x8b\x12\x1b\xa6\x52\x1c\xfb\x9d\x56\x89\xae\x2b\x3b\x48\x08\x75\x58\xe8\x4d\xfb\x2e\xb4\x0b\x0b\x08\x35\xf9\x26\xe4\xc5\xe8\xa2\x4a\xa6\x46\x69\x19\xba\x58\x22\x42\x2a\x84\x19\x15\x32\x67\x13\x3c\xd2\xb5\xe3\x18\x9e\xbc\xe3\x19\x96\x1b\xa4\x26\xb5\x9b\x32\x1c\x68\xda\x0c\xec\xf6\x93\x3a\x56\x5d\xde\x82\x23\x4c\xd7\x19\xb7\xac\x79\xa9\xc1\x62\x3d\x86\x00\x81\x2e\x0b\xb5\x35\xdf\x89\x33\x65\x6d\x9e\x31\x46\x77\x68\x65\x42\xd0\x75\xa9\xcb\x85\xba\xc7\xf9\x82\xb8\xad\x82\x84\x03\x1b\x51\x7e\x25\xdb\x55\x58\xe9\x84\xb3\x17\xb7\x32\xcb\x71\x17\x96\xce\x86\x9a\x23\x4f\x50\x95\xe3\xd9\x54\x2a\x20\x4e\xa5\xd5\x63\x68\xc4\x30\x3c\xae\xcc\x83\x2e\x4e\x60\x20\x48\xdf\x39\xd0\x93\xc3\xbb\xcf\x3e\x31\x2b\x16\x35\xa4\x51\x20\xa1\x5a\x14\x34\x86\xa8\xa7\x04\x64\x6a\xed\xd3\xae\xd8\x22\x16\x2c\xf7\x42\x0b\x5f\x68\x1e\x9e\xf6\xc5\xfb\xcc\x2c\x54\x9e\xcb\x42\xe9\x1a\x0d\x29\x08\xb5\xba\xc3\xad\x39\xe6\x80\x94\xcc\x53\x22\x02\xaa\x0b\x9a\xa5\x40\xae\xab\x79\x30\x82\x5e\x20\x51\xe2\x85\x22\x80\x64\xb0\x16\x6a\xa1\x8c\xb1\x3b\x9e\x29\xef\xb3\x4a\x04\x4f\xc5\x96\x3e\xeb\x07\xa4\xb5\xb6\x51\x24\xb5\x58\x44\x17\xd7\x80\x7e\x4d\x22\x95\x76\x86\x62\xc3\x34\x70\x7a\xea\xcd\x46\x95\x68\x74\xdf\x59\x83\x5c\xda\xbf\x13\x2f\x6c\x01\x56\xeb\x6d\x96\xd6\xc8\x2a\x2a\xc9\x77\x82\xd5\xb2\xe5\xab\xce\x4e\x0e\xdd\x70\x14\x79\xc3\x79\x5e\x6f\xf2\xad\xe3\x74\x0c\x44\xf2\x78\x11\x27\x0d\x33\xef\xcc\x36\xc2\x3f\x1f\x92\xec\xdc\xbd\x00\xe3\x4d\x2f\xa7\x74\x31\xa4\x2d\x0d\x90\x6c\x45\x39\x4c\x8c\xa1\x33\xb6\xdc\xde\xa3\xba\x70\xda\xa8\x2c\x8f\x84\xef\x24\x1f\x3a\x28\x9a\x76\x23\x9c\x88\x1e\x7d\x87\xa3\xb9\xfb\x59\x1f\xb7\x92\x1d\xad\x84\x50\xe3\x78\x9c\xb3\x63\x07\x71\x28\x8e\x64\xe1\x2f\xe9\x92\x59\xcb\x42\xd2\x8d\xc7\x4b\x18\x7b\xe3\x67\x64\xbe\x75\x9e\x66\xc3\xd1\xd4\xa5\xd8\xcf\xb2\x3e\xe2\x40\x00\x2d\x02\xa2\xa4\xcb\x0a\xc0\xb8\x00\xec\xd8\x7f\x7e\xf8\xbf\x01\x68\x76\xad\x4b\x77\xb8\xda\xe3\x94\xe9\x57\xcd\x4a\x96\xca\xf0\xb3\xb2\xbe\x98\xab\x42\x2d\x33\xf0\xbf\xa2\xe7\x06\x6d\xc3\x85\xf7\xbc\x8f\xf1\x4b\x12\x99\x6b\xd3\x54\xb4\x70\x12\x76\xc6\x41\x26\x22\x66\x26\x66\x78\xad\xcb\x3b\xa3\xc1\xd6\x11\x08\x40\x81\xb9\x5c\xde\xe1\x82\x72\xd7\x24\x04\xf7\x0c\xd1\x71\x41\xd8\xae\x52\xe5\x52\x95\xca\xd5\xb3\xc2\x56\x33\x1b\x5d\xa0\x32\x04\x6a\x2e\xa1\xda\x03\xe7\xf1\xb0\x57\x2f\xfa\x44\x3d\xe6\x2f\xc0\xab\xdd\xae\x47\x66\x44\x93\x9f\xed\xf0\xb9\x35\x26\x40\xfc\x4a\x4c\xb5\x51\x45\x54\xad\x1f\xe7\x56\x10\x1b\x1c\x62\x80\x1b\xce\x59\x2b\xa2\xd6\xac\xc9\xdd\x6d\xf5\x63\x16\x13\x91\x02\x61\xc6\x38\x36\x2f\x25\x49\xac\x74\x86\x64\x34\xa8\xa9\xb4\xf2\xe6\x5e\x62\xca\xc9\x6f\xfa\x74\x34\x84\x7b\xbb\x3c\xd5\x66\x5f\x9b\x5d\x0d\xb4\xc9\x02\x3a\x36\x04\x37\x39\x32\xb8\x00\x42\x65\x9d\x5f\x30\x2a\x51\xf0\x04\xad\xc0\x08\x49\x65\x1a\x50\xaa\x86\x05\xd0\x55\xac\xfc\x3d\xec\xe6\x50\x74\x8b\x9d\xf4\x96\xe6\x0a\xb4\xb7\xd9\x30\x20\x38\x5f\x51\xf1\x6d\x0b\x49\x82\x9e\xd3\x64\x76\xde\x83\xe6\x6f\x83\xd7\xe0\x9e\xd1\x86\xd3\xb7\x64\x68\x30\x5e\xb4\xf3\x65\xaf\x71\xf7\x07\xc9\x03\xd4\x9a\x84\x2f\x62\x60\xdb\x53\x6c\xd3\x03\x97\x59\x69\x2a\x7b\xd5\x93\x04\x0d\x56\x33\xbb\x58\x2d\x7d\xad\xd7\x00\x78\xfd\x91\xf4\x0f\xa0\x19\x1c\xc5\x83\xb6\x59\x5b\xe2\x4f\x3d\x47\x95\xeb\x48\xf0\x03\xa1\x2e\xc7\xd5\xcc\x3a\x89\xc0\x76\x9b\x6f\x85\xc9\xd6\x59\x2e\x4b\x9e\x0f\xaf\xd8\x19\xae\x1d\x40\xd3\xd0\xd1\x14\x89\xa1\x21\xe9\x9e\x9b\x89\xc6\xcc\x83\x27\x60\xe7\x80\xea\x7f\x8c\xa7\xcc\x01\x09\xea\xee\xd9\x73\xc2\xca\x60\xe0\xdd\xe2\x09\x44\x53\x09\x8f\x19\xdb\x4b\x00\xf7\xc2\xfe\x64\x36\xee\x3b\x8f\x0f\xef\x36\x92\xb0\xab\x62\x16\x1e\x85\x4e\xfb\x42\x95\x95\x3f\x57\x36\x4c\xb9\xfb\x6b\xa3\x1b\x1f\x7f\x1e\xfa\x19\x3c\x19\x6e\xe4\x62\xa5\x80\x00\xe4\x2b\x41\x80\x1f\xc2\xff\x1e\x3f\x3f\x6a\xf2\x7f\x3c\x3b\x3a\x7e\xc4\xff\x7e\x8b\x1f\x9c\xfd\x2e\xca\x8f\x44\xfc\x59\x16\xb5\xb5\xd0\x8f\x0f\x0f\x9f\xed\x05\xd5\x55\x12\xbe\x13\x4b\xb8\x74\x17\xa2\x9d\x61\xd9\x58\x22\xa6\xa3\xcb\xe9\xe4\xf4\x9a\x8b\x15\x2e\x4e\x7d\x6d\xd9\x78\x72\x41\xec\x19\x4d\x7d\x0a\x21\x04\xfd\x8f\x83\x17\x93\x73\x61\x8d\xd3\xc0\xb8\x6e\x04\x19\x29\xbd\x9e\x38\x68\x2b\x11\x7c\x84\x24\x42\x10\xa3\x31\xa1\x36\x1a\x85\xcf\x8c\x38\x72\x6a\xf7\xaf\xba\xa9\x35\x5a\xed\xd2\x65\xab\x61\x81\x93\x0d\x40\x66\x5d\xb2\x25\xcf\xc5\x07\x5d\x32\x2a\xf8\x59\xbe\x53\xc0\x98\x62\x16\xf1\xd0\x83\x0b\x1b\x00\x1e\xc4\x08\x1e\xdd\x6a\x44\x5d\x04\x61\x0e\xeb\x3d\x16\x37\xae\x15\x51\x5e\x82\x3d\x90\xc8\xcd\x40\x4a\x94\xb6\x9b\xe1\xc9\xd9\xba\xfc\x0c\x2c\xae\x42\x53\x1a\xfc\x8d\xca\x8b\xa6\x3c\xfa\x1c\xf7\xf8\x1c\xc1\xa4\x82\x17\xb8\x6f\xed\xa9\x8f\xba\x2e\x7b\xfd\x70\x5e\x5b\x5e\x6a\xb8\x02\x42\x1f\xd5\xa7\xa6\x77\x26\x1f\x9b\xef\x45\x43\xa0\x87\x60\xcf\xc6\x5a\x6a\x40\x41\x77\xa1\x3e\xc3\x10\xc6\xbc\x46\x66\x16\x08\x97\xa0\x1d\xee\x4c\x95\xa0\x74\x39\x69\x20\x42\xf1\x4f\xec\x56\x17\xcb\xec\x86\x51\xb4\x50\x59\xd9\x6c\xf4\x04\x0c\xdf\x76\xa3\x59\x50\x83\xb2\x85\xa0\x6c\x5b\xea\xb5\x58\xab\xc5\x4a\x5a\xbb\x3c\xf7\x00\x74\xa7\x9c\xcd\x58\x75\xda\x37\x92\x6d\x23\x44\xa9\xdf\xdb\x35\x27\x17\x14\xc8\x3c\x27\x01\xd7\x7e\xd4\xc9\xc4\xa3\x2e\x89\x01\xda\x99\xf9\x90\x4d\x10\xd5\x76\xd3\xee\x2a\x14\x48\x34\x27\xa6\x5d\x57\x11\x05\x3c\xa8\x03\xba\x14\x38\x50\xd4\x95\x06\x58\xc9\x07\x5a\x5d\xd0\x04\x04\x1d\x53\xc2\x3b\x01\x75\x63\xab\x82\x82\x0f\xaa\x10\x14\x67\x0f\x88\xaa\xb2\x17\x84\x73\xbc\xa0\x85\xfb\x80\x6c\x02\x4d\x88\x08\x99\x40\xb6\xfb\x70\xb3\x51\x45\x9a\xfd\x08\x84\xde\x77\xfd\x66\xcf\x5b\xa8\xfe\xe6\x4c\xdf\x41\x5e\xea\xe1\x7e\x73\x93\x9d\x60\x85\xdd\x66\x21\x98\x13\xcf\x1e\x07\x35\xb1\xeb\x1c\xe3\xd6\x10\xbc\x4a\xb3\x4a\x97\x76\x2b\x33\xa7\x24\x04\xaa\x0b\x5d\xf1\xea\x57\xb9\x9c\x93\x12\xbb\xf1\xb9\xf3\x06\x32\xda\xe9\x59\x24\x98\xcf\xbe\x5b\x69\x94\xe3\xbf\xaf\x5a\xe6\x9e\xd3\xd4\xcd\x59\x2b\x8d\xe7\x93\x14\x4c\x4a\x70\xe7\xc1\x44\xa5\x02\x59\x7e\xd4\x63\x87\xc8\x41\xa9\x51\x34\x7f\xad\x40\xdc\x25\xcf\x8a\x4f\x30\x40\xf3\xac\x80\x35\x60\xdd\xa2\x3e\x4f\x6b\x20\x4a\x89\xd1\x2d\x75\x5f\x39\x84\x75\xa6\xf4\xb2\x39\xaf\x27\x8c\x96\xc9\x74\xd1\x39\xa7\xcd\x95\x1d\x32\xaa\x2b\x3f\x5c\x0d\x45\x27\xd7\x0e\xfb\x98\x86\xea\x7f\xe9\x94\xd6\x28\x11\x2b\xab\xfb\x8a\x2e\xa0\xd9\x49\xb0\xd4\x2b\x4c\x0e\x40\x4e\xcc\xd4\x73\xaf\x2a\xe7\x21\x9c\x70\x57\x11\xdc\x99\x17\x38\xbc\x62\xc7\x85\x8f\xa1\x9f\xfb\x4f\xf6\xc0\x6c\xb0\xe7\x28\xbc\xd8\xae\xdf\xb9\x5a\xc9\x7c\xd9\x2e\x62\x84\x27\x7f\xee\x0d\xec\xfa\xe1\x34\xb2\xf8\xf0\xd4\x4b\xa1\x72\xb5\xa8\x4a\x5d\x64\x8b\x04\x89\x17\x11\xb8\xe1\xc5\x7b\x42\x58\xa7\x09\x2a\xae\xc2\x4c\x5c\x56\x99\x48\xc6\xe5\x56\x3d\x74\x55\x34\xe0\xa2\x45\xd0\x0e\xb1\xa6\xb0\x7e\x9e\x99\xca\x24\x11\x0f\x06\x1b\x23\x66\x6b\x2a\xb5\xa6\x3c\x52\x66\x4c\x0d\x48\xdf\x05\xdc\x58\xf4\x37\x5f\xeb\x81\x56\x83\xb3\x70\xc2\x61\x4d\xe2\xae\x2c\xe3\xf1\xb4\xe3\x93\x66\x66\x51\x1b\x87\x11\xcc\xd6\x70\xb6\xd1\x0a\xc5\x7c\xf9\x1c\x90\xe0\xdc\xd9\xb8\x67\xbc\xb2\x16\xba\x30\x9b\x6c\x51\xeb\xda\xe4\x5b\x40\x1c\x63\xcc\xd0\xc7\x12\x51\x41\x89\x41\x61\x76\xfc\x61\xe8\xba\xd7\x94\x34\xa2\x77\xa1\x2b\x10\x61\xf3\x7b\x6c\xd0\xdb\xb5\x01\x1b\x36\xac\x87\xcf\xd1\x2e\xba\x67\x69\x46\xab\x10\xaa\xf3\xe3\x97\xfa\xd0\x43\xa9\x16\x2a\xa3\xd0\x43\xf4\x06\xcf\xd6\x0b\xa9\xc6\x85\x2e\x37\xba\x74\x02\xd7\xc1\x16\x62\x6e\xbb\xfb\x4a\xed\x66\x71\x2c\xac\xd3\x47\x68\x1d\x9d\x50\xf5\x11\x8c\x46\xc4\x0c\x61\x38\x89\x2d\xad\x59\xb5\x51\x55\x2d\x11\x12\xc4\x15\x4a\x8d\x9a\xa4\x42\x1f\x30\x81\x44\x5c\xbb\x14\xa2\x5f\x02\xe8\x83\xc7\x8e\xb9\x6a\xbc\x04\x74\x9f\xec\xe2\x6c\x1d\x4a\x76\x51\x72\x71\x15\xd7\x5f\x05\xbf\xa1\x2a\xae\xa0\x32\x4a\x25\x4d\x71\x8b\xe8\x90\x04\x4b\xb4\x0b\x77\xdd\x79\x87\x32\x19\xdf\xce\x72\xae\x7f\x92\xe1\xdf\x57\x0e\x73\x19\x22\x2d\x7d\x6a\xad\xdf\x2c\x70\x70\x55\x0d\x41\xe9\x02\xf8\x99\x58\xda\x60\x8f\x65\xa8\x74\xc0\xff\x8f\x15\x0d\x38\xf2\x41\x6d\x3b\x98\x9c\x64\x6b\x7d\x60\xa3\x05\x50\xa8\x00\xd4\xa2\x98\x32\xd5\xd0\xfa\xc4\x19\x60\xcd\xa3\x4a\x88\xa0\xe8\x6d\x4e\xd0\xf8\x70\xfc\xdc\xd9\xc6\x99\xb6\x0c\x76\x16\xa2\x10\xd8\xf5\xcc\xca\x68\xa3\xee\x9b\xbe\x2f\xf0\x8c\x41\x0a\xbe\x82\xa6\xf9\x05\x17\x5f\xc5\xaa\x03\x4d\xe6\x52\xdc\x20\xfe\x2c\x88\x8d\xd0\x5d\xe3\xf0\x5b\x19\x63\x2d\xfd\x80\x57\x5c\x1b\xc5\xa8\x8e\x20\x15\xb6\xff\x99\x90\x10\x88\x6a\x03\x70\xa0\xce\xaa\x7e\x07\xfc\xc3\xc3\xc0\xa2\xd3\xea\xbe\xe3\x27\x02\x86\x7a\xcf\x34\x00\xfd\x6e\xbb\x10\x1f\x24\x9f\x1f\x94\xb3\x70\xe0\xa4\x89\x92\xe9\x00\xea\x2e\x79\x36\xa1\x01\x2d\x90\x4e\x0c\xa3\xa1\x65\xe4\xc6\x2f\x33\xe0\x35\xa5\x4c\x30\x19\x73\x82\xfa\xbc\x56\xa0\x52\x10\x9f\x14\x31\x84\xee\x21\x43\x89\x33\x09\xd6\x89\xa9\xd7\x0f\x2a\x68\x22\xde\x6b\x97\xad\x1e\x13\xb6\x40\x4b\x95\xda\x4d\xc6\xca\x65\xcd\xfb\x32\xc8\x1b\xdc\x60\x85\x1b\x17\x33\x05\x20\xbc\x87\x7a\xd4\x20\x57\x0d\x43\xf6\xfc\xa2\x79\xbf\x89\xe6\xf7\xf6\xa6\x75\x27\x80\x8e\xc2\xe1\xf4\x3d\x4a\x9f\xeb\x0b\x22\x89\x5c\x88\xb4\x83\x1e\x3e\x95\xb6\xdb\x6f\x47\xaf\x5b\xf4\x1f\x2a\xa6\x60\x93\xed\xfe\x02\x82\x88\x97\xa7\xbb\xa0\xc2\x55\x53\xe0\x1c\xc9\xa0\xac\x60\x57\x79\x45\x58\x21\x8a\x07\x9b\xb7\x78\x28\xfb\x43\xdf\x84\x86\x10\x57\xda\x86\xc4\x79\x99\x67\x29\x50\x5b\x6c\x76\x20\x1a\x8b\xb4\x6f\x4f\x0f\x37\x81\x3e\x65\x2e\x7a\x48\xf5\xd2\xc3\x6c\x1d\x28\xdc\x06\xb5\xea\xd6\x0e\x8d\x2b\x93\xdc\xce\xfc\xac\x8a\x6b\x18\x7c\xc7\x73\x27\x3a\xab\x34\xbb\x46\xcb\x53\xa7\xd0\x89\x02\x1b\x95\x58\x69\x6c\x23\xbf\xf8\x70\xc1\xda\x90\x95\xc8\x95\x34\xd6\x53\x70\xd1\x2a\xbf\x77\x20\xa5\x66\xbe\xe7\x26\x49\x6e\x8f\x1f\xb9\xb0\x06\x2a\x18\xc5\xee\xe9\x09\xce\xca\x68\x4d\x94\xcd\xd8\x47\xb6\xf4\x7b\x3b\xd2\x7e\xee\x7a\xaa\x2e\x13\xdf\x40\xae\x36\x8f\x24\x0c\x77\xf4\x7e\x09\x4b\x17\x6e\xd7\x5b\x55\x72\xf1\x98\x57\xf7\xe3\xf1\x2d\x74\xb9\x46\x84\x23\x50\x2f\x21\x4e\xcc\xce\x57\x78\x4c\x04\x33\x85\x04\x53\xe0\xe3\xb9\xd8\x91\xcc\x03\x0f\xab\x20\xb4\x24\xcd\x59\x90\x40\x76\x36\x12\x1f\xbb\x32\x85\x14\x1b\xe6\x12\xbb\xd6\x0d\xf5\xfc\x73\x37\xb3\x2e\x6e\x00\x4c\x86\x55\xbb\xa8\x2a\xae\x8a\xb4\x5e\xb3\x35\x16\xcd\x30\xef\x60\xdc\xae\xf1\x71\x8b\x88\x23\xaf\x91\xd9\xb9\xa8\x21\xf4\xc1\x82\xa9\x55\x59\xe3\x2a\xc1\x0e\xef\x08\x5c\x77\xf6\xbc\x83\x0c\x9b\x2e\xc4\x66\xe8\xc4\x8e\xab\xfd\xba\xab\xfb\xf6\x2d\x84\x6a\x6c\xae\x90\x74\x36\xdb\x4f\x48\x10\x84\xe5\xdc\x64\xf2\xb4\x5b\x00\x1f\xe3\xf2\x86\x6e\xcb\x39\x8c\xe9\xb8\x41\x85\x27\x7d\x4e\x56\x22\xba\x97\x9c\xdd\x08\x39\xd8\x86\x3c\xb9\xeb\x4f\xc3\x7e\x0d\x47\xfc\x39\xd8\xe3\x41\x8d\x52\x68\xea\x98\x81\xb8\xc6\x94\x31\x41\xfc\xf3\x6c\x91\x55\x5c\x7a\x14\x46\xc6\x6d\x67\x1b\x46\x52\x77\x1c\xe4\xde\xd8\x07\xc1\x35\x22\x87\xda\xa1\xc5\x9a\x35\x57\x0f\x79\x0c\x6c\x52\x00\x50\xce\xaf\x02\x82\x5b\x95\x51\xa1\x40\x5b\x97\x99\xb8\xce\x7d\x4d\x35\xc1\x57\x19\x4e\xb7\x51\xa5\x51\xb8\x91\x22\x00\x48\xa8\x30\x03\x71\xb3\xca\x6b\x7d\x3a\x52\x49\x87\x7e\x00\x47\x01\x55\xa2\x99\xdb\x3c\xc0\xc6\xde\xc8\x12\x53\x06\x4d\x53\xd9\xb0\xd0\xcf\x95\xab\x4d\x6e\x60\x73\x9c\x3e\x5f\x97\x9a\x21\x27\x46\xb0\xa8\x1b\x30\x17\x49\x54\x02\xde\x28\x7b\x77\x72\xd1\x95\xaf\xaf\xaf\x22\x3e\x0b\xef\x2a\x11\xb4\x14\x27\x3a\xc4\x3e\xda\xd9\xaa\x4d\xa5\x01\xc5\x5b\x23\x23\x63\xc0\xed\xe0\xa3\x75\xad\x18\x1d\xef\x07\xfe\x18\x1d\xbd\x1d\x27\x2f\x4b\x15\xed\x2a\x2e\xa4\xc5\xec\xda\x38\xdf\x36\x0b\x63\x98\x3b\x82\x0a\x20\x39\x88\x92\x44\x70\xab\x5b\xc0\x2c\xbb\x36\xee\x03\x1e\xb4\xe9\x9f\xba\xcf\x59\x8b\x22\x9a\xbc\x7e\x57\x69\x5d\x8b\x82\x6f\x8c\x34\x6b\x31\x6b\xa7\xa7\xe4\xfb\xf9\x35\x77\x08\xe4\xf1\x35\x77\x65\x63\x17\x5d\x8d\xaf\xce\x47\x89\xb8\x98\x5c\x1c\x84\xdc\x7b\x49\x9b\xc2\x4f\x97\x0f\xb2\xf8\xe1\x4d\x86\x09\x9d\x1c\xf5\xc0\x63\x20\x5a\xaa\xd0\x55\x71\xbb\xce\xa3\x8b\xa1\xc4\xcf\xc9\xda\xc3\x72\xf2\x07\x61\x10\x3e\x63\x89\x87\x7a\x8d\xf6\x75\x99\x19\x38\x64\x1d\x3b\x22\xec\x2b\x38\x5f\x5d\x35\x82\x5e\x46\xf9\xaf\xb6\x57\x85\xa5\x75\x83\xdd\xa5\x75\x63\x7b\xcd\x01\x0b\x40\xf5\x35\xeb\xe9\xea\x07\x97\xec\x3e\xde\xc4\x46\xa4\x2a\xcf\xe6\x60\xf5\x40\x83\x6e\xac\xe7\x9b\x6f\xdd\x6b\x2a\x21\x17\x95\xe9\xef\x5e\xe2\x78\xb4\x45\x27\x79\xb3\x7a\x8f\x19\x3f\x08\x57\xdd\xc4\x23\x73\xfa\xf5\x5b\x57\xf5\x69\x2f\x8d\x4e\x34\x80\x59\xc1\x75\x71\xc1\x79\x87\xbb\xf5\xde\xa0\xf2\xaf\x5c\xe3\xd7\x6f\x68\x7c\x47\x01\x2f\x87\xcf\x4a\x6f\x33\x48\x4e\x11\x67\x90\x36\x26\xf3\xd2\xd6\xf0\x3d\x7a\x30\x56\xf3\x0d\xa8\x9a\xcf\x76\xd9\x57\x64\x97\xa1\xc0\x79\xb0\xae\x3f\xac\xac\x09\xbb\x6b\xab\xdd\x9b\x03\x61\xd3\x6d\xb1\xd2\x1a\xc3\x61\x10\xf8\xa2\x5c\x26\x04\xdc\x84\x14\x4b\x05\x3b\x3f\x69\x54\xf7\x99\x7a\x83\xf1\x30\x3a\x9b\x40\x1d\x37\x55\x6b\x94\xe7\x75\x89\x32\x5f\xf0\xe8\x09\x72\x0c\xb3\xc7\x12\xec\xba\xad\x27\x1e\x62\x58\x1d\x80\xd3\x3a\x0c\x6e\x60\x60\xd8\x82\x47\xfa\xde\x00\x0c\xc0\x9a\xec\xba\xf0\x06\x29\xc5\xb3\x21\x76\x47\xbf\xb6\x07\x9c\x3f\xde\xa0\x8d\x09\x82\x7d\xc3\xf0\xb7\x0f\x35\x04\x73\x4b\x41\x40\x28\xa3\xc1\x90\x17\xec\x50\xdc\xa0\x30\x06\xcb\x6d\x22\x52\xb5\x54\x45\x4a\x04\xd8\x3a\xef\xb8\x73\x56\xb2\x5c\xe7\xae\x30\x1a\x6a\x9b\x78\xb4\x5c\x85\x01\xa5\x30\x28\x48\x28\x8d\x51\x25\x38\x6f\x18\x47\x4b\xda\xeb\x6e\xce\x6c\x41\x0e\xd7\xe8\x47\xcd\xd9\xb8\x77\xc1\xba\x0a\x8c\xad\xdc\xaf\xab\xd1\x05\xea\x15\x74\xc0\x80\xf6\x86\x97\x97\xa3\x8b\xd3\xf1\x5f\xbf\xb7\x93\x03\xbe\x2b\x96\xb0\x42\xde\x37\xc4\x1f\xd9\xbf\x41\x13\x80\x0f\x63\xef\xea\x33\x3f\x99\x50\xca\xb9\xe1\xde\xce\x75\x96\xab\x72\x03\x4a\xf9\x4c\x54\xea\xcc\xe7\x65\xa6\xf2\xd4\x08\x55\x2c\x72\x4d\xfc\x20\xf3\x52\x2e\x3e\xa9\xca\x88\xde\xbf\xff\x47\x8f\x11\xa7\xa9\x83\xcf\xe3\xca\x20\xb6\x87\x2d\xc2\x92\x9d\x03\x38\x10\xfb\xa7\xba\xf8\xce\xc7\x06\xec\x3b\xf8\x81\xff\xa5\x4f\xdc\x29\x3f\x86\xaa\x27\xee\xd5\x1d\x85\x37\x58\x09\x57\x09\xb3\x2d\x2a\xf9\xa3\xcb\x3a\x81\xfb\x89\xef\x1c\x88\x0f\x0a\xd5\x80\x4a\x85\x9f\x66\xc5\x7f\xfc\x14\xae\x01\x63\x10\xca\x0a\x5e\x06\x13\x57\xe0\x54\x73\x06\x6b\x1e\x90\xda\x50\xb5\xa7\x01\x8d\x9d\x4d\x99\x41\x64\xd2\x1e\x86\x3d\x7b\x44\x57\xbb\x58\x14\x95\x34\x99\xbd\x03\x89\x08\x83\x12\x5b\x2e\x1c\xe0\x5d\x6e\x59\x2e\x56\xd9\xad\x3d\xb8\x7c\xda\xe6\xdf\xb7\xdb\xed\xf6\x3f\xc4\xbf\x33\x1c\xb8\x91\xc8\xfa\x8f\x2e\x42\xc6\x78\x2d\x24\x22\x80\xad\x35\xf9\x28\x5f\xef\xb5\xa1\xc8\x14\x14\x65\xb3\x16\x8a\x72\xac\x75\x05\x67\x95\x5b\x21\xce\x52\xe0\x93\x82\xca\x7b\x63\xea\x6f\x07\x03\xaf\x1e\x82\xc8\x91\xb8\xc2\xc1\xf1\xe0\x70\xef\x17\x58\xaa\x0c\xa1\xd9\xeb\x56\x59\x0f\xc0\xda\x11\x81\x4d\x87\x49\xba\xf7\x85\x4c\xd2\xc1\xde\x4c\xa9\xe8\xe5\xbc\x5e\x09\xa2\xbd\x10\x39\x29\x83\x8b\x1b\x57\x95\x18\xda\x67\xb2\x48\xf7\xc2\xd2\xdc\x56\x77\x1e\xa1\xc4\x5f\xe9\x67\xf0\xe4\xf2\xdd\xe5\xaf\xca\xff\x7b\xf8\xfc\xd9\xb3\xe3\x16\xff\xef\x8b\x47\xfc\xef\x37\xf9\xb1\xf7\xd2\xe5\xbb\x4b\x7f\x94\x86\xac\xb6\x71\xf9\xcf\xd1\xab\x57\xaf\xc4\x81\x38\x3e\x3c\x7c\x21\xf8\x6b\x6f\x4b\x5d\x6f\xba\x55\x1b\x76\x29\xf8\x65\xae\x6e\xc1\xfe\x26\x10\xa4\x33\x0f\x29\xf4\x65\xe6\x5b\x0a\xf4\x55\x5f\x58\x0f\xef\x77\xa0\xca\x77\xf9\xee\x8b\x08\xf2\x99\xcf\x15\xe4\xfb\x6c\xd5\xbd\x1b\xbb\x4c\xff\x75\xb3\xda\x0c\x0a\x55\x7d\x86\xd6\x9e\xb9\x47\x6b\xcf\x76\x32\xf1\x3a\x7b\xd0\xe7\x2e\x89\xbd\xe4\x61\x89\x3d\x78\x61\xdc\x36\xe7\x96\xb8\xda\x2c\x5f\x06\xe4\xc7\x85\x01\x1a\x0b\x5d\xfc\x8d\xbc\x51\x9c\x23\xbb\x27\xe7\x5b\x61\x24\xd8\xa7\xbd\x33\xad\x91\xf5\xc1\x36\xd2\xda\xff\x4a\x82\x5f\x69\xfb\x82\x15\xf3\xd0\x01\x71\xa6\x35\xd6\x6f\x6d\x56\x9b\xa5\xd6\x3d\x8a\x1c\x47\xbb\x1c\xc3\xee\xa8\xed\x41\x82\xe0\x29\x2f\x9c\x42\xdd\x09\x87\x64\x8d\x55\xb6\x77\xea\x84\xf3\x41\x63\x5d\x6f\x2f\x02\x28\x43\xcd\x70\xdb\xc4\xa6\x5e\xf8\xa4\x80\xcd\x7a\xab\xac\xd9\x04\x9b\xd6\x39\xce\x5e\x02\x09\xed\x87\x88\x3a\xaa\x81\x10\x74\xc0\x18\xb6\x0e\x65\x0e\xd5\x9b\xcc\x6b\xca\x71\x85\xac\xea\x26\x03\x93\x15\x3f\x31\x48\xe6\x80\x36\xa7\x73\x8e\xed\xd7\xc1\x79\x8a\x5a\xfb\xb0\x5c\x79\x77\x4b\x83\xde\x51\xca\x2b\x38\x7f\x2f\xb4\x68\x30\x1b\x46\x1f\x80\x21\xaa\x42\x2a\xda\x56\x4c\x3b\xb0\x3e\x01\x7b\x17\xb4\x18\x29\x62\xba\x38\xc4\x38\x4c\xdd\x71\xaa\x3a\x00\xe1\xdd\x4a\x56\x46\x43\x06\xae\x79\xba\xfa\xf3\x49\x2e\x3e\x15\xfa\x2e\x57\xe9\x8d\x3d\x93\xbe\x17\x3d\x08\x76\x73\x50\xda\x25\x77\x2f\xdf\x5d\xa2\x42\x4f\xbe\x0d\xb0\xcb\xb0\xc0\xfe\x18\x18\xdf\xb4\x97\x9e\xfc\xa9\xf7\x19\x02\x91\x76\x90\x4e\x47\x3f\x8c\xce\x27\x97\x20\x41\x72\x35\x1a\xbe\xff\xad\x08\x42\x76\xf6\xed\x51\x11\xf2\xb7\xad\x08\x79\x15\x5d\x60\x14\x2b\x83\x3d\x79\xab\xf3\xba\xa8\xac\xa5\xb1\x08\xf3\x15\x58\x0b\x30\xdf\x8a\x75\x8c\xf3\x34\x6d\x78\xb1\x3f\x72\xf6\xe2\xbb\x61\x21\x0b\x4a\x03\xdb\xfb\x56\xa5\xe2\x36\x93\x62\xb4\x96\x59\x2e\x64\xeb\xfa\x3d\xe3\xf2\x99\x90\xbc\x5a\x37\xcf\x2c\xb6\x62\xec\x6f\x48\x2b\xce\xdd\xeb\x46\xa9\xae\x1d\xff\x27\xea\x7d\xeb\xe0\xb0\xcf\xf9\xaf\xaa\x48\xc5\xa8\xb8\xc9\x0a\xd5\x71\x88\xc8\x2a\x7a\xe0\xdf\x55\x91\x0e\x16\x7a\xfd\xa7\xdf\xba\xe3\x39\x78\x32\x5e\xcb\x1b\xf5\x5e\xde\x64\x8b\x4f\xbf\x8a\xfe\xfb\xd3\xc3\xe3\x97\x4d\xfd\xf7\xa7\x87\x2f\x0f\x1f\xfd\xbf\x6f\xf1\xf3\x46\x2d\xed\x4e\xbc\x53\xe2\x46\x05\x90\xdd\x1f\xab\x96\xa1\x94\xab\xca\x88\xbf\xe1\x15\x0e\x75\xdf\x77\xec\x78\xb1\x85\x62\xac\x01\x65\xdd\xbb\x0c\xaa\x7c\xc0\xb0\xf8\x7e\x6f\x5c\x09\x69\xef\x79\xa8\x4b\x17\x95\x06\x57\xec\xff\xe0\x1d\x98\xea\xbb\x22\xd7\x32\x75\xee\x61\xb0\x1c\xdd\x29\x96\x20\x7b\x94\xce\x29\xf7\x03\x76\x1d\xaa\x2c\x20\xff\xb2\xcc\x31\x5b\x83\x07\x18\x92\x1e\x3b\xbe\x09\x4a\xc6\x30\x3e\xe7\x35\xbe\x7f\xd7\xbb\xf0\xf1\x8b\x4f\x9c\xb8\x89\x2d\x1b\x36\xc6\xc9\x28\xa2\x67\x41\x9d\x8c\x43\xaa\x8a\x3c\x9b\x97\x90\x05\x27\x2b\xb4\x85\x4a\x09\xbf\x16\x18\x85\x1d\x9f\xdc\xf9\x54\xf2\xfd\xc2\xc7\x81\xfc\x1e\x3e\x2f\x2b\x2a\x8d\x12\x1a\x9f\x1e\x6c\x05\x10\xf2\x38\x42\x5a\x8f\xb7\x46\x86\x7d\xdb\x38\x83\x3e\x75\x60\xbc\xb6\xde\x8d\x94\x49\xe1\x83\x36\xa5\xae\x10\x47\x3d\xb0\x4b\x60\xa9\xcb\x79\x96\x36\xd6\x40\x90\x85\xc2\xd4\xee\x26\x53\x98\x2d\x0a\x66\xe6\x80\x8a\x7c\xec\xad\xd2\xe1\x19\xea\x8d\x2a\x43\x70\x52\x30\xbd\x00\xc6\x44\x62\x77\xe6\xff\x0d\x67\x7c\x56\xd5\x69\xa6\xc5\xf9\xf9\x49\x8b\xff\x62\xed\xb1\x48\x1c\xe7\xa4\xbf\xec\x78\x00\x39\xb8\xc4\xbd\x10\xae\x99\xaf\xdc\x1e\xbf\x16\xf1\xb6\xdc\xb5\xa4\xff\x7b\xad\x8c\x9b\x0c\x0a\x3b\x37\x66\xc3\xa3\x1a\xc3\xf8\xb6\x23\xce\xc7\x26\x95\x71\x50\x87\xbd\xa7\x35\xf2\x50\xca\xe0\xce\xed\x6a\x09\x0d\x06\x83\xb7\x88\x15\x34\x40\x96\x55\x7a\xd7\x90\x70\xca\xab\x63\x3f\x72\xc3\xbb\xde\x08\xfd\x75\x68\x19\xea\x78\x77\xbf\x21\x60\x4d\x48\xe4\xe5\x3d\x83\x59\x19\x95\x2f\x31\x65\xb9\xec\x28\x30\x8b\xb0\x3f\x60\x5a\x81\x10\x4a\xf2\xc0\x08\x4a\x63\xd4\x1a\xdc\xaf\x68\x14\xb3\x8a\xc6\x8c\x2a\xbe\x10\x21\x1c\x1c\x44\x38\xf2\x9a\x5a\x4f\x6d\x9c\xcb\xc5\x27\xfe\xe5\x8e\xf1\xdc\xb7\x1b\xe8\x86\x70\xfa\x4b\xa5\x52\xf8\x4e\x06\x19\x31\x5d\x97\xf2\x46\xa5\xfd\xc1\xde\x50\x2c\xd5\x1d\x27\xb6\x73\x59\x06\xfd\xa4\x26\xd2\x20\x86\x6f\xc9\x4c\xdb\xbe\xe2\x0d\x8b\x69\x62\xea\xd3\xd6\xc5\x3a\xda\x13\xa8\x0b\x21\xc5\xe9\x0f\xa7\xa1\xfa\xc8\xb6\x41\x46\xd2\xf0\xc9\x55\xe3\x50\x82\x8f\xcb\x02\x31\xe0\x0e\x95\x0d\x07\x99\xb4\x5b\x6b\x09\x72\x0b\x8a\x18\xe5\xf2\x7c\xa7\xb3\x1f\xb7\x2c\xf7\xc0\x84\x46\x45\x0d\x21\x18\x76\x9e\xb8\x58\x08\x66\x9b\x55\x50\x62\xc7\x3b\xbe\xca\xc3\x1b\x76\x2f\x3e\xea\x58\xb4\x2f\x0d\xde\x7c\x55\xc6\xc3\x0c\x7f\x7e\x7b\x79\x2e\x7e\x78\x3a\xc0\xcf\xdf\xad\x14\xc8\x0a\xe8\xd2\x65\xfb\xbb\xaf\x59\xba\xd9\xb3\xca\xd0\xc7\x31\x87\xe8\x19\x99\xf6\xae\x1c\x36\xef\x24\xc6\x53\x5e\xdb\xee\x4d\x5b\xd0\xc6\xd3\x60\xad\x83\xcf\x00\xf0\x99\x7c\x0b\x25\xa5\x8e\x56\x1f\x6b\x1b\xb1\x2e\xf0\x97\x71\x3a\xc4\x77\x07\x85\x18\xbe\x0f\x22\xd9\x47\xaf\x5e\xbd\x3a\x38\x3e\x3c\x7a\xba\x63\x63\x24\xc0\xf3\x53\x1c\x6c\x4a\xbd\xcc\x2a\xa1\xcb\x1b\x59\xb0\x52\x64\xaa\x52\xaf\xff\x40\xd5\xef\xfe\x5c\x58\xcb\x1b\xfc\x45\x4e\x87\x53\x73\x13\x0c\x76\xf0\x5c\xc4\xfc\xab\xbf\x2e\xb7\x45\x03\x97\xf9\x6d\xf8\x2c\xa2\x6a\xc2\x7f\x4a\x0e\x0b\xfe\xfa\xef\x9a\xc1\xe2\xa3\xae\xa1\x5a\xfc\xa3\xae\xcb\xaf\xcb\x59\x11\x96\x17\xfc\x43\xf3\x54\x04\xf5\x4c\xbf\x45\x6e\x8a\xa0\x22\xed\x77\xc0\x47\xb1\x83\x5d\xe1\x91\x83\xe2\x9f\x90\x83\x22\x2a\x66\x78\xe4\x9d\x78\xe4\x9d\x78\xe4\x9d\xf8\x62\xbc\x13\x1d\xb4\x13\xd1\x96\x8b\xad\xcb\x47\xa6\x89\x47\xa6\x89\xdf\x36\xd3\xc4\x23\x8d\xc4\x23\x8d\xc4\x23\x8d\xc4\x3f\x1b\x8d\x84\x1c\x7c\x1b\x16\x89\xf9\xe0\x5b\x92\x48\x2c\x1e\x14\xe4\xfc\xdd\x70\x48\xe0\xc9\x51\x3d\x52\x48\x3c\x52\x48\xec\xea\xfd\x23\x85\xc4\x3f\x1c\x85\xc4\x23\x7f\xc4\x23\x7f\xc4\x23\x7f\xc4\x23\x7f\xc4\x6f\x9f\x3f\x02\x20\xc8\x8f\xec\x11\x8f\xec\x11\x8f\xec\x11\x8f\xec\x11\x8f\xec\x11\x8f\xec\x11\xbf\x61\xf6\x08\xe2\x85\x18\x3a\xb6\x87\x26\xcd\x83\x5d\x4c\x31\x1f\x44\x08\xdf\xf9\x07\x25\x85\x10\xfb\xe9\x4e\x4e\x88\xfe\xe0\x91\x13\xe2\x8b\x72\x42\x74\xad\x87\x26\x17\x44\x87\x2c\xdd\x4f\xe3\x82\x10\x3f\x83\x0b\x22\xb3\x0d\x5b\x63\x81\x85\x2e\x6f\x9e\xe0\x88\x33\x2f\xc4\x60\xb3\xda\x7c\x09\x3a\x08\xf1\x8b\xe9\x20\xbe\x94\x8d\x39\x10\x5f\x80\x0e\x42\x3c\xd2\x41\x7c\x93\x9f\xc1\x93\xe1\xd9\xf9\xaf\xca\xff\x70\xfc\xec\xe8\x79\xb3\xfe\xe7\xe8\xc5\xd3\x47\xfe\x87\x6f\xf2\x33\x5c\x58\xb7\x3e\x5b\x88\x33\x6b\x52\xb8\x73\xb3\x37\x3c\x3b\xef\xf5\xc5\xed\x40\x3c\x1d\x1c\x62\xe8\x60\xc7\x27\xe3\x13\xd6\xa5\x1c\x29\xba\x7c\x0f\x96\x88\xbe\x1a\xa9\xb2\xf6\xfa\xe2\x0e\x02\xd7\x88\x25\x08\x1f\xae\xcb\x5e\x1f\xac\x5c\xba\x80\xe3\x5b\x1d\x0f\x53\xf0\x9b\xf0\x0a\x92\xe9\xdf\xe4\x22\xc0\x84\x74\xde\x51\x55\x53\x15\xf6\xfb\x4e\xb2\xa1\xce\x8e\x87\x3c\x19\x42\x88\xa3\xfe\xbd\x40\x01\x17\x1e\xa0\x2c\x33\xa6\x98\x83\xbc\x72\x9c\x3d\x6e\x64\x99\x5d\x7a\x1d\xaf\x03\x8e\x60\x71\x17\x52\xc6\x1d\x36\xc1\x38\x00\x33\x4d\x1b\x8a\xb0\x2e\xbf\xd5\x8f\x50\x00\xed\xc1\xc0\xbb\x70\x03\xc2\xd4\x74\xd8\xbb\xac\x6e\x10\xc8\xb7\x57\x60\x9e\xab\x05\xd8\xfc\x76\x9a\x5f\x73\x62\x0b\x51\x5a\x84\x5a\x54\x89\x90\xa9\xdc\x54\x89\x90\x79\x65\x0d\x6c\x07\x70\x4c\x28\x42\x46\xc0\xdc\x52\x16\x37\x1d\xad\x49\xd0\x93\x98\x6f\xb1\xdc\x05\x58\x2d\xbc\xaf\x81\x88\xb2\xfd\xb6\x4e\x54\x9f\x50\x76\xf5\x86\xec\x98\xe8\xa1\xdc\xd4\x05\x34\x75\xb7\x7e\x6f\x9c\xbd\x8c\x47\xa9\x1b\x6a\xa6\x09\xad\x63\x27\x2e\xe1\x8a\x00\xb0\xb9\xc9\x2f\x25\x6b\x79\xb1\xd2\x0e\xb9\xe8\x82\x72\xe8\xee\xa7\xd9\xa2\xda\x19\xcf\x0c\x9d\x6b\x5e\x5c\xdf\x79\xf6\x15\x76\x76\x30\x3e\xb6\x56\x69\x86\xfe\x38\x1a\x3c\x9d\x2b\x9a\xc7\x22\x85\xb1\x20\x68\x47\x47\x7f\x19\xfd\x11\xa6\xd2\x14\x8f\x1f\x64\x56\x76\x7f\x07\x31\x35\xfd\xdd\x88\x8e\xaf\xb2\x4f\x70\xf4\x63\xd8\x03\x56\x60\x71\xce\x9d\xb1\xe1\x71\x68\xd9\x61\x1f\xd4\x7a\xae\xd3\x40\x68\xb8\xb1\x00\x8c\x58\xd6\x65\x11\x71\x33\xf8\xd0\xe7\xae\x4d\x8a\xcd\x31\x89\x87\x83\x40\x70\x1f\x41\x1f\x88\x04\x01\x21\x6f\x99\xc7\x48\x11\x82\x7a\xe9\xb2\xfa\xcc\xb5\x88\x28\x9a\x60\xcc\x29\xb1\x76\xa2\x53\x15\x2a\x7f\xe3\x3a\x63\x11\x40\xf8\x33\xa3\xf2\x3a\x70\xd5\x9d\x5b\x61\x17\xd8\x1a\x2b\xa0\x5c\xa4\xc3\xc3\x7c\x63\x40\x75\x10\xee\x5d\xa1\x3f\x18\x84\xce\xa3\x37\x05\x0b\x05\xac\x62\x78\x83\x4b\xe9\x88\xb5\x5c\xac\xb2\x42\x1d\x74\xa6\x56\xc3\xee\x77\x6f\x68\x9f\x4e\x04\x1f\x3a\xfc\x72\xfc\x49\x58\x20\xae\x25\xfe\xf8\x30\x83\x30\x4c\x0f\x3b\xb2\xc1\xbf\x61\x64\x95\x19\x96\x2c\xf7\x81\x05\xbb\x7c\xec\xfd\x86\xa0\x94\xcf\xee\x46\x46\x10\x7b\xef\x78\x96\x6a\xa3\x4d\x06\x38\x12\x17\x64\xdf\x8a\x85\xcc\x17\x75\xce\x05\x2c\xc8\xa5\x24\xb2\x42\xfd\xb8\xb1\x97\xe7\xad\xf2\xc0\xef\x22\xc3\x90\xe0\xc2\x9a\xf6\x94\x79\x59\xe2\xb9\xcf\xc5\x58\xae\x87\x4c\x99\x62\x1a\x67\x68\x7b\xd6\x00\x3c\xd2\x17\xa3\x1f\x29\xbf\x63\xc4\x59\xa9\xd7\xee\x4a\x85\x15\x3a\x10\x17\x74\xd9\x54\x2b\xe5\xf3\x09\x7e\x43\x15\xba\xf1\x27\x2c\x54\x75\x21\x09\xd3\xa9\xf7\x8e\xdf\x03\x93\x84\x11\x48\x3e\xa3\x81\x05\x60\x51\x4e\xc3\xfa\x78\x3f\x9b\xc0\x28\x5e\x25\x1c\x66\x67\x4f\x09\xe9\x80\x82\x94\x4b\x23\x5d\x32\xb0\x03\x44\xe9\x12\xfa\x0e\xa7\xd4\x52\x4a\x33\xf9\xb4\x53\x53\x19\x9f\xce\xcd\xf0\xaa\x09\x20\xc2\xdf\x99\x28\x8f\xe3\x0c\x05\x93\x04\xe7\x11\x64\x7d\x8c\x5a\x94\xaa\x32\x1c\xa4\xd4\x14\xa6\xae\x14\x5c\xf5\xb5\xcc\xa9\xf4\xb6\xda\x02\xfb\x4c\x03\xe2\x96\x45\x80\xa4\x9f\x72\xbc\xa1\x1b\x69\x4f\x37\x3c\x74\xd7\x9c\x41\x0f\x40\x4f\x7c\x84\xc7\x6c\x37\x39\x5b\x6e\xf4\x67\x2e\x7f\xca\x0a\x2e\x7f\x12\xc7\xd0\xd6\xee\x46\xba\x84\x17\xad\x08\xbf\xe4\xe2\xa0\x2b\xfe\x19\xab\x6a\x7d\x95\x41\xc7\x09\x75\xb1\x63\x86\x5c\xc2\x12\xb0\xeb\x9b\x52\xf1\x76\x2c\xf5\x2a\x9b\x67\xc1\x81\x02\x0b\xca\x5b\xb6\x64\x91\x82\x31\xe0\x13\xd5\x7e\xd5\xb9\xe8\x43\xb1\xbd\xf7\x9c\xf2\x49\xe1\x3b\x08\x3b\xc1\xe8\x4b\x7f\x36\xe5\x61\xfa\xd7\xee\x56\xac\xa7\x17\xa7\x6a\x93\xeb\x2d\x54\x8a\x05\xd7\x45\xc7\x9f\xc3\x6b\x03\x66\x3d\x46\xcb\x44\xb6\x55\xb0\xfe\xe3\x36\x77\xc5\x92\x83\xb2\x68\x82\x62\xc8\xae\x5b\xb0\xeb\xab\xe1\x7e\x06\xcc\xfb\xb6\x41\x98\xf4\x51\xd7\x3e\x1f\x83\xe8\x19\xaf\xb6\x1f\x85\x4e\x22\xd3\x30\x0d\x70\x95\x40\x45\x60\x30\xce\x1f\x55\xb3\x10\x8e\x02\x23\x3a\x3e\xfd\x9d\x52\x1a\x14\xb2\x12\xb7\x50\x32\x5a\xa8\x0a\xa8\x6f\xc5\x10\xbe\xc2\x47\x86\xb3\xfb\x9c\x39\x41\xfb\x5c\x2f\xdd\x72\xb6\x27\x03\x2c\x91\xc4\x23\xbc\x2a\x6b\x2a\xc3\x98\x75\x4c\x13\x9f\xeb\xbb\x86\x5f\x36\x47\x11\x13\x2d\x11\xd8\x00\xd7\x24\x09\xa6\x89\xa3\xfd\x05\x56\xca\xbc\xe8\x8b\x61\x00\xf6\x98\xc2\x19\xf3\x20\xf2\x8c\xaf\xe4\xfb\x91\x54\x58\xed\xbe\x13\x75\xa6\x83\x83\x7d\x27\xce\x6c\xe7\xe5\x0f\xc5\x30\x77\xca\x1a\x29\x78\x88\xf2\x13\xdc\x40\xbb\x9a\xd5\x62\xeb\xa3\xa7\xb7\x14\xc8\xe5\x68\x27\xfa\xa7\x00\x08\xc0\xb9\xef\x85\xc3\x71\x01\xcf\x1c\xf4\x9a\xb8\xbf\x66\x03\x39\x4e\xff\xd0\x58\x78\x74\xa0\x0c\xf0\x81\xed\x37\xee\x36\x05\xd0\x74\x08\x71\x8d\xee\x15\x78\x36\x33\x1a\xb1\xfb\x4e\x7f\xd9\x0f\x52\x47\x4b\x71\x59\xea\x5b\x55\x40\x00\x95\x4a\x80\x3b\xb3\xed\xee\x40\xa2\xf4\x80\xf1\xfb\xd9\x7b\xeb\x19\x12\x47\x76\x5d\xe9\x8e\x21\x88\xae\x05\x72\x79\xf8\x4c\xa7\xf1\x8f\xf0\xff\xa5\xf2\xd4\x0b\xcd\x4a\x11\x48\x43\x3b\x1c\x7b\x0b\x49\x1b\x15\x84\x07\xa7\xad\x0b\x11\xb7\x2f\xf4\xc0\x28\xd9\x37\x7d\xfc\xad\x36\x41\xef\xd0\x3f\x8b\x9a\x7f\xef\xe5\x4f\xdb\x25\x5b\x43\x1d\x5e\xa5\xf2\xad\x35\xcb\x17\x0a\x51\x20\xca\x9e\x29\xc8\x0b\xd9\xf2\xe4\x83\x02\xb7\x0e\x68\x70\x47\x34\x18\x5a\xd6\x08\x08\x7f\xfc\x25\xc0\x02\xdb\xa8\x10\x58\xb0\x04\xe7\x2d\x46\x37\xaf\x55\xb9\x58\xc9\xa2\x72\x49\xbc\x52\x2c\xb3\xaa\x70\x39\xab\x90\xcf\x8f\x52\x15\x03\xe0\xc3\x1a\x5d\x5c\x8d\xa7\x23\x31\x1d\xcf\xfe\x22\x86\x33\x71\x35\x81\xdf\xfe\xdb\xf5\x90\x19\xb2\xec\x3f\x27\xd3\xf1\xdb\xf1\xc5\xf0\x5c\x7c\x98\x4c\xff\x22\xc6\x33\xe8\x9e\xf8\x38\xb9\x26\x6c\x8c\xe3\x53\x9b\xda\x6f\x70\x9f\x23\xa8\xb6\x3d\x92\x8d\xa1\xbc\xb4\x47\x32\x86\x09\xc4\xc0\xc0\xe8\x5c\xb4\xd9\xce\xca\x56\x4e\x41\x04\x13\xd4\x60\x0f\xfd\x43\x7f\x37\xe2\xe0\x9a\x11\x06\x8b\xac\x5c\xd4\x6b\x03\xa9\x53\xf3\x35\xc1\x07\x04\x21\x0f\xb7\x51\x04\x07\xa0\x3b\x96\x4f\xb1\x6f\x9d\xf6\xaf\x62\x3a\x85\x66\x68\xeb\xde\xc5\xfa\x2b\x27\xfa\x69\x41\xe6\xd1\x5c\xfb\x6c\xad\x2f\xa8\xa4\x6c\x28\xae\x33\xe0\xdf\xa9\x9a\x89\x23\x36\x2b\x0d\x63\xfa\xf9\x99\x98\xfe\xef\x53\xfa\xdf\x9d\xd6\x57\x54\x12\x00\xb0\xfe\xf1\x32\x11\x64\x40\x54\xd9\x5a\x25\x8c\xf3\xa3\x63\x49\xc2\x5e\x60\x1b\x28\x04\xd7\x61\xe8\x04\xfe\xec\xaa\x76\x89\x1c\x87\x48\x5f\x8a\x34\xaa\x91\x89\xd3\xfd\x0d\x7b\x96\xc6\x0d\xa1\xd7\x5d\xd1\x30\x57\x03\xf2\xf3\x42\x78\x5d\xc6\x4e\x60\x45\x01\xc5\x8a\x0c\xd1\x6a\x6a\xb9\xb4\x3b\xc6\xdf\x0d\xf1\xa6\xab\x34\xe7\x07\x71\x5e\xf0\xb0\xa4\xe1\xd0\xcb\xe8\x9e\xd5\xbb\xef\x96\x06\x66\x2f\x00\x62\xc1\x40\xd2\x15\x52\x69\x6c\x47\x85\x14\x3c\x48\x92\x70\x8b\x54\x08\x79\x66\xaa\xd8\x05\x3a\x0a\x03\x87\xfe\x31\x60\x42\xa0\x31\xd1\xb2\x36\xee\x0b\xa0\x12\xfe\x54\x23\xf1\x85\xdb\x4b\x2b\x5d\xe8\x92\xa0\x21\xbb\x40\xb4\x78\x27\xc1\xda\xc4\xb3\x30\xa8\x52\x93\x77\x54\xd3\x01\x46\x2b\x23\x33\x6d\xfb\xb6\xbb\x1d\x2b\xae\x92\x4d\x89\x5a\x65\xb9\xc4\x52\x77\x7e\x2a\x1e\xaf\x9d\x09\xc6\xe0\xe8\xeb\x2d\x65\x06\x26\x39\x12\xe2\xc2\xbf\x52\x25\xf3\xac\xb8\xe9\xf5\x1b\x33\xd2\x2c\xa2\x09\x2f\x66\xfb\x8a\x8f\x2e\xdb\x0c\x51\x13\x15\x40\xcc\x7c\x24\xa2\x69\xb7\x90\xdd\xd1\xbc\x1c\x60\xfc\x61\xc2\xf8\x98\xa9\x34\x8e\x73\x13\xcd\x1b\xce\x36\x1b\xe4\x47\x87\xfd\x70\x67\x23\x29\x30\xda\x1d\x43\x24\xe9\xba\xbf\x67\xb2\xae\xf4\x5a\x56\xd9\x02\x51\xee\x5f\xb8\x6f\x8d\xe2\xa3\x8f\x48\xf3\xb3\x56\x78\x26\xc1\x82\x06\xcc\xff\xe7\x15\x6c\x25\xae\xda\x2b\x32\xef\x7c\x44\x44\x75\x14\x71\x35\xaf\x07\x34\x4b\x0c\xd8\x1c\x15\xb9\xbc\x99\x71\x23\x62\xc7\x10\x2c\x2a\xe3\xeb\xc7\xfd\x81\x8c\x57\x1e\xb5\xdb\xbf\xac\xa3\xa2\xab\x51\x1e\xb7\xe3\x7c\xc2\xf2\x27\xb8\x36\x5c\xba\x1f\x01\x3d\x29\x72\x5c\xd9\x19\x3e\xea\x8b\x3f\xd7\x65\x66\xd2\x8c\x86\xeb\x07\x55\xd4\x78\x7a\xbe\x75\x59\xf6\x73\x79\x37\x10\xc3\x62\xcb\x6d\xd3\xa5\x30\x75\x66\x1d\xb2\x9c\xaa\x88\xe2\x93\x9c\xfd\xe6\x39\x90\xc6\x10\xd4\x29\x63\x4a\x98\xba\xa4\xd8\x8c\xf8\x5b\xf0\x66\xac\x97\xa0\x0f\x85\x71\x50\x80\xbb\x22\x81\x1f\x16\xf7\x85\x21\x44\x8c\xa5\xd9\x03\x7e\x53\x66\x00\x02\x9e\xd7\x26\xb3\xb6\x5f\x12\x18\x31\x10\xe8\x91\x77\x9e\x84\x39\x7a\xb1\x2f\x7f\xc9\x10\xe8\xb5\xcc\xb3\x45\x75\xa0\x97\x07\x74\x13\x12\x5f\x02\xc6\x2f\x42\x7f\x9c\x86\xfd\xba\x80\xc3\xe8\x82\x26\xe3\x04\x42\xa1\x5c\x07\x7e\x42\x76\x90\x71\x4e\xf8\x38\x3a\x9f\x66\x32\x87\xcb\xeb\xad\xd6\x29\x1c\x6f\xfe\xa2\xc4\x86\xa9\x14\xc7\x7e\xa7\x55\xa2\xeb\x0a\x4a\x2f\x00\x2b\xb1\xd0\x9b\xf6\x5d\x68\x17\xd6\xd2\xda\x1a\x7c\x13\xf2\x62\x74\x51\x25\x13\xd7\xc4\x12\xa4\x04\xc3\x68\xe0\x6d\xa8\x42\xe6\x6c\x82\x07\xb8\x1a\x97\x20\xb1\x43\xd5\x81\x3e\x0a\x07\x9a\x36\x03\xbb\xfd\x8c\x79\x2f\x6f\xc1\x11\xa6\xeb\x2c\xaa\xf8\x6c\x40\x67\x8f\x8e\x21\x40\xa0\xcb\x42\x6d\xcd\x77\xe2\x4c\x59\x9b\x67\x8c\xd1\x1d\x5a\x99\x10\x74\x5d\xea\x72\xa1\xee\x71\xbe\x20\x6e\xab\x20\xe1\xc0\x46\x94\x5f\xc9\x76\x15\x56\x3a\xe1\xec\xc5\x2d\xd5\xee\x23\xea\xc8\x8d\x17\x54\x83\xe6\x78\x36\x95\x0a\x88\xaf\x69\xf5\x18\x1a\x31\x0c\x8f\x47\x78\xd6\x6e\xab\x31\x84\xb3\xfb\xce\x2d\x95\xe2\xbb\xcf\x3e\xd1\x41\xed\x90\xbe\xbd\x50\x01\x7b\x3b\x62\x75\xdb\xa7\x5d\x41\x85\x45\xb9\x83\x70\xca\x2f\x34\x0f\x4f\xfb\xe2\x7d\x66\x16\x2a\xcf\x65\xa1\x74\x8d\x86\x14\x84\x5a\xdd\xe1\xd6\x1c\xf3\xcc\x88\x95\xca\x61\xbc\xa0\xea\x82\x66\xc9\x76\x9b\xf0\x81\xcd\x83\x71\x6e\x97\xe1\x52\x97\x6b\x95\x06\xa5\xc8\xce\x60\xe5\xca\xe2\x2d\xc7\x8a\x45\x56\x89\xe0\xa9\xd8\xd2\x67\xfd\x80\x37\xcb\x36\xaa\xf7\x51\xd7\x3d\x3b\x8a\x57\x91\xc9\x84\xbf\x26\x96\x2b\x3b\x43\x8d\xaa\x0f\xef\xf4\xd4\x9b\x0d\x72\x60\xe4\xfa\xce\x1a\xe4\xd2\xfe\x9d\x69\x28\x1a\x2c\x04\x92\x7c\x27\xd5\xa2\x2c\xa2\x1b\x8e\x22\x6f\x38\xcf\xeb\x4d\x0e\x50\x40\x98\x54\x32\x5d\xc3\x45\x9c\x34\xcc\xbc\x33\xdb\x08\xff\x7c\xc8\xd5\x72\xf7\xb8\x28\xd1\x17\x2e\x87\xfc\x56\x26\x21\x0a\x87\x06\xbf\x55\x66\xee\xa1\xb7\xda\xea\x1a\xdf\x79\x3f\x39\x07\x7d\xa7\xf7\xfb\x26\xb5\x3a\x7a\xde\xc7\xf8\xa5\xed\xdd\x75\x08\x01\xe4\x8e\xb6\x40\x13\x76\xc6\x41\x4c\x00\xf0\xbd\x2e\xda\x5e\x2a\xeb\x9b\x2c\x5c\x0c\x99\x0c\xb6\x8e\x40\x00\xe2\x6a\x73\x79\x87\x0b\x2a\xac\x2d\x59\x67\x86\x40\x02\x10\xb6\xab\x54\xb9\x54\xc4\x87\x2a\xd0\x01\x6f\xd6\x50\x40\x87\x6a\xfb\x2d\x8c\xf7\x62\xaf\x5e\xf4\xc5\xfb\x20\x45\x0b\xa5\x1d\xbb\x5d\x8f\xcc\x04\xa0\x96\xff\xf9\x3f\xc4\xf1\xe1\xe1\x73\x6b\x4b\x94\x60\xa2\x4d\xb5\x51\xc5\x40\x5c\xfa\x00\x58\x9c\x5a\xb1\xb7\x4c\x12\x55\x19\x36\x7c\xb3\x56\x40\xad\x59\xe3\xbd\xdb\xe8\xc7\x24\xa6\xe1\xd2\x30\x97\x30\x8e\xad\x4b\x44\x25\xed\x08\x23\x6a\xe0\x5c\x68\xa5\xcd\x3d\x14\x9c\x27\x3c\x2a\xe4\xfa\xb1\x1d\x74\xc0\xcd\x1f\xf7\xb5\xd9\xd5\xad\x2f\x08\x54\xa9\x03\x11\x21\xd0\xe9\x3d\xff\x3a\x80\x53\x59\xdf\x17\x6c\xca\xac\xf2\x34\x5c\x11\xaa\xca\x34\x60\x55\x0d\x03\xa0\xb3\xc4\x1d\x36\xf3\xc7\x00\x0b\xeb\xd4\x46\x9a\xcc\xb3\xd0\xde\x66\xc3\xec\xfc\x42\x8b\x3b\x81\x24\xe8\x38\x0d\xcf\xce\x7b\xd0\xfc\x36\xe4\x16\x2a\x93\x21\x7b\x4b\x76\x06\xc3\x7c\x3b\x5f\xf6\x1a\x37\x7f\x90\x3b\x00\x04\x18\x7e\x11\xe3\xda\x84\x2b\xf5\x11\xd2\x65\x56\x9a\xca\xde\xf4\xf2\xa6\x94\x9b\x15\x29\xe8\xb8\x50\x2d\x7d\xad\xd7\x00\x7b\xfd\x31\x2b\x8c\x2a\xa9\xcf\x1c\xc4\x83\xb6\x59\x53\xe2\x4f\x3d\x66\x20\x00\x86\x48\x78\x02\xb7\x59\xdf\x79\x3e\x1d\x02\xf0\x2c\xa1\x30\x29\xdf\x0a\x93\xad\xb3\x5c\x96\x3c\x1f\xf4\xcd\xc6\x3a\x06\x30\x0d\x9d\x4c\xe1\xbc\xa0\x83\xe3\x67\xa2\x31\xf3\xe0\x08\x6c\x94\x53\x54\x72\xde\x01\x15\x06\x75\xcf\x9e\xaf\x15\xb1\xf6\x1d\x91\xe4\x4c\xec\x63\x28\xfb\x30\xb6\x77\x00\xee\x85\xfd\xc9\x6c\xdc\x77\x0e\x5f\x48\xbe\x6a\x77\x1d\x0f\x12\xf1\x86\xc2\x06\x50\x65\x80\xf7\xde\x94\xda\x5e\xee\x8f\x78\xdd\x7f\xd4\x9f\xc1\x93\x37\xb3\xd3\x83\x67\x07\x27\xb9\xbd\xb8\xbf\x0e\x08\xf8\x01\xfd\xb7\xa7\x47\x4f\x9f\x37\xf0\xbf\xc7\x2f\x8f\x9e\x3f\xe2\x7f\xbf\xc5\x4f\x2c\xf1\xf6\xc7\xad\x92\xe5\x9f\xc4\x1f\xc1\x22\xfa\x93\xf8\x56\xc2\x6e\xf6\xc4\x7a\x54\x76\xfb\xc7\x53\x76\xb3\xb3\x2f\xd3\x5b\x7b\xa2\x83\xaf\xe3\xbf\xbf\xc6\xb0\x08\x10\x97\x2a\x59\xd5\x25\x46\x76\x5c\x64\x23\xd2\x50\xb3\xfd\x0e\xb1\xa1\x5d\xba\x4f\xe0\x1b\xc0\x5c\x76\x2b\xb8\xf8\x32\x17\x75\xab\x72\xbd\xf1\x39\xdc\x88\xa1\x99\xf9\x89\x9a\x18\xb2\x36\x4f\xe1\x4a\xe7\x98\x15\x6b\xa0\xc9\x28\x72\xe4\xd1\x64\xbf\x08\x09\xd6\x12\x2c\x70\x25\x30\x3b\x35\xed\xee\x97\xac\x3a\x99\x5c\x7e\x9c\x8e\xdf\xbe\xbb\x12\xef\x26\xe7\xa7\xa3\xa9\xcb\xda\x36\x84\xaa\xfe\x59\x64\xaa\x5a\xfd\x79\x94\xa2\xfa\xed\x48\x51\xfd\xda\x97\xdb\xe3\xcf\x83\x3f\x83\x27\xb3\x6c\x7d\x79\x7e\x70\xfc\x15\x2b\xc0\x1e\xb0\xff\x9e\xbd\x7c\xf1\xb4\x69\xff\x1d\x1f\x3f\x7d\xb4\xff\xbe\xc5\xcf\x0c\xb5\x9a\x2e\x01\xf8\xe4\xab\xba\x60\x51\xf4\xc5\x65\xa9\xe4\x7a\x9e\x2b\x94\x55\xeb\xfe\x2c\x68\xae\xc3\xe7\xe1\x3f\x21\xe4\xb4\xd2\x65\xd5\xb7\xce\xb0\x14\x9b\xdc\x9a\x5c\xae\xe0\x13\x1e\xe1\xcd\x13\xbd\x04\xa5\x0a\xbb\xfa\x20\x27\x73\xa7\xcb\x94\x21\x97\x84\x70\x45\x16\x5b\xc0\x3c\x6a\x99\x73\xe8\x01\xca\x91\x0f\xec\x85\x7c\x53\x4b\x08\x35\x11\xd2\x24\xcf\xed\x55\x5d\xe2\xa7\x96\xa5\x52\xa9\x06\xe6\x2a\x08\x00\x32\xd7\x40\x71\xe3\x7d\x65\x0e\x79\xeb\xc2\xbe\xbe\x48\xed\x77\xe5\x5c\xd3\x3b\xd7\x4a\x82\x95\xc3\xa8\x7b\xdb\x4f\x48\x29\x6c\xb9\x6a\xdb\xc1\x78\xa1\xc4\xa1\xcd\x2f\xe0\xfa\x77\xff\x50\x1f\x0f\x0e\x41\x1f\x03\x47\x32\x28\xa3\xab\x02\x61\x97\xef\x4c\x68\x62\x07\x64\xee\x1c\x78\x66\x82\x27\x64\x3a\x41\x7c\x00\xc8\x16\x21\x8e\x2f\x2b\x6c\x23\xf7\x43\xe4\xb4\x83\x3c\xf7\x07\x31\xb7\x80\xeb\x2e\xe7\xe6\x21\xef\x11\x12\x3f\x20\x4d\x37\xd6\x7b\xc8\x66\x35\x16\x8f\x98\x17\xe2\xb1\x4f\xbf\x21\xe2\x45\x2a\xe3\x41\xf9\x15\x46\x20\x80\xf9\x77\x20\xae\x8d\x8a\xbe\xe9\x10\x44\x14\xae\x7e\x8d\x1f\x7b\x2f\x3f\xa9\x76\x09\x18\x58\x70\x62\x1f\x8c\xaf\xcc\xb0\x68\xaf\x14\x58\x19\xa6\x52\x2a\x33\xa4\x67\x58\xef\xa7\xc9\x54\xc9\x85\x2a\x0c\xbc\xa4\xef\x0c\xf6\xc6\x10\xec\x69\x56\x38\x84\x09\x59\x19\x7d\x83\xb4\x65\x1d\x7f\x64\x28\xca\x43\x21\xc1\x6a\x2b\xe6\x5b\xea\xf6\x25\x23\x37\x73\x44\x9d\x12\xb1\x06\x64\xc4\x3d\x06\x0a\x92\xd2\xac\xfb\x43\xbd\x38\x57\x12\x78\x9f\x71\x5a\x37\x4a\x6f\x72\xbb\x52\x9a\x6e\x85\xf1\xec\x19\x81\xdb\x40\xe9\xd5\x98\xef\x2c\x2b\xb0\xcc\xf2\xb5\x6b\xda\x6d\xe6\x88\xaf\x22\x49\x84\x79\x9d\xe5\xa9\x40\x18\x2c\x64\xc8\x4c\x25\x73\x12\x29\x70\xbf\x75\x58\x8e\xa5\x5c\xa8\x20\xc9\x80\x88\x6e\x41\x85\x66\x18\x3e\x53\xd2\x40\x22\xc8\xae\x14\xf0\x23\x95\x09\x14\x6b\xb9\xc7\x0e\x8a\x8b\x61\x51\x75\xab\x4a\xd8\xc0\x18\xc8\xa3\x5d\x0a\xc1\xef\xb9\xa9\x24\x00\xca\xc2\x50\x1c\x74\xd2\x51\xe3\xd0\x0e\xed\x07\x9c\x60\x29\xf4\x76\x59\x97\xc4\xf7\x89\x91\x7b\xcf\xdd\xee\x90\x0d\xec\x48\xb9\x05\x15\x92\x69\xcb\xa2\xd0\x75\xb1\x70\x40\x83\x0c\x7a\xd8\x56\x39\x90\x95\x07\xdd\x5f\x01\x8d\x2f\x72\x22\xad\x21\x34\x5e\xdc\x84\x72\x4f\x76\x39\xe1\xc9\xa3\x4a\x5a\x39\xbc\xb1\x2e\x26\x81\xcd\x3e\x10\x17\x44\xd8\x68\x57\xce\xa7\xac\xe0\x26\x8e\xe3\x7d\xe9\x12\xa7\x5b\xa0\xd0\xe5\xe8\xaf\x17\x46\x86\x8c\x1d\x67\x46\x29\xeb\xc3\xdf\xa9\x37\x3c\x1c\x72\xad\x6b\x22\x2e\xdb\xc8\x8c\x78\xdc\x60\x23\xe2\xb4\xfe\x5d\x95\x5a\x64\xbc\x83\x52\x64\xa2\x94\x00\xc4\x87\x2e\xf6\x07\x51\xdc\x93\xdf\xe7\x6b\x4f\x3a\x48\x85\x08\x4d\x4b\xba\xdc\x9d\xe8\xc1\x41\x4f\xec\xdb\x53\xd5\x49\xa7\x01\x50\xa4\xdc\x12\x5b\xb2\x6d\x4d\x0e\xea\x50\xf4\x5e\x50\x2a\x24\x79\x30\xcc\xed\x72\x34\xd8\x53\xa5\xa0\x67\x07\x63\x64\x08\x2d\xe1\xbe\xce\x78\xbc\xad\xae\xfb\xaf\x83\xf3\xdc\xd7\x48\x39\x5a\xe9\x7c\xeb\x78\xd1\x7c\x7c\xd7\x05\x54\x71\x75\x29\x14\x47\x0a\xa0\x37\xd9\x32\x98\x74\x62\x87\x94\xf3\x0c\x05\x5c\x21\x26\xbf\xfb\xac\xe9\xf1\xc2\x0f\x5f\xa5\x0c\x2b\x3f\x7e\x52\x6a\x43\xa5\x51\xf4\xfa\x6c\x89\x37\x1d\xbc\x80\xcf\xcc\x21\x5e\x95\x9b\x12\xd8\xad\x70\xdd\x80\xc3\xdb\xe2\x04\x0a\xa2\xd1\x9d\xa2\x5a\x30\x34\x83\xbd\x26\x4b\x04\xfd\x7b\x8f\xd7\x43\xaa\xdd\x2a\xf1\xfb\xe0\x4e\x7a\xfe\x1e\x1e\xe4\x4a\xfd\x58\xbd\x16\x59\xf5\x9d\x01\xb9\x44\xf7\xd4\xb5\x13\xf3\x6e\x27\x37\xc4\x32\x2b\x52\xb1\x52\xf9\x66\x59\xe7\x03\x71\xa5\x85\xbc\xd5\x59\xca\x11\x7c\x5d\x24\x62\xe5\x28\x81\x70\xf9\x92\xfd\xe0\xbb\x13\x3d\x56\x15\x51\xc6\xc3\xce\x5a\x3c\xb5\xd4\xde\x0e\x53\x80\xfa\x8f\x9d\xd9\xb7\x56\xcf\x52\xa9\x1c\xef\xc8\x96\x56\x58\x73\xc5\x64\x46\xf4\x9c\xa0\xc8\xce\x77\xf4\xfa\x0d\xaf\x6c\xf0\x64\xbd\xc9\x16\xab\xe3\xaf\x48\xff\xf0\x90\xfd\x7f\xfc\xb2\x1d\xff\x3d\x3a\x3e\x7a\xb4\xff\xbf\xc5\x8f\x8b\xbf\xc0\x61\xe5\x23\x73\x60\xbb\xfb\x2c\x17\x93\xa0\xd1\xdd\xe5\xf8\xc4\xf0\x7c\x49\x3d\xed\x3f\x07\x23\x11\xe0\x05\xb7\xd5\xbc\x5d\x2a\xb7\x29\x75\xae\x6f\x6a\x15\x3e\x82\x59\xbc\x01\xc3\x82\x26\x46\x9e\x99\x0a\xae\xbf\xe0\x63\x21\x4d\x10\x96\xb5\xec\xfd\x9f\xc2\xae\x1c\x71\x5d\x64\x90\x4f\xc5\x96\x9d\xac\xb2\x85\xbc\xd1\x7b\x71\x56\x3a\xe4\xfa\xc7\x78\x5e\x44\xa9\x1a\x68\x21\x34\x2d\xcb\x84\xeb\x50\x22\xd1\x52\x4e\xc9\x32\x64\xdb\xc7\xfb\xa4\xa1\xa4\x2c\x44\x2a\xbf\xdf\x1b\x96\x37\xba\x28\x14\x61\xcb\x64\x2e\xce\x51\xa4\x47\x97\x5b\x12\xbc\xfe\x30\xb0\xff\xb1\xd9\x7c\x2f\xf6\x5f\x3c\x3d\xec\x8b\xe3\xe7\xc7\x07\xcf\x9e\x1e\xfd\xe1\xb5\x38\x1b\xfe\x35\xfc\xe5\xf3\x57\x7f\x78\xf1\x5a\xa8\x83\xb5\xcc\xf2\xef\xc5\x8d\xfd\xce\xbf\xae\x17\x66\x20\x8b\x7c\x70\xa3\x6f\xc5\x68\x20\xce\x6b\xf3\x29\xfc\xca\xcb\x3f\x3c\x3f\x7e\xe0\x39\x79\x6d\x3e\x45\x8f\x79\x2f\xab\x95\x82\x9b\x87\x05\xff\x08\xe7\x3e\x5b\x64\x90\xf7\x3f\xcd\x08\xe6\x73\x4f\xdf\x12\xf7\xc7\xf1\xb9\x78\x71\xf8\xec\xe9\xab\xbd\xb7\x93\x1f\x46\xd3\x0b\x88\xb1\x9d\x8f\x4f\x46\x17\xb3\xd1\xde\xa5\x2e\x63\x96\x56\x8e\x34\x13\xbe\x9f\x63\xaa\xe0\x58\xf8\x08\x30\x0b\x2d\x5e\x0f\x66\x03\x02\x39\x02\xc4\x84\x91\x7a\x68\xc8\x97\x2d\x50\x5c\x93\x37\x44\x7d\x0f\xbf\x0e\x9e\x10\x00\x18\xd0\x92\x31\x8a\x09\xdd\x60\xba\x59\x89\xce\xae\xaa\xca\x38\xc2\x37\xb0\x7d\x0e\xea\x0d\x30\x13\x04\xc4\x04\x21\xd2\xdd\x91\x19\x84\xd2\xaa\xd0\x69\x57\x48\xe0\x56\x51\xb7\x4c\x47\xf7\xd2\x64\xc6\x06\xa7\xce\x41\x3b\x12\xc2\xee\x9e\x80\xc1\x57\xb9\xa0\x53\xef\x5e\x8a\x69\x12\x1e\x77\xbb\x7e\xe9\x7d\x50\xdb\x43\x92\xcb\x54\xc9\xb8\x00\x33\xca\xce\x16\xd6\x42\x6c\x74\x61\x34\x13\x57\x15\x42\xde\xa8\x62\xb1\x6d\x80\x2a\x67\x15\xd4\x00\xf8\x41\x8e\xa3\xf4\xd1\xa7\x7c\x95\x77\xe7\xa6\xee\x28\xe6\x56\xeb\x4d\xae\xb7\x4a\x41\xe9\xf6\x27\x02\x4c\x39\x77\xa7\xab\x5e\x09\xaa\xd9\x4d\xbd\xa6\xcf\x22\xfe\x2a\x20\x10\x2c\x1b\x74\x7d\xce\x3e\x91\x8b\x45\x5d\xca\xc5\x16\x2b\x3f\x72\x85\x5c\xa4\x09\xe5\x3f\x96\x75\xce\xd4\xa4\x58\xf5\xe2\x8a\xf2\x13\x6b\x1e\xca\x52\x56\xb5\x49\x38\x67\xc0\xe4\xb9\x50\x67\x0f\xc7\xa7\x36\xd4\x38\xa7\x5a\xc4\x2a\xb7\x95\x01\x23\x06\x8b\x76\x11\xb4\x81\x40\x62\xb1\x81\xf5\xa0\xf2\x2d\x55\xb7\x51\x29\xd9\xe7\xc4\x5f\x07\x4f\x26\xe7\xa7\xc3\xcb\x83\xe3\xc1\xf1\xe0\xe8\x57\xd1\x7f\x3f\x7c\xf6\xf4\xe8\xa8\x1d\xff\x7b\xf6\x78\xff\x7f\x8b\x1f\x7b\xeb\x4f\x36\xaa\xb0\x8b\xa0\x61\x2b\xee\xfd\x40\xe8\x24\x58\x1b\x89\x38\x12\xef\x65\xb9\x58\xd9\xcb\xf6\x70\x57\x0e\xb8\x95\xfc\x23\xf6\x5d\x26\xdb\x8d\x93\x93\xfb\xbd\x19\x7d\xae\xd7\xff\x07\xcb\x11\x77\x30\xca\xe3\x2d\x48\xb1\x94\xf6\xc3\xe0\xdb\x40\xbe\x48\x42\x0d\x4d\xed\x8f\x48\x67\xf5\xb7\x98\x2e\xbe\xe2\x64\x6b\x8f\x57\x54\x0f\x7b\x41\x0c\xff\x3f\x2f\x85\x3a\x6b\x6b\xbe\x77\x67\x4e\x1d\xa6\x9e\x97\xf3\x99\xae\x8b\xd4\xd7\xba\x3d\x1b\x88\xcb\xcf\x78\x0d\x7b\x6e\x73\x1f\x5a\xf0\xdd\x29\x20\xe2\xb9\x0d\x7f\x85\x92\x0f\x34\x9c\x59\x49\x99\xe4\x5f\xda\xd8\xe7\x03\x71\x5a\x2b\xb1\xb0\xd6\x66\x48\x10\x6a\xbd\xfb\xc2\xe1\x18\xdd\xc6\x2d\x35\xd8\x37\xfb\x01\xed\xa4\xde\xa8\x22\x4f\xe5\x06\x38\x27\xfb\x8e\x11\xbe\xfb\x9d\x24\xde\x73\x9b\x31\x27\xa6\x73\x9f\x61\x80\xb2\x35\x86\x84\xb3\xb5\x1a\x88\x91\x5c\xac\x9c\xf6\x24\x13\x4b\x66\xc5\x4d\xed\x18\x90\xa4\x03\x36\x16\xf5\x7a\xae\xca\x36\x66\x76\xd6\x08\x0d\x44\xe8\xfe\x10\x55\x66\x08\x40\xdc\x11\x42\x40\x7a\x59\x56\x73\x0b\x3e\x1d\x69\x81\x3f\x90\x4f\x87\xc2\xe0\xcb\xd1\x05\x8e\xc7\xe4\xfa\xe2\x74\x78\x35\x86\x6c\xec\x29\x66\x5b\xc7\x6f\xae\xaf\x26\xd3\x99\xf8\xcf\xff\x84\x44\xfb\x77\xdf\x35\x33\xed\xa3\xd3\x7f\x96\x5c\xfb\xae\xbe\xda\xe6\x5f\xcd\xe2\xee\x3e\xa6\xe1\x7f\x3b\x69\x78\xb7\xdf\xc1\xa9\xf7\xec\x18\xf7\x1d\x41\x2d\xc1\xf4\xc3\xc3\x5d\x67\x47\x62\x6f\xb2\x3b\xad\x53\x71\x02\x80\xfe\x13\x99\x67\x4b\x5d\x16\x99\x4c\xc4\xf5\x6c\x88\x30\x22\xa4\x00\x11\x53\x06\x91\x85\x68\x71\x82\x88\x37\x12\x31\x29\x8a\x7e\x56\xd9\x3a\xaa\xdd\x0d\x2e\xd2\xc0\x4b\x7b\xc4\x1a\xfc\xcc\x9f\xc1\x93\xc9\xd9\xf9\xc1\xd1\xaf\xc8\xff\x7a\xf8\xf2\xd9\x61\xd3\xfe\x3f\x7a\xf1\xec\xc5\xa3\xfd\xff\x2d\x7e\x66\xe3\x73\xb8\x13\xc4\xd9\x24\x88\xc7\xb0\xe5\x7f\x34\x38\x14\x07\xe2\xf8\x58\x5c\xe8\x5b\x65\x6f\x72\xa8\xfc\xd8\xbb\x9c\x8e\x86\xef\xdf\x9c\x8f\x20\x66\x78\xa3\xad\x85\x18\x9c\x25\xe2\x4c\x7b\x4a\x47\xb1\x3f\x39\x3b\xef\x0b\x0a\x66\x98\x2a\x5b\x03\xeb\x4c\x10\x05\xa1\x70\x0e\xd7\x06\x2d\xb4\xde\xa8\x12\xa3\x1b\x4b\xfb\xa0\x0d\xda\x36\xc8\x94\x48\x3a\x00\x64\xd5\x16\x15\x91\x81\xea\x82\x4a\xf2\xd1\x30\xe0\xaa\x04\x4c\x6c\x82\x65\x52\x65\x0b\x97\x08\x81\xfa\x2a\x8a\xe6\x39\xd2\xc0\x02\x81\xf4\xcb\x52\xae\xd5\x1d\x15\xf2\x60\x10\xd3\xbe\xc7\xc1\x00\x01\x46\x90\x06\x82\xbb\x18\xd4\xdc\xc8\xb2\xe2\x22\x22\x5f\xad\x6b\x20\x9d\x27\x26\x67\xe7\x98\x58\x32\xa1\x61\x92\xd2\x83\xa9\x8e\x0e\xdc\x7e\x53\xd5\x29\x04\x27\x5c\x85\x08\x12\x78\x86\xa7\xe2\xb2\x54\x50\x5f\xee\x99\xf8\x30\x47\x53\x42\x6d\x81\x30\x3a\x67\x68\xe4\xda\xa8\xfc\x56\x51\xb5\x2b\xbc\xac\x25\xc9\xd1\x8a\x24\x2d\x64\x01\xf5\xbe\x75\x91\xe6\xb6\x21\x76\xd6\xd3\xd4\xfe\x57\xdc\x0a\x50\x73\xb5\xaf\x72\x70\x03\xe7\xf2\x75\xf9\x66\x45\x20\x0d\xd4\xca\xd9\xdb\x2f\x91\x68\x61\xd0\x56\xe2\xa7\xe7\xcf\x9a\x20\x11\xe3\x45\xc3\x4a\x95\x2b\xe9\x2b\x38\x7c\xba\xb0\xda\x6e\x54\xc0\x8e\x35\xd8\x3b\x1d\x9d\x8d\x2f\x90\xc7\x7c\xaf\x07\x2b\xd4\xf9\x9e\x02\xa8\x2d\x1d\x67\x71\xc0\x37\x51\xb5\x88\x73\x0f\xb0\x33\xa0\xab\x88\xff\x4e\x65\x25\xc3\x7f\x07\x1e\x25\xfe\x22\x4a\x91\xd3\x77\x42\xa7\x6b\xaf\xc7\xb7\x22\xee\x9c\x0b\xb9\x8e\xda\x64\x1b\x11\x35\x98\xe8\xfb\x8d\x30\x4a\x01\xc1\x11\x02\x5e\x18\xb5\x80\x03\x80\xc3\x6d\x3f\xe4\x8a\x63\xb0\x72\x38\x86\xc1\x3a\xef\x76\xb0\xd7\x9b\x55\xb2\x48\x65\x99\x0a\xda\xfe\xcd\x46\x30\xcf\x2f\xda\xd8\x71\x93\x16\x7a\xbd\xd1\x05\x7a\xc9\x31\xd5\x3c\xe5\x25\xbd\x41\xf1\x0e\x90\xb7\x83\x3d\x5f\xef\xd4\xf1\xbe\xc6\xea\x84\x41\xf7\x88\x62\x89\xf9\x4e\x4a\xd3\x57\x3a\x11\xa9\xca\x95\xc3\xa4\x40\xd6\x3f\xab\x30\x13\xf9\xff\xfd\x5f\xff\x37\xef\x50\x57\x7c\xae\x73\x25\x0e\x0e\x42\xa2\x82\xa0\xfd\x9c\x9d\x6c\x8c\x46\x02\x38\x18\xbb\x4c\x01\x1a\x00\x51\x3d\x43\xa5\x7a\xf6\x4c\xe2\xac\x67\x3c\x2e\xb6\x2b\xa2\x50\x77\x42\x15\xb7\x59\xa9\x0b\x1a\xea\x21\xa4\x06\xda\x1d\x36\xd9\x4d\x61\x57\xb8\xb2\x6f\x51\xf6\xbf\x36\xa5\xbe\x29\xe5\x7a\x0d\x94\xc9\x6a\xb1\x2a\xb2\x85\xcc\xc1\xa1\xc4\xe2\x55\x06\x7d\x94\x06\x2a\xef\xb5\x07\x2f\xfb\x7a\xb7\xa8\x49\x83\xbd\xcb\xd1\xf4\xfd\x78\x36\xb3\xa6\xff\xff\x1e\xd0\xfb\xdf\x9b\x2a\x49\x30\x0d\x69\x0f\x68\xd2\x3b\x66\xfd\x48\x7c\x33\xf2\x9d\x10\x37\x43\x40\x53\x1a\xbd\x3a\x71\x09\x17\x7b\xd0\x6d\x13\xaa\x96\x5b\x2b\x78\x20\x1c\x35\x9e\x0c\x3a\x3c\x6f\xf0\xb8\x36\x2a\xcf\xe3\x93\xb1\x2e\xdc\x3f\x63\x7e\x97\xc6\x6b\x3f\xa7\x26\x8e\x58\xbc\xc3\x98\x74\x63\xd7\xf9\x98\x73\x06\x85\xdc\xae\x40\xd8\x2f\x1e\x08\x95\xbb\x95\xa3\x83\xe2\x2b\x5a\x45\x9e\x5a\x94\x0f\x6a\xcc\x2d\x30\x33\xf2\xbd\xdf\xed\xec\x9d\xa3\x68\xe0\x23\xfb\x73\x0f\xea\xa6\x5c\xa3\x27\xbb\xa5\x00\x96\xb9\x27\xe8\x44\xb1\x25\xef\xad\xc3\xc9\x0d\x70\x8c\x22\xca\xf8\x31\x73\x38\xa8\x0c\x16\xe9\x01\x52\x88\x3b\x79\x50\x7b\xac\xd7\x6b\x59\x78\x92\xdb\x95\x92\x80\xc1\xd3\x65\x17\x0d\x41\x8b\x13\x77\xad\x2a\x49\x47\x30\x68\xb7\xb0\xc2\x08\x14\x68\x96\x2e\xa2\x06\x2a\xba\xd1\x9d\xa9\x8d\xd3\x7b\xa1\x36\x2b\x69\xb2\x7c\x2b\x6e\x33\x75\xe7\xcf\x2d\x7b\xb6\x32\x85\xf2\x85\x6e\xcd\xc9\xee\x29\xe1\x50\x47\xfb\x70\xdf\x37\xfd\xa4\xeb\x48\x72\x7a\x5e\xac\xa4\xd8\x15\x37\x6a\xf2\x87\x75\x9c\xac\x98\x8a\x0c\x40\x4b\x11\x2b\x7f\x9e\xe3\xa9\xa3\x0a\x54\x0f\xd6\xa5\xcf\xcb\xb6\xb6\x0d\x02\xa4\xdc\x1d\xbe\x56\x45\xed\xc5\x63\xf0\xe8\x81\x3f\x84\x3a\x32\x38\xa8\x09\x59\x4f\x10\xe4\xa1\xc0\x9f\xc3\x74\x66\x92\xd0\x73\x78\x99\x96\x7a\xed\x0c\x26\xa4\x08\xe6\x50\xa2\xe3\xcd\x6b\x77\x93\xe1\x12\x78\x94\x06\x1f\x8c\xa7\xc2\x73\xb3\x04\x11\x48\x0a\x3b\x26\x61\x28\x92\x0b\x5d\x90\xbf\xa6\x39\xcf\x1e\xab\xd3\x04\x62\x04\x3c\x7f\x24\x4f\xbe\xab\xc1\x1c\x8e\x0d\x5a\x5c\xba\x88\x6a\x56\xde\x37\xed\x4c\xc6\x7a\xd5\x9e\x24\x77\x02\x42\x94\x8c\xff\xb5\x63\x81\x71\x42\x3e\x12\x8b\x31\x78\x75\xf9\xbd\x9c\x38\x99\x54\x1a\xb7\xb6\xb6\x8c\x37\x34\x7c\x9c\xcd\x5e\x2b\x17\x10\x52\xda\xbb\x0a\xe3\x78\x73\x85\xc8\xd4\xa2\x06\x05\xb9\x54\x00\xc2\x26\x5b\x86\xf7\x2f\x9f\x32\x51\xe8\x1e\xa4\x6f\x55\x15\x27\x2d\xdf\x8d\xd0\x57\xe9\x8c\xe8\x51\x35\x4c\x4b\xcb\xe6\x63\xac\x5d\xd3\x2e\x92\x09\xa2\x75\x1d\x21\x29\x0a\xcf\xdc\x13\xa3\x4b\x3e\x23\x40\x77\x71\x2a\x2e\x26\x17\xa1\x6c\xa2\x7d\x90\x43\x60\x24\xe2\x72\x78\x05\x5a\x8a\x57\xd3\xe1\xe9\xe8\xfd\x70\xfa\x97\xc4\x05\x8c\x04\x7c\x64\x57\x54\xef\x33\xaa\x68\x60\xfc\x12\x17\x82\x73\xcf\x0d\x42\x57\x7e\x04\xec\x17\xde\x8e\x2e\x46\xd3\x28\xb4\xd7\x1d\xf9\xdb\x15\xe5\x8b\x22\x66\xc3\x0b\x31\x3c\xc1\x60\xe3\x59\x10\x3e\x83\x48\x59\x18\x13\x4b\x5c\x4c\xec\x6c\x3a\x79\x9f\xb4\xc2\x61\xf6\x61\x1c\x15\xbd\x9a\xc0\xef\xda\x0b\x62\x32\x85\x6f\x53\x07\x4f\x47\xc3\xf3\xf1\xc5\xdb\x99\x6d\x46\xeb\xb3\xbf\xfb\xb8\xd1\xe0\x49\xaa\x36\xa5\x02\x2a\xe3\xff\xa6\x4e\xb4\xf9\x0a\x95\x20\x0f\xd5\xff\x1e\x1e\xbf\x68\xc4\x7f\x9e\x1d\xbf\x7c\xf9\x18\xff\xf9\x16\x3f\xf6\x42\xb1\xd3\xee\x0e\xeb\x5b\x97\xf4\x3d\xc4\x53\x1c\xd4\xd1\x32\xaf\xf7\x62\x3f\x8d\xa4\x4a\x23\x8a\x0d\x88\x13\x5d\x2c\xb3\x9b\xba\x04\x83\x6c\x82\xe1\x9b\xe2\x46\xcc\xb6\xa6\x52\xeb\x41\x70\x11\xee\x9f\xf4\xc5\xd1\xab\x57\x7f\x48\x20\xaa\x9c\x40\x2a\x19\xfe\xff\x51\x82\x18\xae\xa9\x4a\xc5\x3b\x59\x25\x62\x5c\x2c\x06\x7b\xd0\x30\xdb\x04\xeb\x7a\xb0\xd9\x8a\x22\x6e\xd6\x64\x8b\x90\x58\x08\xdb\x7f\xe2\xf5\x96\xb3\x6a\x17\xee\xf4\xed\xc5\xb5\x78\x0b\xea\xef\x79\x13\x82\x29\x0d\x42\x65\x42\x2d\x0f\xe0\xb6\x70\xf6\x84\x8f\x7b\xbf\x66\xdb\xd6\x0d\x19\xb0\xcb\x38\xaa\x06\xb0\x86\xfa\x08\x2e\x91\x95\xff\x9c\xef\x57\x78\xad\x92\x05\xb6\xd2\x1b\xe5\xc0\xe2\x77\x19\x49\x5b\x03\xac\x04\x0b\x61\xf8\x62\x0b\x6e\xa4\x8f\xaf\xbd\xc6\x00\x64\x07\x57\x8a\x61\x2e\x81\xf4\xe2\xb2\x95\x56\xfa\x2c\x85\x5e\xd6\x72\xbb\x67\xd0\x96\xcc\xbb\x93\xaa\x4a\x66\xb9\xc1\x52\x0f\xca\x59\x42\xdd\x49\xa9\x16\x0a\xf2\xad\xb1\x73\x78\xdf\x44\x04\x22\x1c\x27\xda\xbc\xb6\xe6\x42\xa1\xab\x04\x3d\x5f\xe7\xd8\xee\x98\x1a\x5c\x3f\x89\x78\x7e\x24\xce\x4a\x59\x7c\xca\xc1\x2b\x4b\xc4\x59\xb6\xac\x56\xe2\x2c\xd7\xba\x4c\xc4\x1b\x6d\x2a\xfb\xd1\xf7\x43\x71\x78\x7c\x74\x74\x78\x70\xf4\xf4\xf0\x08\x32\x16\x7b\x43\x23\x24\xd3\xd4\x7a\xde\x48\x40\x00\x93\xd1\x0b\xfe\x04\x54\x3b\xb0\x35\xab\xd6\x20\x2a\xe9\xea\xa0\xd7\x72\x51\x6a\x72\x63\xf2\xac\x50\x82\x09\x61\x4d\x90\x75\xb6\xcf\x81\x90\xc5\x96\xd8\x35\xec\x66\xf3\xa2\x84\x14\xc0\xfc\x84\x8b\xc1\x91\x00\xde\xb1\xc6\x10\x83\x03\x24\xe2\xb0\x02\xfc\xaf\x7b\xb6\x7f\x98\x93\x17\x72\x4e\x67\xc0\xd6\x84\x38\x3b\x20\xad\x02\xc5\x00\x8d\x92\xfc\xb7\xaa\xf4\x1b\x61\xf7\x74\x39\xb2\x9c\x66\x81\x08\x81\xa6\xb8\x09\x58\xbd\x50\xd1\xb2\x6e\xb0\xe4\xa3\xe2\xaa\x2e\x53\x2f\xbd\xc8\xcc\x66\xfb\x4f\xfb\x0f\xaf\x99\x01\x9e\x57\x6e\xba\x7c\x87\xb3\xe2\x56\xe6\x59\x8a\xda\xc7\x6c\xb7\x22\x5b\x9b\x11\x77\xab\xed\xee\xf1\x13\x6b\x38\xb7\x7e\xd2\x58\xec\x0d\x73\xa2\x05\xbc\x75\xc1\x5e\xe4\x0c\x84\x7d\x4f\xee\x3a\x09\x5d\xa5\xcc\x7b\x45\x80\xc2\xe8\x00\x14\xb2\x12\x94\xd1\xc7\x31\x35\x83\x52\xa5\x2b\x59\x0d\x16\x7a\xfd\x44\x2d\xb4\x81\xff\x77\x40\x2f\x79\x22\x0e\x3e\xff\x47\xfc\xcb\xbf\xfc\xcb\xbf\x8c\x4e\x26\xb3\xb7\x97\xe7\xce\x7c\x1c\x5d\x9c\xda\x5f\xff\xde\x8d\xa2\xdf\xd1\xcf\xe0\xc9\x85\xac\xd7\xaa\xf8\x15\xf1\xff\x4f\x5f\x3c\x6b\xda\x7f\xc7\x47\x2f\x1e\xf1\x7f\xdf\xe4\xe7\x62\x78\xfd\x7e\x74\xd1\x44\xfe\xc5\x58\xf6\x88\xfd\x6d\x7f\xd1\x17\xf4\xa5\xfd\x6a\xdd\x27\x64\xb8\xe7\xcb\xf8\x67\xe6\x8c\xf1\xad\xf9\x12\x9c\x31\xc9\x3f\x06\x69\xcc\xfd\xcd\xf8\x9a\x30\xc0\x70\x99\xfc\x72\x1c\x60\x8b\x4a\x65\x27\xb4\x0e\xbe\x83\x2f\x67\xe0\xdf\x55\x28\xbe\x16\x55\xf0\x86\x4f\x46\x26\x40\x58\x97\x55\xb3\xea\xd8\x5b\x13\x50\x60\x07\x25\x82\xe1\x43\xed\xb7\x66\xa8\x21\x86\x12\x51\xfb\x66\x0d\x01\xbe\x2b\x2f\x2a\x05\x23\xa1\x97\x61\xdb\x9e\x3b\xc6\x55\x34\x29\x89\xe0\x0d\x6c\x81\xa0\x1f\xf6\x41\xe1\x2e\xc3\x95\xec\x62\x7d\xdb\xb6\x90\x8c\x0b\x0b\xe2\x73\x9d\x44\x8c\x17\x88\x61\x69\x1b\x53\x31\x61\x2e\x95\xc4\x51\x2e\x16\xd7\x0c\x06\xce\x69\x05\xb5\x8b\x91\x07\x7b\x5e\xde\xe5\xfb\xfb\xa1\x76\xd4\x93\x1d\x84\x35\xff\x3c\x30\x3a\xea\xc7\x23\x6a\xee\xb7\x8d\x9a\x8b\xef\x40\x62\x75\x20\xd6\xec\x22\xc4\x7d\x53\x32\x9a\x96\x45\xfb\x3e\x9c\x31\xe5\x93\xac\x82\xaf\xd9\x87\x7a\x79\x06\xaa\x2b\xd1\xeb\x8d\x2c\x80\x3a\x18\x81\xbf\xe8\x84\x7c\xcd\x20\xe5\xe0\xc9\xc9\xc9\xc1\x9b\x8f\x07\x17\x27\x07\x17\xa7\x5f\x49\x07\xfc\x7e\xfb\xef\xd9\xf1\xcb\xa3\xa6\xfe\xf7\xf1\x8b\xc7\xfa\x8f\x6f\xf3\x73\x02\xf8\xa9\x5b\x25\x4e\x80\x28\xda\x84\xb2\x61\x07\x17\xba\x38\x71\x32\x35\x07\x17\x1a\xd8\x2d\x0c\x48\x82\x5f\x17\x1b\x5d\xda\xc5\x7b\x32\x1d\x0d\xaf\xc6\x3f\x8c\xc4\xc9\xe4\xfd\xfb\xc9\x85\x3d\x10\xa7\x97\x93\x29\x22\x8b\xc7\x33\x38\xa5\x86\xe2\x7c\xf8\x41\x9c\x8d\xa7\xef\xe1\xbc\x38\x9d\x8c\xf0\xf7\x74\x3b\x88\xf3\xd1\xdb\xe1\xb9\x3b\x9c\x06\xf6\xfc\xc5\x33\x95\x12\x06\xb0\x99\x09\x9b\xe6\xbf\x0d\x6f\x1e\x41\x6a\xe1\xea\x6a\x32\xbd\x18\x7d\x3c\x38\x39\x1f\xdb\xd3\x6f\x3a\x3a\x87\xf7\xcf\xde\x8d\x2f\x07\xed\x16\xd2\x6b\x67\xf8\xdc\xf1\xc5\xd9\x64\xfa\x9e\x90\xd0\x90\xa9\xe8\x0d\x67\x07\x4e\x08\xab\xe3\xfb\xef\x87\x7f\x81\x26\x84\xd7\xcd\x74\xf4\x76\x38\x85\x73\x0b\xee\xa3\xe0\x99\x7c\x05\x26\xd8\x77\xba\x5a\x66\xfe\xf4\x83\xbb\x82\x0f\xf9\xe9\x68\x76\x7d\x7e\xc5\x09\x10\xb8\x61\xae\x67\x23\x57\x24\x0f\xe9\x2f\xd0\xaf\xda\x1f\xce\x04\x60\x9a\xec\xe5\x3a\x3a\x9f\x7c\xe8\x47\xf7\xed\xf5\xc5\xe9\x68\x0a\x6d\xb9\x1a\x4d\xdf\xcf\xdc\x28\xb6\x07\xe3\xfa\xcd\xf9\xf8\xc4\x8d\xee\x7e\xef\xe4\xe4\xf2\xbc\x67\x8f\xdc\x1e\xfd\x0e\x64\x4f\xf8\xb5\xf8\x8e\xab\xd1\xc9\x55\x93\x8f\x6e\x78\x71\xfa\xc4\x65\x95\x86\x97\x97\xe7\xe3\x13\xb8\x09\xcf\x87\x1f\x06\x70\x50\xbb\x93\x99\x1e\x85\x9f\xbc\x7a\x67\x27\x70\x26\x86\xd7\x57\xef\x26\xd3\xf1\x7f\x0d\xda\x1e\x4c\x3a\x5c\x8a\xfc\x26\xbb\x98\xb0\x1d\xef\xc6\x6f\xec\xf5\x37\xd8\x7b\x63\xed\x88\xd1\xf4\x04\x6f\x06\xfb\x36\xf8\xa8\x93\x02\x83\x17\xba\xc1\x79\x37\xb2\x77\xc2\xc7\xc9\xb5\x18\x9e\x9c\x8c\x2e\xaf\xd0\x16\x79\x3b\x1d\x8d\xec\xe7\xdf\x8c\xc4\x9b\xc9\xf5\x85\x2b\x0f\x88\x07\x90\x5a\x34\xe0\x27\x8f\xfe\x7a\x65\x97\x5c\xd4\xda\xf7\xc3\x8f\xf6\x29\xf6\x1a\x1f\x9f\x8e\xa6\x98\x42\x7c\x33\x12\xc3\x30\xf5\xf5\x6e\x44\x9f\x9f\x4c\xc5\x5b\xbb\x8c\x66\xd0\x22\xfb\x7b\x6a\xbb\xfd\xf0\x10\x26\xd8\x36\x98\xae\x50\x78\xe2\x90\x77\xc6\xc7\xc9\xf5\x94\x3a\x31\x84\x9b\x92\x2e\x31\x6c\x33\x15\x31\x10\xbe\x67\x40\x5e\x8f\xa7\xd1\x37\x2c\x05\x3f\x10\xbd\x61\x2a\x37\x68\xfd\x33\xe1\x7b\x14\x14\x73\xf2\x3f\xc8\x6c\xa3\xcb\xf8\x37\x01\x1e\x60\x53\xaa\x03\xf5\x23\x96\x84\x30\xaa\x90\x81\x04\xd2\xc9\xc1\xa3\x0f\xe7\xde\x99\x34\x51\x81\x09\x07\xc8\x18\x17\xba\xae\x4d\xb6\xf0\x80\x27\x10\x91\xf7\x9a\x29\x52\xe4\x99\xfd\x45\xb9\x45\x29\xbf\x0a\x11\x9f\x77\xdc\xd8\xcd\x4a\x17\x80\xa3\x12\x28\xbd\x0b\xf0\x2d\x96\xbc\x72\x24\x93\x8b\xac\x50\x6b\x59\x69\x20\x8d\xb6\x17\xb6\x6b\x5f\x43\x08\x17\x5c\x33\x07\x10\x75\x83\x40\xa1\xbd\x52\x2d\xa4\xa9\x02\x85\x7b\x2e\x37\xb5\x8f\x53\x69\x80\xc1\x24\xe6\x08\x16\x5f\xd4\x37\x45\xf6\x77\x90\x67\x6c\xb8\x3f\xca\x11\x3f\xc7\x9c\x21\x34\x45\xac\x08\xe0\x75\xea\xc4\x89\xc7\xea\x41\x16\x81\x2b\x9a\xac\x19\x93\x2a\x84\xb0\x0a\x3f\xe7\xae\xb8\x95\xbd\x9d\x96\x14\xd5\x19\x57\xbf\xde\xea\x2c\x65\x9d\xae\x54\xd7\xf3\x2a\x21\x32\x15\x37\x0c\x50\x66\x00\xf3\x45\x44\xd5\x49\x34\xe4\xe1\x74\x60\x22\xc9\x6c\x8b\xc5\xaa\xd4\x8e\xc5\x93\x42\xbd\xcc\xa7\x5f\x65\x6b\x95\x1e\xa0\xb0\x07\x4b\x65\x48\xb1\xd6\x40\x7a\x94\xad\xe5\x8d\x12\xfb\x3d\x78\x06\x88\x34\xb9\xb4\xc9\xcf\xee\x2c\x6d\x8b\xf9\x40\xf4\xfc\x38\xfa\x6d\x11\xe3\x20\x77\x2e\xbc\x60\xdd\xab\x62\xb1\x5d\x40\xcd\x7a\x26\x19\xa8\x59\xad\x74\xae\x6f\x32\x12\x25\x08\x06\xc8\x24\x7e\x7c\x10\x60\x58\x6a\x99\xda\x25\x65\xbc\x04\x1f\xd3\x5d\x95\x0e\xdb\xb6\x96\x15\x40\x02\x3d\xb7\x17\x7e\xa4\x43\x03\x6c\x7f\xd9\x17\x73\x95\xeb\x3b\x02\xe9\x00\xb4\x11\xe3\xe1\x8e\xb6\x4b\x71\x17\xb1\x86\x3e\xda\x8b\x08\x57\xb1\x66\x30\x62\xde\xfc\xd2\x8b\x25\xa2\x19\x9c\x8d\xb0\xb8\xc6\x66\x01\xb9\x2e\x4f\x0b\x91\x01\xdd\x4d\x95\x95\x0a\x49\x76\x02\x68\x1f\x6c\x8f\x20\x21\x04\xbc\x46\x2c\xf5\x40\x62\x7a\x81\x45\x9e\x30\x92\xad\xf0\x20\x50\xa3\xa0\xf2\x9a\xf7\x7b\xaa\x36\xaa\x48\x81\xa2\x8d\x85\x85\x3d\x5e\x9a\x91\x4b\x95\xbe\x41\x65\x0a\xa8\x63\x35\x46\xad\xe7\x39\xb4\x15\x30\x9d\xbc\x08\xec\x79\xb5\xd2\xb9\x1a\x88\xe1\x17\xdb\x8c\xfb\xd2\xcb\x57\x43\xb4\xa7\xdf\x5c\xb2\x6d\xad\x38\x5a\xb3\x8b\x81\xe8\x9d\xba\xf8\x86\x53\x62\x26\x61\x15\x9f\x6c\xa1\x04\x1a\xf2\x02\x44\x27\x0c\xcb\x18\x04\x68\x4a\x12\x91\x06\x49\x15\x90\xec\xf6\xcb\x10\xcf\x38\x94\x76\x75\x3a\x1a\xdc\x98\x74\xc0\x1c\xfb\xba\x0c\x45\xa1\x3d\x74\x32\x09\xfe\xdb\x4e\x1c\x2a\x9c\xe8\xd2\x09\xa1\xe0\x70\x82\x60\xf8\xbe\xe9\xfb\xd6\x3c\x20\xcb\xca\x2d\x50\x03\xd1\x73\x6a\x0f\x0c\xba\x85\x86\x38\xf1\xe1\x85\xc4\x13\xe0\xde\x2b\xe4\xa7\xb6\x1a\x80\xb8\xa0\xa7\x97\xfa\x36\xeb\x12\xb3\x98\x0d\x6d\x19\xfa\x3a\x03\x27\x9d\x84\x70\xe2\x67\xc8\xac\x54\xf9\xda\x11\xa4\xa4\xa4\x05\xbd\x9f\xf5\xdb\x9d\x08\x4f\x5a\xf4\x2a\xad\x17\x9a\x08\x93\x15\x37\xc0\xf6\x06\x07\x73\x06\x23\x00\xe7\x38\x33\xc0\x85\x40\x62\xec\x00\x68\x7e\x1a\xa4\xfd\x53\x79\x06\xd0\xfb\x54\x91\xc6\x1a\xd0\x4a\xa0\x86\x33\xf3\x1f\x46\xda\xe2\x4c\x47\xb1\xfb\x78\x84\xbe\x23\x31\x03\x5f\xe3\x4b\x9d\x7f\xca\x75\xc9\x9a\x0f\xed\xce\xb9\x6b\x9c\x58\x64\xd2\x7a\xa1\x4a\x31\x57\x0c\xbe\x66\x34\x72\x19\xeb\xf5\xd8\xde\xa0\x26\xc4\x32\xfb\x51\x19\xce\x52\x16\xa9\x69\x0f\x9a\x5b\xda\xf8\x01\x18\xf6\x84\xa4\x19\x1a\x0d\x0a\x0f\xe6\xaa\x49\x45\x8d\x91\x68\xbb\x3d\x40\xa0\xc4\xfe\xdd\x7d\x9e\x97\xe7\x72\x20\x7a\x40\x48\x18\x6c\x0e\x37\x60\x14\x84\x8d\x06\x0d\x77\x82\x4a\x1f\x94\x25\xf6\x36\x46\x5b\xa9\x8a\x05\x9e\xd2\x1a\xcf\xa4\xac\x88\x5e\x9c\x08\xb3\xc8\x70\x11\x2e\xe8\xf4\xa7\x16\xa4\x7a\x0d\xb2\xdd\x77\x2b\x59\x41\xb6\x97\x0c\x1e\x8a\x37\xc2\xd8\xc1\xa4\x13\x44\xda\xcf\x6e\xd0\x9e\x34\xbb\xc9\x2a\x99\xc3\x07\x43\xcb\x70\xae\xb5\x35\x14\xe4\x7a\xb3\xca\x89\xfb\x8f\x6e\xba\x32\xb3\x67\xf8\x6b\x10\x61\x5a\x54\x75\xa9\xac\xe5\x98\x96\x40\xba\x61\x54\xb9\xc6\x09\xf7\xd7\xa2\xbb\xc3\xe4\x5a\x89\x02\xd8\xc9\xed\x97\xd3\x52\x02\x9b\x8d\xfd\x30\xff\xb7\x3e\x08\xed\x14\xfb\xa9\xc5\x4a\x97\xca\x59\x80\x77\xb4\x6f\x95\x5d\xe4\x95\xcc\x88\x1d\xa6\x10\x69\xbd\x9e\x0b\xb3\xd2\x77\xaf\x03\x5b\x07\x70\xe0\x26\xf3\x56\x4a\x90\xbd\x00\x66\x53\x78\x41\xc3\xc8\xe4\x7c\xbb\x87\xcb\x4a\x83\x44\x85\xf6\xf0\xc0\x9d\x42\x03\xc9\xd5\xd5\x4c\x18\x22\x0b\x99\xeb\x1b\x5d\x63\x78\x37\x7c\xee\xf6\x35\xdb\x86\xd6\x4a\x2b\xe5\x1d\xec\xe2\x8d\xcc\x0a\x2c\x92\x90\xe5\x62\x95\x55\x3c\x9a\x66\x51\xe7\x1b\xfc\x4f\x55\xdc\x94\xc4\x26\x59\xda\x15\xb1\x0a\x9e\xb7\x59\xe9\x2f\xdf\x6c\xff\xd0\xa8\xcd\xac\xd8\x23\xcb\xea\x35\xc8\x71\xe5\x79\x6d\xaa\x92\x9c\x85\xb5\xdc\xc0\x09\x54\x24\xc2\x7c\x52\xd5\x62\x85\x60\xe0\x52\xa9\x83\x34\x5b\xab\xc2\x20\x0d\x11\x3c\x0c\xed\xc6\x5b\x85\xa4\x92\xf4\xaa\x44\x54\x7a\xe3\xfe\x3b\x1c\x0d\x30\xa9\x90\xe0\xe8\x75\x7c\x32\xd8\x7f\xba\x1d\xfc\x3a\x3c\x8d\x60\x5a\x01\xbc\xe1\xec\x57\x80\xa4\xc7\x3a\x67\xc8\xfe\xb8\x29\xb5\x7d\x93\xed\x9a\x21\x38\x0c\xe4\x10\x98\x1b\xe8\xd3\x6b\x64\x12\x85\xb6\xd3\xdb\x5d\x55\xbd\x2c\x33\x85\x37\x0d\x08\xce\x1a\xf7\x81\xb2\xf3\x5d\xb1\xfe\x54\x68\x6e\xec\x3e\x96\xf9\x68\xba\x61\x29\xb5\x1d\x8a\x68\xf7\x2b\xa1\x35\x24\x9d\x56\x1a\x44\x67\x80\xf4\xb1\x54\xb7\x19\xd2\x63\xde\x66\x3a\x77\x37\xe4\x3d\xea\xea\xa5\x32\x9b\xa0\x7a\xc3\x79\xa0\xfc\x58\x87\x2e\x62\x9a\x9f\x66\x2e\xa8\x0a\x85\x28\x2b\xed\x95\x4a\x77\x37\x39\x55\x66\x93\x59\x7b\xd1\x35\x98\x9a\xcb\x89\x2e\x21\xc4\x6a\x20\x7a\x97\xcc\xb6\x74\x89\x33\x11\x58\x5c\x31\x21\x13\x88\xfe\x56\xb1\xca\xa7\x57\xb1\xd7\xb1\x1e\x56\xc3\x38\xb3\x3e\x4a\xfb\x29\x09\xb2\x2d\x6d\xe9\x8d\x9e\x48\x28\xac\xf2\x9b\x6f\xc5\x5d\x86\xab\xda\xfe\x2f\x94\x17\xf8\xcf\xe3\x33\xf9\x44\x0e\x7d\x90\xd7\x0f\xda\x8c\x1f\xd8\x72\xc6\x23\xdc\xb3\x2a\xae\xa1\x52\xd4\x75\x92\x3e\x6e\xaf\x0a\xb9\x80\xfd\x8f\xa2\xc0\xf8\x7d\x98\x1f\x89\x6c\xb3\x78\xd9\x54\xee\x9f\x7e\xc1\xe5\x5b\x7b\x2e\x1b\xac\x76\xb3\x96\xfa\xeb\x70\x80\xbd\x89\x1a\x35\x70\xc7\xe8\xb8\x64\x96\x1f\x71\x2a\x42\x0f\xbe\xcb\x6d\x0f\x46\x24\x9c\xb4\xc6\x08\xef\x1e\x47\x68\xa7\x3b\x34\xa8\x9a\xd3\xff\xdb\xb5\x3c\x6a\xab\x7f\xb6\xc9\x6e\xec\x3c\xb3\xa9\x52\xa2\xb7\x6b\x78\x01\x66\x03\xd1\x9b\x72\x6e\xb8\x69\xeb\x77\x98\xf0\x3b\xde\xd2\x61\x21\xcc\xb7\xf8\x52\xfb\xce\xdb\xcc\xd4\xc0\xc4\xb6\xd0\x65\x0a\x74\x7c\x3c\x82\x24\x1d\xba\xb4\x56\x95\x4b\x1c\xbb\x6c\x35\xa4\x30\xe9\x0f\x3b\x47\xcf\x54\xba\xb4\x0e\x3c\x9a\x61\xee\x6c\xdc\x15\x2f\x80\xab\x37\x30\x20\xfc\xc5\x0f\xfe\x6a\xa9\x0b\xbb\xd4\x54\x9a\xd5\x6b\x4e\xb0\x9f\xc9\xac\x14\xa7\xa8\xe0\x4c\x34\x04\x9f\xad\x21\x5d\x2a\x64\x5e\x83\x91\x21\x56\x2e\xac\xaa\x81\x81\x04\x55\x3d\x00\xa7\xc2\x32\x8e\xd4\x54\xe9\x68\x61\xb1\x7a\xf8\x40\x28\x39\x0d\xc6\xaf\x13\xa4\xc6\x68\x4e\x58\x3c\xbb\xc4\xba\x8d\xa6\x44\x68\x5c\xbd\x49\x03\x66\xff\xca\x72\x8f\xa1\x86\xb6\x8f\x96\x45\x9a\xf0\x86\x33\xf5\xdc\xeb\xb7\xa5\x2c\xaa\x81\x98\xc5\x55\x72\x9d\xaa\xdd\x8d\x03\x3a\xf1\xe7\x6a\x58\x2f\x88\x7a\x7c\xd2\x57\x79\x27\xcc\xf8\x7d\x60\x87\x0b\xe8\xf1\x0e\x02\x7e\x3c\x47\x8a\x2b\xf6\xd9\xd1\x4d\xeb\x32\x0a\x06\x05\x5d\x70\x9d\xec\x7b\x52\xd5\xe0\x50\xaf\x3c\x3b\x73\x16\x46\x28\x31\xd3\x6d\xef\x52\x95\xeb\xbb\xef\x7d\xec\xb3\xd2\x62\x1a\x21\x2c\x70\x91\x82\xc0\xe2\x42\x97\x1b\x5d\x72\xb9\x12\x45\xa4\x2a\x1d\xc5\x20\xbc\x7b\xef\xeb\xca\xdb\x0f\xb4\x0d\x08\x9e\xe7\xd2\x7e\xc1\xb7\xd1\xd7\xf0\xd1\xa7\x4a\x0b\xef\xcb\xc3\x93\x9b\xd7\x4d\xd8\x2a\x57\xd8\xdd\x7e\x4f\xf0\x8e\x01\x6a\xec\x30\x8c\x84\x06\x8a\x0c\x79\x1e\x43\x47\xc4\x09\x7a\xe6\xf0\x66\x2e\x78\x65\xb9\xce\x42\xdf\x89\x4f\x85\xbe\x03\xdb\xdb\xce\x3d\x56\x17\xa7\xc0\x21\x44\x75\xdc\xd1\x2b\x28\xd8\x13\xa3\x26\xe0\xa4\x82\x0b\x24\x44\xf7\x40\xa5\x1e\x54\xcf\x72\xc1\x6b\xbe\x8d\x65\x62\x77\x4c\x36\x01\x56\x9a\x8d\x46\xe4\xb4\xb7\x84\xb6\xba\x46\x5c\x72\xa1\x03\x15\x7d\x68\x8b\x8f\xc2\x98\x68\x43\xfc\x61\x7f\xd9\x4f\xb0\x78\x0e\xbf\x60\x6d\x19\x2f\xf0\x1c\x94\xe4\xb9\x0d\x61\x3b\x40\x9b\x82\x71\x50\xd1\xbd\x51\x23\x20\x86\xa9\x55\x63\x5e\x71\xa3\x00\x81\x52\xad\xc2\xc0\xdd\xb3\xfd\xb4\xcf\x88\x96\x69\xc0\x49\x8e\xa3\xcd\x7b\x81\xdb\x12\x7c\xf1\x29\x4d\x45\x24\x4a\x0d\x89\xeb\xa0\x32\xd6\x89\xe2\x7b\x94\xab\x47\x0c\x85\x14\xe8\xc1\xd6\x61\x5e\xa7\xd3\x48\xf0\x72\xf7\x2a\x05\x32\xf1\x87\x62\x37\x5e\xeb\x91\xd7\x8c\x83\x8d\x27\xc2\xf3\x42\xc2\x93\xa7\x8a\x10\x5b\x63\x8e\x9b\x94\x62\xff\x7a\x3a\x86\x88\x59\xd2\x61\x4c\x02\x55\x7c\x84\x42\x87\x86\xd9\x57\xde\xdf\x89\x98\xa0\x1c\xfc\x70\xe2\x93\xd4\x54\x33\x48\xbd\x29\xc2\x98\x99\xac\xfc\x95\xb1\xdb\xcc\xe5\xd8\x7a\x4c\xac\x6b\x6d\xbd\x4d\xe6\x63\xae\xce\xc8\xe9\x5a\xfd\x01\xa5\x2d\xbd\x95\xbf\xbc\xa3\x0a\x22\x1e\x6d\xea\x96\x81\x4e\x3b\x9e\x6a\x10\x3e\xf0\xd3\x01\x0c\xe1\x19\x60\x95\x05\x55\x55\x02\x82\x88\x5e\xb8\x64\x37\xa4\xa1\x89\x4a\x2b\x3b\x00\x9d\xe9\x25\x17\x26\x64\xac\x58\xf1\x0b\xe6\xe5\xc3\x4a\x15\x9f\xf1\xc1\xe0\x68\x8f\xa4\x4f\xfd\x04\xaa\xe5\x92\x42\xba\x70\xf0\x40\x7c\xde\xfa\xf5\x6b\x25\x0d\x4a\x9c\xdd\x3b\xb7\xc1\xf4\xc9\x1d\x93\x07\x66\x00\x69\xd5\x7e\xd9\x59\x44\x85\x16\x77\x50\xc8\x7e\x53\x43\x64\xd7\x1d\x14\x86\xa7\x59\x6b\x05\x48\x96\x08\xee\x46\x0a\xf2\x8d\xbb\x4a\x48\xa8\x07\x72\xee\x15\xde\x41\x58\x55\x80\xc5\x03\xcd\xe3\xe5\x9e\xfd\x3e\x5e\xa2\xba\x28\x04\x4c\x1b\x0d\x82\x34\x23\xd5\x9c\xa3\xb3\x50\x04\x67\x2c\x2f\xcd\xa4\xe1\xff\x6e\x4a\xb9\xa8\xd0\x5c\x48\x44\xa9\xd6\xf6\xf0\x73\x6d\x0d\x7b\x51\x6c\x99\x63\x0f\x1c\x49\xe8\x2a\x1c\x7f\x7e\x28\x17\xfd\x84\xff\xa8\x0c\x70\x4d\xb9\x0b\x3a\x5c\x47\x6e\x3a\x83\xaa\xd6\xf6\xac\x7e\x44\x95\x85\xd6\xc1\x8c\x4d\x59\xcb\xa2\x60\x45\x08\x88\x15\x64\x6b\x59\x66\xf9\xd6\x1b\xa5\xd6\x3c\xd2\xac\xc3\x00\x8f\xbc\x93\x25\x48\xbf\x10\x4c\x43\xc8\xf4\x56\x16\x15\xd8\xd4\x25\x33\xc3\x8a\xb5\x2e\x54\x25\x61\x83\xad\x37\xaa\x30\x92\xe5\xe3\xed\x88\x11\xa1\x7d\xb4\x4e\x9d\xe9\xe8\x8c\x2d\x17\xd5\x99\x3b\x9f\x6a\xe9\x6d\xf1\x2c\x57\x07\x66\x25\x4b\x8a\x1c\xf9\xbb\x36\xaa\xbf\x0e\x42\x10\xb8\x48\xbe\x4a\xbf\x22\x62\x03\x85\x00\xe6\x42\x8b\x8d\xdc\x72\x02\x0b\xc6\xba\xeb\xab\xbb\x4c\xee\x70\x90\x5a\x23\x12\xe4\x5e\x68\x25\x9f\xc6\x5a\xd7\xf7\xdc\x87\x65\x6c\x3d\xfa\xf5\x4c\x54\x00\x92\xd7\x9d\x57\xed\x85\x8d\xb5\xa9\x4b\x53\xcb\x02\x76\x56\xb8\xeb\x93\xd6\x21\xdd\x92\x81\x71\xb9\x24\x17\x7e\xa0\xe1\x4a\x28\x07\x18\x3a\xfb\xe8\x4b\x81\xa9\x0b\x73\x0e\x76\x7d\xa9\x44\x5d\x65\x79\xf6\xf7\xac\xb8\xf9\xde\x09\xc3\x87\x3a\x8b\x8d\x9c\x8b\xd8\xb7\x73\x66\x54\x9d\xea\x62\xbb\x86\x3a\x2a\x6f\xcf\xf7\xed\x3f\x4d\xbd\x21\x5e\x66\x0a\x7b\x67\xdd\x0f\xa2\xbf\xba\x03\x00\x29\x53\x30\xb3\x47\x19\x0c\x59\x62\x88\xcc\xfe\x87\x3d\xff\xf6\xd5\xe0\x66\x90\x40\x41\x17\xd0\x54\x43\xd9\x16\xe4\xe6\x12\xce\xae\xd8\x55\xcb\x7a\xf4\x7f\xd3\x75\x59\xc8\x1c\x53\x6e\x01\x64\x4f\xec\xf7\x02\x6c\x94\xb8\xc4\xa7\xf7\x20\x29\xc0\xcd\xe9\x50\xdd\x49\xfc\xa1\x67\x10\x1e\x4c\x9c\x31\x61\x15\x12\x31\x59\x40\x52\x26\x1c\x4a\xb0\x8c\x9b\x1d\xa2\xe4\x08\x9c\xa7\x59\x95\xc7\x1b\x37\x18\xca\xd7\x94\xb4\x88\x4f\x46\xf7\xc2\x6d\x7c\x48\x82\x51\x35\x1d\x27\x54\x97\x9f\xe0\x21\xe4\xc6\x99\x59\x84\x98\xaf\x2a\xe0\xf4\x75\x9b\x04\xef\x56\x5a\xb8\xd0\xf4\xeb\xe9\x38\xbc\x48\x96\x3e\x4e\xd9\xe2\x13\xd1\xcc\x24\x80\x6e\xb9\x63\xcd\x8e\x56\x2b\x9e\x58\x74\x60\x87\xa7\x75\x15\xdf\x7e\x8b\x3e\x7b\x34\x4e\x6f\x8c\x2e\xbb\x62\x1b\x0d\x39\x9c\xb7\xaf\xdd\x79\x11\x70\x4c\xe1\x19\xdc\x4c\x40\x85\x37\x13\x44\xaa\xd6\x59\x91\xad\xeb\x35\x76\x97\x1a\x06\x39\x5e\xa4\x85\xc5\xe1\xe4\x3f\xb0\x40\x99\x4f\x57\x5b\x77\x0d\xa5\xdb\x81\xde\x3c\xbc\x5e\xed\xd7\x71\x39\x14\x50\x96\x4a\xe5\xb7\x18\x3c\x63\x78\x28\xa7\x04\xf9\xe6\x90\x95\xc8\x15\x44\x9a\x4c\x80\xf4\x26\x0a\x0f\x87\x29\xa5\x11\x6d\xe6\xce\x7d\x63\xee\x87\x7b\x7c\x0c\x95\x81\x18\x6f\xfe\xd0\xa4\x74\x60\x2e\xc2\xcd\x45\x23\x4d\xdd\xb0\xde\x0f\xe8\x30\xc1\xe5\x08\x09\xb8\x79\x14\x6b\xfe\xa8\xeb\x72\x77\xf4\xb6\x65\xe0\x01\xad\x46\xbe\xa5\x8c\x23\xff\x4b\x1a\x90\x7b\x27\x52\x78\x8c\x8d\x35\x0e\xff\x84\x0f\x0d\x60\x76\x83\xb0\x37\xd4\x2c\xc0\x45\x42\x4e\x52\xe3\x88\x0a\x42\x22\x74\x58\x75\x1c\x1b\xc8\xa4\xef\x79\x6d\x12\x3b\x1e\xb6\xd1\x68\xd3\x04\x4a\xba\xbc\xad\x38\x48\x87\xe0\x0c\x44\x33\x24\x3e\xe2\xfd\x10\xcd\xf0\xcf\x68\x63\x90\xc5\xdf\xbd\x1a\xd8\x17\xc4\x68\xe4\x85\x2e\x0e\xee\x64\x76\x0b\x9b\x0b\xf4\x22\x72\xa3\xcb\xad\xf3\x06\x66\x8b\x95\x5a\x2b\x33\x10\xe3\x82\xc2\xda\x7f\xab\xcb\xcc\xa4\xac\xad\x15\xa1\x44\x5c\x90\x80\xa0\x16\x14\x42\x42\x50\x00\x62\x11\x80\xce\xa8\x92\x55\x0d\x32\x1a\x20\xef\xe4\xde\xe9\x4f\x13\x03\x6f\x0d\x58\xe3\x6c\x13\x39\xbf\xee\x06\x82\x7c\x74\xc3\xf7\x3d\xc6\xa6\xda\xad\x80\x9d\xee\x9b\xc2\x65\x22\xce\xfc\x9b\x6f\x71\x22\x3b\x2d\xc0\xf6\x5a\x7d\x1d\x0c\x60\x36\x10\x1f\xfe\x81\x47\xef\x1f\x6d\xe8\xec\xd9\x0a\x9b\xc5\x3d\x80\xaf\x4c\x8e\x08\xd1\x3b\xfc\xa1\x83\x1b\x0b\x47\x29\x33\x81\x99\x0a\x80\xa9\x42\x17\xa1\xc1\x69\x82\x02\x33\x12\x96\x73\x37\xcc\xbc\xef\x33\xd4\xf0\x00\x18\x18\xf3\x35\x86\x3e\x8a\x0a\xc2\x32\xc9\x06\xe2\x07\x9d\xd7\x05\x98\xaf\xad\xd5\x71\xb5\x73\x6a\x76\x37\x2c\x71\x71\xbd\x28\xe9\x62\x4f\x0a\x3a\x99\x41\xed\xcb\x97\xd7\xb9\x17\x20\xd8\x0f\xc9\x41\xe1\x8a\x64\x60\x94\x6d\xbf\x5e\x40\xbe\x12\xa3\xdb\xa9\xbd\x2b\x4d\xa5\x4a\x23\x6e\x5d\xeb\x9b\x9d\x35\x89\xb8\xcd\x24\x7e\x83\xbe\x9e\x78\xbf\xef\x67\xaf\x14\xf6\xa8\xbe\xde\x72\x08\x10\x47\x23\x44\x68\xca\xf0\x81\x20\xab\x09\x77\x35\xc1\x19\xf8\xf6\x70\x03\x09\x7a\x24\x6c\xb6\x44\x38\x1a\x7a\xe7\x7c\xdb\x88\xe3\x27\xb4\x01\x7c\xb0\x39\xf9\xec\x40\x1c\x51\x57\x78\x2a\x00\x7c\x3d\x5b\x19\x76\xb0\x3b\x1d\x13\xb8\x51\xd3\xcc\x54\xba\xac\x12\xb1\xb6\x6e\x00\x5c\x44\x44\xba\x61\xef\x09\xf9\x89\x4d\x8b\x54\x95\xfa\x06\x25\x8e\xa4\x83\x9a\x38\x1c\x67\x18\x97\xc0\x29\xb8\x63\x96\xfb\x4d\xa9\xfe\x56\xa7\x19\x8c\x3b\x73\xdd\xc7\x37\xd8\x77\x46\xac\x74\x81\xc3\x56\xaa\x4d\x5d\x45\xd4\xf9\x53\xd6\x4e\xe1\x4c\xe9\x07\x1f\x6d\xb2\xdb\xd6\xd7\xac\xd9\x2f\x5c\x5f\x9c\x03\x19\x14\x97\x18\x89\xf7\xd7\x57\xd7\xc3\xf3\xf3\x8f\x88\x09\x77\x40\x70\xa8\x16\x1b\x01\x91\xd0\x87\xe9\xf8\x0a\x0a\xb1\x1c\x84\x7b\x72\x76\x36\x9a\xce\x3c\xd8\x1c\x6a\x08\x00\x81\xed\xca\x05\xa6\xa3\xcb\xe9\x68\x36\xba\xb8\xc2\xe2\x04\x31\x99\x36\x0a\xd6\x98\xa0\x4a\x9c\x4c\x2e\x4e\x46\xd3\x0b\x2e\x27\xb0\x0f\x74\xa4\x55\x89\xa7\xac\x9a\x5d\x0d\xaf\xae\xaf\xa0\xe8\x2a\xe2\x50\x0a\x0a\xc5\x98\x2e\x04\x0a\xc5\xe0\xbd\x49\xe3\xa5\x57\xe3\xab\xf3\x51\xe2\x8a\xe5\xc6\x9f\xcb\x67\x95\x34\xc9\xac\xb0\x8a\xeb\xdd\x48\x0c\xdf\xcc\x46\x04\x46\x3f\x07\x46\x2b\xcf\x36\x75\x3a\x3a\x1b\x9d\x5c\xcd\x12\x31\x3c\x39\xb9\x9e\x0e\x4f\x3e\xba\x2f\xe1\xd0\xe0\xb7\x82\x07\x8c\xa6\xd3\xc9\x34\xe0\x92\x9a\x4c\xa1\xf6\xe3\x74\x3c\x3b\x99\xfc\x30\x9a\x0e\xdf\x9c\x8f\x06\x62\x36\x79\x3f\x12\x7f\xbe\x9e\x8e\x67\xa7\xe3\x13\x1c\xdb\xd3\x09\x56\x9e\x9c\x9f\x4f\x3e\x10\x4e\xff\xe4\xfc\x7a\x46\xb0\xf9\xae\x32\xc3\xd9\x04\xa1\xf3\xfe\x83\xef\x87\x1f\xf1\x21\x97\x97\xe7\x40\x37\xf5\x71\x72\xcd\x3a\x0a\xe7\x3e\x57\xaa\xad\xff\x47\xb1\xbf\x81\xfd\xfa\xe8\xf2\xaa\x51\x1d\x30\x1d\xfd\xdb\xf5\x78\x8a\x2b\x29\x2e\x8d\x48\xa2\x02\xc3\x0f\xe3\xf3\x73\xbf\xa4\x7c\x35\x21\xbe\x9b\x0b\xed\xb0\x5c\x86\xca\xed\xb8\xd0\x30\x60\xe9\xf2\xf5\x85\x51\x21\x61\x22\x2e\xaf\x2f\xc6\x50\xfc\x31\x99\xfa\x8a\x43\x57\x7a\xc2\x75\x75\xae\x98\x2e\xae\xbf\x88\x8a\xeb\xdc\x9a\xa4\xba\x3a\xd7\xe6\x77\xc3\x99\x78\x33\x1a\x5d\x7c\x7e\xa5\x1d\xd6\x25\xbc\x1c\x88\x2b\x7b\xd2\x15\x48\x89\xeb\x12\x0c\x57\xad\x60\x72\xfb\xbc\x5f\xa9\x52\xe1\x81\x0c\x9e\x57\x45\xcf\x51\x0d\xe9\x4c\x88\x24\xda\x83\x6d\x5e\x02\x40\x38\xbe\x43\x76\x85\x26\x3d\xd0\xb3\x05\xf0\x8c\xa9\x6d\x82\xe3\xd2\x87\x79\xbb\x7c\x13\xe7\x62\x3a\x2c\x30\x3c\x08\x41\xd5\x8e\x2f\xc4\xf5\x22\x28\x6e\x07\xdb\x26\xdb\xd1\xa2\x52\xad\x65\x06\x27\xec\xb2\xce\x11\x8b\x96\x67\x9e\x4a\x05\x0d\x46\x7e\xfc\x80\xef\x2e\x23\x8e\x12\x71\x9c\x88\xe7\x89\x78\x91\x88\x97\x98\xbf\xfc\x03\x36\xcd\xd4\xe5\x6d\x76\xeb\x73\x1b\x34\x39\xf7\xc0\xe5\x1b\x19\x64\x74\xdf\xba\xf2\xc8\x09\x21\x0e\xe3\x8c\x15\x07\xeb\x7e\x66\x3a\x38\x4c\xf7\xf6\x21\xc7\x6f\x7b\x0e\xb4\xa3\x8c\x0f\x85\x16\x25\x0f\x99\x47\xc4\x2a\xed\xaf\x27\x9c\x46\x47\x5f\xd9\x50\x4b\x46\x50\x91\xa9\xf4\xa6\xad\x81\x8a\x31\x36\x84\x0b\x54\x99\x35\xe6\x5a\xb1\x06\x32\x8f\x40\xcd\x64\xb1\x12\xaa\x05\x15\x87\x26\x02\xd6\x2e\xab\x56\x69\x29\xef\x62\xdb\x66\x5f\x77\xd0\x31\xe2\x43\x39\x66\x08\x51\xc8\x2c\x08\x70\x43\x10\x27\x69\x59\x4c\x3b\xb6\x41\x3f\xf1\x74\xaf\x3e\x99\x46\x81\x8c\xac\xa8\x95\x5b\x75\x4b\xcd\x5c\x0e\x98\x4b\xe1\x68\x50\xb0\x9a\x7d\x1e\x1e\x26\x03\x56\xcf\x1f\x06\xe2\x7d\x66\x16\x2a\xcf\x65\xa1\x74\x1d\xd4\x25\x81\xd8\x0c\xe8\xcf\xfc\x84\x04\x0f\x22\xe8\xc2\x58\x4d\x6c\x69\x2d\x43\x56\x6b\x9f\x62\x91\x21\x9c\x20\x48\x59\x0a\x07\x26\xed\x84\x44\x48\xd3\xb9\x98\x29\xd8\xdf\x3e\x01\x82\xfd\x42\xa5\xff\xb0\x24\x4c\xc7\xd6\x42\x3c\x0a\x90\x17\x21\xbd\xa7\x2a\x60\x84\x03\xf5\xe8\x96\x49\x58\x05\x21\x77\x89\x93\x60\x9b\x07\x0f\x71\x30\x75\x7a\x4a\x23\xdd\x68\x0f\x90\x14\xed\xf8\x9d\x6b\x01\x97\x02\x47\x23\x58\x21\x9b\xcc\x3b\xb2\x69\x39\xf2\xca\xc9\x40\x30\x7e\xd7\xa0\xe5\x8f\x11\x4d\xd7\x5f\x6c\x2a\xd4\x4c\x11\xd0\x91\xe3\xce\x14\x57\xa3\xa8\x65\x94\xfc\xf7\xa0\x01\xff\x20\x1c\x23\x58\x78\x7e\x88\x82\xc0\xfc\x85\x86\xee\x10\x0e\x6c\xc7\x68\xbb\xd6\xa4\xb6\xb9\x29\x39\xbb\x24\xfb\xc5\xd7\x06\xe8\x4c\x3b\xf5\xd0\x20\xd8\x09\x9f\x2e\xd1\x99\x83\x8f\xf8\xe7\x05\x66\x3f\xf0\x31\x67\x37\x85\x4f\xb2\x63\x7c\x97\x18\xb7\x80\x5c\x9b\x62\xaa\xdd\x4f\x0d\xc2\x32\xd1\xe5\x18\x96\x9c\x80\xc3\x06\xc5\x34\x7e\xec\xc5\x5c\x55\x77\x8a\xe8\xe1\x78\x86\x76\xe1\x2b\xbd\x48\x81\x3d\x93\xc1\xa7\x24\x55\xf2\x42\xe3\xc2\xe3\x63\xd5\x24\xfe\x15\x26\xd2\x2d\x24\x28\xc7\xce\x57\xc0\xd1\xe6\xc8\xe9\xf1\x3d\x3e\xde\x1c\xa6\x8d\xe6\x00\x45\x23\xf4\x1a\x97\x3f\xc8\xdc\xcf\x24\xa5\xa0\x01\x63\xe8\xe4\xb8\x30\x9c\x17\x62\xfc\xf8\x5a\x6e\x8c\x5c\x40\x74\xeb\x6a\x8e\xc2\x70\xdb\xba\x86\xbb\x88\xa3\x6b\x7e\x44\xa3\x1c\x2c\xc6\xd2\xe0\xf1\xde\x15\xbc\xda\xe1\x9d\x7a\x52\x96\x46\xf9\x96\xa3\x66\x4e\x93\x16\x38\xed\xce\xce\x41\x5a\xca\x25\x3c\x86\x13\x30\x6e\xab\x66\x90\xb0\x76\xdb\xf9\x8d\x2a\x0b\x25\x4e\x74\x61\x1d\xf7\x30\x02\x7b\xe9\x41\x63\x7a\x29\xce\x83\x72\x03\x31\x64\x24\x30\x82\x33\xf7\xa5\x11\x72\x8d\x09\x3a\x5d\x88\x99\xda\x54\xa4\x02\x02\x0c\x8e\x2f\x5f\xf5\xf1\x64\x9d\xea\x75\xf4\x26\xbd\x14\x47\xaf\x5e\x1c\xe1\x1f\x3f\x8c\x2f\x27\x01\x7f\xd0\x55\xa9\x24\x9e\x39\x47\xaf\x5e\xbd\x08\x3e\x72\x19\x62\x2d\x01\xeb\xe4\x8b\xe0\xe2\x2f\xb9\xb1\x23\x71\x50\x99\x07\xcf\x0f\x9a\xb1\x0f\x59\x5b\xc0\x23\xd9\xe6\xff\xb9\xce\xb7\xe2\xf8\x19\xb4\xfc\xa8\xcf\x7c\xe5\x8c\xd3\xb3\xdb\x32\x9e\x0a\x70\x64\xe9\x1a\x23\xcb\xc2\x1a\x06\xb7\xb2\xa8\xa2\xc0\x5b\x1c\x77\x3b\x8f\x4c\x03\xd4\xf1\xaf\xc9\xae\x98\x2b\x3e\x9d\x52\xa2\xba\x43\xf9\x02\xca\x88\x94\x28\x38\x0a\xbf\x0c\x96\x36\xcd\xa7\xcb\x64\x04\x76\x90\x35\xe9\x2a\x1c\x9b\xe0\x0b\x9e\x36\x9d\x6f\x86\x82\x85\x79\x73\x79\x07\xb7\x4e\x85\x9a\xf8\x48\x35\x6f\xea\x0c\x69\x5d\x3a\xe3\x28\x9d\x96\x56\x2e\xef\x7c\xd9\x6c\xb0\x23\x03\x70\xd4\xee\x68\x0c\x57\x7d\xb4\xbe\x86\xe2\xb6\x6a\x1d\xa4\x87\x63\xdd\x68\x8e\x99\xb6\x2e\x49\x64\xf9\x0b\x81\x9b\x01\x2e\x83\x6f\x66\x8a\x6b\x44\x69\x83\xf8\xfa\x1c\xec\xb5\xf8\x10\x48\x63\xba\xf5\x7b\x7a\xa9\xf4\xc7\x77\xfb\x96\x44\x25\xda\x42\x7b\x16\xce\xbb\x95\xac\x8c\x06\xab\x6f\x47\xa6\x19\xd3\x5c\xad\xd7\x85\x75\x83\x79\xc6\x19\x5a\xca\x18\x80\x0d\x81\x59\xc2\x22\x10\xb3\xad\x56\x4a\x23\x8f\x14\xaa\x4b\x48\x00\x0f\x07\x6d\x48\x1e\x2e\x13\xba\x41\x8e\xc3\x84\xd9\x30\xe1\x2b\x50\xa3\x86\x65\x00\x70\x29\x81\x00\x5f\x26\x73\xf7\x0a\x46\xbd\xc6\x7d\xe4\x31\x72\x8a\x01\x5d\x16\xfa\x52\x97\xea\x46\xc3\xbf\xee\xb4\xd8\x3f\xee\x0b\xb8\x6d\xb1\x2e\x36\x5b\xb6\x47\xc6\xda\xb8\x1e\xd4\xe6\xcb\xe7\x9c\x68\xb3\x89\x0f\x69\xe7\x2d\x06\xb6\x12\x38\x60\x01\xb8\x0f\x42\xbb\xf3\x3c\xbb\xf1\xe0\x65\xfe\xfe\x60\x8f\xc2\x7b\x7c\x9c\x32\x64\x2e\x48\x6c\x59\x17\x6d\x41\xa4\x4a\x0d\x28\xbf\x0c\x40\xdf\x7e\x28\x42\x0b\xfc\xe4\xe4\xd2\x7a\xee\xcd\x6e\xba\x34\x2a\xa6\xe8\xb2\xbf\xa3\x7b\x52\x63\x30\x94\xc2\x79\xb4\x08\xc8\x7c\x73\x42\x6f\xbd\xe6\xd3\x7a\xbc\x6a\x20\x18\x67\xb7\x8c\x17\x85\x2b\x45\xae\x6f\x34\xa4\x23\xdb\x8b\xd0\x5f\x8a\x71\xc6\x89\x2d\x9e\x8e\x6f\x0d\xc4\x10\x65\x42\x38\x74\xca\xce\x03\xda\x45\x4d\x3f\xb5\xf9\xf5\xef\x20\x03\x7a\xb0\xa8\x4b\xf0\xbc\x7c\x43\x6b\x23\x6f\x94\xb8\xa9\xb3\x54\xe5\x59\x41\x29\x35\x0a\x9f\x7a\x0e\x5f\x12\xe8\xbe\x53\x73\x93\x55\x2a\x86\xa6\x34\xf8\x47\x21\x3e\xc0\x68\x8b\x0e\xdd\xcb\xfb\x52\xa2\xb0\xae\x7d\xdb\x42\xed\x05\x37\x71\x58\x0c\xe2\xd2\xb8\xa1\x43\xd0\x1a\x69\xea\x07\x11\x83\xaa\x34\x60\x02\x5d\xd0\x67\x17\x34\xbc\xba\xbc\x79\xf2\xf3\x19\x82\x06\x4f\xb2\xe3\xcd\xc1\xcd\x26\x3f\xf8\x9b\xbc\x95\x07\x0e\x92\xfe\x25\x69\x80\x1e\xe0\x7f\x3c\x3a\x7c\xf1\xbc\xc1\xff\xf3\xfc\xe8\xe8\x91\xff\xfb\x9b\xfc\x8c\x7d\x3d\x31\xe6\xa4\xbb\x68\x8f\xff\xfa\xd7\xbf\xfe\x15\x68\xef\xa2\xd2\xaa\x4a\x23\x37\x31\x1a\x2f\xa9\xa7\x51\x20\xc9\x22\x7f\xa7\x61\x9a\x1b\xd1\x56\x7f\x96\xb7\xb2\x69\xcb\xb8\x00\xd7\x7c\x2b\x66\x75\x01\x11\x0d\x4d\xd4\xda\x90\x6f\xb7\x2d\xbb\x53\x79\x4e\x81\x88\x80\xc0\xcf\xb6\x00\xd4\x7f\xd6\x73\x0a\x4f\x85\x95\x2d\x70\x0c\xde\xe9\x00\xc2\xaa\xe7\xea\x21\x02\x5f\xc6\xbe\x93\xcf\x62\x1c\x6c\xc3\x49\x45\xa5\xc4\x61\x18\x70\x2d\x7c\x46\x37\xc1\xf0\x02\xa6\x3e\xcc\x95\x04\x24\xcd\x5b\x82\x2b\x80\xb7\x4b\x81\x16\xcf\x63\x5c\x69\x64\x14\xbf\x8d\x25\x67\xf0\xab\xf3\x1a\x49\xfb\x58\x2f\x83\xae\x2d\x12\x5c\xd1\xc2\x68\xf7\xde\x54\xc3\x27\xee\x32\xb3\x72\x7f\x24\xe5\x2c\xd5\x7c\xa7\xd3\x05\xc3\x93\x30\x7c\xff\xef\x5e\x33\xe1\xb7\xf4\x33\x78\xf2\xbe\xce\xab\x6c\x61\x7e\x3d\xfd\xcf\xa7\x2f\x5b\xe7\xff\xf1\xd3\x17\x4f\x1f\xcf\xff\x6f\xf1\x43\xb3\xef\xce\xbe\x77\x90\xda\x05\xd4\xfb\x1b\xb9\xf8\x74\x53\xea\xba\x48\x89\x58\x9d\x68\x27\xe8\xf8\xe1\x6f\x06\xaa\x7c\xcc\x13\x0b\x67\x74\x44\x28\x9b\x05\xe4\xb1\xf8\xd7\x82\xcf\xa8\xf7\xd2\x18\xb9\x58\xd5\x46\x55\x95\x11\x63\xc7\x24\xa3\x97\xe2\x8a\x51\xf8\x5b\x7b\x33\xbc\x2d\x75\xbd\x11\x6f\xae\xcf\xcf\x83\x13\x1e\xfe\xf9\xee\x42\x8c\x03\xc4\x20\xea\x4e\x18\xa2\x50\xc7\x2a\x6b\xcf\x0f\x43\xc5\xb6\x9b\xda\xfa\xf8\x54\xe9\x2d\x9c\xa0\x13\x85\x86\xa0\x7d\xd4\x70\x34\x13\x73\xa3\xa1\x82\xdc\x5a\x69\xca\x76\x84\x0c\xc0\x8a\x2a\x49\x75\xd1\xe0\x85\xd4\xcb\xcf\xeb\x5a\x22\xde\xa8\x3c\x17\xe7\x72\xae\x4b\x69\xc7\xde\x9a\xb2\x7c\x33\x8d\xa0\xaa\x31\x5b\x24\xe2\x9d\x2e\xd4\xd6\xde\x81\x3b\xbb\x1a\x7e\x06\x86\x05\x7f\x09\xc3\xa6\xf0\x37\x76\xe8\x1f\x1c\x31\x2e\xd7\x88\x75\x59\xe1\x7e\xd0\x4e\xdb\xc3\x90\xb6\x07\xaf\x82\xf0\xd3\x77\x50\x65\x90\x55\x08\x0f\x9d\x6f\x3f\x73\x8a\x59\xc4\xfe\xfd\xf0\x44\xec\x1f\xbd\x7a\xf1\xf4\xe0\xe8\xd5\xcb\xc3\x7e\x22\x4a\x55\xc8\x35\x95\x89\xbf\x1f\x5f\xf9\xa1\x42\xdf\xf6\x84\x27\x73\x46\x93\xc9\x91\xac\x25\x02\x08\xc6\x40\x49\x94\xdd\xc0\xdf\x18\x67\x98\xa5\xc2\x3e\xdd\x24\x81\xe7\x95\xa3\xf2\x1c\x20\xfd\x96\xb6\x39\x4b\x65\xac\xc7\x78\xa6\xca\x42\x16\xa9\x16\x7f\xb6\xfe\xdd\x89\x2e\xe7\xb2\xd2\x03\x71\x0d\xaa\x9b\x0c\x69\x47\xdf\x8e\x87\x23\x04\xa0\x8b\xb9\x75\x28\xdc\x36\x89\xc8\x06\x40\x3a\x43\x16\xf2\x06\x89\xaa\xa9\x23\x2b\x59\xa6\x2c\xa5\xba\x51\x65\xbe\xe5\x62\x36\xa1\x7e\x54\x0b\x4c\x2e\x91\x91\x65\x06\xe2\x7d\x43\x08\xbf\x39\x49\x8d\x92\x0f\xdf\x44\xeb\xc9\x6f\x72\x65\xfc\x2c\xde\xc9\x96\x28\xc9\xd1\xab\x97\xcf\xed\x92\x00\x05\x70\xbf\x0b\xeb\x3c\xb7\x7f\x1d\xd5\xb6\x85\x09\xe3\x50\x21\x28\x37\x98\x0d\xec\x07\xe1\x23\xf7\xac\x33\x30\x37\x4d\x0d\x25\xe1\x58\xeb\x0a\x4c\x32\x76\xac\x58\x68\x13\xa6\x0b\xb1\xd0\x45\x0e\x31\x96\x60\x85\xd7\xb0\x15\xec\x0e\x2f\xd2\xcf\xd8\x1d\x62\xf0\x53\xd4\x11\x9a\x3f\x7b\xb1\x5c\x39\x68\x58\x92\x78\x25\xc9\x55\x36\xec\x52\x84\xe9\xf2\x24\x71\xc4\x32\x2b\x1b\xe7\x62\x93\x64\x3a\xca\xad\x28\xd5\xa5\xc3\xd9\xa6\x3a\x87\x7a\xd6\x6e\x85\xc6\x95\x3f\xce\xe7\xee\x38\x0f\x63\xe4\x58\x20\x90\x39\x8e\x67\x59\x89\xb9\x6e\xd5\x19\x3f\xfc\x44\xb6\x5a\x03\xff\x80\xbf\xe4\x5e\x46\xe2\xcd\x40\x02\x13\x8e\x42\xe2\xdf\xcd\xe0\x77\x3c\x3e\xc7\x57\x89\x78\x37\x9e\x25\x78\x66\xe9\xd2\x9d\x5d\x21\x91\x38\x30\x22\xa1\x74\x1f\x15\x9f\x60\xb0\x25\xab\x20\xea\xc0\xb2\xa4\x21\xef\x77\x70\x8b\xb9\x19\xe2\x51\x37\xcc\xd6\xbb\x0b\x52\x1b\x6b\xe3\xbf\x3c\xfe\xfc\x03\xee\xf3\x16\x6a\xf0\xf8\xe3\xc3\xc3\x17\xb0\x95\x1e\x38\xb2\xbb\xbe\x62\xb7\xc7\x6c\x38\xeb\x12\xdf\x0f\xed\xf7\xc1\x93\xe1\xe9\xec\xfc\x6b\xaa\x3f\x3c\x68\xff\x1d\xbe\x7c\x7e\xdc\xd4\x7f\x7f\xf6\xfc\xd1\xff\xff\x26\x3f\x4d\x96\xeb\x54\x79\x93\xc7\x45\xc6\x98\xb2\xdd\x71\x19\x79\x34\x1d\xc5\xd4\x3f\x65\x45\xea\xcb\xe1\xf0\x64\x4c\x33\xb3\xc9\xa5\x3b\x22\x5b\x52\xe6\x98\x84\x88\x5e\xbd\x03\x95\xd8\x28\x59\x64\x7f\xd8\x7e\xe5\x75\xe3\x3c\xfc\x53\xe8\xe9\x52\xe1\x1f\xa5\xd8\x9d\x6f\x4e\x75\x50\x83\x06\xd2\xbe\x6b\x20\x9c\x98\xd7\x5d\x21\xca\xcc\x60\xb9\x94\x7d\x03\xa4\x65\x31\xc5\x98\xcb\x6c\x2d\xe4\x8d\xcc\x0a\x53\x89\xe1\x5a\xfe\x5d\x17\xe2\x94\xea\xe2\x48\x11\xc0\x90\x9e\x8f\xbd\xe7\x2a\x23\xe4\x72\x99\xe5\x19\x88\x45\x35\xb3\xa3\xdb\x7b\x9b\x34\x00\xf9\x0d\xd8\xe3\x3f\xf1\x45\xbb\x9c\xf6\xc1\x93\xab\x93\xaf\xbc\xfd\x1f\xda\xff\xcf\x9e\x1e\xbe\x6c\xee\xff\xa7\xcf\x5f\x3c\xee\xff\x6f\xf1\xd3\x52\x7a\x09\xab\x1b\x09\xa0\x30\x55\x37\xa1\x30\x3a\x65\x5d\x09\x39\x72\x22\xf3\x6c\xa9\xcb\x22\x93\x09\xc4\xee\xde\x67\x8b\x52\x93\xe1\xc9\x32\x6c\x33\xd4\x06\x5e\x18\x6b\x3c\xc3\x3e\x86\x5b\x7f\x08\xb5\xd6\xb3\x4a\x56\x2a\xfc\x43\xc8\x46\x48\x95\x28\x90\x47\xf7\x64\x04\x94\x5b\xdd\x6c\xd0\x28\xb4\x46\x0c\x0b\x3c\xb7\xab\xd2\x5c\xe7\x1a\xe2\xca\xf9\xd6\x57\xa4\x23\x03\xa9\xe7\xb7\x82\xa7\x0d\xf6\x80\xc3\x82\xca\xb3\x42\x33\xac\x11\x05\xed\xb0\x06\x9b\xd2\xe5\x1e\x95\x15\x0e\x37\x58\xcd\x95\xb9\xdf\x26\x6c\xc9\x74\x33\xb7\x72\xbb\xb0\xd3\x3e\x13\xf5\x6a\x3c\x83\x47\xd3\xba\x83\x16\x90\x69\x16\x52\xb0\xde\x2a\xeb\xd6\x64\x6b\x46\x4e\x44\xaa\x34\x80\x9f\x69\xe1\x1f\x12\xaf\x17\xac\x4b\x26\x78\x61\xb3\xd5\x41\xcd\x96\x5e\x36\xbd\x72\xe3\x99\xfd\x1d\x33\x41\xd6\xf7\x88\x88\x3f\x38\x47\x68\x1a\xea\xe6\xed\x65\x99\x95\x6e\x6e\x00\xa0\xa3\x54\x4a\x69\x16\xbb\x4c\x82\xc4\xaf\x5f\x31\xa8\x52\x3d\x27\xb4\x49\x97\x29\x5d\xa8\xbb\x20\x73\xbf\xc8\x95\x2c\xa1\xfa\x1a\xf2\x79\xac\x0d\xa7\x88\x4b\x72\x43\xc4\x45\x00\x0b\x02\xb5\x38\x47\x84\x8c\x50\xfd\xed\x60\xaf\x5b\xaf\x17\xc9\xce\x01\x01\xee\xb8\xee\x63\xfd\x10\xd2\x1c\xbe\x1c\x4e\x99\x20\xbe\x25\x24\xd2\x89\xf8\xdd\xa9\x1e\xd2\x42\xf7\xee\x92\xca\x18\x5f\xcd\xc4\xe9\xe4\xe4\xfa\x3d\x03\xd5\xe1\xa1\xa0\x65\x32\x9a\x8e\x7f\x00\xf6\x78\xc0\xb9\x4f\x47\x93\x33\x8f\x00\x0e\xbb\xf5\x6e\xf8\xc3\xe8\x27\xa2\x80\x07\x7b\xe1\x03\x88\x29\xdf\x0f\x0c\xf4\xf5\x6c\x7c\x02\xa8\x7c\xe6\xd0\x6f\xa8\x32\x7f\x39\xa5\x98\xcf\x01\xbf\x93\x9a\xf3\x41\x88\x80\x1f\x88\xdd\x02\x38\x4e\x5a\x40\x38\x69\x01\x7c\xc8\xbd\xfd\x86\x91\xbc\x98\x88\xc9\x9b\xf3\xf1\x5b\x64\x7d\xbf\x9a\x38\xdd\x84\xf7\xc3\xf1\xc5\xd5\xe8\x62\x78\x71\x32\x4a\xc4\xec\xfa\xf2\x72\x32\xbd\x4a\xc4\xf5\xe5\xe9\xf0\xca\x0e\xc7\xe8\xe2\x9d\xfd\x93\x6d\xd9\x0c\x26\xf1\xfd\xe4\x14\x06\x91\xe8\xe0\xdf\x4e\x7e\x18\x4d\x2f\x40\x2f\xe6\x7a\x36\xfa\x9e\xd3\x04\x70\x32\x2d\xec\xee\x75\xba\xe0\x5e\x21\xa9\x10\x73\xb5\x92\xd6\x32\x5b\x7a\x6f\xff\x46\xdf\xaa\xb2\xc0\x23\x01\x72\x2b\xee\xdf\x61\x7e\x1d\x7c\xf8\x1e\xf3\xd6\xa8\x94\xdc\x92\x1e\x07\x0e\xa2\x63\x91\x13\xd3\x0d\x5d\x2a\xcf\x8b\xcc\x8a\xf5\x2a\x85\x40\xd9\xd0\x36\x98\xa8\x37\xa7\xea\xa6\xce\xe9\x3c\xd9\x3f\x1b\x4e\x0d\xd4\x68\x9f\xe4\xa0\x8d\xf4\xfc\x78\x70\x7c\xfc\x72\x70\xf4\x0a\x4c\xa9\xfd\xe3\xfe\x60\x57\xbf\xd5\x3d\xdd\x3e\x55\xf6\x6a\xe2\xd8\xd8\xa9\x5a\xe2\x31\x18\x7d\xc9\xa1\xff\x16\xb9\x34\x06\x31\x09\xd2\x88\x9e\x97\xd4\x08\x42\x57\xf4\xa5\x9e\xc3\x36\xfd\xc4\x31\x8c\x47\x86\xfa\x7a\x8c\x9d\x3d\x78\x79\x78\xf4\x14\xbb\x7b\x04\xfa\x53\xa7\x76\x50\x1e\x80\x5f\x24\xc1\x69\x4d\x90\x20\x3f\xe1\x41\xe3\xdc\x65\x6d\x04\x49\x58\x12\x99\x37\x0d\x58\xeb\xaa\xec\x88\x94\x04\x06\x48\x5b\x03\xd4\x23\x51\x3d\x58\x90\x91\x71\x4e\x7b\xfe\xd7\x36\xa3\xfe\x69\x7f\x06\x4f\x3e\x5e\x9e\x1f\x1c\x7d\x15\xdd\x1f\xfe\xb9\xdf\xfe\x3f\x3e\x7a\x7e\xd8\xcc\xff\x1c\xbd\x78\xf9\x98\xff\xf9\x26\x3f\x1f\xe5\x4a\xeb\xff\xd2\xc8\x80\x27\xe2\x07\x4a\x35\x1f\x0d\x0e\xc5\xfe\xc7\xcb\xf3\x3e\xa6\x80\x3a\x3f\x2d\xf6\x61\x2f\xf6\x86\x6c\x17\xf6\xfa\x58\x15\x8a\x28\x34\x0f\x97\x05\x2b\x8b\x6d\x30\x13\x6c\x6c\x2a\xde\x01\x0c\x25\xbd\x82\x22\xc4\xe2\x54\xe5\x92\xdc\x5f\xef\x20\xac\x90\xa1\xd8\x9e\x32\x14\xc5\x96\x39\x71\x86\xea\xa5\x98\xd7\x26\x2b\x80\x3b\xa5\x12\x2f\x0f\x8f\xc4\x19\x18\x6b\xc3\x5b\x55\xd4\x0a\x7c\x94\x62\x7b\x2b\x73\x95\x04\xae\x8b\x78\xf5\xec\xf0\x0f\xaf\xc4\x7e\x0f\xdf\xce\x1a\x12\x64\x1f\xfa\xe3\x09\x1d\x74\xa8\x50\x4d\xf5\x5d\x91\x6b\x99\xc6\x90\xa2\xfd\x9e\x3b\xc9\xfb\x03\xf1\x66\x2b\x6a\xc3\x27\x2b\xff\x01\xb2\xfd\x49\x9b\x50\x57\x16\xcc\xa9\xbb\x0f\xc4\xbb\x7d\x1c\xb9\x6e\xea\x24\x37\xd6\x83\xbd\x71\xe1\x72\x10\x51\x85\x0c\xa1\x96\x81\x05\xc2\x90\x07\xe0\x34\x5b\x3a\x0b\x19\x3c\xe7\x1c\x89\x43\x84\x48\x71\x6c\x8c\x34\x64\x5f\x1b\xd6\xd0\x04\xee\x48\x24\xaf\x60\x77\x84\xb5\x8a\x10\x05\x7d\x34\x38\x12\x07\x3f\x89\x5b\x72\xe8\x1d\x0c\x5a\x0d\x31\xb7\x24\x02\x1f\x39\x73\x03\x98\xf0\x22\x65\x84\x86\x5d\x14\x61\x45\x10\xa5\x14\xb2\x22\xa4\x22\xf3\x73\x21\xef\x27\xa6\xb4\xff\x64\x89\x03\x04\x89\xfa\x0a\x91\xd8\xe3\x23\xf1\xee\x84\x52\x34\xaa\x2b\x23\xe0\xa5\xca\xed\xdf\x22\xc7\xc7\xc3\xcb\x5a\x0a\x0f\xc1\x70\x78\xdd\x45\x51\xe9\xc4\x2b\x01\xd8\x7f\xd8\x25\x34\x2f\xb3\x34\x92\xe9\xf0\x6f\x64\x99\x3a\x20\xa0\xb2\xbb\xb3\x17\xbe\xff\x75\xcf\x97\xa5\xb1\x18\x25\x72\xfd\xa4\xad\x41\xa3\x7d\xcc\xb0\x36\xc0\xa8\x91\xd3\x18\x90\x94\xf8\x8f\x3b\xa4\x6c\xf4\xc6\x41\xcf\xad\x8f\x63\x71\xc0\xc4\x49\x38\x36\xe1\xce\x20\xa3\x22\xb2\xc0\x64\x74\x1a\x78\x0a\x58\x62\xf0\x69\x12\x68\xcc\x02\x7d\x4f\xdb\xca\xb0\x19\xb6\x75\x01\x49\x19\x7c\x95\x8e\x97\xc0\x5b\xa5\xfa\x8c\xac\xa0\x1a\xbc\xc6\xeb\x69\xdf\xb2\xef\xea\x37\xa7\xb8\x84\x13\x84\xbc\x75\x2a\x89\x71\x12\x0b\x59\xb5\x62\xfa\xe4\xee\x07\x66\x6e\x84\x99\x35\x2b\x4a\x61\x2c\x21\xd7\xb1\x6b\xb5\x0c\xdc\xf8\x3e\x15\x07\x6e\x75\xdd\x3b\x16\x76\x06\x82\x15\xdb\x90\xc3\xc5\xdc\x43\x50\x0a\x0e\x00\xa2\xfb\x29\x1d\xa3\xb5\x9b\x76\x13\x3b\xae\x37\x00\x40\xf2\xd4\x7f\xe1\xf7\xd0\x06\x84\x69\x89\xb4\x66\xc5\x87\x46\xe0\xf4\x67\x76\xe6\x9e\x26\x3b\x1e\x1f\x8c\x32\x11\x73\x9b\xab\x05\x43\xbe\x6b\xed\xa1\xfe\xee\x83\x78\x66\x75\xd5\xbd\xf0\xe8\x03\x85\x87\x13\x2c\x48\x91\x7e\xa1\x70\x3b\x20\xaa\x22\x8c\xe3\x23\x01\x9a\x3e\x3c\x26\x75\x2d\x7a\x60\xc7\xbb\x26\xae\xb4\x32\x3d\x60\x95\xc1\xe6\xd8\xdf\x87\xc4\x81\x84\x74\xb6\xdf\x44\xe3\x1e\x92\x7b\x14\x38\xe9\xae\x73\x0b\x47\x82\xdd\x14\x3a\x0f\x71\x01\xc2\x34\x35\x8e\xb5\x07\x9c\x0c\xd7\xef\xfb\x9b\x9f\xb8\xb1\x21\x96\xca\xf0\x32\x89\x8a\x31\x7c\x75\x57\xcc\xd1\xf0\x92\x65\x7d\x28\x30\x65\xe0\xc2\x48\x33\xb3\x81\x8a\xa9\xae\x71\xa5\x22\x84\xfb\xde\xa6\x97\x62\x49\x1e\xa8\x2e\x11\x34\x27\x16\xba\x2e\x31\x5a\x5a\x68\xa8\x8e\x2b\x02\x4b\xc3\xef\xca\x67\x3f\x7f\x57\xd2\x5d\x83\xb6\x07\x36\xae\x7b\x87\x02\x6a\x85\xad\x18\x57\xe8\x48\x59\x07\x66\x63\xd7\xad\x26\xc4\x07\x64\xd7\xc6\x09\xe5\x98\x1e\xdc\xc3\x18\xbe\xed\xca\xbe\xee\x7a\xa9\x79\xb8\x97\x1c\x18\x24\x23\x20\x2c\xf2\x80\x65\xb8\x58\x69\x60\x5f\x8b\x63\x7c\xbc\x8a\x3a\x80\xe7\xf7\x19\x59\x22\x82\xc9\xba\xe1\x45\x7e\xfc\xb9\xd1\x79\x5d\xa9\x7c\x8b\xf1\x42\x5f\xce\x1b\x57\x09\xc3\xf6\xa1\x4c\x34\x9c\xf9\xff\x8b\xbd\x77\x5d\x6e\x23\xc9\xd2\x04\xff\xeb\x29\x7c\x68\xb6\x2b\xa2\x2d\x08\x89\xd4\x25\x3b\x53\x63\x6d\x06\x81\x41\x09\x3d\x24\xc0\x06\xc0\x54\x71\xd6\xd6\x56\x41\xc0\x41\x46\x29\x10\x81\x0e\x0f\x90\x89\x7e\xa3\xfd\xb3\x0f\x31\x4f\xb6\xe6\xe7\xe2\x7e\xdc\x23\x40\x52\xd9\x99\x59\x55\xd3\x29\xb3\x99\xae\x24\x80\x08\xbf\xfb\xb9\x7c\xe7\xfb\xf6\x8e\x38\xde\xaf\x50\x6c\x2c\xf4\xaf\xfd\xb2\x84\xdf\x90\x0e\x0c\xdd\xe8\x76\x3a\x34\x15\x2a\x02\x7e\x82\xb7\x8d\x8b\xfb\xc2\x2b\xb9\x45\x82\x93\x8d\xea\x64\xc4\xe2\x80\x57\xb6\x75\x1d\x5c\x94\xc6\xaf\x85\x78\xe9\x08\x16\x64\x3a\x75\x3a\xb7\x95\x67\x47\xef\x7e\x66\x6b\x07\xc8\xe7\xda\xce\xca\x48\xae\xd4\x35\xeb\xbf\xf1\xdb\xeb\x9d\x3a\x42\x28\x97\x7f\xaf\xeb\x35\x94\x6c\x08\x0e\xb1\x48\x14\x9c\x14\xb3\x99\x92\x1d\x0b\x29\x8b\x1d\xfe\xa0\x7a\x40\x61\x35\x75\x98\xf7\x75\x9f\x0f\x15\x4a\x38\x4a\xbe\x70\xb0\x87\xaa\xba\x73\xb9\xa3\xaa\x0e\x1e\x66\xc1\xba\xef\x09\xa3\x16\x97\x0d\x10\xa3\xde\x55\x15\xd5\x0d\x9f\xf4\xd5\x0c\x61\x14\xf6\xbf\xd8\x3c\x06\x6d\x0d\x51\xb1\x02\x66\x06\x6d\x7b\xc7\xa1\xcd\xf8\x0b\x14\x6f\x5c\x42\xfa\x11\x4f\xf3\x36\x1f\xbe\x1f\x34\x77\x5c\xd2\xbb\x40\xb7\xbd\x81\xfa\x25\x9a\xaa\x42\xd2\x2b\xdb\xe6\xae\x82\x82\xf4\x08\x36\xe8\xae\x40\xe2\xa0\x1f\x49\xc1\xb8\x4b\xc0\x3b\x35\x3b\x0a\x6b\xd1\x64\xbe\x01\x0f\xa2\x55\x76\x83\x6f\x6d\x73\x70\xc7\x4c\xf8\xc1\x0a\x39\x4e\x3c\xe9\x77\xe2\xd9\x16\x50\xb8\xe8\x46\x67\x35\xd5\x1f\x8a\xd5\x5c\xa1\xce\x51\x56\xe7\x88\x0d\x0f\x09\x6c\x42\x8b\x81\x48\x94\x5c\xa3\x80\xb7\x0e\x09\xe8\x28\xe9\xa5\x7f\xb9\xcb\xb6\x86\xfe\xb7\x69\xaa\xcd\x46\x17\x81\x0f\xd9\x07\xc8\x06\xb7\x50\xd0\xba\x03\xe2\x4a\x0c\xd6\x86\x07\x8b\xbf\xeb\x56\x6c\x37\x37\x79\xe7\x5e\xec\x20\x29\xef\xbb\x61\x07\xc3\x9c\x0b\x69\x3d\x31\xb3\x3c\xb8\xc8\xf0\x0f\xb6\xeb\xce\x71\xf9\x8a\xb3\x12\xf3\x52\x81\x40\x84\x4e\x02\xe7\xcd\xcd\x58\xa2\x36\x59\x83\xc1\x64\xae\xa8\x49\x48\x1b\xc4\xdf\x20\x01\xf7\x34\x1e\xe9\x61\xad\xe0\x4c\xc4\x14\x9d\xd1\x86\x52\x82\xc6\xa5\x68\x08\x99\x14\xda\x66\x70\x6c\xb8\xea\x46\x44\x09\xc1\xd8\x38\xff\xba\xab\x21\xf4\x18\xd6\xbf\x6a\xbc\xec\x3f\x95\x54\x19\x91\xbf\x63\xe3\x3f\xb3\x7e\x4a\x8d\x6e\xea\x2a\x5b\xb4\x5c\x16\x3f\x17\x6f\xf8\x3c\x6b\x9d\xe1\x68\xbe\xd9\x81\xf6\x5c\xf6\x5b\xe2\x21\x86\x82\xb0\x97\x06\x30\x55\x09\xb4\x02\x19\xd4\x5d\xe3\x9c\x9e\xa8\xa9\x0a\x0d\x9c\x88\x61\xad\x3d\xdc\x92\x3b\xdc\xdb\x8e\xb4\xb8\x7f\xc2\x2c\xf4\xa7\x01\xa7\xb7\x67\x59\x02\x91\x81\xcf\x69\x77\x2a\x84\x93\x20\x83\xf1\xa9\xe3\x27\xa2\x7c\xcc\xb5\xa4\x41\xea\xab\xeb\xc1\xe7\xc9\xe4\xbf\x75\x09\x2e\x7b\x46\xa0\x36\x2d\xd2\x64\x2a\x98\x91\xbc\x30\xf3\x64\x4a\xc2\xd0\xe3\x4f\x4c\xcf\xc3\xcd\xeb\x07\x09\xa6\x84\xdf\xeb\xa4\xa6\xe9\xbd\x6a\xfe\x79\x30\x0f\xfb\x05\x8c\x3d\x1f\x53\xe4\x29\x52\x67\xd3\x14\xb8\x72\xe0\xaf\x97\xe9\xf4\x6c\x32\xbd\x40\x9d\x7a\x75\x35\x76\x3a\xfa\xe9\xa9\xba\x18\x8c\xc7\xe9\xd4\x89\x08\x7f\x02\x29\xeb\xd9\x9c\xf9\x82\x80\xb6\x08\xe9\x82\x80\x23\x88\xda\xd3\x99\x05\x9b\xd9\x6f\xff\x56\x79\x2d\x75\xc8\xf9\x3c\x7a\xe5\xe7\xc1\x29\x66\xf2\x50\xd2\x1a\x53\x79\x90\xb7\xa3\x5f\xf4\x5c\x2a\x4c\x66\xc2\x60\x5e\xd5\x34\xb5\x2d\x9e\xc7\xa3\x9d\xc0\x0c\x07\xc9\x28\xcc\x27\x42\xd2\xf3\xb4\xf3\xb7\x82\x79\xe8\x6c\x32\x4d\x3f\x4d\x46\xe3\x4f\xcc\xf6\x25\xb9\x98\x56\x9e\x8b\xc9\x7e\xda\x22\x57\xa2\x6e\xf9\x44\x2b\xf3\x27\xb5\xf3\xab\x32\xad\xea\x72\xad\x8e\x36\xe9\x91\x54\xab\x64\xf2\x3a\x74\x39\xc9\x0e\x2a\x2e\x75\x3e\x99\xc1\xd7\x2f\xa7\x93\xb3\xd1\x7c\x96\xb8\x3f\x5c\xcd\xd2\x44\x7d\xbc\x9a\x8d\x60\xb6\xdc\xca\x81\x6c\x2c\x7f\xe7\x74\x30\x1f\x24\x6a\x38\x99\x41\x42\x17\xe8\xb0\x7a\x24\x12\x3d\x4e\x81\x06\x0b\x47\xd2\x76\x30\x4c\xfe\x76\xec\x84\xb3\xab\xe9\x78\x34\xfb\x0c\xb9\x53\x5a\xb8\x28\x28\x3d\x95\x43\xef\x96\x3d\x0d\x1a\x92\x7a\x91\x5c\x35\x88\x58\x93\x58\x35\x48\x78\xfb\x3d\x3a\x38\x3f\x4f\x3f\xa5\xa7\xa0\xf3\xad\x3e\x4e\xd3\xc1\xf0\x33\xb6\x19\xd5\xb0\x81\x5e\x6a\x32\x9d\x8f\x26\x57\xa0\x7a\x7d\x7a\x45\xe3\x4f\x23\x37\x4e\x3f\x9d\x8f\x3e\xa5\x90\xe6\xb4\x0b\xa4\xb5\x46\x7f\x1d\xe7\xd4\x7b\xe4\x9c\x82\xab\xa5\x4d\x3e\xf5\x1e\xac\x8e\x79\x47\x48\x40\xb2\xde\x84\x34\x37\x10\x63\x2d\x9b\xbc\x90\x84\x37\x3a\xab\x8b\x5c\xd7\x01\x65\x77\x40\x8d\xfb\xbe\xef\x5e\x49\x37\x6e\xe3\x08\x17\xc9\xea\x5a\x6a\x7c\x20\x5f\x78\xd7\xac\x60\x82\xa4\x24\x7a\xb9\x2f\x72\x6a\x2d\x17\x4f\x88\xd5\x1d\x21\x7a\x0f\x97\x8b\xb5\x3a\x9c\x3d\xd4\xa6\xd6\xc2\x24\xa4\x7f\x54\x10\x4a\x8e\x99\xa1\xa4\xeb\x27\x3e\x16\x65\xbf\x22\x74\x29\x8b\xf2\xd1\x3c\x58\xeb\x25\x84\x9c\xa5\xf2\x18\xf5\x27\x73\xca\x46\xd6\x2e\x45\x3a\x9b\x2e\xc3\xc6\xf7\xcd\xfa\xd9\xf3\xc7\xda\xe8\x6b\xeb\x05\x5d\x8e\xa0\x53\xa8\xf5\x6d\x86\x4c\x0d\x91\x15\x40\x6d\x3e\xf4\xf7\xe2\x71\x2f\x91\xbf\x64\x7c\x91\x93\x53\x5c\x23\x07\x0c\xf6\xe5\xa5\x81\x4a\x7e\xe4\xe0\x39\x74\x7c\x5c\x6f\x61\x10\xde\xf5\x92\xa0\xd5\xee\x25\xef\x7b\xe0\x2f\x4a\xb6\x24\xff\xe1\x0f\x3d\x76\x48\x44\x2b\x02\x2e\xaf\xc7\x67\x8b\x98\xd8\x5a\x5c\x4c\xd1\x2e\xa0\x90\xef\x1e\x9e\x19\x46\x56\x3f\x42\x31\x13\x6b\x56\xb7\xa6\x04\xe9\x38\x36\xba\x36\x7a\x49\xa1\x1a\xa7\xc3\x17\x70\xba\x98\x24\x26\x9c\x49\x22\x7e\x1a\xb4\x1c\x1d\x45\x4d\xc2\x20\xd3\x8a\x82\x36\x04\x6b\x4a\x9e\xc5\x8f\x63\xb2\x3c\xe6\x09\x21\x92\x17\x72\x0a\xb8\x7a\x44\x3e\xc4\x6f\xa2\xdc\xe9\x19\x07\x22\xd4\x50\x38\xc4\x42\xbd\x0e\x4a\xdf\xb1\x40\x49\x42\xa1\xa9\xb7\x88\x25\xc0\x5a\x70\x60\x15\x52\xd9\xad\x2e\x17\xbb\x04\xde\x4a\x3a\xcc\x89\xfa\x6b\x95\x97\x8d\xb2\x27\xc9\xd6\x47\x97\x84\x86\x7d\xb5\xe2\x2c\x1d\x21\xe7\x80\xc5\xa9\x3d\x10\x8e\xaa\xca\xae\x9f\xc4\x47\x05\x93\x90\x50\xa9\xed\x3e\x02\xe7\xea\xb6\xf4\x84\x1e\x40\xd4\x04\x2c\xf1\xd9\xc3\x6a\x5b\xb4\x69\xad\xe8\x40\x40\xe2\xa7\xa4\x73\x28\x82\x61\x90\xf4\xe7\xc8\x02\x54\x99\x46\x2d\x8a\xca\x58\x7b\x16\xcf\xe7\x6d\xc6\xac\x48\x40\x12\xd2\x74\x1d\x54\x33\x24\xd7\x43\x22\xa9\xa8\x9b\x61\x2f\xb9\x0d\x46\xdf\x43\x0c\xc6\x09\x8b\x20\x83\x96\xc3\x9b\x25\x41\xf4\x94\x75\x16\x0c\x2e\x52\x62\x3c\x0d\xee\x13\x1c\xa3\x4e\x2a\x2b\xde\x39\xab\x6d\x51\x68\xd3\x38\x9d\x13\xc9\x0e\x0b\xe4\x2e\x5d\x17\x16\x09\x6d\x80\x4a\x33\x15\xe0\x85\xe3\xd7\x01\xb9\x28\xb2\x07\x17\x2b\x46\x88\x66\x00\xf6\x94\x1c\x3c\xf6\x99\xf0\x15\xf8\xc1\x60\xad\xeb\x7c\x91\x79\xc6\x72\x3c\x3f\xd1\x99\x28\x57\x45\xbe\x80\xe1\xb7\xa7\xb8\x2c\x41\x9a\x03\xb6\x64\xdc\x0f\x78\x84\x4a\xfb\x5f\xb0\x35\x3c\x6b\xfd\xc8\xf6\xc4\x11\xda\xcc\x32\x14\x40\xf8\x54\x55\x4b\x23\x99\xcf\x38\x58\x1d\x4f\xf3\x40\x46\x7d\x99\xa7\xc4\x36\xb3\x7d\x08\xe5\xe5\x7d\x55\xdc\xfb\x03\x5b\x79\x24\x63\xde\x40\xda\xc8\xe4\xcb\x3c\xab\xed\x1e\x77\x60\x9f\x27\xa2\xc5\x30\x87\xdf\x15\x31\xc6\x81\x54\x90\xbe\x56\x18\x41\xcc\x4b\x35\xcb\xca\x26\x53\xc3\x22\xab\x33\x35\xac\xb6\x65\xb3\x93\xf9\x6c\xc0\x6b\x86\xd2\x6e\x99\x41\xd6\xb1\x24\x8c\x14\xb9\xcf\x97\xda\x1e\x04\x0d\x29\x70\xc4\x43\x21\x28\xb2\x38\x1d\xea\xa3\x8f\xa4\xee\x5f\x15\x1c\x11\xb0\x87\x86\x67\x94\xf6\x64\xcf\x24\x7c\xb1\x11\x99\x6a\xe4\xac\x0b\xe4\x4a\x33\x18\x61\x43\x13\x9b\x19\xa3\xed\xa9\xbd\xd6\xf5\xad\xe7\x41\xab\x8a\x7c\x49\x01\x95\x67\x91\x92\xc8\x70\xa8\xc3\xd6\xd6\x48\x47\x68\xc7\x05\x6d\x26\x1a\x03\xda\xf0\x4e\xda\xde\x95\x06\x6d\x3d\xfd\x9b\x9f\xf0\xfb\xca\xee\xd6\x1b\xac\x78\xac\x90\xed\x84\x49\xdb\x56\xb1\x2d\xd1\x5e\x64\x15\xd1\x66\xb3\xa7\x4e\xb3\x06\x44\x6a\x64\x07\x75\x06\x6e\x20\xa8\x12\x52\xcb\x11\xc3\x14\x8b\x58\x81\xf4\x65\x01\xaa\xce\xa5\xbe\x05\xbe\x6f\x10\x4c\x29\xb2\x1d\xe9\x31\x33\x73\x11\x9d\x33\xcf\x6a\xac\x5d\xf9\x1d\x6d\x14\x14\x97\xc9\x9e\xfb\xca\xce\x7e\xc4\xef\x94\x89\x91\xf2\x5a\x27\x7e\x14\xba\x43\x56\x50\x23\x47\x6f\xa0\xf8\x93\x5d\x34\x9d\x64\x87\x38\x03\x6e\x71\x86\x49\xea\xb8\x6f\x4c\x3b\xad\x3b\x1a\x03\x1b\x1a\x89\x07\x5d\xa5\x25\xb2\x1e\xfe\x43\xa3\xcf\xfa\xaf\x86\xc3\xa3\x8f\xd7\x47\xe3\xe1\xd1\xc9\xef\x05\x02\x7b\x1c\xff\xf5\xe6\xe4\xed\x9b\xb7\xad\xfa\xff\x93\x3f\xeb\x3f\xfe\x90\x7f\x2d\xe6\x21\x21\x04\x72\x34\xae\x4a\x01\x56\x3d\xe9\xbf\x56\xc3\x69\x0a\x00\x70\x35\x9c\x5c\x5c\x4c\xc6\xd6\x5b\x9f\x5e\x4e\xa6\x18\xcd\x18\x61\xb0\x6c\xa0\xce\x07\x5f\xd4\xd9\x68\x7a\x81\x78\x66\x0e\xa2\x31\x6a\x19\xe9\xab\x67\xe9\xf4\xe7\xd1\x30\x9d\xf5\x3d\xe0\x99\xc8\xb9\x03\xe2\x69\xf7\x6b\x78\x73\xaa\x06\x63\x35\x98\xcf\x27\xd3\x71\x7a\x7d\x34\x3c\x1f\x21\xb9\xf6\x39\x06\x91\x3e\x8f\x2e\xfb\xed\x16\xd2\x6b\x67\xf8\x5c\x0c\x63\x61\x7b\x1d\x24\xfb\xc8\x41\xb2\x3b\x7e\xdf\x11\x7c\x14\x41\x45\xc0\x94\x8b\x67\x72\x90\x33\x61\x2c\x37\xc5\xe8\xce\x47\x14\x83\x43\x30\x3f\x45\x8a\xa6\xe9\xec\xea\x1c\xc2\x30\x67\xd3\xc9\x05\x40\xef\xaf\x66\x69\xff\x05\x23\xa8\x1c\x9b\xfc\xe1\x60\xa6\x4e\xd3\xb3\xd1\x38\x3d\x55\x1f\xd3\xf3\xc9\x97\x5e\x10\x51\x85\x70\x0b\xb4\x65\x9e\x4e\x2f\x66\x6e\x14\xdb\x83\x71\xf5\xf1\x7c\x34\x74\xa3\x7b\x78\x30\x1c\x5e\x9e\x1f\xa8\xc9\x54\x1d\xd0\xdf\x0e\x7a\x7d\x4f\x62\x8f\xef\x98\xa7\xc3\x39\x06\x23\x87\x93\xcb\x6b\x88\xf6\xd8\xde\xbd\x72\xac\xee\x21\xa5\x79\x1f\x42\x43\x11\x55\x38\x7d\x73\xfe\xd9\x4e\xe0\x8c\x00\xef\xa3\xff\x29\xda\x1e\xb2\x8d\xfb\x37\xd9\xc5\x84\xed\xf8\x3c\xfa\x38\x9a\xa7\xa7\xfd\x17\x1f\xaf\x55\xfa\x97\x74\x3a\xc4\xa0\x96\x7d\x1b\x85\xa0\x28\x98\x05\x2f\x74\x83\xf3\x39\x9d\xa6\x09\xf0\xa7\x0f\x86\xc0\xcd\x6e\x67\x06\x98\xfd\xed\xf7\x3f\xa6\xea\xe3\xe4\x6a\xec\x48\xfe\xc3\x01\xa4\x16\xe1\x90\x38\x92\x73\x88\x74\xcd\xe0\x91\xf6\xef\xf4\xf2\xe1\x64\x3c\x1f\xc0\x0c\xd9\x37\x52\x24\x6e\x36\x3a\x4d\x69\x7b\x4c\xce\xec\x2f\xa6\xd4\x8a\x01\x11\xdc\x43\x54\x0a\x5f\x3a\x40\xe6\xff\xd3\x11\xe1\xf3\x11\x60\x77\xaa\x57\x68\x5a\x94\x82\x16\xf9\x80\xc9\x8d\xef\x91\x4b\xce\xc9\xf4\x43\x6e\x92\x09\x16\xed\x7f\x6f\x74\x9d\x57\x4b\xc8\xff\xe5\xc6\x6c\x21\xe7\xd2\xdc\x11\x53\x68\xad\xac\xcf\xb8\x28\xaa\x8d\x5e\x5a\x4b\x33\x60\xb2\x24\x59\x61\xb8\xf1\xd1\xc9\x6f\x76\xf6\xbf\xb7\xa5\x63\x49\xb5\x3e\x64\x12\x62\x01\xca\x2d\x4b\x81\xc4\xf2\x52\xe0\xf6\x38\x96\x5a\xe0\x27\x20\x1d\x23\xa2\x0f\xf0\x0e\xf1\x03\x6b\xcb\x37\x77\x7a\x6d\x74\x71\x0f\xf4\x6e\x35\x58\xb1\x7a\x7d\x53\x70\x19\xa8\x57\x1b\xb9\xa7\x4b\xbe\xaf\x06\x98\x9e\x05\x57\x50\x72\xe2\x7a\x42\xe8\x7b\x16\x9d\xc8\x3b\x95\x09\x33\x75\xaa\x41\x5e\xd0\x7d\xf1\x50\xa0\xeb\x01\x1a\xd9\x8b\xe5\xac\xda\xcc\xf1\x9e\xe4\xf9\x20\x7a\x5c\x38\x57\xea\x26\x03\xfe\xbf\x8d\xd4\x16\x85\x0c\xad\xfc\x83\x28\x89\xab\xf5\x91\x2b\x01\x83\x71\x92\xb3\x0d\x36\x6b\x41\x96\xf1\x7a\x6b\x60\xde\x21\x2b\x73\x4b\x71\xc1\x65\x9d\xad\xb3\x26\xff\x0f\xfa\xce\x0a\x5d\x93\xac\x70\x7f\x59\x57\x88\xa3\xc9\x91\xa1\x82\x48\x9f\x48\x84\xde\xab\xc0\xdb\xf9\x68\x5c\x2a\x8f\xca\xf8\x01\x7f\x88\xef\xb1\xae\xaf\x17\x64\x6c\x47\x1e\xda\x4b\x8d\x1c\x91\x5a\x2f\x32\x83\xb9\xbf\xd2\x20\x29\x34\xfe\x7e\x99\x6d\xc0\x3d\xa1\x84\x15\x26\xfe\x7e\xfb\xc9\xee\x10\x2a\x0b\x25\x01\x1e\xe3\x01\x74\x05\x60\x8e\xe1\x31\x73\xd3\xb0\xa8\xd6\x9b\xca\xb8\x78\x42\x6b\x3c\x21\x30\xb6\x2b\x17\x77\x75\x55\xd2\x6c\xa8\x40\xda\xaf\x04\xf3\x7a\x79\xe4\x12\xd0\xb4\xe5\xd6\x15\xc2\xa1\xd7\xd9\xad\x56\x87\x07\xf0\x8c\xbc\xbc\x65\x14\xf3\x7f\xb6\xc3\x9e\x44\xfb\x80\x49\x30\x79\x09\x63\x44\x45\xa2\x98\x19\x0a\x89\x51\x2e\xe4\x59\x0f\x59\xf4\xdb\x38\x9b\xe8\x45\xcb\xbe\x3a\x88\xd4\x5e\x9e\x7c\xdf\xc3\x5d\x45\x29\xe7\xa5\x7b\x9f\xa0\x61\x3e\x90\xfb\x2e\xa0\xb6\x80\xd8\x0a\xac\x21\xeb\x85\x61\xb5\x0b\x86\xf0\x10\x5f\xf3\xcc\x36\xaf\xfa\x0a\x40\xdb\xbc\xb5\x63\x70\x37\x35\xb3\x8d\xaa\xe9\xd0\x2a\x42\x69\x09\xcc\xed\x72\xd0\xb3\xd8\xa9\xfb\xbc\x2a\x5c\xff\xba\x65\xa4\xf7\x51\x6d\xc3\xfe\xe1\xc7\x3a\xc1\x0a\xa7\x1d\xe7\x2b\x74\x5c\x24\xcb\xb1\xa5\x4a\x9d\xe2\xfd\x4d\x5e\x6a\xb3\xc9\x41\xba\xd7\x45\x69\xb1\xb9\xac\xc9\x73\x02\xce\x68\xad\xae\x8c\x26\x6c\x47\x1b\x73\x52\x48\xce\x7b\x49\xe5\x8b\x50\x01\x88\x9e\x63\xa5\x29\x83\x96\x64\xe2\x80\x22\x39\xd0\x83\x95\x7d\x15\x54\xe5\x62\xa1\x26\xc6\x12\x6a\xa7\x90\xc0\xe9\x42\x27\xe8\x1c\x69\x96\x19\x4f\xec\xc4\x20\x92\xea\xa1\xd4\x75\x0b\x5a\x42\xa9\x08\x7c\x6e\x48\x25\x6c\x18\xe0\xc2\x63\x04\x40\xf9\x96\x44\xc6\xa3\x40\x78\x57\x8e\x11\x90\xd7\x7a\x20\x3c\x80\xa1\xec\xea\x2d\x96\x0f\xa8\xdf\xfa\x18\x96\xfd\x57\xaa\x6a\xf4\x24\xe6\x7d\x8f\xee\x7e\x23\xf4\xa5\x49\xdc\x01\xee\x49\xa1\x14\x0f\x33\x49\xb8\x0f\xb1\x30\x9b\x2a\x00\x4d\x89\xc3\xae\xa9\x54\x55\xc2\xb4\xad\xab\x5a\xc7\xe7\x39\x07\xca\xbb\x9e\xda\xa5\x72\xdd\xdc\xb5\x1f\xf1\xc1\xdf\xd1\x4d\xe5\xd4\xa7\x25\x40\x25\x3e\x2b\xdd\x4f\x90\x26\x4b\x60\xc6\x08\xde\x5d\xd5\x6a\x03\xba\x54\x70\xac\x1b\x50\xac\x27\x1e\x0c\xa2\xa5\x29\x76\x30\x13\x48\x06\xeb\xfe\x02\xd1\xe1\xe8\xaf\x81\xd0\x72\xe6\xa4\x96\xb3\xed\x32\xaf\xf0\x76\x74\x85\x75\x7e\xd4\x1c\x5a\xa8\x3d\x04\xfb\xba\xbf\xfc\xbb\xea\xcb\xbe\x11\x9f\x3b\x3d\x99\x30\xae\xc9\x2b\xd2\x15\xbc\xaf\xad\x29\xcb\x84\x59\xeb\xac\x31\x2e\x10\x59\x56\x0f\x40\xf4\x06\xd7\xaf\xdd\x49\xd9\xaa\x01\x95\x32\xa0\x88\xef\xb7\x5f\xc1\x28\xf5\x46\x8a\xc3\x78\xf5\x89\x75\x80\x58\xcd\x10\x35\xe6\xe0\x76\xc5\x2e\x44\xd2\xec\xd9\x3a\x78\x76\xb4\x1a\x2d\x51\x60\x7b\xf0\x5c\x37\x42\x07\xbd\x03\xc6\x15\x84\x55\xb7\x8d\x07\x3e\x7a\x91\x0d\x7a\xbc\xaf\xfb\xf1\x50\x39\xa3\xde\x1e\x2e\x51\xe3\xf0\xed\xa1\xee\x31\xde\x67\xea\x89\x8d\x4d\x7f\xde\xa1\x7a\xd2\xa5\x6d\x2e\xf9\xb9\x63\x55\x78\x24\x47\xc0\x56\x11\xdd\x84\xe7\x79\x10\x34\xca\x46\x1c\x25\x4c\x33\x23\x49\x16\xdc\x42\x73\xac\x33\xee\x2f\xb4\x16\x13\x4f\x0d\x05\x5f\x83\x15\xe8\x3f\x16\xc6\xf7\x63\x05\x0d\x01\xbf\x7b\x67\x39\x03\xe0\xe4\x10\x65\x85\xe9\x11\x78\xfa\x54\x13\xc8\x75\xc4\x04\xe5\x60\x07\x27\x1d\x17\xb8\xbe\xd7\x35\x03\xee\x82\x2d\x18\x58\x83\x21\x2a\xfc\x37\x18\x80\x50\xcd\x1e\xec\x1f\x92\xc6\xad\x8c\x16\x80\x54\x79\xde\xa0\x0d\x5e\x34\xba\x0e\xee\xe5\xfd\x16\x0a\x8d\x8a\x47\x1b\xbf\x0c\xc4\x3b\x9b\x47\xc4\xbd\xc2\xf6\x19\xe8\x07\x71\x6a\x30\x6b\xbe\x9b\x8f\x58\x03\x3d\x00\x0b\x0a\x1d\xea\x58\x5b\x8c\x98\x0f\x03\x50\x9b\x27\x3b\x0a\x5b\xf0\x3b\xad\x3e\xb4\xe9\x61\xb4\x89\x38\x0c\x9c\x87\xb5\xce\xcc\xb6\xe6\x2e\x80\x53\x5d\x15\x0c\xe1\xaf\x5a\x7a\xc1\x41\x56\xd4\x5e\x04\xa5\xc9\x4d\xe3\xea\x69\xf6\x4f\x50\x04\xda\x27\x01\x66\x10\x14\x37\x81\x7a\x4b\xc7\x05\xd3\x72\xba\x90\x9d\xb8\x41\x42\x4d\x87\x38\x07\x3c\x71\xd7\x85\xac\x32\x08\xcd\x3b\x23\x14\x3b\x82\x44\x50\x98\x2f\x88\x4f\x8f\xfd\x76\x39\x17\x94\xf1\xad\xde\x6e\x1a\x38\xd8\x44\x84\xe2\x04\x46\xdd\x81\xea\x85\xf8\x43\xf9\xf4\x40\x33\x9d\xf8\xa5\x5c\x83\x5b\xfd\x01\x86\x7d\x12\x74\x71\xb8\x7f\xa9\xf8\xd9\x74\x69\x33\x67\x86\x69\xe8\xed\xad\x14\x77\x24\xba\x20\x7f\x97\x8e\xc4\x2e\xe2\x6f\xd1\x11\x6f\x6c\xc9\x5d\xe4\x76\xbf\xa0\x88\x89\x4e\x00\x5f\x7b\xd5\xba\x59\x30\xf9\x23\x93\xff\x40\x34\x9b\xaf\xb3\x3a\x07\xde\x16\x72\x23\x56\xd8\xc8\x65\x5e\xeb\x05\x3e\xf2\x21\xab\x81\x35\xdc\xa9\xbb\x2e\xef\xb3\xb2\x01\x42\x97\xda\x3e\xe1\xde\x0e\xf6\xba\x2a\x91\x31\xcc\xba\xee\x1c\xcc\xc0\x8d\xa1\x7f\xa1\x3a\x4c\xb9\xe9\x56\xce\x17\x90\x74\x35\x18\xcc\x92\x06\x10\x9b\x3f\xab\xbc\xd0\x47\xe6\x2e\xab\x09\x20\xe4\xeb\x88\x03\xf9\x23\xe1\xbd\x33\x8a\xe2\x77\xe8\x57\x50\x2a\xa3\xb9\x6e\x53\x6d\xb2\x1d\xa3\x7a\x60\xac\xbb\x7e\xba\x4f\xcb\x44\x0e\x52\x6b\x44\x44\x5c\x81\xf9\xc9\x7f\xa7\xfb\x1c\x63\x4f\xb1\x61\xa9\x80\x3a\x36\x76\x2a\xf6\x5e\x21\x6d\xb6\x25\x76\xa2\x5c\x80\x0e\xb8\x81\x3b\x36\x82\xd7\xc6\xcf\x4c\x55\x4a\x34\x87\x35\xfb\xb6\x20\x4a\x86\x6b\x83\xcb\x93\xbc\xb8\xd3\x0d\x48\xd2\xdf\xeb\x1d\xd7\xce\x01\x1d\xea\xa1\xed\xba\xd1\xdb\x65\x55\xee\xd6\x2a\x5f\x09\xc7\xad\xa7\xba\x25\xdf\xed\xb7\xcc\x16\x0e\xf2\xe5\x07\x3c\x38\xf3\xa6\x88\x2e\x8d\xe0\x2b\xc1\x71\xe1\xda\xbe\x0b\x4f\x8e\x27\x6c\x1c\x90\x6c\xc9\xca\x1d\x15\x27\x78\x79\x2f\xa2\xf2\x30\x9c\x08\xee\x20\xee\xa2\xd3\x4d\x28\xac\x5d\x4d\x47\xf2\x22\x71\xd7\x78\x07\x55\x69\x55\x0b\xf6\xa7\x5c\xf0\x66\xca\x59\xfb\x20\x79\x6b\x17\x19\x49\x04\xb5\x4f\xd8\x8c\x67\x90\xd4\x65\xdc\x64\x74\xdc\xba\x5d\xc7\xe7\xa1\xee\xdf\xf6\x13\x75\x70\x66\xcf\xcf\x3b\x19\xa4\x0d\x7e\x7d\xb3\x6b\x1d\xa1\x20\xd4\x72\x30\x5b\xd4\x5a\x97\xe0\x78\x61\xb4\x18\x22\x88\xf4\xcd\x3d\x3f\x3d\xe8\x11\xa4\x89\x9a\x4e\xee\x92\x93\x24\xa0\x2b\x1b\x0e\x76\xb7\x2c\xf1\x24\xed\xd0\xa8\xa4\xf9\x7b\x6a\xa8\x3a\xf6\x54\x02\xd0\x00\xa7\xe7\x67\x44\x93\xb8\xbe\x56\x67\x35\x05\x4e\x7d\x8c\xd8\x1e\x2f\x19\x96\xdc\x8b\xa8\x1c\xfd\x10\x7f\x63\x78\xf6\x9c\xa1\x93\x35\xaa\xd0\x99\x01\xe9\x6d\xe0\x3d\x28\x21\x4b\x4f\xab\xe7\xe9\x07\x8b\x08\xe4\x6f\x10\xe4\xfd\x49\x48\xb6\xf7\xa5\xbc\x99\x9a\x3a\x3d\xf8\x2b\x70\x33\x3e\x16\x59\xf9\x4d\x3b\xe2\x04\xd3\xff\x6e\x69\xfd\xbd\xfa\xed\xc0\x55\x91\xf1\xa1\x08\x6f\x67\xaf\x8f\xc4\xd9\x61\x71\xaa\xc1\x6c\x38\xb8\x4c\xd4\xc7\x8b\x51\xa2\x66\xe9\x6c\x30\xec\x25\x91\x52\x7f\xe3\x65\x8c\xe4\xd3\xdc\x21\xec\x6e\x35\xf9\x29\x3e\xfc\x41\xdf\x2c\x32\xd3\xf4\xe2\xc3\x06\xd6\x94\xfc\xfa\x1f\x70\x7b\x4b\x1d\xfd\xbe\xba\xd0\xf6\x86\x82\x99\x9b\x7a\x04\xf2\xcc\x29\xf3\xbb\x99\xfa\xed\xa7\x04\x56\x8c\x0b\x5f\x02\x78\x13\xf1\x39\x26\xbf\x25\xa5\xd4\x5b\xbb\x7c\x71\x08\x3f\x67\x75\xbd\x53\x67\xd5\x2f\x6a\x00\x5f\x6d\x4d\x0f\x20\x5b\x84\xaf\x28\x6c\xc6\xd0\xa0\x3e\x3c\x58\x54\xf7\xda\xa9\x79\x1c\xf4\x22\xa2\x8a\x24\x36\xb0\x81\x96\xbc\x30\x55\xed\x4b\xfd\x38\xd4\x7e\xb3\x53\xc7\x3f\xa8\xab\xd9\xd0\x57\xd8\x1d\xbf\x73\xd4\x60\x33\xc1\x09\x32\x58\x34\x70\x6b\xc1\x98\xfd\xfb\x36\xbf\xcf\x0a\x84\xd8\xd1\xb6\x94\x38\x39\xd3\x63\x65\xfb\xba\x55\x35\x4c\x18\x2c\xd1\x81\x3f\xc4\xe4\xfb\x82\x2b\xd8\x9e\xfb\x4f\xad\x93\xef\x3d\x39\x5a\x79\xa0\xdf\x71\xef\x1f\x75\xee\xfd\x99\x6d\x41\x4a\xb6\xda\x63\xfb\xfe\xfb\x76\xf8\x7f\x76\x21\xbd\xfd\x4d\x17\xd2\x23\x5d\xf8\x83\x4e\x9d\x77\x7d\x35\x8d\xa1\xea\xbe\x62\x0e\x16\x94\x2f\xa7\xb3\x3f\xb8\x1a\x9f\xa7\xb3\x99\x17\xf6\x57\x17\x57\xf3\x2b\xa8\xfd\x02\xf4\xc2\x29\xc0\x17\x10\xb5\x00\x95\x5c\xe9\x4c\x8d\xc6\xea\xcb\x74\x34\x87\x32\x1e\x07\x57\x98\x9c\x9d\xa5\xd3\x99\x47\x46\x00\xe0\x05\xd0\x06\x0e\xdb\x32\x4d\x51\x7f\x7f\x4e\xe5\x58\x93\x69\x54\x49\xe6\x0a\x9a\x86\x93\xf1\x30\x9d\x8e\x19\xfb\x42\x32\xf0\xad\x1a\x3c\x5f\x80\xc7\x28\x11\xdb\x83\x80\xa2\xb1\x5d\x0f\x95\x44\x2f\x9d\x8f\xe6\xe7\x69\xe2\xaa\xd8\x46\xcf\x67\x67\x8c\xca\xd1\x12\x16\xb0\x1f\x7c\x9c\xa5\x04\xbc\x38\x1f\x40\xa9\x9d\x03\xb1\x9c\xa6\x67\xe9\x70\x3e\x4b\xd4\x60\x38\xbc\x9a\x0e\x86\xd7\xee\x47\x38\x34\xf8\x2b\xf1\x00\x28\xf9\x13\x85\x88\x93\x29\x00\x95\x4e\x47\x33\xa8\xc5\x1a\x7c\x3c\x4f\xfb\x6a\x36\xb9\x48\xd5\xbf\x5e\x4d\x47\xb3\xd3\xd1\x10\xc7\xf6\x74\x82\x30\xa9\xf3\xf3\xc9\x17\x78\x7e\xfa\x97\xe1\xf9\xd5\x8c\x20\x22\xed\x42\xbe\x44\xcd\x26\x08\x13\xf1\x5f\xbc\x18\x5c\xe3\x43\x2e\x2f\xcf\xaf\xed\x3a\xb8\x9e\x5c\x71\x4d\x93\x2c\x87\x2b\x7d\x39\x5c\xdf\xfe\x3c\xbd\x74\x15\x75\x54\x6a\x38\x4d\xff\xed\x6a\x34\x45\x78\x4f\x88\xe3\x49\xda\xd5\x73\x6e\x49\x05\x44\xa5\xd7\x93\x2b\xc4\x52\x5d\x13\xb6\x6b\xfe\x39\xb5\x33\xcf\xa5\x75\x9d\x44\xa5\x41\xe9\x5c\xa2\x2e\xaf\xc6\x23\x40\x2a\x4d\xa6\xbe\xc6\x6e\x3f\x79\x69\x08\x16\x8a\x0a\x04\x69\x4d\x52\x91\x98\x6b\xf3\xaf\x2d\x13\xfb\xa1\xdf\x51\x1d\x96\x45\x1a\xc2\x0c\x87\xdf\x17\xbd\x44\x63\xd7\x97\x4f\x65\xdb\xa6\xb2\x1e\x09\x26\x0a\x20\x84\x63\x6f\x70\xd2\x98\x26\xa2\x83\xc7\x74\xb8\xfb\x6a\xe4\x4e\x7b\xe3\x52\xcc\x50\xb3\x02\x89\xde\x7b\xed\x33\xbd\xcf\x71\x7d\x9d\x38\x72\xa7\x60\xab\x73\x03\x1c\x8c\x02\xde\x80\x34\xbc\xae\x6a\x4c\x14\xbd\xb9\x58\x82\xc1\xb2\x8a\xee\xa6\x62\xc1\x84\x53\x8f\x6f\x53\x72\x54\xc6\xa5\x18\x4c\xdf\xe7\x26\x8e\x13\x75\x92\xa8\x77\x89\x7a\x9f\xa8\x1f\x30\x16\xff\xcf\x61\x9d\x13\xc7\xab\xe3\x5a\xa7\x36\x3c\x27\x4a\xc8\x62\x64\xa9\x2b\x2d\x8b\xce\x6e\x9c\xf0\xe0\x50\xc9\xaf\xcc\xae\xca\xec\x69\xaf\x9b\x2d\x07\x5a\xb4\xcf\x2c\x70\xc6\x40\xad\xad\xeb\xa3\x63\xb4\x05\xd2\x88\xd8\x1b\x32\x64\x23\xc1\xd4\xbe\x69\xaa\x4d\xc8\x36\xe4\x03\x1a\x1e\xd0\xdd\xe1\x0f\x7a\x92\x13\x98\x5f\x5d\xb8\xd0\x0f\x2d\x0f\x68\xa2\x7d\x85\xed\xce\xb2\xce\x1e\xc2\x30\xf3\x61\x00\x08\xf2\x91\xfc\xac\x01\x8c\xc2\x8d\xd6\x08\x1a\x92\x44\xd2\x10\x29\x48\x5a\x74\x06\x7b\xf6\x47\x4f\xd4\x31\xf8\xf4\x4a\x54\xbd\x09\xab\x0e\xb1\xef\x50\x6f\x13\x14\x73\x8a\xd5\xec\xd3\xda\x30\x19\xb0\x7a\xfe\xb9\xa3\x4e\x0e\x0f\x86\xd4\x6e\x61\xd0\x0e\x8d\xa8\x7b\xbe\x23\x60\xd5\x76\xa3\x03\x58\x06\x43\x6b\xaa\x30\x9d\x22\x78\x70\x64\xac\xbe\x12\x0c\x08\xdd\xd4\x4e\xa6\x73\x6d\x53\xe4\xb5\x7d\x20\x88\xed\xf3\x2b\x3b\xdb\x11\x65\xf9\xfe\xce\x85\x31\x90\xdf\xad\x97\x0b\x57\xfd\xe6\x6b\xc0\xe2\xbc\x09\x80\x56\xb0\x72\xab\x55\xd1\xd6\xa5\x34\x2d\xc4\x87\xa3\xca\x53\x5f\xbb\x50\xfb\x02\x30\x2c\x12\xe5\xf8\x38\x9c\x9a\x4b\x5f\x60\xf2\x48\x8a\xd2\x89\x09\x6d\x6b\x04\xa9\xe0\x3e\xa5\x54\x2b\x57\x28\x72\x32\x4c\x50\xbb\x63\x05\x84\xeb\xaf\x2b\x77\xa9\x35\x62\xf2\x5c\x08\x93\x02\x3b\x14\x27\x0c\x52\xde\x3e\x55\xee\x1f\xd4\x59\xdd\x26\x02\x2f\xe3\x0a\xba\x13\x56\xdc\xc5\xa3\xed\x5a\x43\xd5\x24\x50\x45\xb2\x24\xfe\x23\xbe\x44\xa9\x52\x07\x9b\x2a\xc3\x88\x5c\x73\x52\xb7\x8b\x79\x44\x35\x0d\x94\xa0\x42\xc9\x94\x1c\xad\x1d\x05\x2c\x17\x77\x59\x7d\xcb\xd1\xca\xee\xa7\x0a\xfc\x59\x60\x2a\x48\x9c\x62\xd3\x55\x40\xfb\x9c\x42\x54\xb7\xb7\x9d\x82\xb4\xbd\x88\x20\x37\x01\x1a\x63\xda\x0e\x44\x58\x08\x9b\x88\x2a\x58\x4c\xd7\x06\xce\xc8\xfe\x57\xc0\x79\xee\xb8\x97\xf1\x3d\x3e\x92\x2b\x33\x15\x37\xe0\xcb\xde\xec\x90\xd7\xc5\xeb\xbb\x8b\xa2\x22\x2c\xd1\xcc\x24\xfb\x0a\xf2\xcb\x88\xa2\x5e\x67\x8b\x44\x23\x27\xaa\xd0\x1c\x04\x59\x96\x7f\x11\xe5\x69\x4b\xa8\x80\xf7\x89\x87\x4b\x60\xf2\xbe\x43\x78\xf9\x4f\x59\xf7\x3f\x65\xdd\xe9\x96\xf8\x3d\x64\xdd\xcb\x40\xa8\x1d\x66\x7f\x4b\x46\xdb\x9f\x72\xed\xbf\xa9\x5c\xfb\xdf\x50\x53\xfd\x1f\xe9\x5f\xff\xd5\x39\xf2\xbf\x9f\xfc\x7e\x04\xf0\x4f\xf0\xbf\xff\x70\x7c\xf2\x26\xe6\x7f\xff\xe1\xed\xc9\x9f\xf5\x7f\x7f\xc4\xbf\xf3\xed\xc2\xee\xd3\x88\xd1\x5d\xd0\xbf\x9f\xa0\x30\xcb\x70\x38\xb9\xb8\x1c\x8c\xaf\x47\xe3\x4f\xea\x72\x3a\xf9\x34\x1d\x5c\x3c\xab\x02\xad\x55\x70\x06\xa1\xcb\x8b\x74\x3c\x3f\xe8\xb9\x42\xb1\x04\xe2\x8f\x93\xd3\x2b\x64\x2d\x92\xaa\x38\xae\x26\x30\x75\xaf\x1d\x4e\xc6\xb3\xf9\x68\x7e\x35\x87\x02\xba\xe1\xe8\x72\x94\x8e\xe7\x2f\x67\x51\x5d\x15\xbc\xdd\xbd\xcc\x15\x53\xa5\x67\xa3\x31\xd6\x57\xd9\xbf\x1c\x0c\x45\x75\x12\x81\xf7\x05\xd0\x30\x4a\x77\xd2\x58\x39\x45\x47\x6b\x97\x81\xda\xda\xe1\xc1\xf9\xd5\x10\xba\x94\x84\xa9\xf7\x4b\x54\x97\x04\xb3\xc1\xbb\x4c\xd1\x63\xc1\x58\x75\x0d\xa9\xea\x24\xc8\x1b\x62\x54\xde\x79\x43\x1d\x4f\xa4\x54\x16\x9b\x5b\xf1\x57\x3f\xf8\xaf\x61\xfa\x01\x53\x28\xf4\xd8\xac\x5c\xbe\x82\xe2\x9a\xee\x1f\xab\x07\x30\x27\x97\x4b\x6f\xf0\xf3\x27\x37\xe4\xfb\x8b\x96\x4b\xd5\xbe\x72\x07\x8c\xa4\x8e\xbd\x3b\xfe\xee\x4b\x56\x08\x49\x5c\xec\x4c\x3e\x49\xa8\x74\xd1\x65\x05\x64\x88\x2d\xaa\x0a\x07\x09\x1a\x02\xc0\xc9\x9a\xe5\xf6\x70\xaf\xa3\x02\x9a\xbd\xdd\xcd\x8c\x92\x6b\xc0\xa1\x52\x0e\x44\x63\xb8\xaa\x03\x27\xd9\x71\x08\x48\xd2\x71\x1f\xba\x70\xbf\x83\x5a\x9b\x61\x24\x3c\x2d\x06\xd0\xbd\xe9\x94\x7d\x66\xff\xa6\x4c\x4d\x9d\xd7\x4b\x6c\xb0\xec\x57\x9b\x70\x19\xac\xdb\xea\x59\xe2\x53\x59\xf1\x0e\xa0\x9e\x6a\xe5\x5e\x7b\xce\x36\xca\x25\x90\x2d\x1a\x7c\x37\x51\x2f\xa2\xaa\x21\x1b\x32\x70\xdf\x02\x65\x80\x9c\x22\x2c\xdf\x02\x57\x83\x9c\x3e\xcc\x9f\xac\xea\xbc\xbc\xf5\x5e\xd3\x16\x61\x9f\xcc\xe7\x60\xaf\xf7\x60\x54\x90\xba\x16\x9e\x07\x96\xc9\xfa\x06\xea\xec\x9c\xe5\x1c\x0f\x57\xbc\xb9\x64\x59\x8f\x0b\x08\x70\x6e\x90\xa6\xdf\x4b\x0b\x2d\x20\xff\x5f\xee\x9c\xb4\x91\xe0\x15\x30\x1c\x44\x43\x6c\x35\xcc\xb6\xb4\xa5\x05\x4d\x6d\x12\x30\x12\xb7\xf4\xce\x19\xf6\xe2\x1a\xdd\xd1\xd6\xb8\x1f\xf0\x94\x61\x28\x21\xde\x9e\x3e\x7e\xa0\x5b\x1f\xbe\xe4\x08\x36\xdc\xc3\x5d\xc5\x71\xdf\x60\xa5\xec\x21\x0e\x0f\xe9\x45\xc5\xec\x1a\x2e\xdb\x81\x5a\x57\x7b\xa0\x62\x95\xab\x3f\x1c\x3b\x0b\x59\x3a\x78\xdf\xe3\xe3\x2d\xaa\x61\x99\x8a\xf0\x4e\x54\xb0\xb2\xa7\xb0\x45\xd6\xdf\xf8\x78\x90\x20\x15\xdd\xd4\x7a\x03\x34\xea\x3e\xc2\x84\x18\xbc\x6a\xf5\x3c\x60\x99\x88\x62\x21\x11\x55\x80\x35\x0e\x56\x2f\xa7\xa4\xe5\xf9\xed\x30\x4f\x19\xeb\x05\xc4\x2d\x49\x62\x56\x6d\xf4\x4c\x42\x8e\xeb\xfd\x31\xea\x3f\x70\xac\xe9\x38\xe0\xfe\xe3\x2a\x8a\x8f\x0e\x8e\xf5\x24\x58\x74\x65\x74\x51\x24\x84\x20\x6f\x2a\xfa\xcf\x7c\x0d\xdc\xc3\xae\x90\x15\x4c\x7a\x47\xb1\xf2\x7d\xe3\xfa\x9c\xc1\x03\x94\x66\xd4\x7a\x51\x39\x11\x1e\x65\xe8\x2e\x02\x5b\xba\x20\x0e\xd2\x74\x1a\x05\x37\x49\xdc\x4a\x38\x9e\xe5\xb3\xf8\x36\xe3\x8d\x97\xaf\x00\x02\x85\x88\xbb\x75\xc7\x12\xca\x0d\x5d\xb0\x74\x60\x06\x5d\xc6\xd2\xde\x65\xc8\xa1\x1c\xfc\x7c\x91\x6d\x8d\x36\x0c\x8c\xf0\xed\xa5\x38\x55\x75\xcf\x3c\xe1\xde\x5d\xf6\x33\xf7\x6b\x86\x29\xa0\x57\x3a\xcc\x7b\x21\x6a\x8b\xdf\x6f\xe8\x7e\x90\x35\x34\xb2\xdd\x89\x2a\x31\x07\x71\x98\xe7\xbd\xf8\xdc\xe3\xe2\xf1\xe0\x40\x52\xe3\x4a\x28\xe3\xeb\x5a\x61\xd8\x35\x08\x80\x61\xa5\x80\x8f\xdb\xfa\x15\xef\x63\x61\xc6\x95\x2d\xdc\x55\xdb\xdb\xbb\xf6\xa6\x61\x99\x19\x1f\x2b\x86\x15\x1e\xdf\x5c\xb2\x70\xc6\xbe\x3b\x87\x3e\xa9\xcc\x98\xad\x60\x91\x76\x89\x30\x8a\x8a\xc9\x17\xb9\xb8\x01\xaf\x15\x07\x6e\xe4\x5b\x94\x62\x80\x0d\x33\x05\x11\xcc\x63\x3f\x0b\x34\xe3\x74\xa5\x71\x42\x41\x7a\xf9\x66\x2e\x71\x30\xc4\xe0\xcd\x11\xe6\xa6\x12\x43\xb6\xaa\x6a\xb6\x03\x6e\x6a\x3b\x54\x0d\x77\x22\x30\x7d\x1c\x24\x91\x1b\xcd\x21\xb7\xc7\xdb\x19\x52\x5e\x1b\xa8\x9d\x29\x3d\x29\xa4\x28\x95\x15\x79\x55\xa1\xa5\xda\x91\x64\xa5\x03\xd0\xf7\x80\x8e\x3f\x3b\x25\x6b\xbb\x47\xaa\x42\x43\x84\xb3\x2a\x4d\xee\x7b\x6c\xf4\x62\x1b\x80\x0f\x1f\x6d\x78\xa9\x35\x64\xc2\xe8\x86\x07\xbc\x8f\xfe\x25\x5b\x6f\x0a\x8d\x7f\xb4\xa7\x72\xbd\xa4\x10\x4f\xb4\xb5\xa2\x7c\x56\x06\x52\xa5\xc2\xd6\xab\x62\xc5\x20\x67\xca\xe5\x80\x6d\x77\x5f\x7d\x69\x3a\x3a\x82\xea\x85\x94\x47\xe3\x57\xde\xe8\x55\x15\x6b\x8a\x74\xd8\x55\xcb\x8e\x55\xe2\x22\xc4\xb4\x65\x68\x13\x7c\x2b\xab\x87\x42\x2f\x6f\xb5\x6d\xd4\x1d\xc0\x2b\x57\xab\x7c\x91\x23\x95\x21\xdf\xcd\xbe\xc4\x2d\xde\x38\x02\x14\x5c\x09\x65\xc1\xf6\xb5\x1e\x14\xa6\x75\x50\x55\xbe\xe9\x33\x7c\x01\x34\x2e\xa9\x27\x03\xa0\xa5\x76\x9d\x00\x41\x72\x20\xd0\xdf\x3f\xbc\x1c\x85\x86\xd4\xd4\x3e\xcd\x02\xa2\x70\xb4\x6b\xf7\xa1\x74\x6d\x14\x29\x93\x40\x6a\x42\xa0\x3f\x8f\xfb\x76\xa0\x30\x72\xc6\xa1\xfc\xe6\xd9\x22\x58\xc2\x7f\x3b\xe9\x23\x6a\x52\xb4\xdb\x88\x1e\x2d\xe3\x8b\xd1\x9d\x18\x4d\x56\xde\xe6\xd6\x88\x27\xc2\x8e\x7d\x62\x3b\x55\x2d\x87\xee\xe5\x9e\x9e\x06\xba\xc1\x58\xb2\x86\xf9\x16\x4f\x11\xcf\xbe\x67\xe8\xa6\xbe\x81\xf6\xcb\x06\xe3\x98\x3e\xe3\x9d\x49\x28\x60\xe1\xfe\x2e\x86\x19\xcd\x52\x47\x7f\x26\xf4\x9d\x4d\x24\x1f\x15\x99\xba\xf0\x87\x87\x10\x89\x25\xd3\xfe\x5c\x28\x0f\x70\x63\x98\xc4\xa0\xb8\x52\xaa\xe1\xd7\xf1\x54\x02\xc6\x1e\xf3\x52\xe5\x91\x3c\x20\x13\xf9\xb8\x47\x9f\xb1\xd6\xb5\x75\x5f\x1b\x3e\xa3\xa1\x4a\x34\x6f\x40\xe2\x0e\x92\x00\x98\x24\x5a\x6c\x8b\xcc\xe9\x41\x7d\x08\x86\xe5\x26\x1c\x16\x30\xfb\x96\xfa\x39\xa3\xe2\x6f\x06\xfb\x26\xca\x03\xc8\xce\x23\x3c\x2e\x81\xd8\x38\xfe\xaf\xae\x8c\x02\x33\x4e\xb6\x52\x0a\x9e\xbb\xa4\xa8\x4c\x63\x77\xd0\x2a\x6f\x4c\xb4\x6c\xf0\x2a\x37\x0d\x91\x78\x12\xf0\x40\x32\xdc\xa2\x06\xc7\xb3\x15\x53\xda\x36\x5b\x2c\x9f\xe2\xef\x02\x38\xc6\xf9\x90\xfc\x48\x87\x64\x70\xbe\xc8\x02\xd0\x26\xa8\x5f\x05\x6c\xba\xed\xf7\x26\x5f\x6c\xab\xad\xed\xa4\x17\xd5\x11\xdb\x84\x17\xb1\x47\x39\x1e\x0e\x41\xe6\xff\x4d\xb2\x3f\xe8\xe4\x85\x57\xb1\x56\x98\x70\xa9\xd3\x48\xc5\x61\x18\x89\xd7\xb4\xac\x1d\x6c\x3f\x15\x36\x44\xd9\x15\xf2\xa7\x1b\x24\x29\x6c\xb9\xee\x2d\xea\x55\x51\x25\x02\x57\x9b\x91\x6c\x79\x53\x2f\x31\x63\x2f\x12\x7e\x63\xfb\x3d\xb1\xa9\x68\xfb\x67\xaa\x7d\x4d\x27\x95\x44\x36\xa5\x44\x68\x07\x63\x3d\x2e\xf4\x53\xeb\x80\x57\xe2\x46\x47\xf1\x99\xbe\x9a\x94\x8b\xf8\x8f\x28\x89\xef\x42\x3a\x70\x0f\x73\x1a\xb2\xf1\x35\xe4\x90\x18\xbf\xaf\xbe\xd1\xb8\xbf\xed\x03\xe3\x56\x3a\x1d\x02\x2f\xbc\x08\x66\xbe\x80\x69\x76\x10\xd2\xa5\x5f\x48\xb0\xd7\x03\xd9\xf3\x6c\x01\x19\xa9\x85\xae\x41\x3a\x23\xb8\xef\xbb\x72\xc2\xba\x84\x74\x4d\x6d\x12\xaf\x81\xc9\x6c\xc0\x42\xb0\xeb\x9b\xee\xab\x2f\x77\x79\xa1\x1f\xa5\xdd\x58\x65\x0b\xfb\x1e\x26\x65\x10\xb0\x57\x51\xf4\xe2\xac\x13\xa8\x7a\x11\x9b\xe2\xe1\xae\x0a\x15\x34\xe4\x45\x2b\x1f\x46\xf4\x41\xb8\x3b\x21\xc8\x72\x57\x6d\x8b\x25\x69\xcb\xc9\x05\xc6\x42\x3b\x2c\x3b\x88\xd8\xf6\x4d\xd5\xd0\x89\x12\x1e\x55\xa1\xe7\x00\x59\x71\x6b\x06\x91\x85\x26\x9b\xfa\xab\x9a\x49\xe7\x96\x7c\xce\xa1\x14\x76\x96\x31\xbd\x9e\x33\x43\xed\x4a\x85\xc5\xbf\xd4\x2b\x5d\x2e\x1d\xed\xd5\xba\xb4\x1b\x01\xeb\xbe\xe5\xfa\x3e\x3c\x18\xd1\xa7\xf6\x8e\x90\x11\xc9\x9e\xca\x6e\xb3\xbc\x34\x24\x34\x55\x19\x63\xcf\x52\x97\xa7\x85\xe3\xd6\x34\x46\x1d\x7a\x7e\xac\x62\xa7\x0e\xce\xe1\x8b\xf6\xd7\x92\x2e\x05\xef\xc8\x04\x58\x4b\xb6\x39\xe7\x49\x11\x99\x85\xe4\xd0\x04\xbb\x93\x5e\x40\x60\xe5\x72\x63\x1a\xe0\xe7\xed\x6c\x72\x54\x4f\x06\x5e\xab\x73\x4b\x81\xe0\xd7\x6e\x7e\x62\x81\x30\xc2\xff\xef\x1a\xd3\xae\x2c\xbb\x6d\x78\x97\xc6\xd8\x73\xa7\x14\x5d\x61\x99\x1e\x66\xa3\xd3\xd0\x6b\x48\xe4\xc9\xf9\xbe\x80\x5b\x20\xfb\xa2\x56\x38\xb6\x44\x04\x8e\x29\x62\x40\x41\xa0\x17\x01\x97\x4c\xa1\x6f\x91\xb9\xac\xc3\xbb\x90\xb6\x01\xca\x03\xd6\x4b\x8c\x9f\xfc\xfb\x36\x2b\x40\x62\x34\x2b\xf7\x0e\xae\x3d\x09\x7f\x52\x59\x0f\xca\x9e\x36\x4d\x01\x07\x14\x9f\xae\xfb\xc7\x90\xb1\x2e\xae\xb0\xc2\xf6\x06\x2d\x93\x9b\x1e\x79\x27\x8f\x3c\x01\x29\x9d\x9b\xba\x2a\x12\x5a\x73\xc8\xed\x2b\x68\xa4\xf7\xbe\x1b\xcf\x8c\x25\x2a\xa7\xbb\x98\x3a\x27\xb8\x8d\x6e\x1a\xac\x53\x53\xa5\xbe\xad\x9a\x9c\xe5\x04\xe7\x8f\xac\x30\x7b\x66\xa2\x29\x94\x5b\xb7\x8b\x8d\x7a\xdf\x33\x95\x35\xce\x7e\xd7\xbf\x6c\x1c\xc6\x2b\x70\xe1\xc2\xd3\x61\x4d\x20\x4d\x7f\xbd\x3f\xff\x88\xb8\xa4\xbf\xfc\xc5\x36\x3b\x6b\xc2\x01\x80\xf3\x06\x6b\xe6\xbb\x46\x08\x20\x67\x64\xa7\x74\x8f\xbd\xfd\x35\x22\x51\x64\x2d\x03\xef\x65\x0f\xa3\x13\xa6\xa5\x83\x0f\x54\xbe\x6d\x09\xa1\x6c\xdb\x0f\x41\xfc\x98\x30\x8b\x39\x77\xd4\xdd\xa2\xb6\x47\x0a\x56\x55\x9f\x6a\xdc\xe4\x4e\x4a\x1e\x5b\x1a\x0f\x70\xfe\x23\xbc\xd8\x9d\x94\xdc\x22\x71\xce\x04\xb6\xaa\xe8\xd9\x33\xbb\x43\xf6\x37\x8a\xc9\x6e\x6b\x21\x74\xd6\x8a\xd2\x40\x11\x74\x80\xb5\x01\xae\xbd\x5a\x9b\x6d\xd1\x3c\xda\x17\x30\x50\x36\x4e\x28\x94\x7e\xce\xd5\x20\x9e\x53\xf4\xda\xfe\x85\xe0\xf9\x83\x19\x97\x53\x9c\x5f\xab\x59\x3a\x57\x67\x93\xe9\xfc\xb3\x1a\x8d\xa3\x94\x66\x12\x24\x45\x65\x2e\xd6\xf1\x9a\x2a\xc7\x6b\x9a\xc4\x42\x4b\x50\x61\x31\x15\x74\x93\xb2\xc8\x23\x51\xe9\x48\x6a\x2b\xd9\x6f\x72\x5d\xc2\x13\x05\x1c\xf6\x11\x8f\xbd\x82\x4a\x3a\xc6\x93\xf1\x51\x58\xa0\x11\x49\x15\xd9\x5f\x3e\x55\xe6\x41\xc6\xb8\x0f\x9f\xe4\x86\x65\xac\xdc\x4a\x44\x9f\xd7\xe9\xa7\x38\x4c\xf5\xc6\x1e\xbc\x75\x9e\x35\x1a\xcc\xa4\x6a\x45\x4a\xdd\x41\x2d\x5c\x14\x2a\xc1\x53\x8a\x62\x49\x08\x2b\x32\xdf\x4c\xab\x76\x19\xf8\x32\x05\xa9\xc9\x23\x5c\xd6\xcf\xe2\xe8\x81\x77\xb8\x1b\xbd\x5a\xd9\x93\x06\x9a\xa3\xeb\x1a\x14\x23\x62\x4c\x4e\x44\x44\xc6\x76\x81\x7d\x22\xc0\x85\xb0\xbf\xcb\xac\xc9\x12\x7e\x96\x61\x45\x95\x8d\xf7\x4d\xb7\x25\x81\x6d\x08\x7c\x4a\x32\x65\xf5\x76\xc3\xd7\xab\x63\x72\x37\x5c\x7b\xc2\x84\xb7\xe9\x14\x4a\x6c\x98\xf4\xf6\x57\x2d\xef\x31\x2d\x42\x97\xe3\x57\x63\x2a\x28\x01\xdd\x20\x6b\x50\x4f\xa6\x33\x35\xfb\x3c\x38\x3f\x57\x9f\x07\x3f\xa7\x58\x81\x12\x10\xed\xfe\xc6\xca\x4e\x4f\xaa\x39\xcd\x59\xca\xa9\x97\xa8\xcf\x93\x2f\xe9\xcf\xe9\x54\x0d\x07\x57\xb3\xf4\x14\xea\xad\xa8\x4a\x86\xea\x63\xe4\x08\xf9\x32\x22\xe4\x8d\x05\x5d\xa4\x44\x59\xc7\x61\x38\x97\x5f\x23\xa9\x24\xd9\x14\x2f\x8f\x14\x14\x5b\xf5\x5c\xd9\xcc\x68\x4c\xfb\xf2\xda\x57\xd0\x50\xc5\xcc\xe3\x50\x0b\xaa\xad\x21\xb2\xdd\x94\xcf\x88\xfd\x82\x4f\x5c\x74\xf3\xfd\x25\x36\xe9\x5f\x2e\x6d\xb7\xa0\xeb\x93\x73\xfb\x47\x91\xad\x22\xc3\xd9\x5e\x87\xe2\xaf\xe0\xb4\xe7\xa6\xb5\xd9\xbb\x94\x5d\x43\x99\x0a\xfd\x0b\x26\xa3\x96\xf6\x48\x30\x0d\x95\x69\xd4\xfa\x76\x4b\x2a\x2e\xea\x90\xfd\x25\xfa\x2a\x33\xee\x80\x2c\x06\x72\xc4\xf1\x97\xc3\x90\xfb\xa2\xda\xda\xab\x43\x9b\x1e\x57\x09\x7c\x4a\xc7\xe9\x74\x00\x5d\xda\x0b\x23\x1f\x84\xb1\xb5\xbf\x0f\x20\x79\x24\xde\xfd\x3c\x28\xb9\xf5\x75\x9a\xea\x6f\x81\x1f\x1f\xad\xe4\x55\xe0\x31\xd6\x2e\x04\xdf\xb0\x3a\xaa\xf3\x9d\x42\x3c\x43\xac\x28\xce\xbf\x14\x03\xde\x54\xde\x45\x3f\x14\xc9\x73\xb5\xa8\x2b\x63\x8e\xd0\xca\xac\x68\x15\xe8\x1a\xff\x1b\x2c\x45\x72\xae\x10\x21\xc4\x6a\xf9\x32\x37\x60\x64\xde\xad\x15\xa1\x62\xce\x9d\x28\xa1\x15\xaf\x9e\x58\xa5\x2b\x73\x54\x96\x4b\xfb\x9f\x14\x43\x75\x03\x91\x1b\xe0\xa0\x59\x46\x31\xa2\xfc\xfb\x47\xb2\xdc\x71\x3a\xe8\xd7\x0d\x0b\x7a\x47\x78\xe1\x46\x49\x31\x0a\x49\x1d\x62\xd8\x12\xb5\xf4\x45\x9a\x31\x72\xf3\x60\x16\x71\x2b\x1a\xa1\x53\xca\x89\xc3\x9e\x73\xb4\x4c\x34\xa0\x2f\xb9\x7f\x87\x86\x27\xa9\xf5\x85\xa8\xba\x2f\x54\x18\x3f\x39\xbc\xe9\xfd\xea\x09\xb0\x0b\x18\xa2\x78\xed\xb7\x3d\x6b\xa2\xf3\x95\x3d\x07\x56\x59\x5e\x98\x58\xb6\x53\x30\x2b\xad\xb3\x46\xd7\xd6\x48\x75\x45\x60\x8f\x65\x1e\x08\xd7\xc2\x01\x97\x2d\xdb\xff\x2b\x94\x15\xc1\x09\x14\xec\x21\x48\x35\x8e\x61\xef\xb5\x56\x1c\x19\x5b\x54\x20\x80\x96\xe1\x54\x90\xa7\x59\x56\xa5\x3f\xa6\xb1\xbe\xe6\x3b\x7a\xef\xfa\x9d\x74\xdc\x12\x95\x5a\x40\x25\xdc\x96\xfc\xca\xc7\x82\x02\x99\xb5\x18\xed\x3a\x36\x7b\x18\x6e\xfa\xea\x33\x97\x3e\xca\xc6\xc9\x30\xc1\x5e\x91\x12\x21\x8e\x1c\x6c\x6e\xdf\x64\x19\x2c\x90\xcd\xc2\xd9\x75\x95\x6a\x88\x23\x81\xc2\x46\x58\x28\x04\x44\x5b\x33\x11\xa7\xb9\x53\xa5\x7e\x60\xd0\x93\x91\x5b\xb0\xd6\x14\x24\xef\x75\xcc\x6f\x1b\x35\x8d\x16\xb5\x78\x18\x0f\x58\x5b\x51\xea\x36\xbf\x07\xff\x75\x89\x5c\xe4\xdb\xdc\x00\x9b\x2f\xff\x0e\x79\xe0\xd1\x61\xe7\x6e\x89\x76\x05\x89\xf4\x1e\x86\x3b\x8b\x87\x6c\x67\xa0\xaa\x47\x64\x88\x22\x0e\x81\xbd\xcd\xa2\x2a\x5b\xc4\x1c\x34\xea\x41\x30\x1d\x47\xa7\x1b\xae\xcb\xec\xf1\x5e\xe6\xc6\xa3\xd2\x93\x56\x94\x01\xea\x1d\x1f\x49\x27\x8a\x8e\xb6\x50\x03\x3d\x51\x14\x20\x9a\x00\xf0\x06\x40\xc2\x61\xc6\xee\x2e\x2b\x79\x9e\xef\xb2\xa8\xd6\x13\x40\x7f\xbb\x96\xb4\x15\x55\x30\x04\x85\x13\x54\xb6\x28\x89\x3d\x4f\x0e\x33\xe4\xfc\x80\x03\x8b\xaa\x4b\xe5\x9a\x24\xf4\x98\xd3\xc9\xf6\x64\x4a\x1e\x87\xda\x1d\xc4\x22\x4b\x48\x0e\x57\xb7\xdb\xf3\x1c\xa1\xec\xa7\xc4\xb1\xa3\x24\xca\xf7\xaa\x5e\x07\x72\xd7\xf3\x96\x11\x76\x5b\xdd\xeb\x5a\x14\x7f\x75\xea\xa1\x8d\xf5\x83\xba\x66\xfa\xaf\xfd\xc3\x22\x7f\xbb\x4f\x2f\x0d\xe6\x3f\x2c\x3a\x8a\xf7\x5c\x8d\x77\xaa\x8c\xc9\xee\xd1\x86\xaa\x10\x04\x50\xc2\x82\xda\xe9\xac\xa6\x45\x8f\xb0\x63\x0a\xe0\xd3\x13\xb2\xba\x32\xbc\xf1\xa9\x2c\x25\x83\xf9\x17\x4a\x4f\x60\x0d\xfd\x75\x6b\xad\x32\xb8\x3e\x1c\x73\x94\xd9\x16\x70\x7e\xf9\x2b\xed\xbf\x46\xd9\xc4\xff\x36\xff\xfa\xaf\x96\x7a\x53\xeb\x85\x3d\x25\xfe\x9f\xf3\x4f\x97\xe7\x47\x27\xfd\xe3\xdf\xb8\x14\xe4\xf1\xfa\x8f\xf7\x27\xef\x4f\x4e\xa2\xfa\x8f\xb7\xc7\xef\xde\xfe\x59\xff\xf1\x47\xfc\xfb\x34\xbe\x52\xe7\xe9\x6c\x96\x4e\xd9\x4f\x8d\x4a\x36\x5e\x70\x2d\xc8\x49\xff\x38\x51\x67\xfa\xa6\xde\x5a\xef\xec\xf8\xc7\x1f\x7f\x7c\x11\xe6\xab\x8f\x7f\xfc\xf1\x38\x81\x0f\xd4\x59\xad\x85\x00\xff\x59\xb5\x2d\x59\xad\x6f\x54\x2e\xfa\x2f\xde\x1d\xab\xb3\x3a\x2b\xbf\x15\xf6\x5a\x6a\x6a\xad\x9b\x44\x9d\xe5\xab\xe6\x4e\x9d\x15\x55\x55\x27\xea\x63\x65\x1a\xfb\xed\x8b\x81\x7a\x7d\x72\x7c\xfc\xfa\xe8\xf8\xcd\xeb\x63\x75\x35\x1b\xbc\x48\xef\x75\xbd\x23\xbf\xdf\x17\xa9\x81\xc5\xbb\xd9\x45\x4c\x56\xf6\x6a\xbd\xc9\x9a\x7c\xed\x18\xcd\x57\x61\xca\x93\x31\xdb\xc8\x53\x0b\x89\x62\xbc\xb2\x5d\x19\x68\x51\x54\x0f\xf6\x8a\xf8\xbf\xe0\x82\xc0\xa0\x3d\x89\x0a\x38\xac\x78\x64\x43\x9c\x6b\x63\x74\xad\x3e\x5d\x9e\xf7\xd5\xa8\x41\x50\x29\xf8\x3d\xae\x00\xdd\x6c\x81\xb6\xd7\x27\xbb\x61\x12\xf2\x9b\xda\x0e\x6c\x58\x89\x93\xb8\xa7\x9f\x24\xea\x0e\xd9\x57\x85\x15\x44\x62\x3b\x76\xcb\xfe\xdf\x2f\x2e\x6b\x9d\xad\x6f\x0a\xfd\x62\x2e\x81\x8b\x2b\x20\xd0\x37\x8d\xc0\xc0\x03\x34\x9a\x4a\x9b\x59\xd5\x2e\x7b\xc8\x76\x6a\x57\x6d\x6b\xb5\xaa\xb5\x5e\x5a\xbb\xb0\xb2\x66\x68\x8d\xd6\x27\xf1\x78\xe6\x4d\x5f\x7d\xdc\x91\x5e\xad\xa1\xd8\xb7\x6d\xfd\x27\xac\x27\x8d\x5a\xdf\x4e\xba\xdf\x6e\x33\xb8\x97\xf5\xd3\xef\x02\xf8\x31\x37\xfa\xe8\xc8\x87\x03\x88\x41\xcb\xf5\xc7\xfa\x50\xf6\xbb\x2b\xcc\xb1\xc1\xbd\x05\x69\xf0\xfe\x8b\xb9\x98\xed\x24\x98\x9d\xce\xf6\x26\x92\xe9\xd8\x54\x6b\xcd\x60\x96\x62\x27\x79\xd9\xdc\x9b\x37\xd9\xe2\x5b\x76\xab\xcd\xd1\x51\xb3\xdb\x10\x95\x4b\x01\xf3\x98\xdb\x3f\xd2\xec\xee\xdb\x0c\x22\xcd\x4a\x4c\x84\x90\x36\x5f\xea\x45\xbe\x04\x8b\xdc\xde\xd3\x76\xc4\x81\xca\x2d\x2b\xe9\xbf\x55\x53\x55\xb8\x60\x1f\xec\x68\xdc\xde\x6a\xd3\x00\x7d\x2a\x2e\xcb\xe6\x2e\x2f\xbf\xa9\x45\x56\xeb\xd5\xd6\xb6\x27\xbb\xa9\xec\x57\xc9\xde\x0a\x96\x3f\x55\xba\x02\xef\x98\x5d\x7a\xdd\x83\xc2\xab\xfe\x46\x83\x56\x33\x44\xcb\xf4\xed\xce\x35\xb0\x74\x35\x0a\x04\x41\x5a\x64\x76\x24\x1d\x2a\x94\x82\x68\x45\xc6\x0e\x3b\x28\x43\xf4\x5f\x7c\xb1\x1e\xf6\x03\x0c\x71\x06\xea\x2b\xc1\x84\x27\xf6\x23\x34\xd3\x56\xba\xae\xc9\x47\xe2\xf5\x02\xe1\x7a\x50\xb8\x68\xd4\xa6\xce\xad\x07\x39\xd9\xee\x9b\x55\xd3\x5a\xf1\x72\x21\x65\x38\x78\x4c\x67\x23\x97\x64\x87\x24\x42\xd4\x4a\x0c\x13\x22\x17\x00\x55\x0e\x43\x96\xab\xbe\xcf\x17\xe0\x93\xdb\x47\x3f\xe4\xe6\xae\xf7\xc1\xbf\x8a\x0c\xec\x18\xa9\x67\x67\xf8\x56\x37\x70\xfa\xd0\x0f\x33\x6b\x8a\x36\xe2\xa7\xf6\x3b\xb4\x3d\xc2\xb2\x16\x44\x7e\xa8\x4d\xae\x17\xd8\xcc\x1c\x98\x65\xac\x7f\x81\x30\x7e\x0a\xf3\x7f\x20\x4b\x95\x9e\x87\xdb\x93\x03\x72\xf2\x2d\x4b\x30\xf3\xa1\xe2\x21\x2f\x6f\xed\x56\xaa\xec\x43\x1a\xeb\xf7\xc0\xd6\x45\xcb\x10\xa6\xa9\xd4\x62\x58\x25\x67\x3f\x3e\x72\x55\xd5\x37\xf9\x32\x84\xba\x40\x66\xaf\x84\x13\x87\xde\xe3\x5d\x0d\x6b\x6c\x9a\x6f\xf8\x51\x65\xa7\xa9\xd6\xec\x30\xb9\xef\x81\x5f\x69\xe2\xb7\x11\xaf\xaa\xc6\x18\xc0\x1e\xd4\x8c\x9d\x26\xfb\xec\x3c\x26\x1d\x0e\x6e\x09\x4d\x1b\x19\xf3\x1e\xf8\x55\x72\xbb\xf2\xa6\xff\x22\x06\xfd\x3e\xe7\x49\xde\xeb\xb9\xad\xb3\x26\x87\xbe\x22\x7e\x6f\xa5\x75\x82\x6f\xd8\x9a\xc6\xd3\x08\x7b\x96\x7c\x38\xd7\x04\x0c\x1a\xc6\xf5\x41\xab\x5b\xbb\x6a\x77\xd5\x56\x50\xdf\x47\x6b\xbb\xb9\xd3\x80\xb3\xad\x12\xb7\xee\xc4\x5a\xc3\x45\xe4\x96\xa1\x63\x62\x2e\xec\x19\xc2\xf1\xec\xa5\x54\x85\xe6\xae\xb8\xd6\x12\xe8\x15\x23\x4e\xda\xba\x45\xe8\xaf\xaf\xf2\x42\xb7\x39\x5c\x4c\xa2\x4c\xe5\x5b\x06\x0d\xa9\x35\xbc\xae\xb9\xd3\xeb\xd6\x8b\xc8\x6f\x59\x67\xdf\x20\xee\x17\xd6\x42\xba\xef\x10\x7f\xe2\x7a\x93\x17\x78\x7f\xf7\xd5\xa0\x5c\xfa\x36\x9a\x3b\xc4\x31\xac\x79\x4d\x43\xf4\x0b\x1a\xa2\x77\x00\x67\x56\xc8\x64\x45\x8b\xeb\xc5\x17\xdd\xb5\xd8\x59\x6f\xab\x79\xa8\x8e\x4c\xa3\x37\x6a\xad\x9b\xbb\x6a\xf9\x93\x3a\x3c\xee\xd9\xd9\xf0\x00\xe6\x60\xa8\x6c\xf3\x0e\x4f\xe0\x1b\x58\x13\x83\x8b\x5e\xde\x4c\x18\xb6\xb8\x05\xb7\x0b\xc6\x1f\x5c\x3c\x21\xcc\x44\x06\x4e\x5c\x9a\xf4\x0a\x2e\xf7\x25\x03\x3d\xe8\x95\xc1\x66\x05\xd0\x9c\xd8\x7b\xb0\x63\xe1\x64\xe1\x1d\x9b\x37\x0a\x15\x27\x0a\xeb\x28\xf2\xdc\x38\x02\x70\x47\x72\xc1\xcc\x08\x70\xa0\xf0\xab\x08\x9a\x97\x87\x7b\x26\x37\x9e\xa0\xe3\x66\x07\x57\xa9\xb5\xd9\x74\x41\x21\xb9\x4d\x66\xf0\x76\x48\xe2\x85\x4e\xf0\x2f\x9a\x13\xbb\xca\xdd\x5a\x81\x23\x9a\x0c\xb3\xae\x62\xbf\x60\x69\xf9\x4f\xf1\x6e\x05\x74\xc2\x66\xdb\x64\x21\x4d\xd5\x8d\xa6\x8c\x09\x36\x74\x53\x57\x37\x85\x5e\x33\x4b\x09\xcc\x25\xf2\xad\x63\x6d\x19\x7c\x89\x40\x97\x2f\xce\xec\xe3\x8b\x5d\x22\xed\x01\x2c\x87\x42\xc5\x0c\x24\x7a\x41\x74\x7b\xad\xb3\xc6\x23\xa0\x40\x8a\x01\x89\x41\x01\x75\x2e\x4e\xe8\xbe\xfa\xa2\xe1\xc6\xe8\xb8\xa7\x32\x45\xc5\x8b\x76\xdb\x40\xb4\x43\x80\x7a\x03\xf1\x0d\x30\x7f\x90\xa1\x59\x3e\x1c\x5a\x7f\xd3\x90\x46\x7d\xe6\x4f\xcf\x7b\xcf\x8a\x84\x0a\x02\x1c\xea\xbf\xab\x8a\x25\x45\xf1\x18\x40\xf7\x60\xc7\xc3\xe4\xa6\x11\x50\xdc\xb0\xc8\x01\x5f\x41\x14\x9a\x59\x6c\x1f\xf3\x1a\x61\x01\xeb\x2e\x6d\x0a\xe4\xe5\x0a\x2e\x7b\xc1\x40\x13\x09\x86\xf5\x5f\x5c\x58\xfb\xd6\x9a\xa1\xde\x7a\x90\x55\x9b\x6b\xed\xad\xb2\x04\x01\x9d\x41\x51\x94\x37\x80\xf6\x5a\xb2\x44\x44\x13\x98\x92\x60\xb5\x3f\xdb\x9c\xe4\xfb\x48\xd8\x91\xa2\x51\x80\x45\x31\xea\xdf\xb7\x79\xa3\x05\x67\x9b\x63\xee\x7d\xc2\x46\x83\x55\x83\x44\x22\xc2\xbe\x83\x5c\x28\xbd\xd6\xbd\x0b\x98\x52\x19\x5a\x86\x1e\x14\x1c\xf7\x98\x7a\x41\xbe\x3d\xff\xd5\xa6\x02\xe0\x7a\x60\x43\x90\xe9\x96\xb9\x55\x05\xaf\x2c\xbf\x31\xfe\x21\x6b\x5f\x78\xa6\x71\x54\x87\xa0\x55\x82\xcb\x0f\x4c\xfe\xa5\xff\xf6\x9e\x8a\xbb\xe6\xa1\x82\x57\xd8\x33\xb1\xd8\xa1\xbd\x48\xd9\x25\x57\x2c\x4c\x34\xed\xa2\xce\x92\x7e\xec\x8e\x01\x77\x60\xcd\x9f\x61\xf2\x36\xbc\xdc\x69\x84\x0c\x27\x6e\x70\x9c\x40\x21\x88\x8e\x3c\x62\x6f\x92\xed\x5e\xd9\x1f\xd8\xff\xb7\xa8\x73\xc8\xb7\xb0\xdd\xb8\xac\xa8\x2e\xf1\xd1\x65\xe3\xde\x09\x61\xbc\x22\xfb\xc5\x3f\x67\x05\x91\x58\x6a\xc4\xfe\xeb\x19\x2e\xb0\x05\xda\x0c\x62\x3d\xd8\x6f\x1c\xe0\xab\x0f\xf6\xbd\xfb\x46\x63\x7c\x30\x6f\x30\xf3\x73\x0e\x4c\x78\xfe\x3a\xe1\xd3\xe5\xa5\xf1\x96\xf2\x5d\x56\x3e\x6f\x91\xb2\x3b\x4c\x36\x83\x61\x3d\xd0\xc0\xa4\x5e\xea\x7b\x5d\x54\x1b\x7b\x80\x9d\x13\x34\x27\x2b\x25\xd7\xee\x3d\xb1\xb8\x6b\x88\x3c\xb6\x97\x27\x99\x86\xcb\xdc\xb8\x1f\x91\x34\x17\x5c\x35\x99\xa9\xc0\xef\x60\xde\x9d\xa7\xd6\x02\x38\xd0\x98\xca\xa1\x7d\x21\x72\x42\xc2\xa5\xe4\x51\x76\x9d\x13\x6f\xcf\x4b\xb7\x11\xc9\xa3\x54\x8b\xbc\x5e\x6c\xd7\xf6\x7e\x58\x68\x13\x19\x94\x55\xa9\x6a\x48\x96\x2d\x16\x99\x71\xd4\x93\x84\x0a\x07\xdc\x3a\x3f\x85\x4d\x6f\x5d\x2e\xaa\x6d\x9d\x91\x5f\xf0\x60\xdf\xdf\xd8\x6b\x08\x41\x11\x1c\xf0\x8d\x4e\x83\x9d\xbf\x31\xf3\x06\x13\x75\x20\x9d\xba\xd4\x47\xab\x6c\x01\xf4\x90\x59\xb9\xcc\xea\x65\x5f\xcd\x2b\x95\x2d\xee\x72\x7d\x8f\x47\x4c\xd2\x1e\x76\x77\x9e\x53\xcc\x84\xfd\x43\xb9\x2c\xd5\x00\xd7\xf4\xaa\xa6\x92\x00\xa0\xc0\xc8\xb9\xa8\x23\xb0\x2c\x70\xf9\x35\x4c\xe8\xf7\xd7\xea\x46\x65\x06\x7a\x56\xec\x14\x60\x87\x5d\x13\xc4\xc4\x8c\xe8\x6a\x40\x1f\xd4\x99\x31\x45\xde\x34\x98\xbd\xbf\xb5\xdd\xbf\xd9\x21\xca\xca\x91\x53\xc9\xf7\x92\x9b\x29\xb2\xc7\x25\x5e\xf2\x72\xd1\x3c\xba\x81\xfb\x2f\x46\xcc\x46\x6d\xdb\x61\x92\xc8\x92\x83\xc4\xa4\xf4\x98\x9d\xd9\x54\x76\x8c\xab\x86\xe4\xaa\x9d\x97\x5b\x80\xbc\xd7\x42\x62\x79\xa3\xab\x4d\xa1\xfd\x33\x0b\x70\x44\x6f\xaa\xe5\xae\xe5\xaa\x46\x85\x8a\xed\x16\xf1\x95\x36\x74\xa1\xa8\x47\x9b\xb3\x46\x35\x18\x38\x22\x65\x23\x60\xfd\xdd\x55\x05\x3e\x8c\x10\x62\xf6\x1a\xde\x99\x46\xaf\x81\xf5\xe9\x41\x17\x05\xe8\x47\x35\x46\xdd\x67\x75\x9e\x95\x3e\x92\xf4\xea\x3c\x2f\xb7\xbf\xb4\x7e\xd7\x7f\x31\xe0\x72\xdd\x27\x87\xdf\x4e\x38\x9c\x1c\x74\x66\x89\xdb\x00\xec\xa2\x97\x7c\x72\x25\xee\x94\xd3\x65\xe0\x31\xc1\xf7\x70\xc7\xf0\x1d\xc7\xe2\x42\xf2\xa2\xc3\x82\x6a\x1c\x2b\xce\xd1\xf1\xa1\xc8\x09\x21\xa0\x5c\xb1\xdf\xce\x0a\x60\x29\xd8\x96\xa4\x7a\xc0\xb4\x0c\x74\x17\x3a\x73\x39\x8e\x26\x3a\x93\x1e\x48\xbc\x34\x2a\x08\x76\x15\x0e\x22\xf2\x69\xb3\x03\xe8\x71\x90\xf3\x06\xce\x3a\xc1\x13\x42\x15\x4a\x7d\x75\x99\x59\xab\x1f\x8c\xd5\x06\xca\x28\x3c\x49\x09\xdb\x20\x0b\xed\xe8\x08\x33\x75\x20\x04\xab\x29\xb2\x43\x4b\xf7\x00\x13\xde\xf4\x0d\xe8\x21\x54\xa5\xcb\xaf\xe0\xd5\x07\xc1\x06\x94\x05\xcf\xf2\xd2\xe0\x05\x06\xf7\xb6\x35\x18\xd9\xde\x91\x16\x84\x3d\xb2\x29\x05\x07\x11\x28\x6f\x38\xc6\x54\x21\x62\x1f\x39\x13\xa7\xde\x96\xfd\x17\x5d\xfa\xea\x80\x0f\x1c\x4e\x2e\xaf\x01\xcb\x1a\xa0\xe0\x80\x1a\x7d\x72\x3a\x3a\x1b\x0d\x07\x5c\xb4\xf3\x3a\xe2\x22\x14\xc9\x44\x6f\xe4\x01\xdc\x9c\xcf\x0d\x11\x40\x60\xe9\x6e\x82\xa8\x80\xb7\xe7\x46\x20\x63\xcd\x9a\x4d\x91\x2d\xbc\x55\xea\xbd\x49\x34\xc2\x85\xd0\x2c\x78\x34\xf9\x7f\x68\x2e\xbf\x30\xd9\x8e\xe2\xd6\x74\x41\xb4\x4b\x2c\xdb\xe8\xae\xc7\xf7\xd0\x21\xc6\xad\xb3\xa2\xd0\x4b\x75\x20\x39\x10\x0f\x7a\x94\x2c\xa4\x0b\x4f\x13\x81\x41\xad\xc1\xa7\xcb\x8c\x3a\xd8\x55\xdb\x03\x44\xb4\xa8\x03\xb7\x40\x98\xd9\x86\x2b\x52\x88\xe4\x81\x47\x6b\xb5\x2d\x17\x41\xdd\xd6\x32\x6b\x32\xa6\xf2\x58\xda\xe3\x37\x33\x8e\xd3\xa0\xbc\xd7\xa5\xf5\x17\x21\xde\x2a\x2c\xcf\x8d\xcb\x1f\xfb\x03\xeb\x10\x87\x1b\x5c\x08\xeb\x0a\x40\xff\xed\x9a\x0f\xde\x08\xaf\xeb\xc1\xe1\x5f\xd5\x6b\xa5\x7f\xd1\x8b\x2d\x88\x43\x1b\xca\x0f\x5b\xd3\x89\xba\x92\x60\x08\x33\xc1\xd8\xa4\x9f\x78\x6b\x22\x76\xcd\x3e\xec\x09\x6c\x05\x93\x1b\x77\xcf\x10\x6f\x6d\x7b\x51\x76\xec\xb5\xf3\x70\x28\x89\x4a\x50\x9e\x42\x4c\x09\x19\xd2\x8d\x74\xc9\x16\xff\xe4\x4e\x34\x7b\xcf\x67\xbb\x84\xa5\xd4\x69\x59\xf2\xd5\x28\x9f\xac\x36\x55\xcd\xf3\x96\x37\x09\x37\xc0\x65\x59\x18\x43\x17\xe9\xa2\xe2\x74\xba\xe0\xdc\x12\x42\xc8\xb6\x1d\xab\xaa\x7e\xc8\xea\x25\x8a\x2e\xd8\x31\xa4\x9a\xa3\xac\xbc\xdd\x66\xb7\xba\xaf\x0e\x3f\x03\xad\x02\xc4\x80\x92\x40\x36\x29\xae\x40\x8e\x28\x2e\x09\x19\x00\x44\xb2\x07\xb2\x39\x07\xfd\x1e\xf0\x7e\xcd\x7c\xd0\xeb\x80\xdc\x54\xe8\xbd\xa7\xe7\xd9\x60\xe0\x19\xbd\xd8\x35\x1f\xc7\x0f\x2c\xf3\x46\x11\xa9\x16\xfd\x52\xde\xe0\x45\x2b\x9c\x20\x17\x19\x93\x01\x5f\xda\x0d\x14\xd6\x93\x9f\x70\x1a\x63\x5d\x2d\xb7\x05\xa4\xe1\xdd\x51\x91\xa8\x4d\xb1\xc5\x02\x05\x01\x3a\x07\x54\xf6\x2a\x5b\x40\x35\x4d\x5e\xe6\xe4\x83\x14\x9a\xbf\x0f\x6f\x58\xd4\xf9\x06\x13\x23\x4b\x51\xb7\xa3\x30\x6a\xe6\xf3\x11\x79\x69\x9a\xac\x08\xc5\xa9\x9c\x57\x61\x77\xb4\xbd\x4f\x31\x90\x2a\x80\x2a\xcf\xbc\x77\x90\x96\xb6\x09\xfd\x6f\x7f\xb2\x7c\xc0\x38\x0f\xd8\x5c\xdb\xc6\xe4\x4b\x0d\x26\x82\x59\x54\x1b\x4d\x72\x94\x50\x5f\x63\xcf\x74\x8a\x60\x84\xd7\xa8\x5c\xb0\x39\xab\x84\x61\x88\x43\x2f\xd1\xc9\xae\xb6\xcd\x66\x4b\x8e\x35\x96\x1e\x4b\x37\x96\x1b\xc6\x0e\x1e\x38\x71\x55\x89\x51\x1d\xcf\xdb\xcb\xab\xa5\x6b\x77\xaa\xc3\xbc\x5c\xea\x8d\x2e\x97\x82\x78\x56\x94\x4c\x0a\xe3\x2a\x53\x4d\x55\x01\xff\xb8\x2b\xc4\xca\x9b\x5e\x5f\x7d\x71\xc9\x1a\xda\xa1\xf5\xd6\xce\xad\x7d\x26\xd4\x6c\x73\x48\xcc\x3d\x0b\x6c\x18\x80\xe8\xf2\x27\x81\xd9\xe2\x6e\x62\xf9\x7d\x66\xc4\x63\x31\xc6\x67\xe7\x4f\xdd\x63\x5e\x9a\xee\xa5\x9d\x99\x20\xcd\x91\x37\x89\x13\x6a\x04\xb9\xbb\x88\x28\x01\x53\x0e\xbe\x48\xba\xc0\x66\x88\x0a\x8d\xc2\xc3\xdc\xaa\x52\x70\x0d\x58\xb7\xd0\x7f\xab\xad\x01\x47\xbd\x69\x6b\xb9\xee\x3e\xb4\xe4\xfd\x00\x8d\xf5\x5d\x2a\xb1\xd9\x8d\x91\x41\x3c\xff\xe8\x68\x10\x23\xb2\x05\xf7\xa4\xa2\x22\x7a\xde\xd0\xce\x53\xca\x4f\x09\xe6\x95\x20\x3f\xe0\xa5\x78\xee\x76\xa8\x34\x46\x7b\x81\x29\x94\x6a\x0e\x89\x6c\x28\xe4\xbc\xa3\xa7\x64\x14\xc3\xae\xb8\x6c\xc3\xf6\xcb\x05\x75\xd9\x46\xc6\x43\xd3\x09\x36\xba\xbc\x04\xd3\x80\x71\x9b\x28\xda\x0c\x4f\x64\x89\xe2\xce\xd5\xe1\xc8\xcb\xc2\x3b\xa3\xb9\xdb\x82\xa9\x8a\x90\xd0\xfd\xdb\x88\x0b\x0a\xdb\x8b\xb2\x43\x7a\x9b\xef\xd8\x0e\x53\xc7\xc9\x09\x31\xd0\xad\xbd\xf6\xc0\xd2\x59\x6b\x8d\x0b\x01\x7b\x81\x34\xdd\x64\x5a\x3b\x46\xc8\x1e\x1c\x42\x9e\x7a\x1a\x6e\x0c\x28\x9f\x47\x88\x32\xba\xe6\x91\x05\xe0\x68\xbc\x7a\x3e\x49\x83\x31\x16\xc4\x12\x80\x33\xc5\x8f\xb4\x27\x33\x28\x7d\x79\xf9\x3a\x5e\x95\x10\x43\x63\x7c\x34\xec\x19\x98\xaa\xa5\x78\x0c\x3b\x1d\x4b\x82\xa7\x41\xa8\x18\xbe\xe5\x28\x91\x3a\x1b\x81\xfe\x9a\xbc\xe2\xd0\xd0\x72\xd4\x4a\x99\x6d\x06\xaf\x47\xe4\xad\x11\xf5\xbf\x76\xf2\x9f\x50\x63\x70\x2c\x33\x3d\x80\xfa\x72\x75\xf9\x8e\x6f\x6a\x37\x00\xbc\x7a\x84\x69\xe5\x0c\x35\x34\x42\xc0\x2a\xe3\x02\x26\x6a\x28\xab\x56\x22\x75\x43\x97\x1d\x18\x9d\x84\xfc\xfe\x44\xde\x62\x99\x81\x1f\xd7\xb7\x00\x0a\xe1\x24\x05\xd0\x12\xca\xdf\x50\x89\x46\xf5\xcd\xde\x29\x80\x13\xdf\x05\xc9\xb7\x4c\xdd\x56\xd5\x52\xad\x32\x60\x46\x59\xad\xaa\x9a\xaa\xf3\x9d\x8f\x99\x70\xb7\xf5\x3d\x62\x85\x83\x16\x3b\xc4\x35\xf4\x8a\xec\x4a\x39\x06\x8d\x97\xde\x74\x6d\x32\x4d\x6e\x17\x2f\x96\xdf\x9a\x40\x84\x1f\xa9\xc1\x81\x9c\x1c\x98\x04\x89\xc9\x81\x89\xad\xb1\x08\xc4\x80\x45\x92\x97\xb7\xab\x6d\x01\x93\x75\x18\x15\xc5\xba\x06\x20\x6c\xdf\x07\x4b\x40\xd5\xcb\xee\xcb\x7f\xdf\x42\xbe\xbe\xaa\x1a\x64\xef\xce\xdc\x2b\xf8\x22\xc3\x58\x69\xb1\x83\x08\xc0\x11\x58\x2b\x1a\x2b\xe0\xa3\xfb\x52\x0c\x47\x90\x7b\x98\x6d\x6f\xb8\x18\xfb\x64\xe9\x2b\x36\x5d\x22\x42\xfc\xee\xc8\xad\x89\xd6\xd0\x29\x5f\x7a\x9e\x1b\xff\x31\xfb\x95\x78\x50\x66\xc5\x4f\x1c\xe2\x7d\x6c\x72\x72\x0a\x5d\x88\xde\x47\x4f\xc4\x99\xe9\x1a\x25\xb4\x45\x39\x91\x0d\x7d\x41\x72\xfe\x80\x83\x2e\x3c\x6e\x60\x5c\x61\xbf\x42\xb2\x96\x79\xd1\xa1\x5b\x86\x11\xbe\x4c\x4b\x87\xbf\x20\xa3\xab\xe5\x63\x87\x27\x6d\x56\x62\x75\x8e\x03\xc1\x0b\xd5\x61\x39\x43\x80\x45\xb7\x4e\x19\x94\x79\x03\xad\x22\x2e\xe6\xb5\xd1\xc5\xbd\x36\xb4\x25\xda\xac\xf9\x76\xcd\xc1\xd9\x90\xb4\x0a\xe9\xd1\x1f\x73\xcd\x7f\xe0\x3d\x15\xa2\xab\x11\xad\x1f\xbc\xba\xaf\x3e\x22\xb8\xa5\xeb\xfb\x18\x38\x74\x4f\xcd\x8c\x5b\xfe\x34\x82\x8c\x16\x37\x8f\x5f\x44\x18\x0e\x69\xd7\x10\xe0\x33\xdc\xaa\x29\xf7\x9f\x7e\x89\xfd\x2e\x07\xf6\x89\xe0\xc0\x6b\x45\xb3\x1f\x6d\xb0\x06\xca\x19\x18\x94\x59\x80\xd7\x30\x49\xee\x16\x8e\x44\x30\x81\xa0\x04\x0a\x12\xb7\xd0\xad\x5a\xdf\x5a\x5f\x8a\x22\xe6\x0f\x77\x95\x7a\xb0\x57\xbb\x22\x55\xd3\xf9\xdd\xd6\x24\x02\xd9\xc6\x60\x65\xde\x73\x82\xe6\xc0\xee\x69\x28\xd0\xf1\x90\x0c\xb0\x81\x4d\x98\x0c\x6f\x2a\x72\x6c\x89\x53\xde\x6d\xee\x1b\x30\x0f\x3e\xa8\x3a\xb3\xdd\x4b\xe4\xab\xd0\xdd\x74\xc5\xb1\x01\xa8\x9d\x3d\x92\xae\xe1\x96\x79\x9d\x5a\x79\x4e\x0b\xd6\xd6\xee\x98\x37\x2c\x09\x93\xb8\xff\x35\x50\x19\xdf\xde\xda\x91\xf2\x75\x7b\x38\x07\x0f\xac\x73\xd1\x69\xd2\xb7\xa2\x7d\x87\xec\xea\x3e\xb2\x70\x7a\xa0\xda\xa0\xee\xab\x62\xbb\xa6\xf0\xbb\x69\xaa\x9a\xe4\x02\x83\x1e\x92\x0c\xb4\x3b\x5b\x10\xe9\x0d\xc9\x09\xdf\x3a\x7f\xc3\x82\x43\xd4\x79\xc3\xbe\xf1\x86\x5a\xb5\xc1\x22\x36\xdc\x63\xe1\xca\x7c\x56\xca\x13\x5c\x41\x9d\x2d\x5b\x96\x2b\xdc\xc9\x58\xfd\x21\x29\xbf\xce\x5d\x82\xad\x42\xf4\x50\x6e\x04\x4c\x24\x2b\xa0\xe8\xe2\xd9\x96\x76\x84\x13\x09\xc4\x9e\x9f\xd1\xf8\x00\x37\x29\x3b\x52\x45\x22\x6a\x87\x60\x8e\x94\xfa\x41\x08\x8a\x82\x31\xe0\x7e\xff\x3d\x43\x06\xd7\x1e\xe8\x9a\x04\xb6\x81\x3d\x5c\x31\x7d\x4d\x95\x7d\x4e\xba\x94\x5a\x26\x90\x62\xfd\x9e\x3a\xc5\xe3\x11\x8d\x09\x5f\x58\x4a\x10\xcc\x92\xec\x53\x1a\x43\x98\xf7\x09\x02\x43\xad\x07\x4b\xdf\x32\x28\x97\x00\x97\xb5\x9f\x2b\x3e\x01\xf2\xba\xd6\xd0\x06\x2e\x99\x85\x56\xe1\x37\xcc\xb3\x07\x39\x88\x7c\x82\xf6\x9a\xe3\x7a\x22\x97\x00\x4c\xf7\x98\x85\x17\x1a\x46\xb7\x10\xbd\xd5\xd7\x60\x90\x97\x92\x43\xa4\x62\xb5\x2d\xfc\xe1\xce\xa0\x08\x58\x73\x7c\x92\x63\xa0\x74\xd9\xe1\x5d\x63\x01\x67\x14\xbd\x47\x69\x17\x69\x98\xbf\x7d\xdc\x03\x8e\x37\xbd\x88\x81\xd5\x51\xb6\xd9\x5a\x02\x51\x41\x60\x0f\x22\xd1\x82\x99\x16\x4c\x2a\x8e\x2c\x86\x6c\x83\x6d\x9f\xc5\x58\xa7\xa5\x5c\xaa\x13\xd2\xa4\xeb\xf0\x5c\x98\xcd\x1a\x2a\x9e\xf8\x90\x72\x4e\xf9\xa2\xaa\x11\xfd\x06\x38\x88\x75\xb6\xb8\xcb\x4b\x7d\x54\xeb\x6c\x89\xe6\x82\xa4\xb3\xc6\xab\x90\x2f\xb3\x27\xe2\xc7\x7b\x1a\x08\xe7\x1d\x9d\x65\x8b\xad\x69\x2a\x92\x54\x05\x73\xcb\xae\x32\x0f\xd9\x85\x2a\x50\xef\x99\x8c\x56\xad\x23\x5f\x0e\x1b\xaf\xe6\x9b\x9d\xe7\x89\xca\x00\x43\xed\x16\x04\xc1\x56\x04\xba\x02\xa2\xe9\xb4\x09\xdd\xaf\x84\x62\x6c\xf4\x80\x56\x18\x8e\xcd\x24\xb0\x22\xe0\x61\xca\x64\x4d\x6e\x50\xb5\xfe\x2e\x30\xd9\x3a\x4a\xc1\x82\xd1\xb5\x76\xbe\x72\xf9\x2b\xe9\x37\xf9\x90\xd8\x7a\xa3\x21\xd8\xde\xd1\xa0\x28\x56\x20\x86\x86\xa9\x44\x06\xe1\x52\x77\xb9\x85\xb2\x8a\x56\x69\xe4\x92\x07\x86\xce\xcd\x16\x36\x89\x44\xca\xe2\x0d\x1f\x5f\x7f\x37\x3b\x75\xa3\xa9\x10\x77\x93\xdb\x46\x13\x2e\xc1\x53\x60\x20\xce\x06\xd3\x07\xdd\x69\xa1\x73\x97\x16\x9a\x61\x1c\x0e\x41\x1c\xb9\xdd\xfc\x55\xc1\x34\xea\xbc\x67\xe3\x90\x76\xdc\x76\x72\x7d\x09\xb5\xb1\xca\x8a\xc2\xb8\x20\xe2\xe3\x77\xa6\xcb\xe5\x33\xb0\xe2\xf1\xe6\xb6\x47\x03\x99\xc8\xc0\x77\x14\x9b\x9b\x8f\x9c\x2e\x50\x8a\x3b\x51\x04\xda\xc2\x4d\x19\xcd\x4e\x1c\x4f\xe9\x25\x64\x50\x91\xaf\xfa\x8c\x54\x9b\x68\x0d\x62\xb8\x69\x74\xf6\x84\x5f\x9d\xbe\xa6\x7a\xef\xc8\x16\x61\xc7\xaf\x62\x7b\x85\x8b\x78\xe3\x2c\x09\xe1\x82\x1e\x1d\x3e\xf8\x8b\xab\x43\xa6\x6d\x7b\xa7\x33\x7b\xc8\xac\x72\x31\x70\xf2\x88\x0f\x6c\xf1\x88\xea\xdb\x07\x2d\x1c\x3a\xe2\xf1\xc5\x12\xed\xc6\x70\xdb\xe3\x82\x93\x31\x58\xaa\xfb\xa8\xb7\xf0\xa1\xf6\x15\x01\x76\x97\x40\x10\xaa\x6c\xd8\x53\xc4\x0c\x0a\xba\x52\x62\x3f\xb0\x08\x93\xeb\x06\x62\x8a\xdd\x2f\x72\xe3\x78\x17\x43\x9c\x52\x73\x57\x6b\x73\x57\x15\x4b\x0f\x2e\xc7\x80\x07\x37\x07\x01\xf0\x90\x15\x86\x1a\x05\xf4\xa8\x6f\xa0\xe4\x90\x4f\x56\x0c\x73\x97\x12\x98\x8b\xb3\x00\x51\xee\x72\x8b\xf5\x87\x85\x1d\xf0\x6c\xad\x1b\xe0\x0f\x84\xd8\x8a\x69\xea\xed\xa2\xd9\x02\x08\x69\x67\x37\x13\x06\x66\xa9\x78\x85\x82\x0c\x66\x0d\xc9\x8a\x6c\x51\x57\x46\xfc\x21\x2f\x8b\xbc\x94\x39\xb6\x43\xeb\x23\x80\xf2\x13\x1c\x16\xf6\xe8\xcd\x4b\x55\xe8\xf2\xb6\xb9\xeb\x39\xa7\x31\x08\x95\xcb\x06\x5b\x83\xa0\x94\xc1\xfc\xd8\xdf\x21\x05\xf4\x46\x42\xc5\x5a\x2b\xa1\xaf\x0e\x53\xbf\x66\xc3\x5c\x97\x35\x3e\xc4\xca\x82\xcc\xc9\x9e\xbd\x48\x52\xb3\xe0\xd8\xdb\xa3\x26\xba\xf7\xdf\xa3\x63\x3f\xe1\xa2\xd5\x24\x9e\xec\x47\xce\x84\xc4\xc5\x6d\xa3\xfb\x64\xef\xaa\x7f\x24\xe8\xf9\x1e\xc5\xbc\xf4\xbe\x2e\xbb\x10\x41\x61\xaa\xce\x8e\x78\x04\x5f\x55\xb3\xdb\x88\x09\x1a\x5a\xdd\x48\xfa\x5a\x74\xb8\x48\xb8\xa0\x99\x17\x68\x40\xc7\xe3\x42\x6f\x24\xca\xc0\x19\x12\x14\x9c\x75\x31\x6b\x2c\x9a\x82\xfc\x3e\xdf\x2d\xdf\x7d\x2e\x23\x6a\x6d\xb9\x5d\xe8\x8e\xdc\xe6\x9e\x99\x4d\xda\x06\x20\x0f\x12\x8d\x33\x8f\x31\x46\xc0\xef\xaa\x7c\xd1\x0a\x2a\xfb\xb9\x20\x7c\x65\x90\x04\x8b\x33\x89\x60\xb2\x81\xb5\xa4\x99\xfd\x98\x99\x0b\xd0\x48\xd7\x4a\x97\xb7\x79\xa9\xd1\x82\x41\x36\xab\x9b\xed\x2d\x94\xaa\xb5\x83\xe1\x3e\x83\xe0\x6a\x09\xe2\x58\xf2\x1e\xce\x66\x3f\xb8\x51\x1e\x0d\xec\x37\xe0\xf1\xf6\xd5\x23\xf2\x2b\x1c\xdd\x81\x66\x3f\x76\xbf\xb8\x66\x51\xf0\xac\x3b\x35\x42\xd4\x77\xd4\xa0\xe5\x16\x0d\x37\x58\xc3\x10\x81\x43\xdd\x0e\xd3\xca\xf7\x48\x77\x53\x12\xf6\xb5\xf2\x42\x3c\xea\xae\xfd\xeb\x0a\xdd\xed\x10\x9e\x94\xa1\xd7\x09\x49\x1e\x5c\xe7\xec\x95\x03\x3c\xc8\x49\x44\x74\xf5\x00\x51\xf1\xae\x39\x4b\x2a\xed\xe7\xdc\x02\x16\xd5\x88\xbc\xc2\xc0\x59\xf2\xae\xe3\xff\x19\x7b\xbe\xd5\x45\xc1\x56\xcd\xb1\x60\x2e\xa6\x00\x85\x27\x9e\x62\xf7\xf6\xc3\xa7\x1c\x82\x6e\x1f\xa0\x07\xe9\xaf\xf6\x81\x17\x98\x46\x7b\x30\x54\x49\x47\x97\x5b\x9d\x7c\xec\x08\x80\xd9\x8b\x74\x79\x5e\x81\xdb\x21\x4c\x71\x59\x23\x00\xf3\x68\xaf\x6b\x51\x43\x21\x17\x35\x5c\x4a\x5c\x9e\x22\x4f\x13\x17\x93\x15\xbd\x8a\x80\x13\x71\x46\xa3\xaf\x0e\x47\x0d\x5e\x63\x20\x44\x51\x55\xcb\xa8\x21\x0f\x77\x95\xaf\x70\xb9\xd3\x3e\xf1\x0c\x01\x30\xce\xec\x1b\xca\xf5\xe4\x71\x88\x8a\x2a\x1a\xa4\x16\x93\x35\x86\x88\xb5\x88\xeb\x63\x74\x2b\xa2\x2d\x70\x7b\xae\xcd\xe2\x75\x78\x97\x61\xfe\xea\x0a\x40\x86\x66\x9b\x63\x8f\x43\xfc\xb6\x5a\x6b\xdb\xfa\xdc\xac\x03\x98\x72\x2b\xc3\xa9\x06\xfe\x09\xfe\x27\xf6\xf6\x2d\xe9\xb8\x3d\x3c\xee\xe1\xe4\x66\x0d\x02\xe6\x80\x4d\x26\x38\xab\x5c\xe9\x4f\x61\x57\xc6\x4e\x91\x4e\x01\x87\xe0\x08\xa1\x4c\x41\xf7\xda\x81\x0f\xa5\x05\x4d\x98\x05\xf7\x28\x6f\xaa\x40\xf0\xa0\x09\x0c\x68\x51\xc5\x23\xf2\x2c\xc4\xf0\xe0\x88\x76\xf6\xa2\xf8\x1c\x16\x24\xf7\x38\x44\x86\x5a\x40\xc7\x13\xa4\x40\xb7\xde\x87\x09\xa7\xc2\x85\x8a\x8c\x07\x7a\x1c\xc1\x61\xd1\x40\xf4\xc6\x8d\xaf\x88\x5e\x35\xe2\x14\xc9\xc8\x77\xb6\xdf\x13\x59\xc0\x7d\x07\x4e\xe6\xe2\xb9\xe0\x33\x27\xc4\xb7\x05\xf9\xe0\x46\x15\x3a\x33\x58\xce\x82\xb4\x12\x06\x25\x1c\xb8\x60\x0d\x5c\x65\x3c\x1c\x05\xd9\x90\x09\x4b\x37\x44\x0e\xe7\x7d\x96\xf0\xcd\x8f\x09\x67\xca\x30\x96\x95\xa0\xb0\xc0\xad\x60\x1a\xc4\xbb\xd6\x9c\x3b\x86\xf3\x56\x7a\x25\x61\x8a\xb1\x33\x60\x4f\xa7\xd1\xaf\x8e\x25\x60\xee\xfc\xf1\x18\x02\x86\x42\x7c\x8f\xfd\x28\x74\x44\x14\x9c\x44\x74\x4f\xfd\xac\x6b\x17\x1e\x74\x4b\x04\xe2\x89\xb4\xc4\x99\xcd\x26\xdc\x09\x46\x8e\x33\x07\xf2\x5c\x41\x2b\xff\xd6\xa0\x90\x1c\xde\xe5\x35\x3d\xc1\x51\xdf\x06\xa7\x73\x22\x63\x1b\x21\xf8\xe9\x51\xf3\x2b\xb8\x76\x91\x2b\xb5\xc9\xb0\x30\xb5\xc1\x14\xa5\x43\xe4\xa1\x82\x0a\x4c\x39\xab\x76\xf1\xa9\x29\xa3\x63\x76\xb8\xf2\x46\x80\xed\xe1\x4e\x66\xe4\xbb\xb3\x25\x93\x68\xb1\xa1\x83\x24\x2f\x2c\x00\xc9\xa3\xaa\x8e\x6b\x1e\xdc\xc0\x22\x2e\x58\xaf\xb1\xca\x5b\xfc\xec\x30\x2f\x19\xe2\x46\x37\x48\x55\xab\x1b\x0c\x8a\xda\x61\xe9\xf9\xbd\xb7\xce\xfe\x4a\xbc\x83\x55\x09\x47\xf6\x21\x9d\xb6\x75\xa2\xbe\xe9\xba\xd4\x44\x90\x6c\xac\x1d\xd0\x73\xfe\x4d\x04\x72\x46\x6c\x8f\xbd\x76\xa3\xa1\xa8\xb7\xa5\x49\x58\xc2\x9c\x02\x3c\xf4\x2a\xe7\x38\xd2\x7e\xe6\xe0\x94\xff\x35\xba\x81\x08\x0d\xbd\xcb\x36\x1b\xed\x8e\x08\x2f\x46\xb3\xc6\x98\x6d\xd9\xd4\xd9\x32\x5f\x84\xda\x47\x61\x8d\xad\x93\x66\x42\xdc\x8d\x6e\xec\x68\xf8\x8a\x21\x14\x2b\xc4\xf8\xb5\x1b\xd4\x2c\x38\x6b\x5a\xd0\x6e\x8e\xff\xf8\xf7\x63\x4e\x24\x2b\x0d\x47\xcf\xed\xe3\xec\x25\x75\x53\xe1\x80\x7b\x7c\xb5\x37\xf6\x6f\xc9\x03\x2c\xbb\x02\x31\x61\x76\x90\x39\x27\x39\xf2\x8b\xd1\x3d\x77\x11\x60\x4e\xdd\x75\x07\x0a\xac\x1f\x01\x7c\x99\x7c\xa9\x8f\x6e\x76\x47\x08\x58\x2b\xed\x1a\xcd\xcb\xdb\x42\x56\x14\x50\xdb\x04\x37\x5d\xc7\xcb\x1e\x41\xc6\xb5\xdc\x12\xc3\x43\x46\x10\x68\x77\xc1\xb4\x3d\x11\x97\x31\xdd\x7b\x24\x76\xf6\x0a\xc0\x72\x2b\x91\x84\xea\x68\x71\x6e\x84\x96\x9b\x63\xe3\x20\xf0\x41\x2b\x5a\xed\x4b\xca\x1f\xaa\xa7\x2c\xe0\xb8\x63\x7c\x39\x49\x1b\x00\x8e\xd1\x47\xf2\xb6\xdb\x32\x44\x88\xfb\x54\x4a\xbb\x2b\x04\xee\x7e\x66\xfc\xbb\xed\xba\x0a\x90\xcf\xa7\xfd\x2e\x57\x67\xcf\xe8\x79\xab\x6c\x41\x15\x95\x1e\xa4\xf1\x64\x6a\x1a\x72\xc0\xbf\x6c\x0a\xb2\x3b\x51\xdf\xb5\xa9\xd4\x2a\xa7\xed\x11\xe8\x5d\x8a\x01\x91\xc7\xba\x1b\x47\x26\x2c\xe5\x6d\x81\x0b\x72\xb3\x23\x95\xd1\x5d\x22\x94\x10\x31\x5c\x0a\xdd\x4a\x82\x7c\x66\x98\x33\xd1\x1d\x94\x64\x6e\x65\x08\xee\x2a\xef\x38\x95\x3b\x28\x46\x58\x6f\x1a\xa9\x13\x58\xfd\x67\x1b\x92\x1b\x75\x5f\xe5\x4b\x66\x32\x2d\xa0\x2e\xb8\x5a\xbb\xb2\x44\xcf\xa4\x28\x73\xdc\x5d\x2d\x74\xd7\x11\x87\xf0\xad\xdd\x0e\xb7\xad\xbb\xa1\x31\xfb\x05\xcd\x61\x9a\x04\xb8\xcd\xec\x2e\x68\x3f\xd2\xdb\xee\x4c\x42\x91\x4b\xbe\x35\x6e\x18\xdc\x1e\x6c\x22\x22\x29\x2a\x35\x00\x11\x3c\xf6\xe8\x81\xba\x59\xc1\xab\x68\x27\xf4\x47\x9c\x50\x4e\x34\x04\xf2\x63\x28\x30\x12\xe5\x5d\x73\xeb\xf0\x3a\x13\x02\xb0\x2e\x98\x0f\x08\x2e\xe3\xb2\xc2\x2b\x14\x6a\xba\x49\x31\xcf\xfe\x28\x2c\x2c\x22\xc7\x6a\xff\xbc\xa0\x68\x70\x2b\x49\xc8\x45\x7c\xac\x3c\x41\x4a\x7a\x77\xf9\x4d\xde\xb8\x00\xa7\x23\x5e\x20\x38\x49\xbb\x37\x01\x78\xe8\x86\xd1\x8b\x50\x3d\x59\xb7\x69\xbe\x83\x44\x5f\xb9\x7b\x24\xb5\x8f\xae\x7d\x5e\x2e\xad\x13\x45\x4b\x06\x5f\x9f\x11\x24\x34\xce\x98\x83\x9e\x09\xae\x3e\xe6\xa8\xf9\x9e\x2a\x1e\x6c\xb1\x6f\x7e\x34\x84\x11\x0c\x82\x30\x1f\xc7\xaf\xa9\x52\x03\x1c\x28\xc4\xe4\x3e\x96\xdb\x7c\xa2\xcb\x8d\xac\xd4\x8f\xb6\x8f\x23\x0d\xcc\xc2\x42\xf2\x26\x2c\xc1\xb5\x9f\xb0\x6e\x44\xc8\x66\x20\xb6\xb1\x0a\x49\x0d\xdc\x35\x1b\x10\x41\xee\xa9\x82\x0a\x0f\xaf\x7c\x8d\x95\xf8\xe5\xce\x91\x16\x87\xc6\x4c\x19\x76\xca\xbc\x0c\x88\xdb\x1b\x4f\xb8\x21\xa5\x06\xf3\x32\xde\x51\x21\xfd\x34\xf2\x12\x73\x7a\x8c\x88\xa8\xf1\x42\x17\x89\x3f\xba\x10\xa2\x64\xd4\xf1\x71\x5f\x8d\x56\x64\xea\x3a\xc5\xac\x05\x97\x6f\x82\x50\xc1\x5f\xb7\xcb\x5b\x56\x6b\x03\xd6\x5c\x17\x57\xa4\x3a\xfc\x50\x87\x91\x48\x46\xdc\xe5\x47\x15\xb0\x87\x11\xd7\x3c\xff\xd6\x98\xad\x36\xbd\x44\xae\x49\xc8\xd8\xc2\x50\xc2\xaa\xb0\x0b\xe9\x90\xe3\xc2\x37\x3b\x6a\x15\x14\x5c\x25\x42\x24\x4e\xd2\x36\xf6\x7c\x5a\x12\x2d\x3c\x0e\x70\xc4\xdc\xb3\xe7\xa2\xc0\x7e\xc7\x1b\x5b\xff\xb2\xb0\xc6\x1f\x70\x1c\xf1\xa2\xda\xff\x5b\x47\x62\x42\x76\xa3\xb4\x9a\xb8\x88\x08\x13\xb9\xd6\x74\x5b\x6f\x8b\x26\x2b\x35\xe2\xce\x11\x27\xdd\x4d\xed\x2a\x11\xe0\x42\x1d\x4c\xd7\x0d\xde\xf3\xe2\x67\x4c\xf1\x1c\xcf\xe1\x4e\x2c\xcd\x3d\xfb\x10\x74\x49\x8b\x2e\x51\xc9\x88\x63\x01\x55\x32\x20\xfd\x83\x31\xe6\x40\xb5\x57\xec\xf3\x76\xa2\x17\x40\xb2\x00\xc4\xb1\x9b\x43\x08\x46\x33\x6a\xc3\x05\xf5\x81\xf2\xdf\xfd\x57\x73\x07\xf2\x3f\xb6\x1b\x22\x5f\x03\x49\x24\x22\x0f\xb3\x4b\xa1\x58\xba\xd1\x05\x6b\xdd\x05\x8d\xe5\x85\x07\x5f\xbb\xa1\xc0\xd4\xaa\xb6\xb7\x97\x83\x8f\xc1\x14\x3f\xd2\xfc\xbe\x24\x52\x97\x99\x6c\x01\x61\xcb\x8d\xba\xd3\xc5\xf2\x49\x26\xf5\x88\xb8\x4a\x94\x64\xe3\x71\x77\x93\x15\xfe\x40\xd7\xf2\xf1\x92\xd4\x0c\x30\x56\x5e\xc6\x9e\xbf\xe5\xa1\x9a\x9d\x3f\x00\x6c\x08\x22\x7b\xc2\x52\x70\x74\xd7\x04\x4e\x8f\x61\xb4\x1d\x40\xbd\xbc\x84\x88\x24\x71\x25\x39\xd5\x58\x4f\xca\x61\x82\xf2\x43\x21\x64\x2a\x94\x8b\x08\x7c\xa7\x4d\x23\x38\xe3\x57\x91\x76\x8e\xf9\x10\xbe\x9c\x0b\x5e\x41\x53\x55\xb4\x90\x0b\x0a\xe8\x92\xb2\xdd\xbe\xad\x05\xe7\x7c\x54\xec\x2f\xe7\x99\xbc\x60\x87\xca\xcc\xed\xf2\xb7\x67\x09\x91\xb3\x20\xf8\xc8\xd7\xd9\x03\x49\xb3\xb5\xdd\x2f\xa0\xbf\x58\x86\x0c\x46\x0b\x44\x78\x6e\x75\xa9\xeb\x6a\x2b\xf4\xdb\xa4\x46\xfe\x83\xf5\xd6\x6a\x00\x4b\xc9\x32\x44\x69\xf9\xf3\x82\x87\xb3\x8b\x1a\x97\x63\x40\x18\x57\x45\x29\xc9\x4b\x64\x4c\x95\x01\xb8\xf8\xa3\x0f\x64\xca\x6f\x37\xae\x76\x04\x2a\x38\x5f\x2d\x2b\xd2\x40\x26\xce\xb7\x7c\xa5\xee\x50\x2c\xff\x0e\xd6\x8c\x35\x0c\x89\xf9\x2c\x38\xc5\xa8\xad\xdc\x3e\x7f\x1c\x51\x23\xb1\x16\xd7\xd5\x67\xd2\x41\x48\xb7\x21\x9e\xc4\x90\xb8\xf2\xb0\xab\x3d\x2b\x1b\x20\x68\xb6\xa9\xf6\x3d\x05\x53\x04\x3d\x50\xd4\xe4\x46\x17\xb9\xbe\x17\x6a\x7a\xd1\x85\x85\x77\xab\x69\x3a\x61\x17\xc7\x27\x2e\xcf\x13\x17\x8d\xbd\x02\x8e\x90\x36\xa6\xcb\x88\x6a\x2e\x49\xa9\xe0\x24\x17\x38\x5c\x73\x13\xac\xfe\x9b\x9d\x4f\x01\xc9\x72\x39\x93\x84\xe6\x49\xab\xe0\xd6\x1e\x8d\x10\x1a\x08\xab\xa7\x3a\x2e\x05\xc8\x59\x2e\x97\x18\x79\xb0\xcb\x20\x6f\xd4\xad\xae\x6e\xeb\x6c\x73\x07\xb9\xf5\xa0\x8b\xa2\x50\xd1\x73\xda\xe3\x69\xec\xba\xe2\x13\x15\xc1\x4f\x03\xd6\x4b\xac\x52\xc3\xb2\x08\x48\x61\xf9\x81\xc0\xa3\x63\x6b\x58\xeb\x13\x39\xb0\x71\x37\x13\x35\x82\x68\x7e\x5e\x2e\xaa\x7a\x53\xd5\x24\xb0\xa9\x65\x0b\x33\x63\x97\x25\x07\x85\x29\xeb\xc0\x0c\x03\xed\x59\x7d\x83\xc0\x85\xbd\x9c\x87\x92\xb3\x1c\xb8\xc9\xf5\x92\xa7\x3c\xa0\x30\x8f\xc8\x34\xf7\x50\x73\xb4\xf9\xcb\x21\x96\x14\x3c\x89\xf9\xca\x4d\xbe\xce\xed\x29\x0f\x1c\x1c\x79\x9d\x3b\x3e\x26\xce\x1d\x38\x1a\xa9\x9b\x6d\x43\x19\x78\x88\xf7\x02\x69\x4f\x93\xe5\x50\xc0\x4f\x85\xce\xf0\x0a\xc7\x16\x85\x08\xe9\x85\xae\x29\xfd\x0a\x46\xb7\x08\xdc\x3f\x93\x2a\x7d\x14\xae\x77\x8e\x21\x1b\xc1\xa1\xe4\xa9\x1f\xc2\x0b\x15\x8e\x4c\x01\xc7\xa4\x5b\xf7\x00\x78\x4b\x80\x34\x82\x9e\x70\x90\x84\x74\x87\xae\x2a\x4c\xc8\x96\x36\xfb\xb4\x89\x69\x7b\xf1\xe9\xe6\x92\x1c\x35\x5f\x17\xc1\xab\x3c\x81\x3a\x97\xb4\xef\x5b\x15\xad\xae\xfb\x2a\x0b\x42\xcd\x7a\xb7\x22\x1c\x09\x0f\x19\x20\x89\x67\xdb\x0a\xfe\x0a\x96\xbc\x3c\xbb\x11\xb0\x7e\xdf\x3a\xf3\x91\xf1\xa6\x62\x73\x80\xb1\xd0\x02\x83\x40\xba\x48\x30\xd9\xb8\x38\x37\x82\xfe\x83\xfd\x1b\x5b\xd5\x65\x47\x26\x07\xea\x05\xea\x1c\x69\x0c\xfd\x6d\xc1\xbc\x88\xd6\x9a\xf7\x4e\x36\x9a\x8a\xee\x4a\x70\x77\xa7\x3c\xf1\x9e\xe8\x78\xf4\xb6\x7d\x5f\xfb\x00\x64\x9d\xd5\x5a\xdb\x8d\x66\xf0\x6a\x70\x41\x78\xe3\x00\x4a\xc8\xc4\x69\x2f\x34\xe3\x98\xd6\x6e\xb4\xba\xdd\xb2\x08\x7e\x43\x94\x4e\xb7\x15\xa4\x2c\x56\xb8\xff\xea\xfb\x80\x8c\xc5\x34\x59\xb3\x45\xee\x9f\xa2\x10\xd1\x01\x0c\x40\x6f\x63\xce\x20\x0a\x56\x6e\xea\x6a\x5d\x39\xd3\xc3\xdc\x65\x35\x4b\x7a\xd5\x9a\x2e\x14\xf7\x93\x5b\x3c\x52\x0a\xb4\x27\x23\x29\xb6\xe3\x77\x7d\xf5\x31\x05\xe1\x26\xd0\x2f\x3a\x1f\x7d\x9c\x0e\xa6\xd7\x6a\x34\x63\x5a\xe4\x53\x75\x36\x4d\x41\x10\x69\xf8\x79\x30\xfd\x94\x82\x1a\xdb\x34\xb5\xdf\x10\xcf\x02\x8e\x09\xf1\x80\x44\xcd\x27\xa4\xa8\x34\x4f\xc7\x73\x75\x99\x4e\x2f\x46\xf3\x79\x7a\xaa\x3e\x5e\xab\xc1\xe5\xe5\xf9\x68\x38\xf8\x78\x9e\xaa\xf3\xc1\x97\x3e\x0b\x66\x7d\xf9\x9c\x8e\xbd\xa8\x93\x9a\xcd\x07\x73\x90\x61\x53\x5f\xa6\xa3\xf9\x68\xfc\x09\x9e\x37\x9c\x5c\x5e\x83\x2a\x93\xfa\x3c\x39\x3f\x4d\xa7\x40\x76\xf1\x8a\xd5\xa0\x50\x3b\x2d\x75\x12\x71\x41\x9f\x58\x27\x2e\x12\x88\xbb\x7e\x4c\x10\x2e\x3d\x15\x92\x70\x89\xd4\x84\xfb\x78\x35\x57\xe3\x09\xc9\x62\xa5\xa7\x6a\x3e\x41\x9d\x3a\x96\x8f\x93\xda\x70\x67\x2d\xd1\xb7\xc1\xf8\xf4\x19\xaa\x6f\x30\x80\xe3\xf9\x68\x9a\xaa\xe9\x68\xf6\x3f\xd4\x60\xc6\xc3\xfa\x6f\x57\x03\xf7\x9c\xcb\x74\x7a\x36\x99\x5e\x0c\x40\x16\xeb\x2c\x9e\x46\xdb\x5b\x75\x3d\xb9\xea\xab\xd9\xe7\xc9\xd5\xf9\x69\xf0\xb9\x1d\xa6\x54\x9d\xa6\x67\xe9\x70\x3e\xfa\x39\x4d\xec\x17\xd5\x60\x36\xbb\xba\x48\x69\xb4\x67\xa0\xa2\x35\x38\x3f\x57\xe3\x74\x98\xce\x66\xf6\x57\xb3\x74\xfa\xf3\x68\x08\xa3\x30\x4d\x2f\x07\xa3\x29\xea\x88\x4d\xa7\xf6\x29\x93\x31\x9e\x2f\xef\xfb\x76\xea\xc6\x13\x50\xca\x9a\xab\xab\xf1\xb9\xed\x2b\xa9\xd8\x77\x2c\x03\xfb\x0c\xd0\x44\xb3\x43\x29\x67\xfd\xcb\xe8\xfc\x9c\xc4\xd0\xc2\xa9\x07\x89\x30\xfb\x81\x9f\xfa\x6b\xf5\xe5\xf3\x44\x5d\x0c\xae\x91\xd5\xe4\x9a\x17\xc7\x34\x75\xb4\x27\xe1\x9a\x18\xcc\xc4\xd2\x1c\x7c\x9c\xd8\x31\xf8\x98\x82\x0c\xd9\x79\x6a\x1b\x62\x07\xc4\x4e\x10\x89\x78\x89\x25\x00\xaf\x26\x2a\x71\xa1\xae\xe6\x25\xd7\xf6\xab\xab\xb1\x5c\x59\x5b\xa3\x6c\x34\xe6\x15\x32\x9f\xa8\x78\x53\x0a\x25\xb4\xf6\xea\x53\xe7\x93\x19\x2c\xb5\xd3\xc1\x7c\x00\x72\x67\xf6\xff\x7e\x4c\xed\xb7\xa7\xe9\xf8\x34\x9d\xc2\x66\x1a\x0c\x87\x57\xd3\xc1\x1c\x5e\x66\x7f\x91\xce\xd4\xec\x6a\x36\x1f\x8c\xc6\x38\x29\xb6\xbf\xb0\x95\x47\xd3\x53\xb7\x9b\x60\x81\x9e\x0d\x46\xe7\x57\xd3\xd6\x12\x9b\x4f\xd4\xe4\x32\x85\x47\xc2\x52\xf3\x13\x32\x9b\x9c\xcd\xbf\x0c\xa6\x69\xcf\xab\xa5\x81\x1e\x1a\xce\x9e\x0a\xf6\xec\xb5\xfa\x3c\x98\xa9\x8f\x69\x3a\xfe\x1e\x45\x35\x95\x8e\xf1\x7b\x1d\xac\x37\x2f\x3e\x57\x0f\xf6\xa4\x1f\x80\x0b\x8a\x41\xd6\x39\xdc\xf5\x4d\xa5\xae\xed\xc9\x3a\xd6\x0f\x74\xb5\xe5\xda\xbc\xa0\xcb\x90\x48\xd9\x48\x35\x25\xa0\x36\x15\x4c\xc5\xe4\x08\xd0\xfd\x88\x74\x55\x31\x0f\x19\x1b\x5d\x60\xc9\x01\x9b\x24\x40\x53\xd6\xba\x5c\x32\xa9\x46\xde\x44\xc7\x3b\x58\x1b\x9a\x99\xdf\x91\x33\x36\x24\x42\xe5\x32\x67\xc7\x95\x8d\xfa\xd1\xd6\x11\x40\x73\x19\xb5\x70\x82\xbb\xb8\x45\xbb\xa2\x0e\xab\x3a\xc1\x4a\xa5\x32\x43\x5a\xcd\x64\x5f\xfa\xe7\x09\xd6\xb8\x1e\x70\xb0\xba\xe2\x2b\x7e\x43\xa2\xb2\xa6\xc9\x28\xc1\xeb\x0d\x2e\x57\x0e\x15\xf0\xda\xf6\x29\x0c\x60\xb2\x95\x1d\x45\x7b\xfd\xbb\x1f\xaf\xf9\xbb\xa6\xa1\x6c\x11\xc0\xf9\x28\x4f\x8d\x38\xea\x0a\x79\xdf\x25\x49\x28\x30\xe7\xec\x28\x41\xbc\x28\xb6\x8c\x51\x09\xc9\x0b\xe0\x51\xf0\x0c\x62\x63\x45\x2c\x81\x87\x7f\x68\x75\xe0\xec\x8b\x03\x00\xf5\x92\xcb\xb9\xa9\xc0\xbb\x82\xca\x01\xcc\x45\x31\x99\x27\xa5\xc1\x72\x6b\x28\x6c\xcb\x65\xff\xc5\x7f\x07\xbc\x0f\xfc\x56\x42\x48\x0a\xc7\x2d\x51\x66\x6b\x8e\xb6\xa9\x7c\xa9\x33\x84\xf9\x22\x57\x1d\x10\x58\xa8\x7f\x89\x04\x08\xfe\x3b\x4a\x9d\xfc\x8b\xfa\xef\xf8\x63\x6b\x3d\xa0\xe9\xf4\x2f\xcc\x04\xef\x3c\xc9\x60\x81\x7d\x70\x55\x5a\xc1\xba\x42\x23\x5a\x70\xec\xe6\xcd\xbe\xe5\xf0\x24\x17\x28\x94\x9f\x3e\xd7\x14\xfd\x20\xa8\x75\x58\x7b\xc1\x5b\x9d\x14\x21\xad\x6a\x75\x18\x72\x3b\xf4\xda\x36\x78\xbf\xd5\x71\x19\xe0\x20\x6f\xee\xae\xda\x68\x47\x03\xc8\x06\x1b\x96\x5f\xa1\x33\xc4\xa6\x81\x10\x77\xbd\xfe\xe0\x90\xed\x04\xa7\xd7\x28\xdf\xa3\x97\x9e\x5c\xa2\x5a\xb5\x6e\xf8\xaa\x7e\xc6\x05\x3f\xd3\xfa\x99\xa3\x8a\xea\x06\xc0\x1a\x69\x3d\x34\xd3\x7f\x61\x0f\x00\xb9\x6c\xbb\x61\x33\xcf\x99\x30\x59\x74\xe3\xc7\xf0\x83\x75\x87\xcb\xaa\x79\xa6\xd5\x8c\x8a\x17\x89\xfa\xf5\x92\x17\x80\x25\x85\xe8\x02\x32\xb5\x53\x84\xa9\x54\x77\x78\x92\x03\xee\x10\x89\xaa\xed\xba\x02\x69\xaa\xba\x2a\xf3\x05\x31\x2d\x6f\x80\x3f\x3b\x2f\x82\xa1\x01\x80\xf5\xad\xa6\xe5\xa3\xd7\x9b\xa2\xda\xe9\x5a\x1d\x72\x21\xa2\x2b\x35\x27\x67\x66\xad\xeb\x9e\x42\xe2\xf4\x5a\x19\xeb\x6b\x15\x18\x97\x2e\x81\x5d\x1c\x32\x84\x2a\x13\xc7\x82\x20\x5e\x39\x70\x68\x54\x09\x83\x73\x42\x8f\x7d\xf5\x99\x58\x1a\x33\x65\x20\xe2\xfd\x81\xaa\x45\xed\x4f\xec\x46\x36\x3f\xbd\xb8\xae\x76\xd5\x72\x57\x6a\x1e\x4e\x52\xd4\xe7\x97\x20\x93\x92\x7f\x39\x9c\x42\x1a\x00\x49\x2f\x24\x5c\xf0\xeb\x59\x5d\xdd\xbc\x54\x87\x9e\xc0\x00\x9a\xf6\x40\x8c\xb2\xdf\xca\xea\xc6\xf4\x38\xd8\xf1\xe2\x66\xa7\xfe\xd5\xbe\x5e\x4d\xb3\x72\x59\xad\xd5\xe7\x6c\xf1\x4d\xd7\xf6\xe8\x42\x60\xd8\x16\xf5\xec\xe6\x3b\x35\xac\xaa\x52\xfd\x8b\x4a\xd4\xb1\x1a\x6c\xea\xbc\x50\xc7\x3f\xfe\xf8\xfa\x05\x7d\x90\xa8\xcb\x5a\x9b\x9c\xf9\x0d\x7e\xce\x17\xfa\xc5\xfc\x2e\x6b\x5e\x3a\xfe\x27\xec\x3e\xb8\xed\xff\xed\x0f\x96\x4f\xea\xbf\x5a\xde\xe7\x9b\xe5\x6a\xfd\x1b\x6b\xfe\xc8\x7f\x8f\xeb\xff\xbc\x7e\xfd\xa6\xa5\xff\x73\xf2\xe6\xdd\xfb\x3f\xf5\x7f\xfe\x88\x7f\x83\x3d\x98\x55\x12\xa6\xec\x20\x14\xa4\x3a\xc1\x86\x8f\x92\x08\x2e\x43\x40\x9d\x7f\x72\x24\xd6\xff\x04\x7b\xb8\xaf\x86\x44\x57\x43\x8c\x37\x1d\x48\x9b\x7f\x0a\x81\x52\x99\x87\x81\xa3\x1c\x35\x11\xde\xfc\x53\x57\x76\xc8\x10\x07\xce\x9f\xf2\x63\xdf\xf7\xaf\xff\xea\x8b\xd9\xe6\x9b\xec\x77\xdc\xfe\x4f\xed\xff\xe3\xd7\xc7\x3f\xc4\xfb\xff\xf8\x87\x1f\xfe\xdc\xff\x7f\xc4\xbf\xb9\xdb\xe9\x0f\x19\xd0\x78\xa2\x75\x3a\x2c\x74\xa6\xce\xfa\x6a\xaa\xa1\x4e\x50\x9d\xbc\x7e\xfd\xcf\xaf\x8e\x8f\x5f\xbd\x79\xed\x91\x6c\x02\xe9\x53\xad\xd4\xa9\xce\x4a\xf5\x69\xab\x4b\xa4\x28\xb5\xa6\x07\x3a\x03\xc6\x91\x2e\xe0\x6b\x80\x85\x63\xc9\x99\xd0\xa2\x90\x4e\x8b\xe9\xbf\xb8\x2a\x19\x94\xc0\x00\x7d\x8c\xdf\xc5\x7b\x1e\x9c\x14\xce\x29\x62\x45\x84\xcc\x8d\x44\x70\x7a\xae\x21\x04\x5e\x05\x3a\xf0\xfa\xea\x42\x16\x4e\x25\x7b\x5e\x14\x9f\x8f\xf6\x8b\xb6\x0b\x40\x64\xee\x31\x8f\xf6\x50\x94\xbc\xf0\x5e\x1b\x91\xdf\x5d\x6b\x7b\x10\x2e\x91\xca\xb7\x95\x6c\xca\x8d\xfa\x92\x41\x5e\xa0\xa9\x4a\x52\x98\xbc\x2a\x73\x78\x69\xe3\x68\xeb\x03\x4d\x0b\xd7\xfd\xaa\x6c\xa0\xfb\xff\x9a\x95\xba\xd4\xea\x0b\x8c\x3b\xfe\x64\x53\xe7\x6b\x28\x52\x26\x2b\xf1\x10\x05\x89\xed\x7c\xf6\xec\x4f\x82\x69\xfb\xf3\xf0\xfc\x2f\xf7\xaf\xff\xea\x02\x34\x1f\x5f\xff\xcd\xec\xbf\x37\xef\xde\x9d\xbc\x8f\xce\xff\xe3\xf7\x3f\xbc\xfe\xf3\xfc\xff\x23\xfe\x5d\x54\xff\x91\x17\x45\x16\x3b\xbf\x5e\xf4\xf1\x35\xf1\x84\x9e\xfa\x92\x30\xc2\x3a\x1f\xf7\x8f\xfb\xea\x40\x68\xfd\x3a\x62\x62\x7b\x34\xe7\xe5\x32\xbf\xcf\x97\xdb\xac\xc0\x7a\xef\xdb\xac\x60\x85\x78\x44\x20\x60\x74\x30\xf1\xe8\x0c\x1f\x00\x83\xcf\xf0\xf8\x85\x38\x47\xf5\x50\x1a\x35\x24\x68\x3c\x3b\xd9\x7d\xd7\x8c\x93\xb0\x19\xdc\xf8\x03\xc1\xe6\xdb\x21\x2b\x12\x88\x32\xbb\xba\x06\x03\x3e\x70\x56\xee\x7a\x8e\x25\x2e\x0b\xf4\x8c\x5d\x05\xac\x00\x0e\x89\xcf\x5f\x86\x6a\xcf\xbe\x91\x6f\x64\x23\x45\xeb\xe2\x6e\x21\xd2\xaf\xfb\xe1\xfe\x69\x6f\xe1\x69\xe1\x2f\xf9\x89\xc4\x6d\x3c\xac\x96\x5a\x9d\x55\xf5\x1a\xa3\x71\x5c\x56\x02\x93\x98\x15\x41\x9f\xa0\xcc\x08\x62\x8b\x44\x27\xc9\xd1\xba\x52\xa5\xbf\x00\xe6\x56\x0d\x10\x2c\xe1\xab\xe7\xf1\xd1\xcc\x04\x11\xbf\x13\x2f\xd3\x8b\x90\xa5\x73\xef\x77\x73\x66\x75\xcd\x10\x8c\x40\x90\x08\x57\xa3\x0d\x2e\x72\xb5\xf2\xdd\x7f\xd7\x57\x07\x23\x99\x3b\xfd\x62\x8d\x92\x99\x5e\x54\xe5\xd2\xde\x76\xac\xfc\x47\x43\x42\xbf\x53\x4a\x1d\x66\x3d\x5f\x19\xf1\x3d\x43\xb1\xd4\x66\x51\xe7\x37\x18\x34\xe3\x41\xf9\xc8\x0b\x36\x9e\x8a\x0f\xaa\xaa\xc5\x4b\x6f\xc4\x4b\x5b\xf3\xed\x2a\xf4\xb2\xfb\x2c\x2f\x04\x3a\x2d\x08\x32\xb2\x73\x76\xdc\x3f\x06\x16\xa1\xac\x2e\x72\x5d\xb7\x82\x82\xd6\x0a\x41\xe1\x52\x53\x75\x3d\x26\x6b\x0f\x92\x1f\xd5\xf7\x7d\x75\x10\x4d\xb0\xa3\x6d\x2f\x77\x6d\x1e\x6c\x41\x9d\x19\xcf\xa9\x7f\xe8\x0f\x7d\x75\x70\x9e\xd5\xb7\xba\x56\x5f\xaa\xfa\x9b\xe7\x81\xf7\xc5\x64\x54\x95\xd0\xb1\x17\x44\xc1\x0c\x17\x78\x25\x54\x62\xc3\x55\x2d\x60\x5d\x55\x35\x13\x5e\x4b\xa6\xa7\xfd\x27\xc6\x3f\xdb\x46\x11\x9d\xbd\x3b\x25\x72\xe3\x04\x61\xfd\x37\x7f\x74\xdf\xb4\x63\xc2\x5f\xbe\xcb\x5c\xba\xda\xf1\xd7\x01\x44\x38\x71\xac\x8d\xd9\x2f\xf9\x7a\xbb\x46\x4a\x3f\x9f\x02\xf1\x84\x0a\xcc\x13\x90\xaf\x5d\xc2\x84\xd7\x23\x3c\x09\x60\x60\x8e\x50\x0b\xf1\x85\x3b\x87\x1f\x0f\xd1\xc9\x18\xd6\xef\xa8\xb8\xf7\x27\xf5\xeb\xbe\x3a\x08\xb6\xa3\x9c\x59\x67\x47\x52\x42\xe2\xa7\x70\xc3\xc0\xe4\x83\x11\xdb\x9e\x68\xa6\x70\xb3\xc6\x2e\x95\x38\x66\x9e\x74\x4f\x35\x55\xa2\x96\xba\xd0\xc8\x49\x5e\x57\xeb\xc4\xa1\xbb\x23\x3e\x04\x59\xed\xfc\xf4\x76\xb2\x4d\x02\x71\xcb\x47\x9b\xe5\x25\x16\x40\x94\x7e\xdf\x6a\x38\xb6\xf7\xd8\x25\xe2\x6b\x87\x10\x4e\x3c\xc0\xbd\x12\xc8\xfe\xbb\xd1\x22\x24\x2e\x04\x1e\x0f\x4d\x4f\x6a\x8d\xb5\xa9\xe8\x13\x12\x09\x84\xca\xac\x85\x36\xe4\x66\x64\x1b\x58\xbe\x5b\x43\xe0\xca\xc4\xeb\xa8\xc2\xc3\xfd\x92\x03\xfd\x3c\x7b\x6c\xca\xc6\x10\x2b\x05\x85\x5f\x18\xf6\x49\x5e\x08\x47\x5b\x69\x19\xc5\x27\xc4\x8e\xd6\xe7\x37\x28\x31\x00\xe2\xf4\x44\x19\x0d\x48\xc3\xc4\xd7\xc4\x02\x5f\x57\x66\x57\x2c\x2d\x76\x7b\x46\x25\x00\x22\xac\x1b\x98\x45\x66\x9e\x06\x6f\x2c\x27\xfa\x15\x13\xdf\xab\xd1\x1f\xfd\xf5\x2c\xc6\xdf\x5e\xe0\xad\x73\xa9\x43\xe6\xe0\x31\xbe\x3f\x61\xb1\x3c\x5b\x9e\x2d\x90\xb6\xe6\xdf\x0c\xec\x08\x54\x4f\xfe\xe6\x8d\x7d\x0f\x01\xeb\x83\x94\x0b\xe5\x84\x50\x49\x0d\xaf\x21\xd1\x55\x6b\x06\xc4\x8b\x55\x1a\x2a\xad\x43\x36\xd0\x21\xe8\x94\x1d\x10\x4f\xb7\x66\xc1\x75\xb5\x3d\x80\x7a\x0e\xfb\xbf\xea\x83\x9e\x5b\xb9\x91\x49\x96\x85\x46\x19\x15\x3e\x40\x9e\x74\x7f\xf1\xd3\x59\x68\xcb\x01\x50\x11\xdf\x48\xb5\xb5\xb8\x45\x02\x43\x0f\x79\x3d\x59\x79\x0f\xfe\xa3\x80\xb3\x0a\x79\x90\x8c\x93\xa7\x58\xaf\x11\x21\x05\x34\xa0\x70\xf4\x5f\x57\x5b\x7c\x27\x01\x8c\x3d\xd8\xdf\x33\x14\x24\xea\x80\x7e\xc3\xe3\x88\x97\xbc\x56\x9b\xea\x41\xd7\x09\xc1\xd9\x25\x98\x3d\x41\x9e\x6d\xa6\x3d\x20\x72\x0f\x44\xb2\xad\xb3\x32\xe3\xd2\x09\xa6\xb9\x82\xde\xf8\xa3\xfb\x86\x15\xb0\x17\x61\x95\x03\xe6\xe4\x6e\x7a\xd6\x5e\xd5\xb5\xb9\xcb\x37\x18\x3f\xe0\x4a\xf6\x55\xbe\x6a\x20\x21\xbd\xb0\x4f\x3f\x7c\xf7\xfa\xff\xf0\xa5\xc0\xdb\x06\xc4\xb6\xa0\x2c\xf6\x2e\xab\x91\x25\xe9\x46\x97\x7a\x95\x43\xb9\x73\xf0\x48\xd1\x2a\xe6\x67\x67\xc3\xfd\x13\x56\x62\xd9\x33\x66\xe8\xb0\x66\xb4\x40\x4e\xac\xc1\x8e\x5f\xa0\xbf\x00\x50\x31\x30\x7f\x30\xaf\x42\xf5\x5c\x50\xe5\x62\x97\x61\xb1\x3c\x7a\xc8\xed\xf6\x97\x55\x06\x28\x02\x46\x79\x64\xaf\x20\x19\x5d\x1e\x38\xb9\x79\xd9\x68\x20\x6d\xb5\x8b\x2f\x04\xa2\x1b\x75\x28\x0c\x09\x3a\xff\xf0\x78\x59\xea\x75\x56\x7f\xeb\x3d\x79\x1a\x56\xa8\x06\xcd\xc5\xe4\x3a\x21\xee\x4c\x36\xa8\x7c\xdd\x20\x91\xc7\x24\xcc\x24\x10\x96\x20\x39\x41\x6e\x28\x3a\xd4\xbf\x6c\x8a\x2a\x6f\xda\x87\x9a\x53\x3e\x01\xb8\xb2\xda\x96\x5e\xeb\x34\x33\xb9\x21\x1e\x93\x28\xb8\x64\x77\x9c\x64\x20\x16\x36\x11\x64\xdd\xc3\xfb\x0d\x47\x2d\xb8\x93\xdc\xc4\x47\x5d\xb7\x5d\x4d\x70\x00\xec\x29\xce\x2c\x05\xc1\xf9\xad\xa3\xd3\x3b\xec\xa8\x3b\xc8\xff\x13\xa7\xf8\x89\xf5\xc2\x52\x86\x1a\xa8\xd3\xac\xd1\xf4\x49\xa0\x46\xcf\x75\x54\xf6\xca\x66\x96\xcc\xfe\x31\x0e\x58\x0d\xdc\x6a\x0d\xcb\xe9\xc8\x16\x90\x38\x9d\xc7\x32\x60\xa1\x55\xb0\x7a\x29\x2b\xda\x30\xff\x7d\xe0\xe3\x81\x81\x58\x1b\x59\x77\x63\xa2\xd1\x0c\x3a\xf3\xc6\xee\x28\xbe\xc3\x21\x02\x0a\xfb\x46\xcd\x16\xd5\xe6\xa9\x8e\xc1\xf9\xe4\x7a\xe7\x94\x07\x21\x38\x18\x95\x93\x75\x1d\xb1\xe3\xca\x99\x4f\x59\x21\x38\x98\xdd\xab\x38\x43\xcf\xe9\x76\x57\x13\x15\x46\x2e\xf9\x17\x50\x3b\xd8\xb6\xa9\xf6\xbc\xbb\xb1\x53\xe1\x8e\x22\x31\x47\x60\x75\x21\x57\x47\x59\xc5\xd5\x48\xb9\xef\x52\xec\x30\x47\xc7\x01\xd7\xa2\x01\x3f\x0f\xc9\xfe\xc5\xfe\x57\xad\xd7\x95\x63\x2a\x7f\xda\x16\x5c\xc1\xc9\xee\x4b\xde\x0c\x1e\xed\xb6\x29\x3f\xa9\xc3\xbc\x87\xb0\xa6\xb0\x6e\xcb\xd7\xe2\xed\x5e\x9a\x58\x4d\xa2\x3d\x58\x78\xb2\xe7\x79\xaf\x2b\x98\xd0\xde\x2e\xc2\x6d\xf1\x4a\xf1\xbe\x14\x5a\xb2\xf0\x77\x6c\xa9\x5e\xd4\xc5\x45\xf7\x71\xe0\xac\x3e\x88\xd7\xc7\xb3\x4b\xd0\x0e\x21\x52\xd2\x6a\x66\xdf\xad\x63\x81\x24\x77\xc8\x6b\xb4\x1e\xed\x88\xd1\x12\x64\x4d\x25\x3e\x96\x4d\xe2\x84\xee\xe9\x3f\xed\x92\xab\x6e\x2b\xc3\x68\x70\xd9\x37\xd1\x7d\x4a\x29\x3a\x00\x00\x8b\x08\x48\x16\x39\xf2\xba\x03\x56\x7c\x71\x66\xbc\xe9\xbf\xed\xf9\xcd\xfa\xb6\x8f\xa4\x32\x48\x3d\xcc\xbe\x3f\x7d\x3c\xae\x42\x33\x3e\xfb\x06\xd2\x9c\x6e\x83\xd1\x55\x47\x7c\x5f\xd6\x8d\xb1\xcd\xbf\xf6\xec\x6e\x1d\xdc\xae\x7b\xf6\x52\x26\x19\x90\xe3\x6c\xaa\x13\x56\x33\x5a\x7b\x55\x92\xd7\xfd\x93\x1e\x56\xa7\x3d\xc7\x55\x87\xd8\x94\xcf\x71\x3c\xc2\xfc\xf7\xa6\xff\x46\x0c\xd0\xbb\xbe\x9a\x6a\x2a\x73\x80\x65\xbb\xef\xfa\xaf\xf9\x5b\x46\x06\x2c\xfc\xe7\x54\xf1\x63\x3a\xd6\x3c\x2c\x3a\x38\xa9\xb8\x9c\x86\x82\x78\x87\xa6\x87\xf7\x07\xec\x6d\xb3\x5d\x59\x8b\xc6\x8e\x90\xe7\x91\xc7\xb5\x26\x1c\x5a\x80\x42\xc4\x6f\x78\xca\xcb\x3d\xe9\xbf\xef\xab\xb3\x2c\xaf\xd5\x95\xd1\x5d\x6b\x9b\xc2\x02\xb2\xc0\x09\x1c\x35\xb9\xca\xaf\xb9\x38\x82\xa6\x14\x8b\xba\x90\xdf\xcb\x41\x5b\xaa\x45\x53\x23\x93\xe5\x4a\xad\xec\x0b\xe1\xf6\x85\xff\xb5\xd4\x19\x39\x52\x5c\x76\xe7\xe9\x82\x8c\x6f\xe9\x0f\xfd\xb6\x79\xe6\x18\x25\xde\x58\x77\xe4\x4d\xff\xc4\xfe\x7f\x6f\xf0\xb2\x7e\xd3\x7f\x4b\xd4\x7a\x61\xd9\xeb\x93\x57\x2b\xd3\xc2\x4f\xb9\x48\x99\x08\x2f\xe8\x9d\x6f\xac\x49\x78\x1a\x65\xbc\xc8\x3f\xb1\xae\x09\x7d\x6d\x50\x14\xad\xa4\x7b\xd7\x91\xd3\x15\xda\x63\xdf\xd8\x0e\x72\x18\x10\x84\x25\x06\x80\x4d\x88\x05\x53\x29\x22\x86\x2a\xaf\x51\x14\xca\x99\x66\x8c\x17\x78\x4a\x67\xc6\x73\x0c\x22\x5a\x4a\x6a\xcb\xbb\x25\xdd\x8a\x16\xb8\x90\x70\xdc\x25\xa3\x6e\xed\xdf\x4a\x51\xba\xd0\x2d\xf0\x60\x27\x09\x00\x59\x77\x1a\xe4\xd9\x49\x04\x7d\x2f\xc5\xa1\x2c\x53\x67\xbe\x0b\xc8\x87\x36\x48\xb6\x19\xc8\xb9\xcb\x02\xf5\xf0\x34\xde\x17\x77\x7b\x63\xcd\xb1\x78\x5e\xa3\xd8\x1e\x7d\x75\x04\xa7\x9d\x3c\xe2\xba\x66\x36\x0e\xfc\x36\x77\xba\x8c\xae\x76\x32\xa7\xa2\xdf\x12\xfb\xbf\x01\x64\x70\x14\xe7\xec\x5c\x31\x99\x09\x83\xad\xfe\x48\x3b\xc6\x61\x7e\x64\x86\x69\x1e\xe3\xc6\x3e\x3e\x31\x9d\x41\x69\x3b\xdd\x4e\x0c\x85\xe5\xfa\x50\xb3\x2d\x5f\xeb\x62\x67\xfd\xc4\x12\x0a\xde\x9b\x67\xf0\x96\x05\x7b\x87\x22\x84\xae\xd9\x1d\xe6\xff\x75\x9b\x03\x16\x5a\x19\x77\xec\x89\xdd\x90\x50\x10\xd1\x99\x69\x8c\x5f\xf5\x0a\xf3\x04\x4b\x6e\xd3\x06\x49\x11\xf9\xae\x31\x75\x86\x82\x58\xbd\x78\x9a\x02\x2d\x01\xe3\xf7\x9e\xbf\x74\xbb\x0c\x52\xb7\x9a\xdf\xb4\x57\x73\xe0\x42\xd1\x17\x1d\x95\x3f\x1e\x28\x2d\x25\x36\xf1\x8b\x98\xcf\xf5\x7a\x3f\x9f\xeb\x35\x8b\x84\xc5\x56\x4a\x60\x9e\xc4\x17\x3d\x0f\x5c\x2b\xee\xe8\x8a\xdd\x44\x63\x72\xe3\xd8\x9c\xb2\xbd\x07\xac\x54\x1c\x91\xc7\x52\x85\x24\xb9\xb0\xf4\xda\x39\x10\x5f\x98\xde\x75\xbc\xd9\x19\x7c\x4e\x26\x25\xaa\x18\x65\x89\xfa\x6b\x2c\x3c\xf7\xf6\x54\xd1\x5e\xb4\x7b\x3d\x0f\xb1\x6a\x71\x0f\xc6\x6f\x85\xe8\xaa\x24\xec\xf4\xf4\x23\x55\x7b\x0c\xd7\xa0\x62\x0a\x5f\xcc\x19\x12\x9d\x38\xe2\x8f\xe7\x99\x70\x41\xa3\x5c\xe4\x51\x74\x1c\x36\xd4\x9e\xb6\xfa\xe5\xfa\x16\x5c\xa9\x7c\xe1\xee\x59\x79\xdc\xa3\x7b\x13\x6e\x13\x6b\x38\x3a\xee\x18\x14\x9b\xc7\xf7\x71\x69\xc0\xa1\xbf\x48\x3b\x78\x6f\xc9\x1d\x73\xff\xed\xc1\xb7\x46\xc2\xfb\xd1\x44\x97\x7e\xed\x4a\x15\x79\x06\x36\xc1\xae\xc7\xe1\x72\x02\xf1\xed\xdb\xa6\x7b\xee\xca\x84\xb9\x9e\xdc\x96\x41\x22\xe7\x86\x78\x16\xe2\x0e\x39\x8a\x4d\x68\xb9\x64\x25\xb2\x1b\x6a\xb9\x53\xdf\xca\xea\xa1\x04\x5a\xac\x6d\x56\xa8\xbc\xcc\x16\x8b\x6d\x9d\x2d\x72\x1f\x4e\x7d\x63\x0d\xdb\x41\x58\x76\x3f\xf0\x96\x3d\x94\xb5\xc4\x07\x03\x56\x89\x36\x15\xd3\x5b\x92\xa0\x63\x2c\xb5\x98\x88\x31\x33\xdb\x0d\x46\x4d\xf2\x72\xa9\xd7\x25\x70\x19\xd4\x7e\xdc\x02\xc2\x90\xa6\x0a\x76\x63\x78\x35\xb5\x4f\x02\xc7\xa6\xe4\x0e\xfc\x0a\x39\x02\x0b\xbb\xab\xf1\x4c\xb2\xa3\x70\xa3\xef\xb2\x62\x85\xad\xb5\x4b\xa8\xe2\x3f\x75\xb8\x5a\xc2\x04\x82\x28\x98\xb5\x6f\x6f\x4c\x55\x6c\x41\x48\x13\x2b\xf8\x9d\x60\x1a\xac\xe5\xc7\xba\x9a\xec\xeb\x2b\x90\xbf\xc1\x2d\x02\x67\x10\x9e\x91\xc8\x64\x4a\x77\x34\xc5\x12\x81\x11\x86\xb8\x2a\xec\x33\x57\x3b\x92\xad\x0a\x82\x33\x1c\x49\x77\x6f\xca\xcb\xc5\xb6\xa6\x87\xb7\xc2\x5e\x91\xb7\xf6\xfc\xb9\xc2\xbd\x6d\x5b\x07\x6d\xf7\x76\x98\xa3\x86\xf4\xeb\x67\xcf\x26\x82\xfe\xed\xdb\x44\x5c\xb4\xbd\xe0\x28\xd6\x5f\xb7\x75\x6e\x88\xd3\x90\x05\x67\x46\xa5\x6b\x8e\x75\x4e\xe1\x4e\x39\xdd\xc2\x18\xcd\x9a\x0c\x04\x66\xab\x5a\x4d\xf5\xed\xb6\x70\xde\xda\x88\xf9\xe0\x80\xc5\xc1\x93\x0d\xd1\x01\x2c\x6f\x26\x91\xd1\xeb\xb4\x0a\x5a\xd1\x36\x94\xc5\xae\x65\x62\xb1\x75\x3c\x2e\xb1\x7d\x06\xdb\x97\xa8\xbf\x6e\x97\x14\x98\x46\xde\x1f\x30\x59\xb9\xc1\x60\x1d\xba\x65\xf8\x13\x58\x87\xf1\xdd\xd9\xdd\xb4\xc7\xb3\xa7\x58\x9e\x64\x0d\x24\xb6\x10\x55\xc8\x56\xe0\x25\x30\x29\xbe\xa4\x77\x2a\x83\x98\x21\x31\x03\xe0\xef\xb0\xe6\x9d\x5d\x0a\x92\x5d\x47\xe3\x4e\xff\xc2\x82\x03\x52\x5e\x1a\xab\x90\x85\x01\x62\xf6\x0e\x54\x57\x58\x2d\xa5\x93\x31\x38\xf2\x42\x3a\x33\xe3\x27\xde\x8f\x63\x82\x2b\xbf\xab\xd1\xde\x8f\x06\xdd\x87\x26\x03\x19\x16\x64\xd1\x0d\x6e\x49\x57\xa8\x66\xbe\xe5\x45\xc1\x54\x1d\xc4\x0a\x4d\x5c\xd4\x48\xe0\xce\x5a\x32\x73\x62\x9c\xf3\x71\x82\x77\xd6\x4b\x9c\xb7\xd9\xb0\xf6\x71\xd9\x79\x32\xbd\x90\x25\x2c\x47\x57\x63\x45\x5c\x0a\x1d\x8b\xd6\xf1\xa2\x89\xb3\x91\x7e\x45\x21\x60\xe6\xd4\x6a\x04\x07\xd1\xd3\xcd\x22\x4a\xdf\x6e\x58\x0d\x78\xd6\xb5\x06\x3e\x66\x20\x7e\xcd\x7a\x68\x01\x1a\x32\x69\x1c\xf7\x2a\xe2\xd0\x9b\xbc\x68\x1f\x49\xcc\xfb\x41\xf2\xc5\xab\xbc\x0c\x79\x05\x0d\x9e\xe6\x18\x6e\x4a\xdc\x42\xc6\x14\x42\x55\xde\x56\xf6\x6a\xa7\xfc\x41\xde\x11\xe9\xb7\x83\x06\xf7\x8b\xbd\x40\x57\x3b\x3a\xc3\x28\x58\x56\x1e\x85\x54\x63\xb0\xa3\x5b\xee\xcb\xa6\xce\xd1\xc5\x7e\xff\x5a\x2d\xb3\x9d\x51\x20\xac\xee\x43\x1e\x30\xbe\x37\xd9\xe2\x1b\x52\x1a\x08\x1e\x41\x75\x51\xd5\xba\xe2\x9b\x8a\x7b\xf1\x7d\xa3\xda\xd1\xd3\xce\x8e\x42\xff\x72\x6d\x7e\x45\x0f\x13\x2f\xd7\x02\x98\xdf\xda\x34\x08\xb0\x70\x5d\x74\xd5\x60\x14\x60\xac\x56\xf1\xb3\x5b\xbc\x6c\x42\x2b\x5c\x34\xd3\x5f\x73\xf1\xba\xf4\xc3\xfc\x26\x1e\xe6\x1a\xdf\xbf\x69\x7c\xbf\x9a\xdc\xb3\x40\xbf\xeb\x23\x27\xce\x35\x70\x0b\xe6\x0d\xa8\x5a\x17\x79\xc3\x37\x6e\x76\x9b\xd9\xd1\x94\x19\xd6\x1b\x50\x82\x07\x12\xb2\x5b\x4f\x12\x16\x10\xc0\xa1\x96\xe3\xa1\x67\x9a\x59\xea\x45\x91\xd5\x59\x53\xd5\x3b\xcf\x25\x47\x44\x8b\x09\x72\xc8\xe8\xfa\x88\x71\x09\x50\x5c\x5b\x57\xc6\xd0\x5f\x7a\xc8\x39\xe7\xd8\x93\xb3\xae\x10\xf6\x3e\x0a\x31\x6e\x98\x04\x52\xec\xdf\xc7\x58\x91\x8c\x9a\xbe\x1e\xfa\x22\x5e\x67\xf6\x3a\x59\xb1\x12\x1b\xd7\x4f\x8a\x69\x35\x77\x99\x3c\xaa\xfc\x24\xbc\x01\xae\x9c\xc6\xc9\xf3\xda\x1f\xfa\x23\x31\x96\x3f\x78\x87\x80\xac\x77\xfd\x13\x4e\x8f\xd8\xc7\x6a\x7b\x50\x18\x2f\xee\xe9\x79\xf1\x4c\x30\x15\x7c\xa5\xd8\xbe\x20\xfc\xdc\xe8\xa2\xd0\xb5\xe9\x51\x1c\x0c\x56\xed\x8d\xd6\x25\x52\x73\x15\x3b\x99\x68\x81\x1d\x42\x2b\x2b\x78\x54\xc7\x09\xe8\x56\xa5\xec\x0b\x8e\x81\xd9\xd6\xf7\x50\x7f\xeb\x3f\x61\xdd\x96\xd3\x40\x3e\xfd\x0b\x99\x40\xf6\xc3\x2e\x67\xf2\x11\x66\x57\xda\xfe\x07\x99\xdd\x9e\x07\x32\x51\x5a\x6d\x9b\xa0\x62\xd4\xce\xf5\xb7\xbc\x5c\xba\x2c\x2b\x31\xc7\xea\x65\xc2\x29\x2f\x8c\x6b\xc0\x8d\x59\x41\x39\x21\xfb\x46\x49\x27\x02\x87\x9e\xee\x08\x9d\xf7\xf9\xc2\x50\x13\x8c\x62\x0b\x7a\x61\x0f\xe9\x35\x8a\xd4\x11\x2f\xfa\x2a\x6f\xe8\x82\x15\x07\x9e\x63\x3e\xab\xe1\x20\xa1\x05\x9e\x97\xb7\x24\xc1\x85\x1a\xae\x75\x6e\xbe\x11\xf5\xa0\x7d\xf9\xbf\x6f\x33\x30\xff\x84\x48\xb3\xa4\x99\xeb\x6a\x9b\x87\x43\xcc\xa8\x82\xb3\x03\xd2\x04\x13\xa0\xa9\xfd\xa0\xbd\x8f\xa0\x22\xb2\xf5\xd0\xcd\x00\xe2\xc7\xc8\x67\xe8\xd9\x53\x64\xbb\xd6\x41\xd0\x0a\x31\x56\x9c\xa4\xc1\x5c\x0f\x8c\x71\xad\x37\x59\x8e\x36\x1f\x48\x92\xa0\x71\x8b\xb1\xf6\x6e\xbd\x7d\x60\x06\x6b\xf2\x66\xcb\x3a\x69\xc6\xd8\x91\x41\xd1\xa9\x36\x3f\x98\x1a\x57\x4c\x00\xd6\xd9\xcd\xdc\x50\x05\x44\xfe\x1f\xdd\x8b\x8d\x5c\x51\xf1\x89\x6f\x17\x93\x7f\xfb\xfc\xae\x7d\xcf\x39\x5b\xf0\xf6\xd3\x2b\xf8\x5d\x59\x85\xcc\x7c\x74\xfb\xd3\x47\x88\x82\x69\xee\x34\xac\x40\x86\x86\x34\x55\xdd\x48\x5f\xbd\xd4\xb7\x45\x7e\xab\xcb\x85\xee\x25\x0e\x34\x92\x44\xa8\x11\xdc\x85\xd1\x94\x30\xb8\xc8\xba\x93\x0f\x77\x55\x90\xb8\x6e\x0d\x48\x16\x94\xbe\xe0\x31\x04\x12\x64\x6c\xe8\x81\xd9\x45\x3e\x16\x63\x60\x3c\x1a\x86\x38\xf5\x61\x23\x41\x9d\xaa\xfd\xdf\x48\x6a\x45\xe9\x2c\x3b\x55\xcb\x6c\x9d\xdd\x6a\x97\xdd\xb3\x2e\x73\xb6\x68\x00\xdc\xf1\xe8\xf6\xe3\xdf\x81\x2a\x88\x5d\x5b\x9b\xba\x5a\xe5\x76\x7f\x15\x15\xaa\x77\xdd\x56\xd5\xd2\x1a\x8e\x09\xc6\xb6\x4c\x53\x6d\x36\xd9\xad\x4e\xbc\x80\x87\xb5\x7e\xa0\xdc\xb6\x56\xeb\xac\x60\xa9\x0e\x07\xc0\x72\xb0\x48\xe4\x53\xac\xd6\x76\xe7\x06\x6d\x86\x57\x43\x1c\x0b\xca\xd5\xd9\xf0\x80\x0c\x30\x4d\x80\x3f\x6a\x31\xb0\xac\x1d\x01\x3a\xfa\x1f\xe4\x01\xd3\x2f\xe9\xc9\xb4\xec\x8b\x60\x31\x09\x77\x10\x9e\x1c\x88\x5d\xfb\x0f\x51\xca\x29\x43\xc6\xdb\x8d\xae\x0d\xb8\x9d\x79\xf9\xd7\x2d\x08\xe0\xbb\xfa\x21\x67\x7f\x70\xbe\xda\xaf\xaa\xc8\xa7\x10\xe9\xaa\x22\x7b\x70\x2e\x06\x41\x1d\x7c\x23\xfb\x6a\x66\x6d\x16\xe9\x9c\x1a\x47\xa3\x5c\x14\x18\x2e\x97\x14\x11\x75\xd4\x43\xbf\x50\xf6\xae\x13\x8a\xdc\xe5\x46\x3c\x27\x74\x9d\x7d\x02\x84\xc7\xc6\x1e\x70\x44\x42\x7e\xee\xec\x1e\xfb\x87\x01\xc4\x06\x9c\x25\x54\xeb\x02\x25\x04\x22\x3d\x5f\xce\x2d\xdf\x00\x61\x61\xe3\x18\xf2\xf0\x58\xdb\x12\x79\x57\x16\x74\x5c\x30\x55\xd8\x83\xb3\x5c\x5a\x1b\x6e\x9d\xe5\x04\x1d\x05\xa9\xfc\xda\xf6\x77\x63\x8f\x2b\x50\x0a\xa8\x56\xea\x66\x6b\xf2\x92\x5d\x02\x1a\x5d\xd7\x3c\x9c\xf5\x1b\x1d\x44\x69\x8b\xec\xc1\x2b\xb3\xcb\x06\xf8\x5d\xe3\xf5\xa6\x28\x01\xba\xa8\xca\x55\x91\x2f\x9a\xa3\x6a\x75\x44\x13\x8a\x5e\x89\x81\x00\x23\xb0\xc8\xc5\x88\x13\x7c\xf9\xa6\x46\xe3\x25\x73\x8b\x46\xc4\x1c\x50\x5f\x5a\x5a\x75\x38\x8b\xd2\xf2\x63\xee\xf0\x8b\xdc\x2c\x74\x51\x20\x47\xee\x8b\x38\xa5\x1a\x24\x8c\x85\x6e\x93\xa7\x01\x26\x62\x3c\x47\xca\x45\x2c\xce\xeb\xac\xb1\xfb\x9a\x80\xfd\x8e\xcf\x95\xfb\xd7\xb2\xd6\x98\xd1\x15\xfd\xd7\x80\xcc\x95\xbc\x64\xff\x5b\x37\xfc\xc0\xfc\xbd\x66\xa6\xc4\x70\xab\x04\xf0\x03\x0e\x94\x89\xa7\x22\x15\xbd\x1d\xf4\x30\xb4\x81\x66\x19\x59\x3a\xc2\xa0\x28\xb2\xf2\x76\x9b\xdd\x3a\xa6\x66\xc2\x07\xba\xb6\xc0\x0d\x58\x6f\xed\xf9\x4c\x66\x3c\xac\xb8\x1a\x9d\x03\x7f\x4e\xdc\x90\x18\x17\x32\x3b\xc0\x4f\x22\x02\x62\xf6\x02\x5a\x95\x21\xc7\xaf\xfb\x6c\x80\x9b\x08\xf7\xcb\x10\xd1\xd7\xd6\x93\x1f\xeb\x07\xf7\x3d\xfa\x80\xcb\x80\x04\x53\x63\x1e\xaa\x80\x98\x46\x3f\x64\xf5\xd2\x05\x33\x32\x61\xee\x89\x2c\xdd\xf1\xeb\xfe\x1b\x40\x08\x41\x18\xd4\xe3\xfa\x3a\x1e\xe5\x28\x64\x1d\x84\xde\xb3\xc5\x33\x45\x64\x9b\x13\x32\x88\xab\x48\x9e\x45\xc7\x34\xf7\x2c\xb2\x45\x3f\x20\x0e\xb7\x66\x9f\xdf\x31\x34\x1d\xb9\xb8\xe7\x26\x10\x1a\x21\xcb\x14\xce\x07\x7d\xdb\xe7\xba\x19\x36\x51\x08\xa1\x9f\xee\x30\xfb\x1e\xb4\x08\x04\x73\x5b\xe8\x93\x16\xe5\x4c\x3c\x9d\x7e\x1c\xde\x70\x3d\xac\x5e\xc6\x43\xc0\x84\xda\x98\x55\x73\x90\x26\x80\x09\x05\xe9\xf1\x38\x23\xee\xb8\xa1\xec\x6a\xa6\x9c\x1c\x31\x48\xf9\x24\x19\xec\x5e\xe3\xfa\xb7\x6b\xe7\xf0\x40\x58\x70\x3f\x51\x81\x3b\x23\x56\x44\x72\x0f\xec\x3f\xb2\xb7\xe8\x5a\x41\xda\x05\xed\x61\x3a\x67\x9d\x45\xce\x7c\x41\x5d\xcb\x94\xa1\x4b\x18\x7b\x21\xd4\x9a\x10\x5e\x04\x2d\x0f\x42\x4f\x41\x5e\xd5\x49\x3d\xf9\xb6\xf5\xc4\x40\xbf\x95\xb9\xcc\xf2\x76\x4f\xed\x42\x6e\x9e\x95\x97\x0b\x93\xf8\x3e\xbd\x21\x56\xeb\x7f\xea\xf9\x7b\x53\xcc\xdd\xeb\x3a\x79\x46\xcd\x54\x3c\x6d\x1c\xd2\xe4\xb2\xab\xbe\x2f\x3a\x53\x47\xed\xd6\xf3\xcf\x30\xc1\x86\xfc\x46\xad\x2f\xe5\x26\xd2\x0b\x08\x37\x65\x77\xd5\x63\xa2\xee\xfb\xea\xa4\xff\x1a\xaf\xa3\x80\x2e\xe8\xe2\xf2\x1c\x0a\xb5\x42\xea\xf6\xa5\x88\x16\xad\x72\x7b\x13\x31\xfd\x18\x81\x0c\xec\x21\x98\x35\xea\xae\x69\x36\x3f\xbd\x7a\xb5\xc6\xb7\xf6\xab\xfa\xf6\xd5\xc5\xe5\xf9\xab\x93\xfe\xeb\x57\xfd\x17\x2e\xb2\x0f\x64\xee\x1c\xdb\x07\xd3\xd0\xe4\x35\x1b\xf0\x1b\x92\x10\xf6\x95\x79\x81\x1b\x8a\x6f\xf7\x61\x77\x91\xd1\x88\x7f\x55\x54\x94\x2d\x3b\x44\x11\x21\xa3\x32\x26\xb5\x74\xe5\x34\x99\xb5\xb0\xf4\xbd\xdd\xb9\xe8\x23\x54\xf5\xae\x47\x86\x92\x8c\x2f\xbb\x12\x94\x22\xff\xa6\xc9\xbc\xad\xaa\x6f\x7e\x5b\x67\x2e\xc4\xe5\x32\x82\xcb\xa5\x4c\xb2\x60\x56\xaf\xf1\x79\xc1\x6a\x25\x12\x9c\x0e\xf5\xde\x7f\xe1\xd7\xcf\xd1\x73\x6b\xff\x9e\x5a\x21\xcf\x7b\x0c\x21\x52\x9c\xb2\xf2\x33\xd6\xcf\x3f\x50\x19\x7d\xff\xd5\x55\x99\x2f\xaa\xa5\x3e\x9a\x4f\xae\x7e\xa7\x1a\xf0\xc7\xeb\xbf\x8f\xdf\x1e\xbf\x8b\xeb\xbf\x4f\x7e\xf8\xe1\xe4\xcf\xfa\xef\x3f\xe2\x1f\xcd\x3e\x71\x40\x56\x2b\xc0\x4e\x9e\x71\x05\x19\xd5\x40\x6d\xea\xfc\x3e\x5b\xec\xd4\xa6\x2a\xf2\xc5\x8e\xee\xfc\x50\x38\x11\xb5\x01\xf2\x06\xaa\x10\xf0\xd0\xe1\x47\x5f\xd2\xaf\x2f\xe1\xd7\x58\xcf\xe3\x50\xc4\x6a\x6b\xc0\xd3\x8f\x7e\xf4\xbf\xfe\x3f\x6b\xdd\x9a\xaa\x6e\xf2\xed\x5a\x8d\x99\x0a\x70\xee\x7e\x76\x65\x7f\xc6\x8f\x04\x0f\xb1\xef\x5e\xe8\x58\x01\x7d\x65\x94\xff\x9b\xfa\x5f\xff\xaf\x3a\xfe\xf1\xc7\xe3\xa3\x93\xd7\xc7\x6f\xf9\x27\x48\x2b\x06\x30\x47\x8a\x41\x23\x27\xb1\x5e\x7a\xc8\xa6\x1a\x12\xdd\x3c\x17\x89\x1a\x4a\xf4\x14\x9a\x94\x64\x72\xa3\x1e\xf4\x8d\x1d\x04\x86\x52\x60\x91\x95\x2e\x97\xac\x15\xe4\xc2\xe6\x41\x31\x66\x40\x5d\xd2\x3f\x00\xcf\x03\xe3\x01\xe8\xf7\x60\x1e\xdd\x45\xbc\xbc\xc3\xb8\xd2\x3a\x11\x86\x33\x06\x26\x3a\x9a\xe7\xcd\xaf\x58\x68\x09\x5c\x4c\x96\xd4\xac\xa2\x29\x98\x35\x99\x3d\x0c\x97\x89\xbc\x4c\xe7\x8e\x19\xdc\x23\x58\x59\x17\xc7\x01\x33\xbe\xbf\x0b\xf7\xb9\x7e\x48\x5a\x75\x3c\x31\x82\xab\x28\x3a\xfb\x67\xaa\x02\xa4\x43\xb0\x12\x80\x49\xf2\xec\xca\xe5\xba\x31\x0e\x02\x78\x66\x01\x92\xf3\x85\xe0\x08\x80\x06\xd8\x45\xe5\x65\xd4\xd9\x7b\xfb\x85\x67\x8c\xc0\xdb\xbe\x3a\x23\xe0\x11\x23\x02\x3c\x5a\x80\x96\x18\xc5\xfb\xbd\x1c\xd1\x06\x17\x98\x98\x0a\xa1\x82\x20\x2e\x7b\xa3\x11\x54\x98\x35\x19\xf5\x1f\xb1\x32\xe4\x4e\x1d\xb8\x7d\xe0\x22\x74\xa7\x59\x93\xdd\x64\x46\x1f\x80\x71\x72\xa3\x91\x84\x53\x9a\x65\xc7\x3e\xff\x11\xba\x55\xf4\xfa\x78\x50\xc0\x79\x5b\x7d\x77\x17\xab\x95\xed\x13\x9d\x01\x20\x24\x50\x7d\x53\x9a\xc7\xf0\x90\xdf\xf2\xae\xff\x9a\x98\x48\xa1\xcc\x1d\xc5\xa7\x48\x5d\x1c\x9b\x4e\x95\x3e\x90\xad\x64\xb0\x43\xde\x14\x76\x9c\x6e\x35\xb1\xe5\x94\xc0\x2e\x0a\x0f\x5c\xdc\x01\x73\xfb\x22\xab\x6b\x81\xd1\x90\x4d\xc3\xdd\x4f\x34\xee\x58\x4b\xee\xc3\xb8\xf4\x28\x5e\x7a\x51\xe1\x72\xad\xc3\x11\x80\x75\xc8\x5d\x79\x4f\x5d\x81\x1a\xd1\x24\xd0\x47\x97\x04\xb4\x7c\xd4\xca\x73\x98\xa7\xe4\x3d\x04\xc4\x3b\x6a\x6d\x9a\x4a\x1d\xac\xf3\xba\xae\xea\x83\x60\x92\xf8\x14\x62\x83\x6d\xa5\xe1\x67\x08\x72\x22\x94\x80\x38\xb9\xb5\x7f\x8a\xfd\x19\xbf\xf6\x87\x90\x20\xc9\x99\xa8\x2e\xd0\x1c\xe3\x48\xc2\x12\x7a\x18\x4f\x52\x14\x72\x55\x9b\xf4\xa1\xb3\xf9\xef\x75\x7d\x93\x35\x39\xe2\x96\x3f\x02\x4c\x9d\x05\x3e\xa6\xb8\x84\xce\xe1\xfc\xc4\x03\xa5\xd1\x8b\xbb\x12\xf5\x34\xec\xda\xef\x24\xbe\xa7\x61\x5a\x8a\xd3\xcc\x3e\x0d\x08\x95\xa0\x21\x83\xb5\xae\xf3\x45\x96\x40\x80\x2d\xbb\xd5\xe5\x22\xc7\xd8\xfe\xab\x0a\x35\x99\x6b\x9c\x63\xd2\xb8\x14\x39\x84\x81\x0b\x6a\x41\x25\xab\x0b\x32\xb7\x9b\x25\x3e\xf4\x1a\xd4\x0e\x4a\x83\x5c\xca\xa0\x1e\x4e\xb5\x93\x05\x28\x3f\xc1\x35\xdb\x40\xe1\x21\x53\xc6\xb2\xdd\x99\x97\xea\x6c\x30\x55\x27\xfd\xe3\xd7\xc7\x10\x02\x38\x3d\x1b\x4c\x67\xea\xe4\xdd\x49\xff\xe4\xe4\x87\xa3\x1f\xec\x5d\x76\xf8\xaf\xdb\x52\xdb\xbb\xed\x5d\x0f\x05\xc4\x5c\x30\x98\xf6\x5b\xd0\x4c\x3a\x6b\x97\x5b\x07\x9f\x63\xf9\xc4\x45\x51\x99\x6d\xad\xd9\xd6\xfd\x04\xb7\x3d\x77\x5b\x1c\x85\xc1\xc6\xce\x0c\x1c\x4b\xab\xaa\x6e\xee\x6c\x6b\xa9\x7d\xaf\x5d\xfb\xde\xa9\xb9\x7b\xff\x29\xbc\x7f\xe8\x07\xc9\x6e\x90\x51\xa3\xd7\x46\x1d\x8e\xab\x7b\xec\x83\x97\x8d\x72\xe3\x8e\xfd\xf0\xa1\x10\x7b\xc1\x2e\x16\x55\xbd\xf4\x99\x7b\x3b\x4a\xc7\x27\x47\x27\xc7\x27\x62\x94\x6c\x0b\x4e\x5e\x9f\x44\xa3\xd2\x1e\x81\xef\x1c\x80\xe6\x2e\x12\xc7\x0d\x46\x20\x6a\x3a\xe4\x4c\xfb\x9c\x42\xa5\x25\x27\xf2\xab\xa2\x8c\x1b\x43\xac\xc8\x90\x4d\x99\x7f\x5c\x9d\xbc\xaf\x03\xf7\xce\x8d\xaa\x9d\xe2\xdd\x46\x88\xce\x68\xbb\xa7\x85\x00\x94\xc4\x50\x2a\x26\x64\x24\x6d\x45\x5d\xe7\xd5\x92\x60\x3a\x8e\x9d\xad\x01\x52\x0a\x4f\x3a\x8b\x77\xdc\x07\x3a\xb2\x58\xab\xde\xd5\x23\x7a\xa1\x0c\x58\xb0\xa5\x7e\xf0\x47\x3b\xdf\x62\x7b\x3b\xe5\xcd\x37\xdb\x3b\x0c\xc8\xae\x21\x9f\xe9\x2e\x7b\xfb\x6d\x7e\x29\xdd\xe7\x74\x87\x1f\x9a\x1e\x7f\x81\x08\x6b\xed\x5f\x82\xf8\x43\xf3\xc4\x98\x12\x20\x12\x54\x64\xbc\xcd\x37\x92\x5c\x98\xf6\xca\x83\xfc\xd0\x66\x5b\x2f\xee\x58\x24\x71\x9d\xdd\x96\xba\xc9\x17\x30\xce\x1b\x80\x3a\xa9\xb5\x5e\xe6\x19\x46\x81\x42\x0b\xb3\x61\xc5\x2c\x54\x6e\xe5\xd2\x69\x82\xbc\xba\xe2\x48\x80\x6c\xf0\xb8\xea\x5f\xb0\xd3\x3c\x86\x3e\xbd\x8b\xaf\x21\xb0\x6e\x99\x97\xba\xd9\xa9\xc3\x1f\x5f\xf7\x10\x76\x02\xe0\x2f\x2a\xc6\xe2\x16\x0b\x0b\x8d\xe4\x25\x06\x4e\x15\x02\x44\x25\x66\x28\x56\xa0\x86\xfd\x93\x44\xcd\x3f\x8f\x66\xea\xf2\xea\xe3\xf9\x68\x38\x80\xbf\x92\x6e\x00\x53\xd8\xab\x91\xf8\xf1\x73\x74\x24\x22\x19\x89\xc4\x4b\x48\xd8\xa7\xce\x07\xf3\xab\xf9\x64\x7a\xfd\xa4\xa0\x84\xe0\xa1\xee\x16\x92\x48\x9e\x24\x99\x86\x37\x8e\x27\xe3\xa3\xd1\xf8\x6c\x3a\x1a\x7f\x4a\x2f\xd2\xf1\xbc\xaf\xae\xc6\xa3\xe1\xe4\x34\x05\xd2\xfc\xd1\x9c\xd5\x3e\x26\xd3\x19\xcb\x3f\x8c\x27\x6a\x9a\xce\x2e\x27\x63\xc7\xbe\x6f\xdf\x90\x4e\xa7\xf6\x3b\x93\xa9\x9a\x5c\x8c\x66\xb3\xd1\x64\x3c\xb3\x83\xf9\xe4\xf8\x39\xb2\xff\xd3\xc9\xf0\xca\xb6\x60\xa6\xbe\x7c\x1e\x0d\x3f\x2b\xfb\xe1\x34\x3d\x4b\xa7\xe9\x78\x88\x0a\x04\x93\xa9\x3a\x1f\x8d\xff\x07\x8a\x1a\xb4\x1e\x4c\x32\x23\xdc\xfc\x2f\xe9\xc7\xd9\x68\x9e\xc2\x6c\x9f\xda\x43\x27\xbf\xc7\x84\xfc\x29\x67\x2d\x47\xa5\x2a\x2b\x02\xb8\x60\xf2\x81\xb7\x1f\xd5\x7a\xb3\x58\xa7\x11\x89\x64\x5e\x9f\x9d\xf9\x62\x4e\x27\x3f\x99\x38\x46\x70\x07\x27\xa3\xe9\xb3\x87\xbb\xac\x31\x15\x02\xfe\x38\x99\x8e\x60\x30\x6f\xd5\x00\x41\x25\x4a\x46\x75\x27\x66\xb1\xf6\x7b\x0d\x0e\xe5\x13\x49\x69\x24\xe8\x88\x92\xac\x4d\x40\x82\xe3\xd2\xd3\x78\x4d\xd0\xd5\xee\x92\xd7\x20\x3c\x56\x96\x94\xf7\x70\xb8\x56\xf8\x72\x48\x70\x53\x77\x10\xd6\x82\xd0\x9a\xa0\xf3\x8e\x65\x70\x49\x48\xaa\xef\x5d\x5e\xa3\xfe\x4f\x75\x5e\xdd\x56\xe1\x45\xe1\x8d\xbe\x2f\x55\xbd\x54\x17\xd6\x37\x66\x0c\x2c\x7f\x62\x7f\x85\x65\xe8\xfe\x59\xd6\xc2\x0c\x4e\xa6\x03\xf9\x2c\xef\x7b\x1f\xa0\x8e\x54\xf0\xdd\x03\xff\x30\xe4\xe7\x6e\x3f\xed\xca\x08\x56\x23\xdf\xcd\x0c\x44\x1e\x58\xa9\x5f\x58\xf2\xc2\x75\x66\x55\x5d\xc3\xb2\xba\xd6\xb9\x29\xf4\xd2\x93\x72\x04\xaf\x7a\x69\xc4\x39\x0a\x54\x15\xa8\xec\x17\xd4\x1a\xb5\xc6\x28\x69\x0d\x50\xd2\x1a\x36\xd1\x41\x71\x23\x74\x0f\xd3\x53\x21\x0a\x75\x78\xe0\x3f\xc0\x3f\x1d\xf4\x9c\x04\x94\xbb\x35\xf1\x82\xc5\xda\x33\x4e\x05\x73\x1e\xc5\xe1\xe8\xb3\x1b\xdb\x41\x32\x4e\x7c\x46\x98\xc7\x3b\x7e\x4f\x42\xb6\x31\xa5\xc6\x17\x4c\xc3\x1c\x6b\xa7\xf1\x58\xc1\xf5\x64\xad\xa0\x5a\xf3\x72\x0d\x06\x5c\xf8\xf8\xc0\x5e\xee\x0a\xe9\xe5\xf2\x72\xcd\x77\x7d\x62\x1a\x04\x47\xfe\x81\xcd\xcd\x6b\xf6\x20\xec\xfc\x61\xbc\x17\x5e\x71\x16\xa5\x9e\xc5\xaa\xff\x57\x99\xbd\xb7\xc3\xf3\xb3\x2e\xb7\xba\xcf\x4a\x86\xf5\x3d\xd2\xa9\xda\xf7\xc0\xa8\x12\x4c\xd5\x05\xbe\xb9\xb2\x05\x38\x56\xab\x95\x1a\x66\x45\xbe\xaa\xea\x32\xcf\x92\xbd\xee\x82\x34\x4f\xbe\x41\xe5\x9b\xcf\x7d\x33\xe6\x9d\x32\xc1\x7e\x81\x03\x34\x67\x63\x7b\x5c\x03\x96\x73\x45\xc2\x86\x4e\xf9\x93\x9b\x64\x9c\xea\x18\xfb\x65\xa2\x2b\xd0\xfc\xe8\xfb\x98\x26\x43\x84\x6d\xa8\x3e\x1c\x43\x59\xed\x4f\x0a\x00\x1f\xd0\x00\x39\x93\x14\x91\x8a\x5b\x29\x2c\x9a\x37\x5e\xe0\x96\x89\xf5\xcb\xa5\x3b\xa4\xa3\xe3\xb2\xfd\xd3\x5a\x40\x1e\x28\x26\xc3\x79\x47\x87\x7e\xe8\x1c\x78\x01\x81\xb8\xcd\xea\x25\x57\x4f\x10\xf0\xa2\x80\x0b\xc2\x2e\x62\x4c\x38\x38\x5d\x15\xf7\xd8\x4c\x94\x34\x06\x25\x17\xb0\x5f\x01\x89\x09\xfb\xc7\xf8\xd2\x97\x65\x6e\x36\x80\xa6\xc2\x57\x62\xf4\x87\x7b\x22\x20\x04\xa6\x2a\xee\x7d\x77\x42\x30\x09\xcc\x07\x25\xc0\xb3\xb2\xc9\xd4\xb0\xc8\xea\x4c\x0d\xab\x2d\x54\xa3\xf8\xfe\xb5\xdb\x61\xb2\x7c\xc9\x8f\x01\xe4\x91\x03\x00\xfd\x35\x5e\xde\x6e\xe7\x3f\xd8\x7b\xdc\x57\xab\xc3\xce\x65\xee\x96\x06\x09\x40\x36\x5b\xd4\xa4\xf0\x54\x17\xab\xaa\xde\xae\xc5\x01\x16\xf8\xf4\x37\x3b\xb7\xae\xf9\xff\x0a\x30\x54\x57\x72\x3e\xf2\x84\x85\xd9\x0c\x6a\x3b\x15\x24\xdd\x55\xde\x04\x41\x61\xd1\x7d\x87\xf9\x31\xa8\x19\x41\x12\xbc\x6e\x21\xf9\x47\xf3\x92\xa0\x86\xbd\x64\x00\x3b\x6b\x51\x82\x91\xe1\xb9\xfa\xde\xf4\xd5\x3c\xfb\x05\x11\x59\xd1\x94\x57\x6a\x93\x21\x88\xb8\xb1\xdf\x50\x59\x8d\x44\x57\x78\x30\x84\x31\x6c\xbe\x86\x42\x0d\xd2\xb6\x17\xe4\xea\xdd\x10\x82\x6c\xad\x09\xa7\x9b\xee\x5b\x5c\xea\x06\x45\xfe\xb4\x88\x0c\xce\xac\x99\x43\x70\x9c\x47\xa0\x2f\x41\xb8\x01\x41\xdb\x7a\xbf\xa4\x31\xeb\xb3\xaf\x29\x82\x18\x5f\x0c\xc1\x03\x71\x8e\xf1\xcb\xc0\xbe\x89\x35\x32\x22\x04\x88\xb8\x55\xe1\x79\x87\x67\x47\x00\xe8\x6c\x3c\xd0\xd5\xe3\x7e\x6e\x74\xf3\xa0\x09\xd7\x4d\x9a\xe7\xff\x48\x79\xb1\xff\x2a\xff\xfa\xaf\xd2\xba\xb8\x3c\x3f\x3a\xee\x1f\xff\x6e\x0c\xd0\x4f\xf0\x3f\xbf\x79\xfb\xae\xa5\xff\x71\x72\xfc\x67\xfe\xef\x0f\xf9\x97\x4e\xcf\x07\xe3\x4f\xe4\x4b\x3a\x1c\xc0\xcf\x9e\x6d\xb6\x4d\xff\xdc\x97\xfc\xcf\x5f\xbf\x4a\xf2\xe3\x97\x92\x01\xba\x83\xed\x99\x7c\xc3\x47\xf8\x9e\x43\x8a\x90\x80\xe3\x39\x78\x15\x37\xd1\xbd\xb2\xe9\x66\x79\x9e\x70\x04\x64\x08\x06\x2c\xde\x20\x21\x0d\x49\x27\xcf\xb3\x77\x07\xc2\x2f\x03\x83\xc5\xcd\xee\x31\x0a\xe8\x80\xf3\xd9\x36\x1a\xa3\xfd\xb6\x01\x41\x6b\x83\xa6\xa9\x56\xb3\x28\x43\xf2\x54\x9f\xda\x44\xcb\xbf\x82\x4f\xf9\xad\x6d\x68\xea\x95\xa3\x02\xae\x85\x0b\x6d\x7d\x86\xdc\xac\x5d\xeb\x33\xb5\xe6\xbf\x79\x1d\x55\xb8\x48\x37\x42\x56\x2c\x0e\x78\xd3\xbd\xb1\x5e\x6f\x4b\x46\x3f\xc3\xcd\xe1\x5f\x2b\x19\x45\xad\xbf\x1d\x10\x3e\x7f\xfd\xea\x29\x28\x5c\x4b\xe4\xe0\x72\xb5\x03\x52\x68\x76\x72\x13\x07\x5c\xc7\x5f\xbf\x8e\x88\x70\xf7\x94\x22\xf2\x75\x30\x3f\x21\x5d\x26\xad\x66\x08\x77\x20\xe8\x8b\xd2\x6d\xad\x87\x74\x11\x5c\x84\x7c\x56\xb0\xdc\x1c\xc8\x29\xe0\x4a\xfe\xfa\x55\x50\x1a\x88\x01\x07\x60\x3c\xda\xc0\x2d\xba\x64\x5e\x3f\xf1\xfc\xa2\x03\xb0\xa0\xf7\x3f\x8f\xc9\x26\xe0\x48\xfe\xfa\x95\xfe\x2a\xc6\x65\x1f\x4b\xf2\xd7\xaf\xc1\x22\xf4\x4d\x2f\x77\x92\x0e\x18\x81\x4d\x82\x10\x58\x45\xf4\x07\xb5\x32\x4d\xbd\x5d\xb0\xb8\x96\x60\x7f\x6d\xed\x17\x34\x9b\xf4\x7d\x5e\x6d\x4d\x74\x6e\xa8\x2f\x77\xba\x8c\x56\x87\x01\x50\x13\xd8\x68\x00\x7a\x32\xba\xa6\xdc\x14\xe5\xfb\xb2\x38\xdf\x25\x08\x6e\x06\x98\x81\x7a\xb2\x27\x92\xc6\x18\xb3\xb3\x8c\x05\xb0\x3b\xb0\xd5\x85\x3d\xcd\xf7\xef\xfd\x88\xef\x75\x5c\xc7\x6d\x5e\x63\x6f\x3d\x77\x0c\xd1\xe3\xcf\x47\x5e\xe8\xaf\x5f\x83\x9f\xb9\x99\x93\xeb\x17\x50\x59\x71\x22\x0b\xa3\x72\x9c\x78\x8b\xa2\xed\xcf\x5f\xff\x76\x36\xa2\x63\xda\x9e\x69\xf0\xe0\x24\xe6\xc9\xce\x1b\x37\x8d\x5d\x85\x3f\x94\xa3\xcc\x8a\x5a\x67\xcb\x5d\xb8\x00\xf6\x41\x55\x43\x22\xe8\xaf\x5f\x45\xbb\x83\xf3\x20\x60\xe2\x6d\xf1\x60\xc0\x2b\xf6\x51\xf4\x22\x9e\x3f\x60\xc3\x2a\x0a\xfb\x95\x2d\x08\xd7\xf8\x19\x4d\xd4\xa6\xd8\xd2\xa6\x31\xa6\x5a\xe4\xe4\x5e\x36\xba\x5e\x65\x00\xa9\xe4\x6b\x98\x17\x2d\x96\x86\x1b\x09\x1a\x07\xfe\x5c\x3b\x5d\x79\xe1\xc3\x6e\x50\x87\x5b\x14\xee\x22\xc9\x24\xa7\x53\x42\x84\xc0\x39\x56\x7e\x91\x22\x0f\xcc\xaf\xf3\xab\x39\x99\x69\x9d\x27\xc8\xf8\x11\x0e\xfd\xf1\x1d\x8a\xe7\xf0\x83\x2e\x0a\x04\x29\x24\x82\xfe\x29\x3c\xbf\x22\x55\x06\x90\x52\x40\x3e\x1e\xf4\xe8\xe4\x72\x22\x14\x03\xd1\x38\xad\xa9\x3e\x10\xde\x58\x2f\xee\xf2\xfb\xac\x50\xc8\xee\x2a\x88\x7c\xc2\x50\xcc\x52\xf3\xef\x38\x44\xab\x8f\xf0\xb7\x40\xc1\x1b\x54\xde\x2d\x21\x3f\xeb\x9a\xbd\xaa\xb0\x36\x0c\xb2\xe9\x21\x8b\xf5\xd7\xaf\xd7\xd5\x56\x1c\x7d\xbf\x8a\x72\x99\x6a\x6e\xa1\x38\x9e\x49\xc5\x25\x37\x03\x9f\xdb\xc9\x33\xb8\x99\xb9\x41\x5d\xec\xcc\x7c\x9b\xfc\xde\xf4\xcc\x5f\xbf\xd2\x8f\xdc\xc0\xfc\x7d\x11\x34\x77\xd2\x32\x13\x81\xcb\x6f\x45\xcf\x2c\x17\x6f\x8b\xb6\x90\x02\xf9\x6d\x43\x02\x38\x67\xf7\x7d\xf8\x1b\x50\x35\x47\xc8\x26\x1f\xc9\xed\xa6\x6b\xc6\x88\x60\xc4\xfa\xd6\x45\xbe\xbc\x97\x6c\x59\x70\x91\x45\xc8\xae\xf6\xf1\x71\xd8\x61\xd1\xf4\x88\x5a\xb5\x76\xc1\xa1\xdf\x80\x65\x19\xcb\xd0\xed\xc5\x01\xb5\x3e\xf6\x4d\x58\x94\x63\x27\x75\xe9\x5c\x16\xde\x16\xed\xa9\x48\x3c\x0d\xb3\xe0\x5a\xde\x52\x27\x8d\x3d\xfb\x0e\xbf\x7e\xbd\x6a\xf2\x22\xff\x0f\xfd\xf2\x65\xef\xb9\x9d\x45\x3a\x7f\x0a\x3c\x86\xd5\x4b\x21\x81\x0f\x97\xfd\x1b\xcf\x88\xb0\x0b\x0b\x9c\x34\xb2\x24\x10\x5b\x0c\x35\xe5\xd9\x83\xce\xb4\x43\x14\x57\x44\x61\xef\x3a\x68\x4b\x17\xa9\x2b\xbf\x86\x61\x62\x2d\xff\x46\xf8\x36\x26\x20\x92\x96\x8e\x1e\x6d\x82\xdf\x83\xaa\xfc\xef\x6c\xfd\x87\xe3\x83\x2e\x73\x37\xff\x51\xf7\x34\x3d\x87\x95\xbc\x6a\xcf\x04\xc0\x62\x62\x5f\xe2\x77\xdf\x45\x81\xaf\x1d\xad\xc9\x2e\x46\x89\xbf\xdd\x0e\xf9\x8e\xd6\xfc\x61\x1b\x25\xe6\x43\x9c\x78\x0e\xb2\xbe\xa4\x76\x8d\xd8\xd1\x9c\xad\x30\x6f\x2d\xb7\x2e\xda\xd5\x30\xa1\xf3\x38\x01\xea\x63\x22\x28\x82\x87\xe3\xa4\x6d\xcc\x09\xa4\x69\xb0\x0a\xdb\xd2\xb3\x58\xc7\xf9\x24\xe9\x65\x44\x12\x4a\xc4\x5e\x9d\x44\xac\xb8\x29\x90\x8f\x4c\xd6\xfb\xc8\xf6\x85\xec\xa8\x21\x75\x2b\x72\xed\x5b\xcb\x65\x0d\x34\x10\x90\x63\xc0\x56\x61\x30\xa2\xab\xa3\xb8\x34\x0b\xd0\xc6\x14\x54\xaf\x86\x8d\x54\x2e\xe1\xde\x57\xe7\x56\xed\xa5\xd6\xb4\x0b\x11\x86\xa7\x83\x5a\xce\x0d\x44\x19\x90\x9c\x31\x22\xd3\x09\xbf\x40\x23\x5a\x04\xf4\x7b\x28\x59\xdf\x05\x84\xb3\x03\xb4\x91\x1d\x1e\x43\x46\x5e\xc0\x8d\x0d\xfc\xeb\xce\x15\xc7\xc0\xd0\xc7\x99\x62\x57\xcf\x20\x3f\x15\xc7\x21\x84\x18\xb2\x35\x03\xa6\x32\x13\x7a\x3f\x7e\xa0\x6b\x75\x6f\x3f\x2f\x7d\x2c\xeb\xc9\xa0\x18\xed\xf5\xaa\xc4\x0c\xdd\x5d\xb5\xa6\x0a\x46\x1c\xea\x8e\xb7\xb8\x5e\x21\x9d\x59\xbe\x8a\x3b\x6b\xdb\xf0\xe4\x7b\x89\x12\x99\x72\x38\xa1\x77\x92\x35\xca\x7a\xc8\x8d\x6a\x1e\x74\x71\xaf\xd5\xe1\xf1\x49\x4f\xad\xab\xb2\xb9\x63\x32\xa2\x86\x55\x12\xf2\x86\x65\xa7\x0a\xbb\xdb\x16\x00\x63\xf0\xba\x19\xf2\x61\x26\xff\x45\x1d\xbe\x8f\x1e\xb4\x9f\xf3\x3c\x8c\x8f\x06\x33\xef\x80\x74\x51\xc7\x9b\x0a\x4f\x6b\xbf\xb2\x71\xb7\x75\xe5\xb9\x75\x69\xb6\xb5\x2b\xa7\x88\xf7\x2c\xb7\x04\x87\xc7\x88\x77\x30\xfd\x83\xfd\xc5\xd3\x93\x9b\x1b\x47\x05\xc0\x41\x62\x61\x27\x84\xfc\xb4\x82\xa5\xad\x15\xc7\xf6\xe7\x11\x7a\x35\x48\x64\x24\x0e\x3b\x47\x7c\xbd\x0b\xf7\x03\x0b\xfc\x83\xab\x0b\x11\x20\xde\xb1\xbc\x57\x19\x11\x79\xcd\xab\xce\x17\x7b\xc0\xd0\x04\xaf\xe1\xa0\xf6\x92\x32\xf0\x44\xe4\x51\xde\x86\xcc\xd9\x7c\x64\x6e\xea\x6a\x9d\x97\x90\x31\x6c\xb2\x06\x9d\x2e\x37\xde\x31\x38\x1c\xc0\x4b\x7a\x99\xec\x21\x7f\x4a\x30\x48\x16\xda\x9b\xce\x3f\xa7\xcb\xa5\xed\xe6\x60\xec\x82\xef\x96\xb8\x56\xb7\x33\xf8\xca\xee\xa5\x58\x10\x9e\x70\x8d\x82\xc4\xa2\x22\x72\xdf\x51\x00\x24\x13\x7a\x19\xa1\xfe\x73\x79\x70\x05\x34\x84\x08\xb6\x24\xbd\x4a\xef\x0d\xc6\x41\xa2\x80\x25\x76\x24\x0d\xcd\x4b\x36\x34\x2f\x80\x1c\x21\x92\x2d\x9c\xc3\xba\xbb\x04\xfb\x14\x25\x20\x1c\x59\x18\x78\x1d\x0e\x26\xc5\xbc\x5c\x68\xca\x3a\x18\xc7\x63\x1a\x3c\xb6\x57\xb2\x9a\x94\xf8\x55\x90\xa5\x08\xec\x0f\xf2\x0d\xf2\xc6\xa8\x2d\x58\x2b\x92\x0c\x2b\xa8\x74\xa6\x0a\xee\x70\x21\x79\x5e\x45\x07\x94\x0b\x83\x4c\x92\x1f\x3b\x6f\xac\x8d\xf8\xf5\xeb\x79\xfa\x69\x70\xfe\xf2\x25\x8d\x37\x8f\x35\xa5\x7a\x00\x22\xcb\xcb\x19\xbb\x4a\x91\x37\xff\x71\x5e\x4a\xbd\x01\x64\x49\xe4\xd1\x11\x45\xac\x39\x05\xa7\xf0\xf4\xe6\x1d\xb7\x68\x1c\x28\x87\xaa\x79\xe1\x6c\xf2\xc3\xec\xd9\xf3\x00\xad\x0c\x2c\x5c\xc1\x9e\xf0\x87\xce\x7e\x4e\xf3\x13\xbc\xa0\x99\xb4\xa3\x5a\x6f\xec\xc6\x71\x58\x0b\xad\x60\x10\x7c\x61\xae\xaf\xa9\x70\x2f\x16\xe7\xa7\xb7\xba\xc1\xf3\x44\x86\x33\xfb\x1d\x12\x23\x69\xf4\xc6\xf8\xba\x5f\x64\x12\x84\x68\xa4\x88\x8c\xad\xb3\xbc\xb0\x7f\x2b\x72\x83\xc2\x33\xa5\x7e\x30\xb7\x75\xb5\xdd\x98\x9e\xb4\x9e\x17\x59\x61\x57\x0b\xd5\xa1\x10\x17\x3b\x02\x21\x1e\xee\xaa\x6e\x16\x83\xa1\x53\x7d\x29\xf5\x83\x18\x4a\x77\x21\xe0\x48\xfb\xb2\x3b\x72\x31\xa4\x09\x3e\xb8\x1c\xb9\x95\x5f\xb7\x0e\x21\x7b\x77\x0b\x9b\x97\xd0\xe0\x6b\x24\x4a\xe1\x28\x2a\x1b\x88\xd5\x43\x29\x1c\x13\xe7\xc2\xe0\x7a\xc3\x4b\xa7\xdb\x59\xc8\xd7\x9b\x42\x9c\x86\x83\xcb\x91\x58\xf5\x40\x15\xee\xab\xaf\x23\xa4\x27\x05\xc7\xfd\xb4\x06\x6c\xc6\x53\x0e\x90\x13\x7d\xb4\x38\x95\xb9\x4e\x21\xae\xe8\xf6\x71\x74\x4e\xfb\xa1\x24\x66\xcb\x90\x4d\x7c\x45\x85\x0b\x97\xe3\x61\x18\x9e\x70\x9c\x98\x0b\x7e\x8a\xa5\x44\xc1\x99\xd7\x61\x7f\x4a\x5e\x9e\xe0\xcc\x73\x04\x05\xe4\xd4\x4a\x92\x64\x39\x85\xc0\xf8\x2d\x4b\xc5\x01\x03\x0a\x27\x3e\xe4\x6c\x22\xed\xab\xa7\xc8\x06\x06\x7d\xd5\x5d\x5e\x4f\x15\xf5\xb0\x13\xf6\x94\xd4\x07\xf6\x26\x5c\xbc\x5b\xc7\xcb\xe3\x52\x54\x54\x73\xdf\x3a\xf1\x5a\x0f\xee\xaa\xba\x6f\xd7\xd8\xc3\x8b\x7c\xa1\x3d\x80\x98\x9e\x5f\x63\xff\xf7\xc5\x72\x8d\xf3\xfe\x9b\x30\x5c\x77\xdf\xf4\x94\x01\xfc\x7e\xea\xeb\xf2\x79\xd4\xd7\xbf\x07\xf3\xf5\x7e\x1b\xe7\x7b\x39\xb1\xf7\x8e\xc9\xef\x47\x96\xed\x0e\xaa\xf7\x8f\x6a\x8b\x30\x79\x4c\xbf\x8b\x3a\x27\x4e\xd8\x8b\xdf\x61\x56\xad\x44\x9e\xe0\xa6\x43\x5e\x41\x28\x81\x1c\xbd\xe9\xbf\x13\x84\x6d\x6b\xcd\x38\xbc\xc8\xe0\x4d\xd8\xc5\x42\x4e\x55\x36\x47\x68\x67\x5a\xa3\xf6\x49\x17\xa2\x2b\xcf\x97\x9b\xc7\xd5\x9a\xf7\x85\x46\xb2\x80\xcb\xb9\x5a\x81\x32\x09\x26\x3b\xf9\x78\x85\x4e\xad\xb6\xc5\x2a\x87\x48\x19\x18\x96\x62\xeb\x05\xc3\x40\xc1\x14\xea\x0d\xbb\xce\x8b\xaa\x34\x9b\x7c\xb1\xad\xb6\xa6\xd8\x79\x1e\xeb\xe7\x19\xbe\xc9\x1e\xb3\x17\xae\xc9\x02\x8a\x58\x81\xa3\xae\xcb\x08\x7e\xe2\x42\x68\x19\xc2\xfb\xa8\x95\xba\xcc\xf1\x28\x36\xc4\x82\x5b\x1c\x4d\x8d\x05\x3c\x3c\xe4\x9d\xbd\x27\x9c\x1b\x8f\x12\x6e\x51\xf4\x74\xaa\x7e\xa0\xf8\x4d\x9b\x1e\x78\x5f\xcc\xc1\xa9\xc3\x37\x8f\x4b\xa8\x70\xbf\xbe\x57\x45\xe5\xa5\x79\x44\x45\x85\x1f\xea\xc0\x08\xf4\xd5\x76\x59\xa2\x8b\x03\xb6\xc5\x7f\xf6\x34\x94\x07\xdc\x0f\x20\xf7\xee\x3b\xd4\x06\x70\xcc\xc8\x9c\xcf\x51\xa6\x32\x9e\x06\x85\x1a\xf8\x5d\xc7\x2b\xd0\xa3\x3d\x72\xf2\x75\xde\x06\x7f\xd7\x67\xb1\xbb\x87\xf6\x1e\xb5\x3f\xf4\x65\xf4\x5d\x9c\xa9\x8e\x4e\x4b\x4a\xa0\x40\xe2\x73\x7d\x83\x60\x93\x60\xc3\x88\xe0\xff\xf7\x01\x82\xba\x12\x15\xf2\x95\x08\xa5\xc9\xcb\xdb\xc2\x55\x63\x42\x75\x19\x99\x26\x8b\xcc\x10\x2d\x92\x5f\x23\x50\x5c\xdb\x75\xc0\xb7\xd6\x81\x3f\x07\x63\xa2\x67\xe7\x49\xff\x0a\x3d\x85\xfe\xdf\x4a\x4d\x01\x66\x22\x54\x52\xf8\x47\x16\x4e\x90\x57\x4b\xe4\xaa\xee\xf1\x76\xdf\x62\x05\x58\xfc\xfb\xc7\x25\x16\x82\x28\xf2\x3f\x96\x94\x42\x94\x7e\x69\xa1\x8e\x02\x2e\x4d\xf0\x5b\x89\xac\x25\x08\x09\x76\x1f\x2f\xd6\x67\x66\xca\xb4\x7d\x2e\xa1\xb3\xfc\xf9\x52\x6f\x6d\x9f\xf7\x7d\x35\x9c\x8c\xc7\x54\xf5\x3b\x9f\xa8\x8b\xc9\xff\x1c\x9d\x9f\x0f\x22\x44\xb0\x6b\x6c\x5a\x17\x59\x79\x2b\xf1\x56\x59\xcc\x29\xf3\x14\xc9\x9a\x07\x17\xbf\xee\xab\x91\x40\xb3\xed\xbf\x1e\x9e\xf7\x30\x22\x76\x3e\x1d\xcd\x86\xe7\x83\xd1\x45\x3a\x55\x93\x33\x57\x86\x8c\x05\xf8\x93\x9f\xd3\x69\x7a\xaa\xa0\x48\x56\x16\x2f\x5f\x8d\x4f\xd3\x29\x96\xd5\x32\x06\x1a\xca\x75\xd5\xd7\xaf\x50\xd6\xfc\xf2\xa5\xfa\x38\x98\x8d\x66\xc9\xa3\xe5\xcd\x49\x54\xdf\x9c\x9e\xaa\xc9\xd4\xd7\x38\x8b\xaa\x66\x7e\x0a\x54\x35\x43\x09\x6f\x22\x2b\x9a\xe7\x9f\x07\x73\x28\xe8\x8d\x1b\x7c\x36\x4d\x53\xfb\xc6\xd3\xf4\x2c\x1d\xce\x67\x89\x28\x7c\x3e\x4f\xa1\xea\x79\x6f\xc5\x73\x54\xf0\x3c\x1a\x7f\xea\xc3\x2b\xd2\xf1\x7c\x34\x4d\xd5\x74\x34\xfb\x1f\x6a\x30\xc3\xea\xe2\x54\xfd\xdb\xd5\x00\xaa\x9b\x07\xe3\x53\x75\x99\x4e\xcf\x26\xd3\x8b\xc1\x78\x08\xef\xee\x6a\x97\xed\x8f\xba\x9e\x5c\xf5\xd5\xec\xf3\xe4\xea\xfc\x14\x86\x24\xf8\x92\x1d\xea\x94\xda\x3d\xfa\x39\x55\xa3\x31\x7c\x67\x9a\xce\x2e\xd3\xe1\x3c\xb1\x3f\x56\x87\xe3\x09\x76\x7b\x34\x1e\xcd\x47\x83\x73\x75\x9a\xfe\x9c\x9e\x4f\x2e\xed\x4c\x4e\xe1\xeb\x58\x2d\x3d\x9c\x8c\xe7\xd3\xd1\xc7\xab\xf9\x64\xda\xe3\xc2\x6c\x6c\xd5\x6c\xce\xf3\x31\x4e\x87\xe9\x6c\x36\x98\x5e\xab\x59\x3a\xfd\x79\x34\x84\x61\x9f\xa6\x97\x83\x11\x3c\x6c\x38\x99\x4e\x71\xd1\xf7\x71\xda\xbb\x57\x8d\x7d\xd5\x6c\x3e\x9a\x5f\xcd\xd3\x99\x5d\x0e\x76\x52\xc7\xd0\x34\x3b\xc0\x38\x1a\x7e\xcd\xf4\xd5\x78\xa2\xae\x66\x29\xb7\x21\x1e\xa5\xc1\xd5\xfc\xf3\x64\x3a\xfa\x9f\xe9\xa9\xfa\x9c\x4e\x53\x5c\x74\x54\x87\x2f\x56\xa0\x6f\x0a\x93\x21\xcf\xd3\xe9\xc5\x68\x0c\xeb\xa4\xe3\xdc\xa0\x93\x3b\x52\x4f\x70\xb9\xc0\x5f\xad\xc9\x82\xfb\x91\xeb\x37\xcb\xa5\xff\x92\xbd\xc0\xe1\x3c\xbd\xa9\x21\xe2\x44\x14\x04\x2c\x78\x51\xad\x50\x15\x03\x5c\x9e\x87\xcc\xe3\xa8\xf0\xeb\x58\x39\xea\xb1\x10\xa6\xcb\x3b\x10\x51\x38\x8c\x55\x0b\xe9\x83\x50\xb6\x80\x2d\xcb\x00\x25\x2f\x8d\xdc\x4b\x5f\x0a\x45\xa0\x52\x34\x78\xf2\x5a\x95\x19\x46\x71\x64\x2e\xcd\xd5\x43\xa9\x1b\xbd\xab\x68\x70\x1f\x79\x41\xd8\x1c\xe6\x4d\x0e\xd7\xd3\xf9\x88\x98\x09\x98\xcc\x5a\x06\xd1\x63\xe7\xc6\x93\x01\x7b\x08\xdc\x73\x0c\x5e\xba\x91\xa2\x62\x7d\x2e\xde\x3c\x2c\x29\x21\x4a\x70\xbb\x52\x64\x67\x7a\x8e\x3f\xf8\x62\x34\x1b\xa6\xe7\xe7\x83\x71\x3a\xb9\x9a\xfd\x71\x74\xcf\x7f\x03\x7a\xe7\x79\x7b\x0a\x03\x9a\xe6\x9b\x1d\xe5\x9e\x5a\x1c\x33\x02\xb1\x0e\x97\x1e\x17\xa1\xce\x1e\xf4\x52\x97\x98\xe9\xa6\x52\x4c\x22\xfd\xb7\xb3\x6b\x30\x93\x82\x79\x0b\x2a\x40\xac\xb6\x64\x58\xec\x65\x34\x4f\x38\xdb\x8f\x5b\x27\x09\x17\x62\xcd\xe5\x80\x58\x68\x03\xa3\x9b\xf8\xce\x44\x5c\x35\x1e\xff\x14\x94\x98\x52\xcb\x73\x73\x47\xf5\xa8\x89\xef\xe6\xac\xa9\x16\xdf\xee\xaa\x62\xad\x86\xf6\x15\x43\xfb\x39\x17\x3e\xa0\xbe\x0e\xe0\x8a\xcb\x85\xee\xbf\x48\xff\xf2\x79\xf4\x71\x34\x57\x83\xfe\x8b\xaf\x5f\xe7\x11\x16\xde\xb3\xa8\x64\x75\xab\x61\x64\x54\xec\xbf\xdb\x8f\x13\x75\x68\xbf\x78\x40\x9f\x1d\xf4\x3e\x38\x9e\x60\xbb\x4f\x70\x97\xf0\x1b\xa8\x30\x73\x8f\xe3\x1e\x48\xf0\x1a\x14\xd3\x08\xb5\x81\x42\xea\xd7\xce\xc6\x81\x4b\x7a\x2b\xe8\x5f\x8d\x54\xf7\x2c\xab\x26\x01\x54\x37\xc2\x94\x6b\xdd\xd4\xb9\xb6\x4f\xbe\xcf\x33\x78\x26\xe0\xd4\x00\x59\xac\x1e\xf4\x8d\xa0\x88\x7d\x78\x78\xe8\x6b\x78\x21\xb0\xc4\xf6\x5f\x78\x01\x36\x01\x83\xf1\x11\x27\x61\x87\x85\x38\x19\x10\x5b\x21\x46\x16\xc2\x7f\x3d\x6e\xb9\x84\x62\x2b\x04\x69\x29\x72\xbd\xec\xab\x19\x71\x33\xc6\xca\xa6\x8e\x47\xcd\x71\x9f\x7b\x66\x48\x41\x00\x27\xbd\x8c\x56\xcb\xfb\x2f\xba\xd1\xad\x9d\x05\x0d\x60\x7f\xe6\x0b\x63\xaa\x52\x5d\x35\xf7\x7a\xf1\xad\xc8\xcb\x5b\xa3\x06\x1f\xfb\xea\x92\xd1\x58\x02\x37\xe7\xbe\x6c\x07\xd0\x33\x40\x1e\xff\xf8\xe3\x8f\xc9\xfe\x27\xd9\xcb\x89\xc8\xc7\xa6\xcc\x02\xf9\xf2\xe5\xff\xa6\xb5\xab\xfd\x57\x7f\x39\xab\xb5\xfe\xe7\xf7\xbf\x63\x05\xe8\xe3\xf5\x9f\xaf\xdf\xbe\x3b\xfe\x21\xae\xff\x7c\x7b\xf2\xe6\xcf\xfa\xcf\x3f\xe2\x1f\xcd\xbe\xdb\xdb\x87\xf7\xfe\xd0\xed\xbd\xf0\x7b\xe6\x70\xd8\xb3\xfb\xe6\xed\xd1\xc9\xeb\xd7\xef\x21\xea\xcc\xbf\xbc\xac\xab\xbf\x02\x64\x1f\xc8\x41\x3a\x29\x54\x2f\xed\x9d\x65\xfc\x45\xef\x81\xbb\x7a\x99\x38\xd9\x25\xcc\x4e\x25\x8e\xfb\x01\xd9\x43\x31\x23\x8c\xc1\xf3\x00\xc1\xe7\x6a\x34\x80\x22\xc1\x17\xcb\x44\xc9\x4c\xe0\xc7\xc4\xcb\x83\xcf\xd2\x83\x1e\xbc\x64\xa9\x31\x92\x8d\x31\x06\xa1\xb1\x8c\x3c\x14\x8e\xd7\xed\x09\x6c\xa3\x30\xbd\x19\x0b\x6c\xdb\xe9\x61\xc0\x6b\x0d\xdd\x22\x2a\xfe\x44\x1c\xd4\x12\x10\x9c\x30\x21\x19\xe0\xc5\x25\x6f\xa2\x16\x8c\x77\xe4\xce\x23\x07\x23\x0d\x91\x71\xc0\xb3\xa0\x27\x39\xf0\x73\x96\xc8\xfe\x6f\xbb\x5b\x29\x53\xb5\xb8\x4c\x1d\xdd\x91\xbd\xad\x89\xac\xed\x27\xaa\xf9\x9d\xea\x56\x3c\x46\x82\x36\xc8\x66\xc6\xe8\xfa\x9d\x46\xdd\xa1\x96\x3a\x31\x55\xa9\x70\x69\x91\x7f\x8b\xaf\xb0\xf5\x6d\x88\x54\x9a\x4e\xda\x6d\xc8\x4b\x75\x83\x41\x18\x48\x17\x51\x1b\x08\x7a\xfd\x6b\x9a\xf1\x68\x2b\x78\x79\x84\x6b\x8a\x26\x0a\xa3\xa9\x9e\xed\xc5\xa5\x0f\x9c\xa9\x21\x9b\x9e\xb0\x35\xe9\xc0\x88\xa8\x25\x03\x7e\x95\xed\x4a\x66\x5c\x7c\x96\x9a\x9e\xa8\x08\x2c\xee\x5b\xe5\xf0\x04\x8c\x06\x46\xb1\xb1\xe5\x11\xa4\x8c\x63\xc4\x92\x0c\xb3\x61\xdc\x35\x6c\x59\x0e\xe6\x78\x12\xa6\xb0\xc3\x31\xf1\x34\x4c\xf6\xc1\x3f\xa9\x03\xe4\x28\xc4\x80\xaf\x2f\x2f\xea\x20\xb9\xbc\xd9\xed\x3d\x2e\xd4\xa1\x30\x7b\x7e\x59\xc1\x17\xc0\xee\xc1\x92\x03\x52\xc0\x71\xb2\x76\x07\xc9\xb3\xc6\x0f\x00\x7a\x47\x08\x09\x0a\x9b\x0d\x24\xaf\x8d\xae\xad\x1b\x5c\xec\x68\x49\x84\x5f\x41\xe0\xc1\x66\xa3\xb3\xba\x55\xc7\x9c\x37\x46\x17\xab\xb0\x11\xf8\x6a\x6b\xe5\x70\x82\xdf\xb5\x03\x03\xfb\x8f\x34\x86\xc2\xd7\x5e\x50\xc5\x0b\x70\x73\xa2\xc6\x2f\x5e\x8f\x7b\xdb\x3b\x9a\x6d\x11\x19\xeb\xbc\x2c\xef\x75\xdd\x90\xbb\x21\x6a\xa1\xe0\x18\xa9\xab\x75\x45\x31\x7d\x93\x11\x23\xa6\xe7\x8b\xb4\x07\x24\x58\x45\x4e\x62\x28\x3e\x25\x43\x42\x16\xa6\x77\xce\x7c\x49\xec\xfe\x8b\x02\x22\x1d\x9d\x44\x82\x3e\xe4\x36\x18\x63\x20\xa9\x2b\x9c\x26\xc2\x65\x4f\xf2\x05\x42\x48\xa9\xf5\xb3\x0e\xde\x40\x78\xe3\x53\xd4\x81\x40\xce\xe7\xdc\xfb\xd3\xbe\x1a\x8d\xd5\x78\xa2\xd2\x9f\xd3\xf1\x5c\xcd\x3e\x0f\xce\xcf\xe1\x85\x7f\x39\x9b\xa6\xa9\xed\xf6\x74\xf2\xaf\x10\xe1\x1a\x8d\x87\xd0\xfe\xf9\x4c\x06\xb0\x66\xea\x63\x0a\xe1\x81\xf3\x14\xdf\x38\xbe\x56\xa7\xa3\x29\xfd\xc2\xff\xaf\xe1\xe8\x34\x1d\xcf\x07\xe7\x89\x9a\x5d\xa6\xc3\x91\xfd\x1f\xe9\x5f\xd2\x8b\xcb\xf3\xc1\xf4\x3a\xc1\x88\xd6\x78\x96\xfe\xdb\x15\x85\xa7\x4e\x07\x17\x83\x4f\xe9\x4c\x1d\x3e\x31\x34\x97\xd3\xc9\xf0\x6a\x0a\xec\x87\x76\x3c\x66\x57\x1f\x29\xdc\xa5\x3e\x4d\x26\xa7\x40\x69\x88\xf1\xb3\x74\xf6\x41\x9d\x4f\x66\x30\x6a\x57\xb3\x34\x51\xa7\x83\xf9\x00\x5e\x7c\x39\x9d\x9c\x8d\xe6\xb3\x0f\xf6\x7f\x7f\xbc\x9a\x8d\x60\xf0\x46\xe3\x79\x3a\x9d\x5e\x5d\xce\x47\x93\x71\x4f\x7d\x9e\x7c\x49\x7f\x4e\xa7\x6a\x38\xb8\xb2\xb3\x68\x47\x79\x82\xf1\xbf\xf9\xe7\x74\x32\xbd\x0e\x42\x24\x89\xfa\xf2\x39\x85\x38\xdf\x68\x8c\x23\x35\xb0\x43\x30\x9b\x4f\x47\xc3\xb9\xfc\xda\x64\xaa\xe6\x93\xe9\x5c\xf4\x51\x8d\xd3\x4f\xe7\xa3\x4f\x29\x44\x2a\x89\x5b\xf1\xcb\x68\x96\xf6\xd4\x60\x3a\x9a\xd9\x2f\x50\xd8\xf1\xcb\xe0\x5a\x59\x5f\x88\xc2\x99\x14\xb3\x0b\xd6\x64\x02\x33\xaa\x46\x67\x6a\x70\xfa\xf3\x08\x16\x1f\x7e\xf9\x72\x32\x73\xe4\x8f\x30\x64\xc3\xcf\x34\xdc\xff\x80\x04\x37\xfd\x57\x9f\xce\x4e\x81\xfe\xe5\xa8\x2a\x8b\xdd\xef\xe2\x01\x3c\x6e\xff\xbf\x7d\x73\xd2\xb6\xff\x7f\x38\xf9\xe1\x4f\xfb\xff\x8f\xf8\xf7\x69\x7c\xa5\xec\xf9\xac\x4e\x03\x9b\x81\x65\xc3\x82\x10\xcc\x45\x56\x2f\xee\xd4\xc9\xeb\xd7\xaf\x23\xc7\xc0\xfe\x09\x9f\xe2\x6e\x08\x2f\x24\x46\x8c\x90\xef\x8e\xd5\x59\x9d\x95\xd6\xcf\x56\xb3\x26\x51\x67\xf9\xaa\xb9\x53\x67\x45\x55\xd5\x89\xfa\x58\x99\xc6\x7e\xf3\x62\xa0\x5e\x9f\x1c\x1f\xbf\x3e\x3a\x7e\xf3\xfa\x58\x5d\xcd\x06\x2f\xd2\x7b\x5d\x43\x71\x85\x94\x48\xc0\x40\xf5\x66\x17\xe7\xa6\x99\x4d\x3c\xa6\x1d\x77\xf2\x4c\xd4\x47\x2c\x1b\x03\xdc\x3b\x91\x95\x39\xde\x80\xa2\x7a\x20\xf4\xe9\xeb\xbe\xba\x9c\xa6\x83\x8b\x8f\xe7\x94\xfd\xd2\x5e\xec\xb5\x2d\x4e\xc7\x51\xc6\x4c\xad\xb3\x72\x9b\x15\x09\x40\x9e\x6f\xaa\xea\x9b\x57\xfb\x74\x17\xa5\x2b\xba\x39\xb0\x36\xcf\x81\x33\x28\x18\xca\x62\xff\xba\xac\xd6\x3f\x81\x2b\x64\x20\x5d\xae\x79\x1c\x20\x90\xb7\x62\x06\x60\xfa\x66\x30\x20\xc2\xba\xd3\xc0\x3a\x10\xd7\xcc\xa2\x63\x82\x3d\x77\x81\x1f\x4f\x59\x8e\xc0\xfd\xb2\x2a\xe5\x9f\xfa\x4e\x1a\x27\x77\x96\x93\x97\x16\x46\x4f\xcf\xcb\x31\xa3\x25\x80\xfa\xb6\xa4\x40\x56\xab\x4c\x3d\x64\x10\x8e\xbd\xd5\x40\x08\xb4\xcc\x19\xb4\xa5\xf3\x1a\x32\x87\x80\xdb\x29\x34\x99\x30\xe4\x94\x98\x7c\x09\xa1\xf1\xb8\x00\x64\xdd\xc9\xcb\x03\x03\x6d\xda\x49\x12\x48\x54\x7e\xcb\x4b\xa0\x8e\x3d\xb0\x63\x55\xe8\x55\x73\xe0\x90\x42\xc4\xf2\x90\x35\x6d\x85\x0c\x26\x96\x0d\xb8\xeb\x9b\x3b\xbd\x36\xba\xb0\x9d\xbe\xc1\x69\x08\xcc\x42\x43\xf0\x9a\x86\x62\xe4\x6b\x17\x33\xb7\x1b\xee\x13\x91\xfd\xc7\x01\x4f\xc7\xa5\x81\xae\xae\x6d\xa1\x5f\xbb\xda\xe4\xb7\x25\x25\xa6\xe1\x7d\x2e\xe4\x68\x3b\xfb\x45\x63\x10\xd3\x7d\x2d\xc6\xf9\x56\x35\x44\xde\x50\x58\x97\x46\x1e\x97\xaa\x69\x3f\x32\x81\x52\xa0\xad\xd1\xe1\x9f\x55\xa9\xf5\x92\x74\x92\x03\x1f\xe3\x27\x95\xe1\x5f\x09\x6f\xcd\x71\x55\x50\x46\x87\xe5\xc7\xaf\x42\x27\xc9\xa5\x07\xc0\x84\xc6\x35\x2c\xb4\x14\xbd\x17\x51\x69\xd3\x57\x1f\x41\xfb\xaa\xcd\xf2\x01\x4e\x38\x9e\x06\xee\x17\xf4\x9e\x0f\x22\xfc\x0a\x96\x30\x67\x43\xec\xae\xdc\x66\x05\x2d\x37\xa4\x7e\x04\x69\x7f\xa8\xdb\x0f\x92\x15\x76\xc7\x10\xa1\x00\x9e\x10\x5e\x4c\x0f\x40\x2f\x9b\x3a\x47\x21\xee\xaa\xfa\xd6\xb7\x13\x50\x6b\xd8\x31\x31\xc8\xda\xa9\x87\x92\x42\x09\xae\xaa\x07\x40\xca\xf3\x89\x02\x20\x71\x44\x15\xbb\xea\x13\x62\x50\xed\x93\x37\x3e\xb8\xbc\x3c\x1f\x0d\xa5\xa1\x7a\x9a\x9e\x41\xa2\x74\x32\x6e\x67\x6a\x04\x98\xc0\x76\x1b\x87\x45\x9c\x44\x55\xfd\x2d\xe6\x92\x61\x00\x01\xf8\x55\x0e\x14\xe4\x1d\xe9\xbb\xff\x9f\xbd\x7f\x5b\x6e\x23\xc9\xd2\x44\xe1\xbe\xd6\x53\xb8\xe1\x26\x89\x99\x20\x52\x94\xf2\xd0\x95\x2a\x2b\x33\x88\x84\x24\x74\x91\x00\x1b\x00\x53\xa5\xff\xb7\x6d\x3d\x4e\x84\x83\x8c\x52\x20\x02\x15\x11\x20\x85\x7e\x9a\x7d\x3b\x8f\xb0\x6f\x67\xbf\xd8\x36\x5f\x27\x5f\x1e\x11\x20\x95\x55\x99\xd5\xd3\x3d\x45\xeb\xb6\x4a\x91\x40\x84\x9f\x7d\x1d\xbe\xf5\x7d\x65\xee\x97\x50\x6d\xe9\xe8\xe0\xf1\xed\x8f\x4c\xf7\xb3\x0b\xc1\x31\x3a\xe0\xbb\x66\xe0\xd7\x59\x5e\x3e\x26\xd8\x5b\x69\x2d\x8a\xeb\x49\x93\x7d\x63\x31\xab\xb2\x75\xdb\xdb\x10\x1c\x46\x36\x77\xdc\x2f\xb4\x4d\x18\xf0\x59\x1b\x9b\xa6\xc4\x0a\x62\x6b\x33\x38\x94\xfb\x01\xca\x04\xb1\xf2\x4e\x50\x39\x1c\xf0\xf3\x2e\x64\x87\x0b\x73\x11\x8c\x93\x22\xf0\x89\x3e\x86\x5a\xe0\x18\x77\x46\x6e\x1a\x75\x9a\xee\x48\xa9\x10\x2e\xa4\x84\x8f\xdf\xd6\xa9\x45\x91\x04\xe0\xbd\xca\x99\xea\xa5\x14\xda\x14\x8e\xab\x73\xcb\x83\x3a\x19\x41\x6a\x06\xd8\x79\xef\x19\x02\x2b\xaa\x2b\xd2\xec\x0b\xb6\x6b\x53\x95\x45\x73\x4a\x4b\xb9\x76\x6b\x4d\x20\x26\x3d\xa0\x03\xcf\x6f\x4c\xad\x45\xa1\x02\x05\x88\x9e\xd1\xb5\x4c\x72\xa0\x43\x92\x00\x4f\xfa\xba\xfb\xe4\x32\xfa\xf7\x37\xb5\x29\x1f\x80\x27\x4c\x76\xd9\x09\x26\x2c\x19\x99\x82\x2d\x45\x1e\xff\xb0\x28\x0b\x12\xb9\xa5\xa5\xea\xcf\x94\x0d\x02\x85\xa8\xc4\x8c\x32\xcf\xf0\xf7\xd6\x1b\x46\xe6\xe4\x5d\x59\x19\xf7\xc5\xfa\x13\x38\x61\x54\xb1\x34\x11\xf6\x1c\x56\xb9\x5b\xb9\xad\x7d\x47\xb6\xd6\x9f\xee\xb6\xc9\xd6\x40\x0a\xd5\x19\x75\x49\x3b\xb9\x2f\xbb\xdc\x12\xae\x56\x7d\x69\x34\x84\x65\x1e\x0d\xde\x9a\x51\xfc\x56\x8e\x97\x8d\xb9\xcf\xea\xa6\xac\x40\x31\xa0\x8f\x4a\x9c\x47\x8a\xd7\x4e\x6b\xa8\xd0\xb0\xd8\x20\xe7\x4b\xa2\x2e\xf0\xc4\xec\xee\xb3\xbc\xac\x4b\xd4\x81\x48\x8c\x6b\xee\x59\x21\x62\x57\xe6\x19\x6a\x14\xec\xca\x1a\x89\x84\x34\xff\xad\xdb\x8e\xd8\xd8\x19\x4c\x8b\x07\x5b\x65\xb6\x68\xb8\xdf\x35\x12\x7f\xaf\x49\x07\xab\x33\x2e\x7c\xa8\x41\x01\x17\xb2\x1f\xe3\x75\x64\x21\xce\x0b\x35\x3e\xf8\x1a\x32\xa2\xba\x6f\x90\xe0\x0a\x9d\x45\xa8\xb5\x69\x0f\xea\x72\xd0\xf3\x27\x84\x5e\xdd\x3a\xb4\xd0\x0f\xc8\xad\x9b\x95\xfb\xd2\xb4\x3a\x50\xdf\x97\x55\x63\x76\xb6\xae\x99\x9e\x1e\xca\xd4\x10\xae\x5a\x39\x08\x16\x52\xc3\xdf\xc1\x6e\x52\x4f\xf2\x63\xf9\xd6\xae\x3f\xeb\xdf\xfd\xca\x8d\x1f\x9b\xc1\xca\x1f\x0c\x3b\x5b\xf9\xb3\x32\x4a\x4a\xb6\x8f\x2a\xb3\xb5\xeb\xfb\xac\x70\xa7\x95\xb3\x29\xa4\xff\x31\x06\x2d\x09\x7b\x0a\x06\x19\x0c\x1c\xd2\x44\xc5\xaa\x45\x11\xa8\x9d\xf6\xaf\x28\xc0\xc1\x51\x9b\xd0\xf7\x24\xb1\x4b\x37\xc0\x43\xe6\x1e\xfd\x01\x54\xa4\x20\xf8\xe1\xd2\xb0\x3f\xa1\x0e\xad\xa9\xac\xbf\x41\x36\x65\xf5\xe8\xaf\x5b\x3a\x60\xe0\xd9\xd9\x1a\x07\xdd\x7f\x8f\xc4\x4a\x4e\x40\xc6\x0b\x41\x0b\xde\x7a\x2a\x89\xf0\x7f\x97\x7d\x71\x79\x3d\x94\xef\xed\x6c\x86\xd8\x3f\x6f\x71\x84\x6f\xa6\x95\x7d\xcc\x8a\xbb\x7a\x88\x48\xcc\x0e\x7d\x13\xfd\x9d\xde\x98\x04\xc8\x36\x88\xbb\x64\x52\x8b\x60\xb2\x02\x44\x37\x4b\x2a\x5e\x84\x81\xe3\x9a\xfd\x0d\x1e\x7d\x88\xa3\x91\xf3\x9b\x88\xe1\xac\xf1\xcb\xda\x61\x0d\x3c\x7e\xef\x2b\x1f\x3d\x32\x63\x9c\x66\x30\x67\x11\xa3\x1f\x22\x76\x6a\x35\x60\xa2\x3b\x9a\xcc\xad\xad\x3e\xef\x77\xa1\x94\x2e\x58\x82\x7e\x2a\x1f\x81\xcc\x03\xe5\x6d\xca\x7d\x65\xef\x9c\x2e\xdc\xde\xb6\x38\xa1\xfd\x2a\xf2\x3d\x25\x43\x4b\xbd\x58\x5a\xc8\x43\xe6\xff\x1e\xaf\xd3\xcc\xaf\x0b\x00\xed\x0e\xe6\x3b\xfb\x97\xbd\xc3\x9b\x77\x82\xe7\x30\x59\x5a\x61\x30\x60\x74\xfc\xa0\xe8\xee\x91\x03\xc7\xb1\x68\x3c\x66\xc7\xcb\xf3\xe9\x34\x78\x31\xd0\xdf\xc4\x6f\xbd\xac\xd8\x94\x34\xa6\xf8\xc0\xc4\x5c\xda\x95\xfb\x53\xeb\x77\xcb\xf7\x57\x97\x7e\x0c\xfe\x74\x75\x69\xf6\x35\xa6\x94\x70\x61\x47\x0b\xe4\x62\x75\x91\xd0\xba\x45\xad\xb3\x53\xa5\x91\x57\x43\xe9\x9f\xf9\xb0\xba\xba\x8c\x4d\xf2\xfb\xfd\xd6\x16\xd1\x40\x8e\x0c\x76\x5f\x3a\xc9\xbd\xb9\x2e\xeb\x66\x09\x30\xd4\xc4\x5c\x5f\xbc\x83\xc2\x83\x9d\x5f\x30\x9c\xd6\xb0\x0d\x1d\x19\x02\x20\xb0\xd1\xee\x02\xbc\xcb\xed\x21\xfa\xde\x63\x59\xa5\xfe\x17\x6b\x57\xd7\xa5\xbf\x1c\x74\x6f\xc1\xec\x14\x2c\xe9\xc5\xea\x42\xa9\xe5\xf8\x2f\x20\xf0\xa4\x24\xca\x7a\xc0\x86\x07\x5a\xcf\xc0\x06\xc0\xa9\x12\x3e\x6c\xf0\x43\xbe\x45\x30\x1e\x94\x85\x41\x10\x2e\xec\xbd\xb8\x4d\xd0\x8c\x72\xdf\xf8\x39\x09\x8c\x61\x45\x7e\x08\x67\xf5\x0a\x34\xdc\xae\xed\x9d\x1b\xe0\xd1\x96\x10\x10\x57\x1b\xdb\x18\x0e\x0f\x72\x6f\x12\x98\x07\xee\x3c\x30\x1e\x43\xe2\x62\x07\xe7\x88\xa5\x9e\x39\x47\xd2\x46\xde\x98\x4d\xfc\xd5\x99\xdd\xa2\x3f\x1b\x78\xfb\x63\xeb\x9d\x30\xea\x68\x9b\x46\x79\x01\xad\x37\xf7\x4e\xec\xfa\xac\x90\x29\x24\x24\x2b\xc8\x46\xa3\x77\x86\x54\xe9\xd2\x6e\x8b\xad\x4d\x7a\xfa\x4d\x36\xf4\x97\xc6\x14\x58\x42\xe1\xcc\xb6\xac\x1b\x55\x91\x8f\x8d\x41\xd2\xcc\x0d\xa3\x4a\x3e\x7f\x53\xe3\x0b\xfc\xa2\x72\x6b\x27\x9e\xd6\xad\xbb\xcb\x0a\x30\x61\x19\x8a\x57\xa6\x0a\xd8\xfe\xa5\xe1\x84\xdb\xcf\x93\xc5\xdb\xf1\x6a\x7a\x65\xce\xe7\xd7\x9f\xa6\xb3\xf7\x2f\x94\x04\x7a\x5f\xcc\x25\xbe\xd5\xc8\x16\x72\x69\xb6\xdf\x7e\x6d\x68\xa1\x5d\x78\x13\xc3\x9f\x62\x1f\x84\x54\x82\xc3\x52\x64\xf7\x98\x2b\xba\xd0\x39\x69\x8e\xb8\x42\x51\x63\xb1\xc0\x57\x16\x6d\x54\x5d\xad\xae\x05\x10\x5a\x48\x53\xd0\xb4\xa7\xee\x48\xee\x30\xa8\xd6\xe0\xd3\x7b\x82\x43\x31\x5f\x0c\x00\x95\x44\xb1\x6b\xeb\x6c\xbd\xa7\xb5\x55\xde\xa2\xfb\xa7\x0b\x92\xd1\x04\xb7\x29\xe5\x6e\x98\x1e\xc8\x0f\x87\x9a\x49\x3a\x2b\x0f\x5c\x0f\xae\xf5\x66\x74\x05\x26\x03\xa6\x90\xdb\x04\xae\x56\x57\xd4\x52\x95\x2c\x32\x53\xa8\x22\xe1\x9f\x29\x05\xf0\x5a\x82\xd3\xe4\x50\x44\xea\x8a\x72\x7f\x77\x4f\x72\xfa\x98\x52\x0d\xcd\x90\x32\x68\xdc\x87\xd4\x4c\x19\x36\x6f\x7b\x49\x4d\x80\x5e\x60\xf0\x9d\xdc\x81\x07\x80\xd3\x10\x1c\x4a\x88\x15\xa8\x87\x00\x23\x45\x8a\xe9\xde\xa0\x36\xef\x9f\x22\x67\x3a\x11\x70\x71\x6f\x28\x55\x4a\x0b\xdb\x4c\x67\xe6\x5f\x6f\xc6\xb3\x15\xa1\x32\xa9\xab\xe4\xde\xc8\x81\x13\x67\xe2\x65\xf1\x60\xbf\x91\xe8\x13\xaa\x59\x6c\x61\xce\x5e\xbe\x0c\x0b\x53\x79\x3e\xad\x35\x2a\x27\x4a\x64\x3a\xca\xb8\xb9\x62\x9d\x97\x84\xfa\x94\x6b\x10\x35\x23\xe5\x56\xa8\xaa\x43\x82\xc5\x55\x64\x62\xc9\x41\x06\x15\xff\x20\xcf\xa6\x9e\xfe\x53\x9f\xfd\x8a\x87\x18\xb8\x89\xf8\x74\x6c\x7b\xdb\xa8\x8d\x94\x36\xe1\x73\x23\xf3\xb6\x04\x5e\x61\x68\x51\x98\xeb\x9e\xf6\x30\x5d\xf2\x01\x77\x51\x1d\x3b\x90\x34\xa8\xb5\x93\xe5\xb6\x8a\x5b\x84\x0f\x27\x0b\x16\x9b\xbb\xf7\xfd\x83\xc3\x52\x8a\x46\xfc\x2d\x23\x13\x84\x7f\x73\x7f\xd9\xc3\x61\xa3\x4e\xcb\x22\x35\x0f\x19\x44\x0f\x47\x51\x81\x79\x9c\xc5\xe7\xde\x52\xe7\xb2\xc0\x95\x84\x12\xc2\xc2\xc7\xc9\xac\x2b\x2a\x06\x15\xbe\x07\x2e\x03\x00\x04\xb1\xcb\x07\x09\x91\xaa\x36\xb6\x57\x14\x58\x1c\xb6\xc9\x6a\x2c\x4d\xab\x5d\x84\x95\x20\x4b\xa0\x21\x70\x9b\xad\xa3\x60\x37\x46\x64\x58\x55\x86\x8a\x91\x70\xc1\x4f\xa3\x5a\xda\x14\xce\x7a\xbc\x89\xe5\x74\xf6\x23\x0d\xf2\x3c\x65\x69\x1e\xca\x7c\xbf\xcd\x8a\x72\x0f\x87\xd2\x26\x6b\xc2\xd2\x3a\x04\xbc\x24\xab\xd1\x23\x04\xb4\x2c\x5c\x4d\xce\x92\x39\xb1\xb5\xd9\x22\x7d\x2d\x7c\x3b\x30\x28\x0c\x79\x6c\x2d\x32\x90\xa8\x35\xe7\xcf\xbb\xac\xd8\x73\x51\x18\x3c\xd2\x5f\xb7\xe9\x9f\x2d\x70\x72\xc2\x1d\x3e\xea\xd9\xa4\xd1\x51\xc7\xe6\xd6\x2f\xdd\xb1\x61\xe7\x65\x24\x93\xc8\x65\xc2\x1d\xa7\xaa\x65\xa2\x1e\x34\x0c\x14\x80\xf0\xa1\x09\x48\x9f\x0a\x87\x14\x86\x5f\xfb\x3f\xa5\x4c\xd0\x53\x54\x22\xc9\xd0\x7b\x43\xb2\xe5\xd3\xc2\x35\x10\x83\x12\x78\x81\x0a\x46\xd9\x00\xc0\xee\x34\xac\xd5\xfb\x80\xb2\x42\x71\x47\x5e\xef\x89\x32\x0b\xd9\xd7\xa3\x57\x9e\xa2\x89\x4c\x41\x36\xa8\x36\x12\xa5\x94\xb4\x7c\x2c\xf2\x12\x8c\xd2\xb2\x38\x6c\xb1\xd2\xd8\x36\x81\x16\xd7\xe8\x2f\x9f\xb2\x21\xcd\x8f\xf6\xfb\xb2\x29\xd7\x65\x1e\x6e\x18\xc6\xb9\xe7\x14\x1c\xd9\x61\xea\x48\xe6\x06\x58\x4c\x14\x1d\xc7\xae\xda\xa7\xc8\x4b\xe4\x76\x35\xd0\x53\x20\x0b\x03\xd8\x39\x1d\xbd\xb5\x78\x65\x64\x85\xf9\xcb\xde\x12\x67\x2c\x50\xff\x51\x45\x22\x1b\x1f\x9d\xd1\x84\x0a\x0a\x2a\x0f\x68\xee\xf7\x3c\x14\x30\x55\x1c\xb3\xc6\xeb\x48\xe6\x69\x5f\x34\x59\x1e\xc8\xb3\xca\xc2\x99\x83\xb7\xe4\x02\xff\x56\x0e\x0c\x5d\xd9\xd6\x75\xae\xd8\x22\x5a\x21\x27\x9a\x4f\xa9\xb9\xaf\xe0\xde\x45\x6d\xb4\x3b\x84\x57\x57\x08\xc3\xca\x21\x7e\xc6\xe4\x5b\x2e\x30\x95\x87\x60\x29\x6e\x22\x0a\x3f\xfc\x65\xef\x30\xc0\x71\xbb\x07\xcb\x4a\x0e\x89\x24\x58\x3e\x44\x85\xa3\xb2\x3a\xdd\x9d\x05\xec\xce\xb7\x6e\x83\x5c\x10\x61\xec\xfd\x12\x2d\x0e\x64\x2f\xb4\x0d\x05\x18\xf9\xbb\x0c\x8f\xc4\xad\x5f\xcb\xf7\x60\xcb\x22\x2c\xc5\x9b\x83\xf0\x7e\xaa\xc1\x34\xfb\x5d\x0a\xe3\xdb\xaa\xca\xbf\xd0\x54\xf4\xdf\x8d\xcc\xd5\xfc\x62\xfa\x8e\x44\x11\x97\xcf\x99\xae\xcc\xf7\x1e\x42\xc1\x9d\xae\x05\xf3\x43\x59\x1e\xde\x81\xe5\x88\xd7\x2b\x78\xe8\x6b\x36\x43\x62\x4b\xd6\x77\x80\xc9\xca\x1b\x61\xcc\x52\xaf\x23\xea\xcc\xca\xad\xb3\x1a\xb8\x3d\x22\xd3\x57\x02\x81\x9d\xef\x6d\xb2\x3c\x67\xcb\xbe\x2a\xbb\x97\x49\x82\xab\x14\x0d\x0f\x82\xb4\x85\x0d\x01\x35\x98\x91\x42\xe1\xa6\xff\x35\x88\x2b\x04\xf3\x76\x57\xd6\xb5\xf3\xff\xa7\x60\x98\x19\x56\xfa\xf2\x0d\xa9\x76\x6b\x5a\xd2\x15\x06\xd1\x5b\x29\x56\x6f\xbf\x80\xa9\x54\xc7\x28\x18\x48\x9f\x0a\xbe\x90\x39\xb1\x41\xea\x9b\xaf\x56\x04\xab\x0d\x8d\xa5\x7b\xd4\x77\x2d\x2b\xd6\x52\xd1\x6f\x9b\xee\x68\x00\x48\x0c\xff\x4c\x26\xba\x10\xe3\xd3\x82\xaa\xcd\x09\x9e\x84\x78\xc3\x71\xb4\xb8\x72\xe6\x11\xb8\x58\x8a\x43\x82\xb5\x35\xb5\x52\xb8\xf8\x00\xf1\xdb\xc3\xb1\xf0\xfa\x30\x58\x1a\x7c\xbc\x81\x11\x8b\xed\xa6\x1c\x52\xdc\x0c\x0e\x52\x2b\xe1\xd6\xc8\x58\xb2\x81\x64\xcf\xef\x1d\xca\x89\x03\xb4\x96\x6b\xc6\xdf\x8e\xcc\x25\xa0\x1c\xdb\xa3\x89\xf2\xc7\xb8\x87\x93\x88\xc0\x85\x71\xa4\x2c\x73\x91\xa1\xd6\x5b\x94\x6e\xa5\x2f\xaa\x44\x40\x9c\xca\x38\x32\xc5\x7e\x9b\xdf\x61\x12\x0d\xb7\x32\x1f\x88\x1b\xd0\xfb\xa3\x94\x02\x67\xc8\x8e\x1e\x31\x27\x54\x4d\x9d\x35\x75\xf7\xd3\x30\x59\x59\x03\x77\x54\x8e\xea\x79\xb6\x80\x17\x0c\x79\x50\xce\x47\xac\x3a\xa7\x47\x05\x9c\xf0\xa6\x45\x29\xd7\x36\x4f\x7b\xba\xd4\x36\x64\xf9\x2d\x17\x23\x73\xcd\x86\x1e\x19\xe2\x5d\xdf\xb5\xf7\xe8\x42\xad\xcf\x71\x9a\x12\x81\x95\xb0\x71\xb5\xbf\x0e\x73\x01\x87\x7f\x2b\x93\xc4\xb6\x12\x1d\xf7\x2d\x28\x29\xbf\x9c\x5f\xf6\xce\xef\x5c\x30\x73\x12\x93\x6d\x81\x16\x13\x08\x1b\xc2\xed\xd4\xe7\x73\xb7\x3d\x99\x3b\x64\xcb\x57\xb9\xb8\xb0\x1c\x39\xd5\xfc\xc4\xb9\x77\x34\x4d\x28\x81\x74\x40\x57\xd6\xf7\xe5\xa3\xf0\x66\x8d\xd3\xd4\x15\xe9\x7e\x8b\x89\x43\xee\xce\x7b\x35\xf0\x9c\x0d\x6a\xb5\x55\xbc\x07\xe2\x35\xeb\xcb\x3e\x10\x7c\x82\x2c\x65\xed\x04\xf9\xcd\x26\x6d\x38\xea\xda\x71\x73\x3e\xc8\xe8\x22\x13\x33\x10\x79\xa0\x2f\xd9\x61\xa0\xe5\xef\x4c\x55\x17\x10\x0c\x82\x67\x0a\x6c\x48\x08\xa6\xd2\x69\x33\x48\x04\x1c\x4b\x91\x1e\x00\xc0\xa7\x48\xc3\xd6\x00\xd3\x5f\xe3\xb6\x42\x6e\x13\xc8\x40\xd9\xf5\x48\xc0\x12\x49\x80\x83\x4d\xb6\x50\x8c\xd5\x38\x76\x23\x58\x1e\x8a\xce\xe9\x42\x5a\xd9\xae\xa2\xf4\xfc\x13\x1d\x68\x8f\x63\xc2\x64\x16\xfe\x4c\x0a\x9c\x3c\xad\xd6\x3e\xdd\xd2\xe0\x46\xa9\x16\xfa\x31\xd2\xe7\x1f\xb0\x2b\x58\xdc\x64\x30\x46\x44\x53\xc0\xef\xeb\xeb\x2e\xd9\x75\xa2\x37\x4e\xe7\x35\xe4\x54\x8a\x30\xe5\xff\xd2\x9a\xbe\xb6\xdd\x1e\x40\xd6\xbd\x4b\x09\xb6\x35\xed\xa1\x60\x66\xdb\xaf\xb0\xeb\xb1\xc2\xea\xb3\x43\x4c\x6f\xcf\x9b\x8f\x2c\x5e\x7c\x63\xe7\x16\xcc\x1a\xd0\x59\x66\x29\x43\x70\xc9\x6b\xe1\x62\x26\x68\x00\x3d\x2a\x4c\x28\xcd\x75\xb8\xef\xca\xad\x5f\x89\x9d\xb6\x50\x30\x37\xa0\x0f\xfc\xbb\x14\xac\x42\x2e\x07\x7f\xc0\xf9\x69\xaf\xd9\xae\x8c\xc3\x8c\x14\xef\x2d\xab\xe7\xee\xcb\x40\x60\x03\xbe\x28\x83\x0c\x8e\xdd\x9d\x7f\x44\x83\xa6\x38\xf4\xac\xde\x71\x2c\x44\x5c\x0f\xfc\xeb\x07\x17\x2e\xe5\x33\x78\x90\xc4\x6e\x3e\x3d\xe2\x9b\x68\x9f\xee\xa2\x63\x2a\x6c\x73\xbe\x2e\x82\x12\x12\x96\x7a\x14\xa8\x82\xe4\xbd\x46\x09\xf7\x29\x3a\x99\x56\x9b\x38\xac\x9f\x86\x56\xd1\xec\x37\x58\xc6\xcd\x1d\xbd\xec\xb9\xa9\x7a\xce\xc3\xce\x6a\x0b\x67\x19\xb6\x3f\xab\x30\x48\x1d\x6a\x1b\xfc\x6f\x20\xff\x3b\x92\x74\x39\x9a\xfe\xa2\x68\xe6\xcf\xd7\x07\x9b\x73\x08\x16\xea\x9c\x03\xcc\x4b\xcb\x19\xf1\xe0\xd0\x03\xa9\xed\x57\x23\x73\xe1\xb0\xec\xb8\x77\xa2\x26\x45\x5a\x56\x35\x4d\x12\xd1\x97\x58\xf9\x1c\x47\x62\x7b\xf8\x4b\xda\xdb\x9f\x5f\x38\x1b\x99\x8b\x92\x1c\x24\xb2\xdd\x8a\x83\x71\x5f\x32\xd4\x3a\x95\x29\xac\x5b\xef\x36\x88\x70\x58\x97\xc5\x26\xcf\xa0\x4a\x22\x0a\x5d\x15\x87\xee\x90\xeb\x90\x4d\xe7\x34\x92\x2a\x0b\x50\x83\xea\xc1\x77\x20\x22\x03\x61\x20\x6b\xd6\xba\xfd\xcb\xde\xe6\xd9\x06\x02\x32\x3d\x19\x7b\x85\xb6\xf0\x87\xb6\xc4\xc1\x08\xc0\x22\xfc\x1b\x61\x09\x48\x18\xb9\x41\x3b\x04\x5d\xf5\x90\xe9\xef\x21\xc0\xa9\x5d\x68\xa1\xad\xa1\x66\x19\x7a\x3d\x32\xab\x12\x7d\x85\xcc\x9f\xeb\x69\x1a\x2d\x20\x36\x65\xb8\x66\xa7\x67\x7d\x1e\x99\xb8\xee\xc5\x4c\xc7\x18\x3d\x98\x99\x5f\x62\xd7\x21\x48\xe6\xf6\xac\x3b\x1d\x32\xb4\xcf\x2d\x3a\xe5\x07\x2a\x6d\x27\x01\xb3\x78\x77\xdb\xa9\xcf\xfb\xce\x1d\x02\x99\xa9\x9a\xf1\xdb\x03\xa4\x92\xfd\x09\x4d\x1a\xaa\xa7\xa7\x1b\x8d\x69\x11\x5a\x66\x78\xc8\xce\x41\xf4\xef\x21\x73\x8f\x86\xd9\xf0\x24\x8f\x24\x89\x61\x30\x2f\x1f\xb8\xc2\xdd\x94\xd5\x9d\x2d\xb8\x68\x83\x2c\x5b\xaa\xe4\x68\x10\x06\xa9\x44\xa7\x40\x0e\x82\xc3\x39\x3d\x03\x43\x60\x0a\xff\xb9\xfd\x0e\x23\x88\x88\xa3\x4c\x31\x07\xd7\x09\x44\x93\xf5\xd2\xfd\xe2\xab\xef\xf5\xd7\x5a\x51\xe9\x44\x4a\xda\x11\xd0\xa9\x97\x89\x36\xdb\x8e\x6d\x6c\x33\x47\xfe\x49\xa7\xdf\xdb\x6e\x9a\x41\xe7\x13\xfe\xd6\x7a\x3f\xdf\x87\x18\x4c\xbb\x3d\x20\x98\x89\x42\x33\xc0\xaf\xc8\x07\x32\xe1\x52\x87\xb8\xba\x0a\xc7\xba\x40\xbc\xc9\x83\xdd\x42\x92\x65\x41\xa9\x89\x22\xb3\x0c\x11\xd0\x49\x10\x88\x9c\xf2\xe5\x9d\x1f\x42\x3b\x80\xad\x18\x04\x90\x54\x2b\x94\x68\x25\x3d\x81\x14\xa0\x58\x43\xdc\xae\xe1\x20\xd3\x9c\x9b\x49\x54\x5f\x8f\x36\x13\x6c\x8e\x37\xb0\x7c\xf9\x8f\x95\xc3\x2a\x2c\xb8\x83\x73\x18\x2e\xef\x5a\x02\x32\x2a\x5b\x63\x89\x22\x3b\x04\x72\x96\x88\xd5\x11\x2e\x6b\xc4\xdc\xa4\xac\xd4\x45\x8f\x92\xbc\x30\xae\xc7\x13\x42\x87\xc9\xd7\x4e\x38\xdc\xa5\xc6\x91\xd2\xad\x2d\x8d\x37\x8c\x34\xf5\x7a\x27\x19\xf2\xcb\xd6\xca\x04\x63\x79\x4a\x3c\xbf\x6d\x5d\x3b\x04\x4f\x64\xc0\x8d\xa2\xb6\x2e\x73\xb8\xf5\xde\x1c\xdf\x8f\xcc\xf9\xfc\xea\xed\x74\x36\x9d\xbd\x37\x17\xf3\xf3\x9b\xab\xc9\x6c\xd5\x0a\x4a\x81\x92\x63\x2b\x9a\x16\x98\xda\x18\x63\xfb\x24\x56\x28\xe9\x78\x53\xb0\x5f\xf1\x5a\xe3\x83\xea\x3b\x2a\x8b\x0c\xc0\xe9\x10\x4b\xab\xfb\xc2\x56\x1c\x04\x17\xbd\xf3\xa0\x42\xaa\x88\xcd\xfa\x4d\x06\xf5\x01\xb1\xcb\xa4\x2b\x89\x52\xa6\x61\xeb\x95\xf0\xd4\xf0\x45\x5b\x1f\x79\x2a\x9c\x90\x34\x62\x29\x9a\x90\x19\x9a\xf8\x3d\x4e\xd8\x4a\xda\xcc\x9f\x2d\x1c\x03\x27\xf8\xba\xf3\xbb\xb1\xcf\x23\x4b\x88\xa4\x2c\x6f\xb2\x5d\xee\x28\x85\xb5\xb6\x79\x5f\xbb\xe8\x1c\xa0\x6d\xc0\x4c\x66\xcc\x87\xe7\x9f\xae\xfc\x22\xc0\x27\xf3\x63\x7b\x1e\x16\x80\x7f\x7e\x8f\x42\x4c\xc2\xef\xb5\x40\xb9\xc8\xb8\xab\x04\x13\xbd\x51\x2e\x09\x4c\x44\xc0\x3e\xf0\x9c\xef\x8b\xec\x2f\x7b\xd8\xf7\x36\x4d\xc9\x13\x54\x67\x26\xea\x11\x1a\x74\x2e\xfc\xed\x58\x27\x9d\x58\x88\x4c\x1f\x01\xfa\x79\x87\x44\x01\x29\x7e\x5f\xb6\x61\x89\x3f\x7f\x43\xe5\x35\x30\x18\x63\x1b\xd0\x02\x1c\x99\x2b\x6e\x36\xf4\xd0\xa6\x7f\xde\xd7\x8d\x86\x8b\xc6\x17\x2f\x2f\xbe\xe7\x0d\x80\x96\xaf\x2f\x96\xb2\x5a\x00\x68\x59\x75\x56\xb3\x0a\x5a\xf2\x6e\x54\x56\x65\xfd\x84\xf7\xca\x17\x73\xdf\x12\x67\xb4\x10\x38\xb4\x47\xfd\xe0\x37\xc1\x71\x7b\xe6\xdd\x1d\xdf\x83\xae\xcd\xfe\x4f\x6b\x9f\x44\x13\x88\x93\xd1\x9c\xe7\x7d\x5f\xd2\x06\xcc\x68\x20\xd4\x70\x97\x97\xc8\x92\x05\x75\x7f\xbd\x87\x18\x95\xbd\xac\x4b\xd0\x16\xa0\x14\x55\x4d\xb6\x71\x5f\x92\xf3\x17\x9d\x6d\x18\x91\x09\x97\x8c\x12\x54\x6c\x15\xf9\xa8\x5a\x07\x3d\x3d\xe1\x3d\xdd\xbd\x29\x20\xb6\xb6\x27\x10\x3a\xd3\x77\x36\x2a\x50\x43\xb5\xcf\x7b\x9a\xe0\x4f\xd9\x4e\x7a\xb6\xe5\xc6\x85\x76\x11\xf0\xa4\x27\x77\xcb\x43\xec\xbe\xa0\x96\xa1\x34\x5e\x6a\x51\xe0\x4e\x65\xaa\x4d\xd5\xe8\x56\xa6\x03\x54\x5e\x78\xe0\x94\x84\x52\x2f\xfb\x2d\x1e\xff\x70\xe7\x1d\x11\x4d\x02\x90\x7a\x83\x64\x4b\xbe\x61\x8a\x75\x81\x62\xed\x3c\x42\x2d\xae\xf9\x4e\x37\x15\xf8\xb8\x6f\xc0\x10\x9f\xae\x03\xa5\x3f\x8e\xcc\xf8\xfd\xfb\xc5\xe4\x3d\xa4\x78\x90\x77\x6e\x3a\xbb\x98\x5c\x4f\x66\x17\x93\xd9\xca\x7c\x9c\x2f\xfe\xb8\x44\xf4\xac\x56\x40\x6d\xaf\x43\x92\xb2\x08\xb5\x3e\xb5\xbe\x77\x6b\xb7\xb3\x15\x50\xa5\x81\x5b\x9b\x3a\xef\x51\xa1\x71\xc1\x93\xc6\x78\xaf\x84\x92\xbb\xfe\x5e\xc4\xe4\xb9\x63\x23\xb9\x04\x94\xa5\x4e\x51\x83\xff\x49\xd8\xa8\xc0\xfc\x0b\xf2\xce\xf7\x25\xac\xc9\x7d\x41\xbf\x78\x2e\x33\xa5\xe6\xab\x28\xa3\xae\x86\xc0\x6d\x56\x23\xdd\x94\xa2\x4f\x55\x1f\x14\xcf\x58\x7f\x39\x60\x37\x6d\x61\x06\xf6\xee\xce\xcf\x4f\xe3\x06\x3d\xda\x01\xa1\x03\xbb\x5d\xa0\xdf\xe2\x01\xcc\x37\xa7\xa1\x9a\x1d\x91\x71\x90\x92\xc2\x97\x69\x32\x82\xd0\xa3\x12\xa9\xb6\xf6\x05\x07\x00\xb2\x4a\x10\xe3\xea\xab\x9c\x9b\x39\x48\xf8\x40\x15\x63\x1d\xab\xde\x8a\xa2\xed\x53\x45\xcb\x8a\xf6\xbc\x62\xa2\x55\xe9\x3d\xf3\x1a\x40\xd1\x41\x91\xab\xe1\xbc\x56\x3f\xc6\x80\x22\x8c\x3d\x85\x06\x21\x2d\xe1\xaf\x84\xbf\xec\x6d\xd5\x84\x10\x95\x3f\x84\xbd\x79\xc0\xa3\x9d\xb4\xa3\xcc\xda\xa5\x89\x23\x71\x65\x8c\x0c\xaa\xf7\x55\x55\xee\x0b\x66\x44\x6b\x9b\x95\x4c\xd4\xc1\x2f\x1a\x99\x79\xa0\x03\xf0\x03\x8a\x60\x1e\x44\x39\x86\x47\x5b\x7c\xa6\xff\x2a\xae\xd3\xf0\x00\xe6\x27\x5c\x8c\x67\xcb\x4b\xd8\x92\x60\x7d\x29\x3c\x34\xaa\xca\x72\x74\x27\xd4\xe0\xe9\xf4\x45\x62\xea\x52\x5c\x0a\x8d\x2d\x0c\xcf\xe9\xa6\x84\x7a\x72\x08\x62\xed\x8e\xcc\x02\xee\x0c\xbf\x76\x8e\x1a\x5a\xfa\xe1\x82\xc9\x02\x48\xbc\xcd\xfb\xfc\x96\xac\xea\x14\x43\xd5\x49\xe4\x0d\x09\x75\x46\xab\xdd\x3a\x22\xd2\x6f\xc4\x68\x5d\xf1\xc8\xf0\x92\xc0\xac\x44\x52\xba\x0f\x18\x75\x35\xde\x22\x48\x7a\xfb\xf8\xee\xde\x68\x2d\xc9\x12\xf5\xfe\x49\x71\x07\x48\x9b\x23\x5a\x74\x10\x2f\x5d\xdb\x9a\x0e\xbd\x34\xab\x03\x15\xe0\xad\x6b\x1e\x9d\x23\xac\xac\x6a\x0e\x23\xe4\xbe\xf6\x1d\xc9\xd3\x9f\x06\x6c\x86\x77\x29\x6d\x96\x33\xf9\xa2\xe2\xcb\xd4\xf7\x28\x86\x1a\x35\x37\x8f\xe6\xdf\x89\xc1\x44\xd1\x5a\x73\x42\xd1\x41\xfc\x68\xf9\x21\x8c\xa2\x3f\x5b\x7b\x4a\x38\xa0\x60\x0d\x8f\x43\x45\xee\x7e\xec\xf5\x4f\xbd\x3d\xab\xcd\x43\x99\x91\xb7\x04\xdd\x8d\x29\x3c\x03\xb5\x27\xf8\x48\x5a\x4b\xba\xd5\x24\xc1\x82\x52\x34\x09\x94\x7a\x62\xf2\x3b\x46\x67\x94\xfc\x20\xd2\xed\x02\x90\x4e\x57\x70\x1d\x9a\x23\xf8\x66\xdc\x25\x81\xd6\x93\x1b\x96\xfa\x0d\xce\x80\x38\x12\xe4\xac\x28\xcd\xcc\x9c\x9b\x90\x9c\x0b\x84\x7d\xc2\x48\xf9\xee\x66\x75\xb3\x98\x98\xc5\xe4\xe7\xe9\x92\x0d\x51\x4d\xba\xca\xee\xde\xb1\xfa\xf3\x00\x09\xad\xef\x4d\xe1\xa0\xd8\xf0\x21\xab\x95\xff\xcb\x47\xcb\xd3\xb5\xf0\x74\x0e\x64\x5b\xbc\x06\xb2\xad\xa3\x1b\xb4\x70\x8f\xe1\x51\x30\x1e\xb7\xce\xd4\xd9\x36\xcb\x11\x2b\x5e\xef\xb2\x2a\x13\x17\x87\xd1\x8c\xa2\xb7\x70\xbb\x6f\xe8\xdc\x03\xc6\xe3\xac\x10\xa1\xaa\x92\x8b\x18\xe1\x15\xbb\xaa\xbc\xcd\xdd\x96\xf4\x40\x81\x65\xb3\x46\x6e\x3e\x45\xa2\x73\x57\xec\x81\x40\x87\xcb\x87\xbf\xc5\xd2\x0b\x6f\x77\xb6\x90\x33\xaa\x96\x16\x33\x04\x96\xc2\xa1\x77\xfb\xac\xbe\x27\x83\xac\x0e\xe1\xfb\x6e\xc4\x8a\xaa\x87\x38\xce\x1c\x89\xe7\xe0\x77\xda\x78\x1d\xb5\x6e\x06\x4c\xa8\x0f\x02\xa9\x0f\x5c\x89\xa9\xb0\xda\x19\xc5\x9a\x79\x61\x71\xa0\x19\x6a\x6a\x18\xdd\x1f\x8e\x7f\x0a\x64\x33\x46\x87\xc5\x1f\xd9\x47\xa5\xb6\xa6\x5a\xe0\x8d\x82\x37\x51\x13\xf0\xe3\x12\x2b\x0d\xb9\xa9\x13\xb1\xd5\xd2\xca\x6e\x9a\x21\xc7\xd3\x8e\x2d\xbb\xee\x78\x89\xc1\x84\x8d\x39\x78\x83\x31\x1a\xe2\xee\xc1\x77\x88\x05\x7d\x7c\x6b\xf9\x2b\x88\xca\xf9\x1b\x9a\x37\xbe\xb8\x98\xcc\x2e\x6e\xae\x7e\xf2\xa7\x42\x88\x87\xb5\xdc\x18\x38\x51\xc4\xec\x7d\xb1\xea\xf9\x18\xd4\x95\x89\x47\x22\x53\x46\x64\x07\x49\xaf\x02\xab\x6b\xbb\x6b\xa9\xf6\x10\x05\x5e\xaa\xc8\xc9\xf8\xe2\xc5\x88\x91\x76\xf7\x6b\xf3\x67\x30\x5b\x04\xba\x10\x2a\x2c\x7e\xd2\x44\x15\xeb\xa1\xf9\x34\x19\x2f\xcc\xa7\xf9\xcd\xc2\xcc\xc6\x57\x93\x91\x89\x89\xe9\x98\x5e\x58\x8e\xe9\x08\x93\x07\x89\x35\x11\x66\xcb\x82\x67\xd9\x8f\x66\x78\xee\x38\x89\xe8\x4d\x4d\xdf\x6e\x50\xb3\xfb\xcc\x64\xbe\x09\xd6\x74\x8f\x79\x81\x26\xf4\xe5\x74\x09\xdc\xda\xd3\x85\x59\x4d\x57\x97\x93\xa5\xc2\x97\x75\xd1\xe1\xe1\x3b\x7c\xeb\xd0\x47\x3b\xf0\xf0\xf0\x49\x29\x0d\x93\x80\xbc\x9c\x30\x6d\xff\xba\x1b\x13\x79\x7a\xb0\x06\xa3\x17\x84\x13\x85\xa5\x55\x94\xbd\xa5\xa3\x7e\xc5\x39\x33\x80\xb6\xf6\x7e\x64\x00\x45\xf6\xce\x82\x01\x4a\xa5\x22\x88\xfa\x02\x08\x33\xaa\xbd\x48\x6e\xaa\xf5\xc6\xce\x20\xc9\x0b\xfb\xfe\x18\xbd\x6a\xf0\xd4\x00\xeb\x30\xd0\xa6\xa7\xaa\x94\xbb\x1e\xb6\xa1\xce\x28\x15\x4d\x95\x3d\x78\x83\xd5\xa9\xf2\x3a\x66\x61\x58\xa3\x74\x9b\x66\x26\xc0\x60\x0b\x1d\x9d\xb5\x0b\x5f\xc3\x50\xa0\xf7\xfd\x72\x5a\xd0\x87\x20\xa8\xc3\xa4\x24\x81\x67\x41\x29\xa8\xa3\x9c\x59\xf3\x0c\xb7\x45\x60\x2d\x44\x23\x61\x8f\x7b\xbf\xc5\x64\xf1\x1f\x4d\x87\xf3\x7f\xdc\xcf\xe8\xdb\xd4\xed\x2a\xb7\xf6\x46\xda\xbf\xbd\xbf\xbe\x3c\x7d\x3d\x7a\xf9\xdf\x7f\x65\x16\xa8\x27\xf9\x9f\xce\x5e\xbe\xfe\xee\xc7\xb3\x16\xff\xd3\x77\x67\x67\x67\xff\xe0\x7f\xfa\x7b\xfc\xc0\x96\x9d\xcc\x26\x8b\xf1\x65\x5b\xf2\x83\xef\xa7\xd7\x89\x79\xf5\x3b\xf3\x2f\xfb\xc2\x99\x57\x2f\x5f\xfe\xa8\xae\xd4\xff\xf5\x3f\xe1\x37\xcf\x51\x3f\xfd\xde\x1b\xa8\xa6\x36\x3f\x7d\xfb\xed\xa6\xde\x80\x7d\xfa\x87\xff\x28\x62\xa7\xeb\xca\xd9\xed\x6d\xee\x80\x76\xfa\xf8\x79\x85\xbc\x1a\xfe\x70\x4a\xba\x54\x3c\xa0\xbc\xa8\xd9\x67\xd1\xcb\xfb\x9c\x15\x58\x87\x04\x81\x27\x24\xb6\x16\x57\x08\x13\x6f\x75\xd3\xf7\xc5\x5d\x65\xd7\x98\x61\xc2\x90\x55\x20\x4e\xa0\xc2\x22\x88\xb0\x3f\xda\x03\x1e\xc9\x8a\xf3\xa9\xbe\xe7\x27\x51\xed\x5e\x43\x65\xa0\xf5\xc8\xbc\xc5\x4c\x57\x65\x6b\x8c\x4b\x3d\xd3\xdb\xac\x68\x5c\x41\xc5\xb1\x77\x7b\x0b\xa6\x90\x7b\xfe\x85\x36\x8f\x63\x14\x96\x2f\x9f\xd3\x53\xa6\xc4\x82\xe2\x8a\xac\x11\x2d\xee\xf8\x22\xd9\x50\x5c\x04\x94\x85\x6b\xa8\x81\xff\x48\x2e\xff\xf1\x65\xc5\xc0\xd2\x27\xba\x24\x03\x5e\x6e\x8c\xef\x04\xbf\x10\x98\x81\xd8\xcd\x80\xb8\x07\x91\xce\x28\x62\x1c\xc9\x48\xc0\x22\xf3\x03\x7f\x7b\x80\x06\x12\x06\x11\x03\x2e\x6b\xd2\x9a\xf5\x7f\xf2\x0f\x81\xb1\x62\x3a\x02\x7f\xe1\x95\xa3\x17\x1f\xef\x5d\xe1\x2f\xe0\x7a\xe7\xec\xe7\xce\x2d\x0a\x77\x33\x96\xa1\x6e\x5c\x55\x11\xfd\x3f\x0d\x37\xea\x9d\xed\x2a\x80\xaf\xcc\xf7\xd5\x91\x8e\x76\x97\x8b\xd6\xd8\xb2\x4d\xec\x43\xa9\xa9\x54\xdb\x2b\xec\xaa\x78\x6e\x4e\x68\xa2\xab\x3b\x21\x7d\xdf\x9a\x6c\x43\x85\x19\xf5\xfd\x30\xd1\x75\x0e\x10\x40\x88\x18\x82\xbd\xa7\x6a\x0b\xe0\xfb\xf2\x5b\x91\xbe\x68\x01\xc1\xa7\x6b\x4c\x6c\xa1\xd7\xaf\xbc\xbe\x44\x2b\x61\x97\x39\x82\x4d\x43\x1a\x83\xd0\x4f\x81\x6c\xaa\x5d\xac\x0b\x52\xce\xfc\xdc\x56\x25\xc2\xc8\x7b\x30\xbb\xaa\x6c\xdc\xba\xd1\xd1\x12\x98\x09\x48\x11\x43\xfd\x89\x7b\x80\x40\x30\x70\x89\xa1\xdf\x9f\xba\x02\xcc\x45\xff\x5c\x7c\x20\x85\x59\x40\xd4\xed\xb3\xfc\xa9\x84\x18\xac\x13\x8f\x00\x3f\x05\xf8\x23\x90\xab\x70\xca\xa9\x65\x1e\x12\x81\xda\x67\x39\x62\xef\xb3\x4e\xd5\x6d\x1c\x6f\x0e\xeb\x07\x11\x90\xe0\x26\xa2\x67\x92\x35\x3f\x75\x9f\x07\x34\x3b\x24\x50\xa6\x16\x81\xdf\x19\x44\x97\xd6\x26\xca\x39\xfa\x7a\xca\x35\xd1\xd0\x27\xc2\x90\x75\x57\xd9\x26\x0b\xd4\x18\x66\xe3\x9c\x4a\xad\xee\x6c\x8d\x85\xa4\x18\x03\x51\x82\xb1\x4d\x3f\x0b\x98\x5a\x51\x69\x5b\xd5\x55\x17\x6b\x39\xa8\xe0\x2a\x13\x59\x7e\x6a\xc9\x35\xb1\xc8\xf8\xc8\x8c\xb9\x46\xd8\x3f\xaa\xbe\xc7\x14\xde\x96\xd7\x07\xb8\x6e\x75\x89\x81\x70\x58\x43\x68\xa8\xd2\x0c\xbe\x10\x6d\x02\x6a\x62\x74\x06\x5d\x5f\xf6\xad\x2a\x72\x9b\x1e\x4b\x2c\x53\xfb\xc9\x9c\x9c\x0d\x19\x4e\x12\x3c\xda\xb2\x68\x4d\x2a\x68\xb5\xbd\x1a\xa2\x14\x20\xad\xb8\x18\xca\xc2\xcb\x0d\xa8\x7f\x5a\xb0\x96\x67\x5c\xd7\xac\xc1\xd9\x06\xa7\x5b\xba\xf4\x0d\xe6\x93\xf1\x78\xfb\x86\xfb\x82\xf5\x1b\xbe\x8f\xd7\x97\x52\xde\x4b\xa4\x47\x81\xd4\x46\x10\xdf\xac\x2c\x4b\x67\x45\xd6\x3a\xea\x91\x25\xe1\xb6\x6c\xee\xf1\xa0\x6f\xbd\xb3\xb6\x9f\x5d\x78\x5b\xa0\x5d\xf0\x6f\xe9\x40\x56\xcc\x2d\x12\x9e\x60\x29\x2c\x1e\x1e\x69\x82\xd3\x67\xd9\xc5\x90\x88\x99\x04\x29\x6f\x9d\xb1\x8d\x90\x95\xb9\xaa\x2a\x0b\x87\x08\x2a\x7f\x09\x84\xda\x93\x0e\x2e\x7a\xf4\x62\x59\x6e\x61\xc0\x20\xe0\xd0\x3e\x72\xfd\xe9\x80\x9d\x52\xe8\x6d\x50\x46\xc9\x81\x75\xa9\xda\x17\x3d\x7d\x68\xed\x66\xff\x85\x0c\xe3\xef\xdb\xc4\xd8\xbc\xb9\x07\x38\x59\x73\x8f\xac\x76\x1b\x0b\x8a\xd3\x15\x1f\x6b\x75\x49\x1a\x36\x40\xf4\x5e\xa4\x16\xbc\xe6\x1c\x25\x5f\xcb\xed\xce\x36\x50\xbb\x23\x9e\xbb\xcd\xb6\xe4\x1b\xc2\xd4\x16\x77\x3c\x0b\x9a\x43\xb2\x7b\x0a\x63\x51\x76\x7d\xa8\x1b\x64\xb7\x32\x3b\x80\x9c\x16\xe1\x30\xb8\x05\xd2\xe8\xf5\x7a\x5f\x09\x1e\xc3\x56\xce\xd2\xcb\xd2\xfd\x9a\xea\x8d\x43\x06\x3a\x30\xe5\x0b\xe3\x61\xa8\x81\x43\x29\x5c\x34\xdd\xe0\x02\xdf\x17\xc8\x58\xc0\xb2\x3d\x72\x90\x3e\xf6\x72\x1e\xb6\xe2\x9c\x7e\x31\x61\x4d\x21\x6a\xe2\x61\x0c\x16\x0c\x2e\xbe\xd4\xca\x5a\xa4\x2b\xb1\x20\x95\x05\x87\x70\xf5\xd8\xca\xbb\xe6\x22\xf8\x43\x43\x2c\x30\x06\x30\x6a\xa0\x31\xa8\xfe\x87\x30\xbe\xa6\x44\x25\x22\x6a\x54\x50\x2f\x12\x9e\x08\xfa\x26\x86\xbe\xfd\xcc\x76\xe3\xd1\xd7\x97\x50\x6b\x14\x58\x4b\xf8\x8c\x69\x9d\xe2\x68\x37\xbd\x78\x97\x15\xc8\xa7\x81\xfa\xa5\x1c\x05\xc8\xfc\x26\x82\x02\x8b\x02\xe2\xfb\x20\xd8\xd3\x20\x83\x8c\xac\x3d\xd2\xbe\xa7\x32\xa9\x9a\x0b\xbd\xc5\x76\x16\x71\x7c\xbc\x4b\x40\x1b\x81\xcf\x0f\x89\xdb\xed\x31\x0f\x14\x2e\xf0\x82\x8b\x8a\x4f\x99\xe8\x90\x0b\x9b\x29\x73\x06\xeb\x05\xd9\x0e\x20\xd3\x0f\xe3\xe8\x4d\x0b\xd8\x90\x0f\x65\x86\xa9\x22\xce\xca\xa5\x7e\x79\x12\x5a\x90\x1b\x84\xb6\x5c\x8a\xf5\x12\x11\x09\x25\x72\xae\x89\xf8\x13\x93\xa6\xe6\x11\x71\x0e\x60\x90\xf9\xc6\x47\x20\x32\x2f\x1b\xa4\x5e\xad\xe3\xd7\xad\x6d\xa1\x19\xd6\x61\x38\xe4\xb6\xe7\x37\x17\x65\x71\xea\x9b\x82\x4e\x00\xad\xed\xfe\x40\x35\xb1\x6d\x78\xe3\x22\x79\xa6\x4c\x13\xc3\xa1\xa3\x17\xab\xc9\xe2\x6a\x09\x0c\x90\xe7\xf3\xd9\x45\x20\x80\x7c\x39\x32\x17\x02\xd5\x45\x04\xc9\x40\x93\x42\x0e\x54\x05\x04\xef\x92\xd7\x3a\x5a\xd9\x6f\x61\xe2\x83\xc4\xeb\x1b\xa0\xd5\x8c\x2c\x35\x72\x8b\x9d\xe6\xd9\x67\x52\xc2\xc2\x6c\x00\x83\x02\xfa\x7c\xa3\x10\x35\xaa\xdd\x36\xf3\x83\xb1\x5f\x37\xc0\x47\x5a\x7f\x96\x76\x3b\x73\x8d\xa3\x39\x68\xb1\x43\xca\x3b\x21\x25\x8f\xf5\x25\xd8\xd2\x5e\x2a\x35\xcc\x7e\x30\x3f\xe4\x11\x6a\x48\x51\x96\x72\xf5\x00\x06\x7e\x10\x6c\x94\x01\xe7\xdc\xf5\x01\x06\x60\xb8\x00\x9c\x26\xc6\xd9\xd2\x0c\xf0\x9a\x1d\x70\x95\x0b\x91\xf9\x90\x5b\x0b\xa6\xa4\xb7\x8f\x52\xbb\x6b\x0c\x5d\x0e\xba\xe2\x81\x61\x8d\xd6\x6c\x6c\x7d\x8f\xec\x7c\xfe\x22\x8c\x63\xe0\xe1\xc2\x4f\x44\xf3\xc0\x16\x74\x53\x7c\x26\xec\x8c\x2d\xbc\x45\xb7\x6e\x08\x85\x88\x8c\x84\xf5\x3e\x87\xa3\x1f\xdf\x13\xc0\x1e\xd4\x6e\x75\x3d\x09\x2b\xa6\xbf\xf5\x33\xf6\x8c\x42\xf9\xce\x80\x4b\x84\x06\x9d\x4f\x31\x7b\xdd\x9a\x44\xed\xfc\xef\x98\xd6\x88\xf2\x32\xfe\x2b\x01\x07\xca\x33\xad\x1e\xcf\x4f\x87\x4f\xd2\x9f\x65\x8c\xfd\xf6\xb5\x80\x4b\xe9\x0c\x73\x0a\x6b\x04\x71\xf6\x70\xf5\x65\x48\xe8\x97\x04\xcd\x02\x35\x78\x8f\xe1\x84\x40\x8b\x37\x14\xda\xd7\x81\xee\x58\x2b\xea\x65\xc5\xc6\x4f\x86\x53\x81\x7f\x85\x0f\x09\x53\x94\xdb\xc7\x84\xd3\xc6\x0e\xe4\xb4\x29\x20\x01\x40\x21\x3e\x05\x8d\xd8\x65\xc4\x46\x06\xe0\x15\x06\x8e\x5e\x53\x37\xa3\xda\x8f\xfe\xb3\xe2\xa4\x97\xe3\x99\x0e\x8e\x61\xc2\xcb\xa2\xc3\xef\xc7\xbc\x7e\x54\xbf\x03\x40\x05\x40\xe0\x54\x60\xef\x63\xf6\xda\x9f\x9a\xe8\x48\xd8\x1a\x8a\xfd\x65\x22\xd6\x65\xf1\xe0\xda\x8b\xdd\xef\x51\x46\x79\xec\x54\x17\x90\x95\xa0\xf0\xaf\xe7\x47\x73\x16\x98\xbd\x56\x60\x32\x40\x43\x9e\x29\x61\xae\xc0\x1a\x28\x1a\x07\x77\x36\xd3\x63\x5a\xb8\xf3\x02\xe4\x3e\x8c\x28\x95\x9c\x51\x76\xa3\x28\x11\x7a\xb0\xc1\xec\x9a\x25\xeb\x98\xa2\x42\xd8\xfc\xac\xb8\xc3\x15\x5b\x84\xf7\x3c\x38\x7c\x01\xfc\x62\x63\xd7\x8e\xb9\x84\x6a\x33\x18\xab\xf2\xdc\x4b\x30\xc0\x67\x98\x87\x1a\xb4\x34\x08\x11\x5d\xd8\xc4\x90\xfe\xe2\xc1\x15\x99\x24\xba\x98\x9f\x26\x3f\x30\x3b\x8d\xd9\x38\xd0\xa4\xc4\x6f\x7b\x87\x41\xde\xfc\x4c\x69\x70\x70\x1c\x1a\x97\xe7\xe8\x5a\xd1\x28\x3d\x6d\xa8\xd3\xb1\x73\xe2\xfa\xb4\x95\xa9\x4c\x0f\xbe\x90\x91\xe9\xcb\xd0\x07\xf6\xff\xf9\x70\xad\x59\x71\xff\xc1\x1d\xc2\x73\x8f\xc1\x3a\xef\x31\xed\x08\xd5\x2a\xfd\x40\x43\xc9\xa1\x86\x69\x10\xfd\x49\x2b\xb0\x60\xe8\xe3\xba\xdc\x6e\x2d\xdc\x31\x5c\x91\xa4\x6e\x19\x6b\xb6\xae\xd8\x27\xe8\xb7\x12\x21\x10\xd4\x7f\x6a\x80\xf1\xd6\x39\xf0\x47\xfd\xa9\x58\x65\x8d\xab\x18\xc7\x7f\x36\x8a\x24\xa8\x85\xab\x4e\xf9\x96\x03\x5d\xd8\x18\xf8\xdb\x76\x18\xd7\x71\xa4\x50\xa3\xcf\x78\xa4\xdf\xfe\x8c\x74\x34\xba\x90\x1b\x32\xdf\x23\x33\x98\x23\xf7\x2b\x3e\x3d\x6c\x2c\x6f\x59\xd0\x8b\xf9\x99\x36\x3a\x74\x97\xcc\xb5\x32\xe5\x31\x0b\x5f\x57\xe3\x88\x9b\x91\x08\x6f\xe0\x6f\x25\xa8\x60\xdb\x5c\xca\x7b\xa4\x8e\xe0\xf6\x80\x4a\xd8\xe5\x5d\x91\xfd\xbb\x0b\xbc\x88\x35\x90\xc8\x25\xa6\xac\xa4\x60\x9b\xa1\x40\xf2\xa2\x5a\xa5\xde\x89\xc9\x2f\xa0\x04\xc8\x5c\x02\xa8\x34\x73\x1d\x23\x33\x01\x03\x73\x89\xbd\x13\x4c\x2d\xbb\x2d\x8b\x3b\xe5\xb3\x42\xb7\x89\xf8\x08\x97\xa1\xa6\x4b\x86\x29\x5a\x82\xdb\x62\x2e\xb3\xdb\xca\xfa\x13\x6d\x20\x17\xa3\x3f\x91\x83\xfd\x20\x29\x6a\xba\x3a\x3a\xd7\xea\xa3\x48\xdd\x03\x02\x8e\xd6\xfd\x89\x1d\xf6\x65\x37\x8b\xb2\xda\xda\x5c\xe6\x67\x67\xd7\x9f\xed\x1d\x1e\xf0\x57\xf6\xcf\x65\x05\x1a\xf5\x65\x21\xf1\x6a\x71\x82\x20\xe0\x27\xd6\x80\x6d\xba\x1f\x67\x19\x77\xe2\xdb\x67\xe1\x53\x3c\x55\xd9\xfe\x96\x06\x93\xef\xd7\xf7\x20\x2c\x6d\xc9\x98\x9b\xde\x58\xd3\x5d\x38\x8a\x36\xd2\xaf\x1d\xfe\xec\x71\xb6\x58\x26\xe4\x2e\xa2\x28\xa0\x1f\x87\x11\x10\x6f\xc7\x8d\x60\x39\x27\x44\x08\x36\x50\xd6\x15\xe8\x6c\xfd\x47\xbd\x91\x06\x1e\x17\xf2\xc0\xc2\xbe\x3d\xf9\xec\xaa\xc2\xe5\xfe\x7c\x2f\xd2\xf2\x91\x3c\x53\x22\xec\x2c\x4d\x59\x48\x49\x90\xc8\x53\xfa\xd5\x82\x45\xe5\xf8\x61\x73\xc2\x1c\x22\xfe\x3a\x11\xfe\xa3\xf6\xa2\xa8\xf6\x05\xe2\xa0\x18\x22\xeb\x2a\xb1\xf9\xb5\xe0\x18\x5e\x37\x90\xc1\x37\x65\xd8\xb5\xb8\x07\x76\x95\x6b\xd4\xf7\xaa\x7d\xc1\xf2\xf0\xc4\x4d\x5c\x61\xb4\x0e\x20\xd0\x78\xcc\x44\x87\x49\x16\x3f\x13\x45\xcf\x70\x90\xb8\x62\x58\x0d\x75\xf0\x14\x99\x9a\x33\xe1\x30\x04\xad\x1d\xe4\xc1\x6f\xf7\x75\x08\x0d\x03\x90\x8d\x7a\x19\x89\xcd\x09\xe6\x81\xbb\x1a\xe4\xf0\x50\x4c\x9f\xec\x5b\xe6\x2c\x04\xa4\x8a\xd8\x0c\x0a\x74\x96\x29\x0c\x8c\x06\x1b\x12\x6f\x65\x7b\xb3\xc2\x98\xb6\xfd\x47\x64\x29\x0d\x7f\x88\x98\x5b\xa3\xa8\xb0\x12\x90\xde\xa3\x6b\x20\xe6\x66\x56\x78\x2b\x90\x8b\x34\xda\x2d\x56\x7b\x92\x01\xc6\x6d\x13\x1d\x43\x59\x12\x30\xed\x9b\xc5\x70\xeb\x2b\x1b\x22\x14\x52\xa2\x2e\xa1\x92\x2d\x84\xbd\xca\x27\x3b\xfc\x51\x5f\xce\x81\x57\xb0\xb5\xb3\x30\x23\x93\x9a\x9c\x47\x0d\x53\x67\x87\xc2\x6e\x09\x1d\x98\x67\xc5\x67\x7f\x68\xef\x6f\x65\x64\xa4\x30\x94\xdd\x00\x21\x82\xf6\x5f\xd0\x81\x2d\x0a\xc3\x85\xab\xf4\xf6\xe0\xfb\x93\x6d\xbd\x01\x92\xda\x06\xb6\xc6\x76\x5f\x08\x93\x50\x20\xaf\xdc\xe4\xe5\xa3\xc2\x80\x96\x18\x43\x91\x36\xa8\xf4\x97\xad\x9a\x3a\x1a\x5d\xde\x1e\xbd\xe3\x0a\x51\x7a\xbd\x84\xc4\xde\xe7\xb0\x6c\x85\xc4\xd4\x95\xe3\x4d\xd0\xc2\x4b\xa2\x17\xd6\x7d\x77\xdf\xeb\x9e\x6e\x4b\xbc\x51\xdb\x87\x1e\x46\x5e\x80\x03\x7c\xab\x7a\xf6\x6a\x64\xde\xda\x3a\x5b\x2b\xf4\x11\xba\x8f\x4a\x3b\x93\xa1\x48\x3d\x88\x4b\xbf\x26\xf9\xcf\xbc\x44\x1a\x87\x57\x4d\x27\xa8\x7c\xcd\x71\x7a\x08\xb5\x7a\x03\xb0\xaa\xdc\x43\x89\xde\x8a\xc2\x01\x0b\x7f\x99\x16\x46\xac\x9c\xd9\xba\xa6\xa5\x94\xcd\x95\x9d\x40\x16\xb3\xc9\xaa\x6d\x8d\x11\xef\x7d\xc1\x54\x88\x71\x38\x9a\x0f\x96\xae\xb7\x87\x3e\x29\xf1\x01\xc3\x9c\x54\xfb\x42\x88\xed\x82\xeb\x88\x10\x72\xfc\x77\xbb\xac\x13\x2e\x40\xe6\x80\x80\x27\x09\xc1\x06\x89\x07\x22\xbf\x48\x59\xd4\x4d\xd6\xec\x9b\x50\x57\xcb\x65\x61\x2d\xd9\x8c\x50\x68\x55\x47\x91\xfc\x72\x63\x36\x96\x60\x2b\xa2\xa2\x11\x98\x0c\x20\x4e\x27\xe3\x79\x7b\x88\x3d\xc1\x51\xbb\x5e\x2a\x81\x61\x21\x0f\x00\x5d\xd9\xa8\x55\x2a\x0b\x42\xf5\xac\x68\x54\x07\x2f\x56\x13\xa1\x06\x68\x2d\xb4\x58\x10\xc5\x82\xed\xe7\xcc\x2b\x72\x13\xaf\x15\x03\x26\xd9\xea\xad\x77\x97\x92\xfa\xe2\xb2\xe3\x32\x8f\xd4\x8f\xee\x2d\x13\xff\x6c\xd1\x71\x8b\x6d\x58\xad\x25\x41\x20\x42\x38\xcc\x3b\xc4\x6e\x1b\xbb\xe6\x1c\xd5\x06\xc3\xe4\x45\x38\x91\x29\x54\xd4\x45\xab\x03\x48\x58\xa9\x54\xf4\x72\x08\x21\x69\x2a\xf9\x77\x70\x59\x0a\xb7\x41\x30\x6b\xe2\x01\x86\x63\x4b\x26\xce\xaf\x0c\x8c\x4c\xee\x6b\x09\xab\xe8\x36\xb6\xa7\x8c\x7a\x2a\x0c\x68\x75\x19\x0d\x44\x59\xe0\xf4\x60\x89\x75\xa2\x41\x56\x18\x77\xe0\x98\x1f\xb5\x04\xea\x61\xb0\x6b\x18\x80\x54\x11\xec\x2d\xee\x17\xf6\xea\x8b\x83\xca\xd0\x51\x9d\x2c\xf5\x42\x71\x3d\xfa\x0d\xc2\x09\x86\xac\x8a\xe5\x29\x60\x2c\x0f\xe5\x1e\x56\xea\xb9\x0c\x1b\x05\x38\x24\x3b\xbe\xce\xaa\xf5\x7e\x8b\x04\x25\x75\x8c\xdc\xf0\x4b\x44\x55\x96\xf5\x51\xf5\x22\x65\x93\x59\x32\xe8\x1d\x6c\xf7\x08\x9f\xf1\x46\x90\x81\x67\x2f\x61\x61\x01\x21\xcd\xbe\x10\x35\x7f\xe6\xf0\xbd\x0e\x59\x8c\x1b\xcc\x62\xa0\x27\x4e\xba\xdd\xef\xfc\xe8\x8c\x8b\x26\x3b\x3d\x87\x16\x3f\x78\x33\xb2\x2c\xcc\x25\xed\xc5\x59\x19\x9f\x30\xa2\x98\x9f\x3a\xb7\x55\x24\x24\xde\x52\x12\xad\x2d\xe0\x6d\x2e\xf3\xf2\x4e\x73\x37\xab\x21\x52\x71\xa0\xdc\x3e\x9a\xcd\x3e\x67\x9a\xbe\xf2\x36\xcf\xee\x22\x05\x74\xf0\x81\x72\x67\xce\xce\xf8\xf2\xf9\x38\xbd\x9e\xab\x53\x03\x88\x5e\x0f\xc6\xa6\xe5\x8e\x04\xdd\x5f\xbd\x34\x17\x6e\x8d\x02\x38\x67\xbf\xfb\xdd\x0f\xc8\x2f\x4a\x30\x73\x08\xbc\xf2\x0a\xe1\x95\xca\x12\xc6\xc5\x1d\x4d\x1c\x0f\x03\xa7\x6e\x98\x7f\x1a\x15\xa4\x98\x42\x93\xce\x84\xf8\x9c\x4c\x28\x77\x9f\x11\x8b\x39\x65\x1e\xcb\x47\xa4\xbe\xde\x94\xd5\x6d\x96\x76\x5f\xd3\x3b\x66\x75\x2b\xc4\x00\x6d\x89\xbf\x9a\xd5\x34\xf0\x78\x9a\xba\x2f\xae\x5a\xa3\x86\xe9\xd1\xea\x06\xd6\x48\xa1\x3c\x77\xd9\xd9\xa1\x81\x24\x9a\xa5\x74\xa1\x27\x00\x7c\xe1\xda\x1b\xb8\xc3\xd8\x61\x40\x7b\xa6\x8f\x29\x31\xb8\x83\x68\x8b\x97\x1b\xe3\x0a\x7f\xb4\x82\xef\x68\xef\xfc\x69\xdb\x68\xdb\x16\xac\x92\x84\x08\x53\x48\xa2\x96\xa3\x5f\xdf\xd0\x60\x06\x11\xe9\x5f\x36\x9a\xcc\x7d\x19\xb6\xed\xcf\x0c\x97\x3a\x0f\xc4\xd7\xad\x13\xbf\x17\x51\x25\xf6\xc2\x37\x75\x64\xcc\xe0\xcd\x22\xa1\x39\xaa\x1c\xd7\x4c\xef\x7d\x87\x74\x51\xef\xb2\xf5\x9e\x08\x2a\x8a\x54\xc7\xae\xf2\x50\x91\x51\x16\x58\x16\x4b\xb0\xaf\x27\x23\x5c\x6f\xcc\x67\xe7\x76\x7e\xc6\xa0\x1a\x16\x93\xba\x90\x90\x0d\xac\x61\x2d\x02\x79\xa9\x93\x2e\xca\xe2\x94\x2d\x93\x07\xc9\xc5\xa4\xe4\xb6\xdb\xf5\xba\xac\xd8\x08\xa7\x23\xe8\xc7\xb8\xb2\xd1\x8f\xc4\xf1\x06\xd0\xf8\xd9\xdb\xda\x11\x23\x3f\xc8\x47\x51\xa0\xed\x0d\x34\x03\x38\x28\x2c\x30\xc9\x0a\xfe\xe1\x48\x85\xad\xe2\x15\x6e\x07\xc0\x65\x22\x11\x97\x03\x52\xe9\x15\x60\x74\x2b\x53\x94\xf4\xdf\x40\x12\x23\xc3\xaa\x27\x05\xac\x08\xcd\x96\x8e\x28\x83\x7a\xbf\xdb\x95\xc8\x72\x21\xd1\xc1\x80\x02\x08\xa0\x0e\x61\xb6\x90\xc5\x26\x95\xaa\x64\x13\xff\x2c\x29\xf3\xee\xaa\x7b\x22\xb8\x9f\x30\x3d\x54\x27\x1c\xc6\xbe\x76\xd6\x04\x0a\x11\xf9\x92\x26\x0a\x6c\xe9\x93\x3f\x55\x20\xd8\xb7\x62\x29\xad\xe5\x9a\x98\xb9\xa8\xa5\x8b\x6e\x8c\xb1\xa8\xef\x84\xc1\x3e\x60\x0e\xb0\x55\xa5\xc9\xc6\x7b\x57\xa5\x80\x74\xc0\x03\xa5\x58\x0e\x61\x39\x2c\x40\xce\x1e\x6c\xd1\x78\xa7\x4a\x48\xe5\x6e\xff\xaa\x17\x65\xcf\xa9\x0b\xc9\x9e\xd0\xc6\x3e\xec\x04\xfc\xac\x6c\x00\x32\x8e\x75\x71\x2c\xf5\xa0\x26\x1c\x4f\xf8\x43\x44\x36\xd2\x94\x66\x70\x64\xa7\x0c\xb8\x73\xeb\x61\xc0\xf5\xb0\xc9\xaa\xaa\x61\xe9\xc4\x56\x21\xb7\x9e\x8e\x60\x46\xb0\x2c\xa0\x30\x15\xd4\x06\x6b\x2c\x4e\x27\xba\x5a\xa1\x2c\xe2\x1c\x58\xbb\x72\xad\x61\x34\x01\xee\xf5\x44\x6f\xbc\xd6\x9d\xae\x8e\x05\x2a\xd6\xb4\x39\xae\x2c\x61\x23\xc2\xea\x58\x75\x47\x90\xdf\x45\xf0\x46\x70\x36\xdb\xa2\x83\x04\x43\xc2\x62\x66\x0c\x15\xba\xb4\xd5\x54\xa4\xab\x2b\xca\x96\x6b\xa5\x47\x4d\x12\x87\x01\xc9\x68\x0f\x94\x63\x8f\xc2\x2e\x0f\x36\xcf\x52\xa0\xe9\x02\x90\x83\x2a\x80\x51\xe5\x0e\x5c\x00\x9f\x1f\x42\x61\x60\x26\x4c\xa5\xe9\x90\xe3\xf2\xf0\xd6\x7b\x5b\x3f\x91\x38\xa9\x13\x3c\x88\xd0\x2a\x26\x41\x86\xa3\x29\x94\x37\x7e\x3c\x28\x5a\x14\xdd\x48\x9d\xb7\xa8\x08\x33\x61\x07\xa0\x83\xcf\xbe\x81\x2e\xe1\xc0\x09\xe3\xbf\xc5\x74\x2a\x5b\x02\xd6\xf4\x12\x08\xb4\xbc\xd2\xaf\xe1\x0b\x20\x17\x26\x0e\x26\x61\x31\x0f\xd0\x0e\x41\xa2\x07\xac\xa0\x08\xf8\xd1\xb5\x5a\xe2\x27\x04\x62\x13\xca\x70\x4a\x11\x46\x49\x82\xf4\x48\xba\x5d\x05\x9c\xde\x5f\xc9\x52\x70\x8c\x0f\x80\x67\x47\x0f\x11\xb3\x92\x86\x2c\xb3\xaa\xda\xa2\x96\x73\x1c\x14\xed\x2c\xb8\x31\x11\x2f\x55\x56\xb1\x15\x54\x76\x9e\xcf\x56\x94\xb9\x75\x87\x12\x86\x84\x82\x58\x8a\x12\x04\x1d\x31\x74\x4a\x88\x83\xb5\xee\x9f\x3d\xd4\xd6\x92\x0e\x85\x1d\x82\xb2\xa7\x9d\x53\xa6\xcb\x71\x10\x85\x8e\xe2\x8a\xf8\x1f\xf4\xfd\x38\x2b\x8b\x53\xba\x1a\xdf\x95\xd5\xf6\xc8\xbd\xd8\x6e\x5c\x27\xe8\x7b\xfc\x36\xab\xcd\x77\x30\xf6\xdf\x1f\xbd\xd4\x54\x46\xae\x23\x69\xd0\x1b\xd7\xfa\x1a\x7e\x5e\x62\x46\xc3\x4b\xf2\xd1\x1e\xf4\xf5\x78\x1e\x5e\x18\x47\xc4\x91\x1b\x68\x7b\x5b\xa6\x18\x87\x85\x9c\xdc\xfd\xa1\x46\x45\x42\xc4\x60\x99\x93\x10\x60\x56\x7f\xed\x59\x9f\xc3\x04\x0c\xb7\xed\xce\x16\x59\xa8\x92\xeb\x8f\xd4\x65\x5f\xd0\xe4\xb0\x26\xdd\x57\x18\xfe\xe2\x27\xe3\xc3\xcc\x7a\x5f\x37\xe5\x16\x33\xfe\xa2\x19\xab\xc0\x79\x8d\xab\x10\x1f\xa7\xae\xe7\xff\xb0\x8e\x5a\x11\x93\x06\xfb\x2d\x31\x70\xae\xa3\x9d\x16\x08\x7f\x2b\xe7\x88\x46\x15\xf4\x4f\xc2\x47\x6a\x1d\x32\x62\x13\x70\x87\x57\x50\x85\xa8\x66\x1c\x0e\x65\x1a\x6e\x98\x52\x90\x9b\xbf\x2d\x53\x97\x07\x1e\x7f\x75\x13\x07\xb6\xf8\xf6\xc8\x50\xca\x11\x80\xb0\x51\xb5\xe0\xf1\xf8\xaa\xe4\x39\x64\x26\x18\x6b\x05\xad\xe0\x54\xe1\x91\x10\x61\xf2\x2b\x4d\xba\x12\x22\x5b\x43\x3d\x60\x50\x11\xc1\x38\x21\x6b\x53\xf8\x43\x0b\x13\xd3\xfc\x2e\xef\xed\xe8\x74\x03\x26\xbc\xe8\x78\x10\xa3\x15\x56\xcc\xc9\xab\xa1\x42\x90\x92\xf1\x7e\x6c\x70\x80\xb4\x52\x38\x76\x21\x25\x58\x45\x2a\x1c\xca\xd4\xa2\x85\x7a\x84\x3e\x29\x9e\x23\x42\x58\xe8\xd9\x89\x16\x9b\xd6\x68\x38\x1a\x37\x47\x0b\x06\xd8\x62\x0b\xe4\x63\x81\x7f\x42\x98\x07\xc3\xb6\xe5\x7a\x6d\x6b\x30\xa3\xc8\x41\xec\xe8\x82\x59\x66\x32\x21\xdb\x44\x6c\x91\xde\x16\xe3\x25\x28\x1b\xa2\xed\xd5\xed\x6f\xd9\x82\xfb\xe1\x56\x59\x32\x47\x76\xf0\x2d\x39\x46\xb0\x37\x71\x42\x68\xbc\x83\xa4\x29\x92\xb0\x98\x93\x36\xf6\x1d\x07\x7f\x48\xed\x87\x11\xd3\x9c\xb7\x32\xbd\x47\x67\x56\x2b\x89\x83\x66\x3a\xc1\x5c\xe4\x97\xf8\x62\x9c\x6a\x51\x05\xc3\x29\x87\xab\x45\x0c\x1b\xb2\xd0\x23\xc4\xfd\x73\xeb\xaa\xe5\x7b\xaa\x51\x11\x3c\x06\xf1\x71\xa9\x27\x45\xa7\x5f\xdd\x59\x96\xc9\xf1\xd7\x11\xb8\x0e\x77\xa9\x50\xdd\xd1\x6a\x3e\xc1\x50\x4c\x44\x6e\x69\x55\xf8\xe4\x30\x64\xe2\x1b\x38\xa3\x6a\x3d\xd0\xcc\x23\x15\x82\xcc\x2d\x92\xab\xad\xcd\x90\x09\x10\xa0\xed\x21\x0a\x5b\x9b\x02\x74\x60\xcb\x4e\xcf\xa4\x66\xd8\x81\x5c\x92\xd9\x64\x94\x95\xeb\xdf\x02\x8b\xc8\xd2\x7f\x44\xb2\x3c\xe8\xd7\x7d\x59\x53\xf1\x43\xdf\x37\x13\x5a\xed\x40\x8d\x41\xc1\x43\xb4\x9b\xb4\x54\x0d\xfa\x79\x2a\xfb\x19\x1f\xec\x21\x17\x1c\xab\x4a\x29\xa7\x4d\x28\x95\xdd\xd1\x7d\x40\x3a\x3e\xce\x55\xa7\x4d\x79\x0a\x04\xb3\x00\xa8\x12\x08\x5d\x8b\x36\x0c\x1d\x71\x34\x90\x1c\x80\x34\x70\xac\x7a\x52\xcb\xbd\xab\x21\x0a\xb0\x55\x8e\xea\xa4\x61\x13\x05\x95\xad\x58\x95\xb6\x25\x3c\x84\x2e\xac\xda\xed\x29\x99\xf3\x68\xa5\xc3\x25\x10\x34\xbb\x5b\x0d\x63\x85\x5b\x1d\x47\xc8\x28\xa1\x91\x6a\x3e\xe4\xfe\x9d\xe3\x17\x7e\x94\xc6\x3e\x24\x61\x2f\xb6\x18\xa7\xc3\x15\xd0\x39\xcd\x14\x9c\xe7\xc6\x3b\x53\xd7\x78\xd5\x81\xb4\x6a\x74\x81\x0e\xd6\x65\x51\xef\xb7\x68\xe8\xc3\x47\xd8\xd9\x08\x88\xa1\xc6\x16\x77\x00\x2c\x43\x95\x0f\x34\x3f\x76\xae\x6a\x0e\x1a\x78\x52\x6d\x91\x18\x8e\xaf\x40\xfe\x70\x62\x36\x76\x9b\xe5\xa8\x66\x75\x5f\xee\x6b\x77\x5f\x82\x00\x18\xca\x77\x86\x4b\x8b\x93\xb0\x92\x3d\x86\x7b\x34\x4f\x09\x35\xb9\x2e\xab\x5d\x59\x31\x96\x11\xb0\xda\xe9\xa3\x83\xf0\x38\x70\x08\xa5\x0e\xc9\x62\x68\x7b\x21\xf0\x50\xee\xf8\x8c\xb0\x73\x51\x5f\x13\x93\x96\xfb\xdb\x66\xb3\xcf\x01\x76\x54\x87\x28\x7e\xe5\xea\x32\x7f\xc0\x61\xde\xd8\x87\x92\x64\x87\x1e\x5c\x25\x62\x9d\x6d\x1c\x12\xbc\x46\xee\x17\x30\xb0\xd4\x07\xbc\xe3\x91\x98\x41\x34\x4c\x11\x2c\xd9\x34\x87\x1d\x4b\x6c\xfb\x3b\xac\x2c\x02\x18\xc7\x36\x66\x9d\xdb\xba\x56\x05\x11\xed\x20\x00\x27\x60\xf7\xf2\xaf\xd6\xcb\x89\xae\x04\xb6\x06\xf0\x3c\x29\xdc\x4a\xfb\xa3\xa8\xaf\x86\xad\xc4\x09\x72\x5f\x90\x6c\xaf\xac\x70\x31\xef\x30\xb0\xce\x45\x18\xca\x9a\x1a\x99\xf1\xd3\x83\xde\x6a\x38\x4f\x95\x36\xc8\xee\x81\xe3\x47\xaa\x25\x22\x61\xf2\xac\x48\xf7\xde\xba\xc5\x91\x2a\xca\xe2\x54\x5e\x80\xad\xdd\x17\xf0\x68\xb8\xcb\xfd\x6f\x82\x82\x35\x6e\x13\x6f\x0d\xf8\x05\x06\x21\x42\x8c\x47\x39\x02\x01\xca\xd0\x51\x57\x00\x47\x3e\x45\xf4\x0b\x2e\xbc\x69\x81\xd2\xac\x00\x6f\xc6\xbb\x5a\xef\x2f\xb5\x69\xb6\xae\xb9\x2f\x53\xbc\x30\xd6\x2e\xdd\x57\xa0\x7f\x82\xac\xd8\x44\x95\xfd\xd9\x1d\x48\x82\x9d\x54\xe3\xe4\xd9\x4a\x6c\x2f\x54\x01\x81\x7c\x2f\xa0\x6e\x5c\x7f\x29\x50\xd7\x07\x84\xa5\x13\x35\x90\x4c\x90\xf6\xf7\x0d\x29\xe3\x1c\x33\xc4\x5c\xd4\x3a\x2c\x7f\xdb\x6f\x36\x19\xde\xe1\xb1\xfc\x99\x13\x35\xbe\xd4\x6c\xf6\x05\x9c\xa1\x8a\xc9\x53\x5e\xdd\xba\xf0\x91\x3e\x1e\xe0\x7f\x54\x4c\x81\x47\x00\x86\x69\xb0\x5b\x88\x70\x81\x34\xe1\xad\x43\x3f\x3b\x4a\xae\x08\xeb\xce\xd6\x12\xce\x92\x28\x38\xd8\x4b\x2e\x3a\xc7\xa4\x0e\x0a\x0a\x0f\x2d\x3a\x5f\xfe\x75\x98\x23\xd3\xe0\x96\x4d\xc9\xd4\x13\x49\x6b\xf6\x03\xc4\x46\x19\xe7\x58\xd5\x64\xeb\x90\x11\xc4\xeb\xcf\xf2\xab\xd4\x3e\x24\xe0\xc5\x46\x07\x1f\x55\x55\x8c\xff\x48\x34\x99\x59\x2d\xd8\x64\x75\xb7\x89\xa5\x46\x28\xa5\x9d\x6b\xf6\x59\x73\x50\x95\x95\xe0\xc9\x02\xe2\xe3\xa4\x37\x94\x18\xb7\x10\xaa\xe3\x80\xa4\xb3\xca\xfe\x9d\x20\xbb\x47\xae\x2f\xec\x77\x1c\x32\x16\xd9\x04\xa2\xcc\xef\xf1\xb7\x8f\x6d\xb1\x91\x79\xbb\xa7\x64\x8c\x0e\x14\xb7\x78\x23\xb3\x8d\x29\xe8\x4e\xf3\x53\x5d\x10\x13\x8e\x32\xf1\x50\xdc\x8e\x20\xb5\x16\x8a\x5a\x0f\x7a\x67\xf5\x2e\x49\x4a\x2e\x44\x03\x7e\x12\x51\xe7\x47\xf1\x4b\x58\x76\xf4\x40\xbc\x37\x16\xf3\xab\xa1\x80\x7f\x74\xfb\x95\xf3\x73\xac\xe7\x5d\x98\x9b\x6d\x3f\x22\x48\x5e\x86\xc7\xb1\xa3\xed\x6d\x44\xc0\x73\x73\x26\x06\x96\x31\x2a\xe0\xd5\x1d\x09\x95\xb0\x6b\x64\x1c\x2a\xd5\x15\x9a\x24\x59\x56\x09\xaf\xa4\xee\x7a\xe4\xc5\x9c\x3d\xf7\xd0\x91\x19\x2b\x8d\x1a\xb6\xf4\xc9\x90\x4f\x1d\x2c\x0e\x50\x64\x6c\xe7\x73\x48\xb9\x45\x20\x09\x9c\x19\x4c\xfd\x41\x86\xfa\x53\x1b\xb8\xa9\xe0\xac\x0f\x59\x58\xdc\x3d\xfc\xa2\xb2\x32\x0f\x59\x99\xc3\x68\x34\x42\xc2\x4b\x68\x1a\xd4\x95\xa4\xb2\x2a\x0d\x4d\xb3\xeb\xaa\xac\x6b\xfd\x20\x02\x3b\x3c\xb1\x13\xf0\x4c\x38\x3a\xcd\x6c\xfb\x76\x9c\xcd\xde\xad\x83\x65\x3d\x28\xd9\xcf\x41\x8b\x20\x55\x4c\x0c\x16\x20\xa1\xca\x84\x4b\x5d\xd4\xed\x2f\x80\xdc\x0e\x99\xc7\xbc\x0e\x6e\x60\x51\x06\x82\x4b\x5b\xd7\xa0\xcf\x5e\x56\xfe\x2a\x23\x16\xc3\x9d\x5d\x7f\x86\x1c\xb6\x92\x9d\x26\x3f\x4a\xe8\x77\x43\xf6\x63\xe5\x38\x9e\x39\x50\xbf\x0d\x39\x85\x7a\x80\xba\xb2\x01\xc4\xe2\x97\x38\x21\x8e\x8f\x23\x77\x6e\x0f\x8c\x6c\xc1\x8a\x04\xac\x93\x03\xd0\x9e\x12\xad\xa3\x3b\x2f\xe4\xb0\xa2\xa6\xa9\x46\x50\x41\x1a\xe5\x78\x22\x26\x57\x4e\x36\x71\x92\x41\x2c\x48\xa5\xb3\x1b\xca\x70\x0f\xa8\x05\x18\xc3\xbd\x23\x9e\xca\x6e\xe5\x84\xa4\x76\x30\xf8\xd6\xa9\x18\xca\xed\x23\x78\xd5\xb6\xbf\xe9\x78\x46\x32\xcc\x5b\xc3\x50\x25\x03\x4a\xd5\x89\x95\x88\x52\x80\x0d\xaf\x32\x38\x7c\x9a\x43\x99\x6b\x78\x36\x26\x87\x7a\x06\x81\xd1\x62\x77\xde\x1c\x29\x7a\x40\x77\x8c\x41\xc3\xdb\x87\x7b\xdd\xdf\x83\xa3\xd0\x12\x8c\x2d\xf5\x81\x4c\x7a\xc4\x65\x2a\xb7\x2d\x09\x78\x72\x64\xa0\x82\xf8\xa3\x68\xef\x8a\xa8\x0b\x0f\x5b\xd6\x8c\xcc\xc9\x91\x35\x42\x63\xc7\x71\xae\x00\x7d\xa5\x5c\x4d\xf9\x48\xad\xb0\x39\x38\x6f\x44\xdd\x80\x8e\x87\xa8\xcf\xb6\xa0\xd2\xa3\xa1\x04\xfa\x29\x62\xd3\xff\x72\x20\xa9\x64\x41\xde\x48\xcb\x03\x0e\xd8\x78\x88\x62\xf4\x1a\xa4\xeb\x98\xf4\x00\xa2\xb0\xbd\xf8\x89\x96\xd4\xd5\xac\x6c\xfc\x24\x42\x21\x07\x23\xc8\x98\x8b\x86\x0b\x95\x3b\x31\x7f\x2c\x59\x21\x2c\x19\xab\xe2\xf7\x34\x90\xe7\x10\x50\xf6\x64\x32\x87\x8b\xa8\x43\xa1\x2b\x4e\x12\x3f\x7b\xf8\x75\xa7\x04\x1e\xb4\xfe\x4f\x2a\xf1\x70\x41\xc8\x1e\x70\x23\x19\xc7\x50\x56\x98\x6f\x82\x32\x93\x8c\x2d\x08\x89\x35\x31\x22\xb8\x3f\xb7\x72\xf6\x3d\x1c\xa3\x67\x3f\xb4\x1b\xf0\xc6\x94\x55\x48\x04\x2c\xa4\x4c\x93\x14\xbe\xe4\xe6\x0a\xf5\x2f\x2a\x44\x8c\xb9\x2e\x01\x8f\xb0\xbc\xa6\xb0\x13\x04\x71\x03\x35\x30\x78\x07\x43\x3b\x8f\xa6\x37\x39\x01\x8a\x03\x8e\xf9\x30\x25\x19\x9d\x35\xaa\xd9\xeb\xa1\xdf\xf3\x02\x19\xdb\x66\xb5\x38\x5b\xd1\xbd\x8b\xd4\xbb\x9d\x79\x42\x8e\x58\xe9\xf7\x11\xa2\x06\xc1\x9a\x71\x27\x02\x73\x03\x50\x9f\xc8\x90\x3c\x42\x89\x5b\xad\x62\x80\x32\x2b\x6d\x36\x64\xd5\x87\x74\x68\x2e\x79\x6e\x1b\x2c\x78\x6b\x09\xb9\x70\xa8\xc2\xb7\x04\x85\x5e\xca\x0d\xa5\xce\xcb\x4a\x8d\xbd\xb8\xde\xdc\x52\xf5\x16\x37\x34\x17\x6e\x9d\xe3\x18\x36\x25\xe2\xaf\x5b\x50\xb4\xca\xa6\xce\x77\x0c\xc1\x7f\xe4\x66\x30\xf9\x33\xfc\x15\x5f\x9f\x84\x8f\xa2\xff\x48\xe6\x1e\x8c\x4a\xad\x5e\xba\xd1\xab\x2a\x2b\x52\xb7\x2d\x22\x20\x5a\xe8\x83\xe2\xd1\xe8\xcc\x12\xaa\x3c\x29\x8c\x84\x3f\x81\xeb\xa8\xa3\xa0\x5e\xd4\x3b\x73\x59\x33\x24\xb9\x7b\x60\x92\x42\xe1\x76\x5b\xd7\xfb\xed\x4e\xc8\xad\xc3\x8e\x6a\x7b\x30\x94\x32\x29\x0e\xfa\x33\x74\x29\xd6\xee\xe8\x33\xa5\x0a\x37\xdb\x22\xde\x98\xcb\x07\x7a\x3b\x2c\xc8\x79\x3c\xbf\x5a\x30\xaf\x36\x54\x03\xae\x62\xc5\x47\x3e\xe0\xe8\xb9\x80\x25\xc1\x6a\x51\x64\xe9\x5b\x67\xd9\xff\x0d\xd8\x54\x09\x84\xf3\x9d\x19\x23\xe4\x10\xdf\x43\x7d\x0f\xb7\x4f\x12\x88\x1b\x2d\x4b\x95\xf4\x20\x77\x8e\xde\xbb\x1a\x9b\x82\x0e\x20\x9b\x91\xd6\xf4\xf4\x23\x51\x2a\x4d\x70\x7d\xe2\xd8\xbb\x6a\x8b\x16\x47\x87\x3d\x4d\x37\xaf\xe7\x79\x60\x2f\x60\x6e\x1d\xe0\x45\x82\xe1\xc5\xa2\x8f\x08\x32\xdc\x4f\x63\xdb\x7b\x61\x84\x65\x18\x77\x3c\x3a\xf7\x95\x9e\x6b\xda\x55\x40\x90\xd0\x45\x5f\xab\x03\xed\xee\xbe\x7a\x00\x86\x2a\x7f\x1c\x1d\x6b\xbf\x0e\x3b\x40\x73\xd1\x76\xed\x34\xfa\x09\x83\x5f\xf3\x1e\xf9\x5b\x5f\x40\x6a\x82\xf1\xd2\x65\x3e\x09\x0a\xaa\x35\xa2\x3d\xd0\xb2\xa5\x94\xf1\xac\x40\x08\x7e\x3b\xd0\xd7\xc1\x1d\xa4\xd5\x94\x15\xa8\xfc\xd2\x9b\xa3\xd0\xd6\xaf\x18\xee\xe3\x0e\x96\x49\xed\x9e\xb2\xbd\x9f\x12\xb6\x93\x62\x55\xd4\x50\x89\xaa\xcc\x4e\x36\xa5\x34\xbf\x3a\x7d\x0d\x78\xd4\xd9\xb2\x7f\x43\x7e\x7d\xf9\x10\xe7\x26\xa8\xbb\x14\x1b\x78\xb4\x07\x11\x1b\x20\x56\x71\x36\x66\x34\xbb\x7b\x28\xa7\x08\x8c\x47\xad\x99\x7b\x92\xcb\xfd\x18\x8f\x3b\x33\xb8\x87\x9a\x0a\xf4\xdb\x3b\x2f\xcb\x7e\x3d\xba\xf6\x08\x1e\x00\x07\x09\xb8\x15\x42\x29\xd8\xae\x11\x72\x21\x68\x62\xef\x2a\xbb\xbb\x8f\xce\xac\x33\x8c\x66\x7c\x50\xf0\x2a\xb0\xc8\x41\x9c\x1e\x58\xfc\xc0\xa5\x3e\xc6\xbf\x5f\xc4\xb5\x25\x14\x88\x54\xa1\xe7\xb6\x5d\x87\x18\x44\x08\x19\xa0\x53\x3b\x0c\xb6\x25\x66\x77\x29\xd4\x0b\x21\xb2\xa2\xc9\xda\x72\xd9\xf4\x18\x5d\x6f\x54\xa4\x7e\x35\xc7\x83\x18\x17\xbd\x84\x0a\x59\xbf\x68\x2d\x96\xd6\x27\x01\xad\xd4\x7a\xf8\xc6\x66\x48\x46\xe4\xf7\xcf\x86\x32\x8c\xa4\x1b\x2b\xc3\x01\x34\x39\x5b\xa7\x6d\x15\x0c\x14\xef\xaa\x0c\xcb\x68\x7f\x78\x69\x52\xb0\x5e\x82\x7a\xb6\xab\xeb\xb0\x42\xaf\xca\xca\xa1\x66\xdf\xdf\x36\x88\xaa\x4f\x47\xbb\x04\x3d\xc9\x5c\xfd\xcb\xfa\x92\xe0\x8c\x67\x68\x18\x6c\xb2\xaa\x6e\x90\xea\x5e\x7c\x0c\xb9\xda\x82\xc6\xd6\xd1\x15\xc3\x65\xa6\x07\x2a\x2e\x8d\x9d\x33\xdd\xdc\x00\x45\x5e\xef\x29\x4d\x18\x9e\x2a\xe3\xfb\x3a\x1a\x5f\x82\x5b\xac\x5d\xb6\x93\x03\x53\x4b\xbf\x85\xe3\x41\xca\x61\xba\x7b\x8c\xf7\x85\xdc\x0e\x61\x57\x36\x9a\xb7\x13\xea\xb7\x9f\xd6\x4a\x08\x52\x09\x4f\x29\x25\x30\x9f\xb4\x7c\x16\x1e\x05\x31\x36\x25\x93\x80\x30\x88\x26\x9a\xe9\xb0\x00\x12\x5d\xb0\xc4\xba\xae\xe0\xaa\x22\x30\xbf\x70\x8f\x31\xe3\xa8\x00\x06\xe4\x8e\x8d\x11\xbe\x67\x2f\x59\x31\x63\x8c\x14\x5b\xc5\xda\x79\x4f\x82\x0c\x4f\xca\x05\x7e\xc0\x6a\xaf\x56\x31\x01\x43\xfa\x74\xb2\x03\x89\xba\x3a\x75\x58\x65\x95\x22\x6a\x44\xb1\xf4\x41\x01\x5c\x84\x31\x91\xb2\xc0\x71\xb1\xce\xf2\xdc\x22\xd2\x59\xe8\x43\xba\x29\x12\x88\xce\x83\x75\x4c\x59\x05\xcb\x19\x2b\xf7\x97\x3d\xc3\xf0\x9f\x49\x60\xeb\x56\x51\x73\x84\x8d\x5b\xd6\x06\x87\x02\xac\x0c\x92\xaa\x6a\x66\x55\xd7\x88\x31\x40\x83\x77\xfd\x31\x8d\xdb\x31\x86\xef\xf6\xde\x55\xc5\xa1\x53\x9e\xe8\xa8\x3a\x19\x5d\x42\xa4\x9f\xd1\x2a\x4f\x1b\xbd\x2a\x7a\x66\x20\xe2\x4c\xbb\x3d\x28\xc2\x19\x2c\xc9\xc3\x11\xee\x94\x5d\x26\x94\xd1\x07\x8b\x82\xee\xaa\x30\x00\x9d\x2d\x8f\xdc\x3b\x84\x9d\xf5\x16\xf2\x98\x2f\x3d\xfa\x08\x19\xd1\x17\xe5\x63\x51\x37\x95\xb3\x5b\xb3\x10\x50\x4a\x50\xa9\x90\x43\xe7\x48\x15\x52\x9c\x22\x89\x2f\x56\x9a\xc7\x5a\x99\xb6\x5d\x17\x52\x9c\x88\x84\xaa\x53\x93\x30\xf6\xba\x1c\x13\x79\x4f\xe0\x9d\xf5\x1e\x13\x0b\x4d\xd9\x1a\xd7\x78\x1b\x10\xe9\x26\x21\x31\xa4\x1e\x48\x69\x9a\x90\x45\x1f\x4a\x7f\x94\xf1\xa8\xc9\xb6\xc6\x85\x19\x90\x44\xab\xca\xe5\x0c\xd0\xd2\xd7\xd9\x1d\xc9\x1f\xe1\x7b\xb0\x82\x11\xeb\xd6\x34\x3b\x15\xda\x5e\x11\x81\x1d\x4a\x6d\xd6\x0e\x21\xac\x28\xdb\x0a\x9f\x01\x7c\x18\x9a\x1c\xdd\x67\x6c\x5d\x75\x87\x0b\x47\x53\x5f\xf9\x93\xed\xe9\x9d\x8a\x90\x60\x86\x50\x15\xa6\xdb\x39\x42\x89\x63\xc2\xa7\x61\x1a\x47\xd5\x55\x7f\xfa\xaa\x09\x8e\xc0\x69\x00\x16\xc9\x6b\xf5\x81\xc7\x7b\xdb\x80\x42\x46\xd0\xa2\x29\xc3\x67\x39\x6b\x7e\xf8\x06\x88\x07\x53\xa8\x2e\xc4\xe0\x0a\xe4\x2b\x5d\xdd\x98\x7b\x9b\xa2\x63\xb0\xcf\xa9\x72\x67\xaf\x68\xde\x58\xc0\x96\x4d\xad\xc4\xec\xf2\xbd\x6f\x17\x55\xef\xb5\x2b\x10\x8e\xe6\xdc\x22\x4e\x18\x25\x90\xdb\xd7\x26\xb1\x63\xf4\xdf\x01\x17\xdf\xb4\xa8\x76\xa9\x14\x4e\xee\x78\xb7\xd9\x94\x55\x4b\x54\x10\xd2\x53\xe8\x61\xfb\x53\xa7\xcf\x11\xe6\x2c\x1a\x95\xdf\x49\x6b\x5b\x45\xea\xfe\xae\x87\x52\xf0\x23\x06\x74\xc4\x95\x70\xe8\x79\x7d\xd8\xae\xce\x25\xa6\x2a\x0f\x36\xa7\xa4\x57\xa9\xa0\x6d\xb8\xad\x54\x53\x9e\xad\x95\x8f\x0b\x9d\x30\x1f\x97\x35\x10\x34\xcb\xb3\x86\x4a\x32\x63\x14\x2e\x24\x89\x4e\xb1\x3a\x10\xa7\x1f\x20\xa0\xf0\x6f\x48\xe0\xe4\xf6\xb1\xde\x67\xcd\xd0\xef\x20\x77\x27\xae\xbb\x32\xd0\xe9\xc3\xe1\xb0\x4e\x43\x46\x23\xc1\xfb\x28\x31\x35\x62\x5f\x92\x80\x32\x04\xe0\xa9\xcd\x89\xd4\x77\x0b\x18\x25\x0a\x6a\x69\x7a\x34\xff\x9e\x00\x5f\xa2\xa2\x8c\xb3\xb3\x91\xb9\x26\x06\x47\x21\x5f\x2b\x30\x94\x58\x56\x03\x86\x72\xb4\x4c\x45\xbf\xa5\x24\x40\x0b\xe8\xfa\x3e\x2f\x24\xbe\x9d\x15\x45\x5b\x44\x9e\x72\x1d\xc8\x26\xa1\xba\x6b\x14\x2a\x97\xa0\x80\x5a\x18\xfa\x42\x45\x01\x63\x0d\xa8\x95\xdf\xd4\x51\xa3\x85\x87\x4e\x8a\x31\xa2\x4f\x06\x6a\x18\x3d\xea\x94\x70\xf2\x87\x5b\xf4\x6b\x53\x3e\x12\x24\x89\x0e\xc9\x5c\x07\xa4\xe5\xc1\x81\xce\x98\xd5\xb8\xed\x9a\x8c\x1b\xbf\xd3\x5c\xe5\xd0\x02\xe5\xdf\x26\x7c\x4b\xf8\x33\x02\x32\x7c\x6a\xc2\xc1\xce\xde\xda\xa2\x00\xbd\x2d\xa9\x93\xee\xc2\x93\x37\xed\xb5\x01\x31\x41\xac\x1c\x66\x16\x83\xd6\xa0\x60\xee\x86\xae\x7c\xce\x31\x53\x57\x8f\x35\x09\x92\x48\x7d\x16\x12\xef\xfc\xbe\x42\xd7\x9e\x77\xe3\x7e\xd6\x51\x55\x54\xc3\x11\x6e\x93\x84\xe6\xb1\xcc\x07\x81\x04\x25\x00\x24\x24\x7c\x4a\x33\x14\x34\xd0\x50\x09\x8f\xc6\x8c\x55\x64\x45\x12\xbb\xb9\x6f\xc5\x07\xda\x64\x61\x62\x43\xe8\x46\x2b\xeb\xcb\x42\x30\x43\x4a\xf2\x13\xbf\x3a\xf3\xf4\x31\x4b\xc3\x99\x73\x8a\x0c\x32\x91\xa3\x1d\x97\xb4\xab\x35\x78\x64\x09\x26\xcc\x66\x97\x20\xba\xca\x4f\x25\x6d\x73\xb5\xc7\x71\x83\x07\x16\x14\xe4\x69\x78\xc2\x1a\x71\xa2\xfe\xac\x32\x9f\x9d\xb9\x51\x22\xc7\x5a\x24\x0b\x7b\x45\x77\x15\x84\x9c\x06\x71\x27\xf1\x88\x28\x0e\x1c\x13\x31\x41\xc6\x8f\x12\xe9\x59\x83\x41\x37\xaa\xcf\x32\xa9\x2b\x4a\xf2\x5a\x90\xa9\x1e\x90\x44\x40\x2f\x01\x3e\x2d\x3c\xfd\x44\x18\xd8\x0a\x79\x72\xdb\x08\x26\x2a\x5e\xf9\x0e\xbc\xef\xc1\x15\x16\xeb\x1b\x91\x52\x9d\x82\xfa\xf8\x09\xcd\xc1\x38\x04\xfe\xd6\x01\x4c\xf3\x40\xd8\xc9\xe3\x09\x84\xe8\x1d\x5a\x16\xc2\x13\x49\x4c\xe2\x88\x18\x3f\xd2\xd9\xa3\xdd\xd2\x05\xde\xf0\xdc\x3e\xb0\x52\xcb\x70\xfd\x5c\xc0\x64\x80\x99\x9a\xa3\xf5\x5d\x74\x9a\x1a\x30\x48\xcf\x1a\x0b\x4c\x9c\x10\xc3\x7f\x31\xd0\x2f\x2c\xe0\xb0\x9c\xcb\x4d\xa8\x15\x4e\x9f\x2f\xed\x09\x9c\x8a\x02\x4e\x08\x2f\x69\x15\x1b\xc8\x0d\x0d\x70\x01\xff\x49\xc0\x85\x64\x51\x5c\x81\x73\xa3\xfb\xba\xd1\xe8\x55\x2e\xb4\x3a\xd2\xd7\xa6\x84\x38\x63\x19\x5e\x1e\xb0\xa6\x55\x85\x34\xd5\xa5\x49\xdd\xae\xf2\xb6\x99\xf7\x4e\x00\x59\x42\x43\x74\xeb\x0a\xb7\xc9\x9a\x80\xa6\x8c\x16\x84\xf0\x93\xab\xd0\x8b\xb0\x78\x9d\xbc\x96\x37\x24\x7f\xd3\x81\x94\x44\x24\xd0\x9d\x46\x80\xc3\x24\xbe\x50\x00\xe8\x8f\xcc\xe0\x8f\xed\xb5\xc2\x14\x7e\x12\x8d\xa1\xb4\x89\x90\xd5\x10\xc7\xa9\xbf\x15\xd8\xef\x6f\xaf\x2c\xe2\x05\xd1\xa0\xe3\x4e\x44\x9b\xb8\x3f\xd1\xf6\xe2\x38\x0b\xb6\x0b\xcb\xef\xfa\x2a\x14\x5b\xdf\xc4\xab\x47\x1c\x55\x0d\xd9\x40\x29\xfd\x0d\xb2\xa9\x32\xa1\x32\x67\x39\xe9\x01\x2d\xd1\x0a\x34\x62\x71\x35\xe4\x99\x7b\x70\x01\x4c\x41\x9b\x2e\xf1\x77\x51\xbd\xb7\x88\xab\x42\x8b\x79\x5d\x16\x85\x8b\xe8\x42\x49\x38\x5b\x7b\x14\x7e\xbf\xe0\x3c\xe3\xc9\xa6\x0b\xe4\x95\x67\x0c\x5e\xdb\xae\x2a\xd7\x7b\xf6\xb2\x1e\xdc\x81\x5c\xe0\xa4\xb3\xcd\xa1\xa8\x1b\xae\xb7\xbe\x63\x08\x85\x60\x15\xc2\x17\x00\xae\xde\x67\xe9\x9d\x12\x36\xce\x84\x6b\x87\x11\xbb\xd2\x36\xb9\x2e\x24\x87\xe1\xfb\xca\xc4\x77\xda\x49\xea\xb8\xd1\x45\xdf\xa2\xf4\x63\x80\xcd\xcf\xea\x96\x77\x8d\x2b\x99\xe2\x3c\x31\x89\x41\xdf\xa2\x80\xe0\x37\xa4\x9f\xa5\xda\x9f\x8c\xd5\x71\xfb\xa5\x59\x6d\x06\x69\x56\xaf\xab\x0c\x2e\x14\x14\xd9\xdf\xf4\xd2\xc5\xa9\xc4\x5c\xbd\x2e\x77\x0a\x05\x84\xe0\xee\x44\x48\x50\xea\xb6\xe7\x92\x10\xfc\x59\x00\x43\x81\x82\x00\xed\x82\xe0\x58\xb4\x60\x46\xca\xe5\x11\x28\x51\x04\x2a\x3d\xee\x81\x8c\x5a\xda\xb3\xbd\xd5\x9e\x94\x6d\xaa\x9c\x5c\x53\x50\xd7\xae\x57\xa7\x64\xfd\x14\x2c\x32\x88\xd7\xe3\x91\xe7\xad\x47\x42\x82\x86\x12\x42\x08\x8e\xb1\xb0\x04\xb6\x2f\x80\x47\xe0\x12\xdc\xd9\x03\x83\x12\xa3\x1c\x42\x73\x88\x79\x1a\x08\xd5\xc4\x21\x55\xe2\xcb\x3b\x20\xb4\x5e\x9f\x2a\x61\x23\xe8\xf7\xb5\x9f\x8d\x86\x59\xc2\xa4\xde\xad\x4d\xe1\x5d\x13\x3c\x48\x38\x38\xd7\x59\x60\x1c\x6b\x4d\x50\xb9\x54\xad\x9e\xf6\xfa\x02\x9a\xce\xee\xa1\x10\x17\xc0\x45\xcf\x16\x24\x2c\xc1\x70\x4e\x10\x06\x97\x01\xc3\x6d\x2a\x61\xa5\x52\x94\xc0\x87\x78\x75\xdc\x0e\xcd\xae\xca\xa8\x9c\x10\x2f\xe4\xb4\xef\xd5\xb2\x43\x45\x20\x01\x0d\x0f\xae\x75\xae\xf9\x48\xc4\xfa\xa4\xee\xfe\xa5\xdc\x89\x6f\x9b\x83\xe8\x40\xca\xa2\xfc\xb0\x3e\xd5\xa9\x56\x46\x74\xf9\x32\x26\x8f\x56\x1c\xe7\x24\x04\xda\x5f\xfd\xb3\xb9\xb2\xd5\xfa\x1e\x64\xbd\x18\x29\x74\x2f\x1c\xab\xca\x2b\x14\xa4\x1c\x50\xab\x55\x7b\xc9\xea\x91\x27\xad\x31\x37\xc0\xb2\xb3\x45\x96\x7e\x25\x77\x4c\x02\x0a\x6e\x23\x01\x9a\x88\x5c\x9b\x50\x0c\x07\x65\x1f\xdf\xba\x18\x00\x19\x22\xed\x2a\xb7\xc9\x1d\x25\xaa\xa7\xb3\x57\x23\x33\x2b\xcd\x52\x54\x79\xca\x0d\xaa\x9e\xd7\xdf\x80\xc0\x54\x5a\x6e\xd9\x7a\x6b\x71\xdf\x61\x74\x22\x25\xe2\x2e\x73\xc2\xbe\x21\xb0\xbb\xed\x81\x2b\x05\x33\x18\xda\x7a\x94\xc6\x0e\xc3\x14\x56\x36\xcd\xd6\x82\xad\xe7\x57\xf4\x65\xd9\x0e\xec\xd3\xb9\x2f\xeb\x3d\x1d\xc7\x12\x15\x3a\xfe\x5d\xd1\xaa\x24\x71\x82\xfe\x73\xc6\xdb\x52\xb5\xae\x07\xab\xb3\xed\x3e\x6f\x2c\x4b\xa0\x20\xe0\xae\x43\x55\xd5\xcb\x1c\xc2\x15\x5e\x55\x83\x44\x24\xea\x6b\x74\xb9\x74\x3c\xcd\x43\xf7\x20\xcc\x1a\x63\x81\x1c\xa4\x15\x23\xe2\x13\xd1\x0f\x2c\x9c\x4b\x21\x07\xce\xd5\x70\x8c\x8e\x5b\x7b\x5f\x7e\xed\x6f\x5b\x72\xe1\x60\xdb\x49\x4d\xa4\x1c\x4c\x6a\xc7\x36\xa5\x3f\x5e\xb6\xda\x58\x6f\x01\x2a\xa9\xce\x84\x14\xd7\x28\x06\xc8\xa3\x06\x02\x36\xf4\x24\x11\x74\x88\x91\x69\xec\x7c\x43\x6e\x61\x53\xf9\x2d\x8c\x18\x4b\x86\x9a\xc5\x07\xa6\x66\xf7\x39\x7b\x3d\x32\x37\xb5\x92\x6d\x79\x3f\xbb\x31\x63\xef\x3c\x96\x4f\xc9\x33\xfc\x55\x80\x3e\x31\xb2\xda\xb4\x22\xc5\x67\x3a\x8f\x6e\xb3\xc2\x75\x72\x12\x7c\x17\xf5\x29\x2f\xf4\xca\x4a\x3c\xd9\x7c\xae\x06\x23\x03\x2d\x50\x5b\x04\xd6\xd3\x88\xc0\x20\xd6\x30\xc0\x30\xd3\x31\x80\x20\x08\x8a\x07\x9c\x7d\x44\xe2\x00\xb0\x1c\x29\x80\xeb\x9e\xb0\x0c\x8e\x65\xbc\x74\xd7\xd2\xff\x8a\xce\x25\x21\xd3\xf6\x3a\x61\xd5\x6e\x3c\x4e\x03\xa1\x7d\x70\xb8\xd8\xbb\x42\xd0\x40\x4c\x3e\xe5\x87\x85\x30\xe0\x58\x1e\x85\xcb\xe5\xbb\x91\x59\x90\x9c\xf9\xcf\x91\x7c\x4c\x2b\x30\xf2\xd5\x0a\xe9\x2c\x8e\x4e\xaa\x51\x91\xb8\xf9\xb3\x52\x21\xff\x5b\x6a\xa4\x77\x14\xd0\x7f\xb1\xe4\xb9\xc0\xc3\xdb\x8a\xe7\x0c\x03\xee\x97\x3b\x7f\x72\xa4\xfe\xce\x02\xe8\xdd\x16\x1e\xd1\x3f\xff\x6a\xd1\xe9\xce\xe8\x7c\xa5\xbe\xf9\xd3\x32\xc1\x5f\xaf\x78\xfe\x5c\xf3\xe8\x52\x7f\x72\xfe\x76\x55\xf9\xe5\x80\x82\x5a\x6e\x9d\x79\xff\x02\x0e\x84\x63\x7a\x4c\xc7\x67\xd3\x3f\x82\xa0\xf7\x89\x90\x64\x7c\x81\xfc\x12\x7e\x30\x82\x78\xc5\x69\xd4\x30\x4c\x3a\xeb\xaf\x02\xf3\x7c\xd5\xe1\x90\xc0\xd3\xf9\x1b\xec\xec\xeb\x2b\xe4\x12\xe6\x93\x0d\x2d\xe9\x84\x1f\xd5\x3b\x8a\x95\x68\x80\x19\x50\xff\x30\xe4\x56\x23\xf7\x75\x8a\x3b\xfa\x82\x32\x11\x5a\x76\x12\x00\xf4\x11\xc9\x5c\xf6\xa0\x59\xc0\x26\xc0\x03\x5c\xfc\x08\xe8\x15\xc1\x6a\x71\x59\x43\x92\x45\x2d\x49\x3c\xe8\xbe\x1f\x09\xb8\x1b\x57\xd2\x47\x82\x77\xe3\xf1\xf6\x61\xb2\x98\x98\xe9\xd2\xcc\xe6\xe6\xe3\x78\xb1\x18\xcf\x56\x9f\xcc\xbb\xf9\xc2\xff\xc1\x5c\x2f\xe6\xef\x17\xe3\xab\xc4\xac\xe6\xf0\xef\xc9\x9f\x56\x93\xd9\xca\x5c\x4f\x16\x57\xd3\xd5\x6a\x72\x61\xde\x7e\x32\xe3\xeb\xeb\xcb\xe9\xf9\xf8\xed\xe5\xc4\x5c\x8e\x3f\x8e\xcc\xe4\x4f\xe7\x93\xeb\x95\xf9\xf8\x61\x32\x33\x73\xff\xf4\x8f\xd3\xe5\xc4\x2c\x57\x63\xff\xf9\xe9\xcc\x7c\x5c\x4c\x57\xd3\xd9\x7b\x78\xde\xf9\xfc\xfa\xd3\x62\xfa\xfe\xc3\xca\x7c\x98\x5f\x5e\x4c\x16\xa0\xcd\xf4\xed\x7c\x81\x5f\x34\xd7\xe3\xc5\x6a\x3a\x59\xfa\x66\xfc\x3c\xbd\x98\xe8\x26\x99\xc1\x78\x69\xa6\xcb\x81\xf9\x38\x5d\x7d\x98\xdf\xac\x42\xdb\xe7\xef\xcc\x78\xf6\xc9\xfc\x71\x3a\xbb\x48\xcc\x64\x0a\x0f\x9a\xfc\xe9\x7a\x31\x59\x2e\x27\x17\x66\xbe\x30\xd3\xab\xeb\xcb\xe9\xe4\x22\x31\xd3\xd9\xf9\xe5\xcd\xc5\x74\xf6\x3e\x31\x6f\x6f\x56\x66\x36\x5f\x99\xcb\xe9\xd5\xd4\xb7\x73\x35\x4f\xe0\x6d\xf4\x59\x7e\xba\x6f\xcc\xfc\x9d\xb9\x9a\x2c\xce\x3f\x8c\x67\xab\xf1\xdb\xe9\xe5\x74\xf5\x09\x04\xa5\xde\x4d\x57\xb3\xc9\x72\x09\x43\x37\xc6\x96\x9f\xdf\x5c\x8e\x17\xe6\xfa\x66\x71\x3d\x5f\x4e\x46\x38\x80\xb3\xd5\x74\x31\x31\x8b\xe9\xf2\x8f\x66\xbc\xe4\x61\xfd\xd7\x9b\xb1\x3c\xe7\x7a\xb2\x78\x37\x5f\x5c\x8d\x67\xe7\x13\xff\x2a\xdd\xe5\xe9\x12\x7a\x6b\x3e\xcd\x6f\x46\x66\xf9\x61\x7e\x73\x79\x11\xfd\xdd\x0f\xd3\xc4\x5c\x4c\xde\x4d\xce\x57\xd3\x9f\x27\x89\xff\xa0\x19\x2f\x97\x37\x57\x13\x1a\xed\xe5\x0a\x86\xe7\xf2\xd2\xcc\x26\xe7\x93\xe5\x72\xbc\xf8\x64\x96\x93\xc5\xcf\xd3\x73\x18\x85\xc5\xe4\x7a\x3c\x5d\xf8\x31\x3a\x9f\x2f\x16\xfe\x29\xf3\x19\xae\xa1\x1f\x46\x08\x16\x97\x14\xc7\x25\xe3\x92\xf1\xb4\x98\xf9\xe5\x33\xf9\xd9\x2f\x8e\x9b\xd9\xa5\x1f\x87\xc5\xe4\x5f\x6f\xa6\x8b\xbe\x25\xe2\x9f\x3f\x7e\xbf\x98\xc0\x30\xeb\x15\xf1\x71\x7a\x79\x09\x73\xd7\x5e\x16\x09\x7c\x65\xf6\x49\x2d\x8b\x4f\xe6\xe3\x87\xb9\xb9\x9a\x5f\x4c\xdf\xf9\x49\xa1\x65\x73\x3e\x9f\xfd\x3c\xf9\xb4\x8c\x46\x65\xbc\x54\xeb\x75\xfc\x76\xee\x07\xe6\xed\xc4\x5c\x4e\xa1\x3d\xab\x39\x8c\x92\x9f\xb5\x8b\xf1\xd5\xf8\xfd\x64\xa9\xd6\x05\xbc\x93\x34\x9e\x13\xb3\xbc\x9e\x9c\x4f\xfd\x7f\x4c\x67\xe7\xd3\x8b\xc9\x6c\x35\xbe\xc4\xa1\x9a\x2d\x27\xff\x7a\xe3\x67\x76\x7c\xc9\x0f\x31\xe3\xc5\x74\xe9\x9f\xe0\x97\x26\x4d\xe3\xcd\x72\x02\xcb\x6f\xc6\xcb\x66\x35\x87\xdf\xe9\xc6\x9e\x84\x77\x77\x97\xa4\xb9\x9c\x2f\x61\xfd\x5d\x8c\x57\x63\x03\x2d\x5e\x8d\xcd\xdb\x89\xff\xf4\x62\x32\xbb\x98\x2c\x60\x87\x8d\xcf\xcf\x6f\x16\xe3\x15\xbc\xcc\x7f\x63\xb2\x34\xcb\x9b\xe5\x6a\x3c\x9d\xe1\x6c\xf8\xfe\xc2\xfe\x9e\x2e\x2e\x64\x8b\xc1\xaa\x7d\x37\x9e\x5e\xde\x2c\x3a\xeb\x6e\x35\x37\xf3\xeb\x09\x3c\x12\xd6\x9f\x9a\x09\xfc\xc4\x72\x98\xc0\xe4\x9b\xe9\x3b\xb3\xbc\x39\xff\x40\xd3\x66\xa2\x8d\xfc\xc9\x7c\x18\x2f\xcd\xdb\xc9\x64\x66\xc6\x17\x3f\x4f\x61\x33\xd2\x7b\xe6\xcb\xe5\x94\xc6\x64\x4e\x4f\xa0\x71\xc4\xd5\xf7\xe3\x08\xa5\x35\x76\x95\x0b\x2b\x70\xd9\xa9\x33\x01\xbd\x7f\x7f\xa6\xa7\xd1\x71\x27\xd5\x2c\xfe\x53\x79\xb4\x8a\x03\xba\x5e\x70\xac\x08\xa7\x0d\x5a\x75\x68\xef\xe4\xe5\xda\xe6\x54\x7b\x82\xf4\xba\x04\x62\xa6\xf3\x17\x4b\x9d\x08\x07\xec\x0d\x41\xf7\x88\x21\xcf\x7d\xd5\x30\xbd\x02\x9a\xa5\xf4\x24\xfb\xc8\x65\x1f\x75\x63\xd6\x79\x89\x35\x9c\x3b\x7f\xf7\x81\x44\x00\x6a\x16\xdd\xd6\x65\xbe\x6f\x1c\xb2\x07\xa3\xd9\xe1\x2d\xf3\xec\x21\xcb\x55\xdb\x7b\xc2\x24\x91\x5b\xc6\x70\xd1\xa8\xae\x27\xd4\x0d\xc4\x03\x11\xca\x94\xdb\x60\x11\x49\x54\x17\xa6\x72\xcd\xbe\xd2\xdc\xa6\x66\x32\xc3\xe9\xec\x13\xd8\xfb\x80\x72\x45\x63\xe8\x3f\xa2\xb2\x56\x0c\x0e\xff\xe4\x6f\xb2\x99\x7b\xe4\xa7\xd7\x2f\xc8\x21\x27\xb5\x1a\xb0\xed\x1f\x03\x1b\x1f\xc3\x12\x48\x0b\x99\x92\x1d\xd4\xc2\x3b\xa8\x3d\xac\x1b\x80\x90\x64\xac\xeb\xd2\x12\xec\xc2\x24\x47\xdd\x20\x3f\x50\x69\xec\xfa\x1e\xa2\xe3\x02\xe3\x2c\x45\xf8\x30\xd6\x74\x46\x0b\xc7\xb1\xfa\x3a\x0a\x25\xc4\x6a\xb1\x2c\x03\x2a\xa9\xa2\x5a\x10\xe3\x2b\x42\x79\x25\xc6\x36\x8d\xa5\xb0\x5e\xb0\x46\xb9\xa0\x49\xec\x78\x42\xf4\x4d\x21\x50\x59\xdb\x8d\x6f\xb1\x6f\xad\x7c\x79\xcb\x9f\xad\x1b\xaa\x93\x00\x1c\x90\x42\xc8\xa3\x04\x49\x1d\x0b\x38\x82\x39\x45\x61\x49\x45\xf2\x17\xf3\xed\xc2\x93\xe0\x11\xa4\x66\x89\xa9\x93\x40\x8f\xe6\xcc\x60\x1d\x64\x0d\x73\x74\x76\x53\x6f\x17\x96\xe0\xa0\x61\xa8\x80\xf9\x6b\x36\x7b\x61\x31\x05\xcd\x55\x6f\x6a\x8e\x5e\xfc\xde\x8f\x22\x7c\x95\x79\xd0\x54\xcf\xbf\xa9\xa1\xe6\x87\x9e\x7a\x5b\x65\x6e\x63\xb2\x14\xb5\x51\x1f\xa9\xe2\xc3\x9b\xcd\xa3\x3f\x28\x55\xfd\x93\xf3\xa1\xf9\xfd\xc1\xd9\xea\x0f\xe6\xf7\xf0\xed\x92\xeb\xe8\xfe\xf0\x62\x45\x62\xa2\x8c\xb5\x88\xe6\xf6\x27\x51\xbd\x8e\x66\x34\x6b\x3a\x12\xc0\xfd\x59\xc0\x27\x2d\x5c\x5b\x7f\xbd\xed\x9d\xb0\xf7\xd1\x09\x07\x5c\xaa\x62\x80\x93\xb8\xc8\x73\xd8\x75\x46\x46\x9d\xfe\x86\x6e\x49\xf1\xc1\x7d\xb9\x0b\x84\x48\xec\x5a\xee\x6b\xb7\xd9\xe7\xe8\x38\xb2\x6d\xe5\x0f\x7c\xb6\xaf\xde\x48\x11\xab\x7b\xa0\x4c\x08\x47\x28\xc3\xf1\xb2\xe9\x98\x48\x65\xf5\x15\x16\xd2\xd2\x7d\xa5\x38\x3d\x88\x08\x7b\x37\xb6\x1e\xbd\xf8\x54\xee\xa3\x55\x2a\x18\xe3\xf8\xf4\x7a\x6a\x82\x34\x6d\x57\x18\x35\x70\xd3\x8a\xb2\x49\x4c\xed\x9c\xf9\xfd\x7d\xd3\xec\x4c\x6d\x7e\xfa\xf6\xdb\xc7\xc7\xc7\xd1\x5d\xb1\x1f\x95\xd5\xdd\xb7\x0c\xc0\xf8\xf6\x0f\xa3\x17\xe3\xbc\x06\x73\x3f\xe2\x0c\x29\x0b\x96\x6b\x83\x98\x34\xca\x5c\x03\x33\x7b\xee\xd6\x4d\x55\x16\xd9\x1a\x11\x0b\x76\xe7\x2a\xb3\xb5\x59\x2e\xd7\xd8\x4e\xbb\x87\x04\x75\xce\x75\x00\x24\x91\x93\x8a\xb4\x40\xac\x1f\x89\x8a\xd9\x8d\x01\x8f\x4b\x4a\xfc\xf7\x20\xec\x81\x67\x45\x4d\x1c\x9e\x9a\x14\x76\x5b\xa6\xee\xa7\x17\xbf\xa7\x57\xfe\xc1\xfc\x15\x9b\x0a\x49\x84\x61\x18\xc7\x6f\x97\xf3\xcb\x9b\xd5\xe4\xf2\x93\x76\x2b\xde\xc0\xec\xd1\xc4\x99\xe6\xb0\x73\xe6\x7f\x80\x98\xf8\xe3\x37\xb4\x5e\xdb\xfb\x32\x9c\xf7\x70\x00\xbb\x7c\x5d\x6e\x29\x38\x18\x6f\x53\xdc\x95\x52\x5b\x2c\xce\xfc\x1b\xfd\x9a\xf5\x37\xba\x01\xa8\x30\x7b\x7f\xd8\x95\xcd\xbd\x83\x54\x5d\x90\xc2\xe3\x66\xc1\xeb\xe5\xcb\xb4\xca\x58\xff\x3c\x2a\x18\x8e\x38\x4d\x8f\x84\x1b\xcd\x7c\x03\x16\x81\xe4\x94\xc3\x59\x27\x6f\xde\xc2\x98\xdf\xba\xe0\x59\xbe\xa1\x6b\xf6\xfd\xcd\x34\x50\xf7\x92\xa8\x00\xb4\x67\x0f\xde\xbe\x19\xd8\x5b\xbf\x2b\x6f\xcb\x2f\x83\x68\x53\x00\xbc\xf3\xce\xd1\x89\xe1\xb6\xbb\xbc\x3c\xb8\x0a\x6a\x8c\xf1\x19\x4c\xc8\xcf\x9a\x72\xae\x1a\x02\x90\xca\xfb\x97\x39\x84\x94\x6d\x01\x62\xf1\x40\x1f\x84\xdc\x59\xbc\x38\x82\xa5\x35\x08\xe9\x73\x61\xce\xdd\x98\x20\x3f\x01\x71\x6a\xcc\x65\xc7\xbb\x03\x95\x83\x95\xac\x21\xda\x49\x50\xb2\x82\x5e\x6d\x13\xb4\xe2\xbf\x7a\x2f\xae\x9e\xde\xf2\x12\x71\x41\x78\x99\xa6\xd9\x42\x81\xf8\x2a\x9c\x9d\x05\x21\xce\x49\xf6\x58\x64\xb2\x42\x5d\x82\x3a\x66\xad\xa9\xf7\xb7\x55\xb9\x6f\x32\xb8\xdc\x88\xc9\xec\x10\x48\x6b\xa1\x7e\xd2\x2f\x59\x18\x0b\x3c\x6d\x01\xce\x83\x0d\xc9\xb3\xe2\x33\xd6\x42\x87\x17\x52\x8a\xa6\xa1\x10\x20\x99\x77\xf4\x70\x0a\x26\xe1\xe6\x79\x64\x04\xc0\x23\x25\xf5\xd3\x32\x89\xe4\xf6\x2f\x5d\x5d\xbb\xea\x78\x40\xb9\x6e\x9c\x4d\xbb\x49\x92\xb7\xfb\x06\x4b\x5b\x12\xb3\x03\x72\x74\x80\xad\x1c\x9b\x87\xdd\x7d\x96\x97\x75\xb9\xbb\x3f\x7c\xfb\x78\x7f\x38\x2d\xca\xe6\x34\xbf\xdb\xe5\xa3\xfb\x66\x9b\xff\x61\xf4\xe2\x9f\xfe\x6b\xfc\x8c\xbe\x7d\x57\xd9\xad\x7b\x2c\xab\x2f\xa7\x67\xa3\x97\xa3\xe6\x4b\xf3\xab\xbf\xe3\xe5\xcb\x97\x2f\x7f\xf8\xee\x3b\xff\xbf\x67\x3f\x7e\xff\x52\xff\xef\xcb\x97\x2f\x5f\xbd\x7e\xf9\xdd\x77\xff\x74\xf6\xfa\xd5\xab\x57\x2f\x5f\xbe\x3a\xfb\xfe\xc7\x7f\x7a\x79\xf6\xfa\xd5\xcb\xb3\x7f\x32\x2f\x7f\xf5\x96\xf4\xfc\xec\xfd\x65\x62\xcc\x3f\x3d\xd8\x34\xdb\x3e\xf1\xb9\xe7\xfe\xfe\x9f\xf4\xc7\x7b\xae\xef\x16\xe3\xab\xc9\xc7\xf9\xe2\x4f\xde\x41\x9e\x99\xcb\xe9\xf9\x64\xb6\x9c\x98\xb3\xd1\xcb\x17\x11\x0d\xfd\x98\x13\x9d\x09\xa5\x13\x68\xe1\x98\xf9\xce\x15\xf2\xa9\xb3\xd1\xcb\x24\xf0\x07\x45\xd9\x69\x56\x83\x8b\xbf\x7d\x0e\x9e\xda\x81\x2f\xc9\x44\x17\x60\x39\x40\xdd\xc2\xbd\x98\x28\x29\x1e\x0b\x97\xd4\xa7\xbe\x92\x94\xf8\xc9\xa9\x33\x6f\x2d\xa6\x9b\x6d\xa1\x6b\x4f\x2e\x22\xf5\x64\xf0\x14\x6c\x1d\x14\x4f\x5d\x5e\x3e\x0e\x47\x2f\x20\xc0\x73\x35\x99\xad\xcc\xdb\xf1\xf9\x1f\xdf\x2f\xe6\x37\xb3\x8b\x17\xfd\xad\xcf\x6a\x42\x0e\x36\x81\xcb\x0b\x20\x4b\x14\x80\x2f\xfd\x18\x91\x5b\x23\xce\x18\xd7\x45\x64\x85\x1f\x1b\x6f\xf9\x42\x55\x57\x73\x48\xc8\x0b\xac\x50\xf3\x05\xee\x75\x42\x84\x12\x57\x53\x51\x3e\x30\x9b\x22\xbc\x0b\x38\x15\x1a\xe6\x19\x01\x7f\x03\xce\x66\xb7\x05\x91\x1e\xaa\x2d\xa3\xef\xfb\x31\x14\x21\x55\xf4\x95\x8a\xf4\x54\x84\x74\xf7\x45\xd6\x1c\x46\x66\x0e\xf9\xe0\x3f\xd3\x98\xa3\x53\xd9\x26\x8b\xeb\x19\xec\xe3\x5a\x85\xd9\x76\x57\x95\x0f\x5c\xde\x0b\xd0\x08\xee\x86\x64\x3c\x88\xf5\x14\x0c\x28\x40\xc7\xee\x90\x8e\x85\xb2\x60\xd4\xb6\x55\xe0\xbd\x45\xff\x14\x87\x9a\x64\x05\xb9\xcd\x75\x62\x1e\x11\x30\x16\x01\x62\x8e\xb6\x5b\x88\x6d\x20\x95\xcc\x62\x8a\x3d\xdc\x4a\x49\xa7\x45\x11\x08\xad\xe9\xdd\x35\x7a\x39\x41\x84\xe1\xc8\x4a\xf2\xef\xfc\x24\x40\x3f\xff\x6d\xc0\x56\xa0\x19\x81\x64\x27\x67\xb1\xd2\xff\x2a\x86\xfb\x82\x47\x27\x59\xa3\xf0\x07\xd2\x46\x02\x43\x19\x59\x0d\x84\x3a\xe5\xc4\x0e\x7b\xf7\x4d\xd0\x32\x96\x35\xcb\xeb\x06\xbc\xc0\xe3\x3d\x00\x9c\x4c\x40\x6b\xf4\x60\x09\x64\x60\xb8\x0d\xb7\xc3\xa3\x3b\x34\x30\x33\x22\x3b\x04\xe2\xfc\xe8\xbf\x49\xea\xa4\x25\x89\x0e\xe4\x24\xdb\xb2\x91\x56\x60\x64\x08\x18\x39\xa8\x2b\x27\x19\xa1\x34\xb4\xf0\x3b\x3f\x36\x3f\x08\x1f\x02\xb8\xab\xa8\xea\x80\x75\x95\x59\x83\x62\x14\x80\x87\x8b\x58\x12\x8b\xe4\xe9\x33\x48\x55\x6f\x54\xde\x79\x62\x92\x9b\xca\x41\x36\x2e\x35\x27\x59\x36\x0c\x54\x6c\x41\x13\x6a\x4f\xe8\x0b\xe5\x31\x00\x7c\xb9\xef\x4d\x6a\xae\x7c\x9b\x93\x23\xfd\x4b\x18\xda\xc5\x33\x22\xe1\xc3\xac\xe0\xc0\xa4\x79\x45\xb2\x6d\x3c\x49\xeb\xa1\x19\x28\x39\xec\x01\x03\xb8\xe4\x9d\x47\xe5\xaf\x9f\x92\xbc\x46\x72\x30\xf1\x97\xe2\xc2\x77\xa5\x92\xca\xe4\x0f\x14\x66\x78\x4a\x5a\x15\xd2\xa1\x4a\xc0\x43\xf8\xeb\xf0\xdf\x24\x5d\x2b\x34\x1d\x1c\xaa\xe0\xb9\x88\xb9\xf5\xfc\x93\x2a\x6f\x75\x62\xb5\x53\xb5\xbe\xf7\xce\x39\x9e\x74\x94\xfb\xab\x5c\x50\x99\x4c\xa9\x96\xa3\x2d\x68\x05\xe8\xd0\x1e\xe1\x5a\x7c\xa0\xd0\xc7\xc2\xab\xa0\x31\x2c\xf8\x75\x90\xf1\x4f\x87\xe6\x67\x9b\xef\xdd\xe9\x18\x78\xa2\x96\x48\x1e\x53\xab\x1d\x12\xf8\x56\x81\x05\xcb\xb9\x53\xc4\xf1\xf1\xf0\x9e\x82\xf2\x1f\x70\x84\x11\xcf\x60\x18\x6e\x3e\x01\x43\x80\xf9\x27\x16\x4d\x2e\x2b\x6d\xc2\xf3\x31\x10\x50\xf3\x05\xe1\x32\xde\xa8\x2b\x0b\xea\x20\xe9\x62\x51\x0a\x53\x4d\x85\x74\x44\x6f\x5a\x5a\x07\x16\xf6\x94\xbf\xcb\x01\x2c\xb1\xc9\xee\xf6\x41\x87\x8d\x26\x08\xbe\x56\x56\x20\x66\x08\xcb\x30\x4d\x80\x4d\x1b\x67\x86\x10\x14\xd4\x63\xdd\x5e\xea\x6c\xcd\x12\xac\xbc\xe6\xdf\x57\xb6\x68\x40\x94\xf0\xcf\x4a\x37\xae\x37\xa5\x8e\x2b\xa3\x6d\xfc\xf0\xa1\xe7\xff\x7a\xcb\xb8\x46\x2c\x0d\x8d\x0b\x4e\x02\x1e\x51\xed\xb9\x61\xbb\xbc\x54\x00\x92\x7e\x2c\x00\xdb\xb4\xd7\x94\xcd\x5c\x63\x82\x8e\x25\x28\x7e\x6d\x9c\xd3\xc5\xc7\xfe\xad\x18\x63\x21\xd4\x7f\xe5\x36\x39\x69\x25\xe2\x95\x55\xa3\x8f\xdf\x2b\x38\xe1\x6f\x36\x7d\x29\xb0\xdb\xd5\x7b\x5f\x66\x05\x07\xfa\xd4\x89\x00\xc8\xd9\xb6\xca\x88\x3f\x00\xde\xa8\x73\xbe\x2b\x1a\x9a\x48\x8a\x99\x24\x8c\x5d\xee\xd4\xf1\x20\xe5\x2f\x48\x23\x52\xed\xd7\x90\xa2\x3f\x6e\xf2\x29\x22\x25\x7f\x66\xad\xc1\x9c\x62\x59\x1c\x04\x26\xc3\xa1\x5e\x65\x0f\x28\x4f\x80\xbf\x0b\x5b\xe1\xaf\x3e\xc6\x21\xf8\xac\xb6\x6b\xf7\x7a\xa2\x31\xfa\xec\x74\x71\x03\x8d\x64\x38\x1e\x10\x92\x09\x67\x2b\xc3\x45\x61\x7d\x9c\xc2\xfa\x48\x34\x6c\x76\x53\x56\xee\xae\x24\x9c\x66\x6b\x2e\x6e\xb3\xc2\xbb\xdf\xa0\xc2\x4e\xea\x99\xbc\xf6\xcf\x15\x77\xe2\xea\x9e\x4a\xd5\x5b\xa1\x5a\xba\xb9\xf9\x3a\x38\x93\x5d\x40\xe6\x7a\x5c\x92\x69\x83\x84\x71\x6f\x3e\xa7\xdf\x9b\x80\xa8\x2d\x19\x7e\x75\xbc\x11\xdb\x66\x4d\xbc\x25\x41\x20\xec\xd1\x41\x2d\x73\x4b\x9d\x87\x61\x6f\xbc\x6d\xf5\xa2\xf6\x5b\x36\x77\x8d\x8b\x86\x8a\x29\x2b\x8e\x99\x20\x47\x6c\x04\xb0\x73\x6e\x0f\xb0\xe1\x35\x68\xf7\x2b\x8d\x06\x8b\x46\xc9\x71\xb3\x21\x79\x7e\xc1\x25\x01\x8d\x4b\xe8\x64\xe7\xa2\xeb\x85\x10\xfb\x28\x9f\xc4\x17\x9c\xa8\xcb\xb6\x4e\x39\x96\x36\x91\x42\xe0\x07\xb2\xe8\x8b\xd2\x40\x06\x0e\x18\xd5\x75\xc9\x11\xd2\x8e\x87\x32\xda\xa4\xe7\x1a\x49\xb8\x26\x99\x29\x23\xf5\xd0\x47\x06\x9a\x7f\x55\x54\x8e\xb7\x27\x30\x6d\xd1\x41\x5d\xaa\x56\x6b\xd3\xe5\x98\xf9\x1d\x8e\x9f\x71\x71\xe8\xbf\x45\xa5\xf8\x04\xeb\xf5\x82\x66\xf1\x71\x1b\x0a\x12\x89\x64\x54\xd0\x7e\x3d\xb6\x84\x64\x9a\x58\xcf\x80\x5c\x32\x6c\x79\x59\xe8\xab\x5b\xf3\x3e\x55\x8a\xb0\x85\xee\x77\xef\x86\x41\x0a\x8c\xb6\x89\xcd\x2a\x76\x01\x1f\x7c\xc7\x84\x77\xaf\xaf\x9b\xc0\xb8\xcf\xc7\x6d\x72\xfc\xc2\x93\x0a\x5f\x38\x84\xe4\x69\xa6\x35\x68\x50\x0f\x51\x4a\xa7\xc2\xa0\xa5\x31\x4c\x5c\x15\x4f\xe1\x8a\xc2\xbf\x6e\xf6\xfe\xb4\x23\xf3\x00\x5b\x83\x9a\xac\x38\x3c\x41\x75\xfa\x99\x79\x5d\x0f\x81\x07\xee\xc8\xe0\x53\xfe\x9a\x8f\x01\xff\x05\x30\xb4\x89\x9f\x39\xcf\x79\x83\xe1\x28\xd0\x16\xab\x9f\x0a\x2a\x68\xe6\x93\xdb\x7d\x96\xa3\xd3\x1b\x1d\xbf\x34\x09\xc7\x16\x04\x61\x5f\x71\x04\xc2\x91\x20\xf7\x27\x12\xc6\xa3\xfc\x20\x58\x61\x78\x1a\x04\x2c\x16\xbe\x96\x6c\x59\xb6\x1e\x49\xe5\x42\x2c\x72\x09\x5f\xe3\xa0\x03\xf3\x3b\xd0\x67\x40\x39\x2a\xc8\x00\x52\x35\xef\x1b\x3d\x3a\x61\x78\xf0\xa6\x97\x6c\xaa\xe2\x93\x3c\x72\x30\x1d\x1f\xb4\xa4\x75\xaa\x53\x49\x18\x60\xa1\x73\x77\xe7\x8a\xf4\x27\x54\x0e\xd2\x6f\xaa\x43\x5f\x5a\x94\xd7\x7d\x4e\xe6\xd3\xb1\x29\x84\x57\x47\x9e\x14\x70\xcf\x93\x07\xe6\x97\x72\x7c\x03\x45\x84\x08\xb5\x83\x51\xc3\xe0\x75\xe5\xb2\x62\x14\x8d\x58\x6b\x45\x11\x7b\x41\x4b\xc5\x56\x94\x04\x40\x79\x7b\x5d\xb9\x34\xf3\x7e\x88\xe4\x1d\x43\x36\xa2\xd6\xdc\x04\x8c\x2a\xec\x78\x68\x3f\x50\xb8\x2a\xa1\x01\xac\x93\xb6\x9b\x04\x30\x10\x1b\x16\x37\x9e\x20\x8d\x30\x83\x86\x64\x6a\xdf\x32\xd7\xca\xf6\x88\x75\x08\x41\xb9\x68\xc1\x3c\x0c\xa5\x62\xc5\x16\x66\x5f\x80\xf8\x13\xd2\x24\x89\xa5\x72\xdf\x6c\x73\x9c\xdb\xc2\x6e\x41\x50\x85\x5e\xf8\x6f\x12\x4a\xf9\xb7\xac\x78\xa0\x5b\x03\x82\xed\x81\x70\x59\x55\x7f\xf5\x35\x14\x0f\x4b\xad\xe0\x5f\xb8\x47\xba\xf5\xd4\x49\x5b\x23\xee\x00\xb5\x13\xdb\x59\x9c\xfe\x27\x4b\xdb\x74\x7f\xbf\xa6\xbb\x8d\xfb\xd2\xe8\xee\x36\xf7\xee\xdf\x42\x97\xc9\x21\x18\x35\x5f\x9a\x5f\xd6\x49\x29\xab\xb7\xf8\x06\xfd\x4a\x26\xe3\xeb\x3f\x2d\xb5\x71\x0a\x9d\xc8\x86\x41\x4f\x36\x3f\x88\x7e\x26\xdd\x64\x0f\x99\x7b\xc4\x7b\x10\x55\x48\x36\x47\x8f\x38\xd8\x67\x47\xce\x39\x61\x40\x0c\xd1\x49\xaa\xa9\xed\x0a\xcf\xc0\xc3\xa8\x15\x75\xfb\xb4\xa0\x13\xc2\xb7\x7f\xa9\x42\x72\xad\x22\x04\x00\xa1\x3f\x11\xa5\xe5\x35\x8f\x3b\x98\xae\xa2\x7d\x40\x9d\xc0\x33\xe5\x8c\x29\x6f\xe9\xe3\x64\xa0\x3f\x77\xc8\x90\xc1\x86\x7b\x3f\xd7\x24\x50\x4f\x84\xcc\x9e\x3e\x95\xb2\xfa\xc9\x43\x29\xb6\x7d\x34\xcf\xa4\xef\x54\xae\x4a\x77\xc4\x95\xa2\x13\x49\xae\x37\x66\x45\xc2\x63\x0d\xba\x38\x02\xd2\x0d\x5c\x57\x4f\x1c\xa9\x59\xfc\x7e\xfb\x75\xab\x1d\xe3\xaa\xb4\xe2\xf5\x3c\x00\x4d\x68\x5e\x97\x71\xad\x17\x6a\x08\x61\xf4\xb2\x2c\x8c\xbf\x02\x9a\x66\x47\x09\x3b\x79\xc3\x68\x4d\xb5\x5c\x50\x14\x11\xd3\xd8\x3c\xb5\x3c\xeb\x11\xd6\x07\x1c\x0d\x3e\x06\x13\x1f\x1b\x89\x94\xba\xe4\xa7\x1f\xf1\x0b\x70\xd9\x28\xc5\x7a\x1a\xfb\xfe\x3d\x8d\x15\x20\xf0\x82\xd8\x96\x57\xf3\x6e\xe3\xd5\x04\xcb\x4c\x4a\xcf\x62\xea\xf9\x70\xe3\xd7\x14\x5b\x83\xdb\x3b\x38\xa0\x21\x20\x6b\x9b\xa3\xfd\x96\x3a\x8d\x78\xed\x01\xa1\x5c\x9b\x26\xa8\x72\xa7\xd1\xca\x65\xe1\x13\x8b\xe6\xe1\x6d\x86\x75\x49\x65\x11\xdf\x1f\xa1\x3e\x36\x88\x94\x65\xcc\x16\x83\x31\xeb\x20\x9b\x41\x1b\xf0\xf6\xa0\x7d\xb9\x40\x40\xcd\x15\x67\x68\x1c\x3d\x67\x8b\xf3\xa4\x42\xc6\xa9\xac\x78\x4e\x7b\xc2\xcb\x7a\xd4\x38\xeb\x74\x34\x93\xf4\xac\xb3\x36\x4c\x9e\x99\x10\xb5\x7f\x8f\xbd\x05\xd7\x16\x94\xaf\x40\x0b\x25\xb0\x54\x2a\xe1\xc0\x5e\x8b\x1e\xf5\x0c\x6a\x77\xdc\x4d\x1a\x3e\x71\x7c\xea\x98\xca\xed\xd0\xaf\x8b\xd3\x30\x53\x7e\xd5\x9e\x30\x7f\x21\x38\x8a\x18\x8e\xca\xf3\xa1\x0c\x1b\x6d\x05\x4c\xd2\x84\x2a\x02\x59\x0e\x12\x0a\x56\x03\xa3\xc3\x93\x27\x5d\xc7\x72\x88\x4f\x0e\x8f\xd3\xdc\xfd\xea\x31\x35\x81\x2c\x6f\xcb\x3d\xee\x60\x1e\xb4\x68\x25\x5b\xbc\x1f\xdc\x76\x97\x5b\xcd\xd6\xb3\x14\x69\x73\x40\xd6\xaa\x92\xaa\xa7\xc3\x80\x54\xa4\xaa\xc2\x22\x40\x67\xc2\xe3\x16\x53\xc0\x86\x61\x00\xf9\x3e\xde\xc2\x4d\x49\x0e\x02\x41\x76\x9f\x71\x90\x5a\x4d\x4d\x94\x4a\x89\x68\x6b\xb3\x9b\xfb\x15\x33\x22\xc7\xd1\xbe\x40\x71\x16\x27\xe7\x1f\xde\x99\x4c\xdf\xc3\x4a\x6e\xc1\xaf\xec\x1f\xa0\xc0\xba\xcb\xba\x3e\xf1\xe8\x34\x10\x17\x43\xa4\x71\x08\x9c\xaf\xdb\x54\x5d\x88\x62\xc6\xdf\x0f\x85\x91\x45\x9a\xd5\xb3\x8f\xd5\xb0\x6b\xdd\xab\xac\xa9\x11\xda\xa9\x78\xfa\x04\x9e\xd2\x1d\xe7\x6e\x9d\x61\xec\x89\x7e\x8f\x28\x6f\x89\xdc\x5e\x53\xe4\x76\x64\x26\x4f\x11\x0f\xf3\x1d\xd8\xff\x64\x16\x15\xa0\xbc\x06\x25\xf2\x6a\xca\x80\x17\x69\xff\x50\xd7\x3a\xe3\xd7\x1f\x4e\xc6\x61\x57\x5b\x4c\x4c\x35\x90\xf2\xea\x5c\xfd\xf4\xe4\x84\x48\x17\xc4\x8c\x40\xec\x1f\x8c\x15\xfd\x06\x63\x22\x82\x2b\xef\xbb\xf7\x58\x2b\x9b\x2b\x79\x54\x81\x0f\xd6\x99\x2c\xe7\xef\x56\x1f\xc7\x8b\x09\x43\x12\x2e\xcc\x87\xc9\x62\x72\x33\xbb\x98\x2c\xcc\x54\x0a\x6a\x2e\xcc\xff\xf8\x1f\x50\x46\x33\xfa\xe6\x1b\x00\x79\x52\x9d\x8c\xaa\x92\x51\x95\x2f\xbf\x5e\xc1\x4c\xf2\x2c\x16\x34\x01\x0c\xf9\x6c\x3e\x3b\x9d\xce\xde\x2d\xa6\xb3\xf7\x90\xfc\x4d\x8c\xef\x92\xef\xc9\xdb\x4f\xe6\x62\xba\x3c\xbf\x1c\x4f\xaf\x26\x17\xa3\xa8\xfe\x64\xf9\x61\x7c\x79\x09\x6d\xc1\xbe\xcf\x17\x58\x67\x30\x5d\xca\xa8\xe8\x02\x90\x77\x54\x5a\x72\x31\x5d\x4c\xce\x57\xbe\x8f\xe1\xbf\xb8\xcc\x43\xd5\x7e\x4c\xfe\x34\xb9\xba\xbe\x1c\x2f\x3e\x25\xc7\x6b\x3f\x42\x0d\xc7\x49\x77\x98\x86\x7e\xf0\xcf\x6f\x16\x98\xcd\x86\x72\x87\xb7\xcb\xd5\x74\x75\xb3\x9a\x98\xf7\xf3\xf9\x05\x0c\x3e\xd6\xe4\x4c\x96\x6f\xa4\xe4\xe3\xc6\x8f\xc9\xc5\x78\x35\x86\xf7\x5e\x2f\xe6\xef\xa6\xab\xe5\x1b\xff\xdf\x6f\x6f\x96\x53\x18\xcb\xe9\x6c\x35\x59\x2c\x6e\xae\x57\xd3\xf9\x6c\x68\x3e\xcc\x3f\x4e\x7e\x9e\x2c\xcc\xf9\xf8\xc6\x4f\xbf\x1f\xce\xf9\x0c\x7a\xba\xfa\x30\x99\x2f\xa0\xd2\xc2\x0f\x01\x4d\xc8\xc7\x0f\x13\xa8\xd4\x98\xce\x7c\xa7\x56\x8b\xb1\x1f\x81\xe5\x6a\x31\x3d\x5f\x85\x8f\x41\xd9\xc8\x7c\xb1\xd2\x65\x2a\xb3\xc9\xfb\xcb\xe9\xfb\x09\x94\x2b\x2d\x42\xc1\xd7\x50\x2a\x60\xa6\x33\xc2\x0f\x7f\xea\x14\xc3\x74\xa6\x85\x8b\x48\xbe\xba\x40\x84\xa5\x95\x78\xdf\xff\xcc\x14\xc8\x18\x96\x8f\xd8\x0c\x21\xae\x10\x33\x09\x37\x0a\x23\x23\xc7\x75\xea\x4f\x8e\xf4\x18\xf5\x38\x86\x1e\x1f\xca\x2c\x25\x2c\xcd\x5f\x1b\xf9\x2e\x2b\xd6\xd7\xe5\xfb\x52\x02\xe1\x91\x46\x97\x8a\xc7\x1f\x3d\x3f\x8f\x5f\x55\x47\x4e\x45\xec\x2c\xf3\xfa\xcb\xd9\xdf\x28\x06\xe8\x98\x7d\x78\xeb\x52\x44\xae\x3b\xd2\x19\x63\xef\xf5\x41\x8f\xf8\x13\xef\xba\x8d\x4c\x59\xf0\x9c\xe0\x1e\xaa\xf7\x6b\xe4\xe3\x24\x6d\x8a\xba\xce\xee\x8a\xba\xcd\x6a\xe2\xe7\xa9\x29\x99\x85\xb3\xc7\x7c\x0f\x79\x1c\x2b\x5f\x4e\xfd\xfd\x47\x8e\x60\x80\x55\xf9\x61\x2a\xd6\xc2\x50\xd2\x87\x83\x52\x72\x03\x0c\x07\x68\xfb\x96\x64\x83\x9f\x9c\x0f\x4d\x0c\x04\x3b\x9f\x5f\x5d\xfb\xf5\xfe\xea\xe5\xcb\xd7\xff\x55\xa0\x8e\xff\xf8\xe9\xf9\x19\x7d\xbb\xbc\xba\xbe\xbe\xfc\x4d\x70\x9f\xfc\xf3\x34\xfe\xf3\xe5\x0f\x67\xaf\x7e\x6c\xe1\x3f\xcf\x7e\x78\xfd\x0f\xfc\xe7\xdf\xe5\x67\xe9\x80\x78\xff\xca\xfb\x1a\xc0\x66\x7b\x4d\x12\x8a\xe6\x64\x79\x75\x3d\x24\x19\x6b\x7f\x78\xfd\xff\xc7\xe7\x97\x89\x39\xbf\xf2\x76\xc4\xbb\xcb\xff\xeb\x45\x74\x45\x2c\xe0\x26\x7a\x31\xf6\xc7\x71\x0b\xf4\x07\x01\xc3\xab\x6b\x60\x86\x75\x04\x0a\xa7\x22\x45\xd4\xed\x2e\xeb\xc6\x88\xe4\x61\x01\x82\x25\xb6\x80\x1c\x58\xf0\xf2\x6a\xca\x1c\x32\x27\x6a\x07\x0d\x05\x47\xf7\x5c\xd3\x52\x03\x2e\x87\xe1\x0b\xbe\x01\xec\x3b\xee\x50\xc4\xdd\x5f\x17\x01\xe8\x57\x56\x2a\xe8\xb0\x71\x8e\x32\xe2\xf0\x3d\x7f\x16\x13\x7d\x78\x7e\x88\xf1\x6f\xfe\xd9\x37\xa3\xe5\xc8\xbc\x07\xed\x1a\xf0\x02\xcc\xdb\xf1\x84\x54\xc0\x01\xce\xee\x8a\x7b\xdf\x1f\x78\x65\xca\x79\x2e\x46\x18\xf8\x17\x50\xd9\x07\xc9\x21\xf1\x5d\xd0\x79\xec\xaa\xfb\x4b\x28\x35\xd9\x57\x05\xd1\x57\xf0\x03\xe5\xc0\x57\x23\x4c\x4f\x7d\x70\x45\x8a\x44\xdf\x3a\xa4\xd3\xa6\x16\xc2\xc7\xb4\x70\xf5\x32\x6f\xe2\x1d\xe9\x77\x8d\x5e\xbc\xfa\x9d\xb9\xb2\x07\x7f\x65\xbc\x7a\xf1\xdc\xb2\x8a\x1f\x0d\x40\xc8\x9b\x22\xf3\x16\xc4\xb2\x01\x9b\x21\xf4\xf1\xdb\x0b\xe7\xef\x4f\xce\x2b\x5d\x20\x5f\xd4\xb7\x33\x4b\x29\x30\x78\x55\xd6\x1c\xcc\xf8\xce\x15\xeb\xc3\xb7\x73\x14\x36\x2e\x37\x66\x46\x74\x2a\xf2\x89\x13\x62\x0b\xc2\x1a\xc2\x41\xcf\x28\x0f\x86\x2d\x07\x3e\xa6\xc6\x81\xd0\x0e\x28\xa3\xab\xf8\x5e\x5c\xa1\x85\x63\x82\x72\xf0\x82\x45\x25\x4c\x1a\x00\x7f\x06\xfe\x13\x5c\x34\x37\x18\xb2\xbd\xd0\x8b\x70\xeb\x7c\xef\x42\xff\x75\x30\x6c\x83\x03\xea\x00\x09\x40\x3e\xfe\x28\x7c\x9e\x1c\x07\x57\x70\x38\x22\x2c\x84\x9f\x5e\x50\x64\xae\x97\x45\x94\xf7\x52\xaf\xa0\x61\xa0\xac\x6a\x8d\x2e\x31\xe2\x22\x37\x29\x16\x23\x26\x8a\xff\xb7\xc5\x86\xab\xe0\x32\x3c\xb0\x52\x6b\x48\x99\xce\xb2\xd0\x39\x5a\xfd\x09\xc2\x1b\x90\x0e\xb4\x6f\x6a\x8c\x39\x8c\x76\x31\x84\x68\xb0\x44\xf2\x96\x78\x93\xa8\x24\xef\xd7\xee\xbf\xea\x53\x4c\x3f\xd7\x99\xdc\xbf\xb9\x03\x09\xef\x7e\x6c\x35\x88\x0b\xfa\xb5\x8a\xff\x24\xa8\xca\x03\x21\x42\xf0\x8c\x28\x37\x20\xb7\x5e\xa6\x7b\x38\xae\xc0\x32\xc6\x66\x76\xc5\xb6\xb2\xba\xef\x8c\x00\xbd\x1a\xcc\x97\x8c\x5e\xbc\x43\x84\xf6\x16\x84\x27\x58\xa6\xe2\xe9\x49\x8d\x0a\xd0\x7e\x8d\xf9\xe4\xb1\xe8\xa5\xa1\x8d\x21\x58\x1d\xc8\x3a\xc1\x66\x64\x6f\xf5\x34\xcb\x9c\x04\x78\x1f\x79\x51\x71\xbb\x54\x98\xb9\x33\x43\x43\xb3\xdf\x91\x5a\x3c\xb0\xfb\x13\x44\xd5\xd9\x88\xb3\x9e\x64\x41\xca\xc2\xf1\x27\xf5\x51\x2f\x0d\x89\x1a\x1e\xc4\xe4\x3a\x58\xa0\x63\x6b\x73\xf4\x62\xa5\x65\x51\x24\x9a\xd8\x9d\x63\x18\x41\x2e\xb0\x3f\x04\xa9\x85\x27\xc7\x09\xd5\xf1\xc2\xec\x63\x6d\x5b\xf4\x11\x9d\x49\xe2\x49\xd6\xb5\xfe\x77\x7b\x0b\x59\x34\x19\xe9\xc2\x36\x7b\xbf\x32\x98\x59\x1a\x2b\x0c\xf2\x0c\x05\x99\x8f\x43\x5a\xa1\x75\xf4\x64\xda\x82\x5b\x57\xad\xef\x6d\xd1\x68\x10\xd2\x26\x6b\x80\x4f\x13\x0b\x17\x15\x55\x30\x45\x02\xb1\x0b\xed\x1b\x39\x70\x2e\xdc\xbb\x3c\x05\x4a\x02\x85\x94\x4a\xed\xd6\xde\x39\x61\x67\x3a\x86\x3b\xb7\x90\x0e\x25\xfb\x42\xd1\xee\xea\xf1\x1a\xbd\xc0\xaa\xfa\x50\xff\x47\x95\x27\x78\xbc\x86\x63\xb5\x0d\x3c\x64\xd1\x10\x0d\x20\x8c\x26\xa2\x4f\x21\x8d\x75\x60\x38\x52\x19\xc9\xa2\xd5\x74\xdb\x84\xb3\x9b\x53\x47\x4a\x6a\xd1\x3e\xa1\x17\x25\x58\xc2\x38\x57\x16\xb5\x8a\x1f\xf9\x50\xfa\x15\x12\xd6\xcf\xbe\xa6\x10\xc3\x04\xec\x2c\x6f\x42\xcc\xc6\xe7\xe7\xe6\xc4\xc1\xff\x0e\xcd\xf8\xb6\x46\xc3\x6a\x79\x28\x1a\xfb\xc5\xcc\x08\x0b\x61\xe6\x85\x33\x27\xe3\xe5\x6c\x74\x36\x34\xe7\xff\xfd\xbf\x93\xad\x0b\x01\x77\xf8\xad\x71\x05\x6c\x27\x84\xa3\xc2\x7f\xd6\x64\x4a\x08\x86\x3a\xb5\x8d\xa5\x4b\x9e\x4c\x46\x7c\x2d\x3d\x41\x3f\x36\xab\x85\x62\x8e\x66\x76\x32\xfb\x30\x9e\x9d\x4f\x2e\xa8\xc5\x12\xee\xbc\xbe\x79\x7b\x39\x3d\xe7\xa8\xe7\xc8\xcc\x80\x90\x36\x54\x80\x13\xa7\x94\xd0\xe6\x47\x54\x71\xc7\xde\x1f\xb5\xee\x1c\x90\xf1\x28\x30\xe6\x17\x90\xae\xab\xb7\x75\x24\x34\xbd\xbc\xba\x1e\x29\x76\x82\xff\xf5\x3f\xcd\xd9\xef\x7e\xf7\xe3\xa9\x37\xf3\xcc\x31\x23\xec\x1f\x21\x83\xff\x2c\x3f\xa3\x6f\x53\xb7\xab\x1c\x6c\xed\x7f\x7b\x7f\x7d\x79\xfa\x6a\xf4\xf2\xd4\x1f\x99\xa7\x76\xef\x0d\xf6\x62\x73\x2a\x52\x8d\x7f\x6d\x90\xe0\x19\xff\xff\xf5\xd9\xab\x1f\x62\xff\xff\xd5\xcb\x1f\xce\x5e\xfd\xc3\xff\xff\x7b\xfc\x64\x45\xed\xaa\xc6\xbc\xbf\xbe\x34\x0f\xaf\x02\x55\xb9\xfb\xd2\xc0\x41\xff\x62\x4c\xab\x80\xb2\x57\x59\x59\xbc\x18\xd7\xcc\x31\x6e\xf3\xa0\xe3\x99\x3c\xc9\x08\x02\xcc\x28\xb5\xd9\x17\x70\x0b\x93\x94\x61\xf0\xab\xf0\xca\x6a\xb1\xd0\x28\x31\x75\x2e\x06\x71\x02\x75\x14\x60\x2c\x40\xbe\x91\x37\xa2\xdc\x18\x6e\x2e\xe2\x0a\x0a\x87\x7a\x85\xba\x04\xff\x6b\xf9\x4e\x80\x6b\x62\xcf\xfa\xb0\x31\xa1\x36\xe4\x3d\xb9\x7e\x88\x08\x44\x00\xc0\xd1\x36\x81\x60\x1c\x55\xb3\xfc\x49\xed\x2c\xab\x78\x6f\xf1\x48\x7e\xa2\x11\x27\xef\xaf\x2f\x87\x58\xe6\x8f\xe2\xb8\x0a\x56\xa8\xcc\x02\x51\xf7\x63\x00\x3a\x95\x21\xe1\xbd\x28\x2f\x67\x46\x90\x17\xe7\xc4\x30\xd1\x6e\xae\x7c\x92\x8c\x49\x68\x3e\xd6\x91\xd5\xd9\x5d\x41\x48\x57\x72\x5d\x52\x73\xd2\x16\xc2\x4f\x08\xef\xae\xc2\xe3\x59\xb1\xdb\x37\x43\x26\xa7\xee\x9f\xaa\x8f\x0e\x24\x81\xa8\x92\x13\x7c\x5d\x7f\xad\x0e\xa4\x7d\x38\x4e\x20\xcb\xf5\x54\x4b\x09\x63\x5c\x23\x25\x39\x41\x1c\x41\x97\x4b\xe1\x68\x83\x81\x8c\x94\x8f\x35\x41\x9c\x43\xb4\xdd\x2a\x6f\xba\xe4\x06\x67\x48\x6e\x88\x3c\x5a\xbe\xb3\xed\x66\xcb\x0b\x01\x3d\xdc\x79\x9f\x33\x83\xa2\x2c\x4e\xdb\xfd\x92\x7e\x14\x60\x42\x93\x4f\xa8\x0c\x33\xfe\x52\x68\x13\x0c\x65\xe6\x7b\x09\x2d\x23\xce\x91\xce\x7e\x64\x73\xc0\xef\x6c\x45\x2a\xaa\x39\x2d\xe5\xe5\x54\xa1\xf2\x15\x94\x9f\x1f\xc5\x8d\x02\xd7\x29\xae\x47\xb4\x1d\x11\x71\xfd\x96\xc0\x1f\x21\x9a\x18\xcf\xb5\x5b\x73\xf6\x82\x79\xd8\x79\x3e\x95\x7f\x24\xe6\xbf\x21\x3d\xd8\x7f\x3b\xf2\xb9\x7b\x4b\x69\xa8\xb2\x21\xcd\x1e\x3a\x75\xda\xc3\x19\x49\x34\xc0\xaa\x42\x3d\x25\xfa\x7e\x7b\x3a\xf8\x93\xa1\x7a\x90\xea\x07\x80\xa2\x86\x1c\x99\x91\x39\x99\x16\xb4\x6b\x1f\xcb\x2a\xad\x35\x7f\x7b\xc5\x6c\x5b\xdb\xf2\xc1\x11\x84\x1b\x16\x01\x42\x47\xd9\x5b\xeb\xae\x03\x1a\xa7\xe8\x97\xa3\xa1\xb0\x79\x44\x6a\x4e\xf7\xc4\x19\x1c\xfa\xaf\x44\xaa\xa1\xd2\x0a\xd3\x67\x41\xdb\xf5\xf9\xc9\x61\xfe\xfd\xee\x68\xff\x97\x21\xc7\xf8\x3f\xe0\x67\xf4\xed\xb8\x6a\xb2\xba\xc9\xd6\xbf\x19\xfd\xc7\x33\xf6\xdf\xd9\xd9\xeb\xef\x7e\x68\xf3\x7f\xbc\x3c\x7b\xfd\x0f\xfb\xef\xef\xf1\xe3\x2f\x56\x5e\x01\x12\x8e\xbf\xae\x9c\xdd\xde\xe6\x18\x97\x27\x08\x94\xe8\xbc\x51\x90\x92\xf8\x20\x02\x11\x9f\xca\x21\x68\xdd\x0f\x6b\xae\xed\xfa\xb3\xf5\x07\x1c\x4a\xc7\xa3\xf1\x90\x50\xaa\x9e\x79\x24\x82\x83\xf9\x01\xb9\x82\xa1\x18\x98\x6a\x3f\xb6\xde\xf1\xde\xde\xe6\xc2\x98\xcc\x0d\x16\xc9\xd3\x07\x82\x4e\x46\x55\xc9\x9c\x7c\x87\xd7\x27\xbe\x3d\x39\x30\x61\x72\xfc\x0c\x2b\x03\xe2\x8f\x61\xe6\x9c\x85\xea\x7a\x8a\xee\xfd\xdf\xb9\x47\xa8\x0e\x55\x56\xee\xb4\xac\x4e\xe1\x40\x5f\xef\xeb\xa6\xdc\x42\xbd\xa5\xad\xef\xc1\x2c\x06\x03\x24\x7a\x2a\xdc\x9d\x5a\x81\x5b\x47\x0c\x47\x2f\x14\xb3\xc3\x4f\x2f\x06\xf4\xae\x81\x81\x62\x7a\x55\x0d\x8b\x99\x0c\xe2\x03\x87\x34\x81\x76\xe2\xe9\x26\x6f\x0f\x6b\x42\xc1\x0c\xae\x7a\xad\x85\x20\xbc\xef\x81\x58\x34\x9b\x0a\x3e\xd9\x5f\x49\x7b\x9b\x47\x0d\x1e\xbd\x18\x2c\x1b\x5b\xa4\xb6\x12\x06\x7a\xdd\x56\x52\x64\x93\x11\x03\x59\x1f\x7f\x1d\x61\x90\xcc\x15\x72\x7b\x40\xfc\x33\x54\xf6\xf0\x9d\xe2\xc7\x18\x38\x4a\x63\x60\xde\x63\x56\xdf\x87\xe8\x79\xbb\x9b\xa3\x17\x83\xf6\xaf\x06\xc8\x2c\x55\x82\x9d\x95\xd5\x84\x50\x17\x71\x15\xfe\xb0\xa6\xad\xae\x95\x96\x16\x34\x7f\xf4\x62\xf0\xa9\xdc\xc3\x93\x00\x36\x8c\x31\xed\x6f\xc0\x0b\x21\xc6\x2b\xa4\x2f\xf3\x8f\xe8\xf3\x1c\x60\x07\x5d\xcb\xc3\x16\x61\x0d\xf0\x37\x36\xce\x0d\x98\x03\x0b\x9a\xca\x94\x8e\x7f\xde\xd7\x10\x0a\x26\xbb\xfa\xd6\xd6\x19\x45\x2e\xd3\xcc\x42\xf8\x3e\x31\xe9\x3e\xd4\xbb\x63\x9c\xbf\x4e\x90\x8d\xbf\xdc\x98\x9d\x2b\x77\xb9\x5f\xb3\x0f\x65\x2e\xdc\x05\x75\x69\xbc\x59\x77\xe2\xbd\x25\x08\xb0\x51\xec\x52\x97\xb6\xf1\x9b\x03\x3f\x7f\x77\x55\xdd\x7a\x9b\xbe\x88\xf4\x0a\x76\xd8\xe5\xc0\x90\x62\x1b\x2c\xbf\x46\xa0\x36\x15\x2b\x22\x7d\xac\x37\x43\x6e\xbd\x63\x04\x59\x29\xe7\x46\xc3\x17\x83\x77\x18\xb9\x1e\x73\xe4\x7a\x20\xcc\x12\x98\xd7\xd8\x38\x08\x19\x63\x3f\x53\x99\xaa\xac\x71\x5b\x6f\xcf\xb9\x7c\x93\xb0\x5b\x06\x49\x31\x3e\x7f\x36\x0e\x84\x26\x71\x14\xfc\x02\xb8\xb7\x45\x9a\xf3\x99\xe0\xbf\x0e\x7c\xa5\x50\x84\xa0\xde\xd8\x95\xbb\x82\x37\xf9\x87\xf6\xd3\xf8\x09\x10\x5b\x1d\x8c\x20\xf1\x22\xd4\x8e\x2c\xde\x1a\x40\xf0\x62\x55\x03\x91\xa8\x7d\xb4\xc0\x4b\x71\x6b\x9b\x6c\xdb\xca\x17\x31\x41\xaa\x14\xfb\x38\xd3\xde\x86\x72\x64\xf3\xe6\x13\x7a\x9b\x80\x78\x6e\xe7\x75\x20\x45\x43\xab\xc8\x31\xd6\xac\xd1\xfa\xd9\x9d\x6a\xb6\x4e\x02\x33\x94\xaf\x31\xd7\x02\x77\x0f\x8d\xf9\xdb\xfd\x9d\xd9\x64\x5f\x20\xa9\x54\x56\x12\x72\x87\x5f\x85\x14\x60\x27\xbf\x53\xc1\x98\x89\x41\x4c\x9e\xf2\x45\x09\x55\xe3\x65\x15\xfe\xd2\x39\x0c\xcc\x38\xdc\x41\xea\x58\xa1\xa3\xc9\x0f\x32\x01\xc9\x9a\x6e\xd4\xba\x6f\x60\xb9\x8c\x9e\xbb\x15\xc2\xde\x14\xb2\x20\xa9\x3d\x4e\x0a\xab\x29\x20\x37\xf2\xd1\x1e\xfa\x46\x9e\x82\x31\x36\x54\x64\x09\xdf\x2c\xd5\x5f\xa2\xaf\x90\x12\xab\x6d\x83\x08\xdb\xfb\xf2\x11\x93\x92\xec\x9c\xf1\xa7\xe0\xc1\xfe\xa3\x49\x5c\x69\x1c\xa6\xba\x0c\x74\xb8\xf3\xd9\x24\x94\x90\x51\x5e\x98\x0b\x2d\xec\x90\x4a\xb7\x3a\xae\x85\xc8\x8f\x75\xe6\x43\x8d\x8a\x05\x02\x4f\xb7\x35\xed\x3d\x4d\x56\x80\x3f\xf4\x0f\x66\x57\x62\x6a\xab\xb6\x59\xda\x65\x88\xb9\xa9\x5d\xe1\x1a\x22\xf2\xf2\xa7\xd3\x83\xcd\xfd\x00\xf9\xf3\x6f\x8f\x75\xb1\xbe\x89\xbc\x8f\xe3\xef\x97\x28\xe3\xf8\xe7\xc0\xdd\x62\xea\x8c\x19\x74\x6c\x6d\x36\xcd\x6e\xb4\xdf\x8f\x0a\xd7\x48\x2d\x88\x16\xd8\xe8\x18\x27\xa0\x55\x85\x75\x9e\xc7\x47\xa4\x7f\x3f\xba\x70\xfe\xe3\xd8\xde\x06\x92\x0d\x59\x9d\xbc\x5c\x50\x86\x08\x0b\x02\x69\x51\x11\xbf\x23\x29\x78\x28\xc0\x0b\x3f\x6f\x3d\x34\x95\x23\xd6\xe1\x03\xf8\x8d\x35\x37\x24\x84\x25\x6a\x2c\x0c\xc2\x42\xad\x9a\x55\xa7\xbc\x9b\x9e\x67\x6b\x52\x9b\xeb\xfb\x5a\x42\x56\x1d\xe6\x00\xa9\x4e\x2b\xa0\x36\xd5\x2a\x33\xd6\xd4\x6e\x67\xa1\x48\x7d\x6b\x0b\x40\x9d\x5b\x16\xf1\xf6\x4b\xf9\x48\xcb\xc8\x1a\xc9\x9d\xad\xf2\x83\x58\x9b\x35\x2c\xf2\xac\x21\x42\xd1\x3a\xec\xf6\xde\xcd\x69\x8c\x49\x89\x64\x84\x54\xc6\xa2\xda\xa4\xa0\x8f\xa6\x98\x28\xbb\x36\x04\x56\x92\xf1\x2e\x6f\xd9\x80\xcc\x9f\xd9\xb7\xc5\x09\xf4\xb1\x26\x06\x0e\xd5\x39\x24\x0f\xfb\x9b\x36\x62\x14\x70\x39\xb6\xc6\xf4\x4c\x23\x61\x3c\xe6\xa0\xc0\xae\x4b\x4c\x53\xde\xa1\x96\x19\x15\xc1\x22\xa1\x0a\x2c\xde\x13\xe1\x93\x0b\x73\xe6\xfb\x20\x3b\x6e\x88\xb4\x00\xc0\x8a\x8d\x94\xac\x4f\x4d\xc3\xed\x50\xa5\x8a\x9b\xfb\x16\x06\x55\x06\xbf\x43\x18\x53\x47\x8a\xb7\xfa\x06\xeb\xd9\x71\x6a\xe9\x87\x97\x3d\xb9\xfa\xf9\xc5\x19\x6c\x29\xad\x3e\xdb\x1e\xd0\x68\xf1\x2b\xe7\xe1\xe8\xa3\xa3\x3f\xc0\xf6\x22\x9a\xa8\xd6\x92\xe6\x07\x31\x45\xee\x1a\xf5\xaf\xd5\xb8\xd7\x50\x4e\xa6\x46\xfe\xc9\x89\xfb\x25\xb3\xf2\xeb\x6c\x8e\xef\xc3\xe6\x60\x68\x8c\x76\x6b\x94\x49\x1b\xf2\xdf\x51\x19\x5b\xbc\x73\xba\x4f\x2b\x0e\xf0\x65\xbc\xd2\x40\xfc\x06\x2b\x84\x89\x48\xea\xd8\xd7\xe1\x28\xe3\x06\xf1\xdb\xe3\x3d\x0a\xf6\xa1\x52\xb8\x39\xf4\x6d\xf2\xd6\xbd\x7d\x77\x57\x39\x90\x9e\x43\x24\x0a\x0a\x19\x13\x47\xbf\x66\xdd\x1a\x86\xb3\x41\xa5\x52\x2d\x73\x0f\xf5\x7f\xa5\x1f\xa3\xdd\x7b\x50\x80\xec\x73\xfa\xe0\xbc\x13\xdc\x6a\x26\x33\x20\x03\x47\x24\x57\x09\x94\x8f\x05\x57\xda\xac\xee\x43\x06\xa5\x73\x2c\xc0\xc0\x02\x05\xba\xad\x31\x6e\x4f\x82\xba\xf8\x40\xfc\x3d\x45\x49\xe5\xf8\x3d\x7a\x0c\x72\x43\xa3\xfa\x83\x0d\xd0\xd0\x28\x3d\x75\x71\xbb\xe2\x6f\xa3\x43\x71\xeb\x80\xd2\x9c\xf4\xfa\xc0\x1b\x42\x76\x24\xf4\x49\xdd\x36\x94\x0c\x83\x54\x74\x9e\xaa\x21\xcd\x0f\xd1\x5f\x65\xf6\x52\x45\x45\xa4\x6f\xe2\x1f\x47\xe6\x1c\x3a\xeb\xaa\x5c\xb1\x1f\xab\x51\x09\x28\x1e\xe0\x37\x0e\x92\x9b\xaa\xd7\x68\x48\x92\x13\xa5\xcc\xc8\x90\x50\x6f\xbd\xf6\x9f\x71\x52\x98\x92\xfc\x48\x28\xe4\xc0\x8f\x04\x5c\x08\xd4\xae\xa5\x65\x85\x64\x54\xde\x56\x2c\x1b\x17\xa4\x44\x5b\xa6\x72\xa6\xd8\x33\xd8\x03\x50\xfa\xa3\x59\x59\x99\xc7\x2a\x6b\x1a\x57\xa8\xa4\x1c\xb4\xed\x77\x23\xac\x6c\xb9\x1e\x9f\xff\x71\xfc\x7e\x12\x95\x5c\xb1\x70\xd1\x78\x76\x11\x11\xec\x7f\x7d\xed\x15\x7f\x0b\x8a\x8a\xc6\xab\xe9\x7c\xf6\x35\xb5\x57\xd3\x5f\x26\x56\x04\xb0\x90\xf4\x1f\xf1\xe8\xa3\x3f\xa3\x6f\xb3\x2b\xdb\x64\x5f\x7e\xcb\x02\x80\xe7\xf0\xff\x3f\x7c\xf7\x7d\x2b\xfe\xfb\xea\xec\xc7\x1f\xfe\x11\xff\xfd\x7b\xfc\x00\x8a\xea\xdd\x65\x0f\x29\xeb\x2a\x14\xe2\x3b\x55\xa9\x44\x98\x51\xb8\x59\x54\x0a\x1a\x57\x91\x59\xae\xc6\xb3\x8b\xf1\xe2\xc2\xbc\xbb\x99\x81\xf0\x96\xb9\x9c\xbe\x5d\x8c\x17\x9f\xcc\xc9\xf2\xdd\xe5\x10\xeb\x46\x15\x54\xb1\x87\xaa\x26\x72\x06\xc8\x5e\x45\xcc\x99\xdd\x34\xae\x32\x42\x2a\xda\x80\x9e\x2d\xa0\xb8\xaf\xf1\xec\x1b\x20\x2a\xec\x9a\x49\x92\x6b\x2d\x00\xb1\x1e\x9a\xb3\xdf\xfd\xee\xec\xf4\xd5\xcb\x97\x2f\xb9\xb9\xe7\xc1\x9d\x0a\xe6\x83\xef\x15\x6a\xa6\x98\x96\x8a\x4a\xac\x95\x94\xd5\x0a\x40\xdd\x2d\x06\x66\x4d\x5e\xbe\x08\x41\xcc\x96\x0d\x2a\xa6\x31\x53\x4c\xf4\xdb\x92\x08\x7b\xb9\xf9\x21\xc1\x86\xdc\x4f\x23\xf3\xf6\xd0\xa2\xf8\xd7\x1f\x67\x17\x11\x20\xef\xdd\xc0\x63\xf8\x60\x43\x40\x3d\x14\x16\x04\xc4\xe4\x3a\x03\xc9\x41\xd1\xdb\x85\x06\x06\x30\x08\x48\xff\x2c\x45\xc1\x70\xbe\x09\xe3\xda\x1a\xf0\x84\xea\x93\xb7\xc8\x80\xd7\x86\x8d\x1d\x1d\x7d\x82\xf7\x86\x44\x63\xb9\x89\x65\xec\xb9\xce\x18\x02\xc7\x21\x70\x9b\x15\x69\xf6\x90\xa5\xde\x62\x56\x92\x41\xf5\xe8\x45\xa0\x36\xf4\xcd\xbd\xa9\x1d\x15\xdd\xf1\x74\x00\x34\x04\x25\x11\xc0\x5b\x6d\x63\x7f\x95\xb0\x22\x74\x4d\x59\x72\x2c\x96\xe0\x7f\xdf\x36\x21\x21\x9f\x5a\x9a\x80\xd7\x43\x0b\xad\xb8\xab\x31\xe1\xbc\xdd\x91\x43\x1f\x3d\xbc\xb3\x78\xd8\xdd\x3b\x1b\xf9\xcf\x1c\x6d\x20\x7f\x7f\x5b\xa6\xfb\x5c\xb3\xd7\xed\x91\x86\x86\x9e\xf2\x6a\x64\xae\xbc\xb5\xaf\x1b\xde\x05\x06\x47\xab\x3b\x70\x8d\xb0\x48\x2b\x67\x7e\x9f\xd0\xee\xe4\x21\xf3\x16\x54\x3b\xa7\xa4\x9a\xf3\x7a\x64\xc6\x29\xa5\xff\x77\xf7\x95\x0d\xe2\x56\xad\xda\x87\xb2\x8a\x9a\xfc\x93\x19\xb0\x52\x0b\xf4\x00\x80\x9f\x11\x60\x9c\x0f\xa1\x77\x97\xbf\x60\xe9\xa1\xfe\x03\x71\xc9\x64\x5b\xb8\x0c\xd7\xe5\xf6\x0f\x83\xd1\x0b\xac\x6a\xc2\x05\x64\xef\x64\x09\xf9\x43\x82\x87\xaf\x88\xca\x98\x38\x90\xa3\xf6\x24\x54\x67\x54\xe5\x9f\xdd\xba\x49\x94\x79\x9a\x18\xbb\xb6\xa9\xdb\x66\xeb\xc4\x6c\xa1\x7c\xb6\x3a\x60\x10\x0b\x52\x33\x2e\x31\x75\x69\xc0\xfc\xb5\x35\x81\xa7\xa1\x94\x1f\x1e\xdf\x73\xd8\xac\xfa\x7e\x1d\x04\x42\x2c\xa9\xbd\x69\xa2\x66\x82\xf9\xaa\xf6\x02\x7f\x43\x00\x3a\x23\xc5\xa8\x26\xd1\x85\x05\x26\x80\x5b\xee\xa5\xbc\x05\xdd\xaa\xb6\x95\xdf\xcf\x93\x20\x21\x6f\x0c\x99\x32\x9f\x8e\x92\x69\xf3\xcf\xd6\x40\x6e\x5c\xfd\xc4\x0e\x1b\xdf\x1a\xd2\x95\x23\xfc\xa2\x10\xb3\xd2\x02\xe4\xf8\xd6\xd0\x90\x7d\x1d\x62\x4e\x0c\x75\xee\x41\xf3\x53\xb2\xf2\xa8\x56\x19\xce\x03\x53\x65\x85\xef\xbb\x54\x06\x0b\x36\x2f\xbc\xef\x73\x51\x3e\x86\x04\xa8\x56\x3c\x23\x50\x2e\xc7\xdc\xa1\x99\xfe\xff\xc7\x44\xda\x91\x66\xf5\xba\x72\xd8\x75\xee\x55\xe5\xbc\x15\xef\x90\xf6\x7c\x4f\xd2\xb9\x3d\x23\x2a\x8c\x40\xf8\x24\xf2\x15\xa0\x55\xfc\xda\xdb\x87\x0c\x15\xe1\x7b\xbe\x4e\xf5\xd1\xd1\xf7\x64\xfe\x5b\x13\x7f\xf4\x78\x33\x81\x3d\xd3\xfb\x79\x72\x72\x0a\x77\x1e\xb1\xe2\x3d\x3b\xde\x3c\x57\x7c\xc5\x49\x96\x42\x11\xec\x61\x9a\x4b\x47\x93\xd0\xf0\x40\x8d\x84\x48\x97\x37\xf8\xa3\x2d\xbe\xfd\xc1\x35\x1c\x33\xeb\xaf\xb7\x26\x06\xea\xf0\xd0\x95\x92\x3d\x67\x48\x3b\xb9\xcc\x2b\x9f\x42\x26\xf5\xfe\xb6\x76\xdd\x7d\x41\x1c\x2c\x90\xa1\x6a\xd1\x04\xd0\xdd\xa8\x73\x43\xc8\xa6\x68\xf3\xdc\xa5\x66\xc0\xb8\xf2\xd5\x9f\x56\x83\x76\x35\x87\x22\x50\x51\x95\x95\xba\xd5\x9d\xc8\xca\x31\x43\x23\x81\xbf\xe2\x05\x8b\x75\x72\xa1\x9a\xa3\xe8\x7e\xf0\x38\x35\x7c\x3c\x26\x1c\x4a\xc2\x00\x0c\xd1\x7a\x47\x1c\x64\x9a\x8e\x35\x5a\xba\x9f\x48\x82\xcb\xaf\x55\x9d\xe1\xb4\xf5\x67\x03\x17\x8d\x2a\xe1\x2a\x75\x7d\x44\x8d\x0c\x34\x0f\x59\x93\x11\x83\xf8\x18\x0e\x7d\xc8\xad\x42\xde\x94\x96\x80\xe4\xc1\xf8\x2c\x44\xad\xfc\xde\xc8\x57\xd8\x20\x72\x7c\xd9\x26\x84\x1b\x24\xc4\x02\xa2\xa1\x85\x6b\x30\x65\xd1\x7b\x59\x8d\x5e\x28\x6d\xe4\x79\xd0\x46\x66\x9a\x22\x65\x11\x87\xea\xdb\x8e\x4a\xd9\xf3\x82\x7a\xac\xe4\x28\x0f\x19\xd8\xfa\x34\xab\x07\x49\x4f\xc1\x0e\x9e\x7f\x9f\xb3\x22\x15\x6e\x6b\x2a\x27\x41\x8e\xd8\x6e\xa9\x0e\x9e\x06\x40\x1f\x45\x28\xe1\xa6\x24\x3e\xd8\x58\x9b\xef\x6f\x29\xda\xc1\x2a\x88\xa2\xc9\x2a\x67\xaa\xac\xfe\xac\x98\xa3\x49\x7b\x05\xb3\x18\xae\x02\x66\x48\xc5\xa7\xa0\x06\x91\xe3\xd0\x23\xb3\x44\x79\x32\xfd\x77\xd0\x38\x31\xa9\x23\xb1\x1a\xe2\x30\x44\x86\x21\x29\xb2\xb3\x59\x95\xd0\xe2\x85\x9e\x97\x14\x88\x46\x04\x06\xa0\x35\xe5\x25\xbf\x65\xf8\x62\xf4\xed\xf9\xf9\xe9\xdb\x4f\xa7\xb3\xf3\xd3\xe5\xf8\xf4\xd5\xe8\xfb\xdf\x20\x10\xf0\xb4\xff\xff\xfa\x87\x97\xdf\xbd\x6a\xfb\xff\x3f\xbc\xfe\x07\xfe\xeb\xef\xf2\x73\x5e\x39\xa4\xbf\x3f\x2f\xb7\x5b\x7f\xe2\x8e\x1b\x39\xa6\x4e\x67\x65\x71\x2e\x16\xeb\xe9\xf2\xde\x56\x6e\x0c\x6a\x8c\xaf\x46\xdf\x9b\xf3\xc5\x64\xbc\x9a\xfe\x3c\x31\xe7\xf3\xab\xab\xf9\x6c\x69\xce\xe7\x8b\xeb\xf9\x02\x22\x79\xa8\xc4\xbe\x32\x63\x50\xca\x7e\x37\x5d\x5c\x41\xc0\xee\x62\x3e\xc1\xdf\xb3\x14\xfa\xe5\xe4\xfd\xf8\x52\x78\x82\x46\xe6\x62\xba\x5c\x2d\xa6\x6f\x6f\xe0\x19\x4c\xac\xc3\x7a\x54\xf2\x6d\x78\xf3\xc4\x8c\x67\x66\xbc\x5a\xcd\x17\xb3\xc9\xa7\xd3\xf3\xcb\xe9\x64\xb6\x32\x8b\xc9\x25\xbc\x7f\xf9\x61\x7a\x3d\xea\xb6\x90\x5e\xbb\xc4\xe7\x4e\x67\x20\x51\x8e\xef\x9a\xf9\xc7\x0d\xc6\xcb\xd3\xe9\x72\x60\xde\x8e\x97\xd3\x65\xcf\xf7\xaf\xc6\x7f\x9c\x68\x89\xf9\xe9\x64\x69\x16\x93\xf7\xe3\xc5\x05\x4b\xc1\xeb\x67\x72\xac\x14\x59\xa0\x98\xe8\x69\xa9\x88\x88\x94\x5e\xb7\x59\x4c\x96\x37\x97\x20\x20\xfe\x6e\x31\xbf\x32\xd3\xd5\xd2\xdc\x2c\x27\xa3\x17\x52\x22\xff\x61\x62\x3e\xce\x17\x7f\x34\x27\xe3\xa5\xb9\x98\xbc\x43\x1d\xec\xc9\xe5\xfc\xe3\x30\x0a\xcc\x22\x3b\x96\xff\x34\xaa\x18\xf3\x28\x76\x07\x23\x2a\x32\x33\x27\x83\xf3\xf3\xeb\xcb\x81\x99\x2f\xc4\x40\x18\x0c\x91\x86\x0b\x5e\x8b\xef\x58\x4d\xce\x49\x30\x3f\xa8\x9b\x47\x62\xf7\x6d\x1d\xfd\xf1\xec\x53\x60\x49\xa2\x47\xe1\x27\x57\x1f\xfc\x04\x2e\xcd\xf8\x66\xf5\x61\xbe\x98\xfe\xff\x54\xdb\xd5\xa4\x03\x3d\x15\xbf\xc9\x2f\x26\x6c\xc7\x87\xe9\xdb\xe9\x6a\x72\x31\x7a\xf1\xf6\x93\x99\xfc\x69\xb2\x38\x47\x96\x26\xff\x36\xf8\xa8\x88\xd2\xc3\x0b\x65\x70\x3e\x4c\x16\x2c\x28\x7f\x0e\xfa\xfe\x7e\x66\x40\x95\xc9\x7f\xfe\xed\xc4\xbc\x9d\xdf\xcc\xa0\x7b\xdd\x01\x94\x6a\xbc\x88\x94\xeb\xbd\x5f\x07\x4b\x78\xa4\xff\x3d\xbd\xfc\x7c\x3e\x23\xa5\x72\xff\x46\xa2\xa3\x5a\x4e\x2f\x26\xb4\x3d\xe6\xef\xfc\x37\x16\xd4\x0a\x56\xc9\x07\x46\xa8\x3e\xed\xe9\x51\x57\xf3\x89\xf3\xc1\x23\x33\x38\x17\x52\x03\xf3\xb1\xac\x3e\x33\x4e\xca\x42\x24\x28\x20\x2c\xac\xbf\xd3\xb2\x32\x05\xc9\x8f\xac\xae\xf7\x60\x03\x37\xf7\x20\x2f\x83\x4a\x2d\xeb\xc3\x1a\x6a\xa8\x33\x9b\x04\x09\x22\x7f\x7b\xf9\xe7\xfa\xdf\x64\x4d\x4d\x77\x27\x0a\x76\xef\x0b\xf1\x6f\x30\xb3\xad\x44\x68\xad\x29\xf6\xdb\x5b\xf4\x84\x98\x08\xbb\x08\x9c\xab\x49\xa8\x53\x01\xe7\x8e\xb1\x02\xc8\x0c\x8b\x75\x24\xc0\x16\x4f\xb2\x1c\x90\xf0\xa9\x5d\x0e\xaa\x5e\xc0\x6d\x51\x03\x26\x94\xd3\x30\xd6\x04\x72\x07\xf3\x78\x5f\x7a\x67\x6c\x8c\xc1\xb0\x4e\x55\x8c\x35\xad\x31\x8b\xb0\x6f\x51\xcd\xea\x45\x10\x08\x81\x0f\x9e\x74\x54\xe2\x02\x48\xf0\x08\x41\xa0\xa4\xc2\x47\x66\xd0\x7a\x5c\x3c\x57\x06\x55\x6b\xa0\x28\x5c\x46\xbd\xac\x5a\xbf\x08\x08\xa9\x5d\xe5\x4e\xdd\x97\x0c\x51\x33\x30\x4e\x7a\xb6\xa1\xcc\x37\x27\x07\x79\xbb\x47\xa9\x17\x95\xdd\x4d\x4c\x5a\x59\x6f\x41\xfe\x3b\x7d\x66\x93\xb1\x22\x05\xff\x66\x5b\x62\x16\x32\x43\xb1\x15\x82\xf7\x27\xde\x9d\x82\x28\x1f\x05\x8c\xfc\x7c\x34\xc2\x1c\x40\x71\xdc\xdb\x2a\x4b\xef\xf0\x3d\xeb\xd2\x4f\x65\x4d\x0f\x8d\xcc\x77\xf0\x51\xba\x4b\x8d\x92\x76\x95\x5b\xdb\xba\x49\xa8\x62\xb9\xac\xb6\x84\x12\xb5\xa9\xdd\x81\xc8\x92\x36\x9c\xed\xaf\x3f\xd9\xad\x99\xed\x2a\x8a\xbe\xa3\x0f\xd8\x87\x32\x4b\xd9\x56\x4c\xcb\xfd\x2d\x04\x1d\x58\x38\x1c\x77\x0f\x80\x1e\x69\x1a\x80\xbb\xa2\xce\x18\xc6\xd3\x19\x4f\x70\x7a\x0f\xc5\xfa\xbe\x2a\x19\xde\xc3\x56\x28\x6f\x45\xef\x7a\xa4\xa7\xe2\xea\xd0\x96\xdb\x96\x00\x50\xc8\xb6\xf6\xce\x99\x93\x01\x3c\x23\x2b\xee\x06\xc3\xfe\x8a\xec\x5f\xda\x61\xc6\x59\x8c\xcc\xe0\x92\x18\xa3\x07\x4a\xf0\x4b\x45\x63\xe1\x3c\x69\xbc\x35\x8d\xea\x87\x88\xda\x91\x0e\xf4\xea\x8f\x77\x5f\x94\x8e\xcc\x60\xce\x3e\xfd\x18\x7c\xfa\x67\xdf\xf7\x78\x5f\x2a\xe0\x32\xbe\x8f\x9f\xe7\x46\x66\xa0\xf7\x5d\x94\x84\x86\x28\x28\x46\xcf\x37\x3a\x80\xc0\xba\x16\x5f\xd9\xe6\xcd\xc8\x20\x4a\x98\x15\xb9\xfa\x9b\x49\xaa\x39\x8a\x20\xba\x47\x22\xcf\xf7\x85\xc1\xd2\xbb\xca\x71\x5c\x86\x98\xf5\xd2\xe3\x8d\x61\xb5\x15\x8a\x19\x96\x32\x12\xb0\x7f\xf8\xb1\x82\x44\x65\x06\x85\x3e\x0e\x93\x4b\xa1\x06\x2f\x83\xd4\xcf\xf1\x26\xa7\xae\xde\x65\x80\x4d\xe2\x06\x2b\x72\x3d\x1a\xa2\x3b\x59\x3f\xce\x4c\x48\x68\x43\x4f\x49\x48\xab\xdc\x67\x77\xf7\xa7\xb9\x7b\x70\x79\x48\x45\x91\x81\xea\x20\x1b\x50\x83\x00\x39\x66\xe7\xa5\xa5\x74\x87\x10\x61\x01\xb9\xb5\x4d\xd6\xe4\x9d\x15\xfd\x93\xb6\x77\x13\x33\x2b\x0b\x1d\xa2\x0d\x16\x2f\x23\x59\xdf\xd9\xac\x02\xaa\x76\x8c\xee\x8c\xcc\xac\x84\xf0\xbe\xf0\x29\xe7\x81\x08\x45\xb4\x7e\x50\xe9\x7b\xbf\x76\x09\x3a\xb6\x09\x06\xe9\x10\x84\x8b\x3c\x54\x94\xdd\xa8\x70\x41\xc0\xd8\x83\xa4\x0b\x04\xf2\x41\xb3\xd8\xd4\x36\x77\x82\xab\x8c\xa8\xb1\xe8\x76\x08\x4c\x24\x31\xb7\xbb\x42\x59\x3c\x16\x42\x60\x1f\x7e\x9b\xdb\xc7\xf0\x5c\x8a\xf6\xfa\xad\x90\xdb\xc7\xba\xad\x18\xf5\x0b\xd4\xd2\x5a\x23\x9d\x84\xe9\xe9\x53\x4a\x7b\x2c\xab\x3c\x7d\x04\xa1\x1d\x2d\xfe\x93\xc4\x12\x6a\x89\x5f\xa1\x3b\x07\x45\x08\x27\x7c\x58\xa5\x22\x12\x87\xfd\x55\x5d\x90\x4e\x0e\x43\x36\x4b\xad\x62\xa9\xca\x10\xcc\xe6\x47\xd2\x11\xaf\x89\xce\xd2\xdf\xf0\x3f\x05\x5b\x0b\x66\x92\xe0\x30\x6a\x4b\x21\x1c\x94\xa2\x7f\xfa\xcc\xf7\x86\x09\xe4\x82\x48\x34\xbc\x75\x13\x51\xba\xac\xf7\xa9\x08\xc2\x91\x87\xca\x32\x6e\x3f\xe2\x4d\xb0\x2e\x1a\x3e\xf8\x28\x09\xc7\x8f\x6c\x9d\xf2\xf2\x95\x35\x7c\xa5\x87\x92\xa8\x32\xbb\xfb\xb2\x28\xf1\x42\xf2\x33\x99\x88\x2e\x04\x52\x4f\xe4\x87\x84\x23\x24\xea\x37\x2a\x6e\x22\xbf\xf5\xfb\x12\x37\x36\x60\xa0\xd2\xec\x2e\x6b\x20\x3e\x9b\x66\x25\xde\xeb\x52\x06\x1e\x46\x4d\xc4\x1f\xbb\x43\x70\xac\xfb\xe9\xff\x56\x7d\xe9\x1d\xf1\x95\x5f\x9b\xb7\x65\xd8\x9f\x64\xe5\xf0\x72\xc4\x5a\x97\x3c\xa7\x92\x0e\x52\xf8\xdb\xda\xa6\xf6\xb6\x04\xec\xce\xa2\x7c\x84\xb4\x01\x58\x0d\x7e\x1b\x61\x4a\x3c\x75\x0f\xfe\xfb\xa3\xee\x2b\x38\xa2\xde\xad\x3f\x02\x43\xb1\x95\xdd\x40\xae\x7e\x91\x6f\xcc\x0f\x31\x0b\xf9\x91\x7d\x43\x70\xfd\x76\xa3\x47\xa0\xc6\x44\x1f\xf3\x17\x58\x20\x93\x51\x6a\x18\xe1\xcc\xae\x1c\x1f\x0c\xc4\x75\x1d\xb1\xf8\x74\x23\x83\xba\x15\x41\x96\x27\xe8\xe2\xd4\xe6\xbb\x13\x87\xf4\x6a\xdf\x9d\x6c\x86\x7d\xc2\x10\x38\x60\x6d\x8d\x0e\x25\xad\xf3\x9a\x46\x33\xd3\x54\x38\x1d\x5d\x06\x00\x84\x61\xb3\xa8\xec\x2a\xd2\xdc\x95\xd7\xa9\x83\xa4\x0b\x2a\x4e\xc2\x32\xa3\xf5\xa9\x7e\x43\x2b\x11\x13\x84\xe1\x63\xb0\xfe\xc2\x9f\x95\xd3\x50\xe4\x87\xe7\xec\x95\x44\x84\x86\xdb\xb9\x17\x2c\x5c\x90\x7c\xee\x4d\x91\xc1\xd3\x17\x8e\xd2\x28\x53\xd4\x6c\xca\xd0\x7e\x4f\x7a\x0c\x0f\xf7\xe0\xaa\x03\x3d\x28\xda\x80\x91\x15\xfb\x29\xe2\x03\xfb\x15\x06\x20\x86\x80\x8a\x84\x5b\xb6\x05\x63\x16\x10\xc8\x38\x12\xea\xb4\x41\xdf\x21\x6f\xf0\xa3\x72\x2b\x1f\xb7\xac\x4a\x16\x69\xe0\x7a\xa0\x6f\x22\x05\x44\xb5\x2a\x79\x41\xf5\xa8\x5d\xf8\xf6\x29\xe2\x3b\xb1\x53\xc3\x7c\x7c\x76\x6e\xe7\x2f\x10\xeb\x4d\x04\xf4\x57\x82\x42\x1d\x60\x60\x3a\x4a\xd3\x4a\xe1\x25\x14\xe1\xf8\x36\x85\xb0\x79\xdc\x82\xdf\x68\xf5\x49\xce\x43\xe4\x6b\xc1\xe9\xd9\x3a\x5b\xef\x2b\xee\x02\x97\x6e\x5a\x20\x4e\x26\x85\xa1\xb6\x93\x63\x59\x27\xc8\x5f\x03\x91\x80\xdc\x13\x13\xd4\xca\x8a\xe3\x0e\x56\x14\x08\x4f\xdd\xb0\x1d\x67\x11\x73\x12\x54\xf9\x4a\x69\x4e\x56\x97\xe8\xb9\x8e\x8d\x85\x9c\xa9\x18\xcf\xd8\x11\x4c\x05\x21\x77\x46\xfb\xf4\x38\xee\x4f\x98\x29\xa8\x66\xc8\x9d\xde\x6d\x1a\x04\x06\xa8\x42\x08\x5e\xe9\x07\x5d\x4e\x54\x5e\x4a\x49\x4b\x1c\x66\x57\xd9\x75\x83\x06\x52\xc2\xb8\x23\x55\x3c\xd5\xea\x4f\x71\x90\x64\x6c\x1d\x92\x66\xb7\xa0\x44\xeb\x67\xec\xbb\x93\x74\x98\xf0\xdf\x5c\xdd\xf8\x6b\xa8\xdd\xf0\xd6\x75\xf8\x9b\x34\xbc\xed\xca\xfe\x35\x0d\x0f\xa6\xd4\x6f\x73\x3e\x77\x1d\xee\xaf\x3c\xa8\x8d\x77\xf7\x2a\xcd\xaa\xd1\x3d\x73\x1b\xae\x37\x6c\x7b\x56\x28\xfa\xa2\x9f\x07\xb9\xb1\x4e\xe4\x3f\xe3\xff\x08\xa7\x92\x92\x33\xfd\xfa\xe7\x9b\x13\x37\xba\x1b\x7d\x7d\x22\xe1\x5f\xec\xce\x16\xc3\xd1\xaf\x7f\x15\x29\x67\x89\xb0\x4c\x88\x28\x0b\xc6\xb4\xb8\xa8\xb5\xf3\xce\xda\xfa\x6b\xae\x2f\xc0\x20\xb4\xe7\xf1\x3f\xfa\x2a\x6b\x1b\x9c\x7f\xd7\x6b\xad\x65\x49\xfc\xe7\xbc\xb9\xda\x33\xfa\x9f\xe0\x12\xeb\x1c\x79\xbf\xfd\x7d\xd6\x7e\xe5\x5f\x79\xb5\x05\x07\x54\x4f\xaa\xac\x37\xc5\x7f\xd4\x5a\x73\xa4\x3f\xd9\x67\xa2\x23\xd4\x8e\x86\x1a\xe1\x0b\xb5\xd9\x55\xd9\xd6\x56\x59\x7e\x50\xca\xcb\x50\x37\x49\x10\x24\x78\xe4\xa3\xad\x74\xe5\x88\xb1\xe9\x83\x2d\x1a\x2a\x7c\x23\x3c\x9e\xd9\x96\x85\x6b\x2c\x1c\x0b\xdb\x1d\x47\xb3\x09\x4d\xf0\x85\x28\x7c\xf4\xc4\x6f\xe4\xf4\x91\x20\x84\x4b\x29\x9b\xa1\xfd\x48\xf6\x22\x37\x59\xee\x4e\xeb\x7b\x5b\x11\x6f\x40\x28\x9f\x3d\x56\x53\x82\x83\xfe\x9b\xf4\x2b\x2a\x51\x74\x15\x41\xc3\xcc\xce\x1e\x18\x2a\x85\xd8\xb6\x9e\xaf\xf6\xeb\x7e\xc7\x83\xd4\x19\x11\x15\xef\x9d\xb6\x79\x82\x7f\x5d\xc7\x88\x34\xbe\xdb\xc7\x65\x59\xf5\xc4\x66\x8e\x9e\x68\xdd\x1a\x78\x8e\x45\x49\x86\x46\x64\xa3\x55\x41\x1c\x6d\x09\xac\x58\x86\x98\x10\x2c\x02\x46\x25\xed\x9b\x2c\xcf\xfe\x3d\x2b\xee\x7e\x02\x69\xe2\xa6\x55\x16\xd4\x8a\x83\x43\x6d\xe0\xae\x76\xfb\xb4\x2c\x0e\x5b\xe0\xa2\x08\x81\xaf\xa1\xff\x27\x23\x89\x12\x26\x1e\x46\x49\xdf\xfe\xa7\xd1\x47\xc4\x06\x43\xc6\x37\x8c\x25\x51\xb6\x09\xd4\x0e\x89\xa3\xd9\x9f\x42\x78\xcd\x5b\x53\xef\x4a\xf8\x4a\xc6\x39\x17\x9a\x1f\xe4\xa4\xc7\x70\x77\x62\xfe\x5c\xee\xab\xc2\xe6\x98\x2e\xb3\x8d\xd6\x40\x96\xb7\x7e\x53\x77\x86\x36\x09\x27\x08\x43\xbd\x14\x85\x72\xc4\xa2\xe2\x07\x33\x89\x86\x0d\x29\xaf\x5a\xed\x7e\xd3\x8e\x06\xf3\x51\x16\x46\xec\x4d\xcb\xf0\x54\xe2\xdb\x91\x0d\xfa\x8c\x49\x82\x93\x52\x1c\x48\xc4\x46\xc6\x96\xcd\x10\x96\xa4\x53\xe4\x09\xb2\x5d\xc8\x4e\x46\x9a\x30\xe8\xc7\xcd\x62\xaa\x8f\x6c\xb9\x46\x5d\x67\xcc\x62\x31\x03\x2d\x71\xab\x97\xe9\x1b\x0a\x93\xe3\x23\x48\xed\xab\xc7\x56\x17\x30\xa6\x96\x6a\x6e\x62\x5e\x62\x49\x4a\xf5\x5c\x11\xb0\x4c\x12\x33\x78\x57\xb9\x62\x7d\xaf\xd3\x92\xd1\xb7\x6f\x0f\xed\x35\x99\x0c\x7c\x47\x06\xcb\x75\xe5\x5c\x01\x01\x3b\xcc\x8f\x42\xce\x8c\x3e\x79\xe4\xab\x83\xe1\xc8\x2c\x81\xbd\x1c\x9b\x4e\x91\xb6\x6c\xbb\x43\x9b\x95\x2e\xc7\xe2\x10\x2d\x20\xb8\x3a\xde\x1c\x15\x21\x7a\x6e\xa8\x7a\x0e\x91\x04\x39\xd7\xb7\x59\x91\x6d\xf7\x5b\x22\x54\xc7\x26\x41\x3e\x8e\xe8\x20\x31\x55\x18\xb2\xa2\x4a\xc4\xbb\xa3\x14\x4d\xdf\xa9\x79\xf6\xc4\xba\x90\xfa\x71\xd4\x6b\x26\xfe\x08\x26\x7e\x7b\xfe\xc1\x2a\x47\xf6\x2b\xa4\x35\x95\xce\x7a\x36\x32\xd7\x0a\x4d\xb7\x10\xcd\x8d\x1b\xf0\x7b\xde\xe6\xb6\xf8\xec\x04\x25\x5c\x8f\xc2\x46\x11\xd1\xbb\x9e\xf4\x06\xd6\x53\xc0\x68\x27\x12\x1f\x0d\x99\x36\xe4\xd4\x7e\xc8\x2c\xe2\x1e\xe4\xed\x1c\x30\x2c\xd7\x99\x6b\x0e\xec\xaa\x2c\xcf\xc7\xd7\x89\x79\x7b\x35\x4d\xcc\x72\xb2\x1c\x9f\x0f\x13\x25\x0d\x12\x92\xa2\x50\xee\x10\x21\x03\xf9\xd6\x91\x6b\x5c\xff\x15\x1f\xfe\xe8\x6e\xd7\xb6\x6e\x86\xed\xc3\x06\xf5\xbc\xd5\xc7\xff\x0e\xe6\x8a\x9a\x94\x6c\x64\xae\x9c\xbf\x92\x61\xe6\x16\x41\xc6\x6f\xd9\xd8\x66\xdf\x94\xd5\x21\xcc\xd4\xaf\x3f\x25\xb0\x62\x24\xed\x05\x9c\xd1\x46\xdf\x3a\x29\xfc\xb2\xa1\x21\xfc\x60\xab\xea\x60\xde\x95\x5f\x88\x5e\xba\x33\x3d\x80\x75\x57\x6e\x9a\x8a\x3e\xc4\xa1\x98\x93\x01\xd4\xaf\xb1\x27\x4d\xf2\x1b\xda\xd8\xe8\x28\xa3\x6c\x77\xfb\xbc\xf6\xc3\x21\x1a\x19\x94\x5c\xbe\x3d\x98\xb3\x1f\xcd\xcd\xf2\x5c\x6c\xd1\xb3\xb3\xef\x79\x96\x6f\x96\xaa\x02\x65\xbc\x6e\xe0\xba\x86\x31\x0b\xd4\x25\x12\x3b\xff\xf3\xbe\xca\xea\x94\xa2\xc4\x43\xb8\x36\x3e\x11\xce\x3f\xc2\x0c\x93\x20\x83\xea\xc0\xdf\x71\xd1\x00\x51\x2b\x2c\x65\x7f\x01\x3c\xb7\x60\x7e\xe9\x11\xd2\x81\x40\xfc\x86\x87\xc0\x69\xef\x21\xb0\xf4\x2d\x98\x90\x95\xfa\xd4\x01\xf0\xcb\xb6\xfa\xdf\xba\xa2\xbe\xfb\x55\x57\xd4\x13\x5d\xf8\x3b\xad\xa4\xef\x47\x66\xe1\x40\xce\x94\xaa\x77\xea\x84\xe1\xea\x19\x15\xf7\x04\x2c\xbb\xff\xc2\xcd\xec\x12\x0a\xca\x59\x93\xd1\x5c\xdd\xac\x6e\xc6\x97\x97\x9f\x10\xb8\x77\x01\xc8\x3d\x04\xec\x41\x09\x38\x48\x57\x9a\x8f\x8b\xe9\x0a\xca\xcc\x95\x7c\xe6\xbb\xc9\x62\x19\x40\x81\x80\xf5\x04\xa0\x9d\xc0\x3a\x17\x93\xeb\xc5\x64\x39\x99\x61\x39\x3a\x14\xb1\xc7\x55\xe8\xe3\xd9\x27\xf3\xc7\x29\x62\xf3\xce\x27\x8b\x19\xc3\x3e\xfd\x03\x13\xae\x7d\x4f\xb8\x84\x3d\x31\xcb\xd5\x78\x75\xb3\x02\x9d\x4a\xa5\x2a\xf9\x6c\x19\x7c\xfc\xd2\xd5\x74\x75\x39\x49\xda\x15\xf0\x5f\xa3\x3e\x3a\x9b\xcf\x62\xe1\xd1\x39\x22\x43\xc7\x6f\x97\x13\xc2\x1c\x5e\x8e\x57\xa0\xe0\xc9\xf8\xcd\x8b\xc9\xbb\xc9\xf9\x6a\x99\x98\xf1\xf9\xf9\xcd\x62\x7c\xfe\x49\xbe\x84\x43\x83\xdf\x52\x0f\x98\x2c\x16\xf3\xc5\x32\x48\x6f\xce\x17\x80\xd1\xbd\x98\x2e\xcf\xe7\x3f\x4f\x16\xe3\xb7\x97\x93\x91\x59\xce\xaf\x26\xe6\x5f\x6e\x16\xd3\xe5\xc5\xf4\x1c\xc7\xf6\x62\x8e\x08\xe1\xcb\xcb\xf9\x47\x78\xfe\xe4\x4f\xe7\x97\x37\x4b\x42\x47\xf6\x71\x07\x2c\xe7\x88\x90\x0c\x1f\xbc\x1a\x7f\xc2\x87\x5c\x5f\x5f\x7e\xf2\xeb\xe0\xd3\xfc\x86\xa9\x2e\x2e\x83\xdc\x47\xe9\x3d\x0c\x2a\x12\x18\xf9\xaf\x4f\xae\x57\x8c\x0f\x9d\xfc\x69\x85\xc0\xe1\x7f\xbd\x99\x2e\x10\xd9\x1a\x43\x58\x93\x48\x96\xf5\xe3\xf4\xf2\x32\x2c\xa9\xa0\xbf\x8a\xef\x66\x6d\x52\x84\x35\x93\x42\x29\x4b\xb3\x8a\xf8\xaa\x56\x64\x8d\xa4\x57\x13\x73\x7d\x33\x9b\x02\x48\x77\xbe\x08\x1a\xad\x02\x11\x66\x2d\x52\x11\x20\x8d\x71\xb2\x91\x20\xa9\xac\x49\xd2\x22\x95\x36\x7f\x18\x2f\xcd\xdb\xc9\x64\xf6\xf5\xea\xa4\x4b\xe6\xc7\x58\x05\x5d\xcd\x90\xc9\x5c\x75\xe2\x78\x4f\x44\x0a\xd1\xea\x15\x15\xd2\x16\x3b\x08\x64\x05\xfc\x55\x7e\x5b\x41\x90\x95\xc4\x44\x85\x8c\xb9\x3f\x49\x22\xa7\x7d\x2d\xe8\x2a\xa8\x9e\x00\x8c\xd3\x83\x0b\x20\xa7\xaf\x71\xfa\xd1\x5c\xf0\x6f\xed\x42\x9b\x94\x3f\x20\x08\x42\x78\x03\xf2\x08\x89\x1a\x87\x12\x59\x95\x28\x0a\xdc\xdc\xd9\x91\xa6\x62\xb9\xb4\x3f\xbc\x8f\xe8\x50\x97\xa1\x1a\xbb\x1e\x85\xfc\xf6\x59\x62\x5e\x25\xe6\xfb\xc4\xfc\x90\x98\x1f\x31\x08\xfb\xcf\xd8\x34\x2d\x89\xaa\xd5\x50\x8f\x23\x53\x5b\x88\x1e\x8c\xa9\xf5\xe1\x7a\xd0\xeb\x6d\xe7\xcc\x39\x48\xf4\x57\xc2\x73\x34\xfc\x66\x08\xa0\x2a\xdf\x73\x60\x51\x62\x6f\x93\xc4\xcc\xfb\xcd\x02\x31\x06\x88\xc9\xbc\x0d\x34\x64\x8e\xa5\x26\x2e\x6a\x37\x88\x6a\xab\x9b\x72\xd7\xad\x62\xc3\x50\x0e\xe2\xb3\x9a\x6c\xeb\x7a\x1c\x43\x8a\xb2\x73\xc9\x9c\xcb\x25\xe8\x45\xcb\x03\x9a\x08\x04\x36\x59\x73\x9f\x56\xf6\xb1\x95\x28\x89\xb0\xb0\x51\xda\x85\x89\x50\x51\x15\xaa\x8e\xca\xd5\x6e\x5d\x22\x03\xff\x4c\xee\x68\x48\x08\xa3\x38\x5b\x04\x8b\xac\x68\xb2\x62\xef\x64\xd5\x6d\x4a\x96\xac\x23\x99\x79\x8a\x3d\x68\xc9\x60\xc1\x45\x05\x11\xfc\x7f\x1e\x99\xab\xac\x5e\xbb\x3c\xb7\x85\x2b\xf7\x0a\x97\x3e\xf1\x5b\x18\x0a\xe4\xe2\xe4\xc8\x2f\x09\xd5\x75\xfd\xe9\x08\x91\xc8\xa8\xd2\x32\x4e\x5d\xa8\xea\x75\x9d\xee\xa5\x54\x09\xe4\xb0\x7a\x11\x6b\xc4\xf1\xde\x5e\xdb\x14\x73\xee\x1e\x08\x6a\xfb\xfc\x95\x9d\xed\x09\xb7\xfc\xf2\xce\xc5\xc1\x90\xdf\xac\x97\x6b\x88\xcd\x52\x39\x3b\x6a\x39\x77\xb2\x16\x80\x7a\x7c\xb0\x79\x06\x15\x7e\xfb\xc2\x15\xb0\xac\x60\xb3\xe3\x93\x63\x7c\x61\x62\xb2\x46\xc5\xb7\xa9\x4a\xdd\x37\x0f\x1e\x92\x35\x54\x98\x40\x4f\xc1\x32\x3f\x91\x37\xf6\xa7\x66\x8a\x79\xa2\x67\x50\x2e\x5c\x9d\xb8\x41\x45\x3a\x28\xe6\x2c\x0b\x46\xeb\x70\x40\x93\xb3\x52\x36\x54\x8e\x63\x04\x51\xfa\x2b\x22\xd0\x95\x43\x38\xba\xc4\x74\x29\xc2\x43\x01\xc3\x08\x36\x15\xe0\x56\xe1\x41\x38\x46\xb0\xdb\xc2\x10\xa9\x28\xf8\xac\x84\xee\x18\x2e\xa0\xed\x1d\xed\xb6\xd6\xf7\xa3\x85\x7b\xce\x3f\xb5\x28\xf9\x12\x5d\x97\x45\xed\x78\x86\x75\x3c\x11\x3e\x5d\x61\xe1\x21\x7c\x24\x3c\x2f\x2b\x80\x12\x4a\x24\x4b\x51\xfb\x43\x8d\xd6\x81\x85\x40\x88\x7c\x17\xf9\x22\x7b\x9f\xaa\xc2\x4a\x91\xa9\xd0\x56\x29\xa1\x92\xcc\x40\x34\x73\xeb\x9a\x47\xe7\x8a\x68\x86\x8e\xa1\x9a\x79\x35\xe3\x45\x04\x59\x19\xff\x2c\x28\xf5\xc5\x85\xc7\x77\x49\x9d\x84\x57\xd4\x98\x1a\x8d\x9c\x91\xe3\xaf\x80\xf3\x5c\x12\xc8\xf8\x9e\x10\xd2\xd5\x39\x9a\x5b\xf0\x65\xa9\x40\x5b\x2b\x44\x06\x0d\x74\xa4\x3d\x46\x4a\x5c\x12\x84\x01\xc0\x02\x92\x25\x13\xdb\x02\xdb\x22\xad\x91\x53\x74\x60\x52\x7d\xc3\x0b\x1c\xd6\xe2\x1e\x2e\x60\x26\xf5\x0a\x23\x4a\xfb\x24\x82\x49\xfb\xc7\xbf\xe8\x42\x01\x88\x35\x22\x4c\x76\x77\x4f\xf9\x65\x0d\x59\x21\x29\xf9\x7d\xbc\xb7\x4d\x4d\x04\xdb\xfd\x49\x20\xc4\x38\x75\x5e\xa7\x0b\x32\x48\x30\x8f\x8e\x23\x8e\xed\x60\x0c\x1f\x07\x09\x15\xd7\x9b\x7b\xe7\x5d\xe8\xb6\xb0\x5e\x68\xc3\x33\x1a\x80\xa0\xe6\x82\x44\x26\x09\x0b\x5d\xc0\x57\x20\xcc\x8d\x50\x7d\x58\xc2\x7f\xd9\x93\x62\x08\xbf\x82\x51\xda\x71\x1f\x79\x8c\x72\x36\x4c\xfb\x8c\x98\xa0\xef\xde\x3c\x96\xe6\xe4\xd5\x50\x80\x07\x35\xf8\xe8\x9d\x91\xb9\x8f\x45\xf8\x38\xb5\x90\x72\xe2\x95\x0e\xf3\x08\x5a\x4d\x39\x79\x39\x59\xc1\x46\xb5\x01\x8b\x89\xb2\xb4\x79\x76\x67\x05\xa8\xcd\xdf\x1f\xbd\x40\x99\x27\x09\x79\x88\x5c\x53\x28\x08\xd1\x94\x0b\xa5\x8e\x8b\x08\x95\x05\x47\x75\x64\x53\x06\x23\xe5\xfc\xfc\xfa\x32\x31\x05\xd5\x83\xe3\xb4\xc2\xec\x33\x73\x4a\x53\xd9\xd4\x6d\x6d\xf5\xd9\x0c\xda\x83\x31\xe0\xd5\xc0\xda\x7b\xe1\xb3\x65\x65\xf2\xf2\xae\xf4\xcd\xeb\x59\x5c\x61\x6b\xc4\x74\x77\x7c\xee\xf5\x7c\x0b\xe5\x0d\x83\xac\xe2\x5e\x69\x1a\xc2\xbc\xc7\x26\x7a\xfb\xeb\xdf\xf8\xb7\x15\xa7\xeb\x7d\x05\x46\x67\x68\xe8\xbe\xb6\x77\xce\xdc\xed\xb3\xd4\xe5\x59\x01\xa5\x6c\x82\x03\xa6\xa4\x19\x66\x38\xb2\xa6\x36\x8f\xee\xb6\x26\x4a\x0f\x4d\xa6\x9c\x6a\xcd\x52\xad\x20\x4a\xb1\x4e\x6f\x85\x34\xc8\x4d\xd0\xb3\xb5\x45\x85\x01\xd2\x99\xa8\xc2\x4d\x9c\x02\x6b\xfa\xec\x9a\xc6\xa0\xac\xee\xbe\xfd\x87\x96\xcb\x7f\xed\x9f\xd1\xb7\xe7\x93\xf3\xe9\x25\xe8\xfe\xfd\x56\x1c\x80\x4f\xd7\xff\x7f\x7f\xf6\xe3\xeb\x97\x1d\xfe\xbf\x1f\xfe\xc1\xff\xf7\x77\xf9\x39\x77\x7e\xf6\xcd\xbb\xc5\x64\x12\xf4\x47\x39\xa8\x04\x01\xd6\xab\xc9\x6c\xe5\x2f\xb3\x6c\xed\x90\x13\x30\xd0\xf8\x40\xe4\x3e\x16\x0b\xeb\x12\x06\x32\x14\x07\x6d\xf6\x7a\x9f\x37\x08\x7b\xa9\xd7\xfb\x1a\x8d\x21\xb6\xf4\xfc\x99\x47\x69\x49\x88\x64\x57\x44\xb5\xee\x8a\x7a\x5f\xb9\x9e\xb8\x88\x83\x6b\x14\x82\x27\xbb\xca\x5f\xdd\xbb\xdc\xd5\x70\xba\xc2\xfd\xdc\xd4\x26\xad\xec\xa6\x61\xfe\xec\xff\x86\x95\x54\xf9\x21\xe9\x7d\x96\x7e\x04\x88\xed\x05\x86\xe6\x38\x0d\x13\xf5\xf8\x27\x06\x7f\x35\x65\x4c\x6c\x78\x5b\x95\x36\xed\xc1\x2f\x81\xea\x4c\x82\xed\xa9\x9d\x77\xcc\xf2\x03\xfa\xb5\x4e\x09\xb0\x58\xd5\x06\x70\x94\x28\x7d\x0e\xff\x0d\x4d\xc6\x92\x59\x54\x79\x5e\x97\x98\xe4\xf7\x2e\xcb\x6d\xd9\xdc\x23\xac\xf5\xce\x56\x29\x39\x7b\xf6\x11\xac\xbf\xb2\x6a\x38\x71\xdc\x38\xf0\xac\xf7\x68\x97\xee\x9c\xbf\x89\xe1\xe1\x1c\xc3\xdb\x55\x65\xc3\xb6\x0d\x91\xc1\x04\x97\x14\x5f\x42\x73\xe5\xbf\x71\x0f\x54\xb5\x52\x73\xe6\xfb\x55\x6e\x43\x8a\x0f\x72\x56\xb5\x28\x17\x03\xa4\x8d\xbe\xcd\xac\xb7\xb0\x10\xff\xd7\xff\x13\x56\x50\xe5\x7e\x62\xe2\x2b\x7f\x79\x65\xde\xa1\xca\x6c\x63\xfe\xdf\xff\xdb\xe4\xdf\x4c\x0a\x57\xdd\x65\xce\x8c\x9b\x72\x9b\xfd\x65\xef\xcc\xa9\x39\x9f\x8c\x13\x6f\xb2\xa2\x35\x52\xaf\x33\x34\x96\xd6\x49\xa8\x68\xe1\xca\xc0\xbd\x9f\x50\x9b\x43\x10\xc9\x56\xeb\x7b\xe3\xea\xc6\xc2\xed\x8b\x6e\xdf\xbd\x7d\xe0\x15\x44\xab\xc2\x0f\x13\x28\x20\x94\x1b\x73\xbb\xaf\x33\x20\x99\xb1\x8d\x79\xf5\xbd\xa9\xf6\xce\x5c\x3a\x50\x27\x4a\x4c\xb6\xdd\xba\xbd\xbf\x98\x2f\x9d\xb9\x2e\x0b\x5b\x34\xe6\x22\x31\x3f\x7e\xff\xf2\xec\x7b\x73\xed\x2d\x47\x3f\x93\x7e\xdd\x09\xa9\xd7\xb9\x2b\x9a\xca\x05\x29\xdd\xd4\x4f\x97\x59\xb8\xf5\xbd\xab\xd6\xf7\xce\x2c\xb9\x23\xd4\xcb\xd9\x62\xd9\xdb\x4d\x9c\xb8\x08\xac\xf8\x57\xf7\xea\x35\x74\xea\x2a\x5b\xdf\xbb\xfc\x74\x5c\xdc\x39\xdf\x85\x1f\x7f\xf7\x1d\x76\xc1\xac\x5d\xea\xbe\x98\xb3\x1f\x3a\x7d\x99\x92\x4f\x17\xf5\x26\x74\xc5\x15\x66\xca\x68\x14\xdf\x1b\xd7\xf8\x5f\x8d\x29\x08\x8c\xfd\x9b\xce\x16\xd3\xfe\x79\xfc\x35\x3b\x88\x32\x15\xde\x73\x36\x3f\x97\xf9\x7e\xed\xec\x3e\x31\x8b\x72\xed\x8d\xfd\x75\xb9\xaf\x9a\xc4\xbc\xbd\x36\x67\x2f\xbf\x4f\xcc\x8f\xff\x7c\xf6\xfd\x6b\x3f\x9d\xe7\xf7\xae\x2e\xec\x01\x7b\x1f\x75\x9d\xf5\xb2\x00\x0d\xd8\xae\x9d\x7e\xee\x7c\x44\x1d\x2d\x38\x20\x48\x91\x2a\x8a\x68\x0a\x3f\x5e\x1a\xeb\xcc\x40\x90\x87\x9f\x8a\x67\x05\xfb\xe8\xaa\x0c\x95\xb4\x23\xc0\xf7\xa8\xec\xd6\x49\x79\x73\x61\xca\x9d\x2b\xf8\xc4\x8a\x4e\xb8\x6d\x99\x3a\xe4\x9c\x43\x70\xa3\xd4\x29\x0b\x17\x16\xd7\x7e\xd5\x21\xae\x64\x73\x34\x45\x59\x0f\x54\x3b\x18\x1b\xc4\xc5\x56\x20\x3a\x81\x74\x4b\x3b\x0a\xdf\x12\x3f\x75\x63\x9b\x3d\x65\xf2\x21\x7a\x7d\x4b\x6e\x97\xee\xb2\x10\xfd\x4f\x0b\x41\x41\x4a\x60\x39\x9c\xc1\x4d\x8b\x27\xb3\x95\x92\x10\xb1\xd9\x63\xe3\xaa\x6a\xd3\x54\x98\x2c\xa1\x0e\xf8\xc1\x96\xa0\xbe\xa8\x73\x40\x4c\x0e\x1d\x25\x71\x86\xf9\xbd\x3c\x47\xdf\xf0\xdd\x86\x67\x3d\x9e\x97\x47\x8e\xcb\x70\x08\xd7\x7b\xe8\x98\x37\xe0\x73\xf2\xd1\x6a\x7c\x2f\x78\x75\xfc\xd6\x5c\xd2\x5b\x34\x40\x30\xac\x14\xc5\x48\xa8\xff\xf5\xe7\xba\x03\x35\xcb\x4b\x8b\xe9\x76\x50\xba\xe5\x51\xa1\xc0\xcf\xb7\x80\xc8\x00\x41\x35\x02\xa5\x72\x4d\x29\xdf\x8c\xb2\x00\x83\x54\x3d\x56\xf2\xdd\x82\x60\x98\x04\x50\xfc\xef\xfd\x00\x34\xa0\x3e\x59\x16\x09\x09\xa9\xfa\x9d\x1a\xef\x0f\x5c\x0a\x22\x33\xc2\x9a\x48\x59\x43\x57\x36\x96\x74\xe3\x35\x9a\x84\xbb\x9b\x0c\x0b\xba\xa8\x6a\xe4\xf0\xad\xa5\x92\x10\x79\xea\xb0\x2b\xae\x62\x8d\xd6\x9d\xab\x32\x07\x8a\xf1\xbb\xaa\xdc\x38\xb0\x46\x6c\x5e\xcb\x31\x52\x9c\xa6\x6e\xd7\xdc\x93\x98\x95\xab\xa0\xf4\x32\x77\xe9\x9d\x1b\x99\x1b\x59\x0e\x00\x90\xf5\x8e\xbd\xc1\xa3\xc3\xde\x61\x03\xfd\xd0\xd2\x91\x55\x13\x8d\xe1\x3e\x6b\x5a\x41\x4c\x19\xc0\xf8\xc2\xce\x2a\x0e\xf8\x63\x9c\x0a\x43\x0d\x1c\xc1\x75\x85\x3f\xf4\x78\x0a\x58\x79\x1d\x9f\x98\x31\x5b\x70\x2d\x33\x68\x1b\x4b\xe1\x3a\x34\xa4\xa0\x55\x09\x16\x24\x53\x04\x04\x2c\x90\x20\x77\xe7\x07\x09\x39\xec\x38\x31\xd3\x16\xb2\x02\x38\x26\xbe\x98\xa2\x53\xc1\x2a\x64\x9d\x2d\x64\x37\x94\x32\x64\x1c\x0c\x71\x72\x15\xc4\x18\x6d\x18\x08\x38\xe5\x8d\xab\x58\x48\x86\x85\xbe\x54\xd8\x0c\x68\x4b\x31\x76\x60\xd3\x14\x79\xe4\xb0\x10\x08\x23\x72\xde\x01\xa6\x93\xab\xd3\x24\x51\x92\x85\x8c\x0b\x9d\x34\x3c\xfc\x9b\xb2\x52\x1c\x24\x4f\x6e\x4e\xd1\x0d\x06\x75\xbb\xdb\x6d\xd6\x08\x1a\x12\x96\x02\xd8\x59\x74\x07\x71\xc3\x91\x32\xb0\x6a\xb2\x75\xee\xcc\x99\x39\x45\x02\x27\x24\xf7\xf1\x7f\x7a\x77\x84\x77\x23\xe2\x30\x75\x4c\xeb\xc8\xb5\xa5\x14\x18\x82\x91\x41\xf9\x61\x36\x67\xad\x59\xdb\x1d\x20\x3c\x72\xd7\x34\x88\x60\x74\x07\x1d\x0f\x8a\x9f\xb4\x75\xb6\x50\x2a\x33\xf4\x3f\x81\x8e\x58\xb8\x19\xfa\x28\xc1\x71\xb6\xa0\xc3\xa8\x6c\xe1\xf4\x09\x2e\x82\xc3\xc0\xb7\x59\x14\xee\xff\x63\xef\xea\x96\xdb\xb8\xb1\xf4\xbd\x9f\x02\xe5\x9b\x91\xb6\x5a\x3d\x26\x65\x67\x92\x99\x54\xaa\x34\x32\xed\xd1\x96\x2c\xba\x44\x39\x99\x5c\x82\x4d\x50\xc4\xba\xd9\xcd\xe9\x1f\x29\x9c\xa7\xd9\x77\xd9\x17\xdb\xc2\xf9\x01\x0e\xd0\x4d\xda\xd9\x24\x7b\xc5\xbe\xb1\x2c\x91\xdd\x68\x00\x07\xe7\xef\x3b\xdf\xf9\xc5\x78\xb8\x37\xfd\x13\x4c\xe9\x40\x01\xe1\x57\x86\x58\x87\xe6\x98\x9e\xbc\xa6\x23\xdd\x6d\xec\x05\x9e\xf2\xd7\xc4\x86\xbc\xc5\x6d\x4d\x58\x4a\x9f\x66\x40\xca\xf1\x84\x2f\xf6\xa5\x76\xda\xeb\x65\x98\x54\x8a\x6c\x02\x0b\xb2\xc1\xfe\xe2\x29\x61\x6d\x18\xef\x4d\x65\x21\x20\x38\x36\xee\x45\x32\x6e\x39\x48\xd8\xff\xdc\xfc\x23\x7d\xa9\xdf\xf2\x06\x28\x40\x48\x13\x21\x9b\x40\xa6\xc9\xc1\x31\x86\x86\xc3\xaf\xf9\x81\x83\xcb\x47\xdf\xd3\x87\xa0\x97\xfb\x00\x41\xad\x2b\xf7\xca\x55\x4c\x20\x2a\x17\xdc\x4f\x0a\xdf\x93\x1a\x69\xfb\xfb\xfe\xa9\x8d\xbb\xdb\x10\xa6\xfe\xb1\xd1\x5b\x05\x91\x33\x6c\x0b\x02\x1d\x46\x51\xf7\xcb\x24\xa9\xb7\x33\x44\x0f\xf9\x85\xf7\x3e\xa2\xb1\x88\x35\x90\xef\xb7\xb4\x55\x68\x8c\x42\x19\xb6\xce\x73\x73\x30\x8e\xcb\xc6\x40\x66\xf1\x5e\xc9\x53\xb0\x93\x87\x7c\x00\x9e\x31\x67\xed\xf9\x51\x97\xa9\x03\xfe\xcf\x78\xbb\x25\xb7\xe6\xad\x3b\xba\x3a\x4e\xf1\xba\x67\x90\x4a\xc3\xdd\x4d\xc4\x31\x87\xd6\xdd\x2f\x5c\xed\x07\xac\x83\x80\xd0\x9d\x30\x0c\xf9\x95\xeb\xcd\xe1\x65\x39\x44\xee\x1c\x19\xa5\xc0\x63\xa6\x1c\x0c\xf4\x73\x01\xc1\xf3\x46\xf2\x3b\xa4\xef\xe9\x77\xfa\x17\xdf\xca\xd6\x95\x7f\xad\xa0\x09\x22\x26\x84\x4c\x70\x71\xb6\x99\x84\xac\x3b\xd3\x6c\xa5\x77\x9c\x2c\xa2\x93\xa8\x32\xcf\x6a\xdd\x57\x05\xb7\x7f\xeb\xcc\x23\x57\x60\x91\x01\xb4\x10\x86\x92\x78\xaa\x98\x6a\x0c\x05\x3f\x9b\xb2\x04\x1e\x86\xf0\x19\xa4\x7f\xd5\xa5\x93\xc7\xbe\x1c\x1c\x9e\xf8\xdb\xb0\x50\xc4\x15\xcc\x64\xd9\xb8\x81\x43\x26\x04\x4d\x84\x98\x68\x1d\x14\x2d\x18\x15\xdc\xee\x06\x26\x10\xf6\xbf\x7f\xab\xda\x73\xed\x82\x39\xc2\x69\x2d\xb4\xf0\x50\x67\x21\x4d\xd2\xf2\xa8\xb8\xcd\x7e\x89\xde\x66\x64\x25\xe8\x35\x33\xac\xf3\x4b\xdb\x3e\x2e\x3c\x5b\x2d\xf3\x58\x83\x52\xc2\x2f\x79\xb3\xd9\x4f\x77\xd3\x03\xae\x26\xb0\xcb\xad\x56\x40\x74\xd4\xee\x34\xe4\x5c\xb0\x95\x53\x85\xdc\xc8\x9e\x45\x1a\x3b\x6c\x91\x6e\xd8\x2b\xba\xd1\x40\x0b\x7c\xdd\x9b\x64\x9c\x25\x0a\xd9\xe2\x60\xed\xfa\x77\x30\x7b\x8c\xa9\x60\xef\x0b\x13\xd9\x5d\xd1\xa0\x93\x51\x00\x1f\xff\xc7\x5b\x29\x59\x87\x29\xfa\x3d\x6a\x78\x1a\x91\x4b\x47\x8a\x1a\xb6\x61\x48\x45\xd0\x6a\xc6\x46\xfa\xbb\xba\xaf\x56\xb8\x77\x6e\xaa\x22\x19\xd1\x47\xcc\xd5\xe2\x88\xf0\xa5\x62\x0d\x4b\x6b\x14\x72\x4e\xe8\x69\xb6\x26\x32\x68\xc8\x8a\x84\x86\x47\x70\x13\xb7\x8c\xb6\x7a\x04\x32\x5f\xd0\x06\x65\xef\xde\x10\x8a\x65\xa5\x79\x35\x55\x17\x8c\x80\x64\x1f\x36\x32\xab\x4c\x1c\xc0\x74\xbf\x40\xe7\x9b\x5e\x55\xf2\x5d\x45\x03\x87\xa8\x5c\x42\x47\x84\xcc\x74\x86\x4a\x2a\xaa\x55\xe0\x31\xf2\x76\x12\xa7\xd2\x16\xc2\xd4\x8f\xf8\x4a\x78\xe0\x6f\xa2\x36\x27\xfc\x35\xa0\x32\x24\x30\xc0\x3a\x0d\xcc\x25\xce\x6a\x14\x6c\xd3\x76\x15\x0b\x21\x3f\xe7\x52\x5d\x08\xe2\x49\xdf\x94\x61\x22\x49\xc4\x87\xe0\x02\xdd\x8e\x2a\x91\xa3\xd4\x4f\x61\xa2\x3d\x85\x61\x5d\x60\x52\x2c\xd0\x2a\xa3\xd9\x92\x36\x3c\x54\xe6\xc9\x79\x3e\xa2\x8c\xe4\xcc\x9e\xb3\xbb\x7a\xec\x48\xa5\x32\xb0\xaa\xee\xf4\x12\x08\xe6\xf7\x6a\x55\x3f\x57\xfc\x4d\x64\x1b\x00\xa7\xa1\x33\x88\xcf\x6a\xb8\xe7\x67\xf2\x99\xdd\x66\xdf\x52\xcd\xef\xca\xf6\xdb\xbf\xc9\xa1\x50\x7d\x1e\x8e\x1d\x33\x6e\x72\xf2\xb8\x92\xb5\x3d\x52\xca\x1a\x58\x41\xfc\x12\x4c\xd5\xbc\x32\xa2\x71\x6c\xd4\xc4\x80\x0a\xf1\x91\x49\x9d\x0a\xbd\x90\xfe\x2f\x64\x62\x8b\x8d\x6e\x74\xd1\x99\x06\x7a\x6f\xb4\xc1\x2e\xe1\x43\x93\x3e\x97\x46\x2b\x32\x59\x81\xbd\xd6\xc5\xa8\x27\x0d\x15\xe4\xd4\x7e\x4c\xf8\xce\x18\x18\xf1\x8d\xbb\x43\xe1\x68\x22\x3e\x98\x7b\x25\xd7\x08\xf7\x10\xc4\xdf\x0f\x89\x83\xdb\x91\x24\x10\x08\xfd\x8b\x0f\x0e\xe3\xe9\x82\x74\xe1\xfd\xf2\xd6\x87\xaa\x91\xde\x8e\x3c\x70\x42\x80\xd4\xb5\xef\xb9\xcc\x0f\x79\xad\x2e\xd4\xec\xdd\xbb\xd9\x35\xa0\x6e\xdf\x22\xad\xf0\x5b\x20\x61\xa5\x55\x79\x9d\x4f\x92\x4f\xd0\x1f\x1e\xa2\x93\x84\xc5\xa5\xa8\xb7\x86\x10\x74\xf6\xc9\x30\x1a\x6b\x05\x6d\x03\x83\xa9\xee\x45\x28\x3a\x73\xcc\xd1\xc9\xc8\xfd\x80\xa6\x72\x7c\x63\xc3\x10\x80\xd2\x9a\xba\x44\x4b\x8c\x0d\x01\x28\xe8\x48\x11\xc7\xc9\x97\x2c\xd1\xd1\xe3\xe4\x8d\xba\x50\x8b\xeb\xf9\x47\x00\x1e\x13\xff\x2d\xb0\xe2\xce\xde\xf2\xf9\x7b\x80\xf9\x2d\xd9\x21\x68\xe2\x91\x03\x96\x25\xc7\xc1\xa1\xa1\x04\xa2\x7e\x14\xff\x9e\xe1\x29\xfc\xce\xf2\xe4\x14\xd2\x94\xb6\x51\x3f\x78\x96\x85\xe5\x10\xa7\x33\x4c\xc0\xdf\x4d\x6b\x57\x04\xdc\x88\x14\x47\xfd\x8c\xf6\x92\xdb\x0b\xf0\x96\x40\xd8\x25\x68\xe0\x76\xba\x83\xb0\x0e\x4f\xbd\x13\xe9\xb2\xe4\x1a\x55\x7f\x16\x06\xdb\x2b\x16\x63\x00\x04\xac\x41\x8e\xa0\xe2\xae\x72\x37\x4b\xa0\x91\xb0\xe5\x3b\x82\xe8\x74\x98\x45\xc3\xcd\x30\x72\x14\xe1\x2e\x6c\xc3\xc0\xf4\xa3\x76\xde\x97\x0c\x3f\xf2\x2a\xb5\x1c\x2a\x34\xbf\xec\xca\x1a\x41\x62\x75\x23\x02\x87\xd1\x46\x51\x37\xeb\xf4\xd6\x8d\xf1\x5a\x13\x42\x3d\x87\x86\xdd\xd5\x21\x52\xc1\x5f\x30\x60\xa0\x2e\xdb\xa2\xb1\xcb\x80\x7f\x14\xa1\xe6\x48\x78\xb0\xc3\x90\x6e\xf4\x63\xa3\x77\x1b\x96\x9f\x37\xf9\x04\xb7\xa9\xdb\xaf\x9f\x16\x52\x9c\xbd\x18\x5a\x0e\xd6\xda\x7f\xfb\x68\x63\x72\x92\x32\xac\x04\x10\x49\x02\x56\xd4\xf2\x11\xb7\xb6\xa6\x5c\x21\x55\x5c\xe8\xa0\x43\x16\xa7\xed\xd4\xd2\x00\xbf\xa5\xd0\xf8\x01\x5c\x16\xec\x5a\xb7\xbe\x8d\x53\x24\x42\x11\x4e\x72\x00\xa6\x68\xa8\xef\x74\xbb\xdc\x6c\x77\x35\xb4\xf1\x94\x14\xbc\xf0\xe0\xe1\xa6\x3a\xa6\x35\x7d\x49\x69\xf8\xbd\xb7\xae\xf0\x9a\xe6\x21\x62\x4c\xc5\xf8\xf0\x73\xd3\x57\x15\xb7\x31\x68\xbb\xba\x19\xe8\xe8\xba\x8a\x9f\xe6\x14\xaa\xb8\xef\x65\x8e\x6e\x5e\x49\x29\xe3\x5a\xd5\x4b\xd0\xcd\x99\x6a\xbb\x7e\xb5\xc7\xd7\x6c\x51\x23\x61\x74\x12\xe0\x98\xec\xe6\xaf\x0c\xc2\x94\x71\x91\xec\xca\x68\x8e\x18\xf8\x94\xee\xd2\x6c\x2c\x44\xa0\xfc\x28\x18\x81\xe8\x9e\x68\x98\xcb\xc6\xb9\x4e\x91\xe5\x84\xa1\x44\x3c\x57\x31\x84\x38\x0c\x1a\x15\xba\x69\x80\x6c\x90\xf6\x03\x3d\xe0\xf8\x54\x45\x84\x81\x34\x6f\x50\x45\xe5\x5f\x2f\x49\xe2\x0a\x2d\x4e\x4a\xce\xb6\x3c\x6d\xb0\x49\x0b\x28\x93\x74\x83\x18\xd8\x16\x6f\xf2\xa9\x9a\xdd\x41\x25\x11\xe4\xf3\x1f\xe6\x50\xf5\x04\x44\xe5\x4c\xb8\xbf\x10\x92\x10\x73\x05\x4a\xdf\xd9\x73\x0a\x26\x79\x2a\x76\x92\x0d\x79\xc8\x19\x73\x4d\xc3\xa6\x80\xdb\x1c\x72\xb7\x53\xb7\x28\x8b\x93\x36\x43\x7e\x4c\x8c\xf6\x63\x4f\xa8\xd8\xcb\x3c\x2e\xc5\xe9\x28\xe2\xf7\x4a\x9d\xb3\xb8\xf9\xae\xed\xc2\x8b\xeb\x0a\x4e\x3f\x5b\x58\x5f\x72\x2f\x96\xa4\xf3\xc9\x6d\xbf\x9b\xe4\x83\x22\x76\xda\x36\x98\x07\xcc\xd6\x0a\x20\x2c\x54\x4f\x8d\xa9\xd7\x61\x05\x2f\xc3\xb1\x25\xfb\x24\x78\x77\x34\xea\xdc\x15\x66\x0f\xc1\x16\x92\x6f\x61\x6c\xf9\xc8\xe3\xf3\xdb\xb2\x23\x3d\xc8\x78\xd4\xf8\xf8\xe3\xb9\xa2\xf4\x01\xe7\x6a\xc7\xa4\x1c\x17\x73\xd4\x46\x1f\xac\xf2\x56\x37\x9f\x4d\xe7\xdb\xc5\xd8\xb1\x44\x9f\x5a\x1b\xdc\x52\xd0\xbc\xa6\x5e\x13\x06\x39\x8b\x14\x2c\x93\x7f\x8e\x9f\x79\xd8\x33\xe9\xc0\x8e\xf1\x10\xf1\x68\xe7\x8c\x10\x8b\xe2\xbd\x7d\xf8\x13\x94\xd7\x36\x0d\x99\x12\x2c\xb4\x59\x79\x08\x73\xd2\x44\xf2\x57\x5b\x1d\x7e\x37\xe4\x93\x61\xbf\x0c\x8f\xe0\xe1\xaa\xc2\x0f\xf3\xb7\x37\xef\x6e\xae\xaf\xc4\x46\xf9\xa2\x94\xc8\x24\x73\xd3\x1f\x9c\x4c\x5b\x45\xc1\xed\xba\x19\x84\xb3\xd3\x46\xf7\x20\x0a\xd1\x5e\xc4\x9c\x1e\x03\xbb\x39\x06\x2c\x12\x3e\x03\x8f\x1d\x84\xa7\xf5\x0d\xab\x30\xf0\x2c\x94\x23\xea\x47\x7d\xc0\x89\x8a\x3e\x37\xcd\x0f\x3b\x52\x42\xa3\xd7\xeb\x34\x88\x01\x44\x25\x51\xa2\xd7\xe7\x5f\x0f\x19\xf0\xad\xfa\x16\x3e\xf8\x9d\x18\x02\xe7\xb8\x7c\xe3\x25\x70\x79\x89\x2f\xbd\x2a\xd1\x33\x90\x73\x3a\x58\x81\x36\x4a\x5d\x47\xb6\x94\x01\xc8\x6f\xfd\xec\x36\x34\x90\xf7\x0b\xfb\xad\xda\x40\xdd\x84\x73\xea\xa3\xb4\x39\xd4\x01\x45\x6b\x3a\x94\x1f\x81\xfe\xdd\xd4\xcf\x90\x4e\xa3\xf0\x7b\x97\x05\xb3\x46\x38\x5c\x1e\x15\x2c\x80\xf0\xdc\x07\x49\x17\xff\xea\xad\x30\x16\xc2\x93\x03\x9e\xde\xfc\x52\x18\x8a\x35\xf0\xd7\xbc\xf9\xe8\x01\x5a\xba\xd3\x89\x70\x4c\x87\xc2\x81\xb2\x30\x7b\xeb\xa5\x24\x7c\xe3\xa7\x81\x4a\x47\x74\xbb\x8e\x4f\xee\x81\x9e\x3a\x28\xbf\xbe\xf8\x6d\xa4\xeb\x57\xd0\x5e\x83\x0c\x0b\x3b\x90\x92\x5d\xf6\x80\x50\xc8\xf0\x4a\xfe\x7f\x11\xed\x8d\x19\x3e\x1f\xb6\xa2\x44\x4f\x38\x1d\x86\x43\x29\x4e\x52\xfd\xfb\x49\xb5\x9c\x53\x7a\x9d\xe1\x5e\xf8\x43\xc4\x3b\x5a\xdc\x43\x4f\xfe\x63\xe5\x5c\x0e\xe1\x37\xcb\xf9\xe5\x50\xce\x67\xff\x7c\x98\xdd\xdf\x5d\xdd\x3a\x81\xff\x74\x3b\x5b\x1c\x13\xf3\x0d\xb4\x73\x41\x5c\x88\x73\x0e\xd2\xfc\xc4\x11\x11\x1f\x06\x39\xb9\xd3\x33\x03\x0d\x40\x32\x46\x6e\xa8\x3d\x46\x62\x98\xac\xd5\x21\x57\x31\x48\xb4\x27\xaf\xfe\x3a\x57\xd7\xf3\x0f\x1f\xaf\x7c\x4f\x7c\xa7\xf4\xa1\x96\x9b\x92\x02\x07\x4e\x85\x42\x57\x11\xc5\xe6\xca\x78\x8c\x6e\x42\x55\x11\x8b\x6c\x68\x6a\x1c\x92\xfa\xf4\x7f\x7a\x20\x6f\xf9\x0f\xc7\x8d\xa2\x2c\xed\xad\x4d\x09\x28\x08\x4e\xc1\x78\x46\xab\x5a\x29\x1b\x12\x91\xa0\xfa\x47\x1f\x3a\x02\xe5\xcb\x7e\xc5\xd0\x90\x51\xe9\xf7\x9c\x93\x3f\xec\x65\x39\xfe\xf6\x0d\x80\x26\x1f\x66\xb7\xb7\xb3\xeb\x87\x4f\x57\xb7\xea\xe3\xfd\xfc\xe3\xec\xfe\xe1\x67\x9a\x91\x6f\xf2\x89\x9a\xff\x48\x3d\xc1\x00\x74\x72\x75\x9b\xaa\xc0\x07\x9f\x90\xc5\xe0\xd5\xd1\x28\xe0\x20\x1f\x0d\xb5\x32\x21\xfe\xc6\x83\x4d\x3f\x97\x4c\xe6\x28\x9c\x7b\x4c\xd0\x88\x39\xc0\xa3\x73\x68\xa0\x50\x1a\x55\xfa\xbc\x5a\xd4\xaa\xbd\xc5\x3e\x2e\x54\x09\xe9\x16\xc9\xa7\x33\xa4\xc3\x2c\xd0\x01\xbf\x4a\x8b\x83\x60\x1f\x4a\xcb\x8b\xb9\x94\xd1\x2c\x3e\x1e\x07\xb3\x02\x65\x45\x14\xb1\x6d\xfa\x12\x2b\x72\x30\xad\xce\x68\x4e\x11\xb7\x1c\x54\xd5\x8f\x86\x8b\x5f\xe7\xd3\xdc\x2f\xff\x34\x2c\xff\x21\x77\xdf\x8b\x0b\x24\xd9\xf1\x3c\x1c\x58\x3f\xe4\xda\x62\x13\x11\xee\xb8\x3d\x8a\x23\x8f\x77\x0c\xb4\xe1\x97\xfe\xaf\xe8\xa0\xb5\x4f\x0a\x82\xc3\xa8\x2f\xc3\xa8\x0f\x1c\xe8\x47\x06\x3e\x38\xc7\x7f\xcb\xe0\xd3\x5b\x1d\x1b\x3f\x5b\x32\x6b\xea\xa4\x5f\x6c\xea\x9a\x2b\xdb\xf6\x3b\xcc\x21\xc6\x95\x11\xb8\x31\x11\xc0\x8b\x40\x9f\xb4\xf1\x2e\x4c\xc7\x6b\xf5\x9f\xf3\x9b\x3b\xea\x9c\xb8\x38\xb4\x7c\xa1\x54\x30\x6c\xbd\x38\x72\x48\xc1\x60\x04\xcd\x65\x21\x72\x9b\xc5\x04\xaa\xd9\x91\x09\x62\xce\x4b\xdd\x75\xba\xd8\x0c\xb3\xda\x7f\x8b\xe2\x85\x51\xf0\x06\x04\x87\xbe\x4f\x4f\xa4\xa2\x46\xc8\xb3\xd1\xa3\x99\x68\x6f\xdc\xef\x94\x1e\x77\x55\x77\xa3\x7e\xfc\x30\xfa\xcd\x1d\xa7\x81\x4e\xa1\xf2\xff\xb3\xd5\xda\x59\x17\xe6\x2b\xf6\xc3\x5a\x1e\x3e\x04\xfc\x90\xf8\x0d\x4e\x29\x84\x3c\x2f\xa5\xd4\xf4\x67\x33\x06\xea\x7a\xb2\xed\xc5\xff\xfc\xf7\xc5\x93\x6d\x61\xd9\xdb\x4e\xaf\xd7\xd4\x71\xbd\x5a\x71\x98\x04\xb9\x86\x25\xf9\x03\x15\xc3\x70\x85\x32\x9f\x46\xbf\x6d\xec\x91\x42\xf9\x8b\xba\xc0\x46\x9a\xce\x55\xa2\xd6\x9c\x34\xc9\x7f\xc9\x27\xc4\xda\x57\xd5\xaa\xb0\x4d\xd1\x6f\x5b\xc8\xe2\x71\x84\x34\x36\xeb\x21\x32\x6f\xe2\x08\x7f\x57\xb3\xff\x20\xcb\x32\xda\xd6\xe2\x8d\x30\x58\x08\xf4\x53\xf0\x5f\x8f\x39\x49\xd3\xe8\xb9\x47\x56\x79\x8e\x46\xf1\x94\x24\x32\x8a\xfc\xd9\x20\xcd\x2c\x86\x7c\x63\xa4\xf0\x3d\x64\xe1\x41\x4d\xfb\xd8\x38\x3d\xa9\x2a\xf6\x51\x09\x23\xce\x82\xaa\x89\x8e\x66\x61\xd8\x21\xb0\x0d\xc9\x9d\xe7\xec\x12\xc4\xbc\x0f\x10\xdb\x74\xeb\x2a\xe7\x82\x9e\x38\x3a\x6d\x7e\x9e\xf0\xe9\xb6\x2a\xfa\x46\x38\x30\x0c\x52\xce\xfd\x42\x4e\xd5\xc2\x6e\x6d\xa9\x1b\xec\x76\xb3\xff\xd2\xdc\x61\x52\xa3\x64\x37\x23\x23\xb5\x0c\x5b\xb7\x2e\x71\x43\xd6\x55\x6b\xf1\x81\x99\xe8\xf6\x9d\xc9\x83\x0e\x5c\xa0\x25\xe0\xeb\x20\x08\x06\xc0\x00\x2c\x66\x0e\xca\x2d\x46\xfd\x0f\x4e\x00\x9e\x87\x71\x0f\x96\xcc\xa9\xb1\x05\x15\x41\x5a\x3e\xa0\x11\xcc\x9b\xab\x85\x9b\xec\x24\x1d\x0e\x09\x7e\x37\xf5\x96\xd2\xa5\x63\x3b\x04\xb2\xd9\x32\xc1\x13\x96\x9f\x6c\x1d\x88\x5a\x8e\x2c\x3e\x63\x7d\x56\x11\xd5\x41\x54\x9d\x2f\x7d\x95\x48\x46\xbf\x55\x17\xa1\x8f\x2c\xad\xe9\xb7\xf9\x24\xa5\xf1\x89\x8d\x55\xff\xe5\x7c\x9a\xf8\x92\xa3\xd6\x11\x70\xb0\xc5\xdc\xce\xbe\xda\x1e\xce\x4f\x55\xd6\xe0\x10\x82\x37\x03\xb9\xba\xb6\x27\x10\xd8\x00\xaf\x85\x3d\x29\x43\xfd\x9f\x56\x6b\x0d\x3f\x06\x82\x87\x10\x1f\x29\xcd\x93\xae\x02\x61\x6e\x44\xa1\x17\xfa\xc9\x1b\x77\x88\x54\x85\x49\x23\xe5\xdf\xe6\xd3\x28\xeb\xfc\xa7\x56\x08\x02\x00\x98\xa3\x16\x42\x45\xbd\xdd\xda\x0e\xb3\x3f\x80\x6a\x14\x14\x28\x71\x84\x22\x22\x79\x00\x09\x6b\x10\x18\x23\x5f\xcc\xca\x38\xfc\x5f\x09\xb5\xd2\xb6\x6a\xd5\xc7\x18\x91\x3f\x39\xbf\x9c\x78\x06\xe0\x0b\xba\x54\x6b\x6d\xcb\x1e\x83\xc6\xeb\xbe\x5c\x43\x5f\x79\x77\x7c\x87\x04\x67\x86\xd8\x13\x9a\xff\x01\x45\x01\x3c\x29\x38\x2e\x31\x22\xcf\xaf\x36\x0c\xc5\x17\x66\xc0\x00\x86\xdd\xce\x63\x67\xed\xcc\xba\xc7\xa6\x25\x03\x48\x59\x91\x0e\x20\x8f\x73\x11\x70\x37\x02\x85\x09\x03\x05\xcc\xa0\x40\xa0\x44\xee\xc3\xce\x14\x7d\x65\x75\x03\xbf\xf0\x05\x5b\xf0\x5a\x67\x36\x37\x39\xfe\x58\xaf\x21\x14\x90\xf9\xff\xed\x9a\x7a\x6d\xbb\x36\xe3\xe4\x59\xf5\x08\x7f\x0a\x1f\x28\xfa\xb6\xab\xb7\x50\xa0\xd8\x60\x61\x29\x7c\x78\x57\x37\x5d\x5f\xb9\x7d\x51\xd4\x6d\x97\xf9\x46\xfd\x7d\xb3\x84\xb9\xe8\x6a\x51\x35\x56\x74\xf6\x09\x08\xbb\xce\x55\x8c\x39\x40\x3c\xc5\xae\xa9\x0b\x63\x80\x63\x24\x50\x61\xaf\x7c\x2a\x3d\x5a\x01\x67\x37\x8a\xbc\xc0\x9e\x4f\x8d\x40\x8a\x32\xb6\xb0\xf1\x1e\x64\x2d\x9a\x24\x4e\xa3\x04\xa7\x14\xdd\xb4\x9f\x63\x74\x9e\x7c\xa7\x2e\x98\x6b\x8f\x8f\x93\xef\x52\x44\xd8\x10\x67\x03\x6e\xea\x48\x7d\x1e\x28\x27\xa0\x8a\xba\xa8\xd7\x17\xdd\xc6\x5c\x38\xf1\xf6\x79\xd3\xe0\xfa\xe8\x36\x0a\x81\xac\xd0\x3a\x24\x2c\x2a\x6e\x08\x2e\x29\xe8\x5b\xcf\x97\xdd\x41\xb7\x16\x78\xdc\x93\x69\xe0\xfc\xcf\x54\x55\x07\xcc\x1c\x32\xba\xe0\x5e\xf6\x37\xc0\x86\xfc\x7c\x8f\x95\xe9\xc0\x75\xcc\xc7\xab\xa5\x84\x94\xfa\xa2\xa5\x80\x71\x5a\x35\xfa\xd9\x47\x83\x7f\x7b\x61\x95\xec\xd6\x37\xc8\x9c\x13\xc6\x1d\x4d\xbe\x50\xcc\x34\x40\x60\x8d\xda\xc1\x82\xaf\x88\xb4\x73\x89\x88\x19\x98\x37\x4c\x48\x8f\xa6\xe6\xba\xf1\x72\x25\x82\x17\xc0\x2d\xdc\xc9\x24\x8b\x94\xb0\x4c\xe1\xb1\xae\x91\xd3\x1f\x71\x21\xbe\x3b\x08\x8c\xd9\x99\xae\xf8\x82\xa8\x87\xc3\x66\x2e\xa0\x25\x0f\x32\xac\x80\x95\x4b\x04\x21\xa6\x69\x09\x7c\x4c\x36\xad\x0d\x00\xe8\xef\x92\x73\x3e\xb4\x8f\x23\x46\x1f\x74\x31\x60\x44\x6b\x6d\xbb\xcd\xc1\xc4\x39\xe2\x3f\xd9\x7e\x3d\x08\x35\x3a\x0b\x30\x6a\x3b\x38\xe1\xc6\x3a\xd1\x79\x88\xd4\x79\x18\xf3\xe5\xd7\x08\x55\x1c\x32\x41\x52\x7a\x5f\xf2\x91\xe2\x54\x25\x12\x05\xa1\xcb\xdc\xce\xd5\x89\x83\x2e\x6c\x27\x0c\x1b\xfc\x40\xb7\xd1\x04\xfb\xf6\xb1\x7c\x58\xd2\x30\x64\x37\xb9\x50\x8d\x62\xe3\xbc\xb2\x7c\x58\x08\x96\x7b\xd0\x8b\xe0\x85\x7d\xd2\x65\x4f\xb5\x2b\x50\x2a\xe6\x84\xb4\xd5\x6b\xc8\x31\x54\x35\x71\x9e\x41\xfd\x16\xa9\xfb\x4a\x77\x7d\xb0\xeb\x17\x88\x86\x29\xa8\x38\x4d\xbe\xb0\x67\xc1\xa7\x01\x8c\xcf\x1b\x58\x78\xbe\xb9\x94\x69\x9a\xba\x09\x1b\x00\x82\x2e\x5c\xe6\xc6\xef\xe4\x2c\xed\xa6\xe9\x77\x68\xc7\x45\x1f\x5d\x62\xbd\x87\xee\x40\x82\x7c\xbc\x4a\x1c\x13\xf5\x73\x05\x4c\xbc\xbb\x60\x2e\xf0\x60\x8a\xba\x5a\xdb\x47\x0a\xd8\xe0\x49\x15\xdd\x7c\x6b\x4c\x97\xde\x4e\x4a\x56\xd8\x3c\xaf\xe3\x0d\xef\x27\x82\xc4\x25\x68\x57\x5e\xf9\x72\x7f\x64\x92\xfc\xd7\xbd\x17\x0c\x5c\x87\x41\x2d\x1d\xf3\x2a\xa3\xe4\x8a\x26\x78\x57\x16\x5e\x3a\xaa\xeb\x88\xbf\x4a\xfc\x5c\xeb\x9a\x53\x68\xe1\x85\x88\xf9\xb7\x8d\xfc\x60\xe1\xc6\x00\xfb\x70\x9b\x24\x42\x88\x8f\xc9\x2d\x21\x75\x26\x61\x6b\x42\xa8\x64\xdc\xdf\xf8\x9e\x21\xfa\xc2\x8d\x01\x82\xbe\xb6\x95\xf4\xad\xc9\x46\xca\x22\xc0\x4a\x5a\x34\x3c\xe2\xa3\xe4\xea\xce\x79\xa5\xdd\xc6\x94\xc6\xd9\x21\xed\xa6\xee\xcb\x95\x67\x81\xf3\xa3\x8a\x9f\x3d\x66\x2b\x24\x33\x84\x47\x26\xeb\x7e\xcb\x7d\x84\x22\x82\x03\xb4\x47\x84\x73\xc8\xc7\xb5\x53\x81\xc0\x4d\xb5\x48\xdc\xda\xb1\x2f\x09\x00\x78\x41\xe5\xce\x50\x57\xd8\x9a\x8b\xe5\xfe\x02\xba\x20\x20\x7a\x52\x7a\x2f\x03\xdb\x7d\x88\xda\xdd\xf5\x4d\xdb\x6b\x32\x56\xd4\xd6\x6c\xeb\x46\x57\xab\x1e\x40\x9a\x11\x55\x5b\x9e\x6c\xf6\x2f\xec\x8d\x04\x2d\x25\x64\x49\xc4\xa4\x65\x43\x15\xb1\x56\x82\xc4\xcc\xb6\x54\x9b\x9c\xdc\x0f\x1a\xed\x7b\xa3\x02\xb0\xcc\xa9\xa2\x18\xbb\x39\x6c\xc5\x23\x77\xd2\x81\x1c\x2a\x2e\x12\x7d\xa5\x2e\x00\xe6\x7b\x73\x27\xc1\x1b\x93\x57\xf9\x04\x2d\x16\x4e\x2c\xc2\x3d\x02\x61\x6e\x97\x54\x2c\x24\xfe\x83\x24\x08\x8b\xf6\x15\x54\xc8\x46\x6c\xbc\x81\xa5\x37\x71\x85\xdc\x01\xd1\xed\xd5\xd9\xe5\xab\x73\xb5\xd2\xfb\x56\x21\x7c\x91\x72\xae\xde\x48\x6a\xc9\x20\xed\xd2\xe2\x0f\x84\x66\x03\xff\x82\x13\x37\x0f\x96\xce\xc3\x3b\x4e\xd5\x55\x14\xda\x6d\xd3\xa2\x8d\x40\x4a\xca\x36\x84\x2a\xeb\xea\xd1\x34\xd0\x4f\x25\x85\x6e\xfa\x6a\xff\xba\x49\x53\xe0\x61\x13\xf8\x40\x12\x22\x3a\x99\xcc\x97\x0e\x6a\xef\xe2\x32\x66\xd6\xc3\xd9\x07\xfc\xba\x07\xf1\xd8\x48\xfa\x18\xe7\x93\x6c\xc3\x65\x15\x30\x69\xa2\x07\xed\x57\xe7\x47\x84\xf7\xeb\x77\xcf\x44\x5d\xa8\x0f\x37\x8b\xeb\xd9\xed\xed\xd5\xdd\x6c\xfe\x89\x03\x78\x93\x49\x3e\x51\xb3\x7f\x5e\x7f\x5a\x00\x6d\x35\x90\x5a\xf3\xdf\xee\x48\x8b\x7c\x84\xa3\xdf\x8b\x3f\x11\xf2\x25\x38\xeb\x95\x81\x46\x4c\xce\xe8\x0e\x4e\xab\xe4\x70\x15\x39\x0b\x79\xd2\x72\xe7\x1f\x26\xf9\xd3\x55\xd8\xc7\x88\x4f\xde\xea\xff\x32\x3d\xfa\x9d\xce\xe7\x72\x7f\x78\x5f\xaf\x50\x9f\xb8\x33\xbe\x75\x07\x1f\xd8\x8b\x44\xcf\x89\xf1\x78\x02\xdc\x33\x68\x9a\x60\xc9\x52\xa5\x07\x72\x1a\xa7\xd1\x1a\x5b\x10\xbd\x68\xe7\xfe\x2f\x89\x17\x5b\x55\x99\xee\x19\x7b\x40\xd1\x4f\x00\x23\x2e\xf7\xee\xb8\x0b\x98\x74\xad\x9e\x6c\xd3\x53\x20\xfc\x73\x86\x0f\x7b\x22\x67\x61\xb9\xa7\xa0\x3e\xda\x03\xb8\x25\x9d\xf9\x9a\xa1\xa1\xa3\x4b\xb7\x15\x75\xdb\x81\x2b\xfa\x0c\xfd\x1d\xd1\xfe\xcd\x94\xd1\x4d\xb7\xf9\x57\xaf\x3f\xbb\x4f\xaf\xad\x9b\x0c\x40\x5b\xb7\x18\x02\x70\x1b\xf8\x33\x71\xe5\x97\x7a\x09\x99\xcc\xc6\x38\xff\xf5\xd9\x99\x68\xa6\xf3\x25\x59\x93\x89\x13\xa5\x6a\xef\x17\x69\xb9\x57\x72\x95\x01\x07\x2f\x81\x73\x75\x51\x68\x7a\x0a\x34\x35\x7f\xaa\x3f\x9b\xf8\x03\xeb\x34\xb0\x84\xdb\x8f\x3d\xd8\x7e\x3c\x3a\x4c\x8d\xca\x9a\x5d\x63\x88\x49\x18\x01\x04\x9a\x09\x43\xe9\xe8\x82\x0f\xa1\x7b\x87\xdb\x90\x8e\x30\x0f\x11\xa4\x21\x41\x6c\xd4\x0f\xe2\xac\x3d\x17\x95\x6c\xe5\x5e\xbc\xfe\x65\x52\x20\x51\xb8\xf1\x94\x2d\xfb\x5c\xa5\x2e\x4c\x1b\x9b\x0c\xd4\x11\x32\xb0\x84\x86\xce\x12\x4c\x1c\x08\x31\x04\x5d\x66\x91\xea\xe3\x10\x07\x1e\x71\x4f\x1e\xed\xe0\x94\x02\x15\xa0\x65\x2c\xba\x23\xcc\xa7\xc1\xc9\x1a\x52\xa0\xc2\xdb\xf2\xfd\x8b\xba\x2a\x88\x18\x0a\x67\x01\xef\x0d\x5a\x2c\x14\x6f\xfa\xcc\x0e\xdb\x2c\xc7\xd0\x86\x44\x5b\x10\xa2\x80\xbe\x7e\x45\xb7\xa3\xef\x48\x3c\xb2\xe8\x49\x41\xd0\xec\x18\x65\xac\x6d\xd4\xaa\x2f\xf7\xf2\x5c\x96\xac\xab\x4f\xc1\xa5\x9b\x4c\xf2\xd7\xb1\x7a\x23\xdc\xcc\x97\x37\xa0\x7a\x36\x78\x08\x39\x6b\xbb\xb4\x45\xe7\x99\x10\x88\x84\xd1\x1d\x55\x88\x95\x11\x29\x3b\x8d\x51\xb4\xd2\x3c\x5a\xa8\xf0\x05\xd2\xf3\x5f\x9c\x1d\xeb\xa6\xf6\xc0\x5f\xbd\x11\x66\x9e\xb4\x2d\x43\xb0\x98\x67\x07\xff\x0c\x60\x63\x30\x0b\x3c\x19\xb0\xde\x9a\x6a\x85\x91\x46\x0f\x5d\x87\x63\x9e\x68\x64\x8e\x3d\x14\xdb\xa9\x7b\x73\x9a\x5f\x3e\x52\x30\x41\x95\xca\xe0\x3e\x31\x32\x93\x1b\xaf\x53\x42\x61\x93\xa6\x97\x43\x5b\xac\x88\x4d\x35\x75\xd6\x63\x45\x07\x51\x50\xaa\x55\xa4\xbe\x84\xf0\x54\xb1\xb2\x6f\xd4\xed\xd5\xdd\xfb\x4f\x57\xef\xc7\x2b\xa8\x2c\xb1\xb5\xa1\xf6\x03\x70\x16\x71\x9e\xb9\xf9\x9d\x55\x8f\xa5\x6d\xf1\x67\xf8\x5b\xe0\x95\x68\x42\x8d\x62\xdf\x6d\x20\x99\x18\x2b\xc3\xa9\xba\x50\x77\xb3\x9f\xd4\x8f\xb3\xfb\x05\xf6\xf5\xc0\x96\x07\x9e\xde\x8e\xc7\x38\xcd\x27\xcc\xfb\xd9\x62\xc2\x3b\x81\xcf\xf5\xc4\x40\x93\x62\x3a\x64\xaa\x72\x0c\x98\x37\x99\xe6\x53\xb5\xe0\x25\xf7\x7c\x76\x6e\xe7\x42\xca\xc8\xcd\xe5\x33\xc1\x82\x87\xb8\x22\xeb\x2b\x85\x28\xea\xe5\x74\x29\x27\x52\x24\xff\x42\x37\xa4\x55\xf3\x94\xbd\xcf\x9b\x5a\x05\xd2\x25\x89\xfc\x36\x8d\xad\x57\x64\xf4\x11\x0c\x5c\xf5\xbb\x15\xa0\xd3\xa9\xb8\x3d\xc5\xb6\x88\x1d\x03\x86\x27\x89\x9a\x4f\x72\x54\xfd\x76\x69\x9a\x9c\xca\x7a\xc7\xd8\x40\xc0\xde\xa4\xba\x66\xf7\x04\xdb\xb6\xbd\x69\x91\x42\x07\x74\x00\xbc\x50\x54\x76\x2c\x26\xf3\x12\x96\x29\x38\xb2\x23\x30\x2a\x34\xe2\x13\xfc\x4c\xcc\x08\xc3\x53\x28\x55\xc7\x01\xfe\x8c\x31\x30\x8e\xc8\x73\x02\x6e\x6b\xa4\x94\xfa\x28\x76\xc8\x47\x87\x00\xcb\x15\xed\xd8\x4b\x75\xa1\xde\xcf\x7f\xa4\x0e\x33\xb7\x57\x3f\x41\x55\xa2\x6c\xa0\xc2\x73\xc1\x75\xbb\xd1\x6e\x91\x74\x60\x81\x37\x10\xfd\x29\xaf\xa6\x1e\x29\x03\x66\xaa\x95\xd1\x4f\xd4\x09\xc1\x98\xcf\x60\x77\x6d\xe9\x7c\x6c\xeb\xd2\x43\x5f\x29\x38\x1e\xd3\x67\xaf\x6c\xbb\x23\x4d\xc6\x8c\xd6\x8d\x6d\x01\x9f\xc2\x1a\x70\x24\xb9\x30\x14\x90\xcb\x7c\xaa\xde\x69\x5b\xa2\x02\x19\x19\x00\x33\x99\x11\x6f\xf2\xb6\xae\xba\x0d\x90\xd9\x73\x60\xdb\x36\xa2\xb8\x38\xa3\xba\x4f\x50\x53\x66\x6b\x1a\x6c\x31\x26\x5d\x6f\x60\x07\xe7\xa3\x39\x63\x9c\xcf\x81\xb7\x93\xc4\xef\x50\xb7\xc6\x4b\x8a\x84\x78\xd7\x75\xdf\x74\xbe\x40\x5a\x36\x5f\xca\x58\x2e\x41\x79\xad\x6c\x69\xa1\xaf\x19\x18\x37\xf9\x8b\x1f\xb9\x1e\x3f\x7f\x05\x45\x20\x2b\x35\x7d\xf5\xea\x9b\x8b\x57\xdf\x5d\xbc\x7a\x93\xab\x09\x91\x22\x2a\xf0\x88\x31\x84\x71\x6d\xce\xf4\xb9\xba\x3e\xab\x9a\xf6\x5c\xdd\x9c\x55\x8d\xd5\xe7\xea\xf6\xac\x7e\xb4\x85\x35\xa5\xfb\xd1\x2e\x1b\x73\xfe\xd5\xac\xbd\xf9\x9f\xef\xae\x17\x57\x7f\x14\xf3\x2b\x5e\xc7\xf9\x5f\x5f\x5d\x4e\x2f\xa7\x09\xff\xeb\xe4\xf5\x9b\xd7\x27\xfe\xd7\xff\x8f\xeb\x53\x65\xe1\xb4\x42\xe3\xe0\xa6\x2c\x6d\x55\xdb\x16\x36\x85\x9a\xef\x8c\xaf\xf1\x20\x3d\xf2\x22\xb4\x20\x3b\x2b\xce\xd5\xf7\x3f\x1b\xdd\xfc\xa0\xbe\x9f\x03\xac\x6a\xde\x3c\xea\xca\xfe\x1b\xed\xcd\x3b\xbd\x35\x3f\x28\xb4\x5a\x28\x50\xc2\x09\x8c\xfc\xc5\x5b\x0f\xb9\x5d\xee\xff\xaa\x5e\x7c\x7f\x47\x91\x13\xfa\x3d\x9c\x63\xef\x9b\xba\xdf\xfd\x10\xfe\xc6\xdc\x92\xb6\xae\x7e\x78\xf1\xfd\xa7\xfb\x5b\x90\x87\xc1\x37\xfe\x1c\x7d\xee\xa3\x73\xce\x5b\xee\x94\x27\xcb\x8f\xcd\x2a\x1b\x94\x10\xd1\x21\x47\xea\xbf\x5e\x86\x7a\xfb\x00\x3c\xb7\xad\x20\x6d\xab\x56\x32\xf1\x13\xb3\xaa\x20\xf3\xca\x99\x93\xfd\x97\xac\xa9\x5e\x9e\x67\x08\x3a\xd0\x65\x70\xea\x05\x12\x10\xe3\xd0\x5c\x6b\x0f\xc7\xc7\x51\x12\xfb\x2e\x22\x36\x04\x97\x58\xb2\x1b\x66\x0a\x4e\xbe\x2c\x54\x77\x25\x9d\x0e\x4b\x41\xe8\x0f\x60\x16\x83\xdd\x8d\x47\x70\x57\x9e\x22\x00\x49\xd1\x7d\x6a\x06\x68\x98\xd2\x64\x3f\xd6\x51\x55\x48\x21\xe2\x5e\xb8\x56\x6d\x3d\x50\x87\xc1\x93\x0e\xbe\x08\x11\xf5\xde\xc7\xbc\x8f\x81\xd1\x06\x21\xb3\xd0\x95\xb9\x31\xc0\x34\xd9\xf9\x76\x45\x23\xbd\x83\x91\xb0\x0c\xe1\xe4\xb2\x07\x0a\xc3\x3b\xfc\x08\x42\xdb\x79\x74\x46\x86\x43\x70\x46\x29\x91\x42\xd5\xcd\x96\x87\x20\xcb\x12\x7f\xd7\x51\x30\x0a\x2e\xde\x54\xb4\x4e\xe8\x06\x6c\x75\x67\x1a\xab\xcb\x36\x64\x71\xfc\xa6\x1a\xa0\x08\xff\xc3\xc7\x77\x38\x54\x09\xb3\x7a\x58\xf4\x32\x35\x26\x79\x8a\xf3\x17\xe2\x1e\x98\xf8\x11\x48\x38\xc9\xdd\x82\x16\x46\xdd\x10\xd0\xa0\xa9\x81\x78\x83\x12\x89\x6d\x4a\xf0\x63\xdb\xa1\x38\x50\x5d\x74\x91\xb0\xf7\xef\xbc\x68\xe7\x2f\x9c\x35\xef\x6b\xdf\x6e\x16\x88\x92\x7c\x3b\x7b\xab\x5e\x5e\x2d\xd4\xcd\xe2\x65\x68\xb3\xc7\x49\x6e\xd9\xcd\xcf\x77\xee\x53\xf3\xfb\xd0\xbb\xcf\xf7\xe8\x53\x7f\xff\xf4\x00\x6d\xe6\xa0\x45\x1f\x36\x1c\x84\x06\x6b\x51\x97\x3e\x6e\xcf\x77\xf5\xb5\xed\xf9\xc0\xa4\x4b\x3a\xf4\xe5\x51\xb3\xb9\xc5\x3f\xae\x6e\x6f\x63\xdc\xee\xfc\x1e\x06\x79\x3d\xff\xf8\x33\x16\x83\xfe\x63\x7e\xfb\x76\x76\xbf\x10\xad\xe8\xb8\xdf\xdc\xf5\xed\xd5\xcd\x87\xcc\x37\x8f\xf3\x1d\xfe\x3c\x6c\x28\xf4\xec\xbb\xb9\x53\x57\x77\xea\xea\x9a\x2b\x28\xe0\x71\x57\xd7\x0f\x99\x7a\x98\xdf\x3f\x24\xbd\x0b\xb9\x0b\xdd\xbb\xfb\xf9\x87\x8c\x7b\xd1\xcd\xe1\x26\xd7\xf3\xbb\xbb\x19\xde\xc5\xd7\x22\xf8\x65\x91\x1d\xea\x42\xb7\xc1\xab\xdb\x9b\xbb\xf7\x8b\xe1\xc7\x4f\x7d\x07\x4e\xd7\xe9\x3a\x5d\xa7\xeb\x74\x9d\xae\xd3\x75\xba\x4e\xd7\xe9\x3a\x5d\xa7\xeb\x74\x9d\xae\xd3\x75\xba\x4e\xd7\xe9\x3a\x5d\xa7\xeb\x74\x9d\xae\xd3\x75\xba\x4e\xd7\xe9\xfa\xf5\xd7\xff\x06\x00\x00\xff\xff\x6b\xba\xba\xb1\x00\xc8\x37\x00")
        -
        -func licensesTarBytes() ([]byte, error) {
        -	return bindataRead(
        -		_licensesTar,
        -		"licenses.tar",
        -	)
        -}
        -
        -func licensesTar() (*asset, error) {
        -	bytes, err := licensesTarBytes()
        -	if err != nil {
        -		return nil, err
        -	}
        -
        -	info := bindataFileInfo{name: "licenses.tar", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
        -	a := &asset{bytes: bytes, info: info}
        -	return a, nil
        -}
        -
        -var _urlsCsv = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x7d\x6b\x73\xdb\xb6\xd3\xef\x7b\x7e\x8d\xcc\xf3\xcc\x39\xf3\x94\x17\xf0\x22\x51\xed\x64\x32\xb2\x6c\xa7\xee\x48\xb2\x6a\x39\x4d\xfe\x7d\xa3\x01\xc1\xa5\x84\x1a\x22\x59\x00\xb4\xec\xbc\xe8\x67\x3f\x03\xf0\x22\x52\x96\x25\x3a\xf5\x99\x67\x3a\x49\x25\xea\xf7\xdb\x5d\x2c\x16\xe0\xe2\x1a\xe7\x62\x79\xf9\xd3\xcf\xb6\xcd\x70\x1a\x33\x78\xb6\x52\x90\xb6\xcc\x9e\xa3\xec\xc9\x66\x94\x40\x2a\xc0\xda\xc8\x2d\x33\xc6\xe3\xa9\x82\xed\x76\x3b\x2b\xcb\x21\x15\x59\xc1\x09\x58\x19\x5f\xd7\x30\x61\x63\x29\x39\x8d\x0a\x49\xb3\xd4\x18\x5f\x2e\x35\x3e\x81\x38\xe3\x38\xe7\xd9\x5f\x40\xa4\x86\xef\xe8\x03\xb5\xa7\x9a\x43\xd3\xb5\x3d\xde\xe2\xef\x59\x7a\x49\xd7\x54\x62\xb6\x04\xfe\x48\x09\x88\xf2\x67\x30\xc6\xd7\x53\x13\x59\x48\x09\x6a\x29\x65\x34\x2d\x9e\xcc\x2d\xe5\x3c\xe3\x07\x16\x24\x4c\xe1\x2d\xf9\x24\xdb\xdc\x1d\x7e\x8e\x30\x79\xb0\x30\x27\x1b\xfa\x58\x5a\xbd\x83\xc8\x76\x1d\xc7\x45\x8e\xe3\x23\xd7\x77\x03\xdf\xde\x48\x99\x9f\x2b\x22\xc1\x31\x6c\x29\xb1\xf2\x4d\x5e\x69\x70\xdf\x68\x9d\xdb\xb2\xce\x3d\x6b\x9d\xeb\xf8\xae\xe3\x0f\x02\xf7\x87\xac\x73\x2d\xe7\x4d\xd6\xb9\x96\xd3\x58\x57\x71\x4f\x58\x37\x70\x46\xae\x8f\x3c\x3f\xf0\xbc\x5e\xd6\xbd\x50\xf0\xb6\x8a\x75\x5b\x15\xeb\x55\xc6\xed\x76\x16\xcf\x04\xa4\x0c\xef\x2c\x92\x6d\xed\xf1\xf5\xd4\xb3\x1c\x15\xb1\x87\xb0\x53\x56\x79\x96\x63\x8c\x3f\x2f\x54\x8d\x34\x78\x9c\x24\xc0\x33\x8d\xcd\xf0\x3a\x67\x55\x2b\x50\x28\xcf\x72\xcc\x2c\x65\xcf\x35\x74\x9d\x16\x07\x32\x15\x5e\x9b\x7a\x0c\xfe\x9a\x25\x35\xb8\xc5\xe2\x26\xc3\x12\xf8\x5b\x14\x1d\x50\x7a\x2b\xeb\xaf\xa3\xbf\xe8\xd9\xe5\x62\xba\x18\xf7\xeb\x06\x66\x97\xab\x9c\xe5\x78\xb5\xc5\xf9\xaa\x69\xfe\xb3\x9e\x7d\x48\x9e\x33\x58\xcd\x6e\xee\x5b\xcc\xc5\x78\xd9\x8b\x7b\xb1\xbc\xfc\xa0\xd1\x17\xcb\x4b\x63\x3c\xbf\x9f\xde\x99\x8b\xcb\x26\x08\x52\xc9\xb8\xdb\x2e\x5e\x15\x06\x8b\xf1\x75\x5f\xdb\xe2\x2c\x82\x45\x26\xa4\x20\x9c\xe6\x72\x7c\x3d\x33\xc6\xdd\x48\x7b\xd5\x8f\x25\xcc\x18\x2f\x96\x0d\xbe\xa7\x2b\x16\x45\xc4\x28\x59\x2d\xb5\xd4\xda\x29\xab\x96\x30\x74\x44\x39\x56\x54\xdd\x8a\xca\x07\xf6\xcd\xed\x12\x38\xc5\xec\x1a\x6f\x29\x7b\x3e\xf8\x6a\x0e\xed\xf1\x62\x31\xbd\x5a\x4d\x6f\x26\x57\xf3\xe5\x55\x2d\xd9\xad\x25\x0b\xbc\x2d\x38\xfe\x2b\xc6\x12\x5b\x02\x5a\xcd\xdc\x2e\x1b\x78\x2b\xc2\x72\xc1\xca\x2e\x4b\x89\x70\x8f\x7a\x66\x6f\x5c\x45\xd3\x2c\xdb\x18\x47\x42\x3e\x33\x10\xfd\x9c\x53\x81\x0d\x5d\x29\xa6\xea\xc2\xfa\xd7\x61\x13\x5a\x9a\xfb\x99\x3d\xe7\x9b\x5e\xe4\xd9\xcd\xfd\x07\xcd\xd1\x14\x63\x9c\x6c\x73\xcc\x05\xf4\x53\x5c\x81\x8d\x31\xc3\x71\x4c\x53\x45\xca\xf1\x1a\x84\x45\x84\xb5\xa3\x82\x58\x10\x17\xf6\x3f\xeb\x4d\x26\xa4\x1d\x67\xc4\x1e\x5f\x2f\xa6\xf6\xc0\x72\x90\x5d\x86\x40\xd9\x13\xe6\x98\x6c\xa0\xd3\xb9\xe9\x27\xdd\x70\xab\xea\xb1\x0c\xb9\x9a\xa1\xe3\xe4\x34\x1a\x1d\xa0\x5f\x0d\xe7\x06\x55\x13\xdc\x7e\x06\xb9\x7b\x83\x8e\xc7\xc6\x31\x35\x9a\xc4\x25\x15\x92\x12\x55\x24\x73\x01\x9c\x29\x6e\x0c\x8f\x56\x0e\x9c\x1d\x74\x72\x15\xb4\x6a\xde\x6d\x22\x61\xe1\xc9\x62\xb5\xb0\x1d\xe2\xdb\x49\xad\xd2\x29\x0b\x93\xac\x48\x63\xac\xb2\x29\x4d\xae\x4d\x5c\x55\x52\x56\xee\xea\x38\xf7\xd5\x37\x5d\x8d\xad\x9e\x68\x1f\x5d\x2c\x2f\x4d\x64\x4e\x18\x2e\xca\x90\x14\x8f\xe9\x0e\x22\x2b\xe1\x00\x91\x88\xb5\x80\x08\x0b\xb0\x37\x80\x63\x9b\xa6\x84\x15\x31\xd8\x34\xc1\x71\xcc\x85\xb5\xf9\xc4\xe1\x91\x0a\x9a\xa5\x1f\x3d\x77\x10\xba\x9e\x16\xe7\x56\xe2\xcc\x6b\x0e\x50\x65\x97\xca\xae\xb6\x4c\x92\xe5\xcf\x9c\xae\x37\xd2\xae\x9e\x9a\x9d\xfe\xb5\x23\x66\x0e\xb2\x25\x25\x05\x59\x0b\xc1\x51\x56\x48\x9b\x43\x4c\x45\x93\x78\x6a\xfe\x87\x18\x12\x5c\x30\xd9\x95\xb3\xc0\x12\x52\x79\xaa\x5a\x2e\x96\x97\x39\x2b\x44\x09\xec\x90\xcf\xf9\xb6\x8d\xd5\x44\xaf\xd6\x3a\xde\x27\xc5\x7d\xdf\x47\xab\x1d\x95\x9b\x55\x8b\xd8\x95\x38\x61\x80\x79\x99\xb2\x47\xc2\xda\x82\xc4\x04\x73\x89\xdb\x9d\xa3\x09\x4f\x39\xc3\x29\xde\x7b\xa4\xfa\xa1\x2b\x69\x7a\x31\xef\xf7\x12\x53\x40\xf5\x7e\xec\xb0\xe7\x99\x39\x2f\x88\x32\xc6\x9c\xd6\x11\xe5\x20\x5f\x09\xfc\x0b\x3f\x62\x3d\x92\xa8\x64\x0a\xfd\x04\x40\x16\x32\x53\xaf\x90\xb2\x13\xb3\x2f\x80\x3f\x00\x83\xe7\xe9\x31\xe3\x5e\x8a\xd7\xcd\x37\xdb\xa5\x2c\xc3\x2a\x00\x30\xa9\xde\x08\x99\x4c\xcd\xbc\x88\xb4\x8e\x7d\x95\xa8\x28\x91\x4f\xf2\xd3\xb8\x90\x9b\x05\xe6\x78\xfb\x11\xf9\x83\x21\xf2\x1d\x34\x1a\xae\x7c\x2f\x0e\xd0\x80\x00\x1a\x0e\x07\x51\xec\x84\x38\x08\x5d\x2f\xc0\xc3\x61\x18\x44\x80\x08\x79\xd5\x94\xaf\x98\x73\x9c\x4a\x9d\xcc\xfd\x95\xad\xf1\x36\xd7\xfe\x5a\x53\x69\x7f\xca\x3f\xae\x59\x01\x6b\x48\xad\x35\x95\xbf\xe0\x8f\x11\xcb\xa2\x55\xce\x30\x4d\x7f\x49\x3e\x56\xbd\x99\xce\xa4\xda\xc2\xfb\x44\x96\xd7\x8e\x2c\xbf\xb6\xea\xcb\xe4\x74\xcb\x7a\xd1\xa2\xfc\x96\xca\x98\x72\x20\x32\xe3\xcf\x56\x22\x92\xc3\x2a\x87\x9f\x55\x14\xfa\x2d\xa5\x0b\x9e\x49\x20\x6f\x0a\xe2\x3d\x65\xd5\xae\xdf\x32\x27\x31\x27\x59\xac\xed\x58\x53\xb9\x29\x22\x5d\x8d\x3c\x8b\x22\x0a\x1b\x9c\x8a\x2c\xb5\x27\x19\xc9\xf0\xaf\xf7\xf7\x0b\x35\x24\x04\x6e\x2b\x5f\xda\x5b\x2c\x24\x70\xbb\xeb\xca\x4e\x2e\x15\x65\x99\x28\x2d\xaa\x40\x2b\xb4\x72\x8e\x01\x5f\x77\x77\x99\x74\x5d\xe0\x4d\xdf\x17\x7c\x09\x35\x2e\x30\xe7\x3d\xf1\x9c\x1b\x17\x00\x7c\x87\x79\xbf\x34\xa0\x06\x77\x58\x39\x64\x2a\x25\x6a\xd7\xfd\x3f\xf9\xe6\xc1\x36\x2e\xa8\xbc\xcf\x38\x87\x54\xd6\x05\x2e\x0b\x2a\xac\x35\xa4\x32\x2b\xc7\x34\x64\x4d\xcd\x88\xa6\xf6\x23\x85\xdd\x23\xb1\xc8\x9a\xda\xe5\xaf\xe6\x53\x38\x68\xb9\xa3\x91\xf5\x89\xa3\x8f\xc8\x42\xff\xcd\x5d\xf5\x3f\xf5\xdf\x7f\xc7\x34\x49\x56\x49\xc6\xb7\x58\x7e\x14\x5d\xb5\xa8\x4f\x8c\x35\x84\xdb\xe5\x54\xa5\x05\x17\x19\x27\x50\x3c\xf5\x73\x49\x89\x35\x26\xe3\xfb\xdb\xe5\xb1\x49\x82\x4e\xad\xee\x51\xc6\x64\x62\x5e\xfc\xa7\x76\x0c\xe1\x80\x25\x7d\x04\x92\x6d\xb7\x59\x2a\xba\xa4\xe8\xd9\x56\x91\x50\x12\xdc\x7e\x04\xb7\x45\x08\xfa\x11\x82\x8a\xe0\xf5\xd3\xe0\x35\x1a\xfc\x7e\x04\xbf\x21\xcc\x27\x3d\xcb\x6d\xa6\xa4\x55\xf4\xf9\xa4\x67\xe9\x15\xcd\xed\xd2\xfa\xf8\xa0\xa4\x05\x7b\x5a\x3f\x4f\x28\x9a\xd7\xd6\xd6\xcf\x1f\x8a\xd6\x71\xc9\xfc\xb2\xb7\x57\xe2\x17\x8e\x99\x5f\xf6\xf7\x8d\x99\xc6\x5d\xf7\x68\x72\x4f\x0f\x95\xe4\xa0\x43\xee\xed\x27\x45\xf6\x0e\x34\xf7\xf6\x96\x22\x77\x1c\xb6\x1c\xf7\x0f\x23\x53\xe0\xae\xc3\x96\xe3\x37\x38\x4c\xe0\xae\xc3\x34\xb9\xaf\xc3\x34\x39\xe8\x90\xfb\x3b\x4c\xe0\xae\xc3\x96\xe3\x37\x38\x4c\xe0\xb6\xc3\xde\x10\x5e\x6d\x57\xf5\x0f\xac\x4e\x54\xf5\x0f\xa9\x4e\x3c\xf5\x0f\xa6\x4e\x24\xf5\x0f\xa3\x76\x0c\xf5\x0f\xa0\x4e\xf4\xf4\x0f\x9d\x4e\xdc\xf4\x0f\x9a\x4e\xc4\xf4\x0f\x97\x4e\xac\xf4\x0f\x94\x26\x4a\x9c\x53\xde\xc8\xf5\x30\x3e\xce\xb6\x98\xa6\xf6\x77\xe0\x59\xe9\x90\xcb\xcb\x5e\xd9\x0c\x89\x63\x86\x6a\xb4\x7e\x43\xae\x19\x16\x22\xa1\x62\x63\xed\x73\x74\xad\xc2\x56\xa8\xff\xf9\xbc\x98\xae\xd0\x0a\x95\x39\x63\x9b\x57\xe6\xef\x56\x95\xae\xd1\x6c\x2f\xa8\xce\xb4\x8c\xc9\xe5\x74\xac\x86\xd9\x5b\x2a\x04\x7d\x6c\xe6\x1b\x48\xcc\xb0\x22\xe4\xad\x5f\x4c\xa7\x44\x2f\x37\x98\xd3\x74\x7d\x08\x15\xf5\x63\x85\xbb\x9a\xdc\x4c\x3b\x85\x25\x40\x28\x63\x16\x4d\x93\xac\x2c\x29\x01\x51\x66\x06\x04\x56\x13\x50\xf0\xd5\x1f\xc8\x4c\x78\x55\x8a\x5a\x00\x7a\x9b\x00\x0b\x99\x5f\x96\x1d\x11\xee\x1b\x6d\x70\x4d\x48\x0f\x04\xbc\xcd\x06\xd7\x42\x87\x22\x2e\xde\x20\xc0\xbc\x50\x7e\x38\x10\x30\x79\x8b\x80\x49\x47\xc0\xfc\xee\xc6\xfc\xed\x59\x6e\xca\x41\x80\x92\xf1\x97\xfe\xf6\x72\x7e\x54\x43\x17\xfa\x47\xf3\xf3\x62\x6a\x4e\xb2\x6d\x8e\x25\x8d\x58\x33\xdc\xc9\xf7\xcc\x7a\x48\x67\x73\x60\x80\x55\xd8\x22\x6b\x60\xa1\xe6\xf9\x6a\x47\x53\xbb\x2d\xf2\x5c\xd4\xb7\xa0\xc6\x64\x31\xee\xd5\x52\x6a\x9c\x31\xd9\x4f\xce\xbe\x8e\xad\xa1\xb7\xfa\x43\x33\xe5\x49\xb2\x18\xea\x9c\x55\x8d\x68\xb4\x6f\x49\x9e\x31\xe4\x58\x58\xe4\x4f\xc6\xe4\xcb\xd8\xbc\xed\xa1\x60\x0f\x33\x26\x98\xc5\xc0\x71\xad\x82\xc1\x96\x0a\x2d\x7c\xcd\xb3\xb5\xfd\x65\x7e\xf3\xcd\xc6\x29\xa1\x2a\xed\x2e\x45\x99\x98\x31\x2b\x8f\x13\x63\xc2\xea\xd9\xa1\x72\xa0\x85\x53\x56\x10\x6c\xc5\xc0\x18\x7e\x84\x38\x7b\xc4\x5a\xab\xeb\x20\x64\x3b\xc8\x76\x3c\x9b\x30\xcc\x69\x42\x21\x36\x0f\xe7\x8a\xec\x03\x69\x7a\x26\x86\x24\x32\xd7\xa6\xe8\x4f\x7a\xfe\xb1\x3d\x34\x9b\x64\x69\x9c\xf1\xba\xe1\x71\x10\x80\x39\xd9\x74\x66\x2e\x89\x86\x74\x62\xe7\x43\xf9\xec\x80\xbd\x83\xe8\xc8\x0a\x14\x42\x08\xb9\x9e\x33\x70\x1d\x6f\x50\xaf\x40\xbd\x59\x0f\xcf\x84\xd8\x65\x3c\xee\x35\xec\x68\xd0\xc6\x84\x3f\x0b\x89\xd9\x52\x62\xf2\x00\xbd\x06\x7e\x3f\x77\x29\x9f\x78\xfc\xb1\x2d\xb8\xfd\x9b\x31\x29\xa2\x7e\x43\x43\x05\x34\x2e\xcd\xeb\xee\xe8\x36\xa6\x79\x6e\xa5\x7c\x67\xc5\x60\xc7\x66\x22\x98\xcd\xe8\x77\x48\xbf\x43\x6a\xf7\x01\xd3\x34\x86\xa7\x95\xf2\xd2\x9e\x17\x83\x5d\x31\x57\xce\x2a\x06\x5d\xc3\x3f\x28\x0a\xd2\x96\x28\x48\x8f\x8b\xda\x44\xdf\xcd\x4a\x52\xce\xb3\xb8\x78\x90\xe5\x1a\x82\x89\x09\x01\x21\x5a\x86\x25\x82\xfd\x4b\xba\x1d\x43\x21\x05\xd9\x80\x99\x70\xa0\x60\x8a\x2c\x91\x6a\x98\x6d\x96\xa8\x7f\x2b\x7d\x0d\x7c\x8b\x53\x25\xbb\x23\xba\x9c\x13\xf9\x97\xb2\x0f\xeb\xc4\xc6\x72\xd5\x74\xa8\x09\x65\xef\xa8\xa0\xac\xa9\x23\x0a\x6e\xf7\xef\x14\x61\xed\x0a\x21\x59\xb9\x2c\x21\xc8\x66\x4b\x63\x69\x8f\x27\x57\x26\xc9\xf2\x67\x9a\xae\xcb\xd7\xc3\xe5\xf2\x72\xd1\x2b\xba\x15\xd0\xb8\xcc\xa4\x80\xbf\xfb\x4d\x3c\x55\x58\xe3\x6a\x72\xb6\x93\xad\x20\x1a\xfa\x72\x9d\xfc\x05\x54\x25\x94\x57\xd7\x1d\x47\x02\x4d\x12\x60\x66\x4a\xbb\x78\x3b\xc9\x78\xb1\xd5\x51\xdd\x22\xbc\x2a\xfb\xba\x32\xe3\xba\x93\x60\xbc\x26\xbb\x7a\xae\x55\xb4\x26\xf2\xb5\x5b\xaf\x8e\xae\xf8\xbf\xd0\xa6\x4b\xd2\x5d\x82\x04\xc2\x68\x2e\x2a\x2c\xac\x31\xb3\x21\x67\xe6\x23\x72\x2a\xc1\xfd\x16\x2c\x2b\x98\x86\xbb\xe7\x84\xbb\x2f\x81\xa7\xe4\x6a\xf8\x97\x4b\x2c\xf1\x9a\x53\xdd\x57\x43\x61\xc6\xd5\x57\x4b\xbd\x1e\x08\xf0\xd4\x22\x9b\xf6\xf3\x6e\x52\xd2\xa5\x9f\x54\xd8\x20\x8d\xab\x2f\xfb\xb2\x03\xb1\xa0\xe0\x59\x8e\x2d\x28\x6c\x1a\xe3\x88\xa8\xae\x2c\xce\x48\xb1\x85\x54\xda\x43\xcf\xab\xfd\x75\x9a\x24\x80\x3f\x32\x90\xc2\xbe\xcc\x88\xe3\x0e\x13\xf5\xb6\xfe\x44\xe3\x8f\x1e\x72\x46\x83\x9a\x5c\x66\xdd\x19\x4d\x8b\xdc\xea\xc8\xa8\x7b\x10\x3d\x87\x6e\x43\x91\xb3\x3a\x7d\x33\xd5\x97\xf3\x7c\x2a\x41\xd8\xd5\x0a\x89\x6e\xc1\xc2\x26\x85\x90\xd9\xd6\xd4\x12\xb1\x94\x98\x6c\x74\x89\x94\x3c\x64\x21\xcb\x6c\x14\xa4\x2b\x47\xe7\x16\x6d\x25\xa7\x3d\x59\xe2\x6a\x82\xfb\x9a\x55\x4d\x61\x4c\x09\x4f\xd2\x44\xc8\x44\xee\x59\xd2\x1b\x8b\xb2\x7a\x44\x96\xab\xba\xb1\x56\x09\xde\x24\x9b\xa6\x8c\xa6\x60\x96\x5f\x94\x80\xff\x72\x9d\x47\xb4\x72\xff\xcb\x75\xae\xe6\xff\x07\xfd\xdf\xb2\xcd\xb7\x04\x43\xc1\x4d\x06\x4f\x2d\xb1\xba\x01\x98\x24\x4b\xa5\xb2\xea\x6a\x6e\xdf\x7f\xbb\xb7\x7f\xbd\x9f\x4d\xed\x4f\x05\xa7\x1f\x27\x57\xd3\xab\x6f\x3f\x7b\xae\x83\x86\x97\x4e\x38\xf0\x3a\xd2\xfa\x39\x3a\x95\x20\x04\x3e\xd9\x09\x94\x10\xe3\x8a\xb3\x6e\x2d\x02\x67\x38\x5d\x6b\xf0\xd5\xa2\x1e\xd6\x5d\x15\x3c\x13\xcf\xdb\x5e\xdd\x6f\x85\x35\xae\x97\xd7\xe3\xc5\x4f\x07\x3b\x4a\x72\x0e\xb9\xad\xc6\xb1\x52\x8d\x65\x55\x43\x59\xa5\x59\x0c\xf5\x7c\xb0\x39\xcf\x24\x25\x20\x54\xdf\x66\xde\xca\x0d\x70\xf3\x5a\x39\xba\x6c\x52\xd7\xcb\xeb\x2f\xfd\xd6\xaa\xae\x97\xd7\xab\x2f\x29\xa3\x5b\x2a\x21\x6e\x96\x1e\x34\x7f\x7a\xf7\xe3\x12\x3e\xd4\xbb\x28\xee\x40\x55\x1d\xcd\xd2\xd5\x1f\x98\x53\x9c\x4a\xe3\xfa\xbe\xb4\x8c\x03\xc8\xe7\x1c\xac\x84\x0a\xab\x48\x29\xcf\xb6\xd8\xb5\xa8\xb4\xaf\xef\xa7\xd6\xfd\xb7\xfb\x1a\xb7\xa6\xd2\x12\xf8\x11\xa7\x29\xde\x34\xce\x21\x6b\x2a\x1b\x09\xcd\x07\x57\x0d\xb8\x6d\xc9\x01\x54\x37\x23\xf6\x92\x30\x3d\xbb\xc3\x47\x61\x1a\x60\x82\x29\xaf\x3b\x43\x85\x32\xae\x39\xde\xc2\x2e\xe3\x4f\x7d\x3a\xf6\x0e\xd8\xb8\xe6\x00\x37\x5b\xbc\x86\xba\xd0\x54\x7d\xb1\x4a\x62\x92\xf1\x35\xe8\x69\x85\xe6\x97\x66\x69\x57\xb5\x8e\xcf\xd7\xe5\x9c\xc2\xe9\x0d\x54\x19\x6b\x16\x84\x85\x9d\xc4\xfb\x4d\x7d\x7b\xfa\xb9\xad\x51\x67\x45\xfc\x30\xd3\x7d\xb3\xed\xee\x01\xfd\x07\x6c\xef\x8a\xf8\x61\xa6\x77\xda\xf6\x92\xe1\x1d\x30\xce\x99\x7b\x8c\xd5\x0f\x3c\x75\x17\xcb\x06\x09\xc5\xf7\x72\x2d\x95\xb9\xb9\xb0\x27\xb7\x8b\xff\xdc\xcc\x3f\x5b\x1a\x63\x54\x9b\xf3\xfe\xa7\x5f\xc1\xd7\x39\xd3\x5b\x37\x84\xc4\x69\x8c\x59\x96\x56\x19\x40\x25\xe5\x0d\xf5\x77\x56\xd2\x9b\xaa\xf2\x8c\xb4\x7f\x2f\xc4\x7d\x93\x8b\xdc\x1e\x52\x5e\xeb\x12\x2a\x5c\x8d\x7f\xa3\x4b\x4f\x68\xee\xb5\x55\xf2\x85\xf6\x37\x57\xc3\x49\x0b\x7a\xee\xa1\x3c\xb4\x62\x47\xe5\xc6\xfc\x3c\x99\x98\xf0\x44\x20\xaf\x17\xcb\xd7\x84\x34\xf6\xd4\xdb\x04\xd4\xa3\x66\x8b\xc0\x2f\x89\x7a\x60\x33\x1a\xad\x09\x41\x16\xf9\x65\xf3\x71\x38\x70\x93\x00\xf9\x5e\x42\x06\x00\x71\x30\x8c\x06\xc3\xd1\x90\x84\xee\x10\x39\x89\x17\x78\x21\xc6\x81\x1b\xf9\x4e\xf4\xcb\x26\xfa\x48\x22\xe4\x7b\xd8\x23\xe0\x27\x91\x8f\x86\x64\x10\x26\x41\x82\xdd\xc1\x08\x61\x14\xa1\x08\x39\x81\x17\x27\x11\x1e\x7d\x60\xe8\xc0\x54\x5c\xc8\x8c\x64\x69\xd2\xb5\x17\x13\xb3\x9e\x69\x39\xec\xd2\xe3\x8c\xec\xf7\x17\x74\x7d\xa6\x05\x46\x54\x64\xe9\x41\xe9\x5f\x7d\xd9\x69\x70\xeb\xfd\x86\x25\xb6\x9f\x31\x21\x16\x51\xb9\x30\x1a\x79\xf1\x90\x0c\x9d\xc0\x8f\xf0\x10\x8d\x86\x91\x33\x0c\x47\x80\xfc\xd1\x20\x88\x86\xde\x08\x0d\x5c\x0f\x8d\xa2\x00\x3e\xa4\xc8\x47\x5d\x2b\x08\xc3\x42\xe4\x58\x6e\xba\x96\xb4\xe3\xa2\xc9\xa1\x1b\x6c\x77\xa8\xd0\x91\x97\x64\xa9\x7c\x5d\x54\x27\xaa\x12\xfc\x77\x39\xb9\x74\x9d\xa5\xf2\xaa\xa6\xd4\xe2\xde\x25\x3a\xdf\x12\x94\xde\xa9\xee\x40\xe9\xf1\x5e\xd1\xe3\xf5\xec\x01\xbc\xbd\xa2\xd3\x3d\xc0\x19\x65\xbd\x1b\x7d\x47\xe1\xb9\x46\x7f\x56\xe9\x1b\xda\x79\x5b\xf1\xf1\x76\x7e\xdc\x04\x42\xf6\x28\xd3\xb3\x50\xd7\x82\x13\xcd\xf0\xf8\x5e\xec\x17\x50\xb3\xda\xee\xde\xc8\xfc\x51\x6f\xf4\x76\x02\x2d\x9b\x8e\xc2\x33\x1a\x61\xc6\x60\xfd\x62\x01\xe0\x83\x7e\xcc\x33\xd3\x37\xe5\x06\xcc\x35\x3d\x98\xf4\xfa\xcc\x68\xdc\x2c\x05\x14\x02\xb8\xb0\xb2\x54\x77\x31\xff\x48\x4e\x93\x8c\x13\xb0\xd7\x0a\xf3\x94\x37\x89\x80\x4e\x18\x58\xc1\x9e\xfa\x4d\x8c\x96\x50\xe3\xd7\xc5\xfc\xf2\x5c\xd1\x14\xc6\xf8\x15\x8b\x07\x60\xec\x0e\xf2\x8c\xcb\x5e\x1a\x2a\xc6\x6a\x8a\xd3\x75\x81\xd7\x6a\x64\xa0\xb8\xcd\x90\xe3\xe6\x62\x66\xe6\x34\x12\x75\x37\x18\x43\xfa\x64\xc5\xa0\x5e\x00\x85\x19\x65\x99\xec\xbe\x03\x54\xa7\x6b\xe7\xd9\x0e\x78\x4e\x6c\x92\x17\x76\x9e\x13\xff\xe9\xc9\xde\x52\x9a\x6f\x9e\xf5\x6b\xc1\x1d\x0d\x51\x10\x24\x31\x4e\xb0\x33\xf0\xa3\x51\x10\x40\xe0\xc1\x28\xf4\xdc\x18\x46\x5e\x94\x44\x0e\x49\xa2\x30\xd0\xaf\x85\x51\x82\x23\x3f\x4a\x7c\x42\x9c\xe1\x90\xb8\x08\x7c\x6f\xe4\xa3\x70\x30\x48\xbc\xc4\x25\x68\x34\x48\xdc\x70\x30\x74\x62\xe3\x66\xf2\xe5\xa7\x66\x8f\x90\x45\x49\x61\xb6\xcb\xcc\x21\xcf\x84\x4d\x49\xa1\xff\x48\x5e\xa4\x0f\xdd\xae\xf2\xe6\xb7\xcf\x3f\x55\xdb\x6a\x77\x5e\xd9\xbb\x3f\x8a\x1d\x44\xf6\x78\x8b\x9f\xb1\x0a\x91\xbf\x72\x58\xdb\x63\x29\x29\xb1\xef\xae\xc6\x97\xb3\xab\x4f\x1c\x1e\x3f\x22\xcb\x35\x6e\xca\xc3\x01\xa7\xea\xe6\x66\x31\x36\x6e\xfa\x4d\x3f\x55\x30\xe3\x66\xd9\xcc\x47\x52\x41\x3a\x4b\x4c\xa2\xe9\xf9\x4d\x51\xe4\xaa\xb6\xcc\x3c\x63\x94\x3c\xdb\x54\xb4\xd6\x3a\x5a\x12\x5e\x55\xb6\x9c\x18\x7a\x10\x34\xc3\x6b\x4a\x1e\x1a\x85\xea\xd1\x56\x3f\x2a\x5f\x34\x7a\xd3\x7f\xe3\xb1\x7c\x93\x1b\x37\x5b\x46\x23\xb7\x0e\x0a\x48\x99\x7a\x99\x42\xba\x85\x54\x36\x53\x64\xca\x20\x0d\xdb\xbf\x1f\xab\x66\x60\xdc\xa4\x49\x66\xfe\x79\xd3\x8c\xae\xa9\xfa\xfe\x9d\xe6\x2f\x17\xe1\x6e\x52\x09\xcc\x1c\x4f\x16\x37\xbd\xc2\x59\xc3\x57\x0a\xbe\x5a\x56\x4e\x6a\x4e\x0e\x8c\xd7\x1c\x40\x59\x58\x0a\x3d\x35\xb9\xa0\x01\x1a\xc6\x23\x2c\xf6\xbb\xce\x8f\x2e\xe0\x38\x03\xc7\x43\x23\x07\xf9\xe1\xfe\xf8\x95\x2a\x90\x15\x65\x9c\xe1\x34\xd6\xab\x4b\x31\x3c\x56\x95\x65\xd3\x5a\x6c\xfb\x38\xc1\xcd\x62\x5a\x16\xf8\xb7\xe5\xed\xbc\x59\x99\x14\xc7\xd6\x25\x7f\xc3\x62\x01\xbc\x3b\x39\x09\x56\xf1\x48\x89\x45\xb0\xfd\xcf\x36\xc6\x31\xde\x0a\xfb\x2f\x2c\xf2\xfd\x3e\x43\x63\x3a\x6e\x06\x5d\x98\x4b\x46\x23\xde\x2a\x33\x01\x9b\xe1\xfd\x14\x1c\xe6\xd2\xd4\x08\x13\xb9\x76\xc5\xf4\x5e\x30\x8d\xe9\xdb\xb2\x75\xf6\x5a\x52\x30\x7d\x7b\xfe\xdd\x43\xd6\x9b\xb2\xe9\xb3\xf2\xde\x47\x0c\x7a\x9b\xab\xd0\x79\x39\xaf\x45\x70\x0d\x6c\x18\x6f\x77\xee\xeb\xda\x7b\x65\x3a\x47\x2c\xf8\x91\x2a\x39\x65\x45\xcf\xd4\xe7\x85\x25\xef\x64\xc0\xdb\xf4\x9e\xcc\x63\xd9\x6b\x89\xcd\x0b\xea\x49\x65\x2a\xb7\x99\xf6\xca\x65\xcf\x2a\xec\x5f\xc7\x5d\xa5\xe7\xea\xb8\x87\xe2\xb7\x54\x6b\x5b\xf9\x8f\xeb\x7c\x93\xaa\x72\x02\x76\xb7\xdb\x99\x74\xbd\xb5\x8a\x94\x3e\x9a\x5b\xf6\x68\x25\xdc\xfe\xa7\x48\xa9\x84\x27\xad\x8f\x55\x3b\x77\xa6\xe7\x77\x4a\x54\x90\x1a\xaa\xfb\xe8\x9c\xe1\x74\x64\x45\xc0\x98\xa9\x4f\x48\xa8\x77\x88\x7e\xd6\x7d\x17\xb4\x29\x27\x0b\x50\xe1\x8c\xe9\xa2\x9b\x87\x28\x4f\x3f\x75\x92\x25\x96\xe7\x4c\xff\x65\x22\xb3\xdc\x75\x5e\x71\x50\x3f\x0e\x6a\x73\xdc\x7e\x1c\xb7\xcd\xf1\x70\x3f\x92\x87\x3b\x2c\xd2\x93\x45\x8e\xb3\x5e\xf7\x5c\x05\x34\xa6\x4a\xae\xdb\x2f\x71\xaf\xb0\xc6\x14\x72\x99\xa5\x94\xe0\x7e\xac\x1a\x6d\x4c\xe9\x94\xfe\x6e\x2e\xce\x6d\x09\x6f\xc1\x0e\x29\xe5\x84\xc7\x3a\x2b\x1e\xad\xbf\x75\x62\x50\xbf\xe8\x13\x6e\x33\xca\xe8\xdf\xe6\x23\x32\x91\x5d\xd1\xee\xfa\x69\xba\x6b\x69\xba\x6b\x87\xc4\x0b\x6d\x39\xe6\x92\x12\x9a\xc3\xf7\x26\xab\x60\xd9\x9a\x12\x0a\x8c\xc1\xfe\x91\x4e\x32\xe2\xc2\xfc\xbb\x80\x08\x54\xf2\xaa\x0c\x83\xd4\x4c\x38\x4e\x09\xa6\xe2\x55\x24\x07\x42\x73\x9e\x11\x2a\xa1\x62\xf1\x6e\x81\x72\x56\x88\x9e\x85\xaa\xa1\xc7\xa8\xff\xeb\x85\x4b\x32\x7e\xa4\x88\x51\x9e\xae\x9b\x78\xd7\xdf\xea\x8d\x96\x76\x9e\xae\x6d\xc1\xf5\x54\x5c\x9e\xae\xcd\xf6\x66\xa6\xd9\xcd\xbd\x39\x99\x7d\xe9\x13\x8b\x3f\xcf\x6e\xee\xbb\x9b\x7b\x66\x37\xf7\x1f\x26\xb3\x2f\xab\xa5\x7c\x66\xa0\x45\xe1\xf8\x11\xb8\xa4\xea\xd7\x5e\xe1\x3d\xbb\xb9\x5f\x7d\xd5\xa7\xc2\xf6\x44\x2d\x08\xd2\xb4\x5f\x03\x51\x36\x28\xb0\x66\x25\xd0\xff\xec\x6a\x02\x1b\xc5\x39\xd7\xd8\x67\x37\xf7\x0a\x36\xbf\xee\x77\xde\xbb\x84\x1a\xb3\x6e\x97\xba\xcd\xbe\x53\xc6\xca\x7d\x69\xb3\xc5\xd4\xae\x7e\x2e\x3b\xec\xd9\xf9\xd7\x41\x05\xa9\xa0\xe8\xb4\x58\xd4\x16\x7b\x36\x23\xa9\x60\x1a\xae\xd2\xd4\x34\xd3\x7b\x5a\x18\x24\x47\x26\x07\x0f\x15\xba\x96\x63\x9f\x67\x9e\x52\xed\x56\xa5\x72\x5f\x77\x56\x5b\x49\x2f\x71\x4b\x73\xd1\xdc\xe9\xb1\xa5\x84\x67\x6a\x70\x5c\x9e\xa8\xdb\x8f\xae\x6a\x9a\xb5\x15\xf9\x53\x97\xf3\xaa\x02\x05\x52\xd0\xbb\x1f\x10\x7f\xd7\x47\xfc\xdd\xd4\x98\xdd\x4f\xfb\xad\x07\xcf\xb0\xe4\xf4\x69\x75\x0f\xdb\x5c\xbd\xde\x56\x53\x1a\x71\xcc\x9f\x9b\x69\x9a\x19\x7e\x80\x9b\x34\x86\x7e\xe7\x8e\x1a\xb4\x31\xa3\xfc\x76\x79\xd6\x56\x05\x32\x66\x99\xcc\x44\x26\xb3\xb3\xe8\x0a\x67\xcc\x0a\x26\x29\x11\x67\xf1\x25\xcc\x98\x15\x79\x3f\xe3\x8b\xdc\x98\x8f\xf5\xf6\x7b\x3d\x26\x95\x54\x8d\xc9\xad\x14\x0b\x6c\xad\xb3\xc7\x76\xbd\xa4\x99\xc0\x76\x07\x7c\xca\x90\x1a\x67\xcc\x2f\x5e\xce\xd5\xb0\x18\x97\xb3\x13\x31\x3c\x02\xb3\xd7\x54\xea\xed\x3a\x6b\xfa\x29\xff\xd8\xfc\xde\x99\x0a\xab\x3a\xde\x5f\x36\xd1\x47\x6f\x18\xf9\x91\x97\x0c\x08\xf1\xa3\xc4\xf3\x01\xc5\x5e\x0c\x64\x80\x60\x30\x1a\x21\x3f\x1a\x85\x68\x14\x87\xe1\xc8\x37\xe6\x93\xa5\xee\x79\x32\xb9\xb5\x28\x63\x34\xcd\xa8\xd0\xdb\xd0\x0a\x5a\x90\x95\xd2\x53\x9e\x3c\x6c\x80\x27\xcb\x33\x59\x8e\x8d\xf9\xe7\xf3\xa1\xae\x30\xc6\x7c\x7a\xdb\x1c\xf2\xd0\xd7\x1d\xa4\xe5\x8a\x49\x66\xa7\x2c\x8b\x6d\x48\xf5\x9e\xfd\xf9\x74\xd1\x2f\x60\x15\xd0\x98\xdf\x96\xf7\xe7\x44\x54\x0a\x2b\x05\x49\xbf\x43\xaa\xda\x8e\x85\x8b\x96\xf6\xdb\xe5\x54\xd5\x54\x79\x3f\xc7\xfc\x74\x5f\x3a\x5f\x4c\x95\x1d\x76\x85\x7b\xb5\x73\x2c\x71\x48\xe1\x6e\x97\xbd\x52\x7c\x65\x86\xca\xf0\xe7\x55\xdb\x85\xc8\xda\x52\xa9\x9d\x9f\x82\xdc\x65\xfc\xc1\xa6\x02\x3f\x6c\x73\x3b\xe5\xac\x93\x83\xcf\xef\x17\x67\x85\xdf\x2f\x8c\x39\x2e\xb6\x70\x76\xdb\x77\x89\x32\xe6\x20\xcd\xe5\x7c\xa6\x05\xa7\x20\x4d\x91\x6e\xf3\x17\x2b\x59\xe5\xd1\xf1\xae\x2d\x20\x27\x97\xd7\xcd\xa4\x74\x4a\x75\x55\x16\x04\x73\x5d\x92\x66\xc9\x28\x05\x49\xe2\xe4\x70\x1d\x6c\x0e\x3b\xc1\x40\xf6\x3b\x01\x5a\x83\x8d\x79\xf6\x40\xf1\xb9\x72\xa5\x0a\x64\xcc\xb3\x1d\x44\xfd\xa4\x2b\xa4\x31\x57\x03\xaa\x7e\x78\x85\x34\x6e\x27\x93\xfb\x83\xbe\x9d\x60\x41\x70\x5c\x9e\xb1\xae\x77\x2c\x65\x84\x48\xb3\x3c\x31\xd2\xcc\xe6\xdf\x4e\xa6\x93\xce\xd2\x14\x61\xa4\x9a\x3c\x2e\xf7\x62\xdb\x98\x48\xfa\x48\x25\x85\xfd\x04\x6c\xb3\xa3\xf1\xd1\x4d\x68\x8a\xf5\xfd\x3a\x2f\x25\xbd\xe2\x92\x1a\x67\xdc\x5e\x46\x2f\xfa\x1b\x55\x6f\x47\x0f\xdd\x64\x71\xc4\xca\x26\x70\xbb\xdf\x97\x59\xce\xd0\x0a\x4b\xd0\xf2\x4a\x08\xb2\x15\xf5\x33\xbd\x29\xcd\xca\x37\xf9\x27\x2a\x61\xbb\xa2\xf1\xc7\xdb\xeb\x29\x72\x56\xca\xbd\xb7\xfb\xdb\xa5\xde\x2a\xe1\x90\x7f\xb2\xa0\x25\xcc\xb8\xfd\x7c\xbf\xec\xd4\xcd\x9a\x67\x45\xd9\xab\x4a\x10\x52\x55\xe3\x7e\x8e\xfb\x7e\x03\xab\xdb\x1c\xd2\xd5\x67\x05\x5a\xdd\x2f\xa7\xba\x7f\x78\x21\xe3\xa8\x42\x05\x32\x6e\xa7\x97\xe3\xc5\xa1\x7d\xff\xaa\x1f\x0f\x9d\x41\x10\x0c\x71\x80\xe3\x60\x14\x3a\x3e\x24\x1e\xf6\xfd\x38\xc0\x51\x12\xc1\x08\xc5\x43\x67\x10\x39\xc3\x11\x4a\x1a\xd5\xee\xbb\xa9\xf6\xdd\xc8\xf1\x42\x8f\x04\x0e\x71\x47\xa3\xd1\x70\x18\x05\xe1\xc8\x03\x18\x8c\x02\x92\xf8\xe0\x87\x83\x24\x72\x62\x32\x6c\x54\x7b\xef\xa6\x1a\x82\x24\x44\x68\x98\x38\x04\x9c\x30\x8c\x9d\x28\x1e\xe2\x10\x50\x18\xc7\x89\x37\x04\x8c\x7d\x07\x22\x67\x14\xa1\x46\xb5\xff\x6e\xaa\xc9\x28\x19\x05\xc4\x4d\xbc\xc4\x4d\x92\x28\x00\x07\x43\x10\x24\x30\xf4\xc2\x10\x27\xc3\x20\xf0\x87\x83\x81\x33\xf2\x6b\xd5\xae\xe5\xbc\x63\x6d\x47\x83\x78\x10\x62\x12\x23\x1f\x02\x44\xb0\x87\x71\xe4\xfb\x6e\x18\x25\xee\x20\x70\x5d\x8c\x87\x7e\x38\xf4\x12\x07\xf6\xca\xdf\xaf\xdc\x51\x12\x38\x89\x0f\x08\x85\x01\x76\x11\x8e\x62\x9f\x38\x38\xf0\x63\x2f\xf1\x3d\x1f\x25\xe0\x86\x89\x37\x00\xdc\xa8\x7e\xc7\x52\x3b\x31\x1a\x0e\x86\x5e\x08\xa3\x01\x76\x62\x2f\x1a\x25\x61\x40\xa2\x00\x01\xf2\x1d\x1c\x0e\x12\x17\x45\x30\x44\x41\xa3\xfa\x3d\x95\xfb\x11\x19\x86\x83\xc4\xf3\xa3\xc0\xc1\xd8\x73\x50\x04\x83\x24\x18\x38\x4e\x12\x84\x78\x14\x3a\xce\xd0\x49\xfc\x10\x41\x4b\xf9\xfb\x35\xb1\x38\x71\x09\x41\xe0\x22\x88\x86\x04\x0d\x9c\xc1\x28\x48\x82\x68\x48\x92\x24\x1e\xb8\xa3\x01\x41\x01\x8a\x30\x0a\xc3\xbd\xf2\xf7\x2b\xf7\xd0\x89\x1c\x82\x42\x20\x83\xe1\xc0\x45\x24\x0c\xc2\x10\x45\xee\xd0\xf3\x9c\x60\x98\x00\x49\x7c\x8c\x30\x21\x5e\xa3\xfa\xfd\x5a\x77\xec\xb9\x24\x09\x7c\xec\xb9\x71\x10\x22\x1c\xf9\xc3\x20\x76\x3d\x12\x22\x27\x72\xf0\x30\x89\x70\x12\xc6\x03\xaf\xa5\xfa\x1d\x5b\x77\x8c\xdc\xd0\x27\x3e\x1e\x21\x1c\x62\x2f\x74\xe2\x91\xe3\x03\xc0\x20\x8c\x51\x10\x7a\xc9\x28\x1c\x41\xec\x85\x83\x46\x75\xf0\x6e\xaa\x07\x61\xe0\x46\xa3\x78\xe4\x38\xae\x0b\x61\x30\xf2\xc8\x28\x74\x9d\xc0\x47\x9e\x17\x3a\x81\x37\x88\x50\x14\xe0\x21\x49\x1a\xd5\x83\x77\x53\x8d\x08\x06\x67\xe0\x86\x2e\x0a\x43\x94\xf8\x28\x1a\x7a\x0e\x72\x23\x1c\xa2\x81\xef\xf9\xe1\x68\x88\xa3\xc4\x77\x9d\x7d\x03\x1b\xbe\x63\x98\x11\xd7\x47\x01\x41\x71\x12\xa2\x20\x18\x00\x44\xde\x28\x82\x01\xc1\xb1\x1f\x84\x90\x84\x43\x12\x78\x3e\x76\x1b\xd5\xe1\x51\xd5\x4d\xf6\x53\x9d\x75\xec\xa6\xa0\xb7\x3d\xef\x94\xd3\x2f\xf7\x19\xe6\x0f\xb0\xdf\x6d\xd0\x3e\x56\xc8\x62\xeb\x21\xc3\x6a\xb4\x8b\xb7\x3a\x7b\xfb\x0b\x93\x07\xcc\xb3\xcc\xbe\xd5\xe7\x7b\x1d\xbd\x89\xb8\xc5\xe8\xa7\xb1\xba\x55\xae\xd1\xb8\xbc\x52\x19\xe3\x91\x7b\x1c\xbb\x19\x45\xb5\x92\x73\x00\xd7\xae\x11\x20\x0f\x6e\xb9\x3a\x4c\x2d\x97\x67\xe7\x7c\x2a\x88\xd1\xba\x06\xe4\x7c\x71\xca\x0b\x47\x6e\x5b\xd7\xcd\x1d\x5f\x9f\xf6\x91\xe3\x3a\x68\x88\x7c\xaf\x73\x3d\x68\xe7\xce\xc9\x4c\x30\xb7\x9e\xa3\x2a\x25\x9e\xf6\xc7\xb2\xf6\xc7\xde\x17\xc7\x95\x07\xfa\xfe\x4f\xc7\x1b\xf9\xce\x49\xe5\xa8\xcc\x9d\x97\xaf\x5f\x8b\x59\x0e\xd0\x8e\xc1\x4e\x59\xa9\xc6\x74\xaa\xe2\x97\x07\x69\xa3\x60\x55\x2c\xb7\x67\x70\xca\xf2\x2f\x5a\x07\xd3\x4f\xe6\xe2\x79\x1c\x57\xb9\xf8\xe2\xd7\x45\x1f\x83\x2a\xd8\x21\x3c\xdf\xe4\x7a\x40\x57\x8f\x26\xbc\xea\xba\x9f\x0a\x86\x4e\xe0\xca\xd5\x96\x05\x83\xa7\xa2\xdf\xf5\x81\x25\x74\x35\x61\x58\x9f\x01\x65\xb1\x68\xda\xc2\x22\x13\x72\xcd\x61\xf9\x7b\xe3\xa9\xbc\x7c\x22\xfe\x2e\x9d\xd5\x1a\x70\x92\x63\xf0\x57\x8b\xdd\x20\x8d\xea\x3c\x75\x8f\xe1\xd1\x1e\x69\xfc\xbe\x6f\xe4\x71\x46\xac\xbf\xa5\xa5\x87\x93\x3a\x2a\x3c\xcb\xeb\xd6\xde\xef\xfd\x36\xda\x54\x30\xe3\xf7\x4d\xc1\x58\x2f\xcf\x69\xa4\x71\xf7\x2b\x4c\xb2\x66\x79\x00\x48\x26\xaa\x71\xb9\xea\x11\x35\xad\xb5\x88\x5c\x5a\x74\xb7\x38\x7b\xb7\x4f\x05\xa9\xa0\xc1\x39\xe3\x2b\x98\x71\xd7\xba\x55\x73\x03\x8c\x3e\xa9\x30\x55\x23\xe1\xe7\x72\x10\x57\x8d\x77\x79\x2e\x58\x07\x7b\x5a\x76\xd5\x17\xdd\x2d\xc7\xe6\x6c\x7f\xf1\x1d\xfe\xbb\x8c\x7e\x9e\x10\xa1\xfe\x42\x9e\x5b\x4d\x3e\xdf\x2d\x27\xe7\x27\x99\x34\xa8\x05\x3d\x75\x23\xef\x10\x05\xc8\x77\x42\x77\xd0\xe9\x31\x68\x4b\xec\xdd\x62\x5a\x39\xc1\x19\x5b\xa2\xb4\x22\xa6\x82\xf4\xaa\x48\x8d\x6c\xa2\xfe\xae\x88\x9a\x75\x6e\x5e\x44\xcf\x66\x73\x7c\x08\xd2\xce\x51\xf0\xe5\xf8\x5b\xeb\x56\x55\x81\x9f\xda\x2a\x3a\x47\x43\x97\x93\x2b\x3d\x3b\xd7\x1c\xe3\x16\x04\xca\x68\x55\x1f\x56\x62\x83\x39\xc4\xab\xb2\x38\xab\x4e\xa8\x2c\x3f\xdf\x98\x17\x4d\xdf\x23\x84\x25\xd6\xb4\x5c\xfb\xad\xef\xa0\xd3\xf7\x11\xda\xcb\xcf\x37\xea\xc3\xf2\xeb\x94\x92\x0b\xab\x59\x5d\xa8\xe9\xe8\x0c\xbd\x02\xba\x6f\xd4\xa3\xde\x10\x79\x9c\x18\xcb\x9b\xe5\xfe\x9a\xd4\x35\xa7\xb1\x20\x1b\x88\x0b\x06\xfc\xc5\x1c\xd5\x67\x4e\x63\x48\xd7\x34\x85\x95\x66\x1d\x14\xf7\xe6\xa0\x5b\xce\x92\x84\x1e\x46\x8e\xa0\x42\xb0\x57\x78\xaf\x45\x9b\x06\x18\xcb\xd9\x74\xfe\x5b\x53\x61\x5b\x96\xfe\xd5\x46\x55\xa2\x66\x8b\x45\x7d\xa2\xa9\xbe\xc4\x2d\x26\x11\xc3\x0f\x60\x2f\x67\x8b\xce\x9d\x6d\x97\xd5\x29\x49\xfd\xa6\xaf\x8f\x7c\x95\xb1\x31\xbf\xe9\xb7\x64\xa4\x80\x87\x39\xc8\xb2\x5f\x8f\x55\xc1\x8c\xe5\xd7\x7e\x09\xd6\xf2\xeb\xd4\x58\xe2\xa7\x1c\xcb\x7e\xeb\x64\x15\x76\x6f\x16\xa4\xf1\x16\x53\xd6\x38\xb0\xfa\x5e\xc6\x49\x9c\x08\xed\xfd\x2a\x8c\xed\xfa\xd7\xa6\xa2\x74\xa0\xb4\x45\x1c\xbf\xfd\x60\xe0\x78\xae\x8b\x7c\xd7\x73\x02\xdd\xda\xc5\xbf\xd0\x46\xb7\xfd\xb6\x97\x37\x40\x63\xc9\x00\xf2\x67\x82\xe5\x59\x4a\x0d\x34\x96\xb9\x7a\xfb\x71\x33\xec\x77\xed\xee\xaf\x90\xf2\xe7\x55\x45\x5a\xdd\xc1\xda\xbc\x7a\x7a\xb1\x7c\x53\xcb\x1c\xf9\xff\x1f\x64\x8e\x8e\x94\xed\xc5\x35\xc9\x92\x30\xf5\xc7\x0c\xf4\xa7\x35\xa4\xc0\x29\xb1\x39\xac\x13\x9e\xa5\x52\x58\xc4\x58\xea\xbd\x33\x3c\x9e\x4d\xcd\x63\x8d\xea\xa0\x55\x15\x6b\xcc\x27\x77\x33\xbd\x42\xd9\x0c\x56\x85\x7a\x4a\x78\x99\xce\x13\xbe\x55\x21\x6d\xdc\x4f\x9a\x1e\x40\x12\x66\xc9\x87\xfd\xf8\x42\x12\x26\x0f\x76\xea\x56\xe8\xb3\x2e\xba\x9f\x28\xc9\x0b\x73\xc7\x71\x9e\x03\xd7\xb9\x11\x27\xd6\xdf\x05\x88\x72\xf9\x4e\x66\x39\x25\x65\x50\x09\xb1\x69\x6f\x6e\xfd\x20\x49\x5e\xd3\x8c\xfb\x19\x96\xf5\x9d\xb2\x0f\x54\xb6\xef\x27\xad\x0c\xba\xbd\xfb\xfd\xcb\x55\xef\xa4\xbd\x84\x3f\xaa\x77\xfd\xfd\x6d\xcf\x7f\x5d\x40\x01\x8d\x2f\xe7\x17\x8e\xbf\x2c\xa6\xc6\x97\x94\x92\x2c\x06\xf3\xf2\x7a\x69\xba\x0e\x0a\x4e\xb4\xbc\x00\xb9\xfa\xe6\xfb\xd0\x6f\x86\x05\x45\xc9\x6e\xde\x68\xad\xb5\x81\x03\xc1\x83\xd6\x1a\xc3\x39\xca\xfd\xed\x97\x5e\xe8\xaa\x20\x3f\x69\x43\x6a\x27\x2b\xa4\xf1\xc7\xed\xf2\xfe\xee\x76\xd6\xcb\x5b\x15\xd6\xf8\xa3\x5f\xba\x53\xc1\x8c\x3f\xa8\x3e\x1d\xfc\x48\xb7\x2a\xc5\x3c\x7c\x8d\x29\x0b\xe3\x8c\xd8\xc5\x5a\x35\x82\xd2\xe0\xaf\xde\xc4\x44\xa3\x51\xe8\x0c\xdd\x46\x4b\xb5\x7b\x7c\x92\xa5\x22\xe3\x92\x16\x5b\x7b\xaa\x2f\x0b\x68\xca\xba\xbf\x3b\xa3\xa6\xee\x85\xa9\x3a\x71\x02\xe4\x9d\x13\xa6\x70\xc7\x24\xe2\x34\x36\xeb\x83\xfc\x4a\xe0\x79\x39\x8e\x7b\x4c\x4e\xf9\x6f\x36\x78\xa8\xb1\xec\x9c\x0f\xbf\x7a\x13\xe3\xeb\xfd\x75\xf9\x1e\x15\x78\x6b\x7d\xcf\xca\x04\x74\x27\x93\x9c\x35\xbb\xbe\x77\x4f\x5f\x69\x1a\x67\xbb\xb3\x4b\xc2\x5f\xbf\xed\x4a\xa0\xf1\x15\x4b\x92\x6d\xfb\xd4\xe3\x1e\x69\x7c\x15\x05\xcd\xfb\x6d\x28\x29\xa1\xc6\x37\xd4\x8c\xb1\x9e\x12\x0e\x10\x0e\x34\xd8\xb3\x3c\x6b\xa0\xcd\xbf\xbb\xf9\xfc\xeb\x7d\x79\x43\xc5\x07\xcf\xf8\x76\xad\x31\xed\xb5\x85\x36\x8d\x14\xfa\x42\xd0\x3a\x79\xf4\x4b\x3f\x7e\x5b\x3e\xe0\x7e\x6b\x59\x1a\xd9\xf4\xe3\xdf\x80\x67\xfd\x96\xf5\x35\xd2\xf8\x96\xc2\xc9\xfb\xa1\xd5\xef\xc6\x7f\xba\x29\xc7\x77\xba\x8d\x78\xe7\xf2\x65\xfb\x19\x6f\xb2\x6c\x55\xce\x64\x34\xb7\x75\x37\x89\xe6\x7f\xba\xcb\xaf\xfd\xf9\x55\x50\xfd\xd9\x1a\x12\xb1\xd8\xfa\x9e\xe5\x55\x5e\x0f\xd5\x35\xaf\x75\x76\x65\x57\x48\xcd\x70\xf7\x53\x43\x67\x18\xea\xdd\xfe\xe7\xf9\x5d\x24\x5d\xe8\x29\x73\xfe\x5c\x4c\x6d\xe3\x4f\xe8\x77\xc1\xd2\x9f\x10\x1b\x7f\x42\x1a\x9f\x9e\x97\x41\x9e\x13\xa0\x21\x1a\x05\xa3\xee\x3f\xdb\xf2\x1d\xaa\x33\x03\xb5\x2b\xdd\x95\x53\xce\x07\xfc\xa9\xdd\xdc\x5e\x61\x69\x3b\x5e\xb7\xe9\xf2\xc1\xc1\xe2\xa6\x89\x4c\xdf\xf8\x93\xd1\xa8\xa1\x31\x1a\xe9\x7e\x4d\x7d\xe8\xa6\xd6\x6d\xd8\xab\x6e\x63\x34\x32\xa2\xef\x34\x77\xf5\xc6\x26\xfd\x92\x89\xea\xe3\x1b\xfa\x89\x5d\xfe\xba\xc5\x69\x81\x59\x09\x2a\xc5\xef\x59\x83\x83\xa4\x1b\x0b\xba\xcd\xd2\xec\xd1\xa4\xdb\x92\x7d\xec\xba\x64\x83\x14\xe5\x0d\xf8\x2d\x62\x84\xd7\x31\x70\xd5\xea\x58\x87\x52\x77\x3b\x31\x4d\x92\x2d\xe6\x0f\xbd\xaa\xae\x06\x1b\xf1\x23\xcd\xe3\xa4\xdf\x8d\x11\x15\xd6\xd0\x33\x03\xa7\x0e\x0b\x00\xc9\x44\x77\x6e\x00\x3e\x43\x4a\x9f\x6a\x02\xac\xd5\xb7\x7a\x20\x16\x17\x6a\x20\x56\x22\xd4\x33\xb3\x1c\x37\x34\x17\x95\x23\x3d\xf0\x53\x99\xef\x5e\xca\x59\x5b\xf7\xe2\x0e\x86\x21\xba\x71\x3a\xc6\x7a\x79\x5b\xae\x1f\x36\x51\x40\x84\x95\x88\xa2\xbc\x0d\x09\xd2\x35\x30\x48\xbb\x29\xd0\x3a\x2d\x72\x96\xf5\xeb\xdb\x3e\x97\x58\x83\xce\xb0\x2c\x2d\x2e\x8f\x0a\x59\x74\xab\x1e\xe8\xa2\xeb\x8b\xb6\x44\xa2\xff\xe8\xce\xb3\xb9\xf8\x9d\xd1\x48\xd2\x24\xe9\xa5\xa9\xc2\x1a\xdb\x9c\x92\x8d\xdb\x8b\x32\xbb\xb9\x37\x72\x91\x70\xdc\x6f\x3f\x63\x09\x35\x72\x51\x48\xca\xfa\xcd\xbe\x55\x58\xe3\x89\xa6\x20\xfb\x75\x26\xdf\x34\xb4\x79\x1d\x3c\xe5\xfd\xb6\x49\x3d\xe5\xb9\xa1\x5a\xb7\x89\xc9\x43\x9a\xed\x18\xc4\x6b\x7d\xf8\xa9\x5f\x07\xc6\x68\xf4\x95\xca\xcd\xb8\xcb\xd5\x5b\x28\xad\x2d\x95\x66\x2b\x3b\x33\xfe\x5f\x00\x00\x00\xff\xff\x8a\x76\x5c\x24\x7d\x6b\x00\x00")
        -
        -func urlsCsvBytes() ([]byte, error) {
        -	return bindataRead(
        -		_urlsCsv,
        -		"urls.csv",
        -	)
        -}
        -
        -func urlsCsv() (*asset, error) {
        -	bytes, err := urlsCsvBytes()
        -	if err != nil {
        -		return nil, err
        -	}
        -
        -	info := bindataFileInfo{name: "urls.csv", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
        -	a := &asset{bytes: bytes, info: info}
        -	return a, nil
        -}
        -
        -var _namesCsv = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x5b\x5d\x9e\x9b\x38\x90\x7f\xe7\x14\xda\x3c\xec\x26\x3b\xa2\xc7\xe0\xee\x4c\xf2\x48\xe3\x76\xc7\x59\x8c\x89\x71\xa7\x33\x79\xd9\x9f\x0c\xb2\xad\x6d\x8c\x58\x21\xfa\x23\x4f\x7b\x87\x3d\xc5\x9c\x63\x6e\xb2\x27\xd9\x9f\x3e\x40\x60\xe3\xaf\x79\x41\xb2\xea\x5f\x55\x52\xa9\x54\x2a\x09\x3c\xb8\x8d\x47\xf0\x36\x1e\x81\x9f\x98\x51\xe0\x67\xa8\x2a\x31\x08\x48\x82\xf3\x12\x5b\x9e\x17\x40\x8f\x73\x46\x96\x15\x27\x34\x07\x5e\x59\x56\x0c\xe5\x49\x0b\x31\x8a\x03\xe8\x6d\xd1\x2f\x9a\x83\x11\x59\x13\x8e\x32\x10\x63\xf6\x4c\x12\x5c\x1a\xd0\x38\xb0\x9d\x2b\x07\x7a\x09\x4a\xf1\x96\x24\x60\xcc\x70\x23\x02\x3c\x3b\x57\x8e\x86\xb8\x87\x21\xae\x84\xb8\x57\x83\x43\x10\xf7\x6a\xa0\x21\x07\x15\xb9\x5a\xd1\xf0\xb0\x94\xa1\x90\x72\x1f\x89\xce\x0c\xa0\xb7\x5a\x09\xa3\xdc\xe3\x1c\x33\x94\x81\xa8\x5a\x66\x24\x69\x77\x4a\x63\x87\x57\x03\x9b\xe6\xd9\x1b\xbc\x0f\x1f\xc0\x09\xa6\xe1\xd5\x00\x08\x6c\x8b\x93\xd9\x19\xe2\x98\x9d\xcd\xcd\x80\xc4\x37\x12\xce\x64\xb4\xbc\xe9\x28\x0a\x22\x0f\x7a\xd3\xd1\xbf\x95\xa0\xc8\x0a\xf4\x9f\x5b\x54\x5c\x25\x66\x9e\xa6\x01\xf4\x8a\x22\xc3\x60\x3a\x59\xb4\x5a\x23\x2f\xd6\xf6\x7a\x03\x74\x05\xa6\x54\x3a\x43\x44\x12\x5e\x31\x0c\x3c\xc6\x4b\x80\xf2\x14\xc4\x09\xc1\xb9\x98\xf7\xdb\x78\x64\x79\xe1\x22\x98\xdb\xd1\x08\xca\x0a\x88\xe9\x8a\xbf\x20\x86\xc1\x9c\xac\x37\xbc\x04\x21\xe5\x24\xc1\x96\x17\x79\x63\xa1\x34\xa5\x4b\x0c\x22\x5a\xf2\x32\x61\xa4\xe0\xc0\x1b\x4f\x8d\xfe\x7a\x36\x52\x54\x70\xf2\x8c\x77\xc7\x26\xa7\x21\x8a\x35\x48\x76\x5f\x23\x62\x5a\x31\xe3\xab\x6d\xa0\x73\x02\xe8\xd4\x40\xf7\x04\xd0\x55\x40\xf7\x84\x6a\xe9\x9c\xcb\x92\xbf\x65\xb8\x84\x75\xc5\x8c\x50\x0c\xdf\x76\x07\x83\x8f\xda\x12\xf1\x5b\xc9\xf1\xb6\x04\x93\x3c\xa1\xac\xa0\x0c\x71\x9c\xd6\x22\x7d\x9a\x1a\xb9\xde\x9a\x61\xbc\xc5\x39\xd7\x32\xee\xb3\xb7\x62\xa3\x85\xc8\x3a\x08\x48\xc9\x8d\xa2\xd5\xb6\x40\xac\xc4\xb0\xae\x18\x4a\x86\xd2\x94\xe4\x50\x97\x6a\x55\x74\x0d\x6d\x79\x05\x4a\x36\x58\x9b\x59\x54\xbb\x96\xad\xa9\xce\x3e\xd5\xa9\xa9\xee\x3e\xaf\x34\x0d\xe3\xa4\xe4\x24\x11\xb2\xed\x08\xb3\x0c\xd6\x2d\x6d\x15\xe0\xbd\x20\x7d\xe8\xa2\x93\xec\x53\x3f\xf8\xe5\xf7\x44\x05\xb3\x4f\x1d\x86\x5e\xb0\x41\xb8\x7d\x08\xd1\xc5\xdb\x78\x64\x3b\xb6\x8a\x8f\x32\x5e\xd6\x3f\x1a\xf3\x08\x84\xab\x1b\x6d\x61\xbf\x3a\xb2\xd6\x8d\x40\x37\xf6\x73\x84\x98\xef\x31\xa8\xb6\x7e\x7c\x84\x38\xce\x39\x6c\xb7\x81\x28\xab\x4a\xa0\x08\xbd\x4c\xf0\x5d\x47\xfc\xbb\x77\x31\xd9\x16\x19\x59\x11\x9c\xbe\x7b\x57\x73\xbc\x93\x2c\xc3\x5a\x4f\x2b\xfe\xcb\xce\xbd\x10\xbe\x01\xc8\x34\x76\xd1\x7e\x86\x11\x93\xb8\xba\x09\xc8\xa6\x4e\x77\x1a\x74\x70\x1b\x06\x30\x40\x2f\x4c\xc4\x0d\x70\x8b\xd9\x13\xce\xf0\x1b\x08\x91\x10\x8c\x32\x10\xa0\xa5\x8c\x26\xe0\x19\x31\x82\x72\x0e\xb2\x3e\x29\x21\xb5\xc3\x2a\x11\x5a\x6c\xad\xc5\x76\x07\xce\x75\xb7\x17\x21\x05\x1a\x64\xa6\x75\xe0\x5c\x9f\x92\x74\x4a\xc8\x41\xfe\x47\xc4\x18\xca\xf9\xdb\x41\x01\x35\xa0\x23\x41\x4d\xd0\xd0\x4c\x50\x88\x5f\xde\xbd\x13\x21\xff\xdd\xbb\x39\x7e\x26\xe5\xfe\x44\x5d\xd7\xca\x1f\x7c\xd8\xfe\x0d\xde\x3f\xe4\xe4\x19\xb3\x92\x70\x19\xb5\x7d\x94\x91\x15\x65\x39\x41\x76\x5c\xe0\x84\xac\x48\xf2\xa1\x23\x40\xe9\xbe\x36\xba\x67\x8c\xac\x49\x8e\xb2\xba\x03\xb3\x6c\x4f\x79\xc4\x28\xc7\x49\xe3\x1b\xe6\x67\xc7\x3e\x2a\x72\xd9\x22\x72\x49\x58\x3b\x92\x79\x1d\x4f\x52\x41\xfc\x96\xd2\x92\x9b\x2d\xa3\xbd\x50\x6f\xd1\x46\x44\x38\x55\x18\x25\x88\x31\x28\x1e\xa6\x05\x63\x26\x98\x61\x5d\x31\x14\xc2\x17\x94\x31\x9c\x73\xa5\xab\xf9\x09\x66\x05\xce\x77\x03\xb7\xdc\xe4\x3b\x2c\xce\x19\x2c\x8e\x75\x4b\x59\x82\xab\x57\xa8\xcb\xc6\x71\x7d\x6f\x31\xd3\x3b\x90\x4f\xb7\x45\xc5\x31\x13\x59\x15\x4d\x08\xe2\xb8\x04\x0b\x56\x95\x22\xd6\xf7\xc9\x15\x62\x7d\xdf\xbe\xfd\x53\xf6\xdb\x67\x18\xc9\xdd\xd0\xa7\xdb\x2d\xcd\xcb\xb6\x21\xa5\xa5\x14\xd4\x3d\x05\x75\x5b\xd0\x9b\x53\xd0\x1b\x0d\x1d\x9e\x92\x3a\x6c\xa4\x5e\x9f\x82\x5e\x37\xd0\xd0\x3f\x3d\xb2\x90\xe6\xb2\x1d\xb3\x84\xa0\xac\x35\xd0\xd0\x3f\x3d\xd6\x1d\x66\xb7\xcb\x7c\x62\xf4\x7b\xcc\x37\x86\xf9\xa4\x3d\x76\x98\x87\x6d\xcd\x27\x2d\xb4\xc3\xdc\x31\x58\x38\xba\xd8\x66\x21\x05\x23\xcc\xc8\xb3\x64\x28\xbb\x26\x0c\x47\x17\x5b\x71\x47\x9c\xbb\x27\xee\x32\xbb\xee\x89\xbb\xe9\x88\xbb\xd4\xd2\x3b\xe2\x86\x3b\xbd\xbb\xd4\xf6\x3b\xe2\x3a\x53\x11\x7b\x17\x4f\x45\xbc\x11\x91\xc9\xcb\xc8\x13\xee\xce\x43\xec\x5d\x3c\x0f\x6d\x59\xee\x9e\xac\xcb\x26\xa1\x2b\xeb\xa6\x23\xeb\xd2\x19\x68\xcb\x1a\xee\xf4\xeb\x52\xf3\xb7\x65\xb5\x6c\x7f\xd6\x1a\x38\xe4\xf4\x67\x79\xfc\x21\x17\x3f\xcb\xbf\x0f\x39\xf4\x59\xde\x7c\xc8\x7d\xcf\xf2\xdd\x03\xce\x7a\x8e\xa7\xf6\xbb\xe6\x39\x7e\xd9\xef\x88\xe7\x78\x61\xbf\xdb\x9d\xe3\x73\xfd\x4e\x76\x8e\x87\xed\xbb\xd4\xa0\xdf\x38\xf2\x7e\x44\xa4\x03\x40\xe7\x55\x28\xb3\xfc\xd1\x48\x65\x2c\x0a\x04\x46\xf8\x19\x67\xb4\x10\x07\x32\x79\x22\x1e\x91\xd2\x68\x6a\xa7\x31\x9a\xd1\xb9\x90\xd1\xb1\xfc\x51\xe0\x89\x13\xd2\x96\x94\x25\x79\xc6\x8d\xf2\x2a\x17\x69\xde\x08\x71\xb4\x7f\x36\x04\x06\xaf\x95\x07\x9e\x2d\xc6\x4d\xf2\xf5\x79\x02\x34\x58\x71\xdf\xf9\x93\x40\x8f\x1a\x8b\xaa\x3a\x2b\xee\x65\x6b\x86\xfb\xb9\xc3\xe6\x5c\xc0\xe6\xd4\x6c\xee\x05\xda\x5c\xa3\xcd\xbd\x40\x9b\x6b\xb4\xdd\x6a\x26\xfb\xf6\x14\x5b\xcd\xe1\xd7\x1c\xfe\x69\x8e\x70\x3e\xb1\xbf\xbe\xf1\x0d\xcd\xa1\xa8\x03\x55\x6f\xf2\x53\x49\x8f\x64\x9b\x7d\x1f\x05\xb6\x48\x13\x11\x27\xcb\x0c\x2b\xb8\x22\x75\x32\xc4\xfb\x28\x00\x06\x76\x48\x67\xd4\xd2\x19\xed\xe8\x8c\xbc\x8e\x1f\xeb\x83\x7f\x7b\x9d\x74\xbc\x37\xea\x43\x77\x11\x33\x09\x71\xa1\x4c\xf2\x23\x46\xff\x0b\x27\x3a\x5d\x6e\xe1\x5c\xcb\x7f\xf0\xec\x59\x2d\xee\xc1\x03\xb3\xd5\x8a\x24\x7b\x57\x3c\xca\x83\x50\x96\x62\x86\xa0\x2e\x4d\xe7\xb3\xfa\xc0\x0e\xfd\x0c\x31\x79\x9a\x05\xbb\x67\x78\xcb\xa7\x79\x4a\x99\x5e\x73\xa2\xda\xa3\xc3\xb1\x7c\x46\xcb\xf2\x85\xb2\x14\x36\x35\x23\x81\xbd\x95\x1c\x65\x31\x47\xc9\x13\x66\xb0\xfb\xd3\xa0\xaa\x25\x86\xe2\xd1\xb4\x8c\xec\xb1\x3e\xd7\x8c\x70\xc5\xcb\x64\x23\x2f\x02\x48\xc7\x49\x7e\xe1\xfc\x97\x35\x9a\xf9\x70\x34\xf3\x0d\x63\x3c\x8a\xa0\x78\x98\x16\xca\x4b\xfc\xdf\x39\xd4\x65\xd3\x7e\xe7\x2b\x05\x77\x69\x95\xd4\x67\x67\xb3\xa8\x3b\x56\x14\x50\xf7\x34\x54\x2c\xa2\xbb\xb1\x96\x4a\x56\x2b\x9c\x81\x31\x65\xd5\x76\x47\x98\xbe\x92\xed\x47\x48\x19\x7a\x6e\xef\x92\x8c\x14\x65\xef\xdd\x9d\x80\xb8\x87\x21\x52\xca\x83\x08\x4c\x6b\x46\x52\x78\xf7\x20\x83\xd4\x3d\x23\xe9\xde\x2a\xb3\xee\x1e\x6a\x75\x15\xa3\x05\x46\xb9\x88\xd5\xfd\x1e\xaa\xa1\xce\x49\xa8\x53\x43\xdd\x93\x50\xd7\xba\xcb\x39\x2e\x4b\x04\x75\xd9\xeb\xc7\x77\x2c\xab\x55\xb3\x0c\xe5\xeb\x5e\x47\x14\xaa\xca\xb7\x2d\xd4\x65\x33\xc2\x71\x3c\xf6\x22\x38\x8e\xc7\xc0\xcb\xb2\x76\x60\x6f\x01\x1e\x02\x09\x78\xc8\x33\xb2\x25\xe2\x34\xd9\xa1\x05\xf3\x7e\x2a\x78\x2f\x6f\x76\xea\x5f\x73\xcc\x71\x2e\xfc\xe3\x83\x35\x5e\x04\x50\x44\x35\xfe\x56\x98\xa5\xdc\xc8\x44\x84\x41\xf1\x30\x2d\x0c\x6d\xf1\x0b\x65\xaf\x72\x26\x9a\x5f\x7b\x8b\xdf\x12\x32\x27\x5b\xb4\xc6\xb0\xa9\xf5\x1a\xec\x7e\xac\x36\x4b\x73\xc7\x2e\x63\xec\x88\x26\x95\x88\x6e\xa8\x13\x9f\x84\xf5\xd4\x05\xbb\x61\x6b\x5f\xb0\x9f\x64\xad\x6f\xd7\x6b\xf6\x73\xb8\x6a\xb0\x7b\x6e\x17\xdd\x4e\x17\xdd\x4b\xba\xe8\xee\x75\xd1\x3d\x87\xab\x06\x0f\xcf\xed\xe2\xb0\xd3\xc5\xe1\x25\x5d\x1c\xee\x75\x71\x78\x0e\x97\x75\x1f\xb8\x51\x0c\xe5\xb3\xf1\x26\xfd\x2e\xe6\x37\x29\xe0\xc8\x9b\x98\x96\x4a\xc5\x61\xc6\x79\x94\x4b\x8e\xb1\xe6\x68\x0f\xf1\x12\x5d\xe7\xab\x71\x4f\x0d\xc5\xdd\x15\xef\x9e\x33\x14\x77\x47\xc7\x79\x43\xe9\xd5\x25\xa2\x80\x7d\xef\xfb\x36\x7e\x4d\x70\x21\xaf\xf6\x4e\xc9\x78\xf9\xfd\xde\xf7\xc1\xbc\xca\x39\xd9\x8a\x48\xb4\x64\x88\xbd\x81\x86\xbf\x2b\x1a\x55\x9c\x26\x34\x5f\x5d\x24\xdf\xd3\x4c\x87\x84\x2e\x49\x49\xf3\x8b\x24\xde\x0a\x8e\x43\xe2\x92\x0c\x95\x65\x81\xf8\xe6\x22\x91\x7e\xcd\x75\x48\xec\x8a\xe6\xfc\x22\x89\x63\x9a\xf3\x7d\x61\xe7\x7b\xc2\xf0\x94\xb7\x0d\x77\x3d\x60\x78\x8e\xb7\x0d\x77\x74\x9c\xe7\x6d\xbd\xba\x2e\xf4\xb6\xe1\x99\xde\x36\xfc\x87\xde\x36\x3c\xe6\x6d\xc3\x13\xa6\x37\x66\x21\x2a\x2f\x81\x75\xc5\x44\xb3\x8c\xa4\x18\x0e\xd3\xd5\x2b\x90\xd5\x16\xa1\xca\x5e\x31\x54\x45\xd3\xfa\x25\x0a\x47\xf0\x0b\x29\x39\x65\x24\x41\x66\xbf\x97\x87\x7b\x2e\x12\x65\x7d\x58\x4c\x32\x44\xb6\x98\x59\x5f\x50\xf9\x84\xb3\x6c\x8e\x0b\xca\x38\xd4\xbf\x40\x80\xf2\x75\x25\x76\x57\xd5\xde\x88\x9f\xdc\x4e\xed\x82\x2c\x4b\x38\xb9\x9d\x82\x88\xbe\x60\x16\xf9\x60\x92\x13\x4e\x50\x46\x7e\xa9\x00\x2d\x14\xdc\x52\x6a\xae\xe3\xad\x89\xff\x00\x27\xfe\x83\x91\xf2\xf5\x1e\x4e\xf2\x14\x17\x38\x4f\xc5\x49\xea\x6b\x74\x77\x0f\xee\x19\xad\x0a\x03\x89\x3c\x38\x89\x3c\x20\xfd\xd9\x34\xaa\xd8\x29\x95\xf7\x6c\xfb\x93\xd8\x87\x93\xd8\xa4\xc3\x32\x41\x98\xa2\x35\x49\x9e\x60\xab\xde\xa2\x67\x64\xe9\x42\x55\x98\xd6\x7c\x45\xed\x9f\x93\x08\xd6\x95\x16\x85\xe3\xcc\xf6\xfc\x68\x02\x65\x15\x88\xea\xb1\x93\x9b\x44\x69\x6c\xcf\x05\xbd\xa4\xb3\x25\x2a\xd5\xa9\xbc\xf9\xd5\x3b\xb8\xaf\xf1\x2c\x84\xe2\xd1\x70\x7f\x45\x65\x84\x99\x5c\xdf\xaa\xda\x50\x02\x4f\xed\xf2\xf2\x77\x22\x5f\xb8\x4b\xb7\x57\x29\xa7\xa2\x0e\x7b\xa9\x43\x2b\xe8\x6c\x3a\xf5\x62\x39\x18\x3c\xcc\x02\x0d\xf6\xf6\x9e\x33\x98\x85\xf3\x07\xbd\x5b\xd0\x3f\xd0\xfc\x0f\x94\x3a\xff\x74\x98\xad\xdc\x32\xc0\x65\x89\xd9\x91\xf8\xea\x74\x55\xee\x8c\xf3\x0c\xee\x5d\xdd\x97\xab\x6d\xe2\xfa\x09\xae\x4e\xc8\x0d\xf6\xe2\xfb\x39\xdc\x6d\x9d\x17\x0d\xb5\x57\xf7\xc5\x6a\x83\x39\x3c\x0e\x1f\x53\xb1\x50\xf2\x75\xa5\x8e\xfb\x73\x5c\xca\x45\x59\x5a\x81\x0e\x2f\x41\x95\xc8\x3b\xb0\x2e\xdb\x77\xcc\xca\xfa\x4d\x99\x46\xba\x07\xa0\xcf\xf2\xa2\x22\x88\x6a\x79\x68\x81\x7f\x34\xc7\xa0\xbe\xb5\xad\xa1\xce\x49\xa8\x53\x43\xdd\x93\xd0\xa6\x03\x43\x74\x12\x3b\x44\x0d\x38\x39\x0d\x4e\xac\x00\x71\xfc\xea\x62\xa8\x4b\x13\x77\x70\xc1\x69\x4e\x12\x04\x9b\x9a\xa1\x91\x80\x7c\xb3\x23\x35\x4c\x1d\x79\x54\xd4\x49\x2b\xf0\xad\xfa\xfb\xaf\x25\x4e\xc0\xff\xfd\xcf\xff\xb6\x8f\xa8\xcf\x8d\xcd\x1d\xcd\x3f\x3f\xcd\x3f\xff\xfb\xaf\x84\x14\x8c\x26\x84\xff\xfd\x57\x9f\x88\x22\xab\xca\x4b\xc5\xac\x28\xe3\xbb\xfd\x59\x16\xf9\x1a\x66\xb2\x68\x46\x39\x9d\x2c\x6c\x7f\xfa\x00\xfd\xe9\x43\xa7\x0d\xa5\xcf\x98\x71\x52\x92\x7c\x0d\xef\xf2\x8c\xac\x37\x1c\xe7\xdb\xd6\x57\x17\xe0\x3d\x76\x3e\x7e\x90\x58\x9c\xe7\x08\x8a\x47\x47\xc2\x0a\x6f\xe0\x0a\x6f\xda\x6d\xb0\xfd\xd1\xd5\x74\xb2\x08\xc7\x9e\x6c\xfa\x2d\xa7\xf6\x0a\x65\x25\xb6\xd5\x57\x17\x65\xf3\x32\x79\xaa\x5d\x72\x4a\x7f\x91\x2c\xdb\xbb\x6d\x10\xbe\x38\xd5\xae\x78\x10\xe2\x48\x88\x88\xd7\x39\xb5\x13\x5a\xbc\x65\x78\xd5\x4e\x52\x0f\x30\x8a\x34\xf3\x7d\x4e\x41\xcd\x61\x52\xa5\x0f\xb5\xc0\x23\xac\xd6\x34\xb6\xa3\x00\x4e\x49\xc2\x68\x49\x57\xbb\x7e\x29\xc8\xf3\x36\x79\x8e\xd5\xe4\xa1\xcc\x40\x16\x41\x00\xa7\x88\x33\xf2\x0a\x16\x78\x5b\x88\x38\xd3\x04\xfe\x06\x84\x9e\xb0\x48\x4d\x5e\x61\x53\x33\x34\xc2\x66\x31\x94\x4f\xd3\x46\x39\x2d\x29\xa7\xb0\xae\x18\x4a\x95\x71\x92\x94\x50\x97\xad\xf6\x02\x4e\x5b\x99\x4e\xe8\xc9\x97\x2b\x43\x28\x2a\x9d\x2c\xc1\x5c\x35\x8b\x7d\x39\xbc\xd5\x73\x17\x62\x2e\xf2\xab\x0c\xa3\xbd\x0b\xa5\x67\xc7\x0a\xfd\xd8\x83\xdd\xef\x38\x26\x59\x46\x72\x4a\xca\xdf\x05\xad\x37\x0f\x09\xef\xa3\x40\xc8\xdd\xa0\xe4\xe9\x40\xd8\xb4\xc2\x60\xa6\xde\x9a\x85\x94\xbd\xe0\x35\x41\xfa\x28\x9e\x60\xb1\x38\x94\xd8\x7b\xfa\x8c\x99\x72\xeb\x11\xe2\xc8\x0a\x03\x21\x57\xd8\x64\x4b\xf6\xa6\x2c\x9c\xc5\x52\x29\xf9\x85\xf3\xfe\x5e\x99\x01\x97\x09\x2a\xfa\xd3\xa2\x50\xbb\xeb\x11\x90\x63\x85\xd1\x2c\x56\xbb\x49\x48\x73\x3b\x62\x74\x45\x9a\x2f\x31\x76\x92\xb7\xa1\x90\x39\x0f\x60\x38\x0f\x4c\x47\x16\x11\x0c\x17\x26\x0f\x0c\x51\xb5\xc5\x39\x54\xc5\xde\xb0\x30\xb7\xe3\x70\x1a\xc1\xba\xd2\xa6\xf8\xa3\x31\x54\x45\xb3\x24\x43\xfc\x52\x66\x98\x33\x58\x57\x0c\x9e\x3e\x11\x04\xe5\xb3\xdf\x3e\xf4\x05\x2f\xa1\x7c\x9a\xb6\x2a\x27\x1c\xca\x67\xd3\x36\xf3\xfd\x85\x58\x3c\x52\x86\xef\xc5\xbe\x37\xba\x03\x0b\x9c\x6c\x72\x9a\xd1\xf5\xdb\xee\x00\x66\x7e\xa0\xbe\x8c\x10\x15\xb1\x3d\x62\xc4\x92\x4d\xdf\x9a\x9c\x8d\x96\x6a\x86\x66\x23\x5f\xf5\x50\xcc\xba\xcc\x60\x3b\x73\x34\xd3\xd7\xc2\xf1\x24\x50\xb0\x76\x56\x0f\x0c\xc2\x39\x88\x70\xac\xd9\xfd\x22\xd6\x43\x50\x27\x85\x05\x2e\x39\x88\x2b\xc2\x8d\x41\x66\xc1\xc8\x53\x1b\x8c\xba\x39\x1c\x79\x51\xaf\x3b\xd4\x38\xf7\x28\xce\x6d\x70\xc3\xa3\xb8\x61\x83\xbb\x3e\x8a\xbb\xd6\x38\xf7\x6a\x70\xb4\x87\x92\x6e\xb0\xc7\x91\xe0\x3d\x65\xa0\xa0\x65\x49\x96\xd9\x9b\x98\x14\x4f\x9e\xbf\xdc\xab\xc1\xed\x87\x46\xc6\x71\x6d\x46\xd7\x29\x64\x17\x7b\xc4\x7a\x92\x6c\xa0\xc7\x85\x36\xb8\x63\x66\x76\x1b\x33\xbb\x47\xcd\xec\xb6\xcc\x7c\x73\x14\x77\xd3\xe0\x3e\x1e\xc5\x7d\x6c\x70\x7f\x1c\xc5\xfd\xd1\xe0\x3e\x1d\xc5\x7d\xb2\x66\x53\xed\xc8\x53\xc4\x9e\x70\x6b\x9d\xea\x78\x27\x69\x7d\xb1\x6e\x16\xdf\x89\x85\xac\x66\x34\xbe\x5b\xec\x81\x74\x7a\x22\xe7\x29\x6e\x09\xeb\xfd\x30\xae\xfe\xaa\xec\x10\x42\xc9\x70\x0f\xca\x70\xb5\x0c\xf7\xa0\x8c\xba\x1f\xc3\x83\x32\x44\xb4\x15\x94\x58\xaf\xed\x38\x36\x51\x37\xaa\x5f\x95\x8b\xe8\xa2\x47\x3a\xa2\x5b\x44\x72\x30\xc2\x29\x51\xef\xa2\xc0\xbf\x76\xc6\x14\x7d\x89\xa4\xb6\xe8\x4b\xd4\x39\x1e\xd4\x04\x67\x8f\xe2\x58\x51\x86\x5f\xab\x12\xaa\x02\xc8\x2b\xb9\x17\xca\xb2\xd4\x6c\xd9\x11\x2d\xf9\x9a\xe1\xf8\x5b\x00\x4d\xd5\x50\xd5\x9b\x57\x61\xa8\xee\x4b\x52\x69\xa1\x6f\x7a\x52\xbf\xf5\xe5\x5a\xdf\x36\x55\x96\x41\xf9\x6c\xc4\xcd\xbf\x60\x9f\xaa\xfc\x74\x8e\x53\xf0\x05\x71\x20\x1a\x7a\x03\xd9\x5c\x6f\x7e\xad\x6c\xa7\x27\x5d\x53\xa8\x9b\xa3\xa8\x1b\x6b\x5e\x7f\x10\x3f\xc7\x28\x0b\x31\x7f\xa1\xec\xa9\x3c\xf0\x71\xba\xf4\xc6\x79\xec\xd9\xd3\x11\x9c\xc7\x1e\x98\xe2\xb2\x44\x6b\x6c\x8f\xc8\x1a\x9b\x8f\xc7\x81\x35\x8f\xfd\x28\x80\x73\x92\xd0\x4d\xe7\x13\xce\x9d\x1d\x67\x9e\x92\x32\x81\xf2\x69\xda\xaa\xe5\x1b\x14\x8f\xa6\x25\xf6\x7e\xd8\xd1\x08\xc6\xe8\x75\xc7\x1b\xf4\x3f\x03\x62\xff\xce\x83\xe2\xa1\xbe\xd0\x48\x77\xb7\xcb\xf8\x7e\x62\xdf\xaa\x7d\xe8\x7e\x72\xe0\xa5\xfb\xad\x1a\x5a\x0d\x75\x4e\x41\x1d\x0d\x75\x4f\x49\x15\xae\x10\x4f\x62\xfd\x0f\x81\xb8\xca\xc1\x24\x4f\xab\x92\xb3\x37\x10\x73\x94\xa7\x88\xa5\x65\x8f\x95\x5d\xc5\x74\x3e\x83\x63\xc5\xd3\x20\xfc\x0a\x6b\x0c\x98\x06\x22\x05\x0c\xf1\x0b\xf8\x8a\x59\x89\x5b\xe6\x9c\x46\x51\x00\x63\x9c\x54\x0c\xeb\x09\x24\xf9\x5a\x7e\x90\x4b\x13\xba\x97\xfe\xc5\xe1\xc4\x83\xe2\xd1\xe7\x61\xb1\x76\x72\xd1\xcd\xbe\xc0\x15\x3f\x06\x30\x4e\x36\x78\x8b\xc1\x23\x49\xd7\x98\x37\x79\xf7\xfb\xf8\x31\xf8\x70\xec\x0a\x2d\x46\xaf\x05\xe2\x1b\xa8\x4b\xd3\x1f\x9c\xa7\x5b\x44\x32\x58\x57\x0c\x85\x6c\xf5\x71\x42\x7e\xab\xde\xfb\x7a\x38\xce\x30\x2e\xde\x12\xc4\x61\x53\x33\xfc\x85\x48\x6a\x99\xfd\xe9\x23\xd4\xd5\x86\xf5\xd3\xc7\x86\xfa\xf9\x7a\x8f\xfa\xf9\xda\x50\x3f\xef\x53\x3f\x5b\xf5\xa4\x4c\x03\xfb\xbc\x29\xaa\xd6\x88\xf9\xf3\xa9\xf0\xc4\xab\x21\xac\x7f\xf6\x85\x82\xab\xa1\xb5\xf0\x03\xb8\xf0\x83\xdf\x17\xff\xd1\x08\x58\xf8\x91\xfd\xc2\x50\x51\x60\x56\xc2\x85\x1f\x81\x47\xfd\xc3\x20\xa6\x88\x63\x28\x9f\xbd\x39\xe6\x62\x36\xff\xf6\x70\x27\x97\x82\xaa\xca\xad\xf3\xb7\xfd\x19\x93\xbe\xb7\x10\x29\xfd\x82\x55\x65\xc9\x31\xeb\x95\x57\xbf\x6e\x6f\xbe\x88\xea\x79\x23\xad\x7c\xe6\x21\x27\x09\x4d\xb1\x3d\x1a\xc7\xb6\x3b\x70\x6e\xa0\x6e\xd8\xf7\x11\x60\xab\xaf\x90\xc6\x24\xc3\xfa\x7f\x45\x75\xef\xde\x0b\xce\x0f\xbb\xb2\x3e\xfe\x63\x59\x1f\x8d\xac\xc5\xec\xa1\x11\xb3\xc0\x6c\x5b\x8a\x49\x7c\x10\x43\xcc\x75\x6a\x0f\x17\x1b\x0c\x9a\x5f\xd6\xf7\x59\xbc\x98\xcf\xa6\x50\x97\xbb\xb3\xd8\x1c\xa2\x94\xc5\xac\xef\x3a\x1c\x7f\xa7\xcf\x24\x45\xbd\x06\x1f\x58\xdf\xc9\x16\x7e\x27\xe6\x65\xff\xe3\xd0\xb7\x9d\xcf\x9f\x3f\x0d\xfe\x70\x07\xf0\x71\xe8\x1b\xb6\xd6\xed\x7f\x73\xe3\x20\x90\xf6\xe0\x0f\xdb\x1d\x7c\x90\x9c\xc2\x58\x83\x1b\x67\x78\x90\xb3\x7e\x13\x6b\x44\x08\x16\x7b\x70\x63\x3b\x43\x29\xe2\xb4\x4e\x77\x30\x70\x6d\xc7\xb5\x87\xce\x07\xeb\x71\x31\x8e\x02\x38\xa2\xe0\x71\x83\x38\x10\xd6\x1a\xff\x7b\xf2\x04\xfe\xa4\x15\x78\x44\x39\x07\x0b\xba\x1b\x85\x5e\x5e\x1f\x49\x9e\xd2\x97\x12\x36\xb5\xbd\x23\xfc\x23\xe2\x09\xdd\xaa\x78\xf4\x26\x0f\x23\xd2\xac\xaa\xb9\x6f\x17\x7e\x2c\x2b\x52\x20\xa8\x8a\x46\xcc\x0f\xc7\x81\x3f\x1c\xc7\xfc\x16\xb1\xfd\xd3\x47\xb9\x14\x74\xbd\x13\x03\x7f\xc4\x4f\x88\x43\xf9\x34\x3c\x98\xd1\x57\x28\x9f\xa6\x2d\xc7\x1c\xfe\xb8\x0a\x5b\x89\xdf\x9f\x7a\x51\xfc\x89\x36\x94\xfe\x4b\x6f\x04\xfd\x53\xef\xf4\x07\x21\x8e\xf5\x53\x43\x7e\xd2\xfd\x53\x70\x4d\x17\x51\xb1\x8f\x2e\x62\xe2\x4f\x9d\x59\xf6\xd3\x1d\xeb\x27\x4e\xe1\xcf\xd6\xb7\x21\x3f\x71\x9e\x2a\x81\xb8\x35\xc1\x72\xa7\xfb\x49\xb6\x4b\x86\xe4\xc9\x49\x55\x7b\x8f\x4d\x0d\xea\xfa\x30\xea\xda\xfa\x99\x91\x25\xfc\x95\x11\x73\xc6\x5d\xfe\x22\x85\x2b\x0c\x76\x75\x03\x65\x5d\x7a\x58\x46\x96\xea\x47\xdb\x6e\x57\x37\x2d\xf4\xc7\x93\xe8\x8f\x56\x52\xb1\x0c\x8a\x47\xa3\x2d\x25\xab\xd5\x16\xb1\x27\x58\x57\x9a\x93\x7b\xfa\x4c\x8a\x74\xb5\x85\xba\x6c\x38\x64\xfe\x26\x0c\x23\xf3\xb6\x6c\x2f\x39\x1f\x58\xf8\x1e\xe7\xe4\x15\xaa\xe2\xaa\xd7\x2d\xc5\xa4\xaf\xe3\x99\x3a\x7f\x2e\xa1\xac\xf6\x59\x71\x69\xad\xf3\xaa\xc8\x28\x87\xba\x6c\xba\x41\xa6\x88\x93\x57\xa8\x8a\x26\x69\x00\xe3\x2a\xaf\xff\x6f\xa3\xd6\x8d\xd9\x6b\x33\xb2\xe4\x64\xb5\x82\xba\x6c\x24\x6d\x0b\x92\x6c\x5c\xa8\x8a\xa6\xb5\x28\x57\x0c\xad\xa1\x2a\x5a\xad\x15\x27\x59\x09\x75\xd9\xb4\xbf\x92\x1c\xf3\x14\xaa\xc2\xb4\x16\x05\xfc\x11\x99\x2b\x12\x31\xcf\x36\x4a\x9e\x72\xfa\x92\xe1\x74\x2d\xbb\x25\x27\xff\xf7\xee\x3d\xab\xfa\x4f\x99\xd7\x05\x5a\xff\x1f\x00\x00\xff\xff\x74\x05\x4e\x03\x9a\x3c\x00\x00")
        -
        -func namesCsvBytes() ([]byte, error) {
        -	return bindataRead(
        -		_namesCsv,
        -		"names.csv",
        -	)
        -}
        -
        -func namesCsv() (*asset, error) {
        -	bytes, err := namesCsvBytes()
        -	if err != nil {
        -		return nil, err
        -	}
        -
        -	info := bindataFileInfo{name: "names.csv", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
        -	a := &asset{bytes: bytes, info: info}
        -	return a, nil
        -}
        -
        -// Asset loads and returns the asset for the given name.
        -// It returns an error if the asset could not be found or
        -// could not be loaded.
        -func Asset(name string) ([]byte, error) {
        -	cannonicalName := strings.Replace(name, "\\", "/", -1)
        -	if f, ok := _bindata[cannonicalName]; ok {
        -		a, err := f()
        -		if err != nil {
        -			return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err)
        -		}
        -		return a.bytes, nil
        -	}
        -	return nil, fmt.Errorf("Asset %s not found", name)
        -}
        -
        -// MustAsset is like Asset but panics when Asset would return an error.
        -// It simplifies safe initialization of global variables.
        -func MustAsset(name string) []byte {
        -	a, err := Asset(name)
        -	if err != nil {
        -		panic("asset: Asset(" + name + "): " + err.Error())
        -	}
        -
        -	return a
        -}
        -
        -// AssetInfo loads and returns the asset info for the given name.
        -// It returns an error if the asset could not be found or
        -// could not be loaded.
        -func AssetInfo(name string) (os.FileInfo, error) {
        -	cannonicalName := strings.Replace(name, "\\", "/", -1)
        -	if f, ok := _bindata[cannonicalName]; ok {
        -		a, err := f()
        -		if err != nil {
        -			return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err)
        -		}
        -		return a.info, nil
        -	}
        -	return nil, fmt.Errorf("AssetInfo %s not found", name)
        -}
        -
        -// AssetNames returns the names of the assets.
        -func AssetNames() []string {
        -	names := make([]string, 0, len(_bindata))
        -	for name := range _bindata {
        -		names = append(names, name)
        -	}
        -	return names
        -}
        -
        -// _bindata is a table, holding each asset generator, mapped to its name.
        -var _bindata = map[string]func() (*asset, error){
        -	"licenses.tar": licensesTar,
        -	"urls.csv": urlsCsv,
        -	"names.csv": namesCsv,
        -}
        -
        -// AssetDir returns the file names below a certain
        -// directory embedded in the file by go-bindata.
        -// For example if you run go-bindata on data/... and data contains the
        -// following hierarchy:
        -//     data/
        -//       foo.txt
        -//       img/
        -//         a.png
        -//         b.png
        -// then AssetDir("data") would return []string{"foo.txt", "img"}
        -// AssetDir("data/img") would return []string{"a.png", "b.png"}
        -// AssetDir("foo.txt") and AssetDir("notexist") would return an error
        -// AssetDir("") will return []string{"data"}.
        -func AssetDir(name string) ([]string, error) {
        -	node := _bintree
        -	if len(name) != 0 {
        -		cannonicalName := strings.Replace(name, "\\", "/", -1)
        -		pathList := strings.Split(cannonicalName, "/")
        -		for _, p := range pathList {
        -			node = node.Children[p]
        -			if node == nil {
        -				return nil, fmt.Errorf("Asset %s not found", name)
        -			}
        -		}
        -	}
        -	if node.Func != nil {
        -		return nil, fmt.Errorf("Asset %s not found", name)
        -	}
        -	rv := make([]string, 0, len(node.Children))
        -	for childName := range node.Children {
        -		rv = append(rv, childName)
        -	}
        -	return rv, nil
        -}
        -
        -type bintree struct {
        -	Func     func() (*asset, error)
        -	Children map[string]*bintree
        -}
        -var _bintree = &bintree{nil, map[string]*bintree{
        -	"licenses.tar": &bintree{licensesTar, map[string]*bintree{}},
        -	"names.csv": &bintree{namesCsv, map[string]*bintree{}},
        -	"urls.csv": &bintree{urlsCsv, map[string]*bintree{}},
        -}}
        -
        -// RestoreAsset restores an asset under the given directory
        -func RestoreAsset(dir, name string) error {
        -	data, err := Asset(name)
        -	if err != nil {
        -		return err
        -	}
        -	info, err := AssetInfo(name)
        -	if err != nil {
        -		return err
        -	}
        -	err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755))
        -	if err != nil {
        -		return err
        -	}
        -	err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode())
        -	if err != nil {
        -		return err
        -	}
        -	err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())
        -	if err != nil {
        -		return err
        -	}
        -	return nil
        -}
        -
        -// RestoreAssets restores an asset under the given directory recursively
        -func RestoreAssets(dir, name string) error {
        -	children, err := AssetDir(name)
        -	// File
        -	if err != nil {
        -		return RestoreAsset(dir, name)
        -	}
        -	// Dir
        -	for _, child := range children {
        -		err = RestoreAssets(dir, filepath.Join(name, child))
        -		if err != nil {
        -			return err
        -		}
        -	}
        -	return nil
        -}
        -
        -func _filePath(dir, name string) string {
        -	cannonicalName := strings.Replace(name, "\\", "/", -1)
        -	return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...)
        -}
        -
        diff --git a/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/investigation.go b/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/investigation.go
        deleted file mode 100644
        index 4ba2054b1..000000000
        --- a/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/investigation.go
        +++ /dev/null
        @@ -1,149 +0,0 @@
        -package internal
        -
        -import (
        -	"bytes"
        -	"fmt"
        -	paths "path"
        -	"regexp"
        -	"strings"
        -
        -	"gopkg.in/src-d/go-license-detector.v2/licensedb/filer"
        -	"gopkg.in/src-d/go-license-detector.v2/licensedb/internal/processors"
        -)
        -
        -var (
        -	globalLicenseDatabase = loadLicenses()
        -
        -	// Base names of guessable license files
        -	licenseFileNames = []string{
        -		"li[cs]en[cs]e(s?)",
        -		"legal",
        -		"copy(left|right|ing)",
        -		"unlicense",
        -		"l?gpl([-_ v]?)(\\d\\.?\\d)?",
        -		"bsd",
        -		"mit",
        -		"apache",
        -	}
        -
        -	// License file extensions. Combined with the fileNames slice
        -	// to create a set of files we can reasonably assume contain
        -	// licensing information.
        -	fileExtensions = []string{
        -		"",
        -		".md",
        -		".rst",
        -		".html",
        -		".txt",
        -	}
        -
        -	filePreprocessors = map[string]func([]byte) []byte{
        -		".md":   processors.Markdown,
        -		".rst":  processors.RestructuredText,
        -		".html": processors.HTML,
        -	}
        -
        -	licenseFileRe = regexp.MustCompile(
        -		fmt.Sprintf("^(|.*[-_. ])(%s)(|[-_. ].*)$",
        -			strings.Join(licenseFileNames, "|")))
        -
        -	readmeFileRe = regexp.MustCompile(fmt.Sprintf("^(readme|guidelines)(%s)$",
        -		strings.Replace(strings.Join(fileExtensions, "|"), ".", "\\.", -1)))
        -
        -	licenseDirectoryRe = regexp.MustCompile(fmt.Sprintf(
        -		"^(%s)$", strings.Join(licenseFileNames, "|")))
        -)
        -
        -// ExtractLicenseFiles returns the list of possible license texts.
        -// The file names are matched against the template.
        -// Reader is used to to read file contents.
        -func ExtractLicenseFiles(files []string, fs filer.Filer) [][]byte {
        -	candidates := [][]byte{}
        -	for _, file := range files {
        -		if licenseFileRe.MatchString(strings.ToLower(paths.Base(file))) {
        -			text, err := fs.ReadFile(file)
        -			if len(text) < 128 {
        -				// e.g. https://github.com/Unitech/pm2/blob/master/LICENSE
        -				realText, err := fs.ReadFile(string(bytes.TrimSpace(text)))
        -				if err == nil {
        -					file = string(bytes.TrimSpace(text))
        -					text = realText
        -				}
        -			}
        -			if err == nil {
        -				if preprocessor, exists := filePreprocessors[paths.Ext(file)]; exists {
        -					text = preprocessor(text)
        -				}
        -				candidates = append(candidates, text)
        -			}
        -		}
        -	}
        -	return candidates
        -}
        -
        -// InvestigateLicenseTexts takes the list of candidate license texts and returns the most probable
        -// reference licenses matched. Each match has the confidence assigned, from 0 to 1, 1 means 100% confident.
        -func InvestigateLicenseTexts(texts [][]byte) map[string]float32 {
        -	maxLicenses := map[string]float32{}
        -	for _, text := range texts {
        -		candidates := InvestigateLicenseText(text)
        -		for name, sim := range candidates {
        -			maxSim := maxLicenses[name]
        -			if sim > maxSim {
        -				maxLicenses[name] = sim
        -			}
        -		}
        -	}
        -	return maxLicenses
        -}
        -
        -// InvestigateLicenseText takes the license text and returns the most probable reference licenses matched.
        -// Each match has the confidence assigned, from 0 to 1, 1 means 100% confident.
        -func InvestigateLicenseText(text []byte) map[string]float32 {
        -	return globalLicenseDatabase.QueryLicenseText(string(text))
        -}
        -
        -// ExtractReadmeFiles searches for README files.
        -// Reader is used to to read file contents.
        -func ExtractReadmeFiles(files []string, fs filer.Filer) [][]byte {
        -	candidates := [][]byte{}
        -	for _, file := range files {
        -		if readmeFileRe.MatchString(strings.ToLower(file)) {
        -			text, err := fs.ReadFile(file)
        -			if err == nil {
        -				if preprocessor, exists := filePreprocessors[paths.Ext(file)]; exists {
        -					text = preprocessor(text)
        -				}
        -				candidates = append(candidates, text)
        -			}
        -		}
        -	}
        -	return candidates
        -}
        -
        -// InvestigateReadmeTexts scans README files for licensing information and outputs the
        -// probable names using NER.
        -func InvestigateReadmeTexts(texts [][]byte, fs filer.Filer) map[string]float32 {
        -	maxLicenses := map[string]float32{}
        -	for _, text := range texts {
        -		candidates := InvestigateReadmeText(text, fs)
        -		for name, sim := range candidates {
        -			maxSim := maxLicenses[name]
        -			if sim > maxSim {
        -				maxLicenses[name] = sim
        -			}
        -		}
        -	}
        -	return maxLicenses
        -}
        -
        -// InvestigateReadmeText scans the README file for licensing information and outputs probable
        -// names found with Named Entity Recognition from NLP.
        -func InvestigateReadmeText(text []byte, fs filer.Filer) map[string]float32 {
        -	return globalLicenseDatabase.QueryReadmeText(string(text), fs)
        -}
        -
        -// IsLicenseDirectory indicates whether the directory is likely to contain licenses.
        -func IsLicenseDirectory(fileName string) bool {
        -	return licenseDirectoryRe.MatchString(strings.ToLower(fileName))
        -}
        diff --git a/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/normalize/normalize.go b/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/normalize/normalize.go
        deleted file mode 100644
        index 7f348141a..000000000
        --- a/vendor/gopkg.in/src-d/go-license-detector.v2/licensedb/internal/normalize/normalize.go
        +++ /dev/null
        @@ -1,195 +0,0 @@
        -package normalize
        -
        -import (
        -	"bytes"
        -	"regexp"
        -	"strings"
        -	"unicode"
        -
        -	"golang.org/x/text/runes"
        -	"golang.org/x/text/transform"
        -	"golang.org/x/text/unicode/norm"
        -)
        -
        -var (
        -	lineEndingsRe = regexp.MustCompile("\\r\\n?")
        -	// 3.1.1 All whitespace should be treated as a single blank space.
        -	whitespaceRe         = regexp.MustCompile("[ \\t\\f\\r              ​]+")
        -	trailingWhitespaceRe = regexp.MustCompile("(?m)[ \\t\\f\\r              ​]$")
        -	licenseHeaderRe      = regexp.MustCompile("(licen[cs]e)\\.?\\n\\n")
        -	leadingWhitespaceRe  = regexp.MustCompile("(?m)^(( \\n?)|\\n)")
        -	// 5.1.2 Hyphens, Dashes  Any hyphen, dash, en dash, em dash, or other variation should be
        -	// considered equivalent.
        -	punctuationRe = regexp.MustCompile("[-‒–—―⁓⸺⸻~˗‐‑⁃⁻₋−∼⎯⏤─➖𐆑֊﹘﹣-]+")
        -	// 5.1.3 Quotes  Any variation of quotations (single, double, curly, etc.) should be considered
        -	// equivalent.
        -	quotesRe = regexp.MustCompile("[\"'“”‘’„‚«»‹›❛❜❝❞`]+")
        -	// 7.1.1 Where a line starts with a bullet, number, letter, or some form of a list item
        -	// (determined where list item is followed by a space, then the text of the sentence), ignore
        -	// the list item for matching purposes.
        -	bulletRe = regexp.MustCompile("(?m)^(([-*✱﹡•●⚫⏺🞄∙⋅])|([(\\[{]?\\d+[.)\\]}] ?)|([(\\[{]?[a-z][.)\\]}] ?)|([(\\[{]?i+[.)\\]} ] ?))")
        -	// 8.1.1 The words in the following columns are considered equivalent and interchangeable.
        -	wordReplacer = strings.NewReplacer(
        -		"acknowledgment", "acknowledgement",
        -		"analogue", "analog",
        -		"analyse", "analyze",
        -		"artefact", "artifact",
        -		"authorisation", "authorization",
        -		"authorised", "authorized",
        -		"calibre", "caliber",
        -		"cancelled", "canceled",
        -		"capitalisations", "capitalizations",
        -		"catalogue", "catalog",
        -		"categorise", "categorize",
        -		"centre", "center",
        -		"emphasised", "emphasized",
        -		"favour", "favor",
        -		"favourite", "favorite",
        -		"fulfil", "fulfill",
        -		"fulfilment", "fulfillment",
        -		"initialise", "initialize",
        -		"judgment", "judgement",
        -		"labelling", "labeling",
        -		"labour", "labor",
        -		"licence", "license",
        -		"maximise", "maximize",
        -		"modelled", "modeled",
        -		"modelling", "modeling",
        -		"offence", "offense",
        -		"optimise", "optimize",
        -		"organisation", "organization",
        -		"organise", "organize",
        -		"practise", "practice",
        -		"programme", "program",
        -		"realise", "realize",
        -		"recognise", "recognize",
        -		"signalling", "signaling",
        -		"sub-license", "sublicense",
        -		"sub license", "sub-license",
        -		"utilisation", "utilization",
        -		"whilst", "while",
        -		"wilful", "wilfull",
        -		"non-commercial", "noncommercial",
        -		"per cent", "percent",
        -		"copyright owner", "copyright",
        -	)
        -
        -	// 9.1.1 "©", "(c)", or "Copyright" should be considered equivalent and interchangeable.
        -	copyrightRe = regexp.MustCompile("copyright|\\(c\\)")
        -	trademarkRe = regexp.MustCompile("trademark(s?)|\\(tm\\)")
        -
        -	// extra cleanup
        -	brokenLinkRe    = regexp.MustCompile("http s ://")
        -	urlCleanupRe    = regexp.MustCompile("[<(](http(s?)://[^\\s]+)[)>]")
        -	copyrightLineRe = regexp.MustCompile("(?m)^((©.*)|(all rights reserved(\\.)?)|(li[cs]en[cs]e))\n")
        -	nonAlphaNumRe   = regexp.MustCompile("[^- \\na-z0-9]")
        -
        -	// used in Split()
        -	splitRe = regexp.MustCompile("\\n\\s*[^a-zA-Z0-9_,()]{3,}\\s*\\n")
        -)
        -
        -// Strictness represents the aggressiveness of the performed normalization. The bigger the number,
        -// the more aggressive. See `Enforced`, `Moderate` and `Relaxed`.
        -type Strictness int
        -
        -const (
        -	// Enforced is the strictest mode - only the official SPDX guidelines are applied.
        -	Enforced Strictness = 0
        -	// Moderate is equivalent to Enforced with some additional normalization: dots are removed, copyright lines too.
        -	Moderate Strictness = 1
        -	// Relaxed is the most powerful normalization, Moderate + Unicode normalization and all non-alphanumeric chars removed.
        -	Relaxed Strictness = 2
        -)
        -
        -// LicenseText makes a license text ready for analysis.
        -// It follows SPDX guidelines at
        -// https://spdx.org/spdx-license-list/matching-guidelines
        -func LicenseText(text string, strictness Strictness) string {
        -	// Line endings
        -	text = lineEndingsRe.ReplaceAllString(text, "\n")
        -
        -	// 4. Capitalization
        -	text = strings.ToLower(text)
        -
        -	// 3. Whitespace
        -	text = whitespaceRe.ReplaceAllString(text, " ")
        -	text = trailingWhitespaceRe.ReplaceAllString(text, "")
        -	text = licenseHeaderRe.ReplaceAllString(text, "$1\nthisislikelyalicenseheaderplaceholder\n")
        -	text = leadingWhitespaceRe.ReplaceAllString(text, "")
        -
        -	// 5. Punctuation
        -	text = punctuationRe.ReplaceAllString(text, "-")
        -	text = quotesRe.ReplaceAllString(text, "\"")
        -
        -	// 7. Bullets and Numbering
        -	text = bulletRe.ReplaceAllString(text, "")
        -
        -	// 8. Varietal Word Spelling
        -	text = wordReplacer.Replace(text)
        -
        -	// 9. Copyright Symbol
        -	text = copyrightRe.ReplaceAllString(text, "©")
        -	text = trademarkRe.ReplaceAllString(text, "™")
        -
        -	// fix broken URLs in SPDX source texts
        -	text = brokenLinkRe.ReplaceAllString(text, "https://")
        -
        -	// fix URLs in <> - erase the decoration
        -	text = urlCleanupRe.ReplaceAllString(text, "$1")
        -
        -	// collapse several non-alphanumeric characters
        -	{
        -		buffer := &bytes.Buffer{}
        -		back := '\x00'
        -		for _, char := range text {
        -			if !unicode.IsLetter(char) && !unicode.IsDigit(char) && back == char {
        -				continue
        -			}
        -			back = char
        -			buffer.WriteRune(char)
        -		}
        -		text = buffer.String()
        -	}
        -
        -	if strictness > Enforced {
        -		// there are common mismatches because of trailing dots
        -		text = strings.Replace(text, ".", "", -1)
        -		// usually copyright lines are custom and occur multiple times
        -		text = copyrightLineRe.ReplaceAllString(text, "")
        -	}
        -
        -	if strictness > Moderate {
        -		return Relax(text)
        -	}
        -
        -	text = leadingWhitespaceRe.ReplaceAllString(text, "")
        -	text = strings.Replace(text, "thisislikelyalicenseheaderplaceholder", "", -1)
        -
        -	return text
        -}
        -
        -// Relax applies very aggressive normalization rules to text.
        -func Relax(text string) string {
        -	buffer := &bytes.Buffer{}
        -	writer := transform.NewWriter(
        -		buffer, transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC))
        -	writer.Write([]byte(text))
        -	writer.Close()
        -	text = buffer.String()
        -	text = nonAlphaNumRe.ReplaceAllString(text, "")
        -	text = leadingWhitespaceRe.ReplaceAllString(text, "")
        -	text = strings.Replace(text, "  ", " ", -1)
        -	return text
        -}
        -
        -// Split applies heuristics to split the text into several parts
        -func Split(text string) []string {
        -	result := []string{text}
        -
        -	// Always add the full text
        -	splitted := splitRe.Split(text, -1)
        -	if len(splitted) > 1 {
        -		result = append(result, splitted...)
        -	}
        -	return result
        -}
        diff --git a/vendor/gopkg.in/src-d/go-siva.v1/.gitignore b/vendor/gopkg.in/src-d/go-siva.v1/.gitignore
        deleted file mode 100644
        index 1dd224828..000000000
        --- a/vendor/gopkg.in/src-d/go-siva.v1/.gitignore
        +++ /dev/null
        @@ -1,25 +0,0 @@
        -# Compiled Object files, Static and Dynamic libs (Shared Objects)
        -*.o
        -*.a
        -*.so
        -
        -# Folders
        -_obj
        -_test
        -.docsrv-resources
        -
        -# Architecture specific extensions/prefixes
        -*.[568vq]
        -[568vq].out
        -
        -*.cgo1.go
        -*.cgo2.c
        -_cgo_defun.c
        -_cgo_gotypes.go
        -_cgo_export.*
        -
        -_testmain.go
        -
        -*.exe
        -*.test
        -*.prof
        diff --git a/vendor/gopkg.in/src-d/go-siva.v1/.travis.yml b/vendor/gopkg.in/src-d/go-siva.v1/.travis.yml
        deleted file mode 100644
        index b630b6c9e..000000000
        --- a/vendor/gopkg.in/src-d/go-siva.v1/.travis.yml
        +++ /dev/null
        @@ -1,26 +0,0 @@
        -language: go
        -
        -go_import_path: gopkg.in/src-d/go-siva.v1
        -
        -go:
        -  - 1.10.x
        -  - 1.11.x
        -
        -install:
        -  - make dependencies
        -
        -script:
        -  - make test-coverage
        -
        -before_deploy:
        -  - make packages
        -
        -deploy:
        -  provider: releases
        -  api_key: $GITHUB_TOKEN
        -  file_glob: true
        -  file: build/*.tar.gz
        -  skip_cleanup: true
        -  on:
        -    tags: true
        -
        diff --git a/vendor/gopkg.in/src-d/go-siva.v1/LICENSE b/vendor/gopkg.in/src-d/go-siva.v1/LICENSE
        deleted file mode 100644
        index c4e42cf9d..000000000
        --- a/vendor/gopkg.in/src-d/go-siva.v1/LICENSE
        +++ /dev/null
        @@ -1,21 +0,0 @@
        -MIT License
        -
        -Copyright (c) 2016 source{d}
        -
        -Permission is hereby granted, free of charge, to any person obtaining a copy
        -of this software and associated documentation files (the "Software"), to deal
        -in the Software without restriction, including without limitation the rights
        -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
        -copies of the Software, and to permit persons to whom the Software is
        -furnished to do so, subject to the following conditions:
        -
        -The above copyright notice and this permission notice shall be included in all
        -copies or substantial portions of the Software.
        -
        -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        -SOFTWARE.
        diff --git a/vendor/gopkg.in/src-d/go-siva.v1/MAINTAINERS b/vendor/gopkg.in/src-d/go-siva.v1/MAINTAINERS
        deleted file mode 100644
        index 8dbba477d..000000000
        --- a/vendor/gopkg.in/src-d/go-siva.v1/MAINTAINERS
        +++ /dev/null
        @@ -1 +0,0 @@
        -Máximo Cuadros  (@mcuadros)
        diff --git a/vendor/gopkg.in/src-d/go-siva.v1/Makefile b/vendor/gopkg.in/src-d/go-siva.v1/Makefile
        deleted file mode 100644
        index 5cb1000e7..000000000
        --- a/vendor/gopkg.in/src-d/go-siva.v1/Makefile
        +++ /dev/null
        @@ -1,23 +0,0 @@
        -# Docsrv: configure the languages whose api-doc can be auto generated
        -LANGUAGES = "go"
        -# Docs: do not edit this
        -DOCS_REPOSITORY := https://github.com/src-d/docs
        -SHARED_PATH ?= $(shell pwd)/.docsrv-resources
        -DOCS_PATH ?= $(SHARED_PATH)/.docs
        -$(DOCS_PATH)/Makefile.inc:
        -	git clone --quiet --depth 1 $(DOCS_REPOSITORY) $(DOCS_PATH);
        --include $(DOCS_PATH)/Makefile.inc
        -
        -# Package configuration
        -PROJECT = siva
        -COMMANDS = cmd/siva
        -
        -# Including ci Makefile
        -MAKEFILE = Makefile.main
        -CI_REPOSITORY = https://github.com/src-d/ci.git
        -CI_FOLDER = .ci
        -$(MAKEFILE):
        -	@git clone --quiet $(CI_REPOSITORY) $(CI_FOLDER); \
        -	cp $(CI_FOLDER)/$(MAKEFILE) .;
        --include $(MAKEFILE)
        -
        diff --git a/vendor/gopkg.in/src-d/go-siva.v1/README.md b/vendor/gopkg.in/src-d/go-siva.v1/README.md
        deleted file mode 100644
        index 503958a54..000000000
        --- a/vendor/gopkg.in/src-d/go-siva.v1/README.md
        +++ /dev/null
        @@ -1,122 +0,0 @@
        -# siva format [![GoDoc](https://godoc.org/gopkg.in/src-d/go-siva.v1?status.svg)](https://godoc.org/gopkg.in/src-d/go-siva.v1) [![Build Status](https://travis-ci.org/src-d/go-siva.svg?branch=master)](https://travis-ci.org/src-d/go-siva) [![Build status](https://ci.appveyor.com/api/projects/status/github/src-d/go-siva?branch=master&svg=true)](https://ci.appveyor.com/project/mcuadros/go-siva) [![codebeat badge](https://codebeat.co/badges/a821494a-ff72-4756-9a70-652436e93485)](https://codebeat.co/projects/github-com-src-d-go-siva)
        -
        -_siva_ stand for seekable indexed verifiable archiver
        -
        -_siva_ is archive format very similar to tar or zip, focused on allowing: constant-time random file access, seekable access to the contained files and concatenable archive files
        -
        -![siva](https://cloud.githubusercontent.com/assets/1573114/19213424/8a97b7ee-8d6c-11e6-9c84-ddb58862dd94.png)
        -
        -The library implements a very similar API to the go [tar package](https://golang.org/pkg/archive/tar/), allowing full control over and low level access to the contained files.
        -
        -- [Library reference](http://godoc.org/gopkg.in/src-d/go-siva.v1)
        -- [Command-line interface](#cli)
        -- [Format specification](https://github.com/src-d/go-siva/blob/master/SPEC.md)
        -
        -
        -Installation
        -------------
        -
        -The recommended way to install siva
        -
        -```
        -go get -u gopkg.in/src-d/go-siva.v1/...
        -```
        -
        -Example
        --------
        -
        -Creating a siva file:
        -
        -```go
        -// Create a buffer to write our archive to.
        -buf := new(bytes.Buffer)
        -
        -// Create a new siva archive.
        -w := siva.NewWriter(buf)
        -
        -// Add some files to the archive.
        -var files = []struct {
        -    Name, Body string
        -}{
        -    {"readme.txt", "This archive contains some text files."},
        -    {"gopher.txt", "Gopher names:\nGeorge\nGeoffrey\nGonzo"},
        -    {"todo.txt", "Get animal handling license."},
        -}
        -for _, file := range files {
        -    hdr := &siva.Header{
        -        Name:    file.Name,
        -        Mode:    0600,
        -        ModTime: time.Now(),
        -    }
        -    if err := w.WriteHeader(hdr); err != nil {
        -        log.Fatalln(err)
        -    }
        -    if _, err := w.Write([]byte(file.Body)); err != nil {
        -        log.Fatalln(err)
        -    }
        -}
        -// Make sure to check the error on Close.
        -if err := w.Close(); err != nil {
        -    log.Fatalln(err)
        -}
        -```
        -
        -
        -Reading from a siva file:
        -```go
        -// Open the siva archive for reading.
        -file := bytes.NewReader(buf.Bytes())
        -r := siva.NewReader(file)
        -
        -// Get all the files in the siva file.
        -i, err := r.Index()
        -if err != nil {
        -    log.Fatalln(err)
        -}
        -
        -// Iterate through the files in the archive.
        -for _, e := range i {
        -    content, err := r.Get(e)
        -    if err != nil {
        -        log.Fatalln(err)
        -    }
        -    fmt.Printf("Contents of %s:\n", e.Name)
        -    if _, err := io.Copy(os.Stdout, content); err != nil {
        -        log.Fatalln(err)
        -    }
        -    fmt.Println()
        -}
        -```
        -
        -
        -Command-line interface
        -----------------------
        -siva cli interface, is a convenient command that helps you to creates and manipulates siva files.
        -
        -Output from: `./siva --help`:
        -
        -```
        -Usage:
        -  siva [OPTIONS] 
        -
        -Help Options:
        -  -h, --help  Show this help message
        -
        -Available commands:
        -  list     List the items contained on a file.
        -  pack     Create a new archive containing the specified items.
        -  unpack   Extract to disk from the archive.
        -  version  Show the version information.
        -```
        -
        -Other comments
        ------------------------
        -
        -- The `Index Signature` is specified as a sequence of 3 bytes. Go uses byte as an alias for uint8.
        -- `File Mode` in an `Index entry`, see [issue](https://github.com/src-d/go-siva/issues/11).
        -- This implementation left in the client of the library side the task of check the integrity of the file contents. It just checks for the `Index` integrity.
        -
        -License
        --------
        -
        -MIT, see [LICENSE](LICENSE)
        diff --git a/vendor/gopkg.in/src-d/go-siva.v1/SPEC.md b/vendor/gopkg.in/src-d/go-siva.v1/SPEC.md
        deleted file mode 100644
        index 3482784b7..000000000
        --- a/vendor/gopkg.in/src-d/go-siva.v1/SPEC.md
        +++ /dev/null
        @@ -1,83 +0,0 @@
        -
        -## Specification
        -
        -This is the specification of the siva format version 1.
        -
        -A siva file is composed of a sequence of one or more blocks. Blocks are just
        -concatenated without any additional delimiter.
        -
        -```
        -block 1
        -...
        -[block n]
        -```
        -
        -### Block
        -
        -Each block has the following structure:
        -
        -```
        -[file content 1]
        -...
        -[file content n]
        -index
        -```
        -
        -The content of each file is concatenated without any delimiter. After the last
        -file content, there is an index of the block.
        -
        -It is possible to have a block with no file contents at all. That is the case
        -for a block that deletes a file. In any case, the index must be present.
        -
        -### Index
        -
        -The index has the following structure:
        -
        -```
        -signature
        -version
        -[index entry 1]
        -...
        -[index entry n]
        -[index footer]
        -```
        -
        -The `signature` field is a sequence of 3 bytes (Go implementation use uint8 for this. Go byte is an alias for uint8 type) with the value `IBA`. If the
        -signature does not match this sequence, it is considered an error.
        -
        -The `version` field is an uint8 with the value `1`. If the version contains an
        -unknown value, the implementation is not expected to be able to read the file
        -at all.
        -
        -Each index entry has the following fields:
        -
        -* Byte length of the entry name (uint32).
        -* Entry name (UTF-8 string).
        -* UNIX mode (uint32) (see Go implementation [issue](https://github.com/src-d/go-siva/issues/11)).
        -* Modification time as UNIX time in nanoseconds (int64).
        -* Offset of the file content, relative to the beginning of the block (uint64).
        -* Size of the file content (uint64).
        -* CRC32 (uint32) (Integrity of the file content this entry point to).
        -* Flags (uint32), supported flags: 0x0 (no flags), 0x1 (deleted).
        -
        -The index footer consists of:
        -
        -* Number of entries in the block (uint32).
        -* Index size in bytes (uint64).
        -* Block sie in bytes (uint64).
        -* CRC32 (uint32) (Integrity of: Signature + Version + Entries).
        -
        -All integers are encoded as big endian.
        -
        -## Limitations
        -
        -The following limits apply to the format as of version 1:
        -
        -* File name length: 232-1 bytes.
        -* Number of blocks: no limit.
        -* Number of entries per block: 232-1
        -* Number of total entries: no limit (reference implementation does not support more than 263-1).
        -* Block index size: 264-1 bytes.
        -* Block size: 264-1 bytes.
        -* File entry size: 264-1 bytes.
        -* Archive file size: no limit.
        diff --git a/vendor/gopkg.in/src-d/go-siva.v1/appveyor.yml b/vendor/gopkg.in/src-d/go-siva.v1/appveyor.yml
        deleted file mode 100644
        index 91515f39f..000000000
        --- a/vendor/gopkg.in/src-d/go-siva.v1/appveyor.yml
        +++ /dev/null
        @@ -1,19 +0,0 @@
        -version: "{build}"
        -platform: x64
        -
        -clone_folder: c:\gopath\src\gopkg.in\src-d\go-siva.v1
        -
        -environment:
        -  GOPATH: c:\gopath
        -
        -matrix:
        -  exclude:
        -    - platform: x86
        -
        -install:
        -  - set PATH=%GOPATH%\bin;c:\go\bin;%PATH%
        -  - go version
        -  - go get -v -t ./...
        -
        -build_script:
        -  - go test -v ./...
        \ No newline at end of file
        diff --git a/vendor/gopkg.in/src-d/go-siva.v1/common.go b/vendor/gopkg.in/src-d/go-siva.v1/common.go
        deleted file mode 100644
        index 9ce4954a6..000000000
        --- a/vendor/gopkg.in/src-d/go-siva.v1/common.go
        +++ /dev/null
        @@ -1,104 +0,0 @@
        -package siva
        -
        -import (
        -	"hash"
        -	"hash/crc32"
        -	"io"
        -	"os"
        -	"time"
        -)
        -
        -type Flag uint32
        -
        -const (
        -	_ Flag = iota // we discard the 0
        -
        -	//FlagDeleted should be used to identify when a file is deleted
        -	FlagDeleted Flag = iota
        -)
        -
        -// Header contains the meta information from a file
        -type Header struct {
        -	// Name is an arbitrary UTF-8 string identifying a file in the archive. Note
        -	// that this might or might not be a POSIX-compliant path.
        -	//
        -	// Security note: Users should be careful when using name as a file path
        -	// (e.g. to extract an archive) since it can contain relative paths and be
        -	// vulnerable to Zip Slip (https://snyk.io/research/zip-slip-vulnerability)
        -	// or other potentially dangerous values such as absolute paths, network
        -	// drive addresses, etc.
        -	Name    string
        -	ModTime time.Time
        -	Mode    os.FileMode
        -	Flags   Flag
        -}
        -
        -type hashedWriter struct {
        -	w io.Writer
        -	h hash.Hash32
        -	c int
        -}
        -
        -func newHashedWriter(w io.Writer) *hashedWriter {
        -	crc := crc32.NewIEEE()
        -
        -	return &hashedWriter{
        -		w: io.MultiWriter(w, crc),
        -		h: crc,
        -	}
        -}
        -
        -func (w *hashedWriter) Write(p []byte) (n int, err error) {
        -	n, err = w.w.Write(p)
        -	w.c += n
        -
        -	return
        -}
        -
        -func (w *hashedWriter) Reset() {
        -	w.h.Reset()
        -	w.c = 0
        -}
        -
        -func (w *hashedWriter) Position() int {
        -	return w.c
        -}
        -
        -func (w *hashedWriter) Checksum() uint32 {
        -	return w.h.Sum32()
        -}
        -
        -type hashedReader struct {
        -	r io.Reader
        -	h hash.Hash32
        -	c int
        -}
        -
        -func newHashedReader(r io.Reader) *hashedReader {
        -	crc := crc32.NewIEEE()
        -
        -	return &hashedReader{
        -		r: io.TeeReader(r, crc),
        -		h: crc,
        -	}
        -}
        -
        -func (r *hashedReader) Read(p []byte) (n int, err error) {
        -	n, err = r.r.Read(p)
        -	r.c += n
        -
        -	return
        -}
        -
        -func (r *hashedReader) Reset() {
        -	r.h.Reset()
        -	r.c = 0
        -}
        -
        -func (r *hashedReader) Position() int {
        -	return r.c
        -}
        -
        -func (r *hashedReader) Checkshum() uint32 {
        -	return r.h.Sum32()
        -}
        diff --git a/vendor/gopkg.in/src-d/go-siva.v1/doc.go b/vendor/gopkg.in/src-d/go-siva.v1/doc.go
        deleted file mode 100644
        index 51e67eb13..000000000
        --- a/vendor/gopkg.in/src-d/go-siva.v1/doc.go
        +++ /dev/null
        @@ -1,38 +0,0 @@
        -package siva // import "gopkg.in/src-d/go-siva.v1"
        -
        -// siva files are n number of blocks with the following format:
        -//
        -// - n number of raw content, without any restriction and without any divider
        -// - 3-byte index header, {'I', 'B,' A'}, the beginning of the index section
        -// - n number of index entries, the index entry looks like:
        -//      4-byte length of the filename
        -//      n-byte filename
        -//      4-byte permission and mode bits
        -//      8-byte mod time in nanoseconds
        -//      8-byte offset to the start of the file content in the current block
        -//      8-byte size of the file
        -//      4-byte CRC32 of file content
        -//      4-byte flags
        -// - x-byte index footer
        -//      4-byte entries count
        -//      8-byte index size
        -//      8-byte block size
        -//      4-byte CRC32 of index header + index entries
        -//
        -//     +------------------+
        -//     | raw file content | ----------+
        -//     +------------------+           |
        -//     |       ...        |           |
        -//     +------------------+           |
        -//     | raw file content |           |
        -//     +------------------+           |
        -//     |   index header   | --+       |
        -//     +------------------+   |       | block
        -//     |   index entry    |   |       |
        -//     +------------------+   |       |
        -//     |       ...        |   | index |
        -//     +------------------+   |       |
        -//     |   index entry    |   |       |
        -//     +------------------+   |       |
        -//     |   index footer   | --+-------+
        -//     +------------------+
        diff --git a/vendor/gopkg.in/src-d/go-siva.v1/index.go b/vendor/gopkg.in/src-d/go-siva.v1/index.go
        deleted file mode 100644
        index 2206092f7..000000000
        --- a/vendor/gopkg.in/src-d/go-siva.v1/index.go
        +++ /dev/null
        @@ -1,541 +0,0 @@
        -package siva
        -
        -import (
        -	"bytes"
        -	"encoding/binary"
        -	"errors"
        -	"fmt"
        -	"io"
        -	"path/filepath"
        -	"sort"
        -	"strings"
        -	"time"
        -)
        -
        -var (
        -	IndexSignature = []byte{'I', 'B', 'A'}
        -
        -	ErrInvalidIndexEntry       = errors.New("invalid index entry")
        -	ErrInvalidSignature        = errors.New("invalid signature")
        -	ErrEmptyIndex              = errors.New("empty index")
        -	ErrUnsupportedIndexVersion = errors.New("unsupported index version")
        -	ErrCRC32Missmatch          = errors.New("crc32 missmatch")
        -)
        -
        -const (
        -	IndexVersion    uint8 = 1
        -	indexFooterSize       = 24
        -)
        -
        -// Index contains all the files on a siva file, including duplicate files or
        -// even does flagged as deleted.
        -type Index []*IndexEntry
        -
        -// ReadFrom reads an Index from a given reader, the position where the current
        -// block ends is required since we are reading the index from the end of the
        -// file
        -func (i *Index) ReadFrom(r io.ReadSeeker, endBlock uint64) error {
        -	if _, err := r.Seek(int64(endBlock)-indexFooterSize, io.SeekStart); err != nil {
        -		return &IndexReadError{err}
        -	}
        -
        -	f, err := i.readFooter(r)
        -	if err != nil {
        -		return &IndexReadError{err}
        -	}
        -
        -	startingPos := int64(f.IndexSize) + indexFooterSize
        -	if _, err := r.Seek(-startingPos, io.SeekCurrent); err != nil {
        -		return &IndexReadError{err}
        -	}
        -
        -	defer sort.Sort(i)
        -	err = i.readIndex(r, f, endBlock)
        -	if err != nil {
        -		return &IndexReadError{err}
        -	}
        -
        -	return nil
        -}
        -
        -func (i *Index) readFooter(r io.Reader) (*IndexFooter, error) {
        -	f := &IndexFooter{}
        -	if err := f.ReadFrom(r); err != nil {
        -		return nil, err
        -	}
        -
        -	return f, nil
        -}
        -
        -func (i *Index) readIndex(r io.Reader, f *IndexFooter, endBlock uint64) error {
        -	hr := newHashedReader(r)
        -
        -	if err := i.readSignature(hr); err != nil {
        -		return err
        -	}
        -
        -	if err := i.readEntries(hr, f, endBlock); err != nil {
        -		return err
        -	}
        -
        -	if f.CRC32 != hr.Checkshum() {
        -		return ErrCRC32Missmatch
        -	}
        -
        -	return nil
        -}
        -
        -func (i *Index) readSignature(r io.Reader) error {
        -	sig := make([]byte, 3)
        -	if _, err := r.Read(sig); err != nil {
        -		return err
        -	}
        -
        -	if !bytes.Equal(sig, IndexSignature) {
        -		return ErrInvalidSignature
        -	}
        -
        -	var version uint8
        -	if err := binary.Read(r, binary.BigEndian, &version); err != nil {
        -		return err
        -	}
        -
        -	if version != IndexVersion {
        -		return ErrUnsupportedIndexVersion
        -	}
        -
        -	return nil
        -}
        -
        -func (i *Index) readEntries(r io.Reader, f *IndexFooter, endBlock uint64) error {
        -	for j := 0; j < int(f.EntryCount); j++ {
        -
        -		e := &IndexEntry{}
        -		if err := e.ReadFrom(r); err != nil {
        -			return err
        -		}
        -
        -		e.absStart = (endBlock - f.BlockSize) + e.Start
        -		*i = append(*i, e)
        -	}
        -
        -	return nil
        -}
        -
        -// WriteTo writes the Index to a io.Writer
        -func (i *Index) WriteTo(w io.Writer) error {
        -	if len(*i) == 0 {
        -		return ErrEmptyIndex
        -	}
        -
        -	hw := newHashedWriter(w)
        -
        -	f := &IndexFooter{
        -		EntryCount: uint32(len(*i)),
        -	}
        -
        -	if _, err := hw.Write(IndexSignature); err != nil {
        -		return &IndexWriteError{err}
        -	}
        -
        -	if err := binary.Write(hw, binary.BigEndian, IndexVersion); err != nil {
        -		return &IndexWriteError{err}
        -	}
        -
        -	var blockSize uint64
        -	for _, e := range *i {
        -		blockSize += e.Size
        -		if err := e.WriteTo(hw); err != nil {
        -			return &IndexWriteError{err}
        -		}
        -	}
        -
        -	f.IndexSize = uint64(hw.Position())
        -	f.BlockSize = blockSize + f.IndexSize + indexFooterSize
        -	f.CRC32 = hw.Checksum()
        -
        -	if err := f.WriteTo(hw); err != nil {
        -		return &IndexWriteError{err}
        -	}
        -
        -	return nil
        -}
        -
        -// Len implements sort.Interface.
        -func (s Index) Len() int { return len(s) }
        -
        -// Swap implements sort.Interface.
        -func (s Index) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
        -
        -// Less implements sort.Interface.
        -func (s Index) Less(i, j int) bool { return s[i].absStart < s[j].absStart }
        -
        -// Filter returns a filtered version of the current Index removing duplicates
        -// keeping the latest versions and filtering all the deleted files
        -func (i *Index) Filter() Index {
        -	index := i.filter()
        -	sort.Sort(index)
        -
        -	return index
        -}
        -
        -func (i *Index) filter() Index {
        -	var f Index
        -
        -	seen := make(map[string]bool)
        -	for j := len(*i) - 1; j >= 0; j-- {
        -		e := (*i)[j]
        -
        -		if _, ok := seen[e.Name]; ok {
        -			continue
        -		}
        -
        -		seen[e.Name] = true
        -		if e.Flags&FlagDeleted != 0 {
        -			continue
        -		}
        -
        -		f = append(f, e)
        -	}
        -
        -	return f
        -}
        -
        -// ToSafePaths creates a new index where all entry names are transformed to safe
        -// paths using the top-level `ToSafePath` function. If you are using siva to
        -// extract files to the file-system, you should either use this function or
        -// perform your own validation and normalization.
        -func (i *Index) ToSafePaths() Index {
        -	f := make(Index, len(*i))
        -
        -	for idx, e := range *i {
        -		e = &*e
        -		e.Name = ToSafePath(e.Name)
        -		f[idx] = e
        -	}
        -
        -	return f
        -}
        -
        -// Find returns the first IndexEntry with the given name, if any
        -func (i Index) Find(name string) *IndexEntry {
        -	for _, e := range i {
        -		if e.Name == name {
        -			return e
        -		}
        -	}
        -
        -	return nil
        -}
        -
        -// Glob returns all index entries whose name matches pattern or nil if there is
        -// no matching entry. The syntax of patterns is the same as in filepath.Match.
        -func (i Index) Glob(pattern string) ([]*IndexEntry, error) {
        -	matches := []*IndexEntry{}
        -	for _, e := range i {
        -		m, err := filepath.Match(pattern, e.Name)
        -		if err != nil {
        -			return nil, err
        -		}
        -
        -		if m {
        -			matches = append(matches, e)
        -		}
        -	}
        -
        -	return matches, nil
        -}
        -
        -// OrderedIndex is a specialized index lexicographically ordered. It has
        -// methods to add or delete IndexEntries and maintain its order. Also has
        -// as faster Find method.
        -type OrderedIndex Index
        -
        -// Pos gets the position of the file in the index or where it should be
        -// inserted if it's not already there.
        -func (o OrderedIndex) Pos(path string) int {
        -	if len(o) == 0 {
        -		return 0
        -	}
        -
        -	pos := sort.Search(len(o), func(i int) bool {
        -		return o[i].Name >= path
        -	})
        -
        -	return pos
        -}
        -
        -// Update adds or deletes an IndexEntry to the index depending on the
        -// FlagDeleted value.
        -func (o OrderedIndex) Update(e *IndexEntry) OrderedIndex {
        -	if e == nil {
        -		return o
        -	}
        -
        -	if e.Flags&FlagDeleted == 0 {
        -		return o.Add(e)
        -	}
        -
        -	return o.Delete(e.Name)
        -}
        -
        -// Add returns an updated index with the new IndexEntry.
        -func (o OrderedIndex) Add(e *IndexEntry) OrderedIndex {
        -	if e == nil {
        -		return o
        -	}
        -
        -	if len(o) == 0 {
        -		return OrderedIndex{e}
        -	}
        -
        -	path := e.Name
        -	pos := o.Pos(path)
        -	if pos < len(o) && o[pos].Name == path {
        -		o[pos] = e
        -		return o
        -	}
        -
        -	if pos == len(o) {
        -		return append(o, e)
        -	}
        -
        -	return append(o[:pos], append(Index{e}, o[pos:]...)...)
        -}
        -
        -// Delete returns an updated index with the IndexEntry for the path deleted.
        -func (o OrderedIndex) Delete(path string) OrderedIndex {
        -	if len(o) == 0 {
        -		return o
        -	}
        -
        -	pos := o.Pos(path)
        -	if pos < len(o) && o[pos].Name != path {
        -		return o
        -	}
        -
        -	return append(o[:pos], o[pos+1:]...)
        -}
        -
        -// Find returns the IndexEntry for a path or nil. This version is faster than
        -// Index.Find.
        -func (o OrderedIndex) Find(path string) *IndexEntry {
        -	if len(o) == 0 {
        -		return nil
        -	}
        -
        -	pos := o.Pos(path)
        -	if pos >= 0 && pos < len(o) && o[pos].Name == path {
        -		return o[pos]
        -	}
        -
        -	return nil
        -}
        -
        -// Sort orders the index lexicographically.
        -func (o OrderedIndex) Sort() {
        -	sort.Sort(o)
        -}
        -
        -// Len implements sort.Interface.
        -func (s OrderedIndex) Len() int { return len(s) }
        -
        -// Swap implements sort.Interface.
        -func (s OrderedIndex) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
        -
        -// Less implements sort.Interface.
        -func (s OrderedIndex) Less(i, j int) bool { return s[i].Name < s[j].Name }
        -
        -type IndexEntry struct {
        -	Header
        -	Start uint64
        -	Size  uint64
        -	CRC32 uint32
        -
        -	// absStart stores the  absolute starting position of the entry in the file
        -	// across all the blocks in the file, is calculate on-the-fly, so that's
        -	// why is not stored
        -	absStart uint64
        -}
        -
        -// WriteTo writes the IndexEntry to an io.Writer
        -func (e *IndexEntry) WriteTo(w io.Writer) error {
        -	if e.Name == "" {
        -		return ErrInvalidIndexEntry
        -	}
        -
        -	name := []byte(e.Name)
        -	length := uint32(len(name))
        -	if err := binary.Write(w, binary.BigEndian, length); err != nil {
        -		return err
        -	}
        -
        -	if _, err := w.Write(name); err != nil {
        -		return err
        -	}
        -
        -	return writeBinary(w, []interface{}{
        -		e.Mode,
        -		e.ModTime.UnixNano(),
        -		e.Start,
        -		e.Size,
        -		e.CRC32,
        -		e.Flags,
        -	})
        -}
        -
        -// ReadFrom reads a IndexEntry entry from an io.Reader
        -func (e *IndexEntry) ReadFrom(r io.Reader) error {
        -	var length uint32
        -	if err := binary.Read(r, binary.BigEndian, &length); err != nil {
        -		return err
        -	}
        -
        -	filename := make([]byte, length)
        -	if _, err := r.Read(filename); err != nil {
        -		return err
        -	}
        -
        -	var nsec int64
        -	err := readBinary(r, []interface{}{
        -		&e.Mode,
        -		&nsec,
        -		&e.Start,
        -		&e.Size,
        -		&e.CRC32,
        -		&e.Flags,
        -	})
        -
        -	e.Name = string(filename)
        -	e.ModTime = time.Unix(0, nsec)
        -	return err
        -}
        -
        -type IndexFooter struct {
        -	EntryCount uint32
        -	IndexSize  uint64
        -	BlockSize  uint64
        -	CRC32      uint32
        -}
        -
        -// ReadFrom reads a IndexFooter entry from an io.Reader
        -func (f *IndexFooter) ReadFrom(r io.Reader) error {
        -	return readBinary(r, []interface{}{
        -		&f.EntryCount,
        -		&f.IndexSize,
        -		&f.BlockSize,
        -		&f.CRC32,
        -	})
        -}
        -
        -// WriteTo writes the IndexFooter to an io.Writer
        -func (f *IndexFooter) WriteTo(w io.Writer) error {
        -	return writeBinary(w, []interface{}{
        -		f.EntryCount,
        -		f.IndexSize,
        -		f.BlockSize,
        -		f.CRC32,
        -	})
        -}
        -
        -func writeBinary(w io.Writer, data []interface{}) error {
        -	for _, v := range data {
        -		err := binary.Write(w, binary.BigEndian, v)
        -		if err != nil {
        -			return err
        -		}
        -	}
        -
        -	return nil
        -}
        -
        -func readBinary(r io.Reader, data []interface{}) error {
        -	for _, v := range data {
        -		err := binary.Read(r, binary.BigEndian, v)
        -		if err != nil {
        -			return err
        -		}
        -	}
        -
        -	return nil
        -}
        -
        -func readIndex(r io.ReadSeeker) (Index, error) {
        -	endLastBlock, err := r.Seek(0, io.SeekEnd)
        -	if err != nil {
        -		return nil, err
        -	}
        -
        -	if endLastBlock == 0 {
        -		return nil, ErrEmptyIndex
        -	}
        -
        -	i, err := readIndexAt(r, uint64(endLastBlock))
        -	if err != nil {
        -		return i, err
        -	}
        -
        -	sort.Sort(i)
        -	return i, nil
        -}
        -
        -func readIndexAt(r io.ReadSeeker, offset uint64) (Index, error) {
        -	i := make(Index, 0)
        -	if err := i.ReadFrom(r, offset); err != nil {
        -		return nil, err
        -	}
        -
        -	if len(i) == 0 || i[0].absStart == 0 {
        -		return i, nil
        -	}
        -
        -	previ, err := readIndexAt(r, i[0].absStart)
        -	if err != nil {
        -		return nil, err
        -	}
        -
        -	i = append(i, previ...)
        -	return i, nil
        -}
        -
        -type IndexReadError struct {
        -	Err error
        -}
        -
        -func (e *IndexReadError) Error() string {
        -	return fmt.Sprintf("index read failed: %s", e.Err.Error())
        -}
        -
        -type IndexWriteError struct {
        -	Err error
        -}
        -
        -func (e *IndexWriteError) Error() string {
        -	return fmt.Sprintf("index write failed: %s", e.Err.Error())
        -}
        -
        -// ToSafePath transforms a filesystem path to one that is safe to
        -// use as a relative path on the native filesystem:
        -//
        -// - Removes drive and network share on Windows.
        -// - Does regular clean up (removing `/./` parts).
        -// - Removes any leading `../`.
        -// - Removes leading `/`.
        -//
        -// This is a convenience function to implement siva file extractors that are not
        -// vulnerable to zip slip and similar vulnerabilities. However, for Windows
        -// absolute paths (with drive or network share) it does not give consistent
        -// results across platforms.
        -//
        -// If your application relies on using absolute paths, you should not use this
        -// and you are encouraged to do your own validation and normalization.
        -func ToSafePath(path string) string {
        -	volume := filepath.VolumeName(path)
        -	if volume != "" {
        -		path = strings.Replace(path, volume, "", 1)
        -	}
        -
        -	path = filepath.Join(string(filepath.Separator), path)
        -	path = filepath.ToSlash(path)
        -	return path[1:]
        -}
        diff --git a/vendor/gopkg.in/src-d/go-siva.v1/reader.go b/vendor/gopkg.in/src-d/go-siva.v1/reader.go
        deleted file mode 100644
        index c46a78cd2..000000000
        --- a/vendor/gopkg.in/src-d/go-siva.v1/reader.go
        +++ /dev/null
        @@ -1,91 +0,0 @@
        -package siva
        -
        -import (
        -	"errors"
        -	"io"
        -)
        -
        -var (
        -	ErrPendingContent   = errors.New("entry wasn't fully read")
        -	ErrInvalidCheckshum = errors.New("invalid checksum")
        -	ErrInvalidReaderAt  = errors.New("reader provided dosen't implement ReaderAt interface")
        -)
        -
        -// A Reader provides random access to the contents of a siva archive.
        -type Reader interface {
        -	io.Reader
        -	Seek(e *IndexEntry) (int64, error)
        -	Index() (Index, error)
        -	Get(e *IndexEntry) (*io.SectionReader, error)
        -}
        -
        -type reader struct {
        -	r io.ReadSeeker
        -
        -	getIndexFunc func() (Index, error)
        -	current      *IndexEntry
        -	pending      uint64
        -}
        -
        -// NewReader creates a new Reader reading from r, reader requires be seekable
        -// and optionally should implement io.ReaderAt to make usage of the Get method
        -func NewReader(r io.ReadSeeker) Reader {
        -	return &reader{r: r}
        -}
        -
        -func newReaderWithIndex(r io.ReadSeeker, getIndexFunc func() (Index, error)) *reader {
        -	return &reader{
        -		r:            r,
        -		getIndexFunc: getIndexFunc,
        -	}
        -}
        -
        -// Index reads the index of the siva file from the provided reader
        -func (r *reader) Index() (Index, error) {
        -	if r.getIndexFunc != nil {
        -		return r.getIndexFunc()
        -	}
        -
        -	return readIndex(r.r)
        -}
        -
        -// Get returns a new io.SectionReader allowing concurrent read access to the
        -// content of the read
        -func (r *reader) Get(e *IndexEntry) (*io.SectionReader, error) {
        -	ra, ok := r.r.(io.ReaderAt)
        -	if !ok {
        -		return nil, ErrInvalidReaderAt
        -	}
        -
        -	return io.NewSectionReader(ra, int64(e.absStart), int64(e.Size)), nil
        -}
        -
        -// Seek seek the internal reader to the starting position of the content for the
        -// given IndexEntry
        -func (r *reader) Seek(e *IndexEntry) (int64, error) {
        -	r.current = e
        -	r.pending = e.Size
        -
        -	return r.r.Seek(int64(e.absStart), io.SeekStart)
        -}
        -
        -// Read reads up to len(p) bytes, starting at the current position set by Seek
        -// and ending in the end of the content, retuning a io.EOF when its reached
        -func (r *reader) Read(p []byte) (n int, err error) {
        -	if r.pending == 0 {
        -		return 0, io.EOF
        -	}
        -
        -	if uint64(len(p)) > r.pending {
        -		p = p[0:r.pending]
        -	}
        -
        -	n, err = r.r.Read(p)
        -	r.pending -= uint64(n)
        -
        -	if err == io.EOF && r.pending > 0 {
        -		err = io.ErrUnexpectedEOF
        -	}
        -
        -	return
        -}
        diff --git a/vendor/gopkg.in/src-d/go-siva.v1/readwriter.go b/vendor/gopkg.in/src-d/go-siva.v1/readwriter.go
        deleted file mode 100644
        index f872b98b8..000000000
        --- a/vendor/gopkg.in/src-d/go-siva.v1/readwriter.go
        +++ /dev/null
        @@ -1,42 +0,0 @@
        -package siva
        -
        -import "io"
        -
        -//ReadWriter can read and write to the same siva file.
        -//It is not thread-safe.
        -type ReadWriter struct {
        -	*reader
        -	*writer
        -}
        -
        -func NewReaderWriter(rw io.ReadWriteSeeker) (*ReadWriter, error) {
        -	_, ok := rw.(io.ReaderAt)
        -	if !ok {
        -		return nil, ErrInvalidReaderAt
        -	}
        -
        -	i, err := readIndex(rw)
        -	if err != nil && err != ErrEmptyIndex {
        -		return nil, err
        -	}
        -
        -	end, err := rw.Seek(0, io.SeekEnd)
        -	if err != nil {
        -		return nil, err
        -	}
        -
        -	w := newWriter(rw)
        -	w.oIndex = OrderedIndex(i.filter())
        -	w.oIndex.Sort()
        -
        -	getIndexFunc := func() (Index, error) {
        -		for _, e := range w.index {
        -			e.absStart = uint64(end) + e.Start
        -		}
        -
        -		return Index(w.oIndex), nil
        -	}
        -
        -	r := newReaderWithIndex(rw, getIndexFunc)
        -	return &ReadWriter{r, w}, nil
        -}
        diff --git a/vendor/gopkg.in/src-d/go-siva.v1/writer.go b/vendor/gopkg.in/src-d/go-siva.v1/writer.go
        deleted file mode 100644
        index abfa1c8c6..000000000
        --- a/vendor/gopkg.in/src-d/go-siva.v1/writer.go
        +++ /dev/null
        @@ -1,114 +0,0 @@
        -package siva
        -
        -import (
        -	"errors"
        -	"io"
        -)
        -
        -var (
        -	ErrMissingHeader = errors.New("WriteHeader was not called, or already flushed")
        -	ErrClosedWriter  = errors.New("Writer is closed")
        -)
        -
        -// A Writer provides sequential writing of a siva archive
        -type Writer interface {
        -	io.Writer
        -	io.Closer
        -	WriteHeader(h *Header) error
        -	Flush() error
        -}
        -
        -type writer struct {
        -	w        *hashedWriter
        -	index    Index
        -	oIndex   OrderedIndex
        -	current  *IndexEntry
        -	position uint64
        -	closed   bool
        -}
        -
        -// NewWriter creates a new Writer writing to w.
        -func NewWriter(w io.Writer) Writer {
        -	return newWriter(w)
        -}
        -
        -func newWriter(w io.Writer) *writer {
        -	return &writer{
        -		w: newHashedWriter(w),
        -	}
        -}
        -
        -// WriteHeader writes hdr and prepares to accept the file's contents.
        -func (w *writer) WriteHeader(h *Header) error {
        -	if err := w.flushIfPending(); err != nil {
        -		return err
        -	}
        -
        -	w.current = &IndexEntry{
        -		Header: (*h),
        -		Start:  w.position,
        -	}
        -
        -	w.index = append(w.index, w.current)
        -	w.oIndex = w.oIndex.Update(w.current)
        -
        -	return nil
        -}
        -
        -// Write writes to the current entry in the siva archive, WriteHeader should
        -// called before, if not returns ErrMissingHeader
        -func (w *writer) Write(b []byte) (int, error) {
        -	if w.current == nil {
        -		return 0, ErrMissingHeader
        -	}
        -
        -	n, err := w.w.Write(b)
        -	w.position += uint64(n)
        -
        -	return n, err
        -}
        -
        -// Flush finishes writing the current file (optional)
        -func (w *writer) Flush() error {
        -	if w.closed {
        -		return ErrClosedWriter
        -	}
        -
        -	if w.current == nil {
        -		return ErrMissingHeader
        -	}
        -
        -	w.current.Size = w.position - w.current.Start
        -	w.current.CRC32 = w.w.Checksum()
        -	w.w.Reset()
        -
        -	return nil
        -}
        -
        -func (w *writer) flushIfPending() error {
        -	if w.closed {
        -		return ErrClosedWriter
        -	}
        -
        -	if w.current == nil {
        -		return nil
        -	}
        -
        -	return w.Flush()
        -}
        -
        -// Close closes the siva archive, writing the Index footer to the current writer.
        -func (w *writer) Close() error {
        -	defer func() { w.closed = true }()
        -
        -	if err := w.flushIfPending(); err != nil {
        -		return err
        -	}
        -
        -	err := w.index.WriteTo(w.w)
        -	if err == ErrEmptyIndex {
        -		return nil
        -	}
        -
        -	return err
        -}
        diff --git a/vendor/gopkg.in/tomb.v1/LICENSE b/vendor/gopkg.in/tomb.v1/LICENSE
        deleted file mode 100644
        index a4249bb31..000000000
        --- a/vendor/gopkg.in/tomb.v1/LICENSE
        +++ /dev/null
        @@ -1,29 +0,0 @@
        -tomb - support for clean goroutine termination in Go.
        -
        -Copyright (c) 2010-2011 - Gustavo Niemeyer 
        -
        -All rights reserved.
        -
        -Redistribution and use in source and binary forms, with or without
        -modification, are permitted provided that the following conditions are met:
        -
        -    * Redistributions of source code must retain the above copyright notice,
        -      this list of conditions and the following disclaimer.
        -    * Redistributions in binary form must reproduce the above copyright notice,
        -      this list of conditions and the following disclaimer in the documentation
        -      and/or other materials provided with the distribution.
        -    * Neither the name of the copyright holder nor the names of its
        -      contributors may be used to endorse or promote products derived from
        -      this software without specific prior written permission.
        -
        -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
        -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
        -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
        -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
        -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
        -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
        -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
        -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
        -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
        -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
        -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        diff --git a/vendor/gopkg.in/tomb.v1/README.md b/vendor/gopkg.in/tomb.v1/README.md
        deleted file mode 100644
        index 3ae8788e8..000000000
        --- a/vendor/gopkg.in/tomb.v1/README.md
        +++ /dev/null
        @@ -1,4 +0,0 @@
        -Installation and usage
        -----------------------
        -
        -See [gopkg.in/tomb.v1](https://gopkg.in/tomb.v1) for documentation and usage details.
        diff --git a/vendor/gopkg.in/tomb.v1/tomb.go b/vendor/gopkg.in/tomb.v1/tomb.go
        deleted file mode 100644
        index 9aec56d82..000000000
        --- a/vendor/gopkg.in/tomb.v1/tomb.go
        +++ /dev/null
        @@ -1,176 +0,0 @@
        -// Copyright (c) 2011 - Gustavo Niemeyer 
        -// 
        -// All rights reserved.
        -// 
        -// Redistribution and use in source and binary forms, with or without
        -// modification, are permitted provided that the following conditions are met:
        -// 
        -//     * Redistributions of source code must retain the above copyright notice,
        -//       this list of conditions and the following disclaimer.
        -//     * Redistributions in binary form must reproduce the above copyright notice,
        -//       this list of conditions and the following disclaimer in the documentation
        -//       and/or other materials provided with the distribution.
        -//     * Neither the name of the copyright holder nor the names of its
        -//       contributors may be used to endorse or promote products derived from
        -//       this software without specific prior written permission.
        -// 
        -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
        -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
        -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
        -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
        -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
        -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
        -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
        -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
        -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
        -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
        -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        -
        -// The tomb package offers a conventional API for clean goroutine termination.
        -//
        -// A Tomb tracks the lifecycle of a goroutine as alive, dying or dead,
        -// and the reason for its death.
        -//
        -// The zero value of a Tomb assumes that a goroutine is about to be
        -// created or already alive. Once Kill or Killf is called with an
        -// argument that informs the reason for death, the goroutine is in
        -// a dying state and is expected to terminate soon. Right before the
        -// goroutine function or method returns, Done must be called to inform
        -// that the goroutine is indeed dead and about to stop running.
        -//
        -// A Tomb exposes Dying and Dead channels. These channels are closed
        -// when the Tomb state changes in the respective way. They enable
        -// explicit blocking until the state changes, and also to selectively
        -// unblock select statements accordingly.
        -//
        -// When the tomb state changes to dying and there's still logic going
        -// on within the goroutine, nested functions and methods may choose to
        -// return ErrDying as their error value, as this error won't alter the
        -// tomb state if provided to the Kill method. This is a convenient way to
        -// follow standard Go practices in the context of a dying tomb.
        -//
        -// For background and a detailed example, see the following blog post:
        -//
        -//   http://blog.labix.org/2011/10/09/death-of-goroutines-under-control
        -//
        -// For a more complex code snippet demonstrating the use of multiple
        -// goroutines with a single Tomb, see:
        -//
        -//   http://play.golang.org/p/Xh7qWsDPZP
        -//
        -package tomb
        -
        -import (
        -	"errors"
        -	"fmt"
        -	"sync"
        -)
        -
        -// A Tomb tracks the lifecycle of a goroutine as alive, dying or dead,
        -// and the reason for its death.
        -//
        -// See the package documentation for details.
        -type Tomb struct {
        -	m      sync.Mutex
        -	dying  chan struct{}
        -	dead   chan struct{}
        -	reason error
        -}
        -
        -var (
        -	ErrStillAlive = errors.New("tomb: still alive")
        -	ErrDying = errors.New("tomb: dying")
        -)
        -
        -func (t *Tomb) init() {
        -	t.m.Lock()
        -	if t.dead == nil {
        -		t.dead = make(chan struct{})
        -		t.dying = make(chan struct{})
        -		t.reason = ErrStillAlive
        -	}
        -	t.m.Unlock()
        -}
        -
        -// Dead returns the channel that can be used to wait
        -// until t.Done has been called.
        -func (t *Tomb) Dead() <-chan struct{} {
        -	t.init()
        -	return t.dead
        -}
        -
        -// Dying returns the channel that can be used to wait
        -// until t.Kill or t.Done has been called.
        -func (t *Tomb) Dying() <-chan struct{} {
        -	t.init()
        -	return t.dying
        -}
        -
        -// Wait blocks until the goroutine is in a dead state and returns the
        -// reason for its death.
        -func (t *Tomb) Wait() error {
        -	t.init()
        -	<-t.dead
        -	t.m.Lock()
        -	reason := t.reason
        -	t.m.Unlock()
        -	return reason
        -}
        -
        -// Done flags the goroutine as dead, and should be called a single time
        -// right before the goroutine function or method returns.
        -// If the goroutine was not already in a dying state before Done is
        -// called, it will be flagged as dying and dead at once with no
        -// error.
        -func (t *Tomb) Done() {
        -	t.Kill(nil)
        -	close(t.dead)
        -}
        -
        -// Kill flags the goroutine as dying for the given reason.
        -// Kill may be called multiple times, but only the first
        -// non-nil error is recorded as the reason for termination.
        -//
        -// If reason is ErrDying, the previous reason isn't replaced
        -// even if it is nil. It's a runtime error to call Kill with
        -// ErrDying if t is not in a dying state.
        -func (t *Tomb) Kill(reason error) {
        -	t.init()
        -	t.m.Lock()
        -	defer t.m.Unlock()
        -	if reason == ErrDying {
        -		if t.reason == ErrStillAlive {
        -			panic("tomb: Kill with ErrDying while still alive")
        -		}
        -		return
        -	}
        -	if t.reason == nil || t.reason == ErrStillAlive {
        -		t.reason = reason
        -	}
        -	// If the receive on t.dying succeeds, then
        -	// it can only be because we have already closed it.
        -	// If it blocks, then we know that it needs to be closed.
        -	select {
        -	case <-t.dying:
        -	default:
        -		close(t.dying)
        -	}
        -}
        -
        -// Killf works like Kill, but builds the reason providing the received
        -// arguments to fmt.Errorf. The generated error is also returned.
        -func (t *Tomb) Killf(f string, a ...interface{}) error {
        -	err := fmt.Errorf(f, a...)
        -	t.Kill(err)
        -	return err
        -}
        -
        -// Err returns the reason for the goroutine death provided via Kill
        -// or Killf, or ErrStillAlive when the goroutine is still alive.
        -func (t *Tomb) Err() (reason error) {
        -	t.init()
        -	t.m.Lock()
        -	reason = t.reason
        -	t.m.Unlock()
        -	return
        -}
        diff --git a/vendor/gopkg.in/yaml.v2/.travis.yml b/vendor/gopkg.in/yaml.v2/.travis.yml
        index 9f556934d..055480b9e 100644
        --- a/vendor/gopkg.in/yaml.v2/.travis.yml
        +++ b/vendor/gopkg.in/yaml.v2/.travis.yml
        @@ -1,12 +1,16 @@
         language: go
         
         go:
        -    - 1.4
        -    - 1.5
        -    - 1.6
        -    - 1.7
        -    - 1.8
        -    - 1.9
        -    - tip
        +    - "1.4.x"
        +    - "1.5.x"
        +    - "1.6.x"
        +    - "1.7.x"
        +    - "1.8.x"
        +    - "1.9.x"
        +    - "1.10.x"
        +    - "1.11.x"
        +    - "1.12.x"
        +    - "1.13.x"
        +    - "tip"
         
         go_import_path: gopkg.in/yaml.v2
        diff --git a/vendor/gopkg.in/yaml.v2/apic.go b/vendor/gopkg.in/yaml.v2/apic.go
        index 1f7e87e67..d2c2308f1 100644
        --- a/vendor/gopkg.in/yaml.v2/apic.go
        +++ b/vendor/gopkg.in/yaml.v2/apic.go
        @@ -86,6 +86,7 @@ func yaml_emitter_initialize(emitter *yaml_emitter_t) {
         		raw_buffer: make([]byte, 0, output_raw_buffer_size),
         		states:     make([]yaml_emitter_state_t, 0, initial_stack_size),
         		events:     make([]yaml_event_t, 0, initial_queue_size),
        +		best_width: -1,
         	}
         }
         
        diff --git a/vendor/gopkg.in/yaml.v2/scannerc.go b/vendor/gopkg.in/yaml.v2/scannerc.go
        index 570b8ecd1..0b9bb6030 100644
        --- a/vendor/gopkg.in/yaml.v2/scannerc.go
        +++ b/vendor/gopkg.in/yaml.v2/scannerc.go
        @@ -626,31 +626,18 @@ func trace(args ...interface{}) func() {
         func yaml_parser_fetch_more_tokens(parser *yaml_parser_t) bool {
         	// While we need more tokens to fetch, do it.
         	for {
        -		// Check if we really need to fetch more tokens.
        -		need_more_tokens := false
        -
        -		if parser.tokens_head == len(parser.tokens) {
        -			// Queue is empty.
        -			need_more_tokens = true
        -		} else {
        -			// Check if any potential simple key may occupy the head position.
        -			if !yaml_parser_stale_simple_keys(parser) {
        +		if parser.tokens_head != len(parser.tokens) {
        +			// If queue is non-empty, check if any potential simple key may
        +			// occupy the head position.
        +			head_tok_idx, ok := parser.simple_keys_by_tok[parser.tokens_parsed]
        +			if !ok {
        +				break
        +			} else if valid, ok := yaml_simple_key_is_valid(parser, &parser.simple_keys[head_tok_idx]); !ok {
         				return false
        -			}
        -
        -			for i := range parser.simple_keys {
        -				simple_key := &parser.simple_keys[i]
        -				if simple_key.possible && simple_key.token_number == parser.tokens_parsed {
        -					need_more_tokens = true
        -					break
        -				}
        +			} else if !valid {
        +				break
         			}
         		}
        -
        -		// We are finished.
        -		if !need_more_tokens {
        -			break
        -		}
         		// Fetch the next token.
         		if !yaml_parser_fetch_next_token(parser) {
         			return false
        @@ -678,11 +665,6 @@ func yaml_parser_fetch_next_token(parser *yaml_parser_t) bool {
         		return false
         	}
         
        -	// Remove obsolete potential simple keys.
        -	if !yaml_parser_stale_simple_keys(parser) {
        -		return false
        -	}
        -
         	// Check the indentation level against the current column.
         	if !yaml_parser_unroll_indent(parser, parser.mark.column) {
         		return false
        @@ -837,29 +819,30 @@ func yaml_parser_fetch_next_token(parser *yaml_parser_t) bool {
         		"found character that cannot start any token")
         }
         
        -// Check the list of potential simple keys and remove the positions that
        -// cannot contain simple keys anymore.
        -func yaml_parser_stale_simple_keys(parser *yaml_parser_t) bool {
        -	// Check for a potential simple key for each flow level.
        -	for i := range parser.simple_keys {
        -		simple_key := &parser.simple_keys[i]
        -
        -		// The specification requires that a simple key
        -		//
        -		//  - is limited to a single line,
        -		//  - is shorter than 1024 characters.
        -		if simple_key.possible && (simple_key.mark.line < parser.mark.line || simple_key.mark.index+1024 < parser.mark.index) {
        -
        -			// Check if the potential simple key to be removed is required.
        -			if simple_key.required {
        -				return yaml_parser_set_scanner_error(parser,
        -					"while scanning a simple key", simple_key.mark,
        -					"could not find expected ':'")
        -			}
        -			simple_key.possible = false
        +func yaml_simple_key_is_valid(parser *yaml_parser_t, simple_key *yaml_simple_key_t) (valid, ok bool) {
        +	if !simple_key.possible {
        +		return false, true
        +	}
        +
        +	// The 1.2 specification says:
        +	//
        +	//     "If the ? indicator is omitted, parsing needs to see past the
        +	//     implicit key to recognize it as such. To limit the amount of
        +	//     lookahead required, the “:” indicator must appear at most 1024
        +	//     Unicode characters beyond the start of the key. In addition, the key
        +	//     is restricted to a single line."
        +	//
        +	if simple_key.mark.line < parser.mark.line || simple_key.mark.index+1024 < parser.mark.index {
        +		// Check if the potential simple key to be removed is required.
        +		if simple_key.required {
        +			return false, yaml_parser_set_scanner_error(parser,
        +				"while scanning a simple key", simple_key.mark,
        +				"could not find expected ':'")
         		}
        +		simple_key.possible = false
        +		return false, true
         	}
        -	return true
        +	return true, true
         }
         
         // Check if a simple key may start at the current position and add it if
        @@ -879,13 +862,14 @@ func yaml_parser_save_simple_key(parser *yaml_parser_t) bool {
         			possible:     true,
         			required:     required,
         			token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head),
        +			mark:         parser.mark,
         		}
        -		simple_key.mark = parser.mark
         
         		if !yaml_parser_remove_simple_key(parser) {
         			return false
         		}
         		parser.simple_keys[len(parser.simple_keys)-1] = simple_key
        +		parser.simple_keys_by_tok[simple_key.token_number] = len(parser.simple_keys) - 1
         	}
         	return true
         }
        @@ -900,9 +884,10 @@ func yaml_parser_remove_simple_key(parser *yaml_parser_t) bool {
         				"while scanning a simple key", parser.simple_keys[i].mark,
         				"could not find expected ':'")
         		}
        +		// Remove the key from the stack.
        +		parser.simple_keys[i].possible = false
        +		delete(parser.simple_keys_by_tok, parser.simple_keys[i].token_number)
         	}
        -	// Remove the key from the stack.
        -	parser.simple_keys[i].possible = false
         	return true
         }
         
        @@ -912,7 +897,12 @@ const max_flow_level = 10000
         // Increase the flow level and resize the simple key list if needed.
         func yaml_parser_increase_flow_level(parser *yaml_parser_t) bool {
         	// Reset the simple key on the next level.
        -	parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{})
        +	parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{
        +		possible:     false,
        +		required:     false,
        +		token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head),
        +		mark:         parser.mark,
        +	})
         
         	// Increase the flow level.
         	parser.flow_level++
        @@ -928,7 +918,9 @@ func yaml_parser_increase_flow_level(parser *yaml_parser_t) bool {
         func yaml_parser_decrease_flow_level(parser *yaml_parser_t) bool {
         	if parser.flow_level > 0 {
         		parser.flow_level--
        -		parser.simple_keys = parser.simple_keys[:len(parser.simple_keys)-1]
        +		last := len(parser.simple_keys) - 1
        +		delete(parser.simple_keys_by_tok, parser.simple_keys[last].token_number)
        +		parser.simple_keys = parser.simple_keys[:last]
         	}
         	return true
         }
        @@ -1005,6 +997,8 @@ func yaml_parser_fetch_stream_start(parser *yaml_parser_t) bool {
         	// Initialize the simple key stack.
         	parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{})
         
        +	parser.simple_keys_by_tok = make(map[int]int)
        +
         	// A simple key is allowed at the beginning of the stream.
         	parser.simple_key_allowed = true
         
        @@ -1286,7 +1280,11 @@ func yaml_parser_fetch_value(parser *yaml_parser_t) bool {
         	simple_key := &parser.simple_keys[len(parser.simple_keys)-1]
         
         	// Have we found a simple key?
        -	if simple_key.possible {
        +	if valid, ok := yaml_simple_key_is_valid(parser, simple_key); !ok {
        +		return false
        +
        +	} else if valid {
        +
         		// Create the KEY token and insert it into the queue.
         		token := yaml_token_t{
         			typ:        yaml_KEY_TOKEN,
        @@ -1304,6 +1302,7 @@ func yaml_parser_fetch_value(parser *yaml_parser_t) bool {
         
         		// Remove the simple key.
         		simple_key.possible = false
        +		delete(parser.simple_keys_by_tok, simple_key.token_number)
         
         		// A simple key cannot follow another simple key.
         		parser.simple_key_allowed = false
        diff --git a/vendor/gopkg.in/yaml.v2/yaml.go b/vendor/gopkg.in/yaml.v2/yaml.go
        index de85aa4cd..89650e293 100644
        --- a/vendor/gopkg.in/yaml.v2/yaml.go
        +++ b/vendor/gopkg.in/yaml.v2/yaml.go
        @@ -89,7 +89,7 @@ func UnmarshalStrict(in []byte, out interface{}) (err error) {
         	return unmarshal(in, out, true)
         }
         
        -// A Decorder reads and decodes YAML values from an input stream.
        +// A Decoder reads and decodes YAML values from an input stream.
         type Decoder struct {
         	strict bool
         	parser *parser
        diff --git a/vendor/gopkg.in/yaml.v2/yamlh.go b/vendor/gopkg.in/yaml.v2/yamlh.go
        index e25cee563..f6a9c8e34 100644
        --- a/vendor/gopkg.in/yaml.v2/yamlh.go
        +++ b/vendor/gopkg.in/yaml.v2/yamlh.go
        @@ -579,6 +579,7 @@ type yaml_parser_t struct {
         
         	simple_key_allowed bool                // May a simple key occur at the current position?
         	simple_keys        []yaml_simple_key_t // The stack of simple keys.
        +	simple_keys_by_tok map[int]int         // possible simple_key indexes indexed by token_number
         
         	// Parser stuff
         
        diff --git a/vendor/gopkg.in/yaml.v3/.travis.yml b/vendor/gopkg.in/yaml.v3/.travis.yml
        new file mode 100644
        index 000000000..04d4dae09
        --- /dev/null
        +++ b/vendor/gopkg.in/yaml.v3/.travis.yml
        @@ -0,0 +1,16 @@
        +language: go
        +
        +go:
        +    - "1.4.x"
        +    - "1.5.x"
        +    - "1.6.x"
        +    - "1.7.x"
        +    - "1.8.x"
        +    - "1.9.x"
        +    - "1.10.x"
        +    - "1.11.x"
        +    - "1.12.x"
        +    - "1.13.x"
        +    - "tip"
        +
        +go_import_path: gopkg.in/yaml.v3
        diff --git a/vendor/gopkg.in/yaml.v3/LICENSE b/vendor/gopkg.in/yaml.v3/LICENSE
        new file mode 100644
        index 000000000..2683e4bb1
        --- /dev/null
        +++ b/vendor/gopkg.in/yaml.v3/LICENSE
        @@ -0,0 +1,50 @@
        +
        +This project is covered by two different licenses: MIT and Apache.
        +
        +#### MIT License ####
        +
        +The following files were ported to Go from C files of libyaml, and thus
        +are still covered by their original MIT license, with the additional
        +copyright staring in 2011 when the project was ported over:
        +
        +    apic.go emitterc.go parserc.go readerc.go scannerc.go
        +    writerc.go yamlh.go yamlprivateh.go
        +
        +Copyright (c) 2006-2010 Kirill Simonov
        +Copyright (c) 2006-2011 Kirill Simonov
        +
        +Permission is hereby granted, free of charge, to any person obtaining a copy of
        +this software and associated documentation files (the "Software"), to deal in
        +the Software without restriction, including without limitation the rights to
        +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
        +of the Software, and to permit persons to whom the Software is furnished to do
        +so, subject to the following conditions:
        +
        +The above copyright notice and this permission notice shall be included in all
        +copies or substantial portions of the Software.
        +
        +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        +SOFTWARE.
        +
        +### Apache License ###
        +
        +All the remaining project files are covered by the Apache license:
        +
        +Copyright (c) 2011-2019 Canonical Ltd
        +
        +Licensed under the Apache License, Version 2.0 (the "License");
        +you may not use this file except in compliance with the License.
        +You may obtain a copy of the License at
        +
        +    http://www.apache.org/licenses/LICENSE-2.0
        +
        +Unless required by applicable law or agreed to in writing, software
        +distributed under the License is distributed on an "AS IS" BASIS,
        +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        +See the License for the specific language governing permissions and
        +limitations under the License.
        diff --git a/vendor/gopkg.in/yaml.v3/NOTICE b/vendor/gopkg.in/yaml.v3/NOTICE
        new file mode 100644
        index 000000000..866d74a7a
        --- /dev/null
        +++ b/vendor/gopkg.in/yaml.v3/NOTICE
        @@ -0,0 +1,13 @@
        +Copyright 2011-2016 Canonical Ltd.
        +
        +Licensed under the Apache License, Version 2.0 (the "License");
        +you may not use this file except in compliance with the License.
        +You may obtain a copy of the License at
        +
        +    http://www.apache.org/licenses/LICENSE-2.0
        +
        +Unless required by applicable law or agreed to in writing, software
        +distributed under the License is distributed on an "AS IS" BASIS,
        +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        +See the License for the specific language governing permissions and
        +limitations under the License.
        diff --git a/vendor/gopkg.in/yaml.v3/README.md b/vendor/gopkg.in/yaml.v3/README.md
        new file mode 100644
        index 000000000..08eb1babd
        --- /dev/null
        +++ b/vendor/gopkg.in/yaml.v3/README.md
        @@ -0,0 +1,150 @@
        +# YAML support for the Go language
        +
        +Introduction
        +------------
        +
        +The yaml package enables Go programs to comfortably encode and decode YAML
        +values. It was developed within [Canonical](https://www.canonical.com) as
        +part of the [juju](https://juju.ubuntu.com) project, and is based on a
        +pure Go port of the well-known [libyaml](http://pyyaml.org/wiki/LibYAML)
        +C library to parse and generate YAML data quickly and reliably.
        +
        +Compatibility
        +-------------
        +
        +The yaml package supports most of YAML 1.2, but preserves some behavior
        +from 1.1 for backwards compatibility.
        +
        +Specifically, as of v3 of the yaml package:
        +
        + - YAML 1.1 bools (_yes/no, on/off_) are supported as long as they are being
        +   decoded into a typed bool value. Otherwise they behave as a string. Booleans
        +   in YAML 1.2 are _true/false_ only.
        + - Octals encode and decode as _0777_ per YAML 1.1, rather than _0o777_
        +   as specified in YAML 1.2, because most parsers still use the old format.
        +   Octals in the  _0o777_ format are supported though, so new files work.
        + - Does not support base-60 floats. These are gone from YAML 1.2, and were
        +   actually never supported by this package as it's clearly a poor choice.
        +
        +and offers backwards
        +compatibility with YAML 1.1 in some cases.
        +1.2, including support for
        +anchors, tags, map merging, etc. Multi-document unmarshalling is not yet
        +implemented, and base-60 floats from YAML 1.1 are purposefully not
        +supported since they're a poor design and are gone in YAML 1.2.
        +
        +Installation and usage
        +----------------------
        +
        +The import path for the package is *gopkg.in/yaml.v3*.
        +
        +To install it, run:
        +
        +    go get gopkg.in/yaml.v3
        +
        +API documentation
        +-----------------
        +
        +If opened in a browser, the import path itself leads to the API documentation:
        +
        +  - [https://gopkg.in/yaml.v3](https://gopkg.in/yaml.v3)
        +
        +API stability
        +-------------
        +
        +The package API for yaml v3 will remain stable as described in [gopkg.in](https://gopkg.in).
        +
        +
        +License
        +-------
        +
        +The yaml package is licensed under the MIT and Apache License 2.0 licenses.
        +Please see the LICENSE file for details.
        +
        +
        +Example
        +-------
        +
        +```Go
        +package main
        +
        +import (
        +        "fmt"
        +        "log"
        +
        +        "gopkg.in/yaml.v3"
        +)
        +
        +var data = `
        +a: Easy!
        +b:
        +  c: 2
        +  d: [3, 4]
        +`
        +
        +// Note: struct fields must be public in order for unmarshal to
        +// correctly populate the data.
        +type T struct {
        +        A string
        +        B struct {
        +                RenamedC int   `yaml:"c"`
        +                D        []int `yaml:",flow"`
        +        }
        +}
        +
        +func main() {
        +        t := T{}
        +    
        +        err := yaml.Unmarshal([]byte(data), &t)
        +        if err != nil {
        +                log.Fatalf("error: %v", err)
        +        }
        +        fmt.Printf("--- t:\n%v\n\n", t)
        +    
        +        d, err := yaml.Marshal(&t)
        +        if err != nil {
        +                log.Fatalf("error: %v", err)
        +        }
        +        fmt.Printf("--- t dump:\n%s\n\n", string(d))
        +    
        +        m := make(map[interface{}]interface{})
        +    
        +        err = yaml.Unmarshal([]byte(data), &m)
        +        if err != nil {
        +                log.Fatalf("error: %v", err)
        +        }
        +        fmt.Printf("--- m:\n%v\n\n", m)
        +    
        +        d, err = yaml.Marshal(&m)
        +        if err != nil {
        +                log.Fatalf("error: %v", err)
        +        }
        +        fmt.Printf("--- m dump:\n%s\n\n", string(d))
        +}
        +```
        +
        +This example will generate the following output:
        +
        +```
        +--- t:
        +{Easy! {2 [3 4]}}
        +
        +--- t dump:
        +a: Easy!
        +b:
        +  c: 2
        +  d: [3, 4]
        +
        +
        +--- m:
        +map[a:Easy! b:map[c:2 d:[3 4]]]
        +
        +--- m dump:
        +a: Easy!
        +b:
        +  c: 2
        +  d:
        +  - 3
        +  - 4
        +```
        +
        diff --git a/vendor/gopkg.in/yaml.v3/apic.go b/vendor/gopkg.in/yaml.v3/apic.go
        new file mode 100644
        index 000000000..65846e674
        --- /dev/null
        +++ b/vendor/gopkg.in/yaml.v3/apic.go
        @@ -0,0 +1,746 @@
        +// 
        +// Copyright (c) 2011-2019 Canonical Ltd
        +// Copyright (c) 2006-2010 Kirill Simonov
        +// 
        +// Permission is hereby granted, free of charge, to any person obtaining a copy of
        +// this software and associated documentation files (the "Software"), to deal in
        +// the Software without restriction, including without limitation the rights to
        +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
        +// of the Software, and to permit persons to whom the Software is furnished to do
        +// so, subject to the following conditions:
        +// 
        +// The above copyright notice and this permission notice shall be included in all
        +// copies or substantial portions of the Software.
        +// 
        +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        +// SOFTWARE.
        +
        +package yaml
        +
        +import (
        +	"io"
        +)
        +
        +func yaml_insert_token(parser *yaml_parser_t, pos int, token *yaml_token_t) {
        +	//fmt.Println("yaml_insert_token", "pos:", pos, "typ:", token.typ, "head:", parser.tokens_head, "len:", len(parser.tokens))
        +
        +	// Check if we can move the queue at the beginning of the buffer.
        +	if parser.tokens_head > 0 && len(parser.tokens) == cap(parser.tokens) {
        +		if parser.tokens_head != len(parser.tokens) {
        +			copy(parser.tokens, parser.tokens[parser.tokens_head:])
        +		}
        +		parser.tokens = parser.tokens[:len(parser.tokens)-parser.tokens_head]
        +		parser.tokens_head = 0
        +	}
        +	parser.tokens = append(parser.tokens, *token)
        +	if pos < 0 {
        +		return
        +	}
        +	copy(parser.tokens[parser.tokens_head+pos+1:], parser.tokens[parser.tokens_head+pos:])
        +	parser.tokens[parser.tokens_head+pos] = *token
        +}
        +
        +// Create a new parser object.
        +func yaml_parser_initialize(parser *yaml_parser_t) bool {
        +	*parser = yaml_parser_t{
        +		raw_buffer: make([]byte, 0, input_raw_buffer_size),
        +		buffer:     make([]byte, 0, input_buffer_size),
        +	}
        +	return true
        +}
        +
        +// Destroy a parser object.
        +func yaml_parser_delete(parser *yaml_parser_t) {
        +	*parser = yaml_parser_t{}
        +}
        +
        +// String read handler.
        +func yaml_string_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) {
        +	if parser.input_pos == len(parser.input) {
        +		return 0, io.EOF
        +	}
        +	n = copy(buffer, parser.input[parser.input_pos:])
        +	parser.input_pos += n
        +	return n, nil
        +}
        +
        +// Reader read handler.
        +func yaml_reader_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) {
        +	return parser.input_reader.Read(buffer)
        +}
        +
        +// Set a string input.
        +func yaml_parser_set_input_string(parser *yaml_parser_t, input []byte) {
        +	if parser.read_handler != nil {
        +		panic("must set the input source only once")
        +	}
        +	parser.read_handler = yaml_string_read_handler
        +	parser.input = input
        +	parser.input_pos = 0
        +}
        +
        +// Set a file input.
        +func yaml_parser_set_input_reader(parser *yaml_parser_t, r io.Reader) {
        +	if parser.read_handler != nil {
        +		panic("must set the input source only once")
        +	}
        +	parser.read_handler = yaml_reader_read_handler
        +	parser.input_reader = r
        +}
        +
        +// Set the source encoding.
        +func yaml_parser_set_encoding(parser *yaml_parser_t, encoding yaml_encoding_t) {
        +	if parser.encoding != yaml_ANY_ENCODING {
        +		panic("must set the encoding only once")
        +	}
        +	parser.encoding = encoding
        +}
        +
        +// Create a new emitter object.
        +func yaml_emitter_initialize(emitter *yaml_emitter_t) {
        +	*emitter = yaml_emitter_t{
        +		buffer:     make([]byte, output_buffer_size),
        +		raw_buffer: make([]byte, 0, output_raw_buffer_size),
        +		states:     make([]yaml_emitter_state_t, 0, initial_stack_size),
        +		events:     make([]yaml_event_t, 0, initial_queue_size),
        +	}
        +}
        +
        +// Destroy an emitter object.
        +func yaml_emitter_delete(emitter *yaml_emitter_t) {
        +	*emitter = yaml_emitter_t{}
        +}
        +
        +// String write handler.
        +func yaml_string_write_handler(emitter *yaml_emitter_t, buffer []byte) error {
        +	*emitter.output_buffer = append(*emitter.output_buffer, buffer...)
        +	return nil
        +}
        +
        +// yaml_writer_write_handler uses emitter.output_writer to write the
        +// emitted text.
        +func yaml_writer_write_handler(emitter *yaml_emitter_t, buffer []byte) error {
        +	_, err := emitter.output_writer.Write(buffer)
        +	return err
        +}
        +
        +// Set a string output.
        +func yaml_emitter_set_output_string(emitter *yaml_emitter_t, output_buffer *[]byte) {
        +	if emitter.write_handler != nil {
        +		panic("must set the output target only once")
        +	}
        +	emitter.write_handler = yaml_string_write_handler
        +	emitter.output_buffer = output_buffer
        +}
        +
        +// Set a file output.
        +func yaml_emitter_set_output_writer(emitter *yaml_emitter_t, w io.Writer) {
        +	if emitter.write_handler != nil {
        +		panic("must set the output target only once")
        +	}
        +	emitter.write_handler = yaml_writer_write_handler
        +	emitter.output_writer = w
        +}
        +
        +// Set the output encoding.
        +func yaml_emitter_set_encoding(emitter *yaml_emitter_t, encoding yaml_encoding_t) {
        +	if emitter.encoding != yaml_ANY_ENCODING {
        +		panic("must set the output encoding only once")
        +	}
        +	emitter.encoding = encoding
        +}
        +
        +// Set the canonical output style.
        +func yaml_emitter_set_canonical(emitter *yaml_emitter_t, canonical bool) {
        +	emitter.canonical = canonical
        +}
        +
        +// Set the indentation increment.
        +func yaml_emitter_set_indent(emitter *yaml_emitter_t, indent int) {
        +	if indent < 2 || indent > 9 {
        +		indent = 2
        +	}
        +	emitter.best_indent = indent
        +}
        +
        +// Set the preferred line width.
        +func yaml_emitter_set_width(emitter *yaml_emitter_t, width int) {
        +	if width < 0 {
        +		width = -1
        +	}
        +	emitter.best_width = width
        +}
        +
        +// Set if unescaped non-ASCII characters are allowed.
        +func yaml_emitter_set_unicode(emitter *yaml_emitter_t, unicode bool) {
        +	emitter.unicode = unicode
        +}
        +
        +// Set the preferred line break character.
        +func yaml_emitter_set_break(emitter *yaml_emitter_t, line_break yaml_break_t) {
        +	emitter.line_break = line_break
        +}
        +
        +///*
        +// * Destroy a token object.
        +// */
        +//
        +//YAML_DECLARE(void)
        +//yaml_token_delete(yaml_token_t *token)
        +//{
        +//    assert(token);  // Non-NULL token object expected.
        +//
        +//    switch (token.type)
        +//    {
        +//        case YAML_TAG_DIRECTIVE_TOKEN:
        +//            yaml_free(token.data.tag_directive.handle);
        +//            yaml_free(token.data.tag_directive.prefix);
        +//            break;
        +//
        +//        case YAML_ALIAS_TOKEN:
        +//            yaml_free(token.data.alias.value);
        +//            break;
        +//
        +//        case YAML_ANCHOR_TOKEN:
        +//            yaml_free(token.data.anchor.value);
        +//            break;
        +//
        +//        case YAML_TAG_TOKEN:
        +//            yaml_free(token.data.tag.handle);
        +//            yaml_free(token.data.tag.suffix);
        +//            break;
        +//
        +//        case YAML_SCALAR_TOKEN:
        +//            yaml_free(token.data.scalar.value);
        +//            break;
        +//
        +//        default:
        +//            break;
        +//    }
        +//
        +//    memset(token, 0, sizeof(yaml_token_t));
        +//}
        +//
        +///*
        +// * Check if a string is a valid UTF-8 sequence.
        +// *
        +// * Check 'reader.c' for more details on UTF-8 encoding.
        +// */
        +//
        +//static int
        +//yaml_check_utf8(yaml_char_t *start, size_t length)
        +//{
        +//    yaml_char_t *end = start+length;
        +//    yaml_char_t *pointer = start;
        +//
        +//    while (pointer < end) {
        +//        unsigned char octet;
        +//        unsigned int width;
        +//        unsigned int value;
        +//        size_t k;
        +//
        +//        octet = pointer[0];
        +//        width = (octet & 0x80) == 0x00 ? 1 :
        +//                (octet & 0xE0) == 0xC0 ? 2 :
        +//                (octet & 0xF0) == 0xE0 ? 3 :
        +//                (octet & 0xF8) == 0xF0 ? 4 : 0;
        +//        value = (octet & 0x80) == 0x00 ? octet & 0x7F :
        +//                (octet & 0xE0) == 0xC0 ? octet & 0x1F :
        +//                (octet & 0xF0) == 0xE0 ? octet & 0x0F :
        +//                (octet & 0xF8) == 0xF0 ? octet & 0x07 : 0;
        +//        if (!width) return 0;
        +//        if (pointer+width > end) return 0;
        +//        for (k = 1; k < width; k ++) {
        +//            octet = pointer[k];
        +//            if ((octet & 0xC0) != 0x80) return 0;
        +//            value = (value << 6) + (octet & 0x3F);
        +//        }
        +//        if (!((width == 1) ||
        +//            (width == 2 && value >= 0x80) ||
        +//            (width == 3 && value >= 0x800) ||
        +//            (width == 4 && value >= 0x10000))) return 0;
        +//
        +//        pointer += width;
        +//    }
        +//
        +//    return 1;
        +//}
        +//
        +
        +// Create STREAM-START.
        +func yaml_stream_start_event_initialize(event *yaml_event_t, encoding yaml_encoding_t) {
        +	*event = yaml_event_t{
        +		typ:      yaml_STREAM_START_EVENT,
        +		encoding: encoding,
        +	}
        +}
        +
        +// Create STREAM-END.
        +func yaml_stream_end_event_initialize(event *yaml_event_t) {
        +	*event = yaml_event_t{
        +		typ: yaml_STREAM_END_EVENT,
        +	}
        +}
        +
        +// Create DOCUMENT-START.
        +func yaml_document_start_event_initialize(
        +	event *yaml_event_t,
        +	version_directive *yaml_version_directive_t,
        +	tag_directives []yaml_tag_directive_t,
        +	implicit bool,
        +) {
        +	*event = yaml_event_t{
        +		typ:               yaml_DOCUMENT_START_EVENT,
        +		version_directive: version_directive,
        +		tag_directives:    tag_directives,
        +		implicit:          implicit,
        +	}
        +}
        +
        +// Create DOCUMENT-END.
        +func yaml_document_end_event_initialize(event *yaml_event_t, implicit bool) {
        +	*event = yaml_event_t{
        +		typ:      yaml_DOCUMENT_END_EVENT,
        +		implicit: implicit,
        +	}
        +}
        +
        +// Create ALIAS.
        +func yaml_alias_event_initialize(event *yaml_event_t, anchor []byte) bool {
        +	*event = yaml_event_t{
        +		typ:    yaml_ALIAS_EVENT,
        +		anchor: anchor,
        +	}
        +	return true
        +}
        +
        +// Create SCALAR.
        +func yaml_scalar_event_initialize(event *yaml_event_t, anchor, tag, value []byte, plain_implicit, quoted_implicit bool, style yaml_scalar_style_t) bool {
        +	*event = yaml_event_t{
        +		typ:             yaml_SCALAR_EVENT,
        +		anchor:          anchor,
        +		tag:             tag,
        +		value:           value,
        +		implicit:        plain_implicit,
        +		quoted_implicit: quoted_implicit,
        +		style:           yaml_style_t(style),
        +	}
        +	return true
        +}
        +
        +// Create SEQUENCE-START.
        +func yaml_sequence_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_sequence_style_t) bool {
        +	*event = yaml_event_t{
        +		typ:      yaml_SEQUENCE_START_EVENT,
        +		anchor:   anchor,
        +		tag:      tag,
        +		implicit: implicit,
        +		style:    yaml_style_t(style),
        +	}
        +	return true
        +}
        +
        +// Create SEQUENCE-END.
        +func yaml_sequence_end_event_initialize(event *yaml_event_t) bool {
        +	*event = yaml_event_t{
        +		typ: yaml_SEQUENCE_END_EVENT,
        +	}
        +	return true
        +}
        +
        +// Create MAPPING-START.
        +func yaml_mapping_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_mapping_style_t) {
        +	*event = yaml_event_t{
        +		typ:      yaml_MAPPING_START_EVENT,
        +		anchor:   anchor,
        +		tag:      tag,
        +		implicit: implicit,
        +		style:    yaml_style_t(style),
        +	}
        +}
        +
        +// Create MAPPING-END.
        +func yaml_mapping_end_event_initialize(event *yaml_event_t) {
        +	*event = yaml_event_t{
        +		typ: yaml_MAPPING_END_EVENT,
        +	}
        +}
        +
        +// Destroy an event object.
        +func yaml_event_delete(event *yaml_event_t) {
        +	*event = yaml_event_t{}
        +}
        +
        +///*
        +// * Create a document object.
        +// */
        +//
        +//YAML_DECLARE(int)
        +//yaml_document_initialize(document *yaml_document_t,
        +//        version_directive *yaml_version_directive_t,
        +//        tag_directives_start *yaml_tag_directive_t,
        +//        tag_directives_end *yaml_tag_directive_t,
        +//        start_implicit int, end_implicit int)
        +//{
        +//    struct {
        +//        error yaml_error_type_t
        +//    } context
        +//    struct {
        +//        start *yaml_node_t
        +//        end *yaml_node_t
        +//        top *yaml_node_t
        +//    } nodes = { NULL, NULL, NULL }
        +//    version_directive_copy *yaml_version_directive_t = NULL
        +//    struct {
        +//        start *yaml_tag_directive_t
        +//        end *yaml_tag_directive_t
        +//        top *yaml_tag_directive_t
        +//    } tag_directives_copy = { NULL, NULL, NULL }
        +//    value yaml_tag_directive_t = { NULL, NULL }
        +//    mark yaml_mark_t = { 0, 0, 0 }
        +//
        +//    assert(document) // Non-NULL document object is expected.
        +//    assert((tag_directives_start && tag_directives_end) ||
        +//            (tag_directives_start == tag_directives_end))
        +//                            // Valid tag directives are expected.
        +//
        +//    if (!STACK_INIT(&context, nodes, INITIAL_STACK_SIZE)) goto error
        +//
        +//    if (version_directive) {
        +//        version_directive_copy = yaml_malloc(sizeof(yaml_version_directive_t))
        +//        if (!version_directive_copy) goto error
        +//        version_directive_copy.major = version_directive.major
        +//        version_directive_copy.minor = version_directive.minor
        +//    }
        +//
        +//    if (tag_directives_start != tag_directives_end) {
        +//        tag_directive *yaml_tag_directive_t
        +//        if (!STACK_INIT(&context, tag_directives_copy, INITIAL_STACK_SIZE))
        +//            goto error
        +//        for (tag_directive = tag_directives_start
        +//                tag_directive != tag_directives_end; tag_directive ++) {
        +//            assert(tag_directive.handle)
        +//            assert(tag_directive.prefix)
        +//            if (!yaml_check_utf8(tag_directive.handle,
        +//                        strlen((char *)tag_directive.handle)))
        +//                goto error
        +//            if (!yaml_check_utf8(tag_directive.prefix,
        +//                        strlen((char *)tag_directive.prefix)))
        +//                goto error
        +//            value.handle = yaml_strdup(tag_directive.handle)
        +//            value.prefix = yaml_strdup(tag_directive.prefix)
        +//            if (!value.handle || !value.prefix) goto error
        +//            if (!PUSH(&context, tag_directives_copy, value))
        +//                goto error
        +//            value.handle = NULL
        +//            value.prefix = NULL
        +//        }
        +//    }
        +//
        +//    DOCUMENT_INIT(*document, nodes.start, nodes.end, version_directive_copy,
        +//            tag_directives_copy.start, tag_directives_copy.top,
        +//            start_implicit, end_implicit, mark, mark)
        +//
        +//    return 1
        +//
        +//error:
        +//    STACK_DEL(&context, nodes)
        +//    yaml_free(version_directive_copy)
        +//    while (!STACK_EMPTY(&context, tag_directives_copy)) {
        +//        value yaml_tag_directive_t = POP(&context, tag_directives_copy)
        +//        yaml_free(value.handle)
        +//        yaml_free(value.prefix)
        +//    }
        +//    STACK_DEL(&context, tag_directives_copy)
        +//    yaml_free(value.handle)
        +//    yaml_free(value.prefix)
        +//
        +//    return 0
        +//}
        +//
        +///*
        +// * Destroy a document object.
        +// */
        +//
        +//YAML_DECLARE(void)
        +//yaml_document_delete(document *yaml_document_t)
        +//{
        +//    struct {
        +//        error yaml_error_type_t
        +//    } context
        +//    tag_directive *yaml_tag_directive_t
        +//
        +//    context.error = YAML_NO_ERROR // Eliminate a compiler warning.
        +//
        +//    assert(document) // Non-NULL document object is expected.
        +//
        +//    while (!STACK_EMPTY(&context, document.nodes)) {
        +//        node yaml_node_t = POP(&context, document.nodes)
        +//        yaml_free(node.tag)
        +//        switch (node.type) {
        +//            case YAML_SCALAR_NODE:
        +//                yaml_free(node.data.scalar.value)
        +//                break
        +//            case YAML_SEQUENCE_NODE:
        +//                STACK_DEL(&context, node.data.sequence.items)
        +//                break
        +//            case YAML_MAPPING_NODE:
        +//                STACK_DEL(&context, node.data.mapping.pairs)
        +//                break
        +//            default:
        +//                assert(0) // Should not happen.
        +//        }
        +//    }
        +//    STACK_DEL(&context, document.nodes)
        +//
        +//    yaml_free(document.version_directive)
        +//    for (tag_directive = document.tag_directives.start
        +//            tag_directive != document.tag_directives.end
        +//            tag_directive++) {
        +//        yaml_free(tag_directive.handle)
        +//        yaml_free(tag_directive.prefix)
        +//    }
        +//    yaml_free(document.tag_directives.start)
        +//
        +//    memset(document, 0, sizeof(yaml_document_t))
        +//}
        +//
        +///**
        +// * Get a document node.
        +// */
        +//
        +//YAML_DECLARE(yaml_node_t *)
        +//yaml_document_get_node(document *yaml_document_t, index int)
        +//{
        +//    assert(document) // Non-NULL document object is expected.
        +//
        +//    if (index > 0 && document.nodes.start + index <= document.nodes.top) {
        +//        return document.nodes.start + index - 1
        +//    }
        +//    return NULL
        +//}
        +//
        +///**
        +// * Get the root object.
        +// */
        +//
        +//YAML_DECLARE(yaml_node_t *)
        +//yaml_document_get_root_node(document *yaml_document_t)
        +//{
        +//    assert(document) // Non-NULL document object is expected.
        +//
        +//    if (document.nodes.top != document.nodes.start) {
        +//        return document.nodes.start
        +//    }
        +//    return NULL
        +//}
        +//
        +///*
        +// * Add a scalar node to a document.
        +// */
        +//
        +//YAML_DECLARE(int)
        +//yaml_document_add_scalar(document *yaml_document_t,
        +//        tag *yaml_char_t, value *yaml_char_t, length int,
        +//        style yaml_scalar_style_t)
        +//{
        +//    struct {
        +//        error yaml_error_type_t
        +//    } context
        +//    mark yaml_mark_t = { 0, 0, 0 }
        +//    tag_copy *yaml_char_t = NULL
        +//    value_copy *yaml_char_t = NULL
        +//    node yaml_node_t
        +//
        +//    assert(document) // Non-NULL document object is expected.
        +//    assert(value) // Non-NULL value is expected.
        +//
        +//    if (!tag) {
        +//        tag = (yaml_char_t *)YAML_DEFAULT_SCALAR_TAG
        +//    }
        +//
        +//    if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error
        +//    tag_copy = yaml_strdup(tag)
        +//    if (!tag_copy) goto error
        +//
        +//    if (length < 0) {
        +//        length = strlen((char *)value)
        +//    }
        +//
        +//    if (!yaml_check_utf8(value, length)) goto error
        +//    value_copy = yaml_malloc(length+1)
        +//    if (!value_copy) goto error
        +//    memcpy(value_copy, value, length)
        +//    value_copy[length] = '\0'
        +//
        +//    SCALAR_NODE_INIT(node, tag_copy, value_copy, length, style, mark, mark)
        +//    if (!PUSH(&context, document.nodes, node)) goto error
        +//
        +//    return document.nodes.top - document.nodes.start
        +//
        +//error:
        +//    yaml_free(tag_copy)
        +//    yaml_free(value_copy)
        +//
        +//    return 0
        +//}
        +//
        +///*
        +// * Add a sequence node to a document.
        +// */
        +//
        +//YAML_DECLARE(int)
        +//yaml_document_add_sequence(document *yaml_document_t,
        +//        tag *yaml_char_t, style yaml_sequence_style_t)
        +//{
        +//    struct {
        +//        error yaml_error_type_t
        +//    } context
        +//    mark yaml_mark_t = { 0, 0, 0 }
        +//    tag_copy *yaml_char_t = NULL
        +//    struct {
        +//        start *yaml_node_item_t
        +//        end *yaml_node_item_t
        +//        top *yaml_node_item_t
        +//    } items = { NULL, NULL, NULL }
        +//    node yaml_node_t
        +//
        +//    assert(document) // Non-NULL document object is expected.
        +//
        +//    if (!tag) {
        +//        tag = (yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG
        +//    }
        +//
        +//    if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error
        +//    tag_copy = yaml_strdup(tag)
        +//    if (!tag_copy) goto error
        +//
        +//    if (!STACK_INIT(&context, items, INITIAL_STACK_SIZE)) goto error
        +//
        +//    SEQUENCE_NODE_INIT(node, tag_copy, items.start, items.end,
        +//            style, mark, mark)
        +//    if (!PUSH(&context, document.nodes, node)) goto error
        +//
        +//    return document.nodes.top - document.nodes.start
        +//
        +//error:
        +//    STACK_DEL(&context, items)
        +//    yaml_free(tag_copy)
        +//
        +//    return 0
        +//}
        +//
        +///*
        +// * Add a mapping node to a document.
        +// */
        +//
        +//YAML_DECLARE(int)
        +//yaml_document_add_mapping(document *yaml_document_t,
        +//        tag *yaml_char_t, style yaml_mapping_style_t)
        +//{
        +//    struct {
        +//        error yaml_error_type_t
        +//    } context
        +//    mark yaml_mark_t = { 0, 0, 0 }
        +//    tag_copy *yaml_char_t = NULL
        +//    struct {
        +//        start *yaml_node_pair_t
        +//        end *yaml_node_pair_t
        +//        top *yaml_node_pair_t
        +//    } pairs = { NULL, NULL, NULL }
        +//    node yaml_node_t
        +//
        +//    assert(document) // Non-NULL document object is expected.
        +//
        +//    if (!tag) {
        +//        tag = (yaml_char_t *)YAML_DEFAULT_MAPPING_TAG
        +//    }
        +//
        +//    if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error
        +//    tag_copy = yaml_strdup(tag)
        +//    if (!tag_copy) goto error
        +//
        +//    if (!STACK_INIT(&context, pairs, INITIAL_STACK_SIZE)) goto error
        +//
        +//    MAPPING_NODE_INIT(node, tag_copy, pairs.start, pairs.end,
        +//            style, mark, mark)
        +//    if (!PUSH(&context, document.nodes, node)) goto error
        +//
        +//    return document.nodes.top - document.nodes.start
        +//
        +//error:
        +//    STACK_DEL(&context, pairs)
        +//    yaml_free(tag_copy)
        +//
        +//    return 0
        +//}
        +//
        +///*
        +// * Append an item to a sequence node.
        +// */
        +//
        +//YAML_DECLARE(int)
        +//yaml_document_append_sequence_item(document *yaml_document_t,
        +//        sequence int, item int)
        +//{
        +//    struct {
        +//        error yaml_error_type_t
        +//    } context
        +//
        +//    assert(document) // Non-NULL document is required.
        +//    assert(sequence > 0
        +//            && document.nodes.start + sequence <= document.nodes.top)
        +//                            // Valid sequence id is required.
        +//    assert(document.nodes.start[sequence-1].type == YAML_SEQUENCE_NODE)
        +//                            // A sequence node is required.
        +//    assert(item > 0 && document.nodes.start + item <= document.nodes.top)
        +//                            // Valid item id is required.
        +//
        +//    if (!PUSH(&context,
        +//                document.nodes.start[sequence-1].data.sequence.items, item))
        +//        return 0
        +//
        +//    return 1
        +//}
        +//
        +///*
        +// * Append a pair of a key and a value to a mapping node.
        +// */
        +//
        +//YAML_DECLARE(int)
        +//yaml_document_append_mapping_pair(document *yaml_document_t,
        +//        mapping int, key int, value int)
        +//{
        +//    struct {
        +//        error yaml_error_type_t
        +//    } context
        +//
        +//    pair yaml_node_pair_t
        +//
        +//    assert(document) // Non-NULL document is required.
        +//    assert(mapping > 0
        +//            && document.nodes.start + mapping <= document.nodes.top)
        +//                            // Valid mapping id is required.
        +//    assert(document.nodes.start[mapping-1].type == YAML_MAPPING_NODE)
        +//                            // A mapping node is required.
        +//    assert(key > 0 && document.nodes.start + key <= document.nodes.top)
        +//                            // Valid key id is required.
        +//    assert(value > 0 && document.nodes.start + value <= document.nodes.top)
        +//                            // Valid value id is required.
        +//
        +//    pair.key = key
        +//    pair.value = value
        +//
        +//    if (!PUSH(&context,
        +//                document.nodes.start[mapping-1].data.mapping.pairs, pair))
        +//        return 0
        +//
        +//    return 1
        +//}
        +//
        +//
        diff --git a/vendor/gopkg.in/yaml.v3/decode.go b/vendor/gopkg.in/yaml.v3/decode.go
        new file mode 100644
        index 000000000..be63169b7
        --- /dev/null
        +++ b/vendor/gopkg.in/yaml.v3/decode.go
        @@ -0,0 +1,931 @@
        +//
        +// Copyright (c) 2011-2019 Canonical Ltd
        +//
        +// Licensed under the Apache License, Version 2.0 (the "License");
        +// you may not use this file except in compliance with the License.
        +// You may obtain a copy of the License at
        +//
        +//     http://www.apache.org/licenses/LICENSE-2.0
        +//
        +// Unless required by applicable law or agreed to in writing, software
        +// distributed under the License is distributed on an "AS IS" BASIS,
        +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        +// See the License for the specific language governing permissions and
        +// limitations under the License.
        +
        +package yaml
        +
        +import (
        +	"encoding"
        +	"encoding/base64"
        +	"fmt"
        +	"io"
        +	"math"
        +	"reflect"
        +	"strconv"
        +	"time"
        +)
        +
        +// ----------------------------------------------------------------------------
        +// Parser, produces a node tree out of a libyaml event stream.
        +
        +type parser struct {
        +	parser   yaml_parser_t
        +	event    yaml_event_t
        +	doc      *Node
        +	anchors  map[string]*Node
        +	doneInit bool
        +}
        +
        +func newParser(b []byte) *parser {
        +	p := parser{}
        +	if !yaml_parser_initialize(&p.parser) {
        +		panic("failed to initialize YAML emitter")
        +	}
        +	if len(b) == 0 {
        +		b = []byte{'\n'}
        +	}
        +	yaml_parser_set_input_string(&p.parser, b)
        +	return &p
        +}
        +
        +func newParserFromReader(r io.Reader) *parser {
        +	p := parser{}
        +	if !yaml_parser_initialize(&p.parser) {
        +		panic("failed to initialize YAML emitter")
        +	}
        +	yaml_parser_set_input_reader(&p.parser, r)
        +	return &p
        +}
        +
        +func (p *parser) init() {
        +	if p.doneInit {
        +		return
        +	}
        +	p.anchors = make(map[string]*Node)
        +	p.expect(yaml_STREAM_START_EVENT)
        +	p.doneInit = true
        +}
        +
        +func (p *parser) destroy() {
        +	if p.event.typ != yaml_NO_EVENT {
        +		yaml_event_delete(&p.event)
        +	}
        +	yaml_parser_delete(&p.parser)
        +}
        +
        +// expect consumes an event from the event stream and
        +// checks that it's of the expected type.
        +func (p *parser) expect(e yaml_event_type_t) {
        +	if p.event.typ == yaml_NO_EVENT {
        +		if !yaml_parser_parse(&p.parser, &p.event) {
        +			p.fail()
        +		}
        +	}
        +	if p.event.typ == yaml_STREAM_END_EVENT {
        +		failf("attempted to go past the end of stream; corrupted value?")
        +	}
        +	if p.event.typ != e {
        +		p.parser.problem = fmt.Sprintf("expected %s event but got %s", e, p.event.typ)
        +		p.fail()
        +	}
        +	yaml_event_delete(&p.event)
        +	p.event.typ = yaml_NO_EVENT
        +}
        +
        +// peek peeks at the next event in the event stream,
        +// puts the results into p.event and returns the event type.
        +func (p *parser) peek() yaml_event_type_t {
        +	if p.event.typ != yaml_NO_EVENT {
        +		return p.event.typ
        +	}
        +	if !yaml_parser_parse(&p.parser, &p.event) {
        +		p.fail()
        +	}
        +	return p.event.typ
        +}
        +
        +func (p *parser) fail() {
        +	var where string
        +	var line int
        +	if p.parser.problem_mark.line != 0 {
        +		line = p.parser.problem_mark.line
        +		// Scanner errors don't iterate line before returning error
        +		if p.parser.error == yaml_SCANNER_ERROR {
        +			line++
        +		}
        +	} else if p.parser.context_mark.line != 0 {
        +		line = p.parser.context_mark.line
        +	}
        +	if line != 0 {
        +		where = "line " + strconv.Itoa(line) + ": "
        +	}
        +	var msg string
        +	if len(p.parser.problem) > 0 {
        +		msg = p.parser.problem
        +	} else {
        +		msg = "unknown problem parsing YAML content"
        +	}
        +	failf("%s%s", where, msg)
        +}
        +
        +func (p *parser) anchor(n *Node, anchor []byte) {
        +	if anchor != nil {
        +		n.Anchor = string(anchor)
        +		p.anchors[n.Anchor] = n
        +	}
        +}
        +
        +func (p *parser) parse() *Node {
        +	p.init()
        +	switch p.peek() {
        +	case yaml_SCALAR_EVENT:
        +		return p.scalar()
        +	case yaml_ALIAS_EVENT:
        +		return p.alias()
        +	case yaml_MAPPING_START_EVENT:
        +		return p.mapping()
        +	case yaml_SEQUENCE_START_EVENT:
        +		return p.sequence()
        +	case yaml_DOCUMENT_START_EVENT:
        +		return p.document()
        +	case yaml_STREAM_END_EVENT:
        +		// Happens when attempting to decode an empty buffer.
        +		return nil
        +	case yaml_TAIL_COMMENT_EVENT:
        +		panic("internal error: unexpected tail comment event (please report)")
        +	default:
        +		panic("internal error: attempted to parse unknown event (please report): " + p.event.typ.String())
        +	}
        +}
        +
        +func (p *parser) node(kind Kind, defaultTag, tag, value string) *Node {
        +	var style Style
        +	if tag != "" && tag != "!" {
        +		tag = shortTag(tag)
        +		style = TaggedStyle
        +	} else if defaultTag != "" {
        +		tag = defaultTag
        +	} else if kind == ScalarNode {
        +		tag, _ = resolve("", value)
        +	}
        +	return &Node{
        +		Kind:        kind,
        +		Tag:         tag,
        +		Value:       value,
        +		Style:       style,
        +		Line:        p.event.start_mark.line + 1,
        +		Column:      p.event.start_mark.column + 1,
        +		HeadComment: string(p.event.head_comment),
        +		LineComment: string(p.event.line_comment),
        +		FootComment: string(p.event.foot_comment),
        +	}
        +}
        +
        +func (p *parser) parseChild(parent *Node) *Node {
        +	child := p.parse()
        +	parent.Content = append(parent.Content, child)
        +	return child
        +}
        +
        +func (p *parser) document() *Node {
        +	n := p.node(DocumentNode, "", "", "")
        +	p.doc = n
        +	p.expect(yaml_DOCUMENT_START_EVENT)
        +	p.parseChild(n)
        +	if p.peek() == yaml_DOCUMENT_END_EVENT {
        +		n.FootComment = string(p.event.foot_comment)
        +	}
        +	p.expect(yaml_DOCUMENT_END_EVENT)
        +	return n
        +}
        +
        +func (p *parser) alias() *Node {
        +	n := p.node(AliasNode, "", "", string(p.event.anchor))
        +	n.Alias = p.anchors[n.Value]
        +	if n.Alias == nil {
        +		failf("unknown anchor '%s' referenced", n.Value)
        +	}
        +	p.expect(yaml_ALIAS_EVENT)
        +	return n
        +}
        +
        +func (p *parser) scalar() *Node {
        +	var parsedStyle = p.event.scalar_style()
        +	var nodeStyle Style
        +	switch {
        +	case parsedStyle&yaml_DOUBLE_QUOTED_SCALAR_STYLE != 0:
        +		nodeStyle = DoubleQuotedStyle
        +	case parsedStyle&yaml_SINGLE_QUOTED_SCALAR_STYLE != 0:
        +		nodeStyle = SingleQuotedStyle
        +	case parsedStyle&yaml_LITERAL_SCALAR_STYLE != 0:
        +		nodeStyle = LiteralStyle
        +	case parsedStyle&yaml_FOLDED_SCALAR_STYLE != 0:
        +		nodeStyle = FoldedStyle
        +	}
        +	var nodeValue = string(p.event.value)
        +	var nodeTag = string(p.event.tag)
        +	var defaultTag string
        +	if nodeStyle == 0 {
        +		if nodeValue == "<<" {
        +			defaultTag = mergeTag
        +		}
        +	} else {
        +		defaultTag = strTag
        +	}
        +	n := p.node(ScalarNode, defaultTag, nodeTag, nodeValue)
        +	n.Style |= nodeStyle
        +	p.anchor(n, p.event.anchor)
        +	p.expect(yaml_SCALAR_EVENT)
        +	return n
        +}
        +
        +func (p *parser) sequence() *Node {
        +	n := p.node(SequenceNode, seqTag, string(p.event.tag), "")
        +	if p.event.sequence_style()&yaml_FLOW_SEQUENCE_STYLE != 0 {
        +		n.Style |= FlowStyle
        +	}
        +	p.anchor(n, p.event.anchor)
        +	p.expect(yaml_SEQUENCE_START_EVENT)
        +	for p.peek() != yaml_SEQUENCE_END_EVENT {
        +		p.parseChild(n)
        +	}
        +	n.LineComment = string(p.event.line_comment)
        +	n.FootComment = string(p.event.foot_comment)
        +	p.expect(yaml_SEQUENCE_END_EVENT)
        +	return n
        +}
        +
        +func (p *parser) mapping() *Node {
        +	n := p.node(MappingNode, mapTag, string(p.event.tag), "")
        +	block := true
        +	if p.event.mapping_style()&yaml_FLOW_MAPPING_STYLE != 0 {
        +		block = false
        +		n.Style |= FlowStyle
        +	}
        +	p.anchor(n, p.event.anchor)
        +	p.expect(yaml_MAPPING_START_EVENT)
        +	for p.peek() != yaml_MAPPING_END_EVENT {
        +		k := p.parseChild(n)
        +		if block && k.FootComment != "" {
        +			// Must be a foot comment for the prior value when being dedented.
        +			if len(n.Content) > 2 {
        +				n.Content[len(n.Content)-3].FootComment = k.FootComment
        +				k.FootComment = ""
        +			}
        +		}
        +		v := p.parseChild(n)
        +		if k.FootComment == "" && v.FootComment != "" {
        +			k.FootComment = v.FootComment
        +			v.FootComment = ""
        +		}
        +		if p.peek() == yaml_TAIL_COMMENT_EVENT {
        +			if k.FootComment == "" {
        +				k.FootComment = string(p.event.foot_comment)
        +			}
        +			p.expect(yaml_TAIL_COMMENT_EVENT)
        +		}
        +	}
        +	n.LineComment = string(p.event.line_comment)
        +	n.FootComment = string(p.event.foot_comment)
        +	if n.Style&FlowStyle == 0 && n.FootComment != "" && len(n.Content) > 1 {
        +		n.Content[len(n.Content)-2].FootComment = n.FootComment
        +		n.FootComment = ""
        +	}
        +	p.expect(yaml_MAPPING_END_EVENT)
        +	return n
        +}
        +
        +// ----------------------------------------------------------------------------
        +// Decoder, unmarshals a node into a provided value.
        +
        +type decoder struct {
        +	doc     *Node
        +	aliases map[*Node]bool
        +	terrors []string
        +
        +	stringMapType  reflect.Type
        +	generalMapType reflect.Type
        +
        +	knownFields bool
        +	uniqueKeys  bool
        +	decodeCount int
        +	aliasCount  int
        +	aliasDepth  int
        +}
        +
        +var (
        +	nodeType       = reflect.TypeOf(Node{})
        +	durationType   = reflect.TypeOf(time.Duration(0))
        +	stringMapType  = reflect.TypeOf(map[string]interface{}{})
        +	generalMapType = reflect.TypeOf(map[interface{}]interface{}{})
        +	ifaceType      = generalMapType.Elem()
        +	timeType       = reflect.TypeOf(time.Time{})
        +	ptrTimeType    = reflect.TypeOf(&time.Time{})
        +)
        +
        +func newDecoder() *decoder {
        +	d := &decoder{
        +		stringMapType:  stringMapType,
        +		generalMapType: generalMapType,
        +		uniqueKeys:     true,
        +	}
        +	d.aliases = make(map[*Node]bool)
        +	return d
        +}
        +
        +func (d *decoder) terror(n *Node, tag string, out reflect.Value) {
        +	if n.Tag != "" {
        +		tag = n.Tag
        +	}
        +	value := n.Value
        +	if tag != seqTag && tag != mapTag {
        +		if len(value) > 10 {
        +			value = " `" + value[:7] + "...`"
        +		} else {
        +			value = " `" + value + "`"
        +		}
        +	}
        +	d.terrors = append(d.terrors, fmt.Sprintf("line %d: cannot unmarshal %s%s into %s", n.Line, shortTag(tag), value, out.Type()))
        +}
        +
        +func (d *decoder) callUnmarshaler(n *Node, u Unmarshaler) (good bool) {
        +	err := u.UnmarshalYAML(n)
        +	if e, ok := err.(*TypeError); ok {
        +		d.terrors = append(d.terrors, e.Errors...)
        +		return false
        +	}
        +	if err != nil {
        +		fail(err)
        +	}
        +	return true
        +}
        +
        +func (d *decoder) callObsoleteUnmarshaler(n *Node, u obsoleteUnmarshaler) (good bool) {
        +	terrlen := len(d.terrors)
        +	err := u.UnmarshalYAML(func(v interface{}) (err error) {
        +		defer handleErr(&err)
        +		d.unmarshal(n, reflect.ValueOf(v))
        +		if len(d.terrors) > terrlen {
        +			issues := d.terrors[terrlen:]
        +			d.terrors = d.terrors[:terrlen]
        +			return &TypeError{issues}
        +		}
        +		return nil
        +	})
        +	if e, ok := err.(*TypeError); ok {
        +		d.terrors = append(d.terrors, e.Errors...)
        +		return false
        +	}
        +	if err != nil {
        +		fail(err)
        +	}
        +	return true
        +}
        +
        +// d.prepare initializes and dereferences pointers and calls UnmarshalYAML
        +// if a value is found to implement it.
        +// It returns the initialized and dereferenced out value, whether
        +// unmarshalling was already done by UnmarshalYAML, and if so whether
        +// its types unmarshalled appropriately.
        +//
        +// If n holds a null value, prepare returns before doing anything.
        +func (d *decoder) prepare(n *Node, out reflect.Value) (newout reflect.Value, unmarshaled, good bool) {
        +	if n.ShortTag() == nullTag {
        +		return out, false, false
        +	}
        +	again := true
        +	for again {
        +		again = false
        +		if out.Kind() == reflect.Ptr {
        +			if out.IsNil() {
        +				out.Set(reflect.New(out.Type().Elem()))
        +			}
        +			out = out.Elem()
        +			again = true
        +		}
        +		if out.CanAddr() {
        +			outi := out.Addr().Interface()
        +			if u, ok := outi.(Unmarshaler); ok {
        +				good = d.callUnmarshaler(n, u)
        +				return out, true, good
        +			}
        +			if u, ok := outi.(obsoleteUnmarshaler); ok {
        +				good = d.callObsoleteUnmarshaler(n, u)
        +				return out, true, good
        +			}
        +		}
        +	}
        +	return out, false, false
        +}
        +
        +func (d *decoder) fieldByIndex(n *Node, v reflect.Value, index []int) (field reflect.Value) {
        +	if n.ShortTag() == nullTag {
        +		return reflect.Value{}
        +	}
        +	for _, num := range index {
        +		for {
        +			if v.Kind() == reflect.Ptr {
        +				if v.IsNil() {
        +					v.Set(reflect.New(v.Type().Elem()))
        +				}
        +				v = v.Elem()
        +				continue
        +			}
        +			break
        +		}
        +		v = v.Field(num)
        +	}
        +	return v
        +}
        +
        +const (
        +	// 400,000 decode operations is ~500kb of dense object declarations, or
        +	// ~5kb of dense object declarations with 10000% alias expansion
        +	alias_ratio_range_low = 400000
        +
        +	// 4,000,000 decode operations is ~5MB of dense object declarations, or
        +	// ~4.5MB of dense object declarations with 10% alias expansion
        +	alias_ratio_range_high = 4000000
        +
        +	// alias_ratio_range is the range over which we scale allowed alias ratios
        +	alias_ratio_range = float64(alias_ratio_range_high - alias_ratio_range_low)
        +)
        +
        +func allowedAliasRatio(decodeCount int) float64 {
        +	switch {
        +	case decodeCount <= alias_ratio_range_low:
        +		// allow 99% to come from alias expansion for small-to-medium documents
        +		return 0.99
        +	case decodeCount >= alias_ratio_range_high:
        +		// allow 10% to come from alias expansion for very large documents
        +		return 0.10
        +	default:
        +		// scale smoothly from 99% down to 10% over the range.
        +		// this maps to 396,000 - 400,000 allowed alias-driven decodes over the range.
        +		// 400,000 decode operations is ~100MB of allocations in worst-case scenarios (single-item maps).
        +		return 0.99 - 0.89*(float64(decodeCount-alias_ratio_range_low)/alias_ratio_range)
        +	}
        +}
        +
        +func (d *decoder) unmarshal(n *Node, out reflect.Value) (good bool) {
        +	d.decodeCount++
        +	if d.aliasDepth > 0 {
        +		d.aliasCount++
        +	}
        +	if d.aliasCount > 100 && d.decodeCount > 1000 && float64(d.aliasCount)/float64(d.decodeCount) > allowedAliasRatio(d.decodeCount) {
        +		failf("document contains excessive aliasing")
        +	}
        +	if out.Type() == nodeType {
        +		out.Set(reflect.ValueOf(n).Elem())
        +		return true
        +	}
        +	switch n.Kind {
        +	case DocumentNode:
        +		return d.document(n, out)
        +	case AliasNode:
        +		return d.alias(n, out)
        +	}
        +	out, unmarshaled, good := d.prepare(n, out)
        +	if unmarshaled {
        +		return good
        +	}
        +	switch n.Kind {
        +	case ScalarNode:
        +		good = d.scalar(n, out)
        +	case MappingNode:
        +		good = d.mapping(n, out)
        +	case SequenceNode:
        +		good = d.sequence(n, out)
        +	default:
        +		panic("internal error: unknown node kind: " + strconv.Itoa(int(n.Kind)))
        +	}
        +	return good
        +}
        +
        +func (d *decoder) document(n *Node, out reflect.Value) (good bool) {
        +	if len(n.Content) == 1 {
        +		d.doc = n
        +		d.unmarshal(n.Content[0], out)
        +		return true
        +	}
        +	return false
        +}
        +
        +func (d *decoder) alias(n *Node, out reflect.Value) (good bool) {
        +	if d.aliases[n] {
        +		// TODO this could actually be allowed in some circumstances.
        +		failf("anchor '%s' value contains itself", n.Value)
        +	}
        +	d.aliases[n] = true
        +	d.aliasDepth++
        +	good = d.unmarshal(n.Alias, out)
        +	d.aliasDepth--
        +	delete(d.aliases, n)
        +	return good
        +}
        +
        +var zeroValue reflect.Value
        +
        +func resetMap(out reflect.Value) {
        +	for _, k := range out.MapKeys() {
        +		out.SetMapIndex(k, zeroValue)
        +	}
        +}
        +
        +func (d *decoder) scalar(n *Node, out reflect.Value) bool {
        +	var tag string
        +	var resolved interface{}
        +	if n.indicatedString() {
        +		tag = strTag
        +		resolved = n.Value
        +	} else {
        +		tag, resolved = resolve(n.Tag, n.Value)
        +		if tag == binaryTag {
        +			data, err := base64.StdEncoding.DecodeString(resolved.(string))
        +			if err != nil {
        +				failf("!!binary value contains invalid base64 data")
        +			}
        +			resolved = string(data)
        +		}
        +	}
        +	if resolved == nil {
        +		if out.CanAddr() {
        +			switch out.Kind() {
        +			case reflect.Interface, reflect.Ptr, reflect.Map, reflect.Slice:
        +				out.Set(reflect.Zero(out.Type()))
        +				return true
        +			}
        +		}
        +		return false
        +	}
        +	if resolvedv := reflect.ValueOf(resolved); out.Type() == resolvedv.Type() {
        +		// We've resolved to exactly the type we want, so use that.
        +		out.Set(resolvedv)
        +		return true
        +	}
        +	// Perhaps we can use the value as a TextUnmarshaler to
        +	// set its value.
        +	if out.CanAddr() {
        +		u, ok := out.Addr().Interface().(encoding.TextUnmarshaler)
        +		if ok {
        +			var text []byte
        +			if tag == binaryTag {
        +				text = []byte(resolved.(string))
        +			} else {
        +				// We let any value be unmarshaled into TextUnmarshaler.
        +				// That might be more lax than we'd like, but the
        +				// TextUnmarshaler itself should bowl out any dubious values.
        +				text = []byte(n.Value)
        +			}
        +			err := u.UnmarshalText(text)
        +			if err != nil {
        +				fail(err)
        +			}
        +			return true
        +		}
        +	}
        +	switch out.Kind() {
        +	case reflect.String:
        +		if tag == binaryTag {
        +			out.SetString(resolved.(string))
        +			return true
        +		}
        +		out.SetString(n.Value)
        +		return true
        +	case reflect.Interface:
        +		out.Set(reflect.ValueOf(resolved))
        +		return true
        +	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
        +		// This used to work in v2, but it's very unfriendly.
        +		isDuration := out.Type() == durationType
        +
        +		switch resolved := resolved.(type) {
        +		case int:
        +			if !isDuration && !out.OverflowInt(int64(resolved)) {
        +				out.SetInt(int64(resolved))
        +				return true
        +			}
        +		case int64:
        +			if !isDuration && !out.OverflowInt(resolved) {
        +				out.SetInt(resolved)
        +				return true
        +			}
        +		case uint64:
        +			if !isDuration && resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) {
        +				out.SetInt(int64(resolved))
        +				return true
        +			}
        +		case float64:
        +			if !isDuration && resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) {
        +				out.SetInt(int64(resolved))
        +				return true
        +			}
        +		case string:
        +			if out.Type() == durationType {
        +				d, err := time.ParseDuration(resolved)
        +				if err == nil {
        +					out.SetInt(int64(d))
        +					return true
        +				}
        +			}
        +		}
        +	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
        +		switch resolved := resolved.(type) {
        +		case int:
        +			if resolved >= 0 && !out.OverflowUint(uint64(resolved)) {
        +				out.SetUint(uint64(resolved))
        +				return true
        +			}
        +		case int64:
        +			if resolved >= 0 && !out.OverflowUint(uint64(resolved)) {
        +				out.SetUint(uint64(resolved))
        +				return true
        +			}
        +		case uint64:
        +			if !out.OverflowUint(uint64(resolved)) {
        +				out.SetUint(uint64(resolved))
        +				return true
        +			}
        +		case float64:
        +			if resolved <= math.MaxUint64 && !out.OverflowUint(uint64(resolved)) {
        +				out.SetUint(uint64(resolved))
        +				return true
        +			}
        +		}
        +	case reflect.Bool:
        +		switch resolved := resolved.(type) {
        +		case bool:
        +			out.SetBool(resolved)
        +			return true
        +		case string:
        +			// This offers some compatibility with the 1.1 spec (https://yaml.org/type/bool.html).
        +			// It only works if explicitly attempting to unmarshal into a typed bool value.
        +			switch resolved {
        +			case "y", "Y", "yes", "Yes", "YES", "on", "On", "ON":
        +				out.SetBool(true)
        +				return true
        +			case "n", "N", "no", "No", "NO", "off", "Off", "OFF":
        +				out.SetBool(false)
        +				return true
        +			}
        +		}
        +	case reflect.Float32, reflect.Float64:
        +		switch resolved := resolved.(type) {
        +		case int:
        +			out.SetFloat(float64(resolved))
        +			return true
        +		case int64:
        +			out.SetFloat(float64(resolved))
        +			return true
        +		case uint64:
        +			out.SetFloat(float64(resolved))
        +			return true
        +		case float64:
        +			out.SetFloat(resolved)
        +			return true
        +		}
        +	case reflect.Struct:
        +		if resolvedv := reflect.ValueOf(resolved); out.Type() == resolvedv.Type() {
        +			out.Set(resolvedv)
        +			return true
        +		}
        +	case reflect.Ptr:
        +		panic("yaml internal error: please report the issue")
        +	}
        +	d.terror(n, tag, out)
        +	return false
        +}
        +
        +func settableValueOf(i interface{}) reflect.Value {
        +	v := reflect.ValueOf(i)
        +	sv := reflect.New(v.Type()).Elem()
        +	sv.Set(v)
        +	return sv
        +}
        +
        +func (d *decoder) sequence(n *Node, out reflect.Value) (good bool) {
        +	l := len(n.Content)
        +
        +	var iface reflect.Value
        +	switch out.Kind() {
        +	case reflect.Slice:
        +		out.Set(reflect.MakeSlice(out.Type(), l, l))
        +	case reflect.Array:
        +		if l != out.Len() {
        +			failf("invalid array: want %d elements but got %d", out.Len(), l)
        +		}
        +	case reflect.Interface:
        +		// No type hints. Will have to use a generic sequence.
        +		iface = out
        +		out = settableValueOf(make([]interface{}, l))
        +	default:
        +		d.terror(n, seqTag, out)
        +		return false
        +	}
        +	et := out.Type().Elem()
        +
        +	j := 0
        +	for i := 0; i < l; i++ {
        +		e := reflect.New(et).Elem()
        +		if ok := d.unmarshal(n.Content[i], e); ok {
        +			out.Index(j).Set(e)
        +			j++
        +		}
        +	}
        +	if out.Kind() != reflect.Array {
        +		out.Set(out.Slice(0, j))
        +	}
        +	if iface.IsValid() {
        +		iface.Set(out)
        +	}
        +	return true
        +}
        +
        +func (d *decoder) mapping(n *Node, out reflect.Value) (good bool) {
        +	l := len(n.Content)
        +	if d.uniqueKeys {
        +		nerrs := len(d.terrors)
        +		for i := 0; i < l; i += 2 {
        +			ni := n.Content[i]
        +			for j := i + 2; j < l; j += 2 {
        +				nj := n.Content[j]
        +				if ni.Kind == nj.Kind && ni.Value == nj.Value {
        +					d.terrors = append(d.terrors, fmt.Sprintf("line %d: mapping key %#v already defined at line %d", nj.Line, nj.Value, ni.Line))
        +				}
        +			}
        +		}
        +		if len(d.terrors) > nerrs {
        +			return false
        +		}
        +	}
        +	switch out.Kind() {
        +	case reflect.Struct:
        +		return d.mappingStruct(n, out)
        +	case reflect.Map:
        +		// okay
        +	case reflect.Interface:
        +		iface := out
        +		if isStringMap(n) {
        +			out = reflect.MakeMap(d.stringMapType)
        +		} else {
        +			out = reflect.MakeMap(d.generalMapType)
        +		}
        +		iface.Set(out)
        +	default:
        +		d.terror(n, mapTag, out)
        +		return false
        +	}
        +
        +	outt := out.Type()
        +	kt := outt.Key()
        +	et := outt.Elem()
        +
        +	stringMapType := d.stringMapType
        +	generalMapType := d.generalMapType
        +	if outt.Elem() == ifaceType {
        +		if outt.Key().Kind() == reflect.String {
        +			d.stringMapType = outt
        +		} else if outt.Key() == ifaceType {
        +			d.generalMapType = outt
        +		}
        +	}
        +
        +	if out.IsNil() {
        +		out.Set(reflect.MakeMap(outt))
        +	}
        +	for i := 0; i < l; i += 2 {
        +		if isMerge(n.Content[i]) {
        +			d.merge(n.Content[i+1], out)
        +			continue
        +		}
        +		k := reflect.New(kt).Elem()
        +		if d.unmarshal(n.Content[i], k) {
        +			kkind := k.Kind()
        +			if kkind == reflect.Interface {
        +				kkind = k.Elem().Kind()
        +			}
        +			if kkind == reflect.Map || kkind == reflect.Slice {
        +				failf("invalid map key: %#v", k.Interface())
        +			}
        +			e := reflect.New(et).Elem()
        +			if d.unmarshal(n.Content[i+1], e) {
        +				out.SetMapIndex(k, e)
        +			}
        +		}
        +	}
        +	d.stringMapType = stringMapType
        +	d.generalMapType = generalMapType
        +	return true
        +}
        +
        +func isStringMap(n *Node) bool {
        +	if n.Kind != MappingNode {
        +		return false
        +	}
        +	l := len(n.Content)
        +	for i := 0; i < l; i += 2 {
        +		if n.Content[i].ShortTag() != strTag {
        +			return false
        +		}
        +	}
        +	return true
        +}
        +
        +func (d *decoder) mappingStruct(n *Node, out reflect.Value) (good bool) {
        +	sinfo, err := getStructInfo(out.Type())
        +	if err != nil {
        +		panic(err)
        +	}
        +
        +	var inlineMap reflect.Value
        +	var elemType reflect.Type
        +	if sinfo.InlineMap != -1 {
        +		inlineMap = out.Field(sinfo.InlineMap)
        +		inlineMap.Set(reflect.New(inlineMap.Type()).Elem())
        +		elemType = inlineMap.Type().Elem()
        +	}
        +
        +	for _, index := range sinfo.InlineUnmarshalers {
        +		field := d.fieldByIndex(n, out, index)
        +		d.prepare(n, field)
        +	}
        +
        +	var doneFields []bool
        +	if d.uniqueKeys {
        +		doneFields = make([]bool, len(sinfo.FieldsList))
        +	}
        +	name := settableValueOf("")
        +	l := len(n.Content)
        +	for i := 0; i < l; i += 2 {
        +		ni := n.Content[i]
        +		if isMerge(ni) {
        +			d.merge(n.Content[i+1], out)
        +			continue
        +		}
        +		if !d.unmarshal(ni, name) {
        +			continue
        +		}
        +		if info, ok := sinfo.FieldsMap[name.String()]; ok {
        +			if d.uniqueKeys {
        +				if doneFields[info.Id] {
        +					d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s already set in type %s", ni.Line, name.String(), out.Type()))
        +					continue
        +				}
        +				doneFields[info.Id] = true
        +			}
        +			var field reflect.Value
        +			if info.Inline == nil {
        +				field = out.Field(info.Num)
        +			} else {
        +				field = d.fieldByIndex(n, out, info.Inline)
        +			}
        +			d.unmarshal(n.Content[i+1], field)
        +		} else if sinfo.InlineMap != -1 {
        +			if inlineMap.IsNil() {
        +				inlineMap.Set(reflect.MakeMap(inlineMap.Type()))
        +			}
        +			value := reflect.New(elemType).Elem()
        +			d.unmarshal(n.Content[i+1], value)
        +			inlineMap.SetMapIndex(name, value)
        +		} else if d.knownFields {
        +			d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s not found in type %s", ni.Line, name.String(), out.Type()))
        +		}
        +	}
        +	return true
        +}
        +
        +func failWantMap() {
        +	failf("map merge requires map or sequence of maps as the value")
        +}
        +
        +func (d *decoder) merge(n *Node, out reflect.Value) {
        +	switch n.Kind {
        +	case MappingNode:
        +		d.unmarshal(n, out)
        +	case AliasNode:
        +		if n.Alias != nil && n.Alias.Kind != MappingNode {
        +			failWantMap()
        +		}
        +		d.unmarshal(n, out)
        +	case SequenceNode:
        +		// Step backwards as earlier nodes take precedence.
        +		for i := len(n.Content) - 1; i >= 0; i-- {
        +			ni := n.Content[i]
        +			if ni.Kind == AliasNode {
        +				if ni.Alias != nil && ni.Alias.Kind != MappingNode {
        +					failWantMap()
        +				}
        +			} else if ni.Kind != MappingNode {
        +				failWantMap()
        +			}
        +			d.unmarshal(ni, out)
        +		}
        +	default:
        +		failWantMap()
        +	}
        +}
        +
        +func isMerge(n *Node) bool {
        +	return n.Kind == ScalarNode && n.Value == "<<" && (n.Tag == "" || n.Tag == "!" || shortTag(n.Tag) == mergeTag)
        +}
        diff --git a/vendor/gopkg.in/yaml.v3/emitterc.go b/vendor/gopkg.in/yaml.v3/emitterc.go
        new file mode 100644
        index 000000000..ab2a06619
        --- /dev/null
        +++ b/vendor/gopkg.in/yaml.v3/emitterc.go
        @@ -0,0 +1,1992 @@
        +//
        +// Copyright (c) 2011-2019 Canonical Ltd
        +// Copyright (c) 2006-2010 Kirill Simonov
        +//
        +// Permission is hereby granted, free of charge, to any person obtaining a copy of
        +// this software and associated documentation files (the "Software"), to deal in
        +// the Software without restriction, including without limitation the rights to
        +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
        +// of the Software, and to permit persons to whom the Software is furnished to do
        +// so, subject to the following conditions:
        +//
        +// The above copyright notice and this permission notice shall be included in all
        +// copies or substantial portions of the Software.
        +//
        +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        +// SOFTWARE.
        +
        +package yaml
        +
        +import (
        +	"bytes"
        +	"fmt"
        +)
        +
        +// Flush the buffer if needed.
        +func flush(emitter *yaml_emitter_t) bool {
        +	if emitter.buffer_pos+5 >= len(emitter.buffer) {
        +		return yaml_emitter_flush(emitter)
        +	}
        +	return true
        +}
        +
        +// Put a character to the output buffer.
        +func put(emitter *yaml_emitter_t, value byte) bool {
        +	if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
        +		return false
        +	}
        +	emitter.buffer[emitter.buffer_pos] = value
        +	emitter.buffer_pos++
        +	emitter.column++
        +	return true
        +}
        +
        +// Put a line break to the output buffer.
        +func put_break(emitter *yaml_emitter_t) bool {
        +	if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
        +		return false
        +	}
        +	switch emitter.line_break {
        +	case yaml_CR_BREAK:
        +		emitter.buffer[emitter.buffer_pos] = '\r'
        +		emitter.buffer_pos += 1
        +	case yaml_LN_BREAK:
        +		emitter.buffer[emitter.buffer_pos] = '\n'
        +		emitter.buffer_pos += 1
        +	case yaml_CRLN_BREAK:
        +		emitter.buffer[emitter.buffer_pos+0] = '\r'
        +		emitter.buffer[emitter.buffer_pos+1] = '\n'
        +		emitter.buffer_pos += 2
        +	default:
        +		panic("unknown line break setting")
        +	}
        +	if emitter.column == 0 {
        +		emitter.space_above = true
        +	}
        +	emitter.column = 0
        +	emitter.line++
        +	// [Go] Do this here and below and drop from everywhere else (see commented lines).
        +	emitter.indention = true
        +	return true
        +}
        +
        +// Copy a character from a string into buffer.
        +func write(emitter *yaml_emitter_t, s []byte, i *int) bool {
        +	if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
        +		return false
        +	}
        +	p := emitter.buffer_pos
        +	w := width(s[*i])
        +	switch w {
        +	case 4:
        +		emitter.buffer[p+3] = s[*i+3]
        +		fallthrough
        +	case 3:
        +		emitter.buffer[p+2] = s[*i+2]
        +		fallthrough
        +	case 2:
        +		emitter.buffer[p+1] = s[*i+1]
        +		fallthrough
        +	case 1:
        +		emitter.buffer[p+0] = s[*i+0]
        +	default:
        +		panic("unknown character width")
        +	}
        +	emitter.column++
        +	emitter.buffer_pos += w
        +	*i += w
        +	return true
        +}
        +
        +// Write a whole string into buffer.
        +func write_all(emitter *yaml_emitter_t, s []byte) bool {
        +	for i := 0; i < len(s); {
        +		if !write(emitter, s, &i) {
        +			return false
        +		}
        +	}
        +	return true
        +}
        +
        +// Copy a line break character from a string into buffer.
        +func write_break(emitter *yaml_emitter_t, s []byte, i *int) bool {
        +	if s[*i] == '\n' {
        +		if !put_break(emitter) {
        +			return false
        +		}
        +		*i++
        +	} else {
        +		if !write(emitter, s, i) {
        +			return false
        +		}
        +		if emitter.column == 0 {
        +			emitter.space_above = true
        +		}
        +		emitter.column = 0
        +		emitter.line++
        +		// [Go] Do this here and above and drop from everywhere else (see commented lines).
        +		emitter.indention = true
        +	}
        +	return true
        +}
        +
        +// Set an emitter error and return false.
        +func yaml_emitter_set_emitter_error(emitter *yaml_emitter_t, problem string) bool {
        +	emitter.error = yaml_EMITTER_ERROR
        +	emitter.problem = problem
        +	return false
        +}
        +
        +// Emit an event.
        +func yaml_emitter_emit(emitter *yaml_emitter_t, event *yaml_event_t) bool {
        +	emitter.events = append(emitter.events, *event)
        +	for !yaml_emitter_need_more_events(emitter) {
        +		event := &emitter.events[emitter.events_head]
        +		if !yaml_emitter_analyze_event(emitter, event) {
        +			return false
        +		}
        +		if !yaml_emitter_state_machine(emitter, event) {
        +			return false
        +		}
        +		yaml_event_delete(event)
        +		emitter.events_head++
        +	}
        +	return true
        +}
        +
        +// Check if we need to accumulate more events before emitting.
        +//
        +// We accumulate extra
        +//  - 1 event for DOCUMENT-START
        +//  - 2 events for SEQUENCE-START
        +//  - 3 events for MAPPING-START
        +//
        +func yaml_emitter_need_more_events(emitter *yaml_emitter_t) bool {
        +	if emitter.events_head == len(emitter.events) {
        +		return true
        +	}
        +	var accumulate int
        +	switch emitter.events[emitter.events_head].typ {
        +	case yaml_DOCUMENT_START_EVENT:
        +		accumulate = 1
        +		break
        +	case yaml_SEQUENCE_START_EVENT:
        +		accumulate = 2
        +		break
        +	case yaml_MAPPING_START_EVENT:
        +		accumulate = 3
        +		break
        +	default:
        +		return false
        +	}
        +	if len(emitter.events)-emitter.events_head > accumulate {
        +		return false
        +	}
        +	var level int
        +	for i := emitter.events_head; i < len(emitter.events); i++ {
        +		switch emitter.events[i].typ {
        +		case yaml_STREAM_START_EVENT, yaml_DOCUMENT_START_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT:
        +			level++
        +		case yaml_STREAM_END_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_END_EVENT, yaml_MAPPING_END_EVENT:
        +			level--
        +		}
        +		if level == 0 {
        +			return false
        +		}
        +	}
        +	return true
        +}
        +
        +// Append a directive to the directives stack.
        +func yaml_emitter_append_tag_directive(emitter *yaml_emitter_t, value *yaml_tag_directive_t, allow_duplicates bool) bool {
        +	for i := 0; i < len(emitter.tag_directives); i++ {
        +		if bytes.Equal(value.handle, emitter.tag_directives[i].handle) {
        +			if allow_duplicates {
        +				return true
        +			}
        +			return yaml_emitter_set_emitter_error(emitter, "duplicate %TAG directive")
        +		}
        +	}
        +
        +	// [Go] Do we actually need to copy this given garbage collection
        +	// and the lack of deallocating destructors?
        +	tag_copy := yaml_tag_directive_t{
        +		handle: make([]byte, len(value.handle)),
        +		prefix: make([]byte, len(value.prefix)),
        +	}
        +	copy(tag_copy.handle, value.handle)
        +	copy(tag_copy.prefix, value.prefix)
        +	emitter.tag_directives = append(emitter.tag_directives, tag_copy)
        +	return true
        +}
        +
        +// Increase the indentation level.
        +func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool) bool {
        +	emitter.indents = append(emitter.indents, emitter.indent)
        +	if emitter.indent < 0 {
        +		if flow {
        +			emitter.indent = emitter.best_indent
        +		} else {
        +			emitter.indent = 0
        +		}
        +	} else if !indentless {
        +		emitter.indent += emitter.best_indent
        +		// [Go] If inside a block sequence item, discount the space taken by the indicator.
        +		if emitter.best_indent > 2 && emitter.states[len(emitter.states)-1] == yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE {
        +			emitter.indent -= 2
        +		}
        +	}
        +	return true
        +}
        +
        +// State dispatcher.
        +func yaml_emitter_state_machine(emitter *yaml_emitter_t, event *yaml_event_t) bool {
        +	switch emitter.state {
        +	default:
        +	case yaml_EMIT_STREAM_START_STATE:
        +		return yaml_emitter_emit_stream_start(emitter, event)
        +
        +	case yaml_EMIT_FIRST_DOCUMENT_START_STATE:
        +		return yaml_emitter_emit_document_start(emitter, event, true)
        +
        +	case yaml_EMIT_DOCUMENT_START_STATE:
        +		return yaml_emitter_emit_document_start(emitter, event, false)
        +
        +	case yaml_EMIT_DOCUMENT_CONTENT_STATE:
        +		return yaml_emitter_emit_document_content(emitter, event)
        +
        +	case yaml_EMIT_DOCUMENT_END_STATE:
        +		return yaml_emitter_emit_document_end(emitter, event)
        +
        +	case yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE:
        +		return yaml_emitter_emit_flow_sequence_item(emitter, event, true, false)
        +
        +	case yaml_EMIT_FLOW_SEQUENCE_TRAIL_ITEM_STATE:
        +		return yaml_emitter_emit_flow_sequence_item(emitter, event, false, true)
        +
        +	case yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE:
        +		return yaml_emitter_emit_flow_sequence_item(emitter, event, false, false)
        +
        +	case yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE:
        +		return yaml_emitter_emit_flow_mapping_key(emitter, event, true, false)
        +
        +	case yaml_EMIT_FLOW_MAPPING_TRAIL_KEY_STATE:
        +		return yaml_emitter_emit_flow_mapping_key(emitter, event, false, true)
        +
        +	case yaml_EMIT_FLOW_MAPPING_KEY_STATE:
        +		return yaml_emitter_emit_flow_mapping_key(emitter, event, false, false)
        +
        +	case yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE:
        +		return yaml_emitter_emit_flow_mapping_value(emitter, event, true)
        +
        +	case yaml_EMIT_FLOW_MAPPING_VALUE_STATE:
        +		return yaml_emitter_emit_flow_mapping_value(emitter, event, false)
        +
        +	case yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE:
        +		return yaml_emitter_emit_block_sequence_item(emitter, event, true)
        +
        +	case yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE:
        +		return yaml_emitter_emit_block_sequence_item(emitter, event, false)
        +
        +	case yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE:
        +		return yaml_emitter_emit_block_mapping_key(emitter, event, true)
        +
        +	case yaml_EMIT_BLOCK_MAPPING_KEY_STATE:
        +		return yaml_emitter_emit_block_mapping_key(emitter, event, false)
        +
        +	case yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE:
        +		return yaml_emitter_emit_block_mapping_value(emitter, event, true)
        +
        +	case yaml_EMIT_BLOCK_MAPPING_VALUE_STATE:
        +		return yaml_emitter_emit_block_mapping_value(emitter, event, false)
        +
        +	case yaml_EMIT_END_STATE:
        +		return yaml_emitter_set_emitter_error(emitter, "expected nothing after STREAM-END")
        +	}
        +	panic("invalid emitter state")
        +}
        +
        +// Expect STREAM-START.
        +func yaml_emitter_emit_stream_start(emitter *yaml_emitter_t, event *yaml_event_t) bool {
        +	if event.typ != yaml_STREAM_START_EVENT {
        +		return yaml_emitter_set_emitter_error(emitter, "expected STREAM-START")
        +	}
        +	if emitter.encoding == yaml_ANY_ENCODING {
        +		emitter.encoding = event.encoding
        +		if emitter.encoding == yaml_ANY_ENCODING {
        +			emitter.encoding = yaml_UTF8_ENCODING
        +		}
        +	}
        +	if emitter.best_indent < 2 || emitter.best_indent > 9 {
        +		emitter.best_indent = 2
        +	}
        +	if emitter.best_width >= 0 && emitter.best_width <= emitter.best_indent*2 {
        +		emitter.best_width = 80
        +	}
        +	if emitter.best_width < 0 {
        +		emitter.best_width = 1<<31 - 1
        +	}
        +	if emitter.line_break == yaml_ANY_BREAK {
        +		emitter.line_break = yaml_LN_BREAK
        +	}
        +
        +	emitter.indent = -1
        +	emitter.line = 0
        +	emitter.column = 0
        +	emitter.whitespace = true
        +	emitter.indention = true
        +	emitter.space_above = true
        +	emitter.foot_indent = -1
        +
        +	if emitter.encoding != yaml_UTF8_ENCODING {
        +		if !yaml_emitter_write_bom(emitter) {
        +			return false
        +		}
        +	}
        +	emitter.state = yaml_EMIT_FIRST_DOCUMENT_START_STATE
        +	return true
        +}
        +
        +// Expect DOCUMENT-START or STREAM-END.
        +func yaml_emitter_emit_document_start(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
        +
        +	if event.typ == yaml_DOCUMENT_START_EVENT {
        +
        +		if event.version_directive != nil {
        +			if !yaml_emitter_analyze_version_directive(emitter, event.version_directive) {
        +				return false
        +			}
        +		}
        +
        +		for i := 0; i < len(event.tag_directives); i++ {
        +			tag_directive := &event.tag_directives[i]
        +			if !yaml_emitter_analyze_tag_directive(emitter, tag_directive) {
        +				return false
        +			}
        +			if !yaml_emitter_append_tag_directive(emitter, tag_directive, false) {
        +				return false
        +			}
        +		}
        +
        +		for i := 0; i < len(default_tag_directives); i++ {
        +			tag_directive := &default_tag_directives[i]
        +			if !yaml_emitter_append_tag_directive(emitter, tag_directive, true) {
        +				return false
        +			}
        +		}
        +
        +		implicit := event.implicit
        +		if !first || emitter.canonical {
        +			implicit = false
        +		}
        +
        +		if emitter.open_ended && (event.version_directive != nil || len(event.tag_directives) > 0) {
        +			if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) {
        +				return false
        +			}
        +			if !yaml_emitter_write_indent(emitter) {
        +				return false
        +			}
        +		}
        +
        +		if event.version_directive != nil {
        +			implicit = false
        +			if !yaml_emitter_write_indicator(emitter, []byte("%YAML"), true, false, false) {
        +				return false
        +			}
        +			if !yaml_emitter_write_indicator(emitter, []byte("1.1"), true, false, false) {
        +				return false
        +			}
        +			if !yaml_emitter_write_indent(emitter) {
        +				return false
        +			}
        +		}
        +
        +		if len(event.tag_directives) > 0 {
        +			implicit = false
        +			for i := 0; i < len(event.tag_directives); i++ {
        +				tag_directive := &event.tag_directives[i]
        +				if !yaml_emitter_write_indicator(emitter, []byte("%TAG"), true, false, false) {
        +					return false
        +				}
        +				if !yaml_emitter_write_tag_handle(emitter, tag_directive.handle) {
        +					return false
        +				}
        +				if !yaml_emitter_write_tag_content(emitter, tag_directive.prefix, true) {
        +					return false
        +				}
        +				if !yaml_emitter_write_indent(emitter) {
        +					return false
        +				}
        +			}
        +		}
        +
        +		if yaml_emitter_check_empty_document(emitter) {
        +			implicit = false
        +		}
        +		if !implicit {
        +			if !yaml_emitter_write_indent(emitter) {
        +				return false
        +			}
        +			if !yaml_emitter_write_indicator(emitter, []byte("---"), true, false, false) {
        +				return false
        +			}
        +			if emitter.canonical || true {
        +				if !yaml_emitter_write_indent(emitter) {
        +					return false
        +				}
        +			}
        +		}
        +
        +		if len(emitter.head_comment) > 0 {
        +			if !yaml_emitter_process_head_comment(emitter) {
        +				return false
        +			}
        +			if !put_break(emitter) {
        +				return false
        +			}
        +		}
        +
        +		emitter.state = yaml_EMIT_DOCUMENT_CONTENT_STATE
        +		return true
        +	}
        +
        +	if event.typ == yaml_STREAM_END_EVENT {
        +		if emitter.open_ended {
        +			if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) {
        +				return false
        +			}
        +			if !yaml_emitter_write_indent(emitter) {
        +				return false
        +			}
        +		}
        +		if !yaml_emitter_flush(emitter) {
        +			return false
        +		}
        +		emitter.state = yaml_EMIT_END_STATE
        +		return true
        +	}
        +
        +	return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-START or STREAM-END")
        +}
        +
        +// Expect the root node.
        +func yaml_emitter_emit_document_content(emitter *yaml_emitter_t, event *yaml_event_t) bool {
        +	emitter.states = append(emitter.states, yaml_EMIT_DOCUMENT_END_STATE)
        +
        +	if !yaml_emitter_process_head_comment(emitter) {
        +		return false
        +	}
        +	if !yaml_emitter_emit_node(emitter, event, true, false, false, false) {
        +		return false
        +	}
        +	if !yaml_emitter_process_line_comment(emitter) {
        +		return false
        +	}
        +	if !yaml_emitter_process_foot_comment(emitter) {
        +		return false
        +	}
        +	return true
        +}
        +
        +// Expect DOCUMENT-END.
        +func yaml_emitter_emit_document_end(emitter *yaml_emitter_t, event *yaml_event_t) bool {
        +	if event.typ != yaml_DOCUMENT_END_EVENT {
        +		return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-END")
        +	}
        +	// [Go] Force document foot separation.
        +	emitter.foot_indent = 0
        +	if !yaml_emitter_process_foot_comment(emitter) {
        +		return false
        +	}
        +	emitter.foot_indent = -1
        +	if !yaml_emitter_write_indent(emitter) {
        +		return false
        +	}
        +	if !event.implicit {
        +		// [Go] Allocate the slice elsewhere.
        +		if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) {
        +			return false
        +		}
        +		if !yaml_emitter_write_indent(emitter) {
        +			return false
        +		}
        +	}
        +	if !yaml_emitter_flush(emitter) {
        +		return false
        +	}
        +	emitter.state = yaml_EMIT_DOCUMENT_START_STATE
        +	emitter.tag_directives = emitter.tag_directives[:0]
        +	return true
        +}
        +
        +// Expect a flow item node.
        +func yaml_emitter_emit_flow_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first, trail bool) bool {
        +	if first {
        +		if !yaml_emitter_write_indicator(emitter, []byte{'['}, true, true, false) {
        +			return false
        +		}
        +		if !yaml_emitter_increase_indent(emitter, true, false) {
        +			return false
        +		}
        +		emitter.flow_level++
        +	}
        +
        +	if event.typ == yaml_SEQUENCE_END_EVENT {
        +		if emitter.canonical && !first && !trail {
        +			if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
        +				return false
        +			}
        +		}
        +		emitter.flow_level--
        +		emitter.indent = emitter.indents[len(emitter.indents)-1]
        +		emitter.indents = emitter.indents[:len(emitter.indents)-1]
        +		if emitter.column == 0 || emitter.canonical && !first {
        +			if !yaml_emitter_write_indent(emitter) {
        +				return false
        +			}
        +		}
        +		if !yaml_emitter_write_indicator(emitter, []byte{']'}, false, false, false) {
        +			return false
        +		}
        +		if !yaml_emitter_process_line_comment(emitter) {
        +			return false
        +		}
        +		if !yaml_emitter_process_foot_comment(emitter) {
        +			return false
        +		}
        +		emitter.state = emitter.states[len(emitter.states)-1]
        +		emitter.states = emitter.states[:len(emitter.states)-1]
        +
        +		return true
        +	}
        +
        +	if !first && !trail {
        +		if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
        +			return false
        +		}
        +	}
        +
        +	if !yaml_emitter_process_head_comment(emitter) {
        +		return false
        +	}
        +	if emitter.column == 0 {
        +		if !yaml_emitter_write_indent(emitter) {
        +			return false
        +		}
        +	}
        +
        +	if emitter.canonical || emitter.column > emitter.best_width {
        +		if !yaml_emitter_write_indent(emitter) {
        +			return false
        +		}
        +	}
        +	if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 {
        +		emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_TRAIL_ITEM_STATE)
        +	} else {
        +		emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE)
        +	}
        +	if !yaml_emitter_emit_node(emitter, event, false, true, false, false) {
        +		return false
        +	}
        +	if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 {
        +		if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
        +			return false
        +		}
        +	}
        +	if !yaml_emitter_process_line_comment(emitter) {
        +		return false
        +	}
        +	if !yaml_emitter_process_foot_comment(emitter) {
        +		return false
        +	}
        +	return true
        +}
        +
        +// Expect a flow key node.
        +func yaml_emitter_emit_flow_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first, trail bool) bool {
        +	if first {
        +		if !yaml_emitter_write_indicator(emitter, []byte{'{'}, true, true, false) {
        +			return false
        +		}
        +		if !yaml_emitter_increase_indent(emitter, true, false) {
        +			return false
        +		}
        +		emitter.flow_level++
        +	}
        +
        +	if event.typ == yaml_MAPPING_END_EVENT {
        +		if (emitter.canonical || len(emitter.head_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0) && !first && !trail {
        +			if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
        +				return false
        +			}
        +		}
        +		if !yaml_emitter_process_head_comment(emitter) {
        +			return false
        +		}
        +		emitter.flow_level--
        +		emitter.indent = emitter.indents[len(emitter.indents)-1]
        +		emitter.indents = emitter.indents[:len(emitter.indents)-1]
        +		if emitter.canonical && !first {
        +			if !yaml_emitter_write_indent(emitter) {
        +				return false
        +			}
        +		}
        +		if !yaml_emitter_write_indicator(emitter, []byte{'}'}, false, false, false) {
        +			return false
        +		}
        +		if !yaml_emitter_process_line_comment(emitter) {
        +			return false
        +		}
        +		if !yaml_emitter_process_foot_comment(emitter) {
        +			return false
        +		}
        +		emitter.state = emitter.states[len(emitter.states)-1]
        +		emitter.states = emitter.states[:len(emitter.states)-1]
        +		return true
        +	}
        +
        +	if !first && !trail {
        +		if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
        +			return false
        +		}
        +	}
        +
        +	if !yaml_emitter_process_head_comment(emitter) {
        +		return false
        +	}
        +
        +	if emitter.column == 0 {
        +		if !yaml_emitter_write_indent(emitter) {
        +			return false
        +		}
        +	}
        +
        +	if emitter.canonical || emitter.column > emitter.best_width {
        +		if !yaml_emitter_write_indent(emitter) {
        +			return false
        +		}
        +	}
        +
        +	if !emitter.canonical && yaml_emitter_check_simple_key(emitter) {
        +		emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE)
        +		return yaml_emitter_emit_node(emitter, event, false, false, true, true)
        +	}
        +	if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, false) {
        +		return false
        +	}
        +	emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_VALUE_STATE)
        +	return yaml_emitter_emit_node(emitter, event, false, false, true, false)
        +}
        +
        +// Expect a flow value node.
        +func yaml_emitter_emit_flow_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool {
        +	if simple {
        +		if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) {
        +			return false
        +		}
        +	} else {
        +		if emitter.canonical || emitter.column > emitter.best_width {
        +			if !yaml_emitter_write_indent(emitter) {
        +				return false
        +			}
        +		}
        +		if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, false) {
        +			return false
        +		}
        +	}
        +	if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 {
        +		emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_TRAIL_KEY_STATE)
        +	} else {
        +		emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_KEY_STATE)
        +	}
        +	if !yaml_emitter_emit_node(emitter, event, false, false, true, false) {
        +		return false
        +	}
        +	if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 {
        +		if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
        +			return false
        +		}
        +	}
        +	if !yaml_emitter_process_line_comment(emitter) {
        +		return false
        +	}
        +	if !yaml_emitter_process_foot_comment(emitter) {
        +		return false
        +	}
        +	return true
        +}
        +
        +// Expect a block item node.
        +func yaml_emitter_emit_block_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
        +	if first {
        +		// [Go] The original logic here would not indent the sequence when inside a mapping.
        +		// In Go we always indent it, but take the sequence indicator out of the indentation.
        +		indentless := emitter.best_indent == 2 && emitter.mapping_context && (emitter.column == 0 || !emitter.indention)
        +		original := emitter.indent
        +		if !yaml_emitter_increase_indent(emitter, false, indentless) {
        +			return false
        +		}
        +		if emitter.indent > original+2 {
        +			emitter.indent -= 2
        +		}
        +	}
        +	if event.typ == yaml_SEQUENCE_END_EVENT {
        +		emitter.indent = emitter.indents[len(emitter.indents)-1]
        +		emitter.indents = emitter.indents[:len(emitter.indents)-1]
        +		emitter.state = emitter.states[len(emitter.states)-1]
        +		emitter.states = emitter.states[:len(emitter.states)-1]
        +		return true
        +	}
        +	if !yaml_emitter_process_head_comment(emitter) {
        +		return false
        +	}
        +	if !yaml_emitter_write_indent(emitter) {
        +		return false
        +	}
        +	if !yaml_emitter_write_indicator(emitter, []byte{'-'}, true, false, true) {
        +		return false
        +	}
        +	emitter.states = append(emitter.states, yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE)
        +	if !yaml_emitter_emit_node(emitter, event, false, true, false, false) {
        +		return false
        +	}
        +	if !yaml_emitter_process_line_comment(emitter) {
        +		return false
        +	}
        +	if !yaml_emitter_process_foot_comment(emitter) {
        +		return false
        +	}
        +	return true
        +}
        +
        +// Expect a block key node.
        +func yaml_emitter_emit_block_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
        +	if first {
        +		if !yaml_emitter_increase_indent(emitter, false, false) {
        +			return false
        +		}
        +	}
        +	if !yaml_emitter_process_head_comment(emitter) {
        +		return false
        +	}
        +	if event.typ == yaml_MAPPING_END_EVENT {
        +		emitter.indent = emitter.indents[len(emitter.indents)-1]
        +		emitter.indents = emitter.indents[:len(emitter.indents)-1]
        +		emitter.state = emitter.states[len(emitter.states)-1]
        +		emitter.states = emitter.states[:len(emitter.states)-1]
        +		return true
        +	}
        +	if !yaml_emitter_write_indent(emitter) {
        +		return false
        +	}
        +	if yaml_emitter_check_simple_key(emitter) {
        +		emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE)
        +		return yaml_emitter_emit_node(emitter, event, false, false, true, true)
        +	}
        +	if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, true) {
        +		return false
        +	}
        +	emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_VALUE_STATE)
        +	return yaml_emitter_emit_node(emitter, event, false, false, true, false)
        +}
        +
        +// Expect a block value node.
        +func yaml_emitter_emit_block_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool {
        +	if simple {
        +		if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) {
        +			return false
        +		}
        +	} else {
        +		if !yaml_emitter_write_indent(emitter) {
        +			return false
        +		}
        +		if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, true) {
        +			return false
        +		}
        +	}
        +	emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_KEY_STATE)
        +	if !yaml_emitter_emit_node(emitter, event, false, false, true, false) {
        +		return false
        +	}
        +	if !yaml_emitter_process_line_comment(emitter) {
        +		return false
        +	}
        +	if !yaml_emitter_process_foot_comment(emitter) {
        +		return false
        +	}
        +	return true
        +}
        +
        +// Expect a node.
        +func yaml_emitter_emit_node(emitter *yaml_emitter_t, event *yaml_event_t,
        +	root bool, sequence bool, mapping bool, simple_key bool) bool {
        +
        +	emitter.root_context = root
        +	emitter.sequence_context = sequence
        +	emitter.mapping_context = mapping
        +	emitter.simple_key_context = simple_key
        +
        +	switch event.typ {
        +	case yaml_ALIAS_EVENT:
        +		return yaml_emitter_emit_alias(emitter, event)
        +	case yaml_SCALAR_EVENT:
        +		return yaml_emitter_emit_scalar(emitter, event)
        +	case yaml_SEQUENCE_START_EVENT:
        +		return yaml_emitter_emit_sequence_start(emitter, event)
        +	case yaml_MAPPING_START_EVENT:
        +		return yaml_emitter_emit_mapping_start(emitter, event)
        +	default:
        +		return yaml_emitter_set_emitter_error(emitter,
        +			fmt.Sprintf("expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS, but got %v", event.typ))
        +	}
        +}
        +
        +// Expect ALIAS.
        +func yaml_emitter_emit_alias(emitter *yaml_emitter_t, event *yaml_event_t) bool {
        +	if !yaml_emitter_process_anchor(emitter) {
        +		return false
        +	}
        +	emitter.state = emitter.states[len(emitter.states)-1]
        +	emitter.states = emitter.states[:len(emitter.states)-1]
        +	return true
        +}
        +
        +// Expect SCALAR.
        +func yaml_emitter_emit_scalar(emitter *yaml_emitter_t, event *yaml_event_t) bool {
        +	if !yaml_emitter_select_scalar_style(emitter, event) {
        +		return false
        +	}
        +	if !yaml_emitter_process_anchor(emitter) {
        +		return false
        +	}
        +	if !yaml_emitter_process_tag(emitter) {
        +		return false
        +	}
        +	if !yaml_emitter_increase_indent(emitter, true, false) {
        +		return false
        +	}
        +	if !yaml_emitter_process_scalar(emitter) {
        +		return false
        +	}
        +	emitter.indent = emitter.indents[len(emitter.indents)-1]
        +	emitter.indents = emitter.indents[:len(emitter.indents)-1]
        +	emitter.state = emitter.states[len(emitter.states)-1]
        +	emitter.states = emitter.states[:len(emitter.states)-1]
        +	return true
        +}
        +
        +// Expect SEQUENCE-START.
        +func yaml_emitter_emit_sequence_start(emitter *yaml_emitter_t, event *yaml_event_t) bool {
        +	if !yaml_emitter_process_anchor(emitter) {
        +		return false
        +	}
        +	if !yaml_emitter_process_tag(emitter) {
        +		return false
        +	}
        +	if emitter.flow_level > 0 || emitter.canonical || event.sequence_style() == yaml_FLOW_SEQUENCE_STYLE ||
        +		yaml_emitter_check_empty_sequence(emitter) {
        +		emitter.state = yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE
        +	} else {
        +		emitter.state = yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE
        +	}
        +	return true
        +}
        +
        +// Expect MAPPING-START.
        +func yaml_emitter_emit_mapping_start(emitter *yaml_emitter_t, event *yaml_event_t) bool {
        +	if !yaml_emitter_process_anchor(emitter) {
        +		return false
        +	}
        +	if !yaml_emitter_process_tag(emitter) {
        +		return false
        +	}
        +	if emitter.flow_level > 0 || emitter.canonical || event.mapping_style() == yaml_FLOW_MAPPING_STYLE ||
        +		yaml_emitter_check_empty_mapping(emitter) {
        +		emitter.state = yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE
        +	} else {
        +		emitter.state = yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE
        +	}
        +	return true
        +}
        +
        +// Check if the document content is an empty scalar.
        +func yaml_emitter_check_empty_document(emitter *yaml_emitter_t) bool {
        +	return false // [Go] Huh?
        +}
        +
        +// Check if the next events represent an empty sequence.
        +func yaml_emitter_check_empty_sequence(emitter *yaml_emitter_t) bool {
        +	if len(emitter.events)-emitter.events_head < 2 {
        +		return false
        +	}
        +	return emitter.events[emitter.events_head].typ == yaml_SEQUENCE_START_EVENT &&
        +		emitter.events[emitter.events_head+1].typ == yaml_SEQUENCE_END_EVENT
        +}
        +
        +// Check if the next events represent an empty mapping.
        +func yaml_emitter_check_empty_mapping(emitter *yaml_emitter_t) bool {
        +	if len(emitter.events)-emitter.events_head < 2 {
        +		return false
        +	}
        +	return emitter.events[emitter.events_head].typ == yaml_MAPPING_START_EVENT &&
        +		emitter.events[emitter.events_head+1].typ == yaml_MAPPING_END_EVENT
        +}
        +
        +// Check if the next node can be expressed as a simple key.
        +func yaml_emitter_check_simple_key(emitter *yaml_emitter_t) bool {
        +	length := 0
        +	switch emitter.events[emitter.events_head].typ {
        +	case yaml_ALIAS_EVENT:
        +		length += len(emitter.anchor_data.anchor)
        +	case yaml_SCALAR_EVENT:
        +		if emitter.scalar_data.multiline {
        +			return false
        +		}
        +		length += len(emitter.anchor_data.anchor) +
        +			len(emitter.tag_data.handle) +
        +			len(emitter.tag_data.suffix) +
        +			len(emitter.scalar_data.value)
        +	case yaml_SEQUENCE_START_EVENT:
        +		if !yaml_emitter_check_empty_sequence(emitter) {
        +			return false
        +		}
        +		length += len(emitter.anchor_data.anchor) +
        +			len(emitter.tag_data.handle) +
        +			len(emitter.tag_data.suffix)
        +	case yaml_MAPPING_START_EVENT:
        +		if !yaml_emitter_check_empty_mapping(emitter) {
        +			return false
        +		}
        +		length += len(emitter.anchor_data.anchor) +
        +			len(emitter.tag_data.handle) +
        +			len(emitter.tag_data.suffix)
        +	default:
        +		return false
        +	}
        +	return length <= 128
        +}
        +
        +// Determine an acceptable scalar style.
        +func yaml_emitter_select_scalar_style(emitter *yaml_emitter_t, event *yaml_event_t) bool {
        +
        +	no_tag := len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0
        +	if no_tag && !event.implicit && !event.quoted_implicit {
        +		return yaml_emitter_set_emitter_error(emitter, "neither tag nor implicit flags are specified")
        +	}
        +
        +	style := event.scalar_style()
        +	if style == yaml_ANY_SCALAR_STYLE {
        +		style = yaml_PLAIN_SCALAR_STYLE
        +	}
        +	if emitter.canonical {
        +		style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
        +	}
        +	if emitter.simple_key_context && emitter.scalar_data.multiline {
        +		style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
        +	}
        +
        +	if style == yaml_PLAIN_SCALAR_STYLE {
        +		if emitter.flow_level > 0 && !emitter.scalar_data.flow_plain_allowed ||
        +			emitter.flow_level == 0 && !emitter.scalar_data.block_plain_allowed {
        +			style = yaml_SINGLE_QUOTED_SCALAR_STYLE
        +		}
        +		if len(emitter.scalar_data.value) == 0 && (emitter.flow_level > 0 || emitter.simple_key_context) {
        +			style = yaml_SINGLE_QUOTED_SCALAR_STYLE
        +		}
        +		if no_tag && !event.implicit {
        +			style = yaml_SINGLE_QUOTED_SCALAR_STYLE
        +		}
        +	}
        +	if style == yaml_SINGLE_QUOTED_SCALAR_STYLE {
        +		if !emitter.scalar_data.single_quoted_allowed {
        +			style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
        +		}
        +	}
        +	if style == yaml_LITERAL_SCALAR_STYLE || style == yaml_FOLDED_SCALAR_STYLE {
        +		if !emitter.scalar_data.block_allowed || emitter.flow_level > 0 || emitter.simple_key_context {
        +			style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
        +		}
        +	}
        +
        +	if no_tag && !event.quoted_implicit && style != yaml_PLAIN_SCALAR_STYLE {
        +		emitter.tag_data.handle = []byte{'!'}
        +	}
        +	emitter.scalar_data.style = style
        +	return true
        +}
        +
        +// Write an anchor.
        +func yaml_emitter_process_anchor(emitter *yaml_emitter_t) bool {
        +	if emitter.anchor_data.anchor == nil {
        +		return true
        +	}
        +	c := []byte{'&'}
        +	if emitter.anchor_data.alias {
        +		c[0] = '*'
        +	}
        +	if !yaml_emitter_write_indicator(emitter, c, true, false, false) {
        +		return false
        +	}
        +	return yaml_emitter_write_anchor(emitter, emitter.anchor_data.anchor)
        +}
        +
        +// Write a tag.
        +func yaml_emitter_process_tag(emitter *yaml_emitter_t) bool {
        +	if len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 {
        +		return true
        +	}
        +	if len(emitter.tag_data.handle) > 0 {
        +		if !yaml_emitter_write_tag_handle(emitter, emitter.tag_data.handle) {
        +			return false
        +		}
        +		if len(emitter.tag_data.suffix) > 0 {
        +			if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) {
        +				return false
        +			}
        +		}
        +	} else {
        +		// [Go] Allocate these slices elsewhere.
        +		if !yaml_emitter_write_indicator(emitter, []byte("!<"), true, false, false) {
        +			return false
        +		}
        +		if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) {
        +			return false
        +		}
        +		if !yaml_emitter_write_indicator(emitter, []byte{'>'}, false, false, false) {
        +			return false
        +		}
        +	}
        +	return true
        +}
        +
        +// Write a scalar.
        +func yaml_emitter_process_scalar(emitter *yaml_emitter_t) bool {
        +	switch emitter.scalar_data.style {
        +	case yaml_PLAIN_SCALAR_STYLE:
        +		return yaml_emitter_write_plain_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context)
        +
        +	case yaml_SINGLE_QUOTED_SCALAR_STYLE:
        +		return yaml_emitter_write_single_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context)
        +
        +	case yaml_DOUBLE_QUOTED_SCALAR_STYLE:
        +		return yaml_emitter_write_double_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context)
        +
        +	case yaml_LITERAL_SCALAR_STYLE:
        +		return yaml_emitter_write_literal_scalar(emitter, emitter.scalar_data.value)
        +
        +	case yaml_FOLDED_SCALAR_STYLE:
        +		return yaml_emitter_write_folded_scalar(emitter, emitter.scalar_data.value)
        +	}
        +	panic("unknown scalar style")
        +}
        +
        +// Write a head comment.
        +func yaml_emitter_process_head_comment(emitter *yaml_emitter_t) bool {
        +	if len(emitter.tail_comment) > 0 {
        +		if !yaml_emitter_write_indent(emitter) {
        +			return false
        +		}
        +		if !yaml_emitter_write_comment(emitter, emitter.tail_comment) {
        +			return false
        +		}
        +		emitter.tail_comment = emitter.tail_comment[:0]
        +		emitter.foot_indent = emitter.indent
        +		if emitter.foot_indent < 0 {
        +			emitter.foot_indent = 0
        +		}
        +	}
        +
        +	if len(emitter.head_comment) == 0 {
        +		return true
        +	}
        +	if !yaml_emitter_write_indent(emitter) {
        +		return false
        +	}
        +	if !yaml_emitter_write_comment(emitter, emitter.head_comment) {
        +		return false
        +	}
        +	emitter.head_comment = emitter.head_comment[:0]
        +	return true
        +}
        +
        +// Write an line comment.
        +func yaml_emitter_process_line_comment(emitter *yaml_emitter_t) bool {
        +	if len(emitter.line_comment) == 0 {
        +		return true
        +	}
        +	if !emitter.whitespace {
        +		if !put(emitter, ' ') {
        +			return false
        +		}
        +	}
        +	if !yaml_emitter_write_comment(emitter, emitter.line_comment) {
        +		return false
        +	}
        +	emitter.line_comment = emitter.line_comment[:0]
        +	return true
        +}
        +
        +// Write a foot comment.
        +func yaml_emitter_process_foot_comment(emitter *yaml_emitter_t) bool {
        +	if len(emitter.foot_comment) == 0 {
        +		return true
        +	}
        +	if !yaml_emitter_write_indent(emitter) {
        +		return false
        +	}
        +	if !yaml_emitter_write_comment(emitter, emitter.foot_comment) {
        +		return false
        +	}
        +	emitter.foot_comment = emitter.foot_comment[:0]
        +	emitter.foot_indent = emitter.indent
        +	if emitter.foot_indent < 0 {
        +		emitter.foot_indent = 0
        +	}
        +	return true
        +}
        +
        +// Check if a %YAML directive is valid.
        +func yaml_emitter_analyze_version_directive(emitter *yaml_emitter_t, version_directive *yaml_version_directive_t) bool {
        +	if version_directive.major != 1 || version_directive.minor != 1 {
        +		return yaml_emitter_set_emitter_error(emitter, "incompatible %YAML directive")
        +	}
        +	return true
        +}
        +
        +// Check if a %TAG directive is valid.
        +func yaml_emitter_analyze_tag_directive(emitter *yaml_emitter_t, tag_directive *yaml_tag_directive_t) bool {
        +	handle := tag_directive.handle
        +	prefix := tag_directive.prefix
        +	if len(handle) == 0 {
        +		return yaml_emitter_set_emitter_error(emitter, "tag handle must not be empty")
        +	}
        +	if handle[0] != '!' {
        +		return yaml_emitter_set_emitter_error(emitter, "tag handle must start with '!'")
        +	}
        +	if handle[len(handle)-1] != '!' {
        +		return yaml_emitter_set_emitter_error(emitter, "tag handle must end with '!'")
        +	}
        +	for i := 1; i < len(handle)-1; i += width(handle[i]) {
        +		if !is_alpha(handle, i) {
        +			return yaml_emitter_set_emitter_error(emitter, "tag handle must contain alphanumerical characters only")
        +		}
        +	}
        +	if len(prefix) == 0 {
        +		return yaml_emitter_set_emitter_error(emitter, "tag prefix must not be empty")
        +	}
        +	return true
        +}
        +
        +// Check if an anchor is valid.
        +func yaml_emitter_analyze_anchor(emitter *yaml_emitter_t, anchor []byte, alias bool) bool {
        +	if len(anchor) == 0 {
        +		problem := "anchor value must not be empty"
        +		if alias {
        +			problem = "alias value must not be empty"
        +		}
        +		return yaml_emitter_set_emitter_error(emitter, problem)
        +	}
        +	for i := 0; i < len(anchor); i += width(anchor[i]) {
        +		if !is_alpha(anchor, i) {
        +			problem := "anchor value must contain alphanumerical characters only"
        +			if alias {
        +				problem = "alias value must contain alphanumerical characters only"
        +			}
        +			return yaml_emitter_set_emitter_error(emitter, problem)
        +		}
        +	}
        +	emitter.anchor_data.anchor = anchor
        +	emitter.anchor_data.alias = alias
        +	return true
        +}
        +
        +// Check if a tag is valid.
        +func yaml_emitter_analyze_tag(emitter *yaml_emitter_t, tag []byte) bool {
        +	if len(tag) == 0 {
        +		return yaml_emitter_set_emitter_error(emitter, "tag value must not be empty")
        +	}
        +	for i := 0; i < len(emitter.tag_directives); i++ {
        +		tag_directive := &emitter.tag_directives[i]
        +		if bytes.HasPrefix(tag, tag_directive.prefix) {
        +			emitter.tag_data.handle = tag_directive.handle
        +			emitter.tag_data.suffix = tag[len(tag_directive.prefix):]
        +			return true
        +		}
        +	}
        +	emitter.tag_data.suffix = tag
        +	return true
        +}
        +
        +// Check if a scalar is valid.
        +func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool {
        +	var (
        +		block_indicators   = false
        +		flow_indicators    = false
        +		line_breaks        = false
        +		special_characters = false
        +		tab_characters     = false
        +
        +		leading_space  = false
        +		leading_break  = false
        +		trailing_space = false
        +		trailing_break = false
        +		break_space    = false
        +		space_break    = false
        +
        +		preceded_by_whitespace = false
        +		followed_by_whitespace = false
        +		previous_space         = false
        +		previous_break         = false
        +	)
        +
        +	emitter.scalar_data.value = value
        +
        +	if len(value) == 0 {
        +		emitter.scalar_data.multiline = false
        +		emitter.scalar_data.flow_plain_allowed = false
        +		emitter.scalar_data.block_plain_allowed = true
        +		emitter.scalar_data.single_quoted_allowed = true
        +		emitter.scalar_data.block_allowed = false
        +		return true
        +	}
        +
        +	if len(value) >= 3 && ((value[0] == '-' && value[1] == '-' && value[2] == '-') || (value[0] == '.' && value[1] == '.' && value[2] == '.')) {
        +		block_indicators = true
        +		flow_indicators = true
        +	}
        +
        +	preceded_by_whitespace = true
        +	for i, w := 0, 0; i < len(value); i += w {
        +		w = width(value[i])
        +		followed_by_whitespace = i+w >= len(value) || is_blank(value, i+w)
        +
        +		if i == 0 {
        +			switch value[i] {
        +			case '#', ',', '[', ']', '{', '}', '&', '*', '!', '|', '>', '\'', '"', '%', '@', '`':
        +				flow_indicators = true
        +				block_indicators = true
        +			case '?', ':':
        +				flow_indicators = true
        +				if followed_by_whitespace {
        +					block_indicators = true
        +				}
        +			case '-':
        +				if followed_by_whitespace {
        +					flow_indicators = true
        +					block_indicators = true
        +				}
        +			}
        +		} else {
        +			switch value[i] {
        +			case ',', '?', '[', ']', '{', '}':
        +				flow_indicators = true
        +			case ':':
        +				flow_indicators = true
        +				if followed_by_whitespace {
        +					block_indicators = true
        +				}
        +			case '#':
        +				if preceded_by_whitespace {
        +					flow_indicators = true
        +					block_indicators = true
        +				}
        +			}
        +		}
        +
        +		if value[i] == '\t' {
        +			tab_characters = true
        +		} else if !is_printable(value, i) || !is_ascii(value, i) && !emitter.unicode {
        +			special_characters = true
        +		}
        +		if is_space(value, i) {
        +			if i == 0 {
        +				leading_space = true
        +			}
        +			if i+width(value[i]) == len(value) {
        +				trailing_space = true
        +			}
        +			if previous_break {
        +				break_space = true
        +			}
        +			previous_space = true
        +			previous_break = false
        +		} else if is_break(value, i) {
        +			line_breaks = true
        +			if i == 0 {
        +				leading_break = true
        +			}
        +			if i+width(value[i]) == len(value) {
        +				trailing_break = true
        +			}
        +			if previous_space {
        +				space_break = true
        +			}
        +			previous_space = false
        +			previous_break = true
        +		} else {
        +			previous_space = false
        +			previous_break = false
        +		}
        +
        +		// [Go]: Why 'z'? Couldn't be the end of the string as that's the loop condition.
        +		preceded_by_whitespace = is_blankz(value, i)
        +	}
        +
        +	emitter.scalar_data.multiline = line_breaks
        +	emitter.scalar_data.flow_plain_allowed = true
        +	emitter.scalar_data.block_plain_allowed = true
        +	emitter.scalar_data.single_quoted_allowed = true
        +	emitter.scalar_data.block_allowed = true
        +
        +	if leading_space || leading_break || trailing_space || trailing_break {
        +		emitter.scalar_data.flow_plain_allowed = false
        +		emitter.scalar_data.block_plain_allowed = false
        +	}
        +	if trailing_space {
        +		emitter.scalar_data.block_allowed = false
        +	}
        +	if break_space {
        +		emitter.scalar_data.flow_plain_allowed = false
        +		emitter.scalar_data.block_plain_allowed = false
        +		emitter.scalar_data.single_quoted_allowed = false
        +	}
        +	if space_break || tab_characters || special_characters {
        +		emitter.scalar_data.flow_plain_allowed = false
        +		emitter.scalar_data.block_plain_allowed = false
        +		emitter.scalar_data.single_quoted_allowed = false
        +	}
        +	if space_break || special_characters {
        +		emitter.scalar_data.block_allowed = false
        +	}
        +	if line_breaks {
        +		emitter.scalar_data.flow_plain_allowed = false
        +		emitter.scalar_data.block_plain_allowed = false
        +	}
        +	if flow_indicators {
        +		emitter.scalar_data.flow_plain_allowed = false
        +	}
        +	if block_indicators {
        +		emitter.scalar_data.block_plain_allowed = false
        +	}
        +	return true
        +}
        +
        +// Check if the event data is valid.
        +func yaml_emitter_analyze_event(emitter *yaml_emitter_t, event *yaml_event_t) bool {
        +
        +	emitter.anchor_data.anchor = nil
        +	emitter.tag_data.handle = nil
        +	emitter.tag_data.suffix = nil
        +	emitter.scalar_data.value = nil
        +
        +	if len(event.head_comment) > 0 {
        +		emitter.head_comment = event.head_comment
        +	}
        +	if len(event.line_comment) > 0 {
        +		emitter.line_comment = event.line_comment
        +	}
        +	if len(event.foot_comment) > 0 {
        +		emitter.foot_comment = event.foot_comment
        +	}
        +	if len(event.tail_comment) > 0 {
        +		emitter.tail_comment = event.tail_comment
        +	}
        +
        +	switch event.typ {
        +	case yaml_ALIAS_EVENT:
        +		if !yaml_emitter_analyze_anchor(emitter, event.anchor, true) {
        +			return false
        +		}
        +
        +	case yaml_SCALAR_EVENT:
        +		if len(event.anchor) > 0 {
        +			if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) {
        +				return false
        +			}
        +		}
        +		if len(event.tag) > 0 && (emitter.canonical || (!event.implicit && !event.quoted_implicit)) {
        +			if !yaml_emitter_analyze_tag(emitter, event.tag) {
        +				return false
        +			}
        +		}
        +		if !yaml_emitter_analyze_scalar(emitter, event.value) {
        +			return false
        +		}
        +
        +	case yaml_SEQUENCE_START_EVENT:
        +		if len(event.anchor) > 0 {
        +			if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) {
        +				return false
        +			}
        +		}
        +		if len(event.tag) > 0 && (emitter.canonical || !event.implicit) {
        +			if !yaml_emitter_analyze_tag(emitter, event.tag) {
        +				return false
        +			}
        +		}
        +
        +	case yaml_MAPPING_START_EVENT:
        +		if len(event.anchor) > 0 {
        +			if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) {
        +				return false
        +			}
        +		}
        +		if len(event.tag) > 0 && (emitter.canonical || !event.implicit) {
        +			if !yaml_emitter_analyze_tag(emitter, event.tag) {
        +				return false
        +			}
        +		}
        +	}
        +	return true
        +}
        +
        +// Write the BOM character.
        +func yaml_emitter_write_bom(emitter *yaml_emitter_t) bool {
        +	if !flush(emitter) {
        +		return false
        +	}
        +	pos := emitter.buffer_pos
        +	emitter.buffer[pos+0] = '\xEF'
        +	emitter.buffer[pos+1] = '\xBB'
        +	emitter.buffer[pos+2] = '\xBF'
        +	emitter.buffer_pos += 3
        +	return true
        +}
        +
        +func yaml_emitter_write_indent(emitter *yaml_emitter_t) bool {
        +	indent := emitter.indent
        +	if indent < 0 {
        +		indent = 0
        +	}
        +	if !emitter.indention || emitter.column > indent || (emitter.column == indent && !emitter.whitespace) {
        +		if !put_break(emitter) {
        +			return false
        +		}
        +	}
        +	if emitter.foot_indent == indent {
        +		if !put_break(emitter) {
        +			return false
        +		}
        +	}
        +	for emitter.column < indent {
        +		if !put(emitter, ' ') {
        +			return false
        +		}
        +	}
        +	emitter.whitespace = true
        +	//emitter.indention = true
        +	emitter.space_above = false
        +	emitter.foot_indent = -1
        +	return true
        +}
        +
        +func yaml_emitter_write_indicator(emitter *yaml_emitter_t, indicator []byte, need_whitespace, is_whitespace, is_indention bool) bool {
        +	if need_whitespace && !emitter.whitespace {
        +		if !put(emitter, ' ') {
        +			return false
        +		}
        +	}
        +	if !write_all(emitter, indicator) {
        +		return false
        +	}
        +	emitter.whitespace = is_whitespace
        +	emitter.indention = (emitter.indention && is_indention)
        +	emitter.open_ended = false
        +	return true
        +}
        +
        +func yaml_emitter_write_anchor(emitter *yaml_emitter_t, value []byte) bool {
        +	if !write_all(emitter, value) {
        +		return false
        +	}
        +	emitter.whitespace = false
        +	emitter.indention = false
        +	return true
        +}
        +
        +func yaml_emitter_write_tag_handle(emitter *yaml_emitter_t, value []byte) bool {
        +	if !emitter.whitespace {
        +		if !put(emitter, ' ') {
        +			return false
        +		}
        +	}
        +	if !write_all(emitter, value) {
        +		return false
        +	}
        +	emitter.whitespace = false
        +	emitter.indention = false
        +	return true
        +}
        +
        +func yaml_emitter_write_tag_content(emitter *yaml_emitter_t, value []byte, need_whitespace bool) bool {
        +	if need_whitespace && !emitter.whitespace {
        +		if !put(emitter, ' ') {
        +			return false
        +		}
        +	}
        +	for i := 0; i < len(value); {
        +		var must_write bool
        +		switch value[i] {
        +		case ';', '/', '?', ':', '@', '&', '=', '+', '$', ',', '_', '.', '~', '*', '\'', '(', ')', '[', ']':
        +			must_write = true
        +		default:
        +			must_write = is_alpha(value, i)
        +		}
        +		if must_write {
        +			if !write(emitter, value, &i) {
        +				return false
        +			}
        +		} else {
        +			w := width(value[i])
        +			for k := 0; k < w; k++ {
        +				octet := value[i]
        +				i++
        +				if !put(emitter, '%') {
        +					return false
        +				}
        +
        +				c := octet >> 4
        +				if c < 10 {
        +					c += '0'
        +				} else {
        +					c += 'A' - 10
        +				}
        +				if !put(emitter, c) {
        +					return false
        +				}
        +
        +				c = octet & 0x0f
        +				if c < 10 {
        +					c += '0'
        +				} else {
        +					c += 'A' - 10
        +				}
        +				if !put(emitter, c) {
        +					return false
        +				}
        +			}
        +		}
        +	}
        +	emitter.whitespace = false
        +	emitter.indention = false
        +	return true
        +}
        +
        +func yaml_emitter_write_plain_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool {
        +	if len(value) > 0 && !emitter.whitespace {
        +		if !put(emitter, ' ') {
        +			return false
        +		}
        +	}
        +
        +	spaces := false
        +	breaks := false
        +	for i := 0; i < len(value); {
        +		if is_space(value, i) {
        +			if allow_breaks && !spaces && emitter.column > emitter.best_width && !is_space(value, i+1) {
        +				if !yaml_emitter_write_indent(emitter) {
        +					return false
        +				}
        +				i += width(value[i])
        +			} else {
        +				if !write(emitter, value, &i) {
        +					return false
        +				}
        +			}
        +			spaces = true
        +		} else if is_break(value, i) {
        +			if !breaks && value[i] == '\n' {
        +				if !put_break(emitter) {
        +					return false
        +				}
        +			}
        +			if !write_break(emitter, value, &i) {
        +				return false
        +			}
        +			//emitter.indention = true
        +			breaks = true
        +		} else {
        +			if breaks {
        +				if !yaml_emitter_write_indent(emitter) {
        +					return false
        +				}
        +			}
        +			if !write(emitter, value, &i) {
        +				return false
        +			}
        +			emitter.indention = false
        +			spaces = false
        +			breaks = false
        +		}
        +	}
        +
        +	if len(value) > 0 {
        +		emitter.whitespace = false
        +	}
        +	emitter.indention = false
        +	if emitter.root_context {
        +		emitter.open_ended = true
        +	}
        +
        +	return true
        +}
        +
        +func yaml_emitter_write_single_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool {
        +
        +	if !yaml_emitter_write_indicator(emitter, []byte{'\''}, true, false, false) {
        +		return false
        +	}
        +
        +	spaces := false
        +	breaks := false
        +	for i := 0; i < len(value); {
        +		if is_space(value, i) {
        +			if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 && !is_space(value, i+1) {
        +				if !yaml_emitter_write_indent(emitter) {
        +					return false
        +				}
        +				i += width(value[i])
        +			} else {
        +				if !write(emitter, value, &i) {
        +					return false
        +				}
        +			}
        +			spaces = true
        +		} else if is_break(value, i) {
        +			if !breaks && value[i] == '\n' {
        +				if !put_break(emitter) {
        +					return false
        +				}
        +			}
        +			if !write_break(emitter, value, &i) {
        +				return false
        +			}
        +			//emitter.indention = true
        +			breaks = true
        +		} else {
        +			if breaks {
        +				if !yaml_emitter_write_indent(emitter) {
        +					return false
        +				}
        +			}
        +			if value[i] == '\'' {
        +				if !put(emitter, '\'') {
        +					return false
        +				}
        +			}
        +			if !write(emitter, value, &i) {
        +				return false
        +			}
        +			emitter.indention = false
        +			spaces = false
        +			breaks = false
        +		}
        +	}
        +	if !yaml_emitter_write_indicator(emitter, []byte{'\''}, false, false, false) {
        +		return false
        +	}
        +	emitter.whitespace = false
        +	emitter.indention = false
        +	return true
        +}
        +
        +func yaml_emitter_write_double_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool {
        +	spaces := false
        +	if !yaml_emitter_write_indicator(emitter, []byte{'"'}, true, false, false) {
        +		return false
        +	}
        +
        +	for i := 0; i < len(value); {
        +		if !is_printable(value, i) || (!emitter.unicode && !is_ascii(value, i)) ||
        +			is_bom(value, i) || is_break(value, i) ||
        +			value[i] == '"' || value[i] == '\\' {
        +
        +			octet := value[i]
        +
        +			var w int
        +			var v rune
        +			switch {
        +			case octet&0x80 == 0x00:
        +				w, v = 1, rune(octet&0x7F)
        +			case octet&0xE0 == 0xC0:
        +				w, v = 2, rune(octet&0x1F)
        +			case octet&0xF0 == 0xE0:
        +				w, v = 3, rune(octet&0x0F)
        +			case octet&0xF8 == 0xF0:
        +				w, v = 4, rune(octet&0x07)
        +			}
        +			for k := 1; k < w; k++ {
        +				octet = value[i+k]
        +				v = (v << 6) + (rune(octet) & 0x3F)
        +			}
        +			i += w
        +
        +			if !put(emitter, '\\') {
        +				return false
        +			}
        +
        +			var ok bool
        +			switch v {
        +			case 0x00:
        +				ok = put(emitter, '0')
        +			case 0x07:
        +				ok = put(emitter, 'a')
        +			case 0x08:
        +				ok = put(emitter, 'b')
        +			case 0x09:
        +				ok = put(emitter, 't')
        +			case 0x0A:
        +				ok = put(emitter, 'n')
        +			case 0x0b:
        +				ok = put(emitter, 'v')
        +			case 0x0c:
        +				ok = put(emitter, 'f')
        +			case 0x0d:
        +				ok = put(emitter, 'r')
        +			case 0x1b:
        +				ok = put(emitter, 'e')
        +			case 0x22:
        +				ok = put(emitter, '"')
        +			case 0x5c:
        +				ok = put(emitter, '\\')
        +			case 0x85:
        +				ok = put(emitter, 'N')
        +			case 0xA0:
        +				ok = put(emitter, '_')
        +			case 0x2028:
        +				ok = put(emitter, 'L')
        +			case 0x2029:
        +				ok = put(emitter, 'P')
        +			default:
        +				if v <= 0xFF {
        +					ok = put(emitter, 'x')
        +					w = 2
        +				} else if v <= 0xFFFF {
        +					ok = put(emitter, 'u')
        +					w = 4
        +				} else {
        +					ok = put(emitter, 'U')
        +					w = 8
        +				}
        +				for k := (w - 1) * 4; ok && k >= 0; k -= 4 {
        +					digit := byte((v >> uint(k)) & 0x0F)
        +					if digit < 10 {
        +						ok = put(emitter, digit+'0')
        +					} else {
        +						ok = put(emitter, digit+'A'-10)
        +					}
        +				}
        +			}
        +			if !ok {
        +				return false
        +			}
        +			spaces = false
        +		} else if is_space(value, i) {
        +			if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 {
        +				if !yaml_emitter_write_indent(emitter) {
        +					return false
        +				}
        +				if is_space(value, i+1) {
        +					if !put(emitter, '\\') {
        +						return false
        +					}
        +				}
        +				i += width(value[i])
        +			} else if !write(emitter, value, &i) {
        +				return false
        +			}
        +			spaces = true
        +		} else {
        +			if !write(emitter, value, &i) {
        +				return false
        +			}
        +			spaces = false
        +		}
        +	}
        +	if !yaml_emitter_write_indicator(emitter, []byte{'"'}, false, false, false) {
        +		return false
        +	}
        +	emitter.whitespace = false
        +	emitter.indention = false
        +	return true
        +}
        +
        +func yaml_emitter_write_block_scalar_hints(emitter *yaml_emitter_t, value []byte) bool {
        +	if is_space(value, 0) || is_break(value, 0) {
        +		indent_hint := []byte{'0' + byte(emitter.best_indent)}
        +		if !yaml_emitter_write_indicator(emitter, indent_hint, false, false, false) {
        +			return false
        +		}
        +	}
        +
        +	emitter.open_ended = false
        +
        +	var chomp_hint [1]byte
        +	if len(value) == 0 {
        +		chomp_hint[0] = '-'
        +	} else {
        +		i := len(value) - 1
        +		for value[i]&0xC0 == 0x80 {
        +			i--
        +		}
        +		if !is_break(value, i) {
        +			chomp_hint[0] = '-'
        +		} else if i == 0 {
        +			chomp_hint[0] = '+'
        +			emitter.open_ended = true
        +		} else {
        +			i--
        +			for value[i]&0xC0 == 0x80 {
        +				i--
        +			}
        +			if is_break(value, i) {
        +				chomp_hint[0] = '+'
        +				emitter.open_ended = true
        +			}
        +		}
        +	}
        +	if chomp_hint[0] != 0 {
        +		if !yaml_emitter_write_indicator(emitter, chomp_hint[:], false, false, false) {
        +			return false
        +		}
        +	}
        +	return true
        +}
        +
        +func yaml_emitter_write_literal_scalar(emitter *yaml_emitter_t, value []byte) bool {
        +	if !yaml_emitter_write_indicator(emitter, []byte{'|'}, true, false, false) {
        +		return false
        +	}
        +	if !yaml_emitter_write_block_scalar_hints(emitter, value) {
        +		return false
        +	}
        +	if !put_break(emitter) {
        +		return false
        +	}
        +	//emitter.indention = true
        +	emitter.whitespace = true
        +	breaks := true
        +	for i := 0; i < len(value); {
        +		if is_break(value, i) {
        +			if !write_break(emitter, value, &i) {
        +				return false
        +			}
        +			//emitter.indention = true
        +			breaks = true
        +		} else {
        +			if breaks {
        +				if !yaml_emitter_write_indent(emitter) {
        +					return false
        +				}
        +			}
        +			if !write(emitter, value, &i) {
        +				return false
        +			}
        +			emitter.indention = false
        +			breaks = false
        +		}
        +	}
        +
        +	return true
        +}
        +
        +func yaml_emitter_write_folded_scalar(emitter *yaml_emitter_t, value []byte) bool {
        +	if !yaml_emitter_write_indicator(emitter, []byte{'>'}, true, false, false) {
        +		return false
        +	}
        +	if !yaml_emitter_write_block_scalar_hints(emitter, value) {
        +		return false
        +	}
        +
        +	if !put_break(emitter) {
        +		return false
        +	}
        +	//emitter.indention = true
        +	emitter.whitespace = true
        +
        +	breaks := true
        +	leading_spaces := true
        +	for i := 0; i < len(value); {
        +		if is_break(value, i) {
        +			if !breaks && !leading_spaces && value[i] == '\n' {
        +				k := 0
        +				for is_break(value, k) {
        +					k += width(value[k])
        +				}
        +				if !is_blankz(value, k) {
        +					if !put_break(emitter) {
        +						return false
        +					}
        +				}
        +			}
        +			if !write_break(emitter, value, &i) {
        +				return false
        +			}
        +			//emitter.indention = true
        +			breaks = true
        +		} else {
        +			if breaks {
        +				if !yaml_emitter_write_indent(emitter) {
        +					return false
        +				}
        +				leading_spaces = is_blank(value, i)
        +			}
        +			if !breaks && is_space(value, i) && !is_space(value, i+1) && emitter.column > emitter.best_width {
        +				if !yaml_emitter_write_indent(emitter) {
        +					return false
        +				}
        +				i += width(value[i])
        +			} else {
        +				if !write(emitter, value, &i) {
        +					return false
        +				}
        +			}
        +			emitter.indention = false
        +			breaks = false
        +		}
        +	}
        +	return true
        +}
        +
        +func yaml_emitter_write_comment(emitter *yaml_emitter_t, comment []byte) bool {
        +	breaks := false
        +	pound := false
        +	for i := 0; i < len(comment); {
        +		if is_break(comment, i) {
        +			if !write_break(emitter, comment, &i) {
        +				return false
        +			}
        +			//emitter.indention = true
        +			breaks = true
        +			pound = false
        +		} else {
        +			if breaks && !yaml_emitter_write_indent(emitter) {
        +				return false
        +			}
        +			if !pound {
        +				if comment[i] != '#' && (!put(emitter, '#') || !put(emitter, ' ')) {
        +					return false
        +				}
        +				pound = true
        +			}
        +			if !write(emitter, comment, &i) {
        +				return false
        +			}
        +			emitter.indention = false
        +			breaks = false
        +		}
        +	}
        +	if !breaks && !put_break(emitter) {
        +		return false
        +	}
        +
        +	emitter.whitespace = true
        +	//emitter.indention = true
        +	return true
        +}
        diff --git a/vendor/gopkg.in/yaml.v3/encode.go b/vendor/gopkg.in/yaml.v3/encode.go
        new file mode 100644
        index 000000000..1f37271ce
        --- /dev/null
        +++ b/vendor/gopkg.in/yaml.v3/encode.go
        @@ -0,0 +1,561 @@
        +//
        +// Copyright (c) 2011-2019 Canonical Ltd
        +//
        +// Licensed under the Apache License, Version 2.0 (the "License");
        +// you may not use this file except in compliance with the License.
        +// You may obtain a copy of the License at
        +//
        +//     http://www.apache.org/licenses/LICENSE-2.0
        +//
        +// Unless required by applicable law or agreed to in writing, software
        +// distributed under the License is distributed on an "AS IS" BASIS,
        +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        +// See the License for the specific language governing permissions and
        +// limitations under the License.
        +
        +package yaml
        +
        +import (
        +	"encoding"
        +	"fmt"
        +	"io"
        +	"reflect"
        +	"regexp"
        +	"sort"
        +	"strconv"
        +	"strings"
        +	"time"
        +	"unicode/utf8"
        +)
        +
        +type encoder struct {
        +	emitter  yaml_emitter_t
        +	event    yaml_event_t
        +	out      []byte
        +	flow     bool
        +	indent   int
        +	doneInit bool
        +}
        +
        +func newEncoder() *encoder {
        +	e := &encoder{}
        +	yaml_emitter_initialize(&e.emitter)
        +	yaml_emitter_set_output_string(&e.emitter, &e.out)
        +	yaml_emitter_set_unicode(&e.emitter, true)
        +	return e
        +}
        +
        +func newEncoderWithWriter(w io.Writer) *encoder {
        +	e := &encoder{}
        +	yaml_emitter_initialize(&e.emitter)
        +	yaml_emitter_set_output_writer(&e.emitter, w)
        +	yaml_emitter_set_unicode(&e.emitter, true)
        +	return e
        +}
        +
        +func (e *encoder) init() {
        +	if e.doneInit {
        +		return
        +	}
        +	if e.indent == 0 {
        +		e.indent = 4
        +	}
        +	e.emitter.best_indent = e.indent
        +	yaml_stream_start_event_initialize(&e.event, yaml_UTF8_ENCODING)
        +	e.emit()
        +	e.doneInit = true
        +}
        +
        +func (e *encoder) finish() {
        +	e.emitter.open_ended = false
        +	yaml_stream_end_event_initialize(&e.event)
        +	e.emit()
        +}
        +
        +func (e *encoder) destroy() {
        +	yaml_emitter_delete(&e.emitter)
        +}
        +
        +func (e *encoder) emit() {
        +	// This will internally delete the e.event value.
        +	e.must(yaml_emitter_emit(&e.emitter, &e.event))
        +}
        +
        +func (e *encoder) must(ok bool) {
        +	if !ok {
        +		msg := e.emitter.problem
        +		if msg == "" {
        +			msg = "unknown problem generating YAML content"
        +		}
        +		failf("%s", msg)
        +	}
        +}
        +
        +func (e *encoder) marshalDoc(tag string, in reflect.Value) {
        +	e.init()
        +	var node *Node
        +	if in.IsValid() {
        +		node, _ = in.Interface().(*Node)
        +	}
        +	if node != nil && node.Kind == DocumentNode {
        +		e.nodev(in)
        +	} else {
        +		yaml_document_start_event_initialize(&e.event, nil, nil, true)
        +		e.emit()
        +		e.marshal(tag, in)
        +		yaml_document_end_event_initialize(&e.event, true)
        +		e.emit()
        +	}
        +}
        +
        +func (e *encoder) marshal(tag string, in reflect.Value) {
        +	tag = shortTag(tag)
        +	if !in.IsValid() || in.Kind() == reflect.Ptr && in.IsNil() {
        +		e.nilv()
        +		return
        +	}
        +	iface := in.Interface()
        +	switch value := iface.(type) {
        +	case *Node:
        +		e.nodev(in)
        +		return
        +	case time.Time:
        +		e.timev(tag, in)
        +		return
        +	case *time.Time:
        +		e.timev(tag, in.Elem())
        +		return
        +	case time.Duration:
        +		e.stringv(tag, reflect.ValueOf(value.String()))
        +		return
        +	case Marshaler:
        +		v, err := value.MarshalYAML()
        +		if err != nil {
        +			fail(err)
        +		}
        +		if v == nil {
        +			e.nilv()
        +			return
        +		}
        +		e.marshal(tag, reflect.ValueOf(v))
        +		return
        +	case encoding.TextMarshaler:
        +		text, err := value.MarshalText()
        +		if err != nil {
        +			fail(err)
        +		}
        +		in = reflect.ValueOf(string(text))
        +	case nil:
        +		e.nilv()
        +		return
        +	}
        +	switch in.Kind() {
        +	case reflect.Interface:
        +		e.marshal(tag, in.Elem())
        +	case reflect.Map:
        +		e.mapv(tag, in)
        +	case reflect.Ptr:
        +		e.marshal(tag, in.Elem())
        +	case reflect.Struct:
        +		e.structv(tag, in)
        +	case reflect.Slice, reflect.Array:
        +		e.slicev(tag, in)
        +	case reflect.String:
        +		e.stringv(tag, in)
        +	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
        +		e.intv(tag, in)
        +	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
        +		e.uintv(tag, in)
        +	case reflect.Float32, reflect.Float64:
        +		e.floatv(tag, in)
        +	case reflect.Bool:
        +		e.boolv(tag, in)
        +	default:
        +		panic("cannot marshal type: " + in.Type().String())
        +	}
        +}
        +
        +func (e *encoder) mapv(tag string, in reflect.Value) {
        +	e.mappingv(tag, func() {
        +		keys := keyList(in.MapKeys())
        +		sort.Sort(keys)
        +		for _, k := range keys {
        +			e.marshal("", k)
        +			e.marshal("", in.MapIndex(k))
        +		}
        +	})
        +}
        +
        +func (e *encoder) fieldByIndex(v reflect.Value, index []int) (field reflect.Value) {
        +	for _, num := range index {
        +		for {
        +			if v.Kind() == reflect.Ptr {
        +				if v.IsNil() {
        +					return reflect.Value{}
        +				}
        +				v = v.Elem()
        +				continue
        +			}
        +			break
        +		}
        +		v = v.Field(num)
        +	}
        +	return v
        +}
        +
        +func (e *encoder) structv(tag string, in reflect.Value) {
        +	sinfo, err := getStructInfo(in.Type())
        +	if err != nil {
        +		panic(err)
        +	}
        +	e.mappingv(tag, func() {
        +		for _, info := range sinfo.FieldsList {
        +			var value reflect.Value
        +			if info.Inline == nil {
        +				value = in.Field(info.Num)
        +			} else {
        +				value = e.fieldByIndex(in, info.Inline)
        +				if !value.IsValid() {
        +					continue
        +				}
        +			}
        +			if info.OmitEmpty && isZero(value) {
        +				continue
        +			}
        +			e.marshal("", reflect.ValueOf(info.Key))
        +			e.flow = info.Flow
        +			e.marshal("", value)
        +		}
        +		if sinfo.InlineMap >= 0 {
        +			m := in.Field(sinfo.InlineMap)
        +			if m.Len() > 0 {
        +				e.flow = false
        +				keys := keyList(m.MapKeys())
        +				sort.Sort(keys)
        +				for _, k := range keys {
        +					if _, found := sinfo.FieldsMap[k.String()]; found {
        +						panic(fmt.Sprintf("cannot have key %q in inlined map: conflicts with struct field", k.String()))
        +					}
        +					e.marshal("", k)
        +					e.flow = false
        +					e.marshal("", m.MapIndex(k))
        +				}
        +			}
        +		}
        +	})
        +}
        +
        +func (e *encoder) mappingv(tag string, f func()) {
        +	implicit := tag == ""
        +	style := yaml_BLOCK_MAPPING_STYLE
        +	if e.flow {
        +		e.flow = false
        +		style = yaml_FLOW_MAPPING_STYLE
        +	}
        +	yaml_mapping_start_event_initialize(&e.event, nil, []byte(tag), implicit, style)
        +	e.emit()
        +	f()
        +	yaml_mapping_end_event_initialize(&e.event)
        +	e.emit()
        +}
        +
        +func (e *encoder) slicev(tag string, in reflect.Value) {
        +	implicit := tag == ""
        +	style := yaml_BLOCK_SEQUENCE_STYLE
        +	if e.flow {
        +		e.flow = false
        +		style = yaml_FLOW_SEQUENCE_STYLE
        +	}
        +	e.must(yaml_sequence_start_event_initialize(&e.event, nil, []byte(tag), implicit, style))
        +	e.emit()
        +	n := in.Len()
        +	for i := 0; i < n; i++ {
        +		e.marshal("", in.Index(i))
        +	}
        +	e.must(yaml_sequence_end_event_initialize(&e.event))
        +	e.emit()
        +}
        +
        +// isBase60 returns whether s is in base 60 notation as defined in YAML 1.1.
        +//
        +// The base 60 float notation in YAML 1.1 is a terrible idea and is unsupported
        +// in YAML 1.2 and by this package, but these should be marshalled quoted for
        +// the time being for compatibility with other parsers.
        +func isBase60Float(s string) (result bool) {
        +	// Fast path.
        +	if s == "" {
        +		return false
        +	}
        +	c := s[0]
        +	if !(c == '+' || c == '-' || c >= '0' && c <= '9') || strings.IndexByte(s, ':') < 0 {
        +		return false
        +	}
        +	// Do the full match.
        +	return base60float.MatchString(s)
        +}
        +
        +// From http://yaml.org/type/float.html, except the regular expression there
        +// is bogus. In practice parsers do not enforce the "\.[0-9_]*" suffix.
        +var base60float = regexp.MustCompile(`^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+(?:\.[0-9_]*)?$`)
        +
        +// isOldBool returns whether s is bool notation as defined in YAML 1.1.
        +//
        +// We continue to force strings that YAML 1.1 would interpret as booleans to be
        +// rendered as quotes strings so that the marshalled output valid for YAML 1.1
        +// parsing.
        +func isOldBool(s string) (result bool) {
        +	switch s {
        +	case "y", "Y", "yes", "Yes", "YES", "on", "On", "ON",
        +		"n", "N", "no", "No", "NO", "off", "Off", "OFF":
        +		return true
        +	default:
        +		return false
        +	}
        +}
        +
        +func (e *encoder) stringv(tag string, in reflect.Value) {
        +	var style yaml_scalar_style_t
        +	s := in.String()
        +	canUsePlain := true
        +	switch {
        +	case !utf8.ValidString(s):
        +		if tag == binaryTag {
        +			failf("explicitly tagged !!binary data must be base64-encoded")
        +		}
        +		if tag != "" {
        +			failf("cannot marshal invalid UTF-8 data as %s", shortTag(tag))
        +		}
        +		// It can't be encoded directly as YAML so use a binary tag
        +		// and encode it as base64.
        +		tag = binaryTag
        +		s = encodeBase64(s)
        +	case tag == "":
        +		// Check to see if it would resolve to a specific
        +		// tag when encoded unquoted. If it doesn't,
        +		// there's no need to quote it.
        +		rtag, _ := resolve("", s)
        +		canUsePlain = rtag == strTag && !(isBase60Float(s) || isOldBool(s))
        +	}
        +	// Note: it's possible for user code to emit invalid YAML
        +	// if they explicitly specify a tag and a string containing
        +	// text that's incompatible with that tag.
        +	switch {
        +	case strings.Contains(s, "\n"):
        +		if e.flow {
        +			style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
        +		} else {
        +			style = yaml_LITERAL_SCALAR_STYLE
        +		}
        +	case canUsePlain:
        +		style = yaml_PLAIN_SCALAR_STYLE
        +	default:
        +		style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
        +	}
        +	e.emitScalar(s, "", tag, style, nil, nil, nil, nil)
        +}
        +
        +func (e *encoder) boolv(tag string, in reflect.Value) {
        +	var s string
        +	if in.Bool() {
        +		s = "true"
        +	} else {
        +		s = "false"
        +	}
        +	e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil)
        +}
        +
        +func (e *encoder) intv(tag string, in reflect.Value) {
        +	s := strconv.FormatInt(in.Int(), 10)
        +	e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil)
        +}
        +
        +func (e *encoder) uintv(tag string, in reflect.Value) {
        +	s := strconv.FormatUint(in.Uint(), 10)
        +	e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil)
        +}
        +
        +func (e *encoder) timev(tag string, in reflect.Value) {
        +	t := in.Interface().(time.Time)
        +	s := t.Format(time.RFC3339Nano)
        +	e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil)
        +}
        +
        +func (e *encoder) floatv(tag string, in reflect.Value) {
        +	// Issue #352: When formatting, use the precision of the underlying value
        +	precision := 64
        +	if in.Kind() == reflect.Float32 {
        +		precision = 32
        +	}
        +
        +	s := strconv.FormatFloat(in.Float(), 'g', -1, precision)
        +	switch s {
        +	case "+Inf":
        +		s = ".inf"
        +	case "-Inf":
        +		s = "-.inf"
        +	case "NaN":
        +		s = ".nan"
        +	}
        +	e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil)
        +}
        +
        +func (e *encoder) nilv() {
        +	e.emitScalar("null", "", "", yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil)
        +}
        +
        +func (e *encoder) emitScalar(value, anchor, tag string, style yaml_scalar_style_t, head, line, foot, tail []byte) {
        +	// TODO Kill this function. Replace all initialize calls by their underlining Go literals.
        +	implicit := tag == ""
        +	if !implicit {
        +		tag = longTag(tag)
        +	}
        +	e.must(yaml_scalar_event_initialize(&e.event, []byte(anchor), []byte(tag), []byte(value), implicit, implicit, style))
        +	e.event.head_comment = head
        +	e.event.line_comment = line
        +	e.event.foot_comment = foot
        +	e.event.tail_comment = tail
        +	e.emit()
        +}
        +
        +func (e *encoder) nodev(in reflect.Value) {
        +	e.node(in.Interface().(*Node), "")
        +}
        +
        +func (e *encoder) node(node *Node, tail string) {
        +	// If the tag was not explicitly requested, and dropping it won't change the
        +	// implicit tag of the value, don't include it in the presentation.
        +	var tag = node.Tag
        +	var stag = shortTag(tag)
        +	var rtag string
        +	var forceQuoting bool
        +	if tag != "" && node.Style&TaggedStyle == 0 {
        +		if node.Kind == ScalarNode {
        +			if stag == strTag && node.Style&(SingleQuotedStyle|DoubleQuotedStyle|LiteralStyle|FoldedStyle) != 0 {
        +				tag = ""
        +			} else {
        +				rtag, _ = resolve("", node.Value)
        +				if rtag == stag {
        +					tag = ""
        +				} else if stag == strTag {
        +					tag = ""
        +					forceQuoting = true
        +				}
        +			}
        +		} else {
        +			switch node.Kind {
        +			case MappingNode:
        +				rtag = mapTag
        +			case SequenceNode:
        +				rtag = seqTag
        +			}
        +			if rtag == stag {
        +				tag = ""
        +			}
        +		}
        +	}
        +
        +	switch node.Kind {
        +	case DocumentNode:
        +		yaml_document_start_event_initialize(&e.event, nil, nil, true)
        +		e.event.head_comment = []byte(node.HeadComment)
        +		e.emit()
        +		for _, node := range node.Content {
        +			e.node(node, "")
        +		}
        +		yaml_document_end_event_initialize(&e.event, true)
        +		e.event.foot_comment = []byte(node.FootComment)
        +		e.emit()
        +
        +	case SequenceNode:
        +		style := yaml_BLOCK_SEQUENCE_STYLE
        +		if node.Style&FlowStyle != 0 {
        +			style = yaml_FLOW_SEQUENCE_STYLE
        +		}
        +		e.must(yaml_sequence_start_event_initialize(&e.event, []byte(node.Anchor), []byte(tag), tag == "", style))
        +		e.event.head_comment = []byte(node.HeadComment)
        +		e.emit()
        +		for _, node := range node.Content {
        +			e.node(node, "")
        +		}
        +		e.must(yaml_sequence_end_event_initialize(&e.event))
        +		e.event.line_comment = []byte(node.LineComment)
        +		e.event.foot_comment = []byte(node.FootComment)
        +		e.emit()
        +
        +	case MappingNode:
        +		style := yaml_BLOCK_MAPPING_STYLE
        +		if node.Style&FlowStyle != 0 {
        +			style = yaml_FLOW_MAPPING_STYLE
        +		}
        +		yaml_mapping_start_event_initialize(&e.event, []byte(node.Anchor), []byte(tag), tag == "", style)
        +		e.event.tail_comment = []byte(tail)
        +		e.event.head_comment = []byte(node.HeadComment)
        +		e.emit()
        +
        +		// The tail logic below moves the foot comment of prior keys to the following key,
        +		// since the value for each key may be a nested structure and the foot needs to be
        +		// processed only the entirety of the value is streamed. The last tail is processed
        +		// with the mapping end event.
        +		var tail string
        +		for i := 0; i+1 < len(node.Content); i += 2 {
        +			k := node.Content[i]
        +			foot := k.FootComment
        +			if foot != "" {
        +				kopy := *k
        +				kopy.FootComment = ""
        +				k = &kopy
        +			}
        +			e.node(k, tail)
        +			tail = foot
        +
        +			v := node.Content[i+1]
        +			e.node(v, "")
        +		}
        +
        +		yaml_mapping_end_event_initialize(&e.event)
        +		e.event.tail_comment = []byte(tail)
        +		e.event.line_comment = []byte(node.LineComment)
        +		e.event.foot_comment = []byte(node.FootComment)
        +		e.emit()
        +
        +	case AliasNode:
        +		yaml_alias_event_initialize(&e.event, []byte(node.Value))
        +		e.event.head_comment = []byte(node.HeadComment)
        +		e.event.line_comment = []byte(node.LineComment)
        +		e.event.foot_comment = []byte(node.FootComment)
        +		e.emit()
        +
        +	case ScalarNode:
        +		value := node.Value
        +		if !utf8.ValidString(value) {
        +			if tag == binaryTag {
        +				failf("explicitly tagged !!binary data must be base64-encoded")
        +			}
        +			if tag != "" {
        +				failf("cannot marshal invalid UTF-8 data as %s", shortTag(tag))
        +			}
        +			// It can't be encoded directly as YAML so use a binary tag
        +			// and encode it as base64.
        +			tag = binaryTag
        +			value = encodeBase64(value)
        +		}
        +
        +		style := yaml_PLAIN_SCALAR_STYLE
        +		switch {
        +		case node.Style&DoubleQuotedStyle != 0:
        +			style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
        +		case node.Style&SingleQuotedStyle != 0:
        +			style = yaml_SINGLE_QUOTED_SCALAR_STYLE
        +		case node.Style&LiteralStyle != 0:
        +			style = yaml_LITERAL_SCALAR_STYLE
        +		case node.Style&FoldedStyle != 0:
        +			style = yaml_FOLDED_SCALAR_STYLE
        +		case strings.Contains(value, "\n"):
        +			style = yaml_LITERAL_SCALAR_STYLE
        +		case forceQuoting:
        +			style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
        +		}
        +
        +		e.emitScalar(value, node.Anchor, tag, style, []byte(node.HeadComment), []byte(node.LineComment), []byte(node.FootComment), []byte(tail))
        +	}
        +}
        diff --git a/vendor/gopkg.in/yaml.v3/go.mod b/vendor/gopkg.in/yaml.v3/go.mod
        new file mode 100644
        index 000000000..f407ea321
        --- /dev/null
        +++ b/vendor/gopkg.in/yaml.v3/go.mod
        @@ -0,0 +1,5 @@
        +module "gopkg.in/yaml.v3"
        +
        +require (
        +	"gopkg.in/check.v1" v0.0.0-20161208181325-20d25e280405
        +)
        diff --git a/vendor/gopkg.in/yaml.v3/parserc.go b/vendor/gopkg.in/yaml.v3/parserc.go
        new file mode 100644
        index 000000000..aea9050b8
        --- /dev/null
        +++ b/vendor/gopkg.in/yaml.v3/parserc.go
        @@ -0,0 +1,1229 @@
        +//
        +// Copyright (c) 2011-2019 Canonical Ltd
        +// Copyright (c) 2006-2010 Kirill Simonov
        +//
        +// Permission is hereby granted, free of charge, to any person obtaining a copy of
        +// this software and associated documentation files (the "Software"), to deal in
        +// the Software without restriction, including without limitation the rights to
        +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
        +// of the Software, and to permit persons to whom the Software is furnished to do
        +// so, subject to the following conditions:
        +//
        +// The above copyright notice and this permission notice shall be included in all
        +// copies or substantial portions of the Software.
        +//
        +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        +// SOFTWARE.
        +
        +package yaml
        +
        +import (
        +	"bytes"
        +)
        +
        +// The parser implements the following grammar:
        +//
        +// stream               ::= STREAM-START implicit_document? explicit_document* STREAM-END
        +// implicit_document    ::= block_node DOCUMENT-END*
        +// explicit_document    ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
        +// block_node_or_indentless_sequence    ::=
        +//                          ALIAS
        +//                          | properties (block_content | indentless_block_sequence)?
        +//                          | block_content
        +//                          | indentless_block_sequence
        +// block_node           ::= ALIAS
        +//                          | properties block_content?
        +//                          | block_content
        +// flow_node            ::= ALIAS
        +//                          | properties flow_content?
        +//                          | flow_content
        +// properties           ::= TAG ANCHOR? | ANCHOR TAG?
        +// block_content        ::= block_collection | flow_collection | SCALAR
        +// flow_content         ::= flow_collection | SCALAR
        +// block_collection     ::= block_sequence | block_mapping
        +// flow_collection      ::= flow_sequence | flow_mapping
        +// block_sequence       ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
        +// indentless_sequence  ::= (BLOCK-ENTRY block_node?)+
        +// block_mapping        ::= BLOCK-MAPPING_START
        +//                          ((KEY block_node_or_indentless_sequence?)?
        +//                          (VALUE block_node_or_indentless_sequence?)?)*
        +//                          BLOCK-END
        +// flow_sequence        ::= FLOW-SEQUENCE-START
        +//                          (flow_sequence_entry FLOW-ENTRY)*
        +//                          flow_sequence_entry?
        +//                          FLOW-SEQUENCE-END
        +// flow_sequence_entry  ::= flow_node | KEY flow_node? (VALUE flow_node?)?
        +// flow_mapping         ::= FLOW-MAPPING-START
        +//                          (flow_mapping_entry FLOW-ENTRY)*
        +//                          flow_mapping_entry?
        +//                          FLOW-MAPPING-END
        +// flow_mapping_entry   ::= flow_node | KEY flow_node? (VALUE flow_node?)?
        +
        +// Peek the next token in the token queue.
        +func peek_token(parser *yaml_parser_t) *yaml_token_t {
        +	if parser.token_available || yaml_parser_fetch_more_tokens(parser) {
        +		token := &parser.tokens[parser.tokens_head]
        +		yaml_parser_unfold_comments(parser, token)
        +		return token
        +	}
        +	return nil
        +}
        +
        +// yaml_parser_unfold_comments walks through the comments queue and joins all
        +// comments behind the position of the provided token into the respective
        +// top-level comment slices in the parser.
        +func yaml_parser_unfold_comments(parser *yaml_parser_t, token *yaml_token_t) {
        +	for parser.comments_head < len(parser.comments) && token.start_mark.index >= parser.comments[parser.comments_head].token_mark.index {
        +		comment := &parser.comments[parser.comments_head]
        +		if len(comment.head) > 0 {
        +			if token.typ == yaml_BLOCK_END_TOKEN {
        +				// No heads on ends, so keep comment.head for a follow up token.
        +				break
        +			}
        +			if len(parser.head_comment) > 0 {
        +				parser.head_comment = append(parser.head_comment, '\n')
        +			}
        +			parser.head_comment = append(parser.head_comment, comment.head...)
        +		}
        +		if len(comment.foot) > 0 {
        +			if len(parser.foot_comment) > 0 {
        +				parser.foot_comment = append(parser.foot_comment, '\n')
        +			}
        +			parser.foot_comment = append(parser.foot_comment, comment.foot...)
        +		}
        +		if len(comment.line) > 0 {
        +			if len(parser.line_comment) > 0 {
        +				parser.line_comment = append(parser.line_comment, '\n')
        +			}
        +			parser.line_comment = append(parser.line_comment, comment.line...)
        +		}
        +		*comment = yaml_comment_t{}
        +		parser.comments_head++
        +	}
        +}
        +
        +// Remove the next token from the queue (must be called after peek_token).
        +func skip_token(parser *yaml_parser_t) {
        +	parser.token_available = false
        +	parser.tokens_parsed++
        +	parser.stream_end_produced = parser.tokens[parser.tokens_head].typ == yaml_STREAM_END_TOKEN
        +	parser.tokens_head++
        +}
        +
        +// Get the next event.
        +func yaml_parser_parse(parser *yaml_parser_t, event *yaml_event_t) bool {
        +	// Erase the event object.
        +	*event = yaml_event_t{}
        +
        +	// No events after the end of the stream or error.
        +	if parser.stream_end_produced || parser.error != yaml_NO_ERROR || parser.state == yaml_PARSE_END_STATE {
        +		return true
        +	}
        +
        +	// Generate the next event.
        +	return yaml_parser_state_machine(parser, event)
        +}
        +
        +// Set parser error.
        +func yaml_parser_set_parser_error(parser *yaml_parser_t, problem string, problem_mark yaml_mark_t) bool {
        +	parser.error = yaml_PARSER_ERROR
        +	parser.problem = problem
        +	parser.problem_mark = problem_mark
        +	return false
        +}
        +
        +func yaml_parser_set_parser_error_context(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string, problem_mark yaml_mark_t) bool {
        +	parser.error = yaml_PARSER_ERROR
        +	parser.context = context
        +	parser.context_mark = context_mark
        +	parser.problem = problem
        +	parser.problem_mark = problem_mark
        +	return false
        +}
        +
        +// State dispatcher.
        +func yaml_parser_state_machine(parser *yaml_parser_t, event *yaml_event_t) bool {
        +	//trace("yaml_parser_state_machine", "state:", parser.state.String())
        +
        +	switch parser.state {
        +	case yaml_PARSE_STREAM_START_STATE:
        +		return yaml_parser_parse_stream_start(parser, event)
        +
        +	case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE:
        +		return yaml_parser_parse_document_start(parser, event, true)
        +
        +	case yaml_PARSE_DOCUMENT_START_STATE:
        +		return yaml_parser_parse_document_start(parser, event, false)
        +
        +	case yaml_PARSE_DOCUMENT_CONTENT_STATE:
        +		return yaml_parser_parse_document_content(parser, event)
        +
        +	case yaml_PARSE_DOCUMENT_END_STATE:
        +		return yaml_parser_parse_document_end(parser, event)
        +
        +	case yaml_PARSE_BLOCK_NODE_STATE:
        +		return yaml_parser_parse_node(parser, event, true, false)
        +
        +	case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE:
        +		return yaml_parser_parse_node(parser, event, true, true)
        +
        +	case yaml_PARSE_FLOW_NODE_STATE:
        +		return yaml_parser_parse_node(parser, event, false, false)
        +
        +	case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE:
        +		return yaml_parser_parse_block_sequence_entry(parser, event, true)
        +
        +	case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE:
        +		return yaml_parser_parse_block_sequence_entry(parser, event, false)
        +
        +	case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE:
        +		return yaml_parser_parse_indentless_sequence_entry(parser, event)
        +
        +	case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE:
        +		return yaml_parser_parse_block_mapping_key(parser, event, true)
        +
        +	case yaml_PARSE_BLOCK_MAPPING_KEY_STATE:
        +		return yaml_parser_parse_block_mapping_key(parser, event, false)
        +
        +	case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE:
        +		return yaml_parser_parse_block_mapping_value(parser, event)
        +
        +	case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE:
        +		return yaml_parser_parse_flow_sequence_entry(parser, event, true)
        +
        +	case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE:
        +		return yaml_parser_parse_flow_sequence_entry(parser, event, false)
        +
        +	case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE:
        +		return yaml_parser_parse_flow_sequence_entry_mapping_key(parser, event)
        +
        +	case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE:
        +		return yaml_parser_parse_flow_sequence_entry_mapping_value(parser, event)
        +
        +	case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE:
        +		return yaml_parser_parse_flow_sequence_entry_mapping_end(parser, event)
        +
        +	case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE:
        +		return yaml_parser_parse_flow_mapping_key(parser, event, true)
        +
        +	case yaml_PARSE_FLOW_MAPPING_KEY_STATE:
        +		return yaml_parser_parse_flow_mapping_key(parser, event, false)
        +
        +	case yaml_PARSE_FLOW_MAPPING_VALUE_STATE:
        +		return yaml_parser_parse_flow_mapping_value(parser, event, false)
        +
        +	case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE:
        +		return yaml_parser_parse_flow_mapping_value(parser, event, true)
        +
        +	default:
        +		panic("invalid parser state")
        +	}
        +}
        +
        +// Parse the production:
        +// stream   ::= STREAM-START implicit_document? explicit_document* STREAM-END
        +//              ************
        +func yaml_parser_parse_stream_start(parser *yaml_parser_t, event *yaml_event_t) bool {
        +	token := peek_token(parser)
        +	if token == nil {
        +		return false
        +	}
        +	if token.typ != yaml_STREAM_START_TOKEN {
        +		return yaml_parser_set_parser_error(parser, "did not find expected ", token.start_mark)
        +	}
        +	parser.state = yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE
        +	*event = yaml_event_t{
        +		typ:        yaml_STREAM_START_EVENT,
        +		start_mark: token.start_mark,
        +		end_mark:   token.end_mark,
        +		encoding:   token.encoding,
        +	}
        +	skip_token(parser)
        +	return true
        +}
        +
        +// Parse the productions:
        +// implicit_document    ::= block_node DOCUMENT-END*
        +//                          *
        +// explicit_document    ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
        +//                          *************************
        +func yaml_parser_parse_document_start(parser *yaml_parser_t, event *yaml_event_t, implicit bool) bool {
        +
        +	token := peek_token(parser)
        +	if token == nil {
        +		return false
        +	}
        +
        +	// Parse extra document end indicators.
        +	if !implicit {
        +		for token.typ == yaml_DOCUMENT_END_TOKEN {
        +			skip_token(parser)
        +			token = peek_token(parser)
        +			if token == nil {
        +				return false
        +			}
        +		}
        +	}
        +
        +	if implicit && token.typ != yaml_VERSION_DIRECTIVE_TOKEN &&
        +		token.typ != yaml_TAG_DIRECTIVE_TOKEN &&
        +		token.typ != yaml_DOCUMENT_START_TOKEN &&
        +		token.typ != yaml_STREAM_END_TOKEN {
        +		// Parse an implicit document.
        +		if !yaml_parser_process_directives(parser, nil, nil) {
        +			return false
        +		}
        +		parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE)
        +		parser.state = yaml_PARSE_BLOCK_NODE_STATE
        +
        +		var head_comment []byte
        +		if len(parser.head_comment) > 0 {
        +			// [Go] Scan the header comment backwards, and if an empty line is found, break
        +			//      the header so the part before the last empty line goes into the
        +			//      document header, while the bottom of it goes into a follow up event.
        +			for i := len(parser.head_comment) - 1; i > 0; i-- {
        +				if parser.head_comment[i] == '\n' {
        +					if i == len(parser.head_comment)-1 {
        +						head_comment = parser.head_comment[:i]
        +						parser.head_comment = parser.head_comment[i+1:]
        +						break
        +					} else if parser.head_comment[i-1] == '\n' {
        +						head_comment = parser.head_comment[:i-1]
        +						parser.head_comment = parser.head_comment[i+1:]
        +						break
        +					}
        +				}
        +			}
        +		}
        +
        +		*event = yaml_event_t{
        +			typ:        yaml_DOCUMENT_START_EVENT,
        +			start_mark: token.start_mark,
        +			end_mark:   token.end_mark,
        +
        +			head_comment: head_comment,
        +		}
        +
        +	} else if token.typ != yaml_STREAM_END_TOKEN {
        +		// Parse an explicit document.
        +		var version_directive *yaml_version_directive_t
        +		var tag_directives []yaml_tag_directive_t
        +		start_mark := token.start_mark
        +		if !yaml_parser_process_directives(parser, &version_directive, &tag_directives) {
        +			return false
        +		}
        +		token = peek_token(parser)
        +		if token == nil {
        +			return false
        +		}
        +		if token.typ != yaml_DOCUMENT_START_TOKEN {
        +			yaml_parser_set_parser_error(parser,
        +				"did not find expected ", token.start_mark)
        +			return false
        +		}
        +		parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE)
        +		parser.state = yaml_PARSE_DOCUMENT_CONTENT_STATE
        +		end_mark := token.end_mark
        +
        +		*event = yaml_event_t{
        +			typ:               yaml_DOCUMENT_START_EVENT,
        +			start_mark:        start_mark,
        +			end_mark:          end_mark,
        +			version_directive: version_directive,
        +			tag_directives:    tag_directives,
        +			implicit:          false,
        +		}
        +		skip_token(parser)
        +
        +	} else {
        +		// Parse the stream end.
        +		parser.state = yaml_PARSE_END_STATE
        +		*event = yaml_event_t{
        +			typ:        yaml_STREAM_END_EVENT,
        +			start_mark: token.start_mark,
        +			end_mark:   token.end_mark,
        +		}
        +		skip_token(parser)
        +	}
        +
        +	return true
        +}
        +
        +// Parse the productions:
        +// explicit_document    ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
        +//                                                    ***********
        +//
        +func yaml_parser_parse_document_content(parser *yaml_parser_t, event *yaml_event_t) bool {
        +	token := peek_token(parser)
        +	if token == nil {
        +		return false
        +	}
        +
        +	if token.typ == yaml_VERSION_DIRECTIVE_TOKEN ||
        +		token.typ == yaml_TAG_DIRECTIVE_TOKEN ||
        +		token.typ == yaml_DOCUMENT_START_TOKEN ||
        +		token.typ == yaml_DOCUMENT_END_TOKEN ||
        +		token.typ == yaml_STREAM_END_TOKEN {
        +		parser.state = parser.states[len(parser.states)-1]
        +		parser.states = parser.states[:len(parser.states)-1]
        +		return yaml_parser_process_empty_scalar(parser, event,
        +			token.start_mark)
        +	}
        +	return yaml_parser_parse_node(parser, event, true, false)
        +}
        +
        +// Parse the productions:
        +// implicit_document    ::= block_node DOCUMENT-END*
        +//                                     *************
        +// explicit_document    ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
        +//
        +func yaml_parser_parse_document_end(parser *yaml_parser_t, event *yaml_event_t) bool {
        +	token := peek_token(parser)
        +	if token == nil {
        +		return false
        +	}
        +
        +	start_mark := token.start_mark
        +	end_mark := token.start_mark
        +
        +	implicit := true
        +	if token.typ == yaml_DOCUMENT_END_TOKEN {
        +		end_mark = token.end_mark
        +		skip_token(parser)
        +		implicit = false
        +	}
        +
        +	parser.tag_directives = parser.tag_directives[:0]
        +
        +	parser.state = yaml_PARSE_DOCUMENT_START_STATE
        +	*event = yaml_event_t{
        +		typ:        yaml_DOCUMENT_END_EVENT,
        +		start_mark: start_mark,
        +		end_mark:   end_mark,
        +		implicit:   implicit,
        +	}
        +	yaml_parser_set_event_comments(parser, event)
        +	if len(event.head_comment) > 0 && len(event.foot_comment) == 0 {
        +		event.foot_comment = event.head_comment
        +		event.head_comment = nil
        +	}
        +	return true
        +}
        +
        +func yaml_parser_set_event_comments(parser *yaml_parser_t, event *yaml_event_t) {
        +	event.head_comment = parser.head_comment
        +	event.line_comment = parser.line_comment
        +	event.foot_comment = parser.foot_comment
        +	parser.head_comment = nil
        +	parser.line_comment = nil
        +	parser.foot_comment = nil
        +	parser.tail_comment = nil
        +	parser.stem_comment = nil
        +}
        +
        +// Parse the productions:
        +// block_node_or_indentless_sequence    ::=
        +//                          ALIAS
        +//                          *****
        +//                          | properties (block_content | indentless_block_sequence)?
        +//                            **********  *
        +//                          | block_content | indentless_block_sequence
        +//                            *
        +// block_node           ::= ALIAS
        +//                          *****
        +//                          | properties block_content?
        +//                            ********** *
        +//                          | block_content
        +//                            *
        +// flow_node            ::= ALIAS
        +//                          *****
        +//                          | properties flow_content?
        +//                            ********** *
        +//                          | flow_content
        +//                            *
        +// properties           ::= TAG ANCHOR? | ANCHOR TAG?
        +//                          *************************
        +// block_content        ::= block_collection | flow_collection | SCALAR
        +//                                                               ******
        +// flow_content         ::= flow_collection | SCALAR
        +//                                            ******
        +func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, indentless_sequence bool) bool {
        +	//defer trace("yaml_parser_parse_node", "block:", block, "indentless_sequence:", indentless_sequence)()
        +
        +	token := peek_token(parser)
        +	if token == nil {
        +		return false
        +	}
        +
        +	if token.typ == yaml_ALIAS_TOKEN {
        +		parser.state = parser.states[len(parser.states)-1]
        +		parser.states = parser.states[:len(parser.states)-1]
        +		*event = yaml_event_t{
        +			typ:        yaml_ALIAS_EVENT,
        +			start_mark: token.start_mark,
        +			end_mark:   token.end_mark,
        +			anchor:     token.value,
        +		}
        +		yaml_parser_set_event_comments(parser, event)
        +		skip_token(parser)
        +		return true
        +	}
        +
        +	start_mark := token.start_mark
        +	end_mark := token.start_mark
        +
        +	var tag_token bool
        +	var tag_handle, tag_suffix, anchor []byte
        +	var tag_mark yaml_mark_t
        +	if token.typ == yaml_ANCHOR_TOKEN {
        +		anchor = token.value
        +		start_mark = token.start_mark
        +		end_mark = token.end_mark
        +		skip_token(parser)
        +		token = peek_token(parser)
        +		if token == nil {
        +			return false
        +		}
        +		if token.typ == yaml_TAG_TOKEN {
        +			tag_token = true
        +			tag_handle = token.value
        +			tag_suffix = token.suffix
        +			tag_mark = token.start_mark
        +			end_mark = token.end_mark
        +			skip_token(parser)
        +			token = peek_token(parser)
        +			if token == nil {
        +				return false
        +			}
        +		}
        +	} else if token.typ == yaml_TAG_TOKEN {
        +		tag_token = true
        +		tag_handle = token.value
        +		tag_suffix = token.suffix
        +		start_mark = token.start_mark
        +		tag_mark = token.start_mark
        +		end_mark = token.end_mark
        +		skip_token(parser)
        +		token = peek_token(parser)
        +		if token == nil {
        +			return false
        +		}
        +		if token.typ == yaml_ANCHOR_TOKEN {
        +			anchor = token.value
        +			end_mark = token.end_mark
        +			skip_token(parser)
        +			token = peek_token(parser)
        +			if token == nil {
        +				return false
        +			}
        +		}
        +	}
        +
        +	var tag []byte
        +	if tag_token {
        +		if len(tag_handle) == 0 {
        +			tag = tag_suffix
        +			tag_suffix = nil
        +		} else {
        +			for i := range parser.tag_directives {
        +				if bytes.Equal(parser.tag_directives[i].handle, tag_handle) {
        +					tag = append([]byte(nil), parser.tag_directives[i].prefix...)
        +					tag = append(tag, tag_suffix...)
        +					break
        +				}
        +			}
        +			if len(tag) == 0 {
        +				yaml_parser_set_parser_error_context(parser,
        +					"while parsing a node", start_mark,
        +					"found undefined tag handle", tag_mark)
        +				return false
        +			}
        +		}
        +	}
        +
        +	implicit := len(tag) == 0
        +	if indentless_sequence && token.typ == yaml_BLOCK_ENTRY_TOKEN {
        +		end_mark = token.end_mark
        +		parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE
        +		*event = yaml_event_t{
        +			typ:        yaml_SEQUENCE_START_EVENT,
        +			start_mark: start_mark,
        +			end_mark:   end_mark,
        +			anchor:     anchor,
        +			tag:        tag,
        +			implicit:   implicit,
        +			style:      yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE),
        +		}
        +		return true
        +	}
        +	if token.typ == yaml_SCALAR_TOKEN {
        +		var plain_implicit, quoted_implicit bool
        +		end_mark = token.end_mark
        +		if (len(tag) == 0 && token.style == yaml_PLAIN_SCALAR_STYLE) || (len(tag) == 1 && tag[0] == '!') {
        +			plain_implicit = true
        +		} else if len(tag) == 0 {
        +			quoted_implicit = true
        +		}
        +		parser.state = parser.states[len(parser.states)-1]
        +		parser.states = parser.states[:len(parser.states)-1]
        +
        +		*event = yaml_event_t{
        +			typ:             yaml_SCALAR_EVENT,
        +			start_mark:      start_mark,
        +			end_mark:        end_mark,
        +			anchor:          anchor,
        +			tag:             tag,
        +			value:           token.value,
        +			implicit:        plain_implicit,
        +			quoted_implicit: quoted_implicit,
        +			style:           yaml_style_t(token.style),
        +		}
        +		yaml_parser_set_event_comments(parser, event)
        +		skip_token(parser)
        +		return true
        +	}
        +	if token.typ == yaml_FLOW_SEQUENCE_START_TOKEN {
        +		// [Go] Some of the events below can be merged as they differ only on style.
        +		end_mark = token.end_mark
        +		parser.state = yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE
        +		*event = yaml_event_t{
        +			typ:        yaml_SEQUENCE_START_EVENT,
        +			start_mark: start_mark,
        +			end_mark:   end_mark,
        +			anchor:     anchor,
        +			tag:        tag,
        +			implicit:   implicit,
        +			style:      yaml_style_t(yaml_FLOW_SEQUENCE_STYLE),
        +		}
        +		yaml_parser_set_event_comments(parser, event)
        +		return true
        +	}
        +	if token.typ == yaml_FLOW_MAPPING_START_TOKEN {
        +		end_mark = token.end_mark
        +		parser.state = yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE
        +		*event = yaml_event_t{
        +			typ:        yaml_MAPPING_START_EVENT,
        +			start_mark: start_mark,
        +			end_mark:   end_mark,
        +			anchor:     anchor,
        +			tag:        tag,
        +			implicit:   implicit,
        +			style:      yaml_style_t(yaml_FLOW_MAPPING_STYLE),
        +		}
        +		yaml_parser_set_event_comments(parser, event)
        +		return true
        +	}
        +	if block && token.typ == yaml_BLOCK_SEQUENCE_START_TOKEN {
        +		end_mark = token.end_mark
        +		parser.state = yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE
        +		*event = yaml_event_t{
        +			typ:        yaml_SEQUENCE_START_EVENT,
        +			start_mark: start_mark,
        +			end_mark:   end_mark,
        +			anchor:     anchor,
        +			tag:        tag,
        +			implicit:   implicit,
        +			style:      yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE),
        +		}
        +		if parser.stem_comment != nil {
        +			event.head_comment = parser.stem_comment
        +			parser.stem_comment = nil
        +		}
        +		return true
        +	}
        +	if block && token.typ == yaml_BLOCK_MAPPING_START_TOKEN {
        +		end_mark = token.end_mark
        +		parser.state = yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE
        +		*event = yaml_event_t{
        +			typ:        yaml_MAPPING_START_EVENT,
        +			start_mark: start_mark,
        +			end_mark:   end_mark,
        +			anchor:     anchor,
        +			tag:        tag,
        +			implicit:   implicit,
        +			style:      yaml_style_t(yaml_BLOCK_MAPPING_STYLE),
        +		}
        +		return true
        +	}
        +	if len(anchor) > 0 || len(tag) > 0 {
        +		parser.state = parser.states[len(parser.states)-1]
        +		parser.states = parser.states[:len(parser.states)-1]
        +
        +		*event = yaml_event_t{
        +			typ:             yaml_SCALAR_EVENT,
        +			start_mark:      start_mark,
        +			end_mark:        end_mark,
        +			anchor:          anchor,
        +			tag:             tag,
        +			implicit:        implicit,
        +			quoted_implicit: false,
        +			style:           yaml_style_t(yaml_PLAIN_SCALAR_STYLE),
        +		}
        +		return true
        +	}
        +
        +	context := "while parsing a flow node"
        +	if block {
        +		context = "while parsing a block node"
        +	}
        +	yaml_parser_set_parser_error_context(parser, context, start_mark,
        +		"did not find expected node content", token.start_mark)
        +	return false
        +}
        +
        +// Parse the productions:
        +// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
        +//                    ********************  *********** *             *********
        +//
        +func yaml_parser_parse_block_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
        +	if first {
        +		token := peek_token(parser)
        +		parser.marks = append(parser.marks, token.start_mark)
        +		skip_token(parser)
        +	}
        +
        +	token := peek_token(parser)
        +	if token == nil {
        +		return false
        +	}
        +
        +	if token.typ == yaml_BLOCK_ENTRY_TOKEN {
        +		mark := token.end_mark
        +		prior_head := len(parser.head_comment)
        +		skip_token(parser)
        +		token = peek_token(parser)
        +		if token == nil {
        +			return false
        +		}
        +		if prior_head > 0 && token.typ == yaml_BLOCK_SEQUENCE_START_TOKEN {
        +			// [Go] It's a sequence under a sequence entry, so the former head comment
        +			//      is for the list itself, not the first list item under it.
        +			parser.stem_comment = parser.head_comment[:prior_head]
        +			if len(parser.head_comment) == prior_head {
        +				parser.head_comment = nil
        +			} else {
        +				// Copy suffix to prevent very strange bugs if someone ever appends
        +				// further bytes to the prefix in the stem_comment slice above.
        +				parser.head_comment = append([]byte(nil), parser.head_comment[prior_head+1:]...)
        +			}
        +
        +		}
        +		if token.typ != yaml_BLOCK_ENTRY_TOKEN && token.typ != yaml_BLOCK_END_TOKEN {
        +			parser.states = append(parser.states, yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE)
        +			return yaml_parser_parse_node(parser, event, true, false)
        +		} else {
        +			parser.state = yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE
        +			return yaml_parser_process_empty_scalar(parser, event, mark)
        +		}
        +	}
        +	if token.typ == yaml_BLOCK_END_TOKEN {
        +		parser.state = parser.states[len(parser.states)-1]
        +		parser.states = parser.states[:len(parser.states)-1]
        +		parser.marks = parser.marks[:len(parser.marks)-1]
        +
        +		*event = yaml_event_t{
        +			typ:        yaml_SEQUENCE_END_EVENT,
        +			start_mark: token.start_mark,
        +			end_mark:   token.end_mark,
        +		}
        +
        +		skip_token(parser)
        +		return true
        +	}
        +
        +	context_mark := parser.marks[len(parser.marks)-1]
        +	parser.marks = parser.marks[:len(parser.marks)-1]
        +	return yaml_parser_set_parser_error_context(parser,
        +		"while parsing a block collection", context_mark,
        +		"did not find expected '-' indicator", token.start_mark)
        +}
        +
        +// Parse the productions:
        +// indentless_sequence  ::= (BLOCK-ENTRY block_node?)+
        +//                           *********** *
        +func yaml_parser_parse_indentless_sequence_entry(parser *yaml_parser_t, event *yaml_event_t) bool {
        +	token := peek_token(parser)
        +	if token == nil {
        +		return false
        +	}
        +
        +	if token.typ == yaml_BLOCK_ENTRY_TOKEN {
        +		mark := token.end_mark
        +		skip_token(parser)
        +		token = peek_token(parser)
        +		if token == nil {
        +			return false
        +		}
        +		if token.typ != yaml_BLOCK_ENTRY_TOKEN &&
        +			token.typ != yaml_KEY_TOKEN &&
        +			token.typ != yaml_VALUE_TOKEN &&
        +			token.typ != yaml_BLOCK_END_TOKEN {
        +			parser.states = append(parser.states, yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE)
        +			return yaml_parser_parse_node(parser, event, true, false)
        +		}
        +		parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE
        +		return yaml_parser_process_empty_scalar(parser, event, mark)
        +	}
        +	parser.state = parser.states[len(parser.states)-1]
        +	parser.states = parser.states[:len(parser.states)-1]
        +
        +	*event = yaml_event_t{
        +		typ:        yaml_SEQUENCE_END_EVENT,
        +		start_mark: token.start_mark,
        +		end_mark:   token.start_mark, // [Go] Shouldn't this be token.end_mark?
        +	}
        +	return true
        +}
        +
        +// Parse the productions:
        +// block_mapping        ::= BLOCK-MAPPING_START
        +//                          *******************
        +//                          ((KEY block_node_or_indentless_sequence?)?
        +//                            *** *
        +//                          (VALUE block_node_or_indentless_sequence?)?)*
        +//
        +//                          BLOCK-END
        +//                          *********
        +//
        +func yaml_parser_parse_block_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
        +	if first {
        +		token := peek_token(parser)
        +		parser.marks = append(parser.marks, token.start_mark)
        +		skip_token(parser)
        +	}
        +
        +	token := peek_token(parser)
        +	if token == nil {
        +		return false
        +	}
        +
        +	// [Go] A tail comment was left from the prior mapping value processed. Emit an event
        +	//      as it needs to be processed with that value and not the following key.
        +	if len(parser.tail_comment) > 0 {
        +		*event = yaml_event_t{
        +			typ:          yaml_TAIL_COMMENT_EVENT,
        +			start_mark:   token.start_mark,
        +			end_mark:     token.end_mark,
        +			foot_comment: parser.tail_comment,
        +		}
        +		parser.tail_comment = nil
        +		return true
        +	}
        +
        +	if token.typ == yaml_KEY_TOKEN {
        +		mark := token.end_mark
        +		skip_token(parser)
        +		token = peek_token(parser)
        +		if token == nil {
        +			return false
        +		}
        +		if token.typ != yaml_KEY_TOKEN &&
        +			token.typ != yaml_VALUE_TOKEN &&
        +			token.typ != yaml_BLOCK_END_TOKEN {
        +			parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_VALUE_STATE)
        +			return yaml_parser_parse_node(parser, event, true, true)
        +		} else {
        +			parser.state = yaml_PARSE_BLOCK_MAPPING_VALUE_STATE
        +			return yaml_parser_process_empty_scalar(parser, event, mark)
        +		}
        +	} else if token.typ == yaml_BLOCK_END_TOKEN {
        +		parser.state = parser.states[len(parser.states)-1]
        +		parser.states = parser.states[:len(parser.states)-1]
        +		parser.marks = parser.marks[:len(parser.marks)-1]
        +		*event = yaml_event_t{
        +			typ:        yaml_MAPPING_END_EVENT,
        +			start_mark: token.start_mark,
        +			end_mark:   token.end_mark,
        +		}
        +		yaml_parser_set_event_comments(parser, event)
        +		skip_token(parser)
        +		return true
        +	}
        +
        +	context_mark := parser.marks[len(parser.marks)-1]
        +	parser.marks = parser.marks[:len(parser.marks)-1]
        +	return yaml_parser_set_parser_error_context(parser,
        +		"while parsing a block mapping", context_mark,
        +		"did not find expected key", token.start_mark)
        +}
        +
        +// Parse the productions:
        +// block_mapping        ::= BLOCK-MAPPING_START
        +//
        +//                          ((KEY block_node_or_indentless_sequence?)?
        +//
        +//                          (VALUE block_node_or_indentless_sequence?)?)*
        +//                           ***** *
        +//                          BLOCK-END
        +//
        +//
        +func yaml_parser_parse_block_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool {
        +	token := peek_token(parser)
        +	if token == nil {
        +		return false
        +	}
        +	if token.typ == yaml_VALUE_TOKEN {
        +		mark := token.end_mark
        +		skip_token(parser)
        +		token = peek_token(parser)
        +		if token == nil {
        +			return false
        +		}
        +		if token.typ != yaml_KEY_TOKEN &&
        +			token.typ != yaml_VALUE_TOKEN &&
        +			token.typ != yaml_BLOCK_END_TOKEN {
        +			parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_KEY_STATE)
        +			return yaml_parser_parse_node(parser, event, true, true)
        +		}
        +		parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE
        +		return yaml_parser_process_empty_scalar(parser, event, mark)
        +	}
        +	parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE
        +	return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
        +}
        +
        +// Parse the productions:
        +// flow_sequence        ::= FLOW-SEQUENCE-START
        +//                          *******************
        +//                          (flow_sequence_entry FLOW-ENTRY)*
        +//                           *                   **********
        +//                          flow_sequence_entry?
        +//                          *
        +//                          FLOW-SEQUENCE-END
        +//                          *****************
        +// flow_sequence_entry  ::= flow_node | KEY flow_node? (VALUE flow_node?)?
        +//                          *
        +//
        +func yaml_parser_parse_flow_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
        +	if first {
        +		token := peek_token(parser)
        +		parser.marks = append(parser.marks, token.start_mark)
        +		skip_token(parser)
        +	}
        +	token := peek_token(parser)
        +	if token == nil {
        +		return false
        +	}
        +	if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
        +		if !first {
        +			if token.typ == yaml_FLOW_ENTRY_TOKEN {
        +				skip_token(parser)
        +				token = peek_token(parser)
        +				if token == nil {
        +					return false
        +				}
        +			} else {
        +				context_mark := parser.marks[len(parser.marks)-1]
        +				parser.marks = parser.marks[:len(parser.marks)-1]
        +				return yaml_parser_set_parser_error_context(parser,
        +					"while parsing a flow sequence", context_mark,
        +					"did not find expected ',' or ']'", token.start_mark)
        +			}
        +		}
        +
        +		if token.typ == yaml_KEY_TOKEN {
        +			parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE
        +			*event = yaml_event_t{
        +				typ:        yaml_MAPPING_START_EVENT,
        +				start_mark: token.start_mark,
        +				end_mark:   token.end_mark,
        +				implicit:   true,
        +				style:      yaml_style_t(yaml_FLOW_MAPPING_STYLE),
        +			}
        +			skip_token(parser)
        +			return true
        +		} else if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
        +			parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE)
        +			return yaml_parser_parse_node(parser, event, false, false)
        +		}
        +	}
        +
        +	parser.state = parser.states[len(parser.states)-1]
        +	parser.states = parser.states[:len(parser.states)-1]
        +	parser.marks = parser.marks[:len(parser.marks)-1]
        +
        +	*event = yaml_event_t{
        +		typ:        yaml_SEQUENCE_END_EVENT,
        +		start_mark: token.start_mark,
        +		end_mark:   token.end_mark,
        +	}
        +	yaml_parser_set_event_comments(parser, event)
        +
        +	skip_token(parser)
        +	return true
        +}
        +
        +//
        +// Parse the productions:
        +// flow_sequence_entry  ::= flow_node | KEY flow_node? (VALUE flow_node?)?
        +//                                      *** *
        +//
        +func yaml_parser_parse_flow_sequence_entry_mapping_key(parser *yaml_parser_t, event *yaml_event_t) bool {
        +	token := peek_token(parser)
        +	if token == nil {
        +		return false
        +	}
        +	if token.typ != yaml_VALUE_TOKEN &&
        +		token.typ != yaml_FLOW_ENTRY_TOKEN &&
        +		token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
        +		parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE)
        +		return yaml_parser_parse_node(parser, event, false, false)
        +	}
        +	mark := token.end_mark
        +	skip_token(parser)
        +	parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE
        +	return yaml_parser_process_empty_scalar(parser, event, mark)
        +}
        +
        +// Parse the productions:
        +// flow_sequence_entry  ::= flow_node | KEY flow_node? (VALUE flow_node?)?
        +//                                                      ***** *
        +//
        +func yaml_parser_parse_flow_sequence_entry_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool {
        +	token := peek_token(parser)
        +	if token == nil {
        +		return false
        +	}
        +	if token.typ == yaml_VALUE_TOKEN {
        +		skip_token(parser)
        +		token := peek_token(parser)
        +		if token == nil {
        +			return false
        +		}
        +		if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
        +			parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE)
        +			return yaml_parser_parse_node(parser, event, false, false)
        +		}
        +	}
        +	parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE
        +	return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
        +}
        +
        +// Parse the productions:
        +// flow_sequence_entry  ::= flow_node | KEY flow_node? (VALUE flow_node?)?
        +//                                                                      *
        +//
        +func yaml_parser_parse_flow_sequence_entry_mapping_end(parser *yaml_parser_t, event *yaml_event_t) bool {
        +	token := peek_token(parser)
        +	if token == nil {
        +		return false
        +	}
        +	parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE
        +	*event = yaml_event_t{
        +		typ:        yaml_MAPPING_END_EVENT,
        +		start_mark: token.start_mark,
        +		end_mark:   token.start_mark, // [Go] Shouldn't this be end_mark?
        +	}
        +	return true
        +}
        +
        +// Parse the productions:
        +// flow_mapping         ::= FLOW-MAPPING-START
        +//                          ******************
        +//                          (flow_mapping_entry FLOW-ENTRY)*
        +//                           *                  **********
        +//                          flow_mapping_entry?
        +//                          ******************
        +//                          FLOW-MAPPING-END
        +//                          ****************
        +// flow_mapping_entry   ::= flow_node | KEY flow_node? (VALUE flow_node?)?
        +//                          *           *** *
        +//
        +func yaml_parser_parse_flow_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
        +	if first {
        +		token := peek_token(parser)
        +		parser.marks = append(parser.marks, token.start_mark)
        +		skip_token(parser)
        +	}
        +
        +	token := peek_token(parser)
        +	if token == nil {
        +		return false
        +	}
        +
        +	if token.typ != yaml_FLOW_MAPPING_END_TOKEN {
        +		if !first {
        +			if token.typ == yaml_FLOW_ENTRY_TOKEN {
        +				skip_token(parser)
        +				token = peek_token(parser)
        +				if token == nil {
        +					return false
        +				}
        +			} else {
        +				context_mark := parser.marks[len(parser.marks)-1]
        +				parser.marks = parser.marks[:len(parser.marks)-1]
        +				return yaml_parser_set_parser_error_context(parser,
        +					"while parsing a flow mapping", context_mark,
        +					"did not find expected ',' or '}'", token.start_mark)
        +			}
        +		}
        +
        +		if token.typ == yaml_KEY_TOKEN {
        +			skip_token(parser)
        +			token = peek_token(parser)
        +			if token == nil {
        +				return false
        +			}
        +			if token.typ != yaml_VALUE_TOKEN &&
        +				token.typ != yaml_FLOW_ENTRY_TOKEN &&
        +				token.typ != yaml_FLOW_MAPPING_END_TOKEN {
        +				parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_VALUE_STATE)
        +				return yaml_parser_parse_node(parser, event, false, false)
        +			} else {
        +				parser.state = yaml_PARSE_FLOW_MAPPING_VALUE_STATE
        +				return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
        +			}
        +		} else if token.typ != yaml_FLOW_MAPPING_END_TOKEN {
        +			parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE)
        +			return yaml_parser_parse_node(parser, event, false, false)
        +		}
        +	}
        +
        +	parser.state = parser.states[len(parser.states)-1]
        +	parser.states = parser.states[:len(parser.states)-1]
        +	parser.marks = parser.marks[:len(parser.marks)-1]
        +	*event = yaml_event_t{
        +		typ:        yaml_MAPPING_END_EVENT,
        +		start_mark: token.start_mark,
        +		end_mark:   token.end_mark,
        +	}
        +	yaml_parser_set_event_comments(parser, event)
        +	skip_token(parser)
        +	return true
        +}
        +
        +// Parse the productions:
        +// flow_mapping_entry   ::= flow_node | KEY flow_node? (VALUE flow_node?)?
        +//                                   *                  ***** *
        +//
        +func yaml_parser_parse_flow_mapping_value(parser *yaml_parser_t, event *yaml_event_t, empty bool) bool {
        +	token := peek_token(parser)
        +	if token == nil {
        +		return false
        +	}
        +	if empty {
        +		parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE
        +		return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
        +	}
        +	if token.typ == yaml_VALUE_TOKEN {
        +		skip_token(parser)
        +		token = peek_token(parser)
        +		if token == nil {
        +			return false
        +		}
        +		if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_MAPPING_END_TOKEN {
        +			parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_KEY_STATE)
        +			return yaml_parser_parse_node(parser, event, false, false)
        +		}
        +	}
        +	parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE
        +	return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
        +}
        +
        +// Generate an empty scalar event.
        +func yaml_parser_process_empty_scalar(parser *yaml_parser_t, event *yaml_event_t, mark yaml_mark_t) bool {
        +	*event = yaml_event_t{
        +		typ:        yaml_SCALAR_EVENT,
        +		start_mark: mark,
        +		end_mark:   mark,
        +		value:      nil, // Empty
        +		implicit:   true,
        +		style:      yaml_style_t(yaml_PLAIN_SCALAR_STYLE),
        +	}
        +	return true
        +}
        +
        +var default_tag_directives = []yaml_tag_directive_t{
        +	{[]byte("!"), []byte("!")},
        +	{[]byte("!!"), []byte("tag:yaml.org,2002:")},
        +}
        +
        +// Parse directives.
        +func yaml_parser_process_directives(parser *yaml_parser_t,
        +	version_directive_ref **yaml_version_directive_t,
        +	tag_directives_ref *[]yaml_tag_directive_t) bool {
        +
        +	var version_directive *yaml_version_directive_t
        +	var tag_directives []yaml_tag_directive_t
        +
        +	token := peek_token(parser)
        +	if token == nil {
        +		return false
        +	}
        +
        +	for token.typ == yaml_VERSION_DIRECTIVE_TOKEN || token.typ == yaml_TAG_DIRECTIVE_TOKEN {
        +		if token.typ == yaml_VERSION_DIRECTIVE_TOKEN {
        +			if version_directive != nil {
        +				yaml_parser_set_parser_error(parser,
        +					"found duplicate %YAML directive", token.start_mark)
        +				return false
        +			}
        +			if token.major != 1 || token.minor != 1 {
        +				yaml_parser_set_parser_error(parser,
        +					"found incompatible YAML document", token.start_mark)
        +				return false
        +			}
        +			version_directive = &yaml_version_directive_t{
        +				major: token.major,
        +				minor: token.minor,
        +			}
        +		} else if token.typ == yaml_TAG_DIRECTIVE_TOKEN {
        +			value := yaml_tag_directive_t{
        +				handle: token.value,
        +				prefix: token.prefix,
        +			}
        +			if !yaml_parser_append_tag_directive(parser, value, false, token.start_mark) {
        +				return false
        +			}
        +			tag_directives = append(tag_directives, value)
        +		}
        +
        +		skip_token(parser)
        +		token = peek_token(parser)
        +		if token == nil {
        +			return false
        +		}
        +	}
        +
        +	for i := range default_tag_directives {
        +		if !yaml_parser_append_tag_directive(parser, default_tag_directives[i], true, token.start_mark) {
        +			return false
        +		}
        +	}
        +
        +	if version_directive_ref != nil {
        +		*version_directive_ref = version_directive
        +	}
        +	if tag_directives_ref != nil {
        +		*tag_directives_ref = tag_directives
        +	}
        +	return true
        +}
        +
        +// Append a tag directive to the directives stack.
        +func yaml_parser_append_tag_directive(parser *yaml_parser_t, value yaml_tag_directive_t, allow_duplicates bool, mark yaml_mark_t) bool {
        +	for i := range parser.tag_directives {
        +		if bytes.Equal(value.handle, parser.tag_directives[i].handle) {
        +			if allow_duplicates {
        +				return true
        +			}
        +			return yaml_parser_set_parser_error(parser, "found duplicate %TAG directive", mark)
        +		}
        +	}
        +
        +	// [Go] I suspect the copy is unnecessary. This was likely done
        +	// because there was no way to track ownership of the data.
        +	value_copy := yaml_tag_directive_t{
        +		handle: make([]byte, len(value.handle)),
        +		prefix: make([]byte, len(value.prefix)),
        +	}
        +	copy(value_copy.handle, value.handle)
        +	copy(value_copy.prefix, value.prefix)
        +	parser.tag_directives = append(parser.tag_directives, value_copy)
        +	return true
        +}
        diff --git a/vendor/gopkg.in/yaml.v3/readerc.go b/vendor/gopkg.in/yaml.v3/readerc.go
        new file mode 100644
        index 000000000..b7de0a89c
        --- /dev/null
        +++ b/vendor/gopkg.in/yaml.v3/readerc.go
        @@ -0,0 +1,434 @@
        +// 
        +// Copyright (c) 2011-2019 Canonical Ltd
        +// Copyright (c) 2006-2010 Kirill Simonov
        +// 
        +// Permission is hereby granted, free of charge, to any person obtaining a copy of
        +// this software and associated documentation files (the "Software"), to deal in
        +// the Software without restriction, including without limitation the rights to
        +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
        +// of the Software, and to permit persons to whom the Software is furnished to do
        +// so, subject to the following conditions:
        +// 
        +// The above copyright notice and this permission notice shall be included in all
        +// copies or substantial portions of the Software.
        +// 
        +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        +// SOFTWARE.
        +
        +package yaml
        +
        +import (
        +	"io"
        +)
        +
        +// Set the reader error and return 0.
        +func yaml_parser_set_reader_error(parser *yaml_parser_t, problem string, offset int, value int) bool {
        +	parser.error = yaml_READER_ERROR
        +	parser.problem = problem
        +	parser.problem_offset = offset
        +	parser.problem_value = value
        +	return false
        +}
        +
        +// Byte order marks.
        +const (
        +	bom_UTF8    = "\xef\xbb\xbf"
        +	bom_UTF16LE = "\xff\xfe"
        +	bom_UTF16BE = "\xfe\xff"
        +)
        +
        +// Determine the input stream encoding by checking the BOM symbol. If no BOM is
        +// found, the UTF-8 encoding is assumed. Return 1 on success, 0 on failure.
        +func yaml_parser_determine_encoding(parser *yaml_parser_t) bool {
        +	// Ensure that we had enough bytes in the raw buffer.
        +	for !parser.eof && len(parser.raw_buffer)-parser.raw_buffer_pos < 3 {
        +		if !yaml_parser_update_raw_buffer(parser) {
        +			return false
        +		}
        +	}
        +
        +	// Determine the encoding.
        +	buf := parser.raw_buffer
        +	pos := parser.raw_buffer_pos
        +	avail := len(buf) - pos
        +	if avail >= 2 && buf[pos] == bom_UTF16LE[0] && buf[pos+1] == bom_UTF16LE[1] {
        +		parser.encoding = yaml_UTF16LE_ENCODING
        +		parser.raw_buffer_pos += 2
        +		parser.offset += 2
        +	} else if avail >= 2 && buf[pos] == bom_UTF16BE[0] && buf[pos+1] == bom_UTF16BE[1] {
        +		parser.encoding = yaml_UTF16BE_ENCODING
        +		parser.raw_buffer_pos += 2
        +		parser.offset += 2
        +	} else if avail >= 3 && buf[pos] == bom_UTF8[0] && buf[pos+1] == bom_UTF8[1] && buf[pos+2] == bom_UTF8[2] {
        +		parser.encoding = yaml_UTF8_ENCODING
        +		parser.raw_buffer_pos += 3
        +		parser.offset += 3
        +	} else {
        +		parser.encoding = yaml_UTF8_ENCODING
        +	}
        +	return true
        +}
        +
        +// Update the raw buffer.
        +func yaml_parser_update_raw_buffer(parser *yaml_parser_t) bool {
        +	size_read := 0
        +
        +	// Return if the raw buffer is full.
        +	if parser.raw_buffer_pos == 0 && len(parser.raw_buffer) == cap(parser.raw_buffer) {
        +		return true
        +	}
        +
        +	// Return on EOF.
        +	if parser.eof {
        +		return true
        +	}
        +
        +	// Move the remaining bytes in the raw buffer to the beginning.
        +	if parser.raw_buffer_pos > 0 && parser.raw_buffer_pos < len(parser.raw_buffer) {
        +		copy(parser.raw_buffer, parser.raw_buffer[parser.raw_buffer_pos:])
        +	}
        +	parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)-parser.raw_buffer_pos]
        +	parser.raw_buffer_pos = 0
        +
        +	// Call the read handler to fill the buffer.
        +	size_read, err := parser.read_handler(parser, parser.raw_buffer[len(parser.raw_buffer):cap(parser.raw_buffer)])
        +	parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)+size_read]
        +	if err == io.EOF {
        +		parser.eof = true
        +	} else if err != nil {
        +		return yaml_parser_set_reader_error(parser, "input error: "+err.Error(), parser.offset, -1)
        +	}
        +	return true
        +}
        +
        +// Ensure that the buffer contains at least `length` characters.
        +// Return true on success, false on failure.
        +//
        +// The length is supposed to be significantly less that the buffer size.
        +func yaml_parser_update_buffer(parser *yaml_parser_t, length int) bool {
        +	if parser.read_handler == nil {
        +		panic("read handler must be set")
        +	}
        +
        +	// [Go] This function was changed to guarantee the requested length size at EOF.
        +	// The fact we need to do this is pretty awful, but the description above implies
        +	// for that to be the case, and there are tests
        +
        +	// If the EOF flag is set and the raw buffer is empty, do nothing.
        +	if parser.eof && parser.raw_buffer_pos == len(parser.raw_buffer) {
        +		// [Go] ACTUALLY! Read the documentation of this function above.
        +		// This is just broken. To return true, we need to have the
        +		// given length in the buffer. Not doing that means every single
        +		// check that calls this function to make sure the buffer has a
        +		// given length is Go) panicking; or C) accessing invalid memory.
        +		//return true
        +	}
        +
        +	// Return if the buffer contains enough characters.
        +	if parser.unread >= length {
        +		return true
        +	}
        +
        +	// Determine the input encoding if it is not known yet.
        +	if parser.encoding == yaml_ANY_ENCODING {
        +		if !yaml_parser_determine_encoding(parser) {
        +			return false
        +		}
        +	}
        +
        +	// Move the unread characters to the beginning of the buffer.
        +	buffer_len := len(parser.buffer)
        +	if parser.buffer_pos > 0 && parser.buffer_pos < buffer_len {
        +		copy(parser.buffer, parser.buffer[parser.buffer_pos:])
        +		buffer_len -= parser.buffer_pos
        +		parser.buffer_pos = 0
        +	} else if parser.buffer_pos == buffer_len {
        +		buffer_len = 0
        +		parser.buffer_pos = 0
        +	}
        +
        +	// Open the whole buffer for writing, and cut it before returning.
        +	parser.buffer = parser.buffer[:cap(parser.buffer)]
        +
        +	// Fill the buffer until it has enough characters.
        +	first := true
        +	for parser.unread < length {
        +
        +		// Fill the raw buffer if necessary.
        +		if !first || parser.raw_buffer_pos == len(parser.raw_buffer) {
        +			if !yaml_parser_update_raw_buffer(parser) {
        +				parser.buffer = parser.buffer[:buffer_len]
        +				return false
        +			}
        +		}
        +		first = false
        +
        +		// Decode the raw buffer.
        +	inner:
        +		for parser.raw_buffer_pos != len(parser.raw_buffer) {
        +			var value rune
        +			var width int
        +
        +			raw_unread := len(parser.raw_buffer) - parser.raw_buffer_pos
        +
        +			// Decode the next character.
        +			switch parser.encoding {
        +			case yaml_UTF8_ENCODING:
        +				// Decode a UTF-8 character.  Check RFC 3629
        +				// (http://www.ietf.org/rfc/rfc3629.txt) for more details.
        +				//
        +				// The following table (taken from the RFC) is used for
        +				// decoding.
        +				//
        +				//    Char. number range |        UTF-8 octet sequence
        +				//      (hexadecimal)    |              (binary)
        +				//   --------------------+------------------------------------
        +				//   0000 0000-0000 007F | 0xxxxxxx
        +				//   0000 0080-0000 07FF | 110xxxxx 10xxxxxx
        +				//   0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
        +				//   0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
        +				//
        +				// Additionally, the characters in the range 0xD800-0xDFFF
        +				// are prohibited as they are reserved for use with UTF-16
        +				// surrogate pairs.
        +
        +				// Determine the length of the UTF-8 sequence.
        +				octet := parser.raw_buffer[parser.raw_buffer_pos]
        +				switch {
        +				case octet&0x80 == 0x00:
        +					width = 1
        +				case octet&0xE0 == 0xC0:
        +					width = 2
        +				case octet&0xF0 == 0xE0:
        +					width = 3
        +				case octet&0xF8 == 0xF0:
        +					width = 4
        +				default:
        +					// The leading octet is invalid.
        +					return yaml_parser_set_reader_error(parser,
        +						"invalid leading UTF-8 octet",
        +						parser.offset, int(octet))
        +				}
        +
        +				// Check if the raw buffer contains an incomplete character.
        +				if width > raw_unread {
        +					if parser.eof {
        +						return yaml_parser_set_reader_error(parser,
        +							"incomplete UTF-8 octet sequence",
        +							parser.offset, -1)
        +					}
        +					break inner
        +				}
        +
        +				// Decode the leading octet.
        +				switch {
        +				case octet&0x80 == 0x00:
        +					value = rune(octet & 0x7F)
        +				case octet&0xE0 == 0xC0:
        +					value = rune(octet & 0x1F)
        +				case octet&0xF0 == 0xE0:
        +					value = rune(octet & 0x0F)
        +				case octet&0xF8 == 0xF0:
        +					value = rune(octet & 0x07)
        +				default:
        +					value = 0
        +				}
        +
        +				// Check and decode the trailing octets.
        +				for k := 1; k < width; k++ {
        +					octet = parser.raw_buffer[parser.raw_buffer_pos+k]
        +
        +					// Check if the octet is valid.
        +					if (octet & 0xC0) != 0x80 {
        +						return yaml_parser_set_reader_error(parser,
        +							"invalid trailing UTF-8 octet",
        +							parser.offset+k, int(octet))
        +					}
        +
        +					// Decode the octet.
        +					value = (value << 6) + rune(octet&0x3F)
        +				}
        +
        +				// Check the length of the sequence against the value.
        +				switch {
        +				case width == 1:
        +				case width == 2 && value >= 0x80:
        +				case width == 3 && value >= 0x800:
        +				case width == 4 && value >= 0x10000:
        +				default:
        +					return yaml_parser_set_reader_error(parser,
        +						"invalid length of a UTF-8 sequence",
        +						parser.offset, -1)
        +				}
        +
        +				// Check the range of the value.
        +				if value >= 0xD800 && value <= 0xDFFF || value > 0x10FFFF {
        +					return yaml_parser_set_reader_error(parser,
        +						"invalid Unicode character",
        +						parser.offset, int(value))
        +				}
        +
        +			case yaml_UTF16LE_ENCODING, yaml_UTF16BE_ENCODING:
        +				var low, high int
        +				if parser.encoding == yaml_UTF16LE_ENCODING {
        +					low, high = 0, 1
        +				} else {
        +					low, high = 1, 0
        +				}
        +
        +				// The UTF-16 encoding is not as simple as one might
        +				// naively think.  Check RFC 2781
        +				// (http://www.ietf.org/rfc/rfc2781.txt).
        +				//
        +				// Normally, two subsequent bytes describe a Unicode
        +				// character.  However a special technique (called a
        +				// surrogate pair) is used for specifying character
        +				// values larger than 0xFFFF.
        +				//
        +				// A surrogate pair consists of two pseudo-characters:
        +				//      high surrogate area (0xD800-0xDBFF)
        +				//      low surrogate area (0xDC00-0xDFFF)
        +				//
        +				// The following formulas are used for decoding
        +				// and encoding characters using surrogate pairs:
        +				//
        +				//  U  = U' + 0x10000   (0x01 00 00 <= U <= 0x10 FF FF)
        +				//  U' = yyyyyyyyyyxxxxxxxxxx   (0 <= U' <= 0x0F FF FF)
        +				//  W1 = 110110yyyyyyyyyy
        +				//  W2 = 110111xxxxxxxxxx
        +				//
        +				// where U is the character value, W1 is the high surrogate
        +				// area, W2 is the low surrogate area.
        +
        +				// Check for incomplete UTF-16 character.
        +				if raw_unread < 2 {
        +					if parser.eof {
        +						return yaml_parser_set_reader_error(parser,
        +							"incomplete UTF-16 character",
        +							parser.offset, -1)
        +					}
        +					break inner
        +				}
        +
        +				// Get the character.
        +				value = rune(parser.raw_buffer[parser.raw_buffer_pos+low]) +
        +					(rune(parser.raw_buffer[parser.raw_buffer_pos+high]) << 8)
        +
        +				// Check for unexpected low surrogate area.
        +				if value&0xFC00 == 0xDC00 {
        +					return yaml_parser_set_reader_error(parser,
        +						"unexpected low surrogate area",
        +						parser.offset, int(value))
        +				}
        +
        +				// Check for a high surrogate area.
        +				if value&0xFC00 == 0xD800 {
        +					width = 4
        +
        +					// Check for incomplete surrogate pair.
        +					if raw_unread < 4 {
        +						if parser.eof {
        +							return yaml_parser_set_reader_error(parser,
        +								"incomplete UTF-16 surrogate pair",
        +								parser.offset, -1)
        +						}
        +						break inner
        +					}
        +
        +					// Get the next character.
        +					value2 := rune(parser.raw_buffer[parser.raw_buffer_pos+low+2]) +
        +						(rune(parser.raw_buffer[parser.raw_buffer_pos+high+2]) << 8)
        +
        +					// Check for a low surrogate area.
        +					if value2&0xFC00 != 0xDC00 {
        +						return yaml_parser_set_reader_error(parser,
        +							"expected low surrogate area",
        +							parser.offset+2, int(value2))
        +					}
        +
        +					// Generate the value of the surrogate pair.
        +					value = 0x10000 + ((value & 0x3FF) << 10) + (value2 & 0x3FF)
        +				} else {
        +					width = 2
        +				}
        +
        +			default:
        +				panic("impossible")
        +			}
        +
        +			// Check if the character is in the allowed range:
        +			//      #x9 | #xA | #xD | [#x20-#x7E]               (8 bit)
        +			//      | #x85 | [#xA0-#xD7FF] | [#xE000-#xFFFD]    (16 bit)
        +			//      | [#x10000-#x10FFFF]                        (32 bit)
        +			switch {
        +			case value == 0x09:
        +			case value == 0x0A:
        +			case value == 0x0D:
        +			case value >= 0x20 && value <= 0x7E:
        +			case value == 0x85:
        +			case value >= 0xA0 && value <= 0xD7FF:
        +			case value >= 0xE000 && value <= 0xFFFD:
        +			case value >= 0x10000 && value <= 0x10FFFF:
        +			default:
        +				return yaml_parser_set_reader_error(parser,
        +					"control characters are not allowed",
        +					parser.offset, int(value))
        +			}
        +
        +			// Move the raw pointers.
        +			parser.raw_buffer_pos += width
        +			parser.offset += width
        +
        +			// Finally put the character into the buffer.
        +			if value <= 0x7F {
        +				// 0000 0000-0000 007F . 0xxxxxxx
        +				parser.buffer[buffer_len+0] = byte(value)
        +				buffer_len += 1
        +			} else if value <= 0x7FF {
        +				// 0000 0080-0000 07FF . 110xxxxx 10xxxxxx
        +				parser.buffer[buffer_len+0] = byte(0xC0 + (value >> 6))
        +				parser.buffer[buffer_len+1] = byte(0x80 + (value & 0x3F))
        +				buffer_len += 2
        +			} else if value <= 0xFFFF {
        +				// 0000 0800-0000 FFFF . 1110xxxx 10xxxxxx 10xxxxxx
        +				parser.buffer[buffer_len+0] = byte(0xE0 + (value >> 12))
        +				parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 6) & 0x3F))
        +				parser.buffer[buffer_len+2] = byte(0x80 + (value & 0x3F))
        +				buffer_len += 3
        +			} else {
        +				// 0001 0000-0010 FFFF . 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
        +				parser.buffer[buffer_len+0] = byte(0xF0 + (value >> 18))
        +				parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 12) & 0x3F))
        +				parser.buffer[buffer_len+2] = byte(0x80 + ((value >> 6) & 0x3F))
        +				parser.buffer[buffer_len+3] = byte(0x80 + (value & 0x3F))
        +				buffer_len += 4
        +			}
        +
        +			parser.unread++
        +		}
        +
        +		// On EOF, put NUL into the buffer and return.
        +		if parser.eof {
        +			parser.buffer[buffer_len] = 0
        +			buffer_len++
        +			parser.unread++
        +			break
        +		}
        +	}
        +	// [Go] Read the documentation of this function above. To return true,
        +	// we need to have the given length in the buffer. Not doing that means
        +	// every single check that calls this function to make sure the buffer
        +	// has a given length is Go) panicking; or C) accessing invalid memory.
        +	// This happens here due to the EOF above breaking early.
        +	for buffer_len < length {
        +		parser.buffer[buffer_len] = 0
        +		buffer_len++
        +	}
        +	parser.buffer = parser.buffer[:buffer_len]
        +	return true
        +}
        diff --git a/vendor/gopkg.in/yaml.v3/resolve.go b/vendor/gopkg.in/yaml.v3/resolve.go
        new file mode 100644
        index 000000000..64ae88805
        --- /dev/null
        +++ b/vendor/gopkg.in/yaml.v3/resolve.go
        @@ -0,0 +1,326 @@
        +//
        +// Copyright (c) 2011-2019 Canonical Ltd
        +//
        +// Licensed under the Apache License, Version 2.0 (the "License");
        +// you may not use this file except in compliance with the License.
        +// You may obtain a copy of the License at
        +//
        +//     http://www.apache.org/licenses/LICENSE-2.0
        +//
        +// Unless required by applicable law or agreed to in writing, software
        +// distributed under the License is distributed on an "AS IS" BASIS,
        +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        +// See the License for the specific language governing permissions and
        +// limitations under the License.
        +
        +package yaml
        +
        +import (
        +	"encoding/base64"
        +	"math"
        +	"regexp"
        +	"strconv"
        +	"strings"
        +	"time"
        +)
        +
        +type resolveMapItem struct {
        +	value interface{}
        +	tag   string
        +}
        +
        +var resolveTable = make([]byte, 256)
        +var resolveMap = make(map[string]resolveMapItem)
        +
        +func init() {
        +	t := resolveTable
        +	t[int('+')] = 'S' // Sign
        +	t[int('-')] = 'S'
        +	for _, c := range "0123456789" {
        +		t[int(c)] = 'D' // Digit
        +	}
        +	for _, c := range "yYnNtTfFoO~" {
        +		t[int(c)] = 'M' // In map
        +	}
        +	t[int('.')] = '.' // Float (potentially in map)
        +
        +	var resolveMapList = []struct {
        +		v   interface{}
        +		tag string
        +		l   []string
        +	}{
        +		{true, boolTag, []string{"true", "True", "TRUE"}},
        +		{false, boolTag, []string{"false", "False", "FALSE"}},
        +		{nil, nullTag, []string{"", "~", "null", "Null", "NULL"}},
        +		{math.NaN(), floatTag, []string{".nan", ".NaN", ".NAN"}},
        +		{math.Inf(+1), floatTag, []string{".inf", ".Inf", ".INF"}},
        +		{math.Inf(+1), floatTag, []string{"+.inf", "+.Inf", "+.INF"}},
        +		{math.Inf(-1), floatTag, []string{"-.inf", "-.Inf", "-.INF"}},
        +		{"<<", mergeTag, []string{"<<"}},
        +	}
        +
        +	m := resolveMap
        +	for _, item := range resolveMapList {
        +		for _, s := range item.l {
        +			m[s] = resolveMapItem{item.v, item.tag}
        +		}
        +	}
        +}
        +
        +const (
        +	nullTag      = "!!null"
        +	boolTag      = "!!bool"
        +	strTag       = "!!str"
        +	intTag       = "!!int"
        +	floatTag     = "!!float"
        +	timestampTag = "!!timestamp"
        +	seqTag       = "!!seq"
        +	mapTag       = "!!map"
        +	binaryTag    = "!!binary"
        +	mergeTag     = "!!merge"
        +)
        +
        +var longTags = make(map[string]string)
        +var shortTags = make(map[string]string)
        +
        +func init() {
        +	for _, stag := range []string{nullTag, boolTag, strTag, intTag, floatTag, timestampTag, seqTag, mapTag, binaryTag, mergeTag} {
        +		ltag := longTag(stag)
        +		longTags[stag] = ltag
        +		shortTags[ltag] = stag
        +	}
        +}
        +
        +const longTagPrefix = "tag:yaml.org,2002:"
        +
        +func shortTag(tag string) string {
        +	if strings.HasPrefix(tag, longTagPrefix) {
        +		if stag, ok := shortTags[tag]; ok {
        +			return stag
        +		}
        +		return "!!" + tag[len(longTagPrefix):]
        +	}
        +	return tag
        +}
        +
        +func longTag(tag string) string {
        +	if strings.HasPrefix(tag, "!!") {
        +		if ltag, ok := longTags[tag]; ok {
        +			return ltag
        +		}
        +		return longTagPrefix + tag[2:]
        +	}
        +	return tag
        +}
        +
        +func resolvableTag(tag string) bool {
        +	switch tag {
        +	case "", strTag, boolTag, intTag, floatTag, nullTag, timestampTag:
        +		return true
        +	}
        +	return false
        +}
        +
        +var yamlStyleFloat = regexp.MustCompile(`^[-+]?(\.[0-9]+|[0-9]+(\.[0-9]*)?)([eE][-+]?[0-9]+)?$`)
        +
        +func resolve(tag string, in string) (rtag string, out interface{}) {
        +	tag = shortTag(tag)
        +	if !resolvableTag(tag) {
        +		return tag, in
        +	}
        +
        +	defer func() {
        +		switch tag {
        +		case "", rtag, strTag, binaryTag:
        +			return
        +		case floatTag:
        +			if rtag == intTag {
        +				switch v := out.(type) {
        +				case int64:
        +					rtag = floatTag
        +					out = float64(v)
        +					return
        +				case int:
        +					rtag = floatTag
        +					out = float64(v)
        +					return
        +				}
        +			}
        +		}
        +		failf("cannot decode %s `%s` as a %s", shortTag(rtag), in, shortTag(tag))
        +	}()
        +
        +	// Any data is accepted as a !!str or !!binary.
        +	// Otherwise, the prefix is enough of a hint about what it might be.
        +	hint := byte('N')
        +	if in != "" {
        +		hint = resolveTable[in[0]]
        +	}
        +	if hint != 0 && tag != strTag && tag != binaryTag {
        +		// Handle things we can lookup in a map.
        +		if item, ok := resolveMap[in]; ok {
        +			return item.tag, item.value
        +		}
        +
        +		// Base 60 floats are a bad idea, were dropped in YAML 1.2, and
        +		// are purposefully unsupported here. They're still quoted on
        +		// the way out for compatibility with other parser, though.
        +
        +		switch hint {
        +		case 'M':
        +			// We've already checked the map above.
        +
        +		case '.':
        +			// Not in the map, so maybe a normal float.
        +			floatv, err := strconv.ParseFloat(in, 64)
        +			if err == nil {
        +				return floatTag, floatv
        +			}
        +
        +		case 'D', 'S':
        +			// Int, float, or timestamp.
        +			// Only try values as a timestamp if the value is unquoted or there's an explicit
        +			// !!timestamp tag.
        +			if tag == "" || tag == timestampTag {
        +				t, ok := parseTimestamp(in)
        +				if ok {
        +					return timestampTag, t
        +				}
        +			}
        +
        +			plain := strings.Replace(in, "_", "", -1)
        +			intv, err := strconv.ParseInt(plain, 0, 64)
        +			if err == nil {
        +				if intv == int64(int(intv)) {
        +					return intTag, int(intv)
        +				} else {
        +					return intTag, intv
        +				}
        +			}
        +			uintv, err := strconv.ParseUint(plain, 0, 64)
        +			if err == nil {
        +				return intTag, uintv
        +			}
        +			if yamlStyleFloat.MatchString(plain) {
        +				floatv, err := strconv.ParseFloat(plain, 64)
        +				if err == nil {
        +					return floatTag, floatv
        +				}
        +			}
        +			if strings.HasPrefix(plain, "0b") {
        +				intv, err := strconv.ParseInt(plain[2:], 2, 64)
        +				if err == nil {
        +					if intv == int64(int(intv)) {
        +						return intTag, int(intv)
        +					} else {
        +						return intTag, intv
        +					}
        +				}
        +				uintv, err := strconv.ParseUint(plain[2:], 2, 64)
        +				if err == nil {
        +					return intTag, uintv
        +				}
        +			} else if strings.HasPrefix(plain, "-0b") {
        +				intv, err := strconv.ParseInt("-"+plain[3:], 2, 64)
        +				if err == nil {
        +					if true || intv == int64(int(intv)) {
        +						return intTag, int(intv)
        +					} else {
        +						return intTag, intv
        +					}
        +				}
        +			}
        +			// Octals as introduced in version 1.2 of the spec.
        +			// Octals from the 1.1 spec, spelled as 0777, are still
        +			// decoded by default in v3 as well for compatibility.
        +			// May be dropped in v4 depending on how usage evolves.
        +			if strings.HasPrefix(plain, "0o") {
        +				intv, err := strconv.ParseInt(plain[2:], 8, 64)
        +				if err == nil {
        +					if intv == int64(int(intv)) {
        +						return intTag, int(intv)
        +					} else {
        +						return intTag, intv
        +					}
        +				}
        +				uintv, err := strconv.ParseUint(plain[2:], 8, 64)
        +				if err == nil {
        +					return intTag, uintv
        +				}
        +			} else if strings.HasPrefix(plain, "-0o") {
        +				intv, err := strconv.ParseInt("-"+plain[3:], 8, 64)
        +				if err == nil {
        +					if true || intv == int64(int(intv)) {
        +						return intTag, int(intv)
        +					} else {
        +						return intTag, intv
        +					}
        +				}
        +			}
        +		default:
        +			panic("internal error: missing handler for resolver table: " + string(rune(hint)) + " (with " + in + ")")
        +		}
        +	}
        +	return strTag, in
        +}
        +
        +// encodeBase64 encodes s as base64 that is broken up into multiple lines
        +// as appropriate for the resulting length.
        +func encodeBase64(s string) string {
        +	const lineLen = 70
        +	encLen := base64.StdEncoding.EncodedLen(len(s))
        +	lines := encLen/lineLen + 1
        +	buf := make([]byte, encLen*2+lines)
        +	in := buf[0:encLen]
        +	out := buf[encLen:]
        +	base64.StdEncoding.Encode(in, []byte(s))
        +	k := 0
        +	for i := 0; i < len(in); i += lineLen {
        +		j := i + lineLen
        +		if j > len(in) {
        +			j = len(in)
        +		}
        +		k += copy(out[k:], in[i:j])
        +		if lines > 1 {
        +			out[k] = '\n'
        +			k++
        +		}
        +	}
        +	return string(out[:k])
        +}
        +
        +// This is a subset of the formats allowed by the regular expression
        +// defined at http://yaml.org/type/timestamp.html.
        +var allowedTimestampFormats = []string{
        +	"2006-1-2T15:4:5.999999999Z07:00", // RCF3339Nano with short date fields.
        +	"2006-1-2t15:4:5.999999999Z07:00", // RFC3339Nano with short date fields and lower-case "t".
        +	"2006-1-2 15:4:5.999999999",       // space separated with no time zone
        +	"2006-1-2",                        // date only
        +	// Notable exception: time.Parse cannot handle: "2001-12-14 21:59:43.10 -5"
        +	// from the set of examples.
        +}
        +
        +// parseTimestamp parses s as a timestamp string and
        +// returns the timestamp and reports whether it succeeded.
        +// Timestamp formats are defined at http://yaml.org/type/timestamp.html
        +func parseTimestamp(s string) (time.Time, bool) {
        +	// TODO write code to check all the formats supported by
        +	// http://yaml.org/type/timestamp.html instead of using time.Parse.
        +
        +	// Quick check: all date formats start with YYYY-.
        +	i := 0
        +	for ; i < len(s); i++ {
        +		if c := s[i]; c < '0' || c > '9' {
        +			break
        +		}
        +	}
        +	if i != 4 || i == len(s) || s[i] != '-' {
        +		return time.Time{}, false
        +	}
        +	for _, format := range allowedTimestampFormats {
        +		if t, err := time.Parse(format, s); err == nil {
        +			return t, true
        +		}
        +	}
        +	return time.Time{}, false
        +}
        diff --git a/vendor/gopkg.in/yaml.v3/scannerc.go b/vendor/gopkg.in/yaml.v3/scannerc.go
        new file mode 100644
        index 000000000..57e954ca5
        --- /dev/null
        +++ b/vendor/gopkg.in/yaml.v3/scannerc.go
        @@ -0,0 +1,3025 @@
        +//
        +// Copyright (c) 2011-2019 Canonical Ltd
        +// Copyright (c) 2006-2010 Kirill Simonov
        +//
        +// Permission is hereby granted, free of charge, to any person obtaining a copy of
        +// this software and associated documentation files (the "Software"), to deal in
        +// the Software without restriction, including without limitation the rights to
        +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
        +// of the Software, and to permit persons to whom the Software is furnished to do
        +// so, subject to the following conditions:
        +//
        +// The above copyright notice and this permission notice shall be included in all
        +// copies or substantial portions of the Software.
        +//
        +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        +// SOFTWARE.
        +
        +package yaml
        +
        +import (
        +	"bytes"
        +	"fmt"
        +)
        +
        +// Introduction
        +// ************
        +//
        +// The following notes assume that you are familiar with the YAML specification
        +// (http://yaml.org/spec/1.2/spec.html).  We mostly follow it, although in
        +// some cases we are less restrictive that it requires.
        +//
        +// The process of transforming a YAML stream into a sequence of events is
        +// divided on two steps: Scanning and Parsing.
        +//
        +// The Scanner transforms the input stream into a sequence of tokens, while the
        +// parser transform the sequence of tokens produced by the Scanner into a
        +// sequence of parsing events.
        +//
        +// The Scanner is rather clever and complicated. The Parser, on the contrary,
        +// is a straightforward implementation of a recursive-descendant parser (or,
        +// LL(1) parser, as it is usually called).
        +//
        +// Actually there are two issues of Scanning that might be called "clever", the
        +// rest is quite straightforward.  The issues are "block collection start" and
        +// "simple keys".  Both issues are explained below in details.
        +//
        +// Here the Scanning step is explained and implemented.  We start with the list
        +// of all the tokens produced by the Scanner together with short descriptions.
        +//
        +// Now, tokens:
        +//
        +//      STREAM-START(encoding)          # The stream start.
        +//      STREAM-END                      # The stream end.
        +//      VERSION-DIRECTIVE(major,minor)  # The '%YAML' directive.
        +//      TAG-DIRECTIVE(handle,prefix)    # The '%TAG' directive.
        +//      DOCUMENT-START                  # '---'
        +//      DOCUMENT-END                    # '...'
        +//      BLOCK-SEQUENCE-START            # Indentation increase denoting a block
        +//      BLOCK-MAPPING-START             # sequence or a block mapping.
        +//      BLOCK-END                       # Indentation decrease.
        +//      FLOW-SEQUENCE-START             # '['
        +//      FLOW-SEQUENCE-END               # ']'
        +//      BLOCK-SEQUENCE-START            # '{'
        +//      BLOCK-SEQUENCE-END              # '}'
        +//      BLOCK-ENTRY                     # '-'
        +//      FLOW-ENTRY                      # ','
        +//      KEY                             # '?' or nothing (simple keys).
        +//      VALUE                           # ':'
        +//      ALIAS(anchor)                   # '*anchor'
        +//      ANCHOR(anchor)                  # '&anchor'
        +//      TAG(handle,suffix)              # '!handle!suffix'
        +//      SCALAR(value,style)             # A scalar.
        +//
        +// The following two tokens are "virtual" tokens denoting the beginning and the
        +// end of the stream:
        +//
        +//      STREAM-START(encoding)
        +//      STREAM-END
        +//
        +// We pass the information about the input stream encoding with the
        +// STREAM-START token.
        +//
        +// The next two tokens are responsible for tags:
        +//
        +//      VERSION-DIRECTIVE(major,minor)
        +//      TAG-DIRECTIVE(handle,prefix)
        +//
        +// Example:
        +//
        +//      %YAML   1.1
        +//      %TAG    !   !foo
        +//      %TAG    !yaml!  tag:yaml.org,2002:
        +//      ---
        +//
        +// The correspoding sequence of tokens:
        +//
        +//      STREAM-START(utf-8)
        +//      VERSION-DIRECTIVE(1,1)
        +//      TAG-DIRECTIVE("!","!foo")
        +//      TAG-DIRECTIVE("!yaml","tag:yaml.org,2002:")
        +//      DOCUMENT-START
        +//      STREAM-END
        +//
        +// Note that the VERSION-DIRECTIVE and TAG-DIRECTIVE tokens occupy a whole
        +// line.
        +//
        +// The document start and end indicators are represented by:
        +//
        +//      DOCUMENT-START
        +//      DOCUMENT-END
        +//
        +// Note that if a YAML stream contains an implicit document (without '---'
        +// and '...' indicators), no DOCUMENT-START and DOCUMENT-END tokens will be
        +// produced.
        +//
        +// In the following examples, we present whole documents together with the
        +// produced tokens.
        +//
        +//      1. An implicit document:
        +//
        +//          'a scalar'
        +//
        +//      Tokens:
        +//
        +//          STREAM-START(utf-8)
        +//          SCALAR("a scalar",single-quoted)
        +//          STREAM-END
        +//
        +//      2. An explicit document:
        +//
        +//          ---
        +//          'a scalar'
        +//          ...
        +//
        +//      Tokens:
        +//
        +//          STREAM-START(utf-8)
        +//          DOCUMENT-START
        +//          SCALAR("a scalar",single-quoted)
        +//          DOCUMENT-END
        +//          STREAM-END
        +//
        +//      3. Several documents in a stream:
        +//
        +//          'a scalar'
        +//          ---
        +//          'another scalar'
        +//          ---
        +//          'yet another scalar'
        +//
        +//      Tokens:
        +//
        +//          STREAM-START(utf-8)
        +//          SCALAR("a scalar",single-quoted)
        +//          DOCUMENT-START
        +//          SCALAR("another scalar",single-quoted)
        +//          DOCUMENT-START
        +//          SCALAR("yet another scalar",single-quoted)
        +//          STREAM-END
        +//
        +// We have already introduced the SCALAR token above.  The following tokens are
        +// used to describe aliases, anchors, tag, and scalars:
        +//
        +//      ALIAS(anchor)
        +//      ANCHOR(anchor)
        +//      TAG(handle,suffix)
        +//      SCALAR(value,style)
        +//
        +// The following series of examples illustrate the usage of these tokens:
        +//
        +//      1. A recursive sequence:
        +//
        +//          &A [ *A ]
        +//
        +//      Tokens:
        +//
        +//          STREAM-START(utf-8)
        +//          ANCHOR("A")
        +//          FLOW-SEQUENCE-START
        +//          ALIAS("A")
        +//          FLOW-SEQUENCE-END
        +//          STREAM-END
        +//
        +//      2. A tagged scalar:
        +//
        +//          !!float "3.14"  # A good approximation.
        +//
        +//      Tokens:
        +//
        +//          STREAM-START(utf-8)
        +//          TAG("!!","float")
        +//          SCALAR("3.14",double-quoted)
        +//          STREAM-END
        +//
        +//      3. Various scalar styles:
        +//
        +//          --- # Implicit empty plain scalars do not produce tokens.
        +//          --- a plain scalar
        +//          --- 'a single-quoted scalar'
        +//          --- "a double-quoted scalar"
        +//          --- |-
        +//            a literal scalar
        +//          --- >-
        +//            a folded
        +//            scalar
        +//
        +//      Tokens:
        +//
        +//          STREAM-START(utf-8)
        +//          DOCUMENT-START
        +//          DOCUMENT-START
        +//          SCALAR("a plain scalar",plain)
        +//          DOCUMENT-START
        +//          SCALAR("a single-quoted scalar",single-quoted)
        +//          DOCUMENT-START
        +//          SCALAR("a double-quoted scalar",double-quoted)
        +//          DOCUMENT-START
        +//          SCALAR("a literal scalar",literal)
        +//          DOCUMENT-START
        +//          SCALAR("a folded scalar",folded)
        +//          STREAM-END
        +//
        +// Now it's time to review collection-related tokens. We will start with
        +// flow collections:
        +//
        +//      FLOW-SEQUENCE-START
        +//      FLOW-SEQUENCE-END
        +//      FLOW-MAPPING-START
        +//      FLOW-MAPPING-END
        +//      FLOW-ENTRY
        +//      KEY
        +//      VALUE
        +//
        +// The tokens FLOW-SEQUENCE-START, FLOW-SEQUENCE-END, FLOW-MAPPING-START, and
        +// FLOW-MAPPING-END represent the indicators '[', ']', '{', and '}'
        +// correspondingly.  FLOW-ENTRY represent the ',' indicator.  Finally the
        +// indicators '?' and ':', which are used for denoting mapping keys and values,
        +// are represented by the KEY and VALUE tokens.
        +//
        +// The following examples show flow collections:
        +//
        +//      1. A flow sequence:
        +//
        +//          [item 1, item 2, item 3]
        +//
        +//      Tokens:
        +//
        +//          STREAM-START(utf-8)
        +//          FLOW-SEQUENCE-START
        +//          SCALAR("item 1",plain)
        +//          FLOW-ENTRY
        +//          SCALAR("item 2",plain)
        +//          FLOW-ENTRY
        +//          SCALAR("item 3",plain)
        +//          FLOW-SEQUENCE-END
        +//          STREAM-END
        +//
        +//      2. A flow mapping:
        +//
        +//          {
        +//              a simple key: a value,  # Note that the KEY token is produced.
        +//              ? a complex key: another value,
        +//          }
        +//
        +//      Tokens:
        +//
        +//          STREAM-START(utf-8)
        +//          FLOW-MAPPING-START
        +//          KEY
        +//          SCALAR("a simple key",plain)
        +//          VALUE
        +//          SCALAR("a value",plain)
        +//          FLOW-ENTRY
        +//          KEY
        +//          SCALAR("a complex key",plain)
        +//          VALUE
        +//          SCALAR("another value",plain)
        +//          FLOW-ENTRY
        +//          FLOW-MAPPING-END
        +//          STREAM-END
        +//
        +// A simple key is a key which is not denoted by the '?' indicator.  Note that
        +// the Scanner still produce the KEY token whenever it encounters a simple key.
        +//
        +// For scanning block collections, the following tokens are used (note that we
        +// repeat KEY and VALUE here):
        +//
        +//      BLOCK-SEQUENCE-START
        +//      BLOCK-MAPPING-START
        +//      BLOCK-END
        +//      BLOCK-ENTRY
        +//      KEY
        +//      VALUE
        +//
        +// The tokens BLOCK-SEQUENCE-START and BLOCK-MAPPING-START denote indentation
        +// increase that precedes a block collection (cf. the INDENT token in Python).
        +// The token BLOCK-END denote indentation decrease that ends a block collection
        +// (cf. the DEDENT token in Python).  However YAML has some syntax pecularities
        +// that makes detections of these tokens more complex.
        +//
        +// The tokens BLOCK-ENTRY, KEY, and VALUE are used to represent the indicators
        +// '-', '?', and ':' correspondingly.
        +//
        +// The following examples show how the tokens BLOCK-SEQUENCE-START,
        +// BLOCK-MAPPING-START, and BLOCK-END are emitted by the Scanner:
        +//
        +//      1. Block sequences:
        +//
        +//          - item 1
        +//          - item 2
        +//          -
        +//            - item 3.1
        +//            - item 3.2
        +//          -
        +//            key 1: value 1
        +//            key 2: value 2
        +//
        +//      Tokens:
        +//
        +//          STREAM-START(utf-8)
        +//          BLOCK-SEQUENCE-START
        +//          BLOCK-ENTRY
        +//          SCALAR("item 1",plain)
        +//          BLOCK-ENTRY
        +//          SCALAR("item 2",plain)
        +//          BLOCK-ENTRY
        +//          BLOCK-SEQUENCE-START
        +//          BLOCK-ENTRY
        +//          SCALAR("item 3.1",plain)
        +//          BLOCK-ENTRY
        +//          SCALAR("item 3.2",plain)
        +//          BLOCK-END
        +//          BLOCK-ENTRY
        +//          BLOCK-MAPPING-START
        +//          KEY
        +//          SCALAR("key 1",plain)
        +//          VALUE
        +//          SCALAR("value 1",plain)
        +//          KEY
        +//          SCALAR("key 2",plain)
        +//          VALUE
        +//          SCALAR("value 2",plain)
        +//          BLOCK-END
        +//          BLOCK-END
        +//          STREAM-END
        +//
        +//      2. Block mappings:
        +//
        +//          a simple key: a value   # The KEY token is produced here.
        +//          ? a complex key
        +//          : another value
        +//          a mapping:
        +//            key 1: value 1
        +//            key 2: value 2
        +//          a sequence:
        +//            - item 1
        +//            - item 2
        +//
        +//      Tokens:
        +//
        +//          STREAM-START(utf-8)
        +//          BLOCK-MAPPING-START
        +//          KEY
        +//          SCALAR("a simple key",plain)
        +//          VALUE
        +//          SCALAR("a value",plain)
        +//          KEY
        +//          SCALAR("a complex key",plain)
        +//          VALUE
        +//          SCALAR("another value",plain)
        +//          KEY
        +//          SCALAR("a mapping",plain)
        +//          BLOCK-MAPPING-START
        +//          KEY
        +//          SCALAR("key 1",plain)
        +//          VALUE
        +//          SCALAR("value 1",plain)
        +//          KEY
        +//          SCALAR("key 2",plain)
        +//          VALUE
        +//          SCALAR("value 2",plain)
        +//          BLOCK-END
        +//          KEY
        +//          SCALAR("a sequence",plain)
        +//          VALUE
        +//          BLOCK-SEQUENCE-START
        +//          BLOCK-ENTRY
        +//          SCALAR("item 1",plain)
        +//          BLOCK-ENTRY
        +//          SCALAR("item 2",plain)
        +//          BLOCK-END
        +//          BLOCK-END
        +//          STREAM-END
        +//
        +// YAML does not always require to start a new block collection from a new
        +// line.  If the current line contains only '-', '?', and ':' indicators, a new
        +// block collection may start at the current line.  The following examples
        +// illustrate this case:
        +//
        +//      1. Collections in a sequence:
        +//
        +//          - - item 1
        +//            - item 2
        +//          - key 1: value 1
        +//            key 2: value 2
        +//          - ? complex key
        +//            : complex value
        +//
        +//      Tokens:
        +//
        +//          STREAM-START(utf-8)
        +//          BLOCK-SEQUENCE-START
        +//          BLOCK-ENTRY
        +//          BLOCK-SEQUENCE-START
        +//          BLOCK-ENTRY
        +//          SCALAR("item 1",plain)
        +//          BLOCK-ENTRY
        +//          SCALAR("item 2",plain)
        +//          BLOCK-END
        +//          BLOCK-ENTRY
        +//          BLOCK-MAPPING-START
        +//          KEY
        +//          SCALAR("key 1",plain)
        +//          VALUE
        +//          SCALAR("value 1",plain)
        +//          KEY
        +//          SCALAR("key 2",plain)
        +//          VALUE
        +//          SCALAR("value 2",plain)
        +//          BLOCK-END
        +//          BLOCK-ENTRY
        +//          BLOCK-MAPPING-START
        +//          KEY
        +//          SCALAR("complex key")
        +//          VALUE
        +//          SCALAR("complex value")
        +//          BLOCK-END
        +//          BLOCK-END
        +//          STREAM-END
        +//
        +//      2. Collections in a mapping:
        +//
        +//          ? a sequence
        +//          : - item 1
        +//            - item 2
        +//          ? a mapping
        +//          : key 1: value 1
        +//            key 2: value 2
        +//
        +//      Tokens:
        +//
        +//          STREAM-START(utf-8)
        +//          BLOCK-MAPPING-START
        +//          KEY
        +//          SCALAR("a sequence",plain)
        +//          VALUE
        +//          BLOCK-SEQUENCE-START
        +//          BLOCK-ENTRY
        +//          SCALAR("item 1",plain)
        +//          BLOCK-ENTRY
        +//          SCALAR("item 2",plain)
        +//          BLOCK-END
        +//          KEY
        +//          SCALAR("a mapping",plain)
        +//          VALUE
        +//          BLOCK-MAPPING-START
        +//          KEY
        +//          SCALAR("key 1",plain)
        +//          VALUE
        +//          SCALAR("value 1",plain)
        +//          KEY
        +//          SCALAR("key 2",plain)
        +//          VALUE
        +//          SCALAR("value 2",plain)
        +//          BLOCK-END
        +//          BLOCK-END
        +//          STREAM-END
        +//
        +// YAML also permits non-indented sequences if they are included into a block
        +// mapping.  In this case, the token BLOCK-SEQUENCE-START is not produced:
        +//
        +//      key:
        +//      - item 1    # BLOCK-SEQUENCE-START is NOT produced here.
        +//      - item 2
        +//
        +// Tokens:
        +//
        +//      STREAM-START(utf-8)
        +//      BLOCK-MAPPING-START
        +//      KEY
        +//      SCALAR("key",plain)
        +//      VALUE
        +//      BLOCK-ENTRY
        +//      SCALAR("item 1",plain)
        +//      BLOCK-ENTRY
        +//      SCALAR("item 2",plain)
        +//      BLOCK-END
        +//
        +
        +// Ensure that the buffer contains the required number of characters.
        +// Return true on success, false on failure (reader error or memory error).
        +func cache(parser *yaml_parser_t, length int) bool {
        +	// [Go] This was inlined: !cache(A, B) -> unread < B && !update(A, B)
        +	return parser.unread >= length || yaml_parser_update_buffer(parser, length)
        +}
        +
        +// Advance the buffer pointer.
        +func skip(parser *yaml_parser_t) {
        +	if !is_blank(parser.buffer, parser.buffer_pos) {
        +		parser.newlines = 0
        +	}
        +	parser.mark.index++
        +	parser.mark.column++
        +	parser.unread--
        +	parser.buffer_pos += width(parser.buffer[parser.buffer_pos])
        +}
        +
        +func skip_line(parser *yaml_parser_t) {
        +	if is_crlf(parser.buffer, parser.buffer_pos) {
        +		parser.mark.index += 2
        +		parser.mark.column = 0
        +		parser.mark.line++
        +		parser.unread -= 2
        +		parser.buffer_pos += 2
        +		parser.newlines++
        +	} else if is_break(parser.buffer, parser.buffer_pos) {
        +		parser.mark.index++
        +		parser.mark.column = 0
        +		parser.mark.line++
        +		parser.unread--
        +		parser.buffer_pos += width(parser.buffer[parser.buffer_pos])
        +		parser.newlines++
        +	}
        +}
        +
        +// Copy a character to a string buffer and advance pointers.
        +func read(parser *yaml_parser_t, s []byte) []byte {
        +	if !is_blank(parser.buffer, parser.buffer_pos) {
        +		parser.newlines = 0
        +	}
        +	w := width(parser.buffer[parser.buffer_pos])
        +	if w == 0 {
        +		panic("invalid character sequence")
        +	}
        +	if len(s) == 0 {
        +		s = make([]byte, 0, 32)
        +	}
        +	if w == 1 && len(s)+w <= cap(s) {
        +		s = s[:len(s)+1]
        +		s[len(s)-1] = parser.buffer[parser.buffer_pos]
        +		parser.buffer_pos++
        +	} else {
        +		s = append(s, parser.buffer[parser.buffer_pos:parser.buffer_pos+w]...)
        +		parser.buffer_pos += w
        +	}
        +	parser.mark.index++
        +	parser.mark.column++
        +	parser.unread--
        +	return s
        +}
        +
        +// Copy a line break character to a string buffer and advance pointers.
        +func read_line(parser *yaml_parser_t, s []byte) []byte {
        +	buf := parser.buffer
        +	pos := parser.buffer_pos
        +	switch {
        +	case buf[pos] == '\r' && buf[pos+1] == '\n':
        +		// CR LF . LF
        +		s = append(s, '\n')
        +		parser.buffer_pos += 2
        +		parser.mark.index++
        +		parser.unread--
        +	case buf[pos] == '\r' || buf[pos] == '\n':
        +		// CR|LF . LF
        +		s = append(s, '\n')
        +		parser.buffer_pos += 1
        +	case buf[pos] == '\xC2' && buf[pos+1] == '\x85':
        +		// NEL . LF
        +		s = append(s, '\n')
        +		parser.buffer_pos += 2
        +	case buf[pos] == '\xE2' && buf[pos+1] == '\x80' && (buf[pos+2] == '\xA8' || buf[pos+2] == '\xA9'):
        +		// LS|PS . LS|PS
        +		s = append(s, buf[parser.buffer_pos:pos+3]...)
        +		parser.buffer_pos += 3
        +	default:
        +		return s
        +	}
        +	parser.mark.index++
        +	parser.mark.column = 0
        +	parser.mark.line++
        +	parser.unread--
        +	parser.newlines++
        +	return s
        +}
        +
        +// Get the next token.
        +func yaml_parser_scan(parser *yaml_parser_t, token *yaml_token_t) bool {
        +	// Erase the token object.
        +	*token = yaml_token_t{} // [Go] Is this necessary?
        +
        +	// No tokens after STREAM-END or error.
        +	if parser.stream_end_produced || parser.error != yaml_NO_ERROR {
        +		return true
        +	}
        +
        +	// Ensure that the tokens queue contains enough tokens.
        +	if !parser.token_available {
        +		if !yaml_parser_fetch_more_tokens(parser) {
        +			return false
        +		}
        +	}
        +
        +	// Fetch the next token from the queue.
        +	*token = parser.tokens[parser.tokens_head]
        +	parser.tokens_head++
        +	parser.tokens_parsed++
        +	parser.token_available = false
        +
        +	if token.typ == yaml_STREAM_END_TOKEN {
        +		parser.stream_end_produced = true
        +	}
        +	return true
        +}
        +
        +// Set the scanner error and return false.
        +func yaml_parser_set_scanner_error(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string) bool {
        +	parser.error = yaml_SCANNER_ERROR
        +	parser.context = context
        +	parser.context_mark = context_mark
        +	parser.problem = problem
        +	parser.problem_mark = parser.mark
        +	return false
        +}
        +
        +func yaml_parser_set_scanner_tag_error(parser *yaml_parser_t, directive bool, context_mark yaml_mark_t, problem string) bool {
        +	context := "while parsing a tag"
        +	if directive {
        +		context = "while parsing a %TAG directive"
        +	}
        +	return yaml_parser_set_scanner_error(parser, context, context_mark, problem)
        +}
        +
        +func trace(args ...interface{}) func() {
        +	pargs := append([]interface{}{"+++"}, args...)
        +	fmt.Println(pargs...)
        +	pargs = append([]interface{}{"---"}, args...)
        +	return func() { fmt.Println(pargs...) }
        +}
        +
        +// Ensure that the tokens queue contains at least one token which can be
        +// returned to the Parser.
        +func yaml_parser_fetch_more_tokens(parser *yaml_parser_t) bool {
        +	// While we need more tokens to fetch, do it.
        +	for {
        +		// [Go] The comment parsing logic requires a lookahead of two tokens
        +		// so that foot comments may be parsed in time of associating them
        +		// with the tokens that are parsed before them, and also for line
        +		// comments to be transformed into head comments in some edge cases.
        +		if parser.tokens_head < len(parser.tokens)-2 {
        +			// If a potential simple key is at the head position, we need to fetch
        +			// the next token to disambiguate it.
        +			head_tok_idx, ok := parser.simple_keys_by_tok[parser.tokens_parsed]
        +			if !ok {
        +				break
        +			} else if valid, ok := yaml_simple_key_is_valid(parser, &parser.simple_keys[head_tok_idx]); !ok {
        +				return false
        +			} else if !valid {
        +				break
        +			}
        +		}
        +		// Fetch the next token.
        +		if !yaml_parser_fetch_next_token(parser) {
        +			return false
        +		}
        +	}
        +
        +	parser.token_available = true
        +	return true
        +}
        +
        +// The dispatcher for token fetchers.
        +func yaml_parser_fetch_next_token(parser *yaml_parser_t) (ok bool) {
        +	// Ensure that the buffer is initialized.
        +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +		return false
        +	}
        +
        +	// Check if we just started scanning.  Fetch STREAM-START then.
        +	if !parser.stream_start_produced {
        +		return yaml_parser_fetch_stream_start(parser)
        +	}
        +
        +	scan_mark := parser.mark
        +
        +	// Eat whitespaces and comments until we reach the next token.
        +	if !yaml_parser_scan_to_next_token(parser) {
        +		return false
        +	}
        +
        +	// [Go] While unrolling indents, transform the head comments of prior
        +	// indentation levels observed after scan_start into foot comments at
        +	// the respective indexes.
        +
        +	// Check the indentation level against the current column.
        +	if !yaml_parser_unroll_indent(parser, parser.mark.column, scan_mark) {
        +		return false
        +	}
        +
        +	// Ensure that the buffer contains at least 4 characters.  4 is the length
        +	// of the longest indicators ('--- ' and '... ').
        +	if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) {
        +		return false
        +	}
        +
        +	// Is it the end of the stream?
        +	if is_z(parser.buffer, parser.buffer_pos) {
        +		return yaml_parser_fetch_stream_end(parser)
        +	}
        +
        +	// Is it a directive?
        +	if parser.mark.column == 0 && parser.buffer[parser.buffer_pos] == '%' {
        +		return yaml_parser_fetch_directive(parser)
        +	}
        +
        +	buf := parser.buffer
        +	pos := parser.buffer_pos
        +
        +	// Is it the document start indicator?
        +	if parser.mark.column == 0 && buf[pos] == '-' && buf[pos+1] == '-' && buf[pos+2] == '-' && is_blankz(buf, pos+3) {
        +		return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_START_TOKEN)
        +	}
        +
        +	// Is it the document end indicator?
        +	if parser.mark.column == 0 && buf[pos] == '.' && buf[pos+1] == '.' && buf[pos+2] == '.' && is_blankz(buf, pos+3) {
        +		return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_END_TOKEN)
        +	}
        +
        +	comment_mark := parser.mark
        +	if len(parser.tokens) > 0 && (parser.flow_level == 0 && buf[pos] == ':' || parser.flow_level > 0 && buf[pos] == ',') {
        +		// Associate any following comments with the prior token.
        +		comment_mark = parser.tokens[len(parser.tokens)-1].start_mark
        +	}
        +	defer func() {
        +		if !ok {
        +			return
        +		}
        +		if !yaml_parser_scan_line_comment(parser, comment_mark) {
        +			ok = false
        +			return
        +		}
        +	}()
        +
        +	// Is it the flow sequence start indicator?
        +	if buf[pos] == '[' {
        +		return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_SEQUENCE_START_TOKEN)
        +	}
        +
        +	// Is it the flow mapping start indicator?
        +	if parser.buffer[parser.buffer_pos] == '{' {
        +		return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_MAPPING_START_TOKEN)
        +	}
        +
        +	// Is it the flow sequence end indicator?
        +	if parser.buffer[parser.buffer_pos] == ']' {
        +		return yaml_parser_fetch_flow_collection_end(parser,
        +			yaml_FLOW_SEQUENCE_END_TOKEN)
        +	}
        +
        +	// Is it the flow mapping end indicator?
        +	if parser.buffer[parser.buffer_pos] == '}' {
        +		return yaml_parser_fetch_flow_collection_end(parser,
        +			yaml_FLOW_MAPPING_END_TOKEN)
        +	}
        +
        +	// Is it the flow entry indicator?
        +	if parser.buffer[parser.buffer_pos] == ',' {
        +		return yaml_parser_fetch_flow_entry(parser)
        +	}
        +
        +	// Is it the block entry indicator?
        +	if parser.buffer[parser.buffer_pos] == '-' && is_blankz(parser.buffer, parser.buffer_pos+1) {
        +		return yaml_parser_fetch_block_entry(parser)
        +	}
        +
        +	// Is it the key indicator?
        +	if parser.buffer[parser.buffer_pos] == '?' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) {
        +		return yaml_parser_fetch_key(parser)
        +	}
        +
        +	// Is it the value indicator?
        +	if parser.buffer[parser.buffer_pos] == ':' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) {
        +		return yaml_parser_fetch_value(parser)
        +	}
        +
        +	// Is it an alias?
        +	if parser.buffer[parser.buffer_pos] == '*' {
        +		return yaml_parser_fetch_anchor(parser, yaml_ALIAS_TOKEN)
        +	}
        +
        +	// Is it an anchor?
        +	if parser.buffer[parser.buffer_pos] == '&' {
        +		return yaml_parser_fetch_anchor(parser, yaml_ANCHOR_TOKEN)
        +	}
        +
        +	// Is it a tag?
        +	if parser.buffer[parser.buffer_pos] == '!' {
        +		return yaml_parser_fetch_tag(parser)
        +	}
        +
        +	// Is it a literal scalar?
        +	if parser.buffer[parser.buffer_pos] == '|' && parser.flow_level == 0 {
        +		return yaml_parser_fetch_block_scalar(parser, true)
        +	}
        +
        +	// Is it a folded scalar?
        +	if parser.buffer[parser.buffer_pos] == '>' && parser.flow_level == 0 {
        +		return yaml_parser_fetch_block_scalar(parser, false)
        +	}
        +
        +	// Is it a single-quoted scalar?
        +	if parser.buffer[parser.buffer_pos] == '\'' {
        +		return yaml_parser_fetch_flow_scalar(parser, true)
        +	}
        +
        +	// Is it a double-quoted scalar?
        +	if parser.buffer[parser.buffer_pos] == '"' {
        +		return yaml_parser_fetch_flow_scalar(parser, false)
        +	}
        +
        +	// Is it a plain scalar?
        +	//
        +	// A plain scalar may start with any non-blank characters except
        +	//
        +	//      '-', '?', ':', ',', '[', ']', '{', '}',
        +	//      '#', '&', '*', '!', '|', '>', '\'', '\"',
        +	//      '%', '@', '`'.
        +	//
        +	// In the block context (and, for the '-' indicator, in the flow context
        +	// too), it may also start with the characters
        +	//
        +	//      '-', '?', ':'
        +	//
        +	// if it is followed by a non-space character.
        +	//
        +	// The last rule is more restrictive than the specification requires.
        +	// [Go] TODO Make this logic more reasonable.
        +	//switch parser.buffer[parser.buffer_pos] {
        +	//case '-', '?', ':', ',', '?', '-', ',', ':', ']', '[', '}', '{', '&', '#', '!', '*', '>', '|', '"', '\'', '@', '%', '-', '`':
        +	//}
        +	if !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '-' ||
        +		parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':' ||
        +		parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '[' ||
        +		parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' ||
        +		parser.buffer[parser.buffer_pos] == '}' || parser.buffer[parser.buffer_pos] == '#' ||
        +		parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '*' ||
        +		parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '|' ||
        +		parser.buffer[parser.buffer_pos] == '>' || parser.buffer[parser.buffer_pos] == '\'' ||
        +		parser.buffer[parser.buffer_pos] == '"' || parser.buffer[parser.buffer_pos] == '%' ||
        +		parser.buffer[parser.buffer_pos] == '@' || parser.buffer[parser.buffer_pos] == '`') ||
        +		(parser.buffer[parser.buffer_pos] == '-' && !is_blank(parser.buffer, parser.buffer_pos+1)) ||
        +		(parser.flow_level == 0 &&
        +			(parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':') &&
        +			!is_blankz(parser.buffer, parser.buffer_pos+1)) {
        +		return yaml_parser_fetch_plain_scalar(parser)
        +	}
        +
        +	// If we don't determine the token type so far, it is an error.
        +	return yaml_parser_set_scanner_error(parser,
        +		"while scanning for the next token", parser.mark,
        +		"found character that cannot start any token")
        +}
        +
        +func yaml_simple_key_is_valid(parser *yaml_parser_t, simple_key *yaml_simple_key_t) (valid, ok bool) {
        +	if !simple_key.possible {
        +		return false, true
        +	}
        +
        +	// The 1.2 specification says:
        +	//
        +	//     "If the ? indicator is omitted, parsing needs to see past the
        +	//     implicit key to recognize it as such. To limit the amount of
        +	//     lookahead required, the “:” indicator must appear at most 1024
        +	//     Unicode characters beyond the start of the key. In addition, the key
        +	//     is restricted to a single line."
        +	//
        +	if simple_key.mark.line < parser.mark.line || simple_key.mark.index+1024 < parser.mark.index {
        +		// Check if the potential simple key to be removed is required.
        +		if simple_key.required {
        +			return false, yaml_parser_set_scanner_error(parser,
        +				"while scanning a simple key", simple_key.mark,
        +				"could not find expected ':'")
        +		}
        +		simple_key.possible = false
        +		return false, true
        +	}
        +	return true, true
        +}
        +
        +// Check if a simple key may start at the current position and add it if
        +// needed.
        +func yaml_parser_save_simple_key(parser *yaml_parser_t) bool {
        +	// A simple key is required at the current position if the scanner is in
        +	// the block context and the current column coincides with the indentation
        +	// level.
        +
        +	required := parser.flow_level == 0 && parser.indent == parser.mark.column
        +
        +	//
        +	// If the current position may start a simple key, save it.
        +	//
        +	if parser.simple_key_allowed {
        +		simple_key := yaml_simple_key_t{
        +			possible:     true,
        +			required:     required,
        +			token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head),
        +			mark:         parser.mark,
        +		}
        +
        +		if !yaml_parser_remove_simple_key(parser) {
        +			return false
        +		}
        +		parser.simple_keys[len(parser.simple_keys)-1] = simple_key
        +		parser.simple_keys_by_tok[simple_key.token_number] = len(parser.simple_keys) - 1
        +	}
        +	return true
        +}
        +
        +// Remove a potential simple key at the current flow level.
        +func yaml_parser_remove_simple_key(parser *yaml_parser_t) bool {
        +	i := len(parser.simple_keys) - 1
        +	if parser.simple_keys[i].possible {
        +		// If the key is required, it is an error.
        +		if parser.simple_keys[i].required {
        +			return yaml_parser_set_scanner_error(parser,
        +				"while scanning a simple key", parser.simple_keys[i].mark,
        +				"could not find expected ':'")
        +		}
        +		// Remove the key from the stack.
        +		parser.simple_keys[i].possible = false
        +		delete(parser.simple_keys_by_tok, parser.simple_keys[i].token_number)
        +	}
        +	return true
        +}
        +
        +// max_flow_level limits the flow_level
        +const max_flow_level = 10000
        +
        +// Increase the flow level and resize the simple key list if needed.
        +func yaml_parser_increase_flow_level(parser *yaml_parser_t) bool {
        +	// Reset the simple key on the next level.
        +	parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{
        +		possible:     false,
        +		required:     false,
        +		token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head),
        +		mark:         parser.mark,
        +	})
        +
        +	// Increase the flow level.
        +	parser.flow_level++
        +	if parser.flow_level > max_flow_level {
        +		return yaml_parser_set_scanner_error(parser,
        +			"while increasing flow level", parser.simple_keys[len(parser.simple_keys)-1].mark,
        +			fmt.Sprintf("exceeded max depth of %d", max_flow_level))
        +	}
        +	return true
        +}
        +
        +// Decrease the flow level.
        +func yaml_parser_decrease_flow_level(parser *yaml_parser_t) bool {
        +	if parser.flow_level > 0 {
        +		parser.flow_level--
        +		last := len(parser.simple_keys) - 1
        +		delete(parser.simple_keys_by_tok, parser.simple_keys[last].token_number)
        +		parser.simple_keys = parser.simple_keys[:last]
        +	}
        +	return true
        +}
        +
        +// max_indents limits the indents stack size
        +const max_indents = 10000
        +
        +// Push the current indentation level to the stack and set the new level
        +// the current column is greater than the indentation level.  In this case,
        +// append or insert the specified token into the token queue.
        +func yaml_parser_roll_indent(parser *yaml_parser_t, column, number int, typ yaml_token_type_t, mark yaml_mark_t) bool {
        +	// In the flow context, do nothing.
        +	if parser.flow_level > 0 {
        +		return true
        +	}
        +
        +	if parser.indent < column {
        +		// Push the current indentation level to the stack and set the new
        +		// indentation level.
        +		parser.indents = append(parser.indents, parser.indent)
        +		parser.indent = column
        +		if len(parser.indents) > max_indents {
        +			return yaml_parser_set_scanner_error(parser,
        +				"while increasing indent level", parser.simple_keys[len(parser.simple_keys)-1].mark,
        +				fmt.Sprintf("exceeded max depth of %d", max_indents))
        +		}
        +
        +		// Create a token and insert it into the queue.
        +		token := yaml_token_t{
        +			typ:        typ,
        +			start_mark: mark,
        +			end_mark:   mark,
        +		}
        +		if number > -1 {
        +			number -= parser.tokens_parsed
        +		}
        +		yaml_insert_token(parser, number, &token)
        +	}
        +	return true
        +}
        +
        +// Pop indentation levels from the indents stack until the current level
        +// becomes less or equal to the column.  For each indentation level, append
        +// the BLOCK-END token.
        +func yaml_parser_unroll_indent(parser *yaml_parser_t, column int, scan_mark yaml_mark_t) bool {
        +	// In the flow context, do nothing.
        +	if parser.flow_level > 0 {
        +		return true
        +	}
        +
        +	block_mark := scan_mark
        +	block_mark.index--
        +
        +	// Loop through the indentation levels in the stack.
        +	for parser.indent > column {
        +
        +		// [Go] Reposition the end token before potential following
        +		//      foot comments of parent blocks. For that, search
        +		//      backwards for recent comments that were at the same
        +		//      indent as the block that is ending now.
        +		stop_index := block_mark.index
        +		for i := len(parser.comments) - 1; i >= 0; i-- {
        +			comment := &parser.comments[i]
        +
        +			if comment.end_mark.index < stop_index {
        +				// Don't go back beyond the start of the comment/whitespace scan, unless column < 0.
        +				// If requested indent column is < 0, then the document is over and everything else
        +				// is a foot anyway.
        +				break
        +			}
        +			if comment.start_mark.column == parser.indent+1 {
        +				// This is a good match. But maybe there's a former comment
        +				// at that same indent level, so keep searching.
        +				block_mark = comment.start_mark
        +			}
        +
        +			// While the end of the former comment matches with
        +			// the start of the following one, we know there's
        +			// nothing in between and scanning is still safe.
        +			stop_index = comment.scan_mark.index
        +		}
        +
        +		// Create a token and append it to the queue.
        +		token := yaml_token_t{
        +			typ:        yaml_BLOCK_END_TOKEN,
        +			start_mark: block_mark,
        +			end_mark:   block_mark,
        +		}
        +		yaml_insert_token(parser, -1, &token)
        +
        +		// Pop the indentation level.
        +		parser.indent = parser.indents[len(parser.indents)-1]
        +		parser.indents = parser.indents[:len(parser.indents)-1]
        +	}
        +	return true
        +}
        +
        +// Initialize the scanner and produce the STREAM-START token.
        +func yaml_parser_fetch_stream_start(parser *yaml_parser_t) bool {
        +
        +	// Set the initial indentation.
        +	parser.indent = -1
        +
        +	// Initialize the simple key stack.
        +	parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{})
        +
        +	parser.simple_keys_by_tok = make(map[int]int)
        +
        +	// A simple key is allowed at the beginning of the stream.
        +	parser.simple_key_allowed = true
        +
        +	// We have started.
        +	parser.stream_start_produced = true
        +
        +	// Create the STREAM-START token and append it to the queue.
        +	token := yaml_token_t{
        +		typ:        yaml_STREAM_START_TOKEN,
        +		start_mark: parser.mark,
        +		end_mark:   parser.mark,
        +		encoding:   parser.encoding,
        +	}
        +	yaml_insert_token(parser, -1, &token)
        +	return true
        +}
        +
        +// Produce the STREAM-END token and shut down the scanner.
        +func yaml_parser_fetch_stream_end(parser *yaml_parser_t) bool {
        +
        +	// Force new line.
        +	if parser.mark.column != 0 {
        +		parser.mark.column = 0
        +		parser.mark.line++
        +	}
        +
        +	// Reset the indentation level.
        +	if !yaml_parser_unroll_indent(parser, -1, parser.mark) {
        +		return false
        +	}
        +
        +	// Reset simple keys.
        +	if !yaml_parser_remove_simple_key(parser) {
        +		return false
        +	}
        +
        +	parser.simple_key_allowed = false
        +
        +	// Create the STREAM-END token and append it to the queue.
        +	token := yaml_token_t{
        +		typ:        yaml_STREAM_END_TOKEN,
        +		start_mark: parser.mark,
        +		end_mark:   parser.mark,
        +	}
        +	yaml_insert_token(parser, -1, &token)
        +	return true
        +}
        +
        +// Produce a VERSION-DIRECTIVE or TAG-DIRECTIVE token.
        +func yaml_parser_fetch_directive(parser *yaml_parser_t) bool {
        +	// Reset the indentation level.
        +	if !yaml_parser_unroll_indent(parser, -1, parser.mark) {
        +		return false
        +	}
        +
        +	// Reset simple keys.
        +	if !yaml_parser_remove_simple_key(parser) {
        +		return false
        +	}
        +
        +	parser.simple_key_allowed = false
        +
        +	// Create the YAML-DIRECTIVE or TAG-DIRECTIVE token.
        +	token := yaml_token_t{}
        +	if !yaml_parser_scan_directive(parser, &token) {
        +		return false
        +	}
        +	// Append the token to the queue.
        +	yaml_insert_token(parser, -1, &token)
        +	return true
        +}
        +
        +// Produce the DOCUMENT-START or DOCUMENT-END token.
        +func yaml_parser_fetch_document_indicator(parser *yaml_parser_t, typ yaml_token_type_t) bool {
        +	// Reset the indentation level.
        +	if !yaml_parser_unroll_indent(parser, -1, parser.mark) {
        +		return false
        +	}
        +
        +	// Reset simple keys.
        +	if !yaml_parser_remove_simple_key(parser) {
        +		return false
        +	}
        +
        +	parser.simple_key_allowed = false
        +
        +	// Consume the token.
        +	start_mark := parser.mark
        +
        +	skip(parser)
        +	skip(parser)
        +	skip(parser)
        +
        +	end_mark := parser.mark
        +
        +	// Create the DOCUMENT-START or DOCUMENT-END token.
        +	token := yaml_token_t{
        +		typ:        typ,
        +		start_mark: start_mark,
        +		end_mark:   end_mark,
        +	}
        +	// Append the token to the queue.
        +	yaml_insert_token(parser, -1, &token)
        +	return true
        +}
        +
        +// Produce the FLOW-SEQUENCE-START or FLOW-MAPPING-START token.
        +func yaml_parser_fetch_flow_collection_start(parser *yaml_parser_t, typ yaml_token_type_t) bool {
        +
        +	// The indicators '[' and '{' may start a simple key.
        +	if !yaml_parser_save_simple_key(parser) {
        +		return false
        +	}
        +
        +	// Increase the flow level.
        +	if !yaml_parser_increase_flow_level(parser) {
        +		return false
        +	}
        +
        +	// A simple key may follow the indicators '[' and '{'.
        +	parser.simple_key_allowed = true
        +
        +	// Consume the token.
        +	start_mark := parser.mark
        +	skip(parser)
        +	end_mark := parser.mark
        +
        +	// Create the FLOW-SEQUENCE-START of FLOW-MAPPING-START token.
        +	token := yaml_token_t{
        +		typ:        typ,
        +		start_mark: start_mark,
        +		end_mark:   end_mark,
        +	}
        +	// Append the token to the queue.
        +	yaml_insert_token(parser, -1, &token)
        +	return true
        +}
        +
        +// Produce the FLOW-SEQUENCE-END or FLOW-MAPPING-END token.
        +func yaml_parser_fetch_flow_collection_end(parser *yaml_parser_t, typ yaml_token_type_t) bool {
        +	// Reset any potential simple key on the current flow level.
        +	if !yaml_parser_remove_simple_key(parser) {
        +		return false
        +	}
        +
        +	// Decrease the flow level.
        +	if !yaml_parser_decrease_flow_level(parser) {
        +		return false
        +	}
        +
        +	// No simple keys after the indicators ']' and '}'.
        +	parser.simple_key_allowed = false
        +
        +	// Consume the token.
        +
        +	start_mark := parser.mark
        +	skip(parser)
        +	end_mark := parser.mark
        +
        +	// Create the FLOW-SEQUENCE-END of FLOW-MAPPING-END token.
        +	token := yaml_token_t{
        +		typ:        typ,
        +		start_mark: start_mark,
        +		end_mark:   end_mark,
        +	}
        +	// Append the token to the queue.
        +	yaml_insert_token(parser, -1, &token)
        +	return true
        +}
        +
        +// Produce the FLOW-ENTRY token.
        +func yaml_parser_fetch_flow_entry(parser *yaml_parser_t) bool {
        +	// Reset any potential simple keys on the current flow level.
        +	if !yaml_parser_remove_simple_key(parser) {
        +		return false
        +	}
        +
        +	// Simple keys are allowed after ','.
        +	parser.simple_key_allowed = true
        +
        +	// Consume the token.
        +	start_mark := parser.mark
        +	skip(parser)
        +	end_mark := parser.mark
        +
        +	// Create the FLOW-ENTRY token and append it to the queue.
        +	token := yaml_token_t{
        +		typ:        yaml_FLOW_ENTRY_TOKEN,
        +		start_mark: start_mark,
        +		end_mark:   end_mark,
        +	}
        +	yaml_insert_token(parser, -1, &token)
        +	return true
        +}
        +
        +// Produce the BLOCK-ENTRY token.
        +func yaml_parser_fetch_block_entry(parser *yaml_parser_t) bool {
        +	// Check if the scanner is in the block context.
        +	if parser.flow_level == 0 {
        +		// Check if we are allowed to start a new entry.
        +		if !parser.simple_key_allowed {
        +			return yaml_parser_set_scanner_error(parser, "", parser.mark,
        +				"block sequence entries are not allowed in this context")
        +		}
        +		// Add the BLOCK-SEQUENCE-START token if needed.
        +		if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_SEQUENCE_START_TOKEN, parser.mark) {
        +			return false
        +		}
        +	} else {
        +		// It is an error for the '-' indicator to occur in the flow context,
        +		// but we let the Parser detect and report about it because the Parser
        +		// is able to point to the context.
        +	}
        +
        +	// Reset any potential simple keys on the current flow level.
        +	if !yaml_parser_remove_simple_key(parser) {
        +		return false
        +	}
        +
        +	// Simple keys are allowed after '-'.
        +	parser.simple_key_allowed = true
        +
        +	// Consume the token.
        +	start_mark := parser.mark
        +	skip(parser)
        +	end_mark := parser.mark
        +
        +	// Create the BLOCK-ENTRY token and append it to the queue.
        +	token := yaml_token_t{
        +		typ:        yaml_BLOCK_ENTRY_TOKEN,
        +		start_mark: start_mark,
        +		end_mark:   end_mark,
        +	}
        +	yaml_insert_token(parser, -1, &token)
        +	return true
        +}
        +
        +// Produce the KEY token.
        +func yaml_parser_fetch_key(parser *yaml_parser_t) bool {
        +
        +	// In the block context, additional checks are required.
        +	if parser.flow_level == 0 {
        +		// Check if we are allowed to start a new key (not nessesary simple).
        +		if !parser.simple_key_allowed {
        +			return yaml_parser_set_scanner_error(parser, "", parser.mark,
        +				"mapping keys are not allowed in this context")
        +		}
        +		// Add the BLOCK-MAPPING-START token if needed.
        +		if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) {
        +			return false
        +		}
        +	}
        +
        +	// Reset any potential simple keys on the current flow level.
        +	if !yaml_parser_remove_simple_key(parser) {
        +		return false
        +	}
        +
        +	// Simple keys are allowed after '?' in the block context.
        +	parser.simple_key_allowed = parser.flow_level == 0
        +
        +	// Consume the token.
        +	start_mark := parser.mark
        +	skip(parser)
        +	end_mark := parser.mark
        +
        +	// Create the KEY token and append it to the queue.
        +	token := yaml_token_t{
        +		typ:        yaml_KEY_TOKEN,
        +		start_mark: start_mark,
        +		end_mark:   end_mark,
        +	}
        +	yaml_insert_token(parser, -1, &token)
        +	return true
        +}
        +
        +// Produce the VALUE token.
        +func yaml_parser_fetch_value(parser *yaml_parser_t) bool {
        +
        +	simple_key := &parser.simple_keys[len(parser.simple_keys)-1]
        +
        +	// Have we found a simple key?
        +	if valid, ok := yaml_simple_key_is_valid(parser, simple_key); !ok {
        +		return false
        +
        +	} else if valid {
        +
        +		// Create the KEY token and insert it into the queue.
        +		token := yaml_token_t{
        +			typ:        yaml_KEY_TOKEN,
        +			start_mark: simple_key.mark,
        +			end_mark:   simple_key.mark,
        +		}
        +		yaml_insert_token(parser, simple_key.token_number-parser.tokens_parsed, &token)
        +
        +		// In the block context, we may need to add the BLOCK-MAPPING-START token.
        +		if !yaml_parser_roll_indent(parser, simple_key.mark.column,
        +			simple_key.token_number,
        +			yaml_BLOCK_MAPPING_START_TOKEN, simple_key.mark) {
        +			return false
        +		}
        +
        +		// Remove the simple key.
        +		simple_key.possible = false
        +		delete(parser.simple_keys_by_tok, simple_key.token_number)
        +
        +		// A simple key cannot follow another simple key.
        +		parser.simple_key_allowed = false
        +
        +	} else {
        +		// The ':' indicator follows a complex key.
        +
        +		// In the block context, extra checks are required.
        +		if parser.flow_level == 0 {
        +
        +			// Check if we are allowed to start a complex value.
        +			if !parser.simple_key_allowed {
        +				return yaml_parser_set_scanner_error(parser, "", parser.mark,
        +					"mapping values are not allowed in this context")
        +			}
        +
        +			// Add the BLOCK-MAPPING-START token if needed.
        +			if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) {
        +				return false
        +			}
        +		}
        +
        +		// Simple keys after ':' are allowed in the block context.
        +		parser.simple_key_allowed = parser.flow_level == 0
        +	}
        +
        +	// Consume the token.
        +	start_mark := parser.mark
        +	skip(parser)
        +	end_mark := parser.mark
        +
        +	// Create the VALUE token and append it to the queue.
        +	token := yaml_token_t{
        +		typ:        yaml_VALUE_TOKEN,
        +		start_mark: start_mark,
        +		end_mark:   end_mark,
        +	}
        +	yaml_insert_token(parser, -1, &token)
        +	return true
        +}
        +
        +// Produce the ALIAS or ANCHOR token.
        +func yaml_parser_fetch_anchor(parser *yaml_parser_t, typ yaml_token_type_t) bool {
        +	// An anchor or an alias could be a simple key.
        +	if !yaml_parser_save_simple_key(parser) {
        +		return false
        +	}
        +
        +	// A simple key cannot follow an anchor or an alias.
        +	parser.simple_key_allowed = false
        +
        +	// Create the ALIAS or ANCHOR token and append it to the queue.
        +	var token yaml_token_t
        +	if !yaml_parser_scan_anchor(parser, &token, typ) {
        +		return false
        +	}
        +	yaml_insert_token(parser, -1, &token)
        +	return true
        +}
        +
        +// Produce the TAG token.
        +func yaml_parser_fetch_tag(parser *yaml_parser_t) bool {
        +	// A tag could be a simple key.
        +	if !yaml_parser_save_simple_key(parser) {
        +		return false
        +	}
        +
        +	// A simple key cannot follow a tag.
        +	parser.simple_key_allowed = false
        +
        +	// Create the TAG token and append it to the queue.
        +	var token yaml_token_t
        +	if !yaml_parser_scan_tag(parser, &token) {
        +		return false
        +	}
        +	yaml_insert_token(parser, -1, &token)
        +	return true
        +}
        +
        +// Produce the SCALAR(...,literal) or SCALAR(...,folded) tokens.
        +func yaml_parser_fetch_block_scalar(parser *yaml_parser_t, literal bool) bool {
        +	// Remove any potential simple keys.
        +	if !yaml_parser_remove_simple_key(parser) {
        +		return false
        +	}
        +
        +	// A simple key may follow a block scalar.
        +	parser.simple_key_allowed = true
        +
        +	// Create the SCALAR token and append it to the queue.
        +	var token yaml_token_t
        +	if !yaml_parser_scan_block_scalar(parser, &token, literal) {
        +		return false
        +	}
        +	yaml_insert_token(parser, -1, &token)
        +	return true
        +}
        +
        +// Produce the SCALAR(...,single-quoted) or SCALAR(...,double-quoted) tokens.
        +func yaml_parser_fetch_flow_scalar(parser *yaml_parser_t, single bool) bool {
        +	// A plain scalar could be a simple key.
        +	if !yaml_parser_save_simple_key(parser) {
        +		return false
        +	}
        +
        +	// A simple key cannot follow a flow scalar.
        +	parser.simple_key_allowed = false
        +
        +	// Create the SCALAR token and append it to the queue.
        +	var token yaml_token_t
        +	if !yaml_parser_scan_flow_scalar(parser, &token, single) {
        +		return false
        +	}
        +	yaml_insert_token(parser, -1, &token)
        +	return true
        +}
        +
        +// Produce the SCALAR(...,plain) token.
        +func yaml_parser_fetch_plain_scalar(parser *yaml_parser_t) bool {
        +	// A plain scalar could be a simple key.
        +	if !yaml_parser_save_simple_key(parser) {
        +		return false
        +	}
        +
        +	// A simple key cannot follow a flow scalar.
        +	parser.simple_key_allowed = false
        +
        +	// Create the SCALAR token and append it to the queue.
        +	var token yaml_token_t
        +	if !yaml_parser_scan_plain_scalar(parser, &token) {
        +		return false
        +	}
        +	yaml_insert_token(parser, -1, &token)
        +	return true
        +}
        +
        +// Eat whitespaces and comments until the next token is found.
        +func yaml_parser_scan_to_next_token(parser *yaml_parser_t) bool {
        +
        +	scan_mark := parser.mark
        +
        +	// Until the next token is not found.
        +	for {
        +		// Allow the BOM mark to start a line.
        +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +			return false
        +		}
        +		if parser.mark.column == 0 && is_bom(parser.buffer, parser.buffer_pos) {
        +			skip(parser)
        +		}
        +
        +		// Eat whitespaces.
        +		// Tabs are allowed:
        +		//  - in the flow context
        +		//  - in the block context, but not at the beginning of the line or
        +		//  after '-', '?', or ':' (complex value).
        +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +			return false
        +		}
        +
        +		for parser.buffer[parser.buffer_pos] == ' ' || ((parser.flow_level > 0 || !parser.simple_key_allowed) && parser.buffer[parser.buffer_pos] == '\t') {
        +			skip(parser)
        +			if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +				return false
        +			}
        +		}
        +
        +		// Check if we just had a line comment under a sequence entry that
        +		// looks more like a header to the following content. Similar to this:
        +		//
        +		// - # The comment
        +		//   - Some data
        +		//
        +		// If so, transform the line comment to a head comment and reposition.
        +		if len(parser.comments) > 0 && len(parser.tokens) > 1 {
        +			tokenA := parser.tokens[len(parser.tokens)-2]
        +			tokenB := parser.tokens[len(parser.tokens)-1]
        +			comment := &parser.comments[len(parser.comments)-1]
        +			if tokenA.typ == yaml_BLOCK_SEQUENCE_START_TOKEN && tokenB.typ == yaml_BLOCK_ENTRY_TOKEN && len(comment.line) > 0 && !is_break(parser.buffer, parser.buffer_pos) {
        +				// If it was in the prior line, reposition so it becomes a
        +				// header of the follow up token. Otherwise, keep it in place
        +				// so it becomes a header of the former.
        +				comment.head = comment.line
        +				comment.line = nil
        +				if comment.start_mark.line == parser.mark.line-1 {
        +					comment.token_mark = parser.mark
        +				}
        +			}
        +		}
        +
        +		// Eat a comment until a line break.
        +		if parser.buffer[parser.buffer_pos] == '#' {
        +			if !yaml_parser_scan_comments(parser, scan_mark) {
        +				return false
        +			}
        +		}
        +
        +		// If it is a line break, eat it.
        +		if is_break(parser.buffer, parser.buffer_pos) {
        +			if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
        +				return false
        +			}
        +			skip_line(parser)
        +
        +			// In the block context, a new line may start a simple key.
        +			if parser.flow_level == 0 {
        +				parser.simple_key_allowed = true
        +			}
        +		} else {
        +			break // We have found a token.
        +		}
        +	}
        +
        +	return true
        +}
        +
        +// Scan a YAML-DIRECTIVE or TAG-DIRECTIVE token.
        +//
        +// Scope:
        +//      %YAML    1.1    # a comment \n
        +//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        +//      %TAG    !yaml!  tag:yaml.org,2002:  \n
        +//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        +//
        +func yaml_parser_scan_directive(parser *yaml_parser_t, token *yaml_token_t) bool {
        +	// Eat '%'.
        +	start_mark := parser.mark
        +	skip(parser)
        +
        +	// Scan the directive name.
        +	var name []byte
        +	if !yaml_parser_scan_directive_name(parser, start_mark, &name) {
        +		return false
        +	}
        +
        +	// Is it a YAML directive?
        +	if bytes.Equal(name, []byte("YAML")) {
        +		// Scan the VERSION directive value.
        +		var major, minor int8
        +		if !yaml_parser_scan_version_directive_value(parser, start_mark, &major, &minor) {
        +			return false
        +		}
        +		end_mark := parser.mark
        +
        +		// Create a VERSION-DIRECTIVE token.
        +		*token = yaml_token_t{
        +			typ:        yaml_VERSION_DIRECTIVE_TOKEN,
        +			start_mark: start_mark,
        +			end_mark:   end_mark,
        +			major:      major,
        +			minor:      minor,
        +		}
        +
        +		// Is it a TAG directive?
        +	} else if bytes.Equal(name, []byte("TAG")) {
        +		// Scan the TAG directive value.
        +		var handle, prefix []byte
        +		if !yaml_parser_scan_tag_directive_value(parser, start_mark, &handle, &prefix) {
        +			return false
        +		}
        +		end_mark := parser.mark
        +
        +		// Create a TAG-DIRECTIVE token.
        +		*token = yaml_token_t{
        +			typ:        yaml_TAG_DIRECTIVE_TOKEN,
        +			start_mark: start_mark,
        +			end_mark:   end_mark,
        +			value:      handle,
        +			prefix:     prefix,
        +		}
        +
        +		// Unknown directive.
        +	} else {
        +		yaml_parser_set_scanner_error(parser, "while scanning a directive",
        +			start_mark, "found unknown directive name")
        +		return false
        +	}
        +
        +	// Eat the rest of the line including any comments.
        +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +		return false
        +	}
        +
        +	for is_blank(parser.buffer, parser.buffer_pos) {
        +		skip(parser)
        +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +			return false
        +		}
        +	}
        +
        +	if parser.buffer[parser.buffer_pos] == '#' {
        +		// [Go] Discard this inline comment for the time being.
        +		//if !yaml_parser_scan_line_comment(parser, start_mark) {
        +		//	return false
        +		//}
        +		for !is_breakz(parser.buffer, parser.buffer_pos) {
        +			skip(parser)
        +			if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +				return false
        +			}
        +		}
        +	}
        +
        +	// Check if we are at the end of the line.
        +	if !is_breakz(parser.buffer, parser.buffer_pos) {
        +		yaml_parser_set_scanner_error(parser, "while scanning a directive",
        +			start_mark, "did not find expected comment or line break")
        +		return false
        +	}
        +
        +	// Eat a line break.
        +	if is_break(parser.buffer, parser.buffer_pos) {
        +		if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
        +			return false
        +		}
        +		skip_line(parser)
        +	}
        +
        +	return true
        +}
        +
        +// Scan the directive name.
        +//
        +// Scope:
        +//      %YAML   1.1     # a comment \n
        +//       ^^^^
        +//      %TAG    !yaml!  tag:yaml.org,2002:  \n
        +//       ^^^
        +//
        +func yaml_parser_scan_directive_name(parser *yaml_parser_t, start_mark yaml_mark_t, name *[]byte) bool {
        +	// Consume the directive name.
        +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +		return false
        +	}
        +
        +	var s []byte
        +	for is_alpha(parser.buffer, parser.buffer_pos) {
        +		s = read(parser, s)
        +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +			return false
        +		}
        +	}
        +
        +	// Check if the name is empty.
        +	if len(s) == 0 {
        +		yaml_parser_set_scanner_error(parser, "while scanning a directive",
        +			start_mark, "could not find expected directive name")
        +		return false
        +	}
        +
        +	// Check for an blank character after the name.
        +	if !is_blankz(parser.buffer, parser.buffer_pos) {
        +		yaml_parser_set_scanner_error(parser, "while scanning a directive",
        +			start_mark, "found unexpected non-alphabetical character")
        +		return false
        +	}
        +	*name = s
        +	return true
        +}
        +
        +// Scan the value of VERSION-DIRECTIVE.
        +//
        +// Scope:
        +//      %YAML   1.1     # a comment \n
        +//           ^^^^^^
        +func yaml_parser_scan_version_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, major, minor *int8) bool {
        +	// Eat whitespaces.
        +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +		return false
        +	}
        +	for is_blank(parser.buffer, parser.buffer_pos) {
        +		skip(parser)
        +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +			return false
        +		}
        +	}
        +
        +	// Consume the major version number.
        +	if !yaml_parser_scan_version_directive_number(parser, start_mark, major) {
        +		return false
        +	}
        +
        +	// Eat '.'.
        +	if parser.buffer[parser.buffer_pos] != '.' {
        +		return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive",
        +			start_mark, "did not find expected digit or '.' character")
        +	}
        +
        +	skip(parser)
        +
        +	// Consume the minor version number.
        +	if !yaml_parser_scan_version_directive_number(parser, start_mark, minor) {
        +		return false
        +	}
        +	return true
        +}
        +
        +const max_number_length = 2
        +
        +// Scan the version number of VERSION-DIRECTIVE.
        +//
        +// Scope:
        +//      %YAML   1.1     # a comment \n
        +//              ^
        +//      %YAML   1.1     # a comment \n
        +//                ^
        +func yaml_parser_scan_version_directive_number(parser *yaml_parser_t, start_mark yaml_mark_t, number *int8) bool {
        +
        +	// Repeat while the next character is digit.
        +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +		return false
        +	}
        +	var value, length int8
        +	for is_digit(parser.buffer, parser.buffer_pos) {
        +		// Check if the number is too long.
        +		length++
        +		if length > max_number_length {
        +			return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive",
        +				start_mark, "found extremely long version number")
        +		}
        +		value = value*10 + int8(as_digit(parser.buffer, parser.buffer_pos))
        +		skip(parser)
        +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +			return false
        +		}
        +	}
        +
        +	// Check if the number was present.
        +	if length == 0 {
        +		return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive",
        +			start_mark, "did not find expected version number")
        +	}
        +	*number = value
        +	return true
        +}
        +
        +// Scan the value of a TAG-DIRECTIVE token.
        +//
        +// Scope:
        +//      %TAG    !yaml!  tag:yaml.org,2002:  \n
        +//          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        +//
        +func yaml_parser_scan_tag_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, handle, prefix *[]byte) bool {
        +	var handle_value, prefix_value []byte
        +
        +	// Eat whitespaces.
        +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +		return false
        +	}
        +
        +	for is_blank(parser.buffer, parser.buffer_pos) {
        +		skip(parser)
        +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +			return false
        +		}
        +	}
        +
        +	// Scan a handle.
        +	if !yaml_parser_scan_tag_handle(parser, true, start_mark, &handle_value) {
        +		return false
        +	}
        +
        +	// Expect a whitespace.
        +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +		return false
        +	}
        +	if !is_blank(parser.buffer, parser.buffer_pos) {
        +		yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive",
        +			start_mark, "did not find expected whitespace")
        +		return false
        +	}
        +
        +	// Eat whitespaces.
        +	for is_blank(parser.buffer, parser.buffer_pos) {
        +		skip(parser)
        +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +			return false
        +		}
        +	}
        +
        +	// Scan a prefix.
        +	if !yaml_parser_scan_tag_uri(parser, true, nil, start_mark, &prefix_value) {
        +		return false
        +	}
        +
        +	// Expect a whitespace or line break.
        +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +		return false
        +	}
        +	if !is_blankz(parser.buffer, parser.buffer_pos) {
        +		yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive",
        +			start_mark, "did not find expected whitespace or line break")
        +		return false
        +	}
        +
        +	*handle = handle_value
        +	*prefix = prefix_value
        +	return true
        +}
        +
        +func yaml_parser_scan_anchor(parser *yaml_parser_t, token *yaml_token_t, typ yaml_token_type_t) bool {
        +	var s []byte
        +
        +	// Eat the indicator character.
        +	start_mark := parser.mark
        +	skip(parser)
        +
        +	// Consume the value.
        +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +		return false
        +	}
        +
        +	for is_alpha(parser.buffer, parser.buffer_pos) {
        +		s = read(parser, s)
        +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +			return false
        +		}
        +	}
        +
        +	end_mark := parser.mark
        +
        +	/*
        +	 * Check if length of the anchor is greater than 0 and it is followed by
        +	 * a whitespace character or one of the indicators:
        +	 *
        +	 *      '?', ':', ',', ']', '}', '%', '@', '`'.
        +	 */
        +
        +	if len(s) == 0 ||
        +		!(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '?' ||
        +			parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == ',' ||
        +			parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '}' ||
        +			parser.buffer[parser.buffer_pos] == '%' || parser.buffer[parser.buffer_pos] == '@' ||
        +			parser.buffer[parser.buffer_pos] == '`') {
        +		context := "while scanning an alias"
        +		if typ == yaml_ANCHOR_TOKEN {
        +			context = "while scanning an anchor"
        +		}
        +		yaml_parser_set_scanner_error(parser, context, start_mark,
        +			"did not find expected alphabetic or numeric character")
        +		return false
        +	}
        +
        +	// Create a token.
        +	*token = yaml_token_t{
        +		typ:        typ,
        +		start_mark: start_mark,
        +		end_mark:   end_mark,
        +		value:      s,
        +	}
        +
        +	return true
        +}
        +
        +/*
        + * Scan a TAG token.
        + */
        +
        +func yaml_parser_scan_tag(parser *yaml_parser_t, token *yaml_token_t) bool {
        +	var handle, suffix []byte
        +
        +	start_mark := parser.mark
        +
        +	// Check if the tag is in the canonical form.
        +	if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
        +		return false
        +	}
        +
        +	if parser.buffer[parser.buffer_pos+1] == '<' {
        +		// Keep the handle as ''
        +
        +		// Eat '!<'
        +		skip(parser)
        +		skip(parser)
        +
        +		// Consume the tag value.
        +		if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) {
        +			return false
        +		}
        +
        +		// Check for '>' and eat it.
        +		if parser.buffer[parser.buffer_pos] != '>' {
        +			yaml_parser_set_scanner_error(parser, "while scanning a tag",
        +				start_mark, "did not find the expected '>'")
        +			return false
        +		}
        +
        +		skip(parser)
        +	} else {
        +		// The tag has either the '!suffix' or the '!handle!suffix' form.
        +
        +		// First, try to scan a handle.
        +		if !yaml_parser_scan_tag_handle(parser, false, start_mark, &handle) {
        +			return false
        +		}
        +
        +		// Check if it is, indeed, handle.
        +		if handle[0] == '!' && len(handle) > 1 && handle[len(handle)-1] == '!' {
        +			// Scan the suffix now.
        +			if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) {
        +				return false
        +			}
        +		} else {
        +			// It wasn't a handle after all.  Scan the rest of the tag.
        +			if !yaml_parser_scan_tag_uri(parser, false, handle, start_mark, &suffix) {
        +				return false
        +			}
        +
        +			// Set the handle to '!'.
        +			handle = []byte{'!'}
        +
        +			// A special case: the '!' tag.  Set the handle to '' and the
        +			// suffix to '!'.
        +			if len(suffix) == 0 {
        +				handle, suffix = suffix, handle
        +			}
        +		}
        +	}
        +
        +	// Check the character which ends the tag.
        +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +		return false
        +	}
        +	if !is_blankz(parser.buffer, parser.buffer_pos) {
        +		yaml_parser_set_scanner_error(parser, "while scanning a tag",
        +			start_mark, "did not find expected whitespace or line break")
        +		return false
        +	}
        +
        +	end_mark := parser.mark
        +
        +	// Create a token.
        +	*token = yaml_token_t{
        +		typ:        yaml_TAG_TOKEN,
        +		start_mark: start_mark,
        +		end_mark:   end_mark,
        +		value:      handle,
        +		suffix:     suffix,
        +	}
        +	return true
        +}
        +
        +// Scan a tag handle.
        +func yaml_parser_scan_tag_handle(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, handle *[]byte) bool {
        +	// Check the initial '!' character.
        +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +		return false
        +	}
        +	if parser.buffer[parser.buffer_pos] != '!' {
        +		yaml_parser_set_scanner_tag_error(parser, directive,
        +			start_mark, "did not find expected '!'")
        +		return false
        +	}
        +
        +	var s []byte
        +
        +	// Copy the '!' character.
        +	s = read(parser, s)
        +
        +	// Copy all subsequent alphabetical and numerical characters.
        +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +		return false
        +	}
        +	for is_alpha(parser.buffer, parser.buffer_pos) {
        +		s = read(parser, s)
        +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +			return false
        +		}
        +	}
        +
        +	// Check if the trailing character is '!' and copy it.
        +	if parser.buffer[parser.buffer_pos] == '!' {
        +		s = read(parser, s)
        +	} else {
        +		// It's either the '!' tag or not really a tag handle.  If it's a %TAG
        +		// directive, it's an error.  If it's a tag token, it must be a part of URI.
        +		if directive && string(s) != "!" {
        +			yaml_parser_set_scanner_tag_error(parser, directive,
        +				start_mark, "did not find expected '!'")
        +			return false
        +		}
        +	}
        +
        +	*handle = s
        +	return true
        +}
        +
        +// Scan a tag.
        +func yaml_parser_scan_tag_uri(parser *yaml_parser_t, directive bool, head []byte, start_mark yaml_mark_t, uri *[]byte) bool {
        +	//size_t length = head ? strlen((char *)head) : 0
        +	var s []byte
        +	hasTag := len(head) > 0
        +
        +	// Copy the head if needed.
        +	//
        +	// Note that we don't copy the leading '!' character.
        +	if len(head) > 1 {
        +		s = append(s, head[1:]...)
        +	}
        +
        +	// Scan the tag.
        +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +		return false
        +	}
        +
        +	// The set of characters that may appear in URI is as follows:
        +	//
        +	//      '0'-'9', 'A'-'Z', 'a'-'z', '_', '-', ';', '/', '?', ':', '@', '&',
        +	//      '=', '+', '$', ',', '.', '!', '~', '*', '\'', '(', ')', '[', ']',
        +	//      '%'.
        +	// [Go] TODO Convert this into more reasonable logic.
        +	for is_alpha(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == ';' ||
        +		parser.buffer[parser.buffer_pos] == '/' || parser.buffer[parser.buffer_pos] == '?' ||
        +		parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == '@' ||
        +		parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '=' ||
        +		parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '$' ||
        +		parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '.' ||
        +		parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '~' ||
        +		parser.buffer[parser.buffer_pos] == '*' || parser.buffer[parser.buffer_pos] == '\'' ||
        +		parser.buffer[parser.buffer_pos] == '(' || parser.buffer[parser.buffer_pos] == ')' ||
        +		parser.buffer[parser.buffer_pos] == '[' || parser.buffer[parser.buffer_pos] == ']' ||
        +		parser.buffer[parser.buffer_pos] == '%' {
        +		// Check if it is a URI-escape sequence.
        +		if parser.buffer[parser.buffer_pos] == '%' {
        +			if !yaml_parser_scan_uri_escapes(parser, directive, start_mark, &s) {
        +				return false
        +			}
        +		} else {
        +			s = read(parser, s)
        +		}
        +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +			return false
        +		}
        +		hasTag = true
        +	}
        +
        +	if !hasTag {
        +		yaml_parser_set_scanner_tag_error(parser, directive,
        +			start_mark, "did not find expected tag URI")
        +		return false
        +	}
        +	*uri = s
        +	return true
        +}
        +
        +// Decode an URI-escape sequence corresponding to a single UTF-8 character.
        +func yaml_parser_scan_uri_escapes(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, s *[]byte) bool {
        +
        +	// Decode the required number of characters.
        +	w := 1024
        +	for w > 0 {
        +		// Check for a URI-escaped octet.
        +		if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) {
        +			return false
        +		}
        +
        +		if !(parser.buffer[parser.buffer_pos] == '%' &&
        +			is_hex(parser.buffer, parser.buffer_pos+1) &&
        +			is_hex(parser.buffer, parser.buffer_pos+2)) {
        +			return yaml_parser_set_scanner_tag_error(parser, directive,
        +				start_mark, "did not find URI escaped octet")
        +		}
        +
        +		// Get the octet.
        +		octet := byte((as_hex(parser.buffer, parser.buffer_pos+1) << 4) + as_hex(parser.buffer, parser.buffer_pos+2))
        +
        +		// If it is the leading octet, determine the length of the UTF-8 sequence.
        +		if w == 1024 {
        +			w = width(octet)
        +			if w == 0 {
        +				return yaml_parser_set_scanner_tag_error(parser, directive,
        +					start_mark, "found an incorrect leading UTF-8 octet")
        +			}
        +		} else {
        +			// Check if the trailing octet is correct.
        +			if octet&0xC0 != 0x80 {
        +				return yaml_parser_set_scanner_tag_error(parser, directive,
        +					start_mark, "found an incorrect trailing UTF-8 octet")
        +			}
        +		}
        +
        +		// Copy the octet and move the pointers.
        +		*s = append(*s, octet)
        +		skip(parser)
        +		skip(parser)
        +		skip(parser)
        +		w--
        +	}
        +	return true
        +}
        +
        +// Scan a block scalar.
        +func yaml_parser_scan_block_scalar(parser *yaml_parser_t, token *yaml_token_t, literal bool) bool {
        +	// Eat the indicator '|' or '>'.
        +	start_mark := parser.mark
        +	skip(parser)
        +
        +	// Scan the additional block scalar indicators.
        +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +		return false
        +	}
        +
        +	// Check for a chomping indicator.
        +	var chomping, increment int
        +	if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' {
        +		// Set the chomping method and eat the indicator.
        +		if parser.buffer[parser.buffer_pos] == '+' {
        +			chomping = +1
        +		} else {
        +			chomping = -1
        +		}
        +		skip(parser)
        +
        +		// Check for an indentation indicator.
        +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +			return false
        +		}
        +		if is_digit(parser.buffer, parser.buffer_pos) {
        +			// Check that the indentation is greater than 0.
        +			if parser.buffer[parser.buffer_pos] == '0' {
        +				yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
        +					start_mark, "found an indentation indicator equal to 0")
        +				return false
        +			}
        +
        +			// Get the indentation level and eat the indicator.
        +			increment = as_digit(parser.buffer, parser.buffer_pos)
        +			skip(parser)
        +		}
        +
        +	} else if is_digit(parser.buffer, parser.buffer_pos) {
        +		// Do the same as above, but in the opposite order.
        +
        +		if parser.buffer[parser.buffer_pos] == '0' {
        +			yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
        +				start_mark, "found an indentation indicator equal to 0")
        +			return false
        +		}
        +		increment = as_digit(parser.buffer, parser.buffer_pos)
        +		skip(parser)
        +
        +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +			return false
        +		}
        +		if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' {
        +			if parser.buffer[parser.buffer_pos] == '+' {
        +				chomping = +1
        +			} else {
        +				chomping = -1
        +			}
        +			skip(parser)
        +		}
        +	}
        +
        +	// Eat whitespaces and comments to the end of the line.
        +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +		return false
        +	}
        +	for is_blank(parser.buffer, parser.buffer_pos) {
        +		skip(parser)
        +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +			return false
        +		}
        +	}
        +	if parser.buffer[parser.buffer_pos] == '#' {
        +		// TODO Test this and then re-enable it.
        +		//if !yaml_parser_scan_line_comment(parser, start_mark) {
        +		//	return false
        +		//}
        +		for !is_breakz(parser.buffer, parser.buffer_pos) {
        +			skip(parser)
        +			if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +				return false
        +			}
        +		}
        +	}
        +
        +	// Check if we are at the end of the line.
        +	if !is_breakz(parser.buffer, parser.buffer_pos) {
        +		yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
        +			start_mark, "did not find expected comment or line break")
        +		return false
        +	}
        +
        +	// Eat a line break.
        +	if is_break(parser.buffer, parser.buffer_pos) {
        +		if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
        +			return false
        +		}
        +		skip_line(parser)
        +	}
        +
        +	end_mark := parser.mark
        +
        +	// Set the indentation level if it was specified.
        +	var indent int
        +	if increment > 0 {
        +		if parser.indent >= 0 {
        +			indent = parser.indent + increment
        +		} else {
        +			indent = increment
        +		}
        +	}
        +
        +	// Scan the leading line breaks and determine the indentation level if needed.
        +	var s, leading_break, trailing_breaks []byte
        +	if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) {
        +		return false
        +	}
        +
        +	// Scan the block scalar content.
        +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +		return false
        +	}
        +	var leading_blank, trailing_blank bool
        +	for parser.mark.column == indent && !is_z(parser.buffer, parser.buffer_pos) {
        +		// We are at the beginning of a non-empty line.
        +
        +		// Is it a trailing whitespace?
        +		trailing_blank = is_blank(parser.buffer, parser.buffer_pos)
        +
        +		// Check if we need to fold the leading line break.
        +		if !literal && !leading_blank && !trailing_blank && len(leading_break) > 0 && leading_break[0] == '\n' {
        +			// Do we need to join the lines by space?
        +			if len(trailing_breaks) == 0 {
        +				s = append(s, ' ')
        +			}
        +		} else {
        +			s = append(s, leading_break...)
        +		}
        +		leading_break = leading_break[:0]
        +
        +		// Append the remaining line breaks.
        +		s = append(s, trailing_breaks...)
        +		trailing_breaks = trailing_breaks[:0]
        +
        +		// Is it a leading whitespace?
        +		leading_blank = is_blank(parser.buffer, parser.buffer_pos)
        +
        +		// Consume the current line.
        +		for !is_breakz(parser.buffer, parser.buffer_pos) {
        +			s = read(parser, s)
        +			if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +				return false
        +			}
        +		}
        +
        +		// Consume the line break.
        +		if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
        +			return false
        +		}
        +
        +		leading_break = read_line(parser, leading_break)
        +
        +		// Eat the following indentation spaces and line breaks.
        +		if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) {
        +			return false
        +		}
        +	}
        +
        +	// Chomp the tail.
        +	if chomping != -1 {
        +		s = append(s, leading_break...)
        +	}
        +	if chomping == 1 {
        +		s = append(s, trailing_breaks...)
        +	}
        +
        +	// Create a token.
        +	*token = yaml_token_t{
        +		typ:        yaml_SCALAR_TOKEN,
        +		start_mark: start_mark,
        +		end_mark:   end_mark,
        +		value:      s,
        +		style:      yaml_LITERAL_SCALAR_STYLE,
        +	}
        +	if !literal {
        +		token.style = yaml_FOLDED_SCALAR_STYLE
        +	}
        +	return true
        +}
        +
        +// Scan indentation spaces and line breaks for a block scalar.  Determine the
        +// indentation level if needed.
        +func yaml_parser_scan_block_scalar_breaks(parser *yaml_parser_t, indent *int, breaks *[]byte, start_mark yaml_mark_t, end_mark *yaml_mark_t) bool {
        +	*end_mark = parser.mark
        +
        +	// Eat the indentation spaces and line breaks.
        +	max_indent := 0
        +	for {
        +		// Eat the indentation spaces.
        +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +			return false
        +		}
        +		for (*indent == 0 || parser.mark.column < *indent) && is_space(parser.buffer, parser.buffer_pos) {
        +			skip(parser)
        +			if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +				return false
        +			}
        +		}
        +		if parser.mark.column > max_indent {
        +			max_indent = parser.mark.column
        +		}
        +
        +		// Check for a tab character messing the indentation.
        +		if (*indent == 0 || parser.mark.column < *indent) && is_tab(parser.buffer, parser.buffer_pos) {
        +			return yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
        +				start_mark, "found a tab character where an indentation space is expected")
        +		}
        +
        +		// Have we found a non-empty line?
        +		if !is_break(parser.buffer, parser.buffer_pos) {
        +			break
        +		}
        +
        +		// Consume the line break.
        +		if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
        +			return false
        +		}
        +		// [Go] Should really be returning breaks instead.
        +		*breaks = read_line(parser, *breaks)
        +		*end_mark = parser.mark
        +	}
        +
        +	// Determine the indentation level if needed.
        +	if *indent == 0 {
        +		*indent = max_indent
        +		if *indent < parser.indent+1 {
        +			*indent = parser.indent + 1
        +		}
        +		if *indent < 1 {
        +			*indent = 1
        +		}
        +	}
        +	return true
        +}
        +
        +// Scan a quoted scalar.
        +func yaml_parser_scan_flow_scalar(parser *yaml_parser_t, token *yaml_token_t, single bool) bool {
        +	// Eat the left quote.
        +	start_mark := parser.mark
        +	skip(parser)
        +
        +	// Consume the content of the quoted scalar.
        +	var s, leading_break, trailing_breaks, whitespaces []byte
        +	for {
        +		// Check that there are no document indicators at the beginning of the line.
        +		if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) {
        +			return false
        +		}
        +
        +		if parser.mark.column == 0 &&
        +			((parser.buffer[parser.buffer_pos+0] == '-' &&
        +				parser.buffer[parser.buffer_pos+1] == '-' &&
        +				parser.buffer[parser.buffer_pos+2] == '-') ||
        +				(parser.buffer[parser.buffer_pos+0] == '.' &&
        +					parser.buffer[parser.buffer_pos+1] == '.' &&
        +					parser.buffer[parser.buffer_pos+2] == '.')) &&
        +			is_blankz(parser.buffer, parser.buffer_pos+3) {
        +			yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar",
        +				start_mark, "found unexpected document indicator")
        +			return false
        +		}
        +
        +		// Check for EOF.
        +		if is_z(parser.buffer, parser.buffer_pos) {
        +			yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar",
        +				start_mark, "found unexpected end of stream")
        +			return false
        +		}
        +
        +		// Consume non-blank characters.
        +		leading_blanks := false
        +		for !is_blankz(parser.buffer, parser.buffer_pos) {
        +			if single && parser.buffer[parser.buffer_pos] == '\'' && parser.buffer[parser.buffer_pos+1] == '\'' {
        +				// Is is an escaped single quote.
        +				s = append(s, '\'')
        +				skip(parser)
        +				skip(parser)
        +
        +			} else if single && parser.buffer[parser.buffer_pos] == '\'' {
        +				// It is a right single quote.
        +				break
        +			} else if !single && parser.buffer[parser.buffer_pos] == '"' {
        +				// It is a right double quote.
        +				break
        +
        +			} else if !single && parser.buffer[parser.buffer_pos] == '\\' && is_break(parser.buffer, parser.buffer_pos+1) {
        +				// It is an escaped line break.
        +				if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) {
        +					return false
        +				}
        +				skip(parser)
        +				skip_line(parser)
        +				leading_blanks = true
        +				break
        +
        +			} else if !single && parser.buffer[parser.buffer_pos] == '\\' {
        +				// It is an escape sequence.
        +				code_length := 0
        +
        +				// Check the escape character.
        +				switch parser.buffer[parser.buffer_pos+1] {
        +				case '0':
        +					s = append(s, 0)
        +				case 'a':
        +					s = append(s, '\x07')
        +				case 'b':
        +					s = append(s, '\x08')
        +				case 't', '\t':
        +					s = append(s, '\x09')
        +				case 'n':
        +					s = append(s, '\x0A')
        +				case 'v':
        +					s = append(s, '\x0B')
        +				case 'f':
        +					s = append(s, '\x0C')
        +				case 'r':
        +					s = append(s, '\x0D')
        +				case 'e':
        +					s = append(s, '\x1B')
        +				case ' ':
        +					s = append(s, '\x20')
        +				case '"':
        +					s = append(s, '"')
        +				case '\'':
        +					s = append(s, '\'')
        +				case '\\':
        +					s = append(s, '\\')
        +				case 'N': // NEL (#x85)
        +					s = append(s, '\xC2')
        +					s = append(s, '\x85')
        +				case '_': // #xA0
        +					s = append(s, '\xC2')
        +					s = append(s, '\xA0')
        +				case 'L': // LS (#x2028)
        +					s = append(s, '\xE2')
        +					s = append(s, '\x80')
        +					s = append(s, '\xA8')
        +				case 'P': // PS (#x2029)
        +					s = append(s, '\xE2')
        +					s = append(s, '\x80')
        +					s = append(s, '\xA9')
        +				case 'x':
        +					code_length = 2
        +				case 'u':
        +					code_length = 4
        +				case 'U':
        +					code_length = 8
        +				default:
        +					yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar",
        +						start_mark, "found unknown escape character")
        +					return false
        +				}
        +
        +				skip(parser)
        +				skip(parser)
        +
        +				// Consume an arbitrary escape code.
        +				if code_length > 0 {
        +					var value int
        +
        +					// Scan the character value.
        +					if parser.unread < code_length && !yaml_parser_update_buffer(parser, code_length) {
        +						return false
        +					}
        +					for k := 0; k < code_length; k++ {
        +						if !is_hex(parser.buffer, parser.buffer_pos+k) {
        +							yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar",
        +								start_mark, "did not find expected hexdecimal number")
        +							return false
        +						}
        +						value = (value << 4) + as_hex(parser.buffer, parser.buffer_pos+k)
        +					}
        +
        +					// Check the value and write the character.
        +					if (value >= 0xD800 && value <= 0xDFFF) || value > 0x10FFFF {
        +						yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar",
        +							start_mark, "found invalid Unicode character escape code")
        +						return false
        +					}
        +					if value <= 0x7F {
        +						s = append(s, byte(value))
        +					} else if value <= 0x7FF {
        +						s = append(s, byte(0xC0+(value>>6)))
        +						s = append(s, byte(0x80+(value&0x3F)))
        +					} else if value <= 0xFFFF {
        +						s = append(s, byte(0xE0+(value>>12)))
        +						s = append(s, byte(0x80+((value>>6)&0x3F)))
        +						s = append(s, byte(0x80+(value&0x3F)))
        +					} else {
        +						s = append(s, byte(0xF0+(value>>18)))
        +						s = append(s, byte(0x80+((value>>12)&0x3F)))
        +						s = append(s, byte(0x80+((value>>6)&0x3F)))
        +						s = append(s, byte(0x80+(value&0x3F)))
        +					}
        +
        +					// Advance the pointer.
        +					for k := 0; k < code_length; k++ {
        +						skip(parser)
        +					}
        +				}
        +			} else {
        +				// It is a non-escaped non-blank character.
        +				s = read(parser, s)
        +			}
        +			if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
        +				return false
        +			}
        +		}
        +
        +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +			return false
        +		}
        +
        +		// Check if we are at the end of the scalar.
        +		if single {
        +			if parser.buffer[parser.buffer_pos] == '\'' {
        +				break
        +			}
        +		} else {
        +			if parser.buffer[parser.buffer_pos] == '"' {
        +				break
        +			}
        +		}
        +
        +		// Consume blank characters.
        +		for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) {
        +			if is_blank(parser.buffer, parser.buffer_pos) {
        +				// Consume a space or a tab character.
        +				if !leading_blanks {
        +					whitespaces = read(parser, whitespaces)
        +				} else {
        +					skip(parser)
        +				}
        +			} else {
        +				if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
        +					return false
        +				}
        +
        +				// Check if it is a first line break.
        +				if !leading_blanks {
        +					whitespaces = whitespaces[:0]
        +					leading_break = read_line(parser, leading_break)
        +					leading_blanks = true
        +				} else {
        +					trailing_breaks = read_line(parser, trailing_breaks)
        +				}
        +			}
        +			if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +				return false
        +			}
        +		}
        +
        +		// Join the whitespaces or fold line breaks.
        +		if leading_blanks {
        +			// Do we need to fold line breaks?
        +			if len(leading_break) > 0 && leading_break[0] == '\n' {
        +				if len(trailing_breaks) == 0 {
        +					s = append(s, ' ')
        +				} else {
        +					s = append(s, trailing_breaks...)
        +				}
        +			} else {
        +				s = append(s, leading_break...)
        +				s = append(s, trailing_breaks...)
        +			}
        +			trailing_breaks = trailing_breaks[:0]
        +			leading_break = leading_break[:0]
        +		} else {
        +			s = append(s, whitespaces...)
        +			whitespaces = whitespaces[:0]
        +		}
        +	}
        +
        +	// Eat the right quote.
        +	skip(parser)
        +	end_mark := parser.mark
        +
        +	// Create a token.
        +	*token = yaml_token_t{
        +		typ:        yaml_SCALAR_TOKEN,
        +		start_mark: start_mark,
        +		end_mark:   end_mark,
        +		value:      s,
        +		style:      yaml_SINGLE_QUOTED_SCALAR_STYLE,
        +	}
        +	if !single {
        +		token.style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
        +	}
        +	return true
        +}
        +
        +// Scan a plain scalar.
        +func yaml_parser_scan_plain_scalar(parser *yaml_parser_t, token *yaml_token_t) bool {
        +
        +	var s, leading_break, trailing_breaks, whitespaces []byte
        +	var leading_blanks bool
        +	var indent = parser.indent + 1
        +
        +	start_mark := parser.mark
        +	end_mark := parser.mark
        +
        +	// Consume the content of the plain scalar.
        +	for {
        +		// Check for a document indicator.
        +		if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) {
        +			return false
        +		}
        +		if parser.mark.column == 0 &&
        +			((parser.buffer[parser.buffer_pos+0] == '-' &&
        +				parser.buffer[parser.buffer_pos+1] == '-' &&
        +				parser.buffer[parser.buffer_pos+2] == '-') ||
        +				(parser.buffer[parser.buffer_pos+0] == '.' &&
        +					parser.buffer[parser.buffer_pos+1] == '.' &&
        +					parser.buffer[parser.buffer_pos+2] == '.')) &&
        +			is_blankz(parser.buffer, parser.buffer_pos+3) {
        +			break
        +		}
        +
        +		// Check for a comment.
        +		if parser.buffer[parser.buffer_pos] == '#' {
        +			break
        +		}
        +
        +		// Consume non-blank characters.
        +		for !is_blankz(parser.buffer, parser.buffer_pos) {
        +
        +			// Check for indicators that may end a plain scalar.
        +			if (parser.buffer[parser.buffer_pos] == ':' && is_blankz(parser.buffer, parser.buffer_pos+1)) ||
        +				(parser.flow_level > 0 &&
        +					(parser.buffer[parser.buffer_pos] == ',' ||
        +						parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == '[' ||
        +						parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' ||
        +						parser.buffer[parser.buffer_pos] == '}')) {
        +				break
        +			}
        +
        +			// Check if we need to join whitespaces and breaks.
        +			if leading_blanks || len(whitespaces) > 0 {
        +				if leading_blanks {
        +					// Do we need to fold line breaks?
        +					if leading_break[0] == '\n' {
        +						if len(trailing_breaks) == 0 {
        +							s = append(s, ' ')
        +						} else {
        +							s = append(s, trailing_breaks...)
        +						}
        +					} else {
        +						s = append(s, leading_break...)
        +						s = append(s, trailing_breaks...)
        +					}
        +					trailing_breaks = trailing_breaks[:0]
        +					leading_break = leading_break[:0]
        +					leading_blanks = false
        +				} else {
        +					s = append(s, whitespaces...)
        +					whitespaces = whitespaces[:0]
        +				}
        +			}
        +
        +			// Copy the character.
        +			s = read(parser, s)
        +
        +			end_mark = parser.mark
        +			if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
        +				return false
        +			}
        +		}
        +
        +		// Is it the end?
        +		if !(is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos)) {
        +			break
        +		}
        +
        +		// Consume blank characters.
        +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +			return false
        +		}
        +
        +		for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) {
        +			if is_blank(parser.buffer, parser.buffer_pos) {
        +
        +				// Check for tab characters that abuse indentation.
        +				if leading_blanks && parser.mark.column < indent && is_tab(parser.buffer, parser.buffer_pos) {
        +					yaml_parser_set_scanner_error(parser, "while scanning a plain scalar",
        +						start_mark, "found a tab character that violates indentation")
        +					return false
        +				}
        +
        +				// Consume a space or a tab character.
        +				if !leading_blanks {
        +					whitespaces = read(parser, whitespaces)
        +				} else {
        +					skip(parser)
        +				}
        +			} else {
        +				if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
        +					return false
        +				}
        +
        +				// Check if it is a first line break.
        +				if !leading_blanks {
        +					whitespaces = whitespaces[:0]
        +					leading_break = read_line(parser, leading_break)
        +					leading_blanks = true
        +				} else {
        +					trailing_breaks = read_line(parser, trailing_breaks)
        +				}
        +			}
        +			if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +				return false
        +			}
        +		}
        +
        +		// Check indentation level.
        +		if parser.flow_level == 0 && parser.mark.column < indent {
        +			break
        +		}
        +	}
        +
        +	// Create a token.
        +	*token = yaml_token_t{
        +		typ:        yaml_SCALAR_TOKEN,
        +		start_mark: start_mark,
        +		end_mark:   end_mark,
        +		value:      s,
        +		style:      yaml_PLAIN_SCALAR_STYLE,
        +	}
        +
        +	// Note that we change the 'simple_key_allowed' flag.
        +	if leading_blanks {
        +		parser.simple_key_allowed = true
        +	}
        +	return true
        +}
        +
        +func yaml_parser_scan_line_comment(parser *yaml_parser_t, token_mark yaml_mark_t) bool {
        +	if parser.newlines > 0 {
        +		return true
        +	}
        +
        +	var start_mark yaml_mark_t
        +	var text []byte
        +
        +	for peek := 0; peek < 512; peek++ {
        +		if parser.unread < peek+1 && !yaml_parser_update_buffer(parser, peek+1) {
        +			break
        +		}
        +		if is_blank(parser.buffer, parser.buffer_pos+peek) {
        +			continue
        +		}
        +		if parser.buffer[parser.buffer_pos+peek] == '#' {
        +			seen := parser.mark.index+peek
        +			for {
        +				if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +					return false
        +				}
        +				if is_breakz(parser.buffer, parser.buffer_pos) {
        +					if parser.mark.index >= seen {
        +						break
        +					}
        +					if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
        +						return false
        +					}
        +					skip_line(parser)
        +				} else {
        +					if parser.mark.index >= seen {
        +						if len(text) == 0 {
        +							start_mark = parser.mark
        +						}
        +						text = append(text, parser.buffer[parser.buffer_pos])
        +					}
        +					skip(parser)
        +				}
        +			}
        +		}
        +		break
        +	}
        +	if len(text) > 0 {
        +		parser.comments = append(parser.comments, yaml_comment_t{
        +			token_mark: token_mark,
        +			start_mark: start_mark,
        +			line: text,
        +		})
        +	}
        +	return true
        +}
        +
        +func yaml_parser_scan_comments(parser *yaml_parser_t, scan_mark yaml_mark_t) bool {
        +	token := parser.tokens[len(parser.tokens)-1]
        +
        +	if token.typ == yaml_FLOW_ENTRY_TOKEN && len(parser.tokens) > 1 {
        +		token = parser.tokens[len(parser.tokens)-2]
        +	}
        +
        +	var token_mark = token.start_mark
        +	var start_mark yaml_mark_t
        +
        +	var recent_empty = false
        +	var first_empty = parser.newlines <= 1
        +
        +	var line = parser.mark.line
        +	var column = parser.mark.column
        +
        +	var text []byte
        +
        +	// The foot line is the place where a comment must start to
        +	// still be considered as a foot of the prior content.
        +	// If there's some content in the currently parsed line, then
        +	// the foot is the line below it.
        +	var foot_line = -1
        +	if scan_mark.line > 0 {
        +		foot_line = parser.mark.line-parser.newlines+1
        +		if parser.newlines == 0 && parser.mark.column > 1 {
        +			foot_line++
        +		}
        +	}
        +
        +	var peek = 0
        +	for ; peek < 512; peek++ {
        +		if parser.unread < peek+1 && !yaml_parser_update_buffer(parser, peek+1) {
        +			break
        +		}
        +		column++
        +		if is_blank(parser.buffer, parser.buffer_pos+peek) {
        +			continue
        +		}
        +		c := parser.buffer[parser.buffer_pos+peek]
        +		if is_breakz(parser.buffer, parser.buffer_pos+peek) || parser.flow_level > 0 && (c == ']' || c == '}') {
        +			// Got line break or terminator.
        +			if !recent_empty {
        +				if first_empty && (start_mark.line == foot_line || start_mark.column-1 < parser.indent) {
        +					// This is the first empty line and there were no empty lines before,
        +					// so this initial part of the comment is a foot of the prior token
        +					// instead of being a head for the following one. Split it up.
        +					if len(text) > 0 {
        +						if start_mark.column-1 < parser.indent {
        +							// If dedented it's unrelated to the prior token.
        +							token_mark = start_mark
        +						}
        +						parser.comments = append(parser.comments, yaml_comment_t{
        +							scan_mark:  scan_mark,
        +							token_mark: token_mark,
        +							start_mark: start_mark,
        +							end_mark:   yaml_mark_t{parser.mark.index + peek, line, column},
        +							foot:       text,
        +						})
        +						scan_mark = yaml_mark_t{parser.mark.index + peek, line, column}
        +						token_mark = scan_mark
        +						text = nil
        +					}
        +				} else {
        +					if len(text) > 0 && parser.buffer[parser.buffer_pos+peek] != 0 {
        +						text = append(text, '\n')
        +					}
        +				}
        +			}
        +			if !is_break(parser.buffer, parser.buffer_pos+peek) {
        +				break
        +			}
        +			first_empty = false
        +			recent_empty = true
        +			column = 0
        +			line++
        +			continue
        +		}
        +
        +		if len(text) > 0 && column < parser.indent+1 && column != start_mark.column {
        +			// The comment at the different indentation is a foot of the
        +			// preceding data rather than a head of the upcoming one.
        +			parser.comments = append(parser.comments, yaml_comment_t{
        +				scan_mark:  scan_mark,
        +				token_mark: token_mark,
        +				start_mark: start_mark,
        +				end_mark:   yaml_mark_t{parser.mark.index + peek, line, column},
        +				foot:       text,
        +			})
        +			scan_mark = yaml_mark_t{parser.mark.index + peek, line, column}
        +			token_mark = scan_mark
        +			text = nil
        +		}
        +
        +		if parser.buffer[parser.buffer_pos+peek] != '#' {
        +			break
        +		}
        +
        +		if len(text) == 0 {
        +			start_mark = yaml_mark_t{parser.mark.index + peek, line, column}
        +		} else {
        +			text = append(text, '\n')
        +		}
        +
        +		recent_empty = false
        +
        +		// Consume until after the consumed comment line.
        +		seen := parser.mark.index+peek
        +		for {
        +			if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
        +				return false
        +			}
        +			if is_breakz(parser.buffer, parser.buffer_pos) {
        +				if parser.mark.index >= seen {
        +					break
        +				}
        +				if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
        +					return false
        +				}
        +				skip_line(parser)
        +			} else {
        +				if parser.mark.index >= seen {
        +					text = append(text, parser.buffer[parser.buffer_pos])
        +				}
        +				skip(parser)
        +			}
        +		}
        +
        +		peek = 0
        +		column = 0
        +		line = parser.mark.line
        +	}
        +
        +	if len(text) > 0 {
        +		parser.comments = append(parser.comments, yaml_comment_t{
        +			scan_mark:  scan_mark,
        +			token_mark: start_mark,
        +			start_mark: start_mark,
        +			end_mark:   yaml_mark_t{parser.mark.index + peek - 1, line, column},
        +			head:       text,
        +		})
        +	}
        +	return true
        +}
        diff --git a/vendor/gopkg.in/yaml.v3/sorter.go b/vendor/gopkg.in/yaml.v3/sorter.go
        new file mode 100644
        index 000000000..9210ece7e
        --- /dev/null
        +++ b/vendor/gopkg.in/yaml.v3/sorter.go
        @@ -0,0 +1,134 @@
        +//
        +// Copyright (c) 2011-2019 Canonical Ltd
        +//
        +// Licensed under the Apache License, Version 2.0 (the "License");
        +// you may not use this file except in compliance with the License.
        +// You may obtain a copy of the License at
        +//
        +//     http://www.apache.org/licenses/LICENSE-2.0
        +//
        +// Unless required by applicable law or agreed to in writing, software
        +// distributed under the License is distributed on an "AS IS" BASIS,
        +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        +// See the License for the specific language governing permissions and
        +// limitations under the License.
        +
        +package yaml
        +
        +import (
        +	"reflect"
        +	"unicode"
        +)
        +
        +type keyList []reflect.Value
        +
        +func (l keyList) Len() int      { return len(l) }
        +func (l keyList) Swap(i, j int) { l[i], l[j] = l[j], l[i] }
        +func (l keyList) Less(i, j int) bool {
        +	a := l[i]
        +	b := l[j]
        +	ak := a.Kind()
        +	bk := b.Kind()
        +	for (ak == reflect.Interface || ak == reflect.Ptr) && !a.IsNil() {
        +		a = a.Elem()
        +		ak = a.Kind()
        +	}
        +	for (bk == reflect.Interface || bk == reflect.Ptr) && !b.IsNil() {
        +		b = b.Elem()
        +		bk = b.Kind()
        +	}
        +	af, aok := keyFloat(a)
        +	bf, bok := keyFloat(b)
        +	if aok && bok {
        +		if af != bf {
        +			return af < bf
        +		}
        +		if ak != bk {
        +			return ak < bk
        +		}
        +		return numLess(a, b)
        +	}
        +	if ak != reflect.String || bk != reflect.String {
        +		return ak < bk
        +	}
        +	ar, br := []rune(a.String()), []rune(b.String())
        +	digits := false
        +	for i := 0; i < len(ar) && i < len(br); i++ {
        +		if ar[i] == br[i] {
        +			digits = unicode.IsDigit(ar[i])
        +			continue
        +		}
        +		al := unicode.IsLetter(ar[i])
        +		bl := unicode.IsLetter(br[i])
        +		if al && bl {
        +			return ar[i] < br[i]
        +		}
        +		if al || bl {
        +			if digits {
        +				return al
        +			} else {
        +				return bl
        +			}
        +		}
        +		var ai, bi int
        +		var an, bn int64
        +		if ar[i] == '0' || br[i] == '0' {
        +			for j := i - 1; j >= 0 && unicode.IsDigit(ar[j]); j-- {
        +				if ar[j] != '0' {
        +					an = 1
        +					bn = 1
        +					break
        +				}
        +			}
        +		}
        +		for ai = i; ai < len(ar) && unicode.IsDigit(ar[ai]); ai++ {
        +			an = an*10 + int64(ar[ai]-'0')
        +		}
        +		for bi = i; bi < len(br) && unicode.IsDigit(br[bi]); bi++ {
        +			bn = bn*10 + int64(br[bi]-'0')
        +		}
        +		if an != bn {
        +			return an < bn
        +		}
        +		if ai != bi {
        +			return ai < bi
        +		}
        +		return ar[i] < br[i]
        +	}
        +	return len(ar) < len(br)
        +}
        +
        +// keyFloat returns a float value for v if it is a number/bool
        +// and whether it is a number/bool or not.
        +func keyFloat(v reflect.Value) (f float64, ok bool) {
        +	switch v.Kind() {
        +	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
        +		return float64(v.Int()), true
        +	case reflect.Float32, reflect.Float64:
        +		return v.Float(), true
        +	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
        +		return float64(v.Uint()), true
        +	case reflect.Bool:
        +		if v.Bool() {
        +			return 1, true
        +		}
        +		return 0, true
        +	}
        +	return 0, false
        +}
        +
        +// numLess returns whether a < b.
        +// a and b must necessarily have the same kind.
        +func numLess(a, b reflect.Value) bool {
        +	switch a.Kind() {
        +	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
        +		return a.Int() < b.Int()
        +	case reflect.Float32, reflect.Float64:
        +		return a.Float() < b.Float()
        +	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
        +		return a.Uint() < b.Uint()
        +	case reflect.Bool:
        +		return !a.Bool() && b.Bool()
        +	}
        +	panic("not a number")
        +}
        diff --git a/vendor/gopkg.in/yaml.v3/writerc.go b/vendor/gopkg.in/yaml.v3/writerc.go
        new file mode 100644
        index 000000000..b8a116bf9
        --- /dev/null
        +++ b/vendor/gopkg.in/yaml.v3/writerc.go
        @@ -0,0 +1,48 @@
        +// 
        +// Copyright (c) 2011-2019 Canonical Ltd
        +// Copyright (c) 2006-2010 Kirill Simonov
        +// 
        +// Permission is hereby granted, free of charge, to any person obtaining a copy of
        +// this software and associated documentation files (the "Software"), to deal in
        +// the Software without restriction, including without limitation the rights to
        +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
        +// of the Software, and to permit persons to whom the Software is furnished to do
        +// so, subject to the following conditions:
        +// 
        +// The above copyright notice and this permission notice shall be included in all
        +// copies or substantial portions of the Software.
        +// 
        +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        +// SOFTWARE.
        +
        +package yaml
        +
        +// Set the writer error and return false.
        +func yaml_emitter_set_writer_error(emitter *yaml_emitter_t, problem string) bool {
        +	emitter.error = yaml_WRITER_ERROR
        +	emitter.problem = problem
        +	return false
        +}
        +
        +// Flush the output buffer.
        +func yaml_emitter_flush(emitter *yaml_emitter_t) bool {
        +	if emitter.write_handler == nil {
        +		panic("write handler not set")
        +	}
        +
        +	// Check if the buffer is empty.
        +	if emitter.buffer_pos == 0 {
        +		return true
        +	}
        +
        +	if err := emitter.write_handler(emitter, emitter.buffer[:emitter.buffer_pos]); err != nil {
        +		return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error())
        +	}
        +	emitter.buffer_pos = 0
        +	return true
        +}
        diff --git a/vendor/gopkg.in/yaml.v3/yaml.go b/vendor/gopkg.in/yaml.v3/yaml.go
        new file mode 100644
        index 000000000..b5d35a50d
        --- /dev/null
        +++ b/vendor/gopkg.in/yaml.v3/yaml.go
        @@ -0,0 +1,662 @@
        +//
        +// Copyright (c) 2011-2019 Canonical Ltd
        +//
        +// Licensed under the Apache License, Version 2.0 (the "License");
        +// you may not use this file except in compliance with the License.
        +// You may obtain a copy of the License at
        +//
        +//     http://www.apache.org/licenses/LICENSE-2.0
        +//
        +// Unless required by applicable law or agreed to in writing, software
        +// distributed under the License is distributed on an "AS IS" BASIS,
        +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        +// See the License for the specific language governing permissions and
        +// limitations under the License.
        +
        +// Package yaml implements YAML support for the Go language.
        +//
        +// Source code and other details for the project are available at GitHub:
        +//
        +//   https://github.com/go-yaml/yaml
        +//
        +package yaml
        +
        +import (
        +	"errors"
        +	"fmt"
        +	"io"
        +	"reflect"
        +	"strings"
        +	"sync"
        +	"unicode/utf8"
        +)
        +
        +// The Unmarshaler interface may be implemented by types to customize their
        +// behavior when being unmarshaled from a YAML document.
        +type Unmarshaler interface {
        +	UnmarshalYAML(value *Node) error
        +}
        +
        +type obsoleteUnmarshaler interface {
        +	UnmarshalYAML(unmarshal func(interface{}) error) error
        +}
        +
        +// The Marshaler interface may be implemented by types to customize their
        +// behavior when being marshaled into a YAML document. The returned value
        +// is marshaled in place of the original value implementing Marshaler.
        +//
        +// If an error is returned by MarshalYAML, the marshaling procedure stops
        +// and returns with the provided error.
        +type Marshaler interface {
        +	MarshalYAML() (interface{}, error)
        +}
        +
        +// Unmarshal decodes the first document found within the in byte slice
        +// and assigns decoded values into the out value.
        +//
        +// Maps and pointers (to a struct, string, int, etc) are accepted as out
        +// values. If an internal pointer within a struct is not initialized,
        +// the yaml package will initialize it if necessary for unmarshalling
        +// the provided data. The out parameter must not be nil.
        +//
        +// The type of the decoded values should be compatible with the respective
        +// values in out. If one or more values cannot be decoded due to a type
        +// mismatches, decoding continues partially until the end of the YAML
        +// content, and a *yaml.TypeError is returned with details for all
        +// missed values.
        +//
        +// Struct fields are only unmarshalled if they are exported (have an
        +// upper case first letter), and are unmarshalled using the field name
        +// lowercased as the default key. Custom keys may be defined via the
        +// "yaml" name in the field tag: the content preceding the first comma
        +// is used as the key, and the following comma-separated options are
        +// used to tweak the marshalling process (see Marshal).
        +// Conflicting names result in a runtime error.
        +//
        +// For example:
        +//
        +//     type T struct {
        +//         F int `yaml:"a,omitempty"`
        +//         B int
        +//     }
        +//     var t T
        +//     yaml.Unmarshal([]byte("a: 1\nb: 2"), &t)
        +//
        +// See the documentation of Marshal for the format of tags and a list of
        +// supported tag options.
        +//
        +func Unmarshal(in []byte, out interface{}) (err error) {
        +	return unmarshal(in, out, false)
        +}
        +
        +// A Decorder reads and decodes YAML values from an input stream.
        +type Decoder struct {
        +	parser      *parser
        +	knownFields bool
        +}
        +
        +// NewDecoder returns a new decoder that reads from r.
        +//
        +// The decoder introduces its own buffering and may read
        +// data from r beyond the YAML values requested.
        +func NewDecoder(r io.Reader) *Decoder {
        +	return &Decoder{
        +		parser: newParserFromReader(r),
        +	}
        +}
        +
        +// KnownFields ensures that the keys in decoded mappings to
        +// exist as fields in the struct being decoded into.
        +func (dec *Decoder) KnownFields(enable bool) {
        +	dec.knownFields = enable
        +}
        +
        +// Decode reads the next YAML-encoded value from its input
        +// and stores it in the value pointed to by v.
        +//
        +// See the documentation for Unmarshal for details about the
        +// conversion of YAML into a Go value.
        +func (dec *Decoder) Decode(v interface{}) (err error) {
        +	d := newDecoder()
        +	d.knownFields = dec.knownFields
        +	defer handleErr(&err)
        +	node := dec.parser.parse()
        +	if node == nil {
        +		return io.EOF
        +	}
        +	out := reflect.ValueOf(v)
        +	if out.Kind() == reflect.Ptr && !out.IsNil() {
        +		out = out.Elem()
        +	}
        +	d.unmarshal(node, out)
        +	if len(d.terrors) > 0 {
        +		return &TypeError{d.terrors}
        +	}
        +	return nil
        +}
        +
        +// Decode decodes the node and stores its data into the value pointed to by v.
        +//
        +// See the documentation for Unmarshal for details about the
        +// conversion of YAML into a Go value.
        +func (n *Node) Decode(v interface{}) (err error) {
        +	d := newDecoder()
        +	defer handleErr(&err)
        +	out := reflect.ValueOf(v)
        +	if out.Kind() == reflect.Ptr && !out.IsNil() {
        +		out = out.Elem()
        +	}
        +	d.unmarshal(n, out)
        +	if len(d.terrors) > 0 {
        +		return &TypeError{d.terrors}
        +	}
        +	return nil
        +}
        +
        +func unmarshal(in []byte, out interface{}, strict bool) (err error) {
        +	defer handleErr(&err)
        +	d := newDecoder()
        +	p := newParser(in)
        +	defer p.destroy()
        +	node := p.parse()
        +	if node != nil {
        +		v := reflect.ValueOf(out)
        +		if v.Kind() == reflect.Ptr && !v.IsNil() {
        +			v = v.Elem()
        +		}
        +		d.unmarshal(node, v)
        +	}
        +	if len(d.terrors) > 0 {
        +		return &TypeError{d.terrors}
        +	}
        +	return nil
        +}
        +
        +// Marshal serializes the value provided into a YAML document. The structure
        +// of the generated document will reflect the structure of the value itself.
        +// Maps and pointers (to struct, string, int, etc) are accepted as the in value.
        +//
        +// Struct fields are only marshalled if they are exported (have an upper case
        +// first letter), and are marshalled using the field name lowercased as the
        +// default key. Custom keys may be defined via the "yaml" name in the field
        +// tag: the content preceding the first comma is used as the key, and the
        +// following comma-separated options are used to tweak the marshalling process.
        +// Conflicting names result in a runtime error.
        +//
        +// The field tag format accepted is:
        +//
        +//     `(...) yaml:"[][,[,]]" (...)`
        +//
        +// The following flags are currently supported:
        +//
        +//     omitempty    Only include the field if it's not set to the zero
        +//                  value for the type or to empty slices or maps.
        +//                  Zero valued structs will be omitted if all their public
        +//                  fields are zero, unless they implement an IsZero
        +//                  method (see the IsZeroer interface type), in which
        +//                  case the field will be included if that method returns true.
        +//
        +//     flow         Marshal using a flow style (useful for structs,
        +//                  sequences and maps).
        +//
        +//     inline       Inline the field, which must be a struct or a map,
        +//                  causing all of its fields or keys to be processed as if
        +//                  they were part of the outer struct. For maps, keys must
        +//                  not conflict with the yaml keys of other struct fields.
        +//
        +// In addition, if the key is "-", the field is ignored.
        +//
        +// For example:
        +//
        +//     type T struct {
        +//         F int `yaml:"a,omitempty"`
        +//         B int
        +//     }
        +//     yaml.Marshal(&T{B: 2}) // Returns "b: 2\n"
        +//     yaml.Marshal(&T{F: 1}} // Returns "a: 1\nb: 0\n"
        +//
        +func Marshal(in interface{}) (out []byte, err error) {
        +	defer handleErr(&err)
        +	e := newEncoder()
        +	defer e.destroy()
        +	e.marshalDoc("", reflect.ValueOf(in))
        +	e.finish()
        +	out = e.out
        +	return
        +}
        +
        +// An Encoder writes YAML values to an output stream.
        +type Encoder struct {
        +	encoder *encoder
        +}
        +
        +// NewEncoder returns a new encoder that writes to w.
        +// The Encoder should be closed after use to flush all data
        +// to w.
        +func NewEncoder(w io.Writer) *Encoder {
        +	return &Encoder{
        +		encoder: newEncoderWithWriter(w),
        +	}
        +}
        +
        +// Encode writes the YAML encoding of v to the stream.
        +// If multiple items are encoded to the stream, the
        +// second and subsequent document will be preceded
        +// with a "---" document separator, but the first will not.
        +//
        +// See the documentation for Marshal for details about the conversion of Go
        +// values to YAML.
        +func (e *Encoder) Encode(v interface{}) (err error) {
        +	defer handleErr(&err)
        +	e.encoder.marshalDoc("", reflect.ValueOf(v))
        +	return nil
        +}
        +
        +// SetIndent changes the used indentation used when encoding.
        +func (e *Encoder) SetIndent(spaces int) {
        +	if spaces < 0 {
        +		panic("yaml: cannot indent to a negative number of spaces")
        +	}
        +	e.encoder.indent = spaces
        +}
        +
        +// Close closes the encoder by writing any remaining data.
        +// It does not write a stream terminating string "...".
        +func (e *Encoder) Close() (err error) {
        +	defer handleErr(&err)
        +	e.encoder.finish()
        +	return nil
        +}
        +
        +func handleErr(err *error) {
        +	if v := recover(); v != nil {
        +		if e, ok := v.(yamlError); ok {
        +			*err = e.err
        +		} else {
        +			panic(v)
        +		}
        +	}
        +}
        +
        +type yamlError struct {
        +	err error
        +}
        +
        +func fail(err error) {
        +	panic(yamlError{err})
        +}
        +
        +func failf(format string, args ...interface{}) {
        +	panic(yamlError{fmt.Errorf("yaml: "+format, args...)})
        +}
        +
        +// A TypeError is returned by Unmarshal when one or more fields in
        +// the YAML document cannot be properly decoded into the requested
        +// types. When this error is returned, the value is still
        +// unmarshaled partially.
        +type TypeError struct {
        +	Errors []string
        +}
        +
        +func (e *TypeError) Error() string {
        +	return fmt.Sprintf("yaml: unmarshal errors:\n  %s", strings.Join(e.Errors, "\n  "))
        +}
        +
        +type Kind uint32
        +
        +const (
        +	DocumentNode Kind = 1 << iota
        +	SequenceNode
        +	MappingNode
        +	ScalarNode
        +	AliasNode
        +)
        +
        +type Style uint32
        +
        +const (
        +	TaggedStyle Style = 1 << iota
        +	DoubleQuotedStyle
        +	SingleQuotedStyle
        +	LiteralStyle
        +	FoldedStyle
        +	FlowStyle
        +)
        +
        +// Node represents an element in the YAML document hierarchy. While documents
        +// are typically encoded and decoded into higher level types, such as structs
        +// and maps, Node is an intermediate representation that allows detailed
        +// control over the content being decoded or encoded.
        +//
        +// Values that make use of the Node type interact with the yaml package in the
        +// same way any other type would do, by encoding and decoding yaml data
        +// directly or indirectly into them.
        +//
        +// For example:
        +//
        +//     var person struct {
        +//             Name    string
        +//             Address yaml.Node
        +//     }
        +//     err := yaml.Unmarshal(data, &person)
        +// 
        +// Or by itself:
        +//
        +//     var person Node
        +//     err := yaml.Unmarshal(data, &person)
        +//
        +type Node struct {
        +	// Kind defines whether the node is a document, a mapping, a sequence,
        +	// a scalar value, or an alias to another node. The specific data type of
        +	// scalar nodes may be obtained via the ShortTag and LongTag methods.
        +	Kind  Kind
        +
        +	// Style allows customizing the apperance of the node in the tree.
        +	Style Style
        +
        +	// Tag holds the YAML tag defining the data type for the value.
        +	// When decoding, this field will always be set to the resolved tag,
        +	// even when it wasn't explicitly provided in the YAML content.
        +	// When encoding, if this field is unset the value type will be
        +	// implied from the node properties, and if it is set, it will only
        +	// be serialized into the representation if TaggedStyle is used or
        +	// the implicit tag diverges from the provided one.
        +	Tag string
        +
        +	// Value holds the unescaped and unquoted represenation of the value.
        +	Value string
        +
        +	// Anchor holds the anchor name for this node, which allows aliases to point to it.
        +	Anchor string
        +
        +	// Alias holds the node that this alias points to. Only valid when Kind is AliasNode.
        +	Alias *Node
        +
        +	// Content holds contained nodes for documents, mappings, and sequences.
        +	Content []*Node
        +
        +	// HeadComment holds any comments in the lines preceding the node and
        +	// not separated by an empty line.
        +	HeadComment string
        +
        +	// LineComment holds any comments at the end of the line where the node is in.
        +	LineComment string
        +
        +	// FootComment holds any comments following the node and before empty lines.
        +	FootComment string
        +
        +	// Line and Column hold the node position in the decoded YAML text.
        +	// These fields are not respected when encoding the node.
        +	Line   int
        +	Column int
        +}
        +
        +// LongTag returns the long form of the tag that indicates the data type for
        +// the node. If the Tag field isn't explicitly defined, one will be computed
        +// based on the node properties.
        +func (n *Node) LongTag() string {
        +	return longTag(n.ShortTag())
        +}
        +
        +// ShortTag returns the short form of the YAML tag that indicates data type for
        +// the node. If the Tag field isn't explicitly defined, one will be computed
        +// based on the node properties.
        +func (n *Node) ShortTag() string {
        +	if n.indicatedString() {
        +		return strTag
        +	}
        +	if n.Tag == "" || n.Tag == "!" {
        +		switch n.Kind {
        +		case MappingNode:
        +			return mapTag
        +		case SequenceNode:
        +			return seqTag
        +		case AliasNode:
        +			if n.Alias != nil {
        +				return n.Alias.ShortTag()
        +			}
        +		case ScalarNode:
        +			tag, _ := resolve("", n.Value)
        +			return tag
        +		}
        +		return ""
        +	}
        +	return shortTag(n.Tag)
        +}
        +
        +func (n *Node) indicatedString() bool {
        +	return n.Kind == ScalarNode &&
        +		(shortTag(n.Tag) == strTag ||
        +			(n.Tag == "" || n.Tag == "!") && n.Style&(SingleQuotedStyle|DoubleQuotedStyle|LiteralStyle|FoldedStyle) != 0)
        +}
        +
        +// SetString is a convenience function that sets the node to a string value
        +// and defines its style in a pleasant way depending on its content.
        +func (n *Node) SetString(s string) {
        +	n.Kind = ScalarNode
        +	if utf8.ValidString(s) {
        +		n.Value = s
        +		n.Tag = strTag
        +	} else {
        +		n.Value = encodeBase64(s)
        +		n.Tag = binaryTag
        +	}
        +	if strings.Contains(n.Value, "\n") {
        +		n.Style = LiteralStyle
        +	}
        +}
        +
        +// --------------------------------------------------------------------------
        +// Maintain a mapping of keys to structure field indexes
        +
        +// The code in this section was copied from mgo/bson.
        +
        +// structInfo holds details for the serialization of fields of
        +// a given struct.
        +type structInfo struct {
        +	FieldsMap  map[string]fieldInfo
        +	FieldsList []fieldInfo
        +
        +	// InlineMap is the number of the field in the struct that
        +	// contains an ,inline map, or -1 if there's none.
        +	InlineMap int
        +
        +	// InlineUnmarshalers holds indexes to inlined fields that
        +	// contain unmarshaler values.
        +	InlineUnmarshalers [][]int
        +}
        +
        +type fieldInfo struct {
        +	Key       string
        +	Num       int
        +	OmitEmpty bool
        +	Flow      bool
        +	// Id holds the unique field identifier, so we can cheaply
        +	// check for field duplicates without maintaining an extra map.
        +	Id int
        +
        +	// Inline holds the field index if the field is part of an inlined struct.
        +	Inline []int
        +}
        +
        +var structMap = make(map[reflect.Type]*structInfo)
        +var fieldMapMutex sync.RWMutex
        +var unmarshalerType reflect.Type
        +
        +func init() {
        +	var v Unmarshaler
        +	unmarshalerType = reflect.ValueOf(&v).Elem().Type()
        +}
        +
        +func getStructInfo(st reflect.Type) (*structInfo, error) {
        +	fieldMapMutex.RLock()
        +	sinfo, found := structMap[st]
        +	fieldMapMutex.RUnlock()
        +	if found {
        +		return sinfo, nil
        +	}
        +
        +	n := st.NumField()
        +	fieldsMap := make(map[string]fieldInfo)
        +	fieldsList := make([]fieldInfo, 0, n)
        +	inlineMap := -1
        +	inlineUnmarshalers := [][]int(nil)
        +	for i := 0; i != n; i++ {
        +		field := st.Field(i)
        +		if field.PkgPath != "" && !field.Anonymous {
        +			continue // Private field
        +		}
        +
        +		info := fieldInfo{Num: i}
        +
        +		tag := field.Tag.Get("yaml")
        +		if tag == "" && strings.Index(string(field.Tag), ":") < 0 {
        +			tag = string(field.Tag)
        +		}
        +		if tag == "-" {
        +			continue
        +		}
        +
        +		inline := false
        +		fields := strings.Split(tag, ",")
        +		if len(fields) > 1 {
        +			for _, flag := range fields[1:] {
        +				switch flag {
        +				case "omitempty":
        +					info.OmitEmpty = true
        +				case "flow":
        +					info.Flow = true
        +				case "inline":
        +					inline = true
        +				default:
        +					return nil, errors.New(fmt.Sprintf("unsupported flag %q in tag %q of type %s", flag, tag, st))
        +				}
        +			}
        +			tag = fields[0]
        +		}
        +
        +		if inline {
        +			switch field.Type.Kind() {
        +			case reflect.Map:
        +				if inlineMap >= 0 {
        +					return nil, errors.New("multiple ,inline maps in struct " + st.String())
        +				}
        +				if field.Type.Key() != reflect.TypeOf("") {
        +					return nil, errors.New("option ,inline needs a map with string keys in struct " + st.String())
        +				}
        +				inlineMap = info.Num
        +			case reflect.Struct, reflect.Ptr:
        +				ftype := field.Type
        +				for ftype.Kind() == reflect.Ptr {
        +					ftype = ftype.Elem()
        +				}
        +				if ftype.Kind() != reflect.Struct {
        +					return nil, errors.New("option ,inline may only be used on a struct or map field")
        +				}
        +				if reflect.PtrTo(ftype).Implements(unmarshalerType) {
        +					inlineUnmarshalers = append(inlineUnmarshalers, []int{i})
        +				} else {
        +					sinfo, err := getStructInfo(ftype)
        +					if err != nil {
        +						return nil, err
        +					}
        +					for _, index := range sinfo.InlineUnmarshalers {
        +						inlineUnmarshalers = append(inlineUnmarshalers, append([]int{i}, index...))
        +					}
        +					for _, finfo := range sinfo.FieldsList {
        +						if _, found := fieldsMap[finfo.Key]; found {
        +							msg := "duplicated key '" + finfo.Key + "' in struct " + st.String()
        +							return nil, errors.New(msg)
        +						}
        +						if finfo.Inline == nil {
        +							finfo.Inline = []int{i, finfo.Num}
        +						} else {
        +							finfo.Inline = append([]int{i}, finfo.Inline...)
        +						}
        +						finfo.Id = len(fieldsList)
        +						fieldsMap[finfo.Key] = finfo
        +						fieldsList = append(fieldsList, finfo)
        +					}
        +				}
        +			default:
        +				return nil, errors.New("option ,inline may only be used on a struct or map field")
        +			}
        +			continue
        +		}
        +
        +		if tag != "" {
        +			info.Key = tag
        +		} else {
        +			info.Key = strings.ToLower(field.Name)
        +		}
        +
        +		if _, found = fieldsMap[info.Key]; found {
        +			msg := "duplicated key '" + info.Key + "' in struct " + st.String()
        +			return nil, errors.New(msg)
        +		}
        +
        +		info.Id = len(fieldsList)
        +		fieldsList = append(fieldsList, info)
        +		fieldsMap[info.Key] = info
        +	}
        +
        +	sinfo = &structInfo{
        +		FieldsMap:          fieldsMap,
        +		FieldsList:         fieldsList,
        +		InlineMap:          inlineMap,
        +		InlineUnmarshalers: inlineUnmarshalers,
        +	}
        +
        +	fieldMapMutex.Lock()
        +	structMap[st] = sinfo
        +	fieldMapMutex.Unlock()
        +	return sinfo, nil
        +}
        +
        +// IsZeroer is used to check whether an object is zero to
        +// determine whether it should be omitted when marshaling
        +// with the omitempty flag. One notable implementation
        +// is time.Time.
        +type IsZeroer interface {
        +	IsZero() bool
        +}
        +
        +func isZero(v reflect.Value) bool {
        +	kind := v.Kind()
        +	if z, ok := v.Interface().(IsZeroer); ok {
        +		if (kind == reflect.Ptr || kind == reflect.Interface) && v.IsNil() {
        +			return true
        +		}
        +		return z.IsZero()
        +	}
        +	switch kind {
        +	case reflect.String:
        +		return len(v.String()) == 0
        +	case reflect.Interface, reflect.Ptr:
        +		return v.IsNil()
        +	case reflect.Slice:
        +		return v.Len() == 0
        +	case reflect.Map:
        +		return v.Len() == 0
        +	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
        +		return v.Int() == 0
        +	case reflect.Float32, reflect.Float64:
        +		return v.Float() == 0
        +	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
        +		return v.Uint() == 0
        +	case reflect.Bool:
        +		return !v.Bool()
        +	case reflect.Struct:
        +		vt := v.Type()
        +		for i := v.NumField() - 1; i >= 0; i-- {
        +			if vt.Field(i).PkgPath != "" {
        +				continue // Private field
        +			}
        +			if !isZero(v.Field(i)) {
        +				return false
        +			}
        +		}
        +		return true
        +	}
        +	return false
        +}
        diff --git a/vendor/gopkg.in/yaml.v3/yamlh.go b/vendor/gopkg.in/yaml.v3/yamlh.go
        new file mode 100644
        index 000000000..2719cfbb0
        --- /dev/null
        +++ b/vendor/gopkg.in/yaml.v3/yamlh.go
        @@ -0,0 +1,805 @@
        +//
        +// Copyright (c) 2011-2019 Canonical Ltd
        +// Copyright (c) 2006-2010 Kirill Simonov
        +//
        +// Permission is hereby granted, free of charge, to any person obtaining a copy of
        +// this software and associated documentation files (the "Software"), to deal in
        +// the Software without restriction, including without limitation the rights to
        +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
        +// of the Software, and to permit persons to whom the Software is furnished to do
        +// so, subject to the following conditions:
        +//
        +// The above copyright notice and this permission notice shall be included in all
        +// copies or substantial portions of the Software.
        +//
        +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        +// SOFTWARE.
        +
        +package yaml
        +
        +import (
        +	"fmt"
        +	"io"
        +)
        +
        +// The version directive data.
        +type yaml_version_directive_t struct {
        +	major int8 // The major version number.
        +	minor int8 // The minor version number.
        +}
        +
        +// The tag directive data.
        +type yaml_tag_directive_t struct {
        +	handle []byte // The tag handle.
        +	prefix []byte // The tag prefix.
        +}
        +
        +type yaml_encoding_t int
        +
        +// The stream encoding.
        +const (
        +	// Let the parser choose the encoding.
        +	yaml_ANY_ENCODING yaml_encoding_t = iota
        +
        +	yaml_UTF8_ENCODING    // The default UTF-8 encoding.
        +	yaml_UTF16LE_ENCODING // The UTF-16-LE encoding with BOM.
        +	yaml_UTF16BE_ENCODING // The UTF-16-BE encoding with BOM.
        +)
        +
        +type yaml_break_t int
        +
        +// Line break types.
        +const (
        +	// Let the parser choose the break type.
        +	yaml_ANY_BREAK yaml_break_t = iota
        +
        +	yaml_CR_BREAK   // Use CR for line breaks (Mac style).
        +	yaml_LN_BREAK   // Use LN for line breaks (Unix style).
        +	yaml_CRLN_BREAK // Use CR LN for line breaks (DOS style).
        +)
        +
        +type yaml_error_type_t int
        +
        +// Many bad things could happen with the parser and emitter.
        +const (
        +	// No error is produced.
        +	yaml_NO_ERROR yaml_error_type_t = iota
        +
        +	yaml_MEMORY_ERROR   // Cannot allocate or reallocate a block of memory.
        +	yaml_READER_ERROR   // Cannot read or decode the input stream.
        +	yaml_SCANNER_ERROR  // Cannot scan the input stream.
        +	yaml_PARSER_ERROR   // Cannot parse the input stream.
        +	yaml_COMPOSER_ERROR // Cannot compose a YAML document.
        +	yaml_WRITER_ERROR   // Cannot write to the output stream.
        +	yaml_EMITTER_ERROR  // Cannot emit a YAML stream.
        +)
        +
        +// The pointer position.
        +type yaml_mark_t struct {
        +	index  int // The position index.
        +	line   int // The position line.
        +	column int // The position column.
        +}
        +
        +// Node Styles
        +
        +type yaml_style_t int8
        +
        +type yaml_scalar_style_t yaml_style_t
        +
        +// Scalar styles.
        +const (
        +	// Let the emitter choose the style.
        +	yaml_ANY_SCALAR_STYLE yaml_scalar_style_t = 0
        +
        +	yaml_PLAIN_SCALAR_STYLE         yaml_scalar_style_t = 1 << iota // The plain scalar style.
        +	yaml_SINGLE_QUOTED_SCALAR_STYLE                                 // The single-quoted scalar style.
        +	yaml_DOUBLE_QUOTED_SCALAR_STYLE                                 // The double-quoted scalar style.
        +	yaml_LITERAL_SCALAR_STYLE                                       // The literal scalar style.
        +	yaml_FOLDED_SCALAR_STYLE                                        // The folded scalar style.
        +)
        +
        +type yaml_sequence_style_t yaml_style_t
        +
        +// Sequence styles.
        +const (
        +	// Let the emitter choose the style.
        +	yaml_ANY_SEQUENCE_STYLE yaml_sequence_style_t = iota
        +
        +	yaml_BLOCK_SEQUENCE_STYLE // The block sequence style.
        +	yaml_FLOW_SEQUENCE_STYLE  // The flow sequence style.
        +)
        +
        +type yaml_mapping_style_t yaml_style_t
        +
        +// Mapping styles.
        +const (
        +	// Let the emitter choose the style.
        +	yaml_ANY_MAPPING_STYLE yaml_mapping_style_t = iota
        +
        +	yaml_BLOCK_MAPPING_STYLE // The block mapping style.
        +	yaml_FLOW_MAPPING_STYLE  // The flow mapping style.
        +)
        +
        +// Tokens
        +
        +type yaml_token_type_t int
        +
        +// Token types.
        +const (
        +	// An empty token.
        +	yaml_NO_TOKEN yaml_token_type_t = iota
        +
        +	yaml_STREAM_START_TOKEN // A STREAM-START token.
        +	yaml_STREAM_END_TOKEN   // A STREAM-END token.
        +
        +	yaml_VERSION_DIRECTIVE_TOKEN // A VERSION-DIRECTIVE token.
        +	yaml_TAG_DIRECTIVE_TOKEN     // A TAG-DIRECTIVE token.
        +	yaml_DOCUMENT_START_TOKEN    // A DOCUMENT-START token.
        +	yaml_DOCUMENT_END_TOKEN      // A DOCUMENT-END token.
        +
        +	yaml_BLOCK_SEQUENCE_START_TOKEN // A BLOCK-SEQUENCE-START token.
        +	yaml_BLOCK_MAPPING_START_TOKEN  // A BLOCK-SEQUENCE-END token.
        +	yaml_BLOCK_END_TOKEN            // A BLOCK-END token.
        +
        +	yaml_FLOW_SEQUENCE_START_TOKEN // A FLOW-SEQUENCE-START token.
        +	yaml_FLOW_SEQUENCE_END_TOKEN   // A FLOW-SEQUENCE-END token.
        +	yaml_FLOW_MAPPING_START_TOKEN  // A FLOW-MAPPING-START token.
        +	yaml_FLOW_MAPPING_END_TOKEN    // A FLOW-MAPPING-END token.
        +
        +	yaml_BLOCK_ENTRY_TOKEN // A BLOCK-ENTRY token.
        +	yaml_FLOW_ENTRY_TOKEN  // A FLOW-ENTRY token.
        +	yaml_KEY_TOKEN         // A KEY token.
        +	yaml_VALUE_TOKEN       // A VALUE token.
        +
        +	yaml_ALIAS_TOKEN  // An ALIAS token.
        +	yaml_ANCHOR_TOKEN // An ANCHOR token.
        +	yaml_TAG_TOKEN    // A TAG token.
        +	yaml_SCALAR_TOKEN // A SCALAR token.
        +)
        +
        +func (tt yaml_token_type_t) String() string {
        +	switch tt {
        +	case yaml_NO_TOKEN:
        +		return "yaml_NO_TOKEN"
        +	case yaml_STREAM_START_TOKEN:
        +		return "yaml_STREAM_START_TOKEN"
        +	case yaml_STREAM_END_TOKEN:
        +		return "yaml_STREAM_END_TOKEN"
        +	case yaml_VERSION_DIRECTIVE_TOKEN:
        +		return "yaml_VERSION_DIRECTIVE_TOKEN"
        +	case yaml_TAG_DIRECTIVE_TOKEN:
        +		return "yaml_TAG_DIRECTIVE_TOKEN"
        +	case yaml_DOCUMENT_START_TOKEN:
        +		return "yaml_DOCUMENT_START_TOKEN"
        +	case yaml_DOCUMENT_END_TOKEN:
        +		return "yaml_DOCUMENT_END_TOKEN"
        +	case yaml_BLOCK_SEQUENCE_START_TOKEN:
        +		return "yaml_BLOCK_SEQUENCE_START_TOKEN"
        +	case yaml_BLOCK_MAPPING_START_TOKEN:
        +		return "yaml_BLOCK_MAPPING_START_TOKEN"
        +	case yaml_BLOCK_END_TOKEN:
        +		return "yaml_BLOCK_END_TOKEN"
        +	case yaml_FLOW_SEQUENCE_START_TOKEN:
        +		return "yaml_FLOW_SEQUENCE_START_TOKEN"
        +	case yaml_FLOW_SEQUENCE_END_TOKEN:
        +		return "yaml_FLOW_SEQUENCE_END_TOKEN"
        +	case yaml_FLOW_MAPPING_START_TOKEN:
        +		return "yaml_FLOW_MAPPING_START_TOKEN"
        +	case yaml_FLOW_MAPPING_END_TOKEN:
        +		return "yaml_FLOW_MAPPING_END_TOKEN"
        +	case yaml_BLOCK_ENTRY_TOKEN:
        +		return "yaml_BLOCK_ENTRY_TOKEN"
        +	case yaml_FLOW_ENTRY_TOKEN:
        +		return "yaml_FLOW_ENTRY_TOKEN"
        +	case yaml_KEY_TOKEN:
        +		return "yaml_KEY_TOKEN"
        +	case yaml_VALUE_TOKEN:
        +		return "yaml_VALUE_TOKEN"
        +	case yaml_ALIAS_TOKEN:
        +		return "yaml_ALIAS_TOKEN"
        +	case yaml_ANCHOR_TOKEN:
        +		return "yaml_ANCHOR_TOKEN"
        +	case yaml_TAG_TOKEN:
        +		return "yaml_TAG_TOKEN"
        +	case yaml_SCALAR_TOKEN:
        +		return "yaml_SCALAR_TOKEN"
        +	}
        +	return ""
        +}
        +
        +// The token structure.
        +type yaml_token_t struct {
        +	// The token type.
        +	typ yaml_token_type_t
        +
        +	// The start/end of the token.
        +	start_mark, end_mark yaml_mark_t
        +
        +	// The stream encoding (for yaml_STREAM_START_TOKEN).
        +	encoding yaml_encoding_t
        +
        +	// The alias/anchor/scalar value or tag/tag directive handle
        +	// (for yaml_ALIAS_TOKEN, yaml_ANCHOR_TOKEN, yaml_SCALAR_TOKEN, yaml_TAG_TOKEN, yaml_TAG_DIRECTIVE_TOKEN).
        +	value []byte
        +
        +	// The tag suffix (for yaml_TAG_TOKEN).
        +	suffix []byte
        +
        +	// The tag directive prefix (for yaml_TAG_DIRECTIVE_TOKEN).
        +	prefix []byte
        +
        +	// The scalar style (for yaml_SCALAR_TOKEN).
        +	style yaml_scalar_style_t
        +
        +	// The version directive major/minor (for yaml_VERSION_DIRECTIVE_TOKEN).
        +	major, minor int8
        +}
        +
        +// Events
        +
        +type yaml_event_type_t int8
        +
        +// Event types.
        +const (
        +	// An empty event.
        +	yaml_NO_EVENT yaml_event_type_t = iota
        +
        +	yaml_STREAM_START_EVENT   // A STREAM-START event.
        +	yaml_STREAM_END_EVENT     // A STREAM-END event.
        +	yaml_DOCUMENT_START_EVENT // A DOCUMENT-START event.
        +	yaml_DOCUMENT_END_EVENT   // A DOCUMENT-END event.
        +	yaml_ALIAS_EVENT          // An ALIAS event.
        +	yaml_SCALAR_EVENT         // A SCALAR event.
        +	yaml_SEQUENCE_START_EVENT // A SEQUENCE-START event.
        +	yaml_SEQUENCE_END_EVENT   // A SEQUENCE-END event.
        +	yaml_MAPPING_START_EVENT  // A MAPPING-START event.
        +	yaml_MAPPING_END_EVENT    // A MAPPING-END event.
        +	yaml_TAIL_COMMENT_EVENT
        +)
        +
        +var eventStrings = []string{
        +	yaml_NO_EVENT:             "none",
        +	yaml_STREAM_START_EVENT:   "stream start",
        +	yaml_STREAM_END_EVENT:     "stream end",
        +	yaml_DOCUMENT_START_EVENT: "document start",
        +	yaml_DOCUMENT_END_EVENT:   "document end",
        +	yaml_ALIAS_EVENT:          "alias",
        +	yaml_SCALAR_EVENT:         "scalar",
        +	yaml_SEQUENCE_START_EVENT: "sequence start",
        +	yaml_SEQUENCE_END_EVENT:   "sequence end",
        +	yaml_MAPPING_START_EVENT:  "mapping start",
        +	yaml_MAPPING_END_EVENT:    "mapping end",
        +	yaml_TAIL_COMMENT_EVENT:   "tail comment",
        +}
        +
        +func (e yaml_event_type_t) String() string {
        +	if e < 0 || int(e) >= len(eventStrings) {
        +		return fmt.Sprintf("unknown event %d", e)
        +	}
        +	return eventStrings[e]
        +}
        +
        +// The event structure.
        +type yaml_event_t struct {
        +
        +	// The event type.
        +	typ yaml_event_type_t
        +
        +	// The start and end of the event.
        +	start_mark, end_mark yaml_mark_t
        +
        +	// The document encoding (for yaml_STREAM_START_EVENT).
        +	encoding yaml_encoding_t
        +
        +	// The version directive (for yaml_DOCUMENT_START_EVENT).
        +	version_directive *yaml_version_directive_t
        +
        +	// The list of tag directives (for yaml_DOCUMENT_START_EVENT).
        +	tag_directives []yaml_tag_directive_t
        +
        +	// The comments
        +	head_comment []byte
        +	line_comment []byte
        +	foot_comment []byte
        +	tail_comment []byte
        +
        +	// The anchor (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_ALIAS_EVENT).
        +	anchor []byte
        +
        +	// The tag (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT).
        +	tag []byte
        +
        +	// The scalar value (for yaml_SCALAR_EVENT).
        +	value []byte
        +
        +	// Is the document start/end indicator implicit, or the tag optional?
        +	// (for yaml_DOCUMENT_START_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_SCALAR_EVENT).
        +	implicit bool
        +
        +	// Is the tag optional for any non-plain style? (for yaml_SCALAR_EVENT).
        +	quoted_implicit bool
        +
        +	// The style (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT).
        +	style yaml_style_t
        +}
        +
        +func (e *yaml_event_t) scalar_style() yaml_scalar_style_t     { return yaml_scalar_style_t(e.style) }
        +func (e *yaml_event_t) sequence_style() yaml_sequence_style_t { return yaml_sequence_style_t(e.style) }
        +func (e *yaml_event_t) mapping_style() yaml_mapping_style_t   { return yaml_mapping_style_t(e.style) }
        +
        +// Nodes
        +
        +const (
        +	yaml_NULL_TAG      = "tag:yaml.org,2002:null"      // The tag !!null with the only possible value: null.
        +	yaml_BOOL_TAG      = "tag:yaml.org,2002:bool"      // The tag !!bool with the values: true and false.
        +	yaml_STR_TAG       = "tag:yaml.org,2002:str"       // The tag !!str for string values.
        +	yaml_INT_TAG       = "tag:yaml.org,2002:int"       // The tag !!int for integer values.
        +	yaml_FLOAT_TAG     = "tag:yaml.org,2002:float"     // The tag !!float for float values.
        +	yaml_TIMESTAMP_TAG = "tag:yaml.org,2002:timestamp" // The tag !!timestamp for date and time values.
        +
        +	yaml_SEQ_TAG = "tag:yaml.org,2002:seq" // The tag !!seq is used to denote sequences.
        +	yaml_MAP_TAG = "tag:yaml.org,2002:map" // The tag !!map is used to denote mapping.
        +
        +	// Not in original libyaml.
        +	yaml_BINARY_TAG = "tag:yaml.org,2002:binary"
        +	yaml_MERGE_TAG  = "tag:yaml.org,2002:merge"
        +
        +	yaml_DEFAULT_SCALAR_TAG   = yaml_STR_TAG // The default scalar tag is !!str.
        +	yaml_DEFAULT_SEQUENCE_TAG = yaml_SEQ_TAG // The default sequence tag is !!seq.
        +	yaml_DEFAULT_MAPPING_TAG  = yaml_MAP_TAG // The default mapping tag is !!map.
        +)
        +
        +type yaml_node_type_t int
        +
        +// Node types.
        +const (
        +	// An empty node.
        +	yaml_NO_NODE yaml_node_type_t = iota
        +
        +	yaml_SCALAR_NODE   // A scalar node.
        +	yaml_SEQUENCE_NODE // A sequence node.
        +	yaml_MAPPING_NODE  // A mapping node.
        +)
        +
        +// An element of a sequence node.
        +type yaml_node_item_t int
        +
        +// An element of a mapping node.
        +type yaml_node_pair_t struct {
        +	key   int // The key of the element.
        +	value int // The value of the element.
        +}
        +
        +// The node structure.
        +type yaml_node_t struct {
        +	typ yaml_node_type_t // The node type.
        +	tag []byte           // The node tag.
        +
        +	// The node data.
        +
        +	// The scalar parameters (for yaml_SCALAR_NODE).
        +	scalar struct {
        +		value  []byte              // The scalar value.
        +		length int                 // The length of the scalar value.
        +		style  yaml_scalar_style_t // The scalar style.
        +	}
        +
        +	// The sequence parameters (for YAML_SEQUENCE_NODE).
        +	sequence struct {
        +		items_data []yaml_node_item_t    // The stack of sequence items.
        +		style      yaml_sequence_style_t // The sequence style.
        +	}
        +
        +	// The mapping parameters (for yaml_MAPPING_NODE).
        +	mapping struct {
        +		pairs_data  []yaml_node_pair_t   // The stack of mapping pairs (key, value).
        +		pairs_start *yaml_node_pair_t    // The beginning of the stack.
        +		pairs_end   *yaml_node_pair_t    // The end of the stack.
        +		pairs_top   *yaml_node_pair_t    // The top of the stack.
        +		style       yaml_mapping_style_t // The mapping style.
        +	}
        +
        +	start_mark yaml_mark_t // The beginning of the node.
        +	end_mark   yaml_mark_t // The end of the node.
        +
        +}
        +
        +// The document structure.
        +type yaml_document_t struct {
        +
        +	// The document nodes.
        +	nodes []yaml_node_t
        +
        +	// The version directive.
        +	version_directive *yaml_version_directive_t
        +
        +	// The list of tag directives.
        +	tag_directives_data  []yaml_tag_directive_t
        +	tag_directives_start int // The beginning of the tag directives list.
        +	tag_directives_end   int // The end of the tag directives list.
        +
        +	start_implicit int // Is the document start indicator implicit?
        +	end_implicit   int // Is the document end indicator implicit?
        +
        +	// The start/end of the document.
        +	start_mark, end_mark yaml_mark_t
        +}
        +
        +// The prototype of a read handler.
        +//
        +// The read handler is called when the parser needs to read more bytes from the
        +// source. The handler should write not more than size bytes to the buffer.
        +// The number of written bytes should be set to the size_read variable.
        +//
        +// [in,out]   data        A pointer to an application data specified by
        +//                        yaml_parser_set_input().
        +// [out]      buffer      The buffer to write the data from the source.
        +// [in]       size        The size of the buffer.
        +// [out]      size_read   The actual number of bytes read from the source.
        +//
        +// On success, the handler should return 1.  If the handler failed,
        +// the returned value should be 0. On EOF, the handler should set the
        +// size_read to 0 and return 1.
        +type yaml_read_handler_t func(parser *yaml_parser_t, buffer []byte) (n int, err error)
        +
        +// This structure holds information about a potential simple key.
        +type yaml_simple_key_t struct {
        +	possible     bool        // Is a simple key possible?
        +	required     bool        // Is a simple key required?
        +	token_number int         // The number of the token.
        +	mark         yaml_mark_t // The position mark.
        +}
        +
        +// The states of the parser.
        +type yaml_parser_state_t int
        +
        +const (
        +	yaml_PARSE_STREAM_START_STATE yaml_parser_state_t = iota
        +
        +	yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE           // Expect the beginning of an implicit document.
        +	yaml_PARSE_DOCUMENT_START_STATE                    // Expect DOCUMENT-START.
        +	yaml_PARSE_DOCUMENT_CONTENT_STATE                  // Expect the content of a document.
        +	yaml_PARSE_DOCUMENT_END_STATE                      // Expect DOCUMENT-END.
        +	yaml_PARSE_BLOCK_NODE_STATE                        // Expect a block node.
        +	yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE // Expect a block node or indentless sequence.
        +	yaml_PARSE_FLOW_NODE_STATE                         // Expect a flow node.
        +	yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE        // Expect the first entry of a block sequence.
        +	yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE              // Expect an entry of a block sequence.
        +	yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE         // Expect an entry of an indentless sequence.
        +	yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE           // Expect the first key of a block mapping.
        +	yaml_PARSE_BLOCK_MAPPING_KEY_STATE                 // Expect a block mapping key.
        +	yaml_PARSE_BLOCK_MAPPING_VALUE_STATE               // Expect a block mapping value.
        +	yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE         // Expect the first entry of a flow sequence.
        +	yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE               // Expect an entry of a flow sequence.
        +	yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE   // Expect a key of an ordered mapping.
        +	yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE // Expect a value of an ordered mapping.
        +	yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE   // Expect the and of an ordered mapping entry.
        +	yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE            // Expect the first key of a flow mapping.
        +	yaml_PARSE_FLOW_MAPPING_KEY_STATE                  // Expect a key of a flow mapping.
        +	yaml_PARSE_FLOW_MAPPING_VALUE_STATE                // Expect a value of a flow mapping.
        +	yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE          // Expect an empty value of a flow mapping.
        +	yaml_PARSE_END_STATE                               // Expect nothing.
        +)
        +
        +func (ps yaml_parser_state_t) String() string {
        +	switch ps {
        +	case yaml_PARSE_STREAM_START_STATE:
        +		return "yaml_PARSE_STREAM_START_STATE"
        +	case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE:
        +		return "yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE"
        +	case yaml_PARSE_DOCUMENT_START_STATE:
        +		return "yaml_PARSE_DOCUMENT_START_STATE"
        +	case yaml_PARSE_DOCUMENT_CONTENT_STATE:
        +		return "yaml_PARSE_DOCUMENT_CONTENT_STATE"
        +	case yaml_PARSE_DOCUMENT_END_STATE:
        +		return "yaml_PARSE_DOCUMENT_END_STATE"
        +	case yaml_PARSE_BLOCK_NODE_STATE:
        +		return "yaml_PARSE_BLOCK_NODE_STATE"
        +	case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE:
        +		return "yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE"
        +	case yaml_PARSE_FLOW_NODE_STATE:
        +		return "yaml_PARSE_FLOW_NODE_STATE"
        +	case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE:
        +		return "yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE"
        +	case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE:
        +		return "yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE"
        +	case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE:
        +		return "yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE"
        +	case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE:
        +		return "yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE"
        +	case yaml_PARSE_BLOCK_MAPPING_KEY_STATE:
        +		return "yaml_PARSE_BLOCK_MAPPING_KEY_STATE"
        +	case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE:
        +		return "yaml_PARSE_BLOCK_MAPPING_VALUE_STATE"
        +	case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE:
        +		return "yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE"
        +	case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE:
        +		return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE"
        +	case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE:
        +		return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE"
        +	case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE:
        +		return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE"
        +	case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE:
        +		return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE"
        +	case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE:
        +		return "yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE"
        +	case yaml_PARSE_FLOW_MAPPING_KEY_STATE:
        +		return "yaml_PARSE_FLOW_MAPPING_KEY_STATE"
        +	case yaml_PARSE_FLOW_MAPPING_VALUE_STATE:
        +		return "yaml_PARSE_FLOW_MAPPING_VALUE_STATE"
        +	case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE:
        +		return "yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE"
        +	case yaml_PARSE_END_STATE:
        +		return "yaml_PARSE_END_STATE"
        +	}
        +	return ""
        +}
        +
        +// This structure holds aliases data.
        +type yaml_alias_data_t struct {
        +	anchor []byte      // The anchor.
        +	index  int         // The node id.
        +	mark   yaml_mark_t // The anchor mark.
        +}
        +
        +// The parser structure.
        +//
        +// All members are internal. Manage the structure using the
        +// yaml_parser_ family of functions.
        +type yaml_parser_t struct {
        +
        +	// Error handling
        +
        +	error yaml_error_type_t // Error type.
        +
        +	problem string // Error description.
        +
        +	// The byte about which the problem occurred.
        +	problem_offset int
        +	problem_value  int
        +	problem_mark   yaml_mark_t
        +
        +	// The error context.
        +	context      string
        +	context_mark yaml_mark_t
        +
        +	// Reader stuff
        +
        +	read_handler yaml_read_handler_t // Read handler.
        +
        +	input_reader io.Reader // File input data.
        +	input        []byte    // String input data.
        +	input_pos    int
        +
        +	eof bool // EOF flag
        +
        +	buffer     []byte // The working buffer.
        +	buffer_pos int    // The current position of the buffer.
        +
        +	unread int // The number of unread characters in the buffer.
        +
        +	newlines int // The number of line breaks since last non-break/non-blank character
        +
        +	raw_buffer     []byte // The raw buffer.
        +	raw_buffer_pos int    // The current position of the buffer.
        +
        +	encoding yaml_encoding_t // The input encoding.
        +
        +	offset int         // The offset of the current position (in bytes).
        +	mark   yaml_mark_t // The mark of the current position.
        +
        +	// Comments
        +
        +	head_comment []byte // The current head comments
        +	line_comment []byte // The current line comments
        +	foot_comment []byte // The current foot comments
        +	tail_comment []byte // Foot comment that happens at the end of a block.
        +	stem_comment []byte // Comment in item preceding a nested structure (list inside list item, etc)
        +
        +	comments      []yaml_comment_t // The folded comments for all parsed tokens
        +	comments_head int
        +
        +	// Scanner stuff
        +
        +	stream_start_produced bool // Have we started to scan the input stream?
        +	stream_end_produced   bool // Have we reached the end of the input stream?
        +
        +	flow_level int // The number of unclosed '[' and '{' indicators.
        +
        +	tokens          []yaml_token_t // The tokens queue.
        +	tokens_head     int            // The head of the tokens queue.
        +	tokens_parsed   int            // The number of tokens fetched from the queue.
        +	token_available bool           // Does the tokens queue contain a token ready for dequeueing.
        +
        +	indent  int   // The current indentation level.
        +	indents []int // The indentation levels stack.
        +
        +	simple_key_allowed bool                // May a simple key occur at the current position?
        +	simple_keys        []yaml_simple_key_t // The stack of simple keys.
        +	simple_keys_by_tok map[int]int         // possible simple_key indexes indexed by token_number
        +
        +	// Parser stuff
        +
        +	state          yaml_parser_state_t    // The current parser state.
        +	states         []yaml_parser_state_t  // The parser states stack.
        +	marks          []yaml_mark_t          // The stack of marks.
        +	tag_directives []yaml_tag_directive_t // The list of TAG directives.
        +
        +	// Dumper stuff
        +
        +	aliases []yaml_alias_data_t // The alias data.
        +
        +	document *yaml_document_t // The currently parsed document.
        +}
        +
        +type yaml_comment_t struct {
        +
        +	scan_mark  yaml_mark_t // Position where scanning for comments started
        +	token_mark yaml_mark_t // Position after which tokens will be associated with this comment
        +	start_mark yaml_mark_t // Position of '#' comment mark
        +	end_mark   yaml_mark_t // Position where comment terminated
        +
        +	head []byte
        +	line []byte
        +	foot []byte
        +}
        +
        +// Emitter Definitions
        +
        +// The prototype of a write handler.
        +//
        +// The write handler is called when the emitter needs to flush the accumulated
        +// characters to the output.  The handler should write @a size bytes of the
        +// @a buffer to the output.
        +//
        +// @param[in,out]   data        A pointer to an application data specified by
        +//                              yaml_emitter_set_output().
        +// @param[in]       buffer      The buffer with bytes to be written.
        +// @param[in]       size        The size of the buffer.
        +//
        +// @returns On success, the handler should return @c 1.  If the handler failed,
        +// the returned value should be @c 0.
        +//
        +type yaml_write_handler_t func(emitter *yaml_emitter_t, buffer []byte) error
        +
        +type yaml_emitter_state_t int
        +
        +// The emitter states.
        +const (
        +	// Expect STREAM-START.
        +	yaml_EMIT_STREAM_START_STATE yaml_emitter_state_t = iota
        +
        +	yaml_EMIT_FIRST_DOCUMENT_START_STATE       // Expect the first DOCUMENT-START or STREAM-END.
        +	yaml_EMIT_DOCUMENT_START_STATE             // Expect DOCUMENT-START or STREAM-END.
        +	yaml_EMIT_DOCUMENT_CONTENT_STATE           // Expect the content of a document.
        +	yaml_EMIT_DOCUMENT_END_STATE               // Expect DOCUMENT-END.
        +	yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE   // Expect the first item of a flow sequence.
        +	yaml_EMIT_FLOW_SEQUENCE_TRAIL_ITEM_STATE   // Expect the next item of a flow sequence, with the comma already written out
        +	yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE         // Expect an item of a flow sequence.
        +	yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE     // Expect the first key of a flow mapping.
        +	yaml_EMIT_FLOW_MAPPING_TRAIL_KEY_STATE     // Expect the next key of a flow mapping, with the comma already written out
        +	yaml_EMIT_FLOW_MAPPING_KEY_STATE           // Expect a key of a flow mapping.
        +	yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE  // Expect a value for a simple key of a flow mapping.
        +	yaml_EMIT_FLOW_MAPPING_VALUE_STATE         // Expect a value of a flow mapping.
        +	yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE  // Expect the first item of a block sequence.
        +	yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE        // Expect an item of a block sequence.
        +	yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE    // Expect the first key of a block mapping.
        +	yaml_EMIT_BLOCK_MAPPING_KEY_STATE          // Expect the key of a block mapping.
        +	yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a block mapping.
        +	yaml_EMIT_BLOCK_MAPPING_VALUE_STATE        // Expect a value of a block mapping.
        +	yaml_EMIT_END_STATE                        // Expect nothing.
        +)
        +
        +// The emitter structure.
        +//
        +// All members are internal.  Manage the structure using the @c yaml_emitter_
        +// family of functions.
        +type yaml_emitter_t struct {
        +
        +	// Error handling
        +
        +	error   yaml_error_type_t // Error type.
        +	problem string            // Error description.
        +
        +	// Writer stuff
        +
        +	write_handler yaml_write_handler_t // Write handler.
        +
        +	output_buffer *[]byte   // String output data.
        +	output_writer io.Writer // File output data.
        +
        +	buffer     []byte // The working buffer.
        +	buffer_pos int    // The current position of the buffer.
        +
        +	raw_buffer     []byte // The raw buffer.
        +	raw_buffer_pos int    // The current position of the buffer.
        +
        +	encoding yaml_encoding_t // The stream encoding.
        +
        +	// Emitter stuff
        +
        +	canonical   bool         // If the output is in the canonical style?
        +	best_indent int          // The number of indentation spaces.
        +	best_width  int          // The preferred width of the output lines.
        +	unicode     bool         // Allow unescaped non-ASCII characters?
        +	line_break  yaml_break_t // The preferred line break.
        +
        +	state  yaml_emitter_state_t   // The current emitter state.
        +	states []yaml_emitter_state_t // The stack of states.
        +
        +	events      []yaml_event_t // The event queue.
        +	events_head int            // The head of the event queue.
        +
        +	indents []int // The stack of indentation levels.
        +
        +	tag_directives []yaml_tag_directive_t // The list of tag directives.
        +
        +	indent int // The current indentation level.
        +
        +	flow_level int // The current flow level.
        +
        +	root_context       bool // Is it the document root context?
        +	sequence_context   bool // Is it a sequence context?
        +	mapping_context    bool // Is it a mapping context?
        +	simple_key_context bool // Is it a simple mapping key context?
        +
        +	line       int  // The current line.
        +	column     int  // The current column.
        +	whitespace bool // If the last character was a whitespace?
        +	indention  bool // If the last character was an indentation character (' ', '-', '?', ':')?
        +	open_ended bool // If an explicit document end is required?
        +
        +	space_above bool // Is there's an empty line above?
        +	foot_indent int  // The indent used to write the foot comment above, or -1 if none.
        +
        +	// Anchor analysis.
        +	anchor_data struct {
        +		anchor []byte // The anchor value.
        +		alias  bool   // Is it an alias?
        +	}
        +
        +	// Tag analysis.
        +	tag_data struct {
        +		handle []byte // The tag handle.
        +		suffix []byte // The tag suffix.
        +	}
        +
        +	// Scalar analysis.
        +	scalar_data struct {
        +		value                 []byte              // The scalar value.
        +		multiline             bool                // Does the scalar contain line breaks?
        +		flow_plain_allowed    bool                // Can the scalar be expessed in the flow plain style?
        +		block_plain_allowed   bool                // Can the scalar be expressed in the block plain style?
        +		single_quoted_allowed bool                // Can the scalar be expressed in the single quoted style?
        +		block_allowed         bool                // Can the scalar be expressed in the literal or folded styles?
        +		style                 yaml_scalar_style_t // The output style.
        +	}
        +
        +	// Comments
        +	head_comment []byte
        +	line_comment []byte
        +	foot_comment []byte
        +	tail_comment []byte
        +
        +	// Dumper stuff
        +
        +	opened bool // If the stream was already opened?
        +	closed bool // If the stream was already closed?
        +
        +	// The information associated with the document nodes.
        +	anchors *struct {
        +		references int  // The number of references.
        +		anchor     int  // The anchor id.
        +		serialized bool // If the node has been emitted?
        +	}
        +
        +	last_anchor_id int // The last assigned anchor id.
        +
        +	document *yaml_document_t // The currently emitted document.
        +}
        diff --git a/vendor/gopkg.in/yaml.v3/yamlprivateh.go b/vendor/gopkg.in/yaml.v3/yamlprivateh.go
        new file mode 100644
        index 000000000..e88f9c54a
        --- /dev/null
        +++ b/vendor/gopkg.in/yaml.v3/yamlprivateh.go
        @@ -0,0 +1,198 @@
        +// 
        +// Copyright (c) 2011-2019 Canonical Ltd
        +// Copyright (c) 2006-2010 Kirill Simonov
        +// 
        +// Permission is hereby granted, free of charge, to any person obtaining a copy of
        +// this software and associated documentation files (the "Software"), to deal in
        +// the Software without restriction, including without limitation the rights to
        +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
        +// of the Software, and to permit persons to whom the Software is furnished to do
        +// so, subject to the following conditions:
        +// 
        +// The above copyright notice and this permission notice shall be included in all
        +// copies or substantial portions of the Software.
        +// 
        +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        +// SOFTWARE.
        +
        +package yaml
        +
        +const (
        +	// The size of the input raw buffer.
        +	input_raw_buffer_size = 512
        +
        +	// The size of the input buffer.
        +	// It should be possible to decode the whole raw buffer.
        +	input_buffer_size = input_raw_buffer_size * 3
        +
        +	// The size of the output buffer.
        +	output_buffer_size = 128
        +
        +	// The size of the output raw buffer.
        +	// It should be possible to encode the whole output buffer.
        +	output_raw_buffer_size = (output_buffer_size*2 + 2)
        +
        +	// The size of other stacks and queues.
        +	initial_stack_size  = 16
        +	initial_queue_size  = 16
        +	initial_string_size = 16
        +)
        +
        +// Check if the character at the specified position is an alphabetical
        +// character, a digit, '_', or '-'.
        +func is_alpha(b []byte, i int) bool {
        +	return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'Z' || b[i] >= 'a' && b[i] <= 'z' || b[i] == '_' || b[i] == '-'
        +}
        +
        +// Check if the character at the specified position is a digit.
        +func is_digit(b []byte, i int) bool {
        +	return b[i] >= '0' && b[i] <= '9'
        +}
        +
        +// Get the value of a digit.
        +func as_digit(b []byte, i int) int {
        +	return int(b[i]) - '0'
        +}
        +
        +// Check if the character at the specified position is a hex-digit.
        +func is_hex(b []byte, i int) bool {
        +	return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'F' || b[i] >= 'a' && b[i] <= 'f'
        +}
        +
        +// Get the value of a hex-digit.
        +func as_hex(b []byte, i int) int {
        +	bi := b[i]
        +	if bi >= 'A' && bi <= 'F' {
        +		return int(bi) - 'A' + 10
        +	}
        +	if bi >= 'a' && bi <= 'f' {
        +		return int(bi) - 'a' + 10
        +	}
        +	return int(bi) - '0'
        +}
        +
        +// Check if the character is ASCII.
        +func is_ascii(b []byte, i int) bool {
        +	return b[i] <= 0x7F
        +}
        +
        +// Check if the character at the start of the buffer can be printed unescaped.
        +func is_printable(b []byte, i int) bool {
        +	return ((b[i] == 0x0A) || // . == #x0A
        +		(b[i] >= 0x20 && b[i] <= 0x7E) || // #x20 <= . <= #x7E
        +		(b[i] == 0xC2 && b[i+1] >= 0xA0) || // #0xA0 <= . <= #xD7FF
        +		(b[i] > 0xC2 && b[i] < 0xED) ||
        +		(b[i] == 0xED && b[i+1] < 0xA0) ||
        +		(b[i] == 0xEE) ||
        +		(b[i] == 0xEF && // #xE000 <= . <= #xFFFD
        +			!(b[i+1] == 0xBB && b[i+2] == 0xBF) && // && . != #xFEFF
        +			!(b[i+1] == 0xBF && (b[i+2] == 0xBE || b[i+2] == 0xBF))))
        +}
        +
        +// Check if the character at the specified position is NUL.
        +func is_z(b []byte, i int) bool {
        +	return b[i] == 0x00
        +}
        +
        +// Check if the beginning of the buffer is a BOM.
        +func is_bom(b []byte, i int) bool {
        +	return b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF
        +}
        +
        +// Check if the character at the specified position is space.
        +func is_space(b []byte, i int) bool {
        +	return b[i] == ' '
        +}
        +
        +// Check if the character at the specified position is tab.
        +func is_tab(b []byte, i int) bool {
        +	return b[i] == '\t'
        +}
        +
        +// Check if the character at the specified position is blank (space or tab).
        +func is_blank(b []byte, i int) bool {
        +	//return is_space(b, i) || is_tab(b, i)
        +	return b[i] == ' ' || b[i] == '\t'
        +}
        +
        +// Check if the character at the specified position is a line break.
        +func is_break(b []byte, i int) bool {
        +	return (b[i] == '\r' || // CR (#xD)
        +		b[i] == '\n' || // LF (#xA)
        +		b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
        +		b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
        +		b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9) // PS (#x2029)
        +}
        +
        +func is_crlf(b []byte, i int) bool {
        +	return b[i] == '\r' && b[i+1] == '\n'
        +}
        +
        +// Check if the character is a line break or NUL.
        +func is_breakz(b []byte, i int) bool {
        +	//return is_break(b, i) || is_z(b, i)
        +	return (
        +		// is_break:
        +		b[i] == '\r' || // CR (#xD)
        +		b[i] == '\n' || // LF (#xA)
        +		b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
        +		b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
        +		b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029)
        +		// is_z:
        +		b[i] == 0)
        +}
        +
        +// Check if the character is a line break, space, or NUL.
        +func is_spacez(b []byte, i int) bool {
        +	//return is_space(b, i) || is_breakz(b, i)
        +	return (
        +		// is_space:
        +		b[i] == ' ' ||
        +		// is_breakz:
        +		b[i] == '\r' || // CR (#xD)
        +		b[i] == '\n' || // LF (#xA)
        +		b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
        +		b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
        +		b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029)
        +		b[i] == 0)
        +}
        +
        +// Check if the character is a line break, space, tab, or NUL.
        +func is_blankz(b []byte, i int) bool {
        +	//return is_blank(b, i) || is_breakz(b, i)
        +	return (
        +		// is_blank:
        +		b[i] == ' ' || b[i] == '\t' ||
        +		// is_breakz:
        +		b[i] == '\r' || // CR (#xD)
        +		b[i] == '\n' || // LF (#xA)
        +		b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
        +		b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
        +		b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029)
        +		b[i] == 0)
        +}
        +
        +// Determine the width of the character.
        +func width(b byte) int {
        +	// Don't replace these by a switch without first
        +	// confirming that it is being inlined.
        +	if b&0x80 == 0x00 {
        +		return 1
        +	}
        +	if b&0xE0 == 0xC0 {
        +		return 2
        +	}
        +	if b&0xF0 == 0xE0 {
        +		return 3
        +	}
        +	if b&0xF8 == 0xF0 {
        +		return 4
        +	}
        +	return 0
        +
        +}
        diff --git a/vendor/honnef.co/go/tools/LICENSE b/vendor/honnef.co/go/tools/LICENSE
        deleted file mode 100644
        index dfd031454..000000000
        --- a/vendor/honnef.co/go/tools/LICENSE
        +++ /dev/null
        @@ -1,20 +0,0 @@
        -Copyright (c) 2016 Dominik Honnef
        -
        -Permission is hereby granted, free of charge, to any person obtaining
        -a copy of this software and associated documentation files (the
        -"Software"), to deal in the Software without restriction, including
        -without limitation the rights to use, copy, modify, merge, publish,
        -distribute, sublicense, and/or sell copies of the Software, and to
        -permit persons to whom the Software is furnished to do so, subject to
        -the following conditions:
        -
        -The above copyright notice and this permission notice shall be
        -included in all copies or substantial portions of the Software.
        -
        -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
        -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
        -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
        -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
        -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
        -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
        -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
        diff --git a/vendor/honnef.co/go/tools/LICENSE-THIRD-PARTY b/vendor/honnef.co/go/tools/LICENSE-THIRD-PARTY
        deleted file mode 100644
        index 7c241b71a..000000000
        --- a/vendor/honnef.co/go/tools/LICENSE-THIRD-PARTY
        +++ /dev/null
        @@ -1,226 +0,0 @@
        -Staticcheck and its related tools make use of third party projects,
        -either by reusing their code, or by statically linking them into
        -resulting binaries. These projects are:
        -
        -* The Go Programming Language - https://golang.org/
        -
        -    Copyright (c) 2009 The Go Authors. All rights reserved.
        -
        -    Redistribution and use in source and binary forms, with or without
        -    modification, are permitted provided that the following conditions are
        -    met:
        -
        -       * Redistributions of source code must retain the above copyright
        -    notice, this list of conditions and the following disclaimer.
        -       * Redistributions in binary form must reproduce the above
        -    copyright notice, this list of conditions and the following disclaimer
        -    in the documentation and/or other materials provided with the
        -    distribution.
        -       * Neither the name of Google Inc. nor the names of its
        -    contributors may be used to endorse or promote products derived from
        -    this software without specific prior written permission.
        -
        -    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
        -    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
        -    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
        -    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
        -    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
        -    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
        -    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
        -    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
        -    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        -    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
        -    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        -
        -
        -* github.com/BurntSushi/toml - https://github.com/BurntSushi/toml
        -
        -    The MIT License (MIT)
        -
        -    Copyright (c) 2013 TOML authors
        -
        -    Permission is hereby granted, free of charge, to any person obtaining a copy
        -    of this software and associated documentation files (the "Software"), to deal
        -    in the Software without restriction, including without limitation the rights
        -    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
        -    copies of the Software, and to permit persons to whom the Software is
        -    furnished to do so, subject to the following conditions:
        -
        -    The above copyright notice and this permission notice shall be included in
        -    all copies or substantial portions of the Software.
        -
        -    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        -    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        -    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        -    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        -    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        -    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
        -    THE SOFTWARE.
        -
        -
        -* github.com/google/renameio - https://github.com/google/renameio
        -
        -    Copyright 2018 Google Inc.
        -
        -    Licensed under the Apache License, Version 2.0 (the "License");
        -    you may not use this file except in compliance with the License.
        -    You may obtain a copy of the License at
        -
        -         http://www.apache.org/licenses/LICENSE-2.0
        -
        -    Unless required by applicable law or agreed to in writing, software
        -    distributed under the License is distributed on an "AS IS" BASIS,
        -    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        -    See the License for the specific language governing permissions and
        -    limitations under the License.
        -
        -
        -* github.com/kisielk/gotool – https://github.com/kisielk/gotool
        -
        -    Copyright (c) 2013 Kamil Kisiel 
        -
        -    Permission is hereby granted, free of charge, to any person obtaining
        -    a copy of this software and associated documentation files (the
        -    "Software"), to deal in the Software without restriction, including
        -    without limitation the rights to use, copy, modify, merge, publish,
        -    distribute, sublicense, and/or sell copies of the Software, and to
        -    permit persons to whom the Software is furnished to do so, subject to
        -    the following conditions:
        -
        -    The above copyright notice and this permission notice shall be
        -    included in all copies or substantial portions of the Software.
        -
        -    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
        -    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
        -    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
        -    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
        -    LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
        -    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
        -    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
        -
        -    All the files in this distribution are covered under either the MIT
        -    license (see the file LICENSE) except some files mentioned below.
        -
        -    match.go, match_test.go:
        -
        -        Copyright (c) 2009 The Go Authors. All rights reserved.
        -
        -        Redistribution and use in source and binary forms, with or without
        -        modification, are permitted provided that the following conditions are
        -        met:
        -
        -           * Redistributions of source code must retain the above copyright
        -        notice, this list of conditions and the following disclaimer.
        -           * Redistributions in binary form must reproduce the above
        -        copyright notice, this list of conditions and the following disclaimer
        -        in the documentation and/or other materials provided with the
        -        distribution.
        -           * Neither the name of Google Inc. nor the names of its
        -        contributors may be used to endorse or promote products derived from
        -        this software without specific prior written permission.
        -
        -        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
        -        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
        -        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
        -        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
        -        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
        -        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
        -        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
        -        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
        -        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        -        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
        -        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        -
        -
        -* github.com/rogpeppe/go-internal - https://github.com/rogpeppe/go-internal
        -
        -    Copyright (c) 2018 The Go Authors. All rights reserved.
        -
        -    Redistribution and use in source and binary forms, with or without
        -    modification, are permitted provided that the following conditions are
        -    met:
        -
        -       * Redistributions of source code must retain the above copyright
        -    notice, this list of conditions and the following disclaimer.
        -       * Redistributions in binary form must reproduce the above
        -    copyright notice, this list of conditions and the following disclaimer
        -    in the documentation and/or other materials provided with the
        -    distribution.
        -       * Neither the name of Google Inc. nor the names of its
        -    contributors may be used to endorse or promote products derived from
        -    this software without specific prior written permission.
        -
        -    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
        -    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
        -    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
        -    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
        -    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
        -    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
        -    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
        -    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
        -    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        -    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
        -    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        -
        -
        -* golang.org/x/mod/module - https://github.com/golang/mod
        -
        -    Copyright (c) 2009 The Go Authors. All rights reserved.
        -
        -    Redistribution and use in source and binary forms, with or without
        -    modification, are permitted provided that the following conditions are
        -    met:
        -
        -       * Redistributions of source code must retain the above copyright
        -    notice, this list of conditions and the following disclaimer.
        -       * Redistributions in binary form must reproduce the above
        -    copyright notice, this list of conditions and the following disclaimer
        -    in the documentation and/or other materials provided with the
        -    distribution.
        -       * Neither the name of Google Inc. nor the names of its
        -    contributors may be used to endorse or promote products derived from
        -    this software without specific prior written permission.
        -
        -    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
        -    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
        -    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
        -    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
        -    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
        -    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
        -    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
        -    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
        -    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        -    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
        -    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        -
        -
        -* golang.org/x/tools/go/analysis - https://github.com/golang/tools
        -
        -    Copyright (c) 2009 The Go Authors. All rights reserved.
        -
        -    Redistribution and use in source and binary forms, with or without
        -    modification, are permitted provided that the following conditions are
        -    met:
        -
        -       * Redistributions of source code must retain the above copyright
        -    notice, this list of conditions and the following disclaimer.
        -       * Redistributions in binary form must reproduce the above
        -    copyright notice, this list of conditions and the following disclaimer
        -    in the documentation and/or other materials provided with the
        -    distribution.
        -       * Neither the name of Google Inc. nor the names of its
        -    contributors may be used to endorse or promote products derived from
        -    this software without specific prior written permission.
        -
        -    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
        -    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
        -    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
        -    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
        -    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
        -    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
        -    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
        -    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
        -    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        -    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
        -    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        -
        diff --git a/vendor/honnef.co/go/tools/arg/arg.go b/vendor/honnef.co/go/tools/arg/arg.go
        deleted file mode 100644
        index 1e7f30db4..000000000
        --- a/vendor/honnef.co/go/tools/arg/arg.go
        +++ /dev/null
        @@ -1,48 +0,0 @@
        -package arg
        -
        -var args = map[string]int{
        -	"(*encoding/json.Decoder).Decode.v":    0,
        -	"(*encoding/json.Encoder).Encode.v":    0,
        -	"(*encoding/xml.Decoder).Decode.v":     0,
        -	"(*encoding/xml.Encoder).Encode.v":     0,
        -	"(*sync.Pool).Put.x":                   0,
        -	"(*text/template.Template).Parse.text": 0,
        -	"(io.Seeker).Seek.offset":              0,
        -	"(time.Time).Sub.u":                    0,
        -	"append.elems":                         1,
        -	"append.slice":                         0,
        -	"bytes.Equal.a":                        0,
        -	"bytes.Equal.b":                        1,
        -	"encoding/binary.Write.data":           2,
        -	"errors.New.text":                      0,
        -	"fmt.Fprintf.format":                   1,
        -	"fmt.Printf.format":                    0,
        -	"fmt.Sprintf.a[0]":                     1,
        -	"fmt.Sprintf.format":                   0,
        -	"json.Marshal.v":                       0,
        -	"json.Unmarshal.v":                     1,
        -	"len.v":                                0,
        -	"make.size[0]":                         1,
        -	"make.size[1]":                         2,
        -	"make.t":                               0,
        -	"net/url.Parse.rawurl":                 0,
        -	"os.OpenFile.flag":                     1,
        -	"os/exec.Command.name":                 0,
        -	"os/signal.Notify.c":                   0,
        -	"regexp.Compile.expr":                  0,
        -	"runtime.SetFinalizer.finalizer":       1,
        -	"runtime.SetFinalizer.obj":             0,
        -	"sort.Sort.data":                       0,
        -	"time.Parse.layout":                    0,
        -	"time.Sleep.d":                         0,
        -	"xml.Marshal.v":                        0,
        -	"xml.Unmarshal.v":                      1,
        -}
        -
        -func Arg(name string) int {
        -	n, ok := args[name]
        -	if !ok {
        -		panic("unknown argument " + name)
        -	}
        -	return n
        -}
        diff --git a/vendor/honnef.co/go/tools/config/config.go b/vendor/honnef.co/go/tools/config/config.go
        deleted file mode 100644
        index c22093a6d..000000000
        --- a/vendor/honnef.co/go/tools/config/config.go
        +++ /dev/null
        @@ -1,224 +0,0 @@
        -package config
        -
        -import (
        -	"bytes"
        -	"fmt"
        -	"os"
        -	"path/filepath"
        -	"reflect"
        -	"strings"
        -
        -	"github.com/BurntSushi/toml"
        -	"golang.org/x/tools/go/analysis"
        -)
        -
        -var Analyzer = &analysis.Analyzer{
        -	Name: "config",
        -	Doc:  "loads configuration for the current package tree",
        -	Run: func(pass *analysis.Pass) (interface{}, error) {
        -		if len(pass.Files) == 0 {
        -			cfg := DefaultConfig
        -			return &cfg, nil
        -		}
        -		cache, err := os.UserCacheDir()
        -		if err != nil {
        -			cache = ""
        -		}
        -		var path string
        -		for _, f := range pass.Files {
        -			p := pass.Fset.PositionFor(f.Pos(), true).Filename
        -			// FIXME(dh): using strings.HasPrefix isn't technically
        -			// correct, but it should be good enough for now.
        -			if cache != "" && strings.HasPrefix(p, cache) {
        -				// File in the build cache of the standard Go build system
        -				continue
        -			}
        -			path = p
        -			break
        -		}
        -
        -		if path == "" {
        -			// The package only consists of generated files.
        -			cfg := DefaultConfig
        -			return &cfg, nil
        -		}
        -
        -		dir := filepath.Dir(path)
        -		cfg, err := Load(dir)
        -		if err != nil {
        -			return nil, fmt.Errorf("error loading staticcheck.conf: %s", err)
        -		}
        -		return &cfg, nil
        -	},
        -	RunDespiteErrors: true,
        -	ResultType:       reflect.TypeOf((*Config)(nil)),
        -}
        -
        -func For(pass *analysis.Pass) *Config {
        -	return pass.ResultOf[Analyzer].(*Config)
        -}
        -
        -func mergeLists(a, b []string) []string {
        -	out := make([]string, 0, len(a)+len(b))
        -	for _, el := range b {
        -		if el == "inherit" {
        -			out = append(out, a...)
        -		} else {
        -			out = append(out, el)
        -		}
        -	}
        -
        -	return out
        -}
        -
        -func normalizeList(list []string) []string {
        -	if len(list) > 1 {
        -		nlist := make([]string, 0, len(list))
        -		nlist = append(nlist, list[0])
        -		for i, el := range list[1:] {
        -			if el != list[i] {
        -				nlist = append(nlist, el)
        -			}
        -		}
        -		list = nlist
        -	}
        -
        -	for _, el := range list {
        -		if el == "inherit" {
        -			// This should never happen, because the default config
        -			// should not use "inherit"
        -			panic(`unresolved "inherit"`)
        -		}
        -	}
        -
        -	return list
        -}
        -
        -func (cfg Config) Merge(ocfg Config) Config {
        -	if ocfg.Checks != nil {
        -		cfg.Checks = mergeLists(cfg.Checks, ocfg.Checks)
        -	}
        -	if ocfg.Initialisms != nil {
        -		cfg.Initialisms = mergeLists(cfg.Initialisms, ocfg.Initialisms)
        -	}
        -	if ocfg.DotImportWhitelist != nil {
        -		cfg.DotImportWhitelist = mergeLists(cfg.DotImportWhitelist, ocfg.DotImportWhitelist)
        -	}
        -	if ocfg.HTTPStatusCodeWhitelist != nil {
        -		cfg.HTTPStatusCodeWhitelist = mergeLists(cfg.HTTPStatusCodeWhitelist, ocfg.HTTPStatusCodeWhitelist)
        -	}
        -	return cfg
        -}
        -
        -type Config struct {
        -	// TODO(dh): this implementation makes it impossible for external
        -	// clients to add their own checkers with configuration. At the
        -	// moment, we don't really care about that; we don't encourage
        -	// that people use this package. In the future, we may. The
        -	// obvious solution would be using map[string]interface{}, but
        -	// that's obviously subpar.
        -
        -	Checks                  []string `toml:"checks"`
        -	Initialisms             []string `toml:"initialisms"`
        -	DotImportWhitelist      []string `toml:"dot_import_whitelist"`
        -	HTTPStatusCodeWhitelist []string `toml:"http_status_code_whitelist"`
        -}
        -
        -func (c Config) String() string {
        -	buf := &bytes.Buffer{}
        -
        -	fmt.Fprintf(buf, "Checks: %#v\n", c.Checks)
        -	fmt.Fprintf(buf, "Initialisms: %#v\n", c.Initialisms)
        -	fmt.Fprintf(buf, "DotImportWhitelist: %#v\n", c.DotImportWhitelist)
        -	fmt.Fprintf(buf, "HTTPStatusCodeWhitelist: %#v", c.HTTPStatusCodeWhitelist)
        -
        -	return buf.String()
        -}
        -
        -var DefaultConfig = Config{
        -	Checks: []string{"all", "-ST1000", "-ST1003", "-ST1016"},
        -	Initialisms: []string{
        -		"ACL", "API", "ASCII", "CPU", "CSS", "DNS",
        -		"EOF", "GUID", "HTML", "HTTP", "HTTPS", "ID",
        -		"IP", "JSON", "QPS", "RAM", "RPC", "SLA",
        -		"SMTP", "SQL", "SSH", "TCP", "TLS", "TTL",
        -		"UDP", "UI", "GID", "UID", "UUID", "URI",
        -		"URL", "UTF8", "VM", "XML", "XMPP", "XSRF",
        -		"XSS", "SIP", "RTP",
        -	},
        -	DotImportWhitelist:      []string{},
        -	HTTPStatusCodeWhitelist: []string{"200", "400", "404", "500"},
        -}
        -
        -const configName = "staticcheck.conf"
        -
        -func parseConfigs(dir string) ([]Config, error) {
        -	var out []Config
        -
        -	// TODO(dh): consider stopping at the GOPATH/module boundary
        -	for dir != "" {
        -		f, err := os.Open(filepath.Join(dir, configName))
        -		if os.IsNotExist(err) {
        -			ndir := filepath.Dir(dir)
        -			if ndir == dir {
        -				break
        -			}
        -			dir = ndir
        -			continue
        -		}
        -		if err != nil {
        -			return nil, err
        -		}
        -		var cfg Config
        -		_, err = toml.DecodeReader(f, &cfg)
        -		f.Close()
        -		if err != nil {
        -			return nil, err
        -		}
        -		out = append(out, cfg)
        -		ndir := filepath.Dir(dir)
        -		if ndir == dir {
        -			break
        -		}
        -		dir = ndir
        -	}
        -	out = append(out, DefaultConfig)
        -	if len(out) < 2 {
        -		return out, nil
        -	}
        -	for i := 0; i < len(out)/2; i++ {
        -		out[i], out[len(out)-1-i] = out[len(out)-1-i], out[i]
        -	}
        -	return out, nil
        -}
        -
        -func mergeConfigs(confs []Config) Config {
        -	if len(confs) == 0 {
        -		// This shouldn't happen because we always have at least a
        -		// default config.
        -		panic("trying to merge zero configs")
        -	}
        -	if len(confs) == 1 {
        -		return confs[0]
        -	}
        -	conf := confs[0]
        -	for _, oconf := range confs[1:] {
        -		conf = conf.Merge(oconf)
        -	}
        -	return conf
        -}
        -
        -func Load(dir string) (Config, error) {
        -	confs, err := parseConfigs(dir)
        -	if err != nil {
        -		return Config{}, err
        -	}
        -	conf := mergeConfigs(confs)
        -
        -	conf.Checks = normalizeList(conf.Checks)
        -	conf.Initialisms = normalizeList(conf.Initialisms)
        -	conf.DotImportWhitelist = normalizeList(conf.DotImportWhitelist)
        -	conf.HTTPStatusCodeWhitelist = normalizeList(conf.HTTPStatusCodeWhitelist)
        -
        -	return conf, nil
        -}
        diff --git a/vendor/honnef.co/go/tools/config/example.conf b/vendor/honnef.co/go/tools/config/example.conf
        deleted file mode 100644
        index a715a24d4..000000000
        --- a/vendor/honnef.co/go/tools/config/example.conf
        +++ /dev/null
        @@ -1,10 +0,0 @@
        -checks = ["all", "-ST1003", "-ST1014"]
        -initialisms = ["ACL", "API", "ASCII", "CPU", "CSS", "DNS",
        -	"EOF", "GUID", "HTML", "HTTP", "HTTPS", "ID",
        -	"IP", "JSON", "QPS", "RAM", "RPC", "SLA",
        -	"SMTP", "SQL", "SSH", "TCP", "TLS", "TTL",
        -	"UDP", "UI", "GID", "UID", "UUID", "URI",
        -	"URL", "UTF8", "VM", "XML", "XMPP", "XSRF",
        -	"XSS", "SIP", "RTP"]
        -dot_import_whitelist = []
        -http_status_code_whitelist = ["200", "400", "404", "500"]
        diff --git a/vendor/honnef.co/go/tools/deprecated/stdlib.go b/vendor/honnef.co/go/tools/deprecated/stdlib.go
        deleted file mode 100644
        index 5d8ce186b..000000000
        --- a/vendor/honnef.co/go/tools/deprecated/stdlib.go
        +++ /dev/null
        @@ -1,112 +0,0 @@
        -package deprecated
        -
        -type Deprecation struct {
        -	DeprecatedSince           int
        -	AlternativeAvailableSince int
        -}
        -
        -var Stdlib = map[string]Deprecation{
        -	"image/jpeg.Reader": {4, 0},
        -	// FIXME(dh): AllowBinary isn't being detected as deprecated
        -	// because the comment has a newline right after "Deprecated:"
        -	"go/build.AllowBinary":                        {7, 7},
        -	"(archive/zip.FileHeader).CompressedSize":     {1, 1},
        -	"(archive/zip.FileHeader).UncompressedSize":   {1, 1},
        -	"(archive/zip.FileHeader).ModifiedTime":       {10, 10},
        -	"(archive/zip.FileHeader).ModifiedDate":       {10, 10},
        -	"(*archive/zip.FileHeader).ModTime":           {10, 10},
        -	"(*archive/zip.FileHeader).SetModTime":        {10, 10},
        -	"(go/doc.Package).Bugs":                       {1, 1},
        -	"os.SEEK_SET":                                 {7, 7},
        -	"os.SEEK_CUR":                                 {7, 7},
        -	"os.SEEK_END":                                 {7, 7},
        -	"(net.Dialer).Cancel":                         {7, 7},
        -	"runtime.CPUProfile":                          {9, 0},
        -	"compress/flate.ReadError":                    {6, 6},
        -	"compress/flate.WriteError":                   {6, 6},
        -	"path/filepath.HasPrefix":                     {0, 0},
        -	"(net/http.Transport).Dial":                   {7, 7},
        -	"(*net/http.Transport).CancelRequest":         {6, 5},
        -	"net/http.ErrWriteAfterFlush":                 {7, 0},
        -	"net/http.ErrHeaderTooLong":                   {8, 0},
        -	"net/http.ErrShortBody":                       {8, 0},
        -	"net/http.ErrMissingContentLength":            {8, 0},
        -	"net/http/httputil.ErrPersistEOF":             {0, 0},
        -	"net/http/httputil.ErrClosed":                 {0, 0},
        -	"net/http/httputil.ErrPipeline":               {0, 0},
        -	"net/http/httputil.ServerConn":                {0, 0},
        -	"net/http/httputil.NewServerConn":             {0, 0},
        -	"net/http/httputil.ClientConn":                {0, 0},
        -	"net/http/httputil.NewClientConn":             {0, 0},
        -	"net/http/httputil.NewProxyClientConn":        {0, 0},
        -	"(net/http.Request).Cancel":                   {7, 7},
        -	"(text/template/parse.PipeNode).Line":         {1, 1},
        -	"(text/template/parse.ActionNode).Line":       {1, 1},
        -	"(text/template/parse.BranchNode).Line":       {1, 1},
        -	"(text/template/parse.TemplateNode).Line":     {1, 1},
        -	"database/sql/driver.ColumnConverter":         {9, 9},
        -	"database/sql/driver.Execer":                  {8, 8},
        -	"database/sql/driver.Queryer":                 {8, 8},
        -	"(database/sql/driver.Conn).Begin":            {8, 8},
        -	"(database/sql/driver.Stmt).Exec":             {8, 8},
        -	"(database/sql/driver.Stmt).Query":            {8, 8},
        -	"syscall.StringByteSlice":                     {1, 1},
        -	"syscall.StringBytePtr":                       {1, 1},
        -	"syscall.StringSlicePtr":                      {1, 1},
        -	"syscall.StringToUTF16":                       {1, 1},
        -	"syscall.StringToUTF16Ptr":                    {1, 1},
        -	"(*regexp.Regexp).Copy":                       {12, 12},
        -	"(archive/tar.Header).Xattrs":                 {10, 10},
        -	"archive/tar.TypeRegA":                        {11, 1},
        -	"go/types.NewInterface":                       {11, 11},
        -	"(*go/types.Interface).Embedded":              {11, 11},
        -	"go/importer.For":                             {12, 12},
        -	"encoding/json.InvalidUTF8Error":              {2, 2},
        -	"encoding/json.UnmarshalFieldError":           {2, 2},
        -	"encoding/csv.ErrTrailingComma":               {2, 2},
        -	"(encoding/csv.Reader).TrailingComma":         {2, 2},
        -	"(net.Dialer).DualStack":                      {12, 12},
        -	"net/http.ErrUnexpectedTrailer":               {12, 12},
        -	"net/http.CloseNotifier":                      {11, 7},
        -	"net/http.ProtocolError":                      {8, 8},
        -	"(crypto/x509.CertificateRequest).Attributes": {5, 3},
        -	// This function has no alternative, but also no purpose.
        -	"(*crypto/rc4.Cipher).Reset":                     {12, 0},
        -	"(net/http/httptest.ResponseRecorder).HeaderMap": {11, 7},
        -
        -	// All of these have been deprecated in favour of external libraries
        -	"syscall.AttachLsf":             {7, 0},
        -	"syscall.DetachLsf":             {7, 0},
        -	"syscall.LsfSocket":             {7, 0},
        -	"syscall.SetLsfPromisc":         {7, 0},
        -	"syscall.LsfJump":               {7, 0},
        -	"syscall.LsfStmt":               {7, 0},
        -	"syscall.BpfStmt":               {7, 0},
        -	"syscall.BpfJump":               {7, 0},
        -	"syscall.BpfBuflen":             {7, 0},
        -	"syscall.SetBpfBuflen":          {7, 0},
        -	"syscall.BpfDatalink":           {7, 0},
        -	"syscall.SetBpfDatalink":        {7, 0},
        -	"syscall.SetBpfPromisc":         {7, 0},
        -	"syscall.FlushBpf":              {7, 0},
        -	"syscall.BpfInterface":          {7, 0},
        -	"syscall.SetBpfInterface":       {7, 0},
        -	"syscall.BpfTimeout":            {7, 0},
        -	"syscall.SetBpfTimeout":         {7, 0},
        -	"syscall.BpfStats":              {7, 0},
        -	"syscall.SetBpfImmediate":       {7, 0},
        -	"syscall.SetBpf":                {7, 0},
        -	"syscall.CheckBpfVersion":       {7, 0},
        -	"syscall.BpfHeadercmpl":         {7, 0},
        -	"syscall.SetBpfHeadercmpl":      {7, 0},
        -	"syscall.RouteRIB":              {8, 0},
        -	"syscall.RoutingMessage":        {8, 0},
        -	"syscall.RouteMessage":          {8, 0},
        -	"syscall.InterfaceMessage":      {8, 0},
        -	"syscall.InterfaceAddrMessage":  {8, 0},
        -	"syscall.ParseRoutingMessage":   {8, 0},
        -	"syscall.ParseRoutingSockaddr":  {8, 0},
        -	"InterfaceAnnounceMessage":      {7, 0},
        -	"InterfaceMulticastAddrMessage": {7, 0},
        -	"syscall.FormatMessage":         {5, 0},
        -}
        diff --git a/vendor/honnef.co/go/tools/facts/deprecated.go b/vendor/honnef.co/go/tools/facts/deprecated.go
        deleted file mode 100644
        index 8587b0e0e..000000000
        --- a/vendor/honnef.co/go/tools/facts/deprecated.go
        +++ /dev/null
        @@ -1,144 +0,0 @@
        -package facts
        -
        -import (
        -	"go/ast"
        -	"go/token"
        -	"go/types"
        -	"reflect"
        -	"strings"
        -
        -	"golang.org/x/tools/go/analysis"
        -)
        -
        -type IsDeprecated struct{ Msg string }
        -
        -func (*IsDeprecated) AFact()           {}
        -func (d *IsDeprecated) String() string { return "Deprecated: " + d.Msg }
        -
        -type DeprecatedResult struct {
        -	Objects  map[types.Object]*IsDeprecated
        -	Packages map[*types.Package]*IsDeprecated
        -}
        -
        -var Deprecated = &analysis.Analyzer{
        -	Name:       "fact_deprecated",
        -	Doc:        "Mark deprecated objects",
        -	Run:        deprecated,
        -	FactTypes:  []analysis.Fact{(*IsDeprecated)(nil)},
        -	ResultType: reflect.TypeOf(DeprecatedResult{}),
        -}
        -
        -func deprecated(pass *analysis.Pass) (interface{}, error) {
        -	var names []*ast.Ident
        -
        -	extractDeprecatedMessage := func(docs []*ast.CommentGroup) string {
        -		for _, doc := range docs {
        -			if doc == nil {
        -				continue
        -			}
        -			parts := strings.Split(doc.Text(), "\n\n")
        -			last := parts[len(parts)-1]
        -			if !strings.HasPrefix(last, "Deprecated: ") {
        -				continue
        -			}
        -			alt := last[len("Deprecated: "):]
        -			alt = strings.Replace(alt, "\n", " ", -1)
        -			return alt
        -		}
        -		return ""
        -	}
        -	doDocs := func(names []*ast.Ident, docs []*ast.CommentGroup) {
        -		alt := extractDeprecatedMessage(docs)
        -		if alt == "" {
        -			return
        -		}
        -
        -		for _, name := range names {
        -			obj := pass.TypesInfo.ObjectOf(name)
        -			pass.ExportObjectFact(obj, &IsDeprecated{alt})
        -		}
        -	}
        -
        -	var docs []*ast.CommentGroup
        -	for _, f := range pass.Files {
        -		docs = append(docs, f.Doc)
        -	}
        -	if alt := extractDeprecatedMessage(docs); alt != "" {
        -		// Don't mark package syscall as deprecated, even though
        -		// it is. A lot of people still use it for simple
        -		// constants like SIGKILL, and I am not comfortable
        -		// telling them to use x/sys for that.
        -		if pass.Pkg.Path() != "syscall" {
        -			pass.ExportPackageFact(&IsDeprecated{alt})
        -		}
        -	}
        -
        -	docs = docs[:0]
        -	for _, f := range pass.Files {
        -		fn := func(node ast.Node) bool {
        -			if node == nil {
        -				return true
        -			}
        -			var ret bool
        -			switch node := node.(type) {
        -			case *ast.GenDecl:
        -				switch node.Tok {
        -				case token.TYPE, token.CONST, token.VAR:
        -					docs = append(docs, node.Doc)
        -					return true
        -				default:
        -					return false
        -				}
        -			case *ast.FuncDecl:
        -				docs = append(docs, node.Doc)
        -				names = []*ast.Ident{node.Name}
        -				ret = false
        -			case *ast.TypeSpec:
        -				docs = append(docs, node.Doc)
        -				names = []*ast.Ident{node.Name}
        -				ret = true
        -			case *ast.ValueSpec:
        -				docs = append(docs, node.Doc)
        -				names = node.Names
        -				ret = false
        -			case *ast.File:
        -				return true
        -			case *ast.StructType:
        -				for _, field := range node.Fields.List {
        -					doDocs(field.Names, []*ast.CommentGroup{field.Doc})
        -				}
        -				return false
        -			case *ast.InterfaceType:
        -				for _, field := range node.Methods.List {
        -					doDocs(field.Names, []*ast.CommentGroup{field.Doc})
        -				}
        -				return false
        -			default:
        -				return false
        -			}
        -			if len(names) == 0 || len(docs) == 0 {
        -				return ret
        -			}
        -			doDocs(names, docs)
        -
        -			docs = docs[:0]
        -			names = nil
        -			return ret
        -		}
        -		ast.Inspect(f, fn)
        -	}
        -
        -	out := DeprecatedResult{
        -		Objects:  map[types.Object]*IsDeprecated{},
        -		Packages: map[*types.Package]*IsDeprecated{},
        -	}
        -
        -	for _, fact := range pass.AllObjectFacts() {
        -		out.Objects[fact.Object] = fact.Fact.(*IsDeprecated)
        -	}
        -	for _, fact := range pass.AllPackageFacts() {
        -		out.Packages[fact.Package] = fact.Fact.(*IsDeprecated)
        -	}
        -
        -	return out, nil
        -}
        diff --git a/vendor/honnef.co/go/tools/facts/generated.go b/vendor/honnef.co/go/tools/facts/generated.go
        deleted file mode 100644
        index 1ed9563a3..000000000
        --- a/vendor/honnef.co/go/tools/facts/generated.go
        +++ /dev/null
        @@ -1,86 +0,0 @@
        -package facts
        -
        -import (
        -	"bufio"
        -	"bytes"
        -	"io"
        -	"os"
        -	"reflect"
        -	"strings"
        -
        -	"golang.org/x/tools/go/analysis"
        -)
        -
        -type Generator int
        -
        -// A list of known generators we can detect
        -const (
        -	Unknown Generator = iota
        -	Goyacc
        -	Cgo
        -	Stringer
        -)
        -
        -var (
        -	// used by cgo before Go 1.11
        -	oldCgo = []byte("// Created by cgo - DO NOT EDIT")
        -	prefix = []byte("// Code generated ")
        -	suffix = []byte(" DO NOT EDIT.")
        -	nl     = []byte("\n")
        -	crnl   = []byte("\r\n")
        -)
        -
        -func isGenerated(path string) (Generator, bool) {
        -	f, err := os.Open(path)
        -	if err != nil {
        -		return 0, false
        -	}
        -	defer f.Close()
        -	br := bufio.NewReader(f)
        -	for {
        -		s, err := br.ReadBytes('\n')
        -		if err != nil && err != io.EOF {
        -			return 0, false
        -		}
        -		s = bytes.TrimSuffix(s, crnl)
        -		s = bytes.TrimSuffix(s, nl)
        -		if bytes.HasPrefix(s, prefix) && bytes.HasSuffix(s, suffix) {
        -			text := string(s[len(prefix) : len(s)-len(suffix)])
        -			switch text {
        -			case "by goyacc.":
        -				return Goyacc, true
        -			case "by cmd/cgo;":
        -				return Cgo, true
        -			}
        -			if strings.HasPrefix(text, `by "stringer `) {
        -				return Stringer, true
        -			}
        -			return Unknown, true
        -		}
        -		if bytes.Equal(s, oldCgo) {
        -			return Cgo, true
        -		}
        -		if err == io.EOF {
        -			break
        -		}
        -	}
        -	return 0, false
        -}
        -
        -var Generated = &analysis.Analyzer{
        -	Name: "isgenerated",
        -	Doc:  "annotate file names that have been code generated",
        -	Run: func(pass *analysis.Pass) (interface{}, error) {
        -		m := map[string]Generator{}
        -		for _, f := range pass.Files {
        -			path := pass.Fset.PositionFor(f.Pos(), false).Filename
        -			g, ok := isGenerated(path)
        -			if ok {
        -				m[path] = g
        -			}
        -		}
        -		return m, nil
        -	},
        -	RunDespiteErrors: true,
        -	ResultType:       reflect.TypeOf(map[string]Generator{}),
        -}
        diff --git a/vendor/honnef.co/go/tools/facts/purity.go b/vendor/honnef.co/go/tools/facts/purity.go
        deleted file mode 100644
        index 861ca4110..000000000
        --- a/vendor/honnef.co/go/tools/facts/purity.go
        +++ /dev/null
        @@ -1,175 +0,0 @@
        -package facts
        -
        -import (
        -	"go/token"
        -	"go/types"
        -	"reflect"
        -
        -	"golang.org/x/tools/go/analysis"
        -	"honnef.co/go/tools/functions"
        -	"honnef.co/go/tools/internal/passes/buildssa"
        -	"honnef.co/go/tools/ssa"
        -)
        -
        -type IsPure struct{}
        -
        -func (*IsPure) AFact()           {}
        -func (d *IsPure) String() string { return "is pure" }
        -
        -type PurityResult map[*types.Func]*IsPure
        -
        -var Purity = &analysis.Analyzer{
        -	Name:       "fact_purity",
        -	Doc:        "Mark pure functions",
        -	Run:        purity,
        -	Requires:   []*analysis.Analyzer{buildssa.Analyzer},
        -	FactTypes:  []analysis.Fact{(*IsPure)(nil)},
        -	ResultType: reflect.TypeOf(PurityResult{}),
        -}
        -
        -var pureStdlib = map[string]struct{}{
        -	"errors.New":                      {},
        -	"fmt.Errorf":                      {},
        -	"fmt.Sprintf":                     {},
        -	"fmt.Sprint":                      {},
        -	"sort.Reverse":                    {},
        -	"strings.Map":                     {},
        -	"strings.Repeat":                  {},
        -	"strings.Replace":                 {},
        -	"strings.Title":                   {},
        -	"strings.ToLower":                 {},
        -	"strings.ToLowerSpecial":          {},
        -	"strings.ToTitle":                 {},
        -	"strings.ToTitleSpecial":          {},
        -	"strings.ToUpper":                 {},
        -	"strings.ToUpperSpecial":          {},
        -	"strings.Trim":                    {},
        -	"strings.TrimFunc":                {},
        -	"strings.TrimLeft":                {},
        -	"strings.TrimLeftFunc":            {},
        -	"strings.TrimPrefix":              {},
        -	"strings.TrimRight":               {},
        -	"strings.TrimRightFunc":           {},
        -	"strings.TrimSpace":               {},
        -	"strings.TrimSuffix":              {},
        -	"(*net/http.Request).WithContext": {},
        -}
        -
        -func purity(pass *analysis.Pass) (interface{}, error) {
        -	seen := map[*ssa.Function]struct{}{}
        -	ssapkg := pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).Pkg
        -	var check func(ssafn *ssa.Function) (ret bool)
        -	check = func(ssafn *ssa.Function) (ret bool) {
        -		if ssafn.Object() == nil {
        -			// TODO(dh): support closures
        -			return false
        -		}
        -		if pass.ImportObjectFact(ssafn.Object(), new(IsPure)) {
        -			return true
        -		}
        -		if ssafn.Pkg != ssapkg {
        -			// Function is in another package but wasn't marked as
        -			// pure, ergo it isn't pure
        -			return false
        -		}
        -		// Break recursion
        -		if _, ok := seen[ssafn]; ok {
        -			return false
        -		}
        -
        -		seen[ssafn] = struct{}{}
        -		defer func() {
        -			if ret {
        -				pass.ExportObjectFact(ssafn.Object(), &IsPure{})
        -			}
        -		}()
        -
        -		if functions.IsStub(ssafn) {
        -			return false
        -		}
        -
        -		if _, ok := pureStdlib[ssafn.Object().(*types.Func).FullName()]; ok {
        -			return true
        -		}
        -
        -		if ssafn.Signature.Results().Len() == 0 {
        -			// A function with no return values is empty or is doing some
        -			// work we cannot see (for example because of build tags);
        -			// don't consider it pure.
        -			return false
        -		}
        -
        -		for _, param := range ssafn.Params {
        -			if _, ok := param.Type().Underlying().(*types.Basic); !ok {
        -				return false
        -			}
        -		}
        -
        -		if ssafn.Blocks == nil {
        -			return false
        -		}
        -		checkCall := func(common *ssa.CallCommon) bool {
        -			if common.IsInvoke() {
        -				return false
        -			}
        -			builtin, ok := common.Value.(*ssa.Builtin)
        -			if !ok {
        -				if common.StaticCallee() != ssafn {
        -					if common.StaticCallee() == nil {
        -						return false
        -					}
        -					if !check(common.StaticCallee()) {
        -						return false
        -					}
        -				}
        -			} else {
        -				switch builtin.Name() {
        -				case "len", "cap", "make", "new":
        -				default:
        -					return false
        -				}
        -			}
        -			return true
        -		}
        -		for _, b := range ssafn.Blocks {
        -			for _, ins := range b.Instrs {
        -				switch ins := ins.(type) {
        -				case *ssa.Call:
        -					if !checkCall(ins.Common()) {
        -						return false
        -					}
        -				case *ssa.Defer:
        -					if !checkCall(&ins.Call) {
        -						return false
        -					}
        -				case *ssa.Select:
        -					return false
        -				case *ssa.Send:
        -					return false
        -				case *ssa.Go:
        -					return false
        -				case *ssa.Panic:
        -					return false
        -				case *ssa.Store:
        -					return false
        -				case *ssa.FieldAddr:
        -					return false
        -				case *ssa.UnOp:
        -					if ins.Op == token.MUL || ins.Op == token.AND {
        -						return false
        -					}
        -				}
        -			}
        -		}
        -		return true
        -	}
        -	for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		check(ssafn)
        -	}
        -
        -	out := PurityResult{}
        -	for _, fact := range pass.AllObjectFacts() {
        -		out[fact.Object.(*types.Func)] = fact.Fact.(*IsPure)
        -	}
        -	return out, nil
        -}
        diff --git a/vendor/honnef.co/go/tools/facts/token.go b/vendor/honnef.co/go/tools/facts/token.go
        deleted file mode 100644
        index 26e76ff73..000000000
        --- a/vendor/honnef.co/go/tools/facts/token.go
        +++ /dev/null
        @@ -1,24 +0,0 @@
        -package facts
        -
        -import (
        -	"go/ast"
        -	"go/token"
        -	"reflect"
        -
        -	"golang.org/x/tools/go/analysis"
        -)
        -
        -var TokenFile = &analysis.Analyzer{
        -	Name: "tokenfileanalyzer",
        -	Doc:  "creates a mapping of *token.File to *ast.File",
        -	Run: func(pass *analysis.Pass) (interface{}, error) {
        -		m := map[*token.File]*ast.File{}
        -		for _, af := range pass.Files {
        -			tf := pass.Fset.File(af.Pos())
        -			m[tf] = af
        -		}
        -		return m, nil
        -	},
        -	RunDespiteErrors: true,
        -	ResultType:       reflect.TypeOf(map[*token.File]*ast.File{}),
        -}
        diff --git a/vendor/honnef.co/go/tools/functions/loops.go b/vendor/honnef.co/go/tools/functions/loops.go
        deleted file mode 100644
        index 15877a2f9..000000000
        --- a/vendor/honnef.co/go/tools/functions/loops.go
        +++ /dev/null
        @@ -1,54 +0,0 @@
        -package functions
        -
        -import "honnef.co/go/tools/ssa"
        -
        -type Loop struct{ ssa.BlockSet }
        -
        -func FindLoops(fn *ssa.Function) []Loop {
        -	if fn.Blocks == nil {
        -		return nil
        -	}
        -	tree := fn.DomPreorder()
        -	var sets []Loop
        -	for _, h := range tree {
        -		for _, n := range h.Preds {
        -			if !h.Dominates(n) {
        -				continue
        -			}
        -			// n is a back-edge to h
        -			// h is the loop header
        -			if n == h {
        -				set := Loop{}
        -				set.Add(n)
        -				sets = append(sets, set)
        -				continue
        -			}
        -			set := Loop{}
        -			set.Add(h)
        -			set.Add(n)
        -			for _, b := range allPredsBut(n, h, nil) {
        -				set.Add(b)
        -			}
        -			sets = append(sets, set)
        -		}
        -	}
        -	return sets
        -}
        -
        -func allPredsBut(b, but *ssa.BasicBlock, list []*ssa.BasicBlock) []*ssa.BasicBlock {
        -outer:
        -	for _, pred := range b.Preds {
        -		if pred == but {
        -			continue
        -		}
        -		for _, p := range list {
        -			// TODO improve big-o complexity of this function
        -			if pred == p {
        -				continue outer
        -			}
        -		}
        -		list = append(list, pred)
        -		list = allPredsBut(pred, but, list)
        -	}
        -	return list
        -}
        diff --git a/vendor/honnef.co/go/tools/functions/pure.go b/vendor/honnef.co/go/tools/functions/pure.go
        deleted file mode 100644
        index 8bc558771..000000000
        --- a/vendor/honnef.co/go/tools/functions/pure.go
        +++ /dev/null
        @@ -1,46 +0,0 @@
        -package functions
        -
        -import (
        -	"honnef.co/go/tools/ssa"
        -)
        -
        -func filterDebug(instr []ssa.Instruction) []ssa.Instruction {
        -	var out []ssa.Instruction
        -	for _, ins := range instr {
        -		if _, ok := ins.(*ssa.DebugRef); !ok {
        -			out = append(out, ins)
        -		}
        -	}
        -	return out
        -}
        -
        -// IsStub reports whether a function is a stub. A function is
        -// considered a stub if it has no instructions or exactly one
        -// instruction, which must be either returning only constant values or
        -// a panic.
        -func IsStub(fn *ssa.Function) bool {
        -	if len(fn.Blocks) == 0 {
        -		return true
        -	}
        -	if len(fn.Blocks) > 1 {
        -		return false
        -	}
        -	instrs := filterDebug(fn.Blocks[0].Instrs)
        -	if len(instrs) != 1 {
        -		return false
        -	}
        -
        -	switch instrs[0].(type) {
        -	case *ssa.Return:
        -		// Since this is the only instruction, the return value must
        -		// be a constant. We consider all constants as stubs, not just
        -		// the zero value. This does not, unfortunately, cover zero
        -		// initialised structs, as these cause additional
        -		// instructions.
        -		return true
        -	case *ssa.Panic:
        -		return true
        -	default:
        -		return false
        -	}
        -}
        diff --git a/vendor/honnef.co/go/tools/functions/terminates.go b/vendor/honnef.co/go/tools/functions/terminates.go
        deleted file mode 100644
        index 3e9c3a23f..000000000
        --- a/vendor/honnef.co/go/tools/functions/terminates.go
        +++ /dev/null
        @@ -1,24 +0,0 @@
        -package functions
        -
        -import "honnef.co/go/tools/ssa"
        -
        -// Terminates reports whether fn is supposed to return, that is if it
        -// has at least one theoretic path that returns from the function.
        -// Explicit panics do not count as terminating.
        -func Terminates(fn *ssa.Function) bool {
        -	if fn.Blocks == nil {
        -		// assuming that a function terminates is the conservative
        -		// choice
        -		return true
        -	}
        -
        -	for _, block := range fn.Blocks {
        -		if len(block.Instrs) == 0 {
        -			continue
        -		}
        -		if _, ok := block.Instrs[len(block.Instrs)-1].(*ssa.Return); ok {
        -			return true
        -		}
        -	}
        -	return false
        -}
        diff --git a/vendor/honnef.co/go/tools/gcsizes/LICENSE b/vendor/honnef.co/go/tools/gcsizes/LICENSE
        deleted file mode 100644
        index 6a66aea5e..000000000
        --- a/vendor/honnef.co/go/tools/gcsizes/LICENSE
        +++ /dev/null
        @@ -1,27 +0,0 @@
        -Copyright (c) 2009 The Go Authors. All rights reserved.
        -
        -Redistribution and use in source and binary forms, with or without
        -modification, are permitted provided that the following conditions are
        -met:
        -
        -   * Redistributions of source code must retain the above copyright
        -notice, this list of conditions and the following disclaimer.
        -   * Redistributions in binary form must reproduce the above
        -copyright notice, this list of conditions and the following disclaimer
        -in the documentation and/or other materials provided with the
        -distribution.
        -   * Neither the name of Google Inc. nor the names of its
        -contributors may be used to endorse or promote products derived from
        -this software without specific prior written permission.
        -
        -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
        -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
        -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
        -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
        -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
        -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
        -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
        -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
        -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
        -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        diff --git a/vendor/honnef.co/go/tools/internal/cache/cache.go b/vendor/honnef.co/go/tools/internal/cache/cache.go
        deleted file mode 100644
        index 2b33ca106..000000000
        --- a/vendor/honnef.co/go/tools/internal/cache/cache.go
        +++ /dev/null
        @@ -1,474 +0,0 @@
        -// Copyright 2017 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -// Package cache implements a build artifact cache.
        -//
        -// This package is a slightly modified fork of Go's
        -// cmd/go/internal/cache package.
        -package cache
        -
        -import (
        -	"bytes"
        -	"crypto/sha256"
        -	"encoding/hex"
        -	"errors"
        -	"fmt"
        -	"io"
        -	"io/ioutil"
        -	"os"
        -	"path/filepath"
        -	"strconv"
        -	"strings"
        -	"time"
        -
        -	"honnef.co/go/tools/internal/renameio"
        -)
        -
        -// An ActionID is a cache action key, the hash of a complete description of a
        -// repeatable computation (command line, environment variables,
        -// input file contents, executable contents).
        -type ActionID [HashSize]byte
        -
        -// An OutputID is a cache output key, the hash of an output of a computation.
        -type OutputID [HashSize]byte
        -
        -// A Cache is a package cache, backed by a file system directory tree.
        -type Cache struct {
        -	dir string
        -	now func() time.Time
        -}
        -
        -// Open opens and returns the cache in the given directory.
        -//
        -// It is safe for multiple processes on a single machine to use the
        -// same cache directory in a local file system simultaneously.
        -// They will coordinate using operating system file locks and may
        -// duplicate effort but will not corrupt the cache.
        -//
        -// However, it is NOT safe for multiple processes on different machines
        -// to share a cache directory (for example, if the directory were stored
        -// in a network file system). File locking is notoriously unreliable in
        -// network file systems and may not suffice to protect the cache.
        -//
        -func Open(dir string) (*Cache, error) {
        -	info, err := os.Stat(dir)
        -	if err != nil {
        -		return nil, err
        -	}
        -	if !info.IsDir() {
        -		return nil, &os.PathError{Op: "open", Path: dir, Err: fmt.Errorf("not a directory")}
        -	}
        -	for i := 0; i < 256; i++ {
        -		name := filepath.Join(dir, fmt.Sprintf("%02x", i))
        -		if err := os.MkdirAll(name, 0777); err != nil {
        -			return nil, err
        -		}
        -	}
        -	c := &Cache{
        -		dir: dir,
        -		now: time.Now,
        -	}
        -	return c, nil
        -}
        -
        -// fileName returns the name of the file corresponding to the given id.
        -func (c *Cache) fileName(id [HashSize]byte, key string) string {
        -	return filepath.Join(c.dir, fmt.Sprintf("%02x", id[0]), fmt.Sprintf("%x", id)+"-"+key)
        -}
        -
        -var errMissing = errors.New("cache entry not found")
        -
        -const (
        -	// action entry file is "v1    \n"
        -	hexSize   = HashSize * 2
        -	entrySize = 2 + 1 + hexSize + 1 + hexSize + 1 + 20 + 1 + 20 + 1
        -)
        -
        -// verify controls whether to run the cache in verify mode.
        -// In verify mode, the cache always returns errMissing from Get
        -// but then double-checks in Put that the data being written
        -// exactly matches any existing entry. This provides an easy
        -// way to detect program behavior that would have been different
        -// had the cache entry been returned from Get.
        -//
        -// verify is enabled by setting the environment variable
        -// GODEBUG=gocacheverify=1.
        -var verify = false
        -
        -// DebugTest is set when GODEBUG=gocachetest=1 is in the environment.
        -var DebugTest = false
        -
        -func init() { initEnv() }
        -
        -func initEnv() {
        -	verify = false
        -	debugHash = false
        -	debug := strings.Split(os.Getenv("GODEBUG"), ",")
        -	for _, f := range debug {
        -		if f == "gocacheverify=1" {
        -			verify = true
        -		}
        -		if f == "gocachehash=1" {
        -			debugHash = true
        -		}
        -		if f == "gocachetest=1" {
        -			DebugTest = true
        -		}
        -	}
        -}
        -
        -// Get looks up the action ID in the cache,
        -// returning the corresponding output ID and file size, if any.
        -// Note that finding an output ID does not guarantee that the
        -// saved file for that output ID is still available.
        -func (c *Cache) Get(id ActionID) (Entry, error) {
        -	if verify {
        -		return Entry{}, errMissing
        -	}
        -	return c.get(id)
        -}
        -
        -type Entry struct {
        -	OutputID OutputID
        -	Size     int64
        -	Time     time.Time
        -}
        -
        -// get is Get but does not respect verify mode, so that Put can use it.
        -func (c *Cache) get(id ActionID) (Entry, error) {
        -	missing := func() (Entry, error) {
        -		return Entry{}, errMissing
        -	}
        -	f, err := os.Open(c.fileName(id, "a"))
        -	if err != nil {
        -		return missing()
        -	}
        -	defer f.Close()
        -	entry := make([]byte, entrySize+1) // +1 to detect whether f is too long
        -	if n, err := io.ReadFull(f, entry); n != entrySize || err != io.ErrUnexpectedEOF {
        -		return missing()
        -	}
        -	if entry[0] != 'v' || entry[1] != '1' || entry[2] != ' ' || entry[3+hexSize] != ' ' || entry[3+hexSize+1+hexSize] != ' ' || entry[3+hexSize+1+hexSize+1+20] != ' ' || entry[entrySize-1] != '\n' {
        -		return missing()
        -	}
        -	eid, entry := entry[3:3+hexSize], entry[3+hexSize:]
        -	eout, entry := entry[1:1+hexSize], entry[1+hexSize:]
        -	esize, entry := entry[1:1+20], entry[1+20:]
        -	//lint:ignore SA4006 See https://github.com/dominikh/go-tools/issues/465
        -	etime, entry := entry[1:1+20], entry[1+20:]
        -	var buf [HashSize]byte
        -	if _, err := hex.Decode(buf[:], eid); err != nil || buf != id {
        -		return missing()
        -	}
        -	if _, err := hex.Decode(buf[:], eout); err != nil {
        -		return missing()
        -	}
        -	i := 0
        -	for i < len(esize) && esize[i] == ' ' {
        -		i++
        -	}
        -	size, err := strconv.ParseInt(string(esize[i:]), 10, 64)
        -	if err != nil || size < 0 {
        -		return missing()
        -	}
        -	i = 0
        -	for i < len(etime) && etime[i] == ' ' {
        -		i++
        -	}
        -	tm, err := strconv.ParseInt(string(etime[i:]), 10, 64)
        -	if err != nil || size < 0 {
        -		return missing()
        -	}
        -
        -	c.used(c.fileName(id, "a"))
        -
        -	return Entry{buf, size, time.Unix(0, tm)}, nil
        -}
        -
        -// GetFile looks up the action ID in the cache and returns
        -// the name of the corresponding data file.
        -func (c *Cache) GetFile(id ActionID) (file string, entry Entry, err error) {
        -	entry, err = c.Get(id)
        -	if err != nil {
        -		return "", Entry{}, err
        -	}
        -	file = c.OutputFile(entry.OutputID)
        -	info, err := os.Stat(file)
        -	if err != nil || info.Size() != entry.Size {
        -		return "", Entry{}, errMissing
        -	}
        -	return file, entry, nil
        -}
        -
        -// GetBytes looks up the action ID in the cache and returns
        -// the corresponding output bytes.
        -// GetBytes should only be used for data that can be expected to fit in memory.
        -func (c *Cache) GetBytes(id ActionID) ([]byte, Entry, error) {
        -	entry, err := c.Get(id)
        -	if err != nil {
        -		return nil, entry, err
        -	}
        -	data, _ := ioutil.ReadFile(c.OutputFile(entry.OutputID))
        -	if sha256.Sum256(data) != entry.OutputID {
        -		return nil, entry, errMissing
        -	}
        -	return data, entry, nil
        -}
        -
        -// OutputFile returns the name of the cache file storing output with the given OutputID.
        -func (c *Cache) OutputFile(out OutputID) string {
        -	file := c.fileName(out, "d")
        -	c.used(file)
        -	return file
        -}
        -
        -// Time constants for cache expiration.
        -//
        -// We set the mtime on a cache file on each use, but at most one per mtimeInterval (1 hour),
        -// to avoid causing many unnecessary inode updates. The mtimes therefore
        -// roughly reflect "time of last use" but may in fact be older by at most an hour.
        -//
        -// We scan the cache for entries to delete at most once per trimInterval (1 day).
        -//
        -// When we do scan the cache, we delete entries that have not been used for
        -// at least trimLimit (5 days). Statistics gathered from a month of usage by
        -// Go developers found that essentially all reuse of cached entries happened
        -// within 5 days of the previous reuse. See golang.org/issue/22990.
        -const (
        -	mtimeInterval = 1 * time.Hour
        -	trimInterval  = 24 * time.Hour
        -	trimLimit     = 5 * 24 * time.Hour
        -)
        -
        -// used makes a best-effort attempt to update mtime on file,
        -// so that mtime reflects cache access time.
        -//
        -// Because the reflection only needs to be approximate,
        -// and to reduce the amount of disk activity caused by using
        -// cache entries, used only updates the mtime if the current
        -// mtime is more than an hour old. This heuristic eliminates
        -// nearly all of the mtime updates that would otherwise happen,
        -// while still keeping the mtimes useful for cache trimming.
        -func (c *Cache) used(file string) {
        -	info, err := os.Stat(file)
        -	if err == nil && c.now().Sub(info.ModTime()) < mtimeInterval {
        -		return
        -	}
        -	os.Chtimes(file, c.now(), c.now())
        -}
        -
        -// Trim removes old cache entries that are likely not to be reused.
        -func (c *Cache) Trim() {
        -	now := c.now()
        -
        -	// We maintain in dir/trim.txt the time of the last completed cache trim.
        -	// If the cache has been trimmed recently enough, do nothing.
        -	// This is the common case.
        -	data, _ := ioutil.ReadFile(filepath.Join(c.dir, "trim.txt"))
        -	t, err := strconv.ParseInt(strings.TrimSpace(string(data)), 10, 64)
        -	if err == nil && now.Sub(time.Unix(t, 0)) < trimInterval {
        -		return
        -	}
        -
        -	// Trim each of the 256 subdirectories.
        -	// We subtract an additional mtimeInterval
        -	// to account for the imprecision of our "last used" mtimes.
        -	cutoff := now.Add(-trimLimit - mtimeInterval)
        -	for i := 0; i < 256; i++ {
        -		subdir := filepath.Join(c.dir, fmt.Sprintf("%02x", i))
        -		c.trimSubdir(subdir, cutoff)
        -	}
        -
        -	// Ignore errors from here: if we don't write the complete timestamp, the
        -	// cache will appear older than it is, and we'll trim it again next time.
        -	renameio.WriteFile(filepath.Join(c.dir, "trim.txt"), []byte(fmt.Sprintf("%d", now.Unix())))
        -}
        -
        -// trimSubdir trims a single cache subdirectory.
        -func (c *Cache) trimSubdir(subdir string, cutoff time.Time) {
        -	// Read all directory entries from subdir before removing
        -	// any files, in case removing files invalidates the file offset
        -	// in the directory scan. Also, ignore error from f.Readdirnames,
        -	// because we don't care about reporting the error and we still
        -	// want to process any entries found before the error.
        -	f, err := os.Open(subdir)
        -	if err != nil {
        -		return
        -	}
        -	names, _ := f.Readdirnames(-1)
        -	f.Close()
        -
        -	for _, name := range names {
        -		// Remove only cache entries (xxxx-a and xxxx-d).
        -		if !strings.HasSuffix(name, "-a") && !strings.HasSuffix(name, "-d") {
        -			continue
        -		}
        -		entry := filepath.Join(subdir, name)
        -		info, err := os.Stat(entry)
        -		if err == nil && info.ModTime().Before(cutoff) {
        -			os.Remove(entry)
        -		}
        -	}
        -}
        -
        -// putIndexEntry adds an entry to the cache recording that executing the action
        -// with the given id produces an output with the given output id (hash) and size.
        -func (c *Cache) putIndexEntry(id ActionID, out OutputID, size int64, allowVerify bool) error {
        -	// Note: We expect that for one reason or another it may happen
        -	// that repeating an action produces a different output hash
        -	// (for example, if the output contains a time stamp or temp dir name).
        -	// While not ideal, this is also not a correctness problem, so we
        -	// don't make a big deal about it. In particular, we leave the action
        -	// cache entries writable specifically so that they can be overwritten.
        -	//
        -	// Setting GODEBUG=gocacheverify=1 does make a big deal:
        -	// in verify mode we are double-checking that the cache entries
        -	// are entirely reproducible. As just noted, this may be unrealistic
        -	// in some cases but the check is also useful for shaking out real bugs.
        -	entry := []byte(fmt.Sprintf("v1 %x %x %20d %20d\n", id, out, size, time.Now().UnixNano()))
        -	if verify && allowVerify {
        -		old, err := c.get(id)
        -		if err == nil && (old.OutputID != out || old.Size != size) {
        -			// panic to show stack trace, so we can see what code is generating this cache entry.
        -			msg := fmt.Sprintf("go: internal cache error: cache verify failed: id=%x changed:<<<\n%s\n>>>\nold: %x %d\nnew: %x %d", id, reverseHash(id), out, size, old.OutputID, old.Size)
        -			panic(msg)
        -		}
        -	}
        -	file := c.fileName(id, "a")
        -	if err := ioutil.WriteFile(file, entry, 0666); err != nil {
        -		// TODO(bcmills): This Remove potentially races with another go command writing to file.
        -		// Can we eliminate it?
        -		os.Remove(file)
        -		return err
        -	}
        -	os.Chtimes(file, c.now(), c.now()) // mainly for tests
        -
        -	return nil
        -}
        -
        -// Put stores the given output in the cache as the output for the action ID.
        -// It may read file twice. The content of file must not change between the two passes.
        -func (c *Cache) Put(id ActionID, file io.ReadSeeker) (OutputID, int64, error) {
        -	return c.put(id, file, true)
        -}
        -
        -// PutNoVerify is like Put but disables the verify check
        -// when GODEBUG=goverifycache=1 is set.
        -// It is meant for data that is OK to cache but that we expect to vary slightly from run to run,
        -// like test output containing times and the like.
        -func (c *Cache) PutNoVerify(id ActionID, file io.ReadSeeker) (OutputID, int64, error) {
        -	return c.put(id, file, false)
        -}
        -
        -func (c *Cache) put(id ActionID, file io.ReadSeeker, allowVerify bool) (OutputID, int64, error) {
        -	// Compute output ID.
        -	h := sha256.New()
        -	if _, err := file.Seek(0, 0); err != nil {
        -		return OutputID{}, 0, err
        -	}
        -	size, err := io.Copy(h, file)
        -	if err != nil {
        -		return OutputID{}, 0, err
        -	}
        -	var out OutputID
        -	h.Sum(out[:0])
        -
        -	// Copy to cached output file (if not already present).
        -	if err := c.copyFile(file, out, size); err != nil {
        -		return out, size, err
        -	}
        -
        -	// Add to cache index.
        -	return out, size, c.putIndexEntry(id, out, size, allowVerify)
        -}
        -
        -// PutBytes stores the given bytes in the cache as the output for the action ID.
        -func (c *Cache) PutBytes(id ActionID, data []byte) error {
        -	_, _, err := c.Put(id, bytes.NewReader(data))
        -	return err
        -}
        -
        -// copyFile copies file into the cache, expecting it to have the given
        -// output ID and size, if that file is not present already.
        -func (c *Cache) copyFile(file io.ReadSeeker, out OutputID, size int64) error {
        -	name := c.fileName(out, "d")
        -	info, err := os.Stat(name)
        -	if err == nil && info.Size() == size {
        -		// Check hash.
        -		if f, err := os.Open(name); err == nil {
        -			h := sha256.New()
        -			io.Copy(h, f)
        -			f.Close()
        -			var out2 OutputID
        -			h.Sum(out2[:0])
        -			if out == out2 {
        -				return nil
        -			}
        -		}
        -		// Hash did not match. Fall through and rewrite file.
        -	}
        -
        -	// Copy file to cache directory.
        -	mode := os.O_RDWR | os.O_CREATE
        -	if err == nil && info.Size() > size { // shouldn't happen but fix in case
        -		mode |= os.O_TRUNC
        -	}
        -	f, err := os.OpenFile(name, mode, 0666)
        -	if err != nil {
        -		return err
        -	}
        -	defer f.Close()
        -	if size == 0 {
        -		// File now exists with correct size.
        -		// Only one possible zero-length file, so contents are OK too.
        -		// Early return here makes sure there's a "last byte" for code below.
        -		return nil
        -	}
        -
        -	// From here on, if any of the I/O writing the file fails,
        -	// we make a best-effort attempt to truncate the file f
        -	// before returning, to avoid leaving bad bytes in the file.
        -
        -	// Copy file to f, but also into h to double-check hash.
        -	if _, err := file.Seek(0, 0); err != nil {
        -		f.Truncate(0)
        -		return err
        -	}
        -	h := sha256.New()
        -	w := io.MultiWriter(f, h)
        -	if _, err := io.CopyN(w, file, size-1); err != nil {
        -		f.Truncate(0)
        -		return err
        -	}
        -	// Check last byte before writing it; writing it will make the size match
        -	// what other processes expect to find and might cause them to start
        -	// using the file.
        -	buf := make([]byte, 1)
        -	if _, err := file.Read(buf); err != nil {
        -		f.Truncate(0)
        -		return err
        -	}
        -	h.Write(buf)
        -	sum := h.Sum(nil)
        -	if !bytes.Equal(sum, out[:]) {
        -		f.Truncate(0)
        -		return fmt.Errorf("file content changed underfoot")
        -	}
        -
        -	// Commit cache file entry.
        -	if _, err := f.Write(buf); err != nil {
        -		f.Truncate(0)
        -		return err
        -	}
        -	if err := f.Close(); err != nil {
        -		// Data might not have been written,
        -		// but file may look like it is the right size.
        -		// To be extra careful, remove cached file.
        -		os.Remove(name)
        -		return err
        -	}
        -	os.Chtimes(name, c.now(), c.now()) // mainly for tests
        -
        -	return nil
        -}
        diff --git a/vendor/honnef.co/go/tools/internal/cache/default.go b/vendor/honnef.co/go/tools/internal/cache/default.go
        deleted file mode 100644
        index 3034f76a5..000000000
        --- a/vendor/honnef.co/go/tools/internal/cache/default.go
        +++ /dev/null
        @@ -1,85 +0,0 @@
        -// Copyright 2017 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package cache
        -
        -import (
        -	"fmt"
        -	"io/ioutil"
        -	"log"
        -	"os"
        -	"path/filepath"
        -	"sync"
        -)
        -
        -// Default returns the default cache to use.
        -func Default() (*Cache, error) {
        -	defaultOnce.Do(initDefaultCache)
        -	return defaultCache, defaultDirErr
        -}
        -
        -var (
        -	defaultOnce  sync.Once
        -	defaultCache *Cache
        -)
        -
        -// cacheREADME is a message stored in a README in the cache directory.
        -// Because the cache lives outside the normal Go trees, we leave the
        -// README as a courtesy to explain where it came from.
        -const cacheREADME = `This directory holds cached build artifacts from staticcheck.
        -`
        -
        -// initDefaultCache does the work of finding the default cache
        -// the first time Default is called.
        -func initDefaultCache() {
        -	dir := DefaultDir()
        -	if err := os.MkdirAll(dir, 0777); err != nil {
        -		log.Fatalf("failed to initialize build cache at %s: %s\n", dir, err)
        -	}
        -	if _, err := os.Stat(filepath.Join(dir, "README")); err != nil {
        -		// Best effort.
        -		ioutil.WriteFile(filepath.Join(dir, "README"), []byte(cacheREADME), 0666)
        -	}
        -
        -	c, err := Open(dir)
        -	if err != nil {
        -		log.Fatalf("failed to initialize build cache at %s: %s\n", dir, err)
        -	}
        -	defaultCache = c
        -}
        -
        -var (
        -	defaultDirOnce sync.Once
        -	defaultDir     string
        -	defaultDirErr  error
        -)
        -
        -// DefaultDir returns the effective STATICCHECK_CACHE setting.
        -func DefaultDir() string {
        -	// Save the result of the first call to DefaultDir for later use in
        -	// initDefaultCache. cmd/go/main.go explicitly sets GOCACHE so that
        -	// subprocesses will inherit it, but that means initDefaultCache can't
        -	// otherwise distinguish between an explicit "off" and a UserCacheDir error.
        -
        -	defaultDirOnce.Do(func() {
        -		defaultDir = os.Getenv("STATICCHECK_CACHE")
        -		if filepath.IsAbs(defaultDir) {
        -			return
        -		}
        -		if defaultDir != "" {
        -			defaultDirErr = fmt.Errorf("STATICCHECK_CACHE is not an absolute path")
        -			return
        -		}
        -
        -		// Compute default location.
        -		dir, err := os.UserCacheDir()
        -		if err != nil {
        -			defaultDirErr = fmt.Errorf("STATICCHECK_CACHE is not defined and %v", err)
        -			return
        -		}
        -		defaultDir = filepath.Join(dir, "staticcheck")
        -	})
        -
        -	return defaultDir
        -}
        diff --git a/vendor/honnef.co/go/tools/internal/cache/hash.go b/vendor/honnef.co/go/tools/internal/cache/hash.go
        deleted file mode 100644
        index a53543ec5..000000000
        --- a/vendor/honnef.co/go/tools/internal/cache/hash.go
        +++ /dev/null
        @@ -1,176 +0,0 @@
        -// Copyright 2017 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package cache
        -
        -import (
        -	"bytes"
        -	"crypto/sha256"
        -	"fmt"
        -	"hash"
        -	"io"
        -	"os"
        -	"sync"
        -)
        -
        -var debugHash = false // set when GODEBUG=gocachehash=1
        -
        -// HashSize is the number of bytes in a hash.
        -const HashSize = 32
        -
        -// A Hash provides access to the canonical hash function used to index the cache.
        -// The current implementation uses salted SHA256, but clients must not assume this.
        -type Hash struct {
        -	h    hash.Hash
        -	name string        // for debugging
        -	buf  *bytes.Buffer // for verify
        -}
        -
        -// hashSalt is a salt string added to the beginning of every hash
        -// created by NewHash. Using the Staticcheck version makes sure that different
        -// versions of the command do not address the same cache
        -// entries, so that a bug in one version does not affect the execution
        -// of other versions. This salt will result in additional ActionID files
        -// in the cache, but not additional copies of the large output files,
        -// which are still addressed by unsalted SHA256.
        -var hashSalt []byte
        -
        -func SetSalt(b []byte) {
        -	hashSalt = b
        -}
        -
        -// Subkey returns an action ID corresponding to mixing a parent
        -// action ID with a string description of the subkey.
        -func Subkey(parent ActionID, desc string) ActionID {
        -	h := sha256.New()
        -	h.Write([]byte("subkey:"))
        -	h.Write(parent[:])
        -	h.Write([]byte(desc))
        -	var out ActionID
        -	h.Sum(out[:0])
        -	if debugHash {
        -		fmt.Fprintf(os.Stderr, "HASH subkey %x %q = %x\n", parent, desc, out)
        -	}
        -	if verify {
        -		hashDebug.Lock()
        -		hashDebug.m[out] = fmt.Sprintf("subkey %x %q", parent, desc)
        -		hashDebug.Unlock()
        -	}
        -	return out
        -}
        -
        -// NewHash returns a new Hash.
        -// The caller is expected to Write data to it and then call Sum.
        -func NewHash(name string) *Hash {
        -	h := &Hash{h: sha256.New(), name: name}
        -	if debugHash {
        -		fmt.Fprintf(os.Stderr, "HASH[%s]\n", h.name)
        -	}
        -	h.Write(hashSalt)
        -	if verify {
        -		h.buf = new(bytes.Buffer)
        -	}
        -	return h
        -}
        -
        -// Write writes data to the running hash.
        -func (h *Hash) Write(b []byte) (int, error) {
        -	if debugHash {
        -		fmt.Fprintf(os.Stderr, "HASH[%s]: %q\n", h.name, b)
        -	}
        -	if h.buf != nil {
        -		h.buf.Write(b)
        -	}
        -	return h.h.Write(b)
        -}
        -
        -// Sum returns the hash of the data written previously.
        -func (h *Hash) Sum() [HashSize]byte {
        -	var out [HashSize]byte
        -	h.h.Sum(out[:0])
        -	if debugHash {
        -		fmt.Fprintf(os.Stderr, "HASH[%s]: %x\n", h.name, out)
        -	}
        -	if h.buf != nil {
        -		hashDebug.Lock()
        -		if hashDebug.m == nil {
        -			hashDebug.m = make(map[[HashSize]byte]string)
        -		}
        -		hashDebug.m[out] = h.buf.String()
        -		hashDebug.Unlock()
        -	}
        -	return out
        -}
        -
        -// In GODEBUG=gocacheverify=1 mode,
        -// hashDebug holds the input to every computed hash ID,
        -// so that we can work backward from the ID involved in a
        -// cache entry mismatch to a description of what should be there.
        -var hashDebug struct {
        -	sync.Mutex
        -	m map[[HashSize]byte]string
        -}
        -
        -// reverseHash returns the input used to compute the hash id.
        -func reverseHash(id [HashSize]byte) string {
        -	hashDebug.Lock()
        -	s := hashDebug.m[id]
        -	hashDebug.Unlock()
        -	return s
        -}
        -
        -var hashFileCache struct {
        -	sync.Mutex
        -	m map[string][HashSize]byte
        -}
        -
        -// FileHash returns the hash of the named file.
        -// It caches repeated lookups for a given file,
        -// and the cache entry for a file can be initialized
        -// using SetFileHash.
        -// The hash used by FileHash is not the same as
        -// the hash used by NewHash.
        -func FileHash(file string) ([HashSize]byte, error) {
        -	hashFileCache.Lock()
        -	out, ok := hashFileCache.m[file]
        -	hashFileCache.Unlock()
        -
        -	if ok {
        -		return out, nil
        -	}
        -
        -	h := sha256.New()
        -	f, err := os.Open(file)
        -	if err != nil {
        -		if debugHash {
        -			fmt.Fprintf(os.Stderr, "HASH %s: %v\n", file, err)
        -		}
        -		return [HashSize]byte{}, err
        -	}
        -	_, err = io.Copy(h, f)
        -	f.Close()
        -	if err != nil {
        -		if debugHash {
        -			fmt.Fprintf(os.Stderr, "HASH %s: %v\n", file, err)
        -		}
        -		return [HashSize]byte{}, err
        -	}
        -	h.Sum(out[:0])
        -	if debugHash {
        -		fmt.Fprintf(os.Stderr, "HASH %s: %x\n", file, out)
        -	}
        -
        -	SetFileHash(file, out)
        -	return out, nil
        -}
        -
        -// SetFileHash sets the hash returned by FileHash for file.
        -func SetFileHash(file string, sum [HashSize]byte) {
        -	hashFileCache.Lock()
        -	if hashFileCache.m == nil {
        -		hashFileCache.m = make(map[string][HashSize]byte)
        -	}
        -	hashFileCache.m[file] = sum
        -	hashFileCache.Unlock()
        -}
        diff --git a/vendor/honnef.co/go/tools/internal/passes/buildssa/buildssa.go b/vendor/honnef.co/go/tools/internal/passes/buildssa/buildssa.go
        deleted file mode 100644
        index fde918d12..000000000
        --- a/vendor/honnef.co/go/tools/internal/passes/buildssa/buildssa.go
        +++ /dev/null
        @@ -1,116 +0,0 @@
        -// Copyright 2018 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -// Package buildssa defines an Analyzer that constructs the SSA
        -// representation of an error-free package and returns the set of all
        -// functions within it. It does not report any diagnostics itself but
        -// may be used as an input to other analyzers.
        -//
        -// THIS INTERFACE IS EXPERIMENTAL AND MAY BE SUBJECT TO INCOMPATIBLE CHANGE.
        -package buildssa
        -
        -import (
        -	"go/ast"
        -	"go/types"
        -	"reflect"
        -
        -	"golang.org/x/tools/go/analysis"
        -	"honnef.co/go/tools/ssa"
        -)
        -
        -var Analyzer = &analysis.Analyzer{
        -	Name:       "buildssa",
        -	Doc:        "build SSA-form IR for later passes",
        -	Run:        run,
        -	ResultType: reflect.TypeOf(new(SSA)),
        -}
        -
        -// SSA provides SSA-form intermediate representation for all the
        -// non-blank source functions in the current package.
        -type SSA struct {
        -	Pkg      *ssa.Package
        -	SrcFuncs []*ssa.Function
        -}
        -
        -func run(pass *analysis.Pass) (interface{}, error) {
        -	// Plundered from ssautil.BuildPackage.
        -
        -	// We must create a new Program for each Package because the
        -	// analysis API provides no place to hang a Program shared by
        -	// all Packages. Consequently, SSA Packages and Functions do not
        -	// have a canonical representation across an analysis session of
        -	// multiple packages. This is unlikely to be a problem in
        -	// practice because the analysis API essentially forces all
        -	// packages to be analysed independently, so any given call to
        -	// Analysis.Run on a package will see only SSA objects belonging
        -	// to a single Program.
        -
        -	mode := ssa.GlobalDebug
        -
        -	prog := ssa.NewProgram(pass.Fset, mode)
        -
        -	// Create SSA packages for all imports.
        -	// Order is not significant.
        -	created := make(map[*types.Package]bool)
        -	var createAll func(pkgs []*types.Package)
        -	createAll = func(pkgs []*types.Package) {
        -		for _, p := range pkgs {
        -			if !created[p] {
        -				created[p] = true
        -				prog.CreatePackage(p, nil, nil, true)
        -				createAll(p.Imports())
        -			}
        -		}
        -	}
        -	createAll(pass.Pkg.Imports())
        -
        -	// Create and build the primary package.
        -	ssapkg := prog.CreatePackage(pass.Pkg, pass.Files, pass.TypesInfo, false)
        -	ssapkg.Build()
        -
        -	// Compute list of source functions, including literals,
        -	// in source order.
        -	var funcs []*ssa.Function
        -	var addAnons func(f *ssa.Function)
        -	addAnons = func(f *ssa.Function) {
        -		funcs = append(funcs, f)
        -		for _, anon := range f.AnonFuncs {
        -			addAnons(anon)
        -		}
        -	}
        -	addAnons(ssapkg.Members["init"].(*ssa.Function))
        -	for _, f := range pass.Files {
        -		for _, decl := range f.Decls {
        -			if fdecl, ok := decl.(*ast.FuncDecl); ok {
        -
        -				// SSA will not build a Function
        -				// for a FuncDecl named blank.
        -				// That's arguably too strict but
        -				// relaxing it would break uniqueness of
        -				// names of package members.
        -				if fdecl.Name.Name == "_" {
        -					continue
        -				}
        -
        -				// (init functions have distinct Func
        -				// objects named "init" and distinct
        -				// ssa.Functions named "init#1", ...)
        -
        -				fn := pass.TypesInfo.Defs[fdecl.Name].(*types.Func)
        -				if fn == nil {
        -					panic(fn)
        -				}
        -
        -				f := ssapkg.Prog.FuncValue(fn)
        -				if f == nil {
        -					panic(fn)
        -				}
        -
        -				addAnons(f)
        -			}
        -		}
        -	}
        -
        -	return &SSA{Pkg: ssapkg, SrcFuncs: funcs}, nil
        -}
        diff --git a/vendor/honnef.co/go/tools/internal/renameio/renameio.go b/vendor/honnef.co/go/tools/internal/renameio/renameio.go
        deleted file mode 100644
        index 3f3f1708f..000000000
        --- a/vendor/honnef.co/go/tools/internal/renameio/renameio.go
        +++ /dev/null
        @@ -1,83 +0,0 @@
        -// Copyright 2018 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -// Package renameio writes files atomically by renaming temporary files.
        -package renameio
        -
        -import (
        -	"bytes"
        -	"io"
        -	"io/ioutil"
        -	"os"
        -	"path/filepath"
        -	"runtime"
        -	"strings"
        -	"time"
        -)
        -
        -const patternSuffix = "*.tmp"
        -
        -// Pattern returns a glob pattern that matches the unrenamed temporary files
        -// created when writing to filename.
        -func Pattern(filename string) string {
        -	return filepath.Join(filepath.Dir(filename), filepath.Base(filename)+patternSuffix)
        -}
        -
        -// WriteFile is like ioutil.WriteFile, but first writes data to an arbitrary
        -// file in the same directory as filename, then renames it atomically to the
        -// final name.
        -//
        -// That ensures that the final location, if it exists, is always a complete file.
        -func WriteFile(filename string, data []byte) (err error) {
        -	return WriteToFile(filename, bytes.NewReader(data))
        -}
        -
        -// WriteToFile is a variant of WriteFile that accepts the data as an io.Reader
        -// instead of a slice.
        -func WriteToFile(filename string, data io.Reader) (err error) {
        -	f, err := ioutil.TempFile(filepath.Dir(filename), filepath.Base(filename)+patternSuffix)
        -	if err != nil {
        -		return err
        -	}
        -	defer func() {
        -		// Only call os.Remove on f.Name() if we failed to rename it: otherwise,
        -		// some other process may have created a new file with the same name after
        -		// that.
        -		if err != nil {
        -			f.Close()
        -			os.Remove(f.Name())
        -		}
        -	}()
        -
        -	if _, err := io.Copy(f, data); err != nil {
        -		return err
        -	}
        -	// Sync the file before renaming it: otherwise, after a crash the reader may
        -	// observe a 0-length file instead of the actual contents.
        -	// See https://golang.org/issue/22397#issuecomment-380831736.
        -	if err := f.Sync(); err != nil {
        -		return err
        -	}
        -	if err := f.Close(); err != nil {
        -		return err
        -	}
        -
        -	var start time.Time
        -	for {
        -		err := os.Rename(f.Name(), filename)
        -		if err == nil || runtime.GOOS != "windows" || !strings.HasSuffix(err.Error(), "Access is denied.") {
        -			return err
        -		}
        -
        -		// Windows seems to occasionally trigger spurious "Access is denied" errors
        -		// here (see golang.org/issue/31247). We're not sure why. It's probably
        -		// worth a little extra latency to avoid propagating the spurious errors.
        -		if start.IsZero() {
        -			start = time.Now()
        -		} else if time.Since(start) >= 500*time.Millisecond {
        -			return err
        -		}
        -		time.Sleep(5 * time.Millisecond)
        -	}
        -}
        diff --git a/vendor/honnef.co/go/tools/internal/sharedcheck/lint.go b/vendor/honnef.co/go/tools/internal/sharedcheck/lint.go
        deleted file mode 100644
        index affee6607..000000000
        --- a/vendor/honnef.co/go/tools/internal/sharedcheck/lint.go
        +++ /dev/null
        @@ -1,70 +0,0 @@
        -package sharedcheck
        -
        -import (
        -	"go/ast"
        -	"go/types"
        -
        -	"golang.org/x/tools/go/analysis"
        -	"honnef.co/go/tools/internal/passes/buildssa"
        -	. "honnef.co/go/tools/lint/lintdsl"
        -	"honnef.co/go/tools/ssa"
        -)
        -
        -func CheckRangeStringRunes(pass *analysis.Pass) (interface{}, error) {
        -	for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		fn := func(node ast.Node) bool {
        -			rng, ok := node.(*ast.RangeStmt)
        -			if !ok || !IsBlank(rng.Key) {
        -				return true
        -			}
        -
        -			v, _ := ssafn.ValueForExpr(rng.X)
        -
        -			// Check that we're converting from string to []rune
        -			val, _ := v.(*ssa.Convert)
        -			if val == nil {
        -				return true
        -			}
        -			Tsrc, ok := val.X.Type().(*types.Basic)
        -			if !ok || Tsrc.Kind() != types.String {
        -				return true
        -			}
        -			Tdst, ok := val.Type().(*types.Slice)
        -			if !ok {
        -				return true
        -			}
        -			TdstElem, ok := Tdst.Elem().(*types.Basic)
        -			if !ok || TdstElem.Kind() != types.Int32 {
        -				return true
        -			}
        -
        -			// Check that the result of the conversion is only used to
        -			// range over
        -			refs := val.Referrers()
        -			if refs == nil {
        -				return true
        -			}
        -
        -			// Expect two refs: one for obtaining the length of the slice,
        -			// one for accessing the elements
        -			if len(FilterDebug(*refs)) != 2 {
        -				// TODO(dh): right now, we check that only one place
        -				// refers to our slice. This will miss cases such as
        -				// ranging over the slice twice. Ideally, we'd ensure that
        -				// the slice is only used for ranging over (without
        -				// accessing the key), but that is harder to do because in
        -				// SSA form, ranging over a slice looks like an ordinary
        -				// loop with index increments and slice accesses. We'd
        -				// have to look at the associated AST node to check that
        -				// it's a range statement.
        -				return true
        -			}
        -
        -			pass.Reportf(rng.Pos(), "should range over string, not []rune(string)")
        -
        -			return true
        -		}
        -		Inspect(ssafn.Syntax(), fn)
        -	}
        -	return nil, nil
        -}
        diff --git a/vendor/honnef.co/go/tools/lint/LICENSE b/vendor/honnef.co/go/tools/lint/LICENSE
        deleted file mode 100644
        index 796130a12..000000000
        --- a/vendor/honnef.co/go/tools/lint/LICENSE
        +++ /dev/null
        @@ -1,28 +0,0 @@
        -Copyright (c) 2013 The Go Authors. All rights reserved.
        -Copyright (c) 2016 Dominik Honnef. All rights reserved.
        -
        -Redistribution and use in source and binary forms, with or without
        -modification, are permitted provided that the following conditions are
        -met:
        -
        -   * Redistributions of source code must retain the above copyright
        -notice, this list of conditions and the following disclaimer.
        -   * Redistributions in binary form must reproduce the above
        -copyright notice, this list of conditions and the following disclaimer
        -in the documentation and/or other materials provided with the
        -distribution.
        -   * Neither the name of Google Inc. nor the names of its
        -contributors may be used to endorse or promote products derived from
        -this software without specific prior written permission.
        -
        -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
        -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
        -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
        -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
        -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
        -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
        -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
        -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
        -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
        -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        diff --git a/vendor/honnef.co/go/tools/lint/lint.go b/vendor/honnef.co/go/tools/lint/lint.go
        deleted file mode 100644
        index de5a8f128..000000000
        --- a/vendor/honnef.co/go/tools/lint/lint.go
        +++ /dev/null
        @@ -1,491 +0,0 @@
        -// Package lint provides the foundation for tools like staticcheck
        -package lint // import "honnef.co/go/tools/lint"
        -
        -import (
        -	"bytes"
        -	"fmt"
        -	"go/scanner"
        -	"go/token"
        -	"go/types"
        -	"path/filepath"
        -	"sort"
        -	"strings"
        -	"sync"
        -	"sync/atomic"
        -	"unicode"
        -
        -	"golang.org/x/tools/go/analysis"
        -	"golang.org/x/tools/go/packages"
        -	"honnef.co/go/tools/config"
        -)
        -
        -type Documentation struct {
        -	Title      string
        -	Text       string
        -	Since      string
        -	NonDefault bool
        -	Options    []string
        -}
        -
        -func (doc *Documentation) String() string {
        -	b := &strings.Builder{}
        -	fmt.Fprintf(b, "%s\n\n", doc.Title)
        -	if doc.Text != "" {
        -		fmt.Fprintf(b, "%s\n\n", doc.Text)
        -	}
        -	fmt.Fprint(b, "Available since\n    ")
        -	if doc.Since == "" {
        -		fmt.Fprint(b, "unreleased")
        -	} else {
        -		fmt.Fprintf(b, "%s", doc.Since)
        -	}
        -	if doc.NonDefault {
        -		fmt.Fprint(b, ", non-default")
        -	}
        -	fmt.Fprint(b, "\n")
        -	if len(doc.Options) > 0 {
        -		fmt.Fprintf(b, "\nOptions\n")
        -		for _, opt := range doc.Options {
        -			fmt.Fprintf(b, "    %s", opt)
        -		}
        -		fmt.Fprint(b, "\n")
        -	}
        -	return b.String()
        -}
        -
        -type Ignore interface {
        -	Match(p Problem) bool
        -}
        -
        -type LineIgnore struct {
        -	File    string
        -	Line    int
        -	Checks  []string
        -	Matched bool
        -	Pos     token.Pos
        -}
        -
        -func (li *LineIgnore) Match(p Problem) bool {
        -	pos := p.Pos
        -	if pos.Filename != li.File || pos.Line != li.Line {
        -		return false
        -	}
        -	for _, c := range li.Checks {
        -		if m, _ := filepath.Match(c, p.Check); m {
        -			li.Matched = true
        -			return true
        -		}
        -	}
        -	return false
        -}
        -
        -func (li *LineIgnore) String() string {
        -	matched := "not matched"
        -	if li.Matched {
        -		matched = "matched"
        -	}
        -	return fmt.Sprintf("%s:%d %s (%s)", li.File, li.Line, strings.Join(li.Checks, ", "), matched)
        -}
        -
        -type FileIgnore struct {
        -	File   string
        -	Checks []string
        -}
        -
        -func (fi *FileIgnore) Match(p Problem) bool {
        -	if p.Pos.Filename != fi.File {
        -		return false
        -	}
        -	for _, c := range fi.Checks {
        -		if m, _ := filepath.Match(c, p.Check); m {
        -			return true
        -		}
        -	}
        -	return false
        -}
        -
        -type Severity uint8
        -
        -const (
        -	Error Severity = iota
        -	Warning
        -	Ignored
        -)
        -
        -// Problem represents a problem in some source code.
        -type Problem struct {
        -	Pos      token.Position
        -	End      token.Position
        -	Message  string
        -	Check    string
        -	Severity Severity
        -}
        -
        -func (p *Problem) String() string {
        -	return fmt.Sprintf("%s (%s)", p.Message, p.Check)
        -}
        -
        -// A Linter lints Go source code.
        -type Linter struct {
        -	Checkers           []*analysis.Analyzer
        -	CumulativeCheckers []CumulativeChecker
        -	GoVersion          int
        -	Config             config.Config
        -	Stats              Stats
        -}
        -
        -type CumulativeChecker interface {
        -	Analyzer() *analysis.Analyzer
        -	Result() []types.Object
        -	ProblemObject(*token.FileSet, types.Object) Problem
        -}
        -
        -func (l *Linter) Lint(cfg *packages.Config, patterns []string) ([]Problem, error) {
        -	var allAnalyzers []*analysis.Analyzer
        -	allAnalyzers = append(allAnalyzers, l.Checkers...)
        -	for _, cum := range l.CumulativeCheckers {
        -		allAnalyzers = append(allAnalyzers, cum.Analyzer())
        -	}
        -
        -	// The -checks command line flag overrules all configuration
        -	// files, which means that for `-checks="foo"`, no check other
        -	// than foo can ever be reported to the user. Make use of this
        -	// fact to cull the list of analyses we need to run.
        -
        -	// replace "inherit" with "all", as we don't want to base the
        -	// list of all checks on the default configuration, which
        -	// disables certain checks.
        -	checks := make([]string, len(l.Config.Checks))
        -	copy(checks, l.Config.Checks)
        -	for i, c := range checks {
        -		if c == "inherit" {
        -			checks[i] = "all"
        -		}
        -	}
        -
        -	allowed := FilterChecks(allAnalyzers, checks)
        -	var allowedAnalyzers []*analysis.Analyzer
        -	for _, c := range l.Checkers {
        -		if allowed[c.Name] {
        -			allowedAnalyzers = append(allowedAnalyzers, c)
        -		}
        -	}
        -	hasCumulative := false
        -	for _, cum := range l.CumulativeCheckers {
        -		a := cum.Analyzer()
        -		if allowed[a.Name] {
        -			hasCumulative = true
        -			allowedAnalyzers = append(allowedAnalyzers, a)
        -		}
        -	}
        -
        -	r, err := NewRunner(&l.Stats)
        -	if err != nil {
        -		return nil, err
        -	}
        -	r.goVersion = l.GoVersion
        -
        -	pkgs, err := r.Run(cfg, patterns, allowedAnalyzers, hasCumulative)
        -	if err != nil {
        -		return nil, err
        -	}
        -
        -	tpkgToPkg := map[*types.Package]*Package{}
        -	for _, pkg := range pkgs {
        -		tpkgToPkg[pkg.Types] = pkg
        -
        -		for _, e := range pkg.errs {
        -			switch e := e.(type) {
        -			case types.Error:
        -				p := Problem{
        -					Pos:      e.Fset.PositionFor(e.Pos, false),
        -					Message:  e.Msg,
        -					Severity: Error,
        -					Check:    "compile",
        -				}
        -				pkg.problems = append(pkg.problems, p)
        -			case packages.Error:
        -				msg := e.Msg
        -				if len(msg) != 0 && msg[0] == '\n' {
        -					// TODO(dh): See https://github.com/golang/go/issues/32363
        -					msg = msg[1:]
        -				}
        -
        -				var pos token.Position
        -				if e.Pos == "" {
        -					// Under certain conditions (malformed package
        -					// declarations, multiple packages in the same
        -					// directory), go list emits an error on stderr
        -					// instead of JSON. Those errors do not have
        -					// associated position information in
        -					// go/packages.Error, even though the output on
        -					// stderr may contain it.
        -					if p, n, err := parsePos(msg); err == nil {
        -						if abs, err := filepath.Abs(p.Filename); err == nil {
        -							p.Filename = abs
        -						}
        -						pos = p
        -						msg = msg[n+2:]
        -					}
        -				} else {
        -					var err error
        -					pos, _, err = parsePos(e.Pos)
        -					if err != nil {
        -						panic(fmt.Sprintf("internal error: %s", e))
        -					}
        -				}
        -				p := Problem{
        -					Pos:      pos,
        -					Message:  msg,
        -					Severity: Error,
        -					Check:    "compile",
        -				}
        -				pkg.problems = append(pkg.problems, p)
        -			case scanner.ErrorList:
        -				for _, e := range e {
        -					p := Problem{
        -						Pos:      e.Pos,
        -						Message:  e.Msg,
        -						Severity: Error,
        -						Check:    "compile",
        -					}
        -					pkg.problems = append(pkg.problems, p)
        -				}
        -			case error:
        -				p := Problem{
        -					Pos:      token.Position{},
        -					Message:  e.Error(),
        -					Severity: Error,
        -					Check:    "compile",
        -				}
        -				pkg.problems = append(pkg.problems, p)
        -			}
        -		}
        -	}
        -
        -	atomic.StoreUint32(&r.stats.State, StateCumulative)
        -	var problems []Problem
        -	for _, cum := range l.CumulativeCheckers {
        -		for _, res := range cum.Result() {
        -			pkg := tpkgToPkg[res.Pkg()]
        -			allowedChecks := FilterChecks(allowedAnalyzers, pkg.cfg.Merge(l.Config).Checks)
        -			if allowedChecks[cum.Analyzer().Name] {
        -				pos := DisplayPosition(pkg.Fset, res.Pos())
        -				// FIXME(dh): why are we ignoring generated files
        -				// here? Surely this is specific to 'unused', not all
        -				// cumulative checkers
        -				if _, ok := pkg.gen[pos.Filename]; ok {
        -					continue
        -				}
        -				p := cum.ProblemObject(pkg.Fset, res)
        -				problems = append(problems, p)
        -			}
        -		}
        -	}
        -
        -	for _, pkg := range pkgs {
        -		for _, ig := range pkg.ignores {
        -			for i := range pkg.problems {
        -				p := &pkg.problems[i]
        -				if ig.Match(*p) {
        -					p.Severity = Ignored
        -				}
        -			}
        -			for i := range problems {
        -				p := &problems[i]
        -				if ig.Match(*p) {
        -					p.Severity = Ignored
        -				}
        -			}
        -		}
        -
        -		if pkg.cfg == nil {
        -			// The package failed to load, otherwise we would have a
        -			// valid config. Pass through all errors.
        -			problems = append(problems, pkg.problems...)
        -		} else {
        -			for _, p := range pkg.problems {
        -				allowedChecks := FilterChecks(allowedAnalyzers, pkg.cfg.Merge(l.Config).Checks)
        -				allowedChecks["compile"] = true
        -				if allowedChecks[p.Check] {
        -					problems = append(problems, p)
        -				}
        -			}
        -		}
        -
        -		for _, ig := range pkg.ignores {
        -			ig, ok := ig.(*LineIgnore)
        -			if !ok {
        -				continue
        -			}
        -			if ig.Matched {
        -				continue
        -			}
        -
        -			couldveMatched := false
        -			allowedChecks := FilterChecks(allowedAnalyzers, pkg.cfg.Merge(l.Config).Checks)
        -			for _, c := range ig.Checks {
        -				if !allowedChecks[c] {
        -					continue
        -				}
        -				couldveMatched = true
        -				break
        -			}
        -
        -			if !couldveMatched {
        -				// The ignored checks were disabled for the containing package.
        -				// Don't flag the ignore for not having matched.
        -				continue
        -			}
        -			p := Problem{
        -				Pos:     DisplayPosition(pkg.Fset, ig.Pos),
        -				Message: "this linter directive didn't match anything; should it be removed?",
        -				Check:   "",
        -			}
        -			problems = append(problems, p)
        -		}
        -	}
        -
        -	if len(problems) == 0 {
        -		return nil, nil
        -	}
        -
        -	sort.Slice(problems, func(i, j int) bool {
        -		pi := problems[i].Pos
        -		pj := problems[j].Pos
        -
        -		if pi.Filename != pj.Filename {
        -			return pi.Filename < pj.Filename
        -		}
        -		if pi.Line != pj.Line {
        -			return pi.Line < pj.Line
        -		}
        -		if pi.Column != pj.Column {
        -			return pi.Column < pj.Column
        -		}
        -
        -		return problems[i].Message < problems[j].Message
        -	})
        -
        -	var out []Problem
        -	out = append(out, problems[0])
        -	for i, p := range problems[1:] {
        -		// We may encounter duplicate problems because one file
        -		// can be part of many packages.
        -		if problems[i] != p {
        -			out = append(out, p)
        -		}
        -	}
        -	return out, nil
        -}
        -
        -func FilterChecks(allChecks []*analysis.Analyzer, checks []string) map[string]bool {
        -	// OPT(dh): this entire computation could be cached per package
        -	allowedChecks := map[string]bool{}
        -
        -	for _, check := range checks {
        -		b := true
        -		if len(check) > 1 && check[0] == '-' {
        -			b = false
        -			check = check[1:]
        -		}
        -		if check == "*" || check == "all" {
        -			// Match all
        -			for _, c := range allChecks {
        -				allowedChecks[c.Name] = b
        -			}
        -		} else if strings.HasSuffix(check, "*") {
        -			// Glob
        -			prefix := check[:len(check)-1]
        -			isCat := strings.IndexFunc(prefix, func(r rune) bool { return unicode.IsNumber(r) }) == -1
        -
        -			for _, c := range allChecks {
        -				idx := strings.IndexFunc(c.Name, func(r rune) bool { return unicode.IsNumber(r) })
        -				if isCat {
        -					// Glob is S*, which should match S1000 but not SA1000
        -					cat := c.Name[:idx]
        -					if prefix == cat {
        -						allowedChecks[c.Name] = b
        -					}
        -				} else {
        -					// Glob is S1*
        -					if strings.HasPrefix(c.Name, prefix) {
        -						allowedChecks[c.Name] = b
        -					}
        -				}
        -			}
        -		} else {
        -			// Literal check name
        -			allowedChecks[check] = b
        -		}
        -	}
        -	return allowedChecks
        -}
        -
        -type Positioner interface {
        -	Pos() token.Pos
        -}
        -
        -func DisplayPosition(fset *token.FileSet, p token.Pos) token.Position {
        -	if p == token.NoPos {
        -		return token.Position{}
        -	}
        -
        -	// Only use the adjusted position if it points to another Go file.
        -	// This means we'll point to the original file for cgo files, but
        -	// we won't point to a YACC grammar file.
        -	pos := fset.PositionFor(p, false)
        -	adjPos := fset.PositionFor(p, true)
        -
        -	if filepath.Ext(adjPos.Filename) == ".go" {
        -		return adjPos
        -	}
        -	return pos
        -}
        -
        -var bufferPool = &sync.Pool{
        -	New: func() interface{} {
        -		buf := bytes.NewBuffer(nil)
        -		buf.Grow(64)
        -		return buf
        -	},
        -}
        -
        -func FuncName(f *types.Func) string {
        -	buf := bufferPool.Get().(*bytes.Buffer)
        -	buf.Reset()
        -	if f.Type() != nil {
        -		sig := f.Type().(*types.Signature)
        -		if recv := sig.Recv(); recv != nil {
        -			buf.WriteByte('(')
        -			if _, ok := recv.Type().(*types.Interface); ok {
        -				// gcimporter creates abstract methods of
        -				// named interfaces using the interface type
        -				// (not the named type) as the receiver.
        -				// Don't print it in full.
        -				buf.WriteString("interface")
        -			} else {
        -				types.WriteType(buf, recv.Type(), nil)
        -			}
        -			buf.WriteByte(')')
        -			buf.WriteByte('.')
        -		} else if f.Pkg() != nil {
        -			writePackage(buf, f.Pkg())
        -		}
        -	}
        -	buf.WriteString(f.Name())
        -	s := buf.String()
        -	bufferPool.Put(buf)
        -	return s
        -}
        -
        -func writePackage(buf *bytes.Buffer, pkg *types.Package) {
        -	if pkg == nil {
        -		return
        -	}
        -	s := pkg.Path()
        -	if s != "" {
        -		buf.WriteString(s)
        -		buf.WriteByte('.')
        -	}
        -}
        diff --git a/vendor/honnef.co/go/tools/lint/lintdsl/lintdsl.go b/vendor/honnef.co/go/tools/lint/lintdsl/lintdsl.go
        deleted file mode 100644
        index 3b939e95f..000000000
        --- a/vendor/honnef.co/go/tools/lint/lintdsl/lintdsl.go
        +++ /dev/null
        @@ -1,400 +0,0 @@
        -// Package lintdsl provides helpers for implementing static analysis
        -// checks. Dot-importing this package is encouraged.
        -package lintdsl
        -
        -import (
        -	"bytes"
        -	"flag"
        -	"fmt"
        -	"go/ast"
        -	"go/constant"
        -	"go/printer"
        -	"go/token"
        -	"go/types"
        -	"strings"
        -
        -	"golang.org/x/tools/go/analysis"
        -	"honnef.co/go/tools/facts"
        -	"honnef.co/go/tools/lint"
        -	"honnef.co/go/tools/ssa"
        -)
        -
        -type packager interface {
        -	Package() *ssa.Package
        -}
        -
        -func CallName(call *ssa.CallCommon) string {
        -	if call.IsInvoke() {
        -		return ""
        -	}
        -	switch v := call.Value.(type) {
        -	case *ssa.Function:
        -		fn, ok := v.Object().(*types.Func)
        -		if !ok {
        -			return ""
        -		}
        -		return lint.FuncName(fn)
        -	case *ssa.Builtin:
        -		return v.Name()
        -	}
        -	return ""
        -}
        -
        -func IsCallTo(call *ssa.CallCommon, name string) bool { return CallName(call) == name }
        -func IsType(T types.Type, name string) bool           { return types.TypeString(T, nil) == name }
        -
        -func FilterDebug(instr []ssa.Instruction) []ssa.Instruction {
        -	var out []ssa.Instruction
        -	for _, ins := range instr {
        -		if _, ok := ins.(*ssa.DebugRef); !ok {
        -			out = append(out, ins)
        -		}
        -	}
        -	return out
        -}
        -
        -func IsExample(fn *ssa.Function) bool {
        -	if !strings.HasPrefix(fn.Name(), "Example") {
        -		return false
        -	}
        -	f := fn.Prog.Fset.File(fn.Pos())
        -	if f == nil {
        -		return false
        -	}
        -	return strings.HasSuffix(f.Name(), "_test.go")
        -}
        -
        -func IsPointerLike(T types.Type) bool {
        -	switch T := T.Underlying().(type) {
        -	case *types.Interface, *types.Chan, *types.Map, *types.Signature, *types.Pointer:
        -		return true
        -	case *types.Basic:
        -		return T.Kind() == types.UnsafePointer
        -	}
        -	return false
        -}
        -
        -func IsIdent(expr ast.Expr, ident string) bool {
        -	id, ok := expr.(*ast.Ident)
        -	return ok && id.Name == ident
        -}
        -
        -// isBlank returns whether id is the blank identifier "_".
        -// If id == nil, the answer is false.
        -func IsBlank(id ast.Expr) bool {
        -	ident, _ := id.(*ast.Ident)
        -	return ident != nil && ident.Name == "_"
        -}
        -
        -func IsIntLiteral(expr ast.Expr, literal string) bool {
        -	lit, ok := expr.(*ast.BasicLit)
        -	return ok && lit.Kind == token.INT && lit.Value == literal
        -}
        -
        -// Deprecated: use IsIntLiteral instead
        -func IsZero(expr ast.Expr) bool {
        -	return IsIntLiteral(expr, "0")
        -}
        -
        -func IsOfType(pass *analysis.Pass, expr ast.Expr, name string) bool {
        -	return IsType(pass.TypesInfo.TypeOf(expr), name)
        -}
        -
        -func IsInTest(pass *analysis.Pass, node lint.Positioner) bool {
        -	// FIXME(dh): this doesn't work for global variables with
        -	// initializers
        -	f := pass.Fset.File(node.Pos())
        -	return f != nil && strings.HasSuffix(f.Name(), "_test.go")
        -}
        -
        -func IsInMain(pass *analysis.Pass, node lint.Positioner) bool {
        -	if node, ok := node.(packager); ok {
        -		return node.Package().Pkg.Name() == "main"
        -	}
        -	return pass.Pkg.Name() == "main"
        -}
        -
        -func SelectorName(pass *analysis.Pass, expr *ast.SelectorExpr) string {
        -	info := pass.TypesInfo
        -	sel := info.Selections[expr]
        -	if sel == nil {
        -		if x, ok := expr.X.(*ast.Ident); ok {
        -			pkg, ok := info.ObjectOf(x).(*types.PkgName)
        -			if !ok {
        -				// This shouldn't happen
        -				return fmt.Sprintf("%s.%s", x.Name, expr.Sel.Name)
        -			}
        -			return fmt.Sprintf("%s.%s", pkg.Imported().Path(), expr.Sel.Name)
        -		}
        -		panic(fmt.Sprintf("unsupported selector: %v", expr))
        -	}
        -	return fmt.Sprintf("(%s).%s", sel.Recv(), sel.Obj().Name())
        -}
        -
        -func IsNil(pass *analysis.Pass, expr ast.Expr) bool {
        -	return pass.TypesInfo.Types[expr].IsNil()
        -}
        -
        -func BoolConst(pass *analysis.Pass, expr ast.Expr) bool {
        -	val := pass.TypesInfo.ObjectOf(expr.(*ast.Ident)).(*types.Const).Val()
        -	return constant.BoolVal(val)
        -}
        -
        -func IsBoolConst(pass *analysis.Pass, expr ast.Expr) bool {
        -	// We explicitly don't support typed bools because more often than
        -	// not, custom bool types are used as binary enums and the
        -	// explicit comparison is desired.
        -
        -	ident, ok := expr.(*ast.Ident)
        -	if !ok {
        -		return false
        -	}
        -	obj := pass.TypesInfo.ObjectOf(ident)
        -	c, ok := obj.(*types.Const)
        -	if !ok {
        -		return false
        -	}
        -	basic, ok := c.Type().(*types.Basic)
        -	if !ok {
        -		return false
        -	}
        -	if basic.Kind() != types.UntypedBool && basic.Kind() != types.Bool {
        -		return false
        -	}
        -	return true
        -}
        -
        -func ExprToInt(pass *analysis.Pass, expr ast.Expr) (int64, bool) {
        -	tv := pass.TypesInfo.Types[expr]
        -	if tv.Value == nil {
        -		return 0, false
        -	}
        -	if tv.Value.Kind() != constant.Int {
        -		return 0, false
        -	}
        -	return constant.Int64Val(tv.Value)
        -}
        -
        -func ExprToString(pass *analysis.Pass, expr ast.Expr) (string, bool) {
        -	val := pass.TypesInfo.Types[expr].Value
        -	if val == nil {
        -		return "", false
        -	}
        -	if val.Kind() != constant.String {
        -		return "", false
        -	}
        -	return constant.StringVal(val), true
        -}
        -
        -// Dereference returns a pointer's element type; otherwise it returns
        -// T.
        -func Dereference(T types.Type) types.Type {
        -	if p, ok := T.Underlying().(*types.Pointer); ok {
        -		return p.Elem()
        -	}
        -	return T
        -}
        -
        -// DereferenceR returns a pointer's element type; otherwise it returns
        -// T. If the element type is itself a pointer, DereferenceR will be
        -// applied recursively.
        -func DereferenceR(T types.Type) types.Type {
        -	if p, ok := T.Underlying().(*types.Pointer); ok {
        -		return DereferenceR(p.Elem())
        -	}
        -	return T
        -}
        -
        -func IsGoVersion(pass *analysis.Pass, minor int) bool {
        -	version := pass.Analyzer.Flags.Lookup("go").Value.(flag.Getter).Get().(int)
        -	return version >= minor
        -}
        -
        -func CallNameAST(pass *analysis.Pass, call *ast.CallExpr) string {
        -	switch fun := call.Fun.(type) {
        -	case *ast.SelectorExpr:
        -		fn, ok := pass.TypesInfo.ObjectOf(fun.Sel).(*types.Func)
        -		if !ok {
        -			return ""
        -		}
        -		return lint.FuncName(fn)
        -	case *ast.Ident:
        -		obj := pass.TypesInfo.ObjectOf(fun)
        -		switch obj := obj.(type) {
        -		case *types.Func:
        -			return lint.FuncName(obj)
        -		case *types.Builtin:
        -			return obj.Name()
        -		default:
        -			return ""
        -		}
        -	default:
        -		return ""
        -	}
        -}
        -
        -func IsCallToAST(pass *analysis.Pass, node ast.Node, name string) bool {
        -	call, ok := node.(*ast.CallExpr)
        -	if !ok {
        -		return false
        -	}
        -	return CallNameAST(pass, call) == name
        -}
        -
        -func IsCallToAnyAST(pass *analysis.Pass, node ast.Node, names ...string) bool {
        -	for _, name := range names {
        -		if IsCallToAST(pass, node, name) {
        -			return true
        -		}
        -	}
        -	return false
        -}
        -
        -func Render(pass *analysis.Pass, x interface{}) string {
        -	var buf bytes.Buffer
        -	if err := printer.Fprint(&buf, pass.Fset, x); err != nil {
        -		panic(err)
        -	}
        -	return buf.String()
        -}
        -
        -func RenderArgs(pass *analysis.Pass, args []ast.Expr) string {
        -	var ss []string
        -	for _, arg := range args {
        -		ss = append(ss, Render(pass, arg))
        -	}
        -	return strings.Join(ss, ", ")
        -}
        -
        -func Preamble(f *ast.File) string {
        -	cutoff := f.Package
        -	if f.Doc != nil {
        -		cutoff = f.Doc.Pos()
        -	}
        -	var out []string
        -	for _, cmt := range f.Comments {
        -		if cmt.Pos() >= cutoff {
        -			break
        -		}
        -		out = append(out, cmt.Text())
        -	}
        -	return strings.Join(out, "\n")
        -}
        -
        -func Inspect(node ast.Node, fn func(node ast.Node) bool) {
        -	if node == nil {
        -		return
        -	}
        -	ast.Inspect(node, fn)
        -}
        -
        -func GroupSpecs(fset *token.FileSet, specs []ast.Spec) [][]ast.Spec {
        -	if len(specs) == 0 {
        -		return nil
        -	}
        -	groups := make([][]ast.Spec, 1)
        -	groups[0] = append(groups[0], specs[0])
        -
        -	for _, spec := range specs[1:] {
        -		g := groups[len(groups)-1]
        -		if fset.PositionFor(spec.Pos(), false).Line-1 !=
        -			fset.PositionFor(g[len(g)-1].End(), false).Line {
        -
        -			groups = append(groups, nil)
        -		}
        -
        -		groups[len(groups)-1] = append(groups[len(groups)-1], spec)
        -	}
        -
        -	return groups
        -}
        -
        -func IsObject(obj types.Object, name string) bool {
        -	var path string
        -	if pkg := obj.Pkg(); pkg != nil {
        -		path = pkg.Path() + "."
        -	}
        -	return path+obj.Name() == name
        -}
        -
        -type Field struct {
        -	Var  *types.Var
        -	Tag  string
        -	Path []int
        -}
        -
        -// FlattenFields recursively flattens T and embedded structs,
        -// returning a list of fields. If multiple fields with the same name
        -// exist, all will be returned.
        -func FlattenFields(T *types.Struct) []Field {
        -	return flattenFields(T, nil, nil)
        -}
        -
        -func flattenFields(T *types.Struct, path []int, seen map[types.Type]bool) []Field {
        -	if seen == nil {
        -		seen = map[types.Type]bool{}
        -	}
        -	if seen[T] {
        -		return nil
        -	}
        -	seen[T] = true
        -	var out []Field
        -	for i := 0; i < T.NumFields(); i++ {
        -		field := T.Field(i)
        -		tag := T.Tag(i)
        -		np := append(path[:len(path):len(path)], i)
        -		if field.Anonymous() {
        -			if s, ok := Dereference(field.Type()).Underlying().(*types.Struct); ok {
        -				out = append(out, flattenFields(s, np, seen)...)
        -			}
        -		} else {
        -			out = append(out, Field{field, tag, np})
        -		}
        -	}
        -	return out
        -}
        -
        -func File(pass *analysis.Pass, node lint.Positioner) *ast.File {
        -	pass.Fset.PositionFor(node.Pos(), true)
        -	m := pass.ResultOf[facts.TokenFile].(map[*token.File]*ast.File)
        -	return m[pass.Fset.File(node.Pos())]
        -}
        -
        -// IsGenerated reports whether pos is in a generated file, It ignores
        -// //line directives.
        -func IsGenerated(pass *analysis.Pass, pos token.Pos) bool {
        -	_, ok := Generator(pass, pos)
        -	return ok
        -}
        -
        -// Generator returns the generator that generated the file containing
        -// pos. It ignores //line directives.
        -func Generator(pass *analysis.Pass, pos token.Pos) (facts.Generator, bool) {
        -	file := pass.Fset.PositionFor(pos, false).Filename
        -	m := pass.ResultOf[facts.Generated].(map[string]facts.Generator)
        -	g, ok := m[file]
        -	return g, ok
        -}
        -
        -func ReportfFG(pass *analysis.Pass, pos token.Pos, f string, args ...interface{}) {
        -	file := lint.DisplayPosition(pass.Fset, pos).Filename
        -	m := pass.ResultOf[facts.Generated].(map[string]facts.Generator)
        -	if _, ok := m[file]; ok {
        -		return
        -	}
        -	pass.Reportf(pos, f, args...)
        -}
        -
        -func ReportNodef(pass *analysis.Pass, node ast.Node, format string, args ...interface{}) {
        -	msg := fmt.Sprintf(format, args...)
        -	pass.Report(analysis.Diagnostic{Pos: node.Pos(), End: node.End(), Message: msg})
        -}
        -
        -func ReportNodefFG(pass *analysis.Pass, node ast.Node, format string, args ...interface{}) {
        -	file := lint.DisplayPosition(pass.Fset, node.Pos()).Filename
        -	m := pass.ResultOf[facts.Generated].(map[string]facts.Generator)
        -	if _, ok := m[file]; ok {
        -		return
        -	}
        -	ReportNodef(pass, node, format, args...)
        -}
        diff --git a/vendor/honnef.co/go/tools/lint/lintutil/format/format.go b/vendor/honnef.co/go/tools/lint/lintutil/format/format.go
        deleted file mode 100644
        index 9385431f8..000000000
        --- a/vendor/honnef.co/go/tools/lint/lintutil/format/format.go
        +++ /dev/null
        @@ -1,135 +0,0 @@
        -// Package format provides formatters for linter problems.
        -package format
        -
        -import (
        -	"encoding/json"
        -	"fmt"
        -	"go/token"
        -	"io"
        -	"os"
        -	"path/filepath"
        -	"text/tabwriter"
        -
        -	"honnef.co/go/tools/lint"
        -)
        -
        -func shortPath(path string) string {
        -	cwd, err := os.Getwd()
        -	if err != nil {
        -		return path
        -	}
        -	if rel, err := filepath.Rel(cwd, path); err == nil && len(rel) < len(path) {
        -		return rel
        -	}
        -	return path
        -}
        -
        -func relativePositionString(pos token.Position) string {
        -	s := shortPath(pos.Filename)
        -	if pos.IsValid() {
        -		if s != "" {
        -			s += ":"
        -		}
        -		s += fmt.Sprintf("%d:%d", pos.Line, pos.Column)
        -	}
        -	if s == "" {
        -		s = "-"
        -	}
        -	return s
        -}
        -
        -type Statter interface {
        -	Stats(total, errors, warnings int)
        -}
        -
        -type Formatter interface {
        -	Format(p lint.Problem)
        -}
        -
        -type Text struct {
        -	W io.Writer
        -}
        -
        -func (o Text) Format(p lint.Problem) {
        -	fmt.Fprintf(o.W, "%v: %s\n", relativePositionString(p.Pos), p.String())
        -}
        -
        -type JSON struct {
        -	W io.Writer
        -}
        -
        -func severity(s lint.Severity) string {
        -	switch s {
        -	case lint.Error:
        -		return "error"
        -	case lint.Warning:
        -		return "warning"
        -	case lint.Ignored:
        -		return "ignored"
        -	}
        -	return ""
        -}
        -
        -func (o JSON) Format(p lint.Problem) {
        -	type location struct {
        -		File   string `json:"file"`
        -		Line   int    `json:"line"`
        -		Column int    `json:"column"`
        -	}
        -	jp := struct {
        -		Code     string   `json:"code"`
        -		Severity string   `json:"severity,omitempty"`
        -		Location location `json:"location"`
        -		End      location `json:"end"`
        -		Message  string   `json:"message"`
        -	}{
        -		Code:     p.Check,
        -		Severity: severity(p.Severity),
        -		Location: location{
        -			File:   p.Pos.Filename,
        -			Line:   p.Pos.Line,
        -			Column: p.Pos.Column,
        -		},
        -		End: location{
        -			File:   p.End.Filename,
        -			Line:   p.End.Line,
        -			Column: p.End.Column,
        -		},
        -		Message: p.Message,
        -	}
        -	_ = json.NewEncoder(o.W).Encode(jp)
        -}
        -
        -type Stylish struct {
        -	W io.Writer
        -
        -	prevFile string
        -	tw       *tabwriter.Writer
        -}
        -
        -func (o *Stylish) Format(p lint.Problem) {
        -	pos := p.Pos
        -	if pos.Filename == "" {
        -		pos.Filename = "-"
        -	}
        -
        -	if pos.Filename != o.prevFile {
        -		if o.prevFile != "" {
        -			o.tw.Flush()
        -			fmt.Fprintln(o.W)
        -		}
        -		fmt.Fprintln(o.W, pos.Filename)
        -		o.prevFile = pos.Filename
        -		o.tw = tabwriter.NewWriter(o.W, 0, 4, 2, ' ', 0)
        -	}
        -	fmt.Fprintf(o.tw, "  (%d, %d)\t%s\t%s\n", pos.Line, pos.Column, p.Check, p.Message)
        -}
        -
        -func (o *Stylish) Stats(total, errors, warnings int) {
        -	if o.tw != nil {
        -		o.tw.Flush()
        -		fmt.Fprintln(o.W)
        -	}
        -	fmt.Fprintf(o.W, " ✖ %d problems (%d errors, %d warnings)\n",
        -		total, errors, warnings)
        -}
        diff --git a/vendor/honnef.co/go/tools/lint/lintutil/stats.go b/vendor/honnef.co/go/tools/lint/lintutil/stats.go
        deleted file mode 100644
        index ba8caf0af..000000000
        --- a/vendor/honnef.co/go/tools/lint/lintutil/stats.go
        +++ /dev/null
        @@ -1,7 +0,0 @@
        -// +build !aix,!android,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris
        -
        -package lintutil
        -
        -import "os"
        -
        -var infoSignals = []os.Signal{}
        diff --git a/vendor/honnef.co/go/tools/lint/lintutil/stats_bsd.go b/vendor/honnef.co/go/tools/lint/lintutil/stats_bsd.go
        deleted file mode 100644
        index 3a62ede03..000000000
        --- a/vendor/honnef.co/go/tools/lint/lintutil/stats_bsd.go
        +++ /dev/null
        @@ -1,10 +0,0 @@
        -// +build darwin dragonfly freebsd netbsd openbsd
        -
        -package lintutil
        -
        -import (
        -	"os"
        -	"syscall"
        -)
        -
        -var infoSignals = []os.Signal{syscall.SIGINFO}
        diff --git a/vendor/honnef.co/go/tools/lint/lintutil/stats_posix.go b/vendor/honnef.co/go/tools/lint/lintutil/stats_posix.go
        deleted file mode 100644
        index 53f21c666..000000000
        --- a/vendor/honnef.co/go/tools/lint/lintutil/stats_posix.go
        +++ /dev/null
        @@ -1,10 +0,0 @@
        -// +build aix android linux solaris
        -
        -package lintutil
        -
        -import (
        -	"os"
        -	"syscall"
        -)
        -
        -var infoSignals = []os.Signal{syscall.SIGUSR1}
        diff --git a/vendor/honnef.co/go/tools/lint/lintutil/util.go b/vendor/honnef.co/go/tools/lint/lintutil/util.go
        deleted file mode 100644
        index fe0279f92..000000000
        --- a/vendor/honnef.co/go/tools/lint/lintutil/util.go
        +++ /dev/null
        @@ -1,392 +0,0 @@
        -// Copyright (c) 2013 The Go Authors. All rights reserved.
        -//
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file or at
        -// https://developers.google.com/open-source/licenses/bsd.
        -
        -// Package lintutil provides helpers for writing linter command lines.
        -package lintutil // import "honnef.co/go/tools/lint/lintutil"
        -
        -import (
        -	"crypto/sha256"
        -	"errors"
        -	"flag"
        -	"fmt"
        -	"go/build"
        -	"go/token"
        -	"io"
        -	"log"
        -	"os"
        -	"os/signal"
        -	"regexp"
        -	"runtime"
        -	"runtime/pprof"
        -	"strconv"
        -	"strings"
        -	"sync/atomic"
        -
        -	"honnef.co/go/tools/config"
        -	"honnef.co/go/tools/internal/cache"
        -	"honnef.co/go/tools/lint"
        -	"honnef.co/go/tools/lint/lintutil/format"
        -	"honnef.co/go/tools/version"
        -
        -	"golang.org/x/tools/go/analysis"
        -	"golang.org/x/tools/go/buildutil"
        -	"golang.org/x/tools/go/packages"
        -)
        -
        -func NewVersionFlag() flag.Getter {
        -	tags := build.Default.ReleaseTags
        -	v := tags[len(tags)-1][2:]
        -	version := new(VersionFlag)
        -	if err := version.Set(v); err != nil {
        -		panic(fmt.Sprintf("internal error: %s", err))
        -	}
        -	return version
        -}
        -
        -type VersionFlag int
        -
        -func (v *VersionFlag) String() string {
        -	return fmt.Sprintf("1.%d", *v)
        -
        -}
        -
        -func (v *VersionFlag) Set(s string) error {
        -	if len(s) < 3 {
        -		return errors.New("invalid Go version")
        -	}
        -	if s[0] != '1' {
        -		return errors.New("invalid Go version")
        -	}
        -	if s[1] != '.' {
        -		return errors.New("invalid Go version")
        -	}
        -	i, err := strconv.Atoi(s[2:])
        -	*v = VersionFlag(i)
        -	return err
        -}
        -
        -func (v *VersionFlag) Get() interface{} {
        -	return int(*v)
        -}
        -
        -func usage(name string, flags *flag.FlagSet) func() {
        -	return func() {
        -		fmt.Fprintf(os.Stderr, "Usage of %s:\n", name)
        -		fmt.Fprintf(os.Stderr, "\t%s [flags] # runs on package in current directory\n", name)
        -		fmt.Fprintf(os.Stderr, "\t%s [flags] packages\n", name)
        -		fmt.Fprintf(os.Stderr, "\t%s [flags] directory\n", name)
        -		fmt.Fprintf(os.Stderr, "\t%s [flags] files... # must be a single package\n", name)
        -		fmt.Fprintf(os.Stderr, "Flags:\n")
        -		flags.PrintDefaults()
        -	}
        -}
        -
        -type list []string
        -
        -func (list *list) String() string {
        -	return `"` + strings.Join(*list, ",") + `"`
        -}
        -
        -func (list *list) Set(s string) error {
        -	if s == "" {
        -		*list = nil
        -		return nil
        -	}
        -
        -	*list = strings.Split(s, ",")
        -	return nil
        -}
        -
        -func FlagSet(name string) *flag.FlagSet {
        -	flags := flag.NewFlagSet("", flag.ExitOnError)
        -	flags.Usage = usage(name, flags)
        -	flags.String("tags", "", "List of `build tags`")
        -	flags.Bool("tests", true, "Include tests")
        -	flags.Bool("version", false, "Print version and exit")
        -	flags.Bool("show-ignored", false, "Don't filter ignored problems")
        -	flags.String("f", "text", "Output `format` (valid choices are 'stylish', 'text' and 'json')")
        -	flags.String("explain", "", "Print description of `check`")
        -
        -	flags.String("debug.cpuprofile", "", "Write CPU profile to `file`")
        -	flags.String("debug.memprofile", "", "Write memory profile to `file`")
        -	flags.Bool("debug.version", false, "Print detailed version information about this program")
        -	flags.Bool("debug.no-compile-errors", false, "Don't print compile errors")
        -
        -	checks := list{"inherit"}
        -	fail := list{"all"}
        -	flags.Var(&checks, "checks", "Comma-separated list of `checks` to enable.")
        -	flags.Var(&fail, "fail", "Comma-separated list of `checks` that can cause a non-zero exit status.")
        -
        -	tags := build.Default.ReleaseTags
        -	v := tags[len(tags)-1][2:]
        -	version := new(VersionFlag)
        -	if err := version.Set(v); err != nil {
        -		panic(fmt.Sprintf("internal error: %s", err))
        -	}
        -
        -	flags.Var(version, "go", "Target Go `version` in the format '1.x'")
        -	return flags
        -}
        -
        -func findCheck(cs []*analysis.Analyzer, check string) (*analysis.Analyzer, bool) {
        -	for _, c := range cs {
        -		if c.Name == check {
        -			return c, true
        -		}
        -	}
        -	return nil, false
        -}
        -
        -func ProcessFlagSet(cs []*analysis.Analyzer, cums []lint.CumulativeChecker, fs *flag.FlagSet) {
        -	tags := fs.Lookup("tags").Value.(flag.Getter).Get().(string)
        -	tests := fs.Lookup("tests").Value.(flag.Getter).Get().(bool)
        -	goVersion := fs.Lookup("go").Value.(flag.Getter).Get().(int)
        -	formatter := fs.Lookup("f").Value.(flag.Getter).Get().(string)
        -	printVersion := fs.Lookup("version").Value.(flag.Getter).Get().(bool)
        -	showIgnored := fs.Lookup("show-ignored").Value.(flag.Getter).Get().(bool)
        -	explain := fs.Lookup("explain").Value.(flag.Getter).Get().(string)
        -
        -	cpuProfile := fs.Lookup("debug.cpuprofile").Value.(flag.Getter).Get().(string)
        -	memProfile := fs.Lookup("debug.memprofile").Value.(flag.Getter).Get().(string)
        -	debugVersion := fs.Lookup("debug.version").Value.(flag.Getter).Get().(bool)
        -	debugNoCompile := fs.Lookup("debug.no-compile-errors").Value.(flag.Getter).Get().(bool)
        -
        -	cfg := config.Config{}
        -	cfg.Checks = *fs.Lookup("checks").Value.(*list)
        -
        -	exit := func(code int) {
        -		if cpuProfile != "" {
        -			pprof.StopCPUProfile()
        -		}
        -		if memProfile != "" {
        -			f, err := os.Create(memProfile)
        -			if err != nil {
        -				panic(err)
        -			}
        -			runtime.GC()
        -			pprof.WriteHeapProfile(f)
        -		}
        -		os.Exit(code)
        -	}
        -	if cpuProfile != "" {
        -		f, err := os.Create(cpuProfile)
        -		if err != nil {
        -			log.Fatal(err)
        -		}
        -		pprof.StartCPUProfile(f)
        -	}
        -
        -	if debugVersion {
        -		version.Verbose()
        -		exit(0)
        -	}
        -
        -	if printVersion {
        -		version.Print()
        -		exit(0)
        -	}
        -
        -	// Validate that the tags argument is well-formed. go/packages
        -	// doesn't detect malformed build flags and returns unhelpful
        -	// errors.
        -	tf := buildutil.TagsFlag{}
        -	if err := tf.Set(tags); err != nil {
        -		fmt.Fprintln(os.Stderr, fmt.Errorf("invalid value %q for flag -tags: %s", tags, err))
        -		exit(1)
        -	}
        -
        -	if explain != "" {
        -		var haystack []*analysis.Analyzer
        -		haystack = append(haystack, cs...)
        -		for _, cum := range cums {
        -			haystack = append(haystack, cum.Analyzer())
        -		}
        -		check, ok := findCheck(haystack, explain)
        -		if !ok {
        -			fmt.Fprintln(os.Stderr, "Couldn't find check", explain)
        -			exit(1)
        -		}
        -		if check.Doc == "" {
        -			fmt.Fprintln(os.Stderr, explain, "has no documentation")
        -			exit(1)
        -		}
        -		fmt.Println(check.Doc)
        -		exit(0)
        -	}
        -
        -	ps, err := Lint(cs, cums, fs.Args(), &Options{
        -		Tags:      tags,
        -		LintTests: tests,
        -		GoVersion: goVersion,
        -		Config:    cfg,
        -	})
        -	if err != nil {
        -		fmt.Fprintln(os.Stderr, err)
        -		exit(1)
        -	}
        -
        -	var f format.Formatter
        -	switch formatter {
        -	case "text":
        -		f = format.Text{W: os.Stdout}
        -	case "stylish":
        -		f = &format.Stylish{W: os.Stdout}
        -	case "json":
        -		f = format.JSON{W: os.Stdout}
        -	default:
        -		fmt.Fprintf(os.Stderr, "unsupported output format %q\n", formatter)
        -		exit(2)
        -	}
        -
        -	var (
        -		total    int
        -		errors   int
        -		warnings int
        -	)
        -
        -	fail := *fs.Lookup("fail").Value.(*list)
        -	analyzers := make([]*analysis.Analyzer, len(cs), len(cs)+len(cums))
        -	copy(analyzers, cs)
        -	for _, cum := range cums {
        -		analyzers = append(analyzers, cum.Analyzer())
        -	}
        -	shouldExit := lint.FilterChecks(analyzers, fail)
        -	shouldExit["compile"] = true
        -
        -	total = len(ps)
        -	for _, p := range ps {
        -		if p.Check == "compile" && debugNoCompile {
        -			continue
        -		}
        -		if p.Severity == lint.Ignored && !showIgnored {
        -			continue
        -		}
        -		if shouldExit[p.Check] {
        -			errors++
        -		} else {
        -			p.Severity = lint.Warning
        -			warnings++
        -		}
        -		f.Format(p)
        -	}
        -	if f, ok := f.(format.Statter); ok {
        -		f.Stats(total, errors, warnings)
        -	}
        -	if errors > 0 {
        -		exit(1)
        -	}
        -	exit(0)
        -}
        -
        -type Options struct {
        -	Config config.Config
        -
        -	Tags      string
        -	LintTests bool
        -	GoVersion int
        -}
        -
        -func computeSalt() ([]byte, error) {
        -	if version.Version != "devel" {
        -		return []byte(version.Version), nil
        -	}
        -	p, err := os.Executable()
        -	if err != nil {
        -		return nil, err
        -	}
        -	f, err := os.Open(p)
        -	if err != nil {
        -		return nil, err
        -	}
        -	defer f.Close()
        -	h := sha256.New()
        -	if _, err := io.Copy(h, f); err != nil {
        -		return nil, err
        -	}
        -	return h.Sum(nil), nil
        -}
        -
        -func Lint(cs []*analysis.Analyzer, cums []lint.CumulativeChecker, paths []string, opt *Options) ([]lint.Problem, error) {
        -	salt, err := computeSalt()
        -	if err != nil {
        -		return nil, fmt.Errorf("could not compute salt for cache: %s", err)
        -	}
        -	cache.SetSalt(salt)
        -
        -	if opt == nil {
        -		opt = &Options{}
        -	}
        -
        -	l := &lint.Linter{
        -		Checkers:           cs,
        -		CumulativeCheckers: cums,
        -		GoVersion:          opt.GoVersion,
        -		Config:             opt.Config,
        -	}
        -	cfg := &packages.Config{}
        -	if opt.LintTests {
        -		cfg.Tests = true
        -	}
        -	if opt.Tags != "" {
        -		cfg.BuildFlags = append(cfg.BuildFlags, "-tags", opt.Tags)
        -	}
        -
        -	printStats := func() {
        -		// Individual stats are read atomically, but overall there
        -		// is no synchronisation. For printing rough progress
        -		// information, this doesn't matter.
        -		switch atomic.LoadUint32(&l.Stats.State) {
        -		case lint.StateInitializing:
        -			fmt.Fprintln(os.Stderr, "Status: initializing")
        -		case lint.StateGraph:
        -			fmt.Fprintln(os.Stderr, "Status: loading package graph")
        -		case lint.StateProcessing:
        -			fmt.Fprintf(os.Stderr, "Packages: %d/%d initial, %d/%d total; Workers: %d/%d; Problems: %d\n",
        -				atomic.LoadUint32(&l.Stats.ProcessedInitialPackages),
        -				atomic.LoadUint32(&l.Stats.InitialPackages),
        -				atomic.LoadUint32(&l.Stats.ProcessedPackages),
        -				atomic.LoadUint32(&l.Stats.TotalPackages),
        -				atomic.LoadUint32(&l.Stats.ActiveWorkers),
        -				atomic.LoadUint32(&l.Stats.TotalWorkers),
        -				atomic.LoadUint32(&l.Stats.Problems),
        -			)
        -		case lint.StateCumulative:
        -			fmt.Fprintln(os.Stderr, "Status: processing cumulative checkers")
        -		}
        -	}
        -	if len(infoSignals) > 0 {
        -		ch := make(chan os.Signal, 1)
        -		signal.Notify(ch, infoSignals...)
        -		defer signal.Stop(ch)
        -		go func() {
        -			for range ch {
        -				printStats()
        -			}
        -		}()
        -	}
        -
        -	return l.Lint(cfg, paths)
        -}
        -
        -var posRe = regexp.MustCompile(`^(.+?):(\d+)(?::(\d+)?)?$`)
        -
        -func parsePos(pos string) token.Position {
        -	if pos == "-" || pos == "" {
        -		return token.Position{}
        -	}
        -	parts := posRe.FindStringSubmatch(pos)
        -	if parts == nil {
        -		panic(fmt.Sprintf("internal error: malformed position %q", pos))
        -	}
        -	file := parts[1]
        -	line, _ := strconv.Atoi(parts[2])
        -	col, _ := strconv.Atoi(parts[3])
        -	return token.Position{
        -		Filename: file,
        -		Line:     line,
        -		Column:   col,
        -	}
        -}
        diff --git a/vendor/honnef.co/go/tools/lint/runner.go b/vendor/honnef.co/go/tools/lint/runner.go
        deleted file mode 100644
        index 3b22a63fa..000000000
        --- a/vendor/honnef.co/go/tools/lint/runner.go
        +++ /dev/null
        @@ -1,970 +0,0 @@
        -package lint
        -
        -/*
        -Parallelism
        -
        -Runner implements parallel processing of packages by spawning one
        -goroutine per package in the dependency graph, without any semaphores.
        -Each goroutine initially waits on the completion of all of its
        -dependencies, thus establishing correct order of processing. Once all
        -dependencies finish processing, the goroutine will load the package
        -from export data or source – this loading is guarded by a semaphore,
        -sized according to the number of CPU cores. This way, we only have as
        -many packages occupying memory and CPU resources as there are actual
        -cores to process them.
        -
        -This combination of unbounded goroutines but bounded package loading
        -means that if we have many parallel, independent subgraphs, they will
        -all execute in parallel, while not wasting resources for long linear
        -chains or trying to process more subgraphs in parallel than the system
        -can handle.
        -
        -*/
        -
        -import (
        -	"bytes"
        -	"encoding/gob"
        -	"encoding/hex"
        -	"fmt"
        -	"go/ast"
        -	"go/token"
        -	"go/types"
        -	"reflect"
        -	"regexp"
        -	"runtime"
        -	"sort"
        -	"strconv"
        -	"strings"
        -	"sync"
        -	"sync/atomic"
        -
        -	"golang.org/x/tools/go/analysis"
        -	"golang.org/x/tools/go/packages"
        -	"golang.org/x/tools/go/types/objectpath"
        -	"honnef.co/go/tools/config"
        -	"honnef.co/go/tools/facts"
        -	"honnef.co/go/tools/internal/cache"
        -	"honnef.co/go/tools/loader"
        -)
        -
        -// If enabled, abuse of the go/analysis API will lead to panics
        -const sanityCheck = true
        -
        -// OPT(dh): for a dependency tree A->B->C->D, if we have cached data
        -// for B, there should be no need to load C and D individually. Go's
        -// export data for B contains all the data we need on types, and our
        -// fact cache could store the union of B, C and D in B.
        -//
        -// This may change unused's behavior, however, as it may observe fewer
        -// interfaces from transitive dependencies.
        -
        -type Package struct {
        -	dependents uint64
        -
        -	*packages.Package
        -	Imports    []*Package
        -	initial    bool
        -	fromSource bool
        -	hash       string
        -	done       chan struct{}
        -
        -	resultsMu sync.Mutex
        -	// results maps analyzer IDs to analyzer results
        -	results []*result
        -
        -	cfg      *config.Config
        -	gen      map[string]facts.Generator
        -	problems []Problem
        -	ignores  []Ignore
        -	errs     []error
        -
        -	// these slices are indexed by analysis
        -	facts    []map[types.Object][]analysis.Fact
        -	pkgFacts [][]analysis.Fact
        -
        -	canClearTypes bool
        -}
        -
        -func (pkg *Package) decUse() {
        -	atomic.AddUint64(&pkg.dependents, ^uint64(0))
        -	if atomic.LoadUint64(&pkg.dependents) == 0 {
        -		// nobody depends on this package anymore
        -		if pkg.canClearTypes {
        -			pkg.Types = nil
        -		}
        -		pkg.facts = nil
        -		pkg.pkgFacts = nil
        -
        -		for _, imp := range pkg.Imports {
        -			imp.decUse()
        -		}
        -	}
        -}
        -
        -type result struct {
        -	v     interface{}
        -	err   error
        -	ready chan struct{}
        -}
        -
        -type Runner struct {
        -	ld    loader.Loader
        -	cache *cache.Cache
        -
        -	analyzerIDs analyzerIDs
        -
        -	// limits parallelism of loading packages
        -	loadSem chan struct{}
        -
        -	goVersion int
        -	stats     *Stats
        -}
        -
        -type analyzerIDs struct {
        -	m map[*analysis.Analyzer]int
        -}
        -
        -func (ids analyzerIDs) get(a *analysis.Analyzer) int {
        -	id, ok := ids.m[a]
        -	if !ok {
        -		panic(fmt.Sprintf("no analyzer ID for %s", a.Name))
        -	}
        -	return id
        -}
        -
        -type Fact struct {
        -	Path string
        -	Fact analysis.Fact
        -}
        -
        -type analysisAction struct {
        -	analyzer        *analysis.Analyzer
        -	analyzerID      int
        -	pkg             *Package
        -	newPackageFacts []analysis.Fact
        -	problems        []Problem
        -
        -	pkgFacts map[*types.Package][]analysis.Fact
        -}
        -
        -func (ac *analysisAction) String() string {
        -	return fmt.Sprintf("%s @ %s", ac.analyzer, ac.pkg)
        -}
        -
        -func (ac *analysisAction) allObjectFacts() []analysis.ObjectFact {
        -	out := make([]analysis.ObjectFact, 0, len(ac.pkg.facts[ac.analyzerID]))
        -	for obj, facts := range ac.pkg.facts[ac.analyzerID] {
        -		for _, fact := range facts {
        -			out = append(out, analysis.ObjectFact{
        -				Object: obj,
        -				Fact:   fact,
        -			})
        -		}
        -	}
        -	return out
        -}
        -
        -func (ac *analysisAction) allPackageFacts() []analysis.PackageFact {
        -	out := make([]analysis.PackageFact, 0, len(ac.pkgFacts))
        -	for pkg, facts := range ac.pkgFacts {
        -		for _, fact := range facts {
        -			out = append(out, analysis.PackageFact{
        -				Package: pkg,
        -				Fact:    fact,
        -			})
        -		}
        -	}
        -	return out
        -}
        -
        -func (ac *analysisAction) importObjectFact(obj types.Object, fact analysis.Fact) bool {
        -	if sanityCheck && len(ac.analyzer.FactTypes) == 0 {
        -		panic("analysis doesn't export any facts")
        -	}
        -	for _, f := range ac.pkg.facts[ac.analyzerID][obj] {
        -		if reflect.TypeOf(f) == reflect.TypeOf(fact) {
        -			reflect.ValueOf(fact).Elem().Set(reflect.ValueOf(f).Elem())
        -			return true
        -		}
        -	}
        -	return false
        -}
        -
        -func (ac *analysisAction) importPackageFact(pkg *types.Package, fact analysis.Fact) bool {
        -	if sanityCheck && len(ac.analyzer.FactTypes) == 0 {
        -		panic("analysis doesn't export any facts")
        -	}
        -	for _, f := range ac.pkgFacts[pkg] {
        -		if reflect.TypeOf(f) == reflect.TypeOf(fact) {
        -			reflect.ValueOf(fact).Elem().Set(reflect.ValueOf(f).Elem())
        -			return true
        -		}
        -	}
        -	return false
        -}
        -
        -func (ac *analysisAction) exportObjectFact(obj types.Object, fact analysis.Fact) {
        -	if sanityCheck && len(ac.analyzer.FactTypes) == 0 {
        -		panic("analysis doesn't export any facts")
        -	}
        -	ac.pkg.facts[ac.analyzerID][obj] = append(ac.pkg.facts[ac.analyzerID][obj], fact)
        -}
        -
        -func (ac *analysisAction) exportPackageFact(fact analysis.Fact) {
        -	if sanityCheck && len(ac.analyzer.FactTypes) == 0 {
        -		panic("analysis doesn't export any facts")
        -	}
        -	ac.pkgFacts[ac.pkg.Types] = append(ac.pkgFacts[ac.pkg.Types], fact)
        -	ac.newPackageFacts = append(ac.newPackageFacts, fact)
        -}
        -
        -func (ac *analysisAction) report(pass *analysis.Pass, d analysis.Diagnostic) {
        -	p := Problem{
        -		Pos:     DisplayPosition(pass.Fset, d.Pos),
        -		End:     DisplayPosition(pass.Fset, d.End),
        -		Message: d.Message,
        -		Check:   pass.Analyzer.Name,
        -	}
        -	ac.problems = append(ac.problems, p)
        -}
        -
        -func (r *Runner) runAnalysis(ac *analysisAction) (ret interface{}, err error) {
        -	ac.pkg.resultsMu.Lock()
        -	res := ac.pkg.results[r.analyzerIDs.get(ac.analyzer)]
        -	if res != nil {
        -		ac.pkg.resultsMu.Unlock()
        -		<-res.ready
        -		return res.v, res.err
        -	} else {
        -		res = &result{
        -			ready: make(chan struct{}),
        -		}
        -		ac.pkg.results[r.analyzerIDs.get(ac.analyzer)] = res
        -		ac.pkg.resultsMu.Unlock()
        -
        -		defer func() {
        -			res.v = ret
        -			res.err = err
        -			close(res.ready)
        -		}()
        -
        -		pass := new(analysis.Pass)
        -		*pass = analysis.Pass{
        -			Analyzer: ac.analyzer,
        -			Fset:     ac.pkg.Fset,
        -			Files:    ac.pkg.Syntax,
        -			// type information may be nil or may be populated. if it is
        -			// nil, it will get populated later.
        -			Pkg:               ac.pkg.Types,
        -			TypesInfo:         ac.pkg.TypesInfo,
        -			TypesSizes:        ac.pkg.TypesSizes,
        -			ResultOf:          map[*analysis.Analyzer]interface{}{},
        -			ImportObjectFact:  ac.importObjectFact,
        -			ImportPackageFact: ac.importPackageFact,
        -			ExportObjectFact:  ac.exportObjectFact,
        -			ExportPackageFact: ac.exportPackageFact,
        -			Report: func(d analysis.Diagnostic) {
        -				ac.report(pass, d)
        -			},
        -			AllObjectFacts:  ac.allObjectFacts,
        -			AllPackageFacts: ac.allPackageFacts,
        -		}
        -
        -		if !ac.pkg.initial {
        -			// Don't report problems in dependencies
        -			pass.Report = func(analysis.Diagnostic) {}
        -		}
        -		return r.runAnalysisUser(pass, ac)
        -	}
        -}
        -
        -func (r *Runner) loadCachedFacts(a *analysis.Analyzer, pkg *Package) ([]Fact, bool) {
        -	if len(a.FactTypes) == 0 {
        -		return nil, true
        -	}
        -
        -	var facts []Fact
        -	// Look in the cache for facts
        -	aID, err := passActionID(pkg, a)
        -	if err != nil {
        -		return nil, false
        -	}
        -	aID = cache.Subkey(aID, "facts")
        -	b, _, err := r.cache.GetBytes(aID)
        -	if err != nil {
        -		// No cached facts, analyse this package like a user-provided one, but ignore diagnostics
        -		return nil, false
        -	}
        -
        -	if err := gob.NewDecoder(bytes.NewReader(b)).Decode(&facts); err != nil {
        -		// Cached facts are broken, analyse this package like a user-provided one, but ignore diagnostics
        -		return nil, false
        -	}
        -	return facts, true
        -}
        -
        -type dependencyError struct {
        -	dep string
        -	err error
        -}
        -
        -func (err dependencyError) nested() dependencyError {
        -	if o, ok := err.err.(dependencyError); ok {
        -		return o.nested()
        -	}
        -	return err
        -}
        -
        -func (err dependencyError) Error() string {
        -	if o, ok := err.err.(dependencyError); ok {
        -		return o.Error()
        -	}
        -	return fmt.Sprintf("error running dependency %s: %s", err.dep, err.err)
        -}
        -
        -func (r *Runner) makeAnalysisAction(a *analysis.Analyzer, pkg *Package) *analysisAction {
        -	aid := r.analyzerIDs.get(a)
        -	ac := &analysisAction{
        -		analyzer:   a,
        -		analyzerID: aid,
        -		pkg:        pkg,
        -	}
        -
        -	if len(a.FactTypes) == 0 {
        -		return ac
        -	}
        -
        -	// Merge all package facts of dependencies
        -	ac.pkgFacts = map[*types.Package][]analysis.Fact{}
        -	seen := map[*Package]struct{}{}
        -	var dfs func(*Package)
        -	dfs = func(pkg *Package) {
        -		if _, ok := seen[pkg]; ok {
        -			return
        -		}
        -		seen[pkg] = struct{}{}
        -		s := pkg.pkgFacts[aid]
        -		ac.pkgFacts[pkg.Types] = s[0:len(s):len(s)]
        -		for _, imp := range pkg.Imports {
        -			dfs(imp)
        -		}
        -	}
        -	dfs(pkg)
        -
        -	return ac
        -}
        -
        -// analyzes that we always want to run, even if they're not being run
        -// explicitly or as dependencies. these are necessary for the inner
        -// workings of the runner.
        -var injectedAnalyses = []*analysis.Analyzer{facts.Generated, config.Analyzer}
        -
        -func (r *Runner) runAnalysisUser(pass *analysis.Pass, ac *analysisAction) (interface{}, error) {
        -	if !ac.pkg.fromSource {
        -		panic(fmt.Sprintf("internal error: %s was not loaded from source", ac.pkg))
        -	}
        -
        -	// User-provided package, analyse it
        -	// First analyze it with dependencies
        -	for _, req := range ac.analyzer.Requires {
        -		acReq := r.makeAnalysisAction(req, ac.pkg)
        -		ret, err := r.runAnalysis(acReq)
        -		if err != nil {
        -			// We couldn't run a dependency, no point in going on
        -			return nil, dependencyError{req.Name, err}
        -		}
        -
        -		pass.ResultOf[req] = ret
        -	}
        -
        -	// Then with this analyzer
        -	ret, err := ac.analyzer.Run(pass)
        -	if err != nil {
        -		return nil, err
        -	}
        -
        -	if len(ac.analyzer.FactTypes) > 0 {
        -		// Merge new facts into the package and persist them.
        -		var facts []Fact
        -		for _, fact := range ac.newPackageFacts {
        -			id := r.analyzerIDs.get(ac.analyzer)
        -			ac.pkg.pkgFacts[id] = append(ac.pkg.pkgFacts[id], fact)
        -			facts = append(facts, Fact{"", fact})
        -		}
        -		for obj, afacts := range ac.pkg.facts[ac.analyzerID] {
        -			if obj.Pkg() != ac.pkg.Package.Types {
        -				continue
        -			}
        -			path, err := objectpath.For(obj)
        -			if err != nil {
        -				continue
        -			}
        -			for _, fact := range afacts {
        -				facts = append(facts, Fact{string(path), fact})
        -			}
        -		}
        -
        -		buf := &bytes.Buffer{}
        -		if err := gob.NewEncoder(buf).Encode(facts); err != nil {
        -			return nil, err
        -		}
        -		aID, err := passActionID(ac.pkg, ac.analyzer)
        -		if err != nil {
        -			return nil, err
        -		}
        -		aID = cache.Subkey(aID, "facts")
        -		if err := r.cache.PutBytes(aID, buf.Bytes()); err != nil {
        -			return nil, err
        -		}
        -	}
        -
        -	return ret, nil
        -}
        -
        -func NewRunner(stats *Stats) (*Runner, error) {
        -	cache, err := cache.Default()
        -	if err != nil {
        -		return nil, err
        -	}
        -
        -	return &Runner{
        -		cache: cache,
        -		stats: stats,
        -	}, nil
        -}
        -
        -// Run loads packages corresponding to patterns and analyses them with
        -// analyzers. It returns the loaded packages, which contain reported
        -// diagnostics as well as extracted ignore directives.
        -//
        -// Note that diagnostics have not been filtered at this point yet, to
        -// accomodate cumulative analyzes that require additional steps to
        -// produce diagnostics.
        -func (r *Runner) Run(cfg *packages.Config, patterns []string, analyzers []*analysis.Analyzer, hasCumulative bool) ([]*Package, error) {
        -	r.analyzerIDs = analyzerIDs{m: map[*analysis.Analyzer]int{}}
        -	id := 0
        -	seen := map[*analysis.Analyzer]struct{}{}
        -	var dfs func(a *analysis.Analyzer)
        -	dfs = func(a *analysis.Analyzer) {
        -		if _, ok := seen[a]; ok {
        -			return
        -		}
        -		seen[a] = struct{}{}
        -		r.analyzerIDs.m[a] = id
        -		id++
        -		for _, f := range a.FactTypes {
        -			gob.Register(f)
        -		}
        -		for _, req := range a.Requires {
        -			dfs(req)
        -		}
        -	}
        -	for _, a := range analyzers {
        -		if v := a.Flags.Lookup("go"); v != nil {
        -			v.Value.Set(fmt.Sprintf("1.%d", r.goVersion))
        -		}
        -		dfs(a)
        -	}
        -	for _, a := range injectedAnalyses {
        -		dfs(a)
        -	}
        -
        -	var dcfg packages.Config
        -	if cfg != nil {
        -		dcfg = *cfg
        -	}
        -
        -	atomic.StoreUint32(&r.stats.State, StateGraph)
        -	initialPkgs, err := r.ld.Graph(dcfg, patterns...)
        -	if err != nil {
        -		return nil, err
        -	}
        -
        -	defer r.cache.Trim()
        -
        -	var allPkgs []*Package
        -	m := map[*packages.Package]*Package{}
        -	packages.Visit(initialPkgs, nil, func(l *packages.Package) {
        -		m[l] = &Package{
        -			Package:  l,
        -			results:  make([]*result, len(r.analyzerIDs.m)),
        -			facts:    make([]map[types.Object][]analysis.Fact, len(r.analyzerIDs.m)),
        -			pkgFacts: make([][]analysis.Fact, len(r.analyzerIDs.m)),
        -			done:     make(chan struct{}),
        -			// every package needs itself
        -			dependents:    1,
        -			canClearTypes: !hasCumulative,
        -		}
        -		allPkgs = append(allPkgs, m[l])
        -		for i := range m[l].facts {
        -			m[l].facts[i] = map[types.Object][]analysis.Fact{}
        -		}
        -		for _, err := range l.Errors {
        -			m[l].errs = append(m[l].errs, err)
        -		}
        -		for _, v := range l.Imports {
        -			m[v].dependents++
        -			m[l].Imports = append(m[l].Imports, m[v])
        -		}
        -
        -		m[l].hash, err = packageHash(m[l])
        -		if err != nil {
        -			m[l].errs = append(m[l].errs, err)
        -		}
        -	})
        -
        -	pkgs := make([]*Package, len(initialPkgs))
        -	for i, l := range initialPkgs {
        -		pkgs[i] = m[l]
        -		pkgs[i].initial = true
        -	}
        -
        -	atomic.StoreUint32(&r.stats.InitialPackages, uint32(len(initialPkgs)))
        -	atomic.StoreUint32(&r.stats.TotalPackages, uint32(len(allPkgs)))
        -	atomic.StoreUint32(&r.stats.State, StateProcessing)
        -
        -	var wg sync.WaitGroup
        -	wg.Add(len(allPkgs))
        -	r.loadSem = make(chan struct{}, runtime.GOMAXPROCS(-1))
        -	atomic.StoreUint32(&r.stats.TotalWorkers, uint32(cap(r.loadSem)))
        -	for _, pkg := range allPkgs {
        -		pkg := pkg
        -		go func() {
        -			r.processPkg(pkg, analyzers)
        -
        -			if pkg.initial {
        -				atomic.AddUint32(&r.stats.ProcessedInitialPackages, 1)
        -			}
        -			atomic.AddUint32(&r.stats.Problems, uint32(len(pkg.problems)))
        -			wg.Done()
        -		}()
        -	}
        -	wg.Wait()
        -
        -	return pkgs, nil
        -}
        -
        -var posRe = regexp.MustCompile(`^(.+?):(\d+)(?::(\d+)?)?`)
        -
        -func parsePos(pos string) (token.Position, int, error) {
        -	if pos == "-" || pos == "" {
        -		return token.Position{}, 0, nil
        -	}
        -	parts := posRe.FindStringSubmatch(pos)
        -	if parts == nil {
        -		return token.Position{}, 0, fmt.Errorf("malformed position %q", pos)
        -	}
        -	file := parts[1]
        -	line, _ := strconv.Atoi(parts[2])
        -	col, _ := strconv.Atoi(parts[3])
        -	return token.Position{
        -		Filename: file,
        -		Line:     line,
        -		Column:   col,
        -	}, len(parts[0]), nil
        -}
        -
        -// loadPkg loads a Go package. If the package is in the set of initial
        -// packages, it will be loaded from source, otherwise it will be
        -// loaded from export data. In the case that the package was loaded
        -// from export data, cached facts will also be loaded.
        -//
        -// Currently, only cached facts for this package will be loaded, not
        -// for any of its dependencies.
        -func (r *Runner) loadPkg(pkg *Package, analyzers []*analysis.Analyzer) error {
        -	if pkg.Types != nil {
        -		panic(fmt.Sprintf("internal error: %s has already been loaded", pkg.Package))
        -	}
        -
        -	// Load type information
        -	if pkg.initial {
        -		// Load package from source
        -		pkg.fromSource = true
        -		return r.ld.LoadFromSource(pkg.Package)
        -	}
        -
        -	// Load package from export data
        -	if err := r.ld.LoadFromExport(pkg.Package); err != nil {
        -		// We asked Go to give us up to date export data, yet
        -		// we can't load it. There must be something wrong.
        -		//
        -		// Attempt loading from source. This should fail (because
        -		// otherwise there would be export data); we just want to
        -		// get the compile errors. If loading from source succeeds
        -		// we discard the result, anyway. Otherwise we'll fail
        -		// when trying to reload from export data later.
        -		//
        -		// FIXME(dh): we no longer reload from export data, so
        -		// theoretically we should be able to continue
        -		pkg.fromSource = true
        -		if err := r.ld.LoadFromSource(pkg.Package); err != nil {
        -			return err
        -		}
        -		// Make sure this package can't be imported successfully
        -		pkg.Package.Errors = append(pkg.Package.Errors, packages.Error{
        -			Pos:  "-",
        -			Msg:  fmt.Sprintf("could not load export data: %s", err),
        -			Kind: packages.ParseError,
        -		})
        -		return fmt.Errorf("could not load export data: %s", err)
        -	}
        -
        -	failed := false
        -	seen := make([]bool, len(r.analyzerIDs.m))
        -	var dfs func(*analysis.Analyzer)
        -	dfs = func(a *analysis.Analyzer) {
        -		if seen[r.analyzerIDs.get(a)] {
        -			return
        -		}
        -		seen[r.analyzerIDs.get(a)] = true
        -
        -		if len(a.FactTypes) > 0 {
        -			facts, ok := r.loadCachedFacts(a, pkg)
        -			if !ok {
        -				failed = true
        -				return
        -			}
        -
        -			for _, f := range facts {
        -				if f.Path == "" {
        -					// This is a package fact
        -					pkg.pkgFacts[r.analyzerIDs.get(a)] = append(pkg.pkgFacts[r.analyzerIDs.get(a)], f.Fact)
        -					continue
        -				}
        -				obj, err := objectpath.Object(pkg.Types, objectpath.Path(f.Path))
        -				if err != nil {
        -					// Be lenient about these errors. For example, when
        -					// analysing io/ioutil from source, we may get a fact
        -					// for methods on the devNull type, and objectpath
        -					// will happily create a path for them. However, when
        -					// we later load io/ioutil from export data, the path
        -					// no longer resolves.
        -					//
        -					// If an exported type embeds the unexported type,
        -					// then (part of) the unexported type will become part
        -					// of the type information and our path will resolve
        -					// again.
        -					continue
        -				}
        -				pkg.facts[r.analyzerIDs.get(a)][obj] = append(pkg.facts[r.analyzerIDs.get(a)][obj], f.Fact)
        -			}
        -		}
        -
        -		for _, req := range a.Requires {
        -			dfs(req)
        -		}
        -	}
        -	for _, a := range analyzers {
        -		dfs(a)
        -	}
        -
        -	if failed {
        -		pkg.fromSource = true
        -		// XXX we added facts to the maps, we need to get rid of those
        -		return r.ld.LoadFromSource(pkg.Package)
        -	}
        -
        -	return nil
        -}
        -
        -type analysisError struct {
        -	analyzer *analysis.Analyzer
        -	pkg      *Package
        -	err      error
        -}
        -
        -func (err analysisError) Error() string {
        -	return fmt.Sprintf("error running analyzer %s on %s: %s", err.analyzer, err.pkg, err.err)
        -}
        -
        -// processPkg processes a package. This involves loading the package,
        -// either from export data or from source. For packages loaded from
        -// source, the provides analyzers will be run on the package.
        -func (r *Runner) processPkg(pkg *Package, analyzers []*analysis.Analyzer) {
        -	defer func() {
        -		// Clear information we no longer need. Make sure to do this
        -		// when returning from processPkg so that we clear
        -		// dependencies, not just initial packages.
        -		pkg.TypesInfo = nil
        -		pkg.Syntax = nil
        -		pkg.results = nil
        -
        -		atomic.AddUint32(&r.stats.ProcessedPackages, 1)
        -		pkg.decUse()
        -		close(pkg.done)
        -	}()
        -
        -	// Ensure all packages have the generated map and config. This is
        -	// required by interna of the runner. Analyses that themselves
        -	// make use of either have an explicit dependency so that other
        -	// runners work correctly, too.
        -	analyzers = append(analyzers[0:len(analyzers):len(analyzers)], injectedAnalyses...)
        -
        -	if len(pkg.errs) != 0 {
        -		return
        -	}
        -
        -	for _, imp := range pkg.Imports {
        -		<-imp.done
        -		if len(imp.errs) > 0 {
        -			if imp.initial {
        -				// Don't print the error of the dependency since it's
        -				// an initial package and we're already printing the
        -				// error.
        -				pkg.errs = append(pkg.errs, fmt.Errorf("could not analyze dependency %s of %s", imp, pkg))
        -			} else {
        -				var s string
        -				for _, err := range imp.errs {
        -					s += "\n\t" + err.Error()
        -				}
        -				pkg.errs = append(pkg.errs, fmt.Errorf("could not analyze dependency %s of %s: %s", imp, pkg, s))
        -			}
        -			return
        -		}
        -	}
        -	if pkg.PkgPath == "unsafe" {
        -		pkg.Types = types.Unsafe
        -		return
        -	}
        -
        -	r.loadSem <- struct{}{}
        -	atomic.AddUint32(&r.stats.ActiveWorkers, 1)
        -	defer func() {
        -		<-r.loadSem
        -		atomic.AddUint32(&r.stats.ActiveWorkers, ^uint32(0))
        -	}()
        -	if err := r.loadPkg(pkg, analyzers); err != nil {
        -		pkg.errs = append(pkg.errs, err)
        -		return
        -	}
        -
        -	// A package's object facts is the union of all of its dependencies.
        -	for _, imp := range pkg.Imports {
        -		for ai, m := range imp.facts {
        -			for obj, facts := range m {
        -				pkg.facts[ai][obj] = facts[0:len(facts):len(facts)]
        -			}
        -		}
        -	}
        -
        -	if !pkg.fromSource {
        -		// Nothing left to do for the package.
        -		return
        -	}
        -
        -	// Run analyses on initial packages and those missing facts
        -	var wg sync.WaitGroup
        -	wg.Add(len(analyzers))
        -	errs := make([]error, len(analyzers))
        -	var acs []*analysisAction
        -	for i, a := range analyzers {
        -		i := i
        -		a := a
        -		ac := r.makeAnalysisAction(a, pkg)
        -		acs = append(acs, ac)
        -		go func() {
        -			defer wg.Done()
        -			// Only initial packages and packages with missing
        -			// facts will have been loaded from source.
        -			if pkg.initial || r.hasFacts(a) {
        -				if _, err := r.runAnalysis(ac); err != nil {
        -					errs[i] = analysisError{a, pkg, err}
        -					return
        -				}
        -			}
        -		}()
        -	}
        -	wg.Wait()
        -
        -	depErrors := map[dependencyError]int{}
        -	for _, err := range errs {
        -		if err == nil {
        -			continue
        -		}
        -		switch err := err.(type) {
        -		case analysisError:
        -			switch err := err.err.(type) {
        -			case dependencyError:
        -				depErrors[err.nested()]++
        -			default:
        -				pkg.errs = append(pkg.errs, err)
        -			}
        -		default:
        -			pkg.errs = append(pkg.errs, err)
        -		}
        -	}
        -	for err, count := range depErrors {
        -		pkg.errs = append(pkg.errs,
        -			fmt.Errorf("could not run %s@%s, preventing %d analyzers from running: %s", err.dep, pkg, count, err.err))
        -	}
        -
        -	// We can't process ignores at this point because `unused` needs
        -	// to see more than one package to make its decision.
        -	ignores, problems := parseDirectives(pkg.Package)
        -	pkg.ignores = append(pkg.ignores, ignores...)
        -	pkg.problems = append(pkg.problems, problems...)
        -	for _, ac := range acs {
        -		pkg.problems = append(pkg.problems, ac.problems...)
        -	}
        -
        -	if pkg.initial {
        -		// Only initial packages have these analyzers run, and only
        -		// initial packages need these.
        -		if pkg.results[r.analyzerIDs.get(config.Analyzer)].v != nil {
        -			pkg.cfg = pkg.results[r.analyzerIDs.get(config.Analyzer)].v.(*config.Config)
        -		}
        -		pkg.gen = pkg.results[r.analyzerIDs.get(facts.Generated)].v.(map[string]facts.Generator)
        -	}
        -
        -	// In a previous version of the code, we would throw away all type
        -	// information and reload it from export data. That was
        -	// nonsensical. The *types.Package doesn't keep any information
        -	// live that export data wouldn't also. We only need to discard
        -	// the AST and the TypesInfo maps; that happens after we return
        -	// from processPkg.
        -}
        -
        -// hasFacts reports whether an analysis exports any facts. An analysis
        -// that has a transitive dependency that exports facts is considered
        -// to be exporting facts.
        -func (r *Runner) hasFacts(a *analysis.Analyzer) bool {
        -	ret := false
        -	seen := make([]bool, len(r.analyzerIDs.m))
        -	var dfs func(*analysis.Analyzer)
        -	dfs = func(a *analysis.Analyzer) {
        -		if seen[r.analyzerIDs.get(a)] {
        -			return
        -		}
        -		seen[r.analyzerIDs.get(a)] = true
        -		if len(a.FactTypes) > 0 {
        -			ret = true
        -		}
        -		for _, req := range a.Requires {
        -			if ret {
        -				break
        -			}
        -			dfs(req)
        -		}
        -	}
        -	dfs(a)
        -	return ret
        -}
        -
        -func parseDirective(s string) (cmd string, args []string) {
        -	if !strings.HasPrefix(s, "//lint:") {
        -		return "", nil
        -	}
        -	s = strings.TrimPrefix(s, "//lint:")
        -	fields := strings.Split(s, " ")
        -	return fields[0], fields[1:]
        -}
        -
        -// parseDirectives extracts all linter directives from the source
        -// files of the package. Malformed directives are returned as problems.
        -func parseDirectives(pkg *packages.Package) ([]Ignore, []Problem) {
        -	var ignores []Ignore
        -	var problems []Problem
        -
        -	for _, f := range pkg.Syntax {
        -		found := false
        -	commentLoop:
        -		for _, cg := range f.Comments {
        -			for _, c := range cg.List {
        -				if strings.Contains(c.Text, "//lint:") {
        -					found = true
        -					break commentLoop
        -				}
        -			}
        -		}
        -		if !found {
        -			continue
        -		}
        -		cm := ast.NewCommentMap(pkg.Fset, f, f.Comments)
        -		for node, cgs := range cm {
        -			for _, cg := range cgs {
        -				for _, c := range cg.List {
        -					if !strings.HasPrefix(c.Text, "//lint:") {
        -						continue
        -					}
        -					cmd, args := parseDirective(c.Text)
        -					switch cmd {
        -					case "ignore", "file-ignore":
        -						if len(args) < 2 {
        -							p := Problem{
        -								Pos:      DisplayPosition(pkg.Fset, c.Pos()),
        -								Message:  "malformed linter directive; missing the required reason field?",
        -								Severity: Error,
        -								Check:    "compile",
        -							}
        -							problems = append(problems, p)
        -							continue
        -						}
        -					default:
        -						// unknown directive, ignore
        -						continue
        -					}
        -					checks := strings.Split(args[0], ",")
        -					pos := DisplayPosition(pkg.Fset, node.Pos())
        -					var ig Ignore
        -					switch cmd {
        -					case "ignore":
        -						ig = &LineIgnore{
        -							File:   pos.Filename,
        -							Line:   pos.Line,
        -							Checks: checks,
        -							Pos:    c.Pos(),
        -						}
        -					case "file-ignore":
        -						ig = &FileIgnore{
        -							File:   pos.Filename,
        -							Checks: checks,
        -						}
        -					}
        -					ignores = append(ignores, ig)
        -				}
        -			}
        -		}
        -	}
        -
        -	return ignores, problems
        -}
        -
        -// packageHash computes a package's hash. The hash is based on all Go
        -// files that make up the package, as well as the hashes of imported
        -// packages.
        -func packageHash(pkg *Package) (string, error) {
        -	key := cache.NewHash("package hash")
        -	fmt.Fprintf(key, "pkgpath %s\n", pkg.PkgPath)
        -	for _, f := range pkg.CompiledGoFiles {
        -		h, err := cache.FileHash(f)
        -		if err != nil {
        -			return "", err
        -		}
        -		fmt.Fprintf(key, "file %s %x\n", f, h)
        -	}
        -
        -	imps := make([]*Package, len(pkg.Imports))
        -	copy(imps, pkg.Imports)
        -	sort.Slice(imps, func(i, j int) bool {
        -		return imps[i].PkgPath < imps[j].PkgPath
        -	})
        -	for _, dep := range imps {
        -		if dep.PkgPath == "unsafe" {
        -			continue
        -		}
        -
        -		fmt.Fprintf(key, "import %s %s\n", dep.PkgPath, dep.hash)
        -	}
        -	h := key.Sum()
        -	return hex.EncodeToString(h[:]), nil
        -}
        -
        -// passActionID computes an ActionID for an analysis pass.
        -func passActionID(pkg *Package, analyzer *analysis.Analyzer) (cache.ActionID, error) {
        -	key := cache.NewHash("action ID")
        -	fmt.Fprintf(key, "pkgpath %s\n", pkg.PkgPath)
        -	fmt.Fprintf(key, "pkghash %s\n", pkg.hash)
        -	fmt.Fprintf(key, "analyzer %s\n", analyzer.Name)
        -
        -	return key.Sum(), nil
        -}
        diff --git a/vendor/honnef.co/go/tools/lint/stats.go b/vendor/honnef.co/go/tools/lint/stats.go
        deleted file mode 100644
        index 2f6508559..000000000
        --- a/vendor/honnef.co/go/tools/lint/stats.go
        +++ /dev/null
        @@ -1,20 +0,0 @@
        -package lint
        -
        -const (
        -	StateInitializing = 0
        -	StateGraph        = 1
        -	StateProcessing   = 2
        -	StateCumulative   = 3
        -)
        -
        -type Stats struct {
        -	State uint32
        -
        -	InitialPackages          uint32
        -	TotalPackages            uint32
        -	ProcessedPackages        uint32
        -	ProcessedInitialPackages uint32
        -	Problems                 uint32
        -	ActiveWorkers            uint32
        -	TotalWorkers             uint32
        -}
        diff --git a/vendor/honnef.co/go/tools/loader/loader.go b/vendor/honnef.co/go/tools/loader/loader.go
        deleted file mode 100644
        index 9c6885d48..000000000
        --- a/vendor/honnef.co/go/tools/loader/loader.go
        +++ /dev/null
        @@ -1,197 +0,0 @@
        -package loader
        -
        -import (
        -	"fmt"
        -	"go/ast"
        -	"go/parser"
        -	"go/scanner"
        -	"go/token"
        -	"go/types"
        -	"log"
        -	"os"
        -	"sync"
        -
        -	"golang.org/x/tools/go/gcexportdata"
        -	"golang.org/x/tools/go/packages"
        -)
        -
        -type Loader struct {
        -	exportMu sync.RWMutex
        -}
        -
        -// Graph resolves patterns and returns packages with all the
        -// information required to later load type information, and optionally
        -// syntax trees.
        -//
        -// The provided config can set any setting with the exception of Mode.
        -func (ld *Loader) Graph(cfg packages.Config, patterns ...string) ([]*packages.Package, error) {
        -	cfg.Mode = packages.NeedName | packages.NeedImports | packages.NeedDeps | packages.NeedExportsFile | packages.NeedFiles | packages.NeedCompiledGoFiles | packages.NeedTypesSizes
        -	pkgs, err := packages.Load(&cfg, patterns...)
        -	if err != nil {
        -		return nil, err
        -	}
        -	fset := token.NewFileSet()
        -	packages.Visit(pkgs, nil, func(pkg *packages.Package) {
        -		pkg.Fset = fset
        -	})
        -	return pkgs, nil
        -}
        -
        -// LoadFromExport loads a package from export data. All of its
        -// dependencies must have been loaded already.
        -func (ld *Loader) LoadFromExport(pkg *packages.Package) error {
        -	ld.exportMu.Lock()
        -	defer ld.exportMu.Unlock()
        -
        -	pkg.IllTyped = true
        -	for path, pkg := range pkg.Imports {
        -		if pkg.Types == nil {
        -			return fmt.Errorf("dependency %q hasn't been loaded yet", path)
        -		}
        -	}
        -	if pkg.ExportFile == "" {
        -		return fmt.Errorf("no export data for %q", pkg.ID)
        -	}
        -	f, err := os.Open(pkg.ExportFile)
        -	if err != nil {
        -		return err
        -	}
        -	defer f.Close()
        -
        -	r, err := gcexportdata.NewReader(f)
        -	if err != nil {
        -		return err
        -	}
        -
        -	view := make(map[string]*types.Package)  // view seen by gcexportdata
        -	seen := make(map[*packages.Package]bool) // all visited packages
        -	var visit func(pkgs map[string]*packages.Package)
        -	visit = func(pkgs map[string]*packages.Package) {
        -		for _, pkg := range pkgs {
        -			if !seen[pkg] {
        -				seen[pkg] = true
        -				view[pkg.PkgPath] = pkg.Types
        -				visit(pkg.Imports)
        -			}
        -		}
        -	}
        -	visit(pkg.Imports)
        -	tpkg, err := gcexportdata.Read(r, pkg.Fset, view, pkg.PkgPath)
        -	if err != nil {
        -		return err
        -	}
        -	pkg.Types = tpkg
        -	pkg.IllTyped = false
        -	return nil
        -}
        -
        -// LoadFromSource loads a package from source. All of its dependencies
        -// must have been loaded already.
        -func (ld *Loader) LoadFromSource(pkg *packages.Package) error {
        -	ld.exportMu.RLock()
        -	defer ld.exportMu.RUnlock()
        -
        -	pkg.IllTyped = true
        -	pkg.Types = types.NewPackage(pkg.PkgPath, pkg.Name)
        -
        -	// OPT(dh): many packages have few files, much fewer than there
        -	// are CPU cores. Additionally, parsing each individual file is
        -	// very fast. A naive parallel implementation of this loop won't
        -	// be faster, and tends to be slower due to extra scheduling,
        -	// bookkeeping and potentially false sharing of cache lines.
        -	pkg.Syntax = make([]*ast.File, len(pkg.CompiledGoFiles))
        -	for i, file := range pkg.CompiledGoFiles {
        -		f, err := parser.ParseFile(pkg.Fset, file, nil, parser.ParseComments)
        -		if err != nil {
        -			pkg.Errors = append(pkg.Errors, convertError(err)...)
        -			return err
        -		}
        -		pkg.Syntax[i] = f
        -	}
        -	pkg.TypesInfo = &types.Info{
        -		Types:      make(map[ast.Expr]types.TypeAndValue),
        -		Defs:       make(map[*ast.Ident]types.Object),
        -		Uses:       make(map[*ast.Ident]types.Object),
        -		Implicits:  make(map[ast.Node]types.Object),
        -		Scopes:     make(map[ast.Node]*types.Scope),
        -		Selections: make(map[*ast.SelectorExpr]*types.Selection),
        -	}
        -
        -	importer := func(path string) (*types.Package, error) {
        -		if path == "unsafe" {
        -			return types.Unsafe, nil
        -		}
        -		imp := pkg.Imports[path]
        -		if imp == nil {
        -			return nil, nil
        -		}
        -		if len(imp.Errors) > 0 {
        -			return nil, imp.Errors[0]
        -		}
        -		return imp.Types, nil
        -	}
        -	tc := &types.Config{
        -		Importer: importerFunc(importer),
        -		Error: func(err error) {
        -			pkg.Errors = append(pkg.Errors, convertError(err)...)
        -		},
        -	}
        -	err := types.NewChecker(tc, pkg.Fset, pkg.Types, pkg.TypesInfo).Files(pkg.Syntax)
        -	if err != nil {
        -		return err
        -	}
        -	pkg.IllTyped = false
        -	return nil
        -}
        -
        -func convertError(err error) []packages.Error {
        -	var errs []packages.Error
        -	// taken from go/packages
        -	switch err := err.(type) {
        -	case packages.Error:
        -		// from driver
        -		errs = append(errs, err)
        -
        -	case *os.PathError:
        -		// from parser
        -		errs = append(errs, packages.Error{
        -			Pos:  err.Path + ":1",
        -			Msg:  err.Err.Error(),
        -			Kind: packages.ParseError,
        -		})
        -
        -	case scanner.ErrorList:
        -		// from parser
        -		for _, err := range err {
        -			errs = append(errs, packages.Error{
        -				Pos:  err.Pos.String(),
        -				Msg:  err.Msg,
        -				Kind: packages.ParseError,
        -			})
        -		}
        -
        -	case types.Error:
        -		// from type checker
        -		errs = append(errs, packages.Error{
        -			Pos:  err.Fset.Position(err.Pos).String(),
        -			Msg:  err.Msg,
        -			Kind: packages.TypeError,
        -		})
        -
        -	default:
        -		// unexpected impoverished error from parser?
        -		errs = append(errs, packages.Error{
        -			Pos:  "-",
        -			Msg:  err.Error(),
        -			Kind: packages.UnknownError,
        -		})
        -
        -		// If you see this error message, please file a bug.
        -		log.Printf("internal error: error %q (%T) without position", err, err)
        -	}
        -	return errs
        -}
        -
        -type importerFunc func(path string) (*types.Package, error)
        -
        -func (f importerFunc) Import(path string) (*types.Package, error) { return f(path) }
        diff --git a/vendor/honnef.co/go/tools/printf/fuzz.go b/vendor/honnef.co/go/tools/printf/fuzz.go
        deleted file mode 100644
        index 8ebf357fb..000000000
        --- a/vendor/honnef.co/go/tools/printf/fuzz.go
        +++ /dev/null
        @@ -1,11 +0,0 @@
        -// +build gofuzz
        -
        -package printf
        -
        -func Fuzz(data []byte) int {
        -	_, err := Parse(string(data))
        -	if err == nil {
        -		return 1
        -	}
        -	return 0
        -}
        diff --git a/vendor/honnef.co/go/tools/printf/printf.go b/vendor/honnef.co/go/tools/printf/printf.go
        deleted file mode 100644
        index 754db9b16..000000000
        --- a/vendor/honnef.co/go/tools/printf/printf.go
        +++ /dev/null
        @@ -1,197 +0,0 @@
        -// Package printf implements a parser for fmt.Printf-style format
        -// strings.
        -//
        -// It parses verbs according to the following syntax:
        -//     Numeric -> '0'-'9'
        -//     Letter -> 'a'-'z' | 'A'-'Z'
        -//     Index -> '[' Numeric+ ']'
        -//     Star -> '*'
        -//     Star -> Index '*'
        -//
        -//     Precision -> Numeric+ | Star
        -//     Width -> Numeric+ | Star
        -//
        -//     WidthAndPrecision -> Width '.' Precision
        -//     WidthAndPrecision -> Width '.'
        -//     WidthAndPrecision -> Width
        -//     WidthAndPrecision -> '.' Precision
        -//     WidthAndPrecision -> '.'
        -//
        -//     Flag -> '+' | '-' | '#' | ' ' | '0'
        -//     Verb -> Letter | '%'
        -//
        -//     Input -> '%' [ Flag+ ] [ WidthAndPrecision ] [ Index ] Verb
        -package printf
        -
        -import (
        -	"errors"
        -	"regexp"
        -	"strconv"
        -	"strings"
        -)
        -
        -// ErrInvalid is returned for invalid format strings or verbs.
        -var ErrInvalid = errors.New("invalid format string")
        -
        -type Verb struct {
        -	Letter rune
        -	Flags  string
        -
        -	Width     Argument
        -	Precision Argument
        -	// Which value in the argument list the verb uses.
        -	// -1 denotes the next argument,
        -	// values > 0 denote explicit arguments.
        -	// The value 0 denotes that no argument is consumed. This is the case for %%.
        -	Value int
        -
        -	Raw string
        -}
        -
        -// Argument is an implicit or explicit width or precision.
        -type Argument interface {
        -	isArgument()
        -}
        -
        -// The Default value, when no width or precision is provided.
        -type Default struct{}
        -
        -// Zero is the implicit zero value.
        -// This value may only appear for precisions in format strings like %6.f
        -type Zero struct{}
        -
        -// Star is a * value, which may either refer to the next argument (Index == -1) or an explicit argument.
        -type Star struct{ Index int }
        -
        -// A Literal value, such as 6 in %6d.
        -type Literal int
        -
        -func (Default) isArgument() {}
        -func (Zero) isArgument()    {}
        -func (Star) isArgument()    {}
        -func (Literal) isArgument() {}
        -
        -// Parse parses f and returns a list of actions.
        -// An action may either be a literal string, or a Verb.
        -func Parse(f string) ([]interface{}, error) {
        -	var out []interface{}
        -	for len(f) > 0 {
        -		if f[0] == '%' {
        -			v, n, err := ParseVerb(f)
        -			if err != nil {
        -				return nil, err
        -			}
        -			f = f[n:]
        -			out = append(out, v)
        -		} else {
        -			n := strings.IndexByte(f, '%')
        -			if n > -1 {
        -				out = append(out, f[:n])
        -				f = f[n:]
        -			} else {
        -				out = append(out, f)
        -				f = ""
        -			}
        -		}
        -	}
        -
        -	return out, nil
        -}
        -
        -func atoi(s string) int {
        -	n, _ := strconv.Atoi(s)
        -	return n
        -}
        -
        -// ParseVerb parses the verb at the beginning of f.
        -// It returns the verb, how much of the input was consumed, and an error, if any.
        -func ParseVerb(f string) (Verb, int, error) {
        -	if len(f) < 2 {
        -		return Verb{}, 0, ErrInvalid
        -	}
        -	const (
        -		flags = 1
        -
        -		width      = 2
        -		widthStar  = 3
        -		widthIndex = 5
        -
        -		dot       = 6
        -		prec      = 7
        -		precStar  = 8
        -		precIndex = 10
        -
        -		verbIndex = 11
        -		verb      = 12
        -	)
        -
        -	m := re.FindStringSubmatch(f)
        -	if m == nil {
        -		return Verb{}, 0, ErrInvalid
        -	}
        -
        -	v := Verb{
        -		Letter: []rune(m[verb])[0],
        -		Flags:  m[flags],
        -		Raw:    m[0],
        -	}
        -
        -	if m[width] != "" {
        -		// Literal width
        -		v.Width = Literal(atoi(m[width]))
        -	} else if m[widthStar] != "" {
        -		// Star width
        -		if m[widthIndex] != "" {
        -			v.Width = Star{atoi(m[widthIndex])}
        -		} else {
        -			v.Width = Star{-1}
        -		}
        -	} else {
        -		// Default width
        -		v.Width = Default{}
        -	}
        -
        -	if m[dot] == "" {
        -		// default precision
        -		v.Precision = Default{}
        -	} else {
        -		if m[prec] != "" {
        -			// Literal precision
        -			v.Precision = Literal(atoi(m[prec]))
        -		} else if m[precStar] != "" {
        -			// Star precision
        -			if m[precIndex] != "" {
        -				v.Precision = Star{atoi(m[precIndex])}
        -			} else {
        -				v.Precision = Star{-1}
        -			}
        -		} else {
        -			// Zero precision
        -			v.Precision = Zero{}
        -		}
        -	}
        -
        -	if m[verb] == "%" {
        -		v.Value = 0
        -	} else if m[verbIndex] != "" {
        -		v.Value = atoi(m[verbIndex])
        -	} else {
        -		v.Value = -1
        -	}
        -
        -	return v, len(m[0]), nil
        -}
        -
        -const (
        -	flags             = `([+#0 -]*)`
        -	verb              = `([a-zA-Z%])`
        -	index             = `(?:\[([0-9]+)\])`
        -	star              = `((` + index + `)?\*)`
        -	width1            = `([0-9]+)`
        -	width2            = star
        -	width             = `(?:` + width1 + `|` + width2 + `)`
        -	precision         = width
        -	widthAndPrecision = `(?:(?:` + width + `)?(?:(\.)(?:` + precision + `)?)?)`
        -)
        -
        -var re = regexp.MustCompile(`^%` + flags + widthAndPrecision + `?` + index + `?` + verb)
        diff --git a/vendor/honnef.co/go/tools/simple/CONTRIBUTING.md b/vendor/honnef.co/go/tools/simple/CONTRIBUTING.md
        deleted file mode 100644
        index c54c6c50a..000000000
        --- a/vendor/honnef.co/go/tools/simple/CONTRIBUTING.md
        +++ /dev/null
        @@ -1,15 +0,0 @@
        -# Contributing to gosimple
        -
        -## Before filing an issue:
        -
        -### Are you having trouble building gosimple?
        -
        -Check you have the latest version of its dependencies. Run
        -```
        -go get -u honnef.co/go/tools/simple
        -```
        -If you still have problems, consider searching for existing issues before filing a new issue.
        -
        -## Before sending a pull request:
        -
        -Have you understood the purpose of gosimple? Make sure to carefully read `README`.
        diff --git a/vendor/honnef.co/go/tools/simple/analysis.go b/vendor/honnef.co/go/tools/simple/analysis.go
        deleted file mode 100644
        index abb1648fa..000000000
        --- a/vendor/honnef.co/go/tools/simple/analysis.go
        +++ /dev/null
        @@ -1,223 +0,0 @@
        -package simple
        -
        -import (
        -	"flag"
        -
        -	"golang.org/x/tools/go/analysis"
        -	"golang.org/x/tools/go/analysis/passes/inspect"
        -	"honnef.co/go/tools/facts"
        -	"honnef.co/go/tools/internal/passes/buildssa"
        -	"honnef.co/go/tools/lint/lintutil"
        -)
        -
        -func newFlagSet() flag.FlagSet {
        -	fs := flag.NewFlagSet("", flag.PanicOnError)
        -	fs.Var(lintutil.NewVersionFlag(), "go", "Target Go version")
        -	return *fs
        -}
        -
        -var Analyzers = map[string]*analysis.Analyzer{
        -	"S1000": {
        -		Name:     "S1000",
        -		Run:      LintSingleCaseSelect,
        -		Doc:      Docs["S1000"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1001": {
        -		Name:     "S1001",
        -		Run:      LintLoopCopy,
        -		Doc:      Docs["S1001"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1002": {
        -		Name:     "S1002",
        -		Run:      LintIfBoolCmp,
        -		Doc:      Docs["S1002"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1003": {
        -		Name:     "S1003",
        -		Run:      LintStringsContains,
        -		Doc:      Docs["S1003"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1004": {
        -		Name:     "S1004",
        -		Run:      LintBytesCompare,
        -		Doc:      Docs["S1004"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1005": {
        -		Name:     "S1005",
        -		Run:      LintUnnecessaryBlank,
        -		Doc:      Docs["S1005"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1006": {
        -		Name:     "S1006",
        -		Run:      LintForTrue,
        -		Doc:      Docs["S1006"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1007": {
        -		Name:     "S1007",
        -		Run:      LintRegexpRaw,
        -		Doc:      Docs["S1007"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1008": {
        -		Name:     "S1008",
        -		Run:      LintIfReturn,
        -		Doc:      Docs["S1008"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1009": {
        -		Name:     "S1009",
        -		Run:      LintRedundantNilCheckWithLen,
        -		Doc:      Docs["S1009"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1010": {
        -		Name:     "S1010",
        -		Run:      LintSlicing,
        -		Doc:      Docs["S1010"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1011": {
        -		Name:     "S1011",
        -		Run:      LintLoopAppend,
        -		Doc:      Docs["S1011"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1012": {
        -		Name:     "S1012",
        -		Run:      LintTimeSince,
        -		Doc:      Docs["S1012"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1016": {
        -		Name:     "S1016",
        -		Run:      LintSimplerStructConversion,
        -		Doc:      Docs["S1016"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1017": {
        -		Name:     "S1017",
        -		Run:      LintTrim,
        -		Doc:      Docs["S1017"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1018": {
        -		Name:     "S1018",
        -		Run:      LintLoopSlide,
        -		Doc:      Docs["S1018"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1019": {
        -		Name:     "S1019",
        -		Run:      LintMakeLenCap,
        -		Doc:      Docs["S1019"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1020": {
        -		Name:     "S1020",
        -		Run:      LintAssertNotNil,
        -		Doc:      Docs["S1020"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1021": {
        -		Name:     "S1021",
        -		Run:      LintDeclareAssign,
        -		Doc:      Docs["S1021"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1023": {
        -		Name:     "S1023",
        -		Run:      LintRedundantBreak,
        -		Doc:      Docs["S1023"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1024": {
        -		Name:     "S1024",
        -		Run:      LintTimeUntil,
        -		Doc:      Docs["S1024"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1025": {
        -		Name:     "S1025",
        -		Run:      LintRedundantSprintf,
        -		Doc:      Docs["S1025"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer, inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1028": {
        -		Name:     "S1028",
        -		Run:      LintErrorsNewSprintf,
        -		Doc:      Docs["S1028"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1029": {
        -		Name:     "S1029",
        -		Run:      LintRangeStringRunes,
        -		Doc:      Docs["S1029"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1030": {
        -		Name:     "S1030",
        -		Run:      LintBytesBufferConversions,
        -		Doc:      Docs["S1030"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1031": {
        -		Name:     "S1031",
        -		Run:      LintNilCheckAroundRange,
        -		Doc:      Docs["S1031"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1032": {
        -		Name:     "S1032",
        -		Run:      LintSortHelpers,
        -		Doc:      Docs["S1032"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1033": {
        -		Name:     "S1033",
        -		Run:      LintGuardedDelete,
        -		Doc:      Docs["S1033"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"S1034": {
        -		Name:     "S1034",
        -		Run:      LintSimplifyTypeSwitch,
        -		Doc:      Docs["S1034"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -}
        diff --git a/vendor/honnef.co/go/tools/simple/doc.go b/vendor/honnef.co/go/tools/simple/doc.go
        deleted file mode 100644
        index eb0072de5..000000000
        --- a/vendor/honnef.co/go/tools/simple/doc.go
        +++ /dev/null
        @@ -1,425 +0,0 @@
        -package simple
        -
        -import "honnef.co/go/tools/lint"
        -
        -var Docs = map[string]*lint.Documentation{
        -	"S1000": &lint.Documentation{
        -		Title: `Use plain channel send or receive instead of single-case select`,
        -		Text: `Select statements with a single case can be replaced with a simple
        -send or receive.
        -
        -Before:
        -
        -    select {
        -    case x := <-ch:
        -        fmt.Println(x)
        -    }
        -
        -After:
        -
        -    x := <-ch
        -    fmt.Println(x)`,
        -		Since: "2017.1",
        -	},
        -
        -	"S1001": &lint.Documentation{
        -		Title: `Replace for loop with call to copy`,
        -		Text: `Use copy() for copying elements from one slice to another.
        -
        -Before:
        -
        -    for i, x := range src {
        -        dst[i] = x
        -    }
        -
        -After:
        -
        -    copy(dst, src)`,
        -		Since: "2017.1",
        -	},
        -
        -	"S1002": &lint.Documentation{
        -		Title: `Omit comparison with boolean constant`,
        -		Text: `Before:
        -
        -    if x == true {}
        -
        -After:
        -
        -    if x {}`,
        -		Since: "2017.1",
        -	},
        -
        -	"S1003": &lint.Documentation{
        -		Title: `Replace call to strings.Index with strings.Contains`,
        -		Text: `Before:
        -
        -    if strings.Index(x, y) != -1 {}
        -
        -After:
        -
        -    if strings.Contains(x, y) {}`,
        -		Since: "2017.1",
        -	},
        -
        -	"S1004": &lint.Documentation{
        -		Title: `Replace call to bytes.Compare with bytes.Equal`,
        -		Text: `Before:
        -
        -    if bytes.Compare(x, y) == 0 {}
        -
        -After:
        -
        -    if bytes.Equal(x, y) {}`,
        -		Since: "2017.1",
        -	},
        -
        -	"S1005": &lint.Documentation{
        -		Title: `Drop unnecessary use of the blank identifier`,
        -		Text: `In many cases, assigning to the blank identifier is unnecessary.
        -
        -Before:
        -
        -    for _ = range s {}
        -    x, _ = someMap[key]
        -    _ = <-ch
        -
        -After:
        -
        -    for range s{}
        -    x = someMap[key]
        -    <-ch`,
        -		Since: "2017.1",
        -	},
        -
        -	"S1006": &lint.Documentation{
        -		Title: `Use for { ... } for infinite loops`,
        -		Text:  `For infinite loops, using for { ... } is the most idiomatic choice.`,
        -		Since: "2017.1",
        -	},
        -
        -	"S1007": &lint.Documentation{
        -		Title: `Simplify regular expression by using raw string literal`,
        -		Text: `Raw string literals use ` + "`" + ` instead of " and do not support
        -any escape sequences. This means that the backslash (\) can be used
        -freely, without the need of escaping.
        -
        -Since regular expressions have their own escape sequences, raw strings
        -can improve their readability.
        -
        -Before:
        -
        -    regexp.Compile("\\A(\\w+) profile: total \\d+\\n\\z")
        -
        -After:
        -
        -    regexp.Compile(` + "`" + `\A(\w+) profile: total \d+\n\z` + "`" + `)`,
        -		Since: "2017.1",
        -	},
        -
        -	"S1008": &lint.Documentation{
        -		Title: `Simplify returning boolean expression`,
        -		Text: `Before:
        -
        -    if  {
        -        return true
        -    }
        -    return false
        -
        -After:
        -
        -    return `,
        -		Since: "2017.1",
        -	},
        -
        -	"S1009": &lint.Documentation{
        -		Title: `Omit redundant nil check on slices`,
        -		Text: `The len function is defined for all slices, even nil ones, which have
        -a length of zero. It is not necessary to check if a slice is not nil
        -before checking that its length is not zero.
        -
        -Before:
        -
        -    if x != nil && len(x) != 0 {}
        -
        -After:
        -
        -    if len(x) != 0 {}`,
        -		Since: "2017.1",
        -	},
        -
        -	"S1010": &lint.Documentation{
        -		Title: `Omit default slice index`,
        -		Text: `When slicing, the second index defaults to the length of the value,
        -making s[n:len(s)] and s[n:] equivalent.`,
        -		Since: "2017.1",
        -	},
        -
        -	"S1011": &lint.Documentation{
        -		Title: `Use a single append to concatenate two slices`,
        -		Text: `Before:
        -
        -    for _, e := range y {
        -        x = append(x, e)
        -    }
        -
        -After:
        -
        -    x = append(x, y...)`,
        -		Since: "2017.1",
        -	},
        -
        -	"S1012": &lint.Documentation{
        -		Title: `Replace time.Now().Sub(x) with time.Since(x)`,
        -		Text: `The time.Since helper has the same effect as using time.Now().Sub(x)
        -but is easier to read.
        -
        -Before:
        -
        -    time.Now().Sub(x)
        -
        -After:
        -
        -    time.Since(x)`,
        -		Since: "2017.1",
        -	},
        -
        -	"S1016": &lint.Documentation{
        -		Title: `Use a type conversion instead of manually copying struct fields`,
        -		Text: `Two struct types with identical fields can be converted between each
        -other. In older versions of Go, the fields had to have identical
        -struct tags. Since Go 1.8, however, struct tags are ignored during
        -conversions. It is thus not necessary to manually copy every field
        -individually.
        -
        -Before:
        -
        -    var x T1
        -    y := T2{
        -        Field1: x.Field1,
        -        Field2: x.Field2,
        -    }
        -
        -After:
        -
        -    var x T1
        -    y := T2(x)`,
        -		Since: "2017.1",
        -	},
        -
        -	"S1017": &lint.Documentation{
        -		Title: `Replace manual trimming with strings.TrimPrefix`,
        -		Text: `Instead of using strings.HasPrefix and manual slicing, use the
        -strings.TrimPrefix function. If the string doesn't start with the
        -prefix, the original string will be returned. Using strings.TrimPrefix
        -reduces complexity, and avoids common bugs, such as off-by-one
        -mistakes.
        -
        -Before:
        -
        -    if strings.HasPrefix(str, prefix) {
        -        str = str[len(prefix):]
        -    }
        -
        -After:
        -
        -    str = strings.TrimPrefix(str, prefix)`,
        -		Since: "2017.1",
        -	},
        -
        -	"S1018": &lint.Documentation{
        -		Title: `Use copy for sliding elements`,
        -		Text: `copy() permits using the same source and destination slice, even with
        -overlapping ranges. This makes it ideal for sliding elements in a
        -slice.
        -
        -Before:
        -
        -    for i := 0; i < n; i++ {
        -        bs[i] = bs[offset+i]
        -    }
        -
        -After:
        -
        -    copy(bs[:n], bs[offset:])`,
        -		Since: "2017.1",
        -	},
        -
        -	"S1019": &lint.Documentation{
        -		Title: `Simplify make call by omitting redundant arguments`,
        -		Text: `The make function has default values for the length and capacity
        -arguments. For channels and maps, the length defaults to zero.
        -Additionally, for slices the capacity defaults to the length.`,
        -		Since: "2017.1",
        -	},
        -
        -	"S1020": &lint.Documentation{
        -		Title: `Omit redundant nil check in type assertion`,
        -		Text: `Before:
        -
        -    if _, ok := i.(T); ok && i != nil {}
        -
        -After:
        -
        -    if _, ok := i.(T); ok {}`,
        -		Since: "2017.1",
        -	},
        -
        -	"S1021": &lint.Documentation{
        -		Title: `Merge variable declaration and assignment`,
        -		Text: `Before:
        -
        -    var x uint
        -    x = 1
        -
        -After:
        -
        -    var x uint = 1`,
        -		Since: "2017.1",
        -	},
        -
        -	"S1023": &lint.Documentation{
        -		Title: `Omit redundant control flow`,
        -		Text: `Functions that have no return value do not need a return statement as
        -the final statement of the function.
        -
        -Switches in Go do not have automatic fallthrough, unlike languages
        -like C. It is not necessary to have a break statement as the final
        -statement in a case block.`,
        -		Since: "2017.1",
        -	},
        -
        -	"S1024": &lint.Documentation{
        -		Title: `Replace x.Sub(time.Now()) with time.Until(x)`,
        -		Text: `The time.Until helper has the same effect as using x.Sub(time.Now())
        -but is easier to read.
        -
        -Before:
        -
        -    x.Sub(time.Now())
        -
        -After:
        -
        -    time.Until(x)`,
        -		Since: "2017.1",
        -	},
        -
        -	"S1025": &lint.Documentation{
        -		Title: `Don't use fmt.Sprintf("%s", x) unnecessarily`,
        -		Text: `In many instances, there are easier and more efficient ways of getting
        -a value's string representation. Whenever a value's underlying type is
        -a string already, or the type has a String method, they should be used
        -directly.
        -
        -Given the following shared definitions
        -
        -    type T1 string
        -    type T2 int
        -
        -    func (T2) String() string { return "Hello, world" }
        -
        -    var x string
        -    var y T1
        -    var z T2
        -
        -we can simplify the following
        -
        -    fmt.Sprintf("%s", x)
        -    fmt.Sprintf("%s", y)
        -    fmt.Sprintf("%s", z)
        -
        -to
        -
        -    x
        -    string(y)
        -    z.String()`,
        -		Since: "2017.1",
        -	},
        -
        -	"S1028": &lint.Documentation{
        -		Title: `Simplify error construction with fmt.Errorf`,
        -		Text: `Before:
        -
        -    errors.New(fmt.Sprintf(...))
        -
        -After:
        -
        -    fmt.Errorf(...)`,
        -		Since: "2017.1",
        -	},
        -
        -	"S1029": &lint.Documentation{
        -		Title: `Range over the string directly`,
        -		Text: `Ranging over a string will yield byte offsets and runes. If the offset
        -isn't used, this is functionally equivalent to converting the string
        -to a slice of runes and ranging over that. Ranging directly over the
        -string will be more performant, however, as it avoids allocating a new
        -slice, the size of which depends on the length of the string.
        -
        -Before:
        -
        -    for _, r := range []rune(s) {}
        -
        -After:
        -
        -    for _, r := range s {}`,
        -		Since: "2017.1",
        -	},
        -
        -	"S1030": &lint.Documentation{
        -		Title: `Use bytes.Buffer.String or bytes.Buffer.Bytes`,
        -		Text: `bytes.Buffer has both a String and a Bytes method. It is never
        -necessary to use string(buf.Bytes()) or []byte(buf.String()) – simply
        -use the other method.`,
        -		Since: "2017.1",
        -	},
        -
        -	"S1031": &lint.Documentation{
        -		Title: `Omit redundant nil check around loop`,
        -		Text: `You can use range on nil slices and maps, the loop will simply never
        -execute. This makes an additional nil check around the loop
        -unnecessary.
        -
        -Before:
        -
        -    if s != nil {
        -        for _, x := range s {
        -            ...
        -        }
        -    }
        -
        -After:
        -
        -    for _, x := range s {
        -        ...
        -    }`,
        -		Since: "2017.1",
        -	},
        -
        -	"S1032": &lint.Documentation{
        -		Title: `Use sort.Ints(x), sort.Float64s(x), and sort.Strings(x)`,
        -		Text: `The sort.Ints, sort.Float64s and sort.Strings functions are easier to
        -read than sort.Sort(sort.IntSlice(x)), sort.Sort(sort.Float64Slice(x))
        -and sort.Sort(sort.StringSlice(x)).
        -
        -Before:
        -
        -    sort.Sort(sort.StringSlice(x))
        -
        -After:
        -
        -    sort.Strings(x)`,
        -		Since: "2019.1",
        -	},
        -
        -	"S1033": &lint.Documentation{
        -		Title: `Unnecessary guard around call to delete`,
        -		Text:  `Calling delete on a nil map is a no-op.`,
        -		Since: "2019.2",
        -	},
        -
        -	"S1034": &lint.Documentation{
        -		Title: `Use result of type assertion to simplify cases`,
        -		Since: "2019.2",
        -	},
        -}
        diff --git a/vendor/honnef.co/go/tools/simple/lint.go b/vendor/honnef.co/go/tools/simple/lint.go
        deleted file mode 100644
        index c78a7bb7a..000000000
        --- a/vendor/honnef.co/go/tools/simple/lint.go
        +++ /dev/null
        @@ -1,1816 +0,0 @@
        -// Package simple contains a linter for Go source code.
        -package simple // import "honnef.co/go/tools/simple"
        -
        -import (
        -	"fmt"
        -	"go/ast"
        -	"go/constant"
        -	"go/token"
        -	"go/types"
        -	"reflect"
        -	"sort"
        -	"strings"
        -
        -	"golang.org/x/tools/go/analysis"
        -	"golang.org/x/tools/go/analysis/passes/inspect"
        -	"golang.org/x/tools/go/ast/inspector"
        -	"golang.org/x/tools/go/types/typeutil"
        -	. "honnef.co/go/tools/arg"
        -	"honnef.co/go/tools/internal/passes/buildssa"
        -	"honnef.co/go/tools/internal/sharedcheck"
        -	"honnef.co/go/tools/lint"
        -	. "honnef.co/go/tools/lint/lintdsl"
        -)
        -
        -func LintSingleCaseSelect(pass *analysis.Pass) (interface{}, error) {
        -	isSingleSelect := func(node ast.Node) bool {
        -		v, ok := node.(*ast.SelectStmt)
        -		if !ok {
        -			return false
        -		}
        -		return len(v.Body.List) == 1
        -	}
        -
        -	seen := map[ast.Node]struct{}{}
        -	fn := func(node ast.Node) {
        -		switch v := node.(type) {
        -		case *ast.ForStmt:
        -			if len(v.Body.List) != 1 {
        -				return
        -			}
        -			if !isSingleSelect(v.Body.List[0]) {
        -				return
        -			}
        -			if _, ok := v.Body.List[0].(*ast.SelectStmt).Body.List[0].(*ast.CommClause).Comm.(*ast.SendStmt); ok {
        -				// Don't suggest using range for channel sends
        -				return
        -			}
        -			seen[v.Body.List[0]] = struct{}{}
        -			ReportNodefFG(pass, node, "should use for range instead of for { select {} }")
        -		case *ast.SelectStmt:
        -			if _, ok := seen[v]; ok {
        -				return
        -			}
        -			if !isSingleSelect(v) {
        -				return
        -			}
        -			ReportNodefFG(pass, node, "should use a simple channel send/receive instead of select with a single case")
        -		}
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.ForStmt)(nil), (*ast.SelectStmt)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func LintLoopCopy(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		loop := node.(*ast.RangeStmt)
        -
        -		if loop.Key == nil {
        -			return
        -		}
        -		if len(loop.Body.List) != 1 {
        -			return
        -		}
        -		stmt, ok := loop.Body.List[0].(*ast.AssignStmt)
        -		if !ok {
        -			return
        -		}
        -		if stmt.Tok != token.ASSIGN || len(stmt.Lhs) != 1 || len(stmt.Rhs) != 1 {
        -			return
        -		}
        -		lhs, ok := stmt.Lhs[0].(*ast.IndexExpr)
        -		if !ok {
        -			return
        -		}
        -
        -		if _, ok := pass.TypesInfo.TypeOf(lhs.X).(*types.Slice); !ok {
        -			return
        -		}
        -		lidx, ok := lhs.Index.(*ast.Ident)
        -		if !ok {
        -			return
        -		}
        -		key, ok := loop.Key.(*ast.Ident)
        -		if !ok {
        -			return
        -		}
        -		if pass.TypesInfo.TypeOf(lhs) == nil || pass.TypesInfo.TypeOf(stmt.Rhs[0]) == nil {
        -			return
        -		}
        -		if pass.TypesInfo.ObjectOf(lidx) != pass.TypesInfo.ObjectOf(key) {
        -			return
        -		}
        -		if !types.Identical(pass.TypesInfo.TypeOf(lhs), pass.TypesInfo.TypeOf(stmt.Rhs[0])) {
        -			return
        -		}
        -		if _, ok := pass.TypesInfo.TypeOf(loop.X).(*types.Slice); !ok {
        -			return
        -		}
        -
        -		if rhs, ok := stmt.Rhs[0].(*ast.IndexExpr); ok {
        -			rx, ok := rhs.X.(*ast.Ident)
        -			_ = rx
        -			if !ok {
        -				return
        -			}
        -			ridx, ok := rhs.Index.(*ast.Ident)
        -			if !ok {
        -				return
        -			}
        -			if pass.TypesInfo.ObjectOf(ridx) != pass.TypesInfo.ObjectOf(key) {
        -				return
        -			}
        -		} else if rhs, ok := stmt.Rhs[0].(*ast.Ident); ok {
        -			value, ok := loop.Value.(*ast.Ident)
        -			if !ok {
        -				return
        -			}
        -			if pass.TypesInfo.ObjectOf(rhs) != pass.TypesInfo.ObjectOf(value) {
        -				return
        -			}
        -		} else {
        -			return
        -		}
        -		ReportNodefFG(pass, loop, "should use copy() instead of a loop")
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.RangeStmt)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func LintIfBoolCmp(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		expr := node.(*ast.BinaryExpr)
        -		if expr.Op != token.EQL && expr.Op != token.NEQ {
        -			return
        -		}
        -		x := IsBoolConst(pass, expr.X)
        -		y := IsBoolConst(pass, expr.Y)
        -		if !x && !y {
        -			return
        -		}
        -		var other ast.Expr
        -		var val bool
        -		if x {
        -			val = BoolConst(pass, expr.X)
        -			other = expr.Y
        -		} else {
        -			val = BoolConst(pass, expr.Y)
        -			other = expr.X
        -		}
        -		basic, ok := pass.TypesInfo.TypeOf(other).Underlying().(*types.Basic)
        -		if !ok || basic.Kind() != types.Bool {
        -			return
        -		}
        -		op := ""
        -		if (expr.Op == token.EQL && !val) || (expr.Op == token.NEQ && val) {
        -			op = "!"
        -		}
        -		r := op + Render(pass, other)
        -		l1 := len(r)
        -		r = strings.TrimLeft(r, "!")
        -		if (l1-len(r))%2 == 1 {
        -			r = "!" + r
        -		}
        -		if IsInTest(pass, node) {
        -			return
        -		}
        -		ReportNodefFG(pass, expr, "should omit comparison to bool constant, can be simplified to %s", r)
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BinaryExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func LintBytesBufferConversions(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		call := node.(*ast.CallExpr)
        -		if len(call.Args) != 1 {
        -			return
        -		}
        -
        -		argCall, ok := call.Args[0].(*ast.CallExpr)
        -		if !ok {
        -			return
        -		}
        -		sel, ok := argCall.Fun.(*ast.SelectorExpr)
        -		if !ok {
        -			return
        -		}
        -
        -		typ := pass.TypesInfo.TypeOf(call.Fun)
        -		if typ == types.Universe.Lookup("string").Type() && IsCallToAST(pass, call.Args[0], "(*bytes.Buffer).Bytes") {
        -			ReportNodefFG(pass, call, "should use %v.String() instead of %v", Render(pass, sel.X), Render(pass, call))
        -		} else if typ, ok := typ.(*types.Slice); ok && typ.Elem() == types.Universe.Lookup("byte").Type() && IsCallToAST(pass, call.Args[0], "(*bytes.Buffer).String") {
        -			ReportNodefFG(pass, call, "should use %v.Bytes() instead of %v", Render(pass, sel.X), Render(pass, call))
        -		}
        -
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func LintStringsContains(pass *analysis.Pass) (interface{}, error) {
        -	// map of value to token to bool value
        -	allowed := map[int64]map[token.Token]bool{
        -		-1: {token.GTR: true, token.NEQ: true, token.EQL: false},
        -		0:  {token.GEQ: true, token.LSS: false},
        -	}
        -	fn := func(node ast.Node) {
        -		expr := node.(*ast.BinaryExpr)
        -		switch expr.Op {
        -		case token.GEQ, token.GTR, token.NEQ, token.LSS, token.EQL:
        -		default:
        -			return
        -		}
        -
        -		value, ok := ExprToInt(pass, expr.Y)
        -		if !ok {
        -			return
        -		}
        -
        -		allowedOps, ok := allowed[value]
        -		if !ok {
        -			return
        -		}
        -		b, ok := allowedOps[expr.Op]
        -		if !ok {
        -			return
        -		}
        -
        -		call, ok := expr.X.(*ast.CallExpr)
        -		if !ok {
        -			return
        -		}
        -		sel, ok := call.Fun.(*ast.SelectorExpr)
        -		if !ok {
        -			return
        -		}
        -		pkgIdent, ok := sel.X.(*ast.Ident)
        -		if !ok {
        -			return
        -		}
        -		funIdent := sel.Sel
        -		if pkgIdent.Name != "strings" && pkgIdent.Name != "bytes" {
        -			return
        -		}
        -		newFunc := ""
        -		switch funIdent.Name {
        -		case "IndexRune":
        -			newFunc = "ContainsRune"
        -		case "IndexAny":
        -			newFunc = "ContainsAny"
        -		case "Index":
        -			newFunc = "Contains"
        -		default:
        -			return
        -		}
        -
        -		prefix := ""
        -		if !b {
        -			prefix = "!"
        -		}
        -		ReportNodefFG(pass, node, "should use %s%s.%s(%s) instead", prefix, pkgIdent.Name, newFunc, RenderArgs(pass, call.Args))
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BinaryExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func LintBytesCompare(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		expr := node.(*ast.BinaryExpr)
        -		if expr.Op != token.NEQ && expr.Op != token.EQL {
        -			return
        -		}
        -		call, ok := expr.X.(*ast.CallExpr)
        -		if !ok {
        -			return
        -		}
        -		if !IsCallToAST(pass, call, "bytes.Compare") {
        -			return
        -		}
        -		value, ok := ExprToInt(pass, expr.Y)
        -		if !ok || value != 0 {
        -			return
        -		}
        -		args := RenderArgs(pass, call.Args)
        -		prefix := ""
        -		if expr.Op == token.NEQ {
        -			prefix = "!"
        -		}
        -		ReportNodefFG(pass, node, "should use %sbytes.Equal(%s) instead", prefix, args)
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BinaryExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func LintForTrue(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		loop := node.(*ast.ForStmt)
        -		if loop.Init != nil || loop.Post != nil {
        -			return
        -		}
        -		if !IsBoolConst(pass, loop.Cond) || !BoolConst(pass, loop.Cond) {
        -			return
        -		}
        -		ReportNodefFG(pass, loop, "should use for {} instead of for true {}")
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.ForStmt)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func LintRegexpRaw(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		call := node.(*ast.CallExpr)
        -		if !IsCallToAST(pass, call, "regexp.MustCompile") &&
        -			!IsCallToAST(pass, call, "regexp.Compile") {
        -			return
        -		}
        -		sel, ok := call.Fun.(*ast.SelectorExpr)
        -		if !ok {
        -			return
        -		}
        -		if len(call.Args) != 1 {
        -			// invalid function call
        -			return
        -		}
        -		lit, ok := call.Args[Arg("regexp.Compile.expr")].(*ast.BasicLit)
        -		if !ok {
        -			// TODO(dominikh): support string concat, maybe support constants
        -			return
        -		}
        -		if lit.Kind != token.STRING {
        -			// invalid function call
        -			return
        -		}
        -		if lit.Value[0] != '"' {
        -			// already a raw string
        -			return
        -		}
        -		val := lit.Value
        -		if !strings.Contains(val, `\\`) {
        -			return
        -		}
        -		if strings.Contains(val, "`") {
        -			return
        -		}
        -
        -		bs := false
        -		for _, c := range val {
        -			if !bs && c == '\\' {
        -				bs = true
        -				continue
        -			}
        -			if bs && c == '\\' {
        -				bs = false
        -				continue
        -			}
        -			if bs {
        -				// backslash followed by non-backslash -> escape sequence
        -				return
        -			}
        -		}
        -
        -		ReportNodefFG(pass, call, "should use raw string (`...`) with regexp.%s to avoid having to escape twice", sel.Sel.Name)
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func LintIfReturn(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		block := node.(*ast.BlockStmt)
        -		l := len(block.List)
        -		if l < 2 {
        -			return
        -		}
        -		n1, n2 := block.List[l-2], block.List[l-1]
        -
        -		if len(block.List) >= 3 {
        -			if _, ok := block.List[l-3].(*ast.IfStmt); ok {
        -				// Do not flag a series of if statements
        -				return
        -			}
        -		}
        -		// if statement with no init, no else, a single condition
        -		// checking an identifier or function call and just a return
        -		// statement in the body, that returns a boolean constant
        -		ifs, ok := n1.(*ast.IfStmt)
        -		if !ok {
        -			return
        -		}
        -		if ifs.Else != nil || ifs.Init != nil {
        -			return
        -		}
        -		if len(ifs.Body.List) != 1 {
        -			return
        -		}
        -		if op, ok := ifs.Cond.(*ast.BinaryExpr); ok {
        -			switch op.Op {
        -			case token.EQL, token.LSS, token.GTR, token.NEQ, token.LEQ, token.GEQ:
        -			default:
        -				return
        -			}
        -		}
        -		ret1, ok := ifs.Body.List[0].(*ast.ReturnStmt)
        -		if !ok {
        -			return
        -		}
        -		if len(ret1.Results) != 1 {
        -			return
        -		}
        -		if !IsBoolConst(pass, ret1.Results[0]) {
        -			return
        -		}
        -
        -		ret2, ok := n2.(*ast.ReturnStmt)
        -		if !ok {
        -			return
        -		}
        -		if len(ret2.Results) != 1 {
        -			return
        -		}
        -		if !IsBoolConst(pass, ret2.Results[0]) {
        -			return
        -		}
        -
        -		if ret1.Results[0].(*ast.Ident).Name == ret2.Results[0].(*ast.Ident).Name {
        -			// we want the function to return true and false, not the
        -			// same value both times.
        -			return
        -		}
        -
        -		ReportNodefFG(pass, n1, "should use 'return ' instead of 'if  { return  }; return '")
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BlockStmt)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -// LintRedundantNilCheckWithLen checks for the following reduntant nil-checks:
        -//
        -//   if x == nil || len(x) == 0 {}
        -//   if x != nil && len(x) != 0 {}
        -//   if x != nil && len(x) == N {} (where N != 0)
        -//   if x != nil && len(x) > N {}
        -//   if x != nil && len(x) >= N {} (where N != 0)
        -//
        -func LintRedundantNilCheckWithLen(pass *analysis.Pass) (interface{}, error) {
        -	isConstZero := func(expr ast.Expr) (isConst bool, isZero bool) {
        -		_, ok := expr.(*ast.BasicLit)
        -		if ok {
        -			return true, IsZero(expr)
        -		}
        -		id, ok := expr.(*ast.Ident)
        -		if !ok {
        -			return false, false
        -		}
        -		c, ok := pass.TypesInfo.ObjectOf(id).(*types.Const)
        -		if !ok {
        -			return false, false
        -		}
        -		return true, c.Val().Kind() == constant.Int && c.Val().String() == "0"
        -	}
        -
        -	fn := func(node ast.Node) {
        -		// check that expr is "x || y" or "x && y"
        -		expr := node.(*ast.BinaryExpr)
        -		if expr.Op != token.LOR && expr.Op != token.LAND {
        -			return
        -		}
        -		eqNil := expr.Op == token.LOR
        -
        -		// check that x is "xx == nil" or "xx != nil"
        -		x, ok := expr.X.(*ast.BinaryExpr)
        -		if !ok {
        -			return
        -		}
        -		if eqNil && x.Op != token.EQL {
        -			return
        -		}
        -		if !eqNil && x.Op != token.NEQ {
        -			return
        -		}
        -		xx, ok := x.X.(*ast.Ident)
        -		if !ok {
        -			return
        -		}
        -		if !IsNil(pass, x.Y) {
        -			return
        -		}
        -
        -		// check that y is "len(xx) == 0" or "len(xx) ... "
        -		y, ok := expr.Y.(*ast.BinaryExpr)
        -		if !ok {
        -			return
        -		}
        -		if eqNil && y.Op != token.EQL { // must be len(xx) *==* 0
        -			return
        -		}
        -		yx, ok := y.X.(*ast.CallExpr)
        -		if !ok {
        -			return
        -		}
        -		yxFun, ok := yx.Fun.(*ast.Ident)
        -		if !ok || yxFun.Name != "len" || len(yx.Args) != 1 {
        -			return
        -		}
        -		yxArg, ok := yx.Args[Arg("len.v")].(*ast.Ident)
        -		if !ok {
        -			return
        -		}
        -		if yxArg.Name != xx.Name {
        -			return
        -		}
        -
        -		if eqNil && !IsZero(y.Y) { // must be len(x) == *0*
        -			return
        -		}
        -
        -		if !eqNil {
        -			isConst, isZero := isConstZero(y.Y)
        -			if !isConst {
        -				return
        -			}
        -			switch y.Op {
        -			case token.EQL:
        -				// avoid false positive for "xx != nil && len(xx) == 0"
        -				if isZero {
        -					return
        -				}
        -			case token.GEQ:
        -				// avoid false positive for "xx != nil && len(xx) >= 0"
        -				if isZero {
        -					return
        -				}
        -			case token.NEQ:
        -				// avoid false positive for "xx != nil && len(xx) != "
        -				if !isZero {
        -					return
        -				}
        -			case token.GTR:
        -				// ok
        -			default:
        -				return
        -			}
        -		}
        -
        -		// finally check that xx type is one of array, slice, map or chan
        -		// this is to prevent false positive in case if xx is a pointer to an array
        -		var nilType string
        -		switch pass.TypesInfo.TypeOf(xx).(type) {
        -		case *types.Slice:
        -			nilType = "nil slices"
        -		case *types.Map:
        -			nilType = "nil maps"
        -		case *types.Chan:
        -			nilType = "nil channels"
        -		default:
        -			return
        -		}
        -		ReportNodefFG(pass, expr, "should omit nil check; len() for %s is defined as zero", nilType)
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BinaryExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func LintSlicing(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		n := node.(*ast.SliceExpr)
        -		if n.Max != nil {
        -			return
        -		}
        -		s, ok := n.X.(*ast.Ident)
        -		if !ok || s.Obj == nil {
        -			return
        -		}
        -		call, ok := n.High.(*ast.CallExpr)
        -		if !ok || len(call.Args) != 1 || call.Ellipsis.IsValid() {
        -			return
        -		}
        -		fun, ok := call.Fun.(*ast.Ident)
        -		if !ok || fun.Name != "len" {
        -			return
        -		}
        -		if _, ok := pass.TypesInfo.ObjectOf(fun).(*types.Builtin); !ok {
        -			return
        -		}
        -		arg, ok := call.Args[Arg("len.v")].(*ast.Ident)
        -		if !ok || arg.Obj != s.Obj {
        -			return
        -		}
        -		ReportNodefFG(pass, n, "should omit second index in slice, s[a:len(s)] is identical to s[a:]")
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.SliceExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func refersTo(pass *analysis.Pass, expr ast.Expr, ident *ast.Ident) bool {
        -	found := false
        -	fn := func(node ast.Node) bool {
        -		ident2, ok := node.(*ast.Ident)
        -		if !ok {
        -			return true
        -		}
        -		if pass.TypesInfo.ObjectOf(ident) == pass.TypesInfo.ObjectOf(ident2) {
        -			found = true
        -			return false
        -		}
        -		return true
        -	}
        -	ast.Inspect(expr, fn)
        -	return found
        -}
        -
        -func LintLoopAppend(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		loop := node.(*ast.RangeStmt)
        -		if !IsBlank(loop.Key) {
        -			return
        -		}
        -		val, ok := loop.Value.(*ast.Ident)
        -		if !ok {
        -			return
        -		}
        -		if len(loop.Body.List) != 1 {
        -			return
        -		}
        -		stmt, ok := loop.Body.List[0].(*ast.AssignStmt)
        -		if !ok {
        -			return
        -		}
        -		if stmt.Tok != token.ASSIGN || len(stmt.Lhs) != 1 || len(stmt.Rhs) != 1 {
        -			return
        -		}
        -		if refersTo(pass, stmt.Lhs[0], val) {
        -			return
        -		}
        -		call, ok := stmt.Rhs[0].(*ast.CallExpr)
        -		if !ok {
        -			return
        -		}
        -		if len(call.Args) != 2 || call.Ellipsis.IsValid() {
        -			return
        -		}
        -		fun, ok := call.Fun.(*ast.Ident)
        -		if !ok {
        -			return
        -		}
        -		obj := pass.TypesInfo.ObjectOf(fun)
        -		fn, ok := obj.(*types.Builtin)
        -		if !ok || fn.Name() != "append" {
        -			return
        -		}
        -
        -		src := pass.TypesInfo.TypeOf(loop.X)
        -		dst := pass.TypesInfo.TypeOf(call.Args[Arg("append.slice")])
        -		// TODO(dominikh) remove nil check once Go issue #15173 has
        -		// been fixed
        -		if src == nil {
        -			return
        -		}
        -		if !types.Identical(src, dst) {
        -			return
        -		}
        -
        -		if Render(pass, stmt.Lhs[0]) != Render(pass, call.Args[Arg("append.slice")]) {
        -			return
        -		}
        -
        -		el, ok := call.Args[Arg("append.elems")].(*ast.Ident)
        -		if !ok {
        -			return
        -		}
        -		if pass.TypesInfo.ObjectOf(val) != pass.TypesInfo.ObjectOf(el) {
        -			return
        -		}
        -		ReportNodefFG(pass, loop, "should replace loop with %s = append(%s, %s...)",
        -			Render(pass, stmt.Lhs[0]), Render(pass, call.Args[Arg("append.slice")]), Render(pass, loop.X))
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.RangeStmt)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func LintTimeSince(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		call := node.(*ast.CallExpr)
        -		sel, ok := call.Fun.(*ast.SelectorExpr)
        -		if !ok {
        -			return
        -		}
        -		if !IsCallToAST(pass, sel.X, "time.Now") {
        -			return
        -		}
        -		if sel.Sel.Name != "Sub" {
        -			return
        -		}
        -		ReportNodefFG(pass, call, "should use time.Since instead of time.Now().Sub")
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func LintTimeUntil(pass *analysis.Pass) (interface{}, error) {
        -	if !IsGoVersion(pass, 8) {
        -		return nil, nil
        -	}
        -	fn := func(node ast.Node) {
        -		call := node.(*ast.CallExpr)
        -		if !IsCallToAST(pass, call, "(time.Time).Sub") {
        -			return
        -		}
        -		if !IsCallToAST(pass, call.Args[Arg("(time.Time).Sub.u")], "time.Now") {
        -			return
        -		}
        -		ReportNodefFG(pass, call, "should use time.Until instead of t.Sub(time.Now())")
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func LintUnnecessaryBlank(pass *analysis.Pass) (interface{}, error) {
        -	fn1 := func(node ast.Node) {
        -		assign := node.(*ast.AssignStmt)
        -		if len(assign.Lhs) != 2 || len(assign.Rhs) != 1 {
        -			return
        -		}
        -		if !IsBlank(assign.Lhs[1]) {
        -			return
        -		}
        -		switch rhs := assign.Rhs[0].(type) {
        -		case *ast.IndexExpr:
        -			// The type-checker should make sure that it's a map, but
        -			// let's be safe.
        -			if _, ok := pass.TypesInfo.TypeOf(rhs.X).Underlying().(*types.Map); !ok {
        -				return
        -			}
        -		case *ast.UnaryExpr:
        -			if rhs.Op != token.ARROW {
        -				return
        -			}
        -		default:
        -			return
        -		}
        -		cp := *assign
        -		cp.Lhs = cp.Lhs[0:1]
        -		ReportNodefFG(pass, assign, "should write %s instead of %s", Render(pass, &cp), Render(pass, assign))
        -	}
        -
        -	fn2 := func(node ast.Node) {
        -		stmt := node.(*ast.AssignStmt)
        -		if len(stmt.Lhs) != len(stmt.Rhs) {
        -			return
        -		}
        -		for i, lh := range stmt.Lhs {
        -			rh := stmt.Rhs[i]
        -			if !IsBlank(lh) {
        -				continue
        -			}
        -			expr, ok := rh.(*ast.UnaryExpr)
        -			if !ok {
        -				continue
        -			}
        -			if expr.Op != token.ARROW {
        -				continue
        -			}
        -			ReportNodefFG(pass, lh, "'_ = <-ch' can be simplified to '<-ch'")
        -		}
        -	}
        -
        -	fn3 := func(node ast.Node) {
        -		rs := node.(*ast.RangeStmt)
        -
        -		// for x, _
        -		if !IsBlank(rs.Key) && IsBlank(rs.Value) {
        -			ReportNodefFG(pass, rs.Value, "should omit value from range; this loop is equivalent to `for %s %s range ...`", Render(pass, rs.Key), rs.Tok)
        -		}
        -		// for _, _ || for _
        -		if IsBlank(rs.Key) && (IsBlank(rs.Value) || rs.Value == nil) {
        -			ReportNodefFG(pass, rs.Key, "should omit values from range; this loop is equivalent to `for range ...`")
        -		}
        -	}
        -
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.AssignStmt)(nil)}, fn1)
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.AssignStmt)(nil)}, fn2)
        -	if IsGoVersion(pass, 4) {
        -		pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.RangeStmt)(nil)}, fn3)
        -	}
        -	return nil, nil
        -}
        -
        -func LintSimplerStructConversion(pass *analysis.Pass) (interface{}, error) {
        -	var skip ast.Node
        -	fn := func(node ast.Node) {
        -		// Do not suggest type conversion between pointers
        -		if unary, ok := node.(*ast.UnaryExpr); ok && unary.Op == token.AND {
        -			if lit, ok := unary.X.(*ast.CompositeLit); ok {
        -				skip = lit
        -			}
        -			return
        -		}
        -
        -		if node == skip {
        -			return
        -		}
        -
        -		lit, ok := node.(*ast.CompositeLit)
        -		if !ok {
        -			return
        -		}
        -		typ1, _ := pass.TypesInfo.TypeOf(lit.Type).(*types.Named)
        -		if typ1 == nil {
        -			return
        -		}
        -		s1, ok := typ1.Underlying().(*types.Struct)
        -		if !ok {
        -			return
        -		}
        -
        -		var typ2 *types.Named
        -		var ident *ast.Ident
        -		getSelType := func(expr ast.Expr) (types.Type, *ast.Ident, bool) {
        -			sel, ok := expr.(*ast.SelectorExpr)
        -			if !ok {
        -				return nil, nil, false
        -			}
        -			ident, ok := sel.X.(*ast.Ident)
        -			if !ok {
        -				return nil, nil, false
        -			}
        -			typ := pass.TypesInfo.TypeOf(sel.X)
        -			return typ, ident, typ != nil
        -		}
        -		if len(lit.Elts) == 0 {
        -			return
        -		}
        -		if s1.NumFields() != len(lit.Elts) {
        -			return
        -		}
        -		for i, elt := range lit.Elts {
        -			var t types.Type
        -			var id *ast.Ident
        -			var ok bool
        -			switch elt := elt.(type) {
        -			case *ast.SelectorExpr:
        -				t, id, ok = getSelType(elt)
        -				if !ok {
        -					return
        -				}
        -				if i >= s1.NumFields() || s1.Field(i).Name() != elt.Sel.Name {
        -					return
        -				}
        -			case *ast.KeyValueExpr:
        -				var sel *ast.SelectorExpr
        -				sel, ok = elt.Value.(*ast.SelectorExpr)
        -				if !ok {
        -					return
        -				}
        -
        -				if elt.Key.(*ast.Ident).Name != sel.Sel.Name {
        -					return
        -				}
        -				t, id, ok = getSelType(elt.Value)
        -			}
        -			if !ok {
        -				return
        -			}
        -			// All fields must be initialized from the same object
        -			if ident != nil && ident.Obj != id.Obj {
        -				return
        -			}
        -			typ2, _ = t.(*types.Named)
        -			if typ2 == nil {
        -				return
        -			}
        -			ident = id
        -		}
        -
        -		if typ2 == nil {
        -			return
        -		}
        -
        -		if typ1.Obj().Pkg() != typ2.Obj().Pkg() {
        -			// Do not suggest type conversions between different
        -			// packages. Types in different packages might only match
        -			// by coincidence. Furthermore, if the dependency ever
        -			// adds more fields to its type, it could break the code
        -			// that relies on the type conversion to work.
        -			return
        -		}
        -
        -		s2, ok := typ2.Underlying().(*types.Struct)
        -		if !ok {
        -			return
        -		}
        -		if typ1 == typ2 {
        -			return
        -		}
        -		if IsGoVersion(pass, 8) {
        -			if !types.IdenticalIgnoreTags(s1, s2) {
        -				return
        -			}
        -		} else {
        -			if !types.Identical(s1, s2) {
        -				return
        -			}
        -		}
        -		ReportNodefFG(pass, node, "should convert %s (type %s) to %s instead of using struct literal",
        -			ident.Name, typ2.Obj().Name(), typ1.Obj().Name())
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.UnaryExpr)(nil), (*ast.CompositeLit)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func LintTrim(pass *analysis.Pass) (interface{}, error) {
        -	sameNonDynamic := func(node1, node2 ast.Node) bool {
        -		if reflect.TypeOf(node1) != reflect.TypeOf(node2) {
        -			return false
        -		}
        -
        -		switch node1 := node1.(type) {
        -		case *ast.Ident:
        -			return node1.Obj == node2.(*ast.Ident).Obj
        -		case *ast.SelectorExpr:
        -			return Render(pass, node1) == Render(pass, node2)
        -		case *ast.IndexExpr:
        -			return Render(pass, node1) == Render(pass, node2)
        -		}
        -		return false
        -	}
        -
        -	isLenOnIdent := func(fn ast.Expr, ident ast.Expr) bool {
        -		call, ok := fn.(*ast.CallExpr)
        -		if !ok {
        -			return false
        -		}
        -		if fn, ok := call.Fun.(*ast.Ident); !ok || fn.Name != "len" {
        -			return false
        -		}
        -		if len(call.Args) != 1 {
        -			return false
        -		}
        -		return sameNonDynamic(call.Args[Arg("len.v")], ident)
        -	}
        -
        -	fn := func(node ast.Node) {
        -		var pkg string
        -		var fun string
        -
        -		ifstmt := node.(*ast.IfStmt)
        -		if ifstmt.Init != nil {
        -			return
        -		}
        -		if ifstmt.Else != nil {
        -			return
        -		}
        -		if len(ifstmt.Body.List) != 1 {
        -			return
        -		}
        -		condCall, ok := ifstmt.Cond.(*ast.CallExpr)
        -		if !ok {
        -			return
        -		}
        -		switch {
        -		case IsCallToAST(pass, condCall, "strings.HasPrefix"):
        -			pkg = "strings"
        -			fun = "HasPrefix"
        -		case IsCallToAST(pass, condCall, "strings.HasSuffix"):
        -			pkg = "strings"
        -			fun = "HasSuffix"
        -		case IsCallToAST(pass, condCall, "strings.Contains"):
        -			pkg = "strings"
        -			fun = "Contains"
        -		case IsCallToAST(pass, condCall, "bytes.HasPrefix"):
        -			pkg = "bytes"
        -			fun = "HasPrefix"
        -		case IsCallToAST(pass, condCall, "bytes.HasSuffix"):
        -			pkg = "bytes"
        -			fun = "HasSuffix"
        -		case IsCallToAST(pass, condCall, "bytes.Contains"):
        -			pkg = "bytes"
        -			fun = "Contains"
        -		default:
        -			return
        -		}
        -
        -		assign, ok := ifstmt.Body.List[0].(*ast.AssignStmt)
        -		if !ok {
        -			return
        -		}
        -		if assign.Tok != token.ASSIGN {
        -			return
        -		}
        -		if len(assign.Lhs) != 1 || len(assign.Rhs) != 1 {
        -			return
        -		}
        -		if !sameNonDynamic(condCall.Args[0], assign.Lhs[0]) {
        -			return
        -		}
        -
        -		switch rhs := assign.Rhs[0].(type) {
        -		case *ast.CallExpr:
        -			if len(rhs.Args) < 2 || !sameNonDynamic(condCall.Args[0], rhs.Args[0]) || !sameNonDynamic(condCall.Args[1], rhs.Args[1]) {
        -				return
        -			}
        -			if IsCallToAST(pass, condCall, "strings.HasPrefix") && IsCallToAST(pass, rhs, "strings.TrimPrefix") ||
        -				IsCallToAST(pass, condCall, "strings.HasSuffix") && IsCallToAST(pass, rhs, "strings.TrimSuffix") ||
        -				IsCallToAST(pass, condCall, "strings.Contains") && IsCallToAST(pass, rhs, "strings.Replace") ||
        -				IsCallToAST(pass, condCall, "bytes.HasPrefix") && IsCallToAST(pass, rhs, "bytes.TrimPrefix") ||
        -				IsCallToAST(pass, condCall, "bytes.HasSuffix") && IsCallToAST(pass, rhs, "bytes.TrimSuffix") ||
        -				IsCallToAST(pass, condCall, "bytes.Contains") && IsCallToAST(pass, rhs, "bytes.Replace") {
        -				ReportNodefFG(pass, ifstmt, "should replace this if statement with an unconditional %s", CallNameAST(pass, rhs))
        -			}
        -			return
        -		case *ast.SliceExpr:
        -			slice := rhs
        -			if !ok {
        -				return
        -			}
        -			if slice.Slice3 {
        -				return
        -			}
        -			if !sameNonDynamic(slice.X, condCall.Args[0]) {
        -				return
        -			}
        -			var index ast.Expr
        -			switch fun {
        -			case "HasPrefix":
        -				// TODO(dh) We could detect a High that is len(s), but another
        -				// rule will already flag that, anyway.
        -				if slice.High != nil {
        -					return
        -				}
        -				index = slice.Low
        -			case "HasSuffix":
        -				if slice.Low != nil {
        -					n, ok := ExprToInt(pass, slice.Low)
        -					if !ok || n != 0 {
        -						return
        -					}
        -				}
        -				index = slice.High
        -			}
        -
        -			switch index := index.(type) {
        -			case *ast.CallExpr:
        -				if fun != "HasPrefix" {
        -					return
        -				}
        -				if fn, ok := index.Fun.(*ast.Ident); !ok || fn.Name != "len" {
        -					return
        -				}
        -				if len(index.Args) != 1 {
        -					return
        -				}
        -				id3 := index.Args[Arg("len.v")]
        -				switch oid3 := condCall.Args[1].(type) {
        -				case *ast.BasicLit:
        -					if pkg != "strings" {
        -						return
        -					}
        -					lit, ok := id3.(*ast.BasicLit)
        -					if !ok {
        -						return
        -					}
        -					s1, ok1 := ExprToString(pass, lit)
        -					s2, ok2 := ExprToString(pass, condCall.Args[1])
        -					if !ok1 || !ok2 || s1 != s2 {
        -						return
        -					}
        -				default:
        -					if !sameNonDynamic(id3, oid3) {
        -						return
        -					}
        -				}
        -			case *ast.BasicLit, *ast.Ident:
        -				if fun != "HasPrefix" {
        -					return
        -				}
        -				if pkg != "strings" {
        -					return
        -				}
        -				string, ok1 := ExprToString(pass, condCall.Args[1])
        -				int, ok2 := ExprToInt(pass, slice.Low)
        -				if !ok1 || !ok2 || int != int64(len(string)) {
        -					return
        -				}
        -			case *ast.BinaryExpr:
        -				if fun != "HasSuffix" {
        -					return
        -				}
        -				if index.Op != token.SUB {
        -					return
        -				}
        -				if !isLenOnIdent(index.X, condCall.Args[0]) ||
        -					!isLenOnIdent(index.Y, condCall.Args[1]) {
        -					return
        -				}
        -			default:
        -				return
        -			}
        -
        -			var replacement string
        -			switch fun {
        -			case "HasPrefix":
        -				replacement = "TrimPrefix"
        -			case "HasSuffix":
        -				replacement = "TrimSuffix"
        -			}
        -			ReportNodefFG(pass, ifstmt, "should replace this if statement with an unconditional %s.%s", pkg, replacement)
        -		}
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.IfStmt)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func LintLoopSlide(pass *analysis.Pass) (interface{}, error) {
        -	// TODO(dh): detect bs[i+offset] in addition to bs[offset+i]
        -	// TODO(dh): consider merging this function with LintLoopCopy
        -	// TODO(dh): detect length that is an expression, not a variable name
        -	// TODO(dh): support sliding to a different offset than the beginning of the slice
        -
        -	fn := func(node ast.Node) {
        -		/*
        -			for i := 0; i < n; i++ {
        -				bs[i] = bs[offset+i]
        -			}
        -
        -						↓
        -
        -			copy(bs[:n], bs[offset:offset+n])
        -		*/
        -
        -		loop := node.(*ast.ForStmt)
        -		if len(loop.Body.List) != 1 || loop.Init == nil || loop.Cond == nil || loop.Post == nil {
        -			return
        -		}
        -		assign, ok := loop.Init.(*ast.AssignStmt)
        -		if !ok || len(assign.Lhs) != 1 || len(assign.Rhs) != 1 || !IsZero(assign.Rhs[0]) {
        -			return
        -		}
        -		initvar, ok := assign.Lhs[0].(*ast.Ident)
        -		if !ok {
        -			return
        -		}
        -		post, ok := loop.Post.(*ast.IncDecStmt)
        -		if !ok || post.Tok != token.INC {
        -			return
        -		}
        -		postvar, ok := post.X.(*ast.Ident)
        -		if !ok || pass.TypesInfo.ObjectOf(postvar) != pass.TypesInfo.ObjectOf(initvar) {
        -			return
        -		}
        -		bin, ok := loop.Cond.(*ast.BinaryExpr)
        -		if !ok || bin.Op != token.LSS {
        -			return
        -		}
        -		binx, ok := bin.X.(*ast.Ident)
        -		if !ok || pass.TypesInfo.ObjectOf(binx) != pass.TypesInfo.ObjectOf(initvar) {
        -			return
        -		}
        -		biny, ok := bin.Y.(*ast.Ident)
        -		if !ok {
        -			return
        -		}
        -
        -		assign, ok = loop.Body.List[0].(*ast.AssignStmt)
        -		if !ok || len(assign.Lhs) != 1 || len(assign.Rhs) != 1 || assign.Tok != token.ASSIGN {
        -			return
        -		}
        -		lhs, ok := assign.Lhs[0].(*ast.IndexExpr)
        -		if !ok {
        -			return
        -		}
        -		rhs, ok := assign.Rhs[0].(*ast.IndexExpr)
        -		if !ok {
        -			return
        -		}
        -
        -		bs1, ok := lhs.X.(*ast.Ident)
        -		if !ok {
        -			return
        -		}
        -		bs2, ok := rhs.X.(*ast.Ident)
        -		if !ok {
        -			return
        -		}
        -		obj1 := pass.TypesInfo.ObjectOf(bs1)
        -		obj2 := pass.TypesInfo.ObjectOf(bs2)
        -		if obj1 != obj2 {
        -			return
        -		}
        -		if _, ok := obj1.Type().Underlying().(*types.Slice); !ok {
        -			return
        -		}
        -
        -		index1, ok := lhs.Index.(*ast.Ident)
        -		if !ok || pass.TypesInfo.ObjectOf(index1) != pass.TypesInfo.ObjectOf(initvar) {
        -			return
        -		}
        -		index2, ok := rhs.Index.(*ast.BinaryExpr)
        -		if !ok || index2.Op != token.ADD {
        -			return
        -		}
        -		add1, ok := index2.X.(*ast.Ident)
        -		if !ok {
        -			return
        -		}
        -		add2, ok := index2.Y.(*ast.Ident)
        -		if !ok || pass.TypesInfo.ObjectOf(add2) != pass.TypesInfo.ObjectOf(initvar) {
        -			return
        -		}
        -
        -		ReportNodefFG(pass, loop, "should use copy(%s[:%s], %s[%s:]) instead", Render(pass, bs1), Render(pass, biny), Render(pass, bs1), Render(pass, add1))
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.ForStmt)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func LintMakeLenCap(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		call := node.(*ast.CallExpr)
        -		if fn, ok := call.Fun.(*ast.Ident); !ok || fn.Name != "make" {
        -			// FIXME check whether make is indeed the built-in function
        -			return
        -		}
        -		switch len(call.Args) {
        -		case 2:
        -			// make(T, len)
        -			if _, ok := pass.TypesInfo.TypeOf(call.Args[Arg("make.t")]).Underlying().(*types.Slice); ok {
        -				break
        -			}
        -			if IsZero(call.Args[Arg("make.size[0]")]) {
        -				ReportNodefFG(pass, call.Args[Arg("make.size[0]")], "should use make(%s) instead", Render(pass, call.Args[Arg("make.t")]))
        -			}
        -		case 3:
        -			// make(T, len, cap)
        -			if Render(pass, call.Args[Arg("make.size[0]")]) == Render(pass, call.Args[Arg("make.size[1]")]) {
        -				ReportNodefFG(pass, call.Args[Arg("make.size[0]")],
        -					"should use make(%s, %s) instead",
        -					Render(pass, call.Args[Arg("make.t")]), Render(pass, call.Args[Arg("make.size[0]")]))
        -			}
        -		}
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func LintAssertNotNil(pass *analysis.Pass) (interface{}, error) {
        -	isNilCheck := func(ident *ast.Ident, expr ast.Expr) bool {
        -		xbinop, ok := expr.(*ast.BinaryExpr)
        -		if !ok || xbinop.Op != token.NEQ {
        -			return false
        -		}
        -		xident, ok := xbinop.X.(*ast.Ident)
        -		if !ok || xident.Obj != ident.Obj {
        -			return false
        -		}
        -		if !IsNil(pass, xbinop.Y) {
        -			return false
        -		}
        -		return true
        -	}
        -	isOKCheck := func(ident *ast.Ident, expr ast.Expr) bool {
        -		yident, ok := expr.(*ast.Ident)
        -		if !ok || yident.Obj != ident.Obj {
        -			return false
        -		}
        -		return true
        -	}
        -	fn1 := func(node ast.Node) {
        -		ifstmt := node.(*ast.IfStmt)
        -		assign, ok := ifstmt.Init.(*ast.AssignStmt)
        -		if !ok || len(assign.Lhs) != 2 || len(assign.Rhs) != 1 || !IsBlank(assign.Lhs[0]) {
        -			return
        -		}
        -		assert, ok := assign.Rhs[0].(*ast.TypeAssertExpr)
        -		if !ok {
        -			return
        -		}
        -		binop, ok := ifstmt.Cond.(*ast.BinaryExpr)
        -		if !ok || binop.Op != token.LAND {
        -			return
        -		}
        -		assertIdent, ok := assert.X.(*ast.Ident)
        -		if !ok {
        -			return
        -		}
        -		assignIdent, ok := assign.Lhs[1].(*ast.Ident)
        -		if !ok {
        -			return
        -		}
        -		if !(isNilCheck(assertIdent, binop.X) && isOKCheck(assignIdent, binop.Y)) &&
        -			!(isNilCheck(assertIdent, binop.Y) && isOKCheck(assignIdent, binop.X)) {
        -			return
        -		}
        -		ReportNodefFG(pass, ifstmt, "when %s is true, %s can't be nil", Render(pass, assignIdent), Render(pass, assertIdent))
        -	}
        -	fn2 := func(node ast.Node) {
        -		// Check that outer ifstmt is an 'if x != nil {}'
        -		ifstmt := node.(*ast.IfStmt)
        -		if ifstmt.Init != nil {
        -			return
        -		}
        -		if ifstmt.Else != nil {
        -			return
        -		}
        -		if len(ifstmt.Body.List) != 1 {
        -			return
        -		}
        -		binop, ok := ifstmt.Cond.(*ast.BinaryExpr)
        -		if !ok {
        -			return
        -		}
        -		if binop.Op != token.NEQ {
        -			return
        -		}
        -		lhs, ok := binop.X.(*ast.Ident)
        -		if !ok {
        -			return
        -		}
        -		if !IsNil(pass, binop.Y) {
        -			return
        -		}
        -
        -		// Check that inner ifstmt is an `if _, ok := x.(T); ok {}`
        -		ifstmt, ok = ifstmt.Body.List[0].(*ast.IfStmt)
        -		if !ok {
        -			return
        -		}
        -		assign, ok := ifstmt.Init.(*ast.AssignStmt)
        -		if !ok || len(assign.Lhs) != 2 || len(assign.Rhs) != 1 || !IsBlank(assign.Lhs[0]) {
        -			return
        -		}
        -		assert, ok := assign.Rhs[0].(*ast.TypeAssertExpr)
        -		if !ok {
        -			return
        -		}
        -		assertIdent, ok := assert.X.(*ast.Ident)
        -		if !ok {
        -			return
        -		}
        -		if lhs.Obj != assertIdent.Obj {
        -			return
        -		}
        -		assignIdent, ok := assign.Lhs[1].(*ast.Ident)
        -		if !ok {
        -			return
        -		}
        -		if !isOKCheck(assignIdent, ifstmt.Cond) {
        -			return
        -		}
        -		ReportNodefFG(pass, ifstmt, "when %s is true, %s can't be nil", Render(pass, assignIdent), Render(pass, assertIdent))
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.IfStmt)(nil)}, fn1)
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.IfStmt)(nil)}, fn2)
        -	return nil, nil
        -}
        -
        -func LintDeclareAssign(pass *analysis.Pass) (interface{}, error) {
        -	hasMultipleAssignments := func(root ast.Node, ident *ast.Ident) bool {
        -		num := 0
        -		ast.Inspect(root, func(node ast.Node) bool {
        -			if num >= 2 {
        -				return false
        -			}
        -			assign, ok := node.(*ast.AssignStmt)
        -			if !ok {
        -				return true
        -			}
        -			for _, lhs := range assign.Lhs {
        -				if oident, ok := lhs.(*ast.Ident); ok {
        -					if oident.Obj == ident.Obj {
        -						num++
        -					}
        -				}
        -			}
        -
        -			return true
        -		})
        -		return num >= 2
        -	}
        -	fn := func(node ast.Node) {
        -		block := node.(*ast.BlockStmt)
        -		if len(block.List) < 2 {
        -			return
        -		}
        -		for i, stmt := range block.List[:len(block.List)-1] {
        -			_ = i
        -			decl, ok := stmt.(*ast.DeclStmt)
        -			if !ok {
        -				continue
        -			}
        -			gdecl, ok := decl.Decl.(*ast.GenDecl)
        -			if !ok || gdecl.Tok != token.VAR || len(gdecl.Specs) != 1 {
        -				continue
        -			}
        -			vspec, ok := gdecl.Specs[0].(*ast.ValueSpec)
        -			if !ok || len(vspec.Names) != 1 || len(vspec.Values) != 0 {
        -				continue
        -			}
        -
        -			assign, ok := block.List[i+1].(*ast.AssignStmt)
        -			if !ok || assign.Tok != token.ASSIGN {
        -				continue
        -			}
        -			if len(assign.Lhs) != 1 || len(assign.Rhs) != 1 {
        -				continue
        -			}
        -			ident, ok := assign.Lhs[0].(*ast.Ident)
        -			if !ok {
        -				continue
        -			}
        -			if vspec.Names[0].Obj != ident.Obj {
        -				continue
        -			}
        -
        -			if refersTo(pass, assign.Rhs[0], ident) {
        -				continue
        -			}
        -			if hasMultipleAssignments(block, ident) {
        -				continue
        -			}
        -
        -			ReportNodefFG(pass, decl, "should merge variable declaration with assignment on next line")
        -		}
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BlockStmt)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func LintRedundantBreak(pass *analysis.Pass) (interface{}, error) {
        -	fn1 := func(node ast.Node) {
        -		clause := node.(*ast.CaseClause)
        -		if len(clause.Body) < 2 {
        -			return
        -		}
        -		branch, ok := clause.Body[len(clause.Body)-1].(*ast.BranchStmt)
        -		if !ok || branch.Tok != token.BREAK || branch.Label != nil {
        -			return
        -		}
        -		ReportNodefFG(pass, branch, "redundant break statement")
        -	}
        -	fn2 := func(node ast.Node) {
        -		var ret *ast.FieldList
        -		var body *ast.BlockStmt
        -		switch x := node.(type) {
        -		case *ast.FuncDecl:
        -			ret = x.Type.Results
        -			body = x.Body
        -		case *ast.FuncLit:
        -			ret = x.Type.Results
        -			body = x.Body
        -		default:
        -			panic(fmt.Sprintf("unreachable: %T", node))
        -		}
        -		// if the func has results, a return can't be redundant.
        -		// similarly, if there are no statements, there can be
        -		// no return.
        -		if ret != nil || body == nil || len(body.List) < 1 {
        -			return
        -		}
        -		rst, ok := body.List[len(body.List)-1].(*ast.ReturnStmt)
        -		if !ok {
        -			return
        -		}
        -		// we don't need to check rst.Results as we already
        -		// checked x.Type.Results to be nil.
        -		ReportNodefFG(pass, rst, "redundant return statement")
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CaseClause)(nil)}, fn1)
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.FuncDecl)(nil), (*ast.FuncLit)(nil)}, fn2)
        -	return nil, nil
        -}
        -
        -func isStringer(T types.Type, msCache *typeutil.MethodSetCache) bool {
        -	ms := msCache.MethodSet(T)
        -	sel := ms.Lookup(nil, "String")
        -	if sel == nil {
        -		return false
        -	}
        -	fn, ok := sel.Obj().(*types.Func)
        -	if !ok {
        -		// should be unreachable
        -		return false
        -	}
        -	sig := fn.Type().(*types.Signature)
        -	if sig.Params().Len() != 0 {
        -		return false
        -	}
        -	if sig.Results().Len() != 1 {
        -		return false
        -	}
        -	if !IsType(sig.Results().At(0).Type(), "string") {
        -		return false
        -	}
        -	return true
        -}
        -
        -func LintRedundantSprintf(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		call := node.(*ast.CallExpr)
        -		if !IsCallToAST(pass, call, "fmt.Sprintf") {
        -			return
        -		}
        -		if len(call.Args) != 2 {
        -			return
        -		}
        -		if s, ok := ExprToString(pass, call.Args[Arg("fmt.Sprintf.format")]); !ok || s != "%s" {
        -			return
        -		}
        -		arg := call.Args[Arg("fmt.Sprintf.a[0]")]
        -		typ := pass.TypesInfo.TypeOf(arg)
        -
        -		ssapkg := pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).Pkg
        -		if isStringer(typ, &ssapkg.Prog.MethodSets) {
        -			ReportNodef(pass, call, "should use String() instead of fmt.Sprintf")
        -			return
        -		}
        -
        -		if typ.Underlying() == types.Universe.Lookup("string").Type() {
        -			if typ == types.Universe.Lookup("string").Type() {
        -				ReportNodefFG(pass, call, "the argument is already a string, there's no need to use fmt.Sprintf")
        -			} else {
        -				ReportNodefFG(pass, call, "the argument's underlying type is a string, should use a simple conversion instead of fmt.Sprintf")
        -			}
        -		}
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func LintErrorsNewSprintf(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		if !IsCallToAST(pass, node, "errors.New") {
        -			return
        -		}
        -		call := node.(*ast.CallExpr)
        -		if !IsCallToAST(pass, call.Args[Arg("errors.New.text")], "fmt.Sprintf") {
        -			return
        -		}
        -		ReportNodefFG(pass, node, "should use fmt.Errorf(...) instead of errors.New(fmt.Sprintf(...))")
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func LintRangeStringRunes(pass *analysis.Pass) (interface{}, error) {
        -	return sharedcheck.CheckRangeStringRunes(pass)
        -}
        -
        -func LintNilCheckAroundRange(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		ifstmt := node.(*ast.IfStmt)
        -		cond, ok := ifstmt.Cond.(*ast.BinaryExpr)
        -		if !ok {
        -			return
        -		}
        -
        -		if cond.Op != token.NEQ || !IsNil(pass, cond.Y) || len(ifstmt.Body.List) != 1 {
        -			return
        -		}
        -
        -		loop, ok := ifstmt.Body.List[0].(*ast.RangeStmt)
        -		if !ok {
        -			return
        -		}
        -		ifXIdent, ok := cond.X.(*ast.Ident)
        -		if !ok {
        -			return
        -		}
        -		rangeXIdent, ok := loop.X.(*ast.Ident)
        -		if !ok {
        -			return
        -		}
        -		if ifXIdent.Obj != rangeXIdent.Obj {
        -			return
        -		}
        -		switch pass.TypesInfo.TypeOf(rangeXIdent).(type) {
        -		case *types.Slice, *types.Map:
        -			ReportNodefFG(pass, node, "unnecessary nil check around range")
        -		}
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.IfStmt)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func isPermissibleSort(pass *analysis.Pass, node ast.Node) bool {
        -	call := node.(*ast.CallExpr)
        -	typeconv, ok := call.Args[0].(*ast.CallExpr)
        -	if !ok {
        -		return true
        -	}
        -
        -	sel, ok := typeconv.Fun.(*ast.SelectorExpr)
        -	if !ok {
        -		return true
        -	}
        -	name := SelectorName(pass, sel)
        -	switch name {
        -	case "sort.IntSlice", "sort.Float64Slice", "sort.StringSlice":
        -	default:
        -		return true
        -	}
        -
        -	return false
        -}
        -
        -func LintSortHelpers(pass *analysis.Pass) (interface{}, error) {
        -	type Error struct {
        -		node ast.Node
        -		msg  string
        -	}
        -	var allErrors []Error
        -	fn := func(node ast.Node) {
        -		var body *ast.BlockStmt
        -		switch node := node.(type) {
        -		case *ast.FuncLit:
        -			body = node.Body
        -		case *ast.FuncDecl:
        -			body = node.Body
        -		default:
        -			panic(fmt.Sprintf("unreachable: %T", node))
        -		}
        -		if body == nil {
        -			return
        -		}
        -
        -		var errors []Error
        -		permissible := false
        -		fnSorts := func(node ast.Node) bool {
        -			if permissible {
        -				return false
        -			}
        -			if !IsCallToAST(pass, node, "sort.Sort") {
        -				return true
        -			}
        -			if isPermissibleSort(pass, node) {
        -				permissible = true
        -				return false
        -			}
        -			call := node.(*ast.CallExpr)
        -			typeconv := call.Args[Arg("sort.Sort.data")].(*ast.CallExpr)
        -			sel := typeconv.Fun.(*ast.SelectorExpr)
        -			name := SelectorName(pass, sel)
        -
        -			switch name {
        -			case "sort.IntSlice":
        -				errors = append(errors, Error{node, "should use sort.Ints(...) instead of sort.Sort(sort.IntSlice(...))"})
        -			case "sort.Float64Slice":
        -				errors = append(errors, Error{node, "should use sort.Float64s(...) instead of sort.Sort(sort.Float64Slice(...))"})
        -			case "sort.StringSlice":
        -				errors = append(errors, Error{node, "should use sort.Strings(...) instead of sort.Sort(sort.StringSlice(...))"})
        -			}
        -			return true
        -		}
        -		ast.Inspect(body, fnSorts)
        -
        -		if permissible {
        -			return
        -		}
        -		allErrors = append(allErrors, errors...)
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.FuncLit)(nil), (*ast.FuncDecl)(nil)}, fn)
        -	sort.Slice(allErrors, func(i, j int) bool {
        -		return allErrors[i].node.Pos() < allErrors[j].node.Pos()
        -	})
        -	var prev token.Pos
        -	for _, err := range allErrors {
        -		if err.node.Pos() == prev {
        -			continue
        -		}
        -		prev = err.node.Pos()
        -		ReportNodefFG(pass, err.node, "%s", err.msg)
        -	}
        -	return nil, nil
        -}
        -
        -func LintGuardedDelete(pass *analysis.Pass) (interface{}, error) {
        -	isCommaOkMapIndex := func(stmt ast.Stmt) (b *ast.Ident, m ast.Expr, key ast.Expr, ok bool) {
        -		// Has to be of the form `_,  = []
        -
        -		assign, ok := stmt.(*ast.AssignStmt)
        -		if !ok {
        -			return nil, nil, nil, false
        -		}
        -		if len(assign.Lhs) != 2 || len(assign.Rhs) != 1 {
        -			return nil, nil, nil, false
        -		}
        -		if !IsBlank(assign.Lhs[0]) {
        -			return nil, nil, nil, false
        -		}
        -		ident, ok := assign.Lhs[1].(*ast.Ident)
        -		if !ok {
        -			return nil, nil, nil, false
        -		}
        -		index, ok := assign.Rhs[0].(*ast.IndexExpr)
        -		if !ok {
        -			return nil, nil, nil, false
        -		}
        -		if _, ok := pass.TypesInfo.TypeOf(index.X).(*types.Map); !ok {
        -			return nil, nil, nil, false
        -		}
        -		key = index.Index
        -		return ident, index.X, key, true
        -	}
        -	fn := func(node ast.Node) {
        -		stmt := node.(*ast.IfStmt)
        -		if len(stmt.Body.List) != 1 {
        -			return
        -		}
        -		if stmt.Else != nil {
        -			return
        -		}
        -		expr, ok := stmt.Body.List[0].(*ast.ExprStmt)
        -		if !ok {
        -			return
        -		}
        -		call, ok := expr.X.(*ast.CallExpr)
        -		if !ok {
        -			return
        -		}
        -		if !IsCallToAST(pass, call, "delete") {
        -			return
        -		}
        -		b, m, key, ok := isCommaOkMapIndex(stmt.Init)
        -		if !ok {
        -			return
        -		}
        -		if cond, ok := stmt.Cond.(*ast.Ident); !ok || pass.TypesInfo.ObjectOf(cond) != pass.TypesInfo.ObjectOf(b) {
        -			return
        -		}
        -		if Render(pass, call.Args[0]) != Render(pass, m) || Render(pass, call.Args[1]) != Render(pass, key) {
        -			return
        -		}
        -		ReportNodefFG(pass, stmt, "unnecessary guard around call to delete")
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.IfStmt)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func LintSimplifyTypeSwitch(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		stmt := node.(*ast.TypeSwitchStmt)
        -		if stmt.Init != nil {
        -			// bailing out for now, can't anticipate how type switches with initializers are being used
        -			return
        -		}
        -		expr, ok := stmt.Assign.(*ast.ExprStmt)
        -		if !ok {
        -			// the user is in fact assigning the result
        -			return
        -		}
        -		assert := expr.X.(*ast.TypeAssertExpr)
        -		ident, ok := assert.X.(*ast.Ident)
        -		if !ok {
        -			return
        -		}
        -		x := pass.TypesInfo.ObjectOf(ident)
        -		var allOffenders []ast.Node
        -		for _, clause := range stmt.Body.List {
        -			clause := clause.(*ast.CaseClause)
        -			if len(clause.List) != 1 {
        -				continue
        -			}
        -			hasUnrelatedAssertion := false
        -			var offenders []ast.Node
        -			ast.Inspect(clause, func(node ast.Node) bool {
        -				assert2, ok := node.(*ast.TypeAssertExpr)
        -				if !ok {
        -					return true
        -				}
        -				ident, ok := assert2.X.(*ast.Ident)
        -				if !ok {
        -					hasUnrelatedAssertion = true
        -					return false
        -				}
        -				if pass.TypesInfo.ObjectOf(ident) != x {
        -					hasUnrelatedAssertion = true
        -					return false
        -				}
        -
        -				if !types.Identical(pass.TypesInfo.TypeOf(clause.List[0]), pass.TypesInfo.TypeOf(assert2.Type)) {
        -					hasUnrelatedAssertion = true
        -					return false
        -				}
        -				offenders = append(offenders, assert2)
        -				return true
        -			})
        -			if !hasUnrelatedAssertion {
        -				// don't flag cases that have other type assertions
        -				// unrelated to the one in the case clause. often
        -				// times, this is done for symmetry, when two
        -				// different values have to be asserted to the same
        -				// type.
        -				allOffenders = append(allOffenders, offenders...)
        -			}
        -		}
        -		if len(allOffenders) != 0 {
        -			at := ""
        -			for _, offender := range allOffenders {
        -				pos := lint.DisplayPosition(pass.Fset, offender.Pos())
        -				at += "\n\t" + pos.String()
        -			}
        -			ReportNodefFG(pass, expr, "assigning the result of this type assertion to a variable (switch %s := %s.(type)) could eliminate the following type assertions:%s", Render(pass, ident), Render(pass, ident), at)
        -		}
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.TypeSwitchStmt)(nil)}, fn)
        -	return nil, nil
        -}
        diff --git a/vendor/honnef.co/go/tools/ssa/LICENSE b/vendor/honnef.co/go/tools/ssa/LICENSE
        deleted file mode 100644
        index aee48041e..000000000
        --- a/vendor/honnef.co/go/tools/ssa/LICENSE
        +++ /dev/null
        @@ -1,28 +0,0 @@
        -Copyright (c) 2009 The Go Authors. All rights reserved.
        -Copyright (c) 2016 Dominik Honnef. All rights reserved.
        -
        -Redistribution and use in source and binary forms, with or without
        -modification, are permitted provided that the following conditions are
        -met:
        -
        -   * Redistributions of source code must retain the above copyright
        -notice, this list of conditions and the following disclaimer.
        -   * Redistributions in binary form must reproduce the above
        -copyright notice, this list of conditions and the following disclaimer
        -in the documentation and/or other materials provided with the
        -distribution.
        -   * Neither the name of Google Inc. nor the names of its
        -contributors may be used to endorse or promote products derived from
        -this software without specific prior written permission.
        -
        -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
        -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
        -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
        -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
        -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
        -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
        -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
        -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
        -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
        -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        diff --git a/vendor/honnef.co/go/tools/ssa/blockopt.go b/vendor/honnef.co/go/tools/ssa/blockopt.go
        deleted file mode 100644
        index 22c9a4c0d..000000000
        --- a/vendor/honnef.co/go/tools/ssa/blockopt.go
        +++ /dev/null
        @@ -1,195 +0,0 @@
        -// Copyright 2013 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package ssa
        -
        -// Simple block optimizations to simplify the control flow graph.
        -
        -// TODO(adonovan): opt: instead of creating several "unreachable" blocks
        -// per function in the Builder, reuse a single one (e.g. at Blocks[1])
        -// to reduce garbage.
        -
        -import (
        -	"fmt"
        -	"os"
        -)
        -
        -// If true, perform sanity checking and show progress at each
        -// successive iteration of optimizeBlocks.  Very verbose.
        -const debugBlockOpt = false
        -
        -// markReachable sets Index=-1 for all blocks reachable from b.
        -func markReachable(b *BasicBlock) {
        -	b.Index = -1
        -	for _, succ := range b.Succs {
        -		if succ.Index == 0 {
        -			markReachable(succ)
        -		}
        -	}
        -}
        -
        -func DeleteUnreachableBlocks(f *Function) {
        -	deleteUnreachableBlocks(f)
        -}
        -
        -// deleteUnreachableBlocks marks all reachable blocks of f and
        -// eliminates (nils) all others, including possibly cyclic subgraphs.
        -//
        -func deleteUnreachableBlocks(f *Function) {
        -	const white, black = 0, -1
        -	// We borrow b.Index temporarily as the mark bit.
        -	for _, b := range f.Blocks {
        -		b.Index = white
        -	}
        -	markReachable(f.Blocks[0])
        -	if f.Recover != nil {
        -		markReachable(f.Recover)
        -	}
        -	for i, b := range f.Blocks {
        -		if b.Index == white {
        -			for _, c := range b.Succs {
        -				if c.Index == black {
        -					c.removePred(b) // delete white->black edge
        -				}
        -			}
        -			if debugBlockOpt {
        -				fmt.Fprintln(os.Stderr, "unreachable", b)
        -			}
        -			f.Blocks[i] = nil // delete b
        -		}
        -	}
        -	f.removeNilBlocks()
        -}
        -
        -// jumpThreading attempts to apply simple jump-threading to block b,
        -// in which a->b->c become a->c if b is just a Jump.
        -// The result is true if the optimization was applied.
        -//
        -func jumpThreading(f *Function, b *BasicBlock) bool {
        -	if b.Index == 0 {
        -		return false // don't apply to entry block
        -	}
        -	if b.Instrs == nil {
        -		return false
        -	}
        -	if _, ok := b.Instrs[0].(*Jump); !ok {
        -		return false // not just a jump
        -	}
        -	c := b.Succs[0]
        -	if c == b {
        -		return false // don't apply to degenerate jump-to-self.
        -	}
        -	if c.hasPhi() {
        -		return false // not sound without more effort
        -	}
        -	for j, a := range b.Preds {
        -		a.replaceSucc(b, c)
        -
        -		// If a now has two edges to c, replace its degenerate If by Jump.
        -		if len(a.Succs) == 2 && a.Succs[0] == c && a.Succs[1] == c {
        -			jump := new(Jump)
        -			jump.setBlock(a)
        -			a.Instrs[len(a.Instrs)-1] = jump
        -			a.Succs = a.Succs[:1]
        -			c.removePred(b)
        -		} else {
        -			if j == 0 {
        -				c.replacePred(b, a)
        -			} else {
        -				c.Preds = append(c.Preds, a)
        -			}
        -		}
        -
        -		if debugBlockOpt {
        -			fmt.Fprintln(os.Stderr, "jumpThreading", a, b, c)
        -		}
        -	}
        -	f.Blocks[b.Index] = nil // delete b
        -	return true
        -}
        -
        -// fuseBlocks attempts to apply the block fusion optimization to block
        -// a, in which a->b becomes ab if len(a.Succs)==len(b.Preds)==1.
        -// The result is true if the optimization was applied.
        -//
        -func fuseBlocks(f *Function, a *BasicBlock) bool {
        -	if len(a.Succs) != 1 {
        -		return false
        -	}
        -	b := a.Succs[0]
        -	if len(b.Preds) != 1 {
        -		return false
        -	}
        -
        -	// Degenerate &&/|| ops may result in a straight-line CFG
        -	// containing φ-nodes. (Ideally we'd replace such them with
        -	// their sole operand but that requires Referrers, built later.)
        -	if b.hasPhi() {
        -		return false // not sound without further effort
        -	}
        -
        -	// Eliminate jump at end of A, then copy all of B across.
        -	a.Instrs = append(a.Instrs[:len(a.Instrs)-1], b.Instrs...)
        -	for _, instr := range b.Instrs {
        -		instr.setBlock(a)
        -	}
        -
        -	// A inherits B's successors
        -	a.Succs = append(a.succs2[:0], b.Succs...)
        -
        -	// Fix up Preds links of all successors of B.
        -	for _, c := range b.Succs {
        -		c.replacePred(b, a)
        -	}
        -
        -	if debugBlockOpt {
        -		fmt.Fprintln(os.Stderr, "fuseBlocks", a, b)
        -	}
        -
        -	f.Blocks[b.Index] = nil // delete b
        -	return true
        -}
        -
        -func OptimizeBlocks(f *Function) {
        -	optimizeBlocks(f)
        -}
        -
        -// optimizeBlocks() performs some simple block optimizations on a
        -// completed function: dead block elimination, block fusion, jump
        -// threading.
        -//
        -func optimizeBlocks(f *Function) {
        -	deleteUnreachableBlocks(f)
        -
        -	// Loop until no further progress.
        -	changed := true
        -	for changed {
        -		changed = false
        -
        -		if debugBlockOpt {
        -			f.WriteTo(os.Stderr)
        -			mustSanityCheck(f, nil)
        -		}
        -
        -		for _, b := range f.Blocks {
        -			// f.Blocks will temporarily contain nils to indicate
        -			// deleted blocks; we remove them at the end.
        -			if b == nil {
        -				continue
        -			}
        -
        -			// Fuse blocks.  b->c becomes bc.
        -			if fuseBlocks(f, b) {
        -				changed = true
        -			}
        -
        -			// a->b->c becomes a->c if b contains only a Jump.
        -			if jumpThreading(f, b) {
        -				changed = true
        -				continue // (b was disconnected)
        -			}
        -		}
        -	}
        -	f.removeNilBlocks()
        -}
        diff --git a/vendor/honnef.co/go/tools/ssa/builder.go b/vendor/honnef.co/go/tools/ssa/builder.go
        deleted file mode 100644
        index 317ac0611..000000000
        --- a/vendor/honnef.co/go/tools/ssa/builder.go
        +++ /dev/null
        @@ -1,2379 +0,0 @@
        -// Copyright 2013 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package ssa
        -
        -// This file implements the BUILD phase of SSA construction.
        -//
        -// SSA construction has two phases, CREATE and BUILD.  In the CREATE phase
        -// (create.go), all packages are constructed and type-checked and
        -// definitions of all package members are created, method-sets are
        -// computed, and wrapper methods are synthesized.
        -// ssa.Packages are created in arbitrary order.
        -//
        -// In the BUILD phase (builder.go), the builder traverses the AST of
        -// each Go source function and generates SSA instructions for the
        -// function body.  Initializer expressions for package-level variables
        -// are emitted to the package's init() function in the order specified
        -// by go/types.Info.InitOrder, then code for each function in the
        -// package is generated in lexical order.
        -// The BUILD phases for distinct packages are independent and are
        -// executed in parallel.
        -//
        -// TODO(adonovan): indeed, building functions is now embarrassingly parallel.
        -// Audit for concurrency then benchmark using more goroutines.
        -//
        -// The builder's and Program's indices (maps) are populated and
        -// mutated during the CREATE phase, but during the BUILD phase they
        -// remain constant.  The sole exception is Prog.methodSets and its
        -// related maps, which are protected by a dedicated mutex.
        -
        -import (
        -	"fmt"
        -	"go/ast"
        -	"go/constant"
        -	"go/token"
        -	"go/types"
        -	"os"
        -	"sync"
        -)
        -
        -type opaqueType struct {
        -	types.Type
        -	name string
        -}
        -
        -func (t *opaqueType) String() string { return t.name }
        -
        -var (
        -	varOk    = newVar("ok", tBool)
        -	varIndex = newVar("index", tInt)
        -
        -	// Type constants.
        -	tBool       = types.Typ[types.Bool]
        -	tByte       = types.Typ[types.Byte]
        -	tInt        = types.Typ[types.Int]
        -	tInvalid    = types.Typ[types.Invalid]
        -	tString     = types.Typ[types.String]
        -	tUntypedNil = types.Typ[types.UntypedNil]
        -	tRangeIter  = &opaqueType{nil, "iter"} // the type of all "range" iterators
        -	tEface      = types.NewInterfaceType(nil, nil).Complete()
        -
        -	// SSA Value constants.
        -	vZero = intConst(0)
        -	vOne  = intConst(1)
        -	vTrue = NewConst(constant.MakeBool(true), tBool)
        -)
        -
        -// builder holds state associated with the package currently being built.
        -// Its methods contain all the logic for AST-to-SSA conversion.
        -type builder struct{}
        -
        -// cond emits to fn code to evaluate boolean condition e and jump
        -// to t or f depending on its value, performing various simplifications.
        -//
        -// Postcondition: fn.currentBlock is nil.
        -//
        -func (b *builder) cond(fn *Function, e ast.Expr, t, f *BasicBlock) {
        -	switch e := e.(type) {
        -	case *ast.ParenExpr:
        -		b.cond(fn, e.X, t, f)
        -		return
        -
        -	case *ast.BinaryExpr:
        -		switch e.Op {
        -		case token.LAND:
        -			ltrue := fn.newBasicBlock("cond.true")
        -			b.cond(fn, e.X, ltrue, f)
        -			fn.currentBlock = ltrue
        -			b.cond(fn, e.Y, t, f)
        -			return
        -
        -		case token.LOR:
        -			lfalse := fn.newBasicBlock("cond.false")
        -			b.cond(fn, e.X, t, lfalse)
        -			fn.currentBlock = lfalse
        -			b.cond(fn, e.Y, t, f)
        -			return
        -		}
        -
        -	case *ast.UnaryExpr:
        -		if e.Op == token.NOT {
        -			b.cond(fn, e.X, f, t)
        -			return
        -		}
        -	}
        -
        -	// A traditional compiler would simplify "if false" (etc) here
        -	// but we do not, for better fidelity to the source code.
        -	//
        -	// The value of a constant condition may be platform-specific,
        -	// and may cause blocks that are reachable in some configuration
        -	// to be hidden from subsequent analyses such as bug-finding tools.
        -	emitIf(fn, b.expr(fn, e), t, f)
        -}
        -
        -// logicalBinop emits code to fn to evaluate e, a &&- or
        -// ||-expression whose reified boolean value is wanted.
        -// The value is returned.
        -//
        -func (b *builder) logicalBinop(fn *Function, e *ast.BinaryExpr) Value {
        -	rhs := fn.newBasicBlock("binop.rhs")
        -	done := fn.newBasicBlock("binop.done")
        -
        -	// T(e) = T(e.X) = T(e.Y) after untyped constants have been
        -	// eliminated.
        -	// TODO(adonovan): not true; MyBool==MyBool yields UntypedBool.
        -	t := fn.Pkg.typeOf(e)
        -
        -	var short Value // value of the short-circuit path
        -	switch e.Op {
        -	case token.LAND:
        -		b.cond(fn, e.X, rhs, done)
        -		short = NewConst(constant.MakeBool(false), t)
        -
        -	case token.LOR:
        -		b.cond(fn, e.X, done, rhs)
        -		short = NewConst(constant.MakeBool(true), t)
        -	}
        -
        -	// Is rhs unreachable?
        -	if rhs.Preds == nil {
        -		// Simplify false&&y to false, true||y to true.
        -		fn.currentBlock = done
        -		return short
        -	}
        -
        -	// Is done unreachable?
        -	if done.Preds == nil {
        -		// Simplify true&&y (or false||y) to y.
        -		fn.currentBlock = rhs
        -		return b.expr(fn, e.Y)
        -	}
        -
        -	// All edges from e.X to done carry the short-circuit value.
        -	var edges []Value
        -	for range done.Preds {
        -		edges = append(edges, short)
        -	}
        -
        -	// The edge from e.Y to done carries the value of e.Y.
        -	fn.currentBlock = rhs
        -	edges = append(edges, b.expr(fn, e.Y))
        -	emitJump(fn, done)
        -	fn.currentBlock = done
        -
        -	phi := &Phi{Edges: edges, Comment: e.Op.String()}
        -	phi.pos = e.OpPos
        -	phi.typ = t
        -	return done.emit(phi)
        -}
        -
        -// exprN lowers a multi-result expression e to SSA form, emitting code
        -// to fn and returning a single Value whose type is a *types.Tuple.
        -// The caller must access the components via Extract.
        -//
        -// Multi-result expressions include CallExprs in a multi-value
        -// assignment or return statement, and "value,ok" uses of
        -// TypeAssertExpr, IndexExpr (when X is a map), and UnaryExpr (when Op
        -// is token.ARROW).
        -//
        -func (b *builder) exprN(fn *Function, e ast.Expr) Value {
        -	typ := fn.Pkg.typeOf(e).(*types.Tuple)
        -	switch e := e.(type) {
        -	case *ast.ParenExpr:
        -		return b.exprN(fn, e.X)
        -
        -	case *ast.CallExpr:
        -		// Currently, no built-in function nor type conversion
        -		// has multiple results, so we can avoid some of the
        -		// cases for single-valued CallExpr.
        -		var c Call
        -		b.setCall(fn, e, &c.Call)
        -		c.typ = typ
        -		return fn.emit(&c)
        -
        -	case *ast.IndexExpr:
        -		mapt := fn.Pkg.typeOf(e.X).Underlying().(*types.Map)
        -		lookup := &Lookup{
        -			X:       b.expr(fn, e.X),
        -			Index:   emitConv(fn, b.expr(fn, e.Index), mapt.Key()),
        -			CommaOk: true,
        -		}
        -		lookup.setType(typ)
        -		lookup.setPos(e.Lbrack)
        -		return fn.emit(lookup)
        -
        -	case *ast.TypeAssertExpr:
        -		return emitTypeTest(fn, b.expr(fn, e.X), typ.At(0).Type(), e.Lparen)
        -
        -	case *ast.UnaryExpr: // must be receive <-
        -		unop := &UnOp{
        -			Op:      token.ARROW,
        -			X:       b.expr(fn, e.X),
        -			CommaOk: true,
        -		}
        -		unop.setType(typ)
        -		unop.setPos(e.OpPos)
        -		return fn.emit(unop)
        -	}
        -	panic(fmt.Sprintf("exprN(%T) in %s", e, fn))
        -}
        -
        -// builtin emits to fn SSA instructions to implement a call to the
        -// built-in function obj with the specified arguments
        -// and return type.  It returns the value defined by the result.
        -//
        -// The result is nil if no special handling was required; in this case
        -// the caller should treat this like an ordinary library function
        -// call.
        -//
        -func (b *builder) builtin(fn *Function, obj *types.Builtin, args []ast.Expr, typ types.Type, pos token.Pos) Value {
        -	switch obj.Name() {
        -	case "make":
        -		switch typ.Underlying().(type) {
        -		case *types.Slice:
        -			n := b.expr(fn, args[1])
        -			m := n
        -			if len(args) == 3 {
        -				m = b.expr(fn, args[2])
        -			}
        -			if m, ok := m.(*Const); ok {
        -				// treat make([]T, n, m) as new([m]T)[:n]
        -				cap := m.Int64()
        -				at := types.NewArray(typ.Underlying().(*types.Slice).Elem(), cap)
        -				alloc := emitNew(fn, at, pos)
        -				alloc.Comment = "makeslice"
        -				v := &Slice{
        -					X:    alloc,
        -					High: n,
        -				}
        -				v.setPos(pos)
        -				v.setType(typ)
        -				return fn.emit(v)
        -			}
        -			v := &MakeSlice{
        -				Len: n,
        -				Cap: m,
        -			}
        -			v.setPos(pos)
        -			v.setType(typ)
        -			return fn.emit(v)
        -
        -		case *types.Map:
        -			var res Value
        -			if len(args) == 2 {
        -				res = b.expr(fn, args[1])
        -			}
        -			v := &MakeMap{Reserve: res}
        -			v.setPos(pos)
        -			v.setType(typ)
        -			return fn.emit(v)
        -
        -		case *types.Chan:
        -			var sz Value = vZero
        -			if len(args) == 2 {
        -				sz = b.expr(fn, args[1])
        -			}
        -			v := &MakeChan{Size: sz}
        -			v.setPos(pos)
        -			v.setType(typ)
        -			return fn.emit(v)
        -		}
        -
        -	case "new":
        -		alloc := emitNew(fn, deref(typ), pos)
        -		alloc.Comment = "new"
        -		return alloc
        -
        -	case "len", "cap":
        -		// Special case: len or cap of an array or *array is
        -		// based on the type, not the value which may be nil.
        -		// We must still evaluate the value, though.  (If it
        -		// was side-effect free, the whole call would have
        -		// been constant-folded.)
        -		t := deref(fn.Pkg.typeOf(args[0])).Underlying()
        -		if at, ok := t.(*types.Array); ok {
        -			b.expr(fn, args[0]) // for effects only
        -			return intConst(at.Len())
        -		}
        -		// Otherwise treat as normal.
        -
        -	case "panic":
        -		fn.emit(&Panic{
        -			X:   emitConv(fn, b.expr(fn, args[0]), tEface),
        -			pos: pos,
        -		})
        -		fn.currentBlock = fn.newBasicBlock("unreachable")
        -		return vTrue // any non-nil Value will do
        -	}
        -	return nil // treat all others as a regular function call
        -}
        -
        -// addr lowers a single-result addressable expression e to SSA form,
        -// emitting code to fn and returning the location (an lvalue) defined
        -// by the expression.
        -//
        -// If escaping is true, addr marks the base variable of the
        -// addressable expression e as being a potentially escaping pointer
        -// value.  For example, in this code:
        -//
        -//   a := A{
        -//     b: [1]B{B{c: 1}}
        -//   }
        -//   return &a.b[0].c
        -//
        -// the application of & causes a.b[0].c to have its address taken,
        -// which means that ultimately the local variable a must be
        -// heap-allocated.  This is a simple but very conservative escape
        -// analysis.
        -//
        -// Operations forming potentially escaping pointers include:
        -// - &x, including when implicit in method call or composite literals.
        -// - a[:] iff a is an array (not *array)
        -// - references to variables in lexically enclosing functions.
        -//
        -func (b *builder) addr(fn *Function, e ast.Expr, escaping bool) lvalue {
        -	switch e := e.(type) {
        -	case *ast.Ident:
        -		if isBlankIdent(e) {
        -			return blank{}
        -		}
        -		obj := fn.Pkg.objectOf(e)
        -		v := fn.Prog.packageLevelValue(obj) // var (address)
        -		if v == nil {
        -			v = fn.lookup(obj, escaping)
        -		}
        -		return &address{addr: v, pos: e.Pos(), expr: e}
        -
        -	case *ast.CompositeLit:
        -		t := deref(fn.Pkg.typeOf(e))
        -		var v *Alloc
        -		if escaping {
        -			v = emitNew(fn, t, e.Lbrace)
        -		} else {
        -			v = fn.addLocal(t, e.Lbrace)
        -		}
        -		v.Comment = "complit"
        -		var sb storebuf
        -		b.compLit(fn, v, e, true, &sb)
        -		sb.emit(fn)
        -		return &address{addr: v, pos: e.Lbrace, expr: e}
        -
        -	case *ast.ParenExpr:
        -		return b.addr(fn, e.X, escaping)
        -
        -	case *ast.SelectorExpr:
        -		sel, ok := fn.Pkg.info.Selections[e]
        -		if !ok {
        -			// qualified identifier
        -			return b.addr(fn, e.Sel, escaping)
        -		}
        -		if sel.Kind() != types.FieldVal {
        -			panic(sel)
        -		}
        -		wantAddr := true
        -		v := b.receiver(fn, e.X, wantAddr, escaping, sel)
        -		last := len(sel.Index()) - 1
        -		return &address{
        -			addr: emitFieldSelection(fn, v, sel.Index()[last], true, e.Sel),
        -			pos:  e.Sel.Pos(),
        -			expr: e.Sel,
        -		}
        -
        -	case *ast.IndexExpr:
        -		var x Value
        -		var et types.Type
        -		switch t := fn.Pkg.typeOf(e.X).Underlying().(type) {
        -		case *types.Array:
        -			x = b.addr(fn, e.X, escaping).address(fn)
        -			et = types.NewPointer(t.Elem())
        -		case *types.Pointer: // *array
        -			x = b.expr(fn, e.X)
        -			et = types.NewPointer(t.Elem().Underlying().(*types.Array).Elem())
        -		case *types.Slice:
        -			x = b.expr(fn, e.X)
        -			et = types.NewPointer(t.Elem())
        -		case *types.Map:
        -			return &element{
        -				m:   b.expr(fn, e.X),
        -				k:   emitConv(fn, b.expr(fn, e.Index), t.Key()),
        -				t:   t.Elem(),
        -				pos: e.Lbrack,
        -			}
        -		default:
        -			panic("unexpected container type in IndexExpr: " + t.String())
        -		}
        -		v := &IndexAddr{
        -			X:     x,
        -			Index: emitConv(fn, b.expr(fn, e.Index), tInt),
        -		}
        -		v.setPos(e.Lbrack)
        -		v.setType(et)
        -		return &address{addr: fn.emit(v), pos: e.Lbrack, expr: e}
        -
        -	case *ast.StarExpr:
        -		return &address{addr: b.expr(fn, e.X), pos: e.Star, expr: e}
        -	}
        -
        -	panic(fmt.Sprintf("unexpected address expression: %T", e))
        -}
        -
        -type store struct {
        -	lhs lvalue
        -	rhs Value
        -}
        -
        -type storebuf struct{ stores []store }
        -
        -func (sb *storebuf) store(lhs lvalue, rhs Value) {
        -	sb.stores = append(sb.stores, store{lhs, rhs})
        -}
        -
        -func (sb *storebuf) emit(fn *Function) {
        -	for _, s := range sb.stores {
        -		s.lhs.store(fn, s.rhs)
        -	}
        -}
        -
        -// assign emits to fn code to initialize the lvalue loc with the value
        -// of expression e.  If isZero is true, assign assumes that loc holds
        -// the zero value for its type.
        -//
        -// This is equivalent to loc.store(fn, b.expr(fn, e)), but may generate
        -// better code in some cases, e.g., for composite literals in an
        -// addressable location.
        -//
        -// If sb is not nil, assign generates code to evaluate expression e, but
        -// not to update loc.  Instead, the necessary stores are appended to the
        -// storebuf sb so that they can be executed later.  This allows correct
        -// in-place update of existing variables when the RHS is a composite
        -// literal that may reference parts of the LHS.
        -//
        -func (b *builder) assign(fn *Function, loc lvalue, e ast.Expr, isZero bool, sb *storebuf) {
        -	// Can we initialize it in place?
        -	if e, ok := unparen(e).(*ast.CompositeLit); ok {
        -		// A CompositeLit never evaluates to a pointer,
        -		// so if the type of the location is a pointer,
        -		// an &-operation is implied.
        -		if _, ok := loc.(blank); !ok { // avoid calling blank.typ()
        -			if isPointer(loc.typ()) {
        -				ptr := b.addr(fn, e, true).address(fn)
        -				// copy address
        -				if sb != nil {
        -					sb.store(loc, ptr)
        -				} else {
        -					loc.store(fn, ptr)
        -				}
        -				return
        -			}
        -		}
        -
        -		if _, ok := loc.(*address); ok {
        -			if isInterface(loc.typ()) {
        -				// e.g. var x interface{} = T{...}
        -				// Can't in-place initialize an interface value.
        -				// Fall back to copying.
        -			} else {
        -				// x = T{...} or x := T{...}
        -				addr := loc.address(fn)
        -				if sb != nil {
        -					b.compLit(fn, addr, e, isZero, sb)
        -				} else {
        -					var sb storebuf
        -					b.compLit(fn, addr, e, isZero, &sb)
        -					sb.emit(fn)
        -				}
        -
        -				// Subtle: emit debug ref for aggregate types only;
        -				// slice and map are handled by store ops in compLit.
        -				switch loc.typ().Underlying().(type) {
        -				case *types.Struct, *types.Array:
        -					emitDebugRef(fn, e, addr, true)
        -				}
        -
        -				return
        -			}
        -		}
        -	}
        -
        -	// simple case: just copy
        -	rhs := b.expr(fn, e)
        -	if sb != nil {
        -		sb.store(loc, rhs)
        -	} else {
        -		loc.store(fn, rhs)
        -	}
        -}
        -
        -// expr lowers a single-result expression e to SSA form, emitting code
        -// to fn and returning the Value defined by the expression.
        -//
        -func (b *builder) expr(fn *Function, e ast.Expr) Value {
        -	e = unparen(e)
        -
        -	tv := fn.Pkg.info.Types[e]
        -
        -	// Is expression a constant?
        -	if tv.Value != nil {
        -		return NewConst(tv.Value, tv.Type)
        -	}
        -
        -	var v Value
        -	if tv.Addressable() {
        -		// Prefer pointer arithmetic ({Index,Field}Addr) followed
        -		// by Load over subelement extraction (e.g. Index, Field),
        -		// to avoid large copies.
        -		v = b.addr(fn, e, false).load(fn)
        -	} else {
        -		v = b.expr0(fn, e, tv)
        -	}
        -	if fn.debugInfo() {
        -		emitDebugRef(fn, e, v, false)
        -	}
        -	return v
        -}
        -
        -func (b *builder) expr0(fn *Function, e ast.Expr, tv types.TypeAndValue) Value {
        -	switch e := e.(type) {
        -	case *ast.BasicLit:
        -		panic("non-constant BasicLit") // unreachable
        -
        -	case *ast.FuncLit:
        -		fn2 := &Function{
        -			name:      fmt.Sprintf("%s$%d", fn.Name(), 1+len(fn.AnonFuncs)),
        -			Signature: fn.Pkg.typeOf(e.Type).Underlying().(*types.Signature),
        -			pos:       e.Type.Func,
        -			parent:    fn,
        -			Pkg:       fn.Pkg,
        -			Prog:      fn.Prog,
        -			syntax:    e,
        -		}
        -		fn.AnonFuncs = append(fn.AnonFuncs, fn2)
        -		b.buildFunction(fn2)
        -		if fn2.FreeVars == nil {
        -			return fn2
        -		}
        -		v := &MakeClosure{Fn: fn2}
        -		v.setType(tv.Type)
        -		for _, fv := range fn2.FreeVars {
        -			v.Bindings = append(v.Bindings, fv.outer)
        -			fv.outer = nil
        -		}
        -		return fn.emit(v)
        -
        -	case *ast.TypeAssertExpr: // single-result form only
        -		return emitTypeAssert(fn, b.expr(fn, e.X), tv.Type, e.Lparen)
        -
        -	case *ast.CallExpr:
        -		if fn.Pkg.info.Types[e.Fun].IsType() {
        -			// Explicit type conversion, e.g. string(x) or big.Int(x)
        -			x := b.expr(fn, e.Args[0])
        -			y := emitConv(fn, x, tv.Type)
        -			if y != x {
        -				switch y := y.(type) {
        -				case *Convert:
        -					y.pos = e.Lparen
        -				case *ChangeType:
        -					y.pos = e.Lparen
        -				case *MakeInterface:
        -					y.pos = e.Lparen
        -				}
        -			}
        -			return y
        -		}
        -		// Call to "intrinsic" built-ins, e.g. new, make, panic.
        -		if id, ok := unparen(e.Fun).(*ast.Ident); ok {
        -			if obj, ok := fn.Pkg.info.Uses[id].(*types.Builtin); ok {
        -				if v := b.builtin(fn, obj, e.Args, tv.Type, e.Lparen); v != nil {
        -					return v
        -				}
        -			}
        -		}
        -		// Regular function call.
        -		var v Call
        -		b.setCall(fn, e, &v.Call)
        -		v.setType(tv.Type)
        -		return fn.emit(&v)
        -
        -	case *ast.UnaryExpr:
        -		switch e.Op {
        -		case token.AND: // &X --- potentially escaping.
        -			addr := b.addr(fn, e.X, true)
        -			if _, ok := unparen(e.X).(*ast.StarExpr); ok {
        -				// &*p must panic if p is nil (http://golang.org/s/go12nil).
        -				// For simplicity, we'll just (suboptimally) rely
        -				// on the side effects of a load.
        -				// TODO(adonovan): emit dedicated nilcheck.
        -				addr.load(fn)
        -			}
        -			return addr.address(fn)
        -		case token.ADD:
        -			return b.expr(fn, e.X)
        -		case token.NOT, token.ARROW, token.SUB, token.XOR: // ! <- - ^
        -			v := &UnOp{
        -				Op: e.Op,
        -				X:  b.expr(fn, e.X),
        -			}
        -			v.setPos(e.OpPos)
        -			v.setType(tv.Type)
        -			return fn.emit(v)
        -		default:
        -			panic(e.Op)
        -		}
        -
        -	case *ast.BinaryExpr:
        -		switch e.Op {
        -		case token.LAND, token.LOR:
        -			return b.logicalBinop(fn, e)
        -		case token.SHL, token.SHR:
        -			fallthrough
        -		case token.ADD, token.SUB, token.MUL, token.QUO, token.REM, token.AND, token.OR, token.XOR, token.AND_NOT:
        -			return emitArith(fn, e.Op, b.expr(fn, e.X), b.expr(fn, e.Y), tv.Type, e.OpPos)
        -
        -		case token.EQL, token.NEQ, token.GTR, token.LSS, token.LEQ, token.GEQ:
        -			cmp := emitCompare(fn, e.Op, b.expr(fn, e.X), b.expr(fn, e.Y), e.OpPos)
        -			// The type of x==y may be UntypedBool.
        -			return emitConv(fn, cmp, DefaultType(tv.Type))
        -		default:
        -			panic("illegal op in BinaryExpr: " + e.Op.String())
        -		}
        -
        -	case *ast.SliceExpr:
        -		var low, high, max Value
        -		var x Value
        -		switch fn.Pkg.typeOf(e.X).Underlying().(type) {
        -		case *types.Array:
        -			// Potentially escaping.
        -			x = b.addr(fn, e.X, true).address(fn)
        -		case *types.Basic, *types.Slice, *types.Pointer: // *array
        -			x = b.expr(fn, e.X)
        -		default:
        -			panic("unreachable")
        -		}
        -		if e.High != nil {
        -			high = b.expr(fn, e.High)
        -		}
        -		if e.Low != nil {
        -			low = b.expr(fn, e.Low)
        -		}
        -		if e.Slice3 {
        -			max = b.expr(fn, e.Max)
        -		}
        -		v := &Slice{
        -			X:    x,
        -			Low:  low,
        -			High: high,
        -			Max:  max,
        -		}
        -		v.setPos(e.Lbrack)
        -		v.setType(tv.Type)
        -		return fn.emit(v)
        -
        -	case *ast.Ident:
        -		obj := fn.Pkg.info.Uses[e]
        -		// Universal built-in or nil?
        -		switch obj := obj.(type) {
        -		case *types.Builtin:
        -			return &Builtin{name: obj.Name(), sig: tv.Type.(*types.Signature)}
        -		case *types.Nil:
        -			return nilConst(tv.Type)
        -		}
        -		// Package-level func or var?
        -		if v := fn.Prog.packageLevelValue(obj); v != nil {
        -			if _, ok := obj.(*types.Var); ok {
        -				return emitLoad(fn, v) // var (address)
        -			}
        -			return v // (func)
        -		}
        -		// Local var.
        -		return emitLoad(fn, fn.lookup(obj, false)) // var (address)
        -
        -	case *ast.SelectorExpr:
        -		sel, ok := fn.Pkg.info.Selections[e]
        -		if !ok {
        -			// qualified identifier
        -			return b.expr(fn, e.Sel)
        -		}
        -		switch sel.Kind() {
        -		case types.MethodExpr:
        -			// (*T).f or T.f, the method f from the method-set of type T.
        -			// The result is a "thunk".
        -			return emitConv(fn, makeThunk(fn.Prog, sel), tv.Type)
        -
        -		case types.MethodVal:
        -			// e.f where e is an expression and f is a method.
        -			// The result is a "bound".
        -			obj := sel.Obj().(*types.Func)
        -			rt := recvType(obj)
        -			wantAddr := isPointer(rt)
        -			escaping := true
        -			v := b.receiver(fn, e.X, wantAddr, escaping, sel)
        -			if isInterface(rt) {
        -				// If v has interface type I,
        -				// we must emit a check that v is non-nil.
        -				// We use: typeassert v.(I).
        -				emitTypeAssert(fn, v, rt, token.NoPos)
        -			}
        -			c := &MakeClosure{
        -				Fn:       makeBound(fn.Prog, obj),
        -				Bindings: []Value{v},
        -			}
        -			c.setPos(e.Sel.Pos())
        -			c.setType(tv.Type)
        -			return fn.emit(c)
        -
        -		case types.FieldVal:
        -			indices := sel.Index()
        -			last := len(indices) - 1
        -			v := b.expr(fn, e.X)
        -			v = emitImplicitSelections(fn, v, indices[:last])
        -			v = emitFieldSelection(fn, v, indices[last], false, e.Sel)
        -			return v
        -		}
        -
        -		panic("unexpected expression-relative selector")
        -
        -	case *ast.IndexExpr:
        -		switch t := fn.Pkg.typeOf(e.X).Underlying().(type) {
        -		case *types.Array:
        -			// Non-addressable array (in a register).
        -			v := &Index{
        -				X:     b.expr(fn, e.X),
        -				Index: emitConv(fn, b.expr(fn, e.Index), tInt),
        -			}
        -			v.setPos(e.Lbrack)
        -			v.setType(t.Elem())
        -			return fn.emit(v)
        -
        -		case *types.Map:
        -			// Maps are not addressable.
        -			mapt := fn.Pkg.typeOf(e.X).Underlying().(*types.Map)
        -			v := &Lookup{
        -				X:     b.expr(fn, e.X),
        -				Index: emitConv(fn, b.expr(fn, e.Index), mapt.Key()),
        -			}
        -			v.setPos(e.Lbrack)
        -			v.setType(mapt.Elem())
        -			return fn.emit(v)
        -
        -		case *types.Basic: // => string
        -			// Strings are not addressable.
        -			v := &Lookup{
        -				X:     b.expr(fn, e.X),
        -				Index: b.expr(fn, e.Index),
        -			}
        -			v.setPos(e.Lbrack)
        -			v.setType(tByte)
        -			return fn.emit(v)
        -
        -		case *types.Slice, *types.Pointer: // *array
        -			// Addressable slice/array; use IndexAddr and Load.
        -			return b.addr(fn, e, false).load(fn)
        -
        -		default:
        -			panic("unexpected container type in IndexExpr: " + t.String())
        -		}
        -
        -	case *ast.CompositeLit, *ast.StarExpr:
        -		// Addressable types (lvalues)
        -		return b.addr(fn, e, false).load(fn)
        -	}
        -
        -	panic(fmt.Sprintf("unexpected expr: %T", e))
        -}
        -
        -// stmtList emits to fn code for all statements in list.
        -func (b *builder) stmtList(fn *Function, list []ast.Stmt) {
        -	for _, s := range list {
        -		b.stmt(fn, s)
        -	}
        -}
        -
        -// receiver emits to fn code for expression e in the "receiver"
        -// position of selection e.f (where f may be a field or a method) and
        -// returns the effective receiver after applying the implicit field
        -// selections of sel.
        -//
        -// wantAddr requests that the result is an an address.  If
        -// !sel.Indirect(), this may require that e be built in addr() mode; it
        -// must thus be addressable.
        -//
        -// escaping is defined as per builder.addr().
        -//
        -func (b *builder) receiver(fn *Function, e ast.Expr, wantAddr, escaping bool, sel *types.Selection) Value {
        -	var v Value
        -	if wantAddr && !sel.Indirect() && !isPointer(fn.Pkg.typeOf(e)) {
        -		v = b.addr(fn, e, escaping).address(fn)
        -	} else {
        -		v = b.expr(fn, e)
        -	}
        -
        -	last := len(sel.Index()) - 1
        -	v = emitImplicitSelections(fn, v, sel.Index()[:last])
        -	if !wantAddr && isPointer(v.Type()) {
        -		v = emitLoad(fn, v)
        -	}
        -	return v
        -}
        -
        -// setCallFunc populates the function parts of a CallCommon structure
        -// (Func, Method, Recv, Args[0]) based on the kind of invocation
        -// occurring in e.
        -//
        -func (b *builder) setCallFunc(fn *Function, e *ast.CallExpr, c *CallCommon) {
        -	c.pos = e.Lparen
        -
        -	// Is this a method call?
        -	if selector, ok := unparen(e.Fun).(*ast.SelectorExpr); ok {
        -		sel, ok := fn.Pkg.info.Selections[selector]
        -		if ok && sel.Kind() == types.MethodVal {
        -			obj := sel.Obj().(*types.Func)
        -			recv := recvType(obj)
        -			wantAddr := isPointer(recv)
        -			escaping := true
        -			v := b.receiver(fn, selector.X, wantAddr, escaping, sel)
        -			if isInterface(recv) {
        -				// Invoke-mode call.
        -				c.Value = v
        -				c.Method = obj
        -			} else {
        -				// "Call"-mode call.
        -				c.Value = fn.Prog.declaredFunc(obj)
        -				c.Args = append(c.Args, v)
        -			}
        -			return
        -		}
        -
        -		// sel.Kind()==MethodExpr indicates T.f() or (*T).f():
        -		// a statically dispatched call to the method f in the
        -		// method-set of T or *T.  T may be an interface.
        -		//
        -		// e.Fun would evaluate to a concrete method, interface
        -		// wrapper function, or promotion wrapper.
        -		//
        -		// For now, we evaluate it in the usual way.
        -		//
        -		// TODO(adonovan): opt: inline expr() here, to make the
        -		// call static and to avoid generation of wrappers.
        -		// It's somewhat tricky as it may consume the first
        -		// actual parameter if the call is "invoke" mode.
        -		//
        -		// Examples:
        -		//  type T struct{}; func (T) f() {}   // "call" mode
        -		//  type T interface { f() }           // "invoke" mode
        -		//
        -		//  type S struct{ T }
        -		//
        -		//  var s S
        -		//  S.f(s)
        -		//  (*S).f(&s)
        -		//
        -		// Suggested approach:
        -		// - consume the first actual parameter expression
        -		//   and build it with b.expr().
        -		// - apply implicit field selections.
        -		// - use MethodVal logic to populate fields of c.
        -	}
        -
        -	// Evaluate the function operand in the usual way.
        -	c.Value = b.expr(fn, e.Fun)
        -}
        -
        -// emitCallArgs emits to f code for the actual parameters of call e to
        -// a (possibly built-in) function of effective type sig.
        -// The argument values are appended to args, which is then returned.
        -//
        -func (b *builder) emitCallArgs(fn *Function, sig *types.Signature, e *ast.CallExpr, args []Value) []Value {
        -	// f(x, y, z...): pass slice z straight through.
        -	if e.Ellipsis != 0 {
        -		for i, arg := range e.Args {
        -			v := emitConv(fn, b.expr(fn, arg), sig.Params().At(i).Type())
        -			args = append(args, v)
        -		}
        -		return args
        -	}
        -
        -	offset := len(args) // 1 if call has receiver, 0 otherwise
        -
        -	// Evaluate actual parameter expressions.
        -	//
        -	// If this is a chained call of the form f(g()) where g has
        -	// multiple return values (MRV), they are flattened out into
        -	// args; a suffix of them may end up in a varargs slice.
        -	for _, arg := range e.Args {
        -		v := b.expr(fn, arg)
        -		if ttuple, ok := v.Type().(*types.Tuple); ok { // MRV chain
        -			for i, n := 0, ttuple.Len(); i < n; i++ {
        -				args = append(args, emitExtract(fn, v, i))
        -			}
        -		} else {
        -			args = append(args, v)
        -		}
        -	}
        -
        -	// Actual->formal assignability conversions for normal parameters.
        -	np := sig.Params().Len() // number of normal parameters
        -	if sig.Variadic() {
        -		np--
        -	}
        -	for i := 0; i < np; i++ {
        -		args[offset+i] = emitConv(fn, args[offset+i], sig.Params().At(i).Type())
        -	}
        -
        -	// Actual->formal assignability conversions for variadic parameter,
        -	// and construction of slice.
        -	if sig.Variadic() {
        -		varargs := args[offset+np:]
        -		st := sig.Params().At(np).Type().(*types.Slice)
        -		vt := st.Elem()
        -		if len(varargs) == 0 {
        -			args = append(args, nilConst(st))
        -		} else {
        -			// Replace a suffix of args with a slice containing it.
        -			at := types.NewArray(vt, int64(len(varargs)))
        -			a := emitNew(fn, at, token.NoPos)
        -			a.setPos(e.Rparen)
        -			a.Comment = "varargs"
        -			for i, arg := range varargs {
        -				iaddr := &IndexAddr{
        -					X:     a,
        -					Index: intConst(int64(i)),
        -				}
        -				iaddr.setType(types.NewPointer(vt))
        -				fn.emit(iaddr)
        -				emitStore(fn, iaddr, arg, arg.Pos())
        -			}
        -			s := &Slice{X: a}
        -			s.setType(st)
        -			args[offset+np] = fn.emit(s)
        -			args = args[:offset+np+1]
        -		}
        -	}
        -	return args
        -}
        -
        -// setCall emits to fn code to evaluate all the parameters of a function
        -// call e, and populates *c with those values.
        -//
        -func (b *builder) setCall(fn *Function, e *ast.CallExpr, c *CallCommon) {
        -	// First deal with the f(...) part and optional receiver.
        -	b.setCallFunc(fn, e, c)
        -
        -	// Then append the other actual parameters.
        -	sig, _ := fn.Pkg.typeOf(e.Fun).Underlying().(*types.Signature)
        -	if sig == nil {
        -		panic(fmt.Sprintf("no signature for call of %s", e.Fun))
        -	}
        -	c.Args = b.emitCallArgs(fn, sig, e, c.Args)
        -}
        -
        -// assignOp emits to fn code to perform loc = val.
        -func (b *builder) assignOp(fn *Function, loc lvalue, val Value, op token.Token, pos token.Pos) {
        -	oldv := loc.load(fn)
        -	loc.store(fn, emitArith(fn, op, oldv, emitConv(fn, val, oldv.Type()), loc.typ(), pos))
        -}
        -
        -// localValueSpec emits to fn code to define all of the vars in the
        -// function-local ValueSpec, spec.
        -//
        -func (b *builder) localValueSpec(fn *Function, spec *ast.ValueSpec) {
        -	switch {
        -	case len(spec.Values) == len(spec.Names):
        -		// e.g. var x, y = 0, 1
        -		// 1:1 assignment
        -		for i, id := range spec.Names {
        -			if !isBlankIdent(id) {
        -				fn.addLocalForIdent(id)
        -			}
        -			lval := b.addr(fn, id, false) // non-escaping
        -			b.assign(fn, lval, spec.Values[i], true, nil)
        -		}
        -
        -	case len(spec.Values) == 0:
        -		// e.g. var x, y int
        -		// Locals are implicitly zero-initialized.
        -		for _, id := range spec.Names {
        -			if !isBlankIdent(id) {
        -				lhs := fn.addLocalForIdent(id)
        -				if fn.debugInfo() {
        -					emitDebugRef(fn, id, lhs, true)
        -				}
        -			}
        -		}
        -
        -	default:
        -		// e.g. var x, y = pos()
        -		tuple := b.exprN(fn, spec.Values[0])
        -		for i, id := range spec.Names {
        -			if !isBlankIdent(id) {
        -				fn.addLocalForIdent(id)
        -				lhs := b.addr(fn, id, false) // non-escaping
        -				lhs.store(fn, emitExtract(fn, tuple, i))
        -			}
        -		}
        -	}
        -}
        -
        -// assignStmt emits code to fn for a parallel assignment of rhss to lhss.
        -// isDef is true if this is a short variable declaration (:=).
        -//
        -// Note the similarity with localValueSpec.
        -//
        -func (b *builder) assignStmt(fn *Function, lhss, rhss []ast.Expr, isDef bool) {
        -	// Side effects of all LHSs and RHSs must occur in left-to-right order.
        -	lvals := make([]lvalue, len(lhss))
        -	isZero := make([]bool, len(lhss))
        -	for i, lhs := range lhss {
        -		var lval lvalue = blank{}
        -		if !isBlankIdent(lhs) {
        -			if isDef {
        -				if obj := fn.Pkg.info.Defs[lhs.(*ast.Ident)]; obj != nil {
        -					fn.addNamedLocal(obj)
        -					isZero[i] = true
        -				}
        -			}
        -			lval = b.addr(fn, lhs, false) // non-escaping
        -		}
        -		lvals[i] = lval
        -	}
        -	if len(lhss) == len(rhss) {
        -		// Simple assignment:   x     = f()        (!isDef)
        -		// Parallel assignment: x, y  = f(), g()   (!isDef)
        -		// or short var decl:   x, y := f(), g()   (isDef)
        -		//
        -		// In all cases, the RHSs may refer to the LHSs,
        -		// so we need a storebuf.
        -		var sb storebuf
        -		for i := range rhss {
        -			b.assign(fn, lvals[i], rhss[i], isZero[i], &sb)
        -		}
        -		sb.emit(fn)
        -	} else {
        -		// e.g. x, y = pos()
        -		tuple := b.exprN(fn, rhss[0])
        -		emitDebugRef(fn, rhss[0], tuple, false)
        -		for i, lval := range lvals {
        -			lval.store(fn, emitExtract(fn, tuple, i))
        -		}
        -	}
        -}
        -
        -// arrayLen returns the length of the array whose composite literal elements are elts.
        -func (b *builder) arrayLen(fn *Function, elts []ast.Expr) int64 {
        -	var max int64 = -1
        -	var i int64 = -1
        -	for _, e := range elts {
        -		if kv, ok := e.(*ast.KeyValueExpr); ok {
        -			i = b.expr(fn, kv.Key).(*Const).Int64()
        -		} else {
        -			i++
        -		}
        -		if i > max {
        -			max = i
        -		}
        -	}
        -	return max + 1
        -}
        -
        -// compLit emits to fn code to initialize a composite literal e at
        -// address addr with type typ.
        -//
        -// Nested composite literals are recursively initialized in place
        -// where possible. If isZero is true, compLit assumes that addr
        -// holds the zero value for typ.
        -//
        -// Because the elements of a composite literal may refer to the
        -// variables being updated, as in the second line below,
        -//	x := T{a: 1}
        -//	x = T{a: x.a}
        -// all the reads must occur before all the writes.  Thus all stores to
        -// loc are emitted to the storebuf sb for later execution.
        -//
        -// A CompositeLit may have pointer type only in the recursive (nested)
        -// case when the type name is implicit.  e.g. in []*T{{}}, the inner
        -// literal has type *T behaves like &T{}.
        -// In that case, addr must hold a T, not a *T.
        -//
        -func (b *builder) compLit(fn *Function, addr Value, e *ast.CompositeLit, isZero bool, sb *storebuf) {
        -	typ := deref(fn.Pkg.typeOf(e))
        -	switch t := typ.Underlying().(type) {
        -	case *types.Struct:
        -		if !isZero && len(e.Elts) != t.NumFields() {
        -			// memclear
        -			sb.store(&address{addr, e.Lbrace, nil},
        -				zeroValue(fn, deref(addr.Type())))
        -			isZero = true
        -		}
        -		for i, e := range e.Elts {
        -			fieldIndex := i
        -			pos := e.Pos()
        -			if kv, ok := e.(*ast.KeyValueExpr); ok {
        -				fname := kv.Key.(*ast.Ident).Name
        -				for i, n := 0, t.NumFields(); i < n; i++ {
        -					sf := t.Field(i)
        -					if sf.Name() == fname {
        -						fieldIndex = i
        -						pos = kv.Colon
        -						e = kv.Value
        -						break
        -					}
        -				}
        -			}
        -			sf := t.Field(fieldIndex)
        -			faddr := &FieldAddr{
        -				X:     addr,
        -				Field: fieldIndex,
        -			}
        -			faddr.setType(types.NewPointer(sf.Type()))
        -			fn.emit(faddr)
        -			b.assign(fn, &address{addr: faddr, pos: pos, expr: e}, e, isZero, sb)
        -		}
        -
        -	case *types.Array, *types.Slice:
        -		var at *types.Array
        -		var array Value
        -		switch t := t.(type) {
        -		case *types.Slice:
        -			at = types.NewArray(t.Elem(), b.arrayLen(fn, e.Elts))
        -			alloc := emitNew(fn, at, e.Lbrace)
        -			alloc.Comment = "slicelit"
        -			array = alloc
        -		case *types.Array:
        -			at = t
        -			array = addr
        -
        -			if !isZero && int64(len(e.Elts)) != at.Len() {
        -				// memclear
        -				sb.store(&address{array, e.Lbrace, nil},
        -					zeroValue(fn, deref(array.Type())))
        -			}
        -		}
        -
        -		var idx *Const
        -		for _, e := range e.Elts {
        -			pos := e.Pos()
        -			if kv, ok := e.(*ast.KeyValueExpr); ok {
        -				idx = b.expr(fn, kv.Key).(*Const)
        -				pos = kv.Colon
        -				e = kv.Value
        -			} else {
        -				var idxval int64
        -				if idx != nil {
        -					idxval = idx.Int64() + 1
        -				}
        -				idx = intConst(idxval)
        -			}
        -			iaddr := &IndexAddr{
        -				X:     array,
        -				Index: idx,
        -			}
        -			iaddr.setType(types.NewPointer(at.Elem()))
        -			fn.emit(iaddr)
        -			if t != at { // slice
        -				// backing array is unaliased => storebuf not needed.
        -				b.assign(fn, &address{addr: iaddr, pos: pos, expr: e}, e, true, nil)
        -			} else {
        -				b.assign(fn, &address{addr: iaddr, pos: pos, expr: e}, e, true, sb)
        -			}
        -		}
        -
        -		if t != at { // slice
        -			s := &Slice{X: array}
        -			s.setPos(e.Lbrace)
        -			s.setType(typ)
        -			sb.store(&address{addr: addr, pos: e.Lbrace, expr: e}, fn.emit(s))
        -		}
        -
        -	case *types.Map:
        -		m := &MakeMap{Reserve: intConst(int64(len(e.Elts)))}
        -		m.setPos(e.Lbrace)
        -		m.setType(typ)
        -		fn.emit(m)
        -		for _, e := range e.Elts {
        -			e := e.(*ast.KeyValueExpr)
        -
        -			// If a key expression in a map literal is  itself a
        -			// composite literal, the type may be omitted.
        -			// For example:
        -			//	map[*struct{}]bool{{}: true}
        -			// An &-operation may be implied:
        -			//	map[*struct{}]bool{&struct{}{}: true}
        -			var key Value
        -			if _, ok := unparen(e.Key).(*ast.CompositeLit); ok && isPointer(t.Key()) {
        -				// A CompositeLit never evaluates to a pointer,
        -				// so if the type of the location is a pointer,
        -				// an &-operation is implied.
        -				key = b.addr(fn, e.Key, true).address(fn)
        -			} else {
        -				key = b.expr(fn, e.Key)
        -			}
        -
        -			loc := element{
        -				m:   m,
        -				k:   emitConv(fn, key, t.Key()),
        -				t:   t.Elem(),
        -				pos: e.Colon,
        -			}
        -
        -			// We call assign() only because it takes care
        -			// of any &-operation required in the recursive
        -			// case, e.g.,
        -			// map[int]*struct{}{0: {}} implies &struct{}{}.
        -			// In-place update is of course impossible,
        -			// and no storebuf is needed.
        -			b.assign(fn, &loc, e.Value, true, nil)
        -		}
        -		sb.store(&address{addr: addr, pos: e.Lbrace, expr: e}, m)
        -
        -	default:
        -		panic("unexpected CompositeLit type: " + t.String())
        -	}
        -}
        -
        -// switchStmt emits to fn code for the switch statement s, optionally
        -// labelled by label.
        -//
        -func (b *builder) switchStmt(fn *Function, s *ast.SwitchStmt, label *lblock) {
        -	// We treat SwitchStmt like a sequential if-else chain.
        -	// Multiway dispatch can be recovered later by ssautil.Switches()
        -	// to those cases that are free of side effects.
        -	if s.Init != nil {
        -		b.stmt(fn, s.Init)
        -	}
        -	var tag Value = vTrue
        -	if s.Tag != nil {
        -		tag = b.expr(fn, s.Tag)
        -	}
        -	done := fn.newBasicBlock("switch.done")
        -	if label != nil {
        -		label._break = done
        -	}
        -	// We pull the default case (if present) down to the end.
        -	// But each fallthrough label must point to the next
        -	// body block in source order, so we preallocate a
        -	// body block (fallthru) for the next case.
        -	// Unfortunately this makes for a confusing block order.
        -	var dfltBody *[]ast.Stmt
        -	var dfltFallthrough *BasicBlock
        -	var fallthru, dfltBlock *BasicBlock
        -	ncases := len(s.Body.List)
        -	for i, clause := range s.Body.List {
        -		body := fallthru
        -		if body == nil {
        -			body = fn.newBasicBlock("switch.body") // first case only
        -		}
        -
        -		// Preallocate body block for the next case.
        -		fallthru = done
        -		if i+1 < ncases {
        -			fallthru = fn.newBasicBlock("switch.body")
        -		}
        -
        -		cc := clause.(*ast.CaseClause)
        -		if cc.List == nil {
        -			// Default case.
        -			dfltBody = &cc.Body
        -			dfltFallthrough = fallthru
        -			dfltBlock = body
        -			continue
        -		}
        -
        -		var nextCond *BasicBlock
        -		for _, cond := range cc.List {
        -			nextCond = fn.newBasicBlock("switch.next")
        -			// TODO(adonovan): opt: when tag==vTrue, we'd
        -			// get better code if we use b.cond(cond)
        -			// instead of BinOp(EQL, tag, b.expr(cond))
        -			// followed by If.  Don't forget conversions
        -			// though.
        -			cond := emitCompare(fn, token.EQL, tag, b.expr(fn, cond), cond.Pos())
        -			emitIf(fn, cond, body, nextCond)
        -			fn.currentBlock = nextCond
        -		}
        -		fn.currentBlock = body
        -		fn.targets = &targets{
        -			tail:         fn.targets,
        -			_break:       done,
        -			_fallthrough: fallthru,
        -		}
        -		b.stmtList(fn, cc.Body)
        -		fn.targets = fn.targets.tail
        -		emitJump(fn, done)
        -		fn.currentBlock = nextCond
        -	}
        -	if dfltBlock != nil {
        -		emitJump(fn, dfltBlock)
        -		fn.currentBlock = dfltBlock
        -		fn.targets = &targets{
        -			tail:         fn.targets,
        -			_break:       done,
        -			_fallthrough: dfltFallthrough,
        -		}
        -		b.stmtList(fn, *dfltBody)
        -		fn.targets = fn.targets.tail
        -	}
        -	emitJump(fn, done)
        -	fn.currentBlock = done
        -}
        -
        -// typeSwitchStmt emits to fn code for the type switch statement s, optionally
        -// labelled by label.
        -//
        -func (b *builder) typeSwitchStmt(fn *Function, s *ast.TypeSwitchStmt, label *lblock) {
        -	// We treat TypeSwitchStmt like a sequential if-else chain.
        -	// Multiway dispatch can be recovered later by ssautil.Switches().
        -
        -	// Typeswitch lowering:
        -	//
        -	// var x X
        -	// switch y := x.(type) {
        -	// case T1, T2: S1                  // >1 	(y := x)
        -	// case nil:    SN                  // nil 	(y := x)
        -	// default:     SD                  // 0 types 	(y := x)
        -	// case T3:     S3                  // 1 type 	(y := x.(T3))
        -	// }
        -	//
        -	//      ...s.Init...
        -	// 	x := eval x
        -	// .caseT1:
        -	// 	t1, ok1 := typeswitch,ok x 
        -	// 	if ok1 then goto S1 else goto .caseT2
        -	// .caseT2:
        -	// 	t2, ok2 := typeswitch,ok x 
        -	// 	if ok2 then goto S1 else goto .caseNil
        -	// .S1:
        -	//      y := x
        -	// 	...S1...
        -	// 	goto done
        -	// .caseNil:
        -	// 	if t2, ok2 := typeswitch,ok x 
        -	// 	if x == nil then goto SN else goto .caseT3
        -	// .SN:
        -	//      y := x
        -	// 	...SN...
        -	// 	goto done
        -	// .caseT3:
        -	// 	t3, ok3 := typeswitch,ok x 
        -	// 	if ok3 then goto S3 else goto default
        -	// .S3:
        -	//      y := t3
        -	// 	...S3...
        -	// 	goto done
        -	// .default:
        -	//      y := x
        -	// 	...SD...
        -	// 	goto done
        -	// .done:
        -
        -	if s.Init != nil {
        -		b.stmt(fn, s.Init)
        -	}
        -
        -	var x Value
        -	switch ass := s.Assign.(type) {
        -	case *ast.ExprStmt: // x.(type)
        -		x = b.expr(fn, unparen(ass.X).(*ast.TypeAssertExpr).X)
        -	case *ast.AssignStmt: // y := x.(type)
        -		x = b.expr(fn, unparen(ass.Rhs[0]).(*ast.TypeAssertExpr).X)
        -	}
        -
        -	done := fn.newBasicBlock("typeswitch.done")
        -	if label != nil {
        -		label._break = done
        -	}
        -	var default_ *ast.CaseClause
        -	for _, clause := range s.Body.List {
        -		cc := clause.(*ast.CaseClause)
        -		if cc.List == nil {
        -			default_ = cc
        -			continue
        -		}
        -		body := fn.newBasicBlock("typeswitch.body")
        -		var next *BasicBlock
        -		var casetype types.Type
        -		var ti Value // ti, ok := typeassert,ok x 
        -		for _, cond := range cc.List {
        -			next = fn.newBasicBlock("typeswitch.next")
        -			casetype = fn.Pkg.typeOf(cond)
        -			var condv Value
        -			if casetype == tUntypedNil {
        -				condv = emitCompare(fn, token.EQL, x, nilConst(x.Type()), token.NoPos)
        -				ti = x
        -			} else {
        -				yok := emitTypeTest(fn, x, casetype, cc.Case)
        -				ti = emitExtract(fn, yok, 0)
        -				condv = emitExtract(fn, yok, 1)
        -			}
        -			emitIf(fn, condv, body, next)
        -			fn.currentBlock = next
        -		}
        -		if len(cc.List) != 1 {
        -			ti = x
        -		}
        -		fn.currentBlock = body
        -		b.typeCaseBody(fn, cc, ti, done)
        -		fn.currentBlock = next
        -	}
        -	if default_ != nil {
        -		b.typeCaseBody(fn, default_, x, done)
        -	} else {
        -		emitJump(fn, done)
        -	}
        -	fn.currentBlock = done
        -}
        -
        -func (b *builder) typeCaseBody(fn *Function, cc *ast.CaseClause, x Value, done *BasicBlock) {
        -	if obj := fn.Pkg.info.Implicits[cc]; obj != nil {
        -		// In a switch y := x.(type), each case clause
        -		// implicitly declares a distinct object y.
        -		// In a single-type case, y has that type.
        -		// In multi-type cases, 'case nil' and default,
        -		// y has the same type as the interface operand.
        -		emitStore(fn, fn.addNamedLocal(obj), x, obj.Pos())
        -	}
        -	fn.targets = &targets{
        -		tail:   fn.targets,
        -		_break: done,
        -	}
        -	b.stmtList(fn, cc.Body)
        -	fn.targets = fn.targets.tail
        -	emitJump(fn, done)
        -}
        -
        -// selectStmt emits to fn code for the select statement s, optionally
        -// labelled by label.
        -//
        -func (b *builder) selectStmt(fn *Function, s *ast.SelectStmt, label *lblock) {
        -	// A blocking select of a single case degenerates to a
        -	// simple send or receive.
        -	// TODO(adonovan): opt: is this optimization worth its weight?
        -	if len(s.Body.List) == 1 {
        -		clause := s.Body.List[0].(*ast.CommClause)
        -		if clause.Comm != nil {
        -			b.stmt(fn, clause.Comm)
        -			done := fn.newBasicBlock("select.done")
        -			if label != nil {
        -				label._break = done
        -			}
        -			fn.targets = &targets{
        -				tail:   fn.targets,
        -				_break: done,
        -			}
        -			b.stmtList(fn, clause.Body)
        -			fn.targets = fn.targets.tail
        -			emitJump(fn, done)
        -			fn.currentBlock = done
        -			return
        -		}
        -	}
        -
        -	// First evaluate all channels in all cases, and find
        -	// the directions of each state.
        -	var states []*SelectState
        -	blocking := true
        -	debugInfo := fn.debugInfo()
        -	for _, clause := range s.Body.List {
        -		var st *SelectState
        -		switch comm := clause.(*ast.CommClause).Comm.(type) {
        -		case nil: // default case
        -			blocking = false
        -			continue
        -
        -		case *ast.SendStmt: // ch<- i
        -			ch := b.expr(fn, comm.Chan)
        -			st = &SelectState{
        -				Dir:  types.SendOnly,
        -				Chan: ch,
        -				Send: emitConv(fn, b.expr(fn, comm.Value),
        -					ch.Type().Underlying().(*types.Chan).Elem()),
        -				Pos: comm.Arrow,
        -			}
        -			if debugInfo {
        -				st.DebugNode = comm
        -			}
        -
        -		case *ast.AssignStmt: // x := <-ch
        -			recv := unparen(comm.Rhs[0]).(*ast.UnaryExpr)
        -			st = &SelectState{
        -				Dir:  types.RecvOnly,
        -				Chan: b.expr(fn, recv.X),
        -				Pos:  recv.OpPos,
        -			}
        -			if debugInfo {
        -				st.DebugNode = recv
        -			}
        -
        -		case *ast.ExprStmt: // <-ch
        -			recv := unparen(comm.X).(*ast.UnaryExpr)
        -			st = &SelectState{
        -				Dir:  types.RecvOnly,
        -				Chan: b.expr(fn, recv.X),
        -				Pos:  recv.OpPos,
        -			}
        -			if debugInfo {
        -				st.DebugNode = recv
        -			}
        -		}
        -		states = append(states, st)
        -	}
        -
        -	// We dispatch on the (fair) result of Select using a
        -	// sequential if-else chain, in effect:
        -	//
        -	// idx, recvOk, r0...r_n-1 := select(...)
        -	// if idx == 0 {  // receive on channel 0  (first receive => r0)
        -	//     x, ok := r0, recvOk
        -	//     ...state0...
        -	// } else if v == 1 {   // send on channel 1
        -	//     ...state1...
        -	// } else {
        -	//     ...default...
        -	// }
        -	sel := &Select{
        -		States:   states,
        -		Blocking: blocking,
        -	}
        -	sel.setPos(s.Select)
        -	var vars []*types.Var
        -	vars = append(vars, varIndex, varOk)
        -	for _, st := range states {
        -		if st.Dir == types.RecvOnly {
        -			tElem := st.Chan.Type().Underlying().(*types.Chan).Elem()
        -			vars = append(vars, anonVar(tElem))
        -		}
        -	}
        -	sel.setType(types.NewTuple(vars...))
        -
        -	fn.emit(sel)
        -	idx := emitExtract(fn, sel, 0)
        -
        -	done := fn.newBasicBlock("select.done")
        -	if label != nil {
        -		label._break = done
        -	}
        -
        -	var defaultBody *[]ast.Stmt
        -	state := 0
        -	r := 2 // index in 'sel' tuple of value; increments if st.Dir==RECV
        -	for _, cc := range s.Body.List {
        -		clause := cc.(*ast.CommClause)
        -		if clause.Comm == nil {
        -			defaultBody = &clause.Body
        -			continue
        -		}
        -		body := fn.newBasicBlock("select.body")
        -		next := fn.newBasicBlock("select.next")
        -		emitIf(fn, emitCompare(fn, token.EQL, idx, intConst(int64(state)), token.NoPos), body, next)
        -		fn.currentBlock = body
        -		fn.targets = &targets{
        -			tail:   fn.targets,
        -			_break: done,
        -		}
        -		switch comm := clause.Comm.(type) {
        -		case *ast.ExprStmt: // <-ch
        -			if debugInfo {
        -				v := emitExtract(fn, sel, r)
        -				emitDebugRef(fn, states[state].DebugNode.(ast.Expr), v, false)
        -			}
        -			r++
        -
        -		case *ast.AssignStmt: // x := <-states[state].Chan
        -			if comm.Tok == token.DEFINE {
        -				fn.addLocalForIdent(comm.Lhs[0].(*ast.Ident))
        -			}
        -			x := b.addr(fn, comm.Lhs[0], false) // non-escaping
        -			v := emitExtract(fn, sel, r)
        -			if debugInfo {
        -				emitDebugRef(fn, states[state].DebugNode.(ast.Expr), v, false)
        -			}
        -			x.store(fn, v)
        -
        -			if len(comm.Lhs) == 2 { // x, ok := ...
        -				if comm.Tok == token.DEFINE {
        -					fn.addLocalForIdent(comm.Lhs[1].(*ast.Ident))
        -				}
        -				ok := b.addr(fn, comm.Lhs[1], false) // non-escaping
        -				ok.store(fn, emitExtract(fn, sel, 1))
        -			}
        -			r++
        -		}
        -		b.stmtList(fn, clause.Body)
        -		fn.targets = fn.targets.tail
        -		emitJump(fn, done)
        -		fn.currentBlock = next
        -		state++
        -	}
        -	if defaultBody != nil {
        -		fn.targets = &targets{
        -			tail:   fn.targets,
        -			_break: done,
        -		}
        -		b.stmtList(fn, *defaultBody)
        -		fn.targets = fn.targets.tail
        -	} else {
        -		// A blocking select must match some case.
        -		// (This should really be a runtime.errorString, not a string.)
        -		fn.emit(&Panic{
        -			X: emitConv(fn, stringConst("blocking select matched no case"), tEface),
        -		})
        -		fn.currentBlock = fn.newBasicBlock("unreachable")
        -	}
        -	emitJump(fn, done)
        -	fn.currentBlock = done
        -}
        -
        -// forStmt emits to fn code for the for statement s, optionally
        -// labelled by label.
        -//
        -func (b *builder) forStmt(fn *Function, s *ast.ForStmt, label *lblock) {
        -	//	...init...
        -	//      jump loop
        -	// loop:
        -	//      if cond goto body else done
        -	// body:
        -	//      ...body...
        -	//      jump post
        -	// post:				 (target of continue)
        -	//      ...post...
        -	//      jump loop
        -	// done:                                 (target of break)
        -	if s.Init != nil {
        -		b.stmt(fn, s.Init)
        -	}
        -	body := fn.newBasicBlock("for.body")
        -	done := fn.newBasicBlock("for.done") // target of 'break'
        -	loop := body                         // target of back-edge
        -	if s.Cond != nil {
        -		loop = fn.newBasicBlock("for.loop")
        -	}
        -	cont := loop // target of 'continue'
        -	if s.Post != nil {
        -		cont = fn.newBasicBlock("for.post")
        -	}
        -	if label != nil {
        -		label._break = done
        -		label._continue = cont
        -	}
        -	emitJump(fn, loop)
        -	fn.currentBlock = loop
        -	if loop != body {
        -		b.cond(fn, s.Cond, body, done)
        -		fn.currentBlock = body
        -	}
        -	fn.targets = &targets{
        -		tail:      fn.targets,
        -		_break:    done,
        -		_continue: cont,
        -	}
        -	b.stmt(fn, s.Body)
        -	fn.targets = fn.targets.tail
        -	emitJump(fn, cont)
        -
        -	if s.Post != nil {
        -		fn.currentBlock = cont
        -		b.stmt(fn, s.Post)
        -		emitJump(fn, loop) // back-edge
        -	}
        -	fn.currentBlock = done
        -}
        -
        -// rangeIndexed emits to fn the header for an integer-indexed loop
        -// over array, *array or slice value x.
        -// The v result is defined only if tv is non-nil.
        -// forPos is the position of the "for" token.
        -//
        -func (b *builder) rangeIndexed(fn *Function, x Value, tv types.Type, pos token.Pos) (k, v Value, loop, done *BasicBlock) {
        -	//
        -	//      length = len(x)
        -	//      index = -1
        -	// loop:                                   (target of continue)
        -	//      index++
        -	// 	if index < length goto body else done
        -	// body:
        -	//      k = index
        -	//      v = x[index]
        -	//      ...body...
        -	// 	jump loop
        -	// done:                                   (target of break)
        -
        -	// Determine number of iterations.
        -	var length Value
        -	if arr, ok := deref(x.Type()).Underlying().(*types.Array); ok {
        -		// For array or *array, the number of iterations is
        -		// known statically thanks to the type.  We avoid a
        -		// data dependence upon x, permitting later dead-code
        -		// elimination if x is pure, static unrolling, etc.
        -		// Ranging over a nil *array may have >0 iterations.
        -		// We still generate code for x, in case it has effects.
        -		length = intConst(arr.Len())
        -	} else {
        -		// length = len(x).
        -		var c Call
        -		c.Call.Value = makeLen(x.Type())
        -		c.Call.Args = []Value{x}
        -		c.setType(tInt)
        -		length = fn.emit(&c)
        -	}
        -
        -	index := fn.addLocal(tInt, token.NoPos)
        -	emitStore(fn, index, intConst(-1), pos)
        -
        -	loop = fn.newBasicBlock("rangeindex.loop")
        -	emitJump(fn, loop)
        -	fn.currentBlock = loop
        -
        -	incr := &BinOp{
        -		Op: token.ADD,
        -		X:  emitLoad(fn, index),
        -		Y:  vOne,
        -	}
        -	incr.setType(tInt)
        -	emitStore(fn, index, fn.emit(incr), pos)
        -
        -	body := fn.newBasicBlock("rangeindex.body")
        -	done = fn.newBasicBlock("rangeindex.done")
        -	emitIf(fn, emitCompare(fn, token.LSS, incr, length, token.NoPos), body, done)
        -	fn.currentBlock = body
        -
        -	k = emitLoad(fn, index)
        -	if tv != nil {
        -		switch t := x.Type().Underlying().(type) {
        -		case *types.Array:
        -			instr := &Index{
        -				X:     x,
        -				Index: k,
        -			}
        -			instr.setType(t.Elem())
        -			v = fn.emit(instr)
        -
        -		case *types.Pointer: // *array
        -			instr := &IndexAddr{
        -				X:     x,
        -				Index: k,
        -			}
        -			instr.setType(types.NewPointer(t.Elem().Underlying().(*types.Array).Elem()))
        -			v = emitLoad(fn, fn.emit(instr))
        -
        -		case *types.Slice:
        -			instr := &IndexAddr{
        -				X:     x,
        -				Index: k,
        -			}
        -			instr.setType(types.NewPointer(t.Elem()))
        -			v = emitLoad(fn, fn.emit(instr))
        -
        -		default:
        -			panic("rangeIndexed x:" + t.String())
        -		}
        -	}
        -	return
        -}
        -
        -// rangeIter emits to fn the header for a loop using
        -// Range/Next/Extract to iterate over map or string value x.
        -// tk and tv are the types of the key/value results k and v, or nil
        -// if the respective component is not wanted.
        -//
        -func (b *builder) rangeIter(fn *Function, x Value, tk, tv types.Type, pos token.Pos) (k, v Value, loop, done *BasicBlock) {
        -	//
        -	//	it = range x
        -	// loop:                                   (target of continue)
        -	//	okv = next it                      (ok, key, value)
        -	//  	ok = extract okv #0
        -	// 	if ok goto body else done
        -	// body:
        -	// 	k = extract okv #1
        -	// 	v = extract okv #2
        -	//      ...body...
        -	// 	jump loop
        -	// done:                                   (target of break)
        -	//
        -
        -	if tk == nil {
        -		tk = tInvalid
        -	}
        -	if tv == nil {
        -		tv = tInvalid
        -	}
        -
        -	rng := &Range{X: x}
        -	rng.setPos(pos)
        -	rng.setType(tRangeIter)
        -	it := fn.emit(rng)
        -
        -	loop = fn.newBasicBlock("rangeiter.loop")
        -	emitJump(fn, loop)
        -	fn.currentBlock = loop
        -
        -	_, isString := x.Type().Underlying().(*types.Basic)
        -
        -	okv := &Next{
        -		Iter:     it,
        -		IsString: isString,
        -	}
        -	okv.setType(types.NewTuple(
        -		varOk,
        -		newVar("k", tk),
        -		newVar("v", tv),
        -	))
        -	fn.emit(okv)
        -
        -	body := fn.newBasicBlock("rangeiter.body")
        -	done = fn.newBasicBlock("rangeiter.done")
        -	emitIf(fn, emitExtract(fn, okv, 0), body, done)
        -	fn.currentBlock = body
        -
        -	if tk != tInvalid {
        -		k = emitExtract(fn, okv, 1)
        -	}
        -	if tv != tInvalid {
        -		v = emitExtract(fn, okv, 2)
        -	}
        -	return
        -}
        -
        -// rangeChan emits to fn the header for a loop that receives from
        -// channel x until it fails.
        -// tk is the channel's element type, or nil if the k result is
        -// not wanted
        -// pos is the position of the '=' or ':=' token.
        -//
        -func (b *builder) rangeChan(fn *Function, x Value, tk types.Type, pos token.Pos) (k Value, loop, done *BasicBlock) {
        -	//
        -	// loop:                                   (target of continue)
        -	//      ko = <-x                           (key, ok)
        -	//      ok = extract ko #1
        -	//      if ok goto body else done
        -	// body:
        -	//      k = extract ko #0
        -	//      ...
        -	//      goto loop
        -	// done:                                   (target of break)
        -
        -	loop = fn.newBasicBlock("rangechan.loop")
        -	emitJump(fn, loop)
        -	fn.currentBlock = loop
        -	recv := &UnOp{
        -		Op:      token.ARROW,
        -		X:       x,
        -		CommaOk: true,
        -	}
        -	recv.setPos(pos)
        -	recv.setType(types.NewTuple(
        -		newVar("k", x.Type().Underlying().(*types.Chan).Elem()),
        -		varOk,
        -	))
        -	ko := fn.emit(recv)
        -	body := fn.newBasicBlock("rangechan.body")
        -	done = fn.newBasicBlock("rangechan.done")
        -	emitIf(fn, emitExtract(fn, ko, 1), body, done)
        -	fn.currentBlock = body
        -	if tk != nil {
        -		k = emitExtract(fn, ko, 0)
        -	}
        -	return
        -}
        -
        -// rangeStmt emits to fn code for the range statement s, optionally
        -// labelled by label.
        -//
        -func (b *builder) rangeStmt(fn *Function, s *ast.RangeStmt, label *lblock) {
        -	var tk, tv types.Type
        -	if s.Key != nil && !isBlankIdent(s.Key) {
        -		tk = fn.Pkg.typeOf(s.Key)
        -	}
        -	if s.Value != nil && !isBlankIdent(s.Value) {
        -		tv = fn.Pkg.typeOf(s.Value)
        -	}
        -
        -	// If iteration variables are defined (:=), this
        -	// occurs once outside the loop.
        -	//
        -	// Unlike a short variable declaration, a RangeStmt
        -	// using := never redeclares an existing variable; it
        -	// always creates a new one.
        -	if s.Tok == token.DEFINE {
        -		if tk != nil {
        -			fn.addLocalForIdent(s.Key.(*ast.Ident))
        -		}
        -		if tv != nil {
        -			fn.addLocalForIdent(s.Value.(*ast.Ident))
        -		}
        -	}
        -
        -	x := b.expr(fn, s.X)
        -
        -	var k, v Value
        -	var loop, done *BasicBlock
        -	switch rt := x.Type().Underlying().(type) {
        -	case *types.Slice, *types.Array, *types.Pointer: // *array
        -		k, v, loop, done = b.rangeIndexed(fn, x, tv, s.For)
        -
        -	case *types.Chan:
        -		k, loop, done = b.rangeChan(fn, x, tk, s.For)
        -
        -	case *types.Map, *types.Basic: // string
        -		k, v, loop, done = b.rangeIter(fn, x, tk, tv, s.For)
        -
        -	default:
        -		panic("Cannot range over: " + rt.String())
        -	}
        -
        -	// Evaluate both LHS expressions before we update either.
        -	var kl, vl lvalue
        -	if tk != nil {
        -		kl = b.addr(fn, s.Key, false) // non-escaping
        -	}
        -	if tv != nil {
        -		vl = b.addr(fn, s.Value, false) // non-escaping
        -	}
        -	if tk != nil {
        -		kl.store(fn, k)
        -	}
        -	if tv != nil {
        -		vl.store(fn, v)
        -	}
        -
        -	if label != nil {
        -		label._break = done
        -		label._continue = loop
        -	}
        -
        -	fn.targets = &targets{
        -		tail:      fn.targets,
        -		_break:    done,
        -		_continue: loop,
        -	}
        -	b.stmt(fn, s.Body)
        -	fn.targets = fn.targets.tail
        -	emitJump(fn, loop) // back-edge
        -	fn.currentBlock = done
        -}
        -
        -// stmt lowers statement s to SSA form, emitting code to fn.
        -func (b *builder) stmt(fn *Function, _s ast.Stmt) {
        -	// The label of the current statement.  If non-nil, its _goto
        -	// target is always set; its _break and _continue are set only
        -	// within the body of switch/typeswitch/select/for/range.
        -	// It is effectively an additional default-nil parameter of stmt().
        -	var label *lblock
        -start:
        -	switch s := _s.(type) {
        -	case *ast.EmptyStmt:
        -		// ignore.  (Usually removed by gofmt.)
        -
        -	case *ast.DeclStmt: // Con, Var or Typ
        -		d := s.Decl.(*ast.GenDecl)
        -		if d.Tok == token.VAR {
        -			for _, spec := range d.Specs {
        -				if vs, ok := spec.(*ast.ValueSpec); ok {
        -					b.localValueSpec(fn, vs)
        -				}
        -			}
        -		}
        -
        -	case *ast.LabeledStmt:
        -		label = fn.labelledBlock(s.Label)
        -		emitJump(fn, label._goto)
        -		fn.currentBlock = label._goto
        -		_s = s.Stmt
        -		goto start // effectively: tailcall stmt(fn, s.Stmt, label)
        -
        -	case *ast.ExprStmt:
        -		b.expr(fn, s.X)
        -
        -	case *ast.SendStmt:
        -		fn.emit(&Send{
        -			Chan: b.expr(fn, s.Chan),
        -			X: emitConv(fn, b.expr(fn, s.Value),
        -				fn.Pkg.typeOf(s.Chan).Underlying().(*types.Chan).Elem()),
        -			pos: s.Arrow,
        -		})
        -
        -	case *ast.IncDecStmt:
        -		op := token.ADD
        -		if s.Tok == token.DEC {
        -			op = token.SUB
        -		}
        -		loc := b.addr(fn, s.X, false)
        -		b.assignOp(fn, loc, NewConst(constant.MakeInt64(1), loc.typ()), op, s.Pos())
        -
        -	case *ast.AssignStmt:
        -		switch s.Tok {
        -		case token.ASSIGN, token.DEFINE:
        -			b.assignStmt(fn, s.Lhs, s.Rhs, s.Tok == token.DEFINE)
        -
        -		default: // +=, etc.
        -			op := s.Tok + token.ADD - token.ADD_ASSIGN
        -			b.assignOp(fn, b.addr(fn, s.Lhs[0], false), b.expr(fn, s.Rhs[0]), op, s.Pos())
        -		}
        -
        -	case *ast.GoStmt:
        -		// The "intrinsics" new/make/len/cap are forbidden here.
        -		// panic is treated like an ordinary function call.
        -		v := Go{pos: s.Go}
        -		b.setCall(fn, s.Call, &v.Call)
        -		fn.emit(&v)
        -
        -	case *ast.DeferStmt:
        -		// The "intrinsics" new/make/len/cap are forbidden here.
        -		// panic is treated like an ordinary function call.
        -		v := Defer{pos: s.Defer}
        -		b.setCall(fn, s.Call, &v.Call)
        -		fn.emit(&v)
        -
        -		// A deferred call can cause recovery from panic,
        -		// and control resumes at the Recover block.
        -		createRecoverBlock(fn)
        -
        -	case *ast.ReturnStmt:
        -		var results []Value
        -		if len(s.Results) == 1 && fn.Signature.Results().Len() > 1 {
        -			// Return of one expression in a multi-valued function.
        -			tuple := b.exprN(fn, s.Results[0])
        -			ttuple := tuple.Type().(*types.Tuple)
        -			for i, n := 0, ttuple.Len(); i < n; i++ {
        -				results = append(results,
        -					emitConv(fn, emitExtract(fn, tuple, i),
        -						fn.Signature.Results().At(i).Type()))
        -			}
        -		} else {
        -			// 1:1 return, or no-arg return in non-void function.
        -			for i, r := range s.Results {
        -				v := emitConv(fn, b.expr(fn, r), fn.Signature.Results().At(i).Type())
        -				results = append(results, v)
        -			}
        -		}
        -		if fn.namedResults != nil {
        -			// Function has named result parameters (NRPs).
        -			// Perform parallel assignment of return operands to NRPs.
        -			for i, r := range results {
        -				emitStore(fn, fn.namedResults[i], r, s.Return)
        -			}
        -		}
        -		// Run function calls deferred in this
        -		// function when explicitly returning from it.
        -		fn.emit(new(RunDefers))
        -		if fn.namedResults != nil {
        -			// Reload NRPs to form the result tuple.
        -			results = results[:0]
        -			for _, r := range fn.namedResults {
        -				results = append(results, emitLoad(fn, r))
        -			}
        -		}
        -		fn.emit(&Return{Results: results, pos: s.Return})
        -		fn.currentBlock = fn.newBasicBlock("unreachable")
        -
        -	case *ast.BranchStmt:
        -		var block *BasicBlock
        -		switch s.Tok {
        -		case token.BREAK:
        -			if s.Label != nil {
        -				block = fn.labelledBlock(s.Label)._break
        -			} else {
        -				for t := fn.targets; t != nil && block == nil; t = t.tail {
        -					block = t._break
        -				}
        -			}
        -
        -		case token.CONTINUE:
        -			if s.Label != nil {
        -				block = fn.labelledBlock(s.Label)._continue
        -			} else {
        -				for t := fn.targets; t != nil && block == nil; t = t.tail {
        -					block = t._continue
        -				}
        -			}
        -
        -		case token.FALLTHROUGH:
        -			for t := fn.targets; t != nil && block == nil; t = t.tail {
        -				block = t._fallthrough
        -			}
        -
        -		case token.GOTO:
        -			block = fn.labelledBlock(s.Label)._goto
        -		}
        -		emitJump(fn, block)
        -		fn.currentBlock = fn.newBasicBlock("unreachable")
        -
        -	case *ast.BlockStmt:
        -		b.stmtList(fn, s.List)
        -
        -	case *ast.IfStmt:
        -		if s.Init != nil {
        -			b.stmt(fn, s.Init)
        -		}
        -		then := fn.newBasicBlock("if.then")
        -		done := fn.newBasicBlock("if.done")
        -		els := done
        -		if s.Else != nil {
        -			els = fn.newBasicBlock("if.else")
        -		}
        -		b.cond(fn, s.Cond, then, els)
        -		fn.currentBlock = then
        -		b.stmt(fn, s.Body)
        -		emitJump(fn, done)
        -
        -		if s.Else != nil {
        -			fn.currentBlock = els
        -			b.stmt(fn, s.Else)
        -			emitJump(fn, done)
        -		}
        -
        -		fn.currentBlock = done
        -
        -	case *ast.SwitchStmt:
        -		b.switchStmt(fn, s, label)
        -
        -	case *ast.TypeSwitchStmt:
        -		b.typeSwitchStmt(fn, s, label)
        -
        -	case *ast.SelectStmt:
        -		b.selectStmt(fn, s, label)
        -
        -	case *ast.ForStmt:
        -		b.forStmt(fn, s, label)
        -
        -	case *ast.RangeStmt:
        -		b.rangeStmt(fn, s, label)
        -
        -	default:
        -		panic(fmt.Sprintf("unexpected statement kind: %T", s))
        -	}
        -}
        -
        -// buildFunction builds SSA code for the body of function fn.  Idempotent.
        -func (b *builder) buildFunction(fn *Function) {
        -	if fn.Blocks != nil {
        -		return // building already started
        -	}
        -
        -	var recvField *ast.FieldList
        -	var body *ast.BlockStmt
        -	var functype *ast.FuncType
        -	switch n := fn.syntax.(type) {
        -	case nil:
        -		return // not a Go source function.  (Synthetic, or from object file.)
        -	case *ast.FuncDecl:
        -		functype = n.Type
        -		recvField = n.Recv
        -		body = n.Body
        -	case *ast.FuncLit:
        -		functype = n.Type
        -		body = n.Body
        -	default:
        -		panic(n)
        -	}
        -
        -	if body == nil {
        -		// External function.
        -		if fn.Params == nil {
        -			// This condition ensures we add a non-empty
        -			// params list once only, but we may attempt
        -			// the degenerate empty case repeatedly.
        -			// TODO(adonovan): opt: don't do that.
        -
        -			// We set Function.Params even though there is no body
        -			// code to reference them.  This simplifies clients.
        -			if recv := fn.Signature.Recv(); recv != nil {
        -				fn.addParamObj(recv)
        -			}
        -			params := fn.Signature.Params()
        -			for i, n := 0, params.Len(); i < n; i++ {
        -				fn.addParamObj(params.At(i))
        -			}
        -		}
        -		return
        -	}
        -	if fn.Prog.mode&LogSource != 0 {
        -		defer logStack("build function %s @ %s", fn, fn.Prog.Fset.Position(fn.pos))()
        -	}
        -	fn.startBody()
        -	fn.createSyntacticParams(recvField, functype)
        -	b.stmt(fn, body)
        -	if cb := fn.currentBlock; cb != nil && (cb == fn.Blocks[0] || cb == fn.Recover || cb.Preds != nil) {
        -		// Control fell off the end of the function's body block.
        -		//
        -		// Block optimizations eliminate the current block, if
        -		// unreachable.  It is a builder invariant that
        -		// if this no-arg return is ill-typed for
        -		// fn.Signature.Results, this block must be
        -		// unreachable.  The sanity checker checks this.
        -		fn.emit(new(RunDefers))
        -		fn.emit(new(Return))
        -	}
        -	fn.finishBody()
        -}
        -
        -// buildFuncDecl builds SSA code for the function or method declared
        -// by decl in package pkg.
        -//
        -func (b *builder) buildFuncDecl(pkg *Package, decl *ast.FuncDecl) {
        -	id := decl.Name
        -	if isBlankIdent(id) {
        -		return // discard
        -	}
        -	fn := pkg.values[pkg.info.Defs[id]].(*Function)
        -	if decl.Recv == nil && id.Name == "init" {
        -		var v Call
        -		v.Call.Value = fn
        -		v.setType(types.NewTuple())
        -		pkg.init.emit(&v)
        -	}
        -	b.buildFunction(fn)
        -}
        -
        -// Build calls Package.Build for each package in prog.
        -// Building occurs in parallel unless the BuildSerially mode flag was set.
        -//
        -// Build is intended for whole-program analysis; a typical compiler
        -// need only build a single package.
        -//
        -// Build is idempotent and thread-safe.
        -//
        -func (prog *Program) Build() {
        -	var wg sync.WaitGroup
        -	for _, p := range prog.packages {
        -		if prog.mode&BuildSerially != 0 {
        -			p.Build()
        -		} else {
        -			wg.Add(1)
        -			go func(p *Package) {
        -				p.Build()
        -				wg.Done()
        -			}(p)
        -		}
        -	}
        -	wg.Wait()
        -}
        -
        -// Build builds SSA code for all functions and vars in package p.
        -//
        -// Precondition: CreatePackage must have been called for all of p's
        -// direct imports (and hence its direct imports must have been
        -// error-free).
        -//
        -// Build is idempotent and thread-safe.
        -//
        -func (p *Package) Build() { p.buildOnce.Do(p.build) }
        -
        -func (p *Package) build() {
        -	if p.info == nil {
        -		return // synthetic package, e.g. "testmain"
        -	}
        -
        -	// Ensure we have runtime type info for all exported members.
        -	// TODO(adonovan): ideally belongs in memberFromObject, but
        -	// that would require package creation in topological order.
        -	for name, mem := range p.Members {
        -		if ast.IsExported(name) {
        -			p.Prog.needMethodsOf(mem.Type())
        -		}
        -	}
        -	if p.Prog.mode&LogSource != 0 {
        -		defer logStack("build %s", p)()
        -	}
        -	init := p.init
        -	init.startBody()
        -
        -	var done *BasicBlock
        -
        -	if p.Prog.mode&BareInits == 0 {
        -		// Make init() skip if package is already initialized.
        -		initguard := p.Var("init$guard")
        -		doinit := init.newBasicBlock("init.start")
        -		done = init.newBasicBlock("init.done")
        -		emitIf(init, emitLoad(init, initguard), done, doinit)
        -		init.currentBlock = doinit
        -		emitStore(init, initguard, vTrue, token.NoPos)
        -
        -		// Call the init() function of each package we import.
        -		for _, pkg := range p.Pkg.Imports() {
        -			prereq := p.Prog.packages[pkg]
        -			if prereq == nil {
        -				panic(fmt.Sprintf("Package(%q).Build(): unsatisfied import: Program.CreatePackage(%q) was not called", p.Pkg.Path(), pkg.Path()))
        -			}
        -			var v Call
        -			v.Call.Value = prereq.init
        -			v.Call.pos = init.pos
        -			v.setType(types.NewTuple())
        -			init.emit(&v)
        -		}
        -	}
        -
        -	var b builder
        -
        -	// Initialize package-level vars in correct order.
        -	for _, varinit := range p.info.InitOrder {
        -		if init.Prog.mode&LogSource != 0 {
        -			fmt.Fprintf(os.Stderr, "build global initializer %v @ %s\n",
        -				varinit.Lhs, p.Prog.Fset.Position(varinit.Rhs.Pos()))
        -		}
        -		if len(varinit.Lhs) == 1 {
        -			// 1:1 initialization: var x, y = a(), b()
        -			var lval lvalue
        -			if v := varinit.Lhs[0]; v.Name() != "_" {
        -				lval = &address{addr: p.values[v].(*Global), pos: v.Pos()}
        -			} else {
        -				lval = blank{}
        -			}
        -			b.assign(init, lval, varinit.Rhs, true, nil)
        -		} else {
        -			// n:1 initialization: var x, y :=  f()
        -			tuple := b.exprN(init, varinit.Rhs)
        -			for i, v := range varinit.Lhs {
        -				if v.Name() == "_" {
        -					continue
        -				}
        -				emitStore(init, p.values[v].(*Global), emitExtract(init, tuple, i), v.Pos())
        -			}
        -		}
        -	}
        -
        -	// Build all package-level functions, init functions
        -	// and methods, including unreachable/blank ones.
        -	// We build them in source order, but it's not significant.
        -	for _, file := range p.files {
        -		for _, decl := range file.Decls {
        -			if decl, ok := decl.(*ast.FuncDecl); ok {
        -				b.buildFuncDecl(p, decl)
        -			}
        -		}
        -	}
        -
        -	// Finish up init().
        -	if p.Prog.mode&BareInits == 0 {
        -		emitJump(init, done)
        -		init.currentBlock = done
        -	}
        -	init.emit(new(Return))
        -	init.finishBody()
        -
        -	p.info = nil // We no longer need ASTs or go/types deductions.
        -
        -	if p.Prog.mode&SanityCheckFunctions != 0 {
        -		sanityCheckPackage(p)
        -	}
        -}
        -
        -// Like ObjectOf, but panics instead of returning nil.
        -// Only valid during p's create and build phases.
        -func (p *Package) objectOf(id *ast.Ident) types.Object {
        -	if o := p.info.ObjectOf(id); o != nil {
        -		return o
        -	}
        -	panic(fmt.Sprintf("no types.Object for ast.Ident %s @ %s",
        -		id.Name, p.Prog.Fset.Position(id.Pos())))
        -}
        -
        -// Like TypeOf, but panics instead of returning nil.
        -// Only valid during p's create and build phases.
        -func (p *Package) typeOf(e ast.Expr) types.Type {
        -	if T := p.info.TypeOf(e); T != nil {
        -		return T
        -	}
        -	panic(fmt.Sprintf("no type for %T @ %s",
        -		e, p.Prog.Fset.Position(e.Pos())))
        -}
        diff --git a/vendor/honnef.co/go/tools/ssa/const.go b/vendor/honnef.co/go/tools/ssa/const.go
        deleted file mode 100644
        index f95d9e114..000000000
        --- a/vendor/honnef.co/go/tools/ssa/const.go
        +++ /dev/null
        @@ -1,169 +0,0 @@
        -// Copyright 2013 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package ssa
        -
        -// This file defines the Const SSA value type.
        -
        -import (
        -	"fmt"
        -	"go/constant"
        -	"go/token"
        -	"go/types"
        -	"strconv"
        -)
        -
        -// NewConst returns a new constant of the specified value and type.
        -// val must be valid according to the specification of Const.Value.
        -//
        -func NewConst(val constant.Value, typ types.Type) *Const {
        -	return &Const{typ, val}
        -}
        -
        -// intConst returns an 'int' constant that evaluates to i.
        -// (i is an int64 in case the host is narrower than the target.)
        -func intConst(i int64) *Const {
        -	return NewConst(constant.MakeInt64(i), tInt)
        -}
        -
        -// nilConst returns a nil constant of the specified type, which may
        -// be any reference type, including interfaces.
        -//
        -func nilConst(typ types.Type) *Const {
        -	return NewConst(nil, typ)
        -}
        -
        -// stringConst returns a 'string' constant that evaluates to s.
        -func stringConst(s string) *Const {
        -	return NewConst(constant.MakeString(s), tString)
        -}
        -
        -// zeroConst returns a new "zero" constant of the specified type,
        -// which must not be an array or struct type: the zero values of
        -// aggregates are well-defined but cannot be represented by Const.
        -//
        -func zeroConst(t types.Type) *Const {
        -	switch t := t.(type) {
        -	case *types.Basic:
        -		switch {
        -		case t.Info()&types.IsBoolean != 0:
        -			return NewConst(constant.MakeBool(false), t)
        -		case t.Info()&types.IsNumeric != 0:
        -			return NewConst(constant.MakeInt64(0), t)
        -		case t.Info()&types.IsString != 0:
        -			return NewConst(constant.MakeString(""), t)
        -		case t.Kind() == types.UnsafePointer:
        -			fallthrough
        -		case t.Kind() == types.UntypedNil:
        -			return nilConst(t)
        -		default:
        -			panic(fmt.Sprint("zeroConst for unexpected type:", t))
        -		}
        -	case *types.Pointer, *types.Slice, *types.Interface, *types.Chan, *types.Map, *types.Signature:
        -		return nilConst(t)
        -	case *types.Named:
        -		return NewConst(zeroConst(t.Underlying()).Value, t)
        -	case *types.Array, *types.Struct, *types.Tuple:
        -		panic(fmt.Sprint("zeroConst applied to aggregate:", t))
        -	}
        -	panic(fmt.Sprint("zeroConst: unexpected ", t))
        -}
        -
        -func (c *Const) RelString(from *types.Package) string {
        -	var s string
        -	if c.Value == nil {
        -		s = "nil"
        -	} else if c.Value.Kind() == constant.String {
        -		s = constant.StringVal(c.Value)
        -		const max = 20
        -		// TODO(adonovan): don't cut a rune in half.
        -		if len(s) > max {
        -			s = s[:max-3] + "..." // abbreviate
        -		}
        -		s = strconv.Quote(s)
        -	} else {
        -		s = c.Value.String()
        -	}
        -	return s + ":" + relType(c.Type(), from)
        -}
        -
        -func (c *Const) Name() string {
        -	return c.RelString(nil)
        -}
        -
        -func (c *Const) String() string {
        -	return c.Name()
        -}
        -
        -func (c *Const) Type() types.Type {
        -	return c.typ
        -}
        -
        -func (c *Const) Referrers() *[]Instruction {
        -	return nil
        -}
        -
        -func (c *Const) Parent() *Function { return nil }
        -
        -func (c *Const) Pos() token.Pos {
        -	return token.NoPos
        -}
        -
        -// IsNil returns true if this constant represents a typed or untyped nil value.
        -func (c *Const) IsNil() bool {
        -	return c.Value == nil
        -}
        -
        -// TODO(adonovan): move everything below into honnef.co/go/tools/ssa/interp.
        -
        -// Int64 returns the numeric value of this constant truncated to fit
        -// a signed 64-bit integer.
        -//
        -func (c *Const) Int64() int64 {
        -	switch x := constant.ToInt(c.Value); x.Kind() {
        -	case constant.Int:
        -		if i, ok := constant.Int64Val(x); ok {
        -			return i
        -		}
        -		return 0
        -	case constant.Float:
        -		f, _ := constant.Float64Val(x)
        -		return int64(f)
        -	}
        -	panic(fmt.Sprintf("unexpected constant value: %T", c.Value))
        -}
        -
        -// Uint64 returns the numeric value of this constant truncated to fit
        -// an unsigned 64-bit integer.
        -//
        -func (c *Const) Uint64() uint64 {
        -	switch x := constant.ToInt(c.Value); x.Kind() {
        -	case constant.Int:
        -		if u, ok := constant.Uint64Val(x); ok {
        -			return u
        -		}
        -		return 0
        -	case constant.Float:
        -		f, _ := constant.Float64Val(x)
        -		return uint64(f)
        -	}
        -	panic(fmt.Sprintf("unexpected constant value: %T", c.Value))
        -}
        -
        -// Float64 returns the numeric value of this constant truncated to fit
        -// a float64.
        -//
        -func (c *Const) Float64() float64 {
        -	f, _ := constant.Float64Val(c.Value)
        -	return f
        -}
        -
        -// Complex128 returns the complex value of this constant truncated to
        -// fit a complex128.
        -//
        -func (c *Const) Complex128() complex128 {
        -	re, _ := constant.Float64Val(constant.Real(c.Value))
        -	im, _ := constant.Float64Val(constant.Imag(c.Value))
        -	return complex(re, im)
        -}
        diff --git a/vendor/honnef.co/go/tools/ssa/create.go b/vendor/honnef.co/go/tools/ssa/create.go
        deleted file mode 100644
        index 85163a0c5..000000000
        --- a/vendor/honnef.co/go/tools/ssa/create.go
        +++ /dev/null
        @@ -1,270 +0,0 @@
        -// Copyright 2013 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package ssa
        -
        -// This file implements the CREATE phase of SSA construction.
        -// See builder.go for explanation.
        -
        -import (
        -	"fmt"
        -	"go/ast"
        -	"go/token"
        -	"go/types"
        -	"os"
        -	"sync"
        -
        -	"golang.org/x/tools/go/types/typeutil"
        -)
        -
        -// NewProgram returns a new SSA Program.
        -//
        -// mode controls diagnostics and checking during SSA construction.
        -//
        -func NewProgram(fset *token.FileSet, mode BuilderMode) *Program {
        -	prog := &Program{
        -		Fset:     fset,
        -		imported: make(map[string]*Package),
        -		packages: make(map[*types.Package]*Package),
        -		thunks:   make(map[selectionKey]*Function),
        -		bounds:   make(map[*types.Func]*Function),
        -		mode:     mode,
        -	}
        -
        -	h := typeutil.MakeHasher() // protected by methodsMu, in effect
        -	prog.methodSets.SetHasher(h)
        -	prog.canon.SetHasher(h)
        -
        -	return prog
        -}
        -
        -// memberFromObject populates package pkg with a member for the
        -// typechecker object obj.
        -//
        -// For objects from Go source code, syntax is the associated syntax
        -// tree (for funcs and vars only); it will be used during the build
        -// phase.
        -//
        -func memberFromObject(pkg *Package, obj types.Object, syntax ast.Node) {
        -	name := obj.Name()
        -	switch obj := obj.(type) {
        -	case *types.Builtin:
        -		if pkg.Pkg != types.Unsafe {
        -			panic("unexpected builtin object: " + obj.String())
        -		}
        -
        -	case *types.TypeName:
        -		pkg.Members[name] = &Type{
        -			object: obj,
        -			pkg:    pkg,
        -		}
        -
        -	case *types.Const:
        -		c := &NamedConst{
        -			object: obj,
        -			Value:  NewConst(obj.Val(), obj.Type()),
        -			pkg:    pkg,
        -		}
        -		pkg.values[obj] = c.Value
        -		pkg.Members[name] = c
        -
        -	case *types.Var:
        -		g := &Global{
        -			Pkg:    pkg,
        -			name:   name,
        -			object: obj,
        -			typ:    types.NewPointer(obj.Type()), // address
        -			pos:    obj.Pos(),
        -		}
        -		pkg.values[obj] = g
        -		pkg.Members[name] = g
        -
        -	case *types.Func:
        -		sig := obj.Type().(*types.Signature)
        -		if sig.Recv() == nil && name == "init" {
        -			pkg.ninit++
        -			name = fmt.Sprintf("init#%d", pkg.ninit)
        -		}
        -		fn := &Function{
        -			name:      name,
        -			object:    obj,
        -			Signature: sig,
        -			syntax:    syntax,
        -			pos:       obj.Pos(),
        -			Pkg:       pkg,
        -			Prog:      pkg.Prog,
        -		}
        -		if syntax == nil {
        -			fn.Synthetic = "loaded from gc object file"
        -		}
        -
        -		pkg.values[obj] = fn
        -		if sig.Recv() == nil {
        -			pkg.Members[name] = fn // package-level function
        -		}
        -
        -	default: // (incl. *types.Package)
        -		panic("unexpected Object type: " + obj.String())
        -	}
        -}
        -
        -// membersFromDecl populates package pkg with members for each
        -// typechecker object (var, func, const or type) associated with the
        -// specified decl.
        -//
        -func membersFromDecl(pkg *Package, decl ast.Decl) {
        -	switch decl := decl.(type) {
        -	case *ast.GenDecl: // import, const, type or var
        -		switch decl.Tok {
        -		case token.CONST:
        -			for _, spec := range decl.Specs {
        -				for _, id := range spec.(*ast.ValueSpec).Names {
        -					if !isBlankIdent(id) {
        -						memberFromObject(pkg, pkg.info.Defs[id], nil)
        -					}
        -				}
        -			}
        -
        -		case token.VAR:
        -			for _, spec := range decl.Specs {
        -				for _, id := range spec.(*ast.ValueSpec).Names {
        -					if !isBlankIdent(id) {
        -						memberFromObject(pkg, pkg.info.Defs[id], spec)
        -					}
        -				}
        -			}
        -
        -		case token.TYPE:
        -			for _, spec := range decl.Specs {
        -				id := spec.(*ast.TypeSpec).Name
        -				if !isBlankIdent(id) {
        -					memberFromObject(pkg, pkg.info.Defs[id], nil)
        -				}
        -			}
        -		}
        -
        -	case *ast.FuncDecl:
        -		id := decl.Name
        -		if !isBlankIdent(id) {
        -			memberFromObject(pkg, pkg.info.Defs[id], decl)
        -		}
        -	}
        -}
        -
        -// CreatePackage constructs and returns an SSA Package from the
        -// specified type-checked, error-free file ASTs, and populates its
        -// Members mapping.
        -//
        -// importable determines whether this package should be returned by a
        -// subsequent call to ImportedPackage(pkg.Path()).
        -//
        -// The real work of building SSA form for each function is not done
        -// until a subsequent call to Package.Build().
        -//
        -func (prog *Program) CreatePackage(pkg *types.Package, files []*ast.File, info *types.Info, importable bool) *Package {
        -	p := &Package{
        -		Prog:    prog,
        -		Members: make(map[string]Member),
        -		values:  make(map[types.Object]Value),
        -		Pkg:     pkg,
        -		info:    info,  // transient (CREATE and BUILD phases)
        -		files:   files, // transient (CREATE and BUILD phases)
        -	}
        -
        -	// Add init() function.
        -	p.init = &Function{
        -		name:      "init",
        -		Signature: new(types.Signature),
        -		Synthetic: "package initializer",
        -		Pkg:       p,
        -		Prog:      prog,
        -	}
        -	p.Members[p.init.name] = p.init
        -
        -	// CREATE phase.
        -	// Allocate all package members: vars, funcs, consts and types.
        -	if len(files) > 0 {
        -		// Go source package.
        -		for _, file := range files {
        -			for _, decl := range file.Decls {
        -				membersFromDecl(p, decl)
        -			}
        -		}
        -	} else {
        -		// GC-compiled binary package (or "unsafe")
        -		// No code.
        -		// No position information.
        -		scope := p.Pkg.Scope()
        -		for _, name := range scope.Names() {
        -			obj := scope.Lookup(name)
        -			memberFromObject(p, obj, nil)
        -			if obj, ok := obj.(*types.TypeName); ok {
        -				if named, ok := obj.Type().(*types.Named); ok {
        -					for i, n := 0, named.NumMethods(); i < n; i++ {
        -						memberFromObject(p, named.Method(i), nil)
        -					}
        -				}
        -			}
        -		}
        -	}
        -
        -	if prog.mode&BareInits == 0 {
        -		// Add initializer guard variable.
        -		initguard := &Global{
        -			Pkg:  p,
        -			name: "init$guard",
        -			typ:  types.NewPointer(tBool),
        -		}
        -		p.Members[initguard.Name()] = initguard
        -	}
        -
        -	if prog.mode&GlobalDebug != 0 {
        -		p.SetDebugMode(true)
        -	}
        -
        -	if prog.mode&PrintPackages != 0 {
        -		printMu.Lock()
        -		p.WriteTo(os.Stdout)
        -		printMu.Unlock()
        -	}
        -
        -	if importable {
        -		prog.imported[p.Pkg.Path()] = p
        -	}
        -	prog.packages[p.Pkg] = p
        -
        -	return p
        -}
        -
        -// printMu serializes printing of Packages/Functions to stdout.
        -var printMu sync.Mutex
        -
        -// AllPackages returns a new slice containing all packages in the
        -// program prog in unspecified order.
        -//
        -func (prog *Program) AllPackages() []*Package {
        -	pkgs := make([]*Package, 0, len(prog.packages))
        -	for _, pkg := range prog.packages {
        -		pkgs = append(pkgs, pkg)
        -	}
        -	return pkgs
        -}
        -
        -// ImportedPackage returns the importable Package whose PkgPath
        -// is path, or nil if no such Package has been created.
        -//
        -// A parameter to CreatePackage determines whether a package should be
        -// considered importable. For example, no import declaration can resolve
        -// to the ad-hoc main package created by 'go build foo.go'.
        -//
        -// TODO(adonovan): rethink this function and the "importable" concept;
        -// most packages are importable. This function assumes that all
        -// types.Package.Path values are unique within the ssa.Program, which is
        -// false---yet this function remains very convenient.
        -// Clients should use (*Program).Package instead where possible.
        -// SSA doesn't really need a string-keyed map of packages.
        -//
        -func (prog *Program) ImportedPackage(path string) *Package {
        -	return prog.imported[path]
        -}
        diff --git a/vendor/honnef.co/go/tools/ssa/doc.go b/vendor/honnef.co/go/tools/ssa/doc.go
        deleted file mode 100644
        index 0f71fda00..000000000
        --- a/vendor/honnef.co/go/tools/ssa/doc.go
        +++ /dev/null
        @@ -1,125 +0,0 @@
        -// Copyright 2013 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -// Package ssa defines a representation of the elements of Go programs
        -// (packages, types, functions, variables and constants) using a
        -// static single-assignment (SSA) form intermediate representation
        -// (IR) for the bodies of functions.
        -//
        -// THIS INTERFACE IS EXPERIMENTAL AND IS LIKELY TO CHANGE.
        -//
        -// For an introduction to SSA form, see
        -// http://en.wikipedia.org/wiki/Static_single_assignment_form.
        -// This page provides a broader reading list:
        -// http://www.dcs.gla.ac.uk/~jsinger/ssa.html.
        -//
        -// The level of abstraction of the SSA form is intentionally close to
        -// the source language to facilitate construction of source analysis
        -// tools.  It is not intended for machine code generation.
        -//
        -// All looping, branching and switching constructs are replaced with
        -// unstructured control flow.  Higher-level control flow constructs
        -// such as multi-way branch can be reconstructed as needed; see
        -// ssautil.Switches() for an example.
        -//
        -// The simplest way to create the SSA representation of a package is
        -// to load typed syntax trees using golang.org/x/tools/go/packages, then
        -// invoke the ssautil.Packages helper function. See ExampleLoadPackages
        -// and ExampleWholeProgram for examples.
        -// The resulting ssa.Program contains all the packages and their
        -// members, but SSA code is not created for function bodies until a
        -// subsequent call to (*Package).Build or (*Program).Build.
        -//
        -// The builder initially builds a naive SSA form in which all local
        -// variables are addresses of stack locations with explicit loads and
        -// stores.  Registerisation of eligible locals and φ-node insertion
        -// using dominance and dataflow are then performed as a second pass
        -// called "lifting" to improve the accuracy and performance of
        -// subsequent analyses; this pass can be skipped by setting the
        -// NaiveForm builder flag.
        -//
        -// The primary interfaces of this package are:
        -//
        -//    - Member: a named member of a Go package.
        -//    - Value: an expression that yields a value.
        -//    - Instruction: a statement that consumes values and performs computation.
        -//    - Node: a Value or Instruction (emphasizing its membership in the SSA value graph)
        -//
        -// A computation that yields a result implements both the Value and
        -// Instruction interfaces.  The following table shows for each
        -// concrete type which of these interfaces it implements.
        -//
        -//                      Value?          Instruction?    Member?
        -//   *Alloc             ✔               ✔
        -//   *BinOp             ✔               ✔
        -//   *Builtin           ✔
        -//   *Call              ✔               ✔
        -//   *ChangeInterface   ✔               ✔
        -//   *ChangeType        ✔               ✔
        -//   *Const             ✔
        -//   *Convert           ✔               ✔
        -//   *DebugRef                          ✔
        -//   *Defer                             ✔
        -//   *Extract           ✔               ✔
        -//   *Field             ✔               ✔
        -//   *FieldAddr         ✔               ✔
        -//   *FreeVar           ✔
        -//   *Function          ✔                               ✔ (func)
        -//   *Global            ✔                               ✔ (var)
        -//   *Go                                ✔
        -//   *If                                ✔
        -//   *Index             ✔               ✔
        -//   *IndexAddr         ✔               ✔
        -//   *Jump                              ✔
        -//   *Lookup            ✔               ✔
        -//   *MakeChan          ✔               ✔
        -//   *MakeClosure       ✔               ✔
        -//   *MakeInterface     ✔               ✔
        -//   *MakeMap           ✔               ✔
        -//   *MakeSlice         ✔               ✔
        -//   *MapUpdate                         ✔
        -//   *NamedConst                                        ✔ (const)
        -//   *Next              ✔               ✔
        -//   *Panic                             ✔
        -//   *Parameter         ✔
        -//   *Phi               ✔               ✔
        -//   *Range             ✔               ✔
        -//   *Return                            ✔
        -//   *RunDefers                         ✔
        -//   *Select            ✔               ✔
        -//   *Send                              ✔
        -//   *Slice             ✔               ✔
        -//   *Store                             ✔
        -//   *Type                                              ✔ (type)
        -//   *TypeAssert        ✔               ✔
        -//   *UnOp              ✔               ✔
        -//
        -// Other key types in this package include: Program, Package, Function
        -// and BasicBlock.
        -//
        -// The program representation constructed by this package is fully
        -// resolved internally, i.e. it does not rely on the names of Values,
        -// Packages, Functions, Types or BasicBlocks for the correct
        -// interpretation of the program.  Only the identities of objects and
        -// the topology of the SSA and type graphs are semantically
        -// significant.  (There is one exception: Ids, used to identify field
        -// and method names, contain strings.)  Avoidance of name-based
        -// operations simplifies the implementation of subsequent passes and
        -// can make them very efficient.  Many objects are nonetheless named
        -// to aid in debugging, but it is not essential that the names be
        -// either accurate or unambiguous.  The public API exposes a number of
        -// name-based maps for client convenience.
        -//
        -// The ssa/ssautil package provides various utilities that depend only
        -// on the public API of this package.
        -//
        -// TODO(adonovan): Consider the exceptional control-flow implications
        -// of defer and recover().
        -//
        -// TODO(adonovan): write a how-to document for all the various cases
        -// of trying to determine corresponding elements across the four
        -// domains of source locations, ast.Nodes, types.Objects,
        -// ssa.Values/Instructions.
        -//
        -package ssa // import "honnef.co/go/tools/ssa"
        diff --git a/vendor/honnef.co/go/tools/ssa/dom.go b/vendor/honnef.co/go/tools/ssa/dom.go
        deleted file mode 100644
        index a036be87c..000000000
        --- a/vendor/honnef.co/go/tools/ssa/dom.go
        +++ /dev/null
        @@ -1,343 +0,0 @@
        -// Copyright 2013 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package ssa
        -
        -// This file defines algorithms related to dominance.
        -
        -// Dominator tree construction ----------------------------------------
        -//
        -// We use the algorithm described in Lengauer & Tarjan. 1979.  A fast
        -// algorithm for finding dominators in a flowgraph.
        -// http://doi.acm.org/10.1145/357062.357071
        -//
        -// We also apply the optimizations to SLT described in Georgiadis et
        -// al, Finding Dominators in Practice, JGAA 2006,
        -// http://jgaa.info/accepted/2006/GeorgiadisTarjanWerneck2006.10.1.pdf
        -// to avoid the need for buckets of size > 1.
        -
        -import (
        -	"bytes"
        -	"fmt"
        -	"math/big"
        -	"os"
        -	"sort"
        -)
        -
        -// Idom returns the block that immediately dominates b:
        -// its parent in the dominator tree, if any.
        -// Neither the entry node (b.Index==0) nor recover node
        -// (b==b.Parent().Recover()) have a parent.
        -//
        -func (b *BasicBlock) Idom() *BasicBlock { return b.dom.idom }
        -
        -// Dominees returns the list of blocks that b immediately dominates:
        -// its children in the dominator tree.
        -//
        -func (b *BasicBlock) Dominees() []*BasicBlock { return b.dom.children }
        -
        -// Dominates reports whether b dominates c.
        -func (b *BasicBlock) Dominates(c *BasicBlock) bool {
        -	return b.dom.pre <= c.dom.pre && c.dom.post <= b.dom.post
        -}
        -
        -type byDomPreorder []*BasicBlock
        -
        -func (a byDomPreorder) Len() int           { return len(a) }
        -func (a byDomPreorder) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
        -func (a byDomPreorder) Less(i, j int) bool { return a[i].dom.pre < a[j].dom.pre }
        -
        -// DomPreorder returns a new slice containing the blocks of f in
        -// dominator tree preorder.
        -//
        -func (f *Function) DomPreorder() []*BasicBlock {
        -	n := len(f.Blocks)
        -	order := make(byDomPreorder, n)
        -	copy(order, f.Blocks)
        -	sort.Sort(order)
        -	return order
        -}
        -
        -// domInfo contains a BasicBlock's dominance information.
        -type domInfo struct {
        -	idom      *BasicBlock   // immediate dominator (parent in domtree)
        -	children  []*BasicBlock // nodes immediately dominated by this one
        -	pre, post int32         // pre- and post-order numbering within domtree
        -}
        -
        -// ltState holds the working state for Lengauer-Tarjan algorithm
        -// (during which domInfo.pre is repurposed for CFG DFS preorder number).
        -type ltState struct {
        -	// Each slice is indexed by b.Index.
        -	sdom     []*BasicBlock // b's semidominator
        -	parent   []*BasicBlock // b's parent in DFS traversal of CFG
        -	ancestor []*BasicBlock // b's ancestor with least sdom
        -}
        -
        -// dfs implements the depth-first search part of the LT algorithm.
        -func (lt *ltState) dfs(v *BasicBlock, i int32, preorder []*BasicBlock) int32 {
        -	preorder[i] = v
        -	v.dom.pre = i // For now: DFS preorder of spanning tree of CFG
        -	i++
        -	lt.sdom[v.Index] = v
        -	lt.link(nil, v)
        -	for _, w := range v.Succs {
        -		if lt.sdom[w.Index] == nil {
        -			lt.parent[w.Index] = v
        -			i = lt.dfs(w, i, preorder)
        -		}
        -	}
        -	return i
        -}
        -
        -// eval implements the EVAL part of the LT algorithm.
        -func (lt *ltState) eval(v *BasicBlock) *BasicBlock {
        -	// TODO(adonovan): opt: do path compression per simple LT.
        -	u := v
        -	for ; lt.ancestor[v.Index] != nil; v = lt.ancestor[v.Index] {
        -		if lt.sdom[v.Index].dom.pre < lt.sdom[u.Index].dom.pre {
        -			u = v
        -		}
        -	}
        -	return u
        -}
        -
        -// link implements the LINK part of the LT algorithm.
        -func (lt *ltState) link(v, w *BasicBlock) {
        -	lt.ancestor[w.Index] = v
        -}
        -
        -// buildDomTree computes the dominator tree of f using the LT algorithm.
        -// Precondition: all blocks are reachable (e.g. optimizeBlocks has been run).
        -//
        -func buildDomTree(f *Function) {
        -	// The step numbers refer to the original LT paper; the
        -	// reordering is due to Georgiadis.
        -
        -	// Clear any previous domInfo.
        -	for _, b := range f.Blocks {
        -		b.dom = domInfo{}
        -	}
        -
        -	n := len(f.Blocks)
        -	// Allocate space for 5 contiguous [n]*BasicBlock arrays:
        -	// sdom, parent, ancestor, preorder, buckets.
        -	space := make([]*BasicBlock, 5*n)
        -	lt := ltState{
        -		sdom:     space[0:n],
        -		parent:   space[n : 2*n],
        -		ancestor: space[2*n : 3*n],
        -	}
        -
        -	// Step 1.  Number vertices by depth-first preorder.
        -	preorder := space[3*n : 4*n]
        -	root := f.Blocks[0]
        -	prenum := lt.dfs(root, 0, preorder)
        -	recover := f.Recover
        -	if recover != nil {
        -		lt.dfs(recover, prenum, preorder)
        -	}
        -
        -	buckets := space[4*n : 5*n]
        -	copy(buckets, preorder)
        -
        -	// In reverse preorder...
        -	for i := int32(n) - 1; i > 0; i-- {
        -		w := preorder[i]
        -
        -		// Step 3. Implicitly define the immediate dominator of each node.
        -		for v := buckets[i]; v != w; v = buckets[v.dom.pre] {
        -			u := lt.eval(v)
        -			if lt.sdom[u.Index].dom.pre < i {
        -				v.dom.idom = u
        -			} else {
        -				v.dom.idom = w
        -			}
        -		}
        -
        -		// Step 2. Compute the semidominators of all nodes.
        -		lt.sdom[w.Index] = lt.parent[w.Index]
        -		for _, v := range w.Preds {
        -			u := lt.eval(v)
        -			if lt.sdom[u.Index].dom.pre < lt.sdom[w.Index].dom.pre {
        -				lt.sdom[w.Index] = lt.sdom[u.Index]
        -			}
        -		}
        -
        -		lt.link(lt.parent[w.Index], w)
        -
        -		if lt.parent[w.Index] == lt.sdom[w.Index] {
        -			w.dom.idom = lt.parent[w.Index]
        -		} else {
        -			buckets[i] = buckets[lt.sdom[w.Index].dom.pre]
        -			buckets[lt.sdom[w.Index].dom.pre] = w
        -		}
        -	}
        -
        -	// The final 'Step 3' is now outside the loop.
        -	for v := buckets[0]; v != root; v = buckets[v.dom.pre] {
        -		v.dom.idom = root
        -	}
        -
        -	// Step 4. Explicitly define the immediate dominator of each
        -	// node, in preorder.
        -	for _, w := range preorder[1:] {
        -		if w == root || w == recover {
        -			w.dom.idom = nil
        -		} else {
        -			if w.dom.idom != lt.sdom[w.Index] {
        -				w.dom.idom = w.dom.idom.dom.idom
        -			}
        -			// Calculate Children relation as inverse of Idom.
        -			w.dom.idom.dom.children = append(w.dom.idom.dom.children, w)
        -		}
        -	}
        -
        -	pre, post := numberDomTree(root, 0, 0)
        -	if recover != nil {
        -		numberDomTree(recover, pre, post)
        -	}
        -
        -	// printDomTreeDot(os.Stderr, f)        // debugging
        -	// printDomTreeText(os.Stderr, root, 0) // debugging
        -
        -	if f.Prog.mode&SanityCheckFunctions != 0 {
        -		sanityCheckDomTree(f)
        -	}
        -}
        -
        -// numberDomTree sets the pre- and post-order numbers of a depth-first
        -// traversal of the dominator tree rooted at v.  These are used to
        -// answer dominance queries in constant time.
        -//
        -func numberDomTree(v *BasicBlock, pre, post int32) (int32, int32) {
        -	v.dom.pre = pre
        -	pre++
        -	for _, child := range v.dom.children {
        -		pre, post = numberDomTree(child, pre, post)
        -	}
        -	v.dom.post = post
        -	post++
        -	return pre, post
        -}
        -
        -// Testing utilities ----------------------------------------
        -
        -// sanityCheckDomTree checks the correctness of the dominator tree
        -// computed by the LT algorithm by comparing against the dominance
        -// relation computed by a naive Kildall-style forward dataflow
        -// analysis (Algorithm 10.16 from the "Dragon" book).
        -//
        -func sanityCheckDomTree(f *Function) {
        -	n := len(f.Blocks)
        -
        -	// D[i] is the set of blocks that dominate f.Blocks[i],
        -	// represented as a bit-set of block indices.
        -	D := make([]big.Int, n)
        -
        -	one := big.NewInt(1)
        -
        -	// all is the set of all blocks; constant.
        -	var all big.Int
        -	all.Set(one).Lsh(&all, uint(n)).Sub(&all, one)
        -
        -	// Initialization.
        -	for i, b := range f.Blocks {
        -		if i == 0 || b == f.Recover {
        -			// A root is dominated only by itself.
        -			D[i].SetBit(&D[0], 0, 1)
        -		} else {
        -			// All other blocks are (initially) dominated
        -			// by every block.
        -			D[i].Set(&all)
        -		}
        -	}
        -
        -	// Iteration until fixed point.
        -	for changed := true; changed; {
        -		changed = false
        -		for i, b := range f.Blocks {
        -			if i == 0 || b == f.Recover {
        -				continue
        -			}
        -			// Compute intersection across predecessors.
        -			var x big.Int
        -			x.Set(&all)
        -			for _, pred := range b.Preds {
        -				x.And(&x, &D[pred.Index])
        -			}
        -			x.SetBit(&x, i, 1) // a block always dominates itself.
        -			if D[i].Cmp(&x) != 0 {
        -				D[i].Set(&x)
        -				changed = true
        -			}
        -		}
        -	}
        -
        -	// Check the entire relation.  O(n^2).
        -	// The Recover block (if any) must be treated specially so we skip it.
        -	ok := true
        -	for i := 0; i < n; i++ {
        -		for j := 0; j < n; j++ {
        -			b, c := f.Blocks[i], f.Blocks[j]
        -			if c == f.Recover {
        -				continue
        -			}
        -			actual := b.Dominates(c)
        -			expected := D[j].Bit(i) == 1
        -			if actual != expected {
        -				fmt.Fprintf(os.Stderr, "dominates(%s, %s)==%t, want %t\n", b, c, actual, expected)
        -				ok = false
        -			}
        -		}
        -	}
        -
        -	preorder := f.DomPreorder()
        -	for _, b := range f.Blocks {
        -		if got := preorder[b.dom.pre]; got != b {
        -			fmt.Fprintf(os.Stderr, "preorder[%d]==%s, want %s\n", b.dom.pre, got, b)
        -			ok = false
        -		}
        -	}
        -
        -	if !ok {
        -		panic("sanityCheckDomTree failed for " + f.String())
        -	}
        -
        -}
        -
        -// Printing functions ----------------------------------------
        -
        -// printDomTree prints the dominator tree as text, using indentation.
        -//lint:ignore U1000 used during debugging
        -func printDomTreeText(buf *bytes.Buffer, v *BasicBlock, indent int) {
        -	fmt.Fprintf(buf, "%*s%s\n", 4*indent, "", v)
        -	for _, child := range v.dom.children {
        -		printDomTreeText(buf, child, indent+1)
        -	}
        -}
        -
        -// printDomTreeDot prints the dominator tree of f in AT&T GraphViz
        -// (.dot) format.
        -//lint:ignore U1000 used during debugging
        -func printDomTreeDot(buf *bytes.Buffer, f *Function) {
        -	fmt.Fprintln(buf, "//", f)
        -	fmt.Fprintln(buf, "digraph domtree {")
        -	for i, b := range f.Blocks {
        -		v := b.dom
        -		fmt.Fprintf(buf, "\tn%d [label=\"%s (%d, %d)\",shape=\"rectangle\"];\n", v.pre, b, v.pre, v.post)
        -		// TODO(adonovan): improve appearance of edges
        -		// belonging to both dominator tree and CFG.
        -
        -		// Dominator tree edge.
        -		if i != 0 {
        -			fmt.Fprintf(buf, "\tn%d -> n%d [style=\"solid\",weight=100];\n", v.idom.dom.pre, v.pre)
        -		}
        -		// CFG edges.
        -		for _, pred := range b.Preds {
        -			fmt.Fprintf(buf, "\tn%d -> n%d [style=\"dotted\",weight=0];\n", pred.dom.pre, v.pre)
        -		}
        -	}
        -	fmt.Fprintln(buf, "}")
        -}
        diff --git a/vendor/honnef.co/go/tools/ssa/emit.go b/vendor/honnef.co/go/tools/ssa/emit.go
        deleted file mode 100644
        index 6bf9ec32d..000000000
        --- a/vendor/honnef.co/go/tools/ssa/emit.go
        +++ /dev/null
        @@ -1,469 +0,0 @@
        -// Copyright 2013 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package ssa
        -
        -// Helpers for emitting SSA instructions.
        -
        -import (
        -	"fmt"
        -	"go/ast"
        -	"go/token"
        -	"go/types"
        -)
        -
        -// emitNew emits to f a new (heap Alloc) instruction allocating an
        -// object of type typ.  pos is the optional source location.
        -//
        -func emitNew(f *Function, typ types.Type, pos token.Pos) *Alloc {
        -	v := &Alloc{Heap: true}
        -	v.setType(types.NewPointer(typ))
        -	v.setPos(pos)
        -	f.emit(v)
        -	return v
        -}
        -
        -// emitLoad emits to f an instruction to load the address addr into a
        -// new temporary, and returns the value so defined.
        -//
        -func emitLoad(f *Function, addr Value) *UnOp {
        -	v := &UnOp{Op: token.MUL, X: addr}
        -	v.setType(deref(addr.Type()))
        -	f.emit(v)
        -	return v
        -}
        -
        -// emitDebugRef emits to f a DebugRef pseudo-instruction associating
        -// expression e with value v.
        -//
        -func emitDebugRef(f *Function, e ast.Expr, v Value, isAddr bool) {
        -	if !f.debugInfo() {
        -		return // debugging not enabled
        -	}
        -	if v == nil || e == nil {
        -		panic("nil")
        -	}
        -	var obj types.Object
        -	e = unparen(e)
        -	if id, ok := e.(*ast.Ident); ok {
        -		if isBlankIdent(id) {
        -			return
        -		}
        -		obj = f.Pkg.objectOf(id)
        -		switch obj.(type) {
        -		case *types.Nil, *types.Const, *types.Builtin:
        -			return
        -		}
        -	}
        -	f.emit(&DebugRef{
        -		X:      v,
        -		Expr:   e,
        -		IsAddr: isAddr,
        -		object: obj,
        -	})
        -}
        -
        -// emitArith emits to f code to compute the binary operation op(x, y)
        -// where op is an eager shift, logical or arithmetic operation.
        -// (Use emitCompare() for comparisons and Builder.logicalBinop() for
        -// non-eager operations.)
        -//
        -func emitArith(f *Function, op token.Token, x, y Value, t types.Type, pos token.Pos) Value {
        -	switch op {
        -	case token.SHL, token.SHR:
        -		x = emitConv(f, x, t)
        -		// y may be signed or an 'untyped' constant.
        -		// TODO(adonovan): whence signed values?
        -		if b, ok := y.Type().Underlying().(*types.Basic); ok && b.Info()&types.IsUnsigned == 0 {
        -			y = emitConv(f, y, types.Typ[types.Uint64])
        -		}
        -
        -	case token.ADD, token.SUB, token.MUL, token.QUO, token.REM, token.AND, token.OR, token.XOR, token.AND_NOT:
        -		x = emitConv(f, x, t)
        -		y = emitConv(f, y, t)
        -
        -	default:
        -		panic("illegal op in emitArith: " + op.String())
        -
        -	}
        -	v := &BinOp{
        -		Op: op,
        -		X:  x,
        -		Y:  y,
        -	}
        -	v.setPos(pos)
        -	v.setType(t)
        -	return f.emit(v)
        -}
        -
        -// emitCompare emits to f code compute the boolean result of
        -// comparison comparison 'x op y'.
        -//
        -func emitCompare(f *Function, op token.Token, x, y Value, pos token.Pos) Value {
        -	xt := x.Type().Underlying()
        -	yt := y.Type().Underlying()
        -
        -	// Special case to optimise a tagless SwitchStmt so that
        -	// these are equivalent
        -	//   switch { case e: ...}
        -	//   switch true { case e: ... }
        -	//   if e==true { ... }
        -	// even in the case when e's type is an interface.
        -	// TODO(adonovan): opt: generalise to x==true, false!=y, etc.
        -	if x == vTrue && op == token.EQL {
        -		if yt, ok := yt.(*types.Basic); ok && yt.Info()&types.IsBoolean != 0 {
        -			return y
        -		}
        -	}
        -
        -	if types.Identical(xt, yt) {
        -		// no conversion necessary
        -	} else if _, ok := xt.(*types.Interface); ok {
        -		y = emitConv(f, y, x.Type())
        -	} else if _, ok := yt.(*types.Interface); ok {
        -		x = emitConv(f, x, y.Type())
        -	} else if _, ok := x.(*Const); ok {
        -		x = emitConv(f, x, y.Type())
        -	} else if _, ok := y.(*Const); ok {
        -		y = emitConv(f, y, x.Type())
        -		//lint:ignore SA9003 no-op
        -	} else {
        -		// other cases, e.g. channels.  No-op.
        -	}
        -
        -	v := &BinOp{
        -		Op: op,
        -		X:  x,
        -		Y:  y,
        -	}
        -	v.setPos(pos)
        -	v.setType(tBool)
        -	return f.emit(v)
        -}
        -
        -// isValuePreserving returns true if a conversion from ut_src to
        -// ut_dst is value-preserving, i.e. just a change of type.
        -// Precondition: neither argument is a named type.
        -//
        -func isValuePreserving(ut_src, ut_dst types.Type) bool {
        -	// Identical underlying types?
        -	if structTypesIdentical(ut_dst, ut_src) {
        -		return true
        -	}
        -
        -	switch ut_dst.(type) {
        -	case *types.Chan:
        -		// Conversion between channel types?
        -		_, ok := ut_src.(*types.Chan)
        -		return ok
        -
        -	case *types.Pointer:
        -		// Conversion between pointers with identical base types?
        -		_, ok := ut_src.(*types.Pointer)
        -		return ok
        -	}
        -	return false
        -}
        -
        -// emitConv emits to f code to convert Value val to exactly type typ,
        -// and returns the converted value.  Implicit conversions are required
        -// by language assignability rules in assignments, parameter passing,
        -// etc.  Conversions cannot fail dynamically.
        -//
        -func emitConv(f *Function, val Value, typ types.Type) Value {
        -	t_src := val.Type()
        -
        -	// Identical types?  Conversion is a no-op.
        -	if types.Identical(t_src, typ) {
        -		return val
        -	}
        -
        -	ut_dst := typ.Underlying()
        -	ut_src := t_src.Underlying()
        -
        -	// Just a change of type, but not value or representation?
        -	if isValuePreserving(ut_src, ut_dst) {
        -		c := &ChangeType{X: val}
        -		c.setType(typ)
        -		return f.emit(c)
        -	}
        -
        -	// Conversion to, or construction of a value of, an interface type?
        -	if _, ok := ut_dst.(*types.Interface); ok {
        -		// Assignment from one interface type to another?
        -		if _, ok := ut_src.(*types.Interface); ok {
        -			c := &ChangeInterface{X: val}
        -			c.setType(typ)
        -			return f.emit(c)
        -		}
        -
        -		// Untyped nil constant?  Return interface-typed nil constant.
        -		if ut_src == tUntypedNil {
        -			return nilConst(typ)
        -		}
        -
        -		// Convert (non-nil) "untyped" literals to their default type.
        -		if t, ok := ut_src.(*types.Basic); ok && t.Info()&types.IsUntyped != 0 {
        -			val = emitConv(f, val, DefaultType(ut_src))
        -		}
        -
        -		f.Pkg.Prog.needMethodsOf(val.Type())
        -		mi := &MakeInterface{X: val}
        -		mi.setType(typ)
        -		return f.emit(mi)
        -	}
        -
        -	// Conversion of a compile-time constant value?
        -	if c, ok := val.(*Const); ok {
        -		if _, ok := ut_dst.(*types.Basic); ok || c.IsNil() {
        -			// Conversion of a compile-time constant to
        -			// another constant type results in a new
        -			// constant of the destination type and
        -			// (initially) the same abstract value.
        -			// We don't truncate the value yet.
        -			return NewConst(c.Value, typ)
        -		}
        -
        -		// We're converting from constant to non-constant type,
        -		// e.g. string -> []byte/[]rune.
        -	}
        -
        -	// A representation-changing conversion?
        -	// At least one of {ut_src,ut_dst} must be *Basic.
        -	// (The other may be []byte or []rune.)
        -	_, ok1 := ut_src.(*types.Basic)
        -	_, ok2 := ut_dst.(*types.Basic)
        -	if ok1 || ok2 {
        -		c := &Convert{X: val}
        -		c.setType(typ)
        -		return f.emit(c)
        -	}
        -
        -	panic(fmt.Sprintf("in %s: cannot convert %s (%s) to %s", f, val, val.Type(), typ))
        -}
        -
        -// emitStore emits to f an instruction to store value val at location
        -// addr, applying implicit conversions as required by assignability rules.
        -//
        -func emitStore(f *Function, addr, val Value, pos token.Pos) *Store {
        -	s := &Store{
        -		Addr: addr,
        -		Val:  emitConv(f, val, deref(addr.Type())),
        -		pos:  pos,
        -	}
        -	f.emit(s)
        -	return s
        -}
        -
        -// emitJump emits to f a jump to target, and updates the control-flow graph.
        -// Postcondition: f.currentBlock is nil.
        -//
        -func emitJump(f *Function, target *BasicBlock) {
        -	b := f.currentBlock
        -	b.emit(new(Jump))
        -	addEdge(b, target)
        -	f.currentBlock = nil
        -}
        -
        -// emitIf emits to f a conditional jump to tblock or fblock based on
        -// cond, and updates the control-flow graph.
        -// Postcondition: f.currentBlock is nil.
        -//
        -func emitIf(f *Function, cond Value, tblock, fblock *BasicBlock) {
        -	b := f.currentBlock
        -	b.emit(&If{Cond: cond})
        -	addEdge(b, tblock)
        -	addEdge(b, fblock)
        -	f.currentBlock = nil
        -}
        -
        -// emitExtract emits to f an instruction to extract the index'th
        -// component of tuple.  It returns the extracted value.
        -//
        -func emitExtract(f *Function, tuple Value, index int) Value {
        -	e := &Extract{Tuple: tuple, Index: index}
        -	e.setType(tuple.Type().(*types.Tuple).At(index).Type())
        -	return f.emit(e)
        -}
        -
        -// emitTypeAssert emits to f a type assertion value := x.(t) and
        -// returns the value.  x.Type() must be an interface.
        -//
        -func emitTypeAssert(f *Function, x Value, t types.Type, pos token.Pos) Value {
        -	a := &TypeAssert{X: x, AssertedType: t}
        -	a.setPos(pos)
        -	a.setType(t)
        -	return f.emit(a)
        -}
        -
        -// emitTypeTest emits to f a type test value,ok := x.(t) and returns
        -// a (value, ok) tuple.  x.Type() must be an interface.
        -//
        -func emitTypeTest(f *Function, x Value, t types.Type, pos token.Pos) Value {
        -	a := &TypeAssert{
        -		X:            x,
        -		AssertedType: t,
        -		CommaOk:      true,
        -	}
        -	a.setPos(pos)
        -	a.setType(types.NewTuple(
        -		newVar("value", t),
        -		varOk,
        -	))
        -	return f.emit(a)
        -}
        -
        -// emitTailCall emits to f a function call in tail position.  The
        -// caller is responsible for all fields of 'call' except its type.
        -// Intended for wrapper methods.
        -// Precondition: f does/will not use deferred procedure calls.
        -// Postcondition: f.currentBlock is nil.
        -//
        -func emitTailCall(f *Function, call *Call) {
        -	tresults := f.Signature.Results()
        -	nr := tresults.Len()
        -	if nr == 1 {
        -		call.typ = tresults.At(0).Type()
        -	} else {
        -		call.typ = tresults
        -	}
        -	tuple := f.emit(call)
        -	var ret Return
        -	switch nr {
        -	case 0:
        -		// no-op
        -	case 1:
        -		ret.Results = []Value{tuple}
        -	default:
        -		for i := 0; i < nr; i++ {
        -			v := emitExtract(f, tuple, i)
        -			// TODO(adonovan): in principle, this is required:
        -			//   v = emitConv(f, o.Type, f.Signature.Results[i].Type)
        -			// but in practice emitTailCall is only used when
        -			// the types exactly match.
        -			ret.Results = append(ret.Results, v)
        -		}
        -	}
        -	f.emit(&ret)
        -	f.currentBlock = nil
        -}
        -
        -// emitImplicitSelections emits to f code to apply the sequence of
        -// implicit field selections specified by indices to base value v, and
        -// returns the selected value.
        -//
        -// If v is the address of a struct, the result will be the address of
        -// a field; if it is the value of a struct, the result will be the
        -// value of a field.
        -//
        -func emitImplicitSelections(f *Function, v Value, indices []int) Value {
        -	for _, index := range indices {
        -		fld := deref(v.Type()).Underlying().(*types.Struct).Field(index)
        -
        -		if isPointer(v.Type()) {
        -			instr := &FieldAddr{
        -				X:     v,
        -				Field: index,
        -			}
        -			instr.setType(types.NewPointer(fld.Type()))
        -			v = f.emit(instr)
        -			// Load the field's value iff indirectly embedded.
        -			if isPointer(fld.Type()) {
        -				v = emitLoad(f, v)
        -			}
        -		} else {
        -			instr := &Field{
        -				X:     v,
        -				Field: index,
        -			}
        -			instr.setType(fld.Type())
        -			v = f.emit(instr)
        -		}
        -	}
        -	return v
        -}
        -
        -// emitFieldSelection emits to f code to select the index'th field of v.
        -//
        -// If wantAddr, the input must be a pointer-to-struct and the result
        -// will be the field's address; otherwise the result will be the
        -// field's value.
        -// Ident id is used for position and debug info.
        -//
        -func emitFieldSelection(f *Function, v Value, index int, wantAddr bool, id *ast.Ident) Value {
        -	fld := deref(v.Type()).Underlying().(*types.Struct).Field(index)
        -	if isPointer(v.Type()) {
        -		instr := &FieldAddr{
        -			X:     v,
        -			Field: index,
        -		}
        -		instr.setPos(id.Pos())
        -		instr.setType(types.NewPointer(fld.Type()))
        -		v = f.emit(instr)
        -		// Load the field's value iff we don't want its address.
        -		if !wantAddr {
        -			v = emitLoad(f, v)
        -		}
        -	} else {
        -		instr := &Field{
        -			X:     v,
        -			Field: index,
        -		}
        -		instr.setPos(id.Pos())
        -		instr.setType(fld.Type())
        -		v = f.emit(instr)
        -	}
        -	emitDebugRef(f, id, v, wantAddr)
        -	return v
        -}
        -
        -// zeroValue emits to f code to produce a zero value of type t,
        -// and returns it.
        -//
        -func zeroValue(f *Function, t types.Type) Value {
        -	switch t.Underlying().(type) {
        -	case *types.Struct, *types.Array:
        -		return emitLoad(f, f.addLocal(t, token.NoPos))
        -	default:
        -		return zeroConst(t)
        -	}
        -}
        -
        -// createRecoverBlock emits to f a block of code to return after a
        -// recovered panic, and sets f.Recover to it.
        -//
        -// If f's result parameters are named, the code loads and returns
        -// their current values, otherwise it returns the zero values of their
        -// type.
        -//
        -// Idempotent.
        -//
        -func createRecoverBlock(f *Function) {
        -	if f.Recover != nil {
        -		return // already created
        -	}
        -	saved := f.currentBlock
        -
        -	f.Recover = f.newBasicBlock("recover")
        -	f.currentBlock = f.Recover
        -
        -	var results []Value
        -	if f.namedResults != nil {
        -		// Reload NRPs to form value tuple.
        -		for _, r := range f.namedResults {
        -			results = append(results, emitLoad(f, r))
        -		}
        -	} else {
        -		R := f.Signature.Results()
        -		for i, n := 0, R.Len(); i < n; i++ {
        -			T := R.At(i).Type()
        -
        -			// Return zero value of each result type.
        -			results = append(results, zeroValue(f, T))
        -		}
        -	}
        -	f.emit(&Return{Results: results})
        -
        -	f.currentBlock = saved
        -}
        diff --git a/vendor/honnef.co/go/tools/ssa/func.go b/vendor/honnef.co/go/tools/ssa/func.go
        deleted file mode 100644
        index 222eea641..000000000
        --- a/vendor/honnef.co/go/tools/ssa/func.go
        +++ /dev/null
        @@ -1,765 +0,0 @@
        -// Copyright 2013 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package ssa
        -
        -// This file implements the Function and BasicBlock types.
        -
        -import (
        -	"bytes"
        -	"fmt"
        -	"go/ast"
        -	"go/token"
        -	"go/types"
        -	"io"
        -	"os"
        -	"strings"
        -)
        -
        -// addEdge adds a control-flow graph edge from from to to.
        -func addEdge(from, to *BasicBlock) {
        -	from.Succs = append(from.Succs, to)
        -	to.Preds = append(to.Preds, from)
        -}
        -
        -// Parent returns the function that contains block b.
        -func (b *BasicBlock) Parent() *Function { return b.parent }
        -
        -// String returns a human-readable label of this block.
        -// It is not guaranteed unique within the function.
        -//
        -func (b *BasicBlock) String() string {
        -	return fmt.Sprintf("%d", b.Index)
        -}
        -
        -// emit appends an instruction to the current basic block.
        -// If the instruction defines a Value, it is returned.
        -//
        -func (b *BasicBlock) emit(i Instruction) Value {
        -	i.setBlock(b)
        -	b.Instrs = append(b.Instrs, i)
        -	v, _ := i.(Value)
        -	return v
        -}
        -
        -// predIndex returns the i such that b.Preds[i] == c or panics if
        -// there is none.
        -func (b *BasicBlock) predIndex(c *BasicBlock) int {
        -	for i, pred := range b.Preds {
        -		if pred == c {
        -			return i
        -		}
        -	}
        -	panic(fmt.Sprintf("no edge %s -> %s", c, b))
        -}
        -
        -// hasPhi returns true if b.Instrs contains φ-nodes.
        -func (b *BasicBlock) hasPhi() bool {
        -	_, ok := b.Instrs[0].(*Phi)
        -	return ok
        -}
        -
        -func (b *BasicBlock) Phis() []Instruction {
        -	return b.phis()
        -}
        -
        -// phis returns the prefix of b.Instrs containing all the block's φ-nodes.
        -func (b *BasicBlock) phis() []Instruction {
        -	for i, instr := range b.Instrs {
        -		if _, ok := instr.(*Phi); !ok {
        -			return b.Instrs[:i]
        -		}
        -	}
        -	return nil // unreachable in well-formed blocks
        -}
        -
        -// replacePred replaces all occurrences of p in b's predecessor list with q.
        -// Ordinarily there should be at most one.
        -//
        -func (b *BasicBlock) replacePred(p, q *BasicBlock) {
        -	for i, pred := range b.Preds {
        -		if pred == p {
        -			b.Preds[i] = q
        -		}
        -	}
        -}
        -
        -// replaceSucc replaces all occurrences of p in b's successor list with q.
        -// Ordinarily there should be at most one.
        -//
        -func (b *BasicBlock) replaceSucc(p, q *BasicBlock) {
        -	for i, succ := range b.Succs {
        -		if succ == p {
        -			b.Succs[i] = q
        -		}
        -	}
        -}
        -
        -func (b *BasicBlock) RemovePred(p *BasicBlock) {
        -	b.removePred(p)
        -}
        -
        -// removePred removes all occurrences of p in b's
        -// predecessor list and φ-nodes.
        -// Ordinarily there should be at most one.
        -//
        -func (b *BasicBlock) removePred(p *BasicBlock) {
        -	phis := b.phis()
        -
        -	// We must preserve edge order for φ-nodes.
        -	j := 0
        -	for i, pred := range b.Preds {
        -		if pred != p {
        -			b.Preds[j] = b.Preds[i]
        -			// Strike out φ-edge too.
        -			for _, instr := range phis {
        -				phi := instr.(*Phi)
        -				phi.Edges[j] = phi.Edges[i]
        -			}
        -			j++
        -		}
        -	}
        -	// Nil out b.Preds[j:] and φ-edges[j:] to aid GC.
        -	for i := j; i < len(b.Preds); i++ {
        -		b.Preds[i] = nil
        -		for _, instr := range phis {
        -			instr.(*Phi).Edges[i] = nil
        -		}
        -	}
        -	b.Preds = b.Preds[:j]
        -	for _, instr := range phis {
        -		phi := instr.(*Phi)
        -		phi.Edges = phi.Edges[:j]
        -	}
        -}
        -
        -// Destinations associated with unlabelled for/switch/select stmts.
        -// We push/pop one of these as we enter/leave each construct and for
        -// each BranchStmt we scan for the innermost target of the right type.
        -//
        -type targets struct {
        -	tail         *targets // rest of stack
        -	_break       *BasicBlock
        -	_continue    *BasicBlock
        -	_fallthrough *BasicBlock
        -}
        -
        -// Destinations associated with a labelled block.
        -// We populate these as labels are encountered in forward gotos or
        -// labelled statements.
        -//
        -type lblock struct {
        -	_goto     *BasicBlock
        -	_break    *BasicBlock
        -	_continue *BasicBlock
        -}
        -
        -// labelledBlock returns the branch target associated with the
        -// specified label, creating it if needed.
        -//
        -func (f *Function) labelledBlock(label *ast.Ident) *lblock {
        -	lb := f.lblocks[label.Obj]
        -	if lb == nil {
        -		lb = &lblock{_goto: f.newBasicBlock(label.Name)}
        -		if f.lblocks == nil {
        -			f.lblocks = make(map[*ast.Object]*lblock)
        -		}
        -		f.lblocks[label.Obj] = lb
        -	}
        -	return lb
        -}
        -
        -// addParam adds a (non-escaping) parameter to f.Params of the
        -// specified name, type and source position.
        -//
        -func (f *Function) addParam(name string, typ types.Type, pos token.Pos) *Parameter {
        -	v := &Parameter{
        -		name:   name,
        -		typ:    typ,
        -		pos:    pos,
        -		parent: f,
        -	}
        -	f.Params = append(f.Params, v)
        -	return v
        -}
        -
        -func (f *Function) addParamObj(obj types.Object) *Parameter {
        -	name := obj.Name()
        -	if name == "" {
        -		name = fmt.Sprintf("arg%d", len(f.Params))
        -	}
        -	param := f.addParam(name, obj.Type(), obj.Pos())
        -	param.object = obj
        -	return param
        -}
        -
        -// addSpilledParam declares a parameter that is pre-spilled to the
        -// stack; the function body will load/store the spilled location.
        -// Subsequent lifting will eliminate spills where possible.
        -//
        -func (f *Function) addSpilledParam(obj types.Object) {
        -	param := f.addParamObj(obj)
        -	spill := &Alloc{Comment: obj.Name()}
        -	spill.setType(types.NewPointer(obj.Type()))
        -	spill.setPos(obj.Pos())
        -	f.objects[obj] = spill
        -	f.Locals = append(f.Locals, spill)
        -	f.emit(spill)
        -	f.emit(&Store{Addr: spill, Val: param})
        -}
        -
        -// startBody initializes the function prior to generating SSA code for its body.
        -// Precondition: f.Type() already set.
        -//
        -func (f *Function) startBody() {
        -	f.currentBlock = f.newBasicBlock("entry")
        -	f.objects = make(map[types.Object]Value) // needed for some synthetics, e.g. init
        -}
        -
        -// createSyntacticParams populates f.Params and generates code (spills
        -// and named result locals) for all the parameters declared in the
        -// syntax.  In addition it populates the f.objects mapping.
        -//
        -// Preconditions:
        -// f.startBody() was called.
        -// Postcondition:
        -// len(f.Params) == len(f.Signature.Params) + (f.Signature.Recv() ? 1 : 0)
        -//
        -func (f *Function) createSyntacticParams(recv *ast.FieldList, functype *ast.FuncType) {
        -	// Receiver (at most one inner iteration).
        -	if recv != nil {
        -		for _, field := range recv.List {
        -			for _, n := range field.Names {
        -				f.addSpilledParam(f.Pkg.info.Defs[n])
        -			}
        -			// Anonymous receiver?  No need to spill.
        -			if field.Names == nil {
        -				f.addParamObj(f.Signature.Recv())
        -			}
        -		}
        -	}
        -
        -	// Parameters.
        -	if functype.Params != nil {
        -		n := len(f.Params) // 1 if has recv, 0 otherwise
        -		for _, field := range functype.Params.List {
        -			for _, n := range field.Names {
        -				f.addSpilledParam(f.Pkg.info.Defs[n])
        -			}
        -			// Anonymous parameter?  No need to spill.
        -			if field.Names == nil {
        -				f.addParamObj(f.Signature.Params().At(len(f.Params) - n))
        -			}
        -		}
        -	}
        -
        -	// Named results.
        -	if functype.Results != nil {
        -		for _, field := range functype.Results.List {
        -			// Implicit "var" decl of locals for named results.
        -			for _, n := range field.Names {
        -				f.namedResults = append(f.namedResults, f.addLocalForIdent(n))
        -			}
        -		}
        -	}
        -}
        -
        -// numberRegisters assigns numbers to all SSA registers
        -// (value-defining Instructions) in f, to aid debugging.
        -// (Non-Instruction Values are named at construction.)
        -//
        -func numberRegisters(f *Function) {
        -	v := 0
        -	for _, b := range f.Blocks {
        -		for _, instr := range b.Instrs {
        -			switch instr.(type) {
        -			case Value:
        -				instr.(interface {
        -					setNum(int)
        -				}).setNum(v)
        -				v++
        -			}
        -		}
        -	}
        -}
        -
        -// buildReferrers populates the def/use information in all non-nil
        -// Value.Referrers slice.
        -// Precondition: all such slices are initially empty.
        -func buildReferrers(f *Function) {
        -	var rands []*Value
        -	for _, b := range f.Blocks {
        -		for _, instr := range b.Instrs {
        -			rands = instr.Operands(rands[:0]) // recycle storage
        -			for _, rand := range rands {
        -				if r := *rand; r != nil {
        -					if ref := r.Referrers(); ref != nil {
        -						*ref = append(*ref, instr)
        -					}
        -				}
        -			}
        -		}
        -	}
        -}
        -
        -// finishBody() finalizes the function after SSA code generation of its body.
        -func (f *Function) finishBody() {
        -	f.objects = nil
        -	f.currentBlock = nil
        -	f.lblocks = nil
        -
        -	// Don't pin the AST in memory (except in debug mode).
        -	if n := f.syntax; n != nil && !f.debugInfo() {
        -		f.syntax = extentNode{n.Pos(), n.End()}
        -	}
        -
        -	// Remove from f.Locals any Allocs that escape to the heap.
        -	j := 0
        -	for _, l := range f.Locals {
        -		if !l.Heap {
        -			f.Locals[j] = l
        -			j++
        -		}
        -	}
        -	// Nil out f.Locals[j:] to aid GC.
        -	for i := j; i < len(f.Locals); i++ {
        -		f.Locals[i] = nil
        -	}
        -	f.Locals = f.Locals[:j]
        -
        -	// comma-ok receiving from a time.Tick channel will never return
        -	// ok == false, so any branching on the value of ok can be
        -	// replaced with an unconditional jump. This will primarily match
        -	// `for range time.Tick(x)` loops, but it can also match
        -	// user-written code.
        -	for _, block := range f.Blocks {
        -		if len(block.Instrs) < 3 {
        -			continue
        -		}
        -		if len(block.Succs) != 2 {
        -			continue
        -		}
        -		var instrs []*Instruction
        -		for i, ins := range block.Instrs {
        -			if _, ok := ins.(*DebugRef); ok {
        -				continue
        -			}
        -			instrs = append(instrs, &block.Instrs[i])
        -		}
        -
        -		for i, ins := range instrs {
        -			unop, ok := (*ins).(*UnOp)
        -			if !ok || unop.Op != token.ARROW {
        -				continue
        -			}
        -			call, ok := unop.X.(*Call)
        -			if !ok {
        -				continue
        -			}
        -			if call.Common().IsInvoke() {
        -				continue
        -			}
        -
        -			// OPT(dh): surely there is a more efficient way of doing
        -			// this, than using FullName. We should already have
        -			// resolved time.Tick somewhere?
        -			v, ok := call.Common().Value.(*Function)
        -			if !ok {
        -				continue
        -			}
        -			t, ok := v.Object().(*types.Func)
        -			if !ok {
        -				continue
        -			}
        -			if t.FullName() != "time.Tick" {
        -				continue
        -			}
        -			ex, ok := (*instrs[i+1]).(*Extract)
        -			if !ok || ex.Tuple != unop || ex.Index != 1 {
        -				continue
        -			}
        -
        -			ifstmt, ok := (*instrs[i+2]).(*If)
        -			if !ok || ifstmt.Cond != ex {
        -				continue
        -			}
        -
        -			*instrs[i+2] = NewJump(block)
        -			succ := block.Succs[1]
        -			block.Succs = block.Succs[0:1]
        -			succ.RemovePred(block)
        -		}
        -	}
        -
        -	optimizeBlocks(f)
        -
        -	buildReferrers(f)
        -
        -	buildDomTree(f)
        -
        -	if f.Prog.mode&NaiveForm == 0 {
        -		// For debugging pre-state of lifting pass:
        -		// numberRegisters(f)
        -		// f.WriteTo(os.Stderr)
        -		lift(f)
        -	}
        -
        -	f.namedResults = nil // (used by lifting)
        -
        -	numberRegisters(f)
        -
        -	if f.Prog.mode&PrintFunctions != 0 {
        -		printMu.Lock()
        -		f.WriteTo(os.Stdout)
        -		printMu.Unlock()
        -	}
        -
        -	if f.Prog.mode&SanityCheckFunctions != 0 {
        -		mustSanityCheck(f, nil)
        -	}
        -}
        -
        -func (f *Function) RemoveNilBlocks() {
        -	f.removeNilBlocks()
        -}
        -
        -// removeNilBlocks eliminates nils from f.Blocks and updates each
        -// BasicBlock.Index.  Use this after any pass that may delete blocks.
        -//
        -func (f *Function) removeNilBlocks() {
        -	j := 0
        -	for _, b := range f.Blocks {
        -		if b != nil {
        -			b.Index = j
        -			f.Blocks[j] = b
        -			j++
        -		}
        -	}
        -	// Nil out f.Blocks[j:] to aid GC.
        -	for i := j; i < len(f.Blocks); i++ {
        -		f.Blocks[i] = nil
        -	}
        -	f.Blocks = f.Blocks[:j]
        -}
        -
        -// SetDebugMode sets the debug mode for package pkg.  If true, all its
        -// functions will include full debug info.  This greatly increases the
        -// size of the instruction stream, and causes Functions to depend upon
        -// the ASTs, potentially keeping them live in memory for longer.
        -//
        -func (pkg *Package) SetDebugMode(debug bool) {
        -	// TODO(adonovan): do we want ast.File granularity?
        -	pkg.debug = debug
        -}
        -
        -// debugInfo reports whether debug info is wanted for this function.
        -func (f *Function) debugInfo() bool {
        -	return f.Pkg != nil && f.Pkg.debug
        -}
        -
        -// addNamedLocal creates a local variable, adds it to function f and
        -// returns it.  Its name and type are taken from obj.  Subsequent
        -// calls to f.lookup(obj) will return the same local.
        -//
        -func (f *Function) addNamedLocal(obj types.Object) *Alloc {
        -	l := f.addLocal(obj.Type(), obj.Pos())
        -	l.Comment = obj.Name()
        -	f.objects[obj] = l
        -	return l
        -}
        -
        -func (f *Function) addLocalForIdent(id *ast.Ident) *Alloc {
        -	return f.addNamedLocal(f.Pkg.info.Defs[id])
        -}
        -
        -// addLocal creates an anonymous local variable of type typ, adds it
        -// to function f and returns it.  pos is the optional source location.
        -//
        -func (f *Function) addLocal(typ types.Type, pos token.Pos) *Alloc {
        -	v := &Alloc{}
        -	v.setType(types.NewPointer(typ))
        -	v.setPos(pos)
        -	f.Locals = append(f.Locals, v)
        -	f.emit(v)
        -	return v
        -}
        -
        -// lookup returns the address of the named variable identified by obj
        -// that is local to function f or one of its enclosing functions.
        -// If escaping, the reference comes from a potentially escaping pointer
        -// expression and the referent must be heap-allocated.
        -//
        -func (f *Function) lookup(obj types.Object, escaping bool) Value {
        -	if v, ok := f.objects[obj]; ok {
        -		if alloc, ok := v.(*Alloc); ok && escaping {
        -			alloc.Heap = true
        -		}
        -		return v // function-local var (address)
        -	}
        -
        -	// Definition must be in an enclosing function;
        -	// plumb it through intervening closures.
        -	if f.parent == nil {
        -		panic("no ssa.Value for " + obj.String())
        -	}
        -	outer := f.parent.lookup(obj, true) // escaping
        -	v := &FreeVar{
        -		name:   obj.Name(),
        -		typ:    outer.Type(),
        -		pos:    outer.Pos(),
        -		outer:  outer,
        -		parent: f,
        -	}
        -	f.objects[obj] = v
        -	f.FreeVars = append(f.FreeVars, v)
        -	return v
        -}
        -
        -// emit emits the specified instruction to function f.
        -func (f *Function) emit(instr Instruction) Value {
        -	return f.currentBlock.emit(instr)
        -}
        -
        -// RelString returns the full name of this function, qualified by
        -// package name, receiver type, etc.
        -//
        -// The specific formatting rules are not guaranteed and may change.
        -//
        -// Examples:
        -//      "math.IsNaN"                  // a package-level function
        -//      "(*bytes.Buffer).Bytes"       // a declared method or a wrapper
        -//      "(*bytes.Buffer).Bytes$thunk" // thunk (func wrapping method; receiver is param 0)
        -//      "(*bytes.Buffer).Bytes$bound" // bound (func wrapping method; receiver supplied by closure)
        -//      "main.main$1"                 // an anonymous function in main
        -//      "main.init#1"                 // a declared init function
        -//      "main.init"                   // the synthesized package initializer
        -//
        -// When these functions are referred to from within the same package
        -// (i.e. from == f.Pkg.Object), they are rendered without the package path.
        -// For example: "IsNaN", "(*Buffer).Bytes", etc.
        -//
        -// All non-synthetic functions have distinct package-qualified names.
        -// (But two methods may have the same name "(T).f" if one is a synthetic
        -// wrapper promoting a non-exported method "f" from another package; in
        -// that case, the strings are equal but the identifiers "f" are distinct.)
        -//
        -func (f *Function) RelString(from *types.Package) string {
        -	// Anonymous?
        -	if f.parent != nil {
        -		// An anonymous function's Name() looks like "parentName$1",
        -		// but its String() should include the type/package/etc.
        -		parent := f.parent.RelString(from)
        -		for i, anon := range f.parent.AnonFuncs {
        -			if anon == f {
        -				return fmt.Sprintf("%s$%d", parent, 1+i)
        -			}
        -		}
        -
        -		return f.name // should never happen
        -	}
        -
        -	// Method (declared or wrapper)?
        -	if recv := f.Signature.Recv(); recv != nil {
        -		return f.relMethod(from, recv.Type())
        -	}
        -
        -	// Thunk?
        -	if f.method != nil {
        -		return f.relMethod(from, f.method.Recv())
        -	}
        -
        -	// Bound?
        -	if len(f.FreeVars) == 1 && strings.HasSuffix(f.name, "$bound") {
        -		return f.relMethod(from, f.FreeVars[0].Type())
        -	}
        -
        -	// Package-level function?
        -	// Prefix with package name for cross-package references only.
        -	if p := f.pkg(); p != nil && p != from {
        -		return fmt.Sprintf("%s.%s", p.Path(), f.name)
        -	}
        -
        -	// Unknown.
        -	return f.name
        -}
        -
        -func (f *Function) relMethod(from *types.Package, recv types.Type) string {
        -	return fmt.Sprintf("(%s).%s", relType(recv, from), f.name)
        -}
        -
        -// writeSignature writes to buf the signature sig in declaration syntax.
        -func writeSignature(buf *bytes.Buffer, from *types.Package, name string, sig *types.Signature, params []*Parameter) {
        -	buf.WriteString("func ")
        -	if recv := sig.Recv(); recv != nil {
        -		buf.WriteString("(")
        -		if n := params[0].Name(); n != "" {
        -			buf.WriteString(n)
        -			buf.WriteString(" ")
        -		}
        -		types.WriteType(buf, params[0].Type(), types.RelativeTo(from))
        -		buf.WriteString(") ")
        -	}
        -	buf.WriteString(name)
        -	types.WriteSignature(buf, sig, types.RelativeTo(from))
        -}
        -
        -func (f *Function) pkg() *types.Package {
        -	if f.Pkg != nil {
        -		return f.Pkg.Pkg
        -	}
        -	return nil
        -}
        -
        -var _ io.WriterTo = (*Function)(nil) // *Function implements io.Writer
        -
        -func (f *Function) WriteTo(w io.Writer) (int64, error) {
        -	var buf bytes.Buffer
        -	WriteFunction(&buf, f)
        -	n, err := w.Write(buf.Bytes())
        -	return int64(n), err
        -}
        -
        -// WriteFunction writes to buf a human-readable "disassembly" of f.
        -func WriteFunction(buf *bytes.Buffer, f *Function) {
        -	fmt.Fprintf(buf, "# Name: %s\n", f.String())
        -	if f.Pkg != nil {
        -		fmt.Fprintf(buf, "# Package: %s\n", f.Pkg.Pkg.Path())
        -	}
        -	if syn := f.Synthetic; syn != "" {
        -		fmt.Fprintln(buf, "# Synthetic:", syn)
        -	}
        -	if pos := f.Pos(); pos.IsValid() {
        -		fmt.Fprintf(buf, "# Location: %s\n", f.Prog.Fset.Position(pos))
        -	}
        -
        -	if f.parent != nil {
        -		fmt.Fprintf(buf, "# Parent: %s\n", f.parent.Name())
        -	}
        -
        -	if f.Recover != nil {
        -		fmt.Fprintf(buf, "# Recover: %s\n", f.Recover)
        -	}
        -
        -	from := f.pkg()
        -
        -	if f.FreeVars != nil {
        -		buf.WriteString("# Free variables:\n")
        -		for i, fv := range f.FreeVars {
        -			fmt.Fprintf(buf, "# % 3d:\t%s %s\n", i, fv.Name(), relType(fv.Type(), from))
        -		}
        -	}
        -
        -	if len(f.Locals) > 0 {
        -		buf.WriteString("# Locals:\n")
        -		for i, l := range f.Locals {
        -			fmt.Fprintf(buf, "# % 3d:\t%s %s\n", i, l.Name(), relType(deref(l.Type()), from))
        -		}
        -	}
        -	writeSignature(buf, from, f.Name(), f.Signature, f.Params)
        -	buf.WriteString(":\n")
        -
        -	if f.Blocks == nil {
        -		buf.WriteString("\t(external)\n")
        -	}
        -
        -	// NB. column calculations are confused by non-ASCII
        -	// characters and assume 8-space tabs.
        -	const punchcard = 80 // for old time's sake.
        -	const tabwidth = 8
        -	for _, b := range f.Blocks {
        -		if b == nil {
        -			// Corrupt CFG.
        -			fmt.Fprintf(buf, ".nil:\n")
        -			continue
        -		}
        -		n, _ := fmt.Fprintf(buf, "%d:", b.Index)
        -		bmsg := fmt.Sprintf("%s P:%d S:%d", b.Comment, len(b.Preds), len(b.Succs))
        -		fmt.Fprintf(buf, "%*s%s\n", punchcard-1-n-len(bmsg), "", bmsg)
        -
        -		if false { // CFG debugging
        -			fmt.Fprintf(buf, "\t# CFG: %s --> %s --> %s\n", b.Preds, b, b.Succs)
        -		}
        -		for _, instr := range b.Instrs {
        -			buf.WriteString("\t")
        -			switch v := instr.(type) {
        -			case Value:
        -				l := punchcard - tabwidth
        -				// Left-align the instruction.
        -				if name := v.Name(); name != "" {
        -					n, _ := fmt.Fprintf(buf, "%s = ", name)
        -					l -= n
        -				}
        -				n, _ := buf.WriteString(instr.String())
        -				l -= n
        -				// Right-align the type if there's space.
        -				if t := v.Type(); t != nil {
        -					buf.WriteByte(' ')
        -					ts := relType(t, from)
        -					l -= len(ts) + len("  ") // (spaces before and after type)
        -					if l > 0 {
        -						fmt.Fprintf(buf, "%*s", l, "")
        -					}
        -					buf.WriteString(ts)
        -				}
        -			case nil:
        -				// Be robust against bad transforms.
        -				buf.WriteString("")
        -			default:
        -				buf.WriteString(instr.String())
        -			}
        -			buf.WriteString("\n")
        -		}
        -	}
        -	fmt.Fprintf(buf, "\n")
        -}
        -
        -// newBasicBlock adds to f a new basic block and returns it.  It does
        -// not automatically become the current block for subsequent calls to emit.
        -// comment is an optional string for more readable debugging output.
        -//
        -func (f *Function) newBasicBlock(comment string) *BasicBlock {
        -	b := &BasicBlock{
        -		Index:   len(f.Blocks),
        -		Comment: comment,
        -		parent:  f,
        -	}
        -	b.Succs = b.succs2[:0]
        -	f.Blocks = append(f.Blocks, b)
        -	return b
        -}
        -
        -// NewFunction returns a new synthetic Function instance belonging to
        -// prog, with its name and signature fields set as specified.
        -//
        -// The caller is responsible for initializing the remaining fields of
        -// the function object, e.g. Pkg, Params, Blocks.
        -//
        -// It is practically impossible for clients to construct well-formed
        -// SSA functions/packages/programs directly, so we assume this is the
        -// job of the Builder alone.  NewFunction exists to provide clients a
        -// little flexibility.  For example, analysis tools may wish to
        -// construct fake Functions for the root of the callgraph, a fake
        -// "reflect" package, etc.
        -//
        -// TODO(adonovan): think harder about the API here.
        -//
        -func (prog *Program) NewFunction(name string, sig *types.Signature, provenance string) *Function {
        -	return &Function{Prog: prog, name: name, Signature: sig, Synthetic: provenance}
        -}
        -
        -type extentNode [2]token.Pos
        -
        -func (n extentNode) Pos() token.Pos { return n[0] }
        -func (n extentNode) End() token.Pos { return n[1] }
        -
        -// Syntax returns an ast.Node whose Pos/End methods provide the
        -// lexical extent of the function if it was defined by Go source code
        -// (f.Synthetic==""), or nil otherwise.
        -//
        -// If f was built with debug information (see Package.SetDebugRef),
        -// the result is the *ast.FuncDecl or *ast.FuncLit that declared the
        -// function.  Otherwise, it is an opaque Node providing only position
        -// information; this avoids pinning the AST in memory.
        -//
        -func (f *Function) Syntax() ast.Node { return f.syntax }
        diff --git a/vendor/honnef.co/go/tools/ssa/identical.go b/vendor/honnef.co/go/tools/ssa/identical.go
        deleted file mode 100644
        index 53cbee107..000000000
        --- a/vendor/honnef.co/go/tools/ssa/identical.go
        +++ /dev/null
        @@ -1,7 +0,0 @@
        -// +build go1.8
        -
        -package ssa
        -
        -import "go/types"
        -
        -var structTypesIdentical = types.IdenticalIgnoreTags
        diff --git a/vendor/honnef.co/go/tools/ssa/identical_17.go b/vendor/honnef.co/go/tools/ssa/identical_17.go
        deleted file mode 100644
        index da89d3339..000000000
        --- a/vendor/honnef.co/go/tools/ssa/identical_17.go
        +++ /dev/null
        @@ -1,7 +0,0 @@
        -// +build !go1.8
        -
        -package ssa
        -
        -import "go/types"
        -
        -var structTypesIdentical = types.Identical
        diff --git a/vendor/honnef.co/go/tools/ssa/lift.go b/vendor/honnef.co/go/tools/ssa/lift.go
        deleted file mode 100644
        index 531358fa3..000000000
        --- a/vendor/honnef.co/go/tools/ssa/lift.go
        +++ /dev/null
        @@ -1,657 +0,0 @@
        -// Copyright 2013 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package ssa
        -
        -// This file defines the lifting pass which tries to "lift" Alloc
        -// cells (new/local variables) into SSA registers, replacing loads
        -// with the dominating stored value, eliminating loads and stores, and
        -// inserting φ-nodes as needed.
        -
        -// Cited papers and resources:
        -//
        -// Ron Cytron et al. 1991. Efficiently computing SSA form...
        -// http://doi.acm.org/10.1145/115372.115320
        -//
        -// Cooper, Harvey, Kennedy.  2001.  A Simple, Fast Dominance Algorithm.
        -// Software Practice and Experience 2001, 4:1-10.
        -// http://www.hipersoft.rice.edu/grads/publications/dom14.pdf
        -//
        -// Daniel Berlin, llvmdev mailing list, 2012.
        -// http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-January/046638.html
        -// (Be sure to expand the whole thread.)
        -
        -// TODO(adonovan): opt: there are many optimizations worth evaluating, and
        -// the conventional wisdom for SSA construction is that a simple
        -// algorithm well engineered often beats those of better asymptotic
        -// complexity on all but the most egregious inputs.
        -//
        -// Danny Berlin suggests that the Cooper et al. algorithm for
        -// computing the dominance frontier is superior to Cytron et al.
        -// Furthermore he recommends that rather than computing the DF for the
        -// whole function then renaming all alloc cells, it may be cheaper to
        -// compute the DF for each alloc cell separately and throw it away.
        -//
        -// Consider exploiting liveness information to avoid creating dead
        -// φ-nodes which we then immediately remove.
        -//
        -// Also see many other "TODO: opt" suggestions in the code.
        -
        -import (
        -	"fmt"
        -	"go/token"
        -	"go/types"
        -	"math/big"
        -	"os"
        -)
        -
        -// If true, show diagnostic information at each step of lifting.
        -// Very verbose.
        -const debugLifting = false
        -
        -// domFrontier maps each block to the set of blocks in its dominance
        -// frontier.  The outer slice is conceptually a map keyed by
        -// Block.Index.  The inner slice is conceptually a set, possibly
        -// containing duplicates.
        -//
        -// TODO(adonovan): opt: measure impact of dups; consider a packed bit
        -// representation, e.g. big.Int, and bitwise parallel operations for
        -// the union step in the Children loop.
        -//
        -// domFrontier's methods mutate the slice's elements but not its
        -// length, so their receivers needn't be pointers.
        -//
        -type domFrontier [][]*BasicBlock
        -
        -func (df domFrontier) add(u, v *BasicBlock) {
        -	p := &df[u.Index]
        -	*p = append(*p, v)
        -}
        -
        -// build builds the dominance frontier df for the dominator (sub)tree
        -// rooted at u, using the Cytron et al. algorithm.
        -//
        -// TODO(adonovan): opt: consider Berlin approach, computing pruned SSA
        -// by pruning the entire IDF computation, rather than merely pruning
        -// the DF -> IDF step.
        -func (df domFrontier) build(u *BasicBlock) {
        -	// Encounter each node u in postorder of dom tree.
        -	for _, child := range u.dom.children {
        -		df.build(child)
        -	}
        -	for _, vb := range u.Succs {
        -		if v := vb.dom; v.idom != u {
        -			df.add(u, vb)
        -		}
        -	}
        -	for _, w := range u.dom.children {
        -		for _, vb := range df[w.Index] {
        -			// TODO(adonovan): opt: use word-parallel bitwise union.
        -			if v := vb.dom; v.idom != u {
        -				df.add(u, vb)
        -			}
        -		}
        -	}
        -}
        -
        -func buildDomFrontier(fn *Function) domFrontier {
        -	df := make(domFrontier, len(fn.Blocks))
        -	df.build(fn.Blocks[0])
        -	if fn.Recover != nil {
        -		df.build(fn.Recover)
        -	}
        -	return df
        -}
        -
        -func removeInstr(refs []Instruction, instr Instruction) []Instruction {
        -	i := 0
        -	for _, ref := range refs {
        -		if ref == instr {
        -			continue
        -		}
        -		refs[i] = ref
        -		i++
        -	}
        -	for j := i; j != len(refs); j++ {
        -		refs[j] = nil // aid GC
        -	}
        -	return refs[:i]
        -}
        -
        -// lift replaces local and new Allocs accessed only with
        -// load/store by SSA registers, inserting φ-nodes where necessary.
        -// The result is a program in classical pruned SSA form.
        -//
        -// Preconditions:
        -// - fn has no dead blocks (blockopt has run).
        -// - Def/use info (Operands and Referrers) is up-to-date.
        -// - The dominator tree is up-to-date.
        -//
        -func lift(fn *Function) {
        -	// TODO(adonovan): opt: lots of little optimizations may be
        -	// worthwhile here, especially if they cause us to avoid
        -	// buildDomFrontier.  For example:
        -	//
        -	// - Alloc never loaded?  Eliminate.
        -	// - Alloc never stored?  Replace all loads with a zero constant.
        -	// - Alloc stored once?  Replace loads with dominating store;
        -	//   don't forget that an Alloc is itself an effective store
        -	//   of zero.
        -	// - Alloc used only within a single block?
        -	//   Use degenerate algorithm avoiding φ-nodes.
        -	// - Consider synergy with scalar replacement of aggregates (SRA).
        -	//   e.g. *(&x.f) where x is an Alloc.
        -	//   Perhaps we'd get better results if we generated this as x.f
        -	//   i.e. Field(x, .f) instead of Load(FieldIndex(x, .f)).
        -	//   Unclear.
        -	//
        -	// But we will start with the simplest correct code.
        -	df := buildDomFrontier(fn)
        -
        -	if debugLifting {
        -		title := false
        -		for i, blocks := range df {
        -			if blocks != nil {
        -				if !title {
        -					fmt.Fprintf(os.Stderr, "Dominance frontier of %s:\n", fn)
        -					title = true
        -				}
        -				fmt.Fprintf(os.Stderr, "\t%s: %s\n", fn.Blocks[i], blocks)
        -			}
        -		}
        -	}
        -
        -	newPhis := make(newPhiMap)
        -
        -	// During this pass we will replace some BasicBlock.Instrs
        -	// (allocs, loads and stores) with nil, keeping a count in
        -	// BasicBlock.gaps.  At the end we will reset Instrs to the
        -	// concatenation of all non-dead newPhis and non-nil Instrs
        -	// for the block, reusing the original array if space permits.
        -
        -	// While we're here, we also eliminate 'rundefers'
        -	// instructions in functions that contain no 'defer'
        -	// instructions.
        -	usesDefer := false
        -
        -	// A counter used to generate ~unique ids for Phi nodes, as an
        -	// aid to debugging.  We use large numbers to make them highly
        -	// visible.  All nodes are renumbered later.
        -	fresh := 1000
        -
        -	// Determine which allocs we can lift and number them densely.
        -	// The renaming phase uses this numbering for compact maps.
        -	numAllocs := 0
        -	for _, b := range fn.Blocks {
        -		b.gaps = 0
        -		b.rundefers = 0
        -		for _, instr := range b.Instrs {
        -			switch instr := instr.(type) {
        -			case *Alloc:
        -				index := -1
        -				if liftAlloc(df, instr, newPhis, &fresh) {
        -					index = numAllocs
        -					numAllocs++
        -				}
        -				instr.index = index
        -			case *Defer:
        -				usesDefer = true
        -			case *RunDefers:
        -				b.rundefers++
        -			}
        -		}
        -	}
        -
        -	// renaming maps an alloc (keyed by index) to its replacement
        -	// value.  Initially the renaming contains nil, signifying the
        -	// zero constant of the appropriate type; we construct the
        -	// Const lazily at most once on each path through the domtree.
        -	// TODO(adonovan): opt: cache per-function not per subtree.
        -	renaming := make([]Value, numAllocs)
        -
        -	// Renaming.
        -	rename(fn.Blocks[0], renaming, newPhis)
        -
        -	// Eliminate dead φ-nodes.
        -	removeDeadPhis(fn.Blocks, newPhis)
        -
        -	// Prepend remaining live φ-nodes to each block.
        -	for _, b := range fn.Blocks {
        -		nps := newPhis[b]
        -		j := len(nps)
        -
        -		rundefersToKill := b.rundefers
        -		if usesDefer {
        -			rundefersToKill = 0
        -		}
        -
        -		if j+b.gaps+rundefersToKill == 0 {
        -			continue // fast path: no new phis or gaps
        -		}
        -
        -		// Compact nps + non-nil Instrs into a new slice.
        -		// TODO(adonovan): opt: compact in situ (rightwards)
        -		// if Instrs has sufficient space or slack.
        -		dst := make([]Instruction, len(b.Instrs)+j-b.gaps-rundefersToKill)
        -		for i, np := range nps {
        -			dst[i] = np.phi
        -		}
        -		for _, instr := range b.Instrs {
        -			if instr == nil {
        -				continue
        -			}
        -			if !usesDefer {
        -				if _, ok := instr.(*RunDefers); ok {
        -					continue
        -				}
        -			}
        -			dst[j] = instr
        -			j++
        -		}
        -		b.Instrs = dst
        -	}
        -
        -	// Remove any fn.Locals that were lifted.
        -	j := 0
        -	for _, l := range fn.Locals {
        -		if l.index < 0 {
        -			fn.Locals[j] = l
        -			j++
        -		}
        -	}
        -	// Nil out fn.Locals[j:] to aid GC.
        -	for i := j; i < len(fn.Locals); i++ {
        -		fn.Locals[i] = nil
        -	}
        -	fn.Locals = fn.Locals[:j]
        -}
        -
        -// removeDeadPhis removes φ-nodes not transitively needed by a
        -// non-Phi, non-DebugRef instruction.
        -func removeDeadPhis(blocks []*BasicBlock, newPhis newPhiMap) {
        -	// First pass: find the set of "live" φ-nodes: those reachable
        -	// from some non-Phi instruction.
        -	//
        -	// We compute reachability in reverse, starting from each φ,
        -	// rather than forwards, starting from each live non-Phi
        -	// instruction, because this way visits much less of the
        -	// Value graph.
        -	livePhis := make(map[*Phi]bool)
        -	for _, npList := range newPhis {
        -		for _, np := range npList {
        -			phi := np.phi
        -			if !livePhis[phi] && phiHasDirectReferrer(phi) {
        -				markLivePhi(livePhis, phi)
        -			}
        -		}
        -	}
        -
        -	// Existing φ-nodes due to && and || operators
        -	// are all considered live (see Go issue 19622).
        -	for _, b := range blocks {
        -		for _, phi := range b.phis() {
        -			markLivePhi(livePhis, phi.(*Phi))
        -		}
        -	}
        -
        -	// Second pass: eliminate unused phis from newPhis.
        -	for block, npList := range newPhis {
        -		j := 0
        -		for _, np := range npList {
        -			if livePhis[np.phi] {
        -				npList[j] = np
        -				j++
        -			} else {
        -				// discard it, first removing it from referrers
        -				for _, val := range np.phi.Edges {
        -					if refs := val.Referrers(); refs != nil {
        -						*refs = removeInstr(*refs, np.phi)
        -					}
        -				}
        -				np.phi.block = nil
        -			}
        -		}
        -		newPhis[block] = npList[:j]
        -	}
        -}
        -
        -// markLivePhi marks phi, and all φ-nodes transitively reachable via
        -// its Operands, live.
        -func markLivePhi(livePhis map[*Phi]bool, phi *Phi) {
        -	livePhis[phi] = true
        -	for _, rand := range phi.Operands(nil) {
        -		if q, ok := (*rand).(*Phi); ok {
        -			if !livePhis[q] {
        -				markLivePhi(livePhis, q)
        -			}
        -		}
        -	}
        -}
        -
        -// phiHasDirectReferrer reports whether phi is directly referred to by
        -// a non-Phi instruction.  Such instructions are the
        -// roots of the liveness traversal.
        -func phiHasDirectReferrer(phi *Phi) bool {
        -	for _, instr := range *phi.Referrers() {
        -		if _, ok := instr.(*Phi); !ok {
        -			return true
        -		}
        -	}
        -	return false
        -}
        -
        -type BlockSet struct{ big.Int } // (inherit methods from Int)
        -
        -// add adds b to the set and returns true if the set changed.
        -func (s *BlockSet) Add(b *BasicBlock) bool {
        -	i := b.Index
        -	if s.Bit(i) != 0 {
        -		return false
        -	}
        -	s.SetBit(&s.Int, i, 1)
        -	return true
        -}
        -
        -func (s *BlockSet) Has(b *BasicBlock) bool {
        -	return s.Bit(b.Index) == 1
        -}
        -
        -// take removes an arbitrary element from a set s and
        -// returns its index, or returns -1 if empty.
        -func (s *BlockSet) Take() int {
        -	l := s.BitLen()
        -	for i := 0; i < l; i++ {
        -		if s.Bit(i) == 1 {
        -			s.SetBit(&s.Int, i, 0)
        -			return i
        -		}
        -	}
        -	return -1
        -}
        -
        -// newPhi is a pair of a newly introduced φ-node and the lifted Alloc
        -// it replaces.
        -type newPhi struct {
        -	phi   *Phi
        -	alloc *Alloc
        -}
        -
        -// newPhiMap records for each basic block, the set of newPhis that
        -// must be prepended to the block.
        -type newPhiMap map[*BasicBlock][]newPhi
        -
        -// liftAlloc determines whether alloc can be lifted into registers,
        -// and if so, it populates newPhis with all the φ-nodes it may require
        -// and returns true.
        -//
        -// fresh is a source of fresh ids for phi nodes.
        -//
        -func liftAlloc(df domFrontier, alloc *Alloc, newPhis newPhiMap, fresh *int) bool {
        -	// Don't lift aggregates into registers, because we don't have
        -	// a way to express their zero-constants.
        -	switch deref(alloc.Type()).Underlying().(type) {
        -	case *types.Array, *types.Struct:
        -		return false
        -	}
        -
        -	// Don't lift named return values in functions that defer
        -	// calls that may recover from panic.
        -	if fn := alloc.Parent(); fn.Recover != nil {
        -		for _, nr := range fn.namedResults {
        -			if nr == alloc {
        -				return false
        -			}
        -		}
        -	}
        -
        -	// Compute defblocks, the set of blocks containing a
        -	// definition of the alloc cell.
        -	var defblocks BlockSet
        -	for _, instr := range *alloc.Referrers() {
        -		// Bail out if we discover the alloc is not liftable;
        -		// the only operations permitted to use the alloc are
        -		// loads/stores into the cell, and DebugRef.
        -		switch instr := instr.(type) {
        -		case *Store:
        -			if instr.Val == alloc {
        -				return false // address used as value
        -			}
        -			if instr.Addr != alloc {
        -				panic("Alloc.Referrers is inconsistent")
        -			}
        -			defblocks.Add(instr.Block())
        -		case *UnOp:
        -			if instr.Op != token.MUL {
        -				return false // not a load
        -			}
        -			if instr.X != alloc {
        -				panic("Alloc.Referrers is inconsistent")
        -			}
        -		case *DebugRef:
        -			// ok
        -		default:
        -			return false // some other instruction
        -		}
        -	}
        -	// The Alloc itself counts as a (zero) definition of the cell.
        -	defblocks.Add(alloc.Block())
        -
        -	if debugLifting {
        -		fmt.Fprintln(os.Stderr, "\tlifting ", alloc, alloc.Name())
        -	}
        -
        -	fn := alloc.Parent()
        -
        -	// Φ-insertion.
        -	//
        -	// What follows is the body of the main loop of the insert-φ
        -	// function described by Cytron et al, but instead of using
        -	// counter tricks, we just reset the 'hasAlready' and 'work'
        -	// sets each iteration.  These are bitmaps so it's pretty cheap.
        -	//
        -	// TODO(adonovan): opt: recycle slice storage for W,
        -	// hasAlready, defBlocks across liftAlloc calls.
        -	var hasAlready BlockSet
        -
        -	// Initialize W and work to defblocks.
        -	var work BlockSet = defblocks // blocks seen
        -	var W BlockSet                // blocks to do
        -	W.Set(&defblocks.Int)
        -
        -	// Traverse iterated dominance frontier, inserting φ-nodes.
        -	for i := W.Take(); i != -1; i = W.Take() {
        -		u := fn.Blocks[i]
        -		for _, v := range df[u.Index] {
        -			if hasAlready.Add(v) {
        -				// Create φ-node.
        -				// It will be prepended to v.Instrs later, if needed.
        -				phi := &Phi{
        -					Edges:   make([]Value, len(v.Preds)),
        -					Comment: alloc.Comment,
        -				}
        -				// This is merely a debugging aid:
        -				phi.setNum(*fresh)
        -				*fresh++
        -
        -				phi.pos = alloc.Pos()
        -				phi.setType(deref(alloc.Type()))
        -				phi.block = v
        -				if debugLifting {
        -					fmt.Fprintf(os.Stderr, "\tplace %s = %s at block %s\n", phi.Name(), phi, v)
        -				}
        -				newPhis[v] = append(newPhis[v], newPhi{phi, alloc})
        -
        -				if work.Add(v) {
        -					W.Add(v)
        -				}
        -			}
        -		}
        -	}
        -
        -	return true
        -}
        -
        -// replaceAll replaces all intraprocedural uses of x with y,
        -// updating x.Referrers and y.Referrers.
        -// Precondition: x.Referrers() != nil, i.e. x must be local to some function.
        -//
        -func replaceAll(x, y Value) {
        -	var rands []*Value
        -	pxrefs := x.Referrers()
        -	pyrefs := y.Referrers()
        -	for _, instr := range *pxrefs {
        -		rands = instr.Operands(rands[:0]) // recycle storage
        -		for _, rand := range rands {
        -			if *rand != nil {
        -				if *rand == x {
        -					*rand = y
        -				}
        -			}
        -		}
        -		if pyrefs != nil {
        -			*pyrefs = append(*pyrefs, instr) // dups ok
        -		}
        -	}
        -	*pxrefs = nil // x is now unreferenced
        -}
        -
        -// renamed returns the value to which alloc is being renamed,
        -// constructing it lazily if it's the implicit zero initialization.
        -//
        -func renamed(renaming []Value, alloc *Alloc) Value {
        -	v := renaming[alloc.index]
        -	if v == nil {
        -		v = zeroConst(deref(alloc.Type()))
        -		renaming[alloc.index] = v
        -	}
        -	return v
        -}
        -
        -// rename implements the (Cytron et al) SSA renaming algorithm, a
        -// preorder traversal of the dominator tree replacing all loads of
        -// Alloc cells with the value stored to that cell by the dominating
        -// store instruction.  For lifting, we need only consider loads,
        -// stores and φ-nodes.
        -//
        -// renaming is a map from *Alloc (keyed by index number) to its
        -// dominating stored value; newPhis[x] is the set of new φ-nodes to be
        -// prepended to block x.
        -//
        -func rename(u *BasicBlock, renaming []Value, newPhis newPhiMap) {
        -	// Each φ-node becomes the new name for its associated Alloc.
        -	for _, np := range newPhis[u] {
        -		phi := np.phi
        -		alloc := np.alloc
        -		renaming[alloc.index] = phi
        -	}
        -
        -	// Rename loads and stores of allocs.
        -	for i, instr := range u.Instrs {
        -		switch instr := instr.(type) {
        -		case *Alloc:
        -			if instr.index >= 0 { // store of zero to Alloc cell
        -				// Replace dominated loads by the zero value.
        -				renaming[instr.index] = nil
        -				if debugLifting {
        -					fmt.Fprintf(os.Stderr, "\tkill alloc %s\n", instr)
        -				}
        -				// Delete the Alloc.
        -				u.Instrs[i] = nil
        -				u.gaps++
        -			}
        -
        -		case *Store:
        -			if alloc, ok := instr.Addr.(*Alloc); ok && alloc.index >= 0 { // store to Alloc cell
        -				// Replace dominated loads by the stored value.
        -				renaming[alloc.index] = instr.Val
        -				if debugLifting {
        -					fmt.Fprintf(os.Stderr, "\tkill store %s; new value: %s\n",
        -						instr, instr.Val.Name())
        -				}
        -				// Remove the store from the referrer list of the stored value.
        -				if refs := instr.Val.Referrers(); refs != nil {
        -					*refs = removeInstr(*refs, instr)
        -				}
        -				// Delete the Store.
        -				u.Instrs[i] = nil
        -				u.gaps++
        -			}
        -
        -		case *UnOp:
        -			if instr.Op == token.MUL {
        -				if alloc, ok := instr.X.(*Alloc); ok && alloc.index >= 0 { // load of Alloc cell
        -					newval := renamed(renaming, alloc)
        -					if debugLifting {
        -						fmt.Fprintf(os.Stderr, "\tupdate load %s = %s with %s\n",
        -							instr.Name(), instr, newval.Name())
        -					}
        -					// Replace all references to
        -					// the loaded value by the
        -					// dominating stored value.
        -					replaceAll(instr, newval)
        -					// Delete the Load.
        -					u.Instrs[i] = nil
        -					u.gaps++
        -				}
        -			}
        -
        -		case *DebugRef:
        -			if alloc, ok := instr.X.(*Alloc); ok && alloc.index >= 0 { // ref of Alloc cell
        -				if instr.IsAddr {
        -					instr.X = renamed(renaming, alloc)
        -					instr.IsAddr = false
        -
        -					// Add DebugRef to instr.X's referrers.
        -					if refs := instr.X.Referrers(); refs != nil {
        -						*refs = append(*refs, instr)
        -					}
        -				} else {
        -					// A source expression denotes the address
        -					// of an Alloc that was optimized away.
        -					instr.X = nil
        -
        -					// Delete the DebugRef.
        -					u.Instrs[i] = nil
        -					u.gaps++
        -				}
        -			}
        -		}
        -	}
        -
        -	// For each φ-node in a CFG successor, rename the edge.
        -	for _, v := range u.Succs {
        -		phis := newPhis[v]
        -		if len(phis) == 0 {
        -			continue
        -		}
        -		i := v.predIndex(u)
        -		for _, np := range phis {
        -			phi := np.phi
        -			alloc := np.alloc
        -			newval := renamed(renaming, alloc)
        -			if debugLifting {
        -				fmt.Fprintf(os.Stderr, "\tsetphi %s edge %s -> %s (#%d) (alloc=%s) := %s\n",
        -					phi.Name(), u, v, i, alloc.Name(), newval.Name())
        -			}
        -			phi.Edges[i] = newval
        -			if prefs := newval.Referrers(); prefs != nil {
        -				*prefs = append(*prefs, phi)
        -			}
        -		}
        -	}
        -
        -	// Continue depth-first recursion over domtree, pushing a
        -	// fresh copy of the renaming map for each subtree.
        -	for i, v := range u.dom.children {
        -		r := renaming
        -		if i < len(u.dom.children)-1 {
        -			// On all but the final iteration, we must make
        -			// a copy to avoid destructive update.
        -			r = make([]Value, len(renaming))
        -			copy(r, renaming)
        -		}
        -		rename(v, r, newPhis)
        -	}
        -
        -}
        diff --git a/vendor/honnef.co/go/tools/ssa/lvalue.go b/vendor/honnef.co/go/tools/ssa/lvalue.go
        deleted file mode 100644
        index eb5d71e18..000000000
        --- a/vendor/honnef.co/go/tools/ssa/lvalue.go
        +++ /dev/null
        @@ -1,123 +0,0 @@
        -// Copyright 2013 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package ssa
        -
        -// lvalues are the union of addressable expressions and map-index
        -// expressions.
        -
        -import (
        -	"go/ast"
        -	"go/token"
        -	"go/types"
        -)
        -
        -// An lvalue represents an assignable location that may appear on the
        -// left-hand side of an assignment.  This is a generalization of a
        -// pointer to permit updates to elements of maps.
        -//
        -type lvalue interface {
        -	store(fn *Function, v Value) // stores v into the location
        -	load(fn *Function) Value     // loads the contents of the location
        -	address(fn *Function) Value  // address of the location
        -	typ() types.Type             // returns the type of the location
        -}
        -
        -// An address is an lvalue represented by a true pointer.
        -type address struct {
        -	addr Value
        -	pos  token.Pos // source position
        -	expr ast.Expr  // source syntax of the value (not address) [debug mode]
        -}
        -
        -func (a *address) load(fn *Function) Value {
        -	load := emitLoad(fn, a.addr)
        -	load.pos = a.pos
        -	return load
        -}
        -
        -func (a *address) store(fn *Function, v Value) {
        -	store := emitStore(fn, a.addr, v, a.pos)
        -	if a.expr != nil {
        -		// store.Val is v, converted for assignability.
        -		emitDebugRef(fn, a.expr, store.Val, false)
        -	}
        -}
        -
        -func (a *address) address(fn *Function) Value {
        -	if a.expr != nil {
        -		emitDebugRef(fn, a.expr, a.addr, true)
        -	}
        -	return a.addr
        -}
        -
        -func (a *address) typ() types.Type {
        -	return deref(a.addr.Type())
        -}
        -
        -// An element is an lvalue represented by m[k], the location of an
        -// element of a map or string.  These locations are not addressable
        -// since pointers cannot be formed from them, but they do support
        -// load(), and in the case of maps, store().
        -//
        -type element struct {
        -	m, k Value      // map or string
        -	t    types.Type // map element type or string byte type
        -	pos  token.Pos  // source position of colon ({k:v}) or lbrack (m[k]=v)
        -}
        -
        -func (e *element) load(fn *Function) Value {
        -	l := &Lookup{
        -		X:     e.m,
        -		Index: e.k,
        -	}
        -	l.setPos(e.pos)
        -	l.setType(e.t)
        -	return fn.emit(l)
        -}
        -
        -func (e *element) store(fn *Function, v Value) {
        -	up := &MapUpdate{
        -		Map:   e.m,
        -		Key:   e.k,
        -		Value: emitConv(fn, v, e.t),
        -	}
        -	up.pos = e.pos
        -	fn.emit(up)
        -}
        -
        -func (e *element) address(fn *Function) Value {
        -	panic("map/string elements are not addressable")
        -}
        -
        -func (e *element) typ() types.Type {
        -	return e.t
        -}
        -
        -// A blank is a dummy variable whose name is "_".
        -// It is not reified: loads are illegal and stores are ignored.
        -//
        -type blank struct{}
        -
        -func (bl blank) load(fn *Function) Value {
        -	panic("blank.load is illegal")
        -}
        -
        -func (bl blank) store(fn *Function, v Value) {
        -	s := &BlankStore{
        -		Val: v,
        -	}
        -	fn.emit(s)
        -}
        -
        -func (bl blank) address(fn *Function) Value {
        -	panic("blank var is not addressable")
        -}
        -
        -func (bl blank) typ() types.Type {
        -	// This should be the type of the blank Ident; the typechecker
        -	// doesn't provide this yet, but fortunately, we don't need it
        -	// yet either.
        -	panic("blank.typ is unimplemented")
        -}
        diff --git a/vendor/honnef.co/go/tools/ssa/methods.go b/vendor/honnef.co/go/tools/ssa/methods.go
        deleted file mode 100644
        index 9cf383916..000000000
        --- a/vendor/honnef.co/go/tools/ssa/methods.go
        +++ /dev/null
        @@ -1,239 +0,0 @@
        -// Copyright 2013 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package ssa
        -
        -// This file defines utilities for population of method sets.
        -
        -import (
        -	"fmt"
        -	"go/types"
        -)
        -
        -// MethodValue returns the Function implementing method sel, building
        -// wrapper methods on demand.  It returns nil if sel denotes an
        -// abstract (interface) method.
        -//
        -// Precondition: sel.Kind() == MethodVal.
        -//
        -// Thread-safe.
        -//
        -// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu)
        -//
        -func (prog *Program) MethodValue(sel *types.Selection) *Function {
        -	if sel.Kind() != types.MethodVal {
        -		panic(fmt.Sprintf("MethodValue(%s) kind != MethodVal", sel))
        -	}
        -	T := sel.Recv()
        -	if isInterface(T) {
        -		return nil // abstract method
        -	}
        -	if prog.mode&LogSource != 0 {
        -		defer logStack("MethodValue %s %v", T, sel)()
        -	}
        -
        -	prog.methodsMu.Lock()
        -	defer prog.methodsMu.Unlock()
        -
        -	return prog.addMethod(prog.createMethodSet(T), sel)
        -}
        -
        -// LookupMethod returns the implementation of the method of type T
        -// identified by (pkg, name).  It returns nil if the method exists but
        -// is abstract, and panics if T has no such method.
        -//
        -func (prog *Program) LookupMethod(T types.Type, pkg *types.Package, name string) *Function {
        -	sel := prog.MethodSets.MethodSet(T).Lookup(pkg, name)
        -	if sel == nil {
        -		panic(fmt.Sprintf("%s has no method %s", T, types.Id(pkg, name)))
        -	}
        -	return prog.MethodValue(sel)
        -}
        -
        -// methodSet contains the (concrete) methods of a non-interface type.
        -type methodSet struct {
        -	mapping  map[string]*Function // populated lazily
        -	complete bool                 // mapping contains all methods
        -}
        -
        -// Precondition: !isInterface(T).
        -// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
        -func (prog *Program) createMethodSet(T types.Type) *methodSet {
        -	mset, ok := prog.methodSets.At(T).(*methodSet)
        -	if !ok {
        -		mset = &methodSet{mapping: make(map[string]*Function)}
        -		prog.methodSets.Set(T, mset)
        -	}
        -	return mset
        -}
        -
        -// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
        -func (prog *Program) addMethod(mset *methodSet, sel *types.Selection) *Function {
        -	if sel.Kind() == types.MethodExpr {
        -		panic(sel)
        -	}
        -	id := sel.Obj().Id()
        -	fn := mset.mapping[id]
        -	if fn == nil {
        -		obj := sel.Obj().(*types.Func)
        -
        -		needsPromotion := len(sel.Index()) > 1
        -		needsIndirection := !isPointer(recvType(obj)) && isPointer(sel.Recv())
        -		if needsPromotion || needsIndirection {
        -			fn = makeWrapper(prog, sel)
        -		} else {
        -			fn = prog.declaredFunc(obj)
        -		}
        -		if fn.Signature.Recv() == nil {
        -			panic(fn) // missing receiver
        -		}
        -		mset.mapping[id] = fn
        -	}
        -	return fn
        -}
        -
        -// RuntimeTypes returns a new unordered slice containing all
        -// concrete types in the program for which a complete (non-empty)
        -// method set is required at run-time.
        -//
        -// Thread-safe.
        -//
        -// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu)
        -//
        -func (prog *Program) RuntimeTypes() []types.Type {
        -	prog.methodsMu.Lock()
        -	defer prog.methodsMu.Unlock()
        -
        -	var res []types.Type
        -	prog.methodSets.Iterate(func(T types.Type, v interface{}) {
        -		if v.(*methodSet).complete {
        -			res = append(res, T)
        -		}
        -	})
        -	return res
        -}
        -
        -// declaredFunc returns the concrete function/method denoted by obj.
        -// Panic ensues if there is none.
        -//
        -func (prog *Program) declaredFunc(obj *types.Func) *Function {
        -	if v := prog.packageLevelValue(obj); v != nil {
        -		return v.(*Function)
        -	}
        -	panic("no concrete method: " + obj.String())
        -}
        -
        -// needMethodsOf ensures that runtime type information (including the
        -// complete method set) is available for the specified type T and all
        -// its subcomponents.
        -//
        -// needMethodsOf must be called for at least every type that is an
        -// operand of some MakeInterface instruction, and for the type of
        -// every exported package member.
        -//
        -// Precondition: T is not a method signature (*Signature with Recv()!=nil).
        -//
        -// Thread-safe.  (Called via emitConv from multiple builder goroutines.)
        -//
        -// TODO(adonovan): make this faster.  It accounts for 20% of SSA build time.
        -//
        -// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu)
        -//
        -func (prog *Program) needMethodsOf(T types.Type) {
        -	prog.methodsMu.Lock()
        -	prog.needMethods(T, false)
        -	prog.methodsMu.Unlock()
        -}
        -
        -// Precondition: T is not a method signature (*Signature with Recv()!=nil).
        -// Recursive case: skip => don't create methods for T.
        -//
        -// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
        -//
        -func (prog *Program) needMethods(T types.Type, skip bool) {
        -	// Each package maintains its own set of types it has visited.
        -	if prevSkip, ok := prog.runtimeTypes.At(T).(bool); ok {
        -		// needMethods(T) was previously called
        -		if !prevSkip || skip {
        -			return // already seen, with same or false 'skip' value
        -		}
        -	}
        -	prog.runtimeTypes.Set(T, skip)
        -
        -	tmset := prog.MethodSets.MethodSet(T)
        -
        -	if !skip && !isInterface(T) && tmset.Len() > 0 {
        -		// Create methods of T.
        -		mset := prog.createMethodSet(T)
        -		if !mset.complete {
        -			mset.complete = true
        -			n := tmset.Len()
        -			for i := 0; i < n; i++ {
        -				prog.addMethod(mset, tmset.At(i))
        -			}
        -		}
        -	}
        -
        -	// Recursion over signatures of each method.
        -	for i := 0; i < tmset.Len(); i++ {
        -		sig := tmset.At(i).Type().(*types.Signature)
        -		prog.needMethods(sig.Params(), false)
        -		prog.needMethods(sig.Results(), false)
        -	}
        -
        -	switch t := T.(type) {
        -	case *types.Basic:
        -		// nop
        -
        -	case *types.Interface:
        -		// nop---handled by recursion over method set.
        -
        -	case *types.Pointer:
        -		prog.needMethods(t.Elem(), false)
        -
        -	case *types.Slice:
        -		prog.needMethods(t.Elem(), false)
        -
        -	case *types.Chan:
        -		prog.needMethods(t.Elem(), false)
        -
        -	case *types.Map:
        -		prog.needMethods(t.Key(), false)
        -		prog.needMethods(t.Elem(), false)
        -
        -	case *types.Signature:
        -		if t.Recv() != nil {
        -			panic(fmt.Sprintf("Signature %s has Recv %s", t, t.Recv()))
        -		}
        -		prog.needMethods(t.Params(), false)
        -		prog.needMethods(t.Results(), false)
        -
        -	case *types.Named:
        -		// A pointer-to-named type can be derived from a named
        -		// type via reflection.  It may have methods too.
        -		prog.needMethods(types.NewPointer(T), false)
        -
        -		// Consider 'type T struct{S}' where S has methods.
        -		// Reflection provides no way to get from T to struct{S},
        -		// only to S, so the method set of struct{S} is unwanted,
        -		// so set 'skip' flag during recursion.
        -		prog.needMethods(t.Underlying(), true)
        -
        -	case *types.Array:
        -		prog.needMethods(t.Elem(), false)
        -
        -	case *types.Struct:
        -		for i, n := 0, t.NumFields(); i < n; i++ {
        -			prog.needMethods(t.Field(i).Type(), false)
        -		}
        -
        -	case *types.Tuple:
        -		for i, n := 0, t.Len(); i < n; i++ {
        -			prog.needMethods(t.At(i).Type(), false)
        -		}
        -
        -	default:
        -		panic(T)
        -	}
        -}
        diff --git a/vendor/honnef.co/go/tools/ssa/mode.go b/vendor/honnef.co/go/tools/ssa/mode.go
        deleted file mode 100644
        index d2a269893..000000000
        --- a/vendor/honnef.co/go/tools/ssa/mode.go
        +++ /dev/null
        @@ -1,100 +0,0 @@
        -// Copyright 2015 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package ssa
        -
        -// This file defines the BuilderMode type and its command-line flag.
        -
        -import (
        -	"bytes"
        -	"fmt"
        -)
        -
        -// BuilderMode is a bitmask of options for diagnostics and checking.
        -//
        -// *BuilderMode satisfies the flag.Value interface.  Example:
        -//
        -// 	var mode = ssa.BuilderMode(0)
        -// 	func init() { flag.Var(&mode, "build", ssa.BuilderModeDoc) }
        -//
        -type BuilderMode uint
        -
        -const (
        -	PrintPackages        BuilderMode = 1 << iota // Print package inventory to stdout
        -	PrintFunctions                               // Print function SSA code to stdout
        -	LogSource                                    // Log source locations as SSA builder progresses
        -	SanityCheckFunctions                         // Perform sanity checking of function bodies
        -	NaiveForm                                    // Build naïve SSA form: don't replace local loads/stores with registers
        -	BuildSerially                                // Build packages serially, not in parallel.
        -	GlobalDebug                                  // Enable debug info for all packages
        -	BareInits                                    // Build init functions without guards or calls to dependent inits
        -)
        -
        -const BuilderModeDoc = `Options controlling the SSA builder.
        -The value is a sequence of zero or more of these letters:
        -C	perform sanity [C]hecking of the SSA form.
        -D	include [D]ebug info for every function.
        -P	print [P]ackage inventory.
        -F	print [F]unction SSA code.
        -S	log [S]ource locations as SSA builder progresses.
        -L	build distinct packages seria[L]ly instead of in parallel.
        -N	build [N]aive SSA form: don't replace local loads/stores with registers.
        -I	build bare [I]nit functions: no init guards or calls to dependent inits.
        -`
        -
        -func (m BuilderMode) String() string {
        -	var buf bytes.Buffer
        -	if m&GlobalDebug != 0 {
        -		buf.WriteByte('D')
        -	}
        -	if m&PrintPackages != 0 {
        -		buf.WriteByte('P')
        -	}
        -	if m&PrintFunctions != 0 {
        -		buf.WriteByte('F')
        -	}
        -	if m&LogSource != 0 {
        -		buf.WriteByte('S')
        -	}
        -	if m&SanityCheckFunctions != 0 {
        -		buf.WriteByte('C')
        -	}
        -	if m&NaiveForm != 0 {
        -		buf.WriteByte('N')
        -	}
        -	if m&BuildSerially != 0 {
        -		buf.WriteByte('L')
        -	}
        -	return buf.String()
        -}
        -
        -// Set parses the flag characters in s and updates *m.
        -func (m *BuilderMode) Set(s string) error {
        -	var mode BuilderMode
        -	for _, c := range s {
        -		switch c {
        -		case 'D':
        -			mode |= GlobalDebug
        -		case 'P':
        -			mode |= PrintPackages
        -		case 'F':
        -			mode |= PrintFunctions
        -		case 'S':
        -			mode |= LogSource | BuildSerially
        -		case 'C':
        -			mode |= SanityCheckFunctions
        -		case 'N':
        -			mode |= NaiveForm
        -		case 'L':
        -			mode |= BuildSerially
        -		default:
        -			return fmt.Errorf("unknown BuilderMode option: %q", c)
        -		}
        -	}
        -	*m = mode
        -	return nil
        -}
        -
        -// Get returns m.
        -func (m BuilderMode) Get() interface{} { return m }
        diff --git a/vendor/honnef.co/go/tools/ssa/print.go b/vendor/honnef.co/go/tools/ssa/print.go
        deleted file mode 100644
        index 6fd277277..000000000
        --- a/vendor/honnef.co/go/tools/ssa/print.go
        +++ /dev/null
        @@ -1,435 +0,0 @@
        -// Copyright 2013 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package ssa
        -
        -// This file implements the String() methods for all Value and
        -// Instruction types.
        -
        -import (
        -	"bytes"
        -	"fmt"
        -	"go/types"
        -	"io"
        -	"reflect"
        -	"sort"
        -
        -	"golang.org/x/tools/go/types/typeutil"
        -)
        -
        -// relName returns the name of v relative to i.
        -// In most cases, this is identical to v.Name(), but references to
        -// Functions (including methods) and Globals use RelString and
        -// all types are displayed with relType, so that only cross-package
        -// references are package-qualified.
        -//
        -func relName(v Value, i Instruction) string {
        -	var from *types.Package
        -	if i != nil {
        -		from = i.Parent().pkg()
        -	}
        -	switch v := v.(type) {
        -	case Member: // *Function or *Global
        -		return v.RelString(from)
        -	case *Const:
        -		return v.RelString(from)
        -	}
        -	return v.Name()
        -}
        -
        -func relType(t types.Type, from *types.Package) string {
        -	return types.TypeString(t, types.RelativeTo(from))
        -}
        -
        -func relString(m Member, from *types.Package) string {
        -	// NB: not all globals have an Object (e.g. init$guard),
        -	// so use Package().Object not Object.Package().
        -	if pkg := m.Package().Pkg; pkg != nil && pkg != from {
        -		return fmt.Sprintf("%s.%s", pkg.Path(), m.Name())
        -	}
        -	return m.Name()
        -}
        -
        -// Value.String()
        -//
        -// This method is provided only for debugging.
        -// It never appears in disassembly, which uses Value.Name().
        -
        -func (v *Parameter) String() string {
        -	from := v.Parent().pkg()
        -	return fmt.Sprintf("parameter %s : %s", v.Name(), relType(v.Type(), from))
        -}
        -
        -func (v *FreeVar) String() string {
        -	from := v.Parent().pkg()
        -	return fmt.Sprintf("freevar %s : %s", v.Name(), relType(v.Type(), from))
        -}
        -
        -func (v *Builtin) String() string {
        -	return fmt.Sprintf("builtin %s", v.Name())
        -}
        -
        -// Instruction.String()
        -
        -func (v *Alloc) String() string {
        -	op := "local"
        -	if v.Heap {
        -		op = "new"
        -	}
        -	from := v.Parent().pkg()
        -	return fmt.Sprintf("%s %s (%s)", op, relType(deref(v.Type()), from), v.Comment)
        -}
        -
        -func (v *Phi) String() string {
        -	var b bytes.Buffer
        -	b.WriteString("phi [")
        -	for i, edge := range v.Edges {
        -		if i > 0 {
        -			b.WriteString(", ")
        -		}
        -		// Be robust against malformed CFG.
        -		if v.block == nil {
        -			b.WriteString("??")
        -			continue
        -		}
        -		block := -1
        -		if i < len(v.block.Preds) {
        -			block = v.block.Preds[i].Index
        -		}
        -		fmt.Fprintf(&b, "%d: ", block)
        -		edgeVal := "" // be robust
        -		if edge != nil {
        -			edgeVal = relName(edge, v)
        -		}
        -		b.WriteString(edgeVal)
        -	}
        -	b.WriteString("]")
        -	if v.Comment != "" {
        -		b.WriteString(" #")
        -		b.WriteString(v.Comment)
        -	}
        -	return b.String()
        -}
        -
        -func printCall(v *CallCommon, prefix string, instr Instruction) string {
        -	var b bytes.Buffer
        -	b.WriteString(prefix)
        -	if !v.IsInvoke() {
        -		b.WriteString(relName(v.Value, instr))
        -	} else {
        -		fmt.Fprintf(&b, "invoke %s.%s", relName(v.Value, instr), v.Method.Name())
        -	}
        -	b.WriteString("(")
        -	for i, arg := range v.Args {
        -		if i > 0 {
        -			b.WriteString(", ")
        -		}
        -		b.WriteString(relName(arg, instr))
        -	}
        -	if v.Signature().Variadic() {
        -		b.WriteString("...")
        -	}
        -	b.WriteString(")")
        -	return b.String()
        -}
        -
        -func (c *CallCommon) String() string {
        -	return printCall(c, "", nil)
        -}
        -
        -func (v *Call) String() string {
        -	return printCall(&v.Call, "", v)
        -}
        -
        -func (v *BinOp) String() string {
        -	return fmt.Sprintf("%s %s %s", relName(v.X, v), v.Op.String(), relName(v.Y, v))
        -}
        -
        -func (v *UnOp) String() string {
        -	return fmt.Sprintf("%s%s%s", v.Op, relName(v.X, v), commaOk(v.CommaOk))
        -}
        -
        -func printConv(prefix string, v, x Value) string {
        -	from := v.Parent().pkg()
        -	return fmt.Sprintf("%s %s <- %s (%s)",
        -		prefix,
        -		relType(v.Type(), from),
        -		relType(x.Type(), from),
        -		relName(x, v.(Instruction)))
        -}
        -
        -func (v *ChangeType) String() string      { return printConv("changetype", v, v.X) }
        -func (v *Convert) String() string         { return printConv("convert", v, v.X) }
        -func (v *ChangeInterface) String() string { return printConv("change interface", v, v.X) }
        -func (v *MakeInterface) String() string   { return printConv("make", v, v.X) }
        -
        -func (v *MakeClosure) String() string {
        -	var b bytes.Buffer
        -	fmt.Fprintf(&b, "make closure %s", relName(v.Fn, v))
        -	if v.Bindings != nil {
        -		b.WriteString(" [")
        -		for i, c := range v.Bindings {
        -			if i > 0 {
        -				b.WriteString(", ")
        -			}
        -			b.WriteString(relName(c, v))
        -		}
        -		b.WriteString("]")
        -	}
        -	return b.String()
        -}
        -
        -func (v *MakeSlice) String() string {
        -	from := v.Parent().pkg()
        -	return fmt.Sprintf("make %s %s %s",
        -		relType(v.Type(), from),
        -		relName(v.Len, v),
        -		relName(v.Cap, v))
        -}
        -
        -func (v *Slice) String() string {
        -	var b bytes.Buffer
        -	b.WriteString("slice ")
        -	b.WriteString(relName(v.X, v))
        -	b.WriteString("[")
        -	if v.Low != nil {
        -		b.WriteString(relName(v.Low, v))
        -	}
        -	b.WriteString(":")
        -	if v.High != nil {
        -		b.WriteString(relName(v.High, v))
        -	}
        -	if v.Max != nil {
        -		b.WriteString(":")
        -		b.WriteString(relName(v.Max, v))
        -	}
        -	b.WriteString("]")
        -	return b.String()
        -}
        -
        -func (v *MakeMap) String() string {
        -	res := ""
        -	if v.Reserve != nil {
        -		res = relName(v.Reserve, v)
        -	}
        -	from := v.Parent().pkg()
        -	return fmt.Sprintf("make %s %s", relType(v.Type(), from), res)
        -}
        -
        -func (v *MakeChan) String() string {
        -	from := v.Parent().pkg()
        -	return fmt.Sprintf("make %s %s", relType(v.Type(), from), relName(v.Size, v))
        -}
        -
        -func (v *FieldAddr) String() string {
        -	st := deref(v.X.Type()).Underlying().(*types.Struct)
        -	// Be robust against a bad index.
        -	name := "?"
        -	if 0 <= v.Field && v.Field < st.NumFields() {
        -		name = st.Field(v.Field).Name()
        -	}
        -	return fmt.Sprintf("&%s.%s [#%d]", relName(v.X, v), name, v.Field)
        -}
        -
        -func (v *Field) String() string {
        -	st := v.X.Type().Underlying().(*types.Struct)
        -	// Be robust against a bad index.
        -	name := "?"
        -	if 0 <= v.Field && v.Field < st.NumFields() {
        -		name = st.Field(v.Field).Name()
        -	}
        -	return fmt.Sprintf("%s.%s [#%d]", relName(v.X, v), name, v.Field)
        -}
        -
        -func (v *IndexAddr) String() string {
        -	return fmt.Sprintf("&%s[%s]", relName(v.X, v), relName(v.Index, v))
        -}
        -
        -func (v *Index) String() string {
        -	return fmt.Sprintf("%s[%s]", relName(v.X, v), relName(v.Index, v))
        -}
        -
        -func (v *Lookup) String() string {
        -	return fmt.Sprintf("%s[%s]%s", relName(v.X, v), relName(v.Index, v), commaOk(v.CommaOk))
        -}
        -
        -func (v *Range) String() string {
        -	return "range " + relName(v.X, v)
        -}
        -
        -func (v *Next) String() string {
        -	return "next " + relName(v.Iter, v)
        -}
        -
        -func (v *TypeAssert) String() string {
        -	from := v.Parent().pkg()
        -	return fmt.Sprintf("typeassert%s %s.(%s)", commaOk(v.CommaOk), relName(v.X, v), relType(v.AssertedType, from))
        -}
        -
        -func (v *Extract) String() string {
        -	return fmt.Sprintf("extract %s #%d", relName(v.Tuple, v), v.Index)
        -}
        -
        -func (s *Jump) String() string {
        -	// Be robust against malformed CFG.
        -	block := -1
        -	if s.block != nil && len(s.block.Succs) == 1 {
        -		block = s.block.Succs[0].Index
        -	}
        -	return fmt.Sprintf("jump %d", block)
        -}
        -
        -func (s *If) String() string {
        -	// Be robust against malformed CFG.
        -	tblock, fblock := -1, -1
        -	if s.block != nil && len(s.block.Succs) == 2 {
        -		tblock = s.block.Succs[0].Index
        -		fblock = s.block.Succs[1].Index
        -	}
        -	return fmt.Sprintf("if %s goto %d else %d", relName(s.Cond, s), tblock, fblock)
        -}
        -
        -func (s *Go) String() string {
        -	return printCall(&s.Call, "go ", s)
        -}
        -
        -func (s *Panic) String() string {
        -	return "panic " + relName(s.X, s)
        -}
        -
        -func (s *Return) String() string {
        -	var b bytes.Buffer
        -	b.WriteString("return")
        -	for i, r := range s.Results {
        -		if i == 0 {
        -			b.WriteString(" ")
        -		} else {
        -			b.WriteString(", ")
        -		}
        -		b.WriteString(relName(r, s))
        -	}
        -	return b.String()
        -}
        -
        -func (*RunDefers) String() string {
        -	return "rundefers"
        -}
        -
        -func (s *Send) String() string {
        -	return fmt.Sprintf("send %s <- %s", relName(s.Chan, s), relName(s.X, s))
        -}
        -
        -func (s *Defer) String() string {
        -	return printCall(&s.Call, "defer ", s)
        -}
        -
        -func (s *Select) String() string {
        -	var b bytes.Buffer
        -	for i, st := range s.States {
        -		if i > 0 {
        -			b.WriteString(", ")
        -		}
        -		if st.Dir == types.RecvOnly {
        -			b.WriteString("<-")
        -			b.WriteString(relName(st.Chan, s))
        -		} else {
        -			b.WriteString(relName(st.Chan, s))
        -			b.WriteString("<-")
        -			b.WriteString(relName(st.Send, s))
        -		}
        -	}
        -	non := ""
        -	if !s.Blocking {
        -		non = "non"
        -	}
        -	return fmt.Sprintf("select %sblocking [%s]", non, b.String())
        -}
        -
        -func (s *Store) String() string {
        -	return fmt.Sprintf("*%s = %s", relName(s.Addr, s), relName(s.Val, s))
        -}
        -
        -func (s *BlankStore) String() string {
        -	return fmt.Sprintf("_ = %s", relName(s.Val, s))
        -}
        -
        -func (s *MapUpdate) String() string {
        -	return fmt.Sprintf("%s[%s] = %s", relName(s.Map, s), relName(s.Key, s), relName(s.Value, s))
        -}
        -
        -func (s *DebugRef) String() string {
        -	p := s.Parent().Prog.Fset.Position(s.Pos())
        -	var descr interface{}
        -	if s.object != nil {
        -		descr = s.object // e.g. "var x int"
        -	} else {
        -		descr = reflect.TypeOf(s.Expr) // e.g. "*ast.CallExpr"
        -	}
        -	var addr string
        -	if s.IsAddr {
        -		addr = "address of "
        -	}
        -	return fmt.Sprintf("; %s%s @ %d:%d is %s", addr, descr, p.Line, p.Column, s.X.Name())
        -}
        -
        -func (p *Package) String() string {
        -	return "package " + p.Pkg.Path()
        -}
        -
        -var _ io.WriterTo = (*Package)(nil) // *Package implements io.Writer
        -
        -func (p *Package) WriteTo(w io.Writer) (int64, error) {
        -	var buf bytes.Buffer
        -	WritePackage(&buf, p)
        -	n, err := w.Write(buf.Bytes())
        -	return int64(n), err
        -}
        -
        -// WritePackage writes to buf a human-readable summary of p.
        -func WritePackage(buf *bytes.Buffer, p *Package) {
        -	fmt.Fprintf(buf, "%s:\n", p)
        -
        -	var names []string
        -	maxname := 0
        -	for name := range p.Members {
        -		if l := len(name); l > maxname {
        -			maxname = l
        -		}
        -		names = append(names, name)
        -	}
        -
        -	from := p.Pkg
        -	sort.Strings(names)
        -	for _, name := range names {
        -		switch mem := p.Members[name].(type) {
        -		case *NamedConst:
        -			fmt.Fprintf(buf, "  const %-*s %s = %s\n",
        -				maxname, name, mem.Name(), mem.Value.RelString(from))
        -
        -		case *Function:
        -			fmt.Fprintf(buf, "  func  %-*s %s\n",
        -				maxname, name, relType(mem.Type(), from))
        -
        -		case *Type:
        -			fmt.Fprintf(buf, "  type  %-*s %s\n",
        -				maxname, name, relType(mem.Type().Underlying(), from))
        -			for _, meth := range typeutil.IntuitiveMethodSet(mem.Type(), &p.Prog.MethodSets) {
        -				fmt.Fprintf(buf, "    %s\n", types.SelectionString(meth, types.RelativeTo(from)))
        -			}
        -
        -		case *Global:
        -			fmt.Fprintf(buf, "  var   %-*s %s\n",
        -				maxname, name, relType(mem.Type().(*types.Pointer).Elem(), from))
        -		}
        -	}
        -
        -	fmt.Fprintf(buf, "\n")
        -}
        -
        -func commaOk(x bool) string {
        -	if x {
        -		return ",ok"
        -	}
        -	return ""
        -}
        diff --git a/vendor/honnef.co/go/tools/ssa/sanity.go b/vendor/honnef.co/go/tools/ssa/sanity.go
        deleted file mode 100644
        index 1d29b66b0..000000000
        --- a/vendor/honnef.co/go/tools/ssa/sanity.go
        +++ /dev/null
        @@ -1,535 +0,0 @@
        -// Copyright 2013 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package ssa
        -
        -// An optional pass for sanity-checking invariants of the SSA representation.
        -// Currently it checks CFG invariants but little at the instruction level.
        -
        -import (
        -	"fmt"
        -	"go/types"
        -	"io"
        -	"os"
        -	"strings"
        -)
        -
        -type sanity struct {
        -	reporter io.Writer
        -	fn       *Function
        -	block    *BasicBlock
        -	instrs   map[Instruction]struct{}
        -	insane   bool
        -}
        -
        -// sanityCheck performs integrity checking of the SSA representation
        -// of the function fn and returns true if it was valid.  Diagnostics
        -// are written to reporter if non-nil, os.Stderr otherwise.  Some
        -// diagnostics are only warnings and do not imply a negative result.
        -//
        -// Sanity-checking is intended to facilitate the debugging of code
        -// transformation passes.
        -//
        -func sanityCheck(fn *Function, reporter io.Writer) bool {
        -	if reporter == nil {
        -		reporter = os.Stderr
        -	}
        -	return (&sanity{reporter: reporter}).checkFunction(fn)
        -}
        -
        -// mustSanityCheck is like sanityCheck but panics instead of returning
        -// a negative result.
        -//
        -func mustSanityCheck(fn *Function, reporter io.Writer) {
        -	if !sanityCheck(fn, reporter) {
        -		fn.WriteTo(os.Stderr)
        -		panic("SanityCheck failed")
        -	}
        -}
        -
        -func (s *sanity) diagnostic(prefix, format string, args ...interface{}) {
        -	fmt.Fprintf(s.reporter, "%s: function %s", prefix, s.fn)
        -	if s.block != nil {
        -		fmt.Fprintf(s.reporter, ", block %s", s.block)
        -	}
        -	io.WriteString(s.reporter, ": ")
        -	fmt.Fprintf(s.reporter, format, args...)
        -	io.WriteString(s.reporter, "\n")
        -}
        -
        -func (s *sanity) errorf(format string, args ...interface{}) {
        -	s.insane = true
        -	s.diagnostic("Error", format, args...)
        -}
        -
        -func (s *sanity) warnf(format string, args ...interface{}) {
        -	s.diagnostic("Warning", format, args...)
        -}
        -
        -// findDuplicate returns an arbitrary basic block that appeared more
        -// than once in blocks, or nil if all were unique.
        -func findDuplicate(blocks []*BasicBlock) *BasicBlock {
        -	if len(blocks) < 2 {
        -		return nil
        -	}
        -	if blocks[0] == blocks[1] {
        -		return blocks[0]
        -	}
        -	// Slow path:
        -	m := make(map[*BasicBlock]bool)
        -	for _, b := range blocks {
        -		if m[b] {
        -			return b
        -		}
        -		m[b] = true
        -	}
        -	return nil
        -}
        -
        -func (s *sanity) checkInstr(idx int, instr Instruction) {
        -	switch instr := instr.(type) {
        -	case *If, *Jump, *Return, *Panic:
        -		s.errorf("control flow instruction not at end of block")
        -	case *Phi:
        -		if idx == 0 {
        -			// It suffices to apply this check to just the first phi node.
        -			if dup := findDuplicate(s.block.Preds); dup != nil {
        -				s.errorf("phi node in block with duplicate predecessor %s", dup)
        -			}
        -		} else {
        -			prev := s.block.Instrs[idx-1]
        -			if _, ok := prev.(*Phi); !ok {
        -				s.errorf("Phi instruction follows a non-Phi: %T", prev)
        -			}
        -		}
        -		if ne, np := len(instr.Edges), len(s.block.Preds); ne != np {
        -			s.errorf("phi node has %d edges but %d predecessors", ne, np)
        -
        -		} else {
        -			for i, e := range instr.Edges {
        -				if e == nil {
        -					s.errorf("phi node '%s' has no value for edge #%d from %s", instr.Comment, i, s.block.Preds[i])
        -				}
        -			}
        -		}
        -
        -	case *Alloc:
        -		if !instr.Heap {
        -			found := false
        -			for _, l := range s.fn.Locals {
        -				if l == instr {
        -					found = true
        -					break
        -				}
        -			}
        -			if !found {
        -				s.errorf("local alloc %s = %s does not appear in Function.Locals", instr.Name(), instr)
        -			}
        -		}
        -
        -	case *BinOp:
        -	case *Call:
        -	case *ChangeInterface:
        -	case *ChangeType:
        -	case *Convert:
        -		if _, ok := instr.X.Type().Underlying().(*types.Basic); !ok {
        -			if _, ok := instr.Type().Underlying().(*types.Basic); !ok {
        -				s.errorf("convert %s -> %s: at least one type must be basic", instr.X.Type(), instr.Type())
        -			}
        -		}
        -
        -	case *Defer:
        -	case *Extract:
        -	case *Field:
        -	case *FieldAddr:
        -	case *Go:
        -	case *Index:
        -	case *IndexAddr:
        -	case *Lookup:
        -	case *MakeChan:
        -	case *MakeClosure:
        -		numFree := len(instr.Fn.(*Function).FreeVars)
        -		numBind := len(instr.Bindings)
        -		if numFree != numBind {
        -			s.errorf("MakeClosure has %d Bindings for function %s with %d free vars",
        -				numBind, instr.Fn, numFree)
        -
        -		}
        -		if recv := instr.Type().(*types.Signature).Recv(); recv != nil {
        -			s.errorf("MakeClosure's type includes receiver %s", recv.Type())
        -		}
        -
        -	case *MakeInterface:
        -	case *MakeMap:
        -	case *MakeSlice:
        -	case *MapUpdate:
        -	case *Next:
        -	case *Range:
        -	case *RunDefers:
        -	case *Select:
        -	case *Send:
        -	case *Slice:
        -	case *Store:
        -	case *TypeAssert:
        -	case *UnOp:
        -	case *DebugRef:
        -	case *BlankStore:
        -	case *Sigma:
        -		// TODO(adonovan): implement checks.
        -	default:
        -		panic(fmt.Sprintf("Unknown instruction type: %T", instr))
        -	}
        -
        -	if call, ok := instr.(CallInstruction); ok {
        -		if call.Common().Signature() == nil {
        -			s.errorf("nil signature: %s", call)
        -		}
        -	}
        -
        -	// Check that value-defining instructions have valid types
        -	// and a valid referrer list.
        -	if v, ok := instr.(Value); ok {
        -		t := v.Type()
        -		if t == nil {
        -			s.errorf("no type: %s = %s", v.Name(), v)
        -		} else if t == tRangeIter {
        -			// not a proper type; ignore.
        -		} else if b, ok := t.Underlying().(*types.Basic); ok && b.Info()&types.IsUntyped != 0 {
        -			s.errorf("instruction has 'untyped' result: %s = %s : %s", v.Name(), v, t)
        -		}
        -		s.checkReferrerList(v)
        -	}
        -
        -	// Untyped constants are legal as instruction Operands(),
        -	// for example:
        -	//   _ = "foo"[0]
        -	// or:
        -	//   if wordsize==64 {...}
        -
        -	// All other non-Instruction Values can be found via their
        -	// enclosing Function or Package.
        -}
        -
        -func (s *sanity) checkFinalInstr(instr Instruction) {
        -	switch instr := instr.(type) {
        -	case *If:
        -		if nsuccs := len(s.block.Succs); nsuccs != 2 {
        -			s.errorf("If-terminated block has %d successors; expected 2", nsuccs)
        -			return
        -		}
        -		if s.block.Succs[0] == s.block.Succs[1] {
        -			s.errorf("If-instruction has same True, False target blocks: %s", s.block.Succs[0])
        -			return
        -		}
        -
        -	case *Jump:
        -		if nsuccs := len(s.block.Succs); nsuccs != 1 {
        -			s.errorf("Jump-terminated block has %d successors; expected 1", nsuccs)
        -			return
        -		}
        -
        -	case *Return:
        -		if nsuccs := len(s.block.Succs); nsuccs != 0 {
        -			s.errorf("Return-terminated block has %d successors; expected none", nsuccs)
        -			return
        -		}
        -		if na, nf := len(instr.Results), s.fn.Signature.Results().Len(); nf != na {
        -			s.errorf("%d-ary return in %d-ary function", na, nf)
        -		}
        -
        -	case *Panic:
        -		if nsuccs := len(s.block.Succs); nsuccs != 0 {
        -			s.errorf("Panic-terminated block has %d successors; expected none", nsuccs)
        -			return
        -		}
        -
        -	default:
        -		s.errorf("non-control flow instruction at end of block")
        -	}
        -}
        -
        -func (s *sanity) checkBlock(b *BasicBlock, index int) {
        -	s.block = b
        -
        -	if b.Index != index {
        -		s.errorf("block has incorrect Index %d", b.Index)
        -	}
        -	if b.parent != s.fn {
        -		s.errorf("block has incorrect parent %s", b.parent)
        -	}
        -
        -	// Check all blocks are reachable.
        -	// (The entry block is always implicitly reachable,
        -	// as is the Recover block, if any.)
        -	if (index > 0 && b != b.parent.Recover) && len(b.Preds) == 0 {
        -		s.warnf("unreachable block")
        -		if b.Instrs == nil {
        -			// Since this block is about to be pruned,
        -			// tolerating transient problems in it
        -			// simplifies other optimizations.
        -			return
        -		}
        -	}
        -
        -	// Check predecessor and successor relations are dual,
        -	// and that all blocks in CFG belong to same function.
        -	for _, a := range b.Preds {
        -		found := false
        -		for _, bb := range a.Succs {
        -			if bb == b {
        -				found = true
        -				break
        -			}
        -		}
        -		if !found {
        -			s.errorf("expected successor edge in predecessor %s; found only: %s", a, a.Succs)
        -		}
        -		if a.parent != s.fn {
        -			s.errorf("predecessor %s belongs to different function %s", a, a.parent)
        -		}
        -	}
        -	for _, c := range b.Succs {
        -		found := false
        -		for _, bb := range c.Preds {
        -			if bb == b {
        -				found = true
        -				break
        -			}
        -		}
        -		if !found {
        -			s.errorf("expected predecessor edge in successor %s; found only: %s", c, c.Preds)
        -		}
        -		if c.parent != s.fn {
        -			s.errorf("successor %s belongs to different function %s", c, c.parent)
        -		}
        -	}
        -
        -	// Check each instruction is sane.
        -	n := len(b.Instrs)
        -	if n == 0 {
        -		s.errorf("basic block contains no instructions")
        -	}
        -	var rands [10]*Value // reuse storage
        -	for j, instr := range b.Instrs {
        -		if instr == nil {
        -			s.errorf("nil instruction at index %d", j)
        -			continue
        -		}
        -		if b2 := instr.Block(); b2 == nil {
        -			s.errorf("nil Block() for instruction at index %d", j)
        -			continue
        -		} else if b2 != b {
        -			s.errorf("wrong Block() (%s) for instruction at index %d ", b2, j)
        -			continue
        -		}
        -		if j < n-1 {
        -			s.checkInstr(j, instr)
        -		} else {
        -			s.checkFinalInstr(instr)
        -		}
        -
        -		// Check Instruction.Operands.
        -	operands:
        -		for i, op := range instr.Operands(rands[:0]) {
        -			if op == nil {
        -				s.errorf("nil operand pointer %d of %s", i, instr)
        -				continue
        -			}
        -			val := *op
        -			if val == nil {
        -				continue // a nil operand is ok
        -			}
        -
        -			// Check that "untyped" types only appear on constant operands.
        -			if _, ok := (*op).(*Const); !ok {
        -				if basic, ok := (*op).Type().(*types.Basic); ok {
        -					if basic.Info()&types.IsUntyped != 0 {
        -						s.errorf("operand #%d of %s is untyped: %s", i, instr, basic)
        -					}
        -				}
        -			}
        -
        -			// Check that Operands that are also Instructions belong to same function.
        -			// TODO(adonovan): also check their block dominates block b.
        -			if val, ok := val.(Instruction); ok {
        -				if val.Block() == nil {
        -					s.errorf("operand %d of %s is an instruction (%s) that belongs to no block", i, instr, val)
        -				} else if val.Parent() != s.fn {
        -					s.errorf("operand %d of %s is an instruction (%s) from function %s", i, instr, val, val.Parent())
        -				}
        -			}
        -
        -			// Check that each function-local operand of
        -			// instr refers back to instr.  (NB: quadratic)
        -			switch val := val.(type) {
        -			case *Const, *Global, *Builtin:
        -				continue // not local
        -			case *Function:
        -				if val.parent == nil {
        -					continue // only anon functions are local
        -				}
        -			}
        -
        -			// TODO(adonovan): check val.Parent() != nil <=> val.Referrers() is defined.
        -
        -			if refs := val.Referrers(); refs != nil {
        -				for _, ref := range *refs {
        -					if ref == instr {
        -						continue operands
        -					}
        -				}
        -				s.errorf("operand %d of %s (%s) does not refer to us", i, instr, val)
        -			} else {
        -				s.errorf("operand %d of %s (%s) has no referrers", i, instr, val)
        -			}
        -		}
        -	}
        -}
        -
        -func (s *sanity) checkReferrerList(v Value) {
        -	refs := v.Referrers()
        -	if refs == nil {
        -		s.errorf("%s has missing referrer list", v.Name())
        -		return
        -	}
        -	for i, ref := range *refs {
        -		if _, ok := s.instrs[ref]; !ok {
        -			s.errorf("%s.Referrers()[%d] = %s is not an instruction belonging to this function", v.Name(), i, ref)
        -		}
        -	}
        -}
        -
        -func (s *sanity) checkFunction(fn *Function) bool {
        -	// TODO(adonovan): check Function invariants:
        -	// - check params match signature
        -	// - check transient fields are nil
        -	// - warn if any fn.Locals do not appear among block instructions.
        -	s.fn = fn
        -	if fn.Prog == nil {
        -		s.errorf("nil Prog")
        -	}
        -
        -	_ = fn.String()            // must not crash
        -	_ = fn.RelString(fn.pkg()) // must not crash
        -
        -	// All functions have a package, except delegates (which are
        -	// shared across packages, or duplicated as weak symbols in a
        -	// separate-compilation model), and error.Error.
        -	if fn.Pkg == nil {
        -		if strings.HasPrefix(fn.Synthetic, "wrapper ") ||
        -			strings.HasPrefix(fn.Synthetic, "bound ") ||
        -			strings.HasPrefix(fn.Synthetic, "thunk ") ||
        -			strings.HasSuffix(fn.name, "Error") {
        -			// ok
        -		} else {
        -			s.errorf("nil Pkg")
        -		}
        -	}
        -	if src, syn := fn.Synthetic == "", fn.Syntax() != nil; src != syn {
        -		s.errorf("got fromSource=%t, hasSyntax=%t; want same values", src, syn)
        -	}
        -	for i, l := range fn.Locals {
        -		if l.Parent() != fn {
        -			s.errorf("Local %s at index %d has wrong parent", l.Name(), i)
        -		}
        -		if l.Heap {
        -			s.errorf("Local %s at index %d has Heap flag set", l.Name(), i)
        -		}
        -	}
        -	// Build the set of valid referrers.
        -	s.instrs = make(map[Instruction]struct{})
        -	for _, b := range fn.Blocks {
        -		for _, instr := range b.Instrs {
        -			s.instrs[instr] = struct{}{}
        -		}
        -	}
        -	for i, p := range fn.Params {
        -		if p.Parent() != fn {
        -			s.errorf("Param %s at index %d has wrong parent", p.Name(), i)
        -		}
        -		// Check common suffix of Signature and Params match type.
        -		if sig := fn.Signature; sig != nil {
        -			j := i - len(fn.Params) + sig.Params().Len() // index within sig.Params
        -			if j < 0 {
        -				continue
        -			}
        -			if !types.Identical(p.Type(), sig.Params().At(j).Type()) {
        -				s.errorf("Param %s at index %d has wrong type (%s, versus %s in Signature)", p.Name(), i, p.Type(), sig.Params().At(j).Type())
        -
        -			}
        -		}
        -
        -		s.checkReferrerList(p)
        -	}
        -	for i, fv := range fn.FreeVars {
        -		if fv.Parent() != fn {
        -			s.errorf("FreeVar %s at index %d has wrong parent", fv.Name(), i)
        -		}
        -		s.checkReferrerList(fv)
        -	}
        -
        -	if fn.Blocks != nil && len(fn.Blocks) == 0 {
        -		// Function _had_ blocks (so it's not external) but
        -		// they were "optimized" away, even the entry block.
        -		s.errorf("Blocks slice is non-nil but empty")
        -	}
        -	for i, b := range fn.Blocks {
        -		if b == nil {
        -			s.warnf("nil *BasicBlock at f.Blocks[%d]", i)
        -			continue
        -		}
        -		s.checkBlock(b, i)
        -	}
        -	if fn.Recover != nil && fn.Blocks[fn.Recover.Index] != fn.Recover {
        -		s.errorf("Recover block is not in Blocks slice")
        -	}
        -
        -	s.block = nil
        -	for i, anon := range fn.AnonFuncs {
        -		if anon.Parent() != fn {
        -			s.errorf("AnonFuncs[%d]=%s but %s.Parent()=%s", i, anon, anon, anon.Parent())
        -		}
        -	}
        -	s.fn = nil
        -	return !s.insane
        -}
        -
        -// sanityCheckPackage checks invariants of packages upon creation.
        -// It does not require that the package is built.
        -// Unlike sanityCheck (for functions), it just panics at the first error.
        -func sanityCheckPackage(pkg *Package) {
        -	if pkg.Pkg == nil {
        -		panic(fmt.Sprintf("Package %s has no Object", pkg))
        -	}
        -	_ = pkg.String() // must not crash
        -
        -	for name, mem := range pkg.Members {
        -		if name != mem.Name() {
        -			panic(fmt.Sprintf("%s: %T.Name() = %s, want %s",
        -				pkg.Pkg.Path(), mem, mem.Name(), name))
        -		}
        -		obj := mem.Object()
        -		if obj == nil {
        -			// This check is sound because fields
        -			// {Global,Function}.object have type
        -			// types.Object.  (If they were declared as
        -			// *types.{Var,Func}, we'd have a non-empty
        -			// interface containing a nil pointer.)
        -
        -			continue // not all members have typechecker objects
        -		}
        -		if obj.Name() != name {
        -			if obj.Name() == "init" && strings.HasPrefix(mem.Name(), "init#") {
        -				// Ok.  The name of a declared init function varies between
        -				// its types.Func ("init") and its ssa.Function ("init#%d").
        -			} else {
        -				panic(fmt.Sprintf("%s: %T.Object().Name() = %s, want %s",
        -					pkg.Pkg.Path(), mem, obj.Name(), name))
        -			}
        -		}
        -		if obj.Pos() != mem.Pos() {
        -			panic(fmt.Sprintf("%s Pos=%d obj.Pos=%d", mem, mem.Pos(), obj.Pos()))
        -		}
        -	}
        -}
        diff --git a/vendor/honnef.co/go/tools/ssa/source.go b/vendor/honnef.co/go/tools/ssa/source.go
        deleted file mode 100644
        index 8d9cca170..000000000
        --- a/vendor/honnef.co/go/tools/ssa/source.go
        +++ /dev/null
        @@ -1,293 +0,0 @@
        -// Copyright 2013 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package ssa
        -
        -// This file defines utilities for working with source positions
        -// or source-level named entities ("objects").
        -
        -// TODO(adonovan): test that {Value,Instruction}.Pos() positions match
        -// the originating syntax, as specified.
        -
        -import (
        -	"go/ast"
        -	"go/token"
        -	"go/types"
        -)
        -
        -// EnclosingFunction returns the function that contains the syntax
        -// node denoted by path.
        -//
        -// Syntax associated with package-level variable specifications is
        -// enclosed by the package's init() function.
        -//
        -// Returns nil if not found; reasons might include:
        -//    - the node is not enclosed by any function.
        -//    - the node is within an anonymous function (FuncLit) and
        -//      its SSA function has not been created yet
        -//      (pkg.Build() has not yet been called).
        -//
        -func EnclosingFunction(pkg *Package, path []ast.Node) *Function {
        -	// Start with package-level function...
        -	fn := findEnclosingPackageLevelFunction(pkg, path)
        -	if fn == nil {
        -		return nil // not in any function
        -	}
        -
        -	// ...then walk down the nested anonymous functions.
        -	n := len(path)
        -outer:
        -	for i := range path {
        -		if lit, ok := path[n-1-i].(*ast.FuncLit); ok {
        -			for _, anon := range fn.AnonFuncs {
        -				if anon.Pos() == lit.Type.Func {
        -					fn = anon
        -					continue outer
        -				}
        -			}
        -			// SSA function not found:
        -			// - package not yet built, or maybe
        -			// - builder skipped FuncLit in dead block
        -			//   (in principle; but currently the Builder
        -			//   generates even dead FuncLits).
        -			return nil
        -		}
        -	}
        -	return fn
        -}
        -
        -// HasEnclosingFunction returns true if the AST node denoted by path
        -// is contained within the declaration of some function or
        -// package-level variable.
        -//
        -// Unlike EnclosingFunction, the behaviour of this function does not
        -// depend on whether SSA code for pkg has been built, so it can be
        -// used to quickly reject check inputs that will cause
        -// EnclosingFunction to fail, prior to SSA building.
        -//
        -func HasEnclosingFunction(pkg *Package, path []ast.Node) bool {
        -	return findEnclosingPackageLevelFunction(pkg, path) != nil
        -}
        -
        -// findEnclosingPackageLevelFunction returns the Function
        -// corresponding to the package-level function enclosing path.
        -//
        -func findEnclosingPackageLevelFunction(pkg *Package, path []ast.Node) *Function {
        -	if n := len(path); n >= 2 { // [... {Gen,Func}Decl File]
        -		switch decl := path[n-2].(type) {
        -		case *ast.GenDecl:
        -			if decl.Tok == token.VAR && n >= 3 {
        -				// Package-level 'var' initializer.
        -				return pkg.init
        -			}
        -
        -		case *ast.FuncDecl:
        -			if decl.Recv == nil && decl.Name.Name == "init" {
        -				// Explicit init() function.
        -				for _, b := range pkg.init.Blocks {
        -					for _, instr := range b.Instrs {
        -						if instr, ok := instr.(*Call); ok {
        -							if callee, ok := instr.Call.Value.(*Function); ok && callee.Pkg == pkg && callee.Pos() == decl.Name.NamePos {
        -								return callee
        -							}
        -						}
        -					}
        -				}
        -				// Hack: return non-nil when SSA is not yet
        -				// built so that HasEnclosingFunction works.
        -				return pkg.init
        -			}
        -			// Declared function/method.
        -			return findNamedFunc(pkg, decl.Name.NamePos)
        -		}
        -	}
        -	return nil // not in any function
        -}
        -
        -// findNamedFunc returns the named function whose FuncDecl.Ident is at
        -// position pos.
        -//
        -func findNamedFunc(pkg *Package, pos token.Pos) *Function {
        -	// Look at all package members and method sets of named types.
        -	// Not very efficient.
        -	for _, mem := range pkg.Members {
        -		switch mem := mem.(type) {
        -		case *Function:
        -			if mem.Pos() == pos {
        -				return mem
        -			}
        -		case *Type:
        -			mset := pkg.Prog.MethodSets.MethodSet(types.NewPointer(mem.Type()))
        -			for i, n := 0, mset.Len(); i < n; i++ {
        -				// Don't call Program.Method: avoid creating wrappers.
        -				obj := mset.At(i).Obj().(*types.Func)
        -				if obj.Pos() == pos {
        -					return pkg.values[obj].(*Function)
        -				}
        -			}
        -		}
        -	}
        -	return nil
        -}
        -
        -// ValueForExpr returns the SSA Value that corresponds to non-constant
        -// expression e.
        -//
        -// It returns nil if no value was found, e.g.
        -//    - the expression is not lexically contained within f;
        -//    - f was not built with debug information; or
        -//    - e is a constant expression.  (For efficiency, no debug
        -//      information is stored for constants. Use
        -//      go/types.Info.Types[e].Value instead.)
        -//    - e is a reference to nil or a built-in function.
        -//    - the value was optimised away.
        -//
        -// If e is an addressable expression used in an lvalue context,
        -// value is the address denoted by e, and isAddr is true.
        -//
        -// The types of e (or &e, if isAddr) and the result are equal
        -// (modulo "untyped" bools resulting from comparisons).
        -//
        -// (Tip: to find the ssa.Value given a source position, use
        -// astutil.PathEnclosingInterval to locate the ast.Node, then
        -// EnclosingFunction to locate the Function, then ValueForExpr to find
        -// the ssa.Value.)
        -//
        -func (f *Function) ValueForExpr(e ast.Expr) (value Value, isAddr bool) {
        -	if f.debugInfo() { // (opt)
        -		e = unparen(e)
        -		for _, b := range f.Blocks {
        -			for _, instr := range b.Instrs {
        -				if ref, ok := instr.(*DebugRef); ok {
        -					if ref.Expr == e {
        -						return ref.X, ref.IsAddr
        -					}
        -				}
        -			}
        -		}
        -	}
        -	return
        -}
        -
        -// --- Lookup functions for source-level named entities (types.Objects) ---
        -
        -// Package returns the SSA Package corresponding to the specified
        -// type-checker package object.
        -// It returns nil if no such SSA package has been created.
        -//
        -func (prog *Program) Package(obj *types.Package) *Package {
        -	return prog.packages[obj]
        -}
        -
        -// packageLevelValue returns the package-level value corresponding to
        -// the specified named object, which may be a package-level const
        -// (*Const), var (*Global) or func (*Function) of some package in
        -// prog.  It returns nil if the object is not found.
        -//
        -func (prog *Program) packageLevelValue(obj types.Object) Value {
        -	if pkg, ok := prog.packages[obj.Pkg()]; ok {
        -		return pkg.values[obj]
        -	}
        -	return nil
        -}
        -
        -// FuncValue returns the concrete Function denoted by the source-level
        -// named function obj, or nil if obj denotes an interface method.
        -//
        -// TODO(adonovan): check the invariant that obj.Type() matches the
        -// result's Signature, both in the params/results and in the receiver.
        -//
        -func (prog *Program) FuncValue(obj *types.Func) *Function {
        -	fn, _ := prog.packageLevelValue(obj).(*Function)
        -	return fn
        -}
        -
        -// ConstValue returns the SSA Value denoted by the source-level named
        -// constant obj.
        -//
        -func (prog *Program) ConstValue(obj *types.Const) *Const {
        -	// TODO(adonovan): opt: share (don't reallocate)
        -	// Consts for const objects and constant ast.Exprs.
        -
        -	// Universal constant? {true,false,nil}
        -	if obj.Parent() == types.Universe {
        -		return NewConst(obj.Val(), obj.Type())
        -	}
        -	// Package-level named constant?
        -	if v := prog.packageLevelValue(obj); v != nil {
        -		return v.(*Const)
        -	}
        -	return NewConst(obj.Val(), obj.Type())
        -}
        -
        -// VarValue returns the SSA Value that corresponds to a specific
        -// identifier denoting the source-level named variable obj.
        -//
        -// VarValue returns nil if a local variable was not found, perhaps
        -// because its package was not built, the debug information was not
        -// requested during SSA construction, or the value was optimized away.
        -//
        -// ref is the path to an ast.Ident (e.g. from PathEnclosingInterval),
        -// and that ident must resolve to obj.
        -//
        -// pkg is the package enclosing the reference.  (A reference to a var
        -// always occurs within a function, so we need to know where to find it.)
        -//
        -// If the identifier is a field selector and its base expression is
        -// non-addressable, then VarValue returns the value of that field.
        -// For example:
        -//    func f() struct {x int}
        -//    f().x  // VarValue(x) returns a *Field instruction of type int
        -//
        -// All other identifiers denote addressable locations (variables).
        -// For them, VarValue may return either the variable's address or its
        -// value, even when the expression is evaluated only for its value; the
        -// situation is reported by isAddr, the second component of the result.
        -//
        -// If !isAddr, the returned value is the one associated with the
        -// specific identifier.  For example,
        -//       var x int    // VarValue(x) returns Const 0 here
        -//       x = 1        // VarValue(x) returns Const 1 here
        -//
        -// It is not specified whether the value or the address is returned in
        -// any particular case, as it may depend upon optimizations performed
        -// during SSA code generation, such as registerization, constant
        -// folding, avoidance of materialization of subexpressions, etc.
        -//
        -func (prog *Program) VarValue(obj *types.Var, pkg *Package, ref []ast.Node) (value Value, isAddr bool) {
        -	// All references to a var are local to some function, possibly init.
        -	fn := EnclosingFunction(pkg, ref)
        -	if fn == nil {
        -		return // e.g. def of struct field; SSA not built?
        -	}
        -
        -	id := ref[0].(*ast.Ident)
        -
        -	// Defining ident of a parameter?
        -	if id.Pos() == obj.Pos() {
        -		for _, param := range fn.Params {
        -			if param.Object() == obj {
        -				return param, false
        -			}
        -		}
        -	}
        -
        -	// Other ident?
        -	for _, b := range fn.Blocks {
        -		for _, instr := range b.Instrs {
        -			if dr, ok := instr.(*DebugRef); ok {
        -				if dr.Pos() == id.Pos() {
        -					return dr.X, dr.IsAddr
        -				}
        -			}
        -		}
        -	}
        -
        -	// Defining ident of package-level var?
        -	if v := prog.packageLevelValue(obj); v != nil {
        -		return v.(*Global), true
        -	}
        -
        -	return // e.g. debug info not requested, or var optimized away
        -}
        diff --git a/vendor/honnef.co/go/tools/ssa/ssa.go b/vendor/honnef.co/go/tools/ssa/ssa.go
        deleted file mode 100644
        index aeddd65e5..000000000
        --- a/vendor/honnef.co/go/tools/ssa/ssa.go
        +++ /dev/null
        @@ -1,1745 +0,0 @@
        -// Copyright 2013 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package ssa
        -
        -// This package defines a high-level intermediate representation for
        -// Go programs using static single-assignment (SSA) form.
        -
        -import (
        -	"fmt"
        -	"go/ast"
        -	"go/constant"
        -	"go/token"
        -	"go/types"
        -	"sync"
        -
        -	"golang.org/x/tools/go/types/typeutil"
        -)
        -
        -// A Program is a partial or complete Go program converted to SSA form.
        -type Program struct {
        -	Fset       *token.FileSet              // position information for the files of this Program
        -	imported   map[string]*Package         // all importable Packages, keyed by import path
        -	packages   map[*types.Package]*Package // all loaded Packages, keyed by object
        -	mode       BuilderMode                 // set of mode bits for SSA construction
        -	MethodSets typeutil.MethodSetCache     // cache of type-checker's method-sets
        -
        -	methodsMu    sync.Mutex                 // guards the following maps:
        -	methodSets   typeutil.Map               // maps type to its concrete methodSet
        -	runtimeTypes typeutil.Map               // types for which rtypes are needed
        -	canon        typeutil.Map               // type canonicalization map
        -	bounds       map[*types.Func]*Function  // bounds for curried x.Method closures
        -	thunks       map[selectionKey]*Function // thunks for T.Method expressions
        -}
        -
        -// A Package is a single analyzed Go package containing Members for
        -// all package-level functions, variables, constants and types it
        -// declares.  These may be accessed directly via Members, or via the
        -// type-specific accessor methods Func, Type, Var and Const.
        -//
        -// Members also contains entries for "init" (the synthetic package
        -// initializer) and "init#%d", the nth declared init function,
        -// and unspecified other things too.
        -//
        -type Package struct {
        -	Prog    *Program               // the owning program
        -	Pkg     *types.Package         // the corresponding go/types.Package
        -	Members map[string]Member      // all package members keyed by name (incl. init and init#%d)
        -	values  map[types.Object]Value // package members (incl. types and methods), keyed by object
        -	init    *Function              // Func("init"); the package's init function
        -	debug   bool                   // include full debug info in this package
        -
        -	// The following fields are set transiently, then cleared
        -	// after building.
        -	buildOnce sync.Once   // ensures package building occurs once
        -	ninit     int32       // number of init functions
        -	info      *types.Info // package type information
        -	files     []*ast.File // package ASTs
        -}
        -
        -// A Member is a member of a Go package, implemented by *NamedConst,
        -// *Global, *Function, or *Type; they are created by package-level
        -// const, var, func and type declarations respectively.
        -//
        -type Member interface {
        -	Name() string                    // declared name of the package member
        -	String() string                  // package-qualified name of the package member
        -	RelString(*types.Package) string // like String, but relative refs are unqualified
        -	Object() types.Object            // typechecker's object for this member, if any
        -	Pos() token.Pos                  // position of member's declaration, if known
        -	Type() types.Type                // type of the package member
        -	Token() token.Token              // token.{VAR,FUNC,CONST,TYPE}
        -	Package() *Package               // the containing package
        -}
        -
        -// A Type is a Member of a Package representing a package-level named type.
        -type Type struct {
        -	object *types.TypeName
        -	pkg    *Package
        -}
        -
        -// A NamedConst is a Member of a Package representing a package-level
        -// named constant.
        -//
        -// Pos() returns the position of the declaring ast.ValueSpec.Names[*]
        -// identifier.
        -//
        -// NB: a NamedConst is not a Value; it contains a constant Value, which
        -// it augments with the name and position of its 'const' declaration.
        -//
        -type NamedConst struct {
        -	object *types.Const
        -	Value  *Const
        -	pkg    *Package
        -}
        -
        -// A Value is an SSA value that can be referenced by an instruction.
        -type Value interface {
        -	// Name returns the name of this value, and determines how
        -	// this Value appears when used as an operand of an
        -	// Instruction.
        -	//
        -	// This is the same as the source name for Parameters,
        -	// Builtins, Functions, FreeVars, Globals.
        -	// For constants, it is a representation of the constant's value
        -	// and type.  For all other Values this is the name of the
        -	// virtual register defined by the instruction.
        -	//
        -	// The name of an SSA Value is not semantically significant,
        -	// and may not even be unique within a function.
        -	Name() string
        -
        -	// If this value is an Instruction, String returns its
        -	// disassembled form; otherwise it returns unspecified
        -	// human-readable information about the Value, such as its
        -	// kind, name and type.
        -	String() string
        -
        -	// Type returns the type of this value.  Many instructions
        -	// (e.g. IndexAddr) change their behaviour depending on the
        -	// types of their operands.
        -	Type() types.Type
        -
        -	// Parent returns the function to which this Value belongs.
        -	// It returns nil for named Functions, Builtin, Const and Global.
        -	Parent() *Function
        -
        -	// Referrers returns the list of instructions that have this
        -	// value as one of their operands; it may contain duplicates
        -	// if an instruction has a repeated operand.
        -	//
        -	// Referrers actually returns a pointer through which the
        -	// caller may perform mutations to the object's state.
        -	//
        -	// Referrers is currently only defined if Parent()!=nil,
        -	// i.e. for the function-local values FreeVar, Parameter,
        -	// Functions (iff anonymous) and all value-defining instructions.
        -	// It returns nil for named Functions, Builtin, Const and Global.
        -	//
        -	// Instruction.Operands contains the inverse of this relation.
        -	Referrers() *[]Instruction
        -
        -	// Pos returns the location of the AST token most closely
        -	// associated with the operation that gave rise to this value,
        -	// or token.NoPos if it was not explicit in the source.
        -	//
        -	// For each ast.Node type, a particular token is designated as
        -	// the closest location for the expression, e.g. the Lparen
        -	// for an *ast.CallExpr.  This permits a compact but
        -	// approximate mapping from Values to source positions for use
        -	// in diagnostic messages, for example.
        -	//
        -	// (Do not use this position to determine which Value
        -	// corresponds to an ast.Expr; use Function.ValueForExpr
        -	// instead.  NB: it requires that the function was built with
        -	// debug information.)
        -	Pos() token.Pos
        -}
        -
        -// An Instruction is an SSA instruction that computes a new Value or
        -// has some effect.
        -//
        -// An Instruction that defines a value (e.g. BinOp) also implements
        -// the Value interface; an Instruction that only has an effect (e.g. Store)
        -// does not.
        -//
        -type Instruction interface {
        -	// String returns the disassembled form of this value.
        -	//
        -	// Examples of Instructions that are Values:
        -	//       "x + y"     (BinOp)
        -	//       "len([])"   (Call)
        -	// Note that the name of the Value is not printed.
        -	//
        -	// Examples of Instructions that are not Values:
        -	//       "return x"  (Return)
        -	//       "*y = x"    (Store)
        -	//
        -	// (The separation Value.Name() from Value.String() is useful
        -	// for some analyses which distinguish the operation from the
        -	// value it defines, e.g., 'y = local int' is both an allocation
        -	// of memory 'local int' and a definition of a pointer y.)
        -	String() string
        -
        -	// Parent returns the function to which this instruction
        -	// belongs.
        -	Parent() *Function
        -
        -	// Block returns the basic block to which this instruction
        -	// belongs.
        -	Block() *BasicBlock
        -
        -	// setBlock sets the basic block to which this instruction belongs.
        -	setBlock(*BasicBlock)
        -
        -	// Operands returns the operands of this instruction: the
        -	// set of Values it references.
        -	//
        -	// Specifically, it appends their addresses to rands, a
        -	// user-provided slice, and returns the resulting slice,
        -	// permitting avoidance of memory allocation.
        -	//
        -	// The operands are appended in undefined order, but the order
        -	// is consistent for a given Instruction; the addresses are
        -	// always non-nil but may point to a nil Value.  Clients may
        -	// store through the pointers, e.g. to effect a value
        -	// renaming.
        -	//
        -	// Value.Referrers is a subset of the inverse of this
        -	// relation.  (Referrers are not tracked for all types of
        -	// Values.)
        -	Operands(rands []*Value) []*Value
        -
        -	// Pos returns the location of the AST token most closely
        -	// associated with the operation that gave rise to this
        -	// instruction, or token.NoPos if it was not explicit in the
        -	// source.
        -	//
        -	// For each ast.Node type, a particular token is designated as
        -	// the closest location for the expression, e.g. the Go token
        -	// for an *ast.GoStmt.  This permits a compact but approximate
        -	// mapping from Instructions to source positions for use in
        -	// diagnostic messages, for example.
        -	//
        -	// (Do not use this position to determine which Instruction
        -	// corresponds to an ast.Expr; see the notes for Value.Pos.
        -	// This position may be used to determine which non-Value
        -	// Instruction corresponds to some ast.Stmts, but not all: If
        -	// and Jump instructions have no Pos(), for example.)
        -	Pos() token.Pos
        -}
        -
        -// A Node is a node in the SSA value graph.  Every concrete type that
        -// implements Node is also either a Value, an Instruction, or both.
        -//
        -// Node contains the methods common to Value and Instruction, plus the
        -// Operands and Referrers methods generalized to return nil for
        -// non-Instructions and non-Values, respectively.
        -//
        -// Node is provided to simplify SSA graph algorithms.  Clients should
        -// use the more specific and informative Value or Instruction
        -// interfaces where appropriate.
        -//
        -type Node interface {
        -	// Common methods:
        -	String() string
        -	Pos() token.Pos
        -	Parent() *Function
        -
        -	// Partial methods:
        -	Operands(rands []*Value) []*Value // nil for non-Instructions
        -	Referrers() *[]Instruction        // nil for non-Values
        -}
        -
        -// Function represents the parameters, results, and code of a function
        -// or method.
        -//
        -// If Blocks is nil, this indicates an external function for which no
        -// Go source code is available.  In this case, FreeVars and Locals
        -// are nil too.  Clients performing whole-program analysis must
        -// handle external functions specially.
        -//
        -// Blocks contains the function's control-flow graph (CFG).
        -// Blocks[0] is the function entry point; block order is not otherwise
        -// semantically significant, though it may affect the readability of
        -// the disassembly.
        -// To iterate over the blocks in dominance order, use DomPreorder().
        -//
        -// Recover is an optional second entry point to which control resumes
        -// after a recovered panic.  The Recover block may contain only a return
        -// statement, preceded by a load of the function's named return
        -// parameters, if any.
        -//
        -// A nested function (Parent()!=nil) that refers to one or more
        -// lexically enclosing local variables ("free variables") has FreeVars.
        -// Such functions cannot be called directly but require a
        -// value created by MakeClosure which, via its Bindings, supplies
        -// values for these parameters.
        -//
        -// If the function is a method (Signature.Recv() != nil) then the first
        -// element of Params is the receiver parameter.
        -//
        -// A Go package may declare many functions called "init".
        -// For each one, Object().Name() returns "init" but Name() returns
        -// "init#1", etc, in declaration order.
        -//
        -// Pos() returns the declaring ast.FuncLit.Type.Func or the position
        -// of the ast.FuncDecl.Name, if the function was explicit in the
        -// source.  Synthetic wrappers, for which Synthetic != "", may share
        -// the same position as the function they wrap.
        -// Syntax.Pos() always returns the position of the declaring "func" token.
        -//
        -// Type() returns the function's Signature.
        -//
        -type Function struct {
        -	name      string
        -	object    types.Object     // a declared *types.Func or one of its wrappers
        -	method    *types.Selection // info about provenance of synthetic methods
        -	Signature *types.Signature
        -	pos       token.Pos
        -
        -	Synthetic string        // provenance of synthetic function; "" for true source functions
        -	syntax    ast.Node      // *ast.Func{Decl,Lit}; replaced with simple ast.Node after build, unless debug mode
        -	parent    *Function     // enclosing function if anon; nil if global
        -	Pkg       *Package      // enclosing package; nil for shared funcs (wrappers and error.Error)
        -	Prog      *Program      // enclosing program
        -	Params    []*Parameter  // function parameters; for methods, includes receiver
        -	FreeVars  []*FreeVar    // free variables whose values must be supplied by closure
        -	Locals    []*Alloc      // local variables of this function
        -	Blocks    []*BasicBlock // basic blocks of the function; nil => external
        -	Recover   *BasicBlock   // optional; control transfers here after recovered panic
        -	AnonFuncs []*Function   // anonymous functions directly beneath this one
        -	referrers []Instruction // referring instructions (iff Parent() != nil)
        -
        -	// The following fields are set transiently during building,
        -	// then cleared.
        -	currentBlock *BasicBlock             // where to emit code
        -	objects      map[types.Object]Value  // addresses of local variables
        -	namedResults []*Alloc                // tuple of named results
        -	targets      *targets                // linked stack of branch targets
        -	lblocks      map[*ast.Object]*lblock // labelled blocks
        -}
        -
        -// BasicBlock represents an SSA basic block.
        -//
        -// The final element of Instrs is always an explicit transfer of
        -// control (If, Jump, Return, or Panic).
        -//
        -// A block may contain no Instructions only if it is unreachable,
        -// i.e., Preds is nil.  Empty blocks are typically pruned.
        -//
        -// BasicBlocks and their Preds/Succs relation form a (possibly cyclic)
        -// graph independent of the SSA Value graph: the control-flow graph or
        -// CFG.  It is illegal for multiple edges to exist between the same
        -// pair of blocks.
        -//
        -// Each BasicBlock is also a node in the dominator tree of the CFG.
        -// The tree may be navigated using Idom()/Dominees() and queried using
        -// Dominates().
        -//
        -// The order of Preds and Succs is significant (to Phi and If
        -// instructions, respectively).
        -//
        -type BasicBlock struct {
        -	Index        int            // index of this block within Parent().Blocks
        -	Comment      string         // optional label; no semantic significance
        -	parent       *Function      // parent function
        -	Instrs       []Instruction  // instructions in order
        -	Preds, Succs []*BasicBlock  // predecessors and successors
        -	succs2       [2]*BasicBlock // initial space for Succs
        -	dom          domInfo        // dominator tree info
        -	gaps         int            // number of nil Instrs (transient)
        -	rundefers    int            // number of rundefers (transient)
        -}
        -
        -// Pure values ----------------------------------------
        -
        -// A FreeVar represents a free variable of the function to which it
        -// belongs.
        -//
        -// FreeVars are used to implement anonymous functions, whose free
        -// variables are lexically captured in a closure formed by
        -// MakeClosure.  The value of such a free var is an Alloc or another
        -// FreeVar and is considered a potentially escaping heap address, with
        -// pointer type.
        -//
        -// FreeVars are also used to implement bound method closures.  Such a
        -// free var represents the receiver value and may be of any type that
        -// has concrete methods.
        -//
        -// Pos() returns the position of the value that was captured, which
        -// belongs to an enclosing function.
        -//
        -type FreeVar struct {
        -	name      string
        -	typ       types.Type
        -	pos       token.Pos
        -	parent    *Function
        -	referrers []Instruction
        -
        -	// Transiently needed during building.
        -	outer Value // the Value captured from the enclosing context.
        -}
        -
        -// A Parameter represents an input parameter of a function.
        -//
        -type Parameter struct {
        -	name      string
        -	object    types.Object // a *types.Var; nil for non-source locals
        -	typ       types.Type
        -	pos       token.Pos
        -	parent    *Function
        -	referrers []Instruction
        -}
        -
        -// A Const represents the value of a constant expression.
        -//
        -// The underlying type of a constant may be any boolean, numeric, or
        -// string type.  In addition, a Const may represent the nil value of
        -// any reference type---interface, map, channel, pointer, slice, or
        -// function---but not "untyped nil".
        -//
        -// All source-level constant expressions are represented by a Const
        -// of the same type and value.
        -//
        -// Value holds the exact value of the constant, independent of its
        -// Type(), using the same representation as package go/constant uses for
        -// constants, or nil for a typed nil value.
        -//
        -// Pos() returns token.NoPos.
        -//
        -// Example printed form:
        -// 	42:int
        -//	"hello":untyped string
        -//	3+4i:MyComplex
        -//
        -type Const struct {
        -	typ   types.Type
        -	Value constant.Value
        -}
        -
        -// A Global is a named Value holding the address of a package-level
        -// variable.
        -//
        -// Pos() returns the position of the ast.ValueSpec.Names[*]
        -// identifier.
        -//
        -type Global struct {
        -	name   string
        -	object types.Object // a *types.Var; may be nil for synthetics e.g. init$guard
        -	typ    types.Type
        -	pos    token.Pos
        -
        -	Pkg *Package
        -}
        -
        -// A Builtin represents a specific use of a built-in function, e.g. len.
        -//
        -// Builtins are immutable values.  Builtins do not have addresses.
        -// Builtins can only appear in CallCommon.Func.
        -//
        -// Name() indicates the function: one of the built-in functions from the
        -// Go spec (excluding "make" and "new") or one of these ssa-defined
        -// intrinsics:
        -//
        -//   // wrapnilchk returns ptr if non-nil, panics otherwise.
        -//   // (For use in indirection wrappers.)
        -//   func ssa:wrapnilchk(ptr *T, recvType, methodName string) *T
        -//
        -// Object() returns a *types.Builtin for built-ins defined by the spec,
        -// nil for others.
        -//
        -// Type() returns a *types.Signature representing the effective
        -// signature of the built-in for this call.
        -//
        -type Builtin struct {
        -	name string
        -	sig  *types.Signature
        -}
        -
        -// Value-defining instructions  ----------------------------------------
        -
        -// The Alloc instruction reserves space for a variable of the given type,
        -// zero-initializes it, and yields its address.
        -//
        -// Alloc values are always addresses, and have pointer types, so the
        -// type of the allocated variable is actually
        -// Type().Underlying().(*types.Pointer).Elem().
        -//
        -// If Heap is false, Alloc allocates space in the function's
        -// activation record (frame); we refer to an Alloc(Heap=false) as a
        -// "local" alloc.  Each local Alloc returns the same address each time
        -// it is executed within the same activation; the space is
        -// re-initialized to zero.
        -//
        -// If Heap is true, Alloc allocates space in the heap; we
        -// refer to an Alloc(Heap=true) as a "new" alloc.  Each new Alloc
        -// returns a different address each time it is executed.
        -//
        -// When Alloc is applied to a channel, map or slice type, it returns
        -// the address of an uninitialized (nil) reference of that kind; store
        -// the result of MakeSlice, MakeMap or MakeChan in that location to
        -// instantiate these types.
        -//
        -// Pos() returns the ast.CompositeLit.Lbrace for a composite literal,
        -// or the ast.CallExpr.Rparen for a call to new() or for a call that
        -// allocates a varargs slice.
        -//
        -// Example printed form:
        -// 	t0 = local int
        -// 	t1 = new int
        -//
        -type Alloc struct {
        -	register
        -	Comment string
        -	Heap    bool
        -	index   int // dense numbering; for lifting
        -}
        -
        -var _ Instruction = (*Sigma)(nil)
        -var _ Value = (*Sigma)(nil)
        -
        -type Sigma struct {
        -	register
        -	X      Value
        -	Branch bool
        -}
        -
        -func (p *Sigma) Value() Value {
        -	v := p.X
        -	for {
        -		sigma, ok := v.(*Sigma)
        -		if !ok {
        -			break
        -		}
        -		v = sigma
        -	}
        -	return v
        -}
        -
        -func (p *Sigma) String() string {
        -	return fmt.Sprintf("σ [%s.%t]", relName(p.X, p), p.Branch)
        -}
        -
        -// The Phi instruction represents an SSA φ-node, which combines values
        -// that differ across incoming control-flow edges and yields a new
        -// value.  Within a block, all φ-nodes must appear before all non-φ
        -// nodes.
        -//
        -// Pos() returns the position of the && or || for short-circuit
        -// control-flow joins, or that of the *Alloc for φ-nodes inserted
        -// during SSA renaming.
        -//
        -// Example printed form:
        -// 	t2 = phi [0: t0, 1: t1]
        -//
        -type Phi struct {
        -	register
        -	Comment string  // a hint as to its purpose
        -	Edges   []Value // Edges[i] is value for Block().Preds[i]
        -}
        -
        -// The Call instruction represents a function or method call.
        -//
        -// The Call instruction yields the function result if there is exactly
        -// one.  Otherwise it returns a tuple, the components of which are
        -// accessed via Extract.
        -//
        -// See CallCommon for generic function call documentation.
        -//
        -// Pos() returns the ast.CallExpr.Lparen, if explicit in the source.
        -//
        -// Example printed form:
        -// 	t2 = println(t0, t1)
        -// 	t4 = t3()
        -// 	t7 = invoke t5.Println(...t6)
        -//
        -type Call struct {
        -	register
        -	Call CallCommon
        -}
        -
        -// The BinOp instruction yields the result of binary operation X Op Y.
        -//
        -// Pos() returns the ast.BinaryExpr.OpPos, if explicit in the source.
        -//
        -// Example printed form:
        -// 	t1 = t0 + 1:int
        -//
        -type BinOp struct {
        -	register
        -	// One of:
        -	// ADD SUB MUL QUO REM          + - * / %
        -	// AND OR XOR SHL SHR AND_NOT   & | ^ << >> &^
        -	// EQL NEQ LSS LEQ GTR GEQ      == != < <= < >=
        -	Op   token.Token
        -	X, Y Value
        -}
        -
        -// The UnOp instruction yields the result of Op X.
        -// ARROW is channel receive.
        -// MUL is pointer indirection (load).
        -// XOR is bitwise complement.
        -// SUB is negation.
        -// NOT is logical negation.
        -//
        -// If CommaOk and Op=ARROW, the result is a 2-tuple of the value above
        -// and a boolean indicating the success of the receive.  The
        -// components of the tuple are accessed using Extract.
        -//
        -// Pos() returns the ast.UnaryExpr.OpPos, if explicit in the source.
        -// For receive operations (ARROW) implicit in ranging over a channel,
        -// Pos() returns the ast.RangeStmt.For.
        -// For implicit memory loads (STAR), Pos() returns the position of the
        -// most closely associated source-level construct; the details are not
        -// specified.
        -//
        -// Example printed form:
        -// 	t0 = *x
        -// 	t2 = <-t1,ok
        -//
        -type UnOp struct {
        -	register
        -	Op      token.Token // One of: NOT SUB ARROW MUL XOR ! - <- * ^
        -	X       Value
        -	CommaOk bool
        -}
        -
        -// The ChangeType instruction applies to X a value-preserving type
        -// change to Type().
        -//
        -// Type changes are permitted:
        -//    - between a named type and its underlying type.
        -//    - between two named types of the same underlying type.
        -//    - between (possibly named) pointers to identical base types.
        -//    - from a bidirectional channel to a read- or write-channel,
        -//      optionally adding/removing a name.
        -//
        -// This operation cannot fail dynamically.
        -//
        -// Pos() returns the ast.CallExpr.Lparen, if the instruction arose
        -// from an explicit conversion in the source.
        -//
        -// Example printed form:
        -// 	t1 = changetype *int <- IntPtr (t0)
        -//
        -type ChangeType struct {
        -	register
        -	X Value
        -}
        -
        -// The Convert instruction yields the conversion of value X to type
        -// Type().  One or both of those types is basic (but possibly named).
        -//
        -// A conversion may change the value and representation of its operand.
        -// Conversions are permitted:
        -//    - between real numeric types.
        -//    - between complex numeric types.
        -//    - between string and []byte or []rune.
        -//    - between pointers and unsafe.Pointer.
        -//    - between unsafe.Pointer and uintptr.
        -//    - from (Unicode) integer to (UTF-8) string.
        -// A conversion may imply a type name change also.
        -//
        -// This operation cannot fail dynamically.
        -//
        -// Conversions of untyped string/number/bool constants to a specific
        -// representation are eliminated during SSA construction.
        -//
        -// Pos() returns the ast.CallExpr.Lparen, if the instruction arose
        -// from an explicit conversion in the source.
        -//
        -// Example printed form:
        -// 	t1 = convert []byte <- string (t0)
        -//
        -type Convert struct {
        -	register
        -	X Value
        -}
        -
        -// ChangeInterface constructs a value of one interface type from a
        -// value of another interface type known to be assignable to it.
        -// This operation cannot fail.
        -//
        -// Pos() returns the ast.CallExpr.Lparen if the instruction arose from
        -// an explicit T(e) conversion; the ast.TypeAssertExpr.Lparen if the
        -// instruction arose from an explicit e.(T) operation; or token.NoPos
        -// otherwise.
        -//
        -// Example printed form:
        -// 	t1 = change interface interface{} <- I (t0)
        -//
        -type ChangeInterface struct {
        -	register
        -	X Value
        -}
        -
        -// MakeInterface constructs an instance of an interface type from a
        -// value of a concrete type.
        -//
        -// Use Program.MethodSets.MethodSet(X.Type()) to find the method-set
        -// of X, and Program.MethodValue(m) to find the implementation of a method.
        -//
        -// To construct the zero value of an interface type T, use:
        -// 	NewConst(constant.MakeNil(), T, pos)
        -//
        -// Pos() returns the ast.CallExpr.Lparen, if the instruction arose
        -// from an explicit conversion in the source.
        -//
        -// Example printed form:
        -// 	t1 = make interface{} <- int (42:int)
        -// 	t2 = make Stringer <- t0
        -//
        -type MakeInterface struct {
        -	register
        -	X Value
        -}
        -
        -// The MakeClosure instruction yields a closure value whose code is
        -// Fn and whose free variables' values are supplied by Bindings.
        -//
        -// Type() returns a (possibly named) *types.Signature.
        -//
        -// Pos() returns the ast.FuncLit.Type.Func for a function literal
        -// closure or the ast.SelectorExpr.Sel for a bound method closure.
        -//
        -// Example printed form:
        -// 	t0 = make closure anon@1.2 [x y z]
        -// 	t1 = make closure bound$(main.I).add [i]
        -//
        -type MakeClosure struct {
        -	register
        -	Fn       Value   // always a *Function
        -	Bindings []Value // values for each free variable in Fn.FreeVars
        -}
        -
        -// The MakeMap instruction creates a new hash-table-based map object
        -// and yields a value of kind map.
        -//
        -// Type() returns a (possibly named) *types.Map.
        -//
        -// Pos() returns the ast.CallExpr.Lparen, if created by make(map), or
        -// the ast.CompositeLit.Lbrack if created by a literal.
        -//
        -// Example printed form:
        -// 	t1 = make map[string]int t0
        -// 	t1 = make StringIntMap t0
        -//
        -type MakeMap struct {
        -	register
        -	Reserve Value // initial space reservation; nil => default
        -}
        -
        -// The MakeChan instruction creates a new channel object and yields a
        -// value of kind chan.
        -//
        -// Type() returns a (possibly named) *types.Chan.
        -//
        -// Pos() returns the ast.CallExpr.Lparen for the make(chan) that
        -// created it.
        -//
        -// Example printed form:
        -// 	t0 = make chan int 0
        -// 	t0 = make IntChan 0
        -//
        -type MakeChan struct {
        -	register
        -	Size Value // int; size of buffer; zero => synchronous.
        -}
        -
        -// The MakeSlice instruction yields a slice of length Len backed by a
        -// newly allocated array of length Cap.
        -//
        -// Both Len and Cap must be non-nil Values of integer type.
        -//
        -// (Alloc(types.Array) followed by Slice will not suffice because
        -// Alloc can only create arrays of constant length.)
        -//
        -// Type() returns a (possibly named) *types.Slice.
        -//
        -// Pos() returns the ast.CallExpr.Lparen for the make([]T) that
        -// created it.
        -//
        -// Example printed form:
        -// 	t1 = make []string 1:int t0
        -// 	t1 = make StringSlice 1:int t0
        -//
        -type MakeSlice struct {
        -	register
        -	Len Value
        -	Cap Value
        -}
        -
        -// The Slice instruction yields a slice of an existing string, slice
        -// or *array X between optional integer bounds Low and High.
        -//
        -// Dynamically, this instruction panics if X evaluates to a nil *array
        -// pointer.
        -//
        -// Type() returns string if the type of X was string, otherwise a
        -// *types.Slice with the same element type as X.
        -//
        -// Pos() returns the ast.SliceExpr.Lbrack if created by a x[:] slice
        -// operation, the ast.CompositeLit.Lbrace if created by a literal, or
        -// NoPos if not explicit in the source (e.g. a variadic argument slice).
        -//
        -// Example printed form:
        -// 	t1 = slice t0[1:]
        -//
        -type Slice struct {
        -	register
        -	X              Value // slice, string, or *array
        -	Low, High, Max Value // each may be nil
        -}
        -
        -// The FieldAddr instruction yields the address of Field of *struct X.
        -//
        -// The field is identified by its index within the field list of the
        -// struct type of X.
        -//
        -// Dynamically, this instruction panics if X evaluates to a nil
        -// pointer.
        -//
        -// Type() returns a (possibly named) *types.Pointer.
        -//
        -// Pos() returns the position of the ast.SelectorExpr.Sel for the
        -// field, if explicit in the source.
        -//
        -// Example printed form:
        -// 	t1 = &t0.name [#1]
        -//
        -type FieldAddr struct {
        -	register
        -	X     Value // *struct
        -	Field int   // field is X.Type().Underlying().(*types.Pointer).Elem().Underlying().(*types.Struct).Field(Field)
        -}
        -
        -// The Field instruction yields the Field of struct X.
        -//
        -// The field is identified by its index within the field list of the
        -// struct type of X; by using numeric indices we avoid ambiguity of
        -// package-local identifiers and permit compact representations.
        -//
        -// Pos() returns the position of the ast.SelectorExpr.Sel for the
        -// field, if explicit in the source.
        -//
        -// Example printed form:
        -// 	t1 = t0.name [#1]
        -//
        -type Field struct {
        -	register
        -	X     Value // struct
        -	Field int   // index into X.Type().(*types.Struct).Fields
        -}
        -
        -// The IndexAddr instruction yields the address of the element at
        -// index Index of collection X.  Index is an integer expression.
        -//
        -// The elements of maps and strings are not addressable; use Lookup or
        -// MapUpdate instead.
        -//
        -// Dynamically, this instruction panics if X evaluates to a nil *array
        -// pointer.
        -//
        -// Type() returns a (possibly named) *types.Pointer.
        -//
        -// Pos() returns the ast.IndexExpr.Lbrack for the index operation, if
        -// explicit in the source.
        -//
        -// Example printed form:
        -// 	t2 = &t0[t1]
        -//
        -type IndexAddr struct {
        -	register
        -	X     Value // slice or *array,
        -	Index Value // numeric index
        -}
        -
        -// The Index instruction yields element Index of array X.
        -//
        -// Pos() returns the ast.IndexExpr.Lbrack for the index operation, if
        -// explicit in the source.
        -//
        -// Example printed form:
        -// 	t2 = t0[t1]
        -//
        -type Index struct {
        -	register
        -	X     Value // array
        -	Index Value // integer index
        -}
        -
        -// The Lookup instruction yields element Index of collection X, a map
        -// or string.  Index is an integer expression if X is a string or the
        -// appropriate key type if X is a map.
        -//
        -// If CommaOk, the result is a 2-tuple of the value above and a
        -// boolean indicating the result of a map membership test for the key.
        -// The components of the tuple are accessed using Extract.
        -//
        -// Pos() returns the ast.IndexExpr.Lbrack, if explicit in the source.
        -//
        -// Example printed form:
        -// 	t2 = t0[t1]
        -// 	t5 = t3[t4],ok
        -//
        -type Lookup struct {
        -	register
        -	X       Value // string or map
        -	Index   Value // numeric or key-typed index
        -	CommaOk bool  // return a value,ok pair
        -}
        -
        -// SelectState is a helper for Select.
        -// It represents one goal state and its corresponding communication.
        -//
        -type SelectState struct {
        -	Dir       types.ChanDir // direction of case (SendOnly or RecvOnly)
        -	Chan      Value         // channel to use (for send or receive)
        -	Send      Value         // value to send (for send)
        -	Pos       token.Pos     // position of token.ARROW
        -	DebugNode ast.Node      // ast.SendStmt or ast.UnaryExpr(<-) [debug mode]
        -}
        -
        -// The Select instruction tests whether (or blocks until) one
        -// of the specified sent or received states is entered.
        -//
        -// Let n be the number of States for which Dir==RECV and T_i (0<=i string iterator; false => map iterator.
        -}
        -
        -// The TypeAssert instruction tests whether interface value X has type
        -// AssertedType.
        -//
        -// If !CommaOk, on success it returns v, the result of the conversion
        -// (defined below); on failure it panics.
        -//
        -// If CommaOk: on success it returns a pair (v, true) where v is the
        -// result of the conversion; on failure it returns (z, false) where z
        -// is AssertedType's zero value.  The components of the pair must be
        -// accessed using the Extract instruction.
        -//
        -// If AssertedType is a concrete type, TypeAssert checks whether the
        -// dynamic type in interface X is equal to it, and if so, the result
        -// of the conversion is a copy of the value in the interface.
        -//
        -// If AssertedType is an interface, TypeAssert checks whether the
        -// dynamic type of the interface is assignable to it, and if so, the
        -// result of the conversion is a copy of the interface value X.
        -// If AssertedType is a superinterface of X.Type(), the operation will
        -// fail iff the operand is nil.  (Contrast with ChangeInterface, which
        -// performs no nil-check.)
        -//
        -// Type() reflects the actual type of the result, possibly a
        -// 2-types.Tuple; AssertedType is the asserted type.
        -//
        -// Pos() returns the ast.CallExpr.Lparen if the instruction arose from
        -// an explicit T(e) conversion; the ast.TypeAssertExpr.Lparen if the
        -// instruction arose from an explicit e.(T) operation; or the
        -// ast.CaseClause.Case if the instruction arose from a case of a
        -// type-switch statement.
        -//
        -// Example printed form:
        -// 	t1 = typeassert t0.(int)
        -// 	t3 = typeassert,ok t2.(T)
        -//
        -type TypeAssert struct {
        -	register
        -	X            Value
        -	AssertedType types.Type
        -	CommaOk      bool
        -}
        -
        -// The Extract instruction yields component Index of Tuple.
        -//
        -// This is used to access the results of instructions with multiple
        -// return values, such as Call, TypeAssert, Next, UnOp(ARROW) and
        -// IndexExpr(Map).
        -//
        -// Example printed form:
        -// 	t1 = extract t0 #1
        -//
        -type Extract struct {
        -	register
        -	Tuple Value
        -	Index int
        -}
        -
        -// Instructions executed for effect.  They do not yield a value. --------------------
        -
        -// The Jump instruction transfers control to the sole successor of its
        -// owning block.
        -//
        -// A Jump must be the last instruction of its containing BasicBlock.
        -//
        -// Pos() returns NoPos.
        -//
        -// Example printed form:
        -// 	jump done
        -//
        -type Jump struct {
        -	anInstruction
        -}
        -
        -// The If instruction transfers control to one of the two successors
        -// of its owning block, depending on the boolean Cond: the first if
        -// true, the second if false.
        -//
        -// An If instruction must be the last instruction of its containing
        -// BasicBlock.
        -//
        -// Pos() returns NoPos.
        -//
        -// Example printed form:
        -// 	if t0 goto done else body
        -//
        -type If struct {
        -	anInstruction
        -	Cond Value
        -}
        -
        -// The Return instruction returns values and control back to the calling
        -// function.
        -//
        -// len(Results) is always equal to the number of results in the
        -// function's signature.
        -//
        -// If len(Results) > 1, Return returns a tuple value with the specified
        -// components which the caller must access using Extract instructions.
        -//
        -// There is no instruction to return a ready-made tuple like those
        -// returned by a "value,ok"-mode TypeAssert, Lookup or UnOp(ARROW) or
        -// a tail-call to a function with multiple result parameters.
        -//
        -// Return must be the last instruction of its containing BasicBlock.
        -// Such a block has no successors.
        -//
        -// Pos() returns the ast.ReturnStmt.Return, if explicit in the source.
        -//
        -// Example printed form:
        -// 	return
        -// 	return nil:I, 2:int
        -//
        -type Return struct {
        -	anInstruction
        -	Results []Value
        -	pos     token.Pos
        -}
        -
        -// The RunDefers instruction pops and invokes the entire stack of
        -// procedure calls pushed by Defer instructions in this function.
        -//
        -// It is legal to encounter multiple 'rundefers' instructions in a
        -// single control-flow path through a function; this is useful in
        -// the combined init() function, for example.
        -//
        -// Pos() returns NoPos.
        -//
        -// Example printed form:
        -//	rundefers
        -//
        -type RunDefers struct {
        -	anInstruction
        -}
        -
        -// The Panic instruction initiates a panic with value X.
        -//
        -// A Panic instruction must be the last instruction of its containing
        -// BasicBlock, which must have no successors.
        -//
        -// NB: 'go panic(x)' and 'defer panic(x)' do not use this instruction;
        -// they are treated as calls to a built-in function.
        -//
        -// Pos() returns the ast.CallExpr.Lparen if this panic was explicit
        -// in the source.
        -//
        -// Example printed form:
        -// 	panic t0
        -//
        -type Panic struct {
        -	anInstruction
        -	X   Value // an interface{}
        -	pos token.Pos
        -}
        -
        -// The Go instruction creates a new goroutine and calls the specified
        -// function within it.
        -//
        -// See CallCommon for generic function call documentation.
        -//
        -// Pos() returns the ast.GoStmt.Go.
        -//
        -// Example printed form:
        -// 	go println(t0, t1)
        -// 	go t3()
        -// 	go invoke t5.Println(...t6)
        -//
        -type Go struct {
        -	anInstruction
        -	Call CallCommon
        -	pos  token.Pos
        -}
        -
        -// The Defer instruction pushes the specified call onto a stack of
        -// functions to be called by a RunDefers instruction or by a panic.
        -//
        -// See CallCommon for generic function call documentation.
        -//
        -// Pos() returns the ast.DeferStmt.Defer.
        -//
        -// Example printed form:
        -// 	defer println(t0, t1)
        -// 	defer t3()
        -// 	defer invoke t5.Println(...t6)
        -//
        -type Defer struct {
        -	anInstruction
        -	Call CallCommon
        -	pos  token.Pos
        -}
        -
        -// The Send instruction sends X on channel Chan.
        -//
        -// Pos() returns the ast.SendStmt.Arrow, if explicit in the source.
        -//
        -// Example printed form:
        -// 	send t0 <- t1
        -//
        -type Send struct {
        -	anInstruction
        -	Chan, X Value
        -	pos     token.Pos
        -}
        -
        -// The Store instruction stores Val at address Addr.
        -// Stores can be of arbitrary types.
        -//
        -// Pos() returns the position of the source-level construct most closely
        -// associated with the memory store operation.
        -// Since implicit memory stores are numerous and varied and depend upon
        -// implementation choices, the details are not specified.
        -//
        -// Example printed form:
        -// 	*x = y
        -//
        -type Store struct {
        -	anInstruction
        -	Addr Value
        -	Val  Value
        -	pos  token.Pos
        -}
        -
        -// The BlankStore instruction is emitted for assignments to the blank
        -// identifier.
        -//
        -// BlankStore is a pseudo-instruction: it has no dynamic effect.
        -//
        -// Pos() returns NoPos.
        -//
        -// Example printed form:
        -//	_ = t0
        -//
        -type BlankStore struct {
        -	anInstruction
        -	Val Value
        -}
        -
        -// The MapUpdate instruction updates the association of Map[Key] to
        -// Value.
        -//
        -// Pos() returns the ast.KeyValueExpr.Colon or ast.IndexExpr.Lbrack,
        -// if explicit in the source.
        -//
        -// Example printed form:
        -//	t0[t1] = t2
        -//
        -type MapUpdate struct {
        -	anInstruction
        -	Map   Value
        -	Key   Value
        -	Value Value
        -	pos   token.Pos
        -}
        -
        -// A DebugRef instruction maps a source-level expression Expr to the
        -// SSA value X that represents the value (!IsAddr) or address (IsAddr)
        -// of that expression.
        -//
        -// DebugRef is a pseudo-instruction: it has no dynamic effect.
        -//
        -// Pos() returns Expr.Pos(), the start position of the source-level
        -// expression.  This is not the same as the "designated" token as
        -// documented at Value.Pos(). e.g. CallExpr.Pos() does not return the
        -// position of the ("designated") Lparen token.
        -//
        -// If Expr is an *ast.Ident denoting a var or func, Object() returns
        -// the object; though this information can be obtained from the type
        -// checker, including it here greatly facilitates debugging.
        -// For non-Ident expressions, Object() returns nil.
        -//
        -// DebugRefs are generated only for functions built with debugging
        -// enabled; see Package.SetDebugMode() and the GlobalDebug builder
        -// mode flag.
        -//
        -// DebugRefs are not emitted for ast.Idents referring to constants or
        -// predeclared identifiers, since they are trivial and numerous.
        -// Nor are they emitted for ast.ParenExprs.
        -//
        -// (By representing these as instructions, rather than out-of-band,
        -// consistency is maintained during transformation passes by the
        -// ordinary SSA renaming machinery.)
        -//
        -// Example printed form:
        -//      ; *ast.CallExpr @ 102:9 is t5
        -//      ; var x float64 @ 109:72 is x
        -//      ; address of *ast.CompositeLit @ 216:10 is t0
        -//
        -type DebugRef struct {
        -	anInstruction
        -	Expr   ast.Expr     // the referring expression (never *ast.ParenExpr)
        -	object types.Object // the identity of the source var/func
        -	IsAddr bool         // Expr is addressable and X is the address it denotes
        -	X      Value        // the value or address of Expr
        -}
        -
        -// Embeddable mix-ins and helpers for common parts of other structs. -----------
        -
        -// register is a mix-in embedded by all SSA values that are also
        -// instructions, i.e. virtual registers, and provides a uniform
        -// implementation of most of the Value interface: Value.Name() is a
        -// numbered register (e.g. "t0"); the other methods are field accessors.
        -//
        -// Temporary names are automatically assigned to each register on
        -// completion of building a function in SSA form.
        -//
        -// Clients must not assume that the 'id' value (and the Name() derived
        -// from it) is unique within a function.  As always in this API,
        -// semantics are determined only by identity; names exist only to
        -// facilitate debugging.
        -//
        -type register struct {
        -	anInstruction
        -	num       int        // "name" of virtual register, e.g. "t0".  Not guaranteed unique.
        -	typ       types.Type // type of virtual register
        -	pos       token.Pos  // position of source expression, or NoPos
        -	referrers []Instruction
        -}
        -
        -// anInstruction is a mix-in embedded by all Instructions.
        -// It provides the implementations of the Block and setBlock methods.
        -type anInstruction struct {
        -	block *BasicBlock // the basic block of this instruction
        -}
        -
        -// CallCommon is contained by Go, Defer and Call to hold the
        -// common parts of a function or method call.
        -//
        -// Each CallCommon exists in one of two modes, function call and
        -// interface method invocation, or "call" and "invoke" for short.
        -//
        -// 1. "call" mode: when Method is nil (!IsInvoke), a CallCommon
        -// represents an ordinary function call of the value in Value,
        -// which may be a *Builtin, a *Function or any other value of kind
        -// 'func'.
        -//
        -// Value may be one of:
        -//    (a) a *Function, indicating a statically dispatched call
        -//        to a package-level function, an anonymous function, or
        -//        a method of a named type.
        -//    (b) a *MakeClosure, indicating an immediately applied
        -//        function literal with free variables.
        -//    (c) a *Builtin, indicating a statically dispatched call
        -//        to a built-in function.
        -//    (d) any other value, indicating a dynamically dispatched
        -//        function call.
        -// StaticCallee returns the identity of the callee in cases
        -// (a) and (b), nil otherwise.
        -//
        -// Args contains the arguments to the call.  If Value is a method,
        -// Args[0] contains the receiver parameter.
        -//
        -// Example printed form:
        -// 	t2 = println(t0, t1)
        -// 	go t3()
        -//	defer t5(...t6)
        -//
        -// 2. "invoke" mode: when Method is non-nil (IsInvoke), a CallCommon
        -// represents a dynamically dispatched call to an interface method.
        -// In this mode, Value is the interface value and Method is the
        -// interface's abstract method.  Note: an abstract method may be
        -// shared by multiple interfaces due to embedding; Value.Type()
        -// provides the specific interface used for this call.
        -//
        -// Value is implicitly supplied to the concrete method implementation
        -// as the receiver parameter; in other words, Args[0] holds not the
        -// receiver but the first true argument.
        -//
        -// Example printed form:
        -// 	t1 = invoke t0.String()
        -// 	go invoke t3.Run(t2)
        -// 	defer invoke t4.Handle(...t5)
        -//
        -// For all calls to variadic functions (Signature().Variadic()),
        -// the last element of Args is a slice.
        -//
        -type CallCommon struct {
        -	Value  Value       // receiver (invoke mode) or func value (call mode)
        -	Method *types.Func // abstract method (invoke mode)
        -	Args   []Value     // actual parameters (in static method call, includes receiver)
        -	pos    token.Pos   // position of CallExpr.Lparen, iff explicit in source
        -}
        -
        -// IsInvoke returns true if this call has "invoke" (not "call") mode.
        -func (c *CallCommon) IsInvoke() bool {
        -	return c.Method != nil
        -}
        -
        -func (c *CallCommon) Pos() token.Pos { return c.pos }
        -
        -// Signature returns the signature of the called function.
        -//
        -// For an "invoke"-mode call, the signature of the interface method is
        -// returned.
        -//
        -// In either "call" or "invoke" mode, if the callee is a method, its
        -// receiver is represented by sig.Recv, not sig.Params().At(0).
        -//
        -func (c *CallCommon) Signature() *types.Signature {
        -	if c.Method != nil {
        -		return c.Method.Type().(*types.Signature)
        -	}
        -	return c.Value.Type().Underlying().(*types.Signature)
        -}
        -
        -// StaticCallee returns the callee if this is a trivially static
        -// "call"-mode call to a function.
        -func (c *CallCommon) StaticCallee() *Function {
        -	switch fn := c.Value.(type) {
        -	case *Function:
        -		return fn
        -	case *MakeClosure:
        -		return fn.Fn.(*Function)
        -	}
        -	return nil
        -}
        -
        -// Description returns a description of the mode of this call suitable
        -// for a user interface, e.g., "static method call".
        -func (c *CallCommon) Description() string {
        -	switch fn := c.Value.(type) {
        -	case *Builtin:
        -		return "built-in function call"
        -	case *MakeClosure:
        -		return "static function closure call"
        -	case *Function:
        -		if fn.Signature.Recv() != nil {
        -			return "static method call"
        -		}
        -		return "static function call"
        -	}
        -	if c.IsInvoke() {
        -		return "dynamic method call" // ("invoke" mode)
        -	}
        -	return "dynamic function call"
        -}
        -
        -// The CallInstruction interface, implemented by *Go, *Defer and *Call,
        -// exposes the common parts of function-calling instructions,
        -// yet provides a way back to the Value defined by *Call alone.
        -//
        -type CallInstruction interface {
        -	Instruction
        -	Common() *CallCommon // returns the common parts of the call
        -	Value() *Call        // returns the result value of the call (*Call) or nil (*Go, *Defer)
        -}
        -
        -func (s *Call) Common() *CallCommon  { return &s.Call }
        -func (s *Defer) Common() *CallCommon { return &s.Call }
        -func (s *Go) Common() *CallCommon    { return &s.Call }
        -
        -func (s *Call) Value() *Call  { return s }
        -func (s *Defer) Value() *Call { return nil }
        -func (s *Go) Value() *Call    { return nil }
        -
        -func (v *Builtin) Type() types.Type        { return v.sig }
        -func (v *Builtin) Name() string            { return v.name }
        -func (*Builtin) Referrers() *[]Instruction { return nil }
        -func (v *Builtin) Pos() token.Pos          { return token.NoPos }
        -func (v *Builtin) Object() types.Object    { return types.Universe.Lookup(v.name) }
        -func (v *Builtin) Parent() *Function       { return nil }
        -
        -func (v *FreeVar) Type() types.Type          { return v.typ }
        -func (v *FreeVar) Name() string              { return v.name }
        -func (v *FreeVar) Referrers() *[]Instruction { return &v.referrers }
        -func (v *FreeVar) Pos() token.Pos            { return v.pos }
        -func (v *FreeVar) Parent() *Function         { return v.parent }
        -
        -func (v *Global) Type() types.Type                     { return v.typ }
        -func (v *Global) Name() string                         { return v.name }
        -func (v *Global) Parent() *Function                    { return nil }
        -func (v *Global) Pos() token.Pos                       { return v.pos }
        -func (v *Global) Referrers() *[]Instruction            { return nil }
        -func (v *Global) Token() token.Token                   { return token.VAR }
        -func (v *Global) Object() types.Object                 { return v.object }
        -func (v *Global) String() string                       { return v.RelString(nil) }
        -func (v *Global) Package() *Package                    { return v.Pkg }
        -func (v *Global) RelString(from *types.Package) string { return relString(v, from) }
        -
        -func (v *Function) Name() string         { return v.name }
        -func (v *Function) Type() types.Type     { return v.Signature }
        -func (v *Function) Pos() token.Pos       { return v.pos }
        -func (v *Function) Token() token.Token   { return token.FUNC }
        -func (v *Function) Object() types.Object { return v.object }
        -func (v *Function) String() string       { return v.RelString(nil) }
        -func (v *Function) Package() *Package    { return v.Pkg }
        -func (v *Function) Parent() *Function    { return v.parent }
        -func (v *Function) Referrers() *[]Instruction {
        -	if v.parent != nil {
        -		return &v.referrers
        -	}
        -	return nil
        -}
        -
        -func (v *Parameter) Type() types.Type          { return v.typ }
        -func (v *Parameter) Name() string              { return v.name }
        -func (v *Parameter) Object() types.Object      { return v.object }
        -func (v *Parameter) Referrers() *[]Instruction { return &v.referrers }
        -func (v *Parameter) Pos() token.Pos            { return v.pos }
        -func (v *Parameter) Parent() *Function         { return v.parent }
        -
        -func (v *Alloc) Type() types.Type          { return v.typ }
        -func (v *Alloc) Referrers() *[]Instruction { return &v.referrers }
        -func (v *Alloc) Pos() token.Pos            { return v.pos }
        -
        -func (v *register) Type() types.Type          { return v.typ }
        -func (v *register) setType(typ types.Type)    { v.typ = typ }
        -func (v *register) Name() string              { return fmt.Sprintf("t%d", v.num) }
        -func (v *register) setNum(num int)            { v.num = num }
        -func (v *register) Referrers() *[]Instruction { return &v.referrers }
        -func (v *register) Pos() token.Pos            { return v.pos }
        -func (v *register) setPos(pos token.Pos)      { v.pos = pos }
        -
        -func (v *anInstruction) Parent() *Function          { return v.block.parent }
        -func (v *anInstruction) Block() *BasicBlock         { return v.block }
        -func (v *anInstruction) setBlock(block *BasicBlock) { v.block = block }
        -func (v *anInstruction) Referrers() *[]Instruction  { return nil }
        -
        -func (t *Type) Name() string                         { return t.object.Name() }
        -func (t *Type) Pos() token.Pos                       { return t.object.Pos() }
        -func (t *Type) Type() types.Type                     { return t.object.Type() }
        -func (t *Type) Token() token.Token                   { return token.TYPE }
        -func (t *Type) Object() types.Object                 { return t.object }
        -func (t *Type) String() string                       { return t.RelString(nil) }
        -func (t *Type) Package() *Package                    { return t.pkg }
        -func (t *Type) RelString(from *types.Package) string { return relString(t, from) }
        -
        -func (c *NamedConst) Name() string                         { return c.object.Name() }
        -func (c *NamedConst) Pos() token.Pos                       { return c.object.Pos() }
        -func (c *NamedConst) String() string                       { return c.RelString(nil) }
        -func (c *NamedConst) Type() types.Type                     { return c.object.Type() }
        -func (c *NamedConst) Token() token.Token                   { return token.CONST }
        -func (c *NamedConst) Object() types.Object                 { return c.object }
        -func (c *NamedConst) Package() *Package                    { return c.pkg }
        -func (c *NamedConst) RelString(from *types.Package) string { return relString(c, from) }
        -
        -// Func returns the package-level function of the specified name,
        -// or nil if not found.
        -//
        -func (p *Package) Func(name string) (f *Function) {
        -	f, _ = p.Members[name].(*Function)
        -	return
        -}
        -
        -// Var returns the package-level variable of the specified name,
        -// or nil if not found.
        -//
        -func (p *Package) Var(name string) (g *Global) {
        -	g, _ = p.Members[name].(*Global)
        -	return
        -}
        -
        -// Const returns the package-level constant of the specified name,
        -// or nil if not found.
        -//
        -func (p *Package) Const(name string) (c *NamedConst) {
        -	c, _ = p.Members[name].(*NamedConst)
        -	return
        -}
        -
        -// Type returns the package-level type of the specified name,
        -// or nil if not found.
        -//
        -func (p *Package) Type(name string) (t *Type) {
        -	t, _ = p.Members[name].(*Type)
        -	return
        -}
        -
        -func (v *Call) Pos() token.Pos       { return v.Call.pos }
        -func (s *Defer) Pos() token.Pos      { return s.pos }
        -func (s *Go) Pos() token.Pos         { return s.pos }
        -func (s *MapUpdate) Pos() token.Pos  { return s.pos }
        -func (s *Panic) Pos() token.Pos      { return s.pos }
        -func (s *Return) Pos() token.Pos     { return s.pos }
        -func (s *Send) Pos() token.Pos       { return s.pos }
        -func (s *Store) Pos() token.Pos      { return s.pos }
        -func (s *BlankStore) Pos() token.Pos { return token.NoPos }
        -func (s *If) Pos() token.Pos         { return token.NoPos }
        -func (s *Jump) Pos() token.Pos       { return token.NoPos }
        -func (s *RunDefers) Pos() token.Pos  { return token.NoPos }
        -func (s *DebugRef) Pos() token.Pos   { return s.Expr.Pos() }
        -
        -// Operands.
        -
        -func (v *Alloc) Operands(rands []*Value) []*Value {
        -	return rands
        -}
        -
        -func (v *BinOp) Operands(rands []*Value) []*Value {
        -	return append(rands, &v.X, &v.Y)
        -}
        -
        -func (c *CallCommon) Operands(rands []*Value) []*Value {
        -	rands = append(rands, &c.Value)
        -	for i := range c.Args {
        -		rands = append(rands, &c.Args[i])
        -	}
        -	return rands
        -}
        -
        -func (s *Go) Operands(rands []*Value) []*Value {
        -	return s.Call.Operands(rands)
        -}
        -
        -func (s *Call) Operands(rands []*Value) []*Value {
        -	return s.Call.Operands(rands)
        -}
        -
        -func (s *Defer) Operands(rands []*Value) []*Value {
        -	return s.Call.Operands(rands)
        -}
        -
        -func (v *ChangeInterface) Operands(rands []*Value) []*Value {
        -	return append(rands, &v.X)
        -}
        -
        -func (v *ChangeType) Operands(rands []*Value) []*Value {
        -	return append(rands, &v.X)
        -}
        -
        -func (v *Convert) Operands(rands []*Value) []*Value {
        -	return append(rands, &v.X)
        -}
        -
        -func (s *DebugRef) Operands(rands []*Value) []*Value {
        -	return append(rands, &s.X)
        -}
        -
        -func (v *Extract) Operands(rands []*Value) []*Value {
        -	return append(rands, &v.Tuple)
        -}
        -
        -func (v *Field) Operands(rands []*Value) []*Value {
        -	return append(rands, &v.X)
        -}
        -
        -func (v *FieldAddr) Operands(rands []*Value) []*Value {
        -	return append(rands, &v.X)
        -}
        -
        -func (s *If) Operands(rands []*Value) []*Value {
        -	return append(rands, &s.Cond)
        -}
        -
        -func (v *Index) Operands(rands []*Value) []*Value {
        -	return append(rands, &v.X, &v.Index)
        -}
        -
        -func (v *IndexAddr) Operands(rands []*Value) []*Value {
        -	return append(rands, &v.X, &v.Index)
        -}
        -
        -func (*Jump) Operands(rands []*Value) []*Value {
        -	return rands
        -}
        -
        -func (v *Lookup) Operands(rands []*Value) []*Value {
        -	return append(rands, &v.X, &v.Index)
        -}
        -
        -func (v *MakeChan) Operands(rands []*Value) []*Value {
        -	return append(rands, &v.Size)
        -}
        -
        -func (v *MakeClosure) Operands(rands []*Value) []*Value {
        -	rands = append(rands, &v.Fn)
        -	for i := range v.Bindings {
        -		rands = append(rands, &v.Bindings[i])
        -	}
        -	return rands
        -}
        -
        -func (v *MakeInterface) Operands(rands []*Value) []*Value {
        -	return append(rands, &v.X)
        -}
        -
        -func (v *MakeMap) Operands(rands []*Value) []*Value {
        -	return append(rands, &v.Reserve)
        -}
        -
        -func (v *MakeSlice) Operands(rands []*Value) []*Value {
        -	return append(rands, &v.Len, &v.Cap)
        -}
        -
        -func (v *MapUpdate) Operands(rands []*Value) []*Value {
        -	return append(rands, &v.Map, &v.Key, &v.Value)
        -}
        -
        -func (v *Next) Operands(rands []*Value) []*Value {
        -	return append(rands, &v.Iter)
        -}
        -
        -func (s *Panic) Operands(rands []*Value) []*Value {
        -	return append(rands, &s.X)
        -}
        -
        -func (v *Sigma) Operands(rands []*Value) []*Value {
        -	return append(rands, &v.X)
        -}
        -
        -func (v *Phi) Operands(rands []*Value) []*Value {
        -	for i := range v.Edges {
        -		rands = append(rands, &v.Edges[i])
        -	}
        -	return rands
        -}
        -
        -func (v *Range) Operands(rands []*Value) []*Value {
        -	return append(rands, &v.X)
        -}
        -
        -func (s *Return) Operands(rands []*Value) []*Value {
        -	for i := range s.Results {
        -		rands = append(rands, &s.Results[i])
        -	}
        -	return rands
        -}
        -
        -func (*RunDefers) Operands(rands []*Value) []*Value {
        -	return rands
        -}
        -
        -func (v *Select) Operands(rands []*Value) []*Value {
        -	for i := range v.States {
        -		rands = append(rands, &v.States[i].Chan, &v.States[i].Send)
        -	}
        -	return rands
        -}
        -
        -func (s *Send) Operands(rands []*Value) []*Value {
        -	return append(rands, &s.Chan, &s.X)
        -}
        -
        -func (v *Slice) Operands(rands []*Value) []*Value {
        -	return append(rands, &v.X, &v.Low, &v.High, &v.Max)
        -}
        -
        -func (s *Store) Operands(rands []*Value) []*Value {
        -	return append(rands, &s.Addr, &s.Val)
        -}
        -
        -func (s *BlankStore) Operands(rands []*Value) []*Value {
        -	return append(rands, &s.Val)
        -}
        -
        -func (v *TypeAssert) Operands(rands []*Value) []*Value {
        -	return append(rands, &v.X)
        -}
        -
        -func (v *UnOp) Operands(rands []*Value) []*Value {
        -	return append(rands, &v.X)
        -}
        -
        -// Non-Instruction Values:
        -func (v *Builtin) Operands(rands []*Value) []*Value   { return rands }
        -func (v *FreeVar) Operands(rands []*Value) []*Value   { return rands }
        -func (v *Const) Operands(rands []*Value) []*Value     { return rands }
        -func (v *Function) Operands(rands []*Value) []*Value  { return rands }
        -func (v *Global) Operands(rands []*Value) []*Value    { return rands }
        -func (v *Parameter) Operands(rands []*Value) []*Value { return rands }
        diff --git a/vendor/honnef.co/go/tools/ssa/staticcheck.conf b/vendor/honnef.co/go/tools/ssa/staticcheck.conf
        deleted file mode 100644
        index d7b38bc35..000000000
        --- a/vendor/honnef.co/go/tools/ssa/staticcheck.conf
        +++ /dev/null
        @@ -1,3 +0,0 @@
        -# ssa/... is mostly imported from upstream and we don't want to
        -# deviate from it too much, hence disabling SA1019
        -checks = ["inherit", "-SA1019"]
        diff --git a/vendor/honnef.co/go/tools/ssa/testmain.go b/vendor/honnef.co/go/tools/ssa/testmain.go
        deleted file mode 100644
        index 8ec15ba50..000000000
        --- a/vendor/honnef.co/go/tools/ssa/testmain.go
        +++ /dev/null
        @@ -1,271 +0,0 @@
        -// Copyright 2013 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package ssa
        -
        -// CreateTestMainPackage synthesizes a main package that runs all the
        -// tests of the supplied packages.
        -// It is closely coupled to $GOROOT/src/cmd/go/test.go and $GOROOT/src/testing.
        -//
        -// TODO(adonovan): throws this all away now that x/tools/go/packages
        -// provides access to the actual synthetic test main files.
        -
        -import (
        -	"bytes"
        -	"fmt"
        -	"go/ast"
        -	"go/parser"
        -	"go/types"
        -	"log"
        -	"os"
        -	"strings"
        -	"text/template"
        -)
        -
        -// FindTests returns the Test, Benchmark, and Example functions
        -// (as defined by "go test") defined in the specified package,
        -// and its TestMain function, if any.
        -//
        -// Deprecated: use x/tools/go/packages to access synthetic testmain packages.
        -func FindTests(pkg *Package) (tests, benchmarks, examples []*Function, main *Function) {
        -	prog := pkg.Prog
        -
        -	// The first two of these may be nil: if the program doesn't import "testing",
        -	// it can't contain any tests, but it may yet contain Examples.
        -	var testSig *types.Signature                              // func(*testing.T)
        -	var benchmarkSig *types.Signature                         // func(*testing.B)
        -	var exampleSig = types.NewSignature(nil, nil, nil, false) // func()
        -
        -	// Obtain the types from the parameters of testing.MainStart.
        -	if testingPkg := prog.ImportedPackage("testing"); testingPkg != nil {
        -		mainStart := testingPkg.Func("MainStart")
        -		params := mainStart.Signature.Params()
        -		testSig = funcField(params.At(1).Type())
        -		benchmarkSig = funcField(params.At(2).Type())
        -
        -		// Does the package define this function?
        -		//   func TestMain(*testing.M)
        -		if f := pkg.Func("TestMain"); f != nil {
        -			sig := f.Type().(*types.Signature)
        -			starM := mainStart.Signature.Results().At(0).Type() // *testing.M
        -			if sig.Results().Len() == 0 &&
        -				sig.Params().Len() == 1 &&
        -				types.Identical(sig.Params().At(0).Type(), starM) {
        -				main = f
        -			}
        -		}
        -	}
        -
        -	// TODO(adonovan): use a stable order, e.g. lexical.
        -	for _, mem := range pkg.Members {
        -		if f, ok := mem.(*Function); ok &&
        -			ast.IsExported(f.Name()) &&
        -			strings.HasSuffix(prog.Fset.Position(f.Pos()).Filename, "_test.go") {
        -
        -			switch {
        -			case testSig != nil && isTestSig(f, "Test", testSig):
        -				tests = append(tests, f)
        -			case benchmarkSig != nil && isTestSig(f, "Benchmark", benchmarkSig):
        -				benchmarks = append(benchmarks, f)
        -			case isTestSig(f, "Example", exampleSig):
        -				examples = append(examples, f)
        -			default:
        -				continue
        -			}
        -		}
        -	}
        -	return
        -}
        -
        -// Like isTest, but checks the signature too.
        -func isTestSig(f *Function, prefix string, sig *types.Signature) bool {
        -	return isTest(f.Name(), prefix) && types.Identical(f.Signature, sig)
        -}
        -
        -// Given the type of one of the three slice parameters of testing.Main,
        -// returns the function type.
        -func funcField(slice types.Type) *types.Signature {
        -	return slice.(*types.Slice).Elem().Underlying().(*types.Struct).Field(1).Type().(*types.Signature)
        -}
        -
        -// isTest tells whether name looks like a test (or benchmark, according to prefix).
        -// It is a Test (say) if there is a character after Test that is not a lower-case letter.
        -// We don't want TesticularCancer.
        -// Plundered from $GOROOT/src/cmd/go/test.go
        -func isTest(name, prefix string) bool {
        -	if !strings.HasPrefix(name, prefix) {
        -		return false
        -	}
        -	if len(name) == len(prefix) { // "Test" is ok
        -		return true
        -	}
        -	return ast.IsExported(name[len(prefix):])
        -}
        -
        -// CreateTestMainPackage creates and returns a synthetic "testmain"
        -// package for the specified package if it defines tests, benchmarks or
        -// executable examples, or nil otherwise.  The new package is named
        -// "main" and provides a function named "main" that runs the tests,
        -// similar to the one that would be created by the 'go test' tool.
        -//
        -// Subsequent calls to prog.AllPackages include the new package.
        -// The package pkg must belong to the program prog.
        -//
        -// Deprecated: use x/tools/go/packages to access synthetic testmain packages.
        -func (prog *Program) CreateTestMainPackage(pkg *Package) *Package {
        -	if pkg.Prog != prog {
        -		log.Fatal("Package does not belong to Program")
        -	}
        -
        -	// Template data
        -	var data struct {
        -		Pkg                         *Package
        -		Tests, Benchmarks, Examples []*Function
        -		Main                        *Function
        -		Go18                        bool
        -	}
        -	data.Pkg = pkg
        -
        -	// Enumerate tests.
        -	data.Tests, data.Benchmarks, data.Examples, data.Main = FindTests(pkg)
        -	if data.Main == nil &&
        -		data.Tests == nil && data.Benchmarks == nil && data.Examples == nil {
        -		return nil
        -	}
        -
        -	// Synthesize source for testmain package.
        -	path := pkg.Pkg.Path() + "$testmain"
        -	tmpl := testmainTmpl
        -	if testingPkg := prog.ImportedPackage("testing"); testingPkg != nil {
        -		// In Go 1.8, testing.MainStart's first argument is an interface, not a func.
        -		data.Go18 = types.IsInterface(testingPkg.Func("MainStart").Signature.Params().At(0).Type())
        -	} else {
        -		// The program does not import "testing", but FindTests
        -		// returned non-nil, which must mean there were Examples
        -		// but no Test, Benchmark, or TestMain functions.
        -
        -		// We'll simply call them from testmain.main; this will
        -		// ensure they don't panic, but will not check any
        -		// "Output:" comments.
        -		// (We should not execute an Example that has no
        -		// "Output:" comment, but it's impossible to tell here.)
        -		tmpl = examplesOnlyTmpl
        -	}
        -	var buf bytes.Buffer
        -	if err := tmpl.Execute(&buf, data); err != nil {
        -		log.Fatalf("internal error expanding template for %s: %v", path, err)
        -	}
        -	if false { // debugging
        -		fmt.Fprintln(os.Stderr, buf.String())
        -	}
        -
        -	// Parse and type-check the testmain package.
        -	f, err := parser.ParseFile(prog.Fset, path+".go", &buf, parser.Mode(0))
        -	if err != nil {
        -		log.Fatalf("internal error parsing %s: %v", path, err)
        -	}
        -	conf := types.Config{
        -		DisableUnusedImportCheck: true,
        -		Importer:                 importer{pkg},
        -	}
        -	files := []*ast.File{f}
        -	info := &types.Info{
        -		Types:      make(map[ast.Expr]types.TypeAndValue),
        -		Defs:       make(map[*ast.Ident]types.Object),
        -		Uses:       make(map[*ast.Ident]types.Object),
        -		Implicits:  make(map[ast.Node]types.Object),
        -		Scopes:     make(map[ast.Node]*types.Scope),
        -		Selections: make(map[*ast.SelectorExpr]*types.Selection),
        -	}
        -	testmainPkg, err := conf.Check(path, prog.Fset, files, info)
        -	if err != nil {
        -		log.Fatalf("internal error type-checking %s: %v", path, err)
        -	}
        -
        -	// Create and build SSA code.
        -	testmain := prog.CreatePackage(testmainPkg, files, info, false)
        -	testmain.SetDebugMode(false)
        -	testmain.Build()
        -	testmain.Func("main").Synthetic = "test main function"
        -	testmain.Func("init").Synthetic = "package initializer"
        -	return testmain
        -}
        -
        -// An implementation of types.Importer for an already loaded SSA program.
        -type importer struct {
        -	pkg *Package // package under test; may be non-importable
        -}
        -
        -func (imp importer) Import(path string) (*types.Package, error) {
        -	if p := imp.pkg.Prog.ImportedPackage(path); p != nil {
        -		return p.Pkg, nil
        -	}
        -	if path == imp.pkg.Pkg.Path() {
        -		return imp.pkg.Pkg, nil
        -	}
        -	return nil, fmt.Errorf("not found") // can't happen
        -}
        -
        -var testmainTmpl = template.Must(template.New("testmain").Parse(`
        -package main
        -
        -import "io"
        -import "os"
        -import "testing"
        -import p {{printf "%q" .Pkg.Pkg.Path}}
        -
        -{{if .Go18}}
        -type deps struct{}
        -
        -func (deps) ImportPath() string { return "" }
        -func (deps) MatchString(pat, str string) (bool, error) { return true, nil }
        -func (deps) StartCPUProfile(io.Writer) error { return nil }
        -func (deps) StartTestLog(io.Writer) {}
        -func (deps) StopCPUProfile() {}
        -func (deps) StopTestLog() error { return nil }
        -func (deps) WriteHeapProfile(io.Writer) error { return nil }
        -func (deps) WriteProfileTo(string, io.Writer, int) error { return nil }
        -
        -var match deps
        -{{else}}
        -func match(_, _ string) (bool, error) { return true, nil }
        -{{end}}
        -
        -func main() {
        -	tests := []testing.InternalTest{
        -{{range .Tests}}
        -		{ {{printf "%q" .Name}}, p.{{.Name}} },
        -{{end}}
        -	}
        -	benchmarks := []testing.InternalBenchmark{
        -{{range .Benchmarks}}
        -		{ {{printf "%q" .Name}}, p.{{.Name}} },
        -{{end}}
        -	}
        -	examples := []testing.InternalExample{
        -{{range .Examples}}
        -		{Name: {{printf "%q" .Name}}, F: p.{{.Name}}},
        -{{end}}
        -	}
        -	m := testing.MainStart(match, tests, benchmarks, examples)
        -{{with .Main}}
        -	p.{{.Name}}(m)
        -{{else}}
        -	os.Exit(m.Run())
        -{{end}}
        -}
        -
        -`))
        -
        -var examplesOnlyTmpl = template.Must(template.New("examples").Parse(`
        -package main
        -
        -import p {{printf "%q" .Pkg.Pkg.Path}}
        -
        -func main() {
        -{{range .Examples}}
        -	p.{{.Name}}()
        -{{end}}
        -}
        -`))
        diff --git a/vendor/honnef.co/go/tools/ssa/util.go b/vendor/honnef.co/go/tools/ssa/util.go
        deleted file mode 100644
        index ddb118460..000000000
        --- a/vendor/honnef.co/go/tools/ssa/util.go
        +++ /dev/null
        @@ -1,119 +0,0 @@
        -// Copyright 2013 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package ssa
        -
        -// This file defines a number of miscellaneous utility functions.
        -
        -import (
        -	"fmt"
        -	"go/ast"
        -	"go/token"
        -	"go/types"
        -	"io"
        -	"os"
        -
        -	"golang.org/x/tools/go/ast/astutil"
        -)
        -
        -//// AST utilities
        -
        -func unparen(e ast.Expr) ast.Expr { return astutil.Unparen(e) }
        -
        -// isBlankIdent returns true iff e is an Ident with name "_".
        -// They have no associated types.Object, and thus no type.
        -//
        -func isBlankIdent(e ast.Expr) bool {
        -	id, ok := e.(*ast.Ident)
        -	return ok && id.Name == "_"
        -}
        -
        -//// Type utilities.  Some of these belong in go/types.
        -
        -// isPointer returns true for types whose underlying type is a pointer.
        -func isPointer(typ types.Type) bool {
        -	_, ok := typ.Underlying().(*types.Pointer)
        -	return ok
        -}
        -
        -func isInterface(T types.Type) bool { return types.IsInterface(T) }
        -
        -// deref returns a pointer's element type; otherwise it returns typ.
        -func deref(typ types.Type) types.Type {
        -	if p, ok := typ.Underlying().(*types.Pointer); ok {
        -		return p.Elem()
        -	}
        -	return typ
        -}
        -
        -// recvType returns the receiver type of method obj.
        -func recvType(obj *types.Func) types.Type {
        -	return obj.Type().(*types.Signature).Recv().Type()
        -}
        -
        -// DefaultType returns the default "typed" type for an "untyped" type;
        -// it returns the incoming type for all other types.  The default type
        -// for untyped nil is untyped nil.
        -//
        -// Exported to ssa/interp.
        -//
        -// TODO(adonovan): use go/types.DefaultType after 1.8.
        -//
        -func DefaultType(typ types.Type) types.Type {
        -	if t, ok := typ.(*types.Basic); ok {
        -		k := t.Kind()
        -		switch k {
        -		case types.UntypedBool:
        -			k = types.Bool
        -		case types.UntypedInt:
        -			k = types.Int
        -		case types.UntypedRune:
        -			k = types.Rune
        -		case types.UntypedFloat:
        -			k = types.Float64
        -		case types.UntypedComplex:
        -			k = types.Complex128
        -		case types.UntypedString:
        -			k = types.String
        -		}
        -		typ = types.Typ[k]
        -	}
        -	return typ
        -}
        -
        -// logStack prints the formatted "start" message to stderr and
        -// returns a closure that prints the corresponding "end" message.
        -// Call using 'defer logStack(...)()' to show builder stack on panic.
        -// Don't forget trailing parens!
        -//
        -func logStack(format string, args ...interface{}) func() {
        -	msg := fmt.Sprintf(format, args...)
        -	io.WriteString(os.Stderr, msg)
        -	io.WriteString(os.Stderr, "\n")
        -	return func() {
        -		io.WriteString(os.Stderr, msg)
        -		io.WriteString(os.Stderr, " end\n")
        -	}
        -}
        -
        -// newVar creates a 'var' for use in a types.Tuple.
        -func newVar(name string, typ types.Type) *types.Var {
        -	return types.NewParam(token.NoPos, nil, name, typ)
        -}
        -
        -// anonVar creates an anonymous 'var' for use in a types.Tuple.
        -func anonVar(typ types.Type) *types.Var {
        -	return newVar("", typ)
        -}
        -
        -var lenResults = types.NewTuple(anonVar(tInt))
        -
        -// makeLen returns the len builtin specialized to type func(T)int.
        -func makeLen(T types.Type) *Builtin {
        -	lenParams := types.NewTuple(anonVar(T))
        -	return &Builtin{
        -		name: "len",
        -		sig:  types.NewSignature(nil, lenParams, lenResults, false),
        -	}
        -}
        diff --git a/vendor/honnef.co/go/tools/ssa/wrappers.go b/vendor/honnef.co/go/tools/ssa/wrappers.go
        deleted file mode 100644
        index a4ae71d8c..000000000
        --- a/vendor/honnef.co/go/tools/ssa/wrappers.go
        +++ /dev/null
        @@ -1,290 +0,0 @@
        -// Copyright 2013 The Go Authors. All rights reserved.
        -// Use of this source code is governed by a BSD-style
        -// license that can be found in the LICENSE file.
        -
        -package ssa
        -
        -// This file defines synthesis of Functions that delegate to declared
        -// methods; they come in three kinds:
        -//
        -// (1) wrappers: methods that wrap declared methods, performing
        -//     implicit pointer indirections and embedded field selections.
        -//
        -// (2) thunks: funcs that wrap declared methods.  Like wrappers,
        -//     thunks perform indirections and field selections. The thunk's
        -//     first parameter is used as the receiver for the method call.
        -//
        -// (3) bounds: funcs that wrap declared methods.  The bound's sole
        -//     free variable, supplied by a closure, is used as the receiver
        -//     for the method call.  No indirections or field selections are
        -//     performed since they can be done before the call.
        -
        -import (
        -	"fmt"
        -
        -	"go/types"
        -)
        -
        -// -- wrappers -----------------------------------------------------------
        -
        -// makeWrapper returns a synthetic method that delegates to the
        -// declared method denoted by meth.Obj(), first performing any
        -// necessary pointer indirections or field selections implied by meth.
        -//
        -// The resulting method's receiver type is meth.Recv().
        -//
        -// This function is versatile but quite subtle!  Consider the
        -// following axes of variation when making changes:
        -//   - optional receiver indirection
        -//   - optional implicit field selections
        -//   - meth.Obj() may denote a concrete or an interface method
        -//   - the result may be a thunk or a wrapper.
        -//
        -// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
        -//
        -func makeWrapper(prog *Program, sel *types.Selection) *Function {
        -	obj := sel.Obj().(*types.Func)       // the declared function
        -	sig := sel.Type().(*types.Signature) // type of this wrapper
        -
        -	var recv *types.Var // wrapper's receiver or thunk's params[0]
        -	name := obj.Name()
        -	var description string
        -	var start int // first regular param
        -	if sel.Kind() == types.MethodExpr {
        -		name += "$thunk"
        -		description = "thunk"
        -		recv = sig.Params().At(0)
        -		start = 1
        -	} else {
        -		description = "wrapper"
        -		recv = sig.Recv()
        -	}
        -
        -	description = fmt.Sprintf("%s for %s", description, sel.Obj())
        -	if prog.mode&LogSource != 0 {
        -		defer logStack("make %s to (%s)", description, recv.Type())()
        -	}
        -	fn := &Function{
        -		name:      name,
        -		method:    sel,
        -		object:    obj,
        -		Signature: sig,
        -		Synthetic: description,
        -		Prog:      prog,
        -		pos:       obj.Pos(),
        -	}
        -	fn.startBody()
        -	fn.addSpilledParam(recv)
        -	createParams(fn, start)
        -
        -	indices := sel.Index()
        -
        -	var v Value = fn.Locals[0] // spilled receiver
        -	if isPointer(sel.Recv()) {
        -		v = emitLoad(fn, v)
        -
        -		// For simple indirection wrappers, perform an informative nil-check:
        -		// "value method (T).f called using nil *T pointer"
        -		if len(indices) == 1 && !isPointer(recvType(obj)) {
        -			var c Call
        -			c.Call.Value = &Builtin{
        -				name: "ssa:wrapnilchk",
        -				sig: types.NewSignature(nil,
        -					types.NewTuple(anonVar(sel.Recv()), anonVar(tString), anonVar(tString)),
        -					types.NewTuple(anonVar(sel.Recv())), false),
        -			}
        -			c.Call.Args = []Value{
        -				v,
        -				stringConst(deref(sel.Recv()).String()),
        -				stringConst(sel.Obj().Name()),
        -			}
        -			c.setType(v.Type())
        -			v = fn.emit(&c)
        -		}
        -	}
        -
        -	// Invariant: v is a pointer, either
        -	//   value of *A receiver param, or
        -	// address of  A spilled receiver.
        -
        -	// We use pointer arithmetic (FieldAddr possibly followed by
        -	// Load) in preference to value extraction (Field possibly
        -	// preceded by Load).
        -
        -	v = emitImplicitSelections(fn, v, indices[:len(indices)-1])
        -
        -	// Invariant: v is a pointer, either
        -	//   value of implicit *C field, or
        -	// address of implicit  C field.
        -
        -	var c Call
        -	if r := recvType(obj); !isInterface(r) { // concrete method
        -		if !isPointer(r) {
        -			v = emitLoad(fn, v)
        -		}
        -		c.Call.Value = prog.declaredFunc(obj)
        -		c.Call.Args = append(c.Call.Args, v)
        -	} else {
        -		c.Call.Method = obj
        -		c.Call.Value = emitLoad(fn, v)
        -	}
        -	for _, arg := range fn.Params[1:] {
        -		c.Call.Args = append(c.Call.Args, arg)
        -	}
        -	emitTailCall(fn, &c)
        -	fn.finishBody()
        -	return fn
        -}
        -
        -// createParams creates parameters for wrapper method fn based on its
        -// Signature.Params, which do not include the receiver.
        -// start is the index of the first regular parameter to use.
        -//
        -func createParams(fn *Function, start int) {
        -	tparams := fn.Signature.Params()
        -	for i, n := start, tparams.Len(); i < n; i++ {
        -		fn.addParamObj(tparams.At(i))
        -	}
        -}
        -
        -// -- bounds -----------------------------------------------------------
        -
        -// makeBound returns a bound method wrapper (or "bound"), a synthetic
        -// function that delegates to a concrete or interface method denoted
        -// by obj.  The resulting function has no receiver, but has one free
        -// variable which will be used as the method's receiver in the
        -// tail-call.
        -//
        -// Use MakeClosure with such a wrapper to construct a bound method
        -// closure.  e.g.:
        -//
        -//   type T int          or:  type T interface { meth() }
        -//   func (t T) meth()
        -//   var t T
        -//   f := t.meth
        -//   f() // calls t.meth()
        -//
        -// f is a closure of a synthetic wrapper defined as if by:
        -//
        -//   f := func() { return t.meth() }
        -//
        -// Unlike makeWrapper, makeBound need perform no indirection or field
        -// selections because that can be done before the closure is
        -// constructed.
        -//
        -// EXCLUSIVE_LOCKS_ACQUIRED(meth.Prog.methodsMu)
        -//
        -func makeBound(prog *Program, obj *types.Func) *Function {
        -	prog.methodsMu.Lock()
        -	defer prog.methodsMu.Unlock()
        -	fn, ok := prog.bounds[obj]
        -	if !ok {
        -		description := fmt.Sprintf("bound method wrapper for %s", obj)
        -		if prog.mode&LogSource != 0 {
        -			defer logStack("%s", description)()
        -		}
        -		fn = &Function{
        -			name:      obj.Name() + "$bound",
        -			object:    obj,
        -			Signature: changeRecv(obj.Type().(*types.Signature), nil), // drop receiver
        -			Synthetic: description,
        -			Prog:      prog,
        -			pos:       obj.Pos(),
        -		}
        -
        -		fv := &FreeVar{name: "recv", typ: recvType(obj), parent: fn}
        -		fn.FreeVars = []*FreeVar{fv}
        -		fn.startBody()
        -		createParams(fn, 0)
        -		var c Call
        -
        -		if !isInterface(recvType(obj)) { // concrete
        -			c.Call.Value = prog.declaredFunc(obj)
        -			c.Call.Args = []Value{fv}
        -		} else {
        -			c.Call.Value = fv
        -			c.Call.Method = obj
        -		}
        -		for _, arg := range fn.Params {
        -			c.Call.Args = append(c.Call.Args, arg)
        -		}
        -		emitTailCall(fn, &c)
        -		fn.finishBody()
        -
        -		prog.bounds[obj] = fn
        -	}
        -	return fn
        -}
        -
        -// -- thunks -----------------------------------------------------------
        -
        -// makeThunk returns a thunk, a synthetic function that delegates to a
        -// concrete or interface method denoted by sel.Obj().  The resulting
        -// function has no receiver, but has an additional (first) regular
        -// parameter.
        -//
        -// Precondition: sel.Kind() == types.MethodExpr.
        -//
        -//   type T int          or:  type T interface { meth() }
        -//   func (t T) meth()
        -//   f := T.meth
        -//   var t T
        -//   f(t) // calls t.meth()
        -//
        -// f is a synthetic wrapper defined as if by:
        -//
        -//   f := func(t T) { return t.meth() }
        -//
        -// TODO(adonovan): opt: currently the stub is created even when used
        -// directly in a function call: C.f(i, 0).  This is less efficient
        -// than inlining the stub.
        -//
        -// EXCLUSIVE_LOCKS_ACQUIRED(meth.Prog.methodsMu)
        -//
        -func makeThunk(prog *Program, sel *types.Selection) *Function {
        -	if sel.Kind() != types.MethodExpr {
        -		panic(sel)
        -	}
        -
        -	key := selectionKey{
        -		kind:     sel.Kind(),
        -		recv:     sel.Recv(),
        -		obj:      sel.Obj(),
        -		index:    fmt.Sprint(sel.Index()),
        -		indirect: sel.Indirect(),
        -	}
        -
        -	prog.methodsMu.Lock()
        -	defer prog.methodsMu.Unlock()
        -
        -	// Canonicalize key.recv to avoid constructing duplicate thunks.
        -	canonRecv, ok := prog.canon.At(key.recv).(types.Type)
        -	if !ok {
        -		canonRecv = key.recv
        -		prog.canon.Set(key.recv, canonRecv)
        -	}
        -	key.recv = canonRecv
        -
        -	fn, ok := prog.thunks[key]
        -	if !ok {
        -		fn = makeWrapper(prog, sel)
        -		if fn.Signature.Recv() != nil {
        -			panic(fn) // unexpected receiver
        -		}
        -		prog.thunks[key] = fn
        -	}
        -	return fn
        -}
        -
        -func changeRecv(s *types.Signature, recv *types.Var) *types.Signature {
        -	return types.NewSignature(recv, s.Params(), s.Results(), s.Variadic())
        -}
        -
        -// selectionKey is like types.Selection but a usable map key.
        -type selectionKey struct {
        -	kind     types.SelectionKind
        -	recv     types.Type // canonicalized via Program.canon
        -	obj      types.Object
        -	index    string
        -	indirect bool
        -}
        diff --git a/vendor/honnef.co/go/tools/ssa/write.go b/vendor/honnef.co/go/tools/ssa/write.go
        deleted file mode 100644
        index 89761a18a..000000000
        --- a/vendor/honnef.co/go/tools/ssa/write.go
        +++ /dev/null
        @@ -1,5 +0,0 @@
        -package ssa
        -
        -func NewJump(parent *BasicBlock) *Jump {
        -	return &Jump{anInstruction{parent}}
        -}
        diff --git a/vendor/honnef.co/go/tools/ssautil/ssautil.go b/vendor/honnef.co/go/tools/ssautil/ssautil.go
        deleted file mode 100644
        index 72c3c919d..000000000
        --- a/vendor/honnef.co/go/tools/ssautil/ssautil.go
        +++ /dev/null
        @@ -1,58 +0,0 @@
        -package ssautil
        -
        -import (
        -	"honnef.co/go/tools/ssa"
        -)
        -
        -func Reachable(from, to *ssa.BasicBlock) bool {
        -	if from == to {
        -		return true
        -	}
        -	if from.Dominates(to) {
        -		return true
        -	}
        -
        -	found := false
        -	Walk(from, func(b *ssa.BasicBlock) bool {
        -		if b == to {
        -			found = true
        -			return false
        -		}
        -		return true
        -	})
        -	return found
        -}
        -
        -func Walk(b *ssa.BasicBlock, fn func(*ssa.BasicBlock) bool) {
        -	seen := map[*ssa.BasicBlock]bool{}
        -	wl := []*ssa.BasicBlock{b}
        -	for len(wl) > 0 {
        -		b := wl[len(wl)-1]
        -		wl = wl[:len(wl)-1]
        -		if seen[b] {
        -			continue
        -		}
        -		seen[b] = true
        -		if !fn(b) {
        -			continue
        -		}
        -		wl = append(wl, b.Succs...)
        -	}
        -}
        -
        -func Vararg(x *ssa.Slice) ([]ssa.Value, bool) {
        -	var out []ssa.Value
        -	slice, ok := x.X.(*ssa.Alloc)
        -	if !ok || slice.Comment != "varargs" {
        -		return nil, false
        -	}
        -	for _, ref := range *slice.Referrers() {
        -		idx, ok := ref.(*ssa.IndexAddr)
        -		if !ok {
        -			continue
        -		}
        -		v := (*idx.Referrers())[0].(*ssa.Store).Val
        -		out = append(out, v)
        -	}
        -	return out, true
        -}
        diff --git a/vendor/honnef.co/go/tools/staticcheck/CONTRIBUTING.md b/vendor/honnef.co/go/tools/staticcheck/CONTRIBUTING.md
        deleted file mode 100644
        index b12c7afc7..000000000
        --- a/vendor/honnef.co/go/tools/staticcheck/CONTRIBUTING.md
        +++ /dev/null
        @@ -1,15 +0,0 @@
        -# Contributing to staticcheck
        -
        -## Before filing an issue:
        -
        -### Are you having trouble building staticcheck?
        -
        -Check you have the latest version of its dependencies. Run
        -```
        -go get -u honnef.co/go/tools/staticcheck
        -```
        -If you still have problems, consider searching for existing issues before filing a new issue.
        -
        -## Before sending a pull request:
        -
        -Have you understood the purpose of staticcheck? Make sure to carefully read `README`.
        diff --git a/vendor/honnef.co/go/tools/staticcheck/analysis.go b/vendor/honnef.co/go/tools/staticcheck/analysis.go
        deleted file mode 100644
        index 442aebe5a..000000000
        --- a/vendor/honnef.co/go/tools/staticcheck/analysis.go
        +++ /dev/null
        @@ -1,525 +0,0 @@
        -package staticcheck
        -
        -import (
        -	"flag"
        -
        -	"honnef.co/go/tools/facts"
        -	"honnef.co/go/tools/internal/passes/buildssa"
        -	"honnef.co/go/tools/lint/lintutil"
        -
        -	"golang.org/x/tools/go/analysis"
        -	"golang.org/x/tools/go/analysis/passes/inspect"
        -)
        -
        -func newFlagSet() flag.FlagSet {
        -	fs := flag.NewFlagSet("", flag.PanicOnError)
        -	fs.Var(lintutil.NewVersionFlag(), "go", "Target Go version")
        -	return *fs
        -}
        -
        -var Analyzers = map[string]*analysis.Analyzer{
        -	"SA1000": {
        -		Name:     "SA1000",
        -		Run:      callChecker(checkRegexpRules),
        -		Doc:      Docs["SA1000"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA1001": {
        -		Name:     "SA1001",
        -		Run:      CheckTemplate,
        -		Doc:      Docs["SA1001"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA1002": {
        -		Name:     "SA1002",
        -		Run:      callChecker(checkTimeParseRules),
        -		Doc:      Docs["SA1002"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA1003": {
        -		Name:     "SA1003",
        -		Run:      callChecker(checkEncodingBinaryRules),
        -		Doc:      Docs["SA1003"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA1004": {
        -		Name:     "SA1004",
        -		Run:      CheckTimeSleepConstant,
        -		Doc:      Docs["SA1004"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA1005": {
        -		Name:     "SA1005",
        -		Run:      CheckExec,
        -		Doc:      Docs["SA1005"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA1006": {
        -		Name:     "SA1006",
        -		Run:      CheckUnsafePrintf,
        -		Doc:      Docs["SA1006"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA1007": {
        -		Name:     "SA1007",
        -		Run:      callChecker(checkURLsRules),
        -		Doc:      Docs["SA1007"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA1008": {
        -		Name:     "SA1008",
        -		Run:      CheckCanonicalHeaderKey,
        -		Doc:      Docs["SA1008"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA1010": {
        -		Name:     "SA1010",
        -		Run:      callChecker(checkRegexpFindAllRules),
        -		Doc:      Docs["SA1010"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA1011": {
        -		Name:     "SA1011",
        -		Run:      callChecker(checkUTF8CutsetRules),
        -		Doc:      Docs["SA1011"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA1012": {
        -		Name:     "SA1012",
        -		Run:      CheckNilContext,
        -		Doc:      Docs["SA1012"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA1013": {
        -		Name:     "SA1013",
        -		Run:      CheckSeeker,
        -		Doc:      Docs["SA1013"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA1014": {
        -		Name:     "SA1014",
        -		Run:      callChecker(checkUnmarshalPointerRules),
        -		Doc:      Docs["SA1014"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA1015": {
        -		Name:     "SA1015",
        -		Run:      CheckLeakyTimeTick,
        -		Doc:      Docs["SA1015"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA1016": {
        -		Name:     "SA1016",
        -		Run:      CheckUntrappableSignal,
        -		Doc:      Docs["SA1016"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA1017": {
        -		Name:     "SA1017",
        -		Run:      callChecker(checkUnbufferedSignalChanRules),
        -		Doc:      Docs["SA1017"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA1018": {
        -		Name:     "SA1018",
        -		Run:      callChecker(checkStringsReplaceZeroRules),
        -		Doc:      Docs["SA1018"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA1019": {
        -		Name:     "SA1019",
        -		Run:      CheckDeprecated,
        -		Doc:      Docs["SA1019"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Deprecated},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA1020": {
        -		Name:     "SA1020",
        -		Run:      callChecker(checkListenAddressRules),
        -		Doc:      Docs["SA1020"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA1021": {
        -		Name:     "SA1021",
        -		Run:      callChecker(checkBytesEqualIPRules),
        -		Doc:      Docs["SA1021"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA1023": {
        -		Name:     "SA1023",
        -		Run:      CheckWriterBufferModified,
        -		Doc:      Docs["SA1023"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA1024": {
        -		Name:     "SA1024",
        -		Run:      callChecker(checkUniqueCutsetRules),
        -		Doc:      Docs["SA1024"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA1025": {
        -		Name:     "SA1025",
        -		Run:      CheckTimerResetReturnValue,
        -		Doc:      Docs["SA1025"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA1026": {
        -		Name:     "SA1026",
        -		Run:      callChecker(checkUnsupportedMarshal),
        -		Doc:      Docs["SA1026"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA1027": {
        -		Name:     "SA1027",
        -		Run:      callChecker(checkAtomicAlignment),
        -		Doc:      Docs["SA1027"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
        -		Flags:    newFlagSet(),
        -	},
        -
        -	"SA2000": {
        -		Name:     "SA2000",
        -		Run:      CheckWaitgroupAdd,
        -		Doc:      Docs["SA2000"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA2001": {
        -		Name:     "SA2001",
        -		Run:      CheckEmptyCriticalSection,
        -		Doc:      Docs["SA2001"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA2002": {
        -		Name:     "SA2002",
        -		Run:      CheckConcurrentTesting,
        -		Doc:      Docs["SA2002"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA2003": {
        -		Name:     "SA2003",
        -		Run:      CheckDeferLock,
        -		Doc:      Docs["SA2003"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -
        -	"SA3000": {
        -		Name:     "SA3000",
        -		Run:      CheckTestMainExit,
        -		Doc:      Docs["SA3000"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA3001": {
        -		Name:     "SA3001",
        -		Run:      CheckBenchmarkN,
        -		Doc:      Docs["SA3001"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -
        -	"SA4000": {
        -		Name:     "SA4000",
        -		Run:      CheckLhsRhsIdentical,
        -		Doc:      Docs["SA4000"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.TokenFile, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA4001": {
        -		Name:     "SA4001",
        -		Run:      CheckIneffectiveCopy,
        -		Doc:      Docs["SA4001"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA4002": {
        -		Name:     "SA4002",
        -		Run:      CheckDiffSizeComparison,
        -		Doc:      Docs["SA4002"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA4003": {
        -		Name:     "SA4003",
        -		Run:      CheckExtremeComparison,
        -		Doc:      Docs["SA4003"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA4004": {
        -		Name:     "SA4004",
        -		Run:      CheckIneffectiveLoop,
        -		Doc:      Docs["SA4004"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA4006": {
        -		Name:     "SA4006",
        -		Run:      CheckUnreadVariableValues,
        -		Doc:      Docs["SA4006"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA4008": {
        -		Name:     "SA4008",
        -		Run:      CheckLoopCondition,
        -		Doc:      Docs["SA4008"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA4009": {
        -		Name:     "SA4009",
        -		Run:      CheckArgOverwritten,
        -		Doc:      Docs["SA4009"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA4010": {
        -		Name:     "SA4010",
        -		Run:      CheckIneffectiveAppend,
        -		Doc:      Docs["SA4010"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA4011": {
        -		Name:     "SA4011",
        -		Run:      CheckScopedBreak,
        -		Doc:      Docs["SA4011"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA4012": {
        -		Name:     "SA4012",
        -		Run:      CheckNaNComparison,
        -		Doc:      Docs["SA4012"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA4013": {
        -		Name:     "SA4013",
        -		Run:      CheckDoubleNegation,
        -		Doc:      Docs["SA4013"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA4014": {
        -		Name:     "SA4014",
        -		Run:      CheckRepeatedIfElse,
        -		Doc:      Docs["SA4014"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA4015": {
        -		Name:     "SA4015",
        -		Run:      callChecker(checkMathIntRules),
        -		Doc:      Docs["SA4015"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA4016": {
        -		Name:     "SA4016",
        -		Run:      CheckSillyBitwiseOps,
        -		Doc:      Docs["SA4016"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer, facts.TokenFile},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA4017": {
        -		Name:     "SA4017",
        -		Run:      CheckPureFunctions,
        -		Doc:      Docs["SA4017"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer, facts.Purity},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA4018": {
        -		Name:     "SA4018",
        -		Run:      CheckSelfAssignment,
        -		Doc:      Docs["SA4018"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated, facts.TokenFile},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA4019": {
        -		Name:     "SA4019",
        -		Run:      CheckDuplicateBuildConstraints,
        -		Doc:      Docs["SA4019"].String(),
        -		Requires: []*analysis.Analyzer{facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA4020": {
        -		Name:     "SA4020",
        -		Run:      CheckUnreachableTypeCases,
        -		Doc:      Docs["SA4020"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA4021": {
        -		Name:     "SA4021",
        -		Run:      CheckSingleArgAppend,
        -		Doc:      Docs["SA4021"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated, facts.TokenFile},
        -		Flags:    newFlagSet(),
        -	},
        -
        -	"SA5000": {
        -		Name:     "SA5000",
        -		Run:      CheckNilMaps,
        -		Doc:      Docs["SA5000"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA5001": {
        -		Name:     "SA5001",
        -		Run:      CheckEarlyDefer,
        -		Doc:      Docs["SA5001"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA5002": {
        -		Name:     "SA5002",
        -		Run:      CheckInfiniteEmptyLoop,
        -		Doc:      Docs["SA5002"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA5003": {
        -		Name:     "SA5003",
        -		Run:      CheckDeferInInfiniteLoop,
        -		Doc:      Docs["SA5003"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA5004": {
        -		Name:     "SA5004",
        -		Run:      CheckLoopEmptyDefault,
        -		Doc:      Docs["SA5004"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA5005": {
        -		Name:     "SA5005",
        -		Run:      CheckCyclicFinalizer,
        -		Doc:      Docs["SA5005"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA5007": {
        -		Name:     "SA5007",
        -		Run:      CheckInfiniteRecursion,
        -		Doc:      Docs["SA5007"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA5008": {
        -		Name:     "SA5008",
        -		Run:      CheckStructTags,
        -		Doc:      Docs["SA5008"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA5009": {
        -		Name:     "SA5009",
        -		Run:      callChecker(checkPrintfRules),
        -		Doc:      Docs["SA5009"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
        -		Flags:    newFlagSet(),
        -	},
        -
        -	"SA6000": {
        -		Name:     "SA6000",
        -		Run:      callChecker(checkRegexpMatchLoopRules),
        -		Doc:      Docs["SA6000"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA6001": {
        -		Name:     "SA6001",
        -		Run:      CheckMapBytesKey,
        -		Doc:      Docs["SA6001"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA6002": {
        -		Name:     "SA6002",
        -		Run:      callChecker(checkSyncPoolValueRules),
        -		Doc:      Docs["SA6002"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA6003": {
        -		Name:     "SA6003",
        -		Run:      CheckRangeStringRunes,
        -		Doc:      Docs["SA6003"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA6005": {
        -		Name:     "SA6005",
        -		Run:      CheckToLowerToUpperComparison,
        -		Doc:      Docs["SA6005"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -
        -	"SA9001": {
        -		Name:     "SA9001",
        -		Run:      CheckDubiousDeferInChannelRangeLoop,
        -		Doc:      Docs["SA9001"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA9002": {
        -		Name:     "SA9002",
        -		Run:      CheckNonOctalFileMode,
        -		Doc:      Docs["SA9002"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA9003": {
        -		Name:     "SA9003",
        -		Run:      CheckEmptyBranch,
        -		Doc:      Docs["SA9003"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer, facts.TokenFile, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"SA9004": {
        -		Name:     "SA9004",
        -		Run:      CheckMissingEnumTypesInDeclaration,
        -		Doc:      Docs["SA9004"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	// Filtering generated code because it may include empty structs generated from data models.
        -	"SA9005": {
        -		Name:     "SA9005",
        -		Run:      callChecker(checkNoopMarshal),
        -		Doc:      Docs["SA9005"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer, facts.Generated, facts.TokenFile},
        -		Flags:    newFlagSet(),
        -	},
        -}
        diff --git a/vendor/honnef.co/go/tools/staticcheck/buildtag.go b/vendor/honnef.co/go/tools/staticcheck/buildtag.go
        deleted file mode 100644
        index 888d3e9dc..000000000
        --- a/vendor/honnef.co/go/tools/staticcheck/buildtag.go
        +++ /dev/null
        @@ -1,21 +0,0 @@
        -package staticcheck
        -
        -import (
        -	"go/ast"
        -	"strings"
        -
        -	. "honnef.co/go/tools/lint/lintdsl"
        -)
        -
        -func buildTags(f *ast.File) [][]string {
        -	var out [][]string
        -	for _, line := range strings.Split(Preamble(f), "\n") {
        -		if !strings.HasPrefix(line, "+build ") {
        -			continue
        -		}
        -		line = strings.TrimSpace(strings.TrimPrefix(line, "+build "))
        -		fields := strings.Fields(line)
        -		out = append(out, fields)
        -	}
        -	return out
        -}
        diff --git a/vendor/honnef.co/go/tools/staticcheck/doc.go b/vendor/honnef.co/go/tools/staticcheck/doc.go
        deleted file mode 100644
        index 4a87d4a24..000000000
        --- a/vendor/honnef.co/go/tools/staticcheck/doc.go
        +++ /dev/null
        @@ -1,764 +0,0 @@
        -package staticcheck
        -
        -import "honnef.co/go/tools/lint"
        -
        -var Docs = map[string]*lint.Documentation{
        -	"SA1000": &lint.Documentation{
        -		Title: `Invalid regular expression`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA1001": &lint.Documentation{
        -		Title: `Invalid template`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA1002": &lint.Documentation{
        -		Title: `Invalid format in time.Parse`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA1003": &lint.Documentation{
        -		Title: `Unsupported argument to functions in encoding/binary`,
        -		Text: `The encoding/binary package can only serialize types with known sizes.
        -This precludes the use of the int and uint types, as their sizes
        -differ on different architectures. Furthermore, it doesn't support
        -serializing maps, channels, strings, or functions.
        -
        -Before Go 1.8, bool wasn't supported, either.`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA1004": &lint.Documentation{
        -		Title: `Suspiciously small untyped constant in time.Sleep`,
        -		Text: `The time.Sleep function takes a time.Duration as its only argument.
        -Durations are expressed in nanoseconds. Thus, calling time.Sleep(1)
        -will sleep for 1 nanosecond. This is a common source of bugs, as sleep
        -functions in other languages often accept seconds or milliseconds.
        -
        -The time package provides constants such as time.Second to express
        -large durations. These can be combined with arithmetic to express
        -arbitrary durations, for example '5 * time.Second' for 5 seconds.
        -
        -If you truly meant to sleep for a tiny amount of time, use
        -'n * time.Nanosecond' to signal to staticcheck that you did mean to sleep
        -for some amount of nanoseconds.`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA1005": &lint.Documentation{
        -		Title: `Invalid first argument to exec.Command`,
        -		Text: `os/exec runs programs directly (using variants of the fork and exec
        -system calls on Unix systems). This shouldn't be confused with running
        -a command in a shell. The shell will allow for features such as input
        -redirection, pipes, and general scripting. The shell is also
        -responsible for splitting the user's input into a program name and its
        -arguments. For example, the equivalent to
        -
        -    ls / /tmp
        -
        -would be
        -
        -    exec.Command("ls", "/", "/tmp")
        -
        -If you want to run a command in a shell, consider using something like
        -the following – but be aware that not all systems, particularly
        -Windows, will have a /bin/sh program:
        -
        -    exec.Command("/bin/sh", "-c", "ls | grep Awesome")`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA1006": &lint.Documentation{
        -		Title: `Printf with dynamic first argument and no further arguments`,
        -		Text: `Using fmt.Printf with a dynamic first argument can lead to unexpected
        -output. The first argument is a format string, where certain character
        -combinations have special meaning. If, for example, a user were to
        -enter a string such as
        -
        -    Interest rate: 5%
        -
        -and you printed it with
        -
        -    fmt.Printf(s)
        -
        -it would lead to the following output:
        -
        -    Interest rate: 5%!(NOVERB).
        -
        -Similarly, forming the first parameter via string concatenation with
        -user input should be avoided for the same reason. When printing user
        -input, either use a variant of fmt.Print, or use the %s Printf verb
        -and pass the string as an argument.`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA1007": &lint.Documentation{
        -		Title: `Invalid URL in net/url.Parse`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA1008": &lint.Documentation{
        -		Title: `Non-canonical key in http.Header map`,
        -		Text: `Keys in http.Header maps are canonical, meaning they follow a specific
        -combination of uppercase and lowercase letters. Methods such as
        -http.Header.Add and http.Header.Del convert inputs into this canonical
        -form before manipulating the map.
        -
        -When manipulating http.Header maps directly, as opposed to using the
        -provided methods, care should be taken to stick to canonical form in
        -order to avoid inconsistencies. The following piece of code
        -demonstrates one such inconsistency:
        -
        -    h := http.Header{}
        -    h["etag"] = []string{"1234"}
        -    h.Add("etag", "5678")
        -    fmt.Println(h)
        -
        -    // Output:
        -    // map[Etag:[5678] etag:[1234]]
        -
        -The easiest way of obtaining the canonical form of a key is to use
        -http.CanonicalHeaderKey.`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA1010": &lint.Documentation{
        -		Title: `(*regexp.Regexp).FindAll called with n == 0, which will always return zero results`,
        -		Text: `If n >= 0, the function returns at most n matches/submatches. To
        -return all results, specify a negative number.`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA1011": &lint.Documentation{
        -		Title: `Various methods in the strings package expect valid UTF-8, but invalid input is provided`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA1012": &lint.Documentation{
        -		Title: `A nil context.Context is being passed to a function, consider using context.TODO instead`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA1013": &lint.Documentation{
        -		Title: `io.Seeker.Seek is being called with the whence constant as the first argument, but it should be the second`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA1014": &lint.Documentation{
        -		Title: `Non-pointer value passed to Unmarshal or Decode`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA1015": &lint.Documentation{
        -		Title: `Using time.Tick in a way that will leak. Consider using time.NewTicker, and only use time.Tick in tests, commands and endless functions`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA1016": &lint.Documentation{
        -		Title: `Trapping a signal that cannot be trapped`,
        -		Text: `Not all signals can be intercepted by a process. Speficially, on
        -UNIX-like systems, the syscall.SIGKILL and syscall.SIGSTOP signals are
        -never passed to the process, but instead handled directly by the
        -kernel. It is therefore pointless to try and handle these signals.`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA1017": &lint.Documentation{
        -		Title: `Channels used with os/signal.Notify should be buffered`,
        -		Text: `The os/signal package uses non-blocking channel sends when delivering
        -signals. If the receiving end of the channel isn't ready and the
        -channel is either unbuffered or full, the signal will be dropped. To
        -avoid missing signals, the channel should be buffered and of the
        -appropriate size. For a channel used for notification of just one
        -signal value, a buffer of size 1 is sufficient.`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA1018": &lint.Documentation{
        -		Title: `strings.Replace called with n == 0, which does nothing`,
        -		Text: `With n == 0, zero instances will be replaced. To replace all
        -instances, use a negative number, or use strings.ReplaceAll.`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA1019": &lint.Documentation{
        -		Title: `Using a deprecated function, variable, constant or field`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA1020": &lint.Documentation{
        -		Title: `Using an invalid host:port pair with a net.Listen-related function`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA1021": &lint.Documentation{
        -		Title: `Using bytes.Equal to compare two net.IP`,
        -		Text: `A net.IP stores an IPv4 or IPv6 address as a slice of bytes. The
        -length of the slice for an IPv4 address, however, can be either 4 or
        -16 bytes long, using different ways of representing IPv4 addresses. In
        -order to correctly compare two net.IPs, the net.IP.Equal method should
        -be used, as it takes both representations into account.`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA1023": &lint.Documentation{
        -		Title: `Modifying the buffer in an io.Writer implementation`,
        -		Text:  `Write must not modify the slice data, even temporarily.`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA1024": &lint.Documentation{
        -		Title: `A string cutset contains duplicate characters`,
        -		Text: `The strings.TrimLeft and strings.TrimRight functions take cutsets, not
        -prefixes. A cutset is treated as a set of characters to remove from a
        -string. For example,
        -
        -    strings.TrimLeft("42133word", "1234"))
        -
        -will result in the string "word" – any characters that are 1, 2, 3 or
        -4 are cut from the left of the string.
        -
        -In order to remove one string from another, use strings.TrimPrefix instead.`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA1025": &lint.Documentation{
        -		Title: `It is not possible to use (*time.Timer).Reset's return value correctly`,
        -		Since: "2019.1",
        -	},
        -
        -	"SA1026": &lint.Documentation{
        -		Title: `Cannot marshal channels or functions`,
        -		Since: "2019.2",
        -	},
        -
        -	"SA1027": &lint.Documentation{
        -		Title: `Atomic access to 64-bit variable must be 64-bit aligned`,
        -		Text: `On ARM, x86-32, and 32-bit MIPS, it is the caller's responsibility to
        -arrange for 64-bit alignment of 64-bit words accessed atomically. The
        -first word in a variable or in an allocated struct, array, or slice
        -can be relied upon to be 64-bit aligned.
        -
        -You can use the structlayout tool to inspect the alignment of fields
        -in a struct.`,
        -		Since: "2019.2",
        -	},
        -
        -	"SA2000": &lint.Documentation{
        -		Title: `sync.WaitGroup.Add called inside the goroutine, leading to a race condition`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA2001": &lint.Documentation{
        -		Title: `Empty critical section, did you mean to defer the unlock?`,
        -		Text: `Empty critical sections of the kind
        -
        -    mu.Lock()
        -    mu.Unlock()
        -
        -are very often a typo, and the following was intended instead:
        -
        -    mu.Lock()
        -    defer mu.Unlock()
        -
        -Do note that sometimes empty critical sections can be useful, as a
        -form of signaling to wait on another goroutine. Many times, there are
        -simpler ways of achieving the same effect. When that isn't the case,
        -the code should be amply commented to avoid confusion. Combining such
        -comments with a //lint:ignore directive can be used to suppress this
        -rare false positive.`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA2002": &lint.Documentation{
        -		Title: `Called testing.T.FailNow or SkipNow in a goroutine, which isn't allowed`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA2003": &lint.Documentation{
        -		Title: `Deferred Lock right after locking, likely meant to defer Unlock instead`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA3000": &lint.Documentation{
        -		Title: `TestMain doesn't call os.Exit, hiding test failures`,
        -		Text: `Test executables (and in turn 'go test') exit with a non-zero status
        -code if any tests failed. When specifying your own TestMain function,
        -it is your responsibility to arrange for this, by calling os.Exit with
        -the correct code. The correct code is returned by (*testing.M).Run, so
        -the usual way of implementing TestMain is to end it with
        -os.Exit(m.Run()).`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA3001": &lint.Documentation{
        -		Title: `Assigning to b.N in benchmarks distorts the results`,
        -		Text: `The testing package dynamically sets b.N to improve the reliability of
        -benchmarks and uses it in computations to determine the duration of a
        -single operation. Benchmark code must not alter b.N as this would
        -falsify results.`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA4000": &lint.Documentation{
        -		Title: `Boolean expression has identical expressions on both sides`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA4001": &lint.Documentation{
        -		Title: `&*x gets simplified to x, it does not copy x`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA4002": &lint.Documentation{
        -		Title: `Comparing strings with known different sizes has predictable results`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA4003": &lint.Documentation{
        -		Title: `Comparing unsigned values against negative values is pointless`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA4004": &lint.Documentation{
        -		Title: `The loop exits unconditionally after one iteration`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA4005": &lint.Documentation{
        -		Title: `Field assignment that will never be observed. Did you mean to use a pointer receiver?`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA4006": &lint.Documentation{
        -		Title: `A value assigned to a variable is never read before being overwritten. Forgotten error check or dead code?`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA4008": &lint.Documentation{
        -		Title: `The variable in the loop condition never changes, are you incrementing the wrong variable?`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA4009": &lint.Documentation{
        -		Title: `A function argument is overwritten before its first use`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA4010": &lint.Documentation{
        -		Title: `The result of append will never be observed anywhere`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA4011": &lint.Documentation{
        -		Title: `Break statement with no effect. Did you mean to break out of an outer loop?`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA4012": &lint.Documentation{
        -		Title: `Comparing a value against NaN even though no value is equal to NaN`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA4013": &lint.Documentation{
        -		Title: `Negating a boolean twice (!!b) is the same as writing b. This is either redundant, or a typo.`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA4014": &lint.Documentation{
        -		Title: `An if/else if chain has repeated conditions and no side-effects; if the condition didn't match the first time, it won't match the second time, either`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA4015": &lint.Documentation{
        -		Title: `Calling functions like math.Ceil on floats converted from integers doesn't do anything useful`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA4016": &lint.Documentation{
        -		Title: `Certain bitwise operations, such as x ^ 0, do not do anything useful`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA4017": &lint.Documentation{
        -		Title: `A pure function's return value is discarded, making the call pointless`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA4018": &lint.Documentation{
        -		Title: `Self-assignment of variables`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA4019": &lint.Documentation{
        -		Title: `Multiple, identical build constraints in the same file`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA4020": &lint.Documentation{
        -		Title: `Unreachable case clause in a type switch`,
        -		Text: `In a type switch like the following
        -
        -    type T struct{}
        -    func (T) Read(b []byte) (int, error) { return 0, nil }
        -
        -    var v interface{} = T{}
        -
        -    switch v.(type) {
        -    case io.Reader:
        -        // ...
        -    case T:
        -        // unreachable
        -    }
        -
        -the second case clause can never be reached because T implements
        -io.Reader and case clauses are evaluated in source order.
        -
        -Another example:
        -
        -    type T struct{}
        -    func (T) Read(b []byte) (int, error) { return 0, nil }
        -    func (T) Close() error { return nil }
        -
        -    var v interface{} = T{}
        -
        -    switch v.(type) {
        -    case io.Reader:
        -        // ...
        -    case io.ReadCloser:
        -        // unreachable
        -    }
        -
        -Even though T has a Close method and thus implements io.ReadCloser,
        -io.Reader will always match first. The method set of io.Reader is a
        -subset of io.ReadCloser. Thus it is impossible to match the second
        -case without matching the first case.
        -
        -
        -Structurally equivalent interfaces
        -
        -A special case of the previous example are structurally identical
        -interfaces. Given these declarations
        -
        -    type T error
        -    type V error
        -
        -    func doSomething() error {
        -        err, ok := doAnotherThing()
        -        if ok {
        -            return T(err)
        -        }
        -
        -        return U(err)
        -    }
        -
        -the following type switch will have an unreachable case clause:
        -
        -    switch doSomething().(type) {
        -    case T:
        -        // ...
        -    case V:
        -        // unreachable
        -    }
        -
        -T will always match before V because they are structurally equivalent
        -and therefore doSomething()'s return value implements both.`,
        -		Since: "2019.2",
        -	},
        -
        -	"SA4021": &lint.Documentation{
        -		Title: `x = append(y) is equivalent to x = y`,
        -		Since: "2019.2",
        -	},
        -
        -	"SA5000": &lint.Documentation{
        -		Title: `Assignment to nil map`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA5001": &lint.Documentation{
        -		Title: `Defering Close before checking for a possible error`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA5002": &lint.Documentation{
        -		Title: `The empty for loop (for {}) spins and can block the scheduler`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA5003": &lint.Documentation{
        -		Title: `Defers in infinite loops will never execute`,
        -		Text: `Defers are scoped to the surrounding function, not the surrounding
        -block. In a function that never returns, i.e. one containing an
        -infinite loop, defers will never execute.`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA5004": &lint.Documentation{
        -		Title: `for { select { ... with an empty default branch spins`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA5005": &lint.Documentation{
        -		Title: `The finalizer references the finalized object, preventing garbage collection`,
        -		Text: `A finalizer is a function associated with an object that runs when the
        -garbage collector is ready to collect said object, that is when the
        -object is no longer referenced by anything.
        -
        -If the finalizer references the object, however, it will always remain
        -as the final reference to that object, preventing the garbage
        -collector from collecting the object. The finalizer will never run,
        -and the object will never be collected, leading to a memory leak. That
        -is why the finalizer should instead use its first argument to operate
        -on the object. That way, the number of references can temporarily go
        -to zero before the object is being passed to the finalizer.`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA5006": &lint.Documentation{
        -		Title: `Slice index out of bounds`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA5007": &lint.Documentation{
        -		Title: `Infinite recursive call`,
        -		Text: `A function that calls itself recursively needs to have an exit
        -condition. Otherwise it will recurse forever, until the system runs
        -out of memory.
        -
        -This issue can be caused by simple bugs such as forgetting to add an
        -exit condition. It can also happen "on purpose". Some languages have
        -tail call optimization which makes certain infinite recursive calls
        -safe to use. Go, however, does not implement TCO, and as such a loop
        -should be used instead.`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA5008": &lint.Documentation{
        -		Title: `Invalid struct tag`,
        -		Since: "2019.2",
        -	},
        -
        -	"SA5009": &lint.Documentation{
        -		Title: `Invalid Printf call`,
        -		Since: "2019.2",
        -	},
        -
        -	"SA6000": &lint.Documentation{
        -		Title: `Using regexp.Match or related in a loop, should use regexp.Compile`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA6001": &lint.Documentation{
        -		Title: `Missing an optimization opportunity when indexing maps by byte slices`,
        -
        -		Text: `Map keys must be comparable, which precludes the use of byte slices.
        -This usually leads to using string keys and converting byte slices to
        -strings.
        -
        -Normally, a conversion of a byte slice to a string needs to copy the data and
        -causes allocations. The compiler, however, recognizes m[string(b)] and
        -uses the data of b directly, without copying it, because it knows that
        -the data can't change during the map lookup. This leads to the
        -counter-intuitive situation that
        -
        -    k := string(b)
        -    println(m[k])
        -    println(m[k])
        -
        -will be less efficient than
        -
        -    println(m[string(b)])
        -    println(m[string(b)])
        -
        -because the first version needs to copy and allocate, while the second
        -one does not.
        -
        -For some history on this optimization, check out commit
        -f5f5a8b6209f84961687d993b93ea0d397f5d5bf in the Go repository.`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA6002": &lint.Documentation{
        -		Title: `Storing non-pointer values in sync.Pool allocates memory`,
        -		Text: `A sync.Pool is used to avoid unnecessary allocations and reduce the
        -amount of work the garbage collector has to do.
        -
        -When passing a value that is not a pointer to a function that accepts
        -an interface, the value needs to be placed on the heap, which means an
        -additional allocation. Slices are a common thing to put in sync.Pools,
        -and they're structs with 3 fields (length, capacity, and a pointer to
        -an array). In order to avoid the extra allocation, one should store a
        -pointer to the slice instead.
        -
        -See the comments on https://go-review.googlesource.com/c/go/+/24371
        -that discuss this problem.`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA6003": &lint.Documentation{
        -		Title: `Converting a string to a slice of runes before ranging over it`,
        -		Text: `You may want to loop over the runes in a string. Instead of converting
        -the string to a slice of runes and looping over that, you can loop
        -over the string itself. That is,
        -
        -    for _, r := range s {}
        -
        -and
        -
        -    for _, r := range []rune(s) {}
        -
        -will yield the same values. The first version, however, will be faster
        -and avoid unnecessary memory allocations.
        -
        -Do note that if you are interested in the indices, ranging over a
        -string and over a slice of runes will yield different indices. The
        -first one yields byte offsets, while the second one yields indices in
        -the slice of runes.`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA6005": &lint.Documentation{
        -		Title: `Inefficient string comparison with strings.ToLower or strings.ToUpper`,
        -		Text: `Converting two strings to the same case and comparing them like so
        -
        -    if strings.ToLower(s1) == strings.ToLower(s2) {
        -        ...
        -    }
        -
        -is significantly more expensive than comparing them with
        -strings.EqualFold(s1, s2). This is due to memory usage as well as
        -computational complexity.
        -
        -strings.ToLower will have to allocate memory for the new strings, as
        -well as convert both strings fully, even if they differ on the very
        -first byte. strings.EqualFold, on the other hand, compares the strings
        -one character at a time. It doesn't need to create two intermediate
        -strings and can return as soon as the first non-matching character has
        -been found.
        -
        -For a more in-depth explanation of this issue, see
        -https://blog.digitalocean.com/how-to-efficiently-compare-strings-in-go/`,
        -		Since: "2019.2",
        -	},
        -
        -	"SA9001": &lint.Documentation{
        -		Title: `Defers in range loops may not run when you expect them to`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA9002": &lint.Documentation{
        -		Title: `Using a non-octal os.FileMode that looks like it was meant to be in octal.`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA9003": &lint.Documentation{
        -		Title: `Empty body in an if or else branch`,
        -		Since: "2017.1",
        -	},
        -
        -	"SA9004": &lint.Documentation{
        -		Title: `Only the first constant has an explicit type`,
        -
        -		Text: `In a constant declaration such as the following:
        -
        -    const (
        -        First byte = 1
        -        Second     = 2
        -    )
        -
        -the constant Second does not have the same type as the constant First.
        -This construct shouldn't be confused with
        -
        -    const (
        -        First byte = iota
        -        Second
        -    )
        -
        -where First and Second do indeed have the same type. The type is only
        -passed on when no explicit value is assigned to the constant.
        -
        -When declaring enumerations with explicit values it is therefore
        -important not to write
        -
        -    const (
        -          EnumFirst EnumType = 1
        -          EnumSecond         = 2
        -          EnumThird          = 3
        -    )
        -
        -This discrepancy in types can cause various confusing behaviors and
        -bugs.
        -
        -
        -Wrong type in variable declarations
        -
        -The most obvious issue with such incorrect enumerations expresses
        -itself as a compile error:
        -
        -    package pkg
        -
        -    const (
        -        EnumFirst  uint8 = 1
        -        EnumSecond       = 2
        -    )
        -
        -    func fn(useFirst bool) {
        -        x := EnumSecond
        -        if useFirst {
        -            x = EnumFirst
        -        }
        -    }
        -
        -fails to compile with
        -
        -    ./const.go:11:5: cannot use EnumFirst (type uint8) as type int in assignment
        -
        -
        -Losing method sets
        -
        -A more subtle issue occurs with types that have methods and optional
        -interfaces. Consider the following:
        -
        -    package main
        -
        -    import "fmt"
        -
        -    type Enum int
        -
        -    func (e Enum) String() string {
        -        return "an enum"
        -    }
        -
        -    const (
        -        EnumFirst  Enum = 1
        -        EnumSecond      = 2
        -    )
        -
        -    func main() {
        -        fmt.Println(EnumFirst)
        -        fmt.Println(EnumSecond)
        -    }
        -
        -This code will output
        -
        -    an enum
        -    2
        -
        -as EnumSecond has no explicit type, and thus defaults to int.`,
        -		Since: "2019.1",
        -	},
        -
        -	"SA9005": &lint.Documentation{
        -		Title: `Trying to marshal a struct with no public fields nor custom marshaling`,
        -		Text: `The encoding/json and encoding/xml packages only operate on exported
        -fields in structs, not unexported ones. It is usually an error to try
        -to (un)marshal structs that only consist of unexported fields.
        -
        -This check will not flag calls involving types that define custom
        -marshaling behavior, e.g. via MarshalJSON methods. It will also not
        -flag empty structs.`,
        -		Since: "2019.2",
        -	},
        -}
        diff --git a/vendor/honnef.co/go/tools/staticcheck/knowledge.go b/vendor/honnef.co/go/tools/staticcheck/knowledge.go
        deleted file mode 100644
        index 4c12b866a..000000000
        --- a/vendor/honnef.co/go/tools/staticcheck/knowledge.go
        +++ /dev/null
        @@ -1,25 +0,0 @@
        -package staticcheck
        -
        -import (
        -	"reflect"
        -
        -	"golang.org/x/tools/go/analysis"
        -	"honnef.co/go/tools/internal/passes/buildssa"
        -	"honnef.co/go/tools/ssa"
        -	"honnef.co/go/tools/staticcheck/vrp"
        -)
        -
        -var valueRangesAnalyzer = &analysis.Analyzer{
        -	Name: "vrp",
        -	Doc:  "calculate value ranges of functions",
        -	Run: func(pass *analysis.Pass) (interface{}, error) {
        -		m := map[*ssa.Function]vrp.Ranges{}
        -		for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -			vr := vrp.BuildGraph(ssafn).Solve()
        -			m[ssafn] = vr
        -		}
        -		return m, nil
        -	},
        -	Requires:   []*analysis.Analyzer{buildssa.Analyzer},
        -	ResultType: reflect.TypeOf(map[*ssa.Function]vrp.Ranges{}),
        -}
        diff --git a/vendor/honnef.co/go/tools/staticcheck/lint.go b/vendor/honnef.co/go/tools/staticcheck/lint.go
        deleted file mode 100644
        index 1558cbf94..000000000
        --- a/vendor/honnef.co/go/tools/staticcheck/lint.go
        +++ /dev/null
        @@ -1,3360 +0,0 @@
        -// Package staticcheck contains a linter for Go source code.
        -package staticcheck // import "honnef.co/go/tools/staticcheck"
        -
        -import (
        -	"fmt"
        -	"go/ast"
        -	"go/constant"
        -	"go/token"
        -	"go/types"
        -	htmltemplate "html/template"
        -	"net/http"
        -	"reflect"
        -	"regexp"
        -	"regexp/syntax"
        -	"sort"
        -	"strconv"
        -	"strings"
        -	texttemplate "text/template"
        -	"unicode"
        -
        -	. "honnef.co/go/tools/arg"
        -	"honnef.co/go/tools/deprecated"
        -	"honnef.co/go/tools/facts"
        -	"honnef.co/go/tools/functions"
        -	"honnef.co/go/tools/internal/passes/buildssa"
        -	"honnef.co/go/tools/internal/sharedcheck"
        -	"honnef.co/go/tools/lint"
        -	. "honnef.co/go/tools/lint/lintdsl"
        -	"honnef.co/go/tools/printf"
        -	"honnef.co/go/tools/ssa"
        -	"honnef.co/go/tools/ssautil"
        -	"honnef.co/go/tools/staticcheck/vrp"
        -
        -	"golang.org/x/tools/go/analysis"
        -	"golang.org/x/tools/go/analysis/passes/inspect"
        -	"golang.org/x/tools/go/ast/astutil"
        -	"golang.org/x/tools/go/ast/inspector"
        -	"golang.org/x/tools/go/types/typeutil"
        -)
        -
        -func validRegexp(call *Call) {
        -	arg := call.Args[0]
        -	err := ValidateRegexp(arg.Value)
        -	if err != nil {
        -		arg.Invalid(err.Error())
        -	}
        -}
        -
        -type runeSlice []rune
        -
        -func (rs runeSlice) Len() int               { return len(rs) }
        -func (rs runeSlice) Less(i int, j int) bool { return rs[i] < rs[j] }
        -func (rs runeSlice) Swap(i int, j int)      { rs[i], rs[j] = rs[j], rs[i] }
        -
        -func utf8Cutset(call *Call) {
        -	arg := call.Args[1]
        -	if InvalidUTF8(arg.Value) {
        -		arg.Invalid(MsgInvalidUTF8)
        -	}
        -}
        -
        -func uniqueCutset(call *Call) {
        -	arg := call.Args[1]
        -	if !UniqueStringCutset(arg.Value) {
        -		arg.Invalid(MsgNonUniqueCutset)
        -	}
        -}
        -
        -func unmarshalPointer(name string, arg int) CallCheck {
        -	return func(call *Call) {
        -		if !Pointer(call.Args[arg].Value) {
        -			call.Args[arg].Invalid(fmt.Sprintf("%s expects to unmarshal into a pointer, but the provided value is not a pointer", name))
        -		}
        -	}
        -}
        -
        -func pointlessIntMath(call *Call) {
        -	if ConvertedFromInt(call.Args[0].Value) {
        -		call.Invalid(fmt.Sprintf("calling %s on a converted integer is pointless", CallName(call.Instr.Common())))
        -	}
        -}
        -
        -func checkValidHostPort(arg int) CallCheck {
        -	return func(call *Call) {
        -		if !ValidHostPort(call.Args[arg].Value) {
        -			call.Args[arg].Invalid(MsgInvalidHostPort)
        -		}
        -	}
        -}
        -
        -var (
        -	checkRegexpRules = map[string]CallCheck{
        -		"regexp.MustCompile": validRegexp,
        -		"regexp.Compile":     validRegexp,
        -		"regexp.Match":       validRegexp,
        -		"regexp.MatchReader": validRegexp,
        -		"regexp.MatchString": validRegexp,
        -	}
        -
        -	checkTimeParseRules = map[string]CallCheck{
        -		"time.Parse": func(call *Call) {
        -			arg := call.Args[Arg("time.Parse.layout")]
        -			err := ValidateTimeLayout(arg.Value)
        -			if err != nil {
        -				arg.Invalid(err.Error())
        -			}
        -		},
        -	}
        -
        -	checkEncodingBinaryRules = map[string]CallCheck{
        -		"encoding/binary.Write": func(call *Call) {
        -			arg := call.Args[Arg("encoding/binary.Write.data")]
        -			if !CanBinaryMarshal(call.Pass, arg.Value) {
        -				arg.Invalid(fmt.Sprintf("value of type %s cannot be used with binary.Write", arg.Value.Value.Type()))
        -			}
        -		},
        -	}
        -
        -	checkURLsRules = map[string]CallCheck{
        -		"net/url.Parse": func(call *Call) {
        -			arg := call.Args[Arg("net/url.Parse.rawurl")]
        -			err := ValidateURL(arg.Value)
        -			if err != nil {
        -				arg.Invalid(err.Error())
        -			}
        -		},
        -	}
        -
        -	checkSyncPoolValueRules = map[string]CallCheck{
        -		"(*sync.Pool).Put": func(call *Call) {
        -			arg := call.Args[Arg("(*sync.Pool).Put.x")]
        -			typ := arg.Value.Value.Type()
        -			if !IsPointerLike(typ) {
        -				arg.Invalid("argument should be pointer-like to avoid allocations")
        -			}
        -		},
        -	}
        -
        -	checkRegexpFindAllRules = map[string]CallCheck{
        -		"(*regexp.Regexp).FindAll":                    RepeatZeroTimes("a FindAll method", 1),
        -		"(*regexp.Regexp).FindAllIndex":               RepeatZeroTimes("a FindAll method", 1),
        -		"(*regexp.Regexp).FindAllString":              RepeatZeroTimes("a FindAll method", 1),
        -		"(*regexp.Regexp).FindAllStringIndex":         RepeatZeroTimes("a FindAll method", 1),
        -		"(*regexp.Regexp).FindAllStringSubmatch":      RepeatZeroTimes("a FindAll method", 1),
        -		"(*regexp.Regexp).FindAllStringSubmatchIndex": RepeatZeroTimes("a FindAll method", 1),
        -		"(*regexp.Regexp).FindAllSubmatch":            RepeatZeroTimes("a FindAll method", 1),
        -		"(*regexp.Regexp).FindAllSubmatchIndex":       RepeatZeroTimes("a FindAll method", 1),
        -	}
        -
        -	checkUTF8CutsetRules = map[string]CallCheck{
        -		"strings.IndexAny":     utf8Cutset,
        -		"strings.LastIndexAny": utf8Cutset,
        -		"strings.ContainsAny":  utf8Cutset,
        -		"strings.Trim":         utf8Cutset,
        -		"strings.TrimLeft":     utf8Cutset,
        -		"strings.TrimRight":    utf8Cutset,
        -	}
        -
        -	checkUniqueCutsetRules = map[string]CallCheck{
        -		"strings.Trim":      uniqueCutset,
        -		"strings.TrimLeft":  uniqueCutset,
        -		"strings.TrimRight": uniqueCutset,
        -	}
        -
        -	checkUnmarshalPointerRules = map[string]CallCheck{
        -		"encoding/xml.Unmarshal":                unmarshalPointer("xml.Unmarshal", 1),
        -		"(*encoding/xml.Decoder).Decode":        unmarshalPointer("Decode", 0),
        -		"(*encoding/xml.Decoder).DecodeElement": unmarshalPointer("DecodeElement", 0),
        -		"encoding/json.Unmarshal":               unmarshalPointer("json.Unmarshal", 1),
        -		"(*encoding/json.Decoder).Decode":       unmarshalPointer("Decode", 0),
        -	}
        -
        -	checkUnbufferedSignalChanRules = map[string]CallCheck{
        -		"os/signal.Notify": func(call *Call) {
        -			arg := call.Args[Arg("os/signal.Notify.c")]
        -			if UnbufferedChannel(arg.Value) {
        -				arg.Invalid("the channel used with signal.Notify should be buffered")
        -			}
        -		},
        -	}
        -
        -	checkMathIntRules = map[string]CallCheck{
        -		"math.Ceil":  pointlessIntMath,
        -		"math.Floor": pointlessIntMath,
        -		"math.IsNaN": pointlessIntMath,
        -		"math.Trunc": pointlessIntMath,
        -		"math.IsInf": pointlessIntMath,
        -	}
        -
        -	checkStringsReplaceZeroRules = map[string]CallCheck{
        -		"strings.Replace": RepeatZeroTimes("strings.Replace", 3),
        -		"bytes.Replace":   RepeatZeroTimes("bytes.Replace", 3),
        -	}
        -
        -	checkListenAddressRules = map[string]CallCheck{
        -		"net/http.ListenAndServe":    checkValidHostPort(0),
        -		"net/http.ListenAndServeTLS": checkValidHostPort(0),
        -	}
        -
        -	checkBytesEqualIPRules = map[string]CallCheck{
        -		"bytes.Equal": func(call *Call) {
        -			if ConvertedFrom(call.Args[Arg("bytes.Equal.a")].Value, "net.IP") &&
        -				ConvertedFrom(call.Args[Arg("bytes.Equal.b")].Value, "net.IP") {
        -				call.Invalid("use net.IP.Equal to compare net.IPs, not bytes.Equal")
        -			}
        -		},
        -	}
        -
        -	checkRegexpMatchLoopRules = map[string]CallCheck{
        -		"regexp.Match":       loopedRegexp("regexp.Match"),
        -		"regexp.MatchReader": loopedRegexp("regexp.MatchReader"),
        -		"regexp.MatchString": loopedRegexp("regexp.MatchString"),
        -	}
        -
        -	checkNoopMarshal = map[string]CallCheck{
        -		// TODO(dh): should we really flag XML? Even an empty struct
        -		// produces a non-zero amount of data, namely its type name.
        -		// Let's see if we encounter any false positives.
        -		//
        -		// Also, should we flag gob?
        -		"encoding/json.Marshal":           checkNoopMarshalImpl(Arg("json.Marshal.v"), "MarshalJSON", "MarshalText"),
        -		"encoding/xml.Marshal":            checkNoopMarshalImpl(Arg("xml.Marshal.v"), "MarshalXML", "MarshalText"),
        -		"(*encoding/json.Encoder).Encode": checkNoopMarshalImpl(Arg("(*encoding/json.Encoder).Encode.v"), "MarshalJSON", "MarshalText"),
        -		"(*encoding/xml.Encoder).Encode":  checkNoopMarshalImpl(Arg("(*encoding/xml.Encoder).Encode.v"), "MarshalXML", "MarshalText"),
        -
        -		"encoding/json.Unmarshal":         checkNoopMarshalImpl(Arg("json.Unmarshal.v"), "UnmarshalJSON", "UnmarshalText"),
        -		"encoding/xml.Unmarshal":          checkNoopMarshalImpl(Arg("xml.Unmarshal.v"), "UnmarshalXML", "UnmarshalText"),
        -		"(*encoding/json.Decoder).Decode": checkNoopMarshalImpl(Arg("(*encoding/json.Decoder).Decode.v"), "UnmarshalJSON", "UnmarshalText"),
        -		"(*encoding/xml.Decoder).Decode":  checkNoopMarshalImpl(Arg("(*encoding/xml.Decoder).Decode.v"), "UnmarshalXML", "UnmarshalText"),
        -	}
        -
        -	checkUnsupportedMarshal = map[string]CallCheck{
        -		"encoding/json.Marshal":           checkUnsupportedMarshalImpl(Arg("json.Marshal.v"), "json", "MarshalJSON", "MarshalText"),
        -		"encoding/xml.Marshal":            checkUnsupportedMarshalImpl(Arg("xml.Marshal.v"), "xml", "MarshalXML", "MarshalText"),
        -		"(*encoding/json.Encoder).Encode": checkUnsupportedMarshalImpl(Arg("(*encoding/json.Encoder).Encode.v"), "json", "MarshalJSON", "MarshalText"),
        -		"(*encoding/xml.Encoder).Encode":  checkUnsupportedMarshalImpl(Arg("(*encoding/xml.Encoder).Encode.v"), "xml", "MarshalXML", "MarshalText"),
        -	}
        -
        -	checkAtomicAlignment = map[string]CallCheck{
        -		"sync/atomic.AddInt64":             checkAtomicAlignmentImpl,
        -		"sync/atomic.AddUint64":            checkAtomicAlignmentImpl,
        -		"sync/atomic.CompareAndSwapInt64":  checkAtomicAlignmentImpl,
        -		"sync/atomic.CompareAndSwapUint64": checkAtomicAlignmentImpl,
        -		"sync/atomic.LoadInt64":            checkAtomicAlignmentImpl,
        -		"sync/atomic.LoadUint64":           checkAtomicAlignmentImpl,
        -		"sync/atomic.StoreInt64":           checkAtomicAlignmentImpl,
        -		"sync/atomic.StoreUint64":          checkAtomicAlignmentImpl,
        -		"sync/atomic.SwapInt64":            checkAtomicAlignmentImpl,
        -		"sync/atomic.SwapUint64":           checkAtomicAlignmentImpl,
        -	}
        -
        -	// TODO(dh): detect printf wrappers
        -	checkPrintfRules = map[string]CallCheck{
        -		"fmt.Errorf":  func(call *Call) { checkPrintfCall(call, 0, 1) },
        -		"fmt.Printf":  func(call *Call) { checkPrintfCall(call, 0, 1) },
        -		"fmt.Sprintf": func(call *Call) { checkPrintfCall(call, 0, 1) },
        -		"fmt.Fprintf": func(call *Call) { checkPrintfCall(call, 1, 2) },
        -	}
        -)
        -
        -func checkPrintfCall(call *Call, fIdx, vIdx int) {
        -	f := call.Args[fIdx]
        -	var args []ssa.Value
        -	switch v := call.Args[vIdx].Value.Value.(type) {
        -	case *ssa.Slice:
        -		var ok bool
        -		args, ok = ssautil.Vararg(v)
        -		if !ok {
        -			// We don't know what the actual arguments to the function are
        -			return
        -		}
        -	case *ssa.Const:
        -		// nil, i.e. no arguments
        -	default:
        -		// We don't know what the actual arguments to the function are
        -		return
        -	}
        -	checkPrintfCallImpl(call, f.Value.Value, args)
        -}
        -
        -type verbFlag int
        -
        -const (
        -	isInt verbFlag = 1 << iota
        -	isBool
        -	isFP
        -	isString
        -	isPointer
        -	isPseudoPointer
        -	isSlice
        -	isAny
        -	noRecurse
        -)
        -
        -var verbs = [...]verbFlag{
        -	'b': isPseudoPointer | isInt | isFP,
        -	'c': isInt,
        -	'd': isPseudoPointer | isInt,
        -	'e': isFP,
        -	'E': isFP,
        -	'f': isFP,
        -	'F': isFP,
        -	'g': isFP,
        -	'G': isFP,
        -	'o': isPseudoPointer | isInt,
        -	'p': isSlice | isPointer | noRecurse,
        -	'q': isInt | isString,
        -	's': isString,
        -	't': isBool,
        -	'T': isAny,
        -	'U': isInt,
        -	'v': isAny,
        -	'X': isPseudoPointer | isInt | isString,
        -	'x': isPseudoPointer | isInt | isString,
        -}
        -
        -func checkPrintfCallImpl(call *Call, f ssa.Value, args []ssa.Value) {
        -	var msCache *typeutil.MethodSetCache
        -	if f.Parent() != nil {
        -		msCache = &f.Parent().Prog.MethodSets
        -	}
        -
        -	elem := func(T types.Type, verb rune) ([]types.Type, bool) {
        -		if verbs[verb]&noRecurse != 0 {
        -			return []types.Type{T}, false
        -		}
        -		switch T := T.(type) {
        -		case *types.Slice:
        -			if verbs[verb]&isSlice != 0 {
        -				return []types.Type{T}, false
        -			}
        -			if verbs[verb]&isString != 0 && IsType(T.Elem().Underlying(), "byte") {
        -				return []types.Type{T}, false
        -			}
        -			return []types.Type{T.Elem()}, true
        -		case *types.Map:
        -			key := T.Key()
        -			val := T.Elem()
        -			return []types.Type{key, val}, true
        -		case *types.Struct:
        -			out := make([]types.Type, 0, T.NumFields())
        -			for i := 0; i < T.NumFields(); i++ {
        -				out = append(out, T.Field(i).Type())
        -			}
        -			return out, true
        -		case *types.Array:
        -			return []types.Type{T.Elem()}, true
        -		default:
        -			return []types.Type{T}, false
        -		}
        -	}
        -	isInfo := func(T types.Type, info types.BasicInfo) bool {
        -		basic, ok := T.Underlying().(*types.Basic)
        -		return ok && basic.Info()&info != 0
        -	}
        -
        -	isStringer := func(T types.Type, ms *types.MethodSet) bool {
        -		sel := ms.Lookup(nil, "String")
        -		if sel == nil {
        -			return false
        -		}
        -		fn, ok := sel.Obj().(*types.Func)
        -		if !ok {
        -			// should be unreachable
        -			return false
        -		}
        -		sig := fn.Type().(*types.Signature)
        -		if sig.Params().Len() != 0 {
        -			return false
        -		}
        -		if sig.Results().Len() != 1 {
        -			return false
        -		}
        -		if !IsType(sig.Results().At(0).Type(), "string") {
        -			return false
        -		}
        -		return true
        -	}
        -	isError := func(T types.Type, ms *types.MethodSet) bool {
        -		sel := ms.Lookup(nil, "Error")
        -		if sel == nil {
        -			return false
        -		}
        -		fn, ok := sel.Obj().(*types.Func)
        -		if !ok {
        -			// should be unreachable
        -			return false
        -		}
        -		sig := fn.Type().(*types.Signature)
        -		if sig.Params().Len() != 0 {
        -			return false
        -		}
        -		if sig.Results().Len() != 1 {
        -			return false
        -		}
        -		if !IsType(sig.Results().At(0).Type(), "string") {
        -			return false
        -		}
        -		return true
        -	}
        -
        -	isFormatter := func(T types.Type, ms *types.MethodSet) bool {
        -		sel := ms.Lookup(nil, "Format")
        -		if sel == nil {
        -			return false
        -		}
        -		fn, ok := sel.Obj().(*types.Func)
        -		if !ok {
        -			// should be unreachable
        -			return false
        -		}
        -		sig := fn.Type().(*types.Signature)
        -		if sig.Params().Len() != 2 {
        -			return false
        -		}
        -		// TODO(dh): check the types of the arguments for more
        -		// precision
        -		if sig.Results().Len() != 0 {
        -			return false
        -		}
        -		return true
        -	}
        -
        -	seen := map[types.Type]bool{}
        -	var checkType func(verb rune, T types.Type, top bool) bool
        -	checkType = func(verb rune, T types.Type, top bool) bool {
        -		if top {
        -			for k := range seen {
        -				delete(seen, k)
        -			}
        -		}
        -		if seen[T] {
        -			return true
        -		}
        -		seen[T] = true
        -		if int(verb) >= len(verbs) {
        -			// Unknown verb
        -			return true
        -		}
        -
        -		flags := verbs[verb]
        -		if flags == 0 {
        -			// Unknown verb
        -			return true
        -		}
        -
        -		ms := msCache.MethodSet(T)
        -		if isFormatter(T, ms) {
        -			// the value is responsible for formatting itself
        -			return true
        -		}
        -
        -		if flags&isString != 0 && (isStringer(T, ms) || isError(T, ms)) {
        -			// Check for stringer early because we're about to dereference
        -			return true
        -		}
        -
        -		T = T.Underlying()
        -		if flags&(isPointer|isPseudoPointer) == 0 && top {
        -			T = Dereference(T)
        -		}
        -		if flags&isPseudoPointer != 0 && top {
        -			t := Dereference(T)
        -			if _, ok := t.Underlying().(*types.Struct); ok {
        -				T = t
        -			}
        -		}
        -
        -		if _, ok := T.(*types.Interface); ok {
        -			// We don't know what's in the interface
        -			return true
        -		}
        -
        -		var info types.BasicInfo
        -		if flags&isInt != 0 {
        -			info |= types.IsInteger
        -		}
        -		if flags&isBool != 0 {
        -			info |= types.IsBoolean
        -		}
        -		if flags&isFP != 0 {
        -			info |= types.IsFloat | types.IsComplex
        -		}
        -		if flags&isString != 0 {
        -			info |= types.IsString
        -		}
        -
        -		if info != 0 && isInfo(T, info) {
        -			return true
        -		}
        -
        -		if flags&isString != 0 && (IsType(T, "[]byte") || isStringer(T, ms) || isError(T, ms)) {
        -			return true
        -		}
        -
        -		if flags&isPointer != 0 && IsPointerLike(T) {
        -			return true
        -		}
        -		if flags&isPseudoPointer != 0 {
        -			switch U := T.Underlying().(type) {
        -			case *types.Pointer:
        -				if !top {
        -					return true
        -				}
        -
        -				if _, ok := U.Elem().Underlying().(*types.Struct); !ok {
        -					return true
        -				}
        -			case *types.Chan, *types.Signature:
        -				return true
        -			}
        -		}
        -
        -		if flags&isSlice != 0 {
        -			if _, ok := T.(*types.Slice); ok {
        -				return true
        -			}
        -		}
        -
        -		if flags&isAny != 0 {
        -			return true
        -		}
        -
        -		elems, ok := elem(T.Underlying(), verb)
        -		if !ok {
        -			return false
        -		}
        -		for _, elem := range elems {
        -			if !checkType(verb, elem, false) {
        -				return false
        -			}
        -		}
        -
        -		return true
        -	}
        -
        -	k, ok := f.(*ssa.Const)
        -	if !ok {
        -		return
        -	}
        -	actions, err := printf.Parse(constant.StringVal(k.Value))
        -	if err != nil {
        -		call.Invalid("couldn't parse format string")
        -		return
        -	}
        -
        -	ptr := 1
        -	hasExplicit := false
        -
        -	checkStar := func(verb printf.Verb, star printf.Argument) bool {
        -		if star, ok := star.(printf.Star); ok {
        -			idx := 0
        -			if star.Index == -1 {
        -				idx = ptr
        -				ptr++
        -			} else {
        -				hasExplicit = true
        -				idx = star.Index
        -				ptr = star.Index + 1
        -			}
        -			if idx == 0 {
        -				call.Invalid(fmt.Sprintf("Printf format %s reads invalid arg 0; indices are 1-based", verb.Raw))
        -				return false
        -			}
        -			if idx > len(args) {
        -				call.Invalid(
        -					fmt.Sprintf("Printf format %s reads arg #%d, but call has only %d args",
        -						verb.Raw, idx, len(args)))
        -				return false
        -			}
        -			if arg, ok := args[idx-1].(*ssa.MakeInterface); ok {
        -				if !isInfo(arg.X.Type(), types.IsInteger) {
        -					call.Invalid(fmt.Sprintf("Printf format %s reads non-int arg #%d as argument of *", verb.Raw, idx))
        -				}
        -			}
        -		}
        -		return true
        -	}
        -
        -	// We only report one problem per format string. Making a
        -	// mistake with an index tends to invalidate all future
        -	// implicit indices.
        -	for _, action := range actions {
        -		verb, ok := action.(printf.Verb)
        -		if !ok {
        -			continue
        -		}
        -
        -		if !checkStar(verb, verb.Width) || !checkStar(verb, verb.Precision) {
        -			return
        -		}
        -
        -		off := ptr
        -		if verb.Value != -1 {
        -			hasExplicit = true
        -			off = verb.Value
        -		}
        -		if off > len(args) {
        -			call.Invalid(
        -				fmt.Sprintf("Printf format %s reads arg #%d, but call has only %d args",
        -					verb.Raw, off, len(args)))
        -			return
        -		} else if verb.Value == 0 && verb.Letter != '%' {
        -			call.Invalid(fmt.Sprintf("Printf format %s reads invalid arg 0; indices are 1-based", verb.Raw))
        -			return
        -		} else if off != 0 {
        -			arg, ok := args[off-1].(*ssa.MakeInterface)
        -			if ok {
        -				if !checkType(verb.Letter, arg.X.Type(), true) {
        -					call.Invalid(fmt.Sprintf("Printf format %s has arg #%d of wrong type %s",
        -						verb.Raw, ptr, args[ptr-1].(*ssa.MakeInterface).X.Type()))
        -					return
        -				}
        -			}
        -		}
        -
        -		switch verb.Value {
        -		case -1:
        -			// Consume next argument
        -			ptr++
        -		case 0:
        -			// Don't consume any arguments
        -		default:
        -			ptr = verb.Value + 1
        -		}
        -	}
        -
        -	if !hasExplicit && ptr <= len(args) {
        -		call.Invalid(fmt.Sprintf("Printf call needs %d args but has %d args", ptr-1, len(args)))
        -	}
        -}
        -
        -func checkAtomicAlignmentImpl(call *Call) {
        -	sizes := call.Pass.TypesSizes
        -	if sizes.Sizeof(types.Typ[types.Uintptr]) != 4 {
        -		// Not running on a 32-bit platform
        -		return
        -	}
        -	v, ok := call.Args[0].Value.Value.(*ssa.FieldAddr)
        -	if !ok {
        -		// TODO(dh): also check indexing into arrays and slices
        -		return
        -	}
        -	T := v.X.Type().Underlying().(*types.Pointer).Elem().Underlying().(*types.Struct)
        -	fields := make([]*types.Var, 0, T.NumFields())
        -	for i := 0; i < T.NumFields() && i <= v.Field; i++ {
        -		fields = append(fields, T.Field(i))
        -	}
        -
        -	off := sizes.Offsetsof(fields)[v.Field]
        -	if off%8 != 0 {
        -		msg := fmt.Sprintf("address of non 64-bit aligned field %s passed to %s",
        -			T.Field(v.Field).Name(),
        -			CallName(call.Instr.Common()))
        -		call.Invalid(msg)
        -	}
        -}
        -
        -func checkNoopMarshalImpl(argN int, meths ...string) CallCheck {
        -	return func(call *Call) {
        -		if IsGenerated(call.Pass, call.Instr.Pos()) {
        -			return
        -		}
        -		arg := call.Args[argN]
        -		T := arg.Value.Value.Type()
        -		Ts, ok := Dereference(T).Underlying().(*types.Struct)
        -		if !ok {
        -			return
        -		}
        -		if Ts.NumFields() == 0 {
        -			return
        -		}
        -		fields := FlattenFields(Ts)
        -		for _, field := range fields {
        -			if field.Var.Exported() {
        -				return
        -			}
        -		}
        -		// OPT(dh): we could use a method set cache here
        -		ms := call.Instr.Parent().Prog.MethodSets.MethodSet(T)
        -		// TODO(dh): we're not checking the signature, which can cause false negatives.
        -		// This isn't a huge problem, however, since vet complains about incorrect signatures.
        -		for _, meth := range meths {
        -			if ms.Lookup(nil, meth) != nil {
        -				return
        -			}
        -		}
        -		arg.Invalid("struct doesn't have any exported fields, nor custom marshaling")
        -	}
        -}
        -
        -func checkUnsupportedMarshalImpl(argN int, tag string, meths ...string) CallCheck {
        -	// TODO(dh): flag slices and maps of unsupported types
        -	return func(call *Call) {
        -		msCache := &call.Instr.Parent().Prog.MethodSets
        -
        -		arg := call.Args[argN]
        -		T := arg.Value.Value.Type()
        -		Ts, ok := Dereference(T).Underlying().(*types.Struct)
        -		if !ok {
        -			return
        -		}
        -		ms := msCache.MethodSet(T)
        -		// TODO(dh): we're not checking the signature, which can cause false negatives.
        -		// This isn't a huge problem, however, since vet complains about incorrect signatures.
        -		for _, meth := range meths {
        -			if ms.Lookup(nil, meth) != nil {
        -				return
        -			}
        -		}
        -		fields := FlattenFields(Ts)
        -		for _, field := range fields {
        -			if !(field.Var.Exported()) {
        -				continue
        -			}
        -			if reflect.StructTag(field.Tag).Get(tag) == "-" {
        -				continue
        -			}
        -			ms := msCache.MethodSet(field.Var.Type())
        -			// TODO(dh): we're not checking the signature, which can cause false negatives.
        -			// This isn't a huge problem, however, since vet complains about incorrect signatures.
        -			for _, meth := range meths {
        -				if ms.Lookup(nil, meth) != nil {
        -					return
        -				}
        -			}
        -			switch field.Var.Type().Underlying().(type) {
        -			case *types.Chan, *types.Signature:
        -				arg.Invalid(fmt.Sprintf("trying to marshal chan or func value, field %s", fieldPath(T, field.Path)))
        -			}
        -		}
        -	}
        -}
        -
        -func fieldPath(start types.Type, indices []int) string {
        -	p := start.String()
        -	for _, idx := range indices {
        -		field := Dereference(start).Underlying().(*types.Struct).Field(idx)
        -		start = field.Type()
        -		p += "." + field.Name()
        -	}
        -	return p
        -}
        -
        -func isInLoop(b *ssa.BasicBlock) bool {
        -	sets := functions.FindLoops(b.Parent())
        -	for _, set := range sets {
        -		if set.Has(b) {
        -			return true
        -		}
        -	}
        -	return false
        -}
        -
        -func CheckUntrappableSignal(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		call := node.(*ast.CallExpr)
        -		if !IsCallToAnyAST(pass, call,
        -			"os/signal.Ignore", "os/signal.Notify", "os/signal.Reset") {
        -			return
        -		}
        -		for _, arg := range call.Args {
        -			if conv, ok := arg.(*ast.CallExpr); ok && isName(pass, conv.Fun, "os.Signal") {
        -				arg = conv.Args[0]
        -			}
        -
        -			if isName(pass, arg, "os.Kill") || isName(pass, arg, "syscall.SIGKILL") {
        -				ReportNodef(pass, arg, "%s cannot be trapped (did you mean syscall.SIGTERM?)", Render(pass, arg))
        -			}
        -			if isName(pass, arg, "syscall.SIGSTOP") {
        -				ReportNodef(pass, arg, "%s signal cannot be trapped", Render(pass, arg))
        -			}
        -		}
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func CheckTemplate(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		call := node.(*ast.CallExpr)
        -		var kind string
        -		if IsCallToAST(pass, call, "(*text/template.Template).Parse") {
        -			kind = "text"
        -		} else if IsCallToAST(pass, call, "(*html/template.Template).Parse") {
        -			kind = "html"
        -		} else {
        -			return
        -		}
        -		sel := call.Fun.(*ast.SelectorExpr)
        -		if !IsCallToAST(pass, sel.X, "text/template.New") &&
        -			!IsCallToAST(pass, sel.X, "html/template.New") {
        -			// TODO(dh): this is a cheap workaround for templates with
        -			// different delims. A better solution with less false
        -			// negatives would use data flow analysis to see where the
        -			// template comes from and where it has been
        -			return
        -		}
        -		s, ok := ExprToString(pass, call.Args[Arg("(*text/template.Template).Parse.text")])
        -		if !ok {
        -			return
        -		}
        -		var err error
        -		switch kind {
        -		case "text":
        -			_, err = texttemplate.New("").Parse(s)
        -		case "html":
        -			_, err = htmltemplate.New("").Parse(s)
        -		}
        -		if err != nil {
        -			// TODO(dominikh): whitelist other parse errors, if any
        -			if strings.Contains(err.Error(), "unexpected") {
        -				ReportNodef(pass, call.Args[Arg("(*text/template.Template).Parse.text")], "%s", err)
        -			}
        -		}
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func CheckTimeSleepConstant(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		call := node.(*ast.CallExpr)
        -		if !IsCallToAST(pass, call, "time.Sleep") {
        -			return
        -		}
        -		lit, ok := call.Args[Arg("time.Sleep.d")].(*ast.BasicLit)
        -		if !ok {
        -			return
        -		}
        -		n, err := strconv.Atoi(lit.Value)
        -		if err != nil {
        -			return
        -		}
        -		if n == 0 || n > 120 {
        -			// time.Sleep(0) is a seldom used pattern in concurrency
        -			// tests. >120 might be intentional. 120 was chosen
        -			// because the user could've meant 2 minutes.
        -			return
        -		}
        -		recommendation := "time.Sleep(time.Nanosecond)"
        -		if n != 1 {
        -			recommendation = fmt.Sprintf("time.Sleep(%d * time.Nanosecond)", n)
        -		}
        -		ReportNodef(pass, call.Args[Arg("time.Sleep.d")],
        -			"sleeping for %d nanoseconds is probably a bug. Be explicit if it isn't: %s", n, recommendation)
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func CheckWaitgroupAdd(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		g := node.(*ast.GoStmt)
        -		fun, ok := g.Call.Fun.(*ast.FuncLit)
        -		if !ok {
        -			return
        -		}
        -		if len(fun.Body.List) == 0 {
        -			return
        -		}
        -		stmt, ok := fun.Body.List[0].(*ast.ExprStmt)
        -		if !ok {
        -			return
        -		}
        -		if IsCallToAST(pass, stmt.X, "(*sync.WaitGroup).Add") {
        -			ReportNodef(pass, stmt, "should call %s before starting the goroutine to avoid a race",
        -				Render(pass, stmt))
        -		}
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.GoStmt)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func CheckInfiniteEmptyLoop(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		loop := node.(*ast.ForStmt)
        -		if len(loop.Body.List) != 0 || loop.Post != nil {
        -			return
        -		}
        -
        -		if loop.Init != nil {
        -			// TODO(dh): this isn't strictly necessary, it just makes
        -			// the check easier.
        -			return
        -		}
        -		// An empty loop is bad news in two cases: 1) The loop has no
        -		// condition. In that case, it's just a loop that spins
        -		// forever and as fast as it can, keeping a core busy. 2) The
        -		// loop condition only consists of variable or field reads and
        -		// operators on those. The only way those could change their
        -		// value is with unsynchronised access, which constitutes a
        -		// data race.
        -		//
        -		// If the condition contains any function calls, its behaviour
        -		// is dynamic and the loop might terminate. Similarly for
        -		// channel receives.
        -
        -		if loop.Cond != nil {
        -			if hasSideEffects(loop.Cond) {
        -				return
        -			}
        -			if ident, ok := loop.Cond.(*ast.Ident); ok {
        -				if k, ok := pass.TypesInfo.ObjectOf(ident).(*types.Const); ok {
        -					if !constant.BoolVal(k.Val()) {
        -						// don't flag `for false {}` loops. They're a debug aid.
        -						return
        -					}
        -				}
        -			}
        -			ReportNodef(pass, loop, "loop condition never changes or has a race condition")
        -		}
        -		ReportNodef(pass, loop, "this loop will spin, using 100%% CPU")
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.ForStmt)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func CheckDeferInInfiniteLoop(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		mightExit := false
        -		var defers []ast.Stmt
        -		loop := node.(*ast.ForStmt)
        -		if loop.Cond != nil {
        -			return
        -		}
        -		fn2 := func(node ast.Node) bool {
        -			switch stmt := node.(type) {
        -			case *ast.ReturnStmt:
        -				mightExit = true
        -				return false
        -			case *ast.BranchStmt:
        -				// TODO(dominikh): if this sees a break in a switch or
        -				// select, it doesn't check if it breaks the loop or
        -				// just the select/switch. This causes some false
        -				// negatives.
        -				if stmt.Tok == token.BREAK {
        -					mightExit = true
        -					return false
        -				}
        -			case *ast.DeferStmt:
        -				defers = append(defers, stmt)
        -			case *ast.FuncLit:
        -				// Don't look into function bodies
        -				return false
        -			}
        -			return true
        -		}
        -		ast.Inspect(loop.Body, fn2)
        -		if mightExit {
        -			return
        -		}
        -		for _, stmt := range defers {
        -			ReportNodef(pass, stmt, "defers in this infinite loop will never run")
        -		}
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.ForStmt)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func CheckDubiousDeferInChannelRangeLoop(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		loop := node.(*ast.RangeStmt)
        -		typ := pass.TypesInfo.TypeOf(loop.X)
        -		_, ok := typ.Underlying().(*types.Chan)
        -		if !ok {
        -			return
        -		}
        -		fn2 := func(node ast.Node) bool {
        -			switch stmt := node.(type) {
        -			case *ast.DeferStmt:
        -				ReportNodef(pass, stmt, "defers in this range loop won't run unless the channel gets closed")
        -			case *ast.FuncLit:
        -				// Don't look into function bodies
        -				return false
        -			}
        -			return true
        -		}
        -		ast.Inspect(loop.Body, fn2)
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.RangeStmt)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func CheckTestMainExit(pass *analysis.Pass) (interface{}, error) {
        -	var (
        -		fnmain    ast.Node
        -		callsExit bool
        -		callsRun  bool
        -		arg       types.Object
        -	)
        -	fn := func(node ast.Node, push bool) bool {
        -		if !push {
        -			if fnmain != nil && node == fnmain {
        -				if !callsExit && callsRun {
        -					ReportNodef(pass, fnmain, "TestMain should call os.Exit to set exit code")
        -				}
        -				fnmain = nil
        -				callsExit = false
        -				callsRun = false
        -				arg = nil
        -			}
        -			return true
        -		}
        -
        -		switch node := node.(type) {
        -		case *ast.FuncDecl:
        -			if fnmain != nil {
        -				return true
        -			}
        -			if !isTestMain(pass, node) {
        -				return false
        -			}
        -			fnmain = node
        -			arg = pass.TypesInfo.ObjectOf(node.Type.Params.List[0].Names[0])
        -			return true
        -		case *ast.CallExpr:
        -			if IsCallToAST(pass, node, "os.Exit") {
        -				callsExit = true
        -				return false
        -			}
        -			sel, ok := node.Fun.(*ast.SelectorExpr)
        -			if !ok {
        -				return true
        -			}
        -			ident, ok := sel.X.(*ast.Ident)
        -			if !ok {
        -				return true
        -			}
        -			if arg != pass.TypesInfo.ObjectOf(ident) {
        -				return true
        -			}
        -			if sel.Sel.Name == "Run" {
        -				callsRun = true
        -				return false
        -			}
        -			return true
        -		default:
        -			// unreachable
        -			return true
        -		}
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Nodes([]ast.Node{(*ast.FuncDecl)(nil), (*ast.CallExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func isTestMain(pass *analysis.Pass, decl *ast.FuncDecl) bool {
        -	if decl.Name.Name != "TestMain" {
        -		return false
        -	}
        -	if len(decl.Type.Params.List) != 1 {
        -		return false
        -	}
        -	arg := decl.Type.Params.List[0]
        -	if len(arg.Names) != 1 {
        -		return false
        -	}
        -	return IsOfType(pass, arg.Type, "*testing.M")
        -}
        -
        -func CheckExec(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		call := node.(*ast.CallExpr)
        -		if !IsCallToAST(pass, call, "os/exec.Command") {
        -			return
        -		}
        -		val, ok := ExprToString(pass, call.Args[Arg("os/exec.Command.name")])
        -		if !ok {
        -			return
        -		}
        -		if !strings.Contains(val, " ") || strings.Contains(val, `\`) || strings.Contains(val, "/") {
        -			return
        -		}
        -		ReportNodef(pass, call.Args[Arg("os/exec.Command.name")],
        -			"first argument to exec.Command looks like a shell command, but a program name or path are expected")
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func CheckLoopEmptyDefault(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		loop := node.(*ast.ForStmt)
        -		if len(loop.Body.List) != 1 || loop.Cond != nil || loop.Init != nil {
        -			return
        -		}
        -		sel, ok := loop.Body.List[0].(*ast.SelectStmt)
        -		if !ok {
        -			return
        -		}
        -		for _, c := range sel.Body.List {
        -			if comm, ok := c.(*ast.CommClause); ok && comm.Comm == nil && len(comm.Body) == 0 {
        -				ReportNodef(pass, comm, "should not have an empty default case in a for+select loop. The loop will spin.")
        -			}
        -		}
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.ForStmt)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func CheckLhsRhsIdentical(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		op := node.(*ast.BinaryExpr)
        -		switch op.Op {
        -		case token.EQL, token.NEQ:
        -			if basic, ok := pass.TypesInfo.TypeOf(op.X).Underlying().(*types.Basic); ok {
        -				if kind := basic.Kind(); kind == types.Float32 || kind == types.Float64 {
        -					// f == f and f != f might be used to check for NaN
        -					return
        -				}
        -			}
        -		case token.SUB, token.QUO, token.AND, token.REM, token.OR, token.XOR, token.AND_NOT,
        -			token.LAND, token.LOR, token.LSS, token.GTR, token.LEQ, token.GEQ:
        -		default:
        -			// For some ops, such as + and *, it can make sense to
        -			// have identical operands
        -			return
        -		}
        -
        -		if Render(pass, op.X) != Render(pass, op.Y) {
        -			return
        -		}
        -		l1, ok1 := op.X.(*ast.BasicLit)
        -		l2, ok2 := op.Y.(*ast.BasicLit)
        -		if ok1 && ok2 && l1.Kind == token.INT && l2.Kind == l1.Kind && l1.Value == "0" && l2.Value == l1.Value && IsGenerated(pass, l1.Pos()) {
        -			// cgo generates the following function call:
        -			// _cgoCheckPointer(_cgoBase0, 0 == 0) – it uses 0 == 0
        -			// instead of true in case the user shadowed the
        -			// identifier. Ideally we'd restrict this exception to
        -			// calls of _cgoCheckPointer, but it's not worth the
        -			// hassle of keeping track of the stack.   
        -			// are very rare to begin with, and we're mostly checking
        -			// for them to catch typos such as 1 == 1 where the user
        -			// meant to type i == 1. The odds of a false negative for
        -			// 0 == 0 are slim.
        -			return
        -		}
        -		ReportNodef(pass, op, "identical expressions on the left and right side of the '%s' operator", op.Op)
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BinaryExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func CheckScopedBreak(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		var body *ast.BlockStmt
        -		switch node := node.(type) {
        -		case *ast.ForStmt:
        -			body = node.Body
        -		case *ast.RangeStmt:
        -			body = node.Body
        -		default:
        -			panic(fmt.Sprintf("unreachable: %T", node))
        -		}
        -		for _, stmt := range body.List {
        -			var blocks [][]ast.Stmt
        -			switch stmt := stmt.(type) {
        -			case *ast.SwitchStmt:
        -				for _, c := range stmt.Body.List {
        -					blocks = append(blocks, c.(*ast.CaseClause).Body)
        -				}
        -			case *ast.SelectStmt:
        -				for _, c := range stmt.Body.List {
        -					blocks = append(blocks, c.(*ast.CommClause).Body)
        -				}
        -			default:
        -				continue
        -			}
        -
        -			for _, body := range blocks {
        -				if len(body) == 0 {
        -					continue
        -				}
        -				lasts := []ast.Stmt{body[len(body)-1]}
        -				// TODO(dh): unfold all levels of nested block
        -				// statements, not just a single level if statement
        -				if ifs, ok := lasts[0].(*ast.IfStmt); ok {
        -					if len(ifs.Body.List) == 0 {
        -						continue
        -					}
        -					lasts[0] = ifs.Body.List[len(ifs.Body.List)-1]
        -
        -					if block, ok := ifs.Else.(*ast.BlockStmt); ok {
        -						if len(block.List) != 0 {
        -							lasts = append(lasts, block.List[len(block.List)-1])
        -						}
        -					}
        -				}
        -				for _, last := range lasts {
        -					branch, ok := last.(*ast.BranchStmt)
        -					if !ok || branch.Tok != token.BREAK || branch.Label != nil {
        -						continue
        -					}
        -					ReportNodef(pass, branch, "ineffective break statement. Did you mean to break out of the outer loop?")
        -				}
        -			}
        -		}
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.ForStmt)(nil), (*ast.RangeStmt)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func CheckUnsafePrintf(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		call := node.(*ast.CallExpr)
        -		var arg int
        -		if IsCallToAnyAST(pass, call, "fmt.Printf", "fmt.Sprintf", "log.Printf") {
        -			arg = Arg("fmt.Printf.format")
        -		} else if IsCallToAnyAST(pass, call, "fmt.Fprintf") {
        -			arg = Arg("fmt.Fprintf.format")
        -		} else {
        -			return
        -		}
        -		if len(call.Args) != arg+1 {
        -			return
        -		}
        -		switch call.Args[arg].(type) {
        -		case *ast.CallExpr, *ast.Ident:
        -		default:
        -			return
        -		}
        -		ReportNodef(pass, call.Args[arg],
        -			"printf-style function with dynamic format string and no further arguments should use print-style function instead")
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func CheckEarlyDefer(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		block := node.(*ast.BlockStmt)
        -		if len(block.List) < 2 {
        -			return
        -		}
        -		for i, stmt := range block.List {
        -			if i == len(block.List)-1 {
        -				break
        -			}
        -			assign, ok := stmt.(*ast.AssignStmt)
        -			if !ok {
        -				continue
        -			}
        -			if len(assign.Rhs) != 1 {
        -				continue
        -			}
        -			if len(assign.Lhs) < 2 {
        -				continue
        -			}
        -			if lhs, ok := assign.Lhs[len(assign.Lhs)-1].(*ast.Ident); ok && lhs.Name == "_" {
        -				continue
        -			}
        -			call, ok := assign.Rhs[0].(*ast.CallExpr)
        -			if !ok {
        -				continue
        -			}
        -			sig, ok := pass.TypesInfo.TypeOf(call.Fun).(*types.Signature)
        -			if !ok {
        -				continue
        -			}
        -			if sig.Results().Len() < 2 {
        -				continue
        -			}
        -			last := sig.Results().At(sig.Results().Len() - 1)
        -			// FIXME(dh): check that it's error from universe, not
        -			// another type of the same name
        -			if last.Type().String() != "error" {
        -				continue
        -			}
        -			lhs, ok := assign.Lhs[0].(*ast.Ident)
        -			if !ok {
        -				continue
        -			}
        -			def, ok := block.List[i+1].(*ast.DeferStmt)
        -			if !ok {
        -				continue
        -			}
        -			sel, ok := def.Call.Fun.(*ast.SelectorExpr)
        -			if !ok {
        -				continue
        -			}
        -			ident, ok := selectorX(sel).(*ast.Ident)
        -			if !ok {
        -				continue
        -			}
        -			if ident.Obj != lhs.Obj {
        -				continue
        -			}
        -			if sel.Sel.Name != "Close" {
        -				continue
        -			}
        -			ReportNodef(pass, def, "should check returned error before deferring %s", Render(pass, def.Call))
        -		}
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BlockStmt)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func selectorX(sel *ast.SelectorExpr) ast.Node {
        -	switch x := sel.X.(type) {
        -	case *ast.SelectorExpr:
        -		return selectorX(x)
        -	default:
        -		return x
        -	}
        -}
        -
        -func CheckEmptyCriticalSection(pass *analysis.Pass) (interface{}, error) {
        -	// Initially it might seem like this check would be easier to
        -	// implement in SSA. After all, we're only checking for two
        -	// consecutive method calls. In reality, however, there may be any
        -	// number of other instructions between the lock and unlock, while
        -	// still constituting an empty critical section. For example,
        -	// given `m.x().Lock(); m.x().Unlock()`, there will be a call to
        -	// x(). In the AST-based approach, this has a tiny potential for a
        -	// false positive (the second call to x might be doing work that
        -	// is protected by the mutex). In an SSA-based approach, however,
        -	// it would miss a lot of real bugs.
        -
        -	mutexParams := func(s ast.Stmt) (x ast.Expr, funcName string, ok bool) {
        -		expr, ok := s.(*ast.ExprStmt)
        -		if !ok {
        -			return nil, "", false
        -		}
        -		call, ok := expr.X.(*ast.CallExpr)
        -		if !ok {
        -			return nil, "", false
        -		}
        -		sel, ok := call.Fun.(*ast.SelectorExpr)
        -		if !ok {
        -			return nil, "", false
        -		}
        -
        -		fn, ok := pass.TypesInfo.ObjectOf(sel.Sel).(*types.Func)
        -		if !ok {
        -			return nil, "", false
        -		}
        -		sig := fn.Type().(*types.Signature)
        -		if sig.Params().Len() != 0 || sig.Results().Len() != 0 {
        -			return nil, "", false
        -		}
        -
        -		return sel.X, fn.Name(), true
        -	}
        -
        -	fn := func(node ast.Node) {
        -		block := node.(*ast.BlockStmt)
        -		if len(block.List) < 2 {
        -			return
        -		}
        -		for i := range block.List[:len(block.List)-1] {
        -			sel1, method1, ok1 := mutexParams(block.List[i])
        -			sel2, method2, ok2 := mutexParams(block.List[i+1])
        -
        -			if !ok1 || !ok2 || Render(pass, sel1) != Render(pass, sel2) {
        -				continue
        -			}
        -			if (method1 == "Lock" && method2 == "Unlock") ||
        -				(method1 == "RLock" && method2 == "RUnlock") {
        -				ReportNodef(pass, block.List[i+1], "empty critical section")
        -			}
        -		}
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BlockStmt)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -// cgo produces code like fn(&*_Cvar_kSomeCallbacks) which we don't
        -// want to flag.
        -var cgoIdent = regexp.MustCompile(`^_C(func|var)_.+$`)
        -
        -func CheckIneffectiveCopy(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		if unary, ok := node.(*ast.UnaryExpr); ok {
        -			if star, ok := unary.X.(*ast.StarExpr); ok && unary.Op == token.AND {
        -				ident, ok := star.X.(*ast.Ident)
        -				if !ok || !cgoIdent.MatchString(ident.Name) {
        -					ReportNodef(pass, unary, "&*x will be simplified to x. It will not copy x.")
        -				}
        -			}
        -		}
        -
        -		if star, ok := node.(*ast.StarExpr); ok {
        -			if unary, ok := star.X.(*ast.UnaryExpr); ok && unary.Op == token.AND {
        -				ReportNodef(pass, star, "*&x will be simplified to x. It will not copy x.")
        -			}
        -		}
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.UnaryExpr)(nil), (*ast.StarExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func CheckDiffSizeComparison(pass *analysis.Pass) (interface{}, error) {
        -	ranges := pass.ResultOf[valueRangesAnalyzer].(map[*ssa.Function]vrp.Ranges)
        -	for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		for _, b := range ssafn.Blocks {
        -			for _, ins := range b.Instrs {
        -				binop, ok := ins.(*ssa.BinOp)
        -				if !ok {
        -					continue
        -				}
        -				if binop.Op != token.EQL && binop.Op != token.NEQ {
        -					continue
        -				}
        -				_, ok1 := binop.X.(*ssa.Slice)
        -				_, ok2 := binop.Y.(*ssa.Slice)
        -				if !ok1 && !ok2 {
        -					continue
        -				}
        -				r := ranges[ssafn]
        -				r1, ok1 := r.Get(binop.X).(vrp.StringInterval)
        -				r2, ok2 := r.Get(binop.Y).(vrp.StringInterval)
        -				if !ok1 || !ok2 {
        -					continue
        -				}
        -				if r1.Length.Intersection(r2.Length).Empty() {
        -					pass.Reportf(binop.Pos(), "comparing strings of different sizes for equality will always return false")
        -				}
        -			}
        -		}
        -	}
        -	return nil, nil
        -}
        -
        -func CheckCanonicalHeaderKey(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node, push bool) bool {
        -		if !push {
        -			return false
        -		}
        -		assign, ok := node.(*ast.AssignStmt)
        -		if ok {
        -			// TODO(dh): This risks missing some Header reads, for
        -			// example in `h1["foo"] = h2["foo"]` – these edge
        -			// cases are probably rare enough to ignore for now.
        -			for _, expr := range assign.Lhs {
        -				op, ok := expr.(*ast.IndexExpr)
        -				if !ok {
        -					continue
        -				}
        -				if IsOfType(pass, op.X, "net/http.Header") {
        -					return false
        -				}
        -			}
        -			return true
        -		}
        -		op, ok := node.(*ast.IndexExpr)
        -		if !ok {
        -			return true
        -		}
        -		if !IsOfType(pass, op.X, "net/http.Header") {
        -			return true
        -		}
        -		s, ok := ExprToString(pass, op.Index)
        -		if !ok {
        -			return true
        -		}
        -		if s == http.CanonicalHeaderKey(s) {
        -			return true
        -		}
        -		ReportNodef(pass, op, "keys in http.Header are canonicalized, %q is not canonical; fix the constant or use http.CanonicalHeaderKey", s)
        -		return true
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Nodes([]ast.Node{(*ast.AssignStmt)(nil), (*ast.IndexExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func CheckBenchmarkN(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		assign := node.(*ast.AssignStmt)
        -		if len(assign.Lhs) != 1 || len(assign.Rhs) != 1 {
        -			return
        -		}
        -		sel, ok := assign.Lhs[0].(*ast.SelectorExpr)
        -		if !ok {
        -			return
        -		}
        -		if sel.Sel.Name != "N" {
        -			return
        -		}
        -		if !IsOfType(pass, sel.X, "*testing.B") {
        -			return
        -		}
        -		ReportNodef(pass, assign, "should not assign to %s", Render(pass, sel))
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.AssignStmt)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func CheckUnreadVariableValues(pass *analysis.Pass) (interface{}, error) {
        -	for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		if IsExample(ssafn) {
        -			continue
        -		}
        -		node := ssafn.Syntax()
        -		if node == nil {
        -			continue
        -		}
        -		if gen, ok := Generator(pass, node.Pos()); ok && gen == facts.Goyacc {
        -			// Don't flag unused values in code generated by goyacc.
        -			// There may be hundreds of those due to the way the state
        -			// machine is constructed.
        -			continue
        -		}
        -
        -		switchTags := map[ssa.Value]struct{}{}
        -		ast.Inspect(node, func(node ast.Node) bool {
        -			s, ok := node.(*ast.SwitchStmt)
        -			if !ok {
        -				return true
        -			}
        -			v, _ := ssafn.ValueForExpr(s.Tag)
        -			switchTags[v] = struct{}{}
        -			return true
        -		})
        -
        -		hasUse := func(v ssa.Value) bool {
        -			if _, ok := switchTags[v]; ok {
        -				return true
        -			}
        -			refs := v.Referrers()
        -			if refs == nil {
        -				// TODO investigate why refs can be nil
        -				return true
        -			}
        -			return len(FilterDebug(*refs)) > 0
        -		}
        -
        -		ast.Inspect(node, func(node ast.Node) bool {
        -			assign, ok := node.(*ast.AssignStmt)
        -			if !ok {
        -				return true
        -			}
        -			if len(assign.Lhs) > 1 && len(assign.Rhs) == 1 {
        -				// Either a function call with multiple return values,
        -				// or a comma-ok assignment
        -
        -				val, _ := ssafn.ValueForExpr(assign.Rhs[0])
        -				if val == nil {
        -					return true
        -				}
        -				refs := val.Referrers()
        -				if refs == nil {
        -					return true
        -				}
        -				for _, ref := range *refs {
        -					ex, ok := ref.(*ssa.Extract)
        -					if !ok {
        -						continue
        -					}
        -					if !hasUse(ex) {
        -						lhs := assign.Lhs[ex.Index]
        -						if ident, ok := lhs.(*ast.Ident); !ok || ok && ident.Name == "_" {
        -							continue
        -						}
        -						ReportNodef(pass, lhs, "this value of %s is never used", lhs)
        -					}
        -				}
        -				return true
        -			}
        -			for i, lhs := range assign.Lhs {
        -				rhs := assign.Rhs[i]
        -				if ident, ok := lhs.(*ast.Ident); !ok || ok && ident.Name == "_" {
        -					continue
        -				}
        -				val, _ := ssafn.ValueForExpr(rhs)
        -				if val == nil {
        -					continue
        -				}
        -
        -				if !hasUse(val) {
        -					ReportNodef(pass, lhs, "this value of %s is never used", lhs)
        -				}
        -			}
        -			return true
        -		})
        -	}
        -	return nil, nil
        -}
        -
        -func CheckPredeterminedBooleanExprs(pass *analysis.Pass) (interface{}, error) {
        -	for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		for _, block := range ssafn.Blocks {
        -			for _, ins := range block.Instrs {
        -				ssabinop, ok := ins.(*ssa.BinOp)
        -				if !ok {
        -					continue
        -				}
        -				switch ssabinop.Op {
        -				case token.GTR, token.LSS, token.EQL, token.NEQ, token.LEQ, token.GEQ:
        -				default:
        -					continue
        -				}
        -
        -				xs, ok1 := consts(ssabinop.X, nil, nil)
        -				ys, ok2 := consts(ssabinop.Y, nil, nil)
        -				if !ok1 || !ok2 || len(xs) == 0 || len(ys) == 0 {
        -					continue
        -				}
        -
        -				trues := 0
        -				for _, x := range xs {
        -					for _, y := range ys {
        -						if x.Value == nil {
        -							if y.Value == nil {
        -								trues++
        -							}
        -							continue
        -						}
        -						if constant.Compare(x.Value, ssabinop.Op, y.Value) {
        -							trues++
        -						}
        -					}
        -				}
        -				b := trues != 0
        -				if trues == 0 || trues == len(xs)*len(ys) {
        -					pass.Reportf(ssabinop.Pos(), "binary expression is always %t for all possible values (%s %s %s)",
        -						b, xs, ssabinop.Op, ys)
        -				}
        -			}
        -		}
        -	}
        -	return nil, nil
        -}
        -
        -func CheckNilMaps(pass *analysis.Pass) (interface{}, error) {
        -	for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		for _, block := range ssafn.Blocks {
        -			for _, ins := range block.Instrs {
        -				mu, ok := ins.(*ssa.MapUpdate)
        -				if !ok {
        -					continue
        -				}
        -				c, ok := mu.Map.(*ssa.Const)
        -				if !ok {
        -					continue
        -				}
        -				if c.Value != nil {
        -					continue
        -				}
        -				pass.Reportf(mu.Pos(), "assignment to nil map")
        -			}
        -		}
        -	}
        -	return nil, nil
        -}
        -
        -func CheckExtremeComparison(pass *analysis.Pass) (interface{}, error) {
        -	isobj := func(expr ast.Expr, name string) bool {
        -		sel, ok := expr.(*ast.SelectorExpr)
        -		if !ok {
        -			return false
        -		}
        -		return IsObject(pass.TypesInfo.ObjectOf(sel.Sel), name)
        -	}
        -
        -	fn := func(node ast.Node) {
        -		expr := node.(*ast.BinaryExpr)
        -		tx := pass.TypesInfo.TypeOf(expr.X)
        -		basic, ok := tx.Underlying().(*types.Basic)
        -		if !ok {
        -			return
        -		}
        -
        -		var max string
        -		var min string
        -
        -		switch basic.Kind() {
        -		case types.Uint8:
        -			max = "math.MaxUint8"
        -		case types.Uint16:
        -			max = "math.MaxUint16"
        -		case types.Uint32:
        -			max = "math.MaxUint32"
        -		case types.Uint64:
        -			max = "math.MaxUint64"
        -		case types.Uint:
        -			max = "math.MaxUint64"
        -
        -		case types.Int8:
        -			min = "math.MinInt8"
        -			max = "math.MaxInt8"
        -		case types.Int16:
        -			min = "math.MinInt16"
        -			max = "math.MaxInt16"
        -		case types.Int32:
        -			min = "math.MinInt32"
        -			max = "math.MaxInt32"
        -		case types.Int64:
        -			min = "math.MinInt64"
        -			max = "math.MaxInt64"
        -		case types.Int:
        -			min = "math.MinInt64"
        -			max = "math.MaxInt64"
        -		}
        -
        -		if (expr.Op == token.GTR || expr.Op == token.GEQ) && isobj(expr.Y, max) ||
        -			(expr.Op == token.LSS || expr.Op == token.LEQ) && isobj(expr.X, max) {
        -			ReportNodef(pass, expr, "no value of type %s is greater than %s", basic, max)
        -		}
        -		if expr.Op == token.LEQ && isobj(expr.Y, max) ||
        -			expr.Op == token.GEQ && isobj(expr.X, max) {
        -			ReportNodef(pass, expr, "every value of type %s is <= %s", basic, max)
        -		}
        -
        -		if (basic.Info() & types.IsUnsigned) != 0 {
        -			if (expr.Op == token.LSS || expr.Op == token.LEQ) && IsIntLiteral(expr.Y, "0") ||
        -				(expr.Op == token.GTR || expr.Op == token.GEQ) && IsIntLiteral(expr.X, "0") {
        -				ReportNodef(pass, expr, "no value of type %s is less than 0", basic)
        -			}
        -			if expr.Op == token.GEQ && IsIntLiteral(expr.Y, "0") ||
        -				expr.Op == token.LEQ && IsIntLiteral(expr.X, "0") {
        -				ReportNodef(pass, expr, "every value of type %s is >= 0", basic)
        -			}
        -		} else {
        -			if (expr.Op == token.LSS || expr.Op == token.LEQ) && isobj(expr.Y, min) ||
        -				(expr.Op == token.GTR || expr.Op == token.GEQ) && isobj(expr.X, min) {
        -				ReportNodef(pass, expr, "no value of type %s is less than %s", basic, min)
        -			}
        -			if expr.Op == token.GEQ && isobj(expr.Y, min) ||
        -				expr.Op == token.LEQ && isobj(expr.X, min) {
        -				ReportNodef(pass, expr, "every value of type %s is >= %s", basic, min)
        -			}
        -		}
        -
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BinaryExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func consts(val ssa.Value, out []*ssa.Const, visitedPhis map[string]bool) ([]*ssa.Const, bool) {
        -	if visitedPhis == nil {
        -		visitedPhis = map[string]bool{}
        -	}
        -	var ok bool
        -	switch val := val.(type) {
        -	case *ssa.Phi:
        -		if visitedPhis[val.Name()] {
        -			break
        -		}
        -		visitedPhis[val.Name()] = true
        -		vals := val.Operands(nil)
        -		for _, phival := range vals {
        -			out, ok = consts(*phival, out, visitedPhis)
        -			if !ok {
        -				return nil, false
        -			}
        -		}
        -	case *ssa.Const:
        -		out = append(out, val)
        -	case *ssa.Convert:
        -		out, ok = consts(val.X, out, visitedPhis)
        -		if !ok {
        -			return nil, false
        -		}
        -	default:
        -		return nil, false
        -	}
        -	if len(out) < 2 {
        -		return out, true
        -	}
        -	uniq := []*ssa.Const{out[0]}
        -	for _, val := range out[1:] {
        -		if val.Value == uniq[len(uniq)-1].Value {
        -			continue
        -		}
        -		uniq = append(uniq, val)
        -	}
        -	return uniq, true
        -}
        -
        -func CheckLoopCondition(pass *analysis.Pass) (interface{}, error) {
        -	for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		fn := func(node ast.Node) bool {
        -			loop, ok := node.(*ast.ForStmt)
        -			if !ok {
        -				return true
        -			}
        -			if loop.Init == nil || loop.Cond == nil || loop.Post == nil {
        -				return true
        -			}
        -			init, ok := loop.Init.(*ast.AssignStmt)
        -			if !ok || len(init.Lhs) != 1 || len(init.Rhs) != 1 {
        -				return true
        -			}
        -			cond, ok := loop.Cond.(*ast.BinaryExpr)
        -			if !ok {
        -				return true
        -			}
        -			x, ok := cond.X.(*ast.Ident)
        -			if !ok {
        -				return true
        -			}
        -			lhs, ok := init.Lhs[0].(*ast.Ident)
        -			if !ok {
        -				return true
        -			}
        -			if x.Obj != lhs.Obj {
        -				return true
        -			}
        -			if _, ok := loop.Post.(*ast.IncDecStmt); !ok {
        -				return true
        -			}
        -
        -			v, isAddr := ssafn.ValueForExpr(cond.X)
        -			if v == nil || isAddr {
        -				return true
        -			}
        -			switch v := v.(type) {
        -			case *ssa.Phi:
        -				ops := v.Operands(nil)
        -				if len(ops) != 2 {
        -					return true
        -				}
        -				_, ok := (*ops[0]).(*ssa.Const)
        -				if !ok {
        -					return true
        -				}
        -				sigma, ok := (*ops[1]).(*ssa.Sigma)
        -				if !ok {
        -					return true
        -				}
        -				if sigma.X != v {
        -					return true
        -				}
        -			case *ssa.UnOp:
        -				return true
        -			}
        -			ReportNodef(pass, cond, "variable in loop condition never changes")
        -
        -			return true
        -		}
        -		Inspect(ssafn.Syntax(), fn)
        -	}
        -	return nil, nil
        -}
        -
        -func CheckArgOverwritten(pass *analysis.Pass) (interface{}, error) {
        -	for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		fn := func(node ast.Node) bool {
        -			var typ *ast.FuncType
        -			var body *ast.BlockStmt
        -			switch fn := node.(type) {
        -			case *ast.FuncDecl:
        -				typ = fn.Type
        -				body = fn.Body
        -			case *ast.FuncLit:
        -				typ = fn.Type
        -				body = fn.Body
        -			}
        -			if body == nil {
        -				return true
        -			}
        -			if len(typ.Params.List) == 0 {
        -				return true
        -			}
        -			for _, field := range typ.Params.List {
        -				for _, arg := range field.Names {
        -					obj := pass.TypesInfo.ObjectOf(arg)
        -					var ssaobj *ssa.Parameter
        -					for _, param := range ssafn.Params {
        -						if param.Object() == obj {
        -							ssaobj = param
        -							break
        -						}
        -					}
        -					if ssaobj == nil {
        -						continue
        -					}
        -					refs := ssaobj.Referrers()
        -					if refs == nil {
        -						continue
        -					}
        -					if len(FilterDebug(*refs)) != 0 {
        -						continue
        -					}
        -
        -					assigned := false
        -					ast.Inspect(body, func(node ast.Node) bool {
        -						assign, ok := node.(*ast.AssignStmt)
        -						if !ok {
        -							return true
        -						}
        -						for _, lhs := range assign.Lhs {
        -							ident, ok := lhs.(*ast.Ident)
        -							if !ok {
        -								continue
        -							}
        -							if pass.TypesInfo.ObjectOf(ident) == obj {
        -								assigned = true
        -								return false
        -							}
        -						}
        -						return true
        -					})
        -					if assigned {
        -						ReportNodef(pass, arg, "argument %s is overwritten before first use", arg)
        -					}
        -				}
        -			}
        -			return true
        -		}
        -		Inspect(ssafn.Syntax(), fn)
        -	}
        -	return nil, nil
        -}
        -
        -func CheckIneffectiveLoop(pass *analysis.Pass) (interface{}, error) {
        -	// This check detects some, but not all unconditional loop exits.
        -	// We give up in the following cases:
        -	//
        -	// - a goto anywhere in the loop. The goto might skip over our
        -	// return, and we don't check that it doesn't.
        -	//
        -	// - any nested, unlabelled continue, even if it is in another
        -	// loop or closure.
        -	fn := func(node ast.Node) {
        -		var body *ast.BlockStmt
        -		switch fn := node.(type) {
        -		case *ast.FuncDecl:
        -			body = fn.Body
        -		case *ast.FuncLit:
        -			body = fn.Body
        -		default:
        -			panic(fmt.Sprintf("unreachable: %T", node))
        -		}
        -		if body == nil {
        -			return
        -		}
        -		labels := map[*ast.Object]ast.Stmt{}
        -		ast.Inspect(body, func(node ast.Node) bool {
        -			label, ok := node.(*ast.LabeledStmt)
        -			if !ok {
        -				return true
        -			}
        -			labels[label.Label.Obj] = label.Stmt
        -			return true
        -		})
        -
        -		ast.Inspect(body, func(node ast.Node) bool {
        -			var loop ast.Node
        -			var body *ast.BlockStmt
        -			switch node := node.(type) {
        -			case *ast.ForStmt:
        -				body = node.Body
        -				loop = node
        -			case *ast.RangeStmt:
        -				typ := pass.TypesInfo.TypeOf(node.X)
        -				if _, ok := typ.Underlying().(*types.Map); ok {
        -					// looping once over a map is a valid pattern for
        -					// getting an arbitrary element.
        -					return true
        -				}
        -				body = node.Body
        -				loop = node
        -			default:
        -				return true
        -			}
        -			if len(body.List) < 2 {
        -				// avoid flagging the somewhat common pattern of using
        -				// a range loop to get the first element in a slice,
        -				// or the first rune in a string.
        -				return true
        -			}
        -			var unconditionalExit ast.Node
        -			hasBranching := false
        -			for _, stmt := range body.List {
        -				switch stmt := stmt.(type) {
        -				case *ast.BranchStmt:
        -					switch stmt.Tok {
        -					case token.BREAK:
        -						if stmt.Label == nil || labels[stmt.Label.Obj] == loop {
        -							unconditionalExit = stmt
        -						}
        -					case token.CONTINUE:
        -						if stmt.Label == nil || labels[stmt.Label.Obj] == loop {
        -							unconditionalExit = nil
        -							return false
        -						}
        -					}
        -				case *ast.ReturnStmt:
        -					unconditionalExit = stmt
        -				case *ast.IfStmt, *ast.ForStmt, *ast.RangeStmt, *ast.SwitchStmt, *ast.SelectStmt:
        -					hasBranching = true
        -				}
        -			}
        -			if unconditionalExit == nil || !hasBranching {
        -				return false
        -			}
        -			ast.Inspect(body, func(node ast.Node) bool {
        -				if branch, ok := node.(*ast.BranchStmt); ok {
        -
        -					switch branch.Tok {
        -					case token.GOTO:
        -						unconditionalExit = nil
        -						return false
        -					case token.CONTINUE:
        -						if branch.Label != nil && labels[branch.Label.Obj] != loop {
        -							return true
        -						}
        -						unconditionalExit = nil
        -						return false
        -					}
        -				}
        -				return true
        -			})
        -			if unconditionalExit != nil {
        -				ReportNodef(pass, unconditionalExit, "the surrounding loop is unconditionally terminated")
        -			}
        -			return true
        -		})
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.FuncDecl)(nil), (*ast.FuncLit)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func CheckNilContext(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		call := node.(*ast.CallExpr)
        -		if len(call.Args) == 0 {
        -			return
        -		}
        -		if typ, ok := pass.TypesInfo.TypeOf(call.Args[0]).(*types.Basic); !ok || typ.Kind() != types.UntypedNil {
        -			return
        -		}
        -		sig, ok := pass.TypesInfo.TypeOf(call.Fun).(*types.Signature)
        -		if !ok {
        -			return
        -		}
        -		if sig.Params().Len() == 0 {
        -			return
        -		}
        -		if !IsType(sig.Params().At(0).Type(), "context.Context") {
        -			return
        -		}
        -		ReportNodef(pass, call.Args[0],
        -			"do not pass a nil Context, even if a function permits it; pass context.TODO if you are unsure about which Context to use")
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func CheckSeeker(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		call := node.(*ast.CallExpr)
        -		sel, ok := call.Fun.(*ast.SelectorExpr)
        -		if !ok {
        -			return
        -		}
        -		if sel.Sel.Name != "Seek" {
        -			return
        -		}
        -		if len(call.Args) != 2 {
        -			return
        -		}
        -		arg0, ok := call.Args[Arg("(io.Seeker).Seek.offset")].(*ast.SelectorExpr)
        -		if !ok {
        -			return
        -		}
        -		switch arg0.Sel.Name {
        -		case "SeekStart", "SeekCurrent", "SeekEnd":
        -		default:
        -			return
        -		}
        -		pkg, ok := arg0.X.(*ast.Ident)
        -		if !ok {
        -			return
        -		}
        -		if pkg.Name != "io" {
        -			return
        -		}
        -		ReportNodef(pass, call, "the first argument of io.Seeker is the offset, but an io.Seek* constant is being used instead")
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func CheckIneffectiveAppend(pass *analysis.Pass) (interface{}, error) {
        -	isAppend := func(ins ssa.Value) bool {
        -		call, ok := ins.(*ssa.Call)
        -		if !ok {
        -			return false
        -		}
        -		if call.Call.IsInvoke() {
        -			return false
        -		}
        -		if builtin, ok := call.Call.Value.(*ssa.Builtin); !ok || builtin.Name() != "append" {
        -			return false
        -		}
        -		return true
        -	}
        -
        -	for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		for _, block := range ssafn.Blocks {
        -			for _, ins := range block.Instrs {
        -				val, ok := ins.(ssa.Value)
        -				if !ok || !isAppend(val) {
        -					continue
        -				}
        -
        -				isUsed := false
        -				visited := map[ssa.Instruction]bool{}
        -				var walkRefs func(refs []ssa.Instruction)
        -				walkRefs = func(refs []ssa.Instruction) {
        -				loop:
        -					for _, ref := range refs {
        -						if visited[ref] {
        -							continue
        -						}
        -						visited[ref] = true
        -						if _, ok := ref.(*ssa.DebugRef); ok {
        -							continue
        -						}
        -						switch ref := ref.(type) {
        -						case *ssa.Phi:
        -							walkRefs(*ref.Referrers())
        -						case *ssa.Sigma:
        -							walkRefs(*ref.Referrers())
        -						case ssa.Value:
        -							if !isAppend(ref) {
        -								isUsed = true
        -							} else {
        -								walkRefs(*ref.Referrers())
        -							}
        -						case ssa.Instruction:
        -							isUsed = true
        -							break loop
        -						}
        -					}
        -				}
        -				refs := val.Referrers()
        -				if refs == nil {
        -					continue
        -				}
        -				walkRefs(*refs)
        -				if !isUsed {
        -					pass.Reportf(ins.Pos(), "this result of append is never used, except maybe in other appends")
        -				}
        -			}
        -		}
        -	}
        -	return nil, nil
        -}
        -
        -func CheckConcurrentTesting(pass *analysis.Pass) (interface{}, error) {
        -	for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		for _, block := range ssafn.Blocks {
        -			for _, ins := range block.Instrs {
        -				gostmt, ok := ins.(*ssa.Go)
        -				if !ok {
        -					continue
        -				}
        -				var fn *ssa.Function
        -				switch val := gostmt.Call.Value.(type) {
        -				case *ssa.Function:
        -					fn = val
        -				case *ssa.MakeClosure:
        -					fn = val.Fn.(*ssa.Function)
        -				default:
        -					continue
        -				}
        -				if fn.Blocks == nil {
        -					continue
        -				}
        -				for _, block := range fn.Blocks {
        -					for _, ins := range block.Instrs {
        -						call, ok := ins.(*ssa.Call)
        -						if !ok {
        -							continue
        -						}
        -						if call.Call.IsInvoke() {
        -							continue
        -						}
        -						callee := call.Call.StaticCallee()
        -						if callee == nil {
        -							continue
        -						}
        -						recv := callee.Signature.Recv()
        -						if recv == nil {
        -							continue
        -						}
        -						if !IsType(recv.Type(), "*testing.common") {
        -							continue
        -						}
        -						fn, ok := call.Call.StaticCallee().Object().(*types.Func)
        -						if !ok {
        -							continue
        -						}
        -						name := fn.Name()
        -						switch name {
        -						case "FailNow", "Fatal", "Fatalf", "SkipNow", "Skip", "Skipf":
        -						default:
        -							continue
        -						}
        -						pass.Reportf(gostmt.Pos(), "the goroutine calls T.%s, which must be called in the same goroutine as the test", name)
        -					}
        -				}
        -			}
        -		}
        -	}
        -	return nil, nil
        -}
        -
        -func eachCall(ssafn *ssa.Function, fn func(caller *ssa.Function, site ssa.CallInstruction, callee *ssa.Function)) {
        -	for _, b := range ssafn.Blocks {
        -		for _, instr := range b.Instrs {
        -			if site, ok := instr.(ssa.CallInstruction); ok {
        -				if g := site.Common().StaticCallee(); g != nil {
        -					fn(ssafn, site, g)
        -				}
        -			}
        -		}
        -	}
        -}
        -
        -func CheckCyclicFinalizer(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(caller *ssa.Function, site ssa.CallInstruction, callee *ssa.Function) {
        -		if callee.RelString(nil) != "runtime.SetFinalizer" {
        -			return
        -		}
        -		arg0 := site.Common().Args[Arg("runtime.SetFinalizer.obj")]
        -		if iface, ok := arg0.(*ssa.MakeInterface); ok {
        -			arg0 = iface.X
        -		}
        -		unop, ok := arg0.(*ssa.UnOp)
        -		if !ok {
        -			return
        -		}
        -		v, ok := unop.X.(*ssa.Alloc)
        -		if !ok {
        -			return
        -		}
        -		arg1 := site.Common().Args[Arg("runtime.SetFinalizer.finalizer")]
        -		if iface, ok := arg1.(*ssa.MakeInterface); ok {
        -			arg1 = iface.X
        -		}
        -		mc, ok := arg1.(*ssa.MakeClosure)
        -		if !ok {
        -			return
        -		}
        -		for _, b := range mc.Bindings {
        -			if b == v {
        -				pos := lint.DisplayPosition(pass.Fset, mc.Fn.Pos())
        -				pass.Reportf(site.Pos(), "the finalizer closes over the object, preventing the finalizer from ever running (at %s)", pos)
        -			}
        -		}
        -	}
        -	for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		eachCall(ssafn, fn)
        -	}
        -	return nil, nil
        -}
        -
        -/*
        -func CheckSliceOutOfBounds(pass *analysis.Pass) (interface{}, error) {
        -	for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		for _, block := range ssafn.Blocks {
        -			for _, ins := range block.Instrs {
        -				ia, ok := ins.(*ssa.IndexAddr)
        -				if !ok {
        -					continue
        -				}
        -				if _, ok := ia.X.Type().Underlying().(*types.Slice); !ok {
        -					continue
        -				}
        -				sr, ok1 := c.funcDescs.Get(ssafn).Ranges[ia.X].(vrp.SliceInterval)
        -				idxr, ok2 := c.funcDescs.Get(ssafn).Ranges[ia.Index].(vrp.IntInterval)
        -				if !ok1 || !ok2 || !sr.IsKnown() || !idxr.IsKnown() || sr.Length.Empty() || idxr.Empty() {
        -					continue
        -				}
        -				if idxr.Lower.Cmp(sr.Length.Upper) >= 0 {
        -					ReportNodef(pass, ia, "index out of bounds")
        -				}
        -			}
        -		}
        -	}
        -	return nil, nil
        -}
        -*/
        -
        -func CheckDeferLock(pass *analysis.Pass) (interface{}, error) {
        -	for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		for _, block := range ssafn.Blocks {
        -			instrs := FilterDebug(block.Instrs)
        -			if len(instrs) < 2 {
        -				continue
        -			}
        -			for i, ins := range instrs[:len(instrs)-1] {
        -				call, ok := ins.(*ssa.Call)
        -				if !ok {
        -					continue
        -				}
        -				if !IsCallTo(call.Common(), "(*sync.Mutex).Lock") && !IsCallTo(call.Common(), "(*sync.RWMutex).RLock") {
        -					continue
        -				}
        -				nins, ok := instrs[i+1].(*ssa.Defer)
        -				if !ok {
        -					continue
        -				}
        -				if !IsCallTo(&nins.Call, "(*sync.Mutex).Lock") && !IsCallTo(&nins.Call, "(*sync.RWMutex).RLock") {
        -					continue
        -				}
        -				if call.Common().Args[0] != nins.Call.Args[0] {
        -					continue
        -				}
        -				name := shortCallName(call.Common())
        -				alt := ""
        -				switch name {
        -				case "Lock":
        -					alt = "Unlock"
        -				case "RLock":
        -					alt = "RUnlock"
        -				}
        -				pass.Reportf(nins.Pos(), "deferring %s right after having locked already; did you mean to defer %s?", name, alt)
        -			}
        -		}
        -	}
        -	return nil, nil
        -}
        -
        -func CheckNaNComparison(pass *analysis.Pass) (interface{}, error) {
        -	isNaN := func(v ssa.Value) bool {
        -		call, ok := v.(*ssa.Call)
        -		if !ok {
        -			return false
        -		}
        -		return IsCallTo(call.Common(), "math.NaN")
        -	}
        -	for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		for _, block := range ssafn.Blocks {
        -			for _, ins := range block.Instrs {
        -				ins, ok := ins.(*ssa.BinOp)
        -				if !ok {
        -					continue
        -				}
        -				if isNaN(ins.X) || isNaN(ins.Y) {
        -					pass.Reportf(ins.Pos(), "no value is equal to NaN, not even NaN itself")
        -				}
        -			}
        -		}
        -	}
        -	return nil, nil
        -}
        -
        -func CheckInfiniteRecursion(pass *analysis.Pass) (interface{}, error) {
        -	for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		eachCall(ssafn, func(caller *ssa.Function, site ssa.CallInstruction, callee *ssa.Function) {
        -			if callee != ssafn {
        -				return
        -			}
        -			if _, ok := site.(*ssa.Go); ok {
        -				// Recursively spawning goroutines doesn't consume
        -				// stack space infinitely, so don't flag it.
        -				return
        -			}
        -
        -			block := site.Block()
        -			canReturn := false
        -			for _, b := range ssafn.Blocks {
        -				if block.Dominates(b) {
        -					continue
        -				}
        -				if len(b.Instrs) == 0 {
        -					continue
        -				}
        -				if _, ok := b.Instrs[len(b.Instrs)-1].(*ssa.Return); ok {
        -					canReturn = true
        -					break
        -				}
        -			}
        -			if canReturn {
        -				return
        -			}
        -			pass.Reportf(site.Pos(), "infinite recursive call")
        -		})
        -	}
        -	return nil, nil
        -}
        -
        -func objectName(obj types.Object) string {
        -	if obj == nil {
        -		return ""
        -	}
        -	var name string
        -	if obj.Pkg() != nil && obj.Pkg().Scope().Lookup(obj.Name()) == obj {
        -		s := obj.Pkg().Path()
        -		if s != "" {
        -			name += s + "."
        -		}
        -	}
        -	name += obj.Name()
        -	return name
        -}
        -
        -func isName(pass *analysis.Pass, expr ast.Expr, name string) bool {
        -	var obj types.Object
        -	switch expr := expr.(type) {
        -	case *ast.Ident:
        -		obj = pass.TypesInfo.ObjectOf(expr)
        -	case *ast.SelectorExpr:
        -		obj = pass.TypesInfo.ObjectOf(expr.Sel)
        -	}
        -	return objectName(obj) == name
        -}
        -
        -func CheckLeakyTimeTick(pass *analysis.Pass) (interface{}, error) {
        -	for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		if IsInMain(pass, ssafn) || IsInTest(pass, ssafn) {
        -			continue
        -		}
        -		for _, block := range ssafn.Blocks {
        -			for _, ins := range block.Instrs {
        -				call, ok := ins.(*ssa.Call)
        -				if !ok || !IsCallTo(call.Common(), "time.Tick") {
        -					continue
        -				}
        -				if !functions.Terminates(call.Parent()) {
        -					continue
        -				}
        -				pass.Reportf(call.Pos(), "using time.Tick leaks the underlying ticker, consider using it only in endless functions, tests and the main package, and use time.NewTicker here")
        -			}
        -		}
        -	}
        -	return nil, nil
        -}
        -
        -func CheckDoubleNegation(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		unary1 := node.(*ast.UnaryExpr)
        -		unary2, ok := unary1.X.(*ast.UnaryExpr)
        -		if !ok {
        -			return
        -		}
        -		if unary1.Op != token.NOT || unary2.Op != token.NOT {
        -			return
        -		}
        -		ReportNodef(pass, unary1, "negating a boolean twice has no effect; is this a typo?")
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.UnaryExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func hasSideEffects(node ast.Node) bool {
        -	dynamic := false
        -	ast.Inspect(node, func(node ast.Node) bool {
        -		switch node := node.(type) {
        -		case *ast.CallExpr:
        -			dynamic = true
        -			return false
        -		case *ast.UnaryExpr:
        -			if node.Op == token.ARROW {
        -				dynamic = true
        -				return false
        -			}
        -		}
        -		return true
        -	})
        -	return dynamic
        -}
        -
        -func CheckRepeatedIfElse(pass *analysis.Pass) (interface{}, error) {
        -	seen := map[ast.Node]bool{}
        -
        -	var collectConds func(ifstmt *ast.IfStmt, inits []ast.Stmt, conds []ast.Expr) ([]ast.Stmt, []ast.Expr)
        -	collectConds = func(ifstmt *ast.IfStmt, inits []ast.Stmt, conds []ast.Expr) ([]ast.Stmt, []ast.Expr) {
        -		seen[ifstmt] = true
        -		if ifstmt.Init != nil {
        -			inits = append(inits, ifstmt.Init)
        -		}
        -		conds = append(conds, ifstmt.Cond)
        -		if elsestmt, ok := ifstmt.Else.(*ast.IfStmt); ok {
        -			return collectConds(elsestmt, inits, conds)
        -		}
        -		return inits, conds
        -	}
        -	fn := func(node ast.Node) {
        -		ifstmt := node.(*ast.IfStmt)
        -		if seen[ifstmt] {
        -			return
        -		}
        -		inits, conds := collectConds(ifstmt, nil, nil)
        -		if len(inits) > 0 {
        -			return
        -		}
        -		for _, cond := range conds {
        -			if hasSideEffects(cond) {
        -				return
        -			}
        -		}
        -		counts := map[string]int{}
        -		for _, cond := range conds {
        -			s := Render(pass, cond)
        -			counts[s]++
        -			if counts[s] == 2 {
        -				ReportNodef(pass, cond, "this condition occurs multiple times in this if/else if chain")
        -			}
        -		}
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.IfStmt)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func CheckSillyBitwiseOps(pass *analysis.Pass) (interface{}, error) {
        -	for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		for _, block := range ssafn.Blocks {
        -			for _, ins := range block.Instrs {
        -				ins, ok := ins.(*ssa.BinOp)
        -				if !ok {
        -					continue
        -				}
        -
        -				if c, ok := ins.Y.(*ssa.Const); !ok || c.Value == nil || c.Value.Kind() != constant.Int || c.Uint64() != 0 {
        -					continue
        -				}
        -				switch ins.Op {
        -				case token.AND, token.OR, token.XOR:
        -				default:
        -					// we do not flag shifts because too often, x<<0 is part
        -					// of a pattern, x<<0, x<<8, x<<16, ...
        -					continue
        -				}
        -				path, _ := astutil.PathEnclosingInterval(File(pass, ins), ins.Pos(), ins.Pos())
        -				if len(path) == 0 {
        -					continue
        -				}
        -				if node, ok := path[0].(*ast.BinaryExpr); !ok || !IsZero(node.Y) {
        -					continue
        -				}
        -
        -				switch ins.Op {
        -				case token.AND:
        -					pass.Reportf(ins.Pos(), "x & 0 always equals 0")
        -				case token.OR, token.XOR:
        -					pass.Reportf(ins.Pos(), "x %s 0 always equals x", ins.Op)
        -				}
        -			}
        -		}
        -	}
        -	return nil, nil
        -}
        -
        -func CheckNonOctalFileMode(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		call := node.(*ast.CallExpr)
        -		sig, ok := pass.TypesInfo.TypeOf(call.Fun).(*types.Signature)
        -		if !ok {
        -			return
        -		}
        -		n := sig.Params().Len()
        -		var args []int
        -		for i := 0; i < n; i++ {
        -			typ := sig.Params().At(i).Type()
        -			if IsType(typ, "os.FileMode") {
        -				args = append(args, i)
        -			}
        -		}
        -		for _, i := range args {
        -			lit, ok := call.Args[i].(*ast.BasicLit)
        -			if !ok {
        -				continue
        -			}
        -			if len(lit.Value) == 3 &&
        -				lit.Value[0] != '0' &&
        -				lit.Value[0] >= '0' && lit.Value[0] <= '7' &&
        -				lit.Value[1] >= '0' && lit.Value[1] <= '7' &&
        -				lit.Value[2] >= '0' && lit.Value[2] <= '7' {
        -
        -				v, err := strconv.ParseInt(lit.Value, 10, 64)
        -				if err != nil {
        -					continue
        -				}
        -				ReportNodef(pass, call.Args[i], "file mode '%s' evaluates to %#o; did you mean '0%s'?", lit.Value, v, lit.Value)
        -			}
        -		}
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func CheckPureFunctions(pass *analysis.Pass) (interface{}, error) {
        -	pure := pass.ResultOf[facts.Purity].(facts.PurityResult)
        -
        -fnLoop:
        -	for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		if IsInTest(pass, ssafn) {
        -			params := ssafn.Signature.Params()
        -			for i := 0; i < params.Len(); i++ {
        -				param := params.At(i)
        -				if IsType(param.Type(), "*testing.B") {
        -					// Ignore discarded pure functions in code related
        -					// to benchmarks. Instead of matching BenchmarkFoo
        -					// functions, we match any function accepting a
        -					// *testing.B. Benchmarks sometimes call generic
        -					// functions for doing the actual work, and
        -					// checking for the parameter is a lot easier and
        -					// faster than analyzing call trees.
        -					continue fnLoop
        -				}
        -			}
        -		}
        -
        -		for _, b := range ssafn.Blocks {
        -			for _, ins := range b.Instrs {
        -				ins, ok := ins.(*ssa.Call)
        -				if !ok {
        -					continue
        -				}
        -				refs := ins.Referrers()
        -				if refs == nil || len(FilterDebug(*refs)) > 0 {
        -					continue
        -				}
        -				callee := ins.Common().StaticCallee()
        -				if callee == nil {
        -					continue
        -				}
        -				if callee.Object() == nil {
        -					// TODO(dh): support anonymous functions
        -					continue
        -				}
        -				if _, ok := pure[callee.Object().(*types.Func)]; ok {
        -					pass.Reportf(ins.Pos(), "%s is a pure function but its return value is ignored", callee.Name())
        -					continue
        -				}
        -			}
        -		}
        -	}
        -	return nil, nil
        -}
        -
        -func CheckDeprecated(pass *analysis.Pass) (interface{}, error) {
        -	deprs := pass.ResultOf[facts.Deprecated].(facts.DeprecatedResult)
        -
        -	// Selectors can appear outside of function literals, e.g. when
        -	// declaring package level variables.
        -
        -	var tfn types.Object
        -	stack := 0
        -	fn := func(node ast.Node, push bool) bool {
        -		if !push {
        -			stack--
        -			return false
        -		}
        -		stack++
        -		if stack == 1 {
        -			tfn = nil
        -		}
        -		if fn, ok := node.(*ast.FuncDecl); ok {
        -			tfn = pass.TypesInfo.ObjectOf(fn.Name)
        -		}
        -		sel, ok := node.(*ast.SelectorExpr)
        -		if !ok {
        -			return true
        -		}
        -
        -		obj := pass.TypesInfo.ObjectOf(sel.Sel)
        -		if obj.Pkg() == nil {
        -			return true
        -		}
        -		if pass.Pkg == obj.Pkg() || obj.Pkg().Path()+"_test" == pass.Pkg.Path() {
        -			// Don't flag stuff in our own package
        -			return true
        -		}
        -		if depr, ok := deprs.Objects[obj]; ok {
        -			// Look for the first available alternative, not the first
        -			// version something was deprecated in. If a function was
        -			// deprecated in Go 1.6, an alternative has been available
        -			// already in 1.0, and we're targeting 1.2, it still
        -			// makes sense to use the alternative from 1.0, to be
        -			// future-proof.
        -			minVersion := deprecated.Stdlib[SelectorName(pass, sel)].AlternativeAvailableSince
        -			if !IsGoVersion(pass, minVersion) {
        -				return true
        -			}
        -
        -			if tfn != nil {
        -				if _, ok := deprs.Objects[tfn]; ok {
        -					// functions that are deprecated may use deprecated
        -					// symbols
        -					return true
        -				}
        -			}
        -			ReportNodef(pass, sel, "%s is deprecated: %s", Render(pass, sel), depr.Msg)
        -			return true
        -		}
        -		return true
        -	}
        -
        -	imps := map[string]*types.Package{}
        -	for _, imp := range pass.Pkg.Imports() {
        -		imps[imp.Path()] = imp
        -	}
        -	fn2 := func(node ast.Node) {
        -		spec := node.(*ast.ImportSpec)
        -		p := spec.Path.Value
        -		path := p[1 : len(p)-1]
        -		imp := imps[path]
        -		if depr, ok := deprs.Packages[imp]; ok {
        -			ReportNodef(pass, spec, "Package %s is deprecated: %s", path, depr.Msg)
        -		}
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Nodes(nil, fn)
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.ImportSpec)(nil)}, fn2)
        -	return nil, nil
        -}
        -
        -func callChecker(rules map[string]CallCheck) func(pass *analysis.Pass) (interface{}, error) {
        -	return func(pass *analysis.Pass) (interface{}, error) {
        -		return checkCalls(pass, rules)
        -	}
        -}
        -
        -func checkCalls(pass *analysis.Pass, rules map[string]CallCheck) (interface{}, error) {
        -	ranges := pass.ResultOf[valueRangesAnalyzer].(map[*ssa.Function]vrp.Ranges)
        -	fn := func(caller *ssa.Function, site ssa.CallInstruction, callee *ssa.Function) {
        -		obj, ok := callee.Object().(*types.Func)
        -		if !ok {
        -			return
        -		}
        -
        -		r, ok := rules[lint.FuncName(obj)]
        -		if !ok {
        -			return
        -		}
        -		var args []*Argument
        -		ssaargs := site.Common().Args
        -		if callee.Signature.Recv() != nil {
        -			ssaargs = ssaargs[1:]
        -		}
        -		for _, arg := range ssaargs {
        -			if iarg, ok := arg.(*ssa.MakeInterface); ok {
        -				arg = iarg.X
        -			}
        -			vr := ranges[site.Parent()][arg]
        -			args = append(args, &Argument{Value: Value{arg, vr}})
        -		}
        -		call := &Call{
        -			Pass:   pass,
        -			Instr:  site,
        -			Args:   args,
        -			Parent: site.Parent(),
        -		}
        -		r(call)
        -		for idx, arg := range call.Args {
        -			_ = idx
        -			for _, e := range arg.invalids {
        -				// path, _ := astutil.PathEnclosingInterval(f.File, edge.Site.Pos(), edge.Site.Pos())
        -				// if len(path) < 2 {
        -				// 	continue
        -				// }
        -				// astcall, ok := path[0].(*ast.CallExpr)
        -				// if !ok {
        -				// 	continue
        -				// }
        -				// pass.Reportf(astcall.Args[idx], "%s", e)
        -
        -				pass.Reportf(site.Pos(), "%s", e)
        -			}
        -		}
        -		for _, e := range call.invalids {
        -			pass.Reportf(call.Instr.Common().Pos(), "%s", e)
        -		}
        -	}
        -	for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		eachCall(ssafn, fn)
        -	}
        -	return nil, nil
        -}
        -
        -func shortCallName(call *ssa.CallCommon) string {
        -	if call.IsInvoke() {
        -		return ""
        -	}
        -	switch v := call.Value.(type) {
        -	case *ssa.Function:
        -		fn, ok := v.Object().(*types.Func)
        -		if !ok {
        -			return ""
        -		}
        -		return fn.Name()
        -	case *ssa.Builtin:
        -		return v.Name()
        -	}
        -	return ""
        -}
        -
        -func CheckWriterBufferModified(pass *analysis.Pass) (interface{}, error) {
        -	// TODO(dh): this might be a good candidate for taint analysis.
        -	// Taint the argument as MUST_NOT_MODIFY, then propagate that
        -	// through functions like bytes.Split
        -
        -	for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		sig := ssafn.Signature
        -		if ssafn.Name() != "Write" || sig.Recv() == nil || sig.Params().Len() != 1 || sig.Results().Len() != 2 {
        -			continue
        -		}
        -		tArg, ok := sig.Params().At(0).Type().(*types.Slice)
        -		if !ok {
        -			continue
        -		}
        -		if basic, ok := tArg.Elem().(*types.Basic); !ok || basic.Kind() != types.Byte {
        -			continue
        -		}
        -		if basic, ok := sig.Results().At(0).Type().(*types.Basic); !ok || basic.Kind() != types.Int {
        -			continue
        -		}
        -		if named, ok := sig.Results().At(1).Type().(*types.Named); !ok || !IsType(named, "error") {
        -			continue
        -		}
        -
        -		for _, block := range ssafn.Blocks {
        -			for _, ins := range block.Instrs {
        -				switch ins := ins.(type) {
        -				case *ssa.Store:
        -					addr, ok := ins.Addr.(*ssa.IndexAddr)
        -					if !ok {
        -						continue
        -					}
        -					if addr.X != ssafn.Params[1] {
        -						continue
        -					}
        -					pass.Reportf(ins.Pos(), "io.Writer.Write must not modify the provided buffer, not even temporarily")
        -				case *ssa.Call:
        -					if !IsCallTo(ins.Common(), "append") {
        -						continue
        -					}
        -					if ins.Common().Args[0] != ssafn.Params[1] {
        -						continue
        -					}
        -					pass.Reportf(ins.Pos(), "io.Writer.Write must not modify the provided buffer, not even temporarily")
        -				}
        -			}
        -		}
        -	}
        -	return nil, nil
        -}
        -
        -func loopedRegexp(name string) CallCheck {
        -	return func(call *Call) {
        -		if len(extractConsts(call.Args[0].Value.Value)) == 0 {
        -			return
        -		}
        -		if !isInLoop(call.Instr.Block()) {
        -			return
        -		}
        -		call.Invalid(fmt.Sprintf("calling %s in a loop has poor performance, consider using regexp.Compile", name))
        -	}
        -}
        -
        -func CheckEmptyBranch(pass *analysis.Pass) (interface{}, error) {
        -	for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		if ssafn.Syntax() == nil {
        -			continue
        -		}
        -		if IsExample(ssafn) {
        -			continue
        -		}
        -		fn := func(node ast.Node) bool {
        -			ifstmt, ok := node.(*ast.IfStmt)
        -			if !ok {
        -				return true
        -			}
        -			if ifstmt.Else != nil {
        -				b, ok := ifstmt.Else.(*ast.BlockStmt)
        -				if !ok || len(b.List) != 0 {
        -					return true
        -				}
        -				ReportfFG(pass, ifstmt.Else.Pos(), "empty branch")
        -			}
        -			if len(ifstmt.Body.List) != 0 {
        -				return true
        -			}
        -			ReportfFG(pass, ifstmt.Pos(), "empty branch")
        -			return true
        -		}
        -		Inspect(ssafn.Syntax(), fn)
        -	}
        -	return nil, nil
        -}
        -
        -func CheckMapBytesKey(pass *analysis.Pass) (interface{}, error) {
        -	for _, fn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		for _, b := range fn.Blocks {
        -		insLoop:
        -			for _, ins := range b.Instrs {
        -				// find []byte -> string conversions
        -				conv, ok := ins.(*ssa.Convert)
        -				if !ok || conv.Type() != types.Universe.Lookup("string").Type() {
        -					continue
        -				}
        -				if s, ok := conv.X.Type().(*types.Slice); !ok || s.Elem() != types.Universe.Lookup("byte").Type() {
        -					continue
        -				}
        -				refs := conv.Referrers()
        -				// need at least two (DebugRef) references: the
        -				// conversion and the *ast.Ident
        -				if refs == nil || len(*refs) < 2 {
        -					continue
        -				}
        -				ident := false
        -				// skip first reference, that's the conversion itself
        -				for _, ref := range (*refs)[1:] {
        -					switch ref := ref.(type) {
        -					case *ssa.DebugRef:
        -						if _, ok := ref.Expr.(*ast.Ident); !ok {
        -							// the string seems to be used somewhere
        -							// unexpected; the default branch should
        -							// catch this already, but be safe
        -							continue insLoop
        -						} else {
        -							ident = true
        -						}
        -					case *ssa.Lookup:
        -					default:
        -						// the string is used somewhere else than a
        -						// map lookup
        -						continue insLoop
        -					}
        -				}
        -
        -				// the result of the conversion wasn't assigned to an
        -				// identifier
        -				if !ident {
        -					continue
        -				}
        -				pass.Reportf(conv.Pos(), "m[string(key)] would be more efficient than k := string(key); m[k]")
        -			}
        -		}
        -	}
        -	return nil, nil
        -}
        -
        -func CheckRangeStringRunes(pass *analysis.Pass) (interface{}, error) {
        -	return sharedcheck.CheckRangeStringRunes(pass)
        -}
        -
        -func CheckSelfAssignment(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		assign := node.(*ast.AssignStmt)
        -		if assign.Tok != token.ASSIGN || len(assign.Lhs) != len(assign.Rhs) {
        -			return
        -		}
        -		for i, stmt := range assign.Lhs {
        -			rlh := Render(pass, stmt)
        -			rrh := Render(pass, assign.Rhs[i])
        -			if rlh == rrh {
        -				ReportfFG(pass, assign.Pos(), "self-assignment of %s to %s", rrh, rlh)
        -			}
        -		}
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.AssignStmt)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func buildTagsIdentical(s1, s2 []string) bool {
        -	if len(s1) != len(s2) {
        -		return false
        -	}
        -	s1s := make([]string, len(s1))
        -	copy(s1s, s1)
        -	sort.Strings(s1s)
        -	s2s := make([]string, len(s2))
        -	copy(s2s, s2)
        -	sort.Strings(s2s)
        -	for i, s := range s1s {
        -		if s != s2s[i] {
        -			return false
        -		}
        -	}
        -	return true
        -}
        -
        -func CheckDuplicateBuildConstraints(pass *analysis.Pass) (interface{}, error) {
        -	for _, f := range pass.Files {
        -		constraints := buildTags(f)
        -		for i, constraint1 := range constraints {
        -			for j, constraint2 := range constraints {
        -				if i >= j {
        -					continue
        -				}
        -				if buildTagsIdentical(constraint1, constraint2) {
        -					ReportfFG(pass, f.Pos(), "identical build constraints %q and %q",
        -						strings.Join(constraint1, " "),
        -						strings.Join(constraint2, " "))
        -				}
        -			}
        -		}
        -	}
        -	return nil, nil
        -}
        -
        -func CheckSillyRegexp(pass *analysis.Pass) (interface{}, error) {
        -	// We could use the rule checking engine for this, but the
        -	// arguments aren't really invalid.
        -	for _, fn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		for _, b := range fn.Blocks {
        -			for _, ins := range b.Instrs {
        -				call, ok := ins.(*ssa.Call)
        -				if !ok {
        -					continue
        -				}
        -				switch CallName(call.Common()) {
        -				case "regexp.MustCompile", "regexp.Compile", "regexp.Match", "regexp.MatchReader", "regexp.MatchString":
        -				default:
        -					continue
        -				}
        -				c, ok := call.Common().Args[0].(*ssa.Const)
        -				if !ok {
        -					continue
        -				}
        -				s := constant.StringVal(c.Value)
        -				re, err := syntax.Parse(s, 0)
        -				if err != nil {
        -					continue
        -				}
        -				if re.Op != syntax.OpLiteral && re.Op != syntax.OpEmptyMatch {
        -					continue
        -				}
        -				pass.Reportf(call.Pos(), "regular expression does not contain any meta characters")
        -			}
        -		}
        -	}
        -	return nil, nil
        -}
        -
        -func CheckMissingEnumTypesInDeclaration(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		decl := node.(*ast.GenDecl)
        -		if !decl.Lparen.IsValid() {
        -			return
        -		}
        -		if decl.Tok != token.CONST {
        -			return
        -		}
        -
        -		groups := GroupSpecs(pass.Fset, decl.Specs)
        -	groupLoop:
        -		for _, group := range groups {
        -			if len(group) < 2 {
        -				continue
        -			}
        -			if group[0].(*ast.ValueSpec).Type == nil {
        -				// first constant doesn't have a type
        -				continue groupLoop
        -			}
        -			for i, spec := range group {
        -				spec := spec.(*ast.ValueSpec)
        -				if len(spec.Names) != 1 || len(spec.Values) != 1 {
        -					continue groupLoop
        -				}
        -				switch v := spec.Values[0].(type) {
        -				case *ast.BasicLit:
        -				case *ast.UnaryExpr:
        -					if _, ok := v.X.(*ast.BasicLit); !ok {
        -						continue groupLoop
        -					}
        -				default:
        -					// if it's not a literal it might be typed, such as
        -					// time.Microsecond = 1000 * Nanosecond
        -					continue groupLoop
        -				}
        -				if i == 0 {
        -					continue
        -				}
        -				if spec.Type != nil {
        -					continue groupLoop
        -				}
        -			}
        -			ReportNodef(pass, group[0], "only the first constant in this group has an explicit type")
        -		}
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.GenDecl)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func CheckTimerResetReturnValue(pass *analysis.Pass) (interface{}, error) {
        -	for _, fn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		for _, block := range fn.Blocks {
        -			for _, ins := range block.Instrs {
        -				call, ok := ins.(*ssa.Call)
        -				if !ok {
        -					continue
        -				}
        -				if !IsCallTo(call.Common(), "(*time.Timer).Reset") {
        -					continue
        -				}
        -				refs := call.Referrers()
        -				if refs == nil {
        -					continue
        -				}
        -				for _, ref := range FilterDebug(*refs) {
        -					ifstmt, ok := ref.(*ssa.If)
        -					if !ok {
        -						continue
        -					}
        -
        -					found := false
        -					for _, succ := range ifstmt.Block().Succs {
        -						if len(succ.Preds) != 1 {
        -							// Merge point, not a branch in the
        -							// syntactical sense.
        -
        -							// FIXME(dh): this is broken for if
        -							// statements a la "if x || y"
        -							continue
        -						}
        -						ssautil.Walk(succ, func(b *ssa.BasicBlock) bool {
        -							if !succ.Dominates(b) {
        -								// We've reached the end of the branch
        -								return false
        -							}
        -							for _, ins := range b.Instrs {
        -								// TODO(dh): we should check that
        -								// we're receiving from the channel of
        -								// a time.Timer to further reduce
        -								// false positives. Not a key
        -								// priority, considering the rarity of
        -								// Reset and the tiny likeliness of a
        -								// false positive
        -								if ins, ok := ins.(*ssa.UnOp); ok && ins.Op == token.ARROW && IsType(ins.X.Type(), "<-chan time.Time") {
        -									found = true
        -									return false
        -								}
        -							}
        -							return true
        -						})
        -					}
        -
        -					if found {
        -						pass.Reportf(call.Pos(), "it is not possible to use Reset's return value correctly, as there is a race condition between draining the channel and the new timer expiring")
        -					}
        -				}
        -			}
        -		}
        -	}
        -	return nil, nil
        -}
        -
        -func CheckToLowerToUpperComparison(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		binExpr := node.(*ast.BinaryExpr)
        -
        -		var negative bool
        -		switch binExpr.Op {
        -		case token.EQL:
        -			negative = false
        -		case token.NEQ:
        -			negative = true
        -		default:
        -			return
        -		}
        -
        -		const (
        -			lo = "strings.ToLower"
        -			up = "strings.ToUpper"
        -		)
        -
        -		var call string
        -		if IsCallToAST(pass, binExpr.X, lo) && IsCallToAST(pass, binExpr.Y, lo) {
        -			call = lo
        -		} else if IsCallToAST(pass, binExpr.X, up) && IsCallToAST(pass, binExpr.Y, up) {
        -			call = up
        -		} else {
        -			return
        -		}
        -
        -		bang := ""
        -		if negative {
        -			bang = "!"
        -		}
        -
        -		ReportNodef(pass, binExpr, "should use %sstrings.EqualFold(a, b) instead of %s(a) %s %s(b)", bang, call, binExpr.Op, call)
        -	}
        -
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BinaryExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func CheckUnreachableTypeCases(pass *analysis.Pass) (interface{}, error) {
        -	// Check if T subsumes V in a type switch. T subsumes V if T is an interface and T's method set is a subset of V's method set.
        -	subsumes := func(T, V types.Type) bool {
        -		tIface, ok := T.Underlying().(*types.Interface)
        -		if !ok {
        -			return false
        -		}
        -
        -		return types.Implements(V, tIface)
        -	}
        -
        -	subsumesAny := func(Ts, Vs []types.Type) (types.Type, types.Type, bool) {
        -		for _, T := range Ts {
        -			for _, V := range Vs {
        -				if subsumes(T, V) {
        -					return T, V, true
        -				}
        -			}
        -		}
        -
        -		return nil, nil, false
        -	}
        -
        -	fn := func(node ast.Node) {
        -		tsStmt := node.(*ast.TypeSwitchStmt)
        -
        -		type ccAndTypes struct {
        -			cc    *ast.CaseClause
        -			types []types.Type
        -		}
        -
        -		// All asserted types in the order of case clauses.
        -		ccs := make([]ccAndTypes, 0, len(tsStmt.Body.List))
        -		for _, stmt := range tsStmt.Body.List {
        -			cc, _ := stmt.(*ast.CaseClause)
        -
        -			// Exclude the 'default' case.
        -			if len(cc.List) == 0 {
        -				continue
        -			}
        -
        -			Ts := make([]types.Type, len(cc.List))
        -			for i, expr := range cc.List {
        -				Ts[i] = pass.TypesInfo.TypeOf(expr)
        -			}
        -
        -			ccs = append(ccs, ccAndTypes{cc: cc, types: Ts})
        -		}
        -
        -		if len(ccs) <= 1 {
        -			// Zero or one case clauses, nothing to check.
        -			return
        -		}
        -
        -		// Check if case clauses following cc have types that are subsumed by cc.
        -		for i, cc := range ccs[:len(ccs)-1] {
        -			for _, next := range ccs[i+1:] {
        -				if T, V, yes := subsumesAny(cc.types, next.types); yes {
        -					ReportNodef(pass, next.cc, "unreachable case clause: %s will always match before %s", T.String(), V.String())
        -				}
        -			}
        -		}
        -	}
        -
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.TypeSwitchStmt)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func CheckSingleArgAppend(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		if !IsCallToAST(pass, node, "append") {
        -			return
        -		}
        -		call := node.(*ast.CallExpr)
        -		if len(call.Args) != 1 {
        -			return
        -		}
        -		ReportfFG(pass, call.Pos(), "x = append(y) is equivalent to x = y")
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func CheckStructTags(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		for _, field := range node.(*ast.StructType).Fields.List {
        -			if field.Tag == nil {
        -				continue
        -			}
        -			tags, err := parseStructTag(field.Tag.Value[1 : len(field.Tag.Value)-1])
        -			if err != nil {
        -				ReportNodef(pass, field.Tag, "unparseable struct tag: %s", err)
        -				continue
        -			}
        -			for k, v := range tags {
        -				if len(v) > 1 {
        -					ReportNodef(pass, field.Tag, "duplicate struct tag %q", k)
        -					continue
        -				}
        -
        -				switch k {
        -				case "json":
        -					checkJSONTag(pass, field, v[0])
        -				case "xml":
        -					checkXMLTag(pass, field, v[0])
        -				}
        -			}
        -		}
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.StructType)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func checkJSONTag(pass *analysis.Pass, field *ast.Field, tag string) {
        -	//lint:ignore SA9003 TODO(dh): should we flag empty tags?
        -	if len(tag) == 0 {
        -	}
        -	fields := strings.Split(tag, ",")
        -	for _, r := range fields[0] {
        -		if !unicode.IsLetter(r) && !unicode.IsDigit(r) && !strings.ContainsRune("!#$%&()*+-./:<=>?@[]^_{|}~ ", r) {
        -			ReportNodef(pass, field.Tag, "invalid JSON field name %q", fields[0])
        -		}
        -	}
        -	var co, cs, ci int
        -	for _, s := range fields[1:] {
        -		switch s {
        -		case "omitempty":
        -			co++
        -		case "":
        -			// allow stuff like "-,"
        -		case "string":
        -			cs++
        -			// only for string, floating point, integer and bool
        -			T := Dereference(pass.TypesInfo.TypeOf(field.Type).Underlying()).Underlying()
        -			basic, ok := T.(*types.Basic)
        -			if !ok || (basic.Info()&(types.IsBoolean|types.IsInteger|types.IsFloat|types.IsString)) == 0 {
        -				ReportNodef(pass, field.Tag, "the JSON string option only applies to fields of type string, floating point, integer or bool, or pointers to those")
        -			}
        -		case "inline":
        -			ci++
        -		default:
        -			ReportNodef(pass, field.Tag, "unknown JSON option %q", s)
        -		}
        -	}
        -	if co > 1 {
        -		ReportNodef(pass, field.Tag, `duplicate JSON option "omitempty"`)
        -	}
        -	if cs > 1 {
        -		ReportNodef(pass, field.Tag, `duplicate JSON option "string"`)
        -	}
        -	if ci > 1 {
        -		ReportNodef(pass, field.Tag, `duplicate JSON option "inline"`)
        -	}
        -}
        -
        -func checkXMLTag(pass *analysis.Pass, field *ast.Field, tag string) {
        -	//lint:ignore SA9003 TODO(dh): should we flag empty tags?
        -	if len(tag) == 0 {
        -	}
        -	fields := strings.Split(tag, ",")
        -	counts := map[string]int{}
        -	var exclusives []string
        -	for _, s := range fields[1:] {
        -		switch s {
        -		case "attr", "chardata", "cdata", "innerxml", "comment":
        -			counts[s]++
        -			if counts[s] == 1 {
        -				exclusives = append(exclusives, s)
        -			}
        -		case "omitempty", "any":
        -			counts[s]++
        -		case "":
        -		default:
        -			ReportNodef(pass, field.Tag, "unknown XML option %q", s)
        -		}
        -	}
        -	for k, v := range counts {
        -		if v > 1 {
        -			ReportNodef(pass, field.Tag, "duplicate XML option %q", k)
        -		}
        -	}
        -	if len(exclusives) > 1 {
        -		ReportNodef(pass, field.Tag, "XML options %s are mutually exclusive", strings.Join(exclusives, " and "))
        -	}
        -}
        diff --git a/vendor/honnef.co/go/tools/staticcheck/rules.go b/vendor/honnef.co/go/tools/staticcheck/rules.go
        deleted file mode 100644
        index 0152cac1a..000000000
        --- a/vendor/honnef.co/go/tools/staticcheck/rules.go
        +++ /dev/null
        @@ -1,321 +0,0 @@
        -package staticcheck
        -
        -import (
        -	"fmt"
        -	"go/constant"
        -	"go/types"
        -	"net"
        -	"net/url"
        -	"regexp"
        -	"sort"
        -	"strconv"
        -	"strings"
        -	"time"
        -	"unicode/utf8"
        -
        -	"golang.org/x/tools/go/analysis"
        -	. "honnef.co/go/tools/lint/lintdsl"
        -	"honnef.co/go/tools/ssa"
        -	"honnef.co/go/tools/staticcheck/vrp"
        -)
        -
        -const (
        -	MsgInvalidHostPort = "invalid port or service name in host:port pair"
        -	MsgInvalidUTF8     = "argument is not a valid UTF-8 encoded string"
        -	MsgNonUniqueCutset = "cutset contains duplicate characters"
        -)
        -
        -type Call struct {
        -	Pass  *analysis.Pass
        -	Instr ssa.CallInstruction
        -	Args  []*Argument
        -
        -	Parent *ssa.Function
        -
        -	invalids []string
        -}
        -
        -func (c *Call) Invalid(msg string) {
        -	c.invalids = append(c.invalids, msg)
        -}
        -
        -type Argument struct {
        -	Value    Value
        -	invalids []string
        -}
        -
        -func (arg *Argument) Invalid(msg string) {
        -	arg.invalids = append(arg.invalids, msg)
        -}
        -
        -type Value struct {
        -	Value ssa.Value
        -	Range vrp.Range
        -}
        -
        -type CallCheck func(call *Call)
        -
        -func extractConsts(v ssa.Value) []*ssa.Const {
        -	switch v := v.(type) {
        -	case *ssa.Const:
        -		return []*ssa.Const{v}
        -	case *ssa.MakeInterface:
        -		return extractConsts(v.X)
        -	default:
        -		return nil
        -	}
        -}
        -
        -func ValidateRegexp(v Value) error {
        -	for _, c := range extractConsts(v.Value) {
        -		if c.Value == nil {
        -			continue
        -		}
        -		if c.Value.Kind() != constant.String {
        -			continue
        -		}
        -		s := constant.StringVal(c.Value)
        -		if _, err := regexp.Compile(s); err != nil {
        -			return err
        -		}
        -	}
        -	return nil
        -}
        -
        -func ValidateTimeLayout(v Value) error {
        -	for _, c := range extractConsts(v.Value) {
        -		if c.Value == nil {
        -			continue
        -		}
        -		if c.Value.Kind() != constant.String {
        -			continue
        -		}
        -		s := constant.StringVal(c.Value)
        -		s = strings.Replace(s, "_", " ", -1)
        -		s = strings.Replace(s, "Z", "-", -1)
        -		_, err := time.Parse(s, s)
        -		if err != nil {
        -			return err
        -		}
        -	}
        -	return nil
        -}
        -
        -func ValidateURL(v Value) error {
        -	for _, c := range extractConsts(v.Value) {
        -		if c.Value == nil {
        -			continue
        -		}
        -		if c.Value.Kind() != constant.String {
        -			continue
        -		}
        -		s := constant.StringVal(c.Value)
        -		_, err := url.Parse(s)
        -		if err != nil {
        -			return fmt.Errorf("%q is not a valid URL: %s", s, err)
        -		}
        -	}
        -	return nil
        -}
        -
        -func IntValue(v Value, z vrp.Z) bool {
        -	r, ok := v.Range.(vrp.IntInterval)
        -	if !ok || !r.IsKnown() {
        -		return false
        -	}
        -	if r.Lower != r.Upper {
        -		return false
        -	}
        -	if r.Lower.Cmp(z) == 0 {
        -		return true
        -	}
        -	return false
        -}
        -
        -func InvalidUTF8(v Value) bool {
        -	for _, c := range extractConsts(v.Value) {
        -		if c.Value == nil {
        -			continue
        -		}
        -		if c.Value.Kind() != constant.String {
        -			continue
        -		}
        -		s := constant.StringVal(c.Value)
        -		if !utf8.ValidString(s) {
        -			return true
        -		}
        -	}
        -	return false
        -}
        -
        -func UnbufferedChannel(v Value) bool {
        -	r, ok := v.Range.(vrp.ChannelInterval)
        -	if !ok || !r.IsKnown() {
        -		return false
        -	}
        -	if r.Size.Lower.Cmp(vrp.NewZ(0)) == 0 &&
        -		r.Size.Upper.Cmp(vrp.NewZ(0)) == 0 {
        -		return true
        -	}
        -	return false
        -}
        -
        -func Pointer(v Value) bool {
        -	switch v.Value.Type().Underlying().(type) {
        -	case *types.Pointer, *types.Interface:
        -		return true
        -	}
        -	return false
        -}
        -
        -func ConvertedFromInt(v Value) bool {
        -	conv, ok := v.Value.(*ssa.Convert)
        -	if !ok {
        -		return false
        -	}
        -	b, ok := conv.X.Type().Underlying().(*types.Basic)
        -	if !ok {
        -		return false
        -	}
        -	if (b.Info() & types.IsInteger) == 0 {
        -		return false
        -	}
        -	return true
        -}
        -
        -func validEncodingBinaryType(pass *analysis.Pass, typ types.Type) bool {
        -	typ = typ.Underlying()
        -	switch typ := typ.(type) {
        -	case *types.Basic:
        -		switch typ.Kind() {
        -		case types.Uint8, types.Uint16, types.Uint32, types.Uint64,
        -			types.Int8, types.Int16, types.Int32, types.Int64,
        -			types.Float32, types.Float64, types.Complex64, types.Complex128, types.Invalid:
        -			return true
        -		case types.Bool:
        -			return IsGoVersion(pass, 8)
        -		}
        -		return false
        -	case *types.Struct:
        -		n := typ.NumFields()
        -		for i := 0; i < n; i++ {
        -			if !validEncodingBinaryType(pass, typ.Field(i).Type()) {
        -				return false
        -			}
        -		}
        -		return true
        -	case *types.Array:
        -		return validEncodingBinaryType(pass, typ.Elem())
        -	case *types.Interface:
        -		// we can't determine if it's a valid type or not
        -		return true
        -	}
        -	return false
        -}
        -
        -func CanBinaryMarshal(pass *analysis.Pass, v Value) bool {
        -	typ := v.Value.Type().Underlying()
        -	if ttyp, ok := typ.(*types.Pointer); ok {
        -		typ = ttyp.Elem().Underlying()
        -	}
        -	if ttyp, ok := typ.(interface {
        -		Elem() types.Type
        -	}); ok {
        -		if _, ok := ttyp.(*types.Pointer); !ok {
        -			typ = ttyp.Elem()
        -		}
        -	}
        -
        -	return validEncodingBinaryType(pass, typ)
        -}
        -
        -func RepeatZeroTimes(name string, arg int) CallCheck {
        -	return func(call *Call) {
        -		arg := call.Args[arg]
        -		if IntValue(arg.Value, vrp.NewZ(0)) {
        -			arg.Invalid(fmt.Sprintf("calling %s with n == 0 will return no results, did you mean -1?", name))
        -		}
        -	}
        -}
        -
        -func validateServiceName(s string) bool {
        -	if len(s) < 1 || len(s) > 15 {
        -		return false
        -	}
        -	if s[0] == '-' || s[len(s)-1] == '-' {
        -		return false
        -	}
        -	if strings.Contains(s, "--") {
        -		return false
        -	}
        -	hasLetter := false
        -	for _, r := range s {
        -		if (r >= 'A' && r <= 'Z') || (r >= 'a' && r <= 'z') {
        -			hasLetter = true
        -			continue
        -		}
        -		if r >= '0' && r <= '9' {
        -			continue
        -		}
        -		return false
        -	}
        -	return hasLetter
        -}
        -
        -func validatePort(s string) bool {
        -	n, err := strconv.ParseInt(s, 10, 64)
        -	if err != nil {
        -		return validateServiceName(s)
        -	}
        -	return n >= 0 && n <= 65535
        -}
        -
        -func ValidHostPort(v Value) bool {
        -	for _, k := range extractConsts(v.Value) {
        -		if k.Value == nil {
        -			continue
        -		}
        -		if k.Value.Kind() != constant.String {
        -			continue
        -		}
        -		s := constant.StringVal(k.Value)
        -		_, port, err := net.SplitHostPort(s)
        -		if err != nil {
        -			return false
        -		}
        -		// TODO(dh): check hostname
        -		if !validatePort(port) {
        -			return false
        -		}
        -	}
        -	return true
        -}
        -
        -// ConvertedFrom reports whether value v was converted from type typ.
        -func ConvertedFrom(v Value, typ string) bool {
        -	change, ok := v.Value.(*ssa.ChangeType)
        -	return ok && IsType(change.X.Type(), typ)
        -}
        -
        -func UniqueStringCutset(v Value) bool {
        -	for _, c := range extractConsts(v.Value) {
        -		if c.Value == nil {
        -			continue
        -		}
        -		if c.Value.Kind() != constant.String {
        -			continue
        -		}
        -		s := constant.StringVal(c.Value)
        -		rs := runeSlice(s)
        -		if len(rs) < 2 {
        -			continue
        -		}
        -		sort.Sort(rs)
        -		for i, r := range rs[1:] {
        -			if rs[i] == r {
        -				return false
        -			}
        -		}
        -	}
        -	return true
        -}
        diff --git a/vendor/honnef.co/go/tools/staticcheck/structtag.go b/vendor/honnef.co/go/tools/staticcheck/structtag.go
        deleted file mode 100644
        index 38830a22c..000000000
        --- a/vendor/honnef.co/go/tools/staticcheck/structtag.go
        +++ /dev/null
        @@ -1,58 +0,0 @@
        -// Copyright 2009 The Go Authors. All rights reserved.
        -// Copyright 2019 Dominik Honnef. All rights reserved.
        -
        -package staticcheck
        -
        -import "strconv"
        -
        -func parseStructTag(tag string) (map[string][]string, error) {
        -	// FIXME(dh): detect missing closing quote
        -	out := map[string][]string{}
        -
        -	for tag != "" {
        -		// Skip leading space.
        -		i := 0
        -		for i < len(tag) && tag[i] == ' ' {
        -			i++
        -		}
        -		tag = tag[i:]
        -		if tag == "" {
        -			break
        -		}
        -
        -		// Scan to colon. A space, a quote or a control character is a syntax error.
        -		// Strictly speaking, control chars include the range [0x7f, 0x9f], not just
        -		// [0x00, 0x1f], but in practice, we ignore the multi-byte control characters
        -		// as it is simpler to inspect the tag's bytes than the tag's runes.
        -		i = 0
        -		for i < len(tag) && tag[i] > ' ' && tag[i] != ':' && tag[i] != '"' && tag[i] != 0x7f {
        -			i++
        -		}
        -		if i == 0 || i+1 >= len(tag) || tag[i] != ':' || tag[i+1] != '"' {
        -			break
        -		}
        -		name := string(tag[:i])
        -		tag = tag[i+1:]
        -
        -		// Scan quoted string to find value.
        -		i = 1
        -		for i < len(tag) && tag[i] != '"' {
        -			if tag[i] == '\\' {
        -				i++
        -			}
        -			i++
        -		}
        -		if i >= len(tag) {
        -			break
        -		}
        -		qvalue := string(tag[:i+1])
        -		tag = tag[i+1:]
        -
        -		value, err := strconv.Unquote(qvalue)
        -		if err != nil {
        -			return nil, err
        -		}
        -		out[name] = append(out[name], value)
        -	}
        -	return out, nil
        -}
        diff --git a/vendor/honnef.co/go/tools/staticcheck/vrp/channel.go b/vendor/honnef.co/go/tools/staticcheck/vrp/channel.go
        deleted file mode 100644
        index 0ef73787b..000000000
        --- a/vendor/honnef.co/go/tools/staticcheck/vrp/channel.go
        +++ /dev/null
        @@ -1,73 +0,0 @@
        -package vrp
        -
        -import (
        -	"fmt"
        -
        -	"honnef.co/go/tools/ssa"
        -)
        -
        -type ChannelInterval struct {
        -	Size IntInterval
        -}
        -
        -func (c ChannelInterval) Union(other Range) Range {
        -	i, ok := other.(ChannelInterval)
        -	if !ok {
        -		i = ChannelInterval{EmptyIntInterval}
        -	}
        -	if c.Size.Empty() || !c.Size.IsKnown() {
        -		return i
        -	}
        -	if i.Size.Empty() || !i.Size.IsKnown() {
        -		return c
        -	}
        -	return ChannelInterval{
        -		Size: c.Size.Union(i.Size).(IntInterval),
        -	}
        -}
        -
        -func (c ChannelInterval) String() string {
        -	return c.Size.String()
        -}
        -
        -func (c ChannelInterval) IsKnown() bool {
        -	return c.Size.IsKnown()
        -}
        -
        -type MakeChannelConstraint struct {
        -	aConstraint
        -	Buffer ssa.Value
        -}
        -type ChannelChangeTypeConstraint struct {
        -	aConstraint
        -	X ssa.Value
        -}
        -
        -func NewMakeChannelConstraint(buffer, y ssa.Value) Constraint {
        -	return &MakeChannelConstraint{NewConstraint(y), buffer}
        -}
        -func NewChannelChangeTypeConstraint(x, y ssa.Value) Constraint {
        -	return &ChannelChangeTypeConstraint{NewConstraint(y), x}
        -}
        -
        -func (c *MakeChannelConstraint) Operands() []ssa.Value       { return []ssa.Value{c.Buffer} }
        -func (c *ChannelChangeTypeConstraint) Operands() []ssa.Value { return []ssa.Value{c.X} }
        -
        -func (c *MakeChannelConstraint) String() string {
        -	return fmt.Sprintf("%s = make(chan, %s)", c.Y().Name(), c.Buffer.Name())
        -}
        -func (c *ChannelChangeTypeConstraint) String() string {
        -	return fmt.Sprintf("%s = changetype(%s)", c.Y().Name(), c.X.Name())
        -}
        -
        -func (c *MakeChannelConstraint) Eval(g *Graph) Range {
        -	i, ok := g.Range(c.Buffer).(IntInterval)
        -	if !ok {
        -		return ChannelInterval{NewIntInterval(NewZ(0), PInfinity)}
        -	}
        -	if i.Lower.Sign() == -1 {
        -		i.Lower = NewZ(0)
        -	}
        -	return ChannelInterval{i}
        -}
        -func (c *ChannelChangeTypeConstraint) Eval(g *Graph) Range { return g.Range(c.X) }
        diff --git a/vendor/honnef.co/go/tools/staticcheck/vrp/int.go b/vendor/honnef.co/go/tools/staticcheck/vrp/int.go
        deleted file mode 100644
        index 926bb7af3..000000000
        --- a/vendor/honnef.co/go/tools/staticcheck/vrp/int.go
        +++ /dev/null
        @@ -1,476 +0,0 @@
        -package vrp
        -
        -import (
        -	"fmt"
        -	"go/token"
        -	"go/types"
        -	"math/big"
        -
        -	"honnef.co/go/tools/ssa"
        -)
        -
        -type Zs []Z
        -
        -func (zs Zs) Len() int {
        -	return len(zs)
        -}
        -
        -func (zs Zs) Less(i int, j int) bool {
        -	return zs[i].Cmp(zs[j]) == -1
        -}
        -
        -func (zs Zs) Swap(i int, j int) {
        -	zs[i], zs[j] = zs[j], zs[i]
        -}
        -
        -type Z struct {
        -	infinity int8
        -	integer  *big.Int
        -}
        -
        -func NewZ(n int64) Z {
        -	return NewBigZ(big.NewInt(n))
        -}
        -
        -func NewBigZ(n *big.Int) Z {
        -	return Z{integer: n}
        -}
        -
        -func (z1 Z) Infinite() bool {
        -	return z1.infinity != 0
        -}
        -
        -func (z1 Z) Add(z2 Z) Z {
        -	if z2.Sign() == -1 {
        -		return z1.Sub(z2.Negate())
        -	}
        -	if z1 == NInfinity {
        -		return NInfinity
        -	}
        -	if z1 == PInfinity {
        -		return PInfinity
        -	}
        -	if z2 == PInfinity {
        -		return PInfinity
        -	}
        -
        -	if !z1.Infinite() && !z2.Infinite() {
        -		n := &big.Int{}
        -		n.Add(z1.integer, z2.integer)
        -		return NewBigZ(n)
        -	}
        -
        -	panic(fmt.Sprintf("%s + %s is not defined", z1, z2))
        -}
        -
        -func (z1 Z) Sub(z2 Z) Z {
        -	if z2.Sign() == -1 {
        -		return z1.Add(z2.Negate())
        -	}
        -	if !z1.Infinite() && !z2.Infinite() {
        -		n := &big.Int{}
        -		n.Sub(z1.integer, z2.integer)
        -		return NewBigZ(n)
        -	}
        -
        -	if z1 != PInfinity && z2 == PInfinity {
        -		return NInfinity
        -	}
        -	if z1.Infinite() && !z2.Infinite() {
        -		return Z{infinity: z1.infinity}
        -	}
        -	if z1 == PInfinity && z2 == PInfinity {
        -		return PInfinity
        -	}
        -	panic(fmt.Sprintf("%s - %s is not defined", z1, z2))
        -}
        -
        -func (z1 Z) Mul(z2 Z) Z {
        -	if (z1.integer != nil && z1.integer.Sign() == 0) ||
        -		(z2.integer != nil && z2.integer.Sign() == 0) {
        -		return NewBigZ(&big.Int{})
        -	}
        -
        -	if z1.infinity != 0 || z2.infinity != 0 {
        -		return Z{infinity: int8(z1.Sign() * z2.Sign())}
        -	}
        -
        -	n := &big.Int{}
        -	n.Mul(z1.integer, z2.integer)
        -	return NewBigZ(n)
        -}
        -
        -func (z1 Z) Negate() Z {
        -	if z1.infinity == 1 {
        -		return NInfinity
        -	}
        -	if z1.infinity == -1 {
        -		return PInfinity
        -	}
        -	n := &big.Int{}
        -	n.Neg(z1.integer)
        -	return NewBigZ(n)
        -}
        -
        -func (z1 Z) Sign() int {
        -	if z1.infinity != 0 {
        -		return int(z1.infinity)
        -	}
        -	return z1.integer.Sign()
        -}
        -
        -func (z1 Z) String() string {
        -	if z1 == NInfinity {
        -		return "-∞"
        -	}
        -	if z1 == PInfinity {
        -		return "∞"
        -	}
        -	return fmt.Sprintf("%d", z1.integer)
        -}
        -
        -func (z1 Z) Cmp(z2 Z) int {
        -	if z1.infinity == z2.infinity && z1.infinity != 0 {
        -		return 0
        -	}
        -	if z1 == PInfinity {
        -		return 1
        -	}
        -	if z1 == NInfinity {
        -		return -1
        -	}
        -	if z2 == NInfinity {
        -		return 1
        -	}
        -	if z2 == PInfinity {
        -		return -1
        -	}
        -	return z1.integer.Cmp(z2.integer)
        -}
        -
        -func MaxZ(zs ...Z) Z {
        -	if len(zs) == 0 {
        -		panic("Max called with no arguments")
        -	}
        -	if len(zs) == 1 {
        -		return zs[0]
        -	}
        -	ret := zs[0]
        -	for _, z := range zs[1:] {
        -		if z.Cmp(ret) == 1 {
        -			ret = z
        -		}
        -	}
        -	return ret
        -}
        -
        -func MinZ(zs ...Z) Z {
        -	if len(zs) == 0 {
        -		panic("Min called with no arguments")
        -	}
        -	if len(zs) == 1 {
        -		return zs[0]
        -	}
        -	ret := zs[0]
        -	for _, z := range zs[1:] {
        -		if z.Cmp(ret) == -1 {
        -			ret = z
        -		}
        -	}
        -	return ret
        -}
        -
        -var NInfinity = Z{infinity: -1}
        -var PInfinity = Z{infinity: 1}
        -var EmptyIntInterval = IntInterval{true, PInfinity, NInfinity}
        -
        -func InfinityFor(v ssa.Value) IntInterval {
        -	if b, ok := v.Type().Underlying().(*types.Basic); ok {
        -		if (b.Info() & types.IsUnsigned) != 0 {
        -			return NewIntInterval(NewZ(0), PInfinity)
        -		}
        -	}
        -	return NewIntInterval(NInfinity, PInfinity)
        -}
        -
        -type IntInterval struct {
        -	known bool
        -	Lower Z
        -	Upper Z
        -}
        -
        -func NewIntInterval(l, u Z) IntInterval {
        -	if u.Cmp(l) == -1 {
        -		return EmptyIntInterval
        -	}
        -	return IntInterval{known: true, Lower: l, Upper: u}
        -}
        -
        -func (i IntInterval) IsKnown() bool {
        -	return i.known
        -}
        -
        -func (i IntInterval) Empty() bool {
        -	return i.Lower == PInfinity && i.Upper == NInfinity
        -}
        -
        -func (i IntInterval) IsMaxRange() bool {
        -	return i.Lower == NInfinity && i.Upper == PInfinity
        -}
        -
        -func (i1 IntInterval) Intersection(i2 IntInterval) IntInterval {
        -	if !i1.IsKnown() {
        -		return i2
        -	}
        -	if !i2.IsKnown() {
        -		return i1
        -	}
        -	if i1.Empty() || i2.Empty() {
        -		return EmptyIntInterval
        -	}
        -	i3 := NewIntInterval(MaxZ(i1.Lower, i2.Lower), MinZ(i1.Upper, i2.Upper))
        -	if i3.Lower.Cmp(i3.Upper) == 1 {
        -		return EmptyIntInterval
        -	}
        -	return i3
        -}
        -
        -func (i1 IntInterval) Union(other Range) Range {
        -	i2, ok := other.(IntInterval)
        -	if !ok {
        -		i2 = EmptyIntInterval
        -	}
        -	if i1.Empty() || !i1.IsKnown() {
        -		return i2
        -	}
        -	if i2.Empty() || !i2.IsKnown() {
        -		return i1
        -	}
        -	return NewIntInterval(MinZ(i1.Lower, i2.Lower), MaxZ(i1.Upper, i2.Upper))
        -}
        -
        -func (i1 IntInterval) Add(i2 IntInterval) IntInterval {
        -	if i1.Empty() || i2.Empty() {
        -		return EmptyIntInterval
        -	}
        -	l1, u1, l2, u2 := i1.Lower, i1.Upper, i2.Lower, i2.Upper
        -	return NewIntInterval(l1.Add(l2), u1.Add(u2))
        -}
        -
        -func (i1 IntInterval) Sub(i2 IntInterval) IntInterval {
        -	if i1.Empty() || i2.Empty() {
        -		return EmptyIntInterval
        -	}
        -	l1, u1, l2, u2 := i1.Lower, i1.Upper, i2.Lower, i2.Upper
        -	return NewIntInterval(l1.Sub(u2), u1.Sub(l2))
        -}
        -
        -func (i1 IntInterval) Mul(i2 IntInterval) IntInterval {
        -	if i1.Empty() || i2.Empty() {
        -		return EmptyIntInterval
        -	}
        -	x1, x2 := i1.Lower, i1.Upper
        -	y1, y2 := i2.Lower, i2.Upper
        -	return NewIntInterval(
        -		MinZ(x1.Mul(y1), x1.Mul(y2), x2.Mul(y1), x2.Mul(y2)),
        -		MaxZ(x1.Mul(y1), x1.Mul(y2), x2.Mul(y1), x2.Mul(y2)),
        -	)
        -}
        -
        -func (i1 IntInterval) String() string {
        -	if !i1.IsKnown() {
        -		return "[⊥, ⊥]"
        -	}
        -	if i1.Empty() {
        -		return "{}"
        -	}
        -	return fmt.Sprintf("[%s, %s]", i1.Lower, i1.Upper)
        -}
        -
        -type IntArithmeticConstraint struct {
        -	aConstraint
        -	A  ssa.Value
        -	B  ssa.Value
        -	Op token.Token
        -	Fn func(IntInterval, IntInterval) IntInterval
        -}
        -
        -type IntAddConstraint struct{ *IntArithmeticConstraint }
        -type IntSubConstraint struct{ *IntArithmeticConstraint }
        -type IntMulConstraint struct{ *IntArithmeticConstraint }
        -
        -type IntConversionConstraint struct {
        -	aConstraint
        -	X ssa.Value
        -}
        -
        -type IntIntersectionConstraint struct {
        -	aConstraint
        -	ranges   Ranges
        -	A        ssa.Value
        -	B        ssa.Value
        -	Op       token.Token
        -	I        IntInterval
        -	resolved bool
        -}
        -
        -type IntIntervalConstraint struct {
        -	aConstraint
        -	I IntInterval
        -}
        -
        -func NewIntArithmeticConstraint(a, b, y ssa.Value, op token.Token, fn func(IntInterval, IntInterval) IntInterval) *IntArithmeticConstraint {
        -	return &IntArithmeticConstraint{NewConstraint(y), a, b, op, fn}
        -}
        -func NewIntAddConstraint(a, b, y ssa.Value) Constraint {
        -	return &IntAddConstraint{NewIntArithmeticConstraint(a, b, y, token.ADD, IntInterval.Add)}
        -}
        -func NewIntSubConstraint(a, b, y ssa.Value) Constraint {
        -	return &IntSubConstraint{NewIntArithmeticConstraint(a, b, y, token.SUB, IntInterval.Sub)}
        -}
        -func NewIntMulConstraint(a, b, y ssa.Value) Constraint {
        -	return &IntMulConstraint{NewIntArithmeticConstraint(a, b, y, token.MUL, IntInterval.Mul)}
        -}
        -func NewIntConversionConstraint(x, y ssa.Value) Constraint {
        -	return &IntConversionConstraint{NewConstraint(y), x}
        -}
        -func NewIntIntersectionConstraint(a, b ssa.Value, op token.Token, ranges Ranges, y ssa.Value) Constraint {
        -	return &IntIntersectionConstraint{
        -		aConstraint: NewConstraint(y),
        -		ranges:      ranges,
        -		A:           a,
        -		B:           b,
        -		Op:          op,
        -	}
        -}
        -func NewIntIntervalConstraint(i IntInterval, y ssa.Value) Constraint {
        -	return &IntIntervalConstraint{NewConstraint(y), i}
        -}
        -
        -func (c *IntArithmeticConstraint) Operands() []ssa.Value   { return []ssa.Value{c.A, c.B} }
        -func (c *IntConversionConstraint) Operands() []ssa.Value   { return []ssa.Value{c.X} }
        -func (c *IntIntersectionConstraint) Operands() []ssa.Value { return []ssa.Value{c.A} }
        -func (s *IntIntervalConstraint) Operands() []ssa.Value     { return nil }
        -
        -func (c *IntArithmeticConstraint) String() string {
        -	return fmt.Sprintf("%s = %s %s %s", c.Y().Name(), c.A.Name(), c.Op, c.B.Name())
        -}
        -func (c *IntConversionConstraint) String() string {
        -	return fmt.Sprintf("%s = %s(%s)", c.Y().Name(), c.Y().Type(), c.X.Name())
        -}
        -func (c *IntIntersectionConstraint) String() string {
        -	return fmt.Sprintf("%s = %s %s %s (%t branch)", c.Y().Name(), c.A.Name(), c.Op, c.B.Name(), c.Y().(*ssa.Sigma).Branch)
        -}
        -func (c *IntIntervalConstraint) String() string { return fmt.Sprintf("%s = %s", c.Y().Name(), c.I) }
        -
        -func (c *IntArithmeticConstraint) Eval(g *Graph) Range {
        -	i1, i2 := g.Range(c.A).(IntInterval), g.Range(c.B).(IntInterval)
        -	if !i1.IsKnown() || !i2.IsKnown() {
        -		return IntInterval{}
        -	}
        -	return c.Fn(i1, i2)
        -}
        -func (c *IntConversionConstraint) Eval(g *Graph) Range {
        -	s := &types.StdSizes{
        -		// XXX is it okay to assume the largest word size, or do we
        -		// need to be platform specific?
        -		WordSize: 8,
        -		MaxAlign: 1,
        -	}
        -	fromI := g.Range(c.X).(IntInterval)
        -	toI := g.Range(c.Y()).(IntInterval)
        -	fromT := c.X.Type().Underlying().(*types.Basic)
        -	toT := c.Y().Type().Underlying().(*types.Basic)
        -	fromB := s.Sizeof(c.X.Type())
        -	toB := s.Sizeof(c.Y().Type())
        -
        -	if !fromI.IsKnown() {
        -		return toI
        -	}
        -	if !toI.IsKnown() {
        -		return fromI
        -	}
        -
        -	// uint -> sint/uint, M > N: [max(0, l1), min(2**N-1, u2)]
        -	if (fromT.Info()&types.IsUnsigned != 0) &&
        -		toB > fromB {
        -
        -		n := big.NewInt(1)
        -		n.Lsh(n, uint(fromB*8))
        -		n.Sub(n, big.NewInt(1))
        -		return NewIntInterval(
        -			MaxZ(NewZ(0), fromI.Lower),
        -			MinZ(NewBigZ(n), toI.Upper),
        -		)
        -	}
        -
        -	// sint -> sint, M > N; [max(-∞, l1), min(2**N-1, u2)]
        -	if (fromT.Info()&types.IsUnsigned == 0) &&
        -		(toT.Info()&types.IsUnsigned == 0) &&
        -		toB > fromB {
        -
        -		n := big.NewInt(1)
        -		n.Lsh(n, uint(fromB*8))
        -		n.Sub(n, big.NewInt(1))
        -		return NewIntInterval(
        -			MaxZ(NInfinity, fromI.Lower),
        -			MinZ(NewBigZ(n), toI.Upper),
        -		)
        -	}
        -
        -	return fromI
        -}
        -func (c *IntIntersectionConstraint) Eval(g *Graph) Range {
        -	xi := g.Range(c.A).(IntInterval)
        -	if !xi.IsKnown() {
        -		return c.I
        -	}
        -	return xi.Intersection(c.I)
        -}
        -func (c *IntIntervalConstraint) Eval(*Graph) Range { return c.I }
        -
        -func (c *IntIntersectionConstraint) Futures() []ssa.Value {
        -	return []ssa.Value{c.B}
        -}
        -
        -func (c *IntIntersectionConstraint) Resolve() {
        -	r, ok := c.ranges[c.B].(IntInterval)
        -	if !ok {
        -		c.I = InfinityFor(c.Y())
        -		return
        -	}
        -
        -	switch c.Op {
        -	case token.EQL:
        -		c.I = r
        -	case token.GTR:
        -		c.I = NewIntInterval(r.Lower.Add(NewZ(1)), PInfinity)
        -	case token.GEQ:
        -		c.I = NewIntInterval(r.Lower, PInfinity)
        -	case token.LSS:
        -		// TODO(dh): do we need 0 instead of NInfinity for uints?
        -		c.I = NewIntInterval(NInfinity, r.Upper.Sub(NewZ(1)))
        -	case token.LEQ:
        -		c.I = NewIntInterval(NInfinity, r.Upper)
        -	case token.NEQ:
        -		c.I = InfinityFor(c.Y())
        -	default:
        -		panic("unsupported op " + c.Op.String())
        -	}
        -}
        -
        -func (c *IntIntersectionConstraint) IsKnown() bool {
        -	return c.I.IsKnown()
        -}
        -
        -func (c *IntIntersectionConstraint) MarkUnresolved() {
        -	c.resolved = false
        -}
        -
        -func (c *IntIntersectionConstraint) MarkResolved() {
        -	c.resolved = true
        -}
        -
        -func (c *IntIntersectionConstraint) IsResolved() bool {
        -	return c.resolved
        -}
        diff --git a/vendor/honnef.co/go/tools/staticcheck/vrp/slice.go b/vendor/honnef.co/go/tools/staticcheck/vrp/slice.go
        deleted file mode 100644
        index 40658dd8d..000000000
        --- a/vendor/honnef.co/go/tools/staticcheck/vrp/slice.go
        +++ /dev/null
        @@ -1,273 +0,0 @@
        -package vrp
        -
        -// TODO(dh): most of the constraints have implementations identical to
        -// that of strings. Consider reusing them.
        -
        -import (
        -	"fmt"
        -	"go/types"
        -
        -	"honnef.co/go/tools/ssa"
        -)
        -
        -type SliceInterval struct {
        -	Length IntInterval
        -}
        -
        -func (s SliceInterval) Union(other Range) Range {
        -	i, ok := other.(SliceInterval)
        -	if !ok {
        -		i = SliceInterval{EmptyIntInterval}
        -	}
        -	if s.Length.Empty() || !s.Length.IsKnown() {
        -		return i
        -	}
        -	if i.Length.Empty() || !i.Length.IsKnown() {
        -		return s
        -	}
        -	return SliceInterval{
        -		Length: s.Length.Union(i.Length).(IntInterval),
        -	}
        -}
        -func (s SliceInterval) String() string { return s.Length.String() }
        -func (s SliceInterval) IsKnown() bool  { return s.Length.IsKnown() }
        -
        -type SliceAppendConstraint struct {
        -	aConstraint
        -	A ssa.Value
        -	B ssa.Value
        -}
        -
        -type SliceSliceConstraint struct {
        -	aConstraint
        -	X     ssa.Value
        -	Lower ssa.Value
        -	Upper ssa.Value
        -}
        -
        -type ArraySliceConstraint struct {
        -	aConstraint
        -	X     ssa.Value
        -	Lower ssa.Value
        -	Upper ssa.Value
        -}
        -
        -type SliceIntersectionConstraint struct {
        -	aConstraint
        -	X ssa.Value
        -	I IntInterval
        -}
        -
        -type SliceLengthConstraint struct {
        -	aConstraint
        -	X ssa.Value
        -}
        -
        -type MakeSliceConstraint struct {
        -	aConstraint
        -	Size ssa.Value
        -}
        -
        -type SliceIntervalConstraint struct {
        -	aConstraint
        -	I IntInterval
        -}
        -
        -func NewSliceAppendConstraint(a, b, y ssa.Value) Constraint {
        -	return &SliceAppendConstraint{NewConstraint(y), a, b}
        -}
        -func NewSliceSliceConstraint(x, lower, upper, y ssa.Value) Constraint {
        -	return &SliceSliceConstraint{NewConstraint(y), x, lower, upper}
        -}
        -func NewArraySliceConstraint(x, lower, upper, y ssa.Value) Constraint {
        -	return &ArraySliceConstraint{NewConstraint(y), x, lower, upper}
        -}
        -func NewSliceIntersectionConstraint(x ssa.Value, i IntInterval, y ssa.Value) Constraint {
        -	return &SliceIntersectionConstraint{NewConstraint(y), x, i}
        -}
        -func NewSliceLengthConstraint(x, y ssa.Value) Constraint {
        -	return &SliceLengthConstraint{NewConstraint(y), x}
        -}
        -func NewMakeSliceConstraint(size, y ssa.Value) Constraint {
        -	return &MakeSliceConstraint{NewConstraint(y), size}
        -}
        -func NewSliceIntervalConstraint(i IntInterval, y ssa.Value) Constraint {
        -	return &SliceIntervalConstraint{NewConstraint(y), i}
        -}
        -
        -func (c *SliceAppendConstraint) Operands() []ssa.Value { return []ssa.Value{c.A, c.B} }
        -func (c *SliceSliceConstraint) Operands() []ssa.Value {
        -	ops := []ssa.Value{c.X}
        -	if c.Lower != nil {
        -		ops = append(ops, c.Lower)
        -	}
        -	if c.Upper != nil {
        -		ops = append(ops, c.Upper)
        -	}
        -	return ops
        -}
        -func (c *ArraySliceConstraint) Operands() []ssa.Value {
        -	ops := []ssa.Value{c.X}
        -	if c.Lower != nil {
        -		ops = append(ops, c.Lower)
        -	}
        -	if c.Upper != nil {
        -		ops = append(ops, c.Upper)
        -	}
        -	return ops
        -}
        -func (c *SliceIntersectionConstraint) Operands() []ssa.Value { return []ssa.Value{c.X} }
        -func (c *SliceLengthConstraint) Operands() []ssa.Value       { return []ssa.Value{c.X} }
        -func (c *MakeSliceConstraint) Operands() []ssa.Value         { return []ssa.Value{c.Size} }
        -func (s *SliceIntervalConstraint) Operands() []ssa.Value     { return nil }
        -
        -func (c *SliceAppendConstraint) String() string {
        -	return fmt.Sprintf("%s = append(%s, %s)", c.Y().Name(), c.A.Name(), c.B.Name())
        -}
        -func (c *SliceSliceConstraint) String() string {
        -	var lname, uname string
        -	if c.Lower != nil {
        -		lname = c.Lower.Name()
        -	}
        -	if c.Upper != nil {
        -		uname = c.Upper.Name()
        -	}
        -	return fmt.Sprintf("%s[%s:%s]", c.X.Name(), lname, uname)
        -}
        -func (c *ArraySliceConstraint) String() string {
        -	var lname, uname string
        -	if c.Lower != nil {
        -		lname = c.Lower.Name()
        -	}
        -	if c.Upper != nil {
        -		uname = c.Upper.Name()
        -	}
        -	return fmt.Sprintf("%s[%s:%s]", c.X.Name(), lname, uname)
        -}
        -func (c *SliceIntersectionConstraint) String() string {
        -	return fmt.Sprintf("%s = %s.%t ⊓ %s", c.Y().Name(), c.X.Name(), c.Y().(*ssa.Sigma).Branch, c.I)
        -}
        -func (c *SliceLengthConstraint) String() string {
        -	return fmt.Sprintf("%s = len(%s)", c.Y().Name(), c.X.Name())
        -}
        -func (c *MakeSliceConstraint) String() string {
        -	return fmt.Sprintf("%s = make(slice, %s)", c.Y().Name(), c.Size.Name())
        -}
        -func (c *SliceIntervalConstraint) String() string { return fmt.Sprintf("%s = %s", c.Y().Name(), c.I) }
        -
        -func (c *SliceAppendConstraint) Eval(g *Graph) Range {
        -	l1 := g.Range(c.A).(SliceInterval).Length
        -	var l2 IntInterval
        -	switch r := g.Range(c.B).(type) {
        -	case SliceInterval:
        -		l2 = r.Length
        -	case StringInterval:
        -		l2 = r.Length
        -	default:
        -		return SliceInterval{}
        -	}
        -	if !l1.IsKnown() || !l2.IsKnown() {
        -		return SliceInterval{}
        -	}
        -	return SliceInterval{
        -		Length: l1.Add(l2),
        -	}
        -}
        -func (c *SliceSliceConstraint) Eval(g *Graph) Range {
        -	lr := NewIntInterval(NewZ(0), NewZ(0))
        -	if c.Lower != nil {
        -		lr = g.Range(c.Lower).(IntInterval)
        -	}
        -	ur := g.Range(c.X).(SliceInterval).Length
        -	if c.Upper != nil {
        -		ur = g.Range(c.Upper).(IntInterval)
        -	}
        -	if !lr.IsKnown() || !ur.IsKnown() {
        -		return SliceInterval{}
        -	}
        -
        -	ls := []Z{
        -		ur.Lower.Sub(lr.Lower),
        -		ur.Upper.Sub(lr.Lower),
        -		ur.Lower.Sub(lr.Upper),
        -		ur.Upper.Sub(lr.Upper),
        -	}
        -	// TODO(dh): if we don't truncate lengths to 0 we might be able to
        -	// easily detect slices with high < low. we'd need to treat -∞
        -	// specially, though.
        -	for i, l := range ls {
        -		if l.Sign() == -1 {
        -			ls[i] = NewZ(0)
        -		}
        -	}
        -
        -	return SliceInterval{
        -		Length: NewIntInterval(MinZ(ls...), MaxZ(ls...)),
        -	}
        -}
        -func (c *ArraySliceConstraint) Eval(g *Graph) Range {
        -	lr := NewIntInterval(NewZ(0), NewZ(0))
        -	if c.Lower != nil {
        -		lr = g.Range(c.Lower).(IntInterval)
        -	}
        -	var l int64
        -	switch typ := c.X.Type().(type) {
        -	case *types.Array:
        -		l = typ.Len()
        -	case *types.Pointer:
        -		l = typ.Elem().(*types.Array).Len()
        -	}
        -	ur := NewIntInterval(NewZ(l), NewZ(l))
        -	if c.Upper != nil {
        -		ur = g.Range(c.Upper).(IntInterval)
        -	}
        -	if !lr.IsKnown() || !ur.IsKnown() {
        -		return SliceInterval{}
        -	}
        -
        -	ls := []Z{
        -		ur.Lower.Sub(lr.Lower),
        -		ur.Upper.Sub(lr.Lower),
        -		ur.Lower.Sub(lr.Upper),
        -		ur.Upper.Sub(lr.Upper),
        -	}
        -	// TODO(dh): if we don't truncate lengths to 0 we might be able to
        -	// easily detect slices with high < low. we'd need to treat -∞
        -	// specially, though.
        -	for i, l := range ls {
        -		if l.Sign() == -1 {
        -			ls[i] = NewZ(0)
        -		}
        -	}
        -
        -	return SliceInterval{
        -		Length: NewIntInterval(MinZ(ls...), MaxZ(ls...)),
        -	}
        -}
        -func (c *SliceIntersectionConstraint) Eval(g *Graph) Range {
        -	xi := g.Range(c.X).(SliceInterval)
        -	if !xi.IsKnown() {
        -		return c.I
        -	}
        -	return SliceInterval{
        -		Length: xi.Length.Intersection(c.I),
        -	}
        -}
        -func (c *SliceLengthConstraint) Eval(g *Graph) Range {
        -	i := g.Range(c.X).(SliceInterval).Length
        -	if !i.IsKnown() {
        -		return NewIntInterval(NewZ(0), PInfinity)
        -	}
        -	return i
        -}
        -func (c *MakeSliceConstraint) Eval(g *Graph) Range {
        -	i, ok := g.Range(c.Size).(IntInterval)
        -	if !ok {
        -		return SliceInterval{NewIntInterval(NewZ(0), PInfinity)}
        -	}
        -	if i.Lower.Sign() == -1 {
        -		i.Lower = NewZ(0)
        -	}
        -	return SliceInterval{i}
        -}
        -func (c *SliceIntervalConstraint) Eval(*Graph) Range { return SliceInterval{c.I} }
        diff --git a/vendor/honnef.co/go/tools/staticcheck/vrp/string.go b/vendor/honnef.co/go/tools/staticcheck/vrp/string.go
        deleted file mode 100644
        index e05877f9f..000000000
        --- a/vendor/honnef.co/go/tools/staticcheck/vrp/string.go
        +++ /dev/null
        @@ -1,258 +0,0 @@
        -package vrp
        -
        -import (
        -	"fmt"
        -	"go/token"
        -	"go/types"
        -
        -	"honnef.co/go/tools/ssa"
        -)
        -
        -type StringInterval struct {
        -	Length IntInterval
        -}
        -
        -func (s StringInterval) Union(other Range) Range {
        -	i, ok := other.(StringInterval)
        -	if !ok {
        -		i = StringInterval{EmptyIntInterval}
        -	}
        -	if s.Length.Empty() || !s.Length.IsKnown() {
        -		return i
        -	}
        -	if i.Length.Empty() || !i.Length.IsKnown() {
        -		return s
        -	}
        -	return StringInterval{
        -		Length: s.Length.Union(i.Length).(IntInterval),
        -	}
        -}
        -
        -func (s StringInterval) String() string {
        -	return s.Length.String()
        -}
        -
        -func (s StringInterval) IsKnown() bool {
        -	return s.Length.IsKnown()
        -}
        -
        -type StringSliceConstraint struct {
        -	aConstraint
        -	X     ssa.Value
        -	Lower ssa.Value
        -	Upper ssa.Value
        -}
        -
        -type StringIntersectionConstraint struct {
        -	aConstraint
        -	ranges   Ranges
        -	A        ssa.Value
        -	B        ssa.Value
        -	Op       token.Token
        -	I        IntInterval
        -	resolved bool
        -}
        -
        -type StringConcatConstraint struct {
        -	aConstraint
        -	A ssa.Value
        -	B ssa.Value
        -}
        -
        -type StringLengthConstraint struct {
        -	aConstraint
        -	X ssa.Value
        -}
        -
        -type StringIntervalConstraint struct {
        -	aConstraint
        -	I IntInterval
        -}
        -
        -func NewStringSliceConstraint(x, lower, upper, y ssa.Value) Constraint {
        -	return &StringSliceConstraint{NewConstraint(y), x, lower, upper}
        -}
        -func NewStringIntersectionConstraint(a, b ssa.Value, op token.Token, ranges Ranges, y ssa.Value) Constraint {
        -	return &StringIntersectionConstraint{
        -		aConstraint: NewConstraint(y),
        -		ranges:      ranges,
        -		A:           a,
        -		B:           b,
        -		Op:          op,
        -	}
        -}
        -func NewStringConcatConstraint(a, b, y ssa.Value) Constraint {
        -	return &StringConcatConstraint{NewConstraint(y), a, b}
        -}
        -func NewStringLengthConstraint(x ssa.Value, y ssa.Value) Constraint {
        -	return &StringLengthConstraint{NewConstraint(y), x}
        -}
        -func NewStringIntervalConstraint(i IntInterval, y ssa.Value) Constraint {
        -	return &StringIntervalConstraint{NewConstraint(y), i}
        -}
        -
        -func (c *StringSliceConstraint) Operands() []ssa.Value {
        -	vs := []ssa.Value{c.X}
        -	if c.Lower != nil {
        -		vs = append(vs, c.Lower)
        -	}
        -	if c.Upper != nil {
        -		vs = append(vs, c.Upper)
        -	}
        -	return vs
        -}
        -func (c *StringIntersectionConstraint) Operands() []ssa.Value { return []ssa.Value{c.A} }
        -func (c StringConcatConstraint) Operands() []ssa.Value        { return []ssa.Value{c.A, c.B} }
        -func (c *StringLengthConstraint) Operands() []ssa.Value       { return []ssa.Value{c.X} }
        -func (s *StringIntervalConstraint) Operands() []ssa.Value     { return nil }
        -
        -func (c *StringSliceConstraint) String() string {
        -	var lname, uname string
        -	if c.Lower != nil {
        -		lname = c.Lower.Name()
        -	}
        -	if c.Upper != nil {
        -		uname = c.Upper.Name()
        -	}
        -	return fmt.Sprintf("%s[%s:%s]", c.X.Name(), lname, uname)
        -}
        -func (c *StringIntersectionConstraint) String() string {
        -	return fmt.Sprintf("%s = %s %s %s (%t branch)", c.Y().Name(), c.A.Name(), c.Op, c.B.Name(), c.Y().(*ssa.Sigma).Branch)
        -}
        -func (c StringConcatConstraint) String() string {
        -	return fmt.Sprintf("%s = %s + %s", c.Y().Name(), c.A.Name(), c.B.Name())
        -}
        -func (c *StringLengthConstraint) String() string {
        -	return fmt.Sprintf("%s = len(%s)", c.Y().Name(), c.X.Name())
        -}
        -func (c *StringIntervalConstraint) String() string { return fmt.Sprintf("%s = %s", c.Y().Name(), c.I) }
        -
        -func (c *StringSliceConstraint) Eval(g *Graph) Range {
        -	lr := NewIntInterval(NewZ(0), NewZ(0))
        -	if c.Lower != nil {
        -		lr = g.Range(c.Lower).(IntInterval)
        -	}
        -	ur := g.Range(c.X).(StringInterval).Length
        -	if c.Upper != nil {
        -		ur = g.Range(c.Upper).(IntInterval)
        -	}
        -	if !lr.IsKnown() || !ur.IsKnown() {
        -		return StringInterval{}
        -	}
        -
        -	ls := []Z{
        -		ur.Lower.Sub(lr.Lower),
        -		ur.Upper.Sub(lr.Lower),
        -		ur.Lower.Sub(lr.Upper),
        -		ur.Upper.Sub(lr.Upper),
        -	}
        -	// TODO(dh): if we don't truncate lengths to 0 we might be able to
        -	// easily detect slices with high < low. we'd need to treat -∞
        -	// specially, though.
        -	for i, l := range ls {
        -		if l.Sign() == -1 {
        -			ls[i] = NewZ(0)
        -		}
        -	}
        -
        -	return StringInterval{
        -		Length: NewIntInterval(MinZ(ls...), MaxZ(ls...)),
        -	}
        -}
        -func (c *StringIntersectionConstraint) Eval(g *Graph) Range {
        -	var l IntInterval
        -	switch r := g.Range(c.A).(type) {
        -	case StringInterval:
        -		l = r.Length
        -	case IntInterval:
        -		l = r
        -	}
        -
        -	if !l.IsKnown() {
        -		return StringInterval{c.I}
        -	}
        -	return StringInterval{
        -		Length: l.Intersection(c.I),
        -	}
        -}
        -func (c StringConcatConstraint) Eval(g *Graph) Range {
        -	i1, i2 := g.Range(c.A).(StringInterval), g.Range(c.B).(StringInterval)
        -	if !i1.Length.IsKnown() || !i2.Length.IsKnown() {
        -		return StringInterval{}
        -	}
        -	return StringInterval{
        -		Length: i1.Length.Add(i2.Length),
        -	}
        -}
        -func (c *StringLengthConstraint) Eval(g *Graph) Range {
        -	i := g.Range(c.X).(StringInterval).Length
        -	if !i.IsKnown() {
        -		return NewIntInterval(NewZ(0), PInfinity)
        -	}
        -	return i
        -}
        -func (c *StringIntervalConstraint) Eval(*Graph) Range { return StringInterval{c.I} }
        -
        -func (c *StringIntersectionConstraint) Futures() []ssa.Value {
        -	return []ssa.Value{c.B}
        -}
        -
        -func (c *StringIntersectionConstraint) Resolve() {
        -	if (c.A.Type().Underlying().(*types.Basic).Info() & types.IsString) != 0 {
        -		// comparing two strings
        -		r, ok := c.ranges[c.B].(StringInterval)
        -		if !ok {
        -			c.I = NewIntInterval(NewZ(0), PInfinity)
        -			return
        -		}
        -		switch c.Op {
        -		case token.EQL:
        -			c.I = r.Length
        -		case token.GTR, token.GEQ:
        -			c.I = NewIntInterval(r.Length.Lower, PInfinity)
        -		case token.LSS, token.LEQ:
        -			c.I = NewIntInterval(NewZ(0), r.Length.Upper)
        -		case token.NEQ:
        -		default:
        -			panic("unsupported op " + c.Op.String())
        -		}
        -	} else {
        -		r, ok := c.ranges[c.B].(IntInterval)
        -		if !ok {
        -			c.I = NewIntInterval(NewZ(0), PInfinity)
        -			return
        -		}
        -		// comparing two lengths
        -		switch c.Op {
        -		case token.EQL:
        -			c.I = r
        -		case token.GTR:
        -			c.I = NewIntInterval(r.Lower.Add(NewZ(1)), PInfinity)
        -		case token.GEQ:
        -			c.I = NewIntInterval(r.Lower, PInfinity)
        -		case token.LSS:
        -			c.I = NewIntInterval(NInfinity, r.Upper.Sub(NewZ(1)))
        -		case token.LEQ:
        -			c.I = NewIntInterval(NInfinity, r.Upper)
        -		case token.NEQ:
        -		default:
        -			panic("unsupported op " + c.Op.String())
        -		}
        -	}
        -}
        -
        -func (c *StringIntersectionConstraint) IsKnown() bool {
        -	return c.I.IsKnown()
        -}
        -
        -func (c *StringIntersectionConstraint) MarkUnresolved() {
        -	c.resolved = false
        -}
        -
        -func (c *StringIntersectionConstraint) MarkResolved() {
        -	c.resolved = true
        -}
        -
        -func (c *StringIntersectionConstraint) IsResolved() bool {
        -	return c.resolved
        -}
        diff --git a/vendor/honnef.co/go/tools/staticcheck/vrp/vrp.go b/vendor/honnef.co/go/tools/staticcheck/vrp/vrp.go
        deleted file mode 100644
        index 3c138e512..000000000
        --- a/vendor/honnef.co/go/tools/staticcheck/vrp/vrp.go
        +++ /dev/null
        @@ -1,1056 +0,0 @@
        -package vrp
        -
        -// TODO(dh) widening and narrowing have a lot of code in common. Make
        -// it reusable.
        -
        -import (
        -	"fmt"
        -	"go/constant"
        -	"go/token"
        -	"go/types"
        -	"math/big"
        -	"sort"
        -	"strings"
        -
        -	"honnef.co/go/tools/lint"
        -	"honnef.co/go/tools/ssa"
        -)
        -
        -type Future interface {
        -	Constraint
        -	Futures() []ssa.Value
        -	Resolve()
        -	IsKnown() bool
        -	MarkUnresolved()
        -	MarkResolved()
        -	IsResolved() bool
        -}
        -
        -type Range interface {
        -	Union(other Range) Range
        -	IsKnown() bool
        -}
        -
        -type Constraint interface {
        -	Y() ssa.Value
        -	isConstraint()
        -	String() string
        -	Eval(*Graph) Range
        -	Operands() []ssa.Value
        -}
        -
        -type aConstraint struct {
        -	y ssa.Value
        -}
        -
        -func NewConstraint(y ssa.Value) aConstraint {
        -	return aConstraint{y}
        -}
        -
        -func (aConstraint) isConstraint()  {}
        -func (c aConstraint) Y() ssa.Value { return c.y }
        -
        -type PhiConstraint struct {
        -	aConstraint
        -	Vars []ssa.Value
        -}
        -
        -func NewPhiConstraint(vars []ssa.Value, y ssa.Value) Constraint {
        -	uniqm := map[ssa.Value]struct{}{}
        -	for _, v := range vars {
        -		uniqm[v] = struct{}{}
        -	}
        -	var uniq []ssa.Value
        -	for v := range uniqm {
        -		uniq = append(uniq, v)
        -	}
        -	return &PhiConstraint{
        -		aConstraint: NewConstraint(y),
        -		Vars:        uniq,
        -	}
        -}
        -
        -func (c *PhiConstraint) Operands() []ssa.Value {
        -	return c.Vars
        -}
        -
        -func (c *PhiConstraint) Eval(g *Graph) Range {
        -	i := Range(nil)
        -	for _, v := range c.Vars {
        -		i = g.Range(v).Union(i)
        -	}
        -	return i
        -}
        -
        -func (c *PhiConstraint) String() string {
        -	names := make([]string, len(c.Vars))
        -	for i, v := range c.Vars {
        -		names[i] = v.Name()
        -	}
        -	return fmt.Sprintf("%s = φ(%s)", c.Y().Name(), strings.Join(names, ", "))
        -}
        -
        -func isSupportedType(typ types.Type) bool {
        -	switch typ := typ.Underlying().(type) {
        -	case *types.Basic:
        -		switch typ.Kind() {
        -		case types.String, types.UntypedString:
        -			return true
        -		default:
        -			if (typ.Info() & types.IsInteger) == 0 {
        -				return false
        -			}
        -		}
        -	case *types.Chan:
        -		return true
        -	case *types.Slice:
        -		return true
        -	default:
        -		return false
        -	}
        -	return true
        -}
        -
        -func ConstantToZ(c constant.Value) Z {
        -	s := constant.ToInt(c).ExactString()
        -	n := &big.Int{}
        -	n.SetString(s, 10)
        -	return NewBigZ(n)
        -}
        -
        -func sigmaInteger(g *Graph, ins *ssa.Sigma, cond *ssa.BinOp, ops []*ssa.Value) Constraint {
        -	op := cond.Op
        -	if !ins.Branch {
        -		op = (invertToken(op))
        -	}
        -
        -	switch op {
        -	case token.EQL, token.GTR, token.GEQ, token.LSS, token.LEQ:
        -	default:
        -		return nil
        -	}
        -	var a, b ssa.Value
        -	if (*ops[0]) == ins.X {
        -		a = *ops[0]
        -		b = *ops[1]
        -	} else {
        -		a = *ops[1]
        -		b = *ops[0]
        -		op = flipToken(op)
        -	}
        -	return NewIntIntersectionConstraint(a, b, op, g.ranges, ins)
        -}
        -
        -func sigmaString(g *Graph, ins *ssa.Sigma, cond *ssa.BinOp, ops []*ssa.Value) Constraint {
        -	op := cond.Op
        -	if !ins.Branch {
        -		op = (invertToken(op))
        -	}
        -
        -	switch op {
        -	case token.EQL, token.GTR, token.GEQ, token.LSS, token.LEQ:
        -	default:
        -		return nil
        -	}
        -
        -	if ((*ops[0]).Type().Underlying().(*types.Basic).Info() & types.IsString) == 0 {
        -		var a, b ssa.Value
        -		call, ok := (*ops[0]).(*ssa.Call)
        -		if ok && call.Common().Args[0] == ins.X {
        -			a = *ops[0]
        -			b = *ops[1]
        -		} else {
        -			a = *ops[1]
        -			b = *ops[0]
        -			op = flipToken(op)
        -		}
        -		return NewStringIntersectionConstraint(a, b, op, g.ranges, ins)
        -	}
        -	var a, b ssa.Value
        -	if (*ops[0]) == ins.X {
        -		a = *ops[0]
        -		b = *ops[1]
        -	} else {
        -		a = *ops[1]
        -		b = *ops[0]
        -		op = flipToken(op)
        -	}
        -	return NewStringIntersectionConstraint(a, b, op, g.ranges, ins)
        -}
        -
        -func sigmaSlice(g *Graph, ins *ssa.Sigma, cond *ssa.BinOp, ops []*ssa.Value) Constraint {
        -	// TODO(dh) sigmaSlice and sigmaString are a lot alike. Can they
        -	// be merged?
        -	//
        -	// XXX support futures
        -
        -	op := cond.Op
        -	if !ins.Branch {
        -		op = (invertToken(op))
        -	}
        -
        -	k, ok := (*ops[1]).(*ssa.Const)
        -	// XXX investigate in what cases this wouldn't be a Const
        -	//
        -	// XXX what if left and right are swapped?
        -	if !ok {
        -		return nil
        -	}
        -
        -	call, ok := (*ops[0]).(*ssa.Call)
        -	if !ok {
        -		return nil
        -	}
        -	builtin, ok := call.Common().Value.(*ssa.Builtin)
        -	if !ok {
        -		return nil
        -	}
        -	if builtin.Name() != "len" {
        -		return nil
        -	}
        -	callops := call.Operands(nil)
        -
        -	v := ConstantToZ(k.Value)
        -	c := NewSliceIntersectionConstraint(*callops[1], IntInterval{}, ins).(*SliceIntersectionConstraint)
        -	switch op {
        -	case token.EQL:
        -		c.I = NewIntInterval(v, v)
        -	case token.GTR, token.GEQ:
        -		off := int64(0)
        -		if cond.Op == token.GTR {
        -			off = 1
        -		}
        -		c.I = NewIntInterval(
        -			v.Add(NewZ(off)),
        -			PInfinity,
        -		)
        -	case token.LSS, token.LEQ:
        -		off := int64(0)
        -		if cond.Op == token.LSS {
        -			off = -1
        -		}
        -		c.I = NewIntInterval(
        -			NInfinity,
        -			v.Add(NewZ(off)),
        -		)
        -	default:
        -		return nil
        -	}
        -	return c
        -}
        -
        -func BuildGraph(f *ssa.Function) *Graph {
        -	g := &Graph{
        -		Vertices: map[interface{}]*Vertex{},
        -		ranges:   Ranges{},
        -	}
        -
        -	var cs []Constraint
        -
        -	ops := make([]*ssa.Value, 16)
        -	seen := map[ssa.Value]bool{}
        -	for _, block := range f.Blocks {
        -		for _, ins := range block.Instrs {
        -			ops = ins.Operands(ops[:0])
        -			for _, op := range ops {
        -				if c, ok := (*op).(*ssa.Const); ok {
        -					if seen[c] {
        -						continue
        -					}
        -					seen[c] = true
        -					if c.Value == nil {
        -						switch c.Type().Underlying().(type) {
        -						case *types.Slice:
        -							cs = append(cs, NewSliceIntervalConstraint(NewIntInterval(NewZ(0), NewZ(0)), c))
        -						}
        -						continue
        -					}
        -					switch c.Value.Kind() {
        -					case constant.Int:
        -						v := ConstantToZ(c.Value)
        -						cs = append(cs, NewIntIntervalConstraint(NewIntInterval(v, v), c))
        -					case constant.String:
        -						s := constant.StringVal(c.Value)
        -						n := NewZ(int64(len(s)))
        -						cs = append(cs, NewStringIntervalConstraint(NewIntInterval(n, n), c))
        -					}
        -				}
        -			}
        -		}
        -	}
        -	for _, block := range f.Blocks {
        -		for _, ins := range block.Instrs {
        -			switch ins := ins.(type) {
        -			case *ssa.Convert:
        -				switch v := ins.Type().Underlying().(type) {
        -				case *types.Basic:
        -					if (v.Info() & types.IsInteger) == 0 {
        -						continue
        -					}
        -					cs = append(cs, NewIntConversionConstraint(ins.X, ins))
        -				}
        -			case *ssa.Call:
        -				if static := ins.Common().StaticCallee(); static != nil {
        -					if fn, ok := static.Object().(*types.Func); ok {
        -						switch lint.FuncName(fn) {
        -						case "bytes.Index", "bytes.IndexAny", "bytes.IndexByte",
        -							"bytes.IndexFunc", "bytes.IndexRune", "bytes.LastIndex",
        -							"bytes.LastIndexAny", "bytes.LastIndexByte", "bytes.LastIndexFunc",
        -							"strings.Index", "strings.IndexAny", "strings.IndexByte",
        -							"strings.IndexFunc", "strings.IndexRune", "strings.LastIndex",
        -							"strings.LastIndexAny", "strings.LastIndexByte", "strings.LastIndexFunc":
        -							// TODO(dh): instead of limiting by +∞,
        -							// limit by the upper bound of the passed
        -							// string
        -							cs = append(cs, NewIntIntervalConstraint(NewIntInterval(NewZ(-1), PInfinity), ins))
        -						case "bytes.Title", "bytes.ToLower", "bytes.ToTitle", "bytes.ToUpper",
        -							"strings.Title", "strings.ToLower", "strings.ToTitle", "strings.ToUpper":
        -							cs = append(cs, NewCopyConstraint(ins.Common().Args[0], ins))
        -						case "bytes.ToLowerSpecial", "bytes.ToTitleSpecial", "bytes.ToUpperSpecial",
        -							"strings.ToLowerSpecial", "strings.ToTitleSpecial", "strings.ToUpperSpecial":
        -							cs = append(cs, NewCopyConstraint(ins.Common().Args[1], ins))
        -						case "bytes.Compare", "strings.Compare":
        -							cs = append(cs, NewIntIntervalConstraint(NewIntInterval(NewZ(-1), NewZ(1)), ins))
        -						case "bytes.Count", "strings.Count":
        -							// TODO(dh): instead of limiting by +∞,
        -							// limit by the upper bound of the passed
        -							// string.
        -							cs = append(cs, NewIntIntervalConstraint(NewIntInterval(NewZ(0), PInfinity), ins))
        -						case "bytes.Map", "bytes.TrimFunc", "bytes.TrimLeft", "bytes.TrimLeftFunc",
        -							"bytes.TrimRight", "bytes.TrimRightFunc", "bytes.TrimSpace",
        -							"strings.Map", "strings.TrimFunc", "strings.TrimLeft", "strings.TrimLeftFunc",
        -							"strings.TrimRight", "strings.TrimRightFunc", "strings.TrimSpace":
        -							// TODO(dh): lower = 0, upper = upper of passed string
        -						case "bytes.TrimPrefix", "bytes.TrimSuffix",
        -							"strings.TrimPrefix", "strings.TrimSuffix":
        -							// TODO(dh) range between "unmodified" and len(cutset) removed
        -						case "(*bytes.Buffer).Cap", "(*bytes.Buffer).Len", "(*bytes.Reader).Len", "(*bytes.Reader).Size":
        -							cs = append(cs, NewIntIntervalConstraint(NewIntInterval(NewZ(0), PInfinity), ins))
        -						}
        -					}
        -				}
        -				builtin, ok := ins.Common().Value.(*ssa.Builtin)
        -				ops := ins.Operands(nil)
        -				if !ok {
        -					continue
        -				}
        -				switch builtin.Name() {
        -				case "len":
        -					switch op1 := (*ops[1]).Type().Underlying().(type) {
        -					case *types.Basic:
        -						if op1.Kind() == types.String || op1.Kind() == types.UntypedString {
        -							cs = append(cs, NewStringLengthConstraint(*ops[1], ins))
        -						}
        -					case *types.Slice:
        -						cs = append(cs, NewSliceLengthConstraint(*ops[1], ins))
        -					}
        -
        -				case "append":
        -					cs = append(cs, NewSliceAppendConstraint(ins.Common().Args[0], ins.Common().Args[1], ins))
        -				}
        -			case *ssa.BinOp:
        -				ops := ins.Operands(nil)
        -				basic, ok := (*ops[0]).Type().Underlying().(*types.Basic)
        -				if !ok {
        -					continue
        -				}
        -				switch basic.Kind() {
        -				case types.Int, types.Int8, types.Int16, types.Int32, types.Int64,
        -					types.Uint, types.Uint8, types.Uint16, types.Uint32, types.Uint64, types.UntypedInt:
        -					fns := map[token.Token]func(ssa.Value, ssa.Value, ssa.Value) Constraint{
        -						token.ADD: NewIntAddConstraint,
        -						token.SUB: NewIntSubConstraint,
        -						token.MUL: NewIntMulConstraint,
        -						// XXX support QUO, REM, SHL, SHR
        -					}
        -					fn, ok := fns[ins.Op]
        -					if ok {
        -						cs = append(cs, fn(*ops[0], *ops[1], ins))
        -					}
        -				case types.String, types.UntypedString:
        -					if ins.Op == token.ADD {
        -						cs = append(cs, NewStringConcatConstraint(*ops[0], *ops[1], ins))
        -					}
        -				}
        -			case *ssa.Slice:
        -				typ := ins.X.Type().Underlying()
        -				switch typ := typ.(type) {
        -				case *types.Basic:
        -					cs = append(cs, NewStringSliceConstraint(ins.X, ins.Low, ins.High, ins))
        -				case *types.Slice:
        -					cs = append(cs, NewSliceSliceConstraint(ins.X, ins.Low, ins.High, ins))
        -				case *types.Array:
        -					cs = append(cs, NewArraySliceConstraint(ins.X, ins.Low, ins.High, ins))
        -				case *types.Pointer:
        -					if _, ok := typ.Elem().(*types.Array); !ok {
        -						continue
        -					}
        -					cs = append(cs, NewArraySliceConstraint(ins.X, ins.Low, ins.High, ins))
        -				}
        -			case *ssa.Phi:
        -				if !isSupportedType(ins.Type()) {
        -					continue
        -				}
        -				ops := ins.Operands(nil)
        -				dops := make([]ssa.Value, len(ops))
        -				for i, op := range ops {
        -					dops[i] = *op
        -				}
        -				cs = append(cs, NewPhiConstraint(dops, ins))
        -			case *ssa.Sigma:
        -				pred := ins.Block().Preds[0]
        -				instrs := pred.Instrs
        -				cond, ok := instrs[len(instrs)-1].(*ssa.If).Cond.(*ssa.BinOp)
        -				ops := cond.Operands(nil)
        -				if !ok {
        -					continue
        -				}
        -				switch typ := ins.Type().Underlying().(type) {
        -				case *types.Basic:
        -					var c Constraint
        -					switch typ.Kind() {
        -					case types.Int, types.Int8, types.Int16, types.Int32, types.Int64,
        -						types.Uint, types.Uint8, types.Uint16, types.Uint32, types.Uint64, types.UntypedInt:
        -						c = sigmaInteger(g, ins, cond, ops)
        -					case types.String, types.UntypedString:
        -						c = sigmaString(g, ins, cond, ops)
        -					}
        -					if c != nil {
        -						cs = append(cs, c)
        -					}
        -				case *types.Slice:
        -					c := sigmaSlice(g, ins, cond, ops)
        -					if c != nil {
        -						cs = append(cs, c)
        -					}
        -				default:
        -					//log.Printf("unsupported sigma type %T", typ) // XXX
        -				}
        -			case *ssa.MakeChan:
        -				cs = append(cs, NewMakeChannelConstraint(ins.Size, ins))
        -			case *ssa.MakeSlice:
        -				cs = append(cs, NewMakeSliceConstraint(ins.Len, ins))
        -			case *ssa.ChangeType:
        -				switch ins.X.Type().Underlying().(type) {
        -				case *types.Chan:
        -					cs = append(cs, NewChannelChangeTypeConstraint(ins.X, ins))
        -				}
        -			}
        -		}
        -	}
        -
        -	for _, c := range cs {
        -		if c == nil {
        -			panic("nil constraint")
        -		}
        -		// If V is used in constraint C, then we create an edge V->C
        -		for _, op := range c.Operands() {
        -			g.AddEdge(op, c, false)
        -		}
        -		if c, ok := c.(Future); ok {
        -			for _, op := range c.Futures() {
        -				g.AddEdge(op, c, true)
        -			}
        -		}
        -		// If constraint C defines variable V, then we create an edge
        -		// C->V
        -		g.AddEdge(c, c.Y(), false)
        -	}
        -
        -	g.FindSCCs()
        -	g.sccEdges = make([][]Edge, len(g.SCCs))
        -	g.futures = make([][]Future, len(g.SCCs))
        -	for _, e := range g.Edges {
        -		g.sccEdges[e.From.SCC] = append(g.sccEdges[e.From.SCC], e)
        -		if !e.control {
        -			continue
        -		}
        -		if c, ok := e.To.Value.(Future); ok {
        -			g.futures[e.From.SCC] = append(g.futures[e.From.SCC], c)
        -		}
        -	}
        -	return g
        -}
        -
        -func (g *Graph) Solve() Ranges {
        -	var consts []Z
        -	off := NewZ(1)
        -	for _, n := range g.Vertices {
        -		if c, ok := n.Value.(*ssa.Const); ok {
        -			basic, ok := c.Type().Underlying().(*types.Basic)
        -			if !ok {
        -				continue
        -			}
        -			if (basic.Info() & types.IsInteger) != 0 {
        -				z := ConstantToZ(c.Value)
        -				consts = append(consts, z)
        -				consts = append(consts, z.Add(off))
        -				consts = append(consts, z.Sub(off))
        -			}
        -		}
        -
        -	}
        -	sort.Sort(Zs(consts))
        -
        -	for scc, vertices := range g.SCCs {
        -		n := 0
        -		n = len(vertices)
        -		if n == 1 {
        -			g.resolveFutures(scc)
        -			v := vertices[0]
        -			if v, ok := v.Value.(ssa.Value); ok {
        -				switch typ := v.Type().Underlying().(type) {
        -				case *types.Basic:
        -					switch typ.Kind() {
        -					case types.String, types.UntypedString:
        -						if !g.Range(v).(StringInterval).IsKnown() {
        -							g.SetRange(v, StringInterval{NewIntInterval(NewZ(0), PInfinity)})
        -						}
        -					default:
        -						if !g.Range(v).(IntInterval).IsKnown() {
        -							g.SetRange(v, InfinityFor(v))
        -						}
        -					}
        -				case *types.Chan:
        -					if !g.Range(v).(ChannelInterval).IsKnown() {
        -						g.SetRange(v, ChannelInterval{NewIntInterval(NewZ(0), PInfinity)})
        -					}
        -				case *types.Slice:
        -					if !g.Range(v).(SliceInterval).IsKnown() {
        -						g.SetRange(v, SliceInterval{NewIntInterval(NewZ(0), PInfinity)})
        -					}
        -				}
        -			}
        -			if c, ok := v.Value.(Constraint); ok {
        -				g.SetRange(c.Y(), c.Eval(g))
        -			}
        -		} else {
        -			uses := g.uses(scc)
        -			entries := g.entries(scc)
        -			for len(entries) > 0 {
        -				v := entries[len(entries)-1]
        -				entries = entries[:len(entries)-1]
        -				for _, use := range uses[v] {
        -					if g.widen(use, consts) {
        -						entries = append(entries, use.Y())
        -					}
        -				}
        -			}
        -
        -			g.resolveFutures(scc)
        -
        -			// XXX this seems to be necessary, but shouldn't be.
        -			// removing it leads to nil pointer derefs; investigate
        -			// where we're not setting values correctly.
        -			for _, n := range vertices {
        -				if v, ok := n.Value.(ssa.Value); ok {
        -					i, ok := g.Range(v).(IntInterval)
        -					if !ok {
        -						continue
        -					}
        -					if !i.IsKnown() {
        -						g.SetRange(v, InfinityFor(v))
        -					}
        -				}
        -			}
        -
        -			actives := g.actives(scc)
        -			for len(actives) > 0 {
        -				v := actives[len(actives)-1]
        -				actives = actives[:len(actives)-1]
        -				for _, use := range uses[v] {
        -					if g.narrow(use) {
        -						actives = append(actives, use.Y())
        -					}
        -				}
        -			}
        -		}
        -		// propagate scc
        -		for _, edge := range g.sccEdges[scc] {
        -			if edge.control {
        -				continue
        -			}
        -			if edge.From.SCC == edge.To.SCC {
        -				continue
        -			}
        -			if c, ok := edge.To.Value.(Constraint); ok {
        -				g.SetRange(c.Y(), c.Eval(g))
        -			}
        -			if c, ok := edge.To.Value.(Future); ok {
        -				if !c.IsKnown() {
        -					c.MarkUnresolved()
        -				}
        -			}
        -		}
        -	}
        -
        -	for v, r := range g.ranges {
        -		i, ok := r.(IntInterval)
        -		if !ok {
        -			continue
        -		}
        -		if (v.Type().Underlying().(*types.Basic).Info() & types.IsUnsigned) == 0 {
        -			if i.Upper != PInfinity {
        -				s := &types.StdSizes{
        -					// XXX is it okay to assume the largest word size, or do we
        -					// need to be platform specific?
        -					WordSize: 8,
        -					MaxAlign: 1,
        -				}
        -				bits := (s.Sizeof(v.Type()) * 8) - 1
        -				n := big.NewInt(1)
        -				n = n.Lsh(n, uint(bits))
        -				upper, lower := &big.Int{}, &big.Int{}
        -				upper.Sub(n, big.NewInt(1))
        -				lower.Neg(n)
        -
        -				if i.Upper.Cmp(NewBigZ(upper)) == 1 {
        -					i = NewIntInterval(NInfinity, PInfinity)
        -				} else if i.Lower.Cmp(NewBigZ(lower)) == -1 {
        -					i = NewIntInterval(NInfinity, PInfinity)
        -				}
        -			}
        -		}
        -
        -		g.ranges[v] = i
        -	}
        -
        -	return g.ranges
        -}
        -
        -func VertexString(v *Vertex) string {
        -	switch v := v.Value.(type) {
        -	case Constraint:
        -		return v.String()
        -	case ssa.Value:
        -		return v.Name()
        -	case nil:
        -		return "BUG: nil vertex value"
        -	default:
        -		panic(fmt.Sprintf("unexpected type %T", v))
        -	}
        -}
        -
        -type Vertex struct {
        -	Value   interface{} // one of Constraint or ssa.Value
        -	SCC     int
        -	index   int
        -	lowlink int
        -	stack   bool
        -
        -	Succs []Edge
        -}
        -
        -type Ranges map[ssa.Value]Range
        -
        -func (r Ranges) Get(x ssa.Value) Range {
        -	if x == nil {
        -		return nil
        -	}
        -	i, ok := r[x]
        -	if !ok {
        -		switch x := x.Type().Underlying().(type) {
        -		case *types.Basic:
        -			switch x.Kind() {
        -			case types.String, types.UntypedString:
        -				return StringInterval{}
        -			default:
        -				return IntInterval{}
        -			}
        -		case *types.Chan:
        -			return ChannelInterval{}
        -		case *types.Slice:
        -			return SliceInterval{}
        -		}
        -	}
        -	return i
        -}
        -
        -type Graph struct {
        -	Vertices map[interface{}]*Vertex
        -	Edges    []Edge
        -	SCCs     [][]*Vertex
        -	ranges   Ranges
        -
        -	// map SCCs to futures
        -	futures [][]Future
        -	// map SCCs to edges
        -	sccEdges [][]Edge
        -}
        -
        -func (g Graph) Graphviz() string {
        -	var lines []string
        -	lines = append(lines, "digraph{")
        -	ids := map[interface{}]int{}
        -	i := 1
        -	for _, v := range g.Vertices {
        -		ids[v] = i
        -		shape := "box"
        -		if _, ok := v.Value.(ssa.Value); ok {
        -			shape = "oval"
        -		}
        -		lines = append(lines, fmt.Sprintf(`n%d [shape="%s", label=%q, colorscheme=spectral11, style="filled", fillcolor="%d"]`,
        -			i, shape, VertexString(v), (v.SCC%11)+1))
        -		i++
        -	}
        -	for _, e := range g.Edges {
        -		style := "solid"
        -		if e.control {
        -			style = "dashed"
        -		}
        -		lines = append(lines, fmt.Sprintf(`n%d -> n%d [style="%s"]`, ids[e.From], ids[e.To], style))
        -	}
        -	lines = append(lines, "}")
        -	return strings.Join(lines, "\n")
        -}
        -
        -func (g *Graph) SetRange(x ssa.Value, r Range) {
        -	g.ranges[x] = r
        -}
        -
        -func (g *Graph) Range(x ssa.Value) Range {
        -	return g.ranges.Get(x)
        -}
        -
        -func (g *Graph) widen(c Constraint, consts []Z) bool {
        -	setRange := func(i Range) {
        -		g.SetRange(c.Y(), i)
        -	}
        -	widenIntInterval := func(oi, ni IntInterval) (IntInterval, bool) {
        -		if !ni.IsKnown() {
        -			return oi, false
        -		}
        -		nlc := NInfinity
        -		nuc := PInfinity
        -
        -		// Don't get stuck widening for an absurd amount of time due
        -		// to an excess number of constants, as may be present in
        -		// table-based scanners.
        -		if len(consts) < 1000 {
        -			for _, co := range consts {
        -				if co.Cmp(ni.Lower) <= 0 {
        -					nlc = co
        -					break
        -				}
        -			}
        -			for _, co := range consts {
        -				if co.Cmp(ni.Upper) >= 0 {
        -					nuc = co
        -					break
        -				}
        -			}
        -		}
        -
        -		if !oi.IsKnown() {
        -			return ni, true
        -		}
        -		if ni.Lower.Cmp(oi.Lower) == -1 && ni.Upper.Cmp(oi.Upper) == 1 {
        -			return NewIntInterval(nlc, nuc), true
        -		}
        -		if ni.Lower.Cmp(oi.Lower) == -1 {
        -			return NewIntInterval(nlc, oi.Upper), true
        -		}
        -		if ni.Upper.Cmp(oi.Upper) == 1 {
        -			return NewIntInterval(oi.Lower, nuc), true
        -		}
        -		return oi, false
        -	}
        -	switch oi := g.Range(c.Y()).(type) {
        -	case IntInterval:
        -		ni := c.Eval(g).(IntInterval)
        -		si, changed := widenIntInterval(oi, ni)
        -		if changed {
        -			setRange(si)
        -			return true
        -		}
        -		return false
        -	case StringInterval:
        -		ni := c.Eval(g).(StringInterval)
        -		si, changed := widenIntInterval(oi.Length, ni.Length)
        -		if changed {
        -			setRange(StringInterval{si})
        -			return true
        -		}
        -		return false
        -	case SliceInterval:
        -		ni := c.Eval(g).(SliceInterval)
        -		si, changed := widenIntInterval(oi.Length, ni.Length)
        -		if changed {
        -			setRange(SliceInterval{si})
        -			return true
        -		}
        -		return false
        -	default:
        -		return false
        -	}
        -}
        -
        -func (g *Graph) narrow(c Constraint) bool {
        -	narrowIntInterval := func(oi, ni IntInterval) (IntInterval, bool) {
        -		oLower := oi.Lower
        -		oUpper := oi.Upper
        -		nLower := ni.Lower
        -		nUpper := ni.Upper
        -
        -		if oLower == NInfinity && nLower != NInfinity {
        -			return NewIntInterval(nLower, oUpper), true
        -		}
        -		if oUpper == PInfinity && nUpper != PInfinity {
        -			return NewIntInterval(oLower, nUpper), true
        -		}
        -		if oLower.Cmp(nLower) == 1 {
        -			return NewIntInterval(nLower, oUpper), true
        -		}
        -		if oUpper.Cmp(nUpper) == -1 {
        -			return NewIntInterval(oLower, nUpper), true
        -		}
        -		return oi, false
        -	}
        -	switch oi := g.Range(c.Y()).(type) {
        -	case IntInterval:
        -		ni := c.Eval(g).(IntInterval)
        -		si, changed := narrowIntInterval(oi, ni)
        -		if changed {
        -			g.SetRange(c.Y(), si)
        -			return true
        -		}
        -		return false
        -	case StringInterval:
        -		ni := c.Eval(g).(StringInterval)
        -		si, changed := narrowIntInterval(oi.Length, ni.Length)
        -		if changed {
        -			g.SetRange(c.Y(), StringInterval{si})
        -			return true
        -		}
        -		return false
        -	case SliceInterval:
        -		ni := c.Eval(g).(SliceInterval)
        -		si, changed := narrowIntInterval(oi.Length, ni.Length)
        -		if changed {
        -			g.SetRange(c.Y(), SliceInterval{si})
        -			return true
        -		}
        -		return false
        -	default:
        -		return false
        -	}
        -}
        -
        -func (g *Graph) resolveFutures(scc int) {
        -	for _, c := range g.futures[scc] {
        -		c.Resolve()
        -	}
        -}
        -
        -func (g *Graph) entries(scc int) []ssa.Value {
        -	var entries []ssa.Value
        -	for _, n := range g.Vertices {
        -		if n.SCC != scc {
        -			continue
        -		}
        -		if v, ok := n.Value.(ssa.Value); ok {
        -			// XXX avoid quadratic runtime
        -			//
        -			// XXX I cannot think of any code where the future and its
        -			// variables aren't in the same SCC, in which case this
        -			// code isn't very useful (the variables won't be resolved
        -			// yet). Before we have a cross-SCC example, however, we
        -			// can't really verify that this code is working
        -			// correctly, or indeed doing anything useful.
        -			for _, on := range g.Vertices {
        -				if c, ok := on.Value.(Future); ok {
        -					if c.Y() == v {
        -						if !c.IsResolved() {
        -							g.SetRange(c.Y(), c.Eval(g))
        -							c.MarkResolved()
        -						}
        -						break
        -					}
        -				}
        -			}
        -			if g.Range(v).IsKnown() {
        -				entries = append(entries, v)
        -			}
        -		}
        -	}
        -	return entries
        -}
        -
        -func (g *Graph) uses(scc int) map[ssa.Value][]Constraint {
        -	m := map[ssa.Value][]Constraint{}
        -	for _, e := range g.sccEdges[scc] {
        -		if e.control {
        -			continue
        -		}
        -		if v, ok := e.From.Value.(ssa.Value); ok {
        -			c := e.To.Value.(Constraint)
        -			sink := c.Y()
        -			if g.Vertices[sink].SCC == scc {
        -				m[v] = append(m[v], c)
        -			}
        -		}
        -	}
        -	return m
        -}
        -
        -func (g *Graph) actives(scc int) []ssa.Value {
        -	var actives []ssa.Value
        -	for _, n := range g.Vertices {
        -		if n.SCC != scc {
        -			continue
        -		}
        -		if v, ok := n.Value.(ssa.Value); ok {
        -			if _, ok := v.(*ssa.Const); !ok {
        -				actives = append(actives, v)
        -			}
        -		}
        -	}
        -	return actives
        -}
        -
        -func (g *Graph) AddEdge(from, to interface{}, ctrl bool) {
        -	vf, ok := g.Vertices[from]
        -	if !ok {
        -		vf = &Vertex{Value: from}
        -		g.Vertices[from] = vf
        -	}
        -	vt, ok := g.Vertices[to]
        -	if !ok {
        -		vt = &Vertex{Value: to}
        -		g.Vertices[to] = vt
        -	}
        -	e := Edge{From: vf, To: vt, control: ctrl}
        -	g.Edges = append(g.Edges, e)
        -	vf.Succs = append(vf.Succs, e)
        -}
        -
        -type Edge struct {
        -	From, To *Vertex
        -	control  bool
        -}
        -
        -func (e Edge) String() string {
        -	return fmt.Sprintf("%s -> %s", VertexString(e.From), VertexString(e.To))
        -}
        -
        -func (g *Graph) FindSCCs() {
        -	// use Tarjan to find the SCCs
        -
        -	index := 1
        -	var s []*Vertex
        -
        -	scc := 0
        -	var strongconnect func(v *Vertex)
        -	strongconnect = func(v *Vertex) {
        -		// set the depth index for v to the smallest unused index
        -		v.index = index
        -		v.lowlink = index
        -		index++
        -		s = append(s, v)
        -		v.stack = true
        -
        -		for _, e := range v.Succs {
        -			w := e.To
        -			if w.index == 0 {
        -				// successor w has not yet been visited; recurse on it
        -				strongconnect(w)
        -				if w.lowlink < v.lowlink {
        -					v.lowlink = w.lowlink
        -				}
        -			} else if w.stack {
        -				// successor w is in stack s and hence in the current scc
        -				if w.index < v.lowlink {
        -					v.lowlink = w.index
        -				}
        -			}
        -		}
        -
        -		if v.lowlink == v.index {
        -			for {
        -				w := s[len(s)-1]
        -				s = s[:len(s)-1]
        -				w.stack = false
        -				w.SCC = scc
        -				if w == v {
        -					break
        -				}
        -			}
        -			scc++
        -		}
        -	}
        -	for _, v := range g.Vertices {
        -		if v.index == 0 {
        -			strongconnect(v)
        -		}
        -	}
        -
        -	g.SCCs = make([][]*Vertex, scc)
        -	for _, n := range g.Vertices {
        -		n.SCC = scc - n.SCC - 1
        -		g.SCCs[n.SCC] = append(g.SCCs[n.SCC], n)
        -	}
        -}
        -
        -func invertToken(tok token.Token) token.Token {
        -	switch tok {
        -	case token.LSS:
        -		return token.GEQ
        -	case token.GTR:
        -		return token.LEQ
        -	case token.EQL:
        -		return token.NEQ
        -	case token.NEQ:
        -		return token.EQL
        -	case token.GEQ:
        -		return token.LSS
        -	case token.LEQ:
        -		return token.GTR
        -	default:
        -		panic(fmt.Sprintf("unsupported token %s", tok))
        -	}
        -}
        -
        -func flipToken(tok token.Token) token.Token {
        -	switch tok {
        -	case token.LSS:
        -		return token.GTR
        -	case token.GTR:
        -		return token.LSS
        -	case token.EQL:
        -		return token.EQL
        -	case token.NEQ:
        -		return token.NEQ
        -	case token.GEQ:
        -		return token.LEQ
        -	case token.LEQ:
        -		return token.GEQ
        -	default:
        -		panic(fmt.Sprintf("unsupported token %s", tok))
        -	}
        -}
        -
        -type CopyConstraint struct {
        -	aConstraint
        -	X ssa.Value
        -}
        -
        -func (c *CopyConstraint) String() string {
        -	return fmt.Sprintf("%s = copy(%s)", c.Y().Name(), c.X.Name())
        -}
        -
        -func (c *CopyConstraint) Eval(g *Graph) Range {
        -	return g.Range(c.X)
        -}
        -
        -func (c *CopyConstraint) Operands() []ssa.Value {
        -	return []ssa.Value{c.X}
        -}
        -
        -func NewCopyConstraint(x, y ssa.Value) Constraint {
        -	return &CopyConstraint{
        -		aConstraint: aConstraint{
        -			y: y,
        -		},
        -		X: x,
        -	}
        -}
        diff --git a/vendor/honnef.co/go/tools/stylecheck/analysis.go b/vendor/honnef.co/go/tools/stylecheck/analysis.go
        deleted file mode 100644
        index f252487f7..000000000
        --- a/vendor/honnef.co/go/tools/stylecheck/analysis.go
        +++ /dev/null
        @@ -1,111 +0,0 @@
        -package stylecheck
        -
        -import (
        -	"flag"
        -
        -	"golang.org/x/tools/go/analysis"
        -	"golang.org/x/tools/go/analysis/passes/inspect"
        -	"honnef.co/go/tools/config"
        -	"honnef.co/go/tools/facts"
        -	"honnef.co/go/tools/internal/passes/buildssa"
        -	"honnef.co/go/tools/lint/lintutil"
        -)
        -
        -func newFlagSet() flag.FlagSet {
        -	fs := flag.NewFlagSet("", flag.PanicOnError)
        -	fs.Var(lintutil.NewVersionFlag(), "go", "Target Go version")
        -	return *fs
        -}
        -
        -var Analyzers = map[string]*analysis.Analyzer{
        -	"ST1000": {
        -		Name:     "ST1000",
        -		Run:      CheckPackageComment,
        -		Doc:      Docs["ST1000"].String(),
        -		Requires: []*analysis.Analyzer{},
        -		Flags:    newFlagSet(),
        -	},
        -	"ST1001": {
        -		Name:     "ST1001",
        -		Run:      CheckDotImports,
        -		Doc:      Docs["ST1001"].String(),
        -		Requires: []*analysis.Analyzer{facts.Generated, config.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"ST1003": {
        -		Name:     "ST1003",
        -		Run:      CheckNames,
        -		Doc:      Docs["ST1003"].String(),
        -		Requires: []*analysis.Analyzer{facts.Generated, config.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"ST1005": {
        -		Name:     "ST1005",
        -		Run:      CheckErrorStrings,
        -		Doc:      Docs["ST1005"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"ST1006": {
        -		Name:     "ST1006",
        -		Run:      CheckReceiverNames,
        -		Doc:      Docs["ST1006"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer, facts.Generated},
        -		Flags:    newFlagSet(),
        -	},
        -	"ST1008": {
        -		Name:     "ST1008",
        -		Run:      CheckErrorReturn,
        -		Doc:      Docs["ST1008"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"ST1011": {
        -		Name:  "ST1011",
        -		Run:   CheckTimeNames,
        -		Doc:   Docs["ST1011"].String(),
        -		Flags: newFlagSet(),
        -	},
        -	"ST1012": {
        -		Name:     "ST1012",
        -		Run:      CheckErrorVarNames,
        -		Doc:      Docs["ST1012"].String(),
        -		Requires: []*analysis.Analyzer{config.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"ST1013": {
        -		Name:     "ST1013",
        -		Run:      CheckHTTPStatusCodes,
        -		Doc:      Docs["ST1013"].String(),
        -		Requires: []*analysis.Analyzer{facts.Generated, facts.TokenFile, config.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"ST1015": {
        -		Name:     "ST1015",
        -		Run:      CheckDefaultCaseOrder,
        -		Doc:      Docs["ST1015"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated, facts.TokenFile},
        -		Flags:    newFlagSet(),
        -	},
        -	"ST1016": {
        -		Name:     "ST1016",
        -		Run:      CheckReceiverNamesIdentical,
        -		Doc:      Docs["ST1016"].String(),
        -		Requires: []*analysis.Analyzer{buildssa.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -	"ST1017": {
        -		Name:     "ST1017",
        -		Run:      CheckYodaConditions,
        -		Doc:      Docs["ST1017"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated, facts.TokenFile},
        -		Flags:    newFlagSet(),
        -	},
        -	"ST1018": {
        -		Name:     "ST1018",
        -		Run:      CheckInvisibleCharacters,
        -		Doc:      Docs["ST1018"].String(),
        -		Requires: []*analysis.Analyzer{inspect.Analyzer},
        -		Flags:    newFlagSet(),
        -	},
        -}
        diff --git a/vendor/honnef.co/go/tools/stylecheck/doc.go b/vendor/honnef.co/go/tools/stylecheck/doc.go
        deleted file mode 100644
        index 9097214d9..000000000
        --- a/vendor/honnef.co/go/tools/stylecheck/doc.go
        +++ /dev/null
        @@ -1,154 +0,0 @@
        -package stylecheck
        -
        -import "honnef.co/go/tools/lint"
        -
        -var Docs = map[string]*lint.Documentation{
        -	"ST1000": &lint.Documentation{
        -		Title: `Incorrect or missing package comment`,
        -		Text: `Packages must have a package comment that is formatted according to
        -the guidelines laid out in
        -https://github.com/golang/go/wiki/CodeReviewComments#package-comments.`,
        -		Since:      "2019.1",
        -		NonDefault: true,
        -	},
        -
        -	"ST1001": &lint.Documentation{
        -		Title: `Dot imports are discouraged`,
        -		Text: `Dot imports that aren't in external test packages are discouraged.
        -
        -The dot_import_whitelist option can be used to whitelist certain
        -imports.
        -
        -Quoting Go Code Review Comments:
        -
        -    The import . form can be useful in tests that, due to circular
        -    dependencies, cannot be made part of the package being tested:
        -
        -        package foo_test
        -
        -        import (
        -            "bar/testutil" // also imports "foo"
        -            . "foo"
        -        )
        -
        -    In this case, the test file cannot be in package foo because it
        -    uses bar/testutil, which imports foo. So we use the 'import .'
        -    form to let the file pretend to be part of package foo even though
        -    it is not. Except for this one case, do not use import . in your
        -    programs. It makes the programs much harder to read because it is
        -    unclear whether a name like Quux is a top-level identifier in the
        -    current package or in an imported package.`,
        -		Since:   "2019.1",
        -		Options: []string{"dot_import_whitelist"},
        -	},
        -
        -	"ST1003": &lint.Documentation{
        -		Title: `Poorly chosen identifier`,
        -		Text: `Identifiers, such as variable and package names, follow certain rules.
        -
        -See the following links for details:
        -
        -- https://golang.org/doc/effective_go.html#package-names
        -- https://golang.org/doc/effective_go.html#mixed-caps
        -- https://github.com/golang/go/wiki/CodeReviewComments#initialisms
        -- https://github.com/golang/go/wiki/CodeReviewComments#variable-names`,
        -		Since:      "2019.1",
        -		NonDefault: true,
        -		Options:    []string{"initialisms"},
        -	},
        -
        -	"ST1005": &lint.Documentation{
        -		Title: `Incorrectly formatted error string`,
        -		Text: `Error strings follow a set of guidelines to ensure uniformity and good
        -composability.
        -
        -Quoting Go Code Review Comments:
        -
        -    Error strings should not be capitalized (unless beginning with
        -    proper nouns or acronyms) or end with punctuation, since they are
        -    usually printed following other context. That is, use
        -    fmt.Errorf("something bad") not fmt.Errorf("Something bad"), so
        -    that log.Printf("Reading %s: %v", filename, err) formats without a
        -    spurious capital letter mid-message.`,
        -		Since: "2019.1",
        -	},
        -
        -	"ST1006": &lint.Documentation{
        -		Title: `Poorly chosen receiver name`,
        -		Text: `Quoting Go Code Review Comments:
        -
        -    The name of a method's receiver should be a reflection of its
        -    identity; often a one or two letter abbreviation of its type
        -    suffices (such as "c" or "cl" for "Client"). Don't use generic
        -    names such as "me", "this" or "self", identifiers typical of
        -    object-oriented languages that place more emphasis on methods as
        -    opposed to functions. The name need not be as descriptive as that
        -    of a method argument, as its role is obvious and serves no
        -    documentary purpose. It can be very short as it will appear on
        -    almost every line of every method of the type; familiarity admits
        -    brevity. Be consistent, too: if you call the receiver "c" in one
        -    method, don't call it "cl" in another.`,
        -		Since: "2019.1",
        -	},
        -
        -	"ST1008": &lint.Documentation{
        -		Title: `A function's error value should be its last return value`,
        -		Text:  `A function's error value should be its last return value.`,
        -		Since: `2019.1`,
        -	},
        -
        -	"ST1011": &lint.Documentation{
        -		Title: `Poorly chosen name for variable of type time.Duration`,
        -		Text: `time.Duration values represent an amount of time, which is represented
        -as a count of nanoseconds. An expression like 5 * time.Microsecond
        -yields the value 5000. It is therefore not appropriate to suffix a
        -variable of type time.Duration with any time unit, such as Msec or
        -Milli.`,
        -		Since: `2019.1`,
        -	},
        -
        -	"ST1012": &lint.Documentation{
        -		Title: `Poorly chosen name for error variable`,
        -		Text: `Error variables that are part of an API should be called errFoo or
        -ErrFoo.`,
        -		Since: "2019.1",
        -	},
        -
        -	"ST1013": &lint.Documentation{
        -		Title: `Should use constants for HTTP error codes, not magic numbers`,
        -		Text: `HTTP has a tremendous number of status codes. While some of those are
        -well known (200, 400, 404, 500), most of them are not. The net/http
        -package provides constants for all status codes that are part of the
        -various specifications. It is recommended to use these constants
        -instead of hard-coding magic numbers, to vastly improve the
        -readability of your code.`,
        -		Since:   "2019.1",
        -		Options: []string{"http_status_code_whitelist"},
        -	},
        -
        -	"ST1015": &lint.Documentation{
        -		Title: `A switch's default case should be the first or last case`,
        -		Since: "2019.1",
        -	},
        -
        -	"ST1016": &lint.Documentation{
        -		Title:      `Use consistent method receiver names`,
        -		Since:      "2019.1",
        -		NonDefault: true,
        -	},
        -
        -	"ST1017": &lint.Documentation{
        -		Title: `Don't use Yoda conditions`,
        -		Text: `Yoda conditions are conditions of the kind 'if 42 == x', where the
        -literal is on the left side of the comparison. These are a common
        -idiom in languages in which assignment is an expression, to avoid bugs
        -of the kind 'if (x = 42)'. In Go, which doesn't allow for this kind of
        -bug, we prefer the more idiomatic 'if x == 42'.`,
        -		Since: "2019.2",
        -	},
        -
        -	"ST1018": &lint.Documentation{
        -		Title: `Avoid zero-width and control characters in string literals`,
        -		Since: "2019.2",
        -	},
        -}
        diff --git a/vendor/honnef.co/go/tools/stylecheck/lint.go b/vendor/honnef.co/go/tools/stylecheck/lint.go
        deleted file mode 100644
        index 1699d5898..000000000
        --- a/vendor/honnef.co/go/tools/stylecheck/lint.go
        +++ /dev/null
        @@ -1,629 +0,0 @@
        -package stylecheck // import "honnef.co/go/tools/stylecheck"
        -
        -import (
        -	"fmt"
        -	"go/ast"
        -	"go/constant"
        -	"go/token"
        -	"go/types"
        -	"strconv"
        -	"strings"
        -	"unicode"
        -	"unicode/utf8"
        -
        -	"honnef.co/go/tools/config"
        -	"honnef.co/go/tools/internal/passes/buildssa"
        -	. "honnef.co/go/tools/lint/lintdsl"
        -	"honnef.co/go/tools/ssa"
        -
        -	"golang.org/x/tools/go/analysis"
        -	"golang.org/x/tools/go/analysis/passes/inspect"
        -	"golang.org/x/tools/go/ast/inspector"
        -	"golang.org/x/tools/go/types/typeutil"
        -)
        -
        -func CheckPackageComment(pass *analysis.Pass) (interface{}, error) {
        -	// - At least one file in a non-main package should have a package comment
        -	//
        -	// - The comment should be of the form
        -	// "Package x ...". This has a slight potential for false
        -	// positives, as multiple files can have package comments, in
        -	// which case they get appended. But that doesn't happen a lot in
        -	// the real world.
        -
        -	if pass.Pkg.Name() == "main" {
        -		return nil, nil
        -	}
        -	hasDocs := false
        -	for _, f := range pass.Files {
        -		if IsInTest(pass, f) {
        -			continue
        -		}
        -		if f.Doc != nil && len(f.Doc.List) > 0 {
        -			hasDocs = true
        -			prefix := "Package " + f.Name.Name + " "
        -			if !strings.HasPrefix(strings.TrimSpace(f.Doc.Text()), prefix) {
        -				ReportNodef(pass, f.Doc, `package comment should be of the form "%s..."`, prefix)
        -			}
        -			f.Doc.Text()
        -		}
        -	}
        -
        -	if !hasDocs {
        -		for _, f := range pass.Files {
        -			if IsInTest(pass, f) {
        -				continue
        -			}
        -			ReportNodef(pass, f, "at least one file in a package should have a package comment")
        -		}
        -	}
        -	return nil, nil
        -}
        -
        -func CheckDotImports(pass *analysis.Pass) (interface{}, error) {
        -	for _, f := range pass.Files {
        -	imports:
        -		for _, imp := range f.Imports {
        -			path := imp.Path.Value
        -			path = path[1 : len(path)-1]
        -			for _, w := range config.For(pass).DotImportWhitelist {
        -				if w == path {
        -					continue imports
        -				}
        -			}
        -
        -			if imp.Name != nil && imp.Name.Name == "." && !IsInTest(pass, f) {
        -				ReportNodefFG(pass, imp, "should not use dot imports")
        -			}
        -		}
        -	}
        -	return nil, nil
        -}
        -
        -func CheckBlankImports(pass *analysis.Pass) (interface{}, error) {
        -	fset := pass.Fset
        -	for _, f := range pass.Files {
        -		if IsInMain(pass, f) || IsInTest(pass, f) {
        -			continue
        -		}
        -
        -		// Collect imports of the form `import _ "foo"`, i.e. with no
        -		// parentheses, as their comment will be associated with the
        -		// (paren-free) GenDecl, not the import spec itself.
        -		//
        -		// We don't directly process the GenDecl so that we can
        -		// correctly handle the following:
        -		//
        -		//  import _ "foo"
        -		//  import _ "bar"
        -		//
        -		// where only the first import should get flagged.
        -		skip := map[ast.Spec]bool{}
        -		ast.Inspect(f, func(node ast.Node) bool {
        -			switch node := node.(type) {
        -			case *ast.File:
        -				return true
        -			case *ast.GenDecl:
        -				if node.Tok != token.IMPORT {
        -					return false
        -				}
        -				if node.Lparen == token.NoPos && node.Doc != nil {
        -					skip[node.Specs[0]] = true
        -				}
        -				return false
        -			}
        -			return false
        -		})
        -		for i, imp := range f.Imports {
        -			pos := fset.Position(imp.Pos())
        -
        -			if !IsBlank(imp.Name) {
        -				continue
        -			}
        -			// Only flag the first blank import in a group of imports,
        -			// or don't flag any of them, if the first one is
        -			// commented
        -			if i > 0 {
        -				prev := f.Imports[i-1]
        -				prevPos := fset.Position(prev.Pos())
        -				if pos.Line-1 == prevPos.Line && IsBlank(prev.Name) {
        -					continue
        -				}
        -			}
        -
        -			if imp.Doc == nil && imp.Comment == nil && !skip[imp] {
        -				ReportNodef(pass, imp, "a blank import should be only in a main or test package, or have a comment justifying it")
        -			}
        -		}
        -	}
        -	return nil, nil
        -}
        -
        -func CheckIncDec(pass *analysis.Pass) (interface{}, error) {
        -	// TODO(dh): this can be noisy for function bodies that look like this:
        -	// 	x += 3
        -	// 	...
        -	// 	x += 2
        -	// 	...
        -	// 	x += 1
        -	fn := func(node ast.Node) {
        -		assign := node.(*ast.AssignStmt)
        -		if assign.Tok != token.ADD_ASSIGN && assign.Tok != token.SUB_ASSIGN {
        -			return
        -		}
        -		if (len(assign.Lhs) != 1 || len(assign.Rhs) != 1) ||
        -			!IsIntLiteral(assign.Rhs[0], "1") {
        -			return
        -		}
        -
        -		suffix := ""
        -		switch assign.Tok {
        -		case token.ADD_ASSIGN:
        -			suffix = "++"
        -		case token.SUB_ASSIGN:
        -			suffix = "--"
        -		}
        -
        -		ReportNodef(pass, assign, "should replace %s with %s%s", Render(pass, assign), Render(pass, assign.Lhs[0]), suffix)
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.AssignStmt)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func CheckErrorReturn(pass *analysis.Pass) (interface{}, error) {
        -fnLoop:
        -	for _, fn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		sig := fn.Type().(*types.Signature)
        -		rets := sig.Results()
        -		if rets == nil || rets.Len() < 2 {
        -			continue
        -		}
        -
        -		if rets.At(rets.Len()-1).Type() == types.Universe.Lookup("error").Type() {
        -			// Last return type is error. If the function also returns
        -			// errors in other positions, that's fine.
        -			continue
        -		}
        -		for i := rets.Len() - 2; i >= 0; i-- {
        -			if rets.At(i).Type() == types.Universe.Lookup("error").Type() {
        -				pass.Reportf(rets.At(i).Pos(), "error should be returned as the last argument")
        -				continue fnLoop
        -			}
        -		}
        -	}
        -	return nil, nil
        -}
        -
        -// CheckUnexportedReturn checks that exported functions on exported
        -// types do not return unexported types.
        -func CheckUnexportedReturn(pass *analysis.Pass) (interface{}, error) {
        -	for _, fn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		if fn.Synthetic != "" || fn.Parent() != nil {
        -			continue
        -		}
        -		if !ast.IsExported(fn.Name()) || IsInMain(pass, fn) || IsInTest(pass, fn) {
        -			continue
        -		}
        -		sig := fn.Type().(*types.Signature)
        -		if sig.Recv() != nil && !ast.IsExported(Dereference(sig.Recv().Type()).(*types.Named).Obj().Name()) {
        -			continue
        -		}
        -		res := sig.Results()
        -		for i := 0; i < res.Len(); i++ {
        -			if named, ok := DereferenceR(res.At(i).Type()).(*types.Named); ok &&
        -				!ast.IsExported(named.Obj().Name()) &&
        -				named != types.Universe.Lookup("error").Type() {
        -				pass.Reportf(fn.Pos(), "should not return unexported type")
        -			}
        -		}
        -	}
        -	return nil, nil
        -}
        -
        -func CheckReceiverNames(pass *analysis.Pass) (interface{}, error) {
        -	ssapkg := pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).Pkg
        -	for _, m := range ssapkg.Members {
        -		if T, ok := m.Object().(*types.TypeName); ok && !T.IsAlias() {
        -			ms := typeutil.IntuitiveMethodSet(T.Type(), nil)
        -			for _, sel := range ms {
        -				fn := sel.Obj().(*types.Func)
        -				recv := fn.Type().(*types.Signature).Recv()
        -				if Dereference(recv.Type()) != T.Type() {
        -					// skip embedded methods
        -					continue
        -				}
        -				if recv.Name() == "self" || recv.Name() == "this" {
        -					ReportfFG(pass, recv.Pos(), `receiver name should be a reflection of its identity; don't use generic names such as "this" or "self"`)
        -				}
        -				if recv.Name() == "_" {
        -					ReportfFG(pass, recv.Pos(), "receiver name should not be an underscore, omit the name if it is unused")
        -				}
        -			}
        -		}
        -	}
        -	return nil, nil
        -}
        -
        -func CheckReceiverNamesIdentical(pass *analysis.Pass) (interface{}, error) {
        -	ssapkg := pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).Pkg
        -	for _, m := range ssapkg.Members {
        -		names := map[string]int{}
        -
        -		var firstFn *types.Func
        -		if T, ok := m.Object().(*types.TypeName); ok && !T.IsAlias() {
        -			ms := typeutil.IntuitiveMethodSet(T.Type(), nil)
        -			for _, sel := range ms {
        -				fn := sel.Obj().(*types.Func)
        -				recv := fn.Type().(*types.Signature).Recv()
        -				if Dereference(recv.Type()) != T.Type() {
        -					// skip embedded methods
        -					continue
        -				}
        -				if firstFn == nil {
        -					firstFn = fn
        -				}
        -				if recv.Name() != "" && recv.Name() != "_" {
        -					names[recv.Name()]++
        -				}
        -			}
        -		}
        -
        -		if len(names) > 1 {
        -			var seen []string
        -			for name, count := range names {
        -				seen = append(seen, fmt.Sprintf("%dx %q", count, name))
        -			}
        -
        -			pass.Reportf(firstFn.Pos(), "methods on the same type should have the same receiver name (seen %s)", strings.Join(seen, ", "))
        -		}
        -	}
        -	return nil, nil
        -}
        -
        -func CheckContextFirstArg(pass *analysis.Pass) (interface{}, error) {
        -	// TODO(dh): this check doesn't apply to test helpers. Example from the stdlib:
        -	// 	func helperCommandContext(t *testing.T, ctx context.Context, s ...string) (cmd *exec.Cmd) {
        -fnLoop:
        -	for _, fn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		if fn.Synthetic != "" || fn.Parent() != nil {
        -			continue
        -		}
        -		params := fn.Signature.Params()
        -		if params.Len() < 2 {
        -			continue
        -		}
        -		if types.TypeString(params.At(0).Type(), nil) == "context.Context" {
        -			continue
        -		}
        -		for i := 1; i < params.Len(); i++ {
        -			param := params.At(i)
        -			if types.TypeString(param.Type(), nil) == "context.Context" {
        -				pass.Reportf(param.Pos(), "context.Context should be the first argument of a function")
        -				continue fnLoop
        -			}
        -		}
        -	}
        -	return nil, nil
        -}
        -
        -func CheckErrorStrings(pass *analysis.Pass) (interface{}, error) {
        -	objNames := map[*ssa.Package]map[string]bool{}
        -	ssapkg := pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).Pkg
        -	objNames[ssapkg] = map[string]bool{}
        -	for _, m := range ssapkg.Members {
        -		if typ, ok := m.(*ssa.Type); ok {
        -			objNames[ssapkg][typ.Name()] = true
        -		}
        -	}
        -	for _, fn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		objNames[fn.Package()][fn.Name()] = true
        -	}
        -
        -	for _, fn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs {
        -		if IsInTest(pass, fn) {
        -			// We don't care about malformed error messages in tests;
        -			// they're usually for direct human consumption, not part
        -			// of an API
        -			continue
        -		}
        -		for _, block := range fn.Blocks {
        -		instrLoop:
        -			for _, ins := range block.Instrs {
        -				call, ok := ins.(*ssa.Call)
        -				if !ok {
        -					continue
        -				}
        -				if !IsCallTo(call.Common(), "errors.New") && !IsCallTo(call.Common(), "fmt.Errorf") {
        -					continue
        -				}
        -
        -				k, ok := call.Common().Args[0].(*ssa.Const)
        -				if !ok {
        -					continue
        -				}
        -
        -				s := constant.StringVal(k.Value)
        -				if len(s) == 0 {
        -					continue
        -				}
        -				switch s[len(s)-1] {
        -				case '.', ':', '!', '\n':
        -					pass.Reportf(call.Pos(), "error strings should not end with punctuation or a newline")
        -				}
        -				idx := strings.IndexByte(s, ' ')
        -				if idx == -1 {
        -					// single word error message, probably not a real
        -					// error but something used in tests or during
        -					// debugging
        -					continue
        -				}
        -				word := s[:idx]
        -				first, n := utf8.DecodeRuneInString(word)
        -				if !unicode.IsUpper(first) {
        -					continue
        -				}
        -				for _, c := range word[n:] {
        -					if unicode.IsUpper(c) {
        -						// Word is probably an initialism or
        -						// multi-word function name
        -						continue instrLoop
        -					}
        -				}
        -
        -				word = strings.TrimRightFunc(word, func(r rune) bool { return unicode.IsPunct(r) })
        -				if objNames[fn.Package()][word] {
        -					// Word is probably the name of a function or type in this package
        -					continue
        -				}
        -				// First word in error starts with a capital
        -				// letter, and the word doesn't contain any other
        -				// capitals, making it unlikely to be an
        -				// initialism or multi-word function name.
        -				//
        -				// It could still be a proper noun, though.
        -
        -				pass.Reportf(call.Pos(), "error strings should not be capitalized")
        -			}
        -		}
        -	}
        -	return nil, nil
        -}
        -
        -func CheckTimeNames(pass *analysis.Pass) (interface{}, error) {
        -	suffixes := []string{
        -		"Sec", "Secs", "Seconds",
        -		"Msec", "Msecs",
        -		"Milli", "Millis", "Milliseconds",
        -		"Usec", "Usecs", "Microseconds",
        -		"MS", "Ms",
        -	}
        -	fn := func(T types.Type, names []*ast.Ident) {
        -		if !IsType(T, "time.Duration") && !IsType(T, "*time.Duration") {
        -			return
        -		}
        -		for _, name := range names {
        -			for _, suffix := range suffixes {
        -				if strings.HasSuffix(name.Name, suffix) {
        -					ReportNodef(pass, name, "var %s is of type %v; don't use unit-specific suffix %q", name.Name, T, suffix)
        -					break
        -				}
        -			}
        -		}
        -	}
        -	for _, f := range pass.Files {
        -		ast.Inspect(f, func(node ast.Node) bool {
        -			switch node := node.(type) {
        -			case *ast.ValueSpec:
        -				T := pass.TypesInfo.TypeOf(node.Type)
        -				fn(T, node.Names)
        -			case *ast.FieldList:
        -				for _, field := range node.List {
        -					T := pass.TypesInfo.TypeOf(field.Type)
        -					fn(T, field.Names)
        -				}
        -			}
        -			return true
        -		})
        -	}
        -	return nil, nil
        -}
        -
        -func CheckErrorVarNames(pass *analysis.Pass) (interface{}, error) {
        -	for _, f := range pass.Files {
        -		for _, decl := range f.Decls {
        -			gen, ok := decl.(*ast.GenDecl)
        -			if !ok || gen.Tok != token.VAR {
        -				continue
        -			}
        -			for _, spec := range gen.Specs {
        -				spec := spec.(*ast.ValueSpec)
        -				if len(spec.Names) != len(spec.Values) {
        -					continue
        -				}
        -
        -				for i, name := range spec.Names {
        -					val := spec.Values[i]
        -					if !IsCallToAST(pass, val, "errors.New") && !IsCallToAST(pass, val, "fmt.Errorf") {
        -						continue
        -					}
        -
        -					prefix := "err"
        -					if name.IsExported() {
        -						prefix = "Err"
        -					}
        -					if !strings.HasPrefix(name.Name, prefix) {
        -						ReportNodef(pass, name, "error var %s should have name of the form %sFoo", name.Name, prefix)
        -					}
        -				}
        -			}
        -		}
        -	}
        -	return nil, nil
        -}
        -
        -var httpStatusCodes = map[int]string{
        -	100: "StatusContinue",
        -	101: "StatusSwitchingProtocols",
        -	102: "StatusProcessing",
        -	200: "StatusOK",
        -	201: "StatusCreated",
        -	202: "StatusAccepted",
        -	203: "StatusNonAuthoritativeInfo",
        -	204: "StatusNoContent",
        -	205: "StatusResetContent",
        -	206: "StatusPartialContent",
        -	207: "StatusMultiStatus",
        -	208: "StatusAlreadyReported",
        -	226: "StatusIMUsed",
        -	300: "StatusMultipleChoices",
        -	301: "StatusMovedPermanently",
        -	302: "StatusFound",
        -	303: "StatusSeeOther",
        -	304: "StatusNotModified",
        -	305: "StatusUseProxy",
        -	307: "StatusTemporaryRedirect",
        -	308: "StatusPermanentRedirect",
        -	400: "StatusBadRequest",
        -	401: "StatusUnauthorized",
        -	402: "StatusPaymentRequired",
        -	403: "StatusForbidden",
        -	404: "StatusNotFound",
        -	405: "StatusMethodNotAllowed",
        -	406: "StatusNotAcceptable",
        -	407: "StatusProxyAuthRequired",
        -	408: "StatusRequestTimeout",
        -	409: "StatusConflict",
        -	410: "StatusGone",
        -	411: "StatusLengthRequired",
        -	412: "StatusPreconditionFailed",
        -	413: "StatusRequestEntityTooLarge",
        -	414: "StatusRequestURITooLong",
        -	415: "StatusUnsupportedMediaType",
        -	416: "StatusRequestedRangeNotSatisfiable",
        -	417: "StatusExpectationFailed",
        -	418: "StatusTeapot",
        -	422: "StatusUnprocessableEntity",
        -	423: "StatusLocked",
        -	424: "StatusFailedDependency",
        -	426: "StatusUpgradeRequired",
        -	428: "StatusPreconditionRequired",
        -	429: "StatusTooManyRequests",
        -	431: "StatusRequestHeaderFieldsTooLarge",
        -	451: "StatusUnavailableForLegalReasons",
        -	500: "StatusInternalServerError",
        -	501: "StatusNotImplemented",
        -	502: "StatusBadGateway",
        -	503: "StatusServiceUnavailable",
        -	504: "StatusGatewayTimeout",
        -	505: "StatusHTTPVersionNotSupported",
        -	506: "StatusVariantAlsoNegotiates",
        -	507: "StatusInsufficientStorage",
        -	508: "StatusLoopDetected",
        -	510: "StatusNotExtended",
        -	511: "StatusNetworkAuthenticationRequired",
        -}
        -
        -func CheckHTTPStatusCodes(pass *analysis.Pass) (interface{}, error) {
        -	whitelist := map[string]bool{}
        -	for _, code := range config.For(pass).HTTPStatusCodeWhitelist {
        -		whitelist[code] = true
        -	}
        -	fn := func(node ast.Node) bool {
        -		if node == nil {
        -			return true
        -		}
        -		call, ok := node.(*ast.CallExpr)
        -		if !ok {
        -			return true
        -		}
        -
        -		var arg int
        -		switch CallNameAST(pass, call) {
        -		case "net/http.Error":
        -			arg = 2
        -		case "net/http.Redirect":
        -			arg = 3
        -		case "net/http.StatusText":
        -			arg = 0
        -		case "net/http.RedirectHandler":
        -			arg = 1
        -		default:
        -			return true
        -		}
        -		lit, ok := call.Args[arg].(*ast.BasicLit)
        -		if !ok {
        -			return true
        -		}
        -		if whitelist[lit.Value] {
        -			return true
        -		}
        -
        -		n, err := strconv.Atoi(lit.Value)
        -		if err != nil {
        -			return true
        -		}
        -		s, ok := httpStatusCodes[n]
        -		if !ok {
        -			return true
        -		}
        -		ReportNodefFG(pass, lit, "should use constant http.%s instead of numeric literal %d", s, n)
        -		return true
        -	}
        -	// OPT(dh): replace with inspector
        -	for _, f := range pass.Files {
        -		ast.Inspect(f, fn)
        -	}
        -	return nil, nil
        -}
        -
        -func CheckDefaultCaseOrder(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		stmt := node.(*ast.SwitchStmt)
        -		list := stmt.Body.List
        -		for i, c := range list {
        -			if c.(*ast.CaseClause).List == nil && i != 0 && i != len(list)-1 {
        -				ReportNodefFG(pass, c, "default case should be first or last in switch statement")
        -				break
        -			}
        -		}
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.SwitchStmt)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func CheckYodaConditions(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		cond := node.(*ast.BinaryExpr)
        -		if cond.Op != token.EQL && cond.Op != token.NEQ {
        -			return
        -		}
        -		if _, ok := cond.X.(*ast.BasicLit); !ok {
        -			return
        -		}
        -		if _, ok := cond.Y.(*ast.BasicLit); ok {
        -			// Don't flag lit == lit conditions, just in case
        -			return
        -		}
        -		ReportNodefFG(pass, cond, "don't use Yoda conditions")
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BinaryExpr)(nil)}, fn)
        -	return nil, nil
        -}
        -
        -func CheckInvisibleCharacters(pass *analysis.Pass) (interface{}, error) {
        -	fn := func(node ast.Node) {
        -		lit := node.(*ast.BasicLit)
        -		if lit.Kind != token.STRING {
        -			return
        -		}
        -		for _, r := range lit.Value {
        -			if unicode.Is(unicode.Cf, r) {
        -				ReportNodef(pass, lit, "string literal contains the Unicode format character %U, consider using the %q escape sequence", r, r)
        -			} else if unicode.Is(unicode.Cc, r) && r != '\n' && r != '\t' && r != '\r' {
        -				ReportNodef(pass, lit, "string literal contains the Unicode control character %U, consider using the %q escape sequence", r, r)
        -			}
        -		}
        -	}
        -	pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BasicLit)(nil)}, fn)
        -	return nil, nil
        -}
        diff --git a/vendor/honnef.co/go/tools/stylecheck/names.go b/vendor/honnef.co/go/tools/stylecheck/names.go
        deleted file mode 100644
        index 160f9d7ff..000000000
        --- a/vendor/honnef.co/go/tools/stylecheck/names.go
        +++ /dev/null
        @@ -1,264 +0,0 @@
        -// Copyright (c) 2013 The Go Authors. All rights reserved.
        -// Copyright (c) 2018 Dominik Honnef. All rights reserved.
        -
        -package stylecheck
        -
        -import (
        -	"go/ast"
        -	"go/token"
        -	"strings"
        -	"unicode"
        -
        -	"golang.org/x/tools/go/analysis"
        -	"honnef.co/go/tools/config"
        -	. "honnef.co/go/tools/lint/lintdsl"
        -)
        -
        -// knownNameExceptions is a set of names that are known to be exempt from naming checks.
        -// This is usually because they are constrained by having to match names in the
        -// standard library.
        -var knownNameExceptions = map[string]bool{
        -	"LastInsertId": true, // must match database/sql
        -	"kWh":          true,
        -}
        -
        -func CheckNames(pass *analysis.Pass) (interface{}, error) {
        -	// A large part of this function is copied from
        -	// github.com/golang/lint, Copyright (c) 2013 The Go Authors,
        -	// licensed under the BSD 3-clause license.
        -
        -	allCaps := func(s string) bool {
        -		for _, r := range s {
        -			if !((r >= 'A' && r <= 'Z') || (r >= '0' && r <= '9') || r == '_') {
        -				return false
        -			}
        -		}
        -		return true
        -	}
        -
        -	check := func(id *ast.Ident, thing string, initialisms map[string]bool) {
        -		if id.Name == "_" {
        -			return
        -		}
        -		if knownNameExceptions[id.Name] {
        -			return
        -		}
        -
        -		// Handle two common styles from other languages that don't belong in Go.
        -		if len(id.Name) >= 5 && allCaps(id.Name) && strings.Contains(id.Name, "_") {
        -			ReportfFG(pass, id.Pos(), "should not use ALL_CAPS in Go names; use CamelCase instead")
        -			return
        -		}
        -
        -		should := lintName(id.Name, initialisms)
        -		if id.Name == should {
        -			return
        -		}
        -
        -		if len(id.Name) > 2 && strings.Contains(id.Name[1:len(id.Name)-1], "_") {
        -			ReportfFG(pass, id.Pos(), "should not use underscores in Go names; %s %s should be %s", thing, id.Name, should)
        -			return
        -		}
        -		ReportfFG(pass, id.Pos(), "%s %s should be %s", thing, id.Name, should)
        -	}
        -	checkList := func(fl *ast.FieldList, thing string, initialisms map[string]bool) {
        -		if fl == nil {
        -			return
        -		}
        -		for _, f := range fl.List {
        -			for _, id := range f.Names {
        -				check(id, thing, initialisms)
        -			}
        -		}
        -	}
        -
        -	il := config.For(pass).Initialisms
        -	initialisms := make(map[string]bool, len(il))
        -	for _, word := range il {
        -		initialisms[word] = true
        -	}
        -	for _, f := range pass.Files {
        -		// Package names need slightly different handling than other names.
        -		if !strings.HasSuffix(f.Name.Name, "_test") && strings.Contains(f.Name.Name, "_") {
        -			ReportfFG(pass, f.Pos(), "should not use underscores in package names")
        -		}
        -		if strings.IndexFunc(f.Name.Name, unicode.IsUpper) != -1 {
        -			ReportfFG(pass, f.Pos(), "should not use MixedCaps in package name; %s should be %s", f.Name.Name, strings.ToLower(f.Name.Name))
        -		}
        -
        -		ast.Inspect(f, func(node ast.Node) bool {
        -			switch v := node.(type) {
        -			case *ast.AssignStmt:
        -				if v.Tok != token.DEFINE {
        -					return true
        -				}
        -				for _, exp := range v.Lhs {
        -					if id, ok := exp.(*ast.Ident); ok {
        -						check(id, "var", initialisms)
        -					}
        -				}
        -			case *ast.FuncDecl:
        -				// Functions with no body are defined elsewhere (in
        -				// assembly, or via go:linkname). These are likely to
        -				// be something very low level (such as the runtime),
        -				// where our rules don't apply.
        -				if v.Body == nil {
        -					return true
        -				}
        -
        -				if IsInTest(pass, v) && (strings.HasPrefix(v.Name.Name, "Example") || strings.HasPrefix(v.Name.Name, "Test") || strings.HasPrefix(v.Name.Name, "Benchmark")) {
        -					return true
        -				}
        -
        -				thing := "func"
        -				if v.Recv != nil {
        -					thing = "method"
        -				}
        -
        -				if !isTechnicallyExported(v) {
        -					check(v.Name, thing, initialisms)
        -				}
        -
        -				checkList(v.Type.Params, thing+" parameter", initialisms)
        -				checkList(v.Type.Results, thing+" result", initialisms)
        -			case *ast.GenDecl:
        -				if v.Tok == token.IMPORT {
        -					return true
        -				}
        -				var thing string
        -				switch v.Tok {
        -				case token.CONST:
        -					thing = "const"
        -				case token.TYPE:
        -					thing = "type"
        -				case token.VAR:
        -					thing = "var"
        -				}
        -				for _, spec := range v.Specs {
        -					switch s := spec.(type) {
        -					case *ast.TypeSpec:
        -						check(s.Name, thing, initialisms)
        -					case *ast.ValueSpec:
        -						for _, id := range s.Names {
        -							check(id, thing, initialisms)
        -						}
        -					}
        -				}
        -			case *ast.InterfaceType:
        -				// Do not check interface method names.
        -				// They are often constrainted by the method names of concrete types.
        -				for _, x := range v.Methods.List {
        -					ft, ok := x.Type.(*ast.FuncType)
        -					if !ok { // might be an embedded interface name
        -						continue
        -					}
        -					checkList(ft.Params, "interface method parameter", initialisms)
        -					checkList(ft.Results, "interface method result", initialisms)
        -				}
        -			case *ast.RangeStmt:
        -				if v.Tok == token.ASSIGN {
        -					return true
        -				}
        -				if id, ok := v.Key.(*ast.Ident); ok {
        -					check(id, "range var", initialisms)
        -				}
        -				if id, ok := v.Value.(*ast.Ident); ok {
        -					check(id, "range var", initialisms)
        -				}
        -			case *ast.StructType:
        -				for _, f := range v.Fields.List {
        -					for _, id := range f.Names {
        -						check(id, "struct field", initialisms)
        -					}
        -				}
        -			}
        -			return true
        -		})
        -	}
        -	return nil, nil
        -}
        -
        -// lintName returns a different name if it should be different.
        -func lintName(name string, initialisms map[string]bool) (should string) {
        -	// A large part of this function is copied from
        -	// github.com/golang/lint, Copyright (c) 2013 The Go Authors,
        -	// licensed under the BSD 3-clause license.
        -
        -	// Fast path for simple cases: "_" and all lowercase.
        -	if name == "_" {
        -		return name
        -	}
        -	if strings.IndexFunc(name, func(r rune) bool { return !unicode.IsLower(r) }) == -1 {
        -		return name
        -	}
        -
        -	// Split camelCase at any lower->upper transition, and split on underscores.
        -	// Check each word for common initialisms.
        -	runes := []rune(name)
        -	w, i := 0, 0 // index of start of word, scan
        -	for i+1 <= len(runes) {
        -		eow := false // whether we hit the end of a word
        -		if i+1 == len(runes) {
        -			eow = true
        -		} else if runes[i+1] == '_' && i+1 != len(runes)-1 {
        -			// underscore; shift the remainder forward over any run of underscores
        -			eow = true
        -			n := 1
        -			for i+n+1 < len(runes) && runes[i+n+1] == '_' {
        -				n++
        -			}
        -
        -			// Leave at most one underscore if the underscore is between two digits
        -			if i+n+1 < len(runes) && unicode.IsDigit(runes[i]) && unicode.IsDigit(runes[i+n+1]) {
        -				n--
        -			}
        -
        -			copy(runes[i+1:], runes[i+n+1:])
        -			runes = runes[:len(runes)-n]
        -		} else if unicode.IsLower(runes[i]) && !unicode.IsLower(runes[i+1]) {
        -			// lower->non-lower
        -			eow = true
        -		}
        -		i++
        -		if !eow {
        -			continue
        -		}
        -
        -		// [w,i) is a word.
        -		word := string(runes[w:i])
        -		if u := strings.ToUpper(word); initialisms[u] {
        -			// Keep consistent case, which is lowercase only at the start.
        -			if w == 0 && unicode.IsLower(runes[w]) {
        -				u = strings.ToLower(u)
        -			}
        -			// All the common initialisms are ASCII,
        -			// so we can replace the bytes exactly.
        -			// TODO(dh): this won't be true once we allow custom initialisms
        -			copy(runes[w:], []rune(u))
        -		} else if w > 0 && strings.ToLower(word) == word {
        -			// already all lowercase, and not the first word, so uppercase the first character.
        -			runes[w] = unicode.ToUpper(runes[w])
        -		}
        -		w = i
        -	}
        -	return string(runes)
        -}
        -
        -func isTechnicallyExported(f *ast.FuncDecl) bool {
        -	if f.Recv != nil || f.Doc == nil {
        -		return false
        -	}
        -
        -	const export = "//export "
        -	const linkname = "//go:linkname "
        -	for _, c := range f.Doc.List {
        -		if strings.HasPrefix(c.Text, export) && len(c.Text) == len(export)+len(f.Name.Name) && c.Text[len(export):] == f.Name.Name {
        -			return true
        -		}
        -
        -		if strings.HasPrefix(c.Text, linkname) {
        -			return true
        -		}
        -	}
        -	return false
        -}
        diff --git a/vendor/honnef.co/go/tools/version/buildinfo.go b/vendor/honnef.co/go/tools/version/buildinfo.go
        deleted file mode 100644
        index b6034bb7d..000000000
        --- a/vendor/honnef.co/go/tools/version/buildinfo.go
        +++ /dev/null
        @@ -1,46 +0,0 @@
        -// +build go1.12
        -
        -package version
        -
        -import (
        -	"fmt"
        -	"runtime/debug"
        -)
        -
        -func printBuildInfo() {
        -	if info, ok := debug.ReadBuildInfo(); ok {
        -		fmt.Println("Main module:")
        -		printModule(&info.Main)
        -		fmt.Println("Dependencies:")
        -		for _, dep := range info.Deps {
        -			printModule(dep)
        -		}
        -	} else {
        -		fmt.Println("Built without Go modules")
        -	}
        -}
        -
        -func buildInfoVersion() (string, bool) {
        -	info, ok := debug.ReadBuildInfo()
        -	if !ok {
        -		return "", false
        -	}
        -	if info.Main.Version == "(devel)" {
        -		return "", false
        -	}
        -	return info.Main.Version, true
        -}
        -
        -func printModule(m *debug.Module) {
        -	fmt.Printf("\t%s", m.Path)
        -	if m.Version != "(devel)" {
        -		fmt.Printf("@%s", m.Version)
        -	}
        -	if m.Sum != "" {
        -		fmt.Printf(" (sum: %s)", m.Sum)
        -	}
        -	if m.Replace != nil {
        -		fmt.Printf(" (replace: %s)", m.Replace.Path)
        -	}
        -	fmt.Println()
        -}
        diff --git a/vendor/honnef.co/go/tools/version/buildinfo111.go b/vendor/honnef.co/go/tools/version/buildinfo111.go
        deleted file mode 100644
        index 06aae1e65..000000000
        --- a/vendor/honnef.co/go/tools/version/buildinfo111.go
        +++ /dev/null
        @@ -1,6 +0,0 @@
        -// +build !go1.12
        -
        -package version
        -
        -func printBuildInfo()                  {}
        -func buildInfoVersion() (string, bool) { return "", false }
        diff --git a/vendor/honnef.co/go/tools/version/version.go b/vendor/honnef.co/go/tools/version/version.go
        deleted file mode 100644
        index 468e8efd6..000000000
        --- a/vendor/honnef.co/go/tools/version/version.go
        +++ /dev/null
        @@ -1,42 +0,0 @@
        -package version
        -
        -import (
        -	"fmt"
        -	"os"
        -	"path/filepath"
        -	"runtime"
        -)
        -
        -const Version = "2019.2.3"
        -
        -// version returns a version descriptor and reports whether the
        -// version is a known release.
        -func version() (string, bool) {
        -	if Version != "devel" {
        -		return Version, true
        -	}
        -	v, ok := buildInfoVersion()
        -	if ok {
        -		return v, false
        -	}
        -	return "devel", false
        -}
        -
        -func Print() {
        -	v, release := version()
        -
        -	if release {
        -		fmt.Printf("%s %s\n", filepath.Base(os.Args[0]), v)
        -	} else if v == "devel" {
        -		fmt.Printf("%s (no version)\n", filepath.Base(os.Args[0]))
        -	} else {
        -		fmt.Printf("%s (devel, %s)\n", filepath.Base(os.Args[0]), v)
        -	}
        -}
        -
        -func Verbose() {
        -	Print()
        -	fmt.Println()
        -	fmt.Println("Compiled with Go version:", runtime.Version())
        -	printBuildInfo()
        -}
        diff --git a/vendor/modules.txt b/vendor/modules.txt
        new file mode 100644
        index 000000000..cdc411875
        --- /dev/null
        +++ b/vendor/modules.txt
        @@ -0,0 +1,790 @@
        +# cloud.google.com/go v0.39.0
        +## explicit
        +cloud.google.com/go/compute/metadata
        +cloud.google.com/go/iam
        +cloud.google.com/go/internal
        +cloud.google.com/go/internal/optional
        +cloud.google.com/go/internal/trace
        +cloud.google.com/go/internal/version
        +cloud.google.com/go/storage
        +# github.com/BurntSushi/toml v0.3.1
        +github.com/BurntSushi/toml
        +# github.com/Masterminds/goutils v1.1.0
        +## explicit
        +github.com/Masterminds/goutils
        +# github.com/Masterminds/semver v1.5.0
        +## explicit
        +github.com/Masterminds/semver
        +# github.com/Masterminds/sprig v2.22.0+incompatible
        +## explicit
        +github.com/Masterminds/sprig
        +# github.com/Masterminds/vcs v1.13.1
        +## explicit
        +github.com/Masterminds/vcs
        +# github.com/Microsoft/go-winio v0.4.14
        +## explicit
        +github.com/Microsoft/go-winio
        +github.com/Microsoft/go-winio/pkg/guid
        +# github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d
        +github.com/StackExchange/wmi
        +# github.com/armon/go-radix v1.0.0
        +## explicit
        +github.com/armon/go-radix
        +# github.com/awnumar/memcall v0.0.0-20191004114545-73db50fd9f80
        +github.com/awnumar/memcall
        +# github.com/awnumar/memguard v0.22.1
        +## explicit
        +github.com/awnumar/memguard
        +github.com/awnumar/memguard/core
        +# github.com/aws/aws-sdk-go v1.29.11
        +## explicit
        +github.com/aws/aws-sdk-go/aws
        +github.com/aws/aws-sdk-go/aws/awserr
        +github.com/aws/aws-sdk-go/aws/awsutil
        +github.com/aws/aws-sdk-go/aws/client
        +github.com/aws/aws-sdk-go/aws/client/metadata
        +github.com/aws/aws-sdk-go/aws/corehandlers
        +github.com/aws/aws-sdk-go/aws/credentials
        +github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds
        +github.com/aws/aws-sdk-go/aws/credentials/endpointcreds
        +github.com/aws/aws-sdk-go/aws/credentials/processcreds
        +github.com/aws/aws-sdk-go/aws/credentials/stscreds
        +github.com/aws/aws-sdk-go/aws/csm
        +github.com/aws/aws-sdk-go/aws/defaults
        +github.com/aws/aws-sdk-go/aws/ec2metadata
        +github.com/aws/aws-sdk-go/aws/endpoints
        +github.com/aws/aws-sdk-go/aws/request
        +github.com/aws/aws-sdk-go/aws/session
        +github.com/aws/aws-sdk-go/aws/signer/v4
        +github.com/aws/aws-sdk-go/internal/context
        +github.com/aws/aws-sdk-go/internal/ini
        +github.com/aws/aws-sdk-go/internal/sdkio
        +github.com/aws/aws-sdk-go/internal/sdkmath
        +github.com/aws/aws-sdk-go/internal/sdkrand
        +github.com/aws/aws-sdk-go/internal/sdkuri
        +github.com/aws/aws-sdk-go/internal/shareddefaults
        +github.com/aws/aws-sdk-go/internal/strings
        +github.com/aws/aws-sdk-go/internal/sync/singleflight
        +github.com/aws/aws-sdk-go/private/protocol
        +github.com/aws/aws-sdk-go/private/protocol/json/jsonutil
        +github.com/aws/aws-sdk-go/private/protocol/jsonrpc
        +github.com/aws/aws-sdk-go/private/protocol/query
        +github.com/aws/aws-sdk-go/private/protocol/query/queryutil
        +github.com/aws/aws-sdk-go/private/protocol/rest
        +github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil
        +github.com/aws/aws-sdk-go/service/ecr
        +github.com/aws/aws-sdk-go/service/sqs
        +github.com/aws/aws-sdk-go/service/sts
        +github.com/aws/aws-sdk-go/service/sts/stsiface
        +# github.com/beorn7/perks v1.0.0
        +github.com/beorn7/perks/quantile
        +# github.com/boltdb/bolt v1.3.1
        +## explicit
        +github.com/boltdb/bolt
        +# github.com/davecgh/go-spew v1.1.1
        +## explicit
        +github.com/davecgh/go-spew/spew
        +# github.com/dgryski/go-farm v0.0.0-20180109070241-2de33835d102
        +## explicit
        +github.com/dgryski/go-farm
        +# github.com/dgryski/go-minhash v0.0.0-20170608043002-7fe510aff544
        +github.com/dgryski/go-minhash
        +# github.com/docker/distribution v2.7.1+incompatible
        +## explicit
        +github.com/docker/distribution/digestset
        +github.com/docker/distribution/reference
        +# github.com/docker/docker v1.13.1
        +## explicit
        +github.com/docker/docker/api/types
        +github.com/docker/docker/api/types/blkiodev
        +github.com/docker/docker/api/types/container
        +github.com/docker/docker/api/types/events
        +github.com/docker/docker/api/types/filters
        +github.com/docker/docker/api/types/mount
        +github.com/docker/docker/api/types/network
        +github.com/docker/docker/api/types/reference
        +github.com/docker/docker/api/types/registry
        +github.com/docker/docker/api/types/strslice
        +github.com/docker/docker/api/types/swarm
        +github.com/docker/docker/api/types/time
        +github.com/docker/docker/api/types/versions
        +github.com/docker/docker/api/types/volume
        +github.com/docker/docker/client
        +github.com/docker/docker/pkg/tlsconfig
        +# github.com/docker/go-connections v0.4.0
        +## explicit
        +github.com/docker/go-connections/nat
        +github.com/docker/go-connections/sockets
        +github.com/docker/go-connections/tlsconfig
        +# github.com/docker/go-units v0.4.0
        +## explicit
        +github.com/docker/go-units
        +# github.com/dsnet/compress v0.0.0-20171208185109-cc9eb1d7ad76
        +## explicit
        +github.com/dsnet/compress
        +github.com/dsnet/compress/bzip2
        +github.com/dsnet/compress/bzip2/internal/sais
        +github.com/dsnet/compress/internal
        +github.com/dsnet/compress/internal/errors
        +github.com/dsnet/compress/internal/prefix
        +# github.com/dustin/go-humanize v1.0.0
        +## explicit
        +github.com/dustin/go-humanize
        +# github.com/ekalinin/github-markdown-toc.go v0.0.0-20190719135753-892856478edc
        +## explicit
        +# github.com/eknkc/basex v1.0.0
        +## explicit
        +github.com/eknkc/basex
        +# github.com/ekzhu/minhash-lsh v0.0.0-20171225071031-5c06ee8586a1
        +github.com/ekzhu/minhash-lsh
        +# github.com/emirpasic/gods v1.12.0
        +github.com/emirpasic/gods/containers
        +github.com/emirpasic/gods/lists
        +github.com/emirpasic/gods/lists/arraylist
        +github.com/emirpasic/gods/trees
        +github.com/emirpasic/gods/trees/binaryheap
        +github.com/emirpasic/gods/utils
        +# github.com/evanphx/json-patch v4.1.0+incompatible
        +## explicit
        +github.com/evanphx/json-patch
        +# github.com/go-enry/go-license-detector/v4 v4.0.0
        +## explicit
        +github.com/go-enry/go-license-detector/v4/licensedb
        +github.com/go-enry/go-license-detector/v4/licensedb/api
        +github.com/go-enry/go-license-detector/v4/licensedb/filer
        +github.com/go-enry/go-license-detector/v4/licensedb/internal
        +github.com/go-enry/go-license-detector/v4/licensedb/internal/assets
        +github.com/go-enry/go-license-detector/v4/licensedb/internal/fastlog
        +github.com/go-enry/go-license-detector/v4/licensedb/internal/normalize
        +github.com/go-enry/go-license-detector/v4/licensedb/internal/processors
        +github.com/go-enry/go-license-detector/v4/licensedb/internal/wmh
        +# github.com/go-git/gcfg v1.5.0
        +github.com/go-git/gcfg
        +github.com/go-git/gcfg/scanner
        +github.com/go-git/gcfg/token
        +github.com/go-git/gcfg/types
        +# github.com/go-git/go-billy/v5 v5.0.0
        +github.com/go-git/go-billy/v5
        +github.com/go-git/go-billy/v5/helper/chroot
        +github.com/go-git/go-billy/v5/helper/polyfill
        +github.com/go-git/go-billy/v5/osfs
        +github.com/go-git/go-billy/v5/util
        +# github.com/go-git/go-git/v5 v5.1.0
        +github.com/go-git/go-git/v5
        +github.com/go-git/go-git/v5/config
        +github.com/go-git/go-git/v5/internal/revision
        +github.com/go-git/go-git/v5/internal/url
        +github.com/go-git/go-git/v5/plumbing
        +github.com/go-git/go-git/v5/plumbing/cache
        +github.com/go-git/go-git/v5/plumbing/color
        +github.com/go-git/go-git/v5/plumbing/filemode
        +github.com/go-git/go-git/v5/plumbing/format/config
        +github.com/go-git/go-git/v5/plumbing/format/diff
        +github.com/go-git/go-git/v5/plumbing/format/gitignore
        +github.com/go-git/go-git/v5/plumbing/format/idxfile
        +github.com/go-git/go-git/v5/plumbing/format/index
        +github.com/go-git/go-git/v5/plumbing/format/objfile
        +github.com/go-git/go-git/v5/plumbing/format/packfile
        +github.com/go-git/go-git/v5/plumbing/format/pktline
        +github.com/go-git/go-git/v5/plumbing/object
        +github.com/go-git/go-git/v5/plumbing/protocol/packp
        +github.com/go-git/go-git/v5/plumbing/protocol/packp/capability
        +github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband
        +github.com/go-git/go-git/v5/plumbing/revlist
        +github.com/go-git/go-git/v5/plumbing/storer
        +github.com/go-git/go-git/v5/plumbing/transport
        +github.com/go-git/go-git/v5/plumbing/transport/client
        +github.com/go-git/go-git/v5/plumbing/transport/file
        +github.com/go-git/go-git/v5/plumbing/transport/git
        +github.com/go-git/go-git/v5/plumbing/transport/http
        +github.com/go-git/go-git/v5/plumbing/transport/internal/common
        +github.com/go-git/go-git/v5/plumbing/transport/server
        +github.com/go-git/go-git/v5/plumbing/transport/ssh
        +github.com/go-git/go-git/v5/storage
        +github.com/go-git/go-git/v5/storage/filesystem
        +github.com/go-git/go-git/v5/storage/filesystem/dotgit
        +github.com/go-git/go-git/v5/storage/memory
        +github.com/go-git/go-git/v5/utils/binary
        +github.com/go-git/go-git/v5/utils/diff
        +github.com/go-git/go-git/v5/utils/ioutil
        +github.com/go-git/go-git/v5/utils/merkletrie
        +github.com/go-git/go-git/v5/utils/merkletrie/filesystem
        +github.com/go-git/go-git/v5/utils/merkletrie/index
        +github.com/go-git/go-git/v5/utils/merkletrie/internal/frame
        +github.com/go-git/go-git/v5/utils/merkletrie/noder
        +# github.com/go-ole/go-ole v1.2.4
        +github.com/go-ole/go-ole
        +github.com/go-ole/go-ole/oleutil
        +# github.com/go-stack/stack v1.8.0
        +## explicit
        +github.com/go-stack/stack
        +# github.com/go-test/deep v1.0.5
        +## explicit
        +github.com/go-test/deep
        +# github.com/go-yaml/yaml v2.1.0+incompatible
        +## explicit
        +github.com/go-yaml/yaml
        +# github.com/golang/dep v0.5.4
        +## explicit
        +github.com/golang/dep
        +github.com/golang/dep/gps
        +github.com/golang/dep/gps/internal/pb
        +github.com/golang/dep/gps/paths
        +github.com/golang/dep/gps/pkgtree
        +github.com/golang/dep/gps/verify
        +github.com/golang/dep/internal/feedback
        +github.com/golang/dep/internal/fs
        +github.com/golang/dep/internal/importers
        +github.com/golang/dep/internal/importers/base
        +github.com/golang/dep/internal/importers/glide
        +github.com/golang/dep/internal/importers/glock
        +github.com/golang/dep/internal/importers/godep
        +github.com/golang/dep/internal/importers/govend
        +github.com/golang/dep/internal/importers/govendor
        +github.com/golang/dep/internal/importers/gvt
        +github.com/golang/dep/internal/importers/importertest
        +github.com/golang/dep/internal/importers/vndr
        +github.com/golang/dep/internal/test
        +github.com/golang/dep/internal/test/integration
        +# github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6
        +github.com/golang/groupcache/lru
        +# github.com/golang/protobuf v1.4.2
        +## explicit
        +github.com/golang/protobuf/proto
        +github.com/golang/protobuf/protoc-gen-go/descriptor
        +github.com/golang/protobuf/ptypes
        +github.com/golang/protobuf/ptypes/any
        +github.com/golang/protobuf/ptypes/duration
        +github.com/golang/protobuf/ptypes/timestamp
        +github.com/golang/protobuf/ptypes/wrappers
        +# github.com/golang/snappy v0.0.1
        +github.com/golang/snappy
        +# github.com/google/go-cmp v0.5.0
        +## explicit
        +github.com/google/go-cmp/cmp
        +github.com/google/go-cmp/cmp/internal/diff
        +github.com/google/go-cmp/cmp/internal/flags
        +github.com/google/go-cmp/cmp/internal/function
        +github.com/google/go-cmp/cmp/internal/value
        +# github.com/google/uuid v1.1.1
        +github.com/google/uuid
        +# github.com/googleapis/gax-go/v2 v2.0.4
        +github.com/googleapis/gax-go/v2
        +# github.com/hhatto/gorst v0.0.0-20181029133204-ca9f730cac5b
        +github.com/hhatto/gorst
        +# github.com/huandu/xstrings v1.3.2
        +## explicit
        +github.com/huandu/xstrings
        +# github.com/imdario/mergo v0.3.9
        +github.com/imdario/mergo
        +# github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99
        +github.com/jbenet/go-context/io
        +# github.com/jdkato/prose v1.1.0
        +github.com/jdkato/prose/chunk
        +github.com/jdkato/prose/internal/model
        +github.com/jdkato/prose/internal/util
        +github.com/jdkato/prose/tag
        +github.com/jdkato/prose/tokenize
        +# github.com/jjeffery/kv v0.8.0
        +## explicit
        +github.com/jjeffery/kv
        +github.com/jjeffery/kv/internal/logfmt
        +github.com/jjeffery/kv/internal/parse
        +github.com/jjeffery/kv/internal/pool
        +# github.com/jmank88/nuts v0.4.0
        +## explicit
        +github.com/jmank88/nuts
        +# github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af
        +github.com/jmespath/go-jmespath
        +# github.com/json-iterator/go v1.1.10
        +github.com/json-iterator/go
        +# github.com/karlmutch/base62 v0.0.0-20150408093626-b80cdc656a7a
        +## explicit
        +github.com/karlmutch/base62
        +# github.com/karlmutch/ccache v2.0.3-0.20180726214243-573f5233780c+incompatible
        +## explicit
        +github.com/karlmutch/ccache
        +# github.com/karlmutch/circbuf v0.0.0-20150827004946-bbbad097214e
        +## explicit
        +github.com/karlmutch/circbuf
        +# github.com/karlmutch/duat v0.0.0-20200918224055-5162d53e3510
        +## explicit
        +github.com/karlmutch/duat
        +github.com/karlmutch/duat/version
        +# github.com/karlmutch/envflag v0.0.0-20160830095501-ae3268980a29
        +## explicit
        +github.com/karlmutch/envflag
        +# github.com/karlmutch/go-cache v2.0.0+incompatible
        +## explicit
        +github.com/karlmutch/go-cache
        +# github.com/karlmutch/go-fqdn v0.0.0-20160909083404-2501cdd51ef4
        +## explicit
        +github.com/karlmutch/go-fqdn
        +# github.com/karlmutch/go-nvml v0.0.0-20200203202551-277366df5c37
        +## explicit
        +github.com/karlmutch/go-nvml
        +# github.com/karlmutch/go-shortid v0.0.0-20160104014424-6c56cef5189c
        +## explicit
        +github.com/karlmutch/go-shortid
        +# github.com/karlmutch/hashstructure v0.0.0-20170609045927-2bca23e0e452
        +## explicit
        +github.com/karlmutch/hashstructure
        +# github.com/karlmutch/k8s v1.2.1-0.20200715200931-d87bc94d5dd7
        +## explicit
        +github.com/karlmutch/k8s
        +github.com/karlmutch/k8s/apis/core/v1
        +github.com/karlmutch/k8s/apis/meta/v1
        +github.com/karlmutch/k8s/apis/resource
        +github.com/karlmutch/k8s/runtime
        +github.com/karlmutch/k8s/runtime/schema
        +github.com/karlmutch/k8s/util/intstr
        +# github.com/karlmutch/logxi v0.0.0-20180719221844-75b3c5d19c5e
        +## explicit
        +github.com/karlmutch/logxi/v1
        +# github.com/karlmutch/petname v0.0.0-20190202005206-caff460d43c2
        +## explicit
        +github.com/karlmutch/petname
        +# github.com/karlmutch/semver v1.4.0
        +## explicit
        +github.com/karlmutch/semver
        +# github.com/karlmutch/vtclean v0.0.0-20170504063817-d14193dfc626
        +## explicit
        +github.com/karlmutch/vtclean
        +# github.com/karlseguin/expect v1.0.7
        +## explicit
        +# github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd
        +github.com/kevinburke/ssh_config
        +# github.com/klauspost/cpuid v1.3.1
        +github.com/klauspost/cpuid
        +# github.com/lthibault/jitterbug v0.0.0-20180816135325-0ac50869eb41
        +## explicit
        +github.com/lthibault/jitterbug
        +# github.com/makasim/amqpextra v0.14.3
        +## explicit
        +github.com/makasim/amqpextra
        +# github.com/mattn/go-colorable v0.1.7
        +## explicit
        +github.com/mattn/go-colorable
        +# github.com/mattn/go-isatty v0.0.12
        +github.com/mattn/go-isatty
        +# github.com/matttproud/golang_protobuf_extensions v1.0.1
        +github.com/matttproud/golang_protobuf_extensions/pbutil
        +# github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b
        +## explicit
        +github.com/mgutz/ansi
        +# github.com/mgutz/logxi v0.0.0-20170321173016-3753102df44e
        +## explicit
        +github.com/mgutz/logxi
        +# github.com/mholt/archiver v2.1.0+incompatible
        +## explicit
        +github.com/mholt/archiver
        +# github.com/michaelklishin/rabbit-hole v1.4.0
        +## explicit
        +github.com/michaelklishin/rabbit-hole
        +# github.com/minio/md5-simd v1.1.0
        +github.com/minio/md5-simd
        +# github.com/minio/minio v0.0.0-20200918190905-7f9498f43f68
        +## explicit
        +github.com/minio/minio/pkg/disk
        +# github.com/minio/minio-go/v7 v7.0.5
        +## explicit
        +github.com/minio/minio-go/v7
        +github.com/minio/minio-go/v7/pkg/credentials
        +github.com/minio/minio-go/v7/pkg/encrypt
        +github.com/minio/minio-go/v7/pkg/lifecycle
        +github.com/minio/minio-go/v7/pkg/notification
        +github.com/minio/minio-go/v7/pkg/replication
        +github.com/minio/minio-go/v7/pkg/s3utils
        +github.com/minio/minio-go/v7/pkg/set
        +github.com/minio/minio-go/v7/pkg/signer
        +github.com/minio/minio-go/v7/pkg/sse
        +github.com/minio/minio-go/v7/pkg/tags
        +# github.com/minio/sha256-simd v0.1.1
        +github.com/minio/sha256-simd
        +# github.com/mitchellh/copystructure v1.0.0
        +## explicit
        +github.com/mitchellh/copystructure
        +# github.com/mitchellh/go-homedir v1.1.0
        +github.com/mitchellh/go-homedir
        +# github.com/mitchellh/reflectwalk v1.0.0
        +github.com/mitchellh/reflectwalk
        +# github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd
        +github.com/modern-go/concurrent
        +# github.com/modern-go/reflect2 v1.0.1
        +github.com/modern-go/reflect2
        +# github.com/montanaflynn/stats v0.5.0
        +github.com/montanaflynn/stats
        +# github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d
        +## explicit
        +github.com/nbutton23/zxcvbn-go
        +github.com/nbutton23/zxcvbn-go/adjacency
        +github.com/nbutton23/zxcvbn-go/data
        +github.com/nbutton23/zxcvbn-go/entropy
        +github.com/nbutton23/zxcvbn-go/frequency
        +github.com/nbutton23/zxcvbn-go/match
        +github.com/nbutton23/zxcvbn-go/matching
        +github.com/nbutton23/zxcvbn-go/scoring
        +github.com/nbutton23/zxcvbn-go/utils/math
        +# github.com/ncw/directio v1.0.5
        +github.com/ncw/directio
        +# github.com/nightlyone/lockfile v1.0.0
        +## explicit
        +github.com/nightlyone/lockfile
        +# github.com/nwaples/rardecode v0.0.0-20171029023500-e06696f847ae
        +## explicit
        +github.com/nwaples/rardecode
        +# github.com/onsi/ginkgo v1.13.0
        +## explicit
        +# github.com/opencontainers/go-digest v1.0.0
        +## explicit
        +github.com/opencontainers/go-digest
        +# github.com/otiai10/copy v1.2.0
        +## explicit
        +github.com/otiai10/copy
        +# github.com/pelletier/go-toml v1.8.1
        +## explicit
        +github.com/pelletier/go-toml
        +# github.com/pierrec/lz4 v2.5.2+incompatible
        +## explicit
        +github.com/pierrec/lz4
        +github.com/pierrec/lz4/internal/xxh32
        +# github.com/pkg/errors v0.9.1
        +## explicit
        +github.com/pkg/errors
        +# github.com/pmezard/go-difflib v1.0.0
        +github.com/pmezard/go-difflib/difflib
        +# github.com/prometheus/client_golang v1.0.0
        +## explicit
        +github.com/prometheus/client_golang/prometheus
        +github.com/prometheus/client_golang/prometheus/internal
        +github.com/prometheus/client_golang/prometheus/promhttp
        +# github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4
        +## explicit
        +github.com/prometheus/client_model/go
        +# github.com/prometheus/common v0.4.1
        +## explicit
        +github.com/prometheus/common/expfmt
        +github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg
        +github.com/prometheus/common/model
        +# github.com/prometheus/procfs v0.0.8
        +github.com/prometheus/procfs
        +github.com/prometheus/procfs/internal/fs
        +github.com/prometheus/procfs/internal/util
        +# github.com/rs/xid v1.2.1
        +## explicit
        +github.com/rs/xid
        +# github.com/russross/blackfriday/v2 v2.0.1
        +github.com/russross/blackfriday/v2
        +# github.com/sdboyer/constext v0.0.0-20170321163424-836a14457353
        +## explicit
        +github.com/sdboyer/constext
        +# github.com/sergi/go-diff v1.1.0
        +github.com/sergi/go-diff/diffmatchpatch
        +# github.com/shirou/gopsutil v2.20.3-0.20200314133625-53cec6b37e6a+incompatible
        +## explicit
        +github.com/shirou/gopsutil/cpu
        +github.com/shirou/gopsutil/internal/common
        +github.com/shirou/gopsutil/mem
        +# github.com/shogo82148/go-shuffle v0.0.0-20170808115208-59829097ff3b
        +github.com/shogo82148/go-shuffle
        +# github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95
        +github.com/shurcooL/sanitized_anchor_name
        +# github.com/src-d/gcfg v1.4.0
        +github.com/src-d/gcfg
        +github.com/src-d/gcfg/scanner
        +github.com/src-d/gcfg/token
        +github.com/src-d/gcfg/types
        +# github.com/streadway/amqp v1.0.0
        +## explicit
        +github.com/streadway/amqp
        +# github.com/stretchr/testify v1.6.0
        +## explicit
        +github.com/stretchr/testify/assert
        +# github.com/teris-io/shortid v0.0.0-20171029131806-771a37caa5cf
        +## explicit
        +# github.com/ulikunitz/xz v0.5.4
        +## explicit
        +github.com/ulikunitz/xz
        +github.com/ulikunitz/xz/internal/hash
        +github.com/ulikunitz/xz/internal/xlog
        +github.com/ulikunitz/xz/lzma
        +# github.com/valyala/fastjson v1.2.0
        +## explicit
        +github.com/valyala/fastjson
        +github.com/valyala/fastjson/fastfloat
        +# github.com/ventu-io/go-shortid v0.0.0-20171029131806-771a37caa5cf
        +## explicit
        +# github.com/xanzy/ssh-agent v0.2.1
        +github.com/xanzy/ssh-agent
        +# go.opencensus.io v0.22.3
        +go.opencensus.io
        +go.opencensus.io/internal
        +go.opencensus.io/internal/tagencoding
        +go.opencensus.io/metric/metricdata
        +go.opencensus.io/metric/metricproducer
        +go.opencensus.io/plugin/ochttp
        +go.opencensus.io/plugin/ochttp/propagation/b3
        +go.opencensus.io/resource
        +go.opencensus.io/stats
        +go.opencensus.io/stats/internal
        +go.opencensus.io/stats/view
        +go.opencensus.io/tag
        +go.opencensus.io/trace
        +go.opencensus.io/trace/internal
        +go.opencensus.io/trace/propagation
        +go.opencensus.io/trace/tracestate
        +# go.uber.org/atomic v1.6.0
        +## explicit
        +go.uber.org/atomic
        +# golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a
        +## explicit
        +golang.org/x/crypto/argon2
        +golang.org/x/crypto/blake2b
        +golang.org/x/crypto/blowfish
        +golang.org/x/crypto/cast5
        +golang.org/x/crypto/chacha20
        +golang.org/x/crypto/curve25519
        +golang.org/x/crypto/ed25519
        +golang.org/x/crypto/ed25519/internal/edwards25519
        +golang.org/x/crypto/internal/subtle
        +golang.org/x/crypto/nacl/secretbox
        +golang.org/x/crypto/openpgp
        +golang.org/x/crypto/openpgp/armor
        +golang.org/x/crypto/openpgp/elgamal
        +golang.org/x/crypto/openpgp/errors
        +golang.org/x/crypto/openpgp/packet
        +golang.org/x/crypto/openpgp/s2k
        +golang.org/x/crypto/pbkdf2
        +golang.org/x/crypto/poly1305
        +golang.org/x/crypto/salsa20/salsa
        +golang.org/x/crypto/scrypt
        +golang.org/x/crypto/ssh
        +golang.org/x/crypto/ssh/agent
        +golang.org/x/crypto/ssh/internal/bcrypt_pbkdf
        +golang.org/x/crypto/ssh/knownhosts
        +# golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2
        +golang.org/x/exp/rand
        +# golang.org/x/net v0.0.0-20200904194848-62affa334b73
        +golang.org/x/net/context
        +golang.org/x/net/context/ctxhttp
        +golang.org/x/net/html
        +golang.org/x/net/html/atom
        +golang.org/x/net/http/httpguts
        +golang.org/x/net/http2
        +golang.org/x/net/http2/hpack
        +golang.org/x/net/idna
        +golang.org/x/net/internal/socks
        +golang.org/x/net/internal/timeseries
        +golang.org/x/net/proxy
        +golang.org/x/net/publicsuffix
        +golang.org/x/net/trace
        +# golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421
        +golang.org/x/oauth2
        +golang.org/x/oauth2/google
        +golang.org/x/oauth2/internal
        +golang.org/x/oauth2/jws
        +golang.org/x/oauth2/jwt
        +# golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208
        +## explicit
        +golang.org/x/sync/errgroup
        +# golang.org/x/sys v0.0.0-20200918174421-af09f7315aff
        +## explicit
        +golang.org/x/sys/cpu
        +golang.org/x/sys/internal/unsafeheader
        +golang.org/x/sys/unix
        +golang.org/x/sys/windows
        +# golang.org/x/text v0.3.3
        +golang.org/x/text/runes
        +golang.org/x/text/secure/bidirule
        +golang.org/x/text/transform
        +golang.org/x/text/unicode/bidi
        +golang.org/x/text/unicode/norm
        +# gonum.org/v1/gonum v0.7.0
        +gonum.org/v1/gonum/blas
        +gonum.org/v1/gonum/blas/blas64
        +gonum.org/v1/gonum/blas/cblas128
        +gonum.org/v1/gonum/blas/gonum
        +gonum.org/v1/gonum/floats
        +gonum.org/v1/gonum/internal/asm/c128
        +gonum.org/v1/gonum/internal/asm/c64
        +gonum.org/v1/gonum/internal/asm/f32
        +gonum.org/v1/gonum/internal/asm/f64
        +gonum.org/v1/gonum/internal/cmplx64
        +gonum.org/v1/gonum/internal/math32
        +gonum.org/v1/gonum/lapack
        +gonum.org/v1/gonum/lapack/gonum
        +gonum.org/v1/gonum/lapack/lapack64
        +gonum.org/v1/gonum/mat
        +gonum.org/v1/gonum/mathext
        +gonum.org/v1/gonum/mathext/internal/amos
        +gonum.org/v1/gonum/mathext/internal/cephes
        +gonum.org/v1/gonum/mathext/internal/gonum
        +gonum.org/v1/gonum/stat
        +gonum.org/v1/gonum/stat/combin
        +gonum.org/v1/gonum/stat/distuv
        +# google.golang.org/api v0.5.0
        +## explicit
        +google.golang.org/api/gensupport
        +google.golang.org/api/googleapi
        +google.golang.org/api/googleapi/internal/uritemplates
        +google.golang.org/api/googleapi/transport
        +google.golang.org/api/internal
        +google.golang.org/api/iterator
        +google.golang.org/api/option
        +google.golang.org/api/storage/v1
        +google.golang.org/api/transport/http
        +google.golang.org/api/transport/http/internal/propagation
        +# google.golang.org/appengine v1.4.0
        +google.golang.org/appengine
        +google.golang.org/appengine/internal
        +google.golang.org/appengine/internal/app_identity
        +google.golang.org/appengine/internal/base
        +google.golang.org/appengine/internal/datastore
        +google.golang.org/appengine/internal/log
        +google.golang.org/appengine/internal/modules
        +google.golang.org/appengine/internal/remote_api
        +google.golang.org/appengine/internal/urlfetch
        +google.golang.org/appengine/urlfetch
        +# google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013
        +google.golang.org/genproto/googleapis/api/annotations
        +google.golang.org/genproto/googleapis/iam/v1
        +google.golang.org/genproto/googleapis/rpc/code
        +google.golang.org/genproto/googleapis/rpc/status
        +google.golang.org/genproto/googleapis/type/expr
        +# google.golang.org/grpc v1.29.1
        +## explicit
        +google.golang.org/grpc
        +google.golang.org/grpc/attributes
        +google.golang.org/grpc/backoff
        +google.golang.org/grpc/balancer
        +google.golang.org/grpc/balancer/base
        +google.golang.org/grpc/balancer/roundrobin
        +google.golang.org/grpc/binarylog/grpc_binarylog_v1
        +google.golang.org/grpc/codes
        +google.golang.org/grpc/connectivity
        +google.golang.org/grpc/credentials
        +google.golang.org/grpc/credentials/internal
        +google.golang.org/grpc/encoding
        +google.golang.org/grpc/encoding/proto
        +google.golang.org/grpc/grpclog
        +google.golang.org/grpc/internal
        +google.golang.org/grpc/internal/backoff
        +google.golang.org/grpc/internal/balancerload
        +google.golang.org/grpc/internal/binarylog
        +google.golang.org/grpc/internal/buffer
        +google.golang.org/grpc/internal/channelz
        +google.golang.org/grpc/internal/envconfig
        +google.golang.org/grpc/internal/grpclog
        +google.golang.org/grpc/internal/grpcrand
        +google.golang.org/grpc/internal/grpcsync
        +google.golang.org/grpc/internal/grpcutil
        +google.golang.org/grpc/internal/resolver/dns
        +google.golang.org/grpc/internal/resolver/passthrough
        +google.golang.org/grpc/internal/status
        +google.golang.org/grpc/internal/syscall
        +google.golang.org/grpc/internal/transport
        +google.golang.org/grpc/keepalive
        +google.golang.org/grpc/metadata
        +google.golang.org/grpc/naming
        +google.golang.org/grpc/peer
        +google.golang.org/grpc/resolver
        +google.golang.org/grpc/serviceconfig
        +google.golang.org/grpc/stats
        +google.golang.org/grpc/status
        +google.golang.org/grpc/tap
        +# google.golang.org/protobuf v1.25.0
        +## explicit
        +google.golang.org/protobuf/encoding/protojson
        +google.golang.org/protobuf/encoding/prototext
        +google.golang.org/protobuf/encoding/protowire
        +google.golang.org/protobuf/internal/descfmt
        +google.golang.org/protobuf/internal/descopts
        +google.golang.org/protobuf/internal/detrand
        +google.golang.org/protobuf/internal/encoding/defval
        +google.golang.org/protobuf/internal/encoding/json
        +google.golang.org/protobuf/internal/encoding/messageset
        +google.golang.org/protobuf/internal/encoding/tag
        +google.golang.org/protobuf/internal/encoding/text
        +google.golang.org/protobuf/internal/errors
        +google.golang.org/protobuf/internal/fieldsort
        +google.golang.org/protobuf/internal/filedesc
        +google.golang.org/protobuf/internal/filetype
        +google.golang.org/protobuf/internal/flags
        +google.golang.org/protobuf/internal/genid
        +google.golang.org/protobuf/internal/impl
        +google.golang.org/protobuf/internal/mapsort
        +google.golang.org/protobuf/internal/pragma
        +google.golang.org/protobuf/internal/set
        +google.golang.org/protobuf/internal/strs
        +google.golang.org/protobuf/internal/version
        +google.golang.org/protobuf/proto
        +google.golang.org/protobuf/reflect/protoreflect
        +google.golang.org/protobuf/reflect/protoregistry
        +google.golang.org/protobuf/runtime/protoiface
        +google.golang.org/protobuf/runtime/protoimpl
        +google.golang.org/protobuf/types/descriptorpb
        +google.golang.org/protobuf/types/known/anypb
        +google.golang.org/protobuf/types/known/durationpb
        +google.golang.org/protobuf/types/known/timestamppb
        +google.golang.org/protobuf/types/known/wrapperspb
        +# gopkg.in/ini.v1 v1.57.0
        +gopkg.in/ini.v1
        +# gopkg.in/neurosnap/sentences.v1 v1.0.6
        +gopkg.in/neurosnap/sentences.v1
        +gopkg.in/neurosnap/sentences.v1/data
        +# gopkg.in/src-d/go-billy.v4 v4.3.2
        +gopkg.in/src-d/go-billy.v4
        +gopkg.in/src-d/go-billy.v4/helper/chroot
        +gopkg.in/src-d/go-billy.v4/helper/polyfill
        +gopkg.in/src-d/go-billy.v4/osfs
        +gopkg.in/src-d/go-billy.v4/util
        +# gopkg.in/src-d/go-git.v4 v4.13.1
        +## explicit
        +gopkg.in/src-d/go-git.v4
        +gopkg.in/src-d/go-git.v4/config
        +gopkg.in/src-d/go-git.v4/internal/revision
        +gopkg.in/src-d/go-git.v4/internal/url
        +gopkg.in/src-d/go-git.v4/plumbing
        +gopkg.in/src-d/go-git.v4/plumbing/cache
        +gopkg.in/src-d/go-git.v4/plumbing/filemode
        +gopkg.in/src-d/go-git.v4/plumbing/format/config
        +gopkg.in/src-d/go-git.v4/plumbing/format/diff
        +gopkg.in/src-d/go-git.v4/plumbing/format/gitignore
        +gopkg.in/src-d/go-git.v4/plumbing/format/idxfile
        +gopkg.in/src-d/go-git.v4/plumbing/format/index
        +gopkg.in/src-d/go-git.v4/plumbing/format/objfile
        +gopkg.in/src-d/go-git.v4/plumbing/format/packfile
        +gopkg.in/src-d/go-git.v4/plumbing/format/pktline
        +gopkg.in/src-d/go-git.v4/plumbing/object
        +gopkg.in/src-d/go-git.v4/plumbing/protocol/packp
        +gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/capability
        +gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/sideband
        +gopkg.in/src-d/go-git.v4/plumbing/revlist
        +gopkg.in/src-d/go-git.v4/plumbing/storer
        +gopkg.in/src-d/go-git.v4/plumbing/transport
        +gopkg.in/src-d/go-git.v4/plumbing/transport/client
        +gopkg.in/src-d/go-git.v4/plumbing/transport/file
        +gopkg.in/src-d/go-git.v4/plumbing/transport/git
        +gopkg.in/src-d/go-git.v4/plumbing/transport/http
        +gopkg.in/src-d/go-git.v4/plumbing/transport/internal/common
        +gopkg.in/src-d/go-git.v4/plumbing/transport/server
        +gopkg.in/src-d/go-git.v4/plumbing/transport/ssh
        +gopkg.in/src-d/go-git.v4/storage
        +gopkg.in/src-d/go-git.v4/storage/filesystem
        +gopkg.in/src-d/go-git.v4/storage/filesystem/dotgit
        +gopkg.in/src-d/go-git.v4/storage/memory
        +gopkg.in/src-d/go-git.v4/utils/binary
        +gopkg.in/src-d/go-git.v4/utils/diff
        +gopkg.in/src-d/go-git.v4/utils/ioutil
        +gopkg.in/src-d/go-git.v4/utils/merkletrie
        +gopkg.in/src-d/go-git.v4/utils/merkletrie/filesystem
        +gopkg.in/src-d/go-git.v4/utils/merkletrie/index
        +gopkg.in/src-d/go-git.v4/utils/merkletrie/internal/frame
        +gopkg.in/src-d/go-git.v4/utils/merkletrie/noder
        +# gopkg.in/warnings.v0 v0.1.2
        +gopkg.in/warnings.v0
        +# gopkg.in/yaml.v2 v2.3.0
        +## explicit
        +gopkg.in/yaml.v2
        +# gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c
        +gopkg.in/yaml.v3